From e52bfeb491b55eb2f622ac205919bc33732e86fe Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 26 Jul 2020 19:49:14 -0500 Subject: [PATCH 0001/1370] Config for Anycubic Mega TFT --- Marlin/Configuration.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index cf3fb61cb6..a01571c422 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2156,6 +2156,12 @@ //#define TFT_LVGL_UI_FSMC // Robin nano v1.2 uses FSMC //#define TFT_LVGL_UI_SPI // Robin nano v2.0 uses SPI +// +// Anycubic Mega TFT (AI3M) +// +//#define ANYCUBIC_TFT_MODEL +//#define ANYCUBIC_TFT_DEBUG + //============================================================================= //============================ Other Controllers ============================ //============================================================================= From c5108687c5b409ef09360ad3fa77fe560a91e757 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 28 Jul 2020 13:12:30 +1200 Subject: [PATCH 0002/1370] Fix WiFi / ESP32 sanity check (#18808) --- Marlin/src/inc/SanityCheck.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2cba0fecf2..9fde639b0f 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3047,8 +3047,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) /** * Sanity check for WIFI */ -#if ENABLED(ESP3D_WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) - #error "ESP3D_WIFISUPPORT requires an ESP32 controller. Use WIFISUPPORT for standalone ESP3D modules." +#if EITHER(ESP3D_WIFISUPPORT, WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) + #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 controller." #endif // Misc. Cleanup From 9ece3cfdafd6a1cc575ed72bdddaa991d018c307 Mon Sep 17 00:00:00 2001 From: Victor Tseng Date: Tue, 28 Jul 2020 09:13:27 +0800 Subject: [PATCH 0003/1370] Fix garbled print_xyz output (#18810) --- Marlin/src/core/serial.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 77854d0f80..0d22f7bfc0 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -68,7 +68,7 @@ void print_bin(uint16_t val) { extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { - serialprintPGM(prefix); + if (prefix) serialprintPGM(prefix); SERIAL_ECHOPAIR_P(SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z); if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); } From 25c75777799e45fd3c8f7274c913ac5c74d74f1d Mon Sep 17 00:00:00 2001 From: Victor Tseng Date: Tue, 28 Jul 2020 09:15:14 +0800 Subject: [PATCH 0004/1370] Fix DELTA + TMC sensorless homing + SPI endstops (#18811) --- Marlin/src/module/delta.cpp | 14 ++++++-------- Marlin/src/module/motion.h | 6 ++++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 9361729462..df6cae6e0a 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -242,11 +242,9 @@ void home_delta() { // Disable stealthChop if used. Enable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - sensorless_t stealth_states { - tmc_enable_stallguard(stepperX), - tmc_enable_stallguard(stepperY), - tmc_enable_stallguard(stepperZ) - }; + TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); + TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); + TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); #endif // Move all carriages together linearly until an endstop is hit. @@ -256,9 +254,9 @@ void home_delta() { // Re-enable stealthChop if used. Disable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - tmc_disable_stallguard(stepperX, stealth_states.x); - tmc_disable_stallguard(stepperY, stealth_states.y); - tmc_disable_stallguard(stepperZ, stealth_states.z); + TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); + TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); + TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); #endif endstops.validate_homing_move(); diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index d33ce623a4..38ce980dae 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -395,3 +395,9 @@ void homeaxis(const AxisEnum axis); #if HAS_M206_COMMAND void set_home_offset(const AxisEnum axis, const float v); #endif + +#if USE_SENSORLESS + struct sensorless_t; + sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis); + void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth); +#endif From f2205b1725ed42e26fdd3645938e64dff79b9a14 Mon Sep 17 00:00:00 2001 From: Diego von Deschwanden <68632259+Diegovd@users.noreply.github.com> Date: Tue, 28 Jul 2020 08:04:44 +0200 Subject: [PATCH 0005/1370] Update more external links (#18819) --- LICENSE | 5 ++--- Marlin/src/HAL/DUE/HAL.cpp | 1 + Marlin/src/HAL/ESP32/ota.cpp | 1 + Marlin/src/HAL/STM32/SoftwareSerial.cpp | 10 +++++----- Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp | 2 +- Marlin/src/feature/dac/dac_mcp4728.cpp | 2 +- Marlin/src/gcode/motion/G5.cpp | 2 +- buildroot/share/vscode/avrdude.conf | 16 ++++++++-------- buildroot/share/vscode/avrdude_linux.conf | 16 ++++++++-------- buildroot/share/vscode/avrdude_macOS.conf | 8 ++++---- platformio.ini | 2 +- 11 files changed, 33 insertions(+), 32 deletions(-) diff --git a/LICENSE b/LICENSE index 4ad6d9b1e2..6c0e10f3b8 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (c) 2007 Free Software Foundation, Inc. + Copyright (c) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -673,5 +673,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. - +. diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index f2bf4ebbf5..4b9260c359 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -15,6 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ /** diff --git a/Marlin/src/HAL/ESP32/ota.cpp b/Marlin/src/HAL/ESP32/ota.cpp index 7cf65ed2d3..69a3e25e56 100644 --- a/Marlin/src/HAL/ESP32/ota.cpp +++ b/Marlin/src/HAL/ESP32/ota.cpp @@ -15,6 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/STM32/SoftwareSerial.cpp b/Marlin/src/HAL/STM32/SoftwareSerial.cpp index af92548cbb..2228a177be 100644 --- a/Marlin/src/HAL/STM32/SoftwareSerial.cpp +++ b/Marlin/src/HAL/STM32/SoftwareSerial.cpp @@ -3,14 +3,14 @@ * * Multi-instance software serial library for Arduino/Wiring * -- Interrupt-driven receive and other improvements by ladyada - * (https://ladyada.net) + * * -- Tuning, circular buffer, derivation from class Print/Stream, * multi-instance support, porting to 8MHz processors, * various optimizations, PROGMEM delay tables, inverse logic and - * direct port writing by Mikal Hart (http://www.arduiniana.org) - * -- Pin change interrupt macros by Paul Stoffregen (https://www.pjrc.com) - * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) - * -- ATmega1280/2560 support by Brett Hagman (https://www.roguerobotics.com/) + * direct port writing by Mikal Hart + * -- Pin change interrupt macros by Paul Stoffregen + * -- 20MHz processor support by Garrett Mace + * -- ATmega1280/2560 support by Brett Hagman * -- STM32 support by Armin van der Togt * * This library is free software; you can redistribute it and/or diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp index f524673ecd..bfc062af20 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp @@ -4,7 +4,7 @@ * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * file, You can obtain one at https://www.mozilla.org/en-US/MPL/2.0/ * * This library was modified, some bugs fixed, stack address validated * and adapted to be used in Marlin 3D printer firmware as backtracer diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index 4976b36907..55f10a49ef 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -27,7 +27,7 @@ * https://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf * * For discussion and feedback, please go to: - * https://arduino.cc/forum/index.php/topic,51842.0.html + * https://forum.arduino.cc/index.php/topic,51842.0.html */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/gcode/motion/G5.cpp b/Marlin/src/gcode/motion/G5.cpp index 35cc428023..2c98fae845 100644 --- a/Marlin/src/gcode/motion/G5.cpp +++ b/Marlin/src/gcode/motion/G5.cpp @@ -29,7 +29,7 @@ /** * Parameters interpreted according to: - * https://linuxcnc.org/docs/2.6/html/gcode/gcode.html#sec:G5-Cubic-Spline + * https://linuxcnc.org/docs/2.7/html/gcode/g-code.html#gcode:g5 * However I, J omission is not supported at this point; all * parameters can be omitted and default to zero. */ diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf index 1194847f77..475f8bf108 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/vscode/avrdude.conf @@ -145,9 +145,9 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: +# at90s4433/2333's; see the at90s4433 errata page 2 at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf # # INSTRUCTION FORMATS # @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + desc = "Brian Dean's Programmer, https://savannah.nongnu.org/projects/avrdude"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on http://electropol.free.fr) +# disconnect port download on http://www.electropol.fr programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +# https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en592141 programmer id = "89isp"; desc = "Atmel at89isp cable"; diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf index 46e7ace34b..cbc65d6917 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -145,9 +145,9 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: +# at90s4433/2333's; see the at90s4433 errata page 2 at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf # # INSTRUCTION FORMATS # @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + desc = "Brian Dean's Programmer, https://savannah.nongnu.org/projects/avrdude"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on http://electropol.free.fr) +# disconnect port download on http://www.electropol.fr programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +# https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en592141 programmer id = "89isp"; desc = "Atmel at89isp cable"; diff --git a/buildroot/share/vscode/avrdude_macOS.conf b/buildroot/share/vscode/avrdude_macOS.conf index d933567452..814e87e35e 100644 --- a/buildroot/share/vscode/avrdude_macOS.conf +++ b/buildroot/share/vscode/avrdude_macOS.conf @@ -145,9 +145,9 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: +# at90s4433/2333's; see the at90s4433 errata page 2 at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf # # INSTRUCTION FORMATS # @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; type = usbtiny; ; diff --git a/platformio.ini b/platformio.ini index 543b837f54..f60ebcce35 100644 --- a/platformio.ini +++ b/platformio.ini @@ -4,7 +4,7 @@ # # For detailed documentation with EXAMPLES: # -# https://docs.platformio.org/en/latest/projectconf.html +# https://docs.platformio.org/en/latest/projectconf/index.html # # Automatic targets - enable auto-uploading From 36ef9327efd339f925ef0de07801fd0a4a42e59b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 28 Jul 2020 03:10:00 -0500 Subject: [PATCH 0006/1370] Keep -std=gnu++11 in stm32 build_unflags --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index f60ebcce35..24d416444f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -380,7 +380,7 @@ src_filter = ${common.default_src_filter} + platform = ${common_stm32.platform} build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DHAVE_SW_SERIAL -build_unflags = -std=gnu11 +build_unflags = -std=gnu11 -std=gnu++11 src_filter = ${common.default_src_filter} + lib_ignore = SPI lib_deps = ${common.lib_deps} From c0d8542a85ca4c98a3be17fe792e37169393695c Mon Sep 17 00:00:00 2001 From: natemason Date: Wed, 29 Jul 2020 09:18:02 +0800 Subject: [PATCH 0007/1370] Add TEMP_PROBE_PIN for Einsy Rambo (#18823) --- Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 76c3f131a9..8fb3be47da 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -109,6 +109,7 @@ #define TEMP_0_PIN 0 // Analog Input #define TEMP_1_PIN 1 // Analog Input #define TEMP_BED_PIN 2 // Analog Input +#define TEMP_PROBE_PIN 3 // Analog Input // // Heaters / Fans From b765bfa5a5d8d196690baecebfa91cfd256fd1f8 Mon Sep 17 00:00:00 2001 From: MoellerDi Date: Wed, 29 Jul 2020 03:19:12 +0200 Subject: [PATCH 0008/1370] Fix NEOPIXEL_LED compile w/out PRINTER_EVENT_LEDS (#18824) --- Marlin/src/inc/Conditionals_LCD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 66e83c5299..992a788eb5 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -752,6 +752,6 @@ /** * To check if we need the folder src/features/leds */ -#if ANY(TEMP_STAT_LEDS, HAS_COLOR_LEDS, HAS_CASE_LIGHT, PRINTER_EVENT_LEDS, LED_BACKLIGHT_TIMEOUT, PCA9632_BUZZER, LED_CONTROL_MENU) +#if ANY(TEMP_STAT_LEDS, HAS_COLOR_LEDS, HAS_CASE_LIGHT, PRINTER_EVENT_LEDS, LED_BACKLIGHT_TIMEOUT, PCA9632_BUZZER, LED_CONTROL_MENU, NEOPIXEL_LED) #define HAS_LED_FEATURE 1 #endif From 524613b610b423720235466f1ff06d176b18d648 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 28 Jul 2020 23:15:17 -0300 Subject: [PATCH 0009/1370] DISABLE_DEBUG required to free Robin nano Z_DIR_PIN (#18832) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index dd0d1e9465..ee88962e12 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -37,7 +37,7 @@ // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // -//#define DISABLE_DEBUG +#define DISABLE_DEBUG // // EEPROM From 796471a7c6d6cad02c9ae929f8be6e40094a4763 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 29 Jul 2020 04:19:46 +0200 Subject: [PATCH 0010/1370] [SAMD51] ES Interrupt parity with other HALs (#18836) --- Marlin/src/HAL/SAMD51/endstop_interrupts.h | 27 +++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Marlin/src/HAL/SAMD51/endstop_interrupts.h b/Marlin/src/HAL/SAMD51/endstop_interrupts.h index 03c2469453..daac773387 100644 --- a/Marlin/src/HAL/SAMD51/endstop_interrupts.h +++ b/Marlin/src/HAL/SAMD51/endstop_interrupts.h @@ -126,82 +126,83 @@ void endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) #if HAS_X_MAX #if !AVAILABLE_EILINE(X_MAX_PIN) #error "X_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(X_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(X_MAX_PIN); #endif #if HAS_X_MIN #if !AVAILABLE_EILINE(X_MIN_PIN) #error "X_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(X_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(X_MIN_PIN); #endif #if HAS_Y_MAX #if !AVAILABLE_EILINE(Y_MAX_PIN) #error "Y_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Y_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Y_MAX_PIN); #endif #if HAS_Y_MIN #if !AVAILABLE_EILINE(Y_MIN_PIN) #error "Y_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Y_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Y_MIN_PIN); #endif #if HAS_Z_MAX #if !AVAILABLE_EILINE(Z_MAX_PIN) #error "Z_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Z_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Z_MAX_PIN); #endif #if HAS_Z_MIN #if !AVAILABLE_EILINE(Z_MIN_PIN) #error "Z_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Z_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Z_MIN_PIN); #endif #if HAS_Z2_MAX #if !AVAILABLE_EILINE(Z2_MAX_PIN) #error "Z2_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Z2_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Z2_MAX_PIN); #endif #if HAS_Z2_MIN #if !AVAILABLE_EILINE(Z2_MIN_PIN) #error "Z2_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Z2_MIN_PIN); #endif #if HAS_Z3_MAX #if !AVAILABLE_EILINE(Z3_MAX_PIN) #error "Z3_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Z3_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Z3_MAX_PIN); #endif #if HAS_Z3_MIN #if !AVAILABLE_EILINE(Z3_MIN_PIN) #error "Z3_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Z3_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Z3_MIN_PIN); #endif #if HAS_Z4_MAX #if !AVAILABLE_EILINE(Z4_MAX_PIN) #error "Z4_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Z4_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Z4_MAX_PIN); #endif #if HAS_Z4_MIN #if !AVAILABLE_EILINE(Z4_MIN_PIN) #error "Z4_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Z4_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Z4_MIN_PIN); #endif #if HAS_Z_MIN_PROBE_PIN #if !AVAILABLE_EILINE(Z_MIN_PROBE_PIN) #error "Z_MIN_PROBE_PIN has no EXTINT line available." #endif - attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); + _ATTACH(Z_MIN_PROBE_PIN); #endif } From 29e900977fb51c279ae18054c63f4d190ba4d428 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Wed, 29 Jul 2020 04:28:58 +0200 Subject: [PATCH 0011/1370] Fix Cancel Objects index display (zero-based) (#18841) --- Marlin/src/feature/cancel_object.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index 7eb4715435..16f876f136 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -45,7 +45,7 @@ void CancelObject::set_active_object(const int8_t obj) { #if HAS_DISPLAY if (active_object >= 0) - ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object + 1)); + ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object)); else ui.reset_status(); #endif From a87114fbfa0e8b0142c4a78adb0a01297747135a Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 29 Jul 2020 21:35:31 +0200 Subject: [PATCH 0012/1370] Clarify Nozzle-to-Probe offset (#18828) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index a01571c422..bde1e78552 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -964,24 +964,34 @@ // /** - * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * Nozzle-to-Probe offsets { X, Y, Z } * - * In the following example the X and Y offsets are both positive: + * - Use a caliper or ruler to measure the distance from the tip of + * the Nozzle to the center-point of the Probe in the X and Y axes. + * - For the Z offset use your best known value and adjust at runtime. + * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. * - * #define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } + * Assuming the typical work area orientation: + * - Probe to RIGHT of the Nozzle has a Positive X offset + * - Probe to LEFT of the Nozzle has a Negative X offset + * - Probe in BACK of the Nozzle has a Positive Y offset + * - Probe in FRONT of the Nozzle has a Negative Y offset + * + * Some examples: + * #define NOZZLE_TO_PROBE_OFFSET { 10, 10, -1 } // Example "1" + * #define NOZZLE_TO_PROBE_OFFSET {-10, 5, -1 } // Example "2" + * #define NOZZLE_TO_PROBE_OFFSET { 5, -5, -1 } // Example "3" + * #define NOZZLE_TO_PROBE_OFFSET {-15,-10, -1 } // Example "4" * * +-- BACK ---+ - * | | - * L | (+) P | R <-- probe (20,20) - * E | | I - * F | (-) N (+) | G <-- nozzle (10,10) - * T | | H - * | (-) | T - * | | + * | [+] | + * L | 1 | R <-- Example "1" (right+, back+) + * E | 2 | I <-- Example "2" ( left-, back+) + * F |[-] N [+]| G <-- Nozzle + * T | 3 | H <-- Example "3" (right+, front-) + * | 4 | T <-- Example "4" ( left-, front-) + * | [-] | * O-- FRONT --+ - * (0,0) - * - * Specify a Probe position as { X, Y, Z } */ #define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } From 5c699ab406e0031b04de6305f7f558e67916c9c6 Mon Sep 17 00:00:00 2001 From: lethalwallabies <54120706+lethalwallabies@users.noreply.github.com> Date: Wed, 29 Jul 2020 21:49:07 +0200 Subject: [PATCH 0013/1370] Typo fix (#18856) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 3f097c09e3..7ebab9d166 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -680,7 +680,7 @@ * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller! * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup. * If disabled, OD mode is the hard-coded default on 3.0 - * On startup, Marlin will compare its eeprom to this vale. If the selected mode + * On startup, Marlin will compare its eeprom to this value. If the selected mode * differs, a mode set eeprom write will be completed at initialization. * Use the option below to force an eeprom write to a V3.1 probe regardless. */ From 513d3172cb7d50bfa99507ec540f268ba73bf8ee Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 29 Jul 2020 15:44:05 -0500 Subject: [PATCH 0014/1370] Update keypad link --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index bde1e78552..1f34c06918 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2197,7 +2197,7 @@ // // RepRapWorld REPRAPWORLD_KEYPAD v1.1 -// https://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/ // //#define REPRAPWORLD_KEYPAD //#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press From c63c069d58ec6ffe095635fdf579c356d3262f14 Mon Sep 17 00:00:00 2001 From: Diego von Deschwanden <68632259+Diegovd@users.noreply.github.com> Date: Thu, 30 Jul 2020 02:04:37 +0200 Subject: [PATCH 0015/1370] Fix URLs to websites and resources (#18844) --- buildroot/share/vscode/avrdude.conf | 2 +- buildroot/share/vscode/avrdude_linux.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf index 475f8bf108..9f85aa0d26 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/vscode/avrdude.conf @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf index cbc65d6917..64d3b677d5 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; From bb21d79321a90de84b1f90e7fe302e64cf98a16d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 29 Jul 2020 20:43:35 -0500 Subject: [PATCH 0016/1370] Fix UNKNOWN_Z_NO_RAISE in G28 Bug introduced in 73fc0778b86 --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 1fbb3dd353..0b2bb9801b 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -312,7 +312,7 @@ void GcodeSuite::G28() { #endif const float z_homing_height = - ENABLED(UNKNOWN_Z_NO_RAISE) && TEST(axis_known_position, Z_AXIS) + ENABLED(UNKNOWN_Z_NO_RAISE) && !TEST(axis_known_position, Z_AXIS) ? 0 : (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT); From 0c1bf01cf7b69002f4f630dbb3507c561976b2ab Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 29 Jul 2020 20:50:10 -0500 Subject: [PATCH 0017/1370] In G28 Z is sort-of known --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 0b2bb9801b..78695bc05b 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -319,7 +319,7 @@ void GcodeSuite::G28() { if (z_homing_height && (doX || doY || (ENABLED(Z_SAFE_HOMING) && doZ))) { // Raise Z before homing any other axes and z is not already high enough (never lower z) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); - do_z_clearance(z_homing_height, TEST(axis_known_position, Z_AXIS), DISABLED(UNKNOWN_Z_NO_RAISE)); + do_z_clearance(z_homing_height, true, DISABLED(UNKNOWN_Z_NO_RAISE)); } #if ENABLED(QUICK_HOME) From fc12ffcb30a5a579d33bf30e5a8d9368f62f49c8 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 29 Jul 2020 23:25:07 -0300 Subject: [PATCH 0018/1370] SPI Emulated DOGM (like FSMC_GRAPHICAL_TFT, but SPI) (#18817) --- Marlin/Configuration.h | 14 +- Marlin/Configuration_adv.h | 5 +- Marlin/src/HAL/STM32F1/SPI.h | 2 + .../STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp | 236 ++++++++++++++++++ Marlin/src/feature/touch/xpt2046.cpp | 90 +++++-- Marlin/src/feature/touch/xpt2046.h | 4 - Marlin/src/inc/Conditionals_LCD.h | 6 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/SanityCheck.h | 26 +- Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 5 + ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 133 +++++----- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 14 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 25 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 24 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 89 ++++++- 15 files changed, 546 insertions(+), 129 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1f34c06918..c6ec607d9b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2156,6 +2156,12 @@ // //#define FSMC_GRAPHICAL_TFT +// +// SPI display (MKS Robin Nano V2.0, MKS Gen L V2.0) +// Upscaled 128x64 Marlin UI +// +//#define SPI_GRAPHICAL_TFT + // // TFT LVGL UI // @@ -2189,10 +2195,10 @@ #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - #define XPT2046_X_CALIBRATION 12316 - #define XPT2046_Y_CALIBRATION -8981 - #define XPT2046_X_OFFSET -43 - #define XPT2046_Y_OFFSET 257 + //#define XPT2046_X_CALIBRATION 12316 + //#define XPT2046_Y_CALIBRATION -8981 + //#define XPT2046_X_OFFSET -43 + //#define XPT2046_Y_OFFSET 257 #endif // diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7ebab9d166..37c9979771 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1509,9 +1509,10 @@ #endif // -// FSMC Graphical TFT +// FSMC / SPI Graphical TFT // -#if ENABLED(FSMC_GRAPHICAL_TFT) +#if TFT_SCALED_DOGLCD + //#define GRAPHICAL_TFT_ROTATE_180 //#define TFT_MARLINUI_COLOR 0xFFFF // White //#define TFT_MARLINBG_COLOR 0x0000 // Black //#define TFT_DISABLED_COLOR 0x0003 // Almost black diff --git a/Marlin/src/HAL/STM32F1/SPI.h b/Marlin/src/HAL/STM32F1/SPI.h index dc2a215865..0d20a46577 100644 --- a/Marlin/src/HAL/STM32F1/SPI.h +++ b/Marlin/src/HAL/STM32F1/SPI.h @@ -208,6 +208,8 @@ public: */ void setDataSize(uint32_t ds); + uint32_t getDataSize() { return _currentSetting->dataSize; } + /* Victor Perez 2017. Added to set and clear callback functions for callback * on DMA transfer completion. * onReceive used to set the callback in case of dmaTransfer (tx/rx), once rx is completed diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp new file mode 100644 index 0000000000..286dcfb5d0 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp @@ -0,0 +1,236 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __STM32F1__ + +#include "../../../inc/MarlinConfig.h" + +#if BOTH(HAS_GRAPHICAL_LCD, SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) + +#include "../HAL.h" +#include +#include + +#define SPI_TFT_CS_H OUT_WRITE(SPI_TFT_CS_PIN, HIGH) +#define SPI_TFT_CS_L OUT_WRITE(SPI_TFT_CS_PIN, LOW) + +#define SPI_TFT_DC_H OUT_WRITE(SPI_TFT_DC_PIN, HIGH) +#define SPI_TFT_DC_L OUT_WRITE(SPI_TFT_DC_PIN, LOW) + +#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) +#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) + +#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) +#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) + +void LCD_IO_Init(uint8_t cs, uint8_t rs); +void LCD_IO_WriteData(uint16_t RegValue); +void LCD_IO_WriteReg(uint16_t Reg); +uint16_t LCD_IO_ReadData(uint16_t RegValue); +uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); +#ifdef LCD_USE_DMA_SPI + void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); +#endif + +void LCD_WR_REG(uint8_t cmd) { + SPI_TFT_CS_L; + SPI_TFT_DC_L; + SPI.send(cmd); + SPI_TFT_CS_H; +} +void LCD_WR_DATA(uint8_t data) { + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.send(data); + SPI_TFT_CS_H; +} + +void spi1Init(uint8_t spiRate) { + SPI_TFT_CS_H; + + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + SPI.setModule(1); + SPI.begin(); + SPI.setClockDivider(clock); + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); +} + +void LCD_IO_Init(uint8_t cs, uint8_t rs) { + spi1Init(SPI_FULL_SPEED); +} + +void LCD_IO_WriteData(uint16_t RegValue) { + LCD_WR_DATA(RegValue); +} + +void LCD_IO_WriteReg(uint16_t Reg) { + LCD_WR_REG(Reg); +} + +uint16_t LCD_IO_ReadData(uint16_t RegValue) { + uint16_t d = 0; + SPI_TFT_CS_L; + + SPI_TFT_DC_L; + SPI.send(RegValue); + SPI_TFT_DC_H; + + SPI.read((uint8_t*)&d, 1); //dummy read + SPI.read((uint8_t*)&d, 1); + + SPI_TFT_CS_H; + return d >> 7; +} + +uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { + uint32_t data = 0; + uint8_t d = 0; + SPI_TFT_CS_L; + + SPI_TFT_DC_L; + SPI.send(RegValue); + SPI_TFT_DC_H; + + SPI.read((uint8_t*)&d, 1); //dummy read + SPI.read((uint8_t*)&d, 1); + data = d; + while (--ReadSize) { + data <<= 8; + SPI.read((uint8_t*)&d, 1); + data |= (d & 0xFF); + } + + SPI_TFT_CS_H; + return uint32_t(data >> 7); +} + +#ifdef LCD_USE_DMA_SPI + void LCD_IO_WriteMultiple(uint16_t data, uint32_t count) { + if (SPI.getDataSize() == DATA_SIZE_8BIT) { + count *= 2; + } + while (count > 0) { + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(&data, 1, true); + SPI_TFT_CS_H; + count--; + } + } + + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { + if (SPI.getDataSize() == DATA_SIZE_8BIT) { + length *= 2; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(data, length, true); + SPI_TFT_CS_H; + } + + void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { + if (SPI.getDataSize() == DATA_SIZE_8BIT) { + length *= 2; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSendAsync(data, length, true); + SPI_TFT_CS_H; + } + + void LCD_IO_WaitSequence_Async() { + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSendAsync(NULL, 0, true); + SPI_TFT_CS_H; + } +#endif + +static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif + +uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + if (msgInitCount) { + if (msg == U8G_COM_MSG_INIT) msgInitCount--; + if (msgInitCount) return -1; + } + + static uint8_t isCommand; + + LCD_IO_Init(-1, -1); + + switch (msg) { + case U8G_COM_MSG_STOP: break; + case U8G_COM_MSG_INIT: + u8g_SetPIOutput(u8g, U8G_PI_RESET); + + u8g_Delay(50); + + if (arg_ptr) { + spi1Init(SPI_EIGHTH_SPEED); + *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3); + spi1Init(SPI_FULL_SPEED); + } + isCommand = 0; + break; + + case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) + isCommand = arg_val == 0 ? 1 : 0; + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + if (isCommand) + LCD_IO_WriteReg(arg_val); + else + LCD_IO_WriteData((uint16_t)arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: + for (uint8_t i = 0; i < arg_val; i += 2) + LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); + break; + + } + return 1; +} + +#endif // HAS_GRAPHICAL_LCD +#endif // STM32F1 diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index 235c17b50c..d613fbc89a 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -23,10 +23,14 @@ #include "xpt2046.h" #include "../../inc/MarlinConfig.h" -#if ENABLED(FSMC_GRAPHICAL_TFT) + +#if TFT_SCALED_DOGLCD #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. #endif +#ifndef XPT2046_Z1_THRESHOLD + #define XPT2046_Z1_THRESHOLD 10 +#endif /* * Draw and Touch processing @@ -117,10 +121,15 @@ uint8_t XPT2046::read_buttons() { // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible. if (!isTouched()) return 0; - const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], - y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; + uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], + y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. + #if ENABLED(GRAPHICAL_TFT_ROTATE_180) + x = TOUCH_SCREEN_WIDTH - x; + y = TOUCH_SCREEN_HEIGHT - y; + #endif + // Touch within the button area simulates an encoder button if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) return WITHIN(x, 14, 77) ? EN_D @@ -151,30 +160,69 @@ bool XPT2046::isTouched() { ); } +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include + + static void touch_spi_init(uint8_t spiRate) { + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + SPI.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); + SPI.begin(); + SPI.setClockDivider(clock); + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); + } +#endif // TOUCH_BUTTONS_HW_SPI + uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) { uint16_t data[3]; - - OUT_WRITE(TOUCH_CS_PIN, LOW); - const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE; - for (uint16_t i = 0; i < 3 ; i++) { - for (uint8_t j = 0x80; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - WRITE(TOUCH_MOSI_PIN, bool(coord & j)); - WRITE(TOUCH_SCK_PIN, HIGH); + + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + + touch_spi_init(SPI_SPEED_6); + for (uint16_t i = 0; i < 3; i++) { + OUT_WRITE(TOUCH_CS_PIN, LOW); + SPI.transfer(coord); + data[i] = (((SPI.transfer(0xFF) << 8) | SPI.transfer(0xFF)) >> 3) & 0x0FFF; + WRITE(TOUCH_CS_PIN, HIGH); } - data[i] = 0; - for (uint16_t j = 0x8000; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - if (READ(TOUCH_MISO_PIN)) data[i] |= j; - WRITE(TOUCH_SCK_PIN, HIGH); - } - WRITE(TOUCH_SCK_PIN, LOW); - data[i] >>= 4; - } + #else // !TOUCH_BUTTONS_HW_SPI - WRITE(TOUCH_CS_PIN, HIGH); + OUT_WRITE(TOUCH_CS_PIN, LOW); + for (uint16_t i = 0; i < 3; i++) { + for (uint8_t j = 0x80; j; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + WRITE(TOUCH_MOSI_PIN, bool(coord & j)); + WRITE(TOUCH_SCK_PIN, HIGH); + } + + data[i] = 0; + for (uint16_t j = 0x8000; j; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + if (READ(TOUCH_MISO_PIN)) data[i] |= j; + WRITE(TOUCH_SCK_PIN, HIGH); + } + WRITE(TOUCH_SCK_PIN, LOW); + data[i] >>= 4; + } + WRITE(TOUCH_CS_PIN, HIGH); + + #endif // !TOUCH_BUTTONS_HW_SPI uint16_t delta01 = _MAX(data[0], data[1]) - _MIN(data[0], data[1]), delta02 = _MAX(data[0], data[2]) - _MIN(data[0], data[2]), diff --git a/Marlin/src/feature/touch/xpt2046.h b/Marlin/src/feature/touch/xpt2046.h index 347881e0ad..467317901b 100644 --- a/Marlin/src/feature/touch/xpt2046.h +++ b/Marlin/src/feature/touch/xpt2046.h @@ -34,10 +34,6 @@ enum XPTCoordinate : uint8_t { XPT2046_Z2 = 0x40 }; -#ifndef XPT2046_Z1_THRESHOLD - #define XPT2046_Z1_THRESHOLD 10 -#endif - class XPT2046 { public: static void init(); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 992a788eb5..1605ced3c8 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -261,7 +261,11 @@ #endif // FSMC/SPI TFT Panels -#if ENABLED(FSMC_GRAPHICAL_TFT) +#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) + #define TFT_SCALED_DOGLCD 1 +#endif + +#if TFT_SCALED_DOGLCD #define DOGLCD #define IS_ULTIPANEL #define DELAYED_BACKLIGHT_INIT diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index e12310e07c..c7171b06d8 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -373,7 +373,7 @@ #endif -#if EITHER(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) +#if ANY(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) #define NO_LCD_REINIT 1 // Suppress LCD re-initialization #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9fde639b0f..9fb742f505 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -451,8 +451,6 @@ #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. Please update your configuration." #elif defined(TFT_LVGL_UI) #error "TFT_LVGL_UI is now TFT_LVGL_UI_FSMC. Please update your configuration." -#elif defined(SPI_GRAPHICAL_TFT) - #error "SPI_GRAPHICAL_TFT is now TFT_LVGL_UI_SPI. Please update your configuration." #elif defined(SDPOWER) #error "SDPOWER is now SDPOWER_PIN. Please update your configuration and/or pins." #elif defined(STRING_SPLASH_LINE1) || defined(STRING_SPLASH_LINE2) @@ -3036,11 +3034,27 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif /** - * Sanity checks for stepper chunk support + * Stepper Chunk support */ -#if ENABLED(DIRECT_STEPPING) - #if ENABLED(LIN_ADVANCE) - #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." +#if BOTH(DIRECT_STEPPING, LIN_ADVANCE) + #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." +#endif + +/** + * Touch Buttons + */ +#if ENABLED(TOUCH_BUTTONS) + #ifndef XPT2046_X_CALIBRATION + #error "XPT2046_X_CALIBRATION must be defined with TOUCH_BUTTONS." + #endif + #ifndef XPT2046_Y_CALIBRATION + #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_BUTTONS." + #endif + #ifndef XPT2046_X_OFFSET + #error "XPT2046_X_OFFSET must be defined with TOUCH_BUTTONS." + #endif + #ifndef XPT2046_Y_OFFSET + #error "XPT2046_Y_OFFSET must be defined with TOUCH_BUTTONS." #endif #endif diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index df7f8dd44b..1f9621e9c0 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -87,6 +87,11 @@ #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_fsmc_fn #endif + #if ENABLED(SPI_GRAPHICAL_TFT) + uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_spi_fn + #endif + #elif defined(TARGET_LPC1768) uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index fc7a22b261..33cd5ecca6 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -57,14 +57,21 @@ #include "../../inc/MarlinConfig.h" -#if HAS_GRAPHICAL_LCD && PIN_EXISTS(FSMC_CS) +#if HAS_GRAPHICAL_LCD && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT)) #include "HAL_LCD_com_defines.h" #include "ultralcd_DOGM.h" #include -#ifdef LCD_USE_DMA_FSMC +#if EITHER(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) + #define HAS_LCD_IO 1 +#endif + +#if HAS_LCD_IO + extern void LCD_IO_Init(uint8_t cs, uint8_t rs); + extern uint16_t LCD_IO_ReadData(uint16_t Reg); + extern uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); extern void LCD_IO_WriteReg(uint16_t Reg); extern void LCD_IO_WriteData(uint16_t RegValue); extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); @@ -148,46 +155,34 @@ static uint32_t lcd_id = 0; static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteReg(ILI9328_HASTART); - LCD_IO_WriteData(Ymin); - LCD_IO_WriteReg(ILI9328_HAEND); - LCD_IO_WriteData(Ymax); - LCD_IO_WriteReg(ILI9328_VASTART); - LCD_IO_WriteData(Xmin); - LCD_IO_WriteReg(ILI9328_VAEND); - LCD_IO_WriteData(Xmax); + #if HAS_LCD_IO + #define IO_REG_DATA(R,D) do { LCD_IO_WriteReg(R); LCD_IO_WriteData(D); }while(0) + #else + #define IO_REG_DATA(R,D) do { u8g_WriteByte(u8g, dev, R); u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&D); }while(0) + #endif - LCD_IO_WriteReg(ILI9328_HASET); - LCD_IO_WriteData(Ymin); - LCD_IO_WriteReg(ILI9328_VASET); - LCD_IO_WriteData(Xmin); + #if NONE(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) + u8g_SetAddress(u8g, dev, 0); + #endif + IO_REG_DATA(ILI9328_HASTART, Ymin); + IO_REG_DATA(ILI9328_HAEND, Ymax); + IO_REG_DATA(ILI9328_VASTART, Xmin); + IO_REG_DATA(ILI9328_VAEND, Xmax); + + IO_REG_DATA(ILI9328_HASET, Ymin); + IO_REG_DATA(ILI9328_VASET, Xmin); + + #if HAS_LCD_IO LCD_IO_WriteReg(ILI9328_WRITE_RAM); #else - u8g_SetAddress(u8g, dev, 0); - - u8g_WriteByte(u8g, dev, ILI9328_HASTART); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymin); - u8g_WriteByte(u8g, dev, ILI9328_HAEND); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymax); - u8g_WriteByte(u8g, dev, ILI9328_VASTART); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmin); - u8g_WriteByte(u8g, dev, ILI9328_VAEND); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmax); - - u8g_WriteByte(u8g, dev, ILI9328_HASET); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymin); - u8g_WriteByte(u8g, dev, ILI9328_VASET); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmin); - u8g_WriteByte(u8g, dev, ILI9328_WRITE_RAM); u8g_SetAddress(u8g, dev, 1); #endif } static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO LCD_IO_WriteReg(ST7789V_CASET); LCD_IO_WriteData((Xmin >> 8) & 0xFF); LCD_IO_WriteData(Xmin & 0xFF); @@ -227,7 +222,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint #define ESC_END 0xFFFF, 0x7FFF #define ESC_FFFF 0xFFFF, 0xFFFF -#ifdef LCD_USE_DMA_FSMC +#if HAS_LCD_IO void writeEscSequence(const uint16_t *sequence) { uint16_t data; for (;;) { @@ -247,6 +242,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } } } + #define WRITE_ESC_SEQUENCE(V) writeEscSequence(V) #else void writeEscSequence8(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { uint16_t data; @@ -271,6 +267,8 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } } + #define WRITE_ESC_SEQUENCE(V) writeEscSequence8(u8g, dev, V) + void writeEscSequence16(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { uint16_t data; u8g_SetAddress(u8g, dev, 0); @@ -381,6 +379,30 @@ static const uint16_t ili9341_init[] = { ESC_END }; +static const uint16_t st9677_init[] = { + ESC_REG(0x0010), ESC_DELAY(120), + ESC_REG(0x0001), ESC_DELAY(120), + ESC_REG(0x0011), ESC_DELAY(120), + ESC_REG(0x00F0), 0x00C3, + ESC_REG(0x00F0), 0x0096, + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028), + ESC_REG(0x003A), 0x0055, + ESC_REG(0x00B4), 0x0001, + ESC_REG(0x00B7), 0x00C6, + ESC_REG(0x00E8), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, + ESC_REG(0x00C1), 0x0006, + ESC_REG(0x00C2), 0x00A7, + ESC_REG(0x00C5), 0x0018, + ESC_REG(0x00E0), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0015, 0x002F, 0x0054, 0x0042, 0x003C, 0x0017, 0x0014, 0x0018, 0x001B, + ESC_REG(0x00E1), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0003, 0x002D, 0x0043, 0x0042, 0x003B, 0x0016, 0x0014, 0x0017, 0x001B, + ESC_REG(0x00F0), 0x003C, + ESC_REG(0x00F0), 0x0069, ESC_DELAY(120), + ESC_REG(0x0029), + ESC_REG(0x0011), + ESC_DELAY(100), + ESC_END +}; + #if ENABLED(TOUCH_BUTTONS) static const uint8_t buttonD[] = { @@ -560,7 +582,7 @@ static const uint16_t ili9341_init[] = { v = TFT_MARLINBG_COLOR; LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = v; } - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO LOOP_S_L_N(n, 1, FSMC_UPSCALE) for (uint16_t l = 0; l < length * (FSMC_UPSCALE); l++) buffer[l + (length * (FSMC_UPSCALE) * n)] = buffer[l]; @@ -586,41 +608,39 @@ static uint8_t page; uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - #ifdef LCD_USE_DMA_FSMC + + #if ENABLED(SPI_GRAPHICAL_TFT) + LCD_IO_Init(-1, -1); + #endif + + #if HAS_LCD_IO static uint16_t bufferA[WIDTH * sq(FSMC_UPSCALE)], bufferB[WIDTH * sq(FSMC_UPSCALE)]; uint16_t* buffer = &bufferA[0]; - bool allow_async = true; + bool allow_async = DISABLED(SPI_GRAPHICAL_TFT); #else uint16_t buffer[WIDTH*2]; // 16-bit RGB 565 pixel line buffer #endif + switch (msg) { case U8G_DEV_MSG_INIT: dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); switch (lcd_id & 0xFFFF) { case 0x8552: // ST7789V - #ifdef LCD_USE_DMA_FSMC - writeEscSequence(st7789v_init); - #else - writeEscSequence8(u8g, dev, st7789v_init); - #endif + WRITE_ESC_SEQUENCE(st7789v_init); setWindow = setWindow_st7789v; break; case 0x9328: // ILI9328 - #ifdef LCD_USE_DMA_FSMC - writeEscSequence(ili9328_init); - #else - writeEscSequence16(u8g, dev, ili9328_init); - #endif + WRITE_ESC_SEQUENCE(ili9328_init); setWindow = setWindow_ili9328; break; case 0x9341: // ILI9341 case 0x8066: // Anycubic / TronXY TFTs (480x320) - #ifdef LCD_USE_DMA_FSMC - writeEscSequence(ili9341_init); - #else - writeEscSequence8(u8g, dev, ili9341_init); - #endif + WRITE_ESC_SEQUENCE(ili9341_init); + setWindow = setWindow_st7789v; + break; + case 0x7796: + WRITE_ESC_SEQUENCE(TERN(HAS_LCD_IO, st9677_init, ili9341_init)); setWindow = setWindow_st7789v; break; case 0x0404: // No connected display on FSMC @@ -630,10 +650,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u lcd_id = 0; return 0; default: - if (lcd_id && 0xFF000000) - setWindow = setWindow_st7789v; - else - setWindow = setWindow_ili9328; + setWindow = (lcd_id & 0xFF000000) ? setWindow_st7789v : setWindow_ili9328; break; } @@ -644,7 +661,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u // Clear Screen setWindow(u8g, dev, 0, 0, LCD_FULL_PIXEL_WIDTH - 1, LCD_FULL_PIXEL_HEIGHT - 1); - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT); #else memset2(buffer, TFT_MARLINBG_COLOR, 160); @@ -681,7 +698,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u LOOP_L_N(y, PAGE_HEIGHT) { uint32_t k = 0; - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO buffer = (y & 1) ? bufferB : bufferA; #endif for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { @@ -689,7 +706,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR; LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = c; } - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO LOOP_S_L_N(n, 1, FSMC_UPSCALE) for (uint16_t l = 0; l < WIDTH * (FSMC_UPSCALE); l++) buffer[l + WIDTH * (FSMC_UPSCALE) * n] = buffer[l]; diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 1b6dd0b9de..5ebff37edf 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -182,12 +182,16 @@ #define U8G_CLASS U8GLIB_SH1106_128X64 #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS -#elif ENABLED(FSMC_GRAPHICAL_TFT) +#elif TFT_SCALED_DOGLCD // Unspecified 320x240 TFT pre-initialized by built-in bootloader #define U8G_CLASS U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 - #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN + #if ENABLED(FSMC_GRAPHICAL_TFT) + #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN + #else + #define U8G_PARAM -1, -1 + #endif #else @@ -210,18 +214,18 @@ // LCD_FULL_PIXEL_WIDTH = // LCD_PIXEL_OFFSET_X + (LCD_PIXEL_WIDTH * 2) + LCD_PIXEL_OFFSET_X -#if ENABLED(FSMC_GRAPHICAL_TFT) +#if TFT_SCALED_DOGLCD #ifndef LCD_FULL_PIXEL_WIDTH #define LCD_FULL_PIXEL_WIDTH 320 #endif #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 32 + #define LCD_PIXEL_OFFSET_X 32 #endif #ifndef LCD_FULL_PIXEL_HEIGHT #define LCD_FULL_PIXEL_HEIGHT 240 #endif #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 + #define LCD_PIXEL_OFFSET_Y 32 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 0a733049b8..5a672d29b1 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -112,10 +112,10 @@ #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 + #define LCD_FULL_PIXEL_WIDTH 480 + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_FULL_PIXEL_HEIGHT 320 + #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -135,10 +135,19 @@ #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif + #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 0fb3a9a879..be71d3f2c2 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -118,10 +118,10 @@ // #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 + #define LCD_FULL_PIXEL_WIDTH 480 + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_FULL_PIXEL_HEIGHT 320 + #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -141,10 +141,18 @@ #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index ee88962e12..afbcc8f32a 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -207,6 +207,13 @@ #define MT_DET_2_PIN PE6 #define MT_DET_PIN_INVERTING false +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN MT_DET_1_PIN +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN MT_DET_2_PIN +#endif + #define WIFI_IO0_PIN PC13 // @@ -224,7 +231,9 @@ // // LCD / Controller // -#define BEEPER_PIN PC5 +#ifndef BEEPER_PIN + #define BEEPER_PIN PC5 +#endif /** * Note: MKS Robin TFT screens use various TFT controllers. @@ -250,7 +259,6 @@ #define BTN_EN1 PE8 #define BTN_EN2 PE11 - #define BEEPER_PIN PC5 #define BTN_ENC PE13 #elif ENABLED(TFT_LITTLE_VGL_UI) @@ -269,16 +277,71 @@ #if HAS_SPI_LCD - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define LCD_BACKLIGHT_PIN -1 + #if ENABLED(SPI_GRAPHICAL_TFT) // Emulated DOGM SPI + #define SPI_TFT_CS_PIN PD11 + #define SPI_TFT_SCK_PIN PA5 + #define SPI_TFT_MISO_PIN PA6 + #define SPI_TFT_MOSI_PIN PA7 + #define SPI_TFT_DC_PIN PD10 + #define SPI_TFT_RST_PIN PC6 + + #define LCD_BACKLIGHT_PIN PD13 + + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + //#define TOUCH_BUTTONS + #if ENABLED(TOUCH_BUTTONS) + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -5481 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 4000 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 343 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 0 + #endif + #endif + + #ifndef FSMC_UPSCALE + #define FSMC_UPSCALE 3 + #endif + #ifndef LCD_FULL_PIXEL_WIDTH + #define LCD_FULL_PIXEL_WIDTH 480 + #endif + #ifndef LCD_PIXEL_OFFSET_X + #define LCD_PIXEL_OFFSET_X 48 + #endif + #ifndef LCD_FULL_PIXEL_HEIGHT + #define LCD_FULL_PIXEL_HEIGHT 320 + #endif + #ifndef LCD_PIXEL_OFFSET_Y + #define LCD_PIXEL_OFFSET_Y 32 + #endif + + #define BTN_ENC PE13 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 + + #elif ENABLED(MKS_MINI_12864) + + // MKS MINI12864 and MKS LCD12864B + // If using MKS LCD12864A (Need to remove RPK2 resistor) - // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) - #if ENABLED(MKS_MINI_12864) #define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN -1 #define DOGLCD_A0 PD11 @@ -320,3 +383,7 @@ #define W25QXX_MISO_PIN PB14 #define W25QXX_SCK_PIN PB13 #endif + +#if ENABLED(SPEAKER) && BEEPER_PIN == PC5 + #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER." +#endif From 60cc56b31c9b040e9940ab037292901ed4ceaf9c Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 30 Jul 2020 14:26:18 +1200 Subject: [PATCH 0019/1370] No HEATER_0_PIN needed with 0 EXTRUDERS (#18827) --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9fb742f505..1db779b31e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1797,7 +1797,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Test Heater, Temp Sensor, and Extruder Pins */ -#if !HAS_HEATER_0 +#if !HAS_HEATER_0 && EXTRUDERS #error "HEATER_0_PIN not defined for this board." #elif !ANY_PIN(TEMP_0, MAX6675_SS) #error "TEMP_0_PIN not defined for this board." From 3fbc002bad8e6d96c1df9f1ed6429041b0b96c8e Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 30 Jul 2020 00:04:47 -0300 Subject: [PATCH 0020/1370] SanityCheck: No Adafruit NeoPixel for STM32F1 (#18833) --- Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index 5559b3d4a4..ec7e8cf176 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -51,3 +51,7 @@ #elif ENABLED(SERIAL_STATS_DROPPED_RX) #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." #endif + +#if ENABLED(NEOPIXEL_LED) + #error "NEOPIXEL_LED (Adafruit NeoPixel) is not supported for HAL/STM32F1. Comment out this line to proceed at your own risk!" +#endif From 8f8b0d84ae4457f4d3e08fb0ac193faa4d231d33 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilenko Date: Thu, 30 Jul 2020 09:43:19 +0300 Subject: [PATCH 0021/1370] Support for TFT & Touch Screens (#18130) --- .github/workflows/test-builds.yml | 1 + Marlin/Configuration.h | 22 +- Marlin/src/HAL/AVR/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/DUE/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/STM32/HAL.h | 5 + .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 73 +- Marlin/src/HAL/STM32/tft/tft_fsmc.cpp | 180 +++++ Marlin/src/HAL/STM32/tft/tft_fsmc.h | 160 +++++ Marlin/src/HAL/STM32/tft/tft_spi.cpp | 212 ++++++ Marlin/src/HAL/STM32/tft/tft_spi.h | 67 ++ Marlin/src/HAL/STM32/tft/xpt2046.cpp | 185 +++++ Marlin/src/HAL/STM32/tft/xpt2046.h | 86 +++ Marlin/src/HAL/STM32F1/SPI.cpp | 2 +- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 11 + .../HAL/STM32_F4_F7/inc/Conditionals_LCD.h | 4 + .../HAL/TEENSY31_32/inc/Conditionals_LCD.h | 4 + .../HAL/TEENSY35_36/inc/Conditionals_LCD.h | 4 + Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/core/boards.h | 5 + Marlin/src/feature/touch/xpt2046.cpp | 13 +- Marlin/src/gcode/bedlevel/G26.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 4 + Marlin/src/gcode/gcode.h | 3 + Marlin/src/gcode/lcd/M995.cpp | 39 ++ Marlin/src/inc/Conditionals_LCD.h | 40 +- Marlin/src/inc/Conditionals_adv.h | 11 + Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/SanityCheck.h | 18 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 8 +- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 331 ++++----- .../lib/mks_ui/tft_lvgl_configuration.cpp | 6 +- Marlin/src/lcd/menu/menu.cpp | 8 +- Marlin/src/lcd/menu/menu.h | 4 + Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 23 +- Marlin/src/lcd/menu/menu_touch_screen.cpp | 34 + Marlin/src/lcd/menu/menu_ubl.cpp | 6 +- Marlin/src/lcd/tft/bitmaps/back.bmp | Bin 0 -> 3126 bytes Marlin/src/lcd/tft/bitmaps/bed.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/bed_heated.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/cancel.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/chamber.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/confirm.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/decrease.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/directory.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/down.bmp | Bin 0 -> 3126 bytes Marlin/src/lcd/tft/bitmaps/fan0.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan1.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/feedrate.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/flowrate.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/hotend.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/increase.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/left.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/leveling.bmp | Bin 0 -> 3126 bytes .../bitmaps/marlin-logo/Marlin-1500x319.png | Bin 0 -> 387923 bytes .../tft/bitmaps/marlin-logo/Marlin-195x59.png | Bin 0 -> 18386 bytes .../marlin-logo/Marlin-228x255-greyscale.png | Bin 0 -> 7940 bytes .../bitmaps/marlin-logo/Marlin-228x255.png | Bin 0 -> 81470 bytes .../bitmaps/marlin-logo/Marlin-280x200.png | Bin 0 -> 46851 bytes .../bitmaps/marlin-logo/Marlin-320x240.png | Bin 0 -> 97523 bytes .../bitmaps/marlin-logo/Marlin-480x319.png | Bin 0 -> 168816 bytes .../bitmaps/marlin-logo/Marlin-480x320.png | Bin 0 -> 168834 bytes Marlin/src/lcd/tft/bitmaps/menu.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/pause.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/refresh.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/right.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/sd.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/settings.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/up.bmp | Bin 0 -> 3126 bytes Marlin/src/lcd/tft/canvas.cpp | 179 +++++ Marlin/src/lcd/tft/canvas.h | 57 ++ .../src/lcd/tft/fontdata/fontdata_10x20.cpp | 257 +++++++ .../lcd/tft/fontdata/fontdata_ISO10646_1.cpp | 314 +++++++++ .../lcd/tft/fontdata/helvetica_12_bold.cpp | 302 ++++++++ Marlin/src/lcd/tft/fontdata/helvetica_14.cpp | 378 ++++++++++ Marlin/src/lcd/tft/fontdata/helvetica_18.cpp | 492 +++++++++++++ Marlin/src/lcd/tft/fontdata/profont_22.cpp | 426 ++++++++++++ Marlin/src/lcd/tft/ili9328.h | 150 ++++ Marlin/src/lcd/tft/ili9341.h | 162 +++++ Marlin/src/lcd/tft/ili9488.h | 156 +++++ Marlin/src/lcd/tft/images/back_32x32x4.cpp | 62 ++ .../lcd/tft/images/background_320x30x16.cpp | 60 ++ .../lcd/tft/images/bootscreen_112x38x1.cpp | 70 ++ .../lcd/tft/images/bootscreen_195x59x16.cpp | 89 +++ .../lcd/tft/images/bootscreen_228x255x2.cpp | 285 ++++++++ .../lcd/tft/images/bootscreen_228x255x4.cpp | 285 ++++++++ .../lcd/tft/images/bootscreen_320x240x16.cpp | 270 +++++++ .../lcd/tft/images/bootscreen_480x320x16.cpp | 350 ++++++++++ Marlin/src/lcd/tft/images/cancel_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/chamber_64x64x4.cpp | 161 +++++ Marlin/src/lcd/tft/images/confirm_64x64x4.cpp | 94 +++ .../src/lcd/tft/images/decrease_64x64x4.cpp | 94 +++ .../src/lcd/tft/images/directory_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/down_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/fan_64x64x4.cpp | 161 +++++ .../src/lcd/tft/images/fan_fast_64x64x4.cpp | 161 +++++ .../src/lcd/tft/images/fan_slow_64x64x4.cpp | 161 +++++ .../src/lcd/tft/images/feedrate_32x32x4.cpp | 62 ++ .../src/lcd/tft/images/flowrate_32x32x4.cpp | 62 ++ .../src/lcd/tft/images/heated_bed_64x64x4.cpp | 161 +++++ Marlin/src/lcd/tft/images/hotend_64x64x4.cpp | 94 +++ .../src/lcd/tft/images/increase_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/left_32x32x4.cpp | 62 ++ .../src/lcd/tft/images/leveling_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/menu_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/pause_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/refresh_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/right_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/sd_64x64x4.cpp | 94 +++ .../src/lcd/tft/images/settings_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/slider_8x16x4.cpp | 46 ++ Marlin/src/lcd/tft/images/up_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/r65105.h | 155 +++++ Marlin/src/lcd/tft/st7735.h | 128 ++++ Marlin/src/lcd/tft/st7789v.h | 148 ++++ Marlin/src/lcd/tft/st7796s.h | 175 +++++ Marlin/src/lcd/tft/tft.cpp | 199 ++++++ Marlin/src/lcd/tft/tft.h | 113 +++ Marlin/src/lcd/tft/tft_color.h | 112 +++ Marlin/src/lcd/tft/tft_image.cpp | 69 ++ Marlin/src/lcd/tft/tft_image.h | 160 +++++ Marlin/src/lcd/tft/tft_io.h | 30 + Marlin/src/lcd/tft/tft_queue.cpp | 346 +++++++++ Marlin/src/lcd/tft/tft_queue.h | 140 ++++ Marlin/src/lcd/tft/tft_string.cpp | 159 +++++ Marlin/src/lcd/tft/tft_string.h | 104 +++ Marlin/src/lcd/tft/touch.cpp | 293 ++++++++ Marlin/src/lcd/tft/touch.h | 180 +++++ Marlin/src/lcd/tft/ui_320x240.cpp | 653 +++++++++++++++++ Marlin/src/lcd/tft/ui_320x240.h | 106 +++ Marlin/src/lcd/tft/ui_480x320.cpp | 657 ++++++++++++++++++ Marlin/src/lcd/tft/ui_480x320.h | 106 +++ Marlin/src/lcd/ultralcd.cpp | 20 +- Marlin/src/lcd/ultralcd.h | 25 +- Marlin/src/module/configuration_store.cpp | 31 + Marlin/src/pins/pins.h | 8 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 2 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 66 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 2 +- buildroot/bin/opt_add | 2 +- buildroot/bin/use_example_configs | 15 +- .../share/PlatformIO/scripts/mks_encrypt.py | 32 + .../variants/CHITU_F103/wirish/boards.cpp | 2 +- .../variants/MARLIN_F103Vx/PeripheralPins.c | 425 +++++++++++ .../variants/MARLIN_F103Vx/PinNamesVar.h | 30 + .../variants/MARLIN_F103Vx/ldscript.ld | 200 ++++++ .../variants/MARLIN_F103Vx/variant.cpp | 235 +++++++ .../variants/MARLIN_F103Vx/variant.h | 181 +++++ .../variants/MARLIN_F103Zx/PeripheralPins.c | 368 ++++++++++ .../variants/MARLIN_F103Zx/PinNamesVar.h | 30 + .../variants/MARLIN_F103Zx/hal_conf_custom.h | 412 +++++++++++ .../variants/MARLIN_F103Zx/ldscript.ld | 200 ++++++ .../variants/MARLIN_F103Zx/variant.cpp | 222 ++++++ .../variants/MARLIN_F103Zx/variant.h | 232 +++++++ buildroot/tests/mks_robin-tests | 7 +- buildroot/tests/mks_robin_mini-tests | 5 +- buildroot/tests/mks_robin_nano-tests | 5 +- buildroot/tests/mks_robin_stm32-tests | 13 + platformio.ini | 25 +- 176 files changed, 14747 insertions(+), 303 deletions(-) create mode 100644 Marlin/src/HAL/STM32/tft/tft_fsmc.cpp create mode 100644 Marlin/src/HAL/STM32/tft/tft_fsmc.h create mode 100644 Marlin/src/HAL/STM32/tft/tft_spi.cpp create mode 100644 Marlin/src/HAL/STM32/tft/tft_spi.h create mode 100644 Marlin/src/HAL/STM32/tft/xpt2046.cpp create mode 100644 Marlin/src/HAL/STM32/tft/xpt2046.h create mode 100644 Marlin/src/gcode/lcd/M995.cpp create mode 100644 Marlin/src/lcd/menu/menu_touch_screen.cpp create mode 100644 Marlin/src/lcd/tft/bitmaps/back.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/bed.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/bed_heated.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/cancel.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/chamber.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/confirm.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/decrease.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/directory.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/down.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan0.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan1.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/feedrate.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/flowrate.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/hotend.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/increase.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/left.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/leveling.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-195x59.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-280x200.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x320.png create mode 100644 Marlin/src/lcd/tft/bitmaps/menu.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/pause.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/refresh.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/right.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/sd.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/settings.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/up.bmp create mode 100644 Marlin/src/lcd/tft/canvas.cpp create mode 100644 Marlin/src/lcd/tft/canvas.h create mode 100644 Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/helvetica_14.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/helvetica_18.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/profont_22.cpp create mode 100644 Marlin/src/lcd/tft/ili9328.h create mode 100644 Marlin/src/lcd/tft/ili9341.h create mode 100644 Marlin/src/lcd/tft/ili9488.h create mode 100644 Marlin/src/lcd/tft/images/back_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/background_320x30x16.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp create mode 100644 Marlin/src/lcd/tft/images/cancel_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/chamber_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/confirm_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/decrease_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/directory_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/down_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/fan_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/hotend_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/increase_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/left_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/leveling_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/menu_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/pause_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/refresh_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/right_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/sd_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/settings_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/slider_8x16x4.cpp create mode 100644 Marlin/src/lcd/tft/images/up_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/r65105.h create mode 100644 Marlin/src/lcd/tft/st7735.h create mode 100644 Marlin/src/lcd/tft/st7789v.h create mode 100644 Marlin/src/lcd/tft/st7796s.h create mode 100644 Marlin/src/lcd/tft/tft.cpp create mode 100644 Marlin/src/lcd/tft/tft.h create mode 100644 Marlin/src/lcd/tft/tft_color.h create mode 100644 Marlin/src/lcd/tft/tft_image.cpp create mode 100644 Marlin/src/lcd/tft/tft_image.h create mode 100644 Marlin/src/lcd/tft/tft_io.h create mode 100644 Marlin/src/lcd/tft/tft_queue.cpp create mode 100644 Marlin/src/lcd/tft/tft_queue.h create mode 100644 Marlin/src/lcd/tft/tft_string.cpp create mode 100644 Marlin/src/lcd/tft/tft_string.h create mode 100644 Marlin/src/lcd/tft/touch.cpp create mode 100644 Marlin/src/lcd/tft/touch.h create mode 100644 Marlin/src/lcd/tft/ui_320x240.cpp create mode 100644 Marlin/src/lcd/tft/ui_320x240.h create mode 100644 Marlin/src/lcd/tft/ui_480x320.cpp create mode 100644 Marlin/src/lcd/tft/ui_480x320.h create mode 100644 buildroot/share/PlatformIO/scripts/mks_encrypt.py create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h create mode 100644 buildroot/tests/mks_robin_stm32-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 4dd483499b..bcc42fbd60 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -67,6 +67,7 @@ jobs: - BIGTREE_SKR_PRO - BIGTREE_GTR_V1_0 - mks_robin + - mks_robin_stm32 - ARMED - FYSETC_S6 - STM32F070RB_malyan diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c6ec607d9b..363ea2f351 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2150,6 +2150,22 @@ //=============================== Graphical TFTs ============================== //============================================================================= +// +// TFT display with optional touch screen +// Color Marlin UI with standard menu system +// +//#define TFT_320x240 +//#define TFT_320x240_SPI +//#define TFT_480x320 +//#define TFT_480x320_SPI + +// +// Skip autodetect and force specific TFT driver +// Mandatory for SPI screens with no MISO line +// Available drivers are: ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488 +// +//#define TFT_DRIVER AUTO + // // FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) // Upscaled 128x64 Marlin UI @@ -2190,11 +2206,13 @@ // // ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8 // -//#define TOUCH_BUTTONS -#if ENABLED(TOUCH_BUTTONS) +//#define TOUCH_SCREEN +#if ENABLED(TOUCH_SCREEN) #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus + #define TOUCH_SCREEN_CALIBRATION + //#define XPT2046_X_CALIBRATION 12316 //#define XPT2046_Y_CALIBRATION -8981 //#define XPT2046_X_OFFSET -43 diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h index 5f1c4b1601..a611ccd7c4 100644 --- a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/AVR." +#endif diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h index 5f1c4b1601..5867414447 100644 --- a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/DUE." +#endif diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h index 5f1c4b1601..4da600179d 100644 --- a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/ESP32." +#endif diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h index 5f1c4b1601..99a6fc2753 100644 --- a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/LINUX." +#endif diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h index 5f1c4b1601..7d4de40faa 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/LPC1768." +#endif diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h index 5f1c4b1601..932348c52f 100644 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/SAMD51." +#endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 730ada96c1..08081331b7 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -213,5 +213,10 @@ uint16_t HAL_adc_get_result(); #define GET_PIN_MAP_INDEX(pin) pin #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) +#ifdef STM32F1xx + #define JTAG_DISABLE() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_JTAGDISABLE) + #define JTAGSWD_DISABLE() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_DISABLE) +#endif + #define PLATFORM_M997_SUPPORT void flashFirmware(const int16_t); diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index 9d32b342e4..6e73e87c21 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -76,7 +76,24 @@ SD_HandleTypeDef hsd; // create SDIO structure - #define TRANSFER_CLOCK_DIV (uint8_t(SDIO_INIT_CLK_DIV) / 40) + /* + SDIO_INIT_CLK_DIV is 118 + SDIO clock frequency is 48MHz / (TRANSFER_CLOCK_DIV + 2) + SDIO init clock frequency should not exceed 400KHz = 48MHz / (118 + 2) + + Default TRANSFER_CLOCK_DIV is 2 (118 / 40) + Default SDIO clock frequency is 48MHz / (2 + 2) = 12 MHz + This might be too fast for stable SDIO operations + + MKS Robin board seems to have stable SDIO with BusWide 1bit and ClockDiv 8 i.e. 4.8MHz SDIO clock frequency + Additional testing is required as there are clearly some 4bit initialization problems + + Add -DTRANSFER_CLOCK_DIV=8 to build parameters to improve SDIO stability + */ + + #ifndef TRANSFER_CLOCK_DIV + #define TRANSFER_CLOCK_DIV (uint8_t(SDIO_INIT_CLK_DIV) / 40) + #endif #ifndef USBD_OK #define USBD_OK 0 @@ -100,24 +117,25 @@ void SD_LowLevel_Init(void) { uint32_t tempreg; - GPIO_InitTypeDef GPIO_InitStruct; - + __HAL_RCC_SDIO_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); //enable GPIO clocks __HAL_RCC_GPIOD_CLK_ENABLE(); //enable GPIO clocks - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_12; // D0 & SCK + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = 1; //GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + + #if DISABLED(STM32F1xx) + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + #endif + + GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_12; // D0 & SCK HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); #if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // define D1-D3 only if have a four bit wide SDIO bus GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11; // D1-D3 - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = 1; // GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); #endif @@ -125,10 +143,13 @@ GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset - RCC->APB2ENR |= RCC_APB2RSTR_SDIORST_Msk; // enable SDIO clock - // Enable the DMA2 Clock + #if DISABLED(STM32F1xx) + // TODO: use __HAL_RCC_SDIO_RELEASE_RESET() and __HAL_RCC_SDIO_CLK_ENABLE(); + RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset + RCC->APB2ENR |= RCC_APB2RSTR_SDIORST_Msk; // enable SDIO clock + // Enable the DMA2 Clock + #endif //Initialize the SDIO (with initial <400Khz Clock) tempreg = 0; //Reset value @@ -156,10 +177,21 @@ bool status; hsd.Instance = SDIO; hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET + + /* + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 8; + */ + SD_LowLevel_Init(); uint8_t retry_Cnt = retryCnt; for (;;) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); status = (bool) HAL_SD_Init(&hsd); if (!status) break; if (!--retry_Cnt) return false; // return failing status if retries are exhausted @@ -170,6 +202,7 @@ #if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // go to 4 bit wide mode if pins are defined retry_Cnt = retryCnt; for (;;) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); if (!HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)) break; // some cards are only 1 bit wide so a pass here is not required if (!--retry_Cnt) break; } @@ -178,6 +211,7 @@ SD_LowLevel_Init(); retry_Cnt = retryCnt; for (;;) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); status = (bool) HAL_SD_Init(&hsd); if (!status) break; if (!--retry_Cnt) return false; // return failing status if retries are exhausted @@ -187,15 +221,15 @@ return true; } - + /* void init_SDIO_pins(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - /**SDIO GPIO Configuration - PC8 ------> SDIO_D0 - PC12 ------> SDIO_CK - PD2 ------> SDIO_CMD - */ + // SDIO GPIO Configuration + // PC8 ------> SDIO_D0 + // PC12 ------> SDIO_CK + // PD2 ------> SDIO_CMD + GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; @@ -217,7 +251,7 @@ GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); } - + */ //bool SDIO_init() { return (bool) (SD_SDIO_Init() ? 1 : 0);} //bool SDIO_Init_C() { return (bool) (SD_SDIO_Init() ? 1 : 0);} @@ -227,6 +261,7 @@ bool status; for (;;) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); status = (bool) HAL_SD_ReadBlocks(&hsd, (uint8_t*)dst, block, 1, 1000); // read one 512 byte block with 500mS timeout status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK if (!status) break; // return passing status diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp new file mode 100644 index 0000000000..f11fab39db --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_FSMC_TFT + +#include "tft_fsmc.h" +#include "pinconfig.h" + +SRAM_HandleTypeDef TFT_FSMC::SRAMx; +DMA_HandleTypeDef TFT_FSMC::DMAtx; +LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD; + +void TFT_FSMC::Init() { + uint32_t controllerAddress; + + #if PIN_EXISTS(TFT_RESET) + OUT_WRITE(TFT_RESET_PIN, HIGH); + HAL_Delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif + + FSMC_NORSRAM_TimingTypeDef Timing, ExtTiming; + + uint32_t NSBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); + + SRAMx.Instance = FSMC_NORSRAM_DEVICE; + SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE; + /* SRAMx.Init */ + SRAMx.Init.NSBank = NSBank; + SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; + SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; + SRAMx.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; + SRAMx.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; + SRAMx.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; + SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE; + SRAMx.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; + SRAMx.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; + SRAMx.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; + SRAMx.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE; + SRAMx.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; + SRAMx.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; + #ifdef STM32F4xx + SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE; + #endif + /* Read Timing - relatively slow to ensure ID information is correctly read from TFT controller */ + /* Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss */ + Timing.AddressSetupTime = 15; + Timing.AddressHoldTime = 15; + Timing.DataSetupTime = 24; + Timing.BusTurnAroundDuration = 0; + Timing.CLKDivision = 16; + Timing.DataLatency = 17; + Timing.AccessMode = FSMC_ACCESS_MODE_A; + /* Write Timing */ + /* Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss */ + ExtTiming.AddressSetupTime = 8; + ExtTiming.AddressHoldTime = 15; + ExtTiming.DataSetupTime = 8; + ExtTiming.BusTurnAroundDuration = 0; + ExtTiming.CLKDivision = 16; + ExtTiming.DataLatency = 17; + ExtTiming.AccessMode = FSMC_ACCESS_MODE_A; + + __HAL_RCC_FSMC_CLK_ENABLE(); + + for(uint16_t i = 0; PinMap_FSMC[i].pin != NC; i++) + pinmap_pinout(PinMap_FSMC[i].pin, PinMap_FSMC); + pinmap_pinout(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); + pinmap_pinout(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); + + controllerAddress = FSMC_BANK1_1; + #ifdef PF0 + switch (NSBank) { + case FSMC_NORSRAM_BANK2: controllerAddress = FSMC_BANK1_2 ; break; + case FSMC_NORSRAM_BANK3: controllerAddress = FSMC_BANK1_3 ; break; + case FSMC_NORSRAM_BANK4: controllerAddress = FSMC_BANK1_4 ; break; + } + #endif + + controllerAddress |= (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); + + HAL_SRAM_Init(&SRAMx, &Timing, &ExtTiming); + + __HAL_RCC_DMA2_CLK_ENABLE(); + + #ifdef STM32F1xx + DMAtx.Instance = DMA2_Channel1; + #elif defined(STM32F4xx) + DMAtx.Instance = DMA2_Stream0; + DMAtx.Init.Channel = DMA_CHANNEL_0; + DMAtx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + DMAtx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + DMAtx.Init.MemBurst = DMA_MBURST_SINGLE; + DMAtx.Init.PeriphBurst = DMA_PBURST_SINGLE; + #endif + + DMAtx.Init.Direction = DMA_MEMORY_TO_MEMORY; + DMAtx.Init.MemInc = DMA_MINC_DISABLE; + DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + DMAtx.Init.Mode = DMA_NORMAL; + DMAtx.Init.Priority = DMA_PRIORITY_HIGH; + + LCD = (LCD_CONTROLLER_TypeDef *)controllerAddress; +} + +uint32_t TFT_FSMC::GetID() { + uint32_t id; + WriteReg(0x0000); + id = LCD->RAM; + + if (id == 0) + id = ReadID(LCD_READ_ID); + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + + uint32_t TFT_FSMC::ReadID(uint16_t Reg) { + uint32_t id; + WriteReg(Reg); + id = LCD->RAM; // dummy read + id = Reg << 24; + id |= (LCD->RAM & 0x00FF) << 16; + id |= (LCD->RAM & 0x00FF) << 8; + id |= LCD->RAM & 0x00FF; + return id; + } + +bool TFT_FSMC::isBusy() { + if (__IS_DMA_ENABLED(&DMAtx)) + if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) + Abort(); + return __IS_DMA_ENABLED(&DMAtx); +} + +void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + DMAtx.Init.PeriphInc = MemoryIncrease; + HAL_DMA_Init(&DMAtx); + + __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)); + __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)); + + #ifdef STM32F1xx + DMAtx.Instance->CNDTR = Count; + DMAtx.Instance->CPAR = (uint32_t)Data; + DMAtx.Instance->CMAR = (uint32_t)&(LCD->RAM); + #elif defined(STM32F4xx) + DMAtx.Instance->NDTR = Count; + DMAtx.Instance->PAR = (uint32_t)Data; + DMAtx.Instance->M0AR = (uint32_t)&(LCD->RAM); + #endif + __HAL_DMA_ENABLE(&DMAtx); +} + +#endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h new file mode 100644 index 0000000000..8500fee113 --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef STM32F1xx + #include "stm32f1xx_hal.h" +#elif defined(STM32F4xx) + #include "stm32f4xx_hal.h" +#else + #error FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware. +#endif + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#define DATASIZE_8BIT SPI_DATASIZE_8BIT +#define DATASIZE_16BIT SPI_DATASIZE_16BIT +#define TFT_IO TFT_FSMC + +#ifdef STM32F1xx + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) +#elif defined(STM32F4xx) + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) +#endif + +typedef struct { + __IO uint16_t REG; + __IO uint16_t RAM; +} LCD_CONTROLLER_TypeDef; + +class TFT_FSMC { + private: + static SRAM_HandleTypeDef SRAMx; + static DMA_HandleTypeDef DMAtx; + + static LCD_CONTROLLER_TypeDef *LCD; + + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data) { LCD->RAM = Data; __DSB(); } + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + + public: + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort() { __HAL_DMA_DISABLE(&DMAtx); } + + static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {} + static void DataTransferEnd() {}; + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg) { LCD->REG = Reg; __DSB(); } + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } +}; + + +#ifdef STM32F1xx + #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE) +#elif defined(STM32F4xx) + #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FSMC) + #define FSMC_BANK1_1 0x60000000U + #define FSMC_BANK1_2 0x64000000U + #define FSMC_BANK1_3 0x68000000U + #define FSMC_BANK1_4 0x6C000000U +#else + #error No configuration for this MCU +#endif + +const PinMap PinMap_FSMC[] = { + {PD_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D00 + {PD_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D01 + {PD_0, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D02 + {PD_1, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D03 + {PE_7, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D04 + {PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05 + {PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06 + {PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07 + {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08 + {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09 + {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10 + {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11 + {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12 + {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13 + {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14 + {PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15 + {PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE + {PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE + {NC, NP, 0} +}; + +const PinMap PinMap_FSMC_CS[] = { + {PD_7, (void *)FSMC_NORSRAM_BANK1, FSMC_PIN_DATA}, // FSMC_NE1 + #ifdef PF0 + {PG_9, (void *)FSMC_NORSRAM_BANK2, FSMC_PIN_DATA}, // FSMC_NE2 + {PG_10, (void *)FSMC_NORSRAM_BANK3, FSMC_PIN_DATA}, // FSMC_NE3 + {PG_12, (void *)FSMC_NORSRAM_BANK4, FSMC_PIN_DATA}, // FSMC_NE4 + #endif + {NC, NP, 0} +}; + +#define FSMC_RS(A) (void *)((2 << A) - 2) + +const PinMap PinMap_FSMC_RS[] = { + #ifdef PF0 + {PF_0, FSMC_RS( 0), FSMC_PIN_DATA}, // FSMC_A0 + {PF_1, FSMC_RS( 1), FSMC_PIN_DATA}, // FSMC_A1 + {PF_2, FSMC_RS( 2), FSMC_PIN_DATA}, // FSMC_A2 + {PF_3, FSMC_RS( 3), FSMC_PIN_DATA}, // FSMC_A3 + {PF_4, FSMC_RS( 4), FSMC_PIN_DATA}, // FSMC_A4 + {PF_5, FSMC_RS( 5), FSMC_PIN_DATA}, // FSMC_A5 + {PF_12, FSMC_RS( 6), FSMC_PIN_DATA}, // FSMC_A6 + {PF_13, FSMC_RS( 7), FSMC_PIN_DATA}, // FSMC_A7 + {PF_14, FSMC_RS( 8), FSMC_PIN_DATA}, // FSMC_A8 + {PF_15, FSMC_RS( 9), FSMC_PIN_DATA}, // FSMC_A9 + {PG_0, FSMC_RS(10), FSMC_PIN_DATA}, // FSMC_A10 + {PG_1, FSMC_RS(11), FSMC_PIN_DATA}, // FSMC_A11 + {PG_2, FSMC_RS(12), FSMC_PIN_DATA}, // FSMC_A12 + {PG_3, FSMC_RS(13), FSMC_PIN_DATA}, // FSMC_A13 + {PG_4, FSMC_RS(14), FSMC_PIN_DATA}, // FSMC_A14 + {PG_5, FSMC_RS(15), FSMC_PIN_DATA}, // FSMC_A15 + #endif + {PD_11, FSMC_RS(16), FSMC_PIN_DATA}, // FSMC_A16 + {PD_12, FSMC_RS(17), FSMC_PIN_DATA}, // FSMC_A17 + {PD_13, FSMC_RS(18), FSMC_PIN_DATA}, // FSMC_A18 + {PE_3, FSMC_RS(19), FSMC_PIN_DATA}, // FSMC_A19 + {PE_4, FSMC_RS(20), FSMC_PIN_DATA}, // FSMC_A20 + {PE_5, FSMC_RS(21), FSMC_PIN_DATA}, // FSMC_A21 + {PE_6, FSMC_RS(22), FSMC_PIN_DATA}, // FSMC_A22 + {PE_2, FSMC_RS(23), FSMC_PIN_DATA}, // FSMC_A23 + #ifdef PF0 + {PG_13, FSMC_RS(24), FSMC_PIN_DATA}, // FSMC_A24 + {PG_14, FSMC_RS(25), FSMC_PIN_DATA}, // FSMC_A25 + #endif + {NC, NP, 0} +}; diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp new file mode 100644 index 0000000000..d3eb4ba8db --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -0,0 +1,212 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT + +#include "tft_spi.h" +#include "pinconfig.h" + +SPI_HandleTypeDef TFT_SPI::SPIx; +DMA_HandleTypeDef TFT_SPI::DMAtx; + +void TFT_SPI::Init() { + SPI_TypeDef *spiInstance; + + #if PIN_EXISTS(TFT_RESET) + OUT_WRITE(TFT_RESET_PIN, HIGH); + HAL_Delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif + + OUT_WRITE(TFT_A0_PIN, HIGH); + OUT_WRITE(TFT_CS_PIN, HIGH); + + if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return; + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI)) return; + + #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN) + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return; + #endif + + SPIx.Instance = spiInstance; + SPIx.State = HAL_SPI_STATE_RESET; + SPIx.Init.NSS = SPI_NSS_SOFT; + SPIx.Init.Mode = SPI_MODE_MASTER; + SPIx.Init.Direction = + #if TFT_MISO_PIN == TFT_MOSI_PIN + SPI_DIRECTION_1LINE; + #else + SPI_DIRECTION_2LINES; + #endif + SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + SPIx.Init.CLKPhase = SPI_PHASE_1EDGE; + SPIx.Init.CLKPolarity = SPI_POLARITY_LOW; + SPIx.Init.DataSize = SPI_DATASIZE_8BIT; + SPIx.Init.FirstBit = SPI_FIRSTBIT_MSB; + SPIx.Init.TIMode = SPI_TIMODE_DISABLE; + SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPIx.Init.CRCPolynomial = 10; + + pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK); + pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI); + #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN) + pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO); + #endif + pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN); + + #ifdef SPI1_BASE + if (SPIx.Instance == SPI1) { + __HAL_RCC_SPI1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; + DMAtx.Instance = DMA1_Channel3; + } + #endif + #ifdef SPI2_BASE + if (SPIx.Instance == SPI2) { + __HAL_RCC_SPI2_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + DMAtx.Instance = DMA1_Channel5; + } + #endif + #ifdef SPI3_BASE + if (SPIx.Instance == SPI3) { + __HAL_RCC_SPI3_CLK_ENABLE(); + __HAL_RCC_DMA2_CLK_ENABLE(); + DMAtx.Instance = DMA2_Channel2; + } + #endif + + HAL_SPI_Init(&SPIx); + + DMAtx.Init.Direction = DMA_MEMORY_TO_PERIPH; + DMAtx.Init.PeriphInc = DMA_PINC_DISABLE; + DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + DMAtx.Init.Mode = DMA_NORMAL; + DMAtx.Init.Priority = DMA_PRIORITY_LOW; +} + +void TFT_SPI::DataTransferBegin(uint16_t DataSize) { + SPIx.Init.DataSize = DataSize == DATASIZE_8BIT ? SPI_DATASIZE_8BIT : SPI_DATASIZE_16BIT; + HAL_SPI_Init(&SPIx); + WRITE(TFT_CS_PIN, LOW); +} + +uint32_t TFT_SPI::GetID() { + uint32_t id; + id = ReadID(LCD_READ_ID); + + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + +uint32_t TFT_SPI::ReadID(uint16_t Reg) { + #if !PIN_EXISTS(TFT_MISO) + return 0; + #else + uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler; + uint32_t i, Data = 0; + + SPIx.Init.BaudRatePrescaler = SPIx.Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4; + DataTransferBegin(DATASIZE_8BIT); + WriteReg(Reg); + + if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_RX(&SPIx); + __HAL_SPI_ENABLE(&SPIx); + + for (i = 0; i < 4; i++) { + #if TFT_MISO_PIN != TFT_MOSI_PIN + //if (hspi->Init.Direction == SPI_DIRECTION_2LINES) { + while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} + SPIx.Instance->DR = 0; + //} + #endif + while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} + Data = (Data << 8) | SPIx.Instance->DR; + } + + __HAL_SPI_DISABLE(&SPIx); + DataTransferEnd(); + + SPIx.Init.BaudRatePrescaler = BaudRatePrescaler; + + return Data >> 7; + #endif +} + +bool TFT_SPI::isBusy() { + if (DMAtx.Instance->CCR & DMA_CCR_EN) + if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) + Abort(); + return DMAtx.Instance->CCR & DMA_CCR_EN; +} + +void TFT_SPI::Abort() { + __HAL_DMA_DISABLE(&DMAtx); + DataTransferEnd(); +} + +void TFT_SPI::Transmit(uint16_t Data) { + #if TFT_MISO_PIN == TFT_MOSI_PIN + SPI_1LINE_TX(&SPIx); + #endif + + __HAL_SPI_ENABLE(&SPIx); + + SPIx.Instance->DR = Data; + + while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} + while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {} + + #if TFT_MISO_PIN != TFT_MOSI_PIN + __HAL_SPI_CLEAR_OVRFLAG(&SPIx); /* Clear overrun flag in 2 Lines communication mode because received is not read */ + #endif +} + +void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + DMAtx.Init.MemInc = MemoryIncrease; + HAL_DMA_Init(&DMAtx); + + DataTransferBegin(); + + #if TFT_MISO_PIN == TFT_MOSI_PIN + SPI_1LINE_TX(&SPIx); + #endif + + DMAtx.DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << DMAtx.ChannelIndex); + DMAtx.Instance->CNDTR = Count; + DMAtx.Instance->CPAR = (uint32_t)&(SPIx.Instance->DR); + DMAtx.Instance->CMAR = (uint32_t)Data; + __HAL_DMA_ENABLE(&DMAtx); + __HAL_SPI_ENABLE(&SPIx); + + SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ +} + +#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.h b/Marlin/src/HAL/STM32/tft/tft_spi.h new file mode 100644 index 0000000000..1eed45a709 --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_spi.h @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef STM32F1xx + #include "stm32f1xx_hal.h" +#elif defined(STM32F4xx) + #include "stm32f4xx_hal.h" +#else + #error SPI TFT is currently only supported on STM32F1 and STM32F4 hardware. +#endif + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#define DATASIZE_8BIT SPI_DATASIZE_8BIT +#define DATASIZE_16BIT SPI_DATASIZE_16BIT +#define TFT_IO TFT_SPI + +class TFT_SPI { +private: + static SPI_HandleTypeDef SPIx; + static DMA_HandleTypeDef DMAtx; + + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + +public: + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort(); + + static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT); + static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); }; + static void DataTransferAbort(); + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg) { WRITE(TFT_A0_PIN, LOW); Transmit(Reg); WRITE(TFT_A0_PIN, HIGH); } + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } +}; diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp new file mode 100644 index 0000000000..49e64da6a1 --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp @@ -0,0 +1,185 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TFT_XPT2046 + +#include "xpt2046.h" +#include "pinconfig.h" + +uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } + +SPI_HandleTypeDef XPT2046::SPIx; +DMA_HandleTypeDef XPT2046::DMAtx; + +void XPT2046::Init() { + SPI_TypeDef *spiInstance; + + OUT_WRITE(TOUCH_CS_PIN, HIGH); + + #if PIN_EXISTS(TOUCH_INT) + // Optional Pendrive interrupt pin + SET_INPUT(TOUCH_INT_PIN); + #endif + + spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_SCK_PIN), PinMap_SPI_SCLK); + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_MOSI_PIN), PinMap_SPI_MOSI)) spiInstance = NP; + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO)) spiInstance = NP; + + SPIx.Instance = spiInstance; + + if (SPIx.Instance) { + SPIx.State = HAL_SPI_STATE_RESET; + SPIx.Init.NSS = SPI_NSS_SOFT; + SPIx.Init.Mode = SPI_MODE_MASTER; + SPIx.Init.Direction = SPI_DIRECTION_2LINES; + SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; + SPIx.Init.CLKPhase = SPI_PHASE_2EDGE; + SPIx.Init.CLKPolarity = SPI_POLARITY_HIGH; + SPIx.Init.DataSize = SPI_DATASIZE_8BIT; + SPIx.Init.FirstBit = SPI_FIRSTBIT_MSB; + SPIx.Init.TIMode = SPI_TIMODE_DISABLE; + SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPIx.Init.CRCPolynomial = 10; + + pinmap_pinout(digitalPinToPinName(TOUCH_SCK_PIN), PinMap_SPI_SCLK); + pinmap_pinout(digitalPinToPinName(TOUCH_MOSI_PIN), PinMap_SPI_MOSI); + pinmap_pinout(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO); + + #ifdef SPI1_BASE + if (SPIx.Instance == SPI1) { + __HAL_RCC_SPI1_CLK_ENABLE(); + SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + #ifdef STM32F1xx + DMAtx.Instance = DMA1_Channel3; + #elif defined(STM32F4xx) + DMAtx.Instance = DMA2_Stream3; // DMA2_Stream5 + #endif + //SERIAL_ECHO_MSG(" Touch Screen on SPI1"); + } + #endif + #ifdef SPI2_BASE + if (SPIx.Instance == SPI2) { + __HAL_RCC_SPI2_CLK_ENABLE(); + #ifdef STM32F1xx + DMAtx.Instance = DMA1_Channel5; + #elif defined(STM32F4xx) + DMAtx.Instance = DMA1_Stream4; + #endif + //SERIAL_ECHO_MSG(" Touch Screen on SPI2"); + } + #endif + #ifdef SPI3_BASE + if (SPIx.Instance == SPI3) { + __HAL_RCC_SPI3_CLK_ENABLE(); + #ifdef STM32F1xx + DMAtx.Instance = DMA2_Channel2; + #elif defined(STM32F4xx) + DMAtx.Instance = DMA1_Stream5; // DMA1_Stream7 + #endif + //SERIAL_ECHO_MSG(" Touch Screen on SPI3"); + } + #endif + } + else { + SPIx.Instance = NULL; + SET_INPUT(TOUCH_MISO_PIN); + SET_OUTPUT(TOUCH_MOSI_PIN); + SET_OUTPUT(TOUCH_SCK_PIN); + //SERIAL_ECHO_MSG(" Touch Screen on Software SPI"); + } + + getRawData(XPT2046_Z1); +} + +bool XPT2046::isTouched() { + return isBusy() ? false : ( + #if PIN_EXISTS(TOUCH_INT) + READ(TOUCH_INT_PIN) != HIGH + #else + getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD + #endif + ); +} + +bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { + if (isBusy()) return false; + if (!isTouched()) return false; + *x = getRawData(XPT2046_X); + *y = getRawData(XPT2046_Y); + return isTouched(); +} + +uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { + uint16_t data[3]; + + DataTransferBegin(); + + for (uint16_t i = 0; i < 3 ; i++) { + IO(coordinate); + data[i] = (IO() << 4) | (IO() >> 4); + } + + DataTransferEnd(); + + uint16_t delta01 = delta(data[0], data[1]); + uint16_t delta02 = delta(data[0], data[2]); + uint16_t delta12 = delta(data[1], data[2]); + + if (delta01 > delta02 || delta01 > delta12) { + if (delta02 > delta12) + data[0] = data[2]; + else + data[1] = data[2]; + } + + return (data[0] + data[1]) >> 1; +} + +uint16_t XPT2046::HardwareIO(uint16_t data) { + __HAL_SPI_ENABLE(&SPIx); + while((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} + SPIx.Instance->DR = data; + while((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} + __HAL_SPI_DISABLE(&SPIx); + + return SPIx.Instance->DR; +} + +uint16_t XPT2046::SoftwareIO(uint16_t data) { + uint16_t result = 0; + + for (uint8_t j = 0x80; j > 0; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + __DSB(); + WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); + __DSB(); + if (READ(TOUCH_MISO_PIN)) result |= j; + __DSB(); + WRITE(TOUCH_SCK_PIN, HIGH); + __DSB(); + } + WRITE(TOUCH_SCK_PIN, LOW); + __DSB(); + + return result; +} + +#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h new file mode 100644 index 0000000000..7a6d8439c5 --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/xpt2046.h @@ -0,0 +1,86 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef STM32F1xx + #include +#elif defined(STM32F4xx) + #include +#endif + +#include "../../../inc/MarlinConfig.h" + +// Not using regular SPI interface by default to avoid SPI mode conflicts with other SPI devices + +#if !PIN_EXISTS(TOUCH_MISO) + #error "TOUCH_MISO_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_MOSI) + #error "TOUCH_MOSI_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_SCK) + #error "TOUCH_SCK_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_CS) + #error "TOUCH_CS_PIN is not defined." +#endif + +#ifndef TOUCH_INT_PIN + #define TOUCH_INT_PIN -1 +#endif + +#define XPT2046_DFR_MODE 0x00 +#define XPT2046_SER_MODE 0x04 +#define XPT2046_CONTROL 0x80 + +enum XPTCoordinate : uint8_t { + XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, +}; + +#if !defined(XPT2046_Z1_THRESHOLD) + #define XPT2046_Z1_THRESHOLD 10 +#endif + +#ifdef STM32F1xx + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) +#elif defined(STM32F4xx) + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) +#endif + + +class XPT2046 { +private: + static SPI_HandleTypeDef SPIx; + static DMA_HandleTypeDef DMAtx; + + static bool isBusy() { return SPIx.Instance ? __IS_DMA_ENABLED(&DMAtx) : false; } + + static uint16_t getRawData(const XPTCoordinate coordinate); + static bool isTouched(); + + static inline void DataTransferBegin() { if (SPIx.Instance) { HAL_SPI_Init(&SPIx); } WRITE(TOUCH_CS_PIN, LOW); }; + static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + static uint16_t HardwareIO(uint16_t data); + static uint16_t SoftwareIO(uint16_t data); + static uint16_t IO(uint16_t data = 0) { return SPIx.Instance ? HardwareIO(data) : SoftwareIO(data); } + +public: + static void Init(); + static bool getRawPoint(int16_t *x, int16_t *y); +}; diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp index 80095ba1dc..423772dbc9 100644 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -277,7 +277,7 @@ void SPIClass::read(uint8_t *buf, uint32_t len) { regs->DR = 0x00FF; // write the first byte // main loop while (--len) { - while(!(regs->SR & SPI_SR_TXE)) { /* nada */ } // wait for TXE flag + while (!(regs->SR & SPI_SR_TXE)) { /* nada */ } // wait for TXE flag noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. while (!(regs->SR & SPI_SR_RXNE)) { /* nada */ } // wait till data is available in the DR register diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index f52e6fec2b..14977381e1 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -25,3 +25,14 @@ //#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE." #undef SD_CHECK_AND_RETRY #endif + +#if HAS_GRAPHICAL_TFT + #error "Sorry! TFT displays are not available for HAL/STM32F1." +#endif + +// This platform has 'touch/xpt2046', not 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) + #undef TOUCH_SCREEN + #undef TOUCH_SCREEN_CALIBRATION + #define HAS_TOUCH_XPT2046 1 +#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h index 5f1c4b1601..a9f1b58222 100644 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/STM32F4_F7." +#endif diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h index 5f1c4b1601..54ec166643 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/TEENSY31_32." +#endif diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h index 5f1c4b1601..632ee533ac 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/TEENSY35_36." +#endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 00ea51b058..98f4527eee 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -80,7 +80,7 @@ #include "feature/direct_stepping.h" #endif -#if ENABLED(TOUCH_BUTTONS) +#if HAS_TOUCH_XPT2046 #include "feature/touch/xpt2046.h" #endif @@ -1006,7 +1006,7 @@ void setup() { SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults) // This also updates variables in the planner, elsewhere - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 SETUP_RUN(touch.init()); #endif diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 6e57a43747..eb33258e26 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -366,6 +366,11 @@ // #define BOARD_AGCM4_RAMPS_144 6100 // RAMPS 1.4.4 +// +// Custom board +// +#define BOARD_CUSTOM 9998 // Custom pins definition for development and/or rare boards + // // Simulations // diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index d613fbc89a..b75f3ee2f2 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -17,22 +17,21 @@ * */ -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(TOUCH_BUTTONS) - -#include "xpt2046.h" #include "../../inc/MarlinConfig.h" +#if HAS_TOUCH_XPT2046 + #if TFT_SCALED_DOGLCD #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. #endif +#include "xpt2046.h" + #ifndef XPT2046_Z1_THRESHOLD #define XPT2046_Z1_THRESHOLD 10 #endif -/* +/** * Draw and Touch processing * * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. @@ -245,4 +244,4 @@ bool XPT2046::getTouchPoint(uint16_t &x, uint16_t &y) { return isTouched(); } -#endif // TOUCH_BUTTONS +#endif // HAS_TOUCH_XPT2046 diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 438a619242..2399f207bf 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -405,7 +405,7 @@ inline bool turn_on_heaters() { inline bool prime_nozzle() { const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; - #if HAS_LCD_MENU && DISABLED(TOUCH_BUTTONS) // ui.button_pressed issue with touchscreen + #if HAS_LCD_MENU && !HAS_TOUCH_XPT2046 // ui.button_pressed issue with touchscreen #if ENABLED(PREVENT_LENGTHY_EXTRUDE) float Total_Prime = 0.0; #endif diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 7f00ec5a34..8d103d52b1 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -871,6 +871,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + case 995: M995(); break; // M995: Touch screen calibration for TFT display + #endif + #if ENABLED(PLATFORM_M997_SUPPORT) case 997: M997(); break; // M997: Perform in-application firmware update #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index b3f339e295..7c469458cd 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -276,6 +276,7 @@ * ************ Custom codes - This can change to suit future G-code regulations * G425 - Calibrate using a conductive object. (Requires CALIBRATION_GCODE) * M928 - Start SD logging: "M928 filename.gco". Stop with M29. (Requires SDSUPPORT) + * M995 - Touch screen calibration for TFT display * M997 - Perform in-application firmware update * M999 - Restart after being stopped by error * @@ -843,6 +844,8 @@ private: TERN_(MAGNETIC_PARKING_EXTRUDER, static void M951()); + TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); + TERN_(PLATFORM_M997_SUPPORT, static void M997()); static void M999(); diff --git a/Marlin/src/gcode/lcd/M995.cpp b/Marlin/src/gcode/lcd/M995.cpp new file mode 100644 index 0000000000..72d0d29f76 --- /dev/null +++ b/Marlin/src/gcode/lcd/M995.cpp @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + +#include "../gcode.h" +#include "../../lcd/menu/menu.h" + +/** + * M995: Touch screen calibration for TFT display + */ +void GcodeSuite::M995() { + + ui.goto_screen(touch_screen_calibration); + +} + +#endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 1605ced3c8..c309822f92 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -255,7 +255,7 @@ #define IS_ULTIPANEL #endif -// LVGL UI, SPI or FSMC +// FSMC/SPI TFT Panels (LVGL) #if EITHER(TFT_LVGL_UI_SPI, TFT_LVGL_UI_FSMC) #define HAS_TFT_LVGL_UI 1 #endif @@ -273,6 +273,27 @@ #define DELAYED_BACKLIGHT_INIT #endif +// FSMC/SPI TFT Panels (HAL STM32) +#if EITHER(TFT_320x240, TFT_480x320) + #define HAS_FSMC_TFT 1 +#elif EITHER(TFT_320x240_SPI, TFT_480x320_SPI) + #define HAS_SPI_TFT 1 +#endif + +#if HAS_FSMC_TFT || HAS_SPI_TFT + #define HAS_GRAPHICAL_TFT 1 + #define IS_ULTIPANEL +#endif + +// Fewer lines with touch buttons on-screen +#if EITHER(TFT_320x240, TFT_320x240_SPI) + #define HAS_UI_320x240 1 + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) +#elif EITHER(TFT_480x320, TFT_480x320_SPI) + #define HAS_UI_480x320 1 + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) +#endif + /** * I2C Panels */ @@ -329,7 +350,7 @@ #endif #ifndef STD_ENCODER_PULSES_PER_STEP - #if ENABLED(TOUCH_BUTTONS) + #if ENABLED(TOUCH_SCREEN) #define STD_ENCODER_PULSES_PER_STEP 2 #else #define STD_ENCODER_PULSES_PER_STEP 5 @@ -398,13 +419,14 @@ // Aliases for LCD features #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) #define HAS_DISPLAY 1 - #if ENABLED(ULTRA_LCD) - #define HAS_SPI_LCD 1 - #if ENABLED(DOGLCD) - #define HAS_GRAPHICAL_LCD 1 - #else - #define HAS_CHARACTER_LCD 1 - #endif +#endif + +#if ENABLED(ULTRA_LCD) + #define HAS_SPI_LCD 1 + #if ENABLED(DOGLCD) + #define HAS_GRAPHICAL_LCD 1 + #elif DISABLED(HAS_GRAPHICAL_TFT) + #define HAS_CHARACTER_LCD 1 #endif #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 85cb26dadb..7b35dc7755 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -251,6 +251,17 @@ #define EARLY_WATCHDOG 1 #endif +// Full Touch Screen needs 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) + #define HAS_TFT_XPT2046 1 +#endif + +// Touch Screen or "Touch Buttons" need XPT2046 pins +// but they use different components +#if EITHER(HAS_TFT_XPT2046, HAS_TOUCH_XPT2046) + #define NEED_TOUCH_PINS 1 +#endif + // Extensible UI pin mapping for RepRapDiscount #if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(AO_EXP1_PINMAP, AO_EXP2_PINMAP, CR10_TFT_PINMAP) #define TOUCH_UI_ULTIPANEL 1 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index c7171b06d8..b7f92fcb25 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -373,7 +373,7 @@ #endif -#if ANY(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) +#if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) #define NO_LCD_REINIT 1 // Suppress LCD re-initialization #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1db779b31e..03b869aa6e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -513,6 +513,8 @@ #error "[XYZ]_HOME_BUMP_MM is now HOMING_BUMP_MM. Please update Configuration_adv.h." #elif defined(DIGIPOT_I2C) #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." +#elif defined(TOUCH_BUTTONS) + #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." #endif #ifdef FIL_RUNOUT_INVERTING @@ -687,8 +689,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif PROGRESS_MSG_EXPIRE < 0 #error "PROGRESS_MSG_EXPIRE must be greater than or equal to 0." #endif -#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_GRAPHICAL_LCD, EXTENSIBLE_UI) - #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Graphical LCD, or EXTENSIBLE_UI." +#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_GRAPHICAL_LCD, HAS_GRAPHICAL_TFT, EXTENSIBLE_UI) + #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Graphical LCD, TFT, or EXTENSIBLE_UI." #endif #if !HAS_LCD_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE) @@ -2224,6 +2226,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(DGUS_LCD_UI_HIPRECY) \ + ENABLED(MALYAN_LCD) \ + ENABLED(TOUCH_UI_FTDI_EVE) \ + + ENABLED(TFT_320x240) \ + + ENABLED(TFT_320x240_SPI) \ + ENABLED(FSMC_GRAPHICAL_TFT) \ + ENABLED(TFT_LVGL_UI_FSMC) \ + ENABLED(TFT_LVGL_UI_SPI) @@ -3043,18 +3047,18 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) /** * Touch Buttons */ -#if ENABLED(TOUCH_BUTTONS) +#if ENABLED(TOUCH_SCREEN) #ifndef XPT2046_X_CALIBRATION - #error "XPT2046_X_CALIBRATION must be defined with TOUCH_BUTTONS." + #error "XPT2046_X_CALIBRATION must be defined with TOUCH_SCREEN." #endif #ifndef XPT2046_Y_CALIBRATION - #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_BUTTONS." + #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_SCREEN." #endif #ifndef XPT2046_X_OFFSET - #error "XPT2046_X_OFFSET must be defined with TOUCH_BUTTONS." + #error "XPT2046_X_OFFSET must be defined with TOUCH_SCREEN." #endif #ifndef XPT2046_Y_OFFSET - #error "XPT2046_Y_OFFSET must be defined with TOUCH_BUTTONS." + #error "XPT2046_Y_OFFSET must be defined with TOUCH_SCREEN." #endif #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 33cd5ecca6..d081541c5a 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -403,7 +403,7 @@ static const uint16_t st9677_init[] = { ESC_END }; -#if ENABLED(TOUCH_BUTTONS) +#if HAS_TOUCH_XPT2046 static const uint8_t buttonD[] = { B01111111,B11111111,B11111111,B11111110, @@ -595,7 +595,7 @@ static const uint16_t st9677_init[] = { } } -#endif // TOUCH_BUTTONS +#endif // HAS_TOUCH_XPT2046 // Used to fill RGB565 (16bits) background inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { @@ -670,7 +670,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u #endif // Bottom buttons - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR); @@ -682,7 +682,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR); - #endif // TOUCH_BUTTONS + #endif // HAS_TOUCH_XPT2046 return 0; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index e8ac3f3519..a039cbe0cb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -24,104 +24,104 @@ #if HAS_TFT_LVGL_UI - #if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs +#if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs - #include - #include - #include - #include + #include + #include + #include + #include -/* Timing configuration */ - #define FSMC_ADDRESS_SETUP_TIME 15// AddressSetupTime - #define FSMC_DATA_SETUP_TIME 15// DataSetupTime + /* Timing configuration */ + #define FSMC_ADDRESS_SETUP_TIME 15// AddressSetupTime + #define FSMC_DATA_SETUP_TIME 15// DataSetupTime - void LCD_IO_Init(uint8_t cs, uint8_t rs); - void LCD_IO_WriteData(uint16_t RegValue); - void LCD_IO_WriteReg(uint16_t Reg); - uint16_t LCD_IO_ReadData(uint16_t RegValue); - uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); - uint16_t ILI9488_ReadRAM(); - #ifdef LCD_USE_DMA_FSMC - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); - #endif + void LCD_IO_Init(uint8_t cs, uint8_t rs); + void LCD_IO_WriteData(uint16_t RegValue); + void LCD_IO_WriteReg(uint16_t Reg); + uint16_t LCD_IO_ReadData(uint16_t RegValue); + uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); + uint16_t ILI9488_ReadRAM(); + #ifdef LCD_USE_DMA_FSMC + void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); + #endif -/** - * FSMC LCD IO - */ - #define __ASM __asm - #define __STATIC_INLINE static inline + /** + * FSMC LCD IO + */ + #define __ASM __asm + #define __STATIC_INLINE static inline - __attribute__((always_inline)) __STATIC_INLINE void __DSB() {__ASM volatile ("dsb 0xF" ::: "memory");} + __attribute__((always_inline)) __STATIC_INLINE void __DSB() {__ASM volatile ("dsb 0xF" ::: "memory");} - #define FSMC_CS_NE1 PD7 + #define FSMC_CS_NE1 PD7 - #if ENABLED(STM32_XL_DENSITY) - #define FSMC_CS_NE2 PG9 - #define FSMC_CS_NE3 PG10 - #define FSMC_CS_NE4 PG12 + #if ENABLED(STM32_XL_DENSITY) + #define FSMC_CS_NE2 PG9 + #define FSMC_CS_NE3 PG10 + #define FSMC_CS_NE4 PG12 - #define FSMC_RS_A0 PF0 - #define FSMC_RS_A1 PF1 - #define FSMC_RS_A2 PF2 - #define FSMC_RS_A3 PF3 - #define FSMC_RS_A4 PF4 - #define FSMC_RS_A5 PF5 - #define FSMC_RS_A6 PF12 - #define FSMC_RS_A7 PF13 - #define FSMC_RS_A8 PF14 - #define FSMC_RS_A9 PF15 - #define FSMC_RS_A10 PG0 - #define FSMC_RS_A11 PG1 - #define FSMC_RS_A12 PG2 - #define FSMC_RS_A13 PG3 - #define FSMC_RS_A14 PG4 - #define FSMC_RS_A15 PG5 - #endif + #define FSMC_RS_A0 PF0 + #define FSMC_RS_A1 PF1 + #define FSMC_RS_A2 PF2 + #define FSMC_RS_A3 PF3 + #define FSMC_RS_A4 PF4 + #define FSMC_RS_A5 PF5 + #define FSMC_RS_A6 PF12 + #define FSMC_RS_A7 PF13 + #define FSMC_RS_A8 PF14 + #define FSMC_RS_A9 PF15 + #define FSMC_RS_A10 PG0 + #define FSMC_RS_A11 PG1 + #define FSMC_RS_A12 PG2 + #define FSMC_RS_A13 PG3 + #define FSMC_RS_A14 PG4 + #define FSMC_RS_A15 PG5 + #endif - #define FSMC_RS_A16 PD11 - #define FSMC_RS_A17 PD12 - #define FSMC_RS_A18 PD13 - #define FSMC_RS_A19 PE3 - #define FSMC_RS_A20 PE4 - #define FSMC_RS_A21 PE5 - #define FSMC_RS_A22 PE6 - #define FSMC_RS_A23 PE2 + #define FSMC_RS_A16 PD11 + #define FSMC_RS_A17 PD12 + #define FSMC_RS_A18 PD13 + #define FSMC_RS_A19 PE3 + #define FSMC_RS_A20 PE4 + #define FSMC_RS_A21 PE5 + #define FSMC_RS_A22 PE6 + #define FSMC_RS_A23 PE2 - #if ENABLED(STM32_XL_DENSITY) - #define FSMC_RS_A24 PG13 - #define FSMC_RS_A25 PG14 - #endif + #if ENABLED(STM32_XL_DENSITY) + #define FSMC_RS_A24 PG13 + #define FSMC_RS_A25 PG14 + #endif - static uint8_t fsmcInit = 0; + static uint8_t fsmcInit = 0; - typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; - } LCD_CONTROLLER_TypeDef; + typedef struct { + __IO uint16_t REG; + __IO uint16_t RAM; + } LCD_CONTROLLER_TypeDef; - LCD_CONTROLLER_TypeDef *LCD; + LCD_CONTROLLER_TypeDef *LCD; - void LCD_IO_Init(uint8_t cs, uint8_t rs) { - uint32_t controllerAddress; + void LCD_IO_Init(uint8_t cs, uint8_t rs) { + uint32_t controllerAddress; - if (fsmcInit) return; - fsmcInit = 1; + if (fsmcInit) return; + fsmcInit = 1; - switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break; - #if ENABLED(STM32_XL_DENSITY) + switch (cs) { + case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break; + #if ENABLED(STM32_XL_DENSITY) case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; break; case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; break; case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; break; - #endif - default: return; - } + #endif + default: return; + } - #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) + #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) - switch (rs) { - #if ENABLED(STM32_XL_DENSITY) + switch (rs) { + #if ENABLED(STM32_XL_DENSITY) case FSMC_RS_A0: _ORADDR( 1); break; case FSMC_RS_A1: _ORADDR( 2); break; case FSMC_RS_A2: _ORADDR( 3); break; @@ -138,99 +138,99 @@ case FSMC_RS_A13: _ORADDR(14); break; case FSMC_RS_A14: _ORADDR(15); break; case FSMC_RS_A15: _ORADDR(16); break; - #endif - case FSMC_RS_A16: _ORADDR(17); break; - case FSMC_RS_A17: _ORADDR(18); break; - case FSMC_RS_A18: _ORADDR(19); break; - case FSMC_RS_A19: _ORADDR(20); break; - case FSMC_RS_A20: _ORADDR(21); break; - case FSMC_RS_A21: _ORADDR(22); break; - case FSMC_RS_A22: _ORADDR(23); break; - case FSMC_RS_A23: _ORADDR(24); break; - #if ENABLED(STM32_XL_DENSITY) + #endif + case FSMC_RS_A16: _ORADDR(17); break; + case FSMC_RS_A17: _ORADDR(18); break; + case FSMC_RS_A18: _ORADDR(19); break; + case FSMC_RS_A19: _ORADDR(20); break; + case FSMC_RS_A20: _ORADDR(21); break; + case FSMC_RS_A21: _ORADDR(22); break; + case FSMC_RS_A22: _ORADDR(23); break; + case FSMC_RS_A23: _ORADDR(24); break; + #if ENABLED(STM32_XL_DENSITY) case FSMC_RS_A24: _ORADDR(25); break; case FSMC_RS_A25: _ORADDR(26); break; - #endif - default: return; - } - - rcc_clk_enable(RCC_FSMC); - - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP);// FSMC_D02 - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP);// FSMC_D03 - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP);// FSMC_D04 - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP);// FSMC_D05 - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP);// FSMC_D06 - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP);// FSMC_D13 - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP);// FSMC_D14 - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 - - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP);// FSMC_NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP);// FSMC_NWE - - gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx - gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - - #if ENABLED(STM32_XL_DENSITY) - FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #else // PSRAM1 for STM32F103V (high density) - FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; #endif - - afio_remap(AFIO_REMAP_FSMC_NADV); - - LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; + default: return; } - void LCD_IO_WriteData(uint16_t RegValue) { - LCD->RAM = RegValue; - __DSB(); + rcc_clk_enable(RCC_FSMC); + + gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 + gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 + gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP);// FSMC_D02 + gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP);// FSMC_D03 + gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP);// FSMC_D04 + gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP);// FSMC_D05 + gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP);// FSMC_D06 + gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 + gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 + gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 + gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 + gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 + gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 + gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP);// FSMC_D13 + gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP);// FSMC_D14 + gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 + + gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP);// FSMC_NOE + gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP);// FSMC_NWE + + gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx + gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax + + #if ENABLED(STM32_XL_DENSITY) + FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; + #else // PSRAM1 for STM32F103V (high density) + FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; + #endif + + afio_remap(AFIO_REMAP_FSMC_NADV); + + LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; + } + + void LCD_IO_WriteData(uint16_t RegValue) { + LCD->RAM = RegValue; + __DSB(); + } + + void LCD_IO_WriteReg(uint16_t Reg) { + LCD->REG = Reg; + __DSB(); + } + + uint16_t LCD_IO_ReadData(uint16_t RegValue) { + LCD->REG = RegValue; + __DSB(); + + return LCD->RAM; + } + + uint16_t ILI9488_ReadRAM() { + uint16_t data; + data = LCD->RAM; + return data; + } + + uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { + volatile uint32_t data; + LCD->REG = RegValue; + __DSB(); + + data = LCD->RAM; // dummy read + data = LCD->RAM & 0x00FF; + + while (--ReadSize) { + data <<= 8; + data |= (LCD->RAM & 0x00FF); } + return uint32_t(data); + } - void LCD_IO_WriteReg(uint16_t Reg) { - LCD->REG = Reg; - __DSB(); - } - - uint16_t LCD_IO_ReadData(uint16_t RegValue) { - LCD->REG = RegValue; - __DSB(); - - return LCD->RAM; - } - - uint16_t ILI9488_ReadRAM() { - uint16_t data; - data = LCD->RAM; - return data; - } - - uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - volatile uint32_t data; - LCD->REG = RegValue; - __DSB(); - - data = LCD->RAM; // dummy read - data = LCD->RAM & 0x00FF; - - while (--ReadSize) { - data <<= 8; - data |= (LCD->RAM & 0x00FF); - } - return uint32_t(data); - } - - #ifdef LCD_USE_DMA_FSMC + #ifdef LCD_USE_DMA_FSMC void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { while (count > 0) { @@ -268,6 +268,7 @@ dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); } - #endif // LCD_USE_DMA_FSMC - #endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN + #endif // LCD_USE_DMA_FSMC + +#endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index f24f08e98e..96eedd3296 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -429,7 +429,7 @@ void tft_lvgl_init() { //spi_flash_read_test(); - TERN_(TOUCH_BUTTONS, touch.init()); + TERN_(HAS_TOUCH_XPT2046, touch.init()); lv_init(); @@ -660,7 +660,7 @@ void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { SPI_TFT.spi_read_write_byte(CHY); x_addata[i] = SPI2_ReadWrite2Bytes(); WRITE(TOUCH_CS_PIN, HIGH); - #else // #if ENABLED(TOUCH_BUTTONS) + #else // #if HAS_TOUCH_XPT2046 OUT_WRITE(TOUCH_CS_PIN, LOW); W25QXX.spi_flash_read_write_byte(CHX); y_addata[i] = SPI2_ReadWrite2Bytes(); @@ -729,7 +729,7 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { /*Save the pressed coordinates and the state*/ if (diffTime > 10) { //use marlin touch code if enabled - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 touch.getTouchPoint(reinterpret_cast(last_x), reinterpret_cast(last_y)); #else XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y); diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 2a9e4766d8..373051fd4e 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -86,7 +86,7 @@ void MarlinUI::save_previous_screen() { void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back/*=false*/)) { TERN(TURBO_BACK_MENU_ITEM,,constexpr bool is_back = false); - TERN_(TOUCH_BUTTONS, on_edit_screen = false); + TERN_(HAS_TOUCH_XPT2046, on_edit_screen = false); if (screen_history_depth > 0) { menuPosition &sh = screen_history[--screen_history_depth]; goto_screen(sh.menu_function, @@ -133,7 +133,7 @@ void MenuItem_gcode::action(PGM_P const, PGM_P const pgcode) { queue.inject_P(pg * MenuItem_int3::draw(encoderLine == _thisItemNr, _lcdLineNr, plabel, &feedrate_percentage, 10, 999) */ void MenuEditItemBase::edit_screen(strfunc_t strfunc, loadfunc_t loadfunc) { - TERN_(TOUCH_BUTTONS, ui.repeat_delay = BUTTON_DELAY_EDIT); + TERN_(HAS_TOUCH_XPT2046, ui.repeat_delay = BUTTON_DELAY_EDIT); if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = 0; if (int32_t(ui.encoderPosition) > maxEditValue) ui.encoderPosition = maxEditValue; if (ui.should_draw()) @@ -155,7 +155,7 @@ void MenuEditItemBase::goto_edit_screen( const screenFunc_t cb, // Callback after edit const bool le // Flag to call cb() during editing ) { - TERN_(TOUCH_BUTTONS, ui.on_edit_screen = true); + TERN_(HAS_TOUCH_XPT2046, ui.on_edit_screen = true); ui.screen_changed = true; ui.save_previous_screen(); ui.refresh(); @@ -214,7 +214,7 @@ bool printer_busy() { void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, const uint8_t top/*=0*/, const uint8_t items/*=0*/) { if (currentScreen != screen) { - TERN_(TOUCH_BUTTONS, repeat_delay = BUTTON_DELAY_MENU); + TERN_(HAS_TOUCH_XPT2046, repeat_delay = BUTTON_DELAY_MENU); TERN_(LCD_SET_PROGRESS_MANUALLY, progress_reset()); diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index e8edea76d1..d298376ce2 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -652,3 +652,7 @@ void _lcd_draw_homing(); #if ENABLED(POWER_LOSS_RECOVERY) void menu_job_recovery(); #endif + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + void touch_screen_calibration(); +#endif diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 869935b59a..b430e0448b 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -220,7 +220,7 @@ static PGM_P pause_header() { #define HOTEND_STATUS_ITEM() do { \ if (_menuLineNr == _thisItemNr) { \ if (ui.should_draw()) { \ - MenuItem_static::draw(_lcdLineNr, GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT); \ + TERN(HAS_GRAPHICAL_TFT,, MenuItem_static::draw(_lcdLineNr, GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT)); \ ui.draw_hotend_status(_lcdLineNr, hotend_status_extruder); \ } \ if (_skipStatic && encoderLine <= _thisItemNr) { \ diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 9c49a3cdb7..5887bf9d4a 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -195,16 +195,21 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_CHARACTER_LCD)); - char tmp[20], numstr[10]; - // Determine digits needed right of decimal - const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + char tmp[20], numstr[10]; + // Determine digits needed right of decimal + const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + + #if DISABLED(HAS_GRAPHICAL_TFT) + extern const char NUL_STR[]; + SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_CHARACTER_LCD)); lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); + MENU_ITEM_ADDON_END(); + #else + SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + #endif } } END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp new file mode 100644 index 0000000000..1f315f181a --- /dev/null +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -0,0 +1,34 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + +#include "menu.h" +#include "../ultralcd.h" + +void touch_screen_calibration() { + ui.touch_calibration(); +} + +#endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 705b19869a..8a5095c88f 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -68,6 +68,7 @@ static void _lcd_mesh_fine_tune(PGM_P const msg) { const float rounded_f = rounded_mesh_value(); MenuEditItemBase::draw_edit_screen(msg, ftostr43sign(rounded_f)); TERN_(MESH_EDIT_GFX_OVERLAY, _lcd_zoffset_overlay_gfx(rounded_f)); + TERN_(HAS_GRAPHICAL_TFT, ui.refresh(LCDVIEW_NONE)); } } @@ -77,6 +78,7 @@ static void _lcd_mesh_fine_tune(PGM_P const msg) { float lcd_mesh_edit() { return rounded_mesh_value(); } void lcd_mesh_edit_setup(const float &initial) { + TERN_(HAS_GRAPHICAL_TFT, ui.clear_lcd()); mesh_edit_accumulator = initial; ui.goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); } @@ -456,8 +458,8 @@ void ubl_map_screen() { do { // Now, keep the encoder position within range - if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = GRID_MAX_POINTS - 1; - if (int32_t(ui.encoderPosition) > GRID_MAX_POINTS - 1) ui.encoderPosition = 0; + if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = GRID_MAX_POINTS + TERN(TOUCH_SCREEN, ui.encoderPosition, -1); + if (int32_t(ui.encoderPosition) > GRID_MAX_POINTS - 1) ui.encoderPosition = TERN(TOUCH_SCREEN, ui.encoderPosition - GRID_MAX_POINTS, 0); // Draw the grid point based on the encoder x = ui.encoderPosition % (GRID_MAX_POINTS_X); diff --git a/Marlin/src/lcd/tft/bitmaps/back.bmp b/Marlin/src/lcd/tft/bitmaps/back.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5ad1f82542fb70779ed91bce77de3ee29299cce5 GIT binary patch literal 3126 zcmeH|y-s356vx?qA7INZ_X+HG`+WlW5Ct`A0s#aBloe?#OlY96FciE5l<)!?2o{C} zY!HE{@uL7E`&-XuGF&bQ?3!$`H{oXPoio4lKmR#*`1XC_qviEl;Qoc*=ik2%mQReh znEz^(pS-YGe*C}89Eiu`dwY9kGbZl{HhDY#mBeQpPwHe zABRFAJ=v@Cn}D-Zte!W-6P_K0ZFavIlo}cZhd59H#N2ywmAOF!#&LOP!C&NR39L?4!@; zgM4*$rGgopoSaZE=1_%Z$*&=vaJAcQJ)ZqV&&I|EK)>I=v$Jz}c$mxOPESwuFd4I7 zh*?@%8r?6*2-B6z5(+PsN|j0lqnLeuejdfDH|ca5{_5(gK|FBuw^}U~Ime(}F5?WH zNh9gzi*mK0bC6l`@bG|#Z0qLcrY>HT8$6#Q1>WKe-xM99#Pc$lO!5WI0o0eU+9=8f_+oAA(y0J`OVFZ zGD^<3wY4>lENYbYo>H@c&!ehBrI7QP#uh8)CaYYM0>QVpw^T9t{8y`H8b}KM7W@5v zv)RP?asMwfVfA3O7wG5I`s;jhVK^Jgc}UN^2VYV^Mn8Ynf4;N2KWdCo9E0x!S6Tke F!B0sxQ3?P6 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/bed.bmp b/Marlin/src/lcd/tft/bitmaps/bed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..842174f82081429e5f914f27cfad78a722f067fd GIT binary patch literal 12342 zcmeIyv1)@*7zJSa7JY<{oiexGi%O9W1{_sfbgBqyT0trfE-r#Tfx4LBL-iR7_7FQ{ z@di3w$~j;#xmR-h`1R>|cdwkY!{;52hu`Byxy2cR^~e2stUoBqfuR5eC_n)U{1<`u zb3WwDT1?E0JxP*;VfZFr&vMgQKUnI-xIgaCC zuDANfaa>hZUDtV@f6A1yEIrRN48wI@L4OR`@pxR8@Zt#-yno<748xa{8OJe-B0+f! z6<(g0uA(UZ_U;j1C|<=s3N~O#F!q;^18(8+E6*uF0SZun0u-PC1t>rP3Q&Lo6rcbF bC_n)UP=Epypa2CZKmiI+fC3btfaC%{Le$WO>+uI4()eXvB0Wz?~by^JM}HHo6J3?eFa1Qir@KvXQ)K(U}B zwi^+31W`1`3ww*2C$6wK=y*JEWOE4n0}tE1zHje$z3W}&oF9IC^{vzWdd25A{C)S| z-&amwbH&2`{cHJ?8%|EYn#*LsWWZ#=WWZ$L|H8m;_v?4ZTLR2F&Fsm_%1TX5{l)PX zsKE9t{`mO#*N(S*eSHCykdOewPq~08J3BidAi&kt^(O~gKi{wL@Njhf6#mT2%#xCl z^78V$yu3dgX%!U}MMXtQ?(hvN1b#*x)cpz0*SA!oFS=Uc*Z?9wGZ*OlWdC5>K^#}etIy(Ne zdF}7-|8>8fI)U-v;DBvk+`xS+)(1yEe*Bo0mSzP!qM~@Bu7ZLBTWXJN;|Pmu`Bx9h z9bN}xRI|duLN&<+cXD%cGcq#xd~AKNnWtHiy=6K8hBrRD=!38k5)$I=?d{{^6B!x# z_y}61>3Dg01qB7YfB)X{$sCW1i}UmI!|LzvpO~0vX?^@C?y$iUr#;uO$^x^So13Sn zCm8U8uFXw(EEn(Iy~E`0?v9nt!)8pfflqwr2*<@57#K((^te6PY&pw|U@SH^mQF`Q zm(Ca(8mjQp)6@BvR>&Q2vH^r}&c7@!2u*%|K3$2C04rfiNlCF%SZqOM;~oG254zUY z)^2ZaKY#w5l#~Pp%gF@qMn*=iudk1fkHJab1TfFPhyQPAT3cJs&dx3_F33tk@aD}M z6oS=840diK`lF+xT4q~XTF|h-;}fY{Hj#;m2}tIqz~d}&IXpa+;}j?o!BTs6Vte*D zS?^{%$ImNA@6m+Fm`HmX);ElLnw74XL3CvA(1i+6T*1jEwO5?>amlcFDy z$K>RsSWiw)*bjafmh1q3XJ@D4$2$tFk;yCa-rCv{49J7G!@ppFe>RMdkBgNG1FPUi zV9CkJTtC3y(9i&W3aqBjv)O0o1{h`mTM$wJ5wNtd=;&x9L?T#D;N$`bagY$;9pRu@ zX?9R!@s9e5gCveI65>T;V`Hj;zP>)nI~WiW@W9WYetCH*8`js?>0IEaL*XgW`S9Tb zaS0`80lxt*0FwGi*%S<P?V-N`l3Blmtpjt^5zVx9ndK@NF0QXN%Ph|sI0y81N3&{~X z6>iIMU{qFCY8fXM+<|1~NiJ}ZYNanKn5AWKMq1N zv9|1DWTl8)<^(>Qnwk_LWft<;z>Fk0P6#v$_zFXSuu3Dag+TlFki`rJieY(q8S>G9 z;3r4O0@71lAQq%22+3Ay#B9?kf;dW!7>S<{K*Gkxh9acS@I?mwpaHRd`t(VxlH=f4 zh2tQi(g0Cr5g0S7G5P^HFM`a)#YM$W{nR0!6d+HjEn+21=neeh9mm06RaM20OtPW5 zxta7)@9dX{^(O!x04#=o0kFBbNegDq5qW?X{OaA_-X6uD4MH!Ud}Uw|(ndx)(87qC zY_R_J7qOy$hWwkG8^J#`Gz9rz769;ET3V_-f_}{itwTQEF=OixMRa%?bD&}1rG{&h zB?0*gpy~x4KR9S;aFB@<{O|@sNG5QW^>c1+j@G8WzX-k7AHuu%nMj!DlYWYHfi0(i zS5Z-+-W?qs@fA{)&o+KA(ZuIC;*q{!{iQEx6@>B~kWU641fbD}VGypYtbmOSWnh+~ zDgdN?>x>Hd5|kH&_w1v<0FCg*oB(*P6}+6~4vOmU?dicTKeKkL4_6OarW^BJi^L);M(Jz<{gs(lL3?k4Lj8AX`qW(u$YA%s{m2#}a1B#?LyW)K1a&w!W* zDfbf$jG-w(tLctbsqXCyPK9fh+=91hNPOMPOiHU~q6S=+)mZ{k?@?@3`*i>B;4C zSfCwXhqrord%L>2f-M9%l~=+5=XFb$zOwKY}%F#>(Dz+W*^f>{voc$}Y~pO~2F=;%=I z{uE^Ts;a8S$H$pRU~3#wrJ&&F=H?zBAMfw)_xARhnwr$R4+Q}a>zSFEySuxiqoe)( z{pRLoHIfnq6a2%&!>_kzXJ@Ceu~EH8Q&8~J)6>v@v+?WT-~iY*;sz%>-P4xB_!VBQC}wbLPib` z4^0XzF4KaVireV#?{9B!UszZ$W#h8g-Q7h} zW{(I-H6TI)yl4;2yRtD~mo_V!@%8ofapPQQd|zK57>ots8=UncBP0G4WJ^a& z)>i5Al^$kiX=#bbqtygqo2Ft>Ku9cS#NZ>F+uK_rpDK7Ef|!SghdpP3Vb|B!g#xbq z>_}-xK6n-sWT8fh!3&XCLMnuueq^(_xL5+&nDJK%2n~1^*q% z;=-a{Sy_3P$eVN!lK*m63heVF&z!JqmC2q{CN|GD#|@`5XO_Z?Zd_emv8i${P`{91 zfd3sSXkx}PESen&FE-VNh6XD~dKU_2Vs>+L6CHN*SB^Hb;3`xvcnTnFm`2_+F*EVg zw$i*33&{lUlM-9t<*SwEm24JF@X^IcUf5=*TQ9t>=08_oDs@h6qWkHc|_mdcrF@Os*hiXJ-NC3c%_y6EjILJkvaLIa4?%g&**g@EaQ& z?#-2joUg14s~CxuY;%hRa!HMfM%8lw%3BXEujq#RLAa zv9Zg`OAD>_l|`Kwyh)*`kT9~gwwCx61Z6MxC+Fwq7H0j5Y>HM=MTLYu0iRM)AQUbx zE)=siT+J6!W`vMf^{cC^DS;O}LctPJv}{}=LctOeM$!gvQcxjrlN{jJoCP$Ks%+c< zs*pHaH#au{6L4e3TP!Fp%()ikm`+tTc`2|X4Gj%(E(CxVgR(7SAuIwes#raE=LrU{ i6tM7@Mq?7|gHxWVUlY(HMMtHL+zA#ncoA=#1xg~IO` z(ShhdbRaqq9r!E`{5i+p{6!*6wi(w927_+5`8^#6D~ zvMhZcnoK6b#qwDsvI`gqO8tITsM%(E9G#Gnpw!Q@sB2}a)*l@Di3Id=AfePxSqVjy z<=-OHBkoMZl%(pPi^T$67js{xYW=~X-zQnq|0ye}njt?#aw>i(i&f3HDAOY@|4fO@ z598mEA9@o@rJu6Q`C%keCz1W9EcVoy(&7&eenKS6`dOACKa6Ch|CD9U4|7tfpZGWD zhdHU#&-gdwC*-7(e{+7AlS==oYUcb9|EcC*Ry9L@LQcy3P}R)&VNNRfp{kkl!<aALgXef2x`}Kg>y`eyWCFO8tyFTg~p>lQ)@*>o1IdcLdx0^?HrPN31Xk>!+ACHk*yj~m9 upJMTMG#asW1bv^86Xmo1`h|O6h)S!|Zcr)?Rz?(6dT{Kj-sL> zbRC5M=+UF6PMtb)=FIWq$A3wsaq{HJef#!p+O%oUo;@M>5m;|;@25|neowIhq_(!U zjEsym@%Q!hu{Z@sdwY9&diw6&yCd?SYA!^?|6k|7r>Dnd{@2j)>eZ{?R!7h(jB|5y zEK9h6`yp1gxJV-M-{0Tw*%efW8X6ifQEwT{^{Xw`9SSlvjcV4|*k~qAxKm$Wf8@v! zu6`?P{79nc-=iPA27rIi2M--Ov~%aq+}zyFn>X*>yVt*libvDQ$;l}wD5$Ba!A)Dk z_Oi0Fty{NZ-L`F8MMZ^cWf_&wqlAe3dv+zPTCmChb7p2{c6K%x@Pe+*O?4I~2M!#- zl$Di*mCnOrOj^Jd-`T=;S$FK%K_F~9E5UF4Q_GP=MEtf(DzaV2jvceE$BSUBw6v5? zM?+UK)JCO&8yUZYI z;@@@t{CQNz>ueVQfCpXE)6*Y6ethxbMP+3r7~GQy-VF^6EiW(6&(DLCzR44K#VY(i zL(|>ey|A#bxVU)j+BHIupP!Fruo@na_?4WL{uQ-^`XTzm!^5J5Ygbnn8WudRNZl3T z-Me=onVW*gUgGll^=oaXK#>Tp_T&Qi?IB6&$9C!Ye*Hi`L0MW_(t`Kz-%~xnAb8M7 z<(ZwGm6hv-3m10n+9fN>Ax|GYdSuqo(NX2TOFk}uKS;@@1bOOS{kuH+k%m!@06-&e zM?BEWW5I@ZgM)(xueG(6V=S4X^uc=N$`!Ms5K@>UCE)$|?Ifo4#$-5t+m%p1$iAtm z>E+9pdgjE$1cz^kcg` zUW-7{pBH`j@IecnJ$pvw2R{`aPYGXhb2D*~mGcj^ zldV!7shy;X$;O5PnW+hqpXhLK32uv!!@7}%B z0<;9@ga9v;BT51A2Qe8@|3UiU`M@}P_AKpH7>EUTAer+R6C5O1mgB6seEG7nm_q_+ ziPzZJm^nxmpdT0@gIxW%dBkEPC`B!5PoumEFeAQ0gtOqvqH@mtjNaNFhT2W-3uGM_woV)&__c1R`#$Wv;Itb_@@fnVOS z9sK9cofAc@>Fn$zeat%+kiQ-#4M{kDPt-#6gQqJiD?)hd)-Aw;Sp;z%vsQtV9H&7$}Wj zU9090f>j|-iht9;_6om!|GNLvAPT$%Ex9*s4l1lLkF$2uCU}IE!NhL56HGx&;-DKT zch0VaQR963?+@eOWpd5G-}-maS=MFvkwp3XgC}bGTi<$J#e7oyoBqj~R2YB<23M;j zN$KBZV14Hi@q1LazL?#&>m;*g{(AK9K4E?5v=R>3lx1s_ZspXR`pLl{;r|-e{U(1Y zwL^#>x$e+w=(C>xL_{w>;TyxPyd`7-Ciegkgg?F?GY~TnGY~TnGY~TnGq5HDe*g@6 B);a(H literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/confirm.bmp b/Marlin/src/lcd/tft/bitmaps/confirm.bmp new file mode 100644 index 0000000000000000000000000000000000000000..076fa57897deb90f8ec673b42d73fdd92c062cd0 GIT binary patch literal 12410 zcmeI0$xa(V5Qd#R1&@(ONVxa_W-%N9<-&zU^34apW=U9tkl+>Agajw{GYAke%MEek zMG#x^g-S}TZo>@YF_}T#l1)$BO#k)&e^uAGF<1JMc^)O+3%tJmeSOL_Fk|rfx9{?j zg-oU~n=k&GhyDB6`r;2iJOiEq&wyvZGvFEcC=5(ZO-)WtrZJkI&trIaxLhtXO;-p2 zhW0|Ckk99PdU}S2h7ckxAqe=v!NF`c+tk#Q%jLSeyAdK4ApjnnfbZ<=1an76M{{#? zOG`^CLJ;Qr`}v za5}$pkEFI~YikR%jT-_+T3J~^0<)-2Pfx#3gQ4I_SgrFe$k$iYNM;D{pn`zskc!5< z85BlZU0oFwq^Q=r%~R&XfQR9mn;R3bJFlujo!UGFPr~l*?z&*i6}ZJ(V`F2dr>Ew+ zJ0}E+Diy4*ZJr4}Fkwkg$|FGW?)g}8D7@Qjd$l-LI51-#V5(a}*ZFE1}G&aF%HbdIq{qNedMBK^Fz zqjd>*`X39tgn$Z60z=>qR3uy^MykEphI!cQ?d{#%+_ccTms?v~Y8!!VzKfC0&d%I_ zG*?JxJ=$tl0o`Y3XHQN}%q`qG(!a#K8A3E8)zYc*(?|GfV|w0%ZO%igAh{q$s^zI| ze0+R zsuR*VmRw*v&U7mTz`vDwGY}*|+)AZV6}c|5i#FS8qzIj=s{(lufq658km=0PCPpG1 z2tm?0LZ_-KP~r{`54nUu6HkOWDv&sVr!z*<2T$!(sqJswk?rQ@=GNEOu~Y5fWq0n$ zBru&-1?jgrQX@#fMr>E3ZCuhs%D{9+cTQ)1D8NE=hSBi5yT`HuEeINDB=UM;VWC(o zCJMYTKnUc*>lNwv_;_Y!CKkr(aTAP06fdc8aBx6V%@^vibzJup72I3^eC&A_7iQ}| zgka^u(a{m$B1$C87g1b*(2VbO1 z`qQL~WDs(1pl}Y{#2C3b`S=qT&*81`n~)w~Y26*ym2g8x6ng)Dby$ZJg0Oga@&1nI zK3`8Rd`BPv0SG_<0uX=z1Rwwb2tWV=5P$##*a;*_@^PuKYkk~_ihG`CS=New*6TG{ zvHc2ZnmUf7Y1$Ld=(>A!xztNHXB7z znD_U6zpm>&|Fmr@NfM9#Wm)pCzu)b4vMi(j@KrfIsa%l7_7^S|A0zxk){`!EdYUOD*zp8qn-vQPfW^Zfj(CwGYB_>F&}C_4G+ hI0*p=KmY;|fB*y_009U<00Izz00bZa0SH`P;0K*ldIJCe literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/directory.bmp b/Marlin/src/lcd/tft/bitmaps/directory.bmp new file mode 100644 index 0000000000000000000000000000000000000000..994abc70db0e527afe43b672db0e19fe4a63d080 GIT binary patch literal 3194 zcmZ?rt>R$-gDN1I1H=kY%*Y@CWB~zC-Z2J(Ap#5xPVPa)FgCF?6Pm(?;RPBS8=EKt zKof8U2~euCvNE4CP*hX|bRbqMDk>^!Yim0@J3Gh)ZEbByNlAHmd6-rJP2RR`+kc9| zxpU`$Rx~#^qj{max|(9Mp#~%*Bn*i8|Ni}>iWhLXf7EbmtX=&0$aLtX?=Y?TIB-d5@~)*OAAmXFtOnRz literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/down.bmp b/Marlin/src/lcd/tft/bitmaps/down.bmp new file mode 100644 index 0000000000000000000000000000000000000000..42ff4e5cafcd9ba7e72e12d05c91892e4daeb061 GIT binary patch literal 3126 zcmeH{xvFA85Qd$69$>-==K=I0ijKP&OrY^32BL|P;J$BQ;D!r|A|irI;2W5V8wkFP zqUhWo>mtSRDvl!)*>IXV-PPY;U0vOpUvFPUr}l>a2fptg-xtw0SZJ76|E7-yM55@c zy)wWukVqur@i-fJrWp!_tX8Yj>4eHNxzT7O5<%EDn@uW}s?}<**ZV{Xz};?lzu#Z2 zRvL{)sZ<&a2A|LOltcmU@p$U>`kzyqOeQ~1O{dcZ0)c;&Ab7P}B{=od=~O0@K?HjV zhr<*?iBHsC0gSS*Gh%jL2_0u_Zz2MMFmcuj)fh*JRXbUG*!%mR)#0R|*W zrPASW;GVPD3~maA0+C!wT!Z7zVhOMWr#FWr3WWma!$zV=0$0!BaPWJ9%RU;71pb4; zKrWZVjl;P_Hk%bJ!Eu|-W~{PUEXib&oYA{nuI+ZqodHK-d2=~! z1%ttKI=$I!$hp_+U5or25*bJ}m&jx?TCFyfN^v-O;(}mDyWMU)9wPuaT>1#$XNi11 zkHEU!uE}J&R-ZUENWc@uon+#}AIFE|#_#Qg@I<1}e;VhF!G{;#V7{ha8Tbzwcn25a BkSPEF literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan0.bmp b/Marlin/src/lcd/tft/bitmaps/fan0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..558dbe4f8fea2eab1ba5caebe31737c560b11154 GIT binary patch literal 12410 zcmeI&g^pay5e8r8|>#`mgHh9{*Oe;I9=5TY=B+{{Hs+-=8Y{#gpd!-&=&g z&{3hnZea4YyJ^#=0|ySwdlgIs zc))-G9XodXM`7#KsS|-Z^OhN77w~jJUa?}us#UAPU!z8i)~#EcLSxLtB40r`Y}hc! z$*ESYTJ`GHYu2n;t5&W0_3L-&(1DkNbw$q2qjU7=(f#`Mt5c^AKVeRej96 zYp(7x-Yl-DQl(0R1`V1uYX&weID|}AG;G+gZ{NOwT6v(2Od*Ff>c);8d+pk_@87?_ zfB$~MgbAERUAuPea>8#gvP0OaRjc{)=N~z8k|zs928y?Yy+ z$Ks~r2cGA7Y0;uZU;`i8#fujkH*U-XpYSBqVwk}eap=&YSFc|EL)h>C-nemN(xgd< zr11=oF#&*dJUKm^YoYmS@#4i1T^~MtfJ7kB64pA2Wd7{dt(%EYo;-;N3|~Kg{=9PK zO0*0n@SC8^X?;^L%ql1-Xw<0Dym|A!e*K!MZques{IAJKNxa1Qg9i`h`TO_pXG%-& z*}Qo(w_p(~TDEM--aJg8PGsRZpQH;piiw3Kg)eE_CUpFVb|M~@z5)AHrZ7kLSVXz9|WOT3F{m)r5stZV|)`#*j9G;!j@ z5Y9}H@sju_*hQD*?DOW$o9Qw$pZD(FE2(mn7>Q4$VY3#YnL@Jlh!OE?eaW|1Vo|~+ zFcKKpvPn+$zkU0*fB*heSb}(>BG~HHt5XvbKAb*%8aeF?&!*UnP90P>d-WT!_-ygv9jUzI|JMgI_KUlH-?P#E20#k*80e#>kAkx_kF-_wL<; z3Aoy%NfY4~B8a;<1o@90I~JLh{3|?xqEbq+QH(t6)~!n}JdCs*BM%b-k*tM?W)xp> z$oTQ&i_Q5l8j*oOo>5@L^M|htIDh_pjI?a8Zr!>yX3Q9hWK`~w`kFUyP9TTaQWK`l zB85MG{5VCSu&miAWT9uyocZk8vm)gb+xhY1$6dR2Q9+$>LsuC?ARIq_yx6%h1ML1* zkV6!8(j9@>@YA?_`SNTVZj6fbSJZ9Ww#{15r8RX)NDYHaim}KCDnl(Hh z{AM9kgO@H{N=KE`^SE*2;Fp8lSE}J{_{FSKRZ57|N@>VQcCl1{ zt`9S2%xKY~1ufZvSHGp7GiT15H*azkF1;(U_y_)zCr?JEtC?*F5{RHyGNr#&q)EIo zwo{~P=gO5UHe9=B`dQC-d-s9`3%Iw~{BOHCbm&mJiX_i8_UzeHwvp&wzkVH=0yDd8 zKuY50&z}c8BHczgefo4paUI8MxJ?3AFIlo=%a$z%4<0;w_UxH6XN-)Yefo;P@0`vX z;xPgv+gJHk2_fg$KH!PC&a8Lu-ibbe;3&tId-v`wTegf+>Dr3Z7{G^5Uv=8`Gy=g! zcs<^xxUV)_w3oTYSk*Rtt{32oVi;G+W=K+#V(-@o53*{ z!Yi1Ab;XX13^0)jE9;75?b@}rkN*_59Xoc|AXcnc;kskWlqt;opPLH7z|TwS2Sh^Y zl+`S?C(5f%?zo}xPek2M`pWhIugFg@($|zNdK91Hv~%aq4zOI!XlB~W^xHsv+Kv-4 zxde@ZGu4U|>#e9+x^yWg!!KLfvj7&eo+W?H(&(`Z;8N+EP$cYBXRt0@rgiPwHDr5+ zfDN#R`ie7csd^nEDr+(9$S*PckbL#H8~5E zCU_AIzfv;^!k95CJr{KFmoj+xWgbeU&2X6$12Wqy_nEGD^1EBemJ)O7XM)rEtXZ>M z_zQ&0JD+UGonlQ~Au|<%&k<;&b&=@AO-K>(r z@Pl%~LcqhHZf?QDYJ~wOA3l88iNK*)lJv8V+a&gCru?ANpD`UOjTI1zN*hGTElkr> S7TEGLtS*;X?tx$Bf&T*c{D|HF literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan1.bmp b/Marlin/src/lcd/tft/bitmaps/fan1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6da6f3294e63d813e55ced63e2b51bbc38451c5c GIT binary patch literal 12410 zcmeI&^^P3N6$fA^Pm#ySBP3TcGcz+Y#t<{JC8Lb83^K}=nItpGB$-iWW{mCR%hpZb zQO``zEM(VzY)RX$uC6-gcd$;?__vzF{#v1+4fE{b?{B~V{i(uV^fcf9-Xi>kfeICV zt6Z=D|N8m<`{&rif0nm$4U}u3 zC8!|O#*ZIAXU?3}t5C=njKTDP@Y2LiK%!6Rj0Tps( z0sQ~suTrH7)jfIgB!g!27?L&{H*P#|;K0&UevlPM`1yaWTD24gd4P>ixqkh6`}Xa7 z_wLOV3#q>nn2ssdb?VfqR;?Ox-@bi|<4b)1`t|FiNt3#F?_MV00j7WHx#Q@Dqd=2}avl5P>5p zO8-^RoD;cvj~+b$Rw+Gw`jiw7#lIB(AcC`iN=7cy7=j4XrcKl5RE(mLORziqo;Y!W zyjo<$U!lW`L}jyP%>sU~HJBO2NR1jb^hv?fR;*aT$FkusknHzIDa#dhgeFaz0PM+a zRHys)?K^w+?50hdx^(FRzj3E^E*D{g)d=%tYo&Is0Yg<23L8m@!>0!Fy?gh1_3Fj7 zM1-h^DgY)6FP*=_egz z#u1odu!KuQ#x)Ye@ijEB0V*OZSFUt7_3`6J7eR8-kRe0VIWau4DA)+jm@xz9jDTZH z!mA^az!x<*W&|7?1lulo;lhQB7cU+?dersK^5x5C&z{XUd#aU+LC+pzAzI?oHlIO&~;quCw<;UuF91wD>)uNejNLn^Yz1r5A)~GXYo|P zu|D0lXwibIb5hGT!I3s(dj}l89Zi$=-Q2?O)QO8DO!O)LjzCD*`#3zN^y5M!f10tG z!qzSjlD|NhH*cN`I-%XFRjUC52Eec6K6&zFY*n7GJ9g|4SuveQuY9{>$ByuuQ{?+h zNcQjF53M~*qwR_nD|&YB+?na+)va5%7Wv8|Cw^RPl=POf5>D2b<2lV!HAB>^SI=H1 z=SZz0J$YgBR~tmK{xPz}*g$O`$)s|Ab+6)pCfjfuLG8ArnAg1WtvxZ}?7;u=a*`5& z5?wLb*{u*1vp9C>(4k$scKpYMf6*eBx?a6{RWbG+j}M#;h{4;xlN52!v8X-+Pm#yFbB=Rk8GeUv$?fn2qH|LJlXwov?{s784yf%9_#`y z;YRnbEC|yTMqImQFu)2Za^7tcffq4> zjLO_rr4mW)`*n#bq!f^{p-mqrsiu|)B2bhAY%1AoeKm8xe*Mx3#zuhQV4O45Do$7# z3EFVQxM~oX7=@g#k)r}nQEC|XHW|4@gL1wQQ=jC+jtI6$_%#(>L?r6i{T<~RHEKjs zU~&RZpJ0_Acf#EuDHLO_{<0nV#E7VIJ(4Fc_*sftxR8bEiIg9T5s^|T&xuK4t@y=- zBN0KfiHOihOQEA!rFpp>l6;hpi)khY7xGNqj-B<~#?zZ(yExzj7y2ZEqK+47!dZdg zy2EcS;WEt?hiad$;K@_@K}#m9PHBb<@$+y;dh6CL=X4rlonnFyTqp`1)F6Z(JNp7D zNF=go$xezLLl+7>;^te$Ez#6uJg;Gcrg?cO04V;G2zWVoI-LbWa3o421-_j+b&{M5 z3m&TAY5o%eg`gu4oYbg7(3ObhV}e77queg9(vk)_UO~FpcS%=Dlkn>@4pYqHBhdBUrGc2 E0l_+m-T(jq literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp b/Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bd0de9a1eb3cdb55b92cac26b2322453fef25a28 GIT binary patch literal 12410 zcmeI&SC19T5eIPWPvMW@k6_;yKluf?Mr1@Xh+x3PMSyJ(8G%V6i+lx_Br+l+G9n|= z1(6Y1WJI)oY(r@Jt5&W4RM&p2YcUY7I&|nTYSgH2K?N8vrKY9^@^KE$8kv5yi1oZlO|2twr$(lvuCed zxpMvb^^+%0u358Y_3G6>*S6?v*sx*Ms#W43!=D5&^#=|dC^|yB7;kbdh{ax!7&f0g zdGg-9dw;2Imo8m8ckbNz^XJc;IkRrvIyV0))o5fyI8!_<0Gke*LryOYtzr zh!OH>A$>Jrqyr4RsARz1yLZ2O_3Him_m?kUK7IOh9rmw(a{>Ej@M8}9<3HWQ?7$Pq z9sJ1JQ>ILrJ$v?q2@~`qSy4gb7mJ$NNc&rkDdZ63ym8~kzv|lK$B$2)I#m(BI9R%L zDc!|;fbs0#zdwP?mMyz;=gy~3pFV&7{PE+*TeohZ88vwXov0vvQ6ZewFfHO+aZ1jE z2M_A7fBoBv7cX9<0<(t}W%(l<#5hV|HRJ>i9z2+B#ZFpU(kEodkRep4b;4IKG?+-% z(j;(}zkmOJvP9BhJqagqK`DQNJOc&{VAYTY3`gwQvnLT!+OZZ*!wVupn1tfhy1-ZB z$m%z5-Yi|k$jg^6g#gZn3gL)Nn>Ho!%lL~HE$Y~@BPPI4AZa#*veMFn$O&z-A@YcC ztHN(NW*24Pr6s5Ps4MNKqk#9fZrz&T7t1y@Hbeu}9f9M=kAL>;Sz1Va{oA*1_v+Ov zh!oKWQdKJ0Q+DjwQJ?%6=j$|n5wUaU&cKg6GAFw+BRl8_fkTH5SG2Mr{8FeqX@04YoDo7|U$Dm& zXOXq2aP8W)9LdS6bQBAL6DLl{nRKtMAbwU`@Oy?~^P@nDqo%;j$jSNn z^yyRhBN3s{(W6JBe!zdGu(UcsEaynbd1a#!^^9OgV2z6QcOFske)#YqM`q>~PemY0 zr|eG!QEYpaKNSX|PZ$dA%vZ&KDq4VNholI}aRK}X4jd>hJem3M;X^L4qftRPZ``<1 z3UVl5I$p3@Br~h+JbLs<=|v7ZBqv}MZ{ zg?*7dD`!Rioik?+{OY1~5nk#AhC-eY#m1LuLwnF~Q_F+2EBb#8JNeg#h;QILR3d`9F~#+mS?_Uut161T_}nRp9q@eF2ifL#FjiTKu#X+6QeS zrqRpO1ZVt;_(KKfCN`;<^h{uFyOpfP{_xA0rS_MXcvdY+tSn@LJr15InWFYCeVP-^ zOys8*`!hmL{!EgRjSP|S)`^262*9BlB-kaND~4f~71?CWm@#U5#R-yY+?R2d)L~J) zbrA#xeWOewCt8e@s*sFu!I2|J@V{aSk*L68iVaVcz*}{NrZaBbI3%YaQ%fnf6>8dK zXU?1%RTdK&VPx@$SG#uYG8wy!W6|;B$C;g3DCHKyQ$LiV3q=yl>5h8XOeT^-38`=Y zO2B72KGCSdhB74N>|lFx9tYJaN%G_odZAEwK_a5K`EK3}Y6zyHQxvJIb>eo{Nrwa} ziv)Ee)o?ze1!uwUW&n696a){9nJ}xm;eEK$c%+EKY_QG z;kKpW(ZZ^pEKeP5VMgGsuHk@%1c+RxW+P3kX@uaL0F)$k7y%(E;zKw!I~t`(-~~@A z@Q4utslX<*i2GsQ#QzM=vOj^RCNi@jp$BI#Eq z2f(dea%RVTMFp88lV&gD2%HfGPG_M4fg#gR=g?!vjxoOEi99}0-T+V*b7qi*&G$4v zu2^Lit_Pdh;g5yb%0lX7h7yA?=cimTA{@e%Dq$vdOv5Fy$p~o`^jXF#;sVp8ICy|8 zLVlB#k#UCrE#q)#zz&-S_*ep4!pra{_Rr+c^iMe9=T=@oFmysiISQ9DDpfc6vmZ%d0Xf6#`fojX*7} z0-_?V1gNGh$b8n|CPG*v(n}h7aE47V8EpbQ{J_f+rIk+_cDm1HVi}RBAj+_s3JVu5 z6bMvEG7=crg*i|aVSadlDD?nQ=#hjfEyS9qj3?Ek^K;;@_SEm+C?gQ0Xz(lzA^8Un z9>gUopsv-Ky&!WE3Wc)1B}(|Sxh9T8goFlpVs^+i>hOhQd)mSk`|ex(TL2YALF`KG zCUtPGbrIM}P^464`9uYxR6BN6Ucf+R(E&SBO~8(4Fkf9)5pd}Q78V6^5rzc4t?RsR zoC_FGKU|XlE8a<1B)QoQA!qqC^60y;RW{_O{ZiyHVq+4&RIsrkj|LvVbWtdJHW+-! z@wwc~o61+=SqfgxSD6vknd{LAx@FwMCqwiE(@vnpbH|FiT$f0hDJ^h3$#$W+XVzd zWA4Kf1v$~tvXQ{5`kV^p+tckYjkye@f`q^tA+Rb8jhxI8E)zUmJ}{u8O0`6ivTP{8 zlha5r4gNf|@VR4@96}LS+F}H!q8N5Fquhd1mx7IQyn7w=K*I=da24n)Bio&tJMxp ZAXzvXjWi?1s}=Qq{&x#}w?K{s{tbONfS&*W literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp b/Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6da67fa44eaa086144192ff4bf9860c455f8ebd8 GIT binary patch literal 12410 zcmeI&*RB=I5e8uFr|@I=5$tp0E8h@BMr1_BWXoWJ$cT){A{vnq8Ichg0Vary$cQX5 zBHACj%y=|w?OC(;0nWalC5B!-J=K3z{Z(Dv@XKEZ|FK?G8|>N5pFjQY&+qE}K~MAk z&n@Cl4AiUl%U|mM?Q6g2-@ngH{O8a1(*kwO0z-!m9WrFdKdRc_zcwSr>lo53oPZ7I z$dMz*jvYI3;>0Oarc9eQZPKJkqehJ~PA7A+pZ(Uq0b}ODg9ih-Xwjl=+qRuNdGf}M z8xJ2oeDUJN+qZ8YKYo1n?Ah(xw=Y?;gkFON4KkT7b-^P6W7e!$`}gm^b?ervSFb*Q z{`{YE&G_rruW#SJed5H4)vH%eo;;c1DgGO3VfFFj#~(a+5U_HPs~!9F>C?-XFDWu- z&YW=HkJkc|fxmwJdbKDEyx^}rd-hD9KAkUqaA@E#0~WwoVTu?zckbNAjT>2m3O~RR z!-fs()2GjvF=JS-0=P=A5lN(9y?WL2@ZrPr=FKDgyE-D|w`kEqGO2{F^80)D?s4Mj z)2FXoxpMR7&GYBauU)&AWxk&ZBSwtq+O=!Lh7IMA%J_0;JbU)+-&GBM4R|VCzI=Jp zrcI+qkN!?7uz!aR9U3%fAl2uhtMF3FLioD`*|&^f$4pES_&av&*r-vX zcJ10BZ33xy$417;$B!S+Aor8~vB-w9bLY;zd-u+qIkVO*0$x3^a^=chyLPQuu|hvY z(WP6rZcUmrp@Q+^u#=gO9z9ZEAbuMEnKNe~#~iSiFJF#7I!cjo?Ce_>Ubk)?7ZAlPUXeq!wr$&T0TpT*#dq%9Vf@7M%pOs^W5*8i z=@w!$;P z&+L40=+Gg~UAlCsg}!3{^0%K-^uB%jz>q5#t%wVlyVPWzh%o71a^oh5(U8=z@|=}$|h+!p#p2* zlDDkUzkh#G5Gsh2j~_o)RKac=#^*BN(WBJt$)c#Mi3pW>7_FlHxe0SRb?PMdMjR#5 zbf~al!v-oyZrH^jX2KtV;8jKZiX1sVQVq*zz(dR9Yu2nmSMJuq0Wjvyohx-z1Rt^4 zzI}U>Sw{H7oLM4N5D2^=*67PwqCjiasud>Zs37fMyLJtJoIi5p2vM+weF8R*1H5qI zLTTUG6O%<5Jf0Q7n_xaln9pT4CjOPs(9c3?e)`EcILWP>H*a=~@(C}fh{W=-W5+^; zH*enDzkgqDf!R?d2H9WcWPi>InQRU={1^y8@7}#hYu>zhvu4e>l}wVQYp;r^U}I%c z@@0weG5~f%4rQyv7gR7JpB8-KDF$)COi|#ePc_UZgbigdM@u>C`Sa(J zs+WGKol52`?~_^diOKw#x^^;}LS)y{PL1i00zRiIQ2U=`2RU#MEUw>~B#f z5^G?n%mtuC5v^2(WQ5scCL=$6`c&-n>eY+IAj#l2fvHgl!C+bnt0U8`kjUCW$@!U-lm0kC1puO-r}mQE&aAg-=b13 zl9XjpVt?ru`HKiFJI9VDr2vUVJTBY2AYu@_Qq#(iUP+#1zpXgvLwi|1ekrsxbySp` zOn?@J>{;Oj*1&c}g@(O?%iEfgKN0REsJzL+&uA!Qm#p=zg0*BJSy3Ee5iM*_#4^61 zRz{ZQr37BZj;vK3{>Y!KWJS^Eio2q;oC%^sK6l<1O>!pT$d8t#NhwE2<`tQQU|?DM zTY`O5!thHGzlK7wE(_RX)okiynO5#{Y|lWd(NC0cHJY=LQGw-c0aQStvKglMifT)o z;c-QgO~h_xD-_7JCcjg^x+15RfM4yTga`_iCh+3m-G?(2IZApJ9Y@$x?1LO(E3D~# zORTGI%-O$?3Vu(;NmN-%;^KfaGZ~y6BvRQ%$?cdXuZjpN@PZw@Nac{0Y5PE)eEgw; zs#^+TI-6as!_DbT5U~RP z|M06tf!7>!JYCqr&jp%TD43hwdOnc;+BaUQvPd;Mas<{*_2Z9VZSY776fEUkCrCApFMx zQ7p8p%>U&Pft-<$`RQSw(L)pL!6b=`C$S7c|a^zh3^;q zLV(TF_yr~lmz8FakJtg2;>HgJgGCPDRA5GfMd}s|aUS=r0Qe*X zz>`jG7G?3fgdt7&M_>`Nr{@6RtM1*qqfqR~e&!!KlnVYWK#KFNCjVGn@(J<;fA|9C z1V3G>i(+dryYe-prLh(4`w$p3-~vrB3L@SwYb&=9W{Or{(NqWs92Y@}@zeMd3QbF=j=_M%0x9ZLfmG*(x0E$q^2TZh$49 zAWs^9+Wry6X>vO9MD&F#OHtKm1ei$XRZjR43tAjQ;)+#Yg)hp?q_0LkHKourd2;Xz z0j0I-)KOZ|qK2fqMZ+33LR)q+NK7G)P=XdBf(qyqO`RZ2d>F_*mFNQBMNm>XgbU=K z;D5p&#@Ba!;jY!$3Sjc-4tz)}i>DTYq-j{q+O&Wfo$PTqAKBj95Uaz0+<|87pO8n# zh;R_UFryI6kZWRR!h{LL@+0}*gf^u*eo>&RA!q#S669aU{tw>jj889VhqYt#^^6XU zBpjD8aX-oCVmuB_@KfBnWR|Y}tws{SX|^ZAy`>!_yo3KLUN*NWV9ugNiyVq=XPQHS z>xjrvad|7=gYe%Ke1fyOj@6-Je=&l|l9B{2eR*QFs7y9Qu!Ro>iXAG4HL4T)!^Ytc z{s{00^K_)^NArqmkUNj~MEhX~D=q|#=zvWmiULhXI7?qhg5jE?8oR21*CFJIYKpf~ clLlHm(aKIpKCcU%K%05i1zV1n;~6jlmd^MMh*q78#Kd8IeUsWJDGjkr7$I z_!GyJTHUw%_MN$7W{eJEIvEy^=^!&r$PyhXW*YSg%X8z~j<1Yp} zI{N+c+n-((h#reNo*;%a_)ARIq_{E{V0VBWK5&+gs3ckSA>fB*i~ zt5**hGNjM4K<1sDog+t%T)K2AfkO`V&Ye5;<8|Z4jb{5M{(%Dr!nSJFs)Gj)?%lf= z?1Vh<)54}rn>a#!`~)&+(4fCQH}v)E?`>`~rSKxq9{Lr%#`{y1LGvKhJUk zc6!3UdGqEmW5(3P0PxVELl-StL>h+=A4X^H+_}upcufjl09O4Q;GOdH=~Kv~y?ghL zwdYs}{59oI z!yVX(#L>n#1~JDu}x-@ZMuP}6=w^3R?< zE7D9OtQ0kJ=m`rBnl)=ynUp?${CM=}(X0tM(d*c;V=Ls(Ln-Ly&6^2oMTdOgub@_; z0TwuE(xiL$?p4sge*JnDf5g%W6DE`i4HEdVSwS;9MGI@!uI+{|I7LYy$YiM%`!8O+ zfO*@tZDB&fDHo7}%kV=oefsoQuU-{Nm5n%po3n%pQRk+@>cq4%n%VKwr%&_QNCbgj zm@UIkEXR%=%WkjJzjf=Dm}YMdXW1($&6qKxq0bhNd-CK7`D?)f`Acvp7mYUDwk6@G z;|?4+0DqBYk%bVx*q-(_?VLGth6=)j*fw6ca83ot5)1B{Qfs*2{rmT7tvXhO&B>D| zR|mJ;5k$Ig-#(ca3t>VF7A(lg3Rz6uy?ZyexBlye3l}8ooLGwT$D@!^pKPpr@ZbUP zk_~Qzlhb9A>Zn=fcJHJ`IsS(~_Xm zEVR^d?bA0|q`s8kQmE}U8cG~`Z z+i`q^af%gj_j&&OIS*w&OvSi35XJwwbLS$9Rp5^)Txbl8rNwOm`@#hSt7g9`<=g_) zgdI@`eZt9=-^Htt(3HYdj#Tj#3+PLT+@Etf1xM}0Pxyio@SKafbNEvT%69mOU9c4a zHynwT6vxxs4qh0Eut3X1RHuBB^88*Vj@1WaW$2T#to@l}}dq z(U%03!C2_V(LLW13Kgzl4)C0m@WnU4if9{-$m~(C_8d=r3L$o;$f3e)Qi|lfN}B4@ zH^<1KLx(s*eJiSuv*F4lc7DnS;ZNWxLaS*!i3??wtS7TKJg$v{M5Kvh;yHs6Z4&b6 zFrJeqPqrld;6kz!RYEdt1e_%Wxri-Df*Nr$3!deZJj-wClW9@`mVKC2W@JxnZ(qeI z2|^BJ7P&s~Vh+o{apOjU)N04Yq`k2*%Rb>td7ws|$>H~^&;p=U%-Qv>25RqKG9mcc zr^L-+i{MFKol`6lvhbSrnGmP{^i_MZJDcgBK1>RO@Zkve;5_K8`a z0@{8hNtkmTzJLqvpnz-(eqU)^NqRN@=UDKH1y9#29~P1ryU}q?W03!636yxj0--7X z`0e$Z J1ip#{{skjZ8zle$ literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp b/Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..79d284b722553bf2a00577b1e24f37fbd1a468b1 GIT binary patch literal 12410 zcmeI&$Bq?86b4}Ir|@I=5o~X~^2TdFf_GjR4H%5bA|o;)i;Tb|kr7#BL`Gzh5gCz1 z@Mn%)YPxUt?YT2|23eHEb#+yB)qnmItH(e5)bVYfkFCS+ul{}a@4v75e50qC|NfWw z7Xy9z{P5$?zx~&*``@o~3;+Dm{znW97%-rJ|Ni~@_3PWW@9&>BBgV}R960cElNcnx zIyyRr3>h+M(xln5XD?c`XvK;Ze`VT|B}-<`oH=2_gu#OcTWLLEdtHz~?svwF8C$k& zIeYf(g9i^@zI^$iQG5RU`MrDhPMtcndGqE43lgn7 zj=g^U`o@hLJ9qA+uU^pw@W@-feEE|nPfAhNn4qtfD_2rM51SLx7A{=)>eZ_n7@I7i zi#2Q3j2=Cj2x#d6b8^b?;lmj~6J+(K;orZ1|E5iwI6m+00Y!*}ix)3`_wHRifK66i zym*mE@7S?p*REX*a^%R7?G`}*+^}Io6Ik`8@87?_ZQC~Zw{G3Kef##^yLYc!w{Gm% zv27KhyYP!zd-m+vxN##9;Ma6$0Xf{EeZIhcDEj^T_w_h#yo%W$Ja`b)K%V`jg;lFo z$%btbfpTTiM~@ygMpke1#y3I5sVg$oxNkXt!K(?u#?A+GKnKeih zDS@QUJjC*66a6p(dd(UmJ#kWYj#8^u2j z<_PJ^BQT;0Q?yBaKe7@GNi)ZG@$vlm^ZYd8q#)Vt;H5l?8$}!{;#f^7EEBPh9zB}F ztVqa?z|VPwN~d&tgh#$B$=q82KeE_hldXzmY&3O*DG~S zT+^;yyT;~?Pn|lo+sSu2a-#Nd1QXS#Zr6&qYgbD_d`WrCm@#CZHEWhf4M>AtoHAvK zWcT#xQ+uvny?W@-p=P^c>bZ9vr0NdXDYGOg6k5J8j2JP(p}_ou?9*n@tfm8Sz}AW8 zk&m0@BZm$hlJ#<@cm2^3LRo}`gg-i@KpIwQhk*&#igN_=bd7-tBP@-nAV0(c+aOa> z-m{aX0L?2WR%lW^Jv^`T3OMta`NQKa6+5IpOpfEq6ZA@YVF#!^rCM8 z>6R{Cs$vW<+~0?VImkGR|BC5PWXi#9qI#E6cR4ZoH^rDfLA2Jbf;EUaTb|f z93W26Qo+A-83sIzBpPBFfG7k%%&8@D%+i8oN*ZzUz<~o!!Kd-WeCj-V_6$E}t??GX z;MGZacJP(P=E4hIl!*}d@lReC6ThJgxt=&q^b4w%9tpx3Z{4~TAU%ez*?fYXI{0J~ zzT#RV3#9S-9bftAF6%g1Suitw`t-YZ?}i5blG;V%=FOYFZ;*%qK&u@&a>V21%a>_9 zsT&N2WOF=l*di*GkA!HJd)lG6pw0-7D^mex#FmOp=o(tBOzHRuE2Zcn!#o{$r*p}c zKYS^l1mT7vz%OW2;BPub9T8;guY+V3&M)W`_y|q@CLq$jefzfQZVeaMQ0&4()^egx zt;*oeUZ!%Vur9mVpEUx^Vdd`et=3g#x>Y6^f!L$o;bX zF8;khdPOpY7Qq`Kmtsu7uO^}CEGMF6yJ<4cvSrJZ7V@~nC$+U~MM4=>qNO4D7$lvu znj)-TAa|oESR#U=NS%W^37QB5X)XS{`>2|1Sb?9>s`I;|WyXVW`=nEF!Vwfj5;PH1 zAbur;9?(sfvEmh!6X9DEmJY}TpN=K5rGO^9MZcL9U-MA z`AHTWVp6?Sv2AV&`3jygmH?3Y6MiOye;(cR2)8pitBjTeIM<pS%mFSwLgG-zWj8GA3(jSgdF*UAE(~yTVIp`` zvbs|=+*Uy@m>0dN2(@e^tj>wmS`geCx@~q__}yIOuPlDK3_oxd@$*^5jH)%eNeg`< zXf7Zw;KfsnIK63FcP{)C#AhP}h5h)I&fHIPJ3C7S)phV8ucP^bN>cTn{T}NY<-<-> z=F=u(T8{rPA+bHXEkc5M=e9t2!&gECS1R`@hq|PQX--j|l?9yKK6WVDPiTP`2r^W_ zN-tfyB+O#I8^I?e_7q_N=2MzJ(@L||9q;0w{bcPQei2E-#=d>~Bsh2fnuJsz*X^_L z!^V%2{e#VUK%H07Q*-_&20R= rZ0_8->89W7*y;liMLB|!fH(-#s;a8m+FCN!H(|!Pq_TYZatJVI%$V_4X65DOO&?i>g@yCy&tJN9DTwd15@LMj zDb(EDTwwMbE-fvEHhcDLCZRv>ZQv{Mxl^_wL<$ z^ytx@J9n;JxpL^xp>5l?!OU9W!=gotAOy%*Qk-LZ-n@ChYiepbJ39vk2L7FR-M@c- z|Ni|VA|Hea1f>(fk2L9iTptfw;lI3dg;>BZ4tX{o(;lhQSxp?tn zR{z6?5B$7z>C%Z4CypLH>U;U}DD6r?xpNAq_Oos_<1U@kgq*Ac~r3}UbI-wFPZaKiju3fv{zI_`eWGX*D zU%F?_n&noo0#VO#D}<(|CY20i6n>mQvnVD32)H_P=1d^Sn%IRfbLPw>`S9VxxV>@X z#<(>M4W@>2YZ)3alL?$`+O%nCXedBVojRrOlv8D8CFh%)n^Sc5Y9Ol{QGimqW<@9p z-=7JeX(XRNe?IWlGY5nq1wv3)QD&^Lh`ns;1K*q^sgG=;m59lat_cCRd-m)J{MWBv zOK4G15n+|n)zuZ}CJeh{@%grW`*wXw?AfztsE7)Yrj!UFH#Rm74-W^Fy%L45moHqn z5QqAO3Vt|~VvhpIHns4P6H%mT!w{dhZr!?J!-j^22E&#QUX3jN_3PK+J5O3-5B$@o zPlpfjMMZ>=Mgg%kYu2!0gu*N?E|y<7_(^T6ia18mlp~))zzV%)^XARKSuxG{dGh4R05M%L z5c2_Jbfqk=Y~uN&rItpSKpGw#c64;$p|7ux14zcX!!(5uj)BmP^c_BYIPiVxY9ja+ zH!uUl;zlfr0#PJz3=__K@=_ATrI5U^iCzebD$O?x6G$d7AkwUrFy};Vm>5&1PGt*h zc<9McoZ)=V`kZ&|QB ze96R%7cUHUqbzF$s~q-)X%_KQPK_76#^}wPH;)`SB0(G;h3`-CqQ(47CTzO9yHzz; zqg%C1xQ#J0U!8<7Sm#O_b^II)9w*A!!V?hJQBHEn3F) zJZmoU=>G)#WD)GOiB?Vhm2Pj{x`j!|lY)n#C_e-9?AfzfE9w@3sS~|)kX3~`#Cg`q zN%uU7J~DRN+uP5bJJ;LWyL0DGb*Om}s9%I*VkkWRObR%zfJ~uFQXp6ne(clvq@4T* DyH+S5 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/flowrate.bmp b/Marlin/src/lcd/tft/bitmaps/flowrate.bmp new file mode 100644 index 0000000000000000000000000000000000000000..739375bd72a7ca2592a603e07288049be3983509 GIT binary patch literal 3194 zcmds&$4lKo5XVif$tkBC^S5}(DVH4Vy({)7mS>AWA}V&ojs>xSD53`y1$#lTS46Rk zieRs3KD;r@@_dS-rwqJxe!H{ZnVtF0X#K(VfB7Uo*|4&* z{{GYOPk-s(k7kCy-XIAH2~kl|Mx*f!7*AeJN=k~3j&^f%^YrvY;qyt;*B^iuA0O}T z?(X2=;OOWW5D@Ub_+$pj&d&Dn@o{o;a&>hjQSayiw8Fx|o12@gtSozbdtCVY`zIzQ zzCIHcZV-7yM8x9a;{E;o?CdOAB1O*5&LJTouX+N;gajI^ei886+S=ROTkw&hq9UF^ zA-ui4bu$Z*nYOSI2@MVP@bK{R@`52?$|hwcCwqH)0?xXS@qBU{(kOKWwBTIfq{WI z;-##TVY~<{z{k79qr+O%$HvCM=i>DAGzQ>H#z;|SW@c4YRc>ysq>(b=Lh=J=c+SSg zhK@@6E^wz z`Jf-$TJd=my6WheZ1o&lTWsEog^)S#64-XmIxB!;gO-)Vh@9!&{=H_P72np#j zQYTPydT?++W~g{?Z!bHHP}*5t)RoT8PVz(F4Gj(H`=o`6P$}Xh2FM1ZAdhZCbHRUh z7(Sw)Z*FelOYvlVeVu1Mg-`r+E`yyna?1?Ap`oF#uMfUmv)svGGF=Hk9z#@1dhMt}tbwoQrp`4r?!9k$}atg7TNUB&PBO{bm_(Li4 z^72%Di53@hG}UBwsVmeM=1UXN*T5DO6oiF^(UmFyrSLR@7yf{gmX^k(Ri`LtXJ?E@ zeP>}|0p{~4=COCXm}@h0hg7d^z?M93{*=? zOJ!xH!h{BlK{jc+$;nA{5EMQGfpp1#UNH5rb$oOJfQOI)@0ig?@&xKgcx>X7|169| zNv!0vwY8P8iM<(`#ZO+Lp2nPniU{o^0n=-O13m(2IprVO3&G7ia!Uj#vm^O@{?y_X XeUl8E!hGPEek8gWus%NepLYHN7OGr} literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/hotend.bmp b/Marlin/src/lcd/tft/bitmaps/hotend.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ed24b6011e70cacc01b06f32b300402f8c3ca9b1 GIT binary patch literal 12410 zcmeI1NlRN%6vxwkihhiKgw{=0RgANy8pYX))i}nfRdFZcfQX2w3#W?1LO~Z!2#Sas zH}2GpSZ728MQne~tuef(&*Z*mjO8A9$;+M2|NQU&o_CUjeRjXMdCbl0SFR8Lt~a)K z++p;8bcjnd*lb~+?5?|ef8XC~27Xtj7*Gr-1{4E|0mXohfge7m>kRbVq)Us8 z>1jtt2O}{;z`VyH_#1&oG=q{;Qc{paPfyRq#f1*Cw&CXHW_)~{)Fh4rA#famuO*=w z{G#^M)YRG8SuIe*&+F^!VPs=3n4HKR*x5y>+9frlukyBFx}# zX=yQ&9!-WaIXS8DEB>Wb^xE|^F)|i8O&GCr(dKQ`D7|l*r-d zcboS1_Or7ylQ5*GFD)%m+{%Hc-k?sPzU8a;=;-LrI~yJzrdE-LWH51VZjNfUyStl5 zu&~a~PU<(g%16wi$iFK*|Gu*$6rT$V3kEQxyFhEV+j&}fJwl)v@cOwdh^?-!N`o|* z*x%nziI|<8?e#0I9PbL68-agiWyJu7beF=fVO#%E@o%6mr60XuG%ZR$#`@v6pv=rn zL7L^slVyX+zrwE(zvACO{B&vZ=WEo@t3JPdeSQ3L$e%bc{~Y8C{ZmnIY-|`SL9TaZ zW`^Qif9Nc10X)WkbNs_)xuJg+w-D`PONnnWaAmFWwdFC7s$DUl7*Gr-1|%4Grf0DP K5;f)jW8e>u78A|@ literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/increase.bmp b/Marlin/src/lcd/tft/bitmaps/increase.bmp new file mode 100644 index 0000000000000000000000000000000000000000..53d71d0c5afd45c53ab5fe015d3056f24abe1ac6 GIT binary patch literal 12342 zcmeI0yJ`Ya5QfcLR&;iE&VRlg_ss73#mTW{trL76VLScY4lIZG24Vl%rM77S zi{*~R1egF5U;<2l2`~W@5V+qZ6L=&oz$g?H%wI2n1X%*Of?a zw;NM4zkm3=7724Qv;RaQQ7)Hfv)PMC^?Kdubeh?JJRWZ}8gGR9{l3HDFuDI)twz{? z>vTHof3No^)DQFDD`9zZ<}c@?e=nBK2U@uQ<0db^|M>m>WHL$T_}GI{ApLH)GoV7y z-cUksQ>j$s{?Qgiqfsh@7LUbZ+e7P&00{7Uy)B|tX7fdL5ZnNT*HEtktt{#&gU4iKLBJ&1{53K$E8q?7r^>7`QXNveE4-|coO z|Ksr(2S^h<6$%9um~#KOYb_QF%A3MC$fJE#%U|<9pU)Ng6sB6OR^f1%{clu0^A}dj zcJLq6Pbd_^?etIof3Zqpp;x$mY4yKcF1N3^@<=wDh53y?p#Gnj0v-ULr5X;0lgWgd z(R4a(x7)p5Z!{WFX^?`0%m6HCOC&w41=0Kn{%4*fUktbxxli;aU8v`Unxf|8PBhUVl`N7$Gq4cx4y+L!}Zt zFR8Ebckd6}gKxhz%H?vcRx6cCKOwMEsU#AKP$-m2r9h-C1pxE;yv1U%*=&BlA4^bh z6#&m>vrs;t&ovs2-EI#CgT-P|5ef$Ga=EtK?d^7JwOTrz&T6%Sj&2bH_jE%Dp5JArBEoC&1O#d>2zu| z8t|NGOFEs_>-C$>My~vPJ~x|9VnSgoA{vb@mrFS~l*i-oWHL$IN3aEJKO7EnaE!y@ zuvV)@H$$~kC?Fmbv2Xg3gp7)^Py-dMj;odsD8iCQ6LxWd<+BvFp3h4VlWtR6tme3M?)+Yqv&VC z7zH+(oZ@&qqT^wTB3^ozTLr-Xe}wb^eZVM2qtW$xWrwd);w5bWM3=^wA+#$FF0uTQ F!8>#{kj?-A literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/leveling.bmp b/Marlin/src/lcd/tft/bitmaps/leveling.bmp new file mode 100644 index 0000000000000000000000000000000000000000..34866402701c02c0a73accb772d6d27aba595e2f GIT binary patch literal 3126 zcmeH|Jx`iZ6vye_574n=KY@F@5iBni2u8pV%AmXxh$twvU?ji*CM1RpLc#_EgJA`n zG|>;h;Nn&wG0fOsyyS++^AMZJR8I2f@!WHN_uT(E&*Qi68y__w%XmPWhma3k%n!~hBhGYjK{PZPjV6JcndO6LV`Y7%nd_Y0Y3T*xA|PPtH0%J{G6Qjf~3O-JRWTx7lnm zsOCUUr_-@mOt07X`~CU8hr?l=PPe_ijR=gir~v`<`8;XOW^;3M6B*gQ1n%?stX3;^ z(zbcH@GF&yR;#5QySuxb0w)j%OePbt$`z223o7!_jgp*BCkcyW8R2C?2eaAi_xow+ z&CQKmq9l%kqsRxF%jIP9awi&%?(gplF_B0Z$_UZa_}OfBIaaPxJbZx641NFcV(4bE zSQtw+{@d#>7K_x(mFx97yUxze&d<*ag#vw1yMmZoK6kZRP1d>S+}_?&tbm|@tJRV@ zynXwRMHE4HLQ$_e>WEw7j$sZN~ID_gfoxAr>gmg Zq$xTaF&k*5UvI2ak-QGB75G;L{sIvY2vz_9 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png new file mode 100644 index 0000000000000000000000000000000000000000..d94d3efd2c4ebbcb06c3b3ad5f09e30a0e873268 GIT binary patch literal 387923 zcmYJaWl&rF*9D3bv;@}{2<{LhKq(f21lQtj#e#c_gy0^W;$EbSq~`9&d0Qjzkz{PE9b{NO8|G%G+(5VrC*r{HJ;ESNLs5vS#D}tK7aPoe9GqQSB`Jm_`U`I>y%Y1dH8ZGQ`uG7<>25?{W1k( z_2Z8hfAozWKL$odZ-3lW>k)WN8VlQuKsHj(oCm(ktatK2D%lrgpcMxjnRD+{_DB4a zT+ajLI3_^Y9Is8lO}z)$IV{D_Qc53j69*6%!Gbs^2nMqy^3L5+@urD*3|ZgCNSNJK zTIM*rpekhnM%R_rrKm4=k#OgdJ=Pe`)~sh|V#q=fFuj0DJ|%2xiHc;!Sz(0$C+d2G zWBNOelE-WO4iRLb@fU+24xKOJeZLk%96W_XeT7?@vvMreERDy_48{fIFecQ#ij_|r zgmnTZN~|IbowABtL7{FjX`kt%66A%u$6=CS-Rox%^42dH!(Y?J8)bNM%A>`|Lxa2S zZX zTBCy*KBquz=WY5hU|0T*dcU~xr!C+3r6!#C#k1>&C53D2u^+rI^$Gik{t$}hSDmTo z`>CvqAOZaqWC`uE)7Vj9?UpF;NlOGcgs$c3VUOe~Y6MGI8k)__7~mU1x)TY%nd>cl zUzwo^)HLV?n`pXO@1`IerU6Ydg#P;^_2S#H2%cvwjE%*(W~;;FoGi@c0lj$Pb6(7l zZtgKmaxx7YQ*0H7_(1V|^#AIq4onvjw&{5~H^`=8!@g_7_;P5F3q9 z@+HAmZgWX?ke|y0hMSS=R)c)n!uUI})Fx>O$ABTxNR3IHhpF<|?R08xFcuW|58lwP zBr9$fKf9``mgr;gwi?^bLlvgs`N6Qe*ABiVS1X!lZg5W$FpE(cqwu;)w0ilpG6W*!;uYB6YFcqFO~Gd$Ds;{%(xnZ*1i< z1{MVZUF)e*{`mz)loPr4x>W@$y5L8+xw_n>b{hw`UWgPA;t7#ylSjBVCLklc?L8H7 zcxeuRG1P$;La56C=`w^*3zj$BfIlZ!KhLOgXEI$&`N)SFs|o_m*ew_-`a&V+{A`xC z+{myx3O|hDo)sruo9L)gwq)`pF3{2)cJ4sF!l`nCAi+5B1oK42+x6oMC-)gd8dH;8 z=o21pFwR_?^^4P{1$a-5R+g=55|=pKee}D|1U-tsqt^xp5#${6SD~$cS6G{+RC!-% zm37O7I(Cm#k6Pr_i^ViF0XB)xJzY`~FcJLzvCq|w5vXoz1l|N5iWYtf$2`$70h;A5 zi;h1b0arqtawDa}z};dj`DCR_#Qz*|-iS@3kJUSVV>^yLBVY_1_AUcPqB<7T(wyIV z{o9Ojq()gg+Kj|pc0tuAM`Ao7r6k-Gn#Z4d1YpAWiAll{@CD;)yLdrjQ6iYQ>s>Vn zvb~0I;-*KX%5gyn>6;v+p>}%8DNIjMsg0_1a$MP*-9%bb+@s&2mq(;3IesM}9}tvy zL`nC+sM22O=HYXuf%yuQeC&tkm&ivF=7TQQ73w3T3Q0e!Qt;Y)I;PZVJIXvl01px4F+IOl)`p( z7FkKsDF92LZSeTN-WFEaF>vuqp1vIHaj)=`elZdb7MmQZ8Yh3b4Mpa$>=u*xRHF)=GGqIw4^6RLgGg`a zt4%IEYQ{tbo!xmIxXHl0TdozaQgPCfa7mZ(3-}I=K*dG7<{z^^#flSS*M@cH_r(oIZR%?Xla#Kwgq&dj}(X=jA6V z1@mkiR9V(7;SA9bz=h&Prhbpo9dREsbm6ypN!Pn~U8XOdjfoEbJCZz^hba&^(?ZBs#({)ybd0r!+Y)HyO?AhB z>d}$xzflYCBZb0?tx(MNuK2x#$`Kw#<=4+(CJ221{wRh<4Pc8)NCTl?lw^Hml7#w% z;Y`EjN<>6=-!^V9o604-Z16?0{-IgduZZh~;Ninicg-e0&)mzgPZ;Z-!Y~@QXqKhV zpUAWXU_TRUX11!CRvDkMstbvpTtCOlk1rtny(wTx*w6+I=*H$;Wg%L+ZDqBeYa8A# zO{^veaAmbrSL4o8oXm#f19lk)&bma?Sx$$d;G@%NY2Uu({R{HglJ33h*1c;mYPyD* zO$*cp#MjVmjDO_RS^ol^M25E^UQBa{hW>gxNX$Gtu<&$#S$7ul32RoxiACgfTO{4< zb&{pJ&4dRHA-yroupg=5Hzdi24^HVKTa5G=sfoUWA|FwD-Z-(&R&IhI^xi%Q53cID%EAZYA6u`o9UXv~_}ah7!cRfUKA&&LY7z`J_l`qjad}o)o#Xy`lj}sWCxkl< zLxXeXsz$)_Rrn^;)(Q(Zcqv%cD&^H>Rz_32GiAEDa9azD&bsDWd0TSfOJ_Z?ZiU~n zYUP;h_HhrNY8yaUzq=U-HI~!?{)|re!NkG{Sb^qNf`>rgse#! zyzR)m2ZHJYfZO(GI9aYMbYMqe<&sNr)zUBnhhpkUO8n6}xUb3C%vaCm*dkw(@7o9T zS8`7oMczE9o4>zXa_>mPjF;@eccT6e#bmF~u^hQ*F(EagiJFQ-bZ4k=nb)NFj+^Y$ z7+*yTlu`FvWV1jK4WC0cNPgW0ZLl8$9<|`k?JUA!LEPy=Bn}Z_C^~aKJebNV6$Z+u z%^p>I?LJQYVr z5CEyjI-gX%7XoY0MsTFD3r>{LmpEo_JM2&b_Kf7Ymiz!Qv(NX_vv_eqNv{J5FHLL; zgctl6=6g10FkK100Ap&qnSQ{_-N%yaq{WX~I!W-SOS&tYg=C2^_Y;y0 zn5ApLLxNyJyyiSxV`clCj+gaI31$sJs*9bEENPI#NlMRHPH&&Fh<0v<~&kh z>=lYS=KS}{OeCEwyEY~hbg*&S8GAK3E-(oJ+z7cJwf-BmlyZ;L=*YfvWW zWY=Yroo+udW|S&R2sHCEmaKdjvcV}@Fbec#R@a-j$!fw@Ay{gH+W|@7F zKn_+Lwhi*j`*2p(<^&P$NWxFx$ouQZio5EgaMCT79X{v63Lb&0WE&Q0tT_4%N?c?m z_qD&EPG>!jKZKwG+kSjc_CwI}4OJ*Lf%8R@Hi(iq)oxW}_sis85jLv{)4_WyY2=TI zc9fVCL{W_hX`4!_oT%qW#_)8O`AA`G1s9-x*&nEXHmiCk?TK^U68^x%GR^+)ru3?v zY42NH*wi@2C!Zp)3dHl}WfoPom!UX+Swa~fJKcGuBTca2$Dgy)0oiQ=f*euRsod(> zxd_xkKrf{_;)rf?t;0+m4tapXJIWH|t)zz$kRu|qRVy5XU9ur!B%2z5!$Oo)Rz|z6 zdmt2HsWORtAEjvO-a?m?jgAHG%qjoJzG(+?vttpNzT3A9p9-H9tobC2jyqu~EJ}by zlGMRi5G*~0m3(-xD1^pn-zC;zH5DdIU?lVURpeU{rf zj~`cmKl%1&>$fMs3}1^g(%$yt^j!IzWnEh+bLfRhiip!ow4vAQr>*sNzg-5q%3k@A zNj5Vfb8O0Mm3OL?Lfus9(1daX#H;H&f=xC)(rpZE3*qZFUdzMBHX^9knLJ*GfrG#Ly} z8E{0~HcbK0oDmvYmXDB#G6WOyzEGI#I4nOU-WvH3^H^rN|H>RQ^!K;5Mwi1eF6=G3 zI62#@R~J#uV%K74%?N3Nn?jm&9G$omF}nz5 z@hOqT&WpWbQT8#7tcNHHtz{*6h=AOp)dCn`42-WcFn!aYb z6sZD<-6=+*309-MlIVlErL`|S7#DAmTtAi$C_;aaLzd{QbiN0VeR}%CyKv9k?79UC zc$7gRfcznuj5GUkYlzMb3sRac|Kq~mCKqpD%W7;{H|RCHjI7RARjG=e-tHE? z>KqPTJfRVdk_UB(p^VC(E%~{o>ejR##J@-gE9eG^S>c%iTK4XYdcOio9s-PxsvA3% z^>P@{rCWCB9$tVrh*173*A&Wn9ju{o0AukS zmWPgR#Vu>@SeXDjQ+ffWq}Y>Ku#BSN7fY0o4HR$h2;oE~EUplnqm5~jq&Dc2QE<5k zYs;j4rd${zi3a^2{=^COb*4#HyYCFYq7I1_Uc%3LQW8ekD$|XO|G^* zVLDD+5!cS~N?P^JlAl)9i(H;R_H7sCu3JQ}|H7+>{z*06r`I2!L45`FLmLpmg|Y+X zjvzt)0DNRRIj75?%>5kO|v-Afk1QMB6&pI5{ zpE8)Pn#~f-b2AZ(4drFPyAdFkshRA7d$d$^py&jXtr$fCN|#l}xJ^JMVfh=QB^YEDY4@-+*Hu76Z)u zx9E0oityt*7IJqJ;&9aM|- z8ZB@@4gOnqW4EKHNw3LE46u|ZSQve|%X62l&~+UvVe!to?FKZJu=}iHWP3k#8SxS4s)3Yo2fq%dX(~?$MP*CY z>-i!MFwiGSs%-B7aIT5FO|vZ-t2 zW+~aNAShh;UR4@Tq-9XWj@)Mx4<oHO_BWe_Vg^ z2pXI<(uWE8H-a|6MMCq8O5rP)-1@8LFXfKj1uoo+^vAa{*_K{kd(O5$c90W-;W{Fe zw$o<|FgD(sI6-US=s~*=d+?6AQ?dxNrI>akmpqplkff8BUY1WE;Ho^swMHS@82&#c zROXv^{Non)Z>BRR5@Pnp5iE>49x8HvY^SUX zY*F+2!vY+6#mmG@tQ7+3DpaaWRaM6kSnlvc!5K1oTa}!;lmgEhaz9?(ior)|lhrbJ z>zJSpn8HWO_@$H}i37~~xo0~{f_|rDm8qesiC>OB0&bqoxnM_4b5(d&bEdxJpU5j~ zc+E-xScru%*=<59OP0uj}sfH}i#0SQ=b4*b_w6SgCo@ z&E4JkA$%2ly=hwi)Qz5eNLBa#&S*zyL8OZsL0-^jxb_$Ru2`E27&V0lcJadORq6NV z{O^KgA`XkjSwM1RguKBUke#aS%Tlop_yRD|#QWVZI96$vPHiv2XLw z@|QGI2h_XroKi;SI#QIoVc@-Cu{TlRjKLe47}c^IbdJIk`Ix}{LWw>m+_6hdYyOS# z5#5W3r0D{jE~0BE)VtWLo!D*gbADN{z&~wq8Hv2yQg0if?kH;#h*OG47gxp%VsB(W@HV#r!gJ0f|m_ymlkjz#MIXGUB)QGl6@Jg6`$ z`l}g4!GgDH+{udAPGCm>{}{PaJVwVok5&B`m<^+N$GXG?NLV=MYURQ;{~$VLnu|~sI`c#BbrDy%~cdn(dBQ(@P$G@ z{DP-NNso^&-7p#SMi)MnSRtqBUv2v)=##~&LfMZTS--09vbhw`!B-5nPA?Z-FdPY=;-S#O zJ?g=SPZ&U)D^BEKDHLd|B^m^x<2q1~4J8$%7&n*4VohkFAjTi}f-=xGF$vmMCO@`A zapZsPASU(=&TE7oTv~Z{>SPh9!D_v&1MFH zBjVqf23l^70CAWUaph>33)gpu>jWsgeyaPN$@1lS<$(g;Ohqc{ckKRRGx3jw_t*Ol z)NzlD_*x&SEWe4H|3t; zf0w}_XII$Xf@XLtdrBz##FThb0WHOqc4BqJ`J2iL+sUy z%w1*`g@x+KKYzdGD>P6;Tt&dEMLD^SQt}owRk{t^Jw%KT2PDW2HP?MC}E6jPu{z>e(8umg*nVXh~4c(f;M>+y2+{g&7mppOx2Rs`@xL|Cdb%+~8j;2~mB zEj-D!BSe+hZjAcb-trQar15tosDfWpaU(Al^IM+5aqotfC0L-p;$25;_xp({zA5&G z0m|yBw|1WCIlq0dGK4y5SHEzVIZ$q~xooOWx&dcTNON%_4V_ptp-QQK_5_%4#+T_9Dv9pDfkkTz3oaa~pvi-ZniJ?$3ZjsV26M?$i7Kb5`*HkGh6K z(sSB5=NG>iY(HMtkx?--I@{7#ZQ4u;Gl6&{#gLVL2o*X|iDa4?FGRsQEM^ms=N@lTt3Hsw9Z(>isHigLPO%p-o64Y7ww8t+|jb1ZaX4A+LN&0FIcIRIS zj98}nbBhLhBkf|tWcjgmE3!=nvai4?YrzkBUPtfL$j(a1J6)Tll2MmEOVDm&0@FZk zfv)#aq3&T3sXCId=IgMT%vR3&!0EdJBBi?}CNZ+2) z8-3BgGD7&O!wslYPYujGEhl;2x4@*u?wqJPa*{@96l=Cysj{7@ zc@BGRy(LWse9U{HD(f4`+(xydDhAlE z71?ZOn`q;hL?rIt*5Pt5-ahYFGiHeKKcI1!5A6CL%$adkYM-wE>00J4;P>;_+`6xu z;2pT2fpAgR=mC()i>M94EXxVJJFeselNbW!O0JW^I2olW9`L{BQ^JoJ_@l=oFd zEPAkmiSC~plrD$NTbRVYsj!?tU5U>=rY?4&&Enr;ex1;HfHyLiMShr$M}~ny?^E~C zw9CYl_tzfJJKtUVIMbeM3{J>`u(yb_uF%jBk}`qCK4Q^f1uVEVJwMEBXBWmXSVWS$ zM_917txWrru&o8m#wa-%1@ZyH^j);UB*0m-FHey9@z|U>SeN1;ivR5Y`~RrA1vX^S z8bTy>`8(>9cMogFE3$F2M0>SjePNNuRsI72S`HY&k{s$pB0_Ibh}}ohk28po)DsXm zwj(R&uA>ujUvW*CFeD00hDw(h5rJSFIL$&M(+qD}q<0wPd zenZ;(g8*E3;-&h{ndTdMe|ZJKN9$Wu?$P_Tlh1$dvWyF=ikF8-)VUr92dVi7M>V7= z=KRm@Ylq4T{;5fv>ULQ#s3`$Shy}}&!i+xhX&iV^P&{3m{dJcYH1*AXKeW4N=?rQ#!19KR7`wI9h>+c-QdeP5Z@+;hM%|(NP9E zwV(nf%whT^HO^W@#12NAQk(1IA0{^&;*LbGQmiO?dK#9r^*(Miv3vM)_`iJ0M9al$ z?SC~MzJszgFWBKzm}EN?O<|faQR1a|R{!vvP6%$hOGrF?e?(mKxuwXK5#7EHB?gY* z3Giff?CZb_1a@VrR)FgP*DyAb8^P%5bFm_ z*8HW&YMJ~ce&`;y5|_FUq4G;-T+{2uy<+jAm0g4|i`goC3-F4XQRia>h>1Q%G|*Vw z*SF-_uH;&sBUFY>Q>E(Y+PBOKjo^MU)2qZjAa*yyHTjjg+>IDrSn?Kr$361nqup7& zD5aLU4l4UQU92QA*GNzPmBi59bch*$`2pvjJnpQlcFsS7csA_|!rK524H(|`Yvv}2 zVh|zTdtZV`ZER;;Wg};Wj+e|e`|?>+zn{sLG>KnUeEG6`VDMX}OjE|OzVy<`D;|USM0@9&DcPi z1&wYMuF<5=bn$Zg*DzI^H;=5}s8D$*r*_pyr$?=qX{bw+>EdZnr-`WO zO_Qof6YKYe*Goy~ZK#}Kb35}zsz2XR4x|isHO>ZbHz$XryIP>?qiC|SyA&x(Ra7RP zXygF(kuD9?m2v*tqZ-_A-nAp}YXOP;;X(@5kvpJJMM3^qI=$!A%@ zieAOL(`}8({seeFYju&FB0@@UrVbWLW=`}Nr%@Ls5~>6&k$ZqRlsk(iIP8fdvS;VBOW#(9&_Y<{krB>e ztVjaovZQ_crQ#70Vn)v@5=QPR`9&LcX4X*_#d`@C5eE@EOGe2*I zDjs{;iO_)aqMplhJ+uz*b?)Ye1W`+(hbYpU+vh4hyk;r?eS!`OiP*FZiQNq~Ba8gM zl1)y{ZNU6knDkaMxjarQf=BCmI|VO1?3ghXA=DEqEcRRxiUsv$^|ST|1a~4HasPfo z6Geh1|J6)xZ>zzMvR$Hbo#A~eTU?B92Orf|K3X?BKzURa))$nTGw<8Bl;0z?Tns;D zV%OZC7Vj_n`G3ACj)>a$u+)OH_LkniW!m~5MyNWCHuDd&8}LpM<WzTIJhZOX9{>{{!Ks4h-hOEUr8y) zn28+#ohf+vTCQz=^@z&762>Da8q|=ux3{tFxm-xd>7^wm4Tz%VkIh!P=urjl*g|NkK41Yfg@9E&s%Q9lMD50m(T2z<ZRuszH15T#88l&L#J~Q1J)}+3evpU zL$x-gqikzcI!zn^PMLaO@W2o;Nmkb2b?R;XSYtlxd;_KWFWUjv12z|D_UX>pMG6fE zl}XAp;)9M6=gh+1AT#Swqa$wP52E9~>PN;bL=>Zp)~{gD8OV=T`NfB?c;Nw?F(fSd zT>z_iR*nUr`Ou>Eri$|EmWmk=x+|)rnAwaoij7PKXJk2-I9%6YvaJL#={-hxIR39q zV-As@!_MA{4xOf(lnB51zFYTxnIZ#gHchdZE zY7oGj<|It!1_*EF~;RfB}H0zGj# z^YH)Xy(H-p+-WRExhb{W2C8}T4zGTa9NgF>BRBr;c0gb5wft=U?9LTVCrFPqES9^iFkAsX!O zX4&LJv{v?!p(ej-ZC9lCBB|Q__J>49^E(cjXC-fP`pjRSHHYY3efrgxdqz_1Jjdse zvIk%IMg|BHq2VI1ji?-dy2R_$b`7WIlK6~=5;tG-WRy_TBvR&Z*iW2#w?x%>9TDL#$?t?fmuneoI$lTa zS2`Yu?Ani5IC!rylwtoC<$&f;q)xQdil z=|hsMEV2`_C9yqPfmgb`&~ibV(^>~tOu+<6xt48vv;T#d{=eP?xU@-gIptQqJ$f#; zxN$y^%3v~_DvOGolptk%BRtcjLqW_07Uiahac{%;%;IW&c~zTj0e%s>yt46e#D!SH zoP4x0dA#Aa7q@(u%Gg7kO@F+J%)t2zKbdD6W=wO6eGW>~t|LsFwRF(`c;%deLM&nKJwXHxH;`5F27WVBa2G*F9d zI8!OJ+lbCV2f3t*ttjgwgmLtP*&@Q~mLa(bp;TSQMpU^I?s(|6s@Ne86nGz2$}M(6 zM9MhFq7=GE{?v~5uHmWCml5Umh|D_NqNvIH)U$i{d6iqcKMiu#*iCm0uX1ZXiqnk_ zoj+5VESh{F!B6e`mRD@@I8m(q(Q3lfebV}+di(9%!P{U(?c0jmLWZ%F7dzeGYtA*U zFMlRBJfP3@sUw-$y))$=&A$~64>IL`T|w~<@uG;|!m8h3v_`!TZnYk6m4BQVTdNi* zgULWBPSnki^k{Fo+U=HY@yGq`ItV*<$xJW?t~U!{KeW=n-5!okyNIdmLz#zuCpC?e58o;c9SyNoH>rEhn6rJYN(m%@2& zQlBi9e+L_pV4#b_-W*q@bF?~7DV=cah?rO_@OVwoO#Wrq(pc@|6P28Ic2}&prI?y_ znZU%t+y>&LD-p8~`j3oB5F7&^tKfKf#+GuLg9Xv68_0<_9V%F)^Q-uq`Q8o{17T@_ z6Y0V<2}})v!g$I`&^BixWjlJ(BwFerGv6}EUlZ_E0sB?&qd~d$Kl_61KM=R=Wkgm+nnq- z$1PZ}=4YrkQ78}-IT_=g|FheS@z^8ZlW zt;$UQ`l_2_9#Kb}WG`rSc2qyq*4o~)@|z{-KU$)8-6Sf<>uNc;_Q?qe0(z`lSaed} z%fRwyY&G3olcwpN4RlBOS>tQSp{}U;GF$yUq4(DmHKO4|wjY!iOv9)vyV_svYp>Xy zl1rddEzj6AQfl)}&2H9sl|a!owV_|POCH7~YAROJ5&%ozo;!VB+8$dffHiXJO9V#= zI{vWSzbfyO*?FhM@RRnZTh||hNT&iW4D)~(dBO~>#M()Rm6$@a5V>y(Qg5O|8%UPT zF=gK@uB@f&5B>J@y_J!uzLt}0&z*^RSCRsn)9o~PuTj*}Z{0Qm`>e27oT~GBS5YMD zvdaP`te$BZ(S%vy8itnFY87k24ZBd<jhz%>%V#%})s&G)iVEL)m z^^ZN78=I=u#|0ejME#&~5cq3C)_$E})P8Lv7)?%mjzv^wnWWUDXnsgMF~0XdbWWRSy3I zNjx5~6pNLPI+B-i42L6y$ybMbVDX~Hg_&ZqRY0E-?KQnw^2|X9omu7iw??P->riv zRi}~%cDF;#^(GwBvaCNI88u7;cItBOC(VD8^a)0zx5l(4|6UN0&)Q2kbA-5e0ph9T zX~=ISPWYuULy5vhVonnX`q$=c)T>;%_KZqW*tqPm`OwCM$uF4KRaEs{tYpdPbV#TT zdR~)$VYByZ;wF}Ej@SOH1fgef_w&yJ_Jed%;XPd>kE$Q3uGUCv z>$M?Pv;1FN{}zaq1H=%>FS-u$q!F%njy|hIEZr?)8UIYab~mN$sg;{$!uFM^-^?Y# z_fE+MIS<~TZ|gr5=BEtJV6jVGn+Mn(eHgb^_jP>Sl->({Mzd5`QfKxkp+7eh{m5}i z?c3((i4zfe4x}idqQTyS8Z_yImx9FP{QChX-|NrIO;|0I^dsqkqV3Fb%R#z(@@H~o zvcnnI;f9_4^fc~B!)fB)y>XVjf5+K1?y`13vo{wdhijh|=kMpmgZx}5yY>?{w$~#kDXEMnrk;EUUKl91Y-SYRIMaxfKm1c7}@ydA_`mAOk4)CG4 zb&<9$``3M{MAL_VC$AnNFKuHAXA)TB=pNQM;7xjXF=MsyQvteemX#e^ahLqZ8$UNqZdSmz+Bx8lJVbAS}+hs0ZFSQvbB;ATx_@+;Q?a;1*3^8}JWz+O_ksbZ`+1YAe$+v{^MX5eb*NWta}`*0Zr zIG|j#k69{P=zr=K4D$vWmE(H-@QePi%mvh8H#4`z_msBp>qXxB!$}S`qfE-8@<5q7~PRXXMUV^;e(1 z4jJ)q-<4OxQ$&oIa{jrOG%2^QLuxK|baP2V9|u z^2#++muv>G2D32Ra5Xv7s0GkgU0HpnV$mOTs-i0mms54Y%Q%20qBwT}MI|_K8{^vR zIfuc0F2|Z&E&Itn-(DQnF9kSz4(#d7J=O7S#qo^$OrZ8!_SUFmFup_Do-Kz4XGo=a zn5a4tw*CsPU|+7w1eKD*LdWqiikj+>iY;h*Gp9U|U=O7^{+^gZpHnDHcI%CrrjF5? z*(LC}WAi6)d`b2zWsg|Gz1{A#xHP?C2FGxScjq%IhWJ<5uXpRdLqmc&GWj zd!e%-RtGz;h3TbUwxAynX%XqTYWAH?=PNmB@$LZ@sud(aw7G2~g z-{0##=Vv2Ku-PH6VWx5{xBK>P3@-mnaa)y2F@)9v#xowI`ft$uB;1gb5txGg&G$l^ zyG~n3mo`N0Venbd|vCA@DfZ`<yUDL4RjxkTT9!@iTh9BcX3HqfEqU+f;@^ zp>PpVtX=sC5Z?c?f*AjKVF?&FT47Z(ju3ci{NQ}7tQ@q`lsP{EyCtVbItnC3jK62L z7S9KSRfutyy2dlPM^=sRjoS?mr2fO8`jxLjL(Q~^2PEV`f`(x7mlA^H?>o+W{alYK zuaDpjy&o&CEC&t5kj2jGn{!5xEOQFD?EVmYV^(zqH47cmH*O!5wK{LGUNHH_yv#4S z@=4t9lpQf49M{p|Wp+~1qU=_r074Ekfj{y%91@3;#H!LQvk-q6t=>KzIzP$L?|ecJ zT2dL&JEszhRhQQzh(;~Y?fOSlyt6l)!`5^c#^Ruxp(tasX)8*B_t0n=B^9yj*NM@$ zqQN0^PMCK@@oa0|PM-rd$`(Sq;yAOq2^!=G=OS9R^9cE*VT9~}IgTnFesDI=R~}+| zf)0XZWxewLY3e>Sf5_m+H{1rlER_wPmeUKK&+=}p9z59$o!4>KYh%$CT*9??X#V}@ z=)rBezmMpN4ZLJ>;ca#pm9n8I+hAf9aG(iyU%%l6HwCr&wsY;^P4%LZ0FT19+&wur zCwImYx&=V4RfBUQ616`6=Hjfyf=yXl@A~DzJd+}P)Gs~yiu2zNu{U+V$It~w6k<JQ+S!@q4bAD?!4nH=c8BJv@x6S!D?UH*X6+TBLvEdpw*#=bR;? z;Slu0QW?vaPVQgdQIvA#n{jr{(CfdD#_LePw`I{ITEMCgb$W4v#Ratn-=FNifLGmm zcMV%LaaWUV%*=#xk#8_bp&w}Zt8P|^eshfRe5qKO7&t76~ZKlt^HZ{aY-oBvGSgVEP%-RhMy&<5E=tK{)(F)1n$3ZZP%F6P*j*n# zRFs#D2~nKDivQsf3`XGwK0E3a%s!6phBHz1KkYhE=J&@!I$bbFvLsgm0TZwSps%ek*6kuQ*N=z zV9wICUwHX-$f{ECQwfjlpz^34LfIn$4<@}JzI1bz`Ura(g&Y~l#x*@R$PYa2Liep| zu%(2?rQ*&)NKi!~4$@6^_9|Fl=I88Wnf}+5fN|R1W|dMl!HL_JJ$puBj_cIVyDno< zAi>rsP;zSo|L4_Bb~rt;6&uXuU$l;#bgV>*m$_){%;WK?L%@HbUBH|uCmr&8#+tf0 zKB?m|Nt=Q0N0CqZZ;yI0=H5N#bxGG)uV|{MOqzvA=_54dx``80wT0qhh(GhKM+pmH zvBH4tHm*M7LrBD~33l_iWhVDt@4Fv4qdRKJX@T75C-qgIEiCveXlg!xRUJKF{C}8w z%b>U#u4xx{2<`+K+})kQ-GV!VySux~;O-h6f(LhpK#<@b90Eb}&HcPpr_TQ={tSE1 zTD`ijp0;qLOG=Obq_yn91W58v#Qap#m(u0sb}RZqR(<(+_f7sy@*L{(zkW${BmrXe zJ*wRBz!y6heKke#b(~ABpeB-b$6&C$%@;L)OiVoWE;O67qEeVIzl8cb)C*Rqg6U0d zsQT*Mi_eM;@xsGWnK6431~LaNW8hYz9eW7X4fQ1C*|}}l%97#|&jy2TWm!@$bv)I5 za-eHhHRMi9`R|Ne<}Cu@kBx4s`PnrP1hN%)wmH``|9=sIiTtF9u}2YqAjlEoj@hBm z<1HZ!<7|T^YeXtI!Mh?g*o6M!4H4vQgBgdH5(2OS&H`9Th}s|B4EI;G{f#@(d}SMB zRdb5@N>k`-akH=CwZ)~?$h1(j(=C_!ajn9@Gkey3+2v75pLx^T_wmuv@kO7X?-q`^{-{fR|oee~FJD z#f?r`o`AmRN}5zDG5epz55+!;82cXe3|`vVc-?@a7tP{r#<0W+-vvh5M2PpFTTAbtO?Ldni5bUKUmxCV~i zfq!3?zOIb|geKWsB~NNc!6@4v3dlf@t}eHxq$1UK1L(AD;;)urWF@Kdo4Z5O^n(A( zc5}dR&&nSskJOEg67p-hL2PHv=(5a&2q`Rvwt%=Kc_P^d+whR2vwW~CbqCVF{d^hI z_$cV8BXg*DU)v~_p^gw{ll`$DZ85hE_2u}-E%9R+L6ood!gBBaat{W8|qpj zHZs+6+`qBQFlygfIJ6%`-j9;fV)!(9q=~SKC&gQ-)Otu3ekUR~CeALA^{IEarB@31`;$No*gz zJr59Z6~{K%mo*TtO8u&ug{e^Kr&6QUMmz11>8BB-4K{liQZouT*3>M9hq(vN>9LdG ze0t#mdeL=l9|yPNx*#{Jk|%TOV%;SnK$eqZ18U3@kzlbaW}HYE{yyfAa;X**f6Kay z%V8e^=`(x8M;ol6FDID&6AEdw0OYDcM)iLJ-d2|^VGcLh%Q;)v7!6N;v&F`6E+AZ< z`)?PPN@)ZapZlx}Ka&C1lbVZV*xp_mX9s*E1yyB46$YtZ6%8}%SQNlP8WY961dKn{ z7B%`k0tqxi>oGS9ab2&5cHUJS5KfJ>tnnP`=i~Q|T1+R?+HIbhRCe_7{qwvkgDVm6 zZ+BshKjoMCD5kCLq0PFgz!LiLd1LzYSYZOLn>3?&!}zf5ku&A21T{5JtqS`qKY`Ga zO!h8?#Gmdj#jsdL!&J~Veq)-~a%Q|+qs?>Lis_6`tyr9j_X6qz=RIROd|>zKR}X@` zN^A_&#YPwr&Ac@(S~`9ZF^7iQEXsUj(m8=>7IT2L!kNG3l=l<(N+t7Zs2TlA9{*Ye z|60OF;klu3|4AeAUk1Zgb+V|78ZwX)76%HPGsT6BicfeMg%B}SD?+Jdf}96Txrq@E z3sJ5*Z-^pNMFp^gx8ZH7S*mlB!{+c~j>g3sQ_xLNbM6&)-y|M;#9#EXg| zT9i}Fn^(BxGH%xdI%}MX_BXm@m99mAQ~SD=|4f2hcu395QKr?%9<5)px}&v$}LH;w--4ZegMRsFsZ4PCrfv43hO`+J!K(1`L86850bn6pU3o{ zbHP=;SYKI8fV;8s*MW(q`mi(*pS#GKb8(+i;C1KS*uwV&+U+7Yg->gC-2<|8UUuAw z>9cbczRv>1TBI*_LL`nfuyQ({Y*}ovp=bzi3o*2Dl+{Etv|o{Pk;p8{Z0}G)eAQs@ zN6(jY@Ee&?*tjbHrb7l~j*4-&nxpK4Q}eNzs=bj~=x~=XuhVSIy|-;R9cs11^eoVF z*8V9dD`C=E0bF=7C$?(j)6Mh`Sb8&3exdVzSnqJ1pk!Bhv3wXuMG2!ZcEibd2<7!N zGrnGKj89&ZbtBeMD#o4hV!fEuCPGHuR6gN2%glmI)6~onJK}b@)C|7NhT&5*68te_ zdQSLn-Z(%<_a_k}xm;b~Wl?iGu4NB8jCostBIaT$(fOLATcUY!W0QuUFFA@zW1f3P zh??pMaE$Q!&YC+yCVldz7!sp&Eaz6@uqKWJU*-}aiHeRtCZqMxhNV!4^wjEpLBsNyvA!M-8C68v5iEw8WpQY)q@Mnjn=FT_lX}e8?rs z-Epq4KTTeHXt&k`td87PF(StxDsV6EsM1^xP)0h$E&@QfTINr2UVYByXOwMF8ej>-HIInd2i`I6l)HYBLTjt;1NI3{YlbR7Tt}*S?s4NoU>)jXH0*F3{>$ z#VK}Bs#mcN$7W2WOh9`wAqXd4msad2pdR>9vSHS?P$@!|eOwWo^Qxw=h52LUT8F9O znF89LjtrLP{K_9gTW;!wEe~``s*rCI35yPiJ18t)Ti6UyuWYO9auEvT>%~d$2KSJ@4Bav;d(z4emq%L5M6!}jD z8|yPuT#jn;S0}}lCy1ppEwDvh<%Kxw1JDI}@B1%~$_L$56FrqP?5eH@QJmZvT^prYN7}0~T=Gu1FS(_J&s!5a1av;&1hc5~9zt)U=Xw?Il4`!qPrmDI=RpkHeu)o}%!?J++ z$(fuOl52~kDATE6JRyA~B5VZ=yYs6gDPa;Qz}9yY91&3XB5X|W@2NOom}V)*){?(n zx^E&#goOnCOW2_Ijdy@#c$P{lErA+obPmIe+Bh|ngy{)yy=54gaJ#=_ivPy#n<+-1}9j5%DNZCEB#@i3_Y=k@r zk=4R#WMME+dL|jZ>IgEb@}DVzl(vzJ`u)^V2(>&vIKvkdC#`>Ym$+(4Oj(QZbacQf zEJkd|oLZD-lL4FLKGF)8jC|P2b5`QN+H|mBK|*_SQwcRr(??>mAl362J~_|kKDSOW zLSzOhh|SnJQ#L>Q+^CwFiU!(KJp!5rO9p=COJdrC>t7jaTD?vSC3u!zYe<+fS4^$E zg=O3Q)F!hRYKj4c*I)GM@O*R4NNWFe#9=(ea3W4s04zt;QL>YKUaZlURdX%DqptTZ zo)AoAi=MdWMj1Sbb%Z#f`s2}+Ed2prXkI0xCtIwgViJ23{c8l&nnp?4s`np!=igBm0IS33Hax}<6+NN5O&X#^ugGhofh zFH&lXT`B3)S>n#lO9S!|%h8q{T5m44ck|O7C^i<|?I!a;gW3SKTF68qDM}?E1?uVC zCLvmd^;dkA$B&LOGHUWAZn^MgvaiwHO0m{^XQ!X#*1svf(xs(l4Qf)?(E|=lZS2N! zV$t%E<6SB{c&p1BW~^;Q!vR$j7p1qO(cM#o{O^Aq>c1sZ29;Y`5@8U0Fm_FTfy|i=AmO4vS*bk3x0zWe5U2Z- zWTuF%PAE85EU(1jQl9hWU-4snyn1H>+HMLbs~{Cf(9BG-bI8UXc%(0TgZJ}}1FEF! zd$y54$DJZ^om4x7q=xU5nwUOfDbk9x^jtpFhq=zsx#p$HD5`Y}6pY587!tG$JQa}R z?Rqnn3~JDD3?FfJIOvkX)CMfZ1Lb4ru^VZ1R-zIhwXdF80Ef_%;|<24?A&c)BcG+=wh0yUk*HpUijk0U$*})VnXA z@p{WVa$i==sQ3p@y4JtM|A3}t#Maw8@EUT&w2{HhD`1iR&ILv8DwoRHA|qehimMHY zKJ8=V{Lc0`@zEQnz8qLm_(dfD8*lH!Et2Fx4-oE~9MH{4U{fvn>Gs_Y9L-6M`Yq$0 z8l)@NykI8#)#9cL{%NYSTzcu-K#T3S^&(1$pNf)$kQ9n_4STp7IYSvrUNzwC$Lp{q z7U2Pbrq%czN61yHe5={rxco`2S|`|+r38ENGaact;u34adFy>$#`JcDXGrA zN%P|vl7QLQLHN}@Ig(z3siW7P8HHG^R{o`T4&J`@I!9-~E{PTow7g=h&O=2UpS5%d zd=8S85cxQv6iW$^pI62uR|S)+R_PorakbP;x1LSE9V%tWI51T3klI!uFKVlx-!d>M zp`#nSTy*JLvNVUOx5)g=3Am2zV(1iP$;-zOf0Kf-kOhQXtTm-dVDz0lYmUIlWJeEGbrN}x zkExP4_yb`kIq4J^^^{pin7I(d5BJ@bnP^CIV2Iyk1WVS-Hf(f=p0opG(+Nx{C3`kE z9sOo*_CP2B4shL7C}J^9W$WN4kwI~w%=Xu3LeWE67`-T!v~n>#B512Bo}5u(3nn3; zcge&WvO^`k?g??3;TzX^iKLmJ{R3 z4_Q>Q{=vr-OBSd|<)A#V*}K+^Y9CEsd%L~&aXC36Uv51@Tq$4lEomcgT^(V#Br!Qv z?$X@(KnUU@CW0zBu(5h!)eB|v4vL6Kz3FzL$u&jEZlvtzgo`pnABP>%ar;I_d)$BE zfiPo$L8F0STC;-nX*L)^U0DlXTV~X=0xdTTHv^pcg=G*?wD|$^WhVRF%U2cv$BCR7 z*bIGpn%~?xXf5pq9oTZ+Whrq1if|uH?GO%p9ecQ>WdjtMWg8Hh(ybRowRfi+M$y5< z){wIMD|n-Bwm2v}JE4^rwV#lvCcq@GhK8vb%b2HpX34)7%YdXvNFYIRiVqO~nBC^o z39V%{wO0#zD3~7aN)l?a9P2NFy`EEfMI%XKr4jg>QU#eJR8&cJa>GFm4VL6^f*_7tmOBI)kRJnrNCnk#utlhPiMo3p3B-%Vd|Xq;27 zPZ91KyBw(`7I}fzps}6qshTq4f?O37p*x|7i@`SWB$rFCrPgK^F^L4zrL{In7g^AJ zAd4o|12@D1Lkn3(tss}4VF?Hn!bfU2hl`nCQ-zCxiz>S-W!ab?p7`4SI89Bd+9}r@uu$f%(x> z+gqhpnBH83n@S&=0v%gU{Nr{s3)*rG-88@5kfyst%c&qJG%F2x)X$tTI}t z(l|A5VutKkbsx1I1uKE`s}oVwOYr#@M~g)hbacb~?{VFp?38#!5la)^f}{Xg3JHUi zLI^;BMCX^rL!&HDMVMp8@cUp4GiU`j?AGDXPew3XeqD7KXBLRo>B60bL8^gv-n}gz z+GDb#;$BtLLz{6`_iVTsd9tr5NnG7tD_s|bCO$oCFhIcFCC4{F&)$P58kg^LD_$s3 z_Zh;c`2r0MkqIr}-=Up4c|8djlg`Vq#!Gt=Q=R{9MYgO^!&Zy0YlY#?4)0+K$sNW}VzOp+Yc82~wL74)`Jj zgfNM$&Rwl4TnbSzb0#iq=ad2lg>@BJ4zCo~;g!l>IY0!5T>CarA0er<`KnkpGhJ7P z`Gs{&){fTtpVSvZF11*1cr@i^OMj;HZcU?k;qlT;B_}h8X3&drRo+mOy}x{mF?7|- z99QGCg_cdQ4OPR`m|$a))rBD}O8aLlY)malpxQclHZ(!FNi-skR4zr-3^s#FUG}KJ z*6?E>UKGce`D3_S!N6hVKR^8k7%`ys#bYlf7Z?uau!*S$NCVwE4mXiVZ-pSL4hG~f zG)6+aYPdg8po06VI7PTXKc*BkcOmB@`J?VpOF?EVh4XRccj;g&+9wo5sln`F{;)`N z9d29LR0q5otDX?&dVFOlX)sDD<7Y2Bv|S`{gfubqBb3b8Xi zO^{6c{CagkI*e)RyI_h&`$#|Q$G@F;7oEiZAn9n=C6BN`3&x(F+L>tI$H_GO#m=`O zYa2GrUm_(fp;MGUsum5uEE6xSXevDIer=Z9>J6Z`i*oM3JN-tOfgPVGU*YNTTm#Iz z?}QzM`~rmDUJez?3x));8Ffl~XDggsi$_O@G9X8-Q41lG)rbev0^Co2ZeX;XjNHNc zpx7$=E-FdAVu^1?TM4zL*0|PP0J5_Ycw(53PCvr)VG5{l_0Jw?AP=aL3)S2|7_EM7Lx_XkZnZ$8Jnh zpZBDVI#Wf3C##t<=XqFBM$W#P+jEg?cHBt3!gi4fz(QX9ix`@5J7%|UG)SjUc=FEB zw%Hoking;1jVRG!+4=t%T9ay8Y7QIIl7R8G?CWaOWrU-}rh%V}Xd+258<%=g%_?tL zx{;^RP1|Gx8g8W9Q*(6vke&g}oNV$3k$z8*^Y7bCxVDcRrf+6H7;3JKxPYmR>SdGEEjJM`_Pvt31n=mM z54EeL06R(siB$Dug6;?*;Ulo)6;7X%L8_Pxf+$S-O9qfZL;OE&$9j$sA5m@!O7J-{ z-8?2U-G;vlBa(Iwq+5--fDn~x3osz;gjiXsb(g7sqa}vK@69*FG*#F%vBy>a$9sU0 z>gR8Y9HNhKCxYpq-XLN)kn4jcPU8SN%ALfNBg!_5MY9{-Aku2_{bmcC_&rry-Got5 zoo&F;A5|CSk!|RgEf})%30^#1!lf!LN6!x^{r0iiQFZ_AcH30o6DERjpj@*-Nk?9A z0!WG!lAt5keNUClASInNPg$2ZY?wSk)OMbHDN1$lCR6`4W27@uzOOB=dUkcS!I~MD zam34%7$y#&@Z*QYiH|=1x_6eK||ij*x?4xX+^4ian>$Q~R7KemkSXbA?WZN~*!cG}slVS$X=%gcww zSzu}MM@TiJ@JXYw8OpT9J- z%3!1?yKyX;yD=KVqChFJZqpUu46pEw=6#y=z3G%6jV5G!guWx1$npt^e2RG@e&YLnfrKcndLvapF$qYCM9~=vK$>)x8sQ zZgg@Pp@j$97Zb+(9-ChnyK2oL@nS#V3PBjg88fgY4RB3cj`vzyzQa?~86}W1zwa*4 zB>UZ4GoJneP8@MM7s@)y?zgMV-c0!D!%(j^El>$;$7WHfl{;_Kc{%f2X+ha$<}Cj= z8OK0aDo&a^N(~c*`r&fx+qS^-AxL5M?=~~>;=>&0oy=Vtb0oR}406d*d?;YEE$X-C znB+N?@<7t)3USznY?VW@YR7B;RAZ?O+~yPUvIHcHG3{!_^vkIqCb~d>mI{#65Ra zVQ0IKUXSx$(qH3hLHA3`mkXTPIEe+6?ZSIOxJu zqi0Cu?a6%;=ctQ4+^E{FP*B zlmAUfyfRON$XmuoAquR1Qej&`bD3PG~ z1VwMBxNDTIg3T0i+g`-5Hjpbr?k)bGrc_?PyC4=a{bWu~JosL02BcKK*Gk^Irxd0zZ$%{|N#`1tC!%5RGWroDsg1TL zQ|8dmXsk%Zf+aY$;H0H14#7K~x}a_b%ID7Xpy1J589aYq1|u@VS-R&{rIw(hsP5MhE7@G5^w>VMN%-$K@YMKrQB1$oYR5DmNhE6Sp7CTeZH4I% zO0JxuRQ=;qIHB3fVrgcAs3KSNZ?s^fO$?pjm1T`-y$^n#cQm|gLmusYlS=hF%32B* z85P5EJF$Ni4d+g{$-PYp^Bd(sA7jmUEfF}3d4$Qwc>j3Hi7W648&fpmXPZS7Wmn8t zpjf<+j8STdVn0pO>J+Sxhvn4P`%YC_vA0YAB=TouwrpUuY~XRPP|A&*;W5XRy8doQ zruo>A+LuG?`Uv^mR1~YT%Ud+zCeNHFP2BcePlEQ-lDE140aSx-VO6)^26r08&XRwJ;J5^U z-eZFez2n3!2%oDwtNL3W!8)r&4omeS$lruL?_Y~v_7R8Q5g&b zhe{&V3fmUrvaqTvcz03i9?zN}xOrM&L_G3d%n>BMYxbW3Y#S3vHhB70=nM~?0&?nT zSo80ghZC;QvznL1ij5t~D`ho(ND~?42IOxim{~s*N%>@aDdQA!Gty`{5uPh(qexWB z=VgyQ_P3qL{cTIwLM58-=QuYy&>53A*giFRc1CT%odC5Ti~DbnU9`Kk40>6-yg0*| zR{A#~5Myvc+@)l`cRME~!tIPmT>YQKZ5qohJvg|lJ|#Cp`PKwqfS{G47abK=7h9LU zv<8g8k>ms~ojqN3OrUx1pdkY%TB3uNuNkhfA^w_q#jb{YIfrK(Eepj(Zv1vU_1g9hl=kB*N%t{x8Y)r#)?^tD#B=? zb{C1~zVs{YdF2!1Df$rA;%8!hTKuO?VXu}I!TcRN6WZ*hAA}6Awf$F?xR$3c8l&V5 z4S730KuwQ3te$LFicX81#kz~IB;_C4`}9gzsMFumaAdtkYLA4m8;^)4XMvVGdXxO# zp2ZQ!PV#feyb~Hv%a7~|FVm%}Qe6-#v3|n}Py`F~a;5xdo5uX-gf`=|ctWnwUfFpz}KVIl%LqXb#a06$r`sv9j< zC`recls@wMj{GZezaQW^k!x-)Xm3XEHPeHcuv6?cJNR0+`m@B#L#`*-c{b$nm(y79 z&sbmHj|3|r6qDM@cJabgrCf1YVRO`QSA<5>|L7)3R=~7j4X1mp&8R2N20I_KOFH8Z ze6L<&9hUVjPZ$Q@aEqnSkxO>eLmviWsX{LZWF!LDJ`b$({x{lb5YDE6dHj z%q9&Y{86_{w+tHQzdu`GTc~6ee!aRradPg46AQjfclMdzM6LR!#^YcnM7+6`7HAoEzp_57! zBfOS65-ASU;-YUgwm@^d37ViO0TypiDXCMzSj?@=e^5sssbb%NwP&c?atq95e=onO z=k>C=$p>>MenjXT$%xrA5hni?-|TPTvNOzle=0H3e7!_X3hR+Wf%QVvW%-!`Y8$lS zB{)t_&C2C8X?#M9C1tv<=u*WI?hs+38-H6WMOK-QpFXy&g*k4p4QZ*A^X9tQw1s|qrrx-_-$a<4u9vC z=3V4yv6H7cE7?17zPQ@NASz(;JMZyG4ciie%IV2B@&tNvy(g@AQ_LPN4XaV7bk*YH zj*pHa4Bnv8AlH#)bxc|l(O3OG8;+PiF0i zrrBwsNjQ~^!KgShemhb%L8aR8wUe#X3rbAq7G-IDd29 zbeeopLif6HZN8FKe%=nodmF2t9cY7!sr8o8fP{*PS(8u+AEhI`6>~{P3y$H$O@6nI zMpRA)|3e_kM`G+oYpmd`mkU8pK3eOKncAy!oYN#rP(gNX&HS4dSI z(TK|AK@%Se<)@xbO>6BvtN?pa!2Fq`c1`d7`*tw@I)z8>_YzP3^8S);tmi*;y;gKH z?rCZHaWfGctXp@?u23Hl`W`~OmLG?fdO7{uRwA4*zyB>Ar>N_!EwAzK4dRZ3211Iq zN{ewJ9QwaQhBt<`czN2%HB0|_Ma}+#&vI2VVd#t0gLX49Se8danKKq6J^%p39n#xO z@emMRzIG&6L;XxZJomsT>#nl&oqu{{dBuem^7Peg+un&$a%Q!`(S3fNr%=qi$Vphp z(V$iQh?)3P3U%^4dFIhXZfJ)NIMxSEKZTo~wG^bQWEBttl<0*A zprwZGDO~3;z8t2zyKNh$@u z`|Cxp(jU8(u<0zdk5s06nY=VSxEWaz;ptyl-F5~zf%Cs>Y0l-8pFX2CQLlqUDtZ8h z3G4&_m^}IcN;3u=EoFnAB!ByIj8xco{S$o_hWl;NBGgDFT0}JA_(ZiGDLn91-5D;z zsM?V9bhu?_ExyLDEyh>TSn7;P#}dx)ZnX*)nP{*X-G`2Y8Iv;Uvfu#7fi^I`0 zJwBwZG67VA|CJvtp~mLu6(S81Ky-6{2d=d!%NpKU^fRn7{UvOTcb8lxb)EcV3rHU` zTKgj0ozG@PaI}5rYM9G^@Y+@|`9Q$A26Od5kV6DuU$$Y-!9cdoO&Tz_j-s-GBw#|+ zZfwE;MZn^6wDJOBmSE4(Wl+w_Xr%F!Sj_z6T<89St(c+jSn$8omH&p)Cxy;>N_dN* z-^u7iIb!u99~pn>(p&b@X!7jNFzsl={pFu1jx%JFG|v%Z)6c$C?c(#H970XC04}11azJUJa@u|-~Hta z)0(JB>>j=x^7h1Hf$%IK3IQ56Hr_lMsh`A4;YxFPoC0vZjNfGg(hW3ZMP%;nBjeqviY=q+P*HzP%iv^Gi{3Nr&Kh)$&K%Iy2 zeF-m`A>GD(MLOXS%CR)(VUW@mBYbHv#5A~qupO^R)nE4whSK%X1oaa0zw(WLvGNtN z*qU8K(s6zMl8#1{PqAq`sNI31szas_xF4W|CvR+l`z@9?^T4O z@Y;Iag71DAc_0FqvPZrnZ;!^9?zqvXaIRbdy?I`JL76IyqUEC&Jazs(zYWKMI>fbT zLS1A~7~jzV<@1y4EhmpO>fkJsw>N&?CI)u2+#0(aj^tgo8`Y z?X?0c2$UgY&DjPBw1!}~G!RKnTIP*{w_ii7MGXsn^=U~Q@=Hj3ShtvIZ8S0MLWVQ6 zVPog0GwXtC&5+F?UN$S+&NZ=VDc()>Rq`}o<2Tz&-I&hjaU`z(4kEKmg`87f)wMYX zitwtjU2M*o6DOqyN08BJ)SCb$Imu2Ly4Rc_OBd!CzvkRms}CFcJ0b2piMQR_@@L zs_v|h7W+SyE4L=YI2`h+BPI8o!xPkBoK*_{YHu#04ei-_NVd@_3@vc*=G(4GhsQKy z(SRg7%|py}?JA+C4f#S?>I^gGjlwLsBe04FQ(XQQ$zPfa$1rg<@&^ibW&5jA610Al z|I>3{n*KerR4!I8_UFIBRF<9F0a?icllG&@OH7BI$LWx`8fV1#*fPCqL0n<=&GuK# zKPe%ya^XF(YoXh5rnzjdi}e(eQG=$V9!%&|I+nT7(DgiX-Lr47Kuc!|VrR^_-;gB{ z`hQCzJrY7-0m4juN}-!^_X)Ery}Q$6wR>f+v#0s)NoaL` zG+$a6syM&NTW<+Jhnp1ojIAZ5)#Ikmztu{rR^<=gs8Gk3>fDxr=&A z>OSgqsU{f9hgdo{PSk12C<-friC%QSx>m@9XJM_%NC)^XKpBaNJ611#M>}$J9WDvu zUycY?`$StzP$H*A3mv;?9-(tIv9m#sJym~O5H65M+^m5F6_5gV_i<8!B>^Ai72yRi z!R!lM8O#h8N#hLZr3e!tVmUJz2LW1QVr5+`4CyCe5*L5#`(WNTUjJy=BVGT;t)$aQy>U~g;x%3`h=Lk&ZjT`mwg}xK z4Y1iPWvKn!H?|9&O*7)bfVJ33x^16*`#Fj^*1v|ZlO-8V8-)m8{=<$`P?QPGDk}b% z=(TG-H}~B=z!4C5wHv!%)^}RQo`)ScZ}B$yTx9;?V--*hgyfJyBa;7#{Gpi% zXepJi+4mzd$N2!!w?7aJ=MJt-5a>jaysp7j&F`1eHwgJqW?(S9W7|?iOo| zTb+>{YhoF?U6g;0?ccYF_BEq|%mOGuoHa;T7E;SfAGWbii~tV9z*Y$7GHPo7$y=UA887VRb1sp3@mDhSZe+C z<+`GdhnN4-HNW(FywYb;Yf#J+$@iIBO(#Hv)ua?Aq0B?9&2jM>aUn8oRH%zwEl{V@ z#a{#foIK6MiNx(;$4!g#P7>!plc1O%VqgsWR07sxjaOSh%;X?q^=*+~Uyvro(-`~P zSYklL3uDna7G0Owsl8CBR7g(oBKEx}H9fh$WtHsH6f1y|Dldy?3AnRn6Y5CM!Uk<& z7JZkFbin)Qk2#ER@_493jxU}jPbX{dFKKe2#7d-e!bzG(T>3li8h40$HL0$8*)r|)ekTCA8Ch%>5n5c|JnEWN>|01#e|;s_qF^Y%7oBa+V;D6r$-K@8) z?QBc>id+&!Dn{=T#3Qp+;`E(^(cy_UvtbHkBA68|gy9oxRF%sT!p55OMGOf`m( zcBGkQ)#{FYSEu}(MJbob%Cb~Dd%*S&3rKYB$W)Hb$LPI`t@Pbb)BLD%#1j{KeEx&- z*HoLSB`I=36MVay+u&b;r@cS&{!V8aR3NS|jE8ae-F0bN{$4{pblLXD<{8oI(j%_InyAbU7+%dlTsY zJ+KX<1L6t?K1wUbk42o{(T5Q=)Oj3c7@DDCD;_YH) zd4J<=+Qzs)%Q5oNUIX?t71}#h@0mqW+0jj!$e)ISoQQ000N7I@S32eXa(phWiKdWB znR}av3Z};c)KR`^)^V0|XY1UHV&ZFX$tB+rJF}XrR>WljZ;j@+EII__(rf#+0R%qB z30GviLxv{{{Uqz=#jrTQ=g=mo;kM@>Sd%uoF9KFGK>L*Hq0ZOpP*&YngvVNRb(X{?gveoc~pwkLpJM zmv0F&5ow%8}{~o`Nc_(%LzGLdy=?9*EO8GZ( z_LPvyz~;H}_1q?wFRpLq@a*YSwczm8nZ?Q`O;6$5PelWxdC~y8N{+=%mqTdOq#IMr zJy0p6`7IAT>FPbPPLy0ev*bSa@#ohePsGK7w0u=>uW=Su!CjRn9g{N7Ms2lGf{%}Y z3O{ZO^_Z^Jzbv*$t)$}tI>wt~oz*h5s9SXfxn+QcCZj73Yn9){@p2`3FmJh<8^?a- zf((-#Ev6rA`i;yCba8>CG1 z7KMp8hWUEgS^u-$3DLGaCLsi&jy-1#U3#A%)>^>-GW(=5emlV>#>O2j>Z)j8KT{TxF0|FJi2|)nhQkjE4S(llQ$Y$$a6L@ zjv7%uUt$>F$<}>_E1W3R_<}kaPahGS3L|#h7kKnj?+JNtsn7u%B_ROE*%u~sCJ&K< zMH<8)yUpox$YnZoLEgGQ7`1l98nNwhxF=xQ6UyAOG!T7>eco8+4cj}E#4*8F(jY`b^U_bu#2)f8Q%(2i%vb-K0;n0I@?Y!|ms^}&#vhZI>^}092JroEEYukOS-r^D%tNAEU`m}!q{@Qk;_=d48CI~=c2`# z#Y7pheUJiL<{;0M`CmV^H!J-_J$kinRWdrDk(Ld|M}CQnK$UmARxgDwV1i>pO~2~L z!A(rZ)QbP(g)Jm`ylmlBzp#YQ+u| ztFTAcxT$s>YmE?out-HOx<$$)bbyOqj*b4&@9XuVq!vv4^l^W?EjEcxsJ;8&iv z<0bPNwAHBdYfuowX-_euY5{0j^Ue^_^Pdsrp z&&ESAHd2vU3$*n-@+d@|EsCCBiE=CK1bRRRiml1GX6bi{6nw!yAW^l37vuF9zxICI zTsHY{$k&1{#VC@Qsk(z@ba>?F4fhs0v?|MgpGj6)e?VS3XDQIr;c#ANiQ@sG6+hrzv(U1aYc*Co|raWt`y~%4JUGd4-NCHofLwK8|$mv<`()MnXiG zrYND%7A|U=5L)PMxogJz1HzH&c7G`VgnIHP6w+tmsyk$EMukL+Ku~kIJ~jTT=^}_8 zx&?Mm57bFXP5r~8HKgMpZ}>gdPQXzqVr4fhcfd(fH@s~7$(7Q4ZZ84vjp>H2$E(oF zyp@n>fEM%sR=EZplppr!(8Eg!?h10OLV>3VhnPV&6PM-@cYm?6wlXdYI3ljIGbbj! zlJ~cgdX=tw#G>lEzr-(R-Z0QNNva-|NIE*48TZ%ZRf^EI(1fj8`OLJK9J=dh3fm1& zKqZmli^I38Q-D0qa2V+?JA9{dc0w@qZndV+Xyy=zC2J$!m&s*NCLXquYarkR^Umq^ z=TxR?qLvnN9Ph<#=s!MgvA?s`Ov|xi^S_^_qL~?uQ-8m5URKOS{w(n#bL6wmvPs{- zA%nq9!ObKV3~9V)CBX0~Nt*Rdwz`tQ$OD!dG#pRF26674n zlN8t=M7uKiD!eWIzIr_mhNzWZw02wXxd~`@i?ikKN+AYq8IL%Z+ltoL_PC38eG%~N zfs@@MkLp(Jos4Ce2H|XSKIn;`9Ft_=G$tQ1M?cSD&6o%@^fns^Qz@!HdH$Hum&{MX zPx1Bs<11CN`WW|X|Nb=k^mBcd52EH55f}GmKbs>R1_ZVZ+-lTuv-S4^+I0 zo)rAP%n>L>rY?CPhkV=ZT>evJQ3$UP*KJn8ZOLp^!9$9$6OkXYs4tBZW_XW^z^z$? zy+AkJK_4X*vl3U-J_ru|{}FYTL2Y(zw5C{b_u}pn9EucocP$bM6nA%b*A{nLC{`R= zoZw#E-Glpi-tU~5^CLf!$xJ4h+1Y#FYprY9(p!G%36lQH)0_85<5Ut3gKbil^zCcF zbBPsUhoCtVH_I`C@JGm$s;ToPGU3OYQp{KN6E$luXjF|sQ5_nrddT(#+;?0tiMPH$ z1J9~Hr{*%T8sW|Ie4(pV*?jamzVhm9#`V11QxS$aMb$sU`l#)T^=ZwUdTm&6)P>qOD&g}f)d;+SWR}pvXLjrFk$f9D zYHmhO(U2ndV~yt_ZkZCDKROp(DohL85?|%HLNeT{#v;U0b)Q5lOhZ}-J^VAejp5F{ zHUMTw&cx=8eg$8f;3b+1H7RI+nmgyXeh(5ZGN}?2pW+8{E?@GdKz#?KvpV9)9wm$6hVd)BYitG@Az{Fn zDCL~Op|;U~ROn6ytb>mnQlS%N7a2Q%kUK0h^vr&=^5=dCO7Ecfjm}qN{xmhd+D6lP z?EU5B+NCW$;W=);fNv|GS`JyVH5TGQyA+9X9^?ARAK>r1>tagSgSCzDa`qW~^L{!O z)kHrvrSuRBDivX;-Pn+2BL}jgQ}&11mTAA6UVI{vZuH|Yd-o4IPd95|o^gdQK1}F1 zb}h@U6c)f?o$nLT8Fflw`H$%$V^`nWu#m7d2^VfV428dRzKFi;3~Qu`3@s677BAtL z8mxFPwXV|TnN2dei?Yb^d1ZisudBZDptkBaKQ#*qW&&Tbqfs0_YXjSxx)g2i z@lqkv%HO;A{<92R*UyVeX^Pin7O`vo{qFtb0qx<3pZ%&PSDW4XQHp_=sWA(tBbTj@ zWSvbey>k?gb4|dTUEj>np;X@KcO0(HFZ&5O1NJ|`4;uA+jwjQmlOdA! zmIrL$)Rshba;Y)PzJuNtso)y+1dIN}lbvm`J!N%@n|*gVFx8vbr4Hxw z3|DacD7bY^Utr4?I-x@aplM;)tXeSrzY*LBMeDPfWfZD&66Uzn`G?(>Urol{5l-&%q7WxyVq-zT|q?hP7h044S*;j4qiLtLtobzv_<8++6{3l=`1~ zg&YWZm}3P+V`j3yZNUeg+hKy6ATeV&G8-5DTL5|L`hnJEO|d^cUAq}6=|(#(v5umE zx&JgjEF76yc{>qat25+AitbXJO6cE^a7l%&C8Ns55_BTqeLZ6 zgVaZjjZDSkiE?$wMFECa?_0`LGhRz$nvd8{9_+Y$B&6A}3U)(&G5cq~&Lp%3tgiUx znReZ_&2*PB6)tLQ;|r6_lepi#*WWlY*&8S#IY!LL=Hq4kcs^%v@_wl^b9`-qv1r#9 z8TIp{xRd;v#J{nBADRrI7Q@avg~Z7hIyvI!N2H(?`E|b9tcR~(kL892GRF$1Tw7ce z5C`BQYlx^b3832Oi|w+G5_1X z!21*AHu}tFt6+YA)aWLy(?97Q^G3wdVc*{YLof_9 zUT!quVkb*DIKw2YQMNLIi-R#17v5AmCUFxhzS=S?4iU$t^8i2Q)!iKB*govhoYcVD zj!}bY;!Fy=@E}{Y5=Pj5_ObeV$SWK;hqFvoesbs85sta9G)~=``Jnu7>stTc_ix>>gl> zauL}tO|98}#M=C^7cyT+=v8^x%0#&LAiU+*eb+Ng@tkrYm6(jI;UJetFg3~Kg}Sg2 zmwOjPWyETjB{qv)j-=iAHai;+FfP{=|a@K2f$vF6mI9vwCN|f@jY;cuo;HXtvsi9;?tXl&X+8G>Zd?k#^;R(jG^0 zY~o;vEdmRCDB+-xe;bodTID3jSI>i?;XLq0$uMs(&;O zhI_ovQv&qpDD(>(+~@KlHI&adz6j-}o`_FsJP_ho27O4qITfzDCfg15fvlJE>WATR z<~h*HWXT>?l&H{WP#n~ppH`iz;5&lfGBY*}xub{qKMnubxnGg6S`<9LpS^v3dh@y1 zL|=HluXAN{@>LH z{*=N9#{(vQeV^%ztbtSnSt|X(#}ed&2pwP%S&>R&*nP1y!JB}POsK2m)iCM9d<63Z z*{RbMT4V{fV|||gHZ5aiB>x?sF2cg#&(bm=^W8{eH1 zA*Mn2;&L|7-zI!tPfRnrym3GLYG9&-^b0tBeU0c|n=@NeV(=TqGIT@P+l^eSH9Q>H*YU(g-5fo~55xnMHaR~5;7)x>Yt z(6((bH%;cAK!-Si%wqV8M!>HjlkQ1>y1M=EP=_c99O?vEr#^(R&j?-uIx?{2WyZUt-;w zdf-?`0N8i_s{br%ak2mJ>N9OvQgIZMSIa9ksOCOpN`0L58xoTIAGE?`Qw3$x#-wQF zyfy@0)%CGU1Tvz=NO+oD)Ovu)3_1Q!>7j7h(6sjab6;dvDY;6i5kd4_qLD^ojvK!5 z@57@E>{BWYLOq1^m{HqKx_Y>X7ylOtk8q zV!7xeS7S|2pH|^8Mk-^C4|A_G8V|DSv5TtH)_NZWX-?Dgd@$!{k=tXag4p2W`8Xx{NENN8g_w0 zEYpQyjJ*d`wQQG6iy+Oq4EP~`hJ%dodd4Fy_PaZTldrHO&etRa1$;ufaz8PB1;A_P zS9U{-l+UNU z8V5bx*ZJdsX@7gw+fC(>72bd!{oi&X0!f20Mv~dlUnfA5noy|~jI15!Y+TOP9+MTN zxCQYySj95sr&Y{;7b(7)*KHveuKNAPO;fBlV6m7Glp*T!LY)wg`m5x5RiE>D8D4C@ z>(_*HGQR@e`69B{#I?f&f4qTv(?G5x48KFf% z2lir8d-q?Q!?v^NJ_vgBvE|@FvP9PRVTxAX%&vcggxxEPLW|~`8fgjYJaXB7P?z=G^yBaP za?S{v8T8zlDx$|9tlwWzf=%q8(qopi1(%Y^G}U~b=+8a1Y%H|W2GAN-Z<^+0^*9tJ ziyx&}0jym24SuKFk+d{4TcWz(#dXg1h3FqMH^u%roDnwQZutW6ys!XUpRKgQomwJI zToajqg_&+N>8k(@wpq;hT?E*pJAU=$yz%t`qPomaFi3D*GAI?9e&EO6?o!x!E-fYv z1e~K(s}ClpShKZhd00QQ2)MHUtF|P3+BkJR#q7*asCHo5Kj`@FTpK1y*3MQR3wZD< z^A|kIuRJ%jP*yy$2LcL8p&XC2o;_!0z78(C4s}ub-&ogZ=n*Gk5feZc`C?)yvj#kR z%x|wS{A@Mn#F~q_tSeL~Y_rBzL+yP+^4;|IfuH|gn)*3EgmPefyx!V)%*^=dy*_&! zvhcTB?#D7YjmD^mT9v=?T&G4vK_e7rEL3R5eYt4W_wd3$p4^}-^B2sLz$RTIjzNTl zmcz|I$UsdOncV!`;BLl&Z~C)4J=Y;J2*F2pU%XmJWN}ZwJztNLDsRW&SDu{6mpU|> ziEgslJ~Y9vs=b3?9kw}-4-;J=JnMDquc1soX~`U;i6qXB*nTO}xF{Uv)jYaJS!TC- z;%lT7f&B%ua)ToFeLdeGz7O-G1b8wO3Q@@ao=5Lq*J>3GEFFjKe98H?RPct zoPXi>lVX*f-DS&0A_aG*O!8bq6??YcYD!g!jc43idR^#>-AjVw>eU7O!DBWYwc8l$ zD_PO3bI5^}dH+%NowJ|zZ6XZinx9pJ)qXtsh8o@5aG zi%ko|KL>7-PWB~S%D!E<1y|x@&AeW*m*UCG`%{{pUlk%U40z$LQX8E`(C8!SUi6N2 z&MS=I*C0}?gHRLNJzD4*h4`S{K@E?lja|r}639#PYaGa}VCQRuX3SktH(lA;rHdye zj&#!uDW%>J{Vqkk<~5-zyD0oAp#m$OFE0y#4W)ahZS*^<>8a_~yT;&Xxil^=t7g)b z8N&K8)=na>?DhtqRrvHEvAgB@FCpT5C(r!_YA9xhz{R9t?8pPV6x^WiC$1#6MS|iZ z%mTAZ`iUxW~ zR5Fz7_aKtMI_Fz3s;PK{b*j-BJ)gS&dz=xvH;0wfg)upG-;=E5K^pjSz z^BbkZh7Ui!afV78_Z@yqW{M|rX^Ppd`?#W?Y1US!YTaT)~?sLEZNTni=E(< zIyMWIYDFH#+7C_vf<`+f5*B=||)pIYT;Y z!d=x-%HA!)_##c}?J4U59?H4YXzdS&D`A-UWd*!^)8D?hx9m6maBoZC5;-?XmpASq z%S_1xavzIEXciIM=6Da+Km2@t-=|SQpp zvY|O#3pE@&wc!<73Z}#0wQO(YX>It@QEfzZ=bzuY2nOqPpY;^X2`Da^{A8hSOcCDa zD5d*-B}kX(3q$qzv&orjsM#6|H{wT4;4w+!O_gf3-~zL<7|)_-ALOEs3tZa#Q9Y8l z5yc9a)F}`%N>xn@OY=+j7#{b>Ol)V<8<}kb4G@~q=K~xDZ-8`!-leQ~h25{}VLWBR z98=v@;DP~3ubEVrj?GD*TG8sB>oXgF#nEq->?itMAhW={gKddQWLY6d^WNcfr5V#7 zrkO>%yo!>0A^&Zf4r@D!Oo@rW!~m7HVBUUi=v_m)=_6~m7H&4>3I3U-V6|^*sUbii z@+?g0>p)Gv(H*)KG72l@1qyl9Ahmtkcxd=jqsbpco%$waWaJpnM9cQrtochpiwYG9 zth^~G)UTcXEFP>r8~wYOBRzDa6tE7DL-vfhT?jU=i*E8mng?qDqLVFJw*#N6txR6G z<(C;)9of9`^AlWUdzS$Gy)}DB(HR@PqTTyVy$6pH4_2b82-#eZ57;FMP?LW~6|7Lp z<;M{>3TKk&ta7IVHFiCgSQ_dn{6%-=RCby5FC3G)1l;qhvOtnt{%yZmUiS>BTfMV}yCvuvG3)sK z!87?amAqR2(C`nNbz6!Z+5I1EYZ<=J+~h*$3=W^3uHIb9F`%UuAO|UBsp4{IHuhj}Sg78KuhH~q%BnDy5p3v5fFAy8Dga(T zMVyVfhmkVli)CLMWa=(0k}&BwK7mb7G0}$@%x}3W-wB^XX|Ia*xL1Bk{3AeGZkv|} zATdC+My*5X10%1+KVtFL4-7a+J8u#7STqBhQUA$8UX&#k*R$ja_*5Kla%inYW-}9t zH!6|^zJEJs+bZKx{jpA-xFwRJvA`w{rZ4wdrDCd2nNjlPW+tYQUk%B=$Y zyFJkqFU;gz86!V-3T<7cNrK%mS(=h-EOn+-FYbxgZ++RD=2@b@X02rdMe~`l$jPb` zzvZ)&GKcpFXbE2MRB7-2+E=yQvl#qh?9)%At`qvKq~oCS`cO{A_pXudb}xOJS*!AS z7WPyw+uX;D%JuYqm}WH&NKKF>2W)fB=PY-n zAzFYGRbFLeV}2y}YR(8JP%1hZaF;|>jA}desA(X8WIJoVqIE;KiDQz~C1o_1S<{($ z&dyN%!71}TkJ6JehJc;PQ}g<1isE7b*`eMctG%XDIP|qwm%|&w7P2O=B~n4f?#W2=vaGRhpaiWQ44ho)jE>1#}&Unj#DDA?@dcav#+Jt0x_E=z4us;3{9 zO-t_mO325{7Ol&g;q>;76*5K!7mIByINFG?3W;X`U39QxJhwVM(H|whg0r2X6LU(> z79`i?>}7d&XG*Gf)w3bV;ruX7k~4}X>UNnQNO1b6JuL5Y?$9;_@W!ziwtZ#gT%2CI zvW%*)ZZffB+~h?ov``Rm8A9E9&r*UmvcV?VFe#wYW!?dc2csN`DD_v3hNseY!{
@T-2yu{RW4FWcUA){E8N_LTR*@CAV%j7gl$xFc!ZI;zlR8kn@!HM#lqY2eO2 zOKq)(51WOrHIo*@b)%d=h=X0XyXHP&0=$0HdLrxy={R<6Z4S)X)EVl$x_a;opnt=F zM>0L@;kp{1*upW-+B-$c&3fjdm@$dDi>fb7Vl``Im+ZX&p$pN6ZJOKZ(R2S?%;prA zk_vxdX4uiTliSv^A&GFl8C>}OQXV-x6t!St5ZgxtYqZ>S+X6&H$Tw?8ADo1w3k~{~ z5I2h~l>xW7+@ju2tnygc)*}*jq1AQsSMH$&sip`bE)3!SP0Hc;Xy62T>!^8Bkt5C< z+<(K+cb^NHX`l&5pjnu&=Uo-C4F zZ(@|;*ylCWnMM8Rzq0ZKQA`jlapLO=X=?O3A4R}lWU^~3=FSD&zKHvGO0jLrxP@e} zu(%|~!Wc`uPDE~J>;~}LG@^gn5{?EJepKW8-NCc!o|u?_wVlGR`qLsr%s^MdOXE`& zg4P8}7^k6B=%mhVO}5{ysdAS8dUEDEf50uA>}YFX&&m4%rODs6^sZia@bBuR4 z#Mfa`Agj@s!H&CtWP|vjLA4K~3aP#Cw0sXt2ktov=m)<0A2wwk6&+=~R$Vp?4vmPL zRh;G;bx~Yag;%M>KH8@LCqtotgnLFRkZSaY8)W8$t>QKd98qMukfurt5xFC7F=ltu zHhyJeRN1QCN`2`aVaw3rCbe4)hwl)XF&#mhZVcnod4^L>*YnUguR4<%-@}%GDg02P z*vzH8UK73h)JO}Jvh-qmN=zX%j}2Ba7oJQ{p#4p|^+gu7Y}XEXC6)#xs{rpb0`Ot3 z%chz&8{OK*rLzHtfrNkM#fN|-1iq#W(L^~sG+i4V%49~EoP^f7+xVZS7bu?7ArS}` z6AKEwpug5h`h6*unf{x_&7GY0lctzI@FPKAO^jYS6XCv!USxdOG0q~nWSl6S(*M3I zWpl|?`7*vky`Yhtl4M)|5mscCLQdzg>4=GB2g#mgcOk8}N-UC@7yoT}T-_8u?u1TjUtGI%6NprG^*w-rLrub;)Hjzpe(&YX7 z={*+*I)g+JStJlC%i>qmY;gZfclu%AwBfVT@3-t{YSLyfq1YV3%R~u*ShNKq6QNkT z{UBD_rhSSpfFm_Ttm$oy78ghNa6`jKGB3RezMHWoWav2~dhDe)gUgy0HF z)=_Pe2m$rm8b~Q2UVR_e?t|*OU)jBq;LWbATSH-18Zlx$>fCU*X|H#Evw%KSEfEQdp+VV7Xfm62}ZiVFw;1|mE zI{+btK@Fxa@;4SgY6jjHtR;qq3e%2{6~K@un{O|gYR3P{QY!-YI>S8_+-;QFqv?}kxn*#$yB^8;06$_W8? zBwNG>Je8{(bTNBD1IJXAo~(}mD!RoUjJ7@k(RNq(w$*WSNa1I`{D`N$V=HKfi-mD_lcT`!){r=&gs@*ohgMIV+0uA}(E zNmT2*IoeKmcS0^NO+TihY~Yu)PFf!1Ffu%Nf>)8(h=LG0y@N}I+(~3hIb!pAHCLsr zR4aBNfRLVpRsGQ*9`!>AQj?|0;uN$97W>gr!26@`r-3AxL9f<7VHqB+uW9 zvw;QmNnWW(qhieJz2U87QLG8&{f=#14s_Ay6-s>~<1S!G0_S!u+(M9>V69Aj68x28c`#p@M^{7{`D+Nm8SdB8A$Aj$rDXGSQC>@XR+KmFTU zEHBnao*Rk|#s88q?^olUCfdM~+MOEDRPsRvji*@4n~*%F?}VzJ_Py?6-hf1EsIZV_dg$YZVceu(K150N?8?B*jG)* zf0F9121StRuBNfCq_D1Wm->0uI~mdqI*M5nbDLjz1P(g~UUpth1in5WK9!9mix-fU zop*kIMBO*JC@NVIKJD2LF*NC$yJG*x{}STAuN3%>OU`5OeL%EB?}IubXqH}#1X`U4jx4|@CCmhNpZ$mC zh$=qu^|w`mxCLpxHe#TMdlat|lisZcEX{^Ire$M%%G6=5Jj~9sd0^Tv*JL9dYpl;S z1L)x?0_b(7I?Tjxpm$z#>ZEwL>np(S==|UAC`r0SFEhylzg&(&mI-#Y;oPE0b@Trl zwwst}dWn{Ri^#94_qucccaVr&FhQ>i{0w0rBKI<1fhfyT{xToI4pl8vZJBc7@^Uyw z2yhWvz4H)<2w*8@$0ljBdr#djik;w?GFa$LQ#l(VjZHNjU2>&(t%SS}MNrt$dCpVp z+$nva?fLG+6@x?r*Al1X!^f`(WmoOC=k>0c^SjQ%Pjs&h=wUO2*%U>iqUK6eeK_Ec zvx(EMcLOgP7FdDI;)4788H=X%7%Pkohu8s-3X@fZBVPRr5an=4e`jBTWHAKT;tTVf z^?nZyvidfrn10IE>u}d#-K&p+Q_C;`i??9LQ38SWRsZG6qbMj^FgaAHk#f!zqW_qA zSaq&FX0LE5+hR=T8?%Iy5i{cOBSo^zsU5ODYI^-X50M!hr~7WwaSJh}WdVeZI^|yQPv#%Aj%ASCUD*yuxq#=z9UCptW$EBD!@QgSy=+-~W!J z&oPmvMz0r&p&z?|4KfxElWMOfw%a~OE+^!4B8Fpcq5LDED9>(+ZM%9vWfPwK?ZiB1 zUQ2!w-%c!Q2FJte-~o8CB@;9W|0B&tm5&2ua;V&5!^DOl(rx(+zl%wkVb&}HIjO}^ zk7{ajF%XM_hxP8WmBT~&iLd4z2zRkH5KztP;FC#79^W=$2tLf=p>iDh_T*3ND;<~Z zNzt(6CMk&$dmx7?E*=k#EHz)IE7JucJP=Z$G$~&otbyB=OSD4udT z$nK7F6W+#@2VZ6g6W_+h24Ak!yeM#<_gEO7_Y?gK*NO==~zodymK}K~BV|}MpkBT)8 z-U~bs$$WbhrnukE!5tp@A$FMVK1g#B*~HN8uyRMP)$u%p9BAYUFh!-iy8*@R+10b- zO}S@eNTcjZW7riuVTbf*%nhI=d@#OC_AF!Q2nMIeIirI;@x(7D6pc*$M)`lX{EDGqIjw(0)x zy1sl)LSXfc$F+T@>&FiR2>rvlxV>fH37Ci{74)!n*m~XHnCZQ|(Fe|Dz!c^3UQA8R z6j{TOWexO$ZfGJY89e?|hf~V-xw~nleR;C-{j!lIZ>%9VF?usTS_T9W6fxeW;}{83 z?UW%qn!1*qi~Xbcvc?|kJ785+63%|>NO?F_@}_6`G$+V3L$a5~8wX11S2!7&dEZzh zZH41Nwh=vgYMWL>P+^pgis=Z&*R)N7t+WAWXZlO`h)~(jdXx?CiUL5D(_#LZhH?tN zreIYEB896e+I&gp&RSxFQB&?pYSkLjk0|)*p$fctjBhsIL45*xLBDl+k4IRQ3C<3f zR==~ZDXVcZ+!ZrBS zEL6j)iR^$8hf1l?2fJh(I!iMxxU`;)G(jS5os;gNp%eS&Z&jlr&ek*Ph218igxX!N zakaFZ4eFTM{eS}7?7F%`BMnHoYH<>JXR)e&_f2?)x}^pzQ!Hw&~98U=O5!bfI4UZN(z z59tdc(Tc~VnI+yz#u1tMC!;C%5%$4yeEK3&d&U$<7_6XTLP|Ko=xw=zPsT1Dy!a9_ z{~0ZlkZS`r`Do?6P0K*iI)>SE{W&qfMTP4A@|APltYE9uk@G@rQ9s$f7o;ICFa0I} zL!fH5*ZMOEUe2zC+;LcIcad9>xM0SVPk8IW`e*W_k{8pn9<7Wob`Kl&?;zZ5DcIAW zR&rxND2n>q9Rj*{0Tn|DfkY$L-5cuF+FTNg==0e~;9W6hN5@$oa5LO|tD!@^f*3g5 zKFcl|4O>x|H-^~_yG`f+3$j8z1ssdJ|BZ0q0{O-?xpH03frMTvPhL=Q37R)CWWQ}h zBg~#FQzY|t}L1_QSIpS%$E-yv46m)KRZ5oAi+!L)xVLwpIixKrv>a7Q27f%to7J+L#U$^bm;TcHa(fMVqo%)eM!k+75fA zUe>5XB<3j!7z&2d&%g7;V43){|Mo^fgd7}W{mC%3}D>WuQn zU)YSsBPleWUVHDN%07K3*s>CtQ9HG}yi`LBbIBPi9?cG@u_y}6{?KN-Z21XA7rq3w zS-jvqrJf`zGg#NPF35+a;yk#@ln_y&l3=9yK?*ZO)P<7L26q!b!01TSe z^BgYohqhy_lgj-O_MU#y#@g4SrE;||n!-qHMJU>I{2OF%bL`HctH7CIc>k?n4^!(S zR~1faroYL`O8qjbegSInb?c*a)Vyp&$Rc$fv&hRKGeG9hh?Wxb{7Aw>o3YoiV7eOi(V@`MQ6`r z@kvQ+%T>ddoIbn`S|%{I3}^n1_H(f#3ta*iSe`}(pE$ZXFn$!fX73)$&7jp7i=DGu zrEG?f*}oGs_L15ZHM5)@;Xrx*C^{g&8<{MQPQBxw+&vkwsyZasKhIf$rpk~(PR&uA zRb@GE!b6#pJVtG$tZ|GT*wcc_fp>Z+;F1v>evJYN1^u#rp)=X^@K=`m^C4Uysk|X+ zC=CD0!$X&z3%VjnSBsJuhzZr-sYU$QWHh&GDo*j^w$L!z&Z_eeSYd6b=D3zrcP&bn z?{|IOH{+j7Hfeaj0;UajEYee>#el5ZAI^W~-hmwg4R|SA+x4>w~?3-G?QE4&F zl&V_rW&woe$l>rghTJ=A1iCl+W0|Bv13g%P21rH3$N|)UBfNtve>l;m2)O&UzUEth zf6W^~uE6swRu?}i7lf!~`thwH;>i+@qgFVtV^nxTzPtslk`>$*wAGvfqQ)^SQ3}me zPbC&X-xiiJ)EEe^7n9QZ30Ucqr2jLMlx(8a$GH6(Nx1-FZ+$CKI$wOXYj$%nW2(Nj&s-Yl%Y8Gl5T_PGkN_oD7`H2iEJPer#FBPTx~BfM8XHW%V7_AVN?z(ipI zs0bRD#7at$b|XO0?)Y3Fw8GHd^}R#s#k)dgGC3>j5z~?BAru%hO4*b^WyTa5ouh85 zq$x*l$m%<}+&a!64FRt*E3ws&0{F)k9Vp_ts#Pl-Z6cY3+2ZSY@}=)9cA~Zx%JD)u zQMCeQ5o)_je5X_oAO;yi9zT~-a@%5zV1!{rOb^&*2Pe7ust{_4E`4e{z8+1>1!J zH4d{*YEOzY4fY!mnB$PZ8=~`bThFUGGC3pQh(@QQjj6*+X+njlMpCkdirsH#uNT^& zJ!D3j68UYk{^jLJF7Q5R-Nk&l+34j!uX&pSuUoB3dx9m0>t!<_ro6u$xw}Q3ZJG`kLZa?C^X~S!pI}hZ5lxiS{*c!{%6D2G8PC^}lUqSfzv_sm4 zq#@J8LR{vfLs~Ukfz9>PbWQBUUm`gL(Hz7}B5kL%cfpSOvT+(J2UNr|5kUkdS3F#x zI2g0IkXsO&k`-t7aUB^AoK#=vM?!WsfGf#VUMsRK;u>(bojOeULoC{Z>sWQ*^6uE0 z{wi?6`2o=9(T}KPxLcOKz6`%LAP(Zbwd_eXmi!ypm_`P?{zs1IA`fuq9~C{D3m67X zUQ>X*k{U9?BS+jj!o%Ja>caB367no_vT(11nloxFm1>1eGf)`)zfF^p^b0n|PxRiQ zy-)LPc&*IA4Vv<}l8N1&`>*|x|>TKxlKZ8RP~2RAvOi2Y`_CXYAJ=nit)i4@5U~UOJq|--x zijWdC*P)9R`zHbCC#Pn)Jlh;r=b~l=IGk~ogA;2yVta~M;;}3A8Qp<4HsYnMZH;#PMoTY$_btF8Xl{dEMC?)wR ze1k)OSmAXt28#nlp0Q<+$XL9gG&_#d+6O>eTN9-RJ8&E?(3Wa%c5EsN{ zuJs@lS3LSP$$v zE-Aq~3g}s*BBi(?)uJCsd?-E2eDUg%+&a}gerkS7I44g{a&s@=r=6YY&J*9J)y{rH zS~^~jm!nJTjz?f4ouhO8r;ZIkpNTR{TrrAAyD_Llq~J=V&?6`1%r!tB4j*?n z633gOBLAC&3T}(&J}>wK!R5ST2ht*{0qdaa4E@3DaaR`+qn0!U=LPksbvK?F#ozt7 zdOIULGy@FDDQeC@L6(`9o>U`@W!9O^rZs(=U-Sw(Ww-k&5bwu8{@+5M5b5L- zU!R&Tm(cONV$6(+Y2d9ihyQhv|Ce`!qKVs!0w(v*t%Q`Epp7+G4lnHBM3W0r&?k&9 z#*KG0glEzpi8Gvrao#YA63Tc}2z|C@78H$`JW-L+S;;l`}^IVAx44#hYw~lD#v6w*qVo#l#VnCTo(`aQ$sk>-~8ZTy%_K%e? zsO^Mwuxn-GX~G*iO58sFE2osWCG7Vj<&uJdo{A?ot9^o|&49?c;H`rTI5pU4jG4f9fqUIZ{lg>ch}f-ZxH1EV36|3N4yZ|br{Dq=*X4yJ zk0XPvSxEsh=Z>X2zoIToGkvbVid-_7?QO@xQ$2QHNOIxxjJ`fq{6i{!$19Tn6*h=M z>`OFkWUo7tUkzd{6rTLKWK{BncS%=>Vm4(-Cm+|{Bxe|d$IP%Zo zMx>u~p+}$uhQjs}?gl&j{KU(vV(8a?=QzbdMnHeqa1H%R@C^VF4>UA>Qp%&cp>f~w za^YkZEh>q_=UA#mKA&*C=}aSO_t~8LMc2O<<&ZbWfoaO~7^kIg5Tqqhl$a~Rl`S;$ z_m?S4uBvDJ|N&!hM(kSlKageeN4*Wm2^ zF1JNNc-WYc@rSulS5qWa;l9%SPN#>(?i}wmS0q!9HPc996|wEbQM|T$bique^YE3R zO8jRNqs~8y##!gBL#oClWn2$ysB^rI!@2%vg2EGGZ~ccerda{6U57I*+`HFQRPDN5 zQE6tQjaPTK_yl_zMqRXs06og3Gojd2zmkWC$)dN&Dy9->W-^ju7IuBKNdzdZsFG=# z9_xOWAvP2Fm%;hlYZ{M`4o~+6$@Qc_8`;4M#(6ZPFU$*hPA8pqbyt&a4#ai^oHJ!2 zUzR+C6vx@b%0+7Jqn495Iu1F=?@WBMi6xjsj0zyFK$D$}vWZ_Zplqt+-C){#+=P*M z6Wgk_L89wHZsqTy`k#|oAd+4aR{^E1BWc)2;?H8 zZ-Vu^HP=5e|7;_yP2s>6;=UH?0BVs(rPwPasV3M}eoUSY@F~FB_Cs?GzNsAyboR(j z)`tDCHM=9y@y<}8ULOk5ZAk@JpHI6h`Ngp3K}-O~rKR8f_j<`C4D-3*M(Zk`3a$xz zRqBG#O>HoIl8JZzym&+pMWIFNA80LDiAO|5(%QmyvsPg9ii55DtrYy#gw$FUg7)L- z_%CoS(;HltUbn&zOPWS&YMh>Bt$JCR3f|#Z4J|>-kx&d7K*s$w)pJcIvHS_;2maIy z4f9656(8-OHY7N@Mw)&9hWvkOvyYwt;pRHr^dLz_z1Fx!g zJQnI7Ym0wc)1(@kkzBbWSGIT%-Li1~Vzv^^7z-2y{0E|Ml{oyrDK>V_%y?W6h{Ch) zSWLv4jYfe{adK9m59ClfiFi%NT(MFKyqhUcOd(=L{!>A9jj^UA{qXm40S|h2D2hR=4`yB*fzZhaI>SV=1mw4~O1m0p@pI89-&oV_wmmz8DX=kqjQEx`jgX4#lVlu*72l zOq<2+1}8%3;Z@w)KiJ@ye%UB>fJj;pxo}(ft%VlCK=Jb$UZegkN?m+zNrCuqCcKvU zviv*5l3bJ#1sbYACI6bE;cNBb0CBYKQ`5f`Ij$b~Q3x!%JY4;YSS&%wND@rHdFG+83BQ2W(ZTWqrq8ucvY-4It{NvK0aA?31$)Dv@d6mRXfvsdrMk@Nl!V^#JgN1oGW`-UfFCP@GPl1^*{SmJ zslGe?8NZEi?S5%b!=tIOs&W4q`$Vzlu5kZ?r`^tFH?n6Ur9)CTTjTK)8<2c}l<{?0 z4fT83GK^>j%_`+oXWy=Q3;;=y%k-v!pS4);xnwA6e+Vi!*ZP28hJnF0R8`d9N60&% zWk3`P>+&_Zr-7dimOI{168l&C zu>j*D{(H!&|LN^=r?~r@@-)wYs*0{;)+iogkWSoaxZqi>6nn%6w&VgT;n2e)veIM1 zz=Lyw{D*~?FR%7*#DVL9kL#Omhlhdf_i>w3z!RRHFHo8+VJY+j+O z({+`-dEtktoItR2D@GuN0`e&%H=Dnu6n+kIQ}B&jD+l8EqhvyqTYoHTB)#A38zZdx$4GSzyeO&w=FHzkD)`fvQBaKE9U zs8lPV!DKYR(oXm{+4@iAY|f!GA&%!fqu#nLyn5KO$WZkT&({GUKcR>U)~VA zvA}|en9NZ4&tl6+K6Oq1fxeZ256a!q(?4ep|HqQRw#^;Wz_Y%DHL>2orVC1KVy&R-IMSAhySVs)>XJ zz};OSf0}hKf8M?+f1Mdrd3ZWjeTqC*vDnxyf9)MqeR2P=k%Eq!=qu&{5n~rSEUgk- zP&8r21G2q4q`7J8J*B)%xU8Bk0KR>+*fZ<8;{ix`-FTf1GurC?LK1a`h#7evt<#K! zhy{-R;yfJ#0A+}3G7%+8TJ)&uqwH<>tH;S=7txvl@olDe0l$MZ>v>>eJ7?H{~y@-i}YsYz?pymXh?MMpR-}RPQABuQP`L-RGHs$;GM4OL$eh zLLPxOAaE}1$VzV5;_;wfN>`A|M2jg!xabzMN*#veeMr**CRTFg)^t-CC-3MOn@k)W z>~IK=eyH0khL0oL>WtwAU$1}m*F{BX@6={VO$6l$WqV5|%_)XA38Q9dTte5`X50ml zJUu!-(9Tyrlur%n6tZMEwR(QxjquRFG+M1aOw%-K6KF-U!vk}^0E5e-G7P%_I{XJ_ zmUE5$dn9X|!wIiDf16R66U)q`_pe))yJ$oWVatm0A3ypU!>zjo>U&Y`|5ioU$p{bm z)PV2Co^JtX{EO|PBnNw7Qm&b>kx~?JtTIaYvvfD7Tcp*J47NzeXAPYd(Kwk3+li}U zVk+i(6!`Pe`GDRQK?^>ch+mTUF+(8#~{Z{bMsoEDwBn0Y9nineE+lZ}5c}%q}gv__8Hv+LA zfc3M{SNRMO_pE!?^W5^f^c&A0O71&13`N(dXJuz3x+_x|b*%s8Txc8uF$sgLC6Hir!{#rM@~Z@4^+)-fuBLu;wX_p|&q@HJ!v7VESHw==ku_j#&V2|MH4V<&p0YS{DI)lL0di|yyKuLvw&iL*kF-ZQAAMc%%RFM zb`^tmi2|1HHg8LpDZ2pNgK0KB}I&+gxX(F<|B*Ir+vv1v{X=5g$#7z+In z>O}p>>X_t_X#I#M-q)KI71-FCk>#?8z8;e0{IqgB`!U{nk-%z5+&6o%N|3_kxRGus z`5VARg^|4I`v^5CB>IOXNh6XcBkpVIBtlZ6kW}W+qZA^Txkd!b$Ai(X$MnI^CX{}* z+N#QBbRU09zK55m69y7Q=oC0m0<~M{)H^(7uGap&l3Aj8{1fHp5j>BE;z1{_98s4& zZNu}WbL-A-^VD+@`_vv0J!JlEuOeFs67*AgbcHIY5Ntf#%G%pcLbdM9cd>l@b#U?%+SV+Ah=4;_cdqf*Xzq2LnrGCe`u;n z6#h(yjL#cHT-owWxZ;!gq=ka#vNmR*zuH9uWV0}vurjm|kgG{%FjQe`&1x25Kt?Vh zZ>hluLufEWZHAjik4-aV^FJy!EEk?;J|;;7jJXw6Z^f{}9X$k;8`6dJL&y@dU(VcK z*W5O*F8q)?ZhW`yTyf?_dy~o?%-=`j4Pxv=)GQYgP@(cLfOn=;QY~4AybscVXT^)XqT(Mn6yM3JS zZ_T%i%?qcJZoZKOU3g){UfgSjv21BiMgb@bqgGVIkD}tCowt7H^LOu0>b^BGXe$WS zvb`T~upX8*3yylH&S|Csomu8T(TJ&pd?$qQ2NlgM9&9G4J9tWD?DD&h@&9qQhqjd( z^A!`5UdwO%Ac|)cR%pbRx`e!a?YHU$!BYzrI(bnp^*4=R;`SqP+_#%n5*(KuGcZ}= ze*=1TN6}JBJTHDFV%jK^&()dKyl>+OUs#+x0tO-zGrs9BF@X-M?Dm>gJ-)6q$KJt$PHwY?rn>M7D4wKQ~v$Z%39v^s}aYS z|2fILCNkssK2&%v-Pe;+@heQQh~XgHh)7G}Qpw+xE++2FyMJ4SE>VtLkhUZ$Q=0i# zVMpPZ|MnBFxa~!n=A5q+4Gn{46pLsJ`_cO}X09pUzGBs61kl??AtTMli^#}Igg|!{ z1!+z1VE=<{bWgB{O7pYL)K99s%5M4l2K|--I$kg@f)WNa&7; zlJmZJ97{=`{pS%ryt@)LH@%Y{2*ju_G#Nf`{D&p@507Oq>T^ z89(Yg*Kg>5dUo>v)gYR9yhYQ5S`y~Le_6O>#>o{-e6M-F3IUW0LU1-AYFTOq>)9;;V?|U!4_uWpf zy*Y0e7w;<$-H|NwSGRy>GF-1uo`EeO%#cV1P z?&6cH4UI7JewIY%?_* zZ7+gY+R!o08yOR48YKGqgB-%rpwO@;4X;-UntdP6yp}MO5}Na#E!o?l$e{VLRpKe$ zS9}d-A3$Q6KLx3C65rCI7$@W%qqfVR3%kGDn$;VFt-sint_HVdo2BLR{XSkjKku@5 z>$A8Ok--Vd$dni&WJAIN{nCzAFThR=L3$re?2@inhiK;V?fp$C#@U*_r5F2rfINUx zXV+xT@`>>mKTv6BAG^>Wyo2sqS=w%vW6P{8f=F|ipB2AB(eNd>xB#IExfM$NNtA3_ zVv@p=vi;QVck(oQmu6G10V-hUFM+$UW3+vm_eDkfBV}y6-&%U;ASV*4tI>8jvUaSk zZ~psNHEoZLhLK!8mTCi!atX+4F;k5ztj{WqugGa)@2sQPT(w;M?OB`v-$E>cqqH~|+`!LoCU8({q_GgW2F@O!r1NZ*t}ogx@|im4c&fau#)Viz1)8YOWPEi9UkCPd;FMs1PA0Rhucb)%8M(n!T|FWX73kJ|gm zkH&ZTN`G0KnD=VQ&DSqQ9yh*1-)|k9NMWQ(`KfCTjy|#sS_D~eqw2T?@I9@*Bq~l% z(H-K>|FBgl3J*gzCM3#D%2xF4EcHm9NN$~Y<gfWIR zL_OBq>e7>HJ<{XitwPwcMC@Oz?UvgLCRH)D`0tu+wgL{Ulk&K0N@wkDHg9#a*ja@u zp8eh`mWjY*^BOv_sO1S$TgJEe24sw-nqj5wZ8q&mc2=+}M!%;Fe}z9!eamsTJ6&7e zXco+AS9UH0vEZ074IPQL63%`_JbrcQXi(A17Cul-2K)*sOVGYgf!H??)dxf-$K|Hv zX;OArni-Fb$HjZ-MVmQBvg@gc&-!RE__d8QMA%QfrGf4GAo~#`m8Y{mMcbiKPUEsq z#S#6JxH{SYcuP0B1@{j^dB1}UU7wN})+;=jvFg06kRW%jrTe~ zVkV8h-u`DSXLOB@j0&JdVO3G~#SrEqbXv0{2=51r{T?X2mfYfzV}x?YFh~Zwi{&)r6E+r2;KZ9UWV|m;eeeb90c%@{4?S`Sz zJRxYyl3zyAU;ls5@68WJNZ=ATBc&GBCaO;sHWm;$Hvs9-l}M#lA!Igw!skblOMzIPD!qhpR< zDid8zmW1Mtn$fP3i9He~3l8{98Ib^3V%PRB2H^x=( zGpj_Rw18G!?Zgw4JDyAzh416}b8NpXQ%+ypnyRwj(rRO(+z`>?sY4!fb%_x3O zFKo3KlFshD^mlyb%K^Eae90nkoF5(PF|7@dl*|Cb<6Uf*ehoT1E~s8kaJhl35Iq*MeUYqsB^o&nLorm=ydS35No8-MYUisxuUscKPEnm-8`*PQ%pW%M zy#jvS2TiA}%3ZGub5H85zT6od<+)I?akVUQg89}JEozw6L%QZWQe`YS5k0$oy5=Hf z%eTEv*U6LnnLG{^h@*hIUKHHK!=9N^l!Xey4#Q3=xzOLfoRupkTp6<d%PSa&UGfI_vu*+%T;A9dk&7j*BP=!SA za$F`bF{MR@s<*yEmA=XPDN#Ftb~`ljzTt%C3o*C_ulOV~L$NW?S`8RDl!9}_T*P~K z))bq@BRz*1KFK7xeMIvdL?MQGSGv(eDPdRU8v?X?)LunggKWSJF&QX95YeeL&7z}kq(MZJ?Fr8pVdc}^=$iRyNn&Avi9X_$0!sM?bA%O28u*( zwjj~|Al)VZmI-D!+bq_}Go#mZ$wOZ!0#GRFcX67?Gt$mpHqsniai_NFG09?4cXWS{DRdhn zF{+;egx)9Nm-DPYUT~wGBogMC!((W7F=Lqh_FJ|=$nPMp6JXhN?mW{%s>3zIvB0sW z#Hj_HqR4_W!wsNg+T+Qsg{|iVG#i)6=0FX%4YjCpy-X(}12RSjYDeXyQ-FRIa0mA2 zcTw4h98-$QB8xTS@Y=51o9cwBPkLy>$PG3>s6WK7l06(5cCsG?a{uzSWAa+arN$;f z&uB$jSw?Zb$rnPb(NNvqGp<57&*Wo7*-~Z)bt;jm5)J9<5LWPwpRZt#=JX z64|SaSCREIf6p{wQX3W~*xm=bs1S!sJ;T+QOKGuQwH?S>-)|HVeSB397<430sE<-# z)il_XGHoX2NpUi{#ou_PGu4?j1cXu! zk2^hA*M$D=PtB7=8PM{KlmHabQ+F&(+f9|Cb8l5MO943XV$hla8efjB`xQm2FKe=C z#58|Z-)(3%a(JnKxsU}N!S@g}e!S=3=Ol$cIlksE!MBvjc`0aK5oQQ8-G0)4d>dNr zc;RiM87&0NvdcgsrQ}%Lo{F#OWG4}1jtr}-kGY49!twK|qLeS`6(VVSFdHy5wk9N+GZ>BcTa=N+ zPzl}EZUGb$}c&{!Ghyv3L2^{jXx*$Fsn0HTJ41cHjGZP}_NbjWGGL(DcXQ_;lx{UlFDy z5^S{<-vp}DFFJI1yk*C6V(hSZYv|VWMZCK+Y>%E>%8HbrUVx^NaKK7xyU7_NgQ{w6kRp5n-y16T{VU z;e(^hiK%;G7)81s%eg)yvSuwgFsIiTvY-DQ${crLdoKSFH{oZ9wDG}W;he=LSP%|A zxA9VZuO8P;-%Mp_cm$K6Ka5A=#Cx0?tXpJMNVu*Y{+br|Tf-#j5CleSDR-}28E!s86nq5l;SMvAG?2x``^N`FTu>gWh}HBdF^wz{lhRt=9y z_kWeW+j+@DGztjck7;Rr31^mTG@6uJ>Y*7yi}s&RT zLr$vq>?C3!5v$uVJ2Rk71DN;jDCv~bs;5!SA#J&38B#e#&W+|dA>}rfNL`|AL&wthrc7_%*OVJ-s|At<3 z>@Q!xi@kI3AM{=olb}*c%Irfl8&of4?;?eld$K4TS{|!2eTej4ki7}#xDZy)iG3Bq z;*lv$1nMrJWLSvOp@%+WfV!BRx6fA@K6F_wKJ2Gn+$Q@z7REjlCp%1>ZU%j~ymo{e zZw`X!iTf$MC~yBcY^$jcg`#R@V}De6T%G86d{icXNL0qkHEbkM!FZ?6NYI~(hz&@| z4qQU9BPg+w!PZzwD(7y6R$?6u-+EQDx*v7h;H_ml*c^EO`0?J%dt+Gg%Wf&QE}Y9O z0u1(Y2Ef9rB8(fOkRkM>Q*Lx&K0^zkKG$eKcYL{Jb}jYgW=C#8jhRt6YOA(BWJ3`~ zm`?s^X(#s=;Sp&VoZ^wA7A{gP`QE~{nm=_Nbz~*#ispD59gLzzGCu$MK!0T9C^LqD zfQmVj%oMygE)|QO-v|0>3j_Fl^-eSN$1MtHlUweqS(NuQrso*uO;zc9y}-;WocDzE z$g;e|55iC%=I?a37d)g_DiiG?X^FY}aYA25^ZT`-t+HXwU^aq(_=S=b!O^a_xmS9S zl@*<}m;UF2|;~Ov!pD-Oo8Qy7;t=x5D z$T<6x683Y=SkPg*mPj`I7^gS)oy%7RVPjiPl89b5>Ot-^7kU%8TXWF|MlRpyOxsPE z#oeTNI;rH27q(TZTQnFFygb!f{YP%E-$(oZvf&{ zxN@o?+l+FjUFvWH*)}T`4lKpIM;s52w0O7>tu7dto0KS6x zGge-V%5sn2mG!b?U#zDS_d#F589S++dK~LT7w&*?D2?5S7DE5q0fo)Ye70*mzOV|y z6M^sJHJ<2~$Xg)zQw~QmG4LjT3~?kCvoH@%8d7UX|94g~!w?Z2)cp4H@V>=kg!e*i z_*iADKJDyhnn)AsXs&YI3ge_zqP7vfT!{8W6+=PgA@3QC3kYD|?86)w#2mT8*Jwpb zca(u27}z9HSf~^v-5Uu)?Og{OlwO>juMs{nC zztm?OK3K6(^ z)@hx$ZiKfzm&1Eab#)L;@rRne?j=E8RzVJK)l6D`m{TTBMA@CrkN)XCn!<@%bOG~2t*X+7z;eVu_ zb1Odu(Hn%8c+YvV+J?G^4P;B;^ESy(O8B=v-2?X9hkgafF<1pw;MOu5XkdQvgO>j$ z#;sCsjNeOF>48?>!v7h22e(V_b%3^}iX}$_*N6|e-AZ*1pf>}5>65iyI$nc^3Z8Bpuw`UzxlH+_#i@~eCk7WdeED|m`VkOC0|8ozzKl02~tOC1Lpsg{aNGjIu`n-2AIiDl)xJ&^;uxGjwkV%%DWtrGP?s?t~1Aq@pCO z_RpMVyXG)C`%QF&y+#UqJ)zA0`u&qHUAYDLRF#50Sc+FS-SVZB9Rh*2)&oWX)xJbjXB{h?|7v+P5-eCwFd!+Bsz?g?Cl2~^w} zbbiZF(CY5+2o$^gm==vheR>p`n+dVaTujkSH%5V&s&b9h@XD>}WWxsb6T65Bj1xOG zO#!tTNb~l0GLTW)_L>Q07w(x`c*-P<4$)-}ifc@|_M-+5afwP9B}s2xMCBV7SML5D zG~ zu@^9+va(Sn!t>UKqw-#;B0sTrQE$mS8imjrcp*KcUvY&ES)d#(kyw!Spr37^fJzc` z(N;ZBS?&A6zn=w)^Q53Lgd#zC3>6dDY%SoncCLLb@$?U#(HLX;d2-v2HgucT`R^At6i|Mhr&r6U=ZH zQ|J$RvY*2DO0K89oAL*((N{t$5(X6!#pY_0U9?7df#TIge=)r)OBYEU)ZDVSg*sN+ za!@FLMF_HnoMQ;mI89Eo1ZhG{zJv#vSnt_|oUHogSh ze%x;sy5@cyQrM*WHqeD6EB}BH4eI-JGz6+~K?{K4=hn1^TDNlhiB`s5=ctr#x7hAP z=}GbKM1#LodW$unauGB>7kXjk`u#5rY5y+`Aw}q{f@rqmLXAEAdKNQC zveHjUJ@qTES%=+UGz{r@&J^|hcYNDke!swAznZRfS2?dH z60{LCFBRnMP;e;HOiPVlAwu@S1^88%A{g;(QHwasjdF$*h(`&Nvto@bGxin&u7N6~ zh5!mxXE-8WtbQeIE^G;cXeep~O1moBpUk6iXkgj{ahC{aZ*?wjXx1TkCp;tIoR6Fd z99-1P_^((MVEDqoc9^v*vdotwKK%7Ce(2jv=BWoB+yZE8b76WOy+e}<^kn@N&>gal zS)p%U9{E_1bC8uwiHmNUnN5os-q@Rt(kAowYmkEyMlKVk5E;-4gTO4k9L*cR$eqi+ zWYhGV5^v!^mcDBH&AOod;mc_(mRY!&Jz2KTi5OFJjKKIa`H|?Iy}rlVNRqBZ;RYWN zFGl`_G*q*oMYzSd=}`i&1Wr`F#AZ-AC`Ro*M`em)39?u_j@X6n=MJrODY|Y2m1+P6 z9}{7(7ZKgb%@@ecpJb97^Y97h@9L@Lp4DRXV$C;L@MSAVPoyU#asPw-|2sF%Q8w*7 z5mFQa634U5h|y-Zs#!y$;<}R~8D$MKqv4>iW)Sp|V*kSN5{@NV|F<%h&X6~kOebPF ze5!R2m zg#5sa9;+MhU=n4mB_~>$+0SOP&D?>yj=qJ2%YqN49XZMD5H%q=Vn*lrnU3`kePy;u z=_8r%o_qNhup|se4)4zKb8D2H?ONus2<`})P?cRf#%1pJFMuK14{HI&kqRorhsmNC zf`m0gxvst4*?aiWv+G11W9p+WHKv*8-5qrJ;Tf;d%msFi)-zp2*Pag!<>PZ`NmItr zogLP!2OPQ|;jYH5`c$I@M$^76*i1BH9cm~e%m~&*(05@*f5m?{F)9Qi?T-Dg4iZRenx8igusv$U9NZk1H`q%ART4ov zitvSb*b^9HO@DJ}%+zqBP=p`}fh#JOnuZ38i<(I+d@c?M?F^vwi!_Ft;evvv*^?Y& zWF$-vRxZL~PLJx{b-~m`+#hyE*<+fa7{n@SWHs1RSGphBgQ7K^p`*;}n8lzKOpL*@ z;F==Hvfw>uO-~KytgNzIBevc^Sw+XiXW>8vbunczL)G@R*%@yAn?u^*NU=_Z*r501&5zZ<=+U{+;)m03rrAlYVO};Rq z(LcW`l(y+Ag@PO6)842`on-Zer(h#)f)69RywT`nSPTK0*u56W(isuP8EuM!om2f@U_NwTcc#fI3kvZ?i6@_WXUnu%8kMwMhVndPT&p>ZR zVw>DXEQ@RPT7{LG-;CQVM{zm<*Ny}WP#D2pGL$F!gHHIJDW?vXheaI^8L-Y@I#@f1 zA4uHDI=-y6Ual8ZT{@|o!7RjzNpOwln*PJO`hken6&FP%d!4w7OWLVQ3lr1yP>c}p zC^S*U_TcAGka-VBQIm?klR#CH6n zI|bQCMs(T9i8>S|ShzfmJIW+v*ZZmxZa(oh&qAa3Q`T?&_ZPOS_3*6uD9R5T^ zFq<}Iu-zzcQF(82E}UK*__-yWN#^gryYm#VbPWkE>Sz(-m49#nVHnduNx|{ZVa^kD zN^oTTEdU7wC2TTP7|5SKFapJ;K$i&blq_<6i`!I%_*dJpfIj3Nm~h>%gYu7$?w@B# zo8MPETovysjA&E%&bE=hBJp8%5LnXoVLciu?`-2N?_{r}hF_IbInzF>2c-LKc*%x6yOVk?Us5bGOJj-c0 zccC4@T&a1)w`16aILYau=N9tpU+3%@3hRb8)pg?^r2sph>$R56a9UKVgb~9!^m$PD zrdDC54#swA3=N$H_L&dx6RC{@>q0Cs!YRElN`L~lScotV9m&a}XCQKc;akS;A2Vb- z@B}w;8ik#0_TtE^JI=T%#`=9yL~uOS>ImZz;dkxNVMScHGW4EvUF&}WAwT?~!q+%n z6Z?8$mDF9t{=MxmiO*)pJUEXkGBp_}dxINc&0!Su*OZPC->8)NCdNwbIoK@U zLBWo!{7kTkiMqil=xw7_T*dhkIb~l^9O=JLl(v~F^m19VdQ8`9x#_mkC90Hbp@`NNs3i124#2EZ(CCL_#-Co0ONaV}PyjHD_;dE0Mn4t4 zW$Lx{1+>FJUBs)xO{kr+H(n+X0I8w(sTie1V^}{3V`BJAH!O5l!{>Ohxfrc7IadpG zge)va`^c)F_dS%iy8#A67=(NxljFG|`E!N=NV{cJ|1n%etuu+jnGRQmCB+gHlLzt8{=$qd)8jEXXHjfHU#bIOBL&k zI|~_VGnmIzP*O%D^dkTaHX0#Z(UwlHJ}?36LF|p;9J!!;*(DU<=D2VXV(Y(HIFrQ9R{HWe!}#GTx2)QM%wr+S4=-je$Jaln z--$L}EL<;A*Gxf6`o9d_GK!6jzjO5n-$xf7C747lB7Cj&0$GDXYt=jiC_^RX*?Trv za#HY=lI!?{;Qgvb08)6G61)~6Yn;j93C~06BO_Yoe038Me3RBD*<^O!UMiu<%!XC<=q;}OPyYnAa)DX7cZ|@f+}8bX_ArXRHZ=d}e2Nc|q>)FCA0j#$17{7n zex~N=XY0WI0vop_i-4vLh>Bkf+exR|iAY2E0aftbkDj%4x~H?uhn<8uEXf~^7n`NS z0VI+7PULv%LxJkRq ztVAx@9_hsH8_}8~>!B(Z_0ukap+w3PR{n&q6(cSjQAx5?yxGFjU<)h!TUtQN?*FgboM-_$N1~}`RMk=eJQwvR@AXuh9CzvTF zzLk~?mU2ZCw@>LOOEU`Az+cz_!>A6V0!)YhH5mSS8^bSu`sIPQ|AUYqE_pPzREvrv z==*y+;XGI$CgF1#-9SQ+PV;s5L!+JUj@q6~vI8sKhzKkiG$WeMJWa{j7vSvy-D$W{ z4J(!&Q?3Lx@1DlFnWwg2RmtvGGtNn|!N7Nf;Yux-47Wu;8c}c5K$BT{;y)*^Z=FBR zFVay3{oqF|;6myQFHYYDe>^{o29$ey9*S~}{PS5}Q@G(FWrDR24~U9tpx{%0UCMu> z(6kr0#Zf8-D(wCn_z_i%7}%~U#Kw}#XWK;0MrB}QpwaKqAp`!rO~0IJK7RbO=%34E zEKkjZt)&kxB;?m;Y8|edXExW2OW+aE1iFr(8-eM`#J%*Ry1_R~R51cJ*hQYj$)^~Yk&|GMmT zN|@}sCd0+=QBitDNtl`z^k(d#@y0kZ-ei!?`u4CN|6*TJRXK4b5&RH%2SzZ#*Ww+_ zB499-I0UvsK&s5-$RlKQL|B5}FA3QQV$*b#wo8-_MJ*As$}SPSD@DXh2HUdqd+r21 z9~$Wx5F!nM@)7qd@X4%@&lLNl)>Absd<<*<06Ti*q=X&FN=Q$17b{AayYX*QF+m5r znxA8~MTJt*WslB31Ip^l0yz(6&zp_@KjRd;OC@)`5*HRbuqXP*Ly>$iGi1Og5zft8 z{pC}l6ZzL=87FD&hZjkxP84QAOV$#V?n?Ei`1PI=|6>Et7 zKfNA74-b;gFGiLR7$GjgTjlef@du>>0X$)kD01g<`AEej9vbV-qhM$?RMScbp!rcc z?*$eKjsyD7WN7s8_%Ud>6l+FKl;Eekh=H3Ho0|NeWv#eeaa zv=9<8ON2*t)c5NiXlp4h-2HuI{eQ4SSueBCAt)KS)UwT^W_SvW-_&o4xBg z22;l~e4+nRbhCZQlODVNBBbl_vMihF+j$yOz4j-&uh~3+koR6|WMDNzL|u!)8Rlzz zv|bBEi=dJ)u9nA(rmU`4Z?F}w7(T*hl&akZ9=US!FA5^1@u9yJ-&-aH#NI*s1ZvRs zp^}c@bSvv?yWV9GkBrGG@pu%s7cJpdyb!eY z^=O?cCCX4YS1&eI{3N5x8;N#PW7{YKN9gnP<#M|d24>-|FkrL^*9%FTjr+0!_R%@P zmh;XHcDB>(j6R`v%OUwu(Z*)9{#jJ0XVkcLg3$0jm@h4m6=uESC@s*cvI;f>Pu< z0%T5O#JX|{Ry@Tq$jr&=`Ljx) zoF6IvfG`qf0bS+?;jL-kBk+enms}W&tmE&z&L~>lz=*+ckl!oXG3GHjSOMl!MM>`Y znH*}PJ-ik9zKaw{A>Kt2W8Vn2Z_P8%o?)%$CiDdI4~ZV~63DwUR?(E14VrdKBSr zZ0>@>pf~8WWSOm4%b--CO3gEpq9Q9rjYr$4af%Bu zcx=vNVg2^vGc3ap9;I1X>n5^O@y5~5d9Z<5Q$^L^pC>~j6FTw5#Oa(#ayTbhMN6&C zItRSGd>7ZN@t&N=S4Zq|Cp zun~5bnwsSAYSQlxql6l}@UkPdL9yfBuo)YA;*+EH5K5!G#US|>NBSg~ z4=`a#sYNE(^{O`EB`pgf(_Q#f1~pLk1NDJSu&I_J%Q7L{W8#Jghc^8$)H|ZaJ5TJ8 zT}wuZBHMG*@ zh$<%0eBNt`Uv038K9|C%Mk$k5foS$%KdD_P9~$jN6ho{-RWW;pl^xz*Cj4 z@`2>rg?nlCm2yiwBG#AT;<-qYU)%cmA%X(aCYE2 zd5EVPP68$0%~y)Pg_+dE+AM%Vss>T zS!Kfifq`@^+mX@c)&JB9aXMBojo04rAZ?&x_64f7;2tcP)Y3h@B$1-+7jhtZl4-#S zHjuF5EdW~>$<^$Cj2dH2kNQb{LHiYSagmTb?33V7@IYS#XnsJIfpV4=%;cG z93)!ylc9d%%9F{TG1D@RSNwlmCuKaV&}uM&&|n6mA$D~NObw=Kz_Q8UDl^;s`$-GT zv3NI9n2$7_Un?OVDmQ4~3<8Vb(;ed#?pzRHyq@6TQB{FVdj+P1^qX&=qqx>%V~~x& zY7o_1NE*Nb4RGS}0f8{Bga|lX-^SoDxd3c${neP=piAb^8T^4o|4}I)xpO%b=tOdR zZP?@J$5<{RjZ5K)+&B>W5&3mAvlg1_%3M$h5#X+GA-qhh70X^5&w2$~CTXc|%p`wg z;4{~zMZD4_%#nHUCvXTP82i`b8mtSTHL!Z29%@HAQ4zD&w86jSM)wcvv;9ROM^vnx z!SBoM@yiyj`umT_%}1!dpMm@Q)%p1sg-gWGrP3Upg8pvvKC5BH^T^G>+h}8$I@yxC zd}G=0V82lN+MV|mr zP*5MY(%(eXK4OYpUAzv|4lDm{G?_bZ#c!I8e|fOmSh1h%)6F?Gyx=WB zfkO|qF3x{#+biTRC)IPN){01ua>sZ`ge32ceDyrAj>h}ei_EwDX4 zTOy4*$bb3+tDz5bS1Iso45bB&UU>awFvXLd@{Ae?Tqcey1HFg2|Ly?u9s85YDIM)D zJxQNE;wrhT-A;(^B5x7M;?o)rtapH)Tx%~Ip}a&az2>so?~J|0Nr>XAlJi^OFgKn) z)PzUoghbWgUR@xZ3-Kcpr4oiEdtt{&oAit|gnf;mWWpK16U8b7sLXaP&R?jkfEHTR zl1-vD*tSqgQeLRHhr4mZ$0^N{{y{y~bJB4Fp?GQfdz}BwfJoB+>nZ2~X#Q_c!H*gZ z43>}(g(4GELNWHkS~J+i5BKr0 zUzssyR+ylH%T#= zNsZe>d9Yty$&5;MVe7U04w`sE>8~tm7ShF}!|oAIx?tyZSlD`cNl@2h5QOg!W{kqA7@=N#wr5bZ8!k0{9)Jy{(wW zC4CaM_FaOM=KC>n6XdNH*JS0HtL9rK>GOYp?WIp#5tcWM;>7f!^m}qlgqIUidjJ9; zFS32Vn$-H9kMnM&qOEoJJ$RXosM8gE|0jF%ho^b7-N1d7Q-kDuY#5Ond#eFgA`OV7$%WHk6kV%X1`Pgu zPl627u*$(wGv0x{khk-!j3&E3%-*(aC-m`_j$lg9BMFl>OM!YP5&<_9?WJ5)MfDe_ z@^C(ZeuiBe>{$uEFAbJ8$ay%rQ(sHdeC7Qz$G!pX02zI~4sh9Hg;56k9l4yeV<>vE zE?hJhB+7B?2o2A#g?z!1D+UL|P|fLD$xBbeobtCay6(ZRre|rvJ0mS|>5^ZhMTGPQ z+h@>`DrH*$`ycWg=br+2A;a_R0&`f{%WxlF+QlzEPX)%L=K`Q>!i6LwH@8|M9xwl$B0hbQjkt3KTPP@$&dr3(X*c-cpua zos+j*dcz1 z^b#m3ynGpijKKW_B~~fzU7izjI==7@PpRJeBOH52vf=KTUw`ll-3C`2Rm+%M&%S-t zI4Z|O*0>k&=O`BssK_>!=(9V_w!T|Qbn|K~{7c~IRrYsTaqH?1@@&jI!!8wJK&?Mp zJv9#FQl!iBc>$D2EoW03srL^82%U2I)q+lnPW#Gou+?E=zm~3j z^7NWgl-I{;^st(ta zeOncRtc$@rMT~b?>Ttlf!w_An@X-LBdX(BsQx+w0OWWg(DU54G?^AS?Iy@sc7b(}| zNf>k>(JnmBbce#>>(`Z_g710psZ6NSKTNFfmO3R0sGH%{35S7t6pZ&zG4e})sO%!L z(Lo5N!CRn0{&(ui^wvo{j+~loi=zhcfjS#FyoiH(;=-426TZ8A*GQH45vT-}XSVPU zR;fI{GwD(O6A0L`|6>vV1-Wz(0Fa#~5q$Uz?gj89g73AqCyZrj_q2IdM$w^@5+y)^ zF$^&sU0@0eRvtI_Gah<@$?5W@ zd*ne}F{(E4!!`!h5mU7Bm$&8({N|m=o~3titNp37dV6z7WL)WZ`)6diQ*ZiNc}h5+ zq;4EF1W~ZZM6y7tQ`8Hq3)jJdxdYpqLrt_F{DHbVI6trScO3=&dU35=#nCyQ3ihiA z7iyU*>QuBaSh>h0Yr17qZoZj}j@M4kYBmnyvDC;{KQ8CrS6$WYXR17(1-jfRJ@EJFIM7U!e2q^pUHa z`cQ9A#2z^r&rOB?E-G(TLch4`<~v&GP%egtBKm3zz%PZL51#&}qmtywb@@okEqQYGe-ZCGbNrlnO(Qvbw2kF&L<^as?*@4 zj1s{xUtiV!> z$j?m~?Q{^RJ7)rd1gdd9nu)lEO}*;+u0gjF)c3Td@Rj$p4@L z!*wBnr>wSgr-l%_zTm_D$Lg+N#StfqsPl~N5bvaOyjl9OVa+CNfMqbEV#_2fXvq8G zOw)XVxRnp{)xjnLigDVZY3~V}`ew4rw|GaTC9orowE}vk?sEQ`{NeE`BV?4Bb6DwJ zLJH~@EA>AUQC8Ijhz0jV^AlJyhMXHW!H)E|f4EQNdP~yhkOAY51P0Tqmy{W%!QpoG za}z+vW@#*ap^yt;oG5zF1!GyF6Irt2a9KzK)a8g86jX0Rd|4uuP^RkoL*K4hWX0Zs zt&6c+Ms#a!ILm3}wj{54%HAO&Ri$(*p?_l*+W+;f<%1V&eH0<9Z~Aivae#@b!Uis( zfIZ>2Pa|NZDSx@4=7f%jTk!s%MSygOPklBIX&zfbI~)hWQKHDn2<(^q)NHQ4*yO2r zR6I($Z#j6&bx;M{ECU zqR|TLqix`j;jiUt>uqkTyowUd89n>_vzf_tHOqhb6aMd3s2m=rygBCDDfr^)>m{`%#KbR;T0?yH>~{f?Tp z^BCt}KHIfl!{2*1PZZ4`Li~&8Qqm70zTf6{i0$5a&x$>@qmHLxL9@Rf_JRXDuxN=# z99Tlwk;qLeIIJ6bzrJyd92kq#k8tPVwzYm!@HP11I@LvyM4nONg7eZpI12MCZ(6BS z_AcSCZg)dCa1wz;#4v8UdkvykM&A3D)j+bVUZ;eaKx2`z$AsQGYQae~?5$?`_`qkB z8Qa^M&|y@L{L&2!dL6nOJ8&Ll1d()^#P|mbT?a23-o49a4I3}v$p^|3s_Iu1T1bxpGujmo6dCuwZ&9jFZA9`OfzXy1YK#Rj>iZ9xrEnmYfmzA!mYS!Bh3REn z{!DVjuX!}*jkx-@z*C)*e8KS5nQ@#s;yj{JLRG~Zl$6)h9`SM{LdlUlvz~wGpIM}_ zu`kFW$HW();f4Np0$q|42X0+*!R~&xVAi$>ww=ZLuox5mFN#ck5(^N|5E9ws3nnv* zdtNX@GPs`?JVFh2eJ?CM3@8cUXAmgBAS+Q#lEwa;g=pZVElw(CSzUrrP#n_Zhh%?8 zK-{);^gvSBk>kAtmub%6-Y~o_TjE%Dz3LR6BA^OcQs$d=MJIn&%FFA@q)8*O8yT7f4)2}DC*BrJ{E3&?HaV+X2u3?0*zAkZeg)UZWCZg1L z9N)&R|8C5gPK@7%z{w$vPi4+mB|*is&FHBe-BDpuzc^SJcw>y>*<^?7tCI0laUw19 zi>>_@xg#Pw4O)c*WtJ{A=bqv;Z>$AJC4t9=xGCU=ysV9H zhuVed?kup^(}jJV=Fa=Z@_lN;Pe**6?=rhZkp&GF2X1AQ(JVfF_j}8?4cIoVg+vu6 zO`NUklyz|jwW5W06VSJ!Q!d};<0^7RYkV9hkAqw+jC{FW2HJRUuwSX$beP+YD*bol zSG!&W=IPwc$*-9(3WPFmG*(3R$2_-?hZl-gwv{!)7(WRsf~sN9W36Q)DE=<+IApUU z3YcjpGI2YKGWdsRe%O(iCXPBydh3kt%7=P>BMB?if2O8vmvTKV87wZ{)Nh$#FK^7` zi;x~lmj6EM!Py6zLX8fFY!f4(`ip2s{*Y6+nA!?=Bf`}Clt-c!nJQ88oJu1uTdF-% zN7^9BmuN%tqn5E3jxio)!QLWK=@EgIc;8KGL#Hb55iMiFhU&p{D$&#u`e25UDH+IGSnsim&9|X`Cg?!ytACltt3b$8J%#Ul zCH7K}{9GgE$-0&5>l{4O&0(jj#m~Fk!{=T~fy{iJ_lFq(#XG~dKnU*tgqbJS;z-es z-`<#{f0FAiIJB8gFrOMMMvLL0-S3I`R-p(w8JX*bAnd1DW%jF`SzXRctMUK=SEm1e zfFgCJS>1M0(~n`hui2dZ3nFr8b*G)=cbsOx1kKH!mzuztGKZ%mHj%uQ6_Hzk(I4(7 zQ0W^&F|mMQrInM5LITTlJ1C?p6MVATqH^OPK_q1`ar$$cQs)_MSHr$_o&} z|F*iIDE%-+6*^P1jTHAUnxv(c8FAUCnk@R+X>Q6;SNhgctZMtX%P^#1zNb)MG}rNuXF;*w@U!;O z`y1f47T}@1Ub*P!VF?&$)Zh2w#@0k;hiqPBS9?t08esyV&jpEbjAaQ9SX>Bhs+FYcv&drossSBBZ-8eO{o%nSxsY45*7 z&(mvse~i$C3qR+~WPrZ0Ne2&F3uM7x)w3y&EQ0cC_~y8_6MVMXvnoVSTAm6Y*+&ea zlpw&l(+hHTcGilEo}rX~jc<`QDq z05nD%*(5NS?h~P6raCuxtOtiKB$5OqF>=oXhC%$d`ox(Mj1F<*ZY%3wH{H|+r>o8I zz@!#w75RqaaSyLZYD%3?RjCI(!pG(f3;m4V#vqkx;w@jAB!$#cki0LZ$DAtFRqVx- zSHu5~l5i?ts~}kuDAE@tkvD_zO@(NNzS2?)K-0@C<(n*1%QG-`(1&=XuFEBOsa$^1 za&3Fk_2nS>nQ@N?nT@F$*f^_1JG~QwX7)iO;U&fazv80cDT0_bz?bGy)S7Uo>OFc0 zq6i^t>|a77qU&lPOiOMB*Pb>c7mkD&;w|Cx0alI-WMT2^bBUWXx@d#MTR!MtGA^L& z;$2Kgd?L?)JZUKp%S_j`g4k%`bct@`2WR6$V6p!qOjPH}?s(*1LlKtL%w+43?tSDV zu<*uoj3+Zi4Gh-hk(IfXRku2Z1t;Tf55dUDS?w6rC4w46?H1OK^PhMlj>mkRopwW> zYAF{|FS>G}L9LYbEr8H)@Di)jG3BTK_(Jfu2IM=S5+>DXZ{Z~No~)M&ZZ+cBW= zwZlclQrGAiKPuzyO%DrK(V$r7t>fA1WP_exjAhm`_iC|9B)Cu1P2)uF`8qFIGCnNM ztO4#3L9}v38Uha+0yhX4L6AfVUK3x_5BXXPn)xQbdD+j>BKerfGnEaRMON?gG;nh13ZYKl*swMPtz;#@ZkAg&n>2(C5u0fx zs6++vxhmFu7ZlKXoQg(hz}GXQ$BTaNcP8cJ0PHf30XZNL(7ePl?wOXN%ngw27Y1>Cp9At?I`4U_GVm-)kz0ac1(;lJFcsKLF#v=rWC6~M? zSm>j?WA>p>N+cYSo7PNDmsU=%hYBvENB*#$c_{M`T4j3?FPN~BkOQ=*EVrHwGqo1P zLhzPXBXMnipl+NqG+ssOzpJP8(!rMgu%5)=UTkuPEN&Qh9R~c;AK1b~(^&$VadF%K zn;K4Rw-))(5!@eagV8IHA?xEu4)OAjJYpZ(%Cpj}F9kuaxWE2!YFLsGlV4Fsp2h2L zPemr`rJK$E`75BU?k0-2u;mJ&OoiKUlQ0j4HG#lY$}1hO$RJ2Wu(E~XC4;X{MF8YS z%>b)JT$ZB%GmWIRLS_l)FBILXFk_C1-@&rtL#Bvn%la+lorZvL2#DB?cmh${x)+?$LTP&8Ls2 zZi09ARg2AgSFP$DQSTnDpR2EUgzkuW$`M@iTS-z=r^BS;u-l!ilp`he$;(*l&$7{CV`#}4Bj z!m`VSD+t9N=&JHQ|Bz(3XK$h4>}JVa$n!&%E9>sLM<4oA9q1y58BIsmG?4+ReUO}o z-#KlEE=WW4B;k-z%pXluditJRKMg(?Y1esRA716s`Iq}Mz~W;P$5VT0QX|njegQPL z!spX3i}h|V5fG7-)`}K2p#O)}3z9Yi*{sM8-)_T+o>43p# z9YWHeXY3zR2OG+lHn`^>jUuyP-K5`*Lcq5KV2(jbN#w5R2kEvfYe zFIGl%QQ{<$4|IU-Jf-M+s9g+Ke`xjOA4>4g=m*xU#>EcGb-N)&2#3Bc;ql`JTf-) zWAze|qpq|F#}CvXRV_AYEsQQniyc+4qxlPhYU0q)=kKlgA46jONS%%v#6AMUG-)qX>o&WruhZ7-)xW%)*4gg%uxvN?HCoKq zzXu5AMu^+zUYzaPh-ZkuD&J3Q{PFquP$+&TbaT?Ty12aCp37_IG#BYdvgpy*actUJ z8%{ao@BDE$A!ny4Q~<0S;$DKimLuk@Kky=|a$?snCY;Ai7&6~Y@1D#omUSy{}t8Q0K12NOLgP~tO*77GLWl6f0GaJdx z#sZtMY@TpN5sfsDU&V&pDIwmQtORV{1V(|S`1@5KP#`FnS66V++924D5TC2%RtjJD-C&Y_q($}7*le82wc>|9i&rEezq^S?rx0hYtZn>c+ zWTSP?Ov~&K(oFIcjF1%RQKLiHC6+WhIn8*cGofu9cV$>M_r(u}>q@o3EqxQ>3l=Uv zZE0V(dA49O4_jUm;_i9a%z4y%M6QsOZXcUAY7Q)_%CtLvD$FcjQ`aMO`Q?q%>0yVf z|@1NV?z40iz#VRwIyR&z&fGggJ-Y1W}WjT`iZOIg{Jk-^8us|59M{<=2M!S#s zw3JVM29j7nC$otrfm2`4?r!f~mTxs7@tu-BJFh=^fJj)AV%D zjgwf@QebheI1<6xg`o-~1oi6a2>h?=^uAEwPyWSQlq5$YnHgB~prLaTM#ySZA>TNTr2+HnOUDV&BjWdrg@ge})vjMPWr$Cwa6QWl#sqla7 zp^`C6iD&BvN?}4%$WtN%m@P7l4irh4PC;!@Q9@41?Wi7;-ekOM=HH<-u>I_hp=1V4 zGnE61`WlHNu>90M1v&eC(Y7BmVMwV3!ne0o1=W43ycSr0kVh+?nq#3+M312qYhZR3 zfda%o-p3wxci!c93rN4|=VbUrzY+BZUYE?0do+ZjNUXUpEw3iJ4T=+GDwz+wm&qFw zY+#z05YtVU5n~D@t_m?USmH3iU`$ASUM$qh9q@}B$dv{(l~M)!>PR3-sq5ZUGS%Wo&U`2cgE6BLy|k0UFDGY zBDclFMN4Jd^vbjAMZuznO8`|pR|i;$O+=pX>ds*dKv)7gyUSWM5y|;;+Db(q_Y+@q zO8UF9c;E5f*U6IMboy{1b7z|R>tQ5ISL!D&hN}EZHCnwzds7^~E$b3*t7Da6$+n~E z(eYt6hyaEU!!?hGo633|7q&D3H9Zf8Af#vZWN>4E%$`eaeBT&e$24utIso@q6PD0S z*`*@D3_a*_8#>i>qERVh4vy9-nUG02kmY~MGgYNVaEMg5TNap+p2kF5auS4~*V>m^ zt_FuD9@xaFt=O^jxy@N;U^-OoGa0!O`~YpFG_k8AiG=Rqap`8G_6mBO!xN~M7`}BB zMmQAn=63PTR0{K@hfcxlNVzVf51+KlFH3l9*mL2dXyTf`YXO>43LRP^fTo8&@pjd@ zOZ;I?xGzd&@H{F%DNKLAwXiV0sY={E$Guze4w%dG**vfhQunN*_^e5ZwDPTJ06bL% z9KQR0X}`Zwe{(A>5rgJiv-h?^nTI28bw;kTK`3oSQz$5waqQdJ;_7m^{{LCG{QsSS z?Ds$A-x7rb<*%iGBG#7<8}9)b9mWfni^%q}Sm^rWAOj*x2pI=U6bVE0M~f*Dx$xi^ zmdr$0AU+vsYWok#R(tV8ey&Srh{KRDGmQpH3xf=x7yy!OqKgT0nT9cey7dS%GF4QX ziFw8MugECUA7ae~zs1kuWMLmHZG7;TTrONnFmskwbC{$Iv)~YsmDaWtV&TjV4I~A6 zhOlfTNp+;$=IvA!2?s$_-RC!oqkpD4RV6yUvrD`qDeu`YRYh%PaUsBHLSUuc2_)^M zz>=Rz%zjkN`K){^x8s}lvi(ve?poj33A!C;H&my4`P>mLcp329ADdNNmEluKwIXgC zcu7&QMeH5Y2iUD@r<~05&vSjzp$7RF!p5BNT<9hu;Ve-tW){XptfUF^>U5**({gea z7S4mkx2Jz{48DuV|2Wn5kdANpf-JD=ZT7o+rHM{B8788Jk>V}YCn1k5SQx~+cL+Oi z%U}8bO3W=tHy2|6dE3V2^Sc9J?rN#tO5j@DevB6iY-Pt>Z?`ji3-V9*i87u#NkkxPD7{%^4ZDFO6eym(PrV@`uEF!IokH7+xDtE z&i8uc-?z^=dDz}nf(#o=6NARk;j!y79vtf&DBIrCU2UJ+-n@&aj?6Mm1_h3(7&5Yi zNJ~$++(vqqy41|oC1pE;>BiU$y;r6|yEOjuLofqcMa39?Ebe}gGB+{^9=!&whMka6 z=gCXBC zW1pqpe<4u8`XSey@t4qK63wP=hz(^!f^XJNW5=$`ViCqQ()#-&Jipzlxr5Sd-^aH# zRT7oC3!rNxsak^io>%OUFEUs%mB2~$x2N)ioo znzEZmk=US9+5E;548s((l_#ZDz2%j``2LZs#Yyj@r{m_d0FZ^QX-u)N)W{5UajtTh zq{|OK*b#_dTL+1yDx4GHf5u4JO9dXC`|AxW;cm9|`gs&9(^riJ{2%rm_YXO;lr)M@ zK?g}xr)@qKw`mFx$d8oGSq9r8>h#Jtr6BniVRRGE3E~vfSklYwCVj@}k{=|90XDtx zLyva$B4}_VDz&BW98cgc!0=-DPCaTWX@D$o15u*m+Ey|ZFDZ8i<8@P`6CBAJS~7^Bc=?1-*V)$vjh{Vv63vXn)dTE|?lwZwP`(RLB)4kFa$7yMMjVhnDGja8l~^ zFCY7vv8k8w+{6>#@z2Sl9SZE1ifVt6BvBH3{tmcKCDqT8sm1ey8ul3Vv7$I%Y$F*y z6@8xD@p^}XFh8Jb2p8EFA~P}s@a=JuWT0EU8Z+|De*pL5E`Q^H?p5s3x7*WVidDAL zC_NwJ_Kz*H4y3;=o{kD{|3HL2{eR^HSIQbj1}gyV&h(5-6x%eJyARnLEQrN$sO$6L zI2k4%_2E#1tS3Iz${kOTcCdZyTN}%7tqG?Bgp#}AX=Gw{(bes#y;W@gG?F`4;Lrnw zxLaVYqyo!Z3p?gQ&Z5Uh_t(|T_QrNz>-DKwsysIg&`=+jQ1Yy~zE!*ffbspqClYeViSh8z34Xk<#h6FDV9s`OjpK;NMtr{)GXvLx{S zWCj*?@L75pd18B|LkKt-7-FI`*HS4j7sM%*Z@U|@3sqGEi36#cF1f$R_Ih*_^(7@m zrzaHrFYL$wOKGD?*@j%Sw`gEu;f?05WU)LvsIIn)nFHtqU|l^`_S!K=j0)ayUq3r> zo^+s-xnMD?P-Kf%CmGjys!F6CRZvy3WFQ^2jv%Y=tu&>Bw&cSkz&kVv;)_&C@8%xl z2w!v6=*SDzKwH9I*>^a~P%5YASej?iKb`nl>KWNwBh9VCx}W5gPAsHtP|s)vZ7 zqd>^IU}6hs3HT2sXZa^Sa-!=5rfh~0&g|Fh&{_K0aZ1&5B3G>1mI%+!|qwnxVsoTUYn6+YJ}9alMtTmf{C}_l-SUFy`Ry<+{Tt;99mZ|~DRf$vkiQyf z6!tvGKYa^dWXphWANWUpYlHek%!k01Vu1@8?%wHi-lXlYuf590#0N@04}HJ1#&n?H zzqw!*xY0wt5gtPpG80V8NrBxcpqYe_wmvP3f4)#)b5cj1+PO+fJZn-|X4R0IJ7+_D zBQNqdmQ%UXe`)3-cR76d^R{G(lro58M2&G(+UkWlnTWR%m)en~pS##T{G51Grg;J{ zE>2mFLlzEe@FhcnfKLWv#x5eWC!DNK`u6?VfRSOC{Ia2to^T_EQ%*p|yUj#xZeJ4T zJ?rJOyL#T)gG$Vk@7QOR*!UhpNY(2khg`kNs)~PM#;!GRIA=mosmnS3QbPQ7EHRmZ zrB5yBzfmQM1{zTk^TVL&0!T)e@ts=q&RT>aLsR8Sjm*Rb(7$2n1To;BqYRSoS_zPO zI=G5n6hXK^oVh1&3;6K22vXe!Wx z0~F9QP^Nk!`0p}@ixleD4Z=P**o0ikZWt}(-%e8^5=;Os)gO>=s7pF1j8!fr5rF*g zLkTV;dNWNc={77NcSd~kUvcpgly|>)3K>~b)!rBNBtm(Km_jdI?#!f@X&+0E*T>O{*m1^h9u@B-}ToMdKU!nufkl*~s&T||~dFu?lhOUd& zMdMos<0`iYk^M2Vv*BkJ)BKF_2?tEqn?@JQUMmzgR+$tFQGQAi0D7%>!FRG^GsS-g zVBa-RQu%RW5dI!19TZYYGaUMnW$qd|U?o&1y{C6l0(@A>B5i#dY7M|f9UO5br$b36_y>PNe6m5{XWvfvs=9kAMdwE}=mN%4Z$X#h|e;CC1xQjf>`` z_D%nOk~aRfx5K$kiv}s>z*7ywH^kJ^6PppI?V$|&NZ(r>DR3I&nc5b|8|&r!9GDX| zY(ibe7t+RRC-Lt-iYD_U%3ak62m`%u97;(k}>)m0F#GeNYGl!3@;ep!V#oX_0^*gl{_dMf~-i#uD%ORPmAgaeNMbMS*#vplL}}*uj&}OZ9#UUF+(q z-23&1o^yWI9ULV(O`=Y5peq`3Xr(mAP+)YzrEWUBwyv%i-4db}JGxjf-KYc>|67X7 zYBpm}z)SM;wEn=Tec)=)Uj&+OjQZA$mSj*oAiUCrL)k-Jt_w~4OmqF2! z2k+-!P!FV&;r({r+WFH8BmEig{LWvZFF=bi?RL&vpI@!^x|Da?cQ;hC{&dEkllr^| zjRMnTA~HYr_kC;XeRSCdx6*DItik4~o}ifhk)j>TssQK(;2No2fG-mWk#D)ow{hp{ z`lIB-X)LV55YYTd3HQ=aX5g1l-OL~$Z_YQ>;oFv;M6R^&>9zApwe?M;Dg zj{|HS)T0$Oqe6xZC^Ll8-iVHE!?$2{W$VAmz>V~09-!#(*-LJPTa&(|sIsXEdzyQ@ zJtl;Kxg>i!}zjT;XZYwm}A9p6-9ih4r>dC_7 zg%5gka%A<}YVKz6nJ5i;7sOr9eY~OUJr6RXC(dKoR93%x4w#9sXucv!wY!J%+anAm zoQb&!@`V^?vJ!GlDQ(-((uGF@O0zYoIVDG`++#m+Lioa_!rhBempCf0jAlcm-lP68 zlr$(!m}AU>aV=?6h~h26N&=7cD=Vds4c!xIg!T;~7^IS?0|EKSb8{o#4P!V&3qb}3 z-{%->T%fF|iA2H%@YQ$EX=*Y75UdUvh=k$du@suv3eDWvaY+3oB+h@1Wh&c&L3~yO z$x*YI&%CSK$CU+xnRRd}=y<_3ZCdmaD0Ka)72^lupDy_Fc3v6JRdil7r_OaFnQURG zTWIoXxtyia>y-jpvgDH9qJ$~Sht@(Fv~R%~ z@oGL(0chrP&ZBBMbAwoD#z%y0cyEmIC0z72W<8PTx=(_t!-`d>;e$-&hZrOA`NXHy zk@Ug}A!q`hh4vQ+6y>vuA3sFT}Zbd^4Y*f2mGBC20$nSq?&oxX+;OYdgIvy;2M6-dDbi4>&W=) zX)E`$@<7bp%56P&&fE@=cbx84JqCX`4RB3(f1jKf1qJ>&5PJ2*Qd^k?}^WDZ;? zj?v3fC2TvGOpj``=N#M?cm~063;rIvv9~(;e`a$?YSPO`7}b$N?!oPF@rC6jUAUbZ zTSY}kCMzIEm^E3fclIBUGu_7Y6M~9wbs9UnL$P+QkkJqH<~UaNhJ>c1G%s;dP|wwc zjNVk3WqHFRCvFGO88XD`A-+v#wmNj6x4fv$?$J^7q%w;CR zbN*^ylLb3n-QlpW;v*6nIh_#f}Z`C?JYBp7*R0dpdy zM_hXB&IYYQDDo9SxedCmrRc?i^|m-XNb6xexLh^o6y>WFfecQ1Sds!LBd&%bG(+)f zQoehG{LgnK4zb81yr9p}43*JjrPg3hwszX;yHhb=ngqBc=20qhUOkm?@FgSshJV;4#H(qkpS28OaPBhpAwna?t) zlG1ykr3dz~)pGY)CwRt|rC1ORrf)WNYLS10)KTFF{_*rgRNbw76v9vldK!9M^$82i zkt-*qhdw@(@i&8|S3tqre04;m1FWzbWQ1@6%w4wcX1)te$D>lA`AI!G97yIzD!y!! zQqSasG${O9`*lrFBn$IKP$Ys&l9RFTXqvzi;it~_4K;sADP)FEU@Vv`uAblWi!!`w z<~dpEPm+&$L`N3C}X*exiZb@4OHMeLGfWgUnPF@~TTMtdrD9~dc zg!pP?mvn}nhl{A8(Y(yDpzDjVAsiN7;5QV9qE^sn;S|t>z~NmkD!U=AxOLNbf$eF( z&en&mz?psk{lA>J_)$l$^F&w7qv&R>n)bHxJzK|u;H94!+ zzuHkw8gp;wj6Df_T&ZPv>3BDIwsOBvIq4Q>;FoSUo|8DbESg^L!s*~3Z@Wvh+_Sse z|F5l}Vcf>z0-Xom5IBD=Y~@b%16?66G~uu<-5pdO#I9Do5PaI1MD@=WD;CSxmL?gV zHL2!*Q()Xrdo#e?>5(14vC7If{F#;HStK@|#v z)Ol^H45aFN ztR$c$arg)Zn*O9R$?Shd8Uz2I!?Ii%@{-MTf0vnh{{_;T@)*kouy|lL_klDIjmh5xQ z=LdzDDLM3}b+UiKVaxu24SAO!B16iaT^?>kl6^z zre%-)<+IK92i*QBCBXtPWR9 zynfIauyqZ+xH$N>>TdOUIce7Nqu$=Q)6Js3(-AfeQ~S8b%X+nc6v)HjUAvF|lHr#) zkA?f8%A+&apKUYkC57g?`gb#xIVueR>*r_;(=-c^=EJGqI_k6pzKl5|N3Q_b1oTaw z?S{Nk8v1~|spUYXT-=*r(fXDnevC$hyPmw{QAOD#^m7|khy1z99fVME%zr{Lc}cScT9h-!+9=2PriJ`^Up|@Te~hokT)yWVN(8xal~(M%ZvBS zasVhCc({GE_9MpzoXPXxoHUjGSE(vvO=ZGlO|{sxjpkQ5E2?@hEyBD{l~0bL;Ba==SAstJ8Q zI-4cGFJmoC))$d6!@(L^4h$#R41q#i1D(FoFw$qCRc zFQAY_yK2{BPE!9Jt2vLKYe7w24!vZQ)Pi#3$tnA zhzrY~Ln=7FW!Unjw?uct?zxhLkdiFWv79#jFAnM0)RbBIm&le<<$CfPeeAySBP5Bq%|-~s`#<4zaP@0Q922i_f$SQRN#Yr-OF zp!1nsA2Xb3ss))v>cX(-GdXbYR>eS*exlK^Gs3?4-QZAZzJ`V!%oLuf)2ro4OMX)# z>)g85CiBC<&IsAEE=|icjUoYFPzv4zP8uuan?t|58P+wuUP6DbbfSBZ#s{x!4U^PQ zHr0yf{iey0V_P`NgotIJ+%Q9VD!OqN71wel2_)h zBw)6?h!jR(Qq-wvd`ZG_Q?^D;ECAR5^SIZ4Wv2SvT67nRmbAQc;l7#*^vpZj6U~zK zITcy;Jdyzqui0uigHq|wuv2Max*+1IlIqMtYLxdZVA*7_Z9Q`&^+l0-$>V%|q95%0Lsv zltj1y17Z~&61{2yX7Fp+oQlg4_xL5>pAF+kR}e(mwV~YS)g@4q;}sj)24$1IG#9bs z<3PyiR(d51IUTnR0h;{b-3tY}EwY(}Ch|t{PO;teoN`0n5pLtel>8lO<-{L@ROd!< zp^KSEvV2vy;NJoi%*i*xC@4R!ZR6&JUAb%CSR?fDBBxq-B7h~s74O2uA7Xczej<5+ zrY+>QbF}RQQ$jB*25aJ_GXu}U-bukle%+tSCt{Udkr11+>9aDqGdte=HbvR!sGi}) zP)Ghq_1XS6eUxuC855lbjJ#j)3=Z+PyF%dM&Zq+tcWql4f05YAcv23LpRzCM!raIM0wtve%_pY*0z4Wydwgwujl?fTl?uJ z;;ypWqg5(6{`T)_QpJ+wO4NqF{(T6j6ymX3d;Xe{zr`TV1IckFiZN5{)z zZX(+SzaiUlQ?BiSUa)=CEFMf`IK>zp)E`ntdGFOR?aO)f%z_0GlZNY%hir5l+?z`Id@x6*HZA(P1>KO4 zt)ee*Kun{tN^p$0jYPnl#!n!M>E^g5YV!Q0Ri2Q2e2*s{Or#IBkg<8LF=5mQqm4kZ z$pi}HN773~K1bf8)JgU_QSq{*5YCwc3%7Zdz=caXrXx+eC!9d;8h{PIgGyfcOxgyALO4CE1(Yw$niV4r!|8 zue5?j4?CQxqUZz>tUA6^7XoU4dU!rwuS}VRK&Vn3I?i)KB#)hovVEar8R(bk&LRQN z@j-+)twRdrRGHvX?yWYfgy5~iY;xgnUJwQ~6k?@$*(RJ{VDpNy8A=Bd-Xew zX@+Q9hf)7BS?MOTu4ARLy@SmLc>Y#kKnJt3fYC`#WC;Q^YkK@={{}7bLxfqUPJ{qS zNy$O(5xJ2n>wfT8m0zrs_6S&yWT1gU+K5s!D;(cT0VVAMY3JrqB41MBPY*+J)zE zfrWgEC6Mp+9$Mo%+H23hqO-UfvA&`g!XuV(mv@`}v4pku=Dx^o`BqkwG?_jwRG0-% zfp<_iu=c}N+*EKZ&n6HX{KaZzLnuh!JGqsXAW$ROD_lRK4MIQ7Gek<_X8?_k19Di5 zX@kCB{*SD)3X8gJqdhGQC@tL`(k0#9okJrb-Q6WacS(0C(#_B%4blu9(jh3Z|L?a? z_I2&kIbjaC=ZpZeDy_HM2e zR$Q&~ zrTegDl6-C6?|c#{-XCiTxAj8Yos{gUep}_;A_>CFyL1p5_diQb{(NHm4_P+3dOl+; zdDoj>M_bOGE7^0dmNuPJRcCzpj;&XBx<1xOu&3`T0NZ!e-A~qpFG<&)KCX{KD|K(yD2)*vL0&S6QRD2pJ82nn0H4sP(RotKPc+kCN^d0a?dNyPPZhwI<<@QXSgH!%vS!E%87?l0SF*& zl9nmf2Qp%sjC}Of8WZ4eQETR>v@0%tm9wm^F$_pUDmRcl-9U`t3y{}ti6=}rA|gQ8 zi%fF;LFZc1i-}QJEjt;ovOlJZF^F#5R7emz+>CXaVeJx7-)Fl zf_hh~DLlhYqD>Ld-q6=E(lJ`2;?tDGT==7DM$uJM&ojHIV`#(Hcis{B7~aEGF0&wk zd_zhxB0C1ns1s7@cZF-rnVB$3(ME%m@foc2fOsg0Ze$$BHmTjK2JLtKef`AJ;_o!v z^leD`KEq3ReRwk{fZ#hLe~#NXY^9|=Jf_` z;S?iv9ou#l(J;d#vkw-%jj#UwYT5B9_NWlal<`$BkuH|HA88@v`&;Gct1woKeqoR-kgyzl?EeSG>^cwZ+8KG)CVjvzd zU!E<$$crv$a5r%uP{I5!N$xL*dLqzZ5f?n%t@ofUe2^G!?hQ-MB9GX=t*TQ^aL|#u zVWOkmhIgsgnyL-g8W6(tv(1@>cy#^8RpdV$+zU~^^UbNMe7*|rRjyCBxloA)mtyr) zSlyo!%zsg2qo04!H9xyoIr5jcZo0JG{ityctXEpdQLV=ZW(X-Uys3$qAZ55CowDy3 zTHFF^w2aY&Y*!CE+C>}9K7+BwSo|vCT7<@Vpg3UZW>U5(R{!jfTf5AFuq5nD8{6CM{T_WIggBH+MD8RI&WumWCK^h zsTc}&agV~vXF?gDaCuAKc1Qff5!Xe+^05T$Zj@X@6}pT%nEO?jL(lyX!3M!~XP}`L zQ)_4znl{B$h1>CE+c}Yol#i{t&eoW$zG*Ty5in&p0h%caHJOz7G%xrYb5@#$DTvnk zFOynaNKOFLyM4O<24Z~Ra4Ky3j-vcOEe9H{HC(2|cxBKvJ|(QsN;4{!klvaWJS;cJ zScLZtjBi`bY03U*y6z@0=n?;BjOLSbIT5zxn@qjMMXKTaC9ivr z$L^LbP8UC4TGu~oFTJ5=P~NoNVoqwR-Ay?ayc$=cMx436SV$cf6)tx>8D^1%iPjM@ zBu*oP$)!m@@-u8Ci;vP|KZ*ZvuB4jIU?d=9{}gc(|le zWw{1Ux8fAWDv|4R*nLmA(%p%yX zyN=s@-&6TXw%Lb|_g-D~Df!0r%`b8KPjlF}dO049Lih5jlP{CM5ZiIz6;LFCl@3S9 zCy8>~+@AeMM}34Pd-(S-8!mJ89>!RnC~!D)*t?*;SUJ;O&;7Zx0(Cn<{tB7-s=5ITFZ24^JdzT zy}RGU-AInJ&$pK^z+6E3m*DT7*BU|s`}{A!*+6P4yVHf&Z~b&;9U#SO=x&B(TTWs& z>Z8dyjp}_xTG+1bdWxxHmMvFEkG;ldvP1MP(*>}yzU9Y6m!}K72&)(j9~~M@(acdT zQhh=yRl`3Y;x8ue(>liKX(*QRi7mI;#=gLJE+W*NYl_x-L7JhBHz4$5o5QkxJ^zCE z_HBzWv@0x#_2&S;{^DbTMDMx$&>2;7=DHx@o~Fes%7*ADp?O#kM?)Zt(mDc6h?lX!jJOCcO25rf zp4Hud$*;$vS&d#|dv6G~T{6n0_Vbm5s+BdR`5ulXFeXLcMV1u(gu|QAp$^nYxcPm`PGDG-&!#Kke_w(>zXeq{)G4zjcyDa%j+kMC z{jI#l&FVp)P>c}xvf|+KqY$nTw`49Eb?$PGk0wZD;l1VNQrW@S67PAE)L(E|w*NTP z{r!mf(48r65vpjst%Vj;3PIqU!!9#dPIH~7BhnqvcKt&)8;Is@8m6rC{nenbmYq&~ zwS~A`?+4j3;KCOCnFYDg|0KQv*F-}m>uY8rgM{{+#`eQV5lbQs^m`-}TUPxoq6yhY zb~q!S_C^4^S-@9a9;INjYZ=D!;|t4xnIS@j=iU5=a)#=T`5GCU!pA5(!%`-A9F2pj zyD1MIkvZ{V%U=dnOitb^9vCt=jy9(2t1r?@hpA_zM-2;9ZYw6|i}@Q4LdzzvEYU zi%5v>D^VMWUZGO>MBIR>MrigfXG_NJs2jVeR;ZESOmN)LD13M*Vh7_d+w~qYg0^&N2Fy?)WhBsw%iD`j{a>zq^I`O4S|8(e57exLO zNJwTnGTL5+<%l2xa%UERc>dvSWn^kr;_eoG79n7KqXu)X3p}f0GwlDnV?s30oWkMJHvd$!*GYo#aUm->Qc!Ts6vuI%(m%Yq0?Bq58nr3bA1JiLvb~yg z_(8P%q6o@@wAK%mA!-QP=wIe~y(#r`2IK-d&`LI40!+Us)CT1TlL8{d?i*=_KmkFv zWaZ82K8+v)bv?!Fmn0oTT~JbHax;q9!^>5=HU?8~lQ=Q+ zT$;rNYvy#ppcTh#m0K61_gl<5;XO8Lzwf+!?0UDoP?Bd)wMFsdKhIH@b0)yp9d-&C`xfF$6f%G{;l$MAKSB5Y z4Yu@ge}`b;k5ZkJiozDAkuxtK*nK#D0i*I+KrbHcs9{fa-ms+|GM^uXR2S&2PcV7C1|mz+fm;@cAsLBm7^LYP}8_aCmM0 zBU5)wdiQy2c$%D|Ta5d~%xQi0#x;6I*5*2NeJtAD;{MYJ6x;Hzh1J$oH09N}B|E17 z^R8j=L8MQYq`P3)yl$?AaC3fmD{+zI6HG%8TT`9#P`XQRUJ8I3N z6l2Q8nz2HX?1nKq!$YZtOL%Sl%8y2rUFZ1szLC7h!$iFw&TqhfH*z`CCQXdy&esFZ z>!-5G_{Em5f3?4p9~a(oG_Bhct|eN%X@IU?nEtxihH=*wC^$U+ZqJx5+q^O!Cp(>P z_PLLhJr!)rXmw?a{%L1t`U~>gx^RowXoxL6-rCAPdq2Qvz#gX1|#UhK1^EgBs z{ttV}gL-4XB^F(nFVSBLgkEe&pG6*1!{W@MDvhV-3cpR*Y-mGm^$pnrN{vvW9AW0E z%0%@?@W}Mc9bY07=?A=bqy`I(h`zyr7*EXK*D`Hsb|<^W{7~Io*8J^M%$CX_eZHf? z+~OkPYw`7Yr5J+nWRAg{?fAS6p1FT_3!7O9bTF83uQ&!urR-%hPSaApDx%)v;?W(? zDtAo||6-dtc%t<(t%igK!EaqSV}`ZXx3tmm$vl!Vf=-xy!SDvWSlCg32)82~74(M$ z0CQB{GRCH1GZ1BuHMOeQ$l83y6{siO@=-~1`o;&TN7=}%4^I1%mdy1mpFLO9R0_dZ zoHJ&{ds4bm&mF`1FHW7XjMn;zC>uwfC^@-ZSX1^<2#Ah?u<~O`n}-ddBLf3tVV4aT zb--(XaTjVukCH@^wJ2@jr@Tt+Au4?)gt5&)z(g0{*i70ncLAohCahMHK+?db)QmbH z&z}5+amBxeE0tGOic~CS81s*m@$-LKGy1g1kV_;G-Ufp0FR zJuQHHW&zhU;c3Z@obVkWeS!AZ)_X4B9qtH`sx^7C+MOD&ZgzK-kknb8#~XWlZ+z-l zFxqP0EC=85|EG^-cu`kfpIsMNw?M12q^B6oNy`#>ly_pC;{+x$1~xxy==YoWm%F&( z(?z`EPzUKSh*X~>;Wsv?l9dC72P?h;Hgej9z*!9GwjXlnB&$i zXs(MQ8j5k`)1ON=7*8W#4qiybcsl}Bd{+MaX43B0q;Rl#xSsxRYzy>B#Fw14;}7)K zbApb_r{AvXyo79cKIYGvO99u58@b*OU1x7UUf_$eF9hsY-D$k^^uN)%@Oh_@{r+^C zcMVRy-EltZhbe0;*o+(7JsoM(MTa{@OEcs>UA?;5zE1DMcHra?1`bUQxU9QH7xUu-0wEK#w za@-=TmcI_5#9g*0xJx6#q}t!Q4Jf{C<2P~=W01@{=3lv=FL*N-rDa%Vr?V2WfT<=H z_&MOhoO!W3Wg9xH`#456qfcLTM__bL{hl6Wck}^WsS!&Ci;g9u`Kb_RvZ+KxP{SuY zLIemg7u8YpgLk8pWMZKP6zSAacaGdxB~RoI@j#cN)nOA)Eo6{bctd2QS0RS>*oK?R zSX@);7tDAU281-D7JTWCof8LI3(tRk<4AR3fY;VwQu@_pkXS?l#Z6=O-M7A>Uq#z2w zwZ?!^zE{A7 zBkTGJYc>4+nKh*&w`z^KKVqqGzweTje#Dnl+v~H$|4d@|D673QPtsl}2i4}Xydxx) z-@eO)2-S2vdq%qo;teEmMpeDLf#l{n>v>!2dVbp6{#gkduRROm9vAKeh#VquR>YQH z7YFZsfO9lH+5Gqw(nx~czTqa78#1)}XT<(rf38R#Oq{@EKVFUj(|&Ul8y_g8PjqeQZlElCWXx>Dm1;B1)U>k9xy?Kmy3I03{evx{@a8ncDkV}xHa&N>o58gmZ zgD>noEF!GYR}Z=de!Jj4$nyEhKEpp!t_vzfUR1NZe$v|R-Ic4Fpk#N(Utrtm=p9Ex z&`vGbynfO0b#K(9J70w#ChX?VJ66I^VHH^zPpCFh|7yeCcjXW!W>< zc=KnZYjASrclL;{5p0g112F_w$W0Sn59&rZJ24BLr3iQN-T<4AmN!@FzL~A34tcg^)(NppGN(SaK@QOP8V6 zy9?eZ{^TUggzZwVID$TSFwT7xBy}ZG#C)m$-rq#jixo@t2t?Pzyg@-qV698=J=)-`1LEK4V3vK~qxFG(dWp z2iD4(&{_)Xc%Q69_;V$=be@gl5K1hE+*}YlM6sNO^%KNO16_%#M-}+Y+_8fA=E&HP>_YUk&+O>jsG1bj+Ov+c{?l}JW_o!voB+9gL&TTCc?C)F2f6zrh7=K!7{0QWFn2Z5+#Xh#>ihkaHV$VSc1FuksA(VEF8g9Hix{56!%e|Z$LF&RPJ4ppNlvO z)!i%fYo|82NWC6qO95j+CwThDn-rweW zDaA;JQuA8QPSu_Zvk7j@kl#0EsQ&$U@J55HvSctwYJfUH=$!uVTsmmOp`5XO9cFQu zi98vv>)C_2sOw3#ocnbtN4L;ARj51X`2%x^7{z7PD#le(#z;q6pZ{1D$Z~Qw%ITLp zoHnv!6oLi!=t{=CHNvZi)Lmih(zV7ji#Z%#*r=2E%~x{wUL7Iq4$0NPF*Pe@3MNZT z3dhBGPB}=5icKxHkM@}V%UmIG?Tv5k1rlPx zyyqF7lM~X%C~^zO#OwI~I-=cT%FsWcDGFiL`{YD@&`iQV0e5fZZdoMrb?>XGQ}OkwIk1Dge&DpUj2Fh1FUB zXQ#}S3U7z8i;6;p;4R!==e4ILAW2|8O=6?%-6eaE`srg2hBr+H+BKJiu`lJv$`Lc! z%l#C^#AJHZqj#44!|k_dP8+o952q&;o$*(;ndUjzcBQ{KhqLeACN4>RD$9QR!M1;P z@cP$>jE}9q4wLLApKO}y<^a7yUB1$P3&5dYPF}k1I#K)e*UEI#saB)CA0kN!E32LT zE%0x>epC2tKc&$${kxNZTnHV{oE)ldWxr7DSzM#fN*ovSBh5t;%!-%y)r|eo?cQE| zip2{0gW8K1^>icwKG^MzSl^0(Z1GkFqkak|P<>|Wx~aH4D9G6jMs0Ya>w0K)VKtTS zU?gS3dgl}QjE5IhxN?erk7U*$$C`B1e;pzvKZvTZiDl)&Vftf=rS=Ad-c6;|4V8D6 zCuk^d*Q-2zJL`YZ6!_QT=DEsoxp&6?^``ER4WQ0oX4AP*r9vrxgodw4KCfw=ni6{4@WyQPM^kRazq^|p0Z8sH<8{h~l5 z#z5Z~0o57eXpXuOz~(G|i-!v$CZJC$kr*zT%piD8Ed;ySpq}Hc7fr?v)8`>pv=#8I zOw5ez|EWtyk>4U=uv1}yF;S@&hcfQ9Y>&m56sZR#Tip#p%RxqgIVL}jG0A+z6D`yT(a|01FA3&tQujh?UdfVAEk7F| zoe-(umW$brR?*KP_3zGmtZD;$)gXGHdzm8nGx0LH5F4sgE>P#oT=*TaM)Q?kz@V~$ z%zrC&NkkTx2=$3aWC=^a%z%n+;l;35L(M=3l z3va7;0is?+p=CT+$Ak&L{h2gnC3*l!7v`v4ux$BcDI_OSBmV`r6hiHi&+0CpR6Hgx zsh=GS_Y(aU&H{jglgB@4h z2unhnW3*N&1{h-^r^wV=yhK-)VwX6{jO9nx$=VOTRyO}x zGFb-F#Om+(3x8-z-RhmJnK>kOCIUflPob=LW=x#0Sla%U)uE z&^ZemDzMzy{5TpfkohvM?1M%advh+XBmM->?mf|#zS5RH(dNA<2t59{T$+ZG^rDUg zV}l=cd|=*Gk7}^dEodk@bTh#GkIdA&hHo1*pYITOjJlvU!Jm`aB(l%QS-U1!ezW3v z;oExoM|N)}gbfTsi#zeNaV4f{vJM?&+#Qy;+n2l&vgBHo*FnXez0585s3?z>m) zjSMH^52k``HC;&PVJyz0{E<1Yep45(LB-EY3u|A6yeB%`TSZfeyZPw;t}MusB=CW~ zTm9_-`<`yXP^-HO(L~;`4X_!8O%Rsvm?d{(unDC&VaUa~GW&gio%>`n1j0+@wUmhRMxVhl^1qm>mHW$r(AFYr7nu(8iEcmh$X>DZJ3 z11P_t$Arx$3?{_V&oiizK`P@nB%%J23JYS5+?ON~{(8HZxcj>r^tOW)0CEhGA7hS1 z7IWLN0@33kn9z63an_p&jby1|Lw?==r<%BhFB%L851LaXQjU<6bUzwdTvX#Y;c$%i z`Bi?GJqh=OEM`EQMkf{KB@h!QdnOOLBjI~$&vKeETn$0{bE(^-L>J0XFr_n6ttV%UosQ5%hfc0i4AwNw4&W|Kv8JhrCozuKdN-#-Z@rzV<7?=pIsAv@ z;!UuII1WLY*({JdW@BZgiBd`zxu*eN3So>G<5frC+DCXjP5S%Be-n%Sc`^3=ZeDn> zA#sJq`qpiA0{8pCu*5W&lT{)|I}}Ll6bM1ES*H7Dhf&55Zh<*YNNh~VP*Ra1T3;Vj zz4j2ZmZqLqXUSOTEP@_&9S^{TKTCWnvqkr1R`_oDA4bWQ4ZtW>=Q|J?0pLwTPql^B z|3)ZHXQ}1C(_Rg&$@%FW>z+qTGEC-&!QjTz^~Zsaey=fnGbDSFHP|55J#`el)B9GG-LkWBhz+`}GQRDhyqf93*BJ z|B-=8fB-hRcx!Nh|FvwpXWBP1o*b!E4&pq+7S??iH?xFsh(+MWS>Sy6)4=MZGj`KHpfZl{lp+6WekE4j7E++Q zdC=`@z4#-N+w-czx*zi{!>L_A{UUr_V@J!wUlqv34odgY`}{1^q^8px!4ZKjF#C_^PK1g8U4ON8TK3KvGNA`v|+@%dkBEEm$MXjN_z zpK_zq>P&rCE{-x+Pe2^32zZuc;DfIvUG~@?EFXnJ96N{;(Bgr(I~*PrU72I@2!BpE zl{)ec!IV?n4qoIBw)G~3)1}N>?aT_uSaVQX@J@}}-#Nypxv&0d%Sz!M#bCsd{#>2K3@^>CK~FyF52h)I}yaHs?|~88Sks zLY!m>Z$KAX0xh)wR3ao~P}&IT%e%p$N-x|bbFGjiDez=bVuoF|V-OKkU_S@aT%Tn4?F_i_FDJCCbbL(F|1`6Z(%ZF4>ak z9S1Ll$KTkRyKa*Oh(CuH!QYYRr(+OGpr|hkyiE&UHywMj6`8P%pG@TcE(|ggM46fF zsBE_!1I9QAq+B%0Jlk;>S_;SnSPqsgeo;MKGr_}vc#MQlQ3fJ&AG4J29 zvFY+#(SPj+7B4&9MD4E8Zo3Jj1%DJrCL6LpNkGf6R4jQS$!V>-lJ4b)xvT`j&y|pi zyC;!XG5$F>)iiB<}aSfQFH#H@tS=D zTPSwlZ_5P(I9JcqP(_)MQT1vxQARuvf*@y6JrzI(u&JV|{%E+mh6I}r8LVM0V*>QC zNL0d2=*mpVvi;jV8+Tdaj_ZV*pKJ%{zN=)YId$1sq%LyKvRIJN2;t&(+gr@*%;(hR zty>KZ4m*rUHxSO4iK_)<@LZp=+e6Wzk={Zi-)xXIo13687bWe|& zq?x}B%gl=K1OoWDFtEn=J+SoPD>qLqYad=|k0g1p+D_kIb1l;eKp34aBn8c5PMdxT zCu&P1ID{;TkGiT)YeQE?RglGrJ@h~svB^S}&*~vwCY;+*jrv*O(m8}26Vkk<@I%E=B3mxS8M(oFmpufP~ExvS#%18{`)P6_t5yT6dl{Zu?^z-ul}wR{8& zT^F&2DnAvcA$C2EI*BIJi2|4BKI^A{1D;?vXm3mlUaw8EUt4W2R&KNsz81Jy?Mxgx zJbOu`vK#c{`PF=zz~TH)m3Uyy;X138E}vcPOFlL23;kzm>-JhU_E%Z{RXg>%%H^*X ztUHm{IgmN;L0RCX{qnk(XF8aP^jT5hDcxneH>dlR;rEm3ultg3#|-8J?9kP%$aI1T z>qw|ptG0zgv=}p*)m-P_wWq ze3(lzMy_pEi=|^b{=HF(&{@@;=GV)HIOwY{&nwfQV^{ATNQ@xC#FdTCZ=;>wVVc*_ zy9LJWqU_jq{`vXt^tArJocFSuF#sH*!gS;;#eHpI+X+xc=oQ6qQ4+!@`X+gD4)vM~ z@Tq}^{6#0YZN{R~YpZX%LSI zzaS65%&I?bs;^G;?Sur@C+@3vF0+^k_A4TwWvQ~rVZxb+h*fc2qXLhQHz`I^H>`sC zt(K11ZFXsrvYO+nLn&NYl(Mp$PGi+1?$MqnN98rc{3i3f_M%_xtth3=mDJ(pnO73G z8Ayv~7!}fG&s>t20q%fMhcTIhR6KjXCW>8o$Yf0@09o^E{+&P-q#!D%QGo1O=3`2o zW*>$LiVXWNVXtz*><=AaPED$u=PrK#lUdRGVlN@ivCGdbRVOv4HakL&$bp_$R`%dZ zmW7_r;A7EMBhc79o75~+qo+FByiCZpQp4Jo`Xb^?>DdLl;DCPizY5x?vM$x~y?ZjH zwN8_U;8atXgl#o64niv_U*;x4D10C%4Y?s}EYvjIC_@MWI5ae%x0H0!%5eRX*MX(~nVB7ha*TzsDN(bynjqle_y}1QdR*~3#)h5d4ZHrdk_Mx&g=Xx`rHs7y zM2{IA_h&&IjiG!;9CeOZJlc=G1TVbr0oO!0-+ynq06=_DD*HU9?yXK4^^ zKWEPm3X{-`{vuenF!BLnW8Dv-x-E2dWNNM6A}jsPU4eVmo$D+Y@qP#Om7akljy^j* zXBP=;YSPM@PEZ)2ka@>0ay6R#yOXQ8>dvA6-t%IAn9Q(=VdH6of^=lLwHGIa9hum< zNO_#mhbT5DRN9=%k8jq*mh~oB%y#otfAm>>)X!9YdNEIkJ?|rX-uP@+DofW@kIPda zY!Q=}J&2Vyn3eQVTHrGK+aGlEKg-a2=ZL9S{ICCX_5Xz1>^J0C_oA!4(6NrqPyRu5 z7lH1A0dmRyVhklknVd)fGuRJ;ljs*|x7Win&LX^x@8=i!4h+*x#5!I)>XQ7Bs6Jps zH)vF*YW`2RplrP-Xno;_WVzmh&gXzp3NS1h0Y-4)K9E?(15TZ@6`A9F3(Sn)PCke8 zembpFjWJ%FYc9=xjzcp$@0D)7~B-V4xlG=z~TVdET8_|85W$b67W6U$ZFa z)S68k<4AYHbA*dU?{xaNViDs?m}DLuiM=#{U-Gv``;TH+m(^@I(}nFn-M7P`AxMZ3 zy2GMG3QR%(YFrw^Yllr465FLb_{%&#Gv2YoPdG9*hDZ5ZM53et8>y8rBjpz_<|{S2 z|EkDv93tJ%WkK7?&I$0MXp-4Ou_lbI)w6P!x()9ZmWg6geDzHQ{#uN~X}bk!0DJ*z zJP>jbaLiDC;Gw*#Rs=qX;gTpch#cp04H_MiUN|AvsBkbj3kP&EIe6U`imA;&Nqva} zbGBdQjHz6Xl1`-!*N{6mKF!ikSQP8UJ2wRcl$3ckhtr)B@?<1GXN9%#^#hev-bFhW zhb;w8e84eHpU;%#EQR>_(pA2<;N6pX!U3Yx>8)dulaI2LQn*0xWg}Un#~Fj2=qiI! z;%Kb{fVj&C7{diE4l0yEpL&>^-7?OsfsQ8++ni8s0YeGDv64!ne-z2}4jw`9NTzbw zAvwYIgwt{PORm02a7b%7O_xAd^BA7#fGhQ2Hh9QY*7+-94%K})o)mmG({bc~#O2aiy2~w&^^PmWymcAIVmoGxEFarZ8n94jU1Pg507J^}W@#btw7q>m zSCO?>ljHfB?)qs5aKu6%q2@^f?8b+F9e|jGVY%ABSQimxqr(+wRaM`k-F6c9=xKr4 z`Y3X$|9j%XDEJ``Vl3<(a652?+`zW({`2~5i)wHv0?$}me+27{+MP3kx{|2j&2cVN zvIxk4mvAm`5G4@(i6=Vx-i0gi8-}ceXcln{*uZy)Wsz09Iz>W(dhk|Y2KYf^dG|KYS@F`W#f=NKF ztMyX1@!_t>RY(zVLZ~4tJP$!N`otyX6{0?J1MVaoJO^2o?|%g#S!t_f~Q_vu{1(}vv3kX z7G@Q&Io1wQ{(SRv&R8u^_jJxo;*$P8c6aPOqGr>#LKw&<&ox{mc9h-9is$ENrg3HZ zTF)*D+`041x>;gIJ)iE-Ee)lA!9*6BVm#j{+uvRgX#={>4j|j-<-3;)>4FyzPbVX% zf|V5Soyi;~+q(*QZCs)OW@V}y?_)<*s$VTKT zH3g&jN<7<1*)9eCUo>=@gA|J=ro1{n3&SXOZQzBj$*p-H&8Yq`;p#}p0z}eQFZM6| ze+8HZLN2zDCn5s9mG7$7%mK2~m9Z4EV`iLS<{~uqo{Ldlyi4cgx)mdRf6*Ca8{!-q zxq7a?RL$0u^MK()wE9Yq@Ka0l)a<&Ld#d5><)xjBVPDOyo>yl@PXl3vb*At zew<{c6(8(P_(y>!X2s&sHDaG9!{6O;)3&Wj0K_0fAv5BJ(<_|3y;Io#$3PTI7=WH^ z!lhheFP5;W|8CtGS-Sz4^u6Yl)jiCyj`0!fD|xorO_1rWXOv}OZM3VSS)Vv)!Z`y! zxC0DZODv*O=s|+a2a~up!GgZ2^mR2)kA{vP=hXo8hRk!K{0#Ar*}^81+zb!B=pmOycQ#fRx)AYm#(pv#F(tl{hsg0`0}$!4TzQme*_6`y^~|6P`~knKSGLo zN9HEcC$4F;@a#KQcf(OyZy5hN;tI3P1#C^5rC!gg@l8?=p5I+=2~q<}F({ML;0rlW zVq<1yH*7Ija5=qfOUjyJ$E#fd#GPCN(V9o|JjW(+=(!Rd;9o2VIARc&#o)A$?)|gS z4PX$+!ZDVU6%XGT}j?_n}cr zRPM&RWw<14z4PSZSAllyXOuMV@!@C$y~_J3wD?Jxw7rXpseGD`S%>xQ#)Z0Q-Kr=gg*c>5b5wZ{@5>}DX zb^7M$Rd-+kh{B6q7I5U7isl;iHp817Cv=Bj#f)c=MR5cx;i14!aD z_tZel$~N2ITJ0O+4@!CxW24eJIKb+6KvZ~1Lt`0O8w(_(2i~78eQbkIvNUJ;ACbVQ zQ?JRhu8rHxHxcEO{Iu=t(cFJ4Q7jJ^2oZ9}rF6BLTH@w^O=n19|DCD5J!>XFXz>Zu zZA-7^gPo0<9Lz-P!wbGvy7rNz{TfCE2o-m%LA)+B+IMTyIqcKAkIQ38YFmo|Pvr;U zyU<5HUV{eEF}s5%cquPP#^-_#cBU7B+W>0luJ(OwJ9y-eEcK3%x`_NORJW4N{8@$I z>jd`KNBJKoT2qbeylPK!`VYa-E{e#J;923n(Hzh0R4`}rYZ(<~s%v)3QMqIDM2J+%h21EnfVKLM zVHD}2Fj}$gk>!Ra9=T{FO#{pYC_jqFhEeVK@Zwj5Jo$JXZ}Lz6M6AR7;KXe)lFzG5 z^8F6GN!?t70-n~JL&u8Y2smoumYl_wtQ`t~U5S=O$3k-!2s+NB`a_2`#_ESRX}CJ0 zjFQ&i+FDDrm?Wf&ta(mhAYC!9RP6AZ$|y<-+W$LyYLqIw#?`vvvmsQ=blE-uU|n>#;z`~v@vER!vojTU_9FSIGf8Xnz{GOjQdDyoy%+ z3D|I#maR~wCed*?fvBBuP4lAdD_thmzW9t7ee5n|d0DeCH!S(7?W(4KDL4TN#m;c* zH(M78n_I_=%Ms3-_&ow_0WXc0c8v!mCD1p~kvFlDy2VL7rm1e?0)gT_e+n-T%wcyl zP?nJh0x(`e4>hSU)$c&1Uyt?Q_8|u=7*jc<=0nlY)B;dk58lDE(akUK9J!!5gz7OK$`lRd(RxQa_~-YOO!H6{X@A~i zaQ{)A<_OCIV=YeD0z`ew|96JT?r=WtCL>l4^PoxJzTSPJ4U|)&W8)Wu@xn5UJkfRAb}6x+m4Tz>W!qdx=}3$cc-RIW(#IM? z#tlPRTpck*OB_iYa)bj>C6h$DJa}$ZiuQL3EsDp>M{m;dWF8F~1u;X^_A=%vQ*Rbs z6bT)+g3-*u8TZdcb9mAZM})G;r4XMgyh|;2xc_IaECjgoxxA{ZUl8WI&uf7KQ~uoO zX0r>_QA5^})#B~&L^;2q$dB3Ts(3whKWoWUYb}z7(s_Jz61L#R**PK=UBJ&tJb!uI ze`h1Na8m!a1>9a7@bp*4T3N5EmCLEm9?LW#TvuyV#L)5zgNZeiJRr`Ye-O%*U~ zAlPp_iq9a6Sf*3`_gr|UQC{&HoBF;X3FL$M2Dd+4D$+-_OI*<~v-@wGwpAlr;kq*e zrPBCy`7Sf-Bj!WwKXP$(ZKN=TI$B}TuRBzI$0s6Mb+D6A8hJ9GTAu9j-z^Uk+RSr- zi?^7OQz*6k$v`^!MJ$EH`{=S!k0j_hSDe#ghOHc{9iJyY*`nX<39s0UgALM(#UOS|@OEs2(yE?7lOOfd*ZI6vyz6^D*x)dJIob+sqKJ$r;7tu$9(-bgJR1=PO879Ea@UIA6v`3qVWTA3DYJvl z*EVQ8?oj{uMs$im^T~_i8TPyyuuLcy?sUKVNkO|LRT|VcSR#C+?0wg^?pH{r_(1=< zbN;hB1eQqzffQJLnuQXBy*kcwxILHi;*A3Z?e7ehnfr(i6$Lgg0vgjD$Ie=iRhSx; zrRFW;l@n$A`-m!v>rzF3I_1=Ji;*~O*fp_+UNxWY;`FgIaURHVeVLmVtsO6H=3WZzo2WM{Mxkt*64-=55>%z{zyzH`oo=y-R0GVttT zX~ATsN}~J{!zx&OE8m4d`XPxTLC8vrK4%gSG5uS0iXArmT*I|?n4(Wc-vLLp78x4s zs5atQ^r#2vqj?~en7Bt~VcH`d<029TZKR~+P%0O8(f<-&!?DPhR7`6K$Q??iH4q0l zn)2hoLiop7>D)0n$?z4*gB&(Il3F<<#Oy|!E-R_=8LEzrtmUwIpjj<$@`1m0USfPL z|4m-ju<=0{Lv?XA2rC^;xw&#q@gPz*1Dg2e01+=voAN1B%#bMV#sst;sL%`|fL~lC zgOkdK5B0$4m%I5VPxQDf^HK(rhATB?-Dl5!8Yl;jm4!^78QnMsCmwP9 zLuzqH`%7DsL=orJzGT|v84lb>4d?&ItT)Sv#&%aokeeHi$)Vkd;o=$n>lUepT3JQR zp~)`%E~FyOOa(FLt(?GO8;7>E#@$EH`>FKb<-r5L@GBVbRWoo%L4zSQv8 z+nsfk-=rtve4DVI9h)+y!j z`o|IEQZo>`%xICX4A%EBX^cip>Bdp(n6~~JLPgn*Qd)~k<~$2km<+7pBGOb0JLu>8 zAjRzOSNiASoqW@(3jvv|PlquFz5bD}p9y+aXal-sAM7J9_vezP3$R2@Xaj`Re1a2_ zg!D$USn`Z$^MW*e9Lg?FP^P};Lqh|h^|a;_4mo$uk+s5P*H%&Aju6eyM{=@F?aPB{ z245KmUn+@SYdFp^rx&dl!s|B7*UVU-X0(0clahJw2!cOT!YBEB}p1)=4#rf zSa>8l3Hy)nF~C#{H0vRykisj}_ZR2o|8l3F6a~)fuGv?`zkriO+9icI@1#&}w4&*y zM3n)fHm21l>BW+?%c_qUuASxuAeuRzEQ1JQ&$^;_Jq^L{dKyg=5DE`|+{9Clw37Yc zYvR633{X%;Dnc?CU+AyPEIj>S9vH=A$aRpBzFWM^+)hZBRUW!~JIq4)-|#9&{2{ow zzp;XtEr0Fu_#tY7Vab&1J8Vb(j8e+ho2Rd8-el!Y*yhCiU9p=)d)VkPC6l{I5*H;X zt7#W@xc;7Vwv_DcT*$Dis!QH%&ViJu@#67e*zWK=xQ z$b}R@e4<6aONzB3;q@t_-zHCEz}GlNd0AlkB>soOKz5ig^6GNTrgB0J4yr-9B^KT+ zu6rANXBhm+@h&vmZz z2aM$|6p%`RjV5}E z-@dN5Ghi;+Zb;|ZA$4^kF?RRs{kjrfdj`w%y6ff}Iqs_DEajd{i}lUw2wsp3q$0K_SNKBcc^G! zjvG|~`*-Aj=w9sMYzq2q-EBdzG{18+8=+LeRtc`k$ypk1rrB9Kwf_C7Ko1^X51zR; zk|^H%)JE?%3YI+Yh2wLyz1D6OVkH@G!+p$cUeT-wy?EHn%j7^n*;joTX*ve@ds#cL zenmC{3uah1)^$y@QN}w;x0uHDOlhcEwWOC(X0H*A9N+Aj(3LW$IjvG{HVpU zsFal-Kl1rqeSx_i65PvAHwMF;-gSPGe4=3w@bi}D0wBI3nrF8~T9Q;x+k=t?XA1i6 zp$ktJ4sbom+e9wR*unrvtF!m1zR9)DYwOy;j4aLsLI)9} z?YZ|_ws%>aQZ&=!p61L;Gs!jt><`R3&8?meBt%B4KE4u1@uru?Vy4pz@n#PvO- zS|JkX=y4VUMgJOLu607P&uf2xaF183p9Hp)7x9&XKlh&&VqK4bP@i8x2k0UUJm^7( zIJ6KpR98dgs>^5`(<$uWbvewR#;BfQ0w_%2`f5R>tiEn>1}dXZYEo;VI;(;L+x^@I z{C>Bc-es_2_0qbLqoH7@`IFQW%a^)yMZ#*hX2)oxk@v?QGb_Bf<-V(Epn83Z8Ldk) z$W#(b2|5<X%H{>QZR(`7T#UD)p z&6qWFQ_Z%j+GR;B_c>#|sY{ z7VKKX(f}89ARO^IPHIf?W{R{qJ$t$jX}xGnj9HT$B0--&r~xVQn%he*^I1qXwbbx|WLuL1dCCk+eMbJNteRK{r%FWE--Q~@X9hgh zF86z}RE&4-gxZ?#f`zedVR0EF#bIH4+t{#Jvvvxf7)%4$)&orU(SP*nA{n`r!iSHj z7;vc?uG0Msm8we$Q-LjhPA9wmRNnAkA-Sz{kOk024Cde?0lgV9s0d|D!1siMU8Hmc z!7#(hAo8(3&&}>1-Rq+7ecm+huShp5eNa1mD4)Fz?uGN#o_-X<@+$c)?gX( zEw3)6CrDS>_b&B^MRH;-8r6WtLs_U0hr`kx6W?Q*XW2Lqssh#@JRe?(Jg4ZcCDS7u#SAnnSYCS;VJOLh9Z=&=LEROy+lDehZ2R$St@^2t3j`NPSd6O~wx(3Zis8 zqJ)=L5nScYGc^2r;Q)Ohd#kdPClb~Q`ttlyY}sMCmOI}B&Z2H{{Oo)Mp|a6l<>qn= z98-b0{_Cc~3$89t4UY8F{PlMvWo!D~lrc}&V=R9l2dxC<_aanrUFZy~C5vpq8KdqR z#;gn9fpPT(i^}tj3kZ~aP;}&KzvJ$8q; zy`lbC^!u0HPZee_b4=_hwWLs?_YTy9F2@2P zBI4lmxL%*Qm*A>)0ZUEH2TYu*xF5yLbzu91YLsUJ(lZG`qQmgk7```uOrwa7Y1=5N z7D^<^)zcycCc&guvWD5sr+RtF&Wv|r{lj&h;ftjGwm|TKjdd^LT!K(2Ka1YSXMglT zL}au$988zF94UpWh*pdnv1csN{A!$x-?nEOKdZOZ<8atpF}AeMTup!8+!AnxG;Li{J2(02r<6kDDvGkGXFt8a!720R zZh1|#^I~XO`?czt!Xre(Ekeufq`C55l{+;>zvtL{^px&-2WNATxWS1`p&Wm!9iRHG zlir&(@}}qrFIUUD) zWWMx(?P7q-#p27~PJ_+xzVb0{TeJ6|k8M6HHpAP@XJZPNf;Iw;m}%{R-{du{zvU5a zmw(Au5djiF=7N<4+4Y{u~mc2gUh~gxuhfx26WMuZHB0 zM%`t7zZU~0Qblj4_@nlmcB{!0b|WeZU(4gQ2p*d-6ks$)#}2P@ayox&+#+I~k&lry z1>`xj$}lbs+I^x&(St~@Pj%=&c=n*E4EOZ2;>u44t&pEK{h5Y+@*wF8Q|J!mzkty3 z)g;iy5Bkm)^yi8g9wZk&D?;TGS!PB@tIode!~~ao)fnfC_CG=BZvBHBzqu7&IKeha z-iuTMV)b!wyhu93olZ}#ccdiT%&i0dMW^UA?uq$75%9{bH6Zks-!HRnu(xf z+-F*@<9T11bQe_We1j`cC1ITyrvcJ}IQE+^x-zJFtjAWzu#j`Lp!M<9p zNy#pXh^=6w_-F5*H9f6CEP6%ouTuZe6T>2w)YE+RFzWW6(dQ?_7&_{|{ffe?BFB1@?v9@J z_wxGw)~!uoJ1PN4hza$3r^eJ~qO{_DEuW+U) zyH^oQtsqmsgGH~UsOU`w`pB;FX0Gw}$@zx&_^@(mj(u^iM7?&c(%s5*ERFP65vVwUOc zK*|f1+1dDU&gd!oqRpu7x5b;$3X}D~YMRaN;omHmjn*rMOQAmkH;ES0l9rBm1G{(^ z;l4Cp!#qf-*6D6tX*{5@!i$SwM$>8<#=HhD3c;iA<|k8HG9Ye-<)xrc$JP#c=YAPp zbAuIfiQ>3CGZqw8+Yt^{L-t=$dE@zW*!eA!H7gheirJMpc7?5n-HB;l&8|5{j|pGSZp(&yOiLZQHavg z0`gCHL62Bp-LPlWmL_E5=8QEH|E6uwpSN@?8Cv+)nr-I0*Tn%Fkv0E5s9%vV@UfLk zbBm^%89*2e7U zD2EtlXIMcjT6%WMTzL^+es;cYS8Ggb-6@iMR}-gr?fOL)wKEy*U&g6bX(e*B@c@fH zFXX*O1-8aGpeU-E3<2AZC~s8~`_`@>@9;hQB-mHO*_sIqmL=kWSTE^K9690kcsz3V zV#XwYzQ=WEpzGCrmu7A^{BRHhCKSKR9%MB6PCByZUp_tKq*f}=8!?qVP0Ve<6L0~E ze7Z2LY0@jqzFh|Q50x*lWz!b|!97}`_wV@0kTK?&ahl#s7DaT)R za?5`-Qc5%OoqA+kiKR4xVMNdIqweP$8Zw4>V0RQVF=)5H@p!p|VBvMB;sg8FH(iZ4 zx)vSXxF^+}G*YJZ#cwx{{qP>5cok;^6<+-nFQeQ2SbaBY&Zev_)&4vz;HaQ7DqV~8 zzT@K2%uW(|;1h!xMb~jpvRAf|&+jEeqo@hs6W-`+(d7O6TG7s9V+qq_qq8m&|HVJD zOF2@B-jQur<>$K)<9$rystinMm*jI?iXzR?YA3mk5jGDr9_Zdexr_umy9~r~o^QZm zh2T3ESc7|xt^M@vM^7*AWJW2Yg)|X#u&0DP?|X;iiNBbM!@6lg!+u}`bOq#~_O(vs z>&ig-O$_H1ys3;zPg!PaN=~z-kfTO+k5)e`baZUvSy7-TJ2SF69!iSUM-!l5!UIOHsDRWsx83~uDP85)PqqQr@x!H+Jgh@3> z2PHI<&#N?=iGHTVO=sZJ`l(7S!Ie@_se$E*!kDM7>Q8cZp2HKSbm;zA4zy zmR;@Lptq}T;@A6Q+l~%;f&&3Hsc-@;__HxOl{Q?0(%L5x&BwasZ=jB9!9CJTRCLV; znv-Gq!-TU%Z=B}}+Yl(YQNr;9dVp_@BiHmxh@78y8wV5S^gBLHwE&GlBMx@=tc89T z=HMjJ)`54fZ{|+SnE(yGQe7O%a$TG$&LE&{k7a7g>Qn;qA;jOzT}#ziOV!?joI2k~ z=dL?2do1b$oGN+l9~eZM{j)aUMrxlntf5C zZhCJ4b|(v}y4V`+)y2+>%_YW1Be)}rH{0PyA&XH6WfxrY=hc(Y2%ZGgC{pchrd+d2 zZBzQ%LPnCWDZ-gc+ghf9Mie6?>!!Dja1z@bW)zf*PiVJEDK7+OX93`-7k=rU+Hlf| z+ETB@A2Mi1pHcB%sWF<_t{c(W{|1R9JIT8auYqBzD)INVwUjLzDyIrk!yFwl+=&O^ zJBuIYHVie9vUwj&%rAHsl?9)s$15gVFY3N>r@RawDyw}=agZEB)$c;}y0Evw*~o9E zRLXivraKbDa*)lx=-p(}TEjZ!8ng#M13|@x0i!w-jLHgFr^CXI% zEKqlo*N3^LXAstkVMbA?e`#uhZzzK%wc`_vVa|j&Vt+cwNO9kRUUx@jvYhLu|8L21 zwf(Fj;_df&{_bG;HrhuYqEiJ*uQr@?;p#olOs6m|V0tQi6br0vf$vPj6fIP(iRl|N zh!boyLIRS_FMG5)DxwvDdSK}(l{hBpnpD-NNTjZ5B{UmUTQ%k+OIX8%a?nDid(a?uGRRC}d5oJ0m`fv+R$O_y_A(Z){xQ!;;%-+GXbuurg@HS= zC}#bLV>J(LeJ=wHfX~$y2IYRJI&cmFJ5;10i_dFaHJ z3Xx+7;K;$FF^>3sDiMsBAn{QR>ImQP-z@A$!@+t;4w|PW?wxH&^coyVRt{fw0x3Yn ze(7=+N4c>tjetB;3i8SC2=Cbj^D$C}hpdr2)frQ$&BtABSs@?3@w~pP0p#Lfc*_8t;fVR#`Fq5myN?w!0P$r)l--XVct()N_!VXe4p+L2F3gS~;q_ne=| zPTiC3;hoHk-eiqGm_pYHN8wmOa?Cv#e4?gzs2k3mn7RBawBtxGDj5*kZWtRR?8Hbs zFtZ8mZ6a>^IEM*Hfwj%#N&mqr|Ha8?=tk>aBqQ>iYbGq_`z($t6)YV?wNr*uh5oK^ z3I%Zlhtjzr)U2B+q=oy4BfhElPhuQpnzNBZ_(J(bS2fgmuCK`mOJn|@6f+SiOVF;2f@JWCzpY5U&c4+ zxqv)9F8t8y$iP#mAUo8~TW;Kcas^2oskR4=9?8593EXOvhWLv;bHc;di4^)Zr6+8t zX(jv#&bBn{o1H=AeFZb)OdZoI5~E~9UaJLG)6(T(>uUo>Bf$zm@8CJG;=Uq35}n;q zHa{{TDE6&6eMD*Uv9 zJD3uR3W)oIk)*IfTe8bjexD;Ah}2zA-m6!HNHyJ^hn;<&wme^#b-Zbnyu(e0u$AIl z@&QD-5u#m}nB;uMFSlc1x`x?

-0&{SE1&dD0s(jCk)J=t{sisbySlwriS;95A>q zZ36gq0n-TzZhLoW9QYM*1MKj#2>CudZW`uaaFx+&tpj4F<6iwE6Og>~&l%id<}0c*ab>sKQAs9?ewZT48iHVw+x`sSXV<|aDN5R&_b&csu9pEU#s(un_Q#valI&N~) zTd&bq#@e^YrFEj?KmJ~LwUv-4<`gf^+NAfl@60BQZ&|_$stY-vFwC<0kH4mPg$LC5 z+2l?pXF~}m*z&7p_Ji zw#>S7d46IK*yyh18k9jEB3WMu zt8tS&5X9(n2+Pi4FQDxg96Ds}(%yxQ^22bQUq0>lU!%_o($*Cv*CB?~^iahDK@ait z5ab8fJEE4YpMG&7Q>nG#sB;aVo;An7@qOm26fVRL@emsw5feT0PF9Z?&CU1dk)3f5IVFOY z)2sPue0)fRsS1?tJLHE4bHgGDnRPD${H>(M`~)yk%_wK!4~3C?SEDdOcUV%pOs(I= z9IHr1b*pvNdQ9?a#XZSy+;TgPJb0jcv+;S5ZjmM!GiaQ4f|_C9!$|}>gl6;-D^T*Pn0js-aWjsW$N+~M#psq41QpE z|L)*VdMplC$_-+XqRm*#jU1OThg`){cUw$*kKhvc!2!RVKd>p?Q=WiH;oa_`if2!7zFj`fV21Q^;t$Le&q*ZPYtl?$Ts0e!vt9 zGQ)91VE+SdOg$qk#@i#)Xad*vADU)u&=pemy22s_AvzE9QniwG5BcV5NA19|1iRpo zycsaZS=u*4n-nQvRnp3wX*7JSl_W^nS*itjcPSgRIKVuDot)$$Z1C%#8ry*A^}D$P zQ>jemEvO`heX7Zs^u zX#0Z2jVEuSp05h1_$rjdME?@%-Z7>V)?|KsqGXh9$0jem>0 zd=(ba>TlQT9*;U{eSo(gMi|aV>7C6iNkEw$>Kf*Ic9KFvDk4qZ_#N4lt%yi1K@Z7) z)m48@?6hOe-dNjQCF*x(9>QW9JWdo9tg~#sXPs0{>3ov%F{2`;gkgLF-~{ z=WSr|`b|sr-89^Te1j){=Rnr{nF(S_w}=DTPj~^+yudLW;X4KK;#+XI0k0G$c`O# zdqfAdqaWct38zw32BLJ(0Jn7g7c!ga-X4YCzjEsy5A`uzI8m(d70u;tyg*1I6H!o)nnMS{ssExl3SUHiLbyMeStp-MOl|kvh$ZBXBq6C z(bHh%A=D&aGji`(m@orv%kel7EnVF|IJd$tTnR%pa8z>)ND^ zdGy}0N_q!PP_j8rL5+#OPy3ax(oPukox$DF{2r55me2FcsL*n9T^)4dww<8bw_nDz zM&$fj)R2#@k&0t0ozF^93$c0C3p6B^GQTs6Nov|J>u=>L`{pM_ZY_=yB69ZUovAemP=WB5gh7oy9!~jQ_W_9Q! zf?s*xw?~aG{LgCpU)OAdYED(iQ@W5bGx@$xbd&}DXYTig+%*w{id}Tu^)nce?0oiL zSOnMzv+xy$=aAl;fU~Q_(%zt)M5nVbX2F4^z-SemN&aLO3%SSJ(o6JpXEYSpnmR+i zcGi^^yb@8&kVzy19Zatg*x~Otx+{en@nd}#ZIwDt?O{R`?ZSJnJ8s#HV5yNyHl~70 z{1FZ9l1cox-9tvyUpkRhwV^V(ygcE&s6DesPTy+)?^@Rln)8s!)QuYyb0cmG+A(d2 zJN*%QdZA82M3Gq?&A`v_47GS2B~6$zQ^#Prp;a;#FN|9RvShFhjSyU2E7owvumZq48W?9Z1sWD*>;Phue^C zHTW3XLXTUZyx}#RaV5c=-o=oBfz4KLq|>;yWQ^q4bGa96+=ZF4iUzO5V_U$T^HAGt zOeI=oXDoNRwP8Iz@-LW>4h15GG#+`Q;-Tn?ooVW-<>htmJ^4b9xvmQYe{Yk&Ls`+l zD;8tMG7Qs^2N3bSX!5`L4ZWG;dN1cIqD#0jpW;z61}x*mAsv1Lg^Ri0a%4?@2ZH{H z!zU>;{zHemi*0bnnf<{{-^g?jPdU`9*Vh~}xxs6!ns#a|GGtx&H^te}17M5sV^YS^ zz*p3ok15tiLusqaOO=aCl%5Z<0*UOSQE6&mYow?Fus>;YOJw+(VPDb@{lx{*5^kE9 zk0u_`S0sm*uU;d4gk^BBj_Wi;Av^vHh2O){gM3pQ>T*P;+NMKEQG78z7A-3}E0WwE z%;AqTU7EZT8zUV|T-d`EvGr?fr-#rtycw++HZ3!P;y)Ipz`oHISac0z#9+LbaAd7J zz)Tc8>N%V60;Ri?w_4+R?PEt|b7wT#w91Lt%G7Hy+6Y#W`MR?H?}X=~1s0-E6vkX0 z^;ey&v6ju*Lw|PsFu7*A=;SCITjX`5gP9}-LhOExJ%{sW4zFQ8dfkA_Om}sE?6+y7 zSLUVaS6^M(xPnCZj?W+s`lp|{mLy!eWF@Xj)DR}*%F2(e(L8!;i|kxabY0%DOK&~L zZ$`Hrz^AOxj0a2sUMj(_W5>VKvyE>}N4*1=uxt8X{_X!mD@r&NmF4#CwtbG&fAZCT z^!2*RIls%QUiWFO*vJ!}5p^v)rzO4laSL1;3FKyaCY^E_nq&x#QiN#UFLD+rYGPbR zBm!+>ljJo|SsN3r>#RGAxKpCK+mZX$kE6L2xk+#P+4d^QiO_#p?Ph&IANl?8=^N5c z2`&RA4-Mfp*N&)3=HHRzwV4>4lB{UUWUwiqkXv!OMwBj-zU zmA;IcSgQJS6QEKPs+3GB#N)0x!q_>+ZeyXI z;3<~s?NF@)(>5Go{6-ntu!D0?AS3N1f+jrMqqK5uH<3+6Qn?^ix%oXS=SyV{rDYEx zlJ}>BRitrX2Xp!j5>}a$8k<~)1s%i|+u()c6`jEyEXO%?)dP_mPS<7m#;*2_ka4`< zc?D}YNLiS?L5DjWfbxq@HvVu^40bIbXjH|fxF41X#1U2iwh)YCN-hTx@uAO9>*ShE zW}7KnOdZ<>Mf`_Sc33cnv~lAaDQSH)EQ}S6bgVnCiT_3paGP$FiLAZw=+hDQ=lnDE z`&CRJ`uV@-WTOrjhEv#Jzib8ZT4Uu0+zy328mGJ⪼YIxYN+B8$BT>CrXDag0ye( zn>_v_qBK~Um$H0g`Q#1@R4umPkAfQf$(KGjN9#7Vcj(J%?s$K_K`;*pP6eWgjw+h!?;?_Wk+u@N^vaXxRW?a*BpRB@=?F9m#g9Xpo-4=?^> zwOHQok0^Gw2i@Z4$aH8_^m%|F`XR%#JUffNz&RzGBJOZ-sMWqejuxTlc9X0H>-r)GMQC^_jeF=0U&Lqj(1@4z5Gd6 z|5ZL}JwYZtf!=Wnqc^_AhelcFLLaSosPN~VI*tt{kFE;Wm2v+Qw6qMsiDJm90-C7c zRRb3csaTkk9fyB*-ZeJNVHJcJ*mbMrq6$yYFE44doJWuztK}u=tr)X&ac#z%!i;m| z2E+j0qb<-bd0^frRrby*lE^ZNR0i~N5zZ>SG!VFRS2?7LaKSYt!1EmFzhkR1Br$mB z>goCvjQ#Md!TVp55pnOFyltIi6sx6wcTaSCIE&mCBAz;;MIal7+v_l3v5jX6(^ghd^zmTyh$U6))ep6 zD+wR+isg8`1ZUn+kQc2lzAX2n7Koc5 zL5S{)i>av#5lEARyfutNHO*a5fBlO0iUQg1W1yqDX2R&y_h9hPFTYsBPEYOdo-!zz z(ScRd@=cU4xiD%~e~{?iLfZ0fPoD&=}lZ=n!hv2ioG|^_N7Ub6G66l3N|D=`+ z`X47E8^&GrUNW1le11@b1#PxQ8YX#rHWJ*yr)$O(_|JTq{W1*Qc!TxGxOj}cM~xLx zv0HdijWZ;85=Y|BS@Vz)wL{LFIiS;)Kp>fm( zmPm9C_zjQ~)a;%79Sp+yRn&u&BcPLE_&7`$H?cxZk*JGO5t=d;Ln zL^X3PtLR8xy(QYNyi@JbiXUvWo}JBZs?+F=0M) zNYm+A(vYFNavN6QPqB}(yAu<8?saYm9<8~J?LlCvGUjBo zQEHMeJ&oi|j*xqBisRY=c8H0<1n-mm*(a{}s;xzK-wyW~X*!-1dNA8x{TvmVZH}hq=Os-2*JzzW{sJ zKoA(Ph+PY5ZWN{DVzHpwZ>s;T0^w(<%Ws<%<^P25c006*% zlcI5HNjyU|AbLhJYGrcD+4(FEdey&>)SM60*T!?OvAKKXS+#44ChGRapRGjwS-J^r zE_j-&&(WL@IY&;*%Q~|S&&^M?V98U@{S&E50HCK2b}<};*#w8}*V9VhMjdDnlO>*o z(nv-sp07YDr6fRR){|vW-$*`PogZEwhkvSR9CNbYdOl?-xX)E$w$~Vt7(@gF4yR#~ zcly{w?_&N-P0JSSDhHN%lUZLB9+kGJ@|PJa4d!yHShlnm9E2PD!r+Gb8om;8EfCg$ zMS-5JDB%V#bNYrmjPCRvxlhy78ayg|8Qb>2neFpy=N6vf>J>4WLbM;T39$$-!6jQc z@fvEo^G2$xXf!QEGEP0&9RIf@sUGsfeF zmUw)xqDSI>FjD%?+f$dhd`(_ZNB+3fHtI;uWp?w~T-b8VV_4^2PfR|mGpG`o?Ub~2 ztA1lnvS%I({qMDNV|kuOLexRE)s|#SB9?21-SfQPS(y?=gZ*AI>mGIEf>a{>_a2v7 zWtJzCkMuevXzaoywY4fcS$vlMB1$XvsE$VQ1d0fkjJR*p7-NT|SW$~Q{I0^wgBW@) z&XdiluT~Tl52c@)zVHubAOlM`sVpnFo(Q_7&0LZvxWB+#z|vF@hT)2yQI;0ONG&in z0>>B1HhoGt!dMP*fLd^Nt^TbIi+)S)JY5(11IWo77 zx`depm9J>IGyiyJO>-v}n{P~{fdCr>-xuv0!6IOqy7XH+-k5#eI)7uDV*mgKVP8=o zJOXx`Rt){B7#ju1qC!R(78r7hXlo`V@KBy7W!R0cmdxM>U_VAT@(Lt1@QhFO7YFx{I zLi(R2tIq#03^1w``0r8UIhitcwL0y+h1D{4voOpN(Sb{|T#$4j;PTf)emTL35=GH9 zy0lG$MtsE-`02YQlXVDxz=owj@zj_^itgzfxj$~PKM3nrA})a_keF%&N0-1shQkQm zfe^^Ev4Nf)InQ9XNzAa|@2$w;pqi$PkL|5Fz>36A?*RyB4_Hq>+s)}K)Tf7lUOM9s z)oX>u60C;mlC}o3!_{($%<)cdH6GMRTLGY8#|?2EyQ2=5v13% zHoIf#X~+*{zc#~N4+;1=8gtLOdWMHCZwKrhx@Xfb6=WcydHOnkiLw74YO8~Na(&vL zf(-zYb5FSU3fsr}9n^?J z%xOlH2Tonhr~A!&7TPZR553tdiT}FHr8e@$MJY1M#GtPGUwCoWoXw|l>dJV(Dnu?b zKOD%>qR(xx71HuiY`&w_sLC{_pZ4}DPTeO45FluX=soe&DnyHp+c|ZYJ3t>s37l-Z zrId+6ogXx+vWSj}kYGdD&Bw_C1B<|Z{66Gg{@svyS5=Gbx|M}D##x_o=q0c7E4w7N z#?|pR!B59Wmy?*%yn^U8T+9NT#$bS&KM48ZebRP8Tzr2n-s4vGWCt_# zv9)R5`R|N5g+viP>(nTh#0=KLRt4FR;32z9gZ$CTtMlU!4@TuJBxuFP!|O(h-NolZFV zVCaoXgt$VAHfIB%Qj2EG;PC11@u}{q;&;u`Sf#SItW``bN#ZUEu`%4>*uhk(ndD|&|98uV=sS!G1=?3WP{Kd1K62V3&)P&8)+eWokX&*brO%#Q2}m4 zmC0vagAN2+D;IQM0t$GA4${-q1bDs+AnPP&g#|SProjOeUwL6~bdT`K0T}+nf{hyx zFqA#?JqpfDWRfK{1Z=QdkdKiKV5dpay&w~7rowS@Ww?@~UQt8X`w(@@=?RzAAdk{+ z+LVY-{45pbz{)5p#L8WAm$;p4##RWou}~3QpM8!1yMrsP2Y^g9s0buXL;F57l`K{S z?~o^MgNyAYW{nsK*_eA&pweDpGid975jywakuCF++0Uz}nBmVqN#cg(i}e76ZpQWo zC}G>POC|g}qQ_a&&mV~Ga$)Y6S@azJgl^JxF!T?4p+kIft+;f!3Ig3O&lh4P2c&s%=6 zJ+_uB;P$yWRWFeVxxAbNnp3mh9PUj@Uj9%!DVC4H+qO9ytng_OyGL*J{ZLc!Maegd zcfaUH{~CD+2}Z}8hxun!bg7c_vegDFbkDt2!IVnf9l74lyLwyE&AnuT{bwiBFHBdB z9$KV`0s1)&T)wEjbpP+DEaeJX*t)PzLugKLPT13ekzu5O zX)g?AyMTPvF}1g@+KQzj{YG6XcZ{qi1RdXiyQVJh!KX)c)}0Ff>vt9ZYa%W!k~T*^ zVY)b1aoD09SmR?vzh~0zF&c5mX^2L>J?K4lK!>F?UAEp$(>IBAS_%a)?EEs z1^X{DfaiWct-%>qfY*QoJd?OP;wFfYCQYn3DHTz(YHQ;E7l^3+R~(06r% zML{rt)@HO)DhBb#YuL5(=KobCNW_~><*r?jZIq$m_f||IXgYF0qNY83D<>$YtbBcv zrttn&XpbHyRvEGpmL!>OM)V!8m}ms)=6r5DX%|^uVz&Th&47gqhdedXSE(}zXR=hy zg-XXmtW~VlAyi!Q8(?dKdHHWr^8h2gOlTY02WYWCi zm*0enSD&U%8m*qGp?@%nh>=AZ0iT89^|m*DpO+4~n8XN>n@^(%etW#`6WI(08Pk?` z92u>+-_f+G2|S%36ufUZWLrcX{gukJNgih4waGHkkY#e|hC){MZF@2TL@=&R8*ui1 zEfPDxwt~Af`f1H6oC29efRwzY1F!*APC9%JACod+FKXtDH5|Y?N<8q4d7~ z2JyW%;N&K~yfma5n%z6qKC7Qgqk2Ou=6_Q~_hKz_;+}&+MBS$9oJEaAxID`&W+KQ; zAkrC}JQ-^I4VI#Q$^+lSnY(+qjZrx#>`M_2WZ82$hm%-Ev+qUQlsY#~eVX2Y6EPg5y+Uk%_V92QEV?2(=NH zTc+MD5hZmZ-O_5&d{(jGtW#>sju)}fSfNvkb22m#%POKTaB<>k*+^FBU+ z6JHM+2}M$ZdlUt&gH#N*v#LgaM+c-tk{!}R%`tqjY7rk$hzhB#%t1{aVViBfQ2pn* z9O?U)YPr`TEnE`Sih`%p#gV7^(zb;A%s5o%ex`hdT zXsR^L)q_5e6Zw;JI*AqwD}5Y^5{8dkQ|+4&XWNiwm=aeNtaW|ZB6+eIctfU@S-TIwM>2ttbmWs(g_M@|1Gb?)4PQ)?FEzA~Ik zUN5tROXsBd!Gh1C=#GO6qSdM5S$;qrqKQwwx;e+0Gjl2)+N$U9QdxQPR&GPhU$M)b zb|_ck)+->~sg5Mb&*D^V+H`qqH*8J(73$%`zN8R^r%-AxKrVm&`zL0;bj@$FiP0-& zI~^zIc)oDEpWhb5|Kk2F7y7jo;gz?Ezpovi@W-x@_{_Oa~C;Zs# zX>XLtNkCDqn;V`-gUGOXE<-1Bod$ovfHa|to;((jbz8HlF*ZwWZI#V^ho#FkUObOv zDVQ!-8)a-?>G9`+2|!Vmh0z#*>ADR{2_YgcRr~TA%OpW5hB9OWQX#hx2|O~SRko)8 z3aqd9V0Hg=rEtpfd@I2b2uWO><#*yQKSf=ksUw5ePsjWWVIZq~gyCXnvX;akh>OV3 zNcndjISy*2>GiQ1xIzUOVh;6;%R*q|`I>b?7Or({u^P%j#^wJn@GiPHwCB6KEMEC_ zu{5R*CEIk=@3V;)7@3r?z2?#hp(6QwC3ImD8*>5w&)SE7!=GEo>=Qqcq)+AZM>X{J z{lWQR!o~$r5Z+Qgyb@S1abt_fvZF|^MDSX5O8%<;PF`xiyRpOfk+vC>U zZa>5TTNPK7aE#q%V?zF%J=@~aow&b!Wx^b%!O~~tw8ac-5$M0fq9Ln7iHG9Q9Nh)B z!|>a+s;-3c?I35U6@uwU&xM;bf!rG@m+M$3sf!YnQY=wk2n^;Yj{Fy8^|t8KYMV-W6&ckq>%Y2whlWg&pm&NkSDILN%-}N;qGzSw@+X zQ7xzAEPo4JNI9L86>|gf7k=cr))NZUV(lcbEouboCc|J;C@IBO)Hi_$#iMyyxF&6q zdGxcHO@^^tY^(&h{0^+iF0vys}GpEU=4JmEZZXrIn`8w^$@x}~f6=+^uR7^G& z^K6#HLs`MK?{(xr)NG+_w2Nml>{XQ|cqDkoMIh1plL#3)8#zzw{|**LDLndzu!31# zxJW%{xcVtNOxjdL{jVQ^?V#c)y?!ff1koYtvVA(*eXsASpVIkx^d0g`E>v*>+VSek z987wIkBZcGW_Crf05-|))&pMtY-f#lQpOl}oa|!V+FyPMDKGTJYP5-ntl?iDyLtmt+1b5k4)>Sz;-s3OWhY01rH7OqLOqQl|h(N z(ij1hf8}Br}@HjWYm<4NJ-Eg+c^OAF@2aB3TmuVRy^KN7<$qG%? zmmKB}e2PQ4otf4!I$_@(A%wuRke8E7?ePpIfuF=?Wu{+glCTqX(GpXLlXGM+LD)J{ zcFz{qMn--3BA~V(qqnfzPT&SZ_K~Cy0dljEXbn!FWz~ts08tZ@~l=~MT8$mP& zh#bulQEg>1h9m&AJ;nqOpvDnhYwtD$JAy!65i-Nj#x)F0U*IB8aXbM|OzDQV#M*%L6at&Vz=|XOBhkXM~l4Ob4oX3bALl z4jdZjF^65vlu;Q*dWxe+3%Tlj>%{R4^LUdTC zBoXirVt<2QSOOsAXqpUP#V5!QBZnr0`Oi><3qk6a@;%s-M(9*m5S)izMT1;mz#|^` zME{`mx6dU140YAvO95sJw@0_FkQ=D|r9EI*!y)Qkka_bsdnP*>fn1MLl#@YLkVw^2 z@syk9-wM}*lFB_s<7>$eF(3MyXBftDPt&)I(m%_Oe_9_Otc@EPCTV@_hfunqdENLl z8sB=(iaO?h_|%)6BpngtMr!{%=y0h9>C9X_?N#%2SMxi3<=t*KOHxk+m~%c?A19Pu>P2$we2l{2H)&;O!Ji4Jo1145g_ zML{-WYQqDBpQBJBL&Df#!&G4vG#$UNOoeDu{twhzU4l685w%QjPQVOX0l=2G3UxAj z1z+={0ptenlLqIeQqAOLyJfu@DN^)4>to@J7bbi)>;4F(AZ1WG;suUh!vw9gs_4uQ zgU>?f--%X6R7Z`KwjhQ#QRZ9aL%}1=@gS$&nZ|sq4TK{aie?!Jx%ge`$zd2Pj9xGL zO%CwP8cVD!rr3Q-(6D55G@-=ch&2LHnhooSwWV3Ti)X#5R-p&2;c`$JLjDC88mzF+ zY!Y!2%3JzixG##7vYClwBTQ`_a7xiuhI1jDv4)_%T!$8#(x3FL)hN{+oMb?sWDr*_ z_Dsn4{G|v>t(2W}prq6*kL8)oc*&J<;$h{Or9eMw5oA}`W^(TTogJm$u|OYl_;Psc zQO^G*Jg{{GCVR2!n-C5eDRc_Biv5EbcmT^khF!;$SKjzq-XxTWq^X>j`HFXzw{*W- zr5qN(Fw+iYy^-q8nIZqh?5r3&FUYw`rrcq1Hkno$>14wjx~o1k5A6tP|~$e_cFnVIYuUU0*uE?bnCX{3>U|^`2350rNdZ_BkVBJ)on=IR^U2oD{ z;X7a-E2Y+HAuneQ!~d1*x)EL{oF<9Y|CWjC^Q8nY>TZtd&`M{=ScBr}`f)4Fp^!WC z?kn^x!?MxeqI$!4Az!=*qrGYp)(YwurHe{@V5{<{l2Q0FK}dQls#Nm>Y!(W zAO{m6<9byfZf46C|B^x z?Dfqk7ay-N)TI$(m@LCq8WcJr#VfP_D)?7o?E0%nwu>DL$hRoFI1ZPa%MKR?@9|_- zNs6g8gmY4TL$k3FJfc-}o%>q`6HN=fM-z|c+k-F;QlBrRMJqJFPvZ`@? zrsjfq9}B?Pgw2IW0Mkk=`ekhFA|r~J)6~fr@4&t*J1qgIseL7H<|m)rEQe>LZ)6>w z6bd-NX~Ux~YYIb9scc|BTd<_+(}J18ZLjn;^>6q*+RUiroq;k4$b&C44+q@oI!zCY z!Wjl|E#QoI=(4<(ZJprR+c^pOU~%lk=+2?e|0-dSb4xQB-504t1F)=Y=ymvf;PYCf z(JmLb2c2f;Qft&TiVWiYHyCBr=VmU9}fA$uTzm#KR{<3Kwt^mHWAxwdBZ!-okPDxrc_#f?mhh+ z`ok9&ecF6ne9c|U43T{NMtQ9IS)(92kC__7`S@z>HD8Df?kqjb^a)ZDj}K>tqMf;Y z4a$~`wX-kvp|!%R?I!Y#Q17KdDgGQxoqm5^CLYso*4)2^5A(7oMe=9G@`%bq zE3*mWd+s@itZcB<#xCo2&mIpuv(d($N+G+Z9uQ3k^7ulKUh&(rAnz7_Fj!`ZDfJJ} zxm;uVFS&m=x=0q|J8Tx=Z0iu7@w9|P3bl5d14=KT9pjyxf6&v;RbI%c_{o~M*-02| zRD#sJRMcUm8K>>t^i;}&c#P2?csI{{uI1Kv3-j_AJ?f;k{Hd(3 z#rZ0;v$Hf(CV|~go*5pRb^rhAXejEYs6Du3# zxxd2c8T2fAQ2O#rumJD4qb%K|SPC>2YFI-E&##UvRx|$p3=^YyN!=~X$SU2M(;D8$ zV{Ff-@}WQaG1THCkgq>6o6VZgt4U9Y9AP+P(2x;0d!ufOBG@FvCbV}L&<;}sJmSB? z$rtln{;QlqiYwI%a;39iA}j6%0n%2--IP4Y+q{JK?DIhNUdx&OWmR0mWbr`S{BJ!n z+Z^C=<)z6#+SO9R|8R}AhpiFVg^Y5hGeb8_-QqW}bG6eEk9y~%;3nR#BYWaaG@1v3 zd3ws^;dFCuz#K14GoIL-*;C>MBR6-_mf-YUY<2pZ(IzM=}DDXofH>Sw0 zYF(hx-OJE*DfV|!NxsZU?^qd`w1>vVF~Z96;Ez5ouyGS%)Ori$flxpEoX_O@%!v`d zxf+z!N2A%~d6^q$<>aeQzE-@4umb6>zAaQf?J1c6S6EBxvoUo>WM}zQXDgiI({Wk1 z{#y`x-VY>4mYNQ$196tqtdrq^*Bg9C7QdFV$A4J&VRWZWX^VDMpSn6}y?9PMOlK;>Q-2imXpX_<8-1uX4*zvpiv#E=Q4&Pe)z09Qnaq7ST@72t?b8Ji6^# zKkq*)4AvX(ejzvdB+>>arcGOKX@bamQ)73j?WUt*FG9a)s`p#N$ei7kkVA(amemyk zdWn33%Uvi&XZ&+54D_f4B1$Tl-haggzhN^1LmA|h~nZFCZRlI-ZFTo*qoWq@|7 zgIT|DESjK5+eCmXn`BORW}2VmnShJy}b{g#czh7tp)T__O9vxQ95l(vX9G z=h*7EN$NjYj`##gyja#nl2|l#K zt-7VtUQ&HOUD7s2AP* z3i@#16*F&X=DhpYSyVo6YKYq^Pw`DFXB)jw!AWm`-c7S(&k=b680v{kO_a%nwkhGL zN)|n}ujE<>~Bx7orEk+0E@T1)g-DN-=)x=7!qo=mkROG+}wxH@yKu~uG zNsDF=_tF}oS=ipda4?HJ3NH!|B5}v`FnjKqlJuQHcJ+vQQzyHFK^URRhv2lVdfZ<)q9Rc`o)w z+p!SKUc5IYP-gl9Wpjl=_ag0ZB}&x6HQ)q%RcH39fWb?;yvipPR25V8H#07#@bsEH zW@6>V$zJ#Hy7;!r%b6XeX_7`~(WI6rhjmPoqabXaLz@snc-2f6bSn8zYNX!+d=Z;& z_i9TMZ?$avH%62~qBzS~h%spFhJ+JX!!fJzs|HY+`kxk8AVCm~!!?S`X8EP$_tKTW zsvq|2elU35W@54(J7_e2#gOQf%r5S^Sr<`VP|=otHT#EP?YRhxIUjrux;ygmOB?ayu_pVcz~G`e?UTc;iaOJk?I6t2hZ zmr+QOg8JC+dZ>!tx=gQUv=H1x-GaxpQ+{(uAFYG$J}J7TVNSJl3s{HeqL3E&r;#Vf z3At*3lI%mL7rw!Pw^%@XfR6x1f%nG34q4{Q78a&h{ws|c{A0f;;^6$3Apj;e7C@I;Q9VuhSWVq$@nHXefQ$sg z!#|iy9b6pIA|qVwsoQ~BfAl%)5`>k3>k)c*G6JVUhDA2t44Y*;3&md{>ws8W}S37*YK2w+Y*IdkhkIWW) zwusC80TrGqhMWE%jKyfbF(}d{+$7$WG?8?legi0`kGes5Cko)%n+H0Cf(9&sbZyAVC}DViSR5zKZfj7k0s zTGB+=!H#bB2r)vPz7Tpk7l zf*o*h8N+yZ?{tmij1jQ|LWNvSgtjH|);0d^sJhk0w7xcyDiWK8px%gN$g>V^ns2|; z_NxdR@1q|7X1Yg{sQ^AgMl*9=XFMD00%_}fnJFMZECR-+JV!$dL(h}#{f*mN9!22! zg)!|Ii*JCvmI1x_DC{&a*ifGfX(ybL>}-8hx%ejJ`G>=W`mMhDoSTc-2fMkxuFL%# zyIOTsrMKnXX0G4J^j!EK9Np&0_qDIDZ#;j2eTH&|rK@GMvlR->*CXU@8_es5(2_oi zRI#0Czfa2RA?$Dp#q0W$=qZ%wIrZ!%_3Q(O_l0%b_t~`k4B6 z&DVA5DS7Koz00L?ZLABGXO}NbA0eEX;`8daeitCZ%gB7x1w4{pSbQfikr8)|Y?*(} z^!=OEC=jU$bK_Btji`zmO?g5s{z!NWTusX?mLV-O(BkoSdWtXpr1b?8X+~UJ#a@Vh ze-^ZfC*y19G~YKUd)@=ngl+UGnqqIBAI!L7l*G#}NEZqi#9`iJsJd#r3x&56erKXr)L6?=4+Mw*lK zr1*$*kk~>+=(HRpnu(Mt6|>MHT2lALoXOIPY(wPrWaQw$K-^Wa=2&qdK!$#9yJ79asq`EqZ*Hi3>vRCz|WAGGEXut zBZ5M81*_jp@SPeZ9bA9fw+`3kci-3qY^!z-jd)L8^Tib`0SaIDFF7mw7G?y6#^B{I z<2G%A9cv`uU`xtujOidaawlr1&qM{eU*!x`^PMJ)Gmn@7PF(Oa%I}QKd;Y$RWXSfv zB*xAq4HvGOPvQ#$(5=`VrztlT`W$YrTX@CXIl&nvwak;nv5jTQhJU?!PryZ)U`6gCd2Gw3QNuV*4>=LOj=4R&Z3va#1f%6oq=R z)6q|Odq7^vO{v+*l!yYm6Py-k+w^jDPNd^xR4uhSnfFgDf52aIFL|*cK zTWHs4TAVUng>`AngPYk)PZC9}Xe5^)ImaRcJd=%PD34ba_g5v)G9fy%c`lkzCsdHI zeZQ+Eq_UZ8ScQR=iSSi7{|^wtVt(mRY_>b+G|Ygl3B>io+R{DB^?V?h@a!X_yxVQv zONjV);RUbw#eoj|=;2r2|E_L|j1K$7U;CBBjw|l{q0_;|^EdwN0H?2$*&{pzK^Pqk z!qF42cHMPwPGkM_HJr=n&G9J1Z#|hJ<@+j#OC1vx7E!Woank){KA;mh^PBpc)d*Cs zz}fbKF8qpP7Mji6syL8xF=SF(cwZ0zw}vlo@67B|R-@)RZ`XIxm%LXPYMw+pvY|CdO@bc<6YvyWovaaWtgc`zHp?<*olK$CzAv3jw;wmsEXJLlGMV++| z+=<=9{z%6#aVMF6A_@!*_8}#MR-`l{#2b_9(T_Zh`tevkV}twQO#J9zbCLZ>NvW=YR&8(hw0?XUj?k&E zv#TbNxsLN3(6^(0-(bHVvhKAzS-Ln5(Vwf+*S&w;=6TtM${bYHH&a8$>66cqQs$N;!PDylOL%>EP zJNt~AZ1SE{Z$?oTH?o`uU?H@~=R1b~=yCB+4KZ0ypNH9Ip~zGlMGIr!-fg5D4^${- zYgQErdrU0bcEJaMUi&JHE1PAw&QU&_i$d|FZVEmaOzjBg%1Ujaq zil>^apthF#Lw@tL(d4jw8pWT4t?1}vYpG)6@C0FKykJ8nj62<};;;4w9Z4dPn;VJ3Yl>cEgm?0z!wisGC5u>I zUmKha65x60u#{%gq2iKut5tvQIPeW&;ALlN_B*=+QjNT`q1K{|)-%(agawU;MWuIKA!P2b=n=@*j$im;gMD9B&Q04Byny^U# zbFAH87Oy2Bqbbjf3ui~ib;ooc*1Q^&jElEeRSX^~%OiZmBFgE#K2Y|~_@uHesLTpzzR}r)n3O1;nL1DR67Y~{I(qE2z@Q<-sNRd7Nk%P9d(l$h3M1=PEhjB zpdo%zQwWAcFvAsiLJAK(!Sr_#7DF$K63goGFTmJ5g89LEM&H)r1cYS%lj`cb%6N!n zAQR%>w*pC4k#{NcOVyVil(L)_r5Q4aTh$Oj{!0Cu*^kejl<|bCb*Le~gYCpR=L|lF zsYJlwD>t5728A@>4^mpO7;?-SK-sC5$Im`O(sS9D%A+&Sk*}*oW1$@aI}u8rtr_>P z&;K6juU;HqHpBAFN)wf7ES--KZ&=dv8$*5aAdd$$xQ*TZ#XJ&=gLNqR)&FG1uuhAP zmL};+;+?4ql>*9VIV}ZaEvC1Mk{_Ca#C3N#2yK%CXIwaK7HlwCgA+8Il;xk7W-M}ai9f%EX-me6=ssta zO#&p?lAnu97kkNbB`IqLI~G%QmA8x903F>ot4?u+BEO}j4T42|g2j(E;h)kAGb%@P zg~p3aRezWmYn;?IC$PSIMC5c(XSV__ovmpP*F&fkFX2U>0G~)q(95NE`g*sI$E1H)yQ*>CJwx8=e)>2O5fw8U*-}o9 z@m-g9%_SzO{}^vvMkrE3%^~9f(u9908N_IOXY;PgR6keumepmuxyz;Nw7_JHho5KX zZL_8Fqn7?8ro!WP`yw$wIvNc4w^n80m}gWU3)K+m{{3T?iM%V%!7r4%TcCswr+KH9 z<}B{fdAXGAc8aA3nRySTVY-+Z@fE4dQs5<%)LatzVQ140WJ_bBkCDrZ=!O2xJ{nLx zgd~usti@m-)1yB=AlQt{i~e3hqVgAAL7Wh`XdM8)mj5BEm z#i_J`Ws3*}KhH~p>Hm?K3<)biX=*7Rd8X?WW5!ZM{yn{xtP$#=n(yACI2oT~Lc4 zKGIg95GV}@Wxx%iR< zhK0lfXM1Gmd@MnjTZOJn)*A@#h)y??PTybgGpj@#*80L`jwPO&@F{aHKytbQ zWs(M=$DV^5h+a4J0GG(JQHtWChgy?02;izCm_cs9WWpZ({LJ3x=h&J4eU*1u1^J=Z zBcZhfz#c9MDO>G?ZQVbJx@dGH@g~Ps6O*^>KQ0`CZuHgb{Mb3!-ahkunDRKWfHM=o z{ukt?5Vm88TlbQ98EGvvG|(3Eqg-Qjl@7Q8Gtj#>8rjcT zB2?U2Z7$MRR$y3gEM%Y%5pWEZ-1lY?Hq-`ya7vyvJpDJ)(tgy*Wc0R4D6?vKPNe)@2?Z`h!7GA;5J(54?+zYv~iGhs7M zM4|gmQjk4~>2$3aB6UG7dSNbhan{lrS6vgsOA-sg3A&r2$;Mf_HBA+!Wk@=>yJh$+ zcjEE3qoeD#HPAAYnG?;1sF5L=Hk=AX`VDuSlw6HR5?lIS7P;mRg`&D*H#1ufqaM+f z;o8uStLoi`#*Ckw%Z3Zq+xMKaru)_T#V z${#QJG6!uwLMuN~E1$$`U)zm(JjCYx7H5%cuAAtO(4)Gj$J_lS=5!1iHaxu@lpZIr z?q9}EnUZIZvQAFH?63}FdzKY%ml#kIKT`o8i;dcEd{m;Z zfV8R1Y1JZ7UEaPHe3R8JHwz@p1%B<3%X<7NiKpl98z1FRWW3+V9q9~mV5wUsOcyI= zVO_qEv2HR4{t5q<{Wu!dfXyXh;q_Eh`c1k1dsv>XAX25rGTo(S+3mp>8cq z0x68aV8nJM(E7CAItRo%NWbwZqBh%hV@2@7mJzBl@2p9&89zw z(yRSUg@!vLe~iE+KhoyJG*IeK>l{~eSAKlBV zZ{;`l)uS6-ln33Tr*Gv>0@_IpoTe(Kw^hsGIVl%D&wFGCoxZy`etwTpU7@e%f+lZU zy}iSitr{QpYa8Oek76UM9cs`EYREd;bAE3bki)~OcYrhVSQlC1t$U4i!SRgg2Uq#yqfH5cNxAdw+43!`sD@{{1(cj6jR;R_o@YWvG zco7L#7MQJzLzb~h8X19W`(mdz;;z$-*;bgH^>uFVh3?x+71q_h%P49WHfGHjl!{|iMD!hfkt9`RB@=~~9_t6gOCAUb$GI1Wj*sa} z6uY-Yk){|;@Fme4T}8lRe@EM4|$yl7QK;LGgNnxy{Icw#ZMAm zc+|}!2Mj&`J954%hn5rc4-X&1sq@>y%ORpTr<`b_#2?|Z#gK@LyMC9pZh~j7><}H2 zwf#Wo{tr&QUKU1sV^eoa5uakdp@YFro-e;*WI0VmYQTE;&n-yGgT<~SrmLfF;nCnEZk@RbA$^9)~sZw@M;0 z;*91`+3uyoa1qsvg(Z@lOn86tz}9q0L^}UQzvy z-q|ha80t=Nia|mu+>|o!!kE65#wVk8K}oCSh2!yf%I)ErNUg)=nN<#wHy2e67==gt zGR`ed5`w|a)(4c4IM2N9kU^r-CSQ>#4cu^5Pe^4LoXs+yC8ND156Q9$;?>o1*h>8H zUTRrL3U^o6$&vk2YL{)S!<2e@sQ~p8W$Rk{Z-a0`b2WGVqrV7f^|hyz zSWI;HHt)>gt1EHq=M$bikwX)Y+MZ=M)Jk3|`QNU~M%Aa?emlR$PU`F3J?7-R?c={3 z^SqQLyyYj%0oNKm^Mk6|W9y2t^@3|sUN1Q=CxB|K`a^~@EwtYa+js%B;sbe<9@l9| ztfQE$YoI+z$Kl;KpKVSzSqFQtw2BltJ4XM6DAP{guY*p?RC6iQ8!Th9D#q~~DbY*O zc%eNIA#*z3RPjvuGDorHmbSEUywo)ucLXll>zqM*E%93jPMeQe(c-k#o=g8R6xOv- zG@)ioQ-FpKI0G8v7Sf2-4v26Lh*Z*Qijco#+14l!V4CA^Ir6<5;xMu~zDF&V!#V1V z9x%$Ritp!XG)rVPiN|Ty0^U;-<>D+`&r)0bR;HPldv&Vk@+7%TQMw8Si@zdv)O_TR zi%uuZ-q%k?fp+Duq-b`eDcUgYn~8#$c1XT* zJa_J=0N>c_wg@xpn)w7GR+GN4qNS1JS7c1^Q3FGv(9IrTvXU0c;|zT^q8U97CAp=w8{FeJURdue^+?d z6ZF{V=ss~uRV?C)=$%No7N&+mhgJ0NYRNB}!|VB$50hJ8O___wl_9^q=37Sh56se& zkK!1Q1QUIIfchs#-^rc zrds05Pwc`OK{nn%9aP-rw$U>?i3#nG`j4v#Yf$DE(^nw$i%3mp_xck?D+1b}r9_?{ zG{JSukK!+9rk9P}6~^8^a0ZR1^ZsDLue%GO)zV-on--$1Cxl=dRRL{F z=ZLX7f0ZRdYO1wsx*Cpa-mJtt;jmH&+Uz1Rh4^4#`WGFWFhff751nb}tEr;uHk1RM zEyA?+G*9RWG%gF|5^@!@eK%WRD1@Le^wG&VQGgriXUJP3ZCEXMD=wYAuf=d@asbg4 zuV16)#(a+5fP0Nit7I%pAptJEnrFJJAv8~)JtDV*7W{?SFDNaeU+DKq8Lojws#2sS zyPlnoSAKygAo_ca0)CxX$X4Xj`08g1TKisxGR(!jc^2<$NG{1||F|F18)Zw(@9;fL z$Uo7tUDeuSD09O+QzY@I9w=^g|H^u-@|_g05FBsM@Dx+}!t*c=oCco7R&>Pq-l6Uq z#p7EXdYsiri#F7e>YfBnW(&^Rk@S4q(DHYV}# zk>le~IhHZTbo%Hs`^x&6!kp|{9z{!Q;c1#vV*8r|714pmjN zrLOU8dVj=uy2$ynWXgDVQ(xE2uk_(@3`;h}=U0NRC1%x9$RI(k!c(*DD&W>%v6A=^ z${le^0+=C$@Bm)k>d^dkyOif5y!A4@wRE9bur^V=agOn{sZOiy@<5#26rY+ARcu%D zYWo>F^VKKQ=)AK&%^j~BewkFdJNYKuQl9C{Nm>#(lLqqnH>6RdRMz~+tCLyzbqy)+ z(p-&FNml;`Q#p9PLN?S5+jR>eL7&GR67uydiPjFzr2=_GZb%;6nZ%~2O$JC_NSQAcWMMW7eO=tQ(e4=MJ-KEB$fS2jC!=k(qY?;*e1 zO!uL^xwP&nr#>C862q(Sr$gAL_(y4mmSI1!0cKFBpXE$c*Ri}xO{MMp?&Grg)EZLZP_l` z{@=8Mwd>l3bga+)sU+jSk;g&q7uZ1OLmE_5!kZ>}sUgaf@9q_T#-jfz~X z6+4d2Fa?gUZb082yK>&fyRYs`FLrK#nfb@XjOZvA*#Zyi3J2@ZNAawz(`s}9Bo|la z(%9QU#U~-1origA^&v~PMV&kVu<=lNjmTH5wfVN}@$kovGa*JOwOfWLv4 zUW00&lqeXRv2gTpk>MYQ&o~32hL_Kq88r1r=TSl*B&rcreddnY(t}VyR1d)WlQkZm zO|VM2iOw}Q&=xo{6UBn9hL~H$8z>i&yI~kw#2vQKBV4sbE@O-7{a_pF=?BS#b`GT% zt`^}&_|wo`bWIWn>x@VO_hinZt<{Ho`#wuyBcV*`>Lur`>9Trn{F}I|?LvLrx3B!w zEz~2dwX5w+)4GSXG4R0VMz03D>#%E+;zP_o4H_G;nW8oRm$ZXZb9#0@_BU4t@LB-T z}dwvW5&8?`aj%+w^zUTE^G%{ae z>=$*z2hP(=57+JX{C)7tG5X6t_WK3T``rKX_Uz{-tCkL`c+^Yrwf5X5l*&HLS7E|;G+QB>qv;A|ZX&Tw8I94SP(ufKb*>A7QX5tVg z7YEykJ@90klEY!xp4A=8c_h?p_U!VF*Mzimj`46{G~5l-Zf35PDx0f?P_YEWYCQWG zSNpN5yWBk*??ws7d_tm}9K0eHKR6pCWG#f9B?X@8NNAFP!GlGROhg=AC@Txm zLjPpWbC`a+A01t{fZiRG0EtG10bD&iOBv0=Dfii3#xqLcnI>v=$Jz8p>K(4b`!Y;g zjJw5rn1-)WXWNVK@hG1=f8Too{KD9l?X`!D{r@GtAd)9NVIXx=wdUE~pIrZAp>;r< zFsS_FVJFBe_h;} zx@ONuchS@UWX33pMO-SP3^#bclL(&VryulQbdhsqfoi3hP*+VsLsFs7rXd$ER&=0M za3G!9c|6HU?UMxg?#Ol~Od2}{5bx2b%Xh=b+GB%!K?jL}W8PiB=7eWE+#o+yD?9dQ z62fF9K4+w{c*K6k2;$FKG)5s;kH2@m2HmSU85u@;0Fcd5xTf~*qz*f& ziOa=FWg+jY=qjw}n#f`rEnrr`;+ZTEdINr~v>!`ai}XT%`sGHZ^B>_gHE_Q4<0T> zb;aJhv>H>T!2RFW3{*Rh>X%rBq4P&lOWwaMBfP*_e2&sa5W6i%O%I2*N&@TqSD%~L zGS-f?9AEpZqxh#1hMO;%x7y?GG1225_cLN~X9p~K7yC#yZ>Ej+S({J#g5Mw8((9Lh z)1;Iqp`OXEevI|!93%?x0Zqj`)iT8x6z9)SjZ&tn|J`EGN@bpF7#)Vrj|BBo8koGc zA`X$~;=a5^y{ms1ZLAxpA1}GQ#DCNO6*KO&QYK+j<>{s}cZoce^`8565eqSzK4=i! ziTtl2mq-PN2rFuk-yvAe$^_{&^1<#C)#+)Rt82oL%>Gsq!McV+Y7+RR9`_2z15fVi z3lTQ(E(n;8cmbMF5@SkAgTIrzg|c~Enx;Bic#3C+m8viX_7v_Sn2pl=`js64iJbb!_qVC!}k5|V!C6D03(eVQmN2P{KTL>x2E9notzgZL-DaC$kuFf@= zl^b>_YxfrPZ9;{NeXT4PP3Nf8GO>q*&FBmWs7YRc?c-I)ym2LSx<6znN z8v!qMtgbSR6{HTf!72wULL*KjAjl*RN$_z(hng`(Ks(4CnJ_W>QKxNW zvP$-nxS)KE`z?}{rVlTJv)-Z4nWfs=2;Pzu-hx!wt7AaI(Xw%?xL~5D9@G**XFDIK z-2rM5#wh(j?jy$b2@UV0c2rp}GW=Ta7k4fr+0T`xOOgbRRYdqxMRMT_-@GlgN0ObK zF=y+CLG*2&#pEmSEpaM5uk^pkHv58O+t7Kv(H1NvYz~Od^B;fgNRXR0uUB61RD^*O z2!?}8(Ze$VUHRIB@F-XE&_`^t!{PwF3H!}3V=;`7ILoI28lnI6Purr6`F!fsew8=M z?J!*tO^wN0Uu65aLHks#5>5Vl%f|}>;jX%t))SwQmr!xnM zW2^yChO@i$_oh;V`gTgg?38yg{ zYT7l5J0v)RhTy>mw*bL|TOhc*ySuvuch}(V?m9RG4ek~k&i?+x#S}9|6<5=}yWi(o zE0(Yz)?FSS_fP-_0lhlN3EH7WcWf9Ao)m!~Dc*PN);D{{(R zUkp%ePz*HVTKr80y16mpmxl8P2TH9C)s zqXEKOE2DD6DnULy3WWQ!?j`^m#P+(R+SOL~^s5m_JBCt@OIIujw3?_iqxbi7%6gkT zw-(;VV@s{uGwI{EX$7YwPw@0jY2nK))n8j`Zmzf&-`BByVBo>!?OxY#_@tUO`qw@x>BWXw!M^gk9UgR zIP09sWl|9ofIdv->AbCPBbw`PfP8CE-p2Dx`+A2~iuW>|f057_qAnMn)eA!-uw8VM z^5p`piH(09R~L@*2RzC;OZ1}MGDjF4>HaGUYSze)Z9o(DL*{sMv0=$iIExkmU6E}j zR&K(~l6Q92ttD%Zg?Ng7E&W3y2kEgH|NM}HOquqW8u<%qE@KH4zwE(k8b&i0iJ9$2 z2`-zxWVtAFe==us;#uvRg65546({=f_D9`U>P99al*?%t!NL zJ_5nH@FRtb3eC9{^|5KBtR6tvY>NbIX~}zDLZ9cmEn0yUi&d%H^GV-eEn{5&_m*9Y zcwCutLJu)C`E9l7c$IBj12`Yt6CS{Hh zKR3>#6^=s?1^CtUryXU(^IcT#r~sQ`z>VRzx}5+=;yfd*j%1@0DhvZ7fPlqK(LZU_ z5SrmCOBzrNE8rKx z&C>ZN8+2CG@EyaHsv#!+D0KjXjM8Npcj+i_Ifl=W?;`A|L7?r%1)t|d?y|;&@K9IF zun4;4(0Izv{!3>FHyZC#q&6!Q5=oc^Av2%0BE44qrWNk!z%Gh!iOGrv}VHTN#T3=SZDQNl?m(_rjU#wsJJjpxqUh)8Wzpu z9rdPsub6}QC0^z(Z?>FvqBRo#J@t~m>c#da1Ugfk@{?fM49heoz^ye}D;XDMhSa*4 zHpL+0XlF^-0jcngNyC~{qm2ah^#NQ?H+GQJzEpwptl=#y#jPUe z=8~Nbts+0p{ACZ%A?|0SLK@r^(1m}O_Ela`&LxPd3108k|Ndi!Fp*Aw8L`f2v(k3* z^y~Z2o{5ikW%)cMeF6ZRj_ITl`>$9ld<)~=RJ$CI20t+NQCC8+lh!E)(ZQ|(Gtn)b zIPm7=IQ#Y+a2fbUy**c)f00w3YO~K18^YvMzVt-nQRV)!eHY8$_LeuScJJk-dcR@W z=TUv@YhgSCv1FXCZ1~#VcliSDM;+&wW?ty1S)cKa(aC`^$WaZyrh3ea+gdw~5=8eS zUWa@97f<{_6S)xU(xa?bAW$T5N1t1tAa!oAGD6WDpPX5bk0Mo`%~t_N5w;^39_7e? zY5?6L+$kw>2q`yUy$+WPaf(##lf7m@6&8-(2MDX1+$93^0Cz^J!9wBkz&z>xC{01r z!r(<^^cws!pU>`Yg1n?E+hQSx^?+GoTDbt=NN4?NQ^dY~+Xec5m99=%Lf?=0bK4^I-&oQd%eN0;b zMiSLt&I@U3OV;its(rAQh@rnp@mk)ZoprEk2ewQ%R@>OANvo82t{idO7K64V9O93X{cJNkCHhfn&drfBJ`XuGK z;HKBV@58t!M8jX)S1Na!h$E4|GW0?E&rl1Za(OQSLkSU)<_UQ&gE91-?09W^=}MOk}DnfN|;V5`|f zhg@tw4dtDxO_LubJ+(R^)^?xW=yJQVj_f2Lq@BFzCwCcn*~tp*_cf&ns~KUmd8AuW zXMiEz>9YnwBU`qg?vWsESLYEFalV>FKUG6*=Dhiw8`xI2U!%x{2j^ie6rL9kBM8hM zQith{c7RHX^^cL>FanlLBmJjdJ>Kv8sE%DnvYFY zejCZt3K_hVGToidE&7qU0qhxXB~XST<7(z9E{ncsYW{F-2tS>V7zi^%Ig=fHTpF2{ z##@k|8Vp9<<T+Cd{iAAQ=M(YNn)XC+56{jWs;D0-XY?ODJ~t;t42ps5i(qfL{jiIa47 zBcp*se}e%i*79oZD=JyhbI7Y6mfbfq6&4Nm9xkF*xYRa0Q|3PiYp6#fUfMDxQpHcG zY_(qSW9G%E=0m7QPQRTXztW1I*mnn=`UgP+TQmME)%;~Q(6dkISswu1qI>u6KHBc; z$gd)Q1{_2q4PIooiZMsp<-Ws}=^zdl$t46 zB~ciAtZI8WT5+%Zu;8n`1RoWtO^R0y77gp^Y#!2r?}sA`S^DV{~v z%-n6GNqo@(NkuEHZM#hN)HX*}pi4S#Q7|K3%;_aD`CtuLpHyT1gyh9+uKl<>PhNFx z{(-KmcDFcG-b`C_RddIz{zlngsb_r};8)Z1h>CVy+GZr&bCj?r>Q>M1dU$A)-1Sma^DiEYxbA`?N{)&^PkOIO%di|4~=^kM`KNhP9it5 zg&9e56!B;jh9!f=1k>>59stB`F)PIehK`rvjamLf%Td)Dk|=tHw*AR5Mz99OfQv~s zl<^DNp!G*XQS0B$`hixz`{bcZC^9hli3y!JePASd4L1i{1|_GqVT3}EScf; zkmEUjQ|tF=FlRhNF#tIT+(n zGRgu?Du$Y8NQA{iQ5k76ju+EZ=-n;XU03au#_rM1f~@}w0qGlTAAeXGi7eT-yhNW+ zrFNC7tdk1OfUgE47E}c6$XRG)hYN{%CQ*cFutB~9V*@Vx4g|2#M$nnT1ev0#Y5$5p zuz$`b9An{p@{Kp~i|sa6XjbS+emPeT4ffXUrvsjbpzJqv6y7J zy!aqq#_4B$PB(*~8V;Rwn;`RUa6g&F#tfsIw%`Y-V6HN>;HBFe-6du>@em_Qh{5%!7^jqWdt2| zd_q--^HQ`0bt2T1a*M2F^2Z}phTJ6ek)g5SM-6Pn%0Hb<<%X@$FFN2aNemt*?Vk&y za$E&}aUFLn{BS+9y(YP<`En;Vx&HO(6rVk9+MJCPw1Izy(h%fWUnH+v1aUBf!K>GDdE(fnSr?8iKbvm$EvCw`Kwzmuo&Wr5EkX zs{vUCEU9qj#Rfi4dI#H_0R0PJ_e`A1XZmmY|J zix!cu^VeZA)owC&fkS~G-)G~lHT9vg^{6E1bw=jh?_)1q9Z``lw}yVw%b%(+E*`J` z9&~;8IA5}7ez!Q4=BO5EbiJ(id=hAW{&nDbe^me6n)226dT*N4`z|r``L*NOPre=f zjr+3k-n##5UFSc4^X2E`c(TU<;-dt&Lc<-!>4!fCmooq9D+c6?ZAzX;{fs;S)(slX zBSEm<8x@{!+W}WP>ftBrz{(G%>^IzClh3-e$LRGxgwgB7j*~RwjOXN?cpk2jeL=}< z%HG(-5{)}1aXE;Y>faf}P{W>{-P34#VXApF3!R$ z%)!hD99mqR?LL5;Q$}vmt^$;nwY>#I$Bf3rKidEbn4kOqI1l)3#(XByp8+=?vg2D~ z*eOjFkG!Tsc8!ss@woSp(nC;HO*5mXR`cU-`=lph&BM=k0~?#0%=ecRE7VbR3&qV` zD!&dj&ipi)>wl{)+RoUnKLEHRtJnCngl{gl;xvXXZj6?<(IA<8CQZNl|DRghvBO3!>K5F_hvapG~^Iay3{{lsc<*|7f704LTt;uEFI5?GUzun)Oef>2Q5zy_+65m8|YUz^{i(CrM3Z> zhL(@|#JftnUvy2q6Q8DUAW0KycWr$n5RP22{X{2H>k}Db&6i8JULrzM+^IpE6!)xj zg$C&;sluYWfifP%fXIJ<$n{n(ubPus?PYWR6`yrQ)=^qZlPjK{S-^b53FF=xM-AB* zlSt+JR{0;nyiTG=p{pI8V2o?AGG?cV$cWZ|nw<7n!=C!OJh?vifI`53UaF~23l=f` zm*lB|VU%RBJaYp+M=*)3CwsaVH!6QWuxq&2SwE;2jNi;z4<;WI7zre;8&gZMsJgO~ zT9~eH0)d52lth7Ea-9%HU;%bJ;&Ns8Sshdv8b&*`SVb%O^hR472#WsEfoAFLY}t9Y zrl;rCSQ|FN=Q=|s{1(6!5Tta*>`{X>G35tgO|*YkUixvF4+g{X7pKFXF0wP>I*3 zyd;Y<5Unp0IKpejSCW}RvNY^HfX(wOqn)1T4QUH4P*Co)B`K56YoTChU|`C|A~zeslqh zG#WMU6h`6>Ces-%&B+o%9-NeT(5`WQMQF4{#3F=C#_B|D5ezLH2jl zCP<^MrZO@zU|@rqibBhEH`>%>0mBZKzU>UCal|uM(A+A@dg-9~YDBqx7w82lHn&94 z@hIL}lrle0or3GNj;Xsa@VympRXw|l?nr*$41w7LwP&BJxcHcbn8e%NQeEDNp4@A^ zmD@j#^H!1-YhSjJqKY_EUDC&cfgJ?z!vcP1aaPHo8Ms*j=#TsZQe!B9i=>k8lR}At zhqRp%>)&hF084?9!I5-~X5fB_035yTgy!+Z-jqsiSmqRFnZIkixK^99ZG5{qI&`2c z*Vle8$<`L(L3IHnLH~qymKWhJmbjpnfw*?i=$M0RDo8g4Kojcvc2OL85`@3b3 zc|?GS@5l|g(F+;&M~f8!dd=s2O4JZ`^BA55P<^x?-IN`L*}54a?R4XMQn7uK>AnVQ z8Fp?DuVFZqH|sUnJhGC_9opIyDYNXSiLB;MP8XcvjM2o0)GR~kgN_OIlll175yiGJ zS7+?1uObg{S89V*Jv`rRjt%bIty4L@GQXNceGRdtIW!!`=7YV<^Xbn8vF0ZHLBD`* zntG9=Hv*>l8s#;Y0&!p{e4UUbzOA-X2X5v`MiCu|Ey|19C#8M#0GY9d)7~Iox!d>K zEW1}V$G3h*5y<=J_wgV>MT|#zod1qle)M#^W8;#AGHg0SVjs7mdPig}9{qa<>s&=P ziRW46w#zi-A}kQ{c<7Wd=1 z{CaXXItbuoUY{S7Zzmw-Bw$;Y_*#?Er`l0Wc+0nC_Y|)5V_c#!pQE zJeQ(Z{)chCs!W5~4v<;Ppw{2m8eFh18m4HH^ZG0(8Ay$rO0LPpr~(i=x#}})c$L`N z*cC3IGqd9Vq-*J=GQy4$A{w3VllPxWOgiR;q!Q-aPONlBuhcw;8BZA|R}Rar#A?)K zvlt6R^jg-DHvj!)oxHzX5rAgtFf`%094N&hfn^Ox= z1UL;2k~8K0z2mybTAVC)V(&dguQ16Ulc5pd7y}7~HhX^gk@t>MkpAR3DMBCDVSfJG zIpp?z0l94*475(L0yD&^6;z1S&U zJI)L=7~~cK7eFcc=<`CIu|{-`D7TJ;BEX^9a4t73L@qE}^t*Ofvp(v4f6q)%5DLpa zu6@Z|nICgNihhQ8ARa4Ah+If4dwQB3Q{{-3T%|nFnbGGDIg5x#X4(?AO3}alX&no+YR&-3N3Q*7go%%B1Slo z_zT5_;kvDA!3qW%>{QWGp%eRSWq~_a$2iG^#N`lX31qaPv;N9d+&SVWE^raWMhn5& z-t_<8T$#AN%Oq~#E(1^iG02-vKE8Z6&6(|ez)aH5WHHnc#ocC-(+0-gbsdI+!nB)ItT1X~WJE_=MC`l~XF-?bv7GuEm-PkS{^jP_ewuDr zkWrk!j1(fv5h5Ks)mJz$E7=o;-3%M2qR9Ubly?jIedVrsbdwx0u(hF0&5YH>@{pGo zq$r?xLG)YM&_dtITv7b!Ror|5^OI=+e|R#E4>pI-wzx4jQjv($jSeJb{YRKCS9}*} zJqZTtM_btkMi#Kvpxs6%hop#T3Cg*K{}{$Bs~KV9GPJ<29p1Buvz9~%>$);BOD!b% zaw=oURXFOX&BrOlnF;G5YwMpB=xd+QX6>})0oo#7XW^*(&rnWqX1u#l)@gM_GHh8- zmAOj`96#z5)|Wm71h_Fy@W2RMX}&v+Yl`=1X;hr23r`t@zy@(j;Ifp}Pix13l2_b5 z3Bn2@4F&UK6ndT?q|Tab`b|;U6tuyg8(6ubP#UM}$z@y1jIzk28>ddh3)`8PX7Ui4 zju=G~hlhyln8^^NhCtYXVZ;q18@`4K6y8tMv8_`yVQ{|x+2{A4(hNtaFQ&i={JILn z(-Z|Nrn@kw>8i-!*23RVex%k4^b*WOHRIS75IW(wM80cJ?Uuq9_#Ufh{y7?%ZeI#G zYbdZ`9HZCPoK=G?^FMKPX+QI92%JhVHS~eJA~KV|FvMLg-%F2;2x4lbXk#1{wHmin zT`&s$PfE{52Z3P*oJ!5TYaFLBs!w^IM0*At_Lir;bu_G4 zWWe-^QlfG*!Nso8>ziL6_1dr6TTait@^i2xsfS>+D8?Ea#s&QyMi|TdRk}iZG{w`D zRdV?ldu+GXJCXW_RmwO}c_c#0QKjCQhTHs-c;`>FNacK@m0*|WM6O}gp+n%lSkud?P8MO^pcGvcDx! z_KNy%Mt`D(DWmli#BUH;?G2#jZBb^JTqjrF?AHTsvu1%}@(`=l+0Y{iC) zW;H9st#?|JEjCsH?2R_oqsoe*s;euA>$XonPOzx*=y}&%2?jK0IX9w`oPN`6U%uJ| zP+kCrxo?K(TX|NMnbGr%62hO9)9B0;a*Ls_R(n6sTN-p3mSa0)u57HKtsv2Z@)}f1 z2tXSSy^Z;(1kSSL*^(Nto#L_1k{R;v*89uD_QiCIL9LW7OcW&TgzT~g@Zilu-k@k_L^nMFi zPimHt-glN}Jy+`TF+4MsomaHKO^#`~8~d~>7WZ~W!dLul)(Bbo(LWHwzB=N;ZZiB; zm@!61`EJcx|4O)eV|lf}Xl}}buzPB?es2C7IB`tSL}W~F^$-vDF{J%68!=Jtb)qWB zz?vk=Y!2N1bnpx9So9F_%++l2LT`wGD+`_M;dt@ehnWv=95X?YtL|q}G+XLsGYc&h z^|d(Dr7?|WJ9-;&;S_V_k@_VXeE9Fmw8dyTs9EtJkWmi1j5ZMK(H+kV)+Sy%Dt$&- zw%t0pXoR6=LN?*mt+&8=wW`7P!CS>WdU}fA^iIhq7#}+Q&jZj}WH8hoB@!ZUEtbXm zL^zo2Y@FzBkr7Kv^_RBTFW115 z4=E3qkKB%}=qI}&darTFoOQ*)|0J9(dWAKX8I$)tboq!no>%0lvh>L)CN4Ymts!a{{5z?xmA*fewF^=U>scu@Akp1b$p_^VLZel;_2vG zcX7Xq)7)LOurvlmh5D(2a+4|p zMT!e*eY1Vbn47LYntTiArEt^UoDmu$K6dOXPR6iKAcj3{=o5+Kr$5SlGSl8{tEbR1 zmhC0JDbG~x~sag2>F0ie)pDj7ri!-A<+?*4ayN_E|IYe7-AR1r-u_(#S&YFdH>+( z+Y(rAwiL{C4IP!CPY;}~G0b}Ek_4F_b7fHy#oCFWfc1O%7Rrn*N8C$w+CQ<%QKaHWPcp``R4 z53xs`Q!4{>pFTOX1jJ0#Cl`_Wtgp=xoqJ^~s>tkebr+XsKog~o4pcRRO z)v)Q5(K#>#kqD5-4olhAaUL*LtK~#bXe?rX-AZ!f=b}56;y;pCweUPd%^E_%OBv?5 zj)~`7Z3D(r?BV;V6<|Ug*~^H@RAW%WKp%d?%zBr{T2TCIT8-I^O6?_o>_(Qyv3;?cg=?2~b7WOr02J zym$DHIyM=MQ3i8BvCkoEAqjS#c3FrB8!KR^5#XguFkHfXy=7$>(ZXMAxj`{RdLi^+;-6x|EF8;OZ&H#5wFvU zwJF{e=>_@^5rZGT-g_no6-Et{@;#R;wiw-8#T^pFknZ^|m(Xog?9r~%18U&|UP|Nt z@~kFP{$(fTGX1C0ILg%OTs#VFqq-@Cxy51MG*r5`L0gu=r07O1^~g9g9q?q?e6Z7o z(c;z!tc}3nw?6B-;T#f~cvV(#@bL$-LSG)0N)yMKaWbSqO9f?-&3dvO{djcd10!{2 z_NQ@7`v`Fcc8eNpEs=RC4OZ!@QAJDCyJPlJf9QVD6|DwT9-_Lbs5Tzx4>vdUv2uwN zq=GdFC25;kq-wH|UUsI!w9l{BQ6@PlTwGvYXx`{pwd_z!1RoyJVz9O5;S&5pPo5=A z230xcW)@|dr*Fwlz)3KTf!HTl%`H|nzF>CHQ>{V3_6o_HL@KuEL&kS@yi~XG*t4+hD}zpVj%$x zsWhaLU3?5R{TZ2kD|}*@MCuH}Uah0~#I0Baxsq9h4kFpFV6X)@zBWE-jF0?`X`~+l z3*(&jCrb)$RNb}Okl*n`M?PEkFq!ggIv7cghsa66Wao7QSB3fxGLkAO%93||0D*!-0b%ngrCIYqh$u9%de&*v2#?TeZLF5*)Oz6s2Y;t4d2}o;fI|| zQ#ANc*qz)k;j}Cx!?&IaMS{On6aT&kVSuXuBunYvo!@f@(JIriDK*D?r>Gyfg+HIZ5``D}@)iB2Z8Ak~YxxSuRvgtHQO0P2=`nBu*2>_S%?+ z?UiH@=RdU7&LbmkRX!yrcsd~<(R-t~}OH(s}Eh*?C)VTA77-&>`UkcUA;TEnVx+6~-` zzf65&Ub=;78#odyD?I;!(Zge|__;H-at;4Y->!!`MGbGHWqTGkt)QpQ{j2xMinPr_ zTLZbWHSxh^7|XyJeWXa#myzM3EILYrI3?<3*hp^Mk(&|k1C34d^nIC0E69ASxRFIm z0fczmi8R$D+dUo4G{D5)o!1IKW40dI&nOxl1;~as7acs57%SJ6(CyE=Hf&QkV~bl* zcs_J)w`9TUj}0)ra%{jp(@Mn5iFcMn3O$MAV;YA|*A?x-=>?_3yvs~9lf=dAXY~Sj z^+n*1B;;p?yDY;zR30%7TysSp>CA)K^fZvJ1A>Du0+aHnuAixl-6k2ydHcq=Z@?Hz zLs=>2{z>+0&OLYXQ?2X7jEUfDMD*|^`=tLy+V3ZYGV<0>2|B*o^C$AJ4Dymf}LnLHxqauA}lk^WOKF z`d^dGS#gdLwz5@vA<#D(e*KTEWTrg3Eyl$onSt`u5%uwGUSY?~20AU*egi$Y%7rku z#0J6CF?U8gWl=T<0p7?0jjbJIaywJv%9RV63dDdA{k24^Cvz#>^NA`=ODZ`~l^@7u zR0S@K2beP zN$a3#%+T1qp+b*ze|%JWXsCj_%xwMGSwx&x=(bHKy}_33Wo5|dHKcJ}*?0)#s19Ba z{wqEizdtfRGP_g#rxm6;yvGURtPexgg3t#%nF8jI(F`OD_#7(Wsv=;v9PZ=N7aF}}K#JVz-L z@Bp(On>u^j@sblq<=rAO0YneU-Uc2Y;_qwlv$hqrslUo>hGK40tkyNp)SB_}Y=_DMU&?3UDXS=+)8 zm$QEx)@_a0_m}y1cc#7 zhyZtlxrt2&`)N=2%dpD^?wVp<%yz9IZ4$G`muN921lG3k)%&*Jq(_Y&qA45~ZdGn; zmaPn)oByrwS9hTKYVG}77f+hTXWH`Jn0W0){^}_&m8?ZsnIIxjVz@e!8Jdl{^1FIHxYhKpMpin)dtiJfK{P@)>(3fz4cqBb@XAL{MY35*pt^>k+&$J+-@$dAKgiOa`9La}z(gz;z_6mb{(RDQFSL?A58L8G$4{ff0Bx+R zQ;d3`ba4;!HH~}wmOLxSiWq7h0M6^>#2e@>Q6N zF&kh%QnTv$mC2ozx~l^Np;T%=9YePP)U<>$!8u+1-(y=NgaXi}b0)x0S|U=8Mi z@(ve-^(wu`(~7qD8V#+DZ|lq9Qqj0f5C-)`<_l%3Aoob;=KMYDgwNSnL%0TGJXlia zRiKt$NlrFEQJOU@?cJL$H!$8VmN3p3p`>d1P%f;HW*_hw(mQ=R);HhsfVL?r%Kk+)2~S86PpixI#aJG!LN@;dW&Aefxft8x7<}$I1KGJxUErCh zq7l~hvN0Dov7HTeEbafHwg-0+-Y#x=%7*Y%nGN1!xF7AdKkSA7B~An*yiw;uO_MVh zL>0z(Yvd4PrzU<3YfZ+2VX0%b85JrP6Q}ND|J5HI-wHglhR4r}0>Ky~BOL{KIR2{i z%OsC)ws#N1D%hkyVmyU-n%W&?QXQP)9HItS_E)#t=VjiKdVi)CYlqT4W4LMo6w?I+r4nJ3JdxkobBPOFSJbqgP zEx^~Adf~$Y@$AWay(`|9qLwyUPS8%AQT=%W6ubtdLaBlo>foOUX+O7bNFTLCU?^9R z;F?j+XOs#X8q}kZG`PN~%zg|D-|DCsX3*4_W zS>)I>)FrspB|tbr?qfhZw=tl@_PXxPy0Y6)a|9tvDo-eA2_d<}3*(W-L7i_Q0(!kSDwOWGMfhLN;f>LM8?7JCr+gBqtAWg!c zrn0VLIKd8U(PqESE^E&c^(Pf+SA9er)d7;eJ~h~CI{hKDpV-tSekg-R4^7Ydfkpe!PUJyS zTNK~g4l0tW@^`eXJmmOc_)?IzzXFGLcOwhA-4*9VK-gFWWRA~}(30VjSQvR9hnQr4 zlY|*2L#I$|pf&W0|J&=2U=p-cUQ}qQqrDm(1~{Nl0pV{DxX3P=yyj_me{_{;sZj%ESCe3`4=Fid&=1~LQB2VAyY}*R1>Lk4*1~zee%6%J zg>#;Bx0Yqrirr_`Ur{WM1;NLqiFK*2Vah$21TVXSnNw@Rfifzgz6EI9$T^dn`mmn2 zA6(zokn`gOe-@P@-UAI3D}hBn?n;9zn5{Mrbj`Ft8CHpG@c!o_8%!cseV@{D@eK9R z%)m%}O_UDCxO%@=_n6-or`6`Pj6W)}PmD*e!1$jQS@DJUkB7LnA};CH;f?%Gj@gkj zc|z-P9TvT4hu4(UCm*OcC zyXNk5DkteTHFzHM2i3k^ANA-xF331r8o#1R+H`pPyU4+gi;6IeRQ-63 z&GJJF6sPpXeh!kRie@F`vST^1&y%eE?8VJXouMQSQ4lvs)p(e^TVWfuR)L!-1D$5) zX+=Sw!3gm;F1#y#GiWKg59O5B%LjdFi}|7rqna0^x<^w7IwswpE4Dl_L%nN9V`InU zZSd?Zknb7a^^6)TZLPUe`s3us6rRea?qD16gsyn3=)T{goWefccz{W+Jne3h z9*kJ(uXsKDXf&CyDn7vu8v`Tls8i{2MzJI=%kZ!X%FM>U!27RYV@yz-kkM-S$FT;* zXm<^sW2pt&%*H|_n;lAU>{uxLmynE?*~fG)!V8!&g&lq2v~vxH z0b(y)w9Pk5Ynb5qjlZ`s?y_MdA{(qhh6oRNfik))30*$pPY;Y;h_P5ogL!DB&e5Zo z98IymTlE#HI65s%o&QO@f8*@WN22&Z9Zq?GQa381GehkJDRG`-I?eq#BhJ?R%Vkly z{7CqCG?vcLI>Jth$F%|x!&uMiYx`V0=$9KY@bBdC9QEcXo`J+0j ztbMoqltjglqyp`N*T{r5R!^u<^<$YZehtE#eTz%WXO#j1bA^~ZMz8Ou2;!QzQ(=}4 z(>v5e1tkP-vWpV3^FuQ8LqnDZ)Z|(A5F>2{$tZI;rT!bj*(e%eW7c%I{sBrzq0#PN z97C@<)~~^{X(|OY#oHj+^ubXx8OUjI8R`TCs|upWH_IKXyc&G)@x@| zT8ghb{)UqGaK=JW<4OJ|-?zbX$cy39M)K{WHzR?I0J*JL!q=;+mnzbtvRJW?0((PI ztP`KW;idN6(^^BT8b74P!@*ZUw3%}`h2xF4bx=(?`<4BA@B@O2Pq*-&NA7)7jE$F5 z8Ui);R8u5D^4PBkCH--v-+KZleBls~f55kSZdJWzz;gv~?e)nV#tSFYwksnT!!g}# z<)X#ZnF$4>A$gx}YjE7HnRj8Ko=4I%jiQ0{PO&HhG6}6=OsDp(E*0}qf*D7H9&Z|t z%PtuRT*4PvKlhuV;s*2Nv5)x4$NdS=5R9zP)B}AS*880M@w?;O{nUEyTXOJ5yf~}8 zk7U2~H}vgeB?D6V|H!`Jk3GFb!O7cc7&&b3!3$l{Z}gKY#cOrlQ)A^Gz#a?&{llUj1+a`EaN-qb#1n zIT@v}Z+_C(O*U3zOYeed1+wZIW-;5TNXHO=#1~^WtU* zb<->*e?=NZNuV>>LP=zyMMw;1nmP4+^7TMi7-WVbY=GBqhc=~Xu*#K(^5yp!5q9}` zOx25r)51~#{ROFtVb%{!g8`6>{;4b}asg>M5n34G!*HoZvjn^0Q%F(Ns&HoD35e3l_cfevZsq1L zP?Lvm>G7ZP+2TVE;l}4F*PK3nCK$h^jQYrr9jk82fRrkxfPfoz6uh`X*Tf@gZL(Gz z0vg6x2tk7cD@msJrn54tz&cMDqUU&6;~_5>(7p2wJ{7m`G2>#lPUx+6=G+~I2`9X@ z;YdAsl#B&{&%eNqg|$X;pUnwvA4E%Cj~~$C$3ur>$^--Jx);;#B28NvKND>E#}sI6 z5H^-Ch~Pcal`LS@T-kN;)f`fg(vx(5_E^q;Y?L*VnVSbc-K{deJ?MHuSRCjK-`GfN zkMe}d`#kiNlFaeuq8|wy0-kP<+Qvm&piOy%VJ2UnkQd{yLoTsZd<&@i3Zq0!LHjMj z5UEVl*T`TqbKS2|@>H|Dj6rqeG_mzX;?Sx z+unzE{#D#$>#EK;82cm^x!>U*XyEUeE7z&g4Xcb^l-iHYL3^);Gg;PN*M<$r4P$;> z!QdKM?HyHE9}8WR(CPoW`Uq{n;qv)elEFYV;9<9NFo?4QScRyE&hq-Ew@OAlmZ_R% zf5J~!*}M%<{SFSa+`qIqzO)Ef^YMR_CGt+9}Wt7K; zl?&vQCUw#YA~AAmImcQ*^=YDP+M>&*DxZJ(ndb7rDD28 z!7pF!DapBl0#%WqI;zMPn#s>-X135wZ>E{_m@+m%8DW;Y@tuDHl%cfX7bCdF5Q`aK z`Hi?Ld&gBpjjg3+z2VtCNpn zQImpUh@?}7Vt^#kkji;=^pUyGJK`qjBSG;@aoWgORrEM@3}`$P0U9x;@nAILCTmF2 z=}rQp5tAA>CmQ|ud4`FJ`iV(~c#@OR@M4T+a*6?EH%%pP8Ui%1n{1iN#}Bqlon}NX z(?>mgxF%$ZF^-&QoQrTzhXfsAL4s!_fe_ZrNDi0@+xY?LN<&13NKLYJ=5))XF^1@2 z>d-;D(FADvsz*1F_3@Xn<}TN5?7vE^Z=z1>LCfhc!*)getfUual62XnOVZ<)qO!P5 z*-(bWex-!pEs>mmFH{uDfOsMU5+fL1gl3p%Dw7A10lA>ey>S^293!YyE+d#JC>&r@ z!ri!e*lMS>?+N&RN4+0xswm}{cj}Be88j^a`Ik=j?0IfP=d+Q|pKokTKr5e(@L$xX zzG?emLxZ1|H2HRD{XIBV$4G?Z!MHbQ&|8590Ji$`>Ws-Yg`R}+VHZxfDscR4Ar}&s z=ie^+FB)!;tWTVr#Udt(K@6syXogz*{sj#PR~NumE&X;Lk+21@y)DK5`b9`aSjAwg z*3M+Jjo9ic==p*$#mjOAc59dqm{gJQP}G{aUbbwG`N*Iv4Z|+1*t{CX%{0bSYiDz& zJT8D;#e4=c5V#2_s%hGW4dRSpL8HNkE_m_OIAsay54%vw28MBaM!d!l42-(bP3FS5 z9p~1ZIG6X;`Hz3R@X2@Q9VKTSB_G{(TyQub{ei=AuH-f({v(1ql&T75`_HN5eWnje zaJO*8mZIlY=RLLjRMTa7^)hm;X(#n*Cl#s3)plBw=zu=;XzZa+93>w*9H5U&93MDJ zU`xA@hH~C_lp@G;enUPZCgjY5kcFjrV&xRibR@V+*k$J;+<_w>#BMu}2eBLmYjz;N zi`#W>+~&e(R|Y+M$?K^S?r8`2^lk1*&@Jzl4oG-E;ow@9cn$oMd*=%G?G4UxgDd&P z3*BTe&@Wd~lH7MIK^f*IllG@f zk%wRsGEhP zrGv~nhF?~RCMyl_Ln4DXMz#dh+b^r96UTIwrFZqWcb2D!TI252ST#XB;4cTtz(tX@siTSlAJCmP!U~E5mQGM8K8`MTs5w_D!!p6t`2@92*H#) zny7#t6qFH*g^b}{W5_!ut_tE9P;8YwF-*}__rz4)8C7*hc(on-H@TrK zF0|TKdcFCVoIB4#R*y8uLyXEW1ULR+eCQcAXyV@uf--*6D&3X1IDN!;9g{wMtU5AA z6-A0wMGJsNf@wURXc(grO?1+f5|T!OX=s6`S^Dt_hKci>N;JlU1V$sqG${rIG=eJ) zdegAkPl=`}b4-(yj8mo=$4Bd&8OCMc2pp#)BHZw|O294^)V-bM zDWL)q2{fdF`k=(|QAtVBb1Ms4uFPq&B>&MRxz91$eA#(lp{vs)T#_viHTy z+^wIH%Q*hxn41jea74^Fg0X%z7~&W18ib2XvFS?!lzGfJy#ZSi`{8@a#4$jOX)KD? z41zT46X3W(Jsy|AwiZ`5AExUaAQad6t>e78=>MH~vnc)UTWIXIi z$uihti49atON?03gMu<$w5g!dePkp?dufu`|GdP*1U87^iOd6nGQ9k{sQD317dBaG z72+83jv*Z5^p0`jm_^N@Kp|!fl4;?3GVEd^1Of2 zlk(|}6cg(!#+GCGOHX&oriuzwMg%CMm?G*aq8osLRK^^rdvKO{uuz7Inovb>joC{$ zCbr5Rrrj}BcSlv-1&XM)Bf83t&}!Smt8VREbGeSy9O~b|KQ64==H=YkCG5p!ZZc=t zdw#*>KN_?7|8U|=4EYS0$hNe5sH%_!0 zCMWABB^o9t7$zl{r_3?OCz>#paDs_oSASY6mw|(#?pV@g zmnli_Uy4eBGHyYCB`ije=y%Ig&L2EM!Vh7oDh0~$|9H4V89eUBV#K;9CbWrHffhh6gX1gbJf`~{ zXt{*LD)f|z##u|YQ%Gd21vDK=q0fNF0eP?j$|$X7HfPOY-Z7ZL%XXTx5OyhsQJGOS z9xAEU&h)nCG9rU_#1ciE4arLt^C7(k@w&OOEIX5=^djc4z9>( z6ys2YjUL?nmL)`i3;@CRrJ-@co)NE|j@t^tIWnn-&tJZA)^Ym+V+Ut(knbQ0L;f8k zqBFwoKUU{Un98Uv9lw7`iWLM+C)s7f{E*0dYI#nRtW))~ax9s7+LYtUL; zqo)i39rTyM`ARIY6B16`gLLN9)2o}k_zl? zP)8ax%yEwaTo85|8g%Z1PRXd6$oj6r|9Q&%PY+j4|6f5)6A05_0yWc*#TA#FL1d82 z;H;$?d>k1wk7H=oQiw6$MPx*?mJrA2c^{d6x)^aBna--P4w|rbn$Q>2r4yNkN+dFM z6(g+jVP^SoqyI38j||z99;T*PZU(Bvf)#{NhFQFS6O@tcIwdy#L8S!ul?)M2{?U6w)KF`b!rOh^CZ_Hxj|cJd@qYuud( z%D{DL4mrDlAYH9iRvgU}(ms2sf+H zqeOE0J?lY18EOhDYJ62(Q%S%vF;$VpL{|gtjHhlF?=yE{IeW2}d7aDR&amCHS@4o0g~8DiE&$JP3^E!_;Egz+1w|d=Yjtnp zqO_sWOi{X!Fhw{ioS_*ppovzZO2srpY9!O0B#eeIjfBoHp&tz`zdcJoex?q6XGn8& zJf=w?8OMW=(dcQ$(}W~L{5<3}6B3Q_^YoKu8ySuap7H8o^G^+$WV|roOpl(0BRYLB_JxmUw)!OHiHoZr`*v&H@830E z{l3~Cn;!jsa+{B4J@eTc)*si^J_&;dvgyIxr$8sLi?LT#W9!yUYBn^#@rYc0n8AEx zAe%)sma}Bz0zixc{Oe`G2|-9JQ0RVA$(*BC&cY?4d1sji4`t}DZ;I^e0wuO$iX($V zFE$dxHIl5ydCwQNb~R!nD<&!vZDF&PDqC{VF9trvHJb_{zqbWp(<9bHFmf|1V<3;y zj|M-*E85sLfP7@);O^+jLftG%oKyv4LO$@#!xT;6LPVt*JFjB~i{`r>mjuc>cJ9}k z7fMRbvjP8k2Rg-w(SvY=J{54oKSWedu{@6pnI*?7BJsImNwNu&WD|%9r3)J`VR2+K za9qRw0e$KlhK0o^zCjAZ=8HMG41yRqc;1;73Y3UWfdp*NZOn(~i{XC9 zZ6!d1sD+Q?OZ-I&Ysh7Wxz7-J+08`f?!3Ta`p_G((!F4D>M$_{)cj^*%>kH0t$@}&%97dLLaE_8;so8JoQupcY2hc|*eZLM9 zlgzlt_umg?&@Bnkd!%iE%p|rvpo$^2ZPY+zY4dVf2#Fmdq88#qb z7Oj5GJZ0uO!}`uZnWu(YOD8e}WrWDSL}dEuN+B}nBclmzs}6Zi9rA3cvz8cjD`WX><= zF3`cH9K7VnUvR}GXgxX3U2@(94ynq07I!BuLK_mH9TTa6ZOCXvc!(k_#I+3%Q$&Qy z!^2b&1Z%{Y1{9@^0!1q^5>2!+JXRGmTR+7fm@r8bH{R(=1DdFfb&{Hxcnyld8rK3( z!bGQO+E@ZKAatV9i5QK3++0H(DM3F$POG1r6quV~DR@Kn(HZ$KGoJmV+0fiJ1Bx=5eRa(L(ggMH7~Reg z1i#Z!| z881tYT00v?M8f#$UY{4PWW=UNA@!h^gdcb~SkttHvmqA2zq_r)UY3(eO$q@r`jcFz zox}UK@cu8wIJt>c5@#f-CqibGc5WrhNjx2I1ggy{Z!Pq;6;ZqiC{3lC$<||Hw<+K! z3|_;^(M)=P@8La&z6;$N&2)~yx1CLS>-;Z&p1bWh1LOJIC6GAlaL_I$N^V~$ae&Ui zm>&}*XG(6Lzl|A4XB{OJWrp(8M^pmuuEIQ4Fb~T>r$cF!4L^mPECUIy0w3`gf^^Ak zbkDiXw*L~bcEC1)dx2ZH@E6?9?YytAy?5&3@eQZ*8l>e|GP5=5*-HCSRq7E<@>{yp z{W^3NITCjWa`JP;V0#-&L*P++ob!*)I|Ikuo!IJ5=sOd;8%{51xx7iYZ@qdsxSkHKcL~??FR$(nuA5U`OT0Sc zmV4tH?vGEs9A9vbD_)L2xDs4_X^1`hfG&kt3?vTdu?2>k)1R>=x3Df~ZkpTJIJ=Qy zb_3n?NA;8HYA1pMG!p{V6gBAy7|fgYkHFiHf0He$Y2~9>r6>x-w?|bw$Rcfe)VgHV~EHM(Tx+Y zwbVx&4eF_lA|lgC6G1^_o>vi(34K~QriF5JbLFU}O4nLT-7qXSJ+2xj8FQ7bu3Eny4OQbBC}Zm@#y+Y9-HWG8fHK0S2)8O- zaz>LWN4SPGB;Ym~0OIHP;42{y>Ex3NTPOtbPzJaiY*-jn`r>FBE?Ti0bdzujJet@l zf9NPj(4R=(8r+@jT6eiN8&Y}*fLM?@KGYJ?lg%7qrt#5!rI%y>P~6K zNd#!pEQo9tny1V+O$8-bFaXVb6NaQowoDHFh|%cgaF$#yfQ9wt*S9`{+km3V=0iwZR8ee3QV!N1-DIFNHY17MR8`9% zoo<3z5v$eUdQ4vC0v0}oz!P&0vYuk`Xs{etZU26;xl1r~+%#w{j?BmHI6L|E;vau0 zx_ui|d{dJ2nz^7+#l@#8(1!?x_Uq!bZXKv!B zpwqYE_+O_={=(z8VT*Y{@DXeaZ{0j|i#}pyvI61w>DzEEz7A(^IiT<}f8n+mO8(0M zAN?!DZs#v(D7@dlZo)1kwk|)K7?hmVAa!+M+N!$guw5Hq=M#0(c9`wE9$R|)@-OFZ zm7Kfv*V(^rpa1LDxm%zTXcN|Me?etSoL+1@W29(*S zw-2+Vx3Vs1X-aBgOlV}9-B>@ffo?`!{WO=SjOHH=Wstd01Dmz z8~Fkx=+lbpY99-h)5~(LPvGfxPe%u09GNIvf|JNdSHB)(rq!=qL`D)vMiSYVh)hRy zSO-mbdvzGiT4FvjV_GUkKcR3D8Rx8}5yGq`-b&yZ^Yz}AYdvi@SVD4}g0A(2CbH07U+-y#-5v5ROT11m@j44~Hz0AmN&z@v z$PEcP&c@-R!G=VWQW4xqm)cD`pSR3qeO!jOV6Hnq()jiS!4Lpg1E2#hr#11JXLx2=*q7 zglELACH&Lx`pduK650eFR&*6UY7EBl6}!e%-%PGCppn&H9a(ezw90QW=5l@+cSazL zAPOjx#hqD9@+!{sE@n3-c6t}*ca{4c~Y zq;jB)v-86KOO&pNM7?L(P=+MworU9NO6dLXBr%i`Bw;av_(@E6n#WXOC3Zb6=UjzM8`_O0vTB)XCtCN7_4-aoCc*pzEi`v+3C`93R#IIN2{658WYELa0;%GWX@(@EqTaUn0pIN zVybF7q*qUbLU64mA~Hmm*uqRWamjj`#hSrcOFH#TFZ81+^a{YqO#+eewiH*fyd^Lu zM0o!pLEGw;(NEYWoQd6bZtS+Rpf@h$-MpE1^H#y1w+e3F#>CCrr&yY{?9-e1fBkie zWy`x+lKt~DM~;8_?y-ySo&FB;pSt-6X1jT_=nuRW zJ93jQO{f1W1T6q{hSq>;7vB66+5{S5^U|E8rm2|?(^d!A*Vai}6KG#u2NP=p(q6XN zw_5D)q`rsu`)5hfU&vDm|8x}mh;4N^=iutr-HFki$KsK@5}rPG8=QVNdi&Yf zExz(UINKjwu!9@scx0%98|?5N=cRTJb>h>wk_i~C@NYGav`XxMqIED{!&UaZ7m3r`h`Ui`C{SnQm#=dABd8tdC z8{Mtfx(8hC5rEt7mTNt%pc`GySGwCMeOJ2Cjg`aF^B)_B3t+RzzD^>8@qNW{WX70X zk$nlr(5$6Fx>&(Srmwq?Oh8&sGFy=Z zmLzX6$_5$y2Gvpb{i;hKR37w8H?04a?iNU2@5vgWdw_6*5?$>Uc%!@JYBw940=m(y z&Q`^i#oRd#1fw?R)8`>Ok^qoWnc>rT_Ybw33%vQ6}}8XvMFg^rskUh}sQSj>Y8yx+YP>eA#>>+ld1oni zVF?2<%aO<goA1BpgHUHZSi2s5ZX949c*yn=0~9DkyHadgKVz$dT&NL*%0e%Ek=# zA1#O&&2ZV6Ve$|V!5U&TW0)TeXsk9a(Kaj9HZRqNI0h21O$mVAd6V@M!r5G>2n06~ z6p1EEjc8`9vh>KoAP+|4a-|^=ogoSFXaq*XlNtkt5GGiI-ZU7DMvyCVFlfGU;z9#z zfr+OxDT0v8OiDIRooAUW#1EcrnL6DtexQ0}JLO;*o4bTB6AS$d=?C~={*7WCme6NC zI8pcN>S3vS<%MfzJ9}r48-FQF9{i;&Nr((c!eRuupiH@3#>ryDlCT)DTwI1!4wQMQ zT*e*Bl+R^6hz!ZeWge2f-c^zQf&8~Ksv8s|7RCM}H8b}XJ@fUbqnWVE{Qmp?zkcTX z>n5N4zOt-mbP3BFev#4i8|EYP@u&_TywvSX`~JmG4ms7}rNa#ak~;S-Zu?R(80#Rg z^Zp+$iOoNbShz1p7&Q?!j9Zy=3Y+Z1#ykqmVniy=QO#Y6m5&29WLRvs8kCO=1%V6W zEI3aJniMKSo=xxstD5&CJ+T&0%m|i0-z%ViW-YO*##XW(@wT4E3_L|b+5+23mcvF( zJl>i*`Vq@fjz!6VqA)XttwEolDwel&s)<-bHryf${y!pmi)OU87e{P46Ta)V5pLiq(kKfGw^RK+$Zyovk^5!MS?46foG_WtLXJ1<{eN7<2 zg_L!HX`rIk;E$jX>01Hy==quw$Qx?w-g`y{(A18w@?25*U8_pGEh|Z?|)|BWL5f?2&>6`Q% z^N)UdA!75{i0$Vhwx5aEayD`^JbHQo?n-!i_%_&{kHmAmeQ$C8zjGb_^a?5Af^Typ z9jIZqxDgI+h=Utk;x*904Rmpt<>{U|aRq{FKxWd+8ax^+|@qj+#fIfAfKIMQu zjXY(#2c$n~UHGJVesg1DW8<914b$uEr`Ffu^rZmJ1dvr7`%i{4)K?hT3`&zC5`Pq+ zdTgwYzZ9^``g6?8KB8j(r~e0npBv~}p>Kyr{Gw&l*B$EK=xV#s*?PSTB8ID-F@3E| zook&faO7H-fV)#y^YzXFaN?0?+DBUxA_FmwOpI-Yc-GP#iHvyGQePHF28oP1vWq%G zATlqgL))mvh$8!zLS)Qr))HBUU?mF1A*D5bgSGO(D*quMFgOz%wSl|7(#?FOYXAt^ z1eyYF=W;jejV^)G+jPl#wR0fcG9<2ah32wuQm#$)&P(ymTj-r5F&$yZ4MTT?FG_wU z3y2NZaS36KVx&$LJXF4RLDl1o!X$OlrFLX2MvxfFz_y(>5fU%z65DF$%l*5f%}*l& zX3x8i2yl!*B*h6+gi(Wdw;Z`fG46%XaTLP`IOroBgQ0x+$x0ME264=D3f?d!^CULT;xb7Cp)Kf$=A`??j0lF6`BOx+oRcQH81|GVO;TT+@$)9l<)hL61SW~|# zcJG2k+-bq(gkd{m96H4?rK~Gf*tZ86we>@* zubW)?5F;`;K?xGPUkr1N$zUKR)$0_z;h5%1ME|t-U{b&X`CRQ(YQj=j8D{$Cpsf& zfgUG1F_AaTR9ubQFmb+l@*E>u{;>cX{SVvfnSre?{XP{~g7#E=EyhD8a14*dpT|J+l6> zZ+8d$cuaQ%@<2|=)Zrx2}l^?$KoD5Ai*MGUyaS`|n}Y8W?T#9Z@faxh{3GK;A(;ok2` z{5S_23YVI$W!%D6q-G4ocFN0^i;-(s1=xe*ff{la=FfuFu$_WkFH3P1^C6u!9-jp~ zUriL|F|)}{0eOgHSQy~S#*>%f#UY!|hHN<B{=0==;q>(jm4o`pd3zii}SnXUH1Olr18nG4(K!9G^8>v zgOiwG+s2mmv?b+fQ{oebxlJr{AJfffsGVLB% z!%~@kt&e_{k71q6uo8|SEXFBL=uPQm5~^;pZ%jyUmubCY?Esp0e>Y}YzkaoZu_u5`IWzzs~)omFpKlx^%v{>3Qf@-Zyy9rfz8s38ydl@quQ* zn3s+PN+&X9snTu@(!>&pe$Yto94s(q?-6moL?z7 z#ru@KQa)_in=l&2CNPL_<_T8G`aqqj+SvXcHL0MWgiz)kBXy0bzF~OvSBH^myga1( zx*;{zOnu}KTWINQ7FSGjlrp@EGQ0{1#|X?3l;oW)++(S#$U~{1xB;qR15_ghD1&>; zM)mR=4eIMR3e-jxqVSYd&D9JW&LEt>t z#jS1b!hoa&w!{Si2?@4Y;mXJ{@~|-~7LNu)((sH%f@wfyt?neoG@guxG|5S4K$CT` zB#A2xMx}8szYU_Lo!l7>iyX|a?nK@+2x#UTC#4wU7ntH9kzklK&p3IGX>zbOtg~Xc zj(s!#i&>1@^grsh#9bI9#9bQ!W>KCBi--)!byBdt-7lAMXE74}Be+aY`J&H!e*f7258B25$CxdSP7pBmRz~%0 z@@CSLUu8A@`n3j^_6Gcn*%-Sqs>TOs;`_BZ(XZRN4*l4yrBT`1h!eVo2@M01diOfp zwbyBeV4^K7BnpU#k5z&H#o^fCUoF;FL}cKmU{|k-HEN=eo>-mK!tY@IuN6a}&?F<~hAsiV;6~H>EqHuj{7KoQ^k*ZWNA2O)o zA)B6`NEO524x0nTD(PiATg7Ta0QCNRl5h9zw0?wKbcfovZkkGM#dm^0_>33 z)M&}RjYaR=_;c0teMv#dOB*1IS#QBS8$eb(aXp+Ekp7A-1xnaxO?@>W6?QiSWULQJ zh78+-cOAZT87lMMFTX=Q-(yw%R|xBT{WsV`8e5e$=_^@BlbWV3ZiuZ1?FQS87Hp8$ z0y3aw4!-jVpZ^y){pOanxj5J9u~cXxXq?xq&_o%~!mkCU!1kSQufx+he(g8*$XNN; z=+gMq_={fu{hb@XAG?l^^=)WCsMY&FoQ~XncKGJAqqY?VZ#*5m=^g}c&iRp>i-WhE z3*N-lzUAd}lQZ1py8Xe8FX6_OaM2}oM*P&TQ^SP3voa1aI z#}8gOed$)ylV9)G+21sz?q^Yc_vusi>C&IKW;|ua)t8!><^-8$J!YKV06k@J`qIAw z%3$ZikgGzQR?YktE~w7}nR{E$vKg8LPZuc=B31+vT?PuD1=m@`B}ZyMQY%*sit>xZ2iwSGw^$p0ck+r|7_$5rH!z zEVCjl(?H?QATkmnLt%Y+BBR5|zMe#;yVlJ|=6O|!%ST3mk$r+ze88AX{TkU)_{+;H%bQHiw3LY?}Jh|tju?fn(5Z9PRjv;1n-W6ABVAEW%s!?Qsv&mw2%`D*}!gQR6id;h3S- z*CC6kzHU&Bb%ScI9$0<#q(=^Bac45UaHdj*S3w#BF~nk$8H-t1=_FJhG|&4u-JnQr z53wQ-rGn!6sD|`W4(qKL+08e&yWgnpeq(z0jso?R1^4npQbQs}gY%nYVR42@^8ynS zYzgxM=8=+Y^AZCSAu&H7aY0}bq!-u{69W^HZ3$CM)5iEmjPMT`tqdC@$9Yd3fzJOOykLD2-AoejTqC27)=Z=^Q0RWuXFRGnZ`tzhM(mm3LcEBI|-OZ%xH}9 zv`sWlSZF|4!-5J=nr)cSPaWJs{*t^lKZ%LHx{~(&|E{}$GAy$jlyUD6%as6STwKPj zJ0{d3;25FTzJomYOKEajA-kebh9rB5-+IW2W9|rLKx}%j^RExL-(BYl**ugfbA{|X zLK%>&e-Vqw3!xdYoJ0oX<}c$6`s+btNDqz6^zhI8uI3*XeGtkBEQTD^!9IJU!Q#*t zKbZL3he<8J$ZGb@#`@oYu@0km7*Rl#FxH7W`pH(CTMj*iL?-;G-Rczycg#){s z>DS{t@9vHlibYe;=~(gq;Gb0@GDMd|_k~+O!%`UVpo0m>QosciA>&|2?p7Ghm&$=% znvrBVsa4G(quH#+zp0@Ph`m?^Y8%({C!+t$nW`pS*&1sLuNDja0IF`;&WH7dy4eb= zu$fI*c@35cj|N_Y>Xx0H8K*3HTM+KxdQ76Vmhg%iym5o(VZD}j6x0El{q)fFg~K+U z8M^-6ysr*l`~9t}za6^v8*C3>`}M8ssDoEw`}^Bh{@7b^G5Pt$sgI>0E3u_+wWM#f zq;Ij>H`&rb8?9+utgwp-5FFWT!Q-23m|=@$(Pm59t8G>$1|_emizTr98I&1Hqim4J zr2zN{j;{)`tQ)H`>*|a_}ZVZW*kjwW?%kj zs;I@F1?(HG$(t>y``-EVt*gJhefKQ&=nwV~e}Ob#f$R88sT%KGg$m#+nqkt><*30p`7n{Ds9Ar{oH`w3M+uzWoZZxJxnNnZ0CAToo4>HbeWSsH1 z0ijG?w)&C)W#C)<4~{7l16@aT(=IO?o4sf)s$@A?-E^?J@r|mcgU|~(`= z>pBzaPK|V~ejRB=979AV)HE4HI7aZ1877*wB&>c-k$ureMjJ&$roB3>R3ampwPaI_ z6e9bQHAt4B%Q$35aO*#SOLZ8ZEAO9BWuMDj6s;>nv0c$|MjoP32DkQ|GZRC2oL#~dqnnJ^ zxh32g9doNG&;F!BSV$U;d{jGaqFjb7#v_gl$Td>9i;;y(G%(?X%!MyRIEX_S!Bd73 zFDiKN7{W2F6|)5#^OTCmF#?NerkvPR1^V|v86q;E^4*$9CVzZnMn$MbiNlB9HJ2nl zat!5tbdL9XGbVqT@Ab1NO4UFkjXJu`Egn!kwtcrJWLu@pFv) zT&H=4iL;CoCh23L=`4QTWqzGiwb`UNkM{llE*F%cUVu6;QD4SG86q+uwJ6Wsb)7_H zK>QK69$DZlcL!xaQUv3vQlX5L%eb)^i9Co5=x(6QApEVZAe2!I^B^*yia;5VtBVnY zzp3!6Sss)Dc|w`Lo6Gc+FZ!wa9~W!=4r6lIW!4xA+z3BQ4bwaIDH_oATv)pgrab%M zeDs(33OS1cV-0|nM&VAt$`5F{)Yx~Y|Dc_!db2F5=thC_hj#s-U-vUeZD6F~{NI&< z16=7D(n1CPtzr%%IEbR|B**7CjwoLpHvG1}BteR!6~e@zHOU(>V==RjGC zYZ-9-6@f31O`z_9&hHK^mR}{b$75|MY+jX9lf@?UCGz z`!E0c=G9;JUHa&GyvQi&kxXG5j&78W$lDyqS6vhtQ zt(Nrd7W)=BZnbZ=q(XX!*$xNsh%IHS#lFp&LC0SSz|5OXDcdb6+fB$^V0W7-ZM&J3 z0Hv8zw^`HhM046!TLv5iK?#sylg+-P{VQ*NdHul8*A86y?cXA7L%vC&J#QSi{0AIa zlW{nyY3hpltkK|>p)t*Au*H@%r@wyi!-JQ9+jr&0!OOqEi7%%gOAJa~{%A6^17w2? zkbw4tMurxH%x_-#12V(4=&S=*@GMBbdF3~}^cD6@`Sfq_5hSoCKmYpn>F-ZPZ7*go z!0Can-IdM^c#XX|n=mnOvsbN~pdjVv%NuUbsh6H#XGuSSA{XP} zqS1YZ+xvmnt%F{Ue9rMDS8{`MlsuOG)j=IjS$b2S0o#3sv=v7CUQ^lvV|okAyeACv zni}RjuAPocVr%37El@_Uj%V-%*JZ10KCIHF!a?lwoorXFOQ~u)#My8eILN@DjFZd2 zCD>K|r+=SRk?{M4uc9)_pvGCT@FPxW1|Is0h7s?#tbestz_n)ruC}UkwUza51t;!k z(mUEVi>53^nP-Gsrb2>zWQfQJvz9=FVI(?{l%Mg8J27|P+K`J@A$$%lMl?_wL2jEIfvOzr!U9UcEgBG~* zjOF^Xw#%(7*cu+UDTp-`2-E8tHm{@XGo;$uaaH%mRoOeP@*bDD$OrW0JtoX@1TGC_ zabeZBp?8cIM($X`U0`e6(6UWvcG6kAsVOo(Nd#pefu1s&c?uRsvQ#J|#F}{^P{!l9 zFp6=FecCF>L55#hi6$#CA|p&zLL$>dHK{3TViPq&8J(&;&!BR2w@{`Yo3%txrmiBQ zEF&KzIb9Gz8I$rZpbR`Oc=6z@2nbBjzoV@=Vzlt`Aj#Exr zW1G&!tsg7-AG+kW&`F6U^k^t&Uxs2wJi9r!{O-cu)+HyJDWy~PV7#Q5>y{y6|lT4OLj}1Bc z%%H-~y-yG6@_tDB_v71qoYe9Q@wv!ZoC1pthUjb?`TXM>M|C{k^SR>$Deg+F1Y!iS ztV+B?ik>Y9&GPW3{~g9KY|t+3B0fO$@X&_}tSOLH`RlWIyh7n!1lm$zdEpXE#cZlk zvA3;&GiR%{GbNY%Zx*~5XZmg^?*AHS@6W%!{?iSnU-$iVgYDuGNbLRMN^+-FNkPdQ z1MEADX}gW-+bt1>M#2DIIjw!@sh-GoPA%XU*RZA`~JEI&Jl>0O4j?dAnL zOc{_93S=cp%Ve`p?()U=4rA>iu{f>dAJ0-S@-w zeLu3qkH7Bu=@&RiyL*3z8=<@71-ozj{2RN+U-8__zd_EuKmI~D4(Ez9yX#liiI@!& zBsllYANYe%l(6M>8P2)^HHY-7^!E~j5Xw-?Pyg%W0V=-mwXeQXycPsFv(ZwUe&Ujm~1WmX6(?Mg&>W^MfxJCbN17%^){d3 z0!~#o?}2lTng~__ERz!Klm{Um^u#hh4(1_vPwn%d#Q)?`vq1YG5O?j;KOB793aski zEP9&I@(nei+Z#Q7`AN&Q76F%^w0Q^)qOP_K`1#3zpP$A&kOooW(i8P31WsXVElmf7 zTc$)>+=z_eBQw&7L`LwDAtLjVHl`2nBNI)LeLHC)+N;CbszS*}hE~6Bq2zsJ9#@WR zs0e;kJ|a*t9El8z>?>G(VhfNALZ>7)q)77q2OBkoTf5#eklhsAW*yOu0Hr}%zKfdz zb>*pm%Ps3%e4@@!Lp!CsuiC%wfa=Sms%{Ho%iM?!MFJ~E1siP3M-QyNHr4A?7OrS> zZYkoJv&+$0=E4#$T!ENuPBuO-U6PMp&?bPBI*9o>T_=lQ2qngo1G5cB7oTrtuSnQbT zPb#OiR8MWDnbK4}8Mn+ehHZH@R!tD!(Os#5I+jLQG+@LEyT)8@qM;(;7*L=h3M45_ zEb+Nw2|hAJWGV<{grNky09|WmOs;$gG^xsg302Uqs#NqQ);)}Kg{FYVG`#v+ex?$! znCj>n1L{{}C8%#r&~i}kn#*FV?8)#dO7l8JelZ>_=E%%PK<~KC(Sv~x-j{f+gcG&+ z*8}Q+M2RKtRa|?;z>bO`ZGDEd@fq=4t>Mqt!o>5nhri%6qMh%^cC|;e_YLl^h@2cS zXS#LH)PT7&Y%X~+8j^(0%za_RvQb0*#|)A2t2j zU7tFS-$~^|8P;F(38!5ArBq4bOIdP38R9bc2W4EkTPOn(et?DFVAm0m2A{-QBHgov+Fri!m&zqSSNrot#eDpWjQL-H?WJtH z!WedbaYXx%;#+?%Io%}|YgVtun)G?%U}%RAx<0wjEknh`>{<*h z33UL0MGK}a)XJ(rtCtNhU_8M5HCT`o$>}0tgcrCMI2W?vfC24eel6#RDfTy`I?Aeu z_17x%(CbrL253d5_V))0Dp3WZz{>h3!t0eYYVE4(>Lj!VyZq zaS){Un$p;(kUxb^q_c1f+2FV_eXkylq(HXa#tdf(Y5YOsqFu)1J%$V{ffc)pmG*{V z;jT3Wte#hQ|9B0yOnl8Dz2m1FQ2(9Z!$)`*yT882ww#6HSBXpaX0dDq( z>)U^1*>LyT&L72PmLfQX6>@d=_n340kH5evRFqIY?83qAKVIc8_x%<2=`YaKE7RUd zYMQ$GQEV$u?cDzXlkf5TdN^p0Sb~fPkU0+t*HDTa;TjGdE!I30r!Oc~Q10Ge@76uS;(><{~%U;WgF4O>%H6 zzViBG59c_@pv*Nd$L+^Xd`)p=_8C(_uN&-J4Dbr2Lt>dBt(jq7Bh&21^wS>IO{t@M z=un1ro6rwqI4~q5*kR&N22m2eS5(Fz@U@=8OEBjbIF6^Yju-MPbr}?w%E!2tO3*2B z3u!1He34)(U#syNCV{PSBDO z^#1|=hrtjGY_UmcJ}IjwG$}U418s-@h}at?+~c?r*8X2Lt#`S3oh!`)O4a2j0xmZT zyxu&JPcuP!b%UW%)|t`P>5-Oc5mt1Q5fPb55+Xy9eI;>ZdTXM3Xd;ERmINZ>^pOd1 zo3*3}=6z(8!-ZK(Wb$Fc=}8R|tV9n3(p`Q7d+K{!ZDwJ&X}$b}_2(9KFE_K%U3=}3 zny2>j9n;@`On(`!y)B4H4f)Xsj0VIz(J%!oct$f?yXykRJ_5U^JzMq;a3| zBqlX3ZyJ#+jT@$!svAE|9|wtvhFFaFEAn#zNxm(x%Re)bYm6Yu;O~PjThK2Mmm$O> zoCpa@Q-S|{iF!RZC?o16Nqh!Mlqousx*4IuS z|H4O6?LL0K!CLW!Dkvy{FPz~aI$~6#2Q^F3e~)PQQ%?4AF2=` zv8P~A#p3uu_(RnrXZeB?i9kV}4QhEx##ZOG#Mgz&P@1ZQ2fw?z?VGFYiX{AKh5blU)6})~;5N}Q1hy_2Q?|ePA>`b7 z={h_GC}A07Zf0NoD2unkT8|Q>?fcKOtFZh19x8v8F1`Jm%XmBA-M}hc!l#J`*=@4? zc!SVBu*Fk8`#CRsH@pUg-Crs0vKC&6)7@Sv?z*m^>pFTvJaxLu%Z1%uF6i;Tj0uhP(;qX;s;`?=PlwZ&cqmiG^d*TT zul*fG9UTpxLGT@cEgUf*E`i<;J0+7cjvVoX48%L&Q*^G;L{&Au%UO%7oA%ilZeS&h z)oG^q=-2ofR{I*(YSq)(C3q}S+583+_=x2wq>)fK!437*4@NWxllMJwR+|Mi`;UlK zDblLIwuPT3n{q5-3;gpS*22~?)Z^SA9)Tg9`In1s8DAs})gOh%i5i2)OH34zcmoCv z8)oO26cKe);mk*7Ca$$)o*HhN7G|CtYMKOML?)hajIh?yU_Bq%x4#}|Es>8*cWtDw z){=*h%&3;CF`jW`FtV?FxL)o-WEhkY>_aAr^;n9O{x50$`#Zh12de%0>tub!rYSGM zg7xdK_V25LtzUnYtWWovX|%2|NLX1(5QTAtu`%Nc&FLfvzXrdWyNiWt;j;*pMrt0pfsyo7~ zZU^1*ao@u@S7-`&QWDpgel?KAFxQwRpq{l*J!&rMUTYClDV0rJn)ArJb02vZwlg0& zGNTfL7=gu1u6!WA@_vweC0)0`+9Vi#to(2Y4>bY7E!>r;@+9tA#egUM2R~73aEltl zo7W!Jtk%$$wTHK?HRPGA1LByjkRQ@CYY9Grv~cdfLs)I0vvY$oPM(7ICFH4qJi1`F<4hhzhU7+J zJS8PB<%uXv#ktHKp$w?PTn5Dd=<>|PsZtN3XeyJG%Ye$~GD6qmp)#Qi+AD&brVPsI zGUGCIkSQ=>+S6>hHzQs(HnsMfe^$EnTcy9EW$SU|PZ4=lQL?V9YsbE449|URWcJg8 z^1Jmu)3xop1RXpD7AlyY0h$TnPiBvQ?$gLN=d8LZ!q}kVV#Xi&d&fe7VAO&Y2(<$F z>$6}y;A33rr(2BnE*QtmIxkiH#CT@J<1Q60y3oTCbMRr;WwyI25{z}QU&VE+h@dEj zqVPe$7Oa0bh`W-@{kIBQ7#gIon~l|`ZZJ%kHGHcuP?8^1o^MRE@fW- z_0Mn|>ah8%Ygl+`f=^+~PGJeU#5b3r1lWZF=^*Y>9lpM{>C&~$U;jjBQ6-nAzMIrE zbzNO*2iBNQ!98x>dtnn)3~mZ8!3u|lr2>V!g9O|Qe|PvPs~&yy^_9(3JywCOUth(x z`W6mCIoIF_dbSa~!&>%kz#CGEiaW4v$2F%q zt}W`cHpuTwuKKM3s-k>L#z{+BzA-IFpPs8rKdDVUp-F2JeUV#G!X-GoW;?u6u5v$Z z=NzE3oZ}kja5O&o6~0UGp0F2YpD`7oi~*gkUe~40F(o%LPJ3K4qk(h!5_FOe56Y0I z4D^23|3C>8|I1kp^hg9Xa6+Z+l+e{6{N=w>QEJUx&WgdX6uMOEf8Z>IHj^S-@qT=^ ze1F|i_!O_D8mrbWz=PI8m3B7ktI4I&b=~_H>*{%=j&w;C#kxei+5d>})_6{Y)2X0V zkXGoje2i;l`n7UxrWu1DV}r9FoqzodCiWJ=oyNke0=JI_i6Yvh5a5fOz;4kg(U?J# z1}q#jc+kA*Zj6tx&WN&354G|RGU4XQW6YC7j7Vfa5+XCm;6`M6YF$1uoiq_0G~oh~ z;UoJhgFT6iMS(;{Ct7@yxB6tl5=(+4Mx&>gohj?5_3y9rAE=fM)c6fl`u9`$4d9JZ zvRXw_`oE;}>!*_8#3gi=@$c8MX6hgoEfvPSo=^q^Bl7_@RkS*!KmtZ;I$7`M)U$eP)B5Prd+9Q}Ywa)U5?iXL@;F94xrusWkUAbj6ov(qK`2A| zo1sjgDmqXZaX(N7-h8GCxyg_il;NLg+uHNPt8Ndgwl%c+W~X1(9Uk{R40VO3fH5Y# zbl{zD$CKJf7xLz+|{(xk@F#?^;B<1=!UVe&ZZ z>zKy>tut-&H}T{dAc*98vBHP!MLE@IZuB!wbjSZ1b|hFW-EPKaS?Z5 zhA&2?#i0eFnfR*aw`n|3$%G+Vsv6%hsK?U)qg1is2MkNbBN<^wggQS|8Pw=%#GVKk z;(YK0VK{MDqDKIY05#X+U)dOBN0R5iSFBkI+paEXw;HyueRbuvuYO*C@n_h+_T}aE zUtfOZ>z_A#{c}pk2lT0jH0g+Go?pG;{P%F~`me9PeDU)7 zi%`gwSH8Nk=GaF`ZPGIyPkz&oc2JjgNNa}^Apxg=4(gL(dq|(Yw+)>BBV2U-S3j`| zKsi6Zdhy4#M?YEcY({z$Bsg#)T<#!92WgBva!8x9H)Ic-0y*K_S1VC_(v=&V=2 z`5E%Ct6Y8gtDm5uaQEWRa4pC~m7(iGfg8TK{3=`y^FZNPrN#EQ6N3=Sz)guo?Xzjm zdDawII2MJsfTs&3O9YJupF$pX#h)M#Wu_*D)_~*CN_>N`yF-0-1!}eN3v3_A47>2r zky&pQwq0A)ZVkK=MeWwXyHS=P1LQ1h`*Lx+H3jX~dRMvaRrN2f=Ixof11HUyIYxW7 z&YsPPOr9d8>&SClT8Y;}2bT!jKfNw(;T#(|T!87S7ebkD-q53q&>Q-6NPxDW(@^?8 zUHV>A+9so&dCJVJub*01!>_*d@SqHK8jOj^bm>0EwSLAm3SAcT=hSsTXNcXPDhk7g zvp~N%*k&ifwTzkwNcihku$baGw6+=?*Q%#;mebz00xxrZb<=+M2u}|{_A8`AdbObRRs!;kOktjMqCyPNvFbtXw2Xmlwpvko-&fT$xI8kOb;_p z39(EbW5uR7s2u7fX zB(|bNPCFB9POv<|H1%a5#=oD=Z=gcfpSM>%q?7ek`lCV1JY~S>?ccsuqA=D4n^5c= z0W#v6$75i4oQ2brFs3g~Ut&|1AOYJft~lMhz?uI}2B%X5WkfbVKLp_arUg@E57}OYK{h!s$>1{~srAzOj%jmAPch#nM z(4Hp3e%4aOp$tu5 zqWNo}=X?`sf$HJa)>Hi5J3emF;PGD6uf}rnj-mGx#9U*t2*-4(mD#0Mdgq#Hooc0p zRolA2D?72$33t~RTvH4*p$g)dxGHbNRoUw?>&opG;8ln5lyf&22S=h$?=1KHTyyz= zMm~e;)fiI0#-N6^hBT}(xQjA6!ZItyI%k}9?gY!+Sj(KTwz=c236LN_BWR)(j_@K( zBgjc=5@^zsF!d?kIOs zEV;87LFGUhlB=hXs&ptrl0q5!yUA(ylp?T-Kw$RWkNFFRV*|zH3zd<}{95_em({PY zt9^2w-|I8|-<+;^eTriDM8%$X^{xr(9b>h-qxCx@4Lib&J3`DmMwzw;o3{?PZXIIV zI;&xRM)NOIp7jURXhQOmU1%W?)6Gh+Y8a=27;F&uT!L4wnhnx(9(mjYLW z5)NtYZ)>p*a9z0ip?ZtfesLM<3^iQ)%l$DF#$lKMv14X<~3bzhea+h-oxc<58O9O#uVf5e-`nqPrkC=>MZ#miW+(nM8- z3#~r&)zZaB?ISjy32vE{4^Qn! zXiT~mKF2S9Vr~1w>bx%(FFBDq^tDybFJE6LZ5L~hHw-C<>t?>r+T`^ydp0l4Tc7Tr3Cjs&Sg2g(;Zx@gIjpp`^#-y$;)1jT(6R!xRP5ED6`d=w#^xz2!rOB zQU;jjHPp_iubWs;7au5sG8QK6uNYz|Rg%~K&VtTIJE4;0Fop(aE4YCwn-A->xTHPC zI$?RB|KzO2kRLiL@@Ir=Q4iy5SPk85Rr7wUA_`Z&SH}7p)_Ga;Dw%T)I1!bd^}e*dDP2r9Aiv4bV<^Pds(If80Xu(KM*&Ct&H z^JFRDEG!(D^;Av6R;)9&!@u5BhW+&5-z2zI#^{xd&bV14XtcN_2TLZ@s0<@(N2d(! zuAjtKzeXYxVV*h$ePkw$GEE6#J~G0@rSgf4XJlUqk$FrJ+(3>&WQfR692s(oAxX?X zrzD1=L{1{(KS1d}5Tx=Opz_1xd>WUqKv?4`v{C*0>ip2ARmsrYZCyK|YwZji-_}kC zgHSSWg_c7eQezGClo7mR&O>^M*V)BhNMsgz=Son{9pw&X(D;W@0L77U?!tgVSTGxh zS75YD#vn}m=mS9vKO*a@_UYy8*O9Rpoc9FT;B*|wFdPHBaQn}xXZ6&l_t2$vH>7vh zrgzoZyJ(X;>5@BY7k1DlwN}q*rkvD-dCKtKF-ji9G;$J|`++i#Dr0C!B_3XtD$2m1 zOa#+CLK!iUx#Qd=k{HUsDXo1IXceSEHE>bt0X0^O9(w6Rj62?4`RZMBSs%hNwH6Dm zF$~Axy9(-5E3IQ~J1DgJ<|OYEb1NO6QiZ%@&^3ml5fh6UR~2y#n|rlOQc0&=w*W6Z zf8=hVjJvqz@Q^@S_nk8Zo937)`8(ks2+cnTgt% zXiaoue?%(uC5IPF5be?%!;W+{`1Ne!KcJ0r_yBeIP<8Y`P1F!gj!CU(YD6=WB1A z&|QDm@blZIpAT4m-W&MSjygYXdi48O8-Bm;vG12P{&rE*iwlB2ecrT)N`_)xSE;bT z(uK;$PJtdaxElz5dvbbUD zyXw><8rUYkt+T(2d?XomU+=eV)u%tN`ur!zzvgrP+|{4`u~Jn@_qSdLIiZ9VpZ&c0GbrT8m0$d{@{{lI;AfYis0F>(BsE1h z8N9S69kz5`DC(#x_2m;^@Ml4_KmQ4?yYiEt7O%@*&}sRS$5Qs1Qs2?xg^2zfQKv!W zq2^G|VNJ?=y0jyzltV#FH)rKSJ?R#hp#FGiY=O^zDphMg`(Z`SMf>>O3!5%@tuA9# zTE2ZihuNJ{8kZD%=QmAVUx&{|c_2X-g3Q?RcnhrYKV{Dj8syU}uw8NHoAmL!lN+bLQa6nn z1e%U246OmXm}ZG1+J%tVJ$lz`C%!y5`2f5U1+7*TK8^22sVZo-D*u_)`7B%B(<>@f z`irY_%d3im)80xp?atHMkE>I1RB0#F$vMiDQG;{1H4d+(x4Fy`?bV+RZNGg8xL~L_mu^OV6a5u?Ducv}_aV_Xa8RyFU3tD_r; zW-J`>vK3V`zKMQ+%mcBy;eeO5u$FO~NrU|}6jI%^-`i4L-MANa8Rg+SE^*!NM||j9 z)mWUh1f8mLUX>)<-zMZN3aAhE$xtgcw~Kz52!z3}RiT$Pk3B((<0CEM-z9=#7(_-f z)})BUNla=C6XP^O1Ve=v*f3f}m{A@M(ka91DZ?Wyv%)P?Bh6F8Efm>zYKSpD7>Uey zab#a1j*OVd(9+l9I5N+vr9`F)TWd)mGBj&Ri0n&5Mk{j}eu5F`VIq3U4a%ThN?~Gr zUcxoA{rc$ zpvGF9vgCDkiT8yS{M;p+wPg1$NcPT2taRe8pbV7%yk;)5@cAJCddHBQ;{v5mFSSoE z7%QoL&{L+4-_YmOb6TlqKdqkS)C{qnQO$TtHT@~o)RtNd*$YLfY9pq>f59ofuTOUz z%lLK*^dHtrJEOOLaW7qZPrbdD#@=QXWf5dZe?OFgyLhlrMsi9S;)e`^r_9rSv&C_Cd)Hhh8dj7(zPRJvl`jezLpX-G zA>o)#wGhORUaXxA8eMG@MfROk<$y3vNz7s>6i!4njD{nrB#D;vrm<4R=Hg*akAomO zj^dj54+^L;IH2l~4$7Da%bY07+$h_eDC=xUL|YRu!FFS;?4ZpFYnbl9Xl!#p@wT~f z*4eO~V400hH0W+KXSilU+uFFa(~CYMK^f`b7Sy1^4hp$G`P z$!lSN#)gjKP7Amcv2}~`A2H{s^mEvMl~6bhJlrn#Fa&kR%du+-p7!Dl6%jLnT>~37 z2*Id5;ynM&f+mGGq@d;U{FW*VLDLtk0g1U+J)aHuEL5Kh55^A}Br z-FMZ=P?=*&WJ8!uZGXGT(pR>gXEnKmHUAJ>fXXaYnX7Z>w@%M`%zjXpfwj``wZclO zli5YFSXNK023!R>NYku!`#zxxFUFR6D=8>>Lm;~^$f-_-1c+5B{nc$}ur)sY9^2uQ z@1Y$MgVNU5ab{pS1wlJNtsom#9vbtrA7~d&&)8Uy^ek3&zmC5Mgf^V;G)$;aTupm(EGoocb7;K`+@o?L$F$(02yS9(|ai>vY%LK)@FAj{X; z8hf51C0l7fslW#p+&!Dy;NVu@=9W6V7CX4&{hVV7TNV2f=eYfN_E)bv10L@&+80(DljmYteVZ zTm&CMzXZJ#h;^RD(7mvZ5rv_|SjX#YSPT7URr5YL7mnNHF^Flbg_X>?di6xJB37>% z2Wie$2stqWM)r-YZrTS0;t?k+fv)df>R+bN;Ssi4?F?`83G|wT9^Spr|2u`3X1_sR zwj$1g*b99*8JZ#Bh0EvJ5POj$(!X8g7o*2{aENBim`1}xWQVwH6*OR!V@!$&oVdiS znr`|DVYX=z49ASIObInj3Udbc9ch?2!Z6OY^fikkLqw*p#tq7dBm1^ihwyP^oNFy1 zkx>lyn6<=Pac(9bh4|%T%1G=(Pq~N;2(3*&4DqY-8-!a~UzNN++wJd?2+Ansyc3OD z)(Z?;m8@5DpJ{D;=7C!K%%hkx7GW-yLm)fVBLI#5ljMrO7KD@Io`AN-;r`5BbQ6Yi>xpSFm@aa>ksZXh+$i zCp;bh|L#fwJ=qYZt64tuY0Z>gxgmw5i>-DV;Sb=p&<9&_SKpPMi3G zW**e=SZy###0engK|vW|bSVt4N)=>)oK7NxP{yVRmy{-!ElZZmPbgQ|zoM8p&KF7J;YvD{Knx^FRj^SNn+WVvsj%nw!pl$7i!PPd* zuJqo_M~*mWDj|y@91~q-S5(y<6r4D$+E$RWdXmZuelh%UCz`o;aRIWS4Sa_UF-#@? z5^0?qjoaB}2|g7RV|7c5VT~uR0STlA)Ljvdi*Wmne7@%JHa;kU(GaEq5uoYp3yG0k z{M@EHfoQr@sZnWO^5^|%a2;-9H15-#NaDaWB1QVxf2GF#Ic=?uJHb^Q7?mk;VHAKh0K-d~A&Nfj|b5sp$v4pQNEpfX~JI%1k; z{A6A1WL?~J?Rd~s-T0}736u13k?QEd>WFr#kxgZTOe}JZ%n!MSv&+D~13DuHJ6sc; zNPLFBT~68}Na!?i7a9la&p3`G15aCA`OA~gH9Jo!kIM*>f*6TBK#aSH$Y5F^G6ZFu zY4V^cmC=aYL8YVy!>wV&HR(_39pyqZ^ixeg;TqX6kbq`zd2GcnOh};&seCje?KNC- zCo&)rlyPwxF`B`t+AaggO*C$Quwvr`oH9c;CH*-GMm*TrXxVGf@}{u_?2;A!V1#i5 zW64v73WtOj7`W&bo==82zqOqvv^31U`4dmHA`9Az>Cb89C6-P;6@AK`3Wq0Ja8XpcA2BsEQ2{U}wHZ+uEX#o$7afLft53td;4&T2w!mAW}Sck7zm zyr5Cvz&Y6HmY(7r?|~oZ$VKx%H)#@ zXdkTV)Tj1)zv|##z0Iw0aLXKCC*JeAo#s{YHs|=7bKH9T_zbuXE%$UeQZjOOux*_n&)LbPTxWJNUMp59u>ON%GRT` zjN2-i-^004)3*@Ae9VV8A}K? znN7iKKrT%GA5p+59=@PhHSh@TLQ_+7!7knin`kM%$NLc!1EXJq#HL-J9eNxwy!P*L_{XcXHjq6l0MqZ z-ujHbx<$RTS$$dJp{kcIy`O$5Setr3unz}mbb2n(_3oLQ-+`nY+I_QBCJtPe_B1QnQrpa%2_Qm)18A6Hn76btuTqS1PPOcvYG!nF;+Pj}r!p3k+_v_@ z=RrR6LBp!QO3`F^*O)4M7>hw1Be0l|s#`)>d}1Px>~+NiA;^azPA?l2VVQ$IGPXJ4 z=9%HPxslenQ64NtEW|e=5tNbaiWv<_m;*(MvCeAiJNn7mLtEDv+Qw(Zvp&P0t2GSt zeC-j>*B;*1X9P&VH0^zZJNl037v?&Z;z~nNX~rs}8u<3M`Sxled+8bZkUokr{S+bn z6k(v30NDypS?Fa->U7m>OQe2JakReu?Nom9>Rp8ivU>bZ-c2?*2p{c*~9P@Ly3 zgnek9yA=emz%kXGMiepISLm7~?<8Vnt zWI%U>G9WgaNn#lB5^O24#CFwPi;)Z1l6}nVIr^`XywlO1!>uxk1&(q4-+TW;<2#n& z60{K^4TaY%MXYZf`;5dJ+2ZGyA9imR9p88q=`1^+DY2A!3804igA1x-f* zK{2h2(reMyXUC;ACqesT{gvb3`O3AKKE~BD!)k>#)2QXghagO_63Q9W;ftq?$#1kI zztJ+-roaDf+WX(7U-%9Z_6wKT?hmOuPbW1^MJS_AMP$H6?=Y~>QKz0%r)`~d5Kc+M zoTci!s&y=G?Kme!PFMNX+y6}ztL%d?@2YhL)8sEU_^MmZ00+F-8 zSx^X_4i$iEtl3zE**^F_b^rTGtuhxqzVH~MMY*a}tfU4qCqq4Rl^G`$xP>%cSA!tq zqy`dcbQjsm^j!5qIC0awcT(Q}##slx9q0yA-~Rz`XH|Am(1KU$K?&)QpY8$^Dl8nE zMS*Ar%7hF#>J&N%8KCuY)ksp{$ZIPK;I0?WKL`yAw+0_!%V@B1AdL;BPF=O>G_?aM zHSys5W+`R0!|Kh&mn|lHL0(qo!qn{FYocJ!pE};9$yBDyvA9%jTYxMTFhRXCAp2@2qs|5 zpiBu@sl-cm+gtk=6iXb65KqQq8@a`|x$O?_We2y~!M&HqITmsy`@9?%y&bn(?*Hfw zW7=MQ>K-FPnX$G-dyKg7)^bxykYP?Uo zYME{oV+6(6^|2!`4rk07p$v8DIK1aeh}CLlbG9>HmSVLokv@X_3SAa;GSK}p-;jKT zZV`4btpC(#lIS>ev(RHxnXIQR^ZQ$tpg%FvGSc)P083!?RAV*jSx98e1ywCO;hBp$+F0fyV44){cz@CE9R?d-fA;oT@ju4ujziKkbi#C8k*ha{(fGT~ix2 zrBjCY(PkR_(F6SFJ5M{!l}U|YI;E^shxRE%n^oefq!nCM{btNgkuWnCeS;|M<( zQ=q>LBqUI#moEJU%{(XvnjLDWQ(**RR=65tdnD)>)C}IgpOD&W7DmC8jgwNMJOAB(NsdGHaA+%8Rm)R6?H|%x5!y!{+EhB*4+n3}a!RiRMz*7uJw7}C?5Rn?hG`hHPnz#^EbXV1AtE{IVI_cqxZuAX= zG`yN1`gYL~O8jF)2*wl2fbNUSkSNXL7(wnt2IPV-Wy!ZUzb#kpAV!>aN%Gsq#GuTb zB=$9BlCT&-Zcqk9?yLfcK?!ume>l0!ct9D@9k~oh+I_fGI+P)~OdPT4!z3|}oD$7r z66CV3?nY!!8_+(EWm{x1G~m~(quBCHI5EenpyB$13uH(JA}07S#*onJ;;WbrLtL@@m1k44 zr^AoCXl%f$M=yg=TZ!N!y)xRQ#s}(cJ?(AA;U8x^Ro!^lsELPip#IDi$Q4wwRMEe_ zc?}okHOK;`p8s~?`ENkU7rtJ2?$W{w-zH!9cEQ#n7~3y>JT=Fdk!wiLHNZB5(m94j zTc;d?JY^~6+&2s6?N4f&y18B&JCQ$~O2{^4ZjC>X{Qji{??cY77O+dRtK+#)0XR5+ z-od11>02I6&oPqVL@0z$tk_tbdj9K$?|qciD%0NBe#nxMYqUGF+3|9wG_0yV?Ie6; zVwW~$=IGP%jQsYb35&&pkl(mC+mQNd<_Wm2s~YFOfn98wbC;6$y`S7PC9P@dQBxY6 za*`SWwx+af1KuFJDBc%TNi2zM{-!w!`MrR71$T;M_&~h3^;aKR>V4qVy)oM=jVOtl0FE#zm}s>`?POJ*J^e zvf;QXJ>QfGw~%8oCr>`x`&Tf!-s^OBHhFPcTXXQV(IJf@dyar3@ zwGrgyeVePqpp4H=PE!)4I+D%2qKM0EGq2=kJG^(5a2p-mE4RGgKE*laaE{kG$CsR= zWN=#c>xT5#bqHnl7}JMa7VR;o?lz<@GTED(5}FuhfEwziKB{#^`F(g$2EO=+umkcq z>zT^t!&OZ0Vz(J^s+MsJe#)pQd}j%8!&eLe3hOS|@;dm9gCkWeM>q>Ew1j2Sr^*cCm9@NB#m2R|a`-e|@HsK^ZVRm9oJ&YstT_*whsNLFi$u@?ua1 ztl7Sp*{=`m*7u8QD4Wp0KdzxH&dol=y9+ibN5S0+}^*%20WnIZQXPeC3rqw$o4&UlI# zO+>()XbX}WI5O5YH_|d=q+!x<-NfFin4YTWj{afK`;Kl^Ys51(hqtOR{Mni#TGt-_ zTrFfYpcj3DU#N|YhWu!FR~m{O%txh>Mh*r!8I4<18p1R$`Hvak7fi8fcvl+t6}Tms z#$$CS3{2yUO%oO=j~FTs>*+rRL*e+3>7fYeEyHauIWGb<1Z!TBN6_wQRm3=T%mh^w zE$|e_FT%|jjczPx5(6}#DcZPr^|(=*=qKd^>1&CvqaVhmBJUX9j|MuF+OE~0{vo0s zlW+`)jxZu4J!WuYAp8NgU)^P5=WUdk^^di0LL^1)JMV1>8T{q4s3)1f4@7tscH?kI zVEV&D!EuXnoJ^0wIAJKoTkV)f`1kuk$a7o)N7z-^F5WL4!Ai13slql_#nd!yW3vy6 zV2D-4bQseCr>dK`z_WnTpiHbhmRu&3fpXwZbL(d2)I+6RxM+X>3sTyJuVFX+{FmuF z3lf7;mo-Ys4$RCBOwSF-1VK7C0Md)MPd{Kk|0U!sRT&p9rVx~Akj74Qo*u9mwmG(p zoih)lpZf~L^5Yfl?+d4Yo%a403lsMzHM2WUC#C1v_;S{5E`mG@2EPn>_C1;bN1%pz zHp;d*KVVUwH4D=Db@_GdP;=tTeG#me*UYB^VlY!g^33sbD8b1rNI6^XuXDESMRnS_Cta)Ae|1EXJ*(Xm$MXjLDy$FY*bHTUl{}( zAogjo(4SBRpwEN^4C58LMP8OO(7niXEBGFsecj+wLL^qUqMS|zo#$A8-7;2MA)EzY zSojJ<33OID{d1Y34utg*kYJryluA3>+msERTQ$=Wooa$r;q1W6?P?yX42W7V>@hYP z^!7?*9PkU}r(09YxXxd{$f~A3lQDW~=LaF?h=h*->!6CIpE>OCJ#v!Z(u~gIo2Jqx z`xsXE8dl2;D~+mn_>_4pV%?zfe3y%L=Fcr-))Gi+hls5drck3CBXK~wi*7vn$e1VL z(${REB@Y00L5aQ}8E0f)O-z6N*uI+B-kRthI`WahMWB~(=lbH@rA1nr;^9B$;r-bz z2nNY;MWz2ht!$9m7vuZt{4iLr%gz+6P$r3)Du~7RMJR(@hC!JCS!f;qr~rAC%|C*; z1}_F>Km=v7$VY~VjC0l!jD*Kmej`@8%y8*~R)V4oiji8?nAYmK8lP@T|1KKeo(kU{ za#>Fn*%!TLRJDb5T~W+mrkl-wa5qhAC+)&#G}DO!P@BV(OF$%UVG}E6@PG-Xg z9D~4+3dU0~9)SdGn`tIBRZU{vG}B+uCZLauWwM6rDnM(cZ`2&SwEXQ;GS-JjYyPT7!HOTKS=%J`{mCzA^^)MHa(cW01vE z-AFiwSj@2MuMVxgZbl{d9!UEe;6lO(N8VRWp zRNAKmYa|CzQMLs5C|a2M#1iC3GuAwNoON!rWp;#hMzC@65dFmd>eycDn2vs-?fphS zTWi>}KEqr44u95%W;_jlfz5cL=}r_jxP#Adn(;&-X#_@tn8t4;h!)`%Ga3RkAo8PO z;u(#2#*=uWlP9AYt>j5fAOF!^cGd_U=X1qli+^UqUP z*g|au!7hA}#7E$(MG|+icT|~BhD8Mya~UaixuZN-jJxm%`Ee$p#)wpNTBq^}h=`TvCuueONvz(xD z%L9-FXKyj(!X2q}i8w$~MXGg)xJH#V4=&1#b#z>(Iy@Lr!+IQn7RJl5(HcG}_Uy{P zF687axlmPK!&-8*@iDApF@p-AK<6_p1uu#PC&CTpS~EcTmW&l2e7^j{k5_#3*@}<8 zSoz^+t3LP?(o1%nNDN9|(Ih?p(ZzWU7v(p|VuHk?Q}wg<&N%>Qt$>`R>Z8vx=D#^V z$iB5v20BwXU2@pznXtR*wc~J=r60LYS^nXtD?a=fx3K%+$C-(*Fg~2(s}in zr$+t78+YVptavx6nSDhQI~<3D`3;v)w(JH_+swTB{B`r|FFo32-MjrZ9Bi2RUW3Ju zIU6g0b-<#aVvjC4)o=-v2_GHlzZoj9`a@`k&#)#ReFBxt+MP4MY3icpsg#FKgksrQ znFS4&KpKu8Z?p27UaZ|p#t@>Cb^F-fi{FjgGBZd%Q6%9!L4m>j5VYJ zd9mG1+jCii@NJu(v~NLBneDKCM;_!^`QaDPVvxw%eG=MaQBZ1b{bj6Hm>(MCRQ*NS zkMXBNHBPi%0}XPZVdl|>cm!G_w*lUWv(Afi_{wB$Ja&HV$6stZc>2U+OOY{I({e0G zo#3^}wx-kj1G`9MNY!t0z9pQmV}$I)302Aw)xx8yw4@02=vHg~Ba zP=>y4<$jM!6%<)@JtCFTzW(1*(l2*6%4}@atwR=F4Xnf;==VH>j~=tZd%P zJU$9#`lZ;}V)u*vJbqzSQF=Ab*#XIPD`-AxP5qnj&E-oV41p71@8zcfPKQ1XN?<-F zkvN^ooXrK~RWThls3)?{AH6lPo*w7^ZNfWcPtB}ANfP`W1i*)G%)L!eBQTG9P2K*>a#^p&a-Wo+D&4D)_q~krm+~ zvDJZcQW&1axWsH2lQJaSGIflZ!urOKHcc97lrDWeNEge9%-DYVvAuMWxcap&YJhTP zruV6(-1#hwt8%87F0;3Ou|Xbe@(!mFb#v=Oz+|hucBlxKC-XiBNJ0)PgyJ4 zh-FYBxXTq9(e*i1RGscKS7HKLjJ z8g!FsqnZ0WBQoS8^Q2}5OxWiqfw$ zq#;3n@Jq7YrLbWe_{X+nv4@)bO>gQqrHPCtyOpQAx<`^Qc!V^=F>IPr?S*Y>C-FGO zXWlcub3sr0&V9;fPD|fe6oHtQz7}wd*foY$@@9*9<4WF=N8{6EM4*JmSfkL!PQN zv{lWaG~KB+lK^PMj0Q1{&v0TiATguq<~KqNXh_6pN}KM4OFIb*JV{(>1WZGK1` zK{F(2x5CSbW=f+oE-oV&M(%Q%P-IpE-q@<3z&<1UyQTq*IYwkC)Go8?Y8p2& z(;2g&#X||`g$Od;VovhcBZ%am{&jnUitybQb1uQYa7-ui$B&ExduKR zxF{Iea1cgcVk7$j%W3rEVOB?|wMkq69)#xt zHK)gcZCLJm3ojl{Z(;LpHhl8o`cL2A@CgVK7uJ7#;nh#yU-A0U#GvFQLFt8!m!4{} zB)`ehQ;nDAV*=A}CcU|yomHw{`{Y8_{JrQY(<+)9vgr(x`j=ed_9hNN!N;$!f6f{{@*myA??%(xxtLH4(rEXirQJg+gUQj;ZcZhqq|s$ov!Wjl9gzxMG5P%&x^Xot-4 zTauck?`^V(ZXC8yCCCgV6g0)SD#tpk*}f+mF0t{`4_-NWD!JG46-_gaHdzeqmJ_su zDh&A{k=Ga_v#jg024^HSg#xiOXR*9?LCZiJI@=bSaemqDuze5TjM!)&pHGk5JU=LX zPty#%T+m{S0>iQuHpWZ9!4o}S*?Kq!9`UOmz5nXj;zc1FvYMv8!&hTD~nSGkglUJl2gwCvZ7DZ5SfJ;s!HTh>rp1|)VEQ+rtx zgG_Up=w>$3&1j&X`lxPNJry5NhM)|x5($*?c**ZUSQ_gmq2K0gh0q(oE(09+DeDs= z8I;M#BkZEgVGup+ppS(w9qV$LgCTrXt@+iAZ|F3MHYHLR0yL0ErBA4a5xekfTh(;X zpq-#sM`Ap91tK9(L`1H(;H7Q@8&!f2f`w2dJ)%seH`G%3V5DcCfAj3Hj)BQsFXhzzc^ z6xCZZwzoE-r#7O$VsfVUsU@`VkoUPP?o2;izQ=B0aZ<=Z!_8iL2r|iod+9PMh#@+> zFfPMpFnQRYBsVkF&4?AC3?!6(z4iWgCQAKkth9Rs_h7= zx`kyc+kj-kSTN|=!qUo7b(GN!)iKO3ri<36CyX8B{$TU>;GJdoKYbC+fUL4X9W)Et zX%nB*&TFoUH_HX@B)VuYo703&Jx{2ov{X-~kqDOQ96Hf%kUE}uzD$HdVA}*;U?x4S zn)E56WR@fKoPu?+YFltN!;h0u_35a8uw+`W$ z7Jf58eQGVIwU&s*jHte0n8-C|P>nT&V?gjGODg&B#Er7d2r%=hN_VqL|NyA8+l$sL?(=P(&3$PBpx@BmRV8eS-53BHJxN(&1(#KqUO*R zwTHB8k3Kd#>Bk-@w(a0O7d-UK>p=#$#?Y;9_eHe>e}XGps~KfU{l;+Lt@kG$8hzfW@-E? z$WN|BwOE$las?y~r@kSaRho)dE!>5kGR?Et!pX}ETj05;TCB)pg4D#&w0xoxE z&*yZ?IXV}1cYbkh#lqc*L1|l>Wfrtt30H^H`IVU2?)nKxAJ#U@%x}5uRLeEFPcDH3 zd<2)Es^&ho{J@*Xc6@$r*O%v^WGEBvXy=!OudID*K~TyY%@?0)xr!CFGM6pt#(V^3ho>=G+ZwZzN8P2q`sU)_DaV8_K` zsQJ#%*j=12Na?dOB`EFalgkR8Sb_OltSH3Q$MF=X;jU(jS<5Vfda~N$NBAjgTWA@$ z?yk?z!c%}US0?X4f>TC2U^9LO_jLvY_qgEMjKrYS>?f8vFNZhCDzGf?$yGW1Ufy%A z5blm|?a#3B7Y$pR+&ul=7EAHDu&T1>wGyA#lgqP5Zr$_c={LW8|IIHh9DXbRWZjHx zjXg(a&(WrlU>9B?FE0lOp-dGASL?P{ty^PjA3dT@dsmICkH4)=UeVxX?=*+keg`_s zymywn8OJ%6v6wQBfvG2Uo6t38x5+-zmNne6XqO>vhuJ>Tl=y^UP9wvt`ueH$byFVI z#uJfoK^cb2Ns`z5o(11}3-#WrDD1J#`S2xzP8GgQtfNC0NXUa8D#$-Te9^miO4V7(U9YW;|ffPM~tA!!fIonBaBq zsb6LFjIzihb!s+iDKHEgO+*Gt5EB^*juGUn z!(Gb_$}nhBzKF<}Rd zG~dl5n^dlQyelD;>7kLm)W#|k74f)aZmj#ms_@M+pnt?KY zfv3TUX+k^rjqKnzs*~?1;xe86MuR%}jqL6>YM>%?v?6kpiUp%#^Pa+JfhT!bxM*po zC;bJ;!i6igfgW}W$Ml(?3O0NF5+|<5`M;L{;f#DZ{7ohG9VX%K?);< zGJ|>YQdX=PCJBNmRjfZMRYHd%PK#6~l)(^scan?92#LEAS(9LPgJqAyX`FHb);X?A z%|_rkVA<0!o6qndL<0aC+tV%$T4|)7qnhk`0UDpXIJxy zR;!9ztvsH&_pOUUW>4k6oV;^>kbTROS#TCR5l=5@y&Si#RvbC>?xBl$hrcR>LJoXg z@D{uDp|4NDiHE<=JM?wo%PHHFf|9p9x#(1@Ri~a^0jI!;n0R(I)L~VdMGJyb_B_25 zcHv;*v&*4;$e9lpYPGhY)w1_?y#)mxh62CNg{!bC6~R?NYiDgs3`*Yf=ge=Cwy;?$UK(q@jK7O#)==hyA7w+f!(SFb&DmY# z!xgu0!|1%LpU7a%wG6HTXXQP+3i8864?VpCZf$GJMRZZj!#5G?$f5VJsEb%zsKdI{ z?Mcm2%4!E_Mz}9*w2KA%-p@{Ing+K9$Mdjm{KG10y#n&X>2DRCglq@C#(H9#U&Ir) z@5fcHmNiduR(22UnQl zxDs#TGLMvSHF0@t?@A@{zHh#(O*x`TCDoku2Y2um_ojn8S;YMr&N;HY92dC~N64%r zd(3IOjp=)g>Fom-yTtudv_xx@} zI2d`lI-2#;NYB|31f7^>Ut8?DiPta$!~Fa3OJ_v44xA1N2k}#Nv|N{7$@(7lFqVA6 z@i?9b+2C9M9?p$oxQ9-sX-#wqS7q)>SWi4lt)0o4nU9S55Y1!4>M`Dp&N%F%_fq}? z5^EgTVj3&M{y(7OHYMNSn1|5YJ^lWcDt6a6d)KOnF=!{$G;Lu(9Df2zmGk!$elBwr zx-6;^JR|lT^Htip^r|3TQbxe1cO)`;RhXL{B1(hA*2{C6m~ivtQD%%I6Kp~vGg9x0 z>`O%EC2dS!Z8WI2Hlm9TiA)!D_+Z(*szmT|y}K?Y@ld)Hhtzf#T| zZ(M7MpS4tVH$_wpuC`%lwO24Ri@#fz*d_RtZm3wAaAZ@2H&;*4`tU8OUFhqj0Mj$ySNN!tp`KM>o?vdK8c9dkhOW}jF$|LIeM+eBG0_2g9HnSj2<;!)C6&JLI zUl+A(AbfdS`(hB^XM8Yl%u~Lzc<&g-VxC|u2E-N)o7}zDB6=IiHHL5ubB$T`QuUSn zYAh!lLvmIRU)P5VWrEE!OBFfJ5Uc?SyRL(l8G=HrGbx*=B&4QP3FM_53E+l2XkZJ4 z57AD3yw=c$H3mOkV@TubLz+|{)THKMQ1co?n$;Q#+ZMHlw5U0l<~luD8^!z4`0#*6 z%xJ`}G{SVJGF@qWM@sx?(3Qr2%uBq`iDr;&6l8!x5d9#X8QESovXkFPIAy3JWTYZw zgnSG?=}EM@(`Y3E8X`3yVRa_~(@30XNFj>w-ty6X<)Iz?M_BxN$o%*@fzU${1fdrl zx2(5o^m_6y`@mQGul& zxeLm{$x0;Aah${iBL0G%I7Odv(HY`0yx@ph)=R}c()c2Xk;|MvNX}E>w~8o?)|nu= z|Cp5`K8Ss3g5OJ8o=GD7NZ#KA$4KO2F`i_1q_$$Y}u|Jb~pUAovuG=U3G*F>|BHz0In zS8HcfGUpJjFlr`19=CJvLr^~62)i^S6xuXj!#ZEXTBUB0K?9aLR4mqj&N4JAke+_e z!uG+&L1IE}1#Mf!bQmmqXi2qh4z-?5iECOxLUOuGG+NWdRWZJWBSReQ;oPpOh_2#c z=!G*N5bLnNpv(Rr7_MSdjytYSIibS!aZY@j&Fj+1?5|H`f17>m+Y=j7w=4*FdY8Ia!uYesf|Yqbi%9$tq~K7V;OhU0wL% znxb}Vpq%2i>$2ZI3|9fc6_0;=;>5SPC*ed$UO*W=(Notz9^_gXObu0nTg%Y3w zP{Ps{>GPYW=C-9;;Yau>)UDl0*k-5ffC`-aItR)*{_QbH<5e!@9{Uz61_x6+FIw0v z_2l!bp>PsZujs{9Si*~Ia<{yR)qu>Ga`qiOkkrh+tYuo!3u`H7aXY*yUg*Vjc@bN3 zzR5m*35$ihrnBHeCoUbIACwL!;$36mn3)PMZiiPv=a*-)pw3tn=2^?Gz8cy#=kPn! z{!mo*H@O>9w<5tQqa9AZa~N(1^260%Ke%sx)8rK`GBHEDmC(p=Q8)$C_`ISwLL*}( zS$=GauXB!Hg7!I)-ghZ9=G)J)3W(Z)HRI_GtZO*ufRP z=k;eOSCUMgGD-cn?lPq9F{ZCEWwsB@YHiCHXSVM&*|(e1dm869)=zJwnOa{rsh%z# z1N~~_2+Dxy3sv5i<=*7%wb+-7%~A3Y^^lT-?&2LNU~5!IYc(@v+LvpYHdiygQOod} zkAAIMJCibCN5s5E?n>B)FlQ6I1ng>9JMi@UF8WXGev#2Y=Y#zZ_IOwb|0$cDisT(p zj`QHZLwFag{aI&AO$}S(P|P1E9)HLJod1-#ehNK=f0^V#XIsm#ixyHuPZ=9}ylT~R zseJT*afS7DvmXqKaGf&Ts0<^ytPZEZIMFD1`-E5koMKgt9&VUIt6z^a;95&UC>g;= zhKNibZFEmHF*l41gMb@81dzsNvHM0ea^{bPQG|OQ-!la16tJ6F( zMQ}6qv=*vK3ZL#UNRj*DAKQ?|agA>$7!EX1#*zPvz+xm4K4PEZy4U0#^O!Og67^NF z0+*?;8q2QeaYyBf0^bBEqxfM|1&9o6iN%K@SOup zct$XIA;9;HF9z{_%6CRf-#I*s@ty9%F@BSq`b}=)AKyeaxpVFGkZPNPt8ExmV-2~+ zFcyQZF$~8n0rjZ4sC%tN-D+m?)no9ne3E#dDig|7P@_#ej*(CsLG-CaAHrGP7j!1f8*KzwEW zxh7xcV2udalgeBiSl)00{ zPzJkT;drSk4a)H1nG1t5C>NBGa2eqsCgif7S|4B(b7AM3$D6 z%ak)D;O%4fPhbt>CXDin6H;(#Rc{N}d3iMro5|j#|1jy4|A>q%7%+yyCEE^L1wyM3yly#7h*UAF6wda z{Ru8ah51ryEY+gRdMYK$p>91djOL}QDsc;-(F&CI} zN+3}o$5c43h5>fb4@Zi>e-Bjj{ZZWhfaz`aO-W5tx3^wW*m+HH=XFJ0UMcLnwy5(O zRHv7VR_vy1r3%W~X5TWuS<2RDm%{1J5GVoLS5`x~O2#fYg=+QATYDiVTn>(7&Q7nM>arHn z#hqV)nw(DBLDeq${`l!1j-L4ruXy$np15N8$^}6wN87F}>iim(iKno_JG~4SN@`}` z+B%C4vg0p1Z}63(_YOb}i+?Kde)oUq0Ju-I>m-3s<~ORfYWQ)}Selz=^QCYB3x@<0a{Bud z#Xn?!@Lm4dpYzWCn1A7iqVu1e%5J^%nA(0!Me8didvUio4k--x2(H1zR>*e15&a{- z?A2twrAq^?X!NSrZU^^n33v7=cQe?#WWHC)mtMC^68dl3ZNj-r3(aZm1G8SRr9Wev zzrtwWY05}3Eo@|*(Lg_$piH1{{67N9C}ZvjW#EepTSht{!OsJQ9tQhT=T8Y8M6P}J zT@CZi3C9HQ8HWyZ)Ct^W|H=RQu+v#+bNE$aa~t7A*7J|UzCwX+AnqsrqlM%h?wa-X zd>Va)kXXUp=~Z#)CTT11vYb?DX0gY_ze^IarxxvNSdA|OIyW7vZrTrT1xp`f z>`O$ZpDsoqGF{c-UDV;7Rbg#45iiLSmU^FC$|00l!ku5rpbSl4`a9KApN_VrU;hd~ z87YeqB(`rsU=lM^PPMj$eysv(gXRAb#sHI{>|cyCaKM#bUA#wQlm%y$YNS4y}~c~C~~(-EGpWLya^ zB)pA6Ax_trX)R>aD8MjWh`Gj~cT5u*>T%gbP{;pc?>)ezIL`e4SrD7pot*P*B1&X| z5IJX97TBC~U~|rS2^#>RgmOR;5R$E&lZ7%t$iDNPec5OG&bE?$HoH6jH}v%O%`5*e5kdz#)-UIiSUJqjL2Wac-*DfZcs%- zXi`QS6+6(^2EAsGx#*NgXTX3>j*)(`_%k-97|I}*@%@U!AIUh`*Kir^U$0PjNjU3Wk zw$c1o6I>cz9kgOWCSxl!SY^%+p|lnQwd{!+;3Y##RA0gK%S?nut+@&N6}Y@Nt{(&; zbv)Puf26v61PxhF8r+1V5bo$p45nu2QA~8aALw||YN&#&u*>o7^}9x@n$Aw05VT#? zUI&9Ak&yUXoz4LAhYNwH!fL1paJ~S~!$jv>26G$kC5Iy}4|IXxs-*`?1uLsogR1)q0Gu#ghO^b@X-!DkPrWd zA3aOSp8x5uUjXADfAc)#CT94L|MSw5hmPauCpdh^eURQqw=F(&%i_aeP;U1^3D51k z59|+j-ha04A;=ao{OSL`{L|k&`%nM#s*vYzUdH@?{lY*0?@K@ZpXa*f_V>>_#AU-w zc0BMw^nD-ixCc&mzV1;h7#{NCJFlGVn%fJf`*`QQm~8t!a4t9_+R^uaa_>n<1Nx`m zyZ~jUYJ3^04$gji=B*ub`(NC2471&N@7bLXd>DQFqv*S^oICF8ntK3hM!Xz|!8B;! z`;)hyp~7QPfBM^(o*Fm~iN~vlpS=A;Po=&5&MQwq%G(wnflNM(!8(Bim~-?4a9wb} zAPp1}(sP-)*ihQrGH!uue0k%YLV7-s@`q#p>3?7Q=l^}}XaD;Kgg^hy+du!!JOA>V z_kQ*-XWlUEe^cN4n&ALEMKZs^39@0qUuL3v!o*?O1VS^ip{0TU^pdInWn=$KmcHw{ z{>|@Ax9rnbWS0{B++8yFKg-$vUUNyoqz zYs)lq%~VTOgsCdhSk6!e-ZKbg;0Y(e&%x*M{WqFRYDo)%F@ifxcYTL;K|&eN1zX!5_~WBfuY}vRe`-+-vh5GcKU#RxI>dWPgiAE z#p2(+$Yroo;4wDaReN|jq&ddwxw5<&<#WiG zLU$M~o(q1490P}AeX29b*(U>wq03&NXv_pzGAtjALe~%0X-72U3FWPYSwc*W_a{!MC$( z%#M(ow}l)f7IPRL;7y?e8$$awhV*gS=y4sVkMk{QTqq+|y0dvq`M{TNEFUy8rp5#` zpj>BbmJ4kt=L&6MR8V3>P(oyIV#MSm2$|79I3+k?`sBnJ!6*haAOP3!jgKo0V;a$qh6g%H0ZpbZpP|fFb=FpO#vJt?cyLupfu1ll;U}A&^bpplHeu*Z zAElC#6tqKe7Gd^_!5m=82(DJ;n(kQWb>0eQHL zKxY`lfUPAQ0|q4%5R6V9O&=$T@61?|e%n}I6Uqn@q0E)gj4z83#dFOtm+_%6qlH}N zvS{W?P=@9ExZ?Ro9N>|TiAQ`o`p~G(|R$C5**zZSHX z!6x3v{?$e0^t4TJCQE3k8%(XTus5J38em6%8Q29aRA`<;0;j&nWWv!m&`7<;@s`Qh z43Tg-%mttk&n;c?KjAUNl!wlUJrf$l1U-t0jx*5V!5)RKk}DQEVBBr^RwOVNJTFoh z?%Qxlpz!D;BkaZSTRbmw7A7+Oj^|~>vqT>m6!m|BFx$Ru+gQWXEj=k?}-2G?4-t*8uJ$UjLzkTKxzk7CUefIP-1NT8!|HRtc@Q}EB z&&NG*Huj-&dmjEM?xAz>5B%%9PyYAsp8hY);dwYUqzC)Ie)}9Bi-#Y%w|nk^$KmkU z2c?3NKzQ5YL&ugJ`FPK9jKm^61o0om!LElsZGHsu`On`y_urpEh}Qz;gc!IY$QEOM zi@Un#^>xiXz_~#V=i@LdyvF$BKW=#JKY#ZOR>EgbfBf3xJ#+hRTXGW?JNEu_m<-SL z@ty}D{D%i0`^9gb`{i$*!Sa9hJYLIho`s{}jITfZ(6cw)_i@`JP@bPOJ@k{t<3DLa z`(n#OA7niMHS^e-TZOZG$^ao``!DZ3g;nv{vsi}TKJ)aU`_N-(oO<}#drx69IOFf0 z{rI($-E;bnEjfC2&wX6f^Sd8_Y@u2{ihuYg4?Kz$3)M?^4Jx0j9S*-U{dTC0m$%*J zlQ|o|`22V4kae{juX6W?*me)^Q(V64o&U*`S~nS1C7TkjLr{!{jW z%!pf8MjTlY-nZCs;Cg4*7F)*&Yu{atzIm30sph&!V=2!mf6~j4Ux4u5)|z{-alT3eBtN>w`MS=y-=QzN zs(ij1f_EU+2_tN(9CVW*^zZL_4sPo;u6OjtCftR7i{pN$;7dpM2$LDiU7^-HRMtCH zmRoK5Dl>e?HPB$l^E4Rpq)+!Wd`5}BNUN14dP2i?hIL$*$4?}Kk5 z0iuz^1>F6GhFa(mXcPjJ;Q>t`n<|E;dch@=rW-2g{$`jpnKo_q8uPxLrv6RleG%}$ zs55Dn5Tr8{j+_YchY+F6Wr&Qf;yQzugN#%JVvxmPs4bZa4Fh=UbjToB3@@%m;kp9s zTS1TMN_{KtuQ7|U>yR*Bo~lgMl&&>&E;Y6!p2 z3HBoT)MVMUID?E$n~C>GPb@=|vp~_DAMjY)HE+~k^HPof3!VZ9WurR35|m*-0P0{u zSIBdx#2-`!4O42Iqig^%i=nljn8j2wj+w4Tt(5oh`br)agMKmW8nY>MU}H$%hEUYn z&;uapS@@~=3rUvhXu6D~Xy!6XcQ*UPi1Ohte~x@G4Jg~u0;lF7RJ@sNtzV+dbq2*p z1SN=yB0v)vm@p+60nM}^^rOMyPRwY6a7r2}rWwPJCRAA3$uo1XFx-g&jn8l=9`Pg{ z?zBaozD1ELtiVmfomfa`#Nkf3s1wc{9IMV0F^$M**oj7DG$5ukC~Z!LCI_dap|MU` zy1aBvKCilso;#|nRq7OnVh8+6)pGnL8{p@vK(7{&vxuVi+Su{@8vyB)BR~gi%+2!( zFwoS(XnPWiIb2cv4!t^wc;)Kk3uOceP=@!iBv1y4jAvRIjS4r_N<=f9216CO&yZnK zBA^*h{CN{t%*Y2%`cWK_NMU>=B{Hm0I7TX8A_MY38RRloSSQ<~t8!Cr^b>Om${svnX85VLy=7@3=R@00JNl``3swv=39jh-$=rLxl}fEiMQ*p zpATg-8Cxeh-|}<3Kgs#L#YkL+I{bKDh60nZYLepxXt+;sybb*U&dsUcYY`a7WqTTg zJn*ELAvX6dG&3d6gW$yfcnMF?fTqh3if<&kQba;D1OQ?R8OKny&6f zUxgTyFp4^j6A%T9|Lxx@$>=46C}Vt+j+nj)FG7_j&*6V*wFF7=ZgN_y?j=% z7Y>K6GW4roHTHh-#ScFF^2skgfAaG$p7{K;Q=fnFcyMx#;JBU+d6<5+|@O=_tb_v;gEC551oe`QjUXh zHsyiy$q)SEgHv$Q-+h7S`t0-5pMAy$J^}j87pFh_;;9!7-_t#(|K$2(aL8!gzVyhk zB}Xym)Q6!k=Tja%mv|hFq=$ae|L7N=KLI)a?z1N_XUOx5r{FAjqA#BMEu96f6fSMw zoB_VBvq=w}O@XUJf$@`$$G(I^K1Y4}#-lxRdXFu;3F0B~*%Z)2XX%PABtQDE4?Xtz zmr!+Zy3N7~X)L zZ8GRh>y%xV*$I#tTyJYHe{{T=PWT~ zfD*Q_mXnzHnUuWC-^~cm|jb2+syKVrS8;F|+jL zzBtC?9Wxrr2(B^u5-F6Ksv{_asDfdHM-W3|P48{>piquUZspv`* z%Bwr2Y*M6dqxoevDbm4UK*LkgfSA$n!rLsVAI*5fofy+(YLU@^k*dw-g||1WF$B$4 z#lqW)pK0{|B5xOv_@MJ!jF}4v(|Bx@CmH-;_%{RT(S~<~3T-4lY8uGExbj zNhyetN_3?`eIqU-filu~1T>dtG*SvPS{|1fQBoY^Bj2}=C~TmNYA}JWgl4b>CbYvw zwc%JE>_T1-ga9Ct>{4hQLZ2Dhg4ARb+Rc9}Nz059+UQs+==p$cGBx44Q4aQ(5&kU2 zP=kw5;5a7x^E5Zgn`Uz}_c!2h^pU}Ku+ZWkEkp_A(}6xU~pN}BBBz>DVI!7m>A(;pri z{5|Q*M=yQ#FobX1bVtwJz7w18JfHE{*_=ntWj%5}`_Xe*51-Ejqm}t%{_2((=j;eLe8V-Gx0#k9%DzLq41>o&pkNVzQs^duZ^>$1i<(V(|AT z_!MHPpuj_4ogDh|VK{~0DUg;=JbwN51*aI3Zw!&_VYLHhiq?OdX)3| zBm)Zh5M&MohGPHXQQ_u7NcZ<~C?}Tf%SZ3ex)~09HTHhU*;6FAQ*b!igI_%{_|=nt z{QZ+dU;S|S%V&qadgjs}UKsr9^`F(=`@H!OJVMV~4lszpg|Q)=Fytp26adXcx6JR7 z?3$rq|4SA2=iy0vZ0gOy7moW~+Aeb+mbw4;+8_PrDSO{Z$H3jr-gS|;tc*CaH01(||u}D}3EEN=$UW5M5S7kUqJxxVV zOHkn(-ucSq-%H;qxisZ)Mev-!jlfTgw$N&<_P60ebrT(Dpt^YcCSEVir^64@7{VI| z8A|`RD1zKr6}hh0H4yo3?KTw%NtNZJCSsbs*wRtgv7YyKpCI*roKkZ%3w`GpVmWU9wH)h&+g!3J3?+HBGV7u zT~7QBy0}(d275D^H8^x-p|J%zBL+`LfDPy)Sd=?w5jvTnFPjRF4Nmc!31u_uvY}cw zn)a_Xcds^dFE@5M^+gs<4o*O;V^5h3=-$Ia0wKgRiaF)<7$DSZn2@|dR_B;Q~i8x z)f`=eQ?nP(OY%uPuC(xz2cy8IDS+1<8rs}Ns^;Q=Q=OB3)H&g;<_Ry+;^@2-*C|it z1t7RUreIw7F$H~6s)6m$F~ME~&Qk+-O7Pzy<&OBss4K5k)sU)Ys;g#bDyFN;r)tWl zsBwMnDeAq;6dmlewK-&9>*T{Cj#(SpOE?CJ%u0FB3VF|RdFRNpCrp|nY<}w+7s@0# zP(G2MR7aD~=2c2cXD%agY}A-y{vx&E5Fygul;LWDFx$bHrZwK$uu@kX6`W!XN^k}x zIs+11!AY*bL|0%uD9qzWBV{z8X*6drXnN2HrXfEXWHhrU3yel|rD1OxWHcd(H-sjE zmV^p^G|T0wAa(=vS?}?t*(gUY1KO<2*s4qeZBq$OG~y!MJ85+%k1NfH zH;t6kFryJ2YSJ~iY3iJ0buQ$_OL0T~TU43LRY^Aac6eI}4?T@qQY$uqZBlG@Dz`-_ zw}&ftL@0JdDWhkqcFor8nX5w0SMFJ=NdP86*}h(@Oj)N&U8PN3tx4Uc$&A)!tyia+ za4Bo_m(j~TECyZ{O5drNM&2OO7>W30>LVH^I>xTc9w=olLL}s)SB`LWsYa#*_JuOI z*Pz-yTNhXFtj(~Mt}YEf)cVkG1NMzVk0lWwLF|Z;;9X-dYsA^ zcVSbN5(wTO&~|?vS%YULOTNaDJiP_k(uJePhso45!SSY_>%D6n&)JOSaCXQ9*#z|y z=ybk^e`9eAn`~}pOLoz{K>J(odtmpeB*6ZHpW}U~NgC}X^v$dWnyr(HK@~#2^y3!* z(nHnZ-?oqjDo00CheGE8a`4zOB#wHYOfNm2Wn+^vpYWV(Z-(3QnFY z!~?k*wQlx&VCFJfx`nQ|3mF@%oZ~F5fr0p=$$h6nKCRAobDYE zR1Upc<$fE^TPnnysip#8k=|@*>7LVjVjEU0)(o9p41aNZAJhh)9g6WrLmO1%c=hmy z)1AV_zEl2h_ccJu+g2QfU1uo)UR@#7HeBOl|9$KbR0ZZtwGBs6SnPhM_Q5^f-E$AT zo_t&=1Kn%EE_}@WqbB#6w&63a?sq%f@9uZMdtmszL+P7w{ zL%$f7Om@iwXa;eS?1^q!fLmr6N?iWVbC&*|9s4I<+A15qMdto;^L2sa^q+~50n!pw0RtRk1L&}?X);CNdW@!ll+H+z2yg`syc z82Perc$vQ|!}XgG%1m^;i&YW!o-E>Rgf-t6xz5PKa0x1001-EFS~ow}8)ic*zjf&z zVdbzF%y^;~EE+g{jIIFr4t&S;Ik1WI$msLnM$llTobiS!fjsUHzHJYXQHNt&xQXJ@ zr6*e|&_~8nkzy-Lw3H;6$wvl>OwlfL@lInA6B!<|gg!EcoR#|Q6^5MUy4=OO%*EQ& ztjV|EX4T{@ zG&DjRUat}w{KC`QQN~q;PeqQ-iIbFm<6zT{2r$ zS03>6e!sW7uX(p+!Yd8eywWh~i4 zC}$AT87ZI{&1j;6;-?11OE69R%%J#dgA=5TW=?SY{K*LnXxNp8>CB?gq#Hw$mP|%W zvs9kMq-JGk8e^I@p((570;3U!J29id6}XAf2qT^(t~4>qv|Xxn5Yrh@oDvnU&OkpJ zWp*M684Us&FxVewy)u0Rp_xspjAhEiCCbFL$~1^!CmPmPbru=vTh$rc)fqc9nFxl| znP`xrwOKngf@0KJyENGluGggCbixW;;|YFC_;X@h!apIl#Z769kHjUJXbvY9M8eBO z+!Q4}&}WxOTYTd6$}MAZnem{EUb*dBZCru1wA#!5?VRl@_h}l5XzA7yGRn-Qlcav#z$jw83&F7!pQ=#kB$GK6^7}Ae>J%wjvxko zNuXU=K=FS=VF|r$A%^`*pwVeEHecg>1G$Xr1*@){E(-T@Yn9x>pY;oSm;7Zap^pIx zgo_oj^%eC)aPk_Hp;qR66PnA=qhL=Q__9K_TyOjzFOe+Y9KM;T*CE-&P928cw?N=Z ze}=H|f(=)yEB1H1K=t#w!PG3t9BCas28MjDQY;>%H{^N}_)09lSiKNKPoS75#9*ay zhT{p&2;Da5AwO$A_>ASy(4l;Hf028jVE9m>dtmR-Krz^FrZslX?>o8ujtga{J}E!> zY3UOeOHO@Kdg5I92{3-u+7D?U@t7JuwD+y_CUo(LK88mXpS)Q11RRTY*<%+8XpQCon8QK|aS;-qbzsAVh*7H;CcAocQy7 zwR9mRkS*swGyvzKvK=a zZsJp1D1%E7P6zr`YcCbPUWl^|B)e6-tr z^FH^@eV6%V-LN3+TM54*1tFW=*F;{SA`v3<~q30)qTCKW45Ddwz=_IQ)85+Cc<11 zX{-!07E7TFJjQ<&C?o!kMs~rQkf4mXYdpaZ9DmLhV~N%@ps?O4x7?vI58yjT{2?1@ zD5BRe3e&(o;fi?w#=NLD~EJC!E7MrpXT@93hYlJ>6k6MZkx?6NfAR@DGg}moRMLVbTKJcmpx03D` z4mvaG(r?f=8s#JZ;PMCnhBDU@l!?^sjl}1Nd(=23%6e1x8e`8IeaBK`+l|KN#fFx- zhFXVbG>s?3SyAlT!a4eiS^Dy;Au`Nj7{mypmT(@Kl4+u+jHcKrg)gJH#+dq6piH>B zI9yvcw$$ZtmIzJRG)>i9ef?~0?M!WTn64yDQz{iDE&)l)CKa3_LQ@h+;q}V4zKQSe z^LwXj;@hngUvHZ9YQv=Gt0z5MKIxf~fTwZ;Pk_Xu!ZlbM3}vJj;v>B(1|B^6AtTF! zTLZ6FIFO*sUgA3iJdez^q#3GeQss1YEq*fl(;h)shj`k>+eob2V~gx}%i=4Tl1hVR_h%7@6c~j4@U&Qs++#NwWpS zn}gzQ!HIVN1V=!kBPhucn7|TUX+%aNVwx$z2~&gOrw1XO5oZqenvy0sd3F$vcoK#? zd8VXcR~nu<7%|PLMYutdnS)1Gck;qCJae#z(Rf^G(smM~p%G8sn1=jlV%3>jm1*k~ zsP)QB5;B^NB=)0WLkeiNDFsZ!v(ku)R%PSrPQ++-s&iPIb(vv`?Rq)>W~5vOUXH?V zNrf*6NWf`EM9F;Ry~~49zOe-OqEQP_hUkxgW7sgrh53Nd3x)uVRUMsRDd==G9B?#s zI2-o4nz~(0U13dVgf$*;HPt$6)|)cyYMk(lK2d1!uqOUu;eaMKID~JTO8Ealqark; zibhGkh{E6|HHJ)W*yEI)PAO8@99I%FL;S@@z943_2+er07*SFpBattfu@Z{`146dp zlZiI9b!duv<}w*39m=f7N$*9$ha5uwH-le-_#X5~Y-v%0j8$OQqPTs=;&z@-KjGW% zGyIi=txsyoJJ83c7(yIjA8J6ym(Uju*Haga5LIp@FMSNgK)% zVT&Ky&73mqy-D_GYzdp9N%<4VS%eZoR*zpSIra0pyP*cKP7W3RTU`~TynWS8Or{_)rANl}Y1zqNxAk#` z;|c14>b8hZP1Sp-yKioBA8mKv+=II1&{zBVpEeIXZQ1`rOCNd1&<3eb}ruh5(A`>pXF7y)JpH-g<-Y2_(>2_bLjA)}8BedvV-fJb7JfaGaB zcx%jFlh7c+jw{Xri~l4gm`l?wWjK$Fgvg+ejHz&^sbIUY5VXaRzsZopM26jDmg}<@ z>oOMWG8gF5=W8+<>81=FQHDZ$OW<`I=XoCceDOd}ODEmc*vcr=$#5D{4ovfuT{y zENLWxk6`b1;~|4;JGMWSd$7%^#((v=g^A*ZsA@addPNLPm58lb*rWw6cEVn0wF-?` z9LtZ*T`;iuNA4Kj@R||Bzpbnl@wj)*Lbm}n_rLG89!`^a8GeuK5U0Xd( zQ$>-!DOr)Ku_f*TW0`#4{t0K=C%)Bo&1(&lUgnk2%L1O-8z4;loEh{mB#Y3LdBSoi zBotM0A?vXZh|_4Shr0>SFg$EVN@LUH6U`}gYD$pHFcs1kfz3o_rn&|+T~&?p5E&_y zf%MlaTQ-LDZwMX1G3X!@x*x|Yg?6)p%#HF6cvcrG+KAKT!xKV-q)_-S@}A^)%vX(6 zd@n99FDR4X7*V{v9+Y6KmnOK3eAtaBp9CV5Nwzhm*qc2e#tSUQUN3T)Bu8_yvn4gW zBO|IiXL@h$jJ~{?hrqx{N|VN+6PUNEr>U!0nlm2K{Jw1#YP;jWBaCO&curquHSlTxoEulf;!~w;IAMI0W)p zr$}3)z!39Prh_2`Gy%Nssma={LV*FB(W>kn8cZ-< z1ut_oCt5phU z#;)GE#hBS_ukCc!_c$Bc9d%ujEG}=D2$I7%6R0p zc=k9@2IK{01O($@F>EuGvFYKB!$Uw3&459|54rfl0(&gsYfg$|MspcSy|+{;MuHs)!ShsW-Em_RT%W=z)+29!mype%aSJlGt-n!M=4bk1C11pBANzUzopc}-6|1r3 zGWGD~K-2K8aCL>lx0k$`)36UxM&Ea#{E?BA1ZA+OodZ-DC@qIr$xt2$AK20{E|e)h zIee^o_*lLBjt2LgE$%xy+;{f4@7(Xcv(J6k;is+rKeX=uq3w`JWTa4L!UO@z;Mk?$ zL0QPK-zvA?&;L#Kd9lpBWWw+dWbUDkJ&&KX^*`hs*b;T?x`?AI!uxKt?_2EXCMeS^ zfie|7PzGK*3}rw*&-R}w{PA86%Ak#Ju**Uj=*GjFGfZFL(iTm&KO%F!Kf(3hBD-`O}0JEuZu7pdQ;LFzmAZSBawk(_`6=P8mcI_uU!@NZs!cecTu6%e1Jd<4Pt`# zc^JO2jix?N4SbI^`hnpXs00rp$7|G>`{kCqROUN0#(t*(KkmGgl0%Z~VH|_IxLFIC=v3RFu?JO+ zr{MqFJk2>=nV1HMK{;24_9S^`_T4&J7`3!q-gzVRa+OVUly!7q&SlCkO1yF04g`bm zFB=GDr2PeiGAN^R%T!%iqz>I87_~rO+KF>Q7p^8Evs8~$+b%RTF3{D_(bu521&<`s zQHZmmc%aPHImj@S@!%M8jTsxtj21GHQIUcoG-Xlhs;h@GD1tI#1)8*3QR<4T(G*q1 zRH7I@@mHe=O+}=toQ);&eK?8CHLv0%GS@s`>Hlo$q#qOoJdy8zDktFajKGIdf*yoq zQEJ37bb%H8qu}yOJCD#!gDwp0;-4@gGfg4-?5G7|1&5Q+wP&`f?pkI2OyV*OWst~d z;Bq((iuu<9Rm(bgA81Wz?<#pOI><1QQS>a6Ba~qxLr|s#2_2o6i458#-UQ*OHxNCR zV__P4Ts=?kXo+`9#_;7TmEahGEZRr$s;kW7j#R5mh{!Yng-a3456-?8{(zk6pe78XS zkpqcnh9k`i{`g7%ra(F)d?3ewGNa{-W27>v_jt>LV=k{Tpv-6?reTdnGalh6Co8cS zyJjS`;&(UQrpo{uKIdRK)J$!Jf2iowKJwp)v?1jsvEe0Yhk@`7NG>y?s0A-HvZ;k9 zNN7xtBWcR-f(RdoPzgZ;N1BZd*Epaj@V>v}S)0Cs{!uL9OXjWxG;JM*0tm6oguAGd zGfI>USq~f@rlXF5t{4ny8NLs~`XLE1a9z+1qkFp7sxO6Ff?mx8=WAwD3)NCFH1XkL z;Sjo5p8Vx+BB*eLGEdlgpS1N2-&^Fqr@(#B-r>6o-S-ONzjPv$IkxiVPmp(@M+tZJ z!2tbof1mpvIBHzIk>Aig_rT*ZcQL=9-ab2<;82|}Zfc-pd!>g+^=5A4WjsXwx3A^! z;{5}Q2f*gcFCvRUrf{M3Gy#QE|4@DWx4qq*8(tBfYwz&A7=oZ|J@fWssmgiG4(88= z{O86y+;{IC!UOmIM`vXhdCKtF1ytd|7QfziP%QA6qVtk{7lrp0yYDLgRc{4c+R^1l zspOE)6NtUapSW0ZnhJ2@^P>%1PPi{`<=4Yq7_T0_I?@0|r4vDgH+9e5$K%D&Q-)It zb$;TP`v%zG4g2}KWr1$LAh+LSx8JHk*?<1j@2hm#@G?L5D}HWwd+ehp z?EU@DLmQ%QT^Dv}d078a*FIc&$<{X4+C0lr?*nCA29Ph5`BvYb_`BfWFM{I{D1&>& z(6dWC%2!-AFd!@B8m{+L);n<$F+-8cdW?Ye`(e5gmo6VudcPa5M(BNmOIE+j^RGjN zP}#nAJ>ZoJdGaRywE(u>yl;}@CF17qPISCxFzxeD8?VE^ccMExauvJ@qQ?nuy3J6A z;LLG`+&tfw+20Gap%*9gOX>R#9p)mtE=Sr1z*d1zYr#vIBw=z;A3>W0i3~MY_E<`i zZ52t@QV&b8o*)Im|hed2$I}5p+hSbxA)kF{_yqsI%wWwgP&(V!2gB? zC^JP{8m`;x8Q~&$zBn~|R~kA5BBO6!U}%`9tDB{(W`_&xv1^N{-!AAfJ~C1qBOx*Z zg<*S&R=_clIt)dGF-qv1GQNDFjL0lT3wOykNoy4zm?@g-sp@eB`9lJfstN=#9F8d= z_dG`_p2p&|yM+S7gvV|ZWdg6!=(irl_G@~Uxz}^xba(?p1fHJWTFZt~K zx?;Z@DRyBcjQHR*B{-UrTrDZ#Z5dO#GN&KRn$at;nCbn9U}g-Uu051B6X^^Xu$eof zFV)qaVsC~VQV8ydphpzL7ZJe-G0ui0XMLixG1*DGAQBFDN*rn^GTqsnVrxjVw-Br; zTc#hx8nnY!0iZUxnB`)xkm7>8lo>FOPrwmO_x;h&d;nw0}PjQ-@O{%o5>MRC2Hz?u_ zv;Y&lJ6Q13f=v*;C`aBJS1CA(*@~COj2uf$WI+1REo^WkysW`s#~HBaYGRAbC0+Kq z7DsKjqqfyv)n>2laMU4%v18Z)a@3)ljJ>|w(ID^|X9K7^tg+M8(Cxy(O{MmV4aO|1 zI@+Y%j(;X7;lqZr&*%uv;MY!crQxrj2xUm(XA&eqFyo0SjA(di6q*q=3deYB6o?sH z-bBVrHZ>W#R1h?DkklZfNwsTIA++i;7|lRD!WwE4LDPXg?Ihh4fP_p&j2w+3|Tzmn9c+cmw{c75-u%Vhg}Xh5E>J3pi4)~ zGmpxdMVTY(LH~IzhHxNx^82RzKFUUod#E3o>wTyzgQ*E>191%XdGImd*<}89&jX(t zy3?l|2T$Ak1|KSPA1`u01S%LlUI?N4c>cfaEA5%vcWm`h=$SK=;f^{OpkMX&QL>`3 z^-$3pg$QLN!4| zePABJCj$E)Yw!E7o`GNW_CkUGxw-Q{_qBd;ThssDTi!jdPlPgj2<49hfBvcdzOQa= z`11C~uWoJnd0X43x|*AyC2STKeQK;4Ikg@ zemHmV;oMtS9_XCYcWy7b$?(7>hDx4dpM;$MbWg?5!^LkFHC_hF{BwKTzw9gjc~9BD z9jN|cax0{KJmwy*4afu}LK(VW#ZI>;0fD-Cmp>{+7AofF}_e{7~Nz7-LfFJEM!;~;+Cy*%l_-1Cj355=3XOn ze=Kvm@11eeDSKae#L@MUx2%dBSmrvo*wwSdhD$Fol$ma-nP#qP6dx!yIHyWm)S%b7Z1(=QyyZ~8fZ zgtilN`+5p{PZs`Oko|cJREQxDUd}Ef{>?tB7*`OK2SNl5JP8^^(hDClgjcl9NI65K zJ{O()5GZ>c{{M{N@@+=Ax?;KIINlWJJChtg1j!ul$imJ9Tkl6G17CbSPQpqv{=(-T zY@`F@OZeAkYekSnQvcJ%0jG-sPC{QaKj5)w^Wk0WDTDGN5mzZ}IDtW~D3Am6w297)o0V0Q zwb?wNSH+lB=%#IghNYyDInww<9J39ZoeIP;ID$!q-rq(w56Q=&{q&FHR!R_!?O08! zcos7*GL18RKw-$nLc->T&_0?-^$_{U?88w@%2tucOjnoVA9Cy|;Bg}0-su=(Hw2Hk zbtiZ$(8@swWyrSzTmDM?{}s9q2E``woRWEmH(#%Bm`}5)T&Jy} z?mBk(ApsgV*$T#tiDRThhKDSTA~GVB5r_Rg;!|Lmm&o_=LQ53^PZtxB$qhszlNN+NGV#Ip?Fqgcl0jm=a0t1aP;$7N z5bEXY@j~RA@OLV}z6`iEl6pfZGew1lxH(f*%QyzafN6?KsBMNaB=k#~uV`HvdT@2f zL2{5exJ8B9WP|Y!;s!L7w@5a3UMeT*aciNDaw{&alMC8{cUj zTeinu=c70qitW*8MvU>1nBa;^u#phfG^K`jq(=2*OgoS@qc?L}U)J>g%o!+zFU(>{ z0-c%Jmvb%d686sQON;1Cav+zHqM0NIy55XtG(MXwk=lTyks_UeP>ca%r=@zOu4tYr zH)3*%)jy7%Xqd}D=m->DX(Yp)0uj^joWY_ijR(*mqY*KUWai*Rak!JR%vW`iPaiy~DR?xe_Aqez7Vd08mXDq0W<=?ssSQl##rX=oCJrJb^I z=3sReY)V()PS%3J$WGJXN>32ENtL!mmAOHMYe+3uCE=1xL}BpP<(W-J-27VN_X~R(n;4qo&JV(`l=2 zw^z5>YuoL$oi=1N-421#Af_Q?1A@r?G_tA7*|^`?w9nCaz}1{$Dp;&f5kF?|A%xEu z|J8usGtn>9!)V5nH-)*pq)=wpC>A5im%@xG9|Yqgb(+N&D-(S&%ppQ&|hn+9`cFFgPT3E+PZqjQ6}V3nxKHN0A1@q+&69=y-d7HN^;^kF1bXRWN1Z$TzZ&R= zG>~#Uy;Z!fBd7|j0+~)3i2cL<*m&(jYh<$dj zBye7chckX!`owGL$Dyd>)q@ZNMJ>S?f=XP;7*B@eenItOJ)@+?@#wDcpbQ*4{6x+0 zsXF%)jl-u~hEKPH4a@%L zjNk8f$lUAw+&}emyHD8R@ZR`{TQ)@9vNob`nG4s$UWDsmx6H9Il&P9(s$?h=VJMM6 z8TM}Y3qcv=%Sc{aXM`AW7m0U?o1;ab1b^w!pTRYZobReF$8eXSNNKrU25*Ki0x_5m zgzs~PS1&&&GI6J&Qgl>=*C}CzkuqGBJXMERhd8DfUJD4y+4B)!(fAdhYoUp#q{se0 zBy?}YiDQI2tF+#Nf2-(nl;)dpG_La<3*i|4?vp*5$apmvtQs6&<11=-jFwH8vCE7^ zhM`QnX=K!rNMtq}bD7Aj(r2#FWl2UYrOnf&&eEmM&?HaOB}ZzK*N1lH1wNJ&_;6O> z!J` z(iSj?#q2aGa7@!2O}aK-8v${M=QzCXmedX!33fM)$U!>yRFN7kL zfi45K_SsX0x(}km3-p{Ju|lH>$G(^wXKE+5Mdap5_~bD)B=u? zLKzXqNTCcN7+)yEAVvyhh+K>(Dd3O_cfpPJT%&Mx;|cbHd>#hx481f>Svy@-H(EZ) zL=p8EL%0_YL}QtJU+tt9D*T@<^Zz0F$ea?1Oac*^n8|l=R+J}RAeR%$ua~cp`r8_iKh4p^T?KQ6j3xV}rVTKE@e)y(tm)_=gMbD%4^!9&%82StbhIScM#exT zczkfAj7Ahkikq;PV`x<=6vPNv$Jqo15*bm%Za5MS*=4O+rQbVSnQaM-H%+FoP63Iw z037k;3_?J|hAS{JA^`npMDeu29*vB6VobxsovsUt2az95ymWOZj~`7UufXjy+)4DK zK}HjT3p}k+pdZafc^YGyO^S3#Af^}T3=fh5ZIq`(t8q%2-O6;Hk0w@~$ukEhsIwT* zpf?STX-ZWgnju(&%WrR1X3z{ZskrvGVk^HEY3$MltqK?3=2ywrlJrF*l}|FMgf!k< zhFJ`+NrzDq#8bW+styBzlKqZXG-8J zLK%<|eN8>`1u>Tq(wR|2W=#1KnK5P7#QUHb&}ceirbU`;>J+;gjb*mtyzthRsry0g zQx9}bJ=iv7e?esXGE0eFgS-Y>LQ*KhuU-1si#TRXi7hblnt>*o2h)&7p&63cmZgrw z*b-ZZ-x(o3z@{p;&T&#$5;^3POAF62>F0bG$1xeoXjBe1@gV^T|7(R9&!(?@}}cI;f8{fj=sn3 z{f|3(|GTf&{e!~cAMT~F(EW4~g#UV^qI>QE_LSjXy4X>NKL4+d^t*qU59!C#TNS<& z{dx|^Re`>EumMj5DLt78n`q>N;PCEw#e+?d@?VZt?wh+Gr?%xuVK5Z<3!f1T zgek~75PV<^?fu1(gWYp_Jy1sA7kn%ob^4PE^kIRcsMt8CFCC6p2Tuf<5Zw9okzOda zSn|=LYr$Ie*!e?0D02U>=(7ilX#~?DDgad}=`rSsqt*S#6CO~j7N-oyI@UZ+?al;PJERUi}q-|&!+ODFJRcp+0f zzOwiw#-D@#2P8f`BQfOMYBW^JTtAv%f5&9#gbz1dugTad3;U5@*gN>qr@vvGTKMQg z2Y#d_AZ;Nqtr(#&qP!`LN2&b((0oH~8o9~%%p>FDBeTwsjYLMDu}tS#Yl(==Y;6h> z8BNj@O=7qvX;o-jM&R+3;Cqt;?@JE8H!<+;7}Jp$(_sP@*u#_(maCLimub|da}FjQ zx)01X)NVD4-Z#F2^d@Z%EvJxf)Taxxy?CFOYsR2LpKctlglJ~Vwc5OB^WoLj9&VCB z0>M3p7X~JQ9jPjf3Av>r;Hip9PZ>3t;_NWw*O0YR-nA~Ye{JZ#<%*uAp&g5q(8aBv zrNkwQr>IN9)P;7q-J|-Yg46{#?XIK~E4m@DZvxN%!hPTchB|2TbN@mLWgy1Wc^10U zAfE4bp}vKPOw&AV!z^9>Oik?!bq!OP2#FU48`tV8L>%KoWV~^V50N1#qc0SpOa$3X zBE02=LPl$bx*i12Joj;={xX*l-wP7n7sz3zYHV@-q9IC}Mk=3VqVQUj4OnJn!?Mr= z<&&N%_WwbV|7jYv^mtm3Flvd3%=VDm=@7m^sQ+4iGI_`n|Ci4ff{&Bn9ftlskP_+; zLi8abIz#Y905Q`vxR>oI>Kc^9=ZNDO)67@2E|(u%uGqg!-o04fvslqZ4l*cmkZBW% z%xq-?JO&3R7!lPKqEwElmu@Ysie=dJ8MR-AdlA!D|^OacA0@th@k;Z*)#jnr|wU5w8YyR6FfdRkU4td z&?dtdaR^nM6KydbL`0@B(ca{d5HE@m41{d3=nx??(b>GgP(D|g6E->791sVx(c0TA zyJuY|52F#L4VKOvEKW%Sn(A4ETlAx0OhaRx;$}~d2Z_U-K%Nm#<6|0mGH4C0zzy1f zgP2kw4W|^v=~sp%ZC0j5E7Nu;QbFPh+^pToba7oLR)Q)cQHhKO6s^qIpiWz-!pVcz zD3Zez+ch|$%m$n~Te-og*q{qV+oO?p$7O_gWi0t58!aKF2hD&@cnD|wHOjXx)Fj60 z^Ri6E&F1nZOL?=kqS0CbVT+}r#aaz&v(+@(tD9_s-Ad}P*0kGe+enOQSY7rJCmI~+ zgp&j}?sEvU&wxrCmCN+WPV@z(KN)CDlT=a)<0Hl~UXh~r>E%W_2`)1rlX|yAK12q@ z*hOlOA%rqgjRR=R>SU`b*{Msv(Oy~*(b+cTU~AOAmZ?1uwog6KKBWikX$Lx{9H@-w z+G(o_(`VRpX+|v$WwL9831}Q1PZ^;hMdHSR*yQJ^cZi<`x|l@C;;54$D9M8M_qlt zK2q*}Ie+-2Jok%v!!H)OUn~Io-)^slzWVK}4k3V$__;tw9Xjp5x}_JAji=!k3*M;m z8ond~1?=#bp7`R?dPsvQUxG6Vhe%`Itht=0%vX;zx?kE0$zUL0V%D9YQFi z6e~e2_L%bQ#VZmG2tm)6H22Kydm;G&ygJCR{E<&fsh(*@7|8!(1)Sp4Yw5=?Gtuuw zoY+{1hs|^4C(c)3*>IQVdMURPzr3X%YRvso@z9GNsU`=x64 z%XPyqH@IJJb-&!^8Vph`hR_E-@}gn$DDnSID2KXA(6`nnmCLDmxA50$w*`- zD%~=*Th=xt`|KsZKP{2DlVt8Mrl0xuQ}%({h+8&C-MTUIrZwTcOPvQ6JG&OyI~dB$ zwA3(^iSj_1aJ?^-`AdjkiU4IWhJN5oC|Fm7GGS0Q_?c^QYFJu*=~?LQWA`3cH9F&O z$EnRRr9R(j$P>Wy*Ac!t^tt$M(dWY9o;R)MC3E$ncaiXRf*g!_kU75L;Z+Q|q41SX zuZu#f30_&Fa`=9UUcdOEA%o@lM&~%Sd3a~-Zz-*}*mdX$qOjaN!SS}t@rF~EWz!W{ zb(s(ep`;Bk(lCH{Y0ClSg*_{yx#c4&kSEf{bV98M$31$rX(b!l`G&W8vM z)Y;nnU6w;Tt-b3EJ={;m>eA#GA*9jedR_Vyb;*v9o6G&5Dw~AU|I$kTTvCl_yF9~d&> z{xEvVcu3$#shbd9sM_19_ZX3(Ut5#)9O-E|!EqN$9; zK0I{qD@7iP{lmVMX7%v(Pl>DLu$60s~0KrT)|0(pg2=t zoYfzN%Wq3CjUzBllsBV^V@Vl}$B!m%dQcoQ8jv{LX;yHY=t@K0Gzr&FPVfRWlNr+_ zE|n*(2u)fkPhKuhUM)|%QIP@(K#S$cEDxPYfxY6)!P`_kB~99PWoooCEruij8Z|EM z1VTFFAvH0I44&F%og!_uGI^SEC;Xxe3jB4cR5U(t1j>xZWxRF?Y-NtOf-<6{@Wq$Kh#CvZ zNF$~3QjLRV7`ymvddZi_XyQ$5j6yTvhRltQs?4a4oN3*SQ3qQhd)lV-v`y`9n}W_V zXp`DOQx7zg`%I#nX!FmeA|fMSy4lr|L?UK z^TPB6!k?u&p@9x_$?+WcR~HrO5$6E(sE<4M|7%zE z(CdZnH}c)D7ogrK9DbwVU+=E$ncH{As-xIZC&v&Fbl17h|KGRw3W>+m8-;JwH+2z| zLB2qsgv72WC%!mY?|!|AQs%?Cz!-j0JUbe1)m?5*nXgXOyI;ct;iyjz)^^Y7eJ<`E zDC9-jOQk(=vE=k8Wskw;`3f3#RQed=70Tq7$NJ#Xpm>5Ya@@W2=80r zJa~h%YoWb^mR>?ABb`u&p-dPVV zs$&<*Yh!|M-#+=s_Q^-LgdW*C`Eay(VE6c5EmtGBE~6$hTvxQ**dAj#yc^fpJ``gf z@JS{LstDJ?#2I-r&AMFnWZ|(zU_ecZw%90jX_K~@4(>MHw8wbUI>UZ5`Mf|f;z79F zl1r7pJ>*tmF;5l+oXih6kw?O27_k_*HBOxFG6B*E4Wh=--WDv@*f6Ww4TiYsQgCWUeR? z&46HYhox$vD$f~|Xbgx2=>y`7{)lNnJX^3WFcxGD!WFnhKbr8s`0&73S8$xikA@gc zV4T#6hW%)KFwIOF>%^`!bAr*8hWuy{(6FR_G{|T|&{GB?#qm%eNU$gr6R<Dlr$bjvt5Z!G$6(_yHx2hL}z#f?r3!;q+hMXiHFxHQl~3+!5f6$BjPV@#9xMX zq2TRFFB*K;cn~QjfOr<;6-WRfZ1M}&bBORF<_U%&0nTV6OyA9$>rL`aQL0_*G-7tt232@>dh7P<}y|Tp&5iSmMWw(O>>( z8k`;&2Rd~)8ycJ4KZL2KB z4lORKjne~bae%jUSQAeVOs{6z)Mh%g*f%F^Cz(WyU}=AhDUqt#hB2;&)e2 zW}N+z3QX=WIKPbJHRz&Da^g59NWeV}=qk{qakl}E%?;C&ZwUXL%ej4@#XT#svmvC_ zub+i_nCN)jgfsgh^?;s|)sV{-@|_Y+7@^PYv~?eM^&b!GeQi(Y@Voi$_X;3HmhlkeOAAxL+R?oe`!?gr^lknZkI>CxTYC?H68cRRYf zOHz=2pZ|Nd?O^-t;JL5+`X*7FKRec^Ynl2UH)OFKnJEcdEg+=h8VMs|=!K#*pczQj z`f=9n{PvRV@YEu=htooV2Q_D8Ps9k%NZ^IWqU92p)pUxBm$Q>B(C8+2+HIF?2H)e4*&U2QD!&+EOX~ukJK9=6% zW6FPDiS1rb{z(4uR1oX8j9R})P1c8Q`|c0#3T)#$mWU$o&#ruq3BQzbDtJ~zU_s(e}ZRs6mk>lz{<-}cg!&}>-M zlM(@YH!P@6S(x4-nx@6aPsFx0kP1m5%CZ6mw&X2U`en@}#Vp2OE0ERzNvlmLEW}pw zzAA}w$vzF!@R0$03?{TDY1Vo4)ZzGuTs#?J;g{sEB(5K+YO$)UA-dNw?tz@Q{vUm~j{XlTc1%8fVz($~MGqM55faYxe^`P$+j7d>@6rdyz8JUC^JD%8NU*p+ zYfzNRANWb|!C@f7>|Kp&s&KBZ`#iuIO`soR zx}*e+Ku^JlL_d&^N5T^*-*Ub#0F`&ZCaiFN;!v21uYkXVmQ4@=s|dx&PGxRWn|{+H z@kgjx1oNrqDku3-{x#7cXi06|x*BYZmM-*jLf{I0YZtudsw2=LBZU~^^hO~+fX zJxovJll}e%BpQp=v{HpK63B=@|1FfWNt@PY%t>N^nCEi1I)S-JU?UT~Eo~YfY{O~X z88JLp%KHZMcxKv^8+tUZ?FQNY1(g$=qDNt<3vlU#njWp6uzEe!3=ofeqP1k?mEyqX zlCT%D#@_5v`?B9ee-gUBlEY{35W~RxB^haKfk2Z~!B)|{BuPMnS)qih0B~gpOv%x` zhtQF&(WPSL;xHB%16o`yNkPsmWm(C>D!W$d$lM-fN7f=YX6a+HOI4B&7p>5P~k5{{V(C=fyB+|IajoXWQ;GV9D$bD29@aR zwip@i;I-L5e*(-c6L=pJSk`^>8@7#6(JuFO;;1{x^;Vt)M&Od~ksy5sEp!c{y9;0a z8s3LU;RGa&2@d|L_b%9WmHy-UVDvm*Y`%Vj7+2L1c|7#~8YIr3?t`A7}DmP+Vx%zFaNm->kg>AtXe2r)gt#{xDt^IJp2#< znDHa)&Eszn+V-LVIL(|fz+J`hzM~7^+avY-$Z?{nMS{Z~{&xDSY8KL&qOy%K%BW%* z{2P9FyI0SL z-IJ4u7#@gdZHpN4`!&t^clrIZYkktoe6m}9iPZmJI!oF&vZQTlO=S_P#QUB_G|1SF@z2>L2*MQRtQHr?u$q?htl&_36AAtSr^ zPBt8WOp!BHI&+LBW-vgKsh?e#qptz`V1}&Iar;;HP9cXMa_ARYnw9QT!4JhPE+%k( zKXY}SX(X*?54F+57MJo<_&0OR0whdVeu3A2)~uC)-Ro`9{Z7e`Fhc@nw%#DS*F@zA z2($o*!KfURj*w+L5y4F`n28F&lAf8@rZL`v=={1E%ev^x+2~(SF*0p2KzZI~2_rS} z6MFVzEK1jnStZt4QWTA5i$ArtWqXJQXeB=%}BkjCMe7Wyw~j$vSL7-8C(^Q z=br|$U_TEH2V~VQAOtMzm3EE7l%mH4H|4ASnb|+{`2zun(O#duPW2HpDqkkvrIkmI zBq#{0^u1^TiI))nrO0)hI8(oATuxSBSX3IRGu&C)!`RU2ocpY^xrssYQgnACIcejh-=}I|4gxRfw<)Sb?ZcZ}eAGE) zTJ0hb|6*#BMmDxQWo|&|!@+elJy$TC6cRW5ex3bs#4gkCX$YGRTq%J>1tOD94Gecu z6W$M}$ajj}sYi`RmCVnysh}jdVxbe)Os0U)z9X4VKy~;S?wV>3Op<7PVYL0+=oIo$ z(-kV0xOZwec$v1T85xvV2>@GCg`>Ue%~y&`vCc{FKW9F@u)^6m`-L~ok8?63s&+Ai z%Kv9Qv-zh*2VeLlPLH6i0d3ozejQ+#sLF9t!%C>2p1 zH%)EDEXfqeiG_4NECj)4`9Z(RAIDfd$M^4FAYy7r4xd<^tsfVrsLAWFQ^IBCsklCDTvTk4$h=u0%VxS*LQ`;s4Z1$Rk=qa%r!{dPvt%ymNqx&0Y&)FV*Bye5 z`X{dXNMLv4sqg86(SHrL_3HNP$z)^eJ3y9CxxVpTL~BJqI<5sA4M`%?j#%#qx&IYq z7WS{*nfpa?T9~;Rp=E(e6U;cgH|BmcLm5R*}(F-!8c-nlz^!zOh6aJphKeDL$P@IpC zR?T$yQTg?x7yeIlYk&U1C-&zGH=Iv`bq}k&(Hj@Pe5;+d!djj-CIeEY!th@D=(|&6 zUB_}Zynm@;IXw(yv`|oyX+Yvo*a>HhFf?=i&BFs18*oP(`7~<+b7T+x_?0Klu%90c+rY$sYId?Q3r}Z=zU#g}2W- zMLX{EB3_^R5tCR%kLE@0a>_6G6#^#q;?2HEeyiI?fh_(~+`gMdA4PY_bl0{3rTxWJ z`q!;%-fto5nV-LUen^q!bF*x(*8D5J!&_;fXRHQ(oNPUsEca$vV@OAEU6XrK9T-PG zYi2S-Y~Fg*1D?~(Y=8~=W@b+7Uvv|x%l0s4yVQqR`a;gU7`s<&_PZwnDQB0j;M+#1&JVJqqwiEd63 z_duOop$lglEb3RvK~~AGna)s=V&EN0!84rz6u3iVjx@ZZ$(bVw@#wgj z9PSp8>15#~|FK{#5< zn)S=hAfj{aV0lE)#)6x6U(kCWs&6!*?#_aCUaY2oHH=go zuQ;*i+oaOv>N;{xD(Rq4>f=`GXVlt3nWVPE!*i)NXCA%(-JxJHtY`f&%Qym_o0-@w zKJ7nSA&Em0!nLnCz0LNCMYe@?hd$DWf1~caD?I4HA8r#1`~8D3MTtdzCrOPwX>ZgZ zhL*_O&YO6P&d?^=H!nm1O={L1nj)9d6;`&5!-U9FY_gJLDb;i3>!WJ9_#yqpRG`pE zoO7BK>U2=zpd9@^IGuD&>Sk(d4H98taa$(iUdR>K>5$$CeLy2=LWFX+MBA~;8^vm- z!$Ee>cP0@?UP7V8;#vPqb-nx6c@1&zafp3$uowF|6cEp56fc7PV%6}3*l|uH3+bc18?VZ{#;0qQNc(r2(qB>uqo>1$X90HFX(D3dpMhr zB6DHP%Y^Z#4p|S;7^scGZQ@`#Vh@2@Wpmdqp3Hc*SKQF9T=(gs^$A}0t+@8B-p~l% z^b5Ms3ZT-gX7>rI;+$jPn1y;mWT|qm;2>4_G!c}7Fp_qttky^j){j*ig^#XYJ= zHFn-~x(5>V=Nlq_^VD1^+ekB>ci`Mot= zgzfcY5cG>_I8AfU1H+7LJs^YNZh8h8Um>e9S_i2iHXsd@7-j$sHp zD0K}B$;X{)$q;noM4ICBE9}7tf6kavxT<*w=Njw|Xnh?gI_dT+y}Kc@?M8Uo_Zcz1 zES@puLr|9py256%E4Zmu;#mi8~H-7(XL?I+em7)d4g$klc1|>=5Lo8BNa}U#XG+ZtDmm- z%YGTyJ?{)!+z%#+c4)w58+I%`zK2d4cCJ0{f2=a>nhV}uvbq29w^A#s+pm20ZNr}U zRel~8|8ZTk8uZ%W@^9AWKE4vl_NBnN*5_!pZL@p%Za+HLYea$EuyYQ6h|<8(H9$x7 z*_!KwQYZY|8vpaI{~M>%7QX_!5QnGq?K&Q(6QCta`XQKKd-n>PxsNILwCL$B%trss z?usD+%G@}&q)1v`1E=dQJO$J#ywp)A=RY|t!xHjW{Y|H%SBo5$@!idU0rO!oh?HC( z*_>?B_3SUQ`2+y~tZ68gQZR*RY7KDW`bS^jO`%HCusdEcycB&sBBDj}H7z=IPmiPK zmf5j|-B=_)KfhI9gbrN%RLXzviG)Eug=xBAxszcoxy>D?A!Vlg_4YlFKf?g6R3N*c zAIv#vMGxJbc>o7IvKrR?MB@$8KsM1vHzyv>Xl#K5DJ64Arq>OpU`286pF#G4eTG4j z&?*-P$kCO2bde;PI;&J^H^{CNO9yLZ(@}#_jI;Qz6MNq(rIa-G*)@44wRon~7J@A* zZMq4?Kq|J1`UzNAhEbeYV$fAZe-Uf8;%QYxQwTr0xm(m^0{?+x3sPYW)Z#o$RclLq zJEr5~p0Ks}utvzA_ReO(3d5`@O zHB6XqQ8#|abgu3#I!Sv|z+p2QJwj%{cG0co>=cKKxm_ul(!U>?lsxd!oC&z|&wl1k zuxlz>*9cd1g}KU#acMD|KyEb8(Ncxc@Ym5&a?w&0yHBGvCR#U`S(LF!X8|fU;cP_RJ(I2@NW)G~}({$v98U0m#_Xl+jV< zE8_h%I-itNS1k~VrHo`8jA42wx5NK682%V5RDR)+ylgD2g3ML5L%=A$FQ7TGY|xn6G&qR(5>VvN_^klf&1V@1jN zNen9_4OPgsEADKAu(?HRmFv5W5F#;$Jr5G(ZOQ-l39?%JsG5&7` zgvM4sxtlE&=_X?Y>1bhy^Ec4p>1*8V7gLn8Mv{W)B#h&$cNj-YDgo>v+o|XG%3o;p zQ$#j5UsLjLWWkFHUrfo}|8rtrjG0Y9(n95y%x$#t*q=ho%vf4~OPVZw zq@(CaK%*uT@hdbs@)J25gb;B^DyuNNQuP=-*^8t;fakwq zM*NM!xUVFXmV{wA;ueq;9a6})bsUP|rf)PGhJ2;Pz8yn!jU-w~GhN!sPDA>b)n^-C z*`L*_dL+_K#E!>~dfz6>Owm=79wSl1?qBD5^p1|nJwP4uEMNX)GRQ&quO!D_JYQ3u z+pQKgS^o!FR}berc5v*KQBN&V1tR+#y8ch%#}YylMA5K+E5<-wbeg8DUOe^)h7HV@A2==EJXjCq)+!YlDR|kgm4GsZziyS*k!m_xqH329Cp!9 zDeGaaZa@~lh>q(Buj_G6YRafuutyZ2u4;Li1HP z@FCrO|D9Nl$_Z3+EX_#v*Ym}m{-qM!W_Bie8fgf-+jU0z#zQ918xc!%=5ye93%*WK=Ck|s`VWxk5 zGf5pUY5gK8Sei1^{Be%{ac=N2<+PD`k2cvYmtk8+sSl!Lk|H3Yhva{7kB>P# z_+1uC8)p5<@*`=&$Pb(El`!@mcylMJB;EiVK%P{NTLvfh# z5L<(+$@fPAB`(j__y2ZS|1_f&Rt%Dk0TOdMu<6r?mFzBYFICo7F-jouCmdh!A~qklcw=%n#XqDLzf%6utHAgmIllOh0K{$vgKUd z`DCF|Msu5cHecES$zUsA;eHa;mAMzPM=Shv9QoMA60Xcytepw)ETU=>rxLaVL+z9W zl)X=n$HRCmdm7i0p^M}k#Ett&^XKOXB3x{sP3;hmv&ZkG;R(&Nobm|FWJgRbJ7*@|YywgY$Xet!+VhuQ zjt@LkR9YyUMuMrUX+L&&n3H*JW}1J1o0(^L%4eD?xx}*Pu|r}QWOCI?SeX`x@K0{2 z%~Iu#(B(?FJ|h}pW$D}?XW<-A{Ijw^7^_*a<0eD3f`;y9*x6}?#41DL+AMtSlb8d_ zESixGCvbt{Mtu7;wb(hRIj)}>N6MJoEPRNu8f`jUzf6BtXrbaBxZeS+thDB4<##ko zc+91heZ!j>ZEByoJO%ZWb#>5IsK%2l;ix9$NSF$3JdlDUPwSCxd?DS?AzC;I0tXw_ zGZ*E~lP$x&E9M5`(TXJT?dn!&1*pYImE>m$=hs24qW$wV11T4Ma(@s-~7{{nq;HH%|nA>Z6>{tGE6kvK>t9_)gkTe5hT0?Nq;c zUJdBZgs$!WFzh(Nq~#X*-4Ea0{|yZoZ#^iQp*1h1)!^P$#F2Y}I%j4dYW+T+YOQ2E zRPH!vle~8lb@4C^R9AmK=@~}Z_Oa-qdL+oQ$@AM^<=3r;oZkA@5F)EjDfQlxhc3`5 z z*-Br{rwz;`C8lx^l|2a`&<r@ zNWTlAY$+Idm0}|(K#x>|l9-VaNBGw8`qt{oL+WTl>Uu>)o0WN<8zzLwo|j8w zZ7Eg-_M0XXWfx>_SQTLan7nHa)1Jgm=dbmp_%NJon^^=-_v^;BG)J-d zG{X`E1sDWo3j@Dl^t*dqLpkSVYvj=Obuyt< z!pOu7!<6Q*%Hn{^^gv;Jj7|J!dOi}`ltR&liLrHM?rKui+k-Eb_#X}?so_^8oV=MMi4>hnP-AUV|MI2AR9HmWGzd;a z*ak)z4Ha_;(G7eL7~jdOK{hWy`|q739nq3*+4hH}Ul#H{ixYYsbhk@|mGS*%Ual3@ zW+dvwhBUkICQ{zJ88lwHb#Rje972~nwpKwVoA0D~B|z^8y<+pw$aEXV4>^k!OIF@u z_c5$G=nlFyzgc-+z6b_itcyH2Fn~`b;;KD;dy^&{O9#}s7d0HS$dbx49Lbo)M1?&UH=KQa=?IDdARUhcTilOof?^ru@RcB1a#F>%NVuR{T zs~WGq1WnhhD(6&TB4pF_MmF+FOtQ=ofFy7kk^ZD1QKjRQVlEY924a_DEcIU-W$B;E z(nf(Me{3rs$@W)6W^h!_KJ9X?S?f5Fwas9c!2#ke$VVlXh;Tm6;;UXr(Z@-X5>}cr zc`+>#=`k9;P(e5ZUvVQAl)+Kkv@uRla_;{1-hR{o&U6Zd&$xz65_^DZQ*B^U>#XZb z>y5zs4~ng zP$4ai>U#cRIAhZ|wD&SWl_E|bhlor#sT-;mXvmx|`+TBDYNuxS)D2o*WZMpd2rCo8kPtnc$%+p4B*o7d8o8K4p&eEy4BJRCS>=-bKyo5Zyn8>(-bJO1Y2zEra=t zgnkJvGF<@j(^5H!y&J?YCH#s%%W2dv*C7IU#To(9+>cOVh&kq&}Ojw zGkzmU_?@)yjAN`vq-X>EOxv8e8haJ2|e!|?!|Jm*K!gb3;LI)Bl<{C zMwP*RsCMc2UQ?;{DLgHRQsuH$7bFV*hj4qbGl zLM*Pf&uj6@#2#Aa`Ej{Ec26m*ys~5lq|?nGep*IW`WF_P2VoRWu(-}Q9z9 zye}@Hlo+tM`Dy0&52;M-9VD%I0}dX2gTTMeErWbEqk*SS*b%*@1P{rRwCO12CA*gT zxj}YeP^#EpQfZ$L>9ZN&BFI+P;A+YtzvL=ua!6U1Tj8TQja;(&sa#+g3F8|wzx-7-`fu zKM0sj0C)U(j^An1XtNy}e;rSQ=kA{5sl*e?K*|lcM-4(gfo?vDer6dpYw5)lV&LSE7BbremFt{2u$JV!}2cKJwF)RoA>{avut7bf}*@Lvh3@ zjKKn2CkNmSz+()iAeRGn7VHheQ=8>;tDRBXA$9#2_qE6<|H~*Q=CM|vLU^ zkn_)Ag*d+GSPqx54Qxx=I8#}5JliUL%jyia-#KU9NCY(>=P2plk)*z{rESULVHcw< z4TAp_6HjJX{lv2+6D47n!J}v)rE@RMBpJxCxSuOnpB3x%72{$U4$hc{iGA0;EiUA@ zI#7vwuTP0Pe9e(XHw00T+)c-G{VHWETI(Pt6QaYSVxi3yY%Qd*#FESy_+@PRJGAjr zq7>k|=UVysh2fVPT?iZy%hj)%De=jKO;SR;-XOC}J~O9ya(rfg-{$%n!v9`i5B!tH zegmjNiaw4(w)%k1*Mc(4dmNoH6%i;iW+kS64?={f%h3A3Ui3?BEi8GH!dsa_i!aUwW45u;cdNm>PG_vElOJif3 z4lp{F7f$qSmEuYThQB16{~C3fvs^uORclTCIamaoj~?b=nN*c#8b>6Ez1?13XJ`kc%(>SdL1q|EwOb^8;>8)S;=(L>3% zi=GsHWzDpFr7RVsECJ@djSWM`2qscYn5{``g_!MZ;Kndnh8JcpQpPo>ZuZbXr6yuO zc@cQ@TZSC-Q}Ao#@Eg6LA`&_7Nn4;>E1~4P)S&`+@iZtd83-P?LfVze$U#JjgY;jN zGOYed;y29R@*6d)zJf8GCH1nMWlVF|owbprQ!4>OL|jkeJ2m4(U;u*(7ybsB$JUfw z4*lL##4FOT)0dj+Kb4F3m|cdUHUFi`Qlpx@-cpMrtO%A-Ex-AzjtrH?U%&km{{ssT z3-A*Kj(U6){sgwpd@TO@$xO+KQmlIkA7%N-LGYG0b+Q5_Du49*f=_E>o)|a~$HJr~i`|*^GdXF{kNBuk; zh@vO|`Cb-(K^`rb#A<*2XZ%!Je_n%f2a{b7p}f<3^xE7S?v$iFe`?H*;-W~_uJF$6Cxtq~=NSHw5;1WKDE zxy#;7+izjS+~6@@qH^72b#13~zdZmvkM?8Jv5DclQn$a*SGyrUcYU-@{cMFLKnkV! zV^Sn&Qa}+Ct5E;DT(}UPZi1`I$bi;w)r--%Wrb?u0<)H6O-&0LjD0hNoo#yz9ZRK z$){bcw)efCk|g_=28nuOm@C<)ijGCBS-Z-88f^j zGhaaJi$@yiq)F+-N%T?-#%VmxZ4BQk7}z9$TWh6EM!ZUqRnWLqQh`>?vvl}uI*^Im zF627)%&%$@Th28kR5Li!9qDJb0P;yAUG<-dFrlEUBMwKT3nZr2+-;#_PKo3}x8o&W zb2wWyJ~6aEbFvnuO=@UK;SS{;Yj0BOGQZi&<_RO);Cq0bBmi1u#D&nisN`$qX-#kn zb(4A|GSsAON3R>*q(jJr0~C9P-Cj2HTESFnIo_%FXW2wWdtFM^0>gbvD_Yo_PzmAV zPb9iW@rX``+6&fsz0ZuE>(bjNiz}UKkGMme=|SKL&~dj5=cc~uJ!ZZ#dCf6RxZW6!EbF30 zbQQ#y8#u09`Rs51-7&~`oH_I01(!#cacWTA4J4wPlw2Eg;u?#XjxuIa;Vk@_yj{FWECnBiT`Ugp3nY;rCmk#x5!MmYii|kL%l*obdf8{IglQHk zvHoum8V@*KGv14;z-U3j+f0-UT93-h%NgcxFgTm`WQv>9hC z_E@A>!bw`vnr0~zxq!?daZrCFzO44XEV1?NNpfRWg1a_5TX$%c!0Z?4cf}-y6WYMy z5%q_wC}TR%Wi*>%^Q+;3U4;wJX8{swDF`qtJh&IzuqSJz#NchHyp2gH*6>A&(vWYn z;HaY`CB!6E0k=+{pleR!$H@oSor@K2soqdg@0HTg33`fY+>&( z&l@wNJ)cC()+btV9uW-K)xdfrV4$6YSqD`sWMF<*4SGen{rv7+WhCcUp?@Vz9Ig(NP>6GMXO0b**9j@LS&za1VYP2M5svi0Y(i^!z? zt+x42^iS1OI#NaW#z)e}f?JgfEh=%ZUuP;8A)gT6s>e}nP)^1Kp@Rh4aBa8Z^d~Pi zu>6h6$KCMxfX9M^nJ4aaksoig#FP-9IhLcBG*N$;%W?mm!bLO2H&`6Ue*axBRy&(N z429&m;3l5ZqmQB7GUZO;FXJ4XI(ulk$O$|~z}!4|;&_w`K3`Rf4a{nQ$E^YTG)PH=_AwpQ8winx zo6-P|^%pXB9rVu;cDJArhpx{_%7+A~fe3o}Rb0&#EV2Y?{Z8sj1HTcTF0e_4h+m~o zXO2H0>!>Ae-D6T4k`t@yc&Y8~tAcUt!q6BAT3ADC&@k%wC#{?@ooGa&RgJdS`%voi z%gChYw0#TEV+zf3pwUXWsJk3ymmvP$jBB#sc}$WAJ)7fGK(uStb-Dz<|=LrG-6%zl7VOa+6S~llIo}kEy#+8=itR?0ZVVsq9<#UQ~fiD1J zj~W8DRyC8|ZQ!1xEW;lB!?@P}JfvfKvStigvO8H16anW}Dw2;YRh{ANI!A%V*`eAo za%MSMxDE5~*)V>e4bCN81LgtDv0jv8vOd8T?e zShJcHZbo;ZLqGiKH03pDg?7jx7>Va$p54)Sb;YnBC8Gti3AkT4OQDCV`P{|@am=U+ zr7q~uAcPo)c6miU_b9q!2#!cuqrtclU(8_<1=!yVi@u{j|LoXCR-huOiPl#eAdbgm zNxJWQNe#@H=gTiMiYH_+CF_sJSc=|ziN=RFJ%Rozmmce?9R&47rudIb#@nH`n(pqI zp6)eQCvDbAe4AB&puW=HZrgjoM&-Qzmdw^)GKs?u=g4HRYtsVciT%z~HPu$5!?D&6 z>*8ri6u~XdBgCH-c8uNqx_ec2<@_VFd|Ay2#yKjq|)e#_z4$bO$=LtSB)#sr?T9N z0BjF5As&%gxDi<-9kx2K>f_#aON2rT#EVuoIc(#sbytRqOrnnA;ZzG_DL&<53!eyGL25LK zqqT(tN{A2u#w&rgC^mI=^{5%1Sp9T^eBo33JXL0c1SUZi2Y!gAz?g{(F$=}k8r3$r z2&8W7t1WA*EeKDNFzjDePxF(0(x7wjOGi)2{>)AiDyBXzWZbC~5u-W)rLJ5fX9bdg zY|^qH9x#BDyX{pc`(LbNG-4=hj*z!D^J7Crw=QakOw%P1XPnVHcoVy!V3h6ej4gTj zJyiXFQO6!g9H5=oooV?u-u2~BAGELAIwx&nNW1NxhC_G+#OP)FyR#7)C&9~e{zR{2OGt|qQe_2sK5+2?khYNJm?)<0u zw7v}qS7>1r=Zms6fQ0HN9_@!lUj2!YiYg)odR}mGYnXInIs|tva}$xS*nBDAnc|HC zi+qsu!cD(#5b~Z^11JvNWQVBx0X)Y4Zs}ET;b~o}gKwjAlHm24iJi2t)|ayOX+eu> zT^>hmj}YCaC01R5Bi`payQOcj?feHY!FWMTP3es~|C7mV8YF-!sB&{h?N2{*cRj~t zGG!wHE{Cgw1E4bRHiez(B;X)UE}1iRyq~kgtDBK0u9Pv(SaoA z+EWhB=ad25*Gw90c*j>apBp0mU9Xr8(O=_zhN=99d3Noz6Jo^-SL@MX13=d}9$HLz za()D7vV9wB3}gJD-$+^}axN46b#t%nT41G=q{)QF4+8{H28v#KnrAHa5*jroT2T@e zjkpX}B1n@FG-A^5Raue(KmIga-NZb2i{Mjam|p>h-+6~Ty;;AOHV;;qQ~z?J(GjUA^e{5;du~8^{w#9l3{&goN2&go&*&<@hpC|U zK_fprVvx)SCLO7cbbf)|?KmmdjMkcmmg;Agx+Y*v1F$m%V{KgQ5EiIKIL?0GVA7{0 zG-$zuOoDi=b#A$PZlQTqmv{aCmW!z`(5%6D^gaa2kZSnLPM65XDz(EAXuv>y=rzCg zSJ-=U&^*g7svyQ2sPV%_9}h7S;)8BQkC=$f{Q0ObQ%~^NMw0?Mo=_;5&}Ko@LdM-Y z=iJ6|n*)s@(=cfO>~=Hnm@0nx$GnQkc-RHTED@{L*{{sonK4-Q;RoG*3_cGO8d~&+ z?W{fye*?b0QyMSYUPrQ*Cpn5KFijb*X*6ee-38)cAi|g!lfi)((CE!Of)!t>wzQ9W z&99fzqQF@rbbC~mAh-}trc3T~iuy3AurKR?KIpX_CG_>myv}~XQbG;GrKKUUGBAN1 zE{`VP$24%izedVnw^%I(5va=0-XXsqIqVhl?kCBYRRG#R*bbFwy)(pj@Yr-6%gyX- zzSR2t8#iwl)nO&cp8ULO*Vx{tyF;^TN-Ka%BOrf{{RqqCq^Ad~_g1HrKP7#?2hgR+ zrbRA4W847_IXbXb3RW0MBgO(a!Ivf%HDWsR8pnBdI{NX}#71~r$uJ9(ENxsEkOuU2 zyJ=yf0!A}&fq_Q_{~BtzFDC?zcz>1DO z@+UFE8kWky1SP=fK-=quaB2jblp)fVWm0rx4`v|BD_yc-0|_T7(=4cwhJ4Zjf8AAqZ#Iu@g_~S6i^+{!fUj zcUdXRtX}U}on~EK)n}@BB#fnbDoO*|B$C8we1Vfs2$`_j3r!iIpzYpvpg@D z$fV0_G)T@Gx^+aJi6x1frePW?h<`{z-OjCzmTotDpTJ!$H!_|Gc}xf3n${W3g}sxZ zZ-TcI&OcFahicouSuXvDlNpl4ChU3fR_$1D^`YjC;>XE|h!mY##+FDQJwhLLa!~IM z*~n3dq?i#$BFLD@G=Ik>xIgo3Z9j;w&qDLf-dJ{wCQe4B-T${60~o7pLMYE;ym}&AL(u61GFzc zgs}bbGCHl*;M%oA@q%qBOoX{cLC#bTZFc)&(3%OkCO@Io;L26Rl$%g|r@Lo7^JW6G zMl=|2na>c-O-Q8Io#Z&?l)m&Fn-dLztmQ`noA6p-w+SByx|%}V7T9#eL& zd(H?7xz_DP3++^`-EKpd;-SzB4h-SL)NjG&FSBAV8_)^X!21}a#1ewZORbc_mboOn zB-g?uvlKQ=0u#l*Mp-mo-kKBg2ARMA^;MA;)z(15xMb%Sqo0g(32uP=6;`}vHk&jR zI8FBXj2(fGLgo$AKS@8?ChXFN8NDxkI;oE+g(uB?{>*rp+sd`&Q-0TaO5=J$t#p3Z zXvQCE@aVYvsDit^qS?Xe&Y_j*uh}yYH8@M3?XSbfI5nE)nQ|7&QeLk zvSzqm_o_(F0FqkZw@>$t0fHkjd5bXq*1Jc=u=|BUo~1?nnRo>5Xiv z&>1!?;Wm-IrImzLE$BuE9Rf|5ms(EhEx5G-Q0889`>AX@sQV!bahRASo*`dzurTL> zN^#gpkIO=V0Nc~V|GedZzCOlJ0>YCmBL`8K+_b7PA8=qXA6@Bz+@~eG>NphJxLB*` z*dwDsX<);h1=Z{pw*k*mE}XBTB9P=ez!|C0?$Mgnyli9r1OM?Lp~8C!Kip73q{N~@ zN^G~DIjS&5r6j&OZ-pZ`(FMc_9B1t#o`|>?b@S|V1X&We@bCT)96{s0qFI5Hc7g)@ zNt2M*1pDt~KN?nOKr~D4FNgsRyV3~WH2%@dX!L$T&t_$8ZYw~U%KN=qHM3^R)wIoE!XyQOCL4;{mha#g{t4LfgM{N-N zXcD(5kkNp>T#>j`L9RD68O<^TI!Q6gv;<9Nf+{Uhot~u1Oj4&OYcf*R8BAwHKqJx_ zA3!708L#n8hCGqZh=4|PpYida5$TMS(TMIdjAncQ4QMPh<3(pguNgs3jOnu1wc7-* znGTwRromp9Z7EGQ6*G=WF_)#8OEb)+V2et(REQEiXgq#22xvq@N@^I;6xnKvZFQx# zni5AXsLWnl?qD>7s&v$Ys+KU8Sz3IBWSjQ^6cVx z9Ie2YL)Sa9`P~=yh4|Kl<8%x{SBm#SA7-{WJH=Al4-pjTy_5VY?hHS0 zcf?`r!;|C2-!+~PpfJ=J!)Zk-2@@gU0wLvq_A#h=kEaX>(+CN0FN$KsocW9_A;E}* z6Ok}RNJ%H9!v!}eHtr3>VjPS(TpV%J&KbAto^~v5+Fc1V?n%1#zVw;*r(O4G^VA1U zI0l}w_qW+kOo(#JX1Zmwair3O#qJ49+_D>oWlM(rR=8zr+_H6UzqM|^Q@@hASIUOB zwZ@+~?&$B1I2=9Y=8aMP>mzzsgmo`>v@UiuUT>?LZ>yPQDW7RBo?&7rlOJi!i!kKC zvl>Q@UHFm_UMyY@_MfS69Z~~$!G;?${TwgKTrX%X-NX_2_b&WKm?PjcQicqNF>jLn zgv|MTpyP3?0Xshpvu~LZAZ%+YkwY%-I-Q=+2WVMn1J&nA*>l!^z{_Kq3{xeNSi($3T88; zI@QTGL;57^Lw@#W{p}B0p~f_6Hcf(4i=M6CD4Ti@h@lMHuuHvb zx+ZpqA!~~r$7Qlm0#dWp7jlkwn6V>?X;gOkEc@r+BFt87IaqwHQx zEarMe`vQ5}d_|i`WM(M6S&YR0MG9g@BN!Gs4tV;gvsAc5G0VGi3o#>`5-7vn_z@er z$|Rrev>;D^d!#Gwaje)6{dTs&ARHr1855x|oT@91(4$k#QgoAfxq8yGCH~Ll2R*$q z^p+bG2j{8UBekVCUdc0?46ggGEg&M3qVDH6Ug{Tu!=ut8{X>K$JngmLL9E$}X`g#EKFz z&1gws&6RkKj|6rjO8SI|j0WWWIE~O5sXTy&HS*Ak@?kUxW!8-)DWj2UgSAQw*h=l_9eD%HA1}D;`C~aj-Z*poeU|+U(i6GkuZH)IJBg7sV+kj zCE(UPCl-zGv9O=uxl-&oP{)J25Z@08e?(&^hr32Xzm9f6uMaMVV2!XhOb<^Z##3jB zdq?=UHr>s?Yg|F?p>$Z8tO$=H4LMQ9+$cld6k|SUs;K}p!(1@kQgofUWR|h~I&1kX zTg5zU<$PQ1LTlY@TlJ0h+FfC7>EWHJVQmEwoh?)Px}pwrM)lkg)&E%Jp@$=SpN;7M zFzm<~=fJ!6Ln!N^GnRpOjD0^c^uDb>__n_9EnP3`O+D%jk6tq!e8q6^HB;ZK#@?5W z{V$t(Uoszf(cJ&Mx&Jv+-?QdEFhEaR(EfpS0E{16AUyb_4b%sUo%W93^~16o$RlR; zux#D1Y>nG*)v(`Mw`_x3ws{b>(Jkxvqo2D_<_>R)eeh9N-%YMV(Nk{P5;?FwY(LE@ z(|UuwVWGW#zO8Duwc=V+@eETTR14Hkq%oJF3<{n@s#U6FdT75T@#75{!f#n?>5_%L z;OBTzXKshLS(p*W=79K~B397CiQM`W%SiJLqp!|>bE^H2s1!A9e`F!X4{ zU!}oXD|0>%f>#ih2R;_~A)pE|p#O-&kj62@M=&0$4oXX}DS9&TVzco@Ez}_!_$uRi zfKA~*LndM!+$B_$kFZ*FSx#*l7ms~jEK{qsD-NpGAJ!~CUrpF;e^ka$xRej@SPnns`0B>Z&hviz;b{hZHV<9HCq2y1Zi z7l$qZKfdZ@AI@@R>3l&9i*bwu%Iw0?Mj9csYId$Rrft!uZ!x59G^DIEB(K#ct=1*4 z&?PO?B`(n>EYii#*Tl`$#LgxnGYyGMOqe>_sq!K+V0*NkgSG>u%f0>~T_D)sTcm^e*=BSzx$0*vbS9H!-w9Qqv&QY|?R<<>s zzIc3Lq!b20%xM1NO<_bag&`c{+leJ%7ncVgL5NU>AO-j5Jx~T?q+Mur1yH1@Tu^5T0q{IhBfklU53<1MnCyH(t>1b%@sa4=8A$t)?2ICW;(OgQMWsy zbys)`guBDrL3<)PI256bsPX8G$Y>bKL^~TdS!&oBhp`L0VIlI^r0so8EvLCj8DO|-op<85_Y?6uR>S(5`|5W55j zo-zz&KoBEB8L61gkamRl?~pptC?^SwMisC_?T^y>M~}ud#=vM(fFO%MN?;_#QvS(pv?4r=! zi$hRLLiT``hK?{A5CfXk3LNXS5{E?XxiJ*oZ4l5X;x;N0W0h&UaMItjSY=9_DixHV zN<%=SN=qU}GaAq!ozZ4`1DdQnU3R`!5CfXM`dn6tK94lk1T?sWQz59@Sj4I^?X6{v zKLO2nel$GL$(znpwc2Vx9gdo2dliKB*2*+vQIftW$+(x5Y%GMB6aq9Nof$0;ph2Zu z%6$B27|Mu%CdXP;=#do7l-j(6jK)^$Q} zO-S>-7Iti~=KwbL)~E}S0x?`0-+l3IauLo08!yKLXoO4Cr*I@qT7j2|S4w}ab0j3@ zUen)omBOB_M-he`P^2+8%7jpciOe+f-szU&S%#8pEoE~orE@J6^K9j6DdT;Kn@6EdTy=!lIcjnFSPe1zZw42_Wa^&5p!)GFoyc>S_UDu%>Is4Dp z2Hv#}oU!!3W9&O)=zT|j@Eu*>kF>oY5y}WS#sKPn%{cIizVBtz0hF=-B~$;4=HBN_ zeJ`5(pEe(Y@HtB_=xNKrAJ`85&?nAom2Yw-1vjey3aJzI}pQb;qnDk2w1ua30z=?a0=sL+c|Bta0@$ceO2cG%mE) z&9_y}wU%9LE)t-ODKE;H8)+c6MHR@8G1Tg}`_h9)8XkKz=%+E+e(MC+^M1}}^rm*a ziMmwYiwP(Vywl)a2c>cv3MM%omN}k7F5`S&hG^zn5S&^Th6TXQ@Mry;&zX&NaQ1Lr zn$psbzC7qDBb0}52E2t*T-r>(>X&3yFOy#Mt9ngV^NOtUWxpy6AtnB_E!lo0FF*o} z#AL7PRvv(NxWkq=G5<+8N>=mQgo;-oy<+`gyFOi3`8p=6gqSfjq4H%}^=n)wP$Bjy zl|f05;I4|7WYw==0V-b(-ElW2z>!}9aKSR82)^KVAq8!EiwYs_g|qY5&FibjVn0*V z$aj;4Q@rVEemD5A>M{eZ_sLv8m}I@zu1~e=;@Bg`p^ant02fhW0wI|QT*kpMOksS) zIL55q8KI4#nSE0?qnk|1YJK7=UBU`o!ZKa_4chpH+PDR}xOv*x*_z!mHM^#1Vgw?i z-eFS-Flu(M1k>K-ik>R} z7s~x#-0T1B-fNyK2z)xr|EaWqlN%@BxkP?+vEm5iKUGs6rWHmlIkh=7(KW&mDTx?Q zOG80Y6e2{8+k; z@eK$Je&(U@S|wk_YQ1s=LK%qHS)fQhda~V%-td*Q*y`^%Ktu{KWSs*fmX3!3A-xbyd zVQfT)x9`jq&`eTPH-tM~O&iVCq9+a-=JJh}3Pv!3%+)AK%%-uxjktL=644ABBBsG< zj7hwCH4-U|&!$u&pph!tTD#lcP!+kaIHD`r*}^fbotE0|wrWtcxdv>=79zLVYOh!4 zYbM79`|tGk$GK(#Y0?=8(T~Q%VsILoN!vhy{@bMrnj|RLe+S5WxYKr}|8`Zt4w2Dl z0-{0MfbAe%;0}->0A&n}9w9Y>+pU2+K(?T0d!Qgk5YicMMg!r_h(JM+K{1iR(Nlt= zrv~qw7KD;A8up_hSDF~myve&j3}{&1t~AJKKq8|75y8PUH-yG5lgDk7Cv8`yM5|I` zl*yposuU2@84=KcB!DI@O_L7t@}SXXf*8$k2rAI!uo%r08}eApXi5$FpbA5Qs7hlY z$Oq7Xq-aLeW!z^(K*Jt19o8!LqiM2L7g&m8^*Kp~f_Rb37zz^g`4A=>3zH3dQ659Y zG^1fnnz?i|reS4T%CfBGIo7INOGTcw5>#NR6ah`q_>899CIK`grZYA6`dSCl8I}lW z8e9!bXGBKR;%o*nnt>36T!!dOyNdt~VVaJJ_I8gqO=oy}M;O8yFwka36W-nv-qjS= zmS?ZoVJ%*0%!-6Ir8eH7O8`O35}S_(#4%vIbO>lh3_yExV^QQNwA9;WJ(f6j^bSCO1k;t5J z9)8C`4l-shA_F2%nFF9V^#|TCpk5=rYCQ0gasMmkgD;s6ykzQq(TFTYbd!PbS##gh z=7Hxdhn}{JnVRd8S0IgDj}@p}+$Mv)#8V)_#J$fttvTv- zN8k`9HGWmEP0arRzXW7RdGPQt1vyNpe1XqyoL5iTzACGR^smV(U-3gUgJ39h^HHun ze#tm>nc+IV(u{C@%KyjSe?Z4^W%u4_gCx)isdLWV0GKI~V$KOU=S%`1awYd)~y9-SS=coVP$7StJaotdPUevf=fY0c`q+T7$U-7?g^gk`6NG%K=f&Xa2e>#n| zUPF!W-%w+%%XC!bd|u)GAj$Qj!_K3q5pF}J6qivX zM!~oYWrR}###;W5qh7U}Qpu zQop{`tuGN344N0%;()stT_M4Z42+%nFD7M3#}G0X!<)r;jorJgr*~V=>@?49XBn9X zOcU!(V@rt`iG>kdOpq;H9nuYE=!Y`&xPr9^TR2IF@&$E_ZfuoqEK`q*Rj*8kaimAg zI^7IQ$IPtL&2jUxnwKNR6eTSsVm73mT6#q!n4_{344bt|=dlbShQKDemzI<=>HA=S zjbH^4Bb`(W;KZBFz-5zjgr@Fni#o>KgXK$@l<5f=yE05CT2*fkCw_fE`IY{pFL$cm z?^M1EM~!c3i^W(Baj0>_#ags20&ph+-n5U^pl{ z_N6=lkHVLPsS5T1(N?gJxdd>I@ZH08rg2GZxX8Ygrhp+7*+fi@ z6zMlX0{1ntFH#JGwIO0n4gU^{M84jNL$+byfIW(X4m34OK}H6)FwSv|mHKB%$^hm5 z*)leedKqqK02ok+W+^*U7eqk=7t9s~5Ddu9NC&K!%?W_44eavnHoqJ)F9Yx+GNiI5 zmS0ZX0Q^XaW1OVSSjMH{;DwIh`Eut3JjAUHp6|jfnHp|wc3S$Ksg0^6p>Ro=Si%NT z3WgI`&~Ql8BqtRSWM??~q#}+%Sqv~oQv_I)0#=4iRqRj-js`W25)n;JiHG4=m2yYJ zO$|C4Ow$OOh7e4RwiH;aE?uW7+n_1ms40IybTkiYE4ON^wkB6>O{v_LQn^!Gxkp>Y zsM(!TjmP0pZ52FpD7m^ItpU|cT75}+Ls=Sv*_pKF%Jiev2s)bDbQCl!KGO^|>yI|+ z(9y8?%&`_j3qWdy3mP7u;dTb-5#uvFK|^*17_vsx48YY4+8GO0IZ=HRL270y-WuDS zIme09uF=cxkqfTT3CD?}rp_u;M~$Vc+T2-Z>a1ndnY-%EU9g4Y^_K2tOHYHP8!@A` z5j0IaM*}q5252j_GcESPR>#nB$8eh+x9!do9gY)S_7mL>6g1>zIDM|M0jI!_a~vQw zgLcMslGKc7XHEiR-iebQfY}+(#DsTp+=qf@#v=r0CVewA-l-|y)U0oM&N~fTV$MHv z%8w0bPWk3g&5)*HUWOnY6U({K+4I5kz=Z!)n|Hj-fsV$nuXUL5?@ON%mv(ZQ8~mn5 z_SY&S`j1pGMKIx=mYE3KV^ zk#Y2_w_)wl23LPy=FHD_KKqMpPyT%C6F=MfoSDaY2g!M|!D<3*g#ISm$Ywx))!S+k8Ywx%ho(MgYP!mq5yQ63fD;i)B zR#e}CBZ}Iv0><@s6t%Y%)p$_R{F&nAzfpt_zV5qz)3^Al|7vgMqXiiYdBH0Og6H=6 z=C=8!x4Fk7QpVmbkuoHW0N3z?dD;Q1fJFF>!k-tF(fm&VI}gFX5UdMC{F zeB0&g7C%}8`|m;%+%EVn>agOcgPRPWOX2+>!TXhE?spv4jyO7o|F@6*e+v%oG9v>x zO|@9_Yp93+T&kQeF892f=zPv;KFWj(xtJQSu?lb)tC_)xV_pDJzLd)#)x!NtEObHy zV~NjDT4X+!XKBbb)g7`l>@zj&HP-Gn*Y0FS=0Q`{Mq|YWL-`tG*-ArchOx}AFLASI zj6)~57`wiZ52DEz2I&P~RLVq*469Lco3PY{8yVg&#%Ji+Z9Toyd}_OSc8h6dqj_?J z8Kn%jFd|r>B&|^bFcBjvn2-)T#c&sssT*a97+O1Ne5GNOL`8rhoU+q@D ze_Z*&G1WUjv+C`7&8;f!E7{4<>`u9{GySo>X;1D*zrIR0<~6p%Pu6Sf+>!R^-sHy! zsj9du=r|mPb|x%DDRUR#gw*|9$~aA}PD9)N)F=0+KK*OuK+3Z?NPbE>cv zUlK*oH$fo!J0pCN_*Y9rVrS%n1`r)hl%@gbtFDmgn9t>~{RAH$v5gdYrb>Ks0I3QmRAeWWf1lzL^5oM2=%D+c}nFk5V&KKgFx4goEq^k}QI( z5ra0eN9hFFk+|gB5$O?9Glfpx-R5&3iNmutGRVcm(j7cE7Q8qdyl^6PanOIh(mhe= z93_22YNkX~Is6C#KOk&3qbys2$(J&2Sh#Ibtw0x}PAo+)ql_pRIza|K1aLt^j)q{4 zrV!wchC(y|w=*PYY^q|yp^Rvns2q*Dl<=#Nh@erIgfyiTqT%o;4drNLQ5v43c~D!v zMO%(8hOr|VmCY7S|n37YD3 zBvRjGKs(cDI0{gS6SW5>N7E)c8g6Gg4Q;aeCSKx12^wx^WZ4-&8lM>xR&l}-rzu5XuqDvcSh@+p(J)QZXb~%(EJ8mT#MTQm+xsX)(?VXxHrQeth5@P>8`5qcZg&iJ zIET6%L*35d9>;L6^8~juJ?97b;E+q7Tvl<`3|&f zH<;N50rN2+WNFE=9M7<}W?5TTS=&}yJJ#4bSKB++I(yeSFe&rMhAW@$eB#rcPoa+4 z^5oAqJ@%8$Pkg%Jp&xI+jLfHNAN|?t8$Vh3$fp?(|15+$=BL3&f8u-ihhDLdjBW9! zw#7&FZ#T)^yo11?Ijm^HG1{5Nu%a`ZFcVG)pShGjdDDCCRo~);;Prxxh1}4kBmQ&ye6u^f zGh02QTihd?90PDG*4lgE=B%=Hz`cSy2Dc7wAd@mpa6e_g&3=8Px*ksOy|3_pXtqzm zuFt}Lmzr7v<^~wU5&G2%yELX}{o4td*lVFSZGek=t;bUxi)#1N8rQQX+j;iV!b5N} ze_a@e`Im1lAEi1bR3r&wA1@#M7My@j!D}`#fdc1zi@BI@u*?e@861p$(~$p|*W8F_ zn(JBe1+zAA93O@2i>J{+csl;)hW!^rTk`^HpwUm34}3lG*cF*?`ycEl=lM#s+kWGJnz9E#qpTWR1Mdp|G+V7;xd%E^<^FdcHRX<3sXY4jipXwiC16jG#1klr@qK- zD0Uc%cA0AOO!YbD`h&)r1E!jN=9*oms-4ElZN`et#&VXCDPL_U&C-`-8cKqCxQL)& zT>2u1KG&r$u@Zft4AW+8x0wVrQ{;H4 z*uH4T>ZBI*GHeP8xQy~>47V`SPBFwT%c-sAS!^X^nqF@jTWcC$V~j`{Nhk*47KZ$b z4Ae2q!f>RC7%5bm#B(um6EQ+4CPu_;V9U+O{0jr)F!6#gfG|N7=c{}YD*$s{*wR|a zThdX=Skw2z1m2RiN1Vyi?!N753p>&tmd&O499uU1W?4U(7Xec*xtO3CmsQF% z4mPRZ9!mOZkMe6>$`9Ms?;lsacTDw8llrYX&70Ml*D5rx7HVJ2)jqc`5)yf8OX?+$ zsRzCW60<;{vk-|KIgs+S$dmh%pE#KOEIikmz85|z^D_A9mcp6}+XL{`f^VABfZsj% zz8y$;_J1Gzv&ezZ1>60pHx6i@qJJ8wocIS!fx#a5N0gC1EZ&(X=!TH-0Vs?Uml#tc z=dQ_`B{dC4_Pye=55AU52pUeTpdl_Q_B)2-!p%!82Oa2T4%vnaJd?%V=@Q>uv3It_ zH$zD64C53~;YT%t@flX)gpj5Y;c5oAk@(D+>Wnj$jIzKSTpV7m&^=k;n#gyaL|J1O zqzs447w%$YV>(9~tHG2_jLPAUE(OUNfXf#;&UdBUC3hngF;eP0GlRkT6QPSkA@nk% zfeQ_u=|blysT>qNZY*CSD7k~BOk(Z^KGa&>adl#;OtK)#LWGUgNreFHD%n9AF9n?p zXcG$~f<{?LkevZ^iHISofG{cx%}IzTXbJ(Fs>q>?;8GS7l%3)DlqG&uF%VFf1Vuza zQ%tPXln|>mrJQw|GDgV;Z7H!?Q-+Qv8D-5TZ5izDN~t`OTAQ7Mpq)vp1q#yZ3e)O} z)9OppY5^fW!w~IEBT%Pr0_t^54f^IL9fI{ux}(SR$GDv#LDOzH)?sV`C_cmO3=uCr z(*fIIGa}P85*T@CO(1^Jk7_h>1u$|3-rKi`@ zeazfhV>(_XLV`vxGU7nkWl@?&6P7q}M}s9!3^X;YPcTEN zLyqAQ=ZP`ri9W|5>;i+%;Q=OM0On{$`yCMm9b*8+XNVIlJ~QT;07jiB$6e#VN%zTd z2H6=bYjRIadnTm_YQ{SYP>B<9+B*ke4;tT$T+sMu&-&-Y%BCph1EYohEmWiOH5v2?xWIdW`X<2D&%d#GWZKkb#rK5ely<@Gt>#*y@ zyIUXn>5eCVV+RY!Y<=u!4?g*mO*cM$;Kt9^-T2A6$A7l^v7fGf_@^r$`AO!ZKhAjM zhU4u^)-Sc{e^i_L^DW9h-=O-72`8l9R_MbDOL&>%&RXxE9SZ!H_Q1C<`QG@l{o4EPs~6|G@K|7VJsJBt7I zt(m&Xo4%{B`WBzYUcU=@8JDvI=lA>P_PM8bdd9Z6hc`LF_wCtmHp;qks0Z8|4o?ig6xx`pn+fG zs4(Co!>?-#{B9Sd2D~l-55dVWKxu*^M(`# zM=a7J2$$uf-%9BH(B(V|7x(f{O8=FCi;uxI;o_)i*z1!0uVbB$@l40M6N-_KlWU*% zIGY{o$FPtJ-^M43k?*7*x$1^{1*f5up*LLbH1{fe@4~%hVVQT9d)^Vop10vlrd{Ie z7?LkiL@86{G1VnGo=$MRwZi$7%Up*?^pSETc0vV5W?m$eas=(7k3dIcIE|Qaabd`% z$f+-8X_umau{hUUf5cLM&|G`iP_xHWy~ijRnJtF$jmEMK#?rNhl9h(iOhZY?Q0ztL z!eTGFLYF?zq0eP`nPM2&4G1b2J&@~4&vB&Z*>yQiT`ox(r=bd63>J^Hxs2E*rr3TJ zV7sk!Q08I~aZPKPk)dWWFrbXgX4CX0;}l7mRmL%yiwWt537L^03&TWAl#3CNDi}_5 zgBZccNG;3~E(VBMGKnKpC&dsOiV-HOJY@i|TBOTpWMIadx(IXNwI*!z%ck)-hc~D0 z#ckS7I1)8&j&U(OA`v|s2Ois*_Be(tQXk%%@@SAPx`Y^UL8a|!R|b;4-k0=Im-0iP zE$MwBBcnzmQ>ngHrhT<2`K7$%=MN`84Ksh19J#SS`H3CLSk1IA`I&uUa)gjd3Xv$C zv7e1?rWR(M;A7HuNtl$`1K%;gX=rmAJ791q<(We%&n?08Ul7^T1rDZuF%G0X10Nrr zxIg8&1F5imwnla9sPerU&6}l~n}yn!52rp4x9(ud^ZQbspql{a?!{Wj!)J>qNV zV2*3N$TwZ=C1z>B)l96NDfiC`YDPk=mk|)_n`%PmXh89qnvC;AZRR`;szRqLgQv=a zr{E>vMTW0a#g9Noznc1h3(nuZw}=@BB<&cuCGdcxh2xtM#QKX_p<0a|<~gE@g^bCwcUSs~O+{W4lgWk(5*v(JP4sDrG*GEXrsjqf9DT zf;m7T}I1ORi~(fpwaa^_mjyXf|ofHfl;ANG{u(Qgsl!0@oZ)sbPYqIw!Rz zk5Q0XTbL#Ynqm?(>2-jZplPU1Z>Z5V)Gl%3%T zntn?=Fko)y2^!#prF&TFXw2Odq8YdK!S>m(#-7|oWhR(o%! zy}#c+Fk&B?u!-wKiLGror(L6GoulVmW9JzcT;s$=_ZTqm9tYsjGw!jop7Ar@@v|Pb zXcS}CJwD?>rd*@bu5n<>4NOeB1V@9KhU^Su(koFjZe-Ro1w>UgF+p?615BUx&LB+6 zobh3a(-|KOka&*f4AwVc0~*ZETne5$9XLH7ItSx^&&fLHK(?cE4g9gr1PymIvdhfp75pJD&X6&ZmB{5pZN5F$A7%xv7fGe z^vA0oe$w+!yZHzElK;@L;_n2vk`PuTe8$Fth(Q-aEE67GmJr4Pe<*=L&rJ*~lwn13 zczIe_VYscZgcIE11YdZ0W>~QNX`1dk%Q~2v>HbVH5>}iIFZ;$n z%+_3b#eelx-?f{*#ir0=UdF{E!Snlrr}lX!w|mC6x`#Kr1|D$staWs(vA3_XwlFEv zlxbfeHsOar7noSHXGcQdN2E3%6_T- zN`FtX-{kN@0R8F~ez()Bm>S92h`TsIabv1O!!pXMiUdAUjALXbVf5Sh6n1fXmdAN) zdC&WJ{)um4qA5wO%^{zY&@@WckmWxq*Za`xX8dc$yLW5`@@-g%l` zzg~Cbs$%TBl*EDSn|7SS5=bll{{widUbung8oRX@Z>;C-1n)aI@V%|@ys7ZLp5T28 z2Fu)RH!j}S6`t4P<9Rr}0Ul#$sgWMsPFgv5qwdrAe#G%iIBiLWYP~|ipBL%~9F`WhWg;L8koFN;q z!-(C~C3P`89fLYXbTM4V`1F0WloA>l)=FlBadM4uY^7l|OFt4@pv2=aT*uJbNnF9m zLNQSyhPjxfM9fkyW&=ya05J*%z(mYlLNPK6L$g!qe3glq$W(S)D%;|W_v&`t)peF3 z=3;g;_L@`oV{j$~)r@r7EU_@MX*L3raIxlvP0m>lT9~54WIkZ(^P9VartYAzH`6fO zpuui3-AP~RNc!?|)qAbVFEJzYR;~JtO7*RB_01CPD}~w@^OIjZl8mAOtqPi#Cy%5& zvp@NngDKC8=7k{n5? zzMtoRtwf8Pdm#D6!`kO?kop4L9QdT!$uBjl-W^Z;=7{p+LFLCiNnh_)e!X4&KHT#< z)thi*3$!oiB)@Plnbk=#pLH-`9kE|M{C{F{lNuX-LuhT>JV!IK#n53*t|8~5Ru!lc1-*iTCb58Y3_VJNc;pi@9TQ_}a*1SR9*~kG zkg60M4Z$6aAt~RiEC6Jh#-S`AoD7$$kZ>yt<7yi2Xfjk0K|_uvOI--8))cSOqM#v1 z1HfRDwro#w<=&L4eaTe^lB)p{G}$S&IjJ=yXfQs*1Wi#Y37Y!S)OzeegMy|Ws7^;g z!|e<}c820J1SMzyF+p=olAvkr0z^U6Yia}f%*O#{XM_&H!{&&fp%e@ZhOFIF)}A?A z-#N$NJbD@AqI2k?edvsRsMB=3$K26wYJ+XRxx3fWjf-}(mcv7)ZU7E;n!6j#?Ukn1 z3WI>u(E#=4jvAJ!sWW%gSvqRX?M>#+7EAYlrSF7oaKdqdx3H~@v|LIe!Arb8ktQuezy6MPuD;G&9%>* zc71bi+8}*trZ9#T_OQZpCn0ou`RdyV4}=w4?+OP+S!rv5`zDbxk$d~^@Oz2r z2Kb#>o$Ovz_}@wJzH72g!g2Vui4R$;*^eIImEVHDJoyv_yl*b^+*0^nUxum$jSOrP+;1qnuPyVyL4gGKYf?l7a}!8#M_BH< zsc_v&bUfn0BBoN0q1v=WhvwehQS^xbQuesh5~mw78bem1rB|F z$WWYZt~p?;I$*41My6tyv3$F}bhD{+qp@VYp=gbvFw0PoVaN~Y@;&-Imp;#qbx9a| zvFnatfs!HDq0cRKER@?Gs&HH{b39yXf2hKCt;F#V3`!i=V2cCWBDIf!! zTGI(M5otRu={u}xyR2z@EU7!Ksrz6Iv*kU}>n;P7gW&!p7O`asOw_TNOTg3{Fm(qE zy*^XN?zF2zXk5ToPku2cSr84tfs|+W zGuy%vCC^06i*SS!qb(SuJRHUr_UU#p?XsJNV&po8V7FoyR>_$ttA*P`$uDLnzx0JT zqJ1$gveP)S(>|BOnit@6Wow^9p_BYFY!ARqOMWg#`^quZ`vXZ|?@#<%m+~vE%J*Rx z?sJ{`ts2dnW!hUs$*;ieg*zjtE3ARKI}vLGP@9{(%Nl7_lMX9)UA z^KbawqztjoKD5_12wU2P@j>Tku5U8mJ6Y&OF9TaCQab|_`_an)%+btAy$pxEOnDGp z3?Em7&H^xy*%>Zqi0aThP#d}+qb}nj(2#YxE_1#i18K};re@_uxI$&d8F))MjO>ww?iBG)H4Z$^y44I4JOOH)kmBh@8QiVQ6mB`c#+8G?HlLYe;2X;a% zBxM*mfGSarIw@BxfdmbAG`gfb!jP0tkfSjx^8l+dpRgz8OEnD_G*U<7Qxy&K|uqo)D*2!7p>A3Z_$?RNUqqKT*2*(AZSu552sWeNv-Db8KJ%@wYDgg1dR}% zDNhsZj8xEYMd;dAd0CB-FG-2uPFdy$Sw|5ykx=o!#FY7woZ9%C0F!idi3-mJR~L2GzRp?){Bb`&(^Xh_WnxK04) z+#{l$5ny##W1Oq*ae(X$cQg?}y{Cp~wu3@pxe7OaL7XvokZWOO6J( z5IoHXl&QHGIs@YifwLEJW$x2`zKJSV{|;+Qma!K82nOH}V)$De{^lm&Z)n7dQw}_C zWq*jnpV#-f&wai)!apcBPnHt2G=$9cBxN#e%_}X(R@siOwxgQq${78PJx~99`;DJ( zfAS|=pZxiQPyT%4jh}6L;l$%%iNrv88FRDbME{h?p?9e?`A ze*HK7>ED8FK=(;d_g!1cZyD8poT~c2*mM7tp2$oM3LO+T%UM81eMgacTVV(`EbJ7u;O%BF&9?Mh85Fc#Z*`^fp$i5f~96ogcIP2^LG@Fh7(>1R}KI0 zrf(5=#lQGy;97CU)ja>1Bfe7ye3QF9quV^gTU`Ac9bFq7o$G9EtE??>ud-|?Wil)c za3`fV7Oh0gPvKWf&{XAvpDeR5sqO`Z@2v#yJ7)W+@Y0srkQskxqKq(Cq3Mo(`Y#Rr ze$Ft}2hq#GkqS7-zFpPuiaraxD|`cRgx&ys@nCG|`<}7)d*+@W7<#@B1AXsz4Lv`g zBk-Q#>2Mm8J9Qb>D)-JyrfxjV-1P%f&v)Uu)`s`s1bR_;4}y6?69n(1#?bczIEV2A ze1|Ca;nl0~eZo70H(+YOCuR&fTR*XP{m{*@c75NO|163abEV%kC}WssIjsKJ7kesyJe*I%ulgW3Je3D&J)++h#1?qA%WPEP23K zwBAs(N{>b+Xvp*Ga#$QD+o{WC;g?*eF`H5|aIn(;aE1M`65C>h{oxYFwKCgcx$U8H z`?XTX0_-v#Dz>APDRkf#u`U3lX1qpnF&!R#FAnr^Tnx{}5CQ#Q&@cqR-~rRrdeg~u z#_?6glUe#WMg|Z?%#to9l8A{lGU>BX7ABsHS(m<)h>4qsi4`$XMM*pn6RTr{`D*Mu z7In-cFu)0L>b2G8AyO3pNg3GM()YpuC(Nl2(;7Xpxilb=FHx{b`{Ps>1E;ZuGTnZ2 zZ_qH%ta`gQ@he@bkB%!pXvOBfUusali>+kTZ&YYrCtr}CjA;%sDF;)ZLF16}{6Xyt zN3<^$0gTD8PZ|#f!j)sU%)odC076kQYsIoR*|3qa#N~# zeN#bdbrG(vT~jO;H?jCkEl`zSTdk`DxS*-m0SyiM#%4nka8%z!cBaL6w9SBUK|=`| zvNI%TdQELTmg5B3nGs9pq@{b-+Iz~@JBwkN-qUvUGN-M*z**L*qv3+)G5-wkC>x`oL0>aNjs|$lKlhM-b|El#$v<=6 zH+9xKdD<@|YtHy)&oNGWXU_WPP6shNBP3{ixIIT|hJ|Rz(U7J&A3RN(=2Gy?q;IOt zGhE^B-EBLTVXlThqv{|2aOzX*s#*_15hCdn%=c5?PSYOHh z+PGnTt(3R%tj{ubzNuun7o~c0C(r{ew4m%FdMzePXOaTZqpb*z?z~TDh862G=sAFR zJVGA-?TYNGdyKobwPmK*xx`&`6%Oh4dd;KgAH&KW%H-8#m#Pvhv0nq(R< z`IcnH$m9)nVtAZBRqI>zS14wU`>uz7>zR6Q>VF|{Ipf>db}Q;Jd*|!f6Bi5!;S?W{ z*DDOxMy5u4!l@f`#(D3JO}0NK=kgQH{wRu_l-BjexQJY80PY*CPb@lh>(IwHAdC#% z-N3M+o{tt4v#)r+Xg^9tbbT5Pe@6L)hDs>OjY+#`*A)i3`A?72u)-foZW`K>)Uc9_ zE-;E_`yAc#n}~7mRAoW}5vm=<>T#WuV<{`BuL4yh}gHvfpEuv~iLwFR0?} zA6ki_xxUnkD52^_lD-V~gGcfO%pr+yIMQ9BF~RZzMl=nB7Gg(=tP<>o-SJToRxP%! znG~P@mcpZ9TrhMIl`$wbFHa~-HxEafS;=83N{QXigOCE7_jM*tw*gdz*&K(sD}pYJ z$%~$S-8_Ht&38G~CQ_=m11#;PF;+tS?RB_>o&7%j>(U6#me zdLf(!7B7~)36fSElp+S{eCd!1r*@Px&hL~9dMfPDt9ge2_AT2-1VM)r`OZB((MX{( zi|g0$>P^JEpBf+E6FT|HT58b*q+ZLlD_fXsCwFmmCP*EsA+P?xMc3?x#+zT|`<2Mv z%U0dqLxv@j(V~NJ=k^3&FFp?~OHuOh8UXxH@OmC`ZLEteD9`ctyF$gQ@kuA+zs7~u zmIP>}+Y7yeYLZ`}Z)ZA|Ynd?c;L-<>!OM&xmzW(N4wuzTjCyneA;ca2&mg;BSs@5! zJciU@c@5JUFtAgyv++Wra7b2kJW#)B8_-Npei3UEyMab^k3zGpp6^3v%Jg~7F+%M% z0Q7>I8Yfp~MWcSCJFt6R6TW){<)s(X+4y`&VzNv4rK=w#lG-3fjy@htJ0>&1;9k~6 z8Zz=}Y;_NCRSLRbi_s1xREtU@=uX&Xb?y^@wWeUm3fmp7li#^@)c>WPRb^f$KM3!I zUTz*{eV!Sb9e<3+jRbUrz+h6%qr@Q*hfKhi#^aNi46uU(h~(j~ekT?2n|$T_mCeT_ zd}itj4hT{*8d-;NA}(1|6SL>DbX0=yp31Ulj6Eux#^|xF87BcGI2Om}x<7uDO^RZ? z4C)Q{Kye`Ivza7=2_c2nFUHP4$HwVPusbg6>Nka`FMhBt!TRd(%@!jib1$p%qO-^7 zqR&vhq@>USQT+8IW21dmxSan#6 zyVnMT9}&>^3?|xKg(E5~dIzgc-bCOqo@KQjeQw&%YT4|eALd#~8Vl}~@%uG+l9wmG z(G~gC`w8{4ghBw*u0N0=F*Z$y%zYvI(n=}jCWQPjAv(Pd;dOC$tb0NN34M4>=tg## zdgXWImgP^yJMvtiC|%wDUe(^Mf1!S1YA#u*m)h{dy3JzN&CSeL>4iIF)tPtLQ4R0e z1%9UAqVc`aQj4T9_Tn;j`SKokep|9)P_l6r);tTV>=SLAm8qQ-ZS9k+U6I7Z?ijhY zA-!e?ZV0j)>)2~e2Ew7OkZsrC9U?57tNJgag8m%hhi$~q{7TG1C5umfy(}i;C~j(T z*kI@xIjIabQ~c;<(8Hj3ZxabDGe^iyq}TiuLr?nXBbu(r-)kWp$DCii*~^o7eifIBNZ`2}56zByKB7qC!`pA zb%iM*=3JWyEX^};@(%rK!>lZ;{!zhA+;ee8zgi>D?xMb4p&MHye7EsJd+1 z_T4}V0T!*U8L0zVL9Pq1mdL*1dl{b`-)W`XdZ`zCS-6ax`o73#N3&+p+mlhtFj7sY z-8VKnVT<@V+ln`9faSGI%;a;sL%!iI)`=fNhxJ5|0~b$pEx2pBU&A{chlGAe>toFe zpDM#BFxVsUG~%EzCn->J=;$lPvNt$Q=2Jh~OCd?4x`=7>9a)fHl;sLf2wYPJwg-gi(9I;bT%^o(KbU~Js*{t{t)_0xgu(?+NeQ14olX%=LS;ylOF z{d6$oP@KwSeh3nU;)p`&ORdGEBw4y`y3vKV#l&(eKw<#`6H-XrpiNW-b6MJ$BKt+u z@$$QcUv8&=Ki5ocsK z6K|3tf0Z z;UqvlTfg3mSm!4T@K@s#7Slww9VUr2O}#Al1!IcyU`in47*v-9?#HKgd+ zxU_}7VTN`UH4Z`BJ*@g{Olv{eNtpd_bk*gM!G|zDhF9X#mXB^1O#hl$@I3$FnOL|6 zP|tRp%9F!1C)R|JYM8#vGzs>;3v39z3^K@rYn+?^a-k>T+lwh@Yf+ihj+nG%M~q0I zM(14UDBz_ObD#1$aAN*;16cIn5ru-zZuKq%zqCP%61XS}yvpYwDp8i*KFBSpuwgr^X+1NOChE&bIh=$LGBASN_LGZMLc*Ecg;)_I_*z}E#jZrA zi>qfHRV-hAT3;b^s%+{?lJ8qS{>P6oQWO?eZY=eLPub{0DtXhAI-=FLBeXo9#i+e= z_P@3N%y~Vof_Mvfnr2h8j$iX?Oqm6g^+b>j2ejJ`Y zN>|>!0WGZ&E&qgu0JG@whU3bIBlg;w?8Ddb5uC!Rd$;+H`MdUpyY~5@)du-M4!y>< zvWvS+W?GZlea%knwU9%zozU>2F_MvQx(G+ZQf26R35G}ttr_Knv9)9cy6n&?nZ!J$ODbL}bJ9PhI>z+`oPIl}pAMDF=S;(}G#BQk#4QlHb z2AV5}(5Bo7uXjBuhzEBBaj~oFWTpxVY&6-{X68@Iop4ssR{wS8unggopkbG^^PTyS zXrZ)&R`VP+a8$>u7$UCX^I{)hp$-vmIwTu){F?|{eAvCKl|irEa_rRp6LPA%pTE15 zc~*5lx*CLJm-4Igxm~)Hk*M3!N^tbY8kHbhEb+&)@KU{6D8u7T9=d+jP8Tq^-d8u( zDel!-D-(!00J$t$gV&Z2r*n@u+_b0}J=_7Gw={2!?$q7)+|9@Y3(+?;9 z27^#`aYa~o<-diJZ@mIP70uamU(n$)N2H}`t4ndRv((di


!ngOXchG4G?N>;nx zo-JaQ*dz*whqHf*U1NZ6O0W;KDeR@~?(w9sba=cOAW7RQtp$}rNvtdRqTitL z-x%KNLBjOVw`QnjnF|#(x9)W)OQto9Iq@Wzi`GFrDM-WHtoKOBvs^Ki8bNZf0YLOq zPfTTF_JMW6^ZT^(8-$6#bhBP@>+5VkVNu*fs5*J`r@R(#v5U}y&Ci=OtNm-6Mnmih z5wu6_+Uig5vY!h4fg?{+mY4R&>WFURrrG##GdAGW9XHM6Ws_r{KJ!xXJZP;_I}pDr zqe0B+yHQDVC5n}G>;R1}Fk##Uqxl7+P_$9#HP;E#9?9laBGVlBmg0q{RUs<=JGj`( z+_av3>xKF4c7 z{5;hB3?6aV%DJ+_8@*E?LNu);j8AbN(S5Cslb(rb>46td2nlE$B{v3SQ<%_y?smBq zQ0ELYpc#<+N;;>dO=htgV42DFk#$zc5V$wahJ|mngvN6v@!dc&8uf9*S40K7hX_OROIh2W8T=mt$sNMMxw9|-f<0HTGH<;!Y z>+FP)*`!yT2>X#x@yf~D4@(&0>v<=UJd<&INo=Y!R;Y{Liru|J6kT#0r(G zlHnpo3|>wXi7_?*FU#& zqurixxu9*^hb7%Waat)xv5Rp3OSJ!XrT;#&1SDr5A{yi{3hf_Xl@*e93!E0sNj=SK zq-|%b3uV#Yb$60>FIHH}ez@w&BKkD~SHz3hYk2Tzm-LxdwU*Y+fVX9RT*}UB%OzETBteec@ zMfX*$)GtQJyF-M5jkAHX456F_0E?&KDJct>QOQ(F(jUti>;MN4*nwMX{FZl-59BKUV7<^J3Uk>+8H_9 z8TolFB-M%M3o*}^-paxdrwxB1a7GZq5PXTnhcjC2d7#Gm$B^}p=6|@f%(zJK@sktC8N_T!e57JPddsnA6;36 zKGbY|d6O}-aqUC)v9fJqll0E%+<+UZexmYYX(n&*+34!vjT76oiP3gL@}~EYP0w_~ z^$k)h?OD+W*jXEPnaw?$<2$39*)p5E9y)`E`-`ErAeQS#R7+j^UxVAon#xM<+I|fL zZ1`s$OP$H}X8kgb*f28izfszLN4+@ez2-C6+Kcq7hb|q8LjMu*hg#k}KKS$QTJR)Y zQ19%+_Co-1>*L!e$Cj%+tyFhBVrPe|@47BCquZ<#)W-+Y2J%7%DHSAB3&JV+Jp-F) zp}gimezDjvfp6Bvs0@Ofo` z4RU(h7+i2^kD=+V(RVo1UmwjN82g9^lb3>ptyYJtQD4Q*OuPF85gk6pi+atc7?GyV z5W7(iWaeclScrS#6Cx@FX(O3f`L|6{%GfDbo>B-25h*I*yMuQl;+`vRBSc)aTfutPcZOuF+L-sf znXs}u>y~0$QJ3@nkJl~BMcv!2%CDb@6#cT-ZZj&A1GwRj!H@Y9c-tu%mkI^Dhlm+A zKPe^&h?)&`L#YAj7}3EF-{fAeAFv)_C%9St(5M72JS?oZ`_Y+JFugU$64K`vt+ zKNXOFXYCSApraJIYVHsm?uQWzh(-qV*wS&&FI|NFRuH+XB}oe*n`?MS9@%sShXNSd&R8U4Pe^z?@H)+R-oa{LU`; zX5(|o#mLOfb~xUOam&LajNrodJv(5$wnzezIuh2C5~2&l`pw1Qt4An2WTw)w@z)1> zcB{J`$)FvdV44@hPjiUN7e`~;>DnPYvz$^wp9vxS#<9Gzv1d4;h;QB`2aN6@$13;I znYvru{h{xFHuIScrHqF4n(?$JIVlPqLSCnAnk&A7At7(1I9-zTnL-`ybG2IOgo5zm zlO=oH;4f=5rIe|DBQgfC>MF;+Qre-*sRXNFJg@t?g%`l8W7>X`>?zsvxsQK;PRpE6 z4mt&Ycb0ex#BzgBkg@XHLc5~OwII~~XHHp`UK@zPRXY2&_Si`E{^z*gaUSW0KG7vD zs2NNPIw6FdB+OF!W9JenaJ<)NQ_#nxZy_9(EmHXFU-9uRJ0jR2B+8%N>kFY}@d*rn z|E{cm=V4;^e44r}B9fgfmNtT^Bcz>#6AeW76l8sS%y$NNaesm3Kt?*3yWZf5YW^XOJ7*|qb+P5-&nFmfWiy#G z3_BeYl=n$0d04l31|1ABtqhqx6tM)RXS5e(tTrr--P}drbdL4h4TUlKp0K>$doZ4P zWHJ+@;r$rq`G}@-klLBYDI~SUSNYVM_VExf{yVR{yyI*>_-od~v1YYWpLnuWz8)+| z_^wk#C=&Sh8(=%={AT?H#KYJkKds*11z;YkUh|S`A#q)iStzQ1Po)eld!zJQtFI}) zr`!AeQ)>Y4RNlLtNUsfd^+hB@&2^OGp_ns&Qtq*CR#>c7pPBlDSNK97aKD!5-VL+E zgKmV4awk2E8+%jS>yndJ~v8v zxS%Waza}|bxl7r~l7T*qV;5T2S9)cgzTT}oFz`Qyt%Z@Kmtzafv>Sd8+KyZic{p?i zuTDQ))@eLkFZQ-|l-xM`Pu^X%Io?TnkpTua4GfAJjp@a3J)@+Fh^2@gdbS>UD&VUB zld^$!?t|dNr>ZXF)-Z6oW1;zXLqq4GcNU!4(duLIgE628+8~AKR|A5%`5 z%p>9Q{dH`P4d7Yu^3{(>ygQO0rQqtq4_&CUdc@X-{m6bLf#Jb;mFwL2r|ci-#3@bT z^E15oGC%oO;$?$JT@wUBD8)$T7fwy_ip-WCO6WqS%~#N5BM8Qy3egK8!ACnw-V6#*gS zYRYo#xgMZ|7vAjj*?#Y{xEL&>&Qpf{UAQ{V0mT4 zQX9&ct0ydImhFbzCVz%^0*}}QIHZ5U!RV*`=<&{GNa292{oC*oUAO+_(@cgqf9Ky+ zih)PTGpN^>7WT!;wrqv(FJG7_oj^xoV`BN8Yy$A#KI^9T6!3%_En~k#_rmJCo;63Y zAvhIStZmpyZ#AL9u+K4e+v-lH(gN3m4L z7V!UkK8jqqr2X(9aw;O}_4f&t%-^QR55`tveXT!|+sbZ59N-=nQ7nzY(wW(l@Zm8+n16Y4c-CsX)Mn;w;;$`%nN z%K&_?R_eeoE+hxouYJ5*<|3;)Ggv~*sPM^pPp@H;*g4Bw$2#5}v`Bf+qj4{2lcMo8FZ}J!i`A`zBpUrGtis*0km#=W`<@cX@9cFy zhVWn($v9}Yz4`i2C;9f!^>DH0r}HD=vGb?n{GOr$kLcF0Yi+zrwTFNspix-kn-+vtNh*EUC-$@|sfp=^c zX~iNeETz}=aY^T>&^BOBT3AZkjYhT$a6DtpqiP=b9jeZq>&(@y%j_+)bOU~X)3ev? z*bT?ju>di*0#JGZY2iJP@xn+)Gv(VA!oASpJc#;KCSjoBD0auY@Y1lt=ajKFf68Q! zNSCx4hI^FwxHX+S!S2DK#+h{0Ly6W4tUeQ;{nIn1OHuoD4%w6%!8q}(JZ2Dce6|1E zAN9JMQLMgun?>xMg&_4YoUy_7?8P`EtlnpVHy%Kaw2wgQv^<~Ejw@F10V_T>Cy}fI zPxRavl3j0hP)CxTH(ocF_+#>Q!GgjO!c_Z(1nLG7{qu!9oK^Q*_+DxNzpH320|~hc z+@*0Md`q)fD27WVd_vo|w}X0do7jQaL+Lduk5le7NI0890;dXiR9d!*C-gx5vDVlL zTgHpAa6d1q-|1 zFmpOn)BYt=kfFr4Zo=BUnNp>$aharNmlyfGc1jQzOXw%(dDs(rM1w87guXwi^Hb;+FI6W0BEeOfU3y~+Q2 z^+M*w&Cx^2b(vYu6U@5D{^Xk1%YYtm_oipGGxAC3h( zxUJ;AbZEjOMY{&22{?RzYj$b@FI%>iTt_W_{`DZA1P!zoxTP@x@wRTZ>17CIQHfOv zh}HB(X}GNhw|`~f!WOk8{(frWDZq-tZq!imiDv-hQ5ANp+EZ##MhW6K`gTcM7`=r=f9W#Ol z;{ipW7^%zC9_1EVpTMuL{`9u!;0C|w75b+bY23uyBd}vG7UUiATCnmhQ1)i&b3WfR zgs`loixe@N{$y%d8Qnn160D6Ku2OC)WOVS4Yh(A0gBF=$q(@`gLO zu#zC__opOTVhj4tfN0G3pbubdRd5>XnJtVz@DZ$u{n{ZzYs5e_@eS$Mr4Z4j(p$Tz z{XA;wL|bitpkSpb8C?fp8_9?x%3bne*}!d*bc1kNYc}#D0af95+*8f=qIH$u3q*L) zu*%YjAY=n^P*R|ciUyJK$x83viMM;nZRGhO3OuZ{q5%h}@P4OEdetRCPnN$f1mQYL z&r^yM>>ym{CE>pjDG1hR+hT+)3tMaUODV)&A|;QN$3obpm=>_jWB<)y@nPTq`VaE$ zPzUPnzScocC9(UbqND5WlvH1uk^-#zBRD`+(`&qNvOzrGqdhR;trlXOvtXDTOu@i6 zjsH!{ccqDK^@R(90UUI$$Lh(R)Q6ze%%aQT4kr>jNTA`daVFUrRJr@Zw`bwpK-6PRt<~4D+26svexV3aEI-bNEfXLF%;ut?p7%nL&aw zKB1H2rmCXCwmA?d5Hr5*Z?{pIfTI;Ki}G?fH6Soy<4M|2e>7BXn!A4%aX-S1DbE!V zNAtcHB1G2|Ux3;VK!gzWF@^oltn=wDT(AFr`f+Lh!z+U7T^mHu_MXINBTox7JLuUBV<}Vyq5!*oHi1M#UH2hsk9;iK1@%O}InHf4JDKU;ldil16<}d{I~|hYh&|3;tFWXa~ge-{==s3P`?oO0llLF zhHNBZ^s4urG~mS8b|SO>-t~nUgM2H-``eS!YVW}uT4m`!P3;9cJPH^TySRxFz6Mk-qz;{ZZQs4vM=1f*gK(8}!z<|2ZuEmJ++>zv)&JlC^5Z?paP zwM}o4NPZbF2@WrQ8H-lV4IP*5t%)HX@x^y1!w<7GuqS?fEhmjOr+in_lWfkJe13U% zQ&)A(Cl7jeAN5cF8#Eb}gwO6JBejk=TYm-#J`og@kd2`xTzFyZg z_-|LU^Ie#*|HY`lOIwh>m{;rAAQlv`HbkJZg-HMn4m+XwdsOcl_YIa~_i) z^cBF-sFxE#Kcb%KSgAPRvq~#x68ej`P6#eE6u1i#p0VOpo!o54^!fW~-1#4Wln))% zh9p48iBQLXSaO3BVr8-fSj~++4_A4fy6}7US+$F_*uTG#)L>gAnNzk7E;7wza;}k1 zjRtvKK2}ZH6iTm0a_Ks}h$2%J|NG2oMhL! z3C}jG_$-l8Tv7e)?Ga%T6rmFjJ;ZNw-5pSSP8k-*k`?7)g>R8i|9OrswBN~@_kbhl zLff+}@)IyIJeXrl2mt3osjc=f`JE95GYV0@#MQV?*fzQ}f)P19BmKP48sigG(ji## zP`*h}CP)W0w;?6lT?3mq03qA`D8paFp4WO3=?{!=svP_$egMNG%LSAkxSYe$fi5}z zkY7WZ#;@&6QyF}=v|$z)(i9)n7u(JLMwpA17Qb3g=e^KOz9}^0SpX+NpQqb2PDsAp z`doCLof^nT+FbQK#<_IineNVKp7&ZhM|c6V3l>in2BBgu^M}tFusIH>;@Y1siZATS zOhd#Lsip9Z=&wf^ZR~*MnMCZ>3{LRTs&Ck_LylVpmYC;S{9(75WUn2$9;{|X#9i9~ z*|ipnr-^sXkEu0O8`tT#=(wk>oM&Ha$L(!JB?@Jp(*rIMsm%|HI8Q#=K`=^LNH$(X zNNC)~f3vMt(Ld^*gpY4&0wi5AZ#g&dVX?fR))-PU@#jG_T$Y6h(lH{{k25TyapU2L zTZ3<{CiePhT8Rw-!0!Pw&XgOl7Y2s%-srK%X*e30jE5j1$lJ4*nPZPo|9NT1$ByiX zMtu%6riD>k&inSIk3(a|@g}K*>*9i(Q`2YM-*w(TV|ovN9#d*iXsbAY!rBrW> zS-M|eahC5!B8Q)OWX2Pqm4P;h;(FVlY(_Z321fvP5#ssD7GfR?kBQHe)rFBr0sO?# z=Z1q!spHR-G_JYVK)xzKO?}1qBuj!r$r^)bJU$_iPrx%*?rRhiuY2yY%E~Jn)8hW| zhAx+AJ&r(`Q`_1A|6QX{>vjx=w*Ty}=Q?BpPfn^~~sT}+gGCm@;%V^o7alhEY;o)V=cX*23 znm9)|CmI|D$JN@x8{G~a*|Zu;wKn1YX}tT(Yr}E0X0|1De9()=#7&@iuk|wJ?|zg$ zOE`o9llwQXIknFz+L-oTm5=Y`ODJJ@>g5pNlp2BlUb7317Gp= zL&#%)DwEUEwKMNBQyq4%i^mT&J6OatK~ds?RVUV~Zx3B9%2xP}e)+^heJ|MN|C>X} zV~p6;G69M7`e*0r8{h>Lo1y{19JWB7A8%(LquZuJTXA$}{h3TUxq=US$dM!_wd5PuUneJl+-_Se~ zBJc*MgmckU!IDjMi$;xuu-zJF^>Hnz!+_$5?~1j>H460#`O#hqPDV!~G_FEA%zqS> z+;O%|kiTQS&gYFt*o@Q>mj6Ktkh3?x-C!i*a!N}2>yQYeB347%^`{35lVmPj8zS$C z_}NV)l=O-o{Wh1AP+*LSFj$h9=^=M{tDck)F(X8`UUSUGs>YQQ3nXX8`Pp+V1Zff* z2^8F;)54i3sNVDeZvsR=#g&&}?`^|KIKa@*Q)CDptER3iex=ag(>}BG*$P6G?gJgV zXVQIFScGrgKhGtgV3Zafp5xIhMqaqonL*!vRHgqbh|2YgN6}RCAlGcO(RaTn_PdE2 zfB1wi{v~qFP6DWk|7P4n zX&;eqQYhA6`>%oixZ9*J;!rQ={i)_61|Kx^hlUVWRhLA0pS1BRn$um2+Pg4vIg#xP z7cE8s!jizrrts&;s}I)POOvmE8PK-#gT70_gj>ZIj%v*uA30S>MUulwItqsP|E@ZP zt(x!V7|-grJWP$ZgR^@^Ynfib1leWf zHZ($XHX28RRhFg1c_E)qUN(y40!Jgy z-V}|O2Y=kij+wJw1pX#MUoy?|zA^9O)&j#>1-rZy9+W3u7&ifb&Z^2{t1@YI#QI_A ztwLD=-L8$jb6y?=SixWtW_ie1tB5mP&xv3!;g#)z{HMjn{+CP}A8JAgNZ=v^9c>iG zFrboD6!4>pFsY4h7E0x=&m)5D%=6${za>%cE&)3Trjwn1-6{s(CP3GfUR#g&0Kxt2 zyqs$geZ$jp!Y{Hk!5TpZG7vjT-hJAD-YL)RPsfiwfFm+<48Kww|FkIWFt?c{?Gw5- zda{G3_h-J}@969ay^HJMA1Iib_LWt+NgJSp7J@Ue9IALP3{rYQwco~6d8UOF z0nl#-^&glrfums@q92o1yr!s?fJ5Rz%s97AzqAJFY=wR4c9cCh6TT z`d&;dl};-4Ntyt`7lEJkpmQtUU*~WA24hUN-;dUaK1+Rf#kX{B;xp*8m147YBOGU) zb^q$rR&1^B+uKJgAP(QhYU$eD%};tel+D%9Sxb6%sgjX0L>zao^-tS6BPG{9g?&7C zJy{^uZ*@QHXrOS-F$edg9?m!KVJs*C6i83 ziV)vP4Sh`Bfx&-NQ_FuQ)iwl3cB?G~9y057B6)UZA8<$Orf$`fk@9oSuU`E+S$y40 zz;93T6?e`~!=b{_m_}V2cJ9uDrtu{jfEZ^&Nb#bRWm#tEDbyzwvfr{>abD^i0ue?~ zeSJ-wW6Q1iTxD{};8MO}F5Q(YMOS>8p9KyankoQ0;gWzn=JDN@H$oXZ`pE_PJDNeN;5jSo{Gnh|6Vz*% z%UHjlX|$h>R26M|1<7H>YKm$>eQZJ?6Xa54^{^wm|9vGBvT@$OQQT`gjSRmp=$l0> z-pGk85An!TUga)%xZp0qmoUr%>w)FOzpRQn74)WiK+W9WLypVExtWjVPw0@i^8L*q zWo|@1K3VynZ!E=q!y;~1+;5{KYi7Q2r8cBBF((VS8nB4Rk}WF^bTjVgSaaWG^wb2|0p+0Q270+F$jeb!s2G zNZ8WG>p#mrTNLn;tc;Mhj_NhxErBXyK)vD&7>tfhkFBjFC#ek(B0NpsKyA$13jY<# z(RJgjp%&}x*N~S5vQ{-;=rvw`U{wYpd-jRj33SVs=J_SoP}t!9CxKETCy24D@su*|D_OC&JN3D9M7mx*fzH|((!uzI z+g0tc&!BTw?0Ul(kFv~wqq(=;cm_EmW{6Rg2b`AbWAtBfhOKLdE=AtRd;lL4v`b)W zWus3=Hvw!Hf5#Qe=8v3BIX-fGt2er*&o`>fr?hp?#CJJtT3zttaMLxKrcTuFjm@7G zuan*PR`x$N zHVuqS`$EDm^`v=*svgPOPHhT!6F+<~e(^PXUq3zBTa}Ja`dMv0Xi3_(2vp$-aq`?D zg&5>#%|HM;R z7;rXeyqBgTf~=8r-5ii?(5}Ebxj*R_6(tN2I}ENGn80pmr1~}GU4TUj)nhiGy|TMz z8ZjDxnI4ccWY2wxR$cDZ5nC5Z@<|ErC5KMC#&y%Cch>(fZeq1ktsZpQcf~Xl{oA>)n(1;I;2!&jk4@X@(X1|DvlIY6M3^R}Xv|`S$q#yF4 zTJWXPb2}3A5G-b0GU$LXNLJssK~35xtYq3(HGWy>HGAbq|Zduo0K&?flL zr~+OM)BpK`NHdvtE+C8#)%QBzN{KVnw*_|%(l%ckRuU6XhN6V9V{_9}? zN?9BON=0HlbK7BDd1DN?>40iLASBy$l2aHcTVPW-0DHTdIoBgayzMfFUN0xM5DR+I zE0+ECcRNKNBGkEd-2eMe&+if5Ug%bz~bD@PLwR3;pbE{_OgQ*|6&<=Elz*e7z&Q%R+AqGhga{*RXtRjqGqpPXG#h zXbWgFBIc-TH$`N^`{w!mBasU`ozuW>Gl(V4rNW88P#^pDhvYlff6seZ*rBOQ;s*S^bGNk0$ZZbiJ#>0;TalO|OXli*nMSuigFD*1h7>FUQdkn3f>)=w0xkJOp*(lGMR+v%wf65_nwFR6GcNabWzV1ELsahk?g- z05t`OuVK@oin2lMPO+$@;V%6pxL=3l`w=QOM96A10iI1r2iH));Of%`Ivtqtq%onX z2MWMp_f9h%kfhd<5~7Q-krW>?#K%%Jq&U6el;<|7ztUqo!8rfsK(ozwt}yq9=S2C~ zE$bbA@yC#E%o!Ahd&rYf(`WV-v4o1)jVN9tU0&m1-U0_pq_X^f8;@6)=`T93Cj0PP z%;U@Gql*|IK3!=7t5U{ty9sn_$T`CWr>a8vvp{^!M@^U1AJXl=S@@=!{cYS?_|a-# zcQ@;FOC1>Y#J4tYFHa-N|J(It=GKb!p>^wMirsBY`TErn>z#_&nm`w!Kb__^FjPvK zDT>_zp|+cL`B7Zz|4vG(=8w`|Y?5Bv+5Xm9p6*|LkUxA7iB+C?Ep9FM*WCE*Rv7h6 zNl7_;OE!%a6Os>El()-0{(j4nYR|?ww%?_&ufMa5551vhu4Q93Pf>C*5_3wl)!}2a#`>U+YI2^~ni!rq!T?=yN*k{G{Js7Dz+W5`-*$+^;!Pp`LwTK8Ein zW6-Fk2bWf3^DqBnUX-i2Ku7H-pD#$-i6#GVEM;%1TU->k8Mw+N2`P+%}PyFJ`^gJ=l$OI62(l zavnn zhV1+Z)D10WS2K~8PcPLCGe@5WYyUQ1T>bbrg5~HGh=NJYsw{nA|FcZ7P6Ro!3TJ+T zLf|NGeBnMbHK1D5eBz!l7eQiA{t22kmJ>KO$c`oD-Y>4R|E2hB?N%cLZ-su377Fe2 z4a#HsPhXn?WKf``{9xw8_#k;xu3ABTVFDJucx9M0%_jlqxO|iGFnv3SG_dJJL&I&2H_ERmx#zu(T#qGnzk3v}5+ACTEMyvnmL+p5 zycaC#q6hL(4S5u9Krc~0kxCvs88jh}@mNB|KJ&#`eBPQk3DK7(dI_He8OdE4gQI9 ztv)f0p~3^qHi2MGfuhDo(%Z)@Vid#-lY6$hAdt&>`90abrOCB%+y2MaW5Y0ba{q#o#}SW~G7+1+0e!#I!5%e|{Wc)E>&WAsP|*!}!OK9hx}7GgBk~@x zPzwNXkQ}f7b40qBt6o;N*xW2uS^DRQhq6C7#aH3N%uH7^nq89yxSW*uX&?h6+oYIY z^;lM7Fb{X9cvQc29l)&VZKutgqZcd4^Cx(ICVLLCv8Zcv9-05n<5{HtvaL7!ogpK@ znf5p(ctGt5U(882pxNZsr2Y?Ex@!+VXrIbL(+RfT7a3;-p7WvcP5x0Dvi$@_XJp3b z!dutDCCvV&UGbw=8TAQM<6YSa4qutE+gpQbm<~hj@VuGzSd%$BjBRQU(j=f#Q|C#N z(3`}(FwA@M`F%IGmVLMCO?VEO@1at^n43k$FM@V9!t8{H^XRrXe7(u94pA3;vjy2_ zsLV94>tNvR6`-cR?Ft4{Cl}&H83YQ|W>a&N=s6!J(cE#@|0e>XHSlQ2HTDZAC+0;( zPqoVOKO608{OM3bK!u)?F$hUzA0&F?6F}HOGq@1}rB?KjFSRqqe~Q=^1AS8%KW1jE zSoOkF46q3`YzWr<3fw7l{~hT^KH^HW=J{X$IEj-j@}=XPR%tMD+#ejq&e;N;~CS!Q7{d<5_* zg@6JE<+p_I>!0YC`(*yCM0lC5gX(fJsp?(b$odiLJvxa#DG-%k`i&pnSu@>P^Iohnn zkIX{6ScT{L~&l{&ajGM7itg3YyW&w>N0I|a+bJ54K zp44>OeD7BcbZ$eCiOM8KCG%yJ7Yjd`RwX9-7ja3}gs%uds)FIkBYFYJ&|a$6Dx_5r zyOMO4Ykd-W{}Hbu8yNTAp`{?olyBR1u*4y28ar9CTvJS2O*wK3u}?wLM-b$JsG_Gb6q)~zu&V~tIv z%ZqWizkTe}Kq=v(HM0qt9CV?TD(LFfsxvA0u9y)jD;trG^3I@L;}|V;$Y_|{>*&72 zBr}7NvIlq-k<^*-+id1ea5FDvG;Jgm@dEM^BzPx&WcH@CbtqiR z^ao|Rd&Hapg#lb+VF1@3malC7i}_{iB6YYujdF_p-{wQ~Wv=|wR_)PXjJuN+yJsz2&mkxo4VsIH?#J~I6sE%kqt{MyKEax0*d0O*s^$702U3K zEv;?#*KgCar-Cv9WVKebUi36JZ%)TIG-!aG1rvA*Y4bTY$en>CysWCsarJ-{2Y`fv zeahm3esgE7%_|Dd%){f~qvHs@Q+Zx5ae0~0DO!#mBfjA%HRr#=?WD_mq;!jaN2Gg( z0v$gGVZl}8!2|ZWHK18++cukK>J8{dm_Sd!a?mg2M&=Edg>_iH<5iG3?UZN3I8PiV z-zRI=F`d=g>xso#c0*{#W~eMmP$*Wnfa1h_BO9*n1hD$i@ZiZ22rumkHUHx3oP)_2 zc2qBKW-IxJ{?p(m_LUFOUj zM;j$`K{FjFPK#Y%!ZOU^5Lh^-rM(fc)k4+$xBt;E={YvK_tqp}G( z!8b6^LBaxNp*PyWor+NMOeVB4oHV6t_K6r@<+ zRe3~Q#qe+2a|4~x>h_E&kYhPq6W*7aMgldJKzt^8Hn9XAs0_d_i#oMA%3I%Cm)_kEIj7n0?g~>&AFxM*<3tI(|S)}ija~F7qdH+7o%yQdS#SZ)y7)S zHD!L%$P*19=A260)}7K)V@+~$xF<`5$l4Hsgnwe>8;x2lc*=92YXwC;6z$jyK zYJKTBS{V*SBm)Qp$bxRT0kDlM?a*XoTrfP~ALm6J??)%KHs#zexcD8f?epZd9N+gF zRBkbELtsTE{3t04^RmU3GRzE~F8MnSyH65pZDqhH8U&<|LtJ`HqE)Kh94l7 z*TeI$&%iG-oZRT!S3iLU%9z*iL&=z_@LKq(Fe0K5UF_%jrAw3dEoq;oH=ctU?Mo>9 zUN$qhU8&^=bmye)Gg?OoK~%bI-oduS72!$v=O0T)_LW$@|0Y>*+O`OzC{jo}{@Q|}U0Iss@))^@VArF6u(jhGEBNUZv{GX z+s2dz!aw(LApJ0ISR094CJnmyf%G_q7KsPp-V1@@jm|{UaQvLay_SS%@B+_=WDK%F z1EuevWbV^yJizV@Lou2dIRi2$z#E4H9C}~4a!$T~<{Eq9SzIWw9+JInslxw9nf$uP z$05NUsTRi>ZgYwrv#$&!;S6NKTN($`um$CC+J?SXV2R7Zwg8s}nRt30H4tdIr6v8Z z=&;_sc!UR8En;cas<(yr$dXoF!>Yg?i5eQP zj>@moXcc9iV3)-Q@s9Ad7o96r+T~<9+9# zo^uerz6Kq#+&r}&jZO5dJ&UKxvxc3HtiTEi*PV*UeVd@<-}HrAOGf$eT1WBt+U@4jaTj_u-DQ*02H#MT zmH$c0G$9rKtwHpm{?YA~iS-UA zPo%*0KyqlMs<)9?%9kY8QSF!NGgqc9^qZnS)4|O{(H}ZU z$o;u7(;s1DWFf5m91+sLq$3&M_Rgclg(*xV=HWH)RF@ya%RM9hQ7tNus>q_a*goG( z+Sp9$daVz5Jq~@%>hH}u+sew_@|QUH`$;T1(=d=#$9K?sAMo+PiFBoTkVr*e!y?UB=pXuDaHap9PjNLc z`=1BN72*|#BL!uxETAYcHKy@4AK9nPek`yO=&;pr<+7>;nhRe0&9VG9(!6DpyLoaS z9LGm!14}d?n|CX}QD_Dg?8d*+tsS{*Ebm@`(w44O!UuB;4#4sD5-)&9EYmIvpR_LyKAcRt^n_f!=YZVz2uQ7*b8k4 z1yU`-NhkvUA$~~6a66~wkA@416eL&h7gO{UoY92K$jo%mnR1od6*sMo+s5wl778)) z@ZA@*id6k*V?8&*h`eegE@~cb*A@FRnF^Y2tAYR<4x?XDY|hhz%U5WAHYBQ>)|6Y; z(TN?Tt7aDlHO_bCOF1blDJdA!b@J`V{p^&DUVT81e9|dlh@82_utGO9g{=M?Cq)Fj zh%_zB?Z~9M3oJUPHP7@;MTXX9{e-5c%E}AoiB|p&GXE|UAM#ac0K0cS2)33bAE4>R zTUWr8j93l+&*4bPq#RRSt(Cml#8oC-$}}0WG@Fi4l`Y_TMUACDq0kCo^1J-7^<|m?gNIMb0VINvf zhbYgv{1-)^k1b!LMI)wpUVjN!1$DkiC@KrUt#ffqo?wC4N1F`~J~8IKpyI<@2M|U$h7}NJA)jegpLb z;nCBMt8F=oQt^N7gpI55RZiwELyPpR3$&G_(c=zx*cUgTqU`Iq%X?MwYc)#H1dw(+ zu*|0f83!(OTt)w5*5Q04`gq6M{YKmb%jomU_XjgL%xse@j!s~JY1kAwUY$mNMq~K< zYkS{JDl6>DQRd;J+G5v0GIz{WSlz~DWAG`^?+8GaHu69CY&g~i`Y^l&0C(q-hNM1g zS4>B@vvTE*<5>TuhBP$jSKC;_*E{8t?1@PW3jC9LMPfWUX}JI(Tvd7pxS12-V8q={L$h)c`|X1J1#ls(FlsVqy6Nupv*1!Y^R zldD}p?U}8Dur#K@rW+OG&X`CbFucKpKx@WG3~uC99uOY&F(@`qY>grjXEu}m@AuH` z$AjmV{LgC;&Z{`Tgl9R%AKWFj*~bNTD%~~DjeUkR|3&T5oAr*+@&DpH_?-(}^4hBM zxL{uSjju{i8O3kETelpxawjyCaxO0#GBt#p9@&3I+HG;bk%E9wy~U`CL{H|18g3UI@DL`lmpqpvXYhvcEe|_ET znl8mp1meV*_fZI&3{(R6bT$?}*0dK+j$5)^7TyU`_oPw8U$@1W;G;^SW`UI{$_ujd zp7y3WX_eGuzo{v&mu?|L&&@D$ic!a~BUn3~UDC>;w7L=FnlygP#^JvpeeOhjWOmUG zy;+Vs+VTZI{FzHUF1`@3V0Ns7d%T#{x$ohUh|}ONB^odfotv@FETTZ|Z>Svk$Xy{9 z9}IA#&p;9OWbF1pP0t!wo>Y{7>)l$P;A)Ro1Qzc!{IGnjd+te&;xfY8EPe0#q>KDS z>ZfuR|3+HNpIw=G6*tOr+-q03R@VORGtdxOW*Y!WgQUV^j~^RCA30|G{b4HAhu(X& z?v&FyBCm#+-BxluK|X$rcVc6uS(*ej2a87tj7H%~SP1}4W3TEq-}_Y~wraE@zO!t5 z=b#i@IE}Xe`s;r$xO}n!_qUotDrY>eYBpX_(_ZDo&C#rgyF$E%IngfLkIGDYq;Z`> zg9k{wuqOQ0s6JLUspKvw{4WWjk4V;$J!q{(NBdt|89;*)LgquQLd%VCA*0LKFz+y6 zLub%0^^{FDErP>T?}?7Z{<2_cTQ{L1ubExMHa4B!!(NvR>~}~&z5|*nYgjMPhVR3P zOaY`i)-?4~=?N(&^0ho5&zknZh_;@n8umEl3lxgTd;6-hwZJU_&JAMeODzXPLH2FX zh|2J6IGf<&VCnScEOn{nK$nn51O6Ai|6XeG7RmMvu=fJ_RED9mi0#mJJZ?=s{7 zVn}=)7t0x6xmk655-sF_dW!!l((mtws65kM`4AvVtUeuC4&>hm{<@?X)}a680BomD zS7+i^KY^3yx2JF2Cw`Fzqi`J0L?4s2IJ-!E&JOUYKjQiG4B80n=VUP=0|9YUT(o1T5IJXZ z%=VQT-J}M<6x-xdBFVzCZ8iRuazf%jE+roqt2`WOsW`(f%c>JiLi*w70C3JMg~|`( zatX@n$pI*vC~amsIT>@LWOL)#LUSJ#R4I7^I4!v3l)tjTG!vevF=88c`?Z=SDwh8+ z(MBkit^c|kRZ0nB2z*OoaGjT5n$WTE(ODD0#zIf_pr4sgwI-(NGDG@c86OX^; zT0@4aoz3xWQAM-kV+Nkzi{M?J%1_F_9n>kjO8W0+<_Bo}T}YKBskyvaL(X)RB9nRl zei_0IOq~g#|2c!J#7{=GI4Rv+1Sm5*0LzF`aVd1`XP@}&C5#GFY8Q3D2E>uDYAXhR){-#d3Q8#f%>0E9 z%ImmsP-|KfltOr2fjt{Q7OP{sQa)&;%f0DJD(8W~MFS&Cyxu$86HQh{^FoG0s;3n} zDYqQxvb=HvU<~egyTJO%oL*Q#RAJf`9A)s2+!JkxncrXL8y_`inWGuh+FD|WZyq9VX{U=rLvC87(m`SD3dpv zlRLU_d}0>m)uzk%uTPVcyEI`Iy-D=VCsMjoO)2veeyLtki3!^M(^TX)1-*+rmBK+Q zS&~ErOm3CY@ZT#3N|^C>dFZZBa`YmgfCM&bW8F$#bivaan37pobeDrot84C0UvnX^ zXzYctN{SD0!S2N9M8cg-#eXmW%9RIZ6Qkt_&g)U;0Lt?cZr>j?AWHABj$27IS8 z+rJJl(E#D}XOj5Z0Vl)H!Zu3q>)p{NioX;RkK3 zatZzU3s-CM2}iq__(A8kV+HNZ#`zYZjF>j7AmUFzNe z9g&o(Ll%CS760E>q_$7`7_%(?&?R$ZO&B{d8d(DXV^1xqKgRBra&Wab9rFYM?gvy( z`p}+1rHv<)Z`-Z9zs`BRo_{0G^P`|PwI&z6w;}0+aTlio5d~>-FhFGFq;UTxi=y{U zh+=6(zEoLD7UmJlXbE5uTfCLmJwUtl8@B6%@@w~sQPmDzA2rHp$+B!Hz~$!Bcmy+C z8sL7QATuUP*=XCR=qavmZwaGL|MGNj^?Q8fkJWHT8|%6Zdg1kajH!1YJ%IEaNQGC>)PVs2NZmy2jq>E=lxC8IVCYr5~JXx zt+1pS@oDa{@oAEaKfF+Akc2F$zXSzsSlxN&q>9<-yx>kIVI-OVq$IZ81RX`x43$(L zJ3oKe$4M_%cr2ld^dVwu_%a+`0J>Bm8U9Lo%uh5*k+?xBaAx(>iKD@zTvq)*W+6d^ zCy)<2zNcLslb%00S1R#TkkXsjq~t!omL0*_~xjqNlTx_ zdO}ki)qh$&<5I;<2_H%Gtvqi>tv|cSKV5NUaKq)QA#1weRi^BmHJSe-BV8VowManp zTe-po@aB{75kblma1k53@jjIIeKrORx2jPDE9H%b>H~&?hQzFHP=?!UF zG0jSC&1yvry+os&VRJ$nzo`wK3@7*#6VQlKGI;8@P$sI9rE7dN_vR5o_h4{xBko4p zX_k&+LOchtup61_Ap#zJs7-`#lkqCbSJI8xJRwN7*)J8%^TH2MgNXNIBRnxQaGyT^E zR9n?pwsdWN#a>!YDg=ch4$BZZA+tk{H4ofUi^oE5L(jI6vY4OJlCQ8BYBj_c6f!g` zDJ_ICE*Vc;Pj?*i6_URo_{|RtvWBCN%4bB__OG)(T_umibn5(mj^*Zf*dwEyKH~{ zwi=?Ce3xR(Mv6?HISIb!vd3hPo+5C8+K2`zMAt{fML*LdFt8sD_B;HldF!Re{n(L! z)5^9GgG7@x(wJNBvAjJ03 z9jxA%xwp_uF+edt5*a9CM!dwqKEm!1i8vjWaqIO9*(5PaQQUJ8;m|amHe&ze>2Hjl zw0mWQ{TcD9!d(0g?y&z0)OuD;(^myalnm@P(F(L|byhQt&1PEm_u47llG)!fugxrY zh0*W;|NpD4R)@$Y&VI+9UB{mTXWF9zLGs)&?EF#8JdU5OE|A?5N!${y%=l}LPLj^( z1t8z0KGzvkraThw9jMFt5rYHgUntGrP4{4A{==*-n$;{^vRu-CbgA4I+cg(O6Bo5{ z@%g9@HK%86SATR2KK!)MKjBes&h%*1>EE#OmU@8Iy~PxBIy;<53UpjvqMA&A8}cw; z@rH}<*W4<=$rl%U<0T5ZdVOYnPzUuX4Ip>BxnLV()ryPRzp}n!n^K9=;yN0pBW>0! z>A?;Ljoxvl`6-vxb;U$p^H`vw7ZeRROXKYlJwGV=E24{>a1n7nTtCR~#S}uNA457! z0`{o3xOb#HrY#3{*`=^W_GS)8as8veLQCyX5_taYEbjaMwlIxv^<06wWs=+a5LDwp zv2RqG=oK}X_Kq<9`lwNAs59{*QqFs%X1FINW<2J#j^{kln9`LCVg8ryk6*Q+_fa%M z=0`51?eO1

H)1@8SFKm0f?4T~aKu3ek} zmUU={sHc;o!N7=cVxX^7C#<_TGV3#E9PTVv4kJ~Hmo{jG6P(f=6kwtEOw!wTrC6pV zF?^;NpeH@eRqYy^7@wrge6ALNFZ4ifPVmug|1F)_L$=~5=p6I^RaDqtwn7vc%`{9V z6na@fEo<_42E}gRex16Z*9!6OKUgc{E%LYY%0X2Nlr2m@R%`xdvVH#@M?^=KWwjv3 zTgkConq89$y0xx|teD=pR=h*iUd|?F*wii#0dgFKg;9b9{knEPeiDg2waPwXWp64y z=g(LCi0bmWE=s7_Li=hNpwTK_*oyiq?aKH9jP$-p8V?at^@D?uoRiAt-exu-p6N4a zjeb8NTU!hU9!?Gmy=uH7X(u0QG5=Z6!=5)ZMT{!ur1OFlyxw!$poWnuF_GQV25?!}jMXTOs8VCAdRopYB9qY#7gTO%lk~qxCA!z;k6R zRg!)RMs+|GPt9`$!M#1d!iAYFW`%zlE_Xxg=6_?9lA-7bi&>@sj*dQh0*$|X!7V4@HKB`V&wLkS|lhWh21J{jc<#t-I9 zbVV4O&vx^0mIrH1;1*{9#+uI9Et}SCYWYQSk6fR`3QFuvaUOO`Y;z4B&gDs@39nHy z4Ln*|+34{>=^igWE>szP@R}vsV>U?`0prL1BtWu73BY2P5=H7*s}8USId=c1k7+R| z8Ng?#5X3W;Q8o+47pqlyLy7-1BcJgpxzuX8mY&NnEey!y*|^{*^x!#a#PeOdxS3%m zR*oxaCgqLJ{8vAco;O>u+DH^TA$F!wV$LBJ*kE_JGt`3XuJ2e^bU}SV6C; zi4CZc0%V{Yw9C@}JUQumWI>o@B+@&=OuWzf@5!TQ3kA%|VfNYU^X1@U6{EQ~d*oZfGbb(dUS;a;bzw#J3!8K<)|P7kll_Eok#6O6SHk`h*L+}gm;_E$?+LXAfx#h^;q2uK7u!L~{7*36^Hrv!&pIF6F8Xkfg5STe zT_nz9@@-`S+48)So@&G__jp&;wxKBf`v+TMPT$pln} zuA4$^_BhJ&W7+&h!$#QSGu&(QZ%I(Q+b~~wZ0rV}=()LV9BJ)PbX_s}dK)vO4yRCE zF^xd^Li=L8TX|o-aL($#*EB+A2clHcU3Lb_P5EfoZc{0dPzu3ifZu%9-l~6 zDCW-c5G1&b23kwZ;8Q>H4L2r%?N#M6O9kx8t$=`Ra=K~Xd_;ifgWU9?nOdog_@KS7 zx*^^Kvn+YJdYGZx#^?bVJusJyrysAq>S}Vk!N+;Ggb z^!ep7`pP=`DsO-L$A_?AIV{j{rQUFBDV*Lvz}SoH*$Mo$%sw@(V@=t)gW`SY`+VKZ zx2QR^nQL3r!i{y6KxbncgfsX`y4XjI-W|u;<4oUS+h8bR9=K*6Z2eec^M2X(%AD|( zsW-hA9f#{G#DkaAB{wkpZ#MoFTkqVqMzS;2KfawY*M7-~x^yb$zkR`9dc@R7d?xk- zrI0VkxNaqH=!g=E-W0kc-S)A@4(o0467t|_?z|^@#*z`0!Xpo6JL{A9UPOWd1T4PQ zhfu`gb0OIh$LmreV^9R-Pw8!$#preXMlPqTIHe{-&0oyl| zZ?K3_qUTBjOJ>s(T^N}aMbqlG;|8OjBorobZ6zxpSy}uhi7+LC<%bKR6nvfXJ{qHd z(Pvz@j?Eu)dwlx6XI5Nj1Mn?X#l^;#bdw=TQC~^*2}s|?>8FV{%f9at48Xv3<1!Pp zQh7QP+*tSBIOaVz8qTF2NT#EvZ{)(_pIS*3{lWFJGt`8+XBOsLrnM*mla9@dU&;4! zlzY0%t1x4y*AA00Z}}qot(sPU$Jd$rQx*d)rg2Jm?DK@=W zM4TV#tVitph`c1%w;P~Kbf7Mst6mT#QPt8GnY@0bvd*7(JeXyH67scsz53~^#2sOw z0Ywrwrz87JaeUHveOVMqZd{CcX58-I-0VKMX0pspx%MfY-k=)%3Bf+9@jhtt2MV1P zX-m@)3M$E0nM#u4_`=Ajq&JdiGCL9msf_?xa+fMiMjSCoZYg~BxngN(G^&MK`f0tGLkZ-*__ zI!O?Kcokh?awHdjxz%6_%>AhHWRy&dM5v$uV3YxZLw1x5vyGRMFTmW@XO;%^;q@8y z2q>Al7fe@Rzg;c)ThSH>Zuq`K)>{Zh*|epo@gSiGu?j6alrR*F+tw&Ep_Y^S4}b(l z^qYn=G3rF$3MpS?aTbx%D37{Bgl&N1@qA=hU(H^_vv+$)bcw!msq~YPxR1=^`s+S@ zU0+=%tON?@1Sf%#VRlQi#J0Cc{k&e)>BVg5WUGA_Ru9o+f+4ml^p4@v_U!L2NZiTaiPb)~QJJ1U zdpi_NbZZ()&<=(+kB^Egq1hT=xQB};y(-)&P8=ebhf5|s?cAVCHIuhgZKB$>AM-A) zKV%1$Q+;Jev&9HjR*^_=hnAJ&j?BNYvW?NPi`KD?30}zF;a$Zy>uT``ZLyG2Jce0} z&tFxtESou##s1M!kIAiJTA0sAfiCEcu(xdFX<(iy)R;@;_-=_SzVyz+LIGWV_T*3L z;+aZSc*NF7FvP;y;3d#_x2Q?>%qGPop>+Eq={L;580;dQV5sWkYo1?=&N%%ZQ3f!h zz0BZm%(w+$s+-!dy(h2YZqgz(sJg4+g|!F<7}nI+Y>u3iDxU+jk|j@nh&1J5>IrOk zJ)8C0<8zQ#**5a5O2=kH7l&pse;fEd0}4V=*|%ToW9Q?Xx4d5+975{`je*G>U^C9= zKkKzq8j#4P9Afn|*aRih16xf1rZ5f1Q_D3pqR)^;CNW(Y(a`bee2vU%4CdmUEq)vCFDrZ5@&4gxEVnlZfN2pRa3IU|Jut+9P{-?Sg3U*(~ zVW`#m({yro5(^Tj;HB2&}UVIa~8K?NhHv!2u~*H&-*H|X$+ zyr3+X-khI>$E*jwAfz~=;PbcX+?1&c8#in@mrASJFX+s?x@Lg z%+L!(-To|2ccd#^@@s<=S~c3zxyjaV@pHCrBBgPXL``q6@E(SXaL^d)h||FDh@Ds? zOo#(bILj3}ei^77U=DLFJ?=x@J$(>);oYUC{aGz8$D2H@mVG7v)P6*V_fwl*#B1`3 za1hDTSw6>D6?D}VhWEY<#uW}nbXG&!WH#a(o5|QeGI2aLw7nej09DuH)VhIcJwY|@ z*x%e^tG(l$JQAGU)Zh%)=hiwKh5X$+{H^~WO`hWz@xSRzB`_GlG9H`qr{y@kuB;w@ zH|axepTSAhc$NE4P!<}3IfYy+j1$^(*BJhdUfnQD=yMI)XLY}e8EXXH0(3TEf-s(M z!o=+uhfAmj+jLvaEk5+`TZi}rWtRj|bc7;w1fLtpAM!)fu^-L?4ZVA22^+ln7Om}Z z^n^OoRY@M$&PDA}x0;&}A+O{Pj)8^@!W-s;z{8-E&x@Cw5+^gEzsJ%(Le6xn`5iHI z=?Af})#&Krt`p`C&-XSJ$17YjTlXwOcyID}nS>ITta!IvS>YY7cb=Kqc|%qi6$&?u zv0(nVxO#pN))i|`(Wcc`&+HS5A;FIN;GhWTl4EtmuFrt_DffKuqG@%K*?XmC61+2W~}2h z9pf^A8g7vqVYV7>8Qtt!me6{3ik7n0937__!nNONF84-5IvMr-00C8gxHV4veNY=o zz(?_4mt1$xu{IV^atJ6X>G~Lz8-z&uL|tisafHm2QXxd$o(W{krd8l1mFWYbWy~X2 zc#qM_&3}L4q)!oz5tM!Zo%(!!==WR?VuhqQtRm|cDV;US-uTwHtfo4R;}a=~gVK)% zx;uOwW>e>YIPf|(qDCw&6{}r21}%Ui#~Ah-+8G^Q{Z61?}b-}#gK9`EEnkSFag99K9yS~cn-NXs)o;K9YZD-*_mE|4C5>@yC|a7zfDL( z1sqzeOr8}JCBo>=MgDGd8^Cj?geTR98b=gFF~kH@tP&>kF1z`-q*O2{eO^yl&#Yxu z(@Xj$KW?0!+2}9RVm4S5Hqg(hS5H0?F3}f#w$E~fCY0HcOJUTjYL#%neUm|V&8QNWSWlVsTAK_gUM7QT|b$*x>BR3 zoE0_qC&u@N*$gdgA8qYG6%}=30*wWWiYna-dmVc_U0eGl`;$exlSO;GchmDui;M6$ z^h?eQ^Uia8j}T8m&ot_apQ&2*8VjUp3$m7J=<<~<^b2}g%~qaq#>V!#i+a4x*xGr< z+K1}z+qL7~S(a!n9L+*}QtwQ(5w|qoKP|+;t7syf*DIgTD0}iGmI-8++3Hs~TCSN_ z&CBW9$JZ>h;GRN8R`(X~R(El1;+^NcoS;2WO}C};J#47EB11i0nNq2wLrzoQhw8SrzZ1ZtMr?Sz%!Gkb@eHdQh0KZNd2U(KgHfG1i=0mw{7zXHb;<~Nixuo+T3sv3aPwN^2$|-+ZJ6kR&ikH(Iob_)SN z%R6Cg@VjVysAk@x^!@w(TI6D8?qW`!n=brLJ+*U>K1Ss1TOWFk1C^u4?lRY2_~8&U zPGMog!uek|E*RGHhy81ZMe^UOPL-HUVI`cR_nZdayu0ov%HRLQz2(b&G{k_iF@1UR9*~YthsPnuPrS|Pwv~l$r0i^R-0NZs9=J`SL zdbk9)dARtL|MA?9EWR2f{A1|eY+m5Lhxs3mYw$g2Ev@?tv}5%i)Y;GKi)O-j(2wx< zb)-;kJ00P#1=0oV@Dqu}LxJ&r0MVv^!?sj!T*$S-Kc&;Z95pzdozxFM%eSg}4yIWQ zCBHdMwYKr>F4m5}|6|qF?7Y8*s@t8?b=s$dB?YQkNI{YR^tmgyM=1fWoCZG>dbDr|GH$Q5|BIOX< z`YZr`@MpXt@05Dz>v{k4GGO(*3;x%q2e$@}e*|7rSQ&@t8K(*fr%X@p5&j`r{0l*g z*yW0Uz)^>LrSAX1{pE%0LDwPtvkt^%GpK&y4()H%_l_;f8?ejtnJ-B^+}SVw*Q)nI z@2IQ)MC_Q=i#XI9zhC+G)-eXL26$s|8$8Lqz98>cro&NYz zk}oMLb7VXY49!F6HI^7&@HMU&-f;wE{R;5ABt^W^J>Vz2G*@L?lJNRfPUhIV61)CL z#m@-1DD4s?)tn#}&(H!TjVJNs+629#w?W31z6FX)Rr8(<<=%A1zR9z`1aqeASi1ur zBw&`=_T;S(=q}v#G&MXQRE3I^?L*IR=CPOUW`(qmhcmu3*UF1v%cYmKz$sMJM71wM z0;*=F74v}VXFd|B;L!3m7o2g>((>_wx6hriq_`}j{*Is(Tnju{k+f1bIwu}p8Vp#d zOuk8Lz%p3T&&_AQEFBM&f?`GsQx&8r8ciZFV2P#XlQ+I}w!0)SDziEhrU3XN4`pWd zS|kT^Qc~Md{M{r9+pkcsa^VJ{{h2N%&Oi{ZCy3rmk5SgnqIgkjl_efWktI!im`YMv zHg;$a3X!ej6s7df!>Z(ri3xENKgnuC6y+G;BxovHaQdmaSnS(jFdF!xx>r(K`M2o z9Kz+!_4D$Exs-n5erC`mr{^W6^pD&;u9##DHLd1e{YU?q#yCz@ zR_noO?Meh~QTFKoo~Wz$H`YIoFdym2*}?`q6|8mkz>9$%}pzQb< z0MWty-0E7DOXFyRdu`ueSicN|4HO{Va0dZND|`sIgw(Hdy0Y;usypskF7Zm_!ad9- z_P=4Qny3^}m@A~UR&ceRi)+4?UMSyV<7NO%Bw1Dly!-?lP`|PLUu$-d2tH7Aw|q$^ zvh^;MEm&hn1beM3o}lB5(QJ#tDe_#8btPQRv}1I(V~JPeXvnFzj_pSILycy=1>qMx zUd@B7oe+AB^??SS^_fUIRrlsVR{KiR)Ay!cL*8Wh$dvw#q?g-7Ep))Asqsma zw^Nfp)1vjHr}a|!KqV5yf1y!*q%41;U45j@=trm^GM3!Ff*ydb@G^!UY-08p{c5Qo zg|VMVW1EPA9>uSh4(VjIwP3=>SF2XfH%jMEFC^EdjiaMgVM3iAr(F z)ho}n8pmZx4uelD%vMmJWFye86{N$q%CNW6wXxRuYMpkX8I>(i_B4($kwv(w$vm+l zJ(0CPYMo(wpldTpXE!yRT-ufTwGEARiH0SagO2Vak`C=hg;|qc*VRtu^IXC65bkq~ zC%tdUodQDiJgmh~>gvHj6B4?P$j4s}i?0p2!!c#bvUge~ECB7uxG z0bXznEc@I~KMa-~_Ds2LU%AGOg(rdI8}8?ykvzO%tRx)t+zh#(=>w$Fmu~}K10ajdK&d#iCxb8oSF}h z7eqbCKO(isQZE8uy}JP@E%pIZ{b@^|(uFmpeJ9Y4^mpLZ^pE{~oBshMDE&YP_Z8C> zbew^13(_i6-!rk-W4k`t9}-jY{iX}9`p*w}J1fVn@Vj8*U{v5M zd%X1#I#g3b`pt37KfwCnZAatgdgD#aOVy@8=S>&bUUbCpKCN@%qbvu3e=J6Z35HPs zAMJA1Ax~|IKRT<`%Y)jR?H}r4Vk1x2JX2O^B9>eHSIRcq+gl}u+|HtjkF$uqhW4Qx zwSRtq3i3pe{ZBi)-(FeX3g&w}zq>C?{e-bV`^wU~?JA65{*BNvg z>}(0t65(QR%!zI%>%tWo@WI&-4qE-)SmG=LF7Mn7X)L_8RDZH8=P)Z$;`jJisoqqX z{-le=Yq&gD9zN$3d_{TNn_Y*><2S;kToVXKX5;RhLA%9CSvooNK^CD~W_z--G?r-1 zrdr}+*oIyf(&o~{Qo|`AhWU0p@d_#4k_9Yy<_)SWGRca!>6~BZ@7*(#j`5B|!BNLu zO&v5fs46P|1CT&(zgoAbW4d81voJDNq;(R@Q#%CGjuXPcwBt$X9ctL7wlWvfrq&t9ky7hv_ADT^^qYR z!=f>Qmyt-BC@&-F9dj95$uJ|cJ#B&IWh6~x(ynbwxxOt8jm*xJhjynvjHErno5)Dh zF?*Ax9b{N82BR@TrP6`4XJGeWa&$U|)hK0apFf!L@}cCHvy)#EE0xH_+!TwIuy-$! zr$KU9*O)@>>-p+i1)BdqZ-3z}$FXFK!+Rzl@;h`qI{AG4E8f)YSkA{W~G?U$u8xfm>)-7D(${@gFdz0x)dZ*npI z?q#_C6Eda_gFgAeua08?KBk*)in)UX&ijT)n=yScy z$97Rjv0X!>Wx3~&IjNTA5KpASrjWQby8gL^V>nFmoVDwLDM3MFLHV}N%o*gooqN7gZCwZ#t<}aj^?9e z8*X-{UCOjJsWuER<4MhQPM+Q&ZH90(44mnZI<0=<=*mLD;EI`RSS5y4a$7FiK=XLf4m3>9!Tu^xz zMR`eQUlPp~oqHKoYH}}A_JGd4D4@P{>s2D}T4`L>`9_KIhTxjYH%&KG{!Jq9hR(kU z*qQ<=b>R&K6kON&HmEGP1yEUd!z#Ezn<}?;y*sM@EnV-HRri*vd)umiSJz>w>feCU z(cq41a2J3Xl_GmWH@s)yYz^Qta$FX^11H{2u}_C zRucZJo*4wJVd=N}ng5y>0Uy5%Sp6KDz>l8?eEgi{XDL^o7BT;I%J<*Zqhx^o!SF>s~=X8NT*a$T}i)!^`0HuR_*M@`D!-;($If~qG{_x%}2Iq;hckcrfTzX5ImNIUd9VC3W@zo#7f zE&b^4=|_IcIQWpQA?w6{WF7xK z>*Q~_$N!RhoXXr||B-X@uh8V2_|Ke^e+P0;{q5~I^Y=HAclJN>PK$i*Kl9H1HSg@- z3eNr=$T|1d{BwWLKlh&o1?T@G|J>gI2!Dja3vWmM#s4h2_Zkt$sCoMDK%F!HQSZ!uHazv8jZgpWos<8k<;lOlbM8OiJNbXw9{zn* z{jb+&Fh+)D){6C+%h#nZ-H^U?eb%z+?|rTQ>$&=`1M0u_la9$;wiZnpD>r5=mtdJ? ztu{WXaqR!Abo4Kkj{ZmS;otKQ|CW3BFFA+)ntk}M*@ym?dEhVUxEBunmU{U2^nJgj z9{M$HzkQD+rS1;WN{}RLFi-@mYgn#)W{Hxa( zDn(OjM0F3d07l&stbYxd!8v5zPZ*qo*S`o|`(wx#FEB)hu6+ps!#jp?2%(>I%tsY+ z;O9RE8$g3uz;l|wtlw74m|B=W}yYgy&(J*#SquAMv z<4idVLgTo(ji8K~*C1v#&@gT`WN2W?Dg`vnmFiq*>c!4#5Id`W^sI)kkDdih{pdM$ zV`kNhon1GMt&raa*vzRHH5;fCJ=2X^QM24~?UX9>yrdqU-XNz)Lji~7?BW6^Mn&z%njhaz4a#r<-xiupe z)d-*K!hBCi)515E)x#H73tJ#f3u}Zet{%P^B~TM(=%QNTOR7sNZH%%spfRWsg6fj$ zp^IyVE&(8*N~H&&r!s6AP&3p9WKvF|sU1?Hv0Foy0?-RBWh>o5Ln!TJE|Kj>B3Emz z;N`W0nb>7ub67!ZAj6FwP{&tR4 zDQd};-ts}tKXbtDc0NaX`CjYqeVfb< ziI^LGyl#6EH-?(|2XM1ChNdx$l}U-B>_QJOW_uZ$rqq5kd_k3qEc=6Knlc=XD~{&W zACWQ!?fuJcKx0!gZ@^r0H+W_I?5G*{Z>`dz`o9$!Q3KwJ^l0K=qi_B>JlPx|CwhR< z7_!C{v;IOHgk`0F4s2EFl?l&y&fifteY1{-2;O1!D>d$GN#E0hMGZ#W`|(26AkyENnywg zgcfO&ZGxusKEZ~gc`HHF+GB5Epv;?_+NVy3&?$Xp`;@7Gd9OB3R1Mck!j2f);}YC( zGcVA;33uzi2sc4vgfhzi72xaOcl3;`aWgWMT|5qn8xg7}46hYq+mNpjrICfQ86lL- zC{&9Q<|SmV@h{k|icjjo)2hM=UF(!?a8lJjLDV}g!ZAn7v--m`>Vp&N!;|X6)5Hga zqwRUC!$sZUGN9U?Qy-mynSu4uS^d#@_2D@{w>}F{BLd|%=KuwnJ)E~Xo>iUC>5k`h zmy4`+x&T>qKkGI0h8lidjl69QxTdUIgG?siFcy<&B_Vs(e| zyzX{E^`KI9zbd$lssWYVu26~UuU-Tl_q*Yi0R{BC>gadP(eJ7?^tyA>Jw5fVbMk#_#7%3!b!Y#ZUIT7f z{V6*J-T<6~ZW=f|U=6wB9DED#8gkn?81fxxtRbl0^&WB?aE!R=HRXZ#oJWp151n%# z`Am6gjkxU`e%pJ*J?DtKUc>MD4!?)eYs4Mzk$1~t)IFb(_kB=~zV9>o0ZQ-Dw*cQU z4}8bo^BZ}`Z}L6AMNhq!KJ;7sIAHc;@A3DkA9vpk|8b8D{Kh`C_wt6v6Br9NcJqB5W;3W3!U{eZ1In9@dMYs2>*EUxC z6utto|aAOGo(ko?InK&q5RNc;3xRzLky%4ff% ze*P=Uv~S4Tq;2_g%ICjle)4n1r@y9s@#lYx^tHbkWPU-Uum3&si(k{%{+hAw_l$La z&fM^8*4p3G*Z(==t6#|AZ2L?0y5F)k{yB5~UozMKhE|sAf6LnNJCvTt*S+H?t{!SMio(r*E&BTJ zg}#Cuquj@^k8%pK&83ef(1j?heSM zQEv55K%xh5>y-j-+f~0Le)ckH$Db0m{hGM)CGXkgFA~kYy!=JNikERKUdOF?3Cp+@ zKVt-NBWBra1B@GQ$D-GjT*HKG;j9U22RHGOCh%#y+%jg9!0gPHv z^PjsRV;wX^8&h2BuEm(f7SZ-|?MAF2-xoL;v|ty(U0^A5*HCUY#TEc#Y)D z>ofe0&#=1&-b3%WfjQljZvr#B*QAF&Gaoo--gVA;;63qybI=X=173q~ItEh!dNV=No($ZwCf#<9y{!jcbM%3SbKUBF z!|HX}*_+;uqt^}HA4nl2XsM`s&w^Gf3qy}mBz;Ey>5!jHPDhh9=cE;t2CSBbYI{nxJ!7>!soI}XUC-&h7j^&3 z3T5AmR-cPj_Y11+3H8x2-TI_~`sjpe4IHQPqvPsB2ylHx_~6)Ep<5kOt&hTGRlUxr zZl{Qzr&W*BRK9;yy>~>te?+}^ShYF?LAQeDuzLR>%N7T%mPgdPz+s~0LG|td-SQBi zS{_#K98%2>s8&Z*$CJ9#Dc#{D1l5VqZH}oH`&ILOy4gY4=yy==qtMLYpn7MYYKqna zs_A~f2)YTCw$N;^dS|cI=7`nysA_ZAYI8`nKA_tiaeQ=GHQS{c@6=6Lsz$qXlRc{O zZq;y?ZnPVKMm5?)q2Vr~!A@HcSvT0O8g5rjcIx*J=noF6R`~n}AX9j6KTleJhsGgw zw(5F6sQOz~eUvWL+otMnv+C~9b+*%>&NfwhtE&BjuKT^J^PQ?CWxXv{vmK7+J5}=^ zO3>_kXOnHJ&ey8um#WrRs^%uE2BE5N)YaD;s2b~4^>wP68*7QGU+8LU0afL5$j(|D zb^XnNY5>88s=Hp*{#;dDtt+iDfGk+4D=tT=Dy$GJ6D&2bikIl}geqRFDlAb|S6DSy z>Y6K2sv0X)O+k$nR@Eh{Xr3yVs|)9-!r7{5jw+Z%pL4Q>A!D#NY$q!?+0}Px1&K z%$<$p*0|xOY|x>-2aPZ?&17%j=1Jo{sTnsZr*w>cU;Byr6imRZKyb-=honSVg;4@orUdkFIq{H9ex*oYcK9 zsD9@$hp7%{tPf7AhDUUz1FGVFRbii1VZVWvDoRh#212C+R;2?d4Xnxsd3cqBj+#f+ zyQi!U=P?cIAy?Gk%c}DktJP`M@R(KkunrK8FbU6oLkj~Y0t97CzA9CKDaM!D)S z$Pje37%2w0!ULCK)C-a$pAHJGn%L8|y5ZOChHq17u0sz5G`(Tq z*X&wQlUsq!ulx77?K|y3!15~n0{oA4M-z|f%R`&!C1V*+I{=t2N&_0jC7d{Qy^eSS->+s%>B0hW)@gd3w;U7If z8TrAz=#L&oLHOt)02wesRO?3&PQ)jBWE6WlZm<(aT>(eM>ecs{6CJHqWBl zK8SDgIIiuJn06>1$G3X|8T$CP&mqLOd+Gw@CkgGJ3ZA)<*x`9%2b4rYzvr>*U&s9L zbHdD@;yOG{?)YOur>6;>o|o(JcEEt>^sJl!LQ3c7Kyv370tl=UU4BgM@ha)dKP7$t zOUi&BQ#!rO==?0T^Q+XZFH*X^Ozljhb$L}5U0=A7-tA=xy1vfp@-n6S>x{0i(|f$g z=<-u$-&d*M{+hh;&uGf-`g2_HYu>n@b9?=i+v`vNE6C}Mk0&3X_n)$l{smF{ z@ayDu#}CKr51>zchWs9{fx_;u3wr)k)Z?e(o*zL!{u0Q2>`!TEQkC~lcWpsL(-sO3ENBOG{c$xIwtHe!z zPU-P1x#Np+oqkN}_+v`vr^)SqEOYw+N$sBj?i=v!Xvce&_jRXdanpZ_{r+{#=Re2x zeVowtd2EMgysz6nkLn->xbfcr#*McEgGp3dln*h0a0u%BG;-dL5u0CxuXz#I^;u-w zhmozRH=`2=E-Bq`4|o3n7!@Pme-QEhgRowY!j`=ZUHdF_;j_@556TRxZny?v4Ai#) z49jj{01p)n1PtSWEpCRiyvZT`o!kCxZU+s!AGF{>(CTMFGoA)^WvdIN=7oTFZn@## z{HA~N>zHc*R52w%V`c;T0oe>LeOoaW=e+37QnloCn@>g~aJ}%hBkfZ+&~h#a#SHz$9J@^)8~syzf=# zf}`#QN4;~-78k5;*R3J998>N)r``4Hf6Z!t&AZ_R_!3s_GvYr8YMn#X4R{nH7#9V; z$2pYL*Aj=M#u+#*s`hEedl$%?485+#Uw4kaY4yD7_~??Vcgm`D%Ayx^Qr9Ht2)R-H zq&P^&jE@Ab$pv^&^tj+ksp`j7t)o`+)2j0YYtU6a>@wZCuIH@x&RBJh8=pv~7%UY6fS z(Ba%$%K5CYuLR`}sPcP7-UIK~1G`k^Jy!jL>fK|i-AUE+jP7$r^*l)mrpZB70|)Mc zpG;S|h%hp%g*!^2U?)6k2=uFqwyVM)>}r+ms?IL!-NUNganttx+;&f99Ba=)jh;Cq$-9b{2{2e6v|ozB@}vN&X*z!AOHp5s4Cy1 zAJufH)#{-7@SytW5LuOmJ9W)%suH@zA)8g^rc%h*=oU1}^bJ~|($}+0lQMIIqx=?C z=^Isdn`*dSzq?1Z+^t*e)=hVih^hLmF50ZJ)~dA6bn0g)iPVoBscTW{4U7^Y^QF-%J#w?XQMa554u@h9>xDv#URdIrNDPzZ|7(whP9XDFVjMVXC zRN6$9KAFTy;Vi4l0$pXHssQzz7T2$YE9qExMZL+2e+-y#nh#NOwlO9dDtCAk|R+LaVZ^FYA3mN3c%raM)TH+dIC56q7$iQn;z z<#EGoU0g<40-L#o6LtwwuVR*4y2m_9KlcWzGJ^qkz;i8a^6)%-l6=BH7OHwC@BJ+$TbC{_34 zR_kMAg-Xq_W`=je!$48&OTNDfUT)3sB=KoJ*ev)08q8+ictRmnfo>;bg#3j z_h~@)KBqdL(eE8q4GyXXhYhUywxAmxF{N&F)M|7T0!r2Jh@SOBWc zj`5jB|I2FNc}%g^z)M#53)V-cRnudt$qB(R-Snj3xC^X0nw(S+nw_$mokG==j^?K! zSj|qT=BISC(^iW!R;NqWfNR$9YkI^r$FLi!=OsqvymMN=bH>1GaaOfBixS5AUCO%U zIS53{bE+kk5F9S0_3nA~-dQKgchBk0a5!#QV{fQ&x764>&i>bR$BU}f1?&9_R;%-X z<2}fiP<6Dr2pB|< zblp^ayWH}Y5-zXL&^x|!ANwqR;Jf%SoM6AM&_D3)de5)R9lvgO{JXIX?8*}G?S2P=y5Ng=bgYF_xyX_bIErg2ll)l)bqaIfIC66B`AI6Grw{7gL>Z!>G2?-*Zsg= zcOe6T#Dkz-L~x(`MhNQjFu3=_5TNh9;Jy!n`#uWpb2q5}LkOXL9)B6P zS=fN5;e#GU41OFk_(|m8XAuLQMGkx(G3aUJpvPf@pGHr87QX3qt?EOzYksEt2Hef>+!w5M^ypGA#&7C-FA*x@f@M?66lh#&DhZe$s}NErE2${$gU z8T~ST)Q^cHpP>YjM?Q}o{bR!D=Lw@*R5)CXIVmZrn@A37`LzwDb4WDSt|u z@G5cq%jEH|JdyGTuv;g*b|Y1gHXh|G2q_bOrm*x+$-90{oA^_z2T*k*ebOJ{=eHtb z(yR1|zoblt{3?CsPbqtUqw*j1^Y7y4)Jd@VZ z*%N*Oawh(qH{s{}Nk0`#{Hb{2&*dlmRB6)Bl_&qH>ZCtapZrVhDZkX2@=M*xzcifk zYtt#e4eWJhea2!YCCT0~X4e>b*V58~12;PV>p}auhixt{P`0`JxiGQJnp;KahqP_mWdznB6{SLn31n|zsP;Wdu_yz z&_jlRR-=y{LCF1R!(GK~i!yTflgN>e}sfhLcfO)IIM{rf~o+6A<^eiV845zeI9V|?DHtN-@Tv- z4?@?x2>kRJ24Rk_eI5n%xgXf)4$=Do#@?V_4@-t$ls)fb+y*#AL+Ei212so=7yQjo z-~C4|c@+Sc^ANvit6V&ZqK(~8l*6{Cfn^Q*D+rBP9h6Xc^f9G42 zyWWOu<{-*4F>yZXa@()dE$=SZeMj8(m1H8{84vvj-gk7mj;W2TifhV)fEf@|A*aX= z*S*_c_icZ}2lHur$k&`5Y48Lv7xaXL4*K7KH$KY$a?PX`{ zYnZ9g>TG@4`=cwEpgDJcbjj=x_kjNB5*z@p4=Tnx;4>I^!ge{{zW^EjhI;?J19d!zGtHmieKjIhJ4w86Hgw^~s9j)f4;eEL^WMP`0 zvX$bM(G6>M-0{IV)%}7Va!n1nXbrpoPtWRb9(vXE6udk5Y_5_HAxb!YMxcKPG(2uK zK0%?$5!LuGJx02e@F(Ft9=1L>uDYF3{m)r_&g;JNr0}B?y4hjX=nx!E`kW1qI2*!Q zbvdZ@4vDi0-&Ne#`iG>XuWNg}_4caT2*(TDjMpE+S{$Bd)0dfb?d{b z&0&SI^&VoX652d!EjmtFq?WW%?YHDr1(FIa_DU(it;!;XGY_fvUDd*IcQpFPA8o zrKg2I1)dpo~Qpcf`rtv%x&BU@q9&e?% zY*NR$?cJ>aKY-|A={DwBJPcIwIOWlQ3CeIWC5Z0(R-{Fht-4T_j(ID}kTQmmDb35c z4a&eaC_~4Tfjg8YH)b%9A2S3fc!QcTFcCCwjiWK_OjYg+!_rVQXex@e-yW48WoK0V zEAS+4%Ag>6U{Um-%CSRhB#f++IJ!>4D3cFmcB^rt%$_v{_A8%~#sE#rjcbuSp=I)f zcT*-BMh0kAZjvEo+|-OIJ-42L&?a@7k%4xpQ`@9YZJ#!+J*!h{$B!^u5tnDa)lfhL z@+?KMgA6-kG~`pFX@iRlO$FH>2bxMGVuXv4_e|kHUTv~D!taoUA$wwMDsi7Q+US+V2OV`n79&5wzjml!)gH1o5-yw8GiKKHBe zmG#bE)#fNe7K!7k^HKHwe%15<$9Ig>wRfqSdjL(sWjDw4+PigaR53|V;Cx`F3Qill ztvY)-m(i)bU9~=faMjuR3e4!SwYluw z8eZK+pVn8s+Fo+@x#~6Ht~LFx_w+m7qwhGok+pHa*KBhgo+8{w@3!zVSvuO?Fsuz+ zPk5zpMjiA`4V81v*QgiHG^(>&ynQ$x%a#W-1Qe{*Qe7h zzYg$;Z+pAA8@S89U2gbvz2VdOI=yPR%Uy4X(srZiXLq|303Vtj_D$bzH@$n@@$G)g zZ_*?GWsiNAKJuUO(6`TR`0?=31G?Y!LlZpp9=GAI8}25s$1MOdZF=6Jve#V#i-Dd( z(Ddf2AgK2pvs$ouoIbaLW}?)&$-7t)stl7PMsjV8G7184xV zbP4TuAIli5XP`GS%l>!62Hb%FeOTXz;r*XN6TI|E@VaNAOP_}gdlWSAQOH12IpKpI zgbsQ{VStT@fsYKr2N76wLFT#(!l0)FmSIDl;J}E%55uuM8+;#{uu)GVKYbpt@p<@k zuGzwebE$@PUBs}5K-kbHSm|Mn=SI}f$5wHxkFcP8$6(VZuvXmZU|`<2O)= z>%$B9hB0j1m-h|4d@ImZ!kB0L6-GZLm-q2&8sq06h4&Jt782w+udv9;!i=Pic?o2U zeVH}pW%k%tx#M2vk9}D<_Epii*X76mRB8O{DieOHKH=wD6Mv~W>F0VAewtV5n+=)E zzaSU0Oqdsmi%Dm&Oy=b)tyZ3e9vbckoVk204Hj?6T-LnDjjS=RvPQp1ANga-$mhu; zo|PN%EMdgc_~FlRBgnl#8if?e@TU=xUvdh#2=QbnUb7PkxLT{w!?ZeOQJJy3c!Gs9wl2N^poU2p#Ys z1bPuL!k`T6f6oj-q5bX#^}iq5_i<<+$QXt0hxEM{u;^*g;qClNzQ!?}0bGW>6yUsNs6INt@}me410v^;H|Dv^0jCFfXUfvoS{#J|_cg8`twQ)#QYu z$#L6Z6VAoa_?V;VQQht=Ih6hv)PQp+tUqZMc3ORSgo!-$_qqL81Mz|F z2b1O@r8vfWNXnS!m-MLj7}^C*^ra!x-($5rqT3(Q-A<@3$8@I?R>xCJHL5GLORb%b z+PhGynmfp_2+2a9+@)b$j3HdAZ?|d)=TiL#YO3uZ=TdDO6N28|r`jL3(e{w_;UTN( zejZzm6pU5%2bigKiE%hr3L(ae1`8;9i#FC3CA3H2RdSp)AxXhS|=`mB2qG!a#%!!Mc8y&kaICgPB%<{mP z)xI&G>DYBDZi9~5Kp}R6iru6jBy7-G->J$!a0qU?2g9*ycSOB=fIK(G?!qlr`gbaB zGmT9d|D}%Eq#*+dUs6c;5=s@nS;c<^Sd_m~36zP%uT{=ARdFY#7S-Z_?!Z7wMo~82 z=d8I;HOeb;7qQ;X9QG`8yTAMJ1xTg))`jsw8T3;`c_QUPTNaS8&b*t&;R@m^JK3ygKr4~}x%t)w5U8u`h*&2Su(fPbr({rlwF&v^Zk6M|>b=ENo8HY{Pk}BZHK5j}1S;v$J&MX=Llrv8N zR{7IblZ(2?H9h90HS#)~Hm{}^tV*YxIVT)BrvYy2oPEM8=aeJoq{=zr%svSLRip9F zJq?XB_l#H085sL!Q*Y&-f!@kH<(+%ptLU8boh!~B*PWB@I49in>TwnQJMzu~-nj&Y z{BwX;-dUf#bG|qha>03L{yE?L^WOPqp!CkW0HsgCc?0Nu@-KQ7UGgiq1i|l}+djQ- z!Eg4PeAlb{O`m#~d|1=rr|2T!UwkQ`=n|DMF1`c} zO2`4lSN#gFqSe3XieLR(0ljbg&3oWKQ%I$o z0TpQsxCJ1z(oHmZ0-DgucS0-Q3aflAr1JH!%C|x*++Yb*x*k^jHc6tD&w{2u3V$DF zcfu>d@>W=tyWy4Z+Gdq+MOC^TUd2Y32g0k~0U|sQR_Sg;wfmvf?y*|=c4W1?k!|mX zfBGz9`s0XNk0PtwiK=p+%4)YMRDA&BsOmIE)gZd+gHk|O)o{q;=xTSOt3QMsQ{81& zgJtBq4sT9D>piI>uw#EYk^chp*(VK{^{s>3KSAP)K>`C@>OYSD=2cv?N3pf;$KflKHY)*|{vE{Dd=gs| zN8OF9^(6Y67x6WpCRD!{TkCmjt%q+#nZy4nVro5(ul^{$`aOKMgu0KSzkVIl$@+ACt|8SECVR{YvR{|+~#r2x)-r6pFk5=?XGltF9BWE#Ao0YPN?=E zp~gcXsm3E9xyGZEnvc_JJ^?c7Jj$x`IH&gG+&WJR>OC#4_pCy_=an10s9N_$l}1k* z*S)ho-E1YZ%xoxQ$Ihg$7~A=q_g0^Sa%1We+2waB^PAFW*{R~ej9QOVak`rKl4?G{ zMTn_>7k{d#s&@hWz4_;_at|_u&>Am97P}z2iUOq2J=iL4EFH ze51bjDw+Z+-t;Sfnbitc0t+vhLC>%JRg9k~W!$?41QlK7C@Lc-N(`ai#TR|bU-8Bv zu&H>-r`#eSHVRL z-Dapq6D9(V|C}H$K*O@&EG7uAI+uL9-tZcI$7}K(ubwxY&8~Uno$|>!?Ue_}6q9=z zvx%u<(m_dmE=x>Un7_=VMj`JkW;AE6sh)CXpXD6a@S@fJs$|6K7IPzFDX2)=bD092uOB9od|$b@^ku$rxYho&>U)mcuXK?9D;?08yRDQx^s-zK_e^}PdO1bs!Z5fAzgW|%7O>D6;7Z^+yg`4zrH^(h&#auZ@o_-ZhORFWqv#YIjt% zJ;D%}+B;O`9ai=>n#FE*#EDxTw;835+h`yT{|5N~R_tat@Z$U%mtOQh%vxvK*E;tb ztI9T2cc*Hyo146RuunJIt7`mU6>VYWQPM`3S_8qaXCUyY)NV z6-np_luI=bwG5?-Sj;kfu_I!sid(KzSE)RPw5S@JRIQCxMQP?hFGhQ?-FqKBxcK{~Ln4sdlIz!O=4?31N`PiQE3et>{p4*y;}uUHzT3PLN4 zdzcU_kg9ayQ1$M0E{w_vbi_@9IY+LUu;^37zRAyCgqLOWcr)^^e^@9nofJS1Upbhyy`a3l1H_Q7G*UXo5b z9@p)U>Guz*276QuF{rsquwB>KWs%q4Z8VfA>|j(5gj$pxjLi`nR}2oHA=KW@-rhT` zx}MfuPw_EA*OQ!Xn;+z(hPv)Y4f`xRb7~*sMQiUPcViw|)Y+%yX@)$zIA{ms)E6`6 zTk+Y5qt$WU{jBP9R`)r{q~9*5)w{=Z!$X+M9S!7(3grWgUzMjQ4Bn9#9P`wL0^?c_ zG47_}aYABZZMpF={oZl(sRx`>gU;yz=dB*+^oOV5m+%Qslas2k1l%?{>S)3U9o_r{ z9~Lz^p(GMVOPUpqwA}^PMvc)#-9pkGNuuAQz+hUE))t7N;1$ z(}F=d5~_3B(SqSTcC?Opy4B*eqvcsswS#e5oPov`TAYGx9;3lUvj$zY#$8oouQ^8C z@Y~@y>pKDE&yod13HP{aeQzA0@JLZdG7)ftXfGN^@r5( z`QD%#j>)&3Q|?$}Z+P{%487x{%gzt3czt+Po&=gCEW!@PZhhJ7!^=#+l822j_G-h2 zkj~bk#IddAA*3W;Ioe!w_P7Zb+&S~MbJhdyuiV~F%kpY_gHIsaU6tS+XsGmUf5W@2 zU4>q7#kc)+pLW;1+c6^D*+Ig5+A~Jor^8iWfYs|hWAFLQyX!OWzRw_e;@aVccgLG1 zSBno_I{=hGYrov^cUAp5NhCazw(Phbz*}PDU7FhgT^L&L*XcS#emdXw>vAt(z%8tW ze3m@)8+Sjj%S~TqY~A(mb_a4mmzxas>2}Y*t7LD9APU(4juA9a4!=s zbSJnsle~ia+zsh{Kcx3VK1-kcB=pm#AyXd&_Ou_T6TR-BHK@{==~4PnlCT;33n{TtP|y7Tgg`ZiEkf5;5>e_<;M7x6!fllnc5>GL3}@1w{*5Ain!!g}2&GlKtl zuX{wFyWG2~*Ms2hcLFCr3|{jbC2tvt2VtmPuiH$q?0uWJmAM~1fVHQ3az-Ko`as0vu;tf;UE? z&bI?Q-+_S{seC#yug9nJRg7K4;9J}{Y|(x1z8IqzTEgg(PIr7e+-5jQCysI$Dlq^; zwui?KlGkGgm{6AFRyJXbg@Eza(czk3+nX4Kefr;U%(?HJb<;8NuA}{BXB#SEz@QS2 z>X(>ZD?_x5@QgRXfbWfYq0JTDmN~hc2-?^a1m*>?x$fQiqNDXWHertFM&86R^^S$I zH}ilPmcsdk6OfsntdGt+KRoYf%{hzdJRj0Ve{g|H2|Qs03aYIxs1MFNTb+X*GH1h9 z7x}V+(U+a$u2~aqIr?4Wq}kGrX~pEo=~84PNCb*)z&TeUQvm%gr)dujbAK?WGbW|Y zIX&cx*T`#p2GjpCstnYXiJk_{PhyJK&6pg-xD_}LOvgR}hr##~R8nRf3cLjc$3v>N zrpYnugOj@FMLqPq8hq9oe9>xu21+<8@M=`!<3y8VCIST-MLjWVA>rsIB zB~4PgBdqI5*fre0`g`HpN#4*Qx_|Zdau3?pM^(=gs>cbd=SkJ+I5`yPCHvma5~{^2 z16WLycdflvP4Oz-nL%_)ciG|L#)*|C<^eU_gAT1uM;U3}`KZ<5xN5QAs?R1k$#$ZU zD`nGiq}&>Su9a171nt~tgKU2Hmlkj ztY+V;cebeJ-|A+-7FBn%Rbzvd|EX2*854yHJ~nYHjASWx33lGl8t&Cnutw#rG}%K| z?h2K+f@SV_s|z0i#-S zB(OzdTL3GInM5Xy$jTs8<{XtZTV>25^5?7a3stpcvWM<6U28eZYD-n|e3d^(Wlz@` z(@c1a%A5w-LN#rgN);tTU8WjAr%#n=mnkG)T=6dqfytVt3g$8nrTS7;eF^iG3{z8a zKDXx0nCd_$X_IlRPMKt-O_abElb2*ZI7kW!BEDJo@*qnsPGCsXrQcv3KBss?TfrVONY5E0WK5WdEauQ4bgXrfAFw_xN#36OzI z&LzqwXdp0lCdzFvFgJF9usN*e#|%k}8k!n2A~|_{xr`}sg|lOd=SLSW4ynG%zt*S0 z!BoU5^_ZnFMPW8#T%}MvoS9^zYOqJQJfPbjQyq^eOmZEMTkjrpG~7$>1``+# z6fkJB`c7eU_K@o_Q)ca*jO3&M$aGt4mtl5na>vZ3=|@{R5S8S2 zB;pi;CyY|`j(Ttc2uD5o2XF%HoZnj`bx--*Cqqk(p`5#B4S-KPJ8xLxrJ4C+eLe);pwr)O#mYuZz~O zOM1j*J>r_x^^#$8*eZhfg{NF#xU#c_P42*Jbj$E2VE|VWvN)Qjz22n~{wQ;)`kZ%; zyTLbA4Zg~EAG}8!y1DP3BiAF@>GW1xvDELM^Aax>pdi`r#Csw@FQgA-=lhpUlhy8m z*U%e|DL3J8dkww?N0}b>hZns*Fm%r)=55(NH#PLO;kZ+{NDp49A3#_hPcWa$+2*37 zjb!z=x#%_G4m1C!-g5T60j1UUI+q9BjtA?3%UCm5?HGA3%nnx_24*`R(b&85F#4T~ zlj~N8%d+FZb=hm+nzO?d@9}rN=ic+0e#g-rOBcq{%OZyn^^*K`m5ZECH&KP`D_i!M zb=c_(lZZji{iC{EiiS-q$*W4>N?&c$VF1!h* zjCH?7wy67E-)^LexD@Pu%Xij&=8Fv^XXM-Mx?hibP;vp;^?_dxE-8Jx+iVez#Uj&i zNp3KMOfnaIdftX{Krd^8a-ppmA{J(+VUU%4GpF6=zp9BrR!!3#=Iqu&DlR@4Fb}oB!@H2n% zgkK8h;z>&#{@(_=3hs3;uoo{2HN$WDfBcANWGla#3rzO|_zS)b_^4$x27x_ztZy%J zf`DJ|y8#m(GGxr-7Yyim3#BB;(9EVndff}_eHV!6eGiD~bw9TEgM>c!llnXWlKVbP z>-!+1-@~lFk8}IJ$Q|&kddKTuWSZT4m#^n5mX@v0Sh_J|38QARWTP1d(U7BAOC?*E zR{T7!2YP-O-s^sN_q!q8?*RBG8*sa;uD5OO1Gk3UCZt8W-0~iH+h_3u|GD>Z*Z6cI zA;R0um4gY`gop>+w{V%Ncc*K-@ga1+FjXH3|1JL%y{M1?lKwe&eyCdx4mZFagMu*k&P5d zYf|A}Z7*^6leQ)|$51Di4Q~#;J$?#ZLXB&5#fZv56=QE}rrDBt|M0w5uWMeD?^;u@ zJ4ar_h;4m%#jDjN(jStC3uDO8Yi8?Ugs1HI;2dC-81s##nIjB`LYAKo5}3K;c<++> z;H+2wOI{QB?7=bkn$`M(^W8Ii#(d)DfAfn|r2s;Q)wn>6$K%r`e6 zUBaw$@+S0uxc7>1D8{V*KC6N8uMYCjn#ltqv9eFMILwV#dYsnXPdd7D*A>3yr=BFp z+uIt-CWf{5*?yhz^y)CzUYtF8gG|7eR?)bg_SLkreykP;RQsd4<8jsXIJ`~${sF7O zUh{NN*W7NCDK%vumKwXru#jY-vr503B+E8FlC<4dX>z%>+=m6N^>^qNdsW*bnoP=-}HaV)TSA`z~R^caFvVp98lM}SsfDp;)xR_Xke zfC36uvvea@He>wiNL631Yc02GuTZs@16IxDs=@+C!90~d-O8L{bZrC?{J?II?q;$gNPA%vU27&U93h&Z{l4cYy&4XEK9{sYWDL z3@IaYjHLXekz}zqZAm4lw0DP*w4jvHY(-PnWJc2z&$hFZBw2~{N|l8wZ@MFQnjAP< zC66)eiD69as+&nMtcuO8j7H}WcrIv?$1$2Fe}<|!PgR<4=UY{tPadbjT$MKir{Kr- zU~Nidc4&7+Wnxs{x57=k{EIMT&6{wOGH$rp8Q@KQ86xJNq6`=FkKwj2!_lNimMD#Z z+sq>$%Fc>%p+xB>Uov7!h?sv7?w5kQ*%>3e6~e-hf-!WGpoFzyDLjjtkpc3e2j@mH zxrwr?$pqK9X&R#h&_i<6kmRUgX;CBNBSu7rkBo{K7a2Z2AYxo#*!aMRsoqI*t+a(4 zaVoE|YJ8#^tyA^aS(QK4MXNCY>7+$EYMzRmufk>%p>wRTc~;m06*^Ca&(-1c02P69 zfexLk!WXEB#b|{Mc}+!TO&W!v0pgSH;@spu|+rBiV@#x zxtl_jZ@9fy#zqC3s4s|!&sF5-5Ky{89M>Dc7>K-{%II|}mV!lt^*U-Dm8oB=;_oou zSdI5s9}3;mbPr}kRelS1ac8`xgkQ#NR*c4!yebH>Us8_VWW{|2nSq*dP=0O2eyQTV zgpD1yneZiB6TjwG^VN5%Ci}QK8Rp=Y2dz50b)_9D<6G(BYZd#girZqveWT*OW;OmB zMxVxiQzDpF(YUZhlCZYuc$8aJ?oO-v9=-^$!!h0cwEEx(-HwVob^12NJglv>5!kYc zl65H=Lu;zk|KLd6ZYBJn4HCDZv=X=L%$>U0er^cY{)D5?d8_paoWfD@fJ)zKmD}Y= z+Cj5&J75XfO5CZFY)GP(!474F#NCdhJr2eOvuc#ia=Rhu3I|EebUCZw&$T-RM~!bN zNZDg0NkB3qikYkBD92Kz5R6i0a@HOwRq}q7dVrZ+$@_H*L!EWXA!phFXUZOL>JM0{ z2X*lwtMN&z^JzGys`qI+qva1XQ7iSZBlVyoBpG=g+sC+oCKVe_~LfwXuitI z@y>ax{AowVNu71vnZ{%;g>EyCduN<-W}a|lo$|^$?Ui*>|Dtc+Wt<(YUImw-_sK`;2C6pv3NCpUUZQ=$6|ej&Okv2s%>1>!cfDud z^{#W(FZZ%n;T33n^RATX2Zy-fUHEpGR=<40zu>Cd-nZbAf2$h|gQ|GLFaN4{!Bw9k zw0as`@hfB^n}Mg^6FBOvz`4AOuK8BG?l*J~#;ok*+8vf{4 zy$dhk$HhXXS3(M}0%3*M!i%m) z7F~}jz7|t_J+}Of_zE|ZD%?u0cq6Ui&GbsQ(<xY?%G|TKHGFf=Ir4B@UBHco z|2+TdxS?uX@EUc~G3thQjZ3`sa?bf=U*wG`_p;HH0dGl{>^AexKI6>cUFpbSmZ$;K zYBJAT_0KzpU-uew!_oXA#t^S8ju;qxa2E8yA%%H2XPucCMkqM4&X_?70}%!;GipJ} zJl5>f-kB%7GtNLM!y1fF`DC21nx1zKy5Sss&H3R)@1oNjQ8Q0qoW!U|m}DG`sOcv; zw7RMkWcYPtbFh`Xo5NliM>q&)axCRg%t83L%024c=oGgL8F|Io?wq5>DGata&?^n& zHZy!(Nje0xanp`qYB0IICixdL3nzk9OcR(aICqF1$8w&6hLcGCA>H((SGNn+2xite z>K=1s;XodR$;hN3Q{bF+5EBz*lW~k`&Y8Rq9df2aHCa-4B(GVra&YVc%%M!fDLSYc z9<@52QbR5{x}0GwZ6S?SxqX~NQ#iw#L>^Ac$-6nXrtAhd5sT8y=_ZlK$ZXGV?4VNQ<0&{%g>8`+l zj*7S?5LEIuz6q%QKE6}A$4LfCH`%YM?o;X8OB@>@-p=}=%LHG@B(OsnCx8HboCn0e zvfZtuEmrXk5+&~)usR)6Z4Sc4(v^4X-0hML^d)VK&lbm=AozRm4{d#nRE-&0W4;m% zESdFV=jOvW^(($_sQPxR>2CGW0X}qWvWL7${#Kp*m5Sad{^v$Gob)+ylmL1ivjHBg zBW8mYEtx*BghLCr79Ow3_lY)M?q@1>y(;`#SN%>k+M(Xxt6S`XFRiP7s|q%&6shnoPfs;Pd-}Gd<-I%spu6<^FbN8l*v9RYgEqXe2$AnLDO$Z zpw!u*D}K&6l+;x!4mOKb#3B{BP(>`1#RW?%Vj;k4*nFwZ=W+vUlL(Y^WicWGG|_WZ zxdl3FnJ!$RtA3*De5xC6;I1nbR&m#rl=&(ii<+rAY=#P*&TOEtsWw8Vpmc;7d6Ev9 zq=F|x0IXnEMKj(Cov0%x>-cHh?>1*XmhM*7MdVN_FH#j2Sy^+e^jRu?vI?J|g2(FM zaVlh-3L9^7g;=6$^g&|*JEbUiG|QmTfCeB(j#mj&RQgPkHO2E))x`{Zsk}%-&YrC@ zXQ`O+MDR!zGExPNU>Q7Ihm6ocl7$pB+%2f!p+wM79X!kkM9455Jz6DWG0VK$4OIdg_2aDyWz8huqx} z&;w9`Js>Op?koekYiJ+?(1-M~A_u7WVWdJbC-5!Q%(N1kCfBeh!jeP{bVLnQ{@r+Z zU^n}4)1h1T=jl{HS4RNMy1H9+M1K`I$VwQll1K3r`O{R}mWKsiSoa zGokQ#Zut-3$-lf+ z378})Nt^1Q9$B(cu_veV4>WGs&BBy{C#T~^cIosePh`cC$1zlni;*EmgF_&j(#6*d z%8DVNFr%1u5_?s@yRSJ9I- zZf_IYR$-BkufRP5&}@>7}NzF;ZL4h6&D$ef2N>7H1b{G!)E!#OerbLV=N z(HpthP39Ip!DzVCdT%eEQ8e4jryRxKtMsp!b{kD*M`4!b6mI5ML;X;1p-Et-VcNtQ zxDLVWj_Ds0b^)%^F7?hH-SG$`OB?Q0Rd%Y(twQlgZm>=F!1>rhfeyqL9rK;r{~)1b z3-DdGNYe6F6-QS_xSnrx_73i~+?1g=y3+}!iPhW7H;$7J+Dg7A{yUq^i8oc3C*)#$ z+*}WRDKb9W=y-W}S9HG$_Aw``%~7lO8E!AvMBWpbvO|?)EB&@|bkRukB<@y8yW#nf z_bInSCBduPMMn@0T;guy7mCBTLmWrS^cq?2;(N;9ImBmQeJ|=($8@d3Dt)iRlKSAJqvA2~=?}r(C(@6?<7c<&$Bexa8i?xz*&7Ip1hZ7&;vxMQ z%(xB_!7EJ;$wKvnReVBsyyzTt+0px=u6dlSQ07UPVXdMw&7y@>l0-1h=vag zcuWa!DdhptoI>eUhF6yTL@%UE>zWS$j<=(I85wg{Q0e6miG zS0W8WQmG8=rpz;39A=*Ke*dC1`HFY@E4q-R64rrS0p?sFg_L#DnT@W_Vm*n{!m5vb zo`jh!4((GI2$3W}|5@k#3>B3tyAc&!boRYwjlAkrh@Q`x<)}{%Wy2G>7p|UgFKay^ z3>59jD2Z%9LaOE^=hPd{dY7@lM(0>gqa^v|VfL@U^!yg&TqK9p`Knj1Yd(1w$Ze4V zaZmf{RfFmtqSp#}{0QFT9*sbgf*4>#4=pD-@lV=ooGsL-HkS z*}8OY?u*jI$UrX)oMA1gYwRX=bjJ1iE_^2{|WeJodJZru&G$NLGYjFtpOP~ zm)tdH80#_hDx*J0d2n+s_l^7}%#Cc|u5vpPVLiCLNahJ6=nUS-I*sfz2d-h4tznlP zO-`{X+l)x|5X64Wh~%QG4Q&kprI#?;WSrBEuz#_1W*lVCY3xL29Pq+tt9DYgKkFEE z)zS8>u8862Fb-sgLXn_UX=F*vplYfd9)%wf$S!F@otTYIIE31x_hGX9sYg`)0qcX4 zR{yhBzf0Vbzkp;tM{f+>siaF#VvfMn0F9C-1SCXK_c@dIp(`T*Ffd$+lMKjSNAhk! zCK?>IOK0q{Y9H3EPg(;nsE#LfgJUY2bC4rxm$TeX8kgH^2o9ON_G0=|$(Z#x{Rw-r zm-8m7q(XK&%W;atLX3Z1}N_yQC&^~y2W9u66P|@ynLWiGQGMcYn8ae zVIJWm3NwP4oxI6*m9Wi9vLE4?Ci{^1tyaSKs(7brxSv~-^g7A68rR;Z@-cmHf!ARr zz(XKuQsO)$8KUHSmwy7cM7$T688;?D9!eRWg&NvhxssvNY`1QIg!{-g-J`2)v*3x5 zE%3$-{jVkeTQYTR#3)Yk%f=@K*1`B~AKCp{MiCj(%U1j4xFQ=TaLS?K`6~5qW zm79ERHTzoC-=M0>ezd8pbhNN11`&&le{S({EM>Uv^x@&p%adL1lR^RoO912c&y^*> zY#lbs5jl^~fOD4X!WF988rA3v-QaUoWu?wvuCtf$#mtd2vC7~=BV?Kmn_&blI#6N_ z5MYV3l@>Ccr_L%S;8a|wGiR&R8RSsH#;eeA zSO>8LLb!&qLdKg7S#;=ln_jWOommWxVz0J>$2#Jssl;idO9~fYouz9n*EN=@3JY|e z&@>5CbPPVBYgdP#rKtg$y%X461+%8ms~avJ4zlQU;+Mq@qUf)zr!3t<=e? za2DBEA^Mb?4!6L)lf@I4f^D-_ulS0j?F_<&-m>8`hu+HqrPB=)5y2m=fxT zCo(;k=>1FcLHKM@1K30AXa>bda1EIntgOq=Wi@N!ze>vdQ@GigGAKj7{I}s|Z45Qz zQSIXaTbUefZ%FK>X*}h(!p*{z(v#US8`+c?7@IPhbP2IZkF;SJnbI^(No38NNRRA` z($FqOW8^oHL)v8!I!uWikQg~IK5|fOe+IDY$88TSdHS83I>x8L8H6zQBy+Yve>3aWKk^$56rn zh$Z5EXQIL)5$X#fLDGYN4MG-fL7@8i&XX;N9t@Vewqpy zFN6+DLpi(1<|!(8G6XA>B?eHNnYJ-q=xP~)!=~%Fxw_mu5q>r}%{ zR`V^Y-ey&GJ#$SZqDMt6ksZ925tyzbR$wyYd=|07usmjxb3>}D$@N4qsE1DyFdfFO zvC`J+@?ToDzf;Y(=?`|QM&IdbU#q+?RmwWF|SLQk0T1@MwRuAuDaD~xPv>)w?06wr|MRf^Q}q{R)~*NHo+&5Cn~^K^dv~) z*i~{m=HZO-Hr&pKiT#QFT1S6HRw!GdRpHaLJ*3(l;&Yp-JIM9Gt#L6s^pi;Uh@(RR z8n?hw8yT(fTO4s)typoJSmHq0XgPbEuCYhGb3}JO%AMqz9?%tbTgls853k^mZ39T_ z#BW6p^!5_BIiXDa9&Q|)1ZXv0Ae3+l;Tlp-Vz3YW!pxnz)&ce25l5f1s{K)`$sv`u z%QAsKa3y)*4wb-1cHEem`!0*jotW+Yn8i1hr*^V8vvF1F*SZ{5m9$%>>~z*RtUfyC z=yy(ibi`5fkRxj!jfEJ3-^`exa=Ykl!yASh4cFQ2LnqnZvw?BSX(=YJMUTG)LtsINx6ImpfiH6HIopDSSZ&;Oa@ut(b zc*8LQg{r_il; z#u+QqLujdR3%-7RxIPOI4^VfKZR%irEx;I0O@e*H6wVN z>i-gKE-&4%4`;lJ&pM`D_0DHh1+JLe?7s{C9P*nA<(FZ8<B9V_c zQjT!Y5C+6m9wA9x|G2Z?W!?R(SH+VmlS7j?jD?1FgM*Un)kWDL2aPGkpt z8Mk++WDe0}_ESjoL#D9| z4^Edtkx=F|2b&$NVwNNcvK3RO35FGoD-=bZ!H_iRagrPJRo|_0c5sG`->MR&&aFlRnge76fi4{kG#<({whsTB3O)C8xUHC28lU92jaATV8P}RP(GQV;# zx`Zr=2{VB|Mwg7<7o9OUU2wF_b2#eZn2B#D)z2An5+k$-owv_)>}M)t9kX)keXCn; zRqt<84ZcwoH>&itD((|`A}EZB+k0eSIK0Q@I*Pufz-%Zh5#><~Hi0|JQUpG*L^WxZ z%2}f-e5UHG)6KtBO*g2TYgO^baBFoe41_BYq6C7_C1gxWoaAs5Y$Dsu3g}S_Z0|Z$ zwwp~_pt6^6TiI%>bfeEzoi&cCtC+TvJV(XMR1w0Ggif(Sr_#@tz!Mvx)A?A}{cu+x z%K?%mDs+Mho5-*fMy5F7UQ7GDl+&QfKmRlJD#O3=qm(xGGRm6ycG zs6Z_AMsT?o%=i}_G?G=y!wgLP3*m}?Q88GKaYtT;w-n7$RTnZHsp33cIEP6_$rE+# zSRFQk0WTz91P};2)WtG;@tTcz{axWO!Tq#?`uKnljM8$)2ES|U?$Yr1P!RR{G{Q3G_$AeB6d z5iWV$W0<@DVx^onP3KKv3R3bYQY}%qIC8kVEB`Kl<=+)2Wru#`%fnpsNn+ z$NhtoM*gpnGXEBmA{lXGN)vZulQ>d^KG|d28c#s)#+!OKJChXMC#8g`DM4~{sZDSg zUlY{_CG=@7A|^SSu%mCH`WVh7RR|ro4O=65po_9`A;vZ{mTA!gP#V6*2!^k*TaCsb zlKU3JKB3(3xRj9zNh6{%CWd8C3d^1nnlsJ6{A}OybN!0vcvV@*`=8fTo~06v#U5r0RYmqt3YBbur!!SzK3_F2ke#tz z#sF>-bY5qLuDenh)L5Y^EwL&r)|D_TEQU-}WR)6I+WKV%y7F>BRbFCMp-g4f6#(Tb z%dILaP@-zp{X{qT408-%HU2`^{Zv(3Nvgi;D$G43@2joRRoAHMA5%st&_<~7sjB%I zQTq-TXaK|->8NVzVn1?xYZ3tt3qhBP4I&)G~T8gZwDwh`9U}SK{eT?KH9I^ z?N@F0SZ(*K_xJEEgH5;VraP=AJ58GyjQ(-+y#q9B zh4LVG^J#Sm-X|T<_m3FpR!6D-@Cchez)>t|)9NUz9~@909)w`EI&8t_!-H14!;T)O zxOY#_Q>xuj#|MWTA3%QutpTG?C%GQUaBrIEVRJVa}oMqcX zI17`*d!1GTPCELX#?_`dkjDm<@QHONVPo**=m0pN=LgB+&HP7&|&RQ zINBZ4?N6xor*u1h1*_*tJ?K1_8Qo7X8?HT!(RxC6ILViqmBn!b-SN29@f6YN1Y}3Y z6An{_O~+F_P^!AqDOz?qVRb*@7<|q-#MhdOv^l&X=hi+)aaq-9iuOz3LC-cGH`T1^KZfG!P7Z=oVB>A!8t5ny?dN?4m|H1byfAo zc~5(FgAF0ZrH(Cyp6A~R9OCS8UiCzIR;uR!XejqNZ;ihI!P(=YcXwL44gTklZt=a? zp>qt+;^=u+^!ONWMagIO1bTQYr0FcaxcS&}l}LwpRetihg_~3W!b_S(yH^Q&` zxxnt{gL+&D?r|Zk$HnlTm!f-Ij_Q3W24$}+alJ1TbUh~_Fl1iVOTLnue{sEZX)$C8 zmZ4djM%#kAob~T|-lyvsz`M&?z^n5arwe6n95>9(g}VkN?nLLXb87f$hunZDasN7D zCU-aQEZpOAoAY+YZQFtOJDZ^FaM}zMWyT6;dkzuYiJ$UGjz3+F;s0z6JkLEfI81R+ zqQ1S6F=$hdfy*A#{vkXEKu_>P_B*8pp2RG`l-t%E8#w_9AOKKuOvWJG1_SaD4AH8M z8I7r-9s@E)a!gfkK!0#hUL|>0_dcQfoV2>a40D7`4Ii3T&MDRh$2hZKDv>#b^McGi zWi%u-*|RPTJ{!>U2Nfk}Y^b)o9IbY$#^2j$w9PUuO2e&Iqwnd=Q28xNQ!R0F z8f-DJy&wa4P4&Ol4d6I^sT#mH`xd^FYV{qU-~Z0`uj*_Pj|*PbCIW7l5$bJFb=SKf z-WvQgap6>L%`~cC=Ev)l}YPgo}U-R`g>VKhX!H4_=uxfs)YKUW5<6~75u)R%P z;}bfTHC7Y!NC{niH5^m|&Z@Yz^lXh>ZJDmOMm7Az4P9rostT8QiLSDk)I*iUy7E$0 z#f8dC1m;D;i)`207^6zJ-?-Vf0R=eikg)`)ze3kvq3SJ1sq4b8mPi2}<>BW`4|Wx$ ztS?+me++zv3X8Z5!Rcx)<8q+xGNR53<_h6k*oWII2+Gp4S=87I4cBr;7BV(O$(~KC zvFCv`*tuCc@pLF9n#QxAk{-%S+Cj0bk|?`6msOQ*W8l%sm0Inkx|R)oubRsoHI|!o zoO>B)z%(K({R-!B7Z}1`9vYByF^fkr6L~h{Sqf%DCNEQcF_(nZWG`M~DYwf-D-BT2 zLJwB{Y%(kWl=-tzrG}l%w3`YjlNQOJX@n9PJzyDYUT$5@wW~|jh1__hU?y$yXNcK! zD-W2d@}!zSL+8tux&_n8gFwg=KMa6wbEe`Om7LDivuLK6s@>$tmHgj8VpQKU z8iTl~UI~#UFr-XUWZ(FR-VowlRm0H;dM8G}jI9PFVj_DdMfRteOPR=O|D=e4p2SVL zsD3C>O^NJ>LkvNa6m6Iqo1=l8;sWUyS1=9<8ewYEqWYtX5=|(faoZRJW0M|9HYd$~ zMHCN7i0Bs^(Kj)CKx{<+(6Bxsp}oT*1_Z~C@Gm#UH)Dct;WS-+0h5C;mf*SBX;@&QoDAM~%8G zIU3ej#%j(SM*84D9FC8KZe52Pfv1KbrQLJFG&1W6xCf^3MEx40x2tvpwm89X=_yaYRZ`(a}S^fo7H<;RLgJq zO25jRb=GH&v`-VK^G-KulG*SSBaoNX#^yCV;W`~c{R+vtyW zJ*GMxp)*=>rz-pbhg^#UG?(&&qJ;SfjuPOE6IRj`ML<1ED} zccKSs3iiMT299b>Xt(+t=eA1KcdOz(s{AfA>B3!B(QX{BiuOQ2RTZQ4EpQa?(dG9T z8TPvTK2ya}sytg!QeSPaqsuAPOE#RYu-j3%S5?@jD(+DgaQHr5d_WHT=ipH;IEq<9 zX;s({@Vw;@IO`tPSR-{hrm7v#6%Ol)`&GsL4)kAfe+eoa{HI_h9m?{DtqOb517z-_ zRPmr-zg6jgYI;ZyKC2oWrWwxuMh`YB9s0Lml|Lw-`LL0BqW6zmy-%wu{Nzs2v#FvD zQ~lRrRX%Jwaa1}Cl*pA2k}qq)y__JcDx#@)#F+ihVNPwKPkewO=T&9%d5%c=zXEpU zx*+`6JXgJAjsa(I4S5->98{I|qZES!uA~0@FnQ|-j4+>Prq zmYSV?NzF(pGGCJYg`LN=Y`p~0^e@;HSoxrL#e+VT4xt2aI&)vR?v7ITksIa?b(WXg zr{W%G5x&sl?*!s#xdAP)gIQ0FlLqvdT&P|M$QuG!aY1Nf4fz27wLvx zhne0|Wv?p45V~E)TVNZqvp8)g%kO3cji9XAlcykMpzOhC|N8x7_lTWL4teq-f)W9BK9^DU>U>~Arh zLC^UPa>3WC{#Mm`w{EvrHQ%8seQRZ6D*W1>6EQ_%x|C^@z?7Q3$-i;xxm2evQ^`x*Rid2BQ-YAZSf|i;LP;TQsVZDfW~9j%s@dnN-Y4A8HEXez zJYOX*gfaawVgW(7Z7%mKfgpaJXlASAIXZE+0juH!mQ)jGLEz@El_c1_{tDG#rK-A2 z7c6k3&W2ZMd`q1)LnW2=KiyUOsN#9X&(y?pdcrs=UL05B#L`ldcM7n$U7{M0Nm2C} z7^3s$F|a*>N0|dXoL*aoV{8C3+nqLjCQt(poSrlKrxQ*==giebSe!4ROAk-G=5jI= zx%j?3#CX~~%H_`+4P~qjV1Uvz#mh25Ru=U6WkI16xFWFKdn^;O=dknYONFUfMrr`n z94v^qPT|@?mIFq1cSXUhEMzUisxgq2k!fNp)+ww|!MRR$mqeoj2p#|*T}ja2DlNzF+74u2!VP8QB0^^-AHrHoY3{5tH--9s6!<}e`>5?{I=HB9zE>Zknrn7}aY zKhOw7AU90no=LKE5|jD@2SH}lWb{c@1r2dTjKclKfVAA1s%S0-IIH?HT{zFmox?q} zaRbMWQ^CU&^8<%5dyw&Llr`j_VGyV{QE<$A8sP|(q^H19RsbPka*_iTF-|2+=5{k2 z-4^L;%dMI#IS}N|>mcqH68B=o5U#%-B!exTI!zaRO$>JJ)QZkq3+#zWZN*=ISjHD3`~(^E-D?&iDkg2 zN$+ChClEXtHdg3VYQiRSrewa@d{XQUS6G#oa+9FsSt^=Qqdbt2qBvG|`7v>%l8X!I z;Ay5rlfA>4siWSY>|#$%&f8UYgGNuREzbh?q}Qv zKXJK=l7QO?iOY?YQlKN3GKmaw_%a6c+Sz2KTO)Be6Qm_snpxA_b}ni;9lk2-b)&EN zD6HNlN8#sIqQ`bZQEM#7vSpo}fGx11K6XUP=5~^yZ40n;1t(ik)S&8yN?Oaek2T+- zT5VH}zEg!?s`#~%WybJk9rcAH%IrWSo9&r2G?XR*&6S2`QqpwH1~*{ClFCiomM9iV z24Fi1zg11Pst&tV6FBza8;L z{?^LgrkdtsJ#j4kg@j$5}E%UgY&s>5u@={0z>!tLXF;s zQ8Ez#mI-2M?{M@7aP?URI*!{Y5b?4VCHvXQQ2zufnN!f`h^o4W+Z!eRppuwLR~mBc ze*@hAlBWP}K#{*TNey0kJ5|5qDu0(1zk{g?iMv(eF6O=^?$impRD!)##G8-|h_`@E z@jIAL0VM5|Jcu2XQ+6=2AoU04)+LGoS`+q`IsCs3Ttl9PDTF)KfaADCIE9_o@$bOC zN^bz2vrHg(S$J_I0i?@eRlJ`z@!U#7CGIhn|1RG88O)!7Cr#a@x*sL2iSx$GHdyjW z+<*o@AK*;d0eF?$>61kGCGGMrw;Kpf-W!;*HzZ|WSn|HGl*3_Z2dZZ5Fo{cslri~A zvZoB>rR&pIKrrkKl;cuA^G({}o4DIMaR-2()!wzetJqIe^cvY(6|)THpjDh=WNtE5qZZ`w#hQ~ZO3b;KXE7tYVDBWdn0tss zN*NCK0GfrI^kWvPED1DjwpP{ulw3v{dMI%Qj2mD@*t?CGBpPPci1Wal^ay67vq}64 zdK%#+&IY}du$e3q=J9HH!@PGufY&Ky40t-F$L9z5inxnw}XCgCVCE9FTNA>2;I){BNa0|ZGP zkf{bwV%4=xB-~dWJ58s}<|eh3mhigqvFidpp)5B;N5X*=zgPBB5${_3VH_TewSWy3 zG{NmEvqNJ8Cpl33bMeDf*myE8aPMU=OI>#vpIBF#FQmzI?sRDmDRK3UAa1$Y5L0}6 z%Xa%^H36mM4MBF$U5CJ2AuCMMk(ekXJ1W#zYStGjdzMa{$!E`@W9{XMtW&Tcvez=M z#S2O|I*04+qVlI-%L%7>Z;1Fgc1rE`XqjdZ@ZtNmSNmk9Jyn4lRth`xV7{-rt zMB}4!32D}n4nNm2(+z*K;Y(iwdrKGpK2X|v|K8k`H)g0x9AQ?qq!_TI#fm9^7OQFF z*c6F1X)k6BaT^!2<%(qMc)+CaNZD2Ub&-rDluY*F4lmGz^x*C-i9=QL2rFkY6NMOu zwSX}-I8n-Iizn)@LVKye&MKgj^6#VqI%_`)-0%fe(HH?50Ie1v0+c9qU^i!IKMNl? zWhChsoCWdkH-@luR36oX)H>?n+%WN9WI^ zvK({UxVf}!Wuyb;|Lxz$l~4!4+zF!b<86S_3NR^reYJmI*`B(;_U}(RCT656H-YJY z1+)31;@-obwQ#n|nyOMJvNdd|Bm@po{)1KEU@MRe4tH#yiJ|V(Vt^F!G6rfUDCO*Fd-8R=_AvC&G;CZN+X+j0&^0| z@QIA3$)0BwFS4pHAlHwTEyz7k&qwP&RsdjyE<^wSrxOXS%Pj zKjdrRF~pJaVHjr}i4m>5NW%+Bm?>@qJQy5;$=-G{Y-Pwa`YuBB5Kx*8*y!k(LxfQZ zb$dcHRS4XR>AKu3RXE?Oxl%X&SXE!5@)G=s;WN$SsRSIPxJJpe9a)e7t zHtZ!On{Nkz!0o8TJxyH92W#~|Q%%=0-z^;ut~8NgTErIz(9GtK2w|6mMG~6HXi7lm zSW0qFaF->+ToTL8jzvkURrSwRi;a$^n|0wADpqpQ#olahM2|dL_OX@?k4izjd7+ue zI?=_C5s%+RNQtBWv5NeZYli4GI{$OsbhB#pHFsGmx0b5~EDX57_{@s=lzSo3Oq4EA zPvu)6s}a|3g-BrRlTot>N;+#6uXY;{j$8Vn7wa!D=dM`>(a`= zX0q(v6U{r(WD_MLunCJUtexUE^3`nb{-9fK)frff$#N@xBlWUEb41%qwSNcPgNd(N ziibI7`c}2y;mG=yE5>Ln|FFiBH6+0e5&kFO>9`%kS6o$=`%1Unsj6}3 z1=-X|2sO5TV@NbA{{Uuj`zBxG6YA-ghfWfB@-k#Y|3Mf5jass&gJYGF@ybAS*{waRt;9_ zqQ#E5d7M2%43R;5PQ=2DD4A^?W?NRbjhhysB_H$HvvxS9X%9e?GFKJy-87u*t1Pv$ z=JSmZ;h5QH+B1Hr>sZ^_Krjr$AdQFDGAU@f(G7B{51Gr%*TO~30Jey629;_VV3=jjmD%! zj7!E&-~@(E5>|!J;pmAOSItGH&`caT+cH#qNa$mysU?hT$Qn%+xuvb)`j2LE@L< zJ3tu!5;4g(_INUCA4`_R)k#T{ZDwH1+>W}AoWxL?%-M`*sUe#!RGg>s=5bLFi;wNW zeLxO$EdheCpm05}m4$!`u&Z?bU3#tyWHn)y6*f(So^$!cl+;NL2|U5~DmRU55MvoI zl7azb&#EVa?KKfjQSww<9&&Rd-q;Cz-i$R=(L5{)xGt!OMZp}tuR3m`juRx( zI&X%RGgYTz6*-K1rUdo2xfmaA3Zwmmg7L+&n!JYWy&^=0oAU7MEJ|T*XwX>)ceSGW zsF;D|HPXj3&!_^UU96(H_Ch;lBv#_I;kLUrZ$k3L5G8)lbV2{*R_s%Bq!1ug90CIu zzrz@u7;ac&rHv&eR4|jP?27XkU4ieIJW3@F(b4^_;2!*7{v8!SRtO&zJ#>+-@V(5r zI?=$K#g}IMF!I@`VTjEDM%Mg4AZ7kB+?+vMMg7#`~o}s1a|cf=%Rf)Sn?;}|G>8+ zFQ1e~;3Y%Vx1;4N92l;$pImekc9lGe+dk(_Q0+|Zm>fNZejKajCDxMKqbn-Ck`!+wx?-;${bFrhb8+V{4(y@7~PDt&=F*918q*%5r`paxY=I{f_vOCVAVZf2`}Ra6lw-aG=-04 z1YqV2Rlu8yTu-$nqltGdL2*~v7!9y6NW6vVOvzRHwP3N1b0+wz;FwP2+ z8O8ANp%XZ`=gi>_KA1@Atk9L0GDI_ZrivlmV>L8hJgV2fV0gFt}He@>Y1m|zURFDroh*< z&EjWTc?-!oHeM|kaK0l7J{-M3v_fE{56;ElAQu6|Z)Xl?t8GkAj!N+zg;6p}aVW|A zz$;Ch1E*8hTcsMUQ5BZx)H$}X?XZd^+*5oumm@3AuI<;_#xAmnaD^Sw$u_ch)pW8$ zXIb!Q^A=k5SF0wgRmG*udP5J!T}HQX)5GbDTM_ceF>EdbPfy(w#-X=8`%v?U(!2qU z#1r?!j$Wt=m#W5VtcIVfoF%m6IsvCxpraPRzZZ=xEf@yHH&)v3t^7lfy|M*+eIh&; z%Gf2UXq9TQ)~dEzCz$Xkv@YSx^=XEZToqPC_Ob^`d#U55vEBj`JY_RqFedr6OvSHK zRX$elexZt2^ARzYXXrUvqN`}OR2F7Zz76L2^V`7Z%tCvukR2HfHMWY|OSRa@zp(w&oc``2L}#mh5!E{R=O z%`cVv1q01uR^t@%z1BeXu=yW?9YVloaD4a`tNbwkpno*I6=lraC}k$RBrlXo`q=T& zMiqxux&$C#q0UQ(-_%^avT$G9e+v5${4^~2rdX@!Q~c+3%rY+QJ^or&H2yiu@Sg-6 zQ7a9c(W?OOs8v4Et9@hE_{FRVi2lSc_T#{q)d6vzgv5Rx8uwY_#7{S*Gg*nqGW-kQ zioH%Y`u!qvsR^YaUz57r8N1RMv%)KCxdSJ{>B#&pE4gLN{q+WP^kT+2;x>$A427}O zk&D_#cGKKkO+tIhf5EdnZ8KV}k3ShLsNXUU`fr_5X zjp15gwZB{?VBj)5yNpYv844H3P`pts1&*ag=5UIE8Uy1jR?{${ELF`g>f)EeDP+hs zgE=P!;V0lb?rzh29e8sG>!7K1=apCgvD2MP?-x;+}tn*8oC1B2C^PS2m$C$GVWb|n$nb(Rru zY{)N25RDknQhZ&{qg*lpS$4Yh?AfErN0q|bz^zS%w>F2-<#kPD5WP^9G*w06!`qH- ziMuNvH3Mf*l?R_}4HWi7a^4A|)vWrC}aa z%i;(nOO%=?v zaIUILcp~$Hp|}xDL6YSs7oz>s zxEB_}I)0ccH&W$H;?68s=v7(BC3EgXRc?fi9iStz$n7X=?T$tuTMiN&Q{@mt{2mpTdN+^s@7hJg6B1ljvl4nK;QXB4rca8*+5Qkf`_}VdaK~q>c_w z9~Y82Auw~IU)ng|awEMHhIq#g(vdw>82%;vw!*n|Bu(Yp9#_^}0#;q6fnjG*0;b78 zg~@M_JRH}W7rh8$!9uHe2AQ*ru_|de17t$*XO-U-okQ^NLJ|jmN-}(gpOb$oX)_7a zq9E*yt0V$?3f+hwdyGn*K-#YY-)65W%q8!bjz94jGC`sJZIaTyZG^@2>qp>j^kjvq9P%|3B)BGk zu{O$oh{!_F_%qOkTYQt&l_5q3AdW#Y0MRC7jEbJfSLo-?RTUPH80IEY3;3S4l&K8H z3Fd&sLu3fEw-7gnyF2k5^2~TgeW`&Jvi6t2oX80zeX?hh>NcBxnbW1s>N}+OKCg3dM;%m%s@18MV5REBt2A_viUrfgc-!6Z?N}Hi$;9k6C`s7hEf7{)fCU*>u zOE9OipQ7*(u?(BYZ;?HZySp`5CC^^wZ~}&J0VhLX&+ddLVMN%DMUc27q0+NUDH=E{ zw*Mj3Nh)rJ&XC>F>a8M~RkV;XGVoV|NeuC`!E2GnM223WuS1T;bmH=aNSDAhoN1F# z#sf26n(Z>eezFxgL#NJRlx+PK+^!%06Zm0~eDDRQjZR_kG>4}v8EO+i#tW2w{s3X@ zgeMg@(H7$8GE@rAC0sGw0?BZ5X+zt=z7)i%g}^h~4z86k zj{#GSS6L`i=gHynFq6Kr@z*`vaVU+CjvkEg2F&wDV@c}AeH40&o5g+pny$uu%@lg- zX)HE4*KCK_+h_OemL1Z7D5ZBP%{oM$yHdtNC2Ec;T&$X`a@1O;k|ly&nye5z63RX) zS4UWA$@AXu*^Y3AzP}Z28_JSWXKP4N&F7X(4P`UGc*e=|6j&ya!;-}q7E64g+f2%T z0Ew}B3)o~np}mZpr=sWSnyamPScIchG%zq$;Kid zWBzRUtMK2#uY+3>J$RnW^(#$oE8JHo+ zjX%;exP!5l7GLA&%FmT1%7!AbK0XRSY`@LH1RVTj?oBH=Q5qWKt=I;$s{6!wt;)b3FBN-b{6CG zf$?8TR5|aE0pS$J@!Xz?*de-&o284GHKQ7?SYt;ul0p1W=FI1&fec`otb%N!q{L$px`bQ?!3SWdz7;s5cuIhAmc+SA zn!%vy8j?;0mpFH>Rc@w=K>tkkp;sm_{d+vm8}ERxCG3W6CNlju+PhC``*Ku9UU8F85WM;13&rm0&13&L|H=jSYR~arEbt zr$`*l5>;y@Lr&maWzMn^r}FJWbh8DQj;1v1m4yv+B57i8qGVa};Mrv<%NeW`&}TBAC39=e zs=^9YTFB?h>GE#ru+dnRX#e2`X02p^6_bO4ET#fnPr>ac_tn0=p&=t9D?tYYSr4L>LO@Ry z*i-rU&_TT!B_Q;Q_U)m9`s%2`R{RLQaJpc+Dw^%6wpdqMpz>!hBm@i3$U!<3ee(T5 z!fSM6Xo9R~DL@I0PggE`{m3{FSnB$AHY;wk2DjJRq1{weZ%IlTsdA=ror^EUEqD#1 z!8jMg)YylZMLO5-b`S1ld#UxihwRqq;I1m7mo7I%rHtT$J%5J7yni}RUOtU;B@9uK zy%~MugTsX=!1BLTx9tJDHwx{H%+gQdTnwcEL6WV6tQpR&cJiikHC;vC3!XF8N*PCH zDzYy_ct{bnv;5klw7U|{!G$^@waZh>LFePafACy(?_8|%!Qs&eFe0@>4a_9RErNN2)eg)bS>)qFAc5AWtyczs=$ zm{*)KE-S7@d*$2KeR0LOqZQVRTll1m;$Jgwnl6%PCE5Om>{s$|{F%tnxH{yqLW7ZS z!;eZ{rUQN<{#rPfUl;8oVKt1e!C%(IGIf;ybQe;L;eAxxFmgSa6PaCRw!AKw$!h8t z6*rXI2nBR^_;u%P6WB}n_2P|Wvy}{`@uX%LQ{##;Gr?vhC51j#^l%+NMx{@-3TAOY z!Ju4u0k_NMYve~Wj4hyl$)I453wBryK`vH!S%Tw;J-#qlPBI%AaYLqt1TaRQSZ+h5 zv!?6fx!ltmexxKlsg$WCn1eB(Fg%ZdF{5wn;g4*NVRizC8D__fhBh^0#!Zhw(;j4l zM_^1Ozmo;Ogdq=fTZ`xG3`PU0NX#E%&yYfMtc3YcC^cl;fSG+Rw}ul2&c)L~kHI%~ z0y^i`=u8xnjg9l>*h8}`UeSP)jeu3pDUFcn5Q309wpp<3s^hX@HGCWirW~w$`S6Y3 z4i}T@V_5lfFCO=^2u`aZ<`D#YHcFYNMI){D%x$J>m&VNf=5$u%B&G`U!I3-=W4h2B zN76Ja40F7Pv8yWsoYV>wk0iu|{FrH;&Vl$7^hKbTv(TTg;C4uetd5+-Bwl!vbyqUj z2Y;BfIVy^-lJR?NA4qyO?i5dFzb@U?3S$ZGH3k6BOM=PW30y9T^^Kj*eRitL-gVWM zP=>}ni@1PrzZe^AT&~IR>V)^PNhsUHldvEPZio$9X#iPx83rE5&0t(i-Icoja=Jk& z@UR)_L*LZob{S7s4srLxt|UR-K-^Q~yuJ;_f2A8u2VKX_rZd!Vg|53y!=a3{J#2A* z`4G}L*|s;#v)j)b?XFOoRRNmHAe?9Mk~nZU?u=TBn4&V~s#?obqczMrj4{g_b2!!m zvc`~Lbx}&IRBesjtxLwK-wG^67}Eq{rpjG_E6IH6WGu|4yW)xLb&FZmaOomz9%_Ub zqK5tR>%R$mH3fvq5{?ThoDqM*S&Rj1vWoXY_zY*5@HL)KyiuCDe z1%^j^qh}lL5AX(fl(0^6_*|~8t1PuDEag$Su;xVJ^Kc512y({%Inc9(HFm^Ik`ygh zvTBI4H!T0#;O~Vmh>vZUJM(43W?4Cl8DwYv74q#|-|;OdxqxNhc>z7_xj5%Vn`wp1 ze>G|jx%i?b{MX?Jf{pxvjWIqL;0T}VhFADp?}&MTGh%^P)I6Wa`QA|rd?ObHM9m9` zT<9OQ@WVuVD__IKm?S2~%cN5#BO^^~vzD>Lh&gWX^13dIx#`{tUK3+!Xa!*zOnM7r zJEUqt?b`clJ!3u0UX8LaFf%VTT_XaBsB?bAuh3Q@X28S0P8nNL_t(SwC6jSmFx-27}HFiwS-O7vD5fisO~aOshG!8 z@N2r}!63}VBu8+F;YR?@&ODHFu4|@d{ti#!PSp{m`3&}?EYqTjnx@l*=W4iG)m+3W zH4&fLo|@SYUzsf4f;a#MbTjC0hz}4tLBW$L2}t4lm0gy$BVqdk;gd+36wZayWs^af zvs4^9p&LUd$0k{9Cr8{Kmv;nr%WY=ILo8@j|8i2Z18UJGXxUkxW>?)d^o&P?vh8!^%L zc#YTUc7Q#qwoeO}*!GI)))MqxaXPfxt}N|?N9ri71*Y<=Rd8(-P<}plKS-LaBF6lo z6K)V7k4ybonkvukZpEr~l_;?-1#{@#$)*Id4do0KJD$6@V98*D{dttx zw*jSeBK_FQ4ZCWuP;9dxm%S`cNVNnGwW7x|!X=dw3(NkL@#fvn z+{RSafHq8o3&|H*HWKdG7T5k8ZoxG9^8L-qznjMTG`b(DlkACx&R{x7@l3|NFw16` zj_Av!u5Wu17Fa>sD_{50xE*1L3^bV#2O%}gGMU7UZP`HwcTthORnk!QO!j0JqlC)O zVHiZ_IDUqh{=(Dm5T-$p0^558F?QgP&OcgS^iW|sKo$LuJZz_Xa z@YN(%hI9Zv-_ zc_k|?;9GsNvCbN%$_?gs59=wN|KBHNq9aJM0O4WXLqoa-g>(S|gFAZ%cJc}8>>bn@ z7u3F*Vcm3OPkeOlc7u=3=%WRU3(B3WGw`bncf=1;Q9V^4es%l?ZM9z;`uK zMmB#7%a4Ms^lL*K9LP;~`dG<4os}~gx09n16YcniNFD7+8DTDy=||`ryEnq)EH==g zziGwKL&2>yKN|y`^6r?o zX48|d`^t4A*->PC-MYz>>dl?5xfRnS{MGmlX*l}0q=hq>bO$}|-T-o|hDLP=&#L?- ztB^T_Dtt$bgYdFjD>>%#+QiUR?-CKJz*ljAXsA=U!{hBIW)0jR47I_oY7{5 zIYVVq+*C`{_g}*!>V+<>sJ$Bh7Cx1Yq|a@dZ0DXI z(&m+nA78S%unh=fKpPzBQoapStgLzbXX1J$&*6jOu<49rGK^2jXOs1qA!u+Ei5Mxl z1R_WCR@gR%7&6~9Vwxjiu4=eK)m(w~A#J$mLTOebLP$Xf2d0$-G`Ux6|01yD&p_j!cPs&dv*NrRxvLD-xQhkxxJz-X)e+1gdx8S#noT;0x=1SXMy;CVvg1Pc`hyO#^mjd4?be3+p%Kjp6nEm(R z?y&SFvaey&m3%`=_zcS=mHfM4CvPZi$X@~i|1e}U_%@cNtDT9s@3;uJ|9iZW=6B?E zAUPGzd=tPKMmQp7`Gn5(4x8(Yoa+-g&o^SeZ}e>chy~%%b0j)OHu`0z(lVwjrK5DE zHAxW7#*8K25p%tSNi@K@+>onb{&i)+A%%kLgPA|A`PjUP%&lZT|1@%x7&#lQv2y3} zF5|bB+s*U-GPj!n??)LrOb>*uk)e#2&K_RK3&@Az_%ns)3g*sey2c8t(Z{3}JiGOT z>F^DpD~_&^4Rzw##6iy}vWW$hVL&93R_^oY0pX#lfFu z@*O4OgL4NFJ)J2eSaLVOj9}&K|Ek)8Rjh0jCn3HG09U3V^exQ;*=pu z&Q?~`6z0p+SZdW3Q@D_=v=zZ~n2#fU6G zB!I=W$}mm#&JT7esYC9n0UuZU4|Mp+!|dQ;I(oE9mIv+dZ?P1rx{y1bWKNYmTt?bU zCy(_Mi5P~lNZ5-+xR?j(25#9?>0(%VaEIF1VXi%QXFIAbjMBY?YJe%*;E}D&R=SUY~ zD7udY8~?U;Z|>6p_yDf6l!kpN7#CAQS#+?1goKLY7AVYt!Z)fkPgR|-u}DvNTj&bl zer2_3^(^Be`xu_ZgtUZ)bPWzAd;>c81$OibXzv}^f!v4vx#ctYw^6>WRe&%lK^^$z zWBTHn@~h@fx603BP*!3N$Q#RZr}L*x8m40U@FUrm&m7LvnclR2Tl{bAQ@Bp;GLTl6{Qqa} zz2B`WmVNIr=LA+Fu0_r{qk@=r-iGZq=YWEWB1q0T3j$);>Ur-E@4e^TbKn2;{eHex zJ?5BeEffUZ_j&4>vqz8W>grroUEPDnXk%J;cWdz>&Nr<)Up;OU;|6Sg^rShTw}#cU z>gCiA#f(lL5aS{2ZG`awvoly6g!{<$MO$ZlEUoI_QBD4Y%dQt5#`|mIWyT3-Os;8^ zVuG1>s2bMzSAB*BCkC?zHn%jz@UDk?KpJc6K$>s#7%|iK;dHb7JYS@L zyvDuX^Nv>|htmK&$Q9q+@Z_`&2N1(!nb$DW*isWW-PmN4Zhkh_v}PV}EjUxHyoe`7 z+?4*vR~V$1p5rbn<43}nOf|9o41nW1j|H~WggGXSG9XM*$2iG(&h=N>bixu?7`hYolg%ji| zJIW*^&|`sIl1n(_h2tFzEl!x3{=%7UoC5IlIg5PIo2n485P%m?P_V!eW*|kTt;bSD z9dCmXF$zpS*r&h-s#Aqhn;7G=o7)}QX%660I+iQ#v;<0D~+ zQ1;wmi)Q5&T$wm1{yiTElUU<~hLpEzKuYroYOFt&+akVQHpJ5OgQ3S){6rGr1ioar zrB|`|{Ou<;dpF+Z;=OpArk@l{M*-3&B59A1Y6w%2D0GjGE1WhX!idP7W!Jc8>N&OG zw|rV_`Z+PoD~Z(hEmC+~h)g4Q@fat zEK2N-`Y|MXNcpkg_)&VuimP~B|Lq4hD#eC%D%wbI?;g;viUlgPg3KrtHY1?OwMQ;< zHN&$%wbp%84f8oOquIcuu>qo+`ZGUmDOIb z<)|pDpxILZlfjkhuSjpPuWmFSb7-W!F9>~DDro55qQB~frqIyF1G>x$QkTAeD6OgA z7yqLWr}FO&BH>sVRm=ieoGo8hTfe1rQSEoezh|hO%N)Q_V&r0b)z{TOe((h%&RxYE z!9JLeHWPq6Jz>I(t2Im-{;~;u!(V;A=MD^_YO+V3;-$n zRxHsf|6}#+k9-DkIPBw^e0-T2fk1ZHkIFY@g8;qlg`7XfLYhJrUExCz&;Eq#>mp5| zE{N9`;V4i_msSY^oPV(+i6_Q;0zOErRq5|Pwx0SH-P^knepPlOVv(vB8W&SxuO0Bv z@FhvJ$Y}6piPuV7I_8|mpXHC=be^V+on=>Xvt^0&-F78a;OmzdmU72WImOu=2f{PA ztk=0@*J<-{%E|UD-_N>La>ajWRl>1x?u8H-z?sais5R(xp`h75qTduSY#;GfQ%W*Z z8Zh%Tdq|Jml+=Wtzv(MHL2$>m=!GEzk%m+fhmcGxFIk$h;N*aR5vvqazwOFe-EeEx z88-hm;*rWZ>qo!l82&uTY2M7!Z&2_hDRp=p@M$0{8kQADBZmMvbU07wti95H{5Btr ze(W2ZToj`MD!Z_c2qcttCD?%OzGg!JZh#{tZzEvm7U{ui*74Tj3)pBj-$JT?{2S_1 za_>C#fukVUVp1UF{GP|I-NakJwS^_$h7Bctg}|Ahv(h6_A8_ISmcZ&um6Vs+YKvlg z;hs&O6|kNH_|vzc(V)4E*`>B^#rH^Xl|<-D3hZu8-(Sr-(oXjlyC!Y9iF?cPGpz;3 zTEn6#WHhh#fbSJe-w8x8Vs$F$71-pkk(d!U>?I$M}r2FWd$ERcS8A zoxQg;MKp`41)EDcm=F`XXN1E6#7-Y5ztVz>nInEvD=+>Htz{=L3~j#7B{kBr*PM~Y z-J1Iat|F7)PeVzhLT$HE#wv47lR$~AV~DJE{DJp7oPOF_Ej?H*KaO(!h`l%Ti}m2B zEj6EVLMqH3c9noaBp(WbMQ1O1ec%L|1AdFi;ysK$BcE0a4s+`uIpUs^1@yr>Yj0}Gg zM~9|Q`*>*b_WprweS_FpCJwzvRf=hq#D&4c)t|tleib9S{1RwS{h%88q?*6Cz3>Pv zwB`anaw^ZptJLP=qns;Kfrmc|QV>y9PI9XR_k)pFvCfd!TfB|jNoBXCKvrPNha%Ws zu)kV-ge=q}x87<$a)Z9I;v}9zvv!jsm&@3o)8`86d#9~O2cifW2(*Zak~%J=IbRK76h9$7YBP0y4i%h;Y~)MlNsMKF5(6CBFb zQ8@M6QE25cvzvOPHTO(=)m4mWfA${5hU;2xJF_I^aA$Mbg2;6msUr4a5|U=)6s|>z z+Nab3!tpA?^Ut@|UvF>y2EAJOYW1CO7g@dahXWPnSAdvOtT_^W!utj>C@ns1-{_n% z7M>gyejI*wD$!YTfum$9-CuuX&u59$hCC4_f?>@W7m&u3yCpMz%>yvq0wOY^WjhI` z$d`@Bg_kjD{go^3xJzixxfV&p3^*w}PVdT*<3h-qU3|dDwZavs7Y&od+zVv-w;$-M zE3S1oX=Rq2@Gc=F?+iPmhz!vjiCi=#k&C9p?uC~T(Vp>V(dJ(9l|7V{-+P24?ytYY z0CK-wew;gMPwdbxx{T@Pum9rf6;h?7lT16SvXg}S3#`nH16E@aM!ia>q$cllIz^_&_&bV}G`iZGnWo%7my7MExoXOAlkgLNeV0DX$eX&nK+fY(1xxx)8 zil1z!)R_Fsf)xSg{CeGqm|loiVORlywY4n7tdIE4Fz}zc9jiu1nGSPD9!nJnCv!0! zm2jHZ->{YFvAO92q`8FOT(5B+K`fbeqFTsB6?~BN&$wWC^{U<3K@q z!MS%O^*i-&HSbh=0oiMnsn!LX=#f~j2FSOTlWJWF6-uyM2ugf(&)inFV)RJn;fEAWd zTk2hEj4!ci9b4Ll64M?S<>6wOwO=Y#YuTyxMt>Cf38^;MIYP1gR5kx-e4-bPER;3A zI)uSR%37#z{PKu47iwKz;1XN)zEHN+?;CTmux!IjGxPIm*|E;D)73hu;Wy*ENY%@ZA6Gy`8HHzL2B0TSSj9DEjhwn92>5-9+evY6%IA4 zPNDVB{H#4q1(AAN>-C0IlWl59rQSA&hWfAErLCi|JBjTB@3yDyP>!udM_Nm*_&-dJ z)kD|XYtO3GDE=d#cBX&a?t35nVnFEricVw~g%Uy(Sy|+-%?qW-t!W={tY_YCa$I$m z3z8qb&CS*uHJ_iytz^MI6#waJCf8)pQC^dZNg)c@EN_XgoINEsLs<&~FeaJxx_0{B z%vXMlRNe55kHiF?KZ}l38!ogpfFHey0=7Xj@@Xn%?iUznY}o;n{a_ML2Fx*m!iM63 z%-zmEM25NKEo^TiAB$|(i^lDvw{SOFd!br!lB<1Y?V{q0EIRG}QU%1ALY+~g66yeN zC#lFbnkW+Fceqey&K|ywu0n0(qf2P->+!hhEIwS#*`>}ASp=QTG$;hwns_5G7%0qS zy!vZ2}Hf{#v{4!gK%Rb z%&j*f^-(n$kGR&NqpcO^!m8DJ;yZ4-S#zOUe1cO^lQrFNyNzaz0Bkx<7rS!PO@L;l zhNF#5$hOYpv=wvQ;O^Gc1J&#!)e6Qi){v*Z4M#N$%(JvC?eAKwZMdlhd~7Q0IKck= z!qh+lHku|vv2fScZv1yN(Jwj2#X6d&{`_6_*iBCQEj?GwKF;JWA~BD%V)57>>{?`E zF~~_jr~8brmkR%K$xhs}1Ln-5)v~ip`j6ehD^*L*TIG1YnyFP>2(hpo4E{?lCK~`J z5su}D#VmdkA#i-rvKPW5oE=+urdofsttIC#|H8Jl?kal)BU&*#M~ngzMG4 zVf0bFKfL9&zu1ffbwD`t&vNCBCV{{Gz-86sct(;+5f@S-=?wO4*EA& z)fWb_jfV9H&s(+QQ{S>vHzL8;36a}E__Ha8Kpk^ONcl2k(2z%qq)VVksGR&-a}Dc{ zdaUNXS@n&8rh}wQsx(v)e@EyF(-yuXBZOmxz3mB|kknUxiRSS158M7F&Ut5b>leXU!%yU>7zH3Mwez|Ez)>6> zPnzLrtBa$P{}P~K-T_iebiKKlD=u}O{;@UZVr2tR;-rRIr@Ak2Vbj4%8hbVSl2o$R zOq=lT4SLA_B2d6A(S_=tKSj*X(rM=P>mfVRv!W+pxQ@e_bb8H76)di)zTgj zBdGez_fpKH&%3tmdN#&bKxb}1XT}A=gy~)AOgleu#?>#E-Tt4ezW-mV`Op#$GIou@ zIrM(00$ z*PfdLkWs@d!9A(fR1c`pLq35%KOQi5>DQA_R-@-4ranC`zJmDim+vu@7%dZqYhv0}oP#9>hg$e0@Rieoq_Bxq4amMAt3@MoVzB#;{N*MH#?vHEg* zwsI^I$P^=|EJ2I|#oF>SFvLZ(3V`2`i#Uot?^Lzw5+c^0zsJ3L?X~uNO%BI8DfZZC zV$3jD;^ds#BXH=8bmK)4G674o!%ga+Fhz@{8024_H#+Fne;v5y@dn&^T zB`%{BWl8D9eO@u_vm$JZnjKpflcUrDBoKC>ueDZaO;MKFNxgpUxd@*Nsae2Xyo&~-kvvfx;IWWRKlxavWwO~=22 zuGs~phTA_=Ga8i6Th1uhp2C%&QkVLCPiQf(u=zc*x3%Cfr;s*W>^%N8M=QM1-dS?I znzgT*{ztiIz_4lOJ4?GShds ztT@39xR2hn@#`wr$1FM8p0x{yl%mF3_kTlS(oX8?(Y7NL?+@#(t-d!RthdE<@>Vs7 z=^zXlDCWzLRqHOG+(~!dbctJC{28Y9@F(pd6{J`|CQ1voonkdWs|0}aECbL>q2xEdx$A4iHiL$K6vf@JBj*8F|d%umD>_z-cS2F$-RC1A^diy4J= zL882lagNR%BJXf1?d)9`WmZUAzW{AOlD~viNI6Q0_D8|_;`OXuoRU$~1m{7j*8Pcm zr*i1c$lEpu@H(nlF{gsTV%Bo88objU{uqCxr3W!Vt-Z*ZtH;0YY`TgWEWJ^7fdl>< z)uh+k18PoM)X7Edb*L$ezSqI&dsCF7(s^rS1={^E6VMubhof9`KBw`pOM?P_mF42IJI28p{E^ku5*~ZSOn6v_-j5QB{Dqqb!b-RnXzgnqo zbb(u`x8CF;qUFbN{~7rdFDZ;!Sf)DRg%t$*-)FQGOI~={&9<;3!R}*P)Ht#6% zVCG}&^VOQitBn^mxpy?{J#+=5kJ@+k7u7UPF&}D1s7*P=UhByvCK^pW{%~5`1{%C< z2APuD13No|zML4Rn-V|7oTd4T32wo$YUR21#xMCgj3x#3rRB_hn0`22`B_|192T6~ zj^n^?ya(&~7YOTh%&o-41g-hEGvF8@YZ>6Q=Q;dewr~`g+jiDpsg|7KgL8xXCk%RF zNb?QOJBq|a!dimeolIF&{JHTwS?b(ber)k6tBYP4_O+%SBGZ)@SyZ0-9*>w!U-5Nw zAGu;J@h|rK+Uv)Lo}dtmWuX>OR!UZG7#sacq=t`Hi_dbW&ttc6K;3eam3x6CPKg3e ziy@{!*mQt=rN^-HK+S=I873IX7N$dFvHna^F;8@sU*^2-pMPM#QMoUYL@OpS5-BaB zi2}9E5!3?Wg6EK3{0P{22f<~q_6chI8d`JD;Mw$~#Gvn3JC~jBj7YW<4q}sqr-q0_ zz;cx+*C5fVhDhZT*Alr%KGou&;!`d>#wOTui9xrjzyAkD(v?@R2RWe;j;CC!UrCmA zq!Je4ax4g65;H=xq}w9kHpF6k9?dw((YZ&z=A6qTU-88OWg#(o`UxDEg%cum$i!jX zDMGd$$A#vra3HEF@N44j^+q|e8nY<(V?fRZsuaUU~(; z7(G%tYxrb3I{B{#RM`ysTmBnvvX9h_{0*Vbg&T8vU;WmAv0(YNj+A*UG7qvo6Ko<> zAdLu-a@?e0Go+GXu$6+?yte*R+T7Lt-JjMIFFbrXh zTxO(3+6DxXvCy5t^3i~;#AcVUgRHn({q=j!+%3P#W7sS_1u;>BLzq$Q>ADFKKNgBv zBp9$+UjYuo`f>hwEC|p1gd>~ggekr{1O$Tv#FS}pEO?DUZ7yN?I0ks-br5?8X-z~B>+Iyi?WvAYNu|b19Qx}|D7~w$ z@ZsTUk?JVRJ;=QaeJtNS-~~6fooeABEHe5HHb5|`X-DxTkuom<>`y<$X(MtBQqUKj zB9qjS$tS2hKeew>q*#gcy%Fgt^3a7RiT_Fhe?pvST8W&6ZIQ7aF}Mrm zfU&aGsKcq=HuYS+!pxC5zEKVD#9d>_QBGQIkZ^mwwfUN_ zj5&dYVff?r^bc*9aHfOgi%uP;2`kr;DG0VCI2S$IUJ)_+jqHTh_a>Hv*`IQ?$Z8Ew z6yEmMuepL}-Pvl1in+Hn9G04(9~P5t6(tNfUow5omWojMgHI5QA7+6!R0Pp%FOiCU z)W>(Ow71+4RO>FbSDhw4>UQWoTOQu1AgA;^*hEt2D!PO3wN)we_NbBKj^eiJ3*#1- zzhG)we4rZnBx?=Rlqdx24REEHpt5)^Dc3GAE*lI?a=R+|z`HH+H(!|^tk#^y!la&| zOxIm(tvyXUsQ|+twT9lpa@61!h^Fep3`Ev?ET)jGLHLQbAv@(;%KipkJhOMv`Bt9c ztka`6)Ia#H)rz>|W>+x|;p#Jox8IHEZ1Vh^4ZR#KG zMF+4n*(ZgIjn|yz?qN(Y;aF5Cm|8NBkv2bJ&MbqiZb1x(VW8pW8d?EUjt8xseX3>0 za4*{QC0eEWrAoT&7#Ca*V}kLNf&W{lpZUV}SEdi_vhi44Z{lsce>;}oejIH&1AG@P z=B9Rkns1n!hCb!n;Y&E^$Ys}3+8@1HZScjz^A1+i_t?5@drjPQ6OU%Gw8Z3+sO z35c1@jtbPAM3~%^w&<*ue{R1+4!DNr(J&h|K`<}_IYa>-C4$5!y5en-KLV4t@mNHb z?$_42%Kl(y(|4?q5`E@NXbuYL$b+0jAc$+h4k<0nKoRpZQ1-Iwm?=jj z!%32BZ|1%jHcwVwwk<|)Q~on$kd-x(Wi8(MI_KQStC4>ZQnK`AL-Wr1-k%@&V%oBc z?diw)EM=e}zjp0D-Eh3k_@4o`C{yka{G@P#O~psP;?CelLPJ1C4?7X2B7}RNKErI( z^RckIfmBW+l>+ufhuTa|)+kd9Z8OxS)}64PG>k#1^8^E^B6km=R@I~;2EFdF+wH&q z*jjQqEK_K1ldWMIKX$g08ADBQ4D{%JHHZ|u-$IZQi$B!qYQ{-s1_`pmHe00D7x+I% z=biw?6`E0pr`ekR)4$Z0FaVLAd5$pnwe9A9fxM_L{i@+kxBm98*8EEkQfdELh>GG~ z;okV)7Tk7x)#aHVv3#k{n{V$Q+(ybG3x#4IF{i497x~m$-j)Sspp64IDUO8>Ho?=g zM=r!gzyDos_ARy;?v!!lcOpU(^(#%k8ZyibR`NAWa_l@15VxYqR|R8opgYYzCmkMl zl7+6`Y4vP?@#3B!dOkGExnVmVlj#Nb9{)|bqwU3 z3{KE5uOjS8c;-p&l2b9Y$}GKDO*@L0sMC@oZk~6he`g@AD0shtRU_6HQ5)3TV|)ik zdcxm+;BeED%e)F0BKMX*LhP7a(Z&Hx35^vqVobzrV{Hi&Mt5DFex$wRJbKaJf0XdR zzR~arA+UL)w9~-ns#k@5DkoNC*489m=cO=@7FS}4FH!^&g)zM}Yw2&#I)PlY^%j{* zv0r(~ULHXw<&8+2LP!&!mU2rWUVt1WVxwQtL= zsvm7a@qD;86caX*Q93whB#oo*V;=%Q`)HSQ0PHB+=7O3dnDqshpRPX3r-+`q%>^-1 zpq8Ji<{qe~eTw!JU)|*z-Bh5OE-h$J`W=W93~Z3cCVGpL4cn@|_kEs4Dta-pu)F_0 zS98qz3}t-fsn$c6(Tg|V=tx(UN;UV3_N-6Ysz=uge4o-tT|2c!Yo-CjSXcEcRLitJ z5FWISY2Srvf&70ESGp&e(LLJ#DjGIN~I2xR9 z@?Zmk6j*M+9qBqls4wAuAw_lVd5k8CpSiO=@LqeOH0Yx5Q_?rW`NMXG$j+t{6W4DB zD5FXTLfbY6Yvu1?6PfuL_K{VmstvUl&z07iGnj8Ui}Xo*s+3<5&(bBtZMnrPRo=c~ zcM#VAWsK5=?(at>nYxXeXcp|P79Z}c_C>#2Z`;suwsH-=)gF2ur<(bDRM(xgXQ~Zn z^%@_I4VU8ZQD?q-|HswT4=LNE*PyG+)DlV#h1apFM9HZp><%zA$*tuqFhjUrC_n_n z<&5p>Oe%JJxj#X@`7833R>`@nqfr;?WHbQz79&dpRO4zzaxpQhn zX&k?u{BAY#<7(dC_A-Cw2~VF}t&Qiab!SvkEQRW7Lv~e)MvV@ag%!2eI!P^J9M;<` zspHiuiX;rH;vY8_GUdxyKKgVSyN^`awP&j(c=}Ys+oKv836qr2m8|5{n>#M_OQS{& z05;Z;V`Lp2F6~5u&gAzv-4}MjjThCXd}M0<1qRjpy%pCRr@M_UJMXn^aD`j^Zo(0c zIU*(tJHplA8N}Xn$$7P%KxgWlvNy_f}Ir(X?o+f%>C8kQ`H(f%0Bsx%G+LZ*;Z|>dF2EC z*mU@wf7)*Jh+__cw4(=R|7XQyQ?C$OJRGCRT}iYyXsznsS4}_Ao_C71K@!HF@Lc5v z>!s&fvyZZR_1n19yAF}izZqEv>bJ$p!(;zG4m1sDVcXv@3GJ2)QYD1di340lBdmN6a>8rv6{NSn{0mFsvI{r_S(HJH8xX-G zZJ!h)3xgylhrOdE39r7`e>7O2M0&HZ*x0{fM{CKs>XEOI;j|F0yZ{?QaKhXon~JT< zGF%9Vh>U&}kB$+9TzE&YG-=Tj=~Hs^uqLQ0xK{n)dyEtk*28Zoq|C%GvT|*Q8k-CF zfi@cQfLI9V65REuPQT9t;)hPcP_g0n6fJ06n4B5F$Ks z8gtAuKjBW#bv$L?6)i}C6Syy_PS}7w*^xe@$X^EQISt5EjjXw^@$dhm+IX!!!%7+u z<{pl@bu}fW;>%)Y#ys2`)OR2F5CNZ@|Ks;)K_i?pn}Av?#nM+Qqy_frH2kHP$P zP!k*lX&e#GTYJh7BuvdvD;o(lo%;`D0MW7_S2{MieG+tXg&n6YAsNw&tCW zIi%()0(S|C+;HU(*xtc(r0F+K=`s&bKZe2LPv5b!uew5EnaOkJyfciM{1g1vO9RV9 zt{{!aD2}RP*?Dfb_zUhN-47c4B0#XaZiYp}3!)dYSewX2$XqPKDxfuvR8A=51!p)# z{uj$mD=xNXonWQ5>#hQgwHrwQ3i;NT`o*K|AQ6Zd!X;2kAQE6QAR%YbnQG&g9Zkhg zeuE#xJPjyrEs3{@R>TqsBtV10CCUj4ENm+we%r_*!F#f3cI9w<;mMB6DD~UD03lBgS?2F=T#OJ_mEnEu`FP)R z@^r1}jtcYVn00Qpd0z5ihn!hia)57CZ{SvD?owHKk{HEL`vBb#PY5fgwoRZ{I&5vx@c|K!GMoA} zW`&80OociTCcVi89U{K?P76Ed>09KS9y0n7_7tT3nVXwBY(qlTJt9lA4{>l?4agKBv0XKGxxln7#%QC`>| zA}v`EW8MEv7-)iDqen zi^T`V93Qn$xYVg$O{5c$JI$bcw?`jpuQ}6McY%9nqOdDZbUl4a^328kxYOrMojVA$ zR(eB4m|tE6Lct{7zat;}3sVO%eLd_;QZ`%_0~B`7=Xe8=>1)a*swK?wS{|j2rN71D~CVf%4-Vcj$%hLmxA%2{^Uvvi)on} z2qcc<->LfE4P%Y1xwhbP-H&5t?ZnWt;#h0LMV1`tb?dR?lJ$(wG#_zMF?O6$@S!HS zcE2V^0`;ty6W@?#&kyq}Zi4!9;(ni;3RBLkFR;0+xx~i)6TXRN%?0eoGqtMi>RN3A zJa>1P%{8a*Y{j&0^Et@H6UX*-n_a?86RU+6gS6UA{sLc{<>xt4``9;JyQ5`58v9&{ zK3dYeoRBt_pJLWw*(1hIJ>^vme$*=HzKMKW(^DEjnGz zIHX?*h%#X_itlY@Oas3*5=}XT0cg{;_8-5k{(z~=!bD0i zL5E{yU|I}HSt_M51htT{LRx}D-Wn$Wv>L*ogBQ=R8uxWhmNmm# zB>GcJMgj?Wg0R%+(Fjnp(3vrJg7Owp(~sb0r3K*WACVLnouv}eZO3wL2+9!%`XmpL z7uh$FdBnrW4EWVph$MnA_elEx!?%*#!n->;=dHB}Z&zB9R-mB+D0f9>{3r;t(V!}t zz+C|Fj2rpJ>zv8bVl;9ZHsW&<;%(|tJl>~TadJZ5imYBqi;!|?rReSf6-#vZJ;E`! z$G_z&==o>Sg+dJjt*A`NM#e{E-fdJz-Zj)&v}d2K{?7Me$;irKF^;ftjb8n$=-(NN zThsE(>dft7*Cd*f0@CMQGh*NYXId(J$_b3)YphJ&e@*lFhiWDZ2Q+#yh=^wDph-?`__Yb8AHWS!-!eiQG zxjqaJU#XY%h4FWQpf(orRb8b$;OWISXb*NxVwzwNw`LsY)bn3`Dcgdxp6-l%Ptctt z6)0h{3;Vv~hYoh|3^jet{PRyE#VOy1ZiHPPH2sbXL2w)hi%B_XBjulcm&2@poG)hG z$#uk>v}PQouv!bA`j$&lVjm)QEPe)@yc_lcEhuZQ-v*QgG~-Fa>MZ2;g45h7`xgu) z@PNT0lXL^cI8vz9i~E>8Bt?4Z&v0=o_G1VnmUdz}_vwpo6@Jxe{j2qB4Y z5hbLZuHOf*h_Or+fxyYg_?1u>a$RI6I#c$wh7TdRNzMDiH*9W6rC)re#TOn#v(PU> zT32jqhAkq-@q8YOjF*xmGGviLEr0TA>i%l}@oLRwNi`h_kkZ0dUu-WrRZTxYUS(@g zNlZ3Ub$2Bb8uIGs$H>XL1##G zq-Ai8E-FUo9mT^1#bnS20_@d--6ZboRD38qq4ls`9b42smw+YZ{npeSaTWnv$>v*{ zF8J_^)ZS%Bsu2}L)G)rJdR4&seC=>yMa*hx1X8y}aVt8e)j-8em}I99>u%UY=6=y$ zbcmx5o4({=&iXI;AdFO9Dd1Dyw}xv7jWRL{%BYZ5Ez?Gzx50xWL({YeK*PkJPPlzW zlo#xyo~>eIG4@MTF}Sl(x9o|XgN{C zR@W_C2bMs~OdW4{jmEYMjPpHOt-IKH#Ge`8c(uLuJe8>WQokH@Clfe%&?%fdvJQwP zb&*N0Ho8&QI1-sAKSS?8xqJJ}Rc1QPKC8}F3lDSI@bnLQl1J{5QCQRpKMG{gj9e5EmW5j5kG%+tcR?sictf>nvhOxI+A@I~VvGBzh<2 z8%64I=mSpQMep=6D9i+FFLImF%+K((^US45D(u0%Qz_39xSvk@Yg!h1`E=ETsc1>amu`dJOo8R=fX; zYThw6Rkq$_{oe9bwc@-l-zjT6eB{pQl6gLB>{;iWVW5xqSSk9bpyhamCfLM0EdjU`Z$<4xa zUb#b45EFNw_VU3D-pd^>XFQuYK0k~_J zuHJQ7P0UB`hmRJ@N7`MZ61$`D9~ntY8LAzH1QB^J5O*|+LhQG1_%d{oe47P{t!xLH zkv$NRV__6p4ZK1lT6~@hdX`x5tB`MgJPWC}Yaa$WhSDs|jQH`~|Sf zm|Y$WfB2T`pX#>{9HKI9#Zw^irK}Thp3J?h-tq zr5&U|k5NNq6pm&&MLNgHxO-qhmO{(waKks{*Z8AA$;SgY4}*x-BTc6<`IM=(%(V4y zxRWpeDzA;#lrK8Kyi+kNjs+5q2Tku$K_Y8m;#W&sc~#p={D}j;O*0?qj`o%Mp`{@< z9(dIQCdfj@V;Vu~Txy&QkgtEcNooY!L42zEKx-ie3j~j+ZsY7c`*^$pxva(hMfSkb zp@5_UMZ$ddc9M97Bp|WJks&t3Zw6xjNeS)ALcS94p8AHZz6Gb0qhuiq7%A9f!bW&h zJR(gd ztc4XFEz~q{teO>Njd--?Ku&$xzqK}}$H6ySGqzU?ciVDto?9cZAY9~9RH>^YzW7z@ zo|N}GZJk91dX>Zo7&6{kd}dd2N4vKLpsgZvFz1%fXI!jSodjlckz>L9uo(fl+8n}<;UaZ*$Lb{dqEm8W`S8d@g7QorFv`n%|N_zM#_SER%FSy z#x1EvFI0)=>ny5Iyf zb|Q7nC4&A}{9DqiQdCHFxFzus@AK6|z8K}9YwqhuaPk@cn2P9s%N@wc1lgw< z=_5*v*78}ZYM=D}(+}K7wf1r~Pl}@CiAbA^J&#`OS#iUSD3U8CcWHpwZ%Hu)`2&}n zkVtAA6Y(C-ypwe7CvGE`tp5^uXxgDbcG{l-q_L6(faRt8w$6PFDdP9DJ+=HC#~A`20A8Rndz^~F!|tF70&Tm)n7Q-CGU>vF$dImdzCb$L996+h92_D+~_m}T*a zuPZH)S~X_p_Dmw=%I?h`V0TC$5wFPj?2d(vKrl`U9*v9wf|~brI>U$g6tq?-KCOLi z!jf~*m zJQX-+I+oQb*44{P&HMVcIEaSnDhZgme{Ec`9HUE--|#UnfEGKmEf^9wG3=)P2X9~ z+m8aj@iLprs_M1p&}2u{OlT-+c4>k)s&i)=)do)r4uXU+C2b1c%tiwWZCa0SSm_Jx z?DcBKHgtGtZEG)b{70G;rx}h^^Y?USScwbM!=#t1fmh?PhNcGRa6s?d`sk3LN6mZ< z$A#gKI*V0mE}dV`3e%=n1gS5(_L)L3tg8)}vv zqsTLNRFmKCwoaW;Fea~Y@*M+-Gx&BjjHM>E^-WjsT2gJVztBkw(I?fg4F#mC4I`@3 z*Q=glV>A)G+(i-yum2UH+4{8|*C6~d&M6zLUk_bT6?c{%sTS|$`$yB>Z%uqzh3QOs z#m9f3*`5?+O|$MI1YW7lG_C$u>4L<(Mq`)4X9=fai)t_SEzNw|%D2F5xQJa!Ejs6O zY;OZ^XA&_G37wY$V!)B+ACC9XJuJBB9c$9y1Y#c`W{ zKI%-?=oNBJ(}5)Wk_#2_@yZNnq|xc4$Q01o`7Pk&8s1d6vfjs+nAV-QSJ(}_eij{J zNYkQ9#kf`SWVp@+B3Xx`R@X*6g6zi*qu0m+;i&TaU!|^?4wyTt`JY!SGdjvg zShT-;UQwxvb4`u}GR1b5VJ4~YtSRm`lYDG4&%ycT8f-Tr5@!gFJoql(nObxZd(%VL zY3t3`+G^`X2df!7nNJ7n^Oj7M4u>5_Q>|~hN|&56H531SHR-)P7s^dq3J6oP z{EpTPK0eRgH=3ihI6ZQ$wc=cBPTb)2LD*{&;+mU2yWxZ@i(esJ!5UdGgINoYE$*_6WllS#BFwIHh$S!a=J59@`nx+;@GDhOjWW~fT*8XZbS!2)r)3>;`aWKkumJrTF$B+`$xKN96K$vL)Lez^uEt4V1 zAzg*QI_*$v$yrwAzx|N8hh&K<$HHR6+%pQ0O2-AXg8d3e0+y11o-ojepK`Ec>729c zOU`jIo`n0A7h2N~BgaDl=DpKc2;LoV@*F|jkCxP7QaM_qSN#c@gVOD?qj@;$5L z0vA~bQ#cVOZfk;f2}(UO|bDsfAG-Sa{Xrhb zkbI9RN|dJ@_JOq~&Tjx}1-0xH1&(szZnVoNoZkq@NEL{`Lwo8Gb+gWhR4G?!bPTmo zR7)HK93P?;?g3~`_b7$wRLjoO!>1lrJRWD5X51g#L+Vtcz>RgNGv%K$F<4zg7 z$^6&K@8jFp1Xg~3a>;cHg2f>!HhY>t0}7$@iSMeZj*0BB!~VMQbq5Grz?1{h?U}@4 zu3LB-7ZOQF!`y4e%)o)xsF0ix>dAq(qR^N_dZ3wC6O^MTnLtY$$FxISgQD5{q3c+* zlY(C{jq8`2^8M&p$lTr=*uuhu?6gq|0t?Sl+kg2NA7mLhl39Qg?jg=dQzDaaEIQ^t z8EANjI4}+j71vjrC!oWExVM^d7#qP;l22~quB%e}_PSh8y>^hQ_5@LUy^=bdk@_7M z0zX&J0PlXdAz*=ASeg^u5A{kWhAjSa2=0q$uM3A&UVDfG<%2 z86$-mOBW%f_|a(ttu_6i`WPEyfBXj9(ArB_NqnP<-9`{*3K4IBSw^ZRClQlPv}Co3 zX6Ww5A>&C@;}^8qM=`@ae4V?%Hs5HiI*(u`ggy&+-t99ux#c>CBe`9?6>ww-jSef) zj^PngwiO)?PCjc*+rz;hyE#;Uz$V4#hi0quNDP*IYjKzBSJDq%PzMP2Z|@9XOi7QG z{3=Mps^Wc6BI`X=5Vmns!OYLArRnLwR_LZLtEDHZnQB3tS<)7h`?VI`L(aE9OGiRJ zhl9GR0gq@IvF|I517*P$mN+wlZwp>3ikZFxEq%pN)Z53uMIv2u4r_%kHnmPMJ8wjoNLYAlaM!Oyn_kh?rMZF@q4jsDlF!8hB(J2*F^8s>b-HEjBuF11#l zkj~qlwUeuGoslce^eL~CXJJbxGs&sMh0H(f&chUlNZyzDj47T+q2Z{J@^@%V} z;Y~uCT3t7&#ye9mFSQr$sg~?(uRDX5_}ERZ@754qd5ljWiElo-l+_KW?!t05>Ge*( zSP@$qvUBXm2%=`A#wWU3`(Eo%1#h-Sc5pN+dWo{e1qKsl@~v(pUG_^(vcw&Pv)=y%oD+q9E@H7WSmn82SU z83;ed_wWVA`5Jrtz!SIgm%z7eO^yK~Xw3HGx3OwJ{w?yK;sdjW$G_oX)JP)Y z(Eqk0OeKHP_>oYUPkw`7@g$GzYI0q?apK;1!T@iDuSnv3neJ1!*=85cQ{OuwA_4&| zT?#us@Y{d*SH_F1eg)#kfz}`W*&xXl3jg89_8<7Ljv^z8pboVD_%DB@uLA zw+1c^{S%Q9PulubiRUxby#0>VUDWglm=hx75uC`2-65ckcVzvlkj0zEV4R;sid_Dp z66ISdq9sQM{`_6_m+vG^`qfW`K6xQxLRoKrrY&Q^Y?$%5Ro`&KvR#7|LgaB{#khm>OlP{mYOkl1AqTX8JXeC!fgE5 zR=x!?QpBHDyfb|ooSK1*yeIhkkL0U_NlIZq0%GHb*3&nefbiD7mtOfoF(R>Dtf!)FP}JsF{2~@bnL&Ok0y3Z9ztYr+@4y=I{RP z7IsYX2M$p{W%SHXktqz^xzu8NTp;;9LZ*89M{3~NpMYM39vH*PuLPHrp8u@N9>4AY z@ivBon1Q|MvG)X~HXcxQ7{0TUk&$}AxqS7Sc@{XaT? zBO$YalV_0w&6tFF^&db)-aVKm#05c_0FOEU{PkZQ-hQtbaiYoA@yxVk%4I4h)jdI3 z0th?19%w8Ok)vRuRudj$@+aR|eUbtF#*$QG#s$6ddXZ>>Nuaz1yaMKmsmHRy!U+Mf zq4@9fv*HmG5XtWhAjg_MCdL6R%B;&7sVwws2?60pGR9xN<+JpEMyg4fp)B!%)`0p| zGt$C?fPmggVsXA9ME&^($u`_v8={mDh&OS`HbMv)Oj-Xi!@T;_PmYmXhX@yR5SB`g zh9Ck6838HtN>M7rIsHmv84_8M0_fj}k<Ub+SQsTOLlT|acGlfNm7^#8zHS3~hB^qyw0+rgO-==bxIvvE7 zSE^tQcoa2CfzVQ=tR+F>BYBB&77S8Q^z*~L6#Wv8Ps3~o|A%z zJ6`%GuZl8jHX^>1x0FbaDle4LSiy{pjAkO}$k1`4aCY@k&PGLD1-O7d6Gtvi3r*s! z)qagPNpP+lOBf!Kw(+V767Za%{+~Wn{eF(PG$B=4MbYgFOT0; z+(|RC1BZx3`|*Ro{&I`kiPoLx=-ndhFP#}5v?lrx4fYF6M;N^_{BnDeZ7UOP7V5*v zqV{VdGOQjGu{jALelaOw9I5?K_F*mKR-_wvNUrxMpBC+J&G{5>E}?-hh)glL*@C5* z7qP}g{3J0DJ|IT!dr27?{7P(0w80Ygu;ak^ z37SE~rBja7z<6NuP=pn*n@lP1i-7860wy$b_$u`0`nyQ>s-j6Yec4)eqP=i$HL|^$ z{HEy?!&6~9A{B_p45(<4FK?BFBB>2M)`5VamR!wvkHb(44`LR5^cweXt-I1%b_nC; zj1N_I;bbm0pW#-MWhBz|pmM>Fvd9*3?nX#H1{I>-Qf=qh%~ zg?n2wwsYlhSkTnvYC|JN=x_qWW6-Z~(rIztGCgrBuDtOPDsE14WEi%2`%a$NB=S8j z9$v~tT%FA~@rdDs=h4orJ?+5{tBDxb+kNlbsi$}?)}A;uaO$e@h^bxy+vDT0|3fwb zxYo-z9QVDSI|G9sv*EDxBzF&KL5kgv`G>1%yX>gBqtz#{TjqdoGVc2re;mjAR^5Fw(N(ptINh4D7blw7z41Oz zZWcB2O3E2;uEsz!xxzdGu@_WQ%{+*++ml~cfB1$LXUA!Gx%9^fcJcKipm0DPGZuI& z3ckv&3+xIu5F(esy{+j7t5ug$m{@(jnz7%=?4-47ujbfPWS6gp&L{}{v7l7(tF&cL z(pe}x=LEMBNQhMZ&y79C-JOB%zGdRaX6BusW^WX*U%I#KKnAkU(hu#OFzDUd#b@a4 zPu*@UIqf9fd?VA6>K?%^MGiwGt`Bg&-mex{%6(8X{3YoU?bVmq$i)xHo8I1A&X{<- z2Warn05h{6w}pY+Ugl0B4YWVpCICO)uO8ap?sxcsLR%%Jy!lAEW}iS~Y+hP9u&;CP z)HZ zFn!tYgCRe8Z#DN==MUd<9+Q)p^>{SI4AZTI5`TB#BQP0OUNO;;XMIzSGz zB2FMF;S)XWi}r$(_!QISe9hnNqo74XK}a<)ZbW3?o=;=>||j<**7 zhCZw2#-)3=xZH5#RgV9RsI4t1N{~ZDv;-*Oun(^m2kg`B(?Aw73m`ypZ==_H{gr7C0v%Gq@l&sSO#3J+rd3Ra_9p=rXvtGKJo{uB*e%BfUED=b{s zA_Z#3M^0t5i7(^UARV*lU)H=rQ$uAlwG!wj?CgYT{2HPNLWp=NS;HT+=cRuK$DO3B zt~=9Ob-cY`KMcf)r!M`VpkGnIGsBfoN@wDZ2~4Fja)CxQn$C=Et$9+D_w%vpjhC@> zsOF_ID`xi2_K13^D&I=3kdssp2V9M>;r3xR3Ysz{7aoO{%$pxFjmOuxEo9^)4#aRn z%|$hOXUlc&?hq$xi&>v=l%$(!4JHVYq~<2*Rpd>-Busrg;{}~ZeGiLrU9`V7^6`Y> z56w4)k;)x-G-|)i3hpSp>U+@$E@Xo)6#HJPCSnk=w~}INIy=p$X6snq+U_gP1uXbke{d3xK^~u(T z_#!oT-(Yy+&gAWG-Ir9Zq&D#-ezQ0|{iz05J%M1X8y}p|9!Q9@>k)P<(sp`(SonjG^MTq$jmH6gjdWFU%R;9F6JtNaa^u$VayY$gk3a=j~Qo zV};pjh1|!HU~KxkG>~#p7TvT!6wR#+g2M)N^hi>yT?w|)C=fMCLfY$<*0gu4xu0@F z^#%>CTbLwPpTvdC#;=0e?BZlys-2kV*#)s{Bd$g8l zNMoCn{Iu$1Yi^jIioJ%bwu&_;3_A5v;T57Y$p#wX*Tx#&#(HBM))AJEU|=%1&5IuRq#L9BCz0Cd%AK5-$#q%FjrSdQcMucM~f-V@Hl|T z6#`JECG2xs*kV?n=MdbJx7GLBa}U9r1*Wdgu#tNpV)DkH-d7E%GqUIgwKUUMm@`YC zRa17i7o9+Sk@U9yQhUxZpPxcb6*BlCZU&^Yacx(Mw|5Kve3&ng7M-}DT7vlEQ~37( z@muwQYGfajLrj;*K7@dq7fvh5P@ELIW4=wPeH4Iz@Len{C&Tj)n-&XE_|AD}e@9)gFzZsOGQE>f+&EmGP$()d+#}z(ABI+x!>d zh@5e-^Ox_rr<~5<`1;j&;FBGuKtcAuH}As#@;x$Pi;1&K|KE!57frLV!ajDmKjIdTW+-e_#F!KR1G?xVW~~?%s(-!-z~)IAo^qx zWl8G{r0RJaG{rAGiDdPs@3^{k+5w7blSC{fjWtC{AZy|!rWdqu1b#P3dCZtXnMW<$ zGxk<1&V~mBWuLJh1Qs&ZP=izTuAX;eVo7EdLvFESBsAG ziRC(#L>d-r!YN276%;Hv6v2b|f>0h)5VDk#yH{B>O^Q#aXEUV|rr)R}hwn^IRpqp7K-PDDm^jG>WNQMH^_ zd4+0|DkKTp6Rmd-qR#kUi(}jzyjAMVHCqY}@}Zk4s$S*QD1sD87tmyjf|e><#GANv z-iQxQR0>;F3_>nR+5>N(FUQpu8!jN-ZTYHNdyakX`JZzDm_TR0wQ$&pCRl?`Z4Q6| z90-!Wfk^TSeb!lkHVIA$l$Zb%|7q`XQ_A84aha@hztLWM7RL^$w=>nfv60zCK%I+u zGh91yJn zSuhFr72cX?0tyLQ#KYUj2O6=OFEBtz57&hC@KruGzEHV;hKUR9Jxoh4LjlbPM4`*%L-H5D@hs{6Rj6OA0sV>|wwwg#+Rhkp(9Z z9O=^ z>#B+7$mSy#49)qBX=}a4t?K`ptuXs-|H29rL;&!!A)@0J=*cvRMXVrpZ)%vULKYibR;hPJgqaL z;9tvLrflMR>kE3u2eC9s#1Yi=h-fvN)9)>O6mO+l%2=T=vJ?1`gbquP%1<+vS1D7D z3k^EWBoLW-sJ%Y?p{`d8kG0SZO1?%QV4*NX+c4$Sl5S5f_XHtxPuZ&ufJs6ONKBlf z*7xpZP{w2z~WQZXN)X0rr*kpA5k`- zP%ipu(7aoKAexVNQ!xXPb&y?kjuTs}&bz!+OXxQGwL%i9OyNO+ia@}&u#uzHU%qRv zy-23Kaz@TQZ#PK&>cIf@83hdOREqk;S6h#KX~ng?G6VHK|ATQ1VcA)%67`qb z3^l@U3A6&HkiXd|qk0~V@LNG`nsGPSi+sh@G;4Nv_k3kR?;70Q zo^!1F>$la+!&wP#`pErGpoCBu+Ov7&WPPCw-^O0`-G8q9{>NqC728J-1Eh87>VC!J z$l>;%zvJUIeAi}lMx+WD6<;9ejD?t6V#?xoXjgkkbo6Mi872^BlJ>~qaF|zsNH;;u zei4AfdxGHBhK%0H*;5~vfRrgz%*;JhZNAm|<9BRD#MG3RkK8*jYeBY4U*O3W5KCS= zXqQ+-w7ATY#O0f_)?aCB5%ijpP%l-~ z+#3~P_zX`S3G`gSLFl zF38M%h(l>-X^LC^5_8I00AA0Po z5-s|gd8BPEJiv~iq{;zHkKw@5Cka!JA!HUQ6obnFG zZ*iw5&hKBKDnIfi=YTd`LQj?&h_xjwDQ||P?X)3LN4$l0jStr@hZLC`&`xxj_xA@`qn$`r=+_hISLh?8(mIQnY^iJ=C0# z(ZArlUZn=8glH5O z3U3;-q`K8(Sd?r%A+NA<)cJM+KPCRE|H4OWO5+gzDZ1bPt( zRsUThK*W?vjy@MG+UC+|0DykU+pxbVJ(#6}CcePifj6rWtVd}38_r=pdi3jR3ob^j zWrwQ8T{ie0Wc-a{~X>1TwW-{Gek;B>&FNP$eQMfQuiR} zQIV#j9#$%+n3lo_(png{+Z)x^>wI@@>Aq^tXLt$u1ewi*Nz9coz1kCM3dRI8*F!DPT;e)YEI zB+LmXG%2*F?J&L(u>IqTiBZPi7q`Xd z?exAOrmTFJX6(Re2*V9aW4WlT#P~8Z1tz|Wfo6DDYx(ikhKqb?P*by}iP?KwlRv^o zl$HB~*!Rf2kyyytFwp|PO%Rry5D2jTq%%%ebSPp0Kup+c8jsa1+o2x0j!3%c3dgdh zN^F$`gCQma9mzEMwLFxx`)h-ZhA9 zt+7B&oJg7BeneHi=HVIpd4)n1o8+}pL2^8aoG>EqACxt}%4qS4)}LzUAlqp8wHJ~D zfm~~wqaanXF)#|P2HuLe@0%odX`ZXjw;sQt%I6Wtd_hK&$7^6b7)?2#$wLn$@iCxR zn*W!bA+4=-`8x`&hF+cg*8^&~sp%I_ncWklv^Nn(!6-IAzQQ`j2+9L<)fg3NihVah2CkW!> zfUBBJRk}2Dd>%ud97$W4Q9Z9b)B4-L+RM*kGV9BtF#$sV-oPx40VXuYyWg5@Us(|b zcVdy>aJq!odTNxl9a(69>x*YgV|fsQW!~y|d_q>Poq5 zzRlS_=+xB41-&f@u~LkF<+tTkSz^eA`1Zo1QqQ<`Wy6;^OVT~!P;=Lk@{3Tf)B)n$ zkws2mX=V{uxHI4tJdGw6EvD^iEjo%_MxuyBf`vzjNwVci+Ax2N5iKGMAkeU?u#Z)z z5^%5WM4v`)NJsGt2yM;*^*}DLkdn6MLN)JDHS}>SJ{u&t3t`N^lCR>i2`QfCu3Pss zkUv;a&=kojd(PSij=}QbdwiH;0bV3%$m)kHPgisJ0J8*6@cZB6oPI;RwD(E`yv4{a zqeWIMGJcEz8HPsqePu?&7}QO<$&G`qIOE0eVmrQo2sf+~L{^ zW69hiI=@9?5A_F8zt-Kt3nR1-D>b2~NTWf!d6`}RMSG=y;GxW&q-WTm%@6WQtrJeD zv{qgsJD}(kWbs01D>Y!y;T4#fwwVOpti7ugp$aYAZ+-A4ZUHM#!2kzdoR>9xrGjku zzd%7cW=*yfKl~M}{|ah-EpQYF-b##cUdCBt<_`4nHK$mGB?U<;5(ToqPf!E12 zYESqRt;3cws>tz}5H^<*PawQJ%o{O{df;toGS2?YWf5sAJ+sjWP=}4Ge@< z&Tmb`G!;pgh#1%i1|nR*$mT5|VhD?+!8cl5<-5CDaadZgR3V0;+CmCZ9L|{hw$we< zw%G`!*vToH8>sFQX^1IV*f^k=D7duRV7O+0gz5k|)O@BEZ>>G8X%J;Zop9Yne<*1W z-C**YQ0OleYk~s!3DOO6u+l7QGczUToXhYBtwnpd4MYQe^H=T1Zs9~kb^9F9jBTcw zCZ4E4=#-4&ZBM>ojw;zD1VS2YVQv* z%Rzxr+AT-|bRuilPf#xO189PhD#BQ56S=0=9(aS}V7QQ-pw;7AmQ^R=Vb({jA>R0Pw+)eK8O@GV& z>9_ukw{Yd20Dd4lp2yn%&5??+QZ7-9ysgk#o8V8_Et^%y9-BI%*pfL!Ul_SZ(7gow$6lRrV=SbwE@{M(MEo)xDN zMX^hdq%h^?UpZzL z5V2TUuJ{quqHVjcE2Lt-Navu@BI(^gHR}*Zk)HLKoSYuJFDqmAP0+qRp+WH=xNpveEpgMm@ymUKp@{esDM)c7M

*!-gnMJ0a~ z<7yAe_fG!~5Naw4vno@%{p_RFpKrH^k6LTpjgLU)`-?mFJ!Bg&3ay4wXa%P4tN#9- zulU)G9m-t&9R7m>Wv8n46%yQRLZtfhZ=bIqI}A-6%}s?%8(ee2t>d;H+?}1RPBj|p zioGj{jDXUy)d$RgO08GBkqRW2t8aLeCGuFnp@ZIA4cOQ*xa;bYFT*JFpDVw2;F~{= z9EXCfu0hH@3g0?qM~*Qbp_aqEHTjFy)~~p~EaLATM1MT!8WhMYhjXJ`jAgh|OyCS3 z!DZmFYt`&Spalpa-j0Q&GahtvA$b}INK)+DIlo1<#5TaEFvG6H0FWhp0U8CLf()$NCKRsZE!qE8#&fBvICav_$TPHl&z<+O4CG0lE@6*nLGywRId45bgZHe5tcdFWcT;y5a#G}*-LLLJkM4?{!AqRW7Yd*>cZy|r3V zcuW0}N4*Lg&5}c$HqvB>qJ$d-)`3CQd1mAsdrB9|NW9{0(P(%Z^_GuywFI}ylvHW% zQR~e3P-;AvJ$&!OcW-oHWMZH#o2kXPRY6G7rV^Ujt4y)(FJy4nQ z2K7D>2a_gri4<_WolVMP{>CV(aYhw*kl|D<-0jb*U#zxJl`ym7XluzATnamc;WOye zzXD}c*Ds{Hri3nzvv8&vDc+pQULk=-x1RnEJZK25K3zR@MM4HQQ~0tUECOmv4}-3e zrO=0L2}C8=kBQlUL=$9BQlb7?O?*E31l7XK@*&2~RVT5$K6(omspUsI3vkBayJ(Gk z1vS}fl8Cq}T(_eTY?GqMjTn#%^z@C^)VFa6v_nvbdtt6sYffRI8-BkvsChZ?ySX%p zB!zn5HRcyOz_`2_vRxuxGlF||eEU7kVT<;+hqe0J3KPvYhE&$7!tSnRw(?umn{ux^ zUJr$+mXbEY1FyDbZD(ky{xz<&#w&h$?t-?TKlNz~YIslDh>HFbMehDb;mrG`<)9f>t1##hAk*^Z+y zzbW+KrW?Wyk=rru5Kzqa_Ur@bJdfXIURr(%TZ{xOtT|YGdZepfz`oNP03_idW%@om zPJQz#h=gc}H0gMRKWs4)><|jua}QPPFLwU;Jzwizcm#30SdoB8dlyi|$}}WJ43EVc z#asVIAcRrE(t8)4z%u*z4K55C`aEQ1iLDmXGs##8vIX)wAwff4k1Q+!4@&%vNNWhS zbtw+7P5(k-AC<8Bd^JUSOA71v1T|x$K(E*V9uiG9TBUs@KdBv|P!TidAnL~>Uv;ML z0j)o-5-^iipY8~HJ1&euD*!XjoyQ^XQ5zp-)?MLRhmixBDLC+dk5JUVF_0QyP)6o$uwrz78UkCkM>G3+ve#YeFv zF*(Nyf;B%ebN-LyG4IuZ`-WKu*e(C_cNpuZ?okYjnwJ&c>X+5T>mB$U2llMhrI2ex zy;hEbJH4$VhrfusKXBk(d?M~!iB~lnFu;n|T$IyS*R~R}08R0>p%gPp+C+X4+Wp&Y zow-y!^$kkVqNCMRt#n8i_?R>#6Gf&8ChaV>Btw9=`mNnk`s0F?p9c$9gWFoO_f)Gm z(vGom%~?FVhm-|g(p`~kR5+|Hmg_osbFF{lpgpc1Lg2B;hhbZZEkH?+DQ$X>kb4!{ zQqDJh*->wN=t{Nt2zRxTTuOfT(niUmmRD^QKsxPeq_zcw$l8!~Lo4n|zacG;fxZ`| zEO6FCWq;&4$9z^Es}_Eal2!EBfJPXCA+ZZWeK4fj;v6$cPq5MyhVixEe6d_YLwLK zB?nsTFW^ikHEI=V6zX=r#D4M()g!C4Cg?yNHUzRGtpKLNSYo?Q26C?&93y>6U@(#f8CZM6Upf4 z8Wl4>Cpy1 z9ziJTG4bumTp+}KIm?dIPO=`mr1BMaAsOWS~M*A%4LsOD4b z`LXVE%s%D^+sDXu4xwn!Za9b1tC?%PFT_)cR_iT8unfHHDxmVVy_6#*~4m#WT- zE$qiwm!h!*Vj$7XKQWOc0u9JlVP+N&o33y>kM#c)M~LCDsEANk$%FIl5*!P4)|0{% zSU1Y^K8(hz5>tnraPphvxI!yB2Ugo_&vRIDrX-k`Cr)}^byaulI&CB;Z9Fy_g?35e z(I>+$6GrivlvxqOM&o7D>*CN`m1dAt$I~NGy<))^?WymxYf;LhyX(*NxT3uc;l z?hH*arH0s0s)e519qLRZCPk${2TJZ zHU;oZZax<4Pl|>S@55P&3~@HhJySp9uAHr3ac#}=Q+P*9!W-c3WTj0gLT!Kvjsv`E z$hDR=cOat=d?YQGZM`rO3Bj^5;&QMzbvK?tfA|LZX8s}RJng@cP zkeQAFh?|0bttxyX9)ce-4IJqb*kwLx4Sj+kMiRf|T~&fhjWNjOx+e&e&{#mX>F3gD z&|IkGDr!R|9omJ^|I{}V7M(_4D$1U9KlGern87sT_ws$0GCC zSFLGZ2nU`+*-M@LUSLd)0nn@;(;$@@!3JD?hQ6`kVzJkB)BYwvzE;K4i$OW6IX*)L zoqsgAa{U1*q??^{J*QyDDz({zdJntD#OiIPT@zhjs+73u=OY~hRvMtLF5gISm^S$PgE%vsQQ%*&2fQSa6aW3NrJC7*P0=YWg0nn<%0jwbLoc$kn`s|J|=y|*Elh&f6?2~Jvp1t2$3(c+^1&4&mmFG0A0%IuuN-$Y2 zHCug_3tt|-&X%aFI-l4STS zlvn+)b!P3TmhsgvY!lqKaEOx--sG0D5YlOgskQiO!PS~V#3QTsC?+YPAa}`dxo2 z8lwO@1APCay=WiifGxg_B`>~Izj_J5KCXR0osoQQUBe70fYPV%Xqi75ATpE@{f5jR zXHB98U{zsnx=(wXTUM7I#4^&o_Q8HM1C%sdfwrTni^`MbH64Qjy!Evk);pA)i-58d zS!cpP^U)jXP@Qdr<1d_d*?6h*=uK|G3`H-DBO-{VA3WRnsIFvGFzdhmt>Ycei~>!M zxUNKPG+rspqbLl%fnF(1f8{ZZBUFX2fLMHh%W+0D8<>9=lK|z)?h$2y&!z%c_Zc2b zMzA5EnTQXN_7{B4{D4bv7VbvZ)+G6;Z-ZTbR$Os7roJ6!0#yn>G)mz_5NE-nu1XCP zE__C{1e7qGB$~R}l(#C(4I3|4TW+>CUH6fv!|nNY>l)HX7L_t4OJX83dsh%l#8oUN z?V@63RD7B?c_e#^q2$k%^1s}g{tgwrSY6=+{ybZ6wjSYATTB!4ceO_}hlcNi`$053 zIYvdqM4;><7l$Xj5Sfz1);PlU6LCQC=E}(m*n!KwbvM>X#A9Yrkben<9H8kKvy%8_Qp3__K6&`q%Q&H-XD^74K zYODPW{e2>?5lTOl0?>zz$TzAz!ZkCF$s7Yg0jG^A1`2`WNJbqK@$`49+1sg&xK&#` ztTGS7c{7gd_Mg=RrBWS2zX45x&W_nI0;D3jO6n=nd>YwPjOtB+;41Iv(Tsqf+gI2Q znWT1CGv8Bt8QD`+ot=`DR=zV7Xwet7D zF`umoSeh7t{r@1Gtzdr444on4X*K6XcBY?^#&i|ALbAhTRcNw!rJDI6-{D*D#e2h9 z=8GA=BZ);Kokhh4bE~I*Ls@sn0k6=_WgCcHlmaaF3ShorQP-3`?E{)aok2p(1}@mI zrf-*|GGWqN)da2X5*n1GSa5y;Y`aPD-8u^RG94UwB)-He%Q01d+<%N?4&Mcsx3^k< zx%G#yt4A)k7aeL%mfZGMyI(R>IjCi;O>AKm*PbRcrL<9x4e))*7T|0Qve<_>IOzkn z+9ti%9^4_x5+leHUnAp6!pD(Le9Rvi>B7+(xS=d!f2oR029Azb@>@I4fzw6mVL{RE9G*7op zN^QAXeVz|?hDSgsoWCuQ3l*MvxNTK44^~gz3TJ_U;Q4pqCvzdYKmSla{u==|jfbwd zFGW4jh`&9!Il_o3n17=Ehwoa0oHL?k?4w~$)PX0QddJ+Mc8_)Es1{? zrWx0g=T#2Wl<8elXjED}HX&$^imajJI2!7+zzV2B79ZtQ*Aur}3y*8S`s+Me>9%ve zSPKX1g*eefYA+IRQ8+ENQ~;w%4Y^Q`1zbpC8TGQ5)IMkre#ng{61E@z7K8qDwGNA~ zSM6Ac^HjABF<#k;@yed2nRg@d4$x~NsbK(l1F0hf3}MdN&57^FZ)w`(vn1RA_;zQ~ zJFN+CRTBjggb-SgPdH$1o5;jBcx8E}9d;7|)D+|JSU|E0^GaA-kh|ho5T|=)e!?E` zBiAtstUS@4wX1BKDOLEYa8U(Tm`Gd4BSRwcSq`-3A5x_w`SsNYx%(@yw24GoBU^ZG z4Zg;fGX|P#9W5V{w-?xZMQ<%9r*tZPr|%yqaYbqknbtUwZ%F>g&*MVkbj=DWy^AGu zoVlO0mmTFy#^ch$&Y%g8XeE{2(JL*JDz!rR5m?`Zh&kyN&2o6z7`EO~1Fuw;c$B>T z4@xJQf39TyqZkFY;04bH@SL6PY421MpKB(EY;fYR^_Nl!C19L?gkF%Zc#H544wdQ3 zFA9k9*@RYGG(M0bH87nLssS<$v>MEO+;GaHRefLIsaLK6>WX|rzeqNmHW+jANhBAm z)M0pV%-hACuyNdpD`I`zY1Sw0>F=p3B9)Lk+{9WFf3BM^T4&)<>WmS9l*Q;3{Rtvx2D8PnG)nngsJ&l!O#kZzw3{vy8b3bb6X_1^gaBb7 zxcApd6sDF(KB#7YjPK9d)69U9q1E-5AHhsG@i0ej`#!evZz(1-?U zSy^3~u9GB{^bHZy173gwvc`m|66LzCo|*O?%L=Mb8?y)A=0>iS$1sXmP+j1fo1h1~pkvlSh2Df7;l6)-1M&hiri)F`K zQ*gjW3#e3Yqi~ z-;#ja9cWe)t%3CB)r6#T*MNp228x~&3J<@NKgAaF)Hj?U8?dEDYL8#lN>Lr=x2eE1 zAe6eXFbb^;+*x4VQdtasgi%aO$-46>rD@Dk@=pnbch#umzXVMlMnNJJy&6b8c6&AV z5I$4WrF+|xNLAgN_Q69`ILt(C)95}aeL56u-WD|*O>b24-x8`ne?Kbb-vDZ?pRjgRX+QZrAFIaPz=55@WEg+T{1C|Z2QX=}yYaE5boG0ehc>4bp;*Id(w!Yk~zc9 zVsWvEwGO13(2xU*z&Tb>6v5ONMA>qzkoo1j!t9T#l_xlvuBupd99xMZ{qdSE9nuP{ zUlctk5cD?C#)4lN6VX@2CnmHE-il_JD*9jNJkhcP(n`GDav4XGIiIu#Q3vdakU2&| zLrUEcY3OAE!Dk~T_|JkUCXW#$4wXiD_ybg-H7C$Yq%E#L6MN*`)zGcj6#n5{xj^Kl zYC?GxSp-6Z0czX%5?^>jwQ+3_C{0riE9^&6-Exx~1J|6Y7Vnlu&>BpSl_*Y7&b&-2 zdQLH-iIdRd%n~rVmIUqO60+L-|MvqMd3LZ@AZH$Wu>n-|zFcbHgERmjgJXTd7ygH*U+Mf5h-4|?cqFORZ z+Y0G#;UR_p82dd3RRFt!u;M#~< z4m(0541A6=qP8fg}ZFZI}m_G2cRyg@kJ9cJXF*G4PzETvV*_Ak0`` z2H#+ui;cDCCT#s0;b5iOWjD2?i~?t(%^%P=579%SXvC{;lwk3gSTR<5Px7uta25PBd9J7iL)VuMX)i+nHK)AqQ9m zqpwbTSL-ncqqr^TDkFTRWZzeVg4g?!m%C+hRsRy;RlGHTJPMQ}X%z^FE|I`E;;`7f zFYsJ@oIBg8nQ65>h+o=8lcu^lmvFz7hhXFQVb|y*Xb3I>i6&!Xh>TzGTN7XF7>JYv zHs^C@3`x&x&vBFal=s-G3fZV%fmhr8@rA`Vy=|pH4WdbWXHrUacLTMMhwBXl!(AC0 zO*M5JH^V)89mRXe(F(yaY&r%o38dGLew8F%0U?k60@&JOA$8#WViK|$h`m8fLTnoj ze$1tbkKW)e;ROdQLkq_OHy^wd9X1j}wnn55aXbX^UK#xt0XvTA5OxeS``*v^g@@T? z-E_Sg+3UQv`>oA4VrJqt0uuURuSb{oMJTGpXh6x)TV;*5;EWVAdq0*bt;(Dv+R>Vr z<|pBlRNmkfU{NaJ2Lvdb_9xL=L6;Pn8IB6x( zg7t1S<)ikh(|POU%+D0bT2n7%0>1CV!5_P>G?%tt20Oso2UhE{7Ull8d=5yju&QvJ z2h$0DD4p3X_toRyBZKQHRZ~46~axE~Ee!f>tf3g#c#d%WefB z%Yi1jboR$c=2F5X8!tbOzq~TCsD?}^B9j8k?NB}ppN(Dkeb z!5+T@mer;CTMrKr9VL9uCsvxWbdaU^ux-kvW^DI~`p-(Rg(6rb(m-+-KM5B0#19o> zuL{2UJn}I|Y1W@*B2~Mr@|G=DGj)JW)u@mfY8yo4;uvL+T8146s0|3#iX`D$-z0Z;NEoBrU{uQD0NFeRg@|`s3mb{TC$5)aKWQpoONL4qchcS<_H74>ToDW zz0PN4IM~6yG6lC<%~6IeH|QanK$acg6cYB4IBgR}j@(6D`8sUIf=~0{>Vj;new5MPlJh^SR-R!~ zLbLqx<9O>0YR1V%3}#&L=Q?e7xq2{X6GO+C4&=Pk%zYF%-zJ#(*2u^0C5M^fxi&~k zuQWqygEh<}H`s92B4YQ&x@qd!q-P=d1we@5O+%MW2uV|7*Y#sh2 zF>{lR%Xe)3!GSpqK*ZZS+J>G2$eq6g={n@F4`dP0qwnjP@?mSuIX+;a^+sCFM82Cq zyaelsZ}B_ny^bVi3(z5UcV+1AM&-EBE4vpUEvdr9LyUcbKB(sH_q=+&nz={G{Yg%? zQd6TaKA0RLv!$ulDDDqTGt4nkX|&dUTy4a8sy+L#^)A(b(5zO8$)8b{dddDG)LP#t zfSCc6cYAyOk?P6sss&=B=vr1C^B3N%osOXpV0~{K7=>1Y^-PzAtBYU{I}{#LJNTf$ zscg7%nR8J6*15+tG9GviycfV_GQtEjK@G&6CVra}vTf)? z5=D-Q4K@y^s^IV1F$4rp;P(jK1*HctYT#oMD~o}}!f#3SRyFh<0)RyKEjKjDbEAqD zvI)g3BFKd%7OA@jt&c3YX-2VgO2>wkM2N*&kNC`b&7IHfKN8HiYJ{&?`fYP5H?k== z7WdH*a>7{PRSF@POAr{s&XPBw*zAHVD)~p^*)pF~-f~m2Sx1s8LQy&A9_m?0n;jAo z=mBJ;gicdLY{K(Mq!OsC8Cfn8KEiXnLadtl4yxUTbNEfKI@4P4g|`e-4h+l?6iI7- zLUhDWe*zarq zunCqMOO9lkJoo)0#OWHyJ<4K!y7<%H^fkSbnSBL})XW8+7ag<9v-v4Wl5#vI6qz}* z@UM%|RiJoFaTHJMJTE0w8ZqjISeo)qYwj-2yGdq_i*ltz%=v`dC!H#C320O@N>h}} zkoDZ<*1d>KqYjOnJQ%^@5S~T$AJvSvT5~_bt$zJQbQwwSt4`o-HAC{71X_24pj>z; z1<$;aA9NG-LuWL>rYPrbWHS?J6NKipg>%qEbK1MroSm)32e_w+@$wbQ=Hf%u+)o%p zqxI{kYOF=gNP&t*ZIGimr)wEUS(9UM4jX~yRIaEDyx@yzK19o2c?^#bE+p~&!TvV1 z&t9eFE)rTL3|*dfHyyKA##h#rdCMfOkN{qpLx){OLXfgHXj=pyi9T4ZJIyT|nnTvw zsb}%N)~t^@Q>Ye_lW2V+?kDxGPf<$@E?EJ7p?I%YtF%40aY_&;rO`X_e<&E8op zIm}G4^;Y|luNW$e_O@njYYke{2Fkgrd=w}b=T1Piov+NQa!Dp9IG4bWQUq5um^Tr5 z35(v)>(v~r%NV4j%Wb%XZB?Up>YFhbqR32wVw*>*Jt&xX6wQ>eyto5ky2{F_yKdmr zoCMi!ed>40oA|#h*BpAC;j!+l9o{&lSf=5kbsb09IXkM!uRCj3olEMpE<#^C()Z|Qk!cNXlzRZmRf?lb=YCqP zIn{a8H-j!Yz)BNEGg(@pt{g^R_Wx4$=m3rpc%sZ)#(_ZVeY9+()^88K$^7-u6^!m{ zPSHcuQI$2tXCFz({My3pS*)0KEMW0iZ(At_VJo4I90L~4jANP1F(Dud)IcjvO?dnp zHfQFrdFZ#{`K$o8A$# zmYt}kNV|x5iL=7AJC7l^94Bhhvu%h-i@b&;dr#oo4N2&La^!+%P4!!ERCD*G#Yey4 zAJk6(DL)R8Nu!u3A!&@la92=kHN6lPA|VXC-=2H0_2f70)fc!nvVR*Us!;#BXm-&L zBhmdq&>0J8r_!<(9I2$`&e`u6&ZcqV%qpTyHt%;PhFPaaW4s@rq+R+x;D(aFoqOrD z7I$Op-!$=#%B{J20AQ`&nzk5IScoyMtG&SXb^~}(}t=LN9(N~IS;B5M`J$WZHSk6NC3!Wa|Wjo4)OX*@MvL;T8kmR&Vt{NDmejU8P7Z$fxSSK1-*^B8hV{GP0NmB z8Ij(*mR(+NHY>@qLQaN9?Vww0V7qbBbICyThh)GRMW%iXWrRlU&YVL6LAuPF9k;vP@hSp@Dp^@F3}=M*_wqjO#}}dUM1V`?;fJAoBX>gDu5dc z*FpHxJsU6b)w74c!~(u(e{0r9@hNU7lv0F-txK82ID=h%jS)E`h@b)1Tt^`Wg-CK42bkeMT=P_Bp{e61SZ#@DZx9FbyA zZ`*pST6013fvgCDvMIne}TEPp|jCUDIG%izZ4>3Jbo#{9&&g;WVov`61Jqvb$4Z!;u9iz>l$PByz!w$8H6NX@B*} z*5+$mj3Q3vV^dGVL}8;O2eMp~nEN8&_&}p035a1%iApFG8oZ54!bqO{D$b~wgs!z8 zzQS3=`McC=r5dv;N^NAJ8uSBrt1@OEP&n{MLonG*(hJXFL|@7`5wX^-K8-WvWXWfB zc3nF#2>O zv-t4fM-8;B96$l^%i|cZNLK&~lV0vjextSY7{@I)UuiA)f)BCjRewr;mJfWvy8;M> z;iMCf7BtgOrX#)x!2nh zjK)WEKd4q8Z$EJper9MmYemzd*}Ikz`3q2%;|%9&tKV2R9RLyyOymueWIy)3*qXJy zwfr!b&a6Ajz8dEd%39x*a}WT22?{2%N5(Wnhyr@6e7lcD#{(>B&)54V7vpx#& zVUqnt=+;|gB+6kisc}kG0LCn3(XVSPW7yb}zO(ocNAI`Z{Sb3Aqf)78ooG|-G~mb4=wX``6g!5XCOmO;26 zM|>!8k+54=8RPz35X9|^t$zF`TJt_*Ag?{wk&628wYHRZF6jBN8q!QiUcFglKcp1q z3WAOL@6ylW_e2&3YElg=#H5$-QknB{wU~=#v0H8Vn)@RBK^yEQgYZ++j8sj=fCeW` z$W*iumD#8YrE(yTwglP>(#15V@d25&XSl&*tFKS0COk{Mhnt)f`1mr`vO`&ScsF49 zzzR6S8h(R=-T{*}LVmRsw#&Lpk~Y^e1@QYE&U^Up5ua}bD$-QO7}l&cVi#}5v??w9 zocPIFU^D^Yq>xFPP+K2H*ImJ<*2H}BPh`O?)@~T?;m2pAs2nvO7jfNUKS67!VumGp zasX#kg>*s0ZDXsa<3=y>Pli;lbcX4`^ck(1>gCIi@inp926<<2b`dV+3Vs?m z#3W7)=1LuSlIJg&iFNBal=GP%vM_A8$f>dQ=QTgltFiId7y z;30sRE;SEpbD`RNgUj}3?ofraJI|1d8+S}4{4#V~iW(40@Z*?VKSZ-k7dH00 zN>w^;J7NRsQ%PFYqc^y0f7*MXO`=WR&0-3U9(dQFR>pG}M>dN-FX1c-Xn6W7X8HJ% zrP~+t@;{+XejAh7qc^Zs&D@zX>o^c5p}Pg!dJw+-Xfsd<)^RS(@_LHqeg2#Tzprt+ ze&a>H(=mUqBGYX2Kp^!E4a{ONav;BOAw>m!#*iw_>o}l3_D!|?1Qx5f^amZIpxrHu zQJj7jq`A2^(Bh;xr6M=5jW1q3bQ!w?1raBxf9RHtw7p;z@&2LKEv4m(H$BeySQ^WO z8J{@D2nEn`C%$)&&_m%D!L}GH*pcWUf# zqtFV7AGcI%-~+x1J^3Rd6*D^dxX?@IL4XY(Z@1Q6>a4p&78xHM*kj7pRrM>u{3#!Q zz2uu#-y6-29nKx~XeIhyh~8tMUlci`!T zObOUpG3zrd;2Y0XQ@2Gt179;<%v5>e2AjC!HD|`Fdjt$37VCrj6Q0_0Y<5he~V)iC-5{8wS*dykipt}t9Lh3?Nbfs@^xrQlx_D+_kKK2^( zmRV~Z)}6}w=)*D@j-@je<@<-em!#J6^%Kc;lDavrQdaz2$^$dj{m9o0NRG{;8AU#M zARvKC>h1<#%edw&TW)z30B#pWfN?z_NRL+!Y3>>4)z9%6qOyx@(fS36*$CUKPjw!- z#$GNauH>jG(NhtzLTs8ubiPujcUJ^K~~eioLV#@Ccwx@elx ze9kv1D@@PHv;xsdQkga*<83~&A?^Emea7V)Zlr6@aeQ*&u4?#QdjkbNps*n*o0$~y z%?9d5XkLjN0fUf7ceyM@;7bJ-&ZHNx#b`J$-H*o!4j;Ghx{^wZg|V)jy6;6Px?q~b zcZ(d#m!L+@@m}JaeAeSsFk@TAnWN>$u`g(HiIZSU4|0@X_}wru=Cv~FF+Tbj*(8)k zQhW?)g-hp#(aebs;RdGeV9};8UQy9Lp+^TD-qu>Qn+r!aUUrYUjt9!3y&RdFs?|Dl z8>Nc22_S3JDG)3LCwdhYAGcgYMxcuy9GWYW^1z7XQ{Ti_Fg5(RK+qtC)yG@BKtm-jih;&uJv!^YS!al|I$@|-DPUF6~ z$*vy@x$=sAfX=i2)Hi;QR7)^W7cGYtS)e5IHnV6H!D=v*6lq->Sp;yRs<9|Ryglg^ zJS;SxHN3apYHx4{p8E+GaSOjL-Ooc^bwF}Bs`g5M)}sePv?FVz2ZhU}U#>3VgeR9< z~t$eG1EjS8Kf4{TtLVL?iu3H*-lO$*ksSG>-kcMO15QZMKonju+FLoIM=rCcj znfx}EO-*{5b`&qo4Nb<@rKZC30HC3^1%y4Qb~Tc2Ht;sz4cv5|3!(eo_kRs!>PgS5g(UElImYx-xS-u~`jD}%Ut>ig#7 zzZ1gbvHC3jGJWs-n&X6bgt}wgCA@}JW#D}#;Y9}>Blg_M`=gVGe}~`=^|5tRKUNYL z#!3=4(-;(ibN}#qd)BAzt>3g39`x{MhaZ&BmN|SCBL9DCj7o2_mas%=B6>*wb3?&A-Kat3fB! zBpgN)n`T%Dn9o_HSY=q&y$5h_kPFuMzy^}nP${&VFo?7keBM#*P~mryBM44gj@~@l^kk!Tc#ziS*Oo!*gFX^YHcf zY7*LkTRD-V4n=`p1d)JjJIQh>Lx!+qXZ*x*sxgq&8~r3$3OYVmgmCrnHSB1s5I(KP zjiKOD7p_v&)T7uS(v*V%Jto@EK<+d%BE&pu*Q6KQGv4JA39c)?(Ru`7k0zU@$p;<8 zsZ=v=&Ds=I3^$JVFky(LI4AtXWScoP-|;~uA_-D1V(`#QxbxUEf}#D;m#tMtxh;5x z7Et9&bmpLB{zq%cHJt5x9SP57OX`pj{3Ty+ekJ3 z22L?U2swmd(}yMVLww;gV6=izL~+-uyHoJlgI|Ccv=U{y5cOZZ7h8l_QhTYQroUhH zOFR~-F20#TqAuneSDgax;h+^!ziqoxH+NU8KrsoUnokH5o}u{SNA0rg5cfK7y~TvH z_B@)MYK+E8)hV>spwP`_;`0+aF|I}5ihvO4$%=_dJJ5QDWK}PT1rm@OexNMe_3u_V1AoS#^9?iz@PW``a_ObE-nA zr~&+&`QiRZVu%|5!`L`__WtB>H#)1>nUEt14~?KT+(_r8F)&WIPD6=CBE+?AfbL(^Gsg3B8O7rYvH|ab}_Eob# zVC<2vTin!wrJx_g$Ae_X2~`$np)S!JLByMFI{ZIeOyQSd-~SSq)GRy3zTc)RY+Q`I zAC2p*yXEc8u@LWtdQgwy*;9WYbe_pb+Q`2E^8-9jeTOsQ4_)J%LCcTh;nn9H>mu+= zav^6fKi6J&0?$9ufdxUf@iw{vH6XO`M%nyj^~gm|AWoLZYnH?VeUh|dhUTU#2B~`k z3PRhNF=B$ND76BfJOf#UmGC6_TaC47FYehTp*z15J^=9QD9Rpj2$bAt=%FEzj-y^L zRvmj*Yk^#O5)o75Yd}hi@NGAr@KUF9N1@*)Btydz^fQ1lhyhZc{89kWE1$6!Z{8f% z+xdH{$8T24kFZJLBud+!@G8DV;A2G^3k@ykUI2}&K*UH53$qbh<*)K3j?G_nRvxeV z74wGBylJdg1;0t*exTMK#{o%`ML(2$x$#n3h2rfmr2R#xwdK2ma5Nx*cHPms>2NR2 z-x-3X*SUbX`S{yHsgSWiC$Twi_UG(-rJ3*F2N+miZ%_XaS#xBEI&Evh8_|K)!*K(N zu9f{zkzpq-ULN($AP)pQWcU&=Tk9umm53WdVkU``HJ%52xk=0(_YYWGG|x25(3)GA z1Es9a*v8JmhKqc5(C1ZSTGK1*;ap1}S2=(@W+wb~5E_0=)Br1>ols`H-&x1;UdevU z!z>xT+d?>OeQAvd9wP0p0Ixw~AcPIvSM?~lLc)Uu}+>%I;5B$~fOi=}u*yZf+nfrKPRxPo( zTn4%&HVew4<`{b2HW5xub~atc3Lt@Jiq_U>5hX9Ckd)Pn?1a%I^a#IAA+0=)2h>2S zjmTOp^*}WN2`$U%aq1f|v*HAP{dggq!Nxc3T@X|!=)V@xvlW1DSQL^Um$C5EPV*uI;iz-o)jDO2|3IRfIYbakxr;nnd(Uec1IDJ+RQsFjZ7TiHBecrNW_4 z8Y1n;2d#NKTTAeD!fjj=ppNx{`!hu`Zg`U0;J^_M)zXMY3?9j!$meE~nT_hTX0(V}y*aD}{hfmHBAS zC%?>I{ldK%8a7>;@aQ-AMlL^$e^;{PlG49T*~ANlGBS;mc?mP>Cm@m(=rR-F&Igg~ zPj2;@To%<@bB4=4q)}_W@a??qA;~B)6k|OWl;iWbJ6bgJ#yYyYR6vI`^Or0;0-AWL?%8TuQiBb)UDN6B* zbcMJY-Jz8>7JG5q`G=&F2~wnI??g9y=t_I**LhrPT3k%)T*xk1iYhe&t{Gm}wzGixK8xRgcA2x#%%&d`9y!~q1U zLaiIwWsDm0G&J?i)`HJDPy6Vt)|v~|!cTqJkhX4ALP&2xHY%q}c6{&<9)+yOG+1ba z#@b+G6ET_HbKEwyc%OX=E>+9+s~fA`DafQ}kwOq7JcQxL-9yQh)=epDkzao%ZB{jkO2fXTHzt`Q8iO4#S;!%Ob^OSd3k{`Y-1u|YaKJZB*J&h9G6ZGn4 zzX+IC`7EMuJ&*_`g=En|+mFKX4Rr^20MP%sdI&>LtNGU3S|;Ey{M06@ciB`*j^HHoVGWt|qPt)8&j$loJy^kC zt_EIhZ@N&eJ~g5L&G6xcpZ@emPmYF;i0KH=NRuXUN z#o|TG0|1LUv4+ADl)aIu8XI~=3wmesO$5|A9|)Nm%k|f6l*LyXb(i4%K_QhZX;c(~ z;=s#zWUM)hPP^iGM`DK1RDs^DbP+6>i2o4Yg3g0s%=8ryHN-GII$nKa?niudRV;11 zC@GP<^He8UjRmb4L-M2rk`TUZkQ%J_rW| z=MF?|TRw3NXzm;`OMhsn6kfbg47ztiWz0X+Lfw3Oz;9`F*K)UC_TYdP-7ab$ z;M-lTkq_0&ae)ytk6h0|IFn0@n^wJ&N@1IR6(|`wYt;`{E$X4cWSIwDqA*FqhR45v zhEo=b4c99bZcOZ_N@8fN@^3ZTQ3 z_*ijarnd-OgM^>qs^h*h7=APext7JI6DP0RD0RT7!> ze0$&(Ew`PO$FZ6{bk!#RkA1_m`N?Ihh*qXdSZT9RnOFAM@xiG^#n3ZNS^U(bG=}?L zz*%YeaT@EPD+DC*3rF-d1zx4nMt{ihq;I3f8vlGHTRk$*T?)<8OksZDa z|2h{5FWIk|%XNYwCR@!!$XW?irS_{2CiP23s z$kJYSq<`ufzh-M;!mI8Q_D<){MXPg@o}Vy5 zj5+={1;(8%Q`6pVKmIKTyR4Cp)=nq*Mr!eP2MCq;K>?cl;2Z6&U$-Z}?GqoP5q>ua zn?i=4xb2wqbojSG*bS+339@}Jw-)Zljvq1O!KmcF2-)0s4=lUx9#qte%!(T?jYeSM zi;hIk&v0MZAcXMq7La-n-6fF9!~X@G1f|MuJa3_&WtYJoE`IDSd(j!4{MSNPT-3yp zlQS_l9+yEp zbhR_*BWlcYm*=8fXliQr4=JLXX4Z_dV7)+d;8BY7?44Xr`S3NarNHx16LKVX4GXBE zh`Dc|uw8=At06Gxaey5TKJ_96X~_XBN3@ZUqoo>lfd>K92|a-&vfX*c&Ez822V0b{ zy0KObDLz`r)?Y}U+(;`Th-40kPqEht8A)IP=1vgx5Q}mwnvN%27DREk>X zs;#&2c=A~%Y(^Y`_i*q)t1C)sLY8iHmoAx_zPWNdk6my*!$vk}Adtl~9KIQTkMX|z zxIa#MTdSD#R-8OWe4&TOR0GH{!XBQg>SlcRZ4|)){gzf%^+q)oVbwJTW-#xb`H$B0 zx9Bj7_P2fENm!2B%Z_5n($qbKC5wdWb*!*%9q7{=A*(Qg_p|9Klcg;THD=^G`x>Is z{Wf-(2VX&XR`W=C4lk^SzSKzLc*~p*Thm^rw~4Y%L{1ou2PvTLG0B#DL;QCBF(FjS z(&u2td@{_OHrl)F+ecNprUqV6^RQZIX!$y>)+1j^y~o%#vV+|rYNuPw;DOPi$hyB8 zfvf`!wkZMyVO%*$f#AnA*%NPqLVh0m>&$Jq5Afl%YppF;(-%gHbexO@JTk4BkT%*y zF`=0NH9t{&2gotr){wb35b_bqHYWqq-mKyf*~ZKMj=C>o(L&PY$D}4b-AoQda)GNz zXvuIkAM|VFtQO;wu+hZXj;6p{;j8Uq{9i$I{0ihN@mfm zrJn;AD!7GI%ttn4OnDVs-io6f8{TrAC3gPje0k2IRodMsh;#b?KsF#qgx(I_lVJsm*rkTe{yXM?KM#oK*Q(Aox^02N2oK=$@gT*KB8@ zIW#*>eVhLL$aO4e^LJV#qRWYAbMCwls_Op9@fQ}@)LZgDNqmU-yAZR{+C$J=6~+JP&y}l)zHOkgnwJ$SjY3;|2*y9Uex%1J3RKy z=$PLS##BoHlZ@Kp#Te-fv8}f`YB36}3wI{zc&bGqE6h0VaDvKrD!bM6cqmgr@hvmVMUX|W)0SFEvRG_jSD^5{UW%| zYbYynSGeweF6)}O^I#K)RSaRS-7tJ0$0eie|f$f}IAmkk+aDdV*w zuqDQx6Zn0vRC9M!D~=$FNZXgl%~IRt#1%{PC7-{@mkCfMXr>{Dr=fuNApg-q6c z$*Z{#X7G(|PH=Dey0zgl9>n&7SCU|ZK#=KH`Yf9Z0zkh}Y4Iu`3L>E1 zGSbMdL#F+bP~%;{rq5jy!|#>*XfENKFKJ}uvG(FGTGQTVhp#3DOP)3(7nAC~P2g3q z8aTXFxXZIghuKyYC0g^XVkDb|)6+V>j0SL_=b>ueCwOBBtyu$Opk^uawMR%D28a4# zi%vK>D+a4!0QD&2Rbsl}ntA+zW^BZ3&tMqYe1lJMYqgEzII;I&WT%B7otD1_z*gZb z*hoR17uz&};06FZMu^GOsGIgHvn4?zp6ejvE#-YR&adk2H~7&$``$HF9E@ zt|LcO0s_n+(Lq55pKfRN#1a8UofAHnxAQL9hsTg)`tZ$J_(gl>b~`j$JtnU#NQO&o zj{=ho4zu_<4vRgq20aGYRt2jrBLl28ST34ca|-(_7fl_HE<$q$WeNg64Vv)ATOwWI zI zTZ7L;8xME|s*v`vizj@NTmLd_jZD%y7}yyrcnd%a9}vET&3!cRxzbm2|}>-bSH3hkF5)ByDv98{SJtD%>q znBfS<{LC24mAcFTbo(-sE5I`M>*nWiL5qkN1p$4VzVr|5AW~mvZY$mR8L?Cp%SPJ! zfe!l2gVOFb3L=E5(pH@q@HS6CQ?o1 z%+97Sktd~%1n0~@qvwJ9fUFR6^0al|My|VbT}4IfZcTj?ZJ)1X++_E9@g6P#%~+=%(V=!u+#*VS0EwHZ@6ZTiLqC`%)}Te>a_IO4?@Fbdr>%h!Pn*L?v{yc198J zS0#B+h+ZKCfJpV31-rS(a^pGto*ur+1z}6}Nw4fsOE19#P2Z?z79>l!PV0IK(g2$LFXn6Yl<8@@zl`3;U7&53>s4zCFND^_!`jj3zGm9-0X z&CaYH(w|L%QKvwJVX~W1R9SYo9tMQp=zmTd2u7~^gl8Nt2Hhk$4bc^R=j-O{3}ET= z3wLu&Nw3U6jNzD%qC+@sp;M3TsE1L#FeW>~nK0S&SWTKuppu{OOnQ&!_#~ST zNd-$LB_hpY79bKx27-8G7vOmFX_2Cvq=DH?lK3FRNnmx&O_#Y+bnQ8HCv0j`r(=+0 zi!_rrpwZv*F`$7@E17&T0ahI1e$tU6%? zv=S>Y3czn<6p*Zr1Bv5|$YSXAJirwmuq>Ir!QO92B_t;KF$Ajx{I>2P-S`3}RWCRf zKmjBMb%wqdCyczy*1;oRRU0m~=YPtbM~NJjQ|HoUCfU<3CL3FY8k#>iUPMbrx@TY{ zYMIyQTYZv`Ag(%vnvshoTy={dRpfq4*n2p^LoyjPpF=O$`x)qAqXGF!Ey!XZX?4vh zwu7=xvNoKxD;a*AkboPvxB2cDLO#nI^`5I1e2&|frYXr5Vjv=!Tl@|C?mQD|sXB1X z`5nN_1Eb>a1nww2iGO97fD=gGUzu7+T8G;}B41`eyK zI?{&oRexiXT)ik7D;N__^effy=!N-ypvzkisK(~+L7R}kli$Qy*E&fd(xmx&1GS-wk|>rjzXLy6A)|l>(!lBS%t?oNp*`|p^~mKh z$$vGB&hh5~HX@@*sRH{x$^S$d&Mvlm98)!-HpLKa71&j4m45Hen)Thor(an7gI(yF7a0dD3Z zx!6v$2LN?n%|Le<4X!}2z^Qy;TVd8XsT`8bHF?%8dv6d~i~;8uzt$d8^Ar!T2X74u zpuNDYz?zg6?1H6Dm(+Iln5)t562@?nkO)~htQz&C7n)TxXu+gu@X&7!y?{pj5Z?fj zbT?t>HQQy37G+F`wD$tGofUqdK(8Pi2+(h^6iIBCF-~jNb}k}RCs$o9-Cs?~Pe&K7 zBH^9DnI@V8?#5sKUIkxt$lz;usIfVERdOa*Pxx>O%~~uS<3L>x1}aK{%mS`T+N_z9 zuukG|Psbo0OrM2s&HV@`iH#Tew)DpH?L~+9mS|kXEi~%c%~5BakwMe4ciW2tiU{TZKi=fi9ipYg%;k0PAKsgo@sjl_!GCw3$nZ^kcB+aM}XvS2bp2?N|955cGS-4_26M+&H`L zEIR6z8)5gd$sgwvo)bx3*b=UBH$TIpZtpPYTOKy-QslgTWiZ#?bRpnSne0Xc>Lcp)QmZ79^j3RWcJD{Gpu-u zz%OUWKgJ}_oN$iK%*n53aa`D*qTMTuQ?5`LJVK+Q>It{hTTX3ab?TdJt!(*1nRVeah}T(Iyf8CjQZZhrxPeTaTvFHazPh)hpFl%q=}>e+$sOp^VB!17&z3)~H8Kc_VnBG9R!p=-$A+`nlHf<9sMk zZ5lGr|0S?BJY^LA9op+oz&wWNh6SWljs~DzQ<*OG*d2!dHa;a;VSF6qw4h^x)wJ6D z8$eT~l!`5yJP&zx)#xkdWq9i?C_RRrFwXMvfWZR|;l8z!Yd8@S6i>rt6}cVN|6`*2 z?dwf>MH^{dUc84(?$(@Pmy|A4x*7A8S&AuF0DB~i&;RAz^5DSorze3~+u4NJe5<|W zU|ghP27+zZm6#0odDS7+n4)9Qc`)F-GGB2u?H%b3So)+s%-@9#A~^wi0-E75+$5h# z!Hf6g?Ex(9=f7wf%6xV(i?AU2D}`oAYobHt=M1(MQ?2cDXpAot^PU5y~3my z&=q|^9`#}EIjmY!-%4lIx>jSV7c;6`lsFGkcpKf6jc}K}y9P*6772B}MgZLb@28X4 zYX*Ijk&1~RQ4>!#;;}GO-ZE(r4z6m+q!(&ZqoD^`LvQ4LR0e5SadGOB!<>yk^$W~8 zYp>?2I?q%!5e1s9R>ot*kaj$~RWCFs2rU|yQH3(bAw1uk}6e@S6F6}}-R5*cM# zOd$ew2abM4po`GWk>trn;kog4T$uJYSN5d;#0?*;IfHFfoof0!nU{XOYD3e!rS2bU znh}~b>1o}bpEb~gNLAAI#1pX9293Cy^?h2o~AR5>Fk?0mbNI2XU_#;9_$U8C0Eidt^YBW2uD_PV0QTiARH2e) z1nvpCsj{(PhCSP;pKNp&R?Gy$9X|F%K+@j)&)EZi#P{Q_I9d&VU_(sEc`k2F|L$N^ zDH`lGejPANVo$BfP&Xz;;GUy-JF$8^exurWnQPDN&xT>*0Upzc#u^)T_j5HGVm6%c zESnXxJ`z{eW4Ai%EX~A{LkmVNMUn{IJD*8p%%iV*vDb!=;MT*Fuikk2QxmIiYc|+$ zfmwC&zT9h~ubM~<;RgnuouSWfVMew0biKmCd>>rlI4!;Fp)2jhUvL>S6O>(rlhkhs zIrQqXTk?*1Y1Sw0hri@{onh{Y%(0MYzZK9=)cM)v7AQN5CKI2VfbQqq)yW^a#AYu? zsD5*P?gV+9+u}IQH0@1HqRWr)Ho8;k?Y~DO3iukR$7aq&9-afwtE>A%U5@cD-7j(e z4KSf24xhuIHsy6Vj4AZr*N#2#e}z#-SwE9EqfdNVLN=4R1cnud>1s8c4MXV{QZ_nb$#qra1f^ofJDO5U=YwNOG{p(b#O=0WTB6aj#l6Hcgnh@E>oYTY5J1*Q2$SEgmhERX)Y7x;2#5OX9oZ-g zJ@DBH3cwpju@vcbT;O93K`Ml$y5RQ=&QZ-2{c85kIHJzouFDRwH_wgo)PORIMM`s; z`Gh^#AZvj*aoy&MV6yiJ-L?n|1>qMtN-RBM)p3-aO<%&^+>iJQhmxeaN?ud~b1e1X z+KWE#M{!G=>aphS?%4ymZWllWob&=;Y*@70ilNW%sIKPhh*Qt7?GZuRY?sjHOe9nx z$2*eB&zj7U`*XZe{}FaAm9WS7&}-GaPb3?o7(RLf6%3D+UEb6w$vu}URWv1$_01kM zsDASpemr`S5(HPt81bePkKI=#VV0U-+i1iC_tBh_UauLxz2aCkZ&zG1k~lRTi_O>s zpymz+oowPl)A5cJ4`>aFq&8|gV<6l|3g_*C*Q(*|9M@QR3Zw0#*IOIUbF+su{ptBF zW~Zu64T3BquRQM=l&`a{3r-7~v4U0-y4p*PIgtERwANDYc5O|UsvOgkkfL5nN+%;F zhN29Qfy7LTOI;MttU%@pgo!IUq>t~teRMzcOlH9jcR+v8>? z!ttv2QIz>wM>Ogvw2U`aStt)bNn+#NuT+{>cgUESd}YCw;0>b3baWJlWyHNm}!cb>@5$H@^zp zmk0nka_$XWY4z}NRg-&uO}Qo*fnXTu;Qz(h%k>vpTds0XgjSa!Zf5Zy;w*iZ!X>(Y zpkEQlX(H>2wIN&Fyy3i{6$O4IQAuIuQ|PWMy0`jywpSKYVWy$X;=zDA9$meRCNY_O zisxrrGvDXCAzQ!Z2KaLIKo*AzcioCYq{sy5z2S4K{5e^coEgU&;@v2+#l|JpOv z@v&;|wX86CrD3c5@B)cnVYx2wR)*q)n zjT4L1zq1{sfW3spcERWFR1DJS?f)K#%TrV{eJ>#;Z#d_Bb}bxtD=HW6--AyEqnlE> zONf<7w&E~1Zc4lG6agEwbxapyl0R^84bVm*bwr&Eynx4(BpeA{L$Ac-AZ8G~JYD4K z54T<`AFy#DbAg|_Hk7qwLW%JYU1I@~4CWD$%&1CTUAeI40`UN#X2W3soGmuYWm3`#p|KX!xtxuyHj*VN@)vFw?tlPm0%l!}U$ zjVfZ)nE9wxzbaWca0f`V=3{h{4EzJD$Glz0&s+Rm-BqWm`JZ>DyqWnbFDmK<6d!m{ zgXRJu3MyKZ&LGZzt{o#u@1qOuKxF6MYsX})AwE^~$d?@9S$DQtv=_T%oa!JW6c+IL z%;i6+ndo)y`Bvvaix}{!H)jzs)EhCRDz%|sO9geLQYkGQ!lWp`)y`^V`5@1R%N*;& z_u?JUpzM63V(SC=A`mL9Ywd#m-Z zT@g7jw2f|G@I6J8r9q%TT&kPI0iiK(@U}qA%uz-3z~q_Y=xro3Q9rv#B$)Vgcbqrw z?97-uLK%J{<#2)*2Ip!kjOtOE=kR;&g}b@4aKlBPiMU*?KA!#^#WWSk2_$`&N8Q)u zF^8o(fJV4GVD@?WcP-_mCZ`V~+DklqQ zI$3JR12ywMTW`Tz05PzqR1^Ne_L?T^T<4y{tT5{Xu2Wj;J9Kb7IfV!{-9D>s+Qcm2 z$1Y_DRF{Wf-7H-cb)|A z2s!>Kj*0lO9;=3!d4l_tD z+MI=dTQE!XXSbJ@mUU-v2g69@7)D~bjQRHfrZNxJQfc87Ib$2%+G|g9u#2~4f1@Yu z?*uTQ8jD^%XGiDJTkY99%4jV$7H!QizmI-?_fXGo(W^BfEZ&3dW8g*PW?s3EP2_8= zzs9KjfPk#moWieG4bAi$3-`Ux=f4H~-{2{eqIUEdO}4Zh%i^k&?RjDTaK|GMJ5{~O ze=l&>&$cJO(b;mFZ$@~o_;=P@KxoLCtX3S=B*r(YF^+hCqrb%}=DV(&seU7{NExFt zCx;pDu~DxHcIXXr0>UVX{5Jx!EA^nZbMA1+F9xHdlBhc?j`%a9HN#O|Hc2oo$25`z z?;l+7?CK~X!JfA&V>RcVi#2Dl!Y|t6{jgXUl-4_%z0~d(knvngjp;f9sxD8VDPnPu zVd-9OQQ7n*+XH6I_^ez-J$5B)jHre~h%Gel7t$*MmbfrJDun(ldBzT#(gQbMwsq#X zeP@tzJub31Jc?B$jfM5=MkzEp?=`&l~}lH%&2FWXBF@(l|5 z9<~x{siBFG))OGf&DA}E)0Qx7=#fhBcy!efuPiz?I;gtV=A{j6@Xz`%>}ci+BJgkF zP>*KJ1&n$V0yw6YIgW*1ehQ`~)zT|m6(!)0rD}a#egwOuM2ofla1z(hFoz%xi3nAl zx%afAE3kCJp9AW-`>5RALtw8E7kCD+?Dq_ZvS<2ZCQ>J*9EIg*fj@E0NqovuwwcQ& zy(=w?=Cae=#Ou*zacv|Usf)SYorHLgxI)eKqf}9QF#{+P8_j3cvP12SSGZGR!@1Uq zgVp?<+y(%tECp$WJgMu{6Hp$3;AecuC8Nn?U59>*M$7=mooeTd>f!4+L#;oH?R(xX zR)G+$4KbW+f~D=qCGyJR3*bLuqMi%GnYX}s8(ZPHEl}L^1Y7XU=x!L>FKAN{}K`K)KXo#$nfTfMennRh+fl zEXZg8LG(!uayAbj4yV7%M_Z)5Kg9h$?7%PPavxTXY*BXtHBIU6PF^UOz9+Ko;~0b< zD5V$!6oG{K7PG=m+dD2}w_1CFEgB7*r0hN*_R7R(_C!SERt0R-3~)zgeg-mmOs~X5 z6L9rOd)5c7#eB=j7NWD2zwHk~vmQ!u6pkYImipdVa`)&ZBIpiIYGBISttDTu>G#-8 z3~KW}!$d6+DkR|O*rBqDy(m{4<(u?Cm7FMhjO7@cLoZeHcXigC!>oX}&L^tI5HZ8* z5ganVr0^8=Q))>Bdl!;l2VD`3siromJX1}1Rnihy9&GulT6~20(Yk0dzzp*b1Wk3h zC=UINwr=#X`-alZ^s8cKC8!Q(@3arySJk5Z)#O(+7|E0hi4JCDvk_~siTsv84Ok!^ ze!IQ;9Bb{8-JQNX)eqaAH_TFQH~r>7)zw))P1lO6c4mKM9W{hwxGI(WZvdJ}ZMSeQ zUcQ{4cR$zIB>vxHlu;jMHH@WU=DU*1ThqmuII;Ggl_t);$Trjdo-p(Zr^MB!%naU^ z{I?nxdf@*CqfB_E(S?}FEfA}pvq(t^oS=!_Z{4G$nEe}#SvmTAo$WQe*#6D!2tR4y zh}CfM9_IfUT;`(cN-fC!|MwV=bfMUzQhU9~7{u1_9487T#A?!*`za$4U79IkO!5Z| z%n5?-JPPy z{~vxYY)1O!z=9;4vO^H59t_;UC_~tDyBo_Zc(V6=d)Btxj?(X(9Zr&*n_y0}9uxt` z3OMy8^1eZw(5b|22tO>%8h2;`?${|vAn?!olp_@nUk`ukm^5l;w3H)zh=Q9SB6++= z2(`#-aiJgv^4Oq7i_&KzYwV;PZn%W#xcVeA?a*r!K?ukp5HVQfur2AHfSFTe$xO4i zhu)htMn$=G`n*FBm|Bl!Z^vt9{RQhyd;x~ehB?wpx$mGch2jd-gi^-wAnP{5u7vtk zf+C}G1To6o5XRJ~6k~j9_99*(8_$bLY;E5Aj7lyxQjGT4RDE3r2G?tpkuPHjV0`k|5=TMFOJ){iRp1;sPg2 zup{IS^Ck`G;@DAkU=8+Pm73Wg!z-reG?{Q3STLSJl`%bf#b2&^1Y{B8c*zBLKD&q0 zNRQs>e&KIQ7M3`ym+OzN&|6nYP1&C#N>>W154sxL>@f_t5W^{hcIvbcN}ja{j!5ch zDvuwspzwxwj-7tYptbO1{G_ip^YJTgaH|6D4|zdgrBMJtE4d=my@%>P@|PbK82QWG z4^8}f@N!#HJ$9cnbk67AwVT`r^rPR|e;R^mo7qCH#g&fYDQYrX5lQ?yl4zwtcpixJ zbziqGGv}{|xYL(qg-^??bJdUnHJAm4V`7&Dbt+BZFBfj=HFbSRP((mjSuhsrW5OVt zd*VTN_UYK!Z#iX|WkN5+fUUY5VRB^}GhAZ|22?AY3^QGqQzpDoauz7HaQ>xDFk|Xl zk62>ccLh9V8p%>Ssy-sV990trL?I<-nt+0`D6=ExRaz3ahHrtYf$l+Kg~GBYKk;!k8YBeI+mrwk*}aqnR&tTp>cn4)$%~rr_QWlc zG=%ngQ{>b|ZdH?qH2)2|^8#M8=-eCHzbOJ01Ej_P5q&)I+fLyFs;+s$rNNP}dABzA z=Wg0(Z;{5#$6BKx7*y3HQif z_+tFkPYVq9n}~I2lm&+xZC&lJXd?Y+t@>*PaT7-aC; zVQPw9%2Sr#6OzUa1>R>8c=#^sxtcBTqQ&2nmRZYE;P#Lug>&Uc0jTL{i?Ivgt?NO^ z6&W%e3(I_mt^w4GYv0T7TASQ7U^rZ;%(P7Tl7@5ZMv`fe63!31IllqY0DAbYPv2M+ zcyU;XJ!o#PzWv6#;p$P=0JPN^(R_!aZ=M!TU+!kVsEb;T{guTd#9G-yY9=jJ;@+@q zg50zwH3t;4vWkAe%Q(G`^Bz}lzJ9$s{x#$K{F0AEyjHVICU?owirqNXP~zq|rmE&I zA}gFZzi(M0hQxyHwoG5>4qRj9=p3h}b|>oN7G%QMIv^5DM#@*R`XrhV8`FYx)g0R+#p0%aZu? zEY^TL*Kisar9SA3p7&po_&9^+bhg+0lTP|G=Aral*d?`(gVeKqO{!K-5#OFO0o8AU*-m8d1M`(qBM=FA2s@

jRpd2Fvnca9TV5|=x$t{0?~V}Q)k^QqCbB; z&VBd$qIVj9)9t4r$o#M9&VLgb_7R?Pt&r06;AKzsL{^#hCXa^jRC%Zi^0`4LwSoUb z__sVjBj8yNWf+#Vxp(@Hp?H zTSkJehQYNZ{_ATT3|wJOAN+dTX5+*^e02;qw7?%==qlFvynDTe-k?vFZkL)9hn(BF zScjqN{PkNh4I1!S#4=oga36-`br4*hUyjFq;!k66evycvcYql%NYAfA%2an38W3W> zsMj(4)`8)csk;IiU3ztFzX38;m|26!6bR#{f$7|gC|1WH*+fXb)#$a%8imO^!ZpP! zYj8wxhGy5u^;xGSjgK6U?mzw$=xGw+dI&~kL0BBSsVsx>H3WeY$b&rRs8GB&xz+^_ zyK~lduOZtUV^4U{?>vR>T6rCK&z$@0juNkhm2=AZq^AP0z~r85OpeY~hABU!ldwiB zYi&a?drtgAN#uK?U+k>kI)-oyZbcMI2h#T zRec`cyHp?a>Nzi8ECnxRj(%|mK%;Ik0V6)nZ7V871KgVW+jtUOxDSoVJrZ>N)1nyN(=>#w{Wh2X$pmT<(k53!DvD^*A-F? z3%kx79k@f;97&2KH9zB1yA8Q&N(W<61aJ7h&LMGJ?$6xe5tNM6j-i1 z)T@GP$^{C|SPI?Re zeVmtRU!NM}!1v!1OFO2ay&DzQ7_K0E<}oBHq*yV1e)%I>)lV$!{4ZIME^#1V3!d2W%jdHAt&%Nx>owOw1pc?>r zy-|$=KltkC@7RP=0~8!J3ZsQtKn1=H{LGr`byNg|Oa+NlJyJh-P@8k~D(;j)p zx8!lP;Xd4%ut>6m0BQtthl=CS$={t<5+z+%*?VKk=#<-L;i# z2!k;)ZSgb5x-ADh79Lg9k){ zu}~L2b2yIv)E~v%sa{-th6_d*;pUc|TYeVP2?-pBvGC7c8{Jp$)kKm;n+85vR|dQD zH2##dNn_F`tEd>AHsFR)$tdmTVz4MeO(SOAInJdr-2-l( z`@cANExCzNGf?IAUS8vN;w#N&m>BGcIx6YQ#Vc_d8J>Cf$CCfs7RvaP-I^w>bHDWZ z7~H)pBV5LGh!l>P8V=mpz?ou8Yy*W$tTRGe*XP2SnN{Z8VO{N0^on{>FjgQne*XI8{^!sygB-N zH?UwWy;&84_1@L3Gtqv@?l|_*N8>!{!WGK|R~Y2(MM<;hB9x!8aKds8L+D*U7xTaP zrWjl`#Vw2tqHz?!gb`PCV(PA|<7x9*EI+%BJjWt|Wm`R7%_~$*-O}$?q-mxmT#Yq%~vGma4 zSo!pknC(__qoQ!=LQhiYi+|(#=x?7LuMIz$E00i}OeH59yuqw$TEu~n1!YZ6p> zFxQR)fAkhPSCm>&s64)-!Wd79rO|)#Y%G1~iKu_-WXwEyKH3NAMXOV}8@KLce!+d| z#k-<=&sEXA!QT;QIHkVj;TVvGno%G5h3V%`a{D)7*{ChtUyXQx-=e+b> zydC{FuZ!+oyMZAeSr0;b#}}f1^lVJw_)M=Rv!!P3`QZ9Z(VLUs@Dm=?aD2%+mDQul zNOLpe0AK!Jx`~5zkx##z<9X$QSNt-Lu!NKce)F62sPJqVen8&V{p`Uw z`;-4QW|u2*+lc~9Mh|Klj24ViFn0cHu8t!=^R-Z+q9Gu?;#gl*PUn@axoVvJhrb>D zV@vUhqadD~vROlbS`t|G=FcFqFF|r{E^>_;S*=$ zu4BV|C8U^w9tCl-W-2k)AOGFI75$wv1rBYJ;<%N#@_{eJ!f!tqvnbt_=PEISi&B|= zp-mo_XhXq)(MpGzbc1tq^4^~5IQ3mGj&pCgJ_RigO2e~>3!js(7~OhJMeiM3j``nt zAo_pyaO_&B$BuLG13WV=8ncUZ8eEdy*-|EoY^EJ&zV+rf`?qdN<9B@{p1Va08Ut{z zg0?;L(p}(Pkb5~E#28j?-<`4;;C9{VlP^oZ{mHlzhqL>9nKK#hxoeAybC>Se$%kV2 z)^5cCI6!{F3k-O8ekB%vN116+ZKg*T(tp zyeqc-{zI|l15c%n=_DPyUduEs5l1hWL(l_nWR(vda*N4`05iE^jbTNfMI)24J{Z<> zqD>{0=S>E>*W7|Q30}c_yGxVB4yb40!-A#}r2s4nWzcND>PF@a<5;U2ZSFNtCf{eu z?LC&6c+llLc4SfLE{varow#aY+6PP>dX#LS+ z@uH*ctcBXF>+=&8LfSMKcj|ICZA_mA-(=0&xo&Lzw-3hE|I6=1{d4CsRaKr#dT8dT z2Fg!mOaBclmDsL`^Em@>-4=Dn$8=BK(0NRpXDTYqDDJs)bu^ymCIg>yLxH0^Waj#- z*U+qm4?URp;@9UsNDXGvqx0S#IinbN8sw%maPwz?*rwSoK}#fJAi7JJ_EpW^h5 zJK~^eK5`IO^?AKsc9go<6zAxVJC9ZPgCHRgEV~G{D+55F2O?d(t=nC>TOn~(ABDqg z6@zX8t0ktlf&lmY_0C<6=D7nFGVkl7r07BBkLH{n9bI_ z$H5yH2Ls#&O};Q^!2IL|W8J#eU{n&L%RJt9;g{}@2OXAR|jeGqp|qU|01>>FEq~i z@GIfU!-AXJ;XcDs*K}&R)5sd)>$>?679KVh`?34S|0I?g&3NMPzX<;XKYP||NExKv zRSQ0=>t0u%H3)1$UltXeDxayyin4whyxMM^BF+30e-`{=I!^zrawQ- zn!S=n>2%}|vh;`rCCuEpF^%!4?B%z7*J$Cd#$e>W9Dmcek?{)j=Ia*yZql7H`t!$Q z<(EDhTOjzhQ)Rr7PQI!I!c^J&cpq^|9jjq#uC0SMZ8F6Iha2vfX9_C+D0^{09!ZnRNh*g11kvST3kt?(w{rUk-G?rj z=OUSE6Cq{CR$HL&3t0__pu(4_dOGcEy)IK^n1WIuwFU$?5wt#q1E!x$RErgmz;17A+7LPxbj(kPEw?b!Rv55)FA z-Up9;{$ToG>LK0=$p}&S(SQ7O#J{;O+6ep_^5;5uj#?-)@M|2aZTuoQxORf?ccP18p^ZsZP8E;-dspS`Gax}q_d6gEl@Oc2dX1$fP zRXgY%Y#+hXI^Fsh8;36CWKe*@@n_pj5^7$y~cS1>uXpX0-;50LUic`MlA@nCgW)Lv&nRYW0i!l#`rq( z*6YHC#L_$&!b(d(=*cs3f3p?eze9!boX8ymcxKOy@e1z0<{OL%Y8v6ppwKfgYNpnWSw2ru z6*Wgxk}$??QjyXFNPxW#0}3(Za1h~q;jGs?2){v;$xsWt3iB&?usjM=LBaq%?8*%@ zIOJ}$n%(jIl?$+HD=}5OaIKA^q0%TULIKVMN4w7#Cd_R$x>0@qz8F4yGPb~=ZA2&U z)msP%JRCn{{ZSjQ(FP`;M|vp;?B2W~mhQSD&S0d=z!cYk)t$d7+d+{Ok}y;#qY9sm zcsKmUXA{SnT0eO@TagdLnB#Nv;e%26+zI$yjm>&&6taPkhw!w4Q3^*sXGCar5`K4g zJC^U-9p_MdJ!w6S1p#nx1U@RJzo=EOkCkq!7TZ342&G1jDz*j%T`J?#I@hFW3TL4X zbdtZNH%-?}Z!g2&21YtlSz&%JW`WVJE=T7Jhhp^5QH)>^TVd8{%;yUD_cd1VH5+ig z^w!{6fA?H0-nk`C!;57igifc59F#>1TIE9>K5N87c<=f&i}sA_PWBR`E)T20ne3$ z!%#z<-H=tsBTfTn8f9CrPr)2Lx_My!c3Z*{t`_dO;hWB}HCss>=3uUK3!dYSB2CVx zH84FFVZ4G;nWpGz#B+$C6rPIWv4w(m|ILU|81L8VHLEjmf!S>evP?Z>I@eCU z<@)&idtVg?fBt2$|Lre|W54y9_~h$%#eMBw%)3@o_oY)P{HYXpzdN3I$1CH| z&)yM7e)Z+?!57ry6L`{PyrV`j#CwkLp4G9^W(tDy(M!%faAcK7(xvQND|w!LFYCAA zXUa?7j^$>A$U5&b{B76Aj;gwtGMcU}NALYlkrr3uYC>y9fex^YT%sJ7p3LBLleA!F3}?MQ3xiuILWvB*0wx5R`;}A)&#adKW(NbCK@gqBh56z* zL&z-0(x>=rXt!ptys0OX@iH*ZV?}0jZjQP{R2Upzj%{dKrVuD{pA=)jdWnO~CMvl8 zU}G&#{`76J@U2(H)J6<5y*Zw5F5=1`xF$A#-|g{ngnj}X4ByT%XYaF)IsFjYq^ALW z+y3(t@D$}B)se@Yh6dh?m5(0E`e{=dU*Ut!pvJh7X@q$*pGP;$#>t<1QB>~iz{5eb zE8W&!)Y}A;W$^k6aFLjKx)nenm#Ue{UifejjaGRv4C0#S*VUQaVALx~rbpt= zd{U*Ug~b@0R~Vz{q~Xw^d6KeJNppmwah&<-8)AAkVgnIXx@R$_4nps2=*KnRdNodN z7@r@kl(`oC&}ziaVqWC~k7-gt61%L`iVRCME=E|oDNB*1M$m`OvCKFUPA|(}Wu_Bz z{v0&cmlt9zOOU* zVieIMiB`}h^^k~VJRrboc#=gzB;m2CP+;6Bk%up)23q!%`E>)qmz1XD@R#mJo2G>v zLa~q&hDw=5m;y-!H3x1Ic@YLmnPC^<&yZqGQJ2gDXNo?f_d>CSYfekPf#)g;sE5`& z8-hK`C>hpUD&c+y-cmZs&Is!>rzk_Aulwe0(Rk@p$?s8wX_;GHO8%HWv{4YR-SjxD6l+?_!#(C^yPc11_6fe);g zMyet^erznBTl;h{bnBTmYw6|Za5PPn+1 zwbW_!ymJ+`%&*@a)fddAzN>rcf1jgU1yytQ$!izZ2!_NAiy+cz$OzIT5K?j7?{_!F zP^!?(rL$0z;Ub11wDjJlGo~-=^bX4H4p62^nY)6A+lDYohL&)xfb>x2)z&ZIg;JUx ziK~hrvog|vhf$&q-nL8uWYh$nMl8JXwR~C(|J)Y!n!?aC#fP*n}-#ybIQC9#x!}}l50DU zqPfqU^w>BY=e72j$17O*HzF$FBuISqoEri>;LGOQrn3$@k9aGsv7;J$P+^Ra+sH!G zI!z}8U(!R5`83JFjf&PXEtL}f%jY&SXu^MPUY5Vor^9Qj#K>maS}v-ogwiKXL-mH} zF=9>wylRYV-a3o^8Rbc>n6GSgJW~y#1T~`uIWz747RsC%#RT8+aok-)N7Vt=CV0_l z;wY6P;bQikFTo%>7y?G<))>bgbTQM{tI4J4T3!}Qc2f}~o8CNg+ramS)Y z1B<*Y^a$}y2$G0ZIG5-Wm?76DQO+067>9st{EO19SoiymOj(P4#kL-Qdb^Ps(nBLikG$VmRSteC;gFuhtj?e|q zwSmt!zK;Bbc63<>QQ+D$7Y4Rlui{cWDi6$OrK1Sk^dZv^_tC`%K3ar}k6YIsYrFjJ zXN;0Q+gMB^Y9nNK?>bH4EyK$}_=PSj*ukI$OyLm;2Bt=&o>dIN-Mf5e$_IwfDNdy$ zUkx^S1%KfCj5Q7Pxf?WtPRQTUh-h{h{TgE%zOdvmN_}rVqAP4AxI;^8~J=fQu@?6=94{)s~byiK}Hx))V@PJ3tn}@Oe zU3Xzn#c>)LkV;g2#li<#5;sM@JC(`?b4>|6*BgTv>(XE%29di-EbJCn70a%`_=$C@ z&(n<0RBOEsp-saRRF$n&4FYD7ex-uy!8{_I_C(={Br^^01TUjiG7N7xfoJ}#ff@cL z+qD_;*Yxxnc3NHIPQ&9fQZCO2%C49XtePmW9?d=rW2dryqGpgc;zGKVJ7e^Yo{;Ho zFf5I_@TROKUGge-OT>q8-e6tvP7erOZ9+988K_X*Is}eeh~T4Bn0Q^cD`%l?1L~eU z#$(SiH|2)H%#tF$;OjTUOTKeUT=BBGn7XYMom)sVUkDwyl6nv|>bGGSS4clS6?4pw z#C6OIx_oJC?7*BT<8*ZMnL)k|avA>2m7YvshNsndSV&}AuwnPd(P;k)pNZCekyAn zI*gws^?G)n2yF5fVlvE=4!I?o%8GClki}SaqZs{`+7y@`*}`4}F*Ph< z+-1HpZ zfzHYl%T#T;u>g+1Ls?$*#_4$Zcg)4LKQt9r{%|LD{zyA^{`gGn_|azU`LTBF`Qf=Z zeMc{qsRGTer6XA7k$8GULDSKwls+#oilNj^ddloF{I%dVB9ye7%!2v3v0-|qk(0t@ z@l9q?A!VvlXDO04Mlp@CXBv!r)fH%N+Fn%OEX177}HP;g!Q|46PXC3 z^uk6Y(}n2@2FSYh8O~+;3^YxV`j~e5XTA*8M$lTOk-(NVVIw4S*H(2Qb8vTp+RT&x zzH5_Dk13YZ$zTv!kAaID7EPTDil89ptXH77!`zILIIa#xD^KQ9;0uXwK7RqXS)b9s z@0r?s=KXHuVxJ;%X$Fat|Ng zXr<#?8@h4hH+_;xMn%>_nC?AbLwx2x#}U|ImM~#HW8<{qE;$ z=e4)Yz2U7c<5E`q(g_u4G#e30Miew#8Y2r#lGWHam9vKY}q=k?hq<< zsVq$DG-Mrr$9HCMHl|NvRLqS7tZ<1wIygWHTJhB3c3iQ!5nDIAEoeFc(qL9{OITKG z$L7VSqH%bEd0p@V`Ta1)eh3eD5C(x`!UX3hA8W+^Bh#^Eb1Sac0!+Q1dSkI@h;}!O z&-;(g$C-uYxcQpRnJ)M@D#|!Kjbq7ahy6x$P8^Qr(It4my#1sIhhXee@C*DaNeej2 zFFsfIufzvGg)$SuUvT{v;J`oAFBKHncE9JfQ8^cz&VclOczkde=l6}`GmmYG&Qv9? z+BKWFT5MO%)kskjcjnFXPsjA}6Rb%A%bM~apgH70%B>&6rgYI!Jkdj@V%2ZQ+T5+$GoD?^;qvD>xn144(NXJ@p?RYM48do;qTni{-_^0 z2d_}k!-F{Y#4tXcG}dD8u9-3idDn;z2pxW-L(c1-j;WKUW0W$62JwDMUBua-Q^SKx z@tMzUKz7x*YUdpANIiXMYyFe_9n%3W+m@bU4stoHe!!o@$OGO~4klh>lVzF*Fx&u>02%t;r&Aza^n~Anl=yDJjbMxK7t&8Zxt` zrW9g)LRqeHkKA9Yl}TBvfK0BPMAKa_*JKXk{Z7zI?%jD=m<4|MpY>Eu*L8>tK=Nl6 zR-*3{>v1GYx(Ul%NiTck#I3$Ymut9{XDZ{`zJw-U5}vp_58mj(^V=i%oM{hm5;xY! zm)l0%6Q1}%Q^806mxyfII>FoYRXFy1m&i4A_9~!)S<3@m8}n)ybI!L5UwLw#&Qtla z_H+Y$WP;Z@aKgXwI@~Wf75WNnVc7N2PEZc(^EY8RpSr_UPc4?exzJSC=s90n5`X3A z>*WzXgbm`*u?2XBaB_K~0ZN&FEF%rVcln!f z@bFzR$l{k=x`W^>)X1%UGu2|)+&=Z2F={Ib!s;l@H)^EAyH3U!<2;N*LcN@=X4TW2YBecKXs~HBOx-+ImI}QJ!<) z65R<)l!vjfykQIv7}hV)nh`V&;xdhSx&7`Oa`^dW)ENEQIO7*OtQ5ZBP}j;m&ouI^ z0XRXWvts9h zN8cn}11CS{dqms^E$3XW-TuObm`1S=97iE6cxkSgUt6Ph$3Xle@hbM>%1k`A?{1<9 z^@Rr4VFjHAMZb()-AJGq%(uTN)NI8I0e4mK#fuqv-GiR&7&U~!nEV48(hqObc2-+) zJ{7(H#pu6CA5m-v{{!Ib9UeDJ#gt>yyHGuLrnTf$ThfIAl{M2J%abukC&lUQT zPIz3`aDa80CaxC$i391bQB%HZ2vr=+gg0y3M1L;Gc|tGnGJhbY^`vrk&u zh=wEr>vahpgYoc8Z!-a#M?BgpgM^*u9w+_6XQRk-X`ShaJMTOnODp|2aAZlA6k3o* z5fmvRpB222mp4XlFdJ8F?BF$(5-5-tKHZ?l#v*MKdN0P)HNAr3Xt2J1UUvNW zOyrNLmDs#{J~nR{#+h@Zh!)!u35cI*X+}kLg2MN)yW+%&t5KR}MlzN9xwIo^n(^eZ zM(jJ%hyy34;@muZfwx2IgNbLK@MCSO;2?{f`S7&kn)7GOxnxUcz;U&+9>?N@pu1f* zh*GC92(!}kMngQH@5<}-@;ACzG$#rW&){!ADUkdM8QN-YKW=)^RA_TE=IBM%?ZP+x zSz}l>6>nl-nP1DW#6tq?;=@ghHgTJza;`}q>OG%B8^Da0zLG+AZV;b&^dw%g(2&1< zry-;TqLM73M^`yi(3O?xICXq)96NMP96NALEY05>r;ptcPdc~b%ZrQz ze$FQU@IRzME6c5T;*mRJAN}#q-w_LEUl=dFV^7?2?WT-O)-Mx9d784QPtpv%7v<@i zp2ByFF}JFVM=S=?K$eZT;l_EQz%UM;SYl0agl?v3i1I(30Q{Hc6&V$dU zPRUC?-~Baba-GKyonbH@J0l|t=p{*GY&r!o(^>YpEDwqvuBGwfEe*=e0A^Y2XKL*h zcGBm)!n0?!q>;ta=u6kQvxdme3`l;g-*OGcnW;olHD8y{vnPBI6fLjA3cQL zyOXMnappdBaF@WHlUjpZcM2ritojOVY{s_srvBVBdVV!YvRpNXR<7UHpk z(Sq0?92{r;y3MhaG5crP778VA=gL=}1x4N~#BoxB-$uce~oFTWQBNpK7_ zWle>1l~sc)^Yc#T)0~fav2IVr0S{Aw@#pdYPxaGQ#6nG9og^2aA5eLNSuUpS8`^lSXS-QoHo(8h#oA z=UF!}<~bD5E?rICWsbU>+0OV}{YKB#clBQV*ACnqO~Lz1|BL7G5WaI_7$Gv``|tuV zN?1Rn@atpYsI&@xEO5FlovM!IGTm3D_0AKrikcM$X{8fJtT z1k;?LpgB#Y8Y}RmsTiw<&RkQF94mCz7>$c=zb+?JwF&)W!^$zatH$({2^ZJtlL%3E zWSj$@@<`>#)Up<@di~khwreRK{QQah!UyTC4c!7QTH%`M6nw}z@bg5$xpA3hQ9g;1 z6XnmZd>P2E!WVf___U^_{xCk}NzbTXsaH@f&*hvd=sTFLMluvf-402UeB|<)Wy0f4a-ug z0L+>tX9FK48+%%to>q@*A?O>Gxg7~HiJL^~H6}1g>u|WVBFNGTZ7Q-t^g0k=E+i($B+a zZ|=so{qTv{ynQh~^x%>F=Ide-g=XLNH&x1l-Unlx7am@mzdqyfy7WLD_log&F5k@a z{K}g=cV0F=aeejN-8!A!q`L#A0&B$5O~lB^OiR5}uJTU@2HZ3}u8DbZ=I}2IX6`|E z>J6~ebM;-^)qm}v`e-alB2#Oz|D!V$6KE4al7ZF^8CJBiA|w@6Pmw|emx&kjORZ#9 z3T*71*6aDp_Q3RY;Cvizu?)-%tHK>~+pm7{z4x?miu-~W#}u--Av}l^o-f5&e3mcV zQrW<>>fc{rPBN^()TsT{D^=OAp3JKX)MZA6rOVY<`oH z%HdYr2*Z#}p9_rT0u3k&@Kcc$P;&KobPbJ`-@`O^4*6tNXLAvLKC36sE^>Xf7rNUU zR^r?LuS0SDE04#Ye`J3gI=NJ6fnTU@p%MA`%q0tsF<$cXnf#sHlYV)8p{Hg%t*0y) zUknR+ft7_kD&}kZzT{S!qFzyZPauJr+opD+Ln<<| z$sChw`KBu{Ey{h@Cg*w+#%LTmufj0B7Hc*jFy}xA_+%Q<=tXC9C0_ZrkH>fX?8C9= z)t`yut%u@#>rk9Hy$DOH1V|XF$Cuf9QDFjH-2K8Xg{nbo6wj-pe5NMSA%BurKAgkD zuNKGa^>J!&$=-x{8U^RA4Wsz_?>HXc{VyJiO?Q4S_ILNi!NccbVF})-;NX+BLJg-y zzOKB*aFxG+x$wQRg})vz^k=t<-vfz}C#}$!#*_xaHI-dwNlx$EtwZQuP4AGKd4A5( z95RBIH9XJH-0y5&AR>T?4`h2HhA= zBmf7$irxny=G8)PZaqi%)H^voS&-}My%d5BECyPXM?9C$H)6CfQ?eY>7moP>t_M;0 z3Ik2tI-3cL&1L2=kI%@Yq%WDfo3`N@6BdeKUMa0a2fuS@@x*ityKR?+p~X4)P1Uv8 zWi*4eVugAa-v2l$iuO{e^nm`;V`RQ~QKd`1l)(q{O|2sBM|K z`>p3j{%&g{_Ee`pXB5k48*$>1cI?j^qfdGfie0i&JAj=xk7MqlkZ;#4ny!P6ehZvJOC+h2v3P zGF}kko!#@boiU=}SdGUI{O6ZP`$uSmQzc5IEOa{JlwQ`njs|bi(dB&c<(#9iq)Q2B zR7jejZ7`qnR~BmV-+pFy9RETmbxayR+&di)_D-f@)aGVh^j3*GH0Z{4wN}j5^aK&- z2_=WAw)fmR9}Q9`zjaSfp1Tbok+4LJ|5AbRm@bft?4M4OfK_HZyC-du;J0Jtc)2M9 z-0G6yco#0^H%7Y*hy3I0sR&*frzc!jvHf#Z-Y9RaI@te9>Q;3P@XF@}L=C@6bHuUa z{0`-ZqniMRQ9t`fRmjx3!E2AQTOj8>t}frVR9y1@{8{i|bGd413`% z3v$FKO2582W$<*KUb;Vfi7NkTV19W(;telUaK94O)HOFU{HF1gBe%o_hsmjgmHR}C z{EIh^7akyda_=9H%x^v8-qU+=Jf6#c{|b+wMvV2ZcXEfuHBkYV(%`i3P)P@{Ww&_x z<5(S!>*rQAaBHqV=KpBa%KM|rsaQPRj6Zq%RdMVQ4GOwh`)Ge5-nV=#{M*z6CRFxr z|NGh^)wSPo(~9q#zB*c@LVgXq0kb_djGMplWW3<@^U<2pAXHVG(k^E|ENAXqWfT}+QGo9Lti}0@ZWCT|I)PX4EA30MhWciG zqd{bJQx-`$N|y8%KKZ(O4kkNDzWHmdIo~nGJXEmNGhkh4Yq1_T=*lQW5))k5_-Bnce)2>-^aopFdC|nq z2W-BiIEa6}@MJ6uSE3Hl@{&P5lxF+xRu{YHB`dM_ z?sGA91;|o3UU`%GxE@!GdU#VplKcVmMOg6F_Wxr`gI0mYhCXQ*K20Q4juT^7sq%pK zv^6lE)}DR6;J$WVF=87l z#L9d76@7hI`surex969n((YkY?DorNn16#T;fELgNprxa%S>v|cs(xXg}PLN-1U)Jp_OIA8yTN>8bm{zZGwr{YK zM)3IXJobG-&(lc9tf*YO_3vexq?%hOdQ+>L>|>jkZLT-t_R5yHx;Ycq)}}M(GKI=q z()gfJFwd9xsuhYBtAUBz_-gxV`x3YEH@dA6%XW8h;u-*%i5m-~Le{*G4;JFd?tFY| tbTUr$yTp%@Qt7x=Pv=ddNM#i9{{g>qOu#x8AejIF002ovPDHLkV1gr5a0vha literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png new file mode 100644 index 0000000000000000000000000000000000000000..f68708a8a2ce949083700dba7a1ac5542712d007 GIT binary patch literal 7940 zcmW+*by$<%7av{HCEd*sDG>ze!RThA1Q`ty0tzDCg2dS99yw~HAl)M*hm@dzQerU_ z5d7`?`{Ta%ob#T~srNq5eV=nu%uGPE)ST1+0D#s&U&n&5?-ABNN@Bv(U-)Y*VIvB* z0BHf5=C}_D45^2vu_ge}`kLmi3mJi@3eblH0|0Cy|1BZ|3*qko0B^p5j;7T!r?16o zi<>$O8dL(mh$y)O0DRGdAbx(q%ZwcwGdfBhWkJCJE!J|9)b~Ub-x+tvw;6Z7hCYc1 zy-~R2^SUBya`X~TcmHs9rtfpr@UKYd*WbT?&(6+1jip81T!8Ksvm^0?{0GOY%>$Q5 z4P8&RkE$(qF}%6&N*@lqxL~rRY8bWM3io!vX~)(nr`CNRp?`RQYa?j9p0|4T>vQ_4 zvZ~DS(4%qW+V)PvsVafV8nhCP%soq-K02dpc&Vr`7;ICcsvdb+75-rtqY|k}{QYP} zYULL%n?3a4q#HfKUkJF(_weO%P|Y|@4Y1Hw&w^YzBzs;19fF1Q02r;O#N^Ky9}=x92{{k4YtuX&*IxxU|*5+eCo9+w0~YV7pqD1kxj;~ zg};9u2vJ4t3usIV{Vf`UeT5^E00OVSFA}t~2st*yJyyPU_9qyxx-pDqs`=*=C*$+_ z)hyAg;5%&&xYIlY38h_=$9*9gpRo3U4)Fcoa?`M{8D~!*>7PdPqo>z-zBbz#7OmJK zJMNT}macSjybZ^LO~YgyaQ))fjf3Vzioqd}E7!Rr$vyahPauI@KaPf5-dy_<5bo;K zl+Uj(@l&4~rq|hXwjE*jAwQ2W=VP_oEu8_?JO7b?lhBN&rl#RXyStck-D|$Kym7CW zvOAdbgv$8B_FMz5= zQLq$wZIDiQwKyxafLYY?j1??7ybBW_p$aTGm^Rn(XIX7?h}w&;JBbVrhaUaNC#V7u zGv!PU=JmRk!$9hw60=#q07BwFki?ALdEjw`rtz9o#?jpfLK0(`X8X2G%fx@OY`;RT zjY+M;|J_8^Dwi^brHfec5K2VpIN2I1H+b=eZ7$2~sG56Om>TsW_x4PwSG*G!vO_f! zFv(B5=GsE$m7Jk5Gg3(PBX8dBBEhy^g6O>-Bl}9@#wScDsg@P*o3`Q$&c~Url9T>fH_i~ncvh&nW<<;4F-YHVG z@2F6NPTgqLIF9K8&e#q)ANe+0IV;Mgd8<=Lgr$VcaS7VnJK4^Vw9z5M5!!gXZ4cKi z+#~M^dE$WE8e9%OKc{K6q3>l%baH89AQ&RP8v?J((>$u9ctY9QY4tAb+XqJF z{a~xEW!s|x&EyaWGU>o`>jCA~TZjg5C>6-%8TIcvtT)S3cT51I7N6b|!Q+5S(CkHk ztdzmw;L&y4C5ER)x!1qmJrp^!um^?-9Us^Kikt3{U0@Q9)zBsCdBX=15`=MBMP1{O zFHA~X+#`+CfCcG0BfKi>k`=j6-ltEKTCeIlhx_KzAxd$nw!L2uA$Sp{J3 zu?6uBRR&U%DWX5WR-L1A>3i<*tLiMZyQs??%jxjw+46{I;Iix=?-OZTl+!rp&nz*zbItB1B5}r z1{}4vy5H<%`2ryJ<)wS+B96K&M4!@)vL>-f{_KCI1-p!V4t@im{8ysM7?Dt>Ho^PgP{k0z06e_<5%ep@So7Jvlrq==;@7MNh_G8(3I+IlZ9q(u8UJ#>Db+S&C#@&57y*s72zXn}bb4sE(zIM&UVi z`i-aM3)QL`)Ku~KjA*kwA6++^6I?mocs9z(9jHGkMRJ`z=;Viu08jbT&`U~b^Ree| zSDHy?zM3m)8P|fj>lHg@K5!ZkcFQ4p^t@g~@25BhD{U&TrlwY&fU08jb;gHji`4Sk zmNJKg#!!`8ctDa+^OH;N+00l;r%&85ZB6c@=R}G+KQn>BuXSsa4A!03m13)LOpo)V z8uD5Vv12Gm_EK*<@`1khZ@JjVVN|sOo5YIcH<#Be^Psg{HY0sFI?phfKB9g%TO1!CA}?=v@`jtG=JUdz zP^Am~t;HzC&a;&R*XG&0<9@F3Pu%YqRSR}Y|Cu^9btW_a7OjXkjIr3gmobww4JD2< zX9(-);7rC{_>AcasG$uDERHbrlG1F&6Hfwcz_D zbIg7q0DY@a&g_Z$Czvem^^vMd+jU}+n(dG)vg2o5K7ct3Zq#}^YYf)Mzp(6TpsNly zMpF8gH?)shEiQF}I&x(jpx#=Q1}?W>WMuK2o3U@fR`@FQAFqHqV=xvUG&=78P&Br4 zIbrgkop0}xtKNAeZ!%5F3$;0;wx=Zv0de87h^OLCZ<`j73>JYpX%@SKh@Xd(1N zS)v>uUY7x%i`mALlX2RzHeoS$b3Oykeixbb@hc5jqQX0wn;4G`MN~b&x@RDGE+RG7 zRhWb9fK~6|hD1t+jxq5q@S4#Cg%bFCWzJ|PSld=VhdPhBhJC_&(vNV9m&eBKBDj_- zsER-|TfYJ@iwrK(q|(CJ3ZCFreJ?$|mbAy_@?4MH0C3J8()~7MA=}~Vh-(zAfP9*R zoDb$E&sPqA@&JL>N0@Ynct-Zr2z!p&Sqk(nYiv{1Kyw39n}wT|U@MPh1L7>?Q0?jw z{1C5C7L%{aZl{}ESf_v7L+Sq5@eYruZR~J@NkiUNz4Di|Jff?<0}OmuISHn=_U4Qu zRtA$gu9(Ld>Z~Pe8m*TRGq==Ip&%s%J}HS&N-gkCgwDeOw1TrlGzZ3NU5~M87!KvQ zkMTUtJg8AZ;rm6PaX#qzo8*%zQyD3DIPvXAx0Y-S<$5Ts5^vf>^w};=4Z{rbejsBT z#-@kd5?v%jEHPd`@?njmR-8OfD$FG1)<|L)uq3@^rNI>}YDA;@&?3axGk#vc7b5jZ zJ?iAjBG4V@vS3Sr)P&8-Q_2=O)bdhUZj~EYNwU<&hEvc-a=fa5_^Zh-0#i%7v*^_r zF0?4sP&tL=IjojL5f#yH)Z{9r5}7S3kOfjDk(v}l$a2dNcU=G8j;iD3(-`g?1rB%m z*8F?l9icaUt1`Dgo7`4Xy4O=>%c`1%2Q#u$gjwtjU%KbX;_kMk#&j9Sy!ax#NjFPi z)Ozu`MrX}$Ipw};S)DgD(*~p*OfOp8$Sp1eZ!1AxOTAd(Ard`%{PdC&)1AYT&CAkWXmc#0-h}a72NT~B=(u?%CMRp&)YvWz0QZnn3`9CdY5HW4^M}i z9gP{)6`aCF7Gln(^k{)mwqc{t?{?hO zE|sS;f29p$*~H*JfmAYLw(#cz!b6_|1nO!u8{KT5v5VBUuw>}hj9N}fb{TI#mhY3U z-BK>n2sH2du)|AXt3`ffcKhHZm!W5$)o0ow%R8akCUXpn-(X-Lv_gXNYc!M1kB&a} z2!7QuP^)A|y@;!#Rxjh5R_}~nuSho@oS@VM)G{kw6m{9kGt_J zCT=MBk!8&KzvhoUf}9#yrdjTzlZ3cz1ZLbQp*?u;^k|RttMrrPRQ*-$_}6R@5%LW7=FDN!S#2Y|HHodWoXBTX zM$Y`q2Iw%vwPijuiu{-%>)T(z)SK@)JezJD%@b)S%pSNGdV z&JQGQuTKJ$c6z_{FNF?x^m+NonwQKJ6)8p*-Qs|Z1Z}4Hhbjpe^=Uo*t>VT!n$Pep z4~r+>^~zl-;hYa(CRdnZxLcGesG>*?84S8W;E7<9m0trg$kZQBuAgo^8OR-{zqmYZ z4hf4@WN%ae(PgZp0ZH)-mZpMI4W~5oJhDpYMQ^KC7A{h1I62^J#u9#HE#kC&@9NvY zsy(gv6gX|61bRR{V*fi`?0CY>eQv6|N~|Z#Sn?@fJ4gAazu}`*)|9l2&pB({Y1}w>^smkc_W(bRTTEsl$G1&5TtQO> zv<&iJoK|0layMzlM32uydpOR>A&kdIoDSSq*KXaJ=nhAFXsY|W%rUa%EWK=hW(w2 zaiJFIO*FmtrzI{>Bi-xT%fyn14k>?7O^oV)Ah=ezrE8P7+i=$Za;kh)JQI64eP>`Y zN%nURkOV^3rAY)V&`1L#oc;~3UDnfakygdJVi6xbk?*4(~ z3mlJiXqI(7HB+8|Ury_5_BV`bn4R#xwYoS&Z)|#bkf_IBHJXSH2LRXch^{zFlX5la znOD)W-_FeD!$zCb*&+lnG@RTanbE!n)VXw=`;t>cN~p9Ab#N+BW!(J(Tp0h$Ekcl@ z9KE&!{no5+UBk5Oh0a!EWZ^2}2G9R)*QnbS z0{ba~alWG!#67*#O6^@#wBn!@v2lj8Z0-2=`bsy{8zY<01&~~-8=)@HgAzSRW%%vQ z*N9p__kM-4SyuI2jHZ?tHzsxJuyL@PN`(6t=Nn1%KV*niM-2W0i3UoT9I zD~*)SU9n_Kt7RiR|n|w^MO?Eo9kIbo}8= zC|SVxy^x2tG6Yn53y=nctXnFWXI7ezlCu`Ialw!(_HrS$rYE9vrX`3Z{6V4?!H2K!x zFGjEgS(3VC=3!nPv%+*>I}Ij~0>VYl2k%h7(`M*j;vFD)v)6-vCGTC93BH*~P?rCK zq*-Zpb?hxc=LU`mw3k@1ibL{cDt;kf%wjo<5syPaTH;dpyO4`Ak*3M<-6?No(k~0f zRGU^$yYx^I;Gx`391|6{mRg5{22NL&1eeqC)XSu#(Yvk?kkdY&ezpgJR8k`^iHA+9 z!bN?otk<4Bf=KmQa9}l_E>uvhol1{M8Z|nIb0ulWv}O}x&<*n}kGF_(13h`_On@q9 z1BL7i-taU;S=q1I<%CrGHDIAC_kTNZOz0V$`EFHI-;?wrf&cWX`vAru3Q!7Ol;Xpv z4o^VtG82*c$LwU6%3M*RmXx^%@SG$m=1e(IZileh(;N{nqxc3IHJC#?qIbv?bR{+A zz2vDA=`d7#8Nb`Yq{txvt=+V-8J`pCV%RE%AKKz9Jkrogfa zpDJCFsvD^(D7g8M258Q2UwR@!+S`$x5KCLKSU2-o{Jc^m$?o9)_#)R=x^Bi-AsBRf z2wP}+cBLcEqT+2g+EWO2go*8Fd+HE>5-YB!Z`EmKPh*^^7+H}8vxZD4`D2YBAV(f3zZpT;7A4&jzQs%>#!yaSZ6ckEqI=* zc+3~D3KcBVhAik|+o!49{p>z?tJ1f8EfL_-!fmM}ybf%wk`PgbC4A|#6sWbg2#WiV26scKRwWhhM%(*Xn%jTN9Mlxz z3mM{#QdoSAMseLbw6O^_$e+Tb@}?(EcgP$h#%oVfqsG8&IU(qM#$T|6Ar*c5VhbA_ zIk);B8ZOPI5KX2^cqEKWZKuTdxIJmA$t|HLc?(-FQV^AsuXUBb2ZEEVA)WC zv)-;tu1&z6iAn{4!WZM!VYy}E3fRoyM#V(y`83V_aOkHJbr`Ez%ZCmgEOone=lT^E zD+vzUW>zYGaJc(7{{2vck=`A0E2}P%9T8wihcUsJ&*12VhSxGD<7*>inZ{2le#G#gL5^*+ub*5bBPykWg0l1NWaA~=MbL{TJ}IP}x2K9KNjpK{jj2d&f~ zDuJ!Y5Xmx7cYFtnZa;37Nq%9X!NuL!8fU0lq^(Wb(Pi_?@y`I(;{T!4EPaf{ctAJq;0fHLV%da+49^= zPg9n8nYRMhh9G94m?p750*NAZ#I6BorybGb_Y}_^k}HRQEvIZ_5-%Eds~)+jtfndD z)|5i_#NjL7v_~<-)gS>}Aiy}^J*8g~4A_v64Gj?~U>w6=F>pZ0UVK@9#hM-CNgcpT ztH4i<`0V4$tgTP})RGHh^l9cYGMUg{sSQjPR$-OlnD2CuJEqOr^e2AmN4h1-P)quW z?4#HVn>HHhxLR%Mjgcf0g?{KFxyO#UzvTe^U8s%6<77(lh~%mCdT-Q5=9iAI-xwWm zO#(Isug~ArCYiO*jg6kj$GkLG|;f7euh6{&FMzuX`YS5fe8o|`HpSxJP%mWP`EWVkd+X>}BK<0|(r}w?tSRF8$|}jo({G}{ zASuYgiwN|grZr-^`3+uqVl8fH0Pxs>m;XRBqmAP05FW$76vypBj~Q^84KfJ8^G~d$ zU`<=K2nC7aj5`+TT@m8;cnJN_--9+`hri^w{RyMeC;R8t@mLzWOv4gc+_W@dkeM(9 zLrfn%)lp;qUbJ$Ud^xcH`5mM@?&Iw{d(kFgI#Fr!HxvIwks1vRwjb6vF`Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L|D{PpK~#8N-AEHi%?#yZ>RE%VSan9~MGjr#bb5Fl_?#v`+P5J$r9WB(7(E*1E zOIK=EO{OeiRjbyHzSL)=%7Su&6OPGGu zP!*LW<2I09E__-fv=z%$dM#VoYmjI((`tKjE7XTUxzSoGkGN2eCKoy_pidBL zA2;W;)S?3N2k6>Q8F>0Eu5w17!sTu^>>fN<8V5hm!QB*odK!!TUP zm$xfD&RB8&xI&?L2)D}MEio(@7!y4cR{A*ziH{jXpk!ju zd61OA4`sWAGb&0^(agoPA`=1C9Jh@ zw-j9CID8=NjRvQvZ7mVfP*g^Lu?$?gpwm8Z&SK@IcBSk3T|0V&6QfrB(WEGdjKt&3 z6j6_8%De-S4qjO`d!2yGksBUWhq)CV*p>MD3lX4>clu~H;(I~}zz5zwro{3dJHeP( z0AOCq6-+@I0w;m!OP?j7o8&mSH%u1AG>u)8trDyiK~RnnFvLxzr>&{D#=F&Bf3A%r z7rXE=Y4ocGH&7Dv#^MIae%XdoC)5@xS|h@mAot-8bgX#1!u<{-D9tahv5iD7w=a|1@G%a5F#zf5_S3*RHZS%ZlqtJ z0Jnn0`2{zuAfbwnMMPaf3oK#E$9Ies0%1`a2pflyOwgdjew{R3hdCVk%ptT!02ETW zH&$6h2#f3%R@a8J3$UY(2el^Lg3D_u5922H09;mE-iGpdy%LIXE6r~d{`kZ}+_r#p zx7upIt#pso7uKnN3G1#qTVe7-Y`NznD7{4WskJfwu|%%J2P;Xy$F}d?d5T z`^L#&Zk~3TpbT+YrE}g|zT0xuUgb?&Db;MHL>r|nQ{8KAmHYkJLG^llk)cahf->#N zoomBP;Akw^K6bY?7oQGFB4tgww+rKSl*RkUvG`Fz2DEk7r|s`AJyofJHv!ZyA^Mxk zW(Qg+qNu4XN{4ZU3$EzOgaVGF=6hZAdrZg35ef|{36;sO%c@?rNiKdF;5<=V+6kA8 zA`oOQv<+{#4zFB}mCiZ54E;EI98)a~XI&E=|3X0HC=hgp`XJ#mXBvz%;b4hU=#(xa z%t0IwIDY9U%A}5Pom(Xu@N=am2B9(u1P7*z9ZbE~q}-HcGGQ=%nlezcKn!-yDW`*! zu&wm44n!O&DlIYQ1E>CsJO}M3MlD_7#WE`)cT4igftWmdzt-jK&v>n!5*kEntd*yi|(?nCEXB7kGRM#(I zYUW%UO)nA}HR~w;%o-~jz0U|gWCbaoi4|o~AaD*mlS(3V;`b+Be40&Z$SWOrz=(=+ zt~3ez`jcC2^T05j6+IEuAO|Uz2Vs`V+V1SjZJ2SZ^DrfYI!`!Fv&PaEMj`fN z)=_vwf}${6H1!BTZ4hnHzYuO>c;xM~3c;m}DG7Z?>29m9ty7CKrs}KDXwxr66!4gE z(P<7Xgsbb05P9bra}}=EJ13leQc%CBJ?-orE~CmS6Xq1+aVK&D^rTO>Vw(G>@JiRc zuT}NG-TE@iy*)P`;u*qDwBsW8OBgaZFJ-{?rq8reda~mc@D?7z3m(BMcn0s>V2PKG zGrT=YaCtl$h{IG+gn*pfi5?=OI@KSBHZBshFJWyfD12q+Q8;(!R@zW%j>^yv1S;fzwg3aY-*_Qa zfoDp}_>86IscjZEKsS1;x(U^U$4F)-1)QFK3&uS-7Fx5}h zP#BEk?(F$ClAY(YZ7tqo+3ISQQyZ$o{jTz&Jm7@@!XuP|^jb0}T+EhrHrgwe%+OUR zM8<#@bq3>_u!d})JDhSOJpqUcxMc(F!X?@kP+n<6IeBj3>ReX4zJVV^qs;LJwLvQd zZXJpD&I4~ZOz6QQcm>bkgVRd91U-0rv~bit^KlH}jSxUM%Gwa1L`8l|-hz9DA#_tC zSX|-AfF5g3$FSB25__Lg*YV(@xmIavvA$CkuZuBE8&D^L769v0wzlGf5~AI@8VEq$ z5RjYVlL`+gJqp#L?$v|~VJTj$MPsD)qCBNwG_k;Xa_6f&N-bf=uqY3I@i>=yOG+c; zOKD6srFfUs71xOB3G2z8C#Ecx1(h00fz#Sz!960Ve}sK_ZWu|dKv`eOqIPTPsL$>V zPzsJ&Aw;i(*C86AUzxJvYJm-8PP0LU8Qc%#wgdMHVVHX#3aC>~PH3z>-jL2r^eO|( z7JG;^vT&A_ni?HB7Z4qh*TXKICu^fNdF*-#)E(ARdc>N`kIVDjZc|6Dmq8eF2D)*G z!Yo%X)q$6-YHZt7T<`h0Hk4jyJ$2`Z&=MwjRB#Wo#1bV5v>Ok?LuwH!tV5cl@U_0U zLCB@7FT2u;$t6~mQhJ-pN4-aaN&<^Z{HbclPuPvRc^#ruIpcIo#KI5(f(gSz7*B~1 zk^%}sWZb|2Zwrsetn5TD%7a%Q#xu%OcF5Z|R-REkYDM+at{ce+WP6d;25fRmZ(r&@RZeA}IWh2JY=s++;Mk0C`!XNrzv0{gibS4$~;nLFF6QbIaNrv{fT zmC+HiDn7^Rc@Z=eCM?^lDcsstTRC zk&AY~i|{%tMmLt8*17Odn_Nd&*)v&0xSYWYBdgNBID+tYvDVNB#nK7R zp}N$4k2GY)Y<=IJfV+OkBg&5RT$$ya*ZMUKAx6x@bkUQ1_0?xQ0t<^U5Pt1wOc2jq z9A8kcWtHkm8-%0UR|>|Xs-c)qbcsjM5T3z1c<8)TJ}7y#aMTLvOwO&4cbEciM0KGd zVF7I)l&8;9TG~S#nqj&-p6qbut2~y)Z;428dzLSzqzfW2yl}dWH7e{)F*$^&`CYK! z89a;&6De4JiX^2uurt2J;@%PA62TxK!XyM-P!Wov@^HVcy?lq-Puf^wvF*u)i5|+( zCSiyZU-)|HraDqGM6|(egZ9$TtWH8zOGAruq}Uo$s80ywk$}E3_P`6cQmI{vwG{8S zY@$ajW&9iURrJZ!cFTaQ@}Yqn8}*ldEitrctoRPA_*5TWr`Qm!+{T+y+oM^$?%-Yr?C{C6MO+8h}Z}Y6#_q; zj!N=~DfYZdV|bBDbjz!&pM-hNSNgHnT1$6%i@x3!IzT7op}#20@doa@LYKDEy`o{a z%aRaP1cp)2@JKv@SFt=nPmcl_#v#W?2}ga~0|M{OU*Z;2XD+OG7LI{Zy49M>kBXQQ z6A_VVVXg!PagkDI2)z`dE|_B@^EIv!3lJ)1@*qYv(_nR*w~C*X4I{&pOmIclgRsi# zN?05jh@u?QMvAH-Z4vk_2sV{>?7&G|MV`67)Te|&8%xjB_^Vx{Y_z)SCa*uv%NQ)F zdhrxAMX<%XPb_^yWs5|p!7Aw~HkzKU9K%*82C^8P^6)X<$ATGvV-iC`e48XGp=&Iy zQ5%EuhW(bW?y{!JIz<8ZxDjw`O-LB!2g1?*=Yc#r65ieUi&b&irVam4WADx4ncCE~ zeRV`NIL`cqzIr&TBO)C9+w#s9d&9{yRVAThgtyXB5$GREhPqIm?%{&{c*72*gzywT zhFNb3HPMFh5ZPoZ{YvS#Ty2{*6*gL1`EEt8Tvu)5^dd5Hw6zayJZIpI?0?&%Cc}ql zGcj3LTO-^C9M4>3x7BOh-9C1Y^C}dN@ez)G{4DU3kh)m8lbil}XmH5^+jN%2Ha!Q-=e`Q3?`cHK?&~Z~8)= z)U2+&-b2#hHKO~JYKI#-CV;_gHIbGwv{}Ldg z^`RfX60I=&E-jo-=77>^@n+lV-a%xKygCIx39P~~$ z5`jdx^+$-~3{x$HzBB*lCpPQL-@ri%F+!-a&HVDWZT6S1x75Ih@+)*zTkfd{pLCsi z5KtyDq#E9~uVIw{9Z4C1fIm2fV6Uup*ykovk$+LvmC;ANYFeZeSsz|6( z!Qp}M&>0_{xfN9(9Vcx^g7Ko!0mF$zZ6rF6FCH4e)%z&}$Eu}^7EG}P?KwZko*ogZ z8MtPDaMsd*v&)K%CrS>l)FbE;D<;PtCMskOmi1Q)9+j~{bJ2dBX2R8ZbF83xTs}lg zA9IT~kTo%T%Kv#b{9v0##qhecl&|2V@e?q@waHTi^ zC`Z4T*uj{7@v4?X_zorn~$NSN_`hWP|9~r!dP6N@&&v8^Z9Q_>CCV`w(Sf#kS z#{~xlC7DPNq-s6ZT7J;I0-Xwja}gRO!~kU%BFeA+L3TRN_$Zvg97172M37}LFO(T` zkd7QF{PIDx>hNnG4h2RNPL@;8!omtKf=w3!_khAv^){8Cw${QOp5>VCQwkWn^`{s3 z{XNQherNDLWjGZ0f^PLC(AudqUJkk*8G^P&Sr^blnxLQ*t=(c4GI+^|wlcrH?yKm)bFp1B7$!0D|1hRK~@EsWFHX)Zh& zmce<^1l}Aw1ck?e;3<8kS@mL;LZiRn<}STdvT36?S^Man)?9i_!u*hg`DaS|uI0*u z-Vnr{I9@`n0Lqs^0PCaUVoLQosI!dibPbD9Rm8eamAn`KCz)xIs}k|TL?@TAT-=u=EtvBU^uEPFUfm) z5CGB$Q(4RlB-H`5DpF`~1COcVysPC%K$)5>Hp=C%{1DFI2o$C0$9kV~Qt@8PsSeuN zBc&{*COKYV5dSR59@B~Z)E|{0eD+%jM}nyQzLxeK9Vy%dVnIA*O0zBNn&jsdk38UI zB&3G{W`YAbt9J4HX}))U34d^-UsdrCBj$?_lm<=d>vQ9Qjtx8-09S$EAT|ggibWIBaG#A5-IFCtd#Figf)Y(6vxl$}To*VY z|VG!5%iH=H#n^@skAuc!J9fSw>&%z23^(`Xg;Q(w|FU#0we8y32vWzb! z#W~jdl*|HmjoodHu9P|3oqL(5GclC*CtD5=(7_Fj@Ie6}3vD3O@zeW92Ivzkd!T;U zADKETrM8(FxOl--m8c2lND&$LJq!9)tHo$s4^5yGV{rKd?j^YKWBkN8l@&tKI8uEh zJv_qqs|9H6v_>XGZu;)Lfd3>MBS07GN|m`wfF7ZofkQ_HK0zTt1T{YvfIOZr5LU-( z0L$tN$aURsQwR`DZdk`lzR2S@d=YXq$`ud6k~ z2^>e^Jx*H}T56PHX`hjC;Py#NVS}|6HKtTMquGW2lmvtE@kQk@P0AO>0)*An5Ij9& zur`J8Zdej{bjmO`iwJQTpk7ycKxIUfa4d*XJ}d}d@bIy=(^5O(=!PTY*biL!Cu}e; zn@ii-(|Nv)L=j~y< zp_Jd+NGRHJwuW&XJS86!I)Q@0NkGG62KYeKC}pHR;z#z+LCpsTIz)q5Muf|k7}1fe zyi!}Ugi>}8%PEVCHLhSKr2sGu=0haE!zXXzf(fOdiPX&j0YSiBQPnwxnFu_}i69<3 zV7aS4zHF|nwYH+hlp4^ErWg3i7c3gj%fZy}3?+(*fC*pc_OBKYcJLTi>VrV6d~6Qn z)y5f$a?Z@j)|lZwbKs@h5sXn_#1SBHkmzAqXPdoz@eCJimKs8{gTiwm=+6?|5UV|m zcQRG8VGT>bnLduD7K$eH(@nk8F<_>iyRt?ycpTukQNRc7Vl=LwP-V2e!}h%7Jlp(+ zD{RNhFSBj0xyVL4THQOk05hp0+{%gRHt@+E$hiF9-gCNa)r<}W9~4`WsLN8`*y z5mDgGvlyct5h5#&*JUilN*NY+x0P>`KqhS{yV!d3=Smq-KrvQfmK%a-JoJ2k{RDji z>=XXT8%Ft9%pZr787a<*Q(Amx6dDIn5l>*&vjEEQd}>+Ri&yb?t|~e@T=a4WT^N#T*^yQ*~CDH!Fk>Qnp+c=GHD1_h3lCVfAsSgFM)Af8QZ4G6@T;gtx&9vt_9tv>^ce{=eq;!Y7Pl=ZpPA#@Q z`SXOIPiv{Ww48M%e!fGjhz{P@VD)3=Jh5|ezUG%Wb9M8@^Z z8IwgDX2qfB!Fd$7f28eL!7-CY9_@Q=j~5(2g>+@%Ney+qsl)1|gmnceVL2_OVxN%$ z3V}4sl7vPjV|5zK=SwNeN*SH-mUrdi*k1vuPw1P{;_H4pN83sAj=tyu zL&tRqBV;9fdp1iG;VBb16>XH`p@2*0wA$G-+a(+&wHxYUi`)NYf)9y~;k~xU3yzyY z^5k@tb*ynX!0^yQgQCic?WSoKoYNkb}c zA3ATbojhf7lq&$W#qIvm00Vn0@3lQnaQq}kx`7}w*Oq?fX=^SetWlv~R*KXhrE1Yu zHzo#eUauVCi3-BmyatT2>hR!ikXLp*B&^~-UNEjwJkj>&lux(?{Py8+Ji%{WNwtply|%{-j+;Wd zq9}aB%2vDgSm}}b{M|2kg{F)jtIs@RBR{>#k|iE1Qm56~Y(-;8DPS)2-Dghu#zSt} z9BW#3jzU!_W<{QsvF6?(I2YPThIOw*u{^)_Ty)9>N6JT}5)wkK&LHi5<&gv^TOQCE zaTyQlGEL6J(y<$aqXmT71zNZTu?BDOfi5y`LZ0g=2k+n+_ljK8Mn9Q)>14T^fNM4N zjfcu9z4h`{-)^f)MiCazdAPT_u{q6^W{7gKniq|I$<@Mwbe_=CpYzT+Vv8j0{a zC`8x&a6+C#=AQs@y|j<#=DoJra-VQbTPe|^Exgw@SLw0#^8G3xKC3+pF%yPrIrQ&1 z!E+(I2L*p@MIB(Z4jyKB%O>}Xbwws-Qa13|T~;j&MPo#~Aa9JTSwkUA*buivut_Ig zU{jX9NFi#*npBSRx!!K;zwgK5KF=bA8}2ZhP!X0q7q>l*1c+o1D6A)fC?O|N%nEB= zf5jl7bFuN;46LM*IweKzNNB?vVbNZhVr&UzGg8u7tu0Z?kzrgoUFr4-s(%)MHsvBw zOuw%uL(8oB%IO{AZhTzUkDN(W+tK@^3wBx?oh zEL~@9g*&Xh^pK*S2W|4$T{fj~gGg5ppTi5P!%h1zggKsY+-eVxGpTwAAo}Dq9;_3g z>%^$63@5e*=CJph&egQl6%?*YesU$=&6>8h6VJ2u&J$eFv&E{cmY6pv`4???V`b90uV!zHl(1`?)kGyx;*IMRex19^pMT zcu2gZ=p;|Z?T)k*#66^-HFspOfTyTh@R(7eAQpIk4Tw`G0O$Jk;}bgS?cFP8TYDzw zf{sCkei@XMvM6bkJFekyO2)OrT|XEwbM8?bMnj!p@kjh#+q%kX?*q5lJeTCojR$Q+ z&f|E&aZ^ZG&hS^1^7Ep&h9c%g2sZ4KuV;;}V?j~Yx@wqxowxi7n?8A=)s+;>7c$ns zET%l;wgBP3+`B(f6sCss_({T7L*f@(P4zt=wx zj%QTY{y@YK#?Z`d_|1RuGk&kFKLEgO4k7RNqCs7GI7dm37aTu@6yiP}5U^s0aHLLS z$gH-!1faftQXmx8Qypcc3(8k7Ynf&5H~+%~PkCU#ReIEp6jKP&rJoW_}+LHdroID_ksdN7ZWLXhTxn@h+>RcWO zTZM`XWLiJ$$0wZFBBccQjTJsz3uyh#qhs zq6xeO$>RtCtK$R}ycm{9tq8l8h(z)fqq)n3&((-yt z?i2@l?TIztwPF#^7!xD1q9Q8wvp67DL6qB{#5mp%;WCt747XiC!gnk}u>Pxt{`~3s ztxDMYZ1ULczU8aE&WZl)3b*(O7mDbc!EaR z;Eg9!f>Dp(YwMq0mkjzXFQ3WRPQxaG*7$M4;{nG_A$`qbq(4l&5Z;vrd*u1d8jERb zOw`+@^WJ3hn@$oE;T{#MdGh7F<+)x;*xud^_RzYUtW+uxO?W;S;xmUj7G=eBS=0)u zAVx_TAU2`M@di90A2{XBZ*4_gl{5Wg&_B$`C8jI|aXvbx$<(RPa;qj1$^ zqYNQR0nH+zmjYloiDc?i`KXp>2eA@P+~Z|YIFfv!hBn&5`#AUHE_q`FuWq@ZtIa;R zd~Q%EI2l=lSb5lDrS#1)-KUswUchmn{pkEq5WdbF<^sTpU+UzKArGS-| zB#?Z^3yzyYVjWSC&@p;dw!1cb$HsG)t4$Ik&g3~78ap*w%BQj*qK zU29F1$6fG3coWEqO+shXC*MK_C`Jq6Jp=LN_o-$+8ov(3N2A zK(MQ0Rqdi%Zygo6+U!Sr+J>-7pk2glQC!{-D@P`Z!hYltwtXNW;KPgDb- zWJ;An@R-{PZ4IG);o^Q!d;aK)dvGa1Oj%bO`Y3}!eLh1RE1>pV_XtYuk;=6x`J7!c zsomZ-XPW)h35)E%mM^pKoPLU3cgAwNe)%c()l*m4UoM(&@0d2#&T4H^84ZgNN*{he zfs&8Ioxkei@q(j%QSuQ%oxxG@l4`f+ZmS;}WLTgAj zT4#2$dpBlbZ`t%eQEbnf%7iFN=>!s)Mc|11#|?PIro#6+)Fc8zNF5Z*Y$&_XdNSvE zdPC)D>lnLJIB}h;64oT+S)mU4$&3wVPS!!inhTG5x?l5}4g;aG2o9cmTnG;U(#J9j zv`>rnZT>CHnj(_k>{-GmZ`s6%HJ8_N2Unhw2{w8nfhSy*ke@fB**Y4+I5;+M`=J9w ziU^DgD0|U}9ar}gTpfq=P%f=QZgHSuw9X2r-m!#j8X5@-j zg`Dc|$mZ;Xx(2(TrNgf7m~1np!~>O*?N)>a?}JU2(9%r!Id*WuB444#jA5>)|&>`+U)#XYfII6xJgLcm7XfWVG>8SQ0Mmy+%61JMy#dS0>(nwr_;56 zj>vInK&ga&R=BVd$Xl0z;6c`&?77a&hVn*hDc$Ph78%jt0hKeUf*v7Az`Lac#mp4p zZweVvNIcZDz}}4y2H?fqr z^k)p!`U!10+t^>W?y<6zQ64sp_Y@sfVR#KEe3v|kEVSaIJ?^FIER#xGdp2t?pE||f zw_v8dVp^vyZ*8?{QnH*JzCXsNGCrB3c9~V?Bf;Q711_V&EudMmoUYHxXYI0;Jx$?qfOIS2a5FeR83xqlHf?dt(~HAcl65{>qn zNw2fc+!Uf3OJFj^IKn={!++TPkIp=l5wYZ{kwCZ*>rZ6(@dEdV!o|ZM5pFOu-`~4R z`@9snW9(<)x?3O6L*V3Dc`bu-^=8kL0xuM?3)Wg%B@ek)N~#{HJ}1jDz`>N!85*S% z`Vm(5XHM6NJc6z=PGU7mbL|=NM#?A2hDWJXcm|b8v#hrFoiokmO@ivsz;_WSZCttb zDP63LO7QcEyqTzs)WtDd+<#XJpl^i4*aPJ`Lwm_EcB9?PzYW z?ahs5p&!8y9>hrdJ5@&|Ga|p5G5T zju6I-ahSq`tP7-I=QzXpSWQRy4i^>}4e&X-RGA4A1fMSSg*=oH~ID`~`#Ht;67!4;fx|-qD8WL2-V^^Kh zXcy0Ea^>3xhfzi#643GVsO-Lc7^{70tbXxx;lKxbnCVPQkxEj6uRp!VezLRQs+F?e zN@7Kk)3q#R^Mx3csn~*+oV|WVhb?K&YeW!2Y;N|4FBvm+q`s;RW{<(0i6p*|w!69B z?w>u?Zdo+b)^#@9wzd|ld+ce;KC#YugN*rXYf1ItC}g}Qw>H>IzIV5E_YEm}>-Dyt z6F`oCDGC`06a-3Dh#3L{AWlKYcpsjn$ZBl!w$?XT7h#>4?yGN<=fivcGFU+68?Q?O zhNb7sZ{!|#P}>rKLEg=pQJAXMbCtE$S-4w$kzfdX85NdR_%QZib!~Uu`R<*d^5o(j z?oF9dd9_T4reAqOt}$**>XkNq>MnEw$C#PCfLq6omhtn9i~g%K)F)tOm&S(asKI% zZreOG=JEsOO8VpNb@07CpRiXl%*|hT)Y6wy$r;3coak z)aJ9F@@!Zp6p6-t`Bv0A#OJU+m9uv@yvb%Hru)rUX0-mO=Wo5!5D4ZYG>*9HLcpH0 zkl_&E!l9PAwb7klsdL_Fu)(?tKXah~pMW1-kuQ?sB5b@=nfJJ2O(sbh>ngIk%Ey}x zFffF(%y#+b-VX!b-)9LvhK&H>b_L^D0*dD$TEWOA6FFB>3VyS->pFdD8rqI)cW@%~VrG2SCwemtR@`ztAY7M4;tY#WA}QJ&9gR*N=PN!mX= z)n}Urhn1%GF~=%<`Lt%cY-+PL$g`8r?;+BR>H$(^<&`&O0+EpQx|8SFjmu872WPa4 z{?vo9GP~-oC#>|9Z`+f*dR%$A857n<@9U5ASeWquvlkM+I0ZuM@nw?73coCc1SSeq z%m`O7A;1+6Ll|s}Pz{#1e`x$8S6ImN?!mthFA*ydncTwI!(f#9xgy5lK<(fe83)pj zhT?kbCVIdquhv~f|cI9KM z?ag;TWl!wtwoh%@VuNK2Yj`U_8IR4|A$0DltI*eP6X_bp)C~iDMh>4V8GNo3GFT5R z+CIUeQo^=iQ4kEe6<+?NCcP8kp<^sD6CZ?lG|yNwVPDGsrH)8X+uO!I;&o#+`Cw={ zS(Ng!>O)rS2;SwnfI_;JTru&UjI!vdm;l5wl!V088}o*hen5 zc?+|4;wP#RDr8GP=d*~*5 zCH-+ZNr<}a0xn~WZ^S5jT_}$7`peOzj2MyIcZ}J+-NW|Y`R$hH?Pvhc$@*B)O||Nj z{3vapE@l6{;zYal^d&Z!<8_m|sJd2c-fdSs@|3;&k&P--vs-)n?UP%#2fVb!5Fh&< zrJHc=KseO3m>-8L8w0Y%tsnRRJuxyzt&r{|;$smT&&TSAiblddgD3CdfvOtxkSDSP zZe5h-p{$Td6?=VI$|=tA=oL!K`bX}oQ5LH|(b^sl*jE2WwOVi4 z+GA42d;D=7nB;wNBjepsx^NdhTkC(@O-p<6PJg|J8>Yj+kr);;_CRoj)1K0C4$lj1 zQ8cb=Lm54G*+@ zk<{K$UB=dSwz#omGU%>(OaSFg*Y@8Qnv6`i5P0#`@iM`o`U;jrt8A z)tZ#BR^y4CG3Pm+nwNypP8>C*t0f6+%0|WO9C_#?-b*q;U4aRKj^9}}*Z$$svuq^8 zdz`pbvzI@%)~Wa=>Ftq8qe=?h6HO`x&J%j}# zoqsF&ac34|wAa|5x%FT|-U%e3*YH~2QkG91c%L~qKCq?nx9Ek<9Ql&)RcrK1P5ON= z`T^c>n0^bFP0eqWl~!03eWW&K%%R|j42xi5JscfaFN~ypSH5@?UhG-h!aglUL`CTX z%9xgSBps#AM#puDtmk{hvIaYCYA}58ls*$mVi;YhBfQfxP)t;LxTn7|G*S+*+}>Pg zJKGxV@u>~AuCvqDbhX*mmO8ui$*s0x<1V}KiLKT$I_7l5B_}F;Q&e~>MD*Jc;HLV5 ze9>mYcF9mw^Yzv_FrXGBb80HBw(p%a#jbhj1%A6i2w2l_!QSw|YP zmY5?Ebxr5C1tDpQ!8)N1S5QL4TOkJ1$#_ka6hafG%&kqe->JUbPD{*n`NlKusr1{A z)2r;d#9cOE1<%Ku=fWgUP>SOTTN>Zu#GO6zRqchph!uxuF%co7kAsEFriR~iMVLME zdAEAd`*3h5#vzOV*W+U#K8n*&H^6671#xR8E|&JuX)v3zzrW~AJ5640X5X+v z)1`Ln!l~Zh>3yU2yLUcf7p~o4^@XB41izi4Dz`T^+sEckwXy%YS$K(mGO8Gt@tOKa zIZ?_Oc+XA@q#lZ22g0+?hujddtCKZ(u4JZSLz4faR!9#~MSPSy5Hctl3_y5UE>5uN zPi8AGo%V8K5}}Xhmmn;#DfW-WcPconS5a)X*eEry zhoH~0<3|gdo8F?|s?8bt3O?QyjJ9Dk{lSwHvN4mX6e;98)OY0{{-T&EVG?Z)2M6MR zsQf4r5a%bKZwFCG(#X#-K9O^-6Q&Zb;vIdxsM0g?jGk7_T2nq_zjId3IvW|!1)jPQ zl4qPaGyn(CNGpveY{JBjUlDO6;LO@0V-kAOL*yjE)(J*|r+-+wS1T86xISk$FPUNY z&FS=df9q#!ZSjt7R}}Z~D11amKI{vw)pE%O@_GA@b56BumoIUg)P()P&G*_{?t97= zheZT13Vw0RWL@WEd(TVHvgsfDilv7}yhw?tPI!g>Pzqdw_h&;=<8pWYj*(7VW4r{a9(~r3Vh_gPPRO?>P@q+&B za^YIF=JLZdDPs{@4k^ihR|QFD(@u@XNxr{;9k4< z$<4NON1xrbV4D5oi%(WPS$WTX$pJGEf(V^>+9xNEx$>DUwqnb6yYZxjT(Fm}-E32P zM=V*C1Bm1cWxU~(#rD28TxPTX59A};8V(YA)$-{lx0p%Y5Tv*gJ39lML7_h;|P4-nm*2! z#|u^uYtK$U!p&dA#IdgNh2-t^Z*$^KANia!%*U6<0I_F`!D%reEmlUn9T3_KdE#q$ zM*s8sjhqK%bdRYqSz{(`zq?XlY9k&=v=!Ychp_q$Z~@VPPd*^BN`n?YLpOV(_$28~azJ?kX9ZP84d`lE+z&R2iz zWu@aPU$vsVBmMN1JC3WoqK{Saj$zLR#NIM)Glr1%^AMLi5+K(M>6qc(Quk(;C7!@J zY7dFL_2ka7vE*zahWC&#plD)XHCZq86@*r|sU3AtOki1*Gf7#Pg~bM)RGne38C@<* z&EhQuxzXf-dq^E;WN`_hvdVp5YJ+V{?F}C47=``Wz(Dp?$FZ^Wu=ZjM0wY(+QwAQw zsv|s&;#OAPhi^n6ylwKReoKUo9wi_wacQTk=;6ntYh&^S2B27+qipUS#aylt9>$L{ zrI|U6lrUCCyyfhcto_c)7VF9(ddNYhB0{O)%}kLk1Y_IoV{%5}+K+|BctUrH>_UHyQn)~3s)_)O@ z@Qo`5d!2_H6sV6nuk#rrU-6r`cniW+&#KM8yQibG%Zu%6J-_ei0k}%OVD$rt{1T$y zX!&=$H@i;w3uzaeqeFWlcpT4oN34#I-TLc%Yr|Wd;4?m}XyJy2wu7ve(}D=%ex~>aTDJGrVTQ**g2+tIoIOo4f7xs~)k|F)6J2c;mA9 zw&tlFws#G;TWVI)IFvB9>;|DMFBv>xMSaG8f?rKzRA|dwi+fDrgwcp6dtxt%aiMI? zo4C(09C&^(pe*%4C!(>q1j8dI?=QMJhXOgBZ~=K)ISGIxE5gAn(o6CrbQoc$^T+|V zwa*5<6w=0HN!SOUb@Ean&6QL2J&}v=C2_+f5aw6_qv3;Unv_I^uRTY~gTN~fSRgn` z5aHBjqU0uri4Y$%2@ikoigE}40k#>iqzTnYJ{?F9{Am>cCW;m@K&zO!J{2B;pOaTW zNsfbp#pzPMR94}rt|sez^$mfk5`vdZi*9&Bd7zpU6=hs9sm?xhS(}uRHv%Y4%)py@ zh$}&bi$38d{Px}6QG%)^G!4oa0fy)x%IHSgnT){82x(79AFfeEcxq3+Dl45t8=q^S z5tk#>m9|6Q&)&Gh{@?d*^F;|Cc+thSW>T~AR4pTfFdR)|!}j;zzSVA7GRv-f&+F~_ zlNY(dUG?x<`@>SdeQ-wB&T7nBUeyzc<)Mvulu591H$)J$oiAsVmQ|OrJnEN68iCef zEH3nrMRG^!K+L;|aNzmDz>SqEMJHGv4IO>g zq!4bF0)7ymer#^km{4ichyOF+ul6W|myB1hIN?!k- zZ-AE{%jj2%;-hG$_S|S-a0O+?(!vE9(-rriZYb!Rz{i{s@8UFoqy5e&93K>@Gk)?Z z)nL1`msly)YN@8iv#!Ay{lXh)rCY3+Y*nS|v;>ej9icDcr7d4wV|A6S-nP%k3O|I% znXN4;gkb&s8XLZ{ywYFmL9GxliA7Z|#F2LXwCU@%DZNXVH3rZaLRkd5qRdbacjMD+)5=*;CrWz>9524Q*kZfhPb z*%xOlwWR}lRR?Qe`5sKkUb1$h?HR7K+vd%(?=4$wGx~aL?(SZpoVEt_YiT}hi*i}p zD*Oh)*R3q=Lt|BgkyZb|2mF=dG@S}<6I*zx4fy)ERu968WSc|-5 zqBeYN3j?aDyzR+eYK0U}#EY7^dr>Y^WtR0vvWR0sTQ*o$ISlCO27~=@3&dZ`uEa&9 z>Gs9mciMF0u^1Qzk^=pFu<=^^X5FelB$%rFKJnlJa`X_-auIUE6v9vNLR^^~*wpx& zI!{|m=|S~p#NV4!b^=N@Ffa;Rx!FyC-J6+by}1jWS?yzYj6eIxIST8Z2f>n|V($tm zWr+c%xk^UNb4IGnM231E@Y5b;Wz5HC;<@Zk{ImQGgN1>SP&H?=_VyJ`Hg6JdbJGYm zq8DM2&wL6Gi0b!_Jsr}k-blGT99Mt8d-g*6>1i|V$!QI?qlHJZLVjn+p}-Xqx>l{T zcf@A)j7i6eHgoT&b?zCmnR`a9t9!_nXx!H{R8W=bedM94^jmF!F1$!fIeDEwVXu$n zF&07rdR^OblC2orVT(t)eTp14IHDdCc2} z&3@89YWAf)&)`Z65>BDzE-eNwKO484mE{ z0poPmcIIB}?=Yn;yabS{^xCw-4@K)&#$7`LBx1k&#*0)VxF+M&rV&l-A;d8kr4Tyr$;3iHT6}Y z9r%HNQr;D=pqy*79X4orJ9BJ@@W4=2?fywq>|HN;xz#$AsnzVX?c41iKX)x$8t}(Th*Fc+Cm4L}qc$egb2Jbyjt^7%LP5uj0ef=i+gOUP>IMS4-N46) zS@pH`HfiK;^*vzKon0Bez$<~sR(87pvf6@cjg{3ld32R3(CA5cduXgb@1uLxu!hvz zK+z(l8$Ty}Vy`V$M8Z%%=g+e$EmBIBiKo&@o7tSPcdcxzMT-TZm>7cY5{S-bFVPujxW-S)As-eM;_J?L`)2rWvEl-)C$ zumCrTmy=DJ!p)XN*y0S{}h6jD%S#7jBg>R+9iJ93#ks zC~kP2lg9v9C{<4_2!>3DM7nC-IWduR2_pCh#S}s^C}o>!O_lpq#(QXc^OrdD+X@d` zd-)D)Evyml3J+6VR!DYOv&Ns?_lrL{Kwg;OZPGr++MwUQ<8Y1#WVRF~$4vX@x2@=CFc2+&=9zD#62gt=Or%bo^ z{oZ*tR3}AbjWQ7>gUgc26@?>;s5BA7HzrC=p<*~!zVS5jDV_W%G3e-eg69u)?v2Si zBsq_+Q4jN8+dG=i{{WFYfNKX??@?(?zo^nXcO2DGl}mh2Q5svDw;tht+49AjuTNfZ0;e#krJil0pu$ z`V2Xye#s+EAZl>MZ^y*2-!T~`oJXM4LxY6R9hrcQm{utjn7dNTuz&cVAM{Pfa z;g~M&OAAL)iV*SsL}lW>g%To+{~|U~x&7)sI-tJrT0x##K*_OCHD5AExE#2SufqeO zq5M~@wfLA0s*=wp8_e*M=Y%y$@iMgmDRj>B;5AXaj?xpZptL2?mM#Qi;>HNCtM>VG zMML2v94Udbyq4F4r$t#&K+3cCJfSSdURHTozseYYZ?4Yno;BUBU9`m3=BHYAv}AJz z`y(2{Gw}zbqDne!%pM%+vZ?7or{R+By|%r+Sz-4i69KJMpR^yIGuO_2WT#E;9#KQk z9E5m4zGf@3bvC5Rw)$91-FhPgA2RH6|gp@Jh3v$)47t6&bccWn?w#}bPspn#x>_@G$?Yj+&tYe^J3ku!JfZz*1x~wkEN)6en zu}<#>Fak7iBWrsOSFl|VxW&>_2=)wkrm}uPI(*ZC7o5!lWJ1_b{oxfSur)oMly?}q_eziOL?8f zkvmj2C?De^4@Id@LXhUN41ZMDvE26fbqBmrSYs&=k;9lIYdi8U z6%*Q>NMYtQW0~?En_B##l8U}26q{L*;_S&@p}Z~5OVpc*l$-=)%GfQIt`x26FZ)$h zFo(TNVyqYvH|M6tCM(5!^|HLJn8CNF6^d%C zNZs_q$Koj|ri6T;K4rI_G}Z2%-)TQNrOQU^bE*s1gt5?$5N%92V0V;^{Xsr!qw=T< zTTv?Vcqhj_m!yf%6@k(gPgwZSMG);AA0WEy?K#kSf#)L=ePx&sXFynE5DJM=(RM`F zqoiq8yUNWS{x7@7UsJ`W!!AEg2Sdh!65!+hy23HC(VErN;{fn1ikOOl-J^8zz3j zwRqOm<%WF($k;@P^T1d5PF)bhClCL(DkOwJz7TzG3NW_9Qvtk+WH2+=N__4>3`*5T ztf}<0n1KL`5z2kX&R zvYVIAvQ-N;hQguhGD@xH14t&4@>mEK%IFW2V`=1Nk|Uyv#%p-Q5PoW7!UN?~ILD)R z$dOO@a7>*lhn08vV+-UAz`0j0a5_)87~@9gbr6nq7%8YLEuM5#+kk56SCJm=dsN>} zrR`Old(Gw-_Shda-(#oO?^Xph8;~bmTWqxznLRd?tJ;-+_!b+UA-XoJUTmNE)ujG? z>QBCHi`MT|Q}8s@?lI|n4}=LoHX6ObH;4@sXU_hNA&{8wm-uu>yHd@$rp=boCSn>csx8R zD_3lAgr!RJi5&70MrzNu9eL8-iRj9yJ;dUe`k_Gt&>)h_pNB{Z9VU9nK>k2x zB~vA#Z$e(OHmqZL%A`DHRl~@nloExkp{Uv}$USWz?7ZJPb3L}R!s{QaHlsRh|919i z_JvoSX0<7*G_SferUcQ(Vo^%@U0bqNS`OlB3?t=jtB*TGq<l#r2QR)T{v;=#+)+wC>;5_a-*?j@4ycM$E{XUwz@yk(_*ao-<3Alot2~S&U5;6Zz~o9~1dYyDR`(%-}8e=`i zo}i}d&kVKOO}iKQocCExn{2SAkY4>iZ_75jVa^FQ)T&5>FPFm?^}m?S*ga>>w#$FC z#_}4g#s)6QOs@#oEJL$6o3sbZEJ%P}k`ti-`Pe}RKNUY9xhI94KzNZhQ5gk(rVG_% z#`fkf_a&$clY4?pxG>+s_zcB@c|KXgkfg=wv}?dnDL z$e*8UukS3|i-v|BKYngmI^Ev&j`KV`9n3QWi)9xcQbdWYek82y)ouuBT{^S@^c-bZ zPVca;=|43f?>Jgeek5MyUGXICNTDAqeOw8{WDyGMAsEeZ?A}wy9`34IS4B_AQhR7ak>h3H64@_0}t%`MX3XXwD=4lLMo=}tvmBlE2KI?qAW_Pweg&5yqp?9 zU|`P+5g^Wfn-kN?7OvCth&ik>^1X{HY1-U_1dj>5+!`X}QXZzs{nm-n@maiZ7=p8C zJIT#^6jq9hBIEf88*?h}YR64|Sx?^n=8ElkQZ}rb;!U$)eS@`T+=X8DfeseT0{Jug^=eFXF$#ftjNL=@#5Q0QIE znn)|~ig-wrk@x{cL@P)~>8OLYIQMjpp(*8XSE6A>>F#AkITXjep*9pymwcO;&bh9+ z_al!s_lmC2!rRN~n0uforkB;;>k&^V3%a1DYr}=S{h()oJ(%pWg^fLS_P`cf-!;iL zO_xW4Rz8-5W@g=O_4dr%c6-^)PpcA)6rK-xfPQ98qQO)ZxL;|cFoR7wLRN+;q_UXB zXG@{0E3H!fnm~MI4K?&Cr6<|$?3GqdHAMUp8WlxIE%oQfL&^pyqffb5r~>zNaTy&)WeFKQkLMGi#Yk6KU3OpS-c8<9j%{Fa5T0s<%Sx_7&pNFe4ku%h%OH#lnCJeU(P%uRf zu6!=-p5|e#yDl~fuPdg~&vtZ?g?|RBh}P+#x-bic&tb*d2+A_FC>VS>PQfj4dsf@!$CX)3t>G?o3EG= zv(hMlJRRYyuj$oz)4zKunzBsO*R7^9rU=Q>X@!+yWV6OC=gn@gH!p9t3m4Scf{whk z)+ek!Rkbx5Cw~9bnfAFCEwX=j*(vs?H$G|?KepYjJ9Cb`?=5F~m|DzW+69h^aMM4} zUW)kz;k zw`of47q7Rd@v6@mFt$`1;zJolRYiok7-nBM4q|vm>PR%%&g>OdVXQ73d;|gUktyV8 z($s&hF-;%tl^|plx3WIocmcuT6mt9;f}-R2JXkfC`H-&j@q31{z9of-j0rOkOvGf; zgp#ljW%OGgO5-cisjwQ{IvVTj>=|`--kdtiNn5=w3F}~e+O9o+fn9gT9NXGf=eV5t zbdP=f>krsH^V{vym!4!h+VfxwUszlKJ61_@=#X$ zk_?pguG7>*NQk_#scP>IIKqzzWxBT?kl^LDachQ^MI*{Qtn@*Z8&uy0HN+Sc3L1wd z3n+uqX4LG{ldiYL=^nfKLvOZ$B^oNsQn_q!LoW8}YE$2cU3dAl)-({lo?J`G6RJ-M zf89u0d`Q}VRL1NnUgRdjQxfg)sN9RJC=c(N^_h89SV=HJCWD}~?)1v&lM`yhm6nv%ud zLjA&Aa>4s>)m;g<$_;GNfhzH3J7G)sk{wnp@kusmfQ+_lKp4>JIvNojyY>>=>fF62 zTR28wy%R2r%ID|WI7i9RhFHnHn)v)6TR=&9RL;|M3~F&5UZ)h0dev8VFc_DDJY(x@ zdxbq_$zsJGSTKX<*DMKrrTtDD{TJ&p3SXP;B|ng}f~O@Ome2+91n--cH90|ixK~$s z2La86N5xcJ^)N$EG~u7+m$8F8qz|PR`3f%-kanOYGr1UxhSEA6wZHS4TC!e!Pg#AL zx5NoK=FDT$^a24V^dZ27bmFm}qb?KA_jyNO%bKpaXXL?PXv>p_+{maUnQUibCuvRD zter8n$zHp($*$1W)htDVsd8<&EE3v^X#t0T^d(->#l?dDeVm8QBJT3%=Xna zDb?YiW4{ESWGD~`q(a3p2nTZSz}~BR*9BD^%BmB|F}ah%9vLB&5b2g;>DVo}q`l@! z8Md&l4lO_{$WJ=LMLC|dMBzXvR!p_Sm=i(uu$Ak&OuBZC4Egl$&I8FtDQNW|W)eWFmdp=!>`9Vz?m?T^^EmMpbWbH-{7%Htmp z3C>7Iws~%c)enr?sgLeZ)eu{OD?Imp@-i72TIFPt$6tx5LU6~ID^dX<<>im@B<07F z@OqMts+J})fZu|K(pqaTuCi2X{qk!H={dr`!&)kjxV*d&0RcZ4#OZFaV1!OdL&V3g zO;AQpS61Fw!&ow&*x_YT?5EbJY=xBYWsBPF6{j@Y@)?W`6{2CG@kC<8KwZ}UI{3uwU1cNU&1W6>`5MhFp26@`=r6G15z%JcClVdBmoqnfJ?+F)|7=$96XYC*=ii7#>&ZdWeh z+0uByH7tmR#jV8$L=!cN)qH_zW~^KX0_lvcT&)mL7iz-I_?&XOD&^ofR!qi*S+e7kS{WLG@? zJ$iw=wCy3Onv4{kb(k(q5)RL!%%S~AdX>F=aiqlH|^9HL%dvsgA1QZ zAfzsoWF#MLNLr&ZL77Ab6afsBEmj~`x=2vL4GWHU;}85O1F!j{Jd9w+=M9*rNXd#V zoixdoO>VX`q)@LqafZF-#7XwXlcw1@^P6qyl)TMq$y&XytWhQ4=lEj*bs)iGalltD zTxcKqjTN@NU8WcuTnX76sj!WMPW&9a9YM$6^MjmURNb7Ajs&X>FQU4^!IS+Q;3)3D z0AU^L(YDiSWreEAvd!H!YAe@|*}@$qyWwndNifq=DBj<}2lr7xDV}Ada42L(=UJ7_ z4EVm5>C^F0*wVwQQ~3z9T`BRPgoBL5@P1$ff@(tw?gDGkUmm zsf4%^p2`pQgpM*3MJ_*AKF0$kgOCF1W69XKf{DnKr;J-$l-;Qhow!aR z`6V}ExX-)^r>=&2>uk(hV?JSXTH9=DL)Io~o7dWG4H??dMw=)GI5WiwmV{Qq$wMJf z7asJB*O@Rg$C%^3g;VSkS1y%zY9%XW#OK<~KKz>*yXkDo z%j5Aq4k>JnZ#mkCXevCC!)jOMnEdexAnGkT-)d4S!b6{NElA3TTFm+;TcW?qYJ)l+ zt(UGgT6Iiucu|A5a?bOin6`2_0^Bn zS1G2a`*2;`imvo+zS(H_Q>8L?iFjQNO;WbJgsf__nj5Vpr+8k%#RI_*oYgnfhhq5)l!KUg-LwpeT_{M3l-oba zEgX4D1MkDM_EXcF?b`Df*>_K$9rOv~;fg21`~L7im%?ihRWwqtDAD&A0$9jjpa;qt zvVq*VBD!Zl8Ce*O@<fe#Kwc* zjH+qUP(bQnuk!?(LRnrIh8$@Ono#IUT1}qP+bW1=eUq%#Gu0BCPPE!ag^Gi%RvVRD zD(0myY#8f0DXg?be68}ao-zt3-na)}>E?#!#pSnY4Nu!Ra9Uw7j+P~E5tLs%b#M(0LDog`0I!6bTKDo2S z-n?wCo!HgvNMpUB0jR{sgpUXq0*@E<*GwRULO1}{pAkvuxPMd6A@T^(-s>WKCCvq& zbJd05(qkzZ>G%}dq74L(OOBhD4A*@o&4pbA6!F4S7}Tx&Zhi&e7}f8kl!u65C|_r{ zoYdtv@gJDW@+>Au)Hk8!-<9;PL*cl80ch($fXOJlW1@d=Pgwfof=~wEaFu%Tq@he4 z0SF;&!k0Z`9wgFlMb=3I4u;ZY1VK0vHH&1P!AEsTGop~X$0BFwK{ii0F9^v zMF4jv8Y2<%N`aKuZ%^R$TqBjoyA_Tp??m7_4M%P1SI2~%w8LU^Ztw>@RX{1BJ|3ka z4|VXGj>o6B+F!kPg?;!9%cYRhG)`;?ih=TJ#~2kBdU@KQnZp9n0Bs>XI#MMsdU(6N z^GECKMUQN;!TOwS>tL=PoFao1)r&vpH$c>1rO{+qtUx9Sg0lDxY6wGiC9haLY}58C z^i;OR&y?-km$um`PeyR#6q=;ut%&vbM1kM(5ffQ1sC3d2QF=^EA8o-i$`W}{)*rP{ zUaPZO(|{#sJ#Dqqe_(c|w#i#9k(Dy2#I`32F%_>GoPzkz)tZ`1PL!8AGAj;+K$RD;fth@$IW@QPPU|UegxWLf? zOUP=n7|c%YEfnmot=;zBr?%R?+xOaY~M+(N6 zQ7qOqEQ<2LTy=}f7#q3*>&Z<%dd?WHf>ec^`+CEH6vfk2*qsT2sXu4}-ym`*gP_x< z3Ng?ZZuALZ^Ea&PoOa8)*40Cq4McW4?11alk%Gg-EybXHN4u-}R6eLL4A4u7^ z(MJp=af8`k{O3LPf3ADn7H{pf6F2wU)%QGOU3&)X*3)JNeu2DK3*KNK1Bsz;^wA$s zCI^NLuZf`mAIGU?7d_B#bGFOdsm`1n+4>m`wtlX>l_<+|d#u6b)gi&yh;LFp-%v2- z4a6Hy=Uz7H3BDu3vO@09a*X6_T$#|O<3vq{%k$`%RfV&+TkX`_%`UmYY|3UIds>gi zpHf0!^e3)6MvpbOBGLxIrG(#b%|o3GEh9Ur}_G z*I+umv~!s=TX*7QyXxzYTl0WCzxv2pR=xy=h!_eiJmw0|`_g3%Ta_O18qe<_$aT zy4Bn5+DA9(c!%Aywa4z+vd6Xzl5hww&lwWz-1Ra`WkS}3^ABEpi4;xJ~7Jt<*_%Nf_Baz0Dz=j2l@SbxfRuYzJS zGm9r{EL3gD)&YCj!<+3Lw>)hZKfcxG?v~-nCTx3KgVzntVH~+X9GK!5dt$<_ynC~~ z_omfqUtUvqG6X`rje4}xvYx>?*sC~<@h&L9BL1S0K5?trKth$pYKICm7lx4 zU@M*+RG;KQm1X9xs(tgt9o{YCXXl>SCL*bFaX zr9(+MmQr|HlqYz@C_l0Qo;vm+5;UQsMA(#XQ)oF!eMLE&R5m=os*5@XwC``u*^7R- z(HjrElq?bjpqM(%%g~K!zftyx=6y+>mz6xhe;o$b$DSV@Id8P%jR8E}0ir07??vG8 zvC>gOJf8FVkP;EZo0Q=4YWNhP7#?F{yX=KJo#fn?ttk&4DvasGbP39`&PkBcCxVtu zmPr$(n=(n8-^vTBk~Xa&Z<8Cazyh_+mZ8$n2g3s6ntehUu1qH^+qns!?;338Y zdho_DKC7n6Jdc-AVfaa8-~vEC;pZQjRr*LiZ>#3F_C}n+A%8Ie86yN|(ZYJ%~$uKP!eoOw-V=#3HB;R=VS1mhBv4+cUyoujxI4}~Zww;KsvgTE+guz^gB zLvS5?D2Fsu?Us|L*)1ndx9iTD<>$2GETV1<5r>@X+T-u~md=?jhwdo9@@vn{X=Wb( z?u{qgS1()SxkDLv7+{|v5x-)d!DR0PJ*6&P^);6jd)NQ0w|9MGtr8fGr)2FD_NVV% zXg6Ha?$?oI#RV$G3Y3!i8Y!aE*;uQ>Y>6u?+JX|h!Xa?v0SC5;$86xk7N4W}Og5ox zqF+I@D~J!n8r%&_VV;_8cKhj;d|-jkR|Tb0e|$lJIHuI_fJu-qJ$F)0I$LY)cG z6{U2KuWLT;lYkGYtskE})js{QlWluD<18cyrBhk81w8t$|54eBPjx~yG(hcaL9_|NdHi>qHic1LK}`_?}@_W6;M=!55b}=?FSraVPf>*#zNOZUeS$u zxu41X#-fyRO!OR8sNAn%)}S=y=}t@h;1sK^*Eka!Kvgs?@VhmHuToM*I6Nz@=G;r- zQ5{q-Wrzsg+J29{x#3ZJMb}%b|8jZd3x)S$wKrLX;u&%kacNOMt~>L~*14@;C!$Em zqGNE!aEF(x{8heayMzedz9=IXD=Fid9hOqcpQ>69xqe`IheUda0 zjnD+4ui4(Ag6$p|vn@TN_JqcPYr046)@KIn?oIu6<5Ros#x?!+(6$kKc>A#Jl@aV6 zR!bUJwd5r{Fhupie+1sysBu^L_CCe{TI*Q&WlJSnx^2+jc*|NlW8Dth-qB{;Iv7W( z4!ogozU1NU*50p1u%K={kPQ4k6CE{q$Hlg>t3h3Wsk-ih9QcC=*Kf43)1Eql6;b`< zXTxwL?Tn}P*osG496$}qD?FRkxBq(i$u49yzQf`ZG&0`Wg4ZA|Ox`4Pt>)L+>ijrN zb=w$wS zRfd;3Lp0F^8ewSgK4QB-^ka`9)@6SZ1i2SryjNtm+nM!G+osWWTU)1L5zk6;`vcpY zhF{7j`uSev8v2WN#?LlWtDE82u)rBi5yLXx2k@lJ0_y1(9jL>R;Mh+Bq}m!+UV{sT zg<;uP)q3*h$Pi8Uj)ga}QGrA&*{FsxQp#;!`1uTh%<5niX3#%wRm1|yC``R``GjGf zg6DK1DNz?ZFB3n=D|y7out)(>P1<0wV%?)9Ti;W($9Grko@a*a&JBaMuBU4KO2_lI z)O%rhQkBr&Nz7h?0vj;^gk@Ohsl6liio2h&v)1mh9qoIKIAtd$h%Mff4;gXob&}H?Oxvn|Nb@lJy6^ z&BJB;%x|2e{__bwZdag;lx2gyY$)e}8w!fDMoQ#L%U+u+XQZGLH-GFRQdrM}l2VQ| z&cn5YU(eW|+*h;rY#y~WQxmqWNcp-DCCeIyC|o_k9-=GiWB6)x;Bks;D6DuuM0I7| z8e5RvZPTiK_MOBju8fH`@upSR>y_7qiZbkKwtm@Ud(*$(r(=z8X;4N0nn9N&;kx!r zx80vk*eFq@cmv(SdjnLB^NTV9cpykMHJxz{Q^~kvpM24UJ$!HmBCAnY;xkF~NDY>f zoz_u&h(12=!Ke7uX=c)x)N$#COFH(Dkw9P9P&&xrGO50XctIzk3-3VjuS7{1`Bb*w zV}pn~=XJ@vtcoZLrDc^rmGq7zO)_ndZmZa>PgiVFb?>kluq?q<9P3a2`} zBJKQle^AMN;5=ocpIiwh>Ww$8w&}ZvebUO8i0D#M$3H!Hp6zKvX`mI#h7!_W9g7AN zmGI{k5+#h&P)5$FD^|)_F;O+Lrl9kVy? z>9JH}%~thx_#_N(`KuN&prWYLSsU!uQS6a|UMdePP@Xq6KVZ|6Bi5c6wi}B}ZKzFn zGMUvX*>4nmGhTp_DyCpOm$s=}`)t8uJ3SS8FuI10h!1jyO!1nI)kH74rl$P5-#ho3 zhaM)9dZ>)uVQPx!b1Y3bv}h!wS5K zAQd?ijF|qJH}D}i8{QGQ;F|ZPW-qB%RD?sv|}6#TC(wW7Ll@f0E8`&S@MO&`@e<6J>N9yw(6J#iD4!QV~=L z*D{QS!obv-N*G56w09;5*-RDUJimb#8WW;o4Z{SANG0VV3UGq5Qbm38FDOG8frpP0 zKFUB^`phC}UTYG(WlaNfU6BwHx~8klGA51h&?9q25sFbOpV;H}74=qBj!AAjEwpD2 zx23LRo9YYpmwhAl?H!}GT4PnLKH-yFRVgI~FI5(;%T>Gb-c9zs58fn&$lF{0_!4{D zA75yH{QZz*LQ4S-i=87B^-x06G&l0I~q&4{23f{LG*qQC%!R>8j|a10Ja5 ze4kN+u6W7dDZ_X%R zo29p{_SDRFd+VF$TYoNVFK^ytUzvB8H6qiI{6=3X60gNWc+1cur9Qb*s!zze(sq|L zM39USIGt18WQo1HzEgeVn?6HjONt+=RDFW~LQ(s5%R23;lRJarQ&xX`{MA2#%cP(9 z4OPypsBOuGEU?dQKu@PTq!jqEw$$uw{+i~}qt;q{#F~rR7ao>SG*~fuSEP?K=oAH1 zd42V1%Q4$J&erEAV5!{Mh@My^4(YH9n)W(#=0FdK0+Ub(-|+*Z5IWvcg@RC{(&fY4 zV1;oQ^yNiY;=I^DRJ7MxC_Lz89_M}lp=k5_Hhw^eg2s3n=s+8&JsdK$8J z@#;RClr7r%%{%RT+hMq%+FZGR^GbN$<9KUw49bNy;Q?4O3IW|tq-uqQfWL` z;YQ81F;v76AYNeo!t`qp-K4b@?v`Nn>Y~nh7A`WS=`x?{Ugc!|bpQm-*BQpW6}VDH z$LtY*Kc@fcr;h-1NFO=lwg@>;Zl2FWMX-X5;t1uOemwK&9M`DJ=}Sp5MaC>Ab9=$u zq`mv>l$|Gq>~BchC*~DxW1F(Kq^#JQuwqNnc9s(Mjh&v5+~(D*(8yM(nA*QugGdBXwA)^=E<&L@@b)n&po zTz|;@>jc4z><@8T*hd5s1TPxWBhu+OBBZup|C!X`DwATe`mFO*KEjf$7=P;Yw7q#n z&gRJ@@`{g*ja9p5Mb-A?38xi8NwBHcS0cgRLfO9-{KRm<9vrAzPM&yrj_`<&%8F&K zlqp-hsn=RYiuSXUr_q|X$qccF+DdR`^YkNt=fkj2cg^1Q&4+FF<{`C!k(TgCm{=^5 zQW*T{H!rurMiho}K}IG5XA?yt)Qp%#qJ|>S9v(cp;)*L_9G?}AugmZ`An#P_Tc|Po z>ALa;)0Nb&4A}@*VG)WYY@{V?bD!L4^VauD8ByBMYm9bTJVf1? zGw74|+^jvXigcf-KB3_B1e&ssdVU}<9IaS$X`Qtc9#R%b-0f1?3Sa#_zt|P5U?eV7*;==QGY& zFhaN)8%OMY77&a;aCTK|9WL3$KieX?U}Y9fsAdcW9#XJ@W7mhZMFoYT_ zV0q~WQ8@{;$m6roT;n#BE?+RW+1`I%tIcUs zV4@I>wXC;It=eZ7Cv8m1XuiHx%3PPQu@;qSky1A$tnmpL zKX;GWCwGilH-e6EN-C)LPrh=mb#{*+-`e0wVDJ7cJ`})PXQ>~*{1yx@eN+>!k)&go z6SnH4F7G=OQLiO*5;YVC;bV`ms{aZ9Fpg?t#SFMgArnI-OY|vh>@8SrSe~Iw8>|Q; zqz7>-RY0lyKD=NWlqEG>qyA_MZy<=;^i9sevw^FwOFUyoJJ?ijA9>vh88Nk`9{kp# zb@qxmn|w)a5b@((N2-w-9Pb(Z&Kho+y&Rb(`iaOc+NXIIC z=jFU>HK-Hk8750b80H<26O{7ABC@11x=tR?9m!V=2mja(mWO+9YTTa&P$f8CM}%wC z1R;LSU}DFCiRT=Zo*s_&H;EW`IKW?kk=Ti3e(A zU}U&JMF^?c^)Fsx_b;97Y3^OT4ber%E)*#bvt45V;@$FPL{NkTZl7TbnY#(E=%hH+DJ zgb4jmKM(qSNHu^0Vlmtcc$#dD4*Use;$pvl^XmmJXcNE{P5aQtpm1?IiU))@kYiCr z);QDu@?XP{=Y z2Fw6?K!(5SC8++qrmQ~p7-8_BM8ZSM{ij!+~>9KX1DJN&DdER+%qu7Ju=!F6aUcY zZR_T@JFd{lC$d;(=-!M?8C_wtkIs<~F8euNfcivdFGF5{Fuy@k+N7}{nvWK6Eo$4# zMttyV9E;`-xWhE~Do;|lF#D-vpCKpimkc*34FAa|eq@c@vJmD^?P;{veDl&!UI49p z0!~Fxcwg0{|Nm_LvMtE$aWA?(-)gV<<9AqG! zWl|vx?_H``PUmH{vUWy`ty(-y3f5&$&8WAX?M*65gc6jMR-t%G;Z+3>tm88t-(g)n zV|M-db76}9vA9tm{P)m6T?pL5jeG2Ke|obu4vu;|0FgEP=K7QKC)=C;{blNh+GHU% z@~?C^@>04GO6pks^y?fW8?IPhQ8?y0LLVt6d5IPXRf)tByn?Y=a+L{!?oNa9f>=LY z8KJ2Qym|{!`F5rh(mxi(J!L5hf*pniReR^nkK22HxWU`6%5z@($O8M@yOyamhKIJr zQ{g2HqDB=hwA^6lXBDa{KW^zIfA$_5xF~0}Mam_Q309yKsI4RVCEU*c-a7l6x7{Fq z%D9qAgmR@LqERO}ep(9oc`?7J_?h#H2*yWWxwRA&a?0;h8{OR>=xm(s$IKP0avl3q zAx`;UFNhT`hM;f}V8x^B?0KiEA0I>^{X34j@{Tj6+qu*0U7@@rb%^mUmC8ftgfOKv zZt_V!(a$F*#4KKxeCw&xY}KMpyY;lGHmq|5EG!NuZv;_YNCD^tPpI~sJ!C|bB5NH9 zhPNY8IubMt7435$`kpO%T49|O-5)GK!CVZ(@t=R-JiGpqd8$%va1G>3>L<#_G3dEs zs#vUi0_j+|&beQ6goQVGLW(6 z%6($GN*=z5%q$f2f+Wh?K)JguD@VESn??xw<2}brORQgEEz%p ziCG07&GW9El9iyj{>Bwj^$Ej6Fm7VH9|r;vvi>?KBjE_b39kX)yA(r21U3NS1i(az zhZ-WV_gsSG5e!14A_$AG^%ZgR>7;$|f|<5*MziYWdPdptPk}CB>YHN(P@xNTs^~U( zy{}xf$X@&5%j~>=zS=(e)-&z;b7t9KJs*ix)uFWig1@Ik$_T>2V+cFn#l|F9Y~Nf^ z0osoNu@7e`Gk9^fcw@JH{e3q{8GHR29+CT;{!L5u8SA}zZo6Ioq6LyJ8Dl6F@3!8bjN#>f{v~gF4r#h-K1zlrYDtxMCT^9~X)#;xpU@Yr1FTxLkYR|VbZ$6O+ zB~%}VK*c|P;r+@d3QLZCOiIu3)S{n$ZGCB~Qlv!iK=fa+ZCj852ek!H{2J}yC7ml) zXs)xJigZxM5W{ep+C_Jjku>NiY0X3gk_q2*9dM%~pq>{bur8Fa(L)D;Kgl1%L}LRS zcn*kweA^$Qho?kDP-$pGHfbNaV4f}QXi~bEQ6WUChVOjnI$uKKt49a}Eso@qcKz8i z>}?--kzM}rm)hU`#;LY;7LOK1Y9c-aF#u>U5(HUZN8U5}W?o|L%M!N7%pKMYFT zf{uCR$M0VIh+X^Mn{3*yUZ)RZ7-X!fzPPdVDbuQb?7in$Ldu8G`@_Kn;iP?4N>TO6 z8Yvj)`JReo=Se7QOvm$vgr!o(@X2xYg?dO=JwC~Ul2X4sZk2al466+kbWmwqbpDvi z-LCQFHxxSFA)IM#iNyOE}H#$k;oFXr*e`ojKDDua93few&sb zvfn%HDN%(eM)d*88ba!-{j@yS`jH8EtMsY8y-q>ur4O)|cflt4qL;Vj>gjpcE#(W6 zqCWL`#R1SeI0A2{S28Y7F~rKquZAdU=!Lk6dfXuA#&+Nf#0x~2NT~e*C5Q-w7garY zNhV()W-gbrKfPd<&1ww;cE$?96EY}|!c(kcH7#%0Y=8giW%lB~xxzmDTPyAUg_B)5 zf)hhY^eaY!jjy$Z;hc%HFgMr_JRQb>D}<&p4xa8mM}VM+ND;!+FkG-V-SC9{w-oXB z{_8PUbPNqa69G7(oUc+*e!SzSUv;Xjo<1phGl!I6tYpbC_7zJPMMu7rRhD2W3B__9 zF6LZ863P>MM8Ean3N5Uq#2lyalG>6e6$*w2|n6E_71wisO?eRd&R4M<&x3h%_S~e&<%sEypNtU8)@)5<0_F0 zct}=Yn&g9X3<7(&AGe>FG3DTsI=}7!A^npDZYdf6k|?Pmq;X*t6%lk%$%&(l@gcND zKnX?DNeQXP{~9{f(j2}BlY$6)T~xzl0Znv zhU@aSdbZ9Z<^mHA$Dw(+XbYa{wG*E1u@#SPw~OxCs#GV6zd|D8Zv#MZq%gASEJmnR zBw=dj#`722N8fcWc1B)6{$E1RLTrCgG4ZKNa+?BWKzX5nYWv z&v*G8OVzRxd}h{MD1nG;u!98y$a1)OtlTP0*z5u>pa{oY_i&8!sG{H%;z~n0;}hDX zI_}${JRE})AvFTx)A#ar;jQg8Tc>dP?SFKojb?Mw0YYywlSjLX&JlhOPrVV*v!r}s zc;FL4L?Y#q@KfEC1$8MwA`WjcWYQ;QS6$f|2T~WFct8pzWef`wgulO#N?1yw9dD)K z-cqfi)>R5)8`4%yt1vUOe40EXMXA%V6vQWixaF7@7sZIhJNoULfAM1(KM;};&~9Wb zXD|8I%WSa3Lia#-CbpRIWm4y@rQ4;fIj76HAA6srnxs%2!f~=_sZmF&Rr|d9*+5yf z?KM~J_RfEl;t6lj6o3rK0(~gS>uyP=?em#%tD_XXP#J~f^&Y9##+BE^0{KGP9H0<8 zH;V`l_Yni3$m2rGA7w-_X5A=4Sjp2L@UAtRw+~;u(B?Mt+#y5{LXJ|Rb2jd1U)Wkoh=4LFN3s`u}n;$D(jPX8QTrfOXpXI@ZQOY=_KhZ<*z2GT+d60^BH z8_7576{Yi-j>{Z$R$FKPaJ{wf8CKaq6Ut*_*uz&iaZfrji2SKoI2P?*s2&mz<6|=^ zjlYGAPK!whHaG6^n$7^_8COW*{iTcS zzb>9wP<{{q8L;=dAQ+g^0h$RcDTp>UE;S6!J)jc-Vh&bI#^8r)^$C z!devqB_*U~4N!P=3$MoWs%b(&gi-jpH*(J}RLWvG?Y8i)6xC{q!5{YM=8HfA@0x&3o3^AO7eGs}vPlk5uF^b#1g} zJ?hLqU$xS1IGdL?XEe5=aW#ZuN)c;#S`?F)R7uhNyeRjD$Lv!(eNqCB3mI#Wt30vR z?=%2!zZIcBoU)H`QB*(*HQbi7r>?5AT3-E7bxB#cYMnCX)eegec)w9rI4ESLtAF*M ztL&;f*Q;4w6K+hzZ5hhiKC4yIaY|#Bg0+_J6QMWkQ%HnQ%CetAiZQP{ai+cQgz2JZ@RmF* z#2ECx`EB;`71OPxFm%!n*I9aCOj)v`HxCk_%wmLV0%yF{PW&ejR&mA}7zl1+qx4u* zfG_a!u=I2Z!~7O0fVSC zTPARPvZrRh_lH;6{U>y&Vd3W z*iz$Z352*P8sYJ{Eg@Wl3=1l#$%Pz#X&+uiDdm$;Z`W9Rb3@K{E0WnNkG*Q%WZOO^ zXWKgE)v_v=&f3*?t+&7W{C%Q>jGEeWy2;@D!Ce>IZCj>`=c)>W#<;Y(Y9Gq|*siEN z;k5X|yff_!=W1LnWlYXgS)PxaCK~bVv_>+p1bQ+|dd+7aw)cGWX2%s{>cbAzLEOUv z2JTb-h04SV$(#hU(-r@u#|u;;{l+p>ionHCL}Ah-Wks7l{8i}!%trjgeB~FLL=YVd zmQ885Ycy`;11cy%m_kq5KdhW(KfUo$Yx&vMpv11cD0Ad#;i>=yh>!g&I(8*w?|DO8 zF^~pR{hGW}PF8bmU$)Y5;&#S=|H}=& z!pBC1Ls0@XChseSy#16J_D6qk1(pB{q@(|iHdFK;M;H`5{7rr}M^BUiG*}aP=+i-o#{^{TD z)pgY-1@K4UROY*z=h>gHI!86Dy%-tM{_XV|N2Y!z8(g!`&01++S#h3K=PA!D;V?tE zM+)h${}H{3czBM~Cw5-*HJ2MA5k9hnF@_H@d`V&MMs>GXEBJlOM5!G1FI*2fK^dLS z5*imqrB{Y*#@IL1d1rw#pp2}P3CwQDC+u^VFSmvaE0O{gca03&pPjwX2LJv?mSur- zEF9XaRX%!bpAEcC0OqPoQcphFk!qv6%O7{+=Y@@tfhEKg|-1NHBGq!Y+ybpQR zrr%p+tXC-8Csv+h*PeD#P%vG({x82~)3y!z^|G#~vzLOIG&PcD%<%#ew_`EF@YmoP-x+CVSc0ib<_2- zFJ*hAb+*0tyw_S{q3UAA&TM6rQYI7-_*W6=mw4btUR1t$+CN3I5coqs*uoGbVPDDB zY@M$0O4Skt%VkjrANm3Y_XK>3Ti|a`K>ezt)?Rs7j8GsYin(`mhCw|krnKUXC(g0D z47UPcOxf<=w%0!N<2Ba%=ijyDV7vxVWREshe2B~;^l)}?gFH-WhlRr$BM285d*D_^ zN#bMu@q%LZMR`L)8fGIstkLy{yZh~bwhr4zp4er7`e=`RVdJpaUADj5JYZkhIcjUiWSP}=Az8Fkx?(3Pyz`Yl35EA1 zh4%#su-~k&+C$T)LK+uf?k#q1AJ#Zhf;~3kc?&%IsIr9C+{$3~^y6!uv`hEywgz6_ zrGB7L{<=}=4IUDY!EF$)SbUIv2w&C10b!|*gEERo>;-Tu9EdK^ou!GYgGn4WX0Bw) zLr5yctOzFz6AH`hE_`!CM>+Ze*CYoFSElvC;nV@>9iN3RmrO4{oy?H}3FzjeJIdmw0e*GPZay z4q&VngA0;d?*Jj+!NKz$03l7{r*_;ZFoiF4JS_Gc5@g{@|0Lq>jhT3X>AX4o#5x`( zu35K~vSL=9?GVU=$(a^t;F)K;^dxq7?u_g<#Z z6a_I`@zien)IWUJ71BShtWc{WYsY>02WEBJ7cV&7W<0RLT6cscdC0GNVXbuuYt3`} ziF=WFT6j>grn*JUiD@uDwI5a!uz*19zGYf##h<~kQ#j2!)i0%1+6lnUCQ;3%TA z3zZd~G6*~_hp|Hrc%`M!!lEEjMDqK3)1=0rJhUu@zG?e>`^e+x21Cut0oBX6^=oaP zwXRgZ4JY&VvWwsAUs$&Jx;R&u@<>*v8s?26L|~CDfXe^(ny=e(4Qr4okRvUG*eWY5 zZ_Om_wp7t^2L&TE$;P<p@AQ%@v3+Y z9cqNPB0gQm5HR`Wio%46^0`t&UzO$CC?cP7)og06-@df{WYvMeqO+on6t_-Fdvbn@ zWE6Pv`xxb8!OtX86Cz%HS{7BJpcX;RvlB@Y6lNP7{)kvS0-WW zQYkA*Va9|_Q9}d&KB8i=;02_l7#7M2J3@Fi>fx(UY(?RPw;-KwgH)9^roKJXU$T3i z8L{gg>$QKqx5qyClRfrtclF!1pBk|Tw-%+SL9uw;iWo-S5+9(y6cN02?))ZQ8?(>6 zM2zs3OCpLj%P=o)?u*{TCHWz0*7k$SV*hXtvXUSwa1Bzu7`Px#N+Qu!*wZ*0Xu)kN zo6d;{;>kZ219-R&ZKCo3=YX(%fdU*7xUy(tn%gNK0R(VGWlyLhdMxd1v|S^k_GdqR z)HZc%oJ43U!Nzi_1`!K^3KoCdld)F|C}zB&4k1sZDA86{*?k-56E@|axcOv^_RPGo zV#b9OJcKJ_%NkEqlvOW+!c3l+uGZDQl$hh{m|v$%DQd%wg{0L#uET1hYSE@Pb8k>( zMm5@!5|(9*eAaYSZ7WQDaQ1ZXUrLHLZRe0JSiej8dHZZqVJbqFvLRXhA1h2|#?T+M ztuQ`SdGOX4vZ%H(3}KpoOleX;DIZ1$PtyV%s9`N^{GA#5{kWL zV9f5_I%;2ETeQEwYta7rzG3^`#)_@qi{TMXq)qTVyi5$`)24749x}#t!>wap*_cLQ zM8h*$cJR_WOJ>Da-q$Rh+LdUtorzYpo3c}SwuS``0)LnsH!Mh_bpp;pirLzeCh0_m zUK@{HAuDJnE+U?7bx*FnE2{obP$_QE+!xyBVI94OAaq{Lb%7SiNcTK0CcIKZOjhC( zJNxbb{NNGW*vEJ9v9=NrIH2R8c)>fmXZ4y;0X$pChrp9Bg{t|FFq$ zk(U|apu-HSLSall5-W`Sii-q-=d(Q`dPqcXLps-CGWWhbZ*+}6gg4GJasR8_Sj-E- zP&}p&2sOhof)s(QJLAmQQ|^#=94dtw&7jCCg8)H~C=Y4u0rnHOSUK6p9`sO~=NDJw zZM=@?Tql8v+AteXmFpZ!ES<)95QLeHYoxnZ*10P)xM=fmS>?d2B)+jR`9nJ$**bro zu%d94r!8s)`6-2@)v+}XxeA>v(SoQlFgMRXfg#A>CIacE3#ng@5sxwkV_gpIL<7wfYtfXyvW|&vd21WF} z_)(X#2eZ>vK5f+<>idAMNk)>s#7}hz&>-dXUq9B*`V%H=AFlg^AKp=h*27gMdIajG ze!!h`G*yPtXIVKw+ZD$62R9jbDiim!@HCzEX}fH}Ogn8-qb=>?4ZjF0p&o~!au+Ba z^2Tl$;Eg@6ArR}?0JJ#}=s$3lzZF&QggOeQTqFK1KEnBv05?V+$jNeyd^ zv;TMTDfZ=8uCzBTogroH@N2TO+N+Z+kd@^L*x-Z0IoCYxdAz}o!)-7-X1E)h12zQO zZ=(=l9AraCj_VfTcc?9f&>#AX00-fB1#oLB0npg7>Y=KvJ~#M_D5JbnL7r|v;q3Nd zEAAYz(LubM#*N}LFaPa0wMoj@t+>or7WJgC9Pw5 z$68kVycAoJ=deQ92XgZ??3NPtsoYxOKBRujLo%F5%4@6hjt8o!7WAuew23NsEUIA#K%McSARLGZ`a`~jabNK@M#HGungc?K86?Kq6iP<_AM3rM;8(yOy z8Vw(=5n|fY(DQk73La(?seSW%UfTQ}eiJucWkWdPCHcDzN#%nfeN>8yy)mPbQQ@2VINbajOo!V}Vi&`a&gvE@- zCA=sUqK{Yc`)#2e%1&%IZ0bMjRoxxvT&FpHbgr6&8uf&*k_`bpkY=t>Y;nHmd>?%S zRBf&*$4Jx)( zbwD506XqM}H@#6A{X*|CmOHv}P(N{8!jF(2aIq19Q+({QIeYT&D}R^;fQQ}`!dQz9!vRRgB%d4dH#c#A02T|4nsWl)^AwinL#TR>wci;rTcVKHhuRo=z8K9!4aI8qcdz>&JLT@px<>4%@uU7UoVB!!-0c%W))M1w zVZv{cF(SaeL7BdE)k<5?!b*?G%H}l@&Dy4O2cm8?vf#8^`W^gor<= z9X;b{?je;oCz>cNndO?)nx{dw$aQWOP71T#dZ{tufl$9d1bF6z$ze5~>IWb631y6D zT@M8JuViF)t5t6K6PK<~xGE3luey*6p3!W{51wz87caDAea5XC%~4nUNi9Aq5++P_#75cOJlqy&ym9Y{6-<+|oFJI~W4MHwC(NIQG;=N7k0AYsr5(}4;ed0-u{Wl&O zrWfTmEVtAdb3!>?@~dd`0pQMI!nRLI!xpy|mnHP|d}t-LBhR=lMS-piLfG4j@_W4^ zN+l=R_uC$lXBG!Y0WGV#rJ&4NB{FhU(WeFM0V$>EWg5m2zRNXHlj;?2YHFZ08)l@r zMWp)ijsRgl^mjZa0H~@jsvwoNH!PiD3tJmi5ijx0S#^Q@@b6tQ{`u^gKf-3_^^>n(Ax}A5-inXg zB46^sv=MDS=8HBIC=P88+%O<)VT=!-Pz1(@av2yARmP^$o{j>zEbGAAQXTGSeYK9R zX}oAT<%8im50gDyQ$0-ZY^k^EfX-`UqEW%eprJ+?Ce`T^UC;&^DUEXsT3A~P1%4j9 z#A#Dn?CKL{1%=aAnO<+nx18xuUNZ<~?Oz2(&{^$$>5-1<0F?Fdh$>@G8u#sFzWapgoU7>gwXpZ<;w{b}<@IH2$|JEEFXQ zq2N&0rpG03Q@?aoMH^Z#QIa_ z1PJqdDD%40EPHmBXei#g7AhaKbv(p#ao^ua;ORjIeA88wm1D<*GEDJvtiPD=uqyHT z)2;S~Q>852rq8(&pfIisSO6*tl_|eUPEgW)${OUC8eJKc?5^9lSeaE`={^yp%j9*X z6|k_p%(6Kt9|{;=&mp4mMgpbF+e8Yf^1R2VthAlNp2xp-K2 z=U$DAfGe2Vpqq}9S0N%0f|Ebs&3klMmcHRBSE9} zUteVpU-JX&yLF>=7ZbKig0@E?S+@jmPkqXIHEtSI*oK%^Tk34u7q7HLmPe4pH|NWTqo7eHnYjiW{+=D`JgZ^*g;=( zk~TqeMnzYm$u#wCHqwKnKstMg9gaAFi5L${R``GPgdIHj)(A7 zRaw`V*-678taaC#mmU#BC#u;`dzt5SKTO2vAuyM>3xSjb$^ary~?yiM(2 zpj%kIqmIH4?HJwBab8B%^T1B)lZWKng;^0qvOz{B16>J`1tuaSbJqUOQ!RJ?d@D(c zU=Nvix})4bW_!htk?o?r_)yt0q&6kkO*t7rgim;A;}_-RSdp45A2I}T@S>ojO*g#78dp|7x#3X@-PW7D7Dw?k{`H{cZlSPeMs zrKR&a$Kwp|9I##Ad&0Ke^th#-88ODfd{^C{;8q^2tKaVtpctv*S9Bxf-1zx>?U~QrZS{qOH8XuG zvcMys&PQt?mNL%y&#SC)#S96e_{H;<3T2tP-+lXfd;G6|Y&8j7`v_nAl6;CE)ZKj1 z9P9e4mspOkEvuZ%koXPngRE4ffJmt1LNbSv!8hU^41o{gkdON|S;N;>DK*SW_;t@9 znNorH;ohSK+D19TQy3Wjnw|31SILvfe4Qa(n4R$uK4_t!B7tUXN=Tq`{tTuL6P+Vg z`xALVUU+4#qB(E9;u)>9oqX38`@7eDTgR?$PCIBpe?Oxzcz0E!Zt;bsjVv)_wNC1H zSG?w$X*rg*%UUg+YK0ZE)L~XdBD;Z@YzVejrakF|snlE?9JOb@y2>8^(;KXC_YP~_ zRkC^sdzNPn9b+sSJ`s~5P@1ppD+rONx~=aUkJ!jlyDW3^OiMM%vsLh93EL~CKlr|{ z+rTYbtYPbj)hRNl7snaT>Q{fThU#HZAgn9rh8`Qfd874x{Yk~+b(USs8{stB7- zcnTi|c-jkf!{dknJO!dt-+XMZ^q~j0THnJvtwF{uBO?e+(+H-n@sS}nRw8cG%NJUv zv)#*uF?`yFc6Qri@4wM(V9X{Br=8C!DX?0S(rO5^p-+)e!EzVR_HyApsET@!8*L~* z>FmK1VT3FGw2ICN;kZ_s-fYDarddXwyvplAD1uJt8pRz)9UtumDlBE-@it#Zr}Ixe zd7>(p&*Tm0b0tku3!X>CAo$w=Faj7W(h$BhzFui(?X*N212zVi3_Mv_p0KX1gLc_B zpOTtj3`5l5X)@O8e zt$52u+x@C*t@pa86z-(#$-nuDJ^rEVt!YoqrVJ&lPKJc%`gy_}OU!d`+=#|@@=C$H zjx%seSkiIAkmS&ib$|FLw&T4&u+f2G#~s#}gd2JpKj!p8-RLW?X@s>*r1)ZQ@r3g+ zDW4lz?Rg;^#*D|0GAz25u}aEIrDSY*VKJ7QN2v&b*}8wa$x1^~I1Mdw%Ab)OBxFRh zif9-))sht({_f)%V(=6O@*|p;X+J1jNqg|)%TIn?b(YH#N+DJTIpj~*STtUo)@1#^ zcb<>kShSFm@|SrXhc<-wShi4yVq7!#tJ+J zL?2(s+n5BaAlkx5UH}dsN5rF|c){W;tYk*lFlxNc!g(e4lM+Kx3Z=55BfKv7<57x) zBp=iRLf*;05h@a2cmpcKMP) z7XSQlDs3e;^iqZay(vs>w7tK7o>g-Sy(O#J=p#Q-r;d8#h0GX&lInsUCFuYL#fL&A z^=&w1OSbH_k3RN&`^n9pwJ+cCRr}!DJM90g`Kba@DIfPGrHd$~^)i`L6fJlH1>&+M zmj}e9+z?2>jI~cks(!wduvBzyOa&w5ZwgdiB1(i@5#fY; zs8EKZ@9FLK)CaD&i(VwvvjTciTEHBTlsbwiR-Z3l7%y%g=2m{txb<(D<=n#&)T$pRLlUBQo zp-OA_*udLwv{G+L_+yO;n_l3XeqtWF;ECqE_=;x^c@_~@2~FV*^yju3V|ZT3oR+uq zcMOUCy!vB|hlxcqgqQcFB2+BeMhxAviXZTw@T(4fi;raqJr6J!)h@9ba|!;~6qj|) z>(entAHhW-NgLG&wz3aR7rAMx{mv4H;8jB_MQ3@vdAf^jPb|Yv(DRb(?V9p%@{brFsO?1!|pASK1 zp_jjhNjV682bJ%|lKe|bgt(%=3|We4TUC)nh_Oc8o)}!vAp(d%jIp4j2nEr2&!?x0 zNMl1|_Vh9Rye=O8C7rj6BOL3k8R zLS!SlseKX9Y3%n6bxJ*c>k8{H`m>UU2*njq8Q>@UgYNL9BEdsmLRk#Dlv{k}Ls~qu zSWrH{uJZ5!T%E>BqYtckAr0B1?a^sphIZyC{=MBlSeW3MT`%K4;c4}#dWG^_WT1D7M$&jTQv`I^mm{ny(4_>lY11d!o zwc4Pt76Ld5QHmFB`9z`sx~UsppFgglsD43rbN{6=Cz<4%)G%cXOxhD$%IFEMuY(C%9y|v zNmL|1Zl0$FTrgBFq#-alF`I>2N}w(eQ$u~^@fTAwsX)-Ga%owcEJng{5@86Lb)LR? zot3})q>LluBOZ`dh~fKSm7#@?U(|;&^@(u~R-Jxhus9D7-jY{>qI!8G$-^vdq!&HJ z!+7CMf*_6xHxFNAl?iFs_R;xJ8%i1K@-OY;U4*OiMKs_kdFtc7EfXe=ThuPMcnZ2s zn%7g})f!?mV=x^sjtPcRiU=P>W9L`AL37dCU#p>WRqs&}eMLc%kq70K(`@{49`8w0 zV~!W?VlX5s-nK+6;D8YUH?;wMoyJa|n0E9x;Ln4}_?&VsWn15Oo{e@jsP769)dtUT z;_Vnl`P=doilUUr^WnCnl&o4Flgvx@L?0nz|8LR{>~#%~xYA&BB*{va0jg$%wzE`FBFQ@jP$&7NFD|nx>k~ohw^RhL$tyECzNjMas_S@Do(w^n z92qv^S%@WCxpG1fA43RfX6Ht?^;@3=8ic2ei0A@W4AF#HRQ4>MWq8k+&c_xDJIvmG zx(&bk4C^_2nsv*v5KoI5ew{ED%ZlO=%2GC^wt3|}X&#!Y9gacVKTfl}!zv#**Tz0} zp6!0wOxxLr8Ndh#7kNMyVELk6(SmV7JhsFK*ng~&GO6>jei#|{1+}Hi-gmqXX?)?= zXJbV*PZ#rJp>o4j3Cis6d?DWinw3f@gGh=HD-Efxs13=Dm53H2#W?(i$5p-JaoO9W zeDLTl?81?JW1<=Dk9(sCf5IOob>OA9hX+A$5qu;8-l;0+1mD>2w}~&_cW_tTVchL^ zb0s|RMB=Kt*f_>h#v5t8gVpn^EVmC(?6S)d3a4|?h>zZY8)2&FMfr5iH}%{5;&fBL zRe`5xlD75z7h1WiO^T&Tg(HfI*TjP*M7Ij(YV&ZLL_`P?mdj)FDoD}bwDcCV$Z6-B z@X4xuwd(b%o33Ov+?$kyQd-N186+or#z@4@N`6n8MH~pKxG&OIh!q@DiJ3 z{Z+qbI5d!troao2<;VPj18Gi8tZGmou6dd+JHGT8S&-4FiP7FaZ#-eW;$h#l_dETk z42S&Ay9q#D1D|@SRnC~^p59{{b&`6(oalry9LGgHUAQQk49F`#J?78}BoKMLZ_p~N z_v8{D13Az!N+`tnsDYXaWt5lxIeq=QjQ4QKI{*D%Yh1He*TD}OQy09ZAgvr4;y!~N zb0hHS?RQ^d4;H4|>zf|4|66~XbT&8(i~?2i$`Do%z2~*Bv4^M6aK=jv6)N^y?X5pC zlkYKGtZkOIW;^BXt@hWi`zDEy-Q@u%`)#XYvLW%l&k-1Op4Ma8(3hS{^~+*x%SD ze6gSf(Z$~rBO>?|J+$H&+JK`7sOU$uQC-xoBxVz#se2=}TT~saLJCX9cwK|SNyStl z6g%`bruv-^qW75k=pnD_DJl&d#^{fZVJP{z@92Eeo@?A>CY&pZ0^yBrs!M$<%S-X< z4i^xC-$oLi?BflZLw}E$9Djr{(1%Ud(c7RtZXtNRPB+GeVIS}X7re5HIDQ-}k0|5g zZRerch-VO8l^{Q%@G!jAf_x#b@KE1t#Xw`1#k!1b`opuW|Ew97D2mroj-+_T#FVee zg{Ozv{B7ovZ(a<|m={m^@QCVCTVESK*={HwV}Gv+Q{NzjAd&4nvYS_Nn50Le4&BD-^4>N`ka~z@W_9@(k%hD z1!k}^Ar@r9yakWkI-`qHbcxPbgEX7mS3iBfR?2jTEBs#soW&fC@>zFCMvY}KP29&RKh;L5|HB;CrJ`fc>? zjh242+Zs0wT7H{0C#-PLE_2dUl@GX&u9#-U^JZCbA@3YgaTYY|3ae6}DU9a(900h( zsKWtF3;D#ry~9=%9-|Lzv8GKU*0@D@$PLB3$t|5JYa3=u$CgZ%(VAhy7fw?{>YMUF zdzvQVz(DnV{b3vW+Cw&dsAe>PTtNu$6c9TfIU}LfyDD zy_tAiSPHVB@)23QkTXAZG&G`H(n{?Y&k2;_TZ$faPIShaU4uu;(l;QZapZ$*T z5tSr=Z)$$nem`@YSCht_@|%^gXer&N*mn!gI{^2?-3xt zLje^4icf5_{*V3Gn#K~gY;Wig%&w$RTH&NWLc^i+XWP!dy;zMQ>=F{yjh+E02<5`G zdD6Py^9?KS9<_7$ZoG2~AWRT>oVY% z@OrCm?6>8+tG;|MsG}^R`T~BgNJ`)Eo!3}-YGbHJ5Qm#g^B3+|XT#rk#F`}dGY1mZ zC`*Py`70+>7BNGyeJPddWMq}mF;=%UqrrOKw!#Kpw!nogzA=nwp}3qoU5O_T11MW* z_m~ZR^Fb@$vf8E%r>$#%ur7Eo7ixhVf^cziJ2+2ZS!3S%UVno1zhf4MV`W@=q$M>+`CWS1VJl%PLS7inqx{Q9~VVfzVH+?XaiSu(z+u%ak(Nm`C zBp4sH?tAcXK@=}BBGtiyjeL2Pm433`I!BYLSB6uxrjOhXbZ;Hi5qKYti4}>_`mUH~ zgKu4KQ*L<5I_}u)GKQfh@8Q5hW=C9dp)%4bJNw?Z`Ll~IGaVKCyUdODqSDjy&{A8x zC6kY;__HrQ-#&lwS(e~cCqBcg?TYW3E!m~AC#t85RBwku)}W9v(A+lZOP9urOn||= zduwAhRSvCJV)8%LLD5bJxcD&rD}usMA*UoUP@#h=V&#sH7p3JO51=UUoyE!Ai}D-v zLZu)t#_XjJz}2V^#?@&S5Qj;LAk?z8mcL+;%2aK4PBFEv5e~5a)u-OoOzcUR&{63Abzjf-Ue)+a8pJm8hizjHo|HYC9$pFXDgXxz%x_l z*v|jIy*B}~?79kb*BxrEuIgE>?v~V=XUldxAln%H00-wWhWCgWLIQb^fec^rAR)6! zAcT*E1o#Mn_Xs#V2!Q|z0fKGt?8ugF;X#%qSyQX$d91naz3>0mKBwwdb#;}jRwLtR zb?-Xo?6Zfp*Iv^e&c0J|{s(_Irhno?ar_WEL({S6pMNlJ{-*yNgC9Kxo+>1Si}ozy)<{<#3w_oJ7vBAJoc_DN5kv2I zGG2acILF40J6vCtDQ%lVtESCa=Bj|B zbO*C;mzu}w6n`6HN??B|1?C%+ISDxh41%e(A);%7TB&)iej(ymg0|8&cWGEI_0Tb1 zO{1%jnu>D8PWMz-#txAi?C2rO8AGs%%NaND$u&`)a|co4?byQ4tct)|W=`ZlO_>eP zpN7h0bO!aP>2<=(m`A3Ao=={Pi+}IG0&i431aOHW08T)$zv)6APa{uSkk(}-g;qw@%3j0@ zP5sOVTI8G&~@>7YbObcUX`=tkYZLgNU&P%OHbM065 zi*2P{Zi#e9nC-=|Fl2cmrhn{xvGYV}JVS+RWJvk z;lT7_?D>H|h?#-Gc=~%@j*f($jPI>i!E?6R@xHuny!@; z;i1MZkS9tZq%MaXy8OFNoP~}wRDrB!TN_iO^nu?NNgrR9GKi#qiZ>+3`&*p3%3vle z|1o%9gO_+hsLj00&1KojqmTBu>rm`>f zVDrEv#?0nz(-}Aa@cU!yuRR>osi;aj{3>4sHLG&r>SV@D#qd)fcsdsT%g1tjcl#O2 z0e?HpL&b9cZex&OhZox0BHNS}oBB%Q3M1qiVRHcdx^d%=d@#1W=LmH!6qi=TCw=Hk zuQG>_Gn%@TUhRA7E!|Zd&{t;FgV~6_sbJ{iIoj*QSZ8rQ+ns&%o~L5&XC91gH2B`r zCB0Tdy2=HXsla)tmbfI3wGemf)=22W>h6MaSqoK&dvW8Bejw(~b>hjt{HGAKax6(h zi;%oAk1%2i7R#EW0_YF-)Dt{j3y>Z%N@DlV3dw_Z0^p47&I@Ovdyd#qTCJ=xWbG}E zfRm z)Z?s|3&Sbt6xbYuQ8J*jh9IHG91K9nfg<&4d}VySV8_^LA}3R{JWyy5hO^8ncw#|w z*r_aVgX7)3k&EEqB6C|tU0%+_(E!`vBto+-UUU_~!->k3?i1JHTm?!(%^y1#^FRE~ z7`m_+cU%~XL1)iM+cPh2NxKch4AU<1ra2tvIzk$c1RNR6pL83rY{muy(4b5C?%-&S zplPMi&~WVg_YcK2?|cRtyFRHaryD5VGK!Y6&|~qbGZFvpgE0)#-N<;V4W7Lr1d8%o zT${t#2XL_N7Mi&+TySd*(#gZdlLj2JjihgpPPeM<&%p8SrXT-sG%niLg*hC1OOpol zk^a`vGQS5q5${-6e3t__N?*8ZBl>C~ZPxCPHf`^bHhGWqJ=%N2&p(9wx-B02 zYk!J5X)8#GN7D%+amOO+qLyJADA5t#dsUxR`rHmlBlOFSSElf!rBTdKK6@@OfIbE7 z6w-8C@jP;^hw%-CP@-xoZu#t~VsNT5Rgq_{qmq$%%9HoyL$J^JmSzt`+@WG{A6*+M zH+Vj)zuD&@9s{&u2tNV#NrZYs5ZieIuDK&Vui(P9$pE57`ZoF23zn^NN${pBqb^g% z&Y$^eW38ymojOC{=;r4^a2P;^wJBpoc`e&ui`A?USVqY}ISN_^?{T|%-*iUp=l&=D z6T&#xib<@Yo0yxGa_}p86;7iyn9m;c)gq1FM&b!mC=?yaYa*OJxBW5!#zx%}xFSHU z;o-RTr#>8$`_CrMgW?N~n&3MCt#RmMppDY|m5<~Y<*uoL7=p4*!0*<@VPQh~tS<+m!J8D+FE%QydrKT6B3MovST?OYC?u$Fy_ zfVALX=OF#kMtbL$9ndZFZbV=B$Ia>k1bJ!1Nw3~a^nRK8r#f-#Tsua|koi?C&{^Tj zwy1o-yElvwRCRc?zqIw|3mPK`KZ?2oeH!FZkWFX1hw+E6`;||}*)P8~p8EdR#ey_r z9H!Tn6EMovJpGOkt_}$(|8k*B6wgn0-WVV2?n6)%IFu;8bF#q#&-58}J2ORx)4)TbOr$Aae``aToeH zoi*N?k4-#}q5%dyTb_zs!jLd(LWyW-(+P#3`1BCc{Fbv`7=Zx?G~c>Cl-D4C!^3I4 zTBgiICunKrZXL%k&BxH-e3gH0xvbV)jJB5JhLdD4oNGFiQ{!krt1NZ!&;a`B{m(@A z(NnRFPTC2feAga=Nx;MO9{tzzprc{RL;;Cb-TL(zETB=l~^RxKAoF#x0a!!H9U z2FsDoX&DDcvi$iy!!i5HJ#il4)1tIfVCewfdGfZx;m79fcE$Lkt=ReT!w44rsBkIN zv`c|l5s0%*qbMwSU?k~V!l16ROtb-g2T&B_jXCl!#3srZZqCNY=MG2jv&Rs`PV9hK zy^78a@LyD6fUjPW`E73tnl0{`i0M~si!;z-7E7t(%U`D=4AEBU(1y-=R3o&v{#_qB z7~4)x#oQZq#4|tox|mnM_3%8EJwGl$U>vHsRm-shA-%*D2|%IL6+kB3GyCz*?o>bu zSPCX#-|16%TxPM5aGYZn1QOdv1o%+eAX>$Vox0@Hh?^Tu@GJ7!t(PtXIxFnNptiM{ znj!sYy|H-$od9ziM%xe(hBvfjI6%vs!iWY>;?t?R8wTBnHkM(Ga>iiz^};9}q-9fs z*Mf`-WNyz-}~c3ceLY=uqd-I zhl1I~iuAA|%}Q|69Yg_YEhZj1x(md&2>K}%l*NhQAx?vm8ceq_C z%jR_U(O7FX7T*6X?prf%z{N;wI6_%kaQQ}>5mff_)ckFm;;El{RXqI*_s6q8{K`1~ zt6vtMc>R|6$k1$Dv`>=W70%SJaJOwk;?j&QA3u`Hq9xW z@O<(=_bHgVq{-#n`8zkzC>Z0QWGf*fxnHm-fY^2oC(40^Na*}>14Ufxp<#X+H* z`*2P{k3wU1KF^gz)_Bq~9&97gkk9eF!kES>XPz|Klru&GHQE@&9EE^3XcVio2?m<5 z3Nob2YUe`qhT5Nw&knRhcpk(>8?VY)FKnWdhhWBHAuWqCA*y46;5H z3?l=}`NeS@_oZA*80A?v%Q2+G-F9{~+Lq4q+OWg9cg!+_b?ls&jh%3Nx^oEABJN&? z`Vt2_9P4QPoz1N{^)K#?skdGqqnl9JA9L75d4!Tn2aSXRe zJ&y6Zw9WPm(7v7j^=W7dgW`5dava5T@77Im z>c?LmjaQ67!%hr0=3{dAaNPDoua5IKjmAf?Vi&O#11<6v^pw{1}lW=@}Rwwfw*tO$9AHwO(|#n;Fv^k zOqS&lvTU_1!obii$B@IgccUnU$;5~8EFG-&EqLlu$SxZ+l9NMHL*MQZ*D+Ss0*impFU1IrFU z+ePvfPl71QY2};*IKT@R{=scAHo*`|fufDW2%rLPdv|}!o}AeGY8rEb|b?;sEJqp}X@z zujq~D`o4WJfMq1gWhtc?mxeOZ{nL#~H&8;(VhLza3ynIByMpZL*WO$kM*~uiqI1 zuNf`lJ(zLK4sOmQeRSo9VN&C6|I2%0XxDH&x-b*7XeR6KN|$U4ZPLowCa&X8T!=9| zj|u67a_K&M78>+o!m&BRn?eFEiGyX}+G%+g@7)xWV>l(yV6;6=y()zT%27c@T>FNx zWPsycm_os@jGVQkUueH|+qUf^axQeBzEl(nlj$pg_1>}Y2+ZU7c9^=fb`vPOL0A&P zZAjlChdy`!nV)ucpFN!la68sfnzW^J(!=1G*YPoJe8pIdUW0We&!!y1mVV7ZnY->A zkKvm};wK2|1$_haqlBePGk?R@T{^F~ndB;TZySyj=FLHJI zDrZPDKzIMl6ZANtOFbc~5$YAzn+y{c(9Q8y5$e$y(Mzo}NJx5znW)ICWT1!9aK^}{gTCWxZ&q)+U& zc!(+EIJU~k13O*fAdEv=Fl1+8w5v9wx@=?0I;VCE_LMiA(F zJvQq$-yqCMp0r#jJ@XCibzCQNNxvS}5k-aD4#V!ujn3{}dqvLyMN z6!crq$q&cvDnjUzma3vtJtosTaBMrIU_gKAJWL-9LVsRvNMGBh(j8Wi=$kRe_AsA< zVEb%SSH8iD_Q*2;UME@*5q%S~f5e3h9{hzRAPXSL0haoyb7TlL8wp!3Le)5+Lf*)l9B=fzbiFv#Bev5$DF?H+&4nk zQ3TROigx_jPd`Kk>Vm$uzegFl;KQTa|I$|4Zpu2DW|*Ypd=Nf9K^l+lczuJm&=-sP zt^nBkX_P}zTp0)Pba)xWqjl~4Bn}-xhuDc~RXe%ogaZxNDmw9ylMlFCgAi3hE|qhc zAd%Dk5hSenEvG6w2@ONK_EcO$adTX&rZki>uEEI>J2Bl^&{N2BAvc*tLF1a*+p8T0 z?htAul}f3{aZgXnf7uZ7ejpy)%3Bk^Nrzd8jD0~t4;IuZAN<^Uo@8s!6zvRGK$Ph{m~4;;+$ zHF_6tck~CH;q7$?<2T^f8R&QuF5&fhE0tkvx*g6%cL_Yo_-8a3o(|SM^PWaX9NG?$ zk&1GbmBu^$+(g5OH*BJF zN2!0b%@|VJhzqW3&KMI$vkG- z%YPT`xCb{7>)E~+;oNTf2`L;EJrdW776j=stiqwpS|G+^KGziWrZ%GQAbc?b%~JVR zZS)tG^-OF}E}bESISWi5t8{uJ!;A~As~GLwknvm!PG)21$u@f+gK~>4V_qt^&uC&g7uLJ}`fC zykq8$6dn)%`t$GkFl`{+z(sIk7^HPcH>a%Imo0IvIFfZx4kU91)z5bSQy{>&-rv}w zuiQ2&ebfzt5<00yw9}FFNe0y8baZN8;?tTT(N5#L;H=-Q0Ja8jr*LnaFmQ0+qT@ye zi*{TuIL2rrNJ7(ti*t#ALLqX~@(EfA@f=L%)m7A`hM05`!{K7Z)qcbefu927DRtSf zbb~JqHPe*ET7{5~#5HxfA_WEpkx85&Xl`~A%ZY{Q7!K%>R@%17G+HJnn-o&r^x{%U z?3Q!+G(~sQ@?1+?TFOzlP&$(;5tu`UA5z_dck+hg5%4P$B}5~T;^lZt128tYkXBKJ zsk^J&JT@=|j+6((zWi&);{NZLh@1Y-Xk7PwBXRBb5687XFdn=9?qKZwd&9B!`zGSd zeYj^Zbb~fqm&#~~M&jueAxUMYV7Q*BHAk=p3E5{G(AP;IEn^u1;bD)- zvhQZoy;mspriOQqDuXFl3K*EB0P?rEt@KHrs1L17r~B&5AG`3Dcw*5H@4HyYLvjDd zK8K*u_YEg?;A8s##?QLyNWViT%v~H-R5i0*6j~9vI6|Sn18pZM=S!R5Lc4KeNe;5E zFOJ|L=a@#M)B4cq&1tkUjY=JYVP`PkU|`-u(>v{)Y9|GVMvS=r6tSrXb0Yogg)P0g zEK^OA-;2QjWon;*c9uz6Sc?X()+o$23?5~?Rfsy~q(;MlHpO?JR8Sd54WdbtniNr{ z@)bHr!~Ifcfp@yKFh?0%kwsyw+E9d)`sdNAb|eJT8flqz-NqpNDD@h~xwqrTY11ff zsMPK_&Y}!GiB`Jwlx^EA8%A*~Gt`{QF_|-@!{n3xD&gE^Gdx%n9YUGob8vAIZBRuA zGs;X8j$di-2zk?6KzWX!IHbu$GTl_-o9naSw#hYI=sn)LnB%}4=O6(o?6w!-kT!ZJ zK0EGho|gx7g{8kjfndR;GVDh59aQmBzqsmAjJm!CZB+cFK6F)DNBZ7zLY zP~&IkbG)4A7gJZ>GY+-B+;L6$PVasKIrwjjQ}G4_a$jR48o$5$$H0RI0B`>FW0Y5o z>vCTe8B=o%#D{)oEZ+BfqjBe+t#Rvh9+xia>1ZR_AR*GE-Ttxzam~F)c_@R}%R@6h z_Swxo6>5MA*6AEWVs z-yMtF_ihHyt-LHa>J&Qcu~g$8c;r~j($qKIcMUI{3d2QK>ChPx)^tOY^KsiZe1c4R z2h;^aIVY!AQ&c9Q6iC2D!FTzWe|0-G4a8f%WH-)>;}WeOot}6U9L9E@k9}YLS+kJ6 z8wWo(7;pc{EwOWaJYIMAP7CBkVTg2{d_;TheA(f+=4H^9_Lu(gjdU()gj6z%S|SnC zeFD_Xrn8g4>4U!mjec)a+(ti2r~FpbblJv&uh;C$`wnqSJHXS;03Z18GcQ2Ob}ZU;fF>v1QXpy#B6TiM3oOb9!`V*Ih6)X#2|#$BujV zXFn(iNoMIty0oyp(fH+mGZD`|(T>;Oy(hL#pzxOXpc1MI|9ige(^QS&;9pLd<#edl zt_bwu|JsO8|DycucaHG?(f=DfDuq));R)SIkil@|?~PcAq}|?)Z@cBe`14OZ5P$UQ zh4@Fm{z1mKZ=s6sh_Cqd{qZ-x@AnYEc07h9e=pfwrOeIs-8s10`}q`DkD0lhHcr#8 zt#6-r%iFBfnWLNc9gfBUDn5j3dKlAskfty$Z5*77XFoR-&zu;I?UO^XZO54Wi#gV` zP!nz}<5aXoE5|&gqnvFYe+?uYNzmZwep>a*i7^k~95F;m##Ne?RXh6OLXu-pD*t5_J{2SR8 zaFkv=HxJCkhdzZs;ZEIg%Qnh^e!9X631u7nU6Fyt`Pgz6qz^#jL*2OWOfMdOa!ZVi zHsbo-n-W(ifSUTv3>Ol2@{KQ^iLnzWsgtgyPH7OdIix}M+hTN|osH&UPyn|EYoZEVH9-Qy(>{oTS!(&^9}9x~tjnHW8FCVJV&v_ZU|l^0QX z@KpEEOg#L^Bz@P6>#v=lJca>oEO9)X^sU+fE<0zQB@g{_ME-z2N9Ye|(>QFOA(*FI zaqyD}25CVie(Az%@+w}WP65xx*e;c0Rv^B-75CXjeCo@tjZgiRYvU{4@l;&cb~2v6 z`z8eTzIe?aJQMdma46;YVchYvD2e=(4dM5f!rW%J$dJGTx7;^-7_a3N%FCTZXw{;D z6ar^a{RAhGO2MFf8_BcZq$S~1T`--ej}=XdkiJ zA`z3;=IF_L&}>QvRvBhZuY{uAI4xbWyzDUP1?|*>y5Kyg3tDxcdmVE_Hg1a^M>du= z6?~+B@k|^-)Ob6TupC3~J+%%svqE6U^wU5UPreokCG#6B-~Qx2jfnkA-D3mbBN2?} z!VUkcdU#)OD(x#}TZTbfWd{3Uefnlu=7;I5_4G8u99;WBd5w_yZA;>B|M_VdDU;W1 zE2Z|;Z(YXG@~q2=B_U}-662(|&-vafd1S4$;+ExYzNc*JZ*O%%)5mhmWR}URbXPN# z?F1hiSk-6s#`)wVP45Uo`I;^9-S0dX55D;%@r*5OoAN;#>2a3lMQP(43~kg4^czb( z58K^^E_xTn%T|(7JR&zmJCUL=?w_ z=hzF)$(WJ^bP##{HmXM-RE%K$rT(G#TxM9^{xw3`{zv+u(w|8`aU5BQZP&W*vKgn( z;B|P1b}s9nsAXq}6XkA9%}!S3QHJAL+M1q3vg-ywzFZnJ4`aHEvxN~ik2`rWSLg!M z_V;_Om9rt|rNYZqka?em*_NBtN==iSFycF6FhRj5v3J4kLZ>$%QN;AsI)eAzzv3SwDEbrFldviIQM>Xv*q2 z%gh-^0})>R0;8{-e9nERyaz4wYy>a6YbwSNu7fAsdstg1YKHO(rTYzgj7b%)>ACTE z@|jm-O&M=0^dr=u;u9YiUnBGe!6TU&g4Fc$gIe4tx87Oi9G$KZ+E#_k)9Z2=l4iIaQ`4K{ z!s0|}U$zq(w-sK>+5p7W38}<^p@-gsbX6FeD7l(8{ZRAIazEGYr95fvcc?Cr6pgVy zK<~2ai?j|M6BlZz$}@DqEyr~X*Bs0C%o1U}AknL0ysXx`b+LIxvoCd$W#_%uIxIhHO`i*lj77ZS6&GS=ZZQrX zov~X=Ti}S&F=#8ElW<(;7e?anp*!PqkG(pM9KAVCp1v_ooZ1&pJ$((&+v4Kf=9qI} zy`-oL^mnrN1{a2>=O$uiesfIEZjOb{rr5rD1nVKEfC8?}N~KZ>tZl2?yB1CRLIdVi zY53__nF;3^4=6_GV(XrZv2_wx>OAhc6F_wjh@V4*^bX{SW*m6(m2vXq4KVItT66{L zxxmr0gR%ekKsoMCs5@Rsbk>mNRzG(3m`wA|vd z=KLzg*%Zs*d-+ZFbCg07wU^WM#H0Q5%Xk`|$lEA1q+gMnF^`AL?5iZ3{3%rW>f}+I zt{W_0SF}&K1)0AV^7^QQf(LOK#D|wCj>N5YtF4pJ)rvd^=+GgrdHwm=GSP{LpE!lJ zC~e4(M-|4@0!7QEW`jx!$=uvnoIbHHjvu};jvu@+W-i_tXO7<&`yYKpoIATaiB69v zEz%+`X+Y^mhv1UV%?`!WkG&$EAw2c?eKB?Ju6WITd*kk#wxor2JXs!eK`=f-gXgd*o{LcXQ)#g3qz<3q<=Ce^ta6?4&M+@eCl=a z*hk(JovAwu6K?=Br|*r6M_(6HC*Ba}4!t(^ZM!GF?oBtxUDr>PdMLjzqF~*Q4r!bG zlbhmgYYD6GTe`IyfF7JnMVUvdDu2i~@`|o+uAP$xCF-Y-3s`Pp8K+f%FoIwS+$P8( z&?g2@^4DPiw2Se4J$}K1W_oeNRuSQGG=c`uC9ayc3UFW5t7DIKZ(z0;C8ZocQj9l|{uc|ZBLa6Ce2z{0y zB&#f>>v$`e_;P@P8QRo|w|vvd=yc}dQ=dJR!f0R1lr_O*6d6?F%1Dx2cc}DCO~{Ja z&~l}MDfj)tW$1a_0%H*Am5jsHrlq@Vd#$*F#DVyvcGA|iR`gpZ6nc=4`&3{&>&7N6 zd4Bbmp3QomI((MISg!OCs6cChODU+B#7u>~NVGI4ve4hgwIPMt2`X~s;yBOw3sKoV z-xZo&0@+3?OT|-y3MR*t`AmYO$NG?UkY1NHg)(`j&_nv@{vJJm!f_VG;`DARuty8c zYmgVYNE-oE%6r<7$M8befwT0zOJ@_Y?U28V9&rlAcR@kcUFD)<;N+)s1cC~>=Jy0> z(sZFR2b+Y}0Ars~Dj8->2EvrFg)+1#z^Lp7QRcRlmbdT%0Qv2t)lOf{?euj#wD}nflh@>Ave^ zfm?o5AQrx|%^Lw_q^E;&OV5BjS_TgdD}q|+(+}33ZFDXJH#-GM<&(n5eU2kZ^Bg91 zth$-JOP*{uSf?_Q7Bmf>YNHevq&sc(w@8T1yh6=GOIJ}AU;h)z>@AUZ@qS>I`V>0X z=SO4b!Sm3l6;J2dw&}@0f0BZW^_2DtWqrDUY0(c7!o#8#WBLM`(mjfrbSz|kPnSYT zXE~mv;3k9pf~0~Y^Hoeo5Yo8V@C|~WIccRzb4zCkg<+QkK4a;moFz10&a@F{IS@CA zT*aq#cnQ6&K?Y2uSd(L{Lph8%yaPlTK zoDBxdAhU6sj9m#)4KnAFvLUbTV5YTn>gZJyK^}#fZgbuKO1Lvk&Nh=h`-I4KLZ-`m z(#q5-RB0rGrkmf2H-7cG*tvTqKKb~`JjBfQwz@7)6t1w&R7^0ddoGPHLdJ^?z=@*T zTc`yvk8|uuuR<4TQ8WA!B>#{;`;(Bnwn*#DcD0MEDt3KP+2@2--CoM5c)1G=R8AMp zma_B%9I_Ex@@D({@TzdMOKghQY)1CE5yvSHPxPw-qg#PjqH-JC7p&^e6G})u6hmF#D2bbr6g|T8NpmkYtq7afNvbk=+NnLQ`KZ z=w4DSBUcJ@44b(rA4ab%j-bWS@;Eu+mk7C30Fe_n39a_5%ft=A@BoFG3Y4}bkzpj` zDS-~=W|X#7n)B{APRF9*Hx-Y`&pT2&gP z>zY=>=WYydosVz*zLT-_n(27plSji}oGM~j+Uz%fvT9B;xp>cgq2b!}bq&~f+e7Pk zR|MF5>88)^2JE~yUjk3M%Jsdo*ecvQI5SK?ml-AabjK! z3iKP{IqAT&O3HF6^Xd1SmDWv|%lC37Ni;K6YQxNtNL$xd`E zsq0DyIy04oqXIQ%GFBp43ifCMJ1m(dHS_u*50Iiv7fYSlbI_a2tBYf~RqIjA`Q2P< zItW|v;+g~&H=0RjS)LoYoe)U^iXTd&(e(Ep$zz;U1;Ci{Af&FayMa(Ty}_Bd;l7#p zD?j>d-1M45@!%r|rnCimrOmL7^p9(@IRLHj zlAf#STfejY(s(%}XRHX>7o;!3O?xRTCzoI`Ke=;LbYqn9t3ovbO|@<+UwB5hw+LNf zVuhmiBof3;3km<`SQ;VE9bnKzK55eL2R_h?qmT29sk8p$Zn2}N`v#B1-`@O=_{!nW zD05kd4uMC0B>SLr{dPdP&slGAY2mWEk2!yewH1%tzc=3dRr_Ess75+N;zvE|@3P}( zCDel1d}!eu+OJw0fy+MgJDX@UHS)g;v*uC=jo7wxA%=(NV|pF|5JNQsC_76fQPfNg z8zs}o3=(ji;O8+ic-iej9xzoqyCWvGYTpLvbPFgmmoyAm$rL8|BgY)Xo5rM6in`iCVTOf-*F=T(!YK(w!GqzI57WA96EA7re>gxLIyrLc5Iw$jEF=oC`oWO5buz&!mj#4rk;&_dcK`pq$4=22XdkxLy* z7KisETc@y)V3Hdopr3s`fQN&S9)3?dKK_&T7(=!6YFaTv@BXW8|0RBO>#xO|M<0nv z6^%`|IIEy(qF6U6myqCqplA7LC6|;3e46-j z6;gHGu=B6>zH9utxUPZ!i;8G(T8yvzH~V93ry471mKwqiNK6pK&fHMUpG0siD6y0V z2(QX$f~HM8x5Z<@1=fX&0|fmk+6@lwpm(v>ah9bI?l_Mtqn0*(c0<;y7MBsESWyy% zfyHz70t4!)@#1kxbgsGG3=p@Gt+*M3v*aNk&+tWYC37q%`LGaK7R<=_x(vSC(7zkg zC&!{YKb#%abGB3grHt05*%+FD5n$AdN6H5L=L^}1;H#$~Hr6pn+3ksGnu+D8I`Oj5 z*EefHDpB93;w$NLW3}|~9wlJ=x^u0VJ~IXm^aso!UB-8xi`nyd4AY~9W^OwKzr@$< zGL6i$F7)F@zhxT-;J?`zob&_*nHcL;3AswTjIE0Rce&1;8jfxrP(xeo190^8aFxdJ zjybqQZ4IE%dui$0arpO}@$kQD#!-~IzwfE~@Ob}6T4V92r_X{q?EwG3d-|K>;rYGL zko?k8qcBFBP!z6}rs1*p?`7=xxBeX{{usRY!_@N^xHjW;f8!5g+dDspS}mu(`-|Ok zC?N%s82B8XqCNgXv;3StdB?SJLl|NhAnY&KZIHb)E2p)FBzcZl_AP3CGpuA5{xF$z_KO=(JO{2 zdAt-2q$REKDrVDLvpQ`TqGrjYFPLh7zpDrFo1>3Tnaa`2%fGda8D&z@>o7GC(Epx$I$G z3U1=y2@|9zDsj?XG%o^DerQJ87r|MAO5poJ{aGs-YXObCl9+Nzmh8$jO?n_IU)^T? z6cje^{b_q~%biaN)>DMH{JNHX?a_?G)YFXP??4#;^-vsT$g_|Qkgu?4%^}*uK+lkmO&nmT`imp=|J-^PnxeCc2O{n+xr zGcga3x!p8>aa-|3ICJML6)BXS244%K_Oqz~9PC_(56_=X;)vjxXNKb4|8jTCO|{5G zVj7blGCOmor>X|TF&6onF-)Tsa?Ixj=A4yVCs;&I7MLFDT2{J(dP(@}`s{XwABg(S z^0Q;ekk6S%#snv)m$^?DYS94ktRr_sfR~5h`W>6XOMcs^)ytVvJ8n_?U*VMtZq(yD zI|7`{lep$M0u6^y+SU@l0VXs~S`^`?Ox|5d2!E1K9DD!=Jv?t^J%5vAH9gl4E6X~D>3oOK)IZRZ0lKdY z)J?xjC(}x2t@R@HElOvFs$;p;`%1yOeybAcb`VPXIs1rrS+8lTdc|8ewDdK+L3@t9 zqaBa@>sA~a=>|rhDoxi2kM=(>h^2SZ3LKnd{M@3hr|O>~;v*~-<@ZCM_qY1G3^zX^u7?#4(UUj zQ~-IkK84YAC{y}3l{h$hT7zXuyPiT#*+<_o6rcR@b{rXjjS(D5MfDW;gnKBVg;OPE zgG@J0ENo6;Dh>pFOjSAi+a@^Si9kE|nM*P`uAxm*rg0GgYsB|{-|xo6!LzCraP++? zaz!^~$#Mm|)bdlG)}XaHrV#iHYEw(*w>=Ceb@xA^`=Kw4Nkc~UFu=G|Q9tMkxVHnPOI zR!F=WOpVJJ*!*=q)Av%lnxlH=YT3G;)|+2>(8=k#Sr%8@Rob9e00C3e`YzQfCCG>d z%BFL>^o%qylug>UsnF?4f>7g;v;_y-k^idl3(n6knBSjS@6lJ%tEsSwzy7w0NxJri zs(S5fo|6{T?;1i{CTG>^{*fsQE$s`_mY@aHiWsUmXlI>rnRqmESmaVt=?}Lpx;WCT z>rZ!>eAcb^mHjmg|L{(H5n4aU&3E3XKRH4j7?wXAj1T{0GcFJ{r&Y8L{#yP+&5^j+ z94y`_{eGjT1p@D#y*-yfa!f1>IUzJc-MJ^2dnXp1<jn!kVQ|A>bd_Z0o%a+~^vai=HtDGExkx=0inchK}-{1xuMpBlbD z?)bTS z(#nir3EwchBkpf)rNL@w32Y}h`>72mon0gw(mKgOfy8pn)JtT03I1e44qeo)3N-h+ z|LwF+Fb~o8zXF(Pxfe2d^<3ZAV0ki~P*2>|u%rwsDDRfvuPmuRsZ*;XuW1OXQ^Ijw z^JnzUk8*MRmiGdDdVXObKI|`uIqyI^e~Mn^u$N)S{ZnT_ycgec@q6QfC-iFpD}gMZ z6jp7va^t2&(HC7}^U&GZZj-#K$Eerft(JVimJ;r<;Uoi{}k)163R1S#8} zgp@#DUkYE?p@y~I(YG=O!l<@(M%?ct?RAZY6A`(QUY;a)Z>S}6iD@ZEJ7!Q(3kqYE zYzb0{_XYE(3uF1-)%Ejh z{4rPBb-Xnm7sipiP4M;v73j+voL$u_xs>}G0ZU&+`*V(|?WjH@G9&k9ex`FS-ahqM{M7WL@xH0!vA@HhRdF+^ z+Q&s=so)sPc%)rzB@|cZrSM_}{=){UMmvi*7_dJqLwR4qG8C87{>8G9+)XqxjT6|5 zjK%zr7FNk%8oeVcO#vp-ILmaLO4h8iwu}mi{8tClT^d$HiLcv~#dEb>g*XM>(zqA* zny=5mkDp|m|IU$i9P~7HgvFym1{nJdAP6d&>*p6^_u@1x-G~FREt+E#y@{d-flxNb zDO(Ha2MG#cjw@-e<48UDPu~DOyNEmz6X(i=(J**udBr8EjU|?T%8OTVQxFa1Uf|u0 zJHHDWsSUF^`LcF5GG2|71c$H)T%9g=lAx7x;A;lct5Heo(tslV61;eTD3qI=G%5Wf zEZ=cYe7?&*D{tzn-kMe<4<+tmePBf2m9vxD=_$=2rDLSIwmlM?9An}sjlp<3S|b<| z#jX?AAOe%%An$C3Cw5|~blY+^RRB%-ESG1z66Bq7EkIS}S}qA5?2X|r{6|{Y8U!iB zfYjLfERVeMuHb}<{Oxc2YjBF`DMz5z{Q4{7uZv&X^jZuq37uJWM~*fIeBBt4<42!y zRTG>9)>;*Ftx$tOiIKR{+4FJmb0& zC%%mvcYG&*5x7JYw7B|0!7GDuCD_@acD}Py3b9H9?05^*GWsr;46=~&{w4Ur0Q<8a zmOL5aGprEG(w766L%;rU{xtiSe*M~sYvPqd!?9<;0TqH!@ny1vQ`l)a;UAY(xXQ#S z7?v+X6I}DmB@WrdcZ~bAs>xUIP2sOBDnX$tF?Afg1%5fJUJHh^yr$Dl<;L%J{mF0_ zYFx??WcsxBRzq5^om@Gf3@0Qh>&JF{T|6*(Yi`rb2^`s2e6kwkgt&Ci6DY)@wUWQ_ zb0qzN_}Q2LU~D>v5c2fvBeVsY%y$_xG7MY*BPVt`&c&dhTno>gI+S0$2Gt6MyH9eF zkZWs1*8385lZ8B$%>_6S7dacqvrQHwKN<3!gH_jTBzl(fQuqQ1DA!;V;1#3fPa8kW^h$GeTkDdQG=t7=nH7I$sm!fBo2a{NrnHiyPZ=WD%;oB7`z@ zju&~Bv2{g#Uv>x)^q7cG(+&!>b}>j`7M;gi0Gvsu;K;$lN|Sx7Rrs^7i6&Abmqu46%57_!KbY4EK5_e_ zsoinD(~8IEuZii!!FY0RXUtRY6Z6|*%2NqszWi5&BN<%Wav2RoR&iyvl>E7u)OcRsL{SIw9v{2tbGj(Tc= z>@6~ubi=tq>K4cpP$x*G;GzQgZL6C868uR3JFtdJ1rz35dN1>?eD8A|r(ot6J%q9? ztrIs5kHimLdnd!D;<{=H${Jy*w~2*wE0}_)aDMXQ-uU>;HSzfLuK3*SjySY9o@HA{ z3Tj&BWdRh5odS5J%WFCvQL)ZCxMrF<123|?dZGmZbo|zFtmUyY)tJs-59@I6x_-x# z5pXwe?w&?455zsQ2jcE?hhn%pmE%Z%im{AoEwd4SoERCx0{{=#E;RAA^h&Q< z2(#@dE}#9-dz6YNDdJ0};vfC|PseQ!VyU&(B>sKyJ&6F8uRIo_w=f_26;9~XlRLFQ z>RmK$-uaS1{z-&>ffQB?-AX6|XdcHvqC#{>uNu!(Tn5(hSigVq;_~6+a@N)d8Fb{X*o~gre&*^95wMUrNj{yg$8Xcl^^o^VSqP+nnxbT2<<@ z>0U(!C6sAYQdsj;24i5onG{=k@!g;LFY#r+eT4K%Ys4qP{Sn-Wh0ZMEhyZr6lsU7y zERYJKv#cqQH|>0Dw)rLalMO2bGA+_d@O>`W%YF(47Qs)06cnF5g5?bpTjP6nA&d)} z2S0^^-v~~`xWNB=$8U~5ym)hb;LN@hlp=nzb5;;z?W56Z`^7^$CI^p1GtVJ%zcVS+ z0M?~&B8F3old-S??K~30IDs2C5*KE7QjQF)x*&_?0ri@9HYY73Pp%8*ksK81LcOO% zR6^-QjK4YQb2*`$(wvwX0?(X~p&+lO=j!6XXm>ttI(sCZ+`2nv+XI12wJ;EMo?P!?g7cl#lQP=Ty0VTM%wt}=Gx%Qo+dzq;)<7{zfS0@_)m zjDa{fHxR#l^4|E*NAHeVf6Fq?#iqe$8E?+UmeHq@nRX04lMLpUIz{-jd_~axRW)(R zNh8bF`T;JL=^m%M+-$`K#+Xxcd*kHXo;ZFHJi16%-5d;|R?&cQ&f{A0Kx}_=Q$f{T zRnWYuL56UCx$k)B_tFuPAmNrb?+3x!y{HN=`BUK2^6@-}t#IVA+r z$t@aJ@bjZ(f1VwI^k+TZ_{byif4%)3v>D-|94B{vr?nUtx^vK|SW4_7f>>PDobX92 zDJAh#UJ}SJK2Q*r1+oZ04Ye@3+z%V%5a^9tu8qI6d{T{2U8=l zY2YYA_$0!kfOT{CjXtSUj&7bgM0y2K zOIXKwEM)bZZmpkDsVca17AR{D+_iwxE-fK%6;!U-G=ks2W*X}DXY0kMyQv$kO*pBz zt#=%LHvY-K{4ETq6JHcel8-hQ;&Cjag6FOs1+iZs^N1J<&rLNixvYOuL3LdNy}k;H z^S2s`yP8g>mJIl^i5>CXJN$+SCWV1c&(Fkfoj(u{Ts)KGwRWeSmPs?BbroEWa8g7J z{P0%cEL$uck)q`@jXq_5;h1@}g8G8)fz59`kph=X1`yKRx#RdyCPvs5xOVR3E>?E7 zw>=Im+!N0>UKUdWn-BzW^`I_w}HioMoNYg~$7tr-E{xP8nA&eSYDorG(hc63+|P5TiXC>TbLn#!*l>V&o%bMQvc59jdU~8c zCTn@QRn2;^mU#jI|I>R=S`9wuAJU1my2Ej63M9{1-KLh;6X^&I!o8n(Cbk_rpS1UY zHkIOeh=0a>wvqPbh6L&@*U~!ccu63?=pZ==?JPsfLv%I_RzBqA9V-6%;qmx;dtR2O zq5a5-Pse-D9nGCL<|IoBVDV^SQn<2?%eOTHSNG+g0&lA7+4xLT1hoiTVYnh(MZi-2 z${qJroc~DglaoMN7n7BH@vmLmPK+-ci(5`T6g#Gl#`Km=F@5bMR*_b2BDdc%Dx?a^ z1SMcKbFEN;b>p~#Ww6X#z90>^HgoAzLGCknks#h9Wm?&sM8ZOPia=L487t{$TPlSe zC(p*+4;|7rChoRH<@l^qUz*qyNZOcfHck0!1uqHY7abH1a_310?$Qcm9E_|r*wkvq z_w9OlT*O`ahX+3#M;CN#6&@`SDHU9jD?RMm-R1K|WoEla!8!#zA3HynI4cAPpG?csqqdn@J;!TWRX z{z#0rX5zwi6EVLX=_4*Da}X|f1f@Uf*AQtLOS@BfX&RMBo(qsignV`)C}(!bKY|yb zVCp7oee;K^+*IC)`+xtjEX&fQsh^-d-s(Ufyx-i&UfQlu*0i#DFO4C;=s-V9W`YqI zFv=8;WgI(teaq$>V%y+A{PKw>lTmUO)NL(rN?O4V)<<`)n!qtnv5p0n?qM*&r%U4c z()UAu{L<%OT6JsVr%99cSr#0WIq!ZQBU9iQ2{BOd$O*Tmc2 z{_fbsSZ;xMPY3+WEB8@uH$HLS?l`b-S3LM7H|O}Vktg|4=^Tx9%bdjWLnh_kaifzu z2GanNCg+?WTmGKvIGAG@o8yQWmU)D+;=jNDXHvxSm&CxzA?e3af=@QElARffckH;B zTj+9=00QduC4u~+gOx(z&)sSJnh2f3H-M&hXO2@Oxelo-1_L^_lq)@Ox>%wDOTtoF z!TPyhkouvHSB?y=GMic_<+*G0v4dJS%ND5L03Oihf$uYJqwV*kxM;^8~?gg;=V@%4<^T=*xO z0_nA$%n`j5NL}0^1ld_$T~%FSCwB;b6!U|B_LpPtV<&j&jC3nMP(DWH_w}X_!g&dJHE5`I5`}MF)kUwQTaM^68Nke$C&8lXRKff|lpv$nZXwEIAvii>RY( zIsHOZ97o?3$j_G$;B+@rGD@ib)z8cE%jxnT^<*4>jrX5WutG8L=(m(kF4-0(WoaUW zHl>3NGA^Cu_>(wA*ku*nKrQTr`T020ZpI#}8A#?=XjLQ&(N*!xcjHwLJrS>e*CX*Y zzxzSjFv_)=qTFX(Idp32 z8_6t`M7pern|Z8@l6Z7R)(s7d9`8@GuBMLmpC$c4tp66;I;xaOD%y|FxjU&Zd{08`!Yp}SnZeX|r zA$bLZIltG;UvkzDRbyE`@A3#6i?7;qa{FX_=FZ*mv6tT#AAjYImL45lRojkW=APMM z6hv-7AllhhcL6!^!~g$y%fCsh?22$vQmr_KqIrMJFkYBV= zm=!+A`x;~nVVRj_%))>LU@)wtzE)Z>-xY3J3YOX*wOsn8uqtcj71BE7yJ8#C()pso zC1+!~FHb5I?#&=zQOayCxSGyX{7)CqcJWRRz(~i*y4Pks-t5LS&wFTJS?d(saiqXI zx2jWI++8spo}P{y_n(gYAAB_4_@PJQ*tMJD$aUKgKFTF5yRB57*DP+y<-PsG`(x*! z3!+xmgDH26avx`4>Lku$alCVT2!+ zil^?Y0;-iHZMPK{aS4X8i0%_`5=jAUkk|J5L#iqxS42Giqk#$Rbr2M2G&(aMul>m5 zardJ~;xjM5Hr-k`xu<)Yds?}=;oUvAVgkC`k4(p{A9*&**7O#A(u<4Wat7<%Q3y?| z0ud9gFA3xqJrvef0IItcAd?h^E)1h^W_(}BcX_}3Z>ikNKrMjq9vLeETaj&9xK?1M zb>V;guC|>1^bZe`3!9sU4M{bM|73jNPNl-?VE z;}M3FMpy_nQ2!W+Jkgskv;nU?g9oJ`o-YaH7d_bPFh?bD$y+isjA&f3E6b1!Sqann zV9LvfocT0RgO$qah285=!0}!_@h6o7(qvePL9v<&r_xr^C_d)*-V{F7@#ZgMLffjz z%byVkAD1B%=PBMiHP}Ho+Ofs@q)(R6iN%&KEjbaS+$63A)q0ZF4GO~xop}AbAB&5V zL-E8buSF=y>)6ut3LoYB_vGI3_?n;oD2B7tnM#WCh7tLvdNYyd>+r@P6?9-<63G80 zKvpXZA*0mK3C77NKnjA-GNZh+Mkp4nV%}Bn`a_+rwzz`jFU_+0Cm~DXUrATvlEOor zf>@W3g6IPwF{p&GtUs1}ORE1mCiHM*e+r=zX^M5Mh#)ir>papR}_8G3Q!P34l0QN|N7on=^8o;=6XO9J`79LO%qko=pBWRQhrq;g#jEAt4e z1@f{2OsLbE28kd7*2|aF#5HTFu1jOslrW*-CK#iD)KFW@CCdZ;GPQ227Rsd)zc_SQ zX9`6v?GQNvoS~W#UKzHzH^?b$d%q)n78YH0h2Ut?py@UuV-O zPzTkRxfobH5U=^2GsT_Ff9CGR5O@3i><#>!&@tXz2;{v8q>rC}XxS(dn*yh{1dDt2=moD0$Wo zx-eWTTuQm%Ac2!9*3M-R?<;|_MriBM*R5p1VD*7zfn1O!&O?s;09H&}xB#i`lKzsVRi>bQTnB8djp`38 zm>A;a7BH*H0e8`p`MV1ijtf${!pScp(9FxVicEcfX$L;09#!#5*av__UYgYxIP70_R8+{91Y=QC1VKuCNUqUT>HB+w+MUaZM$u+*z z3)&^=2wvdhLbtn1lkJFG@z3WBS}^O8YL;m4tre`d4?lUyt9x&AT<4@nVwS?;P9yuG ztUZ=8gcPXin#YOQ2^P)!d}HPeMPPL%k6>(0q3!o{>{nxLEY+&;lbm)w}13t zeELiG#rYlXp;K&Uh}|DAf7h9qI4!*>Lj#73>{i)v%6p`Dk(y9nU0MP0FWITHn2xqp!c z<>u&4TJ1#?LRwAmu$&aQxi##b?{V6d$^F=&#Mxr~vG`PQ7 zkirjbil?BR9-yy>692SUYW}MTX)EkQXdq4U2bmyQG95VO4=z=(F)v*TMIrP-MfVzf zN};Cz^}5`^ZJ*k2ZlL!*ZJYVThpS(OC?n-Lyr|ZIcZmn-{HgoHckPIO^4s5w3_S%ku*2&oXGgxD-19eUs*nU&@H-`NBp5EidXKm&q7~lY1y{KWER< zzv~I&omUzLt0MWrvpH|TF2kSGkHfQBDz0VUY1!sZv;s=I3g`2^(YJqqnnZ!EC7v}f(Wwi z7R>KzxaO}q@%r;^^J>r*+Ey8&tp}hsrKYr*Dm&h;7eH`>us&oNSmbOBkV65+BE^+@ zF2cCFzSUuUu)n2YGY_f4h2^^!S`Vw1;ddU~Vu!<+xZLpi4G#+HU(P9BlxU8Ljmhko0t3L_{+g%$gl)zJ2k1DqdKrRw9?{~P1~q_8&$9Y znA;ju3IOi-x&RY%w(pATFfj{?cSeQ6W| zN$8}G!jz6Huk#0Hd7CU)LCqI+m&iYU8DdI#SU~jiT3bv#yC#}-z+*9KTXz7Xve1a( z`MLPgA9-ht9Xy`gB}eJ*<~pJZk!OYP+1q!<5B~Q3JUwPi{QRwtCB7OXH@hc}Rh_^6 z55FdkU$-mfdnlBfe(vaUD=!26LRu;0+{MuJqe@<-Fj9P;f{i9|LZ{*0zH0~kP3dTz zqiP0q?j_77^f649T?uJF)b$Ac_1BX!rQwmz(^e>LRKz~zpTsvS3A z0ru;(5>J#9JL|)xH17w;`j>;O)1d)PbcV2bE%ZHuGMHHsVL$^h8|q>;*ijx_!xSQ`6>Kab`6G;G-ZU89Io#QI z&+ACW0_J$2JCLsA0QtJf$d`6VsiUrU`F$doLbr@VA*gx{2LrdsQKDp={j;qYc$}Ay zXr1j8$E{^H(mZxrQ6L+^477sDbXgTl z^VY#={A#s7@+!b;0g;(=12!~>2^8~J4oCAhXNY%unU->Ww^?TFhf4%-jdt|s$-b0F z?;MKGZ3x_Nb#olQfI`S)E)}k-zr3dKRlMbWZmKsfaV@;1Aj(l*efERynp5PT98cP^ zb}x1wI~{L$_}%dJEVw{_-Yd@a{D?KXY5n`(^RhU-XEMJ3+aHVDKXNkD`PTN@9`6rs z+7|!yzOPK>*0}Ebo?6lLx)C&s#4t4lXxtUPQj~U;5QKxgLCKhid-_D_E zf1HuqqGQS8QmuwdV^%_qRE>99sg6wjC zg%>TFCw33v*t~KuS`YZ4Zz1;8h2r!iL($m9*AGPdLyTeRCx1gfNplsU(7$HBPITTd z9PLjLc|rbg%(f8)FGX;rP;Nkf>P>;Pocr-io>+|L@uCE~2&E?n)XZOIei_7&-s4pr z`#Gm7q#%kbe{7Sys_>O-d8bvaK5@)6ZJ#OO=EIN0tKR<+VkwKNA$_JVOK+CYiI08N z*7$$^-D~5U{>6cK^DjJ{eBp$c*SzTUolazIeL8=3CDzKbnnk=<|MPJTkt8rP{YP1TB zF+N2O>(ta`uw~cbDsN?={ptC{t)-%<;4)RM3*xvQKyN$($0~XXD6l(GTBoV$*kZ0r z(a%8~DC3frG~k`rkj zzI=Q=F4Lz#>*MA3B64Fu1=6R6nos)UYUsx!&r?|ouL_dpFk<@nlekIWJP^(I&>2s< zR4*wv?D6%XU!d2(LzUz-yK9e~VXWhK4@c`i&P4AbR5Nd1{xt#mUJ0nf{oC+(v<7b5 zU&BKFG;Vu$E;=p8EuPMFd0317pAR?#>X-LU-*^a>M^`L-&uBE>elZ%;g8 z4|~fpm!4ZiAZsCQkzQdm&hhZA?kgCjRZWAeKnS+m75RTl2lZMvhBZM@gi4vg9;FppEe zhl6E16m1MN<#0J%i_nYD zLNq4^an-@)6EXsM=#VQkP|pEmArz2T7`*pd+WgVQoWTpfBB0N%1lAK0A>TU|ht67} zoMpVD83QLl=Y&F9E2RE@sN@rp_K~9+Xt?7@gaOqxlfpKLv3$9cm_g4((gTBda0Za>h%p6Z-ofLY|4UqaD5N z@aejIZPRUDq70dHh_f6O-r8#dm$|eYTFk zUlk-gz~7AXPQFwRq!&vNWv!&?#qR9Hc>JrEy&h-h?vGThUP(MFEoPqA2x59CxsyO^ zi97JRiHPfod*^JlPIhC_@4>pxJTkye4YZOW`Wr8Z*m|JA3l*I*zbv>6H0I{P96QB- znTzHeI*>Bu!y*s;X)mpRz0MXk+WO`?l~dRrCExh^vFQG%i?lfPFm=%pblBAeL?Jx{ zcjusSzXLb*?XwIOz<@Xz;Ywhm{z-soUGFZWEPdYmvtzOF;B+((=#rH}YFgWuDzFy< zlCg8_QvFL9yIniv@A)00jWiE2FMxuyFmkG+`v zSw9ofQo>|jUDMVQe%i5=fv19-v}fQzagUBzmrW-9HfBajeoG%tp^?t0DoIdFPd?#slkWxaztV znBSb{mjFV4N%?*=czgvK>iu-a@iN_CejK#8anFgN)`1PPD{wCLynHCS{%rP#=PS)f zUjCFB;46WZ3UW30vu&xMz#%#?<+lw-``vCNy|8hJHtl%v`@wpPPK7~Zf=lq8KZhgt~Td|T~F&vHe;(d`jth9V2u)65EUYwIj z$Pa>7L_*mr^;lLhG`;w__C2J%`45&jXC=`jq}s)As3D$&9pw4T$0DZD4iDlUId7ma z)}51hsJX?Ls#cWu`9dL74NJnUHlcytuNaN?K`hcEGjswC#xHm9p5xkdPp)tbwF>ps zZ7D7*9sdnj==Wfu&pOXmIx9Q9f2+vzfYtS13MxoDSh`TxTgM}Q^?cqJmbkL|p9`d0 zWPBZrpMG~!ellDcozp-cB%Yl~S6r0>%zR-_%E9*1mDuE5dXQ0 zva~mx|7biWA}3=H-)|wnw?J_E`7u{2z?ydL8tuUf%Lg^r&b_W2?~Qqd&LhrZ3n+o z)+wX%Zes#e*R^4z?1jcfDDqxw(Lq5nfNf0THB2wY0DaSe0bOTPNV-idXm1cY_4Ci? z1IsvDX97I3HozzDnwkTj8G4dBYonnj<#}_?g`~hygza$l)N3t#g7+ze#_?R=Cr>Dh zNVhI$8(G;l-;KZhz=I_tWhJL<)Dlxvr#<;UZn%#4m%jrH=E+26 znF>tISb)S7*4@UtTgRgJ$aFN$Y6p@9sx+4Ykh~J`r=+;{?~EC=7Zv$8<8OlVSbH zTm_Ia;#j(pe*2Q~So|>7Agisr_-aC_!}j})@us0)eJ=NV6G$`JFT1K%DOtj4Obeu`dVGAXRsjtX5k&Hk5_lI3B%ELxWQcZRAYi%I*~z zlQdTdtNXVf-xMrfCvJFjy*DzD?vdm2xZmiG!bt*z%2%$ovF`dmlWqL4!2bb$5f;wVo$f3eqWli9(i2$8gS z0SMPEWZKJk;E!gbbCJx8bU=QzX=hhhlH+PXDpj7kUe6J~dAt`(d=!6E+2b{!I~A3zk00 z78mO6eicmj2j@WCu2on!rop?D)y*bt%-h znemq4h%LAtk4!~x8iIgiPNt+*>?hXRkab)E)ODy?oWxHnJqv!1;s!ahs7|4gf(+T; zIpuC+9M^-S0UeikIFMb@BIxz1@n}4aVmPsY;@5iCZ|E+W;W^Og${@Qm|JnA|8z!Us zp|jk}G$ON6{p$j7jA1+s(mh_fQSYR~pBaYLMZfjRiL0Be8 z^HmjcRUruhi|-kZ-c}UEBWGzvO~s;}Bx13ORpV1IX?^|te4#GKc2;W!IMV5V_)U>qAFA}1h3Ce9@`y$x?{0&S#OpDJUn#KVz0hyr6_$FaB-DcI zvo5OO?lm_JlsL^fI@x`>Jv z*E{Lh#kuG`KE>FGgt-~O47|^R{3C`EY*nyB>af=PzF;YqdfA|6)6JPA<-W0KDvbWx zZBmqw){*xTg}Z#NLef!&?2Ef3SoT`+OFNDVn`Yi=MRu0-&jt7p>0 z?xE-%L9zP|VU(unzHLy4WoCJo3)I~oR+s1L2^u+nQ7UO-m!5;CcA+FZ_Wy$XWgX;9 zUZ~38Hba(EuDr~UzBPO$WK16aDD zH*TAV#*^oxJ3~`a$eeKE3Swy;C8`8X;&QcRPR48ih2ZOlT4=Lg$CK89KsL4v!ekys z56v>p_ogrS`Rlm4kykUQMDuVhmlOO!82(v*zEApHn&$-#wA-uwkTkMR+wZe|13um3 z&`2vW3N=+!(8zSZLuIgT@Z)JXWEM0Qb+^bo!#2BOy?PCg_}2h-PSDwMr=-~4paNA!eZZAo9D z?(V9jW5z=tBHJL^iorL&4ci)V>(+?F7o+*KzOOB?n5r}(TO@2itQxYS%R>rnb|?>Y zXt}p+LaGV~d+%7pIU0Tdi=FFx65gc+8&c)XP~9iKtL`rsGS4~zoZJd$N675foLl_2 z4n<=G1$KBgV=XJ2kaX#%O?h|qf;6M%dN%huXmvm(;XCk5Se@td2=>Q%fi6lqnRbmn zNZOcgh{#QY(KrpGO20aPU)s+*)b*|xs3Xzxp7dVxH#P{(Ik*q^HBQWziOvM*Nt^s^ zE_o~Qtk4AV7*ykkl(jPn{A#}!ucT526r<=apeVOf-rlw|@8l<_vvX5pJ{wP2=^tBz zg}T(T_swsMJGMmgnX}P5I-PV*=Hq=K^79N?%X&em+#b@~sEkcQVv%ncjmFSW#G|K) z7nwr2oNUKh7g$~93mG6Tluy?}DvN@+?b{r^;};_IB>K}YwOgU|o=gAx&o?Y7z{`Mj znY8Ywy`#}QIF+<4;PnbZ-JZ*Zwes|bnr1UF{qxAu%g?=XGothiY;r7GbheZfBkvA@iGXIz%HCZsjQdpQmtfB7H^+{qrT zYRyB2mZrB#x&zy`N<8K)tdBF5Z3>)@b%76Y)rsWx(Ni5w|G+K9%dhf-p|Kzc99N87Y zmEm8@YoQCz_wS6x1IIJo;lsw|UuplY58_d1*Nn#9^rcGdBvw+8@vd~zZ39^56YkSI z75|C(Ey+Q$ch1rCa<-OoR4Mtr>Fu8WXW5-A|&d!3DaaRg`bv=)ebdX+k zTuNvapHRhLHe6ju#+Sjtr+f5bw04h|7hN|p6kM-nQ26p58o8w}jSc@i(Om!0iAue% z?&KiDkg@D%`B0Uglb9(BDmDgXi*ot#mI+u;aYW zp-{!|%ycvs9GCZ{xthT~vj6(yQd3l(mi>4Ut9|q4Xq>|poA;vx-ta!ztj=?pVA{3f zOK_~X5a*DmuN)dl+0rMFYc$SFmQ~>-d0F~E8Mw(7&d&smj)$N6qJqFR@oMBtFztc2hvE$suCwK(~S^ zpv1q3A#s$}6~3uZtNVPnMxGZk)b(602+}Ucv3g2}Q1XZ=SV6^}av!zn5R-pOf?R@yP{GaOkFGlqN1y z<+i$HXLt*@J`eW>vsQ2Lb#Kd=3#|brtKqDW?pa^qS1o8FlaV0OjxciL=4~ugXPRZs(itlv~7qm=1 zU;WTf@VRY`4n%L?mgqftG`bj|gj()IAB$vTiWLA>m2*`Bkl*>~J$P8s_R(mZnBf`C zx>ous*iG40YTxz3Re{f=?A7?J4r{b+Wl({y6XY_|<=P|nJ>1rqBYqP1?UJ%y_^`w) zH5eyO-X_n}OO7wy)5p8Uleqgs2+XzPG@o}>Ije)^mi}LEYkF|2LON0MH|>9Db~@{l zFU;!(0l{x0RS-oO$2_kdS}S}SqleH)E& z>n=3s#neuPA?ozjRo!Qu_46N3(17Ovf7f`i)+f#qUplZ)Ev_Bbh*}ZWjQl)8(y?@G zZrr|ZbF`j4%bOBc`l&Dd>aa%Cim+zna}PQ6$Z5rb2UMfm!S32E6&?H2chd%>)kxkj z^;PKWis#C`^(dN7rnumbm2^0AzR`su9s{Grn$0^d?s$GG_Z~rW+V2Wh@J)l zynUZr0<*tW(Bei=A+J$he@M3Hn!knGU5t;Xl)0dWHYx9)LHJ4brQs z+VXrs;;akQ#lI8<@k&0mPWTa`W*>_j_^f9<6X?I?Gb2L8kL^7CPu=_JFa@G{R*HH{R0P)H?2t$U(j?3!M^&PDSg~#nLgUCP5x;S~dy@edWE-!8+Fo@{qU9 zTXse783;A+#$(xp$kZq=auCB*8eqh8bMLn39XwItmJ+a>_QeP(ky1-q^4Dhstv3(z zIh)zReVbw2R<%JM@mlm~$$K?J;$z*Z1h`iC7T|jBVzlL1Puljz1Vf%ibnpaQFAPn-p0|>5!XyI+*MiomN+=X@o(;!N&K&Fus(UT zx#+k~p{T}`;E+ExFgF*y#|}nsABt|w*-%?ReBukPwqu=;)|a$74z-=|_~Y|)#Q@W1 zPVNe+7=W{M;K7BdqLo!}_oq-%A4ZtrxP6iQ$N2XTXT`GLvy!?a;OItO&IAs)ni^c6woSTiwyYNQPK5 zPk&gA?+YCiF0M&4?mcou#?R-|=gWr!qi(z=3NFomniJYoh6@{kX)YgD^z|Bn%JM4z z6&b@=Xf45|7N+jG3(-7sHkvm($y45?z=byF;V)PG}&+b%MXhUKCc_r;)&(3 z5#$=7ID%`=PD?;=QyHZ4kUtfs1IMGMYkl)IDYX9LSJ_^=K9n_2Jww~A^=-x!W5omW z7fJ$vR>1g9dIwx}apdG;9nGaShoR!xExC(;%cQXI51#yzkw*J10lFvmWRx zLFkC4D3^aeJ2hP1_2aTu*a+6j(;vhi$f@XR+6!u{oDJvLk$z!ci>7#!&Og^9#jQ z6ca-BeF+M?yqI5zAVkio$5V$QM(~z)GOrP`u*(OL0qqR6Af`p9and)(TrhF&uIIjY+YQk;iy$69 zWs5TX`mlDrFIWICnYh_wV2$RkcTcFbRNBpL;}NIO;>4@PZAKv;kod1r<{xM1*V0S( z5}Nxj1pGD%Q;etPu|!)Z(>uxyB!K+m>3wVFSrM)>NJo#fk*16@<8%8F$ZMiIu_<|9 zcT>w&=q(?aR%-|MBh>OunY^)Y$YGPXKRiDZbIzkw;3Vg#rZ2>-r%dp#nMWP26(G!d zp}1{UCK36A)Mp%!+8WcIT1Ho8?=JA8x@V5iyrMbG^P&dYm|9ZlThe9(nPGeszn?ZZ z*71D}Rr@SpMOiOWs8A_?awWb*VlP*u`@#$;>*J@Rw{;WFhs+G%ksQ`4DWE5L8`2z z5pcQXz0;?V71Ah>3eQ?$W3U1-R!e{stynQ(kPAI?5tED)wr`H!Q~T3LmTelQimnb5~7CUiGPMslHX^ZLeYEP-GY;%8EFH*=(?z^tO|AG!O`iWD~oZJ*K z>?z{V)tx$!SRPt4&mU(12aUEuqIFXy8mAd#*&#g0kkm*g$q zDx4MnoWv6P(;R}_cYJX!9-hH-tUQEPv|s+Vyju-P6f>?JG$a{BRD_d~C6D?elMN3= zoMS107xX^Bs9zI{$B-fBnV`aR%$xV-PfL$pg?JL%Fg zU(~SY+K59(q21M`+Y1*Q3NW@BVr(`9pIp2E)BE|6)RpdQ+IA+G8ToLdLlH=jCe5A0W3jD0lt%1b zQzzrmx#}z=XIZlY*9aBfmkl|KR9T9&iV)X$&Ag^MwcJf;l2d4uGg_PEX5P^Wrl~CP z<-*m5r8*S4x=!5eU`*4Soy~P9-`OT1uez_MElv3X0`Rsg%fp`xsOf(a{@A)D`N=OY zIyn~G82Wi-t&n}SPN@0#a)Cnd@Zi;+Cmc{F0+q@_H}vtRbL`vQx(!jm+XLs0@d#Yb z@LGrY0n1Wg^Vv31((%P|YC^BqjQ@Gz1Zh$rc<)>W4{HV9t{+6QsqU<4~bRU3T+d2`woqHla`)Q{w0UB5x0hk(uQEv`s70%0q zGEKaSNH1`pCa%@mmjXCA7_oa-G@jYdYY8j9w6FHTZLV!jA+}+cmifmPq+==x18v#8 zH+qL~vnxDbbo@37lCY+){@&zd#MzUDX^q$2T0 zt+noYegbJBN?R7Dc0eepur~%%-*{`ZKley<{U|llnBHvuDT0t2cGnH1n#%|NTtU$N zD978Qm+XAw_w0_w46f>#lRS$9aT2k{DevpJ<+5Iskhps#0F7POMI3%+Ij(k_u39Kn zT|V$1ga@cysau)(4(Z0Ve)+S!)IRpg&Z+SO@#)iUO5b&#E~8c`pyg zg;UYkv^82-_wMQ9Rb`fn=Zoi9(#!8@zi5}s-uDjei2r={QA#mSU4AeAe><2X>yHZB QLI3~&07*qoM6N<$fPx#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(LwwOsoK~#8N?7e4H z70LHC{C<6YGe$si5=Am%&N=4Q|MpVo>>*N{U zUAOx7ZJHp?j5DKud+o(4>Q;AGcb{G7oT^h*|6k(|E#L4B-|!dljY!`hLjC*SFTVMu z=EaZIPu^8Nep7n?MakXg4IlpC75j#^_~MDQ|5Z!Cqn5D8EhirRTz>Bd;NYDfcisBQ z=f=W*)!$qhHg{9yfkYx&0H(Idkua_**{(-28d> zO(q8@y!#{m^}X?PMziRGW%quFy7?0>7<%((T%2ZR-Tras&7Zt)h;q0nz54?yMo%fa z%VcH>Pbm@RpjhIqpMsixMulk(MQ-ztUN?S5$pTI__T2sn^+$yZg%69Y#lb7jJnLR=z4$V)_Q}2rw+pJ9vdgdgmff^1Zgx1+lvsE!{!m5Cfzs%G z#VmI2FWXqyuOW2c^yqBWP;&&~{ z&s%mrX*uyml=*ez%O=wCH!UvrTT0)xWZeGAwDMhk#gl^aCm|Itd@EjVsC*ky@dE!+ z*j2vvtbCPT{uGJr6|a!9x9rK<%D15vFH$R>t*?9=RsI~ADdo>RDqp!&zP71+!=4*m z@f@dESHAJCe92}ajZ5Kzo)xcV2;86eQd#Um<^8)mxeaBv(9JUG*-Z>`7$lBjd7HNhfZl7T)kKytV4o{jdWKP6w|p zJ=PqNT@{{Lv3_5}>Vk%C$!Aw(Uogq8@r^A67VmA?m|p3gaB4|@y?I&%a=hYCqQIKW z^9%ADX&D|C?rq$ZR_T^-dU1Y(Wky9#>5Zzlf5bd(iF?|z?SbeMoO(le74o=c_ft`3 z!K;>(=Ph0jNrKJ%y76Tb35qEDMN8$wp9(6TSXRD?tRQ5du&R2)5-F?vsd3f2JdQ*n zvAg2=rbB#8oOgchk|Q@mQj3F<&+gcBYEAY9 z)68>J#Er5qnx_*ofECs$r8INyzAKK2XMAD{ryscPk#Gt*UhyZU9k}itcid%9(d_+K z@e?w)CKWH-+dxkN?30SyC6ZI(nK}Ee(6nuG3Altr^xmrKr#}?FZbc*t(1uGSil9f| zi1dX3ZQj0nKZ8Y(PS?s;eib4?=MpKQ;@LVOXZDsqfyRLJ2Ufmt6sm=Ifl{Jr;G;ys z=}Rl$L#NSyp*nDjy&y*M{jAe>^h;hQ6gDLtzLIdTK5k##?);ivIn|*#)w2rkhNPDU zrx0R5?w$7(QAq_RA86VhcY^&F04wGdTxS1Wnp_NSjm3L0y{W)f_s_^z6NhZ+_)|h;Kytf{9f1=qIp+HRl{EUI%fUA}*1VOP{PP zf0JEwH{;~3#FIA{7e7ll)aZG%$*iz>cix3vIp;j`YL*^q3Qj#6lvEUuaKbXR%upys zET9C;GOKACX3~^{H?|4c!qp5wyF~JdJ3i$g*m9iyi#DF+0Ps;F8Ryi(W1;CaS?AYg z5HoMy-peRPGhyc0rj+0!s2J{r98?kn@Qgoc$1&%KnOAU?rUA#)(#89(LP>_Em%_io ztBB4!A6roCd*s^cQxA}XGN9tz0>;b(K%_zMkoZ;fs1EFY_NC0G=Y86O7bOra6j}mEfS~=A!c$WEl z83nj9>jJG3ZU^nOE#btDgp*75UvtVjhd1Dre{pGHGf|=YFD*I!c=wTOP^}(C59~^w zWS_a4SNd>o*<U?X&)`lWZj<8yo? z(icgjb5DNWUrD@q`1BjA-ddGBU0iSl?KJ(;uLFM#pOApJjZ8S@kX^Lv_)8fD zKnfw0%X2T{FIsNoK$>w1Bp4h+0^S8OA=5~MEjSkms(h$BPA|xM{9q#rfEC~jq?~55 za7+@NVv}4#Gfn9!2gxa`gr_Xaty{RaaoWKfh6RmQxizpMgVW254>hem(qwY%&Zfd< zcwg|rVvgTjRr1WH_}QA$mp-LT_XfBDGZpS1{_Ym4Yv^jTs<#f6ukkmvf+=ZT`35X9 zu6k!#`6i@Nq|7OHRJ=5+B&Vz?d*zo^MJtBpW5M1=xM8R>%s=FW9ISS~`J>bQ7Ki&S zz7JbYza<~&@GFwGz1!mYfFx?(xB7fvCB8f&K^IXLQKX-`?V3^o-++E;U|ZY?{L6xE z_~9NnB%Z~uY)Jt2737jDw#c0wRM0z0aDcYaOef%>pRmm>~e-gWeP+=-hRCvIk)zLQw;Fs1w{Bp!e}N1t?W8S&+k z%b)EPK0AE0NU+l#AVr2KwZ?|EkX1i zsMf{X@Xk1!Q-7!I?e7)u$ygJGpGQVzoVMJne5e0l6xHMd0{l^fHa56CQ zG}pU;y9Mte?m+#XLygHtucjSuLiOO7CEx zXYvr7dNQxFvF6oJywCU5t+UC<+ePkyadC`Z%)Uc~0@8arWn&60f6hZu!%&$`?B;UgQY7sYq(ML8 z>ip>INU)j4p$&_7U0WJ^!(q=gznojqhwtSSKSq5}tFVd}Y=|9zY6Mrjz}?xH2`;kB zpN3Yv2rqASN^1EtJTi?uB4vsnS;k&92)}|l7>72pbpRIax;7`KX=(UnHfK%5@_Em1)#hLUVQ2NH?p&jL=}_3J=21>~0oUuZu3;@1Y@cf9nW<;>fb z1Fu?Yzs63y|2mNlKl#kZ{^)^Z|HbIPBtt9t8M@yfOG)uyVq`GU-(auQwPTk#UN zb`Zucu>kRKidQ8$Wkc0l$~3=DbRK9_dLBg@}b$}q254>7g^)9Wo z3dK)sWFRj*7eWsrQ5Lb)858xP8 zR^UvC;MGA#(NS7j006;~1PxHiv1{CpA4B12wfCNri_SFX*EL;w_Z$7D_V>OK>7NBy zbfD@P`Eml0f-YLP?=qS?*FC3a?`MKseBzGJINF>eU=aW!O*r@rECMDvotu$-$Ge<~ zz6+=jMb=S3IN0eAkf*h!uc`h4f9CDJF)sBkl|mL=BAEo&L+zMFT&B#?FM1VUA`-8* z(ce5Gff9kj0Z{LXmrzYe(8yPs38h4v4;J>Eh5#A^V1ELUd`h2lSp;y21j0j4()7}> z%Oi3hQx*X{B7rloHfh?u@)dZ61ezNdkTlbx>J8TvWQhdi7BeA5z|4K30H}p~8@%>b zWR+g5dO{{OeIwF8irSZiMKCQ41(Dj+qSMbKvj)H=Hg*QOXnEz^458G5NTc^Xr9>KO zTR9=AdFxT8M-FyBq=cp^V5_)PzJ}8un0I?!LesG9hg8&nj)*iT>9%X~4e%}M`2D37 zq99iokgN*_e3VGgldQag;Z)U-NfttRg}#E;qG<|NaRL6V8wH2*R|YA!d9~#d36C>2 z^&U;Hj<~$IR8$ilkzgCcL!)UJ((VF=FB8Q0(o8TMt{qJSTq05IIn?NvaANX-rfqR2 zd}0c%0uRz~+u+obNhd0gHs0QP=Z|kh`iD^a^0$N4%;zzxe4lvowp-*eLEF}7pH%F! zrwH~p{tZnl$t`(E=S0xLAkxT!CzMFQ*w|YJ>CN<~z{;0sxoMgL4Lp3Ll#_%%OCqn1 z%zQva4QQ80vr_IjpJ8eR>uYJ{d+OT&@GIbX(=_l=BH_NQdO@oX7Y+&2insA)%voH` zKmp}R?JHn=#Va^V>`!>Em05RqwdE2C?i?H>B+SAZqE9_q#ffw05eW=uH6ipQjiv{~ zSvwP+D$6vWEs=oiqPugB+@gUUi|lizXI!*PCXs>u3CCj(m#wURc;fK~-WUH0@Sh_R zVbM9!w^?`g*_x;#BbR*dxZ~6JlUU~MNF2BxkXfEr@(|+76;KdqXx?L%NMk~-Oh~?y zP)H0vr;68T$k~!Wd^wqF^!3#$M&KvAcZcoNX ziR4=$az(ZZZ8qDAH|ulns`#T)M<*ZtxOm%8Sw z$JK2KKMEpIEG%q_Dylho{r*=rZu{RNQthi&EJ{Clb9GFy_OA1De91flOB8_uCKQ!y1Y3^M}>YA!|tbM`)r#qZ|u^{?7 z>^l7jB6cPr4Rd0fCM7kG$asK+p`gEeP4ty*XP-fyAi+TuFQ~VTYnoTSMIFEdR>biy z3P4GMv}}I>gdQ#p+I9Q{!9@L=&Be19)vv? zW;0uo1q$Gl%?IxoTe+HfL7C%u73SuISbyo)~Csw=9OfTcADSK z&4oqu<;=7HTmaGDvd3$85(|x6VN@XEz#aG08<}T5Qj^rv57!8k5*MaB8AxPqA<}qXaB6g+gr_v zmRh>KOy4ozt2LJb5{}0mE`w@1Sa+lDZL6gqz99U|M5=r9JC8+fV3Dmz7f~3v9_pM$ zKu~@&{aT~9RFw`_Yec;TV3GT-V{`5DW?Hu*(tP`a>vq<>)coMJ!jI$>pLM#^g z)U6N*R=e`Cw~TZ-Flm@Zxwp~$n}iV1tHFbUq0g4*f!EDV(KbL9S7z_RB2NHbW=81~ z%iXPXBix>hA|^%~eQ~+PkH)3m8E)3(r-=AeK;!P!LaOyY_~PwEl`O##Z|EODo$aCdLk-bY^Z#@tm^#^ z&JdYz#Y@y-_`av?I1=D?_yOv$sp_qHPaoCBU6xk8Z+9FCx3H*UPT8EtjL1#fb8En!ySjN#XaxF} z-IqdA%a-QW&DwvBUG58JUigv9btN~KS3UB$^(A$V|4T%A{d;l^>Aa>y0*kz&k4^GB zF>q(aEbFZ4TXWT7FHW<|pYL$cAgpm|*yV}o_qarguXvVO@pL5#*=B?_;=tX-yRI38 zUjdP(Ix|GlbFER@eS56KIg{Xqk(m$lqp#-_i@F>jN$l{VL*;9K0ZG6F2y1H5L(AB! zBQhV*DH6-VE^pX#-L<0CN~?Cl7}MQ?F%u*pg^-&#L9CEZ6Wbu+ME8jRJ zUN;VH7@GZPRrJ+8$M3sWzM|29N#)O0RlTEwOK3YXDnvEm!L5=R*i9^dHvhy6lMqr3 z{fMg*-D|Yd?o%QGjtSTN4qbIkD&nr2w=M3(_JRt(vzOMF-a2vhZvFc&LpA*iM5=rH z`w@Xf7gbJ1R8tFYY};M9*gkjQ&hoKd$EYG26jC}Npu{Aoj=u5nt%*dzC6Y@r>FlCI z_|si4FzU$vG5|NpDDcvZ_*+vFZwKa!x|MN3s0f(1>-z4O@3-kBnmVKTXPtV zN&}#B1XBq~EC`1=XgIh;vacj-1A<663#^_McXM?}{lb$k*#IagK-yAJbVQ^z$QPcn ztmqXxOgGi#yy~8NERg`$filw zw3eX+h-7x=$@ZASB@U#IPJ37N1lNOPXj7WRS9@79BN~GBy43Shr zu4#HVAhB?J?c5kLeE^PcfpE?oH=iZ%j_!%tBg$0jHGw;~NU$c(A zYM6FsR{FgSk(Y;LKZ5S1_nMG$XHIMr9*Uhv3(kiLM|k}>5k^2qMA}{Yj5_-Bqp#xy zLTMu(o0oRx+^MGj`ce@8D3QRTBNs)V zA@D@=!n_91X1HnUw9T2?ks#6`{JX&M(3Cy5phMVqJvQ}TD5oK$V2KoajF}@qi8Rlv zh9OeWHBBEvq-m}f=EO8j5Jc0lJqHjzh#*a~i-U8+u91M%lu&qoeK=vMAo}}Ox?ofk z_7#^%kXl%qyUU-$E1)?roJfJPRzeS{r3Ij)*tiEj!4#mR6Ay-FKco>!05}ik2j+?N zCpYXG>WIc=Q*=b6`0{75NA9hHiywV`OxisxV_Z( z{Gi;&%Xc=~#9hrg^Jq)!sZf+i;27=9VDq7_*?=sNbMbD5NH7)@V(!fHXFe+hE zZR4-P%7Wt&!3p0CuXsVj+qMb)0RRa)?FT+LR0o}pgalne2;xX%q9H&?LqJn2o}o%q zp6IMWBq05)0SWSeLP)^tV68;3$hYEUNI~-`p*aVP%(!n9cb(gBhGMKa=Ul;fbQGNs z2?_UH}0%Nrvap)g0}JTeqGc#Z;=vM>|g9RS(Z#4<#h=|+e&)`RK0qX3b>RoZIgl{}2j zBMW`9L;`|SPto4IjN%JtZa?A4)qe#45Rr&Q*P2D1@h2v3J0|B>rm-?rb44<^)PHk< zLePcTUKb3*iMMUMlX%;3l#N3hVVMM!krfZAm_i}Yu7apDPu2@Ni{T%W&W7Aa3;iw) zvn4}GgB{P~vkkF7H`K0ra0cVkvse+*Fy+uQXc8D;U=*FCfc6yxfc*o&(5D->z`f2a zeL6eiF4&05Y!h^&L9*dcp+3O^2OT*86b>vOWa3v!$Q*&Qgv&xl!SJJ#6d+`4tKQ-f z;IG4dM|0qoa$|OE6WR;-<#1_+<~$7D-)a;U5)bKwNts?wPN97ys5veIEegHIz8u^L zX=2({JjdOkE7tC80Ff3&U5h+)7lm0u;#U}QuuD;%b|=C*1V{`AquzLXcojpl9-_9Z!!Gl}m*8hYnWH{XU#N*=B55FS%5<+< zh1ffKE;UPqUjbhYE)$5fBD67hKQTUmJ;!g_WK=E5ulI^SL6_qsgSLl=nFstg$8G-! zA~n4Kw#U7f4p+n^MEyWj3xQ-T^z1TT92?(1-r z0kiTq8>^Ug7x0~sUQ_yNT<$~YF8WDe4$+b$GVTuwCCfGd+FqBGqiz8cck;*k0sUQ9 z7ax5NqYj#fN+AHf0oelBpk|N_x0}BI3BCT(@GDV=@1iCS6|c=I-$IqKJ>9A0PeCe( z4w`lmy)U=3RTikB#c$E4~}Z)Lisak8T8 zNtu93S>MuO)`#`CS0R69{7w2cfECC2#sZ$*rSdf%8FpPt`LpdA#NCBH*WPo7evZL$ zOfL@f9(x^_3~=O7J=AA?#jB-9Z!Or{$Zlo>ux4IXNln>zY`m;}{NbP|mw0aIPh z^U5#?>1@1}3(s_Bg%bc)O?vD4{1s#uKjsC_b{^35senmFFKZgwz#C?57u*OB9pebd%5s=#|T;OjE!=oY6Ea397U5kGUXqP5M zS6U5cmPkSMJQj&ylr+`05PnxzR>q4v%Jc@Y{XqB}%iH@Fz>2_2`o0%K3z(_RIcM+f zOlLNRqVVUKdD&&mQV{<-J|mIp-~Um_VNvqYtA4SC`VP4|AJauVOmR66vxkk^j6He} zEh}>HRYuu%tZK+7spm#H03&TlJh*WXzobR<<&Un|7~UqF^zRD8^UW4@^aHyNiJIiU z1!yVQi^Cb?{n{3EP!2E(sBO)kMDD*c9Zqq_+X&wl zY_HvscbhKrwC7NxKWCA52oh`Nr505eUcU3MkK2AOB0(1&ZxFF4>Bv>+qNPrGJQfXH zlRwTD{Pb)b|0aH*AE5@3{V6>JQX;8tfj zC0_5`M2S1rN^bzL$50<$u|I*WajpC}-)v?O_V2=KL0|y|v{UB`m&5&|8f>ZG`4Q{# zSlXyBiPTsc$NoFeByDq4yoxWRsfvG(m-cL2WlB%x(K$K%4b%$x8S z+b-eHHS_YS>i^v({67nk8a{wU%n%KbeDs=MT;Xz;{7++%P33G4((6jG=fwSp19xB# zz}VxJoaQPj))sB`62+LURcIh#y|5+OFoJf$PSfCGRdB<$jHbV`{xC!Y3YL3K$Z=lj zpTA&Rzz^hJfA^90$)8j52>Obande%pyCRixM#CVw->mH#2D@1n0n@e?e$sqF^C;3~ z%8pD>EcIt1SK0y=`$!v66#q2W^DfCZa!Ve?wO+!XE~rAelvPr5=`FK*-an7Ohe&7N zwuC-z34GLY^tFgZkrmIaE8ke0df=3F#@H=iXGOBwx@={KqY9oy12*QdEE?!ms~&K< zf9Ulg_9Af~VN->dPT%RQxSM0r@9F0~nC8iRhGDi;Z z%PD{AUir$h@{Ml=>1{(p4v8dzf5~^orrpEs*t=|qY>X1vV>rcCaEiC!6y(4%39fj7 zOm>Y@AglZ-8LkmT>#_a=fNSE)cm$sVjI84#+XNRxO>l9VnO*+WrSkQbsyA%V5Rg>< z%)at9H}W78cd2~oQ2A<3tf-p=a8G5dyTpoT_EpR&F-Pugh`79bXXA{R>zaYpDpm)< z7R_Y|s`COA7x^mL?8jGA-M}a)9pe z`t&OO{Q8ZD>*I>fflDW@-sMT=KZd`7NHy?#G$_R18SHqT=AbEJ`|D=MHH}HVH`BLH z%fAuQPYZx`YCEprd-M;vPNL}q7U1N>W{_cU&Lesv0I?X7{RmvrkGwiK>(N*@@?mt{ zE-FRe#=UgB>J(#|q4$uf7kp)8;+gIuBx5Ky}O9RTsg#c>yKiLU*EyR5E!x2xhgUH6y{ zh9*=z^QwGhSN@8|!m?Nw-T*ZSTCS>k7gg~*uH@g<3TRkza$9z}|-C)E~( z^_}L@cdCoZrfg-qqq4qb{j3g9B2BkF>Qw$3&xMNNDNr|BG4~3xu{<{fDY^K`;+%U^ z_S_zwM%s%dKBOtsbFD$s*)Q~lR`6BUBEW}6BZ5ybBmNc=Br`~4;Gwl;zM4l}zxX@W z@t4E0&Tq)5GR&=WPdH_kS#5Nn5oTW6nREZvf+~Llk#b)Wb%aF2hnA4W_w= zE)GTwcDgXt<@~b1OM`MB8|`ca#vObXCzxuEmK)NE#H!?5ql8PAl9;2ER@#s7Hute# z-Ys|z5MnbbYEQxpRyM`A_1|-?uS;A6*J?H-8bJwWOwqO=Bc)Y>%nRSgOq{ z=`_r|{k7M)!ugNkZy-|qvzDZ1gheN>kibeb#(0TqPd~6tDKXo&Pj^MKlJjv`bd*H{ z*X->VdR?1iXi-oi;q7pHsONjt$R*qxx|QiyfZU^H8svOIad$I&qTHT)pcWFd+%NEm z1QyX{bO4w)Fv(T~)enffjTVufOM~%X9O5GQi<}YAknwjGMO@L}b#+7rS#Q8P_Uf)9 z_vmtvtFmEtwF;@GX^O?Wu0o|CVHtfT_5@kEk`=GEL<-(}8&#rIGzq#i&aPTH_Rjnu zMmxbAU6tNUgtAi9x|2wY@@LQ?G*BHN5vYO!P=hp(0@zjFYUMhg(sqdCncn14{&LN} zN7Q|qxwBp+pb8|Rww(0ZXi1ACE{nKCnzi*%s$f0^dkYYWU0I1G5}<%=Xv| z^2y?%Xt*Qu&XzxV%@fgo0Dl9Kc0X%Le%5m83i){Oi|`c_4_{uiw_$1U30*<&g0f?w zk`rm|z#>?5(CO_GX{={0ofb~9ET9g0MlSIlRXzZ1ipVUZ=-cdx&`#938fjZ)7)sW& zXRiR}%oe%_#9m4vF%ZKt9*h+FTI7@XHiC!vB-F+O@XZE!)K1#bKv_XC^5C=Z!}r(j z6V3M1kGwKGvsL#4EWJ_eDIpCL3twajJ0ZA40=vAkh{M3@G&BLYFI4L==kxjkn-(?4 zue(n_f{fC$0H`=9x`>JwTZBA;nxb@tyF$YPf!!6)H*u8V_LApqiL@@fac=q@>bJ~s zKBHz)AnRL7Z8<0+5J_rt3a@v8B~tj_>xqIrJJ?&0phsb39VJp=9+_y&-fnLAwE@w$ z=<8)ci8OjEiIXr1sUMjCgid4z#-!a_5XC5GV&FMeD@EPbb77i4xX0>##5b1Rb02^0 z!im4MIKRPGxW9FHPHFAye>#TfZy*xXk$>X{`X1p}o1eUghGEK{a|7_+1zJea?PTAr zhbfEjBHAU=fTVkd!bt=a6C8-1A?BR069W9vbFLX|&zN%nI7T=iya-Av#owLmbZ(~m zg$3Jd$H(5Bp1^1%*3287et$vaweb$*nlSTdP2}S54HfKR0l>@~;|1loJG5KR zD70}<-ea6QKdyBn+UxbseAo{vnS`&DZFPvL$QuPjY6l=}_)XYPIyBc^{>s8LZ+9MKx7cw#a z=9rE9z>U5ZIg)m{pb&-3+870=BP@j|D3NB`9>6uB31Qk%eT%=SBn{mHGD@FLJoz{fVb@*P)u?GevZxYTt!qozV z+rvObz>A}lbEqH@+*GUqud~nECz9Ve`QY;!%lE*R>tmfJvnrCZ2o@cDBt_Sg?Gh<4 zyOCZNU!3k65LGTxfZ4^5EEBH7NMrAUmI%!R`4Alw2__#(;#E-df!OESWSboJBEXo4 z>o6Zs7)>YZPWRh+gEDG{=b4%NuX)EZyUhds2`BPO9u(ht&u(+}x$#$tRCJBJM5oHv z7L{){oW8$gZ~dl#LjzYNYnr6W`jyFhox$I}UgeZUc%hJch%a;t64bXD8$o8v=;c0! zWlX0Gv5hor|Eh#FfhyE^ z8)kp5e@yehsGHh*?q~=;Bmly&chT`=Izo_OGe>(~H1H!`Ak+5T8kz9`UmXq-WS#xe z6!Ui97?$-Ah8g~{lZ#MzOxA-LCtgm^dq`ykC*qNZXFX6)xsU4Ux-p%?cr9o+@E7$b z&O;FK#D--HE|^Wix9J68rqa7W0j}6}Wn<*!EiqRY<=mgS|HYZ~NK3Kqk zdn-@9SaRy+(CkOJ9b7ni`ih{sNmfVD#>v?qkZ|7H$2LRUF;8haG3u1&ZI|^rEge`T z6J9V=hsFO(#5l21OEm3EizvxeJE zOSn1B^*r7=9uUeF+5-t~FY*QPO_9c1#pgp}uqzoHM>ER4x_O+T1q$PkMzz>xyc`(b zlzxEdt3}^lvXj5vdQ@&TYE@YOs_yMS5%lnvh*Wf4WQ#`}z2=;F#&X9&u!vf8TE=AH zNPE*ERu>K3T0Pj|Jc|*wRZ#0jI~$jUUuFE=)~K{lDSLkW*f>7 z<|SPq0YDAe`vSB|hCb(pnr3SlM61m70&^7SZBtn2qde7#>LQJ$G3skFSZE3&Ry9|o z(tjOOFQryIr7=4|cKOq|^5=APYxm*1reTdRXz9K5LmS6BGhGYpMIb{lqCCAU1(gkarV$n=oWc%si3I;5<0KhjKT!Sb+~+s*{ydSm zEZTFZ5mmPeJg8^VDt19{Z2`+79!A?%8MZgDJ;RNeDE^8KtEGB^+#wB$LL5vgF zIpE6~cM#n9$q1^S>2ONhC=s?CXu|`qkFG7oY{<^T9HKR8cu>Ep8e3V6iLv$7U z#aZN+Jz=AYD2P+k<`Fu_C_%?v7r_qEw#873Gs|4^xkLhzj$EZxJ#qQ-_KE))BAva- zXOUgVC$MOO<2mE@n)4Mwms%~7`h{SuUG*H#nsz5>bOhLktP|K3;I%CBu7v`}U1$jJ zCt;pzvG%e!YRk1nS6DQ3O?viO{&b0~vyW}#M6n$vL6@cp*KhhHOmgZle!nfCyGC{V z>IRwZvk5xLCDM*Pr}9cj&G%J4ZFv6~mrwa*BAvY{8X`0*^1oEGY2QXox&4!+ z27VWp1&GLI9C&fO`F_*4bk(+E^I&f`v-%Xiv z%R^|V9EIW>FWHsha)yC@r@OXgk%mcHKg$F7nwrMRG)He`YRu^ekrmHVg@Z+cu7w7J zh%57VlcgjLeCrrf0$)g&8fHm;&25>v>_to2Ybh_(-Eh%N&1&ciZe(}e%i^yo+sjF{z^87dA6Nm&B zp*CwP$wd75MNd#g=di*DVd7 zM%)4)iDsf?-^iQXaU`6m7}KmAbxVaa)->4uJTf)>8vBP{Cw=0A%mIN{aY0;x%R^Kf zklS;QWfz1M*T-FO1-2N-K=0CTCv!E5vG&za6fk1Pr{0~Aa%V=uEfPT++&Dr&c$}gX zMLN6L@|uG6D)2-|u$g#!3c+>a{-@=a_^Zwf8ocoYGSvevt3;44eiUY?DClKIVZ3mK zm^-NOpmj$;3F*K}d8=GWi)3-chSpzyo@u( z2tWajv=O|<-OaciZh;4+Z8Hj@MNpl{7Q43&8G! zjZ+RbxkMZpyeb9nTGf27tY4YHqT8n$e2v6G35MGS>|jJz7>C=E~((6!AX{K$Su4@el!2SgGa*0F% za&n1;S}`wOFtE$jX*2|h{g;9cpL264Ke;&oT3jBHDDY7Ih=fGnsm>ZEDe|#*XpcE0lC}j9DKMFyHNd|?#pN^z z(AVyWqT8wdb9~7aobu!hgOKQBod$ITi%xxMoK)y}ja6wZivVT2qlzxfP^_$9x$4Gz zZKLG)qhuPaUFGYb@)xeHyB5@w?y=1refjjOp``<>kw7!Y4#gseE;C4hufT=~0b|qd z(U@K1om4hNDriW~BOZ}}1>0)zy=XHET_+#M#4!Uy%umaOU$BoBjn4vU$H~g?pD)~@ zOGGN=uqggO!?ySn;|s125wHkA1E%C$2o~WP@M)=V-~-c#9A#TIHtrT(p?7e$C=6s& z#(gMp{HvMzfIdGY8_hpn$E2Xk8xK8KY0-l{8aby(5(+_Ns7Y8*GF!=WB7&=)7G8eM{)A%ePb_dj zT$Y=I3LLuG-d(PX?!p4s$6b&(eeuPqE3ImRpW2>+!pE+>IdS39(XwlY&t9U~Uw{8l z`4yTzRDN}T!^7j}9-uIJUO`Q8%F(OjE+;NLK3enOVB@pG%G-w;pB|}wfLDaG4qUi( z;QUP__BA{_RCf7T#Z44Ac=_4Un)^twAg9zkpy|W)j}O;9s%&_4|M^cq?XzDho8MPo zdreV!^>vZpJ>YH7nin>R9*2EJsMxWqZ4^GCHhDfAA_XO%-COqf^tI2mz{AIh zRCcEoi%=)0sADow7b%MXMc0%4T}$W#phc%G5EKOs*In#W%PxL9Fz*T5($E%Ye&`kD z7$yRBsefJM#W#1J{n+yD_;!5Caq0HkA@R*z$5lS|mgbs_)gF6UA_4H~4^%yC{J@v+ zzXcy5QfV6&x$inMWNmt%h+39N{X9x(kQhLW4S|INYl>c)i7z{JPY;Rc9C zin=!1tp+yz@*Q=jF24BV59YmmJH8#CdNe-!d4wm2NO5;{Hys&hlI*xs6z&j^a5A^} z!TG13#k%W^Nago_U|AG*fUFRngkU1ErEH+- zK3ShqRf~d!o@Jxc?k^Oqr*0BV?BMC%7iW9b9=!SC_l_y_`|rQMdi~}bzM(DNym`w= ziQw3lE%KH@q``L8IxEt~u21)l5hcnh`5BS9u=A3QjiTdAy_K8$}@5g;@STtg78ZqRo_V=|v0`zw+ zV|%MX9u5CS7&hkI{}J~nbKS-pgX-r9qdLTxd0^I6@MnUpy!G?(qs(2r7G5Zr%` zkIHnH$n?|n;n^cA?||B%iM)684d3ulRGzD)B1DPA!%&Meu!csMra}|2T-slKhbQxY z9qkb5%nc@#j%Cp(fiCI-iz)`KKca2KjEJ*PTNJK5)md3MvhKRGfIc}re){?6tu8*i zxAP6(&_%FBs&8(GNWehT0toFq+iaFdA*n@w`wDpNYb2IM+jk!uW7Z`W4YMrKT}9@B zwZ(w>fddwX5~XAqyTSJm*P?s*>h+kZi+QhxLTBW3OFIw0;HbEy%!HKeZ}{R68I!!l z!Ap144BnUhd%+Uv>b>_onWPxDrBvIP*i-9$_OV<#T=zG7N_-;KfB2*J<*%^?7jZN1 zm}6ttw_?#Cvje8C04jCk**x4e$E zhc6>$0wHr6JhE3&t?!N_GA{pg;wR-CYg}oDHfSD z+#xXOSk))8R&8DOpmm36opjwV zD(-Gp-gT?*uA76l6l<@@&@f4p^DdDLJumB9#*$~i`W*Z#8CIj{d_rZ0d;d9pvu*cs zjk?6NT;3b8a`5`~*WZ|*J2)OaewvxP-+Mhpu=jlJ zCD@8~uD<3rt}EBu*f?$X35?u#un{q3ZfS|3 zQyQeZTRNq?k?wB!?)&{?7BKg$yYAh4pQjGfU(%Kab;5IFpX2L=OtCgm>q!5VD3}0r zUr@Hsv*?rNp4}?xn!3GT?BKC0Fk#seCmP2P4~zk!qaLR^j@h=>TkvE;qyssl&YHFY|x(R03(%VHeK=mIMzYrw}H*4G9081EjBxjg?s7*~VRN)SelwQP3Mk)`{JRzhPIu*9d(X{h?mDRTJTYnK- zBX7v^osEJIfB~M}u73i@m_&o7R0Il45+~C6KRnj+$<|=Uorl5Y@d9NeH?7k7l+*nx zL&+ulUnd{DUL@wWLeHZPx}t*$EdRZt1em9YOa;fLH3aH);h^U5cXwP1yA)sk`qdVw zcd6k1od`wwT*R|K>xqZ_9R&H7TjX+$y0!jX9VkcB!+)8O|84mbzV#cP`)2-&w8~0S ztKiA&U2M)nrdp)k>k+KnGj}37Bpt~n_&f=C zt>ME9C=((zIQ_nOAO6Ui^dpc{%`)+~cIi<)oAtnKzLdM_OcFd5Da-JGypsFuG^NwQ znJwkebBR-;Xbs=hwYy1+EwY2nWeju4ba^n90uI!E4snmb^^tQtlVF;!$NrO9qD6zR zZH}As$M;@u2?q=1AL%18QiO>1K;4IUv{pd2HeTi%XrH&%WU7FDH&3LVccA;ThkF^jjDD{jj74C;nSlps~naLrZ9TtVKC1xu`d%e;D+~?r2PnDORQ`# znb-=jt+ZlzoqKMc0y%Kjze$vv(^r7XkV7})*!_ke<}#NQT36N=rkr+wL-<7SLeFN{ zwx;SqT1}i26&qnrxW*n;pMp+{EpJCTHpMK2KN-V_q9TF>62LWz>3Y%O3$Y0Ymk!(| zNoFvsb88nXAZlT_RuZ)}dM~A@n**PMxW0@f?uq=lZ8X!4SYVewa|8f?o!IZ+sscD? zM$w1NoADVYTy6a?vqV|Zm%gkKOhW>?jnj#mm%4)mp3DDRtDGDlDsIzacUvv6hZ=R( zP~2}8^H~dc{NTWPQI`Wp4$=P3OPJV+OHLAIqtAdxQJ<;`FwFAN|I;5@);L0F9XMxV*Hadw4(z7+J(%Zi(Clc-$6On#t zx{Bt}{y+fW<7@`aiV;i4=K zRIUoL=J`3E9(eDEbCK6{;0^J#SP2b&9-cC|Qs&DH__vq(a3Q9tX;4$+cCzOE`i$Dq zQmC}SrS7Uy*zCC3c=C0l%`cqs$_m3bVnFu9EA>p!QyOHeU?rMMnB$y^K7GIHB_(i- z9|~-Bi31n^9QPa+MvtkiT?%MmbZUBEz{h>a`R*Q(6tIm?iyfVp`3KulFA}x2s$kR3 zG0k1)Lm3mW-E>ipc9s?|`6?Ed!peB$W&r-Ru8>ny{a0bJ~dQZsv~AV068+d;M@^sztp#?F}Fzk2E4YTqu? z(t_D8@UwRdq+wPJd|aoV`{K{2$`kr-Ce=X@R_k{=C_}(#uyGqa1`>B%H}Q6~r{)a4 zWds-6`ubx-HUb`l^a7(BPPH}ISIEikew{D1W-?Cq*1k_UZ7{L`1>!gEGgIt4C*)fo zVfN=0`)R!YdiC67+rQsX9eCtEjF7+(H$G3-L(mG<%u%~zD+|o+!gY^ zkW7vOjjx&mG@IyGhzEBsub^l$@cnA)h7&@e1KB*uPwEwzx_bY`us9sd2@IcVfovR#|VQD$vJu$fDV?{p?I+yOK+DnYl&lF*>I(hhO zy9&v8_!SYh&>1c6ns(QaAR7(<11h8Z+=3;f2mTLe9?grzrG=7ghn)WTa}guU^_!UF ze-AYon=lz(s$}0+KHc^f2NcxkmBjS+_X~?%V0gWL9I0ns%=mgt3^aA`>sv2+4($$V zHja>oK-_GcqiPDVf44ZULJ{GDMviTFx63ywcKZY$jg)`3XX*60_hOfBAN|=?KX=v< z{@MI8xYXc-lXx+uycrQ>rBS-Q`U`u5oAQv!KvLJkjg4k)*oDFZa*GaGP>kjb?mL5exZ%$=OmdN5&&Gpt4k=EznJ`s|C zQrhJ%hcJ#2WI$ibb25|@P^22YYYW0=a@=j`OwHoGNSds*YlN>L*vB^D-{|zAAjF@Q zKNQ6H8bXI4*WWvDKI!Q9Dgg2;i-Sw9n-Eh{GsCU+l?!AIckG`n?|!={$v`laC-*E~ z2c#OVj+4cfPfhqB3aXpp?U(&JTX zbv$?q!+-#noF)n3Tz3Aez5(68i_@R|4ZhBz5AK$5!jk?*<;X;w~Ep67t6+B9IY+q^>RG?88Ys_ z^q);*aFZLIN}3bBtR!=a0YzsX0l|?UL10n7g-};hD$-oTS>&ph-ZivYm4-DFr;KOvJtEC<)KvgUsDAKt#8 zgsy&52DftQ)SyKfo|_d+4GxH!JDDBdYk<(2tEP0*Ll-thbBMBdK6cf%|AUSr&d!Ae z*|Y9o%Ma}5Dj18Lm(kPeUUH^>br zU?~Ed__UNU{S22ZQN4}i+4j$2%;!0A;CTOy>a%=iw{yml`6iv>BTE-O=2W>t4x0!3 z4=DpbA>VABK_+ui@nKZI$s=k@9~cVg?7Dwpx>)gB5lrOmmn4&+gd;#A@gimB$41ZT za04W#J_$(!)~RySC5w?7luMUqT?!}&x3W5}6v@k32Ni{<#B}nqn4Fu2C^9%S3z$lz zgAG)YC0%67ei-ReWTHBi_{!h(R~NsKECkRyL*1A~hb&%c47j32ZU(%+9n~Mm#S-W) zwYhPY!2VOeS%0~Gz771dK9XekLBrD(^!GHJVkAKcs3%zdGUC>*MrRxy2`spCayykX z(E)UzZCAYP+72UKR5CGwhfeohx@@nje|;EJ?5nSRe-Tg*lFd0ReyZuUKX}iw8Xm$b z7Cu{vh0q5^8b`ZX|HLA~$c>h@6i#ajUv3?z+!?K@2>+HJW-dCn>K|!=7233Hm`;YL z_+a$KzeG1Bu3I-B*F zVC2NddN)&L+p?Z|mDCs?`1#R+p5SD!{qqAY(bw@dAb$ zQoT+OKb&Q{OR+{X27ErOq-9<~<6i$`rbs`<9)S?b(1i{AE^M*wElyWpzQ;2ZOCus48$0Zd3Pnr0ZNYu%`y*Z0YqlE4r2-x)h8Gm{ ze>vkL=lfi-Y(9j$LyCUxzs4y%TXn*IYi7wDX{@Dk@JDbUCs!I~QtYLN8r*K312!L& zwgsW-*AsZaWP92j!5v3acX5K;Xqfd*MQnoN$bnWnn})8PvQCaEJJ!Qu*IeRonfhNs)-WaC1q`Dej-WLQU|*?hufuIN%?|NMIcd+@25(UxTi z)Ik=wITs44QsL4wy6J!yu1Ow&^KKmdYH0>Z^B{5ha~RmDOEx(2_gG0Fta$a*o!Ly5 zMMpGL&G})xwVc!8nF_7LLyPAT=Y>A9Al$1!#GD%CX>@A!;Sq(13V!nSWYMp#PeVzV z%!d{6&+;;dPLQI>8o`_=$mbi`&9BztU)z{ZW&DY*zBTMQdA z43mq7zpKeOnocC24zDyeT5(5+ydLjdFp(xnK2jV~l|QL{CDXS~z zN5lM?3jza6-@++9Hi#aG*-Y|SPr$%F!(QFY7Ze|W=5NWYSdaHJw>_MI-7BkTfq$Hox5Qq{v%C4rl~`&eqa;l_{~eR-0D zvVHV?1>9GMR0BsZGH(Z+*jSc>5II#&+W-2R;QLmkc3}kA#WW+#N(7LMeDj8xeLz!E zu_I5vGX8d75IVhx=1UY)xV^f>cU>H&TCj6&Y0w;97}7&yz;v566YCtp)m*CH2Baa8 zYj|33Hjo^CVWv=8@Ys{=dodNGn2w6KyDckriZTb7o8-cFDZyV~Cb&`30qmq-1Ou>S z8cE!GtkS+iW0s!W5G)nkt5aVH;<~Qv@PVAB-9Qr5j8Dm#aLwupfWl=TJJJ+zonhKU z27>$S%5irtrsioze!fD?RsC1?axGJMK=lyp(#vbPd%BZ&FmfImAj_I-HaMjCRBa~d z2?K`LDX%th-%q?_4Gof8FvMdcDs5%yO1*F@A~OH^vF$bQ_J%jH%IaJsiR2QST1Ro77fsK|gqcpLV zQ{Y(oBzHm}7KAe-ehGG6dlsEkoUkg)Tg9 z9n2cvrQH|a9*Z#LSNWGchh$Q?C;(2+1+5%nydMPShH|_d#7P1RGAHysBnN`CJp^2p z3L{8_L8WaefHw`0@;8WlMaVdx{qmCq&zqcOh8vqMg`SD+GDuear-HWVlVHRxuziWO z9Pqu}=>Tx1nQ#jK(}IejcK#_wYVNpOyl%NDymO{#%UnZTcxm z?<$^AHOVt`tty8U6p+L<+FJU&n&AIyg3tNC{HEO~Nu~OziC*Xva8BFcsAggEYuStJ z+T4nvSbxyfxVQyt38&1W2B6{A#9|a89q7B&OQkZ&p|&6W{$Yd_<4G{T`{1y8|4n*Y zN;`2>gCH&-70fS)JfhoVdE?mKNHP4dNk0?XUTxv7`Rg+UX+!#FkFh@DgMQu^WonZO zFkvV!XqIvZd8V(PTt&t1C$3WrQw~6T0}S}0TlWVNRUZj1l+L1Adf%<~Gx(Sa**dZ2Luhcnkw>RXde z`4TC1)r0bsg?*x%i&&Z9&MqxqAlH=LU$ih?)~O2SR^?!07`7g2&F*a@5cO$=rf(a2E~#&%&`! z(vek3C`^(?)6%<+CExQ+g~p_#N4Y~{A94FChZZ|l1>Xg}@C9SNW8#P!P_D;I-NPIaU9DKqnRKTIw?`m$?LpjrUu0I|C~T*8=k?*@1@$yjAR}H4XTAnWd}H9<%m_wV}_xo zXXD>xJo1?Fce zvu&#**#Uk8w)o5*Y?Mk+yvU4KpI~*+589J2)B5^;vti1!*9NC2AbQe3@E%sroPh}i zjpB=Ts1aQv9X|_9m~Ki#m$Jp`lP?gd7CMTms@(V3-~i?~kHW++`o`Z2d42ozT4d|>u(Km3Qy4n7;1sYI z8>YI>a?Q!D6hW+eZqzq3NYg_8Q|tw>R`Wo@9B2VzS>k(^6mKIFl>t98YWj~`_id788 z=C$)c6ax^9VL(-gqeugc2m|XAqwNmR+=mWn%E=0ziIS&e18J78ib5!J%3KzHiaZ*` zED8<{XU>N|z|#ajtt(UrSV;OYZGf>J*1$HLKdV5RxMQ24QUrxD&a6(ha97V=CarH$;tW)Q>U6oqXI8CYeXv5#~V$|D6#u4co|C&VR9W&ganP zf1sD}Y85FRXB6;ee-Ttr&bxGtPxC|&IR_NM^?Brv%DUzA&iYlWFh{EV!qMlLSO!07 za6aV$iq6Qcrf@A^1qs4lm9#kPhllS;LiIZi>Y#~DI?4p)qM7s6_^*XLKt8cl6-4Po z;qPJV+$Yd98)8hd&DRqbI{2S3ko%vzKnsyA%peep-Ar1J0$ZBzAz-i4Q(`;*X1Og* zd$-vuo$TkyI9a9dNFg)&t*Vh&o)(Tziq)Rj@)74!1d&skP0yYkP^)p)4Vx82#( zc#UMg5%cH~Y?=FJ@t(KaVq<5DaAxHHd@9h)$znb3plks9k)nqLQ@>gf(N%GEcDc&l z*JI-!E|Z|yH0i9-=G$exta;4J3JV=rxrbr6(|jqEc9rQs&WIw@Jubn@WbSVI=pj@Z zG**$IoMARhHvu&V@qIPOKtK>M$d%r47f{-8!j=Z&d*I!_jm!{1*gD@Pn63#^!LZ6B zqi8G;getl@D~=v+gYg?ors>F0Qrb3fhWi669q=;P$xA4p@)d=kR zHj`c1jzi5M_Fca>p@P&xgTPqT`$w(txl_#)4?EtH<)VK+s4-<$op1K7)Ec_si&lYBiV` zo=FDo?_nTW+_xUPMx63Cc(VfNph(12Wp<>$4s_A7RcD-J>`z+~oxXP&jJIcx-QJ%v z)A_zi_nw)xJlu8;+VR<3faYVoU>Ej=PcgAa7)n*8D<{it(>eI)Xd&}G(Es`BxhSS? zeLvL7Q-@tl5;g_)? z$q_eYnR}wOYtco_(VvngC0m)7TV$IMTBA8yg?e%eXzUZ&V|-Xm%z*W{xm~_?d=!Hr zJb-YFkW}hFAI0vbSrAb1TMjAT zmXlL+pY30CiSj1P|G~jT+Ru_Ct^do!aTAZvj<|)5G{s9*o>n6b!`Af_YN22yUG_4S z;P!9yw2!aHO}SSAQiB`5qP@F8IfI#r+@^*d-8HLUNcu3H+?#wBR|l!cpaTZD^aK+g zKPyL_jC1vGb@L9R-v|K!{?c%P&sRzhT!uQi>hT>y@~a{xr81lXedC+-0)yt7fRVwJ z49kf|nW@Y;J8j8s6q|V@1d9YE49LY`<3zH7DmY9SV1Wd7wL5(EF@Q-$fHNek2}$3C z5?FL84SIoVgf??b(@IZqsv8`gi7_~vu{MdggF{>nB|QCed0&|huC2$53P{uk#HV`r2~e^JI(a% z(nevdjqhvsrblGS@q)#9d*a3T3p&0-ojVb?rMs#C>xR%<*gJK+ z4he@`Kw|(H*MKa=r^EaGBqfcR6l-%xL35LcTo_V7*dQ3v%z(`Ppb=4656V_7Y~VWZ z>_r2_Ojp@fNdY%xBmFc`g0Y6)xi-+%Z3YtEx*Mlvus6IihOJK#UQ+h4Ksz|=?Hd9J zINM|5uI+c2W0LBPuU)GnOn*}yx-;bv)kCKY68|JKG|CiKm$Tw~H+{i{KWvlDx6S(& z*>Le2k6c4klIHNE0!_1Y9Ym1bx=+p9ZCz_T7%k^JG|F&Q9WX5%H!Se9ZV$@Ie(5HA zABsD{5Pdwr#IP!?@yU?1(o$h|$~Z??jih($!K{aodT-N~zBcwCdij7*N&oWX6bYvo zGn5pEdGz~+f&r4CqK$5(s9i;3?jCPwU?o$I25I|%CS^GfCf6($w7*plGF*7%vSK@H z-d(-gF4Qgmrv`flfVNc)IYY5s@7t3_)W_rN90A2r+3 z$5o3OO}{VAj0G|&;`hf4c!S$+r4&zhHy2XZTp7ADK5KUJ2Hr9qSBU*0_En~Rl{M0n z!1!()1jaiFiK;3|B12jBwyjW*gNA>Y?Ra~QUmoI6b#_VEvBTK7fdzELxY;-Oa@il0 z#1cI!+Mah}6#35i#JuKTPnB;92t3Gzi^SWWj%>|0ye^fJo-PHP9mE2nuW8=5fp{~+ z4X^w2$!Lo6j>m5oBYIKosvGPCzOU-vcIw;X4A=dh?YM)>VtmM;K&g6twJ(nn@%MT;DqmGK z>1e|&;pvnInNQ3!H~{Hf%-;XG_-Vk$nLv25j{r{f^3*Xir`zlw-qv~jgNM;O%$m>B z&D(+4)whdf#3cGfuV-0T{IAhU`UfMnbO+Ol&g};m7cg;#wY00Hu$*d$8I0ppCA)9k zJx3JhV(*aFm*^bp0rIYYPo(v;WZ&7fW^4CUhzAsl8spo$Do^O7CpLEcl zJQlwv5Y7Ty7<#!)!j|<Md*wpZJ?l=#9o1^cOt*Xv_0qA_N6{B|u+V#XU>r|9#~* z`$Q4aaXA-d)M${Kt9)3b%0bHMFA_3uyo8Ev#ikRhAQ+}?BjuNjpnNWnjF^3-_X@U8(_ryqhW%AzO)$270ZnV}O~wXVh~1dE zpCY3?K=U&Sn!f_KiJPjR*P3t2#@lZap^xx(9tv(GEH73ac)w#hT3=+@%E2ZY|PKT7tU}O zAIRFYMK3iKe3`@xAsr#i|B2FFdDebXJb2#*&5U!kVxgUI=AKmCet$2BTC4GSi*?`W zlL^%_F9|kdqi9u}TSgYy@&`pJF$IgT)YH*#NQg7tEcJ8>Ym9LlYBM0+8DT8E#0DkV zb?f35+o17L@Ib2}Lvah8|5VuTJokCzS`UP_dC5aO)AJv96+9bGK&bV+i7v(w@fr}A zoZj$r-MFFN34C8L09m}HuBNO76#Jly6)eM4Ak5$ar9F@QTe=^E+ktbdGUE;#ymf#L zJd{m6VMmtXMrc;bitg`|w3%ma<$C?1U#o5B<|bjiu?IXb)#xAEqHOC3XilD_*9TQ| z%Xb_s8MG(bwKqYw7D*ZCfyHcjt;yX*e!{U&0GZR&$vEQ8wD!)Oj6f4^|D5&dH7>gkKlz_ybvmRe! zf>|jjCcbu%biG6Qp>`DYp-aQyS;Z-#L8-R{q$)b1vc_w$(xYl}YWY;Ve{IGap*!dj zDLviClS-Q~XNPzhUQA2ibGtz*H~V)}=Dd@2_wSIM=Fd|~5p#Grg8VhVNGVl6g5~XU zEdUi*i+A1l14N6ZZ5}mAONRQi?2jll4&F&5lLOk@eW-O2l$Lh|48sN6mTeEc{Ldh@ z+qBx!7ljMam788r?#pxb7B==wNQ}48!RW^;ji1MJJ}+uu_KnCH)I~$lA#p-k{$fF= zNE+J?4O82c<5xL;OLZMToZxx)2fq2lKuRzmQ}kC_W-Yc1FzRrmqxZIP3;Ysw&S9{&g=`LRP|uX z57CrgaM#6Fe>dO-4kY>8i4;lWSR=J&^U*LiR-TS<=A&jm>Gj8O@SFRFu@06x{<#+$ ziIeUG3(8>XeiSZ1d)=%*WZV0XQlm^!L6|n1mo}&)UtP?fc8iKU%%UbU=~730Qg@C+ z7Rd0VSAG_tLL;OR3}5hzS+7I#@U6o1xVUBjX9glL>{)6-tJ_qA6W6?gSg_a_R2P%X zRT0g76`mc3r@12}q!=6n#GMq`=Ba@Eio&dW=8BE=)K8Q0HVN6kA6d6Pt3Gtr&D#By zL&8n%<*h|i`?00ce0CHsG5fbf=G-&|Ng?qJkN)$+v~J+Ok-i^7#GD_5tWei^%X9#V zH;LSU3Ok~NyI0oX_W6AEUJ7kSPn<~M&(i2dEgnR+B6%upoeknWQFmG^7+Ck=af8m# z`L}H7mG@oUaHSh_;cCr78vA#&ifw zcK1q)XEH`MTMcp*=BH&X39}a4G!2ES>6JG$8y!=4XD^WEN)vz84Q`tzfd)X;tRn}n z12f7E_Hxd{uZN`f!NMS5Xthihs1RbkcsAkHN@yoOjFk^mGTuY2mTIgH*yjw*mjWes z+13(Z9`y{IP$sA?XaCAaF)U%bdq9LR-6}l*Ge#nE`Mg24+z9OR4E%6wt~B;PJvK5I zDIdIg{g$=+oqzb1+LQ@b^v_Ynd9ul5v9)3&_RQza>A2(_SA=Xlc8bfG(Ok}Ii_age zQYI4($)>Gb@_&2g=b9IPxpN({{QFs)25Hqb2|{G5B%>|q;~z&Gn*_#%5!Cfd0{fK+ zjKypO+6L1bqxhhF{y9@mwiM7R9V`gSvQegSYP7-5aPj_AYZ3{^IyYt}*8ZDoT)>oi z;)*7w^Amsn+I_*i)jxY>n$j3lX3c|VoY|ggB@eChsfmHxi4)KH+8r3ZXck9%gVMT6 z>?URrGK8Nk1;aDN(&|5V3Y*W_6-Ea(r|bDk+bydX>S$~ZLYxOp=7`P59yZ(w=Ms33 z!mT7-KDk72Vt)&B;+fNS(G6~rt5hJ|u6LfR4614b(xXxl=dSR-ao<*x5H1()N#WPR zwD2JIfbbp?x@Omp3>XA~Lwep@p+}p-lY|v0xmsXY#ED_Scix+HB@w189SQ~Zdxx8!OysqCN|;q0Js*HlWEA`pC$AS@4P%b$l0zeadL zzP}Tt?cNTI5Qi%)SxTs3E{CRDWh(6v#&g`J)&SP?0+8bL>{RCv$Va=5vCZ*E{Pcqb zqqIb1A?Iu~18AEkFM8|4$PYt$A>ZWjspNICS=ym$M5{ss*5nzk#|<70(_!`ew}u0W zm+et~P-MAs>QqLw;3rU!sn|2WG=B;_4$A1o_qur2&dxZ7am)S7n+Ui> zLKPJ3ns_bVy-}a+0mWHfg#|7l?zOUDA&tN^ui$D~y4tfA)Ok1?YRjMTuz~U5*tdg6 z)Mlpezeoe+`Zfm^ZqZV}X(hK|WrbshDsIPn9;Cb_YcrIllSozK#)-rzj1|Gs#lKZo(rQ(uLGQ`}lSOpN4xbcFap$YQ(ltYVR|PRYShAbIm&ZvZxKV z51K=ejjjVu_fc?Zo<3}c)jig{-!B= znR$yTEy+NjVpx%f>V{7{W2~#kH~Xt9%+i2iw+>>Ouv~*5 zZN;5+^DIBQ^x^`=z}Cd{iDxDYQU35l+*vXxgg|apHRrnW6eg#%*(4KgBw2!b&vF2;RPj5rL#Wai!NzfpS-K41HDXrQoJON#xOFK|`K#Bpm+T zv}qRTN`?(PQ|2d91!b95l4aZdhCiG;*^kd0?MkIGKkNDy!7A%Bvm8=3Gup+zwjf59 zTPh~W%j(+&VLUxGlJC5>H3RZbE$vdL!!%z37a&uH_oTT$k5a0{3A*C)-be*Dks=T! z%DSsL)3_(q)?}T_9V45FQmJEDO9Br#z526<;~AJx%XUAu!YC=DTw7l&!c2(=mV^7E zLpl}wd16wUMi$tYDs9_zOdcw04I6h)Wlm_t<8$kN$(3Mlz!gbzju3bZy&Qoc{jaL! znepO6>&XHkXJyM@%i#^7)sAAI$RXm!xZ*IOPRKuX9MAj(E_VF&?n7k0p41hEl&5;9 zE_OU758>u=fye@8cRafXUY<#IXN2-(2qb8FZtVKPR;+p-{L}p(moeq8?V*I(SA?G) z+rhcc!$2ewxlL=tn0l{P-RhrDvpDIGo;9M$?wboM+G1;E&XK8uC-J6HyF?%NNX70Om&H_L~XhBXCxl7$6%!VT!2cN$y|OzaM8 z5PD;69J64ObT_Roh?t&u+_`V6MnhZgI^jpaq4hL9BL-^(=BXnpt^{kUf=IB<6!0-?_Zu8AjHduRwv}$}mJzJq& zKZ&)x(&uMQc~6Q|qaD=~sDTeMb5CX30$F@ysTfktpi>%oE@6Jn%K=1&mfe zPCdbx_Pe)KByqFMA(EHT&$4UZBe;xwo%nyqt8>JKKw%@J$orx`hHx)MtBxD$TN+d} z3_1P6(%n?IsOD@7Bprrz-l=;;*~J&gMP`eohcSuIwXN8pk04@|eJZw3kblI{EZXuX z4lv=UTyiRX#1Ftk0x){0(DB}0u?@!633`=lhkoK`M`Tx zMY1t8?{7Ik1Y{4I9%^$=8~?J$n}fGAE=I2x0o#X`B^Z|_{(e1!nYMD*H0C6D`dyE` z7oWT;JcloLST#!2Rs`1wgHW}MBJ(}xTdy`A4t7GOJh|@z?;W1GoVK{_F7zR&sR>B5 z%4^d6h_$3yhmEqOYc1-fen8yT_BO>@1RPGnEl*ZMrDJB1F}8bQfr9{Rh5HQ(yh_0vP(4V?znc?chAfvAUEj}QL$pWkQ<1A~g; zI}(IZ>zQVGRUF=D-;tEu)Bz(C-2Q>bk1maDL>5$&Obm9+d-UproTy$BWJbtm@i2)( z;2_Dyk53EhLy@jm6CZ_WIvBpFn_gt)4pn`dSg7#l)VN#s$IXbo{eF{)-f)fF0pVBO3KL94 zo$e?4X~$y3b45nD!z#wd6Bd}2DsI%ELTRS1H%2N+T;MoS{`p(>_8(UehTqpJRS)un zO;Zpu#k@eq-(|r~hhjq*$^_MIXE2-o5d*q)tmoH-UG~Ia{3+hGb`6Ff^~NZ}aT`52 z+A|`#(8yND?bDm&HEP-Bz{bZw-@vrGpY}AqESZdV zhauaWVe5}duJXgDCxPW`|9{t|p#_sS0%}i;kJQ`0Wea4*Zn<-KhwOZ3RY)ZBj6?f% zBG*{z^gu+%!tB+6CB(Uq)Hb5_$zEkK-r-CBz3HgA8%vr$Iq<;(ywI~ zt{#N1r;1R3X#PNJSJmurza9{^TtZ|eEwAeBe9ODlJ)DbOxQxIIeh5d6Wy@ zLBk4@tV1tvufdm?Gw{c6$-1?Ptc-ll+21!3fcEC2+>E*FiWHG6+IjGuN2J)XkPLR` zD;Ev-0T`77H?vO7E|^GXjW&!VQkkd3z?Y?8uJTl5QQPkIi$n2Jea_`g#3q%wohmH&(4^QUJjg<_xQk8xq)1tyrRs52(HCJ8H!WB>l)zbp~W zwK3Pb@#RdpidCN&Dhi=~up2gp#LAJKh-++V{dXn|%i1b3p`}I<5XE@r7U^!TMj1o; zcUMPUc8dpcwUE3$%4`}w=35Y~&xD^_Xar9XdM^IQku z;gV_pB1=_(5Q#dvZEox+Nt#0y-&onJO}AhOp45EbrPVjfQw_f6?D>nF$$wy+I6X?BwoF|f(;+oTV}b1$40o_sO9Gh^Xy>uY~Pc zVU2*IrCg}1vD;?lIC7)DH4x`?`b*Q9MblY~n!?#>co3(rV)Tf=6YwG{c;X0sllOLn zm%_4ZK*`1b25<2RyP8Z=iqoD+3pA{I{4W*HER!+yk{}04U|7y;6k1=7Enm$+D&f1I zyOAp07Z}M>AP=LjM2+#8mn3Hpri2|Y+B%<_OB^tR0AXB7iY@e@dMz)pcR||sn^E_0 z+Sfl!Bw;=3T4@*St0(a-V}{xYP~5SmC?rJBB4H(Nvt_xwypI68rcZ??& zy-T$%WZ7HY(p2&K>26-Gqs&k3fv zW;`kskSofq4ae{BIowiBIGBQaI>(b9sTB2*QJk)lst0z&qez`_j8@ljRmo)CrR|HN zgk}mF5$m*vo(z)IfB@9HXRph_>P5u^eiqog*Y>?a5sl$sjkJdA{T!#kMw2$xYEJm9 zmCmT$DSR&h(mFW%wBh|}fJwvqAxvpL&Va~lo9ThxLEZOR!G^F?Zecp zwGi`Rrz@^jq2qWAaCSZFWzPamXF+mB0d;Z9Ay*X7WJ#* zY{v&^C@aQ(u4;70WF#g^#d5mYi8RJ&SM9>t>*xdrc(HvK=*JuBe16Y=rEbF<*r;5?L&)my5eseB*_tN}%LNyWikPS@L;1Ksan!0HX2ana>1|iIdo!iLE!x$q$H9c^uZ5XkR`p z)Ttxc1`Ei|LZyP+92ymbs!_iLfIYO(?Wjh`EC4_f&mQ^NhYLnoas_U?@KKQ(3CbFK zlnwO!n?pZzE4nQ6UhUruHK&{2}q2{YSEpi*KX%VN~D+%5{bv`TVRYHOvi0MBmxG znEeeJ1VWPVhS$D0VvbNCw^kTj?>9jCT>ts26sdg>!)K60iTt0s3!5BSHcprZ{l&fl zaqrWx4HPo(ic36HWaSGH&3B;_!W#G#y*OR`Bmt3P`$zxe>Ojfa0Uk>LB)}-I7(#Z0 zV@Dt4xx_$%l5iO{x+-N7ZtZ92gggh#)^q}-HB-u_SM zz}1^=%HAbu32q0zx5|tYX}0be)jUl$lBUS&7xzf)3x8m~S8?!*4HH{n!i%of;tth* ziI-1X@06*RB=H5M>9ErPd|iIy*$ig%toO+W6Jy$Yy+lr9e@uO>7W@|KPO`PQ4WUUu z5pdpI8HK(9+t0lu^M$)%$h8eUcY6~|;1!ZCjV1==T)n3zH2fsIItWYiJ;C-P68=An zQkk!85fuen*z#lT~sl+-UI;Zc8asgee0d3lzy{UF^oN(~^Jj1juxn#ENaQ zX6Sc71}N$tZscFgoA#j|CVDK*%$8eLB7@7*p})AaiF2faPt|FYz-aanmq65?)4LpI zB&hUpdMV4c4W)@ur2#_GSsPwrouZ-#f>yuDqFs;eAuM?F!A2KwRt!0O2)m&)8(jo* z2TOR@Szv^_rspw>BXHau0ef%Al);BPnB5rX;>BT$ergy9s)5gVeSW%#rJk$NIdrl7 zhZiXD_#u-lwfvuk5VgsTSfvZB$q&X%#Z<)4I~C7nWr7qTYB&2em(n z1+YVIyImYAA$AWnu&{njh1i>ZQPjGIP)6K_dMTzLEpgAlHKg_JJ2lhrf`}6me;cMEF&ILgipletoaa&(@9xQbeW3h z{aSX8SgeJ42O>N|{M8{T3z2t$dit(CNHVfL%)y|bERD=Hm zJ$Zl#7@j5>+Hyd>-({!3JQ>Vsr4CWsI<2Bq%`j7cSq#*|;I5IPA*4XoMGPDlhP0$q zZhgY(PbI*_)uQKOLn>r<)5@)WHfE#?+DjGVDD_TNe_j%OE#z%TT%-zhN~zhSd;^RD zsapAz_F>vaUo~KuOLtVf?5v3>O){y9E~r@}3b1Cg-o)DBh|^|$T1@!LKYt66?n3G- z_ZjEDu&h&#uQ_ZArpXQUCbU1{*$hgy1Fh{UwcAHZNUHyV3QPHmKWGEpCQbt?#ZHtT z|K4x>c0s1GMcJDr75tT|Hu9uRS9+QR!fCd6>yC$|<$dNLA6*EI5=;qwZD<8pkjN$J zoFEr-QDE)8;qY5j0Ny+Orr&#Y83^BdN%U+tkz`PdvnWAp17k>=?L4#*tVlD^`m?hW z1(5~0?`%tx0S;3D!Q`{Ng}saMvCXZc3bZ9{N*QY>wh096Jd}Z^$*l@nvp* zv9>dNqNU`klz{Uqo$f;J-LXmmtn2a%_ji}y$sotCtI1PHaIPC@4T-Lg19`#LJjmzD z667gN03TiUJ4TNof`A|(^;oqHou5>#2JB)Z8L-Qbbdd-kuwScj?WN8&uXpM(|5wvF zM#uGsTR1i+P8z$hZQGbQY0RdvZQE9p#&%=dMw`ZLW8U+>>)w3MS~Kg+%sKCGzt7$q zk>4?3StDIxCyfP&d6!HR;bHNyz&Eb!G7)HwYc4V-EeQlRz|Z)O8QEu&;LzsBjXWV@ z4w#-b$>lM{mdlf5h9=jD+YNj|_G;E0dGD&YN3%A^bhhnS!9EN&C3c3OsYRndi!KAF zjzk0Avzr?-F`;?^PPmb;`6-J1-;GLQ6BqS;?ty90XSxB{7(e@L!fc@S!Je3M+yXi_ z&Oct+if1|{mvk@zc?TZ>j%aXnIRI0XQlGn!^~=&tQ_LHy(*Hu^`?bjAlLImmovj=R##z1SJOQvAsTZ*rypUqIRz<{DPCEVEgO zq04aQt!OGCzuO_a#iq0bshPxumICfknEDNI!I{B>fZ-wnF$xslCt38qf<(3u!hi+# z;P;S<+E!N0of6skJI#QYo^RwWOEBVR$Tz{R1N6b18Y~C_z|2@gC;MS^przFR%+0Gn zQ?Iw!0CP`uW*_K;;c9>sU@9=Lh+8kd-yDci)xWCS9~KY{9~vn!KVORgQL*Uvw134` zn`+YJ&l(}gjoh_L|K}@sD?``p>lg04Q>zYAgHxwooql2!k8kxR>8Q=59SQ@6f33wY zkix>#p(=h;80bWsiSB6$;^o8Ygl~{qcN)9-Ck|BMuPcq4_0p#C9NDhtO0spcJoU!1|HU8fuAhi{Op(Kw|wZA+Z9bx7HYponhAA0R3LeUEOd;%5SD$N+Nif{DOVUVybr(9^Ow5Ny?T@T_z9m`Yxo34PgWLw` z1+!7qfQ1enPin80>~6okGSo8TV-vP^SM=JcK=XhKCWwrR26^5TrQF=12CK-9|EUmWiXvD6uh_DYM0`jd{*i1VY|E z&(Oj1G+&5Bps8wN`aJ@=fOAYfCi)wkMeg8R?O=p_>J!HyPWjw8D!LC?U z-Bcqx-Gq%;>9=`eYuzT;kS7Vh|KI$zU8wcKI}cK6(&BDUYThKucgLxaxAooq162mV zVHh~oA7v&$>j`8Oeh1tM>F8PJ69?_ap2f5? zc0Unmj zBQcX?Y`g&k+JDR;HI?sR-0U=}U39fX)0{~=KI};`qQnPT z(}4){G}=e2}nO z$682cwLUqmJGHhQF6b`h52a1rMSzQW`;kQC(7|Z4y*Q(xfXKvNlW;it#f7Q`Zvhtc z&c6|Lj1?F<+rqqVJocZTMzb1lv?U{CuMBrakCzf@xIfy;ZBw%kYJX0$)}b8>vdocM zbJI3=rS`Ut^itDFXISDMCkv`~Q2sb#TMAyk39ZajlV1%f4R;j&VdXBW-_DL6R&FXd zNr8{{HQiO`=o?t`U;Iy0j^SO=QWbGPK=Ex-aI18ODxuk+Q)&!>t}(4AO1nhZke2&L z{Lgn$?g{1sGU2D@S0y~ zm<`r$@2o$ffzb?(5!)5Vmmix}?|1wjx@$WMxIG3YHY5><^sH8_51bx!^qWHjY|7F; zDP564c1ZjMsW-C_Olm*${5ZE96$tWEc}ye1Hhz7bD1L8hO~GI)p=yie&qryC3CNbk zE=+MTo4;V+IKwx>AMzbNG zn7F9TzKyFM@(x!L55GXk(%pNTh|_JXCPY{&IF~v`y5QH*wA%?+hREGWxzdOwVIH2P zic~put!@k&#zDX}S76xxOh*h^P10Vz9IYG}E@uA|yt$Sb;|>YTlVp0bzm3IVtF_f? zVw3s3f%{a#iLh=(@qj}iKT9GAksFiQg2ej(UYnu-febn7kkE;>QBHs z@K!m9cV5$nrMDkmZRt;`Bk*o`=6GP51YB^vto;sdO6F2hAM^a7T8QY1*92XHO-$hC z@b;2WyiA`$Tne8QC{!sn>8a85j11TGOj{It zAsNgu)x$90B65*jE_f?eQld1~h?^SG!~m2)sc6otJDdGKutPj^*uc>WTx|JOiyNdBGF?{fwvzc4z{RsYec(CZ@Wfs<|w4s8$>pJi%ml2Xn+1YEe`D4wjkZi4YtRQ zg0eGSO)_-{eNmT$p2|-w#{SfDJ_SC~L?j^=V%c)@MQ{PqzqS~GgZsbC=U?)qW0H~= z4XIl#e`mMT8&XNyH0DidZj!7Z0z{cxQ#=l-Ots80|GL!9ciPH&31-J7pqS%uLFjX9 z#8+g348K)*c>1?i-;dIX{iag?2Y`l{d+a9O)R`lfP$#?af8O_( zoqB^HDwdL7-a?ZP%{!_UuCdIf#!{s})1hf95qEIlR$k%|C=KZvO6&qKW3>e|%=7*K zVikxq5yNlM$oxrbiL7?I;U zcyJb>Ix#lG(1A-5P!C9xxC-w{@wQak8rdll{>-%jCC zWV$=T;*(mb>$%n(i;DI#W_9AmEScix$4~R<(sEN(JmOKSMoEbMT9G{*vaB+qOncEA zXrQ@38so+1Qozx012oC5UBN-mqGfigrHz32rbyi<>No?%}#Iv@SAMlb?PaVL$A(C1vVmK zy$nZE-%nZDPGW7&9gE}SsBoVzaw#8K3R@TH0;2(8vH^q{JMZD6_n#eg{i-pYR87xm z8ZZ@pw#h+wc~{?_am~hqDjzi85XqO}fgYyfq zRUScOYspu+&w-%I-A|-JKb47iVGhik8U|U& zlABc!yIzQvFo`b53^y?`FrtRwll}L(Y!<|p&+o{)0BE@|+eB;O6Y8RU2b~%fT7v8x zhrJ*#4_%Zv&@5p1im?ax8!`_IajsPe`fflwmUWA&rS8I1N~h6?0a^gKL{1@?phQtOyXe zdC20Jky~miz!a!kzRC85v#+UZ9$MY)E|5Kh5Ydes;K=PU#6GJi7&_+bv@P;qRi%Aj zgN4R{4p2_4^76|n`;DLxO3*7OcWhc-b$>9C_Glg?q;IM$Q0fSr#}tQSlb~K ztI0!u2J-UIbMaAHpYs#S(prjcuc8U`^= z7SpQk5^oRT94b)LL%A4V&8#%tQK@V&i9tqaA5^HZG(Q69Yxkq@5{FzWoOQmUQtyI?Vf!nmLI@K4fkqp`zEy(k)dzeXdj3rAYAS3Hu? z#^5VkDXV36YuTntcyy%-hoEG|dlIX|TThad2L#EFL;&7=B{@ZH!hXDHRIIxHEQUn@&ZB${pLd zodoQGUzDALEfC(|y09xs4%_2%O$#&6gojUN7OkAEQ&|r` zuUX3HNIw)@)R=p~tYU9PGIFBw2WbLA(zvi|a94;;l|CB7MK`;v9amh};>~v;$!w}M zS~~t;=Okd->F*Xj2>I~lzhl#I=sK4;NSL9w7C9_b5HDlPKmai{UXU0|}QH89)nci!fZk~w6sG`zJpF9!L? zh-)5QK)^o}NXvVDy7=uUzfx<`_p2Tf*&|s-UDi6qt{suzy9U4qw4R-%SA#Du`7 z{%s6-%Qbr?0vrU4EhkPsSNvjNP{>wNaHKY{w&H2{@8@!I5C>1T5Pe~u^$#!w!rX|F zqBs8*bAQ~$VlL&K*K;h*x;3FpAHR^W!kidO(3{nV#<;8SpE(LVTzH(x;GxVkpC!JB z9fO+eW_Ms)?kMRQ`hWrYlw0C70R6yKk=;$(GAS)t`v}!QgLTfeU}xja+cH9QSnMnT zZAX>Y{P#_Njxrh>OR?rBTQGlao_2RxEZ*z}GZ1rJ)Ue|X2k8@^p-~cFeBnNs_dAAm zp<(2(G$l=96(L+z+6f|ws#zpUHqo9R@l^%F2sf%5myYz^LSN!rVek3%GSYAEHljQj zoFV;yvnz?>jpF)V4H1wbns%FEnzn7B7~Yr4HHer1g1sWOs{3dZBTifW!s%1=JQf6m z#@&{LNs7Y%f7PN+nxjxGN#jLk0c$E{6VFvhz%@pY7osJcH&sLy_?N(pQN%mMY!rF! zvx+lC(1=6t?Jg8*NTxrBK&-4;(CEo`@%3F#Z(#LFY+0=a!XzeT#Azm2T+j{N%N3c zU%q2@^N70rC|D_-v;+V#Dq<+~O{H-w_SFlT`l+{K`@FpiE6cHs@u!5W%gyz2-i9TS zq&wF`o0ja%84LEsnIl17FcqIF|D4#qUSC2aTJ|+rwq+QTRR;Erj=Tyv*ts9L&5b`F zy1eb5Bz1T+^&nD@S?=Tm?@z0|D`*hvUrSy%v`Erl7vEjs_96e3HM|F+u zO?Ph0Go)U73awrzHrZHbg$&VDm+*lG0ZY%vNU6xzAIxM?(B$}U_cfq8) z5POan-3n)&%~UWBy=ewh2Oroby=&|HU9evk?j5HqU;~atK|E%g&^8-eAYt(BtlM3; z3lhp4$vIUBcIFvLv0BGa0gi~^-+AhXKF1pw!DVkfT8GaQb#W<;6N&4olIFyjr$D3P>J@#S~f*bpP^TB z9?+K3DErsU7_hmSo9N8pD0jvhB9A4nGYqWJ=~mu3`&BRWG1$aV@nwjoLu0@3T&3Le z{V=Q7aJPVoDle(9S4?aiS2x71Irx?fm{$O1qk(S;SoI0Oin3~|Z||Bpec;@f?iGj4t@gt+>i&&Rrw%G98(!o7HDwIHewfWMUKGoOh_^qD;d=Vydj-{8PiGQVy4s|h&^V=b=y46*RG`y1*+&vqJg1u$6pry zN0}o)5HS)M3dBt!OhWWc{$62wNEWm{q>mw`jQfkj((-2`vhf0&#u`4Mv|O?Pi!~C> zzr=(dS9JSK;dq}vv6+5wqEt`R{(B%Ik$I2w3{TZcI03H_x-5lK|MV9NA(g=;F*!|$ zWzpcs7L#^dGH1l#wA&%#e}(0#<-B8P`ok#dXN=D~^l8GB?-c(_M;%snARDV6Gr#Zf zNm$y}&a+C<1>NUmuY(e%CZrFb6Tr!hO%YJM! zR`LZ++D7%=ZiwM&KBR#j^`akuNq(U@+~4(My*GN2^0}R)G+NeQDK?dO-56sIe1P}u zGJV&tG4a88G()MhW?Uy!lAor`ii|ATT8E`RGLt&k^{S)w{99sQ0VOC(N_Rgb6c|*j zwTEHt^jM!E>GnW!PWjR29Rwszy;L#)p)NTrG43v3l@ z=3|5rm_-L88(t)u27Ay>LG4;Kk*Rb}X_P%lt zFp6`dg82P7n%q0Cy?(Z-NTdC|VVDl0Il_f7*%e=I`f!J?9C0kn5pWBWg<|K3!4=OD z>md^hF0y3D&1=`l@9sy-hHIBJ>n0wQ9WO-EzDRV-cgO<3v7l3by)VFObrq+ztXYX$ ziGd(ooSu9>Ailt9<|$Z*DJbDl{O;%)7VG5K=I-cvvXZ?h6>QhrV{xc#?!`^tr_Lv~ zIiFS>LF)So5xG(+<#W9kb&a+;ULJ~DhA~0GKtt=swhHSGX_`QXUXKD*8Z*MrvI{TG z#pGBd@?t|$ynfJlNnnB~_YBVa0jPFjj*zca9Mu6)*Mt~yh9Yn^?4J<1`>-kKnAa?G zs|^@pMZ@YB97cS+NYe;gvW20H5R8yfON;p+7RFA56mC1I!jYCz>mkU537?~fRy6`G z3)5e9T?~FINPb&a5F!YSA_1I$lOHf=cFuP31^>k~;D;mLtA2T2k^5wb5LHsLCtWz8 zpYALqA1n?t1$nS?mDD;>Y-90ea&s~2Tv@r|!_xEeMwEmA`jL;mBP*RKO0~`e_JgrQ zl>6#F2Cct$G{-q5xbj>f@`gy!pLW_{39mG`chW&^b-Trl8p)iy;1zo zjFtRg4kh}>?>XQ5sPAeVYuirTV|!HA7E&uQzhHjkyH_SJR%4IYtLNLRpyXThQ>iXr z!EE1>9$)xLHWzPeRsedb)*&llthG2YJ3U4s7gE@49Ly`5?F{756vrm&Zh6-Q3C$tK zY!|(_{a?5!F*tKKiw)t1!(LCG4AQ{Xu zMA#6l9WF`h{3UF78~rm&41PVU<{+7#9k^I?jIXhyF_9Z0K{oiihS`h_{?M3{B5<9| z!7zOS$&FT1e1Fm!*oCRAxypVqOCAGPYem|axOtzBI{CI7#<}0jaO;t*F)Znc`MF07 z)R|2+4E&@7oy-;xpj3*o_gwoI6ZLTiU}}`zfO2T7oG@>xwNZ4`5^=j)0Ew-UTVZ`z2Fk%8P6$6@iF z6BEDo{~TJvmi&svGQ%B$OXFON+*9hBf#KrO(6q;_035>LtP(9N(0@C%O`Dfl9HcPW z!k{bT9%FZAGj=*e6%iLrDU>s4xyH#3#bDib6up-Uz*PBErIb3v4}@bMBekT_lOdkH z|L58}E$?CPrRH3dS@8N9EQei&Dzys>`AeAgc^W;CTuG2F;!F5uyc*`SbZL4ctw=(1 z%|e49^N}G1vF7q3^}|bx0N{_t*1>b*4iqoF^6}Gsa4XuL7N2vcz`9`gW|GyHB^|5` zc`7uRY|dXQTAEn66~Zm?EU+4TNkl1`hYRPp%`Nkw+XGE~LO8Y{p(B1IYd;-s1;vpt z(FvFo$7)lRT2mivypSy)#MnEQe;1Zod}GPj5_b7S9o99V+Q$*(darwt@RPGOP4mlX zdOkCsA2;p3WRh_M8{`8NV3-N7wceP<68oYFfd+>v7*R&GpSWpdN3%xPKp&6RF|dDP ziGy6ymZPOu_Y}L$!0k-DBb|`u|2P?sb(?KP%SfOgAlL!%hqoee8K1!rrigEr~IU}NhOp*aMP8lc(uQ^s<>T2xFtY)J$Okl!#oaj{`Zp zY`W8Q)NxuT_T|}X;vXIUP_6bFMj#kGgs69pHuTKjC43?#OA~ntpBAf&V}zP){o)PK z89Q?PZsw!(>&Qh=MVd9c@rv%Djr)Xgj6WygJ|Z4|1E-x;Pld9fsyX(comGt1ymO7A zaO_9cAw*-@A4q2dSfBie&}Q!4i7p+7YuJFU3qNTCgGso-)9MprB5_B&hsVZvc_&$B z6>&Ow04%>WeTa?~8qXv_Cxw5a>6&Uuq#A=q0+?99(c$#~b$pR=!O~$o+aj%H<7ICB zPz3Az-_f-c=wz?OL$SG=3%rQZsqc88msLa)j6n{Wp*PC&$`Kg37$*eFfT%wnZ@^Hw z8g%${HV2k9GY#XfqAWyv#S)=ar9PJ6ZymfaKjU}RDMd3(5i&E}IgW$HVnkPJVah%E zY8(GAON!(V+|KgkD@!#>l`(;VQ+thhyc_e{0<)#Q#aUN@;Pz_}Eq4Kqag}tH-#>w^ z(m|yw4qKy{olg=v=>Mtd1|jRt;BLFKlLbHs{ zB0WPF2WG3kV{#LiT>05|_sL}0XB~IDYkZ2nTIwHN%P#O8t{sSJ1o`BAsV&a?gE)RP zvMNedcz-wRUIhO9d;I;hky2?`hVU-8yY+$0bFH{T?mE_IwuPD){k&}zOvi1Z0nFDm z&!F2|pV@jUNViWsgs`e8VK%FzL4`ym53a~jMT$qf=m)9m+~z`9EAzA!)l~g31MjX- zV(=1IC+WouDN|Br8q+?rt-sQT;)ZCPsCGp36*0`oxTg(#sjMDo^TI&Cr^Zs^4Jju+ zwd?wJ?=f!~!J`e0);jtid41u45m4RdvW5Id1;>0TG++GyqtW<~dT8I6_I;#UI3#0& z=|N*RQ*ge~B>dvN!~NxO15eR~pLOTon&yjdZMDj`4H0jjee(*xV#Tv+M8}8`Pn>TG z%DdSyQ&G(D>$%$XGlWjDg1U0Ay(i z{>ko6@aO^>!)quM-O3;*hRKZKejKvDQ-NZ}`+iU;@*dE#+3t^yWt<%a!#7MG2L7iN z=!mPf%@gW(ls+DA2n{@JWOc)Pk!=;aR)LEr+L`mm@t|o~wy@^U<&^{0+MgE)PRLSd zVikGqDzg4^h;N-vD6}sUA+mbrcHFFDxvZwRb9T?=S4{4AnO6ULq|9dt4go_(;q1?* z*k^ykxsTlB%1V@5lICN9v&<{*aQ~meFdy>PQ|AKi(*?cRWlKsO zJ*k-n2lom=GxV_k&L3EiYKgPozM3C~G}t`&-tX)qj);WR0V%MC@n(mtZ(K9*CGgz7YykTIx%ffw(@`z)|G*jWH3qK)?)MxT)fZp=705vkK@!J zFtsn^yk0Q8B1R?IcG!o@IL2zGoJ_5hYQZ~T!mQg5m;KGM9<7r{Kd0{lgg+=AJ}!gw zQ^HT23LKM=8sNgh;d09;(Efg1jx@67Qz*?^S(m&dzNZixe+txI@}er=xYCO0i7ZGY z`QrzLQWOSxoa-JH%CN_On>z1bF>+pOOyC;jt?|#pxFFH_=d0YynO=aSuaM+td(SkT zzpQkXV_N|qbiY;Eeh4KaZcq^0j=_*0g(8lH(YO%A3$h zMqio3hsm|@d_aXxl*1Wma|)Um6LABg99tc%e6eU4rP;_;ywKvN< z+Ov_gTy2iN1@5oPCZiZC^Y<0J*A+ktgl{>0-jGN83ZX?2pqfz*U zBJNHwdXfUNz}DFlx*5X)lX~H~Dxm*+$)k6qYx|*>*i%X~mQuM9tmk~Tm=#VsXqigL z6MW_TgKS;1HPVx>LJo!dK)De^(iBvFr`r@#8wFpV1}O(lbEgPhk6{f7a)obDd$ueVb57D)>Gz|C11`T7^A=4MRNw%WM~c+{!Dd9wjN_6_54`&vhu$Mnv9oG%9GwlmI<8C0|m z&pV&flLYgmpyHY%8C^eP%bO`7noUK@(O`R1S?4lH62My1fYW@q2RRER;+m<$-L??< ztT3^Xo=!>#ZHg#~zQo6*BvP9;%tV%QCD=n&348?HM=>(Iw{g`z6oyUxB(^CH`uEYs zmH+k-;EveiHokzjH%sQnlGd*G`IymDaslgjpsCH73cYR%byj zu1%2Z8hxKMbDW9;iZ5*RME*`76iMshsFSYVe(BrA=6#^OPQ$3Yytqo0>U)m#_Laqm z%KkK%0Y4ePxwg$DV}?LLfkDs7U)*1K>gskAOw(0zkOO*O+211351KG(%09MgbpeQVlW08~FD8cX6* z)60W=&gXykQ2xG+mw56ZIvZu@J+*^EahGW`?-ERpA_7YK&ZPo1m%r;16%+1ppMJZ@ zyt>=8xl8K3ocvTg+}%NaWHC9vs%UvRnVwm}6#pP+Ij^6rabG*U??2hAW4`OV3eR*G zY({-03kk$QV5-ReN+wHonB@T3`W?8%%u0N-@D}?S!PGE2){}eHmg_0;?V8?Meo5mS z7gh8w8#VY**gncfUfH>G_nZ7zq*|cL+T$qw!|M7j(;Zvt!G9^CouA|VaHu{zsh1WK z!zSA+dqPpAvg{pXne>Z8N*lK{Wlc>%h%P2`YJUU}#vvWYIGQn{i&(qx$i6SwC1D}A zQXvCKk5Go!z1}gIIv3UyZv|^S?%IH5BQ6<2EFgD!*Y^@IFMKKTOL%GpNL+}exDz4G zf_H^}chGIF*$QCvIcmPUHBRPm1OCHZ$h4aI+xay3&Z4^aqID?5>Z+H{QwkqSxZVlG zw+9DH=#!mAGX<%P6pByhznOepP5sAfGVDQdX1%T0Of)Z0)?~~G5*@wUJR0(m{*8|u zt_()?qiDIK0@n4&ded|3c6P~H0iz36>abSZ4)lk*+;7c{=GFK9?^Y9EE&WP@hl%kk^9`+gR!)9a!$ zr!iYEH^l|L-vkDI`;O;m7$5iR+(^_J==tO0BF|10O9y*YBm>n;i(m1l>vNe_k!qeT zY2nNguC*wuR1WqZt->)0EXgFERCcm5Xh>6tFg+Mp0(_;)VYU zf9YV$7q#1tF1PK?WSN-u%*SS4g>!{Ey6oLA3tX-)1Dv)%4wY`fQwE{*s6~YN#uLK0Er`V_IT2+!$QVMb74`^x@X) z!(Zb*Cs5QcD~kYLrg7eIL9_0`PASyaW$Bs|jWysvpu_&&wb*Ti5reNP#yZS@Fi{l5 zMg(QX8=16hVpG@@?5FmJ?P7ZP+2)v(y_22sM}IaBXs{+~mt&?C#>)SX*pobp^WVuf zw_D3j8V>M>$Xe9(OGkL&rnL%wQP##EW3PcRREaa060S}(#vci zKtwizj_z>!Klky>bU_uqPb;5m#oMPp3ZxzJ;WH8j7gV&`cDbG}8CBq8FhF0y9FeQ? zEFCLZK4pt_wVOQ$a2h2>v6Tm2(qf}Hyf5OT!xoZz2NF+n%4cEC{aSn7#@FcyMTw7_ zZ&8tgbNH!vYk0z8RI_LGcfFbjp*h22MxsLdrh8Wi5ZlEvW$qNeREzdd>205~+rCa3 z*%g>GQrR9H(zyO@TBm3c)(yqO2Tw6DlUMssK`LOXUpb-MZJg|`!g(lkzJ-qgK{7ps68}s3g5zn@= zAX%*+*hQO8FK_*C5W9EPv?OWMjC}p4!kN`mjCNBsLOKOi;aNslIjMBu59kfXY0p;6 z^V6P!LiJ@kxH7{OFXM;Efxo8D{fM)8_UPu96uQH{Pv<|(EV0Vz25La!Mgv=M_4f)# zUEyB{uD2+i$tldGf@`c1Eg;whM+PMN5ywpO)Bg&Z8x&w4<`d2G7?KHFekTaTOx~U$ z(-t|5f<+upTtNJL3q$-clY%L-z@47k>ExyAfb#xE#EcPDWNg0R@E58H|0jA2FYmWh z%78o<2!z3rofM)(`s>I6r%W?Cq8})uP;3ry!4wxg=9zIVFq#{b(OF#=L*jSq9>7hCT0ETN8#1w^5yOHFyySQN_)hVRS)!Iq2=(J2?wC;J^j;1^7l5R4w;egHP|2(lNrPS+vV83AM8nShV);Q%Q-V!PQw5 z2?@oYR|R8|d*EmxI6tCMfV`&*zQ5mbnN$(vtWmOF*&2PJVEr`1LPa2*7g(RBIlZjb zWAGcRNpNXP?V8L_BT4L;;ieDbk`N`vVtqA^x?#%Lrm;m9$7iMQGqBe8F7NMG_?rPJ=2`J4PwAw{{a4gt+@aI literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png new file mode 100644 index 0000000000000000000000000000000000000000..744ba0e8b3b59e5a79f71146b5a17dbf3edfff57 GIT binary patch literal 97523 zcmV)DK*7I>P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L|D{PpK~#8N?7at| zXIEA4zka>ke(&75(|b#qWRgjlG$0|6kc0#U1rZex5K&Rz)A#H~pT7Uo_n!KEPsIiT z@}7zcF^NC|DUdShy-ZCqz1?1a{r~-}ea@XblWAn`q(Ii4Gv}Orc3FGvwZ41pa?UTY zp!?GeI}RnRW(`Y4cdu_sSY5m(b;UtI)vS@UL?WSUJ!>4dy2mHw7gHmduyn0q^<>J+ zu1`b$jihQ&OIZVcb)8V2bxT{Su7}h|b$hAx$1PDy+r075=}r$CX{+m5qON+zr1bE* zt@*>^&20Y2--YmF5XpBmebmcYIPxW>FIz1^+lzxnM*r7B#8XJy#V=A^0KZWkVoItV z>-D--(giz^y~b+ER>?j*OXx3O>9rY^+mvina!HH#q}sfuYw_JkseTAC$P)RIe_c!rHVs3%K;QO`G!;7*2(5~+$-mGQpTRF{;6DK?ZoSNya|$!nIY^;@=fz!1@Rrri$Y z)~XKKs54ThAbBNX08$MTN(124kfXpy>Y`Rn3s5hzk=!x|p3d^!)>M5VYIAi)QQIcf z350YBg(+X2yNs%~v@>u2^~y8t-KWj7f7!50VM)bPyQp(a${LYls-AN2qtgPMNeiFF z%4Y9ev_t!Xa}4HOVKf&0MUcKVF*R5p*Z*hQXVN=?ERs10L#f7 z$f7}y4$vywq!g5VF(MTHWC??62+;7fz(TK!^2QUa%S@q^Tpl+Rl@A}miAj{UL9W5XlAL`y`}P`b&r3=W{urqZM7%7{l}BbT^7hEfQW0n zQmYn1N%x{8+>G*R2n=fisD0UsZ9KbD4q763V}PI1A$Q1uPWN;IbP`qlGq`@^@NV=FpZZO{0q-TeGss|pm|bCk!LK&Y-MGCEzND#=DAzHs(bw7glo#kd0k zX6XdwrQ*p>M+f_TPP9FEfL`N?pP0o?HpuIrP@r_`y1t_L#G8oloSjO+9`i-WS0tpHZ;C}MNFkZ4sm2ARR z=w5Y}b;3#Fb)W};LBpD91l?2wRC{$9rXTXvT?&sQ*1UZjzyLbHL}~B_0dfG{M+NFs z`g7|v>|Lh&nugE!x;N&aDUUnJnd}67o?c}!3E|i1m4?GtFYUJf_KtI{n9X=Ow?4Jg zMk-^LX5>U1Wr1G8BRWKfLdWTZC!%L5m5ojjo>HE4rZM=Tb^$=&r0F1V0k6B9!bATa zqtIK1N}}N2+Y`=NniPk<(j#Q1eB7f5gCtXN zs6fDtd1E|zyiVopc|xv7=&!Ev!5iWO9FL#BNw1t5cA+HUFd6I;q(NfuBE#(bft={4#HkMrJ#_sbbuQ7RtAYf@OZxz;5Z8UY3 z?Jm66b~pWi^=Ho}hBZ~5bSJ=Rv;=->!= zrW96_oSCQd1t`hI7eF-RbwHH2zqq5>e(_>?j&<4)b2_;qX{xc^Qi5`AP4f&2VmsPMH8caax6Q-(J1na`k@2OsVq}JU>&uG{n| zi&ulZO;nan;w2*w8=VVf(>6S(tz3^4&OL1z>M;#G(#Fa!=m$DW7@bJy7~G~*zLZq9 zqDR<>^P#e%vznquCX16(>Nij_}_I6oZBfI=W|3qLwI2;s9So zVZl>E$nmflAfY#h2=hkK5Df70INq=UP<`%CpoJF^gQf<+-k{cSuw~)hFJ@%s^kfvR8uMI%UojP zDb+>8-mcPp)?AY}DftnPILHVd>0D?-+Knd;V9JMj|JGa2wqlkA8Dys?s!Tjj_t?Hc zPvN>Eu9EO=w$!$WMNUknJ6;i`fR=CR$ zsi9t`p7pqJK#vC{ zq^KA+TRAii7GJ^GD9?LMg|j`UOT#-AY=fB#tT%g+D;YV<4GCqdg(=5%N9j_!Adg0! z?I2-ZtdG7BWW`;??^+G4hG?7i;)i^pF}m=c zL-JJI1EW=yg(oe!h}>|wcd#=Jz0R|8n*EEkm7aTD>#BdJK>u7X55RPARk`jFdE0~z z^i-0!rA813(id1I-R*n@z5$}7w-Ieco6&Z(A#LeA)3zr`%wyLQVV|at+z3+#j788k z`?BY&2_zSRpmQa;P(E^Wayf}Non#W;E_7(*ffIuLxQ!$Ry*_RSZ_;o`&f8{8jP@2U@Blys18gb1s3GnBJeB9O$`>~vydIRSp2*77F;P4YyxE{8 zUcSJgqom<5E2H8W4{ap1NNK1C1{~s_C}A*OZz&~N;B6)a_7kZkDw|#&xlvo?&CpML zjAiDNz~$*%a+JosY*p6F*I%-#4nzdc@B{d<%>@qvfTA`?Z?~LyFUa4xUAHc zut(dTJgGc7RnS$KS{whfHdyCv9mvCcatm;7E3_B4rd-cMci1Y%FLIU@}7l0&1qA@XC z&c4M$*TX9oTdk$d2G%T791TC!imm|q3nXJx<93uEmC^3g)1YwVjl!}Cct+_Fh2!;w z_>h|0hX#0QZRIWU=Hv;A#uLk|FL#;J1EK;CfLw9-i-+9gTTxg71*+FW9+enPNEj!ld<;IhET;M|E~@2N2?#H&Cc`@T%~( zsaHlrSj1_`lvUFue@-3nz#YutUv;EDeHp-Skr1ija>&;vc)CRA;x;|iM13dNW|UT$;=$Wg2gBSbg0~es`ZxyfN^KdY24a1E<#fD# znhnW##>9jEhK}2yq=bwzx}nX&s0rDrBNcyPTBzzk==$NEXQ)eC?ST`Ms_Vp?^dta zS6N*k=w&J%`5uoL-TO*+5OoZdLj^g>L*YA=y+gy85`KT1-Pr2SHMI@|u+0zm53LC9RSwz2n)m)p|65fhp z+l*s`cYHa0KX`HOmqlS6*FX!2NM3UNwA^Buo_D_v2k>gBnT>rOs9Zt+C$xWwtN>9^b3S z)(7_P`5d4c$&EnQu|oU345g9MaA@&Ds|)mKa+GLz^%;`48nwm(hTq`C>k6a&`C^M4gC5Iq=1BJu3}vu58i0 z_)wWV2OK!F(#`NYgO`b-3+-YL*~`TnK|Z?2?*puP=5v$Et2g}?2Yc!_qjI;GgW)*v zE0papUVrgI{FG$LD~(ARA|(J*bRgY@ynX1b#VCODK~Gq587qeJVm%8_THS_i9@rmv z*MG#3WGCBPk>!1E^k=@%qIU6NzvM~0V*N$wiVRnEKqtH`3KPY1&!?7DYxM$!%2x5H z@)ZJD*Hh@RWXjM{GNjFDJKE6OQt^=FNfSVd4$!_w*r!>jv0AU^iUW8h>%2Lma&r_Db9%)2D-g-4D-rLqi5&_`k+A1%uPc|S9;1qo5jF5^VFK8c;a zP+@5wG9hHPKg5dzZfr_V&*{tg0?NK~<<|Rf(3{Rim(R6{W(}iLVdWDajtO=5e7wgC z3lH>^Bw;cb^YQ!?;NBm`ECoejFeMlvWY&a zEAy98T_vAPW1j%~A)jh+a94e)x39bdRIcKIPllPiMM1+bB2mSZv-0cBLK%ti5udm+0>cBM0Q9IMf$#I@QEt0dnc6JRlkNx-N-P zjW7U^q_+`m73&l7^idAeLg?{HQYh}|`!ul`h;~a$u7Tfz?aJSv_I`_=a9@^Fa*6FK zyjwEO$X@820dG2aI(QR+Gp{cDY-_skM$hpWL|eMnyh*Om2l8)s4?%YlOBkYZ4OP3^^$}2%j;B^Vy#i#qwtIJRYE<7Jww#deoE>ajnAm+F9Tyg4|CM#^)A-R(l5Y$uk zhBZA8;6P873Cy5`iXrqPsS45&k#C*wb_+akozhX0=UJ=_C}7wo((|pF?v&~_TcQ4v z=O4#q{w0a>kY4#Rcw;^WPo}B1T_)RPwe(CIPtR41Q7gz`_;>>8QRMg>13@6J2@C<@ zT2Z9f&6N!*V_4qapylg(t);d}iof1L*S!&jm{EKvTpfBJ#G@tCN6wnBEE$?cd@Ece_w$7o9X(KNr zVT0KYyZ$r*!uC~vLwGGxevEJJ%B#-$KkA8gu{7Ff@qoAGS z^}3G+7|}M!o0HD$Rv67N=cf@*N#?_jMb4uDDduWe!-oF!TXoa0LUpqbaf4SB?GscvZ15pA zLl3}$Jz1y^D|1XvGe5%+gAH zwWRKI(uvik4qht1HxC^e07;>lC!qn83=Kd#x!o>c7jl@url9~4{0io$6gwD* za-p}H|IgpF1)u*X96%`oL$a#P|NOt&!q5MkrG~~7UqfMfI`%1Eq|!LfRX54thr!ZYVd*FKEX5H0j%uPyngg9DjM_LDLb zuiiE%OUlRfL$dTaQ^^Lgx=yP8d-LmjlRBRlW5J`Pwpq_)F#4uB%I>hi@YarW zlo1fTqL=u4jj{?rXPF=h8=$Gv;gnc7^XE^bS>L27w6Acn8fmE-0O1A@LhyJx`P%b7 z-vr_D1)~Z5jQdR}7sDKIjK){m?LYP&e-79z{QOrOn3&OGkoDqE{Gd0wZ~WBRy%^7@ zX7fIKvroPQk_;3#_blJEkDDZHiY~_C}a)^uMNqk=z5%6>G*ncDss8Tz0shdSMoIS0-e8G6PameKPVwBKcSs7OUdVV7a9$0H+T+lVh(=OOR{=rJzQS?#jD_>k zi2}g+V}BiFj$Qz?Q%J?)kGy%D@F4-tC_QAETAxb~p(cHWNr2brv-awv?)9KVVKSQ@ ziRNH(A3aihwGnELvN69E?$mDjWA&H@_w`2_QpSYZ`5d@?{6%32vDX)1Q zm&6x?S2sHM@WiL`ZK-at_R@De%1P}L6fyTUm|o`l>qzVIW92;#`3DGGk&(4aX)+yh zJw63b74>&xaM=c)34^$Ho{m6(AF>4e-mz%D^)%;IyyQTqb(Azy2}7izca2YYM@By3 zyMW>Z8K?x#%pG$;E@#!(f&Mk7Ng2D$#i!Z;-e?or=Hw{=EFCtUps$20UkAS&Ta_60 z-edXd^Rf*_5Li+4RV3L&$N^vrvV`BJ%0`(9!(n*FZBQWbm49>P8845il*7RfqWcMz zee*b>!-oi!ip?3n)jG%TvDV5{0*}W89``EjCd*ZayYryXr&Md9}6f)HyoN!@s!RxzT*%|;X?&c)mO&wHbY29 zg*Qe{a-X0S7rxoMRZcAvxP~n?#C1N8LzIBRhIz3dKUa3@=TDDA#1&UQ1lJLRAR(Ub zaX<_X9R&6Nl}kE2hfGx+omk=exTH>n9NxKjw#{zV5EA*)<9VnK8MtpNqHa38z2P~o z^J`2lub3wf2yN}46+%vmm{y=8^_>OMyBe>tsZB<+%T;XBdM56+LW9-%AdjlgC5IJp zMm@yEb^<>^=R2zpTc)um=s&!x<3*m?+JJRbAE7j*!**ZZey_d6-(Z9XCizRK2`k7& zZ!16I+X7mv@_zKJW`)oYA{x*a0u)MvLBwE72@~uzAe(9V&!5+5AfQrSpswBE2xHh= zkGzAV6b2NF0MyICBUExGh>u64X~-i1%={Dj;yK=0P!_PB>^?!}ZF0(ka`p=ZE2$aI zSD5rZ0dEM-jD954L@XwyvYO80>@cWv3*0f~=3dbN; zs)IP|cE!>;e)jef|L{h=>S{we4c~07Fl0(yr^mxOIdX3oUPZpgk~WCt9?AA(2%Sgo z*e##}6j0Jxu^PS zw3Z&Tu8DiCr*yNPO}PC)VT$2UI{6xXpAnt`AK(l|50KHM^h)7H@IvnAKEhW_1cZ8YB8voY%lpR6 zO--(ds!SA+@1&jVK0#KgXHDF%p$8zCvwgXDc{mFxDE09OIXJM39{>ljPzE64uMVCN zA)ny61nGzK@uj0wDw~}eoshVxySD}HPrykMav?9?&t-Ig-h|G8!kA@7{}n*zEFSy| zMYJ716%fgky`Df|Rl{0XswcBbSCihpXvNCo)?R+fiuKLnot1yOZ$>TZ$mD$iH>k@G0NCw19Df*hrII%fpNY^P}}ZIvQ@$IBVl@Px0Z z_&f}SDUBP6z%I)EY51mGEHnR#%W;T&N#~?A5=yuh#Vj9_#4mjK zT&c@aC-LY&9bz0p$av~O<7IPcyJ#-o7bK71{Y~ZLSd@t0TUK7Hds>_i=34ReF-1Qp zOJ^h&5{0~{VcYz7&>KSc+x~WFe(!GkssqD z&PXJdF}msP7ZEzkF?kLDisQB;qC+8H^o~4;Ng3E8^$BUY2t#Nm<-sE0G}P!#no2Hk z7jyt8e`QDwVOjNB9j$64_45j2RSIvTh8G~f!ALMRl+t(DF$ADN(M)f%Xb6l!0w@lQ zQYH;s0T{p#!#{b#GpYOhU~6rob(FuYqLVhBUM3K{%zNxQiiZM;htNZ#zT!7h($|tu za5s_|M2|oYK+)kuTpip2Oc&4Zw&o1`JVRSLZUg?IA&x_#1@Vqo_jK61SI%=F;nhK8 zc0@uyUL^uJD38uEnQGW*ir;;q!!R39EtgEFr+2L`$G}+t3-*7$-ibG_7*#n~qYK!Y zq)(l(kAQ`02aSTzkrR3oHgwh*IH-O zq{@oHNR8RxEsdkw{Rt8pqD%y|43P8HLBa8;jVBlQTP`&#TE4zb2BKIfmwQMWkm!tu zJGFe?Fo1Z&;MJnoWVsrO%db4)=a>!wzA5D3sd{{H^<10RoDYi^suTNQeg05J6em3z zVQyF%uPT!N1#`M={f>U?Ek*4;g$@B>m-}%tp9aG7!|ZYQ{(+jPf zSYXA*Ht}9kTo!4V5TJ8F$7t(mB3BgT9cn$5ZZ1CLEC$;5GnkHfsroXfeSO=0vUdD32V zSkhzP%P9T@w>qnmgwwg{{`Fs@HyDM9VkwNEp|o;|6_QO>6u1@237usOy3VWjEiG9P zh9d&ETs13CD`Uk8feH=ed&y*+0zvWv5DR*qucWQ1%CMPvlZ*ffuTKrEM#p@^ZnKjl zltWNVzDL?8NXI>zT50?9mx@1M22yn?IqS;ydM6}w5D2Mj@M>Z(JiTXzwPn@GOaZ*u zaf|0}k45g-$gJo*YEfr)!MtwChE;pydE_>V%Rk<6vgDiz0bl9wD!=Z@JMhqTF}i}n zW`DJ{1G>VnE!B@X!8ZYLn#sMl248ZKs@1)3;K2r1}?GxnP zOcacdi}n`q1Z7a-gB7`;e6K%>!GpGmJv~1Z7C-mxJvz>m_vfpSbSyl_gOFGmI{Nm@ zGKg+R6N`^6Q;cFFNg5rc58zX%KFu&)%*A z_Bo&by3POMzr6{7(@w%7fP=Nb^ov`pwUV%A4JESzt|oz4n~uVS8fDvN#i+aSF+9%K zl9n&CWkg<=fX0|E}`uo#^Dmt{?6oh-G&Y7zSe>h*-M3 z#KZX9cTnmjy`_^k@Ka3= zOuTm}rt7`?t@6Z!{@WFK4Rx9StH1c7joo#tB`d7@hTbY$%UWK5mkYXP{Jsc3;g_4U z$XZrktf8-fuqIEExxxb@2q}~yIpGO1D)!aqh=-FQH&iJIiW34tu5J)I`3o)-<`=B=tAmYvS#iap1$VK`j=6Mbn@f#wOULVhNP*0XBdU$?hIA}cTJmd7Y*vvEDrXg>}T9l6Tx&B@oeDHP&iEovJ4aOK3Lr+Y=S7T2x z0Rh2)@eVM2feL{#j_|JVYfLh7*HWeq7{Yt!Eony}5#F(u>=h~I7Ox>AP+ZX77KI$2 zCc(f#F1i-+B@-`GE+9bY`|6~(==8d|U25O3sN{=R@Z>fneL>&VLBH^>Otsih+s`OCssAfgSVM+`f8b&9PJ#N+1$+>?_R!1kB40LeW-QG4$A zMoyaoZNVdq0!1;vu+m7WF@=@KaDQ4?(LS|yp><|*4lHzl$S(sZk`_>mV#hfg3)Faa ztmj7}R`#*$Fdvri&F=BN{c|%!SIGD9X z16f-#n6U)|Ia@N6v&6iapB64AY+K>O-Ya#MANTj^FwmjgS{q88qbsIAB@zU1s&!m| zF>CDWmb1Q4sw-=xTxy7^=>B>ncx1Xb_(;4;WVZUUpH#RmBg!gmmR%7YK$V^!kMWO;Dj$ZQUZxw|sUwV* zHd4Q7JMtfMomeo;cjTBp$Ll>E|M*)7wf4g*roKIF)To08IdEwdn8!u|LRd4x8FNf#I z^7(K7ZD=PFRTBk5{b@S-tPK5PuD)AA7@Z82h;GiOme|R?zxWQDNJZ~r%D~uITtnmF z{tZGXj2ohOZ>eN84Av00%sdmIrFu${!m6aaKURfh2SrtPMy|)wa?zVA8F_wEz`g+o zzec6(`DJPm_|aTG++uP*fFEU^dYX`j0JsNZpjm)?j050*wJ8RMm{9lO)I8f=xYjL; zIpjUX>ufYN-{a!laCQ&TWd|Ti@8u27EH*{C9Gybi=*DRZ_=)1PubHYn;V!&If)1yA zyHGxtw)5w;`m1Qj4G7W@%XKBL4-SVPx<^mqTE^Fh*81h-d`5X4N_fQ57CmEb+BZ9^ zJ>%b1_77I5qYmH~bd@@B|3B| zKilBt_npljQd|wc%1>Bp`7swpe{Qu6XXODls_I2QFDyFvW!qCl`wN%bczV7-pkdwR zTYZOmEtyfH@f8#q-0Qp%!Z3!_!ytI(Al|z6r=|EB`pQ-wdHTyXI@TvSGVH2Kr|Ne3 zc|U_@dm4XtSXE@`HaOOA&usXLm8vDoOf4%TA%7_(Qv=>3%h2!~n4`f{C(fxP_yT0$ zV+X$zqq66Y{B1Be+`>rVpi}7q9*ss*3$0H&gz`H~d;B1)8RfgJxwgyez-Dis3sa-` zx8juGy=Tm{A2@xc=W{eV)B_6O2RTSY&uAZpw7mI)y82|h4qeIXP#W3L6aD@62ls8W zGK)w$g6t0FA4}2i0i!5!Z-r=Wya3L1fG5t0GA6BH)lbn11ng_5~eX zGxCsPIuK3=kqOwM>PS!SUurqk6!9{WUa9L~c+9K8SNQRy*OmtJ=js2t|9&CO-bW+v}MCKW_^iLGB{ed&ywl7Rdu#G{n(tiw5$xWT+_TS4P82&TW;4Eo%cx zn6^r?Q$16=1jLZ5Pd(?oo)23BPBqmVC7V_HxRyybabN!Wq@t@hZaTdh)& z=cl}g=e;y5n@9m=R^z5?K#vSVjg4|Mv^mv;$I1^?4`kQj$XI9TAwpF?W^{A|e6@(5 zK}^c9+e?pGp|L}<-R{=_Ts_&Wjt3AzW)a8;aOkL5h$yD=Q7$J&G3ZS_<8fek1o_5v z9hAk8*jrCSOhyCz6vA6(b=WVTyV#}XkQpIx3|1U52>Rii9t6TTE)*Mme19}zK?wf% zloUMiKY8-U6bb-BTRQ8+^|?TAVUPEEC*;LJiy(;@GnV#eZCQWDmg`vBm$&5t#HE8d zOSKi(-RP0kaN&1Z2Q};rzsuTO+i0z|`_))vBVPs^L>kASL!Z)p(CndC3&Xc#r&s6X zyfoEcu!+Qcd4ete!`sdE-O6K3ji<(uqTuQ}D9Tq?&Lj%QVH~{L6t6y_NZxO%{(A;C z+x+5UYf87MLkaUfb6OYLL}|}}SH7TXp)4dPbGu!XBlIp5KlwzuWUaioq zp1+d|>frS>kVL^#II~u1 z5{mPP8&J&oF-hsXUPoz5*Q28tI$?Z)27dTW;dFh(L9UT1+DK-J@iEP|@^cCkw_=8G z6{e+dv{O4-)x(38TOh8S43Y(eF*}C>N zyL@Jcy?6F(`}q91_Mv&R>__I#wI7)^)2{28W9POu+tOU#(rWfyrIPDz(w!aJLZgh7 z@@8Hzn%0>XirN?cslxPq4Tk)%8_58hQ32@iZ}weh9TORK*jZ~UC9G>AYaJ!Ud)e;- zqkxk}rZdCd@51v78>Ztq3k@za^ANxY0n@C$Dn?drHtq2rFP>v7X68IEW;!9a)2S3y z#P!Z~oH#m*SMGTlheN(s)9*vNlc2^gqlqz~r%r#v&H+s2JYEq|&=`lkd?90}Kr$M#V?I zvehctd1|C48%ZygXSze#ltN$xw|I$?lZb&N~$ofQWm5K|!=X zAI|K{UgB-jRDHqPDtEd*$f72J50A#%PfFLDz0k^;ncj}=r6*MlhK47=JqqMTcJ#PM z1wb8Xf!su9kyR3To5-%T(d-Jzt{_>a)cZdmS&ylX@|Dz3Nu87GnD`7Cd|tAs%{rP` zI-wqiaxe*M@hQ4LQSkHUx~!|*v@RHa;!!bNKdmEYFAP?#ccSXXSra(Z`M8Qpcibt^ zA0IcN6rZhgZ%ktZbu^vXti5~oO#Ae*`SzYUJ$7z;yUoewEGK7{EmQb|02vJUmLK)3 z@Ie8tqv9>F*|40RFUV)@9c?r0%;pyBEthRytt1)p*?DR*O@uI%8!ADb)8zpMr^{hb zMW}r#M`xtQ966(aFwEy;50dlY0LYXmo+E(AiYA8WTJ8x^^J9y^hf1W4<6*?Qr0`JX zW2cXs*yn20Nbpc7Z?RH#uF7w*iR2P1RQFh>F)Eg%Kmv{i;3uy!tZW@G|5Hm8@4p2h zz7c*^3Y=6=1C-JNgVc4M z6=+{LztuX5ah;|T^-~B6EIJ(gXfWa*4gB2JiK=_-i(5K75+TEk}9dKu~Pb%`g-Vbxqo$rlNgd!3_Jkr3>uL_M+wa?FD7)c?Y)ipTcyVlxLSn zu=zQRl90`4E^SZFn`w_Mm}PgZSYVGXnq?0ynPrbHoM*#@jLng(ejs14g}H(~J~}KZ z1{|0ca-mE=0HPlJ{tO=v#-6aeq&sjyKY$gcmcS)s|FR))@HAXzB4U$GAP1)C$CiLr!I02lB-N$=HN12CZJJs4@F-(R*9;N) z)=D-}w2!v`h|OY{DCsi)gVcXx|9|mb(c2)-OA^J2=PrDu_f%7mK!NyH_lNe10eB8S&Lu3t9#xN; z>g=B^d--pIghutn3<(zX_LfAc)JsOPJ}ON&Gi>$WOJ;VY|?p&M8mu|InITDy1YJUh@_botzH|1-AePrqP; z^7=Am*(V>?kcs;c-!nvZ=$~Y!XD&yT@4w@VPEMEpIgqICWUH&`8UlN+fF4le^$MS+ zV>}k@N9`*wJb{;}l3xaZC^Q0hLAWpx02xUPQ5znM-2L>lY79Z_gg|O6y~s+bxmHaT zEn7Rb8yyy5)SxH|b7wFte!>bAd{nKa{*sJso+?0;KOVgdJPxCy0b$(!@pAy#&${RE&CO95z(!d3>I+_;o-^O4R9Oc} z4TX6otz@Y5)Nfv4OO|Kt^qr&XtgGG$Q`YQ(5u4LDu2gD6Rg^)izcVYD_>`MyZr_N_ z?i-daV$^^Lh8Q|6JSpCmW_XI6d~60J>+E?+7l`XWro|$NK=9kUC+vaVQTw^2ot9^^ z3eqqler=9y+}l&wP$6aiZ|&*!rSn$VaE_nf)I;U9cH2I?{)y-8-A}xrG!476f6)GX z$F9Jaj+o+WKhx1pd3HD*?OEI&$4VO$y2Y!4?){2Swu|j7epnCcHh28<{^8xQpc(AU zt3x`KaU%JDH#GeK2#Sg6UJZ%H5-Y_tl~F@QrLcdmxxUe6YN%J%keHq6sbvGxh3tG%8d%0$_`+T%QkEuT<6$=U`FIl5NffH-xirI@Q>&axu4l!B_E+*^p` z;U1jAe1D&KOEb5raIXJf_Qn9BwVHjPDln9#@GfT96UK&4=29c2z=b%4w6pj@l`2oY z@sz)o=)YGi-n}jk>Y=GveTSbN#h-BH>@45opUd}-;23l~1&$5ra3Xxt5IiJ`i)?iU z_&5W89#`PyZ+Q^rXNHqZk*J%Aw!Wm3{&6gyA55h(R{rJlY(ZzzR_`3PLa8K$!6#B$ z6-v1yg^X?NY4gsB#gqG%uwat2T^&W+)s~kYB&?@z%;xou*m+y`+WDLJ*?BMQ1EyTB z-6Iz0H5&YY)P%P=iy(Y!lX85^iU4vzjlaMkU9U)gQ#P))&Jl+?D!tDRQG0KMAjhw) zUTlAK<%KpT?~fqB_uWrzwCkRD$u4|BU?*N_ufN>3*X|ZT%kS|vP*zS;+au^_cyhFM zI$F55h3II{C&}$a;H`SP&LbP~w5|EaRL6|XAN{P(%16(T32Ok%9eW$g0ho@TeV9t8 zzyqXWb=%PdqU#pvM`!v@szn{*|6r@NTY@9&A0?%7)$xgF}geVp2DFallfYnD4{W1Ek%<)pIso`nBrH z{2(#{oax8^CHebq987e-&wkx|M>c49QZ`zc4ip2T;b?SR1BqyAK3pB1FNPCzK{AaGbWCTy z;mkQL-~$q=1K^jI_eVG&nT@UsiLA$a&*~;SXLjglXjAIU&@_A$Ab9C0}lwX*UN z-}Q{zoR6o9H{}=fi!u|oSHN7)7p-S#NF_+;R8(4JKd@k?-FWp|RAw_`u$Ix1{m3KF z+YL`_wVr`tICFa%%NOh~<@G(fOQRz=b>4&hKge~e=xBz5@k2b1uc7!V4g=mGU+ERa;o-M^!#x1#o?kTVWuA*21+4h;K6_TY zr;-}>s*@=elJ-;Qw^&b0DquS8>Gg$|pr2|k*CPo1p`H?edom_(jrI?n9pQBHI!h+h z1+V#$#Xa`W;+b~W$^|y3f5L8fWP@G)%yxln@cNJ+YgX;tsA#mu~haB*tgdx%Uvz4_B)Gb+r_>zsf8(s z_-o#b9Qgq7>)r$8y+QUmZEKQeATNpDHta=5peP2bTMdo%zoh?ZFg;1I{zZ=pI2@au zVCp6eBDk)Nu*+?%c0!=m|Z)xnXU&wvN#_A>68UU#0DDVj?+AF1P zEqubNZi_~~s9H$IDvq*U8C4fNRc}w1e?tKHG1Xo1M?dGvITgH)M2GW#wD`0s6vro? zA4dQ{!idi`J|FiyXV}Z|7w?bxK%|^uMVPR9)>`rz`}l=9>uF{_F0`qGzPyjAx&jZd zkyaRA-~sppTl!DNT-Okqwqut9;bCOJ3aey5>`Ujaa-LL#{ld2%un#}@99#(BC|LE^ zi7hmndb;gruD;Ob{>~RIJu>D=DvVmhSEvuE;5B%+9B67B?q>jUO4zaJMB+e6kPN1gj<5~p1S4l}8j;o_5sI$0Ijz9fwm4WHH6@ z05#qDHQ*M9)A5i74-kk$zV7|$kGZ{g8wnmDKnS4l>S1$E;CDgMX1B6UNBICCYFj9D zYXCg*mh4qm-;3wAM_lD68C6}clsnrhJh?hO>aS;fMMcaA%)(H)p^*umX|~)D;2p3l zp510=>>jZDmd&w0e&<=rCoAu8P#8@Ji) z{xM6I)!|0^1^C^3_DcKokG#Vc{^_mOtg?L6p#;dmhuj=q0B5C(>+SIf4tdeebac?9 zyr+SX67ANPz1YgKSGQrwPKKqYOhXhUwn`6bu%K5|vnWnNjpps(ebBLme7t>vd_`tFIY&KBvyBOy z3iX{TbzINsS>4AB8NEVceyowo*8HW*h}8FMyH z84U{1Sg2_)KS8s3xk)S^<)=Qp!|Y8Y;`oVI-VgN{tV#5i;C05 z;HQ??GnusX0ANAy9QgbU@P$Q=so+O=DwVaST-H8uk%qmkGCHP4T!qv&fEk@>WcYv{ z?G3oZ9uog~2d`*!;PEfT0hK%?kI>=cKdU^+FU;?${qz^+jAi6%=l1c6ov~xD-SF5} zpUeC6x14P+bhX&3-TeYQ<;ajh^7j3gDi!UUJ2+;0_}IbD?RNj7MfSN%R>|Aza%miB z%G>{Z=f(Dgi&oq0+a9;schV+GC7$RAST)9Of`kK~`cL=a4DrmLlh6s<^%x=iBq`np z%L@E~+}jkO{29^lP$1`{s&vhNrLML5gdS6~;EBRB{7ffJI{=PlR#t-sDwP z zVMX{3$R|M**O$A{CXx$P9Nc3B)IoJks^?-*E6`2itzn4NQHfxWRbouz%=$cg-}t%m zM0gpCJ#t~P9dqTHPiA3=S;c-Zwbgc}4g?R(>w0R5{aEnWTzTAEqE4?2@Tz`3BvwTL zKKCNjhC}IdRnNM0$Yb;^GF0>xQfz2`?Is=S8-pK<6*K@q7Cy`j z-3atz@B;)Ewq@<(>)LFVdKduS;Xrxd8POJ1@^ihU!{i$CgD(IP&|{<$xC_9f!7oBl0IP# zo#n^mAgRtuBOxf=$=mPYlvp_P=MUEU1c;u{S8_BAWRD#U81JzgPc63t*-Kn%2rX5u zT4(iU%U1@ZG;Dcs=l7HoDqG29ZD0CbD!1E*ZAtOz!?!SwdF7-=m;@ru-dI2ba3y8a z{k*X+3UI^l2vGN^I%s%I>!RvP`-i@t_3%JEC0?WePEvOn?fcvQ%pS;Y3UZfBPjs&3 zSmg6C%vVXP;%i@!(><&AT+SQgClG?MPrg?vPaT*bp3jk~Zrhjx6z}s!KP&FxpCSH) z;$^-5tkdHOIVemqBrY63{diz5!$BEX!qaofaoj_L6GBN1uI4>|FZ32}r?UhycldLYI>p?q+s`xuV5+V73OqnDk&ssSa6t-$!ju~`Y+vCWx@O3tD76Xe zDSu7gOh3^hV>tEXLtXL2aJaSck`1S4DYPjlmz0{egO68w1Y@PK)G#^+B8;I54V#XB zQ-$J!GW#5i0z%pBgUr~6#^ohTP(is!uSV7%u)wFIh=(ftPTNfyW>2VCOowpi;uRB$ zCP;93&~&tm$rFVW_!-Wu;mSHRq=hflLeFFjVxEoJl+G)S{4^&X4IdyStfTU@Vuie= z0UqXaI^^#a=Qs!=F$GZbt10*4n$o#;KqF5NPgq97SUf-f;)f!+N2oadIw4>66bCGJ z=z*T6ZPko|ee#kvJ9B23@557Nrp+bnMvKYu2oMYa>usST80w-+fpi1#E6w5H=bfT% z-H;=YA&9te?Td9f(|&AbMixO@w6_v6CFBtmOZN+UN9@YYFKIMYwEun1IksrH-)4-B zF*+0_En6+wTQ_aDKfU67`^(GDwHc%1cG{l(wsLo$UEG+kbDG$qld^pk!LB^3lrxMB z8PaWXoN|FJR~8Fjpa>m7-EJB9Wjn3RRtD}N(#MS(uAfcswyQe-o74lq4J+kd z%t?^TM|lSWrM$o&^Jmm!Tk}UfjBQHJzse&GUSRxoge$tz;5F_keAxHQ&6mfBhXQ!J zmyIqce+LHtWkHpy>j3z=C66iRV4MfTXr=fbNQJnkW1t{lwD+FYWUFQtWkB+_06ylF#Anz7mT$2v|xyI|u@HH1z1<(cvYx2bW^Y`-3Jifvy*JS`-ip=mD`Qb$l zWb*b8OIKQ5`Fw1{)2eqxK%pUYqin;4qJ84}ciQHaU3Tu)z4lvQx!bqOgs;g|txsvb zHB_|+hxoB`jlgPUwWDOF@&IZU6QL?|q2dJ{(-Zd)0YtBx$oC6IZ5M|@Tpe;h<@$(3 zo@yiiGE%C^_GRC0l~lVPsP0P2OB2~fpY@D?Q*|tPnRv`hn8Sm2*waX<_Ld87l&sVU zCwd?Vz(hAFPO8iHd}>N?9Y#v)I6WP(_+;F)rMwdEh}rSx7smN#Q;2_RSh?-f&=nym%C1xZ9{%&qd% zqbzDLzt>)UOrh|`3L~8e^Op>p2n{RQ@H3b_$Ca|Z`lxh(nuXQRP>|{`wD9+I6+d)9 zJSHA8p_Pzf06&g+AtSyA{5+gtqIk^fx(@g$BliLo&b~fAW{^(i99S}nclok5`_P&W zo83Y>MFV)0n|C01u;PSwYAFG5VsQdb56(h86%V5ah!jF5308Y`=N%qrjNO%jOhq2< z{{D&>Qt0ZzFe`ZHojo{M+jU7blnIS(+G-nB#HiY{ z-wM^;)>Pr$^M?e;s-NOYiqZ+X9i@xs2&a)=(LO-m%veiVIo)cz1%Am?&U=)kdioiq zulcXK;VFc-A7C0|kpN>wIfcYx0mUFrPO6gb6%PS6^$vAE$Vji0B4`AVS9 zfFpBu{B$Uf{fo}>#8Y$-0J`+DHIucUT-#zxX7Fok3ID8`=c79L&{TXN)OfoU_8rgJ z>7mO5UB2m}<#yLO^X=I=O}4v@Ph^Go-XKRK2SDUnx1Rnno8LDfOe@>`1LM}Sf5hhR zAGcW=+OFExYb_)EAi8QFd0^~l0AgU5w%{YV(kOY?vMaz!dBQ95`cl`Kwsv^8tsK(` zOCv5kL*#SKwePdtiwkD0Df`jKp0QuNWxeyO7~(@+lRUz^N6o%DIBtWH8dZI9MStv7 zR2gjTiM>7FIL)=o4LL>6kd=ryF%jkqJ~Ye}isQxv0QzQcI-ex-meLp;B`lV>(hq)p zGDDldIqj@q<}q;uPFDX9r-Utj^iU3uLvi&G5qI>KG)uBEVO`_5%LD2SMyrNH*SwMa zA|mcjC1G&xT_7}M8XC#pIp$~n4r`$Ani$$qXO%OSS!$I;o3SdIua5b=1$*@>a`90* z>gt^Z4X8f{Uu1!@M|>cw_m5p@^BSGvRSKu@FK5@=t_;5&j6t#S7+FW&i_80!6Q%NL zs+53?4dc!qA2dy8<;lO(e-V(fLc22Z=(jngZ%Dbv#7W?V4xlf4m4AqW9r_M(ip#ed zJ1XC>LPbLtuXpei>4Y#K4A=q9a}L+>*@w#Uwa3x3NKU@>h58dN4-d}<%1L;Q6kqmh z`1`%{Te9|%3%abM5Ei5`;E<0%O$-3QfRub%Zzo^Pc4Jg5g+tpqo9q`qb+K)j*NUJl zB}b%Iro9zMAmIQ`yD0iW37h`IenwHQb2gxwgFqSVV9lvv^;&{ zAy4t)i(w~ zzek@%@w4#%p%g!Z7s;n{vnd4}KIt%=1-QR?rYTV#0u?3gc9e|BeL>Dvyt^sKlO)&%Yt$ zDBde28jHI4L^|yw&E{(}6`!5PkOUHHVCKWz^U<|aWZ;k+zLbkee7@~Qetfow74^D6 zItD#Jl(_zTzj#4_`ILNK3B^hlws?pIT{DNrFTG8qmg;#>X!P2@*CAOJ8=Gy$*!`+| z;Ho#f&PE0P4H;mzw$BZo-TXXju03zv;}0o=s(6>I@XYk*b#%`$6Y5VH02|6a^`7Av zXB{!{`QA0|`SYj>i$IXi8l=)mo8OwTPp<2k!?0}|FB2)dZ^tU1XXxE2V2*$cvrH`Mr%1+ zl04v_-qaKO>e40lyH~xC@r9hmaQL8*w^HVmLwy7 zpdBxezoUX6bwL1dt!oFu=sqUG4;KqzQ;Ckurw9m^U{G&>jrK+_{Q(^bwxxDJ>*(Yv z=s+aL>7rDkmmFKYgi<6a;*{o;1&AwiDSJr(ILzBk=rQ?AA1MM=qg8yBI;KOei7@3pB848Eqzbs101aJ|zt_r@P=eK8 zSA8rhE$@8mY6L!Cb#I$)uULV>&HMoItu4)*>f5?L$e z686#a+pMLabg^*&g5t-4)rY^qD`d)oS_d~f>E707u07p;<0sCyN0-kE-kBUN*|`sQ zxi)!ncyV}VEV_EQA2L`xH}~KUKX|72ipMO6$MJ)7Q5^DA7%xQmJ$Xmr9?#RMGp zNmx0bvfD3SV(XsXX>9|8?g6R<{n6P}?aU0D#gn!L@JE)?69(N7I>T#)OwUj*ZOBBB ziqV<2&{Yib#~~Kq_{alo=$#{hs)Y9`iM;L4U2Uawm*-8F=|f2>>Fs#p<(w$J34q^c z#Bc^MV(<$AP7DkAf_E*^A*Dm%m?6?1^OpjQCbsrecLHa^NDZP=EsEc1>*^b~yG~nZ$-JVa8v?(Y8V(ETRfJC&fIiA+ zaVl$F>baf)cohx{bXq+0KRUxn0HTxfEJ!-}zjvavI}eXQzR{U1Rb~KA+J{j>#tsPl z${I=dJ>bhcugYUuMh&UF2_rFiPtWn@5cvC$@V0!*0yk19AA$%hcJn#0M5n@JP$;In ztxR>l%`SgKL1lSi@&c5kCZO7%y;gDC+;)Id=7w`J$e9y&Sh`lWy8pPhvcecRtILmp zNan3GpcjmQd?CC-7A)A;=Ojbm)i#FEIT-;U$f57Uyqm%OkMUTBaCn_)UctoPE7En$%S_H#v#695=>J}C%p-P-)Ds4p+rCp zvw_Tw;fXemN@&g!Bd_}_}!-qsAM-{h`Xpxgxw`{d6&u^>r z7Ii|w<;}1PuDrwKIs;z3h@kxb`kKyoYyh9@yv}^26!6Uo@Yv_ahG73*j-F9AuX6p+ z*+pA3Hyb=Y@#WhkWGvKaK*Qmi&s$*MI%9!7w0s7vC=E8G0%A><4JPH0VaRS@42wZ_ zc~QwR$z@!~=L;T6;2xUz0PHk81)(pEvnyN{K~)Dip>X96m1&h$mV#wuN?xuzZ{i3ae)PV zfLBRz9QZhpyTW1+4A&H|>nIEg{|EAC0=D=)a)7O71>4_rrJUmq#ZZ0F4<6}1WXg@_ zA)ft%v(rp(0^s))m`|wHs*pB2*os>KF`jms06;^oxuMqCP)yf39yi8xMP4g^(B?}+# zJF8%;`Ef1%wakI(C)d?B#JKY}6e2E*bJTPbQdA0l7akVl8d z=)cByKxo6yMKa7)SOag5xC~2mP6!bBlCcZX!BA&}#WndOgNTqpgaa?92=tt$dVoRv zLCgv!ONP=3d4Y{lUCR?p$`h>j>MRfh02=_Kj<@8t*e~}yY(2R?+f(aw5SdpWwf}R` zIriBfJjWU{m1$miWhkp*&E>K{@FrWeQK$;zDh#;svQ@|364IZIm2E_!r8=MTXKPIG z^4J_7gCMW=#efID03;yjMEgt?g05*ZUrLd#>@V;o_ik@bbQ7MDCvlt`9z^;^#~VtR zK6(=Xzu!m-hUdrEQ~a||QY?m*ct{S47@rUYpqjKorAcG-jGtTq1xf0WYkY}ChKy&% zJGN|1NeW#Y_;ep(rSSvtDdka;dDn{mc3D?60mo&34Ra_FYH5xQIq$E0F5v^PKRF2Z1pHSURf;3I*tNtDuC8 zy&(W(l74c50y`!?_YQP~>Fj_Q9X_Y0Glt98k>WB$M+Lzt0Om0{XJ_2(@VKJ>an!uj9h<2I&e)T_*pSWg`Q z)ds*4yvJVO;hUuWTF+zRo_bc38usR{v2wCa&*|{gnITu==%5o#*LrQ%#BD04tmec6 zq~k;XrjOoS1o=LrfN2>SofJ-gRT&@iS8OQuP1xuyVFD!<5cr^HBf;Dmzy{O-NLZc zrdL?c^e;6e?{B=M_#lqb14J@-hPdHc;at1d$PkTa7$#xSwS%IrefX?wec?mbz97O` z_uveR9)7R5EVL*b&}C@e08rU{4I4`5SPwW%&4Wc1_d?ZHys4sc0m=z^qWAUBwOe;D zw^jLGyDPoO)~0sZ%3Zy7^NQv209Eg-AdJRR1%{h5cK<~S?H%8I-g58(u+f1f0Jple zNlK@wEuNG&SXSExxr%ocO|{8`Q!HB#;-OOri|-&hR=xt$o4MLbDZT_F63B+;qQ?tu zldkQtp7Nan%#u1g-cuKtDx;}+O$Vjgn$N!xg<&fMIx^h_yy`@Ej-mQww`#_oBh|`# z5De7sbS-bh+ev~YoEYDW6nj>a2Y+t4p{2R^J$MT9_qI7ZG!Ui(P;rwWoq`m`r>DZO zSVo8DDx6_zT45+S9~nrpSs8#-TL7G_>M{(?DZRrSo0#Pd@at?2q#h?_^V{;4zo5su ze{hkFd}yhC`-fK8Z``rTZg}_w=XQ5{ll{sE&auzD;|v?gGmKX-uZK9Fs#jpr&O09tH1mN;vm=Ms^-Yhp!SlfQoNVr|Yr~fY8(G?D?ooNDI5Lre~w2ynVfI znLV1EWy_oU?4qIVwt3bJdueWa=qP+H5Sf|vb`0B!k&X z@UX%NVTGM^41t;UAe7DfOogCZ!An!9KNG24c{LV!@lzT5ve#KP)fBat*w6@p5eWCp z88_9Qvu=SOKXB%1=y_n((mSrFky7o=7vAV!EEa>IXMbZ;JZzv*uycG7f9Fs}=_Y~! z)5v;)wlIP3OY@}l7ISfb&(Oi%_~;aXQKY(iXAl8MoYprd#|M&?;Yf;(9q#M7_a^x& zeJYLT$J;A9E1VRGjE254PThK#dw>dG*xqaxEy~+fD_ZRBD++e)=>@xRLDnwHmu+sf z<_j4=dH3`70}t#_Y_mVVdZqpP`_HvavstNzMYWfha3kbCGU!7|AyWgrf;uY=KSMyL zpT=le_!!|wv;=sLLd=hfX+Th*=wC2#;0s~AA{bmV4)jZB2TTl|YtAZ!AomJ&9Rpo_ zIKU~KvpcQw$A9#HLP+@0>CQIhoIyoz+B(D*nTkml%4z1ZoB2& zl~$gkX9Z*h%&Gm9-Ajwx6ggq%JT6&NA8bPMp^d?XF2PT?uAfxhu(7%d!I>h;e26< z*IHSG0`v86T1i9T3p4~4lPa8^e)@}ebt%kU;e{}d6*VxrsBqvN0OW&|h@GA)eC8?C zImGzhq8P-EM*-Xbv-mz-#4E%ovWMy5>m6*8P6Igd_g|a+FO?uY*|;{+KUM*%2VGkx6{71X1@K++g8{gz3XiI z)mxslE1ueAU%guA{}2Nk9X{Vjy!c z)N}U!MPXscOdQ1}eqbjIfjM&@hY3Xe(^gzlP1P?Y0IZbEw#;m|_l`XyOikJ&E9aY| zS%;3iM2Y!V>h{Rmd3N68du`S(CK&0YnC(-Z)KPMqqtHRM^>!6rmqU?~jF2IoeidL; zMhu(j2;J#`F}y$WNVM3V?6p=?2Z^WXGZF|NouVBjn__*7|G+*EdF)N)@sKArO{06o zri~KwW`4TiuhxhO?=>jo4NQ1(yf;Yag3&TLi_GY)#*$0qf;YK3H&@0Kc~s%UN;j;!4c9F-EEdYrYZgu<>&Co>eP+hL z*~)aE-SBH4vY}NOvjs}Wf{3zkwO3VJ2FC2G*L=xZhDzc=e5d5;sZQb5IbMZJ+F#Ws z>^U8LX1^lY;W4uKQBxd#>)3Y=D8pJpdFWhGSZ{irjir{07Zu_l$$~~Xl%cYVwJkQI zbdN8*l+}^4QV+owy8({$QIYAOR7bNsKxN9>j_RGzLdFrs2RaCzg zz=h#1>vkw2*DP)@hX?q{1Jtu*BIn*9L)}G91$+1EHv8aN?Y6WdV`--R^fy>Y*=Mg< zZomAYi|n3NGi^94-E&WX_Da~FUAf%uTs_Z*3sQcVQ@-I%1a5S4JBWarE02W7anL}b zsFU^J2>D}FR29Qg1P!-s=p|h!6Mrov90`9VgtubKN+tvJ`DNaqaMw-GL7?c`(UPIE z?%g}&2-g6FSHf*y@%&x~_kb!^9)qf96W<@<2rMa%(s`J!VJ*(X^OW9`uj=X@I$&Os z=hwc_-eXT$vRt!Amd)dPVwOa{LR*)O{*?{=lm+0th;o-SDnWU zdx-<<#A7cg-vZ>*UGawV>7rC?^F=p?@58CUQ&7OGO}?0;%FwU*9EQZ&o4-iC&>VNm zvo;_BkEz2hNZ3W`TFQ!5e#K47KnD=yf>Gg|Cg9kclPN%TtkMVs8QdX9bgQa>VV6 zrCmPLOsS6Ig*Q6Ft1|KY*&CUhdm0Oclf>$YjP+)(kifJ4Q;*%_cUenqlN7RIrSu}{ zOP96Po_M2I`=|t<9Esv^?~ze1-4f=C7C)N;ejcu<{Ne_kOuP`1PO?2YVY7=VTPx6e z*NRSi&)KbZ?mXu9G~}Zj$J3HR4;8ZZD<4{GfA)@5>X76^$~N!-Q1(!oAPFtUtHjtC zPRe6cfF9!sP!iYTMSp>m35<~s^KJf&+`oo<<>jTub+2<2=GP8{QvlHsin(R#;z*<;3=f(A^H1x?-XC*=ZsX!N0zaxUs^1x1a*cj<*n9L`nF=J-EqDsS@FI8r1qU0LBG7SqMfIi zQn~i4Zp<{~%+ll15Z?oY{K8BBOv)B*IDLj{TCvWFCuCc^Q-qXr{sKS3Z7)Bfc&a~M z!S@&v#$a|h5$>B(kpO_;AVMb?-;+*Hr59YsK*-!)R&rX|-EQa2X|uO2YPa{T>9%WD zw%b{AiZ-i-J$wR4$(XH3Rpm!#v~gaG{lbSYvj>-UV?t!@9;9!{p={;pqK|-;_gLL} zWfUGqkwf_rS||?D!~YS%V|00R3TaumNRIE;(07Yn{pg5Y|Im=#wkBi4%`!T^iN)|X z1?UOF%1YDQ*({bant#og^P_T^Fe% zfT%MLVu&XebaF5to`ajtY=fCH^qo9-rgKt&*q|(R9zM(mx5O325(n0{cQxD3?!M1H zzveuFpPscyZVY}{ZB;bIvQjQ-+m?3P+i&G(4)jd&ceBBZB}D(0tBsx&bHfBFrB9W45u=vh@impqHewU|I_28j4WFgcxuEgmkYN`KQ(;7`KJUcs&fh5njX~ zsXJ=0KbHL{d|$E{e~>+{si0hW@p6|rvZl_!;PsNBg4n4St*Q3j339GTB{c*D9X z`tw+poV{q*b{T-Di+G6IBd&9ZNIc3AIz(v#cu9!>9yn067_j1<_v8p~cqn*p{J|e- zuq};jMZpWmDg);AQ&PS&X3VhF-K}=M0PF`(pJ(qoeTIGT%sF=P(pEcTX5JRGWv!SF zb3M+V^G^@23mH0_p}+Xn<@RguUu(NMfJt)S2qs$PDOuBpm5c<*9f+i~|Jm5Y=AF(?=z+2q!Ea2(Wza zkU6iK?nxr@{ddTcdlp)#g3>0{C@u!V9rP3jFyxFU7=t9rN4)58ZxW@@vqrgL+mfC3 zj@)M3*4$>hX0=(WpvU~|i7!|oTSe66w#A)x?t{B+&h~yKm%b=}?~{}lAO(*L1fOaI;BI(#_um@t=F>ET>@v`>kH9I<}Ijy9_IhKhPo|y`->*+;uz#Q zud=X&n2r<{Q^J-$+TdsZx+iY2VtvSE$S1QQt}$F(Y2V1`D`sBR*Nnnmy(txuMv1e@ zsyVM*z_$bjaO}@tYNP4JddTW;ucxmhXL!6^eUs{bxAI_h5r8;3VuLlm{6)D;jYrU+ z{AB>TW7XL|&yQj_aO+xvW~Gc+ey@1W2cU-HipY=Oh?oR4DK+Uy5(hh0k<@hFVqeo)Y9s)(pCGuyGN{S@UjfSQ*xjwiM6(7k_m8*0tmiU4R`G!}u8Uitfo4z7k5~_@} znGJMXVsMrYn3r#>}>v4X7Ot-lGv zURL5F4pygq^_gqcRY2(BJ}0RAiqfgN#%I0o8gWXw*MYaUd~vUhT$Zz4Z)vv1=?Y(} zsYB@|{YF+`>D>db<*pZD#3fmap+* zp-e-Ho{><)Y7R5i%9zST3ievjApoe#Lj3RZ6e5f|41LS;YWTWImmSDnttU)$NP9wT zHME96wLzOZ{&m$$Ll_BdI({=`ac7JD*|lqIuw1ci{TNNdo;Wb#ip9?=(v!Z}H)tbL zVE?tRBy%d_S!@keYxcsxux}}Vs1u$Z+ek4m;FS77t}J>!RUrsFb5@t7Fhqe6F2($| zc5BUN#YaV8*CKGs%c$$NptafBa%q)SH9kO!g7bC<`2l2X5=KsOmq5v=v>PEo5t#Cx zCc|RB;(~X@DB`)ft@fqMR@hDFEe!YtSi`UKI58!sF4ULSirP8^`WfKW|Na-`0XT+e zFgFQ&?)db4Y4(?SC!Ua6!-g^Uwl9#ZM&0 zRWxA$9(i!qeS$+nV}4)?Ju-QJ8VVEEkSFM6l_ax)8P@2VZHbpox5f(^dJeZ+V_a@m zIWK_XpmQt;AZ2T6*Lq#@tO9sy8}|@ZC#rxPsIqJ`04LWvR7?oxP#io%A(4MeP|uuQ z!aWZ?Yti*OU0^5aJiF%tztv6Mghzt-DN{porYEnTIJ#RK|6TY5*V`#%&2 zZbeRFh|ZDq8vqcUL0r7b#=FC=vxJdHRL*xpQ}z95Z6sH?TDGprzgwX);4Uue@9611ssu^l5zxF=bcg{(02p`*eEBOmR8+=aO7_^k z{8a+YtlaMd)>eMTN-18NXWeo{9`9x~R+uZ{*QYQ!_nc0GNPSjMn|)~YVmp0SYv31P z)rqE$ujx$mQ2#RvqO$^hWA>zcb*<-kk(^_%Jk%40!`bs_H zPXP(k@yQ?nCj6CzfUzNTct830b8o1a)=KY>KYVb-p@DT z0em_q$HfgpK|qiESuoKsPx<>sXg#lkLXK3D?e67fTh6q`({D4|dbXkqc`A8{4CpXq+vc zmaEP9Q9!j*q)56kYaT4ySKjis)-i~UkWE+^fejXM7}{>s2n<}% z)g23UX&WE(`DWTkAXa7p$Ea|l@r3>KU%Tdw(heBw;%BRaBaDa6*F1!f?>#z z(QD#L$$0cIQ9Xg0v%^OCxEZwLJ#4}b^WU14Zo;tH@7*SD+S)wzrm z$Ey{tN$*O>a|({i(*L?<7)v<`br5W54ty$sLPCB_R1=3h`0V}DbKC9rerT=z#*dsU z0GwmHI-3FziAPvtjuDgb^prs{$0WR6%EDT8rA*%T_%8dzZJX?EPi(j0V$ODUv3CQW zq7ER+mkyi%14Z>!7)AOVDhx5CRTQ7^MleKI@Y?4`ZO#D=Wfg7Zi&gvAD?4mlBUInG zh)h!QAQ(F)d2f|%KWaq03WXDvh{9u8;;nm|krvOIv_^)CYXxhx3|Vr)7HgdMb+Zd} zbnlR=3Ox7B6U$1YPTD&H6eIEg{R5#?kub!=H7Mj^I;buJiQ{lhJkA_c)br#@ZOMmL z`C4?VTBcJx;uT7?iF9aRkEo!sMhbm1o9)tXZW1Ufo$}&2{IO_O6AxXwA5i3NN=8ap z3ATl^w|~-B|(%^oQOd6%;U}K~9vZL`;k$H|G3Qry6l|Pq|e+n>A3fb6(nK zD|QXZ=2AA$lCg>Sbv5KkIRLu@B1{l)C=qh-ppJA*_{Cg{M+R-tE_rjxGbcxF z^Smb8yjb3tB+GZ}c!!yt0|DICZUQ?$05s-()ixfElR$Vv$YQ)E$o@#KL7IZXb?7?L zP)Ff$bj@3W3wK##&9}|oezV!kZ9aEsece)PhMg)~om(`P)EV$mQuhRPaLs{jI$&}i zpOrV&jIRk7@zomd0LS&PRbd@syG_#9sJzb4g1WqPa-B2Vbb7a4|Bp{w>ySKK)sc6B zQ&LJ)!~jh3u~>XQn6BD{0z>Dk{KT^F1=K;?1||XzA&hf$KMhn@=dw3{jg4hiSt-$@ zQQ#~&Lkn#zwZMwiZ7L6U`5^hbzzBt%JcY(q8&A!%dZuW@iN(HR%BJD4`hxQ4{2Buw zDn9A8xj+#vPzIpoteoobIlsEVFC*}qHF2lnjJsL+W?K>Sa5PY(k=2=$v;khqbkq%_ z6E89_^ozMPc3kL0?}?{e@NP)swF*GU$}t^EbE$5tb`06O9^Ymk0ER$$zq@0LUGek| zTf9#|pH0}Vjwa6=p2Ixgp>%kNbL@c$yYBvN_H(yBukz&;ichAnFzhq7_gTwW#qL=> zivX{KckU#M{tp?4+yn5!H-@P&72x&rv*f1qi+7c5?X$zGlRQL4nZLJgUw&tom&@-} z#9kbpo^SsK?0l0Vz(+ac!=5#DsQ!%C`UHLgxrPHDDA%mI2w`-c5D+Gqm$o+Db7u0b zS?#Ja=I^z}C3l&f{~bluc=fFTB@iz=d4iO9>oll znBVjB4JPA}0SkOJHT2&6wYu+={K__yIl=0n%hz4<*O=T*_7;r*kYT07Srhm*>dm&N z=_=JBZ@Frp%`AUijmzYRqRB#h2;of=$ipNk^7OM5dUCGo6;eDO=lNlk5}Zp-K*2{Q zQ+S}_{g84ws|F|)_x>81;^2XWIXTr+hPk?jm1}{$+GusRx@^gzC6lzJ?fjro(&jYf zt-A>iL!`2q5J1`EGMpVLov$bdu3Z1nLjV&m1~3FvAs@0#kq5u%mBQmtUc~VfyCzg=&8yYk`%U4YO9$=_WYkw=72+C%*4V6wo6zYu4iTP@qC{`n>Q*uQM`=@XZi zn7{7NPqQ5}#f@)_RC6Nhiyf5j^Neiqh_4B!JoGR=BLjHlO%r6! zd@F6jGld99>KI%_9wZAW!ve=A&$Py!SDHPwe9GLP_>5M6J&dZvhwcvvo17cuP~Nm7 z4Wv9iKI=jIhqKn$$W;RA3zg?Gh0jn&ATXY659Fx$|8mJ++pL#H6s8b$AgM~-cirGo z!g5Kn`vZaYe)QevP#Y?O`BFWvF(>Ga=aN9qN16*f79B6nwx*vTGi$3nZY|}VE4k z-L6o!FJLlg0?nwHG7f&!C!>b1%3V(>uNoUbRV4E^sG-l_NOP#8zu+%L=Ou4e!F;It zdL~r_{?F*?bfaofRhD(Nxyfc+`;#`mv)$Sy13o+gfG+E3Q5t^m2H;f|4sf(X0P_HL zdf>{Zdw>#!RfhtYIw+$%-X0+>@sOr}X~lV*sZo>IJN$y<4n z((m=`=}-QP?%6(p+%XWv*O|?@tc?EQ2hXy{owox!wHsPJa$^Fcaw5frNn4vwG` zpy>dIffENFIHq26zz;`!kIu6=1Gq_kCCRR&b{K8aA%J>rq1m_3v*aVoe0?W?oa*Bn zpw(h3-giC0G9c$5sa7E#b=Q4^kF8Rqo@2v*&~uAz?3ihPeenfmS18Z(bj%kw-j~8} z=(Ld8b^o-%<*@pUWJu(+l=GgbDWhQwcFK2toDWjoG}+5p?diE_{rFU*%? z3hX4$z~d?P~gvpL-_0Zn@eHe_qn4c5nV_=l@`iffBax z-bPRPcHjO|MVS=?P~knXz zaKVcV4e@#<-w!Ar)2ee#HG>@VB^wkD0H>2-pBCF+-00}(C5PsG&X%^Zz>u_A8t!z< zd*e4_SI-oHs+||JH&7bR#DBdiMI<@x`zU(Jtzh7A(I3anC zYv?^FeI6DvZRxSZ*Uz@b=5BW~Ju8Y9`R*Nt!vaNSO!zjdigPazkI_l_k_M0WBc1E* zLrqWGduDyu2CtFV`Bw40Qss3kQM`h$B(5#0$5$`-y!GrH)Quz(qUajlfu5At`uFl> z+bc%!X8DYM40=e&|JOD8=qtorBQvnX+bz)4>lgs1hB={s&RJ;podQ6vTjc?^l^^x6 z!R)y@A)_2LX8ugx5x$0lViq)6oSuIe7nrtky)N=J5ibKz* zrdHcz-0g)S-ROk+d)kwrP|qk2SBlVfVa`ti@-k2mCZ45si8kBYbd4UR<@xcmjJL~^ z#ha;E3PbhYSn++XN7oXddw7UV;qomMrUnuyFn6=JaE*g)!TocSMu<#1y7z%MREX04vds+-`Iq0?;E#g z_Kn$w-f_G0#UZ=@r9r#pxqWuahCzF5=a@adYt#-%75Yb2QZi$0d2~RzC_n5CfN_OW zyZDpUmo!Jz9u~{ ziY4X)qr)fOT6OSYQo^Ep7D`A@`OG8ws&wAov&ZcDRlL@z?xtU9_z`!6Cb=LZfL#sa zow@=7{?hU3v41Hh0s=bAwb@;EL2-+{G~Q_&3o|Uiw*uJ?LtmJty%bOK^Rv=54VLZv zd$*CRcY86A(=tFm(>#3d`B~Qm;LsmBk%u$EwciBt<~odG(1WI4A41;duIVBioE9sm zW>_iRV-u-GHkvujf4z|UHdQv;tnq&nFanO@NM+jIcVkT;GLo7vw|}2x#9k*VO|w_5 zP~K{#j6g75w28!GHU0Jgg04)M6Z0~vwr&FxM`82?2?0-1B&Yy>9D>-m!a7&2$MzK7 zrQnq1Dnr&&`I=mC-fM;{H8#Bq^HE~SdvE2#0szAcCc$yZ$t}DFR=2+V#p-D1>N)Au za0*8b^<=YBX9R*fiTJvvSbBVh9-@BXs~WTm(nT@~}`{bTl?`(LyRH}1FHoy}n@jaaCt1H1ew4Pz7!(8k?J$=IsmV^3F;{g)pjV>?LBuOILp9dTZ8L_J-%(stdqHrtAq_#(7|^#{MLqgDIM_n)cy%j;762k;{; z2lC|r3=cm5M8GiuEeA=?IvflmK%9E`XIUbE^f-Vb=?LRKJWKfVjQz@k4f~mG#HrTT4KATe?u&*S}cJNDd zsBPNyyr{UYRHWh5u+6Kx?MMIjgSt*DR0Rrjkr{GH;&AB9^3=oWgpDiz;P-_M{lp6G zMH&%p;1up%PmVxAe~&~87f-I!I>4~;)GX;wQJiH3h;&H&2-tp`QT~o%h!-V^kJRi! z_l;$Zk*nz@8utq50^pQ~XQY$= ze<&&CLGm``pq@MlUBU-%ectBo8}&sV-x9A!e4O*HOP1LF4nPW70dD9x_0_dxFctJ( z4uF7O90vGtPhK$y#y|+T;q?K6cz%Qdb~0Y~7Q)Cavor}*ss^U@dGBo*b)aa=-9 zc=bGsDO?@A4-^C6Bml@%H(}bADmin{x1*HStY30PNUj z8$#XqEddt6cNgDn1L=!pFsuTdBfi(#Q0{CS%&xJa?AaRXuC;;u88(nT--eQFC1kt= zm5hd9AZ{d~RECem>Z7h$uV?a!Wz_+*KIqla32==H0vM7HRiwVe(0^bi7f3E_o8ex5 zq$2VfQP%H6`g$too>)@yrhmu?2>8j%l$4LohEFT;I~!wT8ZY#vG?Y%*lRMJ3Z-@ma z4gPXf|40PC_T}xSw!%YE0Wu`BdA(zH&3!M}d=0^W^JC}R{^llYQm4GTv)vwCIm7<* zCoi)XXA2NW;x&j!yiOWQMBaRdkZOR4;&aN8{Y;+6&VGM@E0|0f8L*Sst5qX4uOz{XE1UW0L0ig4YFyh6}1cD9S3m{Vs zfnd5|<#gH}o?EnQo*%c%s=YQRSF(o&yR5{Qre%lTdDCg=AM?IGh01~VhhFf^>(a2R ziqG5Z%#crkr0P{$-=rbqOg*0|&~KGS@V!9A!#02~rn>gbZL=T#+>`Eb&?)&72Nx_5 zFihDD-G3{GGv#b3G?WSWIS-y|Oo!heq(j?uN(|3q>N9T{*TJ+6SV1GUyqvXkW6*i? zXQY{Oq}mJXZsfh#=IT}(OV6@urpYFfO9d=DEyD}s(iVo2uhu?6S1~bmaM%l@h!nBs z;_09V}J= zTxv)~ka92qju)8Lz=0KCfK75^_K+__<548j$Ow2)DGrn>m1ctv$uZ*{sKR8Fi#qD^ zrb_mO;c*)ntXo;sy&IXO!nnS1z;t z-7Udsb=?R&28OAqbVE88a#WrDh=5R?Lhuy12hgUTr-EVxhRpN%JRu+$9iE5I{Pqfa z5Tm)kL@ICloAP$=l2*I=*&#bK(`T1A9k5#t%(n^?^ehF_5aQE2C5Fb-7hB*X3h>L& zRqbtWJW5WJ9bFMYI^n9jbwO1|4C$rcWs5A~{%BQcV*)IM17VFs0Pn9x- zBCT-XCC_N1wBiq_s9lQhTV>Ei1dNU;jsDj)`EvHVgZGCK>D(?|?mFW5F87FJv(z;# z1dwrjaMu2(Jebhj;#pwapsW zFHqVRc~pzkY};)*zb6>Lhss4vMxX}xvCnUxhP`ZZX2F9wKfW{O!vgUS*j1BVwy%hH zm=V9dHgEhUYbigZ@&8lu;GU2x{DfTM$E>5GbLB~E=f13S>2cMu$;#1hl{)AJDT<4l z|6ogw)nMoA^-F+>8>=^m6hW5`780pVYFDp+$%czrdva+9>gD=^-v|gP%qtwx zl*>u-A2$+@P_T)b&E8kCkA0a>q8&^_3^v5v{Ek(&vq!^Go_JXh*NTBGI21b^03ipd zqicrAJ~ae*Atk&+-Y{WqDh5FGmos6c0rUVm(lG?)d5GVT_YDXFGD&qF`&;tX*Oav@ zo*%Fo*|J^My2t)~*8;2ZRUS+yvPn1(E3WV+>BeB7wiuROT~mBUT-U9&Ub4Fz%dEer z$yb3Bvz1Sq&gu+35325R6Fg7UY~7tNxY)7(v;fs#rDSyA@u+3e9^suyh4~8zC}M2i zI&^>_A;7bb#DOdSxh{n_k1vAlp@e_M(&Vf<8bL~8}gE(}? zF)ZrFwJ5sgHV!(RNEh0l(v@C(Uw;2KyW#;>HB}qe3&4Z2Gj{8h8Uo7$^o-qj59WMm z87{TSYw`#~W6Fv^(LF)JqI*Ad?*OUz5?*+tN2GF)JVNq!kck(a@$&0!RG~5 z)aQb&{nnM8uuD4yf;;D0xg0+6#;}*SJskU}vg+?5aNiPsdnYl@s>3SkFhhvOi@U;HA%aC*5-$U!TmW?MPYY`J=$o+7_EeV|lZ z(}g!i*G?!~bM-|Hb>~lheM#{3~L3xL_ zOTgm}dVseJS_Tz*K8SOC4Ivl}0m_@y2E+39hE$*3)~x#(l?U{g&973@L*@5|prb2O zd`5A?{Uk8z9K0Hy>8yL61=D2_gr_Vb0eXZgorcI+$#>1%w0&r8&X&mIG}rCM zwHp5BGd|bHzCrT!H(ex8ey^e=kL8)sl07;kUteuHHz%N#7tR-@F$zjv`BJ~Njg{@* zv*u8mm&ppY55*P0&@6->hddr2K;8}e0rV@8kRU+gJ(r}2-H_CIv3{QXv3}tfFI(}Y{(x`mT)Q^y3_|tR6jjb@@KQ&r$ z5PW#aOk1^k#1`!zx0(5In~^Tr9Xn?U$jMVk2Ut4z=|9SGru85BDd=O(>nDR|YE<>r z?z6(zV&*ESQxUQeui_#kOW0Uj))qgz$ChmFcUvWWC`~Bhb}1WH0}sd{*`_l;o#}9= zIt5pX?9c_zatbL-`A-dt_49bdeD$8f4K|ipDe#-+#{};JrlL7|;E=R2n^C$=pm0FUhP^&0F0VZ8&tGR1fsaqVJ0XITp&*!;DS!P=%0bVZ zYV_IcvD;)+6UJU_e?Qa85fS+5fX6lO1~Z_`$O~j`m(8#< z@;Up!nr2(rPP^c7o83LTVP9O9(x`$d3gti6uzbJNzrSkP!MbJoHC!5~`*lrTN)m&X z?zN?>c6~>|RyWD(Wa1u#WAm;I?KgjFo!xxtLX{qPMQ0pTL~+Q`$j1|^musuqw|%5) zcm2r!^LBOBVD8L;2m>}-^Y0&-lnq-bkk!j{fQq4~BDWo$!!HL0?!ZYn04wiE8GHFY zRFrn%i4h3-O}LJddG?d!d6Ey_Vq6{T{f$K+!vVsZsRih9}l1D$*_C( zs*$DA;Qe_u*gP%X|E%jPc3$Qsj|cznTKy>-xJvH$<>G&pB+Yt^vL|FXXt7e0%{{#@P;VFR?s)xp^hRT>EGiWeHqoXuZE35uB(2n<>z1@tHHu5h zYp4lq8}+gclr#2)eG~TQyCqF0 z`;INjgF31Rz`<28EV?~(<}9x}62UB)n(;3_19qHMH1$tZbj>V`z$AQhRH;WQmKZ3R z^_Q$MD)86v$-f$-I=EqbrUG|fRa1T}`uHmwJR|?;2w#|v%Jf5q?a|;>&!wKRBRSks zwBP*UwXzYFr5gPBicR*OMFKVPC6o2~VFxiGOX|&F{iTUkWk-ic7tyeb#>@e6j4mmSo)gDoNBR|0WN982hfjTe zqU7Mm^qJBIK#uZJ7|-JTCy&EDK#1)V;idVyRg&@qbJxg?l-A0tnlte&32~ne2}>DJ zNxt@qH-LkSH*hjUehAN%g5Fjw=gu@OO-s_+Y7CmA#zyF(JU_tC1bza@B%kS43g%S; z`0>7PXrM{sJ{mdb;V}jQ>P9^i^9FDrWk8_uFy#$Ip)Ln$@?P?ACBOutuviJh51eB# z0e)OIfTy}%ClzsfBE9{v*^)%!`bc#?^D(Rk}%9xcLvaiheTa`zl zX}e|4GW-3HU1Q003KFKM(SuOLn@^K?6_H5NKKJ%7+VZFOD=953Ud0#k!G3+ZL-&7` zOWDT8gkqo{H97Ol5!Q@X9Aht#!#zQmjA*JCcwGAxZEyat$8%2|)ED{dv&z$DlK88wy9Eq}r+|^OVHJ9rw@rD+k)oE2aF7NC3Ycc|WM~ znJ-k4x*$J!ECBP#Rqr(+H=ZfvMigJu!qIciuH1edjEKTl>PYn#~(a+6DU(cF|t58(yf{k3V0x_iawtrF+aS++Vkq;{w5I z(iX~VVC}tIeNC!0Z#!1>*xi>evaemU(*FD>FSL7p=uErq{cG&*RXw)sz_0*o#72u5 z`?t3)m9~ZU44=@aaSpBP%SeyC3Dveg`ftzKRRRi(kh1sV~OpfNOfd^l(jCd(XXV2{3Z~yev zQU^aG65kh+bc?;9^dpVDy*0DZI#aw3TeFr*#lC#$xmI7KI5QM6LtJH`@<``m(iP^k zc=LcQdvvGTK#v8$fLw5n;8$^!X1`e7CiVb7=Ye+62oAX8FQ#y%5Kk9)jEVc>(NK0x zlnw#nyhQCbnU;I5!|^f?5Y(=uE0&UC`YTLQPX9SNNnlUmDtUxRV?v(b?eezvxk51c zO+z=*G|cgtJQgto4WHH#c!As~Ha!Z%56~!4v69SXfBs#HoUu%zPvG};OI4&0X(?Ca zp|KoK2gy*_{ZsXZVG%@uc#}sVxc4$82U<7&NdOw$dlk~Z!RTm%Xwx^RlcNh@e8Ta;h{pIzE*Kl*3VG3vzJqxdEq`vsK3&{Wr|r$2Xa zQ3L>t^At}oc#Pr8Eqa7YPme;nHx@Y{O`!mAak#Fd=bU*%!>?6a?vb9K{lF{|_VM$2?D`dL zsIBfWX#F932R|7KosHzBCQ&<)uj0`$N^}Fotlf6O0{g<-PqW|p$OZO)uUuvKuAXUI zds=K*LtQs|Ko!Jcx`U=t7|ES41@Bbc4Ga0bmC)W|Aw-IJITrD>X|!yA{QGyg(Q`=MOJ+*5w_^eE-ZQbruh6bdc~W`%VkVl+VX8)~?Gz>QLBSG9NrMAJ!@g z+4!3o+`zYolV`Y&_42!+@GkIt)sB6W)CxWt;%!ji_if2jb%4L5$eS%}@xoXp98%Zy;LT#7gFdSy*w**UtPU7GX0jk|$-RGH{)Dz=<;)OQS8Ozps zeZhl|9|SW9|0@?y9}IybP}u%*_;Dnf8qPI2a&_?f^-M^PeUL5(9oUS&5=Vd<((8d@ z>4EF81XUk^Pq+J=gyG2iDkK=ghMW^V_VP6<9_JPag0PT3$41Xgb_5!aZ*; z5JY=V(xjn;bND}SM(i*g;z-)67kcflfAyQTX#0Ram7}5h3ApQg>;Pk_+lIxR_FsSc zA_+nUTotf@EgF{cqvL>*Pw8n$>udpHN|UZi7WHxfI#2+taB$Rfyu}D8eUXGTe2j5| zJe8c!C?C+VN6!Yu@wtb}yL3Id~@QCXPP_|A{e2)>E@{7TdJTcdB z%~zi^B9$!Ifxxd-qR&BXLRqfk$boa6*LI(mt1@i)+JKI|R;+7iU%pRRf#5@$n2tCH zcr2pst<^0yo>?e%TLprP{9F4e|J^-=f)c;-Bjh0_RS-r+LHS8@9 z+N|>J641C0sc25<(0zX2uY@79-6zNa#c=X_WGq6y$eDXx5*ieiM*==?11U#c!(a8@ zEFv}K()Md_Sz;^rFo2AP6;a*;_4nk}2G}{H1msU%qw@TlmP+yI-@MX#`LZ^zj0yDOqfwF9MBJKm6076vE64J3lpmfR z>WVk$Q$o=&*+G){c#!TDiYvl&jaO+CQ91lRN1yoKB>>nccj}+9tWLZXC76xZrDqW4*Q|P zLzYwCcu+ic0^fdEG2r!(Y9h)VtfY32eM z{!)H;rn+!VWX~&froQ5?Ae{n#Y8&=uQZ8RN(i49WMyHJS#4}|&P&O>r=(k*TkL7AQ z8hy%-GF13slxlCe;6|6j2_ND>ty`$PU}brN)nq}!nycaH7J(50!4zQql^t|oKHOCA zTTN9R`AeBj+skkJrV1*f*EcyQ>JwgZR=w!n>N>l(azviLj}D}$|CmFi!TnulABRQ? z4{=r`?zv>(hxC1_LHD5z!gF+{m@U|^zh!|f6o4_*VxA0z4)0jg22w&rO-V6#bhX%L zu32fn@sSJdYik$S?k>K47oNi%>B5^F3iC5h^@knM?$I*}4*dEo)nr`qI2L(c#9``0 z=c0zYKm7F#cHG zULLEOfSx)T9|nterA^5DV@S*J*a4AinStXChr+l|F??2#>UW@BhvQk-!e zgVNDfH)#63PovC~FV~Z#FMWC$SDpwskyKU<~<{k8m4d*+%o9#X8UljPO zFo8Mvd|G?I{nK+x#JciUeGf`gSMu=JWp~)zWWUR9s3~u^UU{a=$Vy7=by8Whiyt8w zal7`9+uA#~cmTm_ENMva zWN(hm(%oJGNnOH%g_9sji_g|jG2M70v6=($X6k!2?ERJ+Uaof3=4^0IuLWK->`w1+`Ecp;#EM&KxXopp$H2V)2NN6tH?uPhKeG?6>9lEov`F zIcZ;oOT<-qBdiGf#Jf7F2bOi&Ef+1audd@$_liLI%6C@ZkX`lYUR(H5pDpYg7fMePv$ap{vdh==S#%eQ3`aZ*1;YFn;|7f|Fd}|8M&;ac*>d}>PhR4No~+7H1vdT) z8FKV}Bgj-TR5+9LNX&=Ggac}X0h&}$V!;9(*lY5P5fiE`pkw%(md96>2bly^OY-c- z6n#+nX*e9bN5ylnRR+qNk51G-C_W1UTSfEzd29*dGd%@8PbnW=^U;Y0XQn|?3Hz0Q zdE7qmt&L$mR(z(!%l~=oZ2QdPXQ;}^7WfHONfZU2?<-SO z-{%+Azy)zw1;5`Y^tkkhQd;$TzJf2M!jncm%;&kd{CPO00-)b32K`uTDr3KW#Y$Vy zqT!(OO!8YSa*Y!5fKYPu>!D>G_LtY5Ve6Oi=@2pw;Q-txZhp#s=B8(rcU>a{@!~_D z5XUp%ghHz@up^8v6kCZIb~~VmNa8=siMJS~ia;yqFXl5`YQ(!bWWIkC&x9{kMVPTVc#crrIT~>t%OM zX{)D|n3ZFJUm_!5D(ISp3U*}hU4^t-Q4O(j_n>|GcW+l`149B`oyI0|cGbVU%Z4j_ zm?6mBKYOR4?nj%}+ea$j7MRG}S3NKJolje;MF7?%9=jz=4aZaMI_FhSUO|?=h* zZ}RhQt8m$pcCGz z-jS<49o$06oP7ZlUX&jFcMf7KK&N!_y~Kx6V&Tl6k4ij2QfuO6dHKqiLV!fNEtbKL zRLFNj2#p3ImxL6IAECjB0Xg3z7^11#c!_Ehm5tDuAVn~5lA0t^BDNGscO3k1|9zPX zu+wv&XVEo^;zp6$2h=MPwB=YVxTwA(WMB|Brsh-ET0n~}>YPqQU$S(~dY^UhCX;4weaEmvY0 ztIw%XE*-9zqkIe?Y$+j;G=#Hgvc8^=>ZCZz%?%ABA}$_B21C+4@q7go!_)b$vlrPv zylb_s93JqwLUxCH?xZe%dG(J@@Mu+8sQ@hG$EKCJ1B#S^FMPnd3o~r06WQ|>hg*J5HN&ibtL6v(R#BN z*=TBx(gTilYpp(O&GjeLfrKwqIWTH?TxSP};^3I+Y7(2!Eyz_#Z4v|WRQj$xKvzQb zo(y?$Hp4JNjmPk!p4XXHIypjMERw~5=EFH1yy%Q_L-9U8fET6a+L0gS`+g>Gc*#JW z2E8J(^bOt7{~XW@xF5oR8mF_XBqKnq`)ltLF<;7diS3 zK9kY3W+{Jw_IWmVeu1FEqqzJL?}kb7Q( ztfX?bJ9mwLfu8mPEE|sKb<0=w*v#@bl&2i7WXiI1mO8Wf8po3b63PsE5%2>(&_UPp zSYIMa*y2YI4LKpAZ(zkQY*eNonv0TyYx>G*YHEzsCr6`ue?|qcA}Z&N7e5v8Z0h~@ zDS5l3iR=S15Cc z4=(Mn-(Ne|DjL?#_{Jtn4^1daR{D*40-jP*M;`9v2dF8k_?I-9)B`|f)2{c-XsgJ- z)}yewGQOp40vsI+oAZ{_u#;b+^Vb-q18%$+5)6rG<%8fCPTW%$-@LB0HRXY(0wOHX zp`~%0QStS){;a)J%Gw9dH(S`QXNnE@pjXUE4at4EIrJP+Sa?G=QhtJi3O^fcV<)qH6~|&K@_E6%%0?kw267m6KPqx;bZOcIIq#OHSax zB8iMshkxE3@I)2KH1hnI>#O4Nvf7|9z{7`MfS~k~A5!v7&wBR6SizpS(X7K<1^k#p9#Ky%#Sq40z&RGEX?X&0EfBJ=M zL0%9)41MLvUD!Wp=L{XNb;EtOcBEhR3;a?~%Aj2W9c(Ym)&WXHJgkwk--|crQ}QDY zE73kOQd_xw>fXb}@9y@zJ+y3=J+QLdMvE!?lmGKT02Bd^f09gTZrZlQe)}Qbr&f6} zGm`yJ7T4QHQuhjc8um8}*4Y==UTXCviokXb8 zUxT6Zqa9-UyG+AgP<6|Vk~%o?TB-Uu{?T;i0rzF!Zll>be$D)_Puk!{d|qpYmbo z!5^<%`LI<_nXd^4VIiFR_*qqagbDBHz}r(8M^ykZD(~vP{&D-;4TJXS$M)K1x0dX# zePcFQ2Gk;eh|b`jgP#mLEuh5sTo2vQYjVc;J>(GjoPg`^_9yLM`&EX9tCV%_LcA-C zSn`m;IzJ^Dnhf*d?$+Sd`Fu>mng+)l{2C?IV?quSyGyEdyZEt}BJfMus-a=~<7XeY z^$*=)pWX1V{mkwScK*mfund4l!?mzT5ZZ@w6{7YLu=ymP*x@#ROv&86q8mX@a^j}ULd zy+COp{^3W@Sz^~NpXu$4ay_zR!2aUlZ8o4GN>=Uet;<+egd%d~3Ml~M>?ZBK9eHDmm4fu$Up!E_$msdmNyq{ZlP|=n({V7b!kn@V2Fo@!w^!QE*831 z!^}Pz?UvD+Jv~vjVO{(0YKU0)Y06~mH{Z!FV{}{csEu2l-`AZ`9%Ci@z>i;L&(2_I zD_an#Jn-{>CxB3=p-zFH`>d8^ppsoxj9vbjPdV^>`LXr3Qr;f&BTwFu7BpE(@q^iIWP8mX959i9R5{&#k(onutx=Ebb8?j(SWMO{bQ9lg&QKe zd{K*Cce<=t8P+SR8=hTBUZl=@az(rDr{ATauJTafYoFU^fAL2*S&jE}$0Z?oh&5R? zFLFGxpvOMD0=)mw@z*vhHE5&ByuIs+pA-10oTYlWSe){e z=pGf!&y`5WVqJih|M|Xuv~%y>;W`C#goPoy(u&JFGfBHURdyZ$K$Yse(M^EbEQiRK zw_Sznts))8FAnuYA8OWAJz$-sZz!%LtoCPz14|@K4tSYV{JWr+y$RxTJ1*{U1Ow6) z&zTNqd_)(!+}#tEdjX-%OEX<6(rfr(CfE6?uAiBQh`mweIsm zqy;!&j%(zSuxn3iF?RVhgrL0UmKZNZ9$?MxT-alGtXLGPqB5?%XM>&d%nro?u;fii z6cuEvET5_6EcL=pD-4#DH$_zC6^5^#ObCn*DBry!6&oBAILou#KU%S!gJs)#pk$l( z>)cWcZ7bWiw~W}cd&X`1V8i<5kv0Tw9Rd&95*hfF3TOC<9QXhQ z?L^f9Uc6xkCVB7F)j<^bDlJ=aBtFGz*zDY({oSs!lm{IIm6dD+A_aluS^4djS3aLx zc(MO%v2`dBd(&H0NnVd*!?kk~c%kj*Y#*@I{>BYiAq;P3=@`=&3EQb+wyFY@!6FvM#k-QZr z4+%{SIy)+q9(D2=VfynP+3$fzN|azQE)E1anb(`gt9_spG;Me%Tdl`@iZ?Y6IP2gf zO~F5;x9=%7+s|LH%*NEI{>FEnwI_D>Iq~T-Ixk$z>(vR z?x%uU(3~jEN6mIb_`T)!@dc7aOaqP^M!HSu(xVEhHEyVX9WQwJ7FBqBq6b&w8&r1i0bacL)wRM zOw*+$F4ZY`S^6)p^IZcAt*^$fQK2zBFx#DIviGMR^FHtMb1pRNR6(73(4ljO;s_8M z8FCDN|9^Y$0cTlu)#t7oDp%(?Jv~8_qedDf6p%;~h#ZV8!ovm|Yz&5oYxA5^;%XYlG7qu0^O|q7$x}k>K09fd!7Ub?MQaFwZ`KD#b{F2Bt zyT{djiCKO%CZD&vL|EiQ9PPOP;;9Kh{07MJ1`kX16~RX+`AOYV^E7hfEx&oj|qCt4EjWd zk4Bl7&xpEwqEFY;$ItxOj1ld#<`X%hv*EckDkM*FAKA_`X1)Nw*i1N7qjS81JOp?Tltl z@^t3_LhhIE?kwj4Y*H!9K4v)wI6B+OF_NeNM?kp0&X;|?Ua!q|=^j#+dA!ITb(fFn zk)9yh<=n25v+>-LE|(WFuE6U2SGwg(y;Vt->j`L^PYqq}W;lAO3G&mcRlSCGM@ zawg)z+gup0g9OOZ_^Kf`01o(--;4U#p8b~u}lNzs*cR#GE&adZ#x)Ob~V^Gxu> zSUOc#(`S=~8}sN;<_?CR1MC3b0(lzWbms&suCE^gXz-#M9r6eGVx|KS0zC8mcxdDL z*s})RPcN<+U-{9`v*jB1>p`?+Sk4&6InByT($hYm6^-97+2k4*Lg*dN-{iQm3| zHvYd)cjIn6#AzDwIMjsseEXb9h<=E>W*_h6_!X5Iuy5&}k$T=6}P%snV5rCk25G`NW zQR|6%mJM4q;mW>=3xQ7R`E8YYeW;_^MfbhBjG-q%k;Azl?9`MF7eD*r`ytWn(K)F?XhQ)F!8$BH}(w_+=-JC*RdD9i2C@89^fV` zq0~ekTOLWnaUsh=$B@ z!rBwuhxd1SzI4|LaB`0Zt30YWo^vau90x)ThHh&Q@mwL}V?}jXOrtvHpcoB7m{zJ@ zcOMu?8S5bl9tN*@KD|zk6FlXGkh6>2Cucr>WpJ{@d^Qb_MbpK~bbqtkJBJ@OOU&8X z_}CSfSxR&SQQk85?~iDo-K)@}iOo%Bw9Pq_eBhxF>;CxHuKa|X79 zEx6vTZa8wX0uEDl@=CdqM}qfwErFeQ3Elu;7f^IOv_pJ>J>wCK?O5ZV@0yQ)|Jg>o z7a*LS$3wCqAPo?a@|1cla!0`M-R!pG@}a5d)xeiq>SL@G_Y7ao{diXUDEmpSp(8%B z2SchsS~W5AH~0B@=;rFhC{Rw2VP`J!aXnx^izzDk}|GF)2SQ=8Igu^HWjICqv3+Iaz*brE5=y zl-Dy!XUe~{?}OyTol7oy)AJF>0U!XdH!~ltSu}dC6ZBN!5e@g{2lE&ypg4OH;H8rF zVmi%cj9xPmTVJ#_joZb!#std`_iM#8+FULP0jXlkpbs7|Zz2|DoX?0L1uDCRzSJnlU31I1G`Im+)`z&PIZ zpP%}-@e^a;6QA5hqww`yypwC!a^IEguVqW(`S}9*l3(bZ+kctcm-HhY1xOG6gF}sY z9|i<^RLfw>u!!YXw@O1=%C#8k`xnc)L@S+pDnzp`qZXimU%%<2O@(<^f?LTm?VUNM zkn56QMg*Q4+7x?7zlK`{KT#PMTLB}Jxpq+wYKl~fH%JM;=-`*6LJ97Q+160Sp`!I# zZ5>;b@uqDX;+MYWj(FpDd_{cUtvdm~O?gfK*cqyBTg7!y#M-w_D#v9Z>X&w~x>pMt zS8ZTtC}9-@5JT4Q3L#bGnG6+w=L$8I@>pI0qkv5UPPSeEzzl|#U0=K!Ji)n+;D`4$ zhbMQE?(yEK=rFkhY%Y~)q0f%l3VzB&@XIuoP3(6`McHjb6;Me!MgflQqw`sx%T=vF!ptb3$PLdRB$VReVzL(B@Cy)5#mB? zOB`x_1E-LfmCY6Pzeqz&CHSsyu4N@E7res~=Zj2@Au5gvMS11Ni2%#hqE#FjZN`t> zd0qVC*WC%|O>!31p)7X1d}<;MpZgpL_D#uBDq_9pldTo|r5v)3RtcpxRn$_CIUYP1 zxSDlZEb*+MQLh%v*lM97*{eeue-(%X@93iM-J9v;ghy|Nl=BG>0_R&kz!iF0{{-NuX*0an7m;l}{w!!aqr zn&|+iRZu~f%PaxRP{*r|m*iV0Ul5!P6)DS4)*siAkzT8aR5xU{3D=Jt%Z1IpNTD%A zx^(6mBklOh;j5xKL|VT7>Je_+O&ZFFbaZ&=_Yl$2a1X!Ad)CJn6O1XRjspBSgdnBb zK=M@Y7rp%AP-ENnf7(Ad{%Tkk{yCASWj=RcvKM0ukHn_VU5VnetqpNt=o`bg#|n13 z(mfx%7fmRrktXIJiVd?Lpx@u6)dWsSLt$i>`io6gnh)^zeC<)0rBWf+P@Z1^_^#dH z$5e)jlBgV3;%(a_Zoe`b8%DVYg}Qbt5<+>oUKZh&N0uCu`C?Y)lObxM+FO|{%W^v3 zJzx5Su~mC6-%<@{fAIIC@z|-DpTirR#h9n(qVJ0ioQD7iZOrDVOYK0sY3*OoYOJ`MUoZcii;^*L0xDaw?xDY}2T`f1nFI?|3Pk z_?u&(^7@7D0v{fs+nc_xV|Z*hS+^uUKtJ3)85BG@9@yqSK#NjBiP^$=~AcR z>qT{r#m3G@Oq#UtwkW*pr|Vx8leVem*0qQ)LOf#(O%xv*L9uY+Fr8vJ=o5|pA7oB-#`Tt;4URqXiXS7WMzl%}p% zQ_>auT+b$@ggI8TigsC^GlSC}t?zvy`gBEtl^Ua$rnTe|X$=O?8>bGnXI=-vv(8Pj zAr{xvbFcdpk0}dH8BfnmT?J^|&&D1`^2M-DfcTM@^Zf2&=;Tk>x zPjuU}wIDP7-I6|p03N$}OZJlNUCEF3B>2^{!plj}G!#C+umrFV=T2Rj?qw^1cQ@2O z7@IqPPGRO^p}ipvj=UDYLn4#}e~0)A6c^aSBkJMqvyTIU$SWH2_%sfYv7hCDH?lgpez?q- zyJU#;^IZ~|L17}0DTj%_pV1i9y9wy_29`$iad zy`Oi;D)$jF-EDwlxO+6Vb>71Lv~gU{nJ#vU(v(UX9HaPRk>fu}R(z`+-*fBExPJX4 zeEZSvk?38AU;m@8jK+FAK+egro`A-!vMMQykrm0GC39BQXPa=Xt>mmU)-S_(Df2RsmN9bp%51u#Equq`s)+D)}rgOg?|>y7;!6uPgvZ z=w3b^&Aw0~@{<}~b zOlzgT^HGs+k$3(ZbnKDCsXZs-(8qVhk>CAvEX>bUU0`BTG3v3;?>eSyw=suCUibVM ze(82(NZlst5l`7BAJjRuZ@T$X&PoR|a8+=0KRNLp^saD4T3)A~tg6QAUl{%Gc^=^8 zvgDD}O#v!(RGTrOk{I#1a{v^Vz_IABDSDswnXYMu8a%n5^J&9eHg19>l&=i~+|oBN zWLFrW`J5f+b8fT(M?FCV6|o=g{rVl=U(dzTmIfY4CG%0&!~sd4xdz+)lv0OCKrD~k zdfj>I+EId^{B_H5b#5h6t`|zJ#=0MUgH@7(Bg^6bq1ZhCwrEqhdAhxaN4}nn{O$n~ zaC#laGh0gI9V5MCv1RVhDeMgAYSzDmNx--BO6C8(m);oLCWcdw`XeLJ{X2Af*Wv|Q zLWHZL3XU2;t=uA_PsDh>E0|J0IZJGH2{NW-T=tb|d6bKj#8ZLudl4#}8`JYFaXKbc zgH*=n8X*;ht!t&y z&CwVhM#c`(qdLmYM5&*;LCWWmk+pRpa#?ror_OLa19g@41B3Eb+jJgt(A%~l!gmke z`#AR(fJz`K_{5%eMS89>u#o&e-Jn-%S2WiF<|A_LIQGbV{QBA#$LtzkjG=zRL7U9^ zhwHK?5;V((-tI6-#rD~V+ono4IbFw5>Y5YN@v1-Z1MA2Lo`uPJ^66fVk0ZVO z;vO<`QM=DFn~Fmd4nbAofe)E}W~mkH{?;4R58dmbuHD{u(CziT{Oe->*w@1}?mvRC zU=}D@qA*s|P#lRZGjA;es@3%`brOFBf$eLC;&0x0jXI0c@$=O;#@wx2P*9bulvhR0 zibLr<&TWF4EAp*0&Y{o?#L+vPKQ$L8KC=f;<8++-`0m*EzRyP-#Yhg##OXap$bBeU z6E3YO9$IE?M9gQY$=iHPTRuA{=HmEg_r=NkkH-GDKM*HAx+ms$os7=$xtQB^ zD&|hk#n9#n;`$hvv)Xj+K+QSsw*_{#&GPAeT6dW?JI~f&V`6nG)3SgoD-)n<#nF%N zkK=fN?VjV+PFfLxi&lYHqb@jbkB!I1A9-GkeC4$#ZL)I>PPiqH^~Yx7)xURtfQQLB;6mM$DbaiBNgk(g-X&p4$y&3g8{uCz zF%=E$Wu;zxYQ)u_(8?*>(bzHj4qB|)oF3mZ_T8W}tx{H@?CPeLF$xuBsDCUrPXm^8 zlM7-fsH%nf5+=Pe#s7mhT@~MT+fG0NC2U0L1Znv!V|vvBQff@8#Mav3nE0COV$=8E8DlqZA~}3V z0LxZ6&81KG`}C>U|JKjN{y%##=I%cbBX}#LzEBgc1Z2q+^F^n$Ju2&(ue&bRe$ACJ z{#Dn+@Ol7I_k=rC;_O;jFAigTiPz7?Aj|8sq6?{yzJ&y^!QLMIjgQ1*|K+Y2pKHWg zr*{#Hb(G6HL@9+u#H;`Nx5nfPcB0SJ7oL(`W0!IqeE&mn?>~QM^fB;_(|-93JfJ>I zd+k?W9ov8I>tkfnY187_Sl`xt(UmTMCnBI1=$xQtz3I{6JEyN9KMd$#-V8(A=hRF*_S+wgd;jl0jk&w_#rgyDF%Gy4`>s9f1z9;bJd{l)#JPMn za*m4s+>to``=5&G&mD-N=Ux%5HF$1aJ+($0#>npZiQkKp@7@&?yQgD}p2j#9W?k^h zpQd2)8bnd#1j9#;#?)Ut8pnU{zG!V2i{TsnqFX78ZwvOoZ_=vpdG6U7^r)x+-x9-N z1`SG2>-0Ul*T%tfDqkBrm$8@ZkH!W)HwOnDIP^sbjo7~XRJ{5RK9|@aGQfVhA9{De zd2Gb|>F%~^2z;`{h9o6IU1d!7tV1K0d!Gqv4lf*tZ3}OwCT7Xdb=_1b`Ptg!BXJ6; zZ6WbwXjMn(CU2Roy1iLI-*1aRD463-U-FcS-i_Nftk3RXpk#BmY(r525i0?KXHYR| z{Zem;=c3Jd&fBsdeQ;lV{D=NW?D@|hj~%CmXbdn2?rj59e&x)iRKplm);W3Q(kg;_ z@BE!O_P;(y_o)^4{ldHA-hcS!SaYZ!TTeG)jE2(pHY;I0jV9Xb z!rL;#K2PrhL)JRrQbn^{(>#4Tj{Ku{#lFA$wwO6NmAq?e^YA7P)~}s^9$x*0B)YG{Q2I%yiS@63xEKO`E3#v zO@4jJL1)LBIPs&e$gwvUX}18|1wV^P5G*bvlr+#s*QVg~wUCvqevZRUb8fFnhn&VJ z6XCkX3O_Wgo2!dzO*la?)_9awQ!N4bbcrd3-Q+EucTxz~ z{Xn|O6woo!^pJel&X+jld(uSsPA3*@@lc4)nz3x@=TX`@6t#n*IC?fSlpl9OvXq+0RlxI(2?XN#1<5RleSeFmK?TUb;9nciChd{_$5tZ-lNqx;pGf ziM+WK>S>1tya~MXq@_IOu>k=*dv3mMcB&OO?K&L)|p!1>H&@m@JI>^E|)F@n^X{NbGUIj}iD-K6a-;w?alD`$XPPR&;P(EfQ z-jujyjqaILU3$i->Flk{+7jxW3K{dJFjEU~Uv2FIxIG#%2vwZnX zBTCW3yKoGvl~a~q+LYsA0tyP%M$`IiZKZ6XU8S$GX6s!kD!NiCkT&A@!+Ya%KlSEl z9tQlT0XK}p&qwB>Qe&%$@Nku!j*_cx5^F@&6lG(No#(lpO}VgMffn7G%>r%k?&fz3a7C{F&3x5WIh zdHC1cup9O)5B$`1n1+tb8-SMY-1A+0x`N8ox>5cvYjX_N53slK=JFdU$lq7#&-(IG zWF}bnu_cYzmken3={Zs#*1z4kG3%RpTmWQzVQPnbaolq(IA3GsWv*pJrV!mz@Nl# ze(HDPTONNbCOh+#5kNyes_FI92UWBJf+G~-)JQhGmfIB~zR8*^i3RGc^2+bX5W}wY zDdN2b&HvhYyUfTRJ8U_;W)kdcM_*_H{Pi-*0ho-ji_9AJ93c3C*g5r^apmdX%>8`( zgW!>IDTB(CP)~e>^o3{tX%PH7HX&%(+PYlj)ODLsI26(`GWC}7tE7HsHqWD!v!`d{ z;eY%W(LFUCJErOK62S=*t5*=xklNg@cabk`~fet`M9{h_rRg({F8T4 zo?*NU-zg_RV4!R}2@u`t9LDE|en>m_*=mShtIz2T8*(^cAb3u%#W;pckMet;hHhSY zp7fUAdv+)u&|+G7PuZ_Sf(9AX*V1FJw%%(UX8ln+nHD{kJP*K$VUqI9dZD6<=Z@US z9|5L}bKM??rjtvV^lp&9Pm1V)C-4!$`n3L(yYGUl9Ruy5r#brX<*ctyjOYa(8^M0)C-qOk zH4NA=BPn~3^_o8AMlmwIe7y*#Z=--$6DJp&iyhvT`vqIluO|K?*0{d{<>b<`@KmYf z@V^-;(4G~F^5g^XD2}af2?Y>T(CikgSnTiq?|&J+1IJ_Ybi@RXL<*Zq)9Wo?Mk`?C z%%BF6hCx0WmEA1`tD#>o%= z(|oq<1an`T)^u1##4BQE`vhgD%Sj%-$53xhpCrF#N7q&mRG(K1O+c-;FpJKkd&mc7;+HnR zEnYYAsk9409!=&nfZrQ}ZzM&%IQHBaA~V1*pBeVK;8`?LA-O&{i9-5oSyE@Y7jLk< zO`co$nMcO%e{~n{k?VSk`Q{jH@~Pw31=Ig_0GJay7Tdw!DmWgYa-y3FhALo=0ih($ z9?tAJ5yt@#D{1RAN^S}$Xd4}Lme;KhdpjKNm|TtxUB4;fZ@e(3{?3cy=u3CR5n4{i zL(smwu9vOnAkf)0&euke_Yhj(x$NqakNYah5C-47b5nGG>g6%}v#*GQue~DnPYSz& zF1+C3`9M`ZgpTexu2YW<>f^+J`Y7OqveCK=>Tc)Ai_2Mdy(-W3kVnoIqosKsW2=og z8;WiL&-`YE@djizKQH(oQbB`rqDYrKu+x~g_gMka>Oqf^bg`+0%+LFa$C}^*kH(ut zX6C=>ZB_i+opKVyy3G9akOT^WM$5DANJ=?bZ*I>B)Jv9K-buTRo91dtjMX{;9!SgJ zzMfzmJhwpCF5`2r%Si;%h14Sfj$>rhOS!kQ+naF(JFaD*+*y{C8|5Z}JU`To-GA>@ zv9NsuKt`hQnBV;+-Ry}Wx30(JxmrL)V90Jh9;u(kLB=Af*kHZuh-Z}Q~tqw;KA)o^;0J!=yK=ioRE$d%>RG9yzw^mB`9D4x+opQ4 z<0SgSbwSK@G$wS#gi{fEJJ!a`KYnHO@7%&U$5W|f@|nK(P#pQEZ;OpbdU4qlaZy^+ zHy^zZsjld9kA{jdHc8`#^)dJNUK!mxx1vyvos@V}_wI`WKmYbvdvrdoI?f3_Nz(;r z^_+47CDSb3{;7ZY)zNv?)v1W7g;2KoRlaI#E@di5S+;D+y{@Qi%{|8jy-#~!9(%vT z01K^ZI0YUYpY+}=AAH%;mX!rYI5!#3tmI3NEcgAD2hXK6^%@Fbc`eUzIr+8B+8!X? z$FQ<|nRz3QQHRHW=VK}Vty3j_*4+S^*2!Q0hUmV?kA<6)2Cer<;Ch;>tgv6-n&;t# z-f3Z;_?Fn+6cB`XvTVw#JTL1dJtFmheL)Y#>7ZK7au0DWU&=SH(^yW;$F^VlNK8I( znCtSVj7`hB_C|9#H`Qg9JIA)Ir@wL6*Ty|_m&fbZd?xdtt#&}E*jnnI^)6}D(WOzH>7YWf~f$ z`}svR_|-$0LoWH93xtqMHk6h7%0?bhSb9^)hO|tbQ_glO)AY8;w?i5}2OXSW-Sl<8j$f__m}m=)@v@RwR_k>0_BTqq(#{l z@WOl*ei|f{%ZlLBZ5@=k^3NVY@~`n1`50)8G7r;pNlB)ga&v62Yzx2g0&m`u{JBpY zB$MN%S%(qR83DO+0zZiEW_eA#@k(6ypzQrlk#Xwc*ibzF_g@+(Ua~V99qJk|^4-HZ z1`p46r&kNsk2>#%;2pEn6a3^fX_42Prk)#r+PMiMDNEb*`dq6g_ziL2&eOF1j{On* zBxdx+(hGHTGXv!=;)Q4S{m50KEo9>-ym>9h7~9RbfqZgdwcTmsaL*T-{`d0$sRmty z|8>jl?j?Qdzkf%zbhZX6ze|E@;IR96;5+_H-t(e;TtiWcheb5Iv>04=F-h&fZ+>TV zZd#XVs;tc>P)YsgD~!0$@s62yKO851^#gd5&A9TUv%z#nObmnXlCL1<+ouITY#|Q) z_P50>!0L6oW*V(Z^xCC0YS+1SEU8juK@toj>hh{e?N?? z+@wQ{?7lPs6ymrGvc$sUCt~KVN2C4eBQg2-sTkcuNJWMRHbb{v#{Gr&nHTJc&MU5r z&h>sXh1-1qpDRA~piDKaUghG-`}veyBPsEysl!vzfsdJw?}{~#Psijg_`uDo>t^KE zEAS@DZ0_t$TWBP9#?-5JkP&4gjs;S$X$JSZ*KLUTwaVLx0C`;~7$A_jMIMqKk#*BQ zFcUK$-5qluek9iIo{F*E(>cbhhi0QXIzAjTH~6VZGTpH*rk;OUED$=EO~lUM_-Jf? z-|qCPl}NtnNTpeYZS2tU-|L`+{^~RZ@&JIqIbmI4Sz@8r%A^iye}z(SumR<`8a-7I{of7%6G%|6H(z%PLNCI+=eNEi zw;HUJU5iT4ozL!x6F>XTSToy*+Yfuqc&JWGkVFUgv#WXfE3bSJEWG>v*fG_P?I-Of77r~!1j6BgmlStW)`?X%IU2`be{-Dp zD>o+Kn}5Ech&q@O07>^s%C_^g%6?_MSP?`8<*ig979e1XYUjqzn=oN0!iC4({SXy`O7xTt^ye6 z+*D-!Z7digYi^CJP?eIoK2j=q$6@uM#fvK_QM9!u< zD6i*fnzQ?-;^fc%Sxo=C55w@0c^AcE8|d zc+YfP{?9%b*M8UU#qdWDz^4rWU`BZs=q4#w4vTzN38&uuXdL~&{xC+~{%}0+z-W$b zI&S3pMnS-`36gpeISXEuFBgP66mhZ>TmIvx;;O&?=4jt{GP{x1=Zu~h_h|aoUk)*- z4WuP-8LZ-52S~auVR4wjVS(({l5gE$COAQQ>+XB6jf?v^QN(dh3bA#_z_GiU-3&NzWpdq({@^NHf-TBmr(LRkRe*+Nw!{+I15cErx<8rE!VW-IBV$($j zK#HFQPOl+X>K4Xx@cT&=qAqYRg;J%%eJWp_u0WBVO|`Wcwro#^ipNHJIx>!hpqU*i zuS0eY{`&Y+2d}D(m!P~VG~EL~+&nB85OPTXd8b!GTCT|xQ9EpXgN$QA=oY%qrx z6CY@=#@%#onY8@EzV)IfW2d5wS!v|x@56`V^gsC1h)*4f=N*dJI$gRcxfZc%ZR<4T z)wQ6&X^vg0+#jUNx5)Om-|x|#C4gGASp2D zMV`jXn)>w*#%dkv*rfJ>xyR~FqL~PubypvuiB@~ z_0O_iEGy;m5l5dmvb;D>G4t++V)|dbFSZ^kWnAlmav5SRbVyJBW&I3E3x=g}r1PbU<}SD%m#QV!p`Y=bZ>n6q{8f2IPMsSi9F^Z)Z>IX-veG17s5>&lN% z<@3*tVS)x$WN(QqQ+lM)WOPNoH5>d>R9wnaCV$hi*1;Ce_;%sY}#ju zQGk5>#A$x%>gshD@x~F-Ne>s^W<5*lb)^a$L~ zvSZ-wZUL(&Lq&-QDDb|KZ;xZ6UlpgDFOK8w7slbSm&f7uw<7Ry(zC5qfJ1<$olrdi z2V7UDRC>sj?PX@HfPpP^SpW;DaO_emXXRW7n=Kg?*c`?%GtefFpt8O;dZt4Hb*HJ_olly z$##r5ej;&fI9dSUkZHH@R**rD^nF60IYwP5qmj|L`aj$g+urdQGIo8ST|>K-@~vU& z2^M)QJaR1J-+wShslVsU0HE;M9|6Efzs0sWivGZZdHYG4#%STKHH=Y>dY(A&kYyx( zi+Fa^+T7RW+BLuY;b@$;uCwZM>{OXFkdN{=kCylQAt25>Rw=(r0Unhv)_gwss+E>& z9`N#UI6+i1n|thdO#jwLV-yeg<|%+od5xGKJaS)SgtBnlCB5PHNS3WRhTb9eJ~C|+ z(zhVADSMx|se8olQ{Jn7;~u)ho8p1L^8)gutS})TO(#_39goj0ZyEN1B`U&wx0)>m zR7m}#A^DxgoyAsc*@ZR0{_<0&K{8|~C}uYpo6EI7vj|nUMCYUt*M06tY2d3gZIX_g zM`a@&(o^@oc5Aih)(Mlf9WM_ug$KjC|5N{|wB+QBU+*bkH`N)dNmXwP32?#?IjcC(~8T>x* z5WM!V4GF#sLW8WcwnY7@;84CA}tK=yBUOmjEPG6oD;()fyd* z>wopbvF`EX$@8%M+CakZ5VCH>dNqlMdf?SK75dZv0D=_qD7mx5nF%Q^*+ zTIj8Fq`rwqdFPv7kXzn+KKY_Q_FRSt>e85#ME#lQ{|@<2b>sTEc8qgF-Y<|NXTdJZ zBG|)se-vA(@@S$P%GMW+G{yj18pba2X>gCgX*|n4O8@$b-~CJ+|EkO4k)M89%qz2w z-Ya}NSs{*fsCPhbc}S{2$0aYiZNJuiWqho6HBLo=2pi6Av&UoYalmedxY|L!1!cn4 znS*J9TWS?x6U6FoXYT?r!=;eDVKYI z=mJJPPEvzY-lafS2^QN{VXAp$dP(c%KM|Kr{c&ucd2_7odG&aZI*4v4-PuTDal9E8O+g+Np@P^eU~PjnWqd zZiJ4T_nXdYVGM&GvO9oGnxxm@{)Qi;c59j%FG{Z`HFy0aj#no}hC9{$b4zKp=3>0H zbZ#_N6gl9znNH240Tf>}sF5Ms-}gTjz59>ECX8Y$is`lX2u2AX#`jZ*eLsvdN}3$^ z^+qUQ=jL@WbLZwbj`Givro46?DfffgV}OT-X&Qov-Xq6)w%5P$v&rLRYawO2hAz+; z4a-_Trgi_GXxw)gc{gLDo*5uCgkkrP=@39{I?6dczu~b=zjOI$%-(r43(~cy893hY@(Fz=fIGy zFqP%FQ_0bk@K{^uv%xYmAgV1xcg|pR51GOtddg^1_vb;B;G9)*1NFis6NzxdB~1W@Yy(dQ6hFK)vaz1}9Y9ATFi3~Y1=;ILb% zp>gi$_g@zezUh^*=ij{~cKyQh;^6OoRebUrcEkrq=i{__4eO@Z5ES{eFxtK^&4dTb zG4{Z**!sDH*ebj>W)m1DX>@RIs?NscL5-t1nYGkQa7@7cd7Bg!0-^SmTFzb%xob=dow&Sz3V*{M zgVzBxyxKeWJ(0$cJ`L3#=rgV**GWh7GiGI*wXL1Z?`&dg9O?P(ZiAqR&+%BnFP#DM zpq(kCtyXkSPjJw#2Wjy9lL)eL;bdYJ_2@S3AAU{Dx3+R*!4($5M;Hwh0J)qekQNny ztm&$>W4e7AqE-3&G26PVWMu^*=p2*D^f}^Y-`{pV5~EZ0D1nn8)C-DUTI>mwcN~RP zfyVK=)?lz}tx__`F0jUgk~j2jFtjun4S?fex_pyWI;({>7}W^IUpzq5B2ARov7FKk z#skwEAk8sAbrRzn8(O+w9w+Gzm2C;*9NTSk4A9}qb{ZDm1jgdFp@FgQn9~g2U-!^# zYz1AidkAh)K~__UPTdF+K(_ zQ+l`Rj37v8aj)K^ytu#qQ%5Pn41AyyH;l#UUwu(@$AKq+&KDQ>Yps!DzFX#dD-Xelhyn& zE2sZkTzUF8V#oA3r#i( zCg^1s3hyKhmi;!kq0!h?D(S2q98;1UQ_J)SnYLa8;6oddV}PS{7smnNb;-{>PEqkL z3ZHh-1Q7r`LDeoWsE#MpH)tq$8>X8rb(PP|M-OJaO?Hp$w_~VIV%Y7<`{Y3n5CfY1 z$!nu=`*^G)kMY)NjFK*$jRbO8gM41+(<2kq3LoPS zPsjSh$6}%{@7#~kj89ER_Y@um@)%37Bv9tMJKCfRYdQkr@qd1OOst7mhp|}hH2~-s zhCa4#A)fR4t8iv|@nCnZ-0P$bWz{p!2^j$gJ|^hqr-2E8S%<~zF2GxY-O*B)0^b7V ztm;hn#2$t+GMq!c)|m~L_phal?b)g5oz`G`F@kItxUYE1oFbi8jw!ezOPNusr6gp5(Y8X_$ZOp<}U*OQYzG!wt<_Mx*yz zuZYIAlX!xZ-A2C(U=LkS_K_*KU_*cuURi?RY$JYk`W5l#vo}$0y*KjV`VB`9$JmKE zY>%5MdVW6BFG8l3Xp|9aPN53`D0gI~UMS{FljBAkK;09#My z47zwgcP_FBPl;ryctkqI)iEXTq5b`1-wL8{0HEh%!~9*Kyl>H^Qbd1Rg0l;FHmPF@ zdqd}LY|~FwwW8D7Nb9gUL2tNwBsR`}g7XN_G!bIX0@IrK(#rFZRq4_R-FY8Ax24MN zq}{UYR;swOcseLh3y)!%?hhFcYls+2KNS`}?e^J%kHZNqaGUE1NI52V?x0sW3}{>V zHi)Jn5amF+Mwp;PxiHpI4GT znB6P48iz(QKVysAi0ybqmZQvQl0Wwp04U|_eB0I-dhvJ}ufzB!G^plG%EzwZD4^iE z8~@hM7}-7=_s`G7EG>a~_moSPg)-^ISthoV51on$JnOZ}2{7+HaU2=+W36MWfMtRb zyd)2%L03`Fa^dzhv2FsV8ySqZr^#0ko+lj}gow*tF_8v$u!j)}M5d9ms?-bRH*d?f zc}%204&;}>EO;5e0!a5A%N)a49iJQ}FTJ_7G%mwxxFv3b6m>*B=@PF=-0ZCx)Q?{_T~B(Btyt1kxVoZaCIAh~-=cp1L+hb$_$Cn5)-N87is_e3!kM!zLN$R8%+d6NK4Rap=4DX4_-X~)7 z%!gv@+*@dnd~T4OY4w{viJ{zO%E68EP#XjAD_`$cjzz(TOFS?Rji_|RG)g@Y z$H^RzgfDou>npDszXp;XC4A@&w&7b+XS`p7&-4Ut)2q&zC-#y{SUjfz>VafjfUg)6 zM)cYMWI&t0^$EUXbivD*sNKSDg0DclMo>;~c`k1L{>yMIn(=6d22W6_f?j2gk?EDS zX+-vE(B4z-8v{V=^^lpj_YDIE+>@Rejg0q=>~vgCV^)5BygwQS>RJzJUBCx&*?9W| zdeF4u+9G7tbqS z%V#4uDsWLZ6DX$|E$~=A%hXeE@DlsnGX!5P;tk)n2L02Ur`yc^)~$`r_z>P;gGO0U zoN!(`F@yYSeyeR2%)`cMjI=f&i?LxEN9z%{aLs>vAs{%0y#l-f9ou=zr2~WL3Lt4n z{JZenr;YsV>l;pd2XY<9u$9I0_9t~Av%JTO~BNqUr9SX0=#B!6?;dC<{4C}|; z=})K-~78`qq3!f)^CN|D~GRE!ta?aQA+ugM*>#La*9O{fAonL@f zP_{DgZmVQv*}~?4x4~|v#+J&6;$r|Bjb4LB)pvj%MbqnZpgsrd>Anr4#47G$I_C%~ zb#|vD71{eur%F2&8vtc+@qsi_u?4?(3A0v&EGP+Ig#H|Jb z@5pN`LA>PSxK&@z%j@QA{O1nE#AOQCGa`Zus#^pUmoxkf!P3@pbL?`W9or&sq0;M!98q5k5SXK>Z5RDJ$fI+$SBQ zqZAd$H}m--&gV#!?SZ z2PUx)J8+z`m=Nh}BiNb_+@6K8_*cijA#E53Fs?mvC~p7kE=-6x+6O(R;z81##a5ns z*X~STTRnw4uRS{h-R}*@AEK`_$nhGwJXcmW?!7*FqixpY`Ld(n2f{_Br<`Iw9s|S9 zpV%549DPm9H8!Keo!C70j`aKzU-U>2mMwvDQV7LoT%9s)^2pY})|x`=sJFWM+a%<# zo*zwWc73xO?05rRyL|J+>g3~j3fITmykCVLZ=hfaFc_5GJ@-)>l@VQo$Om3>78qr7 zIYN^b+-D){R#*(1AbxhER|_cjuq8t4$}$+zz+jtntrL{=RNP{aqczCUa7+%tCw%FZ zrjg+F)af}MCa5ZddTC8|=LSN02L`AupeNXJjAfVgd&rP|7ZDEwT6!*qH5k)4`H#0x zrw5k2&=t-ZZNiuy54Sr>G=mQ0;$Q>iQdT+3DL-`8hR9dG)6=0`qgWF$iKrpF%!71X z?g2kG1hseN(vmflZ5#Qs8)A1d*;ZyD#`Z03(XmsQUx$6L6L^&ZL!04^=gP~x50+P-S4aNsL*T&mt zZmPhl5&y?~K1>;iH*^}FusvJzbmPSaZIN=}WbDg4NC%NQ0TQ&I2H~s$XRBW9E{Pg^weh)zs1TahRm#&%p+nyWo6!YgCTQI$U7uxQBq(8lrnfcgX>E2g6$!%Ghve{Z|W)5w!s>sp*HxbIA#b zqSQ^(C+G#K7sCk_c0KK)qr4c!IPG?NskZK%AAvss%CE?&NTpkScBqZCEKU{lFdVwN zE?-H2!XPzD2h^MEo%C@aemX`2d5~{{K^m!^myGc3(};wS0?9 zdjvB;ex0C=F$ypvx)bo7wrKkXe`R8U(*U4+IbNoNGci1$UY`w=-DkVu6GKz*NO}Oo z^S)&wUit%Touk1PKESX}ngqjA~KOvd*AYdCiPgVEUe_t(a;JBki9D6@G9{);k_ zPq%-qFn0kUC2*4cUF>!gXEUl~%N2f_V0IfX40Z=bFoadqoP}$Q}(yF}c`BqHjUA>qzG-n?BV=7aHa8S@$!EW8ze9=`%ub z_SDD)jCHrS)7*lr=Hl|%chmi~+e_<~6CP#2G+(2QVWiSgdRx%*Q5_?@*VYE;e=*tL9Yb;KsQ8{>Ayeo{XIgQtW5|O@u-)f<- zZIl;J#$^cEtR`TQ>zM1mBG&W)16sG$!Up7JnpSSUFAak$OFam99~xx~Z>T}nZ5-ns zg^w~`R+M{pa6_PcLz@)wU;Ey(hfn6va-Ku9Pn+~bJcy0jd6?MSCyfF zBKddl8Z;c_s<)-*X;*LpMIR?$!zB9}+9YKfr(3IbcO54q4L#*n4iS*HWixFI)3KBChHY3devNmnHSgnjsuQ5(L)aczVxW|Hud_(DUWqv`2>6A+^0L4 zwv>6*^;LMuv19j<^~j>vNaMwJ!ZfHa^=AYfS#w)?d{iH$LjxE};k2Y<3K6|VpQuWpRtFqKAPiI#z$HlB8Vaj9|T)*pwXCrN;ZUC2Yj-xQt32Kb%F z^Lra!*->Rj;gkgxs;ka^wjL?aHUe2lz&c+c@-4F5@5*sM0wg(RkzG&$4lvYBS5ywZ zmf=XwBQPgM+*_55%YFZ;eGO@p^k4G_2S}tEmvd?s9!kqN6d!uaM7-~<<8kxl8{_&b z)@PL3)07X(>|z5_8!QNQ|* zZCr%c23>AJ-U_taLbQ=}ow(uKKgmsczsk#TS>IyK#jI39Nsxft=?ndfAKgq&L-E?L z*g@aG`Xhht&7q8nhl#Bx-(#5>sf z+`X~wxyZKCjZ$#sT;fOx>I)i?jM*K7^gN7bCBf4N--3+Zx+ZR*9+i{4WeQow!mrz` z%RBb4YflF~z?=ENpH9Yy-ZmaL?pU{~e6M@;gE6}O1Siy|X6$-!EPm%#*2ji5WAXA^ zwkOwWonYXnOnvX2+PwLBdt=M(k7qqB+KzH0UV4!I@%Wv8vo@Z1s2wlA_43%bmIh`~ z4=NC=_`mJ@K10?t)clp1RNZSE{Q{tS|5qbE^PB3o@A*Uj_y3>pA?Php(Fwb!FhfJ_ zqimUpqTSq!@4N2q_&*-HD?ag}`S?eF@WJS|UP~4~5MTQTkH_Er`)>vC+VKFM>U+7( zRf734h~6Ap?S3Z#($6;BNExT8*N5ke{rOE5L9%w7$T`nT37!|3TI(iW{Dx|O8P%Cp zVyT3EVCLg!&MeUng8?us}*}C@Xz0uf3dVA>V?!{H#O$F>G z+1+#T#OFuiu|wmrdEH2C+A<+t;NI&xQBJzWJ#@=&UQBjR#KaMRlzU@0T6K=l-_ynL zN8*Wnqp^A8P;A-g5)OFR`$HScSP^E@8jX$9PsGr^DemjQ7joEzQW*B)$?U->9BVdB zcz*ohq1d&5A~tOtiOrixQ!j@k-8KM+GGHCC>%i$aJ~bORKWAfh1zl`j;?Z~*w+(15 z48_>teKCAs1{rYQE?W7$)Ws9X3;r8f7I;)%95;8(#fLr(fYCVJbloP>L4J0v1trop z1o;d#PR54gFue;I@9D*<$NF*a!y963yb)LKSd+XuVbZi8-ln|r!+nzr$715pVe-V3 z$Ws{vWe#PK^|lbbCuXC$7Z%{HLHf$fd@{~%xAXDXL!+_#AoAHTf!xQ^n2T(z%Su*+ zwe#e6g#6?aSqJ5Q{E>D%zTY|{tRmmFGrOX_|0J?PU-xz6zFdg_Y>+O4GcQf+cOjQ-nWjrYsQtAttGv7)}Q$%#^siB zz{}Q|C%A`t*{6OWpMBH^vT5wK&H%!rt=Ro3fQYyn+i#tEac<>Hs}gpyFqX^4C^L{> zuFCstBR>7A%i`02`?C1jw?7i6HXV*fZ@mUPzaw7!uE*l`yY?h*-b?rXIQE>c76WYO zZ8W;};wYoTTU^_VGjb#w3&->wW}pm7+J3Qlx6c&Sxt&3S`6&vqM$a$T`8C(m5O-qh z{JRtU?82Y|00{y|Xo8-tkY1pmCFRD#J4SRKs%}Xt%q^u+1Thc+D&1e}=FIcwqHL|< zRoC3Li-Mq_<1B9iHX+9r$z0dpW8cY^ik^a?G99~0PeTkWaq?IraJx#7-^G?J(SiHf zIB;Cfam_(t6h_0yu}7H6yw$_hMe@l!xrg}9t~YX>g{Mukq+fo?Pe3wXqp0*)`|+tc zT3d~`xHLMzLK_S81%)w!FpI-zL}QyW8~&~bb5sI3o)#&5%PY^ zlKfkLzUqsZscV*%R0r}mFV9i(%&Q(oN|_MFbIRM}yzZ8JRIRi*({eYjlQ#LcH#!06 zVfpN4rpcx3{$?!82|pIF%FpaQ=Mfqa{e6Joi#Nm%zvD#Q{hGs^AI-GWK8T|{j&tmg zm9yv8ug*<6H7Yjc?jaZLu{b@{VWuus<$zL;pl8DSlj8|F$>6bd$z0MY?gsfu>qv6DZV=2{`P?_-P#>hCW66Nw$ zRQWKu@wvaQkW3>L&2$jl$m+pyqnzDL?J8+4r`nKQzgBpu?uWO*wDOoxCLOAq&qLQ= z?Lc}r_8y!<@ybwzwcG=Us7;D02>LF(;n=h9&gkX@Mk`ul7^{QrBV^*<*nDid%;#2{ar78owR?CUWgQ~TpflLXaxbQ4*H!6}hU1ZxH9h6Z7*{3k z%cWA@Gun#Nv&Hb&PdeB?SLEU_&Op8Ap1_`CdTi@*lDDt*Dobu`XqN6dCkgIOA|?L@ z&Mj_DyBp(M1R(X+_%=d?JX}r{4ka1ix6-KV4a(JMo{C=kaGY9)Jo|nVrX9C^cwfr2 zL%PSvF6&aTTX6if*pD(kla?PB8kA8Dh!>k+Q8J^Y%-ZN;UZGN4Dei1V%(m+P?QJ?Eq6 z-ZB*vfZ6UtKD$|aU*wE}34%Va+3yX(Nh_x3Cgb79UWB)}Ex|9w$iaqUlp8Rn#mS&i zN zb>PJ*SHZ7Iqq34A*ZQ+m&vki8Pg(mOMwiSKgkGJHcX_IaxDNd#FXT|AXXwFOj>|Rt ztbS>9Y8uQzedU=?4zaQQlJ-vEP{BvRm@v@_yy&tv%|N6MCfi_!}~` zj&nWc3bdMx3!7fQcmbO(4AnsfavdH85d6w)?`F(lKDNyLMT{&Q2KkAI(%PLU-;q^} zDl6(Vkk*%CCH^u3>^)ctb=wicAXwazKH@FaX zdTwpZbk@i8?E0ARu8Ga-$MBA{OjxiNQPoeO3Lq_8UEY;sIuIIwg&^&#yvj^H$9VWL zJ{KD=KOGy_(KS0s_umPVx(4LWA&2yS)rn^8dic&beE2G~emFf=f$Yi9{^P^(_`#ug zZ2wT~K0F>LPa_v(>kEEs53ZKSAT?+dOFeUN#&%$T**)i^Yyj9U2J&ND8Xn3$3V7LT zQKtdHQrG87n>cuIsrp1I-F=Hhxw0It0Pq=W$J8UPy!T+ra5oK(>6R|A_~18OjIl&s zSKm_o76B0r$n#5a(-x{@_b+BRt5z*sj+ub;Wu4zfPEO}KztM%G)!2apo8?x=CP;_W zU>rexSrEJ~P@8%k`AD4#hIf;1K1R_}SyUoC0N)a9h2;7{XmPBrB0Z%9F~?fCM{i-( zVET4#2f$PkY-&)=@iLVw`QTgz`Qai!oxIiEbn_(i^pc(gbuoY!zx-ruSlf+zA3B0J zRLYPqtE6;}g{2abMYh~XNl==bn~0-_u8xCypA!dnKPP5R-yFvd-Vu-A|NJ;{d`D4W z`fJJ}J-$VSR(==&UEI0Zk$Cih=f`7&M;^Q*rcT@vFTP`E+P@%Bw|@1tam$r!OFpDu3|umA zEr_zIKlu^|%UZ(n{g&P2^N>9hmk#AUdX4IbdZVt`mCm)R#G%ph)qnGNrqU8m%Sf9x zTLZgEs)$xUe3)N{73}{_=H6@`z#eFd|Xx1;c&j7)~!P959E6`59i?NBGOqB zwUKho&cX3l=Mx@1y1lORbE%8erX;$u1@z{P*&8NP6;jEmM!57tlq9e9ks z(U6Lw;ZU-=%YhR09M?nf2Vdln3Ohg=ydp?X3`IR}u)DL2>dJSU{ISiiZ&k{l9*~|) zf}Y20IiFp2g6rtc0F84IfIhOO8?XJY!_n=|#iu`aB*9PHDld~L3aViW2r9FNn?oFQ zuZqglid!i+vOE*e%YF@Hb?Ey#?H0ZO8Kj}IwP@M>w!CIsQS!j~ly=J2vR3k2B@}sZ zAN$#0aBR0YWy$f2zVdkH^T^)gM8-2q510(}hVp46(&4O}spSitRt5!o2FtiIC5Sqq z!(F);m}5WOM5g?Et;p;w$}*B!0(}VrdX5R^F%eQ8t5fDde7nF2f~hk_9?Hk=^!{A{ zypvfbr}tiwHCkj|le)-8*+{Tbu2Y8m3^Z~bI!@iYlxl5k+T+VhB973|oDw+g{<0BM zoGf&VSF%B@^*yPUiHepqaE<+ZJr}3WxaT4f+I41y%;V}G8vaIFhE3GTOzfC_SG0O` zdo4G#(3;PQHyO%PFr|XzGl9#1;Y*VQK0G>S-W;4Iw1zr#kto#YJb_9|h4C2UQ1LMC zzJv5Ri+5%j7nM4@FkI6MStY2{0>*Mf5J2h*PI*c-;8pjfhhtE=>-{{&Se*HM5(?6E zR(Y%$SKc@suYKL|IB<9>9^O;d8p@M^puSs9+cUq{P;;a)D+{k>Banc|dBC@P(W@x9 z*Hhn>O%*(s;E*2xDxgr5nmRBk&cQ*IW&xT~93%~MYoI2IT3p`!qPPxm|2*lBF9S*S525qlhJR|NKc-|Bt2j5(ev>m zQw11{d1=P-d4oc?;KvX30;GbA9Z1Y~6hl8MWfkTw7{g+=Gtr6quV?8c09lGEsj)7nNEdK8Uh}q zL2$|Ea2w4s2>zu^w(gR@8oM7pnm&am;4_|f5%2)>eR2tcl-2P-%G-=GrlH6*j0{9E zNa;MOXy*yOc1ka-uFC=~oF@-Gk=i)&EJl&DnBJE&ft)iPlsT2UI-lOpljt5LSvF_6 zNbB~OACGVO-ox?PhmOXseYE7{pNx7f5gp8N_#1%wrz?6}Iki!P8 zc;z>oh^;$j;!_VE&W~PM-d4}$Dn%>IGaCZH!Dm)IUqFou=OHInYHzp(y!^anS9uk= zD2pPe0ZRQLe%2=;p9&(bGw;lZ|Um0M+FsjY^k$$iT+n)bWxQr6TCtSLMp` z5Aap-nC4D=w^@v=b59&39lOwe)w&gv$LI2+?vMDW9%ltUhnhSxB}1wGLRq&f$YQaW z$ri?iZP?!0&7yoKt=_TBMs`%Q-nO4LI@} z<2dEOv5kW1lIElD_f~sB5ucsAJk!i_Sbu5b@U8x3`oxuOh{I$**;ZfMGsN*@NNc%c zIIh0$P`vMD&xsl1qss!nH>A!$MZU;z0Q8(tE#)c4ZgsGXTdSCqjngv_s3V_Db)DbW z7VzuM#@5a|Vz?{17eRE5Xz5b|U)}_sWraS3hs$nO`mVbtV?hK#anfiU3$!bY!8mi4 zib{p*5u_ofQk07HRo@y&8fkhStB3sH5NWzN)R{*Ii4!dBGMR3rZ8#qJ-neYZQRKoG z+f-pifh-}r%eF){_sp(b;nHn?O%K% zu6gmExck1{vFqSe@*?@t3jx7p6a9MlLvNoXBo{Yl!-$M(59)$~;0op2y{iTxpK!2& zSwWs>g_PL}=NCgM_vpI0_`d&pZ(R5CL-C%E?25fdW=dI*SNcSjk@|5>WDX!!d@0Z6 z@~y8~er3EAQZvp7Sr^1FU`lyOD<@-6F<*h^L*G>_%&}rd>dT z#o*9ZEs|3QxZR4r*8^pQD|x?^}>{Jr&WkFOj3 ztQePh=o8u-<;5DL>(RXzbO|$@lrq#@uYzg^78u7g0h1 zQ75GsiQWl$4pG3ohjPGAb`gi>V{Bt1UjDj6@dLkjf9!nKy>V#db8%{9ZyY{0jYyg_ z9KeE}od#x`Zki-6?|y__Ll(pZ!V3xjj@?enp?p$SE||uXTb$rnEo8TEh4Xb7MtA}t z`y=c6@pV6NDE`L3emFKf|GwDOc`WwqI~h|m$VO0upB(#Z(NNJ1vcBbTQNART@)(e> z+ofATd$_xWv`dwYz`A1kd$3ZV#Cfm?c6lcz6dYNCJw7OE9LGPy zU{!Lq`S=(lZ(|$jwhYg55BG759hR6Nr%h2thVy(DhXd?dF_|7b&)v)pE`S`|v`b4xRXz?+GEVqV%V)R=or3#L*u(6_w zu_`Y?%X6X)in$8e8kUzlq{R??BM9lFoH?J$uk=v{6soLAL&-C~RO%;rGQLXAwxCi` zd|PI_*v0*0AJ5(Hot|46=c!*sPr198Ld9}j-b@e5XLrMe;P8lBU|H*d{h|{p5b-%z zFQp;Vy#92l<{`fzMx#@YD=H(`!PUGyeWDDaRaMRexCBH^6sn9bm%*5qK$$%F265tZ zDtWT|>Ae6_$~sY@0M#N@06R#wS2eJk3vA?;$fQ$l$*QETPT*x3!&52u0Tx{sa8 zTTVtMnNI=Be1naPt^pf5`sCA$gKr1?{`E-g9|d@_0O}PUTXTdmwc^z?r_zCMQqSMG z=O;2nEkfyJS9g+QzkTDqdd~v?PY{0WUz6v*@l;03cI>f{c=x~95pz>5Dv8QL7Wv{-XZGy* z+QKg&ACjmI(KsgQn4J&Y=d9r>!6b5U-S}v;X=T^aURM{THjt~&ReR0!(-2e+kMkaa zJh|L}{p^x07^pb&$n}`;er6zV>RmY*S2^pA zE|A}Xa@NkerdwUF8Z_5Wrf1Xz1gYn&Bd%q>#;Nj^Z@aanuF(z3bKvdmxbI)L;=ouh zaB9iYc#Sv?AG?O}WS!)J2OWaXFW8l}xg|+;KyOxtZ5%`+yS;*Lu8oy9dM}*!DG=`% zKiQ4RJ*Trl6i4!jA{x#5YmGXrls@@tR`%m@bs5SC16z}KzZ_e-i%qSaqnE#-)jLM& zdIw}hfvF~6r~x4?GPRZTA!y&{=WLc|zib1F)I#_<)5rc^TBvJVBeAAsi%)ZKuoe40 zwKjI%b~=XW7B@ObfEvnC42^?0DH?us{+t0Uj}vN~c7bi3$>|)y%2s7s8d1i#Qc+fb zDh+^Rbxy;~Y}gnl4K_2DkIInz6X3W|-Uef2e@nN#nTASPIoHBadRTH_!!eDD54Yu; zt>xHmP!0l-N8v%kkuxdL%cR^X)&lBV3s*M?Pb%cp1 z|9*cYuOE2laD4ig+i`HLA9Ko)JG%BMQZLcMNDcS^mm;CDX@bL_*QLT)~Z z_xXLPQ?7ugeEE(+$~H$ueXctbcedB&w=!%Ar;fGak@v2TUZ)WouIfcQyT8OISTRNM zPy&LWrJT|u!z(at&z~!JU$-)@GIpbvVJkVb=tZW|r*T#HD0}N9&$(8Q^O_Ck8;y~? zzrN4-{q!EZqdI15+ID5lH{SxI@m2BDusC1Jpx3Jo2n1fUzD-MzG>|r}ey^v8VP2k7 zZ!A-h(}e`7<|Abb50)eUs`LxbPcL}C0Mw_hlvh(vPX6t`132mVB!HN&b3WM`ggnS7{&mepQHz7dCea5Lbk%0Ii;+-Kfg zEA=&s{%}ox6IdyS*WAzk=@@zRWA9%K$A^EV8K*ckr`Km5{F?qf&9OM$94@_E>is!> z%@2C-?2WlBCdV{YAtzAA$UC2@X5Wc8S0UsKFg5;7pM=Nvqdu=BJU@Q&@BUdFXtm>{ zq&1Hj-`yLGlx@-I5b!tM>}!7&k|$`Rr!*o_f33)Y!TGZ}!WW0@XnJ z1qh$Tq#zM$c6TVM!d2}@o9+1i(Q9JckjjWsw&wAIZOwbJ^M!M9^@~o%_~u5w%<+mF z9beP4Lh0}Z^o-F_NRz!pUre$F(sp!(259N1uA#DBG^zwTHtGe2kU*8`*fkY41hkq4 zYMFScM~?lax9GC55~Bc}iMXE*XTngSfi%vbv(Fda2k*m5tFcCMh`H14IJ~{?=AlZ}j8tYXj^*O1oyHfItOO0zc|8U zjz#3lPbsTwm8@I6s4+afSB!3nm$o*dV0s`bG;ysk$2F(|F) zm*~rrvdg8C2%zluFywZ6Ul=Q=t^dkK3qV2{y*jSI z=^u+zEr4E6r~<(9inprFX6||SaReIgdmlOcAdcZ*k8k^TuZ`FLn-9d@!;|qKcrxGZ z#Jt^KdRNZ(I_c5tJ0U`I(j5Rme=C_J09HH?$|*sQyq^hda`*?*HHFQAOrNck3QRd2 z*K;|5m!9 zT7x0GkmlpDAWbjCTkR5)N);zzB^j8fYkev3O$WRHnlejXlqU?< zPqCayc(RM9jbDq>pQT_AO)=MTE+!!&KWCUIm@BwTCePlWfPKBcUZ6syx;c-Sttj@b ztjD@1;*C=e#IH`@AMcww7>{>P=e1NkTUQsws&(0V*s7N&9;MQCx)i=xfq%@!rpU_T z90oramZ)4WVTno?*80VBBf66h>WmZY3$7l(#Y0sx7)S5lOcO9U={eJMoY794dDfnv zpu}y9!FXqfjAHT28>PWoNzs z`<0!A*s(B;N;hIxY>MUtNv|O(LI8rzNz&E>bVgLr%W*-<>o}kz0-w1GeztRRU#vah zTsoKFL(fuPQrdW$$}cDP*e(GXJmkJ)1K>d&h;O;rH5BrmdVBFgp-oLdWpVx1oV_0 zw0f|MxwOZ=#^trFvvQ^0+WXT>%8!scHjd$Yt$h2Xojrj$P;r7dm$k=YjbnuL1ST-_ zEv+#eC1I``+kl*P@SyIjM<=%8iP;TwLMy4#zg({4mZ0vGZ6UHM+pqumQdu-rKQ(ry_TkGrZPQEODf6Ys9D2eEE$v*L6n-0Iu z%IEl>$8>#@kWIXd?)N|XDbjme{NvaEY}|JDfjG!b?;dVZ)`jc_ci?NjH%GU(EPU?v z9S^h{?6I@MrR>?alJC0wX;bVY!y*U3ir?z$MWe?l?04`AU?lAz&n zHjDxY!DU6RB~%CVn(HewPSKm9UzL7B8h$xbpF_9cFK7L0AaWMkcmPIuny3*S;ti{v zoRb8Z^k&V5xNf_-vVk<5z$2}HwdGsmu65VvW0yJMp&H9iW`mt@F1!0lBx2Hffq(d) zi25_}AD{QLvE~Gz$I%~*Q5Iy<>2-3vZyt`E29aU%j@!DP*X;I)Lr0HFr{SA-k_r7qc&8gYXKJs`PDbB)z5W0%pv7h(_H1RqF5Q; z$FVAATE4=`YYy)Egpf*}>0An5BH>I*{ieR^>shaObC_!toCHK4P=FdBcaF5CTAKrKw-CokN`#Vl> z2G})#Bk)a^*A+nJm@UcW8bS6O_rI7l*T(n>$IS7Ru_0frX}M}Vahvk=up*Boj8B=0N|8CXdv*k^etV>PJ80?MKsR6Hv}g>cPO%EAc}uF)J?Squ5> zXsvj*y0*9|BNbj0Pot?T^Ade&ko8!BQdKpz;T6EB*Ho7C2J75)c1^(MM%Toljcdw! zzkKZ&Q5GjYh?3yvdG5_FGR4UkY5<-edk*Pb7j4(0lD54fKap?VdTe&tlc%fzjctI= zvX}b$U_AD@zuwQHU&PS3X6p|u=i(AwqAy!Qrz>-3Ur=*r0Oa(B1e*dUUN7BVjlqcl zZBmf=p)FU&OY<{wfDFKuxY5M}12kI;bASqQ0XXfuJlePrEkIFFbBwMmO|g-rr=a~3 z5;)ntdv2$57Tnv9ll|d%pufFzjp1Vap z7%=w5>w?9Z*FCP!355B^A3}M|tQ*&ij>XShc5{pnCp|mBudLB4`8M(3e6&m86AV9f zdS`rmW?MWsy*)lZyCwE4OlI2Vk-(Uq=Mvya#SeqHWEa|ac5LN3^I)5C>KnL_>D3bx z0G{J-UB_*>{#AvFNj3!sHSaefd8OU8wav%F3(lp5D=y##=l=*x!& z0Z>}qAPV4lk7ntM9BU^63K<9{0T)!Df9J{TKnKkBHaiTXI zA3Xk?c=yR`;{7MCDyB(#LTDN%Cu$GRZm0m56Ki^5^5GqMll(a4;`kk?27h^9wO?XD zqJcoE#|ogpYMK4@o4k(E4RH@ZC;0V-iQ`LreQ|-WJs-i_9fmK*?*z}$UfeddH*P!n zM7(7GqjAO2{mJ)dF5eOV?>D|aLC!K~_cpyo^0Me|Wd_jCI5rA+s|mgnaJ`-w8~X9X zpZ=fmsyFW=zUUb7DR{pRcX_@$3;Y3XJv_mj`CS6Q^1_4yfO>dtr6m9)p8>KSSFi7< zPK|4}zP{vki7wHXA)R3m>2aM&Ue8G{&0P?} z<9vaEAm~KK2z=%Q1_`+}K3f+rjQ2Wm&GCKl@Wvf6+aB@@mbvIVF~>kMXKd3m(fCHgX>0)hqn#EL;m&`ZyuczPMq;9TX`i&w4R z9zVM21`HD~1j}u97f53$cFzsPn-AX}zqkL^m~G8~8z*AT@DtH&&c=rEM>N&gGV)j& zv~Th$V5etSfVEezA5C!6!zui^bjt2_cE6jgI5oF5rsj6W;knD>;A!~ifo64aaP;*0 z3^F&j^jD} zF1xQ{w=xuGs#)yB901VCAPQIb^ChWc90P#;4H2)r@4on(Z+tst#;YYACqv%ST8LA< zIb>8kLA$sM33z&eCFGjMypr&jbu~C1m^0~+4Oam~nYnm$2>>tAvxWqoB>*gdQ&SCo zE^l_k$sw#)Zn!M|#+GaHx|1ADjPW3b`lkJB;$2f?v1VvLp!YCfC7|{4=@7eWc6A%L zV$Q<0L6H^)YknH3c^FA!t!JEl0YQQx*9!Ovg8GmE85f*{@dc(iE8N)``{%BSy>mCm zRDV;M=+JXBn22BW1MFO|-1AFu0HEF6CScUdZ>A7mz|+&K&-t0m>NvZ}zSc@;X49P~ ztvPtt!&7$Y>2XzHWSd1JH1PZ~4tY0yA0Yhn*7TyahE6Zt;G6b75&z_0{4oxq6GbFU zl#e#&<3T(>fzGEw1inE4EHl4)g!!AYNdV+_&q+1tDZ3gJFD6~;0$-vpGb)Br2rFAg zr8BvlO7}NAt$J$EtJZFbAKv0SoiI2I_Go7&{`lmsxa;(>9B*rP+v$1fCh0v&E>Ce1 zK@PZ@hFTt(bVRY6ISY)=64ZR?<=MCN8DhJ^E>qE~83GjZ$q>i)1P#DdfNSTQ2Z|Rt z+us~}=5LE98qbZXp)~*xy!v4$z>FSrK9B1*J-ur2vY&VD*YEEer^_r*8OJXRR+A># zg?6k@k8U1*T+T|N#2heb5d?E90L~LnP~)7%@oR+*fVe*n-;d%j4IvNr^*Gt|06u}OImdai zhmeyXE*#Y36Zk5C^x>2A1SJ5q;pbua_)muB zV!G?Iz}=X0_8HJ~{4c#gJwLVrpt4!s4X(jX&#!*SAQyor$@GO&Ys18?Z>aV!(Ixsa zreYWx5N=onW_F$Mx-@QpL=W(m(RK0Dm)(IEG8gYSu`mAZfzQQbvwp_{R5<11;E zt%k>z{WQU1he__1q5B#^OhFDjF7Z9%?QS#uYTuJ-?m2Z_#Y`^96O0@< z$9VkHg}HKcGXBBk&&{uu{lcNo#CuQd&nG)-^Ahk%4;fGZ1?qEowFZo8zx)ZX#;T4z zpK%H>7H}&DUcjsXT5)W0kNxVLf5i95NfW&%qm_O6ue-|Kn4CWl*B!YhwoL7h=?!aQ z`m%L+eUx$ycl$0sK~Z2@OA2^}xmHhr^hE~(nZY!3ISX;vwU~=v{bN6a8wKJ%sHPX0 zlP-9Gz9qV6w;M0e*JugCTMi$OTkqKev~f(ZEH*|@I8~$znE*%`v&_aRzh+R&Myh`o z8=?%#CC}!$I@X2KB>=oc&k`zz;gb!1_(v}%&jB2IJ8N3a`1{+R7pLid{Xe@u9Q)_( zC~H=FTEyfY?M=)|%ALHDhlQ$h^)*4HI$OrFq%`r2vj}+ZSHLLxEuJ@?>B}a6`J4N7 zJj+sLC!Y<#5GM7U+TA|g&Es*^?)ziQk=@ZA9g5@EBK$tdGD^r67xDV&J z5jchAi;l!u$NiiHF&GC@G&x6u*ql^}NjS&zYfb`8c%Eb3x%dw+{q+Pg^Rr|QDSn(r z=ivrkV0VV(9s66zN8)l(G=Nyo1}{_tjn+-VS$sM;_ZzH;zkcl1~89YeP&&%TRYq!L`H(efn>`~{^Zye`BXKoV!-By@H9t1^Y zmw5!>bQapKuU%^=LkPY!=V!n3cVg!Qhq&mBc`ILtdVrhX*PjCPI??O7Alkag=R;zl zt9STh0kBMn6uLM7c&Q6~iJm1?07TC%O$0pj74W{TxsB!81@n=z{H_Nv5;MvzIa`dS zk%C55fTkupUH;W)@^w-Grl}MpDxvBO;iGcG5ap#&R2QsADCo@~ z`{JAb?4FnzYsKep+JStQ%3Y74HXQqN>`>2-kh9GBqzQ@V5**^#9Ug~ouB|;X9k<@S zyDX`J7n`L~cz>vs--F{w=(4PqlM>q)r5wtjMUh6mt&f&y>CD;Jo(^3Cz)SQjp<=u_ zQJ|-ztqElQYiJm<@9ire26sXM!vzp^a~gnTQ?Mkme>I&6gog5K6dgm4t21fL<(&EP zGeGIl)Ys}eDx=RsesVw0m5&rHz9TRbC6Zm>I-s1fZ-jVd^B$P?4FojJ05$l*dRj?aS>0>5Igo~x7Tq* zK(3h}h>UYfoMF-&f+wFr?ziHle{^rwfu+e0kHPB{JRAdx1-vo|Vj27`z@KF&dCy4x zD*ojj;L_2V=btWJ>H=S)XBE|pmeYIEu(V?LFs4EB`eHXUw0lb|P!4jdKtv z&qo47O@sF>@=|rN^SIjAtE-ReF~20i_hM?BR=-L8{*@4KF8FfYuDGZ1BCg^@hE_t3$8isY_Lz6 zI8nm?f4}bEq}S<+%+e^d;sC(@{+P)%fZg6~E{1j*%Hw`-f%v{Ii$1rmI+U=;d3myI zZi_GL(>3y1_02DkE_r~L=vhVu9I%nxuSr9cmcXMJ)e>oFAOYS~dTCxO*1H%?b@0?u z>SxokTk~Eiy`Q{Re4q5>yioCyv&HO}BLSR!Z;d8qZk#XP44)aZL}`la6!R zUH8_5&0b7%d^zP?dc%rOv8JbpA@diVYD$`9Qa2QFI^`>xmo z*pV(_sT)k@xy|GjyU;g&`0?1f=aj6K^_ZkPLAnn%Iyvbf+8Zdd)doTMJgDwH!C3=>ThLI4V1RV{s#Hxt6dAM|L z(CkW1D~Fou^lRYC1gi+;TDikN0kOn3UKKyjBvh8aDjmD}nM}3KZe)^hXm?mZ)C(kT zuN9|pc}Ma1To>)6i-6bQUd!9h?l90o624Bqfs5Dg0!+wge5MmG`N)HD>;3!Uv(LLM zyUD(kA-lWzOfXwt(BL!6ass=X_f5z3A9*6v*0rnw>omL^!*lBjdd3y7<%DfcOmVKn zt*E*$f7#D*%xb?rf1z{<058$AlqyRCWU9S0NFz!U;=23Aw92_USVfqA$2>kR-(j&ZVQPI_D%0y_QJ z2MF$^%e-NsACm$ez_-A;l7ccI07N;N;#cD`Goi8qd7z# zfM3H`Z3%wq>iN$fjm#_m@V@9*>kK{Xc;5t!Jk;+L*}zwRLj(|(&oVhxWK&bwtA3N0 z%%a*~igzJ&2>>tAvy?OtjIjc^Vn2F4cKe*~J=1_ZT3n;IDjD3a5ia{yZAuiyTr6q+zWv}`*VaQF{Uy64j zbO``2(X*H|l45|xe#&u@=QKxbBdGR58)1)3`ZZ?5G&0fF(%P=g$hBClup5Kb2gozD22WJvagIA?nk9B#&f|o- z3^ja9W!+qLHNk?DY-=#gHG`ZQ!fVTkg`DwqJ)~*49H#aNn{k9|v&~lQ>;Z3hh-D^2 zd6d5by!w>YBnf*ixE9c^c;G;6-46(U{k0j#GMGb=^n6@--vjZSPfureIKjQ@;!lvq zLouCcm{)!oE|2mIX;~)sD&n5{*z~1R2Lo{~fGz>xCHmilYV#?Sc#(!{NYf)m*)D}M z?~#@R;5h-4P{%b62*e4@JTH=3;1JSG@Qw$4d7&|Gc{&BkVoyYslcw2@ubFmkZXFQ_ftIn7pPea$9(= zsmRp~FPtg>bkLwq(0y~L!_&*i*(Vh$KQc`# zJq^`ys%B$8Ia`(^L2_#-49G`bQC0(?bU_Pcu@>(uq10$8qW~l{_}vf@Kp@pq($M{@ z@5%j2tfel_rp4GMmHYg3*x`xs$gvl)}b9Z$_xCd8rJTP%qhCXPCmw-Rpp$nH3J<+|8?vmXd9IkkY_z1KVz z-~KB{^S)Z5sizzdVF!=L4Bcx%&^&zbn0oW2sZjDw+WeNgt9tGN(0wXfkF?mcqYQcZ~_2$^Bc0L7Kl^DKnKH9qg;%cZZ@owVAHqI_FSEAT0T!BEirI* z7|e5!k2>&6v^;WK-ByggJV&XxER(HC!j!<1GAb(ZRD!@#l)eN#c|VQll2gYpG`Uh{ zn7MYW@Y78| z)FZ*4KrWWR^GjhlEx%quu@klxh%67q*s7+LGWQaPH8|x6U-09?UZ2iQGw0kHe;#L` z{?sY;B~!HaRtn}jz@NJ0)@PS^(wXkGs1DpC}0(gp=Ie#~Pba#B_E3b}|TYM%?n4ID4p6RN6Wzn=Ql?$kS zsZBzn1;;--c0-?UeWh9G26{JYW`9IX;89(aiu;DoP5~1iC$-MF#MUK1Y2ZNT5|o+ zA#7_T`A>gL&*mAV^o6WLWS~r3HsY*n8aX`qwYi$kuS;iB0pJ0un7_KO2ws z=JI6-HmDtRNpSTo-Ihh$6*F)WQ_p-^MOT|6j`rl3W)IM`@yYY>WYrh%uJ9_=dV4Nv zY~S&#c$El=_+@-xuma9jrn-L95LY050MWV-XpVvU&4tokE3WivL|LGc?@G*T&-M9I z$mIr09!&vQ!Kxq%$`+&xz!zSm^9kl$WN!J4CVPH}D*=}>W!my%OQt-zMwMh-KcG+?Vwn&dOnCQ;jB zjZQz?H;?2>2+Fz|4f67|i2O4R$}ca)4??~va~tw9;`Matd;qHL+vP5k7f4)LAbIOK zYnJ+54frbcJ15n3a!vy#pGHnv01;%U4mJTU->8z$Hj{z(WH5TQFZ|@~Fsz>Ve6CyV zSn#Xkv|FuQ@_x>CpM%t44FZc=E55@X;Z+k<`(U|wp9Uozy$`7^+toVR_k`&1bXbaXc z^{tJmbEK5B+*u~dn|cp$W?9c8|K-Tn(pUW0z z0XNkdCO;^nv8=+JWMPV{t8sI*EEGO%i4;z`r{>AveSt@!S0pSY7c?W;N$UGVccD6+ zr$Sbp{Q15)6;E;uP8p>;5BQ{K$aVQsLu^&MeTSrVhOJ!q9SEkEX;#PQBg>fIwY32v zAJszev+bNW0X%{PKA81s%hW8kdMei6Q!Vpy($~w@8D(zk;p#1rQ~HFqIb2;W)Vgu* zusUTL)~|(ua%h42EnPE><9xI{zvW?dvc8pJGe2rX!>YG}EOPX>($Dizt$Qnl^nT1k z$AK^yUqb3!FUBq?2v%J@DUa>>XcOvQ2Gb+>-HrSr8$qjBFs|DSWhU0g($vxpvQ=gL z4iX*KnCZ6SeWN?$ginW%mL8{8p;}ku6x75RH{_8zCCfJKPRWo+qj1QTuqV*>8 z+HjHKWyI(?yeE4DTTa@j8oG}*B8&B3~-28tW+zpv@qEfUgf?syHIE6C7*-$ z51yCmuWtErOHN{xDw8P*iiqhP4$4YAN%h&qdibs~iO)Q-gXajBmmv z-)4TDMuD5oQkhnyGs=G^B@Y_9QS8>B(45W6m-3T@=AWUE`PH*%=NfX7z1$x9Yv@!A$Vm+n9KGugrouUUDS)ZO4J|U9Aiv%Si(ATTYH4| zT$;3Gf{~M2y&)R$`9_R(=He@V;TCykdKF`g)guV7?$h@D|9Bs4Vj1WQl*}F+KPMoqK*7 zG>4l?IgHz^K4hQA=a8$;$sjd${L&LPXWVGEMS)fVgO$$JG&t@d+Sxjcubj8 zb)tC`MLA6gRsf*Y(ypnFQwv{m-}4sM!An7i3)!;E$2b6Cp~)0P5B)F z=#LIXe?2_ypCzAjv@jJd)4vty%>0*A6Ki)oXi>qhqG@|vwcSw9W z;IX=`20Uftxzt&=oKM*qM*!r{@icYDw6lwiOr5|RY0t-3|Jygm_|YlK3e@ZU(+D>J zwjBFb*U`5>`@1*BAN_3wPhjyqbHMbWL~0@&xHbMaTGp|@*Us_vN`g3fmh#nAg_ zqkmYA&%Xa+l3w0oJz`Y-*AGYIP1Wej zpBm-XV_zU!Yl`}laqQeK&eN3opo@>%wO}zHQFFWZ|dZ^V~Rk`MUV& z?|&d}{K(;q=T*yVdEDQfsHJH9R(6NicPs2vZq`z`ooT*{?Lm3at)Uqu?TBhh~E z>FCc9$NY)ka_oJf9Ir&RoCjqoHMaiv=hdfjpy1ND=(h1IA)<1gJxo6nXf25Limw=$ z#j&+$wh_`TL>NLT9-PAa!s|eiLkk+eTBD*C12N6z%oHlZ7XIYHt;Qzk- z&QY1RUOD~(5cHl8(AnGk6vCX++v~=#!pqm9J5F`3Jgc%pPLzSW3$##Md^g#1`0byZs~+j32>v3kW{#%X&@3fJy^AYS$QsdS{IV3w6uR-TS8t5}{O?~9-}TRT#cTfCy{Q+dOm1_Z9+ML%|Mt87YL?%g zfj}tuNyuF=tkKTVK0Fr>)JXe8L?S{OtOo6(8Q$l`Oz0$mk=R;s@wco!^Ir=|K^i3B;zsh;Iz(DP~W=@vF0MIS^d z(ih|`g-u0D6xq1?!DD%=byKouS|8`wHVh_sR>!7Pwgh#XG7gdd*T3`qvHj#h^ijve z`{bztUv&Vq`-R_rW!&=Nx%ie}{b=$=tjsfq4-!*a@%u0Ts(57cCfLNrNmm_Cup?gC z7r;C!x?%P9sQV^e$%PxaHi_=v57?acVp;1Um7WnEC1;WyF~K}bQc0%OSoeZY44hJE z{@6+oIg2OT+}vf)u@|okK0|qG5j6`EUitsMZb?`9d)uu+ybGblODTEZf7Fk<)cnp+5a}WV4p@#AMX`!GxILAT-eg!xta#~$nQa{ z#8*Y$Z&y0UXx7o~dfiYo--Gf$Y=flgF6IBUXb?bG;KTZK*@bKWx}(&|506Iczt2Sf zv<(jT4&1*YA>RujeH4Eie!i?hH}LP^0sb1w-kZbIcihRZ`J9_plK)d78)x6F>~x18 zE%H_H^FJ~kjW?c-#&nTaZLou+ECnHJsHT?Lx3GI>ghvsA5{A_&Bo_D7Q zDX&>R(@*^)fArw~uh>GkD!$`aK1!p(jqp{xcWelWa&N&gcN-Ha5Q%kZ|{6`cOzRXqE3$r_v=}S{AB33V@?2=cclR5 zqFP`+&*+i^V|!a};b#aLWLl%-cN_9JhBx-G60_WP@kG4z}Ty@?*nVc0n&D9WESSP%6%WmN49&|seDlV8f% zGGY(LHNF1T*oZ?v5BLxQ_J+NBjiw=OrPv^zQUXjN&(*vLaCLp#w!3dS+K&5+0O)z_ zOj~c`gnaeqKM}V)@>u3&NXb%Z-(^xwl#0Okkt{G@AF=U-J5LIn+k~ zB+9o;N0w7|^D%tK${Yum@|zx8=SCTDl01TV;*h1We_ zpBwB7=kSk@v|?lHPMnAz`q=v{9f98j9%bOMjuiK!mqJ8wM&O6+(k}UvyW?vo3u_nK-M zH->KdVA)GjgG%d?B2iEXymuvl^E?!dZfO70xSEgRYQlk@VLh{GOEV-u0bE6Nq{aPd zlrr4}pac>DWfe-$g}LSs#VjM4+(YI1?a`NwMROA6`^!_&JfQf9n*}QclwXCT>pPSl zfz^QY1r3+4RLXlMovEx=a_Kg}C;Vn_r$Nh#TyjX@WozkrbM76p(K?LV?)%VsWd^If zQs~U|2bE2#>g=3k1xuA)=KY%d5}`cT4(Hfc{Li^)&LMfrPPPSq2IHQc|7yl1o$pb$ z^rnf^9HU;pZ6bRA<1{5sKZCqf(B<;I*o1*l*n9-cR{aO)_P%iz{elC|S>qQ%=c}J2 zln!-5mL8NkZ+_=Q%-=m7&0X3=No3K;*bLb61yLHZ4IcXKjA?%94uES7V<%rf7Cjrp zPdedO4duuSb=IUoS3b_F4(gVq&Mod&_gITrpY<_8H^8wwx2`GG)BD!xd*hDI-n0{6 zdIIbK%%$wE$xFSg3!k2;`!axDt4HwvGZU}OZw05F!nI{w?D|$R)CSy_BN1jE+w|Ba zS;n-xZ=A+@;=B|&u;03?6TM^L4%hQVBvslqx!Y)8|L&4QMJ6gx2_o65+)gXMh70#1 zxJPEQA_XbQ^+Jgg9H)@jdY@pUS7KaSWLsui6mh?nMP0Dvq`)%{oaRIZ*4?~$Bo=PR zg?|Xo_rBR&23KqS>*lR>HR94G?-FeUk@K&OAGvdl>cB^ z{?T(xj`AzLCuP8^(0OlHhSm!WVsC`H`EaLd`MH;$b1g%7@^p6n43hP(a?3+>0fFxu zjrQ;Oa;1LOSMk+Xqt(-YGUc~jZdLNuAk$&E&BhrW$LP|AQrAkI4N^A97eMBhHiEz8 z__XzIe#$>KVy|C28jbhjl^?X6H5kJ)K;dvw@ld5ocdHT`&po$7g`^I8Y<>xT#z4lt zD7A@=+Ze9z&&H2We>l0)vm=7pRo)l!arg|ND<+|Bm3&Mq>yhxE+PB4h&2fO!^?)Vs zWZ(S|vaH()}vrF-^Jdrn}`hyK>-K8iR>)oSvBSI3vBMN;QXt7WuTbM4@_LJ09)b zcwG0*P&Vtt36Y^PE}7k(3mgMm#`^NIlrAua_U(9}??JJS;}w&u3Y|t)Ei-t!v^@W_ z$p%S-QZD56`pJkloy`4Wf)|$mlcDV9S`9r7ViG;ZRTiIRMP_$D;d=Q#mxDTyo($`k%u)@>Dh4b=_*ei~DSAkFW+nucy~n ziFSy593o1GhsfX2c{J|m?a%8Cm%Pz9SsTs+6u>jCHY#2yzXF7&spIgb##M25b0a#; z5p9WOsjZ;)1f{a4vqRd%5hL_CYrdR~mdfI6_+N{|^88UeO>FW*io8>%=aGBPX01Z$ z`JN)kRpX6NpG*4lRA`B3^GvEd znX?H!@u{3S_?e+5$+K>x?I~z+#pVjoSq^7+-4@xFRNPO{^Bl+Ze(Hqa2b$W2^+AJ8 zonHLCyY4PGlD3HC>-g)(CIz`B@yg7vkX1ZUOJz;|`BhiM+b`P=K$gLjOrvInrM|rvCf4jzr@S+x-AE zR+M9Mf`W1#Wab$lB~x@pJ*3{gVloy!jJK27S~pK!Kc5`nU*!2$@F;Ujb=Y*TBd1v|gXb zupXu2x}1|0{v1Ip!YOH;lg@Kpu&dutVJn&-rpz|4+GRUT~idHuhIku+?y>c@8pFsvk<_ZvTPM6u*$v78C%jfd(AibOCc!-hfGM1z55r&<5w28rkvC?N$``rZ;sb$yfb!0URe6oZ-D`4gA9F1GCXTEf5hEpvrBPr%xHU9OuG_wB!SDb#Zmi z@kWm2sq`w~_d0mnIU21`%trS#vRFVi`I1P5U*}(Vy4aLXgUuEN&lUf}@b(gn>IsbM zaXfU(KcEnnr92r>_RmM>n}yFO9RR=tmrTww8{ml(&8z5=Zy=6iDs=s9OB{dAi6C9a zXP6dW0xK`%+j}+2^R5#xt|?JhPeKN((x7ZtBGXrg(bXjxRU|m$WyC0TaxZ#JW!Cb} zDn&f!1L*9TEYiwxR|2s`Qg48jY$!Iiqj~#S^ge;1pYlHK+9E75oxmh-o`cu=TD?`> z(mo6xYrEVaD3&G?%%Dt8g#Fm)fw(4L)n)$5N5HKbY~q`ijdnhwhipnQ`mqN&{@khc z#47+OPg!!)t;(8wnof1R8fC{j<8eP}_WO<(c?|gZ`h79@#x>Dg>&lMJza*;VZMjwc zc~~kU-?PTt0$buKCEFiBOR2 zxU2lDP?mF5$|^`9m3?n8pGv^jA*2m-W$v4b{xpnI{+xWEV$M{~mFc|MpNHx^Y&l)j zkzVL5{M}Et%9&5w%&HX>00tGJ?46&-)u;j?;>ir5JUOd6n-*&+QPxcL!~v@9BhlN5p?~~TUMfRAC91So-<4et)?a<@ED$74 zPApJn8_awa7m2=*zU}vpoJJm%jha*?F7M4Xv!vz6*u5l-N)Gq`tr_;ULF~;&WfA!D zXNlqStun|SUG^M>XEmkD!}Ibhu9=?owb`-A4gaj4AP0j24ZnF?4S?miWSZkna=Qvy z&^o>w`OR|{$`c4L0c8#8Uo#SoInF+co6fe3e<2)O0vJqjBaM6qVda&akIsk7@?-gu z%c_h?B;B|UFLVeG<37jP0ASOyQc#eTNsjLg-1AHk@=|jemybq&BY=G0akK`;lS=EW z(k6ekOj1dx)F&aMRjE$La#nmS3U!jSZ^6U)s2-OBQ<#D!ExxXxw+<-lGeXuu=3`?3 zk1wSQ>=+>Wk-dsMeeq576N9p^#G$Be8jd)L>FssWqe1|egP?Ch;ObPxKPNpo z{ZmIucapsu&?EVxcU1tgT$cttSiz|tdXci2ZaKEgEBSPkD>}+KExOo=z#}mJzmttv z?}Sjs_IlYf?K&^h>QYas#~yLnEk$QcnRC}z0RIB1SDfurl6yplsSrBjZfE>yu zsTE^i^#)6t3t+i1LC1d;8+Pg<7<^|ehmb!j2mAetM8=t3?s8p^!jV&2q_|={8hdA= z|JYQ%a4}1!O$m7Nfq*k_E5mzz_BWsBkj~8WsRmQZO3N1`aIVGnW(;XzF8aR3Wt`am!hQ$1&}<)%T3b;P`SBASBVJm*ucgseHPtAy<3aTQW; zRhofwX9d$<>HK1l2NO1n!c!$I>TM*NC(()Hb}5KJTBU{MAQf7&jOD&(BFJA^+i89n z-%ffAyJy|2csE{Q@9Bjz^IIw8ga3%bvgU$$&Xp5fXPa*`-Z2vWeKe$A1N@2_pTGW1 zGt)a)An(DjJU!o(tP|%4gHk3|=?QddJD@zog;VO6d2nayLX`%)88V%+u_%El0N_`?!E;5KYqyc#Ooj8gEs2|ur!w(# zgzUX*EP0Pxgq72lRL&@#!Yyk!#wC9MFXDuYIdyquOra7_A#i`9zv+;M4q)HzuSt?e z*?F3QB+DXFlLv8Wu^P8;ipELKJw!J%uPXz$@}P&q0o81SFjzq=g+*DNGe|3)uLHGU z_y6{F(Rk!k^Z^`=J;$8b%OCcwmy#7fp0hljw-Q#ND(b2s+3?3aGjNuMt8vX_#KR|H zM+G)t&XxWO@m>3dyh;ks7!_~a@}sK)%awSfPtb#a&euJVtARJs*wdOh)?{JscZ; z?MXSN+ozs;KfCCAv0;x*AXCjW#RRYWIz0FDCB$BZuYQa4>F@99&&8`pT*l^|Pkxu} zpDW}&s|0v*8q7MaR2QD$dE-bl#%M71&gNOu$|9s(24z#OJ##^sk#jxUdottMdbKpK_@4T`iDDvgJPU-L?R` z9-%ph_R$@VL!IUT~X#L`4^)a0OEgKLxM)f(m zbEl{CvV|^%En)E))J$lVa29{dgV9XSmPO%ty1pjB*!s1iv3VrorVY`2?0EF|!&Al} z&SGJnW?1CoTtTY3QN*vMP!t!L*+`7Q+x+Nsy9JM1$> zU-(bp8%#5=c`j31k#e{S59}a%{8hs=m`;uWWW}~kgL}md;^{S(H>v|d#CdSbnmDwc z)Q{5W_nb*KEpDseBzqy~f59zydb(j5el!~Ee#X63=*$Aw`e|B=-DC~M!YDK+Fid=i z{cAQvf88)$OFX{g7>=&CT_)n^2a3Iq1bo~j3w)8NuE}P!rlke@Dqw%Q&<#S;dL>I>Yp#Dkymu`*5T?g}g4gs7u{R^$%)k!{z z?9l96sY@G;!+3!bhW=zG@-Bpy^o0F%zlwe_X4*Avh z4$?}tS)Z%xp(gY2v$X$s{a9>oyOCdur{n(X!Hc>1 zXnvl?e*p&uUh)Yrvhww7zE3dK^CD6!Mqa+m16)p)a3E-~wNUf8?E9C}u=er#;>OJp z9V-65!}(N4=_*lT;-rx&KU)yzJ%h^qa>9gReq?lg zQ+#MVvTI#F8T|t@$kBz{&wTxr+F>94(Tnp$TBkgvE+MJov(dkDZLYkC8N4d(g6nk` zbG14?>zdgPP+q0n&bQn?Je+Fe@)w_4F3+o1_hXOw#0l4Y)AWBmaV%N~X!X~RMDMb7 zI80Nt7vct8chV|0%6%7z56eTV0RWorlMPEdRU&#;9`e&*zkfXdvlS2P5xl-#x%$$p zl$UD>eC0S*p)QOEY*YB`tsY8#=L+e`xtxZBT!@Jfv(5nK#%((yhPfsv>tX5k%U^nj z@>O_SjhSo7Yz2I}p_nS$ofz`&6S==qye~>f9Vg(;^yTl^G`%;Cc_7X+8LT7g zZ}6NvaXw{cJ)XunxpsXtPGATfU!uVkuBV#S_nadbcct?sIMz2GC$Oil8}S)i$JvV3 zYUVY7=D0S|?E%Wun@?BcxQC~szlJof+yHMh9G%)m`L{9Vc2l@mp%uelfd?q#%Y&EC zrtD_OPzsAU8VT_mTh~Va#>*m3oQ}rl>B3D>`FV%G#MO=Qsf%)w+beI26Pc6g8aL5l zH8O!!g6X+|w|o_k20VhBfAcn4J1YC3Bhl!H{Q9JpfhtIEQ9jO>H?#YmY-4RgL+nRr72rdOjG=h?|XOKc?w1Ts1rtTYZNp z*G;-!2Z>q{4>`erUZEiPX1c(s`|ugZu+w?Eyw}o;oCTa`9CudtkgV4)BH;nP>>M5- z1zRB$?4BgH*BZdJ09`iUfft*SK=)SN5*rPpB(jMn;H01ohR7eUvzT^?teNV z;X)-~+ZY>)-ffpfO}u4csxXJs9W*)3`?C2ZkEblnHYheD(L9sDavlQ_XVRgpxPJ5a95Z?WJX;r9fVx=&Y zj@uM=eayZIEM8j@rbmU&SIF}zpz!OY3|m2&u4VJ_Lv+WFaz$Ru-+25a4-lt)rBOa{ zQk{AxNsrS^TN8lu4O=4a$Mf^CJLTdf8LGU$95>Bke*qYiXqa-{8lFO zoa-6rl}YcSh_x!mxx#tt?STmff*XE{GsTafw|NpHW(yd8 zQ7G*X*(e^L&C?P9C0T8p00?(X08s3owAYpeScSZP?vNjT>bsn!8HaHwzG<9pu!(!7 z-umQFj_si{I8nV;FW!1;8rJ5xT%I(^9?vv7cYHb;*I^^$t!UakP6Jsv@23-5F(d%O zqsO_Ulu&+zmJZe zLV{c^RJVo!J{xUX#OrB14xP@{x5&1RZ(h}Y=2;(qVS?432C^N))f+tozzE7I@3Z5d z5mq>LMp*IWQwS-?6e40_|BCg|dg3@&%DGZc1M!!K6;7QIRy_IS10BB7kY*$2F~9KH zxD00@vH3Krtrp?>lpUzu%X%D*`~rpUg$hD%AV zz;n5Gcl3^)%E8m}Sd79s4`oZaO2~>_B~(0>*9uu4^W_}MP`{o(w^!rZQ}NB+hs%A$ zE8i?RUwEde@ZqZY#wNPw$DGI_U-ZM*Lw?aI2f~qQZD<_&rr}bzUkLfEPO7J4-Q~#- z?@p;EGJp literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png new file mode 100644 index 0000000000000000000000000000000000000000..4959ca672279a92827a1e2a6ca7aa50b7e877e2a GIT binary patch literal 168816 zcmV)eK&HQmP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L|D{PpK~#8N?EMFn zW!HJ%iGDZVTcLAACji|DBn1LsM5aWM1i(xMk1{1nw#VaTdo0^;*4X1&T=sa)8_z7y zb9nQ{GZIC~_Q*k2qCkQ{6cY$$00a|q?wq^Q&F}yF?{lhdRaZh+S9b&MuY1=$VV@no z{O!HZK80-?exV<;pqTy6Kw%(9zmOdW3Wb4_9C`zpi@M*RQ(mE$9n1rB^JXw_J%)v@ zFANKpwGhm1Q>U;Y4%a>q{Zc8aoujd_b$=9lEw#NH-BLfwy<+s}xB6M^7L2b#lza~K z`x$;-c3%@rKQEXs?^##o)H6uG`Jgv&f4=gIbGYT@!x9Zx0lYB$5&!NQ|5)lbI3N67 z2E2U!cy+<^Bfn}2?Hc>IdBOBv0Ds`>x#17%s2ID)e`_X>@;^WP8#?I4p7GzE#j{Jn za`G0`sON`%T}M6D`@89)z|UrKHVA_>om)P+X?5bAo_OcuTsENha(S8W{`|0b`v>J~ zKA0QPMGeehVFCQ0rA_uT=1}I#LUyZ~D5I_1k}yub<)O#bM!2d3R3yw$AAN z**IH>4#s6x&T?pV?r?USmIE)ZO^fH9udHca5)S6AYd}s?&e{DK)W1CM+=W7EI?W3h zlq}JJJk1LOd6xt=7UMLX2Fe~xGmsziJAe7}JwKS151?iSnK_jEM`KI#Pt^9w=#)0a zk;dIZaU}|+V#xlAq{Z}9znmdE5vq@na0dbn5NQyW)4rwp0!ySMfg>r~U>baWzBE7$ z3-sKyG|;Za(&8{*n-&E4hx_y3b8Z=VDi%ebMbdoF45rJlx-cJ22GcYR_?<(OK{^d4 zz%rOA%>3Hfd^7tz$?wYr9$GlfCsTuIF3i^#bZcL!TadFa!`m-Q_h8v&kmd8+aX^BB zp7M~dpFcaNj|;)9`sPBW!}2;-2WaQ=+Bygews~GyJa3MJ!Ibk6`g}gUGYF6q9>OKc z)AaL7l&2CzoPmq;!Ql0U@+=z$h(`m?2CglXfc*D-K~CtoXBPpc(uMZ_Cr zgg+47s0rCJ#F8QmZL!yNKZ|``m#`oR5|^xm*^m?W++e=8lV-{tOfL^|yuX~ZGJvtC znR|d&iiNUMat#vioYl81`B*UD?;x+wmoCG_h52YQn1Gy~Im|jA;G22*hrC?V?{u2W zPx<-4Z-P0`W$EPs`4>w|K`9wosgkms{BpNq!`&}*rQWN$TUIl5Q#z-p<4jtlf28oU z5*7yGYYxoq;~*V?RQdwxW#eW(piT3og&}YAeCcf9+F)87&MI#XugwRuo*BRo`HQn| zE|PK>JT}a2z}zI5Th>`+7`Qgy_1Q3AS%Yb5piP76Zc7bOYELijiv=C*Mr^^2uBDS5+rTD;u(fV?P{loAc{ zbp9b%gbSuD(wPf$1^+C_a62F5&n^0V26;UTrOR;fVUP|B(Pcq75TDGxwlLoS9<>ro zmzC?afiz30t{8IJTPV?DMsn01)!i+kYiNd?421z*wb+rdvUa7X3JSp(d&3;}l*fI@ z`!d~ke&-$!CLT%8^={sMZsfcFE{D2g#>5- zTtAF70CU?$n%Affq`|u8OF7I}Ht8&YE(<_j-lEUXfx*1!CacmN2mGtYeBG# zrswCQcV7N{_kj6$elQI_zgSuf3hGBvL5g(yM8t)tbdk-H{uQIjv2;PP$F+X6CArov z>b`McJ(2pE9PhL1&r^cgI%;k@JO6B0=z6YG7fj~_JU5sYhrzZl*v@I-{$N@;q!tcz z`m9C_+?xw?8-Lcb87#NC%PsG0BoDT2?)efh*gvJ*V{w|NJ*6&2M#qu>hJs3kq@uSag}pnu>7+j$6iWB1Z#m*n)msa0U3>_ z+cSuZ93KPc^Wkhz+0B=x%U&SO2XmhX2J5)QZ6$KrVQq5FTh+bj(oApyl!fPg5fw>y(-RB-VkTXH^*rmmvpUHP&8cZ zMFssJ=>%Nn0{zyF>~{w8cFdP%fOapI7B6SPG@w`VG#5`x!(cnGZ#X4`*Ji`K?HEY2 zf%Ca(eweQ;5@VWKmIP;YTA2o6@Zp7Fut5bGqM0-ZgJmsVUP9aq@?Iw7M4Kx0nWR7@FpU>`h!r4q(K3KpP zf`R_J-Z^x(hn_ETnFlwy0vT+#^A6lwwEheR^UjwBVWDgJuTyl>wQObPd@!Atd`rM! z-ucpHxcD$ghvm>@7X1cRuP*1=`CyRu&pYI@m!-LK>V=*qhLc%qf*z{I!O92XWbJkt z;hW-A?M-pKc4zFbekjU?x*T&k#cC_V(n+7pv^yKf6AWI@j|Z>K4}*GOZki3$JvXfo z=HO|$a5l|(b}%gt3->XHLEOzvXM<}TEOeSt2Vn62(l9&E;Inhn{4f_GZsNS{%HgcC z=P>Qyy_G_bNK>T}-7=?A>cQX<)!wPt+P*J}GQyqenmAa0r*bsZIIM7j^1?PkK-|RmFD6=$MZ4lG=7(0<~-kY{<(l5TqLnbZLzda*@JzWd!ApL3-gt+6wEDmZn_MY z7Mu%B@@LYo`10kzBE0PDD}pH;nNFFWdpX8T>Cx@I6=SGle4=77sMZ16!2j;eKCSj!V2z%i)xZsJQ zXr@^>#+xklj>nePeY&8yth_l6SMP~#v2IV5_oJDsVNpcxd8QF0>Q0fT&*$`KZps;L zp>)#Pd@Ci_4emoyP%!R>v=1VIDFO<_S!-FVn zPiOetx8>Az-Cptm{7w9+lqq?h^?Cx`>+2e20E?jSRRc*zIp96lESd$EzNYg`HglZ$ zUUuK-@L)#A^gF{hOHr5m^YLt+D0`)l^I4weLdDn9o&ykkqO{ljTi<#lwl+Tz+b8}s z);1sZwaN0e<_X>%re($nIzqqLUS^CrXWs&T%c+V5Ko2+#LVj(jGy^$(W)cfY)dnvd zqm}ce#bFR%(|v>%Sz;kwo~G|D2zi}LrTHP}yTLRYQajak!@?!ag87k|!@`v<28(xO zNyw19Se?sj&;0Ee?9*UE2hL7hn@J2uZ)^UU1hOgPyV>sv^Ljx3o-mkaaRf%W9~E7Y zFfmL70}V9yta=w%9h?KtUxrH`3Mfy}8RZ8H_e8g@lx3j^NA%K&iWnhHZ-}nC*N=|4 zq#!;a2QQbX02v^LAz6z+9t?6xzpr-aMq5#yI9?Fm~}ypo|; zgN$^gGvJ+4uNbXTUHwe_Qt2P^+ZPzzM)yTK3*ZQy!tk>Vtu8rQ&+ggT)71+4M|!D~ zt&(0Wog466O0#w6Ov*!u`RmMe^!)m7cHRVo=Y#c3gZl4u&aiNM=ECf@m8{24m);y_ zDsNn>goLy~$O{`xi$mVfx#?v>hOk7Y8Ai#$225$;cFnCnPqShEX9t0MgXwIjc230h z$@^7$JKBW}akTM)=tybUz-B}*p$w!%3kBZWQ!K~)@I3umx;-;+*$7|yfD*(PXXi8) z(s0J#f{roF7~}EsUh&L3*jORx_5-$w@TD&y;D{*l6=i_Mo?J-uoRtgqlBi@kV zwgHlMk@@E6RSm4AX!D+{pij)!ZwnJd6v>eR93@*TJ>#lcgOgukw`WGV4&_Gd+kCXF&Jxo`z0)j3tR5G3vRVT`1-HXsNU? zm=JT)4A8f^X)t1@AG6cqFkgFSU7Op-mkm5Km=*@=%;|T!dQ*&5-oO(yWTB+LSz~84 zdQn(@gXV*21B)`52Qj&!ooj4n+LzZmH_gCcf99sMA;(3Y7KcJl-nkg1*gqMYCqFAg z+l&_P2@l;Xk8_v|Ru&lEz7z#Y*V{{YvDVoNV!nP}hF3N~cN8C#?UxkE>NgF+ZHfcK zKO4vEw`s3I*i<)1}z)-LINuMP% zW992~Eaw&jqJKnnylucRy`2={53wRjd^G@lCz50I1H;L^C;r?Tam%#&3G9zs4N05FQl~XCHP;!7L>!tbiVxDH{>QB;5D zq_f*Z(1PQs`WH+y&ke%7*D~8P%l^D97_2u>Gk`->G1?jZpjyKd494Cc)}sPx=i;MziI88FcPUczoLT3nB#v1Rh}GO%nBw<(U) z-yy*nO796v2r#@w2+_xrFY6danho={H}BJBc;!J+Jc1I1OLF7Dkm^L`%Glp{k7ALv z=KX5#P^@o%GqyDEkIl_b#n#Es#fIkBqtSawdbb~){<=6c^zN7_Un`|rj&@&B9vbRZ z56KzX)OtY1xEIH8R)o8*aDYS<-oo_|0JtmxV zqFLS&?b2r9pd6*n(b&-XPPBy-_9L)Eg2RtqH9lJAMH?IDUUkeH1xrD$dlpL5?>kej z%TCvG7`!%keSYBneCcc$EORg=fFI^d3C_-+VEP<>nlCLI$eU7MxNd`QIf?9E=28}F zzzn2^=l3+0fH{qxCd?c{%vb;H^Sr*nlwfWdB#do7gh5hoQ<^5?U|J^7{=s_Y=?5QR zz>pStDY`B7c~AILQU%TE6t~9V+B;;N<$bCwhJMnPl`S3Nxu*pX0BV1>#f}Rbt8#RdF1z`ZWPA?OtJ9n0`PcU>>+S+u6(c4;_{R&UX9Dazd=v2*H=_4~Z@dQJ{G z&^>RqFNG;?iCXtSTru$nQR|(6LE?Dr%~GP(0V#R)0tUoeED9f^oyTMA#Mgw8f^cw4 zOqQ>TZdo`g$w(PrL>$OS$wSw^^a_WP`i~O=ALRNB+d0yGTKXm#*R`D|rGeVQg`9hE zB|Tj3R2GXv(IZ62D}_O0oF^dHkNNp5$n`9Fa^0%L^_L5C_5NJQ z+mWZUfjS3Mf`#+X0opv6=7It)ri`GUr;XCpLEuuJmIu=v0%z8sou#FLJoD$9 zm-usFngJH5Z;-JDQx2dM^@?W+Lzj9|7%HaHV|Da>;{C4Q6FyY`NtIu>=ZUut_$B)V z%3Taz9)2#v#RP`=3W~}^^yrD;r%N|WAQky`reag`3sLMf#XVK?V6P-z!IATmQc_Zy zR-WRpQcT5$=9g8V6sh>=Wc@}z^Qs3K3=cCC1`DeF$6{0KK^+z2Smno~S-4sTT84;7 z8H=l^konKvTGpp?34>@!lafF<>UZJI&y*N|3CXUo^6JE+O z65sQ#ezp_3i>@i~3Bx5|P}j_t<^}O=uFvLshGdvyuzXMbm`;Ovmks1!_?f)Sg;KIb zv)i>8oK?o0wtGdo@Si(_DmkxUnHA-heZC}^Rrx&W?D|s5C)3Z)KNq;RNK!jcQU3Zz z)+Tm>DY6%{5Rt#HhjC;%IQPnmF#07iF@n1kWM$5UX$E6{596zAJ|-HbKGn-BN?V$r z(s5If&(=6xd8aZB>A9q2nX!Ud7lZ*uUMQKc%9p=0>T zGclnk%kM2_(*^mjLB?_^$bDWm&F{I_LGo)ofR>rhZ%hF)^zOR&1#1zsw|I~{G(hPvc!89|Ki6cW93#IvCx{oR( z=`8Uq{Gv8lCuRAT4LKnO6R_4Y8+XRZ+Kq|780PX^zZ5;VlLA``ScS@* z8}Iuz<%H2XdbFnVL(?CAg*Hd(_r!SVO0_$2J#8N^T^C2H_hvLzZt==!`-l1!E#)*! z6}S7&s~Nx-o7v>L#4C42XWo7Fh=6EutoD|eDqkz!V6hQ%?P*BbMrH|M^r5GGXa+_r zpi{`1!>F0YUC~>2I4%)!s(ec2yS$eK^yP#}*0WaG2sbNN#nH;0mW84A&u9aF9d*h(_sMeYb39Nr|FU-Xk(d|V~mtR)%k() zQke-Cv(uotAFOLOQ1;p7&!2Y&7HZK9U=RjUZfNHk+p{a8=)sg=sRqp;BTp|6D)x9& z9ST$wX|9baCED&`8x;w2TENr?lyu6k{%~`Z0p?&hdTZxXYLjX&Zis_J_vpCl;pzn; zr@>MnLyGaCukM%n+ALokFEoDI(bS8>zoPV0x^|UtAfZzJG$V;InN8D65poPbJB(jG z%E5cpYun$@L01a+mY8IRAb~wkjIRVT9|>3t;0W-1rt&(`W|Izkv8MY_Y?}P@sP> zCC3Uks;m(mGmj=r(+)qq4EhKVYP?`*kAh$>x8IvmALJ;A21F~Z!basR#c1b|*fMp0 ztm`~11HxY8>*Qd_xJW62gHpdG7xI`Gs}rsAx>Uid8fMfeIQLW!+%EhLx1Uoa{8b^i z5=ZNIcqb?iKMSWe)ZL{=xL7SM;;7726C0&?Kt!~GW+a>_+Ti!D#c$A!xxM8&$*T*D z4$ud9sbpR|RJ~0GwH)>K6S1NFb;%6V7733@C-&?V`e_9ya5H)eJ>sq-Yd)3}q5>~w zq79Z&a6M0|@K1q7ZY)vh^aGG9=HG<@9L$$yfb#NW8Jv@n4j4=ca+{PN=P;8a2bgIv z3G#>MrWqjL+>~J9X9j`md0GMn+BV~t%p?Y#Ix!lD8$S`xjsB`4hM$c?^$*5#3?Vk| z67i%s1zwaOg4tt|DDfAjTWv57lxnS$9*$-XuM?Z&u#9l8JZA`T4s$Ihb?6ob#|Ek^ zWxZE8xHAf+Q7ID%n{d>NVO_h+Mi@MLpCw6JdxmV6EO>ZH{q$%C+Cd5s#%Eq-ee;Jg z(t1wkwK!V6J*E^1GmlEQaJtg`+2UZn&@=7+HY=%-*7sw5>!GN3UX0BXpOO++eX6)w z-X`4f{%PBh1RO;4wG`kGFci+lEB(GAYeAtmX{AnmKr;Lt8|HPb??$D&Kh`xLidyHC z_?I;WL&~N8ppY;SYLh?o0X|;sKx89u--R#eiZW!IS9pTq=nc)U7#ByYZoiJaWW*5v(RnrKnZu0`CV=)EXEpa zI8_I&y9}!g!Zox6kOu(cVI`|y48^D-;q;19B~H}eW+P(f%QRXXh_8T>qDad0C(i-^i2L%!^H$l6iy0nRqU)&Q%}ttvb;W z5kqls=tFTr5%cNFO)*}0bDXT-ssQHw!b;VS=3Ikwu@hQv@SLINq{(x6$HYlyGkals zk|pzl(xCoann#Sq1yddg&#Gq@P<~d2Zk5&!zv-jtEW!K_%v3NJ1}mEV?BFwlX>piU z9tg>v$*<+Ym&2_5N(?`?iksDHJ&UH4;1LnBz>48Syr6bzC>p(IbsaKEfl7iQgNHVj z(Z&^l+Jq9vICdq_)o8|0_pul+ZB`M_kYCzJ)vV7Ub2#eZaSv*%w;vy&u-MC zRoWU;r9Fy#PAZB#6Xl-zDIQrIq>hxORotOSbbYkt7*+d+^lT?iRPIoje0ioDYg&(p zbEbqtwM7kq_u#dqz{6{m@4kcP|F-K zSr};;j&7+Y-g-fJNW6Zr(oz6bc?FcwDUUSy8gxOwLC={o<|{Alx39XKGo@7O@&IZi z>}AQPsieU^oUXlzY%YBcaA`0l$RD1YW*}8Ola>!IOX?>XTtOya^Vc&Q<{IS5(pBOa z2}YmDg|hWm5oMa&N%^OgCn;_+D6-LYhM+IR5E3=yMxes$18NWRc-tpFCnbN}ZC)%5 zVtBrkq({Oh%F}m-JgrUii?_}&4hyv~1hht1{0z@duxdDcOHnL&f^xk6XmSVeBfZ z>7MjL8iqfS3syciW20Q@a#S%euX;!ZHy@0I58wgwLAJ;WJ;J9yhuTlarl~KRrpGI{ z3b)HxNCaOwD$Hb#@^!GL{X`76e?Z}JwEQ+XL|13JDd{ZajoH(S4sI_vYWoykOCvPw zw3qZ8jvm+Hw`#9yBf%)oSe11X$}64dxpQ6js&oC0mG@b`(4QAG4Z@&($dhNPp-G{w z-=xpHwnlyRG|vL%<=^&ICKlIRT}N!G z-}wk|J^^NioGAB}BX6}rb)rlV^yJN-J2=9U?7(xZ?0#wZFR9KUe=Bsf{cYpsRQXMc zzSim5L~NP-k8Y2n|2ed{6v4wgbWn>TGc#peTH%SOyt*9RL*PZg^cSIN zZ9j(MrJw8YSA!LbGzW?f%f`la-s}ROKeMr5IOC z{yXtilWNWxc-@J*c8z`9ZO!{QA8*ia)>fc9c8~woOdjQbe)uf-p3czZ*J`#`#s|oFh6CyKtA-v zQSrlA9aMAkCgT^UQ*3sHeDw_I98()yLru(48Qms_m z+;-zAW31_8lo~=PdSILe`Z{0ApQrBpy<6x(qO6sI6{7KlV5#lq5h+|9=gJcApY{@= z5(%?mJqqMlL<3w*kn@%0Vi zCv|RF$~UJ!QAnXM6(g-DUB;Q>_0cM<_c6sVDzZTe{)&l@#U2^M-AcS>Q^LR+*Q{yS zDC7HD_o31Gk)K%-)VIMovAnP8-DjN|w;Uv+=3I7mbbo-hb|G{V-i6PVDdkyZK&Bo2 ztMX}Gp=+sTc!IS6>AKt7p{)trysZE9DPchUbzk-4zRM-o4fB%?yRK*W#;mi-dZhWd zjWo{LcSw7xmhfbG zY8w|GJ#;zXS7j`7gy&)c?QWIV#PRAogLmewf~2=f-9#63Sjvclj-pI`vOIt*_-TtA zX6AufF;%)Uj#b|zp<9#k^iRje*0-YGeOAq=Dk9@`sN@J(cnuOzDU+ODGm3d}emI-H z$@#(XSO8$YRRnwYSrfo1%Cw?B9j?ADCd<4Z-1B_+XiJfcju95x3_pMeM-|gV6ou69 z#8buCsp!bBZmj@}1J!}dQ4Na*_cuNuUaUz;oQSPcpVHMawLyaHVT?or^7FoUax&nZ zs=u(+l4HeQ;#W-ksq&mQ4HpADCM?RyI+@CrF=cV1u0OYi2)M6^_G7{Y^P8+bO|Pcd zIS~eU9g1OoN-%DO<2`3S?sJ3iwptPJ%Yp&=!F5FSzAO(FDNOWEePrYeOzb(W$e+lN z^#b%d=Xdcf*Zt)wT{~92E5^#{RX2vYhr3TJzf7>AE${IynKp*HY@I2d@zluq!^46R zuzs%^`!_N|P3d%;{9?S=_^=lh?$LE*B5h1W>o``s)GUI76O}u?$Sgt9TL2hnw4aU5 z?Y~%c`CTdWOZC`ae{Xd4TkVcZp6(OgTOwaY{cXFiX(hW3z>oTE8IT@S#uf8w&Mz(p z{>zUu@IqS25o;ve7W_aCV44IJFqjqwDs!@U4lwHgvi4~lcX!M?o zofCf;JI8-7B^`5(d*mUnSrVN1Rho=()S#TUe$_^d;_??s(3*ab95JhZj`}bROBjdq z0p?}>qXD$L%;<;yZE1Zm8r>hMeI?Hao~d5#_H-nSD6}y0#}z4wO|7r#xGN>OIbN)PP`|sK*D?t|VJO_NM4PF~w%9-N(;n5ZLoxM$cxlp9 zTnfBBBXksw@@+1YLN3QxWv`Tj_&~;o)v+jPIKk^D)Mg%qKkUJ0Wf(8U6NBmuU0&Ld zo{E%B!?WR^p3=) z?$>oG$@e9ldJ}Spz7S=;7#8cj?|!$;Jol980wm*`C3qxlOB%Y^9)GVrl!w>)#y2j&IOh$AbM ztRLqLIZhBXk=qM#aC)Ah@_z;aTzLVwatthun-Y)}v*!@Ehb=AJq=h-kff?6q177Jil9K!q> z+oYc6i%8}XK2O>8iss?&vufWda*M8|XcyM2?Ym`ox2tC;^g?WEDw^*;87FrT1eaF*=LHswfK|sX;T+jV1cLx&`ef&8BH>KUF*?>}b7lg#=>`26Y*(LDUHNJ{f>nPN~m9!3=o zcwOT{%n<^f)3!oU)p!DG7ky;m+ve7TQCB3~FO}kO?QNohOa^$*ai1e8Kjz1O&kuNR zP)fior(<}pQ)tIf``Nf+@;-{J#F5&)aj5YQ8Hl&WRB5Y6P!zAq zf%s$$b$%3WMek*mQ|c^ZFKFtNoH8K9@SE-L#!P(Kq@?U+FV_2M6E+oPZl}1g@;xggf(*pO;K1 zYT7vYz;qt`lvfTw(*uR1*X?LAfxCcJu{^Ktebo& z)=xbgYsHrs4AWUSK%6e=gbtUUs`Zb@c0L2E$d@nB9jV>zVQFMt8dv|icFNIrX+427 zL57o+z@RS7A-9d@A@HqMGBxHcPhrA*sDX<)xR5!9cCgS_EI=iJy?azEj3pt-`)c=6iSFac7J{$fB!#~cfM%=`?bySk zUl>2Jr3^hrkd%&Lf+Sev<(c%X`oZD^(;b232c}Nf2AOHTlpq;jUqbc|3Yk^b+%GB7PU zgeR-FsE|?&$pCF=e;IU{Kd9F`Y#Dzo;i>I=yl2V0=6K;+x37>1Pg3@mHl)$6miy$< z2KCWSkxuD5H~<&m1l)ila0SkcyNt!*C*GY$ei<H~gJ6q{-;^{L)Ow3sNr#xh~qRJ)R)PRG!Zc5=)sT)w6&Owo8xXg$Y$Mh-6Jgkz*` zsjc#P6!~r+|CIWR5niW=_+IgCP5tK0`*KvkQ*P53>0uh`Ji=_9m;*XAO-t};$90jAZ=bF+G@Dce!kHAb?kF)L0AJ+iOM~avRY$5*eG;-AAqm&To|O0s@w*fhs2_Ur zqvYOTluZSE{NzY@a{`@@w7+ZG6Wb*k(LN=Z#E>?d;3}I_tQ72!(Ha~hdB9YIQ$%RR zYpk@h(mSch_9@l(s5iJ++kQw9+V|AfN0pw9I-77nSC!$Rc0KQJ!CGn3(uKk64@3i| zB*u$-746+FnpFJG^v3oBE&^99kMi))87}wq6zx>;a7s%NBEzpJ>P^irtIfystPGm- ztlmZ(FAHdk+B%DVx<>E2tWD4{&M|X`zU&_dyZSgNGEHwv=&@c>uB1G+`W1$1<)MJPh=VN7%zRIKWYyd@C9rFn= z=7^vGLn4Q3^2SOfFM8P8yg$kvwo_DF5`|U-sR$TLK>Z^0wDtfvM>sjxFKQdS__B_= zQqpZHpjKQVVMLHq#0GO`r7i*z0`q{(8#q?^DCUy9&{7F>7Uhwx4FQ8x$2#<^;jDQ>PHa&+p{;`C|6@XW1_j17przv_Rhy?$v zMok}Gr+SpDAeTAXBOtFg7tsCuUCx}A%V{4@7K@G8HBLhBsE<(rwr6Ft5)5ob_)Cg8 z)lDP^Zn%43n1JYjS*^O1!K`7`jYRVonS2#63M%yX}I!C+uP5%-~QjI8JlG5nCo6h(`Z0 z-4VUSBk=W!Dv|j$I_|{AiEqY8??);HGXy{4q!QigVYL&d4vXM{jf`J?UB{RD95D3t z%4YS6=6je|eA_Cnjf3@jbh{Dd_R-kd`i$t7=7jS;otOT>b2;QZHWwVwKq^JR>xXao zs7PsVuYN%8L*8RBPDYcm?1{qjh!7LzyRo$isB{gfDGfOsnaYESH!wPUb7Bp|=$oGEuY z6OGlv@yfMvT2UgO%p)3TDjJw7ZBg3p?GqPDEv2a}`MgN}tua;J9uwtjW2pO_c&%yC zC#v$h(I!LQf|UUa+EQ7w>6p5$>$-=+Jym_9&WX?-o;DC^^dZ9!;D-hysM*n+1y))7 z6vkW6+fZ>O|5ZEE@Es*fA?9`Y9)55F&itDRZBC|HK>KKa-cDumvCjehBBLrIMf_ZX zr_?SvRVl*h2YVx*sNX8Qmt}mPh|R69stk;I*2*sPVd**gMOAjHbZxAf=8M(!^x=c{ z*Q6KV81mt~q;_4h5wO~n@HYdxV&}*76AnBj?JpY*Oyw@#cA)Q3Ka9SfMVt&cFX({e#8@`_m4xSw z+y8lgr2Dk0NuIRl`%sQ*1x%H{Cr6_?BC%gdxP)QJ2pAlz3%kaDTYVLQK&&WEB!Tz4 z(uEQ(PdKvzlW-yyrz*SS1S>3c52dwf>T9~CXrsR_jtsp|Lcu=1M`H8j{T8B&3HBVN zjZX44l#+~;A|lUSF-{^LNQ!x3SeQN2bH!dq3jecFYadI55Ka`A>PJE&;Rk1{4yt!q z5n4vW!3c^7o0Z@w2}W}%!`oki8WY>s;hL-_zB-ak_km z6n6TM{T3PDw1tG^9NAaLx@FN@UH2|yI2m+S7sjL%k5})q4yY@#+tPec<%?#@1K-#Q zA@6eWyV@`h{gwjcm+w1+H9l>6Sdl)Px0E`CSkw7RtZ6-EU9r%6!r+W(k}r_)8BnGM zHnhJG!|i9x=PT8p)aQ9+)kFW#S8S}|h*gpMiLxShe-FDC>zWV5`ljlgX1QMWnMU2$ zS^hpe_bWpS5Q4U5Re?Jze^7MTH#Ixi~7`tPPZ@`2O5fm3uWn`)3K#}ztr2LoSB4A_}EhuUr@`^F3iuZ63loQX7!@99Vbcw+D0#cO9#~MZZ^lr@vl=TGM$_Suw)Oq)K?3LH>}E znoe6(^7$G*Sxs2V0Ovhm=#hzc2$i}86R<*ZWdZ^by~;J`dYD4^Bcg=)fkx*@Y;20~ zx`z=yICQVB)^&>4wF(UWvH(^UTA)6>lQA;_ZXPiEEDSk*7Xpeb^;)s1^~tES_jOM! zDrWU-6T*L@!zzRNbgl+i>dy+R;6+^V$HTe0ceHV5Ocbv%{wxSt<(lUlR?Pv z;g!~cleJsLr~AyqOwR${xle6rbe~X=^5unbsIt>a=2XY@G=u9*Jjm;Oe0lER@ZIh) zb!?mZT=ct>>YxlR@=5;eS)9s>bQEtYESGj3H4-qikMoc_ua@-tM7}3={WGe0LbL(DFw4bENnr=VYR1hBullu=@m&r$A{3(^mY3U! zhH!);0r@yWD2PiNP(*$Or!Rq&pxE%L?Vd-Ld@wibh_}xW6vMhW7Rht=T-pT!+Ua3Z zCFbJC*bPmFgb0Vo*TxqkqBi4Xlb^Xt^1BZ*zFy!ZI3we8tj@EAXtbVi|VDX2e1wF!N z>Y!~^LIS;~9Tcw1fU!`A(In3Oc{u&9$`IZlWNkJb^vk=fEuz=T?LvD$hMP~u=JwZw z?_^+jEsI4&cEXsoSWZ7HWUx~ueRPPz>DM@3I-416)$5(0u z?0H(~rGBs)xB}f!oHA}lDvE?_iq1MRV(kZ_+Iu`I9Y#Jf`Ot6Dl~VK200paOpCA2o zXY4>=3y?>^FAe{K@-$-0cRDYN^h#Um+dkSWtWhV|$AmngYJVas3d^l#JULB73_(?f zsWZ^QOAwY^gr&YfBR=nTy2^KV`I^j)UNpk9r+mJW^hSBeuUENml=sOudf(*l@^(rM zG1Q9^=&`89ffz4cCFML4O)=MS7w;O}@)e&s40@q~cIZEgrdR;s6GlR0CQ}<1ho!h9 ztq|958F6li%SNNY#t$WgoboRKf2kkKS|sHDp8XmUstz7s3VOM?9&P~7P`&OOvs*#Lu>#K@X!96`ns`lmW$ujh6U)i7}!bjR8$rL zNok`0c$ICW`;wIMXmpC3Z4@fKW|Rwu$)&u=EzT;ZGLb$2zj9`!UkG4^71jCjN&qss zTeOdV)QdBu8$B6Iev|?F4|kuF43DVInbgQX09~D|~z9Qdyx6uvY7h z$>1E9u1}FL#;m8j@C5v8!Ci3=czz(+NQ$3KtG;;dE&8F((~9DcxSeN8`y@|0l&!xc z4Q&8jHa{Gz)%s0Wa4PhpKfH!lD4dZ@JRjrLYpkEA3Oi${_pGup2TTsNEprU)L}$2O z9FiMOPWijejkBBbMsr#X#G&OU&!4!^<^)r;IX6CH+wi5CQ6=ym`SC1 zhog%eot+o(u(~iK%I05n!MjK=V(IbB5rWfKJb6w3D4J#3St{1pI1 z9HOh*+(X$4XO&_j_SfDU$E!b~s8P;c~FkBGF%mX84<}IUqxUjk_A_I-4lgt z6#3q2-tv3Cih>-?iMB*YP!q2n8_HhTUTo>BY0md}^;U^VU&idocTqm|-KMkzK;eKkf}kE;zuIa9a9Wa%~Pn`BSV(_Er3 zUPGhQqjI*U%KKDk)%l@wivMQHUNKNko`6i>&==BB?}xrOR(nGnsDB{#*FO}e8#k%` zw!f22-D@ zF%8r5i*I#lE6L?Vz(iqu?Pa9(kUaEc|3Yd_b-e8t+aCaL6xt|+%Dw>nrFzdb0>;BefXjSiRCr<4 zM347I%eO?cCVZh}**(h2Rw}n#m-k*5kG*6CzS`hdjifmFQqQs4tpsz9d>Jz3Jzrk4 z!C^q5dRW{FNlqzpLHpDDpr8JS5#aC(MCb1H-V#M4F%81wYvihHtnLGOS~{Hg?iG}<SP74Zt7gllx2<0MV=L}u92Q05|(c7O{zD? z^lXasM*7c2i^!f)(8?}F#s}Od=$~FoLRLAZXDbED$WsRNfp#lZ`iCS@JEN_Lv@6F| zalE=fA7%X1uaVAUJfNifK>lo2o=2HxT@z1=w^Q3?P>XCYnjA+)Hjvj!OnK+Isp3`9 zEw7PNbw!K_XDm?6`wdm0zl&W2pbL31{oeejTZ(37dmOF&gzl;R-j?{wF0%((0IEP$ zzpvc#H$)~Dj<80v5J%+o5-L;i=BY2)TFW1Ffy~``8#*^CdA<3Vdm5w^vCa#T&K>+= zZ8agIr;qy#n|T{V2$_IytRh{kTZJG*t_aIgWBkhlFq=C^fxzW8eqQ2RQijf%$KFA?TF z-^ct7W9BpSxnA=pStY}k5uN9+wy+2$z31Eaf~yVf2X!|sj!WCO&dAV$uw49}1HhN( z<%9eyfE<_X{X9{x#7>nR{P_M9BaOks0;eI)0vooX{ZyWHG0UMgbsFGY%1zm@0@A0SuAL>}!{+i3AZsy@tBnyVxiqa&wYRD#e zy9}|YHF1YeAor#i-q&N`HmEHdmV zAysq5Tt#`X&&v~1W*wL8Fc1x>N9RE~T0vw)b@}qIU=dbPZl9EpcG`-Fw#Gpw|4R}Q z2`%5O>~|+r|Al4t`2cL#`0@)*OnJFxI$k+;UirXWD$0$|1EPfUq2=7zCc#eNa~}wc z@}4imD@Ztzhb!;(TE0f}2j1Tpz_|v9iWnJ#Cuu9~;tn#-{I!j*WWU~iObUnvS7};= z#Z^Rc7aNij11?j4&^@v=)?~esoLxQ&iviFUXJDxNSd6s373(_> z`wfySramWM>Zn&OAFkgm`Kv)?^_D3`QA8)b!UB6J(5Hp^m0kD#;Ki}n()^TkvUGH5 zgB+53guR+&177lo!V=(xh~QmWJB3Ygfc>XS72)`#zp_>Ar?*PLeTi=Y?Ah|SRBZAf zFcw{Pf+4Kqbw19_3OX^`)B`cnebUM%eTFN|8=;QB`93Efk#)n>msAm!+On5^dxEM6hzfe0u%Am4TnXco7Kf!?9I zM?{pvBKW73d&-P=DFDqt08X+%t^9_Bqa0wsY{cVSfu}RH7+!G^upq~g=iNl-s>*qK z=-0(_(q!2RZyZ0$PdrtKt0sOIRk-SOrg*m5q``cajt%Dfh4c{&zvE7{h{007Xg}>? zXpQ$=8KGfa1jcvK_k5Rv<>L1ofG7mxi=6rx{92;{YAfv(Ak)plHU2mPNZHW&a*Q^g zp3Tqa0BOE8;iAxIZ}W1zF#KVN96RSm*wi%-|EwlJe@Cs1!0`*6rHG&bi>uhD{`pbf z6zQZ7^y_+BxC9>iqT5Hzzh_0jSzj&$xIJcJX z53kbcKD)R1J!io}?NlF(=jY<7^v`T)MCyruQ$dUi57JL(ssXNTlS6iom6P;r3IeZ{j4SE~1LU3(3)w>3i(L;c5el%2ZNYl5D48xjgzt z@cm2Mbe|!-ZgE{4FTcqO`%-_;m)0Xw7+(NhO*~3Ue+!CQc+Zm8a6~X0Uq+yk7GF6e zT(W4hY8--VaDJYOUlBkrJ62Ns%t7+iD(_1mCC8kqN9SlKba$%-yppE#nJ^*$z3{+B zM7*nv^ps^-`E)8W#)|&vj(fMjN>}<@M)J^*bSEQHtYx5|lFUUxeS}8z&OH>K47#4| zo&qu5uN05?Q=h%UL`)QS$AOXGi02xAIi8c_f-|*PdPxq-+LX+%T^Grsa7=xmLh7y5MY$q^@VR;La*bsx25?5k;$v<mFCs_qix_d(kScH!*l6$D6uehD#b4<-x4-i%vjM zpu9GAzA5MGxQ}sO94Set*=c7@_vLs|?hW-zk;6utN|se$hew%kh|G45tD;gyB(-bpK3cPw?>p`tF^c z+D{lC(+YP501m+=IHi2rLfOW->b}^JTmgY~P{sqaO~@(Bk%ESH6yO1Ad}ozG;C*mA zTNfGn!f8c%5PHI={^$k!D$4_e7t6g#PuZ0ijxLPGk;XmhF|QO6@Q`^KG$2o&Z<;5# zR!;bm+}8M%;l$@uAD`ibca)Y{HXoniJ^L#AJSZ3}_9tBr#&PG}5Kr#o};AkAc}O?X9W zC&v&I!O4gJKyn&JXGlT;H00OAB`$VGHjA1(z4>tchbXeX6O7Ud#AzH6b5{gV(KS1s%R=D{sMV*14xfh;H@k{Ka8)q#v6m zzbR_VsEJQW=o>cK;DBc@3HoP7m;NC~IJoqKjT11wY_WK}c8BG9Q|s$7+GY_ck-i?4 zBe7C29)wG93Q%{hSEh$RFCuvA3kDQszz>cVy4wzlbfQNrnJdo(+&n>)nFS=50{E+N z(xHh@6%m)a($x$@t9?YgicGgjcb0o6MOy_hL+q-@R=$Z2i^4oM3fx%7IVlScsPI;f zBdX`$#_q9?IqjPG9sPcM@ih6{%J*BbXZ-((9b@-dU!Wv#63YFaw{z{5Hp=);#FpkK zb^WUE^oKjoh*|%_%C`(ti-`6pP`@ykj*rxC_1A3h`uIE-tD}=ZWAPI)y-YhhzL;Py zCRcd!>^!`nb6C?JtlEi#k*`WMyV^LaH;#tS9W0=#HyE zN6Ys_ubSS?O9t=aLEihky#TA^d3hiFtQ077kV9T+bHE6z6+wPqP?2J9d*p-oqZcoz zY~~4fP5id#FPidekIG5t$Vq@_X+y%Z+OGz3oEFe3Uw-ik*Z@JGT0M4pVkLqI&7G#8dopIKaE*!+gK)b)Z$@vXm| z486{S@dbwz9axvoTiU z7sKm1kQYXX+SYp>1X7;m7+<6v87eEU)q&{1LNZ30$4b{qAM|2F^V@RTk19c-tG|V2 zP!0VU?K~ZP8HphYK24T{4#UCmtK&W4%di|^6ZhB0sp{)R!>TC9YEMxZp~&cY?tpQ} zu*0l;b>~2An`AYkI7And!9RDvVdOnXlS?Mjn`s2F20 z+I&*1r)#}zo@XT>WdYMqk3^_ENAkJ`C({oUMtW7J=T|X!&7orc%tk13$P~}ZQJ_@& zlFFw3D<(fC-p>S0^5k}%2PL!=ET&*{pq)i2&+*t7#~N=Fo_gM}gHOJB@s9DNQnKga zi-bLuh0-fX(F$+mNfEa6h4cq>WGl`wId8mxaOL>F)l+&>^)H8y3coazZ^q78DBXQd?m=Q z->42EV4SPV1~|b=3^3qfT!Eci;WN(%f8#)z&(Zd}k*~VvK2re2^DqkG5n9z?1FzQF z5fq;ssNNl28DaR%a?f428~IN>w%R~F#ctJ+t^*C}8s58R^OKFOFQk!~%-Qd<3Yw1` zR|_YdL3d)Ta#b9y{)C#YOkh?(7Z{yo*p%UDztEj6%<}ufrG37qYK$D9t+F6cZhXzev)s+{J-PHfGFKE<2nHMbRm z1P(5<;BlNO3xqTz7RYTY0ui^)duo-ExO zW96I0M#b3FdO*+0u~*-5+^w(~Wsq@XehsI{hEZjL`L^mBs+Qxgz45yEKkm8N(7^;D)aJqRuWR3&?uW=4Zn4B`chFS1=$c`UvIdUD>jwmuV;&fsoj z%2}GyGvWz`*>z>L6a1Dogu%fSuj>LUqA|XV7Go#j$6oM-r+cEXbIae9?9{yL$5d&p z5QkFg`FoNW+T3#o5Fv)9%*YsD3GWyms@Ca-DG7ig;nYp>zw-LmJ5uqgQZnEdA_BM! z=MEMyr^;bo~2ApZ9Z&#F;F5 z20EZ)JSroD{nF4cJ5bm?@jJf99k&^J(^#E567l00{PReFrTAm1`xgmTGz6^+;G28- zVy`5_N#@vJ0m?#GFQifyJuNB-bbqDzPoo&Lkb1-m=0Ti5hNG!D&%=>uueK$gV`s3M z+B_iNs{kG01hjbSR?bMT$Xqq;OB-AP?a~GtU++_ahvLcXNkzildk>So1ZF_!D^_#zwdT`rT3SAim>MQiBHc+1LROc)MmjL^F zrd39Byt3DQA8mhEvj0c1ZQ{>jZTAt=pG_>l1^6)^pv*X-7g8#@KCtnXLhC9rJzTvl zCac%Uz87qKd9#Ailw=GOT_^|RE6nR25w@O}13;Afx@{ZcpZ?^{aqapwad2`xKJlYN z(UDPx2YE#@jZVNRI5f}=eqrIF58ON)N9KHSeiCHHSLdt^z?ff#l>xLzAHdheuH7op z93vx#SNLbOIp~K@3|4TBXBav0DAWqU>p5_&MRP`8()W59eH9OgpQ$`KXNhOvyA%|1 zk0V;VdZ{ekQ(=Urz=AhniMMT3FIrA5h-P`6jc-KV8;TSQ9o@hjTE^IRDOJN){4C)_FBi?GElbnl{gM=SNQ)Fp7|(8XO%|P9;wGt%!X(@5ZL~1L^f2jJ6^m zhWuSz7WGmWFLn4BzUr0Zp1qsn|NYK4#88!C%VOO3=u0uyo`^DAXp%=oz?ZZU9>Sr? zqY3Cqo7rX&p5i)lz8Hku_`-I{fM1650q6x5(Xsj;yiQcE^wzbfDmTfo+vgDroKJWk z1Ifsz=^^K6#h`NFJFg%XPeE1A;YoOosS(cY%;QAr7&&LHK_0QMW@1!_ej^L~gU>x0 zC;j97rK|52Ps;fAj>fjhPph3W)Cf~z*eP#DUFsI^A}q17pj ztGln~SiCXw0f$%l_k>^NkfMboWYC%9>-@rC*|l>`sW6q}h$__w!*Y5)B2db4w2grg zzcL4$zS-N2R=E}j8}IkLr`yu6#)-;ZvA^+w=vId9rLPq5&^L6xsD_m6yz(*eBnK!h z7ARh15Q2(@Gp0dN25zjnO>IVLM6`O{}+UaihiYEra( zGnjp(OPxZj<5k7Z6Mo+0mGT7~9Vi+wZBUZbk@3Jg_HB*dyzM&WrF31_{jVNKJBnF_ zQKc{lkEEf;EXop2(LtVPwAV<+tUmY%{?##K5Uf7OkI3&|hI0pWc-rS2{;9`-+WY-l zD&N08Q@KI>a96xk`(Tuc!!~|I!q6WIA?YgxJ8r%7?es)V{S~dTUO=bBlxLD-_=YuK zZnN96`hY{47XOJ))z+j(*~&EyJ2OI7?H`HF{szEg6eml2Efgp##?Z@(bhl4_Dyp61 zaJmKIRrQ|mWmpt={|>t1kR_)~QHd^io(B*^tu)z#wh+TVTtn#-S*2?$0TyNeDC@L9 zgT)#|N#!_MeyfbkCbz-SF0V~Q+wTw_uf8!Eh7|&`&+bd3t;gK0V?(#cM3GO{A&kk; zT}-e;A~iA6dRhvy6XT`V$AQLA$ARGw#R)|*&|$d!11m4+?stOKc2-Ga?kx8*%HWwf z->J$qzPG0Hl~~J%>h(nGil;Y~e z*i`xi91#nS6Hzm5cH6B=^eYXQ76I{Ul1eP4=-N{XjHJN3Dw6?7J3!(E&M(8t02;Di z0(^12{014kjiOsQD&6DK9j8U3PVfo7qve~FM?@DLJX(UB>vyF9@32mRa_!W6)GYA> z$JjFX(|n>j8Qr10S>N6#fvuC5X3 z@Fgy|&mJz8OMGF0%6NtC|NM?G_qnF~2pPvXc)7rNd(liVF&PLXBFH@!2${oFC#9y( zKQaW=_ec+%@7t=&bts?96%Jg65~uk}f1C%}<2(X8rbK0`e|=lB(0oGuE5xzJt%?q= zQB5hMU!wu^ynj@Nl~s1W7`RT_ul(+RhO^u$#_@IOIyqCjT0dz^KWg@~y3YB!&Vx~t zGC+B!v-~E=44Jy~=WsVIWqzAW0qzlGt`=ZzDcrD19)>FwSicdT}WqQ)L zWcVlp+Vd(S?cX|7j{o%?H|c7kO#&2k#4q2lC*g`kae5Zrfindaas`LMogjF~Xf&l` z_y|Q0D*b+_^6R#WS7{y+U41Z3RF{6#mWp&MJeTT*Hr$6+=3`yw99pJ+oQF0-W0jZq z1D@p?PE0aTmMPVbz9u@fJh~mKJ9`$S<^AB7Rv}|)s)9FR5`M>JH;~^oorhy<^Aif( z{xH_Gzw7cR%KLPWogX|#k?PSiD+bkveC5Z?vF5y)%1=0?8_uf^IB}Xkw~7G1XajYD zr*?5o9ID;_nG3;zAVWg)r|digCL^n98~guUg^u;z4UCxqx!4*D)HRVFZsE3GODBP$5I|zscT&cKWfIgDTiySiW^=lSk9uL=Fj_r4*nUN>U;VvxL}lp-7E>i^Lf ze-ID8cv$5ycjzK@omX7M545XPl~Q|mbfnzuLy6|}x7uTVcD&PNZ{<*q3rT#Kw2;b5sN)TjpJ6Es) z6|EL}Pa8w}T;o@TvTp1d`(4Xma!xQ*CH3W3jLY5QAJa9iXNE%8(#QL`!cgm)cxm`& z)ZT7vX?-^8?St-nv$$1!c(1x4{3DB{^o`yEuZB(Y?te*;bV#vxAhtI@FFb&c89WG0 zM5nw1czc{FUzah9h=!M@F!`+agp1eu^Mu^zL;h*2y=;Xi*CdFGy(f$Z29J2!Ml~== z?}$eiFB{)iKUjFJsWV>SS9C8+Sn-y5S2tfR>34X=j~0F|z?&F3@eMnN$0r{t7iTZ=S%KG+R5!~+crg`&!I_O0QG>3-;~Ql-RdJlEyd{oR zZ?&SKWOmYW-F72Ww7_$0KtLJ1|F@x)=0&^Zew>tJI#$`Mc1ba*46?H-*fOZTE@^xP zM6||9kH{8<$lkcUI97R+l>Ii9MLEnh;}l0UOPk_E@s<=M$XUkOB~nd}N+Cu&kIAWc zG&VLLiJ{(O#wo^%I?{f}NrBTJoaSTIWPD4}ijD0DW2nzt5bQQ3%t@%h4a1bsnBiaJ z99&=oRSpgLD{sCku3A52N*I4OzPhPj>Nz^zQC*BABx6aN&>y*e;M0kG%ClF5R=V%L z_H67<$6N=XguiZt36q+jCCD?Tb-ABN8*Yp8Q&g`VdCK&6ajx#B&+EW z7`!7v{Hosrgjf6Jgw(lx6rb=pJmv(6iZNX9oL@O0 zmy|QybnvHtA~t>cTTz-AONPmOOQKxz7Ug8VH6}{0(={1sD?F7>ZUHR@Lx^^~Gt zqhAJ9^uYiUcb9tIxMAC9{4ei#Ll*hznGARS7P<5g&;ECx`&NAK&={pCr3F;=orz!8FDt^ zAH1TT`>|v4-|25lIHAqr1N{@WR@}ZcO_N4a;H|muX?u!7?cO~3we*eT5^p&qBTf5W z9A=cL7dwSRoMO`no1wl?jvcs6U$dBzMTX$D5=WG&7_Gt@Jzt15Q_sfQ?iW?2>J|?C zu?Of3jb6n7UeYRkI9Ie6;k~akbY}fS#t%6Zw@-dXa>)EFgqM=4-X$d^A(Qbf+oQ#c zoOw?eLgJWCRIZLwWqHG<(fQYUXtfs-86h9ZiN3N{3v28Y4Jy{wE6WbE;>GQ?N!koT^lEFk}?o4 zF#t@ND76F_+fJ-+eMd&)uoF;^f{gJUa%Qhngw(M@^Sg}5 zpBuCUsDBLO5}Dh8s;xYmK7* z0GcHo4DM1S=Z!1GONQJ!<`9j;K4uO)|dg^?XUr+{swmV!3Q|5Oo^qU#AwC(k z-jNtm6t{8et5$vm6e9w{{F%!3>kPU^n-Q*B_k_wh6O+X&{Z3!EG^FyLw@@Kgo})xz zsRr8XmU2(^cXfS4a>hr*JH^dqZ9ZLlz5B{k zkw=nH?ry*T$C}o|Y7^=p z>U&Ay_(?sZBK;ny@Fo{Txuk$~UDd_Uyl!{gx_cu?aYR5YKtH%iw2niDBfopin)v47n>$PD|$WQ~q-Y=!IjF%Ll{J={@ah zOq@-vuf<3w1w}m^EDw8&XwXD$;eB4(u%`Wpp3i9v))W2`mu504Ssm{ENRHSU8Svv# z?;rM?FdI5DzP+~Eq5h~n?w_7DHjMvQZ}Q*l4_IU0d*sY#I9S|Ee+;G3(OW-Sm9ee$ zUR30Jl@*87n+Uc`hEj+voYXlFBhYOj_=T9N?2tz!FHe_HpoRXpjPvn~IAVCHixBdp z${XswASFAbv_Z;iXEa2tiWHzhjYAoDUQGWk!>b!mHT_a84%P2bM0H&>V_QsCw#(_; zqo{C?g!mcp9Ur)tdbVN}SHU0R*~G>=O*&c3R*Z?OcE`juSLuZ4Rb`iJG5q2o*;7TP zC^S7lTy2(=O9{UXcTOqlJs|J>U{w1@br+96@g7DOgPW>A$tND>AA(fx9oNx#OcnRY zh;EElc|;2BC2}R_!n`aeLi|trDU}txC|$~F^j@&D(JF3{EbLHU$JLHAQgX_Jh$+uv zkPH%rNk1~a3~yESV7oXHtzauja;4s;wio3jJRybpqKzfdisyh;U)m;?p5eLYMj(~l zL22msc=@gvLwW0DQ|n7H(t1Ya2)Fb}br8j=#~@B+gR!!n?I8ZDC&f}Y1e+W6_#c1# z^}47wP^VC9{h%D^o01<${d@A{(fH)!hjfp~Dj8}w23F8vQ;tu!uu1r0C|xwR<0Gd> z`GN4ihOn$C;5 z&j^Dsh{e=hT$V(;a|cRE(;DJCA^E5m0jBq~*S5bZJ^hrbfY%a_J7N}&LGO5Zp8_%T zIg#*~`0|8k1pn&3@N9Y1J<6vZoCzEYWT?@RJazZWu|4hbF}~ewBNiO89-mr04-x*Q z4(2l zmtcgMs~HjlO_g@35|CQ35e`MR)q<3no@F>C8CB#G;pj+7?U!HxQDr-b>;gsb?vWG718|Qx>n1 zmhg-5(7RFry*TufZ;gJH6Uvey+Bh2Zr=E_Y6b>Fgo_ZM-jxeB@XoH?(2oz;P#DsTl zFCT@9(Z;x|H0t7>pMalr+}3kAo5jMI<)b4*&?+|6<`-2SIaMwhb;3|CEKPyT2chVA zji=UsQRNIryRu$J7)Mt|xO39aFA0*vG(^v?QCKWrl;S%SO*zKB0^0%#KQ>N1DaT{} zPys{bv@L(*0A-J3!rz<*Y50s|3~3>b*6#GqM&M|Jl=n#MNud$tP51bNu|dh`Su1DV zqpvzgy))FER!3Ljf4u9pv2|Gbf|^xEPxPf02E8Fa(YFn)t~`HgJU;jA5!2jCjJDBL z6uEFX)IBWcZHI31(FoORf>Gm9_4Nxn;?0aS3IU^#hwrn(3o6aEoEI>`W*cBTG^(d2 zdQ6qCP@pobE~#Fx0*kg`{R`1#P@}9Q6 z7}WtUFzn2CtPA4b1NHaF0KZ1JXn#u%@s&2le4-ZJ?1feE4)^^mju!P{WLe9Qm8$wN zLL^q5;}nG)-)^BP-qNA&ysAMwfuoPks>u03UT|QT&SLGwT>dMq8+yw}vtwnP6m!c6 zmx(AOf?_0wqf0TFy)y{H5n`!Hd769#yC;Q-qG~F7Dalw@h!D*9YKw(Zx0M)a9&YcK z;%P*yvN5I#SF1_;m494iX0KDI>3|iZm=+RxI8DN22LNO49GBsh3h=|x`cF!kW{SY{ zg{p}$+vRl<`tMqKdclVUUhJgvq-bR_>V6u@!9yn+R=vtY4l!#oyaNoD_?X%=v7t>$T}9qQZANg;NXhPsPI-e={)nR6 z=UjfCm*Hr5)@onnVhWg#W0-Zgt4KJ8qgz%aT;8D^u#*R?lnT^m3D`dun=W~70fgTr*9dPg)B6xp%URcHqE3k~t(r~Yv2`!eth6S;kAjpqr9ZM9GLXsn*2?4%^K#$Se4D8PV3KsC`Cqae>8 z7n{h_{7{S?6CXpDB;&)iOd&ADn=F%fQi|ok&%Qm{!y9x?^Z?_CKa_`mJO1#qQ95%* z{8P5)%^C*QYNiD*DojcXuf50~&|+uCOFN9lP~9TnHp(F8tvXZQ8z;(d(@8%XohM^s z>jAfo8qeiD;o**qsQQuSFNqE@XsSuivH)g!LzIO8S+TMM^jqMA1xq|L01P7&?0}T# zhki{(^+b<z(}VPBD`+VC&m^QPFhe$+I`4edgJt^sHN;%h&Q z&pvs`?a@W!+V8AVpYo)Y?E-X)@k3w1Yu@(@02!_q{u+{Sg`;O~;e3!b=MK~be}F3# zeR@kk)Mnj{@XjVF`Fq-F&i-j#PalZq0}9|UeZeTT?S-LV5syhG9q3@tb&F%kCyvA} z(Vu*YuP?(&!2BzE^^0kpN@?xzTc;yn0OB$nUF+=^5wEhMK;cZ5cRNBZcaNIIv5P2_ zkgs=>~G!*%E3nQLGgRsmbxndYpnUV*s zXLX!jPoQXwxf)I(m*Eu*&^D3U^H63+=#CM^=wOJxqr;?Z)8Y-(YT8Q}enIWPYwLgT zbc{ao{Wx{QYm^rr>csBf{o`2oh`jw~J1G?9<+TjYcPg6m!X=gF*XN{!C=&JP`Ql}< z7Ei#)44y{RJEvqw$78a%+tEAoy9`G&R^wMt)Xsv8zFHxkPfn=oRt|=2>%Es`Scl~F zZir@Sr+PUREK;9=(Flys*B`s4HCaol{X}M zw7;fn>EB$iLKy(BqNbnfBOm8~``#__zH7IrVdw(dvv~ViIb0Tw-nwIJ{QmczO*M)~ zpgQUV6AmU^PGTbUS=a0}fUOG%W|-L#aEjK|KGS`+@f}=iaLzzEDj#>1?t=}0h!h?< zRKF#rO4sXZN6z3kJPMMcR*We+m1DJySA#MGds^*xaO1Yo6G~UWqwHwzwe4@E@=Zch zr#IV%fT5E!!7F#h8RvGqRtD~&aUeYT9Ooph z3*c2TZ?`Jtncma>ksKjhSJf-NL$9Z{q~Uxx54yZC^y}h(l|ddjGs7b$87Fqv#Q&Xe z4qqtGWmo}-2DW=T^cs6M#A-%ZVLdh>Q@i%=J{m(xrAYpAh+B5aArYMy>2(6Xh2}!7V5|<~P%s zct`)(Zybe#g0Vt|zqk$)DiX93QW?JI;myQn@OP)Qj0j5YBC@g4_fA-9r^+3bQ@XDC zWoKE@d%^`^MFZNFcBrELD+P3+Tub%cK?;kvRIZJ0O?p|p#MkNSogXT+&`%9pZx+oRchZ zyhv4vW3hSaQxcv@3nYX)*0?>!OV>uPEWzk7*M&#cimg*D);OWZ6j7+;WA(SiSmk<^ zLd7al!el{_K-sfbV<2~`NxvvH>X#5Q4@Q2^TVT9Vl)7)mzMNjM$qS>}?YLs{zSuDN zl~~h$RL1Ke8LtO)?N6fCIb+3wG98@nL}>s#&nq(U3H-q~NfU^R#8dDm5dquiIogs@ z#n|$XE%D$Z7WlbDEAA9Q!S8nbmjIMfax&#+vO5sGo?ThrepcyA?k79I9ap69mBCVy zDB$$9C%Kn0y3AX8kr~QaWwJ_QQ|rMPlH#P@yt~;d?UQlWvwDoYZs!s}4JgbsFPiXY zWlR5jcL^Y`T9r#>ZiKnwa)tB7fEL;a>+d_RUhfhr9q9)(h2tebP7Niz>#FUseWXg` zrAtz~-8UH+6qjF%Q8K-0bKd8R48~X9CSORjw$V&iRs`uYu;M%M2w_Z@Z6rmL@#;0I zwkRF^#c1@O*8PMJUgH8+iFPUCMRrnq63=hwd`rRB!NmWxohc#RuXazy`p&nhP0t~_ z%b?$7SQPx}&)iXj7U^gPV4SYpA}?}KW(;7xdm^?d!Y%ZtL^x-Xhksj46s}3a;k;}$ zHz{L%f7JRXr8E#Ewxhfy_((qji3f!Tz>qZz;JP3z6=z15XLRDmai2v4yhrI(e$;ar zUeQ1VijT!0Sflr&Sljxx(zjwwN6{br5RIe=1Sk+MMAB9G1t5oCNAk!Dub1ee{`kIl zg&Yjam33@|&oz6U8PgY~urhu{8MzK3Vm%J8Ed@No_dVg&8D^#jq05v6~Y{6@yCiZBW!!j}ElH9yOIgJx3%v?b0TN zJdvOBvu79%ClXx}vgc=NnmMvVvjpUZ=f*8-;)ZRTeBSlQ0<=u`76VplCv^7W?R&5A zuj!@s(>D6m6Af`%Jol?>p59Vl&rgK8GH|p{TLpdv6B^`r&v3gEfal>m))S}#U1;i8 zX5XVaed+3Fm8&C>5ckV@<5eT`LS}^1PF9R4z;nW*?iah`v0V=FdKvEx&4*)6^C2&~ z9z)4X_aPs$r&s5p0gSopxG)q_M z`WY#ZqcX$@yOfJORG6SyxI%<)C~qmoD?8(K>E<|9e|?;;+^jNgjFYt+;ZDiiG5uGn@<)5*^@ZVT4!( zFQuSlW6FImtU(3q7ECMXN}0fx)@6DSg?IY(*OS4~?z)G5U8Hyd(uX9PRSf z7%yENYr5Z4CX7DMCp;_!D15uLYLAty>fj0R?7Ef%7&iT55f*J*+xl+S#>MLfKrP=w z{Yy7p>8~BpW}iHChk+~!&E1-rs}O!*`S z24|Lbfwztv;?vUK2c_o^3zH|*R>`T_ot}jTa$YIqGMqEm2{sDBt0i?dSbUv9%q_*j z!W8qA5YN2b_KEv-&L@>5Bq9vo6P~D`Kd!1w<%&SDRTC32Gl0(w$`K${-7k1 z!gJDn>PFCgn`7OeJQN8pG9Rtq9nA_WrxWDfw)d4C_`M95E_gwalmnE?7Z+i0iEO<{ zk7Fwb(cFekc2(y9%!^0QoGU;chGwl<;05t2zwiqya8Y^~lLSPo`f*t)zX$PLC*178 zVQwx8ZX?Dz&pOT1iI*!1ZF!w(ZS(0^*ZQ*SnXF#puLyY_j>_~5^|DoCn#*IDoD!1r z!5r%PW_q28O)PSpc?YW{z%mFv04w2yDPsC%vt!vv-n zxy!dMO;Nads}u6E04rfIITUs*R|?R9Q6U*$%0oNz3r2Dr!<(jG2Joy$H1lKHuRN9= zLHed{;ycP9Cv_l;^d~*bK^np~sEoAII}NvUo!|TzV8y@JJm}c+Ecpd*jQ)TVo;RMd zXY*fxV-mQu<3fW4K31=dQ;eCwTbOd6XO-+UfD32?WMu-@3oa|KAAOVh%NWG$E&yblY=>uAZGMBv90xK zZ*(7JRz@bIQ1_xqMI_-*P4i-lOdxyFh$FT1jZFxFV&)m<*Qh&Zvdi$w1q-|dJsHO; z1{Z#+mZP(Njg&;mMwnHZ3_W(`r4x3cq*3-LMZaOo5F82xhB8~^^DfGVK{J0zh)d#0 zonwpkY$eijINi&=ep~6;3achPt!u#96owog|U8!DJJASg?bo7Rp;kaUqAb- zs4E8lyzUBCRfc#A~OK=f}J(Y?67><`3?}?+e zyFBW1rt-!(QMoG)Hr}h^Dqc^*v?;v3VxZ5+f%~ST`8MKM42%YKXsWb6ZPvlCPZm~h zXni$?+K(H-5GDx>f|*vN(%&>}v^WsqR8$^p%tMpaHF323?&y`P7V1*36`QkF*C0F* zZ{}5}%katt43YUsbR=TztlJpJ-}2gMZr!Mxl_-s!icMemMpTZSvNFUAe&LsYO2X9= zj}>Fb@BLBmX+PM&i<}B=@k}vZ`0)FrBryu@*!6GzNWZ+ulA;Ir)bg0^Qng}Gc`14q z2dfQu*2gNhOCNM&r1gX%;|Gxl8((;r$PKZi&4cyxdJC|7?gkI52sXe{puh`x{o}vu z-yCKc-U0Bl>e>Hr*ER9hEBH{092~N$Psu?RenIq703yh*@=>sVFje*TvDno9jOaKn4aiV$idczNbAxbR0NpCy%}`}p zfrXXwO46k=lA@Chsm^hPpO^fIh^muJGFr^t5CK`AgMeP_{@p)vn+T3hz5e<*bMtk| zt_N8BsI2Aj@wnm-?pK)w-G6PIzWEx-hYYpK5sISRo`@^{^QYs5Uy$L0aa2}8kv@3i zlwtR@WhXjc7gX=AkN>ewG2M)YsZFvSe9n}+44uVVSLwqL-UKOvuvZCMhVUxh_cJ9)R~*8mut zMKSq@-Y>%|7wj`bM-<)ANF00DEz#SuN%2ov4wuM3G#saX^3Et$s^%9~#p)=kih$W! zD*v<}*FDrFzOY9x?yI2)nQONAi6uQ13w#aq5{06mgt#~kfC5w?hY|&(8og%3>3K!x^ zE9;K>LByBvaH&HYeG)#Q7lzKx6VWI}4SrT9x$Y=b=Q{R`5M9+VzBl73LviMHYrZaLmR6)*krPsalm@EIz(Kl;~-q0USG zRGGtR70yQ*N--`2eNs6Yekw@u;oYbC5WF?Ivrv+#CdDcxi~v%m3enXm?{7O*kbzft zjPJsp)x+JFK$G)Qz{(dnT!xDYNrv$f`!RXLYofUM3J*E+?OL`ouP8%>&t^_dM&&5q zrw76Nu9Qoj_v0P!LiC7&-J{_jNZ&Nn&JG&ZFOx!-gRif1)3x zInw~!`2Yk>N<&(y#IU%^M=>0)u zrHFT?9r4ghCr#6V=FNh<{-x4NfgRJJ7Oz+`v^v^;SP{}+==TY!#9}lHTccClD4IPq zqsP#EW^6ilo&duIR#gYR@@`gw74wSl?gA;8SN!Zm^y1WwKV}K>N__r{SEZ>zh<<5A zH%1?M+>fTkxC)_~?U>rNOIL6%>3=y|8`ec<-B9$_vW2Y5CJ8sy!-r$-H-2cIIep{x zq7}w5@egfCL)$Lh?Zc%;<*$F_M>?Tw{lGJ8*TgOM1k|CsBr-f%e_(>3I=kSz+nQNK6F$?DCPi*rsY>rCYa;iw^fbj(VqEVWkB#k5M6tuL zBDbq?VCdaaW}93-&s~OBHaL1^e{j*hJi0L&-F`HhCDFbdjSjz+s7aoSWf?5kw_AyZ z6m-2^imLd>iZ<%R9X`e}BsObcob_Ct2_11JuK@TyY^NM}#hw>hA;5wtTwuQUgxN_B zx#8pXyiacrU+v(--Ijq%5R6kLXalaMldk3WQIMn`Q}k;^DZ%%BA}FENb9Kw=p6IT8 zT_v7lMf5waToaF<@H}kK)?0*;68P$J;R+tIs_j*@z#D_&ogGjxF|p? z`=rNS36L9we8@JnoB3a~Ed3Ggv!P&Tu<=T3DCn;Zm<->VC!USs*ePY8?-)_ZL%kRi zyS8Poy221DK;>@u#`isSNuqv?Bjpm2lf|!?QJ3x-r8;4>6mj-Yxh_&#<@g!pQ${Z= zV;mLZuRD@MXqUgL#^zGQ*5$&P^gMm=JLtZv{FDdpl0Q8I4HI@&kc2nts&r4smZ{IY z{5fFTICa)L^bq5gc>h-cNoj2yuDx5GtS95Bdz)JiC_;Y9LxHIyB7{1&79S#?$46TPxxB2l0m%`_*>?n;;86%7p6@j5Q-8gG<=+Pz17#&9l^ z7$QG{3@bhQNOYd!l_NQUANoZxwfIJS+4-aYEFP0_)v`l>aQZD>Ko&P zA|(2~XYBtn*ZLW+hNf=un(=ZT07C)~t3mMX`I-aHA*ZkPz2xYHU;C*H*{WCl-}Sqn z@NpWV&I}m5p{p207D2LRV`AI-IC}S8JecyhSeSxgXHNSu{DUWB{kOjFb8ost-Rd9C z>+>J}fUoP}bX`vE?%(-SoU1yz<`lY&P%1HZZ1$|#IPqtJylOZbs+KcmwEyHrX?9xyY znH9EDNs%fqfS-zOQ}^rsgbGj5#gY0QF82*rq?~UXTpZ>u7<>?RRPiedQf!e*)!Hdj{>uB5J`^wf>IdVwU;dzIn~jJlVIx>8g!5THbRrrD4<#DOfF%c{31Mw~`Dn^I zhLNGIqg{t}a)?zoBfNXU^3zqcv+fUyWMtu&$?RAgIJbyDD4b@*xsE%LXQ;o&r8}#|o0$0WQ>gqVc6A zVh+Gq5Cw!$*xdJo9agijMEMXTK0SD*`Woi}Xagus%$bI6(m8}rNCjMn5XVZ<{F);h zULqGVYMs-uq4Ov5O!$37crocmYjOxmBS zvDwH?F;>0W*Z3r3QnITLFkr%KQvPnIZ{Vn`y#K2W@QwGKRik^yjzs&BZ+QN<-mNIw z5I;QoY)pLNz9_ckeZkCPsHy~~E`wW3y3PXDE4HI{#g#F7!)@Xf8RBkPMqK%hj)A09 zhw$XcT2-PLUbZmI1GEQ6Gh+?6(LXAkOWxT_{9G0Ps%CNO<P81`77-q=H@eJ)9?KXN8pKf-Z92&zxs&qp@>f&713(SDB21q>%RTHD7Cs?U`ariKxJT9 zIW*4FFfvboSE5$S89V@HRS%p6eK6dO=MM0s+h%Tt`LZ@UFKwiMI0WilrPqnAsdv}2kZAlr?4@`Dp&c1YF?~9 zqbS^UOcVIr0hUDY?S)C{^Ic6V*HS$W);UXNn8{z~nbXV?*1NHYsw<0uq2#y}F zE+8%ziUM9Eb1J$BGpnuD#2c41*kO@?u$vMQ^2N@04vhn+`;)RXMstXPpKQ{Gx4m5Ste_qw&& zm8D_Y7(s&p!^D?-T&F@{zn+D{M91sTEju=fzCtZ#l<%KD)g?tUjWPkmLo?-N2@Q*^GF4>3dxq+b%W zT?Qam*4r82paK;+Qclt%CCOApm(zSLo1|a>Q~%hc2|TiwJo@qJ)f(K6lW09F*d8fnW2MGU~XjsFQkm$C%@q7|>=lqm}v4`C%n^LD!VrPW|JT z&2dQNV|9IcH<@~*x5YQ;bm%(TekRt)__B~~wEdLxB`c-U)dqsaB|-VH3AB%P;Fy3z z_%*G+h7EPBzPH$B)(@RWpi+jTw=@+A7n-V&&hlY~+hqu^OPK^HS!VTUpof}t?D794 z0Of@@W5X>aQR*IxD-?AXJ2Ln}V!t>PhZ{14wcEV?<>|^zascj#!$Tj4j#s{}4Djf! zBit|5F9H+sAFI46n$`7I=6)@~-f=Nn#cgrC{HF9;h8G>IF2I+A!!rnm-;pkf;6*X` zB@WExT2Z?FiYWT+Xh^X(g!HNcBLov=%r6F-MNExmG3v4xwRTOUC%W*P%>uO7@6KIN3LvfOFFu#HqC2GwfZGD)| zU$b#2{+l=Mi4B#Sl_w4u_^V))c~eIE@ zeYzf3o^IILQ0Ju|Go!0>7CNG*8ymLA_WJhNGgepra$I#nWu2(FyvkMAm~N(@WF6of zOi{*_S)Dw?@h-K4x@e!1Xn;}8qi6UNpzJ-T%C2vB)^;EbUsJYzRVRAD6Pt(+^fnLZ0mVAx#W#Oc%Ds#=o`n~!lpRTxaZ|B!deQJ`kwH* z=7VNhW6y|3h&sBbUk@29F2scNAcr9f7@cB>WLlMtaj1H?I$Vt&t8|3DS{#Q${!TGo ze53P>ztg%BFalL6{VeuCGCeEA^NnBCwSH`n_cYXgSiR`Q>Dn9Z1mIy=BoV;#itTwo zOuTL4e)rwAT3KewO-wfE-Cl~21feTzp~BMQl^gE-bzRqic;&la{;e#Z`lG&(|8;l$ zn)$0M2WM*HNQ?|`)N^`3$^gSLapp)o{pkJC>7)6a9Ljkq&lE{#y?@1K^p9Shxg7sp3<#L=}skmptcm4FQhLx zDk=)iHkZCD0+p@8-5$z6UyHEJhboA&7};R{9$j|*UBB*nxDPIW^rhcUbOPu4MZebs#2b?0l6%Ifzc!@k* zg16lg<&iICfG?MV)F$yQi^FWZ)5GqUcmsQMVCY@CS9M#?D=hUrVLr1qQDVgzN)Nf5>Io5U_(fOam*2zDM(e8JYr5sZwUjAMg z;4malHnAqqDKy+4C|=G!>qT5p>mAS~lzw6q2)o(<(T@zh(>s;9J~I!v7XIPLR|r@* z;0v{Vv|Wwib~%Py%rhdq>L;`Z=fZTISB#{Ght%CowXNcXit<+!`HCBkpS1Dqx6{yA zrJEUF$i*M=sU5~lAXguz92KZ{=3mHy%YmZ6@wm`1sO$iE`b=r39Ow54wTcd;jSmjJ zH^xi5oEN8;Uq{Hs9R^u^uV{G7&~R4D!jPWLP7Eq1H@<@W7hIqZX&ufMLdBlh3~knH z<#_YXHQovmy!lm=A`wk$8-Rj!(m8yR_cA}8-RrZ#?aa!W4U7ngTXc`L3D#?(XQ$kB zeO~=59g&Q0;#K-&<^BqgKetzHrSFLnYPVqD$%Z1|hJUX-UW@nM@HgY#H~%;B?i>Dk zyzi#J7Vo+7Z#f@a%yZr`;_kkE`|UUPa4SpB#$4r|K$8zlx&YyyNXj zCg$J=C+bSo$#bNuh`#lVM?X^I473?u^lt`NpB$cU^WN;2zT^u$;ornpY3&6;+gRn= zILQZt>NiKTw9k6Nqio8?C{P|#(ByM7N8bAm zBczU1U+ePLbiOMFU^_S=O^Bp^+P2ac)!9i!I2J7-pxPlM^Lek+_1EcQF{-_BMcN0| zx^j$__eQ(C!;G|Z>UUy&^ZR~5pEj&kYRT}nN*khCxF#CC7sWUeVhVPMqRA-yrSW?) z0cI_EUWUj;N=^~QzO8SOKyzG(qbHt?c1MwqJZSiZ4PLI@c8l(b@8q`DyHbMUgR+=? za_m(6@UcHpekn)s0DbpvIxd@eLn&<(26Qw(p=?$cKjv>}p#Ln?gIPz~5Bc1mH&lyq z;Kh9ax}Gn{jmkm>X1ugJjyK*er6fhCa|~8b$IbFplG&3{?~kdeP=+N}!W+Z+;9h-t z?dG9)&E_SHFxqSylJU(U8DF(azZf>}=WQj3oRM4lLC$qS*Sj*hUw`4WZ5pEpC}rf5 z9@#OQ?jOIDp6=xaei{!0$MeBlJn78Ou#m?_Rqe|Sf)~-DfQ6H!1yjVvO|Mrl-Dmo{ zB5*kAHpKqPXX8v) zyd^>tAyW=t7`u1q$6e1x)w^DGZczSjo_bJsiBi={qX9liGyvlS8~4`V7Mt|knpR0| ztNPh*o=)%J!%R&7cs}0&RW%M)-{ZY2TE*?rEN;{B&KN81iIM&b;+drL(G>~X3j-~O z_TFhr#7QHjY15x(Wm6ojy-W2rq8f)|%habWW9Jp<)MDQgMgWOpj@I5Pqo|0~4J0of z)6&iH1U7OD5<$XwUn*K{$l5Z-dI%{g_yf%BwOC9D6(-KK4NDJ+>zHo*9aLM7YQ6 z@t3PVlj`NstZtD$MZU^MqCU>^W_gGhy66JK&H#=(uvhh6N%@MH_vx5(0D4g{bMw3+ z3>=d!>Xg^(dRYNfTED|_x3o5nRNtT{l9pJ`B2Anza5!UYXk1GX^@ccFxm)+@!qIVm zH=pl<=ef=sc+L^YfiaC7Iz029FbiLJe~v|1N2+(m>C(0K5=bnLEmyuREMih;`wp!1=Cy|Nc9 zWI|h3G=kU>T&hD!CUl;uILa0h>Jnyq}5{P{&C>S9RR)Km0JbWxU* zcGtG`@%P?vm9b`%op}Jcu_SS2`rIv5%Fgq=fZIU*+4(}iP$cbRF%NCxFJ1-H_l9XQPsYawYWw`@=a&9$A{vMEEr34#Nb_f zT=!3;MBaTT`6^Lr7rz8!;1@7m^(^ghxmg?c$Z6PnLYhKl!vWBmU-UL5jWZ=Gz0FkR z=BYoF{`?c^^M{0ksv_cR&0E+H=)M%t2FkByyo8NvmN)yu9X&a2rC~vgtOQ?*)5APM7N&18U>=#sk6~Ey z13Xjp>rtPQK&);Q%DcbakT<11Fb7`iJr!j|WDvS5mkaNBG2reDLDW~GW`;?G50v*( z+ihBbi1@uyH4cgBt&$vpe%mX>3vt++L15JE)ybLZ@~Ozodo*Osf3W}oB2oZNH5tSf zi{}cBc>A88jOYZ$7+YBW){B1;&z$~#{H5!EQw|)CT|XW<{*8Fzz}LlR;Elz9 zthA?K4^FLm|LmNxQkH1PeUTuFX69Y>X{@p@j#uw8orgP5#76Nxioqi*YCn9ENZgB; zhJM4(?3wtj;FF9fwgF1b4;HEn=ILv$Aj~IofNSi2#dF)5pO({n$VRqZ-YRGIU2-4` zv1{T#>RK_%Dw-)JUPs}2p;V5)edmsN?MCL>xTloW1O8LrR0sFe!Tg+GTA80`ou58W z#yHQL=T{yUXX%^~s9*Z*qn2@Y+oIldJ&h*d zM@jYyvAI@_8%Bm>&xj(v#z^d~H=>R{hF;xHjH$iPPK?EKV-xZ4#F_ZUsnf0t0}TzK z2lD3Cx2ZAb2cWas3%bD3dHWiY5nfi}6)-vN;6~SecWXCc0S;(xc!q~4Z7Ui8=NHvC=dLcpVX=JSMa@-b@igH!)h_tJIR%kgX1 z{~hPa^zb=jiTYkkKW{d)nB8x&WqJ zw@rOYt!W!i9+kY%2ADofl{ffPhRoxM#`bi#PW`F8?GqxDIxAuzL>(a<;RazIhc`kO zhr~d|I9=YS4yO62VsAXwbe=SF>|w1YWCTc{-^_q67cedmEGeC`7yzLaK?jZGBEa)A zD?%G_c=#RB>a#;wCw9mPmwN17t9#&>cbE|{h#*(8P^7I(<9M}!d0JMNBFGqApi(Z! zJv;v^Da0*~f=~|hjeTogC%H%l>f?|9GY>D(C)UH1;T^F&{mPZqY661VElYu` zZWMZQDick|sxrQn+o5I*DGJy)_2uk-Y82}jP~J2*WYAt}{IdGdi(O;Cmnn^9v>*P< zVF6l#xA}nUhlYMycpvsq-1^qnq@oIOqIPTa%Ig&mOvd(!KT~`xWh4vCD<>GWstgSD z_&c{<5!Y_1xhzq@zsT_{$U0)aGmn!;ziKPz+|928;3l1?=Sn*7WcjVc#Mi&|gQM|< z14oT#k4j1DwGt+cKiWWhEcKz6hGM9~ zoU`)j9Jr{`i=67VUtj$mDsGuT0Ol zUFzR?Gr(Cp-Bj?y)B;O@2kL_-=qnppZ~+r%=f-qWdrWk$Cb>)VpiC(+>?{1~8gDG< z5j#SiqIgNCHb_*E0ndS33^sUVnt+lSK`q+2VH0#NMu4{5$GL+3{HFG#h?wb0oGnJV zxSBh}?3VRn<5zUQ9K-Ez#l|MPXm!1-8Q%p4+$QRV+%~9-fSniBRnCrkE0^@z#oI}9mb zD~=7{8&iEo1Uj*$d0$kzC$oHRkrYW=3?pX<5B&n*Xfa6gmjsSu1eQo0s41#{?-f5A zTWcF6aJsXcOnviVeS%YwB{%`eAr_h1@!*0qwHgrfMSCZz+v{oOlv#@@}zu<^_w1|W#^e$v#0MP^ z!8{K}5u>aUFf88l00T>Y{litmIZEXZ;0;Gwc;Onpw)u@xbRC14KzYdrKd3!ktk{2)$7;<>(iP+Hn zit?!}b)3F02DA@eWpXR6E5YeVc%eSz#_I)o1Xnsg|Er)E2k#Q1-%@WXhB`0Acx8_o zCd4Qb7!wle@tlyzl72i60A&A%GsHD7!qX3{oYoAJUq6 zU8mZiUq|K@Ock&8D(y;t z+>Q>5!}=xFCn0b&b^&m-7*Ksle`q(t(~$oZ<_|{!(V*OCwr$L~9x{`@*Ze*v25A{p_g^Vu> zk!LwazBnZk<{@xc5#Da!J{(^=I35!+m?&clq008oXhc0~Cg!uGgVfhzTsb@xKeu~R z{EfZ45s1IxTwh1AK2)pQ6g|NUMt6UcW#Mq@7@+)xOR7Z=gMvI z&8xS?Lwk0{nMNh95UxH{Z^WKjBOV?GcbMVHO47fv?Pp@B5{p5kh;uIcK4b%hfDca@9(z?m+D|@paim}oT zT^W`RY{=hd6o*lbW3jdU74=7bRaszxt}K>v{^SIFQ9gDHa-}?J=$kfo6eVByA!zl) z5iZ9fTB|e?hwAT@$5b`O%bj*?X@An4_uPp*Rdz?>9YDXFf}64!sBB6%(ab{Xw9%ig zWmH);$mb?fEnq#h0kC1r?kog(RA;W1Qf8RgZRT7IzZ9|3hY0YlsEK2dT8z+%S{$z5 zqv&9bGIe6>qya2?HegH;ukjj zLTs*Xwvd8t-s3|^|H=OU*>p!)i{JGi_*b9k*9GVw9x(0kkASI=6ICMLehjysj*Xo! zt2I&@D0xAz+=)_$1x|=$FOF4ii}C99p1Wjzcti%fZZr9ErDIIjT+#wozqH8&g%0 z{aT3vnG-U7J$rU0pLl-YS%yP>t~T`8-jxuL-7&q2(KMR zBakDW>BhdbwfMQ68{_&lb?NOiO3?+sye=Zy04qc<>Z#jKG{+p~;Wb0?tv%c0^VjZ* zC$_GMm)5V1#-mR~_4`klHt?9E8`pCw0AB$d~ z4_-T;UqfO@*YmC_n5Y#Vu!F86~1KuoP`pBCh+3?^9%Y`HG z%7*N{21RsqbV#EmqiI2#WLA8HgeK>V*Gm=Y^2#Cg(^uW4o)-0pChUUc(G2~12dZd^ zHyOpi$g@WSI#>0HLhu%S;x#24cFR+ik2XyxIO&wczk+giJVv`uslJ zsCJGCIf>|=H_&ey3R)QaAp#>><>GP(@PhG{JU_}f$7+JwXoBf5N34x12TQaaz*zb@ zmxIThwO8k?`AuIFSr}kw1PH<4eOf$27~h7WP>cPwcMI?9Bs`tiICWptdd#~c#A>r} zmPch53vvU3LM(}q(Jm-llwniH@B!Z%suqUgBkO)XwpF$$HwFy@R*3)M$Uhdp=o0P@q%AsUoVkVIR*nP;Ef7W5WQi<=18+U%>#Y=hu-AoN&~t6{wAHax|x8DE~i?9E<12 z*pVu|qS*F=mt;^k)C=*!9UJ0p8`tY;VVt2=@QMZ&aESa+hnuZGFDWwq;p=6|JkU2^Wi8=PDxqgoTSEPEw@o%>(^qxC4ST|1qxr&eOoD5Kb(I9 zjE;0$RVb=gGiNM(W=UP(-~r-caOQy2kC>B;(uYKA~KqqoM$MzycL`DRa*jguMLa zKpGBAK;&VA>SOSRGNV7rCwU|!)&8WoRo9{A9P2(f*D)`#U1hH&BO77v0j{Rr^t)QoPY1zu|9rd z@7B0xxS`5g&JXw#b?R@)5ualmxBHJ@e`Wk{@4P+!*-ySP9@x7xj*bi&KOcDT`*G#J z_`Nu#sJGIRd@5pQi2~200>K^p$2Np0`K05B$l>GZd@BVj67`*8b#%Ulpj|3P7ggha zG47a*Q<5LiSH`YDluZ403b}_%M3hP%8m0S67;C18>~QLTN%*nxp>XB1F@+jB<`vbP z|MCS{3}u5eaF|A~cn+SVrPRld+Cf{XKzVy=d|BRs7f)GVD39*4afjQiGClI=I(41C zh_4_~F{2T|A@jH*qROL>YBPP{VU@8^g7zg0w#%`U`#G+|sbGonGxKoa4KN)}MwSME zP&%Z}_9mm=dnqPMSL;lTm6ttPxLU^g`KWl25JLszT^wM5Y2qewreh%-Z-%R@30@>X zy$B*b5%EkK`fNs696bEvXT=0!qA3~4iSm`vEbWk&I26_H;=@=yD^4jC6cux)#u>~D z9%x4=Mtjdm+3ytfhhn01Wz_pGDF5UIa!{5A8w35$7zkK5;RHO|BUW2mN{=*u81Jpz zp@?3Notl4N>kGnxF`np<36?$gOzE#G2={5uSCOy!G2D7e(JYa#L{DwNa1k9tW9EE` z&K&vL`1WIS^Q$q`eawm_DQ~MaDJY~Q3G`xspf3kz8()=*LgHAdM8qN-SA{zq8!J(; zsVIf_eM_tvkb}hPXJm~Cq*AO#^T*c3TLwS5mGS$ak@bicd^m7@8iWhq?toGixFs#SWW7T!4N;P^; zd_#NARI2eix4u3;`kp)E6E|EF2i6WrhKjM{PXjVed-E^5{i&l&k~&JHqS{& zP;A1nXk|PqewDFiF1iA)b#7hDNQ|B+7V2uXm(D34Uq(vpPOV8g*&kvN@;p>7KBvX{ z11-%&XQT-#edyHHx z7V{|^+n-Q`eB4Ar@JuXqj_$nN_k>?5(DhfHenJei(L{qWVVG(hkIj?!OChrpl!z_H zL{anoThL?tECObFG4Vq03B%|%;3@}$#e2e~j+n2=m<1$R8Gg;2F#A9`7#oC_cMt7; zo3e7cbZll-hJ0?Dp&W!Ft*A`Q{_*-h))Cjs@sX*2=(4@?vR{#6V1>Q#Bc-s^@csFK zW_g?Ndan(Bqw}~7D#llQYV8Z_re8;1YBBS}6EeQY_QvK{VtARG#hhil=0H+zXG2c^ z{631szd9$O9KkQ(1umS+*kXuLe9W&AbyjVpOZsJ5R@Fn5kN(5A$JN(V+J15@t~frar$j?_ltE+fnJk=m%2lxA_*iT|e#Q#RN}gZvCVUY|`tuy>GI;XX zsA^?3vda=Lkk?aAEW(lz{?dV|`1-N&_#1mSL>&zbbj3~56@JZ;Q}{>MPB%*N`)_=0 z{JS?@A7^S+km8Eo`268`|06$)_dW8Ap6SP5oH!N#$BX+@yOeUskNqpU58j*F1< zvDmXYIBHZrNB?RktA1Y^`c>WN#g56}&EEA#`6oGZcX&>9ET{aH06J+}N65%|Fc!Ik z|8*VNcRSE6%0}dCd8e&eery+gNk%Wp4t>GE0=aI0CN4{5QZ}N6zEBJFB!&-1m$nE8 zmN#WnrdfDEX@Vo;G#N)*5&|dqP+15V^EDV2Uk{5*N75c$r%cz(h^5-f{JC|Mj8~C0 z2JDE2k!MtrqVxy-d!+iVOV0oUY}SDhX5mnwEQGKyt94&gI;Y(6mAof>$wS5v#~M=1 zh3m`&yhcHP0p_wtdXLAJsjqq=0?XMYaeii+kr#oSnQ>s|drz2;T2LO$NZo9$=QgNW zUeK~aZb>5q*)fc${?Z3N-^I`k%!&}=>E`qQ^vw}0!ick>ww2X)?sNS6)sLD7O5JY! zTt~)Onws|tG1C4rjf@1(S}74its=ZM^b4wWD60KOy)7s&^@B9`#fl@5iq+?|=f$B9 z>w3h7)>mSv{kVFbjNd}Almg8a`CQ;ScX&F_;k@8hzZhPAt-3hQ6ow75e;LkYib8Hq znc-d;-Xeo^dbXrimnzZvdvA)}8;WtmOJ}0dY>HtrWvEK2cdSu~$G5JvVr22wSFavb zo?7f*KNS1d*2M>f*m`^-b{-pxH$8nQ-u&d@c+)e7RR+8Y9aWo*ZlA?Dy{V+kP=dWQ zzlK4^7?t@-nH1=xXk8-@eMCRN!}Q)nNO=6C8?K6f_Kvs4grZ+AVf^3s=;QI;N1ltf zJ|knRwnDFe{rsW$q8tR~HqA?ZnqpEpK;qAIXCXQ*bltQNEOdVwEHAPF>Zf@g+^9{@ zkNmRwSczTZAJebO(LHd2Q6oY%jfw8Kv5JtFPA^)eZ82Hio-XK0r8gEM?PnCN@739` z+K;X(Mx%QmYTd*BTy3|=*S!<3)_eP--c8>N1~7nt4X%JbO{tEl;uWqBOjLRkUOO>X zN(-vcR~Y)C_Q9z2j(8Wkwjxj5FY2zV-dbnB9Oo-k7VAk8?kb%#(z7b3sQl$o;}jr2 zBelF%*e(wzoVuKY>c=7BSFMMZZZo3?*a4!#AUnr?&k+WO ziTD6j2o{!(@=&MQfZ_O#u|Zv5xsKT$g|%>DS8_y>*-@J{I?4hP#Zl$lFa zguU7$BrlBo3cZM36CYQ56OKJR2VLj~?S`iGTWxu6&94c+h1fCiv1vhF43<>T84Q-g z(cE%T+=&;2(>%dr`sIBCe*GS>^3Vs2Z&}eV*D=!7?6^^=I^PFx7>=8_Cr1aG(r1Q- zafEEdvUZo{ka%UP^5ATAz>&GC5c}6O;^6v`_}=#6cw+0;cx>DHcyVnb-tmJMKZiJ4vX)Fxfy(~;2cipk%y!{Y^HI1KBTaUF^*dI% zDcc4Z!`X{!=WuLoeJT#u-xck`cIz>yzrOXI80kFX-PU^j?dBc&vabD|Skrz)?LQl@ z@F2Z8UAZw%R^DK`z-z_+i?Ox&=ZY@xjwu;cgCf)Q&F{u=_mMcJsB^NsHSv&ezFy^z zbRLRR)tlu2+~oEkh>iB)*wnn=ZEcpwuVPfxn$EZU{pZ7#_e86_%`(epc1Jr8$GRrN z|6E`dG+{(lW$qQf^Vva+^bzsiA+_yZ^^y0CrF}2-9Pm<*A|$0go{T(=@>RMf0+xy~ z71yat&j`^gdr$aM2E0P%1<#17l9vY1Co~ycfKn`oF~6(G1Y;xxpu3J%ZG2&q#Q^_O zN(3pzpuubd?+LRMzutXbo@86)M35^*FA5V1(_UFxD+@I_e{G?NGvzuM z_SS*>{bL{Zlh)*-qm?ij23J0bm66#l3*~~=Y=Hj zi3?r|KP!XN667S=`^*Uk+vKBW9Ohx};z zp6X0SRdo$K!!UDx&itPvU;QTIn$5{pS<&yI9aX6 zM70+G^zFCCzqsq>7^_!f$EnHqd!PGO{QXZq5Vt(@VysbJea6M5hYze7jlaKdN4)g4 zAL$f@?;hwr6a#;$Pqcjoml(XPud4v*t3SwuI@uFVWOXKrS1EeCQuhi`?VXB7Z(Op> z=$P^#H*OX*2N$c=vIOZ}VAUeJux_QL=+rgJfiCyYc*|kdJ9LU`+%_qJXmk!mUAlg} z{2E1-icT5PQ~&s!YpuJVQnP+1%%TH0!m*oDgiT_u685Wfn=+7(`O8KuG%?ZZMs|&t5Ww6pi+UnMdpx#J z@)ad{RC0@WE9F?_z5a5AJ<&{wuymdG!Psu>6%SH!q8}!b6R{yq1#HJ3G)rP``t1b@ zQtU)~?4*=D&BcMaRNiUyuvBJXSv|UC{BzzYoc&7=4&5sTTj$|!GruB88(-yJDcBH7 z=uBo=-;NTrWG;@V#XAOBfRRn=1Q#iq!7Ij)VFdQ|uZVxq`m6EQ&OQlUB^r8ev{j8= zu_1n={qFeZ&Hp;qGKGP`6Ry&Nrls+-Qm~Go{c1G|!E;Wa4TD2})D8zO(2i|N#ls%a z5u6KtXB2;e{20SY8iYLW+=TIUekrzm-Zx!O*V31c^a}<{;?ENNQ;y+UIsVF<8?i+} zBs)gY4`^itBtAu9ISB`>$fy69TWCm>%$yngz|MF)gPa4&q_SmS%k6pNQwQU(eg5(I z_y6*~_{V?vl{nR?#ozy#+v6X8=oUrEo0T{52!MOm>m+9pS)mW3lg;?MpZ{h&wPi#6 z<)3?Jd|{uAg0BC!pZ`YO_kaG!c;ELPixC;##BXj$JicX9eE36mM)OY|jEXL$#b-Dn z`UMx@M*KuMY2G|Ra&VB-WF)wMKEZlHJcRM-m5cF0{rz#Y{xN{2A)n`BI2UPBhqGs2tOlUfKikSMLaPRi>q`wbq(WH zmbdk^jufHFKw9DJ85l7!z~WGrBZHyqO4%_4j6qKG7L&2H^+`pfEOx6(kl!6s#f_Pe zpqP}-g8&ny7HEScWK166>B`NH_Idx+3rkq>uKGOW%mYNP`k`vqF1}y|_=T~9BP+*{@UJ-_;1@krRIZ0=3Y@oGeW#-Abh3Oq7qYtUifw7T}sM@ z#c}{fh=mz;rns(u9_d*opxEbA?lueq*YkY2Q2_G!UO%sEdQ1nlVDZR#% zjE(1jb&u$Fq*jXGkn!C%%C14;BX~%Cpe*;s_-0apRmzO&hz_nEgRIij{}lVGKG6%q zmqxJE7UkzFLX2s2B;(ZG?@p34M#sDHfp0$<|I;6QCH}^re>c8;<(Bx!N8TQvxQPW+ za2Gt5mlt{-C#US_`ZquS_4wES;gimTPF&aQ#;Ix}+OUQ7h%QS(|LKj_#n1oc_s5ox ze<2zZE%7~aW;13SIq4W&(6$_xgLoy);C6-%D+T&wJge*zmA9(d8(=2&Sa?+%S(?@D zZ;lhiTa=MWIdI$&?z8vmR~gI);8Jp%jFVD!4@kySjF6+kPClK=re**?i?K_5#J#gX z*SJR>^70Hoe?6)u07n3U8hQLhxJ*a-nGAf7yl%Jhs(ne-WqF)8(GuVuqm5)4tQ)ro zo75_ zL?m2dg)k3gNaOew4yeF0)qOEh-03qs$6UF=1eNZ=*x3G-91bxA#s%g=sf!VctRh|l z%&_vt@aQpg+2TOsuGnp*PZ@TPtK4!NY5b%dopnihC?gA7Rth~aVXs_^gN^sbsrqek zx^!clsNLlKSP$1fsQPLWAbHWMi+2I-6}x_hHj{wu>}`lUTGvNS#<$T@B&OfG@KI}F zfJ2^TIYxEur^nxH{2-8yzA~q7bpgd7frKa3U_5g#!~%D6DvD|wGzR0)A_vTst-=!U zauvA^Yi2k}xskwdkcj4(^F_UIFQsH`NzRiUbG;&oUY1vAF4f?cH1B@BZxF@sHknXKerU!?FJH=d;M4)!w|1tw>l= zFmv7>H4sg6T;?=!zm;-)13u3HHy6@j|H^wVh=^lmz8l;=a zWUMZ@J|AJ2I1=q`z+ejuUBU-?&7k9C>=JO8Rz#=w2iu1p8?0Eva@yxrXBXI8i4kDJ%^8#*X6niI!^gJ;tkI?Q9e;L zd6*{6pxaNI)qty++Aa}5(dI^&etUxxonsU*!X+6QzJ|fqVh&f{9nJDuBf_tBfRI-> zuu6~5)j>SA*kj?)n$GuPZRe5LIQ7NYGI^h(he;ttB+tBj5528fQa;1?Tzvhx6pi5h!Um^Qmv&8 zakBhYU6aE1aHLe51uY33L(d4-p5Df&DQp>%;^DiSHF@?J)p zZKYRy=&d8KY?HzE%4Qqg8RJVdeC3*Q{H;6I#!j&WA3U(aRatiC)NheNp#F(2 z3T)}N&NBMxxPn5ZExJYw3|Oh*Xo`oeNUg}=e+)7aaK$4AJP+6iOaA>9fE}Dd{KSu* zi+}n1pO3dZeKh{zd+&(<-|aHQWt1MA4KDaTl3F5T{F|TqYOI^=#XtK`pNT*F7k>~x z{`gDr+3R-1-}$+B#22pH6~jl*#Fc;ib>W1y+GONwGbF9rcGWl=9DGA6m(crZl zRzhXJ&LV_)M?V-EohKyQ5a&uB=7N^`O-3)#=t4}eWnjvU9j#y!t-E3cn1)+KxBLtSH2B5zFOCukGp z!<)*R$r?Y%32SfA6Wk}dW&Djb8OU+&1gJ>PTz-0va>0MnEqv7p$H>=}pR#(T4Ce$A zI;YLW;%VI$o^<(=TZENiVfr^UGXa}*)M9^3mao>C2vcTZ*7XvS=jHTGDKiL1!K9~P z0;U}B0C|;XP)IIT0@B>8h%SxdS8rex-I|o~JzBj@8I;#XvKO1$e-sD5tM445&T-^&@$HJZxdb2?ppy*$KCsl7yn7D6I-h8+8jxJNtR6+=rbq->ZUqLpS?=&R>;^)|)N zjo+&K@Prhkl`~03Lf3eQ+2<<%Ki9q)FO^PY&o7Oi3aV(|6lB>I~8;zg8sS!1i z4Fv=WyoH}|?P(*?!pcgWV}TvIPnVJ*umS@IN*pU6_?b~`;3ml^t);u{PDEK4P7E+A z3?9MI@LUNa$Gd*;c)aKP&&02M<@>SY#8_2|GeNY19%B>P74i1YXu}D;wi>C z;3XQIwZ!>X3uuRplbD0m!>z(Dog}%f_Rhpe`>7bKUL(1wlUWVIi9QgG&f%CW?Tt=p zjV`ACReJ|@@33`&yJh)N58!w8jQM0<9pZH-XAs^ivJpd_$Kp(FpLk%M%R;x*dk3UH zu^rc_eQRtdxL2o+-XXPhyMj3uVI@AT_Rqwy+B#m{tG14c)(NlV=ar+$GK;*1bPfEf zoDQ!c9nq6;-h}#crGjAf(L}-U!W$}EX{7zb815c6FVKot6x7uB|! zXe$yHR@K*RZpjE^P!Ep<;j8K@9<`8g5fea!&u}F3pwI_s_cz7S+8rVi5s0qKq1fEI zFRGoBW@zSnF9hISnj5k4DX)1E#fh6 zB;fCUW=2nWXoWDQ3@8rODF=h-7amN*PFV&WBdZC<=}%c5qpMb^WGB{QY;X zk9S@pg`&Jf>fW!HGI2iC?tI8^=5;GwP_eiVd;)M9L|YO~o|XstK|f7oVL=WcQ3_iY zrh7c1cIuaWJuhDCm``1a`6xvgCXC?LXAZ>w_Q@}L6OiBh@wdlgo1}DgzoG`=*o{t& z$N&0=e-WR*es{e0um4>9>Fcjm`JH(G!;i<`ZOb_Ctj1eMs!><*)xH!sxDkyi1$Mrc zJ`ujCyWXklnsf{E_iCVrtTSADR71JIFpysda@q~T-1GSWM-o&a6YMVz9vSAxkQo)m zBX2f5VO|3_@I5@@5t!8m)#>dil^B`pG0KJ~CZL_Ek4c8oW$~u?!;Yr-&I@jJEwvPf zjH$>JMRG<0xW+xMl9y+Ambvb#>gHn)@J$&HxiF=>l0#kR6gFc-B*!)~>i6CmO+o(< zt*RgJ+jLuW4z5{~V}8r{%%DSm8(D3E)=YV9Y<)@k{bZtnow$SpoP&*W&Y?deVV7P6 zybLH7Cgg4Gw|BxCUR&z^gvR=IQTHdxH@RPHgk!f5<3dAGV(_q?6FrAhgdn>w!dix(=|q{TCqK9H z&(4V!^6Q?v!~m8US}yo=j#5)H%DV278Fs}bD#qr~q4=d6*Tmh|u8AS<=coSDE*!8sIP7Gi6uDM< zin0{}cNGD<3;_{sP1ku1sae{b^2?#BC|V!tKOwuKNV>3I^(FUZxO2o&`9$d|IfyC3 zX5^!;GO$Uevt$)JG~9bed@&vkMc>8#p;*`Yq4eqZ^a!JUxDt}gSDFF#u(G0oC*H{KZRF6;c2?QG5EOjd75zH~TeC<*{}BvO31M$HET@ z6pAcGOoxr@ED#OfN3ma?<*gBjJ zJ;$pRzVZKO?>zu4xvD$w^YVM0bNA#tqpVR5NCJd}A`-SiPB>s=8waqxYwtRn^owlbiC_!{V`FfT0D&?>C=2DBMw%SDr*rqq?|uK@xm7)_VMb{fW)O2;S69`I=bn4+ z3Ab+D@}kv#=U4TH(g%y2XwpFwdI=h$csNIjH@fDCl`oUX7(IDiH`1A4Wa%2=l+{3C z3N@X~`IIx$&~IJcY42IzZ427Tr(|lYRE=<@N?tW#4ALgrq9FGoLf?dTDxJn2N*Wv~ zglEPCqow_fmU5<`P=SXdmV&qD&%|}OF{XP`;T>lfH_Aga)6_ytpc{V;g50``gf-RY z>Qy^=_b%%wR_#-ZkF{ebM^px%xswN5soF))ykNsK1^dRzrS{e1*V*FnQCqQVOem+V zRqZ-9pSHERtZfl~Q{W2`bnTBvKwmguID-%PE5vE;IKjYzeJNqUujb$DIzILV&JUt9 zIi=#PQ(iDaKGhtvLT$TGoAy`kvs!}>)hJmHrF_|4DlLTv>9UPc$$)LHe6zKkYS*;)KQs!D%tS}g+G*(wA#+4^ zr947eyy;(zqD_b6 zPFODoFnKJ90Cp7F-g2o1fvk$O8dj@`0dKIJI#0Hsx&iM2viK-fMh3{C1sI6cqLp-q zzpR~1<$T&AnW$J_`D;Gy?9V@W6~`3}!dgrh3#x+%{#6rI!ytlE2yi?OENg^i@OBOi z8mYVuXDgLxUOzZ}yl+&ngm65yg?eJ~*v7V>(0$rEs}HC> zv%YO;%>^cc5aEe`$^K(a8_TS;vD}+oIQNvkIrr^f?orUbA2*6bh6!iqdnv~l;0byo z7S^2I$mBdPEMBdPa>i@VA{-RWvt6c`S!t|>N%+OWZ~Sz9t% zl1{DIl98ef4o};X;i3)gp0=Yl?Y8#mvWise;UCY6SPu%9zTgWyyi*>3_RYVBB^037 z=X#H`Q>M1ty4l^9km1gI!_eo_%id+%R}{=TQugByK5oDMmAf5ZrSL^UnP$ztAz6LX zMA0T9Hmb?6V~V#f!x_cMegwWd7GXjLx&*pGrzj3u2}lzIVc~Vam(nLr8v_d1SJz|w zBvrTKlfFV*2$5F&!RswN)Aun%KP#BeGh&DyDF43_V3@k{70nrQP~4}L370J6*)$l$ z3oGN#a#$K>{u-^W!X_x- z%ZOmA9EXB&jgyu3>1Q9?-)jmO288LtR)eA8)nuRV9bHc%+yEF`1l51P_s-{x-F|2R zoPd}mFbzTnm#nvVqb#P~p_A1?jx$2WFCyUnV1nuj-W7vZ)kOl%_ng+ic5C!Nz^75w z9@R6OS!LBkr!!-|HY+Rf87Tv?D^q=>QCod*iBt%=_?Z^rv7mxhKRkPeEpGM*SC~3s zU(DWZ+cKlNX8`+TsZv5?&%wXf4b;l(Q7I|XMnZ-H`0+vgbk=s{-Y#D3Q3~M~)sw1^ z*~0Sm60WntB;bMpGMc@}KZN1msdk#nGH;AoclCN%?B%H4!BfTvLV%+{T%mf&;W|G1 zv%mP-(!gT}-ZXCOpWbGtKDINYgPve0e0?p0Plbz{bkA#g^a{%OnQX63 zS>8@BZ5JM*gXsLNz5#pxMenfYpb~YNowRM6edO7WfkNrBsfq_p2it>cKVh8u z=0yICSmmlf@(Zzf{iYTw65PNS-02^%@mKWZRCymL0psa=P5}dRN*F>*2tZo)j^0_g zMAvK#KnSewWQ`!cj+o*QL0~RkZeRc+kYv5qr);o#ljSR8dp=5_4yvaS^y)}409Yfy z=MTn%0Zixf{LY_kVX>-iJUeGn;dG$2$IOV}fJw0!`Px!7%>Whis!rcDK*HZWKV3V} z*AavPsBmbusLbFw%QK+;)S+|i@y^{d9m-iptazDL_IrMwRAG@4=CcYZc^*qTGWPy6d#p7p z&O{-J&)k!dXTqy%2%GROH5zC>Vt|1 zR7J_DLfDClq0hdUiO4uy+3>XKGO7doT7>tq`~kLb6#aPT_teLC+MDm&Y!}?W$p(g} zJh8V!{T_Qa%q&5RM!jm=lAShF&)Lf42;^3E3A=jLO8cXW-eT4xynB+iX4h`}AOCcV z9sT^2Kf{M9d0)VxyT@gq3F%Z5tSqPgC7*ZGm z@E?SMy%Fl}VR=U>07HhcrG9|xTs6T15gosqz&LkY1+iR?$B`Qev_ZTH%x^1313=Gt zx_J=f2qlnxPac5&g|3uIeg0a~yfohbsuLr@`z5;exTxH@^onzylfgqiAHnmgBMgY; z4dlgHX{7lI8#7CUg|dUE9LsRRZU*2;stX z1RYD~LqtRcKSdwH1DwNIod9FV^W{^3*~W-M!8LRih8AMi`$_`|F&u6VF2J}5BKN2m z7|o1?o!EXz1H|74Gx%_c0zxG=Y8JW(%yn z{w?M47TQSuZBFCv@h`8EY>q zlKv;JTIORAgAzkyGL!|_>A4UcB${PJTlN~*PXS--t_n;>lvF- zoAG{_%1zlaDdcszlx>s(o?=rG_?Ys=k5mDx(JS1~!Aq`5Fz-GBh3+2^=t{sdeP543 zjXGz952W-}=*%FgSU22At80J#3S2@d2M>Jgi3UQzUmwyPyz2yaFPJlO#nmd<`!8%! zN#`@hX%lI5cD@T`#=IUtdEKa1i<~AQj{*YWDM$DyZTa3V;|mdM~me7{?b_;mdmJI3{`}KDi5M7Ja@*ciXTOIEwbeORTIHf zA!C1g`8xaD`A4}j%%+k@~57(w{G9)RfkulWGDy+K3YKF1G5Y4 z)^6CT`qUe2ajA;y@^&kt=hd?%yNeGw zr~y@;5vo|u^cmh%RfaZxC>}AbAsrqtfI;BA;>rYCNA2AU2&cJxxFk%gV*btZsPMv* zIUCLJC7?c)8N%j3ZKh|Bz##yeO(V;m8yRA>jDc?!B}k4Ug9R+4!-bAk`Pd}G$~%`rr=6|+ZKDanTg((-^G z_Dv)3awv`!%Dje!uyv)&A%z>SY)0u4=37PT%#KyQsRl|}N;a!9(utf3N*Zsm@(OSw zk+qgw!hYtoPHQhHUo4za!otTDyH7vkWgsv@t7)&apL?4hz3dqKy`MVG9#}IJyi+-v z(lb8Y%(cmr#f!x|Wzn&R`yn}l=Za2`6!e~hIHgxQo-%kEKgbuQp-hD}<9o`E!abem zli^cSd*qqEm~FQkx|Z2Bt!u4!vTm!(yOjVzDEw%$nzS@EZTFQ1Z74M(TAHohvD?0K z>{_d|s{b+xtK?I57eW9z^$an?t4_Byd^kMA9(FnI`5_w+>Q%?7K*_doTl}01IA76bv zN8sQAToXPOsc|=_faw_T9J=lZ9DyUSFJL+mWys_+;JYR1s3%(_`@1!I5O_Qx)Q{)a zQdq6LT2tOpxR%d1uo=Tu-r4&3Q=L&!_eLG4iV?HVPD{tztp>~ytSFQH&>=L1l z!f4P(o3?Xx*|M;Q?s13>1Nh$NiMQ4*N?H**;!kc7;_Ei{=U4_cDe7@j2&%96}DMVscyZa zMZ5LrWyYpW&2&>rIBhq)X^oxx;1=r{W9L2nF*AVnQ#mVAS?iVM^f-!N;h>;i5|XHT z{V>K{#sU~gUIba^{<{%JzZ1C+@ZG^EQgsH!P5&@UlCcpf-%6?{+@t(?6sP)lETWE7 z*@TgqvX2~x;=l;<*Xrma`py?&xrG#gB96cjI0E|zyiI>)gc}Jop8}M!+Md5yLYEJ1 zOQ18jqHUL1G)8frY#+Pu1g=e z_o+!ZT$EnN;tIESgAg7wM)?R&H!WV@l z!K-9=r1;Q?#PG$Mb~(un%hoFLd^bpLG8_@G^5*RFnr9t_osFAsvvEM~WhG`OdU7mW8~??O`DXb{7j|GPRR`0bgp5S|He<-%wo~CL*-)YsK46PzQ6me z|FE^sji@U6G|-XFS@1r$Nb!DbM)YI~z;^;`iX_nrX%6VFuviI)YpU0E6b6L<0X$BM z)mP|7inwkC8*aV8s_fPzf`s>N6@_qDJU3p3aK^Yg0*4ktUoc)m{~S@kN8kv&24K1p z-N8a8Us;ckixq@J&L0Pl#>Rl%k?Dz#Jb_6=!k`#s% z;w{H5vj047ncXUn*W06V0d$#v(M8@Jf}JQ{WvSzQ34CFdJX$vccS_?Wp&-5?kDuvA;g+B>RUSJjt2^Dm1UM zGStLv8EJJ8S7oR>uUl>0E+YNSY{jM(T5gn-M7)Csq(-qhORR+1jy6`f z;ERGr2|Lg~^NFBq`plPdiC2aT7hA=`7K-pDI73g;I5tE?{D$EdYB&Oi7NUMo-yBiE zN8kv&7Lb6$^JPmpRu|*xGOde;=t>#kFO7zxoYMlzORud#)s7Ta#39Z7uk=p1$dV?DBW=8zz60zG5NDpr!(oRi+b!w`pUL` zAybzu7{VAx+rOW-*gk&2(YB?p&ENX+#kEKTWCWo0`EzdY#)Co`pfGh-6BLS~)vbaO zQZ`K~U=|6@Es#Qwke+*2w1nyG3OPFbnXb+#j=GG4xDLU7mGC?T?5`$r);%->XX5<> zAG*ix!6R>$m2Ogb#SDn=LR3NA0B+zwl_Mg-AdM>#=PU_ ze$2L?&}z*d)sz*T)p*`LUobXppZ$d|TIV$1Dpw=v2eqGFnfM^U77^#Kibb1M9PO$w zC9POj!0H3kBDlw1Z#*6CG*F-Wwc=yoo_5xfX&cF1Y8CcW#w};pJm^Xq9T;)x`feL4 z-Jp6Z>P|dh3@`Za2plSKV_SU?cs6IL&bHG&q+svtu);HR;t@CkN8sBb=+uk`kOZE7 zH4P-5U$UWvZvukcBuq+?=RGMDX@X~`C{|Q03K1@CwXjvxPSId+k~ z|9$89bn{f6719z2Om9kQOO3faa8a&$!xS}gfy@9cN7*Z-HyHUL9WW{Hw^&wsG@kOK z2&HhCVh+~|=i0qyrr=11VjwKKcBQOqpT1VHzVJ%dz95UU?$L8By7GIaWuceCQTj}c zH&N(p{s9`w=e7pQX?__j>T)k!eZ@{)sux9Fk|%!W*dn`j`x-kczuRt2FSk=t+icyo z-S*|RYvci|-C3znI!g_hYRlMNXDzb}Z+gmd;DKVrfJ&fT8`dc*9j(52MBZ>keH-X1 z+*LKrrVLIoZ9RxchY%Lu0T_0bREzD-Tx{i3ZwQo<58Z{u75XM!-(iE5uS;Q+c+*B*Zil&~AadbsqMg#d3Fnfn`Vd8w~ac!~Mft z8kCd-9rq|&AdV9^&4qJjfscQZ4SEwN1@0@91^$tPXoC@iC%I9^qK=$ZPVBYTQ~PY=NqzRElNZ~EzxcRadGGU{Z+lmZefXWn+Bc3_?0oCb zcJY|`qyM-TguV>dt_L^-?Cj;6vJmh5uRzx+y5F!%VbWr*Ky@(vtaSdI*u#`qo-WTK zeHz-mV5O&672il0>7AFatkP@h%Z8|M9C8En$R%%HG;v$s>k zO{u3MR2kzOfLK^lr7q7F=zG;O z^Vf%X791&RSIRXh8b12%=@b?#;ux3sBDQ>;_B#A}E|EZCH&M- zr|wa;%Byzz{?oz%H0ly2_e=49wpw&FYW1=^;&}blMnya#)I=wcWP_K4+FbYdxI`yZ zGV!S%8%bX*l4LC{1Et2pc!7UITYXMFh5FOhU%ksG9w1jnW0SQ9D0fI7lj#T?I)EqK zby0sDc?P@}FeczqSewNxBl$CJI=vG9wxRO1mTmCBNW_!W%1BVKA-zjR`QW3$bmlvix&P^nfduD1g%0L|C7P~ThuNxqHL##w!3F2qIC}1G=fajEN zhE9?xWcZ1NUMb5cZAzXl-cV;YWv4GL*f}fm*3}{} zm|j8nO5#4XsMqdW)o=H%?6Lb+4B20O_HH}%xgB=(X)En-FI;Qey5+V3ps2bXWk)H@ zVz@HlHiDP-WgO$3tvjVhg3tz($nBpR&F>@!t!u~H>_h?2i`9p z@swI7r5qHn`h~O|4Lkd&7w!L6uD4IV^%VQqPn>SHLgA28?eX2eO1em=>|-DNvYmAQ ziz*;If^ZMki6FeBu>Vzt$sLVZDPRyPS(Ofu!mZYszm~F$o)r_#oVpvj%3n{k+1A`U zBzG|4FnIu#Nje&*{%@^6Z$0JPT-kbdkD^~yKfH-DN01$XLkB+NrQV4Q^u*$UBMNvv zIKyfHxKhzS7CVe)FZX5siDt!mt6#N3bv#V%Xuz{g-~8!W2>ZPZVR~KdSCdd03|=g2 z_9dQ8uC!`eQbz+k+nDy(X2O&f)1?wM@D*nE8wg@SzAu=I6AgSYMfcDRfD=4i_b6zt zS&UVc5M{cV?IGbCHq{^}&u{UBv5*nQ?C+bxH4^l;73?e&@A87>GGXu{(5Iw?KX>kG zDcR+=rMuv`oc{c%{qeuvZ+EZiv5#JGoNe#PlT-@6rmkZj=%C-cV_gCGp98%K#P`5U z6ftSl$8Mr3oE@S3qar&tNufz|QE;SyUD^6>R48Bx|9HCDm9FCE6fSuprOP43YjveV z0lODWUY(_Ud5y^xH{~!z1;25qXm1WU(jO7ZH18!qfali{dBQ#=J)`g`<&y$#PBknw zB@`;+YZh*a*3HFD`)J>nY+ZWPuKb<%*yK?%43;V%3$j#%v%Q+yK0a$#U-~&~pDYUp z;hm~WH>$r_pe1F>XA?hOFWHkiYLXjO(GFvb#aAfbn$LPj@v1;PU}#-c*zWY1Hk(=_ zTvUlFawVLoggR7ri)6dhKlk`7DPcbo|#;CmQQzC1G$ zH4r?aN+OxF?YT>>m^sQyiG@~457=yarOhN4Tf1#m+pDNxonb1d_{M=)sqPEr6z=@9 zc!4vXFJ}%`5&N|iEQ_sDGIH=;UFAx+@*Q4289}%9<^kpZuhTV%=a8E34NvQoi_Tb6f(APMTcE< zos3iZw93at6rnz0Ed{I3k5)h2qu89sC@P`K0s zEq!)M^|n@@wf^#5-gKhVJ|!K7LlAtGUf0RkQ0K;VLPKj2Df{@HOF4Hm8A!dZH#9#EuEypjk zpZ=wD?9O#VGKRc%SGq7R^-Shb#$XYIyYF6=QW*}q_9*&Eh5;%7Euice0DJe|-mO>h zK0Z`%$g4&qOL7;>!!kNhx@a>gQeC@;ChgXAB^-{hPbFFpEl7I8Q6}W$OT#Ew5Q-JC z>XFjrJyup2`*be#6RwjZLpuGrbBHEG6Hx_96lEMx3U&cg0VrS65$B3HWwL1NAK9*=A$CK> zg|Va_bYp9|QhrO1TPlsiN+6j>7!f74bZU>>85oC1{IlLLFgxmS@O} z!8z}jXUeW)gm0vLy&2pS2hC8lC{Hg+XD?o1+;i=US*?i9bBfm$E@cJp7sbfxV_qjy zQ|-}~LHi+l-174JzqMk}tVL-#QhSUSlb@+H@tvZ>?>(Jw6&RfCMN_R0q9E#Ib8>UWHPYF2u0 zKelw_UDXdKQnY)}Oi#LC#ZaWm zNU^h6P6-9Vku*vi>W{RQ(vUp-j{qE_%l$*h%j-1B;&!vi=k4MLrtOORChdmx8JlX8 z&}UT=)5|H8u9R;|o-RsQM>0Jt{T6h>_Fa@c4n<5jY?G^;OF?` z;pjq&hWCFz`{p(FJ3oAiZR?S%1rD^u4@W8-bD$f)2X9Bv@%Qu~=aDL#8^Y08s>8F; zdZodHKR2tQ>!I-f>G3F9HFzf`8r%77x62yb_s(TY6ttm~dE z0^jo(T5``qFPfmdNp*^ofpAy4N`o@yj3*o`X_$|6(c#`SOrf}DrD>azJ$7O4Ios6M zY1@W6Emcr-o6`A$IcTedy4x<$SmG3r@%0fwk<1%^0x65Fm8aEug zuXO3w02lC-4l!F=$~$YjEnC|rPuO3RK}*FTi6+eEhL+>X1$c`XD6ZlBIX07C;l#YTEZdfV3dsCu|Pj?FZ0|?~fUdquI;SlcWr6b2N?_D!se|q_` z@_zZm9BEWmKw%DI;Tl8K0vEPCHW3Hvh|aXf3knL?7yMv+sP4enAr4SY5#_mI69~C} zxPuib$!0|gprTTxB;*Od^X}dDp-=Dfq`&tQ8N2o@^2?*;{Z`-5rKB2WMN{FCoKd~X z$6_sCutm9HtHh?1DAT>ZBDyTCHr;79-fxMCA!|-M48lP3fYsM+( zUI*Upniack`rMptJFm@}$0&T2n%1SVW0L8ols2?=+`jzg&w79IelNf~yez=6MpfOB zvg=Yc`%<&)+=v(KZ4u&3(0d;W_#exX_`EkS>=M&fLYn&F{hshk z6tLO}@IQF`iqfzTQ_mH7b$s2Y*G94zD~1PMl3pRT1WiqfZ^9N8uT#6qu8^2EJy2#^ z(bH~!bJ=>Es8ns!7(%;g509|oT-Dc6z6pDAbi$@3K*LTy;n4tOo~+gFh4CqWr30W% zc)IK?gn&n#(>}n3mEz|MB*Kmx>a`S#KuQpoYDs68b>!KNsVZgLF6Ek+Qfb)IjyCJe zrBzqW_y9fvmUnh34@Jr@SI~(b2dEj5>Pmp1NSU)wFVoU|#R%_`S(GOib=c?5U2E5z zx-95Vj0Nyj8Lv*r(iYlFZ$*6_0{x8Q*MI*7dZ3&`GLV~7yzcp-eC55mvXu5giSoRb zFz1Det=&9npZ}xHuD>V6CYSw5!KMm|_ZMWPh?PE(D5`40P`H%AS@#K!qR3Ga3gRP^ z_nQh~O?kpzS6MV0@3ZFU0!wT>#+omjYKf^XYZm2pR`ODi92jQ>DQJx~^=qRcde%_5 z>Kpfv)h3z%9cZ$~W>DN*>rgczoI`2wjHLcBDd6K(KWapf$uCNmJR&s5vtAyw^B9e#Ha|$(cD|5 zgqBN;Rcx?$y#%WiEMiqc7mKyt$k}kqWs(t{@?H-A_k>>}z#|15a0+;#Jba*u4&~&a zy!?x#w6m6Oj96#oae4e~+RwV(X?gt5NmztuWoo=yi$IxI{_6m8pD@^I?>T;j9W&Gs z@I|rfgy@N{F=iA=Pe^^}tU%w8VvfGLRy?{|YG= zR!QpzZP|Q*I=yck?>#_WdxQ5M{6?()ygp&+MwU@^?2@uo`RaPkL(;> z>u8=RoYtt%dK9L9iWo^ZW^EG{`_J<}Y26cy5sC>5vp~bYiX|F9lT6zG6P^Zn7f#l;_#R!_Xly>mjj=Paic6st1{h)J;bu>jR>jERzAi6 zp^qFK2u#KqvWSpOeTP-jOEexkY+8!AP~R-imL>m)FY%^EcA@ry6cg_WcO3Tb3HtyA zC)X~5xk06SDP0%J5>n-~Jm1_!3d>riF=2z{>*W~^t8F8eQ~R;dh^6zxSgjO93ymZ9T0)5ei38;~6s|+w)Tg)x0d= z?NgU?v2aM(TOQhGKYzos_Lhe?+f+-=w)XPw3^+vwNK`HcBmVt3wce_YUQ#hl`JaT%JVopaN(G76MWWf2d4EZVCJhhE)}EAb{}BPXbYu?4Sj&s+xcD8v9!Dz7I%sPn*p z88YgbOs}-r>@q8*hh%fKT0t@(%$^;19YLL=!lG)e^-Z$fc~7|YuzpV%;m#oT0Uj$%7p6!ZfeedErq_1m zE>_yCW##$yS0&&Y;ThF@!H%WQ&P|ktm=5K|0^;?7KWmal!0O?Va@p?OvfHkCa*N%w zZN#1)nYCRrvsSKBf5Y0Om_tK^5!z5^JRDaR>NlSGN~9|ek3ne==E9w5jQh~z&_jB{ zGwWJ?R7cQ+lzUpkg=ptt%8ZWGje^yux`rwUz>o(zQKvGoFbBHv%vWuylScQ{TT|T7 zc-cf@}r9jA@gEnFqF)v{DN1wUde)a0d zY~7YIJ7&{_U3vG5HZ(kGUq5L{=r54>V!<2iV<0fJ&G{v!35E+^F@^#7I8IG_>-`h9 ze4D&km6?;H`rP7Hdv1liQ6Eb(L{Yf@RVWpxdz7yqC{&*Nt8Y9UBbD%kG@J3k58jXF z8ckPFxDH(>nle;8jjpAa6U(+)bNy{*Z~L;@z$SloY@_{RYo>iww~VW3E>~xipR&3q ztb=O~#-=N5?&Gt{rkU|I;Q~Ii;09PxksS)_7TTSnew&izb?@}j$$8G~*<4GEhoq{8)p!Wjg3jPM_#XSiLlw<-0yV)wX z&??y$DRH1EJ=f4)S%=|zCv?@6;p@zd%}p=Ij_|RG=m#eN{e$=Np<@(--eWL zM#^`n^mU~vLJ295fIH7&5fII0R%db|0|M0!91!}#MIC{B<5?=Wj+Tn{;@FhkyM5el z-mt^2erlV2?vahU-fnkq8MV7N58LL+sy#X~Zo8&tY^H`MU9?jK~%q_ zjN+vp%Hf?=8FU`UwwhADQnF1~ylB}rwM80E*9j@&1nUy4Q}>*C_}Zp^RUJ!qTJue} znw|DdC9Rr`446$Ty*y#w^`#%&UW=71N||dZK@W@41aCJ=4=;eHt}$&~Dbi48%*o$f zw`QN(iZX6j-n7od>(4>wiH@AT<@y)A^3a#!Me%tPMXcMr44ab9FUbC&df%eb^NOG7 ze_aMsmoxu#<$d#=gR%S>R?I9`*=)Kqs$wJ>$)o`v$`8FGEwxjhTwIOf0+Ncdwu9I-#;g^z0Li-e+Qzn3i zX`oW3pCwS|o^`%Xh@Z!Ld1wU@&Z*`z5=`l%Kqa*1*UMQgK&Wx=+dwJ}9%y(bt9D8; z96!j)ZS}4C==grQETThuCTXj>TGU@jTiBYn{#HCJf$C;L9$_2T;pj-{`HJd*mCHZm zAPO5V4rPo|2YkwK9z7cJcvE;>DvLCpN12^>C@A6&@Z*^^<<92wcHgQ_yXC}1cEfQ? zY?@uJB2e_V0VNO)&R_e3uiD~WGpY`H)udnCq||jtdGY_g!gluNg$uj@zzgts)W@C> zJOFnyTT#D1XXX`~_?mF)gAd~~Gyqq2+JfdhZ>LX)Q-~B|rz|K6L+*u(@Z$94ecBq=Qt(&kfycpFd%}O%L}U!i^#^oR`hS1ZCv0frw89i31142%_*+kS)Sz4z?fz6o!!Z2r&(NEy zg6HLmuk%dUJI^Tro%i)D_~qc0(rjw|DGIaB>OUkv!2YhbmkvD>F_^GQVR{WZ4RVKg@Csl&7nbpWJsiN5 zPg>sHE*mV}C>(`9JKbQ3s@-@byc)p57laGD)4<|kY81~bBL$0+8q^@4w!!kvmQz^> zaK2jOuN$N?Hj=r_Dw%Fe%1iE(A}iF#G-xz}MGq9q!TO#sgBpPu-S~-t9hb|i5E*u2 zQEeWsEBd;e?6%?D#cFrXvbACBFW;z8ULQeZBZ=rurGyt!Da%Ok)Y3IesjRxZO32D{ zJH((rzmw#mjV$I!O3<>&JgY!`s`zjQH3a;R9qe(T-ma#s?(KAy!Q%*Mu%xHUx-PSCd(Phfg=Z9i%t*Eu3m#(Y{dw8B)Y=#1zfoJpb7T? zUC$Re{FR(T49*ySmco>x8LD2d8w7%I6LU+oh%uxJ)pisH9v4=quV_`~;QQpnke5io zc4>T-ZLo5qzkXChm?{lQ?NGfZ92QFKp}qH~PH_m+a7|wPkE%gQloP$Sz2)tS%xa*F z2-h1GF6FBM!Pbe;CSKv|_|rZqUiKIUU#A(boTypQb}GACN?HO>^h`Ep{HsX_j^IU; z;_wAGK!sykZLUYcz>N;k27!kGfsw;|n!J9bMk;}5Dmt{~bGE9J1x`sD>d0BYyw{{8 z_wfT#;OgfUyc;YD%fh2ZO#+AP^pAH2pJ#9p^T z;s>$u6=6&CalyFJ(EJ|ig zh@YpV8J{1t#C0cH^SOR^vb`v(7Wms!Oh-#8^Ta~BBeb8_lJI^3l}jGv-g|rQw)eC? zV(%RKX`8rIUiX`Y_d3`>x6DZk&r~!;Eq(n;7{0x^A+1E zL{Lf<$%|O&LLvXJYxvPuNOKL%kR{%40p?%F3V42)1N`Thg?`^E1HbmuT>XS0)za~DEQKkAF1BK5S1qzF=<7e#OFYrv~&Af|0{x5U zzP<1RR!_^@tByHyBzY;Gc!aC)PluuZ62|2^RmSnRyS{4%+N@u?U}1NQ zE$I+_#dpqQo)ZP5!sH?F?kGw+rZwd=KABxWzkF*=mwoiolkC1VyaR)gAoZv;|MuaV zZ1tv57vfFP-faU}yX@na3m>*>r3`3C>(FSi_e*%>73-dO!cfQ_FPz=|Bpvm-A_f9~ z?F|8Er6(OkXs8^rR}@~>I4emhPZsQ*59aOaRJ+-oD=hKwQfp2KH=mA<&KSux(H`Xt z{RmTyelIWB8>;?FD*R_V@3o)pzQaD8xX8Y8=Fyh8Nb#pCJ(Cm#a8^EOtXpvYnLoeB ze&NsW@YeeCWITRAeSqnK(SM)h!{^exjnBe1I88htJmxE46c=Z2v-*zmL;LqYd{6zr z-tl{6MCkXi>^U}*S?l3BWR;+t>UP}t@I!C;b`N_wfb6t{M_JqQKcuqqQo^H>v)79^ zc!NZ^B0H3jwFKx545yTwI{#|c_Yu5w5f;kDyH^C1a%Fd;;lia>mFJt1)jUwXPQ;rK zaYeXD!9r>lvVEGu)VE>fXAlhV?x8w_h`;`kX>PV+VzpJ%1$p+1 zthM=~;)SCS#2c-pusD@RKSY)@u;LM`Oy|L_`NnfrOf3=vb=q`liSBoaZoKP=ki?X! zTA{MR%9*8BOSf1lu|ibYY?%ftH=HQW_&)4(8x0lz|9T-{7C|H+-D~o24fd#y>9d** z+K$2{3Qk$BI%$K|uX#TsEa_ut!QvU&B+4PKP&q6>@<$Y+2UB8{7Pet**l7N2IU0+c z2l)Od)kB9yvQ4=&@`SgN@UVuMdcG1~;GE4$S{GnYH>h5}6+JuzzHnN@BSF|gQ@l!O z?~9c<6Q}f3mAdUNR_(dbiaoZgZg;;pZMScjvS&vdHlc7l>&_O>EKgZEbaoPR_Hl%I zR(bS;6zYPpS$pSQFWMQ;4BPgew(u&GP^ik&e(R%Kgs1Rj6|j^`N`kH?Ja+W9+W-8? zQ-u?XnZ{sD1dl%k$JY;VkB+!3FruB#TWP!e=I3nf#&Ia10}7dS%+%~-KYX0pFTtw* z_ca2dEYu}WIAnNy+rjJ_E1-GxET=Q8ojLQ!i+Np+XyH|S_-BcD2T0eRhP@%lM;P}Z zF5&SR`>lJM_RE`!_Vj{;ZLN^M5N5q4|J^1=E9mU{UTySEW)KL%Eae&l87JCl3}0S& z+E!V`iFTu6*Dq2*ngg*n>A=CDJvSR;pW09s$oY zob$YMx#w17SAH%J)qyhMGf)||Dcjs)v&pscgxjSY7fC^EwAu6uo60Pc2e?oS(kX@< zQ=1qRYB0h^_`5*VU`#8#(0IWrsl`&Ttu~Wfs{1X6^gZDq{OOaZ92by&p)dw8te>)q z+J^FFH7eUn4)C6@3PmjXEJMvGQscdzj1D`Bp%A9-mx)nE^dy8V!2Jdr} zd?*6}Q%w$9Z{ zczbotT9SE6_uCaPN;eKe`EpNLu@a6IG0K(I(I{bgwUJUzpgeqqw9d&^m6;PMRaP=* zH?3;1AAY1{KQ=sSskWxwH`c4Tv?WvO_X>P2iaMQj(A~NUiZ5!mXyA%kX@0!pep{HF zwVuR`eWh}&O?L}V7N2#A_uE9@jAtOHvL&pXOWT4iF(& zQ{orQbXDc?!P%iCWG`_sgsVOG0b<2Fr+{PGz!B9R&f(yZNn7=4$wpSRPx|_nj@mQU zUAaqf;vdmqPwIUfDi_y{*1!qL#H?lOa(3iZ*HQ)lq-#t4d8L&6Y|_Vg^MMEb%T`{> z_YZvAYeo~`s5zMBKvZ?HeHkCU@ z_DzQhs;Tpe-W9QxGxw}BW`IL*pg8^22;HV^)(X|FHl1E3h0 zL#3NE4%o4Xsnv$ny^O4FZ+VA}r_YwaW)4?>uKGO=a04V>}fWc zJVktgC99etE&|$xbf^_Wt)=#W3%0`{Q&NzohoBqK#scVmoM7o|xh#wsEr>w4&I#%Wy!&1PY5^pQ^KzlT%Wrww7VRv$trGrmO4--W zTW;G2+LQ#ZH?*I#^M)%{3=p*UB~3sd4DWBSwqj_7R}mk^VydZ<>XD_h zTFPw5y}e|;s_}-$ND2si=nkgV@$39gqbef{E!Ws?C78p70&UR=5Y8AQ9C;~F_=JH` z&(vk<>l&t$;N!VPTWy0B_K?*wt%vkIVHa`qg)3hlGL8du=RMzQvQvtc9j?-0+PQLr zgh^4J7)k^2%`9A>?P$3|sI=&i&qX-JAbFjR0{UE53Dc2?geK;?HzOKIO6!X-qBI(9 z)>Gm0X_RsJf=@lGtU?_9Eis*VPdUtT&{lDU4i-zHIMtC#AYse`9K7Ik z)9S2vMzM-+cnFCk&(Rg1hDN9-)#8d;wbE_iAv$KCJ!TM-g*AvpbNiOz7W>1-}r|IEmy&tQS)_R4`fv4H5aV5;r@2N54;g@3<%Ru z@rHOTl&CiQ5h-F{{jGzuE7bYt`ARub#tB_B741qmI=l>>Q;OpqWYXXnr}8%3nzuVv zcG$&FOxkgoQG09ah<#;biB*{kWhpcrAw1nEVrrW9G8XuV1Nf?snb9~ky~(GbQ)*;q zvt<94IoX=MiXTv_E_s1`vXJ+Jl?U3O+(!r7?40YKx9;H?jSr0#(EtP7<*4|;H|kLO zaaFZV>HSqDco71_W6Godx~5#tez)g-FCgC@1*aoU?{tqqW0tmt=d%<=UqJ(SlRBfk zFLPjgDxu@Xk>E>TDl3(kvApE$baI6?vaMEaEb*;u{qdX2Drie4{(b+zJOvC9Sa5Z@ z6lj+e42y=sw6kyVr%u?NKgGr}XGmDfiWGz78k?-U_L!8<F%r!2Dy|&+KOt|$+{2IgbY0QL>U+gsU&)=yYjH- zmShucc$URaOe0O~pBj_eYOTNM21+&EVr5$`(I8K_8Mfym4ST+}9OUl_2j%CiAC5?= zqI`MJcUR#OH?p#|F@NUEcSe0$PWYp2Ysp^Q)q;1N5x%=^aq${!uiPg?>`{5J4?7(? zY7bg>Rp;s>*2R5A=kh~pW2<8%|-uP_`~Wb>g3R2md*dp#b;-;l+e1f=x=!c}tw9K7cP+tcB2m^HBLHa_ULT zKw?DZG6_3lS<|jKx?u}M+W%;;*octXQL5QP!)1G9vLgO5TaXWi5R$sV`UT39x0bKg z?BcsO+Eh!{9$D2L$xx6D?Q(v>Z$=3!%o`lRyvsRYQx8{6f*_OYwqRG;-uFd5Nx3Hv zDR?32%NHJHTL)Vdt{ATi;94o51&30HLpb~oU$$cBcI>dPZd+2^)yU?fmgMfc11K5+6sqdgb zF~&$m;BYZGg8yXw%H2s_6bEa}krjskJ#$!L9j^3ym7%@D&3^e+F zf>dYQX&-W8C-V}#7h5&ar@rA6d^c-g4?7_t{#foLo6elzor_1@TfR}k_X&AWwKRH=Tc!vgh zLEibW4U}%wfR|Y>yc!aeN}~V$wj+P3+MM*MX}sfvym*EMWu(LhG}VQVaCLz{H}F|- zvBhSxGA@|rlM>*SCy>b0My;=Qo9M)|^aE?(cLTr>+QpdeQB->%DB~y%LfM6kxSO=1 z2l-K`&=;Q8nS?zqCH$?)Su045FOaiGeLR2V(FPT>(C6%jciO^{8TD!E5d%<$sE)UoXcIC0B zwGFFYIV0P(4r{BKaQFq>Ij&+zmWpEG><} zr=%=t&*>Y+tT$V-b9$tNw=S|uCG3H~v@^S1x$dROYQK}fZQF$HsJGkCx8Ch#kmyD0 zvd8)sSYn0JEsz50P=95h3+)U2O}>$VcKeZ!^QsT``cJgt*Z>zWg?J4)2Wxy*u$)>T2c%8T)~I5kUz~s6 z;Aa74h^XYPrYvr}knwwcsQ@n@UlpgiFwo-plGn~`6h1O1>JD$Hlu+-U+o z9fXNC-Uo`KU)*a~9)G+j9`rRAB2aks6&bA>eBH`R+kB`Y)zNm=hgf*ED|?xHzHG3; zyRkVb)^r2%nN>4GwmW^Uu9}u@j`*u8+4`iDsR2`~k*v!^t@6qQ`vd1{BbIOOk`h`X zg5`asahnv6?^+Z6n2JG2(WOl12CMSmf-8CNDB&)}OWk-I(b?N>)?Bh!DKx0*X4dOiYL+IApE04Wg~^5i`Me zulGnrN)O8N(z`CD3=6g`dx7Lnr>|xlD1A+B#_-TUWxxolQli^N@)v6Wq%2#Rkav8e z+FNv`%Rqn@&g64_#5ukOAWp(ME6<8{Q{taVwP(Av>AtUekD__kS_A1-(C~1B{R^}B zEc!(EbBbAK`hfrL<>{WdpgQmhh-DEQN|#XOOUdvNeb+Ba+j~yQ*-Cl5>14)UXlvMq zPHEV1KBJ)q-_pO~jIc|TYgU%W_V`TM9++%cPJOy4r;#P$R70aXPp53%#xd)ht=JtW zETlHClNH=P6|R85^REIt9pjg>oA&-MK4i-_O{)f`6U8U!ED6k1qhTL?&&f8`Ca=@k zBk;(4;BG!kgpyUR9|HJ|`dl%D7*rGkWp34W94~q0fY72)KSGJ&r+B4}M`0q3H(Yfk z{H>J(cGUK1TRvR0fqc>W(q+44>yQiy%9QX&S*u)MC`3JuwEj_^g5KA5_gv6Gy=YhW zpAf#5v`9fcN|23k6&4{|!e%?Ow&IB$w(_|#AFJdKwS_lHkc~X^AD2PAN#~kBGgT_J zDVXvU2QPS$^FU!Le|}iZpRWY0SJ+Xw(q=R3q=6*^M~?DFLE1|4gtysrYK7HOtyWGikvx3L`IYZELu%UYqX$~4y!qZSh5#}N-3s4M zXV%C_SRy=!bZ)VHV^aC5O2f<&23JG$MJX#U{B#&WVsZa(Hg~mMDE}4Dmucs(N_kF; zV7#sXt2b>Vd!ZH6i{;@?+0g8@>i=0?hh_0lC?%ru+&A0Y9SVhr>Ht>GHWG_$d*Nbd z2DUegU+#t)5C{tsOC81|EG%|8cz}h)rXX|msAFLD(cIZqO09OB!Vu68CRT^F)StEP z(jERxi-GcT5T4aAM)vcba1c{2IN1eeIDffSrTl#HkHgEC|H=>sW=uuj{!+pTt1#6Z zwFR>`NT`>14OHaDC$FeYc)sc*S*?70VX%CY++lgX>c8N{R+R>!^(x=vrY+9x;mp7b zUW{%Ja{nF-*q89~FtsHJ7QC;J2E_{aGj+9{)?<)z?@E`&DY|BFXeLxM@`730%xlzr z`JDa8`ZinEMZYjM%)YUpX`fx4vLat0Qkv9k)AC~)TVplLPBbhtCWCjp;n#J!8SGom zGtSO*&93M!*zv6rKe!)ADmIT0|Nj0joM~S^XPIgbxWY5h2%HPqA0YVsJ!5Xvzg^Qc zyY)x^#rxG+gJ-9%2pLso>%aQmIobpZAKK;yU`}1!d=h@IZ zKC1vNl?U(Fn;~+8```5br=6PF=;^@!lH-5L#xKg7y;b-hB}%g%O!Nv8H3Fr(N*?g9 z{=wHB2ha%PG|S{CZ|MKoIyJPvA!KBr}*$?OpU35JkhFBQ&*iZk*FF;mfoL1NkIa{Rl7_{LEnAO2?n3Ei zZPNNnUk$Tzst+BMG2$grdw2yhQP zr+n({S3`sECM0*ZToftak`0xvvwW55QoK~rQ60<%9Bj@FVR`72Z23_s>(fJ{vEZ3rWhueNgQk_iOJkI#>gN7s$J-_l0}+R9+tZ6%!TDru4lsX41_Og|ygC88PML zKtvnSSIoc$1q0=4MI#imvzQLf2Xe#^gb*K=XHaJvqyF)HHra@kFRMFIzI^$J=|Yt6 zK;;ItdsaA#`IVpji^Jf7AH2wyg{DvQgnf|enK;QhvehJ9jPQih?@(q9;kg@lzlm8Uap_4cHd+jZTZ zwpy!_Xw226?3;~>jaM@EnO!CO+wCRW&BhUt(4*Yn`s_V6xO-N3fNxM(VJy5Fpl`iP z{rVlZJg+inqpCn^It!v05_aEl(Iy`XK`kJVo35Z0!dX?*{zO&RI*dw9bR8tryo)*o(x8bV> z`~9m<(HK!(YQaygeb(N&TuN1VX~=r}7zZ&xOWG|JVH-;wDh`7SWzn>=iqD(n)Q+^; zukv~9Mph@AU+G$zZ@+Yn##b1t+-F21SE|vNLE#)zftQp=@ucz85r4%HjWiF7!{^7p zT5#oy{8wH`#Np*AjJUY`{T)92E4f0Oe5X8}eZl}Dc%1l{bZT2(4ncqMdfm&oU3M^Ag`!3F9{>BEn;Rd=`i!;LH@Lz=c)=KW&#we9RM@m%224_(u#A*aT2fP9<-*d< z8pOMFh|b<_3>l{InY@;FuHS(G<@q$bgbP!gY={99QeW8Io`JyJ1$OeF3@3TMC|{HE zm4XgCf~g5*Hfah`10M?BxbDkUdFi@C6UIqOQHwbOn19SH=?;wJs zFj~j8d%c_yIFa{DI07lB-sU}E1zTG-V?TA`fE_cK75^bX@Ng1#$D)LNe60k$%A>EC z%H!NxuiNtRrnOBaZ1pbHRjgQdscC)eWh_C>LccJS=qr^c=DndcXRF4Gc6L5v1-9!_ z+%@umKlF=dD@_3JTIGvcwttAyp=PM)Yd>?fEf|?}Mdyly!6JYTfA^kK?PEU@JV+Fm zH~``}Z#plzVx%x4b#`URb#$+@ZwABKftY?WJd$~)AW6#@4xVi23zZv{N00+`K?mi9 zKRI*wOcqE78zwc5@o~a<|GDalTE4c;hAKB% z)s;BjtlTt}gZzNB@SQITR>;PdpHv>nv&dTqH)I#rI8RGvKk4;^x98OsjDW)o61Mz~ z=7QqarEqq*kf;kuwnB>)6;c_#1^4ow5T2k@+2 zR#5(-Y#+g|8=!F`T~ql9tBP@XJivU0{G~a@XYb}pveP|ZcDl*gu=SN>iHhlc+e4+} zJykxL2lKL!flWeu3pob&{%D}~plU@yuLoL-0D+duLpe<2eXjxhFdw)lB(!ml^5x7J z0`{qZMH~1iEkVRbJyvvN?Z2EgWCaQ5x`do>*dcy-s!hu4n7Z{!p{|}VjhUt`pKRLF zNwXFyTK`_Lluz&j=won!OU))!*wagT?4F~0?AayVcK^CTn`o60Bx$z#@m=;iS3hDW zKe@~9KdRr}_xo>GZum_?bB^y`1%F5Xe*8;M*l+&*eXayt5sGJmAx$X_yXvp5v}afK z1VyQKyAVg1W3aojRYF&`I!E_D%^TmVOn+u4I(r_{0&Kn3Dq-55!Tt1jkBjQ|yiq@R z9M>-V1qkdk_$p0OxJW*6?aBd*NIcv+Q?;A^^ag92<^vK5dvdtV-u1-`LVf|X@^Pjt zZcH$+^!J&rf3($^VfDG$wtSbp>%YIx8s{i#tXJRkL!V5-Ht=)%Kc(=7<%r^QOvpt<%sbV8GMGxJC-jFJFm2 zWPE$S2`h|oa`8cizRJy(mP3P_qnqG^x)eO6QFb-iXWJzsc??D^zPL(#A!Q>nv7(*w z&=0g1yi^Y}l5t(0OUe8SXxP%}Pe=IDufdquuk1QRkXn#m{Gn`pEOdC(7%WNTB$mch zZj~6V-SUl1mTT;kkO&HMJbR)Tz1`YtPg-a7VN2GgthKS#rqZjVSb4>wBu{s{&U9qb zSJTy#t(KFb&Pv(Cz=)*qpgtlSbczSj!2&u`jD^s01*5k5&OQ7R86T%unM$NMbt4v? zD{An3<<3L>yxe=jjbw*SXO@Xp+m(982QTkmy0RBi2ikt#$7M5op5LeHSgs6U2^g$D zwVSCO7F_MhU!oX!zKPw|FXfx6YA|5&(!VN)#dRo6(qqx1m_uIy`@=C%$Y&QK4+Bav zn?TsXHm(j9#KI>A?&A4x|a&Wh(a+&Nwh#`=KsmbBUj&Rl3|8EWtVuf{bI zSfW*b#q5&JNqh4)vlB+lmQTpTEz_S;;9{w&1aOuysyd%p+-YAseT9AMvg7R|KXk19 z)eo(=tIt_t4<0pS8y2)%CCdzicv5!8MAI@xa?ddryUS%Z8;-j)?Hm)=y6-yK`ij}q@>M9S@*yMG23xPNoQ)o-Z zu$PStpg%AgRG#|84Fr&6{PMnbtzu_BKkoT@^F`}SSMByq13o^L#oNiQU*T(2DpP-F z<~G@~)VLc99o4FR;Y}x7Ww~(e)tKacZ)AyT2)Xs69Mzo>4d4EyXN4-XW4x+bl&l+W zQuG)fYUG15s8K(m1nTCD2?hZIaHXcHEvkbHj@JMzimE1iqr4Ct*%-zxYhf0auCcD_ zgZn)?D-T(_U+dg>!e)|#R+HQ-Cx)UA`pduLAI6oJp@Ve+a`M0vK2Ex!ldz83qn?iE2N=T62ZtG?dRmVEP?#DB0#^3A zkBf{N3BEJYO0|4_rxj{DM4XUzCbQaV$u7&_}CGJ;Ym zrq{_M;}w`)mTzwMFgn>6U~#Qdok92T(!l{L@V2RAwbR0=^&){^a0rMN1 zacH2^@vj6@STFmYaC(WtJ7uV>kW$`e=>)I&s80UFOw@Y-K>y7#smcs^t8_JtHrH$* ztaj#I;HH!>8>CCQCV5tj5K}JrKn+((C~l{Ohxtb~99hmzDII$O^qf<)3?c>?atxZH z49NGr1ul%{0ryS@57%`R&zT*n{93K$9_snok1#v%bEgj46>B?vytu*3588|0m@(l) z06YT1h-1bce#BFPbmJ{qyW#Yu_L;XGZGZ6I)9s%xILhuge!w?41Ci!Ip6$2F80nSdv#w$eVX|N5s- zQXNw8C|#5u@lvvhig+qguzW7i6)|T|LzpUH7;vC;QI;}1;AajC1v_4hKcDgRG=~qQ+SRtq|{!MK~!n zv{8f-bEzQ}>$Xa|PZmqR1an~0$?WkWbXa)NQ@T&(G35YLH*7R_j;ctAFwaQ|PpA&D zp6W=ejxY|GSWw!74#I*?p}`0?zgOpjL5V}(T#x4 zkLts_;XUEm^diZWHs1oXP?wv-YCS1R+V2DE01kfO9xxS?$0U`p!8Ff~!bS3u<@wfk z`+_TWJA?Iu2!RJE#;L-UjsSsi_dfOo^TWBOM6UK+AI<>fcn{j?paYrhGZ_RhfC)vg zDS{L7l$jDPAT>$Z%G0;v^I!=VmB$o*OD1XmRo?0PA)Y5HQkJ`F(*;HZCbdLv4 z5dA#|UWQ-H`yVhPHA3IZSDvF@*lnNq?VD`*W_gE-bLY%g%k#P(!n$EkujsKq`NgwD z2+5F|6dSrtUTm_e6jF+Kxp=*f7D`lk(lybdA&(YC8+*I1oE6WMa-^tzkrsLQ7;}j- zmA$0&BRX~{ZbJCXh%Qsg$e2}-iWmC)6Fzl3c4NY zWn66&-ooefg~RqwkFWz^WHgB$Y(MD+h(PMVF35)kr_{A$VV6C0)?%|R-SQqV1`%=2 zPs%U4!)f(g)-L|nC#*183I>cIaGKJ=S4t@A_&k^OS3ar6$F$Pv#2yEPu?D2I{**MqlpL#Zcf48}&q(RrDOmyGL!SMC zJ9FR@U9&Z3K}xrnSRhZh--^j0$-Iq18xP;-)|61!lC?>V2if z!U_$=_sRM>Ms?J!qx!I{saaSg)T1-P9mR7vct|iKIQXhVXaYW>4^z?Mc@goiAIRS! z`V=$EM41jL;pILxlaeRQfCyg6>pwynYJ@663HU^%&XsJ3?aEy!9?n>%GGRlN8#O?S z$OYKjaq}tWXi$Ft0*Ztwt3U_;>KEYm&{zO{p)>coBvh31I5vIo86Dj)@Y&ayMQp9P zwEfO`D{UWa5uo(pI$`a_ioN#>kK3R8**C3YdRDxJ zSt_BXG3@Wks=n~JqG=!e{R?b&Ye9`txRh>uG^>&wq^*l58EBmGkR_yjD%aywguGQe z;jn^PI3f2*j|c5uv9Kac*Lc-dis~sUd{lUElWciLvg9H4f+GI=GuDolr0#&Z$Ub`cbwEK7P+KX`Xyq;98Zra9Xx4pY?pXF3G zN@B-Ao85l?YEwp~Q3~3q!&kFISm>+F;IRJAO}6s6aYqZ5BPrlnNJ{xK5{4m>JZb6= zacT?KB=)k@5A>b*i?CQP;brn}HuW;|rx=e2vvX2@s)4#808_rX=9uMbJ1ke%(HvEI z)S=2>0jLWFPrGnrpbwRHG+waT1Rtc4E=VnsBl4m&4a-hZuIelLLY)mQ!k9yM&`q>l z^(u@-t*{6yTEZI~RqJXzt*)7}bYomT`*v%oK5PBed&E!ZGVGqT^is`L@8KxhQr#_Q zen=E>0~zAGCkmoYI2}?9)0tyM7@j{B<<^h-a|s3w+lbW?-Lk4WlomqD!)rcjy`{TE zM0s4gPbD%okvqvM$zFBlw3N?7N*5OTP=zy#h^#;LQ(Wnx1IG!*@oR)J9>3b=j3PWy zQsDl&50x$HQmDRQ6+ZlsENHMUvTXBtF$)6{QB3`>@9?fs9n4hlNkuH*a;C?2W-nH6 z7gWb?-((}vDEYu+)hFgX&wSlm+b7Q7M+a2YKgIzA-*@2&Cb!~=6>wIfm~WYQh5A0# zulvvkAs*S$k}cTpp10JNNr5ue$tq{WO4wtYK9JB+QWnf@>20@W3Vr-=jDx4)_K^6sM((mjf@0G{Oy`+%i+KtFC+6KJ<~h z>}_}PIZ0N|?79naF0n(k2wAN!$`?D{iTSrU5^1zM33l=s@yk*=|-7p1Fl<F{|`UO_!CXsAEFBJSx1()GhCC zr&{r%(hlfe_6sLB!7UakdvsoCtyQ+6 z6bRR3UG=N{@Vr+fQ$5tp6}f#+b%C!b(w|RrJCVR|w-uUFzO`L4Xm_K_9o!oSe-2^8 z#sm&Txzz!cC=pL9o#POx4V2lH-)SZ;6ZsF21|lq<4P#)@mp(nkM301Trm@ooDmP2; zl+<6Lm29xVY)4qJsDbPGzJCF_gl9!4hcM_(Bpm5qg^R>B8KHdOgcYpt*gdOz?JH+3x2w-w>h-{Hlsz;$ zX%{`P)0S-;gwOt7*P zEz{3wdAv1w&`FefS#oDq$tP4^NqOil*B;75c`BQaUNnA8cowAWmCWDI<&`WxQ&muW zO6BO9k6tu6^B5wPu;2RkhwMjgekMGR7oI8M^4AZZXdiv(STz~i28H2ewj}Jmt#{hb zHSTnNm?;$O?H~UoDSnmLqEwwq@1H4FY^&-PD)0j3uD^4;{pAmS&Sfvn2T=IDlT19# zc}$7Fn5&6oI(Rm$AFm^^=Qe#zI$qy#Wz#4}xTz2<85Sy$Ua1wL>x}AQrbq2`!qSDL zpd2-aK66-zt&1X_p0bg*ykdJeL1OX12c=`x zRC!FiGK6c-3fi=Kzag%pgG$MM8fr2wFtC=O3oSy2GL_KRQ)n}}y_Du!p-UkPtwo`iHLBDz4 zh`GO?0i_2&x@RUH4zFOLP=lc2d9IVo*|B!_YCfGq!66(4`}1FZ)PDJzCscMr<43q?tkFdd6u=3As>;w^ zVRl8SmDzWDb0r5)=+HIsK{!Tz&6)eTLPI#71$9y!o^yE3NO5Gv08okkI*mNlwD_4k z&o1q>pZ#x_TQQrH@R!i@dPt*FUH2$E_j-JQ8-WOayiAqJbhqP;V3vGKb%|P6Xxz0*V5gNiqdKL0 z6B#MSg06W4$qHTGgh{Ix)e-BqPuLg#=tjv$5RwAXX||NJi~ju*o2v3*h(LGWp{YG# zKht`*y|;Rsz=kSuc(M|9v(LtWUK8!E=pFFSvRvTWpgUW@r2P(h6)8HPk&)H+4;;XAU zZdD6W7yu!Jbuykg(I)v~knZ!!H+l^Z z;m=g57lTj8Q9r!x3Xb-{XPgCd?e%ihCZ$nnF6bGTq{ZXPAjox3I$r^d;Me)q6PMfP zFFD@UO^y4rVsMyFXY9$|Zo6-&%i3pacIu0}?5M3HQs%;|QnPKM%h!)tY%^Jun97xo z#tWtm>?nnD#Z&f0S9q{hDa{IoF=3?f?P!7HQT3vI5LO)|pQ^?-4Zc(H7Pw*Y4)^$A_)ajyi*o0i92l_L-v ze1uVk8@0^XpoDX8*L9y-yIY=cSP<&`D=a*1T$!%JDs?!;dolog;^ks7VN?iv)z`o~ z7ShhADi4_&$~^pJTw>Y4uL@^%pHn#?hajPGOq8O0v38l_n9Q7IQ`w{a8bb1JaBFpw zERPwVN}-3?;9(+jv<%KR(S`=|Wu@yZ&pybaC&~>)>sBtr10bZpi4QX#LZH*Z!B;}N zK@pf?&PzW)a3KgiRUVT)VHyucsavLz*BM4TFkry4NHp%xVC-O}t36nV0t9myXbj$P z{hey#_cVwGC^Ip&cvQ*@y2vnfMJ7Q<-|ek{p&es{aRZO@sk>i3ZH2vcd3WG#1f%nn z6jQ!ne{=C#`{(mlTIb!Ht^J-&)^+c8>$!{9R}d~4m8X92)%T$452)K8?5XVH;2 zTi21Zi5)Yt4#(TqL|lTC+4$y9guU=iX*45Y>io3THLSPvKT=g6$Cl zC>KJ+O3awBQHJvff?vN!W(s!4`sMb4{4SA9IIEq^7~pYpf6OmjYCm!J)Ak!TJZ|-h z1n;aA7%QTSO&e8X{@)d6+LzB-qC6RE@;)#;i*nU4Xrh%-$`yGw^0xiHB4LX{9alZ$ zC|F&WGuA3Ob4+u>X#n1JJZ1fGy8W3TuPp&mpfj>$p1h)9&Ai&7;*u?*S3wE$s)rY? z^HSha&M07-`r*&qXII?*oT^ovaN~8M&C^-C^vhQUdh(}^r@W4?vVEcXQEOMl7{9-F z<`396)~~k2BE>INTL#oFKGx65Xw~Tk8w3{o_OD%UZ~s?5>xlM84n%PvA-=@e`Qv=U zDrz+QLc@nuU%(a=F!yXjT219_d+t)%AsyadC~JSiMP=lxJ8YnGy~>oqFIk+$Sksxu zk2u~e(4x-37m<7x9`K;^dCV{S0n*`)Hj}{+YvP)!Eh@qB$Jt}@LJ{io7TcM>O!#*A zA}T%-lWNW?j_Gpswf=*5n30T#Byf^I5AR{&DEj!URUlJTuW0RYuY0K+gQ%pkDX?=tV?l9t*p*hZm`RJd(+Qe>G;0?mPhU9Z+J)wRJfER5KC&O&Q@yL zFaE|A_N}9PRk84Mk5_W291K*eNPy$fO0le)EL&%F)=rz4cCUI(bJDt`P>(gfCWP#% zh(=0_z=roDflo<3cIhvjQHCl#p_^phuibgRePi#hU z*XyE`40!kw!)rXd+QxEc1n(d3mYD!m>E62dW@z>+a_o0HuVR?vC8q1Vrsy@n3W0up z74eG8DJ}xv?H63$L~>l$OCU!1wrZvDz5 z)_KR4ptN-a<*h!Ct^qh8zV^H5+LbP6PaEorfiMJ)$I1B3$*ViQEoaB|&|0pE7wV*78ub{U!< ziz7@u%ac80Y{E{O9I-Q}M(vd8F|{w?OFOB9ehILrzf`-&0ijV7J34IWG)letMB;-!i z_7u~_A?|=c5rKRL~?R;?N-&|1>x2y1OuLA8;O{J}~{D`&Gp46R+ zf+v(l7pjw4-mGoUy-$?dE!t=ds4l*Mm-2o4(>9Si-DcCPe43p8Zit6^E7uF3G380w zROU3{u*nKF88)hPNB&*@$=QzD{Ysva(|TI;TGuAEFJZ%qcPIBXD_}v_ z^8zoqj)$L@6L<)(I3=aWVwK~&T5MHI!`64SSx0t{q323W?1sOMCnXLQmrDst5I1}g z55hk!V}dt+)Ao$K&U+?P_JX|FOij5`NxSOQj2+vDh*MhCX)Ky5OEHvd_NQkaXP-Oi zxS&uK^`-y$d0V)3%HwN_Ps__KD?N=r=O2F2J>8=w$L;+apS3f`$D?UnHi}_&6ysCv ziG*)#I53`QH~r+wQ$2zda{95=T?(RJvvY5}%4SL|xDqbN3*qtR{0sIc?O$>Q_;A-U`@lKxw!|8h#rJ`i zDWQ~bLJmJGqN$NSaHCFCzIowaM!XREhjws;M+yo1Y_4g~Dy|`g!-{8Ck(X5lD@ah> z;JGt*p>O?Im2wY8M@i*Ja*VQ+lJy~TkGq7k6Grqu&>1*inJ+%bH+EZJ>8mQ%Eh?Yb znOpl31NdqD;N8~JS=&~4hj43E!^Ly;Vb;T0IVA^Ayx1zm)my$rO~^{=L2UZH>AQ9{ zZC1)|%tkWjT3h2e830=>EAM%0%jGsy{E}#*J`(~X*(v*!R*TYTSx6rZ{J|!w>&9jqr@tU=|1v#zwunQeOUePFt38 zm0)CJ3@PisK6ky0SvDS#^sP1Q*S;uW#a5A}qTg352u58h|36-Ox_f;eee6LyeSEiN ze6~y&YJBom2Cp+AJ}@2pv6%AcMz{ttIsrA-oVtutDQIL5;Byq<2tAad0X~Xn`aaI< z&kPxxibK))>xL+3M6NC2R4DS|^A8r7{vi(5*an+fYSJh=- zTX?j;f@IyQy+h|tr6vnA1gWz1o*6c)NcO2DBjz_;z0F*e~5v8 zcfO)!0=0*?QuvTQ_w+xnn9{jmM{@^D*IRe>n^GPRT37jDogc8S(&N@%d(^rr5BPr0 zulHzeJZZ(u0(t1YR!S|B5ye-fRJZq4=pT22z#FO}_h_oXhbQlO6;b|hP8*5#2G>QDRB|4ar&Ur^b34UtYM3Y_2dd(g%{D)1oPr%wD zJ}Oa{`ltVHQ8>x;7b&De1io93PqheFNgsc!B?;m2K^12s_Kw^-?%jDUWj}iyMgCYqK z((M~O?OqVV#M7$BJvd&eftAHqA+?mBaHV}d%?VzOv+mUOr%YX3_YgB?_IpxV+_IH1A zjn&zwS^Bq8m7gHV#zt26FCDZ`op-7&zJG&tZ6EWpnS8_)=qeVt(cC?0`k-#@ zg|u}PGM15Hi}y;uWV2Ztl5%TR*g!|Y6(oy`Xs;`72}<56cG{po)!CuDkOsn2MgdB= zCPfP$gpVztlyydlC=g*>O;+W=K;wp8yKR;I{$n!QQQXXds$7)I=es{)L#YXyN#^a6 z^FLs=O7*N#Vu*%QD4Xyz!SzZW@;TyqEBnqZrfYm>GcnmZF%WM9E>JZJ9 zr;=GD)>~>_)w@)ua3PiIWA!vMJzH`=ZH4BzuoMN8CF`2~x^k9PSHq?=XA8#`SF+V) zkH+nkb(U`T_5zc6dB_!wchwEQ4Y&ND_0RsBZ$jm7AtVZxYiv-v*m_vwPPAw7+-vrL zy>tNE557ae>*no14;b<$^Mb?hg?NJK=`#(HW~yc+F;4+3xI{;dJ55 z2-2nE*wL%4CJTxI(yaJK`v{YlJN((63WyI{?N`LhUgP&)Af6wJpS++;Uy*zHC5 z$1s$TpYsv?ht!W0t$QyX%0KG#3qM}+BMWKcBT66N`vROOyzUDpW!+2JfCQ!k?-0A- z6MI+H27ljFiDTi7T-#Bp+DNrxQxaCZ7sPmOxUov!=n;%xLzjeIc67V(mQ_<4oNXo( z#j-V+elFGR>&pi1mbJ@6Q&h)gw?AzsJ-)@iUc@FD=&CBTRgsU^bC!Bxs}&|B?7WJa zyf`UAiz0&wcl7*@kDTwsoRn8%E0Z+_27LReN@K*`C@}w0k#K?aoaV zyY2aDdtyh?HcvEdtRw{{<=QRfMPEV#zf$EslOP=V00#X;(^32^R&&Kz$3WKzRgmw} zq`dCYsr#Y!g4~3CdfN#qLp1mGh}(X9thBTbbA!1uvNGDcSJD zF$uWP_X{_V+ws2R7)3!0?`H9sXr}wEs%C>4Ku!Molahpfcgdz7_%`HqZM1T-SNzxE zX+fAT*L7F#)}`7CFDL?fz`y>8Ovz{hwZ7g1eNi&`)JercaWB-7HBvuGp~ho5gM5!{=Aa+0~NyU$jm+T=_Z^{d^Wu zb?K^{S|;OVgS9lCu-58xHk(>2qjW^dKA7bdwG(eVEd`FAm`G9gW5Q*-+9l6k3O-jG zQ~GHkqYQlZJ=KKR_oP@Cucw@d&MIE~S)BSv<8aOA)Gk5pxKjM6>NeFXB`AJkc zuk-4O95+wJW)>)7%Hx9q!6OF4@FW=i^@K{pJ%$OMCaZJd(R{XPKYT)$SY0E%jPjL& zX8XsI(wD0Cxl`BJ^L^~_1~Lizwa?vdJ-eoS+O(!JD^e(Y^kQem?2cTURo#1&zH64P z7L9>AD}9+ZMoH?&G$GUL9AHYzpjR9Qb=l64wH&l(T=;Amui4YPN_OwoS-a_lqCLH{ zW?QD}R#IF+3Yj;NT%n3WLP2?qE9VOxYLpVdzsU<9VMjl9Gd7W<^UuL6qU8zlw zoPXOBt@gvI2i@lS$AxE@^{ApAMRe=jtu#`|%?u@mAAgX0)e|Fj+Sgz7zGF&0Job|O z)DKSFsM`%b1+DhRbn&+98l;|vC|8d(BwsCA$JQJ8eKvXM9m{yi`9_pkbCZMG#5$Xzr4QZkaa&IK*DZM7auLw0dG9yXEAF@tu#(1sT z^4@}-wV>5%@^({Fz%`!dmXx-c+_nchzjPEMcznojHwgJUBc=Rm>D228@3$PkE8kfu3~< zQuRGvvd%A7I_;5Szht=T;Q^vV$xNeQmt^HFsTB{kF0vhia((+H5!eN*Q+*&0IIXmf z7ez*pu2k*f&p)Lr;*gq(mBPnyzysc_K6p_)Rr3y^x1bm;6`mA^e5Sur;!^q_?gJ-` z4EmJIh^{ySczE=)zjCT_=hpYU&I1_{+irnFwEeOExDp8d1E@D&2D`TlI=Rn0=&vM?rL>f76Lkg--jus!=1LnbHZ;%_;Ra z8%YTVl(Wj^D^uyZl)doC)~IJv;XIx~F6^{)O}Mz5U$J~+qh)I2VgTi*KyQa6#cNf- zD2cd}P`ofV;6x$Z;}jOfQ9bB5r|IfYL%_f0%9m%pfzkr?8p^M?e49GzS#CurrS}{@cjWl4 z9tb%WCc&!+c4QZ_4uOTTRU-A31e*pp&ykPw;Fr^B<#DfikooQ0qflEi*Q1VQL zDWjJ{Zc#yDLFs`#-f^glT0*;+-d-a`a(s^jWJRG7T=rxhch6G|khARCZc|H|5jjV3g9?r>;@>-qST3k+QvQdRb6(bhYYCrt3B&p?!3Ev)#~kybbeF z4ZPo8rNI-HcxYt3E9U_D(>_(UcYNki7o+qQ?LkT5^`RtQOeLj&y(y|2it2)%ayAOQ zfFk9UD)2)N`#Z`Mu5@6`ySc6(73UN0s>darE~xInKypoW&CMRDhStUgD<$}BV2>|G zD%9i&i|>3pT>Ub_HSE?`_eXxI#H_-`h*aB90BMB_r)cYc&m{t$tV*&RTd9@Gbm>9LNFSXTDUOjoe@7l^%OG|(iN{+0n>=^ zb)Ya!;~lIDXqW=MGZAEj@e6?r4Eh5^yqJRqwBH#}SKu0+xkjF)I-T%|{K+<+Jykdb zWXQt+?XBD+3+;Kw-|1VR*tdw3OOJ<7*$WAYw-OGj9@OEm(H+L^n z`V(y`e~cJ!&@D9B1%ZgiK?geXh)K)rmz}#*I2~_OnG>v-9tu-6O5xrK3O!KQ?+-ad z{p|w`8i|>p1K+?6AM7Vk!%DP8-_TNM<3@?7!?Y7|{K!uqI5ncQPE-2j5FKFw9sLjY z1pW=zAQl1b7q)O1FkO{@hNmR_83`eV6y&B1F2Z?UDRU600iWvZLW{6{9{_w1A2G!D zUcS>1(M-7k!gZ*_Wn=UM2oHz;yO0TK9T(C@WpTLR6pc>m@35mJ+xKr1vi@~61rb2b)?c1bdBkfZAVlNn@ z&!_2?h?s~A0ubnb5g+Qxc^4jst5rmJ9LCvC2M%$0^ji|yTlHta<>Vr(B>G*(wbeEY z)3S7x#*5kn&Pimo^7`f*^&NiX8lzqo@lGQ_z<2I0{GvL8DFMW3!*v|Lr->nqnhA@` z4B#Pic|y8*FfTmhfiI#k4!;)0UfD~>J-x#nwYsu@&8wi9|E?!}ii`JX=}5Fb!Z&z$ zfuZ>CRl}$;z$kF~K?G-hF=kvh)rI$c)mY&=nt7AWWY&6GABAWMo%^fbv|Q~uSv4BE z%FpV+a(d8)vu{(IbHY0aSDx+hea!yi)oQb>WL{wBIhe|?CwioO->!NUu5w*TX+Y+y zTdl8hz27^%=rAdxT5`~~@r~Y;M!E)d_#kyd47kGvS*a*I5IVHQ^QmLiyh92Y4|8}3 zH}GnT4hhz+s?EgV&qMFQmb6{CdWoIX*Jj5K@!-qNieP<1cY!Mo$OQf1r$gMnSBAjf zuLhva-Vg@hzT;jE%vZVx171r1d1E&M#sJg54SD-EUiIg{4Jp@DNgOTZ+bn^jIGm3! zRHeL1H7iZ>99N#Tf+`Zo`IR{vIBh`05bwyN4Lg9TViwp$2*4BjqIKXePKM?;5da)Q#croII z6H_JSOs{Q|XKhLky~1ud8blhC<#Z5E(3zp{fPnc9kCoR2kYBRr5J??)hd{hD6}0Gz|OR@}1UN*`PoKqby4C4W8+6`a*eo@<G4+uAO%H6Ied zGt$@+P2A7KYeW!7^^kXdz2Q*%+3y+NBVM;T{^?#N2{p>mxQ-4ObZ?ru0_BL)MfZE? z8=!$f3BNM_!N>bg@uE>!HH(rV9#79~O>WGZd{rs0@-ixyHJ!P%-I-lx$&AY4^MevI z$t@}a`luWXZdX(~Q<^XkPKsvxP&WqDP7GDyC-vlbIok-pDZUPTd6Ux`e6- zEGC`vf@5$c5`n@=e=s3TK_e^~WLUCE8_k|))4An7;9QaFjH2$U-e&EUXOv6$!oWTTlkR+P_$220lpnOENE=#2(E-*N@%ohH|g;EtLNmLD9 zT__is5Eg!gdxk+6Z2;|g>A@!lQa^U8_-P5c%XtYemC@pNjQx2B;iQR=cxEC#P~LHE z0EVE8Ht{*}>|#dAszis<;km-AQgmFqu_;8-lqWG@8Krg)SZQ;jiNcau;v_5iTGD2@ z#+!swP0j(zD8c*Yq`X zOsdy>mLfQ4g!55@{^Iq%;EJ84cIGdUBHq&v-!G6zta#ux_M12ZPcSLw5y!FX2}I|c zz=NfmMdAsCRYYhNE9);XxALGo=nN76U;-TvqcX)8rkz*2^2KHh;xlP|mD{YP%6q;% zdr*iNy^`v)?S+dq9(X1ZY+mM(@bp{>YJl-oj=|E`q_fLb64MOlFH^ZJoT6Ta0B!Zk zRc1qiDtumxFLj`-cPPD=34{8;gITEyI%(WCMs2Y271=McVpUAAuvMng!@#cK4>J8; z3Bt4)t;GASSx3HLfAY2yZFvvUN5YwIUfg4epE<)C-7P-kz?(0&Fsa8R6U+7yhVurnCmwBl+%9Nd9cOkE76zOy)oF61METxQ)hon%9jr+$itNqPL{>vd`eIr zB7KeGswic$D{af~d7mZQG_Dklf)$H+8Q$M8gxH_Q6nNMBQZU~R;lWP&UmmdfeJ^^5 zD=L*3wrt!#yxa^6V~hIfBKLxI?F-604`r+E%;4zk%G{BaVSVqo{X**{c7KA;94Vzx zV6mn*QcA^F(W*?wj(>6J_-RXiVA>k1pe1WYvPziOHR+P}V;{NGe&R3g^7in!rz%=z zM6_xuVYf?Ud{gD%>Bb)L;kF2iSpYXGboLD`aE83Mp@D+s!Lwiu=Z9ziTUvfxG-%l3 z>3?vA{rv>UMiJ+=9H>?e7QD7Ou?e5?T}OF?4W9kMP=cuAznkF7Qyo8=ezUK34jx;i zd=qKwE8lMU>IQW@$`?hc!JHbD^1VRBU{@3vhjuaDtk!AdpnNlpUDjWb^2Jk54A^K+ z%9qufv|n81gGB`5{X&XJCZw#3H_CFYDt*7dYJ^7)4H>+iPYHdX%ge?RMESC0A0|av z`JxYu7N;YYBl!+3@chq#ft^a*j~=_&)^xQAZ)lXW#_9!Tzj&S{y5s>X42GwppN0BzaV4;ju8Lmd8{1{dNl^NZ`<|L^5sPXp4kC|wDBo@bWp`cvLy zCMaK(;#*zHNMG=YAGCy&FD&eR&KOaCYSPg2Eh(9`ezgF8C^XjHCx7G=dBV%&jY{e3 zo{3?2D?SkL@xeHYr>gfpGz$F)&*|59`4Fi*KR~pm&$NQ8nMT+ zk-QS*l#UM9eOR1DoXTNA*5(##OzOT_5{=4|LAv%5C96~>;|5uR6vEu)-k+uNTwQe? z&cKNGSq{kp-j?xAUxa(C3w(Bx>G%|r>#TEO*}Q0?W_`aYU*Pq%7!%LI**1WbR9%+b zHd%tzWV@nNv=bD?5ts&&A2_H?b*8^2ATDK4bHMEWWes68nmgNOax0Zo_u#bwi^n=brD4sIJAVDMVp8=*i z{VWKBJ|&NL)P`oS7b7ZtrppbJx|9`zIVe9VPkbBWHpLc+E41N8O# za3+k`zcfC5;ZA(G5K^G`mh!+saT=~UdvWm*r;pO|T$%JdNQm=zI`Tzn<3qQeh6J9E zd!507*UkwQ4z< zf>ug(41CP~%{b5C|PeqGp>~pDbS(lLlR{o6gu+zy7VeemC5*_)t1FaE` zD#h!8*N_7MZ)&)_BAZ%?L5@PkQE(dIEJWb|qz-4@M`8N{==z-oe@zRS8}+gS_a3HG zgq^Pf_p|5?jXm_0APNSR)&I80hPOdYTGBNBYzs{U+q*!rs1Sz3dun&uhtMZ%TY0*ydk zZ&2~hn8Je`xyG3Fm*rVEiwXvu# zL5Xrk0LQ`=jm&EYgtG$@tl_Jq;S7`T z^z@3;;etwMrs<$}P^hXycWh)36(OETxB=jJDTw#LD?Xbc(GCu@Sv=z#Nra-`m`6+_ z(L|R{H#S*;M$i50efH3YuCwv4zhJv73EQb5Hk@hNZViXwmXwWUk~WnM4^$eR1zY&3 z%Po=3ipDGw66-)a3RVBa29fVaEn54g5~4kQ$F=i};{8xxdH)DOaHFdMzt>G;u-mM^ z!|bt*${*yDE3%*;b;Y<+d91Rhk@|bR2VT8D4&pV(BuYPRV;idWcO9o&shtmVz~90k zt;+SsETO*>je=0y5KG`^L-PENn~~Q{W6;idjU!}9!rCWh?akLb>*-j`hNN|4RRNFb zeq7XRunneY_?0Z`? z-X)J%bqy^sM1rA&vWC;B2LpvFscCN@%p;@g?;gCa&k_3TtuT~susrw>GS6DQok4u5 z_xgSs62U|Of5xtQ!MSo^JU3=M#{IC>~~LA62+TIGu+~=V__*o zN`;R|^R3OKJl|@v%bzJX6M3gmlj*D=e#j{7v0I1bm48k2gh`?@{p#=qo|z*!7q;i@ zlUJO9TnRW|c&ruQ&O6pDg3}3ssTf)fz1={G&hhI8?pZLHl!tuvsglh+yF*G&183WW z&Fq-4?iGtI-I0~ZDO+K2ujLlBDqrxTLOs+V9MoY5E8mW8UVYW6vdugQlxiy-92kq5u?+`;;+6nT${PfJaEY(uN#P$vaPf{(+!q znXX0e2^T*3sFTBi_Fu5md4R=d3n{#A=X~}`o9I;JTV#o7D6>+#1}$_@-CUI@f11br z(G!;VFI%kHiObS1{Cahk@v1f-f8Q4Svmf|(Z=Yv_w5p3Gng5(k+Xj;}peP=#6?u1> z3Tjn%LI|U+-Y@FAaNc*j50n-M49HKlcT?L>J6V=Ye>#M}3e9$RpQ7DhCD3 zehajUXk-&D3Yj!i#MprI;I1tb?DkEFPGreBzExGdC+IFQ<_UKwAX@Gk#1Hwg>NwAOF z!qN?jFS%i`weW6Pr|bs}9q^42=iwO@<0{h}v%c9IG+4`lR_b`ifkAp01N29+zW1nQ z_Cv=lcEO5)G4tU|t=W>b3?8Ez7`I}sx0O$XkLU%B!yua3F=;!$`nYYq_AyJnI4h%v z89W4P7-)D;s6GI`OG#n2p1<09-*d7Rj_&pTOiEMWmAIH~W~??nWjnt5r0ux&87n`v z({l3G@-^bs*VHed#G3xG$Q_n!zhJd>oWIms-m=oNU9Ix2=r;{m(58Rr7ak)V=Kb@X z0NRTYQgeRv)e=61{K6;iu^0dTE^8?#tb^svB8v++#S^Xth zz|=GfYu9bh*<*ilqcz8h)-#)SV+aLI*&T0PZbKiw$Z~B`V#?<{r2clZ$9Y9&o5rOs z)Q7RcJ0Py*Wup1VYsjnz3Q6M25(jMm0x zt0W6zh<+s!BSxE4%w`wKGc1Z&viKytU?TFp-a{p;QV~(4^zF;!sf^~%@^AWj0@#g{ zItb;PuZ}B3OzeXtCcg6I&++uwpDIZ~E=|15OhcY;^+pMYuuWQ1Z5hv=rH&_w^0P?> z^II}D7%-XIhz(Vxtkq6DeLTF0EZ(8=I!YKM8cHgksS=-dE`C+zv*0TBtw3jwf;e0O z22P8~fB2}ywlK#oVP=(M7g+g}rJ_&WS%3bNGm4C}uhR5;^?{h6GF7w}|LHz^?6<#c z<-4|9*UqXur>14=q6Kn6w4zHgqOXI({Nwdy37#i++xQnAw%I3lTIPf$mTK34^bf5k zY(zr-fe-$xP2RHETDQzvp=8z~2_IHo^P~4eKe9b?ewGE>-bMp%}{;yA1s=Hv> zb=_VkIP;+ZZW0hS&3?RwOv#C-wubZy2}gaM^O_ zFY|o0x~Rh{M=!LDyx~Tb@vdN>_8`pq` z!#p@vM#T(mnX(JN_@v7QBm>gU^9yc4&(ID$T`8OfAGcs#g2yZ4KV76=7;B+BuT+;U5NP z&M zNuSp4FMU;vAyuWaux=SR81T^Zum=~kbvv%ROTtJ5laMPPGblkRC58~tfcFEzDC?hY zAsw$wu)#f^&FC}R?f#$n7u))Y`)%P=M#hK)vht=yXP)oyDrHte-DQsI@>eT$(EqHW z#Or2lOXZdqY}XHd&c?2O(kklTC;rz>_So-y$=ZjTHZZN;k)x0kZJ{up7O#e}@q^EV zG^&=@bq49|oZ&rf$?0j^{d+gr_77ZV#mO1R9Z_EuZs=in;*EUJ);fDQdt1fLyy~Jp z;l8AC=SG#zS(KX2e6yDKHxn{W_~x;1$RmM(XI52t!6R$f?prrnby^Bmav`Vm8Sw$H z+hvzDyZ8^D6yVUWz*{%T?gJHZ}87jyr6C)y^6e zK8+zJCq1ycVj{L!V9YD=rDcecFQip`~Jw~}g%hF6)! z{UZy!Gc9DjTuP@I?jfp7rc)1RaO~8FUwZo)J|)N}x<)_nW~;61bGkq-3@@j3)D$&M zdRxLnZJXJ!%bxm;Yb-fjwFN~bP(S*#wbFTCxr;#mB6vap!Lp}J^`XiNq|*foQ+esD z%Ca`wJT)%Go0i8*I`U%>kxqG(5y3_t_k!j_MF03T72FhdAxo|6x6V&oCexf1@`{It z_R9K3gSgMUoj#tJ<_t3t+dg%VZTakd)-%(z?s703J#9o3e_Wu>Y5#{GuhrYd zTJ!UkPu*=>Kcl>}X=^LW;K4Ig-(a-5_ojL>>feq}US^r~ORSle;$_^Tbd-v+>&n9h z6%NRus2{-@0}J^>|HWf8xqZ_5K60D!u?UubGNDWV9|+LYnvj5(`KB?`yr*1!mB%$& zRQ9nAJF0KYt{T11&fB)dTFOP?CWRrR;j-+y|efFcP%}?YG|uIE9HBw;)~7{cmjB5?2FA}lHTH7*4lhQWhl4mZLL3V zY_}FGU#REPB3N_su28;wYxHmj+V2{$Do;`#K~raFjfcW6MOD$ky%+I$P4RM4oE}Y) zb^Q5l_T+#0k|jrGZP6?S3?DYfn4_;k`PgR&*(@Cwd8aIT;XbQ6VA!OD4}Fp%FZk%X zW#g1Bp2%2dMRcsrF3r>=fADWl(p!uahT%q7DXVZ)c!X*u&8xc{sMWwE5uVZ z@sEt|(#^JL=JS%rU-7Tb^-In!n&tjx$&3-@N?R$l%ytwm35B>6iGYrA8FFagH7j5` zI%YVo5mcPr(n8Tmg4UBY|G+_a?JmVhNYg;Y`T0OW)dt0jUCgspRv|Mms;&^3c1DPM zQZ%E|0X(m9&xd@%8O7RFxyL&W%d5Y1i+H*+m&QG6Cr_vgMcrHcrY)WNj4he@2kR-_ zA%<7I9_LkfdWH}R1Fx9$i)TJ`4a8L7yHU_?mPL}w3|P%KTC?D^ln+3HiXwoqPBRtfNY5ick~1Uai>GZLQu zvcB>oVA3js-L=9qJkeG(V>w$!0+2@oDG63r0!r7aGRd1kaIwNlNM@xN=qJM98-GNh zdMG#Hbp<7mlCt1gCUtoIswYPqpB}c#AKaw&WUZ?HD=WOJzC!Ra&= zolykD#bJCtj>D(p=N*JGyGa@jFHh|!ABu*$JY41No%h=hrex=p<$1z&e7Mq51#uj8 z#Aou-hu(kc9WSd{4&iL)3cCuRr}v9G%HKlOnZ6JKoyPv&u5KyEUnP_JhW;#)WJ3v8 zyh=cS(tpsMe!U2vEHxP`s#M^ zUNB0Vb@t|DQ7YHUoR;Fui&k0HD=Q>1#%E4h#VpTF)Q0Ji0<5cvWhHb|GrT>>!t42id}Z($C2nuJ-{xqqNs?pg;*YM{2Y?Wh|8SbuN@0waLFHPkrJq zpS4t&(@WQ+^I2A6@Rm z+BHwe`H?^ouhr$w*Zmy4E@;YL_PUKd*oa_ph={tlFID2sZT0tQ#_7tx@~6rIZBy=fLWIc`zCZ17)J zJYil=wX8UGGtW?U!89<#7~0Vv^qcord_Z&2n)jzsek$H)L1-%qku72IkargL9F6+i^T#C7!Ba2I-sx9*y$6~j`jxp!xXLZ=2EuhgXdUrs8wy3k*zxT zjxpXWHgSR-y(;Q&@hbfMaz|21wNWdH=f!)XkC3rH@4L>fYJJ$p1xAKAS-~I9 zt^kD>(`&4pSgw2x>!>|sz16#%58*XWBHFMzI;A|KxYbl3Gi9B%hpn|HC9JVmOe~fn zUZ&LKWbzF+PL=K956pVLo;;BB&ozMMhDV_qxldmxGv=@wylCR-YNumCA|w$?MVy0~DnW9fgg(|D8W%4=j}M zN8f^X*QD9c-yn;$T?L^Omg;D;x#}M)?0wBEBhnRc#x}LR z$MY?j{>)rjyk!6IkJ`;nVQPd8XWr$Xel66u+JfRu>VJBSay8}?EnzXPGeOc?sv9iV zoDvQgFc@YD+urhadCv>QGt;(k=HHZxMY%GRppW96*F@`s3XFd|UsXd}zvBv+3K$Y@ z_2?QBI&-U$5(~NxM0>puI+AGy2}YPq<)&qBu_zJZhbi47aIgSo#cKT0$tUS92*0O4 z`9pr51N8%g&!?RPqn~@oCjaFj8=Ps_LdhIfLi6<)%840~0fyvnEbOr2@1JMQllv8h zX{A0@J+qGu+wMQQ&U$t?Y{87uBIJ~ZdXP~7xB(##yn--L8Ed<&{Ojjg{p11h3(w9% zx|zqe+s;3}-a1CBwrpGhc+!-Mu$L!=;s|BxUc5Z>XK%I2o0scOVLs5|?MT4;jRrA1 z81B4nZebG-sTkmdDFW}C8Bp%Y&oq1ur9iR5f#=iY_4YAf6&!>F3HA@9qbl%D-=GIZEG-P`AtCu~f8IR3eBIsH+jq~CkEQP$+&U2OH! z77AZ#Vqiv!LGjE!kcaCytA`60i~>hk>1i>SP9OpLifCvR_Dd!Tj}Si4wP=PSauY6O z5z3+$t%bfGpRnvq)dv6O9&3AgMDgGUjVX)1CL^`%AL2HH9g~>!)6d@ZHhZAF$bO{# zQTwkg-;jO{k5uYPNRf5%H9K_u^1I(<4=q~k9WOSN;+?SOdv7x9rQ~%wP{18_;$2(p zPpir#)x~`ejr5PkPv5DPRB^JAst)IiXSL_$qF@|4~H?1`9-P&ZT~9)-N`J0 z(?#&|-1a(v!NFn-0Pn|lfKr>>+HT5w(e;5G0roTi;#MR{xMv#i2pn8sP&=@&hIzs2 zo~h5dsXwNs6~!wdOcBoB{Im3WS~f!W6YwoBr345st*+QP)>>*z{k$!zw3s zs~o0|!HcQbx}}fqv%wEvZd2VEd$v!)oASg@cv*3oJP$?yq?Ivu>n8CtQ@mBHO91kk z42ps4n!InOlJRcJJj?Vt!cm7-Ttgdhl)$VgUxTtJT|s3eEmNaRi>h9}EX1xzVGG8Z z(*OVL{Re<$$90$qpBFn$j=&%%f*?SM6f-GO5|x9M{*{$1$?{tE+Pn6@{w=T9k+#>C zwGL}rD|^>#NtP8%X%(z2QW7ar6aj)FNCG4X5E+=9Q>WK2{NH!#-tIR&Gd)PdIA^B% z-dnfAsZ*y;sH$79A4|AXWoq@}VUhB)AE5UlZOkcb%IOg&4vV&jdj+`Z{q8sWiL38C z)WPZ59u&x_Wbm_X{XYH%LQOOUXD_6W*E*y(YyH&IPyAIrg+2zXp{&F5{G=z#O}e?Z zTdoCPaRE28B!1qL2Fm1mdG=w%d?tXdMCfRGY^Lu`SJFCljqlkjG)`We>crE3^Nn%p z^?2Dm`Wj`ZgOz(Qz}e~S^@9B)&kvX37u!hQkIhpSb-i=$mGPUs+f#9n8hYCn?!ci# zzH826eY*Bb82Me@a4M(6UER(=y9;^s-YHupR9QG0U#eH%3{%iBeZ?rnqI8{u0Z#*Sn$7Scz#_4Evm=qqDBVuRxek(B%s*3v z{33-MKn$|~cE?>SL+RuH<=e6kq1ion; zc!&P;w@2@G&-CMo1b)84IHGLs$>-G8!h0T%Q$PO4c+<_e?zGDrtxPLl4X9To>a4`{JszSmCD%-zo+$AIsoO%Nhl=aWeM4 z>-#`l;aUVh&euAXMjCIObL>BTDi-c}GTILui`l2o#N<9g3Q}<3(z%ntPhxRj_|mJR z_m=CTcdMVEke#xmq&xPdse;|_?geqbl#o?Omvr>h(Yfe>$HGURjSWxF$LzD`?4_M9EXHD_$kh2hY@ z|C;E%dJkntN9v;?%SYy-f9O<959lMBSm(Ai%NH6KhmQg@5I!2&>zNVI0X$~OOra}_$yE=JL$L{T#COg368VYWS+4Z%>P%LO?rOdaxXF3WD3dHp-8cP|N))0}LUje!ZA%SX_9zsdlY*F{llkYr?D{zIoiC?s7!&DaIz1w%G0PH$@#MdLTP(cq({XBfIj)o>*Xeb2<1xnAsEK*&+7 zLO_9MCh>DRb7FoFC%@t57|e8OW98jQ6WTqXIPp69V}BIw|N1~&|AE7?=ZUki`PfoS zLkIWYOriXy@PxVt=VN03Vl)q&iVYt<6tlnlP|W<^r(=0`BIa-2mNak*-11W$IGvZ? zq4mM>RC=)>ZI@9>r+@n1nEQ9{jqM*e5I2AFOl$*>O-m>w%9%hhb;ar6Y4A83?E@&T z2M)&6A3hqJfAJxd#&Rs)v@r%Cv=apuSWBsTxnqjB}GJ{lXi&i*!61NYOv^Jr}3dghHN$DN*y zOnb8Lp#}IRKM|+Z?JQgWbT7{S#}CEazx_aL`@sIV{gJuYcBBVxMM+ITZ@>L*;LW!W zoQ=r?^U-|-gXsMz>RVpD$F@Sm z>DY}S@%I1s6O<=K!HLV^Rx36^gq+4D^@m0%T;gXjXg)Pk0T0TCuR1K>c~E_>dQ=@{M<6TsrtGjV_!;;sUU*PAyNJ9$6OD9!_#AU zk&qr1XuE?fk*B`0>#di9;0jz`D1AsDGrpa&E1zT7FDM8YiYSB=1AtU2yCJF^b zf>QJR==>ChYOF)Sy?FO-6r)}N-ig9eK`yR6aKu;+ZY1`m9 zpL)>CDxd2t#}wltr$51^yKg@B{F4vF&EN5h(f#lt@T7(0b%$qvS>XzH(pUPd6VANn z$vFPEekCT}^>}>Ap~+m^cHPkLn>8uQ^uM2Km38QP`dF*H>sUpx?fAbx9@qciZ$$f{ z(>aZ6e=cZLk*Ag)ImItGP*y50f?b^70aLD@5IN27w0ur0Q*V99N={V+3Lx*z>zb+e zxuc$Er^&PJ)bHBuN*tUuchA#t?63Y(bZFyUM@DheDU>cekl%DunBQ~DA42Y&r)+sG zr^yG>e-xX3>+!he`+hY}+_pRReG7&k{UEOL^LnA|gzh2NxQBn-F%N1$`3u7F&gN@q zGdylLOEc)|TJ`7*k)Gb_R(^lJP^MV&kNgP&iE~ldpqk)SS$Yy0*mrqO0m&YKls}0Q z{*~rgL?9LMRywYQsu*qxJuWvmKF_vaMtz;wIQTeT>2Jo)#s9{5_@u;$v#r~C2QPt` zn~^jroavCO3WnULApy@oGpND)Vmzm|HWhr8Uns~RKpKb5ZP9N|(}^n6HcEL*(yrwv zUXaK08I&`nT%V6-jX5jJ)l;%w3jK5`C?_(43CJyWHrd*j7D|V&4get;N@~0WOi-o> z9Q1WZamn7)GA!U!P)5O#PCLwZZizG9SH;Q6FUg-uG)`Phlhb<@UOs=eL53^1bC)MY z6x?$2&2yk%-2}Jz3&j|+OnRg$S4EW;Uv-t~lP1pr^vQB_6PAC|wJ;=O58=_Hx;%&j z;n(vM0tBM(QlK{bppJl784>c64C>BxT*~sBTnAN;t3O4j=ZkDZmZ2cCTMe zIq@Clnh@nN;B@~Kz)F7w`-J7ppvZ|+!Fm*7ev`~|&vFuPS_2RDDg|wsIX#5*RJpim z(3xs?+S)IEYpkhP)+}==FqR%a8fX8P-;DV9vG|fB5j*FL2d3b6C#X=DA+CN4jylh^ zYlnp2u)F@4>A`(+|3cjIKmJb4{>~HNjX;0^elnDFA@R&h z=KjM6V%MR5yy`ICQNOI8DZFfx9-3|Na0h8*d-Gdd-fL)hsL6y(0!~il-ugqo9$SC& zaoQ@5wB0s19Z!0BAQdQOIr20v%-e>R8cQ0=dd>#dYo%|tUwV+&_JYYuUb#=2)3c>t zY%A^Zh|&JCeC4NI5ex5mEav~k`(o#j(#DN_%`MB7h6Oi29rGJ=c`d&I&zdv@i$Ycr zccEctz8`!3_8-JTryEcH@Rwi{K~Fa{QLl>DBRO5Km)DJ#pH;%>U+pJ!q2r*8EoUjR zjo@&9V|NOD6-X`xAY=5jb|1mhc37%_(Yp+jXv|I12TQz_KE5nvIM!X(5ajqCedn(J z%)}TzK5#r0I+MM+_o?7z-h$(L;l;voV>bDT!Z3~xrhE~<$svQIMej-g zc{1@+ky5WLM;>|Aw&vI-E{`?M!idMqcNwVH++0^;*wmZj z;Ka8=Lg+-+nf{Y$l(}PCZ+f}0iFoN;>T!lgez)z_eA9~p+gp~bC^m5?j*cq#w!6@I zxwRQQzmb@i8mK6DA}28=BnUxdnWZND0pIX#jG&3YgLyW62Eo8b*Q9a@eoC6faLHf&F4ZtTrHeEX1wWFKj z^aO@S_s&>s-JE4JBr4HoA5kSSLQ%%+L-wPP8-{p5NFlEXFgY42g=Pv&l@xU;OvGJq zDZ&du+S|4oZ{%cpaLfJvB?9%?w+x(Qbb{=j1K4sYOQmj0^w`YfH@1e{m;-)(d)w!l zn}8C3hhAw|jZ+Z>QmBBu>=@GP*QiiIEIoES=KsmNWBTMmy#CNAHqw3tt%78L@#J9u z9fULLHU(v8*vV&=l%K(5T~vU*Sa`3g7vuNM!?^jMzCX79(kEh`GIG-x?O2jN&}mU) zf~%X47Agfd_s37h@-P2suFt;g1m%E#;q9{PyWQv#ih#+(b4X#E(j&LuvvEc6=a-uZ zG!2>?fAj;f<-G@}b2+E()6kJV^rcsofsi|nxi`*bgC*%L-8B@TuRDzY z`gn=v&1;IG3(+fn};-`?>6;K|`r6zr3IxjY8t| z7G+1g-raGufYyZA%{{o^jpSi1&R1G~bwfw0-FV^zX?`t880p z?S?ld61SPpejO2-hA%PLC4@>VPu8&7_jLtZbo`AoUalG^Dv`XA4A~;ynlm2W0 zG|PZ#tw&VTP>-WMD9ZA=KoMdD1n2=Q!4s2T9%q}cgBGueqgaPW+kb}sn5H~^4XQ%` z=MkMeE2J(3$*_PY`;?ubMH%U#lmi%0YCQMA!(FK!#E_Oe+}-S=7&5?k6NpSgql4h= z6sum3PMyA9P!Kz~9JDHdR);~_MZs8R6=IU>q+3nFjkb9@QXV=1E-Ew2sLRWpvNXUp zI2G1xix;Aq(CkunUJ=*gI_bByWlFnu=v4In>APd%Oh0ZvGZ9^Pw~}^bUgSg@f!Lg+ zUF1!7cb2O^JxyC1Q{8BxfIF7mV#q>+A?15QQge#FkVX@eal`+0f9!hqQ_$GMF~E~H z>venea1Hx8+w#PTh=2cqn56%1TtI06|8nzT*60q<`5*Y`%_tbLtb4@*KPaBM&y>2Dn^^K)-|6~Of&BPD>N^ksZq zioSBC?OJ9$dK{%nTtU3_)XA9t*$?AMEyv5}P^8jp!ur6Ge2od(!t;Rgy6uT^XB5O$zOl^f?X9n9Fak79px;vBq&DZuyi) z=@z3>&?Gu(9n~1=QJ%anAA&sw6#Xp&SMZsTvlj!6py|F}JuKn$ye9VfV+m8=9w#R- zZXo0=@03x3;?_`P8~7(70j??SRNhrw8`<3*LYG*M)9rEwL2mNH(4ATSbX>Lc-(pkm ze$pI`jlGY>HS@oQa(;|5RQNg^o!pVFifj$f;Gi5&oFYkrUdCWuHcF*`wvETfXxY&J zSnOE*jo35)yRo_d(Zq8eZ%{qwO0s$UPVJ?j|BD58`X<0QY00N=MyF~$*}m%eV!_<$;r6&$M20zPoGSjyW*>X2EH9=-9Q+1+88;%@S$8|yko8t6DXB_hjvo-fV!-I zkV+EEe}Z<3qYA4{--$B{aUd=z;${bdp}~MMQ&A03VqMB;;dbBrQy)#wTp^V4_#>SH<+Xd1( z4!|phGg^l{%oDuQt0>l#nHW04J_NWMS<~=joIXWAkRrz+l*u&8jgq=R%HGccsB|_B zJ`&yK(>(QKxw)bIFappToQy3fNvK&oL+>=s6X-A6=FDG$dV@5nGL#)CwvD|9$uWTv z+Yx6vui$-gwuJWZY;5j*Jg#2&9j+f^7|o}mch7+5WuIx^mK(za-&>z`J8K{v)e|bk z7YoJvulmG>%6B}9=R#{s9O-;LdZ&d)e>%3Kk6!X!&-izh=>1^v# zV|Vl$TZ#V&^*Cr5=nmp6x8SfIplY(5?`&<(={A4R{@9&u^tvuSy4#{At|qj%Rf1TcyQCcaqcAdH3&AC3M)M`Ihb z+0w+Dazjg1X3IL!Aq@oRk#D&^;@as{HWT1om#uK`f^P?6XB^5c9y%QTPaTQPl)2TZ zV9K(*hKJ`i=`BtlIU5IGzA^d_ABimxcq>6Vi+5?a^Z{?$bml9sj?wOkRr*5nA^C<6 z9f?hspzq1Ax;h#=yYLcuHR{OU{Pe+C`jv;_p<&$Cw?FIpn#h%c_E0aHHe0UzwY+;a zmTuV?XHP89<`!PD`~mNhw%hJF`)5+I6Gz!35{NY_QcE!nfb^BSQkVd1#iumB3o8#cMD5Q?+{nsJs{;%WHdC~dn-&zuqX7*+4}*G;%~C?l1K zWzl!5dbhfHE`~Mzb5XhUJV7T*8f_Rnf>Jz#(zz*%^hn|zOZQTRCwI{bNYt!8u{x!! zR!*awGjZZU8sb!9seobJ3B1<1_EzFH#bSF8vT`xHBj`u+H0&fj4}OWG^J3{L`P1!J z;Qf9nPtBO=9mFBKFZ-!M25W)^GN1L9o#!tGQbIE1shK*&!XF!P*7eZD*TQ%3BFcBi z((fS=F{TUgU&d1b z=G9!ww3g{S3s|Vv#m*_~a)cVz#!0JGf&_%Y{>iV8r)IyG@O|<0)DOlp(?1aVX1H$n z{!50ZW`BTU5T9`G)W9wO3Sqnn?sLvXW`#Z~>QXyQBiV>Q2d@i+!k=8V{Bs@5+0`DQ zAG6J+4Abq!m})I$XuA~@$mIy94PijN4i%)+hXw_F8_#csa%MW~hw0`beO5dKt^V|c zoJyp;R5mI?r$@O?Y@q$%u(7d}c?+IZz;dYXXTV)$p%8O@$SGhwD)AiVbSZdFGN8Cl zpjdmq>aS=G36<0_Wj$}$Fo2BC2{x{ zzC1qmbyvp+CYR%^b#-;qRJw&eEvJw*B*4LTOg(ZUc7EzGN(o#Wi?N{v-WUxNv}y3i z2x|KJhCX#B&bA$Vvu=6{Db&iTCr>^tj9nkU^${gco$`%BtZ{iY|J)2f%C z?__&9X6Uo&=6v?iOlvWg-~SB!+KlV*WYXK6qAc2D8Et7s(94yldbe$eCw}}j@#Igx zF`oISua3j-d|Q0%&0FF_6N_=yK1q64I8*P2U6 z;Ac!C-YcINVy3LdWIsjJ>v0&5 ze*s}-wu|d*|8eehf-ozVAI&(I#zfuZaPq6;#3afW8chr^9*6JAI&Vq&U&PY+*kukMjV;R`uckjXLx8JezI|<+>D(IgU8jW_F*A4) zi|VPw(Z2RX6m^r#@)?I@wo>t^)s2G_GSyC^h@&$dU|Mx$jaDzcq`q)~5y+!1MJw=p zHah)%Tt_k2xgC1!;(a4FFMkZiQ!pqLNlfNEH`NYY2gs7*<~v4P$WZF){qS|jQoTyN zOTAxc*{;0K*5O{9eBZv9q78exC?9azG8c{b|bX$GAGRo!*{q(J>isY6(>py4;_nn%S4cE zcM2I4EmPU2LDWhQD&hbG=OpQN@o+W5yxE#Sxgk7w-_+aHoKBAxLnKTb(#IAHA>IkyH8| z1a{jiZ8`Ge59E&Bm$fIOD^1BSzD?-wVFhWF@I1V6HV*&uSH|f2E;x_`VK}w16WhLQ zR~-1*(b#utF?LRNVv;weH|R<8m_~u#Y45~R9HURSg45Qdk!^)|q`_6qG}58>mD{7S z8)1|5UWUe_Sp3w9nE%A_%)1_am%n01w03q-ilc0wUjD(Kcn~Exh&$U;(aHM6&1rq_ z;aKvGcpls|8Atx{Dl#d(-ij~!(202F*j((Sk6d&2d(o9P66fy|J3F8t zU;4^T@C)y@VV=K!N3?(c*%&RLSR5O$d>ux5!3f!(I{PLfCR*>OIQX%Y9<0n8c&cb5VTf0DX}1r4F_sua^hPdaH`ir%{}mcoqJbYrhXb0t_Dd zrHC7N(wQgPaJuW7?jUFD5;tUu82X*H63MuXmN#kfO#f-**cR&Af})#=Gp$?W)YQ!} z*Svu=GjV$Im2tB3D&k*}-m-O0E+2~>{Xf8vTBKb19|JlMI!ObdI3SETZn=38AfEDx zZEV3GdcFrIz9wgAIs**pWq%LeOW*sLhiW)NT=ML?dB@NXs}#)yX88K_cPTR#0-OL8YMA!_9$%Kz-vRg z>CvJ6^i=fDT)$I6sJABdfHC1qIqL`46a@uumZwIwY`v&S7~4r0l<{N-9Pk=9B|azu z6s6u(!Lygwna*N*!76qq^KvTK&^1txo|>LYRnNkQ4`;eY4e{~eLhNhc1$Ch(WlUHv*LHf* z1&`^+=VSBH6EQOqck(mNrsw8ka0af09#gJoiYsk)ZB%cv>5sotjxz!$|Jkj1=Km&y zn(f}ukq!$nwW%LBe%JLlbHn)bV5#JF(->`aW+FF);Vp{C%tV(lf{;Q9ls;5}5v;2U zE$CMIaw$F74OO4IW}Q+=8W}D^U;AvT%D<5|wioAOcouwM(g|qWCtsN&1jGH$|t#QOc~bSdhA4O;?*R4 zGwmj+J0@fJvu}yU&9i9)xO1;w`%T&H)O0Ee#}G;-l`{Vq8}Z}wZ;9Vsyq$LIy(*NO zaoh2uF?DK*u}5Z_j&)38&uDd&I4C1FoPify-z0%$?n6;LOZr9Vu9NVp(e#S4?VyZ_ z0tXz3^OT2l`^-WrR<8q${|X+Ze!2Q_3hE3iA)N z&LlW8+l^Semi{od^xg+OJVgvSHkd&v?}(EVuZ)Gp)r?RKdT7=jor$eW_r|W?Z%3=| zY(pv2898dhh@xC7uy)S|c+nuT8e!nR(A|dI#rcH6y2~fh^KA|mvVLhJow7#Qt|)#p zUka);77{sYSEgp&Ivn4LKHpPL-Z$$Z0`QT{m?)^TE^>~KM3r?--f&1x22Z6GC z@we%KKf){iWNdUjbm;@JqxU=cE;mSMk(tqUsEjT%By&RSx&!hVx;b@naO%%sIBbC# zm+|25fyN9>n8N9CzcoC6fSnJ@I0yR{jE`>LjSzSwt*tQJ_GF6g;8<*3b|V^evP=d= z?t+$Ss==@xC`$Zv#p$&C6&A|O>0GBpb6QuyxfmOHo^H)YW4;%D8q!q}Ago6zFu~Jl zSA=_G8cguK+PqJNh~Ql>Y(OyTSvi>X1}sBGm@6MDfmDjL3uQ5>0zeVwlqL#iwy7di z`8mbOv(udnRm*j)QXcTL6@|0Af!!(W^rlyZvqE|qPe|i(_Y?z{CX^k$)K8wGfJ*y% z-?B40ubWOqIfe3>QJ^;$l0Ht&PNI~Id)Z&QCMI@I#>2}Cv4|yN-CE0~EwssvMz)FT z>|-L`G}l$r`U=vjlO^hm{7DQNElPk#!*w-MS; zQr9eXY{a0=Wn7nB!PU4N71b=bOy6s14m2{?j!W4Zph2oybseTmrbr|jc z`L)r!ePi;wyeI#=_L?h=@?!?*?w=mPv5GSOm#4oz9_{Vs1p=Nl=6lOyk3|Coojai? zPp3eR(Yzy)d=WQ%>Ie!YZ{uiA6P4Zf_winNaWzrb6X#gh3eEgZDFC(76Y}eWF}Ub- z^h*f&RY}U#vP_f;)u_5|=~O>+zY>r?D#4_oX{sq{pYt^o;Ew;rgZ6a1ndK*ON`5(Z zFZ@PqS^8wm4j+%n{vo{WhmiFjk6jDD6}#tuC1#f&NvEL}ZGh^6YavLs#^I@Nh(W6z?cqrX@%zy2Gjmc^PJmSFB@T`zUf|U5Njl_y zl<@u09X$#j2rn5MCRrt1we|fngLPzg(@BL|D6!^59G>{b=(RT{zB_vFii!S_Oe~}J zU^+xauD@Lh>>pdxz}VTuT{T9sVxv|s?6KjFmrOAUXZe0S} z(5jD85wG0w$Fpm`GYBigv}?^+^^+)>4G6*9fJ0h$0SCfUMd8}$sEe>y$SVv{z7u+> zC>53BdSMEM>ds~RE!WoYqVf|PgtJ22I#P*Hrry*9-shBff%7bNh^xv+0i7N-c<2qc z!CO#fnO}vI7?%)kKFbY-5Gw#b~jHokhpY_&wSHU_oj;1KflZ>aj z7-#k)Zt;eneho@^it(z9krvLhEvGPsbUBW4An`vpYr!iXS^ADs-v(W$8S;KK)Q)d| z@cxuJZqBp)Bg%04GaVS@D0jImKKS?uX`F?6bAz_f7kxdU3O*AK#7hp+ z;dubunKX9%tABFlZg?E|_L11O^#0i1`(3X0#%ARG#Nc?+L`Opp+DV5O3+b7Al#ggo zt`zq>-{gU0fajG(e$bJBpG?Y45o5J6G|6j=5$F zK7QuqwRLq+Cx!rFLuWn}_ausC7M!NKmbVBk2lyPVJQ;B?L7A3^$2)M^c@kbh`MR#2 zR(#9$LVR#4f&SGFaTem!j_kw9z0k&upbg9mlRWn`baZ ze$&(EPIvdo@0ryTU1>vJ(wpBIk9^kH;N3JvzyKb|ajw#*KI>PB=e>O^K9oD75+`k! z{+kZHc<_KmGh2tT>%Y8uMNaAgYe1(iW*p=Oq#Qz&?-)_;Q1rh3RQ!vRUzcMToe?)5 zI}&$&@>zxuX&fJo#cbn9uaU9x%6s-^`Hs~yE$0pxqeK1jHGV33+>6HO9@G z8-5s@H5gxRB>Y(TJcpdMB-lLL=sLNZo|NwzMLGyNVF^`xjVXs?yaers_A1%DrA~i$ z+wXh}E@i{<^U;4zkNe7R!2ucMQjm?1iz+C5#^4;fMzJZ~ZqVZ2$=E*sE>LyR8^Ul` z&T+oHFhr;%b`l@!5%g9pkM!8VBM${3U7<27h4`cXj5}Ga-ctsd7E! z65xmLGMmRsnqPrB-9W&lfahLaPpUpPzYHD3ZpqmEh;WOHLoay$y&)`xXgCI6TI}wQ%K|W)#bS!s#2E* zrA!8x-q2V`@5lhOH7HWq^NeOG-|s?0?)@Ce%}{!7h7AbwY3iSDpG^-macQFTDupNgJewI^@?Y=jACNXWc0)bx~GJJ7xVjl+L!WCdE*8}6{5yA2FoA!ZjN^?+@9mp;}8Gb zd+((Ur0bjoC&r%EWKLr!8yt(Y3nTYH)qZo4C zI2F<5m$RQWP_7vS*MpP%JnOLVoW=^zrbs`>bUe^~rSD%PSfAy{%Z|S6_sa0``{d`V z|MDOfXEAaO@Hrxw)74yym8W?=j6RzGQ1|OWh(R_?J9!47RckFRub-!mt)Gu`F%dNq)ozIGaX zrZWeQl!t=)l5d`gH-7)dxan_9$F+ZRDz5sG$++ro&&KY*)s1WZm&v&1Z*GhecNZSY zoz~I>gJXq8;^`Hon8uBYkap#oH;S}N$UeISeciOB=UbLE7Nbjk*MQTQ)UcSCplyuf zNsWvN6tX**BPLPAGZ+}T#6bVbE3UE2m(p5%COquI8JyOt(#=rgUfplRSeU{{njp_) z_T6Gm*Qm>IRJjIbl}QW~EqY^+`)m$( zzxH|SzotJ4mlKIF=5tYz&U35a^dg;tbUu8U$`AUf5sck&&U^md5NAO?%!a282d3p) z+sg~7uxP9yEg=F(5MXL8#Q`0Jr>Ekv`y3z|AEh(v4!wNf6n;JJ?5@4hXestAz9-i) zl6jy}jklfWlwV;sga+>~1$By?-j+)!$2w(7%jr|N3I_3AD5gSG*BP_=C z!WQUdnf7#kMu5Q2BL|&A#QRbywD1NS6J7A=BS7a1ZVZO9D|Q~mV8B~yEThm+%&~<0 z_uESFp@>wh>Dkg&?pK5}c-wZZ-m*4I7L{++hN6_IzlYbP;D)Yxn|j_(#m+D$rm5F3 z%e{hrmNred5y1AB>!g(7OhGHB=qcN_SvHEnwaAI)T&}6QgL#sC(m#a&3c5AfErtzB zIM>&~#Z7Nr4I7k?%3~vVY@oeU9& zhM=GCfLpc~WhiZ&eel_J>*i^Bz^QHNuM+gY1m%njv_5^i8d}sZuFe=t`=L3s(a$Z|fWvwi6<0%t|Y2qF&x*JBIN$PJK_jyLA`Bdk}x^ zCw@Ps=P*p{KvIrisM(V}%Jv)CQ5>hPyl326UyfCUDtSM~IQaGcT)YJZd_!Xj`C5#W zRd7s?fnz+!`DXyK9`L*jAWa47khF%O^eD<7?!OQuO?MOI`Gr*ZncFvty8=(J@V zisBgc!yot8`Sd&A=d1r(o2Os*j{LbN2v*hr*GJMawahH4jbQJ&;N1P1WNy#b+`aTJ z+FI6aT28AVBt08d#hnDX%#a7Z+ZO*(-RiewzNLM>*D6tf8<&c>WeQYAO zZkmnlTc&dwJiTGRCDk3m5FDXgwrzhjCg;WNAb9QPDqj1e!E@u#0m44QGtoGBF!p_H zDW3UsJGO70jBQ(HQn~7djwma?H+AZixV^{b^2Y&g+%ucY1C2I{lKS%-UfPzYVnNFt zTR#Flo}ymqV13U<>j?MM**qc+*1Z>e_QmMPq4>aWL7V8rE!S_vlZGG;9jBJXqr#y( zITu?uJ{YY7=HDASyt2UC3z9DN)^Gc7T1pxLwcFUHf4c4HeflJ4SG>MHn(r`O5$vncL|qY0jM z`=7bL7tcQ4iS3)#r|*t!k41O>N%B2So%`a<Zs;rR zg@3l}kD1XYz?t??r~TYKOgj$4mxrICtYh(s_eGpK-iYh3+7#2%7Et)b{H6bR=6?6i zk5kU!q)U^&X&gC9IY$V1r$-OP!l!$2=;Mq-#+plbKX>*`DLq!k4uU1;+b|rI!YNm! z4dZT^`tF&!F^0Fc;&lg~irXGJ8Snj0PrdRd{Ju2qy7y4L;oarbx~DN(J$BN6MP#|^ zOvzpuw+BYcabUQJY#77|ykBKTeSn3sBn{>2=`#o8lxW21?kl;D$~V5}K}qY6?VH0B z3oiv}Y!cMBCBH%9D2cp>&fcs2G7&*J2p!9B3!CPJ1Dr~Eh1N8Woq~NgJq7DtMUZOZs$#4HXqxUelI@@5()|q zXws3^gF(uAF>SyL&hO>)(k=n{ZJk#dnclzcV=(7Wd%2NACLq3ey$HV{Ld+f`O~G(| za5Dp{fGn=Jluww3A3hy%50?DBcp3N2bA$9;2|cfBzB&{8z^Qa0^r;9;fbhj1(25sKL9#0lEmor=aoixD4$X5w)l_u$z0 zAmKv`8A_Rmv=1-F@Id8hDU9`y#EG)<#~uh}D!5SS?80I`=i0ARy>1FJeYIY@yf_tS z{)n04?$z_3F@`}g3D5j{^Tt5?}HzB zk}mF{o)20V_XhF}_fwBXhf2%#C!Gk^>wP{Wi1w3)G851HsN;jQ^S~0#gP$)!-~Oi- zVn~0*2N7KN(ce60CfT1h`DwGevOCUr_}La$r|Mh#Fi@fK$oAZWr*8e!+u(i(FAhF* zD&h=9*@0wL`6nJLc$ce73i06{bXbhWhoOai_+jY7eFHv`MzciOSABTjp9pjuq{wls zT7F6y`ro(|yp-vKW574ZoAC>`yf*&Uzx>wNxpy+Y{MRs^)clP5?fYHj1rN$UkmDBK zQtMErvmH58slka6*x=oRu^f*gb1lA)r@j`_WB#0gaXi-IB)x=7;|d8I z{6OrT{&RVKhU+E6%ny?O`{Td>pg>>0%(qj*1j_d?%J=tapu$-M3!*MQQ#AxC75lOE z<%XV}d%}e>6FP@`Y(swSuCniw74l0H|`UEAL zgOK8&}&v~{(NoTjOsYbc7i?yF0K%;d>38f<>Mtaq(f>n>+; zPpjLtWh!^-&1X00DYTuMQ?Lx>he{av+pLL~&w6lP*9qdgB2;vp9cWxq2xc7b5ZJC8 zYP00pGstA!JZG@Jtdl&XcXxTCvOv>ou?(R6r9K*+^_oQU8_V|O+)@hQ{E-YG+nuu) z^d)Hy9=#LMNPqEO{gE=1qTL86U9voJHy^Zd9Z$OWoL0X5ByQB9@#3tFKcJC~rA-AN z>901hPh_MDWALyXL(T|U2RP(xgB>$Y1NzE*8ZnvQVEOhZ_h~oUztla`0UwEAJQr^G zU)96=f>UWThq=1NG5!sO%fcp)+5sdV0V`wXvO}pa+fP`nS9(aR>M^0Fk!^GwmAvag&eYK=&x4aj z!-n~3q1jS)*2J=dt`QT^-$AUUn;SPi*TLx&_ylp8A;%Abx#7kq*V3vr z!Ls3M5EIi_<+RJ60@MS~B67eL8fF>iQg5FmO_2&S$-rz=_LF_*~#{feiWc7{)ysq%uOqH;|h1-pN2VNZmJUx%vY)vt4 z^s*+X$Q|IyTQ^LpQ%R$SOam<2168Vam3D$3VA;{d+sT=PW(?YnMcSBq8hBUl7a)uI zSNezI^Ru6|?Y}^9EjK4PoJFu6=_ig;%dzb$JV0vK40+i{jZl>t-W7QR#w`8t?bK)3C@jU9NRIsoS4b zET24S=&a_sC}>=`i7oLr5Vvx*>_JTLPyx!frq>86;Nw~tmx-p&GwI3Rpk0mTnHaW@ z#+gmf)1zHs!aMIhkTmU4?g^^PzEn2%U4Jj*M;f0CYo7~@)2LR+p9v^q;<>e{=dd` z^S_%Oo%8EXa~2YPA%_dWx$oM@!t8Z~f`@^)+qu`+1d}YrZj6;O?d&MjZ!1bWJp=^W zxpjT+g;Z|d0xm=3PhU>)M}@1<^czyI9*!~Di5=w^z~a;y1T^W>gGn%Bfm9SK3G$VV zS?h;UTg$ih6tV~)3BK~2WvbvZ4-sA`SIby=CS<*!Wu8mHEAN<#8IU)hW{NlWl%qMAaih2^TUDc)Mn zj!aWu}3$_0OVbleWR9+CIrk_6`-)`qomX^6hr>k^r zt3s!bLDF;~HQnrX%*}6(GyRRFec4WE+*Vmr)+In(-9VN&bQm3YvC>uL+r+53kRqx1 zXSJW}_EMg-cA0}~E`wYOpm$E+o1bf;3pG^b8HV6SPvZsqQ!d5msbRbZ?djrm6~UiF zJdHLVXj^xQ_Bt;v-_G#bD|PYupma6s&}mHG&>eaFBs8>-i^q6AtViR5rtdFj5b7&% zE<*z4d3D*(>)QK^2h=Q{ttKwx4Vug~Z%kfvjrr<@Unl%#Z0UbAX*k!qCE74XBfZ~Y z(N7ME7ZC={NtFIq()a#4)2Y~r{_DV-HnYf&=NFo-emgr|>#7{|aN&fjL16H;R_D02 zEZor3bLxvEUmU@KP>0oc>5<>z${;XH+3ma?al9Nmmi{m%`bTpe&7W&@IJ{LpH1M+g&Sirr4y7GEGi+PkD9&sH+NE_yKa2^+t26esP`2#6_gaV5XT9a;0#h>)uX@#)SXk=E-h&JDngZCiG0;=O4b#v_ zLCLkZJQe%*y*wU$FPo*bVW-le>7{7H5|>$CAGSuws}L7#Hf^8$5_% zeraPY^ft%*;^tT$Y>4ffr|=Hd44~jF%E}lODg|xZ>h@lUremRjveHP1N%}5#s`K2T z%;}}ry60?c-877or%NrxR-rwx-88_)~+WpLsavI(EM%&qW~(5UwkM`nVRuhjve* zJe{?Xr%}SCuP;_MY4Bi^^+{5u+ieo<%62Sp^^EN;*>l%@;&9S%F9wh0mMQ4m|BT^o zidFEv{FdyuqLAT$j9*QgW1)KX{&I%#dM|!|VYpCvYeUkStMX^yIko^4!oxkpJLn7@ zW(J2%m_zD`+3$;|X8s)E`{EhG)7-z9uy^LqMz1v!Q-hPSed)K5@Cz|;QxC4!`gsB1ss*Y&>UM*c0uJvE21r4d!b%~A2jnIj2TlDE`pQ~u z1$v69L|tnmkKWR{!SbD29#iIm%C1)Gxn8PpOFW3nAU?drP)OYBX>#i%c!0}ufdK;e zb#Fc$TQ&~j6OSFk8!Te)XA$;a3JB67PTNLApH=)qkb$cPQ;Usyegg|Jn`wfWA4-)@w&UOiC5gT zB|UK0qif}KjzUm}*=E{%L7I+*R5*T)qX+C~KGHjtawm5k-+J3w*n1fJjxJEAI93V( zc;Wb6arWSwV(!RW;?%y^#|_)=j6d@g zH^&{h0JJ`NYb=`#XjeO-;qwQx@KMbfMV4=9qm)IBXc(40{t>vCg97UA>R=8jBT#+39b z{hpiQGSLeUF1t?jkL5C=XWS>>L-!$qU1RC_LNj;8jyl|EJzpBiv6HI<&FvLh{AhAK zz4LeBeX)Uk;LhN~(_ft@Tn$Hy`JHda?|gwaBgv_xqIP8t*C=En=(xth{oI5~xMOwc z!4De!IP}y8go=Vn!A;BRDL;hR&~;q|@AwZ%q`({l6^4P38mNU&@}+fg zb^UL}>(c|&lS`%RGgsns%ADYC>T{IV#Q=k1V#6T5{yUDwV6YSqeCk*#UuApwF^eJ~ zRSYU5o^tFeVx8VBlDHO}m2icY=Nc5{zE-4l7!A<`Eqoy=NJYWbrsedv?X}_x5(naw z+DTj6TG4NvQ0PHE?$co5*=gydCC{(@vXfcQ6Ykd4GtC(QD$okg)7B`5STU2!`$S8F zqWi|%cwtB-o&r;vqFi}y_{#*@KHptLN@W|VEDenkG$?XSIG;(7^jIIV4$?aXok}=) zrqDzBIGug)S!WANKZmmy71*PN<~7KRT%?TvD&;+GaLE@lcGNjZ-{alK#@M#cA5V!m zhM{vt#qIPn7iEf@6V$9y|vF>{8%qeHtVA zbqAd?J^VD+Q5>JVJ2$x=>V89<@1BDllA=${$r8`q_+UJ6(|M zUsxa$tqo(~cYa4;g5}tTOjwAk7ykfD?PwW@K)SHShC7QTKF!FkW|RTqx@B(wb$$Wl(*8R3OPo}@A|UaepE_DsL}@(MI0DZ zWfnzO+QXY%ALYKH#k#>hm;eu_S*z!AsE7U2kBz%}@tQ9?9cRuA@Pf})a=_X>jfpfW z4yWUlC*YPp!XXyEdM^A;899@IF_WG@dG!1SY513Rt>qzW&o;UjVTyEVV397BFZa0) zOq%E5p;&b@d6zudZm>?{Lt4-@c&d#Nv@G3etMZT7%q!G9v~m??@%2B!sY=|qh&y=S zS)@Ldtl!j6$IiW{p;0TIM5&uQ+ev?tf{XQ(_6y~Jp#rP5lVbc~43dW~^6sUC@j5Pc zZ;!oDke$?7X_G;jEsGyvn4h4?K`ga55Vq&$_*VaTY+L?F+4z~X8sY?%vG<|^{hnWS zV05~y=(+xW8s;o=jGn&(n!gL6a4dxrBgd>493Z4~i?yBVQ1jD@TDW|1Ln97Pd{Z)l z-}&xbdKaC3w7gO<$_UV?d}^e^1$a)GfrKl`T_YDq#-ZN%pQSyk{Ei%`y8yynZD zu*6vo!Zd|y6`$VUbC{k?ux;+LqpZ8$d@{cIdyd8@A3Gk;9>9~Kegz<^C)*{Kqx{*h zG9{Z+i1vGWFqO4z29*o9smPK>g~o!)XvMfl!?(0J)h%_5s*PK%27TZ(c-{U=nP-~Z z4Nms#6C&3MnJ({1s}j?Il13_|oVIVpTfgp9?7Vs*KK|*W(eKLz?&9}zp~4l`nTCkQ z`M~E|sq*3y;KnZ7E7S_N?F_>}dKJ1zi$bR{Nd6&x_9r1vMI)^{&vQB*g~<+kEExoHIjtk96R zgrXQoODM|1dx~+RkohhZoGzwX?N0|_m7DVEhsvWA^eFW#-Av>!_2j2J2-U<*!K!yu zmpMh&oJlOoqd;j}wj0G^ye-d9rKV|HaLa|1g+{6E((l-P%7cHQqGO@hYAuu#$TD1F6FubFa?9+ z+bI{?nA7len=ctCKfPueW(^z|ET<82SE@VAa8$+w^nUac=va zWw30Dlke8H^|xvA`l6Z2v~Lcb}VlMXy$)!D6X12rr%P|h# z@?VxuTG0l0O!O0N`L(@3nt2{JlA{|pJai=9_of?T!SwL5hKCuFXMjTARhcW~!6@0D z^6XUu-?TN02}PcN=E5qDJR6J$)F%zskbDNgJUc)$!=zOjZX{FnzC0&rfM$8L$FfPU zY;`ru_muC9MB+A<_PK;+jhx>% zCF55O%oDGo6Fob$Sw6QoR|$Wyf*X)Z=O$x~Jek<^Bd5oIVc{(@{|G!ooDZxjlLQT!IeVWwP2^B5!mh=O+kr3(IZMlLjDxS@Ltnt zAxcUmk)GH30Y@v#^l$*J+wETJv>(l z4zi;NRY-oeGOCv!ob8|p!NWDuFoQ~W6g1U))!2e(oW@q@S$0ucjO3Ji6^NTcAO6j? zaFn_muB3^4(xl&?{o_#_{4~$FvetjN=~pBXcXtoO|GfEK@l}(bOy!aI6F(YQ7ZDg) zI!@~O+?Aelsf*F@9PpSWbt@iv<2CU|Uws4Y1=UDrNc^ZrWty9a*1(E#sji>vP(Gz9 zdZZ<77#aDKvGxUV`AJH)=4WuTJMZHJ%2d!&<^m)Dca6*Ol@t%o4@l&eE*L<9M`<<6LDnXQ*mZue;hqA z4@sIBE~q6vTLnD$W|WhK{v+`h{?+5Ln7zVU8)*+j~9axN;o!W%Rl*st7ACFm~xq+!pS)vci!p+uNVvPY2wRO za0KMFZbtQ$E{UbH<8jKop7SO}y6XH=$vfEtn-t;*bVV!ptj(Y@|B zM!S~&5L)@YCLK=yW#b`6T9_t62|Ig)1TBY)3#*V4OU zV)+ET#X#VFdS(gI5qk1BN&9&WO$49{6VVnwG<$7a+nAv3jc9M^$DjE>o{pKFdL*>C z;v)sFZCCLQmL{Ti6h$pxRkYE2QAl?-BFZ*Cx5FBQ{6&(p9fI?t^aVILz2)Huu9I4N zcgN{ybc!LVKtyb1y*bEbbo)sp!KVo3W-Ok;8lRgjGsp^Au6cYTAZ}Az7cc@A$wNM# z(F0{_IM-qoml$YS7Rm=pzigJlh~+webS8$q$sA)NcQaGBpD?sGEXKq}1V4)D>;X6A zyl@c5JQ@^wh>dl0DZ9OKo@U}1R%802FxEF0f;5_ZpN39J=cc^$D7{BMqzqYV#r%mG zaG*b62I(?;^{H4q4e!iP7n-?@1%8RI*<~7;XI&V_O`q5{cHqCo=x*wj_CxzxsVmdU z+IUgeL#|85CS$lr{YrNG034m=(@2=yu>_ZBodFndxi^F7{lC|YPyEYf9K?uo!>Q&% zkM=**nu)KSKMCrz1N{Hi@$ZaJ^sa%1EjfituT!@zHq)6lf|zq%Ch*Z(~z{tI~V zpHj~caBaq${--~PZSQ^*GpZjwm~S{(jwQyN3YZx99G;>*%f!jg?r<(wgN7XxsrvZ* zv1I%>{VoU8b(HJVGv8}uTtD~o8D~G2u_lz+k|$=ri!n2b>(0KDxPp5g!RifdDcvNG zI8HA&{-0TB#0~Eobw?*+=hA!AgVU>X+DMDTPIojZ7-YEy3~>27@N*mVC^`dZ1Dy^| zem%-}JB%?O*DU-YG;=p>VW2`U2fhLebp?ZYcJeCoeSSi=VbEjXwBp*%O#Hy~HQ7eR zz}6d<;~W0*Gtr)L?|@1`uapsoVDeXQQXnKhDIBDW%0hanG>uc+AsE*Iy@5OrHwAvl zs{$yyh>1_(EA`=C1X}qf6(O7Hh0;HXlj#+*T#HsLf>%r1DemI_DhQnJc4w+)M^U!o zpY4VhYLx5tW_duK-RvnjZjiz)vaRX01BE9@V|wE1PnoDR-@j0(ad0z}Mvo#+kVbw7 zTjTb^fi|QRt@Oc1ar3S>39`RPp_182qgPJH^uzYq0;s#u-&-3!cd|4buDG~F({)N@_7Y3a{JNm6o9GLmK=(RQx zb0(FqyPZ9pM0zQoWEvUGW6)%zoP0}e`uqmB;OnKR@b(VQ#J#y|rSvj@qtmgos zYM|EKRLDEaPeH73@;UPm#L3S+xX&rkzJZRj4!<9=_xcDqe`i%?O@7;`SDQPV71Vvo zppO%;{NR;(eCJ33C-Wq(xeka2gS4@&C4d7X%s6RLlsRSc?!|GTW-C}H|J`$!pQy{4(^6>q1N zOJBnqwCB*f+VRl8YQ>?cVc^tLrRf@R5o+o3>-8_AMHDpOkV4h2lVDeSmQ)( z=(Mv+KfjF^w@K2-uYMFfis{pXnB8|4`9XQ$;-)cwK_}Pq0X;!lpLqE*r3DIK7RUr+ zSBv+)Jlnd@9F)2ex56wHfPWf3V8bOh#?iO#K^inS^Q@C+8uOP;S0-_!Ns})$XziNb z`HqG5^~lB9SZH4r(*ryhtUrGnR^sTn4HURVs~{+3Fyg;RgS$EpPJUG^HyCUyKc;^I zPSQJqb&@_9FF7bO2du`RZ()%lB;3upw#?6~03T?y3i!yLFC3EUgWvJ3jcu~VZpr={=$OlFn{xzaJgA6{j*a zz2#AaCx|)S8q!?Jd`_@j8p6HwS2kIcihP7YSHv=Lq5>`jpfv54z8ZFtTRi<|S`DLe zE;AIP+?MrM^dF5T^8KOT@5TfFx*dn7MzJIv$?0b&%EAv#%|su?yOs3U_x#*t7@uCc zI^Mr{dnVMN@&~3;*}4urP1(*sU>D@4ajzreYd!*+e?;1^rp!Czum82*jKxnJvl+>k zaAD%-o%hLaUga^0^cU2UuGDQSla~AwPsd5V0*`WQ8ngNS@&*6VO8yC>IMuy7?=~-g zd?nr)rt-^Qdg-G$+rFAEo`|!}8)9m7AUdP@>{Cn9gfAu1?uI+oKhNdon$X%Yb>};# z2K!>ZeG?AAEMDEtm>TS*PkUHj{>n-Y>9oWoo}Ku`3`Ztj8;i}WVT69{?)_m*_Wk}d zhYD|HkTL}P)u?1b2LJ=aLEg-7{v4H`zmO*Y(LR4;SZjU>LGh` z4eA1%HtKTFCrZCS_-TvODYXKHirMnHGr z=MHFk{2M<8j_-$k-b#2?{Pq9ox8qQ&9jDzdL0#6@SE(XDa62bDPua^xNeIYqgddk5l=B{3_rFGG4S?L)U;#deSEw2T#QuGIh||81pFM z$>9MUn0emHL$;T`%H@o1MUPb_VV6qT$h<|N3Q**x9n$oB}GxRMc`PA@v6ZBV`ZEJ=f@Y^$MflZ zscgil*M{vzGV6eea9{uNE;QmLb;YZ^34}E9+!|(d9 z@&4{q>=&nz8?PF%JY2{PSFUi3`b*Kn@b^?K*MU{ic?2nUf?jj|)kPgA)O}Z4etAK) z+OK&BTyhf@ed-!;8Rx5GT>g-*&KmhO&cUg#j9z0KNcQ6D#dkx-lQ}i5;pqI(_;I$E z3&dP`mdjS)n%@~y?b-Go+O?hcgP85_jqd0qccjJ$luK+|nPw^cn{tspa?eZ}{iMxV zKH6aLKKHU*x9czF32kIUnM}sMnXds0PhZC~5Tg}hIvv0(=MBGz!OtMBT6#}(P`-AQ zM~Qg|w@P?`*PFuY3m86G@O0lYxg*}#+RB)dFMQ8+&eKrTG~Ro z4uVx<;F|t&ym7Al2JLsB{i|`Ng`uG(UMb-66Ps0=t=xF;F+>~hdmlCYc^u;(jBok3 zUmxG~fBbRW*PV?|BTtqGy;yeod4K{26E|HAM{dYM1q{X%uzxF>qynyR9;Z{0b+CwsylxsP$}RS4Ev_P0y(-l+IaiB7T<#r ze~Pw1D>CHLiZ_=L>>|HImVW-k=77%IH~Cg%{C3`|WWj$hjG4g`v8#74>6{T#?t7K` z@CENZAKFe=M`Tyfr_RdwT<8GszH#Hu|31fyaBc@tNS%;uU+9YExq|kNOfT~nYurJM z7e@!UWk3t?3m&vsWiTKGYBDPf=u~dA5jQnAq$0k-pGk81E~g_E12Rz&(2YEMS?ksT zRnzPWlYQ>PrTR*tqq7K4q^u=9{Nj%Zq{85(+#swdI3TD0f&6(+qQ}!{n5le?AJ6k* z`6Z3SN>QaU&-+qe#)0c{za5Xj+fQ{m(Lq7jx=zy_)!Y&P>bcW#qU(wvPS8vJlt zqwcTrZ1GgUC|vXnH- zC5s~Nm!G^;3HLGn&sD%hQ52dWuN{9p*FTnXJ~#&Loy!O63^#e(ogS+3^z`?kvl?;3 z!q4+gJt7~tS=EG9dL`$utieZfA`VP^W&Y@WBY()|ccL?#r#oxU(b3PA*kUU2dT ztR$ooPNo~iQ-f3SGjor`kIz3G@0&XuPY=%KI|pTY7g&RCE=g%@JiDfukZb>^JV zqt4p%Re_UjC7AB~uog;u-KH#_tK~ZDl8W8ZxEJ@DuTQ{_A4e&?d#W9KJ6&|C-*TgT zTTZ5v5AW!@UO%qxqa0}0v#~9jGZejnq6o2(w#`zu90ZXHN(ySOzJFi(BGe8J;0b2gUV zYTFWwFZaWo>D6Epo4-u|GyKQrY4G>*J@v zpiV%(xfJ7bo@?IdR&*im#+^UpP=Oe2{<=1&`Qk!_0@0EstROqo_g}oA$EIZ`VWnI7 zZW_8sKRRG_P<(-cg0ND+sdQl~n{2yfUimlU^@vlzG8AFJI$fUB#3LAq()i? zS>dxQ@Y#a2*ai7p0aC&09rwf+;Zj|zI6)^*53fxh=Qp)F1-#P(b`x8R>k?XdhBQ~T zr(%O^#3P;&Mmt(lcp0kMLF_{1Z2|{*XEQvp6Ys)lSUr)1ivRL+DX#>1r(6qARk@Z+ z!Vu#R8Cdv_w2W8~RB#ed1hziQBd@$Gt(Jx%^V|>o3f{DSm0g>+yC; z=(*IMc%=vhUxjV1|N7i2-co9*H}#_N_x=Xu{a*b2@A^k^=Y5CbFqz)dZPC_#PDA&= zYguo2P!8T0;5~U#R(UQnaityObO3Tpaj(3}W+3DFTfMz(P-e8eQ8q@*wQoj=zBYH{ zZ(qJAHZDH{9rWM}Z6%i={qsz4y+pq$98SdE>92_8CWZ}Ir*~Y@`tkw@C2xxu*Cg67 zZkqpYL{OD}UuBd%`i3ot`{jW&|-dgh>7f`T%0)FB$P%GvF5}s3TJb%Ahb= z5lpn4s{>vJb>Jn9VB9`J*LN~x5e|hu3VH>Io^Q>pxpVUioPM8gV1JIo%1j0E84wy? zOI+#84(_hMj^+O5>|grzn>X%?S5HjFo{kHm2-HdsB}=%)9HvVCae0GldI((8FjIjM z{H)7wiRHn3=l9i_rtnSSuZlkb^L7d!q;+_UM{@YvH7m$I?=WHpQv;ylK+0EJkzviMj2BT4^u z{NG>lk7C0qlrB&I?-Xr;CcR-Vr<<3-$ceC?cTl72$i}K5?K&^aTCl!!qS$I_q1%m5EkTv4_w3ON7h8Pg`v^vKFVqZ9ik zzl`>8sSJ9{t1?_B$j{RBOkvQnQ~*vObk*YfVsdyW-yiF~GETMc;{DmUasD^$&BVVr zXX*i9(21vh=(}lBO>+&P4)5ukJQtwwd*h~^KgboPc3@$7l=P(oYhk$pRG{Ge;s$9V zowzC(DyW6f7XuUpTds}=g=R98B;Y=+I~Yw)@gNczGdH>@7&5JND{)$t#;^T3y({p! z0QS*pf7G(ixH{ge+mY&f=R7)G6`m^KYr5U|fvs1^4IK}|pnyuz+Shq-3Q;A#C|~Q$ z_bM)~wenR)8Q;i*J4)QR@)cCFsT2WuvB)yw%O#)FPf?gFGE-?2Sxs%4F6#h)-=`wU zcH)K7_%>SDY4oz`hP0H{*R#bt{~uod7vk{D3@#nGn1%PLe7RagDrMu$h=Jk^(qM{r z|KMZMc-gnc&))P`prSjgBYwTpin9>FHQx*>Tx8CGvEsc7*y}(;0^Cvw)9$2ORw8gG zZKNlE#Z~EjxgqIJy~+UPr1*G$xbucMJ8^v`*w*_Xp7358@1(ow3qQ$UruSaozU60U z#$*?mMuL{UzFd$rOMb9}IJS6S1@R5qMo^V-+uR zE7P9*{y)bJ@~<_45{DM*49dx)^E4!BaGtM`4Qnn^xx$iXxTOT|5sG=WU6*ZAqX|a+o6&a~&sXF)G%rd<4_>oo>;(w2WNy(c{2c z)WUSY$!8XN1wMzsek=;D?i%~5Krx_d!DGC^KKDD@Cc^d2GqdscuevR6Y)>X{q_Xph zcc=2r^rMfn0=>w9PLatCULGBc&vSDUFsjZ1@>dwiRM z2YgxL8@0&mSND^1^ z{3S4&K5`vcZ`W^uB@p-dBM)7a=AYh3Ik!aH@6jn+b-G>LsaucLDf7fBJD`#`HJmqI z>i6U6xF>&opH07DR{9BHz zMK|cgrXIER;N8Tia(6n0nx7@*<|}wVn%vWNJmBwN+lyD=3S5CNQc!f(0wI;EH)Bdx zZ#VZk@LU9EnRZs@x-m)NrIP!h9oNMhXWWg1l0$K(V8sjQBamDDB}5fz5nSq*aSi(_2)Jq~hlGzNKqimLu;dPLI0r$Y^(&ng)-)io1#UOvFho?x}!O zp5oYyJ3CK(-;SeNOKHtLwa$!QZM}6{Vjt34eI?9q|))eH~>` zoy4=fCe(ls(xdWSp~J|sbr5lw8#}oE<9`zW{F@fz+E4DF%uzgp7yT!+A$K|tmZOKE zx=h~wNGAzjHrIbK4j_WUUc(`O_@k;LL*jzhTeYjg&gE2dN zB=7whMboUs&-=%}{|6|Dj;0^rW;n)Jc?so9zi7NRZrb&Im%B|@;0j!U&k;x^P$`ZJ zfr77wk}fq+LM=4P1}4M_N>Y``BhH?)AkEm_nvTD6^>wkQHR+01o^_qx&9E#nA^q$6=j$TP2Bvv zM`gQ4nq^DLpJy?fj|lge<}VYqNsmL)Y>(mL{(yxp6UH|gL3`a-@se}rWjDSW%#*0cSU>-Js!=L-3`1|kp zgLwHpPIWf%x0>-gc*jfBQ!C(6e-O+5KtoPFqims-)6mk)A8QaNy*8m%xGC~0dK87c ze&2s4K&5qP;!9%=Z&G}AEPXgO44z3`<+LruepTWY)l zSKtbK!Gl7thVzB7!lQoA{hIeFT&g$~asJ|!-ioRgA$8N_RQ&C$ULF&qNzWERlLxGL z&z~k9tVb)VcvZ$9KYLAlWMNl)dVY62y0|0u^=Gqe>qw!dLgh~3Rb#RuetG2-b`jkA z7gZfxGfka=7g=7tF$#t28O;ONPEf%0>6hr!7;x`78iPqPbw?=T<0#^1X`1io~CSfzruUt2+3|NenJNrIE|cW7 zG6pKJpQNaup&%qba_=|JE+;(kgMXe_m~OQT0G{0dn1&sFee=#M3it|KfiD&)LU|R| z7idM{nn$(Zy?VuIXpf@kH;NZ*{Flw{h#%f@8}e(3^rY=8oKVmxUDw4L%dI#y?8XO9 z-WcyWeN(*u)b&L!QC{WmAi$JWMd9Y!pPmp>I1g?S4|8ND@$t-U*KZYYzEQc9`;r1k z2~HJy?9Of?GjsQIn;X|?JLEyps(goC(r}+YoZt_iPvGr$!7IPxB}@+E&bj?@=kaIa z^#`AfYmXmHydT_ib^OC`_^wp4wmGMlQ@B!>P4_A?uKSrrqeS;f3X-Khzq=@?a75i)tO>3Fpq|RRyf#RoRw}j8w~2SXIE(GX|;r*6r`h z52?gZa!%nNoqBzoZQqcy4BPR9Hx8aId?1eSOgaBk{vuX>sQBP=f_;KMSW~^x3ttw`|-RKfD{|yIeLXs(W*D9?I7PHGb#t&GCn4Z;n4c zaf9-QvJ|tbudEE*Hou zHIIv*JDhWK6`fYb%8)e0_|&SCmvbCcxRx}foa2A?ucR_IeR*fk$jim3C~Lqwzmp_a z;0j!UFIFf*qbOem$2j<|cuvLB&5#1$^{-*PZS(HF;JM&MfVWxut93=+d4zd=@-B$G&b3PK#cz0p~lKDA%Ej&{IUHn4NxBv3k{F zm_RLXKbYcvk^=HQNT85&s=5o-p5?5vCVwjU^lW)vLc}UqwH>4(MWn*jYx5o%?q)O^ zSMc*k`lonC0gtvsy!D}n;=liychTnJZRv&mR;wRphD*?>c)}{5ekxqO;1cqi=6sXt zH~VUQJveug11goGkVWRR2P#vKU-Wmy{b|<`hSss}8{$;=x_rNL;r`gze+sg>QOTXq za)<}GBq@Q*i@!=TcgX|tU#YWz`v7W%Yv(s&DX(rClS}Kp0@B`tXSROr|L?rq(W`*@jhLkoF2R+-WxAbj10+(v-;i#OJ%k|@HhD2sZ>wSqX6G4G15F4OFh+dPE-4{f(TDf{TeJ&))KhuBuTsUba|^{=9*0-H1K>g4RtsDJz($| zZWu;uLn8*88*%&oXW}3H^IyZWa-$jrljOtA<@hw7uZq@Fu~fX{3b^ci)+5fpNt;x_ zWH(Nzm9Dg_mGWm3R8$2g?H2o<8z!JsF?57=;_bRJEr?4Vp_%W+uPD__2PBWv(zm|)A0*v#J)3y%|L7xsZ{@Hn^IVyN zz5-X^iwedCSP=x{pnyCd5K0ISMN@jJz}q(Nh`+eQ-_%3kBT0_;7UI`VKO6U)J(26J z?E&5bdMiDJyg}GBQJ(IG=3ZYyK~+vTaz%NNHLIB2rBvfljwT$S+);`OI<%f%T?eI{ zCu6z3tI~3f4yoDBV|0rby*Sz)`pa*#K+T`?I(6SWh~^Z)jC`hbO)?PIqriBJNy#AZ9%=3-GrJJYPVl zz0=DDPLK@f%$zpnD$mJ-XInRgN0D0n753Koem%Vz|H@J zr(#5EXq0v0O2wpTwEAEXL$jOx)7m`yig!5JQi;-`HG^A8p2RZNXc;3BWMJkmp5*PS z(p`Cf1+Ksq_&kF$aC5v@Q-h9vcNVK)8YnVl#2u5H;zzE!8!v1r-hJvo{F_6cil-LO z=D0`frIZn+pcwztmlT=AWK~%)C&D&x)I~|P;r1k43&kW(d zIZK`yt|-M3&m_kCB@IeAjK>4Fy!;tC>%kk&pBd!8axt~D!RP!#I+4~^aNRi-Fwc0^ zO+9PMG&Bfzee9{&cIb4{euTHBTs{r)Pngd(>ItT@6$h`Sby-LLHO=bN3as>l;Jq;R z{&NU6_7Bmr*;r_A!W+IiriaI(Gnh*Quow|F{+9bW=Q|3Ul9`MuQJ)Pml+VdnzOO;jd))^6t^6^KX%L= zjQK4aV*aX4c)hf81GzVnR;8?B+(-#{#rdtS3fdo9P>~ueGe0LH4YxM4$#ZTN<358I z3F19kRWCX>ec=H&QR+jdz43zm8AFYL9Y;^bEAHQi0^*rqTQr8AajTkMRw`iHm~A#q z`D+C=ZG`&oiXoIix@2s|)u}$$z|B`11_z_p+#Ed=-&|aa@pKq6&%>MT?BmM|s#UqS zA4{#7INpAB(y`@cwj`a_6@7s+?qQv6>_41iMsD}7-~T!_-NM`bJ14#~HZD$~Y}>JY zsS{i0o3X9ejV<$?*s?eoI~FPC#$9C-Ry~cJ_gox&xyC}gL#!-eIQ?>NI^mot?CRYW zxB^$;^9d9zt5eWI3UCycr#;Og5B~nuufy^m#6R2jk(gI1C?`;A#p^XF6UOp-P3f`v zEUes*dCSTT@9R|Or6;XW{;s~y@~eAi<5XD6sQko(XXTiizl>90wes5|e_Wk+7!Mww zd34XUvG1O~6btiR9fumF0detcY(MIA>z+Za*Q}I9le}5eslTgEhtKR&t zv=?G&(2vE&QVjb=8JAx}syAb)dR+%DUU8~o6*h3LJl1a(iE{tB2=<#WXm(@oi49S!rU?y_dKU}sUjA)+L(#B>Flrb7m8P8&1D+tZ#m%VuScuQ zJ?=CahH_h@E{5we#lgFO|AxOiIyPF0gTsY5(w~pR0Fpp$zg){PXJvzfQ_(WA&tB8( zr6?<}568ArJKAUQz5-X^3Vgmn8O(a5`NIeZ9>==Iwb!rTe0^-|cH-xcJf3pE@!s;- zs7gNg&2P);*=oa8$_e8uSh=qRtWW2~jin!l@%U7-LZx5@bE}B+-ncXdP+r`&bN4Fm z6q*_5%CK9$@KSP`woDEfsN-qHCT%O z>y7^*6{z*uGMAJ;g0g)afjt;3P`qoueX1|Jpj`*9cSEayg>fbP`KEwtMdrq)<@Q7z z=)OLBjcs%(_^M}W^e+?C`YS!{0SdqAk1XKdCLQSv#zlUH2Q*?41^jNh-A!A>*=O*Z zW60l-wheMvQMTms%yZJHFMCZl7LxWyZ}~@~d`bCM;{7QY;W!oVUpyU0V=0dG=5j-Z z%2*yVjoaKC{`8ihdk)kC_6l5qEAaUSWh^_k^NJUsCErBJDi=Bkjoe&<_DBJwXTV^0 zZCEX&EU1N-P?xjTBOX_r<50(p6_GHW*1KBKuHczr)eCkCST8=O(B1IDlh69$rYYZ+ zk`Q6#=S;cMY6SNaXh^-Rt7oR;?Z*~Va4Jxp0q}5<;zti+ZsSz^(s#cpp1yfUeB$;! z(Oe=sigw_ptMr6xi)Kl=8ck82(|!b>;u zwDJe}50UwOqdAmr54r1s9QKXh$D(uxgXf`u!EuGcMTvZ_fgbS4-&oH!6az`6RdkbW zD*b%9z~Vd5eOU!bZ}0EEF_xNFmG8$hfwABLcAJ+Ui>Vipco>=+h`6&MA;)!gnR0&YOLoc zA__>}SkAc8R8;w|j>(_%Lt$G=(S#+`|LW(}_|+tk?Y4gH3&#Qb8>A}5Bf~67bn`y*h4j)RCX$94Tog}G1uNOUUUCr z@#f!uD8A{p?~jG4Ry=z9)hQQiNM)f+bnVx*V?AF&?y}C4wkSM5fg+7l+|%IAyN$=@ z;}!SqEuS=ji)PUzxIfm?_qE-m%eLB1TC6dYbfE3T6>8Mi`e_wbW6po~xd3I27egp# zE^M#rj*uPOvEwq`<$}_OPFpww)QsuTi8$513KC<+*%{)&|Eb}z*tz^k(qL&N{VVFD zJKfCem?;O=*d{&tiXXD?=t20&m#w#Ne%m{8BvpeZJ$+yCoJ=Z0+)rZ(tAMX*LQDq(@i3t8=8#tArJQ@;>91tMm#v zgk2U&BD8VA%{mkR$y$>RsMRTq^1K$F z8O+D2<;6HMT8v}E#W>kt%*w$w%dpJxvb@$zLbLO|ieE^Jp}H4pe9T`%9p_-8IayYX zS6yyh?-jTLS73dp56viJ48dMWgtgYSp){?_1xKhT2z%g1wJwEGlo(rg$Y8cPA zf(wG$`+TnM^=j+qdd)ZE{WrD_oWdXcI{eFTpz&rrFywZW;;Z_k8=w$T47tHc3&rwz zm%krt@l|_{Zr>E2eEHS!r(begeB{+PT6zpp;*v-wPEU9eIh6-~5bbVgPucQ>E&l(P zTmFw!0&a&>t~r5z2*cw2CcEZ!NnHhL{=Yfi;>Jms4@o8r!i zEpbO@OI+XC7}M1ni$6!!!)ow5V)b&Ct0Lx~Ljl{Ta5M2DST>(=Pg0rD`s+CHae!z& zyVopnBVMJgfNU>wU z$4ao&@u=0(&xbWxGp~@|U%o58UwX2>sBp>8n7A)b8W7x@K|tn|9mC*iI#cmqnUfwp z?{WunzSqko1&@cD!#voe{N^k?a`x7NuEO=Juqlyw&3nd| z*W4w|T`dbz>E+n3a|oo($JIDXuc6d*;ZQ?eeyupOz$!s`S918T81jPYs`MF?s=EBE z%5kbai>aqMNmD>|>~ys9PA{0W!&aO{fK1|?crJ&tgDPC7NNum5GiiLde3vo?7k4y3 zF+!v1gMLo3b<4cA2(%knefyC!@zy{5MC`j|M;y3uYcxC5f%0wmQ->l%FDO@%0nx%)L3Qj z42V27>J{36mmYeqbyIuU99L*lL%FN|CN5b;b-$YK3cNUwXX|h=SgUwzXnpzSx1fLv z^OUYGA=gc+`|+%+l^8o7O1!(hk_|F*nf9&om@4^BpVu4zVG$y@g21s3pR;lTYU&(g`uD}&o2Xge} z*mca5VWZc_XeG`uJ`O&WDcDPaDK8#!XR?7BtW(ZqE|Ey3wA>lG~0IF)bxd`Ko0@c`7PXSP_mY zOX3{=bqT3>eIO(TmGV^y*Y}oG|8-5*C9Q_uZh`Dqgh7? zO}~%U3$-FWX6w^K9_oUz;R~rM^4veLS`v zSdFe0c?)6RhyoMPP;A&l&71 z^T0RXy5()}n82!?q>^da$dl8oF6*>&Wv1-N64rvqX)tCU!b%$ASJTS|)j#5$&fzwd zea(2eu4^Pv=X2P*u9C??!a+IPn20T%>A0c2DPD%B{F6}SRd;L_lDapW?voK@nI%7y40xr|G%j?G*Os^ZTJ#uJM0zciFu zt3aMq@CG9)@Hy9=v&@n@U*~g?KL*Et4duJp>Mez(?BrT2*@|n1sMq?y1l-(}^&J_P{p&hIBbBkowb}1wI*6+b%H23K*DxOAeI3TDDnC7D zoMn^>YtPyzm2%CrLNXnYwZeShiS zPT~soVmZOx)6t7X@N)x}@#gZI)FK~AMPcHaw8(40xrRblE4%{F1y*_Lg+Q%%FAS}> zZ+`PTdc1dCp_g4>t}>up;btd47?y<{1Qz9vyX-?b(2KDSkbJHy!(-*qn3Br)I*nji z{JY5D^&FH;2@Vbfo8jOnpDHmV5+z;`GOzbZs4`VF1Jm!uQ@#;Je0O(8+%>&3_B5tZ z)}5HZ3iWe?UNUBxcDJrFnB81a4f^!XHAEgxt76LpbTK?uE?==@3r7FSJibFD)ae;mO_j^uvBM0 zEZci=k>9cp@HE7+h%AEw#*Hm6jGi@=LnKOFWluoq-<&?AziZl*T1s1eFMhQ^Umu0@3)-jT3v&H3SeV#njSWe8=)JPD#8VUm9k#D5c zSSVA#1+rNy`AR4~TH2@rR5g{&meRqcFk{QVI#1qLWG#JhKCGm+sJ!Q|H#JzH&vdXC zzrL`fGG$)sSos8#f8}o}XBFGJNMhw-d4^X@wD~aQK1DcytehpSvx(+Qer+nZd~z19 zjK9oExcx(W8g5YtjVe@pJFp9dHSBRX3NTE?^OHDS3rO{u&ftkj#|VUuU*5tQ7Im%SRYL6-!V4^paB^+@x=a|M^Wobh&fZ=aMj zB~ExDinr`7fQpo3-`g5_y2!cn%WS=2_D%1QfmFIZUK$p;&+m1~x0{FYfyiP`rph_CYX^QT+8o8!*Twmi}6y7tD{*q$W4(@d^?LpKCT1xKpGF(#v1Hj`Y@}ZUX4jHbDb^=mycx_plw_lopr5AgmMe4t*g+` z_ZJVzJ5{?oO@(GH3@Jgr_8+$w3zr6QG~tCqHdB7C_;f&>#zXmBqOk?WuZFd-_I(MW zpVvx>tqrwsPScJy57Q1%;7dmZwrix~p^|Z|IkLz8`JADQPeUou-n&q+-ZA{-C9m{v z$`cr%95_g7Ub$)0z9`@RmNJAgp37D5R~)iv-sc-LXRse5Cx;JUTpq)^+k*frbhfcn ztAUsNWC6$$hdKXV_Tjzp;FsMHr+0WJrIN;PK%R~-`TY~I@woJ&3=LMiT#uTbrM!nm zXH))o*oMR(pu7qy;=zs0F`F&%eU>Ztl|wsJdLH26asH{2ZJ)7Z61zIc5eA##v+2Zo zy`Vugg1+KWhLt^)XeLfR<}#$^f{Qgv)^xhE{tE@NSpZ>NU#x{3VMzmM1HF^)2&K2m zvmx;?mYWQ|r9>ECrQ#tVspPA?=E^A}z&4&3F2yN-8EV*z{mb)l%3mOX z@vYYb(9JtUii}!dMFxMKOs~;$R9-b6YoTsyDwP#jZEp=DypSe})^wR?Kx1-uB{&dr zSLTZZ=^&KzNDEH3T~J{3M}7KyGHLIx!PJIKNiPGQ4;OCVg}?zoJLsr$^H8n=icU)} z93tDV@}k1owXi-4s|jxBgJrI*|6+JTzd=9yujww+WM0~daP4CNq*n|cHBE{DT`jlf zm9<^ssOVmUPpQP|eWQ~nacL$zGbaH-X$KS8&c2y zJ9flB_>J$$I!2>oAbC%G_dk6)-u}~zIWCf3$RF_;k^ViS#ds1~<&QCF(DmRYmHRSo zlWlSADl>9B4DbB0jDcg0G>#|NwDmZZ#~BY!c75?~3$8-Vx6c{US!rjz@>0rf+ie@5 zh2yChQ9L@nxv|Tou+&)raC#wNUFYDOZ7sJN7sXGj-siijo%#1dAWq{vHHPCDtmReZ z8_g?nE8A?nra8B)#^2rZ&sK9nFd0Xp74Hs$<=c`;HDkd^SOnLo5Amp_UKc5;WU31{ zr^JspU>unXzqfoXwFG~0VuXUSWsa0eP>L;?D`l}-rtd^Q*N}OiLS_x2jL&qH;A@XM zDCtFNro7x-F^rSk9~?I07}f0UO~rxca?TP=q!|w?ZXcMp+0+1VU@M>;s2U#{LIoG$LS;V} zur}$WB4}r~)t(P!i;tGP^yD3!lxh7v*UZ7a!s5AtJ;+bVrsJ@6o-+2aqc_+U_p{?t|I4&;;s6We~{o+#m zK0q%SGD4>O{-1wsyz}q8g`6jNac_L(&paOA^S_})DO-^LRlXVykHzNr zqxP2ko!}w7;}O<#O}LeIYs`!=+#NG2)V_U8e>=wHIZ8^UkZq#9$@eJkZ0jZHzxG{` zH|K(Bl+g{eonO{iZkKA8yrocByeBn>If_T~GOH>G`Rq0yT8=jj2jBBcxO z8xTPXYD-BpZJ7j#M8T;fU_J*>L5)Ys8K+M+YD{1yj0u>!(c>UP58Ud{y&k2dr}szN zJPh453QsJ$WMUea3YIvrHJ>OHFE^7XG4d**t9BHHTju6@v4V?i+d|uATWlrK4j6}> zkjfq~UtM>46WrVBS>AcDN|Xz=xj-r3GHNE%woc>2c_N>YTn?&>m$6>?1!`K>G?7`x z^Q_R!wmU@%U7bK#PEYZC5A;&?jf1UlfH}=y4>XxGmAb+ut?(KjXkdL*I~d>@>Ro_) z&a#Zb^Qm7*0ZN<80JUDYTRy^f82VFnnZ~|#(nwkpcyAuDS5ee;<~VttkUV1l%CnTC zH{2Zh`*m=RQ!B}rF9r&)Tny5HaQs+5ZPNE{yOyZ(c}}p(%NK&0uPz4Gsq|3k)xR-b z%5?TY18aSvmVUc)PDfVhtt)3&Mm_59tkmxegkG!4$V)*#+C|7>i;W3_*p2(WOXf!t@pG-Ma4q9;;Nk!NRH6L|ALmRV%GPtEU020X&{-Oy z1r_VL+KVHTln39IN}T?0(KkgwUmVuber7 z)Ql-BEGsXCuc^new$^}XZ1|5)S0z>ivSJEQ;5Z%R_rSF>)3OtCdYICa0Yy+=;#w0} z7{4#DTJhR<=jNkq%Oy^uU;sYe)2CU#_cbF5DI{UwTsx@B(XzEuO_$zs1rkIe)PrXQ zXX>y>nIH!brDjZ)SLZLv+8^mo+!BXkX&G->BP6*>vW6O;aWG8{7ka-ES22%lT7*s+ z=(Pe}3w2!W$rm`ku8Z|k&1iXufJ#?m$FymkTaqIes+}v}R^UQ733cpBJ%loShg~kM zEzr#)5L6E=>8&|G#0#g>Q&@X=ZZ#n40eDeZM}Z{{v@HjQ7J3>Jg%<<|F6z*i`7BtU zmUOvajlURNgbXX7H&gQqf61U>0k@Gan|7)8U8;ghfVr)q9tU=NQ<`y;!pF{j4p8&U z`LK%Lh0|1VS(gTnn80)VP2pMIK4-W%9t9-lc$$8kCG%p6`alG^}q`MGO9HgE24pj6iB3nw| zrxOLQrIN+~(#Po8#){^`dVM?o?wtOm?iPHNiV|6=$SB~p-)aKtk@8dJn?R&aSHt+amk9ZbD-&FMP61yx1 z`bFLvIP<~1XX9SQ0P+irQw$CJA*cF@A5#!nw$E!|oRs7B*N{dWo^@SbDp<;Q;P-d? zj`EK$MyCfI;4Qr*c_7~>jm9dtAQb#+Sc`-F=?1fGH|ZppO&qNC+gCk@cA?!hZL+AfvmHd)lexkuY$fOkQa+kH$Alr z=Uu@yVSW70O}k3}@%Yis!sl@a{(@oZcPil&peua_j#ai=;YuUpl4rdVpR_X#f0L8o zV|m81bBY_9x`A+_y&PZhZ+;`DkI&IoObyqHo%%-J<=%&sIm7tv|LJA%tAEWO3vR@Z zeZ^z3>zOmruMA81Q<0=6bre6a@V__e)%!Su4Xdt|!3Xzc7D(xJ?Lj0Eb$75Alt%lq8h zlYJ_!i$Y#o=J@k^{FUGUnL>tcB^}03^C;Id#jJC@IlJn<8hRw-EZaU*2^XbY=v?YN zx3%Z;hR^kN6{q1I#xbV#yf?lk^jgUG)jLBHb2H`LiBQ}{r#wsR9$Jp}9R1el zl|f266;=+!%wr)%@#-m_TTh|YYTUUvl=zZH7@_P3ucvMle*2Tq^izw`g>m{Rv|*d` z$#xE`)WhJaOEspBm(2>4f>yBMeFMX*|CKP%1bzPA#RwE{8*dbQo~kKN2CND_w~b@4 zMk$_`4mxQl^_-$3sa~#zRAXuw{jcc8a0xbj4|E34AM&q5;`NEe0ay*TJVAQ#J*}W zn!mbG1QvACBVG?G`M3gW%fC=N#`9!f%A+qww%vy8__blK!!Kh1)IaW0_m|fk;}vh! z^06NG#%CJt9N)7ke&qWeiI;uoXr}Y6?X^AL@7=I1{@dMOmB!2<`3hy%SVjqR>$J0JX_q9G z=Ajb)a>`hoi1r_yjnR^_j5MTgx%UF6s^0az7HT?=({f!<@sl=j@T}`wCt`F5_b0*p zPv@d_lKzJIol#IRFC*AG=DBe732Xa$E%@H4Udv1!rBO45JbMN0+C#g~Alg1Oh~-6S zMP2oVV0+iR_TAb#E>-7RFuhax<{ECN-FHsLXah3kI1vw{NROS%-;LQHd;q7nFo@{% zCt$=qlhNOdSV9mD_AN#G7|7Ct<>2vEfmTo>XN99yVZBMm!EJm#*}0@Mt<#OUgP3$R zLp$)?p{7+g)I!1QYwSb>OQ!?97#v<^kaUunZD8i1M7@#=0t~E$WBto|ktmQPuvRv8 zDRTY!LXD9mI_Yhf(f?%FQELH-6yF~c$(>ot>Zs%NBTi=>uF97Q&NX~_q_4Zpb;6yV9ukJ?c9)H*#-o9k{ zFBasDGKM8X|IM9f{|S9dKlSm1k~EhQ3jJ$kGl;=kCZnwna7O-sXSiLT1m`1ou8_P0 z{T-jwpXIy}zJ9D9&BJ9(LZfHHn=YM?%!ld#~B z&(xou48(Gi(ZK!8x1n|LI8}HOrw?D6E17^i4!c}qE+{9g)@d8cHRCLoYsOW|vi8FA zbAWuupwb1G8Io{5V+8I4;saC0lma*1{%L zeF_KfZC%cCIOwKe_`4X8(7Sd2Vj2cc2d8H`Vo=~E=CrOLJFMW`dP`fgThp>p zK#*?$Q+nV${b!HbpAKx-eEP1{Y$xr_qakJn()vdD#?#-(0HSPRA& zpDGrEq-i@O-nDoITU*h7(68Q$^;*M4s#+JsaXp|L%cpBjOOkl-a_D}Xnhs$A@lK=n z#lWTNmx+_E3?{z^9=smUq+>*0Z#c~lXO&WBt@Z(^2cX!t9es^ z#aEtlZvzM_JL+dkDp!KMO&j&}zV`RuAG=QbseObPB5X#ID9yKwEjxxbIOHm0IVwIHhnP#;g%(o){iBH)x+l|4kJS{`5N8pDZ zG9Sh3Dt68vP^tNHX^$}}J?nM|*+$}oG?Zw&osmjAjV9ACr&HzEEIinVf-`CRc;u}O zM4yERo~ECdoHj0wnt83a(7Du+)W|x`ZeNr>U%9tlnyl>1c+(MDE>S{7Wua5w#x=Gg zN3X-7Bu``N?>;!{??uo)g|~OSFpp~NoCc365}8x*jfF}~q28#K9WKGE{FWnua;rb> z)C;w|(N?@n1n=->5b5#!2=4i_%h5hVoC#|MU6tY0@9}uZ_ud<~@}9I3qQV$`(#W6M z6p|pMv-4HLshl^G|5g<6%O|6;K-mu<{2wddVJaA{C)fY7R69U*S?-0p&b5#!RPYYg z99|9^m>1&b+MDlXzz+0K@!i>t;qiWSKH7`new!`rN*PJd97Y9Hsv03RtgT<1@|u5F zVTeKHfgVM{Kol5IT;e(u{8vsy;~;(V2gLR8u*FqVTg>xw4g1sn!w`{fYLE)*`pyCR zUe#V~{Ux4N;Lwqzxx8@8;u8`(?^EI+s?WR*!~)lCct=H4dZy!mgmL5 z{7z-(8r>%P|2sR;d@sWHaSfuv{Vxi}75D}4us zAVA+21I6;DuY>W{n25n&!2|vY#LI9g1})beiC+gUME~al8iz$FF{0p&W@i-3KRg|c zpE(=PkbgQvr_zZmSfZMVtn_$_oO4TBEu{{`H%YH zgNNU+gK&L(+rRrTMhh9i3lUCQ#-f6rynndy<#FHCO)1mrWh(EB)L?vbFF1aZCX}0F zSx&^rZoUrZ=N62x`;q^j!1>Y&Y%I}FM?nAA;`8=_cdgGAU$ai(bLbF z2ArP8o2M|qaIzkN#t+d4?!BN6GG$q*NKoo%37f9A5 zE!k}-*kqHzKoVGPZZt4yC0s_=VRde?9G>yGM<)k4wc%8>7!<{hr~vcQfD&gzZMYy) zClSiyN@MMu5?>}a^W>I6@!sU`B<3uG?B*%nf#+eA`TicvONr#C<{WUAo7TD*QFfV@ zsye))fqzS$RVW^_xYK$P=uxJ^m#>q#OWt@HWlxdzAh}V1`E4Ni68AJN3ZrEEsWZKI z-qqQKs?W~@>7ERb%!ZN|oM}kDqg#J!M*%2vvw{SAbpxLB|KP=8FG ze6kMI1J*-LYxBiyc?F*iG{~|hsqaqcaf1GMT#DIlr`U@Hej%{j=L&1n*1T;06ss6o z+<+38q`pVQuh2&vUkbPwt~o}$Vx2cPcBAjq_s1N7zUW$H6 zW827hFsxB|x2xF{v+{#O2YZ#j+~?~4>s zhH_<`Io8_<`LB5NqjAR*Pi0+(%EFhXs&y#z$SUsi3;0f zP?bUDan_KCoCl?`sVu0r9O3|@Tr(4c&84#&2SMWm-UiH*)5+P6qO`0dl><0lmS zUL*~yF;_AzIy>>g?Y;oyK%)#wD4r{KH^L6Hbov}6Jw6Y9UFxZYZ|R`y3(}XhC0j_I zs=e8I6Rrc<8V8tz22?#@KtY%9AchuS%)ri%(Fa(2u5CA(NFR+P@NGf6T&qatDSfH3 zN|BxAfyWve)KhiPARojK} zdtoge33m88U>lRqUygS}`&-XKfBN0VDO@gC=1T~*k~K76j`#75RyTF0akf70&jnVg zb78Pob1sL3n#zsWAb9>1iATqzTv}0pmj?<@>rWKL=6zrg4{n=`=KW>7$qDDes_eOB z`_}NtTF7a36pw4APALkW#MRt^f$lOGUf?(n!tf0lGlp(N2}%I3DZgn!Cs`%oyddKI!B z+HAi%##QnvLD48P9{!;}hbVl~t26w}R#5Zg`0sLeBQ)sJ3(iVC1szBuetB9LIW^!d zSI0!U=$zGUlpS&z4;)kfC5q*pbruSWMU4LpWh(#*<8p7q zxy|VVs?0{(0bCR#HLfx}2q!VcG4VnHIPDrY;OX9;Tdrd8&_cAI#`>}YWhNS@XKMN~ zxFm`SuO=v%NE7Zf47$9t-irey)~dn?sPn3ThS#C+z63!BKBEVgqVZ&px3nEg$hHZV z-?9DB!Qq#J$hv8pZFF%z=}#UPbFxHmg6l%^QWn^Va%ynNFX-ao?cgJ+_72vnsC zD3;AxR#z-a>Cj1!D5;j${Cubqp67ybtDul6({|tqzQw*N)@Dx0ziDH{b;P}UFo<%2T{2GQcao0t9aab!9)2$kk8kz-Z=PpHOhqq$1iHH_V!1GcxWS6IEX9A!cN)^~L7Pn%zU`Fkau9;SlTf8TyPXFLwhr<` zz=Bx;?`@pc(GUga=8~8t*&S2Sx(d8c5&x%MUH)hxjc9lx@rbK%FvW z!L2qxiZa#%mb&6m@UAJp3g^&)2I*mGOxVW`gq+H9{rim!@>%Ns1L%-HJYCB2Py{eo zDd%Es6UJ&f56o{)^DFR#@sjfWX7G4B9?1I{REM4NmQ-zMUyP=40rNuOlG&x9{enR@ zoS<*+?Ny!+dHGW>@w{+2zkkNTes`paLkv(t-#Z!YpZCY@M%iDE!1ZDM@}Eol9ipv@ z-YI7^Snt$0gvSy3IfjzgN}r8G8iX$btS`q1{-XO6?04&v{;`$u`gR2WA1y}Xu5 z`-DCy0}o0mL&C9D>ancsN5X$>-x&`zr%~K~4_xYAI|ZHctb)3|QolSG{u7@veM;%C zfKTr1M)MOrWEX}iW%twND|yyq)ARa_`s%pyc@Q$0^HS|gxddj_A133IK~x*5;tML@yg|+(5 z(|PZh_wD6|;+=qnh6fCtM&=Z}_05yf`n81^EElC%ypoq1${4Vf%7j7-#36K37L0CW z+`non2Jb$TO9Rp+4^Dyq<$}zm!w~pVHd#;Yryb`?n-tnAc3+PafOEivs+y8C7 zC*$tn!F=EFlS35~|8z{`N-!j?V^nz|{fZ*COy%V}8`sBu&8;cVv}J5dJql`1SSWX- zv0ly%1F|cMOkmV;RSiP@gj#ujx z_aP2o9tE3F5rW(QT0O>XvXX;8(>LUO6j0ntK0xW2w0hScm~O;XEO#XL>Plq zG*!nXAyoVoQ|s;N>AF*Nq$Q-#rf3?ec(*h{*#aDM$41N*}Cw$CziqX~>A zjmlvLZr*Yo9*dcG9Xh+eh5qc4;xNi)rTMEgABUQzFBBB!3QO3Ai_>RiYE6$kKgx$k z`lsfj4XavLvG@zUlctxTd#+im13B|i4K4*uQSzlwX=EK3;1SyxJBOhibaGm*2&CH3 zynJArSJz>o({}JXW}Wg5?=DS%>Uv?gRQ5vSich_#&CZ17DQKH8GB#9KUl- zx#HOXBfrfb=bz^Tt2kR{0z7hIfKNP?O!=`uPf}-XBsx>#h$~~RC|cW5f00pWTT1ah zm9B9-*Z0X2Dqpm@Q^+24v#mFb|M{N#N=Bs&JkvmN*2k7Au021x?0i;b7Ejz(*^|F} z{k8F~t9GNH^{k5ZY+shE%6b(p#b2d=ycYQ>kF>V8lRsTDDkB}-sAlC$6lDUqu9WSS zeib}s(stK$&%F+bb%DA&YH%z_Z%eX%XHJvi$kp}+r^d;Bc9H%ufwV1UL470gZ;eO2 zWcGY`=ECxE6=2Ie(8NA;$8=-P){rS>Yu+W)RptgZ@u+BId-^6)=W%Vsoxf7`kP);T zA?g%K>9~@qbO@DAQ2VZlXl(Dss1H&0V<8;%@NavAbk(^bb&WVL50_+59lqA(Ho%VkA2icfx8 zNI&M7%XVBGQoh>k3Mvw3nQ2wi2eG9c&Ff~9cB7||EqLb1Ds|JqBYBHI**Ef=bm8AQ zgdJPtrl2aX9ZSpF(cylANT2PAB-^l5F3SbhtC{^U$FPgHb(c8Uoe zQs|go)Xwjxb3qPU4^qu)kRoBTso;}BEwO?|ZQgy&))@W%(P$#r>Rsw8p!_A7?BB}= zDiPN{{R~6zbNEfr<+o0NgM3dkc)S?6lz>n9A~mXHwV7gEvd~)*tPetiW5^hVWez#b zVx<#lUL>sT-*J3%Eb%&V>%!-6or!p4KH^zl;1E70fq| zv+{afNF~SBJlQDHi@W2A7o!^{BW}XuILNqu4BGVSu}eA?fb`>^`-(K6O5MbBpK&Ge zDvaTlkae9O=V(>lxWtyT5wh@g;Bq}do%F~;9;UI<52VjeP}R(Ks`%%-^DsCEF4VsX zRl#CXJEnz3+@lAY*WjJ+pjS^5w{Iy%$1zf>s&Ze)Md;pW?D*Hbtr@EjGdp~e3ifm( zwszB-8=`baM`)x|s+Ewar_9pw@jmggoC`o|XOW=*PC&80T$&(LrT~OMi66?M_I?V( znXGhNS`j;-_?}6;O&Abdng>b0;Ca4gpy6qarJAvL;QR)sS7v9d1LCzZeUoKdUTITK zor$j-imrh+H_S#H!UB5++F%5Dma-mmvGNqW4z|*6pQTM*_W4lJ-ug|Fo$C$pRsA(C zqyP`-;AdUp;tuEAHza=X$YPAnst8Hytc2I9&OBPQmI^NzC`&xF0Nb?B848}osaT-k zdkeT-Ga0RqF2=xsnx2BV zn@)6+-s^*D*Mt0aJg40dhFP3#Hh>cm&Fe8Bw~)p)wE@;JY06Qom8Wo-p$JC$M_j0P z_|-7aADjYlMLB)-9B8mEjMMf)VEOVeyt+!G3N#MzvI5!D_ym0HSgYurT?%7!h(3`WvhmNGLp96_7Xj8W`^j{n=4&7>;|Se&xu zmRq&8$Z7MG=k-9$%BCjrQ|4&odX3L0JMc>z;AI=4xv?F?PoK^MOzg)TM>)QHAd&o} zOp+FsXWW|lv)CHM*GqXSxSF?0lsbdkQbj#xF-fkOh~Xai<|sVl7)KG;rN|AY)5%QX zAU@9(F2HLJQRQml1~MAY!@7+aQmx&SIArJs-|t<5HW<3g;G>*|NQtw(!~67rW6M9W zNkm}bO(0OWb)va*IxP&328_dmIT}S$>41?1RD`7BT%+Yy%BAsCYPcw5--_+}F); z08pNWL!$#T?u58lJI!NsHU!RJ0;}rFtHtDFDbLRYY+tt5_u?*Gf=)Gzr?S{2UN(k8 zT@u(sn|IM!&w|K)Xrm|NN9Jj*OB}zsHXrwuXSN<#{Q8h0fPa?by&0^h8sN7uNVjyN z@z7k1=0Q{@l}8wi=L*LQ!zHV~1k`op%ndY3FMJXF9zF}24oqlP4MG*rxIij*m&S2D zC_=7ks{`Vk7D2Dq%tqr$#?uk{1yf#OQr^%>;QU-@^x~lIztZ;BTQc7-Tdj9zx^JzSS&uFq0t=CS+;GR>tf5PRSG+Ys0#bjT<{O2~R&WDv=Qs~+T>13cN zcO%@dX-DHDXYy59aw$oLmHw{A^?3i)apx&v(&WY_+N{BrKZQu4uW60qdnV38k7|rs zR7EcH=B881$}jCarReiS3c**`~}2m$GQWObxX;?b^4)SqQnbX&c5+zNGh-V&b&EE&hW z8`rL%!3zZ^b;SOKXe?Cts-TKxo^-r0RD`bDTcD0RAEfU}S+pt9%D#seEMqfxT!kSu zi@sp2$6lOQ=<4K!Mv8fJgIR3(hoj~;m<&(1v5{~Z%iIQ>JZoHP zNahNxU(^^JigXO^m*tP(>Y7>I_}d_M+z!R53}Q93Ax5@9PV0ONu=VHT?*Ea z<2*=uWXaT3wK2i5bqij22W$8t*ID5k%aT#yi=>Hz;2Z|OOptv?`<*e_ihy|NWVQ1_ zDBg!cGx4iwlASL9T$)DfLS2sStngSN>MUj7fu;UoJx&QGF;&(KR9#`SX8y|v=>>3g ztcv3sH%7Py41eUTO2)q!cnUMsZ6 z$BaHuL%Ae0Jlo&~`fEG#@d=d75%946CeQZkP4lSSPXe8bz_Gb|pWx=&DRjqV3=h#?D84i(%#^%u`Uh>K zHm8+ldA2(RJe_}u`kxD=aI%dGZQJdl%*(e#^e{{wUx=nl7I+YTI*|gi>hqdG&x4f) z0~bqEL0XsVfg2=rn>G_(wketq;N8hX)FCxefXEM3JvECYt?AcG350WSy$DE>>^Y0# z&nQP4G`eXT+Q21G&y_?g7CC)H$Ejed$-~PA$q|yl@r*JUzF{^MaQ+y8^tlB6Ukb1a zhpW~3>5C+->7KoW3{Yr|?mtoZ7?P~;bJFYLa7p^D>A$t*<-r_|6?i-8`1t>T(SA zJrx+QA=!afuA7e0W)vUZa2%%JRM0M*Ule$M-VEUyeu4()$n(6VF6I78+myx?z7?+i z(%oX#NgXW=i!B?5%~-r-HCpBk}Erq`Ij94l=cuKlh_&lO+0vM{WUtIt9j*Ou#(R< zWSc5lGU!^96ES!hfa7tEoQP3RK7cw7R4vd<4^0IJ#ASriMsD=L z#qZ6VWAs53otR#d_Adb>O{%);d#)>d=?nYoHSp9!r(-nFSY*IeWO{LsWnZcT9Y>}k zq@s}@=%*R3cWjQJVv_6sz7a#sGNldW%R|aq4@%0TeeJsyQ1*`EFP&igA*?j3YDl_{L80@xacf~^ zk3iyGwWY?LfBsMTUdyKx;9d|C(|0%r?x)V#H|kYJo+E#x?>N+YLm6Gu zHDNX0Igqm96XQh(PMNOk<(*$>cz`RfLr8 z=jPFJD|bl?k<2vJz=wpX2Pa{|-FUm(2#aW2EP{qibfNky#GeyDoVtD$QCWv520~#- z@W`n)?kzXdS8+1P_Et2n*}^SI?xVww&|z*+;W@uUY<5cFF9c*PI!jy}P(q=NH{!zk zq%ZeXn`OAPG_TnZ!yVmdxWn$yNjxdaNUv5a+Vu5I#0BX0e8Bp%k7ObvWF(O+{{XcXeD1dbVppp85WncDw;kxNffERzBCTQb6#8a!gbu_0xfmUs!_HIRK@aLpy#N30ok?sR%X;6x?n8;1 zB}yViNtCGZ>dx=^+0XCUPJ$$G5FiP%%_^ICWgtMj3W6X3?k)%rz>6Te49F(Q+KXfn z*a;Fl9^UithI_B>y}BByc_KxMk|^?Y{=a`!A0AR?phz8&0{oG6y1TlDufF=~8>*|T zjhApo#-&11f!WCLm*Cpy_sZBc^rvq!)O50s_sWNV?X$Z5>A-J~pnr%~Hxe)*eV&=u z4bYj>ymVvIl&m85Zjb5|`vHp*3%o8fE2Sdk`$8UoJrzozoVK8{*Bq4I3kLF$I+<3Y z+mkgbaHj~kHWTQ$SHwLloJQ19H#O*mSIO&5%7_1Gez)?a%wCY&*$VAUmGb(Rdh}{dE^o@%5oIe~9X@tv{(-Cv?z76hbp-xh;MFzN_9^n=IRtJ(%9#czVNl2#a zbWazaLlu+q%;)`)D6dY7nT3;6C{3#|>kKVCx&?s2kovc#0ywghRZQ-RVpzCce581g zN!BT9 zl-Ke~C9AR_s+SSoP@1nt_s0DLDxH}qe?pJ4lr4)Bd)eZDIvtx#U_r8+9bph{dxm>erXTx!Chh zB`;FrDW)G-@sbwIU<}u-AC*y8&3zg`n&brt@gsYpII=scVYO79Q`~+%FOeT<-R@>qsmvbJoA@eJe4NL2fU-=#<1ve5J4cCFNf6hJ-|z;<)}I{tMa z;RvIHCrqf5Y*6{m#2yKuy;1!9j#oO1qRJzD*{-H<|Mi33{hL4(GObcy`?(E+XH;J9 zEDwW?{@kv5KRF!5Pws|4!?PjS82;`22UNc@ z7R4Xlb9^$A`<1`Z{_PFmk!UB*{z!d^(ehv+-NbOl8yO%h^NG%pZ;UPCL@#*FBI-M% zQF^1Bhf&HkHtm$4weWEjbQ+s=T-^^fP)AvAkAEqTZG4E$WF$eA#$K-~N<6P~8NrJp zMUt+~`0b~2aq+z5g}l!48yTOA>7kEzz*AK?LVQoS&4C*TATPYdE)IgkRkcq9J1x&s zP)d$9kr!$M?e-!!$iQ?l&q?){#!q+fOh^x~x2tj}pOlc-eI{_x{2G2;;m0TXqUM?Hx$dJtQk6rNevGiO=b7z}5$m z!|Lu2WSxx*Kb|>%E1^C2LY*M4cJDEmQkl-~!Ie&551e^9K%aV0`#PQT=X#Mo@_OUK z;k2mfiwEA-%5711ktR)>=n{)k`6;*6=6t>0U`tt@YA=8~6ubz-jH|eFhrAg|T)Z#k ztE4bIZDQ(%MPB6TQ103T&?!Cz<0br-7p5qlTWpGQel+6pW8sCD&OHWr_D0PMFx+xk z0||^Fow+Zm6T{$`j88u1jnN4$Hw0~Uts}H}uI{G^8B$X+hI!So827XC6m`Rlf&@qj_|{4ECq8SCAWc znj}kYspZ9>f<0iLLKD#tC+n`9nqkTRb0ZKSiaGTs_$ZiWqIH_()p)Jj*9D+(uaIQE z%2ogkPu2TO0YRYp9H)MZ`x0Qxt}q7B1EN>Vv-n75VD$(Uk~&+eoPP)7Uzgh!=#n~3 zr%=z_S*9v|BewnEv(<(44$9c-Oim#hCrLp8$=Z2IT%ll z6H+8oGd}N>Zc{=YvmtM;0>8&HkYA!q+R_X%&`0!NdmK0^-ZY~h=On1l9*AN_17U$( z0d+_B&1Q9;E`hY2;#0s2d>JzuPrp9A(_;&tAFg4T*9sgZ;-Qy&@^|JW%gFy=KB~Pc z29=!>1{e4hMwV3xH{%R0yoSR}= z+uIbdZ}zUh?^=<>9)|MJU{(au!UMY^PLD)&R03yqQC_8#?tKZK1*T82cF0PnAeht? zm!lsOi}G@rs{-lBm4Xz4(sc{updBc))Si63T}Hv=K^X-HqhQ|u;=QP5G_Yw$olg0Y z?#>F1hBO5PBPCeIt9PJruY#xfXfHUK@u)}b8rv7ug`;BBxhTGoH~v(@$2s_=JvuUF zo+6b!dz)rjNARQn&h;(>1@s7%$3eJZnc``(2YB_t5gAYtHkTf1;9zxQYtjaZ0Hw3y z?$YKJK-)Xjn?vgB?!o=w6Vh@bICUV(?ZWY^yNVVaWb!8?0$QsLB@=Zz$2#}l$}-<% zNFcg!g<-Ovcai1Epn$<`b%wVbI3(Jo^Xj;S&dn#SB(0MHg$_|G0>2j9T%hR0d*yz4 zPY7=*k=5x35z+wA5jtgBE%O_)O9y#&_AF)07x!fJAx9Xau(5t>)_fHbpSOnGJs zF~8W1NjVE+yl1QX6kWdujeJ6G^7aQ_F-rJ%p3WuS7oPE0?6Y_#Sz-Pc zWw}2{5Dq3EvlWt2pxQD_*sS`&w38K+hrLT(%*t>uPC6$MZCFL0*9s5|Lqq>4bjxy; zY1-)AP@jXS^XWbwF*CHl3F(Q0yX9nvb~3I=Lvm;bituN5JbQzAi1z0EMeO}8)UqQG zw)#yeyMZxDr{wc1K;!Z#M`hVi_)QV`F)Pd#>2d*F3f2ltuex3pz;&yxl+q6k>Nwx; z1ikTNl^yMH?K&Di2zo?DfsBFT=8UIyJ^jr)VcAlHi4mJV+PEMZ(ts;h*r6%aM!yayklJKfd}t|sG9 z@@)L0qfy8UiEpLg{8|BwC^n=&slO?@uuIsYnDq_R-yejW`$c%bcNkVbxe-kUxD6Gi z>Pe>ix}>v{(f2lROH~65FRv13=4Xm`e-WQs41PEn@kcjwvN671JMZUU2co&;+>R^`yGIL0P3;^^X4k>b4ML{ z2L5ZqyW%(Y?^_lZI%W)vgLS?JE1xj@M|YX`vDf^&c znFi2H;|`GyFfOUzV^@Z-jEmyzXjJsCA4{eUJZd_1gMR3@>TmDES3r1>P;^3~L$`YS zU<7m_V?M^^5XmWG>{_QyOa6KN0d3d-SZ>v=#F5$d{m*PswE)Ds2iV8f#Ezk8oH!iK z)3UO*sTsGXMaX**^Rm8FiJ6#!;WEZYu(SyhQOD8lDyR^vietTi!4de#c)2J!x>6Ok84b*(F?cskwF zl*dM7rAoNW%*rE|fO#RqK&hZ#q8nE*Y<&%V5-rm`@Jhf{0`TXmTUgH18Bh|U4_@uT zU7p%4uicOG#v|PU7wRV+^r1X~qM5?+>q$9kklC*MqHF(z_yprg-VLBxNW8t`l zvisqu|K31?9)W{?kk?j4%&r~Yla%jM3B%0*k3Z1{^2peP$X^JGSndh4 zR&GEK;C}bOyRy9Qh@^cWS@m~!?Nq_kshIl6&S~N=RuQvGn%9i}`|P|>lM>TCW~VI2 z=EZYT9K|_}kzI`_nV$9l>0I}l4I-B5hT*F^iBgYhB#ml`L?z`at))3a)S zdl~Bq$=f&oz>n?sTCyvH@Zy=ZjdPR%9|VHL;<=JX3oHQSVf;xMF?)u^fBBhlPv}Em zbR4oD1eLZC!@vAlEl919bnb2jc}@WC>)g2S-4P+BTbxwDI=FO4uKVNkF0U#;jF8Sj z*&OmU(7M+a0NB~j5g`(7$Tv*G+$gUCtj`s^Y7SvcTJ@}z1~^ZQL~&+J=Sn5zQQYP$ zMdYJAsXv#Q%C18yMCDV5<5C@tZKbR45vef+Z>yu3p3DW1MfENR^0b|=zV}LKzuzgObjypUh*n&#H!*HAim|=2o=2m+azC0f zT$lG~G+)mGQ5Hx|}{CJ?h|Gz>&~~XTi=g=QVKe&n3gkw5`)qS3Y;0 z_4V5cbh`z#7k234KGSXtJl${gWtY$)YDMT6`5M7=G!aD>ou4=mjq5U=6JZ5?Xw@NV zMd%p0_P|_4de1!JVOhkC%Td;BK*#pcHZP9QGgVn+Nb$f!+T{|AB=c7qj<$pBnpHnYo)jR>ISE1k)pcwD zs7uB0ZPG>IW1a(77&N1c1fUPn41*Gz5#9m_2S58`st2P=r=Gn4AMWeNbQ5kEHA|Ls z&M5%Te7acx4UIJC;6ulQGuydu4>+uj4-L^sqZGA>fr=0ev(I~!vI1W*w^-gst6 zoM_pj$Xu_-H;MG0&IRHPv%wpYKmFQ=5`Y&oUglHkOkSn?803U+L;UM2(b;&e6*3NT zePT?W*1zJ@t4)msL@-U1fUcVCqSO@sSMj@hBmOJ9(vhu=E;TP1SMFIR*4RtVlTJ8V z7YfJzZ3j}BU7>Fg$m=YJ>wXoU7Lmq*9qZICMWh|6z*$MTPj;%$yx_jB(Xr>p5d&=l zkn6LI=ep)6l3K*KaBhrIJENc4Cs2 zkJ0_v+kF~^toV2$>r++nHUFeEC{+gq=jXgb1+M`0^a3_W6=yWmI20A#l>iHa#+5Oo z7P0y-4hhF&hm3b|>tR%0VW;%DQ&YB#QGLBpP%$QxFVac+BqR7SeT1JQOf3vZBYch@ zjDm3MQB*e`rkw51^C>f*yR$X~z3EHw$z%a%o+BxTa4oiNkLrU7G({9YpNfhp7HF37 z;h8xf*nV5!LF%?F*J--%-5K%GiHM(H&+839Gtt|Md4nj{LaQ6}>z{fvi|QmEy3VgX zpimpN7>h|*Zz3=@vf%Tc**`cN#UEc1W{f!rVqC9H1o{}yJ6$?O{J_mMp{7I(N*kRjUE}Uw zk4?m(?K^ZwJT67EP`r%oP0@oHHr4xIX70!D&OY%BK>Nlyrj3r2;gV~-ncX@$7S)$i z#x-koiCs%DryV4?KeJKog{X|%+=s@1_V3vljWfq$>G_K&uH2961=G^XtI)!bb~0Xt z`*Nhp-2m7@SCMsb;A2CDiUste<-6)GckGBJ3w%dp0kMhGZN74r@PydLHRD*zDC64( zMeO>G${%WPNb*Xd6^GckdV4hQJ(BXBj&h!73QEZjtH9Lxc*{g3tBF$TLcx?f-Jzd= z0}|4lWx|rj8j7H}J-Z?%B;c5rzxhB0LVk}?>AbiK<`dM6Xu+M&Hw>bciOIRjgn8Uy z#+j}W1BpJw$L`@+Iy0Wya_M%&^Lgdh9Wj_YLr~L$@;Gz30|eK>Pc7K!R^E+1dn~GF zF#BD%3vio&jHBc0^Fe{?ut5WT)L;IPgmAP0uwDFzfV(pt4Kch8L5~iFA>FH|CpQsH zU&hBTosH%fQ_+x-fS2MszDcUh1jc9LJs6?<;d{~i4>`rk|XS=C%7?+fnbcZ&<_FvG=FexLgyU zjDN6yBz}F@h&^i0GHP5+PF(zDhNAso}mpkmE zo;}<=?k#_HiCT2Q8jOW2OOzCkc2Z-b%#Ne`|24yk#q< zH-oGRT$jpm2T?w8sv|3Z*Ew-G%44HZ-I66dC8g%Nv5KH+vZBm%wQ%kY|1k*GV zYln=Pk0zpoajvH=3C$$nqIQ5M$&<3v6$!RPD|_i226TeMqBHX&)i zS?QPpOnp2^=*{2m`|*+V+S^aB7(d7Rx7E{|49Q5eA^83GBK|}Qn5jF_d28S&blj)u zoW3hfnKtdF%|DKikKy$GWPuai}BIL)n#k_eAskV-cU<$U7^Ew%|uQ zEHnB8vKC(AgDbzVV_*E^5gGC-pQ%lI-85R2KULkob@yWG&sAl691)l4)IL7Ur@MAW z`Qb@9TT*N|GOSGQgdS;Y=!1Vh`lpSX1QbJBjtY{VLX$=_wa&C|D#)Trj!boWTrrYG zS8hjhJ{cSE06WalZs_FQ<}x3w8|v&T-gQgAq^a@xhNzE@Qa!#eutwqbKFQLf$Nc4` z>aGliDd{Nk>ECu(T|^rc@vHx)3KrVjdl=1G77z@j3Ta3d#H>hNR%Vo$N^*g9=Mc97 z(Js)jhnImV7A&Ev`BE2ZEJ|(n&WK3~Us)QqE~G5V1$BbbB^*-Sg*t&1lQ1Z_`k_5| zLrq;L#@#5SHZBvN6E^FRrzSKCKcv@S;lcgon^8W0Asi*NYubp(Y7w4rr_EAuoa+J{ z2MN^9M4fRuye~~f$qG)h2uTPhVVse3^VD9^mAtD5`D&5?CAozH@R=imDIiKSK;~C8T#Shw|mI`-tmYh&!V{d*q&NFG$lGx0_3G<@8IO#cPArp&)4A#C`%5BoN~l(*Jfu8!P>zlC0FJ_)X*EOMveyZy zJ+$o&j2*D=${{dY#cGa}qL%%hm7s2irD*Juqj>UYG>3)r4Hhd)4v25+#hLBUh$p8% zE2Mm@7i>mN=hLyeqe4N(50e=HI_DV+*PPocR-@Bx?&pG?xd(8&M}Xus!q@DDIyn)= ziLr=Bvr=ec<{38mzyg5@m4)jlJ?^hJ@I#rc^0IPbI$Yj) zF)<$HZPD}URALY%$ADq_$kS$-mIUJm?Tmaqos#L>Etu9F;@21u1fFUfJ!m0OUAYxy zy(&`mr*~{Qrolmz8Q6%o#G0K-eRIL9Ky_-vNw^@8iain%rw&KSPFEOS0^ zP^UY6LccbUrWf?dKfEnM23Yy^9bGA{C5_rq=4sS^`AIX#K=Z5+7#G4z0xhQQikA^$ zVnq0$Q@%QM!ud@H$tTIt`d38$eQr$Cjfc_USdk7F@a$5 zX&N1D0+fWYqGW)@zTFWA_e9*E@wjp}H>d|tq{?;K`e){ELGti>J9fr?zm8j^cH+O&!14;+oJK+<%F~Is;$OZsDlRuwTJdNa0K^St8@$P`8x!xGe5_3 z2P&?VAthwfV+8tHv8N{@j%vVNycz|I>u8Y6M!4jBIzTi260{$C1sBv4ps#D;Cs$Y3 z>)pqMPnyoxQS_)jIu#)=y?VkTJGIS>Qe#Kv+-Bbc+VNQ(`a!2W?E(CCR>)sef7i1G zEKP*(t0Qdu@;s`CkBuXYk_;=91^D%+&p^R+%58zSkB>&dBN7YeEr1_jUImXNb<%ml zIxxT{<+0sidQaEfGk+)F&V1ez>V8;faPgUbtAcqEI*M^i=sY7ia9qxV23^T3E5@yM zZ1m%@>Nt2fox41pvu@sHDtc^acf20uMs|ReWme zGH~u9b6Trnoq~7CE3kLvj7j;H$K>oBIjkF^D~~163rg6Cp-(?c%0>C<)D^|A1yaRz zXnn%T%xZKTU&(Uxd28npqLm)6+DC;Ur8{w49)uLcGYPRvm!o+6*wfH_AifITnYEZ( zcSuuA-Gf(BLJ$2r#+GZ!%fH*=6UF1zOdg9kHWrPWkD_^F%59-t%WZ#M$OEuz=u;-` zBMBW$e@gS4=@7Pr$%&};Y>VQ{E3zP;tG(POpO}H^FU~!P))_kDyc`(68t%R_C=YSe z?^z0p!Kk4qM*W4;QSgrA)IAcDkkmb3WqofvWEARYz%=_qP^%EUr==WtO!7k3x!OVU zWPAzSH>=8f>!A&}oEVGZrj!{MTLQm6;iYJPSRT-#;ujxMcpKo`{`YIS+3Udad*QOHP$$8yRJjYQ+d669oJ3)dUEu))G-QpzW7we*WCxITl5>3B4*X}ODSP_ z@JRuyXagPCR#?Zdx<~80HOS+F0PbAfPbuVR>$-^orMF=g=T)OPZqv9C`g zJl^8rgY*Kq{!69tvkVrALEH_1`mbm36g*GNg)oCC4T3zCtg4N+kZO#KM0Hk-3O<*w zMf1rc4GIPlolQCtE{D|}*)70i9J&P+{YswpU}ft;k&b0Oc%a?;XGCiqQNAz5u+E`d zFtpl);Ze7-dk}q`u1jdcrBhG|3KRr=b-JoQ{mkFb)P&TDV^Q)Uh;MnuRns+;=uu>Q=cfAE_AScqIOkM#Bq<;P!)Onc$5c6lw`+0 zq*W;)EYk)FdKx(xg*=D&;%gaY%zSVgB`hA=Oh}s7ZLnd;z+vQwe$`od>x=So zuHMVaS^dp@w+a3wf8E%v0oC_Ejp9c?%~$ULi0+l-M)|!DqWRM=6K`N_(kCKq7CoB> z;*W|~4TXqhk^0?U+v(#`?A{ac^RHImS<4Ki(uMfjkxXGHC2oF04(jyZPkfqg>*Aq2 zsDFO@t5}kOjf3N{lj+b4(hMMDJ;^lB;6PJuvXU6~#);T3`F8q3H1FMuxOLm*n%|W_ zwJpnH<*nNSp3XY}sO1V(@m$=`x0#(}Dq3`_b__>M9Fts@cX{o4#KXrzCyi6U?ai-^ zZ3IldUSNxgM93=i!g3xQo%HBHaYI8Y(wQT;o1NAZDho)$x1y``q{(Fsf$2E4L>F8$G{C%1Ar-9n;9cksX@ zUFTq)ATV&Ln=-T2Y|%k74W{D!nW(O4ATj+6e%wqMdxm-nXiy;uJMh8GLCI!eE5ocf zDKF>Bt#rQ)5716|5nQj9xvAm!(e&zJpMKjq0VS~*73)NX#V2!Yhl}?Jb)kEwJj=m- z(Z(;Y8~XE?0B6Cc2z>ZNGHm8aRHKr4J9k9M^se}ZamQp&6D6&foIBN}@!>_US&*a1 zKhRh{G&F2Q_&=XMh>I^YHpr!Pq~vcIkIuoy3P>T>d@|kvg*vIt9^rT#9?KFy^EM&y&6BO`= zpE1Rn1e|V|xV-{tdIc%pq>*$fl=8rK2g4?8^l|>Y2G33@-m4L}uSfBcXE{O*uR+K3 z(PSYgVw=V+c#%TX9STv<&w4{Dplk4yt*Mku2@|xGk#K%8iX-yWFW;0!cvqxgszdih z==APc8Yu1r1?XRQ3U^b`JvyZmUTX{(Cd=i$8q7eY`ctM>dFZgcvbb?0iraVG7q)gq zRO6Bv$}QB>ZN=V@D(^o%yb{kSlbg!tapk{PacU2YH}cd5up3N%>ZB?Z zgA8}ZWW{&fc@%hTJc`4TC6D;14XcioQ0a>$$q~vhrbgIhxl!FhO4KzZJUP~Z==L-! zpA9Z_nqCJIWq7=1`72rS?0FRTg!91zQJs+S@Lals=fjrKGAdk*e!2yh$#K1*UKaw5 z&?kz8rpzvYLM{8UUTj3;Li!-TZny(D?-|J0BUpQ>EIQTcA&iJ{5M?06yKi5_)KnBV zu14`fidTR?hIIwC{R%ec6eljUwIDCkQwS8z^@c+4GLm(|x$su~X7fRH>C2RRhPg(Cf%X2s7@Y>xFR|~exRB~V==2$ zulmN!z*keS!fhRLNBLLdyDBUXjLxA`o)v+5Mc>q);0so%yRiexQzxR@zCGg7H;(rd z68%6%CnAsHx&%sd7Y`_ywj8MsDX9ylx{8x0BN+JJ?TqJp$tQ7>>pW_+yN}aN3!-1f z!)-Y#9=Rp2U44&21$!QC{PIeu`Ls*$ zxaknz3a&_ah_)1G-u5`t8QT;-eG!E`v}#7)<)Y4+0YpZUUDDcPD34FZY~p5t$~&=b zcU&0W6F+(WB>vY^3_ZL*XS3X*u2fL30D5FFcRI=n1AG%WBn$8`q0X<4MHtc57{?vFTq zA&UL%g?uxrt6xVv6JgAB3fB6NRKRtjti9kgSQPKF-c(SzJ%U#+3OAmc#+kEGjqH!& z^3|yBOGugFl@5kuGl)zt9~6ZEOKhFuHv=s8Po9Z#Oa{-zZ=!e#;~|`cm3~lq^?5>* zI8JCk$3X`TQ!6e7@Pcl6;Z<>vk6<5<`0{6F594IvrTg#*t4k3{%G51*f84hI97Iq} zI%@EE3Qutu40s7wuj#h%Rr`|Rpk%a}=F(;i9UE(}mig8KbObl|h1zm#BC4D4wyufV zZ2bBKNLbUC`P==HFVhdyBRQ@Q{!9sX;+wSw*UrYl{cv1PeLkK&Sj?(oz_e^SEc9* z{fcdWpBybkCv5GXh>fAs#Zn z?2I`7VGMoqWi0yj5~W#%YW>RE#$aRl{Z%9Q$M0?=4JX{ly~7HeR#5MuC!VkZ|yD z#K}_;Q`e)sf5%%ug0AZYPbn5&8TBHmc3EP@K*F}Tj*w-;dZ9%#l|)sRBf2PYM_8G&KKOMZBbZ zbzIUQfEi5C960Ag`I8?+wQX1orhzfb<{uKQJX00r(>t}f{DDKF=_>#Y-HG6lae--u zq=eu5MEEX5`OP;* z+PN%by3k{jzzaLT4JP~OyHQ-0@}0-Jeir~*B2?6lU;Ndm{uF_}9QRIuWsZ3J^n3Dj zqp9z<4R*!p^<% z<#V<@;&OVBz zsY?)9Bxi8)rApKt+3E~$3c)V0CIUc1F*GP~dh$Zr{p_2cipYwraRlc#M$j61_g`Ny zG2vmABW5c19h7B#E|xz3v9IfX+1daNXoKK;e>LLI{;y8j;x-l5&_BhJc-vpYjbdah zD#q>4p#M8Te34naFYmpSlhQo*NfcK;k7}0fDkW#cLyT3L!i zAspHr!QTQyrq&3mlu{)MVC!;)cJesm9;_el7Mt%-Qn%o(waUkE$O@je^ zEPm7We}Duf_=}hnK|V)3O?z^)9|Rw8v1hC?YuVH4k0f_#8ZpVE%wCyz&`Jk+@D^|fv$QjoWQy8Rp8GVKFBW3x z`lVQ8g|y^bS;$cXZQh4Q=F?C=3KPC~mpx#k@(CKG=dG$oxY(mLZzI1+fFf4FsXBfx znn&aj-__W?^-adjh&yS5T$Y>~4q5xXF^~fOTdPW>@{Bn6fOxGm@_9pqT-vrHilgVF z;xk#(ccQraZB)tVA`(r5d0kd_)O@0{V@UCcnB|d5g(&~@? zO1z)@t{w}@@5wyU(5^L%k5tA+An`|QYMITHPJ9r>_Mxc0`3n^<2SChK_|>rF=J?Tc z!=nQN4i;p*wCL*JM8O*DL_+^k#y)uM9FYTdR=(9vIbdHzG51iS9>$W>CYm<$Y=s91 zx*)gzO+g0*tO`6xA!70rJun@kd(8Kbos2jn#Wiz3ihEb1T41vT$SZ-LvnT&kMbj9U zmr8I$1`gD#fAD8OTCt`!@l3bawJWNVAEnNk`XZ|NIVC|TrPYTPMsB-~!aq$xC{jfb z*BknEP)&>V0a&qk-Fg|xe4;U}-VB?DSe-PEZ z8_~FTT}%&Ug{zrALA%0Ts{(#2AmQQ14m7h3`P zj1PE6B=)#O8A?DF!+WCo;8&yg{C`VE_EV6I&y9`24FPfpZ_s-iNNKq-3h)1N#FHoT z#J)($veV#MF3T{+g;Xty77rOd^OP@%Q7SrxHUkFh0{9#4|<5!iPm;_{zI zJbmo(?WuO~EO=zeBR$3GI8cBF&;%Kn`qqe5IBV8H|t1`QI9s@&fdh8P$GHWR5|*4i;CE-ByQ(H*tn=OQ%k z;(>blBY$qW0DN=X=mbxl_Ui!h_6i#X;UfHp4vJyE`EgXwW`!9{0&{pMwAusBhr~pF z{mAVg|7v{RZs0R&rs<^mU_nfN>!R?3t_)V)T9uxV2Fa`On-|3MjEfT&qH$jasNX~7 zeQMp!hQzxOMDuYOaksCC{+;e`Mqqq(if;={Ya&mWO60K$+kfudui-7;dfM+blXmD- z7bB<_tO37X0Y!@Tg5C;j(&6ztdoRl4?@KQ)$e|HGISr4JQaX1}?LjE+Zj_)HWp__)JU-C+$)Qo?oG-oX7{VI{nxfFUrQ zUin!I6^ap#oQ}rnPtpT^RtMj`>X)&7+f1=78Dl8AngBHzXG&57+~`-4SP6AQ*OIm~ zFh$jb8BJ^rQU>e3Ls3l1N^9)&R8>6Y-N#&yH5RzTP`OU!AsS0G^%>>)20t5s_V&FR zT-OR%PVbH9PklGa;T^H`^`At=4r0b#IDr;P`KjCDDRl5woCK9OTYt5JHw?@8b_^)m z(X)Opyt?`q!Zkf6u%V{G+%nkOfi?iGL9-F)gI}KjewI1gcgt#?jOyCY6b;R50mFCz z->n@Iy%ml~*xbFG|dX&2tQ8Xd9vT5C&D)e3h+&-0pKq> zd0eVDnDWKJLFw}GiHQ$n6iFFBlSePz;I|!yz`1Tmuh6d%{phb>KSqHsRFPbnTQ8d5jVfI*PEcNuGNaEzHYS>=!VnlKwF(1Lu#KH1&|d?pZL4D=fCf} z%_~1q`)EV9rWv4EM<@a_UfmXzf*3yK zkntu1p()<$gd=fp4EKb~dIN1R=N)}N%Grle&1-;)?!>1w?-Gcn8W+W#YdQsYXuR2N zsOi`xAUrk3J=*~Pi!Us**cW+pQbK<=%7vF!%$}}Y!8UnpZ3tH3^SWV$JP}wUXLvp* zoHgFZPDJ(Ow#0Ipy#ntvoyzPS$GRLfE+5_|Falhu$7H(lIZEusT*Q-yauh!HcEjcD zePJxRGac>OF9I5k4pbgwm->^EYR92BP+PAcSWV+P9>_Sah~u1S-LouuF%$7{DvEta zqnbD`Pk1)*m-E(rkg~Wgosh5n-dZ6k;A%+1QiOznlyl%%lxL)PcaO;9{Wgl*m!k1v zUTD4v2HqH80eh;2jx#FY#340&NPn%bi0qZHKmBP+i?=n)my0$R|9;@_NZQ2`&O zlW^I!H>$Hgh?t*|*C^%d=O}7-i(&E7Y1bBLoAB}0mO6SC!VD$+)SimZPM-f^lrrY3 zIX=r}c27zd{zGFs{nmvc89H9!Iq`l}x4(+wB~~%*B@*1XKp(sgSOH%Z>NV}(1^lIe zMQ`^*ytGH==c-Ka?mZCI?@q!rfMCIQnfpweJjIL~zbY*zvFG~gDou0)^UdCKI+QQW^7#ihJc&KBog0CDb) zWYp0%o^74^UKEdRMcnvY_ta1Hy&FtJlXVOglEB$yU^)zCODBnuty3|GfXQEo5K}j2 z*cFXNq}KYrN8r})pheNVICvz@qCB5f3~vRIlV6FY zu~Xc!_=3kgT@7Esi|Nj5L8EA#`K;J?II5G<@?u_I$*HDf**}|6xgr{?3>%3+TLUl{ z>VrH%p#^4XQ*#kx&tZ4C$K1C+i2{pKDg3!I2}$4BqR^T$gVsnI3HrwA??y58WqQvv z$MbC0Q*02ymKX%VirfMWj16FuT}K8MZDQ)_s2F$WzKH9eN6BX=y%>d=moyMj)Kb^k zl-Rn!qPFJIa}keaM6jnhUcMLSVcBC)(1Gs|yn`Nay`IE7rP&Bg#!vb3WmGa)OCFg$ zonGz=j~ffAqD7rbDol2-9zPxelC9z=FBlbS#%TJ1oY5z0$9ZpS8Bb@0?hDH< z?t4?Gb@WYHoc_L)@5d4IkD~FFEEZM=w`eGWASkg4L@awVn+{SkSWg;M{PE9%0Ib96 z)ORCJeG+l|TPfc^6@eCPL6RpoVM_y+Jp9XSW^qJ9e&T~z`sPQ`e8gw@bc5|Y-vM9& zAFI&q6~fGW_eF7N(yx3WOxU~Hrm*hwdNmDZhGnt#h_^5-Zr|qJuVR`{Qqo^+3L*Z( z^7pjbU&25E{gf4Mdd{nJ#=hjiQmMX~z8THKCt`>NGmIw*(Rxin;rBSVHef3t)0!{l zqIvUT6qAx?8up35Qkty|2rrome%>oNy(FY>{7mEJc2wsjpZ6W2F>VWUcZhS_M{J7Z z#&0%&e?xY4nfVJ@CFh1{7GzzLH#|QV@xJutp%b(~&1p)0<;Q}r35{yk2cN~%=hpD` zmt^dTS%8`{4tOd{#BTv8#fd$O(;BEJ2RJQI2E`h$QhUZO3jr=cPx zY+*oXoRC4Z|8NwS|2!>^hg<1`rrM0f@99n*;0m|Y8I_FoZSpA1Lazyql9ttuVHrig z80GbgQO!NhJep=M>Q#lFMl{~s++_Uw!Kgg>7qa3X-%=m&L`y9&k72C(%E{gtc-K5& zqY0h~S1ZcVvuTI;Y zrWqDwl+M+x5=A`wB#QAvT#WMGB}I!^YJ*?;R;QwbTOG?`i-M;-6dGrKIhuUl z?i+dVi_epA!Sm&H1b>LSZU^VIjdN^CrsFodZ&EwbvmM$ae0cuDsz?hEF)+{WnXbV& zLV>wGw1q5r;BIAL!vWp~P~QN^4ZJU}Qg_Td2JhSybRNr~nRh6%A&vpW>qso3ktba2 zJs8!KyUXojVGYMEFh+WUWfhNP@-yst84@E$WytQ8&}ZS|)&`t_#6`lL;Y_#a9JNx+ z&&vqE=bf|4a@cPXu#hh0QNL`7zJdOWQjB1&bI`KfMG@07ovJa#qS}H?+rCQPx#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L|D{PpK~#8N?EMFn zW!HJ%iGDZVTcLAACji|DBn1LsM5aWM1i(xMk1{1nw#VaTdo0^;*4X1&T=sa)8_z7y zb9nQ{GZIC~_Q*k2qCkQ{6cY$$00a|q?wq^Q&F}yF?{lhdRaZh+S9b&MuY1=$VV@no z{O!HZK80-?exV<;pqTy6Kw%(9zmOdW3Wb4_9C`zpi@M*RQ(mE$9n1rB^JXw_J%)v@ zFANKpwGhm1Q>U;Y4%a>q{Zc8aoujd_b$=9lEw#NH-BLfwy<+s}xB6M^7L2b#lza~K z`x$;-c3%@rKQEXs?^##o)H6uG`Jgv&f4=gIbGYT@!x9Zx0lYB$5&!NQ|5)lbI3N67 z2E2U!cy+<^Bfn}2?Hc>IdBOBv0Ds`>x#17%s2ID)e`_X>@;^WP8#?I4p7GzE#j{Jn za`G0`sON`%T}M6D`@89)z|UrKHVA_>om)P+X?5bAo_OcuTsENha(S8W{`|0b`v>J~ zKA0QPMGeehVFCQ0rA_uT=1}I#LUyZ~D5I_1k}yub<)O#bM!2d3R3yw$AAN z**IH>4#s6x&T?pV?r?USmIE)ZO^fH9udHca5)S6AYd}s?&e{DK)W1CM+=W7EI?W3h zlq}JJJk1LOd6xt=7UMLX2Fe~xGmsziJAe7}JwKS151?iSnK_jEM`KI#Pt^9w=#)0a zk;dIZaU}|+V#xlAq{Z}9znmdE5vq@na0dbn5NQyW)4rwp0!ySMfg>r~U>baWzBE7$ z3-sKyG|;Za(&8{*n-&E4hx_y3b8Z=VDi%ebMbdoF45rJlx-cJ22GcYR_?<(OK{^d4 zz%rOA%>3Hfd^7tz$?wYr9$GlfCsTuIF3i^#bZcL!TadFa!`m-Q_h8v&kmd8+aX^BB zp7M~dpFcaNj|;)9`sPBW!}2;-2WaQ=+Bygews~GyJa3MJ!Ibk6`g}gUGYF6q9>OKc z)AaL7l&2CzoPmq;!Ql0U@+=z$h(`m?2CglXfc*D-K~CtoXBPpc(uMZ_Cr zgg+47s0rCJ#F8QmZL!yNKZ|``m#`oR5|^xm*^m?W++e=8lV-{tOfL^|yuX~ZGJvtC znR|d&iiNUMat#vioYl81`B*UD?;x+wmoCG_h52YQn1Gy~Im|jA;G22*hrC?V?{u2W zPx<-4Z-P0`W$EPs`4>w|K`9wosgkms{BpNq!`&}*rQWN$TUIl5Q#z-p<4jtlf28oU z5*7yGYYxoq;~*V?RQdwxW#eW(piT3og&}YAeCcf9+F)87&MI#XugwRuo*BRo`HQn| zE|PK>JT}a2z}zI5Th>`+7`Qgy_1Q3AS%Yb5piP76Zc7bOYELijiv=C*Mr^^2uBDS5+rTD;u(fV?P{loAc{ zbp9b%gbSuD(wPf$1^+C_a62F5&n^0V26;UTrOR;fVUP|B(Pcq75TDGxwlLoS9<>ro zmzC?afiz30t{8IJTPV?DMsn01)!i+kYiNd?421z*wb+rdvUa7X3JSp(d&3;}l*fI@ z`!d~ke&-$!CLT%8^={sMZsfcFE{D2g#>5- zTtAF70CU?$n%Affq`|u8OF7I}Ht8&YE(<_j-lEUXfx*1!CacmN2mGtYeBG# zrswCQcV7N{_kj6$elQI_zgSuf3hGBvL5g(yM8t)tbdk-H{uQIjv2;PP$F+X6CArov z>b`McJ(2pE9PhL1&r^cgI%;k@JO6B0=z6YG7fj~_JU5sYhrzZl*v@I-{$N@;q!tcz z`m9C_+?xw?8-Lcb87#NC%PsG0BoDT2?)efh*gvJ*V{w|NJ*6&2M#qu>hJs3kq@uSag}pnu>7+j$6iWB1Z#m*n)msa0U3>_ z+cSuZ93KPc^Wkhz+0B=x%U&SO2XmhX2J5)QZ6$KrVQq5FTh+bj(oApyl!fPg5fw>y(-RB-VkTXH^*rmmvpUHP&8cZ zMFssJ=>%Nn0{zyF>~{w8cFdP%fOapI7B6SPG@w`VG#5`x!(cnGZ#X4`*Ji`K?HEY2 zf%Ca(eweQ;5@VWKmIP;YTA2o6@Zp7Fut5bGqM0-ZgJmsVUP9aq@?Iw7M4Kx0nWR7@FpU>`h!r4q(K3KpP zf`R_J-Z^x(hn_ETnFlwy0vT+#^A6lwwEheR^UjwBVWDgJuTyl>wQObPd@!Atd`rM! z-ucpHxcD$ghvm>@7X1cRuP*1=`CyRu&pYI@m!-LK>V=*qhLc%qf*z{I!O92XWbJkt z;hW-A?M-pKc4zFbekjU?x*T&k#cC_V(n+7pv^yKf6AWI@j|Z>K4}*GOZki3$JvXfo z=HO|$a5l|(b}%gt3->XHLEOzvXM<}TEOeSt2Vn62(l9&E;Inhn{4f_GZsNS{%HgcC z=P>Qyy_G_bNK>T}-7=?A>cQX<)!wPt+P*J}GQyqenmAa0r*bsZIIM7j^1?PkK-|RmFD6=$MZ4lG=7(0<~-kY{<(l5TqLnbZLzda*@JzWd!ApL3-gt+6wEDmZn_MY z7Mu%B@@LYo`10kzBE0PDD}pH;nNFFWdpX8T>Cx@I6=SGle4=77sMZ16!2j;eKCSj!V2z%i)xZsJQ zXr@^>#+xklj>nePeY&8yth_l6SMP~#v2IV5_oJDsVNpcxd8QF0>Q0fT&*$`KZps;L zp>)#Pd@Ci_4emoyP%!R>v=1VIDFO<_S!-FVn zPiOetx8>Az-Cptm{7w9+lqq?h^?Cx`>+2e20E?jSRRc*zIp96lESd$EzNYg`HglZ$ zUUuK-@L)#A^gF{hOHr5m^YLt+D0`)l^I4weLdDn9o&ykkqO{ljTi<#lwl+Tz+b8}s z);1sZwaN0e<_X>%re($nIzqqLUS^CrXWs&T%c+V5Ko2+#LVj(jGy^$(W)cfY)dnvd zqm}ce#bFR%(|v>%Sz;kwo~G|D2zi}LrTHP}yTLRYQajak!@?!ag87k|!@`v<28(xO zNyw19Se?sj&;0Ee?9*UE2hL7hn@J2uZ)^UU1hOgPyV>sv^Ljx3o-mkaaRf%W9~E7Y zFfmL70}V9yta=w%9h?KtUxrH`3Mfy}8RZ8H_e8g@lx3j^NA%K&iWnhHZ-}nC*N=|4 zq#!;a2QQbX02v^LAz6z+9t?6xzpr-aMq5#yI9?Fm~}ypo|; zgN$^gGvJ+4uNbXTUHwe_Qt2P^+ZPzzM)yTK3*ZQy!tk>Vtu8rQ&+ggT)71+4M|!D~ zt&(0Wog466O0#w6Ov*!u`RmMe^!)m7cHRVo=Y#c3gZl4u&aiNM=ECf@m8{24m);y_ zDsNn>goLy~$O{`xi$mVfx#?v>hOk7Y8Ai#$225$;cFnCnPqShEX9t0MgXwIjc230h z$@^7$JKBW}akTM)=tybUz-B}*p$w!%3kBZWQ!K~)@I3umx;-;+*$7|yfD*(PXXi8) z(s0J#f{roF7~}EsUh&L3*jORx_5-$w@TD&y;D{*l6=i_Mo?J-uoRtgqlBi@kV zwgHlMk@@E6RSm4AX!D+{pij)!ZwnJd6v>eR93@*TJ>#lcgOgukw`WGV4&_Gd+kCXF&Jxo`z0)j3tR5G3vRVT`1-HXsNU? zm=JT)4A8f^X)t1@AG6cqFkgFSU7Op-mkm5Km=*@=%;|T!dQ*&5-oO(yWTB+LSz~84 zdQn(@gXV*21B)`52Qj&!ooj4n+LzZmH_gCcf99sMA;(3Y7KcJl-nkg1*gqMYCqFAg z+l&_P2@l;Xk8_v|Ru&lEz7z#Y*V{{YvDVoNV!nP}hF3N~cN8C#?UxkE>NgF+ZHfcK zKO4vEw`s3I*i<)1}z)-LINuMP% zW992~Eaw&jqJKnnylucRy`2={53wRjd^G@lCz50I1H;L^C;r?Tam%#&3G9zs4N05FQl~XCHP;!7L>!tbiVxDH{>QB;5D zq_f*Z(1PQs`WH+y&ke%7*D~8P%l^D97_2u>Gk`->G1?jZpjyKd494Cc)}sPx=i;MziI88FcPUczoLT3nB#v1Rh}GO%nBw<(U) z-yy*nO796v2r#@w2+_xrFY6danho={H}BJBc;!J+Jc1I1OLF7Dkm^L`%Glp{k7ALv z=KX5#P^@o%GqyDEkIl_b#n#Es#fIkBqtSawdbb~){<=6c^zN7_Un`|rj&@&B9vbRZ z56KzX)OtY1xEIH8R)o8*aDYS<-oo_|0JtmxV zqFLS&?b2r9pd6*n(b&-XPPBy-_9L)Eg2RtqH9lJAMH?IDUUkeH1xrD$dlpL5?>kej z%TCvG7`!%keSYBneCcc$EORg=fFI^d3C_-+VEP<>nlCLI$eU7MxNd`QIf?9E=28}F zzzn2^=l3+0fH{qxCd?c{%vb;H^Sr*nlwfWdB#do7gh5hoQ<^5?U|J^7{=s_Y=?5QR zz>pStDY`B7c~AILQU%TE6t~9V+B;;N<$bCwhJMnPl`S3Nxu*pX0BV1>#f}Rbt8#RdF1z`ZWPA?OtJ9n0`PcU>>+S+u6(c4;_{R&UX9Dazd=v2*H=_4~Z@dQJ{G z&^>RqFNG;?iCXtSTru$nQR|(6LE?Dr%~GP(0V#R)0tUoeED9f^oyTMA#Mgw8f^cw4 zOqQ>TZdo`g$w(PrL>$OS$wSw^^a_WP`i~O=ALRNB+d0yGTKXm#*R`D|rGeVQg`9hE zB|Tj3R2GXv(IZ62D}_O0oF^dHkNNp5$n`9Fa^0%L^_L5C_5NJQ z+mWZUfjS3Mf`#+X0opv6=7It)ri`GUr;XCpLEuuJmIu=v0%z8sou#FLJoD$9 zm-usFngJH5Z;-JDQx2dM^@?W+Lzj9|7%HaHV|Da>;{C4Q6FyY`NtIu>=ZUut_$B)V z%3Taz9)2#v#RP`=3W~}^^yrD;r%N|WAQky`reag`3sLMf#XVK?V6P-z!IATmQc_Zy zR-WRpQcT5$=9g8V6sh>=Wc@}z^Qs3K3=cCC1`DeF$6{0KK^+z2Smno~S-4sTT84;7 z8H=l^konKvTGpp?34>@!lafF<>UZJI&y*N|3CXUo^6JE+O z65sQ#ezp_3i>@i~3Bx5|P}j_t<^}O=uFvLshGdvyuzXMbm`;Ovmks1!_?f)Sg;KIb zv)i>8oK?o0wtGdo@Si(_DmkxUnHA-heZC}^Rrx&W?D|s5C)3Z)KNq;RNK!jcQU3Zz z)+Tm>DY6%{5Rt#HhjC;%IQPnmF#07iF@n1kWM$5UX$E6{596zAJ|-HbKGn-BN?V$r z(s5If&(=6xd8aZB>A9q2nX!Ud7lZ*uUMQKc%9p=0>T zGclnk%kM2_(*^mjLB?_^$bDWm&F{I_LGo)ofR>rhZ%hF)^zOR&1#1zsw|I~{G(hPvc!89|Ki6cW93#IvCx{oR( z=`8Uq{Gv8lCuRAT4LKnO6R_4Y8+XRZ+Kq|780PX^zZ5;VlLA``ScS@* z8}Iuz<%H2XdbFnVL(?CAg*Hd(_r!SVO0_$2J#8N^T^C2H_hvLzZt==!`-l1!E#)*! z6}S7&s~Nx-o7v>L#4C42XWo7Fh=6EutoD|eDqkz!V6hQ%?P*BbMrH|M^r5GGXa+_r zpi{`1!>F0YUC~>2I4%)!s(ec2yS$eK^yP#}*0WaG2sbNN#nH;0mW84A&u9aF9d*h(_sMeYb39Nr|FU-Xk(d|V~mtR)%k() zQke-Cv(uotAFOLOQ1;p7&!2Y&7HZK9U=RjUZfNHk+p{a8=)sg=sRqp;BTp|6D)x9& z9ST$wX|9baCED&`8x;w2TENr?lyu6k{%~`Z0p?&hdTZxXYLjX&Zis_J_vpCl;pzn; zr@>MnLyGaCukM%n+ALokFEoDI(bS8>zoPV0x^|UtAfZzJG$V;InN8D65poPbJB(jG z%E5cpYun$@L01a+mY8IRAb~wkjIRVT9|>3t;0W-1rt&(`W|Izkv8MY_Y?}P@sP> zCC3Uks;m(mGmj=r(+)qq4EhKVYP?`*kAh$>x8IvmALJ;A21F~Z!basR#c1b|*fMp0 ztm`~11HxY8>*Qd_xJW62gHpdG7xI`Gs}rsAx>Uid8fMfeIQLW!+%EhLx1Uoa{8b^i z5=ZNIcqb?iKMSWe)ZL{=xL7SM;;7726C0&?Kt!~GW+a>_+Ti!D#c$A!xxM8&$*T*D z4$ud9sbpR|RJ~0GwH)>K6S1NFb;%6V7733@C-&?V`e_9ya5H)eJ>sq-Yd)3}q5>~w zq79Z&a6M0|@K1q7ZY)vh^aGG9=HG<@9L$$yfb#NW8Jv@n4j4=ca+{PN=P;8a2bgIv z3G#>MrWqjL+>~J9X9j`md0GMn+BV~t%p?Y#Ix!lD8$S`xjsB`4hM$c?^$*5#3?Vk| z67i%s1zwaOg4tt|DDfAjTWv57lxnS$9*$-XuM?Z&u#9l8JZA`T4s$Ihb?6ob#|Ek^ zWxZE8xHAf+Q7ID%n{d>NVO_h+Mi@MLpCw6JdxmV6EO>ZH{q$%C+Cd5s#%Eq-ee;Jg z(t1wkwK!V6J*E^1GmlEQaJtg`+2UZn&@=7+HY=%-*7sw5>!GN3UX0BXpOO++eX6)w z-X`4f{%PBh1RO;4wG`kGFci+lEB(GAYeAtmX{AnmKr;Lt8|HPb??$D&Kh`xLidyHC z_?I;WL&~N8ppY;SYLh?o0X|;sKx89u--R#eiZW!IS9pTq=nc)U7#ByYZoiJaWW*5v(RnrKnZu0`CV=)EXEpa zI8_I&y9}!g!Zox6kOu(cVI`|y48^D-;q;19B~H}eW+P(f%QRXXh_8T>qDad0C(i-^i2L%!^H$l6iy0nRqU)&Q%}ttvb;W z5kqls=tFTr5%cNFO)*}0bDXT-ssQHw!b;VS=3Ikwu@hQv@SLINq{(x6$HYlyGkals zk|pzl(xCoann#Sq1yddg&#Gq@P<~d2Zk5&!zv-jtEW!K_%v3NJ1}mEV?BFwlX>piU z9tg>v$*<+Ym&2_5N(?`?iksDHJ&UH4;1LnBz>48Syr6bzC>p(IbsaKEfl7iQgNHVj z(Z&^l+Jq9vICdq_)o8|0_pul+ZB`M_kYCzJ)vV7Ub2#eZaSv*%w;vy&u-MC zRoWU;r9Fy#PAZB#6Xl-zDIQrIq>hxORotOSbbYkt7*+d+^lT?iRPIoje0ioDYg&(p zbEbqtwM7kq_u#dqz{6{m@4kcP|F-K zSr};;j&7+Y-g-fJNW6Zr(oz6bc?FcwDUUSy8gxOwLC={o<|{Alx39XKGo@7O@&IZi z>}AQPsieU^oUXlzY%YBcaA`0l$RD1YW*}8Ola>!IOX?>XTtOya^Vc&Q<{IS5(pBOa z2}YmDg|hWm5oMa&N%^OgCn;_+D6-LYhM+IR5E3=yMxes$18NWRc-tpFCnbN}ZC)%5 zVtBrkq({Oh%F}m-JgrUii?_}&4hyv~1hht1{0z@duxdDcOHnL&f^xk6XmSVeBfZ z>7MjL8iqfS3syciW20Q@a#S%euX;!ZHy@0I58wgwLAJ;WJ;J9yhuTlarl~KRrpGI{ z3b)HxNCaOwD$Hb#@^!GL{X`76e?Z}JwEQ+XL|13JDd{ZajoH(S4sI_vYWoykOCvPw zw3qZ8jvm+Hw`#9yBf%)oSe11X$}64dxpQ6js&oC0mG@b`(4QAG4Z@&($dhNPp-G{w z-=xpHwnlyRG|vL%<=^&ICKlIRT}N!G z-}wk|J^^NioGAB}BX6}rb)rlV^yJN-J2=9U?7(xZ?0#wZFR9KUe=Bsf{cYpsRQXMc zzSim5L~NP-k8Y2n|2ed{6v4wgbWn>TGc#peTH%SOyt*9RL*PZg^cSIN zZ9j(MrJw8YSA!LbGzW?f%f`la-s}ROKeMr5IOC z{yXtilWNWxc-@J*c8z`9ZO!{QA8*ia)>fc9c8~woOdjQbe)uf-p3czZ*J`#`#s|oFh6CyKtA-v zQSrlA9aMAkCgT^UQ*3sHeDw_I98()yLru(48Qms_m z+;-zAW31_8lo~=PdSILe`Z{0ApQrBpy<6x(qO6sI6{7KlV5#lq5h+|9=gJcApY{@= z5(%?mJqqMlL<3w*kn@%0Vi zCv|RF$~UJ!QAnXM6(g-DUB;Q>_0cM<_c6sVDzZTe{)&l@#U2^M-AcS>Q^LR+*Q{yS zDC7HD_o31Gk)K%-)VIMovAnP8-DjN|w;Uv+=3I7mbbo-hb|G{V-i6PVDdkyZK&Bo2 ztMX}Gp=+sTc!IS6>AKt7p{)trysZE9DPchUbzk-4zRM-o4fB%?yRK*W#;mi-dZhWd zjWo{LcSw7xmhfbG zY8w|GJ#;zXS7j`7gy&)c?QWIV#PRAogLmewf~2=f-9#63Sjvclj-pI`vOIt*_-TtA zX6AufF;%)Uj#b|zp<9#k^iRje*0-YGeOAq=Dk9@`sN@J(cnuOzDU+ODGm3d}emI-H z$@#(XSO8$YRRnwYSrfo1%Cw?B9j?ADCd<4Z-1B_+XiJfcju95x3_pMeM-|gV6ou69 z#8buCsp!bBZmj@}1J!}dQ4Na*_cuNuUaUz;oQSPcpVHMawLyaHVT?or^7FoUax&nZ zs=u(+l4HeQ;#W-ksq&mQ4HpADCM?RyI+@CrF=cV1u0OYi2)M6^_G7{Y^P8+bO|Pcd zIS~eU9g1OoN-%DO<2`3S?sJ3iwptPJ%Yp&=!F5FSzAO(FDNOWEePrYeOzb(W$e+lN z^#b%d=Xdcf*Zt)wT{~92E5^#{RX2vYhr3TJzf7>AE${IynKp*HY@I2d@zluq!^46R zuzs%^`!_N|P3d%;{9?S=_^=lh?$LE*B5h1W>o``s)GUI76O}u?$Sgt9TL2hnw4aU5 z?Y~%c`CTdWOZC`ae{Xd4TkVcZp6(OgTOwaY{cXFiX(hW3z>oTE8IT@S#uf8w&Mz(p z{>zUu@IqS25o;ve7W_aCV44IJFqjqwDs!@U4lwHgvi4~lcX!M?o zofCf;JI8-7B^`5(d*mUnSrVN1Rho=()S#TUe$_^d;_??s(3*ab95JhZj`}bROBjdq z0p?}>qXD$L%;<;yZE1Zm8r>hMeI?Hao~d5#_H-nSD6}y0#}z4wO|7r#xGN>OIbN)PP`|sK*D?t|VJO_NM4PF~w%9-N(;n5ZLoxM$cxlp9 zTnfBBBXksw@@+1YLN3QxWv`Tj_&~;o)v+jPIKk^D)Mg%qKkUJ0Wf(8U6NBmuU0&Ld zo{E%B!?WR^p3=) z?$>oG$@e9ldJ}Spz7S=;7#8cj?|!$;Jol980wm*`C3qxlOB%Y^9)GVrl!w>)#y2j&IOh$AbM ztRLqLIZhBXk=qM#aC)Ah@_z;aTzLVwatthun-Y)}v*!@Ehb=AJq=h-kff?6q177Jil9K!q> z+oYc6i%8}XK2O>8iss?&vufWda*M8|XcyM2?Ym`ox2tC;^g?WEDw^*;87FrT1eaF*=LHswfK|sX;T+jV1cLx&`ef&8BH>KUF*?>}b7lg#=>`26Y*(LDUHNJ{f>nPN~m9!3=o zcwOT{%n<^f)3!oU)p!DG7ky;m+ve7TQCB3~FO}kO?QNohOa^$*ai1e8Kjz1O&kuNR zP)fior(<}pQ)tIf``Nf+@;-{J#F5&)aj5YQ8Hl&WRB5Y6P!zAq zf%s$$b$%3WMek*mQ|c^ZFKFtNoH8K9@SE-L#!P(Kq@?U+FV_2M6E+oPZl}1g@;xggf(*pO;K1 zYT7vYz;qt`lvfTw(*uR1*X?LAfxCcJu{^Ktebo& z)=xbgYsHrs4AWUSK%6e=gbtUUs`Zb@c0L2E$d@nB9jV>zVQFMt8dv|icFNIrX+427 zL57o+z@RS7A-9d@A@HqMGBxHcPhrA*sDX<)xR5!9cCgS_EI=iJy?azEj3pt-`)c=6iSFac7J{$fB!#~cfM%=`?bySk zUl>2Jr3^hrkd%&Lf+Sev<(c%X`oZD^(;b232c}Nf2AOHTlpq;jUqbc|3Yk^b+%GB7PU zgeR-FsE|?&$pCF=e;IU{Kd9F`Y#Dzo;i>I=yl2V0=6K;+x37>1Pg3@mHl)$6miy$< z2KCWSkxuD5H~<&m1l)ila0SkcyNt!*C*GY$ei<H~gJ6q{-;^{L)Ow3sNr#xh~qRJ)R)PRG!Zc5=)sT)w6&Owo8xXg$Y$Mh-6Jgkz*` zsjc#P6!~r+|CIWR5niW=_+IgCP5tK0`*KvkQ*P53>0uh`Ji=_9m;*XAO-t};$90jAZ=bF+G@Dce!kHAb?kF)L0AJ+iOM~avRY$5*eG;-AAqm&To|O0s@w*fhs2_Ur zqvYOTluZSE{NzY@a{`@@w7+ZG6Wb*k(LN=Z#E>?d;3}I_tQ72!(Ha~hdB9YIQ$%RR zYpk@h(mSch_9@l(s5iJ++kQw9+V|AfN0pw9I-77nSC!$Rc0KQJ!CGn3(uKk64@3i| zB*u$-746+FnpFJG^v3oBE&^99kMi))87}wq6zx>;a7s%NBEzpJ>P^irtIfystPGm- ztlmZ(FAHdk+B%DVx<>E2tWD4{&M|X`zU&_dyZSgNGEHwv=&@c>uB1G+`W1$1<)MJPh=VN7%zRIKWYyd@C9rFn= z=7^vGLn4Q3^2SOfFM8P8yg$kvwo_DF5`|U-sR$TLK>Z^0wDtfvM>sjxFKQdS__B_= zQqpZHpjKQVVMLHq#0GO`r7i*z0`q{(8#q?^DCUy9&{7F>7Uhwx4FQ8x$2#<^;jDQ>PHa&+p{;`C|6@XW1_j17przv_Rhy?$v zMok}Gr+SpDAeTAXBOtFg7tsCuUCx}A%V{4@7K@G8HBLhBsE<(rwr6Ft5)5ob_)Cg8 z)lDP^Zn%43n1JYjS*^O1!K`7`jYRVonS2#63M%yX}I!C+uP5%-~QjI8JlG5nCo6h(`Z0 z-4VUSBk=W!Dv|j$I_|{AiEqY8??);HGXy{4q!QigVYL&d4vXM{jf`J?UB{RD95D3t z%4YS6=6je|eA_Cnjf3@jbh{Dd_R-kd`i$t7=7jS;otOT>b2;QZHWwVwKq^JR>xXao zs7PsVuYN%8L*8RBPDYcm?1{qjh!7LzyRo$isB{gfDGfOsnaYESH!wPUb7Bp|=$oGEuY z6OGlv@yfMvT2UgO%p)3TDjJw7ZBg3p?GqPDEv2a}`MgN}tua;J9uwtjW2pO_c&%yC zC#v$h(I!LQf|UUa+EQ7w>6p5$>$-=+Jym_9&WX?-o;DC^^dZ9!;D-hysM*n+1y))7 z6vkW6+fZ>O|5ZEE@Es*fA?9`Y9)55F&itDRZBC|HK>KKa-cDumvCjehBBLrIMf_ZX zr_?SvRVl*h2YVx*sNX8Qmt}mPh|R69stk;I*2*sPVd**gMOAjHbZxAf=8M(!^x=c{ z*Q6KV81mt~q;_4h5wO~n@HYdxV&}*76AnBj?JpY*Oyw@#cA)Q3Ka9SfMVt&cFX({e#8@`_m4xSw z+y8lgr2Dk0NuIRl`%sQ*1x%H{Cr6_?BC%gdxP)QJ2pAlz3%kaDTYVLQK&&WEB!Tz4 z(uEQ(PdKvzlW-yyrz*SS1S>3c52dwf>T9~CXrsR_jtsp|Lcu=1M`H8j{T8B&3HBVN zjZX44l#+~;A|lUSF-{^LNQ!x3SeQN2bH!dq3jecFYadI55Ka`A>PJE&;Rk1{4yt!q z5n4vW!3c^7o0Z@w2}W}%!`oki8WY>s;hL-_zB-ak_km z6n6TM{T3PDw1tG^9NAaLx@FN@UH2|yI2m+S7sjL%k5})q4yY@#+tPec<%?#@1K-#Q zA@6eWyV@`h{gwjcm+w1+H9l>6Sdl)Px0E`CSkw7RtZ6-EU9r%6!r+W(k}r_)8BnGM zHnhJG!|i9x=PT8p)aQ9+)kFW#S8S}|h*gpMiLxShe-FDC>zWV5`ljlgX1QMWnMU2$ zS^hpe_bWpS5Q4U5Re?Jze^7MTH#Ixi~7`tPPZ@`2O5fm3uWn`)3K#}ztr2LoSB4A_}EhuUr@`^F3iuZ63loQX7!@99Vbcw+D0#cO9#~MZZ^lr@vl=TGM$_Suw)Oq)K?3LH>}E znoe6(^7$G*Sxs2V0Ovhm=#hzc2$i}86R<*ZWdZ^by~;J`dYD4^Bcg=)fkx*@Y;20~ zx`z=yICQVB)^&>4wF(UWvH(^UTA)6>lQA;_ZXPiEEDSk*7Xpeb^;)s1^~tES_jOM! zDrWU-6T*L@!zzRNbgl+i>dy+R;6+^V$HTe0ceHV5Ocbv%{wxSt<(lUlR?Pv z;g!~cleJsLr~AyqOwR${xle6rbe~X=^5unbsIt>a=2XY@G=u9*Jjm;Oe0lER@ZIh) zb!?mZT=ct>>YxlR@=5;eS)9s>bQEtYESGj3H4-qikMoc_ua@-tM7}3={WGe0LbL(DFw4bENnr=VYR1hBullu=@m&r$A{3(^mY3U! zhH!);0r@yWD2PiNP(*$Or!Rq&pxE%L?Vd-Ld@wibh_}xW6vMhW7Rht=T-pT!+Ua3Z zCFbJC*bPmFgb0Vo*TxqkqBi4Xlb^Xt^1BZ*zFy!ZI3we8tj@EAXtbVi|VDX2e1wF!N z>Y!~^LIS;~9Tcw1fU!`A(In3Oc{u&9$`IZlWNkJb^vk=fEuz=T?LvD$hMP~u=JwZw z?_^+jEsI4&cEXsoSWZ7HWUx~ueRPPz>DM@3I-416)$5(0u z?0H(~rGBs)xB}f!oHA}lDvE?_iq1MRV(kZ_+Iu`I9Y#Jf`Ot6Dl~VK200paOpCA2o zXY4>=3y?>^FAe{K@-$-0cRDYN^h#Um+dkSWtWhV|$AmngYJVas3d^l#JULB73_(?f zsWZ^QOAwY^gr&YfBR=nTy2^KV`I^j)UNpk9r+mJW^hSBeuUENml=sOudf(*l@^(rM zG1Q9^=&`89ffz4cCFML4O)=MS7w;O}@)e&s40@q~cIZEgrdR;s6GlR0CQ}<1ho!h9 ztq|958F6li%SNNY#t$WgoboRKf2kkKS|sHDp8XmUstz7s3VOM?9&P~7P`&OOvs*#Lu>#K@X!96`ns`lmW$ujh6U)i7}!bjR8$rL zNok`0c$ICW`;wIMXmpC3Z4@fKW|Rwu$)&u=EzT;ZGLb$2zj9`!UkG4^71jCjN&qss zTeOdV)QdBu8$B6Iev|?F4|kuF43DVInbgQX09~D|~z9Qdyx6uvY7h z$>1E9u1}FL#;m8j@C5v8!Ci3=czz(+NQ$3KtG;;dE&8F((~9DcxSeN8`y@|0l&!xc z4Q&8jHa{Gz)%s0Wa4PhpKfH!lD4dZ@JRjrLYpkEA3Oi${_pGup2TTsNEprU)L}$2O z9FiMOPWijejkBBbMsr#X#G&OU&!4!^<^)r;IX6CH+wi5CQ6=ym`SC1 zhog%eot+o(u(~iK%I05n!MjK=V(IbB5rWfKJb6w3D4J#3St{1pI1 z9HOh*+(X$4XO&_j_SfDU$E!b~s8P;c~FkBGF%mX84<}IUqxUjk_A_I-4lgt z6#3q2-tv3Cih>-?iMB*YP!q2n8_HhTUTo>BY0md}^;U^VU&idocTqm|-KMkzK;eKkf}kE;zuIa9a9Wa%~Pn`BSV(_Er3 zUPGhQqjI*U%KKDk)%l@wivMQHUNKNko`6i>&==BB?}xrOR(nGnsDB{#*FO}e8#k%` zw!f22-D@ zF%8r5i*I#lE6L?Vz(iqu?Pa9(kUaEc|3Yd_b-e8t+aCaL6xt|+%Dw>nrFzdb0>;BefXjSiRCr<4 zM347I%eO?cCVZh}**(h2Rw}n#m-k*5kG*6CzS`hdjifmFQqQs4tpsz9d>Jz3Jzrk4 z!C^q5dRW{FNlqzpLHpDDpr8JS5#aC(MCb1H-V#M4F%81wYvihHtnLGOS~{Hg?iG}<SP74Zt7gllx2<0MV=L}u92Q05|(c7O{zD? z^lXasM*7c2i^!f)(8?}F#s}Od=$~FoLRLAZXDbED$WsRNfp#lZ`iCS@JEN_Lv@6F| zalE=fA7%X1uaVAUJfNifK>lo2o=2HxT@z1=w^Q3?P>XCYnjA+)Hjvj!OnK+Isp3`9 zEw7PNbw!K_XDm?6`wdm0zl&W2pbL31{oeejTZ(37dmOF&gzl;R-j?{wF0%((0IEP$ zzpvc#H$)~Dj<80v5J%+o5-L;i=BY2)TFW1Ffy~``8#*^CdA<3Vdm5w^vCa#T&K>+= zZ8agIr;qy#n|T{V2$_IytRh{kTZJG*t_aIgWBkhlFq=C^fxzW8eqQ2RQijf%$KFA?TF z-^ct7W9BpSxnA=pStY}k5uN9+wy+2$z31Eaf~yVf2X!|sj!WCO&dAV$uw49}1HhN( z<%9eyfE<_X{X9{x#7>nR{P_M9BaOks0;eI)0vooX{ZyWHG0UMgbsFGY%1zm@0@A0SuAL>}!{+i3AZsy@tBnyVxiqa&wYRD#e zy9}|YHF1YeAor#i-q&N`HmEHdmV zAysq5Tt#`X&&v~1W*wL8Fc1x>N9RE~T0vw)b@}qIU=dbPZl9EpcG`-Fw#Gpw|4R}Q z2`%5O>~|+r|Al4t`2cL#`0@)*OnJFxI$k+;UirXWD$0$|1EPfUq2=7zCc#eNa~}wc z@}4imD@Ztzhb!;(TE0f}2j1Tpz_|v9iWnJ#Cuu9~;tn#-{I!j*WWU~iObUnvS7};= z#Z^Rc7aNij11?j4&^@v=)?~esoLxQ&iviFUXJDxNSd6s373(_> z`wfySramWM>Zn&OAFkgm`Kv)?^_D3`QA8)b!UB6J(5Hp^m0kD#;Ki}n()^TkvUGH5 zgB+53guR+&177lo!V=(xh~QmWJB3Ygfc>XS72)`#zp_>Ar?*PLeTi=Y?Ah|SRBZAf zFcw{Pf+4Kqbw19_3OX^`)B`cnebUM%eTFN|8=;QB`93Efk#)n>msAm!+On5^dxEM6hzfe0u%Am4TnXco7Kf!?9I zM?{pvBKW73d&-P=DFDqt08X+%t^9_Bqa0wsY{cVSfu}RH7+!G^upq~g=iNl-s>*qK z=-0(_(q!2RZyZ0$PdrtKt0sOIRk-SOrg*m5q``cajt%Dfh4c{&zvE7{h{007Xg}>? zXpQ$=8KGfa1jcvK_k5Rv<>L1ofG7mxi=6rx{92;{YAfv(Ak)plHU2mPNZHW&a*Q^g zp3Tqa0BOE8;iAxIZ}W1zF#KVN96RSm*wi%-|EwlJe@Cs1!0`*6rHG&bi>uhD{`pbf z6zQZ7^y_+BxC9>iqT5Hzzh_0jSzj&$xIJcJX z53kbcKD)R1J!io}?NlF(=jY<7^v`T)MCyruQ$dUi57JL(ssXNTlS6iom6P;r3IeZ{j4SE~1LU3(3)w>3i(L;c5el%2ZNYl5D48xjgzt z@cm2Mbe|!-ZgE{4FTcqO`%-_;m)0Xw7+(NhO*~3Ue+!CQc+Zm8a6~X0Uq+yk7GF6e zT(W4hY8--VaDJYOUlBkrJ62Ns%t7+iD(_1mCC8kqN9SlKba$%-yppE#nJ^*$z3{+B zM7*nv^ps^-`E)8W#)|&vj(fMjN>}<@M)J^*bSEQHtYx5|lFUUxeS}8z&OH>K47#4| zo&qu5uN05?Q=h%UL`)QS$AOXGi02xAIi8c_f-|*PdPxq-+LX+%T^Grsa7=xmLh7y5MY$q^@VR;La*bsx25?5k;$v<mFCs_qix_d(kScH!*l6$D6uehD#b4<-x4-i%vjM zpu9GAzA5MGxQ}sO94Set*=c7@_vLs|?hW-zk;6utN|se$hew%kh|G45tD;gyB(-bpK3cPw?>p`tF^c z+D{lC(+YP501m+=IHi2rLfOW->b}^JTmgY~P{sqaO~@(Bk%ESH6yO1Ad}ozG;C*mA zTNfGn!f8c%5PHI={^$k!D$4_e7t6g#PuZ0ijxLPGk;XmhF|QO6@Q`^KG$2o&Z<;5# zR!;bm+}8M%;l$@uAD`ibca)Y{HXoniJ^L#AJSZ3}_9tBr#&PG}5Kr#o};AkAc}O?X9W zC&v&I!O4gJKyn&JXGlT;H00OAB`$VGHjA1(z4>tchbXeX6O7Ud#AzH6b5{gV(KS1s%R=D{sMV*14xfh;H@k{Ka8)q#v6m zzbR_VsEJQW=o>cK;DBc@3HoP7m;NC~IJoqKjT11wY_WK}c8BG9Q|s$7+GY_ck-i?4 zBe7C29)wG93Q%{hSEh$RFCuvA3kDQszz>cVy4wzlbfQNrnJdo(+&n>)nFS=50{E+N z(xHh@6%m)a($x$@t9?YgicGgjcb0o6MOy_hL+q-@R=$Z2i^4oM3fx%7IVlScsPI;f zBdX`$#_q9?IqjPG9sPcM@ih6{%J*BbXZ-((9b@-dU!Wv#63YFaw{z{5Hp=);#FpkK zb^WUE^oKjoh*|%_%C`(ti-`6pP`@ykj*rxC_1A3h`uIE-tD}=ZWAPI)y-YhhzL;Py zCRcd!>^!`nb6C?JtlEi#k*`WMyV^LaH;#tS9W0=#HyE zN6Ys_ubSS?O9t=aLEihky#TA^d3hiFtQ077kV9T+bHE6z6+wPqP?2J9d*p-oqZcoz zY~~4fP5id#FPidekIG5t$Vq@_X+y%Z+OGz3oEFe3Uw-ik*Z@JGT0M4pVkLqI&7G#8dopIKaE*!+gK)b)Z$@vXm| z486{S@dbwz9axvoTiU z7sKm1kQYXX+SYp>1X7;m7+<6v87eEU)q&{1LNZ30$4b{qAM|2F^V@RTk19c-tG|V2 zP!0VU?K~ZP8HphYK24T{4#UCmtK&W4%di|^6ZhB0sp{)R!>TC9YEMxZp~&cY?tpQ} zu*0l;b>~2An`AYkI7And!9RDvVdOnXlS?Mjn`s2F20 z+I&*1r)#}zo@XT>WdYMqk3^_ENAkJ`C({oUMtW7J=T|X!&7orc%tk13$P~}ZQJ_@& zlFFw3D<(fC-p>S0^5k}%2PL!=ET&*{pq)i2&+*t7#~N=Fo_gM}gHOJB@s9DNQnKga zi-bLuh0-fX(F$+mNfEa6h4cq>WGl`wId8mxaOL>F)l+&>^)H8y3coazZ^q78DBXQd?m=Q z->42EV4SPV1~|b=3^3qfT!Eci;WN(%f8#)z&(Zd}k*~VvK2re2^DqkG5n9z?1FzQF z5fq;ssNNl28DaR%a?f428~IN>w%R~F#ctJ+t^*C}8s58R^OKFOFQk!~%-Qd<3Yw1` zR|_YdL3d)Ta#b9y{)C#YOkh?(7Z{yo*p%UDztEj6%<}ufrG37qYK$D9t+F6cZhXzev)s+{J-PHfGFKE<2nHMbRm z1P(5<;BlNO3xqTz7RYTY0ui^)duo-ExO zW96I0M#b3FdO*+0u~*-5+^w(~Wsq@XehsI{hEZjL`L^mBs+Qxgz45yEKkm8N(7^;D)aJqRuWR3&?uW=4Zn4B`chFS1=$c`UvIdUD>jwmuV;&fsoj z%2}GyGvWz`*>z>L6a1Dogu%fSuj>LUqA|XV7Go#j$6oM-r+cEXbIae9?9{yL$5d&p z5QkFg`FoNW+T3#o5Fv)9%*YsD3GWyms@Ca-DG7ig;nYp>zw-LmJ5uqgQZnEdA_BM! z=MEMyr^;bo~2ApZ9Z&#F;F5 z20EZ)JSroD{nF4cJ5bm?@jJf99k&^J(^#E567l00{PReFrTAm1`xgmTGz6^+;G28- zVy`5_N#@vJ0m?#GFQifyJuNB-bbqDzPoo&Lkb1-m=0Ti5hNG!D&%=>uueK$gV`s3M z+B_iNs{kG01hjbSR?bMT$Xqq;OB-AP?a~GtU++_ahvLcXNkzildk>So1ZF_!D^_#zwdT`rT3SAim>MQiBHc+1LROc)MmjL^F zrd39Byt3DQA8mhEvj0c1ZQ{>jZTAt=pG_>l1^6)^pv*X-7g8#@KCtnXLhC9rJzTvl zCac%Uz87qKd9#Ailw=GOT_^|RE6nR25w@O}13;Afx@{ZcpZ?^{aqapwad2`xKJlYN z(UDPx2YE#@jZVNRI5f}=eqrIF58ON)N9KHSeiCHHSLdt^z?ff#l>xLzAHdheuH7op z93vx#SNLbOIp~K@3|4TBXBav0DAWqU>p5_&MRP`8()W59eH9OgpQ$`KXNhOvyA%|1 zk0V;VdZ{ekQ(=Urz=AhniMMT3FIrA5h-P`6jc-KV8;TSQ9o@hjTE^IRDOJN){4C)_FBi?GElbnl{gM=SNQ)Fp7|(8XO%|P9;wGt%!X(@5ZL~1L^f2jJ6^m zhWuSz7WGmWFLn4BzUr0Zp1qsn|NYK4#88!C%VOO3=u0uyo`^DAXp%=oz?ZZU9>Sr? zqY3Cqo7rX&p5i)lz8Hku_`-I{fM1650q6x5(Xsj;yiQcE^wzbfDmTfo+vgDroKJWk z1Ifsz=^^K6#h`NFJFg%XPeE1A;YoOosS(cY%;QAr7&&LHK_0QMW@1!_ej^L~gU>x0 zC;j97rK|52Ps;fAj>fjhPph3W)Cf~z*eP#DUFsI^A}q17pj ztGln~SiCXw0f$%l_k>^NkfMboWYC%9>-@rC*|l>`sW6q}h$__w!*Y5)B2db4w2grg zzcL4$zS-N2R=E}j8}IkLr`yu6#)-;ZvA^+w=vId9rLPq5&^L6xsD_m6yz(*eBnK!h z7ARh15Q2(@Gp0dN25zjnO>IVLM6`O{}+UaihiYEra( zGnjp(OPxZj<5k7Z6Mo+0mGT7~9Vi+wZBUZbk@3Jg_HB*dyzM&WrF31_{jVNKJBnF_ zQKc{lkEEf;EXop2(LtVPwAV<+tUmY%{?##K5Uf7OkI3&|hI0pWc-rS2{;9`-+WY-l zD&N08Q@KI>a96xk`(Tuc!!~|I!q6WIA?YgxJ8r%7?es)V{S~dTUO=bBlxLD-_=YuK zZnN96`hY{47XOJ))z+j(*~&EyJ2OI7?H`HF{szEg6eml2Efgp##?Z@(bhl4_Dyp61 zaJmKIRrQ|mWmpt={|>t1kR_)~QHd^io(B*^tu)z#wh+TVTtn#-S*2?$0TyNeDC@L9 zgT)#|N#!_MeyfbkCbz-SF0V~Q+wTw_uf8!Eh7|&`&+bd3t;gK0V?(#cM3GO{A&kk; zT}-e;A~iA6dRhvy6XT`V$AQLA$ARGw#R)|*&|$d!11m4+?stOKc2-Ga?kx8*%HWwf z->J$qzPG0Hl~~J%>h(nGil;Y~e z*i`xi91#nS6Hzm5cH6B=^eYXQ76I{Ul1eP4=-N{XjHJN3Dw6?7J3!(E&M(8t02;Di z0(^12{014kjiOsQD&6DK9j8U3PVfo7qve~FM?@DLJX(UB>vyF9@32mRa_!W6)GYA> z$JjFX(|n>j8Qr10S>N6#fvuC5X3 z@Fgy|&mJz8OMGF0%6NtC|NM?G_qnF~2pPvXc)7rNd(liVF&PLXBFH@!2${oFC#9y( zKQaW=_ec+%@7t=&bts?96%Jg65~uk}f1C%}<2(X8rbK0`e|=lB(0oGuE5xzJt%?q= zQB5hMU!wu^ynj@Nl~s1W7`RT_ul(+RhO^u$#_@IOIyqCjT0dz^KWg@~y3YB!&Vx~t zGC+B!v-~E=44Jy~=WsVIWqzAW0qzlGt`=ZzDcrD19)>FwSicdT}WqQ)L zWcVlp+Vd(S?cX|7j{o%?H|c7kO#&2k#4q2lC*g`kae5Zrfindaas`LMogjF~Xf&l` z_y|Q0D*b+_^6R#WS7{y+U41Z3RF{6#mWp&MJeTT*Hr$6+=3`yw99pJ+oQF0-W0jZq z1D@p?PE0aTmMPVbz9u@fJh~mKJ9`$S<^AB7Rv}|)s)9FR5`M>JH;~^oorhy<^Aif( z{xH_Gzw7cR%KLPWogX|#k?PSiD+bkveC5Z?vF5y)%1=0?8_uf^IB}Xkw~7G1XajYD zr*?5o9ID;_nG3;zAVWg)r|digCL^n98~guUg^u;z4UCxqx!4*D)HRVFZsE3GODBP$5I|zscT&cKWfIgDTiySiW^=lSk9uL=Fj_r4*nUN>U;VvxL}lp-7E>i^Lf ze-ID8cv$5ycjzK@omX7M545XPl~Q|mbfnzuLy6|}x7uTVcD&PNZ{<*q3rT#Kw2;b5sN)TjpJ6Es) z6|EL}Pa8w}T;o@TvTp1d`(4Xma!xQ*CH3W3jLY5QAJa9iXNE%8(#QL`!cgm)cxm`& z)ZT7vX?-^8?St-nv$$1!c(1x4{3DB{^o`yEuZB(Y?te*;bV#vxAhtI@FFb&c89WG0 zM5nw1czc{FUzah9h=!M@F!`+agp1eu^Mu^zL;h*2y=;Xi*CdFGy(f$Z29J2!Ml~== z?}$eiFB{)iKUjFJsWV>SS9C8+Sn-y5S2tfR>34X=j~0F|z?&F3@eMnN$0r{t7iTZ=S%KG+R5!~+crg`&!I_O0QG>3-;~Ql-RdJlEyd{oR zZ?&SKWOmYW-F72Ww7_$0KtLJ1|F@x)=0&^Zew>tJI#$`Mc1ba*46?H-*fOZTE@^xP zM6||9kH{8<$lkcUI97R+l>Ii9MLEnh;}l0UOPk_E@s<=M$XUkOB~nd}N+Cu&kIAWc zG&VLLiJ{(O#wo^%I?{f}NrBTJoaSTIWPD4}ijD0DW2nzt5bQQ3%t@%h4a1bsnBiaJ z99&=oRSpgLD{sCku3A52N*I4OzPhPj>Nz^zQC*BABx6aN&>y*e;M0kG%ClF5R=V%L z_H67<$6N=XguiZt36q+jCCD?Tb-ABN8*Yp8Q&g`VdCK&6ajx#B&+EW z7`!7v{Hosrgjf6Jgw(lx6rb=pJmv(6iZNX9oL@O0 zmy|QybnvHtA~t>cTTz-AONPmOOQKxz7Ug8VH6}{0(={1sD?F7>ZUHR@Lx^^~Gt zqhAJ9^uYiUcb9tIxMAC9{4ei#Ll*hznGARS7P<5g&;ECx`&NAK&={pCr3F;=orz!8FDt^ zAH1TT`>|v4-|25lIHAqr1N{@WR@}ZcO_N4a;H|muX?u!7?cO~3we*eT5^p&qBTf5W z9A=cL7dwSRoMO`no1wl?jvcs6U$dBzMTX$D5=WG&7_Gt@Jzt15Q_sfQ?iW?2>J|?C zu?Of3jb6n7UeYRkI9Ie6;k~akbY}fS#t%6Zw@-dXa>)EFgqM=4-X$d^A(Qbf+oQ#c zoOw?eLgJWCRIZLwWqHG<(fQYUXtfs-86h9ZiN3N{3v28Y4Jy{wE6WbE;>GQ?N!koT^lEFk}?o4 zF#t@ND76F_+fJ-+eMd&)uoF;^f{gJUa%Qhngw(M@^Sg}5 zpBuCUsDBLO5}Dh8s;xYmK7* z0GcHo4DM1S=Z!1GONQJ!<`9j;K4uO)|dg^?XUr+{swmV!3Q|5Oo^qU#AwC(k z-jNtm6t{8et5$vm6e9w{{F%!3>kPU^n-Q*B_k_wh6O+X&{Z3!EG^FyLw@@Kgo})xz zsRr8XmU2(^cXfS4a>hr*JH^dqZ9ZLlz5B{k zkw=nH?ry*T$C}o|Y7^=p z>U&Ay_(?sZBK;ny@Fo{Txuk$~UDd_Uyl!{gx_cu?aYR5YKtH%iw2niDBfopin)v47n>$PD|$WQ~q-Y=!IjF%Ll{J={@ah zOq@-vuf<3w1w}m^EDw8&XwXD$;eB4(u%`Wpp3i9v))W2`mu504Ssm{ENRHSU8Svv# z?;rM?FdI5DzP+~Eq5h~n?w_7DHjMvQZ}Q*l4_IU0d*sY#I9S|Ee+;G3(OW-Sm9ee$ zUR30Jl@*87n+Uc`hEj+voYXlFBhYOj_=T9N?2tz!FHe_HpoRXpjPvn~IAVCHixBdp z${XswASFAbv_Z;iXEa2tiWHzhjYAoDUQGWk!>b!mHT_a84%P2bM0H&>V_QsCw#(_; zqo{C?g!mcp9Ur)tdbVN}SHU0R*~G>=O*&c3R*Z?OcE`juSLuZ4Rb`iJG5q2o*;7TP zC^S7lTy2(=O9{UXcTOqlJs|J>U{w1@br+96@g7DOgPW>A$tND>AA(fx9oNx#OcnRY zh;EElc|;2BC2}R_!n`aeLi|trDU}txC|$~F^j@&D(JF3{EbLHU$JLHAQgX_Jh$+uv zkPH%rNk1~a3~yESV7oXHtzauja;4s;wio3jJRybpqKzfdisyh;U)m;?p5eLYMj(~l zL22msc=@gvLwW0DQ|n7H(t1Ya2)Fb}br8j=#~@B+gR!!n?I8ZDC&f}Y1e+W6_#c1# z^}47wP^VC9{h%D^o01<${d@A{(fH)!hjfp~Dj8}w23F8vQ;tu!uu1r0C|xwR<0Gd> z`GN4ihOn$C;5 z&j^Dsh{e=hT$V(;a|cRE(;DJCA^E5m0jBq~*S5bZJ^hrbfY%a_J7N}&LGO5Zp8_%T zIg#*~`0|8k1pn&3@N9Y1J<6vZoCzEYWT?@RJazZWu|4hbF}~ewBNiO89-mr04-x*Q z4(2l zmtcgMs~HjlO_g@35|CQ35e`MR)q<3no@F>C8CB#G;pj+7?U!HxQDr-b>;gsb?vWG718|Qx>n1 zmhg-5(7RFry*TufZ;gJH6Uvey+Bh2Zr=E_Y6b>Fgo_ZM-jxeB@XoH?(2oz;P#DsTl zFCT@9(Z;x|H0t7>pMalr+}3kAo5jMI<)b4*&?+|6<`-2SIaMwhb;3|CEKPyT2chVA zji=UsQRNIryRu$J7)Mt|xO39aFA0*vG(^v?QCKWrl;S%SO*zKB0^0%#KQ>N1DaT{} zPys{bv@L(*0A-J3!rz<*Y50s|3~3>b*6#GqM&M|Jl=n#MNud$tP51bNu|dh`Su1DV zqpvzgy))FER!3Ljf4u9pv2|Gbf|^xEPxPf02E8Fa(YFn)t~`HgJU;jA5!2jCjJDBL z6uEFX)IBWcZHI31(FoORf>Gm9_4Nxn;?0aS3IU^#hwrn(3o6aEoEI>`W*cBTG^(d2 zdQ6qCP@pobE~#Fx0*kg`{R`1#P@}9Q6 z7}WtUFzn2CtPA4b1NHaF0KZ1JXn#u%@s&2le4-ZJ?1feE4)^^mju!P{WLe9Qm8$wN zLL^q5;}nG)-)^BP-qNA&ysAMwfuoPks>u03UT|QT&SLGwT>dMq8+yw}vtwnP6m!c6 zmx(AOf?_0wqf0TFy)y{H5n`!Hd769#yC;Q-qG~F7Dalw@h!D*9YKw(Zx0M)a9&YcK z;%P*yvN5I#SF1_;m494iX0KDI>3|iZm=+RxI8DN22LNO49GBsh3h=|x`cF!kW{SY{ zg{p}$+vRl<`tMqKdclVUUhJgvq-bR_>V6u@!9yn+R=vtY4l!#oyaNoD_?X%=v7t>$T}9qQZANg;NXhPsPI-e={)nR6 z=UjfCm*Hr5)@onnVhWg#W0-Zgt4KJ8qgz%aT;8D^u#*R?lnT^m3D`dun=W~70fgTr*9dPg)B6xp%URcHqE3k~t(r~Yv2`!eth6S;kAjpqr9ZM9GLXsn*2?4%^K#$Se4D8PV3KsC`Cqae>8 z7n{h_{7{S?6CXpDB;&)iOd&ADn=F%fQi|ok&%Qm{!y9x?^Z?_CKa_`mJO1#qQ95%* z{8P5)%^C*QYNiD*DojcXuf50~&|+uCOFN9lP~9TnHp(F8tvXZQ8z;(d(@8%XohM^s z>jAfo8qeiD;o**qsQQuSFNqE@XsSuivH)g!LzIO8S+TMM^jqMA1xq|L01P7&?0}T# zhki{(^+b<z(}VPBD`+VC&m^QPFhe$+I`4edgJt^sHN;%h&Q z&pvs`?a@W!+V8AVpYo)Y?E-X)@k3w1Yu@(@02!_q{u+{Sg`;O~;e3!b=MK~be}F3# zeR@kk)Mnj{@XjVF`Fq-F&i-j#PalZq0}9|UeZeTT?S-LV5syhG9q3@tb&F%kCyvA} z(Vu*YuP?(&!2BzE^^0kpN@?xzTc;yn0OB$nUF+=^5wEhMK;cZ5cRNBZcaNIIv5P2_ zkgs=>~G!*%E3nQLGgRsmbxndYpnUV*s zXLX!jPoQXwxf)I(m*Eu*&^D3U^H63+=#CM^=wOJxqr;?Z)8Y-(YT8Q}enIWPYwLgT zbc{ao{Wx{QYm^rr>csBf{o`2oh`jw~J1G?9<+TjYcPg6m!X=gF*XN{!C=&JP`Ql}< z7Ei#)44y{RJEvqw$78a%+tEAoy9`G&R^wMt)Xsv8zFHxkPfn=oRt|=2>%Es`Scl~F zZir@Sr+PUREK;9=(Flys*B`s4HCaol{X}M zw7;fn>EB$iLKy(BqNbnfBOm8~``#__zH7IrVdw(dvv~ViIb0Tw-nwIJ{QmczO*M)~ zpgQUV6AmU^PGTbUS=a0}fUOG%W|-L#aEjK|KGS`+@f}=iaLzzEDj#>1?t=}0h!h?< zRKF#rO4sXZN6z3kJPMMcR*We+m1DJySA#MGds^*xaO1Yo6G~UWqwHwzwe4@E@=Zch zr#IV%fT5E!!7F#h8RvGqRtD~&aUeYT9Ooph z3*c2TZ?`Jtncma>ksKjhSJf-NL$9Z{q~Uxx54yZC^y}h(l|ddjGs7b$87Fqv#Q&Xe z4qqtGWmo}-2DW=T^cs6M#A-%ZVLdh>Q@i%=J{m(xrAYpAh+B5aArYMy>2(6Xh2}!7V5|<~P%s zct`)(Zybe#g0Vt|zqk$)DiX93QW?JI;myQn@OP)Qj0j5YBC@g4_fA-9r^+3bQ@XDC zWoKE@d%^`^MFZNFcBrELD+P3+Tub%cK?;kvRIZJ0O?p|p#MkNSogXT+&`%9pZx+oRchZ zyhv4vW3hSaQxcv@3nYX)*0?>!OV>uPEWzk7*M&#cimg*D);OWZ6j7+;WA(SiSmk<^ zLd7al!el{_K-sfbV<2~`NxvvH>X#5Q4@Q2^TVT9Vl)7)mzMNjM$qS>}?YLs{zSuDN zl~~h$RL1Ke8LtO)?N6fCIb+3wG98@nL}>s#&nq(U3H-q~NfU^R#8dDm5dquiIogs@ z#n|$XE%D$Z7WlbDEAA9Q!S8nbmjIMfax&#+vO5sGo?ThrepcyA?k79I9ap69mBCVy zDB$$9C%Kn0y3AX8kr~QaWwJ_QQ|rMPlH#P@yt~;d?UQlWvwDoYZs!s}4JgbsFPiXY zWlR5jcL^Y`T9r#>ZiKnwa)tB7fEL;a>+d_RUhfhr9q9)(h2tebP7Niz>#FUseWXg` zrAtz~-8UH+6qjF%Q8K-0bKd8R48~X9CSORjw$V&iRs`uYu;M%M2w_Z@Z6rmL@#;0I zwkRF^#c1@O*8PMJUgH8+iFPUCMRrnq63=hwd`rRB!NmWxohc#RuXazy`p&nhP0t~_ z%b?$7SQPx}&)iXj7U^gPV4SYpA}?}KW(;7xdm^?d!Y%ZtL^x-Xhksj46s}3a;k;}$ zHz{L%f7JRXr8E#Ewxhfy_((qji3f!Tz>qZz;JP3z6=z15XLRDmai2v4yhrI(e$;ar zUeQ1VijT!0Sflr&Sljxx(zjwwN6{br5RIe=1Sk+MMAB9G1t5oCNAk!Dub1ee{`kIl zg&Yjam33@|&oz6U8PgY~urhu{8MzK3Vm%J8Ed@No_dVg&8D^#jq05v6~Y{6@yCiZBW!!j}ElH9yOIgJx3%v?b0TN zJdvOBvu79%ClXx}vgc=NnmMvVvjpUZ=f*8-;)ZRTeBSlQ0<=u`76VplCv^7W?R&5A zuj!@s(>D6m6Af`%Jol?>p59Vl&rgK8GH|p{TLpdv6B^`r&v3gEfal>m))S}#U1;i8 zX5XVaed+3Fm8&C>5ckV@<5eT`LS}^1PF9R4z;nW*?iah`v0V=FdKvEx&4*)6^C2&~ z9z)4X_aPs$r&s5p0gSopxG)q_M z`WY#ZqcX$@yOfJORG6SyxI%<)C~qmoD?8(K>E<|9e|?;;+^jNgjFYt+;ZDiiG5uGn@<)5*^@ZVT4!( zFQuSlW6FImtU(3q7ECMXN}0fx)@6DSg?IY(*OS4~?z)G5U8Hyd(uX9PRSf z7%yENYr5Z4CX7DMCp;_!D15uLYLAty>fj0R?7Ef%7&iT55f*J*+xl+S#>MLfKrP=w z{Yy7p>8~BpW}iHChk+~!&E1-rs}O!*`S z24|Lbfwztv;?vUK2c_o^3zH|*R>`T_ot}jTa$YIqGMqEm2{sDBt0i?dSbUv9%q_*j z!W8qA5YN2b_KEv-&L@>5Bq9vo6P~D`Kd!1w<%&SDRTC32Gl0(w$`K${-7k1 z!gJDn>PFCgn`7OeJQN8pG9Rtq9nA_WrxWDfw)d4C_`M95E_gwalmnE?7Z+i0iEO<{ zk7Fwb(cFekc2(y9%!^0QoGU;chGwl<;05t2zwiqya8Y^~lLSPo`f*t)zX$PLC*178 zVQwx8ZX?Dz&pOT1iI*!1ZF!w(ZS(0^*ZQ*SnXF#puLyY_j>_~5^|DoCn#*IDoD!1r z!5r%PW_q28O)PSpc?YW{z%mFv04w2yDPsC%vt!vv-n zxy!dMO;Nads}u6E04rfIITUs*R|?R9Q6U*$%0oNz3r2Dr!<(jG2Joy$H1lKHuRN9= zLHed{;ycP9Cv_l;^d~*bK^np~sEoAII}NvUo!|TzV8y@JJm}c+Ecpd*jQ)TVo;RMd zXY*fxV-mQu<3fW4K31=dQ;eCwTbOd6XO-+UfD32?WMu-@3oa|KAAOVh%NWG$E&yblY=>uAZGMBv90xK zZ*(7JRz@bIQ1_xqMI_-*P4i-lOdxyFh$FT1jZFxFV&)m<*Qh&Zvdi$w1q-|dJsHO; z1{Z#+mZP(Njg&;mMwnHZ3_W(`r4x3cq*3-LMZaOo5F82xhB8~^^DfGVK{J0zh)d#0 zonwpkY$eijINi&=ep~6;3achPt!u#96owog|U8!DJJASg?bo7Rp;kaUqAb- zs4E8lyzUBCRfc#A~OK=f}J(Y?67><`3?}?+e zyFBW1rt-!(QMoG)Hr}h^Dqc^*v?;v3VxZ5+f%~ST`8MKM42%YKXsWb6ZPvlCPZm~h zXni$?+K(H-5GDx>f|*vN(%&>}v^WsqR8$^p%tMpaHF323?&y`P7V1*36`QkF*C0F* zZ{}5}%katt43YUsbR=TztlJpJ-}2gMZr!Mxl_-s!icMemMpTZSvNFUAe&LsYO2X9= zj}>Fb@BLBmX+PM&i<}B=@k}vZ`0)FrBryu@*!6GzNWZ+ulA;Ir)bg0^Qng}Gc`14q z2dfQu*2gNhOCNM&r1gX%;|Gxl8((;r$PKZi&4cyxdJC|7?gkI52sXe{puh`x{o}vu z-yCKc-U0Bl>e>Hr*ER9hEBH{092~N$Psu?RenIq703yh*@=>sVFje*TvDno9jOaKn4aiV$idczNbAxbR0NpCy%}`}p zfrXXwO46k=lA@Chsm^hPpO^fIh^muJGFr^t5CK`AgMeP_{@p)vn+T3hz5e<*bMtk| zt_N8BsI2Aj@wnm-?pK)w-G6PIzWEx-hYYpK5sISRo`@^{^QYs5Uy$L0aa2}8kv@3i zlwtR@WhXjc7gX=AkN>ewG2M)YsZFvSe9n}+44uVVSLwqL-UKOvuvZCMhVUxh_cJ9)R~*8mut zMKSq@-Y>%|7wj`bM-<)ANF00DEz#SuN%2ov4wuM3G#saX^3Et$s^%9~#p)=kih$W! zD*v<}*FDrFzOY9x?yI2)nQONAi6uQ13w#aq5{06mgt#~kfC5w?hY|&(8og%3>3K!x^ zE9;K>LByBvaH&HYeG)#Q7lzKx6VWI}4SrT9x$Y=b=Q{R`5M9+VzBl73LviMHYrZaLmR6)*krPsalm@EIz(Kl;~-q0USG zRGGtR70yQ*N--`2eNs6Yekw@u;oYbC5WF?Ivrv+#CdDcxi~v%m3enXm?{7O*kbzft zjPJsp)x+JFK$G)Qz{(dnT!xDYNrv$f`!RXLYofUM3J*E+?OL`ouP8%>&t^_dM&&5q zrw76Nu9Qoj_v0P!LiC7&-J{_jNZ&Nn&JG&ZFOx!-gRif1)3x zInw~!`2Yk>N<&(y#IU%^M=>0)u zrHFT?9r4ghCr#6V=FNh<{-x4NfgRJJ7Oz+`v^v^;SP{}+==TY!#9}lHTccClD4IPq zqsP#EW^6ilo&duIR#gYR@@`gw74wSl?gA;8SN!Zm^y1WwKV}K>N__r{SEZ>zh<<5A zH%1?M+>fTkxC)_~?U>rNOIL6%>3=y|8`ec<-B9$_vW2Y5CJ8sy!-r$-H-2cIIep{x zq7}w5@egfCL)$Lh?Zc%;<*$F_M>?Tw{lGJ8*TgOM1k|CsBr-f%e_(>3I=kSz+nQNK6F$?DCPi*rsY>rCYa;iw^fbj(VqEVWkB#k5M6tuL zBDbq?VCdaaW}93-&s~OBHaL1^e{j*hJi0L&-F`HhCDFbdjSjz+s7aoSWf?5kw_AyZ z6m-2^imLd>iZ<%R9X`e}BsObcob_Ct2_11JuK@TyY^NM}#hw>hA;5wtTwuQUgxN_B zx#8pXyiacrU+v(--Ijq%5R6kLXalaMldk3WQIMn`Q}k;^DZ%%BA}FENb9Kw=p6IT8 zT_v7lMf5waToaF<@H}kK)?0*;68P$J;R+tIs_j*@z#D_&ogGjxF|p? z`=rNS36L9we8@JnoB3a~Ed3Ggv!P&Tu<=T3DCn;Zm<->VC!USs*ePY8?-)_ZL%kRi zyS8Poy221DK;>@u#`isSNuqv?Bjpm2lf|!?QJ3x-r8;4>6mj-Yxh_&#<@g!pQ${Z= zV;mLZuRD@MXqUgL#^zGQ*5$&P^gMm=JLtZv{FDdpl0Q8I4HI@&kc2nts&r4smZ{IY z{5fFTICa)L^bq5gc>h-cNoj2yuDx5GtS95Bdz)JiC_;Y9LxHIyB7{1&79S#?$46TPxxB2l0m%`_*>?n;;86%7p6@j5Q-8gG<=+Pz17#&9l^ z7$QG{3@bhQNOYd!l_NQUANoZxwfIJS+4-aYEFP0_)v`l>aQZD>Ko&P zA|(2~XYBtn*ZLW+hNf=un(=ZT07C)~t3mMX`I-aHA*ZkPz2xYHU;C*H*{WCl-}Sqn z@NpWV&I}m5p{p207D2LRV`AI-IC}S8JecyhSeSxgXHNSu{DUWB{kOjFb8ost-Rd9C z>+>J}fUoP}bX`vE?%(-SoU1yz<`lY&P%1HZZ1$|#IPqtJylOZbs+KcmwEyHrX?9xyY znH9EDNs%fqfS-zOQ}^rsgbGj5#gY0QF82*rq?~UXTpZ>u7<>?RRPiedQf!e*)!Hdj{>uB5J`^wf>IdVwU;dzIn~jJlVIx>8g!5THbRrrD4<#DOfF%c{31Mw~`Dn^I zhLNGIqg{t}a)?zoBfNXU^3zqcv+fUyWMtu&$?RAgIJbyDD4b@*xsE%LXQ;o&r8}#|o0$0WQ>gqVc6A zVh+Gq5Cw!$*xdJo9agijMEMXTK0SD*`Woi}Xagus%$bI6(m8}rNCjMn5XVZ<{F);h zULqGVYMs-uq4Ov5O!$37crocmYjOxmBS zvDwH?F;>0W*Z3r3QnITLFkr%KQvPnIZ{Vn`y#K2W@QwGKRik^yjzs&BZ+QN<-mNIw z5I;QoY)pLNz9_ckeZkCPsHy~~E`wW3y3PXDE4HI{#g#F7!)@Xf8RBkPMqK%hj)A09 zhw$XcT2-PLUbZmI1GEQ6Gh+?6(LXAkOWxT_{9G0Ps%CNO<P81`77-q=H@eJ)9?KXN8pKf-Z92&zxs&qp@>f&713(SDB21q>%RTHD7Cs?U`ariKxJT9 zIW*4FFfvboSE5$S89V@HRS%p6eK6dO=MM0s+h%Tt`LZ@UFKwiMI0WilrPqnAsdv}2kZAlr?4@`Dp&c1YF?~9 zqbS^UOcVIr0hUDY?S)C{^Ic6V*HS$W);UXNn8{z~nbXV?*1NHYsw<0uq2#y}F zE+8%ziUM9Eb1J$BGpnuD#2c41*kO@?u$vMQ^2N@04vhn+`;)RXMstXPpKQ{Gx4m5Ste_qw&& zm8D_Y7(s&p!^D?-T&F@{zn+D{M91sTEju=fzCtZ#l<%KD)g?tUjWPkmLo?-N2@Q*^GF4>3dxq+b%W zT?Qam*4r82paK;+Qclt%CCOApm(zSLo1|a>Q~%hc2|TiwJo@qJ)f(K6lW09F*d8fnW2MGU~XjsFQkm$C%@q7|>=lqm}v4`C%n^LD!VrPW|JT z&2dQNV|9IcH<@~*x5YQ;bm%(TekRt)__B~~wEdLxB`c-U)dqsaB|-VH3AB%P;Fy3z z_%*G+h7EPBzPH$B)(@RWpi+jTw=@+A7n-V&&hlY~+hqu^OPK^HS!VTUpof}t?D794 z0Of@@W5X>aQR*IxD-?AXJ2Ln}V!t>PhZ{14wcEV?<>|^zascj#!$Tj4j#s{}4Djf! zBit|5F9H+sAFI46n$`7I=6)@~-f=Nn#cgrC{HF9;h8G>IF2I+A!!rnm-;pkf;6*X` zB@WExT2Z?FiYWT+Xh^X(g!HNcBLov=%r6F-MNExmG3v4xwRTOUC%W*P%>uO7@6KIN3LvfOFFu#HqC2GwfZGD)| zU$b#2{+l=Mi4B#Sl_w4u_^V))c~eIE@ zeYzf3o^IILQ0Ju|Go!0>7CNG*8ymLA_WJhNGgepra$I#nWu2(FyvkMAm~N(@WF6of zOi{*_S)Dw?@h-K4x@e!1Xn;}8qi6UNpzJ-T%C2vB)^;EbUsJYzRVRAD6Pt(+^fnLZ0mVAx#W#Oc%Ds#=o`n~!lpRTxaZ|B!deQJ`kwH* z=7VNhW6y|3h&sBbUk@29F2scNAcr9f7@cB>WLlMtaj1H?I$Vt&t8|3DS{#Q${!TGo ze53P>ztg%BFalL6{VeuCGCeEA^NnBCwSH`n_cYXgSiR`Q>Dn9Z1mIy=BoV;#itTwo zOuTL4e)rwAT3KewO-wfE-Cl~21feTzp~BMQl^gE-bzRqic;&la{;e#Z`lG&(|8;l$ zn)$0M2WM*HNQ?|`)N^`3$^gSLapp)o{pkJC>7)6a9Ljkq&lE{#y?@1K^p9Shxg7sp3<#L=}skmptcm4FQhLx zDk=)iHkZCD0+p@8-5$z6UyHEJhboA&7};R{9$j|*UBB*nxDPIW^rhcUbOPu4MZebs#2b?0l6%Ifzc!@k* zg16lg<&iICfG?MV)F$yQi^FWZ)5GqUcmsQMVCY@CS9M#?D=hUrVLr1qQDVgzN)Nf5>Io5U_(fOam*2zDM(e8JYr5sZwUjAMg z;4malHnAqqDKy+4C|=G!>qT5p>mAS~lzw6q2)o(<(T@zh(>s;9J~I!v7XIPLR|r@* z;0v{Vv|Wwib~%Py%rhdq>L;`Z=fZTISB#{Ght%CowXNcXit<+!`HCBkpS1Dqx6{yA zrJEUF$i*M=sU5~lAXguz92KZ{=3mHy%YmZ6@wm`1sO$iE`b=r39Ow54wTcd;jSmjJ zH^xi5oEN8;Uq{Hs9R^u^uV{G7&~R4D!jPWLP7Eq1H@<@W7hIqZX&ufMLdBlh3~knH z<#_YXHQovmy!lm=A`wk$8-Rj!(m8yR_cA}8-RrZ#?aa!W4U7ngTXc`L3D#?(XQ$kB zeO~=59g&Q0;#K-&<^BqgKetzHrSFLnYPVqD$%Z1|hJUX-UW@nM@HgY#H~%;B?i>Dk zyzi#J7Vo+7Z#f@a%yZr`;_kkE`|UUPa4SpB#$4r|K$8zlx&YyyNXj zCg$J=C+bSo$#bNuh`#lVM?X^I473?u^lt`NpB$cU^WN;2zT^u$;ornpY3&6;+gRn= zILQZt>NiKTw9k6Nqio8?C{P|#(ByM7N8bAm zBczU1U+ePLbiOMFU^_S=O^Bp^+P2ac)!9i!I2J7-pxPlM^Lek+_1EcQF{-_BMcN0| zx^j$__eQ(C!;G|Z>UUy&^ZR~5pEj&kYRT}nN*khCxF#CC7sWUeVhVPMqRA-yrSW?) z0cI_EUWUj;N=^~QzO8SOKyzG(qbHt?c1MwqJZSiZ4PLI@c8l(b@8q`DyHbMUgR+=? za_m(6@UcHpekn)s0DbpvIxd@eLn&<(26Qw(p=?$cKjv>}p#Ln?gIPz~5Bc1mH&lyq z;Kh9ax}Gn{jmkm>X1ugJjyK*er6fhCa|~8b$IbFplG&3{?~kdeP=+N}!W+Z+;9h-t z?dG9)&E_SHFxqSylJU(U8DF(azZf>}=WQj3oRM4lLC$qS*Sj*hUw`4WZ5pEpC}rf5 z9@#OQ?jOIDp6=xaei{!0$MeBlJn78Ou#m?_Rqe|Sf)~-DfQ6H!1yjVvO|Mrl-Dmo{ zB5*kAHpKqPXX8v) zyd^>tAyW=t7`u1q$6e1x)w^DGZczSjo_bJsiBi={qX9liGyvlS8~4`V7Mt|knpR0| ztNPh*o=)%J!%R&7cs}0&RW%M)-{ZY2TE*?rEN;{B&KN81iIM&b;+drL(G>~X3j-~O z_TFhr#7QHjY15x(Wm6ojy-W2rq8f)|%habWW9Jp<)MDQgMgWOpj@I5Pqo|0~4J0of z)6&iH1U7OD5<$XwUn*K{$l5Z-dI%{g_yf%BwOC9D6(-KK4NDJ+>zHo*9aLM7YQ6 z@t3PVlj`NstZtD$MZU^MqCU>^W_gGhy66JK&H#=(uvhh6N%@MH_vx5(0D4g{bMw3+ z3>=d!>Xg^(dRYNfTED|_x3o5nRNtT{l9pJ`B2Anza5!UYXk1GX^@ccFxm)+@!qIVm zH=pl<=ef=sc+L^YfiaC7Iz029FbiLJe~v|1N2+(m>C(0K5=bnLEmyuREMih;`wp!1=Cy|Nc9 zWI|h3G=kU>T&hD!CUl;uILa0h>Jnyq}5{P{&C>S9RR)Km0JbWxU* zcGtG`@%P?vm9b`%op}Jcu_SS2`rIv5%Fgq=fZIU*+4(}iP$cbRF%NCxFJ1-H_l9XQPsYawYWw`@=a&9$A{vMEEr34#Nb_f zT=!3;MBaTT`6^Lr7rz8!;1@7m^(^ghxmg?c$Z6PnLYhKl!vWBmU-UL5jWZ=Gz0FkR z=BYoF{`?c^^M{0ksv_cR&0E+H=)M%t2FkByyo8NvmN)yu9X&a2rC~vgtOQ?*)5APM7N&18U>=#sk6~Ey z13Xjp>rtPQK&);Q%DcbakT<11Fb7`iJr!j|WDvS5mkaNBG2reDLDW~GW`;?G50v*( z+ihBbi1@uyH4cgBt&$vpe%mX>3vt++L15JE)ybLZ@~Ozodo*Osf3W}oB2oZNH5tSf zi{}cBc>A88jOYZ$7+YBW){B1;&z$~#{H5!EQw|)CT|XW<{*8Fzz}LlR;Elz9 zthA?K4^FLm|LmNxQkH1PeUTuFX69Y>X{@p@j#uw8orgP5#76Nxioqi*YCn9ENZgB; zhJM4(?3wtj;FF9fwgF1b4;HEn=ILv$Aj~IofNSi2#dF)5pO({n$VRqZ-YRGIU2-4` zv1{T#>RK_%Dw-)JUPs}2p;V5)edmsN?MCL>xTloW1O8LrR0sFe!Tg+GTA80`ou58W z#yHQL=T{yUXX%^~s9*Z*qn2@Y+oIldJ&h*d zM@jYyvAI@_8%Bm>&xj(v#z^d~H=>R{hF;xHjH$iPPK?EKV-xZ4#F_ZUsnf0t0}TzK z2lD3Cx2ZAb2cWas3%bD3dHWiY5nfi}6)-vN;6~SecWXCc0S;(xc!q~4Z7Ui8=NHvC=dLcpVX=JSMa@-b@igH!)h_tJIR%kgX1 z{~hPa^zb=jiTYkkKW{d)nB8x&WqJ zw@rOYt!W!i9+kY%2ADofl{ffPhRoxM#`bi#PW`F8?GqxDIxAuzL>(a<;RazIhc`kO zhr~d|I9=YS4yO62VsAXwbe=SF>|w1YWCTc{-^_q67cedmEGeC`7yzLaK?jZGBEa)A zD?%G_c=#RB>a#;wCw9mPmwN17t9#&>cbE|{h#*(8P^7I(<9M}!d0JMNBFGqApi(Z! zJv;v^Da0*~f=~|hjeTogC%H%l>f?|9GY>D(C)UH1;T^F&{mPZqY661VElYu` zZWMZQDick|sxrQn+o5I*DGJy)_2uk-Y82}jP~J2*WYAt}{IdGdi(O;Cmnn^9v>*P< zVF6l#xA}nUhlYMycpvsq-1^qnq@oIOqIPTa%Ig&mOvd(!KT~`xWh4vCD<>GWstgSD z_&c{<5!Y_1xhzq@zsT_{$U0)aGmn!;ziKPz+|928;3l1?=Sn*7WcjVc#Mi&|gQM|< z14oT#k4j1DwGt+cKiWWhEcKz6hGM9~ zoU`)j9Jr{`i=67VUtj$mDsGuT0Ol zUFzR?Gr(Cp-Bj?y)B;O@2kL_-=qnppZ~+r%=f-qWdrWk$Cb>)VpiC(+>?{1~8gDG< z5j#SiqIgNCHb_*E0ndS33^sUVnt+lSK`q+2VH0#NMu4{5$GL+3{HFG#h?wb0oGnJV zxSBh}?3VRn<5zUQ9K-Ez#l|MPXm!1-8Q%p4+$QRV+%~9-fSniBRnCrkE0^@z#oI}9mb zD~=7{8&iEo1Uj*$d0$kzC$oHRkrYW=3?pX<5B&n*Xfa6gmjsSu1eQo0s41#{?-f5A zTWcF6aJsXcOnviVeS%YwB{%`eAr_h1@!*0qwHgrfMSCZz+v{oOlv#@@}zu<^_w1|W#^e$v#0MP^ z!8{K}5u>aUFf88l00T>Y{litmIZEXZ;0;Gwc;Onpw)u@xbRC14KzYdrKd3!ktk{2)$7;<>(iP+Hn zit?!}b)3F02DA@eWpXR6E5YeVc%eSz#_I)o1Xnsg|Er)E2k#Q1-%@WXhB`0Acx8_o zCd4Qb7!wle@tlyzl72i60A&A%GsHD7!qX3{oYoAJUq6 zU8mZiUq|K@Ock&8D(y;t z+>Q>5!}=xFCn0b&b^&m-7*Ksle`q(t(~$oZ<_|{!(V*OCwr$L~9x{`@*Ze*v25A{p_g^Vu> zk!LwazBnZk<{@xc5#Da!J{(^=I35!+m?&clq008oXhc0~Cg!uGgVfhzTsb@xKeu~R z{EfZ45s1IxTwh1AK2)pQ6g|NUMt6UcW#Mq@7@+)xOR7Z=gMvI z&8xS?Lwk0{nMNh95UxH{Z^WKjBOV?GcbMVHO47fv?Pp@B5{p5kh;uIcK4b%hfDca@9(z?m+D|@paim}oT zT^W`RY{=hd6o*lbW3jdU74=7bRaszxt}K>v{^SIFQ9gDHa-}?J=$kfo6eVByA!zl) z5iZ9fTB|e?hwAT@$5b`O%bj*?X@An4_uPp*Rdz?>9YDXFf}64!sBB6%(ab{Xw9%ig zWmH);$mb?fEnq#h0kC1r?kog(RA;W1Qf8RgZRT7IzZ9|3hY0YlsEK2dT8z+%S{$z5 zqv&9bGIe6>qya2?HegH;ukjj zLTs*Xwvd8t-s3|^|H=OU*>p!)i{JGi_*b9k*9GVw9x(0kkASI=6ICMLehjysj*Xo! zt2I&@D0xAz+=)_$1x|=$FOF4ii}C99p1Wjzcti%fZZr9ErDIIjT+#wozqH8&g%0 z{aT3vnG-U7J$rU0pLl-YS%yP>t~T`8-jxuL-7&q2(KMR zBakDW>BhdbwfMQ68{_&lb?NOiO3?+sye=Zy04qc<>Z#jKG{+p~;Wb0?tv%c0^VjZ* zC$_GMm)5V1#-mR~_4`klHt?9E8`pCw0AB$d~ z4_-T;UqfO@*YmC_n5Y#Vu!F86~1KuoP`pBCh+3?^9%Y`HG z%7*N{21RsqbV#EmqiI2#WLA8HgeK>V*Gm=Y^2#Cg(^uW4o)-0pChUUc(G2~12dZd^ zHyOpi$g@WSI#>0HLhu%S;x#24cFR+ik2XyxIO&wczk+giJVv`uslJ zsCJGCIf>|=H_&ey3R)QaAp#>><>GP(@PhG{JU_}f$7+JwXoBf5N34x12TQaaz*zb@ zmxIThwO8k?`AuIFSr}kw1PH<4eOf$27~h7WP>cPwcMI?9Bs`tiICWptdd#~c#A>r} zmPch53vvU3LM(}q(Jm-llwniH@B!Z%suqUgBkO)XwpF$$HwFy@R*3)M$Uhdp=o0P@q%AsUoVkVIR*nP;Ef7W5WQi<=18+U%>#Y=hu-AoN&~t6{wAHax|x8DE~i?9E<12 z*pVu|qS*F=mt;^k)C=*!9UJ0p8`tY;VVt2=@QMZ&aESa+hnuZGFDWwq;p=6|JkU2^Wi8=PDxqgoTSEPEw@o%>(^qxC4ST|1qxr&eOoD5Kb(I9 zjE;0$RVb=gGiNM(W=UP(-~r-caOQy2kC>B;(uYKA~KqqoM$MzycL`DRa*jguMLa zKpGBAK;&VA>SOSRGNV7rCwU|!)&8WoRo9{A9P2(f*D)`#U1hH&BO77v0j{Rr^t)QoPY1zu|9rd z@7B0xxS`5g&JXw#b?R@)5ualmxBHJ@e`Wk{@4P+!*-ySP9@x7xj*bi&KOcDT`*G#J z_`Nu#sJGIRd@5pQi2~200>K^p$2Np0`K05B$l>GZd@BVj67`*8b#%Ulpj|3P7ggha zG47a*Q<5LiSH`YDluZ403b}_%M3hP%8m0S67;C18>~QLTN%*nxp>XB1F@+jB<`vbP z|MCS{3}u5eaF|A~cn+SVrPRld+Cf{XKzVy=d|BRs7f)GVD39*4afjQiGClI=I(41C zh_4_~F{2T|A@jH*qROL>YBPP{VU@8^g7zg0w#%`U`#G+|sbGonGxKoa4KN)}MwSME zP&%Z}_9mm=dnqPMSL;lTm6ttPxLU^g`KWl25JLszT^wM5Y2qewreh%-Z-%R@30@>X zy$B*b5%EkK`fNs696bEvXT=0!qA3~4iSm`vEbWk&I26_H;=@=yD^4jC6cux)#u>~D z9%x4=Mtjdm+3ytfhhn01Wz_pGDF5UIa!{5A8w35$7zkK5;RHO|BUW2mN{=*u81Jpz zp@?3Notl4N>kGnxF`np<36?$gOzE#G2={5uSCOy!G2D7e(JYa#L{DwNa1k9tW9EE` z&K&vL`1WIS^Q$q`eawm_DQ~MaDJY~Q3G`xspf3kz8()=*LgHAdM8qN-SA{zq8!J(; zsVIf_eM_tvkb}hPXJm~Cq*AO#^T*c3TLwS5mGS$ak@bicd^m7@8iWhq?toGixFs#SWW7T!4N;P^; zd_#NARI2eix4u3;`kp)E6E|EF2i6WrhKjM{PXjVed-E^5{i&l&k~&JHqS{& zP;A1nXk|PqewDFiF1iA)b#7hDNQ|B+7V2uXm(D34Uq(vpPOV8g*&kvN@;p>7KBvX{ z11-%&XQT-#edyHHx z7V{|^+n-Q`eB4Ar@JuXqj_$nN_k>?5(DhfHenJei(L{qWVVG(hkIj?!OChrpl!z_H zL{anoThL?tECObFG4Vq03B%|%;3@}$#e2e~j+n2=m<1$R8Gg;2F#A9`7#oC_cMt7; zo3e7cbZll-hJ0?Dp&W!Ft*A`Q{_*-h))Cjs@sX*2=(4@?vR{#6V1>Q#Bc-s^@csFK zW_g?Ndan(Bqw}~7D#llQYV8Z_re8;1YBBS}6EeQY_QvK{VtARG#hhil=0H+zXG2c^ z{631szd9$O9KkQ(1umS+*kXuLe9W&AbyjVpOZsJ5R@Fn5kN(5A$JN(V+J15@t~frar$j?_ltE+fnJk=m%2lxA_*iT|e#Q#RN}gZvCVUY|`tuy>GI;XX zsA^?3vda=Lkk?aAEW(lz{?dV|`1-N&_#1mSL>&zbbj3~56@JZ;Q}{>MPB%*N`)_=0 z{JS?@A7^S+km8Eo`268`|06$)_dW8Ap6SP5oH!N#$BX+@yOeUskNqpU58j*F1< zvDmXYIBHZrNB?RktA1Y^`c>WN#g56}&EEA#`6oGZcX&>9ET{aH06J+}N65%|Fc!Ik z|8*VNcRSE6%0}dCd8e&eery+gNk%Wp4t>GE0=aI0CN4{5QZ}N6zEBJFB!&-1m$nE8 zmN#WnrdfDEX@Vo;G#N)*5&|dqP+15V^EDV2Uk{5*N75c$r%cz(h^5-f{JC|Mj8~C0 z2JDE2k!MtrqVxy-d!+iVOV0oUY}SDhX5mnwEQGKyt94&gI;Y(6mAof>$wS5v#~M=1 zh3m`&yhcHP0p_wtdXLAJsjqq=0?XMYaeii+kr#oSnQ>s|drz2;T2LO$NZo9$=QgNW zUeK~aZb>5q*)fc${?Z3N-^I`k%!&}=>E`qQ^vw}0!ick>ww2X)?sNS6)sLD7O5JY! zTt~)Onws|tG1C4rjf@1(S}74its=ZM^b4wWD60KOy)7s&^@B9`#fl@5iq+?|=f$B9 z>w3h7)>mSv{kVFbjNd}Almg8a`CQ;ScX&F_;k@8hzZhPAt-3hQ6ow75e;LkYib8Hq znc-d;-Xeo^dbXrimnzZvdvA)}8;WtmOJ}0dY>HtrWvEK2cdSu~$G5JvVr22wSFavb zo?7f*KNS1d*2M>f*m`^-b{-pxH$8nQ-u&d@c+)e7RR+8Y9aWo*ZlA?Dy{V+kP=dWQ zzlK4^7?t@-nH1=xXk8-@eMCRN!}Q)nNO=6C8?K6f_Kvs4grZ+AVf^3s=;QI;N1ltf zJ|knRwnDFe{rsW$q8tR~HqA?ZnqpEpK;qAIXCXQ*bltQNEOdVwEHAPF>Zf@g+^9{@ zkNmRwSczTZAJebO(LHd2Q6oY%jfw8Kv5JtFPA^)eZ82Hio-XK0r8gEM?PnCN@739` z+K;X(Mx%QmYTd*BTy3|=*S!<3)_eP--c8>N1~7nt4X%JbO{tEl;uWqBOjLRkUOO>X zN(-vcR~Y)C_Q9z2j(8Wkwjxj5FY2zV-dbnB9Oo-k7VAk8?kb%#(z7b3sQl$o;}jr2 zBelF%*e(wzoVuKY>c=7BSFMMZZZo3?*a4!#AUnr?&k+WO ziTD6j2o{!(@=&MQfZ_O#u|Zv5xsKT$g|%>DS8_y>*-@J{I?4hP#Zl$lFa zguU7$BrlBo3cZM36CYQ56OKJR2VLj~?S`iGTWxu6&94c+h1fCiv1vhF43<>T84Q-g z(cE%T+=&;2(>%dr`sIBCe*GS>^3Vs2Z&}eV*D=!7?6^^=I^PFx7>=8_Cr1aG(r1Q- zafEEdvUZo{ka%UP^5ATAz>&GC5c}6O;^6v`_}=#6cw+0;cx>DHcyVnb-tmJMKZiJ4vX)Fxfy(~;2cipk%y!{Y^HI1KBTaUF^*dI% zDcc4Z!`X{!=WuLoeJT#u-xck`cIz>yzrOXI80kFX-PU^j?dBc&vabD|Skrz)?LQl@ z@F2Z8UAZw%R^DK`z-z_+i?Ox&=ZY@xjwu;cgCf)Q&F{u=_mMcJsB^NsHSv&ezFy^z zbRLRR)tlu2+~oEkh>iB)*wnn=ZEcpwuVPfxn$EZU{pZ7#_e86_%`(epc1Jr8$GRrN z|6E`dG+{(lW$qQf^Vva+^bzsiA+_yZ^^y0CrF}2-9Pm<*A|$0go{T(=@>RMf0+xy~ z71yat&j`^gdr$aM2E0P%1<#17l9vY1Co~ycfKn`oF~6(G1Y;xxpu3J%ZG2&q#Q^_O zN(3pzpuubd?+LRMzutXbo@86)M35^*FA5V1(_UFxD+@I_e{G?NGvzuM z_SS*>{bL{Zlh)*-qm?ij23J0bm66#l3*~~=Y=Hj zi3?r|KP!XN667S=`^*Uk+vKBW9Ohx};z zp6X0SRdo$K!!UDx&itPvU;QTIn$5{pS<&yI9aX6 zM70+G^zFCCzqsq>7^_!f$EnHqd!PGO{QXZq5Vt(@VysbJea6M5hYze7jlaKdN4)g4 zAL$f@?;hwr6a#;$Pqcjoml(XPud4v*t3SwuI@uFVWOXKrS1EeCQuhi`?VXB7Z(Op> z=$P^#H*OX*2N$c=vIOZ}VAUeJux_QL=+rgJfiCyYc*|kdJ9LU`+%_qJXmk!mUAlg} z{2E1-icT5PQ~&s!YpuJVQnP+1%%TH0!m*oDgiT_u685Wfn=+7(`O8KuG%?ZZMs|&t5Ww6pi+UnMdpx#J z@)ad{RC0@WE9F?_z5a5AJ<&{wuymdG!Psu>6%SH!q8}!b6R{yq1#HJ3G)rP``t1b@ zQtU)~?4*=D&BcMaRNiUyuvBJXSv|UC{BzzYoc&7=4&5sTTj$|!GruB88(-yJDcBH7 z=uBo=-;NTrWG;@V#XAOBfRRn=1Q#iq!7Ij)VFdQ|uZVxq`m6EQ&OQlUB^r8ev{j8= zu_1n={qFeZ&Hp;qGKGP`6Ry&Nrls+-Qm~Go{c1G|!E;Wa4TD2})D8zO(2i|N#ls%a z5u6KtXB2;e{20SY8iYLW+=TIUekrzm-Zx!O*V31c^a}<{;?ENNQ;y+UIsVF<8?i+} zBs)gY4`^itBtAu9ISB`>$fy69TWCm>%$yngz|MF)gPa4&q_SmS%k6pNQwQU(eg5(I z_y6*~_{V?vl{nR?#ozy#+v6X8=oUrEo0T{52!MOm>m+9pS)mW3lg;?MpZ{h&wPi#6 z<)3?Jd|{uAg0BC!pZ`YO_kaG!c;ELPixC;##BXj$JicX9eE36mM)OY|jEXL$#b-Dn z`UMx@M*KuMY2G|Ra&VB-WF)wMKEZlHJcRM-m5cF0{rz#Y{xN{2A)n`BI2UPBhqGs2tOlUfKikSMLaPRi>q`wbq(WH zmbdk^jufHFKw9DJ85l7!z~WGrBZHyqO4%_4j6qKG7L&2H^+`pfEOx6(kl!6s#f_Pe zpqP}-g8&ny7HEScWK166>B`NH_Idx+3rkq>uKGOW%mYNP`k`vqF1}y|_=T~9BP+*{@UJ-_;1@krRIZ0=3Y@oGeW#-Abh3Oq7qYtUifw7T}sM@ z#c}{fh=mz;rns(u9_d*opxEbA?lueq*YkY2Q2_G!UO%sEdQ1nlVDZR#% zjE(1jb&u$Fq*jXGkn!C%%C14;BX~%Cpe*;s_-0apRmzO&hz_nEgRIij{}lVGKG6%q zmqxJE7UkzFLX2s2B;(ZG?@p34M#sDHfp0$<|I;6QCH}^re>c8;<(Bx!N8TQvxQPW+ za2Gt5mlt{-C#US_`ZquS_4wES;gimTPF&aQ#;Ix}+OUQ7h%QS(|LKj_#n1oc_s5ox ze<2zZE%7~aW;13SIq4W&(6$_xgLoy);C6-%D+T&wJge*zmA9(d8(=2&Sa?+%S(?@D zZ;lhiTa=MWIdI$&?z8vmR~gI);8Jp%jFVD!4@kySjF6+kPClK=re**?i?K_5#J#gX z*SJR>^70Hoe?6)u07n3U8hQLhxJ*a-nGAf7yl%Jhs(ne-WqF)8(GuVuqm5)4tQ)ro zo75_ zL?m2dg)k3gNaOew4yeF0)qOEh-03qs$6UF=1eNZ=*x3G-91bxA#s%g=sf!VctRh|l z%&_vt@aQpg+2TOsuGnp*PZ@TPtK4!NY5b%dopnihC?gA7Rth~aVXs_^gN^sbsrqek zx^!clsNLlKSP$1fsQPLWAbHWMi+2I-6}x_hHj{wu>}`lUTGvNS#<$T@B&OfG@KI}F zfJ2^TIYxEur^nxH{2-8yzA~q7bpgd7frKa3U_5g#!~%D6DvD|wGzR0)A_vTst-=!U zauvA^Yi2k}xskwdkcj4(^F_UIFQsH`NzRiUbG;&oUY1vAF4f?cH1B@BZxF@sHknXKerU!?FJH=d;M4)!w|1tw>l= zFmv7>H4sg6T;?=!zm;-)13u3HHy6@j|H^wVh=^lmz8l;=a zWUMZ@J|AJ2I1=q`z+ejuUBU-?&7k9C>=JO8Rz#=w2iu1p8?0Eva@yxrXBXI8i4kDJ%^8#*X6niI!^gJ;tkI?Q9e;L zd6*{6pxaNI)qty++Aa}5(dI^&etUxxonsU*!X+6QzJ|fqVh&f{9nJDuBf_tBfRI-> zuu6~5)j>SA*kj?)n$GuPZRe5LIQ7NYGI^h(he;ttB+tBj5528fQa;1?Tzvhx6pi5h!Um^Qmv&8 zakBhYU6aE1aHLe51uY33L(d4-p5Df&DQp>%;^DiSHF@?J)p zZKYRy=&d8KY?HzE%4Qqg8RJVdeC3*Q{H;6I#!j&WA3U(aRatiC)NheNp#F(2 z3T)}N&NBMxxPn5ZExJYw3|Oh*Xo`oeNUg}=e+)7aaK$4AJP+6iOaA>9fE}Dd{KSu* zi+}n1pO3dZeKh{zd+&(<-|aHQWt1MA4KDaTl3F5T{F|TqYOI^=#XtK`pNT*F7k>~x z{`gDr+3R-1-}$+B#22pH6~jl*#Fc;ib>W1y+GONwGbF9rcGWl=9DGA6m(crZl zRzhXJ&LV_)M?V-EohKyQ5a&uB=7N^`O-3)#=t4}eWnjvU9j#y!t-E3cn1)+KxBLtSH2B5zFOCukGp z!<)*R$r?Y%32SfA6Wk}dW&Djb8OU+&1gJ>PTz-0va>0MnEqv7p$H>=}pR#(T4Ce$A zI;YLW;%VI$o^<(=TZENiVfr^UGXa}*)M9^3mao>C2vcTZ*7XvS=jHTGDKiL1!K9~P z0;U}B0C|;XP)IIT0@B>8h%SxdS8rex-I|o~JzBj@8I;#XvKO1$e-sD5tM445&T-^&@$HJZxdb2?ppy*$KCsl7yn7D6I-h8+8jxJNtR6+=rbq->ZUqLpS?=&R>;^)|)N zjo+&K@Prhkl`~03Lf3eQ+2<<%Ki9q)FO^PY&o7Oi3aV(|6lB>I~8;zg8sS!1i z4Fv=WyoH}|?P(*?!pcgWV}TvIPnVJ*umS@IN*pU6_?b~`;3ml^t);u{PDEK4P7E+A z3?9MI@LUNa$Gd*;c)aKP&&02M<@>SY#8_2|GeNY19%B>P74i1YXu}D;wi>C z;3XQIwZ!>X3uuRplbD0m!>z(Dog}%f_Rhpe`>7bKUL(1wlUWVIi9QgG&f%CW?Tt=p zjV`ACReJ|@@33`&yJh)N58!w8jQM0<9pZH-XAs^ivJpd_$Kp(FpLk%M%R;x*dk3UH zu^rc_eQRtdxL2o+-XXPhyMj3uVI@AT_Rqwy+B#m{tG14c)(NlV=ar+$GK;*1bPfEf zoDQ!c9nq6;-h}#crGjAf(L}-U!W$}EX{7zb815c6FVKot6x7uB|! zXe$yHR@K*RZpjE^P!Ep<;j8K@9<`8g5fea!&u}F3pwI_s_cz7S+8rVi5s0qKq1fEI zFRGoBW@zSnF9hISnj5k4DX)1E#fh6 zB;fCUW=2nWXoWDQ3@8rODF=h-7amN*PFV&WBdZC<=}%c5qpMb^WGB{QY;X zk9S@pg`&Jf>fW!HGI2iC?tI8^=5;GwP_eiVd;)M9L|YO~o|XstK|f7oVL=WcQ3_iY zrh7c1cIuaWJuhDCm``1a`6xvgCXC?LXAZ>w_Q@}L6OiBh@wdlgo1}DgzoG`=*o{t& z$N&0=e-WR*es{e0um4>9>Fcjm`JH(G!;i<`ZOb_Ctj1eMs!><*)xH!sxDkyi1$Mrc zJ`ujCyWXklnsf{E_iCVrtTSADR71JIFpysda@q~T-1GSWM-o&a6YMVz9vSAxkQo)m zBX2f5VO|3_@I5@@5t!8m)#>dil^B`pG0KJ~CZL_Ek4c8oW$~u?!;Yr-&I@jJEwvPf zjH$>JMRG<0xW+xMl9y+Ambvb#>gHn)@J$&HxiF=>l0#kR6gFc-B*!)~>i6CmO+o(< zt*RgJ+jLuW4z5{~V}8r{%%DSm8(D3E)=YV9Y<)@k{bZtnow$SpoP&*W&Y?deVV7P6 zybLH7Cgg4Gw|BxCUR&z^gvR=IQTHdxH@RPHgk!f5<3dAGV(_q?6FrAhgdn>w!dix(=|q{TCqK9H z&(4V!^6Q?v!~m8US}yo=j#5)H%DV278Fs}bD#qr~q4=d6*Tmh|u8AS<=coSDE*!8sIP7Gi6uDM< zin0{}cNGD<3;_{sP1ku1sae{b^2?#BC|V!tKOwuKNV>3I^(FUZxO2o&`9$d|IfyC3 zX5^!;GO$Uevt$)JG~9bed@&vkMc>8#p;*`Yq4eqZ^a!JUxDt}gSDFF#u(G0oC*H{KZRF6;c2?QG5EOjd75zH~TeC<*{}BvO31M$HET@ z6pAcGOoxr@ED#OfN3ma?<*gBjJ zJ;$pRzVZKO?>zu4xvD$w^YVM0bNA#tqpVR5NCJd}A`-SiPB>s=8waqxYwtRn^owlbiC_!{V`FfT0D&?>C=2DBMw%SDr*rqq?|uK@xm7)_VMb{fW)O2;S69`I=bn4+ z3Ab+D@}kv#=U4TH(g%y2XwpFwdI=h$csNIjH@fDCl`oUX7(IDiH`1A4Wa%2=l+{3C z3N@X~`IIx$&~IJcY42IzZ427Tr(|lYRE=<@N?tW#4ALgrq9FGoLf?dTDxJn2N*Wv~ zglEPCqow_fmU5<`P=SXdmV&qD&%|}OF{XP`;T>lfH_Aga)6_ytpc{V;g50``gf-RY z>Qy^=_b%%wR_#-ZkF{ebM^px%xswN5soF))ykNsK1^dRzrS{e1*V*FnQCqQVOem+V zRqZ-9pSHERtZfl~Q{W2`bnTBvKwmguID-%PE5vE;IKjYzeJNqUujb$DIzILV&JUt9 zIi=#PQ(iDaKGhtvLT$TGoAy`kvs!}>)hJmHrF_|4DlLTv>9UPc$$)LHe6zKkYS*;)KQs!D%tS}g+G*(wA#+4^ zr947eyy;(zqD_b6 zPFODoFnKJ90Cp7F-g2o1fvk$O8dj@`0dKIJI#0Hsx&iM2viK-fMh3{C1sI6cqLp-q zzpR~1<$T&AnW$J_`D;Gy?9V@W6~`3}!dgrh3#x+%{#6rI!ytlE2yi?OENg^i@OBOi z8mYVuXDgLxUOzZ}yl+&ngm65yg?eJ~*v7V>(0$rEs}HC> zv%YO;%>^cc5aEe`$^K(a8_TS;vD}+oIQNvkIrr^f?orUbA2*6bh6!iqdnv~l;0byo z7S^2I$mBdPEMBdPa>i@VA{-RWvt6c`S!t|>N%+OWZ~Sz9t% zl1{DIl98ef4o};X;i3)gp0=Yl?Y8#mvWise;UCY6SPu%9zTgWyyi*>3_RYVBB^037 z=X#H`Q>M1ty4l^9km1gI!_eo_%id+%R}{=TQugByK5oDMmAf5ZrSL^UnP$ztAz6LX zMA0T9Hmb?6V~V#f!x_cMegwWd7GXjLx&*pGrzj3u2}lzIVc~Vam(nLr8v_d1SJz|w zBvrTKlfFV*2$5F&!RswN)Aun%KP#BeGh&DyDF43_V3@k{70nrQP~4}L370J6*)$l$ z3oGN#a#$K>{u-^W!X_x- z%ZOmA9EXB&jgyu3>1Q9?-)jmO288LtR)eA8)nuRV9bHc%+yEF`1l51P_s-{x-F|2R zoPd}mFbzTnm#nvVqb#P~p_A1?jx$2WFCyUnV1nuj-W7vZ)kOl%_ng+ic5C!Nz^75w z9@R6OS!LBkr!!-|HY+Rf87Tv?D^q=>QCod*iBt%=_?Z^rv7mxhKRkPeEpGM*SC~3s zU(DWZ+cKlNX8`+TsZv5?&%wXf4b;l(Q7I|XMnZ-H`0+vgbk=s{-Y#D3Q3~M~)sw1^ z*~0Sm60WntB;bMpGMc@}KZN1msdk#nGH;AoclCN%?B%H4!BfTvLV%+{T%mf&;W|G1 zv%mP-(!gT}-ZXCOpWbGtKDINYgPve0e0?p0Plbz{bkA#g^a{%OnQX63 zS>8@BZ5JM*gXsLNz5#pxMenfYpb~YNowRM6edO7WfkNrBsfq_p2it>cKVh8u z=0yICSmmlf@(Zzf{iYTw65PNS-02^%@mKWZRCymL0psa=P5}dRN*F>*2tZo)j^0_g zMAvK#KnSewWQ`!cj+o*QL0~RkZeRc+kYv5qr);o#ljSR8dp=5_4yvaS^y)}409Yfy z=MTn%0Zixf{LY_kVX>-iJUeGn;dG$2$IOV}fJw0!`Px!7%>Whis!rcDK*HZWKV3V} z*AavPsBmbusLbFw%QK+;)S+|i@y^{d9m-iptazDL_IrMwRAG@4=CcYZc^*qTGWPy6d#p7p z&O{-J&)k!dXTqy%2%GROH5zC>Vt|1 zR7J_DLfDClq0hdUiO4uy+3>XKGO7doT7>tq`~kLb6#aPT_teLC+MDm&Y!}?W$p(g} zJh8V!{T_Qa%q&5RM!jm=lAShF&)Lf42;^3E3A=jLO8cXW-eT4xynB+iX4h`}AOCcV z9sT^2Kf{M9d0)VxyT@gq3F%Z5tSqPgC7*ZGm z@E?SMy%Fl}VR=U>07HhcrG9|xTs6T15gosqz&LkY1+iR?$B`Qev_ZTH%x^1313=Gt zx_J=f2qlnxPac5&g|3uIeg0a~yfohbsuLr@`z5;exTxH@^onzylfgqiAHnmgBMgY; z4dlgHX{7lI8#7CUg|dUE9LsRRZU*2;stX z1RYD~LqtRcKSdwH1DwNIod9FV^W{^3*~W-M!8LRih8AMi`$_`|F&u6VF2J}5BKN2m z7|o1?o!EXz1H|74Gx%_c0zxG=Y8JW(%yn z{w?M47TQSuZBFCv@h`8EY>q zlKv;JTIORAgAzkyGL!|_>A4UcB${PJTlN~*PXS--t_n;>lvF- zoAG{_%1zlaDdcszlx>s(o?=rG_?Ys=k5mDx(JS1~!Aq`5Fz-GBh3+2^=t{sdeP543 zjXGz952W-}=*%FgSU22At80J#3S2@d2M>Jgi3UQzUmwyPyz2yaFPJlO#nmd<`!8%! zN#`@hX%lI5cD@T`#=IUtdEKa1i<~AQj{*YWDM$DyZTa3V;|mdM~me7{?b_;mdmJI3{`}KDi5M7Ja@*ciXTOIEwbeORTIHf zA!C1g`8xaD`A4}j%%+k@~57(w{G9)RfkulWGDy+K3YKF1G5Y4 z)^6CT`qUe2ajA;y@^&kt=hd?%yNeGw zr~y@;5vo|u^cmh%RfaZxC>}AbAsrqtfI;BA;>rYCNA2AU2&cJxxFk%gV*btZsPMv* zIUCLJC7?c)8N%j3ZKh|Bz##yeO(V;m8yRA>jDc?!B}k4Ug9R+4!-bAk`Pd}G$~%`rr=6|+ZKDanTg((-^G z_Dv)3awv`!%Dje!uyv)&A%z>SY)0u4=37PT%#KyQsRl|}N;a!9(utf3N*Zsm@(OSw zk+qgw!hYtoPHQhHUo4za!otTDyH7vkWgsv@t7)&apL?4hz3dqKy`MVG9#}IJyi+-v z(lb8Y%(cmr#f!x|Wzn&R`yn}l=Za2`6!e~hIHgxQo-%kEKgbuQp-hD}<9o`E!abem zli^cSd*qqEm~FQkx|Z2Bt!u4!vTm!(yOjVzDEw%$nzS@EZTFQ1Z74M(TAHohvD?0K z>{_d|s{b+xtK?I57eW9z^$an?t4_Byd^kMA9(FnI`5_w+>Q%?7K*_doTl}01IA76bv zN8sQAToXPOsc|=_faw_T9J=lZ9DyUSFJL+mWys_+;JYR1s3%(_`@1!I5O_Qx)Q{)a zQdq6LT2tOpxR%d1uo=Tu-r4&3Q=L&!_eLG4iV?HVPD{tztp>~ytSFQH&>=L1l z!f4P(o3?Xx*|M;Q?s13>1Nh$NiMQ4*N?H**;!kc7;_Ei{=U4_cDe7@j2&%96}DMVscyZa zMZ5LrWyYpW&2&>rIBhq)X^oxx;1=r{W9L2nF*AVnQ#mVAS?iVM^f-!N;h>;i5|XHT z{V>K{#sU~gUIba^{<{%JzZ1C+@ZG^EQgsH!P5&@UlCcpf-%6?{+@t(?6sP)lETWE7 z*@TgqvX2~x;=l;<*Xrma`py?&xrG#gB96cjI0E|zyiI>)gc}Jop8}M!+Md5yLYEJ1 zOQ18jqHUL1G)8frY#+Pu1g=e z_o+!ZT$EnN;tIESgAg7wM)?R&H!WV@l z!K-9=r1;Q?#PG$Mb~(un%hoFLd^bpLG8_@G^5*RFnr9t_osFAsvvEM~WhG`OdU7mW8~??O`DXb{7j|GPRR`0bgp5S|He<-%wo~CL*-)YsK46PzQ6me z|FE^sji@U6G|-XFS@1r$Nb!DbM)YI~z;^;`iX_nrX%6VFuviI)YpU0E6b6L<0X$BM z)mP|7inwkC8*aV8s_fPzf`s>N6@_qDJU3p3aK^Yg0*4ktUoc)m{~S@kN8kv&24K1p z-N8a8Us;ckixq@J&L0Pl#>Rl%k?Dz#Jb_6=!k`#s% z;w{H5vj047ncXUn*W06V0d$#v(M8@Jf}JQ{WvSzQ34CFdJX$vccS_?Wp&-5?kDuvA;g+B>RUSJjt2^Dm1UM zGStLv8EJJ8S7oR>uUl>0E+YNSY{jM(T5gn-M7)Csq(-qhORR+1jy6`f z;ERGr2|Lg~^NFBq`plPdiC2aT7hA=`7K-pDI73g;I5tE?{D$EdYB&Oi7NUMo-yBiE zN8kv&7Lb6$^JPmpRu|*xGOde;=t>#kFO7zxoYMlzORud#)s7Ta#39Z7uk=p1$dV?DBW=8zz60zG5NDpr!(oRi+b!w`pUL` zAybzu7{VAx+rOW-*gk&2(YB?p&ENX+#kEKTWCWo0`EzdY#)Co`pfGh-6BLS~)vbaO zQZ`K~U=|6@Es#Qwke+*2w1nyG3OPFbnXb+#j=GG4xDLU7mGC?T?5`$r);%->XX5<> zAG*ix!6R>$m2Ogb#SDn=LR3NA0B+zwl_Mg-AdM>#=PU_ ze$2L?&}z*d)sz*T)p*`LUobXppZ$d|TIV$1Dpw=v2eqGFnfM^U77^#Kibb1M9PO$w zC9POj!0H3kBDlw1Z#*6CG*F-Wwc=yoo_5xfX&cF1Y8CcW#w};pJm^Xq9T;)x`feL4 z-Jp6Z>P|dh3@`Za2plSKV_SU?cs6IL&bHG&q+svtu);HR;t@CkN8sBb=+uk`kOZE7 zH4P-5U$UWvZvukcBuq+?=RGMDX@X~`C{|Q03K1@CwXjvxPSId+k~ z|9$89bn{f6719z2Om9kQOO3faa8a&$!xS}gfy@9cN7*Z-HyHUL9WW{Hw^&wsG@kOK z2&HhCVh+~|=i0qyrr=11VjwKKcBQOqpT1VHzVJ%dz95UU?$L8By7GIaWuceCQTj}c zH&N(p{s9`w=e7pQX?__j>T)k!eZ@{)sux9Fk|%!W*dn`j`x-kczuRt2FSk=t+icyo z-S*|RYvci|-C3znI!g_hYRlMNXDzb}Z+gmd;DKVrfJ&fT8`dc*9j(52MBZ>keH-X1 z+*LKrrVLIoZ9RxchY%Lu0T_0bREzD-Tx{i3ZwQo<58Z{u75XM!-(iE5uS;Q+c+*B*Zil&~AadbsqMg#d3Fnfn`Vd8w~ac!~Mft z8kCd-9rq|&AdV9^&4qJjfscQZ4SEwN1@0@91^$tPXoC@iC%I9^qK=$ZPVBYTQ~PY=NqzRElNZ~EzxcRadGGU{Z+lmZefXWn+Bc3_?0oCb zcJY|`qyM-TguV>dt_L^-?Cj;6vJmh5uRzx+y5F!%VbWr*Ky@(vtaSdI*u#`qo-WTK zeHz-mV5O&672il0>7AFatkP@h%Z8|M9C8En$R%%HG;v$s>k zO{u3MR2kzOfLK^lr7q7F=zG;O z^Vf%X791&RSIRXh8b12%=@b?#;ux3sBDQ>;_B#A}E|EZCH&M- zr|wa;%Byzz{?oz%H0ly2_e=49wpw&FYW1=^;&}blMnya#)I=wcWP_K4+FbYdxI`yZ zGV!S%8%bX*l4LC{1Et2pc!7UITYXMFh5FOhU%ksG9w1jnW0SQ9D0fI7lj#T?I)EqK zby0sDc?P@}FeczqSewNxBl$CJI=vG9wxRO1mTmCBNW_!W%1BVKA-zjR`QW3$bmlvix&P^nfduD1g%0L|C7P~ThuNxqHL##w!3F2qIC}1G=fajEN zhE9?xWcZ1NUMb5cZAzXl-cV;YWv4GL*f}fm*3}{} zm|j8nO5#4XsMqdW)o=H%?6Lb+4B20O_HH}%xgB=(X)En-FI;Qey5+V3ps2bXWk)H@ zVz@HlHiDP-WgO$3tvjVhg3tz($nBpR&F>@!t!u~H>_h?2i`9p z@swI7r5qHn`h~O|4Lkd&7w!L6uD4IV^%VQqPn>SHLgA28?eX2eO1em=>|-DNvYmAQ ziz*;If^ZMki6FeBu>Vzt$sLVZDPRyPS(Ofu!mZYszm~F$o)r_#oVpvj%3n{k+1A`U zBzG|4FnIu#Nje&*{%@^6Z$0JPT-kbdkD^~yKfH-DN01$XLkB+NrQV4Q^u*$UBMNvv zIKyfHxKhzS7CVe)FZX5siDt!mt6#N3bv#V%Xuz{g-~8!W2>ZPZVR~KdSCdd03|=g2 z_9dQ8uC!`eQbz+k+nDy(X2O&f)1?wM@D*nE8wg@SzAu=I6AgSYMfcDRfD=4i_b6zt zS&UVc5M{cV?IGbCHq{^}&u{UBv5*nQ?C+bxH4^l;73?e&@A87>GGXu{(5Iw?KX>kG zDcR+=rMuv`oc{c%{qeuvZ+EZiv5#JGoNe#PlT-@6rmkZj=%C-cV_gCGp98%K#P`5U z6ftSl$8Mr3oE@S3qar&tNufz|QE;SyUD^6>R48Bx|9HCDm9FCE6fSuprOP43YjveV z0lODWUY(_Ud5y^xH{~!z1;25qXm1WU(jO7ZH18!qfali{dBQ#=J)`g`<&y$#PBknw zB@`;+YZh*a*3HFD`)J>nY+ZWPuKb<%*yK?%43;V%3$j#%v%Q+yK0a$#U-~&~pDYUp z;hm~WH>$r_pe1F>XA?hOFWHkiYLXjO(GFvb#aAfbn$LPj@v1;PU}#-c*zWY1Hk(=_ zTvUlFawVLoggR7ri)6dhKlk`7DPcbo|#;CmQQzC1G$ zH4r?aN+OxF?YT>>m^sQyiG@~457=yarOhN4Tf1#m+pDNxonb1d_{M=)sqPEr6z=@9 zc!4vXFJ}%`5&N|iEQ_sDGIH=;UFAx+@*Q4289}%9<^kpZuhTV%=a8E34NvQoi_Tb6f(APMTcE< zos3iZw93at6rnz0Ed{I3k5)h2qu89sC@P`K0s zEq!)M^|n@@wf^#5-gKhVJ|!K7LlAtGUf0RkQ0K;VLPKj2Df{@HOF4Hm8A!dZH#9#EuEypjk zpZ=wD?9O#VGKRc%SGq7R^-Shb#$XYIyYF6=QW*}q_9*&Eh5;%7Euice0DJe|-mO>h zK0Z`%$g4&qOL7;>!!kNhx@a>gQeC@;ChgXAB^-{hPbFFpEl7I8Q6}W$OT#Ew5Q-JC z>XFjrJyup2`*be#6RwjZLpuGrbBHEG6Hx_96lEMx3U&cg0VrS65$B3HWwL1NAK9*=A$CK> zg|Va_bYp9|QhrO1TPlsiN+6j>7!f74bZU>>85oC1{IlLLFgxmS@O} z!8z}jXUeW)gm0vLy&2pS2hC8lC{Hg+XD?o1+;i=US*?i9bBfm$E@cJp7sbfxV_qjy zQ|-}~LHi+l-174JzqMk}tVL-#QhSUSlb@+H@tvZ>?>(Jw6&RfCMN_R0q9E#Ib8>UWHPYF2u0 zKelw_UDXdKQnY)}Oi#LC#ZaWm zNU^h6P6-9Vku*vi>W{RQ(vUp-j{qE_%l$*h%j-1B;&!vi=k4MLrtOORChdmx8JlX8 z&}UT=)5|H8u9R;|o-RsQM>0Jt{T6h>_Fa@c4n<5jY?G^;OF?` z;pjq&hWCFz`{p(FJ3oAiZR?S%1rD^u4@W8-bD$f)2X9Bv@%Qu~=aDL#8^Y08s>8F; zdZodHKR2tQ>!I-f>G3F9HFzf`8r%77x62yb_s(TY6ttm~dE z0^jo(T5``qFPfmdNp*^ofpAy4N`o@yj3*o`X_$|6(c#`SOrf}DrD>azJ$7O4Ios6M zY1@W6Emcr-o6`A$IcTedy4x<$SmG3r@%0fwk<1%^0x65Fm8aEug zuXO3w02lC-4l!F=$~$YjEnC|rPuO3RK}*FTi6+eEhL+>X1$c`XD6ZlBIX07C;l#YTEZdfV3dsCu|Pj?FZ0|?~fUdquI;SlcWr6b2N?_D!se|q_` z@_zZm9BEWmKw%DI;Tl8K0vEPCHW3Hvh|aXf3knL?7yMv+sP4enAr4SY5#_mI69~C} zxPuib$!0|gprTTxB;*Od^X}dDp-=Dfq`&tQ8N2o@^2?*;{Z`-5rKB2WMN{FCoKd~X z$6_sCutm9HtHh?1DAT>ZBDyTCHr;79-fxMCA!|-M48lP3fYsM+( zUI*Upniack`rMptJFm@}$0&T2n%1SVW0L8ols2?=+`jzg&w79IelNf~yez=6MpfOB zvg=Yc`%<&)+=v(KZ4u&3(0d;W_#exX_`EkS>=M&fLYn&F{hshk z6tLO}@IQF`iqfzTQ_mH7b$s2Y*G94zD~1PMl3pRT1WiqfZ^9N8uT#6qu8^2EJy2#^ z(bH~!bJ=>Es8ns!7(%;g509|oT-Dc6z6pDAbi$@3K*LTy;n4tOo~+gFh4CqWr30W% zc)IK?gn&n#(>}n3mEz|MB*Kmx>a`S#KuQpoYDs68b>!KNsVZgLF6Ek+Qfb)IjyCJe zrBzqW_y9fvmUnh34@Jr@SI~(b2dEj5>Pmp1NSU)wFVoU|#R%_`S(GOib=c?5U2E5z zx-95Vj0Nyj8Lv*r(iYlFZ$*6_0{x8Q*MI*7dZ3&`GLV~7yzcp-eC55mvXu5giSoRb zFz1Det=&9npZ}xHuD>V6CYSw5!KMm|_ZMWPh?PE(D5`40P`H%AS@#K!qR3Ga3gRP^ z_nQh~O?kpzS6MV0@3ZFU0!wT>#+omjYKf^XYZm2pR`ODi92jQ>DQJx~^=qRcde%_5 z>Kpfv)h3z%9cZ$~W>DN*>rgczoI`2wjHLcBDd6K(KWapf$uCNmJR&s5vtAyw^B9e#Ha|$(cD|5 zgqBN;Rcx?$y#%WiEMiqc7mKyt$k}kqWs(t{@?H-A_k>>}z#|15a0+;#Jba*u4&~&a zy!?x#w6m6Oj96#oae4e~+RwV(X?gt5NmztuWoo=yi$IxI{_6m8pD@^I?>T;j9W&Gs z@I|rfgy@N{F=iA=Pe^^}tU%w8VvfGLRy?{|YG= zR!QpzZP|Q*I=yck?>#_WdxQ5M{6?()ygp&+MwU@^?2@uo`RaPkL(;> z>u8=RoYtt%dK9L9iWo^ZW^EG{`_J<}Y26cy5sC>5vp~bYiX|F9lT6zG6P^Zn7f#l;_#R!_Xly>mjj=Paic6st1{h)J;bu>jR>jERzAi6 zp^qFK2u#KqvWSpOeTP-jOEexkY+8!AP~R-imL>m)FY%^EcA@ry6cg_WcO3Tb3HtyA zC)X~5xk06SDP0%J5>n-~Jm1_!3d>riF=2z{>*W~^t8F8eQ~R;dh^6zxSgjO93ymZ9T0)5ei38;~6s|+w)Tg)x0d= z?NgU?v2aM(TOQhGKYzos_Lhe?+f+-=w)XPw3^+vwNK`HcBmVt3wce_YUQ#hl`JaT%JVopaN(G76MWWf2d4EZVCJhhE)}EAb{}BPXbYu?4Sj&s+xcD8v9!Dz7I%sPn*p z88YgbOs}-r>@q8*hh%fKT0t@(%$^;19YLL=!lG)e^-Z$fc~7|YuzpV%;m#oT0Uj$%7p6!ZfeedErq_1m zE>_yCW##$yS0&&Y;ThF@!H%WQ&P|ktm=5K|0^;?7KWmal!0O?Va@p?OvfHkCa*N%w zZN#1)nYCRrvsSKBf5Y0Om_tK^5!z5^JRDaR>NlSGN~9|ek3ne==E9w5jQh~z&_jB{ zGwWJ?R7cQ+lzUpkg=ptt%8ZWGje^yux`rwUz>o(zQKvGoFbBHv%vWuylScQ{TT|T7 zc-cf@}r9jA@gEnFqF)v{DN1wUde)a0d zY~7YIJ7&{_U3vG5HZ(kGUq5L{=r54>V!<2iV<0fJ&G{v!35E+^F@^#7I8IG_>-`h9 ze4D&km6?;H`rP7Hdv1liQ6Eb(L{Yf@RVWpxdz7yqC{&*Nt8Y9UBbD%kG@J3k58jXF z8ckPFxDH(>nle;8jjpAa6U(+)bNy{*Z~L;@z$SloY@_{RYo>iww~VW3E>~xipR&3q ztb=O~#-=N5?&Gt{rkU|I;Q~Ii;09PxksS)_7TTSnew&izb?@}j$$8G~*<4GEhoq{8)p!Wjg3jPM_#XSiLlw<-0yV)wX z&??y$DRH1EJ=f4)S%=|zCv?@6;p@zd%}p=Ij_|RG=m#eN{e$=Np<@(--eWL zM#^`n^mU~vLJ295fIH7&5fII0R%db|0|M0!91!}#MIC{B<5?=Wj+Tn{;@FhkyM5el z-mt^2erlV2?vahU-fnkq8MV7N58LL+sy#X~Zo8&tY^H`MU9?jK~%q_ zjN+vp%Hf?=8FU`UwwhADQnF1~ylB}rwM80E*9j@&1nUy4Q}>*C_}Zp^RUJ!qTJue} znw|DdC9Rr`446$Ty*y#w^`#%&UW=71N||dZK@W@41aCJ=4=;eHt}$&~Dbi48%*o$f zw`QN(iZX6j-n7od>(4>wiH@AT<@y)A^3a#!Me%tPMXcMr44ab9FUbC&df%eb^NOG7 ze_aMsmoxu#<$d#=gR%S>R?I9`*=)Kqs$wJ>$)o`v$`8FGEwxjhTwIOf0+Ncdwu9I-#;g^z0Li-e+Qzn3i zX`oW3pCwS|o^`%Xh@Z!Ld1wU@&Z*`z5=`l%Kqa*1*UMQgK&Wx=+dwJ}9%y(bt9D8; z96!j)ZS}4C==grQETThuCTXj>TGU@jTiBYn{#HCJf$C;L9$_2T;pj-{`HJd*mCHZm zAPO5V4rPo|2YkwK9z7cJcvE;>DvLCpN12^>C@A6&@Z*^^<<92wcHgQ_yXC}1cEfQ? zY?@uJB2e_V0VNO)&R_e3uiD~WGpY`H)udnCq||jtdGY_g!gluNg$uj@zzgts)W@C> zJOFnyTT#D1XXX`~_?mF)gAd~~Gyqq2+JfdhZ>LX)Q-~B|rz|K6L+*u(@Z$94ecBq=Qt(&kfycpFd%}O%L}U!i^#^oR`hS1ZCv0frw89i31142%_*+kS)Sz4z?fz6o!!Z2r&(NEy zg6HLmuk%dUJI^Tro%i)D_~qc0(rjw|DGIaB>OUkv!2YhbmkvD>F_^GQVR{WZ4RVKg@Csl&7nbpWJsiN5 zPg>sHE*mV}C>(`9JKbQ3s@-@byc)p57laGD)4<|kY81~bBL$0+8q^@4w!!kvmQz^> zaK2jOuN$N?Hj=r_Dw%Fe%1iE(A}iF#G-xz}MGq9q!TO#sgBpPu-S~-t9hb|i5E*u2 zQEeWsEBd;e?6%?D#cFrXvbACBFW;z8ULQeZBZ=rurGyt!Da%Ok)Y3IesjRxZO32D{ zJH((rzmw#mjV$I!O3<>&JgY!`s`zjQH3a;R9qe(T-ma#s?(KAy!Q%*Mu%xHUx-PSCd(Phfg=Z9i%t*Eu3m#(Y{dw8B)Y=#1zfoJpb7T? zUC$Re{FR(T49*ySmco>x8LD2d8w7%I6LU+oh%uxJ)pisH9v4=quV_`~;QQpnke5io zc4>T-ZLo5qzkXChm?{lQ?NGfZ92QFKp}qH~PH_m+a7|wPkE%gQloP$Sz2)tS%xa*F z2-h1GF6FBM!Pbe;CSKv|_|rZqUiKIUU#A(boTypQb}GACN?HO>^h`Ep{HsX_j^IU; z;_wAGK!sykZLUYcz>N;k27!kGfsw;|n!J9bMk;}5Dmt{~bGE9J1x`sD>d0BYyw{{8 z_wfT#;OgfUyc;YD%fh2ZO#+AP^pAH2pJ#9p^T z;s>$u6=6&CalyFJ(EJ|ig zh@YpV8J{1t#C0cH^SOR^vb`v(7Wms!Oh-#8^Ta~BBeb8_lJI^3l}jGv-g|rQw)eC? zV(%RKX`8rIUiX`Y_d3`>x6DZk&r~!;Eq(n;7{0x^A+1E zL{Lf<$%|O&LLvXJYxvPuNOKL%kR{%40p?%F3V42)1N`Thg?`^E1HbmuT>XS0)za~DEQKkAF1BK5S1qzF=<7e#OFYrv~&Af|0{x5U zzP<1RR!_^@tByHyBzY;Gc!aC)PluuZ62|2^RmSnRyS{4%+N@u?U}1NQ zE$I+_#dpqQo)ZP5!sH?F?kGw+rZwd=KABxWzkF*=mwoiolkC1VyaR)gAoZv;|MuaV zZ1tv57vfFP-faU}yX@na3m>*>r3`3C>(FSi_e*%>73-dO!cfQ_FPz=|Bpvm-A_f9~ z?F|8Er6(OkXs8^rR}@~>I4emhPZsQ*59aOaRJ+-oD=hKwQfp2KH=mA<&KSux(H`Xt z{RmTyelIWB8>;?FD*R_V@3o)pzQaD8xX8Y8=Fyh8Nb#pCJ(Cm#a8^EOtXpvYnLoeB ze&NsW@YeeCWITRAeSqnK(SM)h!{^exjnBe1I88htJmxE46c=Z2v-*zmL;LqYd{6zr z-tl{6MCkXi>^U}*S?l3BWR;+t>UP}t@I!C;b`N_wfb6t{M_JqQKcuqqQo^H>v)79^ zc!NZ^B0H3jwFKx545yTwI{#|c_Yu5w5f;kDyH^C1a%Fd;;lia>mFJt1)jUwXPQ;rK zaYeXD!9r>lvVEGu)VE>fXAlhV?x8w_h`;`kX>PV+VzpJ%1$p+1 zthM=~;)SCS#2c-pusD@RKSY)@u;LM`Oy|L_`NnfrOf3=vb=q`liSBoaZoKP=ki?X! zTA{MR%9*8BOSf1lu|ibYY?%ftH=HQW_&)4(8x0lz|9T-{7C|H+-D~o24fd#y>9d** z+K$2{3Qk$BI%$K|uX#TsEa_ut!QvU&B+4PKP&q6>@<$Y+2UB8{7Pet**l7N2IU0+c z2l)Od)kB9yvQ4=&@`SgN@UVuMdcG1~;GE4$S{GnYH>h5}6+JuzzHnN@BSF|gQ@l!O z?~9c<6Q}f3mAdUNR_(dbiaoZgZg;;pZMScjvS&vdHlc7l>&_O>EKgZEbaoPR_Hl%I zR(bS;6zYPpS$pSQFWMQ;4BPgew(u&GP^ik&e(R%Kgs1Rj6|j^`N`kH?Ja+W9+W-8? zQ-u?XnZ{sD1dl%k$JY;VkB+!3FruB#TWP!e=I3nf#&Ia10}7dS%+%~-KYX0pFTtw* z_ca2dEYu}WIAnNy+rjJ_E1-GxET=Q8ojLQ!i+Np+XyH|S_-BcD2T0eRhP@%lM;P}Z zF5&SR`>lJM_RE`!_Vj{;ZLN^M5N5q4|J^1=E9mU{UTySEW)KL%Eae&l87JCl3}0S& z+E!V`iFTu6*Dq2*ngg*n>A=CDJvSR;pW09s$oY zob$YMx#w17SAH%J)qyhMGf)||Dcjs)v&pscgxjSY7fC^EwAu6uo60Pc2e?oS(kX@< zQ=1qRYB0h^_`5*VU`#8#(0IWrsl`&Ttu~Wfs{1X6^gZDq{OOaZ92by&p)dw8te>)q z+J^FFH7eUn4)C6@3PmjXEJMvGQscdzj1D`Bp%A9-mx)nE^dy8V!2Jdr} zd?*6}Q%w$9Z{ zczbotT9SE6_uCaPN;eKe`EpNLu@a6IG0K(I(I{bgwUJUzpgeqqw9d&^m6;PMRaP=* zH?3;1AAY1{KQ=sSskWxwH`c4Tv?WvO_X>P2iaMQj(A~NUiZ5!mXyA%kX@0!pep{HF zwVuR`eWh}&O?L}V7N2#A_uE9@jAtOHvL&pXOWT4iF(& zQ{orQbXDc?!P%iCWG`_sgsVOG0b<2Fr+{PGz!B9R&f(yZNn7=4$wpSRPx|_nj@mQU zUAaqf;vdmqPwIUfDi_y{*1!qL#H?lOa(3iZ*HQ)lq-#t4d8L&6Y|_Vg^MMEb%T`{> z_YZvAYeo~`s5zMBKvZ?HeHkCU@ z_DzQhs;Tpe-W9QxGxw}BW`IL*pg8^22;HV^)(X|FHl1E3h0 zL#3NE4%o4Xsnv$ny^O4FZ+VA}r_YwaW)4?>uKGO=a04V>}fWc zJVktgC99etE&|$xbf^_Wt)=#W3%0`{Q&NzohoBqK#scVmoM7o|xh#wsEr>w4&I#%Wy!&1PY5^pQ^KzlT%Wrww7VRv$trGrmO4--W zTW;G2+LQ#ZH?*I#^M)%{3=p*UB~3sd4DWBSwqj_7R}mk^VydZ<>XD_h zTFPw5y}e|;s_}-$ND2si=nkgV@$39gqbef{E!Ws?C78p70&UR=5Y8AQ9C;~F_=JH` z&(vk<>l&t$;N!VPTWy0B_K?*wt%vkIVHa`qg)3hlGL8du=RMzQvQvtc9j?-0+PQLr zgh^4J7)k^2%`9A>?P$3|sI=&i&qX-JAbFjR0{UE53Dc2?geK;?HzOKIO6!X-qBI(9 z)>Gm0X_RsJf=@lGtU?_9Eis*VPdUtT&{lDU4i-zHIMtC#AYse`9K7Ik z)9S2vMzM-+cnFCk&(Rg1hDN9-)#8d;wbE_iAv$KCJ!TM-g*AvpbNiOz7W>1-}r|IEmy&tQS)_R4`fv4H5aV5;r@2N54;g@3<%Ru z@rHOTl&CiQ5h-F{{jGzuE7bYt`ARub#tB_B741qmI=l>>Q;OpqWYXXnr}8%3nzuVv zcG$&FOxkgoQG09ah<#;biB*{kWhpcrAw1nEVrrW9G8XuV1Nf?snb9~ky~(GbQ)*;q zvt<94IoX=MiXTv_E_s1`vXJ+Jl?U3O+(!r7?40YKx9;H?jSr0#(EtP7<*4|;H|kLO zaaFZV>HSqDco71_W6Godx~5#tez)g-FCgC@1*aoU?{tqqW0tmt=d%<=UqJ(SlRBfk zFLPjgDxu@Xk>E>TDl3(kvApE$baI6?vaMEaEb*;u{qdX2Drie4{(b+zJOvC9Sa5Z@ z6lj+e42y=sw6kyVr%u?NKgGr}XGmDfiWGz78k?-U_L!8<F%r!2Dy|&+KOt|$+{2IgbY0QL>U+gsU&)=yYjH- zmShucc$URaOe0O~pBj_eYOTNM21+&EVr5$`(I8K_8Mfym4ST+}9OUl_2j%CiAC5?= zqI`MJcUR#OH?p#|F@NUEcSe0$PWYp2Ysp^Q)q;1N5x%=^aq${!uiPg?>`{5J4?7(? zY7bg>Rp;s>*2R5A=kh~pW2<8%|-uP_`~Wb>g3R2md*dp#b;-;l+e1f=x=!c}tw9K7cP+tcB2m^HBLHa_ULT zKw?DZG6_3lS<|jKx?u}M+W%;;*octXQL5QP!)1G9vLgO5TaXWi5R$sV`UT39x0bKg z?BcsO+Eh!{9$D2L$xx6D?Q(v>Z$=3!%o`lRyvsRYQx8{6f*_OYwqRG;-uFd5Nx3Hv zDR?32%NHJHTL)Vdt{ATi;94o51&30HLpb~oU$$cBcI>dPZd+2^)yU?fmgMfc11K5+6sqdgb zF~&$m;BYZGg8yXw%H2s_6bEa}krjskJ#$!L9j^3ym7%@D&3^e+F zf>dYQX&-W8C-V}#7h5&ar@rA6d^c-g4?7_t{#foLo6elzor_1@TfR}k_X&AWwKRH=Tc!vgh zLEibW4U}%wfR|Y>yc!aeN}~V$wj+P3+MM*MX}sfvym*EMWu(LhG}VQVaCLz{H}F|- zvBhSxGA@|rlM>*SCy>b0My;=Qo9M)|^aE?(cLTr>+QpdeQB->%DB~y%LfM6kxSO=1 z2l-K`&=;Q8nS?zqCH$?)Su045FOaiGeLR2V(FPT>(C6%jciO^{8TD!E5d%<$sE)UoXcIC0B zwGFFYIV0P(4r{BKaQFq>Ij&+zmWpEG><} zr=%=t&*>Y+tT$V-b9$tNw=S|uCG3H~v@^S1x$dROYQK}fZQF$HsJGkCx8Ch#kmyD0 zvd8)sSYn0JEsz50P=95h3+)U2O}>$VcKeZ!^QsT``cJgt*Z>zWg?J4)2Wxy*u$)>T2c%8T)~I5kUz~s6 z;Aa74h^XYPrYvr}knwwcsQ@n@UlpgiFwo-plGn~`6h1O1>JD$Hlu+-U+o z9fXNC-Uo`KU)*a~9)G+j9`rRAB2aks6&bA>eBH`R+kB`Y)zNm=hgf*ED|?xHzHG3; zyRkVb)^r2%nN>4GwmW^Uu9}u@j`*u8+4`iDsR2`~k*v!^t@6qQ`vd1{BbIOOk`h`X zg5`asahnv6?^+Z6n2JG2(WOl12CMSmf-8CNDB&)}OWk-I(b?N>)?Bh!DKx0*X4dOiYL+IApE04Wg~^5i`Me zulGnrN)O8N(z`CD3=6g`dx7Lnr>|xlD1A+B#_-TUWxxolQli^N@)v6Wq%2#Rkav8e z+FNv`%Rqn@&g64_#5ukOAWp(ME6<8{Q{taVwP(Av>AtUekD__kS_A1-(C~1B{R^}B zEc!(EbBbAK`hfrL<>{WdpgQmhh-DEQN|#XOOUdvNeb+Ba+j~yQ*-Cl5>14)UXlvMq zPHEV1KBJ)q-_pO~jIc|TYgU%W_V`TM9++%cPJOy4r;#P$R70aXPp53%#xd)ht=JtW zETlHClNH=P6|R85^REIt9pjg>oA&-MK4i-_O{)f`6U8U!ED6k1qhTL?&&f8`Ca=@k zBk;(4;BG!kgpyUR9|HJ|`dl%D7*rGkWp34W94~q0fY72)KSGJ&r+B4}M`0q3H(Yfk z{H>J(cGUK1TRvR0fqc>W(q+44>yQiy%9QX&S*u)MC`3JuwEj_^g5KA5_gv6Gy=YhW zpAf#5v`9fcN|23k6&4{|!e%?Ow&IB$w(_|#AFJdKwS_lHkc~X^AD2PAN#~kBGgT_J zDVXvU2QPS$^FU!Le|}iZpRWY0SJ+Xw(q=R3q=6*^M~?DFLE1|4gtysrYK7HOtyWGikvx3L`IYZELu%UYqX$~4y!qZSh5#}N-3s4M zXV%C_SRy=!bZ)VHV^aC5O2f<&23JG$MJX#U{B#&WVsZa(Hg~mMDE}4Dmucs(N_kF; zV7#sXt2b>Vd!ZH6i{;@?+0g8@>i=0?hh_0lC?%ru+&A0Y9SVhr>Ht>GHWG_$d*Nbd z2DUegU+#t)5C{tsOC81|EG%|8cz}h)rXX|msAFLD(cIZqO09OB!Vu68CRT^F)StEP z(jERxi-GcT5T4aAM)vcba1c{2IN1eeIDffSrTl#HkHgEC|H=>sW=uuj{!+pTt1#6Z zwFR>`NT`>14OHaDC$FeYc)sc*S*?70VX%CY++lgX>c8N{R+R>!^(x=vrY+9x;mp7b zUW{%Ja{nF-*q89~FtsHJ7QC;J2E_{aGj+9{)?<)z?@E`&DY|BFXeLxM@`730%xlzr z`JDa8`ZinEMZYjM%)YUpX`fx4vLat0Qkv9k)AC~)TVplLPBbhtCWCjp;n#J!8SGom zGtSO*&93M!*zv6rKe!)ADmIT0|Nj0joM~S^XPIgbxWY5h2%HPqA0YVsJ!5Xvzg^Qc zyY)x^#rxG+gJ-9%2pLso>%aQmIobpZAKK;yU`}1!d=h@IZ zKC1vNl?U(Fn;~+8```5br=6PF=;^@!lH-5L#xKg7y;b-hB}%g%O!Nv8H3Fr(N*?g9 z{=wHB2ha%PG|S{CZ|MKoIyJPvA!KBr}*$?OpU35JkhFBQ&*iZk*FF;mfoL1NkIa{Rl7_{LEnAO2?n3Ei zZPNNnUk$Tzst+BMG2$grdw2yhQP zr+n({S3`sECM0*ZToftak`0xvvwW55QoK~rQ60<%9Bj@FVR`72Z23_s>(fJ{vEZ3rWhueNgQk_iOJkI#>gN7s$J-_l0}+R9+tZ6%!TDru4lsX41_Og|ygC88PML zKtvnSSIoc$1q0=4MI#imvzQLf2Xe#^gb*K=XHaJvqyF)HHra@kFRMFIzI^$J=|Yt6 zK;;ItdsaA#`IVpji^Jf7AH2wyg{DvQgnf|enK;QhvehJ9jPQih?@(q9;kg@lzlm8Uap_4cHd+jZTZ zwpy!_Xw226?3;~>jaM@EnO!CO+wCRW&BhUt(4*Yn`s_V6xO-N3fNxM(VJy5Fpl`iP z{rVlZJg+inqpCn^It!v05_aEl(Iy`XK`kJVo35Z0!dX?*{zO&RI*dw9bR8tryo)*o(x8bV> z`~9m<(HK!(YQaygeb(N&TuN1VX~=r}7zZ&xOWG|JVH-;wDh`7SWzn>=iqD(n)Q+^; zukv~9Mph@AU+G$zZ@+Yn##b1t+-F21SE|vNLE#)zftQp=@ucz85r4%HjWiF7!{^7p zT5#oy{8wH`#Np*AjJUY`{T)92E4f0Oe5X8}eZl}Dc%1l{bZT2(4ncqMdfm&oU3M^Ag`!3F9{>BEn;Rd=`i!;LH@Lz=c)=KW&#we9RM@m%224_(u#A*aT2fP9<-*d< z8pOMFh|b<_3>l{InY@;FuHS(G<@q$bgbP!gY={99QeW8Io`JyJ1$OeF3@3TMC|{HE zm4XgCf~g5*Hfah`10M?BxbDkUdFi@C6UIqOQHwbOn19SH=?;wJs zFj~j8d%c_yIFa{DI07lB-sU}E1zTG-V?TA`fE_cK75^bX@Ng1#$D)LNe60k$%A>EC z%H!NxuiNtRrnOBaZ1pbHRjgQdscC)eWh_C>LccJS=qr^c=DndcXRF4Gc6L5v1-9!_ z+%@umKlF=dD@_3JTIGvcwttAyp=PM)Yd>?fEf|?}Mdyly!6JYTfA^kK?PEU@JV+Fm zH~``}Z#plzVx%x4b#`URb#$+@ZwABKftY?WJd$~)AW6#@4xVi23zZv{N00+`K?mi9 zKRI*wOcqE78zwc5@o~a<|GDalTE4c;hAKB% z)s;BjtlTt}gZzNB@SQITR>;PdpHv>nv&dTqH)I#rI8RGvKk4;^x98OsjDW)o61Mz~ z=7QqarEqq*kf;kuwnB>)6;c_#1^4ow5T2k@+2 zR#5(-Y#+g|8=!F`T~ql9tBP@XJivU0{G~a@XYb}pveP|ZcDl*gu=SN>iHhlc+e4+} zJykxL2lKL!flWeu3pob&{%D}~plU@yuLoL-0D+duLpe<2eXjxhFdw)lB(!ml^5x7J z0`{qZMH~1iEkVRbJyvvN?Z2EgWCaQ5x`do>*dcy-s!hu4n7Z{!p{|}VjhUt`pKRLF zNwXFyTK`_Lluz&j=won!OU))!*wagT?4F~0?AayVcK^CTn`o60Bx$z#@m=;iS3hDW zKe@~9KdRr}_xo>GZum_?bB^y`1%F5Xe*8;M*l+&*eXayt5sGJmAx$X_yXvp5v}afK z1VyQKyAVg1W3aojRYF&`I!E_D%^TmVOn+u4I(r_{0&Kn3Dq-55!Tt1jkBjQ|yiq@R z9M>-V1qkdk_$p0OxJW*6?aBd*NIcv+Q?;A^^ag92<^vK5dvdtV-u1-`LVf|X@^Pjt zZcH$+^!J&rf3($^VfDG$wtSbp>%YIx8s{i#tXJRkL!V5-Ht=)%Kc(=7<%r^QOvpt<%sbV8GMGxJC-jFJFm2 zWPE$S2`h|oa`8cizRJy(mP3P_qnqG^x)eO6QFb-iXWJzsc??D^zPL(#A!Q>nv7(*w z&=0g1yi^Y}l5t(0OUe8SXxP%}Pe=IDufdquuk1QRkXn#m{Gn`pEOdC(7%WNTB$mch zZj~6V-SUl1mTT;kkO&HMJbR)Tz1`YtPg-a7VN2GgthKS#rqZjVSb4>wBu{s{&U9qb zSJTy#t(KFb&Pv(Cz=)*qpgtlSbczSj!2&u`jD^s01*5k5&OQ7R86T%unM$NMbt4v? zD{An3<<3L>yxe=jjbw*SXO@Xp+m(982QTkmy0RBi2ikt#$7M5op5LeHSgs6U2^g$D zwVSCO7F_MhU!oX!zKPw|FXfx6YA|5&(!VN)#dRo6(qqx1m_uIy`@=C%$Y&QK4+Bav zn?TsXHm(j9#KI>A?&A4x|a&Wh(a+&Nwh#`=KsmbBUj&Rl3|8EWtVuf{bI zSfW*b#q5&JNqh4)vlB+lmQTpTEz_S;;9{w&1aOuysyd%p+-YAseT9AMvg7R|KXk19 z)eo(=tIt_t4<0pS8y2)%CCdzicv5!8MAI@xa?ddryUS%Z8;-j)?Hm)=y6-yK`ij}q@>M9S@*yMG23xPNoQ)o-Z zu$PStpg%AgRG#|84Fr&6{PMnbtzu_BKkoT@^F`}SSMByq13o^L#oNiQU*T(2DpP-F z<~G@~)VLc99o4FR;Y}x7Ww~(e)tKacZ)AyT2)Xs69Mzo>4d4EyXN4-XW4x+bl&l+W zQuG)fYUG15s8K(m1nTCD2?hZIaHXcHEvkbHj@JMzimE1iqr4Ct*%-zxYhf0auCcD_ zgZn)?D-T(_U+dg>!e)|#R+HQ-Cx)UA`pduLAI6oJp@Ve+a`M0vK2Ex!ldz83qn?iE2N=T62ZtG?dRmVEP?#DB0#^3A zkBf{N3BEJYO0|4_rxj{DM4XUzCbQaV$u7&_}CGJ;Ym zrq{_M;}w`)mTzwMFgn>6U~#Qdok92T(!l{L@V2RAwbR0=^&){^a0rMN1 zacH2^@vj6@STFmYaC(WtJ7uV>kW$`e=>)I&s80UFOw@Y-K>y7#smcs^t8_JtHrH$* ztaj#I;HH!>8>CCQCV5tj5K}JrKn+((C~l{Ohxtb~99hmzDII$O^qf<)3?c>?atxZH z49NGr1ul%{0ryS@57%`R&zT*n{93K$9_snok1#v%bEgj46>B?vytu*3588|0m@(l) z06YT1h-1bce#BFPbmJ{qyW#Yu_L;XGZGZ6I)9s%xILhuge!w?41Ci!Ip6$2F80nSdv#w$eVX|N5s- zQXNw8C|#5u@lvvhig+qguzW7i6)|T|LzpUH7;vC;QI;}1;AajC1v_4hKcDgRG=~qQ+SRtq|{!MK~!n zv{8f-bEzQ}>$Xa|PZmqR1an~0$?WkWbXa)NQ@T&(G35YLH*7R_j;ctAFwaQ|PpA&D zp6W=ejxY|GSWw!74#I*?p}`0?zgOpjL5V}(T#x4 zkLts_;XUEm^diZWHs1oXP?wv-YCS1R+V2DE01kfO9xxS?$0U`p!8Ff~!bS3u<@wfk z`+_TWJA?Iu2!RJE#;L-UjsSsi_dfOo^TWBOM6UK+AI<>fcn{j?paYrhGZ_RhfC)vg zDS{L7l$jDPAT>$Z%G0;v^I!=VmB$o*OD1XmRo?0PA)Y5HQkJ`F(*;HZCbdLv4 z5dA#|UWQ-H`yVhPHA3IZSDvF@*lnNq?VD`*W_gE-bLY%g%k#P(!n$EkujsKq`NgwD z2+5F|6dSrtUTm_e6jF+Kxp=*f7D`lk(lybdA&(YC8+*I1oE6WMa-^tzkrsLQ7;}j- zmA$0&BRX~{ZbJCXh%Qsg$e2}-iWmC)6Fzl3c4NY zWn66&-ooefg~RqwkFWz^WHgB$Y(MD+h(PMVF35)kr_{A$VV6C0)?%|R-SQqV1`%=2 zPs%U4!)f(g)-L|nC#*183I>cIaGKJ=S4t@A_&k^OS3ar6$F$Pv#2yEPu?D2I{**MqlpL#Zcf48}&q(RrDOmyGL!SMC zJ9FR@U9&Z3K}xrnSRhZh--^j0$-Iq18xP;-)|61!lC?>V2if z!U_$=_sRM>Ms?J!qx!I{saaSg)T1-P9mR7vct|iKIQXhVXaYW>4^z?Mc@goiAIRS! z`V=$EM41jL;pILxlaeRQfCyg6>pwynYJ@663HU^%&XsJ3?aEy!9?n>%GGRlN8#O?S z$OYKjaq}tWXi$Ft0*Ztwt3U_;>KEYm&{zO{p)>coBvh31I5vIo86Dj)@Y&ayMQp9P zwEfO`D{UWa5uo(pI$`a_ioN#>kK3R8**C3YdRDxJ zSt_BXG3@Wks=n~JqG=!e{R?b&Ye9`txRh>uG^>&wq^*l58EBmGkR_yjD%aywguGQe z;jn^PI3f2*j|c5uv9Kac*Lc-dis~sUd{lUElWciLvg9H4f+GI=GuDolr0#&Z$Ub`cbwEK7P+KX`Xyq;98Zra9Xx4pY?pXF3G zN@B-Ao85l?YEwp~Q3~3q!&kFISm>+F;IRJAO}6s6aYqZ5BPrlnNJ{xK5{4m>JZb6= zacT?KB=)k@5A>b*i?CQP;brn}HuW;|rx=e2vvX2@s)4#808_rX=9uMbJ1ke%(HvEI z)S=2>0jLWFPrGnrpbwRHG+waT1Rtc4E=VnsBl4m&4a-hZuIelLLY)mQ!k9yM&`q>l z^(u@-t*{6yTEZI~RqJXzt*)7}bYomT`*v%oK5PBed&E!ZGVGqT^is`L@8KxhQr#_Q zen=E>0~zAGCkmoYI2}?9)0tyM7@j{B<<^h-a|s3w+lbW?-Lk4WlomqD!)rcjy`{TE zM0s4gPbD%okvqvM$zFBlw3N?7N*5OTP=zy#h^#;LQ(Wnx1IG!*@oR)J9>3b=j3PWy zQsDl&50x$HQmDRQ6+ZlsENHMUvTXBtF$)6{QB3`>@9?fs9n4hlNkuH*a;C?2W-nH6 z7gWb?-((}vDEYu+)hFgX&wSlm+b7Q7M+a2YKgIzA-*@2&Cb!~=6>wIfm~WYQh5A0# zulvvkAs*S$k}cTpp10JNNr5ue$tq{WO4wtYK9JB+QWnf@>20@W3Vr-=jDx4)_K^6sM((mjf@0G{Oy`+%i+KtFC+6KJ<~h z>}_}PIZ0N|?79naF0n(k2wAN!$`?D{iTSrU5^1zM33l=s@yk*=|-7p1Fl<F{|`UO_!CXsAEFBJSx1()GhCC zr&{r%(hlfe_6sLB!7UakdvsoCtyQ+6 z6bRR3UG=N{@Vr+fQ$5tp6}f#+b%C!b(w|RrJCVR|w-uUFzO`L4Xm_K_9o!oSe-2^8 z#sm&Txzz!cC=pL9o#POx4V2lH-)SZ;6ZsF21|lq<4P#)@mp(nkM301Trm@ooDmP2; zl+<6Lm29xVY)4qJsDbPGzJCF_gl9!4hcM_(Bpm5qg^R>B8KHdOgcYpt*gdOz?JH+3x2w-w>h-{Hlsz;$ zX%{`P)0S-;gwOt7*P zEz{3wdAv1w&`FefS#oDq$tP4^NqOil*B;75c`BQaUNnA8cowAWmCWDI<&`WxQ&muW zO6BO9k6tu6^B5wPu;2RkhwMjgekMGR7oI8M^4AZZXdiv(STz~i28H2ewj}Jmt#{hb zHSTnNm?;$O?H~UoDSnmLqEwwq@1H4FY^&-PD)0j3uD^4;{pAmS&Sfvn2T=IDlT19# zc}$7Fn5&6oI(Rm$AFm^^=Qe#zI$qy#Wz#4}xTz2<85Sy$Ua1wL>x}AQrbq2`!qSDL zpd2-aK66-zt&1X_p0bg*ykdJeL1OX12c=`x zRC!FiGK6c-3fi=Kzag%pgG$MM8fr2wFtC=O3oSy2GL_KRQ)n}}y_Du!p-UkPtwo`iHLBDz4 zh`GO?0i_2&x@RUH4zFOLP=lc2d9IVo*|B!_YCfGq!66(4`}1FZ)PDJzCscMr<43q?tkFdd6u=3As>;w^ zVRl8SmDzWDb0r5)=+HIsK{!Tz&6)eTLPI#71$9y!o^yE3NO5Gv08okkI*mNlwD_4k z&o1q>pZ#x_TQQrH@R!i@dPt*FUH2$E_j-JQ8-WOayiAqJbhqP;V3vGKb%|P6Xxz0*V5gNiqdKL0 z6B#MSg06W4$qHTGgh{Ix)e-BqPuLg#=tjv$5RwAXX||NJi~ju*o2v3*h(LGWp{YG# zKht`*y|;Rsz=kSuc(M|9v(LtWUK8!E=pFFSvRvTWpgUW@r2P(h6)8HPk&)H+4;;XAU zZdD6W7yu!Jbuykg(I)v~knZ!!H+l^Z z;m=g57lTj8Q9r!x3Xb-{XPgCd?e%ihCZ$nnF6bGTq{ZXPAjox3I$r^d;Me)q6PMfP zFFD@UO^y4rVsMyFXY9$|Zo6-&%i3pacIu0}?5M3HQs%;|QnPKM%h!)tY%^Jun97xo z#tWtm>?nnD#Z&f0S9q{hDa{IoF=3?f?P!7HQT3vI5LO)|pQ^?-4Zc(H7Pw*Y4)^$A_)ajyi*o0i92l_L-v ze1uVk8@0^XpoDX8*L9y-yIY=cSP<&`D=a*1T$!%JDs?!;dolog;^ks7VN?iv)z`o~ z7ShhADi4_&$~^pJTw>Y4uL@^%pHn#?hajPGOq8O0v38l_n9Q7IQ`w{a8bb1JaBFpw zERPwVN}-3?;9(+jv<%KR(S`=|Wu@yZ&pybaC&~>)>sBtr10bZpi4QX#LZH*Z!B;}N zK@pf?&PzW)a3KgiRUVT)VHyucsavLz*BM4TFkry4NHp%xVC-O}t36nV0t9myXbj$P z{hey#_cVwGC^Ip&cvQ*@y2vnfMJ7Q<-|ek{p&es{aRZO@sk>i3ZH2vcd3WG#1f%nn z6jQ!ne{=C#`{(mlTIb!Ht^J-&)^+c8>$!{9R}d~4m8X92)%T$452)K8?5XVH;2 zTi21Zi5)Yt4#(TqL|lTC+4$y9guU=iX*45Y>io3THLSPvKT=g6$Cl zC>KJ+O3awBQHJvff?vN!W(s!4`sMb4{4SA9IIEq^7~pYpf6OmjYCm!J)Ak!TJZ|-h z1n;aA7%QTSO&e8X{@)d6+LzB-qC6RE@;)#;i*nU4Xrh%-$`yGw^0xiHB4LX{9alZ$ zC|F&WGuA3Ob4+u>X#n1JJZ1fGy8W3TuPp&mpfj>$p1h)9&Ai&7;*u?*S3wE$s)rY? z^HSha&M07-`r*&qXII?*oT^ovaN~8M&C^-C^vhQUdh(}^r@W4?vVEcXQEOMl7{9-F z<`396)~~k2BE>INTL#oFKGx65Xw~Tk8w3{o_OD%UZ~s?5>xlM84n%PvA-=@e`Qv=U zDrz+QLc@nuU%(a=F!yXjT219_d+t)%AsyadC~JSiMP=lxJ8YnGy~>oqFIk+$Sksxu zk2u~e(4x-37m<7x9`K;^dCV{S0n*`)Hj}{+YvP)!Eh@qB$Jt}@LJ{io7TcM>O!#*A zA}T%-lWNW?j_Gpswf=*5n30T#Byf^I5AR{&DEj!URUlJTuW0RYuY0K+gQ%pkDX?=tV?l9t*p*hZm`RJd(+Qe>G;0?mPhU9Z+J)wRJfER5KC&O&Q@yL zFaE|A_N}9PRk84Mk5_W291K*eNPy$fO0le)EL&%F)=rz4cCUI(bJDt`P>(gfCWP#% zh(=0_z=roDflo<3cIhvjQHCl#p_^phuibgRePi#hU z*XyE`40!kw!)rXd+QxEc1n(d3mYD!m>E62dW@z>+a_o0HuVR?vC8q1Vrsy@n3W0up z74eG8DJ}xv?H63$L~>l$OCU!1wrZvDz5 z)_KR4ptN-a<*h!Ct^qh8zV^H5+LbP6PaEorfiMJ)$I1B3$*ViQEoaB|&|0pE7wV*78ub{U!< ziz7@u%ac80Y{E{O9I-Q}M(vd8F|{w?OFOB9ehILrzf`-&0ijV7J34IWG)letMB;-!i z_7u~_A?|=c5rKRL~?R;?N-&|1>x2y1OuLA8;O{J}~{D`&Gp46R+ zf+v(l7pjw4-mGoUy-$?dE!t=ds4l*Mm-2o4(>9Si-DcCPe43p8Zit6^E7uF3G380w zROU3{u*nKF88)hPNB&*@$=QzD{Ysva(|TI;TGuAEFJZ%qcPIBXD_}v_ z^8zoqj)$L@6L<)(I3=aWVwK~&T5MHI!`64SSx0t{q323W?1sOMCnXLQmrDst5I1}g z55hk!V}dt+)Ao$K&U+?P_JX|FOij5`NxSOQj2+vDh*MhCX)Ky5OEHvd_NQkaXP-Oi zxS&uK^`-y$d0V)3%HwN_Ps__KD?N=r=O2F2J>8=w$L;+apS3f`$D?UnHi}_&6ysCv ziG*)#I53`QH~r+wQ$2zda{95=T?(RJvvY5}%4SL|xDqbN3*qtR{0sIc?O$>Q_;A-U`@lKxw!|8h#rJ`i zDWQ~bLJmJGqN$NSaHCFCzIowaM!XREhjws;M+yo1Y_4g~Dy|`g!-{8Ck(X5lD@ah> z;JGt*p>O?Im2wY8M@i*Ja*VQ+lJy~TkGq7k6Grqu&>1*inJ+%bH+EZJ>8mQ%Eh?Yb znOpl31NdqD;N8~JS=&~4hj43E!^Ly;Vb;T0IVA^Ayx1zm)my$rO~^{=L2UZH>AQ9{ zZC1)|%tkWjT3h2e830=>EAM%0%jGsy{E}#*J`(~X*(v*!R*TYTSx6rZ{J|!w>&9jqr@tU=|1v#zwunQeOUePFt38 zm0)CJ3@PisK6ky0SvDS#^sP1Q*S;uW#a5A}qTg352u58h|36-Ox_f;eee6LyeSEiN ze6~y&YJBom2Cp+AJ}@2pv6%AcMz{ttIsrA-oVtutDQIL5;Byq<2tAad0X~Xn`aaI< z&kPxxibK))>xL+3M6NC2R4DS|^A8r7{vi(5*an+fYSJh=- zTX?j;f@IyQy+h|tr6vnA1gWz1o*6c)NcO2DBjz_;z0F*e~5v8 zcfO)!0=0*?QuvTQ_w+xnn9{jmM{@^D*IRe>n^GPRT37jDogc8S(&N@%d(^rr5BPr0 zulHzeJZZ(u0(t1YR!S|B5ye-fRJZq4=pT22z#FO}_h_oXhbQlO6;b|hP8*5#2G>QDRB|4ar&Ur^b34UtYM3Y_2dd(g%{D)1oPr%wD zJ}Oa{`ltVHQ8>x;7b&De1io93PqheFNgsc!B?;m2K^12s_Kw^-?%jDUWj}iyMgCYqK z((M~O?OqVV#M7$BJvd&eftAHqA+?mBaHV}d%?VzOv+mUOr%YX3_YgB?_IpxV+_IH1A zjn&zwS^Bq8m7gHV#zt26FCDZ`op-7&zJG&tZ6EWpnS8_)=qeVt(cC?0`k-#@ zg|u}PGM15Hi}y;uWV2Ztl5%TR*g!|Y6(oy`Xs;`72}<56cG{po)!CuDkOsn2MgdB= zCPfP$gpVztlyydlC=g*>O;+W=K;wp8yKR;I{$n!QQQXXds$7)I=es{)L#YXyN#^a6 z^FLs=O7*N#Vu*%QD4Xyz!SzZW@;TyqEBnqZrfYm>GcnmZF%WM9E>JZJ9 zr;=GD)>~>_)w@)ua3PiIWA!vMJzH`=ZH4BzuoMN8CF`2~x^k9PSHq?=XA8#`SF+V) zkH+nkb(U`T_5zc6dB_!wchwEQ4Y&ND_0RsBZ$jm7AtVZxYiv-v*m_vwPPAw7+-vrL zy>tNE557ae>*no14;b<$^Mb?hg?NJK=`#(HW~yc+F;4+3xI{;dJ55 z2-2nE*wL%4CJTxI(yaJK`v{YlJN((63WyI{?N`LhUgP&)Af6wJpS++;Uy*zHC5 z$1s$TpYsv?ht!W0t$QyX%0KG#3qM}+BMWKcBT66N`vROOyzUDpW!+2JfCQ!k?-0A- z6MI+H27ljFiDTi7T-#Bp+DNrxQxaCZ7sPmOxUov!=n;%xLzjeIc67V(mQ_<4oNXo( z#j-V+elFGR>&pi1mbJ@6Q&h)gw?AzsJ-)@iUc@FD=&CBTRgsU^bC!Bxs}&|B?7WJa zyf`UAiz0&wcl7*@kDTwsoRn8%E0Z+_27LReN@K*`C@}w0k#K?aoaV zyY2aDdtyh?HcvEdtRw{{<=QRfMPEV#zf$EslOP=V00#X;(^32^R&&Kz$3WKzRgmw} zq`dCYsr#Y!g4~3CdfN#qLp1mGh}(X9thBTbbA!1uvNGDcSJD zF$uWP_X{_V+ws2R7)3!0?`H9sXr}wEs%C>4Ku!Molahpfcgdz7_%`HqZM1T-SNzxE zX+fAT*L7F#)}`7CFDL?fz`y>8Ovz{hwZ7g1eNi&`)JercaWB-7HBvuGp~ho5gM5!{=Aa+0~NyU$jm+T=_Z^{d^Wu zb?K^{S|;OVgS9lCu-58xHk(>2qjW^dKA7bdwG(eVEd`FAm`G9gW5Q*-+9l6k3O-jG zQ~GHkqYQlZJ=KKR_oP@Cucw@d&MIE~S)BSv<8aOA)Gk5pxKjM6>NeFXB`AJkc zuk-4O95+wJW)>)7%Hx9q!6OF4@FW=i^@K{pJ%$OMCaZJd(R{XPKYT)$SY0E%jPjL& zX8XsI(wD0Cxl`BJ^L^~_1~Lizwa?vdJ-eoS+O(!JD^e(Y^kQem?2cTURo#1&zH64P z7L9>AD}9+ZMoH?&G$GUL9AHYzpjR9Qb=l64wH&l(T=;Amui4YPN_OwoS-a_lqCLH{ zW?QD}R#IF+3Yj;NT%n3WLP2?qE9VOxYLpVdzsU<9VMjl9Gd7W<^UuL6qU8zlw zoPXOBt@gvI2i@lS$AxE@^{ApAMRe=jtu#`|%?u@mAAgX0)e|Fj+Sgz7zGF&0Job|O z)DKSFsM`%b1+DhRbn&+98l;|vC|8d(BwsCA$JQJ8eKvXM9m{yi`9_pkbCZMG#5$Xzr4QZkaa&IK*DZM7auLw0dG9yXEAF@tu#(1sT z^4@}-wV>5%@^({Fz%`!dmXx-c+_nchzjPEMcznojHwgJUBc=Rm>D228@3$PkE8kfu3~< zQuRGvvd%A7I_;5Szht=T;Q^vV$xNeQmt^HFsTB{kF0vhia((+H5!eN*Q+*&0IIXmf z7ez*pu2k*f&p)Lr;*gq(mBPnyzysc_K6p_)Rr3y^x1bm;6`mA^e5Sur;!^q_?gJ-` z4EmJIh^{ySczE=)zjCT_=hpYU&I1_{+irnFwEeOExDp8d1E@D&2D`TlI=Rn0=&vM?rL>f76Lkg--jus!=1LnbHZ;%_;Ra z8%YTVl(Wj^D^uyZl)doC)~IJv;XIx~F6^{)O}Mz5U$J~+qh)I2VgTi*KyQa6#cNf- zD2cd}P`ofV;6x$Z;}jOfQ9bB5r|IfYL%_f0%9m%pfzkr?8p^M?e49GzS#CurrS}{@cjWl4 z9tb%WCc&!+c4QZ_4uOTTRU-A31e*pp&ykPw;Fr^B<#DfikooQ0qflEi*Q1VQL zDWjJ{Zc#yDLFs`#-f^glT0*;+-d-a`a(s^jWJRG7T=rxhch6G|khARCZc|H|5jjV3g9?r>;@>-qST3k+QvQdRb6(bhYYCrt3B&p?!3Ev)#~kybbeF z4ZPo8rNI-HcxYt3E9U_D(>_(UcYNki7o+qQ?LkT5^`RtQOeLj&y(y|2it2)%ayAOQ zfFk9UD)2)N`#Z`Mu5@6`ySc6(73UN0s>darE~xInKypoW&CMRDhStUgD<$}BV2>|G zD%9i&i|>3pT>Ub_HSE?`_eXxI#H_-`h*aB90BMB_r)cYc&m{t$tV*&RTd9@Gbm>9LNFSXTDUOjoe@7l^%OG|(iN{+0n>=^ zb)Ya!;~lIDXqW=MGZAEj@e6?r4Eh5^yqJRqwBH#}SKu0+xkjF)I-T%|{K+<+Jykdb zWXQt+?XBD+3+;Kw-|1VR*tdw3OOJ<7*$WAYw-OGj9@OEm(H+L^n z`V(y`e~cJ!&@D9B1%ZgiK?geXh)K)rmz}#*I2~_OnG>v-9tu-6O5xrK3O!KQ?+-ad z{p|w`8i|>p1K+?6AM7Vk!%DP8-_TNM<3@?7!?Y7|{K!uqI5ncQPE-2j5FKFw9sLjY z1pW=zAQl1b7q)O1FkO{@hNmR_83`eV6y&B1F2Z?UDRU600iWvZLW{6{9{_w1A2G!D zUcS>1(M-7k!gZ*_Wn=UM2oHz;yO0TK9T(C@WpTLR6pc>m@35mJ+xKr1vi@~61rb2b)?c1bdBkfZAVlNn@ z&!_2?h?s~A0ubnb5g+Qxc^4jst5rmJ9LCvC2M%$0^ji|yTlHta<>Vr(B>G*(wbeEY z)3S7x#*5kn&Pimo^7`f*^&NiX8lzqo@lGQ_z<2I0{GvL8DFMW3!*v|Lr->nqnhA@` z4B#Pic|y8*FfTmhfiI#k4!;)0UfD~>J-x#nwYsu@&8wi9|E?!}ii`JX=}5Fb!Z&z$ zfuZ>CRl}$;z$kF~K?G-hF=kvh)rI$c)mY&=nt7AWWY&6GABAWMo%^fbv|Q~uSv4BE z%FpV+a(d8)vu{(IbHY0aSDx+hea!yi)oQb>WL{wBIhe|?CwioO->!NUu5w*TX+Y+y zTdl8hz27^%=rAdxT5`~~@r~Y;M!E)d_#kyd47kGvS*a*I5IVHQ^QmLiyh92Y4|8}3 zH}GnT4hhz+s?EgV&qMFQmb6{CdWoIX*Jj5K@!-qNieP<1cY!Mo$OQf1r$gMnSBAjf zuLhva-Vg@hzT;jE%vZVx171r1d1E&M#sJg54SD-EUiIg{4Jp@DNgOTZ+bn^jIGm3! zRHeL1H7iZ>99N#Tf+`Zo`IR{vIBh`05bwyN4Lg9TViwp$2*4BjqIKXePKM?;5da)Q#croII z6H_JSOs{Q|XKhLky~1ud8blhC<#Z5E(3zp{fPnc9kCoR2kYBRr5J??)hd{hD6}0Gz|OR@}1UN*`PoKqby4C4W8+6`a*eo@<G4+uAO%H6Ied zGt$@+P2A7KYeW!7^^kXdz2Q*%+3y+NBVM;T{^?#N2{p>mxQ-4ObZ?ru0_BL)MfZE? z8=!$f3BNM_!N>bg@uE>!HH(rV9#79~O>WGZd{rs0@-ixyHJ!P%-I-lx$&AY4^MevI z$t@}a`luWXZdX(~Q<^XkPKsvxP&WqDP7GDyC-vlbIok-pDZUPTd6Ux`e6- zEGC`vf@5$c5`n@=e=s3TK_e^~WLUCE8_k|))4An7;9QaFjH2$U-e&EUXOv6$!oWTTlkR+P_$220lpnOENE=#2(E-*N@%ohH|g;EtLNmLD9 zT__is5Eg!gdxk+6Z2;|g>A@!lQa^U8_-P5c%XtYemC@pNjQx2B;iQR=cxEC#P~LHE z0EVE8Ht{*}>|#dAszis<;km-AQgmFqu_;8-lqWG@8Krg)SZQ;jiNcau;v_5iTGD2@ z#+!swP0j(zD8c*Yq`X zOsdy>mLfQ4g!55@{^Iq%;EJ84cIGdUBHq&v-!G6zta#ux_M12ZPcSLw5y!FX2}I|c zz=NfmMdAsCRYYhNE9);XxALGo=nN76U;-TvqcX)8rkz*2^2KHh;xlP|mD{YP%6q;% zdr*iNy^`v)?S+dq9(X1ZY+mM(@bp{>YJl-oj=|E`q_fLb64MOlFH^ZJoT6Ta0B!Zk zRc1qiDtumxFLj`-cPPD=34{8;gITEyI%(WCMs2Y271=McVpUAAuvMng!@#cK4>J8; z3Bt4)t;GASSx3HLfAY2yZFvvUN5YwIUfg4epE<)C-7P-kz?(0&Fsa8R6U+7yhVurnCmwBl+%9Nd9cOkE76zOy)oF61METxQ)hon%9jr+$itNqPL{>vd`eIr zB7KeGswic$D{af~d7mZQG_Dklf)$H+8Q$M8gxH_Q6nNMBQZU~R;lWP&UmmdfeJ^^5 zD=L*3wrt!#yxa^6V~hIfBKLxI?F-604`r+E%;4zk%G{BaVSVqo{X**{c7KA;94Vzx zV6mn*QcA^F(W*?wj(>6J_-RXiVA>k1pe1WYvPziOHR+P}V;{NGe&R3g^7in!rz%=z zM6_xuVYf?Ud{gD%>Bb)L;kF2iSpYXGboLD`aE83Mp@D+s!Lwiu=Z9ziTUvfxG-%l3 z>3?vA{rv>UMiJ+=9H>?e7QD7Ou?e5?T}OF?4W9kMP=cuAznkF7Qyo8=ezUK34jx;i zd=qKwE8lMU>IQW@$`?hc!JHbD^1VRBU{@3vhjuaDtk!AdpnNlpUDjWb^2Jk54A^K+ z%9qufv|n81gGB`5{X&XJCZw#3H_CFYDt*7dYJ^7)4H>+iPYHdX%ge?RMESC0A0|av z`JxYu7N;YYBl!+3@chq#ft^a*j~=_&)^xQAZ)lXW#_9!Tzj&S{y5s>X42GwppN0BzaV4;ju8Lmd8{1{dNl^NZ`<|L^5sPXp4kC|wDBo@bWp`cvLy zCMaK(;#*zHNMG=YAGCy&FD&eR&KOaCYSPg2Eh(9`ezgF8C^XjHCx7G=dBV%&jY{e3 zo{3?2D?SkL@xeHYr>gfpGz$F)&*|59`4Fi*KR~pm&$NQ8nMT+ zk-QS*l#UM9eOR1DoXTNA*5(##OzOT_5{=4|LAv%5C96~>;|5uR6vEu)-k+uNTwQe? z&cKNGSq{kp-j?xAUxa(C3w(Bx>G%|r>#TEO*}Q0?W_`aYU*Pq%7!%LI**1WbR9%+b zHd%tzWV@nNv=bD?5ts&&A2_H?b*8^2ATDK4bHMEWWes68nmgNOax0Zo_u#bwi^n=brD4sIJAVDMVp8=*i z{VWKBJ|&NL)P`oS7b7ZtrppbJx|9`zIVe9VPkbBWHpLc+E41N8O# za3+k`zcfC5;ZA(G5K^G`mh!+saT=~UdvWm*r;pO|T$%JdNQm=zI`Tzn<3qQeh6J9E zd!507*UkwQ4z< zf>ug(41CP~%{b5C|PeqGp>~pDbS(lLlR{o6gu+zy7VeemC5*_)t1FaE` zD#h!8*N_7MZ)&)_BAZ%?L5@PkQE(dIEJWb|qz-4@M`8N{==z-oe@zRS8}+gS_a3HG zgq^Pf_p|5?jXm_0APNSR)&I80hPOdYTGBNBYzs{U+q*!rs1Sz3dun&uhtMZ%TY0*ydk zZ&2~hn8Je`xyG3Fm*rVEiwXvu# zL5Xrk0LQ`=jm&EYgtG$@tl_Jq;S7`T z^z@3;;etwMrs<$}P^hXycWh)36(OETxB=jJDTw#LD?Xbc(GCu@Sv=z#Nra-`m`6+_ z(L|R{H#S*;M$i50efH3YuCwv4zhJv73EQb5Hk@hNZViXwmXwWUk~WnM4^$eR1zY&3 z%Po=3ipDGw66-)a3RVBa29fVaEn54g5~4kQ$F=i};{8xxdH)DOaHFdMzt>G;u-mM^ z!|bt*${*yDE3%*;b;Y<+d91Rhk@|bR2VT8D4&pV(BuYPRV;idWcO9o&shtmVz~90k zt;+SsETO*>je=0y5KG`^L-PENn~~Q{W6;idjU!}9!rCWh?akLb>*-j`hNN|4RRNFb zeq7XRunneY_?0Z`? z-X)J%bqy^sM1rA&vWC;B2LpvFscCN@%p;@g?;gCa&k_3TtuT~susrw>GS6DQok4u5 z_xgSs62U|Of5xtQ!MSo^JU3=M#{IC>~~LA62+TIGu+~=V__*o zN`;R|^R3OKJl|@v%bzJX6M3gmlj*D=e#j{7v0I1bm48k2gh`?@{p#=qo|z*!7q;i@ zlUJO9TnRW|c&ruQ&O6pDg3}3ssTf)fz1={G&hhI8?pZLHl!tuvsglh+yF*G&183WW z&Fq-4?iGtI-I0~ZDO+K2ujLlBDqrxTLOs+V9MoY5E8mW8UVYW6vdugQlxiy-92kq5u?+`;;+6nT${PfJaEY(uN#P$vaPf{(+!q znXX0e2^T*3sFTBi_Fu5md4R=d3n{#A=X~}`o9I;JTV#o7D6>+#1}$_@-CUI@f11br z(G!;VFI%kHiObS1{Cahk@v1f-f8Q4Svmf|(Z=Yv_w5p3Gng5(k+Xj;}peP=#6?u1> z3Tjn%LI|U+-Y@FAaNc*j50n-M49HKlcT?L>J6V=Ye>#M}3e9$RpQ7DhCD3 zehajUXk-&D3Yj!i#MprI;I1tb?DkEFPGreBzExGdC+IFQ<_UKwAX@Gk#1Hwg>NwAOF z!qN?jFS%i`weW6Pr|bs}9q^42=iwO@<0{h}v%c9IG+4`lR_b`ifkAp01N29+zW1nQ z_Cv=lcEO5)G4tU|t=W>b3?8Ez7`I}sx0O$XkLU%B!yua3F=;!$`nYYq_AyJnI4h%v z89W4P7-)D;s6GI`OG#n2p1<09-*d7Rj_&pTOiEMWmAIH~W~??nWjnt5r0ux&87n`v z({l3G@-^bs*VHed#G3xG$Q_n!zhJd>oWIms-m=oNU9Ix2=r;{m(58Rr7ak)V=Kb@X z0NRTYQgeRv)e=61{K6;iu^0dTE^8?#tb^svB8v++#S^Xth zz|=GfYu9bh*<*ilqcz8h)-#)SV+aLI*&T0PZbKiw$Z~B`V#?<{r2clZ$9Y9&o5rOs z)Q7RcJ0Py*Wup1VYsjnz3Q6M25(jMm0x zt0W6zh<+s!BSxE4%w`wKGc1Z&viKytU?TFp-a{p;QV~(4^zF;!sf^~%@^AWj0@#g{ zItb;PuZ}B3OzeXtCcg6I&++uwpDIZ~E=|15OhcY;^+pMYuuWQ1Z5hv=rH&_w^0P?> z^II}D7%-XIhz(Vxtkq6DeLTF0EZ(8=I!YKM8cHgksS=-dE`C+zv*0TBtw3jwf;e0O z22P8~fB2}ywlK#oVP=(M7g+g}rJ_&WS%3bNGm4C}uhR5;^?{h6GF7w}|LHz^?6<#c z<-4|9*UqXur>14=q6Kn6w4zHgqOXI({Nwdy37#i++xQnAw%I3lTIPf$mTK34^bf5k zY(zr-fe-$xP2RHETDQzvp=8z~2_IHo^P~4eKe9b?ewGE>-bMp%}{;yA1s=Hv> zb=_VkIP;+ZZW0hS&3?RwOv#C-wubZy2}gaM^O_ zFY|o0x~Rh{M=!LDyx~Tb@vdN>_8`pq` z!#p@vM#T(mnX(JN_@v7QBm>gU^9yc4&(ID$T`8OfAGcs#g2yZ4KV76=7;B+BuT+;U5NP z&M zNuSp4FMU;vAyuWaux=SR81T^Zum=~kbvv%ROTtJ5laMPPGblkRC58~tfcFEzDC?hY zAsw$wu)#f^&FC}R?f#$n7u))Y`)%P=M#hK)vht=yXP)oyDrHte-DQsI@>eT$(EqHW z#Or2lOXZdqY}XHd&c?2O(kklTC;rz>_So-y$=ZjTHZZN;k)x0kZJ{up7O#e}@q^EV zG^&=@bq49|oZ&rf$?0j^{d+gr_77ZV#mO1R9Z_EuZs=in;*EUJ);fDQdt1fLyy~Jp z;l8AC=SG#zS(KX2e6yDKHxn{W_~x;1$RmM(XI52t!6R$f?prrnby^Bmav`Vm8Sw$H z+hvzDyZ8^D6yVUWz*{%T?gJHZ}87jyr6C)y^6e zK8+zJCq1ycVj{L!V9YD=rDcecFQip`~Jw~}g%hF6)! z{UZy!Gc9DjTuP@I?jfp7rc)1RaO~8FUwZo)J|)N}x<)_nW~;61bGkq-3@@j3)D$&M zdRxLnZJXJ!%bxm;Yb-fjwFN~bP(S*#wbFTCxr;#mB6vap!Lp}J^`XiNq|*foQ+esD z%Ca`wJT)%Go0i8*I`U%>kxqG(5y3_t_k!j_MF03T72FhdAxo|6x6V&oCexf1@`{It z_R9K3gSgMUoj#tJ<_t3t+dg%VZTakd)-%(z?s703J#9o3e_Wu>Y5#{GuhrYd zTJ!UkPu*=>Kcl>}X=^LW;K4Ig-(a-5_ojL>>feq}US^r~ORSle;$_^Tbd-v+>&n9h z6%NRus2{-@0}J^>|HWf8xqZ_5K60D!u?UubGNDWV9|+LYnvj5(`KB?`yr*1!mB%$& zRQ9nAJF0KYt{T11&fB)dTFOP?CWRrR;j-+y|efFcP%}?YG|uIE9HBw;)~7{cmjB5?2FA}lHTH7*4lhQWhl4mZLL3V zY_}FGU#REPB3N_su28;wYxHmj+V2{$Do;`#K~raFjfcW6MOD$ky%+I$P4RM4oE}Y) zb^Q5l_T+#0k|jrGZP6?S3?DYfn4_;k`PgR&*(@Cwd8aIT;XbQ6VA!OD4}Fp%FZk%X zW#g1Bp2%2dMRcsrF3r>=fADWl(p!uahT%q7DXVZ)c!X*u&8xc{sMWwE5uVZ z@sEt|(#^JL=JS%rU-7Tb^-In!n&tjx$&3-@N?R$l%ytwm35B>6iGYrA8FFagH7j5` zI%YVo5mcPr(n8Tmg4UBY|G+_a?JmVhNYg;Y`T0OW)dt0jUCgspRv|Mms;&^3c1DPM zQZ%E|0X(m9&xd@%8O7RFxyL&W%d5Y1i+H*+m&QG6Cr_vgMcrHcrY)WNj4he@2kR-_ zA%<7I9_LkfdWH}R1Fx9$i)TJ`4a8L7yHU_?mPL}w3|P%KTC?D^ln+3HiXwoqPBRtfNY5ick~1Uai>GZLQu zvcB>oVA3js-L=9qJkeG(V>w$!0+2@oDG63r0!r7aGRd1kaIwNlNM@xN=qJM98-GNh zdMG#Hbp<7mlCt1gCUtoIswYPqpB}c#AKaw&WUZ?HD=WOJzC!Ra&= zolykD#bJCtj>D(p=N*JGyGa@jFHh|!ABu*$JY41No%h=hrex=p<$1z&e7Mq51#uj8 z#Aou-hu(kc9WSd{4&iL)3cCuRr}v9G%HKlOnZ6JKoyPv&u5KyEUnP_JhW;#)WJ3v8 zyh=cS(tpsMe!U2vEHxP`s#M^ zUNB0Vb@t|DQ7YHUoR;Fui&k0HD=Q>1#%E4h#VpTF)Q0Ji0<5cvWhHb|GrT>>!t42id}Z($C2nuJ-{xqqNs?pg;*YM{2Y?Wh|8SbuN@0waLFHPkrJq zpS4t&(@WQ+^I2A6@Rm z+BHwe`H?^ouhr$w*Zmy4E@;YL_PUKd*oa_ph={tlFID2sZT0tQ#_7tx@~6rIZBy=fLWIc`zCZ17)J zJYil=wX8UGGtW?U!89<#7~0Vv^qcord_Z&2n)jzsek$H)L1-%qku72IkargL9F6+i^T#C7!Ba2I-sx9*y$6~j`jxp!xXLZ=2EuhgXdUrs8wy3k*zxT zjxpXWHgSR-y(;Q&@hbfMaz|21wNWdH=f!)XkC3rH@4L>fYJJ$p1xAKAS-~I9 zt^kD>(`&4pSgw2x>!>|sz16#%58*XWBHFMzI;A|KxYbl3Gi9B%hpn|HC9JVmOe~fn zUZ&LKWbzF+PL=K956pVLo;;BB&ozMMhDV_qxldmxGv=@wylCR-YNumCA|w$?MVy0~DnW9fgg(|D8W%4=j}M zN8f^X*QD9c-yn;$T?L^Omg;D;x#}M)?0wBEBhnRc#x}LR z$MY?j{>)rjyk!6IkJ`;nVQPd8XWr$Xel66u+JfRu>VJBSay8}?EnzXPGeOc?sv9iV zoDvQgFc@YD+urhadCv>QGt;(k=HHZxMY%GRppW96*F@`s3XFd|UsXd}zvBv+3K$Y@ z_2?QBI&-U$5(~NxM0>puI+AGy2}YPq<)&qBu_zJZhbi47aIgSo#cKT0$tUS92*0O4 z`9pr51N8%g&!?RPqn~@oCjaFj8=Ps_LdhIfLi6<)%840~0fyvnEbOr2@1JMQllv8h zX{A0@J+qGu+wMQQ&U$t?Y{87uBIJ~ZdXP~7xB(##yn--L8Ed<&{Ojjg{p11h3(w9% zx|zqe+s;3}-a1CBwrpGhc+!-Mu$L!=;s|BxUc5Z>XK%I2o0scOVLs5|?MT4;jRrA1 z81B4nZebG-sTkmdDFW}C8Bp%Y&oq1ur9iR5f#=iY_4YAf6&!>F3HA@9qbl%D-=GIZEG-P`AtCu~f8IR3eBIsH+jq~CkEQP$+&U2OH! z77AZ#Vqiv!LGjE!kcaCytA`60i~>hk>1i>SP9OpLifCvR_Dd!Tj}Si4wP=PSauY6O z5z3+$t%bfGpRnvq)dv6O9&3AgMDgGUjVX)1CL^`%AL2HH9g~>!)6d@ZHhZAF$bO{# zQTwkg-;jO{k5uYPNRf5%H9K_u^1I(<4=q~k9WOSN;+?SOdv7x9rQ~%wP{18_;$2(p zPpir#)x~`ejr5PkPv5DPRB^JAst)IiXSL_$qF@|4~H?1`9-P&ZT~9)-N`J0 z(?#&|-1a(v!NFn-0Pn|lfKr>>+HT5w(e;5G0roTi;#MR{xMv#i2pn8sP&=@&hIzs2 zo~h5dsXwNs6~!wdOcBoB{Im3WS~f!W6YwoBr345st*+QP)>>*z{k$!zw3s zs~o0|!HcQbx}}fqv%wEvZd2VEd$v!)oASg@cv*3oJP$?yq?Ivu>n8CtQ@mBHO91kk z42ps4n!InOlJRcJJj?Vt!cm7-Ttgdhl)$VgUxTtJT|s3eEmNaRi>h9}EX1xzVGG8Z z(*OVL{Re<$$90$qpBFn$j=&%%f*?SM6f-GO5|x9M{*{$1$?{tE+Pn6@{w=T9k+#>C zwGL}rD|^>#NtP8%X%(z2QW7ar6aj)FNCG4X5E+=9Q>WK2{NH!#-tIR&Gd)PdIA^B% z-dnfAsZ*y;sH$79A4|AXWoq@}VUhB)AE5UlZOkcb%IOg&4vV&jdj+`Z{q8sWiL38C z)WPZ59u&x_Wbm_X{XYH%LQOOUXD_6W*E*y(YyH&IPyAIrg+2zXp{&F5{G=z#O}e?Z zTdoCPaRE28B!1qL2Fm1mdG=w%d?tXdMCfRGY^Lu`SJFCljqlkjG)`We>crE3^Nn%p z^?2Dm`Wj`ZgOz(Qz}e~S^@9B)&kvX37u!hQkIhpSb-i=$mGPUs+f#9n8hYCn?!ci# zzH826eY*Bb82Me@a4M(6UER(=y9;^s-YHupR9QG0U#eH%3{%iBeZ?rnqI8{u0Z#*Sn$7Scz#_4Evm=qqDBVuRxek(B%s*3v z{33-MKn$|~cE?>SL+RuH<=e6kq1ion; zc!&P;w@2@G&-CMo1b)84IHGLs$>-G8!h0T%Q$PO4c+<_e?zGDrtxPLl4X9To>a4`{JszSmCD%-zo+$AIsoO%Nhl=aWeM4 z>-#`l;aUVh&euAXMjCIObL>BTDi-c}GTILui`l2o#N<9g3Q}<3(z%ntPhxRj_|mJR z_m=CTcdMVEke#xmq&xPdse;|_?geqbl#o?Omvr>h(Yfe>$HGURjSWxF$LzD`?4_M9EXHD_$kh2hY@ z|C;E%dJkntN9v;?%SYy-f9O<959lMBSm(Ai%NH6KhmQg@5I!2&>zNVI0X$~OOra}_$yE=JL$L{T#COg368VYWS+4Z%>P%LO?rOdaxXF3WD3dHp-8cP|N))0}LUje!ZA%SX_9zsdlY*F{llkYr?D{zIoiC?s7!&DaIz1w%G0PH$@#MdLTP(cq({XBfIj)o>*Xeb2<1xnAsEK*&+7 zLO_9MCh>DRb7FoFC%@t57|e8OW98jQ6WTqXIPp69V}BIw|N1~&|AE7?=ZUki`PfoS zLkIWYOriXy@PxVt=VN03Vl)q&iVYt<6tlnlP|W<^r(=0`BIa-2mNak*-11W$IGvZ? zq4mM>RC=)>ZI@9>r+@n1nEQ9{jqM*e5I2AFOl$*>O-m>w%9%hhb;ar6Y4A83?E@&T z2M)&6A3hqJfAJxd#&Rs)v@r%Cv=apuSWBsTxnqjB}GJ{lXi&i*!61NYOv^Jr}3dghHN$DN*y zOnb8Lp#}IRKM|+Z?JQgWbT7{S#}CEazx_aL`@sIV{gJuYcBBVxMM+ITZ@>L*;LW!W zoQ=r?^U-|-gXsMz>RVpD$F@Sm z>DY}S@%I1s6O<=K!HLV^Rx36^gq+4D^@m0%T;gXjXg)Pk0T0TCuR1K>c~E_>dQ=@{M<6TsrtGjV_!;;sUU*PAyNJ9$6OD9!_#AU zk&qr1XuE?fk*B`0>#di9;0jz`D1AsDGrpa&E1zT7FDM8YiYSB=1AtU2yCJF^b zf>QJR==>ChYOF)Sy?FO-6r)}N-ig9eK`yR6aKu;+ZY1`m9 zpL)>CDxd2t#}wltr$51^yKg@B{F4vF&EN5h(f#lt@T7(0b%$qvS>XzH(pUPd6VANn z$vFPEekCT}^>}>Ap~+m^cHPkLn>8uQ^uM2Km38QP`dF*H>sUpx?fAbx9@qciZ$$f{ z(>aZ6e=cZLk*Ag)ImItGP*y50f?b^70aLD@5IN27w0ur0Q*V99N={V+3Lx*z>zb+e zxuc$Er^&PJ)bHBuN*tUuchA#t?63Y(bZFyUM@DheDU>cekl%DunBQ~DA42Y&r)+sG zr^yG>e-xX3>+!he`+hY}+_pRReG7&k{UEOL^LnA|gzh2NxQBn-F%N1$`3u7F&gN@q zGdylLOEc)|TJ`7*k)Gb_R(^lJP^MV&kNgP&iE~ldpqk)SS$Yy0*mrqO0m&YKls}0Q z{*~rgL?9LMRywYQsu*qxJuWvmKF_vaMtz;wIQTeT>2Jo)#s9{5_@u;$v#r~C2QPt` zn~^jroavCO3WnULApy@oGpND)Vmzm|HWhr8Uns~RKpKb5ZP9N|(}^n6HcEL*(yrwv zUXaK08I&`nT%V6-jX5jJ)l;%w3jK5`C?_(43CJyWHrd*j7D|V&4get;N@~0WOi-o> z9Q1WZamn7)GA!U!P)5O#PCLwZZizG9SH;Q6FUg-uG)`Phlhb<@UOs=eL53^1bC)MY z6x?$2&2yk%-2}Jz3&j|+OnRg$S4EW;Uv-t~lP1pr^vQB_6PAC|wJ;=O58=_Hx;%&j z;n(vM0tBM(QlK{bppJl784>c64C>BxT*~sBTnAN;t3O4j=ZkDZmZ2cCTMe zIq@Clnh@nN;B@~Kz)F7w`-J7ppvZ|+!Fm*7ev`~|&vFuPS_2RDDg|wsIX#5*RJpim z(3xs?+S)IEYpkhP)+}==FqR%a8fX8P-;DV9vG|fB5j*FL2d3b6C#X=DA+CN4jylh^ zYlnp2u)F@4>A`(+|3cjIKmJb4{>~HNjX;0^elnDFA@R&h z=KjM6V%MR5yy`ICQNOI8DZFfx9-3|Na0h8*d-Gdd-fL)hsL6y(0!~il-ugqo9$SC& zaoQ@5wB0s19Z!0BAQdQOIr20v%-e>R8cQ0=dd>#dYo%|tUwV+&_JYYuUb#=2)3c>t zY%A^Zh|&JCeC4NI5ex5mEav~k`(o#j(#DN_%`MB7h6Oi29rGJ=c`d&I&zdv@i$Ycr zccEctz8`!3_8-JTryEcH@Rwi{K~Fa{QLl>DBRO5Km)DJ#pH;%>U+pJ!q2r*8EoUjR zjo@&9V|NOD6-X`xAY=5jb|1mhc37%_(Yp+jXv|I12TQz_KE5nvIM!X(5ajqCedn(J z%)}TzK5#r0I+MM+_o?7z-h$(L;l;voV>bDT!Z3~xrhE~<$svQIMej-g zc{1@+ky5WLM;>|Aw&vI-E{`?M!idMqcNwVH++0^;*wmZj z;Ka8=Lg+-+nf{Y$l(}PCZ+f}0iFoN;>T!lgez)z_eA9~p+gp~bC^m5?j*cq#w!6@I zxwRQQzmb@i8mK6DA}28=BnUxdnWZND0pIX#jG&3YgLyW62Eo8b*Q9a@eoC6faLHf&F4ZtTrHeEX1wWFKj z^aO@S_s&>s-JE4JBr4HoA5kSSLQ%%+L-wPP8-{p5NFlEXFgY42g=Pv&l@xU;OvGJq zDZ&du+S|4oZ{%cpaLfJvB?9%?w+x(Qbb{=j1K4sYOQmj0^w`YfH@1e{m;-)(d)w!l zn}8C3hhAw|jZ+Z>QmBBu>=@GP*QiiIEIoES=KsmNWBTMmy#CNAHqw3tt%78L@#J9u z9fULLHU(v8*vV&=l%K(5T~vU*Sa`3g7vuNM!?^jMzCX79(kEh`GIG-x?O2jN&}mU) zf~%X47Agfd_s37h@-P2suFt;g1m%E#;q9{PyWQv#ih#+(b4X#E(j&LuvvEc6=a-uZ zG!2>?fAj;f<-G@}b2+E()6kJV^rcsofsi|nxi`*bgC*%L-8B@TuRDzY z`gn=v&1;IG3(+fn};-`?>6;K|`r6zr3IxjY8t| z7G+1g-raGufYyZA%{{o^jpSi1&R1G~bwfw0-FV^zX?`t880p z?S?ld61SPpejO2-hA%PLC4@>VPu8&7_jLtZbo`AoUalG^Dv`XA4A~;ynlm2W0 zG|PZ#tw&VTP>-WMD9ZA=KoMdD1n2=Q!4s2T9%q}cgBGueqgaPW+kb}sn5H~^4XQ%` z=MkMeE2J(3$*_PY`;?ubMH%U#lmi%0YCQMA!(FK!#E_Oe+}-S=7&5?k6NpSgql4h= z6sum3PMyA9P!Kz~9JDHdR);~_MZs8R6=IU>q+3nFjkb9@QXV=1E-Ew2sLRWpvNXUp zI2G1xix;Aq(CkunUJ=*gI_bByWlFnu=v4In>APd%Oh0ZvGZ9^Pw~}^bUgSg@f!Lg+ zUF1!7cb2O^JxyC1Q{8BxfIF7mV#q>+A?15QQge#FkVX@eal`+0f9!hqQ_$GMF~E~H z>venea1Hx8+w#PTh=2cqn56%1TtI06|8nzT*60q<`5*Y`%_tbLtb4@*KPaBM&y>2Dn^^K)-|6~Of&BPD>N^ksZq zioSBC?OJ9$dK{%nTtU3_)XA9t*$?AMEyv5}P^8jp!ur6Ge2od(!t;Rgy6uT^XB5O$zOl^f?X9n9Fak79px;vBq&DZuyi) z=@z3>&?Gu(9n~1=QJ%anAA&sw6#Xp&SMZsTvlj!6py|F}JuKn$ye9VfV+m8=9w#R- zZXo0=@03x3;?_`P8~7(70j??SRNhrw8`<3*LYG*M)9rEwL2mNH(4ATSbX>Lc-(pkm ze$pI`jlGY>HS@oQa(;|5RQNg^o!pVFifj$f;Gi5&oFYkrUdCWuHcF*`wvETfXxY&J zSnOE*jo35)yRo_d(Zq8eZ%{qwO0s$UPVJ?j|BD58`X<0QY00N=MyF~$*}m%eV!_<$;r6&$M20zPoGSjyW*>X2EH9=-9Q+1+88;%@S$8|yko8t6DXB_hjvo-fV!-I zkV+EEe}Z<3qYA4{--$B{aUd=z;${bdp}~MMQ&A03VqMB;;dbBrQy)#wTp^V4_#>SH<+Xd1( z4!|phGg^l{%oDuQt0>l#nHW04J_NWMS<~=joIXWAkRrz+l*u&8jgq=R%HGccsB|_B zJ`&yK(>(QKxw)bIFappToQy3fNvK&oL+>=s6X-A6=FDG$dV@5nGL#)CwvD|9$uWTv z+Yx6vui$-gwuJWZY;5j*Jg#2&9j+f^7|o}mch7+5WuIx^mK(za-&>z`J8K{v)e|bk z7YoJvulmG>%6B}9=R#{s9O-;LdZ&d)e>%3Kk6!X!&-izh=>1^v# zV|Vl$TZ#V&^*Cr5=nmp6x8SfIplY(5?`&<(={A4R{@9&u^tvuSy4#{At|qj%Rf1TcyQCcaqcAdH3&AC3M)M`Ihb z+0w+Dazjg1X3IL!Aq@oRk#D&^;@as{HWT1om#uK`f^P?6XB^5c9y%QTPaTQPl)2TZ zV9K(*hKJ`i=`BtlIU5IGzA^d_ABimxcq>6Vi+5?a^Z{?$bml9sj?wOkRr*5nA^C<6 z9f?hspzq1Ax;h#=yYLcuHR{OU{Pe+C`jv;_p<&$Cw?FIpn#h%c_E0aHHe0UzwY+;a zmTuV?XHP89<`!PD`~mNhw%hJF`)5+I6Gz!35{NY_QcE!nfb^BSQkVd1#iumB3o8#cMD5Q?+{nsJs{;%WHdC~dn-&zuqX7*+4}*G;%~C?l1K zWzl!5dbhfHE`~Mzb5XhUJV7T*8f_Rnf>Jz#(zz*%^hn|zOZQTRCwI{bNYt!8u{x!! zR!*awGjZZU8sb!9seobJ3B1<1_EzFH#bSF8vT`xHBj`u+H0&fj4}OWG^J3{L`P1!J z;Qf9nPtBO=9mFBKFZ-!M25W)^GN1L9o#!tGQbIE1shK*&!XF!P*7eZD*TQ%3BFcBi z((fS=F{TUgU&d1b z=G9!ww3g{S3s|Vv#m*_~a)cVz#!0JGf&_%Y{>iV8r)IyG@O|<0)DOlp(?1aVX1H$n z{!50ZW`BTU5T9`G)W9wO3Sqnn?sLvXW`#Z~>QXyQBiV>Q2d@i+!k=8V{Bs@5+0`DQ zAG6J+4Abq!m})I$XuA~@$mIy94PijN4i%)+hXw_F8_#csa%MW~hw0`beO5dKt^V|c zoJyp;R5mI?r$@O?Y@q$%u(7d}c?+IZz;dYXXTV)$p%8O@$SGhwD)AiVbSZdFGN8Cl zpjdmq>aS=G36<0_Wj$}$Fo2BC2{x{ zzC1qmbyvp+CYR%^b#-;qRJw&eEvJw*B*4LTOg(ZUc7EzGN(o#Wi?N{v-WUxNv}y3i z2x|KJhCX#B&bA$Vvu=6{Db&iTCr>^tj9nkU^${gco$`%BtZ{iY|J)2f%C z?__&9X6Uo&=6v?iOlvWg-~SB!+KlV*WYXK6qAc2D8Et7s(94yldbe$eCw}}j@#Igx zF`oISua3j-d|Q0%&0FF_6N_=yK1q64I8*P2U6 z;Ac!C-YcINVy3LdWIsjJ>v0&5 ze*s}-wu|d*|8eehf-ozVAI&(I#zfuZaPq6;#3afW8chr^9*6JAI&Vq&U&PY+*kukMjV;R`uckjXLx8JezI|<+>D(IgU8jW_F*A4) zi|VPw(Z2RX6m^r#@)?I@wo>t^)s2G_GSyC^h@&$dU|Mx$jaDzcq`q)~5y+!1MJw=p zHah)%Tt_k2xgC1!;(a4FFMkZiQ!pqLNlfNEH`NYY2gs7*<~v4P$WZF){qS|jQoTyN zOTAxc*{;0K*5O{9eBZv9q78exC?9azG8c{b|bX$GAGRo!*{q(J>isY6(>py4;_nn%S4cE zcM2I4EmPU2LDWhQD&hbG=OpQN@o+W5yxE#Sxgk7w-_+aHoKBAxLnKTb(#IAHA>IkyH8| z1a{jiZ8`Ge59E&Bm$fIOD^1BSzD?-wVFhWF@I1V6HV*&uSH|f2E;x_`VK}w16WhLQ zR~-1*(b#utF?LRNVv;weH|R<8m_~u#Y45~R9HURSg45Qdk!^)|q`_6qG}58>mD{7S z8)1|5UWUe_Sp3w9nE%A_%)1_am%n01w03q-ilc0wUjD(Kcn~Exh&$U;(aHM6&1rq_ z;aKvGcpls|8Atx{Dl#d(-ij~!(202F*j((Sk6d&2d(o9P66fy|J3F8t zU;4^T@C)y@VV=K!N3?(c*%&RLSR5O$d>ux5!3f!(I{PLfCR*>OIQX%Y9<0n8c&cb5VTf0DX}1r4F_sua^hPdaH`ir%{}mcoqJbYrhXb0t_Dd zrHC7N(wQgPaJuW7?jUFD5;tUu82X*H63MuXmN#kfO#f-**cR&Af})#=Gp$?W)YQ!} z*Svu=GjV$Im2tB3D&k*}-m-O0E+2~>{Xf8vTBKb19|JlMI!ObdI3SETZn=38AfEDx zZEV3GdcFrIz9wgAIs**pWq%LeOW*sLhiW)NT=ML?dB@NXs}#)yX88K_cPTR#0-OL8YMA!_9$%Kz-vRg z>CvJ6^i=fDT)$I6sJABdfHC1qIqL`46a@uumZwIwY`v&S7~4r0l<{N-9Pk=9B|azu z6s6u(!Lygwna*N*!76qq^KvTK&^1txo|>LYRnNkQ4`;eY4e{~eLhNhc1$Ch(WlUHv*LHf* z1&`^+=VSBH6EQOqck(mNrsw8ka0af09#gJoiYsk)ZB%cv>5sotjxz!$|Jkj1=Km&y zn(f}ukq!$nwW%LBe%JLlbHn)bV5#JF(->`aW+FF);Vp{C%tV(lf{;Q9ls;5}5v;2U zE$CMIaw$F74OO4IW}Q+=8W}D^U;AvT%D<5|wioAOcouwM(g|qWCtsN&1jGH$|t#QOc~bSdhA4O;?*R4 zGwmj+J0@fJvu}yU&9i9)xO1;w`%T&H)O0Ee#}G;-l`{Vq8}Z}wZ;9Vsyq$LIy(*NO zaoh2uF?DK*u}5Z_j&)38&uDd&I4C1FoPify-z0%$?n6;LOZr9Vu9NVp(e#S4?VyZ_ z0tXz3^OT2l`^-WrR<8q${|X+Ze!2Q_3hE3iA)N z&LlW8+l^Semi{od^xg+OJVgvSHkd&v?}(EVuZ)Gp)r?RKdT7=jor$eW_r|W?Z%3=| zY(pv2898dhh@xC7uy)S|c+nuT8e!nR(A|dI#rcH6y2~fh^KA|mvVLhJow7#Qt|)#p zUka);77{sYSEgp&Ivn4LKHpPL-Z$$Z0`QT{m?)^TE^>~KM3r?--f&1x22Z6GC z@we%KKf){iWNdUjbm;@JqxU=cE;mSMk(tqUsEjT%By&RSx&!hVx;b@naO%%sIBbC# zm+|25fyN9>n8N9CzcoC6fSnJ@I0yR{jE`>LjSzSwt*tQJ_GF6g;8<*3b|V^evP=d= z?t+$Ss==@xC`$Zv#p$&C6&A|O>0GBpb6QuyxfmOHo^H)YW4;%D8q!q}Ago6zFu~Jl zSA=_G8cguK+PqJNh~Ql>Y(OyTSvi>X1}sBGm@6MDfmDjL3uQ5>0zeVwlqL#iwy7di z`8mbOv(udnRm*j)QXcTL6@|0Af!!(W^rlyZvqE|qPe|i(_Y?z{CX^k$)K8wGfJ*y% z-?B40ubWOqIfe3>QJ^;$l0Ht&PNI~Id)Z&QCMI@I#>2}Cv4|yN-CE0~EwssvMz)FT z>|-L`G}l$r`U=vjlO^hm{7DQNElPk#!*w-MS; zQr9eXY{a0=Wn7nB!PU4N71b=bOy6s14m2{?j!W4Zph2oybseTmrbr|jc z`L)r!ePi;wyeI#=_L?h=@?!?*?w=mPv5GSOm#4oz9_{Vs1p=Nl=6lOyk3|Coojai? zPp3eR(Yzy)d=WQ%>Ie!YZ{uiA6P4Zf_winNaWzrb6X#gh3eEgZDFC(76Y}eWF}Ub- z^h*f&RY}U#vP_f;)u_5|=~O>+zY>r?D#4_oX{sq{pYt^o;Ew;rgZ6a1ndK*ON`5(Z zFZ@PqS^8wm4j+%n{vo{WhmiFjk6jDD6}#tuC1#f&NvEL}ZGh^6YavLs#^I@Nh(W6z?cqrX@%zy2Gjmc^PJmSFB@T`zUf|U5Njl_y zl<@u09X$#j2rn5MCRrt1we|fngLPzg(@BL|D6!^59G>{b=(RT{zB_vFii!S_Oe~}J zU^+xauD@Lh>>pdxz}VTuT{T9sVxv|s?6KjFmrOAUXZe0S} z(5jD85wG0w$Fpm`GYBigv}?^+^^+)>4G6*9fJ0h$0SCfUMd8}$sEe>y$SVv{z7u+> zC>53BdSMEM>ds~RE!WoYqVf|PgtJ22I#P*Hrry*9-shBff%7bNh^xv+0i7N-c<2qc z!CO#fnO}vI7?%)kKFbY-5Gw#b~jHokhpY_&wSHU_oj;1KflZ>aj z7-#k)Zt;eneho@^it(z9krvLhEvGPsbUBW4An`vpYr!iXS^ADs-v(W$8S;KK)Q)d| z@cxuJZqBp)Bg%04GaVS@D0jImKKS?uX`F?6bAz_f7kxdU3O*AK#7hp+ z;dubunKX9%tABFlZg?E|_L11O^#0i1`(3X0#%ARG#Nc?+L`Opp+DV5O3+b7Al#ggo zt`zq>-{gU0fajG(e$bJBpG?Y45o5J6G|6j=5$F zK7QuqwRLq+Cx!rFLuWn}_ausC7M!NKmbVBk2lyPVJQ;B?L7A3^$2)M^c@kbh`MR#2 zR(#9$LVR#4f&SGFaTem!j_kw9z0k&upbg9mlRWn`baZ ze$&(EPIvdo@0ryTU1>vJ(wpBIk9^kH;N3JvzyKb|ajw#*KI>PB=e>O^K9oD75+`k! z{+kZHc<_KmGh2tT>%Y8uMNaAgYe1(iW*p=Oq#Qz&?-)_;Q1rh3RQ!vRUzcMToe?)5 zI}&$&@>zxuX&fJo#cbn9uaU9x%6s-^`Hs~yE$0pxqeK1jHGV33+>6HO9@G z8-5s@H5gxRB>Y(TJcpdMB-lLL=sLNZo|NwzMLGyNVF^`xjVXs?yaers_A1%DrA~i$ z+wXh}E@i{<^U;4zkNe7R!2ucMQjm?1iz+C5#^4;fMzJZ~ZqVZ2$=E*sE>LyR8^Ul` z&T+oHFhr;%b`l@!5%g9pkM!8VBM${3U7<27h4`cXj5}Ga-ctsd7E! z65xmLGMmRsnqPrB-9W&lfahLaPpUpPzYHD3ZpqmEh;WOHLoay$y&)`xXgCI6TI}wQ%K|W)#bS!s#2E* zrA!8x-q2V`@5lhOH7HWq^NeOG-|s?0?)@Ce%}{!7h7AbwY3iSDpG^-macQFTDupNgJewI^@?Y=jACNXWc0)bx~GJJ7xVjl+L!WCdE*8}6{5yA2FoA!ZjN^?+@9mp;}8Gb zd+((Ur0bjoC&r%EWKLr!8yt(Y3nTYH)qZo4C zI2F<5m$RQWP_7vS*MpP%JnOLVoW=^zrbs`>bUe^~rSD%PSfAy{%Z|S6_sa0``{d`V z|MDOfXEAaO@Hrxw)74yym8W?=j6RzGQ1|OWh(R_?J9!47RckFRub-!mt)Gu`F%dNq)ozIGaX zrZWeQl!t=)l5d`gH-7)dxan_9$F+ZRDz5sG$++ro&&KY*)s1WZm&v&1Z*GhecNZSY zoz~I>gJXq8;^`Hon8uBYkap#oH;S}N$UeISeciOB=UbLE7Nbjk*MQTQ)UcSCplyuf zNsWvN6tX**BPLPAGZ+}T#6bVbE3UE2m(p5%COquI8JyOt(#=rgUfplRSeU{{njp_) z_T6Gm*Qm>IRJjIbl}QW~EqY^+`)m$( zzxH|SzotJ4mlKIF=5tYz&U35a^dg;tbUu8U$`AUf5sck&&U^md5NAO?%!a282d3p) z+sg~7uxP9yEg=F(5MXL8#Q`0Jr>Ekv`y3z|AEh(v4!wNf6n;JJ?5@4hXestAz9-i) zl6jy}jklfWlwV;sga+>~1$By?-j+)!$2w(7%jr|N3I_3AD5gSG*BP_=C z!WQUdnf7#kMu5Q2BL|&A#QRbywD1NS6J7A=BS7a1ZVZO9D|Q~mV8B~yEThm+%&~<0 z_uESFp@>wh>Dkg&?pK5}c-wZZ-m*4I7L{++hN6_IzlYbP;D)Yxn|j_(#m+D$rm5F3 z%e{hrmNred5y1AB>!g(7OhGHB=qcN_SvHEnwaAI)T&}6QgL#sC(m#a&3c5AfErtzB zIM>&~#Z7Nr4I7k?%3~vVY@oeU9& zhM=GCfLpc~WhiZ&eel_J>*i^Bz^QHNuM+gY1m%njv_5^i8d}sZuFe=t`=L3s(a$Z|fWvwi6<0%t|Y2qF&x*JBIN$PJK_jyLA`Bdk}x^ zCw@Ps=P*p{KvIrisM(V}%Jv)CQ5>hPyl326UyfCUDtSM~IQaGcT)YJZd_!Xj`C5#W zRd7s?fnz+!`DXyK9`L*jAWa47khF%O^eD<7?!OQuO?MOI`Gr*ZncFvty8=(J@V zisBgc!yot8`Sd&A=d1r(o2Os*j{LbN2v*hr*GJMawahH4jbQJ&;N1P1WNy#b+`aTJ z+FI6aT28AVBt08d#hnDX%#a7Z+ZO*(-RiewzNLM>*D6tf8<&c>WeQYAO zZkmnlTc&dwJiTGRCDk3m5FDXgwrzhjCg;WNAb9QPDqj1e!E@u#0m44QGtoGBF!p_H zDW3UsJGO70jBQ(HQn~7djwma?H+AZixV^{b^2Y&g+%ucY1C2I{lKS%-UfPzYVnNFt zTR#Flo}ymqV13U<>j?MM**qc+*1Z>e_QmMPq4>aWL7V8rE!S_vlZGG;9jBJXqr#y( zITu?uJ{YY7=HDASyt2UC3z9DN)^Gc7T1pxLwcFUHf4c4HeflJ4SG>MHn(r`O5$vncL|qY0jM z`=7bL7tcQ4iS3)#r|*t!k41O>N%B2So%`a<Zs;rR zg@3l}kD1XYz?t??r~TYKOgj$4mxrICtYh(s_eGpK-iYh3+7#2%7Et)b{H6bR=6?6i zk5kU!q)U^&X&gC9IY$V1r$-OP!l!$2=;Mq-#+plbKX>*`DLq!k4uU1;+b|rI!YNm! z4dZT^`tF&!F^0Fc;&lg~irXGJ8Snj0PrdRd{Ju2qy7y4L;oarbx~DN(J$BN6MP#|^ zOvzpuw+BYcabUQJY#77|ykBKTeSn3sBn{>2=`#o8lxW21?kl;D$~V5}K}qY6?VH0B z3oiv}Y!cMBCBH%9D2cp>&fcs2G7&*J2p!9B3!CPJ1Dr~Eh1N8Woq~NgJq7DtMUZOZs$#4HXqxUelI@@5()|q zXws3^gF(uAF>SyL&hO>)(k=n{ZJk#dnclzcV=(7Wd%2NACLq3ey$HV{Ld+f`O~G(| za5Dp{fGn=Jluww3A3hy%50?DBcp3N2bA$9;2|cfBzB&{8z^Qa0^r;9;fbhj1(25sKL9#0lEmor=aoixD4$X5w)l_u$z0 zAmKv`8A_Rmv=1-F@Id8hDU9`y#EG)<#~uh}D!5SS?80I`=i0ARy>1FJeYIY@yf_tS z{)n04?$z_3F@`}g3D5j{^Tt5?}HzB zk}mF{o)20V_XhF}_fwBXhf2%#C!Gk^>wP{Wi1w3)G851HsN;jQ^S~0#gP$)!-~Oi- zVn~0*2N7KN(ce60CfT1h`DwGevOCUr_}La$r|Mh#Fi@fK$oAZWr*8e!+u(i(FAhF* zD&h=9*@0wL`6nJLc$ce73i06{bXbhWhoOai_+jY7eFHv`MzciOSABTjp9pjuq{wls zT7F6y`ro(|yp-vKW574ZoAC>`yf*&Uzx>wNxpy+Y{MRs^)clP5?fYHj1rN$UkmDBK zQtMErvmH58slka6*x=oRu^f*gb1lA)r@j`_WB#0gaXi-IB)x=7;|d8I z{6OrT{&RVKhU+E6%ny?O`{Td>pg>>0%(qj*1j_d?%J=tapu$-M3!*MQQ#AxC75lOE z<%XV}d%}e>6FP@`Y(swSuCniw74l0H|`UEAL zgOK8&}&v~{(NoTjOsYbc7i?yF0K%;d>38f<>Mtaq(f>n>+; zPpjLtWh!^-&1X00DYTuMQ?Lx>he{av+pLL~&w6lP*9qdgB2;vp9cWxq2xc7b5ZJC8 zYP00pGstA!JZG@Jtdl&XcXxTCvOv>ou?(R6r9K*+^_oQU8_V|O+)@hQ{E-YG+nuu) z^d)Hy9=#LMNPqEO{gE=1qTL86U9voJHy^Zd9Z$OWoL0X5ByQB9@#3tFKcJC~rA-AN z>901hPh_MDWALyXL(T|U2RP(xgB>$Y1NzE*8ZnvQVEOhZ_h~oUztla`0UwEAJQr^G zU)96=f>UWThq=1NG5!sO%fcp)+5sdV0V`wXvO}pa+fP`nS9(aR>M^0Fk!^GwmAvag&eYK=&x4aj z!-n~3q1jS)*2J=dt`QT^-$AUUn;SPi*TLx&_ylp8A;%Abx#7kq*V3vr z!Ls3M5EIi_<+RJ60@MS~B67eL8fF>iQg5FmO_2&S$-rz=_LF_*~#{feiWc7{)ysq%uOqH;|h1-pN2VNZmJUx%vY)vt4 z^s*+X$Q|IyTQ^LpQ%R$SOam<2168Vam3D$3VA;{d+sT=PW(?YnMcSBq8hBUl7a)uI zSNezI^Ru6|?Y}^9EjK4PoJFu6=_ig;%dzb$JV0vK40+i{jZl>t-W7QR#w`8t?bK)3C@jU9NRIsoS4b zET24S=&a_sC}>=`i7oLr5Vvx*>_JTLPyx!frq>86;Nw~tmx-p&GwI3Rpk0mTnHaW@ z#+gmf)1zHs!aMIhkTmU4?g^^PzEn2%U4Jj*M;f0CYo7~@)2LR+p9v^q;<>e{=dd` z^S_%Oo%8EXa~2YPA%_dWx$oM@!t8Z~f`@^)+qu`+1d}YrZj6;O?d&MjZ!1bWJp=^W zxpjT+g;Z|d0xm=3PhU>)M}@1<^czyI9*!~Di5=w^z~a;y1T^W>gGn%Bfm9SK3G$VV zS?h;UTg$ih6tV~)3BK~2WvbvZ4-sA`SIby=CS<*!Wu8mHEAN<#8IU)hW{NlWl%qMAaih2^TUDc)Mn zj!aWu}3$_0OVbleWR9+CIrk_6`-)`qomX^6hr>k^r zt3s!bLDF;~HQnrX%*}6(GyRRFec4WE+*Vmr)+In(-9VN&bQm3YvC>uL+r+53kRqx1 zXSJW}_EMg-cA0}~E`wYOpm$E+o1bf;3pG^b8HV6SPvZsqQ!d5msbRbZ?djrm6~UiF zJdHLVXj^xQ_Bt;v-_G#bD|PYupma6s&}mHG&>eaFBs8>-i^q6AtViR5rtdFj5b7&% zE<*z4d3D*(>)QK^2h=Q{ttKwx4Vug~Z%kfvjrr<@Unl%#Z0UbAX*k!qCE74XBfZ~Y z(N7ME7ZC={NtFIq()a#4)2Y~r{_DV-HnYf&=NFo-emgr|>#7{|aN&fjL16H;R_D02 zEZor3bLxvEUmU@KP>0oc>5<>z${;XH+3ma?al9Nmmi{m%`bTpe&7W&@IJ{LpH1M+g&Sirr4y7GEGi+PkD9&sH+NE_yKa2^+t26esP`2#6_gaV5XT9a;0#h>)uX@#)SXk=E-h&JDngZCiG0;=O4b#v_ zLCLkZJQe%*y*wU$FPo*bVW-le>7{7H5|>$CAGSuws}L7#Hf^8$5_% zeraPY^ft%*;^tT$Y>4ffr|=Hd44~jF%E}lODg|xZ>h@lUremRjveHP1N%}5#s`K2T z%;}}ry60?c-877or%NrxR-rwx-88_)~+WpLsavI(EM%&qW~(5UwkM`nVRuhjve* zJe{?Xr%}SCuP;_MY4Bi^^+{5u+ieo<%62Sp^^EN;*>l%@;&9S%F9wh0mMQ4m|BT^o zidFEv{FdyuqLAT$j9*QgW1)KX{&I%#dM|!|VYpCvYeUkStMX^yIko^4!oxkpJLn7@ zW(J2%m_zD`+3$;|X8s)E`{EhG)7-z9uy^LqMz1v!Q-hPSed)K5@Cz|;QxC4!`gsB1ss*Y&>UM*c0uJvE21r4d!b%~A2jnIj2TlDE`pQ~u z1$v69L|tnmkKWR{!SbD29#iIm%C1)Gxn8PpOFW3nAU?drP)OYBX>#i%c!0}ufdK;e zb#Fc$TQ&~j6OSFk8!Te)XA$;a3JB67PTNLApH=)qkb$cPQ;Usyegg|Jn`wfWA4-)@w&UOiC5gT zB|UK0qif}KjzUm}*=E{%L7I+*R5*T)qX+C~KGHjtawm5k-+J3w*n1fJjxJEAI93V( zc;Wb6arWSwV(!RW;?%y^#|_)=j6d@g zH^&{h0JJ`NYb=`#XjeO-;qwQx@KMbfMV4=9qm)IBXc(40{t>vCg97UA>R=8jBT#+39b z{hpiQGSLeUF1t?jkL5C=XWS>>L-!$qU1RC_LNj;8jyl|EJzpBiv6HI<&FvLh{AhAK zz4LeBeX)Uk;LhN~(_ft@Tn$Hy`JHda?|gwaBgv_xqIP8t*C=En=(xth{oI5~xMOwc z!4De!IP}y8go=Vn!A;BRDL;hR&~;q|@AwZ%q`({l6^4P38mNU&@}+fg zb^UL}>(c|&lS`%RGgsns%ADYC>T{IV#Q=k1V#6T5{yUDwV6YSqeCk*#UuApwF^eJ~ zRSYU5o^tFeVx8VBlDHO}m2icY=Nc5{zE-4l7!A<`Eqoy=NJYWbrsedv?X}_x5(naw z+DTj6TG4NvQ0PHE?$co5*=gydCC{(@vXfcQ6Ykd4GtC(QD$okg)7B`5STU2!`$S8F zqWi|%cwtB-o&r;vqFi}y_{#*@KHptLN@W|VEDenkG$?XSIG;(7^jIIV4$?aXok}=) zrqDzBIGug)S!WANKZmmy71*PN<~7KRT%?TvD&;+GaLE@lcGNjZ-{alK#@M#cA5V!m zhM{vt#qIPn7iEf@6V$9y|vF>{8%qeHtVA zbqAd?J^VD+Q5>JVJ2$x=>V89<@1BDllA=${$r8`q_+UJ6(|M zUsxa$tqo(~cYa4;g5}tTOjwAk7ykfD?PwW@K)SHShC7QTKF!FkW|RTqx@B(wb$$Wl(*8R3OPo}@A|UaepE_DsL}@(MI0DZ zWfnzO+QXY%ALYKH#k#>hm;eu_S*z!AsE7U2kBz%}@tQ9?9cRuA@Pf})a=_X>jfpfW z4yWUlC*YPp!XXyEdM^A;899@IF_WG@dG!1SY513Rt>qzW&o;UjVTyEVV397BFZa0) zOq%E5p;&b@d6zudZm>?{Lt4-@c&d#Nv@G3etMZT7%q!G9v~m??@%2B!sY=|qh&y=S zS)@Ldtl!j6$IiW{p;0TIM5&uQ+ev?tf{XQ(_6y~Jp#rP5lVbc~43dW~^6sUC@j5Pc zZ;!oDke$?7X_G;jEsGyvn4h4?K`ga55Vq&$_*VaTY+L?F+4z~X8sY?%vG<|^{hnWS zV05~y=(+xW8s;o=jGn&(n!gL6a4dxrBgd>493Z4~i?yBVQ1jD@TDW|1Ln97Pd{Z)l z-}&xbdKaC3w7gO<$_UV?d}^e^1$a)GfrKl`T_YDq#-ZN%pQSyk{Ei%`y8yynZD zu*6vo!Zd|y6`$VUbC{k?ux;+LqpZ8$d@{cIdyd8@A3Gk;9>9~Kegz<^C)*{Kqx{*h zG9{Z+i1vGWFqO4z29*o9smPK>g~o!)XvMfl!?(0J)h%_5s*PK%27TZ(c-{U=nP-~Z z4Nms#6C&3MnJ({1s}j?Il13_|oVIVpTfgp9?7Vs*KK|*W(eKLz?&9}zp~4l`nTCkQ z`M~E|sq*3y;KnZ7E7S_N?F_>}dKJ1zi$bR{Nd6&x_9r1vMI)^{&vQB*g~<+kEExoHIjtk96R zgrXQoODM|1dx~+RkohhZoGzwX?N0|_m7DVEhsvWA^eFW#-Av>!_2j2J2-U<*!K!yu zmpMh&oJlOoqd;j}wj0G^ye-d9rKV|HaLa|1g+{6E((l-P%7cHQqGO@hYAuu#$TD1F6FubFa?9+ z+bI{?nA7len=ctCKfPueW(^z|ET<82SE@VAa8$+w^nUac=va zWw30Dlke8H^|xvA`l6Z2v~Lcb}VlMXy$)!D6X12rr%P|h# z@?VxuTG0l0O!O0N`L(@3nt2{JlA{|pJai=9_of?T!SwL5hKCuFXMjTARhcW~!6@0D z^6XUu-?TN02}PcN=E5qDJR6J$)F%zskbDNgJUc)$!=zOjZX{FnzC0&rfM$8L$FfPU zY;`ru_muC9MB+A<_PK;+jhx>% zCF55O%oDGo6Fob$Sw6QoR|$Wyf*X)Z=O$x~Jek<^Bd5oIVc{(@{|G!ooDZxjlLQT!IeVWwP2^B5!mh=O+kr3(IZMlLjDxS@Ltnt zAxcUmk)GH30Y@v#^l$*J+wETJv>(l z4zi;NRY-oeGOCv!ob8|p!NWDuFoQ~W6g1U))!2e(oW@q@S$0ucjO3Ji6^NTcAO6j? zaFn_muB3^4(xl&?{o_#_{4~$FvetjN=~pBXcXtoO|GfEK@l}(bOy!aI6F(YQ7ZDg) zI!@~O+?Aelsf*F@9PpSWbt@iv<2CU|Uws4Y1=UDrNc^ZrWty9a*1(E#sji>vP(Gz9 zdZZ<77#aDKvGxUV`AJH)=4WuTJMZHJ%2d!&<^m)Dca6*Ol@t%o4@l&eE*L<9M`<<6LDnXQ*mZue;hqA z4@sIBE~q6vTLnD$W|WhK{v+`h{?+5Ln7zVU8)*+j~9axN;o!W%Rl*st7ACFm~xq+!pS)vci!p+uNVvPY2wRO za0KMFZbtQ$E{UbH<8jKop7SO}y6XH=$vfEtn-t;*bVV!ptj(Y@|B zM!S~&5L)@YCLK=yW#b`6T9_t62|Ig)1TBY)3#*V4OU zV)+ET#X#VFdS(gI5qk1BN&9&WO$49{6VVnwG<$7a+nAv3jc9M^$DjE>o{pKFdL*>C z;v)sFZCCLQmL{Ti6h$pxRkYE2QAl?-BFZ*Cx5FBQ{6&(p9fI?t^aVILz2)Huu9I4N zcgN{ybc!LVKtyb1y*bEbbo)sp!KVo3W-Ok;8lRgjGsp^Au6cYTAZ}Az7cc@A$wNM# z(F0{_IM-qoml$YS7Rm=pzigJlh~+webS8$q$sA)NcQaGBpD?sGEXKq}1V4)D>;X6A zyl@c5JQ@^wh>dl0DZ9OKo@U}1R%802FxEF0f;5_ZpN39J=cc^$D7{BMqzqYV#r%mG zaG*b62I(?;^{H4q4e!iP7n-?@1%8RI*<~7;XI&V_O`q5{cHqCo=x*wj_CxzxsVmdU z+IUgeL#|85CS$lr{YrNG034m=(@2=yu>_ZBodFndxi^F7{lC|YPyEYf9K?uo!>Q&% zkM=**nu)KSKMCrz1N{Hi@$ZaJ^sa%1EjfituT!@zHq)6lf|zq%Ch*Z(~z{tI~V zpHj~caBaq${--~PZSQ^*GpZjwm~S{(jwQyN3YZx99G;>*%f!jg?r<(wgN7XxsrvZ* zv1I%>{VoU8b(HJVGv8}uTtD~o8D~G2u_lz+k|$=ri!n2b>(0KDxPp5g!RifdDcvNG zI8HA&{-0TB#0~Eobw?*+=hA!AgVU>X+DMDTPIojZ7-YEy3~>27@N*mVC^`dZ1Dy^| zem%-}JB%?O*DU-YG;=p>VW2`U2fhLebp?ZYcJeCoeSSi=VbEjXwBp*%O#Hy~HQ7eR zz}6d<;~W0*Gtr)L?|@1`uapsoVDeXQQXnKhDIBDW%0hanG>uc+AsE*Iy@5OrHwAvl zs{$yyh>1_(EA`=C1X}qf6(O7Hh0;HXlj#+*T#HsLf>%r1DemI_DhQnJc4w+)M^U!o zpY4VhYLx5tW_duK-RvnjZjiz)vaRX01BE9@V|wE1PnoDR-@j0(ad0z}Mvo#+kVbw7 zTjTb^fi|QRt@Oc1ar3S>39`RPp_182qgPJH^uzYq0;s#u-&-3!cd|4buDG~F({)N@_7Y3a{JNm6o9GLmK=(RQx zb0(FqyPZ9pM0zQoWEvUGW6)%zoP0}e`uqmB;OnKR@b(VQ#J#y|rSvj@qtmgos zYM|EKRLDEaPeH73@;UPm#L3S+xX&rkzJZRj4!<9=_xcDqe`i%?O@7;`SDQPV71Vvo zppO%;{NR;(eCJ33C-Wq(xeka2gS4@&C4d7X%s6RLlsRSc?!|GTW-C}H|J`$!pQy{4(^6>q1N zOJBnqwCB*f+VRl8YQ>?cVc^tLrRf@R5o+o3>-8_AMHDpOkV4h2lVDeSmQ)( z=(Mv+KfjF^w@K2-uYMFfis{pXnB8|4`9XQ$;-)cwK_}Pq0X;!lpLqE*r3DIK7RUr+ zSBv+)Jlnd@9F)2ex56wHfPWf3V8bOh#?iO#K^inS^Q@C+8uOP;S0-_!Ns})$XziNb z`HqG5^~lB9SZH4r(*ryhtUrGnR^sTn4HURVs~{+3Fyg;RgS$EpPJUG^HyCUyKc;^I zPSQJqb&@_9FF7bO2du`RZ()%lB;3upw#?6~03T?y3i!yLFC3EUgWvJ3jcu~VZpr={=$OlFn{xzaJgA6{j*a zz2#AaCx|)S8q!?Jd`_@j8p6HwS2kIcihP7YSHv=Lq5>`jpfv54z8ZFtTRi<|S`DLe zE;AIP+?MrM^dF5T^8KOT@5TfFx*dn7MzJIv$?0b&%EAv#%|su?yOs3U_x#*t7@uCc zI^Mr{dnVMN@&~3;*}4urP1(*sU>D@4ajzreYd!*+e?;1^rp!Czum82*jKxnJvl+>k zaAD%-o%hLaUga^0^cU2UuGDQSla~AwPsd5V0*`WQ8ngNS@&*6VO8yC>IMuy7?=~-g zd?nr)rt-^Qdg-G$+rFAEo`|!}8)9m7AUdP@>{Cn9gfAu1?uI+oKhNdon$X%Yb>};# z2K!>ZeG?AAEMDEtm>TS*PkUHj{>n-Y>9oWoo}Ku`3`Ztj8;i}WVT69{?)_m*_Wk}d zhYD|HkTL}P)u?1b2LJ=aLEg-7{v4H`zmO*Y(LR4;SZjU>LGh` z4eA1%HtKTFCrZCS_-TvODYXKHirMnHGr z=MHFk{2M<8j_-$k-b#2?{Pq9ox8qQ&9jDzdL0#6@SE(XDa62bDPua^xNeIYqgddk5l=B{3_rFGG4S?L)U;#deSEw2T#QuGIh||81pFM z$>9MUn0emHL$;T`%H@o1MUPb_VV6qT$h<|N3Q**x9n$oB}GxRMc`PA@v6ZBV`ZEJ=f@Y^$MflZ zscgil*M{vzGV6eea9{uNE;QmLb;YZ^34}E9+!|(d9 z@&4{q>=&nz8?PF%JY2{PSFUi3`b*Kn@b^?K*MU{ic?2nUf?jj|)kPgA)O}Z4etAK) z+OK&BTyhf@ed-!;8Rx5GT>g-*&KmhO&cUg#j9z0KNcQ6D#dkx-lQ}i5;pqI(_;I$E z3&dP`mdjS)n%@~y?b-Go+O?hcgP85_jqd0qccjJ$luK+|nPw^cn{tspa?eZ}{iMxV zKH6aLKKHU*x9czF32kIUnM}sMnXds0PhZC~5Tg}hIvv0(=MBGz!OtMBT6#}(P`-AQ zM~Qg|w@P?`*PFuY3m86G@O0lYxg*}#+RB)dFMQ8+&eKrTG~Ro z4uVx<;F|t&ym7Al2JLsB{i|`Ng`uG(UMb-66Ps0=t=xF;F+>~hdmlCYc^u;(jBok3 zUmxG~fBbRW*PV?|BTtqGy;yeod4K{26E|HAM{dYM1q{X%uzxF>qynyR9;Z{0b+CwsylxsP$}RS4Ev_P0y(-l+IaiB7T<#r ze~Pw1D>CHLiZ_=L>>|HImVW-k=77%IH~Cg%{C3`|WWj$hjG4g`v8#74>6{T#?t7K` z@CENZAKFe=M`Tyfr_RdwT<8GszH#Hu|31fyaBc@tNS%;uU+9YExq|kNOfT~nYurJM z7e@!UWk3t?3m&vsWiTKGYBDPf=u~dA5jQnAq$0k-pGk81E~g_E12Rz&(2YEMS?ksT zRnzPWlYQ>PrTR*tqq7K4q^u=9{Nj%Zq{85(+#swdI3TD0f&6(+qQ}!{n5le?AJ6k* z`6Z3SN>QaU&-+qe#)0c{za5Xj+fQ{m(Lq7jx=zy_)!Y&P>bcW#qU(wvPS8vJlt zqwcTrZ1GgUC|vXnH- zC5s~Nm!G^;3HLGn&sD%hQ52dWuN{9p*FTnXJ~#&Loy!O63^#e(ogS+3^z`?kvl?;3 z!q4+gJt7~tS=EG9dL`$utieZfA`VP^W&Y@WBY()|ccL?#r#oxU(b3PA*kUU2dT ztR$ooPNo~iQ-f3SGjor`kIz3G@0&XuPY=%KI|pTY7g&RCE=g%@JiDfukZb>^JV zqt4p%Re_UjC7AB~uog;u-KH#_tK~ZDl8W8ZxEJ@DuTQ{_A4e&?d#W9KJ6&|C-*TgT zTTZ5v5AW!@UO%qxqa0}0v#~9jGZejnq6o2(w#`zu90ZXHN(ySOzJFi(BGe8J;0b2gUV zYTFWwFZaWo>D6Epo4-u|GyKQrY4G>*J@v zpiV%(xfJ7bo@?IdR&*im#+^UpP=Oe2{<=1&`Qk!_0@0EstROqo_g}oA$EIZ`VWnI7 zZW_8sKRRG_P<(-cg0ND+sdQl~n{2yfUimlU^@vlzG8AFJI$fUB#3LAq()i? zS>dxQ@Y#a2*ai7p0aC&09rwf+;Zj|zI6)^*53fxh=Qp)F1-#P(b`x8R>k?XdhBQ~T zr(%O^#3P;&Mmt(lcp0kMLF_{1Z2|{*XEQvp6Ys)lSUr)1ivRL+DX#>1r(6qARk@Z+ z!Vu#R8Cdv_w2W8~RB#ed1hziQBd@$Gt(Jx%^V|>o3f{DSm0g>+yC; z=(*IMc%=vhUxjV1|N7i2-co9*H}#_N_x=Xu{a*b2@A^k^=Y5CbFqz)dZPC_#PDA&= zYguo2P!8T0;5~U#R(UQnaityObO3Tpaj(3}W+3DFTfMz(P-e8eQ8q@*wQoj=zBYH{ zZ(qJAHZDH{9rWM}Z6%i={qsz4y+pq$98SdE>92_8CWZ}Ir*~Y@`tkw@C2xxu*Cg67 zZkqpYL{OD}UuBd%`i3ot`{jW&|-dgh>7f`T%0)FB$P%GvF5}s3TJb%Ahb= z5lpn4s{>vJb>Jn9VB9`J*LN~x5e|hu3VH>Io^Q>pxpVUioPM8gV1JIo%1j0E84wy? zOI+#84(_hMj^+O5>|grzn>X%?S5HjFo{kHm2-HdsB}=%)9HvVCae0GldI((8FjIjM z{H)7wiRHn3=l9i_rtnSSuZlkb^L7d!q;+_UM{@YvH7m$I?=WHpQv;ylK+0EJkzviMj2BT4^u z{NG>lk7C0qlrB&I?-Xr;CcR-Vr<<3-$ceC?cTl72$i}K5?K&^aTCl!!qS$I_q1%m5EkTv4_w3ON7h8Pg`v^vKFVqZ9ik zzl`>8sSJ9{t1?_B$j{RBOkvQnQ~*vObk*YfVsdyW-yiF~GETMc;{DmUasD^$&BVVr zXX*i9(21vh=(}lBO>+&P4)5ukJQtwwd*h~^KgboPc3@$7l=P(oYhk$pRG{Ge;s$9V zowzC(DyW6f7XuUpTds}=g=R98B;Y=+I~Yw)@gNczGdH>@7&5JND{)$t#;^T3y({p! z0QS*pf7G(ixH{ge+mY&f=R7)G6`m^KYr5U|fvs1^4IK}|pnyuz+Shq-3Q;A#C|~Q$ z_bM)~wenR)8Q;i*J4)QR@)cCFsT2WuvB)yw%O#)FPf?gFGE-?2Sxs%4F6#h)-=`wU zcH)K7_%>SDY4oz`hP0H{*R#bt{~uod7vk{D3@#nGn1%PLe7RagDrMu$h=Jk^(qM{r z|KMZMc-gnc&))P`prSjgBYwTpin9>FHQx*>Tx8CGvEsc7*y}(;0^Cvw)9$2ORw8gG zZKNlE#Z~EjxgqIJy~+UPr1*G$xbucMJ8^v`*w*_Xp7358@1(ow3qQ$UruSaozU60U z#$*?mMuL{UzFd$rOMb9}IJS6S1@R5qMo^V-+uR zE7P9*{y)bJ@~<_45{DM*49dx)^E4!BaGtM`4Qnn^xx$iXxTOT|5sG=WU6*ZAqX|a+o6&a~&sXF)G%rd<4_>oo>;(w2WNy(c{2c z)WUSY$!8XN1wMzsek=;D?i%~5Krx_d!DGC^KKDD@Cc^d2GqdscuevR6Y)>X{q_Xph zcc=2r^rMfn0=>w9PLatCULGBc&vSDUFsjZ1@>dwiRM z2YgxL8@0&mSND^1^ z{3S4&K5`vcZ`W^uB@p-dBM)7a=AYh3Ik!aH@6jn+b-G>LsaucLDf7fBJD`#`HJmqI z>i6U6xF>&opH07DR{9BHz zMK|cgrXIER;N8Tia(6n0nx7@*<|}wVn%vWNJmBwN+lyD=3S5CNQc!f(0wI;EH)Bdx zZ#VZk@LU9EnRZs@x-m)NrIP!h9oNMhXWWg1l0$K(V8sjQBamDDB}5fz5nSq*aSi(_2)Jq~hlGzNKqimLu;dPLI0r$Y^(&ng)-)io1#UOvFho?x}!O zp5oYyJ3CK(-;SeNOKHtLwa$!QZM}6{Vjt34eI?9q|))eH~>` zoy4=fCe(ls(xdWSp~J|sbr5lw8#}oE<9`zW{F@fz+E4DF%uzgp7yT!+A$K|tmZOKE zx=h~wNGAzjHrIbK4j_WUUc(`O_@k;LL*jzhTeYjg&gE2dN zB=7whMboUs&-=%}{|6|Dj;0^rW;n)Jc?so9zi7NRZrb&Im%B|@;0j!U&k;x^P$`ZJ zfr77wk}fq+LM=4P1}4M_N>Y``BhH?)AkEm_nvTD6^>wkQHR+01o^_qx&9E#nA^q$6=j$TP2Bvv zM`gQ4nq^DLpJy?fj|lge<}VYqNsmL)Y>(mL{(yxp6UH|gL3`a-@se}rWjDSW%#*0cSU>-Js!=L-3`1|kp zgLwHpPIWf%x0>-gc*jfBQ!C(6e-O+5KtoPFqims-)6mk)A8QaNy*8m%xGC~0dK87c ze&2s4K&5qP;!9%=Z&G}AEPXgO44z3`<+LruepTWY)l zSKtbK!Gl7thVzB7!lQoA{hIeFT&g$~asJ|!-ioRgA$8N_RQ&C$ULF&qNzWERlLxGL z&z~k9tVb)VcvZ$9KYLAlWMNl)dVY62y0|0u^=Gqe>qw!dLgh~3Rb#RuetG2-b`jkA z7gZfxGfka=7g=7tF$#t28O;ONPEf%0>6hr!7;x`78iPqPbw?=T<0#^1X`1io~CSfzruUt2+3|NenJNrIE|cW7 zG6pKJpQNaup&%qba_=|JE+;(kgMXe_m~OQT0G{0dn1&sFee=#M3it|KfiD&)LU|R| z7idM{nn$(Zy?VuIXpf@kH;NZ*{Flw{h#%f@8}e(3^rY=8oKVmxUDw4L%dI#y?8XO9 z-WcyWeN(*u)b&L!QC{WmAi$JWMd9Y!pPmp>I1g?S4|8ND@$t-U*KZYYzEQc9`;r1k z2~HJy?9Of?GjsQIn;X|?JLEyps(goC(r}+YoZt_iPvGr$!7IPxB}@+E&bj?@=kaIa z^#`AfYmXmHydT_ib^OC`_^wp4wmGMlQ@B!>P4_A?uKSrrqeS;f3X-Khzq=@?a75i)tO>3Fpq|RRyf#RoRw}j8w~2SXIE(GX|;r*6r`h z52?gZa!%nNoqBzoZQqcy4BPR9Hx8aId?1eSOgaBk{vuX>sQBP=f_;KMSW~^x3ttw`|-RKfD{|yIeLXs(W*D9?I7PHGb#t&GCn4Z;n4c zaf9-QvJ|tbudEE*Hou zHIIv*JDhWK6`fYb%8)e0_|&SCmvbCcxRx}foa2A?ucR_IeR*fk$jim3C~Lqwzmp_a z;0j!UFIFf*qbOem$2j<|cuvLB&5#1$^{-*PZS(HF;JM&MfVWxut93=+d4zd=@-B$G&b3PK#cz0p~lKDA%Ej&{IUHn4NxBv3k{F zm_RLXKbYcvk^=HQNT85&s=5o-p5?5vCVwjU^lW)vLc}UqwH>4(MWn*jYx5o%?q)O^ zSMc*k`lonC0gtvsy!D}n;=liychTnJZRv&mR;wRphD*?>c)}{5ekxqO;1cqi=6sXt zH~VUQJveug11goGkVWRR2P#vKU-Wmy{b|<`hSss}8{$;=x_rNL;r`gze+sg>QOTXq za)<}GBq@Q*i@!=TcgX|tU#YWz`v7W%Yv(s&DX(rClS}Kp0@B`tXSROr|L?rq(W`*@jhLkoF2R+-WxAbj10+(v-;i#OJ%k|@HhD2sZ>wSqX6G4G15F4OFh+dPE-4{f(TDf{TeJ&))KhuBuTsUba|^{=9*0-H1K>g4RtsDJz($| zZWu;uLn8*88*%&oXW}3H^IyZWa-$jrljOtA<@hw7uZq@Fu~fX{3b^ci)+5fpNt;x_ zWH(Nzm9Dg_mGWm3R8$2g?H2o<8z!JsF?57=;_bRJEr?4Vp_%W+uPD__2PBWv(zm|)A0*v#J)3y%|L7xsZ{@Hn^IVyN zz5-X^iwedCSP=x{pnyCd5K0ISMN@jJz}q(Nh`+eQ-_%3kBT0_;7UI`VKO6U)J(26J z?E&5bdMiDJyg}GBQJ(IG=3ZYyK~+vTaz%NNHLIB2rBvfljwT$S+);`OI<%f%T?eI{ zCu6z3tI~3f4yoDBV|0rby*Sz)`pa*#K+T`?I(6SWh~^Z)jC`hbO)?PIqriBJNy#AZ9%=3-GrJJYPVl zz0=DDPLK@f%$zpnD$mJ-XInRgN0D0n753Koem%Vz|H@J zr(#5EXq0v0O2wpTwEAEXL$jOx)7m`yig!5JQi;-`HG^A8p2RZNXc;3BWMJkmp5*PS z(p`Cf1+Ksq_&kF$aC5v@Q-h9vcNVK)8YnVl#2u5H;zzE!8!v1r-hJvo{F_6cil-LO z=D0`frIZn+pcwztmlV(XoK~%)C&D&x)I~|P;r1k43&kW(d zIZK`yt|-M3&m_kCB@IeAjK>4Fy!;tC>%kk&pBd!8axt~D!RP!#I+4~^aNRi-Fwc0^ zO+9PMG&Bfzee9{&cIb4{euTHBTs{r)Pngd(>ItT@6$h`Sby-LLHO=bN3as>l;Jq;R z{&NU6_7Bmr*;r_A!W+IiriaI(Gnh*Quow|F{+9bW=Q|3Ul9`MuQJ)Pml+VdnzOO;jd))^6t^6^KX%L= zjQK4aV*aX4c)hf81GzVnR;8?B+(-#{#rdtS3fdo9P>~ueGe0LH4YxM4$#ZTN<358I z3F19kRWCX>ec=H&QR+jdz43zm8AFYL9Y;^bEAHQi0^*rqTQr8AajTkMRw`iHm~A#q z`D+C=ZG`&oiXoIix@2s|)u}$$z|B`11_z_p+#Ed=-&|aa@pKq6&%>MT?BmM|s#UqS zA4{#7INpAB(y`@cwj`a_6@7s+?qQv6>_41iMsD}7-~T!_-NM`bJ14#~HZD$~Y}>JY zsS{i0o3X9ejV<$?*s?eoI~FPC#$9C-Ry~cJ_gox&xyC}gL#!-eIQ?>NI^mot?CRYW zxB^$;^9d9zt5eWI3UCycr#;Og5B~nuufy^m#6R2jk(gI1C?`;A#p^XF6UOp-P3f`v zEUes*dCSTT@9R|Or6;XW{;s~y@~eAi<5XD6sQko(XXTiizl>90wes5|e_Wk+7!Mww zd34XUvG1O~6btiR9fumF0detcY(MIA>z+Za*Q}I9le}5eslTgEhtKR&t zv=?G&(2vE&QVjb=8JAx}syAb)dR+%DUU8~o6*h3LJl1a(iE{tB2=<#WXm(@oi49S!rU?y_dKU}sUjA)+L(#B>Flrb7m8P8&1D+tZ#m%VuScuQ zJ?=CahH_h@E{5we#lgFO|AxOiIyPF0gTsY5(w~pR0Fpp$zg){PXJvzfQ_(WA&tB8( zr6?<}568ArJKAUQz5-X^3Vgmn8O(a5`NIeZ9>==Iwb!rTe0^-|cH-xcJf3pE@!s;- zs7gNg&2P);*=oa8$_e8uSh=qRtWW2~jin!l@%U7-LZx5@bE}B+-ncXdP+r`&bN4Fm z6q*_5%CK9$@KSP`woDEfsN-qHCT%O z>y7^*6{z*uGMAJ;g0g)afjt;3P`qoueX1|Jpj`*9cSEayg>fbP`KEwtMdrq)<@Q7z z=)OLBjcs%(_^M}W^e+?C`YS!{0SdqAk1XKdCLQSv#zlUH2Q*?41^jNh-A!A>*=O*Z zW60l-wheMvQMTms%yZJHFMCZl7LxWyZ}~@~d`bCM;{7QY;W!oVUpyU0V=0dG=5j-Z z%2*yVjoaKC{`8ihdk)kC_6l5qEAaUSWh^_k^NJUsCErBJDi=Bkjoe&<_DBJwXTV^0 zZCEX&EU1N-P?xjTBOX_r<50(p6_GHW*1KBKuHczr)eCkCST8=O(B1IDlh69$rYYZ+ zk`Q6#=S;cMY6SNaXh^-Rt7oR;?Z*~Va4Jxp0q}5<;zti+ZsSz^(s#cpp1yfUeB$;! z(Oe=sigw_ptMr6xi)Kl=8ck82(|!b>;u zwDJe}50UwOqdAmr54r1s9QKXh$D(uxgXf`u!EuGcMTvZ_fgbS4-&oH!6az`6RdkbW zD*b%9z~Vd5eOU!bZ}0EEF_xNFmG8$hfwABLcAJ+Ui>Vipco>=+h`6&MA;)!gnR0&YOLoc zA__>}SkAc8R8;w|j>(_%Lt$G=(S#+`|LW(}_|+tk?Y4gH3&#Qb8>A}5Bf~67bn`y*h4j)RCX$94Tog}G1uNOUUUCr z@#f!uD8A{p?~jG4Ry=z9)hQQiNM)f+bnVx*V?AF&?y}C4wkSM5fg+7l+|%IAyN$=@ z;}!SqEuS=ji)PUzxIfm?_qE-m%eLB1TC6dYbfE3T6>8Mi`e_wbW6po~xd3I27egp# zE^M#rj*uPOvEwq`<$}_OPFpww)QsuTi8$513KC<+*%{)&|Eb}z*tz^k(qL&N{VVFD zJKfCem?;O=*d{&tiXXD?=t20&m#w#Ne%m{8BvpeZJ$+yCoJ=Z0+)rZ(tAMX*LQDq(@i3t8=8#tArJQ@;>91tMm#v zgk2U&BD8VA%{mkR$y$>RsMRTq^1K$F z8O+D2<;6HMT8v}E#W>kt%*w$w%dpJxvb@$zLbLO|ieE^Jp}H4pe9T`%9p_-8IayYX zS6yyh?-jTLS73dp56viJ48dMWgtgYSp){?_1xKhT2z%g1wJwEGlo(rg$Y8cPA zf(wG$`+TnM^=j+qdd)ZE{WrD_oWdXcI{eFTpz&rrFywZW;;Z_k8=w$T47tHc3&rwz zm%krt@l|_{Zr>E2eEHS!r(begeB{+PT6zpp;*v-wPEU9eIh6-~5bbVgPucQ>E&l(P zTmFw!0&a&>t~r5z2*cw2CcEZ!NnHhL{=Yfi;>Jms4@o8r!i zEpbO@OI+XC7}M1ni$6!!!)ow5V)b&Ct0Lx~Ljl{Ta5M2DST>(=Pg0rD`s+CHae!z& zyVopnBVMJgfNU>wU z$4ao&@u=0(&xbWxGp~@|U%o58UwX2>sBp>8n7A)b8W7x@K|tn|9mC*iI#cmqnUfwp z?{WunzSqko1&@cD!#voe{N^k?a`x7NuEO=Juqlyw&3nd| z*W4w|T`dbz>E+n3a|oo($JIDXuc6d*;ZQ?eeyupOz$!s`S918T81jPYs`MF?s=EBE z%5kbai>aqMNmD>|>~ys9PA{0W!&aO{fK1|?crJ&tgDPC7NNum5GiiLde3vo?7k4y3 zF+!v1gMLo3b<4cA2(%knefyC!@zy{5MC`j|M;y3uYcxC5f%0wmQ->l%FDO@%0nx%)L3Qj z42V27>J{36mmYeqbyIuU99L*lL%FN|CN5b;b-$YK3cNUwXX|h=SgUwzXnpzSx1fLv z^OUYGA=gc+`|+%+l^8o7O1!(hk_|F*nf9&om@4^BpVu4zVG$y@g21s3pR;lTYU&(g`uD}&o2Xge} z*mca5VWZc_XeG`uJ`O&WDcDPaDK8#!XR?7BtW(ZqE|Ey3wA>lG~0IF)bxd`Ko0@c`7PXSP_mY zOX3{=bqT3>eIO(TmGV^y*Y}oG|8-5*C9Q_uZh`Dqgh7? zO}~%U3$-FWX6w^K9_oUz;R~rM^4veLS`v zSdFe0c?)6RhyoMPP;A&l&71 z^T0RXy5()}n82!?q>^da$dl8oF6*>&Wv1-N64rvqX)tCU!b%$ASJTS|)j#5$&fzwd zea(2eu4^Pv=X2P*u9C??!a+IPn20T%>A0c2DPD%B{F6}SRd;L_lDapW?voK@nI%7y40xr|G%j?G*Os^ZTJ#uJM0zciFu zt3aMq@CG9)@Hy9=v&@n@U*~g?KL*Et4duJp>Mez(?BrT2*@|n1sMq?y1l-(}^&J_P{p&hIBbBkowb}1wI*6+b%H23K*DxOAeI3TDDnC7D zoMn^>YtPyzm2%CrLNXnYwZeShiS zPT~soVmZOx)6t7X@N)x}@#gZI)FK~AMPcHaw8(40xrRblE4%{F1y*_Lg+Q%%FAS}> zZ+`PTdc1dCp_g4>t}>up;btd47?y<{1Qz9vyX-?b(2KDSkbJHy!(-*qn3Br)I*nji z{JY5D^&FH;2@Vbfo8jOnpDHmV5+z;`GOzbZs4`VF1Jm!uQ@#;Je0O(8+%>&3_B5tZ z)}5HZ3iWe?UNUBxcDJrFnB81a4f^!XHAEgxt76LpbTK?uE?==@3r7FSJibFD)ae;mO_j^uvBM0 zEZci=k>9cp@HE7+h%AEw#*Hm6jGi@=LnKOFWluoq-<&?AziZl*T1s1eFMhQ^Umu0@3)-jT3v&H3SeV#njSWe8=)JPD#8VUm9k#D5c zSSVA#1+rNy`AR4~TH2@rR5g{&meRqcFk{QVI#1qLWG#JhKCGm+sJ!Q|H#JzH&vdXC zzrL`fGG$)sSos8#f8}o}XBFGJNMhw-d4^X@wD~aQK1DcytehpSvx(+Qer+nZd~z19 zjK9oExcx(W8g5YtjVe@pJFp9dHSBRX3NTE?^OHDS3rO{u&ftkj#|VUuU*5tQ7Im%SRYL6-!V4^paB^+@x=a|M^Wobh&fZ=aMj zB~ExDinr`7fQpo3-`g5_y2!cn%WS=2_D%1QfmFIZUK$p;&+m1~x0{FYfyiP`rph_CYX^QT+8o8!*Twmi}6y7tD{*q$W4(@d^?LpKCT1xKpGF(#v1Hj`Y@}ZUX4jHbDb^=mycx_plw_lopr5AgmMe4t*g+` z_ZJVzJ5{?oO@(GH3@Jgr_8+$w3zr6QG~tCqHdB7C_;f&>#zXmBqOk?WuZFd-_I(MW zpVvx>tqrwsPScJy57Q1%;7dmZwrix~p^|Z|IkLz8`JADQPeUou-n&q+-ZA{-C9m{v z$`cr%95_g7Ub$)0z9`@RmNJAgp37D5R~)iv-sc-LXRse5Cx;JUTpq)^+k*frbhfcn ztAUsNWC6$$hdKXV_Tjzp;FsMHr+0WJrIN;PK%R~-`TY~I@woJ&3=LMiT#uTbrM!nm zXH))o*oMR(pu7qy;=zs0F`F&%eU>Ztl|wsJdLH26asH{2ZJ)7Z61zIc5eA##v+2Zo zy`Vugg1+KWhLt^)XeLfR<}#$^f{Qgv)^xhE{tE@NSpZ>NU#x{3VMzmM1HF^)2&K2m zvmx;?mYWQ|r9>ECrQ#tVspPA?=E^A}z&4&3F2yN-8EV*z{mb)l%3mOX z@vYYb(9JtUii}!dMFxMKOs~;$R9-b6YoTsyDwP#jZEp=DypSe})^wR?Kx1-uB{&dr zSLTZZ=^&KzNDEH3T~J{3M}7KyGHLIx!PJIKNiPGQ4;OCVg}?zoJLsr$^H8n=icU)} z93tDV@}k1owXi-4s|jxBgJrI*|6+JTzd=9yujww+WM0~daP4CNq*n|cHBE{DT`jlf zm9<^ssOVmUPpQP|eWQ~nacL$zGbaH-X$KS8&c2y zJ9flB_>J$$I!2>oAbC%G_dk6)-u}~zIWCf3$RF_;k^ViS#ds1~<&QCF(DmRYmHRSo zlWlSADl>9B4DbB0jDcg0G>#|NwDmZZ#~BY!c75?~3$8-Vx6c{US!rjz@>0rf+ie@5 zh2yChQ9L@nxv|Tou+&)raC#wNUFYDOZ7sJN7sXGj-siijo%#1dAWq{vHHPCDtmReZ z8_g?nE8A?nra8B)#^2rZ&sK9nFd0Xp74Hs$<=c`;HDkd^SOnLo5Amp_UKc5;WU31{ zr^JspU>unXzqfoXwFG~0VuXUSWsa0eP>L;?D`l}-rtd^Q*N}OiLS_x2jL&qH;A@XM zDCtFNro7x-F^rSk9~?I07}f0UO~rxca?TP=q!|w?ZXcMp+0+1VU@M>;s2U#{LIoG$LS;V} zur}$WB4}r~)t(P!i;tGP^yD3!lxh7v*UZ7a!s5AtJ;+bVrsJ@6o-+2aqc_+U_p{?t|I4&;;s6We~{o+#m zK0q%SGD4>O{-1wsyz}q8g`6jNac_L(&paOA^S_})DO-^LRlXVykHzNr zqxP2ko!}w7;}O<#O}LeIYs`!=+#NG2)V_U8e>=wHIZ8^UkZq#9$@eJkZ0jZHzxG{` zH|K(Bl+g{eonO{iZkKA8yrocByeBn>If_T~GOH>G`Rq0yT8=jj2jBBcxO z8xTPXYD-BpZJ7j#M8T;fU_J*>L5)Ys8K+M+YD{1yj0u>!(c>UP58Ud{y&k2dr}szN zJPh453QsJ$WMUea3YIvrHJ>OHFE^7XG4d**t9BHHTju6@v4V?i+d|uATWlrK4j6}> zkjfq~UtM>46WrVBS>AcDN|Xz=xj-r3GHNE%woc>2c_N>YTn?&>m$6>?1!`K>G?7`x z^Q_R!wmU@%U7bK#PEYZC5A;&?jf1UlfH}=y4>XxGmAb+ut?(KjXkdL*I~d>@>Ro_) z&a#Zb^Qm7*0ZN<80JUDYTRy^f82VFnnZ~|#(nwkpcyAuDS5ee;<~VttkUV1l%CnTC zH{2Zh`*m=RQ!B}rF9r&)Tny5HaQs+5ZPNE{yOyZ(c}}p(%NK&0uPz4Gsq|3k)xR-b z%5?TY18aSvmVUc)PDfVhtt)3&Mm_59tkmxegkG!4$V)*#+C|7>i;W3_*p2(WOXf!t@pG-Ma4q9;;Nk!NRH6L|ALmRV%GPtEU020X&{-Oy z1r_VL+KVHTln39IN}T?0(KkgwUmVuber7 z)Ql-BEGsXCuc^new$^}XZ1|5)S0z>ivSJEQ;5Z%R_rSF>)3OtCdYICa0Yy+=;#w0} z7{4#DTJhR<=jNkq%Oy^uU;sYe)2CU#_cbF5DI{UwTsx@B(XzEuO_$zs1rkIe)PrXQ zXX>y>nIH!brDjZ)SLZLv+8^mo+!BXkX&G->BP6*>vW6O;aWG8{7ka-ES22%lT7*s+ z=(Pe}3w2!W$rm`ku8Z|k&1iXufJ#?m$FymkTaqIes+}v}R^UQ733cpBJ%loShg~kM zEzr#)5L6E=>8&|G#0#g>Q&@X=ZZ#n40eDeZM}Z{{v@HjQ7J3>Jg%<<|F6z*i`7BtU zmUOvajlURNgbXX7H&gQqf61U>0k@Gan|7)8U8;ghfVr)q9tU=NQ<`y;!pF{j4p8&U z`LK%Lh0|1VS(gTnn80)VP2pMIK4-W%9t9-lc$$8kCG%p6`alG^}q`MGO9HgE24pj6iB3nw| zrxOLQrIN+~(#Po8#){^`dVM?o?wtOm?iPHNiV|6=$SB~p-)aKtk@8dJn?R&aSHt+amk9ZbD-&FMP61yx1 z`bFLvIP<~1XX9SQ0P+irQw$CJA*cF@A5#!nw$E!|oRs7B*N{dWo^@SbDp<;Q;P-d? zj`EK$MyCfI;4Qr*c_7~>jm9dtAQb#+Sc`-F=?1fGH|ZppO&qNC+gCk@cA?!hZL+AfvmHd)lexkuY$fOkQa+kH$Alr z=Uu@yVSW70O}k3}@%Yis!sl@a{(@oZcPil&peua_j#ai=;YuUpl4rdVpR_X#f0L8o zV|m81bBY_9x`A+_y&PZhZ+;`DkI&IoObyqHo%%-J<=%&sIm7tv|LJA%tAEWO3vR@Z zeZ^z3>zOmruMA81Q<0=6bre6a@V__e)%!Su4Xdt|!3Xzc7D(xJ?Lj0Eb$75Alt%lq8h zlYJ_!i$Y#o=J@k^{FUGUnL>tcB^}03^C;Id#jJC@IlJn<8hRw-EZaU*2^XbY=v?YN zx3%Z;hR^kN6{q1I#xbV#yf?lk^jgUG)jLBHb2H`LiBQ}{r#wsR9$Jp}9R1el zl|f266;=+!%wr)%@#-m_TTh|YYTUUvl=zZH7@_P3ucvMle*2Tq^izw`g>m{Rv|*d` z$#xE`)WhJaOEspBm(2>4f>yBMeFMX*|CKP%1bzPA#RwE{8*dbQo~kKN2CND_w~b@4 zMk$_`4mxQl^_-$3sa~#zRAXuw{jcc8a0xbj4|E34AM&q5;`NEe0ay*TJVAQ#J*}W zn!mbG1QvACBVG?G`M3gW%fC=N#`9!f%A+qww%vy8__blK!!Kh1)IaW0_m|fk;}vh! z^06NG#%CJt9N)7ke&qWeiI;uoXr}Y6?X^AL@7=I1{@dMOmB!2<`3hy%SVjqR>$J0JX_q9G z=Ajb)a>`hoi1r_yjnR^_j5MTgx%UF6s^0az7HT?=({f!<@sl=j@T}`wCt`F5_b0*p zPv@d_lKzJIol#IRFC*AG=DBe732Xa$E%@H4Udv1!rBO45JbMN0+C#g~Alg1Oh~-6S zMP2oVV0+iR_TAb#E>-7RFuhax<{ECN-FHsLXah3kI1vw{NROS%-;LQHd;q7nFo@{% zCt$=qlhNOdSV9mD_AN#G7|7Ct<>2vEfmTo>XN99yVZBMm!EJm#*}0@Mt<#OUgP3$R zLp$)?p{7+g)I!1QYwSb>OQ!?97#v<^kaUunZD8i1M7@#=0t~E$WBto|ktmQPuvRv8 zDRTY!LXD9mI_Yhf(f?%FQELH-6yF~c$(>ot>Zs%NBTi=>uF97Q&NX~_q_4Zpb;6yV9ukJ?c9)H*#-o9k{ zFBasDGKM8X|IM9f{|S9dKlSm1k~EhQ3jJ$kGl;=kCZnwna7O-sXSiLT1m`1ou8_P0 z{T-jwpXIy}zJ9D9&BJ9(LZfHHn=YM?%!ld#~B z&(xou48(Gi(ZK!8x1n|LI8}HOrw?D6E17^i4!c}qE+{9g)@d8cHRCLoYsOW|vi8FA zbAWuupwb1G8Io{5V+8I4;saC0lma*1{%L zeF_KfZC%cCIOwKe_`4X8(7Sd2Vj2cc2d8H`Vo=~E=CrOLJFMW`dP`fgThp>p zK#*?$Q+nV${b!HbpAKx-eEP1{Y$xr_qakJn()vdD#?#-(0HSPRA& zpDGrEq-i@O-nDoITU*h7(68Q$^;*M4s#+JsaXp|L%cpBjOOkl-a_D}Xnhs$A@lK=n z#lWTNmx+_E3?{z^9=smUq+>*0Z#c~lXO&WBt@Z(^2cX!t9es^ z#aEtlZvzM_JL+dkDp!KMO&j&}zV`RuAG=QbseObPB5X#ID9yKwEjxxbIOHm0IVwIHhnP#;g%(o){iBH)x+l|4kJS{`5N8pDZ zG9Sh3Dt68vP^tNHX^$}}J?nM|*+$}oG?Zw&osmjAjV9ACr&HzEEIinVf-`CRc;u}O zM4yERo~ECdoHj0wnt83a(7Du+)W|x`ZeNr>U%9tlnyl>1c+(MDE>S{7Wua5w#x=Gg zN3X-7Bu``N?>;!{??uo)g|~OSFpp~NoCc365}8x*jfF}~q28#K9WKGE{FWnua;rb> z)C;w|(N?@n1n=->5b5#!2=4i_%h5hVoC#|MU6tY0@9}uZ_ud<~@}9I3qQV$`(#W6M z6p|pMv-4HLshl^G|5g<6%O|6;K-mu<{2wddVJaA{C)fY7R69U*S?-0p&b5#!RPYYg z99|9^m>1&b+MDlXzz+0K@!i>t;qiWSKH7`new!`rN*PJd97Y9Hsv03RtgT<1@|u5F zVTeKHfgVM{Kol5IT;e(u{8vsy;~;(V2gLR8u*FqVTg>xw4g1sn!w`{fYLE)*`pyCR zUe#V~{Ux4N;Lwqzxx8@8;u8`(?^EI+s?WR*!~)lCct=H4dZy!mgmL5 z{7z-(8r>%P|2sR;d@sWHaSfuv{Vxi}75D}4us zAVA+21I6;DuY>W{n25n&!2|vY#LI9g1})beiC+gUME~al8iz$FF{0p&W@i-3KRg|c zpE(=PkbgQvr_zZmSfZMVtn_$_oO4TBEu{{`H%YH zgNNU+gK&L(+rRrTMhh9i3lUCQ#-f6rynndy<#FHCO)1mrWh(EB)L?vbFF1aZCX}0F zSx&^rZoUrZ=N62x`;q^j!1>Y&Y%I}FM?nAA;`8=_cdgGAU$ai(bLbF z2ArP8o2M|qaIzkN#t+d4?!BN6GG$q*NKoo%37f9A5 zE!k}-*kqHzKoVGPZZt4yC0s_=VRde?9G>yGM<)k4wc%8>7!<{hr~vcQfD&gzZMYy) zClSiyN@MMu5?>}a^W>I6@!sU`B<3uG?B*%nf#+eA`TicvONr#C<{WUAo7TD*QFfV@ zsye))fqzS$RVW^_xYK$P=uxJ^m#>q#OWt@HWlxdzAh}V1`E4Ni68AJN3ZrEEsWZKI z-qqQKs?W~@>7ERb%!ZN|oM}kDqg#J!M*%2vvw{SAbpxLB|KP=8FG ze6kMI1J*-LYxBiyc?F*iG{~|hsqaqcaf1GMT#DIlr`U@Hej%{j=L&1n*1T;06ss6o z+<+38q`pVQuh2&vUkbPwt~o}$Vx2cPcBAjq_s1N7zUW$H6 zW827hFsxB|x2xF{v+{#O2YZ#j+~?~4>s zhH_<`Io8_<`LB5NqjAR*Pi0+(%EFhXs&y#z$SUsi3;0f zP?bUDan_KCoCl?`sVu0r9O3|@Tr(4c&84#&2SMWm-UiH*)5+P6qO`0dl><0lmS zUL*~yF;_AzIy>>g?Y;oyK%)#wD4r{KH^L6Hbov}6Jw6Y9UFxZYZ|R`y3(}XhC0j_I zs=e8I6Rrc<8V8tz22?#@KtY%9AchuS%)ri%(Fa(2u5CA(NFR+P@NGf6T&qatDSfH3 zN|BxAfyWve)KhiPARojK} zdtoge33m88U>lRqUygS}`&-XKfBN0VDO@gC=1T~*k~K76j`#75RyTF0akf70&jnVg zb78Pob1sL3n#zsWAb9>1iATqzTv}0pmj?<@>rWKL=6zrg4{n=`=KW>7$qDDes_eOB z`_}NtTF7a36pw4APALkW#MRt^f$lOGUf?(n!tf0lGlp(N2}%I3DZgn!Cs`%oyddKI!B z+HAi%##QnvLD48P9{!;}hbVl~t26w}R#5Zg`0sLeBQ)sJ3(iVC1szBuetB9LIW^!d zSI0!U=$zGUlpS&z4;)kfC5q*pbruSWMU4LpWh(#*<8p7q zxy|VVs?0{(0bCR#HLfx}2q!VcG4VnHIPDrY;OX9;Tdrd8&_cAI#`>}YWhNS@XKMN~ zxFm`SuO=v%NE7Zf47$9t-irey)~dn?sPn3ThS#C+z63!BKBEVgqVZ&px3nEg$hHZV z-?9DB!Qq#J$hv8pZFF%z=}#UPbFxHmg6l%^QWn^Va%ynNFX-ao?cgJ+_72vnsC zD3;AxR#z-a>Cj1!D5;j${Cubqp67ybtDul6({|tqzQw*N)@Dx0ziDH{b;P}UFo<%2T{2GQcao0t9aab!9)2$kk8kz-Z=PpHOhqq$1iHH_V!1GcxWS6IEX9A!cN)^~L7Pn%zU`Fkau9;SlTf8TyPXFLwhr<` zz=Bx;?`@pc(GUga=8~8t*&S2Sx(d8c5&x%MUH)hxjc9lx@rbK%FvW z!L2qxiZa#%mb&6m@UAJp3g^&)2I*mGOxVW`gq+H9{rim!@>%Ns1L%-HJYCB2Py{eo zDd%Es6UJ&f56o{)^DFR#@sjfWX7G4B9?1I{REM4NmQ-zMUyP=40rNuOlG&x9{enR@ zoS<*+?Ny!+dHGW>@w{+2zkkNTes`paLkv(t-#Z!YpZCY@M%iDE!1ZDM@}Eol9ipv@ z-YI7^Snt$0gvSy3IfjzgN}r8G8iX$btS`q1{-XO6?04&v{;`$u`gR2WA1y}Xu5 z`-DCy0}o0mL&C9D>ancsN5X$>-x&`zr%~K~4_xYAI|ZHctb)3|QolSG{u7@veM;%C zfKTr1M)MOrWEX}iW%twND|yyq)ARa_`s%pyc@Q$0^HS|gxddj_A133IK~x*5;tML@yg|+(5 z(|PZh_wD6|;+=qnh6fCtM&=Z}_05yf`n81^EElC%ypoq1${4Vf%7j7-#36K37L0CW z+`non2Jb$TO9Rp+4^Dyq<$}zm!w~pVHd#;Yryb`?n-tnAc3+PafOEivs+y8C7 zC*$tn!F=EFlS35~|8z{`N-!j?V^nz|{fZ*COy%V}8`sBu&8;cVv}J5dJql`1SSWX- zv0ly%1F|cMOkmV;RSiP@gj#ujx z_aP2o9tE3F5rW(QT0O>XvXX;8(>LUO6j0ntK0xW2w0hScm~O;XEO#XL>Plq zG*!nXAyoVoQ|s;N>AF*Nq$Q-#rf3?ec(*h{*#aDM$41N*}Cw$CziqX~>A zjmlvLZr*Yo9*dcG9Xh+eh5qc4;xNi)rTMEgABUQzFBBB!3QO3Ai_>RiYE6$kKgx$k z`lsfj4XavLvG@zUlctxTd#+im13B|i4K4*uQSzlwX=EK3;1SyxJBOhibaGm*2&CH3 zynJArSJz>o({}JXW}Wg5?=DS%>Uv?gRQ5vSich_#&CZ17DQKH8GB#9KUl- zx#HOXBfrfb=bz^Tt2kR{0z7hIfKNP?O!=`uPf}-XBsx>#h$~~RC|cW5f00pWTT1ah zm9B9-*Z0X2Dqpm@Q^+24v#mFb|M{N#N=Bs&JkvmN*2k7Au021x?0i;b7Ejz(*^|F} z{k8F~t9GNH^{k5ZY+shE%6b(p#b2d=ycYQ>kF>V8lRsTDDkB}-sAlC$6lDUqu9WSS zeib}s(stK$&%F+bb%DA&YH%z_Z%eX%XHJvi$kp}+r^d;Bc9H%ufwV1UL470gZ;eO2 zWcGY`=ECxE6=2Ie(8NA;$8=-P){rS>Yu+W)RptgZ@u+BId-^6)=W%Vsoxf7`kP);T zA?g%K>9~@qbO@DAQ2VZlXl(Dss1H&0V<8;%@NavAbk(^bb&WVL50_+59lqA(Ho%VkA2icfx8 zNI&M7%XVBGQoh>k3Mvw3nQ2wi2eG9c&Ff~9cB7||EqLb1Ds|JqBYBHI**Ef=bm8AQ zgdJPtrl2aX9ZSpF(cylANT2PAB-^l5F3SbhtC{^U$FPgHb(c8Uoe zQs|go)Xwjxb3qPU4^qu)kRoBTso;}BEwO?|ZQgy&))@W%(P$#r>Rsw8p!_A7?BB}= zDiPN{{R~6zbNEfr<+o0NgM3dkc)S?6lz>n9A~mXHwV7gEvd~)*tPetiW5^hVWez#b zVx<#lUL>sT-*J3%Eb%&V>%!-6or!p4KH^zl;1E70fq| zv+{afNF~SBJlQDHi@W2A7o!^{BW}XuILNqu4BGVSu}eA?fb`>^`-(K6O5MbBpK&Ge zDvaTlkae9O=V(>lxWtyT5wh@g;Bq}do%F~;9;UI<52VjeP}R(Ks`%%-^DsCEF4VsX zRl#CXJEnz3+@lAY*WjJ+pjS^5w{Iy%$1zf>s&Ze)Md;pW?D*Hbtr@EjGdp~e3ifm( zwszB-8=`baM`)x|s+Ewar_9pw@jmggoC`o|XOW=*O+d20T$&(LrT~OMi66?M_I?V( znXGhNS`j;-_?}6;O&Abdng>b0;Ca4gpy6qarJAvL;QR)sS7v9d1LCzZeUoKdUTITK zor$j-imrh+H_S#H!UB5++F%5Dma-mmvGNqW4z|*6pQTM*_W4lJ-ug|Fo$C$pRsA(C zqyP`-;AdUp;tuEAHza=X$YPAnst8Hytc2I9&OBPQmI^NzC`&xF0Nb?B848}osaT-k zdkeT-Ga0RqF2=xsnx2BV zn@)6+-s^*D*Mt0aJg40dhFP3#Hh>cm&Fe8Bw~)p)wE@;JY06Qom8Wo-p$JC$M_j0P z_|-7aADjYlMLB)-9B8mEjMMf)VEOVeyt+!G3N#MzvI5!D_ym0HSgYurT?%7!h(3`WvhmNGLp96_7Xj8W`^j{n=4&7>;|Se&xu zmRq&8$Z7MG=k-9$%BCjrQ|4&odX3L0JMc>z;AI=4xv?F?PoK^MOzg)TM>)QHAd&o} zOp+FsXWW|lv)CHM*GqXSxSF?0lsbdkQbj#xF-fkOh~Xai<|sVl7)KG;rN|AY)5%QX zAU@9(F2HLJQRQml1~MAY!@7+aQmx&SIArJs-|t<5HW<3g;G>*|NQtw(!~67rW6M9W zNkm}bO(0OWb)va*IxP&328_dmIT}S$>41?1RD`7BT%+Yy%BAsCYPcw5--_+}F); z08pNWL!$#T?u58lJI!NsHU!RJ0;}rFtHtDFDbLRYY+tt5_u?*Gf=)Gzr?S{2UN(k8 zT@u(sn|IM!&w|K)Xrm|NN9Jj*OB}zsHXrwuXSN<#{Q8h0fPa?by&0^h8sN7uNVjyN z@z7k1=0Q{@l}8wi=L*LQ!zHV~1k`op%ndY3FMJXF9zF}24oqlP4MG*rxIij*m&S2D zC_=7ks{`Vk7D2Dq%tqr$#?uk{1yf#OQr^%>;QU-@^x~lIztZ;BTQc7-Tdj9zx^JzSS&uFq0t=CS+;GR>tf5PRSG+Ys0#bjT<{O2~R&WDv=Qs~+T>13cN zcO%@dX-DHDXYy59aw$oLmHw{A^?3i)apx&v(&WY_+N{BrKZQu4uW60qdnV38k7|rs zR7EcH=B881$}jCarReiS3c**`~}2m$GQWObxX;?b^4)SqQnbX&c5+zNGh-V&b&EE&hW z8`rL%!3zZ^b;SOKXe?Cts-TKxo^-r0RD`bDTcD0RAEfU}S+pt9%D#seEMqfxT!kSu zi@sp2$6lOQ=<4K!Mv8fJgIR3(hoj~;m<&(1v5{~Z%iIQ>JZoHP zNahNxU(^^JigXO^m*tP(>Y7>I_}d_M+z!R53}Q93Ax5@9PV0ONu=VHT?*Ea z<2*=uWXaT3wK2i5bqij22W$8t*ID5k%aT#yi=>Hz;2Z|OOptv?`<*e_ihy|NWVQ1_ zDBg!cGx4iwlASL9T$)DfLS2sStngSN>MUj7fu;UoJx&QGF;&(KR9#`SX8y|v=>>3g ztcv3sH%7Py41eUTO2)q!cnUMsZ6 z$BaHuL%Ae0Jlo&~`fEG#@d=d75%946CeQZkP4lSSPXe8bz_Gb|pWx=&DRjqV3=h#?D84i(%#^%u`Uh>K zHm8+ldA2(RJe_}u`kxD=aI%dGZQJdl%*(e#^e{{wUx=nl7I+YTI*|gi>hqdG&x4f) z0~bqEL0XsVfg2=rn>G_(wketq;N8hX)FCxefXEM3JvECYt?AcG350WSy$DE>>^Y0# z&nQP4G`eXT+Q21G&y_?g7CC)H$Ejed$-~PA$q|yl@r*JUzF{^MaQ+y8^tlB6Ukb1a zhpW~3>5C+->7KoW3{Yr|?mtoZ7?P~;bJFYLa7p^D>A$t*<-r_|6?i-8`1t>T(SA zJrx+QA=!afuA7e0W)vUZa2%%JRM0M*Ule$M-VEUyeu4()$n(6VF6I78+myx?z7?+i z(%oX#NgXW=i!B?5%~-r-HCpBk}Erq`Ij94l=cuKlh_&lO+0vM{WUtIt9j*Ou#(R< zWSc5lGU!^96ES!hfa7tEoQP3RK7cw7R4vd<4^0IJ#ASriMsD=L z#qZ6VWAs53otR#d_Adb>O{%);d#)>d=?nYoHSp9!r(-nFSY*IeWO{LsWnZcT9Y>}k zq@s}@=%*R3cWjQJVv_6sz7a#sGNldW%R|aq4@%0TeeJsyQ1*`EFP&igA*?j3YDl_{L80@xacf~^ zk3iyGwWY?LfBsMTUdyKx;9d|C(|0%r?x)V#H|kYJo+E#x?>N+YLm6Gu zHDNX0Igqm96XQh(PMNOk<(*$>cz`RfLr8 z=jPFJD|bl?k<2vJz=wpX2Pa{|-FUm(2#aW2EP{qibfNky#GeyDoVtD$QCWv520~#- z@W`n)?kzXdS8+1P_Et2n*}^SI?xVww&|z*+;W@uUY<5cFF9c*PI!jy}P(q=NH{!zk zq%ZeXn`OAPG_TnZ!yVmdxWn$yNjxdaNUv5a+Vu5I#0BX0e8Bp%k7ObvWF(O+{{XcXeD1dbVppp85WncDw;kxNffERzBCTQb6#8a!gbu_0xfmUs!_HIRK@aLpy#N30ok?t6$$H&Z$$wS6_Yg4Rz|& zF<27L%=5a;jFgI$?+bYV_Eac=a@vB*UUg7SS7p zZco;%z?~xC+DxG1ZV~sia2ioZ-O!*HUL~(LDIfl$`Q6HwGJ8R8XDhTbRm$sM>dp7~ zrF?LLO{~ zPvi1drX-Mz1Hf?|p>9vN&?!%QsA=|WK8gu>!J--4GMe|?mn+f_An+{FyaOH@r_^kj z_Uw5y;H_hl5iAJxIOQIF$LygKIv@P$@m!bbd&If4j$j4dT!_2k}8Apjbo>NS#9VeKX`?;nA7Pk z(Px|RJ$pd0GKQbb2`}}ikym7XTQDB&1sP{uKiAlQFdN0p zLR6#MB96$wBVL9&&Z;LBL|gNp&?XxOi;INslr(v|M05`IiuGRLSubchSgGaPI2#d8#jteR$+p~ybx3gG_YBC7RUESv3+YaZ%V=4PMZL@q>NUp(fp?# zc@0>OugeqE^f7|M$zvIM$=b3d#xsmlBT?-Yeit8l%R0Nc&=>-g7! zgd>a&o-m6(Z zlLw;t+5M=PX);bZz5Wu1uBQC8Lz;rjvpfto`g5!5{rF%MKfM$F49~h?efYQYA5i_; zp(y_NuH%!D+^_ug_HS6h_J`_AjF$WJ=_ZCV-pBx9iBEKnd}C}8Cwjqa7E#|B zjnW(4Jcv@Rv1z9St%Z*(pwrl_fjY`^Yy3-jY-2-gCL;-|H1>K`QQ~=>%LrZ& zDUx(;#_v9zjSFWbFXVNWU(5JhNDqCy1D>kF5#oEoZ4TT(0D0jpc5x6SuBtsE*hzVw zf>LsB5f>1^q9V)RlO zKKiCALRgp78wu^%7wQCYwR?}jl*)8=53Y3jdf?1U0s7Q~+SlovKi7-&k=GmN z4yHv-pWpYcR&I;Bi!^E4M3-2U%1^niHs|ZL23yMNRC@u`q2NUrW?aRcIpEDu;=(;C zUnPa%X%ka7Eb<~xhjLdRfKKr#7%$+P z8c1La>CAmeofrm3Wqk56Z;Vc8xh`m{YYm~rb9FzB%aEFqLG1fEu4fo5B-%kfalB~P zkdUnIJQE$+IArksmwHF%;vYYURfI<;IGLA3smITwn%Ltv57>(UK1{>LBd}*5zjBXi z+rW3#Zs~>ic-!fc7-v39uU1^j>ShR1FJ`aZ?Rp9qX2J%akNn4sh2KtEpYmWmb#hYgI3va5YaqS^zS*qK(cYBoZ8tamB!gQb<^7g}`_xMgSJ6{SK zv9(PB`)2P7{H_&A>|rPm4Q53kE!?*w;^atFME4sznP>VGYlp0K3W7;Z zaXI=iu_!N>xgwB`Tq#H)C|$Qe4%&e-OYOF%uHXh>5)Fj9ggym|*3_bParkM@F-8IO9@u0wmGI(I~jIvd5;^2VP^_&5i@v`0s# z%u}SYXK&L?>j-}I-?`o;pnx8M@;C@LEK@v9_5iQmKP&@E!sg-w4IHd)Y)#rA5ukKd z++Etd3}}0&dUHs9-95M;d_r1I1Sj@Ixm7rRc}LNrgG~NpL_lk`p=6>?=UC_dTVCdy z3<*RRt}smY@-DJG85A(Mt<3P21BXPrbY2~k(7ExXm85ktpwJ;|S>V@Vn+p`3c(2?m z?+M{8C9*R8AVL}dIzp#Rt0jIzcIhC`&Yq==`QomOKI8~v6gJjR&6=-5;`8>fEUk^U zD&`iNF)3%^5bxRQK1J8>K_j1#o4oyjSBw(=y{EH@_l0LX(l~u75AXCrKl?16NmiKu zMOp3-5`=@v$83dU6sWcg6E>^9|Jccj$%EddE@osn7$=>Rh&HUC&uayUg`uH;6uM=( z$~0|sZm7>e)cJHDkC+)+;JEa}{+)6%L^~N*q#-%914a0=JD$D4JVbkQ{vvk&4r813v{^vE(L1^rdM6B3gEg`S4!!J26de8 zcY@ydvC58ixON?l9|S!tqd>+$abwz3yPp2$ov>`F!NiD7A8lL^4QarYE9}seYCT}V z0)xOA8f=Z>EwOl7%5A$m^RI75w}U(U&0U+cLCmVj~2*8unlc;17L(4B6p2UnAE zD0w#i;gKlhg~T^faDJ@-Mid*;pVZ$JUDzdTLCpFF>hBLi&ix`h;5!VfpI(n91KfrR zQ}ra%eO=Po$>@6Fetk0X7zOi2lcI?g=rIQS32EIxbhfG)R0b>VhO$Ndh#JpgrCgL!iW__?Ew zJOlrY;T`c?d-p7f3mr2C#=$yYgOyJh{-Zln2|wf+P7OvV8yTHC5OD=ZNCu1z(v*Er zutWpsrE!Ny2N;*s@3AXGSjI(hdNeBf*N-LB1|Bt?x^t;CVp^8HV3QMCZXy9e0E*2K1osp$oS_ z$ijvT4H`H5Eg%MncX?kEg^51QJ;8| z6=nCsPyfAv1U&)={UEQcikMwHxGO2&rxJ!60Um#%4djur36rJgy^5NC8P!pFOR(G% zX06D$Xfp=wj-4RK9U$W}&?%1w^sZ%lak)6}TU#uc#l{Bvz{r8zUp(Z7!d(2K* zj?IbZq&SK*8Y4RzQ8GR40n)kdHycDO(+$H{brPjG+w9yE-ql@soG&#_kb%3UkRQ*e z{q1F}B_wa(`~yF>-)qUP48n_N);7*j27C|*5{u_b9xbo{kcaUTGGcZOi~sU7f& zSBl6-c~XBaGnHM3REWx_4#%ZB9NS7)-y>3YGTi{j`Gg!|D)O74)WaqPZ6!STyJ9BW)z2Z%X%J-^76fC z%5bR{4H$oyAtuUY5z=%onU}}E66$jLg!HI`a{)&}8=eI_%beA~y*HZ-E7P`4PhI)k zb=KE!C(!K{&|cV~i+fDFG4OQ1)t6mDhp1(tW8`ZD)6ql}S#*AUUo@`Ccus^B^r2OU zsAZvJH+k1=DBoEJt#Qlf|^28a&K0O z@8lr~=%+HGr2v-oF|r_!iJCuK_c{cXpSp*#7vrqF;L(PJe{Pr8%BUO{rLjc6-H>tj z2hW&3Wg+Ce6fyOYKuTK9NA+Mf%CV7XvMbbMjTiADyIQ#(1>@&B^f zr@TwJOUU&tf-p4ryzg%!73q#*O+^ zgX4(eI^E*fD2IOVX-c3g_?IETU1{nDJBg^1y|Mp+J+h>Zcy2r%&PH)b-Y$Z<7K$9G zk1|}t+Ct%7mNIq}=3YhuNT1M)haM8$yB^^oe$t=Tw$2kY_0k38V& z#zSrlo;0ffvnTv!9MzlZ)KX)l5}pky5-+d=Q3RTjpsexg%)_gifuRRTwD!Qrwk#5! z$RY1x!1HPu{lO+V;HGNQ`@6^+9h3IRG+tg_d$8fA%-&;1Z5`fH#7D#1THY^ZB{}GV zoa@%&eEc!WzmA89`P?#xt%mPOi5%Q5!+L+jgK5Ppjv`SYOj#?v_uKNPRLVH}f^kM1*DNgnY+GCYv1;F+K5S~|Gm6rMKN^vFfrL2}@i%@~cXdJw zP#X3miGjKFOF|C_rt+LriMf%_Yaq^E3mMh{LK-Upr0b%EJWx7Y*Y9#by z*?vs~L&nw5xL4x+x}Y+!lI#(JpNp%@%m^D(rBhqd;*1<68kSPf@H?>d+*TK>Mysx4 z9Y9?whHsND2p{ttxWb?rT_gZ~kY*T^*o^QNKsfl>A5%RTRXX+T1^94ZKc<^-!>C!b zq;pOIc;?fM0%&NYIR_s)9-P_E1zfq&9o+UF@Fu#UMv-xmx;7WO8rsi6lUy07fbG49h zkn0nN20-`pgUN>lz(N&S6rS{f#~S^{xlY@mD0cj|@=z)%bYv$c zY55r4o4wtqQOJsqC$c_O6<_mDN`q2$P;h?EJ5=xrP){#lgH&-wLybdG(On6!FlbyE zLuwJL|KfmfJbJ)*7dIb7jf2KGWjB%q)#$}AJa$pIl|P!fHcDA z*#0O8Hy=iI{Xxpv{yd*D^SL`~UC^7p6rW5MaOOFZatPOA%hssgA4gL}@r$Xbm|}ru z86TdR^MUQR1sRNv5^Iz_sssm=_vm6qA+93Nf6_DZ6MIc;I<^V^7*b|@#nE9etfAV zZw#~toOP^M2@evitPn}LnxsrbxGcEiA1&Wice!m_G+E#~A`6I3oNn=zvxFzaHm(`RT1FY) zHYj4pZ&m(Kdqa{}3avQ6#?@P+dH11|@8c-vc&4C~{ICj4osYLnRI-{Vr7jdqxzio` z2{<4j%~>Wad90xbircj#Vq5}_dHEanWgz7D7?sY8t6)As&4?D<`F!0VTA7%ft4x^3 z9cG;A8ZnUQLwxKUj>S`BsVx_8MLeHVe%%p+xibVcJt&Vempedk9sJaSjc(=L=+j4| zdIq!Kak~Jw3CK7)zCIrms16%6&`15{4@n3|8vt9ye+anSkE0=mw;|}!p)jO-_4MQh zg6Yfn_?6Sq{Cp}JG7|7oe8)FQwUNO1OuPppls|kgnt%FbLJu#ipMgARXrobm+WHdC zC+d3{+67b5dHmG;n10_9dBKG#MJW-Fq4sexEYI}glhM3-&ucsCefABj7(4d<)Ebv- z0+jI&_Kw7F?ijI0?O8^R3#z2lE&BNv_pinEmlFJnBp1CRH;;SEUtOXWUGO?(d<(z!J~gCAi|!MFbqb1KI22OE#Yq`7+lSTXkE6OH-AR97 zRLCPpGYvUY%?lZda`$gn&Cz`k2h|}=GvBx!@mOB(JkM8EA>9HZ%ACFglrc~_OGBB9 z)Y<7t+}a_nM3(gcvx&j|qPD>Ma_-q3)p2>e+oUkAi@|xvm<}ficqQIS#M6IkaHzZ` zE2cMttO{J0%5eu#K5?oeD}UEHelW_TqfyvVbS44OaN$F9e^s&#vd4l|)ZU)r`O{_%(md6m!9roC<&t;(OO?%%m{A@%2qvOSK7%XDfVALi2? z+oSwoLe7>H8;%SslRKeD+8X-c-;e%j<0b*ckd~u@q^HoN(M+u~t(yw6sFEX7og7n) zWYOhY(VR=h20XwHbF>>edAGUD2Wy5pyNY++(l2RhyuKmoqoY)h?+dI^xV=ZR^vF?v zd8xW1gJDWKihTOF9ab0721We(zo~+SHg_LHbA|;3L#aXmbnM|JV2TAxsA|5{g&K=e+qperQo>i3hOG-Ji*jC_pmYg`RCl3HV8tX13a)-= z58hBy*NJi03#pAu#OH*~I^?MdjlvJ9S9B%s%0a#oY98qZtI7{?byV-EdZkyM z;^@JM5z+Pw2{n7VK<-WM+j1p!@A_4EK6ZwF`1kD|vcGpM;>oip?mV)mR?m3&*bl!x z^jSBU=|s1BeE;x+h(G;2a5mDm34Nd+ebx&U4;s*cv8?M_(ODjRayqKduSKD8MO-cL zm-@bU|F(Fh3!un)LQOXv{LB}nfj3+O4goX66Nk;OO_Z?5lj0@I`a$jO^D5DzJ*>sp zSq#O$J$BCbnbu|mb7U<2_{G!scMqpT2aGC}kK>Y?2<`k?JdmYX?mH}(Jiejt&K*&m zK9Y8(x{MND->Y7I9WdjOanp%qGI2ULJ$-*sWKIdy%9MwcNB7IIksiQNxcykokhko0 z0%{L!djn$!?7MOZ%vQ0QBc-Tizh@<=+hH*pJLD)%9Es+zaK6rBWyt~YO}#j?9UAfE z3IW8s=}d&O#Wy3PGuurv1nZuba~oJRPXy-+8| zqd0yj;^B-GnwWW-O+K(dU_zy#UZpjz%IYZz@-k3J(1v3&EOd|iYYqHRW~;ocoR|)m zcV3K-MR`l~yfT#-M9DE=m_G8fS*9hy_(3}(Ur(oG`gRMZb%*#>1_Xhp8b|kANK}_^ zMp>_lRQ>54TaIaP&}0TS;w`aer&8Zs@G4N9+Hevs2&7_{gv5!1QL@t&hL^zjL0fW( zfELv0PM^@P4W#J>eew@)iI4$Sesx<{N^41@c9eMD+I=c@RC4_sXO9j zgqRo+KIoLM4xMm*)4@0>fTQtEH1lhQ+qZes8umJFZG)>sUNf>P{Q3!i-hh{wl4(pJ zSbUmB2b%yTVXP<_V6kUs#Qt3o_oh9roXrjD0TiinUAF$2`J0zK{NA?hvDdF7nX9rf zw;2Cp=6+1Qm~+=LCj6?8s^G3aJ*af9n|KC{0R+?dX|jzbUkMu9AJw6esP6I=v4qB2 zLfu#00(jAav;`&S9Cgc(Xa|jmM;1UXj~nPQGw1Crt79V(Y}fmI-iBBUNK87H(Iupx zuAtmhsAO&FR3=>Gc;U@oU7Ybp2k0tYt8EK1Vt9lrPrW!MgJEn`LrywtPCT&!q|U$d zDH$#J)S;=~%=oI9SUQiR3FN_{^ZLjgUpt%9rnz#{!D;CHbS+NMb$w6Q08FEUuXP(0 z6vG;16XVgCI4ZAvHsaz{Dc&ben<^n=eN5oube#r8Te=+Tj<(RDJzWBc%p{iRAcRmN zA3t1kUr{8@OkeHW8RgmIs(VW`zPyxhc3!pBI16>~prH299tV!#UTc+Zp*??xfOY2Q zcXJU~wG{a@h!%oKFX6#$ST=W3S+XdII!yE&Sx_ z>UzEVnD9x{`8tXo)rTh{l%l&3v_zs?Hzi|X%s zwt%IH@O^cdjbENe_27|lgi(@Vg|Yy@{`46rm`=GZ@bIB?peldC;IMd1b}8 z)sBsRTvi07oZmdgQ+$R6W^3gzuxZBRn4h_$nA5AM!U6K}BYG_99V$*9_A>p@EiA)>kbf1Q z+PVasyU3i@s#vGsUGfU-9XVrCzU5IlJBJVIhUm&;3G{*zHe%?LPm^*{emZqo@vDJU zaUEKpa5A$R9miL)9DUx}d4y=C$E)^HVMytYACm_m1@TNm?Bb;;9zF6jG#`ksf_G*u z=GGk26jS%$m6Xs!|BkWcn)34Rw)jNxcr}wpBaR-5#*K&3yguc&(5|Jnzb@nf*fsPi zllGB>4yHe)`OS0)Tf*dcRJ*oB@x^6Xkk8d#?vqc7#A?sZ2 zAbB#r1n!#^<-PUL23(FGisFWp85f%ZzdqrmXns&0(1PSi-gOTiLP_|sO5gGG7NCJr z5-xbl>~(xf#`#l?HCFP9#_Yb77zv#rdC0i)H43cMILtB;9?QHlQf`S4ckQ+@M=LO@ ze>OK8e>5inPXeZ%aekD+!@WyLhHAQCc$sfKE3LRE!c{h9Oiapnm=^vol|XH=%ogZq zndY%dF)9n@=EDEr%%3ki1}jIG);XYy>JhcFyi~7bgo-F+B*Y^*Wd}y0apZ6`14}aX|oguI{H4a%y1BuQi9SN7h%8u+7U@{Kff{K16PkXSk^`J<{vK~Cp?))jyT1S-cOEIi- z=oSpEHeq`vk+CRlrbUAF{mmWVaq-7K z(fa;Fku~#*8nhW`%Q!-6cq|Fm;-zHXbH$xHmKNrSf6NPZNIXP^H_XI35;{eJOSd!M z6Fgg7h`+P*5Vtg@lhOL$rfdHU7bRQsP<5=5wRna&Xxt@+5g&P#Apx? z7^g`&ZoDNilV7W{!b!N`6sDO-T|4pMfYPZ?luQ>o*gjFaDkhDc;>XqP%=Pn$wR+Ax0K+O8Jros2QmJ zI+fiU!8(06sLSmN$_^&%yTpuv4T<3$QJtC)Z8f;Au!2}ZLG|D_M|UnY8!pD#U)?2kg8Lwx>~j520ExQ!AP4{anQ&FePUFl68`azwxCw7m5N zc{x|^X63B@=Dynm|B}CM?B;;#`=3Pdqo3ugcK}59N^+z8-uuz~*%yg7FgEEEkv5B- zjRWyV#jA!w#Ii{JZm;d+u_$)#iulEs%kZpahEnN5{Ow4lu#*xuzaa;8`tQd-Nw;ehTBgT(PF3Y>TdM)C?BcYSVDd6_z z*T&WZCSNbGMMWZH6?$PQ4~|ZHbfCDQp(qZGGVA!Up8=<)Dfl9vcL=abuYfqGa+m}> zh+E3PAmYI+LhjH(dAz5TMg+WiHL9Ca^2#K5@pMJtWaBXfA_lVwL4I8$fT^Ne=mQkf zDO(+^AR$t{*aH67!BpI<&OLu7V*Yu=g>RyIHkYQyL5=o_DQsPGO~==roteO31bT#J z^y&~g^#o1F)UDiNi`WgJVnKJea^%T&cLK1f1gPDVp&B9iO zSur6m=km>TzYP!2PI(brua>!?;nS3RL+dKg!u@DvOM25vDvuuZp_Xu^Nd#5~0 z!F|!jFRvT=^Opc;!KVm(_(U>n`bkuyl6l*=MalH8_=a)EWKR<%t(crU)ur*_MXyi=HlqM zUsoy~Guxo_Bs2}$LEbzCBKuOqy8^e}1zke=X@gpJazthz+xQZdy<8!~GgabIuJ`2( zu}0wJM3g)Ci01N+aWE z@CTnV#hL`1ZkV{e0%>{$Dc_`#bSaebz;*}2CT#R^_N)fab}8N~5x1^I@sejbLJhA$ z$Mn%;At+*-#w>V|Lew1!QP9s?Ln@$a@RY5oluQW|w3Lx>b~1{?^3*TgkVSY$q+qH; z_eJRR?pYcr?gRzsUv~<3Q_wv+r4wGO3>YR$<-HorK&ARqrdE02puMuVem#m?x7`=E zc12X(`rgc-@0Fgt1cNN9^mi2r@pihK8t|yzJB_)`m0NzhF-ym%&X!7$pwV2-@j#6jc=03ADrGfwJf$9pL=4+jhq!vso(dKRvh{&nT0d%I9(AzgKZ;4~#eR)CRB{On&O5 zDinhZcgAGJciedtcyug^gOVi=`KS%6j+Id9i$%#1$}pxz*k!p<-9k##H6%Pa)`95u zG%BABE_9k+2NGp?yk_|;S@P_86nBO5{(Vs$m+|mix`XG#meDdQT#SCY1((Tjt)X5Q z0*%loiiM`kE`UNU`?6kaMB`lgAir+7132#)$k-!Td#Nls)#)LOh_D}JAjP|9PsG$z z6xXjr@j{AMfIo(H1-1POHs=&4F0{2EFVj;96wURzLhmw?b;7yuR{iBZS*_>Krp>{> z`ZD5$29DoRmQn^tM@SdKGneBA=zL|!_tzRy`OvCMU?7w3z@exnjz(M-ogdv-&7!fG z)v8y0V`kv1DOlmQ4!NWJEAd?smIg-W&?(QdK)s@G>QC?mtJK}t0p*F~QElBCaq(-% zdkTquAfpqJM{!*OrMZg-6ii!=)Q6PR1yfzc#6$!G-@Bdhd@uPVZgQPRZFcu@x?w@| z%XqjgN5msH<+ZCXl6B8top$qu#1s;=ygqa2fHw?^7oxfP!p3`B+D^fqM;pJq5^6r} z55ZArGyZmUp?Jb7laMkz|*&_87|JlQEmPS)lTc zZ`m2=hIhqJpFfHJ^%O%7@6XvRx2P)>)GL4<8O)uIvcdpg1v5sz;kMF<2M;55ZH;2= zh!<)VEPxYkEm;Wy@DI3J4k>P}!IiHF?e}rg6kF4$zHhcrNHS1CGB4)D7voaG`}arr z1i0aB$5zj;zGo6C9J|q=zohWNBI1LuXyR0`ARBn&p)r-Q7=caM$bW|gI zqquY>s(TVrW_YE8;n)l!)5`}%A;1z_r}&Kki~WgHQ67@PbK&bKp2BztCt;-@lwN(F z&?Jr%+Rt&&LBrIFO98x~TV8lo?B^rc$0EM?x!J=wS$OF_Ji_WyM3ORf3*H~Mtv?45 zRFjSxJf6Z+90mhk!j-GKEqv9!WH=}pZKk=j8AHd$+N)*0wE!K#&3&P^937A92E46n zqBa`8egP8J^kx2bujI?)`|6P#*9U*5ggf!gYJ=m8VGPKK{!9Q?_79{*_%0OClO>lI#p9QSA@?LaswLvwc4i#Ss|84IcYgpW&jv(VyK z1*0f@R9F4#EawSV02)FJ#m~!F5RGHowzNo#2e7kD|F@MlsNhdRDp<~CrxKmkOgLAi z=nDOcEq|XJEnqs;uTQj?O-DMaW;_^?sY3T8j75`mPuG?)x@Kiua~B^s|zu z>s=%GnPafKmV~~U5GAn1o$7&o;=So&`1KN{S%GT(%G&y1efj-WBlySfZX^#RCMSiP+H!TphXOVucsS@M z4~yb^zZTVx{~yFnag2e1Law+g^r@fhS@sm{U;o`-iR$M+krynUVJi2v@n4a?AA0Kq z6s#Yqo%+BdZSf-eaMw7%^Nv+q?hoB!(Gf7VZF~Ha{U60YyRH6Wk!2gNSze<+$u~&Y ze=uU=M8wp!DDU0&7LcIpdcjkQg;z$sNUB|ySTT^WEv_SE*|1h<(M%;#mF0*o_8p93 z{DeffWa72UQ9hFl1zp`w`YYp)VM4aL9L1Bu1v`yS*8{D-P9O#R_m;&_FSJU`K!srG zSe;A!h`{wqULz?;UL)5^vtw5@j+}{VJFf{y>E7eZI!xKpxbu&&<)fR+dqwd0q6J*q!PpfAO}6JVJm-ah%B zJRK?DTQc&+=UFrj5Y|g0ja3=XmBwRn{*xpl@7z$l+GB?So>C*+5XB)=Jp>ppMV#Bd zJHB|%mcd)3K=NZl@uAnDST+or0IGBEei@yTlee!4_p7Q~GSV|Yx-GnHm>Ow~VLJ%4 zgD7Z6q5*=(B*#n-o!d##byZ5PkB!U08jIrI^{8&LO{nN9T=|xoy?ybOY1u+Gx5LlQ zDR#a1FXx{kw)|~sXoK|hs{X{5&{iInmn*(}sq9d4i+-7Y&@GaQ3z{gcqwhsy@4i^P zDJnMo*mjFv^*S zu{d=RB8%hXefpTB~B;KrQOfI{+WoZ$Qnm*eq#i!p?ClF z1rrkiBe@vBJfB++$x(*i|7 zqTFW1^SpTA1_=0Qd=~P?5MEKh z**8%`l2yahW|D_^e>4i8#h0`u8rycp;^<_Q2aZKkRz=*otj@^K;YgD^BQ*}>+qr2l zfRDv*+Wrrapag$W6r%cEzusAE+a3+zGk%U&UcDIAYm;Oq`U;g1zyEZ%iGJp$>+m6mFKY*rV9?OOA>oxwHRr$~ z8UE*^`23H854hMf)|j>IY4t~vyEKiMEU-da@~tf7sDU=`LnHHPs2_z1U%bm6uwMBD4bt;g)gxT&(VDlB-y}d0E8tWe zI}^>r@`&$f?B4u3<7UL2G(j#)P7Q~w{oWWz0spNPB~p1t9DG2$RvP)dAwn*0*%rl- zvr+MxtjD*bxbsa^&jGy-LhxKdpw)M0{H)Um)d>Kl{gk5*;QOMhdw)P0jV0iFqQz`4edE$eJD;J`C z_&`zfYNBw=&st!zq_CSYq&6?mw;R%iHgNy*kXktI*cs)yA4c=@KZ#;~&I2X!PlDE9 zR9ll$&euJlJ^vuVbmg7Q4}KVN;YY#yhj97Z5Q6K0H2xUh`TBc*EsDSRKOP?#bkKS; z1HOqB0Nx08HrH|hc;r=F{Y8rJ0qfxi5DAj;t#(fm?;)DEQ8 zAN`ehKlfcd7L?zUd8DCTs~8`tjP*d`kJi*On<*WCKZ>nGQGNXr6)y)s%vJc+u;k|W z(R9P30|E{fWW2QK>fc1c8tghASu+`T5IhqA)e%%7lL;jUHzzZH;h@rT0?9go;`AmVb`NorH!xLWw`-;DUlALNV8 z0DZ;>ydx5OT%rsmAdBH$QN91`QGE8lB_sPONXF;-#^AaDIfOUpy$z(a+!%%PzZ&u6 zi9E5-Q?l$dc$UjDjBz1Vi=xFthR;0ZOJbCYPNB_!!MXrGhs;uRNgk=<2{{6L4o6)2 z%ZR6sJia~E4xR;%EP14-I2{KH&;Xhs19Ly~gcqE-Y58NEGChqy^7NSG>FFpR+>Ykm zZ-gcbZjqzOj7al|DNk>BJ^9~=#_3Pe-AigGpcx4~15Hp!txP z$gdx{9pqn$&)W@rM$I&xR3FTX$!}f|e$bV{s#`146Vf1gHGboQc%E@_{9H8d$pH0x zsJu_DyV;Oo&qW6w zxp`ct9qa5BAi(ma&RO}#T+=UZpk(8ghEuKOLZ^cPad9(FbD|o}Ogm1@y zq8&Z$_rj|yKM}6!F@X&=4d#}?)(*4*Xbqb6Kp*`21n{%W*}79!^JG+4f39d~UJDq; z1Nd(4km#*&SiPSAe8Q&=be zK;D*;&_QkRD?98f@KT1v__-*aJk)g>+x0iZb7KGcTt)bC0?(8E9z7AhIZ%LaN(}&i z(aGady}^_(4h~9}k57!hFQZ7x_?bL<=?1^;Fa*wZJ9>qFjp#>z{rWKqe4(-&%@5}a z<`)!ljx#7dZCRX`627ZsN+aW%#jV9GeL-ra_oKa3$D4wrfK_lpnyEEhZJnb`Ss8rt zyGpessv9U?4b=H(N|zgB03ifB*PM4i(9ztl^Ynr`UAMI0nFNT5B1pw69zw$ycqgm` z7K8G7P8=37$4*7upNhEgg}vScZFQ|wO!alEoj^C7UI*Ih>=;t}%qW1YVEV-0#Xb9d z-)&z0soF;yvNg>B#X3R}nDOeis2rcBvfs`tRO%JeteK25&U4?p&vxt=bDvLBRr6x_ zltadw41}h5uM>{My)oPqE^7_6!JK#Ge3UZ}qMFkH72SzXY2GCeO*Jlx+gEi8?$CIn z+fdW7OF(#PjC-~L{uf_ZX0b2w=%j@HOqBC4t(ZMsyNqq}*jg8?z~^`Jn$lDE< zGxvnC=+1PsXTJz&G&)dukX`CeN~#@)-au`=f?y?$>v$mJyey7$qIJ)*=*4uzgQ+O? z9EocDtUTeF#9z)^_d&|yx^zOm_Is;^q=2g-2}=Ze5JV zi#ehBCKz~qfCcQS7CO$TfD?z*@FD%Rz9O<)!v5qZDJ|aC3|}tVSp55ezawcEOE?d) zh)u#}$L^?3{~%&+T3(}+ub-o+-7SX2OQ&6%pl!m(TU+YrSqL+f@Kbv#K0A5#hf&Iy zt7iEum)SijUHA`;?ev=$hGgh?h3EMBsBV23#Y?PW+Djz3Z-PE}9k2qvBGhZzzYF+F z0gK-5hj?j^%+FPs-rc<~sz>*1n-&i#YegXpBup^Va34zW75C z@3zWMi<6dFYa0YiyMRiAW#K&2^|M_C(9?ihz`7EBg6AodA4PHRMidwGPC1*LcLBt? zJCadH+jzEh>U&Wh_lMlrk!GK1Dg8VUNw$?rxn^+kHm zG{^I7*Hdf|!Il^V!HV1j42%t6lU+v!7Hwkc>4+G2`<{qvpGC=MC%qVjnU^#WQPfh` z*_7D4z@oP1kuwpGWJIv1IbOaO=V94nP|$(z5WIsPaJ`(VPWeQ?|v1J`6MO%#ikJA zKP-Pwt9=Ut1@u!^xam2s&KdiX2aBcp=JAba9y}gHESOY^xw!#b0h!i( zF&oVr7owPyJkzjG{FTydZa{d+RPgg&$>~KQef{SeFSnvPEBU8`IR3Fz9uxP9q)e{Q=eJG z*I$ycCuRX^$~fSuEE2y7pcFH@b8Q^xbVQ!wneWNEnveMANAgVMz3UGGvUrKMq@IR~ zl(2~bp>bRW(cXhmT>8tjJRWYP51MK-7Qd%Eb$~0}QfE{$+PA@@Gz+~ZI7(Vp+lFNn z{c@DoE<`o^DD!BVxu{nadK%Gqb9007?+2suMJLEXW(7) zfQ=@2CS1MH&wMYrC1FrKQ{Nmt5zT4djhBal0q!oz{>dhhVO@cKU`7ROpUtMPvK^d= z;-NgrjUL;p07+f_f`8Vm4Jj{;>vH;$`r?HQitn^NzLBhOTIHc%EYCK&jnq#ocwU{h zJ54hz$S9qwStW{i=1CM|C!*SSSn}YR+Qe6_V7AwTMm!(+G%4@I#3mXFPMyu}B?wd_ zgpkp3;|V0o#GNZV=-d+@MIi=lUcV6K-HVDAvD5~?^sP=s3AZ|y!zKk!c_=ha{c1G% zyxrIG;1`}J;ezMO>j?f3b=?lmX&dL*l1#^Kbl;?Qq-Q&{NBHpkhgFdlAYx#i-7{T- zafAYMduR(;^1$89z=i|74WPaOkQ;bkUZw7scMRUSDd;?wK{M}AWJ4SSh}V%=L?chQ z*u6ihCwG?G#ljknn_!Ie1j{NO$>e9)b221Gj>wSREuqiC#mx;k0f~!*JHwf7(K%|R zn46Oke%Cu^mF2MCB48n1%AgA)1OsOe zd$)_rZF}rq#-0gILEF`Jt8bsKu6vJFKVF``2mZA1AxhM8E@7g5fH1ftOCFgTWxClBd9;-J!-gTVl!_)_;4!07dQE|CjPyet+11PWe9 z>`H+}9F*H#fAK5>z|Bj%FCYo6l7H=tCd_Cbx@sZ+O4gBoz3#o_U;Y0N`PWnakbh<8 zQ40B2nBAqq`j_?Ze^<(^e~tQ)^{*%Xf-~!1ox)iEda9RM|FZvlwIp|GWdGUVFZQ3k z@)!HhI)8m^{~7EF(eW5M`_G=}^`^7Izi$U$eGB-o|E%cAsn6_WcOo_RpJkb||Lm2& j*nejK*=x>-Kl{(J^C;!>_n!^GykrCz0Y-okut(qz`nUO! literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/pause.bmp b/Marlin/src/lcd/tft/bitmaps/pause.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9c42f006d37ac65fc06040e3ff239ee345338440 GIT binary patch literal 12410 zcmeI1ON$yo6opNG#r%x?gk(0e$|mb<4e^13I;ibqGG?RrK>T%XL~!8)H^#?$@{OH< zbahn?LrVg4F0{6{?x{X?>U0ZzZ$AegQs)Tx%yWGFbG%F4a7Hlx>1%j|iB#(L?o0Xa z`AfgwM+$!^q<|EV0#ZNnG^TlG3`Auw6OJL?|wVF<+zs1G(bL4WlMx$YJAXBf`DT#wV z=Q5cLqd^dKI-R5lN9Or?4ivsOf_0TjrEE59;}0vMR;wA%d$1${!k;x#7P)RBKilp0 zcs%}PiR1A&olarG5={NU4u`|pY<4&t%nA1U{cg8wHk<71RryaQlP7zu*K4kh4PyC^ zMx*U^YezqEcl=xai^T$a*!ZLWa=CQyXOI4K{;SnW{9k=9v%hZtd;KH*UoAdB=`a7t zKaK~uom9^N7ONB;4e#8Dvs$UhEyc!%U4 z`NwM#N5Nb0PuNDG6A|ejv3BqKb2?vik?0*)&ni$b`W#Gi&nx?d$#hJYx9sKWp)Le0O*EgDwquZEel#_3rKMP5p>iEOvBsw6n7_ zKR>^{y*=F{P)^(5-yaMHe!qW;M}S2t%$1cDtJMmh7L7*d=H@&e58-%^qafpLv)OF3 z*$xj6lgXs;dE+ai(dhH}5HQ&hXtUexp-`yP=_u@QN5U~Nd}(Q^TCFNzx7%&CT55QE zd&|)R=L+LGYGY%g*=!1}Uaub<9FQ}3LuLwv0)8W-;6vWp+QMFcMiI^H>uW(}G8s^$ zB{2oa+6tBCKEP#VgUz90zW-HRVd(uIG@jR3xP8e4u?g_^71lQ(Bq|G zFjy{^;p1?J!!ayLfCA^ukPwKH%galP#iGYW2!4KkX4l!-+2-cvFkg{XClCmTn1_c4 zijD$QOK)|knts0zA2DvXTbqx6ve_)gY|+n`E5l!1UDb9ed}4(C%gYO8IF^4dE-u(I zte^hy5DyTno0}W>_xJY{qqZ3F7+db{?%2}n_1L0->?Khb7Z;UdS#r5tqyff=VO1F` zo7WxEn8IgEsZ@$YB4Pj>R3ece4@qD+xPs`X(`hVel-O(3TQg)GQKQPpKx}|Joz9b! z6FBIH&l2BKk-=oKSX4#v7IS1C$!aP=7==yNd4MeQ5DKC=wG%GxLf6^25M9KT;LuLj5nMRofTD$j zzKo)%IowK`rfwD?RUwNMv|V)T`Tjcp=`Mvo;)CMf5b^nfW9Z)9C=>h=4N=hoev^+-|q+b}I-15O%wr3nH0J!s_902yrsj>opL1 zy&kIwhr^6U#bU8arSh)*c3!PkCXMu)f$aP84<9$ zR4P#j7^Tr@j7B5uN+c322(;is1lp}sDtRH$&0?`gtzy65O9*zOfIz!1my4VNgi57C zJMieCSuBY{yMd_HYUlG=j@WEA=mik$p(TiVy-p#dL?OCCdanXrwG4d`DX|DK+nqobot(7#?^UuXX8f7#k&{a{1L0{t8w9?I5$ zl7g(C?9dPIU-D)F>!0;6PdQYI^~3sM{qXk}@4xb90k5CDe#%o0@4rwESr&Z%^7<)n z7V!FsDZu)dCmxhy{bYfDaDH@ha`L|#NF);b`}>!dmsAiZM1U6;7X)!Ogfl6;2_hb; zXJ=Nw6uiOiHV8V z;NRTb?DzX6PYO*u2~(*Qgs0VNBasMYKzDL-a;B%J367180eZb&g0r);fNr;2s7)3B zg9(oR0)ap>nH1_z1KZo%abCQ*xJY>h2L}rZ3c!;fh9f^eA8&%;a2Tom{ry6PYVpVM zx7}{Xa9>?r2~9i)-xYrhfz#>4D9p{xK^xC;z90YI_@fIL1>EA0Bz>Rl<1qLe42D=N zMoB|MLl8_b7$ivg86O`fNczD-C)A^sen6fKa~Za-e`;z9 zP+BnO=jY4H$}oT5fIoEsT3TLSe(ZKBW_NdYXJ<#cc!2F`dwcu%_?R-_g97m2;D8|Z zM?maoQgI59|8WHZtB36S8#mH<_=Aanh?SKUp+$8e_?MKFfWMOa8xM)!A#?%PqSn^d z)a87?w$07Wy1Kf?#>Tr=RSlsF7*==*f5512*zvcvw%Xd-RHZCdhUttZuso`6!^6Y4 Vx})Ugo5+&2$6FR zB8r^Z{g_&p+C4q*^~`%S>%){ZJ=N9KRo`Fw{(jZ(pa1&#r+VMo&#wRQ_sjqOzN`16 zp62-v--o|2P_N!^b*)YVbsDJCKshupdi3bAW5@pft?8Fz$=X;0R1NY`qek`X*ROBi zzOExij2JU!jPcq)P^~>+3kXM!964mjklwv}ckI})RjXG2{?u7u-mn3*SvZ2CQX|B`mMQb)259pE0hucAG)Z}^5{OiMB9*qG;rX+sO=Ul zS~P3c%$2qmEn2i?%a%EF=D3Al>(i%?SMqF8cn$#8apj@_#Ac*`mxibDMX=KT5dA3uKl6ZK#IPn4Jlampp-DIyk&~=lyY|M78*ksfegFRbmoHy*?%cTpk~t94 zQe+IbV28J+O`B$p7qcN28|6aq4zK zyroN*3Rs#?x*c<$V}B}Z2WI@}pG9d+@DVGS=p%V*^8#gY66D=TB>1orZO?mK397m2E zS+;DM1({D$lO}=^DBt>|POxz^jU%g9i^L$CG_?q<)Em z1)Zd%=EjX1H)zm6CRKqb2pHUg7?~qEjUX1`EeP%9%a({Ss@!`V_;fd&g80h{w6mTKp2(c#ELOC>5l2*QX$*!ixqBVJM#m<6e=6}=3R ze3ZX05a>!!m+1TfKWhS`rYZ`+2?d$+e5OxE$Gdm$oVko}c)6qKI?}yGEL9f#7GVO7 z^IX4vJ#%-`$z`I0-^xw9cI^t&o;`b}wwXSCx*!URunyvq&NA0Ac>DHkOpCPy9Y(dg zmU8K;-de#@;JM2F$B!T9C$udVupfBb6>_8`t8Ux2Enrh=&|#!UJ*uUBXC+u z5Ypiv_%%d|ML9s}A`sakmZC-&;ECGC*mA4XV@~{}pz7npCS%}=>LLjBg37g0_}8sl z7goccL~uoAr6+bwpXM8u+L3hHcmhr1j zRl-68wgUbiT+y7_vu9V9=>q<;`@c;K=pU~FFZ2W;wlD0r{D0oOc`3EWTlmG1BD}o( z1HV&A+$GgPKI$L-Pj4cf2r2H0w?ur~}Ijo{ZSQb?)4`O3h66^GU>kF`RH!GC_f20g}){ zUt*#Phn*y5eaCI-PadZw;^)+A{%J69NYtl!Yvsz76)OS9t561n?+lJS$_9dj3@&#| zthgoS>nH-`rtv*<%I-NS87T)I2VsY@2q1JEuapN$i(mzA90Um`^zfP5C+pN(ZuwsQ z`t^m6qh(S0O5v&MEkjTdDKfnX7(Nh6J9uKlt~~JK#fufe8zGbl+z;*N$skq5oSe^# zSUDD)nRpzgKw=9&L-1!`0~jk-N|~=v3t@9+kR+a}_C=p>3x$u9nFtFH5|9Z5etBuX zqIB?AEFcSG%kz|VtX$KxW`7y_t zz>BGxp#4nQg9xt5wupf^l7i|zd{~R)$&S;d*b)25+#%8(YHFHxQi1?4ktqfoihX_Z zQ>hWz3W4w5y*r6H_I;29QWju7q@;vEQ+_j2Ez~mjAPd04Eu1nyg2A|s+EOBmuw%!E z6!gwd!i#45sf*9on%ksI;1&|Q2jt-?ag1bs@L?Al=)5J5<$+W*DLOO&PV^*RmIX`oI6nHu;n3OrP< literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/up.bmp b/Marlin/src/lcd/tft/bitmaps/up.bmp new file mode 100644 index 0000000000000000000000000000000000000000..94afd1255bea1635e23962c6e3d834156224b38f GIT binary patch literal 3126 zcmeHGyQ*426g7Q5AZ5z5A|9Xk!Z${LAgx-6g^Ggj_(H+bT2WMN6cI!OQ4sMn{0kcu z^e*lW!!YqiuenW#1Lv^MoVC|ld+!;`cj>e2bxC-C!}Imm^GWsv5f=WNf6zl4GTG1P zdUoKS>Oi4TfM0sQ%XqO^yqTEK=R={8$Ky$-(}cfM0*Qe@z~}QJxatl2nM|fut63}- zgTdf(xpKMOJrYQSnM$Q%GMSL*^?JcCBoYSv`~7}0nMjfZu*2cFSuX&|WU^YVUM`nL zqd|#ow>uV#@l}8s7?1;oH6D-Ua=F=Twpy*FQi(?j?MkIm*r6=EA)!zxj7B3Gg^Cy$ za_94z!4S-5GbRC;P%kBd9EI~)h^N!3UayZtB76#J91I2ml1ZRZzt7?-`Fg#E^K3SY zs+oBNu#re4dcEFN3CzOjbRvr^0SrIoa#;W`mrI+?hF`pMra}_^eqYGKEHE{+6jP%^ z3kDps)9J(`7mEcvyhTnbZ&fiGjWik!NkpU3dcA%)9NtULOLV(kJ{|FJIMiyjN~JO! z4j+$4{x6){?RJdgYFk);SU^>DIvt(_F-T(iq&eR)9F5h z93<2zHjDXuu2QLRogZ!sbIt;iz!BZ;cEMl}72SCh8NyiZC{N^+M H&pYq}#5Inx literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/canvas.cpp b/Marlin/src/lcd/tft/canvas.cpp new file mode 100644 index 0000000000..f6a5046b8d --- /dev/null +++ b/Marlin/src/lcd/tft/canvas.cpp @@ -0,0 +1,179 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_GRAPHICAL_TFT + +#include "canvas.h" + +uint16_t CANVAS::width, CANVAS::height; +uint16_t CANVAS::startLine, CANVAS::endLine; +uint16_t *CANVAS::buffer = TFT::buffer; + +void CANVAS::New(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { + CANVAS::width = width; + CANVAS::height = height; + startLine = 0; + endLine = 0; + + tft.set_window(x, y, x + width - 1, y + height - 1); +} + +void CANVAS::Continue() { + startLine = endLine; + endLine = TFT_BUFFER_SIZE < width * (height - startLine) ? startLine + TFT_BUFFER_SIZE / width : height; +} + +bool CANVAS::ToScreen() { + tft.write_sequence(buffer, width * (endLine - startLine)); + return endLine == height; +} + +void CANVAS::SetBackground(uint16_t color) { + /* TODO: test and optimize perfomance */ + /* + uint32_t count = (endLine - startLine) * width; + uint16_t *pixel = buffer; + while (count--) + *pixel++ = color; + */ + const uint32_t two_pixels = (((uint32_t )color) << 16) | color; + uint32_t count = ((endLine - startLine) * width + 1) >> 1; + uint32_t *pointer = (uint32_t *)buffer; + while (count--) *pointer++ = two_pixels; +} + +void CANVAS::AddText(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth) { + if (endLine < y || startLine > y + GetFontHeight()) return; + + if (maxWidth == 0) maxWidth = width - x; + + uint16_t stringWidth = 0; + for (uint16_t i = 0 ; *(string + i) ; i++) { + glyph_t *glyph = Glyph(string + i); + if (stringWidth + glyph->BBXWidth > maxWidth) break; + AddImage(x + stringWidth + glyph->BBXOffsetX, y + Font()->FontAscent - glyph->BBXHeight - glyph->BBXOffsetY, glyph->BBXWidth, glyph->BBXHeight, GREYSCALE1, ((uint8_t *)glyph) + sizeof(glyph_t), &color); + stringWidth += glyph->DWidth; + } +} + +void CANVAS::AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { + uint16_t *data = (uint16_t *)Images[image].data; + if (data == NULL) return; + + uint16_t image_width = Images[image].width, + image_height = Images[image].height; + colorMode_t color_mode = Images[image].colorMode; + + if (color_mode != HIGHCOLOR) + return AddImage(x, y, image_width, image_height, color_mode, (uint8_t *)data, colors); + + // HIGHCOLOR - 16 bits per pixel + + for (int16_t i = 0; i < image_height; i++) { + int16_t line = y + i; + if (line >= startLine && line < endLine) { + uint16_t *pixel = buffer + x + (line - startLine) * width; + for (int16_t j = 0; j < image_width; j++) { + if ((x + j >= 0) && (x + j < width)) *pixel = *data; + pixel++; + data++; + } + } + else + data += image_width; + } +} + +void CANVAS::AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors) { + uint8_t bitsPerPixel; + switch (color_mode) { + case GREYSCALE1: bitsPerPixel = 1; break; + case GREYSCALE2: bitsPerPixel = 2; break; + case GREYSCALE4: bitsPerPixel = 4; break; + default: return; + } + + uint8_t mask = 0xFF >> (8 - bitsPerPixel), + pixelsPerByte = 8 / bitsPerPixel; + + colors--; + + for (int16_t i = 0; i < image_height; i++) { + int16_t line = y + i; + if (line >= startLine && line < endLine) { + uint16_t *pixel = buffer + x + (line - startLine) * width; + uint8_t offset = 8 - bitsPerPixel; + for (int16_t j = 0; j < image_width; j++) { + if (offset > 8) { + data++; + offset = 8 - bitsPerPixel; + } + if ((x + j >= 0) && (x + j < width)) { + const uint8_t color = ((*data) >> offset) & mask; + if (color) *pixel = *(colors + color); + } + pixel++; + offset -= bitsPerPixel; + } + data++; + } + else + data += (image_width + pixelsPerByte - 1) / pixelsPerByte; + } +} + +void CANVAS::AddRectangle(uint16_t x, uint16_t y, uint16_t rectangleWidth, uint16_t rectangleHeight, uint16_t color) { + if (endLine < y || startLine > y + rectangleHeight) return; + + for (uint16_t i = 0; i < rectangleHeight; i++) { + uint16_t line = y + i; + if (line >= startLine && line < endLine) { + uint16_t *pixel = buffer + x + (line - startLine) * width; + if (i == 0 || i == rectangleHeight - 1) { + for (uint16_t j = 0; j < rectangleWidth; j++) *pixel++ = color; + } + else { + *pixel = color; + pixel += rectangleWidth - 1; + *pixel = color; + } + } + } +} + +void CANVAS::AddBar(uint16_t x, uint16_t y, uint16_t barWidth, uint16_t barHeight, uint16_t color) { + if (endLine < y || startLine > y + barHeight) return; + + for (uint16_t i = 0; i < barHeight; i++) { + uint16_t line = y + i; + if (line >= startLine && line < endLine) { + uint16_t *pixel = buffer + x + (line - startLine) * width; + for (uint16_t j = 0; j < barWidth; j++) *pixel++ = color; + } + } +} + +CANVAS Canvas; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/canvas.h b/Marlin/src/lcd/tft/canvas.h new file mode 100644 index 0000000000..295ea038e3 --- /dev/null +++ b/Marlin/src/lcd/tft/canvas.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft_color.h" +#include "tft_string.h" +#include "tft_image.h" +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +class CANVAS { + private: + static uint16_t width, height; + static uint16_t startLine, endLine; + static uint16_t *buffer; + + inline static font_t *Font() { return TFT_String::font(); } + inline static glyph_t *Glyph(uint8_t *character) { return TFT_String::glyph(character); } + inline static uint16_t GetFontHeight() { return TFT_String::font_height(); } + + static void AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors); + static void AddImage(uint16_t x, uint16_t y, uint16_t imageWidth, uint16_t imageHeight, uint16_t color, uint16_t bgColor, uint8_t *image); + + public: + static void New(uint16_t x, uint16_t y, uint16_t width, uint16_t height); + static void Continue(); + static bool ToScreen(); + + static void SetBackground(uint16_t color); + static void AddText(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth); + static void AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors); + + static void AddRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); + static void AddBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); +}; + +extern CANVAS Canvas; diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp new file mode 100644 index 0000000000..cc328e885d --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp @@ -0,0 +1,257 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* + Fontname: -Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1 + Copyright: Public domain font. Share and enjoy. + Capital A Height: 13, '1' Height: 13 + Calculated Max Values w= 9 h=17 x= 4 y=16 dx=10 dy= 0 ascent=16 len=26 + Font Bounding box w=10 h=20 x= 0 y=-4 + Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 + Pure Font ascent =13 descent=-4 + X Font ascent =13 descent=-4 + Max Font ascent =16 descent=-4 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +extern const uint8_t font10x20[3453] = { + 0,10,20,0,252,13,2,74,4,153,32,255,252,16,252,13, + 252,0,0,0,10,0,16,2,13,13,10,4,0,192,192,192, + 192,192,192,192,192,192,192,0,192,192,6,4,4,10,2,9, + 204,204,204,72,9,11,22,10,1,1,27,0,27,0,27,0, + 127,128,54,0,54,0,54,0,255,0,108,0,108,0,108,0, + 8,13,13,10,1,0,24,126,219,216,216,216,126,27,27,27, + 219,126,24,9,12,24,10,1,0,115,0,219,0,222,0,118, + 0,12,0,12,0,24,0,24,0,55,0,61,128,109,128,103, + 0,9,13,26,10,1,0,56,0,108,0,108,0,108,0,120, + 0,48,0,112,0,216,0,205,128,199,0,198,0,239,0,121, + 128,2,5,5,10,4,8,192,192,192,192,128,5,13,13,10, + 3,0,24,48,96,96,192,192,192,192,192,96,96,48,24,5, + 13,13,10,2,0,192,96,48,48,24,24,24,24,24,48,48, + 96,192,8,7,7,10,1,3,102,102,60,255,60,102,102,8, + 7,7,10,1,3,24,24,24,255,24,24,24,4,3,3,10, + 3,255,112,112,224,8,1,1,10,1,6,255,3,3,3,10, + 4,0,224,224,224,7,12,12,10,2,0,6,6,12,12,24, + 24,48,48,96,96,192,192,8,13,13,10,1,0,24,60,102, + 102,195,195,195,195,195,102,102,60,24,8,13,13,10,1,0, + 24,56,120,216,24,24,24,24,24,24,24,24,255,8,13,13, + 10,1,0,60,102,195,195,3,3,6,28,48,96,192,192,255, + 8,13,13,10,1,0,60,102,195,195,3,6,28,6,3,195, + 195,102,60,8,13,13,10,1,0,2,6,14,30,54,102,198, + 198,255,6,6,6,6,8,13,13,10,1,0,255,192,192,192, + 192,220,230,3,3,3,195,102,60,8,13,13,10,1,0,60, + 102,194,192,192,220,230,195,195,195,195,102,60,8,13,13,10, + 1,0,255,3,3,6,6,12,12,24,24,48,48,96,96,8, + 13,13,10,1,0,60,102,195,195,195,102,60,102,195,195,195, + 102,60,8,13,13,10,1,0,60,102,195,195,195,195,103,59, + 3,3,67,102,60,3,8,8,10,4,0,224,224,0,0,0, + 0,224,224,4,9,9,10,3,255,112,112,0,0,0,0,112, + 112,224,7,13,13,10,1,0,2,6,12,24,48,96,192,96, + 48,24,12,6,2,8,6,6,10,1,3,255,0,0,0,0, + 255,7,13,13,10,2,0,128,192,96,48,24,12,6,12,24, + 48,96,192,128,8,13,13,10,1,0,60,102,195,195,195,6, + 12,24,24,24,0,24,24,8,13,13,10,1,0,60,102,195, + 207,223,219,219,219,222,204,192,99,62,8,13,13,10,1,0, + 24,60,102,102,195,195,195,255,195,195,195,195,195,8,13,13, + 10,1,0,248,204,198,198,198,204,252,198,195,195,195,198,252, + 8,13,13,10,1,0,60,102,195,192,192,192,192,192,192,192, + 195,102,60,8,13,13,10,1,0,252,198,195,195,195,195,195, + 195,195,195,195,198,252,8,13,13,10,1,0,255,192,192,192, + 192,192,252,192,192,192,192,192,255,8,13,13,10,1,0,255, + 192,192,192,192,192,252,192,192,192,192,192,192,8,13,13,10, + 1,0,60,102,195,192,192,192,207,195,195,195,195,103,61,8, + 13,13,10,1,0,195,195,195,195,195,195,255,195,195,195,195, + 195,195,8,13,13,10,1,0,255,24,24,24,24,24,24,24, + 24,24,24,24,255,9,13,26,10,1,0,31,128,6,0,6, + 0,6,0,6,0,6,0,6,0,6,0,6,0,198,0,198, + 0,108,0,56,0,8,13,13,10,1,0,195,195,198,198,204, + 204,248,204,204,198,198,195,195,8,13,13,10,1,0,192,192, + 192,192,192,192,192,192,192,192,192,192,255,8,13,13,10,1, + 0,195,195,231,231,255,219,219,219,219,195,195,195,195,8,13, + 13,10,1,0,195,227,227,243,243,219,219,207,207,199,199,195, + 195,8,13,13,10,1,0,60,102,195,195,195,195,195,195,195, + 195,195,102,60,8,13,13,10,1,0,252,198,195,195,195,195, + 198,252,192,192,192,192,192,8,14,14,10,1,255,60,102,195, + 195,195,195,195,195,195,219,207,102,62,3,8,13,13,10,1, + 0,252,198,195,195,195,195,198,252,204,198,198,195,195,8,13, + 13,10,1,0,60,102,195,192,192,96,60,6,3,3,195,102, + 60,8,13,13,10,1,0,255,24,24,24,24,24,24,24,24, + 24,24,24,24,8,13,13,10,1,0,195,195,195,195,195,195, + 195,195,195,195,195,102,60,8,13,13,10,1,0,195,195,195, + 195,102,102,102,60,60,60,24,24,24,8,13,13,10,1,0, + 195,195,195,195,195,219,219,219,219,231,231,195,195,8,13,13, + 10,1,0,195,195,102,102,60,60,24,60,60,102,102,195,195, + 8,13,13,10,1,0,195,195,102,102,60,60,24,24,24,24, + 24,24,24,8,13,13,10,1,0,255,3,3,6,12,12,24, + 48,48,96,192,192,255,6,13,13,10,2,0,252,192,192,192, + 192,192,192,192,192,192,192,192,252,7,12,12,10,2,0,192, + 192,96,96,48,48,24,24,12,12,6,6,6,13,13,10,2, + 0,252,12,12,12,12,12,12,12,12,12,12,12,252,8,4, + 4,10,1,9,24,60,102,195,9,1,2,10,1,255,255,128, + 4,3,3,10,3,10,192,96,48,8,8,8,10,1,0,62, + 99,3,127,195,195,195,125,8,13,13,10,1,0,192,192,192, + 192,192,220,230,195,195,195,195,230,220,8,8,8,10,1,0, + 62,99,192,192,192,192,99,62,8,13,13,10,1,0,3,3, + 3,3,3,59,103,195,195,195,195,103,59,8,8,8,10,1, + 0,60,102,195,255,192,192,99,62,8,13,13,10,1,0,30, + 51,51,48,48,252,48,48,48,48,48,48,48,8,12,12,10, + 1,252,125,199,198,198,198,124,192,126,195,195,195,126,8,13, + 13,10,1,0,192,192,192,192,192,220,230,195,195,195,195,195, + 195,8,11,11,10,1,0,24,24,0,120,24,24,24,24,24, + 24,255,7,15,15,10,2,252,6,6,0,30,6,6,6,6, + 6,6,6,198,198,198,124,8,13,13,10,1,0,192,192,192, + 192,192,198,204,216,240,248,204,198,195,8,13,13,10,1,0, + 120,24,24,24,24,24,24,24,24,24,24,24,255,8,8,8, + 10,1,0,182,255,219,219,219,219,219,219,8,8,8,10,1, + 0,220,230,195,195,195,195,195,195,8,8,8,10,1,0,60, + 102,195,195,195,195,102,60,8,12,12,10,1,252,220,230,195, + 195,195,195,230,220,192,192,192,192,8,12,12,10,1,252,59, + 103,195,195,195,195,103,59,3,3,3,3,8,8,8,10,1, + 0,222,115,96,96,96,96,96,96,8,8,8,10,1,0,126, + 195,192,126,3,3,195,126,8,11,11,10,1,0,48,48,48, + 252,48,48,48,48,48,51,30,8,8,8,10,1,0,195,195, + 195,195,195,195,103,59,8,8,8,10,1,0,195,195,102,102, + 60,60,24,24,8,8,8,10,1,0,195,195,195,219,219,219, + 255,102,8,8,8,10,1,0,195,102,60,24,24,60,102,195, + 8,12,12,10,1,252,195,195,195,195,195,195,103,59,3,195, + 102,60,7,8,8,10,2,0,254,6,12,24,48,96,192,254, + 8,13,13,10,1,0,15,24,24,24,24,24,240,24,24,24, + 24,24,15,2,13,13,10,4,0,192,192,192,192,192,192,192, + 192,192,192,192,192,192,8,13,13,10,1,0,240,24,24,24, + 24,24,15,24,24,24,24,24,240,8,3,3,10,1,10,115, + 219,206,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,0,0,0,10,0,16,2,13,13,10,4,0,192, + 192,0,192,192,192,192,192,192,192,192,192,192,7,12,12,10, + 1,0,24,24,60,102,194,192,192,194,102,60,24,24,9,12, + 24,10,1,0,30,0,51,0,51,0,48,0,48,0,252,0, + 48,0,48,0,48,0,248,0,173,128,231,0,9,9,18,10, + 0,1,128,128,221,128,127,0,99,0,99,0,99,0,127,0, + 221,128,128,128,8,11,11,10,1,0,129,195,102,60,126,24, + 126,24,24,24,24,2,13,13,10,4,0,192,192,192,192,192, + 0,0,0,192,192,192,192,192,8,13,13,10,1,0,60,102, + 198,96,120,204,102,51,30,6,99,102,60,6,2,2,10,2, + 11,204,204,8,11,11,10,1,0,60,102,195,189,165,161,165, + 189,195,102,60,8,9,9,10,1,4,62,67,3,127,195,195, + 125,0,255,9,11,22,10,0,0,4,128,13,128,27,0,54, + 0,108,0,216,0,108,0,54,0,27,0,13,128,4,128,8, + 4,4,10,1,4,255,255,3,3,6,1,1,10,2,6,252, + 8,11,11,10,1,0,60,102,195,189,165,189,169,173,195,102, + 60,8,1,1,10,1,13,255,6,6,6,10,2,7,48,120, + 204,204,120,48,8,7,7,10,1,2,24,24,255,24,24,0, + 255,5,7,7,10,2,6,112,216,24,48,96,192,248,5,7, + 7,10,2,6,112,216,24,48,24,216,112,4,3,3,10,3, + 10,48,96,192,7,10,10,10,1,253,198,198,198,198,198,238, + 250,192,192,192,8,13,13,10,1,0,127,255,251,251,251,123, + 27,27,27,27,27,27,27,3,3,3,10,4,5,224,224,224, + 5,4,4,10,2,252,48,24,216,112,4,7,7,10,2,6, + 96,224,96,96,96,96,240,7,9,9,10,1,4,56,108,198, + 198,198,108,56,0,254,9,11,22,10,1,0,144,0,216,0, + 108,0,54,0,27,0,13,128,27,0,54,0,108,0,216,0, + 144,0,8,12,12,10,1,1,64,192,65,66,228,8,18,38, + 74,158,2,2,8,12,12,10,1,1,64,192,65,66,228,8, + 22,41,65,130,4,15,8,12,12,10,1,1,224,16,97,18, + 228,8,18,38,74,159,2,2,8,13,13,10,1,0,24,24, + 0,24,24,24,48,96,195,195,195,102,60,8,15,15,10,1, + 0,96,48,24,0,24,60,102,195,195,195,255,195,195,195,195, + 8,15,15,10,1,0,6,12,24,0,24,60,102,195,195,195, + 255,195,195,195,195,8,15,15,10,1,0,24,60,102,0,24, + 60,102,195,195,195,255,195,195,195,195,8,15,15,10,1,0, + 50,126,76,0,24,60,102,195,195,195,255,195,195,195,195,8, + 15,15,10,1,0,102,102,0,24,60,102,102,195,195,195,255, + 195,195,195,195,8,16,16,10,1,0,60,102,102,60,0,24, + 60,102,195,195,195,255,195,195,195,195,8,13,13,10,1,0, + 31,60,108,108,204,204,255,204,204,204,204,204,207,8,17,17, + 10,1,252,60,102,195,192,192,192,192,192,192,192,195,102,60, + 24,12,108,56,8,15,15,10,1,0,96,48,24,0,255,192, + 192,192,192,252,192,192,192,192,255,8,15,15,10,1,0,12, + 24,48,0,255,192,192,192,192,252,192,192,192,192,255,8,15, + 15,10,1,0,24,60,102,0,255,192,192,192,192,252,192,192, + 192,192,255,8,15,15,10,1,0,102,102,0,0,255,192,192, + 192,192,252,192,192,192,192,255,6,15,15,10,2,0,96,48, + 24,0,252,48,48,48,48,48,48,48,48,48,252,6,15,15, + 10,2,0,24,48,96,0,252,48,48,48,48,48,48,48,48, + 48,252,6,15,15,10,2,0,48,120,204,0,252,48,48,48, + 48,48,48,48,48,48,252,6,15,15,10,2,0,204,204,0, + 252,48,48,48,48,48,48,48,48,48,48,252,9,13,26,10, + 0,0,126,0,99,0,97,128,97,128,97,128,97,128,249,128, + 97,128,97,128,97,128,97,128,99,0,126,0,8,15,15,10, + 1,0,50,126,76,0,195,227,243,243,219,219,207,207,199,195, + 195,8,15,15,10,1,0,48,24,12,0,60,102,195,195,195, + 195,195,195,195,102,60,8,15,15,10,1,0,12,24,48,0, + 60,102,195,195,195,195,195,195,195,102,60,8,15,15,10,1, + 0,24,60,102,0,60,102,195,195,195,195,195,195,195,102,60, + 8,15,15,10,1,0,50,126,76,0,60,102,195,195,195,195, + 195,195,195,102,60,8,15,15,10,1,0,102,102,0,60,102, + 195,195,195,195,195,195,195,195,102,60,7,8,8,10,1,0, + 130,198,108,56,56,108,198,130,8,15,15,10,1,255,1,62, + 102,199,199,203,203,203,211,211,211,227,102,124,128,8,15,15, + 10,1,0,48,24,12,0,195,195,195,195,195,195,195,195,195, + 102,60,8,15,15,10,1,0,12,24,48,0,195,195,195,195, + 195,195,195,195,195,102,60,8,15,15,10,1,0,24,60,102, + 0,195,195,195,195,195,195,195,195,195,102,60,8,15,15,10, + 1,0,102,102,0,195,195,195,195,195,195,195,195,195,195,102, + 60,8,15,15,10,1,0,12,24,48,0,195,195,102,102,60, + 60,24,24,24,24,24,7,13,13,10,2,0,192,192,192,252, + 198,198,198,198,198,252,192,192,192,8,13,13,10,1,0,28, + 54,99,99,102,236,108,102,99,99,99,102,108,8,12,12,10, + 1,0,48,24,12,0,126,195,3,127,195,195,195,125,8,12, + 12,10,1,0,12,24,48,0,126,195,3,127,195,195,195,125, + 8,12,12,10,1,0,24,60,102,0,126,195,3,127,195,195, + 195,125,8,12,12,10,1,0,50,126,76,0,126,195,3,127, + 195,195,195,125,8,11,11,10,1,0,102,102,0,126,195,3, + 127,195,195,195,125,8,13,13,10,1,0,60,102,102,60,0, + 126,195,3,127,195,195,195,125,8,8,8,10,1,0,118,155, + 27,30,120,216,217,110,8,12,12,10,1,252,62,99,192,192, + 192,192,99,62,24,12,108,56,8,12,12,10,1,0,96,48, + 24,0,60,102,195,255,192,192,99,62,8,12,12,10,1,0, + 6,12,24,0,60,102,195,255,192,192,99,62,8,12,12,10, + 1,0,24,60,102,0,60,102,195,255,192,192,99,62,8,11, + 11,10,1,0,102,102,0,60,102,195,255,192,192,99,62,8, + 12,12,10,1,0,96,48,24,0,120,24,24,24,24,24,24, + 255,8,12,12,10,1,0,12,24,48,0,120,24,24,24,24, + 24,24,255,8,12,12,10,1,0,24,60,102,0,120,24,24, + 24,24,24,24,255,8,11,11,10,1,0,102,102,0,120,24, + 24,24,24,24,24,255,8,13,13,10,1,0,136,216,112,112, + 216,140,62,103,195,195,195,102,60,8,12,12,10,1,0,50, + 126,76,0,220,230,195,195,195,195,195,195,8,12,12,10,1, + 0,96,48,24,0,60,102,195,195,195,195,102,60,8,12,12, + 10,1,0,6,12,24,0,60,102,195,195,195,195,102,60,8, + 12,12,10,1,0,24,60,102,0,60,102,195,195,195,195,102, + 60,8,12,12,10,1,0,50,126,76,0,60,102,195,195,195, + 195,102,60,8,11,11,10,1,0,102,102,0,60,102,195,195, + 195,195,102,60,8,10,10,10,1,1,24,24,0,0,255,255, + 0,0,24,24,8,10,10,10,1,255,1,62,102,203,203,211, + 211,102,124,128,8,12,12,10,1,0,48,24,12,0,195,195, + 195,195,195,195,103,59,8,12,12,10,1,0,6,12,24,0, + 195,195,195,195,195,195,103,59,8,12,12,10,1,0,24,60, + 102,0,195,195,195,195,195,195,103,59,8,11,11,10,1,0, + 102,102,0,195,195,195,195,195,195,103,59,8,16,16,10,1, + 252,12,24,48,0,195,195,195,195,195,195,103,59,3,195,102, + 60,7,17,17,10,2,252,192,192,192,192,192,192,248,204,198, + 198,198,204,248,192,192,192,192,8,15,15,10,1,252,102,102, + 0,195,195,195,195,195,195,103,59,3,195,102,60 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp new file mode 100644 index 0000000000..1694986091 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp @@ -0,0 +1,314 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +#define STM32_NOT_EXTENDED_ISO10646_1_5X7 + +#if ENABLED(STM32_NOT_EXTENDED_ISO10646_1_5X7) + // reduced font (only symbols 1 - 127) - saves about 1278 bytes of FLASH + +/* + Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 + Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Capital A Height: 7, '1' Height: 7 + Calculated Max Values w= 5 h=10 x= 5 y= 5 dx= 6 dy= 0 ascent= 8 len=10 + Font Bounding box w=12 h=13 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 7 descent=-2 + X Font ascent = 8 descent=-2 + Max Font ascent = 8 descent=-2 +*/ +extern const uint8_t ISO10646_1_5x7[1325] = { + 0x00,0x0c,0x0d,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0x7f,0xfe,0x0a,0xfe,0x08, + 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, + 0xb8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a, + 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8, + 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70, + 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, + 0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, + 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8, + 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20, + 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68, + 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20, + 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40, + 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70, + 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02, + 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02, + 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, + 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88, + 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, + 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0, + 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05, + 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00, + 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8, + 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0, + 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, + 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, + 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0, + 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, + 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, + 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8, + 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, + 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, + 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0, + 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, + 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01, + 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, + 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, + 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, + 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, + 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40, + 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40, + 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff +}; + +#else // !STM32_NOT_EXTENDED_ISO10646_1_5X7 + + // extended (original) font (symbols 1 - 255) + +/* + Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 + Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Capital A Height: 7, '1' Height: 7 + Calculated Max Values w= 6 h=10 x= 5 y= 7 dx= 6 dy= 0 ascent=10 len=10 + Font Bounding box w=12 h=13 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 7 descent=-2 + X Font ascent = 8 descent=-2 + Max Font ascent =10 descent=-2 +*/ +extern const uint8_t ISO10646_1_5x7[2648] = { + 0x00,0x0c,0x0d,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0xff,0xfe,0x0a,0xfe,0x08, + 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, + 0xb8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a, + 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8, + 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70, + 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, + 0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, + 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8, + 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20, + 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68, + 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20, + 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40, + 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70, + 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02, + 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02, + 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, + 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88, + 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, + 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0, + 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05, + 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00, + 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8, + 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0, + 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, + 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, + 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0, + 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, + 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, + 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8, + 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, + 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, + 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0, + 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, + 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01, + 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, + 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, + 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, + 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, + 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40, + 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40, + 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, + 0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80, + 0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05,0x06,0x00,0x00, + 0xa8,0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xf8,0x20,0xf8, + 0x20,0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04, + 0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0,0x03,0x01,0x01, + 0x06,0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,0xb4,0x84, + 0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05,0x05,0x05,0x06, + 0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x08,0x08, + 0x03,0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4, + 0xa4,0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04,0x04,0x06,0x01, + 0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, + 0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xa0,0x20,0x40,0xe0,0x03,0x05,0x05, + 0x06,0x01,0x04,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40, + 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x08, + 0x08,0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06, + 0x02,0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03,0x05,0x05,0x06, + 0x01,0x04,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x40, + 0x00,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10,0x05,0x07,0x07, + 0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00, + 0x40,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, + 0x10,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, + 0x20,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, + 0x68,0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00, + 0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, + 0x50,0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78, + 0xa0,0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x80, + 0x80,0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80, + 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80, + 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0xf8,0x80, + 0x80,0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00,0xe0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xe0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00,0xe0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40, + 0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8,0x48,0x48,0x70, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xff, + 0x08,0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, + 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, + 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, + 0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50, + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xe0, + 0x90,0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xa0,0x90, + 0x88,0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78, + 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08, + 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06, + 0x00,0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20, + 0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xa0,0x78, + 0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08, + 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00, + 0x00,0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20, + 0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70, + 0x88,0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40, + 0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0, + 0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,0x07, + 0x07,0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09,0x09,0x06,0x00, + 0x00,0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00, + 0x68,0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20, + 0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70, + 0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88, + 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98, + 0xa8,0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05, + 0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe, + 0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xfe, + 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x50, + 0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80 +}; + +#endif // !STM32_NOT_EXTENDED_ISO10646_1_5X7 + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp new file mode 100644 index 0000000000..12efb3ba49 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp @@ -0,0 +1,302 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* + Fontname: Helvetica + Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. + Capital A Height: 12, '1' Height: 12 + Calculated Max Values w=14 h=17 x= 2 y=10 dx=16 dy= 0 ascent=14 len=32 + Font Bounding box w=16 h=17 x= 0 y=-4 + Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 + Pure Font ascent =12 descent=-4 + X Font ascent =12 descent=-4 + Max Font ascent =14 descent=-4 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +extern const uint8_t Helvetica12Bold[4172] = { + 0,16,17,0,252,12,2,74,5,106,32,255,252,14,252,12, + 252,0,0,0,5,0,0,2,12,12,6,2,0,192,192,192, + 192,192,192,192,192,192,0,192,192,5,4,4,8,1,8,216, + 216,216,72,9,12,24,9,0,0,27,0,27,0,27,0,127, + 128,127,128,54,0,54,0,255,0,255,0,108,0,108,0,108, + 0,7,14,14,9,1,255,16,124,254,214,208,240,120,60,30, + 22,214,254,124,16,13,12,24,14,0,0,48,64,120,128,204, + 128,205,0,121,0,50,0,2,96,4,240,5,152,9,152,8, + 240,16,96,10,12,24,12,1,0,60,0,126,0,102,0,102, + 0,60,0,56,192,125,192,207,128,199,0,199,0,127,128,57, + 192,2,4,4,4,1,8,192,192,192,64,4,15,15,6,1, + 253,48,112,96,192,192,192,192,192,192,192,192,192,96,112,48, + 4,15,15,6,0,253,192,224,96,48,48,48,48,48,48,48, + 48,48,96,224,192,5,5,5,6,0,7,32,168,112,112,136, + 8,8,8,10,1,0,24,24,24,255,255,24,24,24,2,5, + 5,4,1,253,192,192,64,64,128,4,2,2,5,0,3,240, + 240,2,2,2,4,1,0,192,192,4,12,12,5,0,0,16, + 16,48,32,32,96,64,64,192,128,128,128,8,12,12,9,0, + 0,60,126,231,195,195,195,195,195,195,231,126,60,5,12,12, + 9,1,0,8,24,248,248,24,24,24,24,24,24,24,24,8, + 12,12,9,0,0,60,126,231,195,195,7,14,28,56,112,255, + 255,8,12,12,9,0,0,60,126,231,195,7,30,30,7,195, + 231,126,60,8,12,12,9,0,0,14,30,54,54,102,102,198, + 255,255,6,6,6,8,12,12,9,0,0,63,63,48,48,124, + 126,71,3,3,231,126,60,8,12,12,9,0,0,60,126,231, + 192,220,254,231,195,195,231,126,60,8,12,12,9,0,0,255, + 255,6,6,12,12,24,24,24,48,48,48,8,12,12,9,0, + 0,60,126,231,195,102,60,126,231,195,231,126,60,8,12,12, + 9,0,0,60,126,231,195,195,231,127,59,3,231,126,60,2, + 8,8,5,2,0,192,192,0,0,0,0,192,192,2,11,11, + 5,2,253,192,192,0,0,0,0,192,192,64,64,128,8,8, + 8,10,1,0,3,15,60,224,224,60,15,3,8,6,6,10, + 1,1,255,255,0,0,255,255,8,8,8,10,1,0,192,240, + 60,7,7,60,240,192,7,12,12,10,1,0,124,254,198,198, + 6,14,12,24,24,0,24,24,13,14,28,16,1,254,15,192, + 56,96,96,16,71,216,204,72,136,200,152,200,152,136,153,152, + 201,144,70,96,96,0,56,192,15,128,11,12,24,12,0,0, + 14,0,14,0,31,0,27,0,59,128,49,128,113,192,96,192, + 127,192,255,224,192,96,192,96,9,12,24,11,1,0,254,0, + 255,0,195,128,193,128,195,128,255,0,255,0,195,128,193,128, + 195,128,255,0,254,0,10,12,24,12,1,0,31,0,63,128, + 113,192,96,192,224,0,192,0,192,0,224,0,96,192,113,192, + 63,128,31,0,10,12,24,12,1,0,252,0,255,0,195,128, + 193,128,193,192,192,192,192,192,193,192,193,128,195,128,255,0, + 252,0,8,12,12,10,1,0,255,255,192,192,192,254,254,192, + 192,192,255,255,8,12,12,10,1,0,255,255,192,192,192,254, + 254,192,192,192,192,192,10,12,24,12,1,0,31,0,63,128, + 113,192,96,192,224,0,192,0,195,192,227,192,96,192,113,192, + 63,192,30,192,10,12,24,12,1,0,192,192,192,192,192,192, + 192,192,255,192,255,192,192,192,192,192,192,192,192,192,192,192, + 192,192,2,12,12,4,1,0,192,192,192,192,192,192,192,192, + 192,192,192,192,7,12,12,9,1,0,6,6,6,6,6,6, + 6,6,198,198,254,124,10,12,24,12,1,0,193,192,195,128, + 199,0,206,0,220,0,248,0,252,0,206,0,199,0,195,128, + 193,192,192,192,8,12,12,10,1,0,192,192,192,192,192,192, + 192,192,192,192,255,255,11,12,24,13,1,0,224,224,224,224, + 224,224,241,224,241,224,209,96,219,96,219,96,202,96,206,96, + 206,96,196,96,10,12,24,12,1,0,224,192,240,192,240,192, + 216,192,216,192,204,192,204,192,198,192,198,192,195,192,195,192, + 193,192,11,12,24,13,1,0,31,0,63,128,113,192,96,192, + 224,224,192,96,192,96,224,224,96,192,113,192,63,128,31,0, + 9,12,24,11,1,0,254,0,255,0,195,128,193,128,193,128, + 195,128,255,0,254,0,192,0,192,0,192,0,192,0,11,13, + 26,13,1,255,31,0,63,128,113,192,96,192,224,224,192,96, + 192,96,226,96,103,192,115,192,63,128,31,192,0,128,10,12, + 24,12,1,0,255,0,255,128,193,128,193,128,195,128,255,0, + 255,0,195,128,193,128,193,128,193,192,193,192,9,12,24,11, + 1,0,62,0,127,0,227,128,193,128,240,0,126,0,31,0, + 3,128,193,128,227,128,127,0,62,0,10,12,24,10,0,0, + 255,192,255,192,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,12,0,12,0,10,12,24,12,1,0,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 225,192,127,128,63,0,10,12,24,11,0,0,192,192,192,192, + 97,128,97,128,97,128,51,0,51,0,51,0,30,0,30,0, + 12,0,12,0,14,12,24,15,0,0,195,12,195,12,195,12, + 99,24,103,152,103,152,52,176,60,240,60,240,24,96,24,96, + 24,96,9,12,24,11,1,0,193,128,227,128,99,0,54,0, + 62,0,28,0,28,0,62,0,54,0,99,0,227,128,193,128, + 10,12,24,11,0,0,192,192,225,192,97,128,51,0,51,0, + 30,0,30,0,12,0,12,0,12,0,12,0,12,0,8,12, + 12,10,1,0,255,255,7,6,12,28,56,48,96,224,255,255, + 4,15,15,6,1,253,240,240,192,192,192,192,192,192,192,192, + 192,192,192,240,240,4,12,12,5,0,0,128,128,192,64,64, + 96,32,32,48,16,16,16,4,15,15,6,0,253,240,240,48, + 48,48,48,48,48,48,48,48,48,48,240,240,8,7,7,10, + 1,5,24,24,60,102,102,195,195,9,1,2,9,0,253,255, + 128,3,3,3,6,2,10,128,192,32,8,9,9,9,1,0, + 124,254,198,14,126,230,198,254,119,8,12,12,10,1,0,192, + 192,192,220,254,231,195,195,195,231,254,220,8,9,9,9,1, + 0,60,126,231,192,192,192,231,126,60,8,12,12,10,1,0, + 3,3,3,63,127,231,195,195,195,231,127,59,8,9,9,10, + 1,0,60,126,195,255,255,192,231,126,60,4,12,12,6,1, + 0,48,112,96,240,240,96,96,96,96,96,96,96,8,13,13, + 10,1,252,59,127,231,195,195,195,231,127,59,3,231,126,60, + 8,12,12,10,1,0,192,192,192,222,255,227,195,195,195,195, + 195,195,2,12,12,4,1,0,192,192,0,192,192,192,192,192, + 192,192,192,192,3,16,16,5,1,252,96,96,0,96,96,96, + 96,96,96,96,96,96,96,96,224,192,8,12,12,9,1,0, + 192,192,192,199,206,220,248,252,236,206,198,199,2,12,12,4, + 1,0,192,192,192,192,192,192,192,192,192,192,192,192,12,9, + 18,14,1,0,222,224,255,240,231,48,198,48,198,48,198,48, + 198,48,198,48,198,48,8,9,9,10,1,0,222,255,227,195, + 195,195,195,195,195,8,9,9,10,1,0,60,126,231,195,195, + 195,231,126,60,8,13,13,10,1,252,220,254,231,195,195,195, + 231,254,220,192,192,192,192,8,13,13,10,1,252,59,127,231, + 195,195,195,231,127,59,3,3,3,3,5,9,9,6,1,0, + 216,248,224,192,192,192,192,192,192,7,9,9,9,1,0,124, + 254,198,240,124,14,198,254,124,4,11,11,6,1,0,96,96, + 240,240,96,96,96,96,96,112,48,8,9,9,10,1,0,195, + 195,195,195,195,195,199,255,123,8,9,9,9,0,0,195,195, + 102,102,102,60,60,24,24,12,9,18,13,0,0,198,48,198, + 48,102,96,102,96,111,96,63,192,57,192,25,128,25,128,7, + 9,9,9,1,0,198,198,108,124,56,124,108,198,198,8,13, + 13,9,0,252,195,195,99,102,54,54,60,28,24,24,24,112, + 96,7,9,9,8,0,0,254,254,14,28,24,56,112,254,254, + 4,15,15,6,1,253,48,112,96,96,96,96,96,192,96,96, + 96,96,96,112,48,1,16,16,4,1,252,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,4,15,15,6,1, + 253,192,224,96,96,96,96,96,48,96,96,96,96,96,224,192, + 8,3,3,10,1,3,113,153,142,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,5,0,0,2,12,12,6,1,253,192,192,0,64,64, + 64,192,192,192,192,192,192,8,11,11,9,0,255,4,60,126, + 239,200,216,208,247,126,60,32,8,12,12,9,0,0,28,62, + 99,99,96,48,124,48,48,32,127,255,7,7,7,9,1,2, + 186,124,198,198,198,124,186,8,12,12,9,0,0,195,195,102, + 102,60,24,126,24,126,24,24,24,1,16,16,5,2,252,128, + 128,128,128,128,128,128,0,0,128,128,128,128,128,128,128,8, + 15,15,9,0,253,60,126,102,96,120,126,199,195,243,126,30, + 6,102,126,60,5,2,2,6,0,10,216,216,12,12,24,12, + 0,0,15,0,57,192,96,96,79,32,217,176,144,16,144,16, + 217,176,79,32,96,32,57,192,15,0,5,7,7,6,1,5, + 96,144,112,144,120,0,248,8,6,6,9,0,2,51,102,204, + 204,102,51,8,5,5,10,0,2,255,255,3,3,3,4,2, + 2,5,0,3,240,240,12,12,24,12,0,0,15,0,57,192, + 96,96,95,32,217,176,153,144,158,16,219,48,91,32,96,96, + 57,192,15,0,5,1,1,6,0,10,248,4,5,5,7,1, + 7,96,144,144,144,96,8,11,11,10,1,0,24,24,24,255, + 255,24,24,24,0,255,255,5,7,7,6,0,5,112,216,216, + 48,96,248,248,5,7,7,6,0,5,112,216,24,48,24,216, + 112,3,3,3,6,1,10,32,96,128,8,12,12,10,1,253, + 195,195,195,195,195,195,199,255,251,192,192,192,8,15,15,9, + 0,253,127,242,242,242,242,242,114,18,18,18,18,18,18,18, + 18,2,2,2,5,1,4,192,192,5,4,4,6,0,252,32, + 48,152,112,4,7,7,6,1,5,48,240,240,48,48,48,48, + 5,7,7,6,0,5,112,216,136,216,112,0,248,8,6,6, + 9,1,2,204,102,51,51,102,204,13,12,24,14,1,0,48, + 192,240,128,241,128,49,0,51,48,50,112,54,240,4,176,13, + 176,9,248,24,48,16,48,12,12,24,14,0,0,48,128,241, + 128,241,0,51,0,50,0,54,224,53,176,13,176,8,96,24, + 192,17,240,49,240,13,12,24,14,0,0,112,64,216,192,24, + 128,49,128,25,48,219,112,114,240,6,176,5,176,13,248,8, + 48,24,48,7,12,12,10,1,253,48,48,0,48,48,96,224, + 192,198,198,254,124,11,14,28,12,0,0,4,0,0,0,14, + 0,14,0,31,0,27,0,59,128,49,128,113,192,96,192,127, + 192,255,224,192,96,192,96,11,14,28,12,0,0,8,0,0, + 0,14,0,14,0,31,0,27,0,59,128,49,128,113,192,96, + 192,127,192,255,224,192,96,192,96,11,14,28,12,0,0,17, + 0,0,0,14,0,14,0,31,0,27,0,59,128,49,128,113, + 192,96,192,127,192,255,224,192,96,192,96,11,14,28,12,0, + 0,23,0,0,0,14,0,14,0,31,0,27,0,59,128,49, + 128,113,192,96,192,127,192,255,224,192,96,192,96,11,14,28, + 12,0,0,49,128,0,0,14,0,14,0,31,0,27,0,59, + 128,49,128,113,192,96,192,127,192,255,224,192,96,192,96,11, + 14,28,12,0,0,18,0,12,0,14,0,14,0,31,0,27, + 0,59,128,49,128,113,192,96,192,127,192,255,224,192,96,192, + 96,14,12,24,15,0,0,31,252,31,252,27,0,51,0,51, + 0,51,248,99,248,127,0,127,0,195,0,195,252,195,252,10, + 16,32,12,1,252,31,0,63,128,113,192,96,192,224,0,192, + 0,192,0,224,0,96,192,113,192,63,128,31,0,4,0,6, + 0,19,0,14,0,8,14,14,10,1,0,8,0,255,255,192, + 192,192,254,254,192,192,192,255,255,8,14,14,10,1,0,16, + 0,255,255,192,192,192,254,254,192,192,192,255,255,8,14,14, + 10,1,0,34,0,255,255,192,192,192,254,254,192,192,192,255, + 255,8,14,14,10,1,0,102,0,255,255,192,192,192,254,254, + 192,192,192,255,255,2,14,14,4,1,0,64,0,192,192,192, + 192,192,192,192,192,192,192,192,192,2,14,14,4,1,0,128, + 0,192,192,192,192,192,192,192,192,192,192,192,192,5,14,14, + 5,0,0,136,0,96,96,96,96,96,96,96,96,96,96,96, + 96,5,14,14,5,0,0,152,0,96,96,96,96,96,96,96, + 96,96,96,96,96,12,12,24,12,0,0,63,0,63,192,48, + 224,48,96,48,112,252,48,252,48,48,112,48,96,48,224,63, + 192,63,0,10,14,28,12,1,0,46,0,0,0,224,192,240, + 192,240,192,216,192,216,192,204,192,204,192,198,192,198,192,195, + 192,195,192,193,192,11,14,28,13,1,0,2,0,0,0,31, + 0,63,128,113,192,96,192,224,224,192,96,192,96,224,224,96, + 192,113,192,63,128,31,0,11,14,28,13,1,0,4,0,0, + 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,224, + 224,96,192,113,192,63,128,31,0,11,14,28,13,1,0,17, + 0,0,0,31,0,63,128,113,192,96,192,224,224,192,96,192, + 96,224,224,96,192,113,192,63,128,31,0,11,14,28,13,1, + 0,23,0,0,0,31,0,63,128,113,192,96,192,224,224,192, + 96,192,96,224,224,96,192,113,192,63,128,31,0,11,14,28, + 13,1,0,25,128,0,0,31,0,63,128,113,192,96,192,224, + 224,192,96,192,96,224,224,96,192,113,192,63,128,31,0,9, + 9,18,10,0,0,65,0,227,128,119,0,62,0,28,0,62, + 0,119,0,227,128,65,0,11,12,24,13,1,0,31,32,63, + 192,112,192,97,192,227,96,198,96,204,96,216,224,112,192,97, + 192,127,128,159,0,10,14,28,12,1,0,4,0,0,0,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,225,192,127,128,63,0,10,14,28,12,1,0,8,0,0, + 0,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,225,192,127,128,63,0,10,14,28,12,1,0,17, + 0,0,0,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,225,192,127,128,63,0,10,14,28,12,1, + 0,51,0,0,0,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,225,192,127,128,63,0,10,14,28, + 11,0,0,8,0,0,0,192,192,225,192,97,128,51,0,51, + 0,30,0,30,0,12,0,12,0,12,0,12,0,12,0,9, + 12,24,11,1,0,192,0,254,0,255,0,195,128,193,128,193, + 128,195,128,255,0,254,0,192,0,192,0,192,0,8,12,12, + 10,1,0,124,254,198,198,220,222,195,195,195,195,222,220,8, + 13,13,9,1,0,32,48,8,0,124,254,198,14,126,230,198, + 254,119,8,13,13,9,1,0,4,12,16,0,124,254,198,14, + 126,230,198,254,119,8,13,13,9,1,0,16,56,68,0,124, + 254,198,14,126,230,198,254,119,8,12,12,9,1,0,58,92, + 0,124,254,198,14,126,230,198,254,119,8,12,12,9,1,0, + 108,108,0,124,254,198,14,126,230,198,254,119,8,13,13,9, + 1,0,24,36,36,24,124,254,198,14,126,230,198,254,119,13, + 9,18,15,1,0,125,224,255,240,198,24,15,248,127,248,230, + 0,207,56,255,240,121,224,8,13,13,9,1,252,60,126,231, + 192,192,192,231,126,60,16,24,76,56,8,13,13,10,1,0, + 32,48,8,0,60,126,195,255,255,192,231,126,60,8,13,13, + 10,1,0,4,12,16,0,60,126,195,255,255,192,231,126,60, + 8,13,13,10,1,0,8,28,34,0,60,126,195,255,255,192, + 231,126,60,8,12,12,10,1,0,54,54,0,60,126,195,255, + 255,192,231,126,60,3,13,13,4,0,0,128,192,32,0,96, + 96,96,96,96,96,96,96,96,3,13,13,4,1,0,32,96, + 128,0,192,192,192,192,192,192,192,192,192,5,13,13,5,0, + 0,32,112,136,0,96,96,96,96,96,96,96,96,96,5,12, + 12,5,0,0,216,216,0,96,96,96,96,96,96,96,96,96, + 8,12,12,10,1,0,96,124,248,28,126,231,195,195,195,231, + 126,60,8,12,12,10,1,0,58,92,0,222,255,227,195,195, + 195,195,195,195,8,13,13,10,1,0,32,48,8,0,60,126, + 231,195,195,195,231,126,60,8,13,13,10,1,0,8,24,32, + 0,60,126,231,195,195,195,231,126,60,8,13,13,10,1,0, + 16,56,68,0,60,126,231,195,195,195,231,126,60,8,12,12, + 10,1,0,58,92,0,60,126,231,195,195,195,231,126,60,8, + 12,12,10,1,0,108,108,0,60,126,231,195,195,195,231,126, + 60,8,8,8,10,1,0,24,24,0,255,255,0,24,24,8, + 9,9,10,1,0,61,127,231,207,219,243,231,254,188,8,13, + 13,10,1,0,32,48,8,0,195,195,195,195,195,195,199,255, + 123,8,13,13,10,1,0,8,24,32,0,195,195,195,195,195, + 195,199,255,123,8,13,13,10,1,0,16,56,68,0,195,195, + 195,195,195,195,199,255,123,8,12,12,10,1,0,108,108,0, + 195,195,195,195,195,195,199,255,123,8,17,17,9,0,252,4, + 12,16,0,195,195,99,102,54,54,60,28,24,24,24,112,96, + 8,16,16,10,1,252,192,192,192,220,254,231,195,195,195,231, + 254,220,192,192,192,192,8,16,16,9,0,252,54,54,0,195, + 195,99,102,54,54,60,28,24,24,24,112,96 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp new file mode 100644 index 0000000000..a27ea43697 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp @@ -0,0 +1,378 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* + Fontname: Helvetica + Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. + Capital A Height: 14, '1' Height: 13 + Calculated Max Values w=16 h=18 x= 2 y=12 dx=18 dy= 0 ascent=16 len=36 + Font Bounding box w=18 h=19 x= 0 y=-4 + Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 + Pure Font ascent =14 descent=-4 + X Font ascent =14 descent=-4 + Max Font ascent =16 descent=-4 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +/* +typedef struct __attribute__((__packed__)) { + uint8_t BBXWidth; + uint8_t BBXHeight; + uint8_t DataSize; + int8_t DWidth; + int8_t BBXOffsetX; + int8_t BBXOffsetY; +} tGlyph; +*/ + +extern const uint8_t Helvetica14_symbols[63] = { + 0,18,19,0,252,14,0,0,0,0,1,9,252,16,252,14,252, // tFont + 0,0,0,0,0,0, // 0x01 - LCD_STR_REFRESH + 0,0,0,0,0,0, // 0x02 - LCD_STR_FOLDER + 255, // 0x03 - LCD_STR_ARROW_RIGHT + 255, // 0x04 - LCD_STR_UPLEVEL + 255, // 0x05 - LCD_STR_CLOCK + 255, // 0x06 - LCD_STR_FEEDRATE + 255, // 0x07 - LCD_STR_BEDTEMP + 5,12,12,6,0,1,32,80,80,80,80,80,80,80,136,136,136,112, // 0x08 - LCD_STR_THERMOMETER + 5,5,5,5,0,11,112,216,136,216,112, // 0x09 - LCD_STR_DEGREE +}; + +extern const uint8_t Helvetica14[5005] = { + 0,18,19,0,252,14,2,150,6,83,32,255,252,16,252,14,252, // tFont + 0,0,0,5,0,0,2,14,14,6,2,0,192,192,192, + 192,192,192,192,192,192,192,0,0,192,192,5,5,5,5,0, + 9,216,216,216,216,216,10,13,26,10,0,0,9,0,9,0, + 9,0,127,192,127,192,18,0,18,0,18,0,255,128,255,128, + 36,0,36,0,36,0,9,16,32,10,1,254,8,0,62,0, + 127,0,203,0,200,0,232,0,120,0,62,0,15,0,9,128, + 201,128,235,128,127,0,62,0,8,0,8,0,14,13,26,16, + 1,0,120,96,204,192,204,192,205,128,205,128,123,0,3,0, + 6,120,6,204,12,204,12,204,24,204,24,120,12,13,26,13, + 1,0,60,0,126,0,102,0,102,0,60,0,124,0,238,192, + 198,192,195,192,195,128,231,192,126,224,60,112,2,5,5,4, + 1,9,192,192,192,192,192,4,18,18,6,0,252,16,48,96, + 96,192,192,192,192,192,192,192,192,192,192,96,96,48,16,4, + 18,18,6,1,252,128,192,96,96,48,48,48,48,48,48,48, + 48,48,48,96,96,192,128,5,7,7,7,1,7,32,168,248, + 32,248,168,32,8,10,10,10,1,0,24,24,24,24,255,255, + 24,24,24,24,2,5,5,5,1,253,192,192,64,64,128,5, + 2,2,6,0,4,248,248,2,2,2,5,1,0,192,192,5, + 14,14,5,0,0,24,24,24,24,48,48,48,96,96,96,192, + 192,192,192,8,13,13,10,1,0,60,126,102,195,195,195,195, + 195,195,195,102,126,60,5,13,13,10,2,0,24,248,248,24, + 24,24,24,24,24,24,24,24,24,8,13,13,10,1,0,60, + 254,195,3,7,14,28,56,112,224,192,255,255,8,13,13,10, + 1,0,62,127,195,195,6,28,30,7,3,195,199,126,60,9, + 13,26,10,0,0,3,0,7,0,15,0,27,0,51,0,51, + 0,99,0,195,0,255,128,255,128,3,0,3,0,3,0,8, + 13,13,10,1,0,254,254,192,192,252,254,199,3,3,195,199, + 254,124,8,13,13,10,1,0,60,127,99,192,192,220,254,195, + 195,195,227,126,60,8,13,13,10,1,0,255,255,3,6,12, + 12,24,24,48,48,96,96,96,8,13,13,10,1,0,60,126, + 231,195,195,102,126,231,195,195,231,126,60,8,13,13,10,1, + 0,60,126,199,195,195,195,127,59,3,3,198,254,124,2,10, + 10,5,1,0,192,192,0,0,0,0,0,0,192,192,2,13, + 13,5,1,253,192,192,0,0,0,0,0,0,192,192,64,64, + 128,8,9,9,10,1,0,3,15,60,112,192,112,60,15,3, + 7,5,5,11,2,2,254,254,0,254,254,8,9,9,10,1, + 0,192,240,60,14,3,14,60,240,192,7,14,14,10,1,0, + 124,254,198,198,14,28,56,48,48,48,0,0,48,48,16,17, + 34,18,1,253,3,240,15,252,28,14,48,6,99,211,103,115, + 198,51,204,99,204,102,204,102,204,204,207,248,103,112,112,0, + 56,0,31,240,7,224,12,14,28,13,0,0,6,0,6,0, + 15,0,15,0,25,128,25,128,48,192,48,192,63,192,127,224, + 96,96,96,96,192,48,192,48,11,14,28,13,1,0,255,0, + 255,128,193,192,192,192,192,192,193,128,255,128,255,192,192,224, + 192,96,192,96,192,224,255,192,255,128,12,14,28,14,1,0, + 15,128,63,224,112,112,96,48,224,0,192,0,192,0,192,0, + 192,0,224,0,96,48,112,112,63,224,15,128,12,14,28,14, + 1,0,255,128,255,192,192,224,192,96,192,48,192,48,192,48, + 192,48,192,48,192,48,192,96,192,224,255,192,255,128,10,14, + 28,13,2,0,255,192,255,192,192,0,192,0,192,0,192,0, + 255,128,255,128,192,0,192,0,192,0,192,0,255,192,255,192, + 9,14,28,12,2,0,255,128,255,128,192,0,192,0,192,0, + 192,0,255,0,255,0,192,0,192,0,192,0,192,0,192,0, + 192,0,13,14,28,15,1,0,15,192,63,240,112,56,96,24, + 224,24,192,0,192,0,192,248,192,248,224,24,96,24,112,56, + 63,248,15,216,11,14,28,14,1,0,192,96,192,96,192,96, + 192,96,192,96,192,96,255,224,255,224,192,96,192,96,192,96, + 192,96,192,96,192,96,2,14,14,6,2,0,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,8,14,14,10,0,0, + 3,3,3,3,3,3,3,3,3,195,195,231,126,60,11,14, + 28,14,2,0,192,224,193,192,195,128,199,0,206,0,220,0, + 248,0,252,0,206,0,199,0,195,128,193,192,192,224,192,96, + 9,14,28,11,1,0,192,0,192,0,192,0,192,0,192,0, + 192,0,192,0,192,0,192,0,192,0,192,0,192,0,255,128, + 255,128,14,14,28,16,1,0,192,12,192,12,224,28,224,28, + 240,60,240,60,216,108,216,108,204,204,204,204,196,140,199,140, + 195,12,195,12,11,14,28,14,1,0,192,96,224,96,240,96, + 240,96,216,96,204,96,204,96,198,96,198,96,195,96,193,224, + 193,224,192,224,192,96,13,14,28,15,1,0,15,128,63,224, + 112,112,96,48,224,56,192,24,192,24,192,24,192,24,224,56, + 96,48,112,112,63,224,15,128,10,14,28,13,2,0,255,0, + 255,128,193,192,192,192,192,192,193,192,255,128,255,0,192,0, + 192,0,192,0,192,0,192,0,192,0,13,15,30,15,1,255, + 15,128,63,224,112,112,96,48,224,56,192,24,192,24,192,24, + 192,24,225,184,97,176,112,240,63,224,15,176,0,48,11,14, + 28,14,1,0,255,128,255,192,192,224,192,96,192,96,192,224, + 255,192,255,128,192,192,192,192,192,96,192,96,192,96,192,96, + 10,14,28,13,1,0,30,0,127,128,225,192,192,192,224,0, + 124,0,31,0,3,128,1,192,0,192,192,192,225,192,127,128, + 63,0,10,14,28,12,1,0,255,192,255,192,12,0,12,0, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,11,14,28,14,1,0,192,96,192,96,192,96, + 192,96,192,96,192,96,192,96,192,96,192,96,192,96,192,96, + 96,192,127,192,31,0,12,14,28,13,0,0,192,48,192,48, + 96,96,96,96,96,96,48,192,48,192,48,192,25,128,25,128, + 25,128,15,0,15,0,6,0,16,14,28,18,1,0,193,131, + 193,131,193,131,195,195,99,198,98,70,102,102,102,102,54,108, + 54,108,52,44,28,56,24,24,24,24,11,14,28,13,1,0, + 192,96,192,96,96,192,113,192,49,128,27,0,14,0,14,0, + 27,0,49,128,113,192,96,192,192,96,192,96,12,14,28,13, + 0,0,192,48,192,48,96,96,96,96,48,192,57,192,25,128, + 15,0,6,0,6,0,6,0,6,0,6,0,6,0,10,14, + 28,12,1,0,255,192,255,192,0,192,1,128,3,0,6,0, + 12,0,28,0,24,0,48,0,96,0,192,0,255,192,255,192, + 4,18,18,5,0,252,240,240,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,240,240,5,14,14,5,0,0,192,192, + 192,96,96,96,48,48,48,48,24,24,24,24,4,18,18,5, + 0,252,240,240,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,240,240,7,6,6,9,1,7,16,56,108,108,198,198, + 11,2,4,11,0,252,255,224,255,224,4,3,3,4,0,11, + 192,96,48,9,10,20,11,1,0,126,0,231,0,195,0,7, + 0,127,0,227,0,195,0,195,0,231,128,121,128,9,14,28, + 11,1,0,192,0,192,0,192,0,192,0,222,0,255,0,227, + 0,193,128,193,128,193,128,193,128,227,0,255,0,222,0,8, + 10,10,10,1,0,62,127,99,192,192,192,192,99,127,62,9, + 14,28,11,1,0,1,128,1,128,1,128,1,128,61,128,127, + 128,99,128,193,128,193,128,193,128,193,128,99,128,127,128,61, + 128,8,10,10,10,1,0,60,126,195,195,255,192,192,227,127, + 60,6,14,14,6,0,0,28,60,48,48,252,252,48,48,48, + 48,48,48,48,48,9,14,28,11,1,252,61,128,127,128,97, + 128,193,128,193,128,193,128,193,128,99,128,127,128,61,128,1, + 128,99,0,127,0,28,0,8,14,14,10,1,0,192,192,192, + 192,222,255,227,195,195,195,195,195,195,195,2,14,14,4,1, + 0,192,192,0,0,192,192,192,192,192,192,192,192,192,192,3, + 18,18,4,0,252,96,96,0,0,96,96,96,96,96,96,96, + 96,96,96,96,96,224,192,8,14,14,9,1,0,192,192,192, + 192,198,204,216,240,248,216,204,206,198,199,2,14,14,4,1, + 0,192,192,192,192,192,192,192,192,192,192,192,192,192,192,14, + 10,20,16,1,0,222,120,255,252,227,140,195,12,195,12,195, + 12,195,12,195,12,195,12,195,12,8,10,10,10,1,0,222, + 255,227,195,195,195,195,195,195,195,9,10,20,11,1,0,62, + 0,127,0,99,0,193,128,193,128,193,128,193,128,99,0,127, + 0,62,0,9,14,28,11,1,252,222,0,255,0,227,0,193, + 128,193,128,193,128,193,128,227,0,255,0,222,0,192,0,192, + 0,192,0,192,0,9,14,28,11,1,252,61,128,127,128,99, + 128,193,128,193,128,193,128,193,128,99,128,127,128,61,128,1, + 128,1,128,1,128,1,128,5,10,10,6,1,0,216,216,224, + 192,192,192,192,192,192,192,7,10,10,9,1,0,60,126,198, + 192,252,62,6,198,252,120,6,13,13,6,0,0,48,48,48, + 252,252,48,48,48,48,48,48,60,28,8,10,10,10,1,0, + 195,195,195,195,195,195,195,199,255,123,8,10,10,10,1,0, + 195,195,195,102,102,102,36,60,24,24,12,10,20,14,1,0, + 198,48,198,48,198,48,102,96,102,96,105,96,41,64,57,192, + 25,128,25,128,8,10,10,10,1,0,195,231,102,60,24,24, + 60,102,231,195,8,14,14,10,1,252,195,195,195,102,102,102, + 36,60,24,24,24,24,112,112,7,10,10,9,1,0,254,254, + 6,12,24,48,96,192,254,254,5,18,18,6,0,252,24,48, + 96,96,96,96,96,192,128,192,96,96,96,96,96,96,48,24, + 2,18,18,5,1,252,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,6,18,18,6,0,252,192,96, + 48,48,48,48,48,24,12,24,48,48,48,48,48,48,96,192, + 8,3,3,10,1,4,115,255,206,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,5,0,0,2,14,14,6,2,252,192,192,0,0,64, + 64,192,192,192,192,192,192,192,192,8,14,14,10,1,254,4, + 4,62,127,107,200,200,200,200,107,127,62,16,16,9,13,26, + 10,0,0,30,0,63,0,97,128,97,128,96,0,48,0,126, + 0,24,0,24,0,48,0,96,128,255,128,223,0,8,7,7, + 10,1,3,195,255,102,102,102,255,195,8,13,13,10,1,0, + 195,195,102,102,102,60,255,24,255,24,24,24,24,2,18,18, + 5,1,252,192,192,192,192,192,192,192,0,0,0,0,192,192, + 192,192,192,192,192,8,18,18,10,1,252,60,126,195,195,240, + 124,110,199,195,227,115,62,14,7,195,195,126,60,5,2,2, + 6,0,12,216,216,13,14,28,15,1,0,15,128,48,96,64, + 16,71,16,136,136,144,136,144,8,144,8,144,8,136,136,71, + 16,64,16,48,96,15,128,5,8,8,7,1,6,112,152,56, + 72,216,104,0,248,7,6,6,9,1,2,54,108,216,216,108, + 54,9,5,10,11,1,3,255,128,255,128,1,128,1,128,1, + 128,5,1,1,6,0,5,248,13,14,28,14,0,0,15,128, + 48,96,64,16,79,144,136,72,136,72,136,72,143,136,137,8, + 136,136,72,80,64,16,48,96,15,128,5,1,1,5,0,12, + 248,5,5,5,7,1,8,112,216,136,216,112,8,11,11,10, + 1,0,24,24,24,255,255,24,24,24,0,255,255,5,8,8, + 6,0,5,112,248,152,24,48,96,248,248,5,8,8,6,0, + 5,112,248,152,48,48,152,248,112,4,3,3,4,0,11,48, + 96,192,8,14,14,10,1,252,195,195,195,195,195,195,195,231, + 255,219,192,192,192,192,8,18,18,10,1,252,63,114,242,242, + 242,242,242,114,50,18,18,18,18,18,18,18,18,18,2,2, + 2,4,1,4,192,192,5,5,5,5,0,252,96,112,24,216, + 240,4,8,8,6,0,5,48,240,240,48,48,48,48,48,5, + 8,8,7,1,6,112,216,136,136,216,112,0,248,7,6,6, + 9,1,2,216,108,54,54,108,216,14,13,26,15,0,0,48, + 48,240,48,240,96,48,192,48,192,49,136,49,24,51,56,6, + 120,6,216,12,252,24,24,24,24,14,13,26,15,0,0,48, + 48,240,48,240,96,48,192,48,192,49,184,49,124,51,76,6, + 12,6,24,12,48,24,124,24,124,14,13,26,15,0,0,112, + 48,248,48,152,96,48,192,48,192,153,136,249,24,115,56,6, + 120,6,216,12,252,24,24,24,24,7,14,14,10,1,252,24, + 24,0,0,24,24,24,56,112,224,198,198,254,124,12,16,32, + 13,0,0,6,0,0,0,6,0,6,0,15,0,15,0,25, + 128,25,128,48,192,48,192,63,192,127,224,96,96,96,96,192, + 48,192,48,12,16,32,13,0,0,6,0,0,0,6,0,6, + 0,15,0,15,0,25,128,25,128,48,192,48,192,63,192,127, + 224,96,96,96,96,192,48,192,48,12,16,32,13,0,0,25, + 128,0,0,6,0,6,0,15,0,15,0,25,128,25,128,48, + 192,48,192,63,192,127,224,96,96,96,96,192,48,192,48,12, + 16,32,13,0,0,19,0,0,0,6,0,6,0,15,0,15, + 0,25,128,25,128,48,192,48,192,63,192,127,224,96,96,96, + 96,192,48,192,48,12,16,32,13,0,0,25,128,0,0,6, + 0,6,0,15,0,15,0,25,128,25,128,48,192,48,192,63, + 192,127,224,96,96,96,96,192,48,192,48,12,16,32,13,0, + 0,9,0,9,0,6,0,6,0,15,0,15,0,25,128,25, + 128,48,192,48,192,63,192,127,224,96,96,96,96,192,48,192, + 48,16,14,28,18,1,0,7,255,7,255,13,128,13,128,25, + 128,25,128,49,254,49,254,63,128,127,128,97,128,97,128,193, + 255,193,255,12,18,36,14,1,252,15,128,63,224,112,112,96, + 48,224,0,192,0,192,0,192,0,192,0,224,0,96,48,112, + 112,63,224,15,128,6,0,3,0,27,0,30,0,10,16,32, + 13,2,0,12,0,0,0,255,192,255,192,192,0,192,0,192, + 0,192,0,255,128,255,128,192,0,192,0,192,0,192,0,255, + 192,255,192,10,16,32,13,2,0,12,0,0,0,255,192,255, + 192,192,0,192,0,192,0,192,0,255,128,255,128,192,0,192, + 0,192,0,192,0,255,192,255,192,10,16,32,13,2,0,51, + 0,0,0,255,192,255,192,192,0,192,0,192,0,192,0,255, + 128,255,128,192,0,192,0,192,0,192,0,255,192,255,192,10, + 16,32,13,2,0,51,0,0,0,255,192,255,192,192,0,192, + 0,192,0,192,0,255,128,255,128,192,0,192,0,192,0,192, + 0,255,192,255,192,2,16,16,6,2,0,192,0,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,2,16,16,6,2, + 0,192,0,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,6,16,16,6,0,0,132,0,48,48,48,48,48,48,48, + 48,48,48,48,48,48,48,6,16,16,6,0,0,204,0,48, + 48,48,48,48,48,48,48,48,48,48,48,48,48,13,14,28, + 14,0,0,127,192,127,224,96,112,96,48,96,24,96,24,252, + 24,252,24,96,24,96,24,96,48,96,112,127,224,127,192,11, + 16,32,14,1,0,19,0,0,0,192,96,224,96,240,96,240, + 96,216,96,204,96,204,96,198,96,198,96,195,96,193,224,193, + 224,192,224,192,96,13,16,32,15,1,0,6,0,0,0,15, + 128,63,224,112,112,96,48,224,56,192,24,192,24,192,24,192, + 24,224,56,96,48,112,112,63,224,15,128,13,16,32,15,1, + 0,6,0,0,0,15,128,63,224,112,112,96,48,224,56,192, + 24,192,24,192,24,192,24,224,56,96,48,112,112,63,224,15, + 128,13,16,32,15,1,0,12,192,0,0,15,128,63,224,112, + 112,96,48,224,56,192,24,192,24,192,24,192,24,224,56,96, + 48,112,112,63,224,15,128,13,16,32,15,1,0,9,128,0, + 0,15,128,63,224,112,112,96,48,224,56,192,24,192,24,192, + 24,192,24,224,56,96,48,112,112,63,224,15,128,13,16,32, + 15,1,0,12,192,0,0,15,128,63,224,112,112,96,48,224, + 56,192,24,192,24,192,24,192,24,224,56,96,48,112,112,63, + 224,15,128,10,9,18,10,0,0,192,192,97,128,51,0,30, + 0,12,0,30,0,51,0,97,128,192,192,14,14,28,15,0, + 0,7,204,31,248,56,48,48,120,112,220,97,140,99,12,98, + 12,102,12,108,28,56,24,56,56,111,240,199,192,11,16,32, + 14,1,0,6,0,0,0,192,96,192,96,192,96,192,96,192, + 96,192,96,192,96,192,96,192,96,192,96,192,96,96,192,127, + 192,31,0,11,16,32,14,1,0,12,0,0,0,192,96,192, + 96,192,96,192,96,192,96,192,96,192,96,192,96,192,96,192, + 96,192,96,96,192,127,192,31,0,11,16,32,14,1,0,25, + 128,0,0,192,96,192,96,192,96,192,96,192,96,192,96,192, + 96,192,96,192,96,192,96,192,96,96,192,127,192,31,0,11, + 16,32,14,1,0,49,128,0,0,192,96,192,96,192,96,192, + 96,192,96,192,96,192,96,192,96,192,96,192,96,192,96,96, + 192,127,192,31,0,12,16,32,13,0,0,6,0,0,0,192, + 48,192,48,96,96,96,96,48,192,57,192,25,128,15,0,6, + 0,6,0,6,0,6,0,6,0,6,0,10,14,28,12,1, + 0,192,0,192,0,192,0,255,0,255,128,193,192,192,192,192, + 192,193,192,255,128,255,0,192,0,192,0,192,0,7,14,14, + 9,1,0,56,124,198,198,198,198,220,220,198,198,198,198,222, + 220,9,14,28,11,1,0,48,0,24,0,12,0,0,0,126, + 0,231,0,195,0,7,0,127,0,227,0,195,0,195,0,231, + 128,121,128,9,14,28,11,1,0,12,0,24,0,48,0,0, + 0,126,0,231,0,195,0,7,0,127,0,227,0,195,0,195, + 0,231,128,121,128,9,14,28,11,1,0,24,0,60,0,102, + 0,0,0,126,0,231,0,195,0,7,0,127,0,227,0,195, + 0,195,0,231,128,121,128,9,14,28,11,1,0,50,0,90, + 0,76,0,0,0,126,0,231,0,195,0,7,0,127,0,227, + 0,195,0,195,0,231,128,121,128,9,14,28,11,1,0,102, + 0,102,0,0,0,0,0,126,0,231,0,195,0,7,0,127, + 0,227,0,195,0,195,0,231,128,121,128,9,14,28,11,1, + 0,24,0,36,0,36,0,24,0,126,0,231,0,195,0,7, + 0,127,0,227,0,195,0,195,0,231,128,121,128,14,10,20, + 17,2,0,126,240,231,248,195,12,7,12,127,252,227,0,195, + 0,195,140,231,252,122,240,8,14,14,10,1,252,62,127,99, + 192,192,192,192,99,127,62,24,12,108,120,8,14,14,10,1, + 0,48,24,12,0,60,126,195,195,255,192,192,227,127,60,8, + 14,14,10,1,0,12,24,48,0,60,126,195,195,255,192,192, + 227,127,60,8,14,14,10,1,0,24,60,102,0,60,126,195, + 195,255,192,192,227,127,60,8,14,14,10,1,0,102,102,0, + 0,60,126,195,195,255,192,192,227,127,60,4,14,14,4,0, + 0,192,96,48,0,96,96,96,96,96,96,96,96,96,96,4, + 14,14,4,0,0,48,96,192,0,96,96,96,96,96,96,96, + 96,96,96,5,14,14,5,0,0,96,240,152,0,96,96,96, + 96,96,96,96,96,96,96,5,14,14,5,0,0,216,216,0, + 0,96,96,96,96,96,96,96,96,96,96,9,14,28,11,1, + 0,96,0,54,0,56,0,76,0,62,0,127,0,99,0,193, + 128,193,128,193,128,193,128,99,0,127,0,62,0,8,14,14, + 10,1,0,50,90,76,0,222,255,227,195,195,195,195,195,195, + 195,9,14,28,11,1,0,48,0,24,0,12,0,0,0,62, + 0,127,0,99,0,193,128,193,128,193,128,193,128,99,0,127, + 0,62,0,9,14,28,11,1,0,6,0,12,0,24,0,0, + 0,62,0,127,0,99,0,193,128,193,128,193,128,193,128,99, + 0,127,0,62,0,9,14,28,11,1,0,24,0,60,0,102, + 0,0,0,62,0,127,0,99,0,193,128,193,128,193,128,193, + 128,99,0,127,0,62,0,9,14,28,11,1,0,50,0,90, + 0,76,0,0,0,62,0,127,0,99,0,193,128,193,128,193, + 128,193,128,99,0,127,0,62,0,9,14,28,11,1,0,51, + 0,51,0,0,0,0,0,62,0,127,0,99,0,193,128,193, + 128,193,128,193,128,99,0,127,0,62,0,8,8,8,10,1, + 1,24,24,0,255,255,0,24,24,11,10,20,11,0,0,14, + 96,63,192,49,128,99,192,102,192,108,192,120,192,49,128,127, + 128,206,0,8,14,14,10,1,0,48,24,12,0,195,195,195, + 195,195,195,195,199,255,123,8,14,14,10,1,0,6,12,24, + 0,195,195,195,195,195,195,195,199,255,123,8,14,14,10,1, + 0,24,60,102,0,195,195,195,195,195,195,195,199,255,123,8, + 14,14,10,1,0,102,102,0,0,195,195,195,195,195,195,195, + 199,255,123,8,18,18,10,1,252,6,12,24,0,195,195,195, + 102,102,102,36,60,24,24,24,24,112,112,9,18,36,11,1, + 252,192,0,192,0,192,0,192,0,222,0,255,0,227,0,193, + 128,193,128,193,128,193,128,227,0,255,0,222,0,192,0,192, + 0,192,0,192,0,8,18,18,10,1,252,102,102,0,0,195, + 195,195,102,102,102,36,60,24,24,24,24,112,112 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp new file mode 100644 index 0000000000..bb5f6ccf40 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp @@ -0,0 +1,492 @@ +/* + Fontname: -Adobe-Helvetica-Medium-R-Normal--25-180-100-100-P-130-ISO10646-1 + Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. + Capital A Height: 19, '1' Height: 18 + Calculated Max Values w=22 h=24 x= 3 y=16 dx=25 dy= 0 ascent=24 len=69 + Font Bounding box w=28 h=37 x=-3 y=-8 + Calculated Min Values x=-1 y=-5 dx= 0 dy= 0 + Pure Font ascent =19 descent=-5 + X Font ascent =19 descent=-5 + Max Font ascent =24 descent=-5 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +extern const uint8_t Helvetica18_symbols[71] = { + 0,28,37,253,248,19,4,37,9,49,1,9,251,24,251,19,251, // tFont + 0,0,0,0,0,0, // 0x01 - LCD_STR_REFRESH + 0,0,0,0,0,0, // 0x02 - LCD_STR_FOLDER + 255, // 0x03 - LCD_STR_ARROW_RIGHT + 255, // 0x04 - LCD_STR_UPLEVEL + 255, // 0x05 - LCD_STR_CLOCK + 255, // 0x06 - LCD_STR_FEEDRATE + 255, // 0x07 - LCD_STR_BEDTEMP + 7,18,18,8,0,1, 0,56, 68,68,68,68,68,84,84,84,84,84, 214,186,186,186,198,124, // 0x08 - LCD_STR_THERMOMETER + 7,7,7,7,0,15,56,124,198,198,198,124,56, // 0x09 - LCD_STR_DEGREE +}; + +extern const uint8_t Helvetica18[7307] = { + 0,28,37,253,248,19,4,37,9,49,32,255,251,24,251,19,251, // tFont + 0,0,0,6,0,1,2,19,19,6,2,0,192,192,192, + 192,192,192,192,192,192,192,192,192,128,128,0,0,192,192,192, + 6,6,6,8,1,13,204,204,204,204,204,68,11,17,34,14, + 2,0,12,192,12,192,12,192,25,128,255,224,255,224,25,128, + 25,128,51,0,51,0,255,224,255,224,51,0,51,0,102,0, + 102,0,102,0,11,22,44,13,1,254,6,0,6,0,31,128, + 63,192,118,224,102,96,102,96,102,0,118,0,62,0,62,0, + 15,128,7,192,6,224,6,96,198,96,198,96,230,224,127,192, + 63,128,6,0,6,0,19,18,54,22,1,0,0,6,0,60, + 12,0,126,12,0,195,24,0,195,24,0,195,48,0,195,48, + 0,126,96,0,60,96,0,0,192,0,0,199,128,1,143,192, + 1,152,96,3,24,96,3,24,96,6,24,96,6,15,192,4, + 7,128,14,18,36,17,2,0,15,0,31,128,57,192,48,192, + 48,192,48,192,25,128,15,0,30,0,63,24,115,152,97,216, + 192,240,192,96,192,240,225,216,127,156,30,0,2,6,6,6, + 2,13,192,192,192,192,192,64,5,24,24,8,2,251,24,24, + 48,48,96,96,96,192,192,192,192,192,192,192,192,192,192,96, + 96,96,48,48,24,24,5,24,24,8,1,251,192,192,96,96, + 48,48,48,24,24,24,24,24,24,24,24,24,24,48,48,48, + 96,96,192,192,7,7,7,10,1,12,16,16,214,124,56,108, + 68,12,12,24,14,1,1,6,0,6,0,6,0,6,0,6, + 0,255,240,255,240,6,0,6,0,6,0,6,0,6,0,2, + 6,6,6,2,253,192,192,192,64,64,128,6,2,2,8,1, + 6,252,252,2,3,3,6,2,0,192,192,192,7,19,19,7, + 0,0,6,4,12,12,8,24,24,16,16,48,48,32,96,96, + 64,192,192,128,128,11,18,36,13,1,0,31,0,63,128,113, + 192,96,192,96,192,224,224,192,96,192,96,192,96,192,96,192, + 96,192,96,224,224,96,192,96,192,113,192,63,128,31,0,6, + 18,18,13,2,0,12,12,28,252,252,12,12,12,12,12,12, + 12,12,12,12,12,12,12,11,18,36,13,1,0,30,0,127, + 128,97,192,192,192,192,96,192,96,0,224,0,192,1,192,3, + 128,15,0,28,0,56,0,112,0,224,0,192,0,255,224,255, + 224,11,18,36,13,1,0,31,0,127,128,97,128,192,192,192, + 192,192,192,0,192,1,128,15,0,15,192,0,192,0,96,0, + 96,192,96,192,192,97,192,127,128,31,0,11,18,36,13,1, + 0,1,128,3,128,3,128,7,128,15,128,13,128,25,128,57, + 128,49,128,97,128,225,128,193,128,255,224,255,224,1,128,1, + 128,1,128,1,128,11,18,36,13,1,0,127,192,127,192,96, + 0,96,0,96,0,96,0,126,0,127,128,113,192,0,192,0, + 224,0,96,0,96,192,224,192,192,225,192,127,128,30,0,11, + 18,36,13,1,0,15,0,63,192,112,192,96,96,224,96,192, + 0,192,0,207,0,223,128,241,192,224,192,192,96,192,96,192, + 96,224,224,113,192,127,192,31,0,11,18,36,13,1,0,255, + 224,255,224,0,224,0,192,1,128,1,128,3,0,3,0,6, + 0,6,0,12,0,12,0,28,0,24,0,24,0,56,0,48, + 0,48,0,11,18,36,13,1,0,14,0,63,128,49,128,96, + 192,96,192,96,192,49,128,31,0,63,128,113,192,96,192,192, + 96,192,96,192,96,192,96,96,192,127,192,31,0,11,18,36, + 13,1,0,31,0,127,192,113,192,224,192,192,96,192,96,192, + 96,192,96,224,224,113,224,127,96,30,96,0,96,0,224,192, + 192,225,192,127,128,30,0,2,14,14,6,2,0,192,192,192, + 0,0,0,0,0,0,0,0,192,192,192,2,17,17,6,2, + 253,192,192,192,0,0,0,0,0,0,0,0,192,192,192,64, + 64,128,12,12,24,15,1,1,0,48,0,240,3,192,15,0, + 60,0,224,0,224,0,60,0,15,0,3,192,0,240,0,48, + 10,5,10,15,2,5,255,192,255,192,0,0,255,192,255,192, + 12,12,24,15,1,1,192,0,240,0,60,0,15,0,3,192, + 0,112,0,112,3,192,15,0,60,0,240,0,192,0,10,19, + 38,12,1,0,31,0,127,128,113,192,224,192,192,192,193,192, + 1,128,3,128,7,0,6,0,12,0,12,0,12,0,12,0, + 0,0,0,0,12,0,12,0,12,0,22,23,69,25,2,252, + 0,255,0,3,255,192,15,1,224,28,0,112,56,0,24,48, + 0,24,96,115,12,96,251,12,193,199,12,195,134,12,195,6, + 12,198,6,12,198,12,28,198,12,24,198,12,56,231,28,112, + 99,247,224,113,227,128,56,0,0,28,0,0,15,3,0,7, + 255,0,0,252,0,15,19,38,17,1,0,3,128,3,128,6, + 192,6,192,12,64,12,96,12,96,24,48,24,48,24,48,48, + 24,63,248,63,248,96,12,96,12,96,12,192,6,192,6,192, + 6,14,19,38,17,2,0,255,192,255,240,192,112,192,24,192, + 24,192,24,192,24,192,48,255,224,255,240,192,24,192,12,192, + 12,192,12,192,12,192,28,192,120,255,240,255,192,15,19,38, + 18,1,0,7,224,31,248,60,60,112,14,96,6,224,6,192, + 0,192,0,192,0,192,0,192,0,192,0,192,0,224,6,96, + 6,112,14,60,60,31,248,7,224,15,19,38,18,2,0,255, + 192,255,240,192,120,192,28,192,12,192,14,192,6,192,6,192, + 6,192,6,192,6,192,6,192,6,192,14,192,12,192,28,192, + 120,255,240,255,192,12,19,38,16,2,0,255,240,255,240,192, + 0,192,0,192,0,192,0,192,0,192,0,255,224,255,224,192, + 0,192,0,192,0,192,0,192,0,192,0,192,0,255,240,255, + 240,11,19,38,14,2,0,255,224,255,224,192,0,192,0,192, + 0,192,0,192,0,192,0,255,192,255,192,192,0,192,0,192, + 0,192,0,192,0,192,0,192,0,192,0,192,0,16,19,38, + 19,1,0,7,224,31,248,60,60,112,14,96,6,224,6,192, + 0,192,0,192,0,192,127,192,127,192,3,192,3,224,3,96, + 7,112,15,60,63,31,251,7,227,14,19,38,18,2,0,192, + 12,192,12,192,12,192,12,192,12,192,12,192,12,192,12,255, + 252,255,252,192,12,192,12,192,12,192,12,192,12,192,12,192, + 12,192,12,192,12,2,19,19,8,3,0,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,10,19, + 38,13,1,0,0,192,0,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,192,0,192,0,192,0,192,192,192,192,192, + 192,192,192,192,97,128,127,128,63,0,13,19,38,18,3,0, + 192,56,192,112,192,224,193,192,195,128,199,0,206,0,220,0, + 252,0,254,0,231,0,195,128,193,128,193,192,192,224,192,96, + 192,112,192,56,192,24,11,19,38,14,2,0,192,0,192,0, + 192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0, + 192,0,192,0,192,0,192,0,192,0,192,0,192,0,255,224, + 255,224,17,19,57,21,2,0,192,1,128,224,3,128,224,3, + 128,240,7,128,240,7,128,216,13,128,216,13,128,216,13,128, + 204,25,128,204,25,128,204,25,128,198,49,128,198,49,128,198, + 49,128,195,97,128,195,97,128,195,97,128,193,193,128,193,193, + 128,14,19,38,18,2,0,224,12,240,12,240,12,216,12,220, + 12,204,12,206,12,198,12,199,12,195,12,195,140,193,140,193, + 204,192,204,192,236,192,108,192,60,192,60,192,28,16,19,38, + 18,1,0,7,224,31,248,60,60,112,14,96,6,224,7,192, + 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, + 6,112,14,60,60,31,248,7,224,13,19,38,16,2,0,255, + 224,255,240,192,48,192,24,192,24,192,24,192,24,192,48,255, + 240,255,224,192,0,192,0,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,16,19,38,18,1,0,7,224,31,248,60, + 60,112,14,96,6,224,7,192,3,192,3,192,3,192,3,192, + 3,192,3,192,3,224,7,96,230,112,126,60,28,31,254,7, + 231,13,19,38,17,2,0,255,224,255,240,192,48,192,24,192, + 24,192,24,192,24,192,48,255,240,255,224,192,112,192,48,192, + 24,192,24,192,24,192,24,192,24,192,24,192,24,13,19,38, + 16,2,0,15,128,63,224,96,96,192,48,192,48,192,0,224, + 0,124,0,63,128,7,224,0,240,0,56,0,24,0,24,192, + 24,192,56,240,112,127,224,31,128,14,19,38,16,1,0,255, + 252,255,252,3,0,3,0,3,0,3,0,3,0,3,0,3, + 0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3, + 0,3,0,3,0,14,19,38,18,2,0,192,12,192,12,192, + 12,192,12,192,12,192,12,192,12,192,12,192,12,192,12,192, + 12,192,12,192,12,192,12,192,12,96,24,112,56,63,240,15, + 192,15,19,38,17,1,0,192,6,192,6,224,14,96,12,112, + 28,48,24,48,24,56,56,24,48,24,48,28,112,12,96,12, + 96,14,224,6,192,6,192,3,128,3,128,3,128,20,19,57, + 22,1,0,192,96,48,192,96,48,192,96,48,192,240,48,96, + 240,96,97,152,96,97,152,96,97,152,96,97,152,96,49,152, + 192,51,12,192,51,12,192,51,12,192,27,13,128,27,13,128, + 30,7,128,14,7,0,12,3,0,12,3,0,15,19,38,17, + 1,0,192,6,224,14,112,28,48,24,24,48,28,112,14,224, + 7,192,3,128,3,128,7,192,14,224,12,96,28,112,56,56, + 48,24,96,12,224,14,192,6,14,19,38,16,1,0,192,12, + 224,28,96,24,112,56,48,48,56,112,24,96,28,224,12,192, + 15,192,7,128,7,128,3,0,3,0,3,0,3,0,3,0, + 3,0,3,0,13,19,38,15,1,0,255,248,255,248,0,56, + 0,112,0,224,1,192,1,192,3,128,7,0,7,0,14,0, + 28,0,28,0,56,0,112,0,112,0,224,0,255,248,255,248, + 4,24,24,7,2,251,240,240,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,240,240,8,19, + 19,7,0,0,192,64,64,96,32,32,48,16,16,16,24,8, + 8,12,4,4,6,2,3,4,24,24,7,1,251,240,240,48, + 48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,48,240,240,10,9,18,12,1,10,12,0,12,0,30, + 0,18,0,51,0,97,128,97,128,192,192,192,192,14,2,4, + 14,0,251,255,252,255,252,5,4,4,7,1,15,192,96,48, + 24,11,14,28,13,1,0,31,0,63,128,97,192,96,192,0, + 192,7,192,63,192,120,192,224,192,192,192,193,192,227,192,126, + 224,60,96,11,19,38,14,2,0,192,0,192,0,192,0,192, + 0,192,0,207,0,223,128,241,192,224,192,192,224,192,96,192, + 96,192,96,192,96,192,224,224,192,241,192,223,128,207,0,10, + 14,28,12,1,0,31,0,63,128,113,192,96,192,224,0,192, + 0,192,0,192,0,192,0,224,0,96,192,113,192,63,128,31, + 0,11,19,38,14,1,0,0,96,0,96,0,96,0,96,0, + 96,30,96,63,96,113,224,96,224,224,96,192,96,192,96,192, + 96,192,96,224,96,96,224,113,224,63,96,30,96,11,14,28, + 13,1,0,14,0,63,128,113,192,96,192,192,96,192,96,255, + 224,255,224,192,0,192,0,96,96,112,224,63,192,15,0,6, + 19,19,8,1,0,28,60,48,48,48,252,252,48,48,48,48, + 48,48,48,48,48,48,48,48,11,19,38,14,1,251,30,96, + 63,96,113,224,96,224,224,96,192,96,192,96,192,96,192,96, + 224,96,96,224,113,224,63,96,30,96,0,96,192,96,224,192, + 127,192,31,0,10,19,38,13,2,0,192,0,192,0,192,0, + 192,0,192,0,206,0,223,128,241,128,224,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 2,19,19,6,2,0,192,192,192,0,0,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,4,24,24,6,0,251,48, + 48,48,0,0,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,48,48,48,240,224,10,19,38,12,2,0,192,0,192, + 0,192,0,192,0,192,0,193,128,195,128,199,0,206,0,220, + 0,248,0,252,0,206,0,198,0,199,0,195,128,193,128,193, + 192,192,192,2,19,19,6,2,0,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,16,14,28,20, + 2,0,206,60,255,126,227,199,193,131,193,131,193,131,193,131, + 193,131,193,131,193,131,193,131,193,131,193,131,193,131,10,14, + 28,14,2,0,206,0,223,128,241,128,224,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 11,14,28,13,1,0,31,0,63,128,113,192,96,192,224,224, + 192,96,192,96,192,96,192,96,224,224,96,192,113,192,63,128, + 31,0,11,19,38,14,2,251,207,0,223,128,241,192,224,192, + 192,224,192,96,192,96,192,96,192,96,192,224,224,192,241,192, + 223,128,207,0,192,0,192,0,192,0,192,0,192,0,11,19, + 38,14,1,251,30,96,63,96,113,224,96,224,224,96,192,96, + 192,96,192,96,192,96,224,96,96,224,113,224,63,96,30,96, + 0,96,0,96,0,96,0,96,0,96,6,14,14,9,2,0, + 204,220,248,240,224,192,192,192,192,192,192,192,192,192,10,14, + 28,12,1,0,63,0,127,128,225,192,192,192,192,0,248,0, + 127,0,15,128,1,192,192,192,192,192,225,192,127,128,63,0, + 6,18,18,8,1,0,48,48,48,48,252,252,48,48,48,48, + 48,48,48,48,48,48,60,28,10,14,28,14,2,0,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,193,192,99,192,126,192,28,192,11,14,28,13,1,0, + 192,96,192,96,192,96,96,192,96,192,113,192,49,128,49,128, + 27,0,27,0,27,0,14,0,14,0,14,0,18,14,42,18, + 0,0,192,192,192,192,192,192,97,225,128,97,225,128,97,225, + 128,49,35,0,51,51,0,51,51,0,27,54,0,26,22,0, + 30,30,0,14,28,0,12,12,0,12,12,0,10,14,28,12, + 1,0,192,192,225,192,97,128,51,0,30,0,30,0,12,0, + 30,0,30,0,51,0,115,128,97,128,192,192,192,192,12,19, + 38,13,0,251,192,48,192,48,96,48,112,96,48,96,56,224, + 24,192,24,192,13,128,13,128,7,128,7,0,3,0,3,0, + 6,0,6,0,12,0,60,0,56,0,10,14,28,12,1,0, + 255,192,255,192,1,128,3,0,7,0,14,0,12,0,28,0, + 56,0,48,0,96,0,224,0,255,192,255,192,6,24,24,8, + 1,251,12,24,48,48,48,48,48,48,48,48,96,192,192,96, + 48,48,48,48,48,48,48,48,24,12,1,24,24,6,2,251, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,6,24,24,8,1,251,192,96, + 48,48,48,48,48,48,48,48,24,12,12,24,48,48,48,48, + 48,48,48,48,96,192,10,4,8,14,2,5,112,192,252,192, + 207,192,195,128,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,0,0,0,6,0,1,2,19,19,6,2, + 251,192,192,192,0,0,64,64,192,192,192,192,192,192,192,192, + 192,192,192,192,10,18,36,13,1,254,1,128,1,128,31,0, + 63,128,115,192,102,192,198,0,204,0,204,0,204,0,216,0, + 216,0,216,192,113,192,127,128,63,0,96,0,96,0,12,18, + 36,14,1,0,31,128,63,224,112,112,96,48,96,0,112,0, + 48,0,24,0,255,128,255,128,24,0,24,0,24,0,48,0, + 48,0,103,48,255,240,240,224,11,12,24,13,1,3,192,96, + 238,224,127,192,49,128,96,192,96,192,96,192,96,192,49,128, + 127,192,238,224,192,96,14,18,36,14,0,0,224,28,96,24, + 112,56,48,48,56,112,24,96,28,224,12,192,63,240,63,240, + 3,0,63,240,63,240,3,0,3,0,3,0,3,0,3,0, + 2,24,24,6,2,251,192,192,192,192,192,192,192,192,192,192, + 0,0,0,0,192,192,192,192,192,192,192,192,192,192,11,24, + 48,13,1,251,31,0,63,128,113,192,96,192,112,192,56,0, + 28,0,126,0,231,0,195,128,193,192,192,192,96,96,112,96, + 56,96,28,192,15,128,7,0,3,128,97,192,96,192,113,192, + 63,128,31,0,6,2,2,8,1,16,204,204,19,19,57,19, + 1,0,3,248,0,14,14,0,48,1,128,96,0,192,65,240, + 64,195,24,96,134,12,32,132,0,32,132,0,32,132,0,32, + 132,0,32,134,12,32,195,24,96,65,240,64,96,0,192,48, + 1,128,24,3,0,14,14,0,3,248,0,7,12,12,9,1, + 7,120,204,204,28,108,204,204,220,118,0,254,254,9,8,16, + 14,2,3,25,128,51,0,102,0,204,0,204,0,102,0,51, + 0,25,128,13,8,16,15,1,2,255,248,255,248,0,24,0, + 24,0,24,0,24,0,24,0,24,6,2,2,8,1,6,252, + 252,18,19,57,19,1,0,7,248,0,28,14,0,48,3,0, + 96,1,128,67,240,128,194,24,192,130,8,64,130,8,64,130, + 8,64,130,16,64,131,240,64,130,32,64,130,16,64,194,16, + 192,66,8,128,96,1,128,48,3,0,28,14,0,7,248,0, + 6,2,2,8,1,16,252,252,8,7,7,9,0,11,60,102, + 195,195,195,102,60,12,13,26,14,1,0,6,0,6,0,6, + 0,6,0,255,240,255,240,6,0,6,0,6,0,6,0,0, + 0,255,240,255,240,7,10,10,7,0,8,60,126,198,6,12, + 24,48,96,254,254,7,10,10,7,0,8,124,254,198,6,60, + 60,6,198,254,124,5,4,4,7,1,15,24,48,96,192,10, + 19,38,14,2,251,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,193,192,227,192,254,192,220, + 192,192,0,192,0,192,0,192,0,192,0,10,24,48,12,1, + 251,31,192,127,192,125,128,253,128,253,128,253,128,253,128,253, + 128,253,128,125,128,125,128,61,128,13,128,13,128,13,128,13, + 128,13,128,13,128,13,128,13,128,13,128,13,128,13,128,13, + 128,2,3,3,6,2,6,192,192,192,5,6,6,7,1,251, + 96,112,24,24,248,112,4,10,10,7,0,8,48,48,240,240, + 48,48,48,48,48,48,7,12,12,9,1,7,56,108,198,198, + 198,198,198,108,56,0,254,254,9,8,16,14,3,3,204,0, + 102,0,51,0,25,128,25,128,51,0,102,0,204,0,18,18, + 54,19,1,0,48,24,0,48,24,0,240,48,0,240,48,0, + 48,96,0,48,96,0,48,192,0,48,192,0,49,131,0,49, + 135,0,3,15,0,3,15,0,6,27,0,6,51,0,12,127, + 192,12,127,192,24,3,0,24,3,0,18,18,54,19,1,0, + 48,24,0,48,24,0,240,48,0,240,48,0,48,96,0,48, + 96,0,48,192,0,48,192,0,49,135,128,49,143,192,3,24, + 192,3,0,192,6,1,128,6,3,0,12,6,0,12,12,0, + 24,31,192,24,31,192,19,18,54,19,0,0,124,12,0,254, + 12,0,198,24,0,6,24,0,60,48,0,60,48,0,6,96, + 0,198,96,0,254,193,128,124,195,128,1,135,128,1,135,128, + 3,13,128,3,25,128,6,63,224,6,63,224,12,1,128,12, + 1,128,10,19,38,12,1,251,12,0,12,0,12,0,0,0, + 0,0,12,0,12,0,12,0,12,0,24,0,56,0,112,0, + 96,0,224,192,192,192,193,192,227,128,127,128,62,0,15,24, + 48,17,1,0,12,0,6,0,3,0,1,128,0,0,3,128, + 3,128,6,192,6,192,12,64,12,96,12,96,24,48,24,48, + 24,48,48,24,63,248,63,248,96,12,96,12,96,12,192,6, + 192,6,192,6,15,24,48,17,1,0,0,96,0,192,1,128, + 3,0,0,0,3,128,3,128,6,192,6,192,12,64,12,96, + 12,96,24,48,24,48,24,48,48,24,63,248,63,248,96,12, + 96,12,96,12,192,6,192,6,192,6,15,24,48,17,1,0, + 1,128,3,192,6,96,12,48,0,0,3,128,3,128,6,192, + 6,192,12,64,12,96,12,96,24,48,24,48,24,48,48,24, + 63,248,63,248,96,12,96,12,96,12,192,6,192,6,192,6, + 15,23,46,17,1,0,7,16,13,176,8,224,0,0,3,128, + 3,128,6,192,6,192,12,64,12,96,12,96,24,48,24,48, + 24,48,48,24,63,248,63,248,96,12,96,12,96,12,192,6, + 192,6,192,6,15,23,46,17,1,0,12,96,12,96,0,0, + 0,0,3,128,3,128,6,192,6,192,12,64,12,96,12,96, + 24,48,24,48,24,48,48,24,63,248,63,248,96,12,96,12, + 96,12,192,6,192,6,192,6,15,24,48,17,1,0,3,128, + 4,64,4,64,3,128,0,0,3,128,3,128,6,192,6,192, + 12,64,12,96,12,96,24,48,24,48,24,48,48,24,63,248, + 63,248,96,12,96,12,96,12,192,6,192,6,192,6,21,19, + 57,23,1,0,3,255,248,3,255,248,6,96,0,6,96,0, + 12,96,0,12,96,0,12,96,0,24,96,0,24,127,248,24, + 127,248,48,96,0,63,224,0,63,224,0,96,96,0,96,96, + 0,96,96,0,192,96,0,192,127,248,192,127,248,15,24,48, + 18,1,251,7,224,31,248,60,60,112,14,96,6,224,6,192, + 0,192,0,192,0,192,0,192,0,192,0,192,0,224,6,96, + 6,112,14,60,60,31,248,7,224,1,128,0,192,0,192,7, + 192,3,128,12,24,48,16,2,0,48,0,24,0,12,0,6, + 0,0,0,255,240,255,240,192,0,192,0,192,0,192,0,192, + 0,192,0,255,224,255,224,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,255,240,255,240,12,24,48,16,2,0,1, + 128,3,0,6,0,12,0,0,0,255,240,255,240,192,0,192, + 0,192,0,192,0,192,0,192,0,255,224,255,224,192,0,192, + 0,192,0,192,0,192,0,192,0,192,0,255,240,255,240,12, + 24,48,16,2,0,6,0,15,0,25,128,48,192,0,0,255, + 240,255,240,192,0,192,0,192,0,192,0,192,0,192,0,255, + 224,255,224,192,0,192,0,192,0,192,0,192,0,192,0,192, + 0,255,240,255,240,12,23,46,16,2,0,24,192,24,192,0, + 0,0,0,255,240,255,240,192,0,192,0,192,0,192,0,192, + 0,192,0,255,224,255,224,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,255,240,255,240,5,24,24,8,1,0,192, + 96,48,24,0,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,48,48,48,48,48,5,24,24,8,2,0,24,48,96, + 192,0,96,96,96,96,96,96,96,96,96,96,96,96,96,96, + 96,96,96,96,96,8,24,24,8,0,0,24,60,102,195,0, + 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24, + 24,24,24,6,23,23,8,1,0,204,204,0,0,48,48,48, + 48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48, + 18,19,57,18,255,0,31,248,0,31,254,0,24,15,0,24, + 3,128,24,1,128,24,1,192,24,0,192,24,0,192,255,128, + 192,255,128,192,24,0,192,24,0,192,24,0,192,24,1,192, + 24,1,128,24,3,128,24,15,0,31,254,0,31,248,0,14, + 23,46,18,2,0,14,32,27,96,17,192,0,0,224,12,240, + 12,240,12,216,12,220,12,204,12,206,12,198,12,199,12,195, + 12,195,140,193,140,193,204,192,204,192,236,192,108,192,60,192, + 60,192,28,16,24,48,18,1,0,12,0,6,0,3,0,1, + 128,0,0,7,224,31,248,60,60,112,14,96,6,224,7,192, + 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, + 6,112,14,60,60,31,248,7,224,16,24,48,18,1,0,0, + 48,0,96,0,192,1,128,0,0,7,224,31,248,60,60,112, + 14,96,6,224,7,192,3,192,3,192,3,192,3,192,3,192, + 3,192,3,224,7,96,6,112,14,60,60,31,248,7,224,16, + 24,48,18,1,0,0,192,1,224,3,48,6,24,0,0,7, + 224,31,248,60,60,112,14,96,6,224,7,192,3,192,3,192, + 3,192,3,192,3,192,3,192,3,224,7,96,6,112,14,60, + 60,31,248,7,224,16,23,46,18,1,0,3,136,6,216,4, + 112,0,0,7,224,31,248,60,60,112,14,96,6,224,7,192, + 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, + 6,112,14,60,60,31,248,7,224,16,23,46,18,1,0,6, + 48,6,48,0,0,0,0,7,224,31,248,60,60,112,14,96, + 6,224,7,192,3,192,3,192,3,192,3,192,3,192,3,192, + 3,224,7,96,6,112,14,60,60,31,248,7,224,13,12,24, + 14,0,1,192,24,96,48,48,96,24,192,13,128,7,0,7, + 0,13,128,24,192,48,96,96,48,192,24,18,19,57,18,0, + 0,3,240,192,15,253,192,30,31,128,56,7,0,48,15,0, + 112,29,128,96,57,128,96,113,128,96,225,128,97,193,128,99, + 129,128,103,1,128,110,1,128,124,3,128,56,3,0,56,7, + 0,126,30,0,239,252,0,195,240,0,14,24,48,18,2,0, + 24,0,12,0,6,0,3,0,0,0,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,96,24,112,56,63,240,15,192, + 14,24,48,18,2,0,0,96,0,192,1,128,3,0,0,0, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,96,24, + 112,56,63,240,15,192,14,24,48,18,2,0,3,0,7,128, + 12,192,24,96,0,0,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,96,24,112,56,63,240,15,192,14,23,46,18, + 2,0,24,192,24,192,0,0,0,0,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,96,24,112,56,63,240,15,192, + 14,24,48,16,1,0,0,96,0,192,1,128,3,0,0,0, + 192,12,224,28,96,24,112,56,48,48,56,112,24,96,28,224, + 12,192,15,192,7,128,7,128,3,0,3,0,3,0,3,0, + 3,0,3,0,3,0,13,19,38,16,2,0,192,0,192,0, + 192,0,192,0,255,224,255,240,192,48,192,24,192,24,192,24, + 192,24,192,48,255,240,255,224,192,0,192,0,192,0,192,0, + 192,0,10,19,38,15,3,0,28,0,127,0,227,0,193,128, + 193,128,193,128,195,0,199,0,206,0,207,0,195,128,193,128, + 192,192,192,192,192,192,193,128,195,128,207,0,206,0,11,19, + 38,13,1,0,24,0,12,0,6,0,3,0,0,0,31,0, + 63,128,97,192,96,192,0,192,7,192,63,192,120,192,224,192, + 192,192,193,192,227,192,126,224,60,96,11,19,38,13,1,0, + 1,128,3,0,6,0,12,0,0,0,31,0,63,128,97,192, + 96,192,0,192,7,192,63,192,120,192,224,192,192,192,193,192, + 227,192,126,224,60,96,11,19,38,13,1,0,12,0,30,0, + 51,0,97,128,0,0,31,0,63,128,97,192,96,192,0,192, + 7,192,63,192,120,192,224,192,192,192,193,192,227,192,126,224, + 60,96,11,18,36,13,1,0,28,64,54,192,35,128,0,0, + 31,0,63,128,97,192,96,192,0,192,7,192,63,192,120,192, + 224,192,192,192,193,192,227,192,126,224,60,96,11,18,36,13, + 1,0,51,0,51,0,0,0,0,0,31,0,63,128,97,192, + 96,192,0,192,7,192,63,192,120,192,224,192,192,192,193,192, + 227,192,126,224,60,96,11,19,38,13,1,0,6,0,9,0, + 9,0,6,0,0,0,31,0,63,128,97,192,96,192,0,192, + 7,192,63,192,120,192,224,192,192,192,193,192,227,192,126,224, + 60,96,19,14,42,21,1,0,31,14,0,63,191,128,97,241, + 192,96,224,192,0,192,96,7,192,96,63,255,224,120,255,224, + 224,192,0,192,192,0,193,224,96,227,240,224,126,63,192,60, + 15,0,10,19,38,12,1,251,31,0,63,128,113,192,96,192, + 224,0,192,0,192,0,192,0,192,0,224,0,96,192,113,192, + 63,128,31,0,12,0,6,0,6,0,62,0,28,0,11,19, + 38,13,1,0,24,0,12,0,6,0,3,0,0,0,14,0, + 63,128,113,192,96,192,192,96,192,96,255,224,255,224,192,0, + 192,0,96,96,112,224,63,192,15,0,11,19,38,13,1,0, + 3,0,6,0,12,0,24,0,0,0,14,0,63,128,113,192, + 96,192,192,96,192,96,255,224,255,224,192,0,192,0,96,96, + 112,224,63,192,15,0,11,19,38,13,1,0,12,0,30,0, + 51,0,97,128,0,0,14,0,63,128,113,192,96,192,192,96, + 192,96,255,224,255,224,192,0,192,0,96,96,112,224,63,192, + 15,0,11,18,36,13,1,0,51,0,51,0,0,0,0,0, + 14,0,63,128,113,192,96,192,192,96,192,96,255,224,255,224, + 192,0,192,0,96,96,112,224,63,192,15,0,5,19,19,6, + 0,0,192,96,48,24,0,48,48,48,48,48,48,48,48,48, + 48,48,48,48,48,5,19,19,6,1,0,24,48,96,192,0, + 96,96,96,96,96,96,96,96,96,96,96,96,96,96,8,19, + 19,6,255,0,24,60,102,195,0,24,24,24,24,24,24,24, + 24,24,24,24,24,24,24,6,18,18,6,0,0,204,204,0, + 0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,11, + 19,38,13,1,0,96,0,57,128,14,0,30,0,99,0,31, + 128,63,128,113,192,96,192,224,224,192,96,192,96,192,96,192, + 96,224,224,96,192,113,192,63,128,31,0,10,18,36,14,2, + 0,56,128,109,128,71,0,0,0,206,0,223,128,241,128,224, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,11,19,38,13,1,0,24,0,12,0,6, + 0,3,0,0,0,31,0,63,128,113,192,96,192,224,224,192, + 96,192,96,192,96,192,96,224,224,96,192,113,192,63,128,31, + 0,11,19,38,13,1,0,3,0,6,0,12,0,24,0,0, + 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,192, + 96,192,96,224,224,96,192,113,192,63,128,31,0,11,19,38, + 13,1,0,12,0,30,0,51,0,97,128,0,0,31,0,63, + 128,113,192,96,192,224,224,192,96,192,96,192,96,192,96,224, + 224,96,192,113,192,63,128,31,0,11,18,36,13,1,0,28, + 64,54,192,35,128,0,0,31,0,63,128,113,192,96,192,224, + 224,192,96,192,96,192,96,192,96,224,224,96,192,113,192,63, + 128,31,0,11,18,36,13,1,0,51,0,51,0,0,0,0, + 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,192, + 96,192,96,224,224,96,192,113,192,63,128,31,0,12,12,24, + 14,1,1,6,0,6,0,6,0,0,0,0,0,255,240,255, + 240,0,0,0,0,6,0,6,0,6,0,13,14,28,13,0, + 0,15,152,31,248,56,112,48,224,113,240,99,176,99,48,102, + 48,108,48,124,112,56,96,112,224,255,192,207,128,10,19,38, + 14,2,0,48,0,24,0,12,0,6,0,0,0,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,193,192,99,192,126,192,28,192,10,19,38,14,2,0,3, + 0,6,0,12,0,24,0,0,0,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,193,192,99, + 192,126,192,28,192,10,19,38,14,2,0,12,0,30,0,51, + 0,97,128,0,0,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,193,192,99,192,126,192,28, + 192,10,18,36,14,2,0,51,0,51,0,0,0,0,0,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,193,192,99,192,126,192,28,192,12,24,48,13,0, + 251,0,192,1,128,3,0,6,0,0,0,192,48,192,48,96, + 48,112,96,48,96,56,224,24,192,24,192,13,128,13,128,7, + 128,7,0,3,0,3,0,6,0,6,0,12,0,60,0,56, + 0,11,24,48,14,2,251,192,0,192,0,192,0,192,0,192, + 0,207,0,223,128,241,192,224,192,192,224,192,96,192,96,192, + 96,192,96,192,224,224,192,241,192,223,128,207,0,192,0,192, + 0,192,0,192,0,192,0,12,23,46,13,0,251,25,128,25, + 128,0,0,0,0,192,48,192,48,96,48,112,96,48,96,56, + 224,24,192,24,192,13,128,13,128,7,128,7,0,3,0,3, + 0,6,0,6,0,12,0,60,0,56,0 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/profont_22.cpp b/Marlin/src/lcd/tft/fontdata/profont_22.cpp new file mode 100644 index 0000000000..1d02ebb069 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/profont_22.cpp @@ -0,0 +1,426 @@ +/* + Fontname: ProFont22 + Copyright: ProFont Distribution 2.2 Ñ Generated by Fontographer 4.1.5 + Capital A Height: 14, '1' Height: 14 + Calculated Max Values w=12 h=22 x= 6 y=12 dx=12 dy= 0 ascent=18 len=44 + Font Bounding box w=12 h=21 x= 0 y=-4 + Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 + Pure Font ascent =14 descent=-4 + X Font ascent =16 descent=-4 + Max Font ascent =18 descent=-4 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +extern const uint8_t ProFont22[6454] = { + 0,12,21,0,252,14,3,117,7,113,32,255,252,18,252,16, + 252,0,0,0,12,0,0,2,14,14,12,4,0,192,192,192, + 192,192,192,192,192,192,192,0,0,192,192,6,6,6,12,2, + 10,204,204,204,204,204,204,10,10,20,12,0,4,51,0,51, + 0,255,192,255,192,51,0,51,0,255,192,255,192,51,0,51, + 0,10,18,36,12,0,254,12,0,12,0,63,0,127,128,237, + 192,204,192,204,0,236,0,127,0,63,128,13,192,12,192,204, + 192,237,192,127,128,63,0,12,0,12,0,10,14,28,12,0, + 0,63,192,127,192,204,192,205,192,207,128,207,0,127,0,63, + 128,60,192,124,192,236,192,204,192,199,128,195,0,10,14,28, + 12,0,0,62,0,127,0,227,0,199,0,206,0,252,0,120, + 0,120,0,252,192,207,192,199,128,231,128,127,192,60,192,2, + 6,6,12,4,10,192,192,192,192,192,192,6,18,18,12,2, + 254,12,28,56,112,224,192,192,192,192,192,192,192,192,224,112, + 56,28,12,6,18,18,12,2,254,192,224,112,56,28,12,12, + 12,12,12,12,12,12,28,56,112,224,192,10,10,20,12,0, + 4,12,0,12,0,204,192,255,192,63,0,63,0,255,192,204, + 192,12,0,12,0,10,10,20,12,0,2,12,0,12,0,12, + 0,12,0,255,192,255,192,12,0,12,0,12,0,12,0,5, + 9,9,12,2,252,48,120,120,56,24,56,112,224,64,6,2, + 2,12,2,6,252,252,4,4,4,12,3,1,96,240,240,96, + 11,20,40,12,0,252,0,96,0,96,0,192,0,192,1,128, + 1,128,3,0,3,0,6,0,6,0,12,0,12,0,24,0, + 24,0,48,0,48,0,96,0,96,0,192,0,192,0,10,14, + 28,12,0,0,63,0,127,128,225,192,193,192,195,192,199,192, + 206,192,220,192,248,192,240,192,224,192,225,192,127,128,63,0, + 10,14,28,12,0,0,12,0,12,0,124,0,124,0,12,0, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,255,192, + 255,192,10,14,28,12,0,0,63,0,127,128,225,192,192,192, + 0,192,1,192,3,128,7,0,14,0,28,0,56,0,112,0, + 255,192,255,192,10,14,28,12,0,0,63,0,127,128,225,192, + 192,192,0,192,1,128,15,0,15,128,1,192,0,192,192,192, + 225,192,127,128,63,0,10,14,28,12,0,0,3,0,7,0, + 15,0,31,0,59,0,115,0,227,0,195,0,255,192,255,192, + 3,0,3,0,15,192,15,192,10,14,28,12,0,0,255,192, + 255,192,192,0,192,0,255,0,255,128,1,192,0,192,0,192, + 0,192,192,192,225,192,127,128,63,0,10,14,28,12,0,0, + 63,0,127,0,224,0,192,0,255,0,255,128,193,192,192,192, + 192,192,192,192,192,192,225,192,127,128,63,0,10,14,28,12, + 0,0,255,192,255,192,0,192,0,192,0,192,1,192,3,128, + 7,0,14,0,12,0,12,0,12,0,12,0,12,0,10,14, + 28,12,0,0,63,0,127,128,225,192,192,192,192,192,97,128, + 63,0,127,128,225,192,192,192,192,192,225,192,127,128,63,0, + 10,14,28,12,0,0,63,0,127,128,225,192,192,192,192,192, + 192,192,192,192,224,192,127,192,63,192,0,192,1,192,63,128, + 63,0,4,10,10,12,3,1,96,240,240,96,0,0,96,240, + 240,96,5,15,15,12,2,252,48,120,120,48,0,0,48,120, + 120,56,24,56,112,224,64,8,14,14,12,2,0,3,7,14, + 28,56,112,224,224,112,56,28,14,7,3,10,6,12,12,0, + 4,255,192,255,192,0,0,0,0,255,192,255,192,8,14,14, + 12,2,0,192,224,112,56,28,14,7,7,14,28,56,112,224, + 192,10,14,28,12,0,0,63,0,127,128,225,192,192,192,0, + 192,1,192,3,128,7,0,14,0,12,0,0,0,0,0,12, + 0,12,0,10,14,28,12,0,0,63,0,127,128,225,192,192, + 192,199,192,207,192,204,192,204,192,207,192,199,128,192,0,224, + 0,127,192,63,192,10,14,28,12,0,0,12,0,30,0,30, + 0,51,0,51,0,97,128,97,128,192,192,255,192,255,192,192, + 192,192,192,192,192,192,192,10,14,28,12,0,0,255,0,255, + 128,193,192,192,192,192,192,193,128,255,0,255,128,193,192,192, + 192,192,192,193,192,255,128,255,0,10,14,28,12,0,0,63, + 0,127,128,225,192,192,192,192,0,192,0,192,0,192,0,192, + 0,192,0,192,192,225,192,127,128,63,0,10,14,28,12,0, + 0,255,0,255,128,193,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,193,192,255,128,255,0,10,14,28, + 12,0,0,255,192,255,192,192,0,192,0,192,0,192,0,255, + 0,255,0,192,0,192,0,192,0,192,0,255,192,255,192,10, + 14,28,12,0,0,255,192,255,192,192,0,192,0,192,0,192, + 0,255,0,255,0,192,0,192,0,192,0,192,0,192,0,192, + 0,10,14,28,12,0,0,63,0,127,128,225,192,192,192,192, + 0,192,0,195,192,195,192,192,192,192,192,192,192,225,192,127, + 128,63,0,10,14,28,12,0,0,192,192,192,192,192,192,192, + 192,192,192,192,192,255,192,255,192,192,192,192,192,192,192,192, + 192,192,192,192,192,10,14,28,12,0,0,255,192,255,192,12, + 0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12, + 0,12,0,255,192,255,192,10,14,28,12,0,0,0,192,0, + 192,0,192,0,192,0,192,0,192,0,192,0,192,192,192,192, + 192,192,192,225,192,127,128,63,0,10,14,28,12,0,0,193, + 192,195,128,199,0,206,0,220,0,248,0,240,0,248,0,220, + 0,206,0,199,0,195,128,193,192,192,192,10,14,28,12,0, + 0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,192,0,192,0,255,192,255,192,10,14,28, + 12,0,0,192,192,225,192,243,192,255,192,222,192,204,192,204, + 192,204,192,192,192,192,192,192,192,192,192,192,192,192,192,10, + 14,28,12,0,0,192,192,224,192,240,192,248,192,220,192,206, + 192,199,192,195,192,193,192,192,192,192,192,192,192,192,192,192, + 192,10,14,28,12,0,0,63,0,127,128,225,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,225,192,127, + 128,63,0,10,14,28,12,0,0,255,0,255,128,193,192,192, + 192,192,192,193,192,255,128,255,0,192,0,192,0,192,0,192, + 0,192,0,192,0,10,16,32,12,0,254,63,0,127,128,225, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,204, + 192,239,192,127,128,63,128,1,192,0,192,10,14,28,12,0, + 0,255,0,255,128,193,192,192,192,192,192,193,128,255,0,255, + 128,193,192,192,192,192,192,192,192,192,192,192,192,10,14,28, + 12,0,0,63,0,127,128,225,192,192,192,192,0,224,0,127, + 0,63,128,1,192,0,192,192,192,225,192,127,128,63,0,10, + 14,28,12,0,0,255,192,255,192,12,0,12,0,12,0,12, + 0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12, + 0,10,14,28,12,0,0,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,225,192,127, + 128,63,0,10,14,28,12,0,0,192,192,192,192,192,192,192, + 192,192,192,192,192,97,128,97,128,51,0,51,0,30,0,30, + 0,12,0,12,0,10,14,28,12,0,0,192,192,192,192,192, + 192,192,192,192,192,192,192,204,192,204,192,204,192,222,192,255, + 192,243,192,225,192,192,192,10,14,28,12,0,0,192,192,192, + 192,192,192,225,192,115,128,63,0,30,0,30,0,63,0,115, + 128,225,192,192,192,192,192,192,192,10,14,28,12,0,0,192, + 192,192,192,192,192,192,192,192,192,225,192,115,128,63,0,30, + 0,12,0,12,0,12,0,12,0,12,0,10,14,28,12,0, + 0,255,192,255,192,0,192,1,192,3,128,7,0,14,0,28, + 0,56,0,112,0,224,0,192,0,255,192,255,192,4,18,18, + 12,4,254,240,240,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,240,240,11,20,40,12,1,252,192,0,192,0,96, + 0,96,0,48,0,48,0,24,0,24,0,12,0,12,0,6, + 0,6,0,3,0,3,0,1,128,1,128,0,192,0,192,0, + 96,0,96,4,18,18,12,2,254,240,240,48,48,48,48,48, + 48,48,48,48,48,48,48,48,48,240,240,10,6,12,12,0, + 8,12,0,30,0,63,0,115,128,225,192,64,128,12,2,4, + 12,0,252,255,240,255,240,4,4,4,12,2,12,192,224,112, + 48,10,10,20,12,0,0,63,192,127,192,224,192,192,192,192, + 192,193,192,195,192,231,192,126,192,60,192,10,14,28,12,0, + 0,192,0,192,0,192,0,192,0,255,0,255,128,193,192,192, + 192,192,192,192,192,192,192,193,192,255,128,255,0,10,10,20, + 12,0,0,63,0,127,128,225,192,192,192,192,0,192,0,192, + 0,224,0,127,192,63,192,10,14,28,12,0,0,0,192,0, + 192,0,192,0,192,63,192,127,192,224,192,192,192,192,192,192, + 192,192,192,224,192,127,192,63,192,10,10,20,12,0,0,63, + 0,127,128,225,192,192,192,255,192,255,192,192,0,224,0,127, + 192,63,192,8,14,14,12,2,0,15,31,56,48,252,252,48, + 48,48,48,48,48,48,48,10,14,28,12,0,252,63,192,127, + 192,224,192,192,192,192,192,192,192,192,192,224,192,127,192,63, + 192,0,192,1,192,63,128,63,0,10,14,28,12,0,0,192, + 0,192,0,192,0,192,0,255,0,255,128,193,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,6,14,14,12,2, + 0,48,48,0,0,240,240,48,48,48,48,48,48,252,252,6, + 18,18,12,0,252,12,12,0,0,60,60,12,12,12,12,12, + 12,12,12,12,28,248,240,10,14,28,12,0,0,192,0,192, + 0,192,0,192,0,195,128,199,0,206,0,220,0,252,0,254, + 0,231,0,195,128,193,192,192,192,6,14,14,12,2,0,240, + 240,48,48,48,48,48,48,48,48,48,48,252,252,10,10,20, + 12,0,0,255,0,255,128,205,192,204,192,204,192,204,192,204, + 192,204,192,204,192,204,192,10,10,20,12,0,0,207,0,223, + 128,249,192,240,192,224,192,192,192,192,192,192,192,192,192,192, + 192,10,10,20,12,0,0,63,0,127,128,225,192,192,192,192, + 192,192,192,192,192,225,192,127,128,63,0,10,14,28,12,0, + 252,255,0,255,128,193,192,192,192,192,192,192,192,192,192,193, + 192,255,128,255,0,192,0,192,0,192,0,192,0,10,14,28, + 12,0,252,63,192,127,192,224,192,192,192,192,192,192,192,192, + 192,224,192,127,192,63,192,0,192,0,192,0,192,0,192,10, + 10,20,12,0,0,207,0,223,128,249,192,240,192,224,0,192, + 0,192,0,192,0,192,0,192,0,10,10,20,12,0,0,63, + 192,127,192,192,0,192,0,127,0,63,128,0,192,0,192,255, + 128,255,0,8,14,14,12,2,0,48,48,48,48,252,252,48, + 48,48,48,48,56,31,15,10,10,20,12,0,0,192,192,192, + 192,192,192,192,192,192,192,193,192,195,192,231,192,126,192,60, + 192,10,10,20,12,0,0,192,192,192,192,192,192,97,128,97, + 128,51,128,51,0,30,0,30,0,12,0,10,10,20,12,0, + 0,204,192,204,192,204,192,204,192,204,192,204,192,204,192,204, + 192,127,128,51,0,10,10,20,12,0,0,192,192,225,192,115, + 128,63,0,30,0,30,0,63,0,115,128,225,192,192,192,10, + 14,28,12,0,252,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,224,192,127,192,63,192,0,192,1,192,63,128,63, + 0,10,10,20,12,0,0,255,192,255,192,3,128,7,0,14, + 0,28,0,56,0,112,0,255,192,255,192,6,22,22,12,2, + 252,12,28,56,48,48,48,48,48,48,112,224,224,112,48,48, + 48,48,48,48,56,28,12,2,18,18,12,4,254,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,6, + 22,22,12,2,252,192,224,112,48,48,48,48,48,48,56,28, + 28,56,48,48,48,48,48,48,112,224,192,10,4,8,12,0, + 6,48,192,124,192,207,128,195,0,0,0,0,12,0,0,0, + 0,0,12,0,0,0,0,0,12,0,0,4,7,7,12,0, + 253,48,48,48,48,112,224,64,10,22,44,12,0,252,3,192, + 7,192,14,0,12,0,12,0,12,0,12,0,12,0,63,0, + 63,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,28,0,248,0,240,0,8,7,7,12,0,253, + 51,51,51,51,119,238,68,10,2,4,12,0,0,204,192,204, + 192,6,10,10,12,2,4,48,48,252,252,48,48,48,48,48, + 48,6,10,10,12,2,4,48,48,252,252,48,48,252,252,48, + 48,6,4,4,12,2,12,48,120,252,204,12,16,32,12,0, + 0,63,240,127,240,204,224,205,192,207,128,207,0,126,0,60, + 0,60,192,127,224,243,48,243,48,179,48,51,48,31,224,12, + 192,10,18,36,12,0,0,51,0,63,0,30,0,12,0,63, + 0,127,128,225,192,192,192,192,0,224,0,127,0,63,128,1, + 192,0,192,192,192,225,192,127,128,63,0,4,10,10,12,0, + 255,48,112,96,224,192,192,224,96,112,48,10,14,28,12,0, + 0,63,192,127,192,236,0,204,0,204,0,204,0,207,0,207, + 0,204,0,204,0,204,0,236,0,127,192,63,192,0,0,0, + 12,0,0,0,0,0,12,0,0,0,0,0,12,0,0,0, + 0,0,12,0,0,4,7,7,12,4,8,32,112,224,192,192, + 192,192,4,7,7,12,4,7,48,48,48,48,112,224,64,8, + 7,7,12,2,8,34,119,238,204,204,204,204,8,7,7,12, + 2,7,51,51,51,51,119,238,68,10,10,20,12,0,2,30, + 0,127,128,127,128,255,192,255,192,255,192,255,192,127,128,127, + 128,30,0,6,2,2,12,2,6,252,252,12,2,4,12,0, + 6,255,240,255,240,10,4,8,12,0,12,48,192,124,192,207, + 128,195,0,12,6,12,12,0,8,255,48,255,240,51,240,51, + 240,51,48,51,48,10,16,32,12,0,0,51,0,63,0,30, + 0,12,0,0,0,0,0,63,192,127,192,192,0,192,0,127, + 0,63,128,0,192,0,192,255,128,255,0,4,10,10,12,0, + 255,192,224,96,112,48,48,112,96,224,192,10,10,20,12,0, + 0,51,0,127,128,204,192,204,192,207,192,207,192,204,0,204, + 0,127,192,51,192,0,0,0,12,0,0,0,0,0,12,0, + 0,10,18,36,12,0,0,51,0,51,0,0,0,0,0,192, + 192,192,192,192,192,192,192,192,192,225,192,115,128,63,0,30, + 0,12,0,12,0,12,0,12,0,12,0,0,0,0,12,0, + 0,2,14,14,12,6,0,192,192,0,0,192,192,192,192,192, + 192,192,192,192,192,10,14,28,12,0,254,12,0,12,0,63, + 0,127,128,237,192,204,192,204,0,204,0,204,0,236,0,127, + 192,63,192,12,0,12,0,10,16,32,12,0,0,60,0,126, + 0,231,0,195,0,192,0,192,0,252,0,252,0,192,0,192, + 0,192,0,192,0,192,192,193,192,255,128,255,0,10,10,20, + 12,0,0,64,128,225,192,127,128,63,0,51,0,51,0,63, + 0,127,128,225,192,64,128,10,14,28,12,0,0,192,192,225, + 192,115,128,63,0,255,192,255,192,12,0,12,0,255,192,255, + 192,12,0,12,0,12,0,12,0,2,18,18,12,4,254,192, + 192,192,192,192,192,192,192,0,0,192,192,192,192,192,192,192, + 192,10,20,40,12,0,254,31,0,127,128,97,192,224,192,112, + 192,56,192,220,0,206,0,199,0,227,128,113,192,56,192,28, + 192,14,192,199,0,195,128,193,192,225,128,127,128,62,0,6, + 2,2,12,2,12,204,204,10,14,28,12,0,0,120,0,254, + 0,135,0,1,128,61,128,124,192,192,192,192,192,124,192,61, + 128,1,128,135,0,254,0,120,0,8,12,12,12,2,6,63, + 127,227,195,195,227,127,63,0,0,255,255,10,10,20,12,0, + 255,48,192,113,192,97,128,227,128,195,0,195,0,227,128,97, + 128,113,192,48,192,10,6,12,12,0,2,255,192,255,192,0, + 192,0,192,0,192,0,192,10,2,4,12,0,6,255,192,255, + 192,10,12,24,12,0,2,120,0,254,0,135,0,1,128,241, + 128,248,192,204,192,204,192,248,192,249,192,223,128,207,0,6, + 2,2,12,2,12,252,252,8,8,8,12,2,8,60,126,231, + 195,195,231,126,60,10,12,24,12,0,0,12,0,12,0,12, + 0,12,0,255,192,255,192,12,0,12,0,12,0,12,0,255, + 192,255,192,5,7,7,12,3,11,112,136,8,16,32,64,248, + 5,7,7,12,3,11,112,136,8,48,8,136,112,4,4,4, + 12,4,12,48,112,224,192,10,14,28,12,0,252,195,0,195, + 0,195,0,195,0,195,0,195,0,195,0,199,128,255,192,252, + 192,192,0,192,0,192,0,192,0,10,16,32,12,0,0,31, + 192,127,192,124,192,236,192,204,192,204,192,236,192,124,192,127, + 192,31,192,12,192,12,192,12,192,12,192,12,192,12,192,4, + 4,4,12,4,4,96,240,240,96,4,6,6,12,2,252,240, + 240,48,112,224,64,5,7,7,12,3,11,32,224,32,32,32, + 32,248,8,12,12,12,2,6,60,126,231,195,195,231,126,60, + 0,0,255,255,10,10,20,12,0,255,195,0,227,128,97,128, + 113,192,48,192,48,192,113,192,97,128,227,128,195,0,12,18, + 36,12,0,0,16,0,112,0,16,0,16,0,16,16,16,32, + 124,64,0,128,1,0,2,0,4,0,8,64,16,192,33,64, + 66,64,131,224,0,64,0,224,12,18,36,12,0,0,16,0, + 112,0,16,0,16,0,16,16,16,32,124,64,0,128,1,0, + 2,0,4,0,9,192,18,32,32,32,64,64,128,128,1,0, + 3,224,12,18,36,12,0,0,56,0,68,0,4,0,24,0, + 4,16,68,32,56,64,0,128,1,0,2,0,4,0,8,64, + 16,192,33,64,66,64,131,224,0,64,0,224,10,14,28,12, + 0,0,12,0,12,0,0,0,0,0,12,0,28,0,56,0, + 112,0,224,0,192,0,192,192,225,192,127,128,63,0,10,18, + 36,12,0,0,48,0,56,0,28,0,12,0,12,0,30,0, + 30,0,51,0,51,0,97,128,97,128,192,192,255,192,255,192, + 192,192,192,192,192,192,192,192,10,18,36,12,0,0,3,0, + 7,0,14,0,12,0,12,0,30,0,30,0,51,0,51,0, + 97,128,97,128,192,192,255,192,255,192,192,192,192,192,192,192, + 192,192,10,18,36,12,0,0,12,0,30,0,63,0,51,0, + 12,0,30,0,30,0,51,0,51,0,97,128,97,128,192,192, + 255,192,255,192,192,192,192,192,192,192,192,192,10,18,36,12, + 0,0,48,192,124,192,207,128,195,0,12,0,30,0,30,0, + 51,0,51,0,97,128,97,128,192,192,255,192,255,192,192,192, + 192,192,192,192,192,192,10,18,36,12,0,0,51,0,51,0, + 0,0,0,0,12,0,30,0,30,0,51,0,51,0,97,128, + 97,128,192,192,255,192,255,192,192,192,192,192,192,192,192,192, + 10,18,36,12,0,0,12,0,30,0,51,0,51,0,30,0, + 30,0,30,0,51,0,51,0,97,128,97,128,192,192,255,192, + 255,192,192,192,192,192,192,192,192,192,10,14,28,12,0,0, + 63,192,127,192,236,0,204,0,204,0,204,0,255,0,255,0, + 204,0,204,0,204,0,204,0,207,192,207,192,10,18,36,12, + 0,252,63,0,127,128,225,192,192,192,192,0,192,0,192,0, + 192,0,192,0,192,0,192,192,225,192,127,128,63,0,12,0, + 28,0,56,0,16,0,10,18,36,12,0,0,48,0,56,0, + 28,0,12,0,255,192,255,192,192,0,192,0,192,0,192,0, + 255,0,255,0,192,0,192,0,192,0,192,0,255,192,255,192, + 10,18,36,12,0,0,3,0,7,0,14,0,12,0,255,192, + 255,192,192,0,192,0,192,0,192,0,255,0,255,0,192,0, + 192,0,192,0,192,0,255,192,255,192,10,18,36,12,0,0, + 12,0,30,0,63,0,51,0,255,192,255,192,192,0,192,0, + 192,0,192,0,255,0,255,0,192,0,192,0,192,0,192,0, + 255,192,255,192,10,18,36,12,0,0,51,0,51,0,0,0, + 0,0,255,192,255,192,192,0,192,0,192,0,192,0,255,0, + 255,0,192,0,192,0,192,0,192,0,255,192,255,192,10,18, + 36,12,0,0,48,0,56,0,28,0,12,0,255,192,255,192, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,255,192,255,192,10,18,36,12,0,0,3,0, + 7,0,14,0,12,0,255,192,255,192,12,0,12,0,12,0, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,255,192, + 255,192,10,18,36,12,0,0,12,0,30,0,63,0,51,0, + 255,192,255,192,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,12,0,12,0,255,192,255,192,10,18,36,12, + 0,0,51,0,51,0,0,0,0,0,255,192,255,192,12,0, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,255,192,255,192,10,14,28,12,0,0,63,0,63,128, + 49,192,48,192,48,192,48,192,252,192,252,192,48,192,48,192, + 48,192,49,192,63,128,63,0,10,18,36,12,0,0,48,192, + 124,192,207,128,199,0,192,192,224,192,240,192,248,192,220,192, + 206,192,199,192,195,192,193,192,192,192,192,192,192,192,192,192, + 192,192,10,18,36,12,0,0,48,0,56,0,28,0,12,0, + 63,0,127,128,225,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,225,192,127,128,63,0,10,18,36,12, + 0,0,3,0,7,0,14,0,12,0,63,0,127,128,225,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 225,192,127,128,63,0,10,18,36,12,0,0,12,0,30,0, + 63,0,51,0,0,0,63,0,127,128,225,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,225,192,127,128,63,0, + 10,18,36,12,0,0,48,192,124,192,207,128,199,0,63,0, + 127,128,225,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,225,192,127,128,63,0,10,18,36,12,0,0, + 51,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,225,192, + 127,128,63,0,10,10,20,12,0,2,64,128,225,192,115,128, + 63,0,30,0,30,0,63,0,115,128,225,192,64,128,10,14, + 28,12,0,0,63,0,127,128,225,192,193,192,195,192,199,192, + 206,192,220,192,248,192,240,192,224,192,225,192,127,128,63,0, + 10,18,36,12,0,0,48,0,56,0,28,0,12,0,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,225,192,127,128,63,0,10,18,36,12,0,0, + 3,0,7,0,14,0,12,0,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,225,192, + 127,128,63,0,10,18,36,12,0,0,12,0,30,0,63,0, + 51,0,0,0,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,225,192,127,128,63,0,10,18, + 36,12,0,0,51,0,51,0,0,0,0,0,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,225,192,127,128,63,0,10,18,36,12,0,0,3,0, + 7,0,14,0,12,0,192,192,192,192,192,192,192,192,192,192, + 225,192,115,128,63,0,30,0,12,0,12,0,12,0,12,0, + 12,0,10,14,28,12,0,0,192,0,192,0,255,0,255,128, + 193,192,192,192,192,192,193,192,255,128,255,0,192,0,192,0, + 192,0,192,0,10,18,36,12,0,254,15,0,31,128,57,192, + 112,192,224,192,193,192,195,128,195,0,195,0,195,128,193,192, + 192,192,192,192,193,192,207,128,207,0,192,0,192,0,10,16, + 32,12,0,0,12,0,14,0,7,0,3,0,0,0,0,0, + 63,192,127,192,224,192,192,192,192,192,193,192,195,192,231,192, + 126,192,60,192,10,16,32,12,0,0,3,0,7,0,14,0, + 12,0,0,0,0,0,63,192,127,192,224,192,192,192,192,192, + 193,192,195,192,231,192,126,192,60,192,10,16,32,12,0,0, + 12,0,30,0,63,0,51,0,0,0,0,0,63,192,127,192, + 224,192,192,192,192,192,193,192,195,192,231,192,126,192,60,192, + 10,16,32,12,0,0,48,192,124,192,207,128,199,0,0,0, + 0,0,63,192,127,192,224,192,192,192,192,192,193,192,195,192, + 231,192,126,192,60,192,10,14,28,12,0,0,51,0,51,0, + 0,0,0,0,63,192,127,192,224,192,192,192,192,192,193,192, + 195,192,231,192,126,192,60,192,10,16,32,12,0,0,12,0, + 30,0,51,0,51,0,30,0,12,0,63,192,127,192,224,192, + 192,192,192,192,193,192,195,192,231,192,126,192,60,192,10,10, + 20,12,0,0,63,0,127,128,237,192,204,192,207,192,207,192, + 204,0,236,0,127,192,63,192,10,14,28,12,0,252,63,0, + 127,128,225,192,192,192,192,0,192,0,192,0,224,0,127,192, + 63,192,12,0,28,0,56,0,16,0,10,16,32,12,0,0, + 48,0,56,0,28,0,12,0,0,0,0,0,63,0,127,128, + 225,192,192,192,255,192,255,192,192,0,224,0,127,192,63,192, + 10,16,32,12,0,0,3,0,7,0,14,0,12,0,0,0, + 0,0,63,0,127,128,225,192,192,192,255,192,255,192,192,0, + 224,0,127,192,63,192,10,16,32,12,0,0,12,0,30,0, + 63,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, + 255,192,255,192,192,0,224,0,127,192,63,192,10,14,28,12, + 0,0,51,0,51,0,0,0,0,0,63,0,127,128,225,192, + 192,192,255,192,255,192,192,0,224,0,127,192,63,192,6,16, + 16,12,2,0,192,224,112,48,0,0,240,240,48,48,48,48, + 48,48,252,252,6,16,16,12,2,0,12,28,56,48,0,0, + 240,240,48,48,48,48,48,48,252,252,6,16,16,12,2,0, + 48,120,252,204,0,0,240,240,48,48,48,48,48,48,252,252, + 6,14,14,12,2,0,204,204,0,0,240,240,48,48,48,48, + 48,48,252,252,10,17,34,12,0,0,36,0,126,0,60,0, + 60,0,126,0,39,0,3,128,63,192,127,192,225,192,192,192, + 192,192,192,192,192,192,225,192,127,128,63,0,10,16,32,12, + 0,0,48,192,124,192,207,128,199,0,0,0,0,0,207,0, + 223,128,249,192,240,192,224,192,192,192,192,192,192,192,192,192, + 192,192,10,16,32,12,0,0,48,0,56,0,28,0,12,0, + 0,0,0,0,63,0,127,128,225,192,192,192,192,192,192,192, + 192,192,225,192,127,128,63,0,10,16,32,12,0,0,3,0, + 7,0,14,0,12,0,0,0,0,0,63,0,127,128,225,192, + 192,192,192,192,192,192,192,192,225,192,127,128,63,0,10,16, + 32,12,0,0,12,0,30,0,63,0,51,0,0,0,0,0, + 63,0,127,128,225,192,192,192,192,192,192,192,192,192,225,192, + 127,128,63,0,10,16,32,12,0,0,48,192,124,192,207,128, + 199,0,0,0,0,0,63,0,127,128,225,192,192,192,192,192, + 192,192,192,192,225,192,127,128,63,0,10,14,28,12,0,0, + 51,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, + 192,192,192,192,192,192,225,192,127,128,63,0,10,10,20,12, + 0,2,12,0,12,0,0,0,0,0,255,192,255,192,0,0, + 0,0,12,0,12,0,10,10,20,12,0,0,63,0,127,128, + 227,192,199,192,206,192,220,192,248,192,241,192,127,128,63,0, + 10,16,32,12,0,0,48,0,56,0,28,0,12,0,0,0, + 0,0,192,192,192,192,192,192,192,192,192,192,193,192,195,192, + 231,192,126,192,60,192,10,16,32,12,0,0,3,0,7,0, + 14,0,12,0,0,0,0,0,192,192,192,192,192,192,192,192, + 192,192,193,192,195,192,231,192,126,192,60,192,10,16,32,12, + 0,0,12,0,30,0,63,0,51,0,0,0,0,0,192,192, + 192,192,192,192,192,192,192,192,193,192,195,192,231,192,126,192, + 60,192,10,14,28,12,0,0,51,0,51,0,0,0,0,0, + 192,192,192,192,192,192,192,192,192,192,193,192,195,192,231,192, + 126,192,60,192,10,20,40,12,0,252,3,0,7,0,14,0, + 12,0,0,0,0,0,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,224,192,127,192,63,192,0,192,1,192,63,128, + 63,0,10,18,36,12,0,252,192,0,192,0,192,0,192,0, + 255,0,255,128,193,192,192,192,192,192,192,192,192,192,193,192, + 255,128,255,0,192,0,192,0,192,0,192,0,10,18,36,12, + 0,252,51,0,51,0,0,0,0,0,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,224,192,127,192,63,192,0,192, + 1,192,63,128,63,0 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/ili9328.h b/Marlin/src/lcd/tft/ili9328.h new file mode 100644 index 0000000000..85edfa7bee --- /dev/null +++ b/Marlin/src/lcd/tft/ili9328.h @@ -0,0 +1,150 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ILI9328_DRVCTL_SM 0x0400 +#define ILI9328_DRVCTL_SS 0x0100 // Select the shift direction of outputs from the source driver. 0 - from S1 to S720 / 1 - from S720 to S1 + +#define ILI9328_GATE_SCANCTL_GS 0x8000 // Sets the direction of scan by the gate driver in the range determined by SCN[4:0] and NL[4:0]. + +#define ILI9328_ETMOD_TRI 0x8000 +#define ILI9328_ETMOD_DFM 0x4000 +#define ILI9328_ETMOD_BGR 0x1000 // RGB-BGR ORDER +#define ILI9328_ETMOD_RGB 0x0000 +#define ILI9328_ETMOD_ORG 0x0080 +#define ILI9328_ETMOD_ID1 0x0020 // 0 - Vertical Decrement / 1 - Vertical Increment +#define ILI9328_ETMOD_ID0 0x0010 // 0 - Horizontal Decrement / 1 - Horizontal Increment +#define ILI9328_ETMOD_AM 0x0008 // 0 - Horizontal / 1 - Vertical + +// MKS Robin TFT v1.1 - 320x240 ; Cable on the left side +#define ILI9328_DRVCTL_DATA ILI9328_DRVCTL_SS +#define ILI9328_ETMOD_DATA ILI9328_ETMOD_BGR | ILI9328_ETMOD_ID1 | ILI9328_ETMOD_ID0 | ILI9328_ETMOD_AM + +#define ILI9328_RDDID 0x00 // ID code - 0x9328 +#define ILI9328_DRVCTL 0x01 // Driver Output Control +#define ILI9328_LCDCTL 0x02 // LCD Driving Wave Control +#define ILI9328_ETMOD 0x03 // Entry Mode - Control the GRAM update direction +#define ILI9328_RESIZECTL 0x04 // Resizing Control Register +#define ILI9328_DISCTRL1 0x07 // Display Control 1 +#define ILI9328_DISCTRL2 0x08 // Display Control 2 +#define ILI9328_DISCTRL3 0x09 // Display Control 3 +#define ILI9328_DISCTRL4 0x0A // Display Control 4 +#define ILI9328_RGBCTRL1 0x0C // RGB Display Interface Control 1 +#define ILI9328_FMARKERPOS 0x0D // Frame Marker Position +#define ILI9328_RGBCTRL2 0x0F // RGB Display Interface Control 2 +#define ILI9328_PWCTRL1 0x10 // Power Control 1 +#define ILI9328_PWCTRL2 0x11 // Power Control 2 +#define ILI9328_PWCTRL3 0x12 // Power Control 3 +#define ILI9328_PWCTRL4 0x13 // Power Control 4 + +// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X +#define ILI9328_HASET 0x20 // GRAM Horizontal Address Set (0-255) +#define ILI9328_VASET 0x21 // GRAM Vertical Address Set (0-511) +#define ILI9328_RAMWR 0x22 // Write data to GRAM +#define ILI9328_RAMRD 0x22 // Read Data from GRAM + +#define ILI9328_PWCTRL7 0x29 // Power Control 7 +#define ILI9328_FRMCTR 0x2B // Frame Rate and Color Control +#define ILI9328_GAMCTRL1 0x30 // Gamma Control +#define ILI9328_GAMCTRL2 0x31 // Gamma Control +#define ILI9328_GAMCTRL3 0x32 // Gamma Control +#define ILI9328_GAMCTRL4 0x35 // Gamma Control +#define ILI9328_GAMCTRL5 0x36 // Gamma Control +#define ILI9328_GAMCTRL6 0x37 // Gamma Control +#define ILI9328_GAMCTRL7 0x38 // Gamma Control +#define ILI9328_GAMCTRL8 0x39 // Gamma Control +#define ILI9328_GAMCTRL9 0x3C // Gamma Control +#define ILI9328_GAMCTRLA 0x3D // Gamma Control + +// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X +#define ILI9328_HASTART 0x50 // Horizontal Address Start Position (0-255) +#define ILI9328_HAEND 0x51 // Horizontal Address End Position (0-255) +#define ILI9328_VASTART 0x52 // Vertical Address Start Position (0-511) +#define ILI9328_VAEND 0x53 // Vertical Address End Position (0-511) + +#define ILI9328_GATE_SCANCTL1 0x60 // Gate Scan Control +#define ILI9328_GATE_SCANCTL2 0x61 // Gate Scan Control +#define ILI9328_GATE_SCANCTL3 0x6A // Gate Scan Control + +#define ILI9328_PLTPOS1 0x80 // Partial Image 1 Display Position +#define ILI9328_PLTSTART1 0x81 // Partial Image 1 RAM Start Address +#define ILI9328_PLTEND1 0x82 // Partial Image 1 RAM End Address +#define ILI9328_PLTPOS2 0x83 // Partial Image 2 Display Position +#define ILI9328_PLTSTART2 0x84 // Partial Image 2 RAM Start Address +#define ILI9328_PLTEND2 0x85 // Partial Image 2 RAM End Address + +#define ILI9328_IFCTL1 0x90 // Panel Interface Control 1 +#define ILI9328_IFCTL2 0x92 // Panel Interface Control 2 +#define ILI9328_IFCTL4 0x95 // Panel Interface Control 4 +#define ILI9328_IFCTL5 0x97 // Panel Interface Control 5 + +#define ILI9328_OTPWR 0xA1 // OTP VCM Programming Control +#define ILI9328_RDOTP 0xA2 // OTP VCM Status and Enable +#define ILI9328_OTPPKEY 0xA5 // OTP Programming ID Key + + +static const uint16_t ili9328_init[] = { + DATASIZE_16BIT, + ESC_REG(ILI9328_DRVCTL), ILI9328_DRVCTL_DATA, + ESC_REG(ILI9328_LCDCTL), 0x0400, // LCD Driving Wave Control + ESC_REG(ILI9328_ETMOD), ILI9328_ETMOD_DATA, + + ESC_REG(ILI9328_RESIZECTL), 0x0000, + ESC_REG(ILI9328_DISCTRL2), 0x0202, + ESC_REG(ILI9328_DISCTRL3), 0x0000, + ESC_REG(ILI9328_DISCTRL4), 0x0000, + ESC_REG(ILI9328_RGBCTRL1), 0x0000, + ESC_REG(ILI9328_FMARKERPOS), 0x0000, + ESC_REG(ILI9328_RGBCTRL2), 0x0000, + ESC_REG(ILI9328_PWCTRL1), 0x0000, + ESC_REG(ILI9328_PWCTRL2), 0x0007, + ESC_REG(ILI9328_PWCTRL3), 0x0000, + ESC_REG(ILI9328_PWCTRL4), 0x0000, + ESC_REG(ILI9328_DISCTRL1), 0x0001, + ESC_DELAY(200), + ESC_REG(ILI9328_PWCTRL1), 0x1690, + ESC_REG(ILI9328_PWCTRL2), 0x0227, + ESC_DELAY(50), + ESC_REG(ILI9328_PWCTRL3), 0x008C, + ESC_DELAY(50), + ESC_REG(ILI9328_PWCTRL4), 0x1500, + ESC_REG(ILI9328_PWCTRL7), 0x0004, + ESC_REG(ILI9328_FRMCTR), 0x000D, + ESC_DELAY(50), + ESC_REG(ILI9328_GATE_SCANCTL1), 0x2700, + ESC_REG(ILI9328_GATE_SCANCTL2), 0x0001, + ESC_REG(ILI9328_GATE_SCANCTL3), 0x0000, + ESC_REG(ILI9328_PLTPOS1), 0x0000, + ESC_REG(ILI9328_PLTSTART1), 0x0000, + ESC_REG(ILI9328_PLTEND1), 0x0000, + ESC_REG(ILI9328_PLTPOS2), 0x0000, + ESC_REG(ILI9328_PLTSTART2), 0x0000, + ESC_REG(ILI9328_PLTEND2), 0x0000, + ESC_REG(ILI9328_IFCTL1), 0x0010, + ESC_REG(ILI9328_IFCTL2), 0x0600, + ESC_REG(ILI9328_DISCTRL1), 0x0133, + ESC_END +}; diff --git a/Marlin/src/lcd/tft/ili9341.h b/Marlin/src/lcd/tft/ili9341.h new file mode 100644 index 0000000000..42a36b7e34 --- /dev/null +++ b/Marlin/src/lcd/tft/ili9341.h @@ -0,0 +1,162 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ILI9341_MADCTL_MY 0x80 // Row Address Order +#define ILI9341_MADCTL_MX 0x40 // Column Address Order +#define ILI9341_MADCTL_MV 0x20 // Row/Column Exchange +#define ILI9341_MADCTL_ML 0x10 // Vertical Refresh Order +#define ILI9341_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ILI9341_MADCTL_RGB 0x00 +#define ILI9341_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ILI9341_ORIENTATION_UP ILI9341_MADCTL_MY // 240x320 ; Cable on the upper side +#define ILI9341_ORIENTATION_RIGHT ILI9341_MADCTL_MV // 320x240 ; Cable on the right side +#define ILI9341_ORIENTATION_LEFT ILI9341_MADCTL_MY | ILI9341_MADCTL_MX | ILI9341_MADCTL_MV // 320x240 ; Cable on the left side +#define ILI9341_ORIENTATION_DOWN ILI9341_MADCTL_MX // 240x320 ; Cable on the upper side + +#define ILI9341_COLOR_BGR +#define ILI9341_ORIENTATION ILI9341_ORIENTATION_LEFT +#define ILI9341_MADCTL_DATA (ILI9341_ORIENTATION | TERN(ILI9341_COLOR_BGR, ILI9341_MADCTL_BGR, ILI9341_MADCTL_RGB)) + +#define ILI9341_NOP 0x00 // No Operation +#define ILI9341_SWRESET 0x01 // Software Reset +#define ILI9341_RDDIDIF 0x04 // Read display identification information +#define ILI9341_RDDST 0x09 // Read Display Status +#define ILI9341_RDDPM 0x0A // Read Display Power Mode +#define ILI9341_RDDMADCTL 0x0B // Read Display MADCTL +#define ILI9341_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ILI9341_RDDIM 0x0D // Read Display Image Format +#define ILI9341_RDDSM 0x0E // Read Display Signal Mode +#define ILI9341_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ILI9341_SPLIN 0x10 // Enter Sleep Mode +#define ILI9341_SLPOUT 0x11 // Sleep Out +#define ILI9341_PTLON 0x12 // Partial Mode ON +#define ILI9341_NORON 0x13 // Normal Display Mode ON +#define ILI9341_DINVOFF 0x20 // Display Inversion OFF +#define ILI9341_DINVON 0x21 // Display Inversion ON +#define ILI9341_GAMSET 0x26 // Gamma Set +#define ILI9341_DISPOFF 0x28 // Display OFF +#define ILI9341_DISPON 0x29 // Display ON +#define ILI9341_CASET 0x2A // Column Address Set +#define ILI9341_PASET 0x2B // Page Address Set +#define ILI9341_RAMWR 0x2C // Memory Write +#define ILI9341_RGBSET 0x2D // Color Set +#define ILI9341_RAMRD 0x2E // Memory Read +#define ILI9341_PLTAR 0x30 // Partial Area +#define ILI9341_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ILI9341_TEOFF 0x34 // Tearing Effect Line OFF +#define ILI9341_TEON 0x35 // Tearing Effect Line ON +#define ILI9341_MADCTL 0x36 // Memory Access Control +#define ILI9341_VSCRSADD 0x37 // Vertical Scrolling Start Address +#define ILI9341_IDMOFF 0x38 // Idle Mode OFF +#define ILI9341_IDMON 0x39 // Idle Mode ON +#define ILI9341_PIXSET 0x3A // COLMOD: Pixel Format Set +#define ILI9341_WRMEMC 0x3C // Write Memory Continue +#define ILI9341_RDMEMC 0x3E // Read Memory Continue +#define ILI9341_STE 0x44 // Set Tear Scanline +#define ILI9341_GSCAN 0x45 // Get Scanline +#define ILI9341_WRDISBV 0x51 // Write Display Brightness +#define ILI9341_RDDISBV 0x52 // Read Display Brightness +#define ILI9341_WRCTRLD 0x53 // Write CTRL Display +#define ILI9341_RDCTRLD 0x54 // Read CTRL Display +#define ILI9341_WRCABC 0x55 // Write Content Adaptive Brightness Control +#define ILI9341_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define ILI9341_WRCABCMB 0x5E // Write CABC Minimum Brightness / Backlight Control 1 +#define ILI9341_RDCABCMB 0x5F // Read CABC Minimum Brightness / Backlight Control 1 +#define ILI9341_RDID1 0xDA // Read ID1 +#define ILI9341_RDID2 0xDB // Read ID2 +#define ILI9341_RDID3 0xDC // Read ID3 + +#define ILI9341_IFMODE 0xB0 // RGB Interface Signal Control +#define ILI9341_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) +#define ILI9341_FRMCTR2 0xB2 // Frame Rate Control (In Idle Mode/8 colors) +#define ILI9341_FRMCTR3 0xB3 // Frame Rate control (In Partial Mode/Full Colors) +#define ILI9341_INVTR 0xB4 // Display Inversion Control +#define ILI9341_PRCTR 0xB5 // Blanking Porch Control +#define ILI9341_DISCTRL 0xB6 // Display Function Control +#define ILI9341_ETMOD 0xB7 // Entry Mode Set +#define ILI9341_BLCTL1 0xB8 // Backlight Control 1 +#define ILI9341_BLCTL2 0xB9 // Backlight Control 2 +#define ILI9341_BLCTL3 0xBA // Backlight Control 3 +#define ILI9341_BLCTL4 0xBB // Backlight Control 4 +#define ILI9341_BLCTL5 0xBC // Backlight Control 5 +#define ILI9341_BLCTL7 0xBE // Backlight Control 7 +#define ILI9341_BLCTL8 0xBF // Backlight Control 8 +#define ILI9341_PWCTRL1 0xC0 // Power Control 1 +#define ILI9341_PWCTRL2 0xC1 // Power Control 2 +#define ILI9341_VMCTRL1 0xC5 // VCOM Control 1 +#define ILI9341_VMCTRL2 0xC7 // VCOM Control 2 +#define ILI9341_PWCTRLA 0xCB // Power control A +#define ILI9341_PWCTRLB 0xCF // Power control B +#define ILI9341_NVMWR 0xD0 // NV Memory Write +#define ILI9341_NVMPKEY 0xD1 // NV Memory Protection Key +#define ILI9341_RDNVM 0xD2 // NV Memory Status Read +#define ILI9341_RDID4 0xD3 // Read ID4 - 0x009341 +#define ILI9341_PGAMCTRL 0xE0 // Positive Gamma Correction +#define ILI9341_NGAMCTRL 0xE1 // Negative Gamma Correction +#define ILI9341_DGAMCTRL1 0xE2 // Digital Gamma Control 1 +#define ILI9341_DGAMCTRL2 0xE3 // Digital Gamma Control 2 +#define ILI9341_DRVTCTLA1 0xE8 // Driver timing control A +#define ILI9341_DRVTCTLA2 0xE9 // Driver timing control A +#define ILI9341_DRVTCTLB 0xEA // Driver timing control B +#define ILI9341_PONSEQCTL 0xED // Power on sequence control +#define ILI9341_EN3G 0xF2 // Enable 3G - 3 gamma control +#define ILI9341_IFCTL 0xF6 // Interface Control +#define ILI9341_PUMPRCTL 0xF7 // Pump ratio control + + +static const uint16_t ili9341_init[] = { + DATASIZE_8BIT, + ESC_REG(ILI9341_SWRESET), ESC_DELAY(100), + ESC_REG(ILI9341_SLPOUT), ESC_DELAY(20), +/* + ESC_REG(ILI9341_PWCTRLA), 0x0039, 0x002C, 0x0000, 0x0034, 0x0002, // Power control A + ESC_REG(ILI9341_PWCTRLB), 0x0000, 0x00C1, 0x0030, // Power control B + ESC_REG(ILI9341_DRVTCTLA1), 0x0085, 0x0000, 0x0078, // Driver timing control A + ESC_REG(ILI9341_DRVTCTLB), 0x0000, 0x0000, // Driver timing control B + ESC_REG(ILI9341_PONSEQCTL), 0x0064, 0x0003, 0x0012, 0x0081, // Power on sequence control + ESC_REG(ILI9341_DISCTRL), 0x0008, 0x0082, 0x0027, // Display Function Control + ESC_REG(ILI9341_PUMPRCTL), 0x0020, // Pump ratio control + ESC_REG(ILI9341_VMCTRL1), 0x003E, 0x0028, // VCOM Control 1 + ESC_REG(ILI9341_VMCTRL2), 0x0086, // VCOM Control 2 + ESC_REG(ILI9341_FRMCTR1), 0x0000, 0x0018, // Frame Rate Control (In Normal Mode/Full Colors) + ESC_REG(ILI9341_PWCTRL1), 0x0023, // Power Control 1 + ESC_REG(ILI9341_PWCTRL2), 0x0010, // Power Control 2 +*/ + ESC_REG(ILI9341_MADCTL), ILI9341_MADCTL_DATA, + ESC_REG(ILI9341_PIXSET), 0x0055, + + /* Gamma Correction */ + ESC_REG(ILI9341_EN3G), 0x0000, // 3Gamma Function Disable + ESC_REG(ILI9341_GAMSET), 0x0001, // Gamma curve selected + ESC_REG(ILI9341_PGAMCTRL), 0x000F, 0x0031, 0x002B, 0x000C, 0x000E, 0x0008, 0x004E, 0x00F1, 0x0037, 0x0007, 0x0010, 0x0003, 0x000E, 0x0009, 0x0000, + ESC_REG(ILI9341_NGAMCTRL), 0x0000, 0x000E, 0x0014, 0x0003, 0x0011, 0x0007, 0x0031, 0x00C1, 0x0048, 0x0008, 0x000F, 0x000C, 0x0031, 0x0036, 0x000F, + + ESC_REG(ILI9341_NORON), + ESC_REG(ILI9341_DISPON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/ili9488.h b/Marlin/src/lcd/tft/ili9488.h new file mode 100644 index 0000000000..135f94a57f --- /dev/null +++ b/Marlin/src/lcd/tft/ili9488.h @@ -0,0 +1,156 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ILI9488_MADCTL_MY 0x80 // Row Address Order +#define ILI9488_MADCTL_MX 0x40 // Column Address Order +#define ILI9488_MADCTL_MV 0x20 // Row/Column Exchange +#define ILI9488_MADCTL_ML 0x10 // Vertical Refresh Order +#define ILI9488_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ILI9488_MADCTL_RGB 0x00 +#define ILI9488_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ILI9488_ORIENTATION_UP ILI9488_MADCTL_MY // 320x480 ; Cable on the upper side +#define ILI9488_ORIENTATION_RIGHT ILI9488_MADCTL_MV // 480x320 ; Cable on the right side +#define ILI9488_ORIENTATION_LEFT ILI9488_MADCTL_MY | ILI9488_MADCTL_MX | ILI9488_MADCTL_MV // 480x320 ; Cable on the left side +#define ILI9488_ORIENTATION_DOWN ILI9488_MADCTL_MX // 320x480 ; Cable on the upper side + +#define ILI9488_COLOR_BGR +#define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT +#define ILI9488_MADCTL_DATA (ILI9488_ORIENTATION | TERN(ILI9488_COLOR_BGR, ILI9488_MADCTL_BGR, ILI9488_MADCTL_RGB)) + +#define ILI9488_NOP 0x00 // No Operation +#define ILI9488_SWRESET 0x01 // Software Reset +#define ILI9488_RDDIDIF 0x04 // Read Display Identification Information +#define ILI9488_RDNUMED 0x05 // Read Number of the Errors on DSI +#define ILI9488_RDDST 0x09 // Read Display Status +#define ILI9488_RDDPM 0x0A // Read Display Power Mode +#define ILI9488_RDDMADCTL 0x0B // Read Display MADCTL +#define ILI9488_RDDCOLMOD 0x0C // Read Display COLMOD +#define ILI9488_RDDIM 0x0D // Read Display Image Mode +#define ILI9488_RDDSM 0x0E // Read Display Signal Mode +#define ILI9488_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ILI9488_SLPIN 0x10 // Sleep IN +#define ILI9488_SLPOUT 0x11 // Sleep OUT +#define ILI9488_PTLON 0x12 // Partial Mode ON +#define ILI9488_NORON 0x13 // Normal Display Mode ON +#define ILI9488_INVOFF 0x20 // Display Inversion OFF +#define ILI9488_INVON 0x21 // Display Inversion ON +#define ILI9488_ALLPOFF 0x22 // All Pixels OFF +#define ILI9488_ALLPON 0x23 // All Pixels ON +#define ILI9488_DISOFF 0x28 // Display OFF +#define ILI9488_DISON 0x29 // Display ON +#define ILI9488_CASET 0x2A // Column Address Set +#define ILI9488_PASET 0x2B // Page Address Set +#define ILI9488_RAMWR 0x2C // Memory Write +#define ILI9488_RAMRD 0x2E // Memory Read +#define ILI9488_PLTAR 0x30 // Partial Area +#define ILI9488_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ILI9488_TEOFF 0x34 // Tearing Effect Line OFF +#define ILI9488_TEON 0x35 // Tearing Effect Line ON +#define ILI9488_MADCTL 0x36 // Memory Access Control +#define ILI9488_VSCRSADD 0x37 // Vertical Scrolling Start Address +#define ILI9488_IDMOFF 0x38 // Idle Mode OFF +#define ILI9488_IDMON 0x39 // Idle Mode ON +#define ILI9488_COLMOD 0x3A // Interface Pixel Format +#define ILI9488_RAMWRC 0x3C // Memory Write Continue +#define ILI9488_RAMRDRC 0x3E // Memory Read Continue +#define ILI9488_TESLWR 0x44 // Write Tear Scan Line +#define ILI9488_TESLRD 0x45 // Read Scan Line +#define ILI9488_WRDISBV 0x51 // Write Display Brightness Value +#define ILI9488_RDDISBV 0x52 // Read Display Brightness Value +#define ILI9488_WRCTRLD 0x53 // Write Control Display Value +#define ILI9488_RDCTRLD 0x54 // Read Control Display Value +#define ILI9488_WRCABC 0x55 // Write Content Adaptive Brightness Control Value +#define ILI9488_RDCABC 0x56 // Read Content Adaptive Brightness Control Value +#define ILI9488_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define ILI9488_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define ILI9488_RDABCSDR 0x68 // Read Automatic Brightness Control Self-diagnostic Result +#define ILI9488_RDID1 0xDA // Read ID1 +#define ILI9488_RDID2 0xDB // Read ID2 +#define ILI9488_RDID3 0xDC // Read ID3 + +#define ILI9488_IFMODE 0xB0 // Interface Mode Control +#define ILI9488_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) +#define ILI9488_FRMCTR2 0xB2 // Frame Rate Control (In Idle Mode/8 Colors) +#define ILI9488_FRMCTR3 0xB3 // Frame Rate Control (In Partial Mode/Full Colors) +#define ILI9488_INVTR 0xB4 // Display Inversion Control +#define ILI9488_PRCTR 0xB5 // Blanking Porch Control +#define ILI9488_DISCTRL 0xB6 // Display Function Control +#define ILI9488_ETMOD 0xB7 // Entry Mode Set +#define ILI9488_CECTRL1 0xB9 // Color Enhancement Control 1 +#define ILI9488_CECTRL2 0xBA // Color Enhancement Control 2 +#define ILI9488_HSLCTRL 0xBE // HS Lanes Control +#define ILI9488_PWCTRL1 0xC0 // Power Control 1 +#define ILI9488_PWCTRL2 0xC1 // Power Control 2 +#define ILI9488_PWCTRL3 0xC2 // Power Control 3 (For Normal Mode) +#define ILI9488_PWCTRL4 0xC3 // Power Control 4 (For Idle Mode) +#define ILI9488_PWCTRL5 0xC4 // Power Control 5 (For Partial Mode) +#define ILI9488_VMCTRL 0xC5 // VCOM Control +#define ILI9488_CABCCTRL1 0xC6 // CABC Control 1 +#define ILI9488_CABCCTRL2 0xC8 // CABC Control 2 +#define ILI9488_CABCCTRL3 0xC9 // CABC Control 3 +#define ILI9488_CABCCTRL4 0xCA // CABC Control 4 +#define ILI9488_CABCCTRL5 0xCB // CABC Control 5 +#define ILI9488_CABCCTRL6 0xCC // CABC Control 6 +#define ILI9488_CABCCTRL7 0xCD // CABC Control 7 +#define ILI9488_CABCCTRL8 0xCE // CABC Control 8 +#define ILI9488_CABCCTRL9 0xCF // CABC Control 9 +#define ILI9488_NVMWR 0xD0 // NV Memory Write +#define ILI9488_NVMPKEY 0xD1 // NV Memory Protection Key +#define ILI9488_RDNVM 0xD2 // NV Memory Status Read +#define ILI9488_RDID4 0xD3 // Read ID4 - 0x009488 +#define ILI9488_ADJCTL1 0xD7 // Adjust Control 1 +#define ILI9488_RDIDV 0xD8 // Read ID Version +#define ILI9488_PGAMCTRL 0xE0 // Positive Gamma Control +#define ILI9488_NGAMCTRL 0xE1 // Negative Gamma Control +#define ILI9488_DGAMCTRL1 0xE2 // Ditigal Gamma Control 1 +#define ILI9488_DGAMCTRL2 0xE3 // Ditigal Gamma Control 2 +#define ILI9488_SETIMAGE 0xE9 // Set Image Function +#define ILI9488_ADJCTL2 0xF2 // Adjust Control 2 +#define ILI9488_ADJCTL3 0xF7 // Adjust Control 3 +#define ILI9488_ADJCTL4 0xF8 // Adjust Control 4 +#define ILI9488_ADJCTL5 0xF9 // Adjust Control 5 +#define ILI9488_RDEXTC 0xFB // Read EXTC command is SPI mode +#define ILI9488_ADJCTL6 0xFC // Adjust Control 6 +#define ILI9488_ADJCTL7 0xFF // Adjust Control 7 + +static const uint16_t ili9488_init[] = { + DATASIZE_8BIT, + ESC_REG(ILI9488_SWRESET), ESC_DELAY(120), + ESC_REG(ILI9488_SLPOUT), ESC_DELAY(20), + + ESC_REG(ILI9488_MADCTL), ILI9488_MADCTL_DATA, + ESC_REG(ILI9488_COLMOD), 0x0055, + + /* Gamma Correction. */ + ESC_REG(ILI9488_PGAMCTRL), 0x0000, 0x0003, 0x0009, 0x0008, 0x0016, 0x000A, 0x003F, 0x0078, 0x004C, 0x0009, 0x000A, 0x0008, 0x0016, 0x001A, 0x000F, + ESC_REG(ILI9488_NGAMCTRL), 0x0000, 0x0016, 0x0019, 0x0003, 0x000F, 0x0005, 0x0032, 0x0045, 0x0046, 0x0004, 0x000E, 0x000D, 0x0035, 0x0037, 0x000F, + + ESC_REG(ILI9488_NORON), + ESC_REG(ILI9488_DISON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/images/back_32x32x4.cpp b/Marlin/src/lcd/tft/images/back_32x32x4.cpp new file mode 100644 index 0000000000..8f5809d5dc --- /dev/null +++ b/Marlin/src/lcd/tft/images/back_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t back_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x6f, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x6e, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x76, 0xef, 0xff, 0xe5, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x6e, 0xff, 0xff, 0xd5, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x76, 0xff, 0xff, 0xff, 0xfe, 0xb8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x85, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, + 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x66, 0x88, 0x88, 0x88, + 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x56, 0x78, 0x88, 0x88, + 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x67, 0x88, 0x88, + 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x56, 0x78, 0x88, + 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0x68, 0x88, + 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, + 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xfc, 0xde, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, + 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xd5, 0x67, 0x77, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0x56, 0x78, + 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xe5, 0x78, 0x87, 0x77, 0x77, 0xae, 0xff, 0xff, 0x95, 0x68, + 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xf5, 0x58, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xf8, 0x57, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xe6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xfc, 0x56, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xd7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0x66, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0x97, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x97, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/background_320x30x16.cpp b/Marlin/src/lcd/tft/images/background_320x30x16.cpp new file mode 100644 index 0000000000..f6eca2d6dd --- /dev/null +++ b/Marlin/src/lcd/tft/images/background_320x30x16.cpp @@ -0,0 +1,60 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint16_t background_320x30x16[9600] = { + 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x20f3, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x20f3, 0x20f2, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, + 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2dfd, 0x2dfd, 0x2dfe, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x1ddd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, + 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2dde, 0x2d5d, 0x2d1c, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x251d, 0x2d1d, 0x2cfc, 0x253c, 0x25bd, 0x25bd, 0x2cfd, 0x24fd, 0x2d1d, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x255d, 0x25fd, 0x251c, 0x24fd, 0x24dd, 0x24fc, 0x24fd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x253d, 0x25bd, 0x253d, 0x24dc, 0x24dc, 0x24dc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, + 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2bbc, 0x25bd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x247c, 0x259c, 0x2b1c, 0x2b1c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x1cfd, 0x253c, 0x233c, 0x22fc, 0x231b, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fb, 0x22dc, 0x22db, 0x22dc, 0x235b, 0x1d5c, 0x1d1c, 0x231c, 0x22fb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, + 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x259d, 0x241c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1d9c, 0x247c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bdc, 0x23fc, 0x1d7d, 0x1cdc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9b, 0x1bbc, 0x1b9b, 0x1bbb, 0x1b9c, 0x1bfb, 0x1d5c, 0x1d3c, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, + 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bbb, 0x23bc, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bdb, 0x1bbb, 0x1c7c, 0x1cfc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1d1c, 0x1c9c, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9b, 0x1c3c, 0x1d5c, 0x1c3b, 0x1b9c, 0x1b9b, 0x1b9b, 0x139b, 0x1b9b, 0x139b, 0x13bb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x1b9b, 0x139b, 0x139b, 0x137b, 0x139b, 0x1b7b, 0x151c, 0x153c, 0x1bbb, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, + 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19db, 0x19da, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x1a3b, 0x153c, 0x1a1b, 0x19da, 0x19db, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19da, 0x1afb, 0x14fb, 0x1a3b, 0x19da, 0x11da, 0x19db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19ba, 0x11da, 0x137b, 0x14db, 0x127a, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11bb, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11db, 0x13fb, 0x14bb, 0x12ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, + 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x133b, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x14db, 0x13bb, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133b, 0x135a, 0x135b, 0x147b, 0x143a, 0x133b, 0x0b5b, 0x135a, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x0b3a, 0x133b, 0x133b, 0x0c5b, 0x0cdb, 0x137a, 0x0b3a, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x133b, 0x133b, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x131a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0bfa, 0x14bb, 0x0bdb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, + 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b7a, 0x0c7b, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c1a, 0x0c5b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0c5a, 0x0c3a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x031a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0af9, 0x0afa, 0x0b5a, 0x0c7b, 0x0c1a, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0979, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0979, 0x0179, 0x0c3b, 0x09b9, 0x0179, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0959, 0x0199, 0x043a, 0x0a79, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0959, 0x0958, 0x0179, 0x0959, 0x01f9, 0x041a, 0x033a, 0x0958, 0x0159, 0x0178, 0x0159, 0x0979, 0x0958, 0x0179, 0x0979, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0179, 0x0159, 0x0158, 0x0959, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0159, 0x0159, 0x0958, 0x0218, 0x0bda, 0x037a, 0x01b9, 0x0159, 0x0158, 0x0158, 0x0178, 0x0138, 0x0158, 0x0158, 0x0158, + 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0159, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0319, 0x02d9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01f9, 0x03f9, 0x01d9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0178, 0x0399, 0x0339, 0x0178, 0x0158, 0x0158, 0x0158, 0x0938, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0178, 0x02b9, 0x03d9, 0x0278, 0x0138, 0x0157, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x01b8, 0x03b9, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0278, 0x0359, 0x0158, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0157, 0x02f8, 0x0359, 0x0157, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0136, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x01d7, 0x0379, 0x0318, 0x0177, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, + 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x03b8, 0x0338, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0399, 0x0358, 0x0318, 0x02f8, 0x02f8, 0x02f7, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, + 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x01b7, 0x01b6, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0257, 0x02f7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x01b6, 0x0318, 0x0277, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0217, 0x0358, 0x0237, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0197, 0x01b6, 0x02d7, 0x0337, 0x01f7, 0x0196, 0x0196, + 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d6, 0x00f5, 0x00f6, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f6, 0x00d5, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00d6, 0x00d6, 0x00f5, 0x00f6, 0x00f6, 0x00f6, 0x00d5, 0x00d5, 0x0156, 0x0337, 0x0155, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, + 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d5, 0x0255, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x02b5, 0x00f4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x0134, 0x02b5, 0x01d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x0134, 0x0255, 0x0275, + 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0153, 0x0253, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0092, 0x01d3, 0x0213, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0112, 0x0253, 0x01d3, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x0172, + 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x0090, 0x00b0, 0x0252, 0x00f1, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0212, 0x0171, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0191, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0252, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d1, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0232, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0130, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0232, 0x00f0, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x01f1, 0x0130, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0070, 0x01b1, 0x01f1, 0x0090, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0151, 0x0212, 0x00f0, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0130, 0x01d2, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x01f2, 0x0170, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x0130, 0x0252, 0x0110, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x00af, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x00af, 0x0212, 0x010f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x00cf, 0x0232, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0191, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x008f, 0x006e, 0x006f, 0x008f, 0x0110, 0x0212, 0x00cf, 0x006f, 0x006e, 0x006e, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x00cf, 0x01f1, 0x0191, 0x006e, 0x008e, 0x006f, 0x006f, 0x006e, 0x006e, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x00cf, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x0170, 0x01f1, 0x00ae, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x01f1, 0x01d1, 0x008e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x01f1, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0190, 0x01d1, 0x00af, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x008e, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x0191, 0x0212, 0x00af, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x0232, 0x008e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x004e, 0x00cf, 0x0212, 0x00af, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x010f, 0x0212, 0x00ef, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x0191, 0x0130, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01d1, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006d, 0x00ef, 0x0212, 0x010f, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004e, 0x006e, 0x006d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x010f, 0x01d1, 0x006e, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x01b1, 0x0170, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x00ae, 0x01f1, 0x0150, 0x004d, 0x004d, 0x004d, 0x004e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp b/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp new file mode 100644 index 0000000000..2308917b13 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include "../../../inc/MarlinConfig.h" + +extern const uint8_t marlin_logo_112x38x1[532] = { + B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, + B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00111111,B11111111, + B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00011000,B00000000,B00011111,B11111111, + B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00001111,B11111111, + B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000111,B11111111, + B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000011,B11111111, + B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000001,B11111111, + B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000,B11111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B01111000,B00111100,B00000011,B11110000,B01111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00111100,B00000111,B11111100,B00111111, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00111100,B00001111,B11111110,B00011111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00111100,B00011111,B11111110,B00001111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00111100,B00111111,B00111111,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00111100,B00111110,B00011111,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B10111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B10111111,B11111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B10111111,B11111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B10111111,B11111100,B00001111,B00000011, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, + B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, + B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, + B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, + B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp new file mode 100644 index 0000000000..454e964028 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp @@ -0,0 +1,89 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint16_t marlin_logo_195x59x16[11505] = { + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x20ab, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, + 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xc53a, 0xc67c, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, + 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xbe3b, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xbe3b, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, + 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, + 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, + 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, + 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, + 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, + 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, + 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, + 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, + 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, + 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, + 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, + 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, + 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, + 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, + 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, + 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, + 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, + 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, + 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, + 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, + 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, + 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, + 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, + 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, + 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, + 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, + 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, + 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, + 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, + 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, + 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, + 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, + 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, + 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, + 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xec6f, 0xa8f1, 0xa8f1, 0xa8f1, + 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xec8e, 0xa911, 0xa911, 0xa911, + 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe42e, 0xa111, 0xa911, 0xa911, + 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc2b0, 0xa111, 0xa111, 0x80f0, + 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe2d, 0xa112, 0xa111, 0xa111, 0x60ef, + 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xcbcf, 0xa111, 0xa111, 0xa111, 0x28cd, + 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0xa171, 0xa111, 0x9911, 0x8110, 0x18ad, + 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe2d, 0xaa31, 0x9931, 0x9931, 0x9931, 0x38ce, 0x20ac, + 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfe8c, 0xfe8c, 0xf62d, 0xb270, 0x9931, 0x9931, 0x9912, 0x60ef, 0x20ac, 0x20ad, + 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe8c, 0xf5cd, 0xaa31, 0x9911, 0x9931, 0x9931, 0x8110, 0x28ad, 0x20ac, 0x18ac, + 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xcbcf, 0xa171, 0x9931, 0x9931, 0x9931, 0x9111, 0x28ad, 0x18ac, 0x20ac, 0x20ac, + 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x8111, 0x28cd, 0x20ac, 0x18ac, 0x18ac, 0x18ac, + 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9911, 0x610f, 0x28cc, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, + 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7910, 0x40ce, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, + 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9932, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x7910, 0x58cf, 0x30cc, 0x18ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp b/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp new file mode 100644 index 0000000000..452f472469 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp @@ -0,0 +1,285 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t marlin_logo_228x255x2[14535] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x90, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x02, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x2f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x01, 0xff, 0xff, 0xf9, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0xff, 0xff, 0x80, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xf8, 0x00, 0x6f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xaa, 0x50, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x07, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xf9, 0xbd, 0x00, 0xbf, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xbf, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x46, 0xff, 0xff, 0xd0, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x2f, 0xff, 0xf8, 0x06, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0x1f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xc2, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf0, 0x2f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xfc, 0x07, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x55, 0x55, 0x56, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x40, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0xff, 0xff, 0xfd, 0xbf, 0xc0, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6f, 0xff, 0xff, 0xdf, 0xe0, 0x0b, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xf7, 0xf8, 0x02, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfd, 0xfd, 0x00, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x7f, 0x00, 0x1f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdf, 0x80, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf7, 0xd0, 0x01, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0xf0, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xed, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xbf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x87, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf9, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0x40, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x2f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0b, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0xaa, 0xa9, 0x55, 0x55, 0x40, 0x55, 0x56, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xd0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5a, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x90, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0xbf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x07, 0xff, 0xfd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x01, 0xff, 0xff, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xe0, 0x2f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xfe, 0x0b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0xbf, 0xff, 0xd0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xd0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x2f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x02, 0xf8, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x80, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x40, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xd0, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x40, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x05, 0xab, 0xff, 0xe4, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfd, 0x6b, 0xff, 0xff, 0xe4, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x02, 0xff, 0xff, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe0, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xbf, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xbf, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfd, 0x00, 0x06, 0xff, 0xff, 0xaa, 0xa5, 0x40, 0x00, 0x05, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfc, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xd0, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfd, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6a, 0x81, 0x6a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xd1, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x69, 0x55, 0x00, 0x00, 0x02, 0xff, 0x80, 0x03, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xd0, 0xbf, 0xf8, 0x00, 0x00, 0x16, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, 0x01, 0xff, 0xc0, 0x02, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0b, 0xff, 0xc0, 0x3f, 0xfc, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xff, 0xd0, 0x02, 0xf4, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xfe, 0x40, 0x0f, 0xff, 0x80, 0x3f, 0xfd, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xf4, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xbe, 0x90, 0x00, 0x2f, 0xff, 0x80, 0x7f, 0xfd, 0x0a, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0xf8, 0x00, 0x00, 0x0b, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x78, 0x00, 0x00, 0x0b, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3c, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfd, 0x02, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x3c, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xfc, 0x00, 0x2c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x6f, 0xff, 0xfc, 0x07, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfd, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x05, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xfe, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x08, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, + 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, + 0x00, 0x7f, 0xfe, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x6a, 0xaa, 0xaa, 0xab, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x55, 0x55, 0x5a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, + 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, + 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf0, 0x00, + 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0x2f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0xbf, 0x00, 0x00, 0x00, 0x00, 0x06, 0xaa, 0x90, 0x00, 0x00, 0x01, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xfe, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x0b, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x05, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, + 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xc0, 0x00, 0x01, 0xff, 0xe4, 0x00, + 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xed, 0x00, + 0xfc, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xdf, 0x00, + 0xfc, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xea, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xdf, 0x80, + 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x01, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xc0, + 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xd0, 0x00, 0x07, 0xff, 0xff, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xd0, + 0xfc, 0x00, 0x00, 0xbf, 0xff, 0x40, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xf0, + 0xfc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x2f, 0xff, 0xc0, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x06, 0xaa, 0xa0, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xbf, 0xf0, + 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xf8, 0x02, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xbf, 0x54, + 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x7f, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x3f, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x3e, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xf8, 0x00, 0x7f, 0xe0, 0x00, 0x01, 0xfe, 0x3e, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xf8, 0x00, 0x2f, 0xf0, 0x00, 0x01, 0xfe, 0x7d, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x3f, 0xff, 0xfe, 0x40, 0x7f, 0xff, 0xfd, 0x00, 0x00, 0xbf, 0xff, 0xf4, 0x07, 0xff, 0xff, 0x82, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xfe, 0x01, 0xbf, 0xff, 0xf0, 0x03, 0xff, 0xf8, 0x00, 0x2f, 0xf0, 0x00, 0x01, 0xfd, 0x7d, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x7f, 0xff, 0xf4, 0x00, 0x0b, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0xbf, 0xff, 0xc2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xf4, 0x00, 0xbf, 0xf8, 0x00, 0x2f, 0xf4, 0x00, 0x01, 0xfc, 0x7c, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xbf, 0xff, 0xc0, 0x00, 0x02, 0xff, 0xff, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xc2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x0b, 0xff, 0xf8, 0x00, 0x3f, 0xf8, 0x00, 0x1f, 0xf8, 0x00, 0x01, 0xfc, 0x3c, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbf, 0xff, 0x40, 0x01, 0xff, 0xfd, 0x00, 0x00, 0x1f, 0xff, 0xd2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x0f, 0xf8, 0x00, 0x07, 0xfc, 0x00, 0x02, 0xfc, 0x3e, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe1, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xd2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xf8, 0x00, 0x02, 0xfc, 0x00, 0x02, 0xf8, 0x1f, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0xfe, 0x00, 0x02, 0xf4, 0x0b, 0x80, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x7f, 0x00, 0x03, 0xf4, 0x03, 0xc0, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0xe0, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x0b, 0xc0, 0x03, 0xf0, 0x00, 0x34, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x02, 0xe0, 0x03, 0xe0, 0x00, 0x0c, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x74, 0x07, 0xd0, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x08, 0x07, 0xc0, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xff, 0xff, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc0, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xbf, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfd, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x80, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x7f, 0xff, 0xfd, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x40, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x40, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xfa, 0xa8, 0x1f, 0xff, 0xea, 0xab, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x0b, 0xff, 0xf5, 0x55, 0xbf, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x02, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xfd, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x01, 0xbf, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xf0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x6a, 0xa9, 0x00, 0x00, 0x00, 0x2a, 0xaa, 0x40, 0x00, 0x00, 0x0a, 0xaa, 0x90, 0x00, 0x00, 0x06, 0xaa, 0xa8, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0x46, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x02, 0xaa, 0xa0, 0x00, 0x0b, 0xf2, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xbf, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xd3, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc7, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x47, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0b, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x07, 0xd0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0xbf, 0xfa, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x56, 0xff, 0xe0, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x1f, 0x40, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab, 0xff, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0xa5, 0x55, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfa, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xd0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xea, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfd, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x03, 0xff, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x02, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x01, 0xff, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xbf, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xbf, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x3f, 0xfe, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf4, 0x0f, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x0f, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x0b, 0xff, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x0b, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcb, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xd7, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xf7, 0xff, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp b/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp new file mode 100644 index 0000000000..c84653f8a5 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp @@ -0,0 +1,285 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t marlin_logo_228x255x4[29070] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xd8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xdf, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x84, 0x32, 0x10, 0x00, 0x46, 0x89, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x28, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x10, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x38, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x22, 0x11, 0x11, 0x12, 0x35, 0x57, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x4b, 0xef, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xef, 0xff, 0xff, 0xff, 0xed, 0xba, 0x98, 0x64, 0x00, 0x05, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xc5, 0x00, 0x01, 0x6c, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x30, 0x37, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x9f, 0xe7, 0x10, 0x01, 0x8d, 0xff, 0xfd, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x23, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x10, 0x01, 0x8e, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x60, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x0e, 0xff, 0xff, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x39, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x7b, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x88, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x19, 0xff, 0xff, 0xfe, 0x37, 0xdf, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x3c, 0xff, 0xff, 0xe3, 0x08, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x7f, 0xff, 0xfe, 0x30, 0x3a, 0xff, 0xf8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xdf, 0xff, 0xe3, 0x00, 0x7f, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x76, 0x54, 0x44, 0x44, 0x55, 0x66, 0x68, 0x89, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2a, 0xff, 0xff, 0x50, 0x03, 0xdf, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x58, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xe0, 0x00, 0x1b, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0xff, 0xf9, 0x00, 0x00, 0x8f, 0xff, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x6e, 0xff, 0x80, 0x00, 0x08, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xf6, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0x5c, 0xff, 0x20, 0x00, 0x04, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xff, 0xf4, 0xdf, 0xb0, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xfe, 0x4f, 0xf7, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xeb, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xe6, 0xff, 0x30, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xfd, 0x6f, 0xd0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xca, 0xf5, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9a, 0xce, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2f, 0x80, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0x89, 0x91, 0x7f, 0xe7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf2, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xef, 0xfe, 0xb7, 0x18, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8e, 0xff, 0xea, 0x51, 0x01, 0x8b, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x40, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8e, 0xff, 0xe8, 0x20, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xcf, 0xff, 0xfa, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xdf, 0xff, 0xfd, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8c, 0xff, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x47, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xa0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x68, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x8b, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0xdb, 0xaa, 0x98, 0x88, 0x87, 0x66, 0x55, 0x54, 0x44, 0x43, 0x33, 0x44, 0x55, 0x67, 0x78, 0x89, 0xbc, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xd8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x89, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x56, 0x88, 0x9b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x35, 0x68, 0x8b, 0xbd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x56, 0x78, 0x9b, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x68, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x08, 0xff, 0xff, 0xf9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x8f, 0xfe, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x38, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xb1, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xfd, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8f, 0xff, 0xf7, 0x00, 0x00, 0x13, 0x57, 0x8a, 0xbc, 0xde, 0xff, 0xeb, 0x50, 0x6d, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xc4, 0x58, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xca, 0x63, 0x00, 0x00, 0x00, 0x8f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x08, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xff, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0xdf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x90, 0x00, 0x00, 0x00, 0xbf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x01, 0x7b, 0xce, 0xee, 0xee, 0xdd, 0xba, 0x98, 0x88, 0x65, 0x43, 0x32, 0x21, 0x12, 0x33, 0x57, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x8f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xe7, 0x10, 0x00, 0x00, 0x2a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x8f, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xe7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x8b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x78, 0x88, 0x82, 0x04, 0x78, 0x98, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0x20, 0x00, 0x00, 0x4f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xfb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x09, 0xff, 0xff, 0xf7, 0x07, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x35, 0x77, 0x78, 0x87, 0x65, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0d, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xfe, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x4f, 0xff, 0xff, 0xf5, 0x00, 0x8f, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x78, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x98, 0x52, 0x00, 0x06, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x08, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xef, 0xff, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x71, 0x00, 0xaf, 0xff, 0xff, 0xe1, 0x00, 0x2f, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x37, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x65, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x08, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xf9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, 0x00, 0x02, 0xef, 0xff, 0xff, 0xb0, 0x00, 0x3f, 0xff, 0xff, 0xf5, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x05, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x89, 0xbc, 0xca, 0x84, 0x10, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xf4, 0x01, 0x89, 0xab, 0xbc, 0xde, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0x40, 0x00, 0x9f, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x35, 0x68, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0xdf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0xdf, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x6f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfa, 0x00, 0x03, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x58, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x1f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xf6, 0x00, 0x08, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x0b, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x08, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x23, 0x55, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x5f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xdd, 0xdd, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xdd, 0xcc, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfb, 0xa9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa8, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, + 0x00, 0x06, 0xef, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, + 0x00, 0x6e, 0xff, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, + 0x03, 0xef, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, + 0x0b, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, + 0x5f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, + 0xaf, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x9b, 0xba, 0x85, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x89, 0xba, 0xa9, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x48, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xae, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, + 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, + 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x01, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x01, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x02, 0x8d, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf9, 0x50, 0x00, 0x00, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x04, 0xce, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf8, 0xd6, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x8e, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf7, 0xfe, 0x20, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf7, 0xff, 0x80, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x31, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x35, 0x55, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf8, 0xff, 0xe0, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x05, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfa, 0xff, 0xf6, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x35, 0x44, 0x20, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x9f, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xda, 0xff, 0xfd, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xfd, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0xef, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xc8, 0x20, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x68, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4a, 0xef, 0xff, 0xff, 0xff, 0xa6, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x5f, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xad, 0xff, 0xff, 0x20, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x09, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0x8d, 0xff, 0x47, 0x60, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x5f, 0xfe, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x01, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x3f, 0xfc, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0xef, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xfe, 0x3f, 0xf9, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x5f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xfb, 0x3f, 0xf8, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x0a, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf8, 0x4f, 0xf5, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x43, 0x23, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x73, 0x32, 0x7d, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x33, 0x35, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x08, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf5, 0x4f, 0xf4, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0xbf, 0xff, 0xff, 0x90, 0x00, 0x00, 0x09, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf2, 0x4f, 0xf2, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xf2, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x0c, 0xff, 0xff, 0x90, 0x00, 0x00, 0x07, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x1f, 0xf3, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf4, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x01, 0xdf, 0xff, 0x90, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x08, 0xff, 0xc0, 0x0d, 0xf8, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf7, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x90, 0x04, 0xfe, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x08, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xf9, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x60, 0x00, 0x9f, 0x80, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x09, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfe, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x50, 0x00, 0x0c, 0xe2, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0a, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0x10, 0x00, 0x01, 0xda, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf2, 0x00, 0x00, 0x2f, 0xfc, 0x00, 0x00, 0x00, 0x3e, 0x50, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfb, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xd2, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x08, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x50, 0x00, 0x5f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x11, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x06, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x7f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xba, 0xa9, 0x80, 0x06, 0xff, 0xff, 0xff, 0xf9, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xf9, 0x84, 0x10, 0x9f, 0xff, 0xff, 0xfe, 0x66, 0x66, 0x66, 0xaf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf1, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf1, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x30, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x69, 0xaa, 0xaa, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xaa, 0xaa, 0xaa, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x89, 0x9a, 0xaa, 0x90, 0x03, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x78, 0xaa, 0x60, 0x6a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xaa, 0xaa, 0xa8, 0x30, 0x00, 0x00, 0x00, 0xbf, 0xfc, 0x08, 0xef, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf6, 0x3f, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xd1, 0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0x60, 0x6f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbf, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xf8, 0x00, 0x6f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0a, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0x90, 0x00, 0x6f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9f, 0xff, 0xfd, 0x88, 0x64, 0x44, 0x33, 0x22, 0x22, 0x21, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, 0x12, 0x22, 0x22, 0x33, 0x45, 0x56, 0x79, 0xef, 0xff, 0xf8, 0x10, 0x00, 0x6f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x00, 0x00, 0x7f, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x8f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xbd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, 0x00, 0x00, 0x00, 0x04, 0xef, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x78, 0x88, 0x89, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xec, 0xca, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x9a, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb9, 0x86, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x56, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xff, 0xff, 0xff, 0xff, 0xca, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xfb, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8c, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xd8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xb4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xfe, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xe9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xea, 0x98, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf2, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x08, 0xff, 0xff, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x05, 0xff, 0xff, 0xff, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x03, 0xff, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x60, 0x01, 0xff, 0xff, 0xff, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0xdf, 0xff, 0xff, 0xf2, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xfa, 0x00, 0xbf, 0xff, 0xff, 0xf7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8f, 0xff, 0xff, 0xfa, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfe, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xfe, 0x6f, 0xff, 0xff, 0xff, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xf5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xfe, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfe, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfa, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp new file mode 100644 index 0000000000..199433a802 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp @@ -0,0 +1,270 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint16_t marlin_logo_320x240x16[76800] = { + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x28ee, 0x8252, 0xcb54, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x394f, 0xb313, 0xd395, 0x7211, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x496f, 0xcb55, 0xd395, 0xbb54, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00fa, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x61d0, 0xd395, 0xd395, 0xd395, 0x69f1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x61d0, 0xd395, 0xd395, 0xd396, 0xd375, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ce, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10f2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8252, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x5190, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x412f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0355, 0x190f, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f4, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x496f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x11d1, 0x03b7, 0x0a93, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x28ee, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9ab3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x00f9, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x10af, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x7a31, 0xd395, 0xd395, 0xd375, 0xdb95, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11d1, 0x03b8, 0x03b7, 0x03b8, 0x0a94, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x00f9, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xd395, 0xb313, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x190e, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0xa2d3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xa2d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a94, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x61d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0397, 0x03b8, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x59d0, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x011a, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x61b1, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8a92, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x188d, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0xaad3, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03d7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0x7231, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x08d3, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x20ae, 0x8a92, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x7a31, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x28ee, 0xc374, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xa2d3, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ce, 0x194f, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x61d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x69f1, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x02f5, 0x03b7, 0x03b8, 0x0356, 0x114f, 0x18ad, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x9ab3, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x190f, 0x0377, 0x0397, 0x03b8, 0x0398, 0x0397, 0x0b77, 0x18ce, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0bb7, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x4970, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x1253, 0x0b78, 0x0b98, 0x0b78, 0x0b98, 0x0b98, 0x1378, 0x11f2, 0x18ad, 0x18ad, 0x0b98, 0x0b78, 0x0b78, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0b98, 0x1378, 0x0b78, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x4970, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0x8252, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1ab5, 0x1b78, 0x1b58, 0x1358, 0x1b78, 0x1378, 0x1358, 0x1a13, 0x18ae, 0x18ae, 0x1358, 0x1358, 0x1378, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1358, 0x1358, 0x1358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd395, 0xc354, 0x5990, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1a54, 0x1b38, 0x1b38, 0x2338, 0x1b38, 0x1b58, 0x2338, 0x21d2, 0x18ad, 0x18ad, 0x2338, 0x2338, 0x2358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x2339, 0x2358, 0x2338, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xa2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x2150, 0x2b18, 0x2b39, 0x2b18, 0x2b19, 0x2b19, 0x2af8, 0x18ce, 0x18ad, 0x18ad, 0x2b19, 0x2b18, 0x2b19, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x2192, 0x2b19, 0x2b19, 0x2b18, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xbb34, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2192, 0x2b19, 0x3319, 0x32f9, 0x2a15, 0x18ef, 0x20ad, 0x18ad, 0x18ad, 0x32f9, 0x3319, 0x32f9, 0x18ad, 0x18ad, 0x18ad, 0x2191, 0x3319, 0x2af9, 0x3319, 0x2af9, 0x2a97, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, + 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x3ad9, 0x3ad9, 0x3ad9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x3af9, 0x3ad9, 0x3ad9, 0x18ad, 0x20ad, 0x3215, 0x3ad9, 0x3af9, 0x3ada, 0x3ad9, 0x3277, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x4950, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xaab3, 0x20ce, 0x18ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x03b7, 0x0397, + 0x18ad, 0x18ad, 0x08f5, 0x0139, 0x011a, 0x0117, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x42d9, 0x42b9, 0x42b9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x42b9, 0x42b9, 0x42ba, 0x18ae, 0x31f5, 0x42da, 0x42d9, 0x42b9, 0x42d9, 0x3a77, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x5991, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xd355, 0x9252, 0x30ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, + 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x4ab9, 0x4a9a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4aba, 0x4aba, 0x4a9a, 0x4257, 0x4a99, 0x4a9a, 0x4a9a, 0x4aba, 0x4237, 0x20ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x69f1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xcb14, 0x4130, 0x20af, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x42b9, 0x4a99, 0x42b9, 0x42ba, 0x18ad, 0x18ad, + 0x18ad, 0x18af, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x527a, 0x527a, 0x527a, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x527a, 0x527a, 0x529a, 0x527a, 0x527a, 0x527a, 0x527a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18d2, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x8253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0x7a11, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x621a, 0x6a3b, 0x6a3b, + 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x20ae, 0x08f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x5a5b, 0x5a5a, 0x5a7a, 0x2910, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x5a5a, 0x5a7b, 0x5a5a, 0x5a5a, 0x5a5a, 0x5a5a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x091a, 0x18f2, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x8232, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xa293, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x89bc, 0x89bc, 0x91bc, 0x89bc, 0x899c, + 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x623a, 0x623b, 0x625a, 0x621a, 0x2910, 0x18cd, 0x18ad, 0x18ad, 0x623b, 0x623a, 0x625a, 0x623b, 0x623b, 0x51f8, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x0917, 0x18d2, 0x18d2, 0x0918, 0x091a, 0x0918, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30d0, 0x30f0, 0x30f0, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0x9253, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0xa93d, + 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x59d8, 0x6a1b, 0x6a1b, 0x6a1b, 0x6a1b, 0x4133, 0x18ad, 0x18ad, 0x6a3b, 0x6a1b, 0x6a1b, 0x6a1b, 0x51b6, 0x20cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d3, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18d1, 0x20ce, 0x20ce, 0x18d1, 0x093a, 0x093a, 0x28ef, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x9273, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0xd335, 0xd334, 0xd334, 0xd314, 0xd315, 0xaa93, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ce, 0x61b8, 0x721b, 0x71fb, 0x721b, 0x721b, 0x4133, 0x20ad, 0x71fb, 0x721b, 0x71fb, 0x4174, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x011a, 0x18d1, 0x20ae, 0x20ce, 0x20f1, 0x093a, 0x093a, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0xaaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ae, 0x20ad, 0x20ad, 0x20ae, 0x30ee, 0x6150, 0x81b1, 0xa1f2, 0xc233, 0xca53, 0xca54, 0xca53, 0xc233, 0xa1f2, 0x8191, 0x512f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ce, 0x69b9, 0x81fb, 0x79db, 0x79dc, 0x81fc, 0x5976, 0x79db, 0x79dc, 0x81dc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0918, 0x0119, 0x0917, 0x18d0, 0x20d0, 0x0917, 0x093a, 0x1138, 0x28cf, 0x30cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0xaad4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd315, 0xd314, 0x69b2, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x410f, 0x6990, 0x99f2, 0xc253, 0xca74, 0xd274, 0xca74, 0xd253, 0xca53, 0xca53, 0xca53, 0xd233, 0xd253, 0xca53, 0xd233, 0xca33, 0xc213, 0x8991, 0x410f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x7199, 0x89db, 0x89bc, 0x81bc, 0x89bc, 0x89bc, 0x89bc, 0x89bc, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d2, 0x0119, 0x0119, 0x093a, 0x093a, 0x093a, 0x093a, 0x20f2, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xcad4, 0x5971, 0x30f0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x38ef, 0x79b1, 0xba53, 0xca94, 0xca94, 0xca74, 0xd273, 0xd273, 0xca73, 0xca54, 0xca53, 0xca54, 0xca53, 0xca33, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xd213, 0xca13, 0xca13, 0xa1b2, 0x490f, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x7979, 0x919c, 0x919c, 0x91bc, 0x919c, 0x899c, 0x89bc, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x18f2, 0x0919, 0x091a, 0x091a, 0x0919, 0x20f3, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x4112, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd314, 0xd2f5, 0xd2f4, 0xd2f4, 0x4930, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x4130, 0x89f1, 0xd294, 0xd294, 0xca93, 0xca74, 0xd274, 0xca74, 0xca74, 0xca53, 0xca73, 0xd253, 0xd254, 0xca53, 0xca53, 0xca54, 0xc274, 0x9b36, 0x83b8, 0x6419, 0x6c39, 0x6439, 0x6c1a, 0x8b57, 0xb295, 0xca13, 0x9191, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x28ae, 0x8159, 0x917c, 0x997c, 0x997c, 0x999c, 0x999c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20d0, 0x20d1, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd2f4, 0xd2f4, 0xd315, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d5, 0x79d2, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28ef, 0x28f0, 0x28cf, 0x5150, 0xaa32, 0xd293, 0xd294, 0xd294, 0xca93, 0xca74, 0xca74, 0xca74, 0xca74, 0xd274, 0xd254, 0xca53, 0xca54, 0xb2d5, 0x83b8, 0x44fc, 0x1dbe, 0x063f, 0x0cdb, 0x0b76, 0x1377, 0x1377, 0x0b76, 0x1356, 0x0b76, 0x0b77, 0x23f8, 0x6991, 0x510f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x8939, 0xa17c, 0xa17c, 0xa15d, 0xa15d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8a54, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0x5951, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x4130, 0x91f2, 0xd294, 0xd294, 0xca94, 0xca74, 0xca94, 0xca94, 0xca74, 0xd274, 0xd274, 0xd274, 0xd253, 0xb2d5, 0x7419, 0x257d, 0x063f, 0x061f, 0x057d, 0x12b5, 0x190f, 0x18ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x913a, 0xa93d, 0xa95d, 0xa95c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xcab4, 0x5172, 0x3911, 0x38f1, 0x38f0, 0x30f0, 0x81d2, 0xc294, 0xd294, 0xd293, 0xd294, 0xd294, 0xca93, 0xca93, 0xd274, 0xd274, 0xca73, 0xd274, 0x83d8, 0x353d, 0x061f, 0x063f, 0x063f, 0x063f, 0x4c5a, 0x4970, 0x20ae, 0x20ae, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xb11d, 0xb11d, 0xb11d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6b36, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xcad4, 0xcab4, 0x5972, 0x3911, 0x5151, 0xb253, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xd274, 0xc294, 0x645a, 0x1dbe, 0x063f, 0x063f, 0x063f, 0x1dbe, 0x6459, 0xc274, 0x99d2, 0x28ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0xb8fe, 0xb8fd, 0xb8fe, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253b, 0x465c, 0x6d7b, 0x6d9a, 0x6d9a, 0x6d7a, 0x84f9, 0x9c78, 0x9c77, 0x9c78, 0x9c78, 0x9c57, 0x9c78, 0x9c58, 0x9c58, 0xbbb6, 0xd334, 0xd315, 0xd334, 0xd315, 0xd314, 0xd315, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xcad4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2d4, 0x91f3, 0x5972, 0xca74, 0xd2b4, 0xd2b4, 0xd294, 0xca94, 0xd294, 0xd294, 0xca94, 0xca74, 0xc2b4, 0x6c5a, 0x0dff, 0x063f, 0x063f, 0x063f, 0x353d, 0x83b8, 0xca53, 0xca33, 0x89b1, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0xc0de, 0xc0fe, 0xc0dd, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00fa, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x38f1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4d1a, 0x6d9a, 0x94b9, 0x9c98, 0x9c77, 0x9c78, 0x9c78, 0x9c78, 0x94b8, 0x6d7a, 0x6d7a, 0x6d7b, 0x367c, 0x367d, 0x1efe, 0x077f, 0x075f, 0x1ede, 0x363d, 0x6d3a, 0x9c17, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xcad4, 0xd2b3, 0xcab4, 0xc294, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca74, 0xca74, 0xca74, 0x7bd8, 0x0dff, 0x063f, 0x061f, 0x063f, 0x4cbb, 0x9b57, 0xd233, 0xca33, 0xca53, 0x6150, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8be, 0xc8de, 0xc8be, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xa2b5, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xbb96, 0xa437, 0x74f9, 0x4dbc, 0x2e7e, 0x0edf, 0x559b, 0x8498, 0xc335, 0xd2f4, 0xd2d4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2b5, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xbab4, 0xbaf6, 0xca94, 0xd294, 0xca94, 0xd273, 0x9b76, 0x1dbe, 0x061f, 0x063f, 0x0ddf, 0x643a, 0xb2d5, 0xca54, 0xd253, 0xca53, 0xc294, 0x59b1, 0x28ce, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x40b0, 0xa09a, 0xd0be, 0xd09e, 0xd0be, 0xb89c, 0x78b5, 0x28ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd335, 0xd315, 0xd314, 0xd315, 0xd2f5, 0xd2f5, 0xd2f4, 0x9bf7, 0x6d1a, 0x2e3d, 0x45bc, 0x9418, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xc2d4, 0x4cdb, 0x7bd8, 0x9b57, 0x44fc, 0x063f, 0x063f, 0x1dbe, 0x83d8, 0xc294, 0xca53, 0xca54, 0xca33, 0xca53, 0xb2b5, 0x33b8, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188e, 0x20cd, 0x10d1, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x40b0, 0xd07d, 0xd87e, 0xd89f, 0xd89f, 0xe07f, 0xd89e, 0xd89f, 0xb87b, 0x28ae, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xbb14, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd314, 0xd335, 0xd315, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xc335, 0x8478, 0x4d7b, 0x4d5b, 0xab96, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xca94, 0xcab4, 0xd294, 0xd294, 0xd273, 0xc2b4, 0x5c9a, 0x061f, 0x061f, 0x063f, 0x7419, 0xd273, 0xd273, 0xca53, 0xca53, 0xd233, 0xca53, 0xaaf6, 0x153c, 0x2951, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x10b0, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb07a, 0xe85f, 0xe85f, 0xe07f, 0xe85f, 0xe87f, 0xe07f, 0xe85f, 0xe07f, 0x9898, 0x20ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd315, 0xcb34, 0xd315, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xd2d4, 0xbb55, 0x7499, 0x35dc, 0x8439, 0xc2f4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xca93, 0xd294, 0xd274, 0xca74, 0x9b76, 0x061f, 0x061f, 0x83d8, 0xc295, 0xca53, 0xca53, 0xca53, 0xca53, 0x7bb8, 0x063f, 0x2a34, 0x30f0, 0x30f0, 0x30ef, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x38b0, 0xf05f, 0xe83f, 0xf03f, 0xf05f, 0xf05f, 0xf03f, 0xf03f, 0xf03f, 0xf05f, 0xe83f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xbb35, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xcad4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2d4, 0xcab4, 0xd2b4, 0xcab4, 0xcab4, 0x8bf8, 0x3d5c, 0x6499, 0xc2d4, 0xd294, 0xd294, 0xca74, 0xca74, 0xd274, 0xca74, 0xca74, 0x54bb, 0x5c9a, 0x353d, 0x1dbe, 0x4cbb, 0x9377, 0x9b36, 0x44fc, 0x061f, 0x1bf9, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f4, 0x10f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x5092, 0xf83f, 0xf83f, 0xf03f, 0xf83f, 0xf83f, 0xf83f, 0xf83f, 0xf81f, 0xf03f, 0xf83f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69b3, 0xc355, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd2f5, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0x9b97, 0x453c, 0x6c59, 0xc2b4, 0xca74, 0xd274, 0xd273, 0xca73, 0xd273, 0xc294, 0x6c39, 0xc294, 0xca53, 0x8b98, 0x4cbb, 0x0dff, 0x063f, 0x0d7e, 0x3972, 0x3911, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x5092, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0x9b77, 0x44dc, 0x73f9, 0xca73, 0xca74, 0xd254, 0xca73, 0xca53, 0xc294, 0x351c, 0x6c3a, 0xc294, 0xd253, 0xca34, 0x83b8, 0x5a55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4090, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x28af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69d3, 0xc355, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xcb55, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcad4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xcab4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0xd274, 0xca74, 0x8b78, 0x447c, 0xa316, 0xd253, 0xd253, 0xca54, 0xca53, 0xc294, 0x257d, 0x0ddf, 0x83b8, 0xd233, 0xca33, 0xca33, 0xba13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x30d0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x00f9, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0xd03c, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xd03c, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xaad4, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd2b4, 0xca94, 0xca94, 0xd294, 0xca74, 0xca73, 0xca74, 0xd274, 0xc295, 0x6bb9, 0x6b99, 0xca54, 0xca53, 0xd254, 0xca33, 0xc294, 0x24fd, 0x063f, 0x351d, 0xb295, 0xca13, 0xca13, 0xca13, 0xb9f3, 0x7992, 0x4111, 0x4112, 0x38f1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x4090, 0xf03f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x6073, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xcb55, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd314, 0xd335, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca74, 0xca74, 0xca74, 0xca73, 0xca73, 0xca53, 0xca53, 0xca74, 0xaab6, 0x5b7a, 0xba74, 0xca53, 0xca33, 0xca33, 0xc254, 0x4bfb, 0x059f, 0x0d7f, 0x8b57, 0xc9f3, 0xca13, 0xc9f3, 0xc9f3, 0xa9b3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4091, 0xe01d, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x7074, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ae, 0x18cd, 0x20ae, 0x20cd, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xb2f4, 0xd395, 0xdb95, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0x84f9, 0x467d, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x1f1e, 0x367d, 0x367c, 0x4ddb, 0x653a, 0x8498, 0x9bf7, 0xc2f5, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca73, 0xd253, 0xd254, 0xca74, 0xca53, 0xca53, 0xca53, 0xd253, 0x72d9, 0xaa76, 0xca33, 0xd233, 0xca13, 0xca33, 0x1c7e, 0x059f, 0x05ff, 0x5c7a, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10b0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x7074, 0x9077, 0x8856, 0x8876, 0x388f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x3911, 0x4111, 0x4132, 0x6193, 0xc355, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x271d, 0x07ff, 0x07ff, 0x07bf, 0x079f, 0x079f, 0x077f, 0x079f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x079f, 0x1efe, 0x461c, 0x6d1a, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca73, 0xd274, 0xca74, 0xca53, 0xd254, 0xca54, 0xd253, 0xca53, 0xca33, 0xa275, 0x9a76, 0xca33, 0xca13, 0xca33, 0x9ad6, 0x04ff, 0x05bf, 0x063f, 0x357c, 0xc254, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ae, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x0117, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xcb55, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xcb55, 0xd334, 0xcb55, 0xac17, 0x0fbf, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x365c, 0x74b9, 0xb315, 0xca73, 0xca54, 0xca54, 0xca53, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xb235, 0xaa16, 0xca33, 0xca13, 0xca13, 0x7b37, 0x055f, 0x05ff, 0x067f, 0x25dd, 0xa2f5, 0xd1d3, 0xc9f3, 0xc9d3, 0xc9d2, 0xc9d3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ce, 0x20ad, 0x10f4, 0x011a, 0x0119, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61b3, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0x8cb8, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06df, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x071f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x071f, 0x2dfd, 0x7419, 0xb2b5, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0xd233, 0xca14, 0xa215, 0xca13, 0xca13, 0xc9f3, 0x8338, 0x05bf, 0x063f, 0x06bf, 0x0e9f, 0xaad5, 0xc9d3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b2, 0xb1b2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18cf, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x20ae, 0x18d0, 0x0119, 0x0119, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3111, 0x38f1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xc395, 0x5dfa, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06bf, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x06ff, 0x06bf, 0x065f, 0x05bf, 0x443c, 0x8af7, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca13, 0x99b6, 0xc9f3, 0xca13, 0xc9f3, 0x4c3b, 0x061f, 0x069f, 0x06ff, 0x0ebe, 0xa2d5, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9b2, 0xc1b3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x20ae, 0x20ad, 0x18ce, 0x0119, 0x0119, 0x10d3, 0x20ce, 0x20ae, 0x10f4, 0x0119, 0x011a, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067f, 0x067f, 0x067f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x065f, 0x065f, 0x067f, 0x067f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x065f, 0x05ff, 0x053f, 0x049f, 0x1bbe, 0x8298, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0xd1f3, 0x99b6, 0xc9f3, 0xc9f3, 0xb254, 0x0d9f, 0x067f, 0x06df, 0x06ff, 0x0ebf, 0xa2d5, 0xc9d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011a, 0x10f5, 0x20ce, 0x20cf, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xac37, 0x6d9a, 0x2efe, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x075f, 0x073f, 0x071f, 0x06df, 0x06bf, 0x069f, 0x067f, 0x065f, 0x065f, 0x063f, 0x063f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x063f, 0x063f, 0x063f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x067f, 0x063f, 0x05df, 0x055f, 0x04bf, 0x043f, 0x037f, 0x1abe, 0x7a18, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc1f4, 0x7178, 0xc9f2, 0xd1f3, 0x8338, 0x061f, 0x06bf, 0x06ff, 0x071f, 0x0edf, 0xa2d5, 0xc9b3, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x18ce, 0x0918, 0x011a, 0x011a, 0x0919, 0x011a, 0x0917, 0x20cf, 0x28ae, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xa2b4, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xc3b6, 0x8519, 0x4e3c, 0x0f9f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x06ff, 0x06bf, 0x069f, 0x067f, 0x065f, 0x063f, 0x061f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05df, 0x057f, 0x04ff, 0x047f, 0x03df, 0x031f, 0x025f, 0x19de, 0x79b8, 0xc9f3, 0xca13, 0xc9f3, 0xb9d3, 0xa1b5, 0xc9d3, 0xc9f3, 0x4c5b, 0x065f, 0x06df, 0x071f, 0x071f, 0x0edf, 0xa2b5, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc993, 0xc992, 0xb172, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x10f3, 0x10f3, 0x10d2, 0x20ae, 0x18ae, 0x20ae, 0x18ce, 0x20ce, 0x20ce, 0x20ce, 0x18f2, 0x10f4, 0x1114, 0x18f3, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xc3b5, 0x7d59, 0x36bd, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x071f, 0x06de, 0x069e, 0x067e, 0x065e, 0x063f, 0x063f, 0x061e, 0x05ff, 0x05df, 0x05bf, 0x05bf, 0x059f, 0x059f, 0x059f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x059f, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05bf, 0x057f, 0x04ff, 0x049f, 0x03ff, 0x037f, 0x02bf, 0x021f, 0x017f, 0x213d, 0x9996, 0xc9f3, 0xc9f3, 0xb9d4, 0x99b6, 0xc9d3, 0xc213, 0x0dbf, 0x069f, 0x06ff, 0x071f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xa972, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20af, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xaab5, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0x94d8, 0x467c, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x06de, 0x06be, 0x067e, 0x067e, 0x065e, 0x063e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059f, 0x057f, 0x057f, 0x055f, 0x055f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x055f, 0x055f, 0x055f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x055f, 0x04ff, 0x04bf, 0x041f, 0x039f, 0x031f, 0x025f, 0x01bf, 0x013f, 0x00bf, 0x40fb, 0xb1b5, 0xc9d2, 0xb1d5, 0xb1d4, 0xc9b3, 0x6399, 0x061f, 0x06df, 0x071f, 0x073f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc972, 0xc972, 0xc992, 0xc972, 0xb152, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20cd, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30d0, 0x28f0, 0x3110, 0x30f0, 0x30f0, 0x30f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4a16, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0x8539, 0x1f5e, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x07bf, 0x075f, 0x06be, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059e, 0x057e, 0x055f, 0x053f, 0x053f, 0x051f, 0x051f, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x053f, 0x053f, 0x051f, 0x04df, 0x04bf, 0x043f, 0x03df, 0x035f, 0x02bf, 0x021f, 0x017f, 0x00ff, 0x009f, 0x087f, 0x7119, 0xc9d3, 0xb1d4, 0xb9d3, 0xc9b3, 0x1cfe, 0x065f, 0x06ff, 0x071f, 0x073f, 0x073f, 0x1ebe, 0xb9f3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc973, 0xc952, 0xb152, 0x4111, 0x3910, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20cd, 0x20ce, 0x20ae, 0x20ae, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4a15, 0x3439, 0x16bd, 0x8519, 0xd395, 0xd395, 0xd395, 0x94d8, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x071e, 0x069d, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fd, 0x05dd, 0x05bd, 0x059d, 0x059e, 0x057e, 0x055e, 0x053e, 0x051e, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x049f, 0x049f, 0x049f, 0x049f, 0x049f, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x04bf, 0x04df, 0x04df, 0x04df, 0x04bf, 0x049f, 0x043f, 0x03df, 0x035f, 0x02ff, 0x025f, 0x01bf, 0x013f, 0x00df, 0x007f, 0x005f, 0x185e, 0x8957, 0x61b9, 0xc9d3, 0x9a96, 0x059f, 0x067f, 0x06ff, 0x071f, 0x073f, 0x075f, 0x267d, 0xb9d3, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xb152, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cf, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x00f6, 0x18ce, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f1, 0x38f1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69b4, 0x6336, 0x6cd9, 0x4e5b, 0x07df, 0x8539, 0xd395, 0xd395, 0xbc17, 0x3e9c, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x06bd, 0x069c, 0x069c, 0x067c, 0x065c, 0x065c, 0x063c, 0x061c, 0x05fc, 0x05dc, 0x05bc, 0x05bd, 0x059d, 0x057d, 0x055d, 0x053e, 0x051e, 0x04fe, 0x04de, 0x04be, 0x04bf, 0x049f, 0x047f, 0x047f, 0x047f, 0x045f, 0x045f, 0x045f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x049f, 0x047f, 0x045f, 0x041f, 0x03df, 0x037f, 0x031f, 0x029f, 0x021f, 0x017f, 0x011f, 0x00bf, 0x005f, 0x001f, 0x001f, 0x00ff, 0x89b7, 0xc9b3, 0x447b, 0x065f, 0x06bf, 0x071f, 0x073f, 0x073f, 0x075f, 0x3d9b, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xa132, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20cd, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x40f1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61b3, 0x9274, 0xb2f5, 0xc355, 0xd395, 0xd395, 0xd395, 0xbc16, 0x469d, 0x8539, 0xd376, 0xd375, 0x6dba, 0x0f9f, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x077f, 0x06bc, 0x06bb, 0x069b, 0x067b, 0x065b, 0x063b, 0x063b, 0x061b, 0x05fb, 0x05db, 0x05bb, 0x059c, 0x059c, 0x057c, 0x055c, 0x053d, 0x051d, 0x04fd, 0x04dd, 0x04be, 0x049e, 0x047f, 0x047f, 0x045f, 0x043f, 0x043f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x041f, 0x03ff, 0x03bf, 0x037f, 0x033f, 0x02bf, 0x023f, 0x01df, 0x015f, 0x00df, 0x009f, 0x005f, 0x001f, 0x005f, 0x097f, 0xb9b3, 0xb214, 0x0dbf, 0x06ff, 0x075f, 0x073f, 0x073f, 0x075f, 0x077f, 0x6479, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x9132, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x3110, 0x38f0, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xc335, 0xd395, 0xd395, 0xd395, 0xd395, 0xac57, 0x7d7a, 0x469c, 0x0f9f, 0xa4b8, 0xd395, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x075d, 0x06bb, 0x06bb, 0x069a, 0x067a, 0x065a, 0x065a, 0x063a, 0x061a, 0x05fa, 0x05da, 0x05db, 0x05bb, 0x059b, 0x057b, 0x055b, 0x053c, 0x053c, 0x051c, 0x04fc, 0x04dd, 0x04bd, 0x047e, 0x047e, 0x045e, 0x043f, 0x041f, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03bf, 0x035f, 0x031f, 0x02df, 0x027f, 0x01ff, 0x019f, 0x011f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x009f, 0x39db, 0xc992, 0x6399, 0x069f, 0x079f, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x079f, 0x9af6, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x7112, 0x3110, 0x30f0, 0x30ef, 0x28f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d3, 0x10d2, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xcb75, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x1f7e, 0x07ff, 0x07ff, 0x36dd, 0xbc17, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x071b, 0x06da, 0x06ba, 0x06ba, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05f9, 0x05da, 0x05ba, 0x059a, 0x057a, 0x055a, 0x055b, 0x053b, 0x051b, 0x04fc, 0x04dc, 0x04bc, 0x049d, 0x047d, 0x045d, 0x043e, 0x041e, 0x03fe, 0x03df, 0x03df, 0x03bf, 0x03bf, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x037f, 0x035f, 0x031f, 0x02df, 0x027f, 0x023f, 0x01bf, 0x015f, 0x00ff, 0x009f, 0x005f, 0x001f, 0x003f, 0x011f, 0x99b6, 0xb9d3, 0x0d9f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f7e, 0xb9b3, 0xc952, 0xc952, 0xc952, 0xc952, 0xc931, 0xc932, 0xc132, 0x6111, 0x38f0, 0x30f0, 0x28f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xa2b4, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x0fbf, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x1f7e, 0x07df, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x06f9, 0x06f9, 0x06d9, 0x06b8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05f8, 0x05d8, 0x05b8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051a, 0x04fa, 0x04db, 0x04bb, 0x049c, 0x047c, 0x045d, 0x043d, 0x041e, 0x03fe, 0x03de, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02bf, 0x027f, 0x023f, 0x01ff, 0x019f, 0x013f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x005f, 0x197e, 0xb993, 0x6379, 0x063f, 0x073f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dfb, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc932, 0xc912, 0xb912, 0x4111, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x08f6, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79f3, 0xb2f4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x94f9, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x079d, 0x0719, 0x06f8, 0x06f8, 0x06d7, 0x06b7, 0x06b7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05f7, 0x05d7, 0x05b7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04f9, 0x04da, 0x04bb, 0x049b, 0x047c, 0x043c, 0x041d, 0x041d, 0x03fe, 0x03de, 0x03be, 0x039e, 0x037f, 0x035f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x027f, 0x023f, 0x01ff, 0x019f, 0x015f, 0x00ff, 0x009f, 0x005f, 0x003f, 0x001f, 0x00bf, 0x59ba, 0xb9b3, 0x0d3f, 0x06bf, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7438, 0xc952, 0xc132, 0xc932, 0xc932, 0xc932, 0xc911, 0xc912, 0xa111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x08f5, 0x011a, 0x0119, 0x00fa, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x5151, 0x79f3, 0xa2b4, 0xcb75, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x469c, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0xc335, 0x45d7, 0x0738, 0x0717, 0x06f6, 0x06f6, 0x06d6, 0x06b5, 0x06b5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05f5, 0x05f5, 0x05d6, 0x05b6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04f9, 0x04d9, 0x049a, 0x047b, 0x045b, 0x043c, 0x041c, 0x03dd, 0x03dd, 0x03be, 0x039e, 0x037e, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x021f, 0x01ff, 0x01bf, 0x017f, 0x011f, 0x00df, 0x009f, 0x003f, 0x001f, 0x003f, 0x013f, 0xb174, 0x6339, 0x05ff, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb992, 0xc932, 0xc932, 0xc931, 0xc912, 0xc912, 0xc912, 0xc911, 0x8111, 0x30f0, 0x30f0, 0x28ef, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20d0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08f5, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x59b2, 0x7a13, 0x9a94, 0xbb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xac77, 0x2f1e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bc, 0x0759, 0xabb5, 0xc314, 0x1e97, 0x0736, 0x0716, 0x0715, 0x06f4, 0x06f4, 0x06f3, 0x06d3, 0x06b3, 0x06b2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05f4, 0x05d4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04f8, 0x04b9, 0x0499, 0x045a, 0x043b, 0x041b, 0x03fc, 0x03dd, 0x03bd, 0x039d, 0x037e, 0x035e, 0x033e, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x021f, 0x01df, 0x019f, 0x017f, 0x013f, 0x00ff, 0x009f, 0x007f, 0x003f, 0x001f, 0x007f, 0x399b, 0xb993, 0x055f, 0x067f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x45db, 0xc132, 0xc932, 0xc912, 0xc132, 0xc912, 0xc912, 0xc911, 0xc912, 0x5111, 0x38f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x10d3, 0x10f4, 0x18d0, 0x18ad, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ce, 0x20ce, 0x28ae, 0x20ce, 0x28ee, 0x5171, 0x69d2, 0x8232, 0xaaf4, 0xc334, 0xd375, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x757a, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bd, 0x079b, 0x077a, 0x0779, 0x74d6, 0xd2d4, 0x9bf5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06f0, 0x06f0, 0x06d0, 0x06af, 0x06af, 0x066f, 0x0650, 0x0631, 0x0611, 0x05d2, 0x0594, 0x0554, 0x0515, 0x04f7, 0x04b8, 0x0478, 0x0459, 0x043a, 0x03fb, 0x03bc, 0x03bc, 0x039d, 0x037d, 0x035e, 0x033e, 0x031f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x027f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x013f, 0x011f, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x00df, 0xa175, 0x33bc, 0x05df, 0x06ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x92d5, 0xc911, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc112, 0xc912, 0xa8f1, 0x3110, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x390f, 0x4970, 0x59b0, 0x7a32, 0x9293, 0xaad3, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x9cb8, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07dd, 0x07bc, 0x079b, 0x079a, 0x079a, 0x0779, 0x55b7, 0xd2b4, 0xd2b4, 0x4db5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074f, 0x074e, 0x074d, 0x074d, 0x074c, 0x072b, 0x072b, 0x072a, 0x070a, 0x06ea, 0x06ac, 0x064d, 0x05d0, 0x0573, 0x04f5, 0x04b6, 0x0478, 0x0438, 0x041a, 0x03fb, 0x03bc, 0x039c, 0x037c, 0x033d, 0x033d, 0x031e, 0x02fe, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x009f, 0x005f, 0x003f, 0x001f, 0x003f, 0x213d, 0x1b1e, 0x051f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f3d, 0xc912, 0xc912, 0xc112, 0xc112, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0x80f1, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xc374, 0xa2d3, 0xaad3, 0x7a31, 0x7a31, 0x7a11, 0x7231, 0x5190, 0x496f, 0x496f, 0x4970, 0x496f, 0x494f, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x494f, 0x496f, 0x496f, 0x69f1, 0x7a31, 0x7a31, 0x9272, 0xa2d3, 0xaaf3, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd395, 0xac57, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x079a, 0x079a, 0x0799, 0x26b8, 0xcad4, 0xd2b4, 0xc314, 0x0f35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078f, 0x078e, 0x078e, 0x078d, 0x078c, 0x07aa, 0x07a9, 0x07a9, 0x07a8, 0x07c7, 0x07c5, 0x07c4, 0x07e4, 0x07a4, 0x0727, 0x068a, 0x05af, 0x0496, 0x0438, 0x03f9, 0x03ba, 0x039b, 0x035c, 0x035d, 0x031d, 0x031d, 0x02fe, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x007f, 0x023f, 0x041f, 0x05bf, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6498, 0xc911, 0xc912, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8d1, 0x50f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0117, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x8539, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x07ba, 0x07ba, 0x07b9, 0xd2b4, 0xd2b4, 0xd2b4, 0x6535, 0x07b5, 0x07b5, 0x07b4, 0x07b3, 0x07b2, 0x07b1, 0x07b0, 0x07af, 0x07ce, 0x07cd, 0x07cc, 0x07cb, 0x07ca, 0x07ca, 0x07c9, 0x07e8, 0x07e7, 0x07e6, 0x07e5, 0x07e5, 0x07e3, 0x07e3, 0x07e2, 0x07e1, 0x0726, 0x060c, 0x04b4, 0x03b9, 0x037b, 0x035c, 0x033d, 0x031d, 0x02de, 0x02df, 0x02be, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x015f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x007f, 0x003f, 0x001f, 0x001f, 0x011f, 0x02ff, 0x04df, 0x063f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb972, 0xc8f2, 0xc8f2, 0xc0f1, 0xc8f2, 0xc0f2, 0xc0f1, 0xc8d1, 0xa0f1, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x412f, 0x8a72, 0xc334, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xac57, 0x469c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x467c, 0x8519, 0x8519, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07de, 0x07de, 0x07dd, 0x07dc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x07da, 0x9bf5, 0xd2b4, 0xd2b4, 0xc2f4, 0x0f77, 0x07d6, 0x07d5, 0x07d4, 0x07d4, 0x07d3, 0x07d2, 0x07d1, 0x07d0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07ec, 0x07ea, 0x07e9, 0x07e9, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e4, 0x07e4, 0x07e3, 0x07e3, 0x07e2, 0x0785, 0x060c, 0x04d3, 0x035b, 0x031c, 0x02de, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x001f, 0x001f, 0x003f, 0x01df, 0x03bf, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d7a, 0xc111, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0d1, 0xc8d1, 0x68f1, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x414f, 0x61d1, 0x8251, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xbc16, 0x8539, 0x469c, 0x17bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8518, 0xd355, 0xd355, 0xd335, 0xd335, 0x84f8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07fe, 0x07dd, 0x07dd, 0x07bc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x8c56, 0xcab4, 0xcab4, 0xd294, 0x4df7, 0x07d7, 0x07d7, 0x07d6, 0x07f5, 0x07d5, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07e9, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e5, 0x07e5, 0x07e4, 0x07a6, 0x060e, 0x03f8, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x003f, 0x001f, 0x001f, 0x00bf, 0x029f, 0x049f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1d3, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0f1, 0xc8d1, 0xb8d1, 0x40f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0x496f, 0x5990, 0x7a12, 0x7a32, 0x9272, 0xa2d3, 0xa2d3, 0xc375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xac77, 0x757a, 0x36fd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4e3c, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd334, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07dd, 0x07dd, 0x07dc, 0x07fc, 0x07dc, 0x07db, 0x6d38, 0xcab4, 0xd294, 0xd294, 0xab95, 0x07d8, 0x07d8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ec, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07e9, 0x07e9, 0x07e8, 0x07e8, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e8, 0x07c8, 0x06eb, 0x0514, 0x033c, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0x015f, 0x037f, 0x057f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5a, 0xc8f1, 0xc8d1, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x78d1, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x496f, 0x496f, 0x4970, 0x7a12, 0x7a31, 0x8252, 0xaad3, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcbd6, 0x94f8, 0x565b, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb3f6, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd334, 0x1f7e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07dd, 0x07fd, 0x07fd, 0x07fd, 0x07dd, 0x07dc, 0x6d38, 0xcab4, 0xd294, 0xca94, 0xd294, 0x1f39, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ed, 0x07ec, 0x07eb, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07ca, 0x07ab, 0x076c, 0x070d, 0x05b2, 0x039b, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60d9, 0x0a3f, 0x047f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9d3, 0xc0d1, 0xc8d1, 0xc0f1, 0xc8b1, 0xc0d1, 0xc8b1, 0xc0b1, 0xb8b1, 0x48f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x4970, 0x5990, 0x7a31, 0x7231, 0x7a31, 0x7a31, 0x9ab3, 0xaad4, 0xa2d4, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0x94f8, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd315, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x6d58, 0xd294, 0xd293, 0xca94, 0xd274, 0x4df8, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f1, 0x07f0, 0x07f0, 0x07f0, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ed, 0x07cd, 0x078e, 0x076e, 0x0710, 0x06b1, 0x0574, 0x037b, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x013f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x88d6, 0x6159, 0x031f, 0x053f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5b, 0xc0d1, 0xc8d1, 0xc8d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b1, 0x90d1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ce, 0x18ad, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x290f, 0x5170, 0x5170, 0x69f1, 0x7a32, 0x8232, 0xaaf3, 0xaaf4, 0xcb75, 0xd395, 0xd396, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xc3b6, 0x8539, 0x1f7f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0x659a, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x6d39, 0xd294, 0xca94, 0xd274, 0xca74, 0x7c96, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f4, 0x07f4, 0x07f3, 0x07f3, 0x07f3, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f1, 0x07f1, 0x07f1, 0x07f1, 0x07f0, 0x07f1, 0x07d0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02dd, 0x01bf, 0x019f, 0x017f, 0x015f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x00bf, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60b8, 0xb8f3, 0x09bf, 0x041f, 0x061f, 0x073f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1b3, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x48f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x5172, 0x61b2, 0x8a54, 0x9a94, 0xb335, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0x9c97, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xac17, 0xd335, 0xd314, 0xd335, 0xd314, 0xd315, 0xd315, 0xd2f4, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6d59, 0xd274, 0xca94, 0xd274, 0xca74, 0xb334, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f4, 0x07f4, 0x07f4, 0x07d3, 0x07b3, 0x0793, 0x0753, 0x0714, 0x06b5, 0x5516, 0x0538, 0x037c, 0x01ff, 0x017f, 0x015f, 0x013f, 0x011f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x6099, 0xc911, 0x491a, 0x02df, 0x051f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6459, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x90d1, 0x30f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69d3, 0x9274, 0xb2f5, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xa478, 0x36dd, 0x07ff, 0x07ff, 0x563c, 0xd335, 0xd334, 0xd315, 0xd315, 0xd2f4, 0xcb15, 0xbb96, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8498, 0xca94, 0xca94, 0xd274, 0xca74, 0xca74, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07d6, 0x07b6, 0x0796, 0x0756, 0x0716, 0xa456, 0xbbd6, 0x3479, 0x02fd, 0x023f, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x003f, 0x78b7, 0xc111, 0xa114, 0x01ff, 0x041f, 0x05ff, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xc0b1, 0xc0d2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x48f1, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x20cd, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71f4, 0x9a75, 0xb2f5, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0x9c78, 0x36dd, 0x07ff, 0x9c57, 0xd335, 0xd315, 0xd334, 0xd314, 0xc355, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bf7, 0xca94, 0xd274, 0xca73, 0xca74, 0xd253, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f8, 0x07d8, 0x07b8, 0x0797, 0x0758, 0x0ef8, 0xbbf6, 0xd395, 0x6b99, 0x025f, 0x021f, 0x01bf, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x98d5, 0xc8f2, 0xc911, 0x195e, 0x033f, 0x053f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b76, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x88d1, 0x30f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8a16, 0xaad5, 0xcb55, 0xd375, 0xd355, 0xd354, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0x84f9, 0x0fbf, 0x5ddb, 0xa457, 0x9c58, 0x84d8, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca74, 0xca74, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07da, 0x07da, 0x07ba, 0x079a, 0x0779, 0x2e99, 0xc3d6, 0xd395, 0x8339, 0x0a3e, 0x01df, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0x90d5, 0xc912, 0xc0f1, 0x7117, 0x027f, 0x049f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x269d, 0xc891, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8b1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ce, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ef, 0x28cf, 0x28ef, 0x28d0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8b14, 0x4ad3, 0x7a94, 0xab14, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd314, 0xd335, 0xc355, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc2d4, 0xca74, 0xca74, 0xd274, 0xca74, 0xd253, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07db, 0x07bb, 0x07bb, 0x077b, 0x2eba, 0xc3d6, 0xd395, 0xb337, 0x09df, 0x01bf, 0x017f, 0x013f, 0x011f, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x7896, 0xc0f1, 0xc8f1, 0xa8f3, 0x01df, 0x03df, 0x05bf, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0x68f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9a75, 0xcb55, 0xcb75, 0x5bb4, 0x3b34, 0x42b3, 0x4a33, 0x6253, 0x9ab4, 0xd335, 0xd335, 0xd315, 0xd334, 0xd314, 0xd315, 0xd314, 0xd314, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f5e, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xca53, 0x369d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07dd, 0x07dd, 0x07bd, 0x079c, 0x561a, 0xd395, 0xd395, 0xab37, 0x099f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x003f, 0x003f, 0x305c, 0xc0f1, 0xc8f1, 0xc8d1, 0x215d, 0x033f, 0x051f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5cd9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x98d1, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x011a, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xcb55, 0xd375, 0xbb95, 0x5474, 0x3c34, 0x3bb4, 0x4333, 0x42b3, 0x4a13, 0x49f3, 0x5a32, 0x9ab4, 0xd334, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0x84d8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4ddb, 0xd274, 0xca74, 0xca73, 0xd274, 0xca54, 0xca54, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07de, 0x079d, 0x6d99, 0xd395, 0xd395, 0xab17, 0x097f, 0x011f, 0x011f, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0xc8f1, 0xc8f1, 0xc8d1, 0x5119, 0x02df, 0x04ff, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x4910, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xcb55, 0xd375, 0xd375, 0xb3d5, 0x3d55, 0x3515, 0x3495, 0x3c14, 0x3b94, 0x3b13, 0x4293, 0x4212, 0x49f3, 0x49f3, 0x5a13, 0x9ab4, 0xd314, 0xd315, 0xcb15, 0xd2f4, 0xd2f5, 0xd2f4, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8c37, 0xca74, 0xd273, 0xd253, 0xca54, 0xca53, 0xd253, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07df, 0x07df, 0x94d8, 0xd396, 0xd395, 0x8299, 0x00ff, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0xc8d1, 0xc0f1, 0xc0d1, 0xa0d4, 0x027f, 0x04bf, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8315, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x70f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0117, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xb2f4, 0xd375, 0xd375, 0xd375, 0x9435, 0x3d55, 0x2d55, 0x2d75, 0x3515, 0x3c94, 0x3414, 0x3b94, 0x4313, 0x4293, 0x4a13, 0x41f3, 0x49f2, 0x4a13, 0x5a33, 0xa2b4, 0xd314, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2f4, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x179f, 0xd274, 0xca53, 0xca73, 0xca53, 0xca53, 0xca53, 0xd253, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xbc16, 0xd395, 0xd395, 0x725a, 0x00bf, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x90b5, 0xc8d1, 0xc8d1, 0xc0d1, 0x123e, 0x047f, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x90d1, 0x38f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x38f0, 0x30f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xcb55, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3bf4, 0x3b73, 0x42f4, 0x4273, 0x4a13, 0x4213, 0x49f2, 0x49f3, 0x49f3, 0x6a33, 0xbad4, 0xd2f5, 0xd2f4, 0xd2d4, 0xc335, 0x177e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xca54, 0xd273, 0xca54, 0xca53, 0xca53, 0xca53, 0x9bb6, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x077e, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x36dd, 0xd395, 0xd395, 0xd395, 0x51bc, 0x009f, 0x009f, 0x007f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x7077, 0xc0d2, 0xc8d1, 0xc0d1, 0x49fa, 0x049f, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4952, 0xaab4, 0xd375, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x2d75, 0x2d75, 0x3555, 0x54d5, 0x6475, 0x83b5, 0x8b74, 0x9b34, 0xab14, 0xaad4, 0xb2d4, 0xaad4, 0xaab4, 0xaab4, 0xb2b4, 0x6b15, 0x8a94, 0xc2d4, 0xd2f4, 0xd2d4, 0x84b8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb315, 0xd274, 0xca53, 0xca54, 0xca53, 0xca53, 0xd253, 0x653a, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x071f, 0x071e, 0x071e, 0x073e, 0x079f, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7d7a, 0xd395, 0xd395, 0xc375, 0x28fe, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x005f, 0x003f, 0x003f, 0x183e, 0xc0d1, 0xc0d1, 0xc0d2, 0x7996, 0x04bf, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x58f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0117, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x5972, 0xcb55, 0xd375, 0xd375, 0xd375, 0xd375, 0xabd5, 0x4515, 0x54f5, 0x7c75, 0x8c35, 0xabd5, 0xcb55, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xc355, 0x9c37, 0x659a, 0x467c, 0x0fbf, 0x07ff, 0x07ff, 0x269d, 0x9c17, 0xd2d4, 0x9c17, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xd274, 0xca53, 0xca54, 0xca53, 0xca33, 0xca33, 0xca33, 0x26dd, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071e, 0x071e, 0x06fe, 0x06fe, 0x06ff, 0x06de, 0x06de, 0x06be, 0x06be, 0x06de, 0x073e, 0x079f, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x079f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0xc3f6, 0xd395, 0xd395, 0xaaf7, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x001f, 0x001f, 0xa094, 0xc0d1, 0xc8b1, 0xa8f3, 0x04bf, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x73d8, 0xb8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x10cf, 0x0119, 0x00f9, 0x0117, 0x18ce, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x71f2, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xcb14, 0xd334, 0xd334, 0xac16, 0x753a, 0x467d, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x369c, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26fd, 0xc2b4, 0xca53, 0xca53, 0xca53, 0xd253, 0xca33, 0xca33, 0xa356, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06fe, 0x06fe, 0x06de, 0x06be, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x06be, 0x073e, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07df, 0x6dda, 0xd395, 0xd376, 0xd375, 0x79fa, 0x003f, 0x003f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x8896, 0xc0b1, 0xc0b1, 0xc8b1, 0x0c9f, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0x98d1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x9a93, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd355, 0xd335, 0xd335, 0xc375, 0x84f9, 0x4e3c, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xab75, 0xca54, 0xd253, 0xca53, 0xca33, 0xca33, 0xd233, 0xca33, 0x4dbb, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06de, 0x06de, 0x06de, 0x06be, 0x06be, 0x069e, 0x067e, 0x067e, 0x067e, 0x065e, 0x063e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05fd, 0x067d, 0x06de, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x071e, 0x073f, 0x073f, 0x073f, 0x073e, 0x075f, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x0fbf, 0xc3d6, 0xd375, 0xd375, 0xd355, 0x30fd, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x6058, 0xc0b1, 0xc0b1, 0xc0b1, 0x33fc, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0b1, 0xb8d1, 0xb8d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x3910, 0xaaf4, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x7539, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2efd, 0xb315, 0xca53, 0xca54, 0xca33, 0xca53, 0xca34, 0xca34, 0xca33, 0xa335, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06de, 0x06bf, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05bd, 0x05be, 0x059d, 0x055e, 0x055e, 0x05be, 0x05fe, 0x061d, 0x067e, 0x06be, 0x06fe, 0x06fe, 0x071f, 0x071e, 0x073f, 0x073f, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x8539, 0xd375, 0xd355, 0xd355, 0xbaf6, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x403b, 0xc8b1, 0xc0b1, 0xc0b1, 0x6318, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9b3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x4910, 0x3910, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x10d3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30cf, 0x3910, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xcb96, 0x8518, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbe, 0x653a, 0xca54, 0xca53, 0xd253, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x2e9d, 0x077f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06fe, 0x06df, 0x06de, 0x06bf, 0x06be, 0x06bf, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05be, 0x05be, 0x059e, 0x057e, 0x053e, 0x051e, 0x04fe, 0x04be, 0x049e, 0x041e, 0x03dd, 0x04de, 0x065e, 0x06be, 0x06de, 0x06de, 0x06fe, 0x071f, 0x073e, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x36dd, 0xd355, 0xd355, 0xd355, 0xd335, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0xb8b2, 0xc091, 0xc0b1, 0x7a96, 0x06bf, 0x079f, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x82f5, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0x60f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x08f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x28cf, 0x28ef, 0x3910, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x5d9a, 0xb315, 0xd254, 0xca53, 0xd254, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xca33, 0x64d9, 0x077f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06be, 0x069f, 0x069f, 0x067e, 0x065e, 0x065e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x055e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043d, 0x03de, 0x03be, 0x039e, 0x037e, 0x03fe, 0x05fe, 0x069e, 0x069e, 0x06be, 0x06fe, 0x071e, 0x073f, 0x075f, 0x079f, 0x079f, 0x07df, 0x07df, 0x07df, 0x07ff, 0xbbf6, 0xd355, 0xd335, 0xd335, 0xc2f5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x9095, 0xc8b1, 0xc8b1, 0x91f5, 0x067f, 0x06ff, 0x073f, 0x075f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x80f2, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x08f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x3110, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0x9c77, 0x563b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f7e, 0x65db, 0x7cf9, 0x9c57, 0x9c57, 0x9c57, 0x9c57, 0x9c37, 0x9c37, 0x9c37, 0x9c37, 0x7539, 0x6d7a, 0x6579, 0x5dbb, 0x36bd, 0x36bd, 0x36bc, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x36bd, 0x5d9a, 0x8c37, 0xd274, 0xd273, 0xd254, 0xca53, 0xd254, 0xd253, 0xca33, 0xd233, 0xca34, 0xca13, 0xca33, 0x8418, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x069e, 0x069f, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x05be, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04be, 0x045e, 0x03fe, 0x03be, 0x039e, 0x037e, 0x037e, 0x035e, 0x033e, 0x035e, 0x061d, 0x067e, 0x067e, 0x069e, 0x06be, 0x06fe, 0x073f, 0x075f, 0x077f, 0x079f, 0x07df, 0x07df, 0x07ff, 0x7d59, 0xd335, 0xd335, 0xd335, 0xd314, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x60d8, 0xc0b1, 0xc0b1, 0xb8f2, 0x05df, 0x061f, 0x065f, 0x06df, 0x073f, 0x077f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x90d1, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0x9c77, 0x3edd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x659a, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca74, 0xca74, 0xca73, 0xca73, 0xd274, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xab15, 0x0edf, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067e, 0x067f, 0x067e, 0x065e, 0x063f, 0x061e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043e, 0x03be, 0x039e, 0x039e, 0x035e, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x037e, 0x05fe, 0x065e, 0x067e, 0x069e, 0x06de, 0x06fe, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x271d, 0xd335, 0xd314, 0xd315, 0xd315, 0xc2d5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x009f, 0x60d8, 0xc0b1, 0xc0b2, 0xc0b1, 0x04bf, 0x053f, 0x05bf, 0x067f, 0x06df, 0x075f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0x98d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ce, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xac37, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x0ebd, 0x1d7b, 0x1c99, 0x32f5, 0x3a75, 0x6193, 0x69b3, 0x79f4, 0x8a14, 0xb294, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xd274, 0xca53, 0xca54, 0xca54, 0xca53, 0xd253, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x8b97, 0x35fd, 0x5d7b, 0x6d3a, 0x6d3a, 0x5d5b, 0x35fd, 0x06bf, 0x0e7e, 0x457c, 0x6c99, 0x6479, 0x6459, 0x4cba, 0x0e1e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04de, 0x047e, 0x03de, 0x03be, 0x037e, 0x037f, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x02fe, 0x02fe, 0x02de, 0x03fe, 0x05be, 0x063e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073e, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0xbbb6, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0x697a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x48fa, 0xc0b1, 0xc0b1, 0xc0b1, 0x331c, 0x047f, 0x053f, 0x05ff, 0x069f, 0x073f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9a14, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ae, 0x18cf, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f4, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x9273, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xc3b6, 0x5dfb, 0x07ff, 0x0e3b, 0x1c98, 0x2ad5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79d3, 0x9a54, 0xc294, 0xd2f4, 0xd2d5, 0xcad4, 0xd2d4, 0xd2b4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xca73, 0xd253, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x99d4, 0x6358, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd375, 0x06bf, 0x5cfa, 0xd2b4, 0xca94, 0xca33, 0xca13, 0xc9d3, 0xb9d3, 0x4c5a, 0x061e, 0x061e, 0x05de, 0x05de, 0x05be, 0x059e, 0x059e, 0x057e, 0x053e, 0x051e, 0x051d, 0x04de, 0x04be, 0x043e, 0x03be, 0x03be, 0x037f, 0x0b7e, 0x337c, 0x333c, 0x335c, 0x333c, 0x333c, 0x331c, 0x331c, 0x32fc, 0x32fc, 0x32dc, 0x2b7c, 0x05de, 0x061e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07df, 0x84f9, 0xd314, 0xcb14, 0xcaf4, 0xd2d5, 0xb275, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x08df, 0xb8d2, 0xc0b1, 0xc0b1, 0x3a7b, 0x03ff, 0x04df, 0x05bf, 0x067f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b77, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x20cf, 0x0918, 0x013a, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0139, 0x00f9, 0x10d2, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x9c78, 0x261b, 0x1b96, 0x3171, 0x30f0, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81f3, 0xaa73, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xca53, 0xca53, 0xca53, 0xd233, 0xca33, 0xca33, 0xd233, 0xc234, 0x7994, 0x5975, 0xb315, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xc375, 0x067f, 0x067f, 0x6c79, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc912, 0x34bb, 0x05fe, 0x05de, 0x05be, 0x059e, 0x055e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x249d, 0x347b, 0x6bfa, 0x7b99, 0x9b98, 0xab97, 0xdb95, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xbbd6, 0x9c37, 0x8499, 0x6d1a, 0x363c, 0x1edd, 0x079f, 0x07bf, 0x07df, 0x4e1b, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0x40fc, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x78d7, 0xc0b1, 0xc0b1, 0x61d8, 0x03bf, 0x049f, 0x057f, 0x065f, 0x071f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x10f3, 0x013a, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011a, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x5170, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0x6519, 0x22b3, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79b3, 0xa233, 0xd2b4, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xca94, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xd253, 0xca54, 0xca54, 0xca33, 0xd233, 0xca34, 0xca33, 0xca33, 0xa1d3, 0x5954, 0x5954, 0x79f5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd335, 0x8c18, 0x067f, 0x065f, 0x063f, 0xa2d5, 0xc9d3, 0xc972, 0xc952, 0xc111, 0xc8d1, 0x8a55, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x34dc, 0x6c5a, 0xa3f7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xbbb6, 0x84d9, 0x4e1b, 0x465c, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0x81d8, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x6098, 0xc0b1, 0xc0d1, 0x59b8, 0x035f, 0x045f, 0x055f, 0x063f, 0x06ff, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x58f1, 0x3911, 0x30f0, 0x3110, 0x30cf, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x08f6, 0x013a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ce, 0x20ae, 0x28ee, 0xcb55, 0xd375, 0xd375, 0xd375, 0xbb14, 0x34f9, 0x2930, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91f2, 0xc254, 0xca93, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xca73, 0xd273, 0xca73, 0xd254, 0xca53, 0xca53, 0xca54, 0xca33, 0xca34, 0xa1f3, 0x6973, 0x4953, 0x5134, 0x5154, 0xaaf5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd335, 0xd314, 0x5cda, 0x065f, 0x063f, 0x063f, 0xb254, 0xc972, 0xc952, 0xc112, 0xc8d1, 0xc0b1, 0xc0b1, 0x05be, 0x059e, 0x2d1c, 0x9438, 0xcbb6, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xca94, 0x087f, 0x003f, 0x001f, 0x001f, 0x001f, 0x385b, 0xc0b1, 0xc0b1, 0x9135, 0x031f, 0x043f, 0x053f, 0x063f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb8d1, 0x5911, 0x3911, 0x38f0, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x0917, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x011a, 0x00f9, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18cd, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x20ce, 0x8252, 0xd375, 0xd375, 0xd375, 0x9a93, 0x30ef, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81d2, 0xaa13, 0xba33, 0xca54, 0xca74, 0xca53, 0xca54, 0xca53, 0xca53, 0xb213, 0xa1f3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xd395, 0xd395, 0xd396, 0xd375, 0xd334, 0xd2f5, 0xd2b4, 0x2d9d, 0x063f, 0x063f, 0x061f, 0xc993, 0xc952, 0xc911, 0xc8f1, 0xc0b1, 0xc0b1, 0xb8d1, 0x059e, 0x057e, 0xabf7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd335, 0xcb15, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0x411c, 0x003f, 0x003f, 0x001f, 0x001f, 0x203c, 0xc0b1, 0xc0b1, 0x9135, 0x02ff, 0x041f, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa1b3, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x68f1, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x10f3, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x412f, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ce, 0x28cf, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3110, 0x38f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x38f1, 0x38f0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8a34, 0xd395, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xb2f6, 0x065f, 0x061f, 0x061f, 0x34dc, 0xc952, 0xc912, 0xc8d2, 0xc0b1, 0xc0d1, 0xb8d1, 0x89b4, 0x2bba, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71d4, 0x69f4, 0x71d3, 0x69d4, 0x71d3, 0x7a14, 0x8a75, 0x9274, 0x9254, 0x9254, 0x9a95, 0xb315, 0xbb14, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xcb14, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xcab4, 0xca94, 0xca94, 0x81b8, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0xa8b3, 0xc0b1, 0xb0d2, 0x02df, 0x03ff, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f2, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20cf, 0x0918, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20cd, 0x9272, 0xd375, 0xc334, 0x61d1, 0x20cf, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x30f0, 0x3110, 0x3110, 0x30f0, 0x3110, 0x38f0, 0x30f0, 0x38f0, 0x3111, 0x38f0, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xb2f5, 0xd395, 0xd375, 0xd355, 0xd2f4, 0xd2b4, 0xd274, 0x83b8, 0x063f, 0x061f, 0x061e, 0x6398, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61b3, 0x7a34, 0x9a95, 0xb2f5, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd274, 0xca74, 0xc254, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x5878, 0xb8d1, 0xc0b1, 0x02bf, 0x03bf, 0x04ff, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6478, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20cf, 0x0917, 0x011a, 0x011a, 0x0119, 0x08f4, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20cd, 0x18ce, 0x20ae, 0x390f, 0xd375, 0xcb35, 0x414f, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x30ef, 0x3110, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f1, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3910, 0x3911, 0x38f1, 0x3911, 0x3912, 0x4952, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xd2b4, 0xd274, 0xca33, 0x4c9a, 0x05ff, 0x061f, 0x05ff, 0xa1f4, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa0f1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xa274, 0xc315, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca74, 0xca74, 0xca74, 0xca54, 0x20fd, 0x009f, 0x007f, 0x005f, 0x003f, 0x105d, 0xc0b1, 0xc0d1, 0x029f, 0x03bf, 0x04df, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x61d0, 0xbb14, 0x412f, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28cf, 0x28f0, 0x30d0, 0x28ef, 0x28cf, 0x30cf, 0x30f0, 0x30d0, 0x30d0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x61b2, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xca74, 0xd233, 0xca13, 0x1d9d, 0x05ff, 0x05ff, 0x1d3d, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8a14, 0xaa74, 0xcaf4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xca94, 0xca73, 0xd274, 0xd253, 0xd254, 0x597a, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x005f, 0xa8b3, 0xc0b1, 0x31fc, 0x039f, 0x04df, 0x05df, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x390f, 0x28ce, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x71f2, 0xd335, 0xd2f4, 0xd2b4, 0xca74, 0xd233, 0xca13, 0xa295, 0x05ff, 0x05ff, 0x05ff, 0x5399, 0xc0d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9a34, 0xc2b4, 0xd2b5, 0xd2b3, 0xcab4, 0xd294, 0xd294, 0xca93, 0xd274, 0xd274, 0xca53, 0xca54, 0xca53, 0x81d8, 0x00df, 0x00df, 0x00df, 0x00bf, 0x00bf, 0x68b7, 0xb8d1, 0x31dc, 0x033f, 0x049f, 0x05df, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26bd, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d2, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x011a, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x8213, 0xd2f5, 0xcad4, 0xd274, 0xca53, 0xc9f3, 0xc9d2, 0x7398, 0x05ff, 0x05ff, 0x05df, 0xa953, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x98f2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f0, 0x38f0, 0x38f0, 0x38f0, 0x3911, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xca94, 0xd294, 0xca94, 0xd274, 0xca74, 0xd274, 0xca53, 0xca54, 0xca53, 0xca34, 0x99f6, 0x011f, 0x011f, 0x00ff, 0x00ff, 0x00ff, 0x38db, 0xc0b1, 0x28fc, 0x02df, 0x047f, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd335, 0xd2b4, 0xca94, 0xca33, 0xd1f3, 0xc9d3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc932, 0xc0d1, 0xc0b1, 0xb8d1, 0xb0d2, 0xb9f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x015f, 0x013f, 0x013f, 0x013f, 0x011f, 0x093f, 0xc0b1, 0x311c, 0x01bf, 0x03ff, 0x059f, 0x069f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2f4, 0xca74, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc111, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xca53, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x097f, 0x017f, 0x015f, 0x017f, 0x015f, 0x015f, 0x88f5, 0x293c, 0x013f, 0x02df, 0x053e, 0x067f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9234, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x10d0, 0x0118, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2b4, 0xd233, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0xb8d1, 0xc253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x31bc, 0x01bf, 0x019f, 0x019f, 0x019f, 0x019f, 0x5139, 0x315c, 0x017f, 0x01bf, 0x045e, 0x063e, 0x077f, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xcb15, 0xca13, 0xc9d3, 0xc992, 0xc932, 0xc911, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc397, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xc9f3, 0x31fc, 0x01df, 0x01df, 0x01df, 0x01df, 0x01df, 0x01bf, 0x01df, 0x01bf, 0x01bf, 0x02df, 0x05fd, 0x073e, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8ab5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb0f1, 0xba95, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9f3, 0x31fd, 0x021f, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01df, 0x01ff, 0x051d, 0x071d, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6bf7, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc9d3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb152, 0xd79e, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x323c, 0x023f, 0x023f, 0x021f, 0x023f, 0x023f, 0x021f, 0x021f, 0x021f, 0x021f, 0x021f, 0x037e, 0x06dc, 0x07fd, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0x7911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc972, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xd63c, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x325c, 0x027f, 0x025f, 0x025f, 0x025f, 0x023f, 0x025f, 0x025f, 0x023f, 0x023f, 0x023f, 0x029f, 0x067c, 0x07fc, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d1, 0x70f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xc951, 0xc912, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xbb97, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, 0xc9b3, 0x327c, 0x029f, 0x029f, 0x029f, 0x029f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x025f, 0x027f, 0x05bc, 0x07db, 0x07fc, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x58f1, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x011a, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ae, 0x18d0, 0x0118, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa8f1, 0xa972, 0xd77e, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc193, 0x0a7f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x027f, 0x029f, 0x027f, 0x04dd, 0x07bb, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0x5911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xa911, 0xbc78, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, 0x089f, 0x011f, 0x031f, 0x02ff, 0x02ff, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x03fd, 0x079a, 0x07fa, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x2e5c, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb8d1, 0x5912, 0x3911, 0x38f1, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x007f, 0x009e, 0x023f, 0x033f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02df, 0x039e, 0x075a, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0x009f, 0x009f, 0x013f, 0x033f, 0x037f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x033f, 0x06f9, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb0f1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0d1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x3110, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, 0x007f, 0x007f, 0x00ff, 0x027f, 0x039f, 0x039f, 0x037f, 0x231d, 0x5259, 0x5a3a, 0x033f, 0x033f, 0x031f, 0x031f, 0x0699, 0x07f8, 0x07fa, 0x07fd, 0x07ff, 0x07ff, 0x363c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4112, 0x38f1, 0x3911, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x0915, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, 0x007f, 0x007f, 0x00bf, 0x021f, 0x2abd, 0x7a36, 0xb953, 0xc112, 0xc911, 0xc912, 0x0b3f, 0x035f, 0x035f, 0x033f, 0x05fa, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa0f1, 0x68f1, 0x4111, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, 0x007f, 0x007f, 0x30bb, 0x9955, 0xc931, 0xc932, 0xc932, 0xc912, 0xc0f2, 0xc8f2, 0x32fc, 0x037f, 0x037f, 0x037f, 0x059b, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d2, 0xb0d1, 0xb0f1, 0x98f1, 0xb0f1, 0x88f1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0x087e, 0x70f8, 0xc952, 0xc932, 0xc912, 0xc932, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0x331c, 0x03bf, 0x039f, 0x039f, 0x051b, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa0f1, 0xb0f1, 0xb0d1, 0x50f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, 0x9915, 0xc932, 0xc932, 0xc932, 0xc912, 0xc111, 0xc8f2, 0xc0f2, 0xc8d1, 0xc8d1, 0x333c, 0x03ff, 0x03df, 0x03bf, 0x04dc, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f1, 0xc8d1, 0xc8d1, 0xc8d1, 0x335c, 0x041f, 0x03ff, 0x03ff, 0x047d, 0x0795, 0x07f6, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0x40f0, 0x28cf, 0x28ef, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, 0x309c, 0x005f, 0x58b9, 0xc912, 0xc111, 0xc8f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x337c, 0x045f, 0x041f, 0x041f, 0x045e, 0x0775, 0x07f5, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0x80f1, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, 0x003f, 0x003f, 0x005f, 0x78d7, 0xc0f2, 0xc8f1, 0xc0d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x4b1a, 0x047f, 0x045f, 0x043f, 0x045f, 0x0735, 0x07f4, 0x07f9, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa0f1, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0x003f, 0x003f, 0x005f, 0x58b9, 0xc0f1, 0xc0d1, 0xc8d1, 0xc8b2, 0xc0b1, 0xc0b1, 0x62b8, 0x04bf, 0x047f, 0x047f, 0x045f, 0x0715, 0x07f4, 0x07f9, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa8f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0x58f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0x001f, 0x003f, 0x003f, 0x00df, 0x88f6, 0xc8d1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0x62d9, 0x04ff, 0x04bf, 0x049f, 0x047f, 0x06b6, 0x07f3, 0x07f8, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0x98f2, 0xb0f1, 0xb0f1, 0xb0f1, 0x78f0, 0x90f1, 0x80d1, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, 0x001f, 0x003f, 0x003f, 0x00bf, 0x311c, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x6278, 0x053f, 0x04ff, 0x04bf, 0x049f, 0x0696, 0x07f2, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x8912, 0xb0f1, 0xb0f1, 0xb0d1, 0x48f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0x003f, 0x003f, 0x003f, 0x00bf, 0x011f, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x79d6, 0x051f, 0x051f, 0x04ff, 0x04bf, 0x0638, 0x07f1, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0f1, 0x80f2, 0xb0f1, 0xb0f1, 0xb0f2, 0x3110, 0x30f0, 0x28cf, 0x28ef, 0x20ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0x003f, 0x003f, 0x001f, 0x009f, 0x00df, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9174, 0x049f, 0x057f, 0x051f, 0x04ff, 0x0619, 0x07f1, 0x07f6, 0x07fc, 0x07ff, 0x35bb, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x6912, 0xb0f1, 0xb0f1, 0x98f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00fa, 0x011a, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x68b7, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa8f3, 0x041f, 0x057f, 0x053f, 0x051f, 0x05f9, 0x07f0, 0x07f6, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x5912, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0x001f, 0x001f, 0x001f, 0x007f, 0x00bf, 0x009f, 0x90b5, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x0b9e, 0x053f, 0x057f, 0x053f, 0x05da, 0x07ef, 0x07f5, 0x07fb, 0x07ff, 0x5478, 0xb0d1, 0xb0f1, 0xb0f1, 0x9111, 0x5912, 0xa8f1, 0xb0f1, 0x70f1, 0x30f0, 0x28ef, 0x20ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x6098, 0xc0b1, 0xb8b1, 0xc0b1, 0xc0b1, 0x2afc, 0x04ff, 0x05bf, 0x055f, 0x05fb, 0x07cf, 0x07f4, 0x07fc, 0x07ff, 0x5c79, 0xb0f1, 0xb0f1, 0xb0f1, 0x8112, 0x5912, 0xb0f1, 0xb0f1, 0x68f1, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x005f, 0x7897, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0x6238, 0x04df, 0x05bf, 0x059f, 0x05fa, 0x07ce, 0x07f4, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x7112, 0x5912, 0xb0f1, 0xa8f1, 0x5110, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x28cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x007f, 0x6878, 0xb8b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x9954, 0x047f, 0x05bf, 0x05bf, 0x061a, 0x07ce, 0x07f2, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x6112, 0x5912, 0xa8f1, 0xa8f1, 0x60f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x003f, 0x001f, 0x7076, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x0bff, 0x05df, 0x05bf, 0x0639, 0x07cd, 0x07f2, 0x07fc, 0x07ff, 0x63f7, 0xb0f1, 0xb0f1, 0xb0f1, 0x4132, 0x4111, 0xa0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x001f, 0x001f, 0x9894, 0xb8d1, 0xb8d1, 0xb8d1, 0x42da, 0x059f, 0x05ff, 0x0678, 0x07cc, 0x07f1, 0x07fc, 0x07ff, 0x82b5, 0xa8f1, 0xb0f1, 0x98f2, 0x4132, 0x3912, 0x70f1, 0xa8f1, 0xa8f1, 0x50f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x183e, 0xb0d2, 0xb8d1, 0xb8d1, 0x9974, 0x059f, 0x061f, 0x0698, 0x07cc, 0x07f0, 0x07fc, 0x07ff, 0x82b5, 0xb0f1, 0xb0f1, 0x88f1, 0x4132, 0x4111, 0x3910, 0x98f1, 0xa8f2, 0x88f1, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x385b, 0xb8d1, 0xb8d1, 0xb8d1, 0x2c3c, 0x061f, 0x06b7, 0x07cb, 0x07f0, 0x07fb, 0x07ff, 0xb0f1, 0xb0f1, 0xa8f1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xa0f1, 0xa8f1, 0x48ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x7096, 0xb8d1, 0xb8d1, 0x8a35, 0x063f, 0x06d6, 0x07ea, 0x07f1, 0x07fc, 0x07ff, 0xa8f1, 0xa8f1, 0xa8f1, 0x6132, 0x4132, 0x4111, 0x38f1, 0x3110, 0x48f0, 0xa8f1, 0x98f1, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x98b4, 0xb8d1, 0xb8d1, 0x3c9b, 0x06f5, 0x07e9, 0x07f1, 0x07fd, 0x26bd, 0xb0f1, 0xb0f2, 0xb0f1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30f0, 0x60f0, 0xa911, 0x70f0, 0x20ce, 0x20cf, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x083f, 0x70f7, 0xb8d1, 0xa952, 0x0e94, 0x07c9, 0x07f2, 0x07fd, 0x2e3c, 0xa8f1, 0xa8f1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x58f0, 0xa8f1, 0x40cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x00f9, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x003f, 0x00df, 0x59f8, 0xb8d1, 0x8291, 0x07c9, 0x07f2, 0x07fe, 0x455a, 0xb0f1, 0xa8f1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x50cf, 0x48ef, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x031f, 0x2d3b, 0x99b2, 0x454b, 0x07f3, 0x07fe, 0x5498, 0xb0f1, 0xa8f1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x003f, 0x005f, 0x025f, 0x06fd, 0x0770, 0x0f88, 0x07f4, 0x07ff, 0x5478, 0xa8f1, 0xa8f1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x021f, 0x06fc, 0x078d, 0x07e7, 0x07f6, 0x07ff, 0x82b5, 0xa8f1, 0xa111, 0x4932, 0x4132, 0x4111, 0x38f1, 0x38f0, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x005f, 0x021f, 0x073b, 0x07ac, 0x07e7, 0x07f7, 0x07ff, 0x82b5, 0xa8f1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x10cf, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x023f, 0x073b, 0x07ab, 0x07e8, 0x07f9, 0x07ff, 0xa152, 0xa8f1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x005f, 0x007f, 0x009f, 0x023f, 0x0779, 0x07aa, 0x07e8, 0x07fb, 0x07ff, 0xa8f1, 0xa8f1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x0116, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdb0, 0xfdb0, 0xfdb1, 0xfdd1, 0xe4b2, 0xa911, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x02bf, 0x0778, 0x07c8, 0x07e9, 0x07fd, 0x173e, 0xa8f1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfdef, 0xfdf0, 0xfdf0, 0xfdf0, 0xfdf1, 0xfdf1, 0xecb1, 0xa0f1, 0xa911, 0xa911, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x005f, 0x007f, 0x009f, 0x009f, 0x041f, 0x0797, 0x07c7, 0x07eb, 0x07fe, 0x2e5c, 0xa8f1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0f, 0xfe30, 0xfe30, 0xfe30, 0xfe31, 0xfe31, 0xdc32, 0xa111, 0xa911, 0xa111, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x043f, 0x0794, 0x07e6, 0x07ec, 0x07fe, 0x35db, 0xa911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ac, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x00f8, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe50, 0xfe71, 0xfe51, 0xba52, 0xa111, 0xa111, 0x78d5, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x043f, 0x07b3, 0x07c5, 0x07ee, 0x07ff, 0x5478, 0x6ad6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f8, 0x18cf, 0x18ac, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe90, 0xfe91, 0xe471, 0xa111, 0xa112, 0xa111, 0x60d5, 0x001f, 0x283c, 0x7097, 0x405a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x00df, 0x045f, 0x07d2, 0x07e4, 0x07ef, 0x07ff, 0x2e3c, 0x2d1a, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x00f6, 0x0118, 0x00f7, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfeaf, 0xfed0, 0xfeb0, 0xfed1, 0xe491, 0xa911, 0xa111, 0x9931, 0xa111, 0x58d6, 0x88b5, 0xb8d1, 0xb8d1, 0x5059, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x00df, 0x047f, 0x07d2, 0x07e3, 0x07f1, 0x07ff, 0x07ff, 0x2cba, 0x4933, 0x4132, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f6, 0x0118, 0x0118, 0x18cf, 0x20ad, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x20ad, 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfed0, 0xfeb0, 0xfeb1, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x6933, 0xb0f1, 0xb0d1, 0xb0d1, 0x283c, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x011f, 0x047f, 0x07d1, 0x07e3, 0x07f3, 0x07ff, 0x07ff, 0x3b77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30ef, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cd, 0x18ac, 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfeb0, 0xfe90, 0xe471, 0xb8d2, 0xa111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xb0f1, 0xb0d1, 0xb0d2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x00df, 0x011f, 0x011f, 0x049f, 0x07f0, 0x07e2, 0x07f4, 0x07ff, 0x07ff, 0x3af6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ee, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfeb0, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xb0f1, 0xb0d1, 0x90b4, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x049f, 0x07f1, 0x07e2, 0x07f6, 0x07ff, 0x0f9f, 0x4a35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x18ce, 0x18ac, 0x20cc, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x18cc, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xe471, 0xb0d1, 0xa111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xb0d1, 0xb0d1, 0x7896, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x00bf, 0x011f, 0x011f, 0x013f, 0x017f, 0x04bf, 0x07f2, 0x07e2, 0x07f5, 0x07ff, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xa8f1, 0xa111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xb0d1, 0xb0d1, 0x5878, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00ff, 0x013f, 0x013f, 0x017f, 0x019f, 0x033f, 0x07f3, 0x07e2, 0x07f3, 0x07ff, 0xa8f1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x18cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xb0f1, 0xb0f1, 0x285c, 0x003f, 0x005f, 0x007f, 0x00bf, 0x00ff, 0x013f, 0x015f, 0x017f, 0x019f, 0x01bf, 0x02ff, 0x07f4, 0x07e3, 0x07f1, 0x2e5c, 0xa911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xb0f1, 0xb0d1, 0x087f, 0x009f, 0x00bf, 0x00df, 0x011f, 0x015f, 0x019f, 0x019f, 0x019f, 0x01df, 0x01df, 0x01ff, 0x07f7, 0x07e3, 0x07ef, 0x5498, 0xa8f1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xb0f1, 0x98f3, 0x00df, 0x00ff, 0x011f, 0x013f, 0x017f, 0x01bf, 0x01bf, 0x01df, 0x01df, 0x01ff, 0x01ff, 0x021f, 0x06d9, 0x07e5, 0x07ec, 0x7355, 0xa8f1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390f, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xa111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xa8f1, 0xb0f1, 0x80f5, 0x013f, 0x017f, 0x019f, 0x01bf, 0x01df, 0x01ff, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x023f, 0x057d, 0x07e8, 0x07e9, 0x82d5, 0xa0f1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38f0, 0x38ef, 0x30ef, 0x30ee, 0x28ce, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ad, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ce, 0x28ee, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ee, 0x38ef, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xa932, 0xa131, 0xb131, 0xc912, 0xc911, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0x5158, 0x01bf, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x021f, 0x023f, 0x025f, 0x025f, 0x025f, 0x025f, 0x041f, 0x07ed, 0x07e4, 0x7ab4, 0xa911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20cc, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ad, 0x28ce, 0x30ce, 0x30ce, 0x30ee, 0x8151, 0xb192, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d2, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x39bb, 0x021f, 0x023f, 0x025f, 0x027f, 0x027f, 0x025f, 0x025f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x029f, 0x07f3, 0x07e2, 0x9972, 0xa911, 0xa112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18cc, 0x18ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x18ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30cd, 0x28ee, 0x30ee, 0x490e, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f2, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d2, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0x123e, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x02df, 0x06b9, 0x07e3, 0xa111, 0xa911, 0xa111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390f, 0x38ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x18ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30ed, 0x692f, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc8f1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x9933, 0x02df, 0x02df, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02ff, 0x051e, 0x07e8, 0xa912, 0xa111, 0xa111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410f, 0x390f, 0x38ee, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x28ac, 0x20cc, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cd, 0x28ed, 0x28cd, 0x30cd, 0x9191, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc932, 0xc912, 0xc112, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8d1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88b4, 0x88b5, 0x88b5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x69d6, 0x033f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02ff, 0x035f, 0x03ff, 0x07f0, 0x8a4f, 0xa111, 0xa111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410f, 0x390f, 0x30ee, 0x30ee, 0x30cd, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cc, 0x20ac, 0x28cc, 0x28cc, 0x28cc, 0x20cc, 0x28cc, 0x28cc, 0x28cd, 0x40ee, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0x90d5, 0x88d6, 0x6098, 0x5879, 0x303c, 0x305c, 0x081e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x291c, 0x411a, 0x6118, 0x8915, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0x429a, 0x039f, 0x039f, 0x035f, 0x035f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x031f, 0x031f, 0x031f, 0x037f, 0x03ff, 0x06d7, 0x7acf, 0xa111, 0xa111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410f, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cc, 0x490e, 0xc1d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc952, 0x98f5, 0x60b8, 0x407b, 0x183e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x011f, 0x013f, 0x017f, 0x019f, 0x01df, 0x021f, 0x21fd, 0x49d9, 0x7996, 0xa112, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x139e, 0x03df, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x033f, 0x033f, 0x035f, 0x03bf, 0x041f, 0x05de, 0x7ad1, 0xa111, 0xa111, 0xa111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x692f, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc992, 0xc9b2, 0xc972, 0xb973, 0x80f7, 0x387b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01bf, 0x01ff, 0x023f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x2adc, 0x5a58, 0x8994, 0xa8f1, 0xa8f1, 0x81d4, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x039f, 0x037f, 0x035f, 0x037f, 0x039f, 0x03ff, 0x047f, 0x04ff, 0x6375, 0xa112, 0xa111, 0xa111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390f, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x692e, 0xc9f3, 0xc9d2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc993, 0x80f7, 0x389b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x083c, 0x085b, 0x105b, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187a, 0x105b, 0x085d, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x01bf, 0x01ff, 0x021f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03df, 0x041f, 0x043f, 0x0c3f, 0x2bbc, 0x0c3f, 0x045f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03bf, 0x039f, 0x037f, 0x039f, 0x03df, 0x043f, 0x04bf, 0x053f, 0x5398, 0xa111, 0xa111, 0xa111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cb, 0x614e, 0xd1f3, 0xc9f3, 0xc9d3, 0xc9b2, 0xc9b3, 0xb173, 0x60d9, 0x081e, 0x003d, 0x083b, 0x1878, 0x1877, 0x28d2, 0x28d2, 0x40ee, 0x38ee, 0x390f, 0x390f, 0x390f, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4130, 0x38f3, 0x28b6, 0x189a, 0x003e, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x027f, 0x029f, 0x02ff, 0x033f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x047f, 0x04bf, 0x04df, 0x04df, 0x04bf, 0x04bf, 0x047f, 0x047f, 0x043f, 0x043f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03df, 0x043f, 0x047f, 0x04df, 0x057f, 0x3c1a, 0xa111, 0xa111, 0xa111, 0xa111, 0x5931, 0x4910, 0x4110, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x20cb, 0x28ab, 0x692e, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xb1b2, 0x58f3, 0x1895, 0x28b2, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x492f, 0x4930, 0x4910, 0x38f3, 0x20b8, 0x087d, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x019f, 0x01df, 0x021f, 0x025f, 0x02bf, 0x02df, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x04ff, 0x051f, 0x051f, 0x053f, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x047f, 0x047f, 0x045f, 0x045f, 0x043f, 0x041f, 0x03ff, 0x03df, 0x03ff, 0x043f, 0x045f, 0x04bf, 0x053f, 0x05bf, 0x2cdc, 0xa112, 0xa111, 0xa111, 0xa111, 0x7131, 0x4930, 0x4130, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28cb, 0x28cb, 0x612e, 0xc9f3, 0xc9d3, 0xc9d3, 0xb992, 0x692e, 0x28cc, 0x28ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x390e, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x38ee, 0x40ee, 0x40ee, 0x390f, 0x390e, 0x410e, 0x40ef, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4910, 0x4910, 0x4930, 0x4113, 0x28f8, 0x08fe, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x029f, 0x02bf, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x051f, 0x053f, 0x057f, 0x059f, 0x057f, 0x055f, 0x053f, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x049f, 0x047f, 0x045f, 0x043f, 0x041f, 0x041f, 0x043f, 0x045f, 0x04bf, 0x04ff, 0x055f, 0x05df, 0x0e1f, 0xa111, 0xa111, 0xa111, 0xa112, 0x8931, 0x4930, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x20cb, 0x612e, 0xd1f3, 0xc9f3, 0xc1b2, 0x612e, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197a, 0x01de, 0x021f, 0x027f, 0x02bf, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03ff, 0x045f, 0x049f, 0x04df, 0x051f, 0x057f, 0x059f, 0x05df, 0x05df, 0x05df, 0x05bf, 0x059f, 0x055f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04bf, 0x047f, 0x045f, 0x043f, 0x043f, 0x047f, 0x04bf, 0x04ff, 0x053f, 0x05bf, 0x061f, 0x069f, 0x9972, 0xa111, 0xa111, 0xa111, 0xa111, 0x5130, 0x4910, 0x410f, 0x390f, 0x390e, 0x38ed, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x510d, 0xd1f3, 0xc9d2, 0x816f, 0x30cc, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31b6, 0x0a9d, 0x02ff, 0x035f, 0x039f, 0x03ff, 0x043f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x05bf, 0x05df, 0x061f, 0x063f, 0x063f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x047f, 0x047f, 0x047f, 0x049f, 0x04df, 0x053f, 0x057f, 0x05ff, 0x065f, 0x06df, 0x7a95, 0xa111, 0xa111, 0xa111, 0xa111, 0x6911, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x40ec, 0xc1d2, 0xc1b3, 0x490d, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39d5, 0x131c, 0x041f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x059f, 0x05df, 0x061f, 0x067f, 0x069f, 0x069f, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x051f, 0x057f, 0x05bf, 0x063f, 0x069f, 0x071f, 0x5438, 0xa111, 0xa111, 0xa111, 0xa111, 0x8111, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x30cb, 0xa992, 0xa9b1, 0x30cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3a15, 0x237b, 0x053f, 0x059f, 0x5358, 0x349b, 0x0e1f, 0x06bf, 0x06ff, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x057f, 0x055f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04ff, 0x051f, 0x055f, 0x059f, 0x05ff, 0x065f, 0x06df, 0x073f, 0x359b, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x4930, 0x4910, 0x412f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x692f, 0x816f, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28cb, 0x28cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49d4, 0x243a, 0xa132, 0xa8f1, 0xa8f1, 0xa8f1, 0x8295, 0x8295, 0x5418, 0x351b, 0x06df, 0x069f, 0x067f, 0x065f, 0x063f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x051f, 0x053f, 0x057f, 0x059f, 0x05df, 0x063f, 0x069f, 0x06ff, 0x077f, 0x0f5f, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0x6911, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ee, 0x38ed, 0x38ed, 0x390e, 0x390e, 0x390e, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa172, 0x4c39, 0x2d5c, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x059f, 0x057f, 0x055f, 0x055f, 0x055f, 0x057f, 0x059f, 0x05df, 0x061f, 0x067f, 0x06df, 0x073f, 0x079f, 0x07df, 0x8254, 0xa111, 0xa131, 0xa111, 0x9911, 0x8131, 0x4910, 0x410f, 0x410e, 0x38ee, 0x38ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xa111, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa111, 0xa911, 0xa0f1, 0x9972, 0x4419, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05df, 0x061f, 0x065f, 0x06bf, 0x06ff, 0x075f, 0x07bf, 0x07ff, 0x5498, 0xa131, 0xa111, 0xa111, 0xa111, 0x9911, 0x4930, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x28cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x490f, 0x412f, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa111, 0x7a55, 0x34bb, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x063f, 0x065f, 0x069f, 0x06df, 0x071f, 0x077f, 0x07bf, 0x07ff, 0x2e3c, 0x9911, 0xa111, 0xa111, 0x9931, 0x9931, 0x6910, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x62f6, 0x347b, 0x061f, 0x061f, 0x063f, 0x063f, 0x065f, 0x067f, 0x06bf, 0x071f, 0x073f, 0x079f, 0x07df, 0x07ff, 0x07ff, 0xa111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x349b, 0x065f, 0x067f, 0x069f, 0x06bf, 0x06ff, 0x073f, 0x077f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0xa111, 0x9911, 0xa111, 0x9931, 0x9931, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa911, 0xa112, 0xa111, 0xa911, 0xa111, 0xa112, 0xa0f1, 0xa111, 0xa111, 0xa111, 0x7a75, 0x15fd, 0x06bf, 0x06ff, 0x071f, 0x075f, 0x079f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410f, 0x390e, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x40ee, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x5931, 0x90f1, 0xa911, 0xa912, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0x9972, 0x353b, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x8111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa112, 0xa111, 0xa111, 0x4499, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9931, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490f, 0x410f, 0x38ee, 0x30ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x28ab, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x310e, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x7131, 0xa111, 0xa111, 0xa112, 0xa111, 0xa0f1, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa131, 0x6397, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390f, 0x38ee, 0x38ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x38ee, 0x30ed, 0x38ed, 0x390e, 0x38ee, 0x410e, 0x410f, 0x410f, 0x4930, 0x4930, 0x6931, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x6397, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x5c14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410f, 0x390e, 0x390e, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x30ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0x9931, 0x5498, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x35f5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510f, 0x390e, 0x390e, 0x38ed, 0x30ed, 0x30cc, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x28cb, 0x20cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xa111, 0xa111, 0xa111, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa111, 0xa111, 0x3d7a, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28ab, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28cb, 0x20ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x9192, 0x1ebd, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x7a71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20ab, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ac, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cc, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x28ce, 0x28ce, 0x28ce, 0x28ee, 0x28ce, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ef, 0x390f, 0x390f, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xa111, 0xa111, 0xa111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07ff, 0x07ff, 0x07fd, 0x07f6, 0x5c32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390f, 0x30ef, 0x30ef, 0x30ee, 0x30ce, 0x28cd, 0x28ee, 0x28ed, 0x28cd, 0x20cd, 0x20ac, 0x20cd, 0x20cd, 0x20ad, 0x20cd, 0x20ad, 0x20cc, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, + 0x18d2, 0x10f2, 0x18d2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x20f2, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xa111, 0xa111, 0x9931, 0x9911, 0xa111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5c38, 0x07ff, 0x07fd, 0x07f6, 0x44f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x1912, 0x18f2, 0x20f3, 0x18f2, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, + 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28f3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xa111, 0xa112, 0xa111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2e5c, 0x07fc, 0x07f6, 0x2e53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20f3, 0x2112, 0x20f3, 0x20d3, 0x1912, 0x18f2, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, + 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x365e, 0x2e5d, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3d, 0x363d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x361d, 0x361d, 0x361d, 0x361d, 0x361d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1e, 0x461e, 0x461d, 0x4dfe, 0x4dfd, 0x4e3e, 0x4dfe, 0x55dd, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7a74, 0x07fb, 0x07f6, 0x07f6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4cfb, 0x3dfe, 0x35dd, 0x35dd, 0x2ddd, 0x2ddd, 0x2ddd, 0x2ddd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25dc, 0x25bd, 0x25bd, 0x25bd, 0x1dbd, 0x25bc, 0x1dbd, 0x1dbd, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, + 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2ddd, 0x2d5d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2dbd, 0x2dbd, 0x2cfd, 0x2d1d, 0x251c, 0x251c, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3d1d, 0x451d, 0x451d, 0x451d, 0x4d1d, 0x4d1d, 0x553d, 0x91b3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa112, 0x9931, 0x9931, 0x5496, 0x07f7, 0x07f7, 0x8a13, 0xa111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34dd, 0x34dd, 0x2cdd, 0x2cdc, 0x2cdd, 0x2cbc, 0x24dc, 0x24bc, 0x24bc, 0x253c, 0x25bd, 0x253c, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, + 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b7c, 0x259d, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x245d, 0x259c, 0x22fc, 0x2afc, 0x231c, 0x2afc, 0x22fc, 0x231c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2afc, 0x2b1c, 0x2b1c, 0x2b1c, 0x331c, 0x331c, 0x331c, 0x331c, 0x331c, 0x3b1c, 0x3b3d, 0x3b3d, 0x3b3d, 0x433c, 0x433d, 0x4b3d, 0x435d, 0x5a9a, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07f9, 0x72d4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331c, 0x32fc, 0x2afb, 0x2afc, 0x2afb, 0x22fb, 0x22dc, 0x22dc, 0x22fb, 0x22db, 0x22db, 0x235c, 0x1d5c, 0x1d1d, 0x231b, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, + 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x243c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x259c, 0x247c, 0x23bc, 0x23bc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23bc, 0x23bc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x33dc, 0x33dc, 0x33dc, 0x33dc, 0x3bdc, 0x3bfc, 0x3bfc, 0x3bdc, 0x43fc, 0x43fd, 0x6b18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6b53, 0x07fa, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbb, 0x23bb, 0x23bb, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bdb, 0x1d5c, 0x1d1c, 0x1b9b, 0x1b9b, 0x139b, 0x139c, 0x1b9b, 0x1b7b, 0x1b7b, 0x139b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b9b, 0x139b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, + 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1b9c, 0x1bdc, 0x1bbb, 0x1c5b, 0x1cfb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1d3c, 0x1cbc, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9c, 0x1b9c, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9c, 0x1b9b, 0x1bbb, 0x239b, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbc, 0x33bc, 0x33bc, 0x33dc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4c98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4b19, 0x23bc, 0x239b, 0x239b, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x14bb, 0x151b, 0x13db, 0x137b, 0x137a, 0x137b, 0x137b, 0x137a, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, + 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19da, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19db, 0x19da, 0x19db, 0x19fb, 0x153c, 0x123a, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x11db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x19db, 0x19ba, 0x11da, 0x11ba, 0x1abb, 0x14fb, 0x1a5b, 0x19ba, 0x19ba, 0x11da, 0x11da, 0x19db, 0x19db, 0x19da, 0x19db, 0x19ba, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x21db, 0x21db, 0x21db, 0x21fb, 0x21fb, 0x29fb, 0x29fb, 0x29fb, 0x29fb, 0x31fb, 0x321b, 0x31fb, 0x321b, 0x41fa, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72d4, 0x4c98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21db, 0x21da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11d9, 0x137a, 0x149b, 0x131a, 0x11ba, 0x119a, 0x11b9, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, + 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133a, 0x135b, 0x135a, 0x135b, 0x135b, 0x149b, 0x13fb, 0x133a, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x133a, 0x135a, 0x133a, 0x143b, 0x147b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133a, 0x135b, 0x133b, 0x133b, 0x1b3b, 0x1b5b, 0x1b5b, 0x1b3b, 0x1b5b, 0x235b, 0x235b, 0x235b, 0x235b, 0x2b5b, 0x2b5b, 0x2b7b, 0x2b7b, 0x335b, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72d5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71b4, 0x1b3b, 0x1b3b, 0x133a, 0x133b, 0x133a, 0x131a, 0x131a, 0x131a, 0x131a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0afa, 0x0b1a, 0x0afa, 0x0bda, 0x0cbb, 0x0bda, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, + 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b7a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bda, 0x0c7b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x131a, 0x131a, 0x131a, 0x131a, 0x131a, 0x1b1a, 0x1b3a, 0x1b3a, 0x1b3a, 0x1b3a, 0x233a, 0x233a, 0x233b, 0x2b3b, 0x2b5b, 0x3ad9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1b1a, 0x131a, 0x131a, 0x12fa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x035a, 0x045a, 0x0c3a, 0x0afa, 0x02da, 0x0afa, 0x0af9, 0x02f9, 0x0afa, 0x0afa, 0x0afa, 0x02d9, 0x02d9, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0bfa, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0bda, 0x02d9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199a, 0x1999, 0x2199, 0x219a, 0x21ba, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01d8, 0x0399, 0x0399, 0x01d9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, + 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02b9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01d8, 0x03f9, 0x01f8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03f9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03f9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03b9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01b7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0af8, 0x0af8, 0x0af8, 0x0af8, 0x0b18, 0x0b18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1b18, 0x2af8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0af8, 0x0af8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x0378, 0x0378, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d8, + 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01f7, 0x0358, 0x0196, 0x0196, 0x01b6, 0x0196, 0x01b6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02f7, 0x02f7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01b6, 0x01b6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09b7, 0x0997, 0x09b7, 0x09b7, 0x09b7, 0x11b7, 0x11b7, 0x11d7, 0x11b7, 0x11b7, 0x11b7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09b6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02b7, 0x0337, 0x0216, 0x0196, 0x0196, + 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f5, 0x00d5, 0x00d5, 0x00d6, 0x00d6, 0x00d5, 0x00f5, 0x02f7, 0x0176, 0x00f5, 0x00d5, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x0116, 0x02f7, 0x01d6, 0x00d6, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x08f6, 0x08f6, 0x08f6, 0x08f6, 0x0916, 0x0916, 0x10f6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08f5, 0x08f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x01d6, 0x02f7, 0x0236, 0x0114, + 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01f5, 0x0235, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x0154, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x08d4, 0x08d4, 0x08d4, 0x08f4, 0x08f4, 0x08f4, 0x08f5, 0x10f4, 0x10d5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00d3, 0x00d3, 0x0214, 0x0295, + 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x0293, 0x00d2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0172, 0x0253, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x08b2, 0x08b2, 0x08b2, 0x08d2, 0x08b2, 0x08d2, 0x08d3, 0x10d3, 0x40f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00d2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0131, + 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x0171, 0x0091, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x01d1, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f1, 0x0171, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00b0, 0x00b0, 0x00b1, 0x08b1, 0x08b0, 0x08b1, 0x08b1, 0x50f1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, + 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00f0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f0, 0x0232, 0x00f1, 0x00b0, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0890, 0x08b0, 0x0891, 0x10b0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0191, 0x01b1, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x006f, 0x008f, 0x0131, 0x0232, 0x00d0, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60f1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006f, 0x0090, 0x006f, 0x008f, 0x008f, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00cf, 0x0232, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x0191, 0x0212, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x18af, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9931, 0xa111, 0x29d2, 0x01b1, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x01d1, 0x0130, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x01f1, 0x01b1, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28d0, 0x01f2, 0x01d1, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0110, 0x01f1, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x0110, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x48d0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008e, 0x008f, 0x01b1, 0x01f2, 0x00af, 0x006f, 0x006e, 0x008f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x108f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006e, 0x006f, 0x006e, 0x0190, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0170, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01f1, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x68f0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0211, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01b1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x38b0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x010f, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x01d1, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x008e, 0x01f1, 0x012f, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x086e, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0211, 0x0190, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004d, 0x004d, 0x004e, 0x010f, 0x01d1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x00ce, 0x0212, 0x00ce, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x70f0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x008e, 0x01d1, 0x0190, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006e, 0x01f1, 0x008e, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x010f, 0x01f1, 0x006d, 0x006d, 0x004d, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004e, 0x006d, 0x006d, 0x004d, 0x40cf, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70f0, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0191, 0x01b1, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp new file mode 100644 index 0000000000..cff7c0b0a7 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp @@ -0,0 +1,350 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint16_t marlin_logo_480x320x16[153600] = { + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x10ae, 0x00f8, 0x00f9, 0x00d6, 0x18ad, 0x188c, 0x188c, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x188d, 0x188d, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ac, 0x18ac, 0x188d, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x18ac, 0x18ac, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x18ab, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x10ae, 0x00f7, 0x00f9, 0x00f6, 0x188d, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x188d, 0x18ac, 0x18ac, 0x188d, 0x188d, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x10af, 0x00f8, 0x00f8, 0x00f7, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188d, 0x18ac, 0x18ad, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x10af, 0x00f7, 0x00f8, 0x00f6, 0x18ad, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x10af, 0x00f8, 0x00f9, 0x00d6, 0x18ad, 0x18ad, 0x188c, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x188d, 0x18ac, 0x18ad, 0x18af, 0x00f8, 0x00f9, 0x00f6, 0x18ae, 0x188d, 0x18ac, 0x188d, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x10d3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x188c, 0x18ac, 0x188d, 0x10af, 0x00f8, 0x0119, 0x00d7, 0x18ae, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, + 0x188b, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, + 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, + 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x08b2, 0x08d2, + 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x00f8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08f6, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f8, 0x00f8, + 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0117, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x00f9, 0x00f9, + 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x0119, 0x00f6, 0x10f2, 0x10d1, 0x10d0, 0x10d1, 0x10d3, 0x08f6, 0x00f9, 0x00f9, 0x0119, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f8, 0x00f8, + 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18d0, 0x0118, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18cd, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x00f9, 0x00f8, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08d5, 0x011a, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x00f9, 0x00f8, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0118, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f9, 0x0119, 0x011a, 0x0119, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x188c, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0118, 0x0119, 0x0119, 0x0118, 0x10d1, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f3, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x011a, 0x0119, 0x08f3, 0x10d1, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f7, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x10d0, 0x10f4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x0117, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x08f5, 0x0139, 0x00fa, 0x011a, 0x0119, 0x08f5, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x08f4, 0x20ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08d4, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x00f7, 0x011a, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x00f9, 0x00f9, + 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0118, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x0118, 0x0119, 0x08f7, 0x10d1, 0x10d1, 0x00f7, 0x0119, 0x0118, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x00f6, 0x011a, 0x08f3, 0x18ae, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08d4, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x00f7, 0x011a, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d1, 0x18cd, 0x18ad, 0x10d1, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f4, 0x011a, 0x011a, 0x10f1, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d0, 0x18ae, 0x08d5, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f7, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x10d0, 0x10f4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x0117, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10f2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x10b1, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, + 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0118, 0x0119, 0x00f7, 0x10d1, 0x10d1, 0x00f7, 0x0119, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, + 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10f1, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10f1, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08d5, 0x011a, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, + 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x10d1, 0x00f8, 0x0119, 0x0119, 0x00f8, 0x10d1, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0118, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d3, 0x10d3, + 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x0119, 0x00f6, 0x10f2, 0x10d1, 0x10d0, 0x10d1, 0x10d3, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d2, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x011a, 0x08f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x013a, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cf, 0x0119, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08f5, 0x10d1, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x10d2, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x08d5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x011a, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d0, 0x10d3, 0x08f4, 0x08f3, 0x08f3, 0x10f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x10d3, 0x10d3, 0x08f3, 0x08f3, 0x08d4, 0x10d3, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cf, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18cd, 0x10f3, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, + 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d1, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ae, 0x18ae, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f4, + 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18cd, 0x18af, 0x0119, 0x011a, 0x00f9, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, + 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, + 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x10d2, + 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x00f9, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x00f9, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x08d3, 0x18ad, 0x18ad, 0x08d3, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d3, 0x18ad, + 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10b0, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0139, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x20ce, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0139, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, + 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0116, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x10d1, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, + 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00fa, 0x18d1, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10f3, 0x08d3, 0x10d2, 0x0117, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0116, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18af, 0x00f8, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x00f9, 0x18ad, 0x18ae, 0x208d, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18af, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18cd, 0x20ad, 0x18ae, 0x18ae, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x08f6, 0x0119, 0x0119, 0x011a, 0x0119, 0x0116, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cf, 0x00f9, 0x011a, 0x08f5, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x00f8, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, + 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18cf, + 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x18d0, 0x18ad, + 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ae, + 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00fa, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, + 0x08f7, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x10f3, 0x08f3, 0x10d3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x10f2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f3, 0x0119, 0x0119, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x310e, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18d0, + 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x28ee, 0x8252, 0xcb54, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, + 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x394f, 0xb313, 0xd395, 0x7211, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x496f, 0xcb55, 0xd395, 0xbb54, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x00f7, + 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00fa, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x61d0, 0xd395, 0xd395, 0xd395, 0x69f1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x011a, 0x00f7, 0x18ae, + 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x61d0, 0xd395, 0xd395, 0xd396, 0xd375, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, + 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, + 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10f2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8252, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, + 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x08f7, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x5190, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x412f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x10f3, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0355, 0x190f, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f4, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x496f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x011a, 0x0117, 0x0117, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18b0, 0x0119, 0x00f9, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x11d1, 0x03b7, 0x0a93, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x28ee, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9ab3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x00f9, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x10af, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x10d0, 0x0118, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x10f2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x7a31, 0xd395, 0xd395, 0xd375, 0xdb95, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f4, 0x10d2, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x00fa, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11d1, 0x03b8, 0x03b7, 0x03b8, 0x0a94, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x00f9, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xd395, 0xb313, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x190e, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0xa2d3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xa2d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a94, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x61d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ce, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0397, 0x03b8, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x59d0, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x011a, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x011a, 0x10d2, 0x18cd, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x61b1, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8a92, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x188d, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0xaad3, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03d7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0x7231, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x08d3, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x20ae, 0x8a92, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x7a31, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x28ee, 0xc374, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xa2d3, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ce, 0x194f, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x61d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x69f1, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x011a, 0x00f9, 0x08f7, 0x18ce, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x02f5, 0x03b7, 0x03b8, 0x0356, 0x114f, 0x18ad, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x9ab3, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x0a32, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0356, 0x18ad, 0x18ad, 0x0a32, 0x03b7, 0x03b8, 0x03b8, 0x03b8, 0x0376, 0x18ee, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x00f9, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x190f, 0x0377, 0x0397, 0x03b8, 0x0398, 0x0397, 0x0b77, 0x18ce, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0bb7, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x4970, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ee, 0x0377, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a33, 0x190e, 0x0397, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x11d1, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11b0, 0x0a93, 0x0356, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x1253, 0x0b78, 0x0b98, 0x0b78, 0x0b98, 0x0b98, 0x1378, 0x11f2, 0x18ad, 0x18ad, 0x0b98, 0x0b78, 0x0b78, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0b98, 0x1378, 0x0b78, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x4970, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0x8252, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x0377, 0x0ad4, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x02f5, 0x18ae, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x192f, 0x03b7, 0x03b7, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1ab5, 0x1b78, 0x1b58, 0x1358, 0x1b78, 0x1378, 0x1358, 0x1a13, 0x18ae, 0x18ae, 0x1358, 0x1358, 0x1378, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1358, 0x1358, 0x1358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd395, 0xc354, 0x5990, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0356, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x194f, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f8, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f9, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1a54, 0x1b38, 0x1b38, 0x2338, 0x1b38, 0x1b58, 0x2338, 0x21d2, 0x18ad, 0x18ad, 0x2338, 0x2338, 0x2358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x2339, 0x2358, 0x2338, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xa2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x1170, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x0a53, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0396, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x2150, 0x2b18, 0x2b39, 0x2b18, 0x2b19, 0x2b19, 0x2af8, 0x18ce, 0x18ad, 0x18ad, 0x2b19, 0x2b18, 0x2b19, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x2192, 0x2b19, 0x2b19, 0x2b18, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xbb34, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0af5, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0377, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x11b0, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x0117, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x10cf, 0x0118, 0x0119, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2192, 0x2b19, 0x3319, 0x32f9, 0x2a15, 0x18ef, 0x20ad, 0x18ad, 0x18ad, 0x32f9, 0x3319, 0x32f9, 0x18ad, 0x18ad, 0x18ad, 0x2191, 0x3319, 0x2af9, 0x3319, 0x2af9, 0x2a97, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x190f, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x11d1, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x18d0, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x3ad9, 0x3ad9, 0x3ad9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x3af9, 0x3ad9, 0x3ad9, 0x18ad, 0x20ad, 0x3215, 0x3ad9, 0x3af9, 0x3ada, 0x3ad9, 0x3277, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x4950, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xaab3, 0x20ce, 0x18ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x03b7, 0x0397, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0ad5, 0x0397, 0x0398, 0x03b8, 0x0398, 0x03b8, 0x18ee, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0398, 0x0398, 0x03b8, 0x0398, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x0398, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0139, 0x011a, 0x0117, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x42d9, 0x42b9, 0x42b9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x42b9, 0x42b9, 0x42ba, 0x18ae, 0x31f5, 0x42da, 0x42d9, 0x42b9, 0x42d9, 0x3a77, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x5991, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xd355, 0x9252, 0x30ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, 0x2338, 0x2338, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x2150, 0x2318, 0x2338, 0x2338, 0x2318, 0x2318, 0x2338, 0x21f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2339, 0x2318, 0x2318, 0x2339, 0x2338, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2338, 0x2338, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x00f7, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x4ab9, 0x4a9a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4aba, 0x4aba, 0x4a9a, 0x4257, 0x4a99, 0x4a9a, 0x4a9a, 0x4aba, 0x4237, 0x20ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x69f1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xcb14, 0x4130, 0x20af, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x42b9, 0x4a99, 0x42b9, 0x42ba, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4257, 0x4aba, 0x4a9a, 0x4a99, 0x42b9, 0x4a9a, 0x42b9, 0x4a9a, 0x20ef, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a9a, 0x42b9, 0x42b9, 0x4aba, 0x4ab9, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x42b9, 0x4aba, 0x4a99, 0x4a99, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x527a, 0x527a, 0x527a, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x527a, 0x527a, 0x529a, 0x527a, 0x527a, 0x527a, 0x527a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18d2, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x8253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0x7a11, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x621a, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x6a3b, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x3932, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x59d7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a1b, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x011a, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x20ae, 0x08f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x5a5b, 0x5a5a, 0x5a7a, 0x2910, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x5a5a, 0x5a7b, 0x5a5a, 0x5a5a, 0x5a5a, 0x5a5a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x091a, 0x18f2, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x8232, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xa293, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x89bc, 0x89bc, 0x91bc, 0x89bc, 0x899c, 0x89bc, 0x89bc, 0x89bb, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x899b, 0x89bc, 0x89bc, 0x89bc, 0x799a, 0x7179, 0x89bb, 0x899c, 0x89bc, 0x89bc, 0x38f1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x899c, 0x899c, 0x89bc, 0x89bc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x89bc, 0x899c, 0x89bc, 0x899c, 0x89bc, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0117, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x623a, 0x623b, 0x625a, 0x621a, 0x2910, 0x18cd, 0x18ad, 0x18ad, 0x623b, 0x623a, 0x625a, 0x623b, 0x623b, 0x51f8, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x0917, 0x18d2, 0x18d2, 0x0918, 0x091a, 0x0918, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30d0, 0x30f0, 0x30f0, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0x9253, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xb11d, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x60f5, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0x60f5, 0x40d1, 0xb11d, 0xb13d, 0xa93d, 0xa93d, 0x991b, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xa93d, 0xa93d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x00f7, 0x00f7, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x59d8, 0x6a1b, 0x6a1b, 0x6a1b, 0x6a1b, 0x4133, 0x18ad, 0x18ad, 0x6a3b, 0x6a1b, 0x6a1b, 0x6a1b, 0x51b6, 0x20cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d3, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18d1, 0x20ce, 0x20ce, 0x18d1, 0x093a, 0x093a, 0x28ef, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x9273, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0xd335, 0xd334, 0xd334, 0xd314, 0xd315, 0xaa93, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd09e, 0xd0be, 0xd0be, 0x18ad, 0x18ad, 0x18ad, 0x30b0, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x20ae, 0x18ad, 0xb8bc, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x68b5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ce, 0x61b8, 0x721b, 0x71fb, 0x721b, 0x721b, 0x4133, 0x20ad, 0x71fb, 0x721b, 0x71fb, 0x4174, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x011a, 0x18d1, 0x20ae, 0x20ce, 0x20f1, 0x093a, 0x093a, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0xaaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ae, 0x20ad, 0x20ad, 0x20ae, 0x30ee, 0x6150, 0x81b1, 0xa1f2, 0xc233, 0xca53, 0xca54, 0xca53, 0xc233, 0xa1f2, 0x8191, 0x512f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0x18ad, 0x20ad, 0x18ad, 0xb079, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xa058, 0x18ad, 0x18ad, 0x7095, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xe83e, 0x28ae, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf01f, 0xf03f, 0xf03f, 0xf03f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d0, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ce, 0x69b9, 0x81fb, 0x79db, 0x79dc, 0x81fc, 0x5976, 0x79db, 0x79dc, 0x81dc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0918, 0x0119, 0x0917, 0x18d0, 0x20d0, 0x0917, 0x093a, 0x1138, 0x28cf, 0x30cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0xaad4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd315, 0xd314, 0x69b2, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x410f, 0x6990, 0x99f2, 0xc253, 0xca74, 0xd274, 0xca74, 0xd253, 0xca53, 0xca53, 0xca53, 0xd233, 0xd253, 0xca53, 0xd233, 0xca33, 0xc213, 0x8991, 0x410f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0119, 0x011a, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x7199, 0x89db, 0x89bc, 0x81bc, 0x89bc, 0x89bc, 0x89bc, 0x89bc, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d2, 0x0119, 0x0119, 0x093a, 0x093a, 0x093a, 0x093a, 0x20f2, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xcad4, 0x5971, 0x30f0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x38ef, 0x79b1, 0xba53, 0xca94, 0xca94, 0xca74, 0xd273, 0xd273, 0xca73, 0xca54, 0xca53, 0xca54, 0xca53, 0xca33, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xd213, 0xca13, 0xca13, 0xa1b2, 0x490f, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x7979, 0x919c, 0x919c, 0x91bc, 0x919c, 0x899c, 0x89bc, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x18f2, 0x0919, 0x091a, 0x091a, 0x0919, 0x20f3, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x4112, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd314, 0xd2f5, 0xd2f4, 0xd2f4, 0x4930, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x4130, 0x89f1, 0xd294, 0xd294, 0xca93, 0xca74, 0xd274, 0xca74, 0xca74, 0xca53, 0xca73, 0xd253, 0xd254, 0xca53, 0xca53, 0xca54, 0xc274, 0x9b36, 0x83b8, 0x6419, 0x6c39, 0x6439, 0x6c1a, 0x8b57, 0xb295, 0xca13, 0x9191, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cf, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x28ae, 0x8159, 0x917c, 0x997c, 0x997c, 0x999c, 0x999c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20d0, 0x20d1, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd2f4, 0xd2f4, 0xd315, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d5, 0x79d2, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28ef, 0x28f0, 0x28cf, 0x5150, 0xaa32, 0xd293, 0xd294, 0xd294, 0xca93, 0xca74, 0xca74, 0xca74, 0xca74, 0xd274, 0xd254, 0xca53, 0xca54, 0xb2d5, 0x83b8, 0x44fc, 0x1dbe, 0x063f, 0x0cdb, 0x0b76, 0x1377, 0x1377, 0x0b76, 0x1356, 0x0b76, 0x0b77, 0x23f8, 0x6991, 0x510f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x8939, 0xa17c, 0xa17c, 0xa15d, 0xa15d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8a54, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0x5951, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x4130, 0x91f2, 0xd294, 0xd294, 0xca94, 0xca74, 0xca94, 0xca94, 0xca74, 0xd274, 0xd274, 0xd274, 0xd253, 0xb2d5, 0x7419, 0x257d, 0x063f, 0x061f, 0x057d, 0x12b5, 0x190f, 0x18ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x913a, 0xa93d, 0xa95d, 0xa95c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xcab4, 0x5172, 0x3911, 0x38f1, 0x38f0, 0x30f0, 0x81d2, 0xc294, 0xd294, 0xd293, 0xd294, 0xd294, 0xca93, 0xca93, 0xd274, 0xd274, 0xca73, 0xd274, 0x83d8, 0x353d, 0x061f, 0x063f, 0x063f, 0x063f, 0x4c5a, 0x4970, 0x20ae, 0x20ae, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xb11d, 0xb11d, 0xb11d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6b36, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xcad4, 0xcab4, 0x5972, 0x3911, 0x5151, 0xb253, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xd274, 0xc294, 0x645a, 0x1dbe, 0x063f, 0x063f, 0x063f, 0x1dbe, 0x6459, 0xc274, 0x99d2, 0x28ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0xb8fe, 0xb8fd, 0xb8fe, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253b, 0x465c, 0x6d7b, 0x6d9a, 0x6d9a, 0x6d7a, 0x84f9, 0x9c78, 0x9c77, 0x9c78, 0x9c78, 0x9c57, 0x9c78, 0x9c58, 0x9c58, 0xbbb6, 0xd334, 0xd315, 0xd334, 0xd315, 0xd314, 0xd315, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xcad4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2d4, 0x91f3, 0x5972, 0xca74, 0xd2b4, 0xd2b4, 0xd294, 0xca94, 0xd294, 0xd294, 0xca94, 0xca74, 0xc2b4, 0x6c5a, 0x0dff, 0x063f, 0x063f, 0x063f, 0x353d, 0x83b8, 0xca53, 0xca33, 0x89b1, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0xc0de, 0xc0fe, 0xc0dd, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00fa, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x38f1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4d1a, 0x6d9a, 0x94b9, 0x9c98, 0x9c77, 0x9c78, 0x9c78, 0x9c78, 0x94b8, 0x6d7a, 0x6d7a, 0x6d7b, 0x367c, 0x367d, 0x1efe, 0x077f, 0x075f, 0x1ede, 0x363d, 0x6d3a, 0x9c17, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xcad4, 0xd2b3, 0xcab4, 0xc294, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca74, 0xca74, 0xca74, 0x7bd8, 0x0dff, 0x063f, 0x061f, 0x063f, 0x4cbb, 0x9b57, 0xd233, 0xca33, 0xca53, 0x6150, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x20ae, 0x10d2, 0x10d3, 0x08f3, 0x08f3, 0x18d0, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x08f3, 0x18d0, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d1, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d1, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x08f3, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8be, 0xc8de, 0xc8be, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xa2b5, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xbb96, 0xa437, 0x74f9, 0x4dbc, 0x2e7e, 0x0edf, 0x559b, 0x8498, 0xc335, 0xd2f4, 0xd2d4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2b5, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xbab4, 0xbaf6, 0xca94, 0xd294, 0xca94, 0xd273, 0x9b76, 0x1dbe, 0x061f, 0x063f, 0x0ddf, 0x643a, 0xb2d5, 0xca54, 0xd253, 0xca53, 0xc294, 0x59b1, 0x28ce, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x0116, 0x00f9, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d3, 0x011a, 0x0119, 0x00f9, 0x00f6, 0x18ad, 0x08f6, 0x011a, 0x011a, 0x0119, 0x10d3, 0x18cd, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f7, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18cd, 0x00f7, 0x011a, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d1, 0x18ce, 0x00f7, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x40b0, 0xa09a, 0xd0be, 0xd09e, 0xd0be, 0xb89c, 0x78b5, 0x28ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd335, 0xd315, 0xd314, 0xd315, 0xd2f5, 0xd2f5, 0xd2f4, 0x9bf7, 0x6d1a, 0x2e3d, 0x45bc, 0x9418, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xc2d4, 0x4cdb, 0x7bd8, 0x9b57, 0x44fc, 0x063f, 0x063f, 0x1dbe, 0x83d8, 0xc294, 0xca53, 0xca54, 0xca33, 0xca53, 0xb2b5, 0x33b8, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188e, 0x20cd, 0x10d1, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x011a, 0x0119, 0x00f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x00f7, 0x0119, 0x0139, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0139, 0x0119, 0x08f7, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f7, 0x011a, 0x0119, 0x011a, 0x10d3, 0x20ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x08f7, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ae, 0x18ae, 0x18cf, 0x00f8, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x10d0, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x40b0, 0xd07d, 0xd87e, 0xd89f, 0xd89f, 0xe07f, 0xd89e, 0xd89f, 0xb87b, 0x28ae, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xbb14, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd314, 0xd335, 0xd315, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xc335, 0x8478, 0x4d7b, 0x4d5b, 0xab96, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xca94, 0xcab4, 0xd294, 0xd294, 0xd273, 0xc2b4, 0x5c9a, 0x061f, 0x061f, 0x063f, 0x7419, 0xd273, 0xd273, 0xca53, 0xca53, 0xd233, 0xca53, 0xaaf6, 0x153c, 0x2951, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x011a, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x20ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x10b0, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb07a, 0xe85f, 0xe85f, 0xe07f, 0xe85f, 0xe87f, 0xe07f, 0xe85f, 0xe07f, 0x9898, 0x20ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd315, 0xcb34, 0xd315, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xd2d4, 0xbb55, 0x7499, 0x35dc, 0x8439, 0xc2f4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xca93, 0xd294, 0xd274, 0xca74, 0x9b76, 0x061f, 0x061f, 0x83d8, 0xc295, 0xca53, 0xca53, 0xca53, 0xca53, 0x7bb8, 0x063f, 0x2a34, 0x30f0, 0x30f0, 0x30ef, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x00f6, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x38b0, 0xf05f, 0xe83f, 0xf03f, 0xf05f, 0xf05f, 0xf03f, 0xf03f, 0xf03f, 0xf05f, 0xe83f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xbb35, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xcad4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2d4, 0xcab4, 0xd2b4, 0xcab4, 0xcab4, 0x8bf8, 0x3d5c, 0x6499, 0xc2d4, 0xd294, 0xd294, 0xca74, 0xca74, 0xd274, 0xca74, 0xca74, 0x54bb, 0x5c9a, 0x353d, 0x1dbe, 0x4cbb, 0x9377, 0x9b36, 0x44fc, 0x061f, 0x1bf9, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x011a, 0x10d3, 0x18ad, 0x08f6, 0x0119, 0x00f9, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x10d3, 0x0119, 0x011a, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x20ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d0, 0x011a, 0x011a, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x00f9, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f4, 0x10f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x5092, 0xf83f, 0xf83f, 0xf03f, 0xf83f, 0xf83f, 0xf83f, 0xf83f, 0xf81f, 0xf03f, 0xf83f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69b3, 0xc355, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd2f5, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0x9b97, 0x453c, 0x6c59, 0xc2b4, 0xca74, 0xd274, 0xd273, 0xca73, 0xd273, 0xc294, 0x6c39, 0xc294, 0xca53, 0x8b98, 0x4cbb, 0x0dff, 0x063f, 0x0d7e, 0x3972, 0x3911, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x011a, 0x00f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x00f9, 0x011a, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x00f6, 0x00f9, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x011a, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x5092, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0x9b77, 0x44dc, 0x73f9, 0xca73, 0xca74, 0xd254, 0xca73, 0xca53, 0xc294, 0x351c, 0x6c3a, 0xc294, 0xd253, 0xca34, 0x83b8, 0x5a55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00fa, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x011a, 0x08f7, 0x18ad, 0x0116, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4090, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x28af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69d3, 0xc355, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xcb55, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcad4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xcab4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0xd274, 0xca74, 0x8b78, 0x447c, 0xa316, 0xd253, 0xd253, 0xca54, 0xca53, 0xc294, 0x257d, 0x0ddf, 0x83b8, 0xd233, 0xca33, 0xca33, 0xba13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x30d0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0116, 0x20ad, 0x08f6, 0x011a, 0x00f9, 0x0119, 0x10f3, 0x18ad, 0x0116, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x10d4, 0x011a, 0x011a, 0x0119, 0x08f6, 0x20ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x00f9, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0xd03c, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xd03c, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xaad4, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd2b4, 0xca94, 0xca94, 0xd294, 0xca74, 0xca73, 0xca74, 0xd274, 0xc295, 0x6bb9, 0x6b99, 0xca54, 0xca53, 0xd254, 0xca33, 0xc294, 0x24fd, 0x063f, 0x351d, 0xb295, 0xca13, 0xca13, 0xca13, 0xb9f3, 0x7992, 0x4111, 0x4112, 0x38f1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x00f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x10d2, 0x10f3, 0x08f3, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x4090, 0xf03f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x6073, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xcb55, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd314, 0xd335, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca74, 0xca74, 0xca74, 0xca73, 0xca73, 0xca53, 0xca53, 0xca74, 0xaab6, 0x5b7a, 0xba74, 0xca53, 0xca33, 0xca33, 0xc254, 0x4bfb, 0x059f, 0x0d7f, 0x8b57, 0xc9f3, 0xca13, 0xc9f3, 0xc9f3, 0xa9b3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x10d3, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x18d1, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x10b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10b0, 0x10d3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x10d0, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x08f3, 0x10d0, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x10d2, 0x10d4, 0x08f3, 0x08f3, 0x18d1, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x18d1, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4091, 0xe01d, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x7074, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ae, 0x18cd, 0x20ae, 0x20cd, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xb2f4, 0xd395, 0xdb95, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0x84f9, 0x467d, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x1f1e, 0x367d, 0x367c, 0x4ddb, 0x653a, 0x8498, 0x9bf7, 0xc2f5, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca73, 0xd253, 0xd254, 0xca74, 0xca53, 0xca53, 0xca53, 0xd253, 0x72d9, 0xaa76, 0xca33, 0xd233, 0xca13, 0xca33, 0x1c7e, 0x059f, 0x05ff, 0x5c7a, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18cd, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10b0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x7074, 0x9077, 0x8856, 0x8876, 0x388f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x3911, 0x4111, 0x4132, 0x6193, 0xc355, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x271d, 0x07ff, 0x07ff, 0x07bf, 0x079f, 0x079f, 0x077f, 0x079f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x079f, 0x1efe, 0x461c, 0x6d1a, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca73, 0xd274, 0xca74, 0xca53, 0xd254, 0xca54, 0xd253, 0xca53, 0xca33, 0xa275, 0x9a76, 0xca33, 0xca13, 0xca33, 0x9ad6, 0x04ff, 0x05bf, 0x063f, 0x357c, 0xc254, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ae, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x0117, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xcb55, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xcb55, 0xd334, 0xcb55, 0xac17, 0x0fbf, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x365c, 0x74b9, 0xb315, 0xca73, 0xca54, 0xca54, 0xca53, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xb235, 0xaa16, 0xca33, 0xca13, 0xca13, 0x7b37, 0x055f, 0x05ff, 0x067f, 0x25dd, 0xa2f5, 0xd1d3, 0xc9f3, 0xc9d3, 0xc9d2, 0xc9d3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ce, 0x20ad, 0x10f4, 0x011a, 0x0119, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61b3, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0x8cb8, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06df, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x071f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x071f, 0x2dfd, 0x7419, 0xb2b5, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0xd233, 0xca14, 0xa215, 0xca13, 0xca13, 0xc9f3, 0x8338, 0x05bf, 0x063f, 0x06bf, 0x0e9f, 0xaad5, 0xc9d3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b2, 0xb1b2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18cf, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x20ae, 0x18d0, 0x0119, 0x0119, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3111, 0x38f1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xc395, 0x5dfa, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06bf, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x06ff, 0x06bf, 0x065f, 0x05bf, 0x443c, 0x8af7, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca13, 0x99b6, 0xc9f3, 0xca13, 0xc9f3, 0x4c3b, 0x061f, 0x069f, 0x06ff, 0x0ebe, 0xa2d5, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9b2, 0xc1b3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x20ae, 0x20ad, 0x18ce, 0x0119, 0x0119, 0x10d3, 0x20ce, 0x20ae, 0x10f4, 0x0119, 0x011a, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067f, 0x067f, 0x067f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x065f, 0x065f, 0x067f, 0x067f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x065f, 0x05ff, 0x053f, 0x049f, 0x1bbe, 0x8298, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0xd1f3, 0x99b6, 0xc9f3, 0xc9f3, 0xb254, 0x0d9f, 0x067f, 0x06df, 0x06ff, 0x0ebf, 0xa2d5, 0xc9d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011a, 0x10f5, 0x20ce, 0x20cf, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xac37, 0x6d9a, 0x2efe, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x075f, 0x073f, 0x071f, 0x06df, 0x06bf, 0x069f, 0x067f, 0x065f, 0x065f, 0x063f, 0x063f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x063f, 0x063f, 0x063f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x067f, 0x063f, 0x05df, 0x055f, 0x04bf, 0x043f, 0x037f, 0x1abe, 0x7a18, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc1f4, 0x7178, 0xc9f2, 0xd1f3, 0x8338, 0x061f, 0x06bf, 0x06ff, 0x071f, 0x0edf, 0xa2d5, 0xc9b3, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x18ce, 0x0918, 0x011a, 0x011a, 0x0919, 0x011a, 0x0917, 0x20cf, 0x28ae, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xa2b4, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xc3b6, 0x8519, 0x4e3c, 0x0f9f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x06ff, 0x06bf, 0x069f, 0x067f, 0x065f, 0x063f, 0x061f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05df, 0x057f, 0x04ff, 0x047f, 0x03df, 0x031f, 0x025f, 0x19de, 0x79b8, 0xc9f3, 0xca13, 0xc9f3, 0xb9d3, 0xa1b5, 0xc9d3, 0xc9f3, 0x4c5b, 0x065f, 0x06df, 0x071f, 0x071f, 0x0edf, 0xa2b5, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc993, 0xc992, 0xb172, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x10f3, 0x10f3, 0x10d2, 0x20ae, 0x18ae, 0x20ae, 0x18ce, 0x20ce, 0x20ce, 0x20ce, 0x18f2, 0x10f4, 0x1114, 0x18f3, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xc3b5, 0x7d59, 0x36bd, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x071f, 0x06de, 0x069e, 0x067e, 0x065e, 0x063f, 0x063f, 0x061e, 0x05ff, 0x05df, 0x05bf, 0x05bf, 0x059f, 0x059f, 0x059f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x059f, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05bf, 0x057f, 0x04ff, 0x049f, 0x03ff, 0x037f, 0x02bf, 0x021f, 0x017f, 0x213d, 0x9996, 0xc9f3, 0xc9f3, 0xb9d4, 0x99b6, 0xc9d3, 0xc213, 0x0dbf, 0x069f, 0x06ff, 0x071f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xa972, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20af, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xaab5, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0x94d8, 0x467c, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x06de, 0x06be, 0x067e, 0x067e, 0x065e, 0x063e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059f, 0x057f, 0x057f, 0x055f, 0x055f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x055f, 0x055f, 0x055f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x055f, 0x04ff, 0x04bf, 0x041f, 0x039f, 0x031f, 0x025f, 0x01bf, 0x013f, 0x00bf, 0x40fb, 0xb1b5, 0xc9d2, 0xb1d5, 0xb1d4, 0xc9b3, 0x6399, 0x061f, 0x06df, 0x071f, 0x073f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc972, 0xc972, 0xc992, 0xc972, 0xb152, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20cd, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30d0, 0x28f0, 0x3110, 0x30f0, 0x30f0, 0x30f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4a16, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0x8539, 0x1f5e, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x07bf, 0x075f, 0x06be, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059e, 0x057e, 0x055f, 0x053f, 0x053f, 0x051f, 0x051f, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x053f, 0x053f, 0x051f, 0x04df, 0x04bf, 0x043f, 0x03df, 0x035f, 0x02bf, 0x021f, 0x017f, 0x00ff, 0x009f, 0x087f, 0x7119, 0xc9d3, 0xb1d4, 0xb9d3, 0xc9b3, 0x1cfe, 0x065f, 0x06ff, 0x071f, 0x073f, 0x073f, 0x1ebe, 0xb9f3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc973, 0xc952, 0xb152, 0x4111, 0x3910, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20cd, 0x20ce, 0x20ae, 0x20ae, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4a15, 0x3439, 0x16bd, 0x8519, 0xd395, 0xd395, 0xd395, 0x94d8, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x071e, 0x069d, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fd, 0x05dd, 0x05bd, 0x059d, 0x059e, 0x057e, 0x055e, 0x053e, 0x051e, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x049f, 0x049f, 0x049f, 0x049f, 0x049f, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x04bf, 0x04df, 0x04df, 0x04df, 0x04bf, 0x049f, 0x043f, 0x03df, 0x035f, 0x02ff, 0x025f, 0x01bf, 0x013f, 0x00df, 0x007f, 0x005f, 0x185e, 0x8957, 0x61b9, 0xc9d3, 0x9a96, 0x059f, 0x067f, 0x06ff, 0x071f, 0x073f, 0x075f, 0x267d, 0xb9d3, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xb152, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cf, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x00f6, 0x18ce, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f1, 0x38f1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69b4, 0x6336, 0x6cd9, 0x4e5b, 0x07df, 0x8539, 0xd395, 0xd395, 0xbc17, 0x3e9c, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x06bd, 0x069c, 0x069c, 0x067c, 0x065c, 0x065c, 0x063c, 0x061c, 0x05fc, 0x05dc, 0x05bc, 0x05bd, 0x059d, 0x057d, 0x055d, 0x053e, 0x051e, 0x04fe, 0x04de, 0x04be, 0x04bf, 0x049f, 0x047f, 0x047f, 0x047f, 0x045f, 0x045f, 0x045f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x049f, 0x047f, 0x045f, 0x041f, 0x03df, 0x037f, 0x031f, 0x029f, 0x021f, 0x017f, 0x011f, 0x00bf, 0x005f, 0x001f, 0x001f, 0x00ff, 0x89b7, 0xc9b3, 0x447b, 0x065f, 0x06bf, 0x071f, 0x073f, 0x073f, 0x075f, 0x3d9b, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xa132, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20cd, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x40f1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61b3, 0x9274, 0xb2f5, 0xc355, 0xd395, 0xd395, 0xd395, 0xbc16, 0x469d, 0x8539, 0xd376, 0xd375, 0x6dba, 0x0f9f, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x077f, 0x06bc, 0x06bb, 0x069b, 0x067b, 0x065b, 0x063b, 0x063b, 0x061b, 0x05fb, 0x05db, 0x05bb, 0x059c, 0x059c, 0x057c, 0x055c, 0x053d, 0x051d, 0x04fd, 0x04dd, 0x04be, 0x049e, 0x047f, 0x047f, 0x045f, 0x043f, 0x043f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x041f, 0x03ff, 0x03bf, 0x037f, 0x033f, 0x02bf, 0x023f, 0x01df, 0x015f, 0x00df, 0x009f, 0x005f, 0x001f, 0x005f, 0x097f, 0xb9b3, 0xb214, 0x0dbf, 0x06ff, 0x075f, 0x073f, 0x073f, 0x075f, 0x077f, 0x6479, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x9132, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x3110, 0x38f0, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xc335, 0xd395, 0xd395, 0xd395, 0xd395, 0xac57, 0x7d7a, 0x469c, 0x0f9f, 0xa4b8, 0xd395, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x075d, 0x06bb, 0x06bb, 0x069a, 0x067a, 0x065a, 0x065a, 0x063a, 0x061a, 0x05fa, 0x05da, 0x05db, 0x05bb, 0x059b, 0x057b, 0x055b, 0x053c, 0x053c, 0x051c, 0x04fc, 0x04dd, 0x04bd, 0x047e, 0x047e, 0x045e, 0x043f, 0x041f, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03bf, 0x035f, 0x031f, 0x02df, 0x027f, 0x01ff, 0x019f, 0x011f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x009f, 0x39db, 0xc992, 0x6399, 0x069f, 0x079f, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x079f, 0x9af6, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x7112, 0x3110, 0x30f0, 0x30ef, 0x28f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d3, 0x10d2, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xcb75, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x1f7e, 0x07ff, 0x07ff, 0x36dd, 0xbc17, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x071b, 0x06da, 0x06ba, 0x06ba, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05f9, 0x05da, 0x05ba, 0x059a, 0x057a, 0x055a, 0x055b, 0x053b, 0x051b, 0x04fc, 0x04dc, 0x04bc, 0x049d, 0x047d, 0x045d, 0x043e, 0x041e, 0x03fe, 0x03df, 0x03df, 0x03bf, 0x03bf, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x037f, 0x035f, 0x031f, 0x02df, 0x027f, 0x023f, 0x01bf, 0x015f, 0x00ff, 0x009f, 0x005f, 0x001f, 0x003f, 0x011f, 0x99b6, 0xb9d3, 0x0d9f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f7e, 0xb9b3, 0xc952, 0xc952, 0xc952, 0xc952, 0xc931, 0xc932, 0xc132, 0x6111, 0x38f0, 0x30f0, 0x28f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xa2b4, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x0fbf, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x1f7e, 0x07df, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x06f9, 0x06f9, 0x06d9, 0x06b8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05f8, 0x05d8, 0x05b8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051a, 0x04fa, 0x04db, 0x04bb, 0x049c, 0x047c, 0x045d, 0x043d, 0x041e, 0x03fe, 0x03de, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02bf, 0x027f, 0x023f, 0x01ff, 0x019f, 0x013f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x005f, 0x197e, 0xb993, 0x6379, 0x063f, 0x073f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dfb, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc932, 0xc912, 0xb912, 0x4111, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x08f6, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79f3, 0xb2f4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x94f9, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x079d, 0x0719, 0x06f8, 0x06f8, 0x06d7, 0x06b7, 0x06b7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05f7, 0x05d7, 0x05b7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04f9, 0x04da, 0x04bb, 0x049b, 0x047c, 0x043c, 0x041d, 0x041d, 0x03fe, 0x03de, 0x03be, 0x039e, 0x037f, 0x035f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x027f, 0x023f, 0x01ff, 0x019f, 0x015f, 0x00ff, 0x009f, 0x005f, 0x003f, 0x001f, 0x00bf, 0x59ba, 0xb9b3, 0x0d3f, 0x06bf, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7438, 0xc952, 0xc132, 0xc932, 0xc932, 0xc932, 0xc911, 0xc912, 0xa111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x08f5, 0x011a, 0x0119, 0x00fa, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x5151, 0x79f3, 0xa2b4, 0xcb75, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x469c, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0xc335, 0x45d7, 0x0738, 0x0717, 0x06f6, 0x06f6, 0x06d6, 0x06b5, 0x06b5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05f5, 0x05f5, 0x05d6, 0x05b6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04f9, 0x04d9, 0x049a, 0x047b, 0x045b, 0x043c, 0x041c, 0x03dd, 0x03dd, 0x03be, 0x039e, 0x037e, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x021f, 0x01ff, 0x01bf, 0x017f, 0x011f, 0x00df, 0x009f, 0x003f, 0x001f, 0x003f, 0x013f, 0xb174, 0x6339, 0x05ff, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb992, 0xc932, 0xc932, 0xc931, 0xc912, 0xc912, 0xc912, 0xc911, 0x8111, 0x30f0, 0x30f0, 0x28ef, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20d0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08f5, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x59b2, 0x7a13, 0x9a94, 0xbb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xac77, 0x2f1e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bc, 0x0759, 0xabb5, 0xc314, 0x1e97, 0x0736, 0x0716, 0x0715, 0x06f4, 0x06f4, 0x06f3, 0x06d3, 0x06b3, 0x06b2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05f4, 0x05d4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04f8, 0x04b9, 0x0499, 0x045a, 0x043b, 0x041b, 0x03fc, 0x03dd, 0x03bd, 0x039d, 0x037e, 0x035e, 0x033e, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x021f, 0x01df, 0x019f, 0x017f, 0x013f, 0x00ff, 0x009f, 0x007f, 0x003f, 0x001f, 0x007f, 0x399b, 0xb993, 0x055f, 0x067f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x45db, 0xc132, 0xc932, 0xc912, 0xc132, 0xc912, 0xc912, 0xc911, 0xc912, 0x5111, 0x38f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x10d3, 0x10f4, 0x18d0, 0x18ad, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ce, 0x20ce, 0x28ae, 0x20ce, 0x28ee, 0x5171, 0x69d2, 0x8232, 0xaaf4, 0xc334, 0xd375, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x757a, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bd, 0x079b, 0x077a, 0x0779, 0x74d6, 0xd2d4, 0x9bf5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06f0, 0x06f0, 0x06d0, 0x06af, 0x06af, 0x066f, 0x0650, 0x0631, 0x0611, 0x05d2, 0x0594, 0x0554, 0x0515, 0x04f7, 0x04b8, 0x0478, 0x0459, 0x043a, 0x03fb, 0x03bc, 0x03bc, 0x039d, 0x037d, 0x035e, 0x033e, 0x031f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x027f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x013f, 0x011f, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x00df, 0xa175, 0x33bc, 0x05df, 0x06ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x92d5, 0xc911, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc112, 0xc912, 0xa8f1, 0x3110, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x390f, 0x4970, 0x59b0, 0x7a32, 0x9293, 0xaad3, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x9cb8, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07dd, 0x07bc, 0x079b, 0x079a, 0x079a, 0x0779, 0x55b7, 0xd2b4, 0xd2b4, 0x4db5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074f, 0x074e, 0x074d, 0x074d, 0x074c, 0x072b, 0x072b, 0x072a, 0x070a, 0x06ea, 0x06ac, 0x064d, 0x05d0, 0x0573, 0x04f5, 0x04b6, 0x0478, 0x0438, 0x041a, 0x03fb, 0x03bc, 0x039c, 0x037c, 0x033d, 0x033d, 0x031e, 0x02fe, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x009f, 0x005f, 0x003f, 0x001f, 0x003f, 0x213d, 0x1b1e, 0x051f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f3d, 0xc912, 0xc912, 0xc112, 0xc112, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0x80f1, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xc374, 0xa2d3, 0xaad3, 0x7a31, 0x7a31, 0x7a11, 0x7231, 0x5190, 0x496f, 0x496f, 0x4970, 0x496f, 0x494f, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x494f, 0x496f, 0x496f, 0x69f1, 0x7a31, 0x7a31, 0x9272, 0xa2d3, 0xaaf3, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd395, 0xac57, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x079a, 0x079a, 0x0799, 0x26b8, 0xcad4, 0xd2b4, 0xc314, 0x0f35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078f, 0x078e, 0x078e, 0x078d, 0x078c, 0x07aa, 0x07a9, 0x07a9, 0x07a8, 0x07c7, 0x07c5, 0x07c4, 0x07e4, 0x07a4, 0x0727, 0x068a, 0x05af, 0x0496, 0x0438, 0x03f9, 0x03ba, 0x039b, 0x035c, 0x035d, 0x031d, 0x031d, 0x02fe, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x007f, 0x023f, 0x041f, 0x05bf, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6498, 0xc911, 0xc912, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8d1, 0x50f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0117, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x8539, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x07ba, 0x07ba, 0x07b9, 0xd2b4, 0xd2b4, 0xd2b4, 0x6535, 0x07b5, 0x07b5, 0x07b4, 0x07b3, 0x07b2, 0x07b1, 0x07b0, 0x07af, 0x07ce, 0x07cd, 0x07cc, 0x07cb, 0x07ca, 0x07ca, 0x07c9, 0x07e8, 0x07e7, 0x07e6, 0x07e5, 0x07e5, 0x07e3, 0x07e3, 0x07e2, 0x07e1, 0x0726, 0x060c, 0x04b4, 0x03b9, 0x037b, 0x035c, 0x033d, 0x031d, 0x02de, 0x02df, 0x02be, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x015f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x007f, 0x003f, 0x001f, 0x001f, 0x011f, 0x02ff, 0x04df, 0x063f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb972, 0xc8f2, 0xc8f2, 0xc0f1, 0xc8f2, 0xc0f2, 0xc0f1, 0xc8d1, 0xa0f1, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x412f, 0x8a72, 0xc334, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xac57, 0x469c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x467c, 0x8519, 0x8519, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07de, 0x07de, 0x07dd, 0x07dc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x07da, 0x9bf5, 0xd2b4, 0xd2b4, 0xc2f4, 0x0f77, 0x07d6, 0x07d5, 0x07d4, 0x07d4, 0x07d3, 0x07d2, 0x07d1, 0x07d0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07ec, 0x07ea, 0x07e9, 0x07e9, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e4, 0x07e4, 0x07e3, 0x07e3, 0x07e2, 0x0785, 0x060c, 0x04d3, 0x035b, 0x031c, 0x02de, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x001f, 0x001f, 0x003f, 0x01df, 0x03bf, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d7a, 0xc111, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0d1, 0xc8d1, 0x68f1, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x414f, 0x61d1, 0x8251, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xbc16, 0x8539, 0x469c, 0x17bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8518, 0xd355, 0xd355, 0xd335, 0xd335, 0x84f8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07fe, 0x07dd, 0x07dd, 0x07bc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x8c56, 0xcab4, 0xcab4, 0xd294, 0x4df7, 0x07d7, 0x07d7, 0x07d6, 0x07f5, 0x07d5, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07e9, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e5, 0x07e5, 0x07e4, 0x07a6, 0x060e, 0x03f8, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x003f, 0x001f, 0x001f, 0x00bf, 0x029f, 0x049f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1d3, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0f1, 0xc8d1, 0xb8d1, 0x40f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0x496f, 0x5990, 0x7a12, 0x7a32, 0x9272, 0xa2d3, 0xa2d3, 0xc375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xac77, 0x757a, 0x36fd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4e3c, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd334, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07dd, 0x07dd, 0x07dc, 0x07fc, 0x07dc, 0x07db, 0x6d38, 0xcab4, 0xd294, 0xd294, 0xab95, 0x07d8, 0x07d8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ec, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07e9, 0x07e9, 0x07e8, 0x07e8, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e8, 0x07c8, 0x06eb, 0x0514, 0x033c, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0x015f, 0x037f, 0x057f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5a, 0xc8f1, 0xc8d1, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x78d1, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x496f, 0x496f, 0x4970, 0x7a12, 0x7a31, 0x8252, 0xaad3, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcbd6, 0x94f8, 0x565b, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb3f6, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd334, 0x1f7e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07dd, 0x07fd, 0x07fd, 0x07fd, 0x07dd, 0x07dc, 0x6d38, 0xcab4, 0xd294, 0xca94, 0xd294, 0x1f39, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ed, 0x07ec, 0x07eb, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07ca, 0x07ab, 0x076c, 0x070d, 0x05b2, 0x039b, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60d9, 0x0a3f, 0x047f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9d3, 0xc0d1, 0xc8d1, 0xc0f1, 0xc8b1, 0xc0d1, 0xc8b1, 0xc0b1, 0xb8b1, 0x48f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x4970, 0x5990, 0x7a31, 0x7231, 0x7a31, 0x7a31, 0x9ab3, 0xaad4, 0xa2d4, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0x94f8, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd315, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x6d58, 0xd294, 0xd293, 0xca94, 0xd274, 0x4df8, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f1, 0x07f0, 0x07f0, 0x07f0, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ed, 0x07cd, 0x078e, 0x076e, 0x0710, 0x06b1, 0x0574, 0x037b, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x013f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x88d6, 0x6159, 0x031f, 0x053f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5b, 0xc0d1, 0xc8d1, 0xc8d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b1, 0x90d1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ce, 0x18ad, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x290f, 0x5170, 0x5170, 0x69f1, 0x7a32, 0x8232, 0xaaf3, 0xaaf4, 0xcb75, 0xd395, 0xd396, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xc3b6, 0x8539, 0x1f7f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0x659a, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x6d39, 0xd294, 0xca94, 0xd274, 0xca74, 0x7c96, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f4, 0x07f4, 0x07f3, 0x07f3, 0x07f3, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f1, 0x07f1, 0x07f1, 0x07f1, 0x07f0, 0x07f1, 0x07d0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02dd, 0x01bf, 0x019f, 0x017f, 0x015f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x00bf, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60b8, 0xb8f3, 0x09bf, 0x041f, 0x061f, 0x073f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1b3, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x48f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x5172, 0x61b2, 0x8a54, 0x9a94, 0xb335, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0x9c97, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xac17, 0xd335, 0xd314, 0xd335, 0xd314, 0xd315, 0xd315, 0xd2f4, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6d59, 0xd274, 0xca94, 0xd274, 0xca74, 0xb334, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f4, 0x07f4, 0x07f4, 0x07d3, 0x07b3, 0x0793, 0x0753, 0x0714, 0x06b5, 0x5516, 0x0538, 0x037c, 0x01ff, 0x017f, 0x015f, 0x013f, 0x011f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x6099, 0xc911, 0x491a, 0x02df, 0x051f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6459, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x90d1, 0x30f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69d3, 0x9274, 0xb2f5, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xa478, 0x36dd, 0x07ff, 0x07ff, 0x563c, 0xd335, 0xd334, 0xd315, 0xd315, 0xd2f4, 0xcb15, 0xbb96, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8498, 0xca94, 0xca94, 0xd274, 0xca74, 0xca74, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07d6, 0x07b6, 0x0796, 0x0756, 0x0716, 0xa456, 0xbbd6, 0x3479, 0x02fd, 0x023f, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x003f, 0x78b7, 0xc111, 0xa114, 0x01ff, 0x041f, 0x05ff, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xc0b1, 0xc0d2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x48f1, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x20cd, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71f4, 0x9a75, 0xb2f5, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0x9c78, 0x36dd, 0x07ff, 0x9c57, 0xd335, 0xd315, 0xd334, 0xd314, 0xc355, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bf7, 0xca94, 0xd274, 0xca73, 0xca74, 0xd253, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f8, 0x07d8, 0x07b8, 0x0797, 0x0758, 0x0ef8, 0xbbf6, 0xd395, 0x6b99, 0x025f, 0x021f, 0x01bf, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x98d5, 0xc8f2, 0xc911, 0x195e, 0x033f, 0x053f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b76, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x88d1, 0x30f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10d2, 0x00f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08d5, 0x10d0, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8a16, 0xaad5, 0xcb55, 0xd375, 0xd355, 0xd354, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0x84f9, 0x0fbf, 0x5ddb, 0xa457, 0x9c58, 0x84d8, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca74, 0xca74, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07da, 0x07da, 0x07ba, 0x079a, 0x0779, 0x2e99, 0xc3d6, 0xd395, 0x8339, 0x0a3e, 0x01df, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0x90d5, 0xc912, 0xc0f1, 0x7117, 0x027f, 0x049f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x269d, 0xc891, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8b1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x20ad, 0x10d1, 0x00f8, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18af, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ce, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ef, 0x28cf, 0x28ef, 0x28d0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8b14, 0x4ad3, 0x7a94, 0xab14, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd314, 0xd335, 0xc355, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc2d4, 0xca74, 0xca74, 0xd274, 0xca74, 0xd253, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07db, 0x07bb, 0x07bb, 0x077b, 0x2eba, 0xc3d6, 0xd395, 0xb337, 0x09df, 0x01bf, 0x017f, 0x013f, 0x011f, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x7896, 0xc0f1, 0xc8f1, 0xa8f3, 0x01df, 0x03df, 0x05bf, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0x68f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0139, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x0119, 0x08f6, 0x10d2, 0x10d0, 0x18cf, 0x18d0, 0x10d3, 0x0118, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9a75, 0xcb55, 0xcb75, 0x5bb4, 0x3b34, 0x42b3, 0x4a33, 0x6253, 0x9ab4, 0xd335, 0xd335, 0xd315, 0xd334, 0xd314, 0xd315, 0xd314, 0xd314, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f5e, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xca53, 0x369d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07dd, 0x07dd, 0x07bd, 0x079c, 0x561a, 0xd395, 0xd395, 0xab37, 0x099f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x003f, 0x003f, 0x305c, 0xc0f1, 0xc8f1, 0xc8d1, 0x215d, 0x033f, 0x051f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5cd9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x98d1, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0117, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x08f3, 0x0118, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x011a, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xcb55, 0xd375, 0xbb95, 0x5474, 0x3c34, 0x3bb4, 0x4333, 0x42b3, 0x4a13, 0x49f3, 0x5a32, 0x9ab4, 0xd334, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0x84d8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4ddb, 0xd274, 0xca74, 0xca73, 0xd274, 0xca54, 0xca54, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07de, 0x079d, 0x6d99, 0xd395, 0xd395, 0xab17, 0x097f, 0x011f, 0x011f, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0xc8f1, 0xc8f1, 0xc8d1, 0x5119, 0x02df, 0x04ff, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x4910, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18d0, 0x00f8, 0x0119, 0x00f8, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xcb55, 0xd375, 0xd375, 0xb3d5, 0x3d55, 0x3515, 0x3495, 0x3c14, 0x3b94, 0x3b13, 0x4293, 0x4212, 0x49f3, 0x49f3, 0x5a13, 0x9ab4, 0xd314, 0xd315, 0xcb15, 0xd2f4, 0xd2f5, 0xd2f4, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8c37, 0xca74, 0xd273, 0xd253, 0xca54, 0xca53, 0xd253, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07df, 0x07df, 0x94d8, 0xd396, 0xd395, 0x8299, 0x00ff, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0xc8d1, 0xc0f1, 0xc0d1, 0xa0d4, 0x027f, 0x04bf, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8315, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x70f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0117, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x10d3, 0x08f3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x0117, 0x0119, 0x0119, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0117, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xb2f4, 0xd375, 0xd375, 0xd375, 0x9435, 0x3d55, 0x2d55, 0x2d75, 0x3515, 0x3c94, 0x3414, 0x3b94, 0x4313, 0x4293, 0x4a13, 0x41f3, 0x49f2, 0x4a13, 0x5a33, 0xa2b4, 0xd314, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2f4, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x179f, 0xd274, 0xca53, 0xca73, 0xca53, 0xca53, 0xca53, 0xd253, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xbc16, 0xd395, 0xd395, 0x725a, 0x00bf, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x90b5, 0xc8d1, 0xc8d1, 0xc0d1, 0x123e, 0x047f, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x90d1, 0x38f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x08f6, 0x011a, 0x0119, 0x0118, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x38f0, 0x30f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xcb55, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3bf4, 0x3b73, 0x42f4, 0x4273, 0x4a13, 0x4213, 0x49f2, 0x49f3, 0x49f3, 0x6a33, 0xbad4, 0xd2f5, 0xd2f4, 0xd2d4, 0xc335, 0x177e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xca54, 0xd273, 0xca54, 0xca53, 0xca53, 0xca53, 0x9bb6, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x077e, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x36dd, 0xd395, 0xd395, 0xd395, 0x51bc, 0x009f, 0x009f, 0x007f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x7077, 0xc0d2, 0xc8d1, 0xc0d1, 0x49fa, 0x049f, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x08f5, 0x20ad, 0x18cd, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4952, 0xaab4, 0xd375, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x2d75, 0x2d75, 0x3555, 0x54d5, 0x6475, 0x83b5, 0x8b74, 0x9b34, 0xab14, 0xaad4, 0xb2d4, 0xaad4, 0xaab4, 0xaab4, 0xb2b4, 0x6b15, 0x8a94, 0xc2d4, 0xd2f4, 0xd2d4, 0x84b8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb315, 0xd274, 0xca53, 0xca54, 0xca53, 0xca53, 0xd253, 0x653a, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x071f, 0x071e, 0x071e, 0x073e, 0x079f, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7d7a, 0xd395, 0xd395, 0xc375, 0x28fe, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x005f, 0x003f, 0x003f, 0x183e, 0xc0d1, 0xc0d1, 0xc0d2, 0x7996, 0x04bf, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x58f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18af, 0x0119, 0x0119, 0x08f6, 0x20ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0118, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0139, 0x0119, 0x10f3, 0x18d0, 0x08f5, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ae, 0x18cd, 0x0119, 0x011a, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0117, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x5972, 0xcb55, 0xd375, 0xd375, 0xd375, 0xd375, 0xabd5, 0x4515, 0x54f5, 0x7c75, 0x8c35, 0xabd5, 0xcb55, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xc355, 0x9c37, 0x659a, 0x467c, 0x0fbf, 0x07ff, 0x07ff, 0x269d, 0x9c17, 0xd2d4, 0x9c17, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xd274, 0xca53, 0xca54, 0xca53, 0xca33, 0xca33, 0xca33, 0x26dd, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071e, 0x071e, 0x06fe, 0x06fe, 0x06ff, 0x06de, 0x06de, 0x06be, 0x06be, 0x06de, 0x073e, 0x079f, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x079f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0xc3f6, 0xd395, 0xd395, 0xaaf7, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x001f, 0x001f, 0xa094, 0xc0d1, 0xc8b1, 0xa8f3, 0x04bf, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x73d8, 0xb8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cf, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x00f6, 0x0119, 0x08f3, 0x18ad, 0x20ad, 0x20ad, 0x00f6, 0x00f9, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x10d3, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x10cf, 0x0119, 0x00f9, 0x0117, 0x18ce, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x71f2, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xcb14, 0xd334, 0xd334, 0xac16, 0x753a, 0x467d, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x369c, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26fd, 0xc2b4, 0xca53, 0xca53, 0xca53, 0xd253, 0xca33, 0xca33, 0xa356, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06fe, 0x06fe, 0x06de, 0x06be, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x06be, 0x073e, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07df, 0x6dda, 0xd395, 0xd376, 0xd375, 0x79fa, 0x003f, 0x003f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x8896, 0xc0b1, 0xc0b1, 0xc8b1, 0x0c9f, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0x98d1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x08f3, 0x20ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f3, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x9a93, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd355, 0xd335, 0xd335, 0xc375, 0x84f9, 0x4e3c, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xab75, 0xca54, 0xd253, 0xca53, 0xca33, 0xca33, 0xd233, 0xca33, 0x4dbb, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06de, 0x06de, 0x06de, 0x06be, 0x06be, 0x069e, 0x067e, 0x067e, 0x067e, 0x065e, 0x063e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05fd, 0x067d, 0x06de, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x071e, 0x073f, 0x073f, 0x073f, 0x073e, 0x075f, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x0fbf, 0xc3d6, 0xd375, 0xd375, 0xd355, 0x30fd, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x6058, 0xc0b1, 0xc0b1, 0xc0b1, 0x33fc, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0b1, 0xb8d1, 0xb8d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f6, 0x0119, 0x08d5, 0x18cd, 0x18ae, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d3, 0x10d0, 0x08f4, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x3910, 0xaaf4, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x7539, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2efd, 0xb315, 0xca53, 0xca54, 0xca33, 0xca53, 0xca34, 0xca34, 0xca33, 0xa335, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06de, 0x06bf, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05bd, 0x05be, 0x059d, 0x055e, 0x055e, 0x05be, 0x05fe, 0x061d, 0x067e, 0x06be, 0x06fe, 0x06fe, 0x071f, 0x071e, 0x073f, 0x073f, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x8539, 0xd375, 0xd355, 0xd355, 0xbaf6, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x403b, 0xc8b1, 0xc0b1, 0xc0b1, 0x6318, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9b3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x4910, 0x3910, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x10d3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f3, 0x011a, 0x0118, 0x18ad, 0x18cd, 0x18ad, 0x18ce, 0x00f8, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20cd, 0x18ad, 0x10d0, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30cf, 0x3910, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xcb96, 0x8518, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbe, 0x653a, 0xca54, 0xca53, 0xd253, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x2e9d, 0x077f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06fe, 0x06df, 0x06de, 0x06bf, 0x06be, 0x06bf, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05be, 0x05be, 0x059e, 0x057e, 0x053e, 0x051e, 0x04fe, 0x04be, 0x049e, 0x041e, 0x03dd, 0x04de, 0x065e, 0x06be, 0x06de, 0x06de, 0x06fe, 0x071f, 0x073e, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x36dd, 0xd355, 0xd355, 0xd355, 0xd335, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0xb8b2, 0xc091, 0xc0b1, 0x7a96, 0x06bf, 0x079f, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x82f5, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0x60f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x20cd, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18af, 0x08f6, 0x0119, 0x0119, 0x00f9, 0x08f4, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x00f8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x08f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x28cf, 0x28ef, 0x3910, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x5d9a, 0xb315, 0xd254, 0xca53, 0xd254, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xca33, 0x64d9, 0x077f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06be, 0x069f, 0x069f, 0x067e, 0x065e, 0x065e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x055e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043d, 0x03de, 0x03be, 0x039e, 0x037e, 0x03fe, 0x05fe, 0x069e, 0x069e, 0x06be, 0x06fe, 0x071e, 0x073f, 0x075f, 0x079f, 0x079f, 0x07df, 0x07df, 0x07df, 0x07ff, 0xbbf6, 0xd355, 0xd335, 0xd335, 0xc2f5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x9095, 0xc8b1, 0xc8b1, 0x91f5, 0x067f, 0x06ff, 0x073f, 0x075f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x80f2, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x00f6, 0x011a, 0x0117, 0x18ce, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x08f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x3110, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0x9c77, 0x563b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f7e, 0x65db, 0x7cf9, 0x9c57, 0x9c57, 0x9c57, 0x9c57, 0x9c37, 0x9c37, 0x9c37, 0x9c37, 0x7539, 0x6d7a, 0x6579, 0x5dbb, 0x36bd, 0x36bd, 0x36bc, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x36bd, 0x5d9a, 0x8c37, 0xd274, 0xd273, 0xd254, 0xca53, 0xd254, 0xd253, 0xca33, 0xd233, 0xca34, 0xca13, 0xca33, 0x8418, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x069e, 0x069f, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x05be, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04be, 0x045e, 0x03fe, 0x03be, 0x039e, 0x037e, 0x037e, 0x035e, 0x033e, 0x035e, 0x061d, 0x067e, 0x067e, 0x069e, 0x06be, 0x06fe, 0x073f, 0x075f, 0x077f, 0x079f, 0x07df, 0x07df, 0x07ff, 0x7d59, 0xd335, 0xd335, 0xd335, 0xd314, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x60d8, 0xc0b1, 0xc0b1, 0xb8f2, 0x05df, 0x061f, 0x065f, 0x06df, 0x073f, 0x077f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x90d1, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f8, 0x011a, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0x9c77, 0x3edd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x659a, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca74, 0xca74, 0xca73, 0xca73, 0xd274, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xab15, 0x0edf, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067e, 0x067f, 0x067e, 0x065e, 0x063f, 0x061e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043e, 0x03be, 0x039e, 0x039e, 0x035e, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x037e, 0x05fe, 0x065e, 0x067e, 0x069e, 0x06de, 0x06fe, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x271d, 0xd335, 0xd314, 0xd315, 0xd315, 0xc2d5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x009f, 0x60d8, 0xc0b1, 0xc0b2, 0xc0b1, 0x04bf, 0x053f, 0x05bf, 0x067f, 0x06df, 0x075f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0x98d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ce, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x08f7, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x0118, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xac37, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x0ebd, 0x1d7b, 0x1c99, 0x32f5, 0x3a75, 0x6193, 0x69b3, 0x79f4, 0x8a14, 0xb294, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xd274, 0xca53, 0xca54, 0xca54, 0xca53, 0xd253, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x8b97, 0x35fd, 0x5d7b, 0x6d3a, 0x6d3a, 0x5d5b, 0x35fd, 0x06bf, 0x0e7e, 0x457c, 0x6c99, 0x6479, 0x6459, 0x4cba, 0x0e1e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04de, 0x047e, 0x03de, 0x03be, 0x037e, 0x037f, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x02fe, 0x02fe, 0x02de, 0x03fe, 0x05be, 0x063e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073e, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0xbbb6, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0x697a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x48fa, 0xc0b1, 0xc0b1, 0xc0b1, 0x331c, 0x047f, 0x053f, 0x05ff, 0x069f, 0x073f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9a14, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ae, 0x18cf, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f4, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x0119, 0x08f6, 0x10d2, 0x10d0, 0x18d0, 0x18d1, 0x10d2, 0x00f8, 0x0119, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x9273, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xc3b6, 0x5dfb, 0x07ff, 0x0e3b, 0x1c98, 0x2ad5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79d3, 0x9a54, 0xc294, 0xd2f4, 0xd2d5, 0xcad4, 0xd2d4, 0xd2b4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xca73, 0xd253, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x99d4, 0x6358, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd375, 0x06bf, 0x5cfa, 0xd2b4, 0xca94, 0xca33, 0xca13, 0xc9d3, 0xb9d3, 0x4c5a, 0x061e, 0x061e, 0x05de, 0x05de, 0x05be, 0x059e, 0x059e, 0x057e, 0x053e, 0x051e, 0x051d, 0x04de, 0x04be, 0x043e, 0x03be, 0x03be, 0x037f, 0x0b7e, 0x337c, 0x333c, 0x335c, 0x333c, 0x333c, 0x331c, 0x331c, 0x32fc, 0x32fc, 0x32dc, 0x2b7c, 0x05de, 0x061e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07df, 0x84f9, 0xd314, 0xcb14, 0xcaf4, 0xd2d5, 0xb275, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x08df, 0xb8d2, 0xc0b1, 0xc0b1, 0x3a7b, 0x03ff, 0x04df, 0x05bf, 0x067f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b77, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x20cf, 0x0918, 0x013a, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x08f6, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0139, 0x00f9, 0x10d2, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x9c78, 0x261b, 0x1b96, 0x3171, 0x30f0, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81f3, 0xaa73, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xca53, 0xca53, 0xca53, 0xd233, 0xca33, 0xca33, 0xd233, 0xc234, 0x7994, 0x5975, 0xb315, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xc375, 0x067f, 0x067f, 0x6c79, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc912, 0x34bb, 0x05fe, 0x05de, 0x05be, 0x059e, 0x055e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x249d, 0x347b, 0x6bfa, 0x7b99, 0x9b98, 0xab97, 0xdb95, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xbbd6, 0x9c37, 0x8499, 0x6d1a, 0x363c, 0x1edd, 0x079f, 0x07bf, 0x07df, 0x4e1b, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0x40fc, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x78d7, 0xc0b1, 0xc0b1, 0x61d8, 0x03bf, 0x049f, 0x057f, 0x065f, 0x071f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x10f3, 0x013a, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011a, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x10d2, 0x08f3, 0x08f4, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x10f2, 0x00f7, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x10d0, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x5170, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0x6519, 0x22b3, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79b3, 0xa233, 0xd2b4, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xca94, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xd253, 0xca54, 0xca54, 0xca33, 0xd233, 0xca34, 0xca33, 0xca33, 0xa1d3, 0x5954, 0x5954, 0x79f5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd335, 0x8c18, 0x067f, 0x065f, 0x063f, 0xa2d5, 0xc9d3, 0xc972, 0xc952, 0xc111, 0xc8d1, 0x8a55, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x34dc, 0x6c5a, 0xa3f7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xbbb6, 0x84d9, 0x4e1b, 0x465c, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0x81d8, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x6098, 0xc0b1, 0xc0d1, 0x59b8, 0x035f, 0x045f, 0x055f, 0x063f, 0x06ff, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x58f1, 0x3911, 0x30f0, 0x3110, 0x30cf, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x08f6, 0x013a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x08f8, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x00f8, 0x08f8, 0x0118, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00fa, 0x00f8, 0x08f7, 0x08f7, 0x18b0, 0x18ad, 0x18ae, 0x08f4, 0x0119, 0x08f8, 0x08f8, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x10d4, 0x10d0, 0x18ad, 0x20ad, 0x08f8, 0x10d3, 0x18ad, 0x18ad, 0x10f4, 0x10d1, 0x18ad, 0x18ad, 0x08f8, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ce, 0x20ae, 0x28ee, 0xcb55, 0xd375, 0xd375, 0xd375, 0xbb14, 0x34f9, 0x2930, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91f2, 0xc254, 0xca93, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xca73, 0xd273, 0xca73, 0xd254, 0xca53, 0xca53, 0xca54, 0xca33, 0xca34, 0xa1f3, 0x6973, 0x4953, 0x5134, 0x5154, 0xaaf5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd335, 0xd314, 0x5cda, 0x065f, 0x063f, 0x063f, 0xb254, 0xc972, 0xc952, 0xc112, 0xc8d1, 0xc0b1, 0xc0b1, 0x05be, 0x059e, 0x2d1c, 0x9438, 0xcbb6, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xca94, 0x087f, 0x003f, 0x001f, 0x001f, 0x001f, 0x385b, 0xc0b1, 0xc0b1, 0x9135, 0x031f, 0x043f, 0x053f, 0x063f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb8d1, 0x5911, 0x3911, 0x38f0, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x0917, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x08f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ce, 0x0118, 0x0119, 0x011a, 0x00f7, 0x08f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x10d1, 0x10d0, 0x18ad, 0x08d5, 0x10d1, 0x18ad, 0x20ae, 0x00f7, 0x18ad, 0x18ae, 0x18ad, 0x08f7, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x18ae, 0x18ad, 0x18ae, 0x0118, 0x18ae, 0x18ad, 0x08f4, 0x18d0, 0x18ad, 0x18ad, 0x10d1, 0x10d5, 0x18ae, 0x18ad, 0x08f5, 0x10d1, 0x20ad, 0x18ad, 0x00f8, 0x08f7, 0x18af, 0x18ad, 0x08d4, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x20ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x011a, 0x00f9, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18cd, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x20ce, 0x8252, 0xd375, 0xd375, 0xd375, 0x9a93, 0x30ef, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81d2, 0xaa13, 0xba33, 0xca54, 0xca74, 0xca53, 0xca54, 0xca53, 0xca53, 0xb213, 0xa1f3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xd395, 0xd395, 0xd396, 0xd375, 0xd334, 0xd2f5, 0xd2b4, 0x2d9d, 0x063f, 0x063f, 0x061f, 0xc993, 0xc952, 0xc911, 0xc8f1, 0xc0b1, 0xc0b1, 0xb8d1, 0x059e, 0x057e, 0xabf7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd335, 0xcb15, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0x411c, 0x003f, 0x003f, 0x001f, 0x001f, 0x203c, 0xc0b1, 0xc0b1, 0x9135, 0x02ff, 0x041f, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa1b3, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x68f1, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x10f3, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10f4, 0x08f7, 0x18ad, 0x18ae, 0x18ad, 0x08f8, 0x20ae, 0x18ad, 0x18ad, 0x10d1, 0x10f4, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x18ad, 0x18ad, 0x10d1, 0x08f6, 0x18ad, 0x20ad, 0x08f4, 0x10d3, 0x18d1, 0x18d1, 0x08f5, 0x18d2, 0x18ad, 0x20ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x08f7, 0x18af, 0x08f7, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x208e, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x0119, 0x011a, 0x011a, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x412f, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ce, 0x28cf, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3110, 0x38f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x38f1, 0x38f0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8a34, 0xd395, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xb2f6, 0x065f, 0x061f, 0x061f, 0x34dc, 0xc952, 0xc912, 0xc8d2, 0xc0b1, 0xc0d1, 0xb8d1, 0x89b4, 0x2bba, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71d4, 0x69f4, 0x71d3, 0x69d4, 0x71d3, 0x7a14, 0x8a75, 0x9274, 0x9254, 0x9254, 0x9a95, 0xb315, 0xbb14, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xcb14, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xcab4, 0xca94, 0xca94, 0x81b8, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0xa8b3, 0xc0b1, 0xb0d2, 0x02df, 0x03ff, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f2, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20cf, 0x0918, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x10d0, 0x00fa, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f7, 0x18d1, 0x18ad, 0x20ad, 0x08f8, 0x18ad, 0x18ad, 0x18ad, 0x18d1, 0x08d4, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ae, 0x00fa, 0x08f8, 0x00f7, 0x08f6, 0x18ae, 0x18ad, 0x18ad, 0x08f4, 0x08f6, 0x08d4, 0x08f6, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ae, 0x18ae, 0x08f8, 0x18ad, 0x08f3, 0x10d3, 0x10d5, 0x10d0, 0x18ad, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20cd, 0x9272, 0xd375, 0xc334, 0x61d1, 0x20cf, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x30f0, 0x3110, 0x3110, 0x30f0, 0x3110, 0x38f0, 0x30f0, 0x38f0, 0x3111, 0x38f0, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xb2f5, 0xd395, 0xd375, 0xd355, 0xd2f4, 0xd2b4, 0xd274, 0x83b8, 0x063f, 0x061f, 0x061e, 0x6398, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61b3, 0x7a34, 0x9a95, 0xb2f5, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd274, 0xca74, 0xc254, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x5878, 0xb8d1, 0xc0b1, 0x02bf, 0x03bf, 0x04ff, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6478, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20cf, 0x0917, 0x011a, 0x011a, 0x0119, 0x08f4, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x10d1, 0x18cf, 0x18ad, 0x10d1, 0x10f4, 0x18ad, 0x18ad, 0x08f7, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x18d1, 0x18ad, 0x18ad, 0x08f6, 0x18cf, 0x18ae, 0x20ae, 0x10d4, 0x18d1, 0x18ad, 0x20ae, 0x00f8, 0x18ad, 0x18ad, 0x08f7, 0x08f6, 0x18b1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20cd, 0x18ce, 0x20ae, 0x390f, 0xd375, 0xcb35, 0x414f, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x30ef, 0x3110, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f1, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3910, 0x3911, 0x38f1, 0x3911, 0x3912, 0x4952, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xd2b4, 0xd274, 0xca33, 0x4c9a, 0x05ff, 0x061f, 0x05ff, 0xa1f4, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa0f1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xa274, 0xc315, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca74, 0xca74, 0xca74, 0xca54, 0x20fd, 0x009f, 0x007f, 0x005f, 0x003f, 0x105d, 0xc0b1, 0xc0d1, 0x029f, 0x03bf, 0x04df, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x011a, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x10f4, 0x00f8, 0x18af, 0x18ad, 0x18ad, 0x08f7, 0x08f4, 0x10d5, 0x00f7, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f8, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18cd, 0x10d1, 0x10d3, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x08f8, 0x18ae, 0x18ad, 0x18af, 0x00fa, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x10d2, 0x011a, 0x0119, 0x00fa, 0x0119, 0x011a, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x61d0, 0xbb14, 0x412f, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28cf, 0x28f0, 0x30d0, 0x28ef, 0x28cf, 0x30cf, 0x30f0, 0x30d0, 0x30d0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x61b2, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xca74, 0xd233, 0xca13, 0x1d9d, 0x05ff, 0x05ff, 0x1d3d, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8a14, 0xaa74, 0xcaf4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xca94, 0xca73, 0xd274, 0xd253, 0xd254, 0x597a, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x005f, 0xa8b3, 0xc0b1, 0x31fc, 0x039f, 0x04df, 0x05df, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18b1, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x10d0, 0x10d1, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x18ae, 0x18ad, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x188d, 0x18ad, 0x18ae, 0x10d0, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x390f, 0x28ce, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x71f2, 0xd335, 0xd2f4, 0xd2b4, 0xca74, 0xd233, 0xca13, 0xa295, 0x05ff, 0x05ff, 0x05ff, 0x5399, 0xc0d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9a34, 0xc2b4, 0xd2b5, 0xd2b3, 0xcab4, 0xd294, 0xd294, 0xca93, 0xd274, 0xd274, 0xca53, 0xca54, 0xca53, 0x81d8, 0x00df, 0x00df, 0x00df, 0x00bf, 0x00bf, 0x68b7, 0xb8d1, 0x31dc, 0x033f, 0x049f, 0x05df, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26bd, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d2, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f7, 0x011a, 0x0119, 0x0118, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x011a, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x8213, 0xd2f5, 0xcad4, 0xd274, 0xca53, 0xc9f3, 0xc9d2, 0x7398, 0x05ff, 0x05ff, 0x05df, 0xa953, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x98f2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f0, 0x38f0, 0x38f0, 0x38f0, 0x3911, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xca94, 0xd294, 0xca94, 0xd274, 0xca74, 0xd274, 0xca53, 0xca54, 0xca53, 0xca34, 0x99f6, 0x011f, 0x011f, 0x00ff, 0x00ff, 0x00ff, 0x38db, 0xc0b1, 0x28fc, 0x02df, 0x047f, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x00f9, 0x011a, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd335, 0xd2b4, 0xca94, 0xca33, 0xd1f3, 0xc9d3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc932, 0xc0d1, 0xc0b1, 0xb8d1, 0xb0d2, 0xb9f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x015f, 0x013f, 0x013f, 0x013f, 0x011f, 0x093f, 0xc0b1, 0x311c, 0x01bf, 0x03ff, 0x059f, 0x069f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2f4, 0xca74, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc111, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xca53, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x097f, 0x017f, 0x015f, 0x017f, 0x015f, 0x015f, 0x88f5, 0x293c, 0x013f, 0x02df, 0x053e, 0x067f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9234, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18af, 0x18cd, 0x18ae, 0x10d0, 0x0118, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2b4, 0xd233, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0xb8d1, 0xc253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x31bc, 0x01bf, 0x019f, 0x019f, 0x019f, 0x019f, 0x5139, 0x315c, 0x017f, 0x01bf, 0x045e, 0x063e, 0x077f, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f7, 0x18ad, 0x20ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xcb15, 0xca13, 0xc9d3, 0xc992, 0xc932, 0xc911, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc397, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xc9f3, 0x31fc, 0x01df, 0x01df, 0x01df, 0x01df, 0x01df, 0x01bf, 0x01df, 0x01bf, 0x01bf, 0x02df, 0x05fd, 0x073e, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8ab5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08d5, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18b0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb0f1, 0xba95, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9f3, 0x31fd, 0x021f, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01df, 0x01ff, 0x051d, 0x071d, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6bf7, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f8, 0x18b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc9d3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb152, 0xd79e, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x323c, 0x023f, 0x023f, 0x021f, 0x023f, 0x023f, 0x021f, 0x021f, 0x021f, 0x021f, 0x021f, 0x037e, 0x06dc, 0x07fd, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0x7911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc972, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xd63c, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x325c, 0x027f, 0x025f, 0x025f, 0x025f, 0x023f, 0x025f, 0x025f, 0x023f, 0x023f, 0x023f, 0x029f, 0x067c, 0x07fc, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d1, 0x70f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x011a, 0x0118, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xc951, 0xc912, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xbb97, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, 0xc9b3, 0x327c, 0x029f, 0x029f, 0x029f, 0x029f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x025f, 0x027f, 0x05bc, 0x07db, 0x07fc, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x58f1, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ae, 0x18d0, 0x0118, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa8f1, 0xa972, 0xd77e, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc193, 0x0a7f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x027f, 0x029f, 0x027f, 0x04dd, 0x07bb, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0x5911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xa911, 0xbc78, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, 0x089f, 0x011f, 0x031f, 0x02ff, 0x02ff, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x03fd, 0x079a, 0x07fa, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x2e5c, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb8d1, 0x5912, 0x3911, 0x38f1, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d0, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x007f, 0x009e, 0x023f, 0x033f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02df, 0x039e, 0x075a, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x08f5, 0x00f9, 0x00fa, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0x009f, 0x009f, 0x013f, 0x033f, 0x037f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x033f, 0x06f9, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb0f1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0d1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x3110, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x10f2, 0x10d3, 0x08d3, 0x08f3, 0x10f3, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x08f5, 0x0119, 0x00f9, 0x011a, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, 0x007f, 0x007f, 0x00ff, 0x027f, 0x039f, 0x039f, 0x037f, 0x231d, 0x5259, 0x5a3a, 0x033f, 0x033f, 0x031f, 0x031f, 0x0699, 0x07f8, 0x07fa, 0x07fd, 0x07ff, 0x07ff, 0x363c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4112, 0x38f1, 0x3911, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f7, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0118, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0915, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x0915, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, 0x007f, 0x007f, 0x00bf, 0x021f, 0x2abd, 0x7a36, 0xb953, 0xc112, 0xc911, 0xc912, 0x0b3f, 0x035f, 0x035f, 0x033f, 0x05fa, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa0f1, 0x68f1, 0x4111, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0118, 0x08f7, 0x08f6, 0x00f7, 0x0118, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0118, 0x0119, 0x08f6, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, 0x007f, 0x007f, 0x30bb, 0x9955, 0xc931, 0xc932, 0xc932, 0xc912, 0xc0f2, 0xc8f2, 0x32fc, 0x037f, 0x037f, 0x037f, 0x059b, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d2, 0xb0d1, 0xb0f1, 0x98f1, 0xb0f1, 0x88f1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x00f7, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x00f7, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0x087e, 0x70f8, 0xc952, 0xc932, 0xc912, 0xc932, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0x331c, 0x03bf, 0x039f, 0x039f, 0x051b, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa0f1, 0xb0f1, 0xb0d1, 0x50f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0116, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x00fa, 0x0119, 0x08f6, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, 0x9915, 0xc932, 0xc932, 0xc932, 0xc912, 0xc111, 0xc8f2, 0xc0f2, 0xc8d1, 0xc8d1, 0x333c, 0x03ff, 0x03df, 0x03bf, 0x04dc, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d3, 0x0119, 0x0119, 0x10d1, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f1, 0xc8d1, 0xc8d1, 0xc8d1, 0x335c, 0x041f, 0x03ff, 0x03ff, 0x047d, 0x0795, 0x07f6, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0x40f0, 0x28cf, 0x28ef, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x00f8, 0x011a, 0x08f6, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x08d3, 0x08f3, 0x08f3, 0x18af, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x0118, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, 0x309c, 0x005f, 0x58b9, 0xc912, 0xc111, 0xc8f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x337c, 0x045f, 0x041f, 0x041f, 0x045e, 0x0775, 0x07f5, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0x80f1, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x011a, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, 0x003f, 0x003f, 0x005f, 0x78d7, 0xc0f2, 0xc8f1, 0xc0d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x4b1a, 0x047f, 0x045f, 0x043f, 0x045f, 0x0735, 0x07f4, 0x07f9, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa0f1, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d1, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d3, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x00f9, 0x08f6, 0x0119, 0x0119, 0x0119, 0x18af, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0x003f, 0x003f, 0x005f, 0x58b9, 0xc0f1, 0xc0d1, 0xc8d1, 0xc8b2, 0xc0b1, 0xc0b1, 0x62b8, 0x04bf, 0x047f, 0x047f, 0x045f, 0x0715, 0x07f4, 0x07f9, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa8f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0x58f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x20ad, 0x20cd, 0x18ae, 0x08f3, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d4, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0x001f, 0x003f, 0x003f, 0x00df, 0x88f6, 0xc8d1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0x62d9, 0x04ff, 0x04bf, 0x049f, 0x047f, 0x06b6, 0x07f3, 0x07f8, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0x98f2, 0xb0f1, 0xb0f1, 0xb0f1, 0x78f0, 0x90f1, 0x80d1, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x08f7, 0x0119, 0x011a, 0x08f4, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18cd, 0x08f3, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f5, 0x18cd, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f6, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, 0x001f, 0x003f, 0x003f, 0x00bf, 0x311c, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x6278, 0x053f, 0x04ff, 0x04bf, 0x049f, 0x0696, 0x07f2, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x8912, 0xb0f1, 0xb0f1, 0xb0d1, 0x48f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x208d, 0x08f3, 0x0119, 0x00f9, 0x18ae, 0x18ae, 0x18ce, 0x00f9, 0x0119, 0x08f3, 0x18ad, 0x20ae, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18cf, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0x003f, 0x003f, 0x003f, 0x00bf, 0x011f, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x79d6, 0x051f, 0x051f, 0x04ff, 0x04bf, 0x0638, 0x07f1, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0f1, 0x80f2, 0xb0f1, 0xb0f1, 0xb0f2, 0x3110, 0x30f0, 0x28cf, 0x28ef, 0x20ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x0119, 0x0119, 0x0118, 0x08f5, 0x00f8, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ce, 0x0117, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0x003f, 0x003f, 0x001f, 0x009f, 0x00df, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9174, 0x049f, 0x057f, 0x051f, 0x04ff, 0x0619, 0x07f1, 0x07f6, 0x07fc, 0x07ff, 0x35bb, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x6912, 0xb0f1, 0xb0f1, 0x98f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d3, 0x20ad, 0x18ad, 0x10d3, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x011a, 0x011a, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x18b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x00f9, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x0117, 0x00f7, 0x00f9, 0x0119, 0x08f5, 0x20ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00fa, 0x011a, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x68b7, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa8f3, 0x041f, 0x057f, 0x053f, 0x051f, 0x05f9, 0x07f0, 0x07f6, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x5912, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x00f8, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0117, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x08f3, 0x00f6, 0x08f3, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x0117, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18cd, 0x20ae, 0x10d3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0x001f, 0x001f, 0x001f, 0x007f, 0x00bf, 0x009f, 0x90b5, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x0b9e, 0x053f, 0x057f, 0x053f, 0x05da, 0x07ef, 0x07f5, 0x07fb, 0x07ff, 0x5478, 0xb0d1, 0xb0f1, 0xb0f1, 0x9111, 0x5912, 0xa8f1, 0xb0f1, 0x70f1, 0x30f0, 0x28ef, 0x20ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x08f7, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x20ae, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x6098, 0xc0b1, 0xb8b1, 0xc0b1, 0xc0b1, 0x2afc, 0x04ff, 0x05bf, 0x055f, 0x05fb, 0x07cf, 0x07f4, 0x07fc, 0x07ff, 0x5c79, 0xb0f1, 0xb0f1, 0xb0f1, 0x8112, 0x5912, 0xb0f1, 0xb0f1, 0x68f1, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x10d3, 0x0119, 0x0119, 0x08d6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x005f, 0x7897, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0x6238, 0x04df, 0x05bf, 0x059f, 0x05fa, 0x07ce, 0x07f4, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x7112, 0x5912, 0xb0f1, 0xa8f1, 0x5110, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x28cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x08f6, 0x18d0, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f6, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x007f, 0x6878, 0xb8b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x9954, 0x047f, 0x05bf, 0x05bf, 0x061a, 0x07ce, 0x07f2, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x6112, 0x5912, 0xa8f1, 0xa8f1, 0x60f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0118, 0x00f6, 0x10d3, 0x08f6, 0x0118, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18b0, 0x00f8, 0x0139, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f8, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x003f, 0x001f, 0x7076, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x0bff, 0x05df, 0x05bf, 0x0639, 0x07cd, 0x07f2, 0x07fc, 0x07ff, 0x63f7, 0xb0f1, 0xb0f1, 0xb0f1, 0x4132, 0x4111, 0xa0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x001f, 0x001f, 0x9894, 0xb8d1, 0xb8d1, 0xb8d1, 0x42da, 0x059f, 0x05ff, 0x0678, 0x07cc, 0x07f1, 0x07fc, 0x07ff, 0x82b5, 0xa8f1, 0xb0f1, 0x98f2, 0x4132, 0x3912, 0x70f1, 0xa8f1, 0xa8f1, 0x50f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x10d4, 0x08f5, 0x08f6, 0x08f4, 0x08d3, 0x10cf, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x183e, 0xb0d2, 0xb8d1, 0xb8d1, 0x9974, 0x059f, 0x061f, 0x0698, 0x07cc, 0x07f0, 0x07fc, 0x07ff, 0x82b5, 0xb0f1, 0xb0f1, 0x88f1, 0x4132, 0x4111, 0x3910, 0x98f1, 0xa8f2, 0x88f1, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x385b, 0xb8d1, 0xb8d1, 0xb8d1, 0x2c3c, 0x061f, 0x06b7, 0x07cb, 0x07f0, 0x07fb, 0x07ff, 0xb0f1, 0xb0f1, 0xa8f1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xa0f1, 0xa8f1, 0x48ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x7096, 0xb8d1, 0xb8d1, 0x8a35, 0x063f, 0x06d6, 0x07ea, 0x07f1, 0x07fc, 0x07ff, 0xa8f1, 0xa8f1, 0xa8f1, 0x6132, 0x4132, 0x4111, 0x38f1, 0x3110, 0x48f0, 0xa8f1, 0x98f1, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x98b4, 0xb8d1, 0xb8d1, 0x3c9b, 0x06f5, 0x07e9, 0x07f1, 0x07fd, 0x26bd, 0xb0f1, 0xb0f2, 0xb0f1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30f0, 0x60f0, 0xa911, 0x70f0, 0x20ce, 0x20cf, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x083f, 0x70f7, 0xb8d1, 0xa952, 0x0e94, 0x07c9, 0x07f2, 0x07fd, 0x2e3c, 0xa8f1, 0xa8f1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x58f0, 0xa8f1, 0x40cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18b0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x00f9, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x003f, 0x00df, 0x59f8, 0xb8d1, 0x8291, 0x07c9, 0x07f2, 0x07fe, 0x455a, 0xb0f1, 0xa8f1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x50cf, 0x48ef, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x00f8, 0x0139, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x031f, 0x2d3b, 0x99b2, 0x454b, 0x07f3, 0x07fe, 0x5498, 0xb0f1, 0xa8f1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18cd, 0x10d1, 0x08f3, 0x08d3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x003f, 0x005f, 0x025f, 0x06fd, 0x0770, 0x0f88, 0x07f4, 0x07ff, 0x5478, 0xa8f1, 0xa8f1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x021f, 0x06fc, 0x078d, 0x07e7, 0x07f6, 0x07ff, 0x82b5, 0xa8f1, 0xa111, 0x4932, 0x4132, 0x4111, 0x38f1, 0x38f0, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x005f, 0x021f, 0x073b, 0x07ac, 0x07e7, 0x07f7, 0x07ff, 0x82b5, 0xa8f1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10f3, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x208d, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x10cf, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x023f, 0x073b, 0x07ab, 0x07e8, 0x07f9, 0x07ff, 0xa152, 0xa8f1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x20ad, 0x18ad, 0x20cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x005f, 0x007f, 0x009f, 0x023f, 0x0779, 0x07aa, 0x07e8, 0x07fb, 0x07ff, 0xa8f1, 0xa8f1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10d3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x0116, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdb0, 0xfdb0, 0xfdb1, 0xfdd1, 0xe4b2, 0xa911, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x02bf, 0x0778, 0x07c8, 0x07e9, 0x07fd, 0x173e, 0xa8f1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x08f4, 0x0119, 0x0119, 0x00f7, 0x08f6, 0x0119, 0x0119, 0x08f4, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfdef, 0xfdf0, 0xfdf0, 0xfdf0, 0xfdf1, 0xfdf1, 0xecb1, 0xa0f1, 0xa911, 0xa911, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x005f, 0x007f, 0x009f, 0x009f, 0x041f, 0x0797, 0x07c7, 0x07eb, 0x07fe, 0x2e5c, 0xa8f1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0118, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0f, 0xfe30, 0xfe30, 0xfe30, 0xfe31, 0xfe31, 0xdc32, 0xa111, 0xa911, 0xa111, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x043f, 0x0794, 0x07e6, 0x07ec, 0x07fe, 0x35db, 0xa911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x10d1, 0x10d3, 0x10f2, 0x10d1, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x00f8, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe50, 0xfe71, 0xfe51, 0xba52, 0xa111, 0xa111, 0x78d5, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x043f, 0x07b3, 0x07c5, 0x07ee, 0x07ff, 0x5478, 0x6ad6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f8, 0x18cf, 0x18ac, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe90, 0xfe91, 0xe471, 0xa111, 0xa112, 0xa111, 0x60d5, 0x001f, 0x283c, 0x7097, 0x405a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x00df, 0x045f, 0x07d2, 0x07e4, 0x07ef, 0x07ff, 0x2e3c, 0x2d1a, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x0119, 0x0118, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cc, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f7, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfeaf, 0xfed0, 0xfeb0, 0xfed1, 0xe491, 0xa911, 0xa111, 0x9931, 0xa111, 0x58d6, 0x88b5, 0xb8d1, 0xb8d1, 0x5059, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x00df, 0x047f, 0x07d2, 0x07e3, 0x07f1, 0x07ff, 0x07ff, 0x2cba, 0x4933, 0x4132, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f6, 0x18ad, 0x18ad, 0x18ac, 0x20ac, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ac, 0x18ad, 0x00f6, 0x0118, 0x0118, 0x18cf, 0x20ad, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x20ad, 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfed0, 0xfeb0, 0xfeb1, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x6933, 0xb0f1, 0xb0d1, 0xb0d1, 0x283c, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x011f, 0x047f, 0x07d1, 0x07e3, 0x07f3, 0x07ff, 0x07ff, 0x3b77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30ef, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x20ad, 0x0118, 0x0118, 0x20ad, 0x20ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x20ac, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0118, 0x00f6, 0x18cd, 0x18ac, 0x18ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cc, 0x20ac, 0x18ad, 0x00f6, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cd, 0x18ac, 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfeb0, 0xfe90, 0xe471, 0xb8d2, 0xa111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xb0f1, 0xb0d1, 0xb0d2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x00df, 0x011f, 0x011f, 0x049f, 0x07f0, 0x07e2, 0x07f4, 0x07ff, 0x07ff, 0x3af6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ee, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x20ad, 0x18ad, 0x0118, 0x0118, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x00f8, 0x0118, 0x00f5, 0x18ad, 0x20ac, 0x18ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x18cd, 0x0116, 0x0118, 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfeb0, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xb0f1, 0xb0d1, 0x90b4, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x049f, 0x07f1, 0x07e2, 0x07f6, 0x07ff, 0x0f9f, 0x4a35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ad, 0x20ad, 0x0118, 0x0118, 0x18ce, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x18ce, 0x0117, 0x0118, 0x0115, 0x18ad, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ad, 0x00f6, 0x0118, 0x0117, 0x18ce, 0x18ac, 0x20cc, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x18cc, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xe471, 0xb0d1, 0xa111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xb0d1, 0xb0d1, 0x7896, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x00bf, 0x011f, 0x011f, 0x013f, 0x017f, 0x04bf, 0x07f2, 0x07e2, 0x07f5, 0x07ff, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x00f5, 0x0117, 0x00f7, 0x18ce, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x18ae, 0x0117, 0x0118, 0x08f5, 0x18ad, 0x18ac, 0x18cd, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x08f3, 0x0118, 0x0117, 0x18ce, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xa8f1, 0xa111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xb0d1, 0xb0d1, 0x5878, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00ff, 0x013f, 0x013f, 0x017f, 0x019f, 0x033f, 0x07f3, 0x07e2, 0x07f3, 0x07ff, 0xa8f1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ad, 0x20ac, 0x18ac, 0x18ad, 0x00f5, 0x0118, 0x0117, 0x18ce, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x18ac, 0x20ac, 0x18ce, 0x08f5, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0117, 0x00f7, 0x18ce, 0x20ac, 0x18cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xb0f1, 0xb0f1, 0x285c, 0x003f, 0x005f, 0x007f, 0x00bf, 0x00ff, 0x013f, 0x015f, 0x017f, 0x019f, 0x01bf, 0x02ff, 0x07f4, 0x07e3, 0x07f1, 0x2e5c, 0xa911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x18ad, 0x0115, 0x0118, 0x00f7, 0x18ae, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x10d0, 0x10d2, 0x08d2, 0x18ae, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, + 0x18ac, 0x20ac, 0x20ac, 0x18cd, 0x0116, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x18ce, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xb0f1, 0xb0d1, 0x087f, 0x009f, 0x00bf, 0x00df, 0x011f, 0x015f, 0x019f, 0x019f, 0x019f, 0x01df, 0x01df, 0x01ff, 0x07f7, 0x07e3, 0x07ef, 0x5498, 0xa8f1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x0117, 0x0117, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ad, 0x0115, 0x0117, 0x00f7, 0x18ae, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ad, 0x00f5, 0x0117, 0x0118, 0x0117, 0x0117, 0x08f3, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20cc, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, + 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xb0f1, 0x98f3, 0x00df, 0x00ff, 0x011f, 0x013f, 0x017f, 0x01bf, 0x01bf, 0x01df, 0x01df, 0x01ff, 0x01ff, 0x021f, 0x06d9, 0x07e5, 0x07ec, 0x7355, 0xa8f1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390f, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x0117, 0x00f7, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x00f5, 0x0117, 0x0116, 0x18cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x00f5, 0x0117, 0x0118, 0x08f5, 0x0116, 0x0117, 0x0117, 0x10f2, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ab, 0x20ac, 0x20ac, + 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xa111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xa8f1, 0xb0f1, 0x80f5, 0x013f, 0x017f, 0x019f, 0x01bf, 0x01df, 0x01ff, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x023f, 0x057d, 0x07e8, 0x07e9, 0x82d5, 0xa0f1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38f0, 0x38ef, 0x30ef, 0x30ee, 0x28ce, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x00f7, 0x0117, 0x10d0, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18cd, 0x00f5, 0x0117, 0x08f5, 0x18ad, 0x20ac, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ad, 0x0117, 0x0117, 0x10d0, 0x20ac, 0x20ac, 0x08f3, 0x0117, 0x0115, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20cc, + 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ad, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ce, 0x28ee, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ee, 0x38ef, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xa932, 0xa131, 0xb131, 0xc912, 0xc911, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0x5158, 0x01bf, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x021f, 0x023f, 0x025f, 0x025f, 0x025f, 0x025f, 0x041f, 0x07ed, 0x07e4, 0x7ab4, 0xa911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x10d0, 0x0117, 0x00f7, 0x10d0, 0x20ac, 0x20cc, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x00f5, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x20ac, 0x20ac, 0x20ac, 0x10ef, 0x0117, 0x0117, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x18ac, 0x18ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ad, 0x28ce, 0x30ce, 0x30ce, 0x30ee, 0x8151, 0xb192, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d2, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x39bb, 0x021f, 0x023f, 0x025f, 0x027f, 0x027f, 0x025f, 0x025f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x029f, 0x07f3, 0x07e2, 0x9972, 0xa911, 0xa112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x08f2, 0x0117, 0x0116, 0x10d0, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ad, 0x00f4, 0x00f7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x10d1, 0x00f7, 0x0115, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18cc, 0x18ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x18ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30cd, 0x28ee, 0x30ee, 0x490e, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f2, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d2, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0x123e, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x02df, 0x06b9, 0x07e3, 0xa111, 0xa911, 0xa111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390f, 0x38ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x08d3, 0x0116, 0x0117, 0x10cf, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x18ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x00f4, 0x0117, 0x0116, 0x08f2, 0x08f2, 0x0117, 0x0116, 0x08f2, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x18ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30ed, 0x692f, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc8f1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x9933, 0x02df, 0x02df, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02ff, 0x051e, 0x07e8, 0xa912, 0xa111, 0xa111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410f, 0x390f, 0x38ee, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0117, 0x10d0, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x18cb, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x18ae, 0x0115, 0x0117, 0x0116, 0x0116, 0x0116, 0x00f4, 0x18cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x28ac, 0x20cc, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cd, 0x28ed, 0x28cd, 0x30cd, 0x9191, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc932, 0xc912, 0xc112, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8d1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88b4, 0x88b5, 0x88b5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x69d6, 0x033f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02ff, 0x035f, 0x03ff, 0x07f0, 0x8a4f, 0xa111, 0xa111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410f, 0x390f, 0x30ee, 0x30ee, 0x30cd, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0116, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20cc, 0x08d1, 0x08f3, 0x08f3, 0x10d0, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cc, 0x20ac, 0x28cc, 0x28cc, 0x28cc, 0x20cc, 0x28cc, 0x28cc, 0x28cd, 0x40ee, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0x90d5, 0x88d6, 0x6098, 0x5879, 0x303c, 0x305c, 0x081e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x291c, 0x411a, 0x6118, 0x8915, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0x429a, 0x039f, 0x039f, 0x035f, 0x035f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x031f, 0x031f, 0x031f, 0x037f, 0x03ff, 0x06d7, 0x7acf, 0xa111, 0xa111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410f, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0116, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cc, 0x490e, 0xc1d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc952, 0x98f5, 0x60b8, 0x407b, 0x183e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x011f, 0x013f, 0x017f, 0x019f, 0x01df, 0x021f, 0x21fd, 0x49d9, 0x7996, 0xa112, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x139e, 0x03df, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x033f, 0x033f, 0x035f, 0x03bf, 0x041f, 0x05de, 0x7ad1, 0xa111, 0xa111, 0xa111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x18ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x692f, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc992, 0xc9b2, 0xc972, 0xb973, 0x80f7, 0x387b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01bf, 0x01ff, 0x023f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x2adc, 0x5a58, 0x8994, 0xa8f1, 0xa8f1, 0x81d4, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x039f, 0x037f, 0x035f, 0x037f, 0x039f, 0x03ff, 0x047f, 0x04ff, 0x6375, 0xa112, 0xa111, 0xa111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390f, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x692e, 0xc9f3, 0xc9d2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc993, 0x80f7, 0x389b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x083c, 0x085b, 0x105b, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187a, 0x105b, 0x085d, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x01bf, 0x01ff, 0x021f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03df, 0x041f, 0x043f, 0x0c3f, 0x2bbc, 0x0c3f, 0x045f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03bf, 0x039f, 0x037f, 0x039f, 0x03df, 0x043f, 0x04bf, 0x053f, 0x5398, 0xa111, 0xa111, 0xa111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x08f1, 0x0115, 0x0115, 0x10ce, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x1378, 0x1378, 0x1358, 0x1358, 0x1378, 0x1378, 0x1358, 0x1378, 0x1358, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cb, 0x614e, 0xd1f3, 0xc9f3, 0xc9d3, 0xc9b2, 0xc9b3, 0xb173, 0x60d9, 0x081e, 0x003d, 0x083b, 0x1878, 0x1877, 0x28d2, 0x28d2, 0x40ee, 0x38ee, 0x390f, 0x390f, 0x390f, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4130, 0x38f3, 0x28b6, 0x189a, 0x003e, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x027f, 0x029f, 0x02ff, 0x033f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x047f, 0x04bf, 0x04df, 0x04df, 0x04bf, 0x04bf, 0x047f, 0x047f, 0x043f, 0x043f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03df, 0x043f, 0x047f, 0x04df, 0x057f, 0x3c1a, 0xa111, 0xa111, 0xa111, 0xa111, 0x5931, 0x4910, 0x4110, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x3af9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3af9, 0x3af9, 0x3af9, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x20cb, 0x28ab, 0x692e, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xb1b2, 0x58f3, 0x1895, 0x28b2, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x492f, 0x4930, 0x4910, 0x38f3, 0x20b8, 0x087d, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x019f, 0x01df, 0x021f, 0x025f, 0x02bf, 0x02df, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x04ff, 0x051f, 0x051f, 0x053f, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x047f, 0x047f, 0x045f, 0x045f, 0x043f, 0x041f, 0x03ff, 0x03df, 0x03ff, 0x043f, 0x045f, 0x04bf, 0x053f, 0x05bf, 0x2cdc, 0xa112, 0xa111, 0xa111, 0xa111, 0x7131, 0x4930, 0x4130, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0114, 0x10ce, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x625a, 0x625b, 0x5a5a, 0x5a5a, 0x625b, 0x20ca, 0x20aa, 0x20aa, 0x20aa, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28cb, 0x28cb, 0x612e, 0xc9f3, 0xc9d3, 0xc9d3, 0xb992, 0x692e, 0x28cc, 0x28ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x390e, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x38ee, 0x40ee, 0x40ee, 0x390f, 0x390e, 0x410e, 0x40ef, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4910, 0x4910, 0x4930, 0x4113, 0x28f8, 0x08fe, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x029f, 0x02bf, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x051f, 0x053f, 0x057f, 0x059f, 0x057f, 0x055f, 0x053f, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x049f, 0x047f, 0x045f, 0x043f, 0x041f, 0x041f, 0x043f, 0x045f, 0x04bf, 0x04ff, 0x055f, 0x05df, 0x0e1f, 0xa111, 0xa111, 0xa111, 0xa112, 0x8931, 0x4930, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x0114, 0x10cf, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20cb, 0x10cf, 0x10ef, 0x10ef, 0x18ce, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x81db, 0x81dc, 0x81db, 0x81db, 0x81bc, 0x81bb, 0x81bc, 0x81dc, 0x81dc, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x20cb, 0x612e, 0xd1f3, 0xc9f3, 0xc1b2, 0x612e, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197a, 0x01de, 0x021f, 0x027f, 0x02bf, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03ff, 0x045f, 0x049f, 0x04df, 0x051f, 0x057f, 0x059f, 0x05df, 0x05df, 0x05df, 0x05bf, 0x059f, 0x055f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04bf, 0x047f, 0x045f, 0x043f, 0x043f, 0x047f, 0x04bf, 0x04ff, 0x053f, 0x05bf, 0x061f, 0x069f, 0x9972, 0xa111, 0xa111, 0xa111, 0xa111, 0x5130, 0x4910, 0x410f, 0x390f, 0x390e, 0x38ed, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x00f4, 0x18cc, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18cc, 0x00f3, 0x0115, 0x0114, 0x0115, 0x00f4, 0x00f2, 0x20cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0xa93d, 0xa93d, 0xa95c, 0xa93d, 0xa95c, 0xa95d, 0xa93c, 0xa95d, 0xa93d, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x510d, 0xd1f3, 0xc9d2, 0x816f, 0x30cc, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31b6, 0x0a9d, 0x02ff, 0x035f, 0x039f, 0x03ff, 0x043f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x05bf, 0x05df, 0x061f, 0x063f, 0x063f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x047f, 0x047f, 0x047f, 0x049f, 0x04df, 0x053f, 0x057f, 0x05ff, 0x065f, 0x06df, 0x7a95, 0xa111, 0xa111, 0xa111, 0xa111, 0x6911, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x08f1, 0x0114, 0x0114, 0x18cd, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x08f2, 0x0115, 0x0114, 0x0115, 0x0114, 0x0115, 0x0114, 0x10ef, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0xc8be, 0xd0be, 0xc8be, 0xc8be, 0xd0be, 0xc8be, 0xd0be, 0xd0be, 0xc8be, + 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x40ec, 0xc1d2, 0xc1b3, 0x490d, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39d5, 0x131c, 0x041f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x059f, 0x05df, 0x061f, 0x067f, 0x069f, 0x069f, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x051f, 0x057f, 0x05bf, 0x063f, 0x069f, 0x071f, 0x5438, 0xa111, 0xa111, 0xa111, 0xa111, 0x8111, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x00f4, 0x18cc, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x18cc, 0x00f5, 0x0115, 0x00f4, 0x0115, 0x0115, 0x0114, 0x0115, 0x00f4, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x30cb, 0xa992, 0xa9b1, 0x30cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3a15, 0x237b, 0x053f, 0x059f, 0x5358, 0x349b, 0x0e1f, 0x06bf, 0x06ff, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x057f, 0x055f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04ff, 0x051f, 0x055f, 0x059f, 0x05ff, 0x065f, 0x06df, 0x073f, 0x359b, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x4930, 0x4910, 0x412f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x00f3, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x0115, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ca, + 0x790f, 0x68ee, 0x50ed, 0x38cc, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x692f, 0x816f, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28cb, 0x28cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49d4, 0x243a, 0xa132, 0xa8f1, 0xa8f1, 0xa8f1, 0x8295, 0x8295, 0x5418, 0x351b, 0x06df, 0x069f, 0x067f, 0x065f, 0x063f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x051f, 0x053f, 0x057f, 0x059f, 0x05df, 0x063f, 0x069f, 0x06ff, 0x077f, 0x0f5f, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0x6911, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x18cb, 0x00f2, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x00f5, 0x0114, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, + 0x8130, 0x8930, 0x8930, 0x8910, 0x8930, 0x790f, 0x690e, 0x48cd, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ee, 0x38ed, 0x38ed, 0x390e, 0x390e, 0x390e, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa172, 0x4c39, 0x2d5c, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x059f, 0x057f, 0x055f, 0x055f, 0x055f, 0x057f, 0x059f, 0x05df, 0x061f, 0x067f, 0x06df, 0x073f, 0x079f, 0x07df, 0x8254, 0xa111, 0xa131, 0xa111, 0x9911, 0x8131, 0x4910, 0x410f, 0x410e, 0x38ee, 0x38ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x08f2, 0x00f5, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x10f0, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, + 0x8930, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8910, 0x8130, 0x710f, 0x60ee, 0x48ed, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xa111, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa111, 0xa911, 0xa0f1, 0x9972, 0x4419, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05df, 0x061f, 0x065f, 0x06bf, 0x06ff, 0x075f, 0x07bf, 0x07ff, 0x5498, 0xa131, 0xa111, 0xa111, 0xa111, 0x9911, 0x4930, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20cc, 0x00f3, 0x00f4, 0x0114, 0x0114, 0x0114, 0x08f2, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, + 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x58ed, 0x48cc, 0x30cb, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x28cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x490f, 0x412f, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa111, 0x7a55, 0x34bb, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x063f, 0x065f, 0x069f, 0x06df, 0x071f, 0x077f, 0x07bf, 0x07ff, 0x2e3c, 0x9911, 0xa111, 0xa111, 0x9931, 0x9931, 0x6910, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20cb, 0x10cf, 0x10d0, 0x10ef, 0x10ce, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, + 0x8910, 0x8910, 0x8910, 0x810f, 0x890f, 0x890f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x690f, 0x58ee, 0x40cd, 0x30cc, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x62f6, 0x347b, 0x061f, 0x061f, 0x063f, 0x063f, 0x065f, 0x067f, 0x06bf, 0x071f, 0x073f, 0x079f, 0x07df, 0x07ff, 0x07ff, 0xa111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x810f, 0x810f, 0x810f, 0x890f, 0x8910, 0x8910, 0x8110, 0x8110, 0x8110, 0x8110, 0x8910, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x810f, 0x710f, 0x50ed, 0x40cc, 0x28ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x349b, 0x065f, 0x067f, 0x069f, 0x06bf, 0x06ff, 0x073f, 0x077f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0xa111, 0x9911, 0xa111, 0x9931, 0x9931, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x8910, 0x8910, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x810f, 0x710f, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa911, 0xa112, 0xa111, 0xa911, 0xa111, 0xa112, 0xa0f1, 0xa111, 0xa111, 0xa111, 0x7a75, 0x15fd, 0x06bf, 0x06ff, 0x071f, 0x075f, 0x079f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410f, 0x390e, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x790f, 0x690e, 0x50ed, 0x38cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x40ee, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x5931, 0x90f1, 0xa911, 0xa912, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0x9972, 0x353b, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8130, 0x8930, 0x8930, 0x790f, 0x690e, 0x50ed, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x8111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa112, 0xa111, 0xa111, 0x4499, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9931, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490f, 0x410f, 0x38ee, 0x30ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x90ef, 0x88ef, 0x80ef, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x60ee, 0x48ed, 0x38ec, 0x20aa, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x28ab, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x310e, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x7131, 0xa111, 0xa111, 0xa112, 0xa111, 0xa0f1, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa131, 0x6397, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390f, 0x38ee, 0x38ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x990f, 0x990f, 0x910f, 0x910f, 0x890f, 0x88ef, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x710f, 0x58ee, 0x48ed, 0x30cb, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x38ee, 0x30ed, 0x38ed, 0x390e, 0x38ee, 0x410e, 0x410f, 0x410f, 0x4930, 0x4930, 0x6931, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x6397, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x5c14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410f, 0x390e, 0x390e, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x910f, 0x98ef, 0x910f, 0x910f, 0x98ef, 0x990f, 0x910f, 0x890f, 0x88ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x8110, 0x8910, 0x8910, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x58ed, 0x40ed, 0x30cb, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x30ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0x9931, 0x5498, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x35f5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510f, 0x390e, 0x390e, 0x38ed, 0x30ed, 0x30cc, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x890f, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x890f, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x890f, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x68ef, 0x50ed, 0x40cc, 0x28cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x28cb, 0x20cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xa111, 0xa111, 0xa111, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa111, 0xa111, 0x3d7a, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28ab, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x18aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x78ee, 0x78ee, 0x80ee, 0x80ee, 0x80ee, 0x78ee, 0x80ee, 0x80ee, 0x80ef, 0x80ef, 0x80ef, 0x80ee, 0x80ef, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x8910, 0x8110, 0x8130, 0x8910, 0x810f, 0x8110, 0x810f, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x8110, 0x690f, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28cb, 0x20ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x9192, 0x1ebd, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x7a71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20ab, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x208a, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x78ee, 0x78ee, 0x78ee, 0x78ee, 0x80ee, 0x78ee, 0x78ee, 0x80ee, 0x80ee, 0x80ef, 0x80ef, 0x80ee, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810e, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x8110, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x890f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8130, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8910, 0x8910, 0x8130, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8130, 0x8930, 0x710f, 0x690e, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20cb, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ac, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cc, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x28ce, 0x28ce, 0x28ce, 0x28ee, 0x28ce, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ef, 0x390f, 0x390f, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xa111, 0xa111, 0xa111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07ff, 0x07ff, 0x07fd, 0x07f6, 0x5c32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390f, 0x30ef, 0x30ef, 0x30ee, 0x30ce, 0x28cd, 0x28ee, 0x28ed, 0x28cd, 0x20cd, 0x20ac, 0x20cd, 0x20cd, 0x20ad, 0x20cd, 0x20ad, 0x20cc, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cd, 0x20ad, 0x18cc, 0x20cc, 0x20ac, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x18cc, 0x18cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ab, 0x18ab, 0x18ab, 0x18ac, 0x18ac, 0x18ac, 0x18ab, + 0x78d0, 0x78d0, 0x78d0, 0x78f0, 0x78f0, 0x78f1, 0x78f0, 0x78f0, 0x78f0, 0x78f1, 0x78f1, 0x80f0, 0x78f1, 0x78f0, 0x80f1, 0x80d1, 0x80f1, 0x80f1, 0x80f1, 0x80f1, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8111, 0x8111, 0x8111, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8911, 0x8110, 0x8110, 0x8111, 0x8110, 0x8911, 0x8911, 0x8911, 0x8111, 0x8911, 0x8911, 0x8910, 0x8911, 0x8911, 0x8911, 0x8911, 0x8111, 0x8131, 0x8131, 0x8931, 0x8911, 0x8911, 0x8911, 0x8911, 0x8931, 0x8911, 0x8131, 0x8131, 0x8931, 0x8130, 0x8131, 0x8911, 0x8931, 0x7931, 0x6111, 0x4911, 0x30d2, 0x18f2, 0x10f2, 0x18d2, 0x18d2, 0x10f2, 0x18d2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x20f2, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xa111, 0xa111, 0x9931, 0x9911, 0xa111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5c38, 0x07ff, 0x07fd, 0x07f6, 0x44f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x1912, 0x18f2, 0x20f3, 0x18f2, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x10d2, 0x10d2, 0x10d2, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10b1, 0x10b1, 0x10b1, 0x10b1, 0x10d0, 0x10b0, 0x10d0, 0x10b0, 0x10b0, 0x10d0, 0x10b0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, + 0x0051, 0x0071, 0x0071, 0x0071, 0x0071, 0x0051, 0x0071, 0x0070, 0x0870, 0x0870, 0x0071, 0x0071, 0x0091, 0x0870, 0x0071, 0x0091, 0x0071, 0x0871, 0x0871, 0x0891, 0x0871, 0x0871, 0x0871, 0x0871, 0x0891, 0x0891, 0x0891, 0x0891, 0x0871, 0x0871, 0x0871, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0891, 0x0891, 0x0891, 0x0892, 0x0891, 0x0891, 0x08b1, 0x08b1, 0x08b1, 0x08b2, 0x10b2, 0x08b1, 0x08b2, 0x08b1, 0x08b2, 0x08b2, 0x08b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x08b2, 0x10b2, 0x10b2, 0x08b2, 0x08b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10d2, 0x10d2, 0x10d2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x18d2, 0x18d2, 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28f3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xa111, 0xa112, 0xa111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2e5c, 0x07fc, 0x07f6, 0x2e53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20f3, 0x2112, 0x20f3, 0x20d3, 0x1912, 0x18f2, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x10f2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d1, 0x10d1, 0x10d2, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x08b0, 0x10b0, 0x10b0, 0x08b0, 0x08b0, 0x10b0, 0x10d0, 0x08d0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, + 0x0cdc, 0x0cdc, 0x0cdb, 0x0cdc, 0x0cfb, 0x0cdc, 0x14dc, 0x14fc, 0x0cdc, 0x14fc, 0x14dc, 0x0cfc, 0x0cfc, 0x14fc, 0x0cfc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x153c, 0x153c, 0x153c, 0x153c, 0x151c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x155c, 0x153c, 0x153c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x155c, 0x155c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x157c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x365e, 0x2e5d, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3d, 0x363d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x361d, 0x361d, 0x361d, 0x361d, 0x361d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1e, 0x461e, 0x461d, 0x4dfe, 0x4dfd, 0x4e3e, 0x4dfe, 0x55dd, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7a74, 0x07fb, 0x07f6, 0x07f6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4cfb, 0x3dfe, 0x35dd, 0x35dd, 0x2ddd, 0x2ddd, 0x2ddd, 0x2ddd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25dc, 0x25bd, 0x25bd, 0x25bd, 0x1dbd, 0x25bc, 0x1dbd, 0x1dbd, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9c, 0x1d9c, 0x1dbc, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9c, 0x1d9d, 0x1d9c, 0x1d7c, 0x1d7c, 0x1d7d, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x157c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x155c, 0x155c, 0x1d5c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151b, 0x151b, 0x151b, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, + 0x0bfb, 0x0bfb, 0x0bfb, 0x0bfb, 0x0bfb, 0x0c1b, 0x0c1b, 0x0c1b, 0x0c1b, 0x141b, 0x141b, 0x145b, 0x14dc, 0x0cdb, 0x14bc, 0x143b, 0x141b, 0x0c1b, 0x0c1b, 0x141c, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143c, 0x143b, 0x145b, 0x151c, 0x0d1b, 0x151c, 0x145b, 0x143b, 0x145c, 0x143b, 0x145c, 0x1c5b, 0x143b, 0x145c, 0x145c, 0x145c, 0x145c, 0x145c, 0x145b, 0x145c, 0x145b, 0x145b, 0x1c5c, 0x145c, 0x147c, 0x147c, 0x147c, 0x145c, 0x1c7c, 0x1c5c, 0x147c, 0x147c, 0x1c7c, 0x1cdc, 0x1d5c, 0x155c, 0x1cbc, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2ddd, 0x2d5d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2dbd, 0x2dbd, 0x2cfd, 0x2d1d, 0x251c, 0x251c, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3d1d, 0x451d, 0x451d, 0x451d, 0x4d1d, 0x4d1d, 0x553d, 0x91b3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa112, 0x9931, 0x9931, 0x5496, 0x07f7, 0x07f7, 0x8a13, 0xa111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34dd, 0x34dd, 0x2cdd, 0x2cdc, 0x2cdd, 0x2cbc, 0x24dc, 0x24bc, 0x24bc, 0x253c, 0x25bd, 0x253c, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c7c, 0x1c9c, 0x1cdc, 0x1d7c, 0x1d5c, 0x1c9c, 0x1c9c, 0x1c7b, 0x1c7c, 0x1c9c, 0x1c7b, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c7c, 0x1c9c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x147c, 0x147c, 0x147c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c5c, 0x1c9c, 0x153c, 0x155c, 0x14bc, 0x145b, 0x145b, 0x1c5c, 0x147b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145c, 0x145c, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x151c, 0x14fb, 0x14fc, 0x145b, 0x143b, 0x143b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, + 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5a, 0x0a7a, 0x0a5a, 0x0afa, 0x0c1b, 0x0cbb, 0x0c9b, 0x0b9b, 0x0a9a, 0x125a, 0x0a7a, 0x0a7a, 0x0a7a, 0x0a7a, 0x127a, 0x127a, 0x0a7a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x129a, 0x129a, 0x129a, 0x133b, 0x145b, 0x0d1c, 0x149c, 0x131b, 0x129b, 0x129b, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129b, 0x129a, 0x129b, 0x129b, 0x129b, 0x129b, 0x129b, 0x129b, 0x129a, 0x129b, 0x1abb, 0x129b, 0x131b, 0x147c, 0x153b, 0x145c, 0x12fb, 0x1abb, 0x12ba, 0x1abb, 0x1abb, 0x12bb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b7c, 0x259d, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x245d, 0x259c, 0x22fc, 0x2afc, 0x231c, 0x2afc, 0x22fc, 0x231c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2afc, 0x2b1c, 0x2b1c, 0x2b1c, 0x331c, 0x331c, 0x331c, 0x331c, 0x331c, 0x3b1c, 0x3b3d, 0x3b3d, 0x3b3d, 0x433c, 0x433d, 0x4b3d, 0x435d, 0x5a9a, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07f9, 0x72d4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331c, 0x32fc, 0x2afb, 0x2afc, 0x2afb, 0x22fb, 0x22dc, 0x22dc, 0x22fb, 0x22db, 0x22db, 0x235c, 0x1d5c, 0x1d1d, 0x231b, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1bfc, 0x1d5c, 0x14dc, 0x1b3b, 0x1abb, 0x1adb, 0x1abb, 0x1abb, 0x12db, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x129b, 0x12bb, 0x129a, 0x12ba, 0x129a, 0x12db, 0x143b, 0x151b, 0x14bb, 0x1afb, 0x12ba, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x127a, 0x127a, 0x127a, 0x131b, 0x147c, 0x14db, 0x145b, 0x131a, 0x127a, 0x127a, 0x127a, 0x127a, + 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b5a, 0x0c1b, 0x0c9b, 0x0c9b, 0x0bba, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3b, 0x0b3a, 0x0b3a, 0x0b3b, 0x133b, 0x0b3b, 0x0b3b, 0x0b3b, 0x133a, 0x0b3a, 0x0c3b, 0x14dc, 0x14bc, 0x13fb, 0x0b3a, 0x133b, 0x133b, 0x133b, 0x135b, 0x0b5b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x135b, 0x0b5a, 0x135b, 0x135b, 0x135b, 0x135b, 0x0b5b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x13fb, 0x151c, 0x14fc, 0x13db, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x243c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x259c, 0x247c, 0x23bc, 0x23bc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23bc, 0x23bc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x33dc, 0x33dc, 0x33dc, 0x33dc, 0x3bdc, 0x3bfc, 0x3bfc, 0x3bdc, 0x43fc, 0x43fd, 0x6b18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6b53, 0x07fa, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbb, 0x23bb, 0x23bb, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bdb, 0x1d5c, 0x1d1c, 0x1b9b, 0x1b9b, 0x139b, 0x139c, 0x1b9b, 0x1b7b, 0x1b7b, 0x139b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b9b, 0x139b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b9b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x151c, 0x151c, 0x13db, 0x137b, 0x137b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x13da, 0x14fb, 0x0cfb, 0x141b, 0x133a, 0x135b, 0x133b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x0b5b, 0x133b, 0x133a, 0x0b3a, 0x133a, 0x133a, 0x0b3b, 0x0b3b, 0x0b3b, 0x0b3a, 0x133a, 0x0b1a, 0x0b3b, 0x0b3a, 0x0bda, 0x14bb, 0x0cbb, 0x0c1b, 0x0b3a, 0x0b3b, 0x0b3a, + 0x0bdb, 0x0c7b, 0x0c7b, 0x0c1a, 0x0b3a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c1b, 0x0cbb, 0x0c9b, 0x0bbb, 0x0b5a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x0b3a, 0x133b, 0x0b3a, 0x133a, 0x0b3a, 0x133a, 0x0b3a, 0x135a, 0x133a, 0x133b, 0x133a, 0x133b, 0x0b3a, 0x0c7b, 0x0cfb, 0x147b, 0x137b, 0x0b5b, 0x0b5b, 0x135a, 0x135a, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1b9c, 0x1bdc, 0x1bbb, 0x1c5b, 0x1cfb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1d3c, 0x1cbc, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9c, 0x1b9c, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9c, 0x1b9b, 0x1bbb, 0x239b, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbc, 0x33bc, 0x33bc, 0x33dc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4c98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4b19, 0x23bc, 0x239b, 0x239b, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x14bb, 0x151b, 0x13db, 0x137b, 0x137a, 0x137b, 0x137b, 0x137a, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x135a, 0x13bb, 0x14db, 0x14bb, 0x137b, 0x135a, 0x135b, 0x0b5a, 0x135b, 0x135b, 0x135a, 0x0b5a, 0x135a, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x0b5a, 0x0b5a, 0x135a, 0x133a, 0x135a, 0x133a, 0x0b3a, 0x133b, 0x133a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0c5b, 0x0cbb, 0x0c5b, 0x0b7a, 0x0b3a, 0x0b3b, 0x0b1a, 0x133b, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b9a, 0x0c9b, 0x0c9b, + 0x0bda, 0x02f9, 0x01f9, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0178, 0x0178, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0178, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a1a, 0x0b1a, 0x0c3a, 0x0c1b, 0x0ada, 0x09f9, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x09f9, 0x0b1a, 0x0c7b, 0x0c1b, 0x0aba, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19da, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19db, 0x19da, 0x19db, 0x19fb, 0x153c, 0x123a, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x11db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x19db, 0x19ba, 0x11da, 0x11ba, 0x1abb, 0x14fb, 0x1a5b, 0x19ba, 0x19ba, 0x11da, 0x11da, 0x19db, 0x19db, 0x19da, 0x19db, 0x19ba, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x21db, 0x21db, 0x21db, 0x21fb, 0x21fb, 0x29fb, 0x29fb, 0x29fb, 0x29fb, 0x31fb, 0x321b, 0x31fb, 0x321b, 0x41fa, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72d4, 0x4c98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21db, 0x21da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11d9, 0x137a, 0x149b, 0x131a, 0x11ba, 0x119a, 0x11b9, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x0999, 0x1199, 0x1199, 0x1199, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x0999, 0x09b9, 0x0999, 0x0a1a, 0x0bfb, 0x0c9b, 0x131a, 0x09da, 0x119a, 0x0999, 0x0999, 0x0999, 0x1199, 0x099a, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0aba, 0x0bda, 0x0c5b, 0x0b3a, 0x09f9, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0979, 0x0979, 0x0979, 0x0999, 0x0979, 0x0999, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0178, 0x0199, 0x0179, 0x0979, 0x0999, 0x02b9, + 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02d9, 0x02d9, 0x02b9, 0x0ab9, 0x0ad9, 0x02d9, 0x0ad9, 0x0ab9, 0x0ab9, 0x03ba, 0x043a, 0x043a, 0x0359, 0x02d9, 0x0ad9, 0x02d9, 0x0ad9, 0x02d9, 0x02d9, 0x0ad9, 0x0ad9, 0x0ad9, 0x02d9, 0x0ad9, 0x02d9, 0x02d9, 0x0ada, 0x0afa, 0x02fa, 0x02fa, 0x02d9, 0x02fa, 0x0ada, 0x0afa, 0x02fa, 0x0afa, 0x0afa, 0x0ad9, 0x0afa, 0x0ada, 0x0afa, 0x0b5a, 0x0c5b, 0x047a, 0x0bba, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133a, 0x135b, 0x135a, 0x135b, 0x135b, 0x149b, 0x13fb, 0x133a, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x133a, 0x135a, 0x133a, 0x143b, 0x147b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133a, 0x135b, 0x133b, 0x133b, 0x1b3b, 0x1b5b, 0x1b5b, 0x1b3b, 0x1b5b, 0x235b, 0x235b, 0x235b, 0x235b, 0x2b5b, 0x2b5b, 0x2b7b, 0x2b7b, 0x335b, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72d5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71b4, 0x1b3b, 0x1b3b, 0x133a, 0x133b, 0x133a, 0x131a, 0x131a, 0x131a, 0x131a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0afa, 0x0b1a, 0x0afa, 0x0bda, 0x0cbb, 0x0bda, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0bba, 0x049b, 0x0c3a, 0x0b3a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x0ada, 0x0ada, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02da, 0x0ada, 0x0ada, 0x0ada, 0x02d9, 0x02d9, 0x02da, 0x02fa, 0x02d9, 0x0ad9, 0x0ad9, 0x0b5a, 0x045a, 0x045a, 0x033a, 0x0ad9, 0x02d9, 0x02d9, 0x02da, 0x0ada, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ab9, 0x0ab9, 0x02d9, 0x02d9, 0x0ab9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ab9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x0ab9, + 0x0299, 0x0299, 0x0298, 0x0298, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02b8, 0x02b9, 0x0299, 0x02b8, 0x039a, 0x041a, 0x03fa, 0x0339, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x03ba, 0x043a, 0x03fa, 0x02f9, 0x02d9, 0x02d9, 0x0ab9, 0x0ab9, 0x02d9, 0x02b9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ad9, 0x0ad9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b7a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bda, 0x0c7b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x131a, 0x131a, 0x131a, 0x131a, 0x131a, 0x1b1a, 0x1b3a, 0x1b3a, 0x1b3a, 0x1b3a, 0x233a, 0x233a, 0x233b, 0x2b3b, 0x2b5b, 0x3ad9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1b1a, 0x131a, 0x131a, 0x12fa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x035a, 0x045a, 0x0c3a, 0x0afa, 0x02da, 0x0afa, 0x0af9, 0x02f9, 0x0afa, 0x0afa, 0x0afa, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ad9, 0x02d9, 0x02da, 0x0ad9, 0x0ad9, 0x02ba, 0x02d9, 0x039a, 0x043a, 0x03da, 0x02d9, 0x0ab9, 0x02d9, 0x0ab9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x03fa, 0x041a, 0x03b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02b8, 0x02b8, + 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0198, 0x02b8, 0x0399, 0x0359, 0x0258, 0x0198, 0x0137, 0x0137, 0x0117, 0x0158, 0x0137, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0158, 0x0259, 0x0399, 0x0399, 0x0258, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0158, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0bfa, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0bda, 0x02d9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199a, 0x1999, 0x2199, 0x219a, 0x21ba, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01d8, 0x0399, 0x0399, 0x01d9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0157, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0218, 0x0379, 0x03b9, 0x0258, 0x0158, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0137, 0x0238, 0x0359, 0x0399, 0x0298, 0x0178, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, + 0x0116, 0x0116, 0x0116, 0x00f7, 0x00f6, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0238, 0x0318, 0x0379, 0x0297, 0x0197, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0177, 0x02d8, 0x0399, 0x0318, 0x01d7, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02b9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01d8, 0x03f9, 0x01f8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03f9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0138, 0x0117, 0x0137, 0x0238, 0x0379, 0x0379, 0x0238, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0136, 0x0117, 0x0117, 0x0117, 0x0136, 0x0137, 0x01b7, 0x02b8, 0x0399, 0x02b8, 0x0197, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x0116, 0x00f6, 0x0116, 0x01b7, 0x02b7, 0x0378, 0x02b7, 0x01d6, 0x0116, 0x00f7, 0x00f6, 0x0116, 0x00f6, 0x0116, 0x0116, 0x00f6, 0x00f6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0136, 0x0197, 0x02f8, 0x0378, 0x0297, 0x0177, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0116, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03f9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03b9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01b7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x00f7, 0x0217, 0x0339, 0x02f8, 0x0197, 0x0136, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0156, 0x0237, 0x0358, 0x02d8, 0x01f7, 0x0116, 0x00f6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x00f6, 0x00f6, 0x0116, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x0116, + 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x02b7, 0x0297, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x0318, 0x0357, 0x0338, 0x02d7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b8, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b8, 0x02b8, 0x02b7, 0x0317, 0x0358, 0x0338, 0x02f7, 0x02d7, 0x02b7, 0x02b7, 0x02b7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0af8, 0x0af8, 0x0af8, 0x0af8, 0x0b18, 0x0b18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1b18, 0x2af8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0af8, 0x0af8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x0378, 0x0378, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02b7, 0x02d7, 0x02d7, 0x02d7, 0x02b7, 0x02b7, 0x02f7, 0x0358, 0x0358, 0x02f7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02d7, 0x0338, 0x0357, 0x02f7, 0x0297, 0x0297, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x0297, 0x0297, 0x0297, 0x02b7, 0x0297, 0x0297, 0x02b7, 0x0297, + 0x0175, 0x0155, 0x0155, 0x0156, 0x0175, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x01b6, 0x0257, 0x02f7, 0x02d7, 0x0216, 0x0176, 0x0155, 0x0175, 0x0156, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0176, 0x0155, 0x0176, 0x0176, 0x0176, 0x0175, 0x0176, 0x0175, 0x0156, 0x0176, 0x0176, 0x0176, 0x0155, 0x01b6, 0x0296, 0x0337, 0x0296, 0x01d6, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0196, 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01f7, 0x0358, 0x0196, 0x0196, 0x01b6, 0x0196, 0x01b6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02f7, 0x02f7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01b6, 0x01b6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09b7, 0x0997, 0x09b7, 0x09b7, 0x09b7, 0x11b7, 0x11b7, 0x11d7, 0x11b7, 0x11b7, 0x11b7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09b6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02b7, 0x0337, 0x0216, 0x0196, 0x0196, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0196, 0x0195, 0x0216, 0x02f7, 0x0317, 0x0216, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0175, 0x0176, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0175, 0x0155, 0x0196, 0x0256, 0x0317, 0x02b7, 0x01b6, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0155, 0x0155, 0x0175, 0x0155, 0x0155, 0x0155, + 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b4, 0x00d3, 0x00d3, 0x00b4, 0x00d4, 0x0174, 0x0235, 0x02d6, 0x0235, 0x0174, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x0135, 0x0235, 0x02d6, 0x0236, 0x0134, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d4, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x0115, 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f5, 0x00d5, 0x00d5, 0x00d6, 0x00d6, 0x00d5, 0x00f5, 0x02f7, 0x0176, 0x00f5, 0x00d5, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x0116, 0x02f7, 0x01d6, 0x00d6, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x08f6, 0x08f6, 0x08f6, 0x08f6, 0x0916, 0x0916, 0x10f6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08f5, 0x08f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x01d6, 0x02f7, 0x0236, 0x0114, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00f4, 0x01d5, 0x02d6, 0x0236, 0x0114, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x0114, 0x01f5, 0x02b5, 0x0235, 0x0154, 0x00d3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, + 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x01d3, 0x0253, 0x0234, 0x0173, 0x00d2, 0x0092, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b2, 0x0153, 0x0234, 0x0274, 0x01b3, 0x00f3, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x01b4, 0x02b5, 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01f5, 0x0235, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x0154, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x08d4, 0x08d4, 0x08d4, 0x08f4, 0x08f4, 0x08f4, 0x08f5, 0x10f4, 0x10d5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00d3, 0x00d3, 0x0214, 0x0295, 0x0153, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00d2, 0x01b3, 0x0274, 0x01d3, 0x00f2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0092, 0x00b2, 0x00b1, 0x0172, 0x0253, 0x0233, 0x0152, 0x00b1, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, + 0x0090, 0x0090, 0x0090, 0x00b0, 0x0151, 0x0212, 0x0232, 0x0191, 0x00f0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0090, 0x0091, 0x00b1, 0x0171, 0x0232, 0x0213, 0x0151, 0x0090, 0x00b0, 0x0090, 0x0091, 0x00b1, 0x00b0, 0x0090, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x00d1, 0x0172, 0x0253, 0x01b2, 0x00d1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x0293, 0x00d2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0172, 0x0253, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x08b2, 0x08b2, 0x08b2, 0x08d2, 0x08b2, 0x08d2, 0x08d3, 0x10d3, 0x40f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00d2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0131, 0x0252, 0x01f2, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00b1, 0x0091, 0x0091, 0x00b0, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0090, 0x00b0, 0x0091, 0x00b0, 0x01b2, 0x0252, 0x01b1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x01d1, 0x0232, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x008f, 0x0130, 0x01b1, 0x0232, 0x01b1, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0191, 0x0232, 0x01d1, 0x00f0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0171, 0x0232, 0x01d1, 0x00f1, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x0171, 0x0091, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x01d1, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01b1, 0x0252, 0x0131, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01b1, 0x0232, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0252, 0x01b1, 0x0110, 0x0090, 0x0090, 0x0090, + 0x0212, 0x01f1, 0x0150, 0x00af, 0x008f, 0x008f, 0x006f, 0x0090, 0x0090, 0x0070, 0x006f, 0x006f, 0x008f, 0x008f, 0x0070, 0x0070, 0x006f, 0x008f, 0x006f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x006f, 0x008f, 0x008f, 0x008f, 0x0130, 0x01d1, 0x0212, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x0151, 0x0211, 0x01d1, 0x00f0, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f1, 0x0171, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00b0, 0x00b0, 0x00b1, 0x08b1, 0x08b0, 0x08b1, 0x08b1, 0x50f1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f1, 0x0211, 0x01d2, 0x00d0, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x00b0, 0x01b1, 0x0232, 0x0151, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x008f, 0x00b0, 0x0151, 0x0211, 0x0212, 0x0130, 0x00af, + 0x00cf, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00af, 0x0130, 0x01f2, 0x0212, 0x0131, 0x00af, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x0090, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0130, 0x0212, 0x01f2, 0x00f0, 0x0070, 0x008f, 0x006f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00f0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f0, 0x0232, 0x00f1, 0x00b0, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0890, 0x08b0, 0x0891, 0x10b0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0191, 0x0212, 0x0150, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x006f, 0x008f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x00d0, 0x01d2, 0x0212, 0x0150, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x0110, 0x01d1, 0x0212, + 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x00af, 0x0171, 0x0212, 0x01d1, 0x0110, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x0110, 0x01f2, 0x0212, 0x0130, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0191, 0x01b1, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x006f, 0x008f, 0x0131, 0x0232, 0x00d0, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60f1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006f, 0x0090, 0x006f, 0x008f, 0x008f, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x01f2, 0x01d1, 0x00cf, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x00f0, 0x01b2, 0x0232, 0x0150, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00f0, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x00ef, 0x01b1, 0x0212, 0x0191, 0x00d0, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x00ef, 0x01d1, 0x01f1, 0x0130, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00cf, 0x0232, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x0191, 0x0212, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x18af, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9931, 0xa111, 0x29d2, 0x01b1, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0150, 0x0232, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00f0, 0x01d1, 0x01f1, 0x0130, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006e, 0x008f, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x0130, 0x01d1, 0x0212, 0x0150, 0x00af, 0x006e, 0x006e, 0x008e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x006f, 0x00cf, 0x01b1, 0x0212, 0x0130, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x01d1, 0x0130, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x01f1, 0x01b1, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28d0, 0x01f2, 0x01d1, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x00cf, 0x01f1, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006f, 0x006e, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x00f0, 0x01d1, 0x01f1, 0x0110, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0150, 0x0212, 0x01d1, 0x0110, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0212, 0x0150, 0x008f, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0110, 0x01f1, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x0110, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x48d0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008e, 0x008f, 0x01b1, 0x01f2, 0x00af, 0x006f, 0x006e, 0x008f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x0232, 0x0150, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x0110, 0x01f1, 0x01f1, 0x0110, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0190, 0x0212, 0x0190, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0170, 0x0212, 0x0150, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x108f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006e, 0x006f, 0x006e, 0x0190, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01b1, 0x01f2, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x01f1, 0x01b1, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x00ef, 0x01b1, 0x01f1, 0x0150, 0x008f, 0x006e, 0x006e, 0x004e, 0x004e, 0x004e, 0x004e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0170, 0x0212, 0x0171, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0170, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01f1, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x68f0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x0130, 0x01f2, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x01d1, 0x01b1, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, + 0x006e, 0x006d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x0130, 0x01d1, 0x01d1, 0x010f, 0x006e, 0x006d, 0x006d, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006d, 0x006e, 0x006e, 0x0170, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0211, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01b1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x38b0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x010f, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01d1, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006d, 0x004d, 0x008e, 0x0150, 0x01f1, 0x01b1, 0x00cf, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006d, + 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x008e, 0x0170, 0x01f1, 0x01b1, 0x00ef, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x012f, 0x01f1, 0x0170, 0x008e, 0x006d, 0x006d, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x01d1, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x008e, 0x01f1, 0x012f, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x086e, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0211, 0x0190, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004d, 0x00ef, 0x01f2, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x012f, 0x01f1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x004d, 0x006d, 0x006d, + 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x00ce, 0x0190, 0x0211, 0x0170, 0x008e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x0150, 0x01f1, 0x01b1, 0x00ce, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004d, 0x004d, 0x004e, 0x010f, 0x01d1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x00ce, 0x0212, 0x00ce, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x70f0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x008e, 0x01d1, 0x0190, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x0171, 0x01f2, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008e, 0x012f, 0x01f1, 0x0170, 0x008e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x00ef, 0x01d1, 0x01d1, 0x012f, 0x008d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x00ef, 0x01f1, 0x01b0, 0x00ce, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006e, 0x01f1, 0x008e, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x010f, 0x01f1, 0x006d, 0x006d, 0x004d, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004e, 0x006d, 0x006d, 0x004d, 0x40cf, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70f0, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0191, 0x01b1, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x00ee, 0x01f1, 0x0190, 0x008e, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0150, 0x0212, 0x0170, 0x008e, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, + 0x0211, 0x0211, 0x0212, 0x01f2, 0x0212, 0x01f2, 0x01f1, 0x0211, 0x0211, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0211, 0x0211, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0232, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x11f1, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x5991, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0212, 0x0211, 0x0212, 0x0212, 0x01f2, 0x0212, 0x0211, 0x01f1, 0x0211, 0x0211, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, + 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x00ae, 0x0170, 0x01f1, 0x0170, 0x00ce, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x00ef, 0x01d1, 0x01d1, 0x00ee, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x012f, 0x0212, 0x012f, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x01b1, 0x01d1, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x00ae, 0x0212, 0x00ae, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x0150, 0x014f, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x0212, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x00ae, 0x01f1, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01b1, 0x0150, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x88f0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9911, 0x9931, 0x40af, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010f, 0x0212, 0x00ae, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004c, 0x006d, 0x00ce, 0x01d1, 0x0190, 0x008e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0170, 0x01f1, 0x012f, 0x006d, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004c, 0x004c, 0x004c, 0x00ee, 0x0190, 0x01d1, 0x012f, 0x008d, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x00ae, 0x0190, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x00ae, 0x01b1, 0x01b1, 0x008d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x008d, 0x01b1, 0x0170, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x01d1, 0x010f, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01f1, 0x008e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x0212, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01d1, 0x00ee, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008d, 0x01f1, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x50cf, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa111, 0x186e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x00ef, 0x01f1, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x006d, 0x0150, 0x01f1, 0x010f, 0x004d, 0x004c, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x008e, 0x0190, 0x01d1, 0x012f, 0x006d, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x006d, 0x010f, 0x01b1, 0x01d1, 0x00ee, 0x006d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x0190, 0x01d1, 0x00ee, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x01f1, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x008e, 0x01f1, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x006d, 0x0170, 0x0190, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010f, 0x01d1, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x0212, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010e, 0x01b0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01f1, 0x00ad, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x308e, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9111, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01f1, 0x012f, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008d, 0x01b0, 0x01b1, 0x008d, 0x004d, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00cd, 0x0191, 0x01d1, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x01d1, 0x0170, 0x00ae, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0190, 0x01d1, 0x010f, 0x006d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01d1, 0x0190, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ee, 0x01f1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x01b0, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0170, 0x010f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x0212, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006d, 0x01f1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006c, 0x004c, 0x012f, 0x01b0, 0x006d, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x084d, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x68f0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01b0, 0x016f, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x0211, 0x010f, 0x004d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x0190, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x006c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0150, 0x01f1, 0x012f, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x006d, 0x014f, 0x01d1, 0x010f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x00ee, 0x01d1, 0x00ce, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01f1, 0x008e, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0211, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0212, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0170, 0x0170, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x80f0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x388e, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006d, 0x01b0, 0x01b1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008e, 0x01b0, 0x01b0, 0x00ad, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01b0, 0x01b1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x004c, 0x004c, 0x002c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002c, 0x002c, 0x002c, 0x002c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x002c, 0x004c, 0x008d, 0x0150, 0x01d1, 0x012f, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01b0, 0x0190, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x01f1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010f, 0x016f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006c, 0x01d1, 0x010e, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x50cf, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x084c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x014f, 0x01b1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010e, 0x01d1, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x00ce, 0x01b1, 0x01b1, 0x00ee, 0x004c, 0x002c, 0x004c, + 0x004b, 0x002b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004c, 0x002c, 0x004c, 0x004c, 0x012f, 0x01f1, 0x014f, 0x006c, 0x004b, 0x004c, 0x002c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x014f, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x01b0, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0190, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01b1, 0x00ce, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01b1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01f1, 0x00ae, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x388e, 0x9931, 0x9931, 0x9931, 0x9931, 0x68d0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x012e, 0x01d1, 0x008d, 0x004c, 0x004c, 0x004b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x004c, 0x008c, 0x0170, 0x01b1, 0x00ad, 0x004c, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002c, 0x00ee, 0x01b1, 0x0190, 0x00ad, 0x002b, + 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004c, 0x004c, 0x004b, 0x002b, 0x004c, 0x004b, 0x004b, 0x004b, 0x006c, 0x010e, 0x01d1, 0x014f, 0x006c, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x002c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x00cd, 0x01b1, 0x0170, 0x008c, 0x004b, 0x002c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x004b, 0x004b, 0x004c, 0x0190, 0x0190, 0x004c, 0x004b, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x012f, 0x0190, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01d1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f2, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010e, 0x0170, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ce, 0x01d1, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x002c, 0x002c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x104c, 0xa111, 0x9931, 0x9931, 0x9931, 0x288d, 0x004b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004c, 0x002b, 0x004b, 0x00ee, 0x01f2, 0x00cd, 0x004b, 0x004c, 0x002b, 0x004c, 0x004c, 0x002b, 0x004b, 0x002b, 0x002b, 0x002c, 0x004b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004c, 0x002b, 0x00ee, 0x01d1, 0x012f, 0x004c, 0x002b, 0x004c, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x002b, 0x004c, 0x00ee, 0x01b1, 0x0170, + 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004c, 0x010e, 0x01b1, 0x0170, 0x008c, 0x002b, 0x004b, 0x002b, 0x004b, 0x002c, 0x002c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x006c, 0x0170, 0x01d1, 0x00cd, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x008d, 0x0190, 0x014f, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004b, 0x002b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x00cd, 0x01d1, 0x008c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x014f, 0x012e, 0x002c, 0x004b, 0x004c, 0x004b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x01f1, 0x006c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x002c, 0x004c, 0x004c, 0x002b, 0x004c, 0x014f, 0x01b0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x002b, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x9931, 0x9931, 0x9931, 0x8910, 0x002c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x002b, 0x004c, 0x002b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004b, 0x00ac, 0x01d1, 0x010f, 0x004b, 0x002c, 0x004c, 0x002c, 0x004c, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x004b, 0x002b, 0x004c, 0x002b, 0x006c, 0x014f, 0x01d1, 0x00cd, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004c, 0x010e, + 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00ed, 0x01b1, 0x0170, 0x008d, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x00ad, 0x01d1, 0x016f, 0x004c, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x008d, 0x01d1, 0x012f, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004c, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x006c, 0x01d1, 0x00cd, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x002b, 0x004c, 0x004b, 0x004c, 0x004b, 0x004c, 0x01d1, 0x006c, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x01f1, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x014f, 0x010e, 0x004b, 0x004b, 0x002c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004c, 0x004b, 0x004b, 0x0190, 0x012f, 0x004b, 0x004c, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004c, 0x004b, 0x004b, 0x002b, 0x70f0, 0x9931, 0x9931, 0x48ae, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x008c, 0x01b1, 0x014f, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00cd, 0x01d1, 0x0150, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, + 0x002a, 0x002a, 0x004a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x004a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00cd, 0x01b0, 0x0170, 0x00ac, 0x002a, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x016f, 0x01d1, 0x00ad, 0x002b, 0x002a, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x00ce, 0x01d1, 0x00cd, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x0190, 0x012f, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x00ee, 0x0190, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x01f2, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x00ad, 0x01b1, 0x002b, 0x002c, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x006c, 0x01d1, 0x00ce, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x60cf, 0x9931, 0x9931, 0x104c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x0190, 0x0190, 0x004c, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x01b1, 0x00ad, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x004b, 0x004b, 0x002b, 0x002b, 0x004a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00cd, 0x0190, 0x01b0, 0x00cd, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x002a, 0x004a, 0x002a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002a, 0x004b, 0x00cd, 0x01d1, 0x012f, 0x004b, 0x004b, 0x002a, 0x004b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x00ce, 0x01d1, 0x00ad, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x0190, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x0190, 0x00cd, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x01d1, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x01b0, 0x00ad, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x00ad, 0x01d1, 0x008c, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x48ae, 0x9931, 0x68f0, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x0190, 0x006c, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x004b, 0x004b, 0x002a, 0x002b, 0x004b, 0x002b, 0x002b, 0x002a, 0x002b, 0x004a, 0x00ac, 0x0190, 0x0170, 0x006c, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x008c, 0x0170, 0x0190, 0x00cd, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x006b, 0x016f, 0x0190, 0x008c, 0x002a, 0x004a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x012f, 0x01b1, 0x006c, 0x004b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x002b, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x00cd, 0x01b1, 0x004b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x006c, 0x01d1, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x01d1, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x010e, 0x014f, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x010e, 0x0190, 0x004b, 0x002a, 0x002b, 0x002a, 0x002b, 0x002b, 0x002a, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x308d, 0x9911, 0x206c, 0x004b, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002a, 0x004b, 0x004a, 0x004b, 0x004a, 0x002a, 0x002b, 0x002b, 0x004b, 0x002a, 0x002a, 0x002a, 0x002b, 0x010e, 0x01b1, 0x008c, 0x002a, 0x004a, 0x002b, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004b, 0x010e, 0x01b0, 0x00ed, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x0029, 0x008b, 0x016f, 0x01b0, 0x00cd, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ed, 0x01b1, 0x010e, 0x004a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004b, 0x014f, 0x016f, 0x004b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002a, 0x008b, 0x01b1, 0x008c, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002b, 0x002a, 0x002a, 0x012e, 0x012f, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d2, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x004b, 0x01d1, 0x006b, 0x002a, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x014f, 0x014f, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x186b, 0x88f1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00cd, 0x01b1, 0x00cd, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x00ac, 0x0190, 0x016f, 0x006b, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008b, 0x014f, 0x0190, 0x00ed, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x006a, 0x014f, 0x0190, 0x00ab, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x004a, 0x0170, 0x016f, 0x004a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x0170, 0x00ed, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0190, 0x008c, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x012f, 0x010e, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x004b, 0x0190, 0x00ed, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x286b, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ac, 0x01b1, 0x00ed, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x00ee, 0x01b1, 0x010d, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0049, 0x012e, 0x0190, 0x00ed, 0x004a, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00cc, 0x01b0, 0x010e, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006b, 0x0190, 0x012e, 0x0049, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x012e, 0x016f, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ac, 0x0190, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x0029, 0x00ac, 0x0190, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x008b, 0x01b1, 0x008b, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006b, 0x01b0, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008b, 0x0170, 0x014f, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x010d, 0x01b1, 0x00ed, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x006a, 0x014f, 0x016f, 0x008b, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006a, 0x01b0, 0x00ed, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x00cd, 0x01b0, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x014f, 0x00cd, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01d1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x0190, 0x00ab, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004a, 0x0029, 0x0029, 0x00cc, 0x01b1, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x016f, 0x012e, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0009, 0x00ed, 0x01b1, 0x00ed, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x010e, 0x0191, 0x010e, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x01b1, 0x00ec, 0x0008, 0x0028, 0x0028, 0x0029, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x00ab, 0x01b1, 0x00ac, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x006a, 0x01b1, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004a, 0x01b1, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01b1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00ed, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x012e, 0x016f, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0029, 0x0049, 0x012e, 0x016f, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x006a, 0x014f, 0x0170, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ed, 0x0190, 0x010e, 0x004a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0029, 0x006a, 0x016f, 0x014f, 0x006a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x0190, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x00cc, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01b1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x004a, 0x01b1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x016f, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x0029, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x010d, 0x0190, 0x006a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x0190, 0x00ed, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0049, 0x00ed, 0x0190, 0x012f, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ec, 0x01b0, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x012e, 0x012e, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x016f, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012e, 0x00ec, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00ab, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00cc, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0049, 0x014e, 0x0170, 0x008b, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00cc, 0x0190, 0x014f, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008a, 0x014f, 0x012f, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012e, 0x014f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x016f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x008b, 0x018f, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00ab, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ac, 0x0190, 0x00ac, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ac, 0x0190, 0x012e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00cb, 0x0170, 0x014f, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0009, 0x0028, 0x0049, 0x00ed, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x014f, 0x014f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0170, 0x008a, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x014f, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x010d, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x00ac, 0x0170, 0x0170, 0x008b, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x008a, 0x016f, 0x014e, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x006a, 0x0170, 0x010e, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00cd, 0x010d, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012f, 0x012e, 0x0008, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014f, 0x010e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ab, 0x0190, 0x010e, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x008a, 0x016f, 0x016f, 0x00ac, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x010d, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014f, 0x010d, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00cb, 0x016f, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x01b1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0170, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x014f, 0x014f, 0x0049, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x010d, 0x01b0, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x008b, 0x014f, 0x0170, 0x00ab, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x008b, 0x0170, 0x014e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ab, 0x0191, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ec, 0x016f, 0x0049, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012e, 0x00cc, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x012e, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0191, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x010e, 0x0170, 0x006a, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008a, 0x0170, 0x014f, 0x004a, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x012f, 0x0190, 0x00ec, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x0190, 0x006a, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0190, 0x008a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x01b1, 0x0049, 0x0008, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ab, 0x0170, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ac, 0x0190, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00ec, 0x0190, 0x008b, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0048, 0x00ed, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x00ec, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0008, 0x00ab, 0x0190, 0x012e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x0170, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0069, 0x0190, 0x008b, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x010e, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010d, 0x014f, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0008, 0x00cb, 0x0191, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x006b, 0x014f, 0x014e, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012f, 0x014f, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014f, 0x00ed, 0x0029, 0x0028, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0170, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x00ed, 0x010e, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014f, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x0191, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp b/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp new file mode 100644 index 0000000000..502b592d8e --- /dev/null +++ b/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t cancel_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdd, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xba, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x77, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xfd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xdd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xa9, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x68, 0x77, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp b/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp new file mode 100644 index 0000000000..8ec4350fe6 --- /dev/null +++ b/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t chamber_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t chamber_heated_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0x9b, 0x97, 0x88, 0x88, 0x87, 0x8b, 0xa8, 0x78, 0x88, 0x87, 0x8b, 0xb8, 0x78, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xf9, 0x78, 0x88, 0x78, 0xdf, 0xfb, 0x78, 0x88, 0x77, 0xcf, 0xfc, 0x87, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x7a, 0xff, 0xfd, 0x77, 0x88, 0x79, 0xff, 0xff, 0x87, 0x88, 0x78, 0xdf, 0xff, 0x97, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xff, 0x86, 0x88, 0x78, 0xdf, 0xff, 0xb6, 0x88, 0x77, 0xcf, 0xff, 0xc6, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xb6, 0x78, 0x87, 0x9f, 0xff, 0xd6, 0x78, 0x87, 0x8e, 0xff, 0xf7, 0x68, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x7d, 0xff, 0xe5, 0x67, 0x87, 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x79, 0xff, 0xfa, 0x57, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xe6, 0x57, 0x87, 0x8c, 0xff, 0xf7, 0x57, 0x88, 0x7a, 0xff, 0xfa, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xd5, 0x57, 0x87, 0x8e, 0xff, 0xe6, 0x57, 0x88, 0x7c, 0xff, 0xf8, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xa5, 0x57, 0x87, 0xaf, 0xff, 0xd5, 0x57, 0x87, 0x9f, 0xff, 0xe6, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xff, 0x75, 0x57, 0x78, 0xef, 0xff, 0xa5, 0x57, 0x87, 0xcf, 0xff, 0xb5, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x7c, 0xff, 0xfb, 0x55, 0x67, 0x7b, 0xff, 0xfe, 0x65, 0x57, 0x79, 0xff, 0xff, 0x85, 0x57, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x9f, 0xff, 0xf7, 0x55, 0x67, 0x8e, 0xff, 0xf8, 0x55, 0x67, 0x7d, 0xff, 0xfb, 0x55, 0x67, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x55, 0x77, 0x9f, 0xff, 0xd6, 0x55, 0x77, 0x8f, 0xff, 0xe7, 0x55, 0x68, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x77, 0xdf, 0xff, 0x75, 0x56, 0x87, 0xbf, 0xff, 0xa5, 0x56, 0x77, 0xaf, 0xff, 0xb5, 0x55, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x78, 0xef, 0xfd, 0x65, 0x67, 0x77, 0xcf, 0xff, 0x85, 0x57, 0x87, 0xbf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x78, 0xef, 0xfd, 0x55, 0x68, 0x77, 0xcf, 0xff, 0x75, 0x68, 0x87, 0xbf, 0xff, 0x95, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x78, 0xdf, 0xff, 0x65, 0x78, 0x77, 0xbf, 0xff, 0x95, 0x68, 0x87, 0xaf, 0xff, 0xb5, 0x68, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x9f, 0xff, 0xf8, 0x68, 0x87, 0x8e, 0xff, 0xf9, 0x68, 0x87, 0x7c, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x7b, 0xff, 0xfa, 0x58, 0x88, 0x7b, 0xff, 0xfc, 0x57, 0x88, 0x78, 0xff, 0xfe, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0xdf, 0xd7, 0x57, 0x88, 0x87, 0xbf, 0xf8, 0x56, 0x88, 0x87, 0xaf, 0xfa, 0x56, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp b/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp new file mode 100644 index 0000000000..1ecb09834c --- /dev/null +++ b/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t confirm_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x75, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp b/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp new file mode 100644 index 0000000000..3514433c8e --- /dev/null +++ b/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t decrease_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/directory_32x32x4.cpp b/Marlin/src/lcd/tft/images/directory_32x32x4.cpp new file mode 100644 index 0000000000..0297f03fb3 --- /dev/null +++ b/Marlin/src/lcd/tft/images/directory_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t directory_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x68, 0x88, + 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x68, 0x88, + 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/down_32x32x4.cpp b/Marlin/src/lcd/tft/images/down_32x32x4.cpp new file mode 100644 index 0000000000..b71c0e5e7c --- /dev/null +++ b/Marlin/src/lcd/tft/images/down_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t down_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x98, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8f, 0xb4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xfa, 0x48, 0x88, 0x88, + 0x88, 0x78, 0xff, 0xfa, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0x84, 0x88, 0x88, + 0x88, 0x7f, 0xff, 0xff, 0xa3, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfa, 0x47, 0x88, + 0x88, 0x7a, 0xff, 0xff, 0xfa, 0x38, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xff, 0xff, 0xc5, 0x35, 0x88, + 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa3, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfc, 0x43, 0x46, 0x88, + 0x88, 0x87, 0x79, 0xff, 0xff, 0xfa, 0x47, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc4, 0x34, 0x78, 0x88, + 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa4, 0x78, 0x79, 0xff, 0xff, 0xfc, 0x43, 0x47, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xf9, 0x47, 0x9f, 0xff, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0x96, 0xff, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x44, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xc3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xac, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x86, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_64x64x4.cpp new file mode 100644 index 0000000000..02801ddbc7 --- /dev/null +++ b/Marlin/src/lcd/tft/images/fan_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t fan0_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x9a, 0xcc, 0xcb, 0xba, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xed, 0xb9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x64, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x74, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x64, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xef, 0xff, 0xff, 0x84, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xfe, 0xa7, 0x67, 0xbf, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xc6, 0x44, 0x44, 0x48, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8a, 0x64, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x87, 0x54, 0x6a, 0xcb, 0x86, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9a, 0xbb, 0xbb, 0xba, 0x98, 0x87, 0x77, 0x87, 0x46, 0xef, 0xff, 0xfa, 0x76, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xad, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xa9, 0x87, 0x7c, 0xff, 0xff, 0xfd, 0x77, 0xac, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x9f, 0xff, 0xff, 0xff, 0x75, 0x9f, 0xea, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x8f, 0xff, 0xff, 0xff, 0x74, 0x8e, 0xff, 0xda, 0x98, 0x87, 0x78, 0x89, 0xab, 0xcd, 0xda, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x7c, 0xff, 0xff, 0xfc, 0x54, 0x8f, 0xff, 0xff, 0xee, 0xdc, 0xdd, 0xee, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x78, 0xcf, 0xff, 0xd6, 0x44, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x77, 0x58, 0xa9, 0x54, 0x45, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x64, 0x44, 0x44, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x86, 0x54, 0x59, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x54, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x76, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x66, 0x78, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x44, 0x44, 0x57, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x45, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x64, 0x44, 0x45, 0x68, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x44, 0x45, 0x67, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x47, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x45, 0x57, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x64, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x46, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x74, 0x45, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x44, 0x46, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x45, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x9f, 0xff, 0xff, 0xf7, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xd5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x57, 0xdf, 0xff, 0xff, 0xd8, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x8d, 0xff, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xcc, 0xc9, 0x64, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x76, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x55, 0x54, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x44, 0x44, 0x45, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t fan1_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x44, 0x44, 0x46, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x55, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x46, 0x75, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x69, 0xcc, 0xc9, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8f, 0xfd, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x48, 0xdf, 0xff, 0xff, 0xd7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xdf, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x45, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x47, 0xff, 0xff, 0xff, 0x95, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x4b, 0xff, 0xff, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x5d, 0xff, 0xff, 0xff, 0xff, 0x85, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x44, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x44, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x64, 0x45, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x64, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x86, 0x44, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x54, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x87, 0x55, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x87, 0x65, 0x44, 0x46, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x44, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x65, 0x44, 0x44, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x46, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x54, 0x44, 0x48, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x76, 0x67, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x78, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x54, 0x56, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x44, 0x44, 0x67, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x44, 0x59, 0xa8, 0x57, 0x75, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x46, 0xdf, 0xff, 0xc8, 0x74, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xfe, 0xed, 0xdc, 0xde, 0xef, 0xff, 0xff, 0x84, 0x5c, 0xff, 0xff, 0xfc, 0x74, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xdd, 0xcb, 0xa9, 0x88, 0x77, 0x88, 0x9a, 0xdf, 0xfe, 0x84, 0x7f, 0xff, 0xff, 0xff, 0x86, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8a, 0xef, 0x95, 0x7f, 0xff, 0xff, 0xff, 0x97, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8c, 0xa7, 0x7d, 0xff, 0xff, 0xfc, 0x77, 0x89, 0xab, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x86, 0x7a, 0xff, 0xff, 0xe6, 0x47, 0x87, 0x77, 0x88, 0x9a, 0xbb, 0xbb, 0xba, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x56, 0x8b, 0xca, 0x64, 0x57, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6a, 0x87, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x98, 0x44, 0x44, 0x46, 0xcc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x49, 0xff, 0xb7, 0x67, 0xae, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x8f, 0xff, 0xff, 0xef, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x45, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xbd, 0xef, 0xff, 0xff, 0xff, 0xec, 0xb9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x9a, 0xbb, 0xcc, 0xca, 0x98, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp new file mode 100644 index 0000000000..a315f8bf8f --- /dev/null +++ b/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t fan_fast0_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x89, 0x98, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x8a, 0xbd, 0xef, 0xfe, 0xec, 0xba, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xac, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x79, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9c, 0xed, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xde, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xbd, 0xed, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xdd, 0xdd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xac, 0xdd, 0xdd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x68, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x68, 0x88, 0x78, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xca, 0xac, 0xdd, 0xdd, 0xdd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x68, 0x87, 0x8a, 0xba, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xba, 0xaa, 0xbc, 0xdd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x78, 0x78, 0xac, 0xbb, 0x97, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xaa, 0xaa, 0xaa, 0xbc, 0xdd, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x56, 0x78, 0x8a, 0xcb, 0xaa, 0xa8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8b, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x57, 0x87, 0x9c, 0xba, 0xaa, 0xb9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9b, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdd, 0xdd, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x55, 0x67, 0x79, 0xbb, 0xba, 0xaa, 0xaa, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9c, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x55, 0x77, 0x9b, 0xcb, 0xaa, 0xaa, 0xaa, 0x96, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x89, 0xaa, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x55, 0x56, 0x79, 0xbc, 0xba, 0xaa, 0xaa, 0xaa, 0xa6, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xcd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x55, 0x68, 0xab, 0xcb, 0xaa, 0xaa, 0xaa, 0xab, 0xb8, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x56, 0x78, 0x9a, 0xaa, 0xaa, 0xbd, 0xce, 0xff, 0xfd, 0xde, 0xff, 0xfc, 0x65, 0x56, 0x9b, 0xcb, 0xba, 0xaa, 0xaa, 0xab, 0xcd, 0xdb, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x65, 0x55, 0x55, 0x57, 0x9a, 0xaa, 0xac, 0xde, 0xfb, 0x86, 0x67, 0x8c, 0xe8, 0x77, 0x8a, 0xcc, 0xba, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x65, 0x55, 0x58, 0xaa, 0xab, 0xdd, 0x95, 0x55, 0x55, 0x56, 0x68, 0xaa, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0xdd, 0x95, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x76, 0x55, 0x7a, 0xab, 0xc8, 0x55, 0x57, 0x87, 0x55, 0x56, 0xac, 0xaa, 0xaa, 0xaa, 0xab, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb5, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x76, 0x56, 0xab, 0x95, 0x55, 0xae, 0xff, 0xb7, 0x65, 0x7c, 0xdc, 0xcb, 0xcc, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcd, 0xee, 0xee, 0xed, 0xcb, 0x96, 0x89, 0x65, 0x5a, 0xff, 0xff, 0xfc, 0x77, 0x9c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x65, 0x6e, 0xff, 0xff, 0xfe, 0x77, 0x9e, 0xec, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xcc, 0xcd, 0xc6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0x8f, 0xff, 0xff, 0xff, 0x75, 0x9f, 0xff, 0xdd, 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x65, 0x8e, 0xff, 0xff, 0xfe, 0x65, 0x8f, 0xff, 0xff, 0xee, 0xdd, 0xdd, 0xee, 0xef, 0xff, 0xff, 0xd6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x7a, 0xff, 0xff, 0xfa, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x77, 0x9d, 0xfd, 0xa5, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x66, 0x66, 0x55, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x75, 0x55, 0x56, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa8, 0x66, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x65, 0x67, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xcb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x67, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xcb, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x55, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xcd, 0xdb, 0xa9, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xdd, 0xba, 0xa8, 0x55, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdc, 0xaa, 0xa7, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdb, 0xaa, 0xa7, 0x56, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xca, 0xaa, 0xa7, 0x56, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x55, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xca, 0xaa, 0xa7, 0x56, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x55, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xba, 0xaa, 0xa8, 0x56, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xba, 0xaa, 0xb9, 0x56, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xa9, 0x56, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0xef, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0x76, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0x85, 0x78, 0x87, 0x6b, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0xdf, 0xff, 0xec, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa6, 0x68, 0x88, 0x76, 0xae, 0xff, 0xfe, 0xa6, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x6b, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa7, 0x68, 0x88, 0x86, 0x56, 0x89, 0x86, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8b, 0xdd, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa9, 0x57, 0x88, 0x88, 0x65, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x8b, 0xdd, 0xdd, 0xdd, 0xaa, 0xaa, 0xaa, 0xaa, 0x66, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x56, 0x8b, 0xdd, 0xdc, 0xaa, 0xaa, 0xaa, 0xba, 0x65, 0x78, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x79, 0x99, 0x99, 0xaa, 0xaa, 0x97, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x56, 0x66, 0x66, 0x65, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t fan_fast1_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x66, 0x66, 0x66, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x57, 0x9a, 0xaa, 0xa9, 0x99, 0x99, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x75, 0x6a, 0xba, 0xaa, 0xaa, 0xac, 0xdd, 0xdb, 0x86, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x67, 0x88, 0x88, 0x86, 0x6a, 0xaa, 0xaa, 0xaa, 0xad, 0xdd, 0xdd, 0xdb, 0x85, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x87, 0x59, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdd, 0xdb, 0x85, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x89, 0x86, 0x56, 0x88, 0x88, 0x67, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdc, 0xdf, 0xfb, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0xae, 0xff, 0xfe, 0xa6, 0x78, 0x88, 0x66, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdc, 0xef, 0xff, 0xd7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x7d, 0xff, 0xff, 0xff, 0xfb, 0x67, 0x88, 0x75, 0x8a, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x58, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x86, 0x7a, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x86, 0x59, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x86, 0x59, 0xba, 0xaa, 0xbd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x55, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x86, 0x58, 0xaa, 0xaa, 0xbd, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x76, 0x57, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x65, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x57, 0xaa, 0xaa, 0xcd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x65, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0x57, 0xaa, 0xab, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x55, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x57, 0xaa, 0xac, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x58, 0xaa, 0xbd, 0xdc, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x59, 0xab, 0xdd, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x65, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x7b, 0xcd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x65, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x65, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x86, 0x68, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, 0x55, 0x55, 0x77, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x55, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x55, 0x56, 0x66, 0x67, 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x55, 0xad, 0xfd, 0x97, 0x75, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x5a, 0xff, 0xff, 0xfa, 0x75, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xee, 0xed, 0xdd, 0xde, 0xef, 0xff, 0xff, 0x85, 0x6e, 0xff, 0xff, 0xfe, 0x85, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdc, 0xcc, 0xcc, 0xcc, 0xcd, 0xdf, 0xff, 0x95, 0x7f, 0xff, 0xff, 0xff, 0x85, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xcd, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcc, 0xee, 0x97, 0x7e, 0xff, 0xff, 0xfe, 0x65, 0x6b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x97, 0x7c, 0xff, 0xff, 0xfa, 0x55, 0x69, 0x86, 0x9b, 0xcd, 0xee, 0xee, 0xed, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcc, 0xcb, 0xcc, 0xdc, 0x75, 0x67, 0xbf, 0xfe, 0xa5, 0x55, 0x9b, 0xa6, 0x56, 0x78, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x65, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcb, 0xaa, 0xaa, 0xaa, 0xac, 0xa6, 0x55, 0x57, 0x87, 0x55, 0x58, 0xcb, 0xaa, 0x75, 0x56, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x9d, 0xdd, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xab, 0xbb, 0xba, 0xa8, 0x66, 0x55, 0x55, 0x55, 0x9d, 0xdb, 0xaa, 0xa8, 0x55, 0x55, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x8d, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xaa, 0xbc, 0xca, 0x87, 0x78, 0xec, 0x87, 0x66, 0x8b, 0xfe, 0xdc, 0xaa, 0xaa, 0x97, 0x55, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x6b, 0xdd, 0xcb, 0xaa, 0xaa, 0xaa, 0xbb, 0xcb, 0x96, 0x55, 0x6c, 0xff, 0xfe, 0xdd, 0xff, 0xfe, 0xcd, 0xba, 0xaa, 0xaa, 0x98, 0x76, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x68, 0xbb, 0xaa, 0xaa, 0xaa, 0xab, 0xcb, 0xa8, 0x65, 0x55, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x87, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x66, 0xaa, 0xaa, 0xaa, 0xaa, 0xbc, 0xb9, 0x76, 0x55, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdb, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xaa, 0xa9, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x76, 0x9a, 0xaa, 0xaa, 0xab, 0xcb, 0x97, 0x75, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbc, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7a, 0xaa, 0xaa, 0xbb, 0xb9, 0x77, 0x65, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xdd, 0xdb, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x69, 0xba, 0xaa, 0xbc, 0x97, 0x87, 0x55, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xcb, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xaa, 0xab, 0xca, 0x88, 0x76, 0x55, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xdc, 0xba, 0xaa, 0xaa, 0xab, 0xc9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xbc, 0xa8, 0x78, 0x75, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xdc, 0xba, 0xaa, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xba, 0x87, 0x88, 0x65, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xaa, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x78, 0x88, 0x65, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xcb, 0xc9, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x65, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xed, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xde, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xec, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x8a, 0xbc, 0xee, 0xff, 0xed, 0xba, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x99, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp new file mode 100644 index 0000000000..baf0651881 --- /dev/null +++ b/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t fan_slow0_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9a, 0xbb, 0xbb, 0xaa, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xcb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xbc, 0xbb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcb, 0xbb, 0xbb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9b, 0xcb, 0xbb, 0xbb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xac, 0xcb, 0xbb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbc, 0xbb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbc, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9b, 0xcb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xbc, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xcb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xa8, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xbe, 0xff, 0xca, 0xab, 0xce, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xcc, 0xca, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcf, 0xd9, 0x77, 0x77, 0x79, 0xc8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9b, 0xcc, 0xbb, 0xcb, 0x87, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xcc, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9b, 0xcc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x79, 0xb8, 0x77, 0x8a, 0xcb, 0x97, 0x77, 0x8a, 0xa9, 0x88, 0x88, 0x89, 0xab, 0xcc, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x99, 0xaa, 0x99, 0x98, 0x87, 0x77, 0x79, 0x97, 0x78, 0xdf, 0xff, 0xea, 0x77, 0x8a, 0xcb, 0xbb, 0xbb, 0xbb, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7a, 0xce, 0xff, 0xff, 0xff, 0xee, 0xdc, 0xa9, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xfe, 0x97, 0x8c, 0xcb, 0xbc, 0xcc, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xb7, 0x7c, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, + 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xc7, 0x7b, 0xff, 0xec, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcd, 0xcc, 0x97, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xa7, 0x7b, 0xff, 0xff, 0xed, 0xdc, 0xcc, 0xcd, 0xde, 0xff, 0xff, 0xfe, 0x97, 0x88, + 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x7b, 0xff, 0xff, 0xfd, 0x87, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, + 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0xbe, 0xff, 0xc8, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, + 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x77, 0x79, 0x99, 0x87, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, + 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x77, 0x77, 0x77, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x88, + 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x97, 0x78, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, + 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0x98, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, + 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xa8, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xbb, 0xca, 0x87, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, + 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbc, 0xa8, 0x78, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0x87, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xca, 0x78, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbc, 0xb8, 0x78, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbc, 0x97, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xbc, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, 0x87, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xae, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9d, 0xff, 0xff, 0xfd, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xdf, 0xfd, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xcb, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcc, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x8a, 0xbc, 0xcb, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbb, 0xb9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t fan_slow1_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xbb, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcb, 0xcc, 0xba, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbc, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9b, 0xcc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbd, 0xff, 0xd9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9d, 0xff, 0xff, 0xfd, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xcf, 0xff, 0xfe, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x78, 0xac, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x78, 0xbc, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x7a, 0xcb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x87, 0x8b, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x78, 0xac, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x77, 0x8a, 0xcb, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, + 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0xac, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, + 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x9a, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, + 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x78, 0x77, 0x9b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, + 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x77, 0x77, 0x77, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, + 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x77, 0x89, 0x99, 0x77, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, + 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x78, 0xcf, 0xfe, 0xb8, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, + 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0x8d, 0xff, 0xff, 0xfb, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, + 0x88, 0x87, 0x9e, 0xff, 0xff, 0xfe, 0xdd, 0xcc, 0xcc, 0xdd, 0xef, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xff, 0xfe, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xcd, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xef, 0xfb, 0x77, 0xcf, 0xff, 0xff, 0xff, 0x97, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xfc, 0x77, 0xbf, 0xff, 0xff, 0xff, 0x97, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xcc, 0xcc, 0xbb, 0xcc, 0x87, 0x9e, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x89, 0xac, 0xde, 0xef, 0xff, 0xff, 0xfe, 0xca, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcb, 0xbb, 0xbb, 0xbb, 0xca, 0x87, 0x7a, 0xef, 0xff, 0xd8, 0x77, 0x99, 0x77, 0x77, 0x88, 0x99, 0x9a, 0xa9, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbc, 0xcb, 0xa9, 0x88, 0x88, 0x89, 0xaa, 0x87, 0x77, 0x9b, 0xca, 0x87, 0x78, 0xb9, 0x78, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xcb, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x77, 0x77, 0x77, 0x77, 0x8c, 0xca, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8b, 0xcb, 0xbc, 0xcb, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xc9, 0x77, 0x77, 0x79, 0xdf, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x7a, 0xcc, 0xcb, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xfe, 0xcb, 0xaa, 0xcf, 0xfe, 0xbb, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xab, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xc9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xcb, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbc, 0xb9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xcb, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbc, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbc, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0xcc, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xcb, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbc, 0xca, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbc, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xcc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9a, 0xab, 0xbb, 0xba, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp b/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp new file mode 100644 index 0000000000..3515b38275 --- /dev/null +++ b/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t feedrate_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x78, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x8a, 0xcd, 0xa8, 0xcc, 0xb9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x9c, 0xef, 0xff, 0xa8, 0xff, 0xff, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8b, 0xef, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0xd9, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xec, 0x76, 0xbd, 0xef, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x8d, 0xff, 0xff, 0xc9, 0x65, 0x55, 0x65, 0x6a, 0xef, 0xfb, 0x67, 0x87, 0x88, 0x88, + 0x88, 0x77, 0xcf, 0xff, 0xe9, 0x55, 0x55, 0x55, 0x65, 0x55, 0x6b, 0xb5, 0x7d, 0xb7, 0x78, 0x88, + 0x87, 0x7a, 0xff, 0xfe, 0x85, 0x55, 0x56, 0x67, 0x77, 0x66, 0x55, 0x57, 0xdf, 0xf8, 0x78, 0x88, + 0x87, 0x8e, 0xff, 0xf8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x87, 0x76, 0x58, 0xff, 0xfc, 0x67, 0x88, + 0x77, 0xbf, 0xff, 0xa5, 0x55, 0x67, 0x88, 0x88, 0x87, 0x78, 0xb9, 0x66, 0xbf, 0xff, 0x86, 0x88, + 0x78, 0xdf, 0xfd, 0x65, 0x56, 0x78, 0x88, 0x87, 0x77, 0xae, 0xd8, 0x77, 0x7e, 0xff, 0xb5, 0x78, + 0x79, 0xff, 0xfa, 0x55, 0x67, 0x88, 0x88, 0x77, 0x9c, 0xff, 0x86, 0x56, 0x7b, 0xff, 0xe6, 0x68, + 0x7a, 0xff, 0xf7, 0x55, 0x78, 0x88, 0x87, 0x8b, 0xff, 0xfb, 0x55, 0x67, 0x79, 0xff, 0xf8, 0x68, + 0x7b, 0xff, 0xe6, 0x56, 0x78, 0x88, 0x78, 0xdf, 0xff, 0xe7, 0x55, 0x78, 0x79, 0xee, 0xe8, 0x57, + 0x7c, 0xff, 0xd6, 0x57, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xa5, 0x56, 0x78, 0x78, 0x77, 0x76, 0x57, + 0x7c, 0xff, 0xd6, 0x57, 0x88, 0x87, 0x7c, 0xff, 0xfd, 0x65, 0x57, 0x88, 0x78, 0x98, 0x86, 0x57, + 0x7b, 0xff, 0xd6, 0x57, 0x88, 0x88, 0x79, 0xef, 0xe8, 0x55, 0x67, 0x88, 0x79, 0xff, 0xf9, 0x67, + 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x88, 0x87, 0x78, 0x75, 0x55, 0x78, 0x88, 0x7a, 0xff, 0xf8, 0x67, + 0x79, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x65, 0x55, 0x56, 0x88, 0x87, 0x7c, 0xff, 0xd6, 0x56, + 0x78, 0xef, 0xfd, 0x57, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x87, 0x8f, 0xff, 0xb5, 0x57, + 0x77, 0xbf, 0xff, 0x96, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x77, 0xcf, 0xff, 0x85, 0x67, + 0x87, 0x8e, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xfc, 0x55, 0x67, + 0x88, 0x7a, 0xff, 0xfd, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9e, 0xff, 0xf7, 0x55, 0x68, + 0x88, 0x77, 0xbf, 0xff, 0xea, 0x77, 0x77, 0x88, 0x87, 0x77, 0x7a, 0xff, 0xff, 0x95, 0x56, 0x78, + 0x88, 0x87, 0x6c, 0xff, 0xff, 0xc9, 0x87, 0x77, 0x77, 0x89, 0xdf, 0xff, 0xfb, 0x55, 0x56, 0x88, + 0x88, 0x88, 0x76, 0xcf, 0xff, 0xff, 0xdc, 0xbb, 0xbc, 0xef, 0xff, 0xff, 0xa5, 0x55, 0x67, 0x88, + 0x88, 0x88, 0x86, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x55, 0x55, 0x78, 0x88, + 0x88, 0x88, 0x87, 0x65, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xda, 0x65, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x55, 0x79, 0xbd, 0xde, 0xdc, 0xb9, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0x66, 0x66, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp b/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp new file mode 100644 index 0000000000..d3c7fd187a --- /dev/null +++ b/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t flowrate_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x78, 0xce, 0xeb, 0x77, 0x77, 0x87, 0x7c, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x89, 0x77, 0xef, 0xfd, 0x67, 0xa8, 0x77, 0x7e, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x78, 0xdf, 0xba, 0xff, 0xfe, 0x8b, 0xfd, 0x87, 0x7d, 0xfa, 0x56, 0x87, 0x77, 0x88, 0x88, + 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x7d, 0xfa, 0x56, 0x77, 0x87, 0x77, 0x88, + 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x7d, 0xfa, 0x56, 0x9c, 0xdc, 0x97, 0x78, + 0x87, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x6d, 0xfa, 0x59, 0xff, 0xff, 0xfb, 0x77, + 0x88, 0x89, 0xef, 0xff, 0xa7, 0x7b, 0xff, 0xfd, 0x76, 0x5d, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0x97, + 0x7a, 0xdf, 0xff, 0xfa, 0x55, 0x55, 0xcf, 0xff, 0xec, 0x9c, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xc6, + 0x7c, 0xff, 0xff, 0xf7, 0x55, 0x55, 0x8f, 0xff, 0xff, 0xac, 0xf9, 0xbf, 0xfd, 0x6c, 0xff, 0xe5, + 0x7c, 0xff, 0xff, 0xf7, 0x56, 0x77, 0xaf, 0xff, 0xff, 0x9b, 0xf9, 0xbf, 0xfe, 0x8d, 0xff, 0xe5, + 0x7a, 0xde, 0xff, 0xfb, 0x56, 0x77, 0xdf, 0xff, 0xed, 0x8c, 0xf9, 0x8f, 0xff, 0xff, 0xff, 0xb5, + 0x87, 0x67, 0xef, 0xff, 0xa8, 0x9c, 0xff, 0xfd, 0x76, 0x5d, 0xf9, 0x6d, 0xff, 0xff, 0xfe, 0x75, + 0x88, 0x66, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x5c, 0xfa, 0x57, 0xdf, 0xff, 0xd8, 0x55, + 0x87, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x6d, 0xfa, 0x55, 0x68, 0xa9, 0x65, 0x55, + 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x7d, 0xfa, 0x56, 0x65, 0x55, 0x55, 0x56, + 0x88, 0x78, 0xdf, 0xa8, 0xff, 0xfe, 0x8a, 0xfc, 0x65, 0x6d, 0xfa, 0x56, 0x77, 0x65, 0x56, 0x67, + 0x88, 0x87, 0x78, 0x55, 0xef, 0xfd, 0x55, 0x86, 0x55, 0x5d, 0xfa, 0x56, 0x88, 0x77, 0x77, 0x88, + 0x88, 0x88, 0x65, 0x55, 0xbe, 0xea, 0x55, 0x55, 0x55, 0x6b, 0xd8, 0x56, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x66, 0x76, 0x65, 0x56, 0x76, 0x68, 0xa9, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x77, 0x76, 0x55, 0x56, 0x87, 0x7b, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x78, 0xef, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x87, 0xaf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0xfd, 0x65, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xf8, 0x55, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x96, 0x55, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp b/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp new file mode 100644 index 0000000000..6bc96968da --- /dev/null +++ b/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t bed_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t bed_heated_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9b, 0x97, 0x88, 0x88, 0x87, 0x8b, 0xa8, 0x78, 0x88, 0x87, 0x8b, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xf9, 0x78, 0x88, 0x78, 0xdf, 0xfb, 0x78, 0x88, 0x77, 0xcf, 0xfc, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xfd, 0x77, 0x88, 0x79, 0xff, 0xff, 0x87, 0x88, 0x78, 0xdf, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0x86, 0x88, 0x78, 0xdf, 0xff, 0xb6, 0x88, 0x77, 0xcf, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xb6, 0x78, 0x87, 0x9f, 0xff, 0xd6, 0x78, 0x87, 0x8e, 0xff, 0xf7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0xff, 0xe6, 0x68, 0x87, 0x7d, 0xff, 0xe7, 0x68, 0x88, 0x7a, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xff, 0xe5, 0x67, 0x87, 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x79, 0xff, 0xfa, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xe6, 0x57, 0x87, 0x8c, 0xff, 0xf7, 0x57, 0x88, 0x7a, 0xff, 0xfa, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xd5, 0x57, 0x87, 0x8e, 0xff, 0xe6, 0x57, 0x88, 0x7c, 0xff, 0xf8, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xa5, 0x57, 0x87, 0xaf, 0xff, 0xd5, 0x57, 0x87, 0x9f, 0xff, 0xe6, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0x75, 0x57, 0x78, 0xef, 0xff, 0xa5, 0x57, 0x87, 0xcf, 0xff, 0xb5, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xfb, 0x55, 0x67, 0x7b, 0xff, 0xfe, 0x65, 0x57, 0x79, 0xff, 0xff, 0x85, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xf7, 0x55, 0x67, 0x8e, 0xff, 0xf8, 0x55, 0x67, 0x7d, 0xff, 0xfb, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x55, 0x77, 0x9f, 0xff, 0xd6, 0x55, 0x77, 0x8f, 0xff, 0xe7, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0x75, 0x56, 0x87, 0xbf, 0xff, 0xa5, 0x56, 0x77, 0xaf, 0xff, 0xb5, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xfd, 0x65, 0x67, 0x77, 0xcf, 0xff, 0x85, 0x57, 0x87, 0xbf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xfd, 0x55, 0x68, 0x77, 0xcf, 0xff, 0x75, 0x68, 0x87, 0xbf, 0xff, 0x95, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0x65, 0x78, 0x77, 0xbf, 0xff, 0x95, 0x68, 0x87, 0xaf, 0xff, 0xb5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x78, 0x87, 0xaf, 0xff, 0xd6, 0x68, 0x87, 0x9f, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xf8, 0x68, 0x87, 0x8e, 0xff, 0xf9, 0x68, 0x87, 0x7c, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xfa, 0x58, 0x88, 0x7b, 0xff, 0xfc, 0x57, 0x88, 0x78, 0xff, 0xfe, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xd7, 0x57, 0x88, 0x87, 0xbf, 0xf8, 0x56, 0x88, 0x87, 0xaf, 0xfa, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp b/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp new file mode 100644 index 0000000000..7dbf5f0ab1 --- /dev/null +++ b/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t hotend_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xaa, 0xaa, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x9a, 0xaa, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x77, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x55, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x65, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x55, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x58, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x85, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x95, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xcf, 0xff, 0xff, 0xff, 0xd7, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x5a, 0xff, 0xff, 0xfb, 0x65, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8d, 0xfe, 0xa5, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x87, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/increase_64x64x4.cpp b/Marlin/src/lcd/tft/images/increase_64x64x4.cpp new file mode 100644 index 0000000000..c6f34d1aff --- /dev/null +++ b/Marlin/src/lcd/tft/images/increase_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t increase_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xee, 0xee, 0xee, 0xee, 0xa6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/left_32x32x4.cpp b/Marlin/src/lcd/tft/images/left_32x32x4.cpp new file mode 100644 index 0000000000..a855f0c197 --- /dev/null +++ b/Marlin/src/lcd/tft/images/left_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t left_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfb, 0x46, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfb, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xb3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xfb, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfa, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xf6, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x76, 0xbf, 0xff, 0xff, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x3b, 0xff, 0xff, 0xf8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x73, 0xcf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x3c, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xcf, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3b, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xbf, 0xff, 0xff, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xbf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xcf, 0x93, 0x34, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0x34, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp b/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp new file mode 100644 index 0000000000..f0bb73e935 --- /dev/null +++ b/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t leveling_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x99, 0x99, 0x99, 0x99, 0x87, 0x78, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x88, 0x87, 0x7b, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x88, 0x87, 0x8f, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x88, 0x77, 0xef, 0xf5, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x88, 0x7a, 0xff, 0xfc, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x7a, 0x88, 0x88, 0x58, 0x88, 0x88, + 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0x87, 0x45, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x85, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x56, 0x7c, 0xff, 0xfe, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x55, 0xef, 0xff, 0xff, 0xf9, 0x45, 0x57, 0x86, 0xff, 0xf5, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x4c, 0xff, 0xff, 0x74, 0x57, 0x88, 0x87, 0x8f, 0xa4, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x9f, 0xd5, 0x45, 0x78, 0x88, 0x88, 0x7c, 0x55, 0x88, 0x88, 0x88, + 0x87, 0x77, 0x77, 0x77, 0x88, 0x65, 0x55, 0x68, 0x87, 0x77, 0x77, 0x86, 0x57, 0x87, 0x77, 0x78, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x56, 0x77, 0x77, 0x77, 0x77, 0x77, 0x67, 0x77, 0x77, 0x77, + 0x7b, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xb7, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, + 0x78, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x66, + 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/menu_64x64x4.cpp b/Marlin/src/lcd/tft/images/menu_64x64x4.cpp new file mode 100644 index 0000000000..89cd56b8dc --- /dev/null +++ b/Marlin/src/lcd/tft/images/menu_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t menu_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/pause_64x64x4.cpp b/Marlin/src/lcd/tft/images/pause_64x64x4.cpp new file mode 100644 index 0000000000..b88651c106 --- /dev/null +++ b/Marlin/src/lcd/tft/images/pause_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t pause_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x67, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp b/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp new file mode 100644 index 0000000000..48ca294ca1 --- /dev/null +++ b/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t refresh_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0x57, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0x9a, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xce, 0xff, 0xfd, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x6a, 0xff, 0x55, 0x5c, 0xff, 0xd7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xa7, 0x78, 0x86, 0x9f, 0x57, 0x75, 0x8f, 0xfb, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xfc, 0x78, 0x88, 0x69, 0x67, 0x88, 0x69, 0xff, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7c, 0xff, 0x58, 0x88, 0x87, 0x58, 0x88, 0x86, 0xff, 0xa7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7e, 0xfa, 0x58, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xe5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7f, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xf5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7f, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xf5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7e, 0xfa, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xe5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7c, 0xff, 0x68, 0x88, 0x87, 0x78, 0x88, 0x77, 0xff, 0xa5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xff, 0xa7, 0x88, 0x78, 0xb7, 0x88, 0x77, 0xbf, 0x66, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xbf, 0xf9, 0x77, 0x77, 0xfb, 0x78, 0x88, 0x68, 0x57, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x6d, 0xff, 0xd8, 0x77, 0xff, 0xb7, 0x78, 0x87, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x85, 0xcf, 0xff, 0xfd, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x57, 0xef, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x89, 0xff, 0xf8, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0xff, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xf7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/right_32x32x4.cpp b/Marlin/src/lcd/tft/images/right_32x32x4.cpp new file mode 100644 index 0000000000..6ca5867e98 --- /dev/null +++ b/Marlin/src/lcd/tft/images/right_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t right_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x3a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x4a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x9f, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x49, 0xff, 0xff, 0xfa, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc4, 0x36, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfc, 0x33, 0x46, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfd, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xd3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xfc, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xff, 0xff, 0xc3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xc4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8a, 0xff, 0xfc, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x8f, 0xc4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x4a, 0x53, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/sd_64x64x4.cpp b/Marlin/src/lcd/tft/images/sd_64x64x4.cpp new file mode 100644 index 0000000000..6991ff68c9 --- /dev/null +++ b/Marlin/src/lcd/tft/images/sd_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t sd_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xfe, 0xdf, 0xff, 0xfd, 0xef, 0xff, 0xde, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xbf, 0xfa, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x59, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x3a, 0xff, 0xa3, 0x9f, 0xfb, 0x48, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x3a, 0xff, 0xa3, 0xaf, 0xfb, 0x39, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0xcf, 0xfa, 0x5b, 0xff, 0xb5, 0xbf, 0xfc, 0x5a, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/settings_64x64x4.cpp b/Marlin/src/lcd/tft/images/settings_64x64x4.cpp new file mode 100644 index 0000000000..7a9c84fdff --- /dev/null +++ b/Marlin/src/lcd/tft/images/settings_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t settings_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xad, 0xdd, 0xdd, 0xd9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x77, 0xef, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x87, 0x78, 0x79, 0xff, 0xff, 0xff, 0xfd, 0x67, 0x87, 0x78, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xeb, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0x75, 0x78, 0xce, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xea, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xbf, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x98, 0x8a, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xfb, 0x65, 0x55, 0x55, 0x57, 0xdf, 0xff, 0xff, 0xff, 0xb5, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x6c, 0xff, 0xff, 0xff, 0x95, 0x56, 0x66, 0x66, 0x65, 0x5b, 0xff, 0xff, 0xff, 0x95, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0xaf, 0xff, 0xff, 0xfa, 0x56, 0x66, 0x67, 0x77, 0x77, 0x65, 0xdf, 0xff, 0xff, 0xd7, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xce, 0xff, 0xff, 0xff, 0xd5, 0x56, 0x67, 0x88, 0x88, 0x88, 0x86, 0x7f, 0xff, 0xff, 0xff, 0xdb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x75, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x79, 0xcf, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xfc, 0x96, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x55, 0x55, 0x58, 0xdf, 0xfd, 0x77, 0x78, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xa5, 0x56, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9c, 0xdd, 0xdb, 0x96, 0x55, 0x5b, 0xff, 0xd8, 0x77, 0x77, 0x77, 0x77, 0xaf, 0xff, 0xff, 0xff, 0x95, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xad, 0xff, 0xff, 0xff, 0xfe, 0xb7, 0x55, 0xbf, 0xfe, 0xb9, 0x77, 0x78, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x86, 0x6d, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xb7, 0x56, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x86, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xc6, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xfe, 0x75, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xfc, 0x59, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x66, 0x68, 0xbd, 0xff, 0xff, 0xa5, 0x7b, 0xff, 0xe7, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xfd, 0x66, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x66, 0x55, 0x56, 0x8a, 0xee, 0x65, 0x55, 0x7a, 0x75, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0x75, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x97, 0x55, 0x55, 0x66, 0x66, 0x66, 0x55, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfe, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xca, 0x76, 0x55, 0x56, 0x78, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0x97, 0x9d, 0xff, 0xd5, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x97, 0x66, 0x77, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xfd, 0xa7, 0x9a, 0x68, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xc9, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x89, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x55, 0x57, 0x9b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x6a, 0xdf, 0xff, 0xfe, 0xb8, 0x55, 0x66, 0x65, 0x55, 0x69, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x67, 0x77, 0x76, 0x55, 0x66, 0x67, 0x76, 0x66, 0x55, 0x56, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x66, 0x66, 0x78, 0x88, 0x87, 0x76, 0x65, 0x55, 0x68, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x76, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x55, 0x55, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x65, 0x55, 0x67, 0x9c, 0xef, 0xff, 0xb5, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x55, 0x55, 0x79, 0xb9, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x55, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/slider_8x16x4.cpp b/Marlin/src/lcd/tft/images/slider_8x16x4.cpp new file mode 100644 index 0000000000..9fb8c42c28 --- /dev/null +++ b/Marlin/src/lcd/tft/images/slider_8x16x4.cpp @@ -0,0 +1,46 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t slider_8x16x4[64] = { + 0x88, 0xff, 0xff, 0x88, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x88, 0xff, 0xff, 0x88, +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/up_32x32x4.cpp b/Marlin/src/lcd/tft/images/up_32x32x4.cpp new file mode 100644 index 0000000000..59bae8aef0 --- /dev/null +++ b/Marlin/src/lcd/tft/images/up_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t up_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xad, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xb3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfb, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xc3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa6, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x6f, 0xff, 0xff, 0xb4, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x78, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x47, 0x87, 0x8f, 0xff, 0xff, 0xb4, 0x78, 0x88, 0x88, + 0x88, 0x77, 0xaf, 0xff, 0xff, 0xb3, 0x44, 0x78, 0x87, 0x78, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, + 0x88, 0x7a, 0xff, 0xff, 0xfb, 0x34, 0x47, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xc4, 0x78, 0x88, + 0x88, 0x7f, 0xff, 0xff, 0xb3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x77, 0xff, 0xff, 0xfb, 0x37, 0x88, + 0x88, 0x78, 0xff, 0xfa, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0x93, 0x34, 0x88, + 0x88, 0x77, 0x7f, 0xb3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xf9, 0x34, 0x47, 0x88, + 0x88, 0x87, 0x78, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x84, 0x34, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x64, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x47, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/r65105.h b/Marlin/src/lcd/tft/r65105.h new file mode 100644 index 0000000000..8d073f5d0d --- /dev/null +++ b/Marlin/src/lcd/tft/r65105.h @@ -0,0 +1,155 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define R61505_DRVCTL_SM 0x0400 +#define R61505_DRVCTL_SS 0x0100 // Select the shift direction of outputs from the source driver. 0 - from S1 to S720 / 1 - from S720 to S1 + +#define R61505_ETMOD_TRIGGER 0x8000 // 18-bit RAM when set; 16-bit RAM when not set +#define R61505_ETMOD_DFM 0x4000 +#define R61505_ETMOD_BGR 0x1000 // RGB-BGR ORDER +#define R61505_ETMOD_RGB 0x0000 + +#define R61505_ETMOD_HWM 0x0020 +#define R61505_ETMOD_ORG 0x0080 +#define R61505_ETMOD_ID1 0x0020 // 0 - Vertical Decrement / 1 - Vertical Increment +#define R61505_ETMOD_ID0 0x0010 // 0 - Horizontal Decrement / 1 - Horizontal Increment +#define R61505_ETMOD_AM 0x0008 // 0 - Horizontal / 1 - Vertical + +#define R61505_DRVCTRL_GS 0x8000 // Gate Scan direction + +// MKS Robin TFT v1.1 - 320x240 ; Cable on the left side +#define R61505_DRVCTL_DATA R61505_DRVCTL_SS +#define R61505_ETMOD_DATA R61505_ETMOD_BGR | R61505_ETMOD_ID1 | R61505_ETMOD_ID0 | R61505_ETMOD_AM +#define R61505_DRVCTRL_GSDIR R61505_DRVCTRL_GS + + +#define R61505_RDDID 0x00 // ID code - 0x1505 +#define R61505_DRVCTL 0x01 // Driver Output Control +#define R61505_LCDCTL 0x02 // LCD Driving Wave Control +#define R61505_ETMOD 0x03 // Entry Mode - Control the GRAM update direction +#define R61505_RESIZECTL 0x04 // Resizing Control Register +#define R61505_DISCTRL1 0x07 // Display Control 1 +#define R61505_DISCTRL2 0x08 // Display Control 2 +#define R61505_DISCTRL3 0x09 // Display Control 3 +#define R61505_DISCTRL4 0x0A // Display Control 4 +#define R61505_RGBCTRL1 0x0C // RGB Display Interface Control 1 +#define R61505_FMARKERPOS 0x0D // Frame Marker Position +#define R61505_RGBCTRL2 0x0F // RGB Display Interface Control 2 +#define R61505_PWCTRL1 0x10 // Power Control 1 +#define R61505_PWCTRL2 0x11 // Power Control 2 +#define R61505_PWCTRL3 0x12 // Power Control 3 +#define R61505_PWCTRL4 0x13 // Power Control 4 + +// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X +#define R61505_HASET 0x20 // GRAM Horizontal Address Set (0-255) +#define R61505_VASET 0x21 // GRAM Vertical Address Set (0-511) +#define R61505_RAMWR 0x22 // Write data to GRAM +#define R61505_RAMRD 0x22 // Read Data from GRAM + +#define R61505_PWCTRL7 0x29 // Power Control 7 +#define R61505_GAMCTRL1 0x30 // Gamma Control +#define R61505_GAMCTRL2 0x31 // Gamma Control +#define R61505_GAMCTRL3 0x32 // Gamma Control +#define R61505_GAMCTRL4 0x35 // Gamma Control +#define R61505_GAMCTRL5 0x36 // Gamma Control +#define R61505_GAMCTRL6 0x37 // Gamma Control +#define R61505_GAMCTRL7 0x38 // Gamma Control +#define R61505_GAMCTRL8 0x39 // Gamma Control +#define R61505_GAMCTRL9 0x3C // Gamma Control +#define R61505_GAMCTRLA 0x3D // Gamma Control + +// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X +#define R61505_HASTART 0x50 // Horizontal Address Start Position (0-255) +#define R61505_HAEND 0x51 // Horizontal Address End Position (0-255) +#define R61505_VASTART 0x52 // Vertical Address Start Position (0-511) +#define R61505_VAEND 0x53 // Vertical Address End Position (0-511) + +#define R61505_DRVCTRL 0x60 // Driver Output Control +#define R61505_BASE_IMAGE_CTRL 0x61 // Base Image Display Control +#define R61505_VSCROLL_CTRL 0x6A // Vertical Scroll Control + +#define R61505_PLTPOS1 0x80 // Partial Image 1 Display Position +#define R61505_PLTSTART1 0x81 // Partial Image 1 RAM Start Address +#define R61505_PLTEND1 0x82 // Partial Image 1 RAM End Address +#define R61505_PLTPOS2 0x83 // Partial Image 2 Display Position +#define R61505_PLTSTART2 0x84 // Partial Image 2 RAM Start Address +#define R61505_PLTEND2 0x85 // Partial Image 2 RAM End Address + +#define R61505_IFCTL1 0x90 // Panel Interface Control 1 +#define R61505_IFCTL2 0x92 // Panel Interface Control 2 +#define R61505_IFCTL3 0x93 // Panel Interface Control 3 +#define R61505_IFCTL4 0x95 // Panel Interface Control 4 +#define R61505_IFCTL5 0x97 // Panel Interface Control 5 +#define R61505_IFCTL6 0x98 // Panel Interface Control 6 + +#define R61505_OSC_CTRL 0xA4 // Oscillation Control + + +static const uint16_t r61505_init[] = { + DATASIZE_16BIT, + ESC_REG(R61505_DRVCTL), R61505_DRVCTL_DATA, + ESC_REG(R61505_LCDCTL), 0x0700, // LCD Driving Wave Control + ESC_REG(R61505_ETMOD), R61505_ETMOD_DATA, + + ESC_REG(R61505_RESIZECTL), 0x0000, + ESC_REG(R61505_DISCTRL1), 0x0173, + ESC_REG(R61505_DISCTRL2), 0x0202, + ESC_REG(R61505_DISCTRL3), 0x0000, + ESC_REG(R61505_DISCTRL4), 0x0000, + ESC_REG(R61505_RGBCTRL1), 0x0000, + ESC_REG(R61505_FMARKERPOS), 0x0000, + ESC_REG(R61505_RGBCTRL2), 0x0000, + + ESC_REG(R61505_PWCTRL1), 0x17B0, + ESC_REG(R61505_PWCTRL2), 0x0037, + ESC_REG(R61505_PWCTRL3), 0x0138, + ESC_REG(R61505_PWCTRL4), 0x1700, + ESC_REG(R61505_PWCTRL7), 0x000D, + + ESC_REG(R61505_GAMCTRL1), 0x0001, + ESC_REG(R61505_GAMCTRL2), 0x0606, + ESC_REG(R61505_GAMCTRL3), 0x0304, + ESC_REG(R61505_GAMCTRL4), 0x0103, + ESC_REG(R61505_GAMCTRL5), 0x011D, + ESC_REG(R61505_GAMCTRL6), 0x0404, + ESC_REG(R61505_GAMCTRL7), 0x0404, + ESC_REG(R61505_GAMCTRL8), 0x0404, + ESC_REG(R61505_GAMCTRL9), 0x0700, + ESC_REG(R61505_GAMCTRLA), 0x0A1F, + + ESC_REG(R61505_DRVCTRL), R61505_DRVCTRL_GSDIR | 0x2700, + ESC_REG(R61505_BASE_IMAGE_CTRL), 0x0001, + ESC_REG(R61505_VSCROLL_CTRL), 0x0000, + + ESC_REG(R61505_IFCTL1), 0x0010, + ESC_REG(R61505_IFCTL2), 0x0000, + ESC_REG(R61505_IFCTL3), 0x0003, + ESC_REG(R61505_IFCTL4), 0x0101, + ESC_REG(R61505_IFCTL5), 0x0000, + ESC_REG(R61505_IFCTL6), 0x0000, + ESC_END +}; diff --git a/Marlin/src/lcd/tft/st7735.h b/Marlin/src/lcd/tft/st7735.h new file mode 100644 index 0000000000..30e77fbd91 --- /dev/null +++ b/Marlin/src/lcd/tft/st7735.h @@ -0,0 +1,128 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ST7735_MADCTL_MY 0x80 // Row Address Order +#define ST7735_MADCTL_MX 0x40 // Column Address Order +#define ST7735_MADCTL_MV 0x20 // Row/Column Exchange +#define ST7735_MADCTL_ML 0x10 // Vertical Refresh Order +#define ST7735_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ST7735_MADCTL_RGB 0x00 +#define ST7735_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ST7735_ORIENTATION_UP 0x00 // 128x160 ; Cable on the upper side +#define ST7735_ORIENTATION_RIGHT ST7735_MADCTL_MV | ST7735_MADCTL_MY // 160x128 ; Cable on the right side +#define ST7735_ORIENTATION_LEFT ST7735_MADCTL_MV | ST7735_MADCTL_MX // 160x128 ; Cable on the left side +#define ST7735_ORIENTATION_DOWN ST7735_MADCTL_MX | ST7735_MADCTL_MY // 128x160 ; Cable on the lower side + +//#define ST7735_COLOR_BGR +#define ST7735_ORIENTATION ST7735_ORIENTATION_DOWN +#define ST7735_MADCTL_DATA (ST7735_ORIENTATION | TERN(ST7735_COLOR_BGR, ST7735_MADCTL_BGR, ST7735_MADCTL_RGB)) + +#define ST7735_NOP 0x00 // No Operation +#define ST7735_SWRESET 0x01 // Software reset +#define ST7735_RDDID 0x04 // Read Display ID +#define ST7735_RDDST 0x09 // Read Display Status +#define ST7735_RDDPM 0x0A // Read Display Power Mode +#define ST7735_RDDMADCTL 0x0B // Read Display MADCTL +#define ST7735_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ST7735_RDDIM 0x0D // Read Display Image Mode +#define ST7735_RDDSM 0x0E // Read Display Signal Mode +#define ST7735_SLPIN 0x10 // Sleep In +#define ST7735_SLPOUT 0x11 // Sleep Out +#define ST7735_PTLON 0x12 // Partial Display Mode On +#define ST7735_NORON 0x13 // Normal Display Mode On +#define ST7735_INVOFF 0x20 // Display Inversion Off +#define ST7735_INVON 0x21 // Display Inversion On +#define ST7735_GAMSET 0x26 // Gamma Set +#define ST7735_DISPOFF 0x28 // Display Off // The delay time between DISPON and DISPOFF needs 120ms at least. +#define ST7735_DISPON 0x29 // Display On +#define ST7735_CASET 0x2A // Column Address Set +#define ST7735_RASET 0x2B // Row Address Set +#define ST7735_RAMWR 0x2C // Memory Write +#define ST7735_RAMRD 0x2E // Memory Read +#define ST7735_PTLAR 0x30 // Partial Area +#define ST7735_TEOFF 0x34 // Tearing Effect Line OFF +#define ST7735_TEON 0x35 // Tearing Effect Line ON +#define ST7735_MADCTL 0x36 // Memory Data Access Control +#define ST7735_IDMOFF 0x38 // Idle Mode Off +#define ST7735_IDMON 0x39 // Idle Mode On +#define ST7735_COLMOD 0x3A // Interface Pixel Format +#define ST7735_RDID1 0xDA // Read ID1 Value +#define ST7735_RDID2 0xDB // Read ID2 Value +#define ST7735_RDID3 0xDC // Read ID3 Value + +#define ST7735_FRMCTR1 0xB1 // Frame Rate Control (In normal mode/ Full colors) +#define ST7735_FRMCTR2 0xB2 // Frame Rate Control (In Idle mode/ 8-colors) +#define ST7735_FRMCTR3 0xB3 // Frame Rate Control (In Partial mode/ full colors) +#define ST7735_INVCTR 0xB4 // Display Inversion Control +#define ST7735_DISSET5 0xB6 // Display Function set 5 +#define ST7735_PWCTR1 0xC0 // Power Control 1 +#define ST7735_PWCTR2 0xC1 // Power Control 2 +#define ST7735_PWCTR3 0xC2 // Power Control 3 (in Normal mode/ Full colors) +#define ST7735_PWCTR4 0xC3 // Power Control 4 (in Idle mode/ 8-colors) +#define ST7735_PWCTR5 0xC4 // Power Control 5 (in Partial mode/ full-colors) +#define ST7735_VMCTR1 0xC5 // VCOM Control 1 +#define ST7735_VMOFCTR 0xC7 // VCOM Offset Control +#define ST7735_WRID2 0xD1 // Write ID2 Value +#define ST7735_WRID3 0xD2 // Write ID3 Value +#define ST7735_PWCTR6 0xFC // Power Control 5 (in Partial mode + Idle mode) +#define ST7735_NVFCTR1 0xD9 // EEPROM Control Status +#define ST7735_NVFCTR2 0xDE // EEPROM Read Command +#define ST7735_NVFCTR3 0xDF // EEPROM Write Command +#define ST7735_GMCTRP1 0xE0 // Gamma (‘+’polarity) Correction Characteristics Setting +#define ST7735_GMCTRN1 0xE1 // GMCTRN1 (E1h): Gamma ‘-’polarity Correction Characteristics Setting +#define ST7735_EXTCTRL 0xF0 // Extension Command Control +#define ST7735_VCOM4L 0xFF // Vcom 4 Level Control + +static const uint16_t st7735_init[] = { + DATASIZE_8BIT, + ESC_REG(ST7735_SWRESET), ESC_DELAY(100), + ESC_REG(ST7735_SLPOUT), ESC_DELAY(20), +/* + ESC_REG(ST7735_FRMCTR1), 0x0001, 0x002C, 0x002D, + ESC_REG(ST7735_FRMCTR2), 0x0001, 0x002C, 0x002D, + ESC_REG(ST7735_FRMCTR3), 0x0001, 0x002C, 0x002D, 0x0001, 0x002C, 0x002D, + ESC_REG(ST7735_INVCTR), 0x0007, + ESC_REG(ST7735_PWCTR1), 0x00A2, 0x0002, 0x0084, + ESC_REG(ST7735_PWCTR2), 0x00C5, + ESC_REG(ST7735_PWCTR3), 0x000A, 0x0000, + ESC_REG(ST7735_PWCTR4), 0x008A, 0x002A, + ESC_REG(ST7735_PWCTR5), 0x008A, 0x00EE, + ESC_REG(ST7735_VMCTR1), 0x000E, + ESC_REG(ST7735_INVOFF), +*/ + ESC_REG(ST7735_MADCTL), ST7735_MADCTL_DATA, + ESC_REG(ST7735_COLMOD), 0x0005, + + /* Gamma Correction. Colors with 'after-reset' settings are bleak */ + ESC_REG(ST7735_GMCTRP1), 0x0002, 0x001C, 0x0007, 0x0012, 0x0037, 0x0032, 0x0029, 0x002D, 0x0029, 0x0025, 0x002B, 0x0039, 0x0000, 0x0001, 0x0003, 0x0010, + ESC_REG(ST7735_GMCTRN1), 0x0003, 0x001D, 0x0007, 0x0006, 0x002E, 0x002C, 0x0029, 0x002D, 0x002E, 0x002E, 0x0037, 0x003F, 0x0000, 0x0000, 0x0002, 0x0010, + + ESC_REG(ST7735_NORON), + ESC_REG(ST7735_DISPON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/st7789v.h b/Marlin/src/lcd/tft/st7789v.h new file mode 100644 index 0000000000..6ed7c0ce66 --- /dev/null +++ b/Marlin/src/lcd/tft/st7789v.h @@ -0,0 +1,148 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ST7789V_MADCTL_MY 0x80 // Row Address Order +#define ST7789V_MADCTL_MX 0x40 // Column Address Order +#define ST7789V_MADCTL_MV 0x20 // Row/Column Exchange +#define ST7789V_MADCTL_ML 0x10 // Vertical Refresh Order +#define ST7789V_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ST7789V_MADCTL_RGB 0x00 +#define ST7789V_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ST7789V_ORIENTATION_UP ST7789V_MADCTL_MX | ST7789V_MADCTL_MY // 240x320 ; Cable on the upper side +#define ST7789V_ORIENTATION_RIGHT ST7789V_MADCTL_MX | ST7789V_MADCTL_MV // 320x240 ; Cable on the right side +#define ST7789V_ORIENTATION_LEFT ST7789V_MADCTL_MY | ST7789V_MADCTL_MV // 320x240 ; Cable on the left side +#define ST7789V_ORIENTATION_DOWN 0 // 240x320 ; Cable on the lower side + +//#define ST7789V_COLOR_BGR +#define ST7789V_ORIENTATION ST7789V_ORIENTATION_LEFT +#define ST7789V_MADCTL_DATA (ST7789V_ORIENTATION | TERN(ST7789V_COLOR_BGR, ST7789V_MADCTL_BGR, ST7789V_MADCTL_RGB)) + +#define ST7789V_NOP 0x00 // No Operation +#define ST7789V_SWRESET 0x01 // Software reset +#define ST7789V_RDDID 0x04 // Read Display ID +#define ST7789V_RDDST 0x09 // Read Display Status +#define ST7789V_RDDPM 0x0A // Read Display Power Mode +#define ST7789V_RDDMADCTL 0x0B // Read Display MADCTL +#define ST7789V_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ST7789V_RDDIM 0x0D // Read Display Image Mode +#define ST7789V_RDDSM 0x0E // Read Display Signal Mode +#define ST7789V_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ST7789V_SLPIN 0x10 // Sleep In +#define ST7789V_SLPOUT 0x11 // Sleep Out +#define ST7789V_PTLON 0x12 // Partial Display Mode On +#define ST7789V_NORON 0x13 // Normal Display Mode On +#define ST7789V_INVOFF 0x20 // Display Inversion Off +#define ST7789V_INVON 0x21 // Display Inversion On +#define ST7789V_GAMSET 0x26 // Gamma Set +#define ST7789V_DISPOFF 0x28 // Display Off +#define ST7789V_DISPON 0x29 // Display On +#define ST7789V_CASET 0x2A // Column Address Set +#define ST7789V_RASET 0x2B // Row Address Set +#define ST7789V_RAMWR 0x2C // Memory Write +#define ST7789V_RAMRD 0x2E // Memory Read +#define ST7789V_PTLAR 0x30 // Partial Area +#define ST7789V_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ST7789V_TEOFF 0x34 // Tearing Effect Line OFF +#define ST7789V_TEON 0x35 // Tearing Effect Line ON +#define ST7789V_MADCTL 0x36 // Memory Data Access Control +#define ST7789V_VSCSAD 0x37 // Vertical Scroll Start Address of RAM +#define ST7789V_IDMOFF 0x38 // Idle Mode Off +#define ST7789V_IDMON 0x39 // Idle Mode On +#define ST7789V_COLMOD 0x3A // Interface Pixel Format +#define ST7789V_WRMEMC 0x3C // Write Memory Continue +#define ST7789V_RDMEMC 0x3E // Read Memory Continue +#define ST7789V_STE 0x44 // Set Tear Scanline +#define ST7789V_GSCAN 0x45 // Get Scanline +#define ST7789V_WRDISBV 0x51 // Write Display Brightness +#define ST7789V_RDDISBV 0x52 // Read Display Brightness +#define ST7789V_WRCTRLD 0x53 // Write CTRL Display +#define ST7789V_RDCTRLD 0x54 // Read CTRL Value Display +#define ST7789V_WRCACE 0x55 // Write Content Adaptive Brightness Control and Color Enhancement +#define ST7789V_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define ST7789V_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define ST7789V_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define ST7789V_RDABCSDR 0x68 // Read Automatic Brightness Control Self-Diagnostic Result +#define ST7789V_RDID1 0xDA // Read ID1 Value +#define ST7789V_RDID2 0xDB // Read ID2 Value +#define ST7789V_RDID3 0xDC // Read ID3 Value + +#define ST7789V_RAMCTRL 0xB0 // RAM Control +#define ST7789V_RGBCTRL 0xB1 // RGB Interface Control +#define ST7789V_PORCTRL 0xB2 // Porch Setting +#define ST7789V_FRCTRL1 0xB3 // Frame Rate Control 1 (In partial mode/ idle colors) +#define ST7789V_GCTRL 0xB7 // Gate Control +#define ST7789V_DGMEN 0xBA // Digital Gamma Enable +#define ST7789V_VCOMS 0xBB // VCOM Setting +#define ST7789V_LCMCTRL 0xC0 // LCM Control +#define ST7789V_IDSET 0xC1 // ID Code Setting +#define ST7789V_VDVVRHEN 0xC2 // VDV and VRH Command Enable +#define ST7789V_VRHS 0xC3 // VRH Set +#define ST7789V_VDVS 0xC4 // VDV Set +#define ST7789V_VCMOFSET 0xC5 // VCOM Offset Set +#define ST7789V_FRCTRL2 0xC6 // Frame Rate Control in Normal Mode +#define ST7789V_CABCCTRL 0xC7 // CABC Control +#define ST7789V_REGSEL1 0xC8 // Register Value Selection 1 +#define ST7789V_REGSEL2 0xCA // Register Value Selection 2 +#define ST7789V_PWMFRSEL 0xCC // PWM Frequency Selection +#define ST7789V_PWCTRL1 0xD0 // Power Control 1 +#define ST7789V_VAPVANEN 0xD2 // Enable VAP/VAN signal output +#define ST7789V_CMD2EN 0xDF // Command 2 Enable +#define ST7789V_PVGAMCTRL 0xE0 // Positive Voltage Gamma Control +#define ST7789V_NVGAMCTRL 0xE1 // Negative Voltage Gamma Control +#define ST7789V_DGMLUTR 0xE2 // Digital Gamma Look-up Table for Red +#define ST7789V_DGMLUTB 0xE3 // Digital Gamma Look-up Table for Blue +#define ST7789V_GATECTRL 0xE4 // Gate Control +#define ST7789V_SPI2EN 0xE7 // SPI2 Enable +#define ST7789V_PWCTRL2 0xE8 // Power Control 2 +#define ST7789V_EQCTRL 0xE9 // Equalize time control +#define ST7789V_PROMCTRL 0xEC // Program Mode Control +#define ST7789V_PROMEN 0xFA // Program Mode Enable +#define ST7789V_NVMSET 0xFC // NVM Setting +#define ST7789V_PROMACT 0xFE // Program action + +static const uint16_t st7789v_init[] = { + DATASIZE_8BIT, + ESC_REG(ST7789V_SWRESET), ESC_DELAY(100), + ESC_REG(ST7789V_SLPOUT), ESC_DELAY(20), + + ESC_REG(ST7789V_PORCTRL), 0x000C, 0x000C, 0x0000, 0x0033, 0x0033, + ESC_REG(ST7789V_GCTRL), 0x0035, + ESC_REG(ST7789V_VCOMS), 0x001F, + ESC_REG(ST7789V_LCMCTRL), 0x002C, + ESC_REG(ST7789V_VDVVRHEN), 0x0001, 0x00C3, + ESC_REG(ST7789V_VDVS), 0x0020, + ESC_REG(ST7789V_FRCTRL2), 0x000F, + ESC_REG(ST7789V_PWCTRL1), 0x00A4, 0x00A1, + + ESC_REG(ST7789V_MADCTL), ST7789V_MADCTL_DATA, + ESC_REG(ST7789V_COLMOD), 0x0055, + + ESC_REG(ST7789V_NORON), + ESC_REG(ST7789V_DISPON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/st7796s.h b/Marlin/src/lcd/tft/st7796s.h new file mode 100644 index 0000000000..7ddbcfae84 --- /dev/null +++ b/Marlin/src/lcd/tft/st7796s.h @@ -0,0 +1,175 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ST7796S_MADCTL_MY 0x80 // Row Address Order +#define ST7796S_MADCTL_MX 0x40 // Column Address Order +#define ST7796S_MADCTL_MV 0x20 // Row/Column Exchange +#define ST7796S_MADCTL_ML 0x10 // Vertical Refresh Order +#define ST7796S_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ST7796S_MADCTL_RGB 0x00 +#define ST7796S_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ST7796S_COLOR_BGR +#define ST7796S_ORIENTATION ST7796S_MADCTL_MV +#define ST7796S_MADCTL_DATA (ST7796S_ORIENTATION | TERN(ST7796S_COLOR_BGR, ST7796S_MADCTL_BGR, ST7796S_MADCTL_RGB)) + +#define ST7796S_NOP 0x00 // No Operation +#define ST7796S_SWRESET 0x01 // Software reset +#define ST7796S_RDDID 0x04 // Read Display ID +#define ST7796S_RDNUMED 0x05 // Read Number of the Errors on DSI +#define ST7796S_RDDST 0x09 // Read Display Status +#define ST7796S_RDDPM 0x0A // Read Display Power Mode +#define ST7796S_RDDMADCTL 0x0B // Read Display MADCTL +#define ST7796S_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ST7796S_RDDIM 0x0D // Read Display Image Mode +#define ST7796S_RDDSM 0x0E // Read Display Signal Status +#define ST7796S_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ST7796S_SLPIN 0x10 // Sleep In +#define ST7796S_SLPOUT 0x11 // Sleep Out +#define ST7796S_PTLON 0x12 // Partial Display Mode On +#define ST7796S_NORON 0x13 // Normal Display Mode On +#define ST7796S_INVOFF 0x20 // Display Inversion Off +#define ST7796S_INVON 0x21 // Display Inversion On +#define ST7796S_DISPOFF 0x28 // Display Off +#define ST7796S_DISPON 0x29 // Display On +#define ST7796S_CASET 0x2A // Column Address Set +#define ST7796S_RASET 0x2B // Row Address Set +#define ST7796S_RAMWR 0x2C // Memory Write +#define ST7796S_RAMRD 0x2E // Memory Read +#define ST7796S_PTLAR 0x30 // Partial Area +#define ST7796S_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ST7796S_TEOFF 0x34 // Tearing Effect Line OFF +#define ST7796S_TEON 0x35 // Tearing Effect Line On +#define ST7796S_MADCTL 0x36 // Memory Data Access Control +#define ST7796S_VSCSAD 0x37 // Vertical Scroll Start Address of RAM +#define ST7796S_IDMOFF 0x38 // Idle Mode Off +#define ST7796S_IDMON 0x39 // Idle Mode On +#define ST7796S_COLMOD 0x3A // Interface Pixel Format +#define ST7796S_WRMEMC 0x3C // Write Memory Continue +#define ST7796S_RDMEMC 0x3E // Read Memory Continue +#define ST7796S_STE 0x44 // Set Tear ScanLine +#define ST7796S_GSCAN 0x45 // Get ScanLine +#define ST7796S_WRDISBV 0x51 // Write Display Brightness +#define ST7796S_RDDISBV 0x52 // Read Display Brightness Value +#define ST7796S_WRCTRLD 0x53 // Write CTRL Display +#define ST7796S_RDCTRLD 0x54 // Read CTRL value Display +#define ST7796S_WRCABC 0x55 // Write Adaptive Brightness Control +#define ST7796S_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define ST7796S_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define ST7796S_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define ST7796S_RDFCS 0xAA // Read First Checksum +#define ST7796S_RDCFCS 0xAF // Read Continue Checksum +#define ST7796S_RDID1 0xDA // Read ID1 +#define ST7796S_RDID2 0xDB // Read ID2 +#define ST7796S_RDID3 0xDC // Read ID3 + +#define ST7796S_IFMODE 0xB0 // Interface Mode Control +#define ST7796S_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) +#define ST7796S_FRMCTR2 0xB2 // Frame Rate Control 2 (In Idle Mode/8 colors) +#define ST7796S_FRMCTR3 0xB3 // Frame Rate Control 3(In Partial Mode/Full Colors) +#define ST7796S_DIC 0xB4 // Display Inversion Control +#define ST7796S_BPC 0xB5 // Blanking Porch Control +#define ST7796S_DFC 0xB6 // Display Function Control +#define ST7796S_EM 0xB7 // Entry Mode Set +#define ST7796S_PWR1 0xC0 // Power Control 1 +#define ST7796S_PWR2 0xC1 // Power Control 2 +#define ST7796S_PWR3 0xC2 // Power Control 3 +#define ST7796S_VCMPCTL 0xC5 // VCOM Control +#define ST7796S_VCMOST 0xC6 // VCOM Offset Register +#define ST7796S_NVMADW 0xD0 // NVM Address/Data Write +#define ST7796S_NVMBPROG 0xD1 // NVM Byte Program +#define ST7796S_NVMSTRD 0xD2 // NVM Status Read +#define ST7796S_RDID4 0xD3 // Read ID4 +#define ST7796S_PGC 0xE0 // Positive Gamma Control +#define ST7796S_NGC 0xE1 // Negative Gamma Control +#define ST7796S_DGC1 0xE2 // Digital Gamma Control 1 +#define ST7796S_DGC2 0xE3 // Digital Gamma Control 2 +#define ST7796S_DOCA 0xE8 // Display Output Ctrl Adjust +#define ST7796S_CSCON 0xF0 // Command Set Control +#define ST7796S_SPIRC 0xFB // SPI Read Control + +static const uint16_t st7796s_init[] = { + DATASIZE_8BIT, + ESC_REG(ST7796S_SWRESET), ESC_DELAY(100), + ESC_REG(ST7796S_SLPOUT), ESC_DELAY(20), + + ESC_REG(ST7796S_CSCON), 0x00C3, // enable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0096, // enable command 2 part II + + ESC_REG(ST7796S_MADCTL), ST7796S_MADCTL_DATA, + ESC_REG(ST7796S_COLMOD), 0x0055, + + ESC_REG(ST7796S_DIC), 0x0001, // 1-dot inversion + ESC_REG(ST7796S_EM), 0x00C6, + + ESC_REG(ST7796S_PWR2), 0x0015, + ESC_REG(ST7796S_PWR3), 0x00AF, + ESC_REG(ST7796S_VCMPCTL), 0x0022, + ESC_REG(ST7796S_VCMOST), 0x0000, + ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, + + /* Gamma Correction. */ + ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, + ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, + + ESC_REG(ST7796S_NORON), + ESC_REG(ST7796S_WRCTRLD), 0x0024, + ESC_REG(ST7796S_CSCON), 0x003C, // disable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0069, // disable command 2 part II + ESC_REG(ST7796S_DISPON), + ESC_END +}; + +static const uint16_t lerdge_st7796s_init[] = { + DATASIZE_8BIT, + ESC_REG(ST7796S_CSCON), 0x00C3, // enable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0096, // enable command 2 part II + + ESC_REG(ST7796S_MADCTL), ST7796S_MADCTL_DATA, + ESC_REG(ST7796S_COLMOD), 0x0055, + + ESC_REG(ST7796S_DIC), 0x0001, // 1-dot inversion + ESC_REG(ST7796S_EM), 0x00C6, + + ESC_REG(ST7796S_PWR2), 0x0015, + ESC_REG(ST7796S_PWR3), 0x00AF, + ESC_REG(0xC3), 0x0009, // Register not documented in datasheet + ESC_REG(ST7796S_VCMPCTL), 0x0022, + ESC_REG(ST7796S_VCMOST), 0x0000, + ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, + + /* Gamma Correction. */ + ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, + ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, + + ESC_REG(ST7796S_INVON), // Display inversion ON + ESC_REG(ST7796S_WRCTRLD), 0x0024, + ESC_REG(ST7796S_CSCON), 0x003C, // disable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0069, // disable command 2 part II + ESC_REG(ST7796S_DISPON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/tft.cpp b/Marlin/src/lcd/tft/tft.cpp new file mode 100644 index 0000000000..81fe6788e7 --- /dev/null +++ b/Marlin/src/lcd/tft/tft.cpp @@ -0,0 +1,199 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_GRAPHICAL_TFT + +#include "tft.h" +#include "st7735.h" +#include "st7789v.h" +#include "st7796s.h" +#include "r65105.h" +#include "ili9328.h" +#include "ili9341.h" +#include "ili9488.h" + +//#define DEBUG_GRAPHICAL_TFT +#define DEBUG_OUT ENABLED(DEBUG_GRAPHICAL_TFT) +#include "../../core/debug_out.h" + +uint16_t TFT::buffer[]; +uint32_t TFT::lcd_id = 0xFFFFFFFF; + +void TFT::init() { + if (lcd_id != 0xFFFFFFFF) return; + + io.Init(); + + #if TFT_DRIVER != AUTO + lcd_id = TFT_DRIVER; + #endif + + #if TFT_DRIVER == ST7735 + write_esc_sequence(st7735_init); + #elif TFT_DRIVER == ST7789 + write_esc_sequence(st7789v_init); + #elif TFT_DRIVER == ST7796 + write_esc_sequence(st7796s_init); + #elif TFT_DRIVER == R61505 + write_esc_sequence(r61505_init); + #elif TFT_DRIVER == ILI9328 + write_esc_sequence(ili9328_init); + #elif TFT_DRIVER == ILI9341 + write_esc_sequence(ili9341_init); + #elif TFT_DRIVER == ILI9488 + write_esc_sequence(ili9488_init); + #elif TFT_DRIVER == LERDGE_ST7796 + lcd_id = ST7796; + write_esc_sequence(lerdge_st7796s_init); + + #elif TFT_DRIVER == AUTO // autodetect + + lcd_id = io.GetID() & 0xFFFF; + + switch (lcd_id) { + case ST7796: // ST7796S 480x320 + DEBUG_ECHO_MSG(" ST7796S"); + write_esc_sequence(st7796s_init); + break; + case ST7789: // ST7789V 320x240 + DEBUG_ECHO_MSG(" ST7789V"); + write_esc_sequence(st7789v_init); + break; + case ST7735: // ST7735 160x128 + DEBUG_ECHO_MSG(" ST7735"); + write_esc_sequence(st7735_init); + break; + case R61505: // R61505U 320x240 + DEBUG_ECHO_MSG(" R61505U"); + write_esc_sequence(r61505_init); + break; + case ILI9328: // ILI9328 320x240 + DEBUG_ECHO_MSG(" ILI9328"); + write_esc_sequence(ili9328_init); + break; + case ILI9341: // ILI9341 320x240 + DEBUG_ECHO_MSG(" ILI9341"); + write_esc_sequence(ili9341_init); + break; + case ILI9488: // ILI9488 480x320 + DEBUG_ECHO_MSG(" ILI9488"); + write_esc_sequence(ili9488_init); + break; + default: + lcd_id = 0; + } + #else + #error Unsupported TFT driver + #endif +} + +void TFT::set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { + #ifdef OFFSET_X + Xmin += OFFSET_X; Xmax += OFFSET_X; + #endif + #ifdef OFFSET_Y + Ymin += OFFSET_Y; Ymax += OFFSET_Y; + #endif + + switch (lcd_id) { + case ST7735: // ST7735 160x128 + case ST7789: // ST7789V 320x240 + case ST7796: // ST7796 480x320 + case ILI9341: // ILI9341 320x240 + case ILI9488: // ILI9488 480x320 + io.DataTransferBegin(DATASIZE_8BIT); + + // CASET: Column Address Set + io.WriteReg(ILI9341_CASET); + io.WriteData((Xmin >> 8) & 0xFF); + io.WriteData(Xmin & 0xFF); + io.WriteData((Xmax >> 8) & 0xFF); + io.WriteData(Xmax & 0xFF); + + // RASET: Row Address Set + io.WriteReg(ILI9341_PASET); + io.WriteData((Ymin >> 8) & 0xFF); + io.WriteData(Ymin & 0xFF); + io.WriteData((Ymax >> 8) & 0xFF); + io.WriteData(Ymax & 0xFF); + + // RAMWR: Memory Write + io.WriteReg(ILI9341_RAMWR); + break; + case R61505: // R61505U 320x240 + case ILI9328: // ILI9328 320x240 + io.DataTransferBegin(DATASIZE_16BIT); + + // Mind the mess: with landscape screen orientation 'Horizontal' is Y and 'Vertical' is X + io.WriteReg(ILI9328_HASTART); + io.WriteData(Ymin); + io.WriteReg(ILI9328_HAEND); + io.WriteData(Ymax); + io.WriteReg(ILI9328_VASTART); + io.WriteData(Xmin); + io.WriteReg(ILI9328_VAEND); + io.WriteData(Xmax); + + io.WriteReg(ILI9328_HASET); + io.WriteData(Ymin); + io.WriteReg(ILI9328_VASET); + io.WriteData(Xmin); + + io.WriteReg(ILI9328_RAMWR); + break; + default: + break; + } + + io.DataTransferEnd(); +} + +void TFT::write_esc_sequence(const uint16_t *Sequence) { + uint16_t dataWidth, data; + + dataWidth = *Sequence++; + io.DataTransferBegin(dataWidth); + + for (;;) { + data = *Sequence++; + if (data != 0xFFFF) { + io.WriteData(data); + continue; + } + data = *Sequence++; + if (data == 0x7FFF) return; + if (data == 0xFFFF) + io.WriteData(0xFFFF); + else if (data & 0x8000) + delay(data & 0x7FFF); + else if ((data & 0xFF00) == 0) + io.WriteReg(data); + } + + io.DataTransferEnd(); +} + +TFT tft; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h new file mode 100644 index 0000000000..6d429109c8 --- /dev/null +++ b/Marlin/src/lcd/tft/tft.h @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft_queue.h" +#include "canvas.h" +#include "tft_color.h" +#include "tft_string.h" +#include "tft_image.h" +#include "tft_io.h" + +#include "../../inc/MarlinConfig.h" + +#if HAS_UI_320x240 + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 +#elif HAS_UI_480x320 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 +#else + #error "Unsupported display resolution!" +#endif + +#define ST7735 0x89F0 +#define ST7789 0x8552 +#define ST7796 0x7796 +#define R61505 0x1505 +#define ILI9328 0x9328 +#define ILI9341 0x9341 +#define ILI9488 0x9488 +#define LERDGE_ST7796 0xFFFE +#define AUTO 0xFFFF + +#ifndef TFT_DRIVER + #define TFT_DRIVER AUTO +#endif + +#ifndef TFT_BUFFER_SIZE + #ifdef STM32F103xB + #define TFT_BUFFER_SIZE 1024 + #elif defined(STM32F103xE) + #define TFT_BUFFER_SIZE 19200 // 320 * 60 + #elif defined(STM32F1) + #define TFT_BUFFER_SIZE 8192 + #else + #define TFT_BUFFER_SIZE 19200 // 320 * 60 + #endif +#endif + +#if TFT_BUFFER_SIZE > 65535 + // DMA Count parameter is uint16_t + #error "TFT_BUFFER_SIZE can not exceed 65535" +#endif + +#define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x +#define ESC_DELAY(x) 0xFFFF, 0x8000 | (x & 0x7FFF) +#define ESC_END 0xFFFF, 0x7FFF +#define ESC_FFFF 0xFFFF, 0xFFFF + +class TFT { + private: + static uint32_t lcd_id; + static TFT_String string; + static TFT_IO io; + + public: + static TFT_Queue queue; + + static uint16_t buffer[TFT_BUFFER_SIZE]; + + static void init(); + static inline void set_font(const uint8_t *Font) { string.set_font(Font); } + static inline void add_glyphs(const uint8_t *Font) { string.add_glyphs(Font); } + + static void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax); + static void write_esc_sequence(const uint16_t *Sequence); + + static inline bool is_busy() { return io.isBusy(); } + static inline void abort() { io.Abort(); } + static inline void write_multiple(uint16_t Data, uint16_t Count) { io.WriteMultiple(Data, Count); } + static inline void write_sequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); } + + static inline void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.fill(x, y, width, height, color); } + static inline void canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { queue.canvas(x, y, width, height); } + static inline void set_background(uint16_t color) { queue.set_background(color); } + static inline void add_text(uint16_t x, uint16_t y, uint16_t color, TFT_String tft_string, uint16_t maxWidth = 0) { queue.add_text(x, y, color, tft_string.string(), maxWidth); } + static inline void add_text(uint16_t x, uint16_t y, uint16_t color, const char *string, uint16_t maxWidth = 0) { queue.add_text(x, y, color, (uint8_t *)string, maxWidth); } + static inline void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { queue.add_image(x, y, image, colors); } + static inline void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main = COLOR_WHITE, uint16_t color_background = COLOR_BACKGROUND, uint16_t color_shadow = COLOR_BLACK) { queue.add_image(x, y, image, color_main, color_background, color_shadow); } + static inline void add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.add_bar(x, y, width, height, color); } + static inline void add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.add_rectangle(x, y, width, height, color); } +}; + +extern TFT tft; diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h new file mode 100644 index 0000000000..d2c5d8e7db --- /dev/null +++ b/Marlin/src/lcd/tft/tft_color.h @@ -0,0 +1,112 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define RED(color) ((color >> 8) & 0xF8) +#define GREEN(color) ((color >> 3) & 0xFC) +#define BLUE(color) ((color << 3) & 0xF8) +#define RGB(red, green, blue) (((red << 8) & 0xF800) | ((green << 3) & 0x07E0) | ((blue >> 3) & 0x001F)) +#define COLOR(color) RGB(((color >> 16) & 0xFF), ((color >> 8) & 0xFF), (color & 0xFF)) +#define HALF(color) RGB(RED(color) >> 1, GREEN(color) >> 1, BLUE(color) >> 1) + +// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html + +#define COLOR_BLACK 0x0000 // #000000 +#define COLOR_WHITE 0xFFFF // #FFFFFF +#define COLOR_SILVER 0xC618 // #C0C0C0 +#define COLOR_GREY 0x7BEF // #808080 +#define COLOR_DARKGREY 0x4208 // #404040 +#define COLOR_DARKGREY2 0x39E7 // #303030 +#define COLOR_DARK 0x0003 // Some dark color + +#define COLOR_RED 0xF800 // #FF0000 +#define COLOR_SCARLET 0xF904 // #FF2020 +#define COLOR_LIME 0x7E00 // #00FF00 +#define COLOR_BLUE 0x001F // #0000FF +#define COLOR_YELLOW 0xFFE0 // #FFFF00 +#define COLOR_MAGENTA 0xF81F // #FF00FF +#define COLOR_FUCHSIA 0xF81F // #FF00FF +#define COLOR_CYAN 0x07FF // #00FFFF +#define COLOR_AQUA 0x07FF // #00FFFF +#define COLOR_DODGER_BLUE 0x041F // #0080FF +#define COLOR_VIVID_VIOLET 0x7933 // #772399 + +#define COLOR_DARK_PURPLE 0x9930 // #992380 + +#define COLOR_MAROON 0x7800 // #800000 +#define COLOR_GREEN 0x03E0 // #008000 +#define COLOR_NAVY 0x000F // #000080 +#define COLOR_OLIVE 0x8400 // #808000 +#define COLOR_PURPLE 0x8010 // #800080 +#define COLOR_TEAL 0x0410 // #008080 + +#define COLOR_ORANGE 0xFC00 // #FF7F00 +#define COLOR_VIVID_GREEN 0x7FE0 // #7FFF00 +#define COLOR_DARK_ORANGE 0xFC40 // #FF8C00 +#define COLOR_CORAL_RED 0xF9E7 // #FF3F3F + +#define COLOR_DARK_PURPLE 0x9930 // #992380 + + +#define COLOR_BACKGROUND 0x20AC // #1E156E +#define COLOR_SELECTION_BG 0x9930 // #992380 +#define COLOR_WEBSITE_URL 0x03B7 + +#define COLOR_INACTIVE COLOR_GREY +#define COLOR_COLD COLOR_AQUA +#define COLOR_HOTEND COLOR_SCARLET +#define COLOR_HEATED_BED COLOR_DARK_ORANGE +#define COLOR_CHAMBER COLOR_DARK_ORANGE +#define COLOR_FAN COLOR_AQUA + +#define COLOR_AXIS_HOMED COLOR_WHITE +#define COLOR_AXIS_NOT_HOMED COLOR_YELLOW + +#define COLOR_RATE_100 COLOR_VIVID_GREEN +#define COLOR_RATE_ALTERED COLOR_YELLOW + +#define COLOR_PRINT_TIME COLOR_AQUA + +#define COLOR_PROGRESS_FRAME COLOR_WHITE +#define COLOR_PROGRESS_BAR COLOR_BLUE +#define COLOR_PROGRESS_BG COLOR_BLACK + +#define COLOR_STATUS_MESSAGE COLOR_YELLOW + +#define COLOR_CONTROL_ENABLED COLOR_WHITE +#define COLOR_CONTROL_DISABLED COLOR_GREY +#define COLOR_CONTROL_CANCEL COLOR_SCARLET +#define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN +#define COLOR_BUSY COLOR_SILVER + +#define COLOR_MENU_TEXT COLOR_YELLOW +#define COLOR_MENU_VALUE COLOR_WHITE + +#define COLOR_SLIDER COLOR_WHITE +#define COLOR_SLIDER_INACTIVE COLOR_GREY + +#define COLOR_UBL COLOR_WHITE + +#define COLOR_TOUCH_CALIBRATION COLOR_WHITE + +#define COLOR_KILL_SCREEN_BG COLOR_MAROON +#define COLOR_KILL_SCREEN_TEXT COLOR_WHITE diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp new file mode 100644 index 0000000000..9e4dc16297 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -0,0 +1,69 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "tft_image.h" +#include "cstddef" + +const tImage NoLogo = { (void *)NULL, 0, 0, NOCOLORS }; + +const tImage MarlinLogo112x38x1 = { (void *)marlin_logo_112x38x1, 112, 38, GREYSCALE1 }; +const tImage MarlinLogo228x255x2 = { (void *)marlin_logo_228x255x2, 228, 255, GREYSCALE2 }; +const tImage MarlinLogo228x255x4 = { (void *)marlin_logo_228x255x4, 228, 255, GREYSCALE4 }; +const tImage MarlinLogo195x59x16 = { (void *)marlin_logo_195x59x16, 195, 59, HIGHCOLOR }; +const tImage MarlinLogo320x240x16 = { (void *)marlin_logo_320x240x16, 320, 240, HIGHCOLOR }; +const tImage MarlinLogo480x320x16 = { (void *)marlin_logo_480x320x16, 480, 320, HIGHCOLOR }; +const tImage Background320x30x16 = { (void *)background_320x30x16, 320, 30, HIGHCOLOR }; + +const tImage HotEnd_64x64x4 = { (void *)hotend_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Bed_64x64x4 = { (void *)bed_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Bed_Heated_64x64x4 = { (void *)bed_heated_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Chamber_64x64x4 = { (void *)chamber_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Chamber_Heated_64x64x4 = { (void *)chamber_heated_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan0_64x64x4 = { (void *)fan0_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan1_64x64x4 = { (void *)fan1_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan_Slow0_64x64x4 = { (void *)fan_slow0_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan_Slow1_64x64x4 = { (void *)fan_slow1_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan_Fast0_64x64x4 = { (void *)fan_fast0_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan_Fast1_64x64x4 = { (void *)fan_fast1_64x64x4, 64, 64, GREYSCALE4 }; +const tImage SD_64x64x4 = { (void *)sd_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Menu_64x64x4 = { (void *)menu_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Settings_64x64x4 = { (void *)settings_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Confirm_64x64x4 = { (void *)confirm_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Cancel_64x64x4 = { (void *)cancel_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Increase_64x64x4 = { (void *)increase_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Decrease_64x64x4 = { (void *)decrease_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Pause_64x64x4 = { (void *)pause_64x64x4, 64, 64, GREYSCALE4 }; + +const tImage Feedrate_32x32x4 = { (void *)feedrate_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Flowrate_32x32x4 = { (void *)flowrate_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Directory_32x32x4 = { (void *)directory_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Back_32x32x4 = { (void *)back_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Up_32x32x4 = { (void *)up_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Down_32x32x4 = { (void *)down_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Left_32x32x4 = { (void *)left_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Right_32x32x4 = { (void *)right_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Refresh_32x32x4 = { (void *)refresh_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Leveling_32x32x4 = { (void *)leveling_32x32x4, 32, 32, GREYSCALE4 }; + +const tImage Slider8x16x4 = { (void *)slider_8x16x4, 8, 16, GREYSCALE4 }; + +extern const tImage Images[imgCount]; diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h new file mode 100644 index 0000000000..cf48065968 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_image.h @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "stdint.h" + + +extern const uint8_t marlin_logo_112x38x1[]; +extern const uint8_t marlin_logo_228x255x2[]; +extern const uint8_t marlin_logo_228x255x4[]; +extern const uint16_t marlin_logo_195x59x16[]; +extern const uint16_t marlin_logo_320x240x16[]; +extern const uint16_t marlin_logo_480x320x16[]; +extern const uint16_t background_320x30x16[]; + +extern const uint8_t hotend_64x64x4[]; +extern const uint8_t bed_64x64x4[], bed_heated_64x64x4[]; +extern const uint8_t chamber_64x64x4[], chamber_heated_64x64x4[]; +extern const uint8_t fan0_64x64x4[], fan1_64x64x4[]; +extern const uint8_t fan_slow0_64x64x4[], fan_slow1_64x64x4[]; +extern const uint8_t fan_fast0_64x64x4[], fan_fast1_64x64x4[]; +extern const uint8_t sd_64x64x4[]; +extern const uint8_t menu_64x64x4[]; +extern const uint8_t settings_64x64x4[]; +extern const uint8_t confirm_64x64x4[]; +extern const uint8_t cancel_64x64x4[]; +extern const uint8_t increase_64x64x4[]; +extern const uint8_t decrease_64x64x4[]; +extern const uint8_t pause_64x64x4[]; + +extern const uint8_t feedrate_32x32x4[]; +extern const uint8_t flowrate_32x32x4[]; +extern const uint8_t directory_32x32x4[]; +extern const uint8_t back_32x32x4[]; +extern const uint8_t up_32x32x4[]; +extern const uint8_t down_32x32x4[]; +extern const uint8_t left_32x32x4[]; +extern const uint8_t right_32x32x4[]; +extern const uint8_t refresh_32x32x4[]; +extern const uint8_t leveling_32x32x4[]; + +extern const uint8_t slider_8x16x4[]; + +enum MarlinImage : uint8_t { + imgBootScreen = 0x00, + imgHotEnd, + imgBed, + imgBedHeated, + imgChamber, + imgChamberHeated, + imgFanIdle, + imgFanSlow0, + imgFanSlow1, + imgFanFast0, + imgFanFast1, + imgFeedRate, + imgFlowRate, + imgSD, + imgMenu, + imgSettings, + imgDirectory, + imgConfirm, + imgCancel, + imgIncrease, + imgDecrease, + imgBack, + imgUp, + imgDown, + imgLeft, + imgRight, + imgRefresh, + imgLeveling, + imgSlider, + imgCount, + noImage = imgCount, + imgPageUp = imgLeft, + imgPageDown = imgRight +}; + +enum colorMode_t : uint8_t { + NOCOLORS = 0x00, + MONOCHROME = 0x01, // 1 bit per pixel + GREYSCALE1 = 0x01, // 1 bit per pixel + GREYSCALE2, // 2 bits per pixel + GREYSCALE4, // 4 bits per pixel + HIGHCOLOR // 16 bits per pixel +}; + +typedef colorMode_t ColorMode; + +typedef struct __attribute__((__packed__)) { + void *data; + uint16_t width; + uint16_t height; + colorMode_t colorMode; +} tImage; + +extern const tImage NoLogo; + +extern const tImage MarlinLogo112x38x1; +extern const tImage MarlinLogo228x255x2; +extern const tImage MarlinLogo228x255x4; +extern const tImage MarlinLogo195x59x16; +extern const tImage MarlinLogo320x240x16; +extern const tImage MarlinLogo480x320x16; +extern const tImage Background320x30x16; + +extern const tImage HotEnd_64x64x4; +extern const tImage Bed_64x64x4; +extern const tImage Bed_Heated_64x64x4; +extern const tImage Chamber_64x64x4; +extern const tImage Chamber_Heated_64x64x4; +extern const tImage Fan0_64x64x4; +extern const tImage Fan1_64x64x4; +extern const tImage Fan_Slow0_64x64x4; +extern const tImage Fan_Slow1_64x64x4; +extern const tImage Fan_Fast0_64x64x4; +extern const tImage Fan_Fast1_64x64x4; +extern const tImage SD_64x64x4; +extern const tImage Menu_64x64x4; +extern const tImage Settings_64x64x4; +extern const tImage Confirm_64x64x4; +extern const tImage Cancel_64x64x4; +extern const tImage Increase_64x64x4; +extern const tImage Decrease_64x64x4; +extern const tImage Pause_64x64x4; + +extern const tImage Feedrate_32x32x4; +extern const tImage Flowrate_32x32x4; +extern const tImage Directory_32x32x4; +extern const tImage Back_32x32x4; +extern const tImage Up_32x32x4; +extern const tImage Down_32x32x4; +extern const tImage Left_32x32x4; +extern const tImage Right_32x32x4; +extern const tImage Refresh_32x32x4; +extern const tImage Leveling_32x32x4; + +extern const tImage Slider8x16x4; + +extern const tImage Images[imgCount]; diff --git a/Marlin/src/lcd/tft/tft_io.h b/Marlin/src/lcd/tft/tft_io.h new file mode 100644 index 0000000000..bffe92b0ff --- /dev/null +++ b/Marlin/src/lcd/tft/tft_io.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT + #include HAL_PATH(../../HAL, tft/tft_spi.h) +#elif HAS_FSMC_TFT + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) +#endif diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp new file mode 100644 index 0000000000..e77afaf716 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_queue.cpp @@ -0,0 +1,346 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_GRAPHICAL_TFT + +#include "tft_queue.h" +#include "tft.h" +#include "tft_image.h" + +uint8_t TFT_Queue::queue[]; +uint8_t *TFT_Queue::end_of_queue = queue; +uint8_t *TFT_Queue::current_task = NULL; +uint8_t *TFT_Queue::last_task = NULL; + +void TFT_Queue::reset() { + tft.abort(); + + end_of_queue = queue; + current_task = NULL; + last_task = NULL; +} + +void TFT_Queue::async() { + if (current_task == NULL) return; + queueTask_t *task = (queueTask_t *)current_task; + + // Check IO busy status + if (tft.is_busy()) return; + + if (task->state == TASK_STATE_COMPLETED) { + task = (queueTask_t *)task->nextTask; + current_task = (uint8_t *)task; + } + + finish_sketch(); + + switch (task->type) { + case TASK_END_OF_QUEUE: reset(); break; + case TASK_FILL: fill(task); break; + case TASK_CANVAS: canvas(task); break; + } +} + +void TFT_Queue::finish_sketch() { + if (last_task == NULL) return; + queueTask_t *task = (queueTask_t *)last_task; + + if (task->state == TASK_STATE_SKETCH) { + *end_of_queue = TASK_END_OF_QUEUE; + task->nextTask = end_of_queue; + task->state = TASK_STATE_READY; + + if (current_task == NULL) current_task = (uint8_t *)task; + } +} + +void TFT_Queue::fill(queueTask_t *task) { + uint16_t count; + parametersFill_t *task_parameters = (parametersFill_t *)(((uint8_t *)task) + sizeof(queueTask_t)); + + if (task->state == TASK_STATE_READY) { + tft.set_window(task_parameters->x, task_parameters->y, task_parameters->x + task_parameters->width - 1, task_parameters->y + task_parameters->height - 1); + task->state = TASK_STATE_IN_PROGRESS; + } + + if (task_parameters->count > 65535) { + count = 65535; + task_parameters->count -= 65535; + } + else { + count = task_parameters->count; + task_parameters->count = 0; + task->state = TASK_STATE_COMPLETED; + } + + tft.write_multiple(task_parameters->color, count); +} + +void TFT_Queue::canvas(queueTask_t *task) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)task) + sizeof(queueTask_t)); + + uint16_t i; + uint8_t *item = ((uint8_t *)task_parameters) + sizeof(parametersCanvas_t); + + if (task->state == TASK_STATE_READY) { + task->state = TASK_STATE_IN_PROGRESS; + Canvas.New(task_parameters->x, task_parameters->y, task_parameters->width, task_parameters->height); + } + Canvas.Continue(); + + for (i = 0; i < task_parameters->count; i++) { + switch (*item) { + case CANVAS_SET_BACKGROUND: + Canvas.SetBackground(((parametersCanvasBackground_t *)item)->color); + item += sizeof(parametersCanvasBackground_t); + break; + case CANVAS_ADD_TEXT: + Canvas.AddText(((parametersCanvasText_t *)item)->x, ((parametersCanvasText_t *)item)->y, ((parametersCanvasText_t *)item)->color, item + sizeof(parametersCanvasText_t), ((parametersCanvasText_t *)item)->maxWidth); + item += sizeof(parametersCanvasText_t) + ((parametersCanvasText_t *)item)->stringLength; + break; + + case CANVAS_ADD_IMAGE: + MarlinImage image; + uint16_t *colors; + colorMode_t color_mode; + + image = ((parametersCanvasImage_t *)item)->image; + colors = (uint16_t *)(item + sizeof(parametersCanvasImage_t)); + Canvas.AddImage(((parametersCanvasImage_t *)item)->x, ((parametersCanvasImage_t *)item)->y, image, colors); + + item = (uint8_t *)colors; + color_mode = Images[image].colorMode; + + switch (color_mode) { + case GREYSCALE1: + item += sizeof(uint16_t); + break; + case GREYSCALE2: + item += sizeof(uint16_t) * 3; + break; + case GREYSCALE4: + item += sizeof(uint16_t) * 15; + break; + default: + break; + } + break; + + case CANVAS_ADD_BAR: + Canvas.AddBar(((parametersCanvasBar_t *)item)->x, ((parametersCanvasBar_t *)item)->y, ((parametersCanvasBar_t *)item)->width, ((parametersCanvasBar_t *)item)->height, ((parametersCanvasBar_t *)item)->color); + item += sizeof(parametersCanvasBar_t); + break; + case CANVAS_ADD_RECTANGLE: + Canvas.AddRectangle(((parametersCanvasRectangle_t *)item)->x, ((parametersCanvasRectangle_t *)item)->y, ((parametersCanvasRectangle_t *)item)->width, ((parametersCanvasRectangle_t *)item)->height, ((parametersCanvasRectangle_t *)item)->color); + item += sizeof(parametersCanvasRectangle_t); + break; + } + } + + if (Canvas.ToScreen()) task->state = TASK_STATE_COMPLETED; +} + + +void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { + finish_sketch(); + + queueTask_t *task = (queueTask_t *)end_of_queue; + last_task = (uint8_t *)task; + + end_of_queue += sizeof(queueTask_t); + parametersFill_t *task_parameters = (parametersFill_t *)end_of_queue; + end_of_queue += sizeof(parametersFill_t); + + task_parameters->x = x; + task_parameters->y = y; + task_parameters->width = width; + task_parameters->height = height; + task_parameters->color = color; + task_parameters->count = width * height; + + *end_of_queue = TASK_END_OF_QUEUE; + task->nextTask = end_of_queue; + task->state = TASK_STATE_READY; + task->type = TASK_FILL; + + if (current_task == NULL) current_task = (uint8_t *)task; +} + +void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { + finish_sketch(); + + queueTask_t *task = (queueTask_t *)end_of_queue; + last_task = (uint8_t *) task; + + task->state = TASK_STATE_SKETCH; + task->type = TASK_CANVAS; + task->nextTask = NULL; + + end_of_queue += sizeof(queueTask_t); + parametersCanvas_t *task_parameters = (parametersCanvas_t *)end_of_queue; + end_of_queue += sizeof(parametersCanvas_t); + + task_parameters->x = x; + task_parameters->y = y; + task_parameters->width = width; + task_parameters->height = height; + task_parameters->count = 0; + + if (current_task == NULL) current_task = (uint8_t *)task; +} + +void TFT_Queue::set_background(uint16_t color) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasBackground_t *parameters = (parametersCanvasBackground_t *)end_of_queue; + + parameters->type = CANVAS_SET_BACKGROUND; + parameters->color = color; + + end_of_queue += sizeof(parametersCanvasBackground_t); + task_parameters->count++; +} + +void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasText_t *parameters = (parametersCanvasText_t *)end_of_queue; + + uint8_t *pointer = string; + + parameters->type = CANVAS_ADD_TEXT; + parameters->x = x; + parameters->y = y; + parameters->color = color; + parameters->stringLength = 0; + parameters->maxWidth = maxWidth; + + end_of_queue += sizeof(parametersCanvasText_t); + + /* TODO: Deal with maxWidth */ + while ((*(end_of_queue++) = *pointer++) != 0x00); + + parameters->stringLength = pointer - string; + task_parameters->count++; +} + +void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasImage_t *parameters = (parametersCanvasImage_t *)end_of_queue; + + parameters->type = CANVAS_ADD_IMAGE; + parameters->x = x; + parameters->y = y; + parameters->image = image; + + end_of_queue += sizeof(parametersCanvasImage_t); + task_parameters->count++; + + colorMode_t color_mode = Images[image].colorMode; + + if (color_mode == HIGHCOLOR) return; + + uint16_t *color = (uint16_t *)end_of_queue; + uint8_t number_of_color = 0; + + switch (color_mode) { + case GREYSCALE1: number_of_color = 1; break; + case GREYSCALE2: number_of_color = 3; break; + case GREYSCALE4: number_of_color = 15; break; + default: + break; + } + + while (number_of_color--) { + *color++ = *colors++; + } + + end_of_queue = (uint8_t *)color; +} + +uint16_t gradient(uint16_t colorA, uint16_t colorB, uint16_t factor) { + uint16_t red, green, blue; + + red = ( RED(colorA) * factor + RED(colorB) * (256 - factor)) >> 8; + green = (GREEN(colorA) * factor + GREEN(colorB) * (256 - factor)) >> 8; + blue = ( BLUE(colorA) * factor + BLUE(colorB) * (256 - factor)) >> 8; + + return RGB(red, green, blue); +} + +void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main, uint16_t color_background, uint16_t color_shadow) { + uint16_t colors[16]; + colorMode_t color_mode = Images[image].colorMode; + uint16_t i; + + switch (color_mode) { + case GREYSCALE1: + colors[1] = color_main; + break; + case GREYSCALE2: + for (i = 1; i < 4; i++) + colors[i] = gradient(color_main, color_background, (i << 8) / 3); + break; + case GREYSCALE4: + for (i = 1; i < 8; i++) + colors[i] = gradient(color_background, color_shadow, i << 5); + for (i = 8; i < 16; i++) + colors[i] = gradient(color_main, color_background, ((i - 8) << 8) / 7); + break; + default: + break; + } + + add_image(x, y, image, colors + 1); +} + +void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasBar_t *parameters = (parametersCanvasBar_t *)end_of_queue; + + parameters->type = CANVAS_ADD_BAR; + parameters->x = x; + parameters->y = y; + parameters->width = width; + parameters->height = height; + parameters->color = color; + + end_of_queue += sizeof(parametersCanvasBar_t); + task_parameters->count++; +} + +void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasRectangle_t *parameters = (parametersCanvasRectangle_t *)end_of_queue; + + parameters->type = CANVAS_ADD_RECTANGLE; + parameters->x = x; + parameters->y = y; + parameters->width = width; + parameters->height = height; + parameters->color = color; + + end_of_queue += sizeof(parametersCanvasRectangle_t); + task_parameters->count++; +} + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_queue.h b/Marlin/src/lcd/tft/tft_queue.h new file mode 100644 index 0000000000..9aa0d5b6c9 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_queue.h @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfig.h" +#include "tft_string.h" +#include "tft_image.h" + +#define QUEUE_SIZE 8192 + +enum QueueTaskType : uint8_t { + TASK_END_OF_QUEUE = 0x00, + TASK_FILL, + TASK_CANVAS, +}; + +enum QueueTaskState : uint8_t { + TASK_STATE_READY = 0x00, + TASK_STATE_IN_PROGRESS, + TASK_STATE_COMPLETED, + TASK_STATE_SKETCH = 0xFF, +}; + +enum CanvasSubtype : uint8_t { + CANVAS_SET_BACKGROUND = 0x00, + CANVAS_ADD_TEXT, + CANVAS_ADD_IMAGE, + CANVAS_ADD_BAR, + CANVAS_ADD_RECTANGLE, +}; + +typedef struct __attribute__((__packed__)) { + QueueTaskType type; + QueueTaskState state; + uint8_t *nextTask; +} queueTask_t; + +typedef struct __attribute__((__packed__)) { + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + uint16_t color; + uint32_t count; +} parametersFill_t; + +typedef struct __attribute__((__packed__)) { + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + uint32_t count; +} parametersCanvas_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + uint16_t color; +} parametersCanvasBackground_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + uint16_t x; + uint16_t y; + uint16_t color; + uint32_t count; + uint16_t maxWidth; + uint16_t stringLength; +} parametersCanvasText_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + int16_t x; + int16_t y; + MarlinImage image; +} parametersCanvasImage_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + uint16_t color; +} parametersCanvasBar_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + uint16_t color; +} parametersCanvasRectangle_t; + +class TFT_Queue { + private: + static uint8_t queue[QUEUE_SIZE]; + static uint8_t *end_of_queue; + static uint8_t *current_task; + static uint8_t *last_task; + + static void finish_sketch(); + static void fill(queueTask_t *task); + static void canvas(queueTask_t *task); + + public: + static void reset(); + static void async(); + static void sync() { while (current_task != NULL) async(); } + + static void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); + static void canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height); + static void set_background(uint16_t color); + static void add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth); + + static void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors); + static void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main, uint16_t color_background, uint16_t color_shadow); + + static void add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); + static void add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); +}; diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp new file mode 100644 index 0000000000..f4e203445d --- /dev/null +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -0,0 +1,159 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_GRAPHICAL_TFT + +#include "tft_string.h" +#include "../fontutils.h" + +//#define DEBUG_TFT_FONT +#define DEBUG_OUT ENABLED(DEBUG_TFT_FONT) +#include "../../core/debug_out.h" + +glyph_t *TFT_String::glyphs[256]; +font_t *TFT_String::font_header; + +uint8_t TFT_String::data[]; +uint16_t TFT_String::span; +uint16_t TFT_String::length; + +void TFT_String::set_font(const uint8_t *font) { + font_header = (font_t *)font; + uint32_t glyph; + + for (glyph = 0; glyph < 256; glyph++) glyphs[glyph] = NULL; + + DEBUG_ECHOLNPAIR("Format: ", font_header->Format); + DEBUG_ECHOLNPAIR("BBXWidth: ", font_header->BBXWidth); + DEBUG_ECHOLNPAIR("BBXHeight: ", font_header->BBXHeight); + DEBUG_ECHOLNPAIR("BBXOffsetX: ", font_header->BBXOffsetX); + DEBUG_ECHOLNPAIR("BBXOffsetY: ", font_header->BBXOffsetY); + DEBUG_ECHOLNPAIR("CapitalAHeight: ", font_header->CapitalAHeight); + DEBUG_ECHOLNPAIR("Encoding65Pos: ", font_header->Encoding65Pos); + DEBUG_ECHOLNPAIR("Encoding97Pos: ", font_header->Encoding97Pos); + DEBUG_ECHOLNPAIR("FontStartEncoding: ", font_header->FontStartEncoding); + DEBUG_ECHOLNPAIR("FontEndEncoding: ", font_header->FontEndEncoding); + DEBUG_ECHOLNPAIR("LowerGDescent: ", font_header->LowerGDescent); + DEBUG_ECHOLNPAIR("FontAscent: ", font_header->FontAscent); + DEBUG_ECHOLNPAIR("FontDescent: ", font_header->FontDescent); + DEBUG_ECHOLNPAIR("FontXAscent: ", font_header->FontXAscent); + DEBUG_ECHOLNPAIR("FontXDescent: ", font_header->FontXDescent); + + add_glyphs(font); +} + +void TFT_String::add_glyphs(const uint8_t *font) { + uint32_t glyph; + uint8_t *pointer = (uint8_t *)font + sizeof(font_t); + + for (glyph = ((font_t *)font)->FontStartEncoding; glyph <= ((font_t *)font)->FontEndEncoding; glyph++) { + if (*pointer != NO_GLYPH) { + glyphs[glyph] = (glyph_t *)pointer; + pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->DataSize; + } + else { + pointer++; + } + } +} + +void TFT_String::set() { + *data = 0x00; + span = 0; + length = 0; +} + +uint8_t read_byte(uint8_t *byte) { return *byte; } + +void TFT_String::add(uint8_t *string, uint8_t index, uint8_t *itemString) { + uint8_t character; + wchar_t wchar; + + while (*string) { + string = get_utf8_value_cb(string, read_byte, &wchar); + if (wchar > 255) + wchar |= 0x0080; + character = (uint8_t) (wchar & 0x00FF); + + if (character == '=' || character == '~' || character == '*') { + if (index >= 0) { + if (character == '*') + add_character('E'); + add_character(index + ((character == '=') ? '0' : LCD_FIRST_TOOL)); + } + else { + add(index == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED)); + } + continue; + } + else if (character == '$' && itemString) { + add(itemString); + continue; + } + + add_character(character); + } + eol(); +} + +void TFT_String::add_character(uint8_t character) { + if (length < MAX_STRING_LENGTH) { + data[length] = character; + length++; + span += glyph(character)->DWidth; + } +} + +void TFT_String::rtrim(uint8_t character) { + while (length) { + if (data[length - 1] == 0x20 || data[length - 1] == character) { + length--; + span -= glyph(data[length])->DWidth; + eol(); + } + else { + break; + } + } +} + +void TFT_String::ltrim(uint8_t character) { + uint16_t i, j; + for (i = 0; (i < length) && (data[i] == 0x20 || data[i] == character); i++) { + span -= glyph(data[i])->DWidth; + } + if (i == 0) return; + for (j = 0; i < length; data[j++] = data[i++]); + length = j; + eol(); +} + +void TFT_String::trim(uint8_t character) { + rtrim(character); + ltrim(character); +} + +TFT_String tft_string; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h new file mode 100644 index 0000000000..b4c94953f7 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_string.h @@ -0,0 +1,104 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +extern const uint8_t ISO10646_1_5x7[]; +extern const uint8_t font10x20[]; + +extern const uint8_t Helvetica12Bold[]; + +extern const uint8_t Helvetica14[], Helvetica14_symbols[]; +extern const uint8_t Helvetica18[], Helvetica18_symbols[]; + +#define NO_GLYPH 0xFF + +typedef struct __attribute__((__packed__)) { + uint8_t Format; + uint8_t BBXWidth; + uint8_t BBXHeight; + int8_t BBXOffsetX; + int8_t BBXOffsetY; + uint8_t CapitalAHeight; + uint16_t Encoding65Pos; + uint16_t Encoding97Pos; + uint8_t FontStartEncoding; + uint8_t FontEndEncoding; + int8_t LowerGDescent; + int8_t FontAscent; + int8_t FontDescent; + int8_t FontXAscent; + int8_t FontXDescent; +} font_t; + +typedef struct __attribute__((__packed__)) { + uint8_t BBXWidth; + uint8_t BBXHeight; + uint8_t DataSize; + int8_t DWidth; + int8_t BBXOffsetX; + int8_t BBXOffsetY; +} glyph_t; + +#define MAX_STRING_LENGTH 64 + +class TFT_String { + private: + static glyph_t *glyphs[256]; + static font_t *font_header; + + static uint8_t data[MAX_STRING_LENGTH + 1]; + static uint16_t span; // in pixels + static uint16_t length; // in characters + + static void add_character(uint8_t character); + static void eol() { data[length] = 0x00; } + + public: + static void set_font(const uint8_t *font); + static void add_glyphs(const uint8_t *font); + + static font_t *font() { return font_header; }; + static uint16_t font_height() { return font_header->FontAscent - font_header->FontDescent; } + static glyph_t *glyph(uint8_t character) { return glyphs[character] == NULL ? glyphs[0x3F] : glyphs[character]; } /* Use '?' for unknown glyphs */ + static inline glyph_t *glyph(uint8_t *character) { return glyph(*character); } + + static void set(); + static void add(uint8_t character) { add_character(character); eol(); } + static void add(uint8_t *string) { while (*string) { add_character(*string++); } eol(); } + static void add(uint8_t *string, uint8_t index, uint8_t *itemString = NULL); + static void set(uint8_t *string) { set(); add(string); }; + static void set(uint8_t *string, uint8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; + static inline void set(const char *string) { set((uint8_t *)string); } + static inline void set(const char *string, uint8_t index, const char *itemString = NULL) { set((uint8_t *)string, index, itemString); } + static inline void add(const char *string) { add((uint8_t *)string); } + + static void trim(uint8_t character = 0x20); + static void rtrim(uint8_t character = 0x20); + static void ltrim(uint8_t character = 0x20); + static uint16_t width() { return span; } + static uint8_t *string() { return data; } + static uint16_t center(uint16_t width) { return span > width ? 0 : (width - span) / 2; } +}; + +extern TFT_String tft_string; diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp new file mode 100644 index 0000000000..3407389f27 --- /dev/null +++ b/Marlin/src/lcd/tft/touch.cpp @@ -0,0 +1,293 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_SCREEN) + +#include "touch.h" +#include "pinconfig.h" + +#include "../ultralcd.h" +#include "../menu/menu.h" +#include "../../module/temperature.h" +#include "../../module/planner.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#include "tft.h" + +int16_t Touch::x, Touch::y; +touch_control_t Touch::controls[]; +touch_control_t *Touch::current_control; +uint16_t Touch::controls_count; +millis_t Touch::now = 0; +millis_t Touch::time_to_hold; +millis_t Touch::repeat_delay; +millis_t Touch::touch_time; +TouchControlType Touch::touch_control_type = NONE; +touch_calibration_t Touch::calibration; +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + calibrationState Touch::calibration_state = CALIBRATION_NONE; + touch_calibration_point_t Touch::calibration_points[4]; +#endif + +void Touch::init() { + calibration_reset(); + reset(); + io.Init(); +} + +void Touch::add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data) { + if (controls_count == MAX_CONTROLS) return; + + controls[controls_count].type = type; + controls[controls_count].x = x; + controls[controls_count].y = y; + controls[controls_count].width = width; + controls[controls_count].height = height; + controls[controls_count].data = data; + controls_count++; +} + +void Touch::idle() { + uint16_t i; + int16_t _x, _y; + + if (now == millis()) return; + now = millis(); + + if (get_point(&_x, &_y)) { + #if LCD_TIMEOUT_TO_STATUS + ui.return_to_status_ms = now + LCD_TIMEOUT_TO_STATUS; + #endif + + if (touch_time) { + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + if (touch_control_type == NONE && ELAPSED(now, touch_time + TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) + ui.goto_screen(touch_screen_calibration); + #endif + return; + } + + if (time_to_hold == 0) time_to_hold = now + MINIMUM_HOLD_TIME; + if (PENDING(now, time_to_hold)) return; + + if (x != 0 && y != 0) { + if (current_control) { + if (WITHIN(x, current_control->x - FREE_MOVE_RANGE, current_control->x + current_control->width + FREE_MOVE_RANGE) && WITHIN(y, current_control->y - FREE_MOVE_RANGE, current_control->y + current_control->height + FREE_MOVE_RANGE)) { + NOLESS(x, current_control->x); + NOMORE(x, current_control->x + current_control->width); + NOLESS(y, current_control->y); + NOMORE(y, current_control->y + current_control->height); + touch(current_control); + } + else { + current_control = NULL; + } + } + else { + for (i = 0; i < controls_count; i++) { + if ((WITHIN(x, controls[i].x, controls[i].x + controls[i].width) && WITHIN(y, controls[i].y, controls[i].y + controls[i].height)) || (TERN(TOUCH_SCREEN_CALIBRATION, controls[i].type == CALIBRATE, false))) { + touch_control_type = controls[i].type; + touch(&controls[i]); + break; + } + } + } + + if (current_control == NULL) + touch_time = now; + } + x = _x; + y = _y; + } + else { + x = y = 0; + current_control = NULL; + touch_time = 0; + touch_control_type = NONE; + time_to_hold = 0; + repeat_delay = TOUCH_REPEAT_DELAY; + } +} + +void Touch::touch(touch_control_t *control) { + switch (control->type) { + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + case CALIBRATE: + ui.refresh(); + + if (calibration_state < CALIBRATION_SUCCESS) { + calibration_points[calibration_state].x = int16_t(control->data >> 16); + calibration_points[calibration_state].y = int16_t(control->data & 0xFFFF); + calibration_points[calibration_state].raw_x = x; + calibration_points[calibration_state].raw_y = y; + } + + switch (calibration_state) { + case CALIBRATION_POINT_1: calibration_state = CALIBRATION_POINT_2; break; + case CALIBRATION_POINT_2: calibration_state = CALIBRATION_POINT_3; break; + case CALIBRATION_POINT_3: calibration_state = CALIBRATION_POINT_4; break; + case CALIBRATION_POINT_4: + if (validate_precision_x(0, 1) && validate_precision_x(2, 3) && validate_precision_y(0, 2) && validate_precision_y(1, 3)) { + calibration_state = CALIBRATION_SUCCESS; + calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_x + calibration_points[2].raw_x - calibration_points[1].raw_x - calibration_points[0].raw_x); + calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_y - calibration_points[2].raw_y + calibration_points[1].raw_y - calibration_points[0].raw_y); + calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_x + calibration_points[1].raw_x) * calibration.x) >> 17); + calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_y + calibration_points[2].raw_y) * calibration.y) >> 17); + calibration.orientation = TOUCH_LANDSCAPE; + } + else if (validate_precision_y(0, 1) && validate_precision_y(2, 3) && validate_precision_x(0, 2) && validate_precision_x(1, 3)) { + calibration_state = CALIBRATION_SUCCESS; + calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_y + calibration_points[2].raw_y - calibration_points[1].raw_y - calibration_points[0].raw_y); + calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_x - calibration_points[2].raw_x + calibration_points[1].raw_x - calibration_points[0].raw_x); + calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_y + calibration_points[1].raw_y) * calibration.x) >> 17); + calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_x + calibration_points[2].raw_x) * calibration.y) >> 17); + calibration.orientation = TOUCH_PORTRAIT; + } + else { + calibration_state = CALIBRATION_FAIL; + calibration_reset(); + } + + if (calibration_state == CALIBRATION_SUCCESS) { + SERIAL_ECHOLN("Touch screen calibration completed"); + SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_X ", calibration.x); + SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_Y ", calibration.y); + SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x); + SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y); + SERIAL_ECHO("TOUCH_ORIENTATION "); if (calibration.orientation == TOUCH_LANDSCAPE) SERIAL_ECHOLN("TOUCH_LANDSCAPE"); else SERIAL_ECHOLN("TOUCH_PORTRAIT"); + } + break; + default: break; + } + break; + #endif // TOUCH_SCREEN_CALIBRATION + + case MENU_SCREEN: ui.goto_screen((screenFunc_t)control->data); break; + case BACK: ui.goto_previous_screen(); break; + case CLICK: ui.lcd_clicked = true; break; + #if HAS_RESUME_CONTINUE + case RESUME_CONTINUE: extern bool wait_for_user; wait_for_user = false; break; + #endif + case CANCEL: ui.encoderPosition = 0; ui.selection = false; ui.lcd_clicked = true; break; + case CONFIRM: ui.encoderPosition = 1; ui.selection = true; ui.lcd_clicked = true; break; + case MENU_ITEM: ui.encoderPosition = control->data; ui.refresh(); break; + case PAGE_UP: + encoderTopLine = encoderTopLine > LCD_HEIGHT ? encoderTopLine - LCD_HEIGHT : 0; + ui.encoderPosition = ui.encoderPosition > LCD_HEIGHT ? ui.encoderPosition - LCD_HEIGHT : 0; + ui.refresh(); + break; + case PAGE_DOWN: + encoderTopLine = encoderTopLine + 2 * LCD_HEIGHT < screen_items ? encoderTopLine + LCD_HEIGHT : screen_items - LCD_HEIGHT; + ui.encoderPosition = ui.encoderPosition + LCD_HEIGHT < (uint32_t)screen_items ? ui.encoderPosition + LCD_HEIGHT : screen_items; + ui.refresh(); + break; + case SLIDER: hold(control); ui.encoderPosition = (x - control->x) * control->data / control->width; break; + case INCREASE: hold(control, repeat_delay - 5); TERN(AUTO_BED_LEVELING_UBL, ui.external_control ? ubl.encoder_diff++ : ui.encoderPosition++, ui.encoderPosition++); break; + case DECREASE: hold(control, repeat_delay - 5); TERN(AUTO_BED_LEVELING_UBL, ui.external_control ? ubl.encoder_diff-- : ui.encoderPosition--, ui.encoderPosition--); break; + case HEATER: + int8_t heater; + heater = control->data; + ui.clear_lcd(); + if (heater >= 0) { // HotEnd + #if HOTENDS == 1 + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.heater_maxtemp[0] - 15, []{ thermalManager.start_watching_hotend(0); }); + #else + MenuItemBase::itemIndex = heater; + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.heater_maxtemp[heater] - 15, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + #endif + } + #if HAS_HEATED_BED + else if (heater == H_BED) { + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); + } + #endif + #if HAS_HEATED_CHAMBER + else if (heater == H_CHAMBER) { + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); + } + #endif + break; + case FAN: + ui.clear_lcd(); + static uint8_t fan, fan_speed; + fan = 0; + fan_speed = thermalManager.fan_speed[fan]; + MenuItem_percent::action((const char *)GET_TEXT_F(MSG_FIRST_FAN_SPEED), &fan_speed, 0, 255, []{ thermalManager.set_fan_speed(fan, fan_speed); }); + break; + case FEEDRATE: + ui.clear_lcd(); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_SPEED), &feedrate_percentage, 10, 999); + break; + case FLOWRATE: + ui.clear_lcd(); + MenuItemBase::itemIndex = control->data; + #if EXTRUDERS == 1 + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_FLOW), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); + #else + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_FLOW_N), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); + #endif + break; + + #if ENABLED(AUTO_BED_LEVELING_UBL) + case UBL: hold(control, UBL_REPEAT_DELAY); ui.encoderPosition += control->data; break; + #endif + + default: break; + } +} + +void Touch::hold(touch_control_t *control, millis_t delay) { + current_control = control; + if (delay) { + repeat_delay = delay > MIN_REPEAT_DELAY ? delay : MIN_REPEAT_DELAY; + time_to_hold = now + repeat_delay; + } + ui.refresh(); +} + +bool Touch::get_point(int16_t *x, int16_t *y) { + bool is_touched = (calibration.orientation == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); + + if (is_touched && calibration.orientation != TOUCH_ORIENTATION_NONE) { + *x = int16_t((int32_t(*x) * calibration.x) >> 16) + calibration.offset_x; + *y = int16_t((int32_t(*y) * calibration.y) >> 16) + calibration.offset_y; + } + return is_touched; +} +Touch touch; + +bool MarlinUI::touch_pressed() { + return touch.is_clicked(); +} + +void add_control(uint16_t x, uint16_t y, TouchControlType control_type, int32_t data, MarlinImage image, bool is_enabled, uint16_t color_enabled, uint16_t color_disabled) { + uint16_t width = Images[image].width; + uint16_t height = Images[image].height; + tft.canvas(x, y, width, height); + tft.add_image(0, 0, image, is_enabled ? color_enabled : color_disabled); + if (is_enabled) + touch.add_control(control_type, x, y, width, height, data); +} + +#endif // TOUCH_SCREEN diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h new file mode 100644 index 0000000000..f3e53ae461 --- /dev/null +++ b/Marlin/src/lcd/tft/touch.h @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(TOUCH_SCREEN) + +#include "tft_color.h" +#include "tft_image.h" + +#include HAL_PATH(../../HAL, tft/xpt2046.h) +#define TOUCH_DRIVER XPT2046 + +#ifndef TOUCH_SCREEN_CALIBRATION_PRECISION + #define TOUCH_SCREEN_CALIBRATION_PRECISION 80 +#endif + +#ifndef TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS + #define TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS 2500 +#endif + +#define TOUCH_ORIENTATION_NONE 0 +#define TOUCH_LANDSCAPE 1 +#define TOUCH_PORTRAIT 2 + +#if !(defined(TOUCH_CALIBRATION_X) || defined(TOUCH_CALIBRATION_Y) || defined(TOUCH_OFFSET_X) || defined(TOUCH_OFFSET_Y) || defined(TOUCH_ORIENTATION)) + #if defined(XPT2046_X_CALIBRATION) && defined(XPT2046_Y_CALIBRATION) && defined(XPT2046_X_OFFSET) && defined(XPT2046_Y_OFFSET) + #define TOUCH_CALIBRATION_X XPT2046_X_CALIBRATION + #define TOUCH_CALIBRATION_Y XPT2046_Y_CALIBRATION + #define TOUCH_OFFSET_X XPT2046_X_OFFSET + #define TOUCH_OFFSET_Y XPT2046_Y_OFFSET + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE + #else + #define TOUCH_CALIBRATION_X 0 + #define TOUCH_CALIBRATION_Y 0 + #define TOUCH_OFFSET_X 0 + #define TOUCH_OFFSET_Y 0 + #define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE + #endif +#endif + +// Menu Navigation +extern int8_t encoderTopLine, encoderLine, screen_items; + +enum TouchControlType : uint16_t { + NONE = 0x0000, + CALIBRATE, + MENU_SCREEN, + MENU_ITEM, + BACK, + PAGE_UP, + PAGE_DOWN, + CLICK, + RESUME_CONTINUE, + SLIDER, + INCREASE, + DECREASE, + CANCEL, + CONFIRM, + HEATER, + FAN, + FEEDRATE, + FLOWRATE, + UBL, +}; + +typedef void (*screenFunc_t)(); + +void add_control(uint16_t x, uint16_t y, TouchControlType control_type, int32_t data, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED); +inline void add_control(uint16_t x, uint16_t y, TouchControlType control_type, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, control_type, 0, image, is_enabled, color_enabled, color_disabled); } +inline void add_control(uint16_t x, uint16_t y, screenFunc_t screen, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, MENU_SCREEN, (int32_t)screen, image, is_enabled, color_enabled, color_disabled); } + +typedef struct __attribute__((__packed__)) { + TouchControlType type; + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + int32_t data; +} touch_control_t; + +typedef struct __attribute__((__packed__)) { + int32_t x; + int32_t y; + int16_t offset_x; + int16_t offset_y; + uint8_t orientation; +} touch_calibration_t; + +typedef struct __attribute__((__packed__)) { + uint16_t x; + uint16_t y; + int16_t raw_x; + int16_t raw_y; +} touch_calibration_point_t; + +enum calibrationState : uint8_t { + CALIBRATION_POINT_1 = 0x00, + CALIBRATION_POINT_2, + CALIBRATION_POINT_3, + CALIBRATION_POINT_4, + CALIBRATION_SUCCESS, + CALIBRATION_FAIL, + CALIBRATION_NONE, +}; + +#define MAX_CONTROLS 16 +#define MINIMUM_HOLD_TIME 15 +#define TOUCH_REPEAT_DELAY 75 +#define MIN_REPEAT_DELAY 25 +#define UBL_REPEAT_DELAY 125 +#define FREE_MOVE_RANGE 32 + +class Touch { + private: + static TOUCH_DRIVER io; + static int16_t x, y; + + static touch_control_t controls[MAX_CONTROLS]; + static touch_control_t *current_control; + static uint16_t controls_count; + + static millis_t now; + static millis_t time_to_hold; + static millis_t repeat_delay; + static millis_t touch_time; + static TouchControlType touch_control_type; + + static inline bool get_point(int16_t *x, int16_t *y); + static void touch(touch_control_t *control); + static void hold(touch_control_t *control, millis_t delay = 0); + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static calibrationState calibration_state; + static touch_calibration_point_t calibration_points[4]; + + static bool validate_precision(int32_t a, int32_t b) { return (a > b ? (100 * b) / a : (100 * a) / b) > TOUCH_SCREEN_CALIBRATION_PRECISION; } + static bool validate_precision_x(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_x, calibration_points[b].raw_x); } + static bool validate_precision_y(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_y, calibration_points[b].raw_y); } + #endif // TOUCH_SCREEN_CALIBRATION + + public: + static void init(); + static void reset() { controls_count = 0; touch_time = -1; current_control = NULL; } + static void clear() { controls_count = 0; } + static void idle(); + static bool is_clicked() { return touch_control_type == CLICK; } + + static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data = 0); + + static touch_calibration_t calibration; + static void calibration_reset() { calibration = {TOUCH_CALIBRATION_X, TOUCH_CALIBRATION_Y, TOUCH_OFFSET_X, TOUCH_OFFSET_Y, TOUCH_ORIENTATION}; } + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static calibrationState calibration_start() { calibration = {0, 0, 0, 0, TOUCH_ORIENTATION_NONE}; return calibration_state = CALIBRATION_POINT_1; } + static void calibration_end() { calibration_state = CALIBRATION_NONE; } + static calibrationState get_calibration_state() { return calibration_state; } + #endif // TOUCH_SCREEN_CALIBRATION +}; + +extern Touch touch; + +#endif // TOUCH_SCREEN diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp new file mode 100644 index 0000000000..0b800abc39 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -0,0 +1,653 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_UI_320x240 + +#include "ui_320x240.h" + +#include "../ultralcd.h" +#include "../menu/menu.h" +#include "../../libs/numtostr.h" + +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/printcounter.h" +#include "../../module/planner.h" +#include "../../module/motion.h" + +#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + #include "../../feature/filwidth.h" + #include "../../gcode/parser.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if !HAS_LCD_MENU + #error "Seriously? High resolution TFT screen without menu?" +#endif + +static bool draw_menu_navigation = false; + +void MarlinUI::tft_idle() { + #if ENABLED(TOUCH_SCREEN) + if (draw_menu_navigation) { + add_control(48, 206, PAGE_UP, imgPageUp, encoderTopLine > 0); + add_control(240, 206, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); + add_control(144, 206, BACK, imgBack); + draw_menu_navigation = false; + } + #endif + + tft.queue.async(); + TERN_(TOUCH_SCREEN, touch.idle()); +} + +void MarlinUI::init_lcd() { + tft.init(); + tft.set_font(MENU_FONT_NAME); + #ifdef SYMBOLS_FONT_NAME + tft.add_glyphs(SYMBOLS_FONT_NAME); + #endif + TERN_(TOUCH_SCREEN, touch.init()); + clear_lcd(); +} + +bool MarlinUI::detected() { return true; } + +void MarlinUI::clear_lcd() { + #if ENABLED(TOUCH_SCREEN) + touch.reset(); + draw_menu_navigation = false; + #endif + + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); +} + +#if ENABLED(SHOW_BOOTSCREEN) + #ifndef BOOTSCREEN_TIMEOUT + #define BOOTSCREEN_TIMEOUT 1500 + #endif + + void MarlinUI::show_bootscreen() { + tft.queue.reset(); + + tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); + tft.add_image(0, 0, imgBootScreen); // MarlinLogo320x240x16 + + #ifdef WEBSITE_URL + tft.add_text(4, 188, COLOR_WEBSITE_URL, WEBSITE_URL); + #endif + + tft.queue.sync(); + safe_delay(BOOTSCREEN_TIMEOUT); + clear_lcd(); + } +#endif // SHOW_BOOTSCREEN + +void MarlinUI::draw_kill_screen() { + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_KILL_SCREEN_BG); + + tft.canvas(0, 60, TFT_WIDTH, 20); + tft.set_background(COLOR_KILL_SCREEN_BG); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); + + tft.canvas(0, 120, TFT_WIDTH, 20); + tft.set_background(COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_HALTED)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); + + tft.canvas(0, 160, TFT_WIDTH, 20); + tft.set_background(COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_PLEASE_RESET)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); + + tft.queue.sync(); +} + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { + MarlinImage image = imgHotEnd; + uint16_t Color; + float currentTemperature, targetTemperature; + + if (Heater >= 0) { // HotEnd + currentTemperature = thermalManager.degHotend(Heater); + targetTemperature = thermalManager.degTargetHotend(Heater); + } +#if HAS_HEATED_BED + else if (Heater == H_BED) { + currentTemperature = thermalManager.degBed(); + targetTemperature = thermalManager.degTargetBed(); + } +#endif // HAS_HEATED_BED +#if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + currentTemperature = thermalManager.degChamber(); + #if HAS_HEATED_CHAMBER + targetTemperature = thermalManager.degTargetChamber(); + #else + targetTemperature = ABSOLUTE_ZERO; + #endif + } +#endif // HAS_TEMP_CHAMBER + else return; + + TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 64, 100, Heater)); + tft.canvas(x, y, 64, 100); + tft.set_background(COLOR_BACKGROUND); + + Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; + + if (Heater >= 0) { // HotEnd + if (currentTemperature >= 50) Color = COLOR_HOTEND; + } + #if HAS_HEATED_BED + else if (Heater == H_BED) { + if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + image = targetTemperature > 0 ? imgBedHeated : imgBed; + } + #endif // HAS_HEATED_BED + #if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + if (currentTemperature >= 50) Color = COLOR_CHAMBER; + image = targetTemperature > 0 ? imgChamberHeated : imgChamber; + } + #endif // HAS_TEMP_CHAMBER + + tft.add_image(0, 18, image, Color); + + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(64) + 2, 72, Color, tft_string); + + if (targetTemperature >= 0) { + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(64) + 2, 8, Color, tft_string); + + } +} + +void draw_fan_status(uint16_t x, uint16_t y, const bool blink) { + TERN_(TOUCH_SCREEN, touch.add_control(FAN, x, y, 64, 100)); + tft.canvas(x, y, 64, 100); + tft.set_background(COLOR_BACKGROUND); + + uint8_t fanSpeed = thermalManager.fan_speed[0]; + MarlinImage image; + + if (fanSpeed >= 127) + image = blink ? imgFanFast1 : imgFanFast0; + else if (fanSpeed > 0) + image = blink ? imgFanSlow1 : imgFanSlow0; + else + image = imgFanIdle; + + tft.add_image(0, 10, image, COLOR_FAN); + + tft_string.set((uint8_t *)ui8tostr4pctrj(thermalManager.fan_speed[0])); + tft_string.trim(); + tft.add_text(tft_string.center(64) + 6, 72, COLOR_FAN, tft_string); +} + +void MarlinUI::draw_status_screen() { + const bool blink = get_blink(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + // heaters and fan + uint16_t i, x, y = POS_Y; + + for (i = 0 ; i < ITEMS_COUNT; i++) { + x = (320 / ITEMS_COUNT - 64) / 2 + (320 * i / ITEMS_COUNT); + switch (i) { + #ifdef ITEM_E0 + case ITEM_E0: draw_heater_status(x, y, H_E0); break; + #endif + #ifdef ITEM_E1 + case ITEM_E1: draw_heater_status(x, y, H_E1); break; + #endif + #ifdef ITEM_E2 + case ITEM_E2: draw_heater_status(x, y, H_E2); break; + #endif + #ifdef ITEM_BED + case ITEM_BED: draw_heater_status(x, y, H_BED); break; + #endif + #ifdef ITEM_CHAMBER + case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; + #endif + #ifdef ITEM_FAN + case ITEM_FAN: draw_fan_status(x, y, blink); break; + #endif + } + } + + // coordinates + tft.canvas(4, 103, 312, 24); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, 312, 24, COLOR_AXIS_HOMED); + + uint16_t color; + uint16_t offset; + bool is_homed; + + tft.add_text( 10, 3, COLOR_AXIS_HOMED , "X"); + tft.add_text(127, 3, COLOR_AXIS_HOMED , "Y"); + tft.add_text(219, 3, COLOR_AXIS_HOMED , "Z"); + + is_homed = TEST(axis_homed, X_AXIS); + tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft.add_text( 68 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + is_homed = TEST(axis_homed, Y_AXIS); + tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text(185 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + is_homed = TEST(axis_homed, Z_AXIS); + if (blink & !is_homed) { + tft_string.set("?"); + offset = 25; // ".00" + } + else { + const float z = LOGICAL_Z_POSITION(current_position.z); + tft_string.set(ftostr52sp((int16_t)z)); + tft_string.rtrim(); + offset = tft_string.width(); + + tft_string.set(ftostr52sp(z)); + offset += 25 - tft_string.width(); + } + tft.add_text(301 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + // feed rate + tft.canvas(70, 136, 80, 32); + tft.set_background(COLOR_BACKGROUND); + color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFeedRate, color); + tft_string.set(i16tostr3rj(feedrate_percentage)); + tft_string.add('%'); + tft.add_text(32, 6, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 70, 136, 80, 32)); + + // flow rate + tft.canvas(170, 136, 80, 32); + tft.set_background(COLOR_BACKGROUND); + color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFlowRate, color); + tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); + tft_string.add('%'); + tft.add_text(32, 6, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 170, 136, 80, 32, active_extruder)); + + // print duration + char buffer[14]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toDigital(buffer); + + tft.canvas(96, 176, 128, 20); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(buffer); + tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); + + // progress bar + const uint8_t progress = ui.get_progress_percent(); + tft.canvas(4, 198, 312, 9); + tft.set_background(COLOR_PROGRESS_BG); + tft.add_rectangle(0, 0, 312, 9, COLOR_PROGRESS_FRAME); + if (progress) + tft.add_bar(1, 1, (310 * progress) / 100, 7, COLOR_PROGRESS_BAR); + + // status message + tft.canvas(0, 216, 320, 20); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); + + #if ENABLED(TOUCH_SCREEN) + add_control(256, 130, menu_main, imgSettings); + TERN_(SDSUPPORT, add_control(0, 130, menu_media, imgSD, card.isMounted() && !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + #endif +} + +// Draw a static item with no left-right margin required. Centered by default. +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + menu_item(row); + tft_string.set(pstr, itemIndex, itemString); + if (valstr) + tft_string.add(valstr); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); +} + +// Draw a generic menu item with pre_char (if selected) and post_char +void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { + menu_item(row, sel); + + uint8_t *string = (uint8_t *)pstr; + MarlinImage image = noImage; + switch (*string) { + case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH + case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER + } + + uint8_t offset = MENU_TEXT_X_OFFSET; + if (image != noImage) { + string++; + offset = 32; + tft.add_image(0, 0, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + } + + tft_string.set(string, itemIndex, itemString); + tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); +} + +// Draw a menu item with a (potentially) editable value +void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + menu_item(row, sel); + + tft_string.set(pstr, itemIndex, itemString); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + if (data) { + tft_string.set(data); + tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } +} + +// Low-level draw_edit_screen can be used to draw an edit screen from anyplace +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + ui.encoder_direction_normal(); + TERN_(TOUCH_SCREEN, touch.clear()); + + uint16_t line = 1; + + menu_line(line++); + tft_string.set(pstr, itemIndex, itemString); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + + TERN_(AUTO_BED_LEVELING_UBL, if (ui.external_control) line++); // ftostr52() will overwrite *value so *value has to be displayed first + + menu_line(line); + tft_string.set(value); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + if (ui.external_control) { + menu_line(line - 1); + + tft_string.set(X_LBL); + tft.add_text(52, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.x))); + tft_string.trim(); + tft.add_text(144 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft_string.set(Y_LBL); + tft.add_text(176, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.y))); + tft_string.trim(); + tft.add_text(268 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } + #endif + + extern screenFunc_t _manual_move_func_ptr; + if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { + + #define SLIDER_LENGHT 224 + #define SLIDER_Y_POSITION 140 + + tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); + tft.set_background(COLOR_BACKGROUND); + + int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; + tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); + tft.add_bar(1, 6, position, 4, COLOR_SLIDER); + tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); + tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); + + #if ENABLED(TOUCH_SCREEN) + tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); + touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); + #endif + } + + #if ENABLED(TOUCH_SCREEN) + add_control(32, 176, DECREASE, imgDecrease); + add_control(224, 176, INCREASE, imgIncrease); + add_control(128, 176, CLICK, imgConfirm); + #endif +} + +// The Select Screen presents a prompt and two "buttons" +void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { + uint16_t line = 1; + + if (string == NULL) line++; + + menu_line(line++); + tft_string.set(pref); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + + if (string) { + menu_line(line++); + tft_string.set(string); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + } + + if (suff) { + menu_line(line); + tft_string.set(suff); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + } + #if ENABLED(TOUCH_SCREEN) + add_control(48, 176, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + add_control(208, 176, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + #endif +} + +#if ENABLED(SDSUPPORT) + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + menu_item(row, sel); + if (isDir) + tft.add_image(0, 0, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + tft.add_text(32, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); + } +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + touch.add_control(RESUME_CONTINUE , 0, 0, 320, 240); + #endif + + menu_line(row); + tft_string.set(GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE)); + tft_string.add('E'); + tft_string.add((char)('1' + extruder)); + tft_string.add(' '); + tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.add(" / "); + tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + } +#endif // ADVANCED_PAUSE_FEATURE + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #define GRID_OFFSET_X 8 + #define GRID_OFFSET_Y 8 + #define GRID_WIDTH 144 + #define GRID_HEIGHT 144 + #define CONTROL_OFFSET 8 + + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + + tft.canvas(GRID_OFFSET_X, GRID_OFFSET_Y, GRID_WIDTH, GRID_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); + + for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) + for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + + const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, + lpos = pos.asLogical(); + + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2 - 32, 96, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(X_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.x)); + tft_string.trim(); + tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2, 96, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Y_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.y)); + tft_string.trim(); + tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2 + 32, 96, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Z_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.trim(); + tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 32) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 1, 32, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(x_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(32), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + (GRID_HEIGHT - 27) / 2, 32, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(y_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(32), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); + add_control(224, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); + add_control(144, 206, BACK, imgBack); + #endif + } +#endif // AUTO_BED_LEVELING_UBL + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + void MarlinUI::touch_calibration() { + static uint16_t x, y; + + calibrationState calibration_stage = touch.get_calibration_state(); + + if (calibration_stage == CALIBRATION_NONE) { + defer_status_screen(true); + clear_lcd(); + calibration_stage = touch.calibration_start(); + } + else { + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + } + + x = 20; y = 20; + touch.clear(); + + if (calibration_stage < CALIBRATION_SUCCESS) { + switch(calibration_stage) { + case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; + case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; + case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; + case CALIBRATION_POINT_4: x = TFT_WIDTH - 21; y = TFT_HEIGHT - 21; tft_string.set("Bottom Right"); break; + default: break; + } + + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); + tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); + + touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); + } + else { + tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? "Calibration Completed" : "Calibration Failed"); + defer_status_screen(false); + touch.calibration_end(); + touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); + } + + tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } +#endif // TOUCH_SCREEN_CALIBRATION + +void menu_line(const uint8_t row, uint16_t color) { + tft.canvas(0, 2 + 34 * row, TFT_WIDTH, 32); + tft.set_background(color); +} + +void menu_pause_option(); + +void menu_item(const uint8_t row, bool sel ) { + #if ENABLED(TOUCH_SCREEN) + if (row == 0) { + touch.clear(); + draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); + } + #endif + + menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 2 + 34 * row, 320, 32, encoderTopLine + row)); +} + +#endif // HAS_UI_320x240 diff --git a/Marlin/src/lcd/tft/ui_320x240.h b/Marlin/src/lcd/tft/ui_320x240.h new file mode 100644 index 0000000000..ed69acbcd2 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_320x240.h @@ -0,0 +1,106 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#include "tft.h" +#include "tft_image.h" + +#if ENABLED(TOUCH_SCREEN) + #include "touch.h" +#endif + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); +void draw_fan_status(uint16_t x, uint16_t y, const bool blink); + +#define MENU_TEXT_X_OFFSET 10 +#define MENU_TEXT_Y_OFFSET 7 +void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); +void menu_item(const uint8_t row, bool sel = false); + +#define MENU_FONT_NAME Helvetica14 +#define SYMBOLS_FONT_NAME Helvetica14_symbols + +#define ABSOLUTE_ZERO -273.15 + +const tImage Images[imgCount] = { + MarlinLogo320x240x16, + HotEnd_64x64x4, + Bed_64x64x4, + Bed_Heated_64x64x4, + Chamber_64x64x4, + Chamber_Heated_64x64x4, + Fan0_64x64x4, + Fan_Slow0_64x64x4, + Fan_Slow1_64x64x4, + Fan_Fast0_64x64x4, + Fan_Fast1_64x64x4, + Feedrate_32x32x4, + Flowrate_32x32x4, + SD_64x64x4, + Menu_64x64x4, + Settings_64x64x4, + Directory_32x32x4, + Confirm_64x64x4, + Cancel_64x64x4, + Increase_64x64x4, + Decrease_64x64x4, + Back_32x32x4, + Up_32x32x4, + Down_32x32x4, + Left_32x32x4, + Right_32x32x4, + Refresh_32x32x4, + Leveling_32x32x4, + Slider8x16x4, +}; + +#if HAS_TEMP_CHAMBER && HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_CHAMBER 3 + #define ITEM_FAN 4 + #define ITEMS_COUNT 5 + #define POS_Y 0 +#elif HAS_TEMP_CHAMBER + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_CHAMBER 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 + #define POS_Y 0 +#elif HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 + #define POS_Y 0 +#else + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_FAN 2 + #define ITEMS_COUNT 3 + #define POS_Y 0 +#endif diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp new file mode 100644 index 0000000000..3eeed903cb --- /dev/null +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -0,0 +1,657 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_UI_480x320 + +#include "ui_480x320.h" + +#include "../ultralcd.h" +#include "../menu/menu.h" +#include "../../libs/numtostr.h" + +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/printcounter.h" +#include "../../module/planner.h" +#include "../../module/motion.h" + +#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + #include "../../feature/filwidth.h" + #include "../../gcode/parser.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if !HAS_LCD_MENU + #error "Seriously? High resolution TFT screen without menu?" +#endif + +static bool draw_menu_navigation = false; + +void MarlinUI::tft_idle() { + #if ENABLED(TOUCH_SCREEN) + if (draw_menu_navigation) { + add_control(104, 286, PAGE_UP, imgPageUp, encoderTopLine > 0); + add_control(344, 286, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); + add_control(224, 286, BACK, imgBack); + draw_menu_navigation = false; + } + #endif + + tft.queue.async(); + TERN_(TOUCH_SCREEN, touch.idle()); +} + +void MarlinUI::init_lcd() { + tft.init(); + tft.set_font(MENU_FONT_NAME); + #ifdef SYMBOLS_FONT_NAME + tft.add_glyphs(SYMBOLS_FONT_NAME); + #endif + TERN_(TOUCH_SCREEN, touch.init()); + clear_lcd(); +} + +bool MarlinUI::detected() { return true; } + +void MarlinUI::clear_lcd() { + #if ENABLED(TOUCH_SCREEN) + touch.reset(); + draw_menu_navigation = false; + #endif + + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); +} + +#if ENABLED(SHOW_BOOTSCREEN) + #ifndef BOOTSCREEN_TIMEOUT + #define BOOTSCREEN_TIMEOUT 1500 + #endif + + #undef BOOTSCREEN_TIMEOUT + #define BOOTSCREEN_TIMEOUT 5000 + + void MarlinUI::show_bootscreen() { + tft.queue.reset(); + + tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(142, 130, imgBootScreen); // MarlinLogo195x59x16 + + #ifdef WEBSITE_URL + tft.add_text(8, 250, COLOR_WEBSITE_URL, WEBSITE_URL); + #endif + + tft.queue.sync(); + safe_delay(BOOTSCREEN_TIMEOUT); + clear_lcd(); + } +#endif // SHOW_BOOTSCREEN + +void MarlinUI::draw_kill_screen() { + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_KILL_SCREEN_BG); + + uint16_t line = 2; + + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + line++; + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_HALTED)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_PLEASE_RESET)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + tft.queue.sync(); +} + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { + MarlinImage image = imgHotEnd; + uint16_t Color; + float currentTemperature, targetTemperature; + + if (Heater >= 0) { // HotEnd + currentTemperature = thermalManager.degHotend(Heater); + targetTemperature = thermalManager.degTargetHotend(Heater); + } +#if HAS_HEATED_BED + else if (Heater == H_BED) { + currentTemperature = thermalManager.degBed(); + targetTemperature = thermalManager.degTargetBed(); + } +#endif // HAS_HEATED_BED +#if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + currentTemperature = thermalManager.degChamber(); + #if HAS_HEATED_CHAMBER + targetTemperature = thermalManager.degTargetChamber(); + #else + targetTemperature = ABSOLUTE_ZERO; + #endif + } +#endif // HAS_TEMP_CHAMBER + else return; + + TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, Heater)); + tft.canvas(x, y, 80, 120); + tft.set_background(COLOR_BACKGROUND); + + Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; + + if (Heater >= 0) { // HotEnd + if (currentTemperature >= 50) Color = COLOR_HOTEND; + } + #if HAS_HEATED_BED + else if (Heater == H_BED) { + if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + image = targetTemperature > 0 ? imgBedHeated : imgBed; + } + #endif // HAS_HEATED_BED + #if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + if (currentTemperature >= 50) Color = COLOR_CHAMBER; + image = targetTemperature > 0 ? imgChamberHeated : imgChamber; + } + #endif // HAS_TEMP_CHAMBER + + tft.add_image(8, 28, image, Color); + + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 2, 82, Color, tft_string); + + if (targetTemperature >= 0) { + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 2, 8, Color, tft_string); + } +} + +void draw_fan_status(uint16_t x, uint16_t y, const bool blink) { + TERN_(TOUCH_SCREEN, touch.add_control(FAN, x, y, 80, 120)); + tft.canvas(x, y, 80, 120); + tft.set_background(COLOR_BACKGROUND); + + uint8_t fanSpeed = thermalManager.fan_speed[0]; + MarlinImage image; + + if (fanSpeed >= 127) + image = blink ? imgFanFast1 : imgFanFast0; + else if (fanSpeed > 0) + image = blink ? imgFanSlow1 : imgFanSlow0; + else + image = imgFanIdle; + + tft.add_image(8, 20, image, COLOR_FAN); + + tft_string.set((uint8_t *)ui8tostr4pctrj(thermalManager.fan_speed[0])); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 6, 82, COLOR_FAN, tft_string); +} + +void MarlinUI::draw_status_screen() { + const bool blink = get_blink(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + // heaters and fan + uint16_t i, x, y = POS_Y; + + for (i = 0 ; i < ITEMS_COUNT; i++) { + x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); + switch (i) { + #ifdef ITEM_E0 + case ITEM_E0: draw_heater_status(x, y, H_E0); break; + #endif + #ifdef ITEM_E1 + case ITEM_E1: draw_heater_status(x, y, H_E1); break; + #endif + #ifdef ITEM_E2 + case ITEM_E2: draw_heater_status(x, y, H_E2); break; + #endif + #ifdef ITEM_BED + case ITEM_BED: draw_heater_status(x, y, H_BED); break; + #endif + #ifdef ITEM_CHAMBER + case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; + #endif + #ifdef ITEM_FAN + case ITEM_FAN: draw_fan_status(x, y, blink); break; + #endif + } + } + + // coordinates + tft.canvas(4, 132, TFT_WIDTH - 8, 34); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, TFT_WIDTH - 8, 34, COLOR_AXIS_HOMED); + + uint16_t color; + uint16_t offset; + bool is_homed; + + tft.add_text( 16, 3, COLOR_AXIS_HOMED , "X"); + tft.add_text(192, 3, COLOR_AXIS_HOMED , "Y"); + tft.add_text(330, 3, COLOR_AXIS_HOMED , "Z"); + + is_homed = TEST(axis_homed, X_AXIS); + tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft.add_text(102 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + is_homed = TEST(axis_homed, Y_AXIS); + tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text(280 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + is_homed = TEST(axis_homed, Z_AXIS); + if (blink & !is_homed) { + tft_string.set("?"); + offset = 32; // ".00" + } + else { + const float z = LOGICAL_Z_POSITION(current_position.z); + tft_string.set(ftostr52sp((int16_t)z)); + tft_string.rtrim(); + offset = tft_string.width(); + + tft_string.set(ftostr52sp(z)); + offset += 32 - tft_string.width(); + } + tft.add_text(455 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + // feed rate + tft.canvas(96, 180, 100, 32); + tft.set_background(COLOR_BACKGROUND); + color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFeedRate, color); + tft_string.set(i16tostr3rj(feedrate_percentage)); + tft_string.add('%'); + tft.add_text(36, 1, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 96, 176, 100, 32)); + + // flow rate + tft.canvas(284, 180, 100, 32); + tft.set_background(COLOR_BACKGROUND); + color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFlowRate, color); + tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); + tft_string.add('%'); + tft.add_text(36, 1, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 284, 176, 100, 32, active_extruder)); + + // print duration + char buffer[14]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toDigital(buffer); + + tft.canvas((TFT_WIDTH - 128) / 2, 224, 128, 29); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(buffer); + tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); + + // progress bar + const uint8_t progress = ui.get_progress_percent(); + tft.canvas(4, 260, TFT_WIDTH - 8, 9); + tft.set_background(COLOR_PROGRESS_BG); + tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME); + if (progress) + tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR); + + // status message + tft.canvas(0, 280, TFT_WIDTH, 29); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); + + + #if ENABLED(TOUCH_SCREEN) + add_control(404, 180, menu_main, imgSettings); + TERN_(SDSUPPORT, add_control(12, 180, menu_media, imgSD, card.isMounted() && !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + #endif +} + +// Draw a static item with no left-right margin required. Centered by default. +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + menu_item(row); + tft_string.set(pstr, itemIndex, itemString); + if (valstr) + tft_string.add(valstr); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); +} + +// Draw a generic menu item with pre_char (if selected) and post_char +void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { + menu_item(row, sel); + + uint8_t *string = (uint8_t *)pstr; + MarlinImage image = noImage; + switch (*string) { + case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH + case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER + } + + uint8_t offset = MENU_TEXT_X_OFFSET; + if (image != noImage) { + string++; + offset = 42; + tft.add_image(5, 5, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + } + + tft_string.set(string, itemIndex, itemString); + tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); +} + +// Draw a menu item with a (potentially) editable value +void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + menu_item(row, sel); + + tft_string.set(pstr, itemIndex, itemString); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + if (data) { + tft_string.set(data); + tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } +} + +// Low-level draw_edit_screen can be used to draw an edit screen from anyplace +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + ui.encoder_direction_normal(); + TERN_(TOUCH_SCREEN, touch.clear()); + + uint16_t line = 1; + + menu_line(line++); + tft_string.set(pstr, itemIndex, itemString); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + + TERN_(AUTO_BED_LEVELING_UBL, if (ui.external_control) line++); // ftostr52() will overwrite *value so *value has to be displayed first + + menu_line(line); + tft_string.set(value); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + if (ui.external_control) { + menu_line(line - 1); + + tft_string.set(X_LBL); + tft.add_text((TFT_WIDTH / 2 - 120), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.x))); + tft_string.trim(); + tft.add_text((TFT_WIDTH / 2 - 16) - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft_string.set(Y_LBL); + tft.add_text((TFT_WIDTH / 2 + 16), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.y))); + tft_string.trim(); + tft.add_text((TFT_WIDTH / 2 + 120) - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } + #endif + + extern screenFunc_t _manual_move_func_ptr; + if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { + + #define SLIDER_LENGHT 336 + #define SLIDER_Y_POSITION 186 + + tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); + tft.set_background(COLOR_BACKGROUND); + + int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; + tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); + tft.add_bar(1, 6, position, 4, COLOR_SLIDER); + tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); + tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); + + #if ENABLED(TOUCH_SCREEN) + tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); + touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); + #endif + } + + #if ENABLED(TOUCH_SCREEN) + add_control(64, 256, DECREASE, imgDecrease); + add_control(352, 256, INCREASE, imgIncrease); + add_control(208, 256, CLICK, imgConfirm); + #endif +} + +// The Select Screen presents a prompt and two "buttons" +void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { + uint16_t line = 1; + + if (string == NULL) line++; + + menu_line(line++); + tft_string.set(pref); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + if (string) { + menu_line(line++); + tft_string.set(string); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } + + if (suff) { + menu_line(line); + tft_string.set(suff); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } + #if ENABLED(TOUCH_SCREEN) + add_control(88, 256, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + add_control(328, 256, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + #endif +} + +#if ENABLED(SDSUPPORT) + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + menu_item(row, sel); + if (isDir) + tft.add_image(5, 5, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + tft.add_text(42, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); + } +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + touch.add_control(RESUME_CONTINUE , 0, 0, TFT_WIDTH, TFT_HEIGHT); + #endif + + menu_line(row); + tft_string.set(GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE)); + tft_string.add('E'); + tft_string.add((char)('1' + extruder)); + tft_string.add(' '); + tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.add(" / "); + tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } +#endif // ADVANCED_PAUSE_FEATURE + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #define GRID_OFFSET_X 8 + #define GRID_OFFSET_Y 8 + #define GRID_WIDTH 192 + #define GRID_HEIGHT 192 + #define CONTROL_OFFSET 16 + + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + + tft.canvas(GRID_OFFSET_X, GRID_OFFSET_Y, GRID_WIDTH, GRID_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); + + for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) + for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + + const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, + lpos = pos.asLogical(); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2 - 43, 120, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(X_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.x)); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2, 120, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Y_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.y)); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2 + 43, 120, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Z_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 48) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 5, 48, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(x_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET + 16 - 24, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2, 48, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(y_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); + add_control(320, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); + add_control(224, 286, BACK, imgBack); + #endif + } +#endif // AUTO_BED_LEVELING_UBL + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + void MarlinUI::touch_calibration() { + static uint16_t x, y; + + calibrationState calibration_stage = touch.get_calibration_state(); + + if (calibration_stage == CALIBRATION_NONE) { + defer_status_screen(true); + clear_lcd(); + calibration_stage = touch.calibration_start(); + } + else { + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + } + + x = 20; y = 20; + touch.clear(); + + if (calibration_stage < CALIBRATION_SUCCESS) { + switch(calibration_stage) { + case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; + case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; + case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; + case CALIBRATION_POINT_4: x = TFT_WIDTH - 21; y = TFT_HEIGHT - 21; tft_string.set("Bottom Right"); break; + default: break; + } + + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); + tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); + + touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); + } + else { + tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? "Calibration Completed" : "Calibration Failed"); + defer_status_screen(false); + touch.calibration_end(); + touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); + } + + tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } +#endif // TOUCH_SCREEN_CALIBRATION + +void menu_line(const uint8_t row, uint16_t color) { + tft.canvas(0, 4 + 45 * row, TFT_WIDTH, 43); + tft.set_background(color); +} + +void menu_pause_option(); + +void menu_item(const uint8_t row, bool sel ) { + #if ENABLED(TOUCH_SCREEN) + if (row == 0) { + touch.clear(); + draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); + } + #endif + + menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row)); +} + +#endif // HAS_UI_480x320 diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h new file mode 100644 index 0000000000..d803df4a24 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_480x320.h @@ -0,0 +1,106 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#include "tft.h" +#include "tft_image.h" + +#if ENABLED(TOUCH_SCREEN) + #include "touch.h" +#endif + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); +void draw_fan_status(uint16_t x, uint16_t y, const bool blink); + +#define MENU_TEXT_X_OFFSET 16 +#define MENU_TEXT_Y_OFFSET 7 +void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); +void menu_item(const uint8_t row, bool sel = false); + +#define MENU_FONT_NAME Helvetica18 +#define SYMBOLS_FONT_NAME Helvetica18_symbols + +#define ABSOLUTE_ZERO -273.15 + +const tImage Images[imgCount] = { + MarlinLogo195x59x16, + HotEnd_64x64x4, + Bed_64x64x4, + Bed_Heated_64x64x4, + Chamber_64x64x4, + Chamber_Heated_64x64x4, + Fan0_64x64x4, + Fan_Slow0_64x64x4, + Fan_Slow1_64x64x4, + Fan_Fast0_64x64x4, + Fan_Fast1_64x64x4, + Feedrate_32x32x4, + Flowrate_32x32x4, + SD_64x64x4, + Menu_64x64x4, + Settings_64x64x4, + Directory_32x32x4, + Confirm_64x64x4, + Cancel_64x64x4, + Increase_64x64x4, + Decrease_64x64x4, + Back_32x32x4, + Up_32x32x4, + Down_32x32x4, + Left_32x32x4, + Right_32x32x4, + Refresh_32x32x4, + Leveling_32x32x4, + Slider8x16x4, +}; + +#if HAS_TEMP_CHAMBER && HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_CHAMBER 3 + #define ITEM_FAN 4 + #define ITEMS_COUNT 5 + #define POS_Y 4 +#elif HAS_TEMP_CHAMBER + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_CHAMBER 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 + #define POS_Y 4 +#elif HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 + #define POS_Y 4 +#else + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_FAN 2 + #define ITEMS_COUNT 3 + #define POS_Y 4 +#endif diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 88a9c36b36..92e3f136c9 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -149,7 +149,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if HAS_SLOW_BUTTONS volatile uint8_t MarlinUI::slow_buttons; #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 #include "../feature/touch/xpt2046.h" bool MarlinUI::on_edit_screen = false; #endif @@ -229,7 +229,7 @@ millis_t MarlinUI::next_button_update_ms; // = 0 int8_t MarlinUI::encoderDirection = ENCODERBASE; #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 uint8_t MarlinUI::touch_buttons; uint8_t MarlinUI::repeat_delay; #endif @@ -802,6 +802,9 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { LCDViewAction MarlinUI::lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; millis_t next_lcd_update_ms; +#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS + millis_t MarlinUI::return_to_status_ms = 0; +#endif void MarlinUI::update() { @@ -809,7 +812,6 @@ void MarlinUI::update() { millis_t ms = millis(); #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 - static millis_t return_to_status_ms = 0; #define RESET_STATUS_TIMEOUT() (return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS) #else #define RESET_STATUS_TIMEOUT() NOOP @@ -838,7 +840,7 @@ void MarlinUI::update() { quick_feedback(); // - Always make a click sound }; - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 if (touch_buttons) { RESET_STATUS_TIMEOUT(); if (touch_buttons & (EN_A | EN_B)) { // Menu arrows, in priority @@ -859,7 +861,7 @@ void MarlinUI::update() { } else // keep wait_for_unclick value - #endif // TOUCH_BUTTONS + #endif // HAS_TOUCH_XPT2046 { // Integrated LCD click handling via button_pressed @@ -881,7 +883,7 @@ void MarlinUI::update() { next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 if (on_status_screen()) next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2; @@ -1078,6 +1080,8 @@ void MarlinUI::update() { } // switch } // ELAPSED(ms, next_lcd_update_ms) + + TERN_(HAS_GRAPHICAL_TFT, tft_idle()); } #if HAS_ADC_BUTTONS @@ -1224,7 +1228,7 @@ void MarlinUI::update() { #if HAS_SLOW_BUTTONS | slow_buttons #endif - #if BOTH(TOUCH_BUTTONS, HAS_ENCODER_ACTION) + #if BOTH(HAS_TOUCH_XPT2046, HAS_ENCODER_ACTION) | (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF)) #endif ); @@ -1533,7 +1537,7 @@ void MarlinUI::update() { #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 // // Screen Click diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index f3c06177bb..662adef0c5 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -74,7 +74,7 @@ uint8_t get_ADC_keyValue(); #endif - #define LCD_UPDATE_INTERVAL TERN(TOUCH_BUTTONS, 50, 100) + #define LCD_UPDATE_INTERVAL TERN(HAS_TOUCH_XPT2046, 50, 100) #if HAS_LCD_MENU @@ -149,7 +149,7 @@ #define BUTTON_PRESSED(BN) !READ(BTN_## BN) - #if BUTTON_EXISTS(ENC) || ENABLED(TOUCH_BUTTONS) + #if BUTTON_EXISTS(ENC) || HAS_TOUCH_XPT2046 #define BLEN_C 2 #define EN_C _BV(BLEN_C) #endif @@ -215,7 +215,7 @@ #endif -#if BUTTON_EXISTS(BACK) || ENABLED(TOUCH_BUTTONS) +#if BUTTON_EXISTS(BACK) || HAS_TOUCH_XPT2046 #define BLEN_D 3 #define EN_D _BV(BLEN_D) #define LCD_BACK_CLICKED() (buttons & EN_D) @@ -451,7 +451,7 @@ public: static void draw_hotend_status(const uint8_t row, const uint8_t extruder); #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 static bool on_edit_screen; static void screen_click(const uint8_t row, const uint8_t col, const uint8_t x, const uint8_t y); #endif @@ -501,8 +501,11 @@ public: #endif #if HAS_LCD_MENU + #if LCD_TIMEOUT_TO_STATUS + static millis_t return_to_status_ms; + #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 static uint8_t touch_buttons; static uint8_t repeat_delay; #endif @@ -633,7 +636,7 @@ public: #endif static void update_buttons(); - static inline bool button_pressed() { return BUTTON_CLICK(); } + static inline bool button_pressed() { return BUTTON_CLICK() || TERN(TOUCH_SCREEN, touch_pressed(), false); } #if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) static void wait_for_release(); #endif @@ -668,6 +671,10 @@ public: #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static void touch_calibration(); + #endif + private: #if HAS_DISPLAY @@ -681,6 +688,12 @@ private: static constexpr bool defer_return_to_status = false; #endif static void draw_status_screen(); + #if HAS_GRAPHICAL_TFT + static void tft_idle(); + #if ENABLED(TOUCH_SCREEN) + static bool touch_pressed(); + #endif + #endif #endif }; diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 72ff057628..b9f44eb6f8 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -140,6 +140,10 @@ #define HAS_CASE_LIGHT_BRIGHTNESS 1 #endif +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "../lcd/tft/touch.h" +#endif + #pragma pack(push, 1) // No padding between variables typedef struct { uint16_t X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_stepper_current_t; @@ -403,6 +407,13 @@ typedef struct SettingsDataStruct { uint8_t case_light_brightness; #endif + // + // TOUCH_SCREEN_CALIBRATION + // + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + touch_calibration_t touch_calibration; + #endif + } SettingsData; //static_assert(sizeof(SettingsData) <= MARLIN_EEPROM_SIZE, "EEPROM too small to contain SettingsData!"); @@ -1334,6 +1345,13 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(case_light_brightness); #endif + // + // TOUCH_SCREEN_CALIBRATION + // + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + EEPROM_WRITE(touch.calibration); + #endif + // // Validate CRC and Data Size // @@ -2167,6 +2185,14 @@ void MarlinSettings::postprocess() { EEPROM_READ(case_light_brightness); #endif + // + // TOUCH_SCREEN_CALIBRATION + // + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + _FIELD_TEST(touch.calibration); + EEPROM_READ(touch.calibration); + #endif + eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); if (eeprom_error) { DEBUG_ECHO_START(); @@ -2469,6 +2495,11 @@ void MarlinSettings::reset() { // TERN_(HAS_CASE_LIGHT_BRIGHTNESS, case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); + // + // TOUCH_SCREEN_CALIBRATION + // + TERN_(TOUCH_SCREEN_CALIBRATION, touch.calibration_reset()); + // // Magnetic Parking Extruder // diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 1b78b0f769..1f120e0c12 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -503,7 +503,7 @@ #elif MB(CHITU3D) #include "stm32f1/pins_CHITU3D.h" // STM32F1 env:STM32F103RE #elif MB(MKS_ROBIN) - #include "stm32f1/pins_MKS_ROBIN.h" // STM32F1 env:mks_robin + #include "stm32f1/pins_MKS_ROBIN.h" // STM32F1 env:mks_robin env:mks_robin_stm32 #elif MB(MKS_ROBIN_MINI) #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini #elif MB(MKS_ROBIN_NANO) @@ -632,6 +632,12 @@ #elif MB(AGCM4_RAMPS_144) #include "samd/pins_RAMPS_144.h" // SAMD51 env:SAMD51_grandcentral_m4 +// +// Custom board (with custom PIO env) +// +#elif MB(CUSTOM) + #include "pins_custom.h" // env:custom + // // Linux Native Debug board // diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 5a672d29b1..b2eda47978 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -108,7 +108,7 @@ // TronXY TFT Support // //#define FSMC_GRAPHICAL_TFT -//#define TOUCH_BUTTONS +//#define HAS_TOUCH_XPT2046 1 #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 @@ -126,7 +126,7 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index be71d3f2c2..39db37a1a2 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -132,7 +132,7 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index c68c059265..dcd1c868f4 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -126,7 +126,7 @@ // // Touch support // -#if ENABLED(TOUCH_BUTTONS) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PA4 #define TOUCH_INT_PIN PC4 #endif diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index e99b702700..2f5dbd0105 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -135,7 +135,7 @@ * mixed up MOSI and MISO pins. SPI is managed in SW, and needs pins * declared below. */ -#if ENABLED(TOUCH_BUTTONS) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB12 // pin 51 SPI2_NSS #define TOUCH_SCK_PIN PB13 // pin 52 #define TOUCH_MOSI_PIN PB14 // pin 53 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 86b6f613d2..5193ddad23 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -27,7 +27,7 @@ * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware */ -#ifndef __STM32F1__ +#if !defined(STM32F1) && !defined(STM32F1xx) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin supports up to 2 hotends / E-steppers. Comment out this line to continue." @@ -43,7 +43,14 @@ // // Enable SD EEPROM to prevent infinite boot loop // -#define SDCARD_EEPROM_EMULATION +#ifdef ARDUINO_ARCH_STM32 + #define FLASH_EEPROM_EMULATION + #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) + #define MARLIN_EEPROM_SIZE (EEPROM_PAGE_SIZE) +#else + #define SDCARD_EEPROM_EMULATION +#endif // // Servos @@ -112,35 +119,47 @@ #define PS_ON_PIN PA3 // PW_OFF #define FIL_RUNOUT_PIN PF11 // MT_DET -#define BEEPER_PIN PC13 +#ifdef ARDUINO_ARCH_STM32F1 + #define BEEPER_PIN PC13 +#else + #define BEEPER_PIN -1 +#endif #define LED_PIN PB2 -/** - * Note: MKS Robin TFT screens use various TFT controllers - * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) - * ILI9488 is not supported - * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp - * - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - * - * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu - * because Marlin uses the reset as a failsafe to revive a glitchy LCD. - */ -//#define LCD_RESET_PIN PF6 -#define LCD_BACKLIGHT_PIN PG11 -#define FSMC_CS_PIN PG12 // NE4 -#define FSMC_RS_PIN PF0 // A0 +#ifdef HAS_GRAPHICAL_TFT + #define TFT_RESET_PIN PF6 + #define TFT_BACKLIGHT_PIN PG11 + #define TFT_CS_PIN PG12 // NE4 + #define TFT_RS_PIN PF0 // A0 +#else + /** + * Note: MKS Robin TFT screens use various TFT controllers + * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) + * ILI9488 is not supported + * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp + * + * If the screen stays white, disable 'LCD_RESET_PIN' + * to let the bootloader init the screen. + * + * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu + * because Marlin uses the reset as a failsafe to revive a glitchy LCD. + */ + //#define LCD_RESET_PIN PF6 + #define LCD_BACKLIGHT_PIN PG11 + #define FSMC_CS_PIN PG12 // NE4 + #define FSMC_RS_PIN PF0 // A0 -#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT -#define FSMC_DMA_DEV DMA2 -#define FSMC_DMA_CHANNEL DMA_CH5 + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 +#endif -#if ENABLED(TOUCH_BUTTONS) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB1 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + #define TOUCH_INT_PIN -1 #endif // SPI1(PA7) & SPI3(PB5) not available @@ -150,7 +169,6 @@ #define SCK_PIN PB13 // SPI2 #define MISO_PIN PB14 // SPI2 #define MOSI_PIN PB15 // SPI2 - #define SS_PIN -1 // PB12 is X- #define SD_DETECT_PIN PF12 // SD_CD #else // SD as custom software SPI (SDIO pins) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index a4c179afce..73e1b12b88 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -128,7 +128,7 @@ #define LCD_RESET_PIN PC6 #define LCD_BACKLIGHT_PIN PD13 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PC2 #define TOUCH_SCK_PIN PB13 #define TOUCH_MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 610f4b5735..844fb6b0d6 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -210,7 +210,7 @@ #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PA7 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK #define TOUCH_MISO_PIN PB14 // SPI2_MISO diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index afbcc8f32a..3c950a38e3 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -293,8 +293,8 @@ #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - //#define TOUCH_BUTTONS - #if ENABLED(TOUCH_BUTTONS) + //#define TOUCH_SCREEN + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PE14 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 2d6c98eb1e..3ca59a93a3 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -221,7 +221,7 @@ #define LCD_RESET_PIN PF6 #define LCD_BACKLIGHT_PIN PD13 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PA7 #else #define BEEPER_PIN PC5 diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index 16e665621c..eb7fc94939 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -143,7 +143,7 @@ #endif #endif - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB12 // SPI2_NSS #define TOUCH_SCK_PIN PB13 diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 2ca5897e9e..c0a0c016b0 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -129,7 +129,7 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 -#if ENABLED(TOUCH_BUTTONS) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB7 // SPI2_NSS #define TOUCH_SCK_PIN PA5 // SPI2_SCK #define TOUCH_MISO_PIN PA6 // SPI2_MISO diff --git a/buildroot/bin/opt_add b/buildroot/bin/opt_add index 2c1eb30008..2306ebdaa1 100755 --- a/buildroot/bin/opt_add +++ b/buildroot/bin/opt_add @@ -1,3 +1,3 @@ #!/usr/bin/env bash -eval "echo '#define ${@}' >>Marlin/Configuration_adv.h" +eval "echo '#define ${@}' | cat - Marlin/Configuration.h > temp && mv temp Marlin/Configuration.h" diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index 4510f689f2..96be67e53d 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -1,15 +1,18 @@ #!/usr/bin/env bash +IFS=: read -r PART1 PART2 <<< "$@" +[ -n "${PART2}" ] && { REPO="$PART1" ; RDIR="$PART2" ; } \ + || { REPO=bugfix-2.0.x ; RDIR="$PART1" ; } +EXAMPLES="https://raw.githubusercontent.com/MarlinFirmware/Configurations/$REPO/config/examples" + restore_configs -EXAMPLES="https://raw.githubusercontent.com/MarlinFirmware/Configurations/bugfix-2.0.x/config/examples" - cd Marlin -wget -q "$EXAMPLES/$@/Configuration.h" -O wgot && mv wgot Configuration.h -wget -q "$EXAMPLES/$@/Configuration_adv.h" -O wgot && mv wgot Configuration_adv.h -wget -q "$EXAMPLES/$@/_Bootscreen.h" -O wgot && mv wgot _Bootscreen.h -wget -q "$EXAMPLES/$@/_Statusscreen.h" -O wgot && mv wgot _Statusscreen.h +wget -q "$EXAMPLES/$RDIR/Configuration.h" -O wgot && mv wgot Configuration.h +wget -q "$EXAMPLES/$RDIR/Configuration_adv.h" -O wgot && mv wgot Configuration_adv.h +wget -q "$EXAMPLES/$RDIR/_Bootscreen.h" -O wgot && mv wgot _Bootscreen.h +wget -q "$EXAMPLES/$RDIR/_Statusscreen.h" -O wgot && mv wgot _Statusscreen.h rm -f wgot cd - >/dev/null diff --git a/buildroot/share/PlatformIO/scripts/mks_encrypt.py b/buildroot/share/PlatformIO/scripts/mks_encrypt.py new file mode 100644 index 0000000000..0d53cdfbe9 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_encrypt.py @@ -0,0 +1,32 @@ +import os,sys +Import("env") + +from SCons.Script import DefaultEnvironment +board = DefaultEnvironment().BoardConfig() + +# Encrypt ${PROGNAME}.bin and save it as build.firmware ('Robin.bin') +def encrypt(source, target, env): + key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] + + firmware = open(target[0].path, "rb") + robin = open(target[0].dir.path +'/'+ board.get("build.firmware"), "wb") + length = os.path.getsize(target[0].path) + position = 0 + try: + while position < length: + byte = firmware.read(1) + if position >= 320 and position < 31040: + byte = chr(ord(byte) ^ key[position & 31]) + if sys.version_info[0] > 2: + byte = bytes(byte, 'latin1') + robin.write(byte) + position += 1 + finally: + firmware.close() + robin.close() + +if 'firmware' in board.get("build").keys(): + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +else: + print("You need to define output file via board_build.firmware = 'filename' parameter", file=sys.stderr) + exit(1); diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp index 93ae231518..2210e9844c 100755 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp @@ -123,7 +123,7 @@ static void setup_clocks(void) { #if !USE_HSI_CLOCK // Enable HSE, and wait until it's ready. rcc_turn_on_clk(RCC_CLK_HSE); - while (!rcc_is_clk_ready(RCC_CLK_HSE)) + while(!rcc_is_clk_ready(RCC_CLK_HSE)) ; #endif // Configure AHBx, APBx, etc. prescalers and the main PLL. diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c new file mode 100644 index 0000000000..c9d2bb88b8 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c @@ -0,0 +1,425 @@ +/* + ******************************************************************************* + * Copyright (c) 2020, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + * Automatically generated from STM32F103V(F-G)Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 +#endif + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 +#endif + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 +#endif + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 +#endif + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 +#endif + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 +#endif + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 +#endif + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 +#endif + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#if defined(STM32F103xE) || defined(STM32F103xG) +#ifdef HAL_DAC_MODULE_ENABLED +WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM2_CH1 + // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 +#endif + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 +#endif + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM2_CH3 + // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 +#endif +#ifdef STM32F103xG + // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 +#endif + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM5_CH4 +#else + {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 +#endif +#if defined(STM32F103xG) + // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 +#endif + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM3_CH1 +#if defined(STM32F103xG) + // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 +#endif + {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N + // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 + // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N +#if defined(STM32F103xG) + // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 +#endif + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM1_CH1 + // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM1_CH2 + // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM1_CH3 + // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM1_CH4 + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 1, 0)}, // TIM2_CH1 + // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 + // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM3_CH3 + // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N +#endif + {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 1)}, // TIM1_CH3N + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N +#endif + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 2, 0)}, // TIM2_CH2 + // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM4_CH3 +#if defined(STM32F103xG) + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 +#endif + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM4_CH4 +#if defined(STM32F103xG) + // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 +#endif + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 + // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 + // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM1_CH2N +#if defined(STM32F103xG) + // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 +#endif + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM1_CH3N +#if defined(STM32F103xG) + // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 +#endif + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 +#endif + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 +#endif + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 3, 0)}, // TIM3_CH3 + // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 4, 0)}, // TIM3_CH4 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 +#endif + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 4, 0)}, // TIM4_CH4 +#if defined(STM32F103xG) + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 2, 0)}, // TIM9_CH2 +#endif + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 4, 0)}, // TIM1_CH4 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART1_ENABLE)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, +#endif +#if defined(STM32F103xE) || defined(STM32F103xG) + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#endif + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_3, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART1_ENABLE)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PC_11, UART4, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, +#else + {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, +#endif +#if defined(STM32F103xE) || defined(STM32F103xG) + {PD_2, UART5, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, +#endif + {PD_6, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, +#endif + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, +#endif + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, +#endif + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, +#endif + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, + {PB_8, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_2)}, + {PD_0, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, + {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_2)}, + {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_3)}, + {NC, NP, 0} +}; +#endif + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB[] = { + {PA_11, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DM + {PA_12, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DP + {NC, NP, 0} +}; +#endif + +//*** No USB_OTG_FS *** + +//*** No USB_OTG_HS *** + +//*** SD *** + +#if defined(STM32F103xE) || defined(STM32F103xG) +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D4 + {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D5 + {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D6 + {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h new file mode 100644 index 0000000000..d9076b4dfb --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h @@ -0,0 +1,30 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_DM = PA_11, + USB_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld new file mode 100644 index 0000000000..c9197c8b45 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld @@ -0,0 +1,200 @@ +/* +****************************************************************************** +** + +** File : LinkerScript.ld +** +** Author : Auto-generated by STM32CubeIDE +** +** Abstract : Linker script for STM32F103V(8/B/C/E/F/GTx Device from STM32F1 series +** 64/128/256/512/768/1024Kbytes FLASH +** 20/20/48/64/64/96/96Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed as is without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2019 STMicroelectronics

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of "RAM" Ram type memory */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE + FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "FLASH" Rom type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data into "FLASH" Rom type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp new file mode 100644 index 0000000000..25b4b51145 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp @@ -0,0 +1,235 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Digital PinName array +const PinName digitalPin[] = { + PA_0, //D0 + PA_1, //D1 + PA_2, //D2 + PA_3, //D3 + PA_4, //D4 + PA_5, //D5 + PA_6, //D6 + PA_7, //D7 + PA_8, //D8 + PA_9, //D9 + PA_10, //D10 + PA_11, //D11 + PA_12, //D12 + PA_13, //D13 + PA_14, //D14 + PA_15, //D15 + + PB_0, //D16 + PB_1, //D17 + PB_2, //D18 + PB_3, //D19 + PB_4, //D20 + PB_5, //D21 + PB_6, //D22 + PB_7, //D23 + PB_8, //D24 + PB_9, //D25 + PB_10, //D26 + PB_11, //D27 + PB_12, //D28 + PB_13, //D29 + PB_14, //D30 + PB_15, //D31 + + PC_0, //D32 + PC_1, //D33 + PC_2, //D34 + PC_3, //D35 + PC_4, //D36 + PC_5, //D37 + PC_6, //D38 + PC_7, //D39 + PC_8, //D40 + PC_9, //D41 + PC_10, //D42 + PC_11, //D43 + PC_12, //D44 + PC_13, //D45 + PC_14, //D46 + PC_15, //D47 + + PD_0, //D48 + PD_1, //D49 + PD_2, //D50 + PD_3, //D51 + PD_4, //D52 + PD_5, //D53 + PD_6, //D54 + PD_7, //D55 + PD_8, //D56 + PD_9, //D57 + PD_10, //D58 + PD_11, //D59 + PD_12, //D60 + PD_13, //D61 + PD_14, //D62 + PD_15, //D63 + + PE_0, //D64 + PE_1, //D65 + PE_2, //D66 + PE_3, //D67 + PE_4, //D68 + PE_5, //D69 + PE_6, //D70 + PE_7, //D71 + PE_8, //D72 + PE_9, //D73 + PE_10, //D74 + PE_11, //D75 + PE_12, //D76 + PE_13, //D77 + PE_14, //D78 + PE_15, //D79 +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 0, // A0, PA0 + 1, // A1, PA1 + 2, // A2, PA2 + 3, // A3, PA3 + 4, // A4, PA4 + 5, // A5, PA5 + 6, // A6, PA6 + 7, // A7, PA7 + 16, // A8, PB0 + 17, // A9, PB1 + 32, // A10, PC0 + 33, // A11, PC1 + 34, // A12, PC2 + 35, // A13, PC3 + 36, // A14, PC4 + 37, // A15, PC5 +}; + +/******************************************************************************/ +/* PLL (clocked by HSE) used as System clock source */ +/******************************************************************************/ +static bool SetSysClock_PLL_HSE(bool bypass) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; + bool ret = false; + + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + if (bypass == false) { + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + } else { + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; + } + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) == HAL_OK) { + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) == HAL_OK) { + ret = true; + } + } + } + return ret; +} + +/******************************************************************************/ +/* PLL (clocked by HSI) used as System clock source */ +/******************************************************************************/ +bool SetSysClock_PLL_HSI(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; + bool ret = false; + + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) == HAL_OK) { + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV4; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) == HAL_OK) { + ret = true; + } + } + } + return ret; +} + +WEAK void SystemClock_Config(void) +{ + /* + * If HSE_VALUE is not 8MHz and you want use it, then: + * - Redefine HSE_VALUE to the correct HSE_VALUE + * - Redefine SystemClock_Config() with the correct settings + */ +#if HSE_VALUE == 8000000U + /* 1- Try to start with HSE and external 8MHz xtal */ + if (SetSysClock_PLL_HSE(false) == false) { + /* 2- If fail try to start with HSE and external clock */ + if (SetSysClock_PLL_HSE(true) == false) { +#endif + /* 3- If fail start with HSI clock */ + if (SetSysClock_PLL_HSI() == false) { + Error_Handler(); + } +#if HSE_VALUE == 8000000U + } + } +#endif +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h new file mode 100644 index 0000000000..b622b39376 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h @@ -0,0 +1,181 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +#define PA0 0 +#define PA1 1 +#define PA2 2 +#define PA3 3 +#define PA4 4 +#define PA5 5 +#define PA6 6 +#define PA7 7 +#define PA8 8 +#define PA9 9 +#define PA10 10 +#define PA11 11 +#define PA12 12 +#define PA13 13 +#define PA14 14 +#define PA15 15 + +#define PB0 16 +#define PB1 17 +#define PB2 18 +#define PB3 19 +#define PB4 20 +#define PB5 21 +#define PB6 22 +#define PB7 23 +#define PB8 24 +#define PB9 25 +#define PB10 26 +#define PB11 27 +#define PB12 28 +#define PB13 29 +#define PB14 30 +#define PB15 31 + +#define PC0 32 +#define PC1 33 +#define PC2 34 +#define PC3 35 +#define PC4 36 +#define PC5 37 +#define PC6 38 +#define PC7 39 +#define PC8 40 +#define PC9 41 +#define PC10 42 +#define PC11 43 +#define PC12 44 +#define PC13 45 +#define PC14 46 +#define PC15 47 + +#define PD0 48 +#define PD1 49 +#define PD2 50 +#define PD3 51 +#define PD4 52 +#define PD5 53 +#define PD6 54 +#define PD7 55 +#define PD8 56 +#define PD9 57 +#define PD10 58 +#define PD11 59 +#define PD12 60 +#define PD13 61 +#define PD14 62 +#define PD15 63 + +#define PE0 64 +#define PE1 65 +#define PE2 66 +#define PE3 67 +#define PE4 68 +#define PE5 69 +#define PE6 70 +#define PE7 71 +#define PE8 72 +#define PE9 73 +#define PE10 74 +#define PE11 75 +#define PE12 76 +#define PE13 77 +#define PE14 78 +#define PE15 79 + +// This must be a literal +#define NUM_DIGITAL_PINS 80 +#define NUM_ANALOG_INPUTS 16 + +// On-board LED pin number +#ifndef LED_BUILTIN +#define LED_BUILTIN PB11 +#endif + +// On-board user button +#ifndef USER_BTN +#define USER_BTN PC13 +#endif + +// SPI Definitions +#define PIN_SPI_SS PC4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + +// I2C Definitions +#define PIN_WIRE_SDA PB7 +#define PIN_WIRE_SCL PB6 + +// Timer Definitions (optional) +// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin +#define TIMER_TONE TIM3 +#define TIMER_SERVO TIM2 + +// UART Definitions +// Define here Serial instance number to map on Serial generic name +#define SERIAL_UART_INSTANCE 1 + +// Extra HAL modules +#if defined(STM32F103xE) || defined(STM32F103xG) +#define HAL_DAC_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED +#endif + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE Serial1 +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c new file mode 100644 index 0000000000..5736e5206e --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c @@ -0,0 +1,368 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + * Automatically generated from STM32F103Z(C-D-E|F-G))Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + // {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + // {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM2_CH1 + // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 + // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM2_CH3 + // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 + // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 +#ifdef STM32F103xG + // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 +#endif + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM5_CH4 +#ifdef STM32F103xG + // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 +#endif + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM3_CH1 +#ifdef STM32F103xG + // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 +#endif + // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N + // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 + {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N +#ifdef STM32F103xG + // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 +#endif + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM1_CH1 + // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM1_CH2 + // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM1_CH3 + // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM1_CH4 + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 1, 0)}, // TIM2_CH1 + // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 + // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM3_CH3 + // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 + {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N + {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 1)}, // TIM1_CH3N + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 2, 0)}, // TIM2_CH2 + // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM4_CH3 +#ifdef STM32F103xG + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 +#endif + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM4_CH4 +#ifdef STM32F103xG + // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 +#endif + // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 + // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM1_CH2N +#ifdef STM32F103xG + // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 +#endif + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM1_CH3N +#ifdef STM32F103xG + // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 +#endif + // {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 + {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 + // {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 + {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 3, 0)}, // TIM3_CH3 + // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 4, 0)}, // TIM3_CH4 + // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 4, 0)}, // TIM4_CH4 +#ifdef STM32F103xG + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 2, 0)}, // TIM9_CH2 +#endif + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 4, 0)}, // TIM1_CH4 +#ifdef STM32F103xG + {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM10_ENABLE, 1, 0)}, // TIM10_CH1 + {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM11_ENABLE, 1, 0)}, // TIM11_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM13_ENABLE, 1, 0)}, // TIM13_CH1 + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM14_ENABLE, 1, 0)}, // TIM14_CH1 +#endif + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART1_ENABLE)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_3, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART1_ENABLE)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PC_11, UART4, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + // {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_2, UART5, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PD_6, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, + {PB_8, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_2)}, + {PD_0, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, + {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_2)}, + {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_3)}, + {NC, NP, 0} +}; +#endif + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB[] = { + {PA_11, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DM + {PA_12, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DP + {NC, NP, 0} +}; +#endif + +//*** No USB_OTG_FS *** + +//*** No USB_OTG_HS *** + +//*** SD *** + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D4 + // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D5 + // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D6 + // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h new file mode 100644 index 0000000000..d9076b4dfb --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h @@ -0,0 +1,30 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_DM = PA_11, + USB_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h new file mode 100644 index 0000000000..014943f311 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h @@ -0,0 +1,412 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_conf_default.h + * @brief HAL default configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F1xx_HAL_CONF_DEFAULT_H +#define __STM32F1xx_HAL_CONF_DEFAULT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief Include the default list of modules to be used in the HAL driver + * and manage module deactivation + */ +#include "stm32yyxx_hal_conf.h" +#if 0 +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CAN_MODULE_ENABLED +/*#define HAL_CAN_LEGACY_MODULE_ENABLED*/ +#define HAL_CEC_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DAC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_ETH_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_HCD_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_I2S_MODULE_ENABLED +#define HAL_IRDA_MODULE_ENABLED +#define HAL_IWDG_MODULE_ENABLED +#define HAL_NAND_MODULE_ENABLED +#define HAL_NOR_MODULE_ENABLED +#define HAL_PCCARD_MODULE_ENABLED +#define HAL_PCD_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SMARTCARD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_WWDG_MODULE_ENABLED +#define HAL_MMC_MODULE_ENABLED +#endif + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) +#if defined(USE_STM3210C_EVAL) +#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ +#else +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) +#define HSI_VALUE 8000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) +#define LSI_VALUE 40000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) +#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#if !defined(VDD_VALUE) +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#endif +#if !defined (TICK_INT_PRIORITY) +#define TICK_INT_PRIORITY 0x00U /*!< tick interrupt priority */ +#endif +#if !defined (USE_RTOS) +#define USE_RTOS 0U +#endif +#if !defined (PREFETCH_ENABLE) +#define PREFETCH_ENABLE 1U +#endif + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB 8U /* 8 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x0010) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x0011) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x0012) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ +#if !defined (USE_SPI_CRC) +#define USE_SPI_CRC 0U +#endif + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f1xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f1xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f1xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f1xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f1xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f1xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "Legacy/stm32f1xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f1xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f1xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f1xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f1xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f1xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f1xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f1xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f1xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f1xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f1xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f1xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f1xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f1xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f1xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f1xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f1xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f1xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f1xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f1xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f1xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f1xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f1xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f1xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f1xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f1xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f1xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_HAL_CONF_DEFAULT_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld new file mode 100644 index 0000000000..098e83b060 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld @@ -0,0 +1,200 @@ +/* +****************************************************************************** +** + +** File : LinkerScript.ld +** +** Author : Auto-generated by STM32CubeIDE +** +** Abstract : Linker script for STM32F103Z(C/D/E/G/GTx Device from STM32F1 series +** 256/386/512K/786/1024bytes FLASH +** 48/64/96Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed as is without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2019 STMicroelectronics

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of "RAM" Ram type memory */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE + FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "FLASH" Rom type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data into "FLASH" Rom type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp new file mode 100644 index 0000000000..ff7ab771c0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp @@ -0,0 +1,222 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Digital PinName array +const PinName digitalPin[] = { + PA_0, //D0 + PA_1, //D1 + PA_2, //D2 + PA_3, //D3 + PA_4, //D4 + PA_5, //D5 + PA_6, //D6 + PA_7, //D7 + PA_8, //D8 + PA_9, //D9 + PA_10, //D10 + PA_11, //D11 + PA_12, //D12 + PA_13, //D13 + PA_14, //D14 + PA_15, //D15 + + PB_0, //D16 + PB_1, //D17 + PB_2, //D18 + PB_3, //D19 + PB_4, //D20 + PB_5, //D21 + PB_6, //D22 + PB_7, //D23 + PB_8, //D24 + PB_9, //D25 + PB_10, //D26 + PB_11, //D27 + PB_12, //D28 + PB_13, //D29 + PB_14, //D30 + PB_15, //D31 + + PC_0, //D32 + PC_1, //D33 + PC_2, //D34 + PC_3, //D35 + PC_4, //D36 + PC_5, //D37 + PC_6, //D38 + PC_7, //D39 + PC_8, //D40 + PC_9, //D41 + PC_10, //D42 + PC_11, //D43 + PC_12, //D44 + PC_13, //D45 + PC_14, //D46 + PC_15, //D47 + + PD_0, //D48 + PD_1, //D49 + PD_2, //D50 + PD_3, //D51 + PD_4, //D52 + PD_5, //D53 + PD_6, //D54 + PD_7, //D55 + PD_8, //D56 + PD_9, //D57 + PD_10, //D58 + PD_11, //D59 + PD_12, //D60 + PD_13, //D61 + PD_14, //D62 + PD_15, //D63 + + PE_0, //D64 + PE_1, //D65 + PE_2, //D66 + PE_3, //D67 + PE_4, //D68 + PE_5, //D69 + PE_6, //D70 + PE_7, //D71 + PE_8, //D72 + PE_9, //D73 + PE_10, //D74 + PE_11, //D75 + PE_12, //D76 + PE_13, //D77 + PE_14, //D78 + PE_15, //D79 + + PF_0, //D80 + PF_1, //D81 + PF_2, //D82 + PF_3, //D83 + PF_4, //D84 + PF_5, //D85 + PF_6, //D86 + PF_7, //D87 + PF_8, //D88 + PF_9, //D89 + PF_10, //D90 + PF_11, //D91 + PF_12, //D92 + PF_13, //D93 + PF_14, //D94 + PF_15, //D95 + + PG_0, //D96 + PG_1, //D97 + PG_2, //D98 + PG_3, //D99 + PG_4, //D100 + PG_5, //D101 + PG_6, //D102 + PG_7, //D103 + PG_8, //D104 + PG_9, //D105 + PG_10, //D106 + PG_11, //D107 + PG_12, //D108 + PG_13, //D109 + PG_14, //D110 + PG_15 //D111 +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 0, // A0, PA0 + 1, // A1, PA1 + 2, // A2, PA2 + 3, // A3, PA3 + 4, // A4, PA4 + 5, // A5, PA5 + 6, // A6, PA6 + 7, // A7, PA7 + 16, // A8, PB0 + 17, // A9, PB1 + 32, // A10, PC0 + 33, // A11, PC1 + 34, // A12, PC2 + 35, // A13, PC3 + 36, // A14, PC4 + 37, // A15, PC5 + 86, // A16, PF6 + 87, // A17, PF7 + 88, // A18, PF8 + 89, // A19, PF9 + 90 // A20, PF10 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; + + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + Error_Handler(); + } + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { + Error_Handler(); + } + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { + Error_Handler(); + } +} + + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h new file mode 100644 index 0000000000..fb878f8b78 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h @@ -0,0 +1,232 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +#define PA0 0 +#define PA1 1 +#define PA2 2 +#define PA3 3 +#define PA4 4 +#define PA5 5 +#define PA6 6 +#define PA7 7 +#define PA8 8 +#define PA9 9 +#define PA10 10 +#define PA11 11 +#define PA12 12 +#define PA13 13 +#define PA14 14 +#define PA15 15 + +#define PB0 16 +#define PB1 17 +#define PB2 18 +#define PB3 19 +#define PB4 20 +#define PB5 21 +#define PB6 22 +#define PB7 23 +#define PB8 24 +#define PB9 25 +#define PB10 26 +#define PB11 27 +#define PB12 28 +#define PB13 29 +#define PB14 30 +#define PB15 31 + +#define PC0 32 +#define PC1 33 +#define PC2 34 +#define PC3 35 +#define PC4 36 +#define PC5 37 +#define PC6 38 +#define PC7 39 +#define PC8 40 +#define PC9 41 +#define PC10 42 +#define PC11 43 +#define PC12 44 +#define PC13 45 +#define PC14 46 +#define PC15 47 + +#define PD0 48 +#define PD1 49 +#define PD2 50 +#define PD3 51 +#define PD4 52 +#define PD5 53 +#define PD6 54 +#define PD7 55 +#define PD8 56 +#define PD9 57 +#define PD10 58 +#define PD11 59 +#define PD12 60 +#define PD13 61 +#define PD14 62 +#define PD15 63 + +#define PE0 64 +#define PE1 65 +#define PE2 66 +#define PE3 67 +#define PE4 68 +#define PE5 69 +#define PE6 70 +#define PE7 71 +#define PE8 72 +#define PE9 73 +#define PE10 74 +#define PE11 75 +#define PE12 76 +#define PE13 77 +#define PE14 78 +#define PE15 79 + +#define PF0 80 +#define PF1 81 +#define PF2 82 +#define PF3 83 +#define PF4 84 +#define PF5 85 +#define PF6 86 +#define PF7 87 +#define PF8 88 +#define PF9 89 +#define PF10 90 +#define PF11 91 +#define PF12 92 +#define PF13 93 +#define PF14 94 +#define PF15 95 + +#define PG0 96 +#define PG1 97 +#define PG2 98 +#define PG3 99 +#define PG4 100 +#define PG5 101 +#define PG6 102 +#define PG7 103 +#define PG8 104 +#define PG9 105 +#define PG10 106 +#define PG11 107 +#define PG12 108 +#define PG13 109 +#define PG14 110 +#define PG15 111 + +// This must be a literal +#define NUM_DIGITAL_PINS 112 +#define NUM_ANALOG_INPUTS 21 + +// On-board LED pin number +#ifdef ARDUINO_VCCGND_F103ZET6_MINI +#define LED_BUILTIN PG15 +#elif defined(ARDUINO_VCCGND_F103ZET6) +#define LED_BUILTIN PC13 +#elif !defined(LED_BUILTIN) +#define LED_BUILTIN PC13 +#endif + +// On-board user button +#ifndef USER_BTN +#define USER_BTN PB1 +#endif + +// SPI Definitions +#ifdef ARDUINO_VCCGND_F103ZET6 +#define PIN_SPI_SS PA15 +#define PIN_SPI_MOSI PB5 +#define PIN_SPI_MISO PB4 +#define PIN_SPI_SCK PB3 +#else +#define PIN_SPI_SS PC4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 +#endif + +// I2C Definitions +#define PIN_WIRE_SDA PB7 +#define PIN_WIRE_SCL PB6 + +// Timer Definitions (optional) +// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin +#define TIMER_TONE TIM6 +#define TIMER_SERVO TIM7 + +// UART Definitions +// Define here Serial instance number to map on Serial generic name +#define SERIAL_UART_INSTANCE 1 + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +// Default pin used for 'Serial2' instance +#define PIN_SERIAL2_RX PA3 +#define PIN_SERIAL2_TX PA2 + +// Default pin used for 'Serial3' instance +#define PIN_SERIAL3_RX PB11 +#define PIN_SERIAL3_TX PB10 + +/* Extra HAL modules */ +#define HAL_DAC_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE Serial1 +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests index 99d41ef4ad..d635062205 100644 --- a/buildroot/tests/mks_robin-tests +++ b/buildroot/tests/mks_robin-tests @@ -1,13 +1,16 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 genericSTM32F103ZE +# Build tests for MKS Robin +# (STM32F1 genericSTM32F103ZE) # # exit on first failure set -e use_example_configs Mks/Robin -exec_test $1 $2 "Default Configuration" +opt_disable TFT_320x240 +opt_enable FSMC_GRAPHICAL_TFT +exec_test $1 $2 "MKS Robin base configuration" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests index c8ba5a5a48..1c40ea4535 100644 --- a/buildroot/tests/mks_robin_mini-tests +++ b/buildroot/tests/mks_robin_mini-tests @@ -1,6 +1,7 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 genericSTM32F103VE +# Build tests for MKS Robin mini +# (STM32F1 genericSTM32F103VE) # # exit on first failure @@ -10,7 +11,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_MINI opt_set EXTRUDERS 1 opt_set TEMP_SENSOR_1 0 -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "MKS Robin mini" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_nano-tests b/buildroot/tests/mks_robin_nano-tests index 809fd6e6f5..d3df7e2e5a 100644 --- a/buildroot/tests/mks_robin_nano-tests +++ b/buildroot/tests/mks_robin_nano-tests @@ -1,6 +1,7 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 genericSTM32F103VE +# Build tests for MKS Robin nano +# (STM32F1 genericSTM32F103VE) # # exit on first failure @@ -8,7 +9,7 @@ set -e use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "MKS Robin nano" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_stm32-tests b/buildroot/tests/mks_robin_stm32-tests new file mode 100644 index 0000000000..4aa146fa52 --- /dev/null +++ b/buildroot/tests/mks_robin_stm32-tests @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# +# Build tests for MKS Robin (HAL/STM32) +# + +# exit on first failure +set -e + +use_example_configs Mks/Robin +exec_test $1 $2 "MKS Robin base configuration" + +# cleanup +restore_configs diff --git a/platformio.ini b/platformio.ini index 24d416444f..2f7059e488 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,7 +26,7 @@ include_dir = Marlin # [common] default_src_filter = + - - + - - - - - + - - - - - - - - - - - @@ -62,6 +62,7 @@ USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 DWIN_CREALITY_LCD = src_filter=+ HAS_CHARACTER_LCD = src_filter=+ +HAS_GRAPHICAL_TFT = src_filter=+ HAS_LCD_MENU = src_filter=+ HAS_DGUS_LCD = src_filter=+ TOUCH_UI_FTDI_EVE = src_filter=+ @@ -603,6 +604,28 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common_stm32f1.build_flags} -DSS_TIMER=4 -DSTM32_XL_DENSITY +# MKS Robin (STM32F103ZET6) +# Uses HAL STM32 to support Marlin UI for TFT screen with optional touch panel +# +[env:mks_robin_stm32] +platform = ${common_stm32.platform} +extends = common_stm32 +board = genericSTM32F103ZE +board_build.core = stm32 +board_build.variant = MARLIN_F103Zx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.firmware = Robin.bin +build_flags = ${common_stm32.build_flags} + -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 +build_unflags = ${common_stm32.build_unflags} + -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py +lib_deps = + # # MKS Robin Pro (STM32F103ZET6) # From ed5ae0a2f755ab58b4893aa371406b330fec543e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 28 Jul 2020 18:13:20 -0500 Subject: [PATCH 0022/1370] Update include_tree --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 2f7059e488..0b1155abad 100644 --- a/platformio.ini +++ b/platformio.ini @@ -991,4 +991,4 @@ src_filter = ${common.default_src_filter} + platform = atmelavr board = megaatmega2560 build_flags = -c -H -std=gnu++11 -Wall -Os -D__MARLIN_FIRMWARE__ -src_filter = + +src_filter = + From db290201eabfc42161281cbd4e360eda81acd391 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 30 Jul 2020 02:07:29 -0500 Subject: [PATCH 0023/1370] Add monitor_flags --- platformio.ini | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platformio.ini b/platformio.ini index 0b1155abad..790d6f9d0f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -89,6 +89,15 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common.build_flags} lib_deps = ${common.lib_deps} monitor_speed = 250000 +monitor_flags = + --quiet + --echo + --eol + LF + --filter + colorize + --filter + time ################################# # # From afb51d1de35cb634a44e1271ccd7cdd5df73b6cf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 30 Jul 2020 02:27:52 -0500 Subject: [PATCH 0024/1370] Repair config order --- Marlin/Configuration.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 363ea2f351..9d1f7862bb 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2166,18 +2166,18 @@ // //#define TFT_DRIVER AUTO -// -// FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) -// Upscaled 128x64 Marlin UI -// -//#define FSMC_GRAPHICAL_TFT - // // SPI display (MKS Robin Nano V2.0, MKS Gen L V2.0) // Upscaled 128x64 Marlin UI // //#define SPI_GRAPHICAL_TFT +// +// FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) +// Upscaled 128x64 Marlin UI +// +//#define FSMC_GRAPHICAL_TFT + // // TFT LVGL UI // From b66df5fa3c464b20cad088e279edf1e14e3ea305 Mon Sep 17 00:00:00 2001 From: Slats <2580606+mslattery@users.noreply.github.com> Date: Sun, 2 Aug 2020 21:00:06 -0400 Subject: [PATCH 0025/1370] Translated DWIN screen titles (#18893) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dwin/dwin.cpp | 20 +++-- Marlin/src/lcd/dwin/dwin_lcd.cpp | 135 ++++++++++++++++++++++++------- 2 files changed, 116 insertions(+), 39 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index f8c1819c51..0daaf3982a 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -379,6 +379,10 @@ inline void Draw_Title(const char * const title) { DWIN_Draw_String(false, false, HEADER_FONT, White, Background_blue, 14, 4, (char*)title); } +inline void Draw_Title(const __FlashStringHelper * title) { + DWIN_Draw_String(false, false, HEADER_FONT, White, Background_blue, 14, 4, (char*)title); +} + inline void Clear_Menu_Area(void) { DWIN_Draw_Rectangle(1, Background_black, 0, 31, 272, 360); } @@ -568,7 +572,7 @@ inline void Draw_Prepare_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Prepare"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_PREPARE)); #else DWIN_Frame_AreaCopy(1, 178, 2, 271 - 42, 479 - 464 - 1, 14, 8); // "Prepare" #endif @@ -611,7 +615,7 @@ inline void Draw_Control_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Control"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_CONTROL)); #else DWIN_Frame_AreaCopy(1, 128, 2, 271 - 95, 479 - 467, 14, 8); #endif @@ -656,7 +660,7 @@ inline void Draw_Tune_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Tune"); // TODO: GET_TEXT + Draw_Title(GET_TEXT_F(MSG_TUNE)); #else DWIN_Frame_AreaCopy(1, 94, 2, 271 - 145, 479 - 467, 14, 9); #endif @@ -730,7 +734,7 @@ inline void Draw_Motion_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Motion"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_MOTION)); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); #endif @@ -947,7 +951,7 @@ void Goto_MainMenu(void) { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Home"); // TODO: GET_TEXT + Draw_Title(GET_TEXT_F(MSG_MAIN)); #else DWIN_Frame_AreaCopy(1, 0, 2, 271 - 232, 479 - 467, 14, 9); #endif @@ -1714,7 +1718,7 @@ inline void Draw_Info_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Info"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_INFO_SCREEN)); #else DWIN_Frame_AreaCopy(1, 190, 16, 271 - 56, 479 - 453, 14, 8); #endif @@ -2091,7 +2095,7 @@ inline void Draw_Move_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Move"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_MOVE_AXIS)); #else DWIN_Frame_AreaCopy(1, 231, 2, 271 - 6, 479 - 467, 14, 8); #endif @@ -2245,7 +2249,7 @@ void Draw_Temperature_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Temperature"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); #endif diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 3c14a95936..0ca6b8a3ae 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -21,11 +21,11 @@ */ /******************************************************************************** - * @file dwin_lcd.c + * @file dwin_lcd.cpp * @author LEO / Creality3D * @date 2019/07/18 * @version 2.0.1 - * @brief 迪文å±æŽ§åˆ¶æ“作函数 + * @brief DWIN screen control functions ********************************************************************************/ #include "../../inc/MarlinConfigPre.h" @@ -68,7 +68,15 @@ inline void DWIN_String(size_t &i, char * const string) { i += len; } -/*å‘é€å½“å‰BUF中的数æ®ä»¥åŠåŒ…å°¾æ•°æ® len:整包数æ®é•¿åº¦*/ +inline void DWIN_String(size_t &i, const __FlashStringHelper * string) { + if (!string) return; + const size_t len = strlen_P((PGM_P)string); // cast it to PGM_P, which is basically const char *, and measure it using the _P version of strlen. + if (len == 0) return; + memcpy(&DWIN_SendBuf[i+1], string, len); + i += len; +} + +// Send the data in the buffer and the packet end inline void DWIN_Send(size_t &i) { ++i; LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); @@ -77,8 +85,9 @@ inline void DWIN_Send(size_t &i) { delayMicroseconds(1); } } -/*----------------------------------------------系统å˜é‡å‡½æ•°----------------------------------------------*/ -/*æ¡æ‰‹ 1: æ¡æ‰‹æˆåŠŸ 2: æ¡æ‰‹å¤±è´¥*/ +/*-------------------------------------- System variable function --------------------------------------*/ + +// Handshake (1: Success, 0: Fail) bool DWIN_Handshake(void) { size_t i = 0; DWIN_Byte(i, 0x00); @@ -105,7 +114,8 @@ bool DWIN_Handshake(void) { && databuf[3] == 'K' ); } -/*设定背光亮度 luminance:亮度(0x00~0xFF)*/ +// Set the backlight luminance +// luminance: (0x00-0xFF) void DWIN_Backlight_SetLuminance(const uint8_t luminance) { size_t i = 0; DWIN_Byte(i, 0x30); @@ -113,7 +123,8 @@ void DWIN_Backlight_SetLuminance(const uint8_t luminance) { DWIN_Send(i); } -/*设定画é¢æ˜¾ç¤ºæ–¹å‘ dir:0,0°; 1,90°; 2,180°; 3,270°*/ +// Set screen display direction +// dir: 0=0°, 1=90°, 2=180°, 3=270° void DWIN_Frame_SetDir(uint8_t dir) { size_t i = 0; DWIN_Byte(i, 0x34); @@ -123,15 +134,17 @@ void DWIN_Frame_SetDir(uint8_t dir) { DWIN_Send(i); } -/*更新显示*/ +// Update display void DWIN_UpdateLCD(void) { size_t i = 0; DWIN_Byte(i, 0x3D); DWIN_Send(i); } -/*----------------------------------------------绘图相关函数----------------------------------------------*/ -/*ç”»é¢æ¸…å± color:清å±é¢œè‰²*/ +/*---------------------------------------- Drawing functions ----------------------------------------*/ + +// Clear screen +// color: Clear screen color void DWIN_Frame_Clear(const uint16_t color) { size_t i = 0; DWIN_Byte(i, 0x01); @@ -139,7 +152,10 @@ void DWIN_Frame_Clear(const uint16_t color) { DWIN_Send(i); } -/*ç”»é¢ç”»çº¿ color:线段颜色 xStart:X起始åæ ‡ yStart:Y起始åæ ‡ xEnd:X终止åæ ‡ yEnd:Y终止åæ ‡*/ +// Draw a line +// color: Line segment color +// xStart/yStart: Start point +// xEnd/yEnd: End point void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; DWIN_Byte(i, 0x03); @@ -151,7 +167,11 @@ void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t x DWIN_Send(i); } -/*ç”»é¢ç”»çŸ©å½¢ mode:0,外框;1,å¡«å……;2,异或填充 color:颜色 xStart/yStart:矩形左上åæ ‡ xEnd/yEnd:矩形å³ä¸‹åæ ‡*/ +// Draw a rectangle +// mode: 0=frame, 1=fill, 2=XOR fill +// color: Rectangle color +// xStart/yStart: upper left point +// xEnd/yEnd: lower right point void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; @@ -165,8 +185,14 @@ void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, DWIN_Send(i); } -/*ç”»é¢åŒºåŸŸç§»åŠ¨ mode:0,环移;1,平移 dir:0,å‘左移动;1,å‘å³ç§»åŠ¨;2,å‘上移动;3,å‘下移动 dis:移动è·ç¦» - color:填充颜色 xStart/yStart:选定区域左上åæ ‡ xEnd/yEnd:选定区域å³ä¸‹åæ ‡*/ +// +// Move a screen area +// mode: 0, circle shift; 1, translation +// dir: 0=left, 1=right, 2=up, 3=down +// dis: Distance +// color: Fill color +// xStart/yStart: upper left point +// xEnd/yEnd: bottom right point void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; @@ -181,14 +207,21 @@ void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, DWIN_Send(i); } -/*----------------------------------------------文本相关函数----------------------------------------------*/ -/*ç”»é¢æ˜¾ç¤ºå­—符串 widthAdjust:true,自调整字符宽度;false,ä¸è°ƒæ•´å­—符宽度 bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 x/y:字符串左上åæ ‡ *string:字符串*/ +/*---------------------------------------- Text related functions ----------------------------------------*/ + +// Draw a string +// widthAdjust: true=self-adjust character width; false=no adjustment +// bShow: true=display background color; false=don't display background color +// size: Font size +// color: Character color +// bColor: Background color +// x/y: Upper-left coordinate of the string +// *string: The string void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, char *string) { size_t i = 0; DWIN_Byte(i, 0x11); - DWIN_Byte(i, (widthAdjust? 0x80:0x00) | (bShow? 0x40:0x00) | size); + DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); DWIN_Word(i, color); DWIN_Word(i, bColor); DWIN_Word(i, x); @@ -197,13 +230,34 @@ void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, DWIN_Send(i); } -/*ç”»é¢æ˜¾ç¤ºæ­£æ•´æ•° bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² zeroFill:true,补零;false,ä¸è¡¥é›¶ zeroMode:1,无效0显示为0; 0,无效0显示为空格 size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 iNum:ä½æ•° x/y:å˜é‡å·¦ä¸Šåæ ‡ value:æ•´åž‹å˜é‡*/ +void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, + uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const __FlashStringHelper *string) { + size_t i = 0; + DWIN_Byte(i, 0x11); + DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); + DWIN_Word(i, color); + DWIN_Word(i, bColor); + DWIN_Word(i, x); + DWIN_Word(i, y); + DWIN_String(i, string); + DWIN_Send(i); +} + +// Draw a positive integer +// bShow: true=display background color; false=don't display background color +// zeroFill: true=zero fill; false=no zero fill +// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space +// size: Font size +// color: Character color +// bColor: Background color +// iNum: Number of digits +// x/y: Upper-left coordinate +// value: Integer value void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint16_t value) { size_t i = 0; DWIN_Byte(i, 0x14); - DWIN_Byte(i, (bShow? 0x80:0x00) | (zeroFill? 0x20:0x00) | (zeroMode? 0x10:0x00) | size); + DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); DWIN_Word(i, color); DWIN_Word(i, bColor); DWIN_Byte(i, iNum); @@ -214,7 +268,7 @@ void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t for (char count = 0; count < 8; count++) { DWIN_Byte(i, value); value >>= 8; - if ((value&0xFF) == 0x00) break; + if (!(value & 0xFF)) break; } #else // Write a big-endian 64 bit integer @@ -229,14 +283,23 @@ void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t DWIN_Send(i); } -/*ç”»é¢æ˜¾ç¤ºæµ®ç‚¹æ•° bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² zeroFill:true,补零;false,ä¸è¡¥é›¶ zeroMode:1,无效0显示为0; 0,无效0显示为空格 size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 iNum:æ•´æ•°ä½æ•° fNum:å°æ•°ä½æ•° x/y:å˜é‡å·¦ä¸Šåæ ‡ value:浮点数å˜é‡*/ +// Draw a floating point number +// bShow: true=display background color; false=don't display background color +// zeroFill: true=zero fill; false=no zero fill +// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space +// size: Font size +// color: Character color +// bColor: Background color +// iNum: Number of whole digits +// fNum: Number of decimal digits +// x/y: Upper-left point +// value: Float value void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { //uint8_t *fvalue = (uint8_t*)&value; size_t i = 0; DWIN_Byte(i, 0x14); - DWIN_Byte(i, (bShow? 0x80:0x00) | (zeroFill? 0x20:0x00) | (zeroMode? 0x10:0x00) | size); + DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); DWIN_Word(i, color); DWIN_Word(i, bColor); DWIN_Byte(i, iNum); @@ -253,16 +316,21 @@ void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_ DWIN_Send(i); } -/*----------------------------------------------图片相关函数----------------------------------------------*/ -/*jpg图片显示并缓存在#0虚拟显示区 id:图片ID*/ +/*---------------------------------------- Picture related functions ----------------------------------------*/ + +// Draw JPG and cached in #0 virtual display area +// id: Picture ID void DWIN_JPG_ShowAndCache(const uint8_t id) { size_t i = 0; DWIN_Word(i, 0x2200); DWIN_Byte(i, id); - DWIN_Send(i); //AA 23 00 00 00 00 08 00 01 02 03 CC 33 C3 3C + DWIN_Send(i); // AA 23 00 00 00 00 08 00 01 02 03 CC 33 C3 3C } -/*图标显示 libID:图标库ID picID:图标ID x/y:图标左上åæ ‡*/ +// Draw an Icon +// libID: Icon library ID +// picID: Icon ID +// x/y: Upper-left point void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { NOMORE(x, DWIN_WIDTH - 1); NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl @@ -275,7 +343,8 @@ void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { DWIN_Send(i); } -/*jpg图片解压到#1虚拟显示区 id:图片ID*/ +// Unzip the JPG picture to virtual display area #1 +// id: picture ID void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { size_t i = 0; DWIN_Byte(i, 0x25); @@ -284,7 +353,11 @@ void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { DWIN_Send(i); } -/*从虚拟显示区å¤åˆ¶åŒºåŸŸè‡³å½“å‰ç”»é¢ cacheID:è™šæ‹ŸåŒºå· xStart/yStart:虚拟区左上åæ ‡ xEnd/yEnd:虚拟区å³ä¸‹åæ ‡ x/y:当å‰ç”»é¢ç²˜è´´åæ ‡*/ +// Copy area from virtual display area to current screen +// cacheID: virtual area number +// xStart/yStart: Upper-left of virtual area +// xEnd/yEnd: Lower-right of virtual area +// x/y: Screen paste point void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y) { size_t i = 0; From e6c95762bac1e574b1e36a3c2e45a834d1f345fa Mon Sep 17 00:00:00 2001 From: Sebastien Andrivet Date: Mon, 3 Aug 2020 03:10:16 +0200 Subject: [PATCH 0026/1370] Fix Duplicator i3 Plus pin diagram (#18862) --- Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h index 21c3f6dbfe..de80851df0 100644 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -113,7 +113,7 @@ * # Pin | ATMEGA2560 Pin | Arduino # * ################################## * # 1 | 52 / PG1 (!RD) | 40 # - * # 2 | 95 / PF2 (A2) | 2 # + * # 2 | 95 / PF2 (A2) | 56 # * # 3 | 54 / PC1 (A9) | 36 # * # 4 | 53 / PC0 (A8) | 37 # * # 5 | 56 / PC3 (A11) | 34 # From 0e2013d24405435bccc8bfa509bd10d4ee5119f3 Mon Sep 17 00:00:00 2001 From: FLYmaker <49380822+FLYmaker@users.noreply.github.com> Date: Mon, 3 Aug 2020 09:13:57 +0800 Subject: [PATCH 0027/1370] Fix FLYF407ZG pins (#18865) --- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 42 ++- .../variants/FLY_F407ZG/PeripheralPins.c | 338 +++++++++--------- .../variants/FLY_F407ZG/variant.cpp | 226 ++++++------ .../PlatformIO/variants/FLY_F407ZG/variant.h | 235 ++++++------ 4 files changed, 442 insertions(+), 399 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 497db5817b..499edc8dc0 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -31,7 +31,26 @@ #define BOARD_WEBSITE_URL "github.com/FLYmaker/FLYF407ZG" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB +// +// EEPROM Emulation +// +#if NO_EEPROM_SELECTED + #define FLASH_EEPROM_EMULATION + //#define SRAM_EEPROM_EMULATION + //#define I2C_EEPROM +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across + // the 128kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#elif ENABLED(I2C_EEPROM) + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB +#endif + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif // // Servos @@ -139,14 +158,14 @@ #define HEATER_2_PIN PE6 #define HEATER_3_PIN PE5 #define HEATER_4_PIN PE4 -#define HEATER_5_PIN PA2 +#define HEATER_5_PIN PE3 #define HEATER_BED_PIN PE2 #ifndef FAN_PIN #define FAN_PIN PF8 #endif #define FAN1_PIN PF9 -#define FAN2_PIN PE3 +#define FAN2_PIN PA2 #define FAN3_PIN PA1 #define FAN4_PIN PE13 #define FAN5_PIN PB11 @@ -168,8 +187,8 @@ #endif #if SD_CONNECTION_IS(ONBOARD) - #define SDIO_SUPPORT // Use SDIO for onboard SD + #define SDIO_SUPPORT // Use SDIO for onboard SD #ifndef SDIO_SUPPORT #define SOFTWARE_SPI // Use soft SPI for onboard SD #define SDSS SDIO_D3_PIN @@ -177,6 +196,15 @@ #define MISO_PIN SDIO_D0_PIN #define MOSI_PIN SDIO_CMD_PIN #endif + +#elif SD_CONNECTION_IS(LCD) + + #define SCK_PIN PB13 + #define MISO_PIN PB14 + #define MOSI_PIN PB15 + #define SDSS PF11 + #define SD_DETECT_PIN PB2 + #endif // @@ -232,11 +260,7 @@ // // LCD / Controller // -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SDSS PF11 -#define SD_DETECT_PIN PB2 + #define BEEPER_PIN PB10 #define LCD_PINS_RS PE12 #define LCD_PINS_ENABLE PE14 diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c index 5cce88b175..d621325aa3 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c @@ -45,26 +45,26 @@ const PinMap PinMap_ADC[] = { {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + //{PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 // {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + //{PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + //{PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + //{PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 @@ -73,21 +73,21 @@ const PinMap PinMap_ADC[] = { // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 // {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 // {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 + //{PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 + //{PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 + //{PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 // {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 {NC, NP, 0} @@ -98,8 +98,8 @@ const PinMap PinMap_ADC[] = { #ifdef HAL_DAC_MODULE_ENABLED const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 {NC, NP, 0} }; #endif @@ -109,21 +109,21 @@ const PinMap PinMap_DAC[] = { #ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SDA[] = { {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; #endif #ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SCL[] = { - {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; #endif @@ -132,78 +132,93 @@ const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED const PinMap PinMap_PWM[] = { - {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + + + + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 +// {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + + // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 +// {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + + // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + + // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + // {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + + //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + + // {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + + //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {NC, NP, 0} }; #endif @@ -212,17 +227,17 @@ const PinMap PinMap_PWM[] = { #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_TX[] = { - {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; @@ -230,17 +245,17 @@ const PinMap PinMap_UART_TX[] = { #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_RX[] = { - {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; @@ -248,26 +263,26 @@ const PinMap PinMap_UART_RX[] = { #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_RTS[] = { - {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +// {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, +// {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, +// {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, +// {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, +// {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, +// {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +// {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; #endif #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_CTS[] = { - {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +// {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, +// {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, +// {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, +// {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, +// {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, +// {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +// {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; #endif @@ -277,11 +292,11 @@ const PinMap PinMap_UART_CTS[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, +//{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; #endif @@ -289,11 +304,11 @@ const PinMap PinMap_SPI_MOSI[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, +//{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; #endif @@ -301,11 +316,11 @@ const PinMap PinMap_SPI_MISO[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, +//{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; #endif @@ -313,11 +328,11 @@ const PinMap PinMap_SPI_SCLK[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, +//{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {NC, NP, 0} }; #endif @@ -326,22 +341,22 @@ const PinMap PinMap_SPI_SSEL[] = { #ifdef HAL_CAN_MODULE_ENABLED const PinMap PinMap_CAN_RD[] = { - {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, +//{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, +//{PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; #endif #ifdef HAL_CAN_MODULE_ENABLED const PinMap PinMap_CAN_TD[] = { - {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, +//{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, +//{PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; #endif @@ -349,7 +364,7 @@ const PinMap PinMap_CAN_TD[] = { //*** ETHERNET *** #ifdef HAL_ETH_MODULE_ENABLED -const PinMap PinMap_Ethernet[] = { +const PinMap PinMap_Ethernet[] = {/* {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO @@ -374,6 +389,7 @@ const PinMap PinMap_Ethernet[] = { {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 {NC, NP, 0} + */ }; #endif @@ -394,26 +410,26 @@ const PinMap PinMap_USB_OTG_FS[] = { #ifdef HAL_PCD_MODULE_ENABLED const PinMap PinMap_USB_OTG_HS[] = { -#ifdef USE_USB_HS_IN_FS - {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP -#else - {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK - {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT -#endif /* USE_USB_HS_IN_FS */ +//#ifdef USE_USB_HS_IN_FS +// {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF +// {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID +// {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS +// {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM +// {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP +// #else +// {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 +// {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK +// {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 +// {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 +// {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 +// {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 +// {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 +// {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 +// {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 +// {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP +// {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR +// {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT +//#endif /* USE_USB_HS_IN_FS */ {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp index 82cfc573dc..1c7aedd9ac 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp @@ -36,118 +36,120 @@ extern "C" { const PinName digitalPin[] = { - PB_12, - PB_13, - PB_14, - PB_15, - PD_8, - PD_9, - PD_10, - PD_11, - PD_12, - PD_13, - PD_14, - PD_15, - PG_2, - PG_3, - PG_4, - PG_5, - PG_6, - PG_7, - PG_8, - PC_6, - PC_7, - PC_8, - PC_9, - PA_8, - PA_9, - PA_10, - PA_11, - PA_12, - PA_13, - PA_14, - PA_15, - PC_10, - PC_11, - PC_12, - PD_0, - PD_1, - PD_2, - PD_3, - PD_4, - PD_5, - PD_6, - PD_7, - PG_9, - PG_10, - PG_11, - PG_12, - PG_13, - PG_14, - PG_15, - PB_3, - PB_4, - PB_5, - PB_6, - PB_7, - PB_8, - PB_9, - PB_10, - PB_11, - PE_14, - PE_15, - PE_12, - PE_13, - PE_10, - PE_11, - PE_8, - PE_9, - PG_1, - PE_7, - PF_15, - PG_0, - PF_13, - PF_14, - PF_11, - PF_12, - PB_2, - PB_1, - PC_5, - PB_0, - PA_7, - PC_4, - PA_5, - PA_6, - PA_3, - PA_4, - PA_1, - PA_2, - PC_3, - PA_0, - PC_1, - PC_2, - PC_0, - PF_8, - PF_6, - PF_7, - PF_9, - PF_10, - PF_4, - PF_5, - PF_2, - PF_3, - PF_0, - PF_1, - PE_6, - PC_13, - PE_4, - PE_5, - PE_2, - PE_3, - PE_0, - PE_1, - PC_14, - PC_15, +PA_1, +PA_2, +PA_3, +PA_4, +PA_5, +PA_6, +PA_7, +PA_8, +PA_9, +PA_10, +PA_11, +PA_12, +PA_13, +PA_14, +PA_15, +PB_0, +PB_1, +PB_2, +PB_3, +PB_4, +PB_5, +PB_6, +PB_7, +PB_8, +PB_9, +PB_10, +PB_11, +PB_12, +PB_13, +PB_14, +PB_15, +PC_2, +PC_3, +PC_4, +PC_5, +PC_6, +PC_7, +PC_8, +PC_9, +PC_10, +PC_11, +PC_12, +PC_13, +PC_14, +PC_15, +PD_0, +PD_1, +PD_2, +PD_3, +PD_4, +PD_5, +PD_6, +PD_7, +PD_8, +PD_9, +PD_10, +PD_11, +PD_12, +PD_13, +PD_14, +PD_15, +PE_0, +PE_1, +PE_11, +PE_3, +PE_4, +PE_5, +PE_6, +PE_7, +PE_8, +PE_9, +PE_10, +PE_2, +PE_12, +PE_13, +PE_14, +PE_15, +PF_0, +PF_1, +PF_2, +PF_6, +PF_7, +PF_8, +PF_9, +PF_11, +PF_12, +PF_13, +PF_14, +PF_15, +PG_0, +PG_1, +PG_2, +PG_3, +PG_4, +PG_5, +PG_6, +PG_7, +PG_8, +PG_9, +PG_10, +PG_11, +PG_12, +PG_13, +PG_14, +PG_15, +PH_0, +PH_1, +PA_0, +PC_1, +PC_0, +PF_10, +PF_5, +PF_4, +PF_3, }; #ifdef __cplusplus diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h index 87033a68e5..ae973c89c5 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h @@ -38,126 +38,127 @@ extern "C" { * Pins *----------------------------------------------------------------------------*/ -// Left Side -#define PB12 0 -#define PB13 1 -#define PB14 2 -#define PB15 3 -#define PD8 4 -#define PD9 5 -#define PD10 6 -#define PD11 7 -#define PD12 8 -#define PD13 9 -#define PD14 10 -#define PD15 11 -#define PG2 12 -#define PG3 13 -#define PG4 14 -#define PG5 15 -#define PG6 16 -#define PG7 17 -#define PG8 18 -#define PC6 19 -#define PC7 20 -#define PC8 21 -#define PC9 22 -#define PA8 23 -#define PA9 24 -#define PA10 25 -#define PA11 26 // USB_DM -#define PA12 27 // USB_DP -#define PA13 28 -#define PA14 29 -#define PA15 30 -#define PC10 31 -#define PC11 32 -#define PC12 33 -#define PD0 34 -#define PD1 35 -#define PD2 36 -#define PD3 37 -#define PD4 38 -#define PD5 39 -#define PD6 40 -#define PD7 41 -#define PG9 42 -#define PG10 43 -#define PG11 44 -#define PG12 45 -#define PG13 46 -#define PG14 47 -#define PG15 48 -#define PB3 49 -#define PB4 50 -#define PB5 51 -#define PB6 52 -#define PB7 53 -#define PB8 54 -#define PB9 55 -// Right Side -#define PB10 56 -#define PB11 57 -#define PE14 58 -#define PE15 59 -#define PE12 60 -#define PE13 61 -#define PE10 62 -#define PE11 63 -#define PE8 64 -#define PE9 65 -#define PG1 66 -#define PE7 67 -#define PF15 68 -#define PG0 69 -#define PF13 70 -#define PF14 71 -#define PF11 72 -#define PF12 73 -#define PB2 74 -#define PB1 75 // A0 -#define PC5 76 // A1 -#define PB0 77 // A2 -#define PA7 78 // A3 -#define PC4 79 // A4 -#define PA5 80 // A5 -#define PA6 81 // A6 -#define PA3 82 // A7 -#define PA4 83 // A8 -#define PA1 84 // A9 -#define PA2 85 // A10 -#define PC3 86 // A11 -#define PA0 87 // A12/PA_0(WK_UP): BUT K_UP) -#define PC1 88 // A13 -#define PC2 89 // A14 -#define PC0 90 // A15 -#define PF8 91 // A16 -#define PF6 92 // A17 -#define PF7 93 // A18 -#define PF9 94 // LED D1 (active low) -#define PF10 95 // LED D2 (active low) -#define PF4 96 -#define PF5 97 -#define PF2 98 -#define PF3 99 -#define PF0 100 -#define PF1 101 -#define PE6 102 -#define PC13 103 -#define PE4 104 // BUT K0 -#define PE5 105 // BUT K1 -#define PE2 106 -#define PE3 107 -#define PE0 108 -#define PE1 109 -#define PC14 110 -#define PC15 111 +#define PA1 0 +#define PA2 1 +#define PA3 2 +#define PA4 3 +#define PA5 4 +#define PA6 5 +#define PA7 6 +#define PA8 7 +#define PA9 8 +#define PA10 9 +#define PA11 10 +#define PA12 11 +#define PA13 12 +#define PA14 13 +#define PA15 14 +#define PB0 15 +#define PB1 16 +#define PB2 17 +#define PB3 18 +#define PB4 19 +#define PB5 20 +#define PB6 21 +#define PB7 22 +#define PB8 23 +#define PB9 24 +#define PB10 25 +#define PB11 26 +#define PB12 27 +#define PB13 28 +#define PB14 29 +#define PB15 30 +#define PC2 31 +#define PC3 32 +#define PC4 33 +#define PC5 34 +#define PC6 35 +#define PC7 36 +#define PC8 37 +#define PC9 38 +#define PC10 39 +#define PC11 40 +#define PC12 41 +#define PC13 42 +#define PC14 43 +#define PC15 44 +#define PD0 45 +#define PD1 46 +#define PD2 47 +#define PD3 48 +#define PD4 49 +#define PD5 50 +#define PD6 51 +#define PD7 52 +#define PD8 53 +#define PD9 54 +#define PD10 55 +#define PD11 56 +#define PD12 57 +#define PD13 58 +#define PD14 59 +#define PD15 60 +#define PE0 61 +#define PE1 62 +#define PE11 63 +#define PE3 64 +#define PE4 65 +#define PE5 66 +#define PE6 67 +#define PE7 68 +#define PE8 69 +#define PE9 70 +#define PE10 71 +#define PE2 72 +#define PE12 73 +#define PE13 74 +#define PE14 75 +#define PE15 76 +#define PF0 77 +#define PF1 78 +#define PF2 79 +#define PF6 80 +#define PF7 81 +#define PF8 82 +#define PF9 83 +#define PF11 84 +#define PF12 85 +#define PF13 86 +#define PF14 87 +#define PF15 88 +#define PG0 89 +#define PG1 90 +#define PG2 91 +#define PG3 92 +#define PG4 93 +#define PG5 94 +#define PG6 95 +#define PG7 96 +#define PG8 97 +#define PG9 98 +#define PG10 99 +#define PG11 100 +#define PG12 101 +#define PG13 102 +#define PG14 103 +#define PG15 104 +#define PH0 105 +#define PH1 106 +#define PA0 107 +#define PC1 108 +#define PC0 109 +#define PF10 110 +#define PF5 111 +#define PF4 112 +#define PF3 113 + // This must be a literal -#define NUM_DIGITAL_PINS 112 +#define NUM_DIGITAL_PINS 114 // This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS 23 -#define NUM_ANALOG_FIRST 75 +#define NUM_ANALOG_INPUTS 7 +#define NUM_ANALOG_FIRST 107 // Below SPI and I2C definitions already done in the core From 643b31a6a1d60afb3347d1b3d412e54024c8ad2e Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 3 Aug 2020 13:16:12 +1200 Subject: [PATCH 0028/1370] Fix Spindle/Laser PWM DC (#18871) --- Marlin/src/feature/spindle_laser.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 3dcf6e928a..68261f2fc5 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -66,6 +66,9 @@ void SpindleLaser::init() { void SpindleLaser::set_ocr(const uint8_t ocr) { WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_HIGH); // turn spindle on analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY + set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #endif } void SpindleLaser::ocr_off() { WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Turn spindle off From a0d25379b2333fbd0e0d186549cc48653b267a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus=20N=C3=A4veke?= Date: Mon, 3 Aug 2020 03:17:43 +0200 Subject: [PATCH 0029/1370] No mks_robin extra_scripts in Trigorilla build (#18872) --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index 790d6f9d0f..450fffcc00 100644 --- a/platformio.ini +++ b/platformio.ini @@ -651,6 +651,7 @@ extra_scripts = ${common.extra_scripts} [env:trigorilla_pro] platform = ${common_stm32f1.platform} extends = env:mks_robin +extra_scripts = ${common.extra_scripts} # # MKS Robin E3D (STM32F103RCT6) and From 3bb1f0a7dfbfece9bc46fa622e11b0d4aaf49b4a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 2 Aug 2020 20:34:24 -0500 Subject: [PATCH 0030/1370] Clean up some PeripheralPins --- .../variants/FLY_F407ZG/PeripheralPins.c | 355 +++++++++--------- .../variants/MARLIN_F407VE/PeripheralPins.c | 30 +- 2 files changed, 174 insertions(+), 211 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c index d621325aa3..0ac1d25ce9 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c @@ -31,7 +31,6 @@ #include #include - /* ===== * Note: Commented lines are alternative possibilities which are not used per default. * If you change them, you will have to know what you do @@ -41,46 +40,46 @@ //*** ADC *** #ifdef HAL_ADC_MODULE_ENABLED -const PinMap PinMap_ADC[] = { +WEAK const PinMap PinMap_ADC[] = { {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 //{PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + //{PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - // {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + //{PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 //{PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + //{PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 //{PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 //{PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + //{PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - // {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + //{PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - // {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + //{PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + //{PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + //{PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 @@ -88,7 +87,7 @@ const PinMap PinMap_ADC[] = { //{PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 //{PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 //{PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 - // {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 + //{PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 {NC, NP, 0} }; @@ -97,9 +96,9 @@ const PinMap PinMap_ADC[] = { //*** DAC *** #ifdef HAL_DAC_MODULE_ENABLED -const PinMap PinMap_DAC[] = { - // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 +WEAK const PinMap PinMap_DAC[] = { + //{PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + //{PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 {NC, NP, 0} }; #endif @@ -107,7 +106,7 @@ const PinMap PinMap_DAC[] = { //*** I2C *** #ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SDA[] = { +WEAK const PinMap PinMap_I2C_SDA[] = { {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, //{PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, //{PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, @@ -115,10 +114,8 @@ const PinMap PinMap_I2C_SDA[] = { //{PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SCL[] = { +WEAK const PinMap PinMap_I2C_SCL[] = { //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, //{PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -131,91 +128,88 @@ const PinMap PinMap_I2C_SCL[] = { //*** PWM *** #ifdef HAL_TIM_MODULE_ENABLED -const PinMap PinMap_PWM[] = { - - - - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 +WEAK const PinMap PinMap_PWM[] = { + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - - // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N -// {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N -// {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - // {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - - // {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + + //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 @@ -226,7 +220,7 @@ const PinMap PinMap_PWM[] = { //*** SERIAL *** #ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_TX[] = { +WEAK const PinMap PinMap_UART_TX[] = { //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -241,10 +235,8 @@ const PinMap PinMap_UART_TX[] = { {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_RX[] = { +WEAK const PinMap PinMap_UART_RX[] = { //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -259,30 +251,26 @@ const PinMap PinMap_UART_RX[] = { {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_RTS[] = { -// {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, -// {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, -// {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -// {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, -// {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -// {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, -// {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +WEAK const PinMap PinMap_UART_RTS[] = { + //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_CTS[] = { -// {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, -// {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, -// {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -// {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, -// {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -// {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, -// {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +WEAK const PinMap PinMap_UART_CTS[] = { + //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; #endif @@ -290,49 +278,43 @@ const PinMap PinMap_UART_CTS[] = { //*** SPI *** #ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MOSI[] = { +WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MISO[] = { +WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_SCLK[] = { +WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, -//{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_SSEL[] = { +WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, -//{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, -//{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {NC, NP, 0} }; #endif @@ -340,23 +322,21 @@ const PinMap PinMap_SPI_SSEL[] = { //*** CAN *** #ifdef HAL_CAN_MODULE_ENABLED -const PinMap PinMap_CAN_RD[] = { -//{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, -//{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, -//{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, -//{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, -//{PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +WEAK const PinMap PinMap_CAN_RD[] = { + //{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED -const PinMap PinMap_CAN_TD[] = { -//{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, -//{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, -//{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, -//{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, -//{PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +WEAK const PinMap PinMap_CAN_TD[] = { + //{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; #endif @@ -364,7 +344,8 @@ const PinMap PinMap_CAN_TD[] = { //*** ETHERNET *** #ifdef HAL_ETH_MODULE_ENABLED -const PinMap PinMap_Ethernet[] = {/* +WEAK const PinMap PinMap_Ethernet[] = { + /* {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO @@ -398,38 +379,38 @@ const PinMap PinMap_Ethernet[] = {/* //*** USB *** #ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID +WEAK const PinMap PinMap_USB_OTG_FS[] = { + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_HS[] = { -//#ifdef USE_USB_HS_IN_FS -// {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF -// {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID -// {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS -// {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM -// {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP -// #else -// {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 -// {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK -// {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 -// {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 -// {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 -// {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 -// {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 -// {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 -// {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 -// {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP -// {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR -// {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT -//#endif /* USE_USB_HS_IN_FS */ +WEAK const PinMap PinMap_USB_OTG_HS[] = { + /* + #ifdef USE_USB_HS_IN_FS + {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP + #else + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT + #endif // USE_USB_HS_IN_FS + */ {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c index 6b6cfdbcb0..d3c76713bf 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c @@ -122,9 +122,7 @@ WEAK const PinMap PinMap_I2C_SDA[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -239,9 +237,7 @@ WEAK const PinMap PinMap_UART_TX[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, @@ -259,9 +255,7 @@ WEAK const PinMap PinMap_UART_RX[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -274,9 +268,7 @@ WEAK const PinMap PinMap_UART_RTS[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -303,9 +295,7 @@ WEAK const PinMap PinMap_SPI_MOSI[] = { {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, @@ -315,9 +305,7 @@ WEAK const PinMap PinMap_SPI_MISO[] = { {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, @@ -327,9 +315,7 @@ WEAK const PinMap PinMap_SPI_SCLK[] = { {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, @@ -352,9 +338,7 @@ WEAK const PinMap PinMap_CAN_RD[] = { {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_TD[] = { {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, @@ -388,12 +372,12 @@ WEAK const PinMap PinMap_Ethernet[] = { {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 -#endif + #if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + #endif {NC, NP, 0} }; #endif @@ -411,9 +395,7 @@ WEAK const PinMap PinMap_USB_OTG_FS[] = { {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_HS[] = { #ifdef USE_USB_HS_IN_FS {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF From 7dd7d6dda657d8a5d2655467e39e538974b6738a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 3 Aug 2020 21:55:37 -0500 Subject: [PATCH 0031/1370] Move scaled TFT / touch defines (#18915) --- .../STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp | 4 +- Marlin/src/MarlinCore.cpp | 31 +++-- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 129 +++++++++--------- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 21 --- .../extui/lib/mks_ui/mks_hardware_test.cpp | 3 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 40 +++--- Marlin/src/lcd/lcdprint.h | 22 +++ Marlin/src/lcd/scaled_tft.h | 50 +++++++ Marlin/src/{feature => lcd}/touch/xpt2046.cpp | 37 ++--- Marlin/src/{feature => lcd}/touch/xpt2046.h | 0 Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 39 +++--- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 39 +++--- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 11 +- 14 files changed, 240 insertions(+), 188 deletions(-) create mode 100644 Marlin/src/lcd/scaled_tft.h rename Marlin/src/{feature => lcd}/touch/xpt2046.cpp (87%) rename Marlin/src/{feature => lcd}/touch/xpt2046.h (100%) diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp index 286dcfb5d0..206c3fda3d 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp @@ -20,7 +20,7 @@ #include "../../../inc/MarlinConfig.h" -#if BOTH(HAS_GRAPHICAL_LCD, SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) +#if ENABLED(SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) #include "../HAL.h" #include @@ -232,5 +232,5 @@ uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // SPI_GRAPHICAL_TFT && !FORCE_SOFT_SPI #endif // STM32F1 diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 98f4527eee..74e15250e6 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -39,26 +39,27 @@ #include #include "core/utility.h" -#include "lcd/ultralcd.h" #include "module/motion.h" #include "module/planner.h" -#include "module/stepper.h" #include "module/endstops.h" -#include "module/probe.h" #include "module/temperature.h" -#include "sd/cardreader.h" #include "module/configuration_store.h" #include "module/printcounter.h" // PrintCounter or Stopwatch -#include "feature/closedloop.h" +#include "module/stepper.h" #include "module/stepper/indirection.h" -#include "libs/nozzle.h" - #include "gcode/gcode.h" #include "gcode/parser.h" #include "gcode/queue.h" +#include "sd/cardreader.h" + +#include "lcd/ultralcd.h" +#if HAS_TOUCH_XPT2046 + #include "lcd/touch/xpt2046.h" +#endif + #if HAS_TFT_LVGL_UI #include "lcd/extui/lib/mks_ui/tft_lvgl_configuration.h" #include "lcd/extui/lib/mks_ui/draw_ui.h" @@ -80,10 +81,6 @@ #include "feature/direct_stepping.h" #endif -#if HAS_TOUCH_XPT2046 - #include "feature/touch/xpt2046.h" -#endif - #if ENABLED(HOST_ACTION_COMMANDS) #include "feature/host_actions.h" #endif @@ -92,6 +89,10 @@ #include "libs/buzzer.h" #endif +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + #include "feature/closedloop.h" +#endif + #if HAS_I2C_DIGIPOT #include "feature/digipot/digipot.h" #endif @@ -176,6 +177,10 @@ #include "feature/runout.h" #endif +#if HAS_Z_SERVO_PROBE + #include "module/probe.h" +#endif + #if ENABLED(HOTEND_IDLE_TIMEOUT) #include "feature/hotend_idle.h" #endif @@ -1194,7 +1199,9 @@ void setup() { #endif #if HAS_TFT_LVGL_UI - if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts + #if ENABLED(SDSUPPORT) + if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts + #endif SETUP_RUN(tft_lvgl_init()); #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index d081541c5a..0f6cbcbb8a 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -20,40 +20,39 @@ * */ -/* - - u8g_dev_tft_320x240_upscale_from_128x64.cpp - - Universal 8bit Graphics Library - - Copyright (c) 2011, olikraus@gmail.com - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list - of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ +/** + * u8g_dev_tft_320x240_upscale_from_128x64.cpp + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ #include "../../inc/MarlinConfig.h" @@ -80,14 +79,16 @@ extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); #endif -#define WIDTH LCD_PIXEL_WIDTH +#define WIDTH LCD_PIXEL_WIDTH #define HEIGHT LCD_PIXEL_HEIGHT #define PAGE_HEIGHT 8 -#define X_LO LCD_PIXEL_OFFSET_X -#define Y_LO LCD_PIXEL_OFFSET_Y -#define X_HI (X_LO + (FSMC_UPSCALE) * WIDTH - 1) -#define Y_HI (Y_LO + (FSMC_UPSCALE) * HEIGHT - 1) +#include "../scaled_tft.h" + +#define UPSCALE0(M) ((M) * (FSMC_UPSCALE)) +#define UPSCALE(A,M) (UPSCALE0(M) + (A)) +#define X_HI (UPSCALE(LCD_PIXEL_OFFSET_X, WIDTH) - 1) +#define Y_HI (UPSCALE(LCD_PIXEL_OFFSET_Y, HEIGHT) - 1) // see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html @@ -153,7 +154,6 @@ static uint32_t lcd_id = 0; #define ILI9328_VASTART 0x52 /* Vertical address start position (0-511) */ #define ILI9328_VAEND 0x53 /* Vertical address end position (0-511) */ - static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { #if HAS_LCD_IO #define IO_REG_DATA(R,D) do { LCD_IO_WriteReg(R); LCD_IO_WriteData(D); }while(0) @@ -216,7 +216,6 @@ static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_ static void setWindow_none(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) {} void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) = setWindow_none; - #define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x #define ESC_DELAY(x) 0xFFFF, 0x8000 | (x & 0x7FFF) #define ESC_END 0xFFFF, 0x7FFF @@ -552,20 +551,20 @@ static const uint16_t st9677_init[] = { #define BUTTON_SIZE_Y 20 // 14, 90, 166, 242, 185 are the original values upscaled 2x. - #define BUTTOND_X_LO (14 / 2) * (FSMC_UPSCALE) - #define BUTTOND_X_HI (BUTTOND_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1) + #define BUTTOND_X_LO UPSCALE0(14 / 2) + #define BUTTOND_X_HI (UPSCALE(BUTTOND_X_LO, BUTTON_SIZE_X) - 1) - #define BUTTONA_X_LO (90 / 2) * (FSMC_UPSCALE) - #define BUTTONA_X_HI (BUTTONA_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1) + #define BUTTONA_X_LO UPSCALE0(90 / 2) + #define BUTTONA_X_HI (UPSCALE(BUTTONA_X_LO, BUTTON_SIZE_X) - 1) - #define BUTTONB_X_LO (166 / 2) * (FSMC_UPSCALE) - #define BUTTONB_X_HI (BUTTONB_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1) + #define BUTTONB_X_LO UPSCALE0(166 / 2) + #define BUTTONB_X_HI (UPSCALE(BUTTONB_X_LO, BUTTON_SIZE_X) - 1) - #define BUTTONC_X_LO (242 / 2) * (FSMC_UPSCALE) - #define BUTTONC_X_HI (BUTTONC_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1) + #define BUTTONC_X_LO UPSCALE0(242 / 2) + #define BUTTONC_X_HI (UPSCALE(BUTTONC_X_LO, BUTTON_SIZE_X) - 1) - #define BUTTON_Y_LO (140 / 2) * (FSMC_UPSCALE) + 44 //184 2x, 254 3x - #define BUTTON_Y_HI (BUTTON_Y_LO + (FSMC_UPSCALE) * BUTTON_SIZE_Y - 1) + #define BUTTON_Y_LO UPSCALE0(140 / 2) + 44 // 184 2x, 254 3x + #define BUTTON_Y_HI (UPSCALE(BUTTON_Y_LO, BUTTON_SIZE_Y) - 1) void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) { uint16_t buffer[BUTTON_SIZE_X * sq(FSMC_UPSCALE)]; @@ -584,8 +583,8 @@ static const uint16_t st9677_init[] = { } #if HAS_LCD_IO LOOP_S_L_N(n, 1, FSMC_UPSCALE) - for (uint16_t l = 0; l < length * (FSMC_UPSCALE); l++) - buffer[l + (length * (FSMC_UPSCALE) * n)] = buffer[l]; + for (uint16_t l = 0; l < UPSCALE0(length); l++) + buffer[l + n * UPSCALE0(length)] = buffer[l]; LCD_IO_WriteSequence(buffer, length * sq(FSMC_UPSCALE)); #else @@ -660,27 +659,27 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u } // Clear Screen - setWindow(u8g, dev, 0, 0, LCD_FULL_PIXEL_WIDTH - 1, LCD_FULL_PIXEL_HEIGHT - 1); + setWindow(u8g, dev, 0, 0, (LCD_FULL_PIXEL_WIDTH) - 1, (LCD_FULL_PIXEL_HEIGHT) - 1); #if HAS_LCD_IO - LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT); + LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); #else - memset2(buffer, TFT_MARLINBG_COLOR, 160); - for (uint16_t i = 0; i < 960; i++) - u8g_WriteSequence(u8g, dev, 160, (uint8_t *)buffer); + memset2(buffer, TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) / 2); + for (uint16_t i = 0; i < (LCD_FULL_PIXEL_WIDTH) * 3; i++) + u8g_WriteSequence(u8g, dev, (LCD_FULL_PIXEL_WIDTH) / 2, (uint8_t *)buffer); #endif // Bottom buttons #if HAS_TOUCH_XPT2046 - setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); + setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR); - setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI); + setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI); drawImage(buttonA, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); - setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI); + setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI); drawImage(buttonB, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); - setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); + setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR); #endif // HAS_TOUCH_XPT2046 @@ -690,7 +689,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u case U8G_DEV_MSG_PAGE_FIRST: page = 0; - setWindow(u8g, dev, X_LO, Y_LO, X_HI, Y_HI); + setWindow(u8g, dev, LCD_PIXEL_OFFSET_X, LCD_PIXEL_OFFSET_Y, X_HI, Y_HI); break; case U8G_DEV_MSG_PAGE_NEXT: @@ -708,8 +707,8 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u } #if HAS_LCD_IO LOOP_S_L_N(n, 1, FSMC_UPSCALE) - for (uint16_t l = 0; l < WIDTH * (FSMC_UPSCALE); l++) - buffer[l + WIDTH * (FSMC_UPSCALE) * n] = buffer[l]; + for (uint16_t l = 0; l < UPSCALE0(WIDTH); l++) + buffer[l + n * UPSCALE0(WIDTH)] = buffer[l]; if (allow_async) { if (y > 0 || page > 1) LCD_IO_WaitSequence_Async(); diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 5ebff37edf..40402fe5ac 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -212,30 +212,9 @@ #endif #endif -// LCD_FULL_PIXEL_WIDTH = -// LCD_PIXEL_OFFSET_X + (LCD_PIXEL_WIDTH * 2) + LCD_PIXEL_OFFSET_X -#if TFT_SCALED_DOGLCD - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 320 - #endif - #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 32 - #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 240 - #endif - #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 - #endif -#endif - // For selective rendering within a Y range #define PAGE_OVER(ya) ((ya) <= u8g.getU8g()->current_page.y1) // Does the current page follow a region top? #define PAGE_UNDER(yb) ((yb) >= u8g.getU8g()->current_page.y0) // Does the current page precede a region bottom? #define PAGE_CONTAINS(ya, yb) ((yb) >= u8g.getU8g()->current_page.y0 && (ya) <= u8g.getU8g()->current_page.y1) // Do two vertical regions overlap? -#ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 2 -#endif - extern U8G_CLASS u8g; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index b5b77c50b2..00371d7ab5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -35,9 +35,10 @@ #include "pic_manager.h" #include +#include "../../../touch/xpt2046.h" + #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" -#include "../../../../feature/touch/xpt2046.h" #include "../../../../sd/cardreader.h" uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det2_sta, mt_det3_sta; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 96eedd3296..fc5b8c1bf2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -41,8 +41,11 @@ #include "draw_ui.h" #include -#include "../../../../MarlinCore.h" -#include "../../../../feature/touch/xpt2046.h" +#include "../../../../inc/MarlinConfig.h" + +#if HAS_TOUCH_XPT2046 + #include "../../../touch/xpt2046.h" +#endif #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -50,6 +53,13 @@ #include +#ifndef LCD_FULL_PIXEL_WIDTH + #define LCD_FULL_PIXEL_WIDTH 480 +#endif +#ifndef LCD_FULL_PIXEL_HEIGHT + #define LCD_FULL_PIXEL_HEIGHT 320 +#endif + #if HAS_SPI_FLASH_FONT extern void init_gb2312_font(); #endif @@ -127,9 +137,8 @@ void LCD_WriteRAM_Prepare(void) { void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { //if (DeviceCode == 0x9488) { - if ((x > 480) || (y > 320)) return; + if (x > (LCD_FULL_PIXEL_WIDTH) || y > (LCD_FULL_PIXEL_HEIGHT)) return; //} - //**if ( (x>320)||(y>240) ) return; tft_set_cursor(x, y); LCD_WriteRAM_Prepare(); @@ -187,10 +196,10 @@ void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16 LCD_WriteReg(0x0052, StartY); LCD_WriteReg(0x0051, xEnd); LCD_WriteReg(0x0053, yEnd);*/ - LCD_WriteReg(0x0050, StartY); //Specify the start/end positions of the window address in the horizontal direction by an address unit - LCD_WriteReg(0x0051, yEnd); //Specify the start positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit + LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit LCD_WriteReg(0x0052, 320 - xEnd); - LCD_WriteReg(0x0053, 320 - StartX - 1); //Specify the end positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0053, 320 - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit } else { @@ -224,16 +233,16 @@ void LCD_Clear(uint16_t Color) { if (DeviceCode == 0x9488) { tft_set_cursor(0, 0); - ili9320_SetWindows(0, 0, 480, 320); + ili9320_SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); LCD_WriteRAM_Prepare(); #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteMultiple(Color, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT); + LCD_IO_WriteMultiple(Color, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); #else - //index = (160*480); - for (index = 0; index < 320 * 480; index++) - LCD_IO_WriteData(Color); + //index = (LCD_FULL_PIXEL_HEIGHT) / 2 * (LCD_FULL_PIXEL_WIDTH); + for (index = 0; index < (LCD_FULL_PIXEL_HEIGHT) * (LCD_FULL_PIXEL_WIDTH); index++) + LCD_IO_WriteData(Color); #endif - //LCD_IO_WriteMultiple(Color, (480*320)); + //LCD_IO_WriteMultiple(Color, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); //while(index --) LCD_IO_WriteData(Color); } else if (DeviceCode == 0x5761) { @@ -262,7 +271,6 @@ void LCD_Clear(uint16_t Color) { extern uint16_t ILI9488_ReadRAM(); - void init_tft() { uint16_t i; //************* Start Initial Sequence **********// @@ -393,7 +401,7 @@ void init_tft() { for (i = 0; i < 65535; i++); LCD_IO_WriteReg(0x0029); - ili9320_SetWindows(0, 0, 480, 320); + ili9320_SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); LCD_Clear(0x0000); OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); @@ -486,7 +494,7 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co #if ENABLED(TFT_LVGL_UI_SPI) uint16_t i, width, height; uint16_t clr_temp; - uint8_t tbuf[480 * 2]; + uint8_t tbuf[(LCD_FULL_PIXEL_WIDTH) * 2]; SPI_TFT.spi_init(SPI_FULL_SPEED); diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 341cc4f5c2..8e611bde83 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /** * @file lcdprint.h * @brief LCD print api diff --git a/Marlin/src/lcd/scaled_tft.h b/Marlin/src/lcd/scaled_tft.h new file mode 100644 index 0000000000..f22bdf696a --- /dev/null +++ b/Marlin/src/lcd/scaled_tft.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../inc/MarlinConfig.h" + +#ifndef FSMC_UPSCALE + #define FSMC_UPSCALE 2 +#endif + +#ifndef LCD_FULL_PIXEL_WIDTH + #if FSMC_UPSCALE == 3 + #define LCD_FULL_PIXEL_WIDTH 480 + #else + #define LCD_FULL_PIXEL_WIDTH 320 + #endif +#endif +#ifndef LCD_FULL_PIXEL_HEIGHT + #if FSMC_UPSCALE == 3 + #define LCD_FULL_PIXEL_HEIGHT 320 + #else + #define LCD_FULL_PIXEL_HEIGHT 240 + #endif +#endif + +#ifndef LCD_PIXEL_OFFSET_X + #define LCD_PIXEL_OFFSET_X 48 +#endif +#ifndef LCD_PIXEL_OFFSET_Y + #define LCD_PIXEL_OFFSET_Y 48 +#endif diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/lcd/touch/xpt2046.cpp similarity index 87% rename from Marlin/src/feature/touch/xpt2046.cpp rename to Marlin/src/lcd/touch/xpt2046.cpp index b75f3ee2f2..1fed5b78f0 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/lcd/touch/xpt2046.cpp @@ -21,11 +21,8 @@ #if HAS_TOUCH_XPT2046 -#if TFT_SCALED_DOGLCD - #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. -#endif - #include "xpt2046.h" +#include "../scaled_tft.h" #ifndef XPT2046_Z1_THRESHOLD #define XPT2046_Z1_THRESHOLD 10 @@ -35,12 +32,12 @@ * Draw and Touch processing * * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. - * TOUCH_SCREEN_WIDTH/HEIGHT (320x240) is the Touch Area resolution. + * TOUCH_SENSOR_WIDTH/HEIGHT (320x240) is the Touch Area resolution. * LCD_FULL_PIXEL_WIDTH/HEIGHT (320x240 or 480x320) is the Actual (FSMC) Display resolution. * * - All native (u8g) drawing is done in LCD_PIXEL_* (128x64) * - The DOGM pixels are is upscaled 2-3x (as needed) for display. - * - Touch coordinates use TOUCH_SCREEN_* resolution and are converted to + * - Touch coordinates use TOUCH_SENSOR_* resolution and are converted to * click and scroll-wheel events (emulating of a common DOGM display). * * TOUCH_SCREEN resolution exists to fit our calibration values. The original touch code was made @@ -54,21 +51,25 @@ * The Marlin screen touchable area starts at LCD_PIXEL_OFFSET_X/Y (translated to SCREEN_START_LEFT/TOP) * and spans LCD_PIXEL_WIDTH/HEIGHT (scaled to SCREEN_WIDTH/HEIGHT). */ -// Touch screen resolution independent of display resolution -#define TOUCH_SCREEN_HEIGHT 240 -#define TOUCH_SCREEN_WIDTH 320 // Coordinates in terms of touch area #define BUTTON_AREA_TOP 175 #define BUTTON_AREA_BOT 234 -#define SCREEN_START_TOP ((LCD_PIXEL_OFFSET_Y) * (TOUCH_SCREEN_HEIGHT) / (LCD_FULL_PIXEL_HEIGHT)) -#define SCREEN_START_LEFT ((LCD_PIXEL_OFFSET_X) * (TOUCH_SCREEN_WIDTH) / (LCD_FULL_PIXEL_WIDTH)) -#define SCREEN_HEIGHT ((LCD_PIXEL_HEIGHT * FSMC_UPSCALE) * (TOUCH_SCREEN_HEIGHT) / (LCD_FULL_PIXEL_HEIGHT)) -#define SCREEN_WIDTH ((LCD_PIXEL_WIDTH * FSMC_UPSCALE) * (TOUCH_SCREEN_WIDTH) / (LCD_FULL_PIXEL_WIDTH)) +// Touch sensor resolution independent of display resolution +#define TOUCH_SENSOR_WIDTH 320 +#define TOUCH_SENSOR_HEIGHT 240 + +#define SCREEN_WIDTH_PCT(X) ((X) * (TOUCH_SENSOR_WIDTH) / (LCD_FULL_PIXEL_WIDTH)) +#define SCREEN_HEIGHT_PCT(Y) ((Y) * (TOUCH_SENSOR_HEIGHT) / (LCD_FULL_PIXEL_HEIGHT)) + +#define SCREEN_START_LEFT SCREEN_WIDTH_PCT(LCD_PIXEL_OFFSET_X) +#define SCREEN_START_TOP SCREEN_HEIGHT_PCT(LCD_PIXEL_OFFSET_Y) +#define SCREEN_WIDTH SCREEN_WIDTH_PCT((LCD_PIXEL_WIDTH) * (FSMC_UPSCALE)) +#define SCREEN_HEIGHT SCREEN_HEIGHT_PCT((LCD_PIXEL_HEIGHT) * (FSMC_UPSCALE)) -#define TOUCHABLE_Y_HEIGHT SCREEN_HEIGHT #define TOUCHABLE_X_WIDTH SCREEN_WIDTH +#define TOUCHABLE_Y_HEIGHT SCREEN_HEIGHT #ifndef TOUCH_INT_PIN #define TOUCH_INT_PIN -1 @@ -125,8 +126,8 @@ uint8_t XPT2046::read_buttons() { if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. #if ENABLED(GRAPHICAL_TFT_ROTATE_180) - x = TOUCH_SCREEN_WIDTH - x; - y = TOUCH_SCREEN_HEIGHT - y; + x = TOUCH_SENSOR_WIDTH - x; + y = TOUCH_SENSOR_HEIGHT - y; #endif // Touch within the button area simulates an encoder button @@ -137,11 +138,11 @@ uint8_t XPT2046::read_buttons() { : WITHIN(x, 242, 305) ? EN_C : 0; - if (x > TOUCH_SCREEN_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0; + if (x > TOUCH_SENSOR_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0; // Column and row above BUTTON_AREA_TOP int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH), - row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT); + row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT); // Send the touch to the UI (which will simulate the encoder wheel) MarlinUI::screen_click(row, col, x, y); diff --git a/Marlin/src/feature/touch/xpt2046.h b/Marlin/src/lcd/touch/xpt2046.h similarity index 100% rename from Marlin/src/feature/touch/xpt2046.h rename to Marlin/src/lcd/touch/xpt2046.h diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 92e3f136c9..b7dd4944ef 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -150,7 +150,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; volatile uint8_t MarlinUI::slow_buttons; #endif #if HAS_TOUCH_XPT2046 - #include "../feature/touch/xpt2046.h" + #include "touch/xpt2046.h" bool MarlinUI::on_edit_screen = false; #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index b2eda47978..31aa873b52 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -112,10 +112,6 @@ #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -161,7 +157,7 @@ #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - //SPI 2 + // SPI 2 #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 @@ -171,31 +167,32 @@ #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - // #define TOUCH_INT_PIN PB6 + //#define TOUCH_INT_PIN PB6 - #define SPI_TFT_CS_PIN TOUCH_CS_PIN - #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN - #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN - #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN - #define SPI_TFT_DC_PIN PB6 - #define SPI_TFT_RST_PIN PF11 + #if ENABLED(TFT_LVGL_UI_SPI) + #define SPI_TFT_CS_PIN TOUCH_CS_PIN + #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN + #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN + #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN + #define SPI_TFT_DC_PIN PB6 + #define SPI_TFT_RST_PIN PF11 + #endif #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 - - #define LCD_PIXEL_HEIGHT 320 - #define LCD_PIXEL_WIDTH 480 + #define LCD_PIXEL_WIDTH 480 + #define LCD_PIXEL_HEIGHT 320 + #define LCD_FULL_PIXEL_WIDTH LCD_PIXEL_WIDTH + #define LCD_FULL_PIXEL_HEIGHT LCD_PIXEL_HEIGHT + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_PIXEL_OFFSET_Y 48 #define XPT2046_X_CALIBRATION -12316 #define XPT2046_Y_CALIBRATION 8981 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 39db37a1a2..75aa9146f3 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -118,10 +118,6 @@ // #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -166,7 +162,7 @@ #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - //SPI 2 + // SPI 2 #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 @@ -176,31 +172,32 @@ #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - // #define TOUCH_INT_PIN PB6 + //#define TOUCH_INT_PIN PB6 - #define SPI_TFT_CS_PIN TOUCH_CS_PIN - #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN - #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN - #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN - #define SPI_TFT_DC_PIN PB6 - #define SPI_TFT_RST_PIN PF11 + #if ENABLED(TFT_LVGL_UI_SPI) + #define SPI_TFT_CS_PIN TOUCH_CS_PIN + #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN + #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN + #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN + #define SPI_TFT_DC_PIN PB6 + #define SPI_TFT_RST_PIN PF11 + #endif #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 - - #define LCD_PIXEL_HEIGHT 320 - #define LCD_PIXEL_WIDTH 480 + #define LCD_PIXEL_WIDTH 480 + #define LCD_PIXEL_HEIGHT 320 + #define LCD_FULL_PIXEL_WIDTH LCD_PIXEL_WIDTH + #define LCD_FULL_PIXEL_HEIGHT LCD_PIXEL_HEIGHT + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_PIXEL_OFFSET_Y 48 #define XPT2046_X_CALIBRATION -12316 #define XPT2046_Y_CALIBRATION 8981 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 3c950a38e3..9f4e57dd70 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -294,7 +294,7 @@ #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 //#define TOUCH_SCREEN - #if NEED_TOUCH_PINS + #if EITHER(TOUCH_SCREEN, NEED_TOUCH_PINS) #define TOUCH_CS_PIN PE14 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO @@ -317,15 +317,6 @@ #ifndef FSMC_UPSCALE #define FSMC_UPSCALE 3 #endif - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 - #endif - #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 48 - #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 - #endif #ifndef LCD_PIXEL_OFFSET_Y #define LCD_PIXEL_OFFSET_Y 32 #endif From 0c07e7a96f18861e597097d9cdafbcdcac76c34c Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Mon, 3 Aug 2020 20:39:29 -0700 Subject: [PATCH 0032/1370] Assisted Tramming requires a probe (#18912) --- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 37c9979771..3fae47384d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -769,7 +769,7 @@ #endif // -// Add the G35 command to read bed corners to help adjust screws. +// Add the G35 command to read bed corners to help adjust screws. Requires a bed probe. // //#define ASSISTED_TRAMMING #if ENABLED(ASSISTED_TRAMMING) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 03b869aa6e..5608fcff03 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2072,6 +2072,13 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #endif +/** + * G35 Assisted Tramming + */ +#if ENABLED(ASSISTED_TRAMMING) && !HAS_BED_PROBE + #error "ASSISTED_TRAMMING requires a bed probe." +#endif + /** * G38 Probe Target */ From e82e94be5b8641a601e77ca36994e89aa3843df5 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 4 Aug 2020 01:41:23 -0300 Subject: [PATCH 0033/1370] Fix MKS Nano v1.2 FSMC display (#18901) --- Marlin/src/inc/SanityCheck.h | 2 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 54 ++++++++--- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 97 +++++-------------- 3 files changed, 66 insertions(+), 87 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5608fcff03..e1b162a96f 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -819,7 +819,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS */ #if ENABLED(ADVANCED_PAUSE_FEATURE) #if !HAS_RESUME_CONTINUE - #error "ADVANCED_PAUSE_FEATURE currently requires an LCD controller or EMERGENCY_PARSER." + #error "ADVANCED_PAUSE_FEATURE requires a supported LCD controller (or EMERGENCY_PARSER)." #elif DISABLED(NOZZLE_PARK_FEATURE) #error "ADVANCED_PAUSE_FEATURE requires NOZZLE_PARK_FEATURE." #elif !defined(FILAMENT_UNLOAD_PURGE_FEEDRATE) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 0f6cbcbb8a..82bef78244 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -242,6 +242,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } } #define WRITE_ESC_SEQUENCE(V) writeEscSequence(V) + #define WRITE_ESC_SEQUENCE16(V) writeEscSequence(V) #else void writeEscSequence8(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { uint16_t data; @@ -289,6 +290,8 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } u8g_SetAddress(u8g, dev, 1); } + + #define WRITE_ESC_SEQUENCE16(V) writeEscSequence16(u8g, dev, V) #endif static const uint16_t st7789v_init[] = { @@ -378,7 +381,28 @@ static const uint16_t ili9341_init[] = { ESC_END }; -static const uint16_t st9677_init[] = { +static const uint16_t ili9488_init[] = { + ESC_REG(0x00E0), 0x0000, 0x0007, 0x000F, 0x000D, 0x001B, 0x000A, 0x003C, 0x0078, 0x004A, 0x0007, 0x000E, 0x0009, 0x001B, 0x001E, 0x000F, + ESC_REG(0x00E1), 0x0000, 0x0022, 0x0024, 0x0006, 0x0012, 0x0007, 0x0036, 0x0047, 0x0047, 0x0006, 0x000A, 0x0007, 0x0030, 0x0037, 0x000F, + ESC_REG(0x00C0), 0x0010, 0x0010, + ESC_REG(0x00C1), 0x0041, + ESC_REG(0x00C5), 0x0000, 0x0022, 0x0080, + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00A8, 0x0068), + ESC_REG(0x003A), 0x0055, + ESC_REG(0x00B0), 0x0000, + ESC_REG(0x00B1), 0x00B0, 0x0011, + ESC_REG(0x00B4), 0x0002, + ESC_REG(0x00B6), 0x0002, 0x0042, + ESC_REG(0x00B7), 0x00C6, + ESC_REG(0x00E9), 0x0000, + ESC_REG(0x00F0), 0x00A9, 0x0051, 0x002C, 0x0082, + ESC_REG(0x0029), + ESC_REG(0x0011), + ESC_DELAY(100), + ESC_END +}; + +static const uint16_t st7796_init[] = { ESC_REG(0x0010), ESC_DELAY(120), ESC_REG(0x0001), ESC_DELAY(120), ESC_REG(0x0011), ESC_DELAY(120), @@ -588,8 +612,8 @@ static const uint16_t st9677_init[] = { LCD_IO_WriteSequence(buffer, length * sq(FSMC_UPSCALE)); #else - u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); - u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); + for (uint8_t i = FSMC_UPSCALE; i--;) + u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); #endif } } @@ -617,7 +641,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u uint16_t* buffer = &bufferA[0]; bool allow_async = DISABLED(SPI_GRAPHICAL_TFT); #else - uint16_t buffer[WIDTH*2]; // 16-bit RGB 565 pixel line buffer + uint16_t buffer[WIDTH * FSMC_UPSCALE]; // 16-bit RGB 565 pixel line buffer #endif switch (msg) { @@ -630,18 +654,21 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u setWindow = setWindow_st7789v; break; case 0x9328: // ILI9328 - WRITE_ESC_SEQUENCE(ili9328_init); + WRITE_ESC_SEQUENCE16(ili9328_init); setWindow = setWindow_ili9328; break; case 0x9341: // ILI9341 case 0x8066: // Anycubic / TronXY TFTs (480x320) - WRITE_ESC_SEQUENCE(ili9341_init); + WRITE_ESC_SEQUENCE(ili9488_init); setWindow = setWindow_st7789v; break; case 0x7796: - WRITE_ESC_SEQUENCE(TERN(HAS_LCD_IO, st9677_init, ili9341_init)); + WRITE_ESC_SEQUENCE(st7796_init); setWindow = setWindow_st7789v; break; + case 0x9488: + WRITE_ESC_SEQUENCE(ili9488_init); + setWindow = setWindow_st7789v; case 0x0404: // No connected display on FSMC lcd_id = 0; return 0; @@ -664,8 +691,8 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); #else memset2(buffer, TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) / 2); - for (uint16_t i = 0; i < (LCD_FULL_PIXEL_WIDTH) * 3; i++) - u8g_WriteSequence(u8g, dev, (LCD_FULL_PIXEL_WIDTH) / 2, (uint8_t *)buffer); + for (uint16_t i = 0; i < (LCD_FULL_PIXEL_HEIGHT) * sq(FSMC_UPSCALE); i++) + u8g_WriteSequence(u8g, dev, LCD_FULL_PIXEL_WIDTH / 2, (uint8_t *)buffer); #endif // Bottom buttons @@ -721,11 +748,10 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u LCD_IO_WriteSequence(buffer, COUNT(bufferA)); #else uint8_t* bufptr = (uint8_t*) buffer; - for (uint8_t i = 2; i--;) { - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[0]); - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH]); - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH*2]); - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH*3]); + for (uint8_t i = FSMC_UPSCALE; i--;) { + LOOP_S_L_N(n, 0, FSMC_UPSCALE * 2) { + u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH * n]); + } } #endif } diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 844fb6b0d6..a68b481071 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -165,28 +165,7 @@ * to let the bootloader init the screen. */ -#if ENABLED(TFT_LVGL_UI_SPI) - - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 - - #define LCD_BACKLIGHT_PIN PD13 - - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 - -#elif ENABLED(TFT_LVGL_UI_FSMC) +#if ENABLED(TFT_LVGL_UI_FSMC) #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -198,15 +177,34 @@ #define LCD_BACKLIGHT_PIN PD13 -#endif +#elif ENABLED(FSMC_GRAPHICAL_TFT) -#if ENABLED(FSMC_GRAPHICAL_TFT) - //#define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h - //#define DOGLCD_SCK -1 + #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h + #define DOGLCD_SCK -1 + + #ifndef FSMC_UPSCALE + #define FSMC_UPSCALE 3 + #endif + #ifndef LCD_FULL_PIXEL_WIDTH + #define LCD_FULL_PIXEL_WIDTH 480 + #endif + #ifndef LCD_PIXEL_OFFSET_X + #define LCD_PIXEL_OFFSET_X 48 + #endif + #ifndef LCD_FULL_PIXEL_HEIGHT + #define LCD_FULL_PIXEL_HEIGHT 320 + #endif + #ifndef LCD_PIXEL_OFFSET_Y + #define LCD_PIXEL_OFFSET_Y 32 + #endif #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 @@ -216,54 +214,9 @@ #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif + #endif -#if HAS_SPI_LCD - - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define LCD_BACKLIGHT_PIN -1 - - // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) - #if ENABLED(MKS_MINI_12864) - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PD11 - #define DOGLCD_CS PE15 - #define DOGLCD_SCK PA5 - #define DOGLCD_MOSI PA7 - - // Required for MKS_MINI_12864 with this board - #define MKS_LCD12864B - #undef SHOW_BOOTSCREEN - - #else // !MKS_MINI_12864 - - #define LCD_PINS_D4 PE14 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PE15 - #define LCD_PINS_D6 PD11 - #define LCD_PINS_D7 PD10 - #endif - - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif - - #endif // !MKS_MINI_12864 - -#endif // HAS_SPI_LCD - #define SPI_FLASH #if ENABLED(SPI_FLASH) #define W25QXX_CS_PIN PB12 From 301569bee6ffe77b23154ad4d155972c37993ee3 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Tue, 4 Aug 2020 07:31:45 +0200 Subject: [PATCH 0034/1370] Add Z_AFTER_DEACTIVATE to account for gravity (#18906) --- Marlin/Configuration.h | 6 ++--- Marlin/Configuration_adv.h | 24 ++++++++++++------- .../lcd/dogm/status_screen_lite_ST7920.cpp | 13 +++------- Marlin/src/module/planner.cpp | 7 ++++-- Marlin/src/module/stepper/indirection.h | 8 ++++++- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 9d1f7862bb..25efa79b7d 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1076,18 +1076,18 @@ #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis stepper immediately when it's not being used. +// Disable axis steppers immediately when they're not being stepped. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false -// Warn on display about possibly reduced accuracy +// Turn off the display blinking that warns about possible accuracy reduction //#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder -#define DISABLE_E false // For all extruders +#define DISABLE_E false // Disable the extruder when not stepping #define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled // @section machine diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 3fae47384d..de50995ffe 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -809,24 +809,30 @@ #define INVERT_Z_STEP_PIN false #define INVERT_E_STEP_PIN false -// Default stepper release if idle. Set to 0 to deactivate. -// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. -// Time can be set by M18 and M84. +/** + * Idle Stepper Shutdown + * Set DISABLE_INACTIVE_? 'true' to shut down axis steppers after an idle period. + * The Deactive Time can be overridden with M18 and M84. Set to 0 for No Timeout. + */ #define DEFAULT_STEPPER_DEACTIVE_TIME 120 #define DISABLE_INACTIVE_X true #define DISABLE_INACTIVE_Y true -#define DISABLE_INACTIVE_Z true // Set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_Z true // Set 'false' if the nozzle could fall onto your printed part! #define DISABLE_INACTIVE_E true -#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate -#define DEFAULT_MINTRAVELFEEDRATE 0.0 +// If the Nozzle or Bed falls when the Z stepper is disabled, set its resting position here. +//#define Z_AFTER_DEACTIVATE Z_HOME_POS //#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated -// Minimum time that a segment needs to take if the buffer is emptied -#define DEFAULT_MINSEGMENTTIME 20000 // (µs) +// Minimum time that a segment needs to take as the buffer gets emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. -// Slow down the machine if the look ahead buffer is (by default) half full. +// Default Minimum Feedrates for printing and travel moves +#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. +#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. + +// Slow down the machine if the lookahead buffer is (by default) half full. // Increase the slowdown divisor for larger buffer sizes. #define SLOWDOWN #if ENABLED(SLOWDOWN) diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index 9338ab82e8..18894db3d6 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -819,16 +819,9 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { } if (countdown == 0 && (forceUpdate || position_changed() - #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) - || blink_changed() - #endif - )) { - draw_position(current_position, true - #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) - && all_axes_known() - #endif - ); - } + || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed()) + )) + draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, all_axes_known())); #endif } diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 65a9e4e059..c2a9e6ac77 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1281,7 +1281,7 @@ void Planner::recalculate() { void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) - xyze_bool_t axis_active = { false }; + xyze_bool_t axis_active = { true, true, true, true }; #endif #if HAS_FAN @@ -1316,7 +1316,10 @@ void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { block_t *block = &block_buffer[b]; - LOOP_XYZE(i) if (block->steps[i]) axis_active[i] = true; + if (ENABLED(DISABLE_X) && block->steps[X_AXIS]) axis_active[X_AXIS] = true; + if (ENABLED(DISABLE_Y) && block->steps[Y_AXIS]) axis_active[Y_AXIS] = true; + if (ENABLED(DISABLE_Z) && block->steps[Z_AXIS]) axis_active[Z_AXIS] = true; + if (ENABLED(DISABLE_E) && block->steps[E_AXIS]) axis_active[E_AXIS] = true; } #endif } diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index e3d3730c79..1fd1a72e7e 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -848,7 +848,13 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define DISABLE_AXIS_Y() do{ DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); CBI(axis_known_position, Y_AXIS); }while(0) #define ENABLE_AXIS_Z() do{ ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); }while(0) -#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); CBI(axis_known_position, Z_AXIS); }while(0) + +#ifdef Z_AFTER_DEACTIVATE + #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; planner.sync_plan_position(); }while(0) +#else + #define Z_RESET() +#endif +#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); CBI(axis_known_position, Z_AXIS); Z_RESET(); }while(0) // // Extruder steppers enable / disable macros From 7f69f8e680ba9af12a90ec576b22b9ace6eb6226 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 4 Aug 2020 07:32:25 +0200 Subject: [PATCH 0035/1370] Update Italian language (#18886) --- Marlin/src/lcd/language/language_it.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 6de5d9e032..1a5bdb22e9 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -64,6 +64,7 @@ namespace Language_it { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home asse Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home asse Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Tramming assistito"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home assi XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premi per iniziare"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Punto successivo"); From ea53abbca75c65a39168d3e116a0d877170ea627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Morav=C4=8D=C3=ADk?= Date: Tue, 4 Aug 2020 07:32:47 +0200 Subject: [PATCH 0036/1370] Update Slovak language (#18884) --- Marlin/src/lcd/language/language_sk.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 321fa5e05f..736e2069d9 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -66,6 +66,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domov os Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domov os Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto-zarovn. Z"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Asist. vyrovnanie"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Parkovanie XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím zaÄnete"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("ÄŽalší bod"); @@ -153,14 +154,12 @@ namespace Language_sk { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec úprav siete"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastná sieÅ¥"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("VytvoriÅ¥ sieÅ¥"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("SieÅ¥ bodov $"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola siete $"); - #endif + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("SieÅ¥ bodov ($)"); PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená sieÅ¥ bodov"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("UpraviÅ¥ výšku siete"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("SkontrolovaÅ¥ sieÅ¥"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola siete ($)"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast.siete"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 ohrev podlž."); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 ohrev trysky"); @@ -309,7 +308,9 @@ namespace Language_sk { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Teplota"); PROGMEM Language_Str MSG_MOTION = _UxGT("Pohyb"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E na mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E v mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit v mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Priem. fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Priem. fil. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Vysunúť mm"); @@ -331,6 +332,10 @@ namespace Language_sk { PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info. obrazovka"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Príprava tlaÄe"); PROGMEM Language_Str MSG_TUNE = _UxGT("Doladenie tlaÄe"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Monitor napájania"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Prúd"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Napätie"); + PROGMEM Language_Str MSG_POWER = _UxGT("Výkon"); PROGMEM Language_Str MSG_START_PRINT = _UxGT("SpustiÅ¥ tlaÄ"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("ÄŽalší"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inicial."); From 0b2bd123ef1e438ea613306c8f4b06d078ed6b59 Mon Sep 17 00:00:00 2001 From: Jeff Eberl Date: Mon, 3 Aug 2020 23:37:08 -0600 Subject: [PATCH 0037/1370] Change include to (#18880) --- Marlin/src/lcd/tft/tft_image.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index 9e4dc16297..ff60bee9a9 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -21,7 +21,7 @@ */ #include "tft_image.h" -#include "cstddef" +#include const tImage NoLogo = { (void *)NULL, 0, 0, NOCOLORS }; From 17bbcce52b53eb36c327e3547a497abe1e20c1be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus=20N=C3=A4veke?= Date: Tue, 4 Aug 2020 10:02:08 +0200 Subject: [PATCH 0038/1370] Make ili9341 rotatable (e.g., Anycubic Predator) (#18877) --- Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 82bef78244..205cafbccb 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -366,7 +366,7 @@ static const uint16_t ili9328_init[] = { static const uint16_t ili9341_init[] = { ESC_REG(0x0010), ESC_DELAY(10), ESC_REG(0x0001), ESC_DELAY(200), - ESC_REG(0x0036), 0x00E8, + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028), ESC_REG(0x003A), 0x0055, ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F, ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF, From a100306b002e3ea33752c3ba64fbb23eb0c050de Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 4 Aug 2020 03:21:19 -0500 Subject: [PATCH 0039/1370] Followup to #18906 Z_AFTER_DEACTIVATE --- Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index 18894db3d6..fba485d706 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -820,8 +820,7 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { if (countdown == 0 && (forceUpdate || position_changed() || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed()) - )) - draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, all_axes_known())); + )) draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 1, all_axes_known())); #endif } From a0a87c2b81860d0e449f19a094f02d1864706fc5 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 4 Aug 2020 06:50:05 -0300 Subject: [PATCH 0040/1370] SPI Flash data compression (#18879) --- .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 317 ++++++++++++++++++ .../lcd/extui/lib/mks_ui/SPIFlashStorage.h | 108 ++++++ .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 96 ++++-- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 4 +- 5 files changed, 489 insertions(+), 40 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp new file mode 100644 index 0000000000..da87ce976d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -0,0 +1,317 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "SPIFlashStorage.h" + +uint8_t SPIFlashStorage::::m_pageData[SPI_FLASH_PageSize]; +uint32_t SPIFlashStorage::::m_currentPage; +uint16_t SPIFlashStorage::::m_pageDataUsed; +uint32_t SPIFlashStorage::::m_startAddress; + +#if HAS_SPI_FLASH_COMPRESSION + + uint8_t SPIFlashStorage::m_compressedData[SPI_FLASH_PageSize]; + uint16_t SPIFlashStorage::m_compressedDataUsed; + + template + static uint32_t rle_compress(T *output, uint32_t outputLength, T *input, uint32_t inputLength, uint32_t& inputProcessed) { + uint32_t count = 0, out = 0, index, i; + T pixel; + //32767 for uint16_t + //127 for uint16_t + //calculated at compile time + constexpr T max = (0xFFFFFFFF >> (8 * (4 - sizeof(T)))) / 2; + + inputProcessed = 0; + while (count < inputLength && out < outputLength) { + index = count; + pixel = input[index++]; + while (index < inputLength && index - count < max && input[index] == pixel) + index++; + if (index - count == 1) { + /* + * Failed to "replicate" the current pixel. See how many to copy. + * Avoid a replicate run of only 2-pixels after a literal run. There + * is no gain in this, and there is a risK of loss if the run after + * the two identical pixels is another literal run. So search for + * 3 identical pixels. + */ + while (index < inputLength && index - count < max && (input[index] != input[index - 1] || (index > 1 && input[index] != input[index - 2]))) + index++; + /* + * Check why this run stopped. If it found two identical pixels, reset + * the index so we can add a run. Do this twice: the previous run + * tried to detect a replicate run of at least 3 pixels. So we may be + * able to back up two pixels if such a replicate run was found. + */ + while (index < inputLength && input[index] == input[index - 1]) + index--; + // If the output buffer could overflow, stop at the remaining bytes + NOMORE(index, count + outputLength - out - 1); + output[out++] = (uint16_t)(count - index); + for (i = count; i < index; i++) + output[out++] = input[i]; + } + else { + // Need at least more 2 spaces + if (out > outputLength - 2) break; + output[out++] = (uint16_t)(index - count); + output[out++] = pixel; + } + count = index; + } + inputProcessed = count; + + // Padding + if (out == outputLength - 1) output[out++] = 0; + + return out; + } + + template + static uint32_t rle_uncompress(UT *output, uint32_t outputLength, UT *input, uint32_t inputLength, uint32_t &outputFilled) { + T count; + UT i; + uint32_t processedBytes = 0; + outputFilled = 0; + + while (outputLength > 0 && inputLength > 0) { + processedBytes++; + count = static_cast(*input++); + inputLength--; + if (count > 0) { // Replicate run + for (i = 0; i < count && outputLength > i; i++) + output[i] = *input; + outputFilled += i; + // If copy incomplete, change the input buffer to start with remaining data in the next call + if (i < count) { + // Change to process the difference in the next call + *(input - 1) = static_cast(count - i); + return processedBytes - 1; + } + input++; + inputLength--; + processedBytes++; + } + else if (count < 0) { // literal run + count = static_cast(-count); + // Copy, validating if the output have enough space + for (i = 0; i < count && outputLength > i; i++) + output[i] = input[i]; + outputFilled += i; + // If copy incomplete, change the input buffer to start with remaining data in the next call + if (i < count) { + input[i - 1] = static_cast((count - i) * -1); + // Back one + return processedBytes + i - 1; + } + input += count; + inputLength -= count; + processedBytes += count; + } + output += count; + outputLength -= count; + } + + return processedBytes; + } + +#endif // HAS_SPI_FLASH_COMPRESSION + +void SPIFlashStorage::beginWrite(uint32_t startAddress) { + m_pageDataUsed = 0; + m_currentPage = 0; + m_startAddress = startAddress; + #if HAS_SPI_FLASH_COMPRESSION + // Restart the compressed buffer, keep the pointers of the uncompressed buffer + m_compressedDataUsed = 0; + #endif +} + + +void SPIFlashStorage::endWrite() { + // Flush remaining data + #if HAS_SPI_FLASH_COMPRESSION + if (m_compressedDataUsed > 0) { + flushPage(); + savePage(m_compressedData); + } + #else + if (m_pageDataUsed > 0) flushPage(); + #endif +} + +void SPIFlashStorage::savePage(uint8_t* buffer) { + W25QXX.SPI_FLASH_BufferWrite(buffer, m_startAddress + (SPI_FLASH_PageSize * m_currentPage), SPI_FLASH_PageSize); + + // Test env + // char fname[256]; + // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); + // FILE *fp = fopen(fname, "wb"); + // fwrite(buffer, 1, m_compressedDataUsed, fp); + // fclose(fp); +} + +void SPIFlashStorage::loadPage(uint8_t* buffer) { + W25QXX.SPI_FLASH_BufferRead(buffer, m_startAddress + (SPI_FLASH_PageSize * m_currentPage), SPI_FLASH_PageSize); + + // Test env + // char fname[256]; + // memset(buffer, 0, SPI_FLASH_PageSize); + // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); + // FILE *fp = fopen(fname, "rb"); + // if (fp != NULL) { + // fread(buffer, 1, SPI_FLASH_PageSize, fp); + // fclose(fp); + // } +} + +void SPIFlashStorage::flushPage() { + #if HAS_SPI_FLASH_COMPRESSION + // Work com with compressed in memory + uint32_t inputProcessed; + uint32_t compressedSize = rle_compress((uint16_t *)(m_compressedData + m_compressedDataUsed), compressedDataFree() / 2, (uint16_t *)m_pageData, m_pageDataUsed / 2, inputProcessed) * 2; + inputProcessed *= 2; + m_compressedDataUsed += compressedSize; + + // Space remaining in the compressed buffer? + if (compressedDataFree() > 0) { + // Free the uncompressed buffer + m_pageDataUsed = 0; + return; + } + + // Part of the m_pageData was compressed, so ajust the pointers, freeing what was processed, shift the buffer + // TODO: To avoid this copy, use a circular buffer + memmove(m_pageData, m_pageData + inputProcessed, m_pageDataUsed - inputProcessed); + m_pageDataUsed -= inputProcessed; + + // No? So flush page with compressed data!! + uint8_t *buffer = m_compressedData; + #else + uint8_t *buffer = m_pageData; + #endif + + savePage(buffer); + + #if HAS_SPI_FLASH_COMPRESSION + // Restart the compressed buffer, keep the pointers of the uncompressed buffer + m_compressedDataUsed = 0; + #elif + m_pageDataUsed = 0; + #endif + m_currentPage++; +} + +void SPIFlashStorage::readPage() { + #if HAS_SPI_FLASH_COMPRESSION + if (compressedDataFree() == 0) { + loadPage(m_compressedData); + m_currentPage++; + m_compressedDataUsed = 0; + } + + // Need to uncompress data + if (pageDataFree() == 0) { + m_pageDataUsed = 0; + uint32_t outpuProcessed = 0; + uint32_t inputProcessed = rle_uncompress((uint16_t *)(m_pageData + m_pageDataUsed), pageDataFree() / 2, (uint16_t *)(m_compressedData + m_compressedDataUsed), compressedDataFree() / 2, outpuProcessed); + inputProcessed *= 2; + outpuProcessed *= 2; + if (outpuProcessed < pageDataFree()) { + m_pageDataUsed = SPI_FLASH_PageSize - outpuProcessed; + // TODO: To avoid this copy, use a circular buffer + memmove(m_pageData + m_pageDataUsed, m_pageData, outpuProcessed); + } + + m_compressedDataUsed += inputProcessed; + } + #else + loadPage(m_pageData); + m_pageDataUsed = 0; + m_currentPage++; + #endif +} + +uint16_t SPIFlashStorage::inData(uint8_t* data, uint16_t size) { + // Don't write more than we can + NOMORE(size, pageDataFree()); + memcpy(m_pageData + m_pageDataUsed, data, size); + m_pageDataUsed += size; + return size; +} + +void SPIFlashStorage::writeData(uint8_t* data, uint16_t size) { + // Flush a page if needed + if (pageDataFree() == 0) flushPage(); + + while (size > 0) { + uint16_t written = inData(data, size); + size -= written; + // Need to write more? Flush page and continue! + if (size > 0) { + flushPage(); + data += written; + } + } +} + +void SPIFlashStorage::beginRead(uint32_t startAddress) { + m_startAddress = startAddress; + m_currentPage = 0; + // Nothing in memory now + m_pageDataUsed = SPI_FLASH_PageSize; + #if HAS_SPI_FLASH_COMPRESSION + m_compressedDataUsed = sizeof(m_compressedData); + #endif +} + +uint16_t SPIFlashStorage::outData(uint8_t* data, uint16_t size) { + // Don't read more than we have + NOMORE(size > pageDataFree()); + memcpy(data, m_pageData + m_pageDataUsed, size); + m_pageDataUsed += size; + return size; +} + +void SPIFlashStorage::readData(uint8_t* data, uint16_t size) { + // Read a page if needed + if (pageDataFree() == 0) readPage(); + + while (size > 0) { + uint16_t read = outData(data, size); + size -= read; + // Need to write more? Flush page and continue! + if (size > 0) { + readPage(); + data += read; + } + } +} + +SPIFlashStorage SPIFlash; + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h new file mode 100644 index 0000000000..c806068dda --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h @@ -0,0 +1,108 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "W25Qxx.h" + +#define HAS_SPI_FLASH_COMPRESSION 1 + +/** + * This class manages and optimizes SPI Flash data storage, + * keeping an internal buffer to write and save full SPI flash + * pages as needed. + * + * Since the data is always in the buffer, the class is also + * able to support fast on-the-fly RLE compression/decompression. + * + * In testing with the current LVGL_UI it compacts 2.9MB of icons + * (which have lots of runs) down to 370kB!!! As a result the UI + * refresh rate becomes faster and now all LVGL UI can fit into a + * tiny 2MB SPI Flash, such as the Chitu Board. + * + * == Usage == + * + * Writing: + * + * The class keeps an internal buffer that caches data until it + * fits into a full SPI Flash page. Each time the buffer fills up + * the page is saved to SPI Flash. Sequential writes are optimal. + * + * SPIFlashStorage.beginWrite(myStartAddress); + * while (there is data to write) + * SPIFlashStorage.addData(myBuffer, bufferSize); + * SPIFlashStorage.endWrite(); // Flush remaining buffer data + * + * Reading: + * + * When reading, it loads a full page from SPI Flash at once and + * keeps it in a private SRAM buffer. Data is loaded as needed to + * fullfill requests. Sequential reads are optimal. + * + * SPIFlashStorage.beginRead(myStartAddress); + * while (there is data to read) + * SPIFlashStorage.readData(myBuffer, bufferSize); + * + * Compression: + * + * The biggest advantage of this class is the RLE compression. + * With compression activated a second buffer holds the compressed + * data, so when writing data, as this buffer becomes full it is + * flushed to SPI Flash. + * + * The same goes for reading: A compressed page is read from SPI + * flash, and the data is uncompressed as needed to provide the + * requested amount of data. + */ +class SPIFlashStorage { +public: + // Write operation + static void beginWrite(uint32_t startAddress); + static void endWrite(); + static void writeData(uint8_t* data, uint16_t size); + + static // Read operation + static void beginRead(uint32_t startAddress); + static void readData(uint8_t* data, uint16_t size); + + static uint32_t getCurrentPage() { return m_currentPage; } + +private: + static void flushPage(); + static void savePage(uint8_t* buffer); + static void loadPage(uint8_t* buffer); + static void readPage(); + static uint16_t inData(uint8_t* data, uint16_t size); + static uint16_t outData(uint8_t* data, uint16_t size); + + static uint8_t m_pageData[SPI_FLASH_PageSize]; + static uint32_t m_currentPage; + static uint16_t m_pageDataUsed; + static inline uint16_t pageDataFree() { return SPI_FLASH_PageSize - m_pageDataUsed; } + static uint32_t m_startAddress; + #if HAS_SPI_FLASH_COMPRESSION + static uint8_t m_compressedData[SPI_FLASH_PageSize]; + static uint16_t m_compressedDataUsed; + static inline uint16_t compressedDataFree() { return SPI_FLASH_PageSize - m_compressedDataUsed; } + #endif +}; + +extern SPIFlashStorage SPIFlash; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 2a16bcf1b3..771e3e062e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -23,16 +23,17 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" - #include "string.h" - #include "pic_manager.h" -#include "W25Qxx.h" -#include "../../../../sd/cardreader.h" #include "draw_ready_print.h" #include "mks_hardware_test.h" +#include "SPIFlashStorage.h" +#include "W25Qxx.h" + +#include "../../../../MarlinCore.h" +#include "../../../../sd/cardreader.h" + extern uint16_t DeviceCode; extern unsigned char bmp_public_buf[17 * 1024]; @@ -205,11 +206,11 @@ static char assets[][LONG_FILENAME_LENGTH] = { }; #if HAS_SPI_FLASH_FONT - static char fonts[][LONG_FILENAME_LENGTH] = { - "FontUNIGBK.bin", - }; + static char fonts[][LONG_FILENAME_LENGTH] = { "FontUNIGBK.bin" }; #endif +static uint8_t currentFlashPage = 0; + uint32_t lv_get_pic_addr(uint8_t *Pname) { uint8_t Pic_cnt; uint8_t i, j; @@ -217,6 +218,8 @@ uint32_t lv_get_pic_addr(uint8_t *Pname) { uint32_t tmp_cnt = 0; uint32_t addr = 0; + currentFlashPage = 0; + #if ENABLED(MARLIN_DEV_MODE) SERIAL_ECHOLNPAIR("Getting picture SPI Flash Address: ", (const char*)Pname); #endif @@ -371,6 +374,10 @@ uint8_t public_buf[512]; return -1; } + #if ENABLED(MARLIN_DEV_MODE) + static uint32_t totalSizes = 0, totalCompressed = 0; + #endif + #define ASSET_TYPE_ICON 0 #define ASSET_TYPE_LOGO 1 #define ASSET_TYPE_TITLE_LOGO 2 @@ -398,43 +405,52 @@ uint8_t public_buf[512]; pfileSize = file.fileSize(); totalSizeLoaded += pfileSize; if (assetType == ASSET_TYPE_LOGO) { - while (1) { + do { pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } + Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); + } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_TITLE_LOGO) { - while (1) { + do { pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } + Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); + } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_G_PREVIEW) { - while (1) { + do { pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - default_view_Write(public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } + default_view_Write(public_buf, pbr); + } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_ICON) { Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize); - while (1) { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); - Pic_Write_Addr += pbr; - if (pbr < BMP_WRITE_BUF_LEN) break; - } + SPIFlash.beginWrite(Pic_Write_Addr); + #if HAS_SPI_FLASH_COMPRESSION + do { + pbr = file.read(public_buf, SPI_FLASH_PageSize); + TERN_(MARLIN_DEV_MODE, totalSizes += pbr); + SPIFlash.writeData(public_buf, SPI_FLASH_PageSize); + } while (pbr >= SPI_FLASH_PageSize); + #else + do { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); + Pic_Write_Addr += pbr; + } while (pbr >= BMP_WRITE_BUF_LEN); + #endif + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("Space used: ", fn, " - ", (SPIFlash.getCurrentPage() + 1) * SPI_FLASH_PageSize / 1024, "KB"); + totalCompressed += (SPIFlash.getCurrentPage() + 1) * SPI_FLASH_PageSize; + #endif + SPIFlash.endWrite(); } else if (assetType == ASSET_TYPE_FONT) { Pic_Write_Addr = UNIGBK_FLASH_ADDR; - while (1) { + do { pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); Pic_Write_Addr += pbr; - if (pbr < BMP_WRITE_BUF_LEN) break; - } + } while (pbr >= BMP_WRITE_BUF_LEN); } file.close(); @@ -459,13 +475,13 @@ uint8_t public_buf[512]; disp_assets_update_progress("Reading files..."); dir_t d; while (dir.readDir(&d, card.longFilename) > 0) { - // if we dont get a long name, but gets a short one, try it + // If we dont get a long name, but gets a short one, try it if (card.longFilename[0] == 0 && d.name[0] != 0) dosName2LongName((const char*)d.name, card.longFilename); if (card.longFilename[0] == 0) continue; if (card.longFilename[0] == '.') continue; - uint8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); + int8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); if (a >= 0 && a < COUNT(assets)) { uint8_t assetType = ASSET_TYPE_ICON; if (strstr(assets[a], "_logo")) @@ -482,9 +498,8 @@ uint8_t public_buf[512]; #if HAS_SPI_FLASH_FONT a = arrayFindStr(fonts, COUNT(fonts), card.longFilename); - if (a >= 0 && a < COUNT(fonts)) { + if (a >= 0 && a < COUNT(fonts)) loadAsset(dir, d, fonts[a], ASSET_TYPE_FONT); - } #endif } dir.rename(&root, bakPath); @@ -496,11 +511,13 @@ uint8_t public_buf[512]; W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter); #endif + + SERIAL_ECHOLNPAIR("Total Uncompressed: ", totalSizes, ", Compressed: ", totalCompressed); } #if HAS_SPI_FLASH_FONT void spi_flash_read_test() { W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN); } - #endif // HAS_SPI_FLASH_FONT + #endif #endif // SDSUPPORT @@ -531,8 +548,15 @@ void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { } void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) { - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size); + #if HAS_SPI_FLASH_COMPRESSION + if (currentFlashPage == 0) + SPIFlash.beginRead(addr); + SPIFlash.readData(P_Rbuff, size); + currentFlashPage++; + #else + W25QXX.init(SPI_QUARTER_SPEED); + W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size); + #endif } #if HAS_SPI_FLASH_FONT diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 3ef4ee4f86..d97b54a658 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -63,7 +63,7 @@ extern "C" { /* C-declarations for C++ */ #define DEFAULT_VIEW_MAX_SIZE (200*200*2) #define FLASH_VIEW_MAX_SIZE (200*200*2) -#define PER_PIC_MAX_SPACE_TFT35 (32*1024) +#define PER_PIC_MAX_SPACE_TFT35 (9*1024) #define PER_PIC_MAX_SPACE_TFT32 (16*1024) #define PER_FONT_MAX_SPACE (16*1024) @@ -88,7 +88,7 @@ extern "C" { /* C-declarations for C++ */ #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 // font - #define FONTINFOADDR 0x183000 // 6M -- font addr + #define FONTINFOADDR 0x150000 // 6M -- font addr #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 #else diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 31aa873b52..b6863d252b 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -150,10 +150,10 @@ #define SPI_FLASH_SIZE 0x200000 // 2MB #if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 0 + #define HAS_SPI_FLASH_FONT 1 #define HAS_GCODE_PREVIEW 1 #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 0 + #define HAS_LANG_SELECT_SCREEN 1 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 From 38a24ce6c9371af3c5c4ee2c267e0392c12fa89d Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Thu, 6 Aug 2020 05:38:23 +0200 Subject: [PATCH 0041/1370] Move Cancel Object menu, fix canceled item index (#18930) --- Marlin/src/lcd/menu/menu_advanced.cpp | 5 ----- Marlin/src/lcd/menu/menu_cancelobject.cpp | 2 +- Marlin/src/lcd/menu/menu_main.cpp | 6 ++++++ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 81baa6156a..1c37b2f2d3 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -53,7 +53,6 @@ void menu_tmc(); void menu_backlash(); -void menu_cancelobject(); #if ENABLED(DAC_STEPPER_CURRENT) @@ -560,10 +559,6 @@ void menu_advanced_settings() { SUBMENU(MSG_BACKLASH, menu_backlash); #endif - #if ENABLED(CANCEL_OBJECTS) - SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); - #endif - #if ENABLED(DAC_STEPPER_CURRENT) SUBMENU(MSG_DRIVE_STRENGTH, menu_dac); #endif diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp index 095e4eb7b1..55b88c45b0 100644 --- a/Marlin/src/lcd/menu/menu_cancelobject.cpp +++ b/Marlin/src/lcd/menu/menu_cancelobject.cpp @@ -43,7 +43,7 @@ static void lcd_cancel_object_confirm() { }; MenuItem_confirm::confirm_screen( []{ - cancelable.cancel_object(MenuItemBase::itemIndex - 1); + cancelable.cancel_object(MenuItemBase::itemIndex); ui.completion_feedback(); ui.goto_previous_screen(); }, diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 51b67209dc..059290c523 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -51,6 +51,7 @@ #endif void menu_tune(); +void menu_cancelobject(); void menu_motion(); void menu_temperature(); void menu_configuration(); @@ -110,7 +111,12 @@ void menu_main() { ); }); #endif + SUBMENU(MSG_TUNE, menu_tune); + + #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) + SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); + #endif } else { From 1a50260ebdc66aa091c12b62a7bc56ade930d3ba Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 00:40:08 -0300 Subject: [PATCH 0042/1370] Followup to LVGL patch (#18920) --- Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 11 ++++++----- Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index da87ce976d..9d3adc1bab 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -24,12 +24,13 @@ #if HAS_TFT_LVGL_UI +#include "../../../../inc/MarlinConfig.h" #include "SPIFlashStorage.h" -uint8_t SPIFlashStorage::::m_pageData[SPI_FLASH_PageSize]; -uint32_t SPIFlashStorage::::m_currentPage; -uint16_t SPIFlashStorage::::m_pageDataUsed; -uint32_t SPIFlashStorage::::m_startAddress; +uint8_t SPIFlashStorage::m_pageData[SPI_FLASH_PageSize]; +uint32_t SPIFlashStorage::m_currentPage; +uint16_t SPIFlashStorage::m_pageDataUsed; +uint32_t SPIFlashStorage::m_startAddress; #if HAS_SPI_FLASH_COMPRESSION @@ -291,7 +292,7 @@ void SPIFlashStorage::beginRead(uint32_t startAddress) { uint16_t SPIFlashStorage::outData(uint8_t* data, uint16_t size) { // Don't read more than we have - NOMORE(size > pageDataFree()); + NOMORE(size, pageDataFree()); memcpy(data, m_pageData + m_pageDataUsed, size); m_pageDataUsed += size; return size; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h index c806068dda..5a12413709 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h @@ -79,7 +79,7 @@ public: static void endWrite(); static void writeData(uint8_t* data, uint16_t size); - static // Read operation + // Read operation static void beginRead(uint32_t startAddress); static void readData(uint8_t* data, uint16_t size); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 771e3e062e..3f87c5183f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -482,7 +482,7 @@ uint8_t public_buf[512]; if (card.longFilename[0] == '.') continue; int8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); - if (a >= 0 && a < COUNT(assets)) { + if (a >= 0 && a < (int8_t)COUNT(assets)) { uint8_t assetType = ASSET_TYPE_ICON; if (strstr(assets[a], "_logo")) assetType = ASSET_TYPE_LOGO; @@ -498,7 +498,7 @@ uint8_t public_buf[512]; #if HAS_SPI_FLASH_FONT a = arrayFindStr(fonts, COUNT(fonts), card.longFilename); - if (a >= 0 && a < COUNT(fonts)) + if (a >= 0 && a < (int8_t)COUNT(fonts)) loadAsset(dir, d, fonts[a], ASSET_TYPE_FONT); #endif } From c0d031cd1ed403a5a7deddb5301a8b94e5c71b1c Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 5 Aug 2020 20:42:03 -0700 Subject: [PATCH 0043/1370] Add Chitu 3D V6 2nd Filament Runout pin (#18922) --- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 75aa9146f3..7a3777da46 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -111,7 +111,13 @@ #define BEEPER_PIN PB0 //#define LED_PIN PD3 //#define POWER_LOSS_PIN PG2 // PG4 PW_DET -#define FIL_RUNOUT_PIN PA15 // MT_DET + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA15 // MT_DET +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN PF13 +#endif // // TronXY TFT Support From 4201a48ecfb30a5442f4fc9f811ff3e0ae2c84af Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 00:44:30 -0300 Subject: [PATCH 0044/1370] Request files needed to test a PR (#18925) --- .github/pull_request_template.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9298b2b96d..d82fb0f9e3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,6 +14,10 @@ We must be able to understand your proposed change from this description. If we +### Configurations + + + ### Related Issues From e8dc7cad185d2d31132dc1ddd8a7e06bf2733659 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 6 Aug 2020 00:49:15 -0500 Subject: [PATCH 0045/1370] General cleanup --- Marlin/src/core/multi_language.cpp | 0 Marlin/src/feature/spindle_laser.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_tmc.cpp | 2 +- Marlin/src/lcd/menu/menu_touch_screen.cpp | 4 +++- Marlin/src/lcd/ultralcd.cpp | 2 +- 8 files changed, 9 insertions(+), 7 deletions(-) delete mode 100644 Marlin/src/core/multi_language.cpp diff --git a/Marlin/src/core/multi_language.cpp b/Marlin/src/core/multi_language.cpp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 68261f2fc5..9d2ee7d9e5 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -68,7 +68,7 @@ void SpindleLaser::init() { analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); - #endif + #endif } void SpindleLaser::ocr_off() { WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Turn spindle off diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 8d103d52b1..7c1083f7f7 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -874,7 +874,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(TOUCH_SCREEN_CALIBRATION) case 995: M995(); break; // M995: Touch screen calibration for TFT display #endif - + #if ENABLED(PLATFORM_M997_SUPPORT) case 997: M997(); break; // M997: Perform in-application firmware update #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index b7f92fcb25..5534acaf2c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2436,7 +2436,7 @@ */ #if PIN_EXISTS(BEEPER) || EITHER(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) #define HAS_BUZZER 1 - #if DISABLED(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) + #if NONE(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) #define USE_BEEPER 1 #endif #endif diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 5887bf9d4a..60118a3017 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -350,7 +350,7 @@ void menu_motion() { #if ENABLED(ASSISTED_TRAMMING) GCODES_ITEM(MSG_ASSISTED_TRAMMING, PSTR("G35")); #endif - + // // Level Bed // diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index e74619d295..f2f26886fc 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_TRINAMIC_CONFIG && HAS_LCD_MENU +#if HAS_LCD_MENU && HAS_TRINAMIC_CONFIG #include "menu.h" #include "../../module/stepper/indirection.h" diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp index 1f315f181a..71fb7b7556 100644 --- a/Marlin/src/lcd/menu/menu_touch_screen.cpp +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -22,13 +22,15 @@ #include "../../inc/MarlinConfigPre.h" -#if ENABLED(TOUCH_SCREEN_CALIBRATION) +#if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) #include "menu.h" #include "../ultralcd.h" void touch_screen_calibration() { + ui.touch_calibration(); + } #endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index b7dd4944ef..6482cf33d0 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -74,7 +74,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #endif #endif -#if ENABLED(PCA9632_BUZZER) || USE_BEEPER +#if EITHER(PCA9632_BUZZER, USE_BEEPER) #include "../libs/buzzer.h" // for BUZZ() macro #if ENABLED(PCA9632_BUZZER) #include "../feature/leds/pca9632.h" From 76eff2471868bbcff31cd2c698f570a25bee2033 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 5 Aug 2020 23:21:41 -0500 Subject: [PATCH 0046/1370] Simple rename of hex_print --- .../src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/feature/tmc_util.cpp | 2 +- Marlin/src/gcode/calibrate/M100.cpp | 2 +- Marlin/src/gcode/eeprom/M500-M504.cpp | 2 +- Marlin/src/gcode/parser.h | 2 +- Marlin/src/inc/Conditionals_adv.h | 5 ++ Marlin/src/libs/hex_print.cpp | 90 +++++++++++++++++++ .../{hex_print_routines.h => hex_print.h} | 0 Marlin/src/libs/hex_print_routines.cpp | 90 ------------------- 10 files changed, 101 insertions(+), 96 deletions(-) create mode 100644 Marlin/src/libs/hex_print.cpp rename Marlin/src/libs/{hex_print_routines.h => hex_print.h} (100%) delete mode 100644 Marlin/src/libs/hex_print_routines.cpp diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp index b030459029..4d116f440b 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp @@ -40,7 +40,7 @@ #include "../../../module/stepper/indirection.h" #include "../../../module/printcounter.h" #include "../../../libs/duration_t.h" -#include "../../../libs/hex_print_routines.h" +#include "../../../libs/hex_print.h" //some default values used in initialization #define DEFAULT_MICROSTEPPING_VALUE 32 diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index f8219ac7e7..760d2cdd1e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -28,7 +28,7 @@ #include "../../../MarlinCore.h" #include "../../../HAL/shared/eeprom_api.h" - #include "../../../libs/hex_print_routines.h" + #include "../../../libs/hex_print.h" #include "../../../module/configuration_store.h" #include "../../../lcd/ultralcd.h" #include "../../../module/stepper.h" diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 495d6a9f5b..781253079e 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -34,7 +34,7 @@ #if ENABLED(TMC_DEBUG) #include "../module/planner.h" - #include "../libs/hex_print_routines.h" + #include "../libs/hex_print.h" #if ENABLED(MONITOR_DRIVER_STATUS) static uint16_t report_tmc_status_interval; // = 0 #endif diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index ea054125b7..f03b13e233 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -26,7 +26,7 @@ #include "../gcode.h" #include "../queue.h" -#include "../../libs/hex_print_routines.h" +#include "../../libs/hex_print.h" #include "../../MarlinCore.h" // for idle() diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp index 5aee68ba99..30fa2b6e25 100644 --- a/Marlin/src/gcode/eeprom/M500-M504.cpp +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -60,7 +60,7 @@ void GcodeSuite::M502() { #if ENABLED(EEPROM_SETTINGS) #if ENABLED(MARLIN_DEV_MODE) - #include "../../libs/hex_print_routines.h" + #include "../../libs/hex_print.h" #endif /** diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 5474e5e5f3..eb614c33b4 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -31,7 +31,7 @@ //#define DEBUG_GCODE_PARSER #if ENABLED(DEBUG_GCODE_PARSER) - #include "../libs/hex_print_routines.h" + #include "../libs/hex_print.h" #endif #if ENABLED(TEMPERATURE_UNITS_SUPPORT) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 7b35dc7755..a057034ab6 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -378,3 +378,8 @@ #if ENABLED(EEPROM_SETTINGS) && NONE(I2C_EEPROM, SPI_EEPROM, QSPI_EEPROM, FLASH_EEPROM_EMULATION, SRAM_EEPROM_EMULATION, SDCARD_EEPROM_EMULATION) #define NO_EEPROM_SELECTED 1 #endif + +// Flag whether hex_print.cpp is used +#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE) + #define NEED_HEX_PRINT 1 +#endif diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp new file mode 100644 index 0000000000..6bcc00e420 --- /dev/null +++ b/Marlin/src/libs/hex_print.cpp @@ -0,0 +1,90 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../inc/MarlinConfig.h" +#include "../gcode/parser.h" + +#if NEED_HEX_PRINT + +#include "hex_print.h" + +#ifdef CPU_32_BIT + constexpr int byte_start = 4; + static char _hex[] = "0x00000000"; +#else + constexpr int byte_start = 0; + static char _hex[] = "0x0000"; +#endif + +char* hex_byte(const uint8_t b) { + _hex[byte_start + 4] = hex_nybble(b >> 4); + _hex[byte_start + 5] = hex_nybble(b); + return &_hex[byte_start + 4]; +} + +inline void _hex_word(const uint16_t w) { + _hex[byte_start + 2] = hex_nybble(w >> 12); + _hex[byte_start + 3] = hex_nybble(w >> 8); + _hex[byte_start + 4] = hex_nybble(w >> 4); + _hex[byte_start + 5] = hex_nybble(w); +} + +char* hex_word(const uint16_t w) { + _hex_word(w); + return &_hex[byte_start + 2]; +} + +#ifdef CPU_32_BIT + char* hex_long(const uint32_t l) { + _hex[2] = hex_nybble(l >> 28); + _hex[3] = hex_nybble(l >> 24); + _hex[4] = hex_nybble(l >> 20); + _hex[5] = hex_nybble(l >> 16); + _hex_word((uint16_t)(l & 0xFFFF)); + return &_hex[2]; + } +#endif + +char* hex_address(const void * const w) { + #ifdef CPU_32_BIT + (void)hex_long((ptr_int_t)w); + #else + (void)hex_word((ptr_int_t)w); + #endif + return _hex; +} + +void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } +void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } +void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } +void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } + +void print_hex_long(const uint32_t w, const char delimiter) { + SERIAL_ECHOPGM("0x"); + for (int B = 24; B >= 8; B -= 8){ + print_hex_byte(w >> B); + SERIAL_CHAR(delimiter); + } + print_hex_byte(w); +} + +#endif // NEED_HEX_PRINT diff --git a/Marlin/src/libs/hex_print_routines.h b/Marlin/src/libs/hex_print.h similarity index 100% rename from Marlin/src/libs/hex_print_routines.h rename to Marlin/src/libs/hex_print.h diff --git a/Marlin/src/libs/hex_print_routines.cpp b/Marlin/src/libs/hex_print_routines.cpp deleted file mode 100644 index 5909ffd7d0..0000000000 --- a/Marlin/src/libs/hex_print_routines.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfig.h" -#include "../gcode/parser.h" - -#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE) - - #include "hex_print_routines.h" - - #ifdef CPU_32_BIT - constexpr int byte_start = 4; - static char _hex[] = "0x00000000"; - #else - constexpr int byte_start = 0; - static char _hex[] = "0x0000"; - #endif - - char* hex_byte(const uint8_t b) { - _hex[byte_start + 4] = hex_nybble(b >> 4); - _hex[byte_start + 5] = hex_nybble(b); - return &_hex[byte_start + 4]; - } - - inline void _hex_word(const uint16_t w) { - _hex[byte_start + 2] = hex_nybble(w >> 12); - _hex[byte_start + 3] = hex_nybble(w >> 8); - _hex[byte_start + 4] = hex_nybble(w >> 4); - _hex[byte_start + 5] = hex_nybble(w); - } - - char* hex_word(const uint16_t w) { - _hex_word(w); - return &_hex[byte_start + 2]; - } - - #ifdef CPU_32_BIT - char* hex_long(const uint32_t l) { - _hex[2] = hex_nybble(l >> 28); - _hex[3] = hex_nybble(l >> 24); - _hex[4] = hex_nybble(l >> 20); - _hex[5] = hex_nybble(l >> 16); - _hex_word((uint16_t)(l & 0xFFFF)); - return &_hex[2]; - } - #endif - - char* hex_address(const void * const w) { - #ifdef CPU_32_BIT - (void)hex_long((ptr_int_t)w); - #else - (void)hex_word((ptr_int_t)w); - #endif - return _hex; - } - - void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } - void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } - void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } - void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } - - void print_hex_long(const uint32_t w, const char delimiter) { - SERIAL_ECHOPGM("0x"); - for (int B = 24; B >= 8; B -= 8){ - print_hex_byte(w >> B); - SERIAL_CHAR(delimiter); - } - print_hex_byte(w); - } - -#endif // AUTO_BED_LEVELING_UBL || M100_FREE_MEMORY_WATCHER || DEBUG_GCODE_PARSER From 7d3be90159c30699df5392dcae9d305268137fd9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 6 Aug 2020 04:19:56 -0500 Subject: [PATCH 0047/1370] Conditions cleanup --- Marlin/src/feature/leds/printer_event_leds.cpp | 2 +- Marlin/src/feature/leds/printer_event_leds.h | 2 +- Marlin/src/inc/Conditionals_adv.h | 5 +++++ Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/libs/least_squares_fit.cpp | 4 ++-- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index 58084da837..31c628c281 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -21,7 +21,7 @@ */ /** - * printer_event_leds.cpp - LED color changing based on printer status + * feature/leds/printer_event_leds.cpp - LED color changing based on printer status */ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index 0295f9f5ac..86ec292aa3 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -22,7 +22,7 @@ #pragma once /** - * printer_event_leds.h - LED color changing based on printer status + * feature/leds/printer_event_leds.h - LED color changing based on printer status */ #include "leds.h" diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index a057034ab6..277131289a 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -383,3 +383,8 @@ #if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE) #define NEED_HEX_PRINT 1 #endif + +// Flag whether least_squares_fit.cpp is used +#if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + #define NEED_LSF 1 +#endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 5534acaf2c..a93e0527bf 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1955,7 +1955,7 @@ #if PIN_EXISTS(DIGIPOTSS) #define HAS_DIGIPOTSS 1 #endif -#if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_E) +#if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_E) #define HAS_MOTOR_CURRENT_PWM 1 #endif diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 8a5095c88f..997130a91a 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -451,7 +451,7 @@ void ubl_map_screen() { #if IS_KINEMATIC // Index of the mesh point upon entry - const uint32_t old_pos_index = grid_index(x_plot, y_plot); + const int32_t old_pos_index = grid_index(x_plot, y_plot); // Direction from new (unconstrained) encoder value const int8_t step_dir = int32_t(ui.encoderPosition) < old_pos_index ? -1 : 1; #endif diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp index ce3a342b92..ef6ef9e90d 100644 --- a/Marlin/src/libs/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -34,7 +34,7 @@ #include "../inc/MarlinConfig.h" -#if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) +#if NEED_LSF #include "least_squares_fit.h" @@ -67,4 +67,4 @@ int finish_incremental_LSF(struct linear_fit_data *lsf) { return 0; } -#endif // AUTO_BED_LEVELING_UBL || ENABLED(AUTO_BED_LEVELING_LINEAR) +#endif // NEED_LSF From f4894b7140ed44d93888292d3f16615bdceefdce Mon Sep 17 00:00:00 2001 From: Marco Burato Date: Thu, 6 Aug 2020 12:38:18 +0200 Subject: [PATCH 0048/1370] More Anycubic + Trigorilla mappings, ExtUI (#18903) --- Marlin/Configuration.h | 16 +- Marlin/src/HAL/AVR/HAL.h | 11 + Marlin/src/HAL/AVR/MarlinSerial.cpp | 18 + Marlin/src/HAL/AVR/MarlinSerial.h | 17 + Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 6 +- .../extui/lib/anycubic/anycubic_serial.cpp | 290 ---------- .../lcd/extui/lib/anycubic/anycubic_serial.h | 145 ----- .../anycubic_i3mega_lcd.cpp} | 327 ++++++----- .../anycubic_i3mega_lcd.h} | 14 +- Marlin/src/lcd/extui/ui_api.cpp | 8 +- Marlin/src/lcd/extui/ui_api.h | 4 +- Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp | 536 ++++++++++++++++++ ..._tft.cpp => extui_anycubic_i3mega_lcd.cpp} | 8 +- Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 100 ++-- platformio.ini | 2 +- 16 files changed, 837 insertions(+), 667 deletions(-) delete mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp delete mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h rename Marlin/src/lcd/extui/lib/{anycubic/anycubic_tft.cpp => anycubic_i3mega/anycubic_i3mega_lcd.cpp} (75%) rename Marlin/src/lcd/extui/lib/{anycubic/anycubic_tft.h => anycubic_i3mega/anycubic_i3mega_lcd.h} (77%) create mode 100644 Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp rename Marlin/src/lcd/{extui_anycubic_tft.cpp => extui_anycubic_i3mega_lcd.cpp} (95%) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 25efa79b7d..75ee1eb990 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2136,6 +2136,16 @@ // //#define TOUCH_UI_FTDI_EVE +// +// Touch-screen LCD for Anycubic printers +// +//#define ANYCUBIC_LCD_I3MEGA +//#define ANYCUBIC_LCD_CHIRON +#if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + #define ANYCUBIC_LCD_SERIAL_PORT 3 + //#define ANYCUBIC_LCD_DEBUG +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extensible_ui'. @@ -2188,12 +2198,6 @@ //#define TFT_LVGL_UI_FSMC // Robin nano v1.2 uses FSMC //#define TFT_LVGL_UI_SPI // Robin nano v2.0 uses SPI -// -// Anycubic Mega TFT (AI3M) -// -//#define ANYCUBIC_TFT_MODEL -//#define ANYCUBIC_TFT_DEBUG - //============================================================================= //============================ Other Controllers ============================ //============================================================================= diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index b0e0674c73..609375e386 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -120,6 +120,17 @@ typedef int8_t pin_t; #define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.get_tx_buffer_free #endif +#ifdef ANYCUBIC_LCD_SERIAL_PORT + #if !WITHIN(ANYCUBIC_LCD_SERIAL_PORT, -1, 3) + #error "ANYCUBIC_LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #elif ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT + #error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." + #elif defined(SERIAL_PORT_2) && ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT_2 + #error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." + #endif + #define ANYCUBIC_LCD_SERIAL anycubicLcdSerial +#endif + // ------------------------ // Public functions // ------------------------ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index f41ef20114..3d44a3f59f 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -792,6 +792,24 @@ #endif +#ifdef ANYCUBIC_LCD_SERIAL_PORT + + ISR(SERIAL_REGNAME(USART,ANYCUBIC_LCD_SERIAL_PORT,_RX_vect)) { + MarlinSerial>::store_rxd_char(); + } + + ISR(SERIAL_REGNAME(USART,ANYCUBIC_LCD_SERIAL_PORT,_UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); + } + + // Preinstantiate + template class MarlinSerial>; + + // Instantiate + MarlinSerial> anycubicLcdSerial; + +#endif + // For AT90USB targets use the UART for BT interfacing #if defined(USBCON) && ENABLED(BLUETOOTH) HardwareSerial bluetoothSerial; diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 1182d86ac5..e8bfc5583a 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -312,6 +312,23 @@ extern MarlinSerial> internalDgusSerial; #endif +#ifdef ANYCUBIC_LCD_SERIAL_PORT + template + struct AnycubicLcdSerialCfg { + static constexpr int PORT = serial; + static constexpr unsigned int RX_SIZE = 64; + static constexpr unsigned int TX_SIZE = 128; + static constexpr bool XONOFF = false; + static constexpr bool EMERGENCYPARSER = false; + static constexpr bool DROPPED_RX = false; + static constexpr bool RX_OVERRUNS = false; + static constexpr bool RX_FRAMING_ERRORS = false; + static constexpr bool MAX_RX_QUEUED = false; + }; + + extern MarlinSerial> anycubicLcdSerial; +#endif + // Use the UART for Bluetooth in AT90USB configurations #if defined(USBCON) && ENABLED(BLUETOOTH) extern HardwareSerial bluetoothSerial; diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index c309822f92..4ffd6fddcc 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -411,7 +411,7 @@ #endif // Extensible UI serial touch screens. (See src/lcd/extui) -#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE) +#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) #define IS_EXTUI #define EXTENSIBLE_UI #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e1b162a96f..d296eb2f15 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -515,6 +515,8 @@ #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." #elif defined(TOUCH_BUTTONS) #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." +#elif defined(ANYCUBIC_TFT_MODEL) + #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." #endif #ifdef FIL_RUNOUT_INVERTING @@ -2237,7 +2239,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(TFT_320x240_SPI) \ + ENABLED(FSMC_GRAPHICAL_TFT) \ + ENABLED(TFT_LVGL_UI_FSMC) \ - + ENABLED(TFT_LVGL_UI_SPI) + + ENABLED(TFT_LVGL_UI_SPI) \ + + ENABLED(ANYCUBIC_LCD_I3MEGA) \ + + ENABLED(ANYCUBIC_LCD_CHIRON) #error "Please select no more than one LCD controller option." #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp deleted file mode 100644 index fd5f2691bd..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - anycubic_serial.cpp --- Support for Anycubic i3 Mega TFT serial connection - Created by Christian Hopp on 09.12.17. - - Original file: - HardwareSerial.cpp - Hardware serial library for Wiring - Copyright (c) 2006 Nicholas Zambetti. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Modified 23 November 2006 by David A. Mellis - Modified 28 September 2010 by Mark Sproul - Modified 14 August 2012 by Alarus -*/ - -#include "../../../../inc/MarlinConfig.h" - -#if ENABLED(ANYCUBIC_TFT_MODEL) - -#include - -// This next line disables the entire anycubic_serial.cpp, -// to support AtTiny series and other chips without a UART -#ifdef UBRR3H - -#include "anycubic_serial.h" - -#include -#include -#include -#include -#include "wiring_private.h" - -// Define constants and variables for buffering incoming serial data. We're -// using a ring buffer (I think), in which head is the index of the location -// to which to write the next incoming character and tail is the index of the -// location from which to read. -#if (RAMEND < 1000) - #define SERIAL_BUFFER_SIZE 64 -#else - #define SERIAL_BUFFER_SIZE 128 -#endif - -struct ring_buffer { - unsigned char buffer[SERIAL_BUFFER_SIZE]; - volatile unsigned int head; - volatile unsigned int tail; -}; - -ring_buffer rx_buffer_ajg = { { 0 }, 0, 0 }; -ring_buffer tx_buffer_ajg = { { 0 }, 0, 0 }; - -inline void store_char(unsigned char c, ring_buffer *buffer) { - int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; - - // if we should be storing the received character into the location - // just before the tail (meaning that the head would advance to the - // current location of the tail), we're about to overflow the buffer - // and so we don't write the character or advance the head. - if (i != buffer->tail) { - buffer->buffer[buffer->head] = c; - buffer->head = i; - } -} - -#if defined(USART3_RX_vect) && defined(UDR3) - void serialEvent3() __attribute__((weak)); - void serialEvent3() {} - #define serialEvent3_implemented - ISR(USART3_RX_vect) { - if (bit_is_clear(UCSR3A, UPE3)) { - unsigned char c = UDR3; - store_char(c, &rx_buffer_ajg); - } - else { - unsigned char c = UDR3; - } - } -#endif - -#ifdef USART3_UDRE_vect - - ISR(USART3_UDRE_vect) { - if (tx_buffer_ajg.head == tx_buffer_ajg.tail) { - // Buffer empty, so disable interrupts - cbi(UCSR3B, UDRIE3); - } - else { - // There is more data in the output buffer. Send the next byte - unsigned char c = tx_buffer_ajg.buffer[tx_buffer_ajg.tail]; - tx_buffer_ajg.tail = (tx_buffer_ajg.tail + 1) % SERIAL_BUFFER_SIZE; - - UDR3 = c; - } - } - -#endif - -// Constructors //////////////////////////////////////////////////////////////// - -AnycubicSerialClass::AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx_buffer, - volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, - volatile uint8_t *ucsra, volatile uint8_t *ucsrb, - volatile uint8_t *ucsrc, volatile uint8_t *udr, - uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x -) { - _rx_buffer = rx_buffer; - _tx_buffer = tx_buffer; - _ubrrh = ubrrh; - _ubrrl = ubrrl; - _ucsra = ucsra; - _ucsrb = ucsrb; - _ucsrc = ucsrc; - _udr = udr; - _rxen = rxen; - _txen = txen; - _rxcie = rxcie; - _udrie = udrie; - _u2x = u2x; -} - -// Public Methods ////////////////////////////////////////////////////////////// - -void AnycubicSerialClass::begin(unsigned long baud) { - uint16_t baud_setting; - bool use_u2x = true; - - #if F_CPU == 16000000UL - // hardcoded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards and the firmware on the 8U2 - // on the Uno and Mega 2560. - if (baud == 57600) use_u2x = false; - #endif - -try_again: - - if (use_u2x) { - *_ucsra = 1 << _u2x; - baud_setting = (F_CPU / 4 / baud - 1) / 2; - } else { - *_ucsra = 0; - baud_setting = (F_CPU / 8 / baud - 1) / 2; - } - - if ((baud_setting > 4095) && use_u2x) { - use_u2x = false; - goto try_again; - } - - // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) - *_ubrrh = baud_setting >> 8; - *_ubrrl = baud_setting; - - transmitting = false; - - sbi(*_ucsrb, _rxen); - sbi(*_ucsrb, _txen); - sbi(*_ucsrb, _rxcie); - cbi(*_ucsrb, _udrie); -} - -void AnycubicSerialClass::begin(unsigned long baud, byte config) { - uint16_t baud_setting; - uint8_t current_config; - bool use_u2x = true; - - #if F_CPU == 16000000UL - // hardcoded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards and the firmware on the 8U2 - // on the Uno and Mega 2560. - if (baud == 57600) use_u2x = false; - #endif - -try_again: - - if (use_u2x) { - *_ucsra = 1 << _u2x; - baud_setting = (F_CPU / 4 / baud - 1) / 2; - } - else { - *_ucsra = 0; - baud_setting = (F_CPU / 8 / baud - 1) / 2; - } - - if ((baud_setting > 4095) && use_u2x) { - use_u2x = false; - goto try_again; - } - - // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) - *_ubrrh = baud_setting >> 8; - *_ubrrl = baud_setting; - - //set the data bits, parity, and stop bits - #ifdef __AVR_ATmega8__ - config |= 0x80; // select UCSRC register (shared with UBRRH) - #endif - *_ucsrc = config; - - sbi(*_ucsrb, _rxen); - sbi(*_ucsrb, _txen); - sbi(*_ucsrb, _rxcie); - cbi(*_ucsrb, _udrie); -} - -void AnycubicSerialClass::end() { - // wait for transmission of outgoing data - while (_tx_buffer->head != _tx_buffer->tail) - ; - - cbi(*_ucsrb, _rxen); - cbi(*_ucsrb, _txen); - cbi(*_ucsrb, _rxcie); - cbi(*_ucsrb, _udrie); - - // clear any received data - _rx_buffer->head = _rx_buffer->tail; -} - -int AnycubicSerialClass::available(void) { - return (int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE; -} - -int AnycubicSerialClass::peek(void) { - if (_rx_buffer->head == _rx_buffer->tail) { - return -1; - } else { - return _rx_buffer->buffer[_rx_buffer->tail]; - } -} - -int AnycubicSerialClass::read(void) { - // if the head isn't ahead of the tail, we don't have any characters - if (_rx_buffer->head == _rx_buffer->tail) { - return -1; - } else { - unsigned char c = _rx_buffer->buffer[_rx_buffer->tail]; - _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % SERIAL_BUFFER_SIZE; - return c; - } -} - -void AnycubicSerialClass::flush() { - // UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT - while (transmitting && ! (*_ucsra & _BV(TXC0))); - transmitting = false; -} - -size_t AnycubicSerialClass::write(uint8_t c) { - int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE; - - // If the output buffer is full, there's nothing for it other than to - // wait for the interrupt handler to empty it a bit - // ???: return 0 here instead? - while (i == _tx_buffer->tail) - ; - - _tx_buffer->buffer[_tx_buffer->head] = c; - _tx_buffer->head = i; - - sbi(*_ucsrb, _udrie); - // clear the TXC bit -- "can be cleared by writing a one to its bit location" - transmitting = true; - sbi(*_ucsra, TXC0); - - return 1; -} - -AnycubicSerialClass::operator bool() { - return true; -} - -// Preinstantiate Objects ////////////////////////////////////////////////////// - -AnycubicSerialClass AnycubicSerial(&rx_buffer_ajg, &tx_buffer_ajg, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); - -#endif // UBRR3H -#endif // ANYCUBIC_TFT_MODEL diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h deleted file mode 100644 index ed4c19b63e..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - anycubic_serial.h --- Support for Anycubic i3 Mega TFT serial connection - Created by Christian Hopp on 09.12.17. - - Original file: - - HardwareSerial.h - Hardware serial library for Wiring - Copyright (c) 2006 Nicholas Zambetti. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Modified 28 September 2010 by Mark Sproul - Modified 14 August 2012 by Alarus -*/ -#pragma once - -#include -#include - -#include "Stream.h" - -#define FORCE_INLINE __attribute__((always_inline)) inline - -struct ring_buffer; - -class AnycubicSerialClass : public Stream { - private: - ring_buffer *_rx_buffer; - ring_buffer *_tx_buffer; - volatile uint8_t *_ubrrh; - volatile uint8_t *_ubrrl; - volatile uint8_t *_ucsra; - volatile uint8_t *_ucsrb; - volatile uint8_t *_ucsrc; - volatile uint8_t *_udr; - uint8_t _rxen; - uint8_t _txen; - uint8_t _rxcie; - uint8_t _udrie; - uint8_t _u2x; - bool transmitting; - public: - AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx_buffer, - volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, - volatile uint8_t *ucsra, volatile uint8_t *ucsrb, - volatile uint8_t *ucsrc, volatile uint8_t *udr, - uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x - ); - void begin(unsigned long); - void begin(unsigned long, uint8_t); - void end(); - virtual int available(void); - virtual int peek(void); - virtual int read(void); - virtual void flush(void); - virtual size_t write(uint8_t); - inline size_t write(unsigned long n) { return write((uint8_t)n); } - inline size_t write(long n) { return write((uint8_t)n); } - inline size_t write(unsigned int n) { return write((uint8_t)n); } - inline size_t write(int n) { return write((uint8_t)n); } - using Print::write; // pull in write(str) and write(buf, size) from Print - operator bool(); -}; - -// Define config for Serial.begin(baud, config); -#define SERIAL_5N1 0x00 -#define SERIAL_6N1 0x02 -#define SERIAL_7N1 0x04 -#define SERIAL_8N1 0x06 -#define SERIAL_5N2 0x08 -#define SERIAL_6N2 0x0A -#define SERIAL_7N2 0x0C -#define SERIAL_8N2 0x0E -#define SERIAL_5E1 0x20 -#define SERIAL_6E1 0x22 -#define SERIAL_7E1 0x24 -#define SERIAL_8E1 0x26 -#define SERIAL_5E2 0x28 -#define SERIAL_6E2 0x2A -#define SERIAL_7E2 0x2C -#define SERIAL_8E2 0x2E -#define SERIAL_5O1 0x30 -#define SERIAL_6O1 0x32 -#define SERIAL_7O1 0x34 -#define SERIAL_8O1 0x36 -#define SERIAL_5O2 0x38 -#define SERIAL_6O2 0x3A -#define SERIAL_7O2 0x3C -#define SERIAL_8O2 0x3E - -extern void serialEventRun(void) __attribute__((weak)); - -#define ANYCUBIC_SERIAL_PROTOCOL(x) (AnycubicSerial.print(x)) -#define ANYCUBIC_SERIAL_PROTOCOL_F(x,y) (AnycubicSerial.print(x, y)) -#define ANYCUBIC_SERIAL_PROTOCOLPGM(x) (AnycubicSerialprintPGM(PSTR(x))) -#define ANYCUBIC_SERIAL_(x) (AnycubicSerial.print(x), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_PROTOCOLLN(x) (AnycubicSerial.print(x), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) (AnycubicSerialprintPGM(PSTR(x)), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) - -#define ANYCUBIC_SERIAL_START() (AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_CMD_SEND(x) (AnycubicSerialprintPGM(PSTR(x)), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_ENTER() (AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_SPACE() (AnycubicSerial.write(' ')) - -const char newErr[] PROGMEM = "ERR "; -const char newSucc[] PROGMEM = "OK"; - -#define ANYCUBIC_SERIAL_ERROR_START (AnycubicSerialprintPGM(newErr)) -#define ANYCUBIC_SERIAL_ERROR(x) ANYCUBIC_SERIAL_PROTOCOL(x) -#define ANYCUBIC_SERIAL_ERRORPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) -#define ANYCUBIC_SERIAL_ERRORLN(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) -#define ANYCUBIC_SERIAL_ERRORLNPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) - -//##define ANYCUBIC_SERIAL_ECHO_START (AnycubicSerialprintPGM(newSucc)) -#define ANYCUBIC_SERIAL_ECHOLN(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) -#define ANYCUBIC_SERIAL_SUCC_START (AnycubicSerialprintPGM(newSucc)) -#define ANYCUBIC_SERIAL_ECHOPAIR(name,value) (serial_echopair_P(PSTR(name),(value))) -#define ANYCUBIC_SERIAL_ECHOPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) -#define ANYCUBIC_SERIAL_ECHO(x) ANYCUBIC_SERIAL_PROTOCOL(x) - -#ifdef UBRR3H - - extern AnycubicSerialClass AnycubicSerial; - - FORCE_INLINE void AnycubicSerialprintPGM(const char *str) { - char ch = pgm_read_byte(str); - while (ch) { - AnycubicSerial.write(ch); - ch = pgm_read_byte(++str); - } - } - -#endif diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp similarity index 75% rename from Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp rename to Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 718b47fee9..1c9b9299fc 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -1,5 +1,5 @@ /** - * anycubic_tft.cpp --- Support for Anycubic i3 Mega TFT + * anycubic_i3mega_lcd.cpp --- Support for Anycubic i3 Mega TFT * Created by Christian Hopp on 09.12.17. * Improved by David Ramiro * Converted to ext_iu by John BouAntoun 21 June 2020 @@ -21,15 +21,29 @@ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(ANYCUBIC_TFT_MODEL) +#if ENABLED(ANYCUBIC_LCD_I3MEGA) -#include "anycubic_tft.h" -#include "anycubic_serial.h" +#include "anycubic_i3mega_lcd.h" #include "../../../../inc/MarlinConfig.h" #include "../../ui_api.h" #include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +// command sending macro's with debugging capability +#define SEND_PGM(x) send_P(PSTR(x)) +#define SENDLINE_PGM(x) sendLine_P(PSTR(x)) +#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(itostr3(y))) +#define SEND(x) send(x) +#define SENDLINE(x) sendLine(x) +#if ENABLED(ANYCUBIC_LCD_DEBUG) + #define SENDLINE_DBG_PGM(x,y) (sendLine_P(PSTR(x)), SERIAL_ECHOLNPGM(y)) + #define SENDLINE_DBG_PGM_VAL(x,y,z) (sendLine_P(PSTR(x)), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) +#else + #define SENDLINE_DBG_PGM(x,y) sendLine_P(PSTR(x)) + #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) +#endif + + AnycubicTFTClass AnycubicTFT; char _conv[8]; @@ -43,6 +57,30 @@ char *itostr2(const uint8_t &x) { return _conv; } +static void sendNewLine(void) { + ANYCUBIC_LCD_SERIAL.write('\r'); + ANYCUBIC_LCD_SERIAL.write('\n'); +} + +static void send(const char *str) { + ANYCUBIC_LCD_SERIAL.print(str); +} + +static void sendLine(const char *str) { + send(str); + sendNewLine(); +} + +static void send_P(PGM_P str) { + while (const char c = pgm_read_byte(str++)) + ANYCUBIC_LCD_SERIAL.write(c); +} + +static void sendLine_P(PGM_P str) { + send_P(str); + sendNewLine(); +} + #ifndef ULTRA_LCD #define DIGIT(n) ('0' + (n)) #define DIGIMOD(n, f) DIGIT((n) / (f) % 10) @@ -74,8 +112,8 @@ char *itostr2(const uint8_t &x) { AnycubicTFTClass::AnycubicTFTClass() {} void AnycubicTFTClass::OnSetup() { - AnycubicSerial.begin(115200); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset + ANYCUBIC_LCD_SERIAL.begin(115200); + SENDLINE_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset ExtUI::delay_ms(10); // initialise the state of the key pins running on the tft @@ -92,7 +130,7 @@ void AnycubicTFTClass::OnSetup() { mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // DoSDCardStateCheck(); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready + SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready ExtUI::delay_ms(10); DoFilamentRunoutCheck(); @@ -101,7 +139,7 @@ void AnycubicTFTClass::OnSetup() { #if ENABLED(STARTUP_CHIME) ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); #endif - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished startup"); #endif } @@ -112,7 +150,7 @@ void AnycubicTFTClass::OnCommandScan() { if (ELAPSED(ms, nextStopCheck)) { nextStopCheck = ms + 1000UL; if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); #endif mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; @@ -120,7 +158,7 @@ void AnycubicTFTClass::OnCommandScan() { ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status ExtUI::delay_ms(200); // tell printer to release resources of print to indicate it is done - ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); + SENDLINE_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); } } @@ -134,11 +172,11 @@ void AnycubicTFTClass::OnCommandScan() { } void AnycubicTFTClass::OnKillTFT() { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); + SENDLINE_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); } void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered..."); SERIAL_ECHO(itostr2(isInserted)); SERIAL_EOL(); @@ -147,21 +185,21 @@ void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { } void AnycubicTFTClass::OnSDCardError() { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); #endif - ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); } void AnycubicTFTClass::OnFilamentRunout() { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); #endif DoFilamentRunoutCheck(); } void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: OnUserConfirmRequired triggered... "); SERIAL_ECHOLN(msg); #endif @@ -181,36 +219,36 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKED; // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); } else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); + SENDLINE_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); } else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKING; // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out // disable continue button - // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause + // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); } else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); } else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED; // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); } #endif } @@ -360,7 +398,7 @@ void AnycubicTFTClass::HandleSpecialMenu() { default: break; } - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) } else { SERIAL_ECHOPGM("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); @@ -375,14 +413,13 @@ void AnycubicTFTClass::RenderCurrentFileList() { SelectedDirectory[0] = 0; SelectedFile[0] = 0; - ANYCUBIC_SERIAL_PROTOCOLPGM("FN "); // Filelist start - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("FN "); // Filelist start if (!ExtUI::isMediaInserted() && !SpecialMenu) { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); } else { if (CodeSeen('S')) @@ -393,8 +430,7 @@ void AnycubicTFTClass::RenderCurrentFileList() { else RenderCurrentFolder(selectedNumber); } - ANYCUBIC_SERIAL_PROTOCOLPGM("END"); // Filelist stop - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("END"); // Filelist stop #endif // SDSUPPORT } @@ -402,58 +438,58 @@ void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { switch (selectedNumber) { #if ENABLED(PROBE_MANUALLY) case 0: // First Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01ZUp0.1>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ZUp0.02>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03ZDn0.02>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04ZDn0.1>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<01ZUp0.1>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<02ZUp0.02>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<03ZDn0.02>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<04ZDn0.1>"); + SENDLINE_PGM(""); break; case 4: // Second Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05PrehtBed>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SMeshLvl>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07MeshNPnt>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<08HtEndPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<05PrehtBed>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<06SMeshLvl>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<07MeshNPnt>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<08HtEndPID>"); + SENDLINE_PGM(""); break; case 8: // Third Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<09HtBedPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<10FWDeflts>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<11SvEEPROM>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<09HtBedPID>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<10FWDeflts>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<11SvEEPROM>"); + SENDLINE_PGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); break; #else case 0: // First Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01PrehtBed>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ABL>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03HtEndPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04HtBedPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<01PrehtBed>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<02ABL>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<03HtEndPID>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<04HtBedPID>"); + SENDLINE_PGM(""); break; case 4: // Second Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05FWDeflts>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SvEEPROM>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07SendM108>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<05FWDeflts>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<06SvEEPROM>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<07SendM108>"); + SENDLINE_PGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); break; #endif // PROBE_MANUALLY @@ -477,30 +513,30 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { for (cnt = selectedNumber; cnt <= max_files; cnt++) { if (cnt == 0) { // Special Entry if (currentFileList.isAtRootDir()) { - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); } else { - ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); + SENDLINE_PGM("/.."); + SENDLINE_PGM("/.."); } } else { currentFileList.seek(cnt - 1, false); - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLN(currentFileList.filename()); #endif if (currentFileList.isDir()) { - ANYCUBIC_SERIAL_PROTOCOLPGM("/"); - ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); - ANYCUBIC_SERIAL_PROTOCOLPGM("/"); - ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); + SEND_PGM("/"); + SENDLINE(currentFileList.shortFilename()); + SEND_PGM("/"); + SENDLINE(currentFileList.longFilename()); } else { - ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); - ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); + SENDLINE(currentFileList.shortFilename()); + SENDLINE(currentFileList.longFilename()); } } } @@ -509,7 +545,7 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { void AnycubicTFTClass::OnPrintTimerStarted() { #if ENABLED(SDSUPPORT) if (mediaPrintingState == AMPRINTSTATE_PRINTING) - ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print + SENDLINE_DBG_PGM("J04", "TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print #endif } @@ -528,7 +564,7 @@ void AnycubicTFTClass::OnPrintTimerStopped() { if (mediaPrintingState == AMPRINTSTATE_PRINTING) { mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); + SENDLINE_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); } // otherwise it was stopped by the printer so don't send print completed signal to TFT #endif @@ -536,8 +572,8 @@ void AnycubicTFTClass::OnPrintTimerStopped() { void AnycubicTFTClass::GetCommandFromTFT() { char *starpos = NULL; - while (AnycubicSerial.available() > 0 && TFTbuflen < TFTBUFSIZE) { - serial3_char = AnycubicSerial.read(); + while (ANYCUBIC_LCD_SERIAL.available() > 0 && TFTbuflen < TFTBUFSIZE) { + serial3_char = ANYCUBIC_LCD_SERIAL.read(); if (serial3_char == '\n' || serial3_char == '\r' || serial3_char == ':' || @@ -553,7 +589,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) if ((a_command > 7) && (a_command != 20)) { // No debugging of status polls, please! SERIAL_ECHOPGM("TFT Serial Command: "); SERIAL_ECHOLN(TFTcmdbuffer[TFTbufindw]); @@ -563,25 +599,25 @@ void AnycubicTFTClass::GetCommandFromTFT() { switch (a_command) { case 0: { // A0 GET HOTEND TEMP float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SENDCOMMANDPGM_VAL("A0V ", int(hotendActualTemp + 0.5)); + SEND_PGM_VAL("A0V ", int(hotendActualTemp + 0.5)); } break; case 1: { // A1 GET HOTEND TARGET TEMP float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SENDCOMMANDPGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); + SEND_PGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); } break; case 2: { // A2 GET HOTBED TEMP float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); - ANYCUBIC_SENDCOMMANDPGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); + SEND_PGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); } break; case 3: { // A3 GET HOTBED TARGET TEMP float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); - ANYCUBIC_SENDCOMMANDPGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); + SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); } break; @@ -589,7 +625,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { { float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); fanPercent = constrain(fanPercent, 0, 100); - ANYCUBIC_SENDCOMMANDPGM_VAL("A4V ", int(fanPercent)); + SEND_PGM_VAL("A4V ", int(fanPercent)); } break; @@ -598,58 +634,46 @@ void AnycubicTFTClass::GetCommandFromTFT() { float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); - ANYCUBIC_SERIAL_PROTOCOLPGM("A5V"); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("X: "); - ANYCUBIC_SERIAL_PROTOCOL(xPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("Y: "); - ANYCUBIC_SERIAL_PROTOCOL(yPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("Z: "); - ANYCUBIC_SERIAL_PROTOCOL(zPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_ENTER(); + SEND_PGM("A5V X: "); + ANYCUBIC_LCD_SERIAL.print(xPostition); + SEND_PGM(" Y: "); + ANYCUBIC_LCD_SERIAL.print(yPostition); + SEND_PGM(" Z: "); + ANYCUBIC_LCD_SERIAL.print(zPostition); + SENDLINE_PGM(""); } break; case 6: // A6 GET SD CARD PRINTING STATUS #if ENABLED(SDSUPPORT) if (ExtUI::isPrintingFromMedia()) { - ANYCUBIC_SERIAL_PROTOCOLPGM("A6V "); + SEND_PGM("A6V "); if (ExtUI::isMediaInserted()) { - ANYCUBIC_SERIAL_PROTOCOL(itostr3(int(ExtUI::getProgress_percent()))); - ANYCUBIC_SERIAL_ENTER(); + SENDLINE(itostr3(int(ExtUI::getProgress_percent()))); } else { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); } } else { - ANYCUBIC_SERIAL_PROTOCOLPGM("A6V ---"); - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("A6V ---"); } #endif break; case 7: { // A7 GET PRINTING TIME uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); - ANYCUBIC_SERIAL_PROTOCOLPGM("A7V "); + SEND_PGM("A7V "); if (elapsedSeconds != 0) { // print time uint32_t elapsedMinutes = elapsedSeconds / 60; - ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes / 60)); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("H"); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes % 60)); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("M"); + SEND(itostr2(elapsedMinutes / 60)); + SEND_PGM(" H "); + SEND(itostr2(elapsedMinutes % 60)); + SENDLINE_PGM(" M"); } else { - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("999:999"); + SENDLINE_PGM(" 999:999"); } - ANYCUBIC_SERIAL_ENTER(); } break; @@ -693,15 +717,15 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (TFTstrchr_pointer[4] == '/') { strcpy(SelectedDirectory, TFTstrchr_pointer + 5); SelectedFile[0] = 0; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + SENDLINE_PGM(""); } else if (TFTstrchr_pointer[4] == '<') { strcpy(SelectedDirectory, TFTstrchr_pointer + 4); SpecialMenu = true; SelectedFile[0] = 0; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + SENDLINE_PGM(""); } else { SelectedDirectory[0] = 0; @@ -710,7 +734,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { *(starpos - 1) = '\0'; strcpy(SelectedFile, TFTstrchr_pointer + 4); - ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected + SENDLINE_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected } } #endif @@ -766,7 +790,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM(""); } break; @@ -776,7 +800,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { disable_all_steppers(); } - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM(""); break; case 20: { // A20 read printing speed @@ -785,7 +809,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (CodeSeen('S')) feedrate_percentage = constrain(CodeValue(), 40, 999); else - ANYCUBIC_SENDCOMMANDPGM_VAL("A20V ", feedrate_percentage); + SEND_PGM_VAL("A20V ", feedrate_percentage); } break; @@ -855,14 +879,14 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (strlen(commandStr) > 0) { sprintf_P(fullCommandStr, PSTR("G91\n%s\nG90"), commandStr); - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); SERIAL_ECHOLN(fullCommandStr); #endif ExtUI::injectCommands(fullCommandStr); } } - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM(""); break; case 23: // A23 preheat pla @@ -872,8 +896,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SERIAL_SUCC_START; - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("OK"); } break; @@ -884,8 +907,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SERIAL_SUCC_START; - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("OK"); } break; @@ -894,7 +916,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { ExtUI::setTargetTemp_celsius(0, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(0, (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down + SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down } break; @@ -915,7 +937,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } } else { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); } SelectedDirectory[0] = 0; @@ -931,13 +953,12 @@ void AnycubicTFTClass::GetCommandFromTFT() { NOOP; else if (CodeSeen('C')) NOOP; - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM(""); break; case 33: // A33 get version info - ANYCUBIC_SERIAL_PROTOCOLPGM("J33 "); - ANYCUBIC_SERIAL_PROTOCOLPGM(DETAILED_BUILD_VERSION); - ANYCUBIC_SERIAL_ENTER(); + SEND_PGM("J33 "); + SENDLINE_PGM(DETAILED_BUILD_VERSION); break; default: @@ -959,9 +980,9 @@ void AnycubicTFTClass::DoSDCardStateCheck() { #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) bool isInserted = ExtUI::isMediaInserted(); if (isInserted) - ANYCUBIC_SENDCOMMAND_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); + SENDLINE_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); else - ANYCUBIC_SENDCOMMAND_DBG_PGM("J01", "TFT Serial Debug: SD card state changed... !isInserted"); + SENDLINE_DBG_PGM("J01", "TFT Serial Debug: SD card state changed... !isInserted"); #endif } @@ -976,10 +997,10 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); // tell the user that the filament has run out and wait - ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); + SENDLINE_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); } else { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); + SENDLINE_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); } } #endif // FILAMENT_RUNOUT_SENSOR @@ -988,7 +1009,7 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { void AnycubicTFTClass::StartPrint() { #if ENABLED(SDSUPPORT) if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); SERIAL_ECHO(ExtUI::isPrinting()); SERIAL_ECHOPGM(" "); @@ -1006,7 +1027,7 @@ void AnycubicTFTClass::PausePrint() { if (ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state - ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause + SENDLINE_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause // for some reason pausing the print doesn't retract the extruder so force a manual one here ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); @@ -1019,7 +1040,7 @@ void AnycubicTFTClass::ResumePrint() { #if ENABLED(SDSUPPORT) #if ENABLED(FILAMENT_RUNOUT_SENSOR) if (READ(FIL_RUNOUT_PIN)) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); #endif @@ -1027,7 +1048,7 @@ void AnycubicTFTClass::ResumePrint() { DoFilamentRunoutCheck(); // re-enable the continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still tripped... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still tripped... J18"); return; } #endif @@ -1036,7 +1057,7 @@ void AnycubicTFTClass::ResumePrint() { mediaPauseState = AMPAUSESTATE_REHEATING; // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out // // disable the continue button - // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause + // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause // reheat the nozzle ExtUI::setUserConfirmed(); @@ -1045,7 +1066,7 @@ void AnycubicTFTClass::ResumePrint() { mediaPrintingState = AMPRINTSTATE_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now + SENDLINE_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now ExtUI::resumePrint(); } #endif @@ -1055,7 +1076,7 @@ void AnycubicTFTClass::StopPrint() { #if ENABLED(SDSUPPORT) mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); + SENDLINE_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); // for some reason stopping the print doesn't retract the extruder so force a manual one here ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); @@ -1063,4 +1084,4 @@ void AnycubicTFTClass::StopPrint() { #endif } -#endif // ANYCUBIC_TFT_MODEL +#endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h similarity index 77% rename from Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h rename to Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h index 324dfd213f..ee011f1dfe 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h @@ -1,5 +1,5 @@ /** - * anycubic_tft.h --- Support for Anycubic i3 Mega TFT + * anycubic_i3mega_lcd.h --- Support for Anycubic i3 Mega TFT * Created by Christian Hopp on 09.12.17. * Improved by David Ramiro * Converted to ext_iu by John BouAntoun 21 June 2020 @@ -23,18 +23,6 @@ #include "../../../../inc/MarlinConfigPre.h" #include "../../../../sd/SdFatConfig.h" // for the FILENAME_LENGTH macro -// command sending macro's with debugging capability -#define ANYCUBIC_SENDCOMMANDPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) -#define ANYCUBIC_SENDCOMMANDPGM_VAL(x,y) (ANYCUBIC_SERIAL_PROTOCOLPGM(x), ANYCUBIC_SERIAL_PROTOCOLLN(itostr3(y))) -#define ANYCUBIC_SENDCOMMAND(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) -#if ENABLED(ANYCUBIC_TFT_DEBUG) - #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOLNPGM(y)) - #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) -#else - #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) - #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) -#endif - char *itostr2(const uint8_t &x); #ifndef ULTRA_LCD char *itostr3(const int); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index b5dbb11a06..451aa1f12a 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -304,7 +304,7 @@ namespace ExtUI { return epos; } - void setAxisPosition_mm(const float position, const axis_t axis) { + void setAxisPosition_mm(const float position, const axis_t axis, const feedRate_t feedrate/*=0*/) { // Start with no limits to movement float min = current_position[axis] - 1000, max = current_position[axis] + 1000; @@ -337,14 +337,14 @@ namespace ExtUI { #endif current_position[axis] = constrain(position, min, max); - line_to_current_position(manual_feedrate_mm_s[axis]); + line_to_current_position(feedrate ?: manual_feedrate_mm_s[axis]); } - void setAxisPosition_mm(const float position, const extruder_t extruder) { + void setAxisPosition_mm(const float position, const extruder_t extruder, const feedRate_t feedrate/*=0*/) { setActiveTool(extruder, true); current_position.e = position; - line_to_current_position(manual_feedrate_mm_s.e); + line_to_current_position(feedrate ?: manual_feedrate_mm_s.e); } void setActiveTool(const extruder_t extruder, bool no_move) { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index ae6f31d43e..ca12d79a8b 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -164,8 +164,8 @@ namespace ExtUI { void setTargetTemp_celsius(const float, const heater_t); void setTargetTemp_celsius(const float, const extruder_t); void setTargetFan_percent(const float, const fan_t); - void setAxisPosition_mm(const float, const axis_t); - void setAxisPosition_mm(const float, const extruder_t); + void setAxisPosition_mm(const float, const axis_t, const feedRate_t=0); + void setAxisPosition_mm(const float, const extruder_t, const feedRate_t=0); void setAxisSteps_per_mm(const float, const axis_t); void setAxisSteps_per_mm(const float, const extruder_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const axis_t); diff --git a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp new file mode 100644 index 0000000000..9d00db3353 --- /dev/null +++ b/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp @@ -0,0 +1,536 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * extui_anycubic_chiron_lcd.cpp + * + * Anycubic Chiron TFT support for Marlin + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "extui/ui_api.h" + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + #if GRID_MAX_POINTS_X != 5 || GRID_MAX_POINTS_Y != 5 + #error ANYCUBIC CHIRON LCD requires a 5x5 bed leveling grid (GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y) + #endif +#else + #error ANYCUBIC CHIRON LCD requires AUTO_BED_LEVELING_BILINEAR enabled +#endif + +#if DISABLED(FILAMENT_RUNOUT_SENSOR) + #error ANYCUBIC CHIRON LCD requires FILAMENT_RUNOUT_SENSOR enabled +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #error ANYCUBIC CHIRON LCD does not currently support POWER_LOSS_RECOVERY +#endif + +static bool is_auto_leveling = false; +static bool is_printing_from_sd = false; +static bool is_out_of_filament = false; + +static void sendNewLine(void) { + ANYCUBIC_LCD_SERIAL.write('\r'); + ANYCUBIC_LCD_SERIAL.write('\n'); +} + +static void send(const char *str) { + ANYCUBIC_LCD_SERIAL.print(str); +} + +static void sendLine(const char *str) { + send(str); + sendNewLine(); +} + +static void send_P(PGM_P str) { + while (const char c = pgm_read_byte(str++)) + ANYCUBIC_LCD_SERIAL.write(c); +} + +static void sendLine_P(PGM_P str) { + send_P(str); + sendNewLine(); +} + +static void sendValue_P(PGM_P prefix, int value) { + send_P(prefix); + ANYCUBIC_LCD_SERIAL.print(value); +} + +static void sendValue_P(PGM_P prefix, float value) { + send_P(prefix); + ANYCUBIC_LCD_SERIAL.print(value); +} + +static void sendValueLine_P(PGM_P prefix, int value) { + send_P(prefix); + ANYCUBIC_LCD_SERIAL.print(value); + sendNewLine(); +} + +static void sendValueLine_P(PGM_P prefix, float value) { + send_P(prefix); + ANYCUBIC_LCD_SERIAL.print(value); + sendNewLine(); +} + +static int parseIntArgument(const char *buffer, char letterId) { + char *p = strchr(buffer, letterId); + if (!p) + return -1; + return atoi(p+1); +} + +static float parseFloatArgument(const char *buffer, char letterId) { + char *p = strchr(buffer, letterId); + if (!p) + return NAN; + return strtof(p+1, nullptr); +} + +static int mmToHundredths(float x) { + // Round + if (x >= 0) + x += 0.005f; + else + x -= 0.005f; + return (int)(x * 100.0f); +} + +static float hundredthsToMm(int x) { + return x / 100.0f; +} + +#define SEND_PGM(str) send_P(PSTR(str)) +#define SENDLINE_PGM(str) sendLine_P(PSTR(str)) +#define SENDVALUE_PGM(prefix, value) sendValue_P(PSTR(prefix), value) +#define SENDVALUELINE_PGM(prefix, value) sendValueLine_P(PSTR(prefix), value) + +namespace ExtUI { + + static void moveAxis(float delta, feedRate_t feedrate, axis_t axis) { + float pos = getAxisPosition_mm(axis); + pos += delta; + setAxisPosition_mm(pos, axis, feedrate); + } + + static void handleCmd(const char *rx) { + static FileList fileList; + static char selectedFileShortName[8+1+3+1]; + + if (rx[0] != 'A') { + SERIAL_ECHOPGM("Unexpected RX: "); + SERIAL_ECHOLN(rx); + + return; + } + + const int cmd = atoi(&rx[1]); + + // Uncomment for debugging RX + //if (cmd > 7 && cmd != 20) { + // SERIAL_ECHOPGM("RX: "); + // SERIAL_ECHOLN(rx); + //} + + switch (cmd) { + case 0: // Get Hotend Actual Temperature + SENDVALUELINE_PGM("A0V ", (int)getActualTemp_celsius(E0)); + break; + case 1: // Get Hotend Target Temperature + SENDVALUELINE_PGM("A1V ", (int)getTargetTemp_celsius(E0)); + break; + case 2: // Get Bed Actual Temperature + SENDVALUELINE_PGM("A2V ", (int)getActualTemp_celsius(BED)); + break; + case 3: // Get Bed Target Temperature + SENDVALUELINE_PGM("A3V ", (int)getTargetTemp_celsius(BED)); + break; + case 4: // Get Fan Speed + SENDVALUELINE_PGM("A4V ", (int)getTargetFan_percent(FAN0)); + break; + case 5: // Get Current Coordinates + SENDVALUE_PGM("A5V X: ", getAxisPosition_mm(X)); + SENDVALUE_PGM(" Y: ", getAxisPosition_mm(Y)); + SENDVALUE_PGM(" Z: ", getAxisPosition_mm(Z)); + sendNewLine(); + break; + case 6: // Get SD Card Print Status + if (isPrintingFromMedia()) + SENDVALUELINE_PGM("A6V ", (int)getProgress_percent()); + else + SENDLINE_PGM("A6V ---"); + break; + case 7: // Get Printing Time + if (isPrinting()) { + const int totalMinutes = getProgress_seconds_elapsed() / 60; + SENDVALUE_PGM("A7V ", (int)(totalMinutes/60)); + SENDVALUE_PGM(" H ", (int)(totalMinutes%60)); + SENDLINE_PGM(" M"); + } else { + SENDLINE_PGM("A7V 999:999"); + } + break; + case 8: // Get SD Card File List + if (isMediaInserted()) { + const int startIndex = parseIntArgument(rx, 'S'); + SENDLINE_PGM("FN "); + for (int i = 0, fileIndex = 0, numFiles = 0; i < (int)fileList.count() && numFiles < 4; i++) { + fileList.seek(i); + if (!fileList.isDir()) { + if (fileIndex >= startIndex) { + sendLine(fileList.shortFilename()); + sendLine(fileList.longFilename()); + numFiles++; + } + fileIndex++; + } + } + SENDLINE_PGM("END"); + } else { + SENDLINE_PGM("J02"); + } + break; + case 9: // Pause SD Card Print + if (isPrintingFromMedia()) { + pausePrint(); + is_printing_from_sd = false; + SENDLINE_PGM("J05"); + } else { + SENDLINE_PGM("J16"); // Print stopped + } + break; + case 10: // Resume SD Card Print + if (is_out_of_filament) { + is_out_of_filament = false; + // Filament change did eject the old filament automatically, + // now continue and load the new one + setUserConfirmed(); + SENDLINE_PGM("J04"); // Printing from SD card + } else if (isPrintingFromMediaPaused()) { + resumePrint(); + SENDLINE_PGM("J04"); // Printing from SD card + } + break; + case 11: // Stop SD Card Print + if (isPrintingFromMedia()) { + stopPrint(); + is_printing_from_sd = false; + SENDLINE_PGM("J16"); // Print stopped + } + break; + //case 12: // Kill + // break; + case 13: // Select File + if (!isPrinting()) { + // Store selected file name + char *p = strchr(rx, ' '); + if (p != nullptr && strlen(p+1) < sizeof(selectedFileShortName)) { + strcpy(selectedFileShortName, p+1); + SENDLINE_PGM("J20"); // Open succeeded + } + else + SENDLINE_PGM("J21"); // Open failed + } + break; + case 14: // Start Print + if (!isPrinting() && strcmp(selectedFileShortName, "") != 0) { + printFile(selectedFileShortName); + is_printing_from_sd = true; + SENDLINE_PGM("J04"); // Printing from SD card + } + break; + case 15: // Resume from power outage + // This is not supported, just report print as completed + SENDLINE_PGM("J16"); // Print stopped + break; + case 16: // Set Hotend Target Temperature + { + int temp = parseIntArgument(rx, 'S'); + if (temp >= 0) + setTargetTemp_celsius(temp, E0); + } + break; + case 17: // Set Bed Target Temperature + { + int temp = parseIntArgument(rx, 'S'); + if (temp >= 0) + setTargetTemp_celsius(temp, BED); + } + break; + case 18: // Set Fan Speed + { + int temp = parseIntArgument(rx, 'S'); + if (temp >= 0) + setTargetFan_percent(temp, FAN0); + } + break; + case 19: // Disable Motors + injectCommands_P(PSTR("M84")); + break; + case 20: // Get/Set Printing Speed + { + int newPerc = parseIntArgument(rx, 'S'); + if (newPerc >= 0) + setFeedrate_percent(newPerc); + else + SENDVALUELINE_PGM("A20V ", (int)getFeedrate_percent()); + } + break; + case 21: // Home axes + if (!isPrinting()) { + const bool hasX = strchr(rx, 'X') != nullptr, + hasY = strchr(rx, 'Y') != nullptr, + hasZ = strchr(rx, 'Z') != nullptr, + hasC = strchr(rx, 'C') != nullptr; + if (hasX || hasY || hasZ) { + if (hasX) injectCommands_P(PSTR("G28 X")); + if (hasY) injectCommands_P(PSTR("G28 Y")); + if (hasZ) injectCommands_P(PSTR("G28 Z")); + } else if (hasC) { + injectCommands_P(PSTR("G28")); + } + } + break; + case 22: // Move axes + if (!isPrinting()) { + const int feedrate = parseIntArgument(rx, 'F') / 60; + float delta; + if (!isnan(delta = parseFloatArgument(rx, 'X'))) + moveAxis(delta, feedrate, X); + else if (!isnan(delta = parseFloatArgument(rx, 'Y'))) + moveAxis(delta, feedrate, Y); + else if (!isnan(delta = parseFloatArgument(rx, 'Z'))) + moveAxis(delta, feedrate, Z); + } + break; + case 23: // Preheat PLA + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); + SENDLINE_PGM("OK"); + break; + case 24: // Preheat ABS + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); + SENDLINE_PGM("OK"); + break; + case 25: // Cool down + setTargetTemp_celsius(0, E0); + setTargetTemp_celsius(0, BED); + SENDLINE_PGM("J12"); + break; + case 26: // Refresh SD Card + fileList.refresh(); + break; + //case 27: // Adjust Servo Angles + // break; + //case 28: // Filament Test + // break; + case 29: // Get Bed Autolevel Grid + { + int x = parseIntArgument(rx, 'X'), + y = parseIntArgument(rx, 'Y'); + if (x != -1 && y != -1) { + xy_uint8_t coord; + coord.set(x, y); + const int value = mmToHundredths(getMeshPoint(coord)); + SENDVALUELINE_PGM("A29V ", value); + } + } + break; + case 30: // Autolevel + if (strchr(rx, 'S')) { // Autoleveling started by clicking "PROBE" and then "OK" + // Note: + // We check for completion by monitoring the command queue. + // Since it will become empty *while* processing the last injected command, + // we enqueue an extra 10ms delay so we can the determine when all the others + // have completed. + if (isMachineHomed()) + injectCommands_P(PSTR("G29\nG4 P10")); + else + injectCommands_P(PSTR("G28\nG29\nG4 P10")); + is_auto_leveling = true; + } else { // Entering Autoleveling screen + if (isPrinting()) + SENDLINE_PGM("J24"); // Disallow autoleveling + else + SENDLINE_PGM("J26"); // Allow autoleveling + } + break; + case 31: // Set Bed Autolevel Z offset + if (strchr(rx, 'G')) { // Get + SENDVALUELINE_PGM("A31V ", getZOffset_mm()); + } else if (strchr(rx, 'S')) { // Set + float delta = parseFloatArgument(rx, 'S'); + delta = constrain(delta, -1.0, 1.0); + setZOffset_mm(getZOffset_mm() + delta); + + SENDVALUELINE_PGM("A31V ", getZOffset_mm()); + } else if (strchr(rx, 'D')) { // Save + injectCommands_P(PSTR("M500")); + } + break; + //case 32: // ? + // break; + case 33: // Get Version Info + SENDLINE_PGM("J33 " SHORT_BUILD_VERSION); + break; + case 34: // Set Bed Autolevel Grid + { + int x = parseIntArgument(rx, 'X'), + y = parseIntArgument(rx, 'Y'), + v = parseIntArgument(rx, 'V'); + if (x != -1 && y != -1 && v != -1) { // Set new value + float value = hundredthsToMm(v); + value = constrain(value, -10, 10); + + xy_uint8_t coord; + coord.set(x, y); + setMeshPoint(coord, value); + } else if (strchr(rx, 'S')) { // Save (apply new values) + injectCommands_P(PSTR("M500")); + } else if (strchr(rx, 'C')) { // Cancel (discard new values) + injectCommands_P(PSTR("M501")); + } + } + break; + } + } + + #define RX_LEN_MAX 63 + static void parseSerialRx() { + static char rxBuffer[RX_LEN_MAX+1]; + static uint8_t rxLen = 0; + + while (ANYCUBIC_LCD_SERIAL.available()) { + const char c = ANYCUBIC_LCD_SERIAL.read(); + switch (c) { + case '\r': case '\n': + if (rxLen > 0 && rxLen <= RX_LEN_MAX) { + rxBuffer[rxLen] = '\0'; // Terminate string + handleCmd(rxBuffer); + } + rxLen = 0; + break; + default: + if (rxLen < RX_LEN_MAX) + rxBuffer[rxLen++] = c; + else { + rxLen = 0xFF; // Overrun + SERIAL_ECHOPGM("Warning: dropping long received line"); + } + break; + } + } + } + + static void detectPrintFromSdCompletion() { + // Note: printFile() queues some commands that actually start the print, so isPrintingFromMedia() + // initially returns false + if (is_printing_from_sd && !commandsInQueue() && !isPrintingFromMedia()) { + is_printing_from_sd = false; + SENDLINE_PGM("J14"); // Print done + } + } + + static void detectAutolevelingCompletion() { + if (is_auto_leveling && !commandsInQueue()) { + is_auto_leveling = false; + injectCommands_P(PSTR("M500")); + SENDLINE_PGM("J25"); // Autoleveling done + } + } + + void onStartup() { + ANYCUBIC_LCD_SERIAL.begin(115200); + sendNewLine(); + SENDLINE_PGM("J17"); // Reset + delay_ms(10); + SENDLINE_PGM("J12"); // Ready + } + + void onIdle() { + parseSerialRx(); + detectAutolevelingCompletion(); + detectPrintFromSdCompletion(); + } + + void onPrinterKilled(PGM_P const error, PGM_P const component) { } + + void onMediaInserted() { + SENDLINE_PGM("J00"); // SD Inserted + } + + void onMediaError() { } + + void onMediaRemoved() { + SENDLINE_PGM("J01"); // SD Removed + } + + void onPlayTone(const uint16_t frequency, const uint16_t duration) { + tone(BEEPER_PIN, frequency, duration); + } + + void onPrintTimerStarted() { } + + void onPrintTimerPaused() { } + + void onPrintTimerStopped() { } + + void onFilamentRunout(const extruder_t extruder) { + is_out_of_filament = true; + SENDLINE_PGM("J23"); // Filament runout + SENDLINE_PGM("J18"); // Print paused + // Note: printer will unload filament automatically + } + + void onUserConfirmRequired(const char * const msg) { } + + void onStatusChanged(const char * const msg) { } + + void onFactoryReset() { } + + void onStoreSettings(char *buff) { } + + void onLoadSettings(const char *buff) { } + + void onConfigurationStoreWritten(bool success) { } + + void onConfigurationStoreRead(bool success) { } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { } + + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume() { } + #endif + + #if HAS_PID_HEATING + void onPidTuning(const result_t rst) { } + #endif +} + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp similarity index 95% rename from Marlin/src/lcd/extui_anycubic_tft.cpp rename to Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp index 6383ee7b53..360ea75de8 100644 --- a/Marlin/src/lcd/extui_anycubic_tft.cpp +++ b/Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp @@ -21,14 +21,14 @@ */ /** - * extui_anycubic_tft.cpp + * extui_anycubic_i3mega_lcd.cpp */ #include "../inc/MarlinConfigPre.h" -#if BOTH(ANYCUBIC_TFT_MODEL, EXTENSIBLE_UI) +#if ENABLED(ANYCUBIC_LCD_I3MEGA) -#include "extui/lib/anycubic/anycubic_tft.h" +#include "extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h" #include "extui/ui_api.h" #include // for the ::tone() call @@ -101,4 +101,4 @@ namespace ExtUI { #endif } -#endif // ANYCUBIC_TFT_MODEL && EXTENSIBLE_UI +#endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index 6382d3af51..708f8fa26c 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -27,6 +27,16 @@ #define BOARD_INFO_NAME "Anycubic RAMPS 1.4" +// Board labeled pins: + +#define TG_HEATER_BED_PIN 8 +#define TG_HEATER_0_PIN 10 +#define TG_HEATER_1_PIN 45 // Anycubic Kossel: Unused + +#define TG_FAN0_PIN 9 // Anycubic Kossel: Usually the part cooling fan +#define TG_FAN1_PIN 7 // Anycubic Kossel: Unused +#define TG_FAN2_PIN 44 // Anycubic Kossel: Hotend fan + // // Servos // @@ -37,52 +47,6 @@ #define SERVO3_PIN 6 #endif -// -// Limit Switches -// -//#define ANYCUBIC_4_MAX_PRO_ENDSTOPS - -#define X_MIN_PIN 3 - -#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) - #define X_MAX_PIN 43 -#else - #define X_MAX_PIN 43 -#endif - -#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) - #define Y_STOP_PIN 19 -#else - #define Y_STOP_PIN 42 -#endif - -#define Z_STOP_PIN 18 - -// -// Z Probe (when not Z_MIN_PIN) -// -#define Z_MIN_PROBE_PIN 2 - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 19 -#endif - -// -// Heaters / Fans -// -#define TG_HEATER_BED_PIN 8 -#define TG_HEATER_0_PIN 10 -#define TG_HEATER_1_PIN 45 // Anycubic Kossel: Unused - -#define TG_FAN0_PIN 9 // Anycubic Kossel: Usually the part cooling fan -#define TG_FAN1_PIN 7 // Anycubic Kossel: Unused -#define TG_FAN2_PIN 44 // Anycubic Kossel: Hotend fan - -#define CONTROLLER_FAN_PIN TG_FAN1_PIN - -#define BEEPER_PIN 31 -#define SD_DETECT_PIN 49 - // Remap MOSFET pins to common usages: #define RAMPS_D10_PIN TG_HEATER_0_PIN // HEATER_0_PIN is always RAMPS_D10_PIN in pins_RAMPS.h @@ -100,7 +64,11 @@ #elif TEMP_SENSOR_BED // EFB (Anycubic Kossel default) #define RAMPS_D9_PIN TG_FAN0_PIN - #define RAMPS_D8_PIN TG_HEATER_BED_PIN + #if ENABLED(ANYCUBIC_CHIRON) + #define RAMPS_D8_PIN TG_HEATER_1_PIN // Heated bed is connected to HEATER1 output + #else + #define RAMPS_D8_PIN TG_HEATER_BED_PIN + #endif #else // EFF #define RAMPS_D9_PIN TG_FAN1_PIN @@ -116,6 +84,44 @@ #define E0_AUTO_FAN_PIN TG_FAN2_PIN // Used in Anycubic Kossel example config #endif +#if ENABLED(ANYCUBIC_I3MEGA) + #define CONTROLLER_FAN_PIN TG_FAN1_PIN +#endif + +// +// AnyCubic standard pin mappings +// +// On most printers, endstops are NOT all wired to the appropriate pins on the Trigorilla board. +// For instance, on a Chiron, Y axis goes to an aux connector. +// There are also other things that have been wired in creative ways. +// To enable PIN definitions for a specific printer model, #define the appropriate symbol after +// MOTHERBOARD in Configuration.h + +// +// Limit Switches +// +//#define ANYCUBIC_4_MAX_PRO_ENDSTOPS + +#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) + #define X_MAX_PIN 43 + #define Y_STOP_PIN 19 +#elif EITHER(ANYCUBIC_CHIRON, ANYCUBIC_I3MEGA) + #define Y_STOP_PIN 42 + #define Z2_MIN_PIN 43 + #ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 2 + #endif + #ifndef FIL_RUNOUT_PIN + #if ENABLED(ANYCUBIC_CHIRON) + #define FIL_RUNOUT_PIN 33 + #else + #define FIL_RUNOUT_PIN 19 + #endif + #endif + #define BEEPER_PIN 31 + #define SD_DETECT_PIN 49 +#endif + #include "pins_RAMPS.h" // diff --git a/platformio.ini b/platformio.ini index 450fffcc00..029ce65881 100644 --- a/platformio.ini +++ b/platformio.ini @@ -66,7 +66,7 @@ HAS_GRAPHICAL_TFT = src_filter=+ HAS_LCD_MENU = src_filter=+ HAS_DGUS_LCD = src_filter=+ TOUCH_UI_FTDI_EVE = src_filter=+ -ANYCUBIC_TFT_MODEL = src_filter=+ +ANYCUBIC_LCD_I3MEGA = src_filter=+ USB_FLASH_DRIVE_SUPPORT = src_filter=+ AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ + MESH_BED_LEVELING = src_filter=+ + From da6e5ce3db40877e437b91ac4c5f5708e88a3afa Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 6 Aug 2020 08:14:00 -0500 Subject: [PATCH 0049/1370] Optimize G-code / feature dependencies (#18919) --- Marlin/src/MarlinCore.cpp | 6 +- ...{binary_protocol.cpp => binary_stream.cpp} | 4 +- .../{binary_protocol.h => binary_stream.h} | 0 Marlin/src/feature/caselight.cpp | 48 +-- Marlin/src/feature/caselight.h | 26 +- Marlin/src/feature/e_parser.cpp | 2 +- Marlin/src/feature/e_parser.h | 2 +- Marlin/src/gcode/feature/caselight/M355.cpp | 76 +++-- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 +- Marlin/src/gcode/host/M115.cpp | 4 +- Marlin/src/gcode/queue.cpp | 5 +- Marlin/src/inc/Conditionals_LCD.h | 15 - Marlin/src/inc/Conditionals_post.h | 5 +- .../screens/advanced_settings_menu.cpp | 8 +- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/screens.h | 4 +- Marlin/src/lcd/extui/ui_api.cpp | 14 +- Marlin/src/lcd/menu/menu_led.cpp | 8 +- .../libs/heatshrink/heatshrink_decoder.cpp | 31 +- .../src/libs/heatshrink/heatshrink_decoder.h | 27 +- Marlin/src/module/configuration_store.cpp | 12 +- .../PlatformIO/scripts/common-dependencies.h | 88 +++++ .../PlatformIO/scripts/common-dependencies.py | 110 +++--- platformio.ini | 316 ++++++++++++++++-- 26 files changed, 632 insertions(+), 189 deletions(-) rename Marlin/src/feature/{binary_protocol.cpp => binary_stream.cpp} (95%) rename Marlin/src/feature/{binary_protocol.h => binary_stream.h} (100%) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 74e15250e6..8c5966f744 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -189,7 +189,7 @@ #include "feature/leds/tempstat.h" #endif -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) #include "feature/caselight.h" #endif @@ -1082,11 +1082,11 @@ void setup() { OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // OFF #endif - #if HAS_CASE_LIGHT + #if ENABLED(CASE_LIGHT_ENABLE) #if DISABLED(CASE_LIGHT_USE_NEOPIXEL) if (PWM_PIN(CASE_LIGHT_PIN)) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN); #endif - SETUP_RUN(update_case_light()); + SETUP_RUN(caselight.update_brightness()); #endif #if ENABLED(MK2_MULTIPLEXER) diff --git a/Marlin/src/feature/binary_protocol.cpp b/Marlin/src/feature/binary_stream.cpp similarity index 95% rename from Marlin/src/feature/binary_protocol.cpp rename to Marlin/src/feature/binary_stream.cpp index 5884a05f42..81e110339b 100644 --- a/Marlin/src/feature/binary_protocol.cpp +++ b/Marlin/src/feature/binary_stream.cpp @@ -25,7 +25,7 @@ #if ENABLED(BINARY_FILE_TRANSFER) #include "../sd/cardreader.h" -#include "binary_protocol.h" +#include "binary_stream.h" char* SDFileTransferProtocol::Packet::Open::data = nullptr; size_t SDFileTransferProtocol::data_waiting, SDFileTransferProtocol::transfer_timeout, SDFileTransferProtocol::idle_timeout; @@ -33,4 +33,4 @@ bool SDFileTransferProtocol::transfer_active, SDFileTransferProtocol::dummy_tran BinaryStream binaryStream[NUM_SERIAL]; -#endif // BINARY_FILE_TRANSFER +#endif diff --git a/Marlin/src/feature/binary_protocol.h b/Marlin/src/feature/binary_stream.h similarity index 100% rename from Marlin/src/feature/binary_protocol.h rename to Marlin/src/feature/binary_stream.h diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index 4287a0f262..8a128bb12d 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -22,14 +22,17 @@ #include "../inc/MarlinConfig.h" -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) -uint8_t case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; -bool case_light_on = CASE_LIGHT_DEFAULT_ON; +#include "caselight.h" + +CaseLight caselight; + +uint8_t CaseLight::brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; +bool CaseLight::on = CASE_LIGHT_DEFAULT_ON; #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - #include "leds/leds.h" - LEDColor case_light_color = + LEDColor CaseLight::color = #ifdef CASE_LIGHT_NEOPIXEL_COLOR CASE_LIGHT_NEOPIXEL_COLOR #else @@ -38,34 +41,33 @@ bool case_light_on = CASE_LIGHT_DEFAULT_ON; ; #endif -/** - * The following are needed because ARM chips ignore a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that - * are directly controlled by the PWM module. In order to turn them off the brightness level needs to be - * set to off. Since we can't use the pwm register to save the last brightness level we need a variable - * to save it. - */ -uint8_t case_light_brightness_sav; // saves brighness info so can restore when "M355 S1" received -bool case_light_arg_flag; // flag to notify if S or P argument type - #ifndef INVERT_CASE_LIGHT #define INVERT_CASE_LIGHT false #endif -void update_case_light() { +void CaseLight::update(const bool sflag) { + /** + * The brightness_sav (and sflag) is needed because ARM chips ignore + * a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that are directly + * controlled by the PWM module. In order to turn them off the brightness + * level needs to be set to OFF. Since we can't use the PWM register to + * save the last brightness level we need a variable to save it. + */ + static uint8_t brightness_sav; // Save brightness info for restore on "M355 S1" - if (!(case_light_arg_flag && !case_light_on)) - case_light_brightness_sav = case_light_brightness; // save brightness except if this is an S0 argument - if (case_light_arg_flag && case_light_on) - case_light_brightness = case_light_brightness_sav; // restore last brightens if this is an S1 argument + if (on || !sflag) + brightness_sav = brightness; // Save brightness except for M355 S0 + if (sflag && on) + brightness = brightness_sav; // Restore last brightness for M355 S1 #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) || DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - const uint8_t i = case_light_on ? case_light_brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; + const uint8_t i = on ? brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; #endif #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) leds.set_color( - MakeLEDColor(case_light_color.r, case_light_color.g, case_light_color.b, case_light_color.w, n10ct), + MakeLEDColor(color.r, color.g, color.b, color.w, n10ct), false ); @@ -83,11 +85,11 @@ void update_case_light() { else #endif { - const bool s = case_light_on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; + const bool s = on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); } #endif // !CASE_LIGHT_USE_NEOPIXEL } -#endif // HAS_CASE_LIGHT +#endif // CASE_LIGHT_ENABLE diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index ff01b1a67d..9d1e76da26 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -21,9 +21,25 @@ */ #pragma once -extern uint8_t case_light_brightness; -extern bool case_light_on; -extern uint8_t case_light_brightness_sav; // saves brighness info when case_light_on is false -extern bool case_light_arg_flag; // flag to notify if S or P argument type +#include "../inc/MarlinConfigPre.h" -void update_case_light(); +#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #include "leds/leds.h" +#endif + +class CaseLight { +public: + static uint8_t brightness; + static bool on; + + static void update(const bool sflag); + static inline void update_brightness() { update(false); } + static inline void update_enabled() { update(true); } + +private: + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + static LEDColor color; + #endif +}; + +extern CaseLight caselight; diff --git a/Marlin/src/feature/e_parser.cpp b/Marlin/src/feature/e_parser.cpp index 85b1845a64..a4c2d0dac9 100644 --- a/Marlin/src/feature/e_parser.cpp +++ b/Marlin/src/feature/e_parser.cpp @@ -21,7 +21,7 @@ */ /** - * emergency_parser.cpp - Intercept special commands directly in the serial stream + * e_parser.cpp - Intercept special commands directly in the serial stream */ #include "../inc/MarlinConfigPre.h" diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index 73e459680e..8d11463ecd 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -22,7 +22,7 @@ #pragma once /** - * emergency_parser.h - Intercept special commands directly in the serial stream + * e_parser.h - Intercept special commands directly in the serial stream */ #include "../inc/MarlinConfigPre.h" diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index 4d2acd189c..bb6b57f666 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -20,45 +20,47 @@ * */ -#include "../../gcode.h" - #include "../../../inc/MarlinConfig.h" -#if HAS_CASE_LIGHT - #include "../../../feature/caselight.h" +#if ENABLED(CASE_LIGHT_ENABLE) - /** - * M355: Turn case light on/off and set brightness - * - * P Set case light brightness (PWM pin required - ignored otherwise) - * - * S Set case light on/off - * - * When S turns on the light on a PWM pin then the current brightness level is used/restored - * - * M355 P200 S0 turns off the light & sets the brightness level - * M355 S1 turns on the light with a brightness of 200 (assuming a PWM pin) - */ - void GcodeSuite::M355() { - uint8_t args = 0; - if (parser.seenval('P')) { - ++args, case_light_brightness = parser.value_byte(); - case_light_arg_flag = false; - } - if (parser.seenval('S')) { - ++args, case_light_on = parser.value_bool(); - case_light_arg_flag = true; - } - if (args) update_case_light(); +#include "../../../feature/caselight.h" +#include "../../gcode.h" - // always report case light status - SERIAL_ECHO_START(); - if (!case_light_on) { - SERIAL_ECHOLNPGM("Case light: off"); - } - else { - if (!PWM_PIN(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM("Case light: on"); - else SERIAL_ECHOLNPAIR("Case light: ", case_light_brightness); - } +/** + * M355: Turn case light on/off and set brightness + * + * P Set case light brightness (PWM pin required - ignored otherwise) + * + * S Set case light on/off + * + * When S turns on the light on a PWM pin then the current brightness level is used/restored + * + * M355 P200 S0 turns off the light & sets the brightness level + * M355 S1 turns on the light with a brightness of 200 (assuming a PWM pin) + */ +void GcodeSuite::M355() { + bool didset = false; + if (parser.seenval('P')) { + didset = true; + caselight.brightness = parser.value_byte(); } -#endif // HAS_CASE_LIGHT + const bool sflag = parser.seenval('S'); + if (sflag) { + didset = true; + caselight.on = parser.value_bool(); + } + if (didset) caselight.update(sflag); + + // Always report case light status + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Case light: "); + if (!caselight.on) + SERIAL_ECHOLNPGM(STR_OFF); + else { + if (!PWM_PIN(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM(STR_ON); + else SERIAL_ECHOLN(int(caselight.brightness)); + } +} + +#endif // CASE_LIGHT_ENABLE diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 7c1083f7f7..f1692ee807 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -842,7 +842,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 351: M351(); break; // M351: Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low. #endif - #if HAS_CASE_LIGHT + #if ENABLED(CASE_LIGHT_ENABLE) case 355: M355(); break; // M355: Set case light brightness #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7c469458cd..7e89e809d0 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -702,7 +702,7 @@ private: static void M351(); #endif - TERN_(HAS_CASE_LIGHT, static void M355()); + TERN_(CASE_LIGHT_ENABLE, static void M355()); TERN_(REPETIER_GCODE_M360, static void M360()); @@ -845,7 +845,7 @@ private: TERN_(MAGNETIC_PARKING_EXTRUDER, static void M951()); TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); - + TERN_(PLATFORM_M997_SUPPORT, static void M997()); static void M999(); diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index c3ff9c8c1a..cd64c563f9 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -93,8 +93,8 @@ void GcodeSuite::M115() { cap_line(PSTR("SOFTWARE_POWER"), ENABLED(PSU_CONTROL)); // TOGGLE_LIGHTS (M355) - cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(HAS_CASE_LIGHT)); - cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(HAS_CASE_LIGHT, PWM_PIN(CASE_LIGHT_PIN))); + cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(CASE_LIGHT_ENABLE)); + cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, PWM_PIN(CASE_LIGHT_PIN))); // EMERGENCY_PARSER (M108, M112, M410, M876) cap_line(PSTR("EMERGENCY_PARSER"), ENABLED(EMERGENCY_PARSER)); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index c77db0bf2a..b9169d90e1 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -40,7 +40,7 @@ GCodeQueue queue; #endif #if ENABLED(BINARY_FILE_TRANSFER) - #include "../feature/binary_protocol.h" + #include "../feature/binary_stream.h" #endif #if ENABLED(POWER_LOSS_RECOVERY) @@ -628,11 +628,10 @@ void GCodeQueue::advance() { #if ENABLED(SERIAL_STATS_DROPPED_RX) SERIAL_ECHOLNPAIR("Dropped bytes: ", MYSERIAL0.dropped()); #endif - #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) SERIAL_ECHOLNPAIR("Max RX Queue Size: ", MYSERIAL0.rxMaxEnqueued()); #endif - #endif // !defined(__AVR__) || !defined(USBCON) + #endif ok_to_send(); } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 4ffd6fddcc..cabca762ab 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -430,14 +430,6 @@ #endif #endif -#if ENABLED(SR_LCD_3W_NL) - // Feature checks for SR_LCD_3W_NL -#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) - #define USES_LIQUIDTWI2 -#elif ANY(HAS_CHARACTER_LCD, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) - #define USES_LIQUIDCRYSTAL -#endif - #if ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS) #define HAS_LCD_MENU 1 #endif @@ -774,10 +766,3 @@ #ifndef EXTRUDE_MINTEMP #define EXTRUDE_MINTEMP 170 #endif - -/** - * To check if we need the folder src/features/leds - */ -#if ANY(TEMP_STAT_LEDS, HAS_COLOR_LEDS, HAS_CASE_LIGHT, PRINTER_EVENT_LEDS, LED_BACKLIGHT_TIMEOUT, PCA9632_BUZZER, LED_CONTROL_MENU, NEOPIXEL_LED) - #define HAS_LED_FEATURE 1 -#endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index a93e0527bf..556d57b669 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1944,9 +1944,6 @@ #if PIN_EXISTS(PHOTOGRAPH) #define HAS_PHOTOGRAPH 1 #endif -#if PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE) - #define HAS_CASE_LIGHT 1 -#endif // Digital control #if PIN_EXISTS(STEPPER_RESET) @@ -2223,7 +2220,7 @@ /** * MIN/MAX case light PWM scaling */ -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) #ifndef CASE_LIGHT_MAX_PWM #define CASE_LIGHT_MAX_PWM 255 #elif !WITHIN(CASE_LIGHT_MAX_PWM, 1, 255) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 12bfe5e68d..35040734b4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -38,7 +38,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { } #ifdef TOUCH_UI_PORTRAIT - #if EITHER(HAS_CASE_LIGHT, SENSORLESS_HOMING) + #if EITHER(CASE_LIGHT_ENABLE, SENSORLESS_HOMING) #define GRID_ROWS 9 #else #define GRID_ROWS 8 @@ -59,7 +59,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { #define BACKLASH_POS BTN_POS(2,7), BTN_SIZE(1,1) #define CASE_LIGHT_POS BTN_POS(1,8), BTN_SIZE(1,1) #define TMC_HOMING_THRS_POS BTN_POS(2,8), BTN_SIZE(1,1) - #if EITHER(HAS_CASE_LIGHT, SENSORLESS_HOMING) + #if EITHER(CASE_LIGHT_ENABLE, SENSORLESS_HOMING) #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) #else #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) @@ -91,7 +91,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { .font(Theme::font_medium) .enabled(ENABLED(HAS_BED_PROBE)) .tag(2) .button( ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) - .enabled(ENABLED(HAS_CASE_LIGHT)) + .enabled(ENABLED(CASE_LIGHT_ENABLE)) .tag(16).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) .tag(3) .button( STEPS_PER_MM_POS, GET_TEXT_F(MSG_STEPS_PER_MM)) .enabled(ENABLED(HAS_TRINAMIC_CONFIG)) @@ -149,7 +149,7 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { case 14: GOTO_SCREEN(StepperBumpSensitivityScreen); break; #endif case 15: GOTO_SCREEN(DisplayTuningScreen); break; - #if HAS_CASE_LIGHT + #if ENABLED(CASE_LIGHT_ENABLE) case 16: GOTO_SCREEN(CaseLightScreen); break; #endif default: return false; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 12cb8d0891..dfb23daa52 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -137,7 +137,7 @@ bool MainMenu::onTouchEnd(uint8_t tag) { case 4: GOTO_SCREEN(MoveAxisScreen); break; case 5: injectCommands_P(PSTR("M84")); break; case 6: GOTO_SCREEN(TemperatureScreen); break; - #if BOTH(TOUCH_UI_COCOA_PRESS, HAS_CASE_LIGHT) + #if BOTH(TOUCH_UI_COCOA_PRESS, CASE_LIGHT_ENABLE) case 7: GOTO_SCREEN(CaseLightScreen); break; #else case 7: GOTO_SCREEN(ChangeFilamentScreen); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 82d1831e62..01438aeb94 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -83,7 +83,7 @@ SCREEN_TABLE { #else DECL_SCREEN(JerkScreen), #endif -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) DECL_SCREEN(CaseLightScreen), #endif #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 276727fc46..92e6b230f7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -63,7 +63,7 @@ enum { #else JERK_SCREEN_CACHE, #endif -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) CASE_LIGHT_SCREEN_CACHE, #endif #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) @@ -579,7 +579,7 @@ class DefaultAccelerationScreen : public BaseNumericAdjustmentScreen, public Cac }; #endif -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) class CaseLightScreen : public BaseNumericAdjustmentScreen, public CachedScreen { public: static void onRedraw(draw_mode_t); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 451aa1f12a..c192754495 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -599,18 +599,18 @@ namespace ExtUI { #endif #endif - #if HAS_CASE_LIGHT - bool getCaseLightState() { return case_light_on; } + #if ENABLED(CASE_LIGHT_ENABLE) + bool getCaseLightState() { return caselight.on; } void setCaseLightState(const bool value) { - case_light_on = value; - update_case_light(); + caselight.on = value; + caselight.update_enabled(); } #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - float getCaseLightBrightness_percent() { return ui8_to_percent(case_light_brightness); } + float getCaseLightBrightness_percent() { return ui8_to_percent(caselight.brightness); } void setCaseLightBrightness_percent(const float value) { - case_light_brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); - update_case_light(); + caselight.brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); + caselight.update_brightness(); } #endif #endif diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 2719b3d850..ac56ca0e52 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -76,8 +76,8 @@ void menu_case_light() { START_MENU(); BACK_ITEM(MSG_CONFIGURATION); - EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true); - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); + EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &caselight.brightness, 0, 255, caselight.update_brightness, true); + EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); END_MENU(); } #endif @@ -97,7 +97,7 @@ void menu_led() { #endif SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom); #endif - // + // // Set Case light on/off/brightness // #if ENABLED(CASE_LIGHT_MENU) @@ -106,7 +106,7 @@ void menu_led() { SUBMENU(MSG_CASE_LIGHT, menu_case_light); else #endif - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); + EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); #endif END_MENU(); } diff --git a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp index 4684af975e..3f0f828cd7 100644 --- a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp +++ b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp @@ -1,9 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(BINARY_FILE_TRANSFER) + /** * libs/heatshrink/heatshrink_decoder.cpp */ +#include "heatshrink_decoder.h" + #include #include -#include "heatshrink_decoder.h" #pragma GCC optimize ("O3") @@ -353,3 +380,5 @@ static void push_byte(heatshrink_decoder *hsd, output_info *oi, uint8_t byte) { oi->buf[(*oi->output_size)++] = byte; (void)hsd; } + +#endif // BINARY_FILE_TRANSFER diff --git a/Marlin/src/libs/heatshrink/heatshrink_decoder.h b/Marlin/src/libs/heatshrink/heatshrink_decoder.h index 11fafe617f..eb113aa5e5 100644 --- a/Marlin/src/libs/heatshrink/heatshrink_decoder.h +++ b/Marlin/src/libs/heatshrink/heatshrink_decoder.h @@ -1,13 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /** * libs/heatshrink/heatshrink_decoder.h */ #pragma once -#include -#include #include "heatshrink_common.h" #include "heatshrink_config.h" +#include +#include + typedef enum { HSDR_SINK_OK, /* data sunk, ready to poll */ HSDR_SINK_FULL, /* out of space in internal buffer */ diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index b9f44eb6f8..28e15cfeb0 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -404,7 +404,7 @@ typedef struct SettingsDataStruct { // HAS_CASE_LIGHT_BRIGHTNESS // #if HAS_CASE_LIGHT_BRIGHTNESS - uint8_t case_light_brightness; + uint8_t caselight_brightness; // M355 P #endif // @@ -465,7 +465,7 @@ void MarlinSettings::postprocess() { TERN_(HAS_LINEAR_E_JERK, planner.recalculate_max_e_jerk()); - TERN_(HAS_CASE_LIGHT_BRIGHTNESS, update_case_light()); + TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.update_brightness()); // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm // and init stepper.count[], planner.position[] with current_position @@ -1342,7 +1342,7 @@ void MarlinSettings::postprocess() { // Case Light Brightness // #if HAS_CASE_LIGHT_BRIGHTNESS - EEPROM_WRITE(case_light_brightness); + EEPROM_WRITE(caselight.brightness); #endif // @@ -2181,8 +2181,8 @@ void MarlinSettings::postprocess() { // Case Light Brightness // #if HAS_CASE_LIGHT_BRIGHTNESS - _FIELD_TEST(case_light_brightness); - EEPROM_READ(case_light_brightness); + _FIELD_TEST(caselight_brightness); + EEPROM_READ(caselight.brightness); #endif // @@ -2493,7 +2493,7 @@ void MarlinSettings::reset() { // // Case Light Brightness // - TERN_(HAS_CASE_LIGHT_BRIGHTNESS, case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); + TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); // // TOUCH_SCREEN_CALIBRATION diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index a1f8b095ad..d18cb8c281 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -65,3 +65,91 @@ #ifdef HAL_PATH #include HAL_PATH(../../../../Marlin/src/HAL, inc/Conditionals_post.h) #endif + +// +// Conditionals only used for [features] +// +#if ENABLED(SR_LCD_3W_NL) + // Feature checks for SR_LCD_3W_NL +#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) + #define USES_LIQUIDTWI2 +#elif ANY(HAS_CHARACTER_LCD, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) + #define USES_LIQUIDCRYSTAL +#endif + +#if BOTH(ANYCUBIC_LCD_I3MEGA, EXTENSIBLE_UI) + #define HAS_ANYCUBIC_TFT_EXTUI +#endif + +#if SAVED_POSITIONS + #define HAS_SAVED_POSITIONS +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) && DISABLED(EMERGENCY_PARSER) + #define HAS_GCODE_M876 +#endif + +#if PREHEAT_COUNT + #define HAS_PREHEAT_COUNT +#endif + +#if EXTRUDERS + #define HAS_EXTRUDERS + #if EXTRUDERS > 1 + #define HAS_MULTI_EXTRUDER + #endif +#endif + +#if HAS_LCD_MENU + #if ENABLED(BACKLASH_GCODE) + #define HAS_MENU_BACKLASH + #endif + #if ENABLED(LEVEL_BED_CORNERS) + #define HAS_MENU_BED_CORNERS + #endif + #if ENABLED(CANCEL_OBJECTS) + #define HAS_MENU_CANCELOBJECT + #endif + #if ENABLED(CUSTOM_USER_MENUS) + #define HAS_MENU_CUSTOM + #endif + #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) + #define HAS_MENU_DELTA_CALIBRATE + #endif + #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) + #define HAS_MENU_LED + #endif + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #define HAS_MENU_FILAMENT + #endif + #if ENABLED(SDSUPPORT) + #define HAS_MENU_MEDIA + #endif + #if ENABLED(MIXING_EXTRUDER) + #define HAS_MENU_MIXER + #endif + #if ENABLED(POWER_LOSS_RECOVERY) + #define HAS_MENU_JOB_RECOVERY + #endif + #if HAS_POWER_MONITOR + #define HAS_MENU_POWER_MONITOR + #endif + #if HAS_CUTTER + #define HAS_MENU_CUTTER + #endif + #if HAS_TEMPERATURE + #define HAS_MENU_TEMPERATURE + #endif + #if ENABLED(MMU2_MENUS) + #define HAS_MENU_MMU2 + #endif + #if HAS_TRINAMIC_CONFIG + #define HAS_MENU_TMC + #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + #define HAS_MENU_TOUCH_SCREEN + #endif + #if ENABLED(AUTO_BED_LEVELING_UBL) + #define HAS_MENU_UBL + #endif +#endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 37efaa3743..ec708b116a 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -6,41 +6,56 @@ import subprocess import os import re try: - import configparser + import configparser except ImportError: - import ConfigParser as configparser + import ConfigParser as configparser from platformio.managers.package import PackageManager Import("env") -FEATURE_DEPENDENCIES = {} +FEATURE_CONFIG = {} + +def add_to_feat_cnf(feature, flines): + feat = FEATURE_CONFIG[feature] + atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') + for dep in atoms: + parts = dep.split('=') + name = parts.pop(0) + rest = '='.join(parts) + if name in ['extra_scripts', 'src_filter', 'lib_ignore']: + feat[name] = rest + else: + feat['lib_deps'] += [dep] def load_config(): config = configparser.ConfigParser() config.read("platformio.ini") items = config.items('features') for key in items: - ukey = key[0].upper() - if not ukey in FEATURE_DEPENDENCIES: - FEATURE_DEPENDENCIES[ukey] = { - 'lib_deps': [] - } - deps = re.sub(',\\s*', '\n', key[1]).strip().split('\n') - for dep in deps: - parts = dep.split('=') - name = parts.pop(0) - rest = '='.join(parts) - if name in ['extra_scripts', 'src_filter', 'lib_ignore']: - FEATURE_DEPENDENCIES[ukey][name] = rest - else: - FEATURE_DEPENDENCIES[ukey]['lib_deps'] += [dep] + feature = key[0].upper() + if not feature in FEATURE_CONFIG: + FEATURE_CONFIG[feature] = { 'lib_deps': [] } + add_to_feat_cnf(feature, key[1]) + + # Add options matching marlin.MY_OPTION to the pile + all_opts = env.GetProjectOptions() + for n in all_opts: + mat = re.match(r'marlin\.(.+)', n[0]) + if mat: + try: + val = env.GetProjectOption(n[0]) + except: + val = None + if val: + add_to_feat_cnf(mat.group(1).upper(), val) def get_all_known_libs(): known_libs = [] - for feature in FEATURE_DEPENDENCIES: - if not 'lib_deps' in FEATURE_DEPENDENCIES[feature]: + for feature in FEATURE_CONFIG: + feat = FEATURE_CONFIG[feature] + if not 'lib_deps' in feat: continue - for dep in FEATURE_DEPENDENCIES[feature]['lib_deps']: + for dep in feat['lib_deps']: name, _, _ = PackageManager.parse_pkg_uri(dep) known_libs.append(name) return known_libs @@ -64,21 +79,23 @@ def force_ignore_unused_libs(): known_libs = get_all_known_libs() diff = (list(set(known_libs) - set(env_libs))) lib_ignore = env.GetProjectOption('lib_ignore') + diff - print("Ignoring libs:", lib_ignore) + print("Ignore libraries:", lib_ignore) set_env_field('lib_ignore', lib_ignore) -def install_features_dependencies(): +def apply_features_config(): load_config() - for feature in FEATURE_DEPENDENCIES: + for feature in FEATURE_CONFIG: if not env.MarlinFeatureIsEnabled(feature): continue - if 'lib_deps' in FEATURE_DEPENDENCIES[feature]: + feat = FEATURE_CONFIG[feature] + + if 'lib_deps' in feat and len(feat['lib_deps']): print("Adding lib_deps for %s... " % feature) - # deps to add + # feat to add deps_to_add = {} - for dep in FEATURE_DEPENDENCIES[feature]['lib_deps']: + for dep in feat['lib_deps']: name, _, _ = PackageManager.parse_pkg_uri(dep) deps_to_add[name] = dep @@ -101,27 +118,27 @@ def install_features_dependencies(): # Only add the missing dependencies set_env_field('lib_deps', deps + list(deps_to_add.values())) - if 'extra_scripts' in FEATURE_DEPENDENCIES[feature]: - print("Executing extra_scripts for %s... " % feature) - env.SConscript(FEATURE_DEPENDENCIES[feature]['extra_scripts'], exports="env") + if 'extra_scripts' in feat: + print("Running extra_scripts for %s... " % feature) + env.SConscript(feat['extra_scripts'], exports="env") - if 'src_filter' in FEATURE_DEPENDENCIES[feature]: + if 'src_filter' in feat: print("Adding src_filter for %s... " % feature) src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder - my_srcs = re.findall( r'[+-](<.*?>)', FEATURE_DEPENDENCIES[feature]['src_filter']) + my_srcs = re.findall( r'[+-](<.*?>)', feat['src_filter']) cur_srcs = re.findall( r'[+-](<.*?>)', src_filter) for d in my_srcs: if d in cur_srcs: src_filter = re.sub(r'[+-]' + d, '', src_filter) - src_filter = FEATURE_DEPENDENCIES[feature]['src_filter'] + ' ' + src_filter + src_filter = feat['src_filter'] + ' ' + src_filter set_env_field('src_filter', [src_filter]) env.Replace(SRC_FILTER=src_filter) - if 'lib_ignore' in FEATURE_DEPENDENCIES[feature]: - print("Ignoring libs for %s... " % feature) - lib_ignore = env.GetProjectOption('lib_ignore') + [FEATURE_DEPENDENCIES[feature]['lib_ignore']] + if 'lib_ignore' in feat: + print("Adding lib_ignore for %s... " % feature) + lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] set_env_field('lib_ignore', lib_ignore) # @@ -170,7 +187,7 @@ def search_compiler(): # Use the compiler to get a list of all enabled features # def load_marlin_features(): - if "MARLIN_FEATURES" in env: + if 'MARLIN_FEATURES' in env: return # Process defines @@ -199,16 +216,27 @@ def load_marlin_features(): feature = define[8:].strip().decode().split(' ') feature, definition = feature[0], ' '.join(feature[1:]) marlin_features[feature] = definition - env["MARLIN_FEATURES"] = marlin_features + env['MARLIN_FEATURES'] = marlin_features # # Return True if a matching feature is enabled # def MarlinFeatureIsEnabled(env, feature): load_marlin_features() - r = re.compile(feature) - matches = list(filter(r.match, env["MARLIN_FEATURES"])) - return len(matches) > 0 + r = re.compile('^' + feature + '$') + found = list(filter(r.match, env['MARLIN_FEATURES'])) + + # Defines could still be 'false' or '0', so check + some_on = False + if len(found): + for f in found: + val = env['MARLIN_FEATURES'][f] + if val in [ '', '1', 'true' ]: + some_on = True + elif val in env['MARLIN_FEATURES']: + some_on = env.MarlinFeatureIsEnabled(val) + + return some_on # # Add a method for other PIO scripts to query enabled features @@ -218,5 +246,5 @@ env.AddMethod(MarlinFeatureIsEnabled) # # Add dependencies for enabled Marlin features # -install_features_dependencies() +apply_features_config() force_ignore_unused_libs() diff --git a/platformio.ini b/platformio.ini index 029ce65881..6c3214d544 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,15 +26,160 @@ include_dir = Marlin # [common] default_src_filter = + - - + - - - - - - - - - - - + - - - - + - + - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - + - + - + - - - - + - + - - - - - - - - + - - + - + - - + - - + - + - - - - - - + - - + - + - + - + - - + - - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - - + - - + - + - - + - + - + - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - - + - + - + - + - + - - + - extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -49,12 +194,17 @@ HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/MKS-LittlevGL/ar src_filter=+ extra_scripts=download_mks_assets.py HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 - src_filter=+ + src_filter=+ + + + + +HAS_STEALTHCHOP = src_filter=+ SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -DIGIPOT_MCP4... = SlowSoftI2CMaster +HAS_I2C_DIGIPOT = SlowSoftI2CMaster + src_filter=+ HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip + src_filter=+ HAS_L64XX = Arduino-L6470@0.8.0 + src_filter=+ + + NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 + src_filter=+ MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 HAS_GRAPHICAL_LCD = U8glib-HAL@0.4.1 src_filter=+ @@ -64,17 +214,143 @@ DWIN_CREALITY_LCD = src_filter=+ HAS_CHARACTER_LCD = src_filter=+ HAS_GRAPHICAL_TFT = src_filter=+ HAS_LCD_MENU = src_filter=+ -HAS_DGUS_LCD = src_filter=+ -TOUCH_UI_FTDI_EVE = src_filter=+ +HAS_GAMES = src_filter=+ +MARLIN_BRICKOUT = src_filter=+ +MARLIN_INVADERS = src_filter=+ +MARLIN_MAZE = src_filter=+ +MARLIN_SNAKE = src_filter=+ +HAS_MENU_BACKLASH = src_filter=+ +HAS_MENU_BED_CORNERS = src_filter=+ +LCD_BED_LEVELING = src_filter=+ +HAS_MENU_CANCELOBJECT = src_filter=+ +HAS_MENU_DELTA_CALIBRATE = src_filter=+ +HAS_MENU_FILAMENT = src_filter=+ +LCD_INFO_MENU = src_filter=+ +HAS_MENU_JOB_RECOVERY = src_filter=+ +HAS_MENU_LED = src_filter=+ +HAS_MENU_MEDIA = src_filter=+ +HAS_MENU_MIXER = src_filter=+ +HAS_MENU_MMU2 = src_filter=+ +HAS_MENU_POWER_MONITOR = src_filter=+ +HAS_MENU_CUTTER = src_filter=+ +HAS_MENU_TEMPERATURE = src_filter=+ +HAS_MENU_TMC = src_filter=+ +HAS_MENU_TOUCH_SCREEN = src_filter=+ +HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_I3MEGA = src_filter=+ +HAS_DGUS_LCD = src_filter=+ + +TOUCH_UI_FTDI_EVE = src_filter=+ +HAS_ANYCUBIC_TFT_EXTUI = src_filter=+ +EXTUI_EXAMPLE = src_filter=+ +MALYAN_LCD = src_filter=+ +HAS_SPI_LCD = src_filter=+ USB_FLASH_DRIVE_SUPPORT = src_filter=+ -AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ + +AUTO_BED_LEVELING_BILINEAR = src_filter=+ +AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ MESH_BED_LEVELING = src_filter=+ + AUTO_BED_LEVELING_UBL = src_filter=+ + +BACKLASH_COMPENSATION = src_filter=+ +BARICUDA = src_filter=+ + +BINARY_FILE_TRANSFER = src_filter=+ + +BLTOUCH = src_filter=+ +CANCEL_OBJECTS = src_filter=+ + +CASE_LIGHT_ENABLE = src_filter=+ + +EXTERNAL_CLOSED_LOOP_CONTROLLER = src_filter=+ + +USE_CONTROLLER_FAN = src_filter=+ DAC_STEPPER_CURRENT = src_filter=+ -HAS_I2C_DIGIPOT = src_filter=+ -HAS_LED_FEATURE = src_filter=+ -(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer +DIRECT_STEPPING = src_filter=+ + +EMERGENCY_PARSER = src_filter=+ - +I2C_POSITION_ENCODERS = src_filter=+ +HAS_FANMUX = src_filter=+ +FILAMENT_WIDTH_SENSOR = src_filter=+ + +FWRETRACT = src_filter=+ + +HOST_ACTION_COMMANDS = src_filter=+ +HOTEND_IDLE_TIMEOUT = src_filter=+ +JOYSTICK = src_filter=+ +BLINKM = src_filter=+ +HAS_COLOR_LEDS = src_filter=+ + +PCA9533 = src_filter=+ +PCA9632 = src_filter=+ +PRINTER_EVENT_LEDS = src_filter=+ +TEMP_STAT_LEDS = src_filter=+ +MAX7219_DEBUG = src_filter=+ + +MIXING_EXTRUDER = src_filter=+ + +PRUSA_MMU2 = src_filter=+ + +ADVANCED_PAUSE_FEATURE = src_filter=+ + + +AUTO_POWER_CONTROL = src_filter=+ +HAS_POWER_MONITOR = src_filter=+ + +POWER_LOSS_RECOVERY = src_filter=+ + +PROBE_TEMP_COMPENSATION = src_filter=+ + +HAS_FILAMENT_SENSOR = src_filter=+ + +MK2_MULTIPLEXER = src_filter=+ +EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+ +HAS_CUTTER = src_filter=+ + +EXPERIMENTAL_I2CBUS = src_filter=+ + +Z_STEPPER_AUTO_ALIGN = src_filter=+ + +G26_MESH_VALIDATION = src_filter=+ +ASSISTED_TRAMMING = src_filter=+ +HAS_MESH = src_filter=+ +HAS_LEVELING = src_filter=+ +DELTA_AUTO_CALIBRATION = src_filter=+ +CALIBRATION_GCODE = src_filter=+ +Z_MIN_PROBE_REPEATABILITY_TEST = src_filter=+ +M100_FREE_MEMORY_WATCHER = src_filter=+ +BACKLASH_GCODE = src_filter=+ +IS_KINEMATIC = src_filter=+ +HAS_EXTRA_ENDSTOPS = src_filter=+ +SKEW_CORRECTION_GCODE = src_filter=+ +PINS_DEBUGGING = src_filter=- +NO_VOLUMETRICS = src_filter=- +HAS_MULTI_EXTRUDER = src_filter=+ +HAS_HOTEND_OFFSET = src_filter=+ +EDITABLE_SERVO_ANGLES = src_filter=+ +PREVENT_COLD_EXTRUSION = src_filter=+ +HAS_USER_THERMISTORS = src_filter=+ +SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ +COOLANT_CONTROL = src_filter=+ +HAS_SOFTWARE_ENDSTOPS = src_filter=+ +HAS_DUPLICATION_MODE = src_filter=+ +LIN_ADVANCE = src_filter=+ +PHOTO_GCODE = src_filter=+ +CONTROLLER_FAN_EDITABLE = src_filter=+ +GCODE_MACROS = src_filter=+ +GRADIENT_MIX = src_filter=+ +HAS_SAVED_POSITIONS = src_filter=+ + +PARK_HEAD_ON_PAUSE = src_filter=+ +FILAMENT_LOAD_UNLOAD_GCODES = src_filter=+ +CNC_WORKSPACE_PLANES = src_filter=+ +CNC_COORDINATE_SYSTEMS = src_filter=+ +HAS_M206_COMMAND = src_filter=+ +EXPECTED_PRINTER_CHECK = src_filter=+ +HOST_KEEPALIVE_FEATURE = src_filter=+ +REPETIER_GCODE_M360 = src_filter=+ +HAS_GCODE_M876 = src_filter=+ +HAS_RESUME_CONTINUE = src_filter=+ +HAS_PREHEAT_COUNT = src_filter=+ +HAS_LCD_CONTRAST = src_filter=+ +LCD_SET_PROGRESS_MANUALLY = src_filter=+ +TOUCH_SCREEN_CALIBRATION = src_filter=+ +ARC_SUPPORT = src_filter=+ +GCODE_MOTION_MODES = src_filter=+ +BABYSTEPPING = src_filter=+ +Z_PROBE_SLED = src_filter=+ +G38_PROBE_TARGET = src_filter=+ +MAGNETIC_PARKING_EXTRUDER = src_filter=+ +SDSUPPORT = src_filter=+ +HAS_EXTRUDERS = src_filter=+ + +INCH_MODE_SUPPORT = src_filter=+ +TEMPERATURE_UNITS_SUPPORT = src_filter=+ +NEED_HEX_PRINT = src_filter=+ +NEED_LSF = src_filter=+ +NOZZLE_PARK_FEATURE = src_filter=+ + +NOZZLE_CLEAN_FEATURE = src_filter=+ + +DELTA = src_filter=+ + +BEZIER_CURVE_SUPPORT = src_filter=+ + +PRINTCOUNTER = src_filter=+ +HAS_BED_PROBE = src_filter=+ + + + +IS_SCARA = src_filter=+ +MORGAN_SCARA = src_filter=+ +(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer ESP3DLib=https://github.com/luc-github/ESP3DLib.git arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git ESP32SSDP=https://github.com/luc-github/ESP32SSDP.git @@ -268,14 +544,13 @@ src_filter = ${common.default_src_filter} + [env:DUE_USB] platform = atmelsam +extends = env:DUE board = dueUSB -src_filter = ${common.default_src_filter} + [env:DUE_debug] # Used when WATCHDOG_RESET_MANUAL is enabled platform = atmelsam -board = due -src_filter = ${common.default_src_filter} + +extends = env:DUE build_flags = ${common.build_flags} -funwind-tables -mpoke-function-name @@ -285,8 +560,7 @@ build_flags = ${common.build_flags} # [common_DUE_archim] platform = atmelsam -board = due -src_filter = ${common.default_src_filter} + +extends = env:DUE build_flags = ${common.build_flags} -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON extra_scripts = ${common.extra_scripts} @@ -320,7 +594,7 @@ src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} SoftwareSerialM Adafruit SPIFlash - SdFat - Adafruit Fork +marlin.SDSUPPORT = SdFat - Adafruit Fork debug_tool = jlink ################################# @@ -342,8 +616,8 @@ extra_scripts = ${common.extra_scripts} src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} Servo - LiquidCrystal@1.0.0 - Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip +marlin.USES_LIQUIDCRYSTAL = LiquidCrystal@1.0.0 +marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace #-funwind-tables @@ -426,9 +700,9 @@ extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py lib_deps = ${common.lib_deps} - Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use SoftwareSerialM USBComposite for STM32F1@0.91 +marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use debug_tool = stlink upload_protocol = dfu From 9493682e49298c20f47954d05b022f88aa355d09 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 10:15:19 -0300 Subject: [PATCH 0050/1370] MKS Robin Nano CI Tests (#18927) --- .github/workflows/test-builds.yml | 2 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 3 +- buildroot/tests/mks_robin_nano-tests | 15 ------- buildroot/tests/mks_robin_nano35-tests | 39 +++++++++++++++++++ 4 files changed, 41 insertions(+), 18 deletions(-) delete mode 100644 buildroot/tests/mks_robin_nano-tests create mode 100644 buildroot/tests/mks_robin_nano35-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index bcc42fbd60..fdb81fbdc9 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -78,6 +78,7 @@ jobs: - mks_robin_pro - STM32F103RET6_creality - LERDGEX + - mks_robin_nano35 # Put lengthy tests last @@ -94,7 +95,6 @@ jobs: #- at90usb1286_dfu #- STM32F103CB_malyan #- mks_robin_mini - #- mks_robin_nano steps: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 3f87c5183f..072213e499 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -510,9 +510,8 @@ uint8_t public_buf[512]; uint8_t pic_counter = 0; W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter); + SERIAL_ECHOLNPAIR("Total Uncompressed: ", totalSizes, ", Compressed: ", totalCompressed); #endif - - SERIAL_ECHOLNPAIR("Total Uncompressed: ", totalSizes, ", Compressed: ", totalCompressed); } #if HAS_SPI_FLASH_FONT diff --git a/buildroot/tests/mks_robin_nano-tests b/buildroot/tests/mks_robin_nano-tests deleted file mode 100644 index d3df7e2e5a..0000000000 --- a/buildroot/tests/mks_robin_nano-tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for MKS Robin nano -# (STM32F1 genericSTM32F103VE) -# - -# exit on first failure -set -e - -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -exec_test $1 $2 "MKS Robin nano" - -# cleanup -restore_configs diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests new file mode 100644 index 0000000000..ac72050875 --- /dev/null +++ b/buildroot/tests/mks_robin_nano35-tests @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# +# Build tests for MKS Robin nano +# (STM32F1 genericSTM32F103VE) +# + +# exit on first failure +set -e + +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO +opt_disable TFT_320x240 +opt_enable TOUCH_SCREEN +opt_enable FSMC_GRAPHICAL_TFT +exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" + +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_320x240 +opt_enable TOUCH_SCREEN +opt_enable SPI_GRAPHICAL_TFT +exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" + +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO +opt_disable TFT_320x240 +opt_disable TOUCH_SCREEN +opt_enable TFT_LVGL_UI_FSMC +exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" + +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_320x240 +opt_disable TOUCH_SCREEN +opt_enable TFT_LVGL_UI_SPI +exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" + +# cleanup +restore_configs From 48ddaf35fb3ace9e088a8830843cc6636a6fa821 Mon Sep 17 00:00:00 2001 From: Radek <46979052+radek8@users.noreply.github.com> Date: Fri, 7 Aug 2020 00:21:55 +0200 Subject: [PATCH 0051/1370] Increase Manual E Move Feedrate to 2mm/s (#18937) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index de50995ffe..a3013611cb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1025,7 +1025,7 @@ // @section lcd #if EITHER(ULTIPANEL, EXTENSIBLE_UI) - #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // Feedrates for manual moves along X, Y, Z, E from panel #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) #if ENABLED(ULTIPANEL) #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" From 8f0cd470aebeceaac815155e71333f2e473c97b8 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 19:33:42 -0300 Subject: [PATCH 0052/1370] Apply PIO-supported custom_option for deps (#18935) --- buildroot/share/PlatformIO/scripts/common-dependencies.py | 4 ++-- platformio.ini | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index ec708b116a..e09c639ad7 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -37,10 +37,10 @@ def load_config(): FEATURE_CONFIG[feature] = { 'lib_deps': [] } add_to_feat_cnf(feature, key[1]) - # Add options matching marlin.MY_OPTION to the pile + # Add options matching custom_marlin.MY_OPTION to the pile all_opts = env.GetProjectOptions() for n in all_opts: - mat = re.match(r'marlin\.(.+)', n[0]) + mat = re.match(r'custom_marlin\.(.+)', n[0]) if mat: try: val = env.GetProjectOption(n[0]) diff --git a/platformio.ini b/platformio.ini index 6c3214d544..ee4d4e12f8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -594,7 +594,7 @@ src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} SoftwareSerialM Adafruit SPIFlash -marlin.SDSUPPORT = SdFat - Adafruit Fork +custom_marlin.SDSUPPORT = SdFat - Adafruit Fork debug_tool = jlink ################################# @@ -616,8 +616,8 @@ extra_scripts = ${common.extra_scripts} src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} Servo -marlin.USES_LIQUIDCRYSTAL = LiquidCrystal@1.0.0 -marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip +custom_marlin.USES_LIQUIDCRYSTAL = LiquidCrystal@1.0.0 +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace #-funwind-tables @@ -702,7 +702,7 @@ extra_scripts = ${common.extra_scripts} lib_deps = ${common.lib_deps} SoftwareSerialM USBComposite for STM32F1@0.91 -marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use debug_tool = stlink upload_protocol = dfu From 0e70d8bacbe8110633657615913e4e42e4ddf633 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 22:52:01 -0300 Subject: [PATCH 0053/1370] Followup fixes to LVGL for Chitu (#18940) --- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 29 ++++++++++--------- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 29 ++++++++++--------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index d97b54a658..c71bdbd737 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -#include "../../inc/MarlinConfigPre.h" +#include "../../../../inc/MarlinConfig.h" #include diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index b6863d252b..6a39365887 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -147,21 +147,24 @@ #endif #endif -#define SPI_FLASH_SIZE 0x200000 // 2MB +// SPI Flash +#define SPI_FLASH_SIZE 0x200000 // 2MB +#define HAS_SPI_FLASH 1 + +// SPI 2 +#define W25QXX_CS_PIN PB12 +#define W25QXX_MOSI_PIN PB15 +#define W25QXX_MISO_PIN PB14 +#define W25QXX_SCK_PIN PB13 #if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 1 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 1 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 - - // SPI 2 - #define W25QXX_CS_PIN PB12 - #define W25QXX_MOSI_PIN PB15 - #define W25QXX_MISO_PIN PB14 - #define W25QXX_SCK_PIN PB13 + #define HAS_SPI_FLASH_FONT 1 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 1 + #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 + #define HAS_TOUCH_XPT2046 1 #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 7a3777da46..be64512b50 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -158,21 +158,24 @@ #endif #endif -#define SPI_FLASH_SIZE 0x200000 // 2MB +// SPI Flash +#define SPI_FLASH_SIZE 0x200000 // 2MB +#define HAS_SPI_FLASH 1 + +// SPI 2 +#define W25QXX_CS_PIN PB12 +#define W25QXX_MOSI_PIN PB15 +#define W25QXX_MISO_PIN PB14 +#define W25QXX_SCK_PIN PB13 #if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 0 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 0 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 - - // SPI 2 - #define W25QXX_CS_PIN PB12 - #define W25QXX_MOSI_PIN PB15 - #define W25QXX_MISO_PIN PB14 - #define W25QXX_SCK_PIN PB13 + #define HAS_SPI_FLASH_FONT 0 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 0 + #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 + #define HAS_TOUCH_XPT2046 1 #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK From 57c3b0e0b714b7d26a58842a0970a482814d3fa4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 7 Aug 2020 03:53:43 -0300 Subject: [PATCH 0054/1370] Fix LVGL "C" brace (#18942) --- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index c71bdbd737..354e11a540 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -21,10 +21,6 @@ */ #pragma once -#ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ -#endif - #include "../../../../inc/MarlinConfig.h" #include @@ -125,6 +121,10 @@ extern "C" { /* C-declarations for C++ */ // SD card information first addr #define VAR_INF_ADDR 0x000000 +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + union union32 { uint8_t bytes[4]; uint32_t dwords; From cd977c70ca7c4a292b1adb75ad7a6222b7c7a190 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 7 Aug 2020 03:55:15 -0300 Subject: [PATCH 0055/1370] Fix / optimize FSMC init (#18941) --- .../STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp | 18 +++++++----------- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 18 +++++++----------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp index 0f3887d29a..445e53b67f 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp @@ -171,16 +171,17 @@ LCD_CONTROLLER_TypeDef *LCD; void LCD_IO_Init(uint8_t cs, uint8_t rs) { uint32_t controllerAddress; + struct fsmc_nor_psram_reg_map* fsmcPsramRegion; if (fsmcInit) return; fsmcInit = 1; switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break; + case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; break; + case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; + case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; + case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; #endif default: return; } @@ -246,13 +247,8 @@ void LCD_IO_Init(uint8_t cs, uint8_t rs) { gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - #if ENABLED(STM32_XL_DENSITY) - FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #else // PSRAM1 for STM32F103V (high density) - FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #endif + fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; afio_remap(AFIO_REMAP_FSMC_NADV); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index a039cbe0cb..a257d03489 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -104,16 +104,17 @@ void LCD_IO_Init(uint8_t cs, uint8_t rs) { uint32_t controllerAddress; + struct fsmc_nor_psram_reg_map* fsmcPsramRegion; if (fsmcInit) return; fsmcInit = 1; switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break; + case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; break; + case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; + case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; + case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; #endif default: return; } @@ -179,13 +180,8 @@ gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - #if ENABLED(STM32_XL_DENSITY) - FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #else // PSRAM1 for STM32F103V (high density) - FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #endif + fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; afio_remap(AFIO_REMAP_FSMC_NADV); From cb18b858d4b073ce0fe84fc31ffbe20fb529fc17 Mon Sep 17 00:00:00 2001 From: wmariz <11435639+wmariz@users.noreply.github.com> Date: Fri, 7 Aug 2020 19:03:59 -0300 Subject: [PATCH 0056/1370] ZoneStar Z6FB (#18918) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 11 +- Marlin/src/core/boards.h | 1 + Marlin/src/inc/Conditionals_LCD.h | 13 ++ Marlin/src/inc/Conditionals_post.h | 4 + Marlin/src/inc/SanityCheck.h | 5 +- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 2 +- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 118 +++++----- Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp | 6 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 234 +++++++++++++++++++ Marlin/src/sd/Sd2Card.cpp | 11 +- platformio.ini | 1 - 12 files changed, 340 insertions(+), 68 deletions(-) create mode 100644 Marlin/src/pins/sanguino/pins_ZMIB_V2.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 75ee1eb990..3ad7dfdab3 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2089,7 +2089,7 @@ //#define OLED_PANEL_TINYBOY2 // -// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// MKS OLED 1.3" 128×64 FULL GRAPHICS CONTROLLER // https://reprap.org/wiki/MKS_12864OLED // // Tiny, but very sharp OLED display @@ -2097,6 +2097,13 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// Zonestar OLED 128×64 FULL GRAPHICS CONTROLLER +// +//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller +//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default) +//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller + // // Einstart S OLED SSD1306 // @@ -2108,7 +2115,7 @@ //#define OVERLORD_OLED // -// FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER with WS2812 RGB +// FYSETC OLED 2.42" 128×64 FULL GRAPHICS CONTROLLER with WS2812 RGB // Where to find : https://www.aliexpress.com/item/4000345255731.html //#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index eb33258e26..32b9168a62 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -171,6 +171,7 @@ #define BOARD_STB_11 1508 // STB V1.1 #define BOARD_AZTEEG_X1 1509 // Azteeg X1 #define BOARD_ANET_10 1510 // Anet 1.0 (Melzi clone) +#define BOARD_ZMIB_V2 1511 // ZoneStar ZMIB V2 // // Other ATmega644P, ATmega644, ATmega1284P diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index cabca762ab..d8c8103a42 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -62,6 +62,19 @@ #define ENCODER_STEPS_PER_MENU_ITEM 1 #define ENCODER_FEEDRATE_DEADZONE 2 +#elif ENABLED(ZONESTAR_12864LCD) + #define DOGLCD + #define IS_RRD_SC + #define U8GLIB_ST7920 + +#elif ENABLED(ZONESTAR_12864OLED) + #define IS_RRD_SC + #define U8GLIB_SH1106 + +#elif ENABLED(ZONESTAR_12864OLED_SSD1306) + #define IS_RRD_SC + #define IS_U8GLIB_SSD1306 + #elif ENABLED(RADDS_DISPLAY) #define IS_ULTIPANEL #define ENCODER_PULSES_PER_STEP 2 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 556d57b669..6243d82aa8 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -312,6 +312,10 @@ #define _LCD_CONTRAST_INIT 17 #elif ENABLED(MINIPANEL) #define _LCD_CONTRAST_INIT 150 +#elif ENABLED(ZONESTAR_12864OLED) + #define _LCD_CONTRAST_MIN 64 + #define _LCD_CONTRAST_INIT 128 + #define _LCD_CONTRAST_MAX 255 #endif #ifdef _LCD_CONTRAST_INIT diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d296eb2f15..7fbfda4fe1 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2227,6 +2227,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(OLED_PANEL_TINYBOY2) \ + ENABLED(MKS_12864OLED) \ + ENABLED(MKS_12864OLED_SSD1306) \ + + ENABLED(ZONESTAR_12864LCD) \ + + ENABLED(ZONESTAR_12864OLED) \ + + ENABLED(ZONESTAR_12864OLED_SSD1306) \ + ENABLED(U8GLIB_SH1106_EINSTART) \ + ENABLED(OVERLORD_OLED) \ + ENABLED(FYSETC_242_OLED_12864) \ @@ -2242,7 +2245,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(TFT_LVGL_UI_SPI) \ + ENABLED(ANYCUBIC_LCD_I3MEGA) \ + ENABLED(ANYCUBIC_LCD_CHIRON) - #error "Please select no more than one LCD controller option." + #error "Please select only one LCD controller option." #endif #undef IS_RRD_SC diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index 22f460afe7..c6c67bf97e 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -246,7 +246,7 @@ void MarlinUI::init_lcd() { OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away #endif - #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) SET_OUTPUT(LCD_PINS_DC); #ifndef LCD_RESET_PIN #define LCD_RESET_PIN LCD_PINS_RS diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 40402fe5ac..228cee6848 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -33,6 +33,9 @@ //#define ALTERNATIVE_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + // RepRapWorld Graphical LCD + #define U8G_CLASS U8GLIB_ST7920_128X64_4X #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) #define U8G_PARAM LCD_PINS_RS @@ -43,6 +46,7 @@ #elif ENABLED(U8GLIB_ST7920) // RepRap Discount Full Graphics Smart Controller + // and other variant LCDs using ST7920 #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) @@ -88,43 +92,28 @@ #define FORCE_SOFT_SPI // SW-SPI #endif -#elif ENABLED(MKS_12864OLED_SSD1306) +#elif ANY(FYSETC_MINI_12864, MKS_MINI_12864, ENDER2_STOCKDISPLAY) + + // The FYSETC Mini 12864 display // "4 stripes" + + // The MKS_MINI_12864 V1/V2 aren't exact copies of the MiniPanel. + // Panel management is in u8g_dev_uc1701_mini12864_HAL.cpp with + // extra delays added to remove glitches seen with fast MCUs. + + #define U8G_CLASS U8GLIB_MINI12864_2X_HAL // 8 stripes (HW-SPI) + +#elif ENABLED(MINIPANEL) + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_MINI12864 + #else + #define U8G_CLASS U8GLIB_MINI12864_2X // 8 stripes (HW-SPI) + #endif + +#elif EITHER(MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) // MKS 128x64 (SSD1306) OLED I2C LCD - - #define FORCE_SOFT_SPI // SW-SPI - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes - #else - #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes - #endif - -#elif ENABLED(U8GLIB_SSD1306) - - // Generic SSD1306 OLED I2C LCD - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE // 4 stripes - #else - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes - #endif - #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) - -#elif ENABLED(MKS_12864OLED) - - // MKS 128x64 (SH1106) OLED I2C LCD - - #define FORCE_SOFT_SPI // SW-SPI - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SH1106_128X64_2X // 4 stripes - #else - #define U8G_CLASS U8GLIB_SH1106_128X64 // 8 stripes - #endif - -#elif ENABLED(FYSETC_242_OLED_12864) - + // - or - // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER #define FORCE_SOFT_SPI // SW-SPI @@ -135,6 +124,37 @@ #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes #endif +#elif ENABLED(ZONESTAR_12864OLED_SSD1306) + + // Zonestar SSD1306 OLED SPI LCD + + #define FORCE_SOFT_SPI // SW-SPI + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_SH1306_128X64_2X // 4 stripes + #else + #define U8G_CLASS U8GLIB_SH1306_128X64 // 8 stripes + #endif + +#elif EITHER(MKS_12864OLED, ZONESTAR_12864OLED) + + // MKS 128x64 (SH1106) OLED I2C LCD + // - or - + // Zonestar SH1106 OLED SPI LCD + + #define FORCE_SOFT_SPI // SW-SPI + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_SH1106_128X64_2X // 4 stripes + #else + #define U8G_CLASS U8GLIB_SH1106_128X64 // 8 stripes + #endif + +#elif ENABLED(U8GLIB_SH1106_EINSTART) + + // Connected via motherboard header + + #define U8G_CLASS U8GLIB_SH1106_128X64 + #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS + #elif ENABLED(U8GLIB_SH1106) // Generic SH1106 OLED I2C LCD @@ -153,34 +173,16 @@ #define U8G_CLASS U8GLIB_SSD1309_128X64 #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) // I2C -#elif ENABLED(FYSETC_MINI_12864) +#elif ENABLED(U8GLIB_SSD1306) - // The FYSETC Mini 12864 display - - #define U8G_CLASS U8GLIB_MINI12864_2X_HAL // 4 stripes - -#elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - - // The MKS_MINI_12864 V1/V2 aren't exact copies of the MiniPanel. - // Panel management is in u8g_dev_uc1701_mini12864_HAL.cpp with - // extra delays added to remove glitches seen with fast MCUs. - - #define U8G_CLASS U8GLIB_MINI12864_2X_HAL // 8 stripes (HW-SPI) - -#elif ENABLED(MINIPANEL) + // Generic SSD1306 OLED I2C LCD #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_MINI12864 + #define U8G_CLASS U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE // 4 stripes #else - #define U8G_CLASS U8GLIB_MINI12864_2X // 8 stripes (HW-SPI) + #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes #endif - -#elif ENABLED(U8GLIB_SH1106_EINSTART) - - // Connected via motherboard header - - #define U8G_CLASS U8GLIB_SH1106_128X64 - #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS + #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) #elif TFT_SCALED_DOGLCD diff --git a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp index 9d00db3353..15cc96711c 100644 --- a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -145,7 +145,7 @@ namespace ExtUI { if (rx[0] != 'A') { SERIAL_ECHOPGM("Unexpected RX: "); SERIAL_ECHOLN(rx); - + return; } @@ -490,7 +490,7 @@ namespace ExtUI { void onMediaRemoved() { SENDLINE_PGM("J01"); // SD Removed } - + void onPlayTone(const uint16_t frequency, const uint16_t duration) { tone(BEEPER_PIN, frequency, duration); } diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 1f120e0c12..9b6be5a6e1 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -300,6 +300,8 @@ #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p #elif MB(AZTEEG_X1) #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(ZMIB_V2) + #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p // // Other ATmega644P, ATmega644, ATmega1284P diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h new file mode 100644 index 0000000000..262199e310 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -0,0 +1,234 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#define BOARD_INFO_NAME "Zonestar ZMIB_V2" +#define BOARD_WEBSITE_URL "https://www.aliexpress.com/item/32957490744.html" + +#define IS_ZMIB_V2 + +/** + * ZMIB pin assignments + * + * The ZMIB board needs a bootloader installed before Marlin can be uploaded. + * If you don't have a chip programmer you can use a spare Arduino plus a few + * electronic components to write the bootloader. + * + * See http://www.instructables.com/id/Burn-Arduino-Bootloader-with-Arduino-MEGA/ + */ + +/** + * PIN: 0 Port: B0 HEATER_0_PIN + * PIN: 1 Port: B1 HEATER_BED_PIN + * PIN: 2 Port: B2 EXP1_4(BTN_EN2) + * PIN: 3 Port: B3 V1: SD_DETECT_PIN + * PIN: 3 Port: B3 V2: EXP1_6 + * PIN: 4 Port: B4 SDSS + * PIN: 4 Port: B4 V1: EXP1_6 + * PIN: 5 Port: B5 AVR_MOSI_PIN + * . MOSI_PIN + * PIN: 6 Port: B6 AVR_MISO_PIN + * . EXP1_9(MISO_PIN) + * PIN: 7 Port: B7 AVR_SCK_PIN + * . EXP1_10(SCK_PIN) + * PIN: 8 Port: D0 RXD + * PIN: 9 Port: D1 TXD + * PIN: 10 Port: D2 EXP1_8 + * PIN: 11 Port: D3 EXP1_7 + * PIN: 12 Port: D4 EXP1_5(BTN_EN1) + * PIN: 13 Port: D5 Z_MIN_PIN + * PIN: 14 Port: D6 E1_DIR_PIN + * PIN: 15 Port: D7 E1_STEP_PIN + * PIN: 16 Port: C0 Z_DIR_PIN + * PIN: 17 Port: C1 Z_STEP_PIN + * PIN: 18 Port: C2 Y_MIN_PIN + * PIN: 19 Port: C3 Y_DIR_PIN + * PIN: 20 Port: C4 Y_STEP_PIN + * PIN: 21 Port: C5 X_MIN_PIN + * PIN: 22 Port: C6 X_DIR_PIN + * PIN: 23 Port: C7 X_STEP_PIN + * PIN: 24 Port: A7 X_ENABLE_PIN + * Y_ENABLE_PIN + * Z_ENABLE_PIN + * E0_ENABLE_PIN + * E1_ENABLE_PIN + * PIN: 25 Port: A6 FIL_RUNOUT_PIN + * PIN: 26 Port: A5 E0_DIR_PIN + * PIN: 27 Port: A4 E0_STEP_PIN + * PIN: 28 Port: A3 FAN_PIN + * PIN: 29 Port: A2 EXP1_3(BTN_ENC) + * ADC_KEY_PIN + * PIN: 30 Port: A1 TEMP_0_PIN + * PIN: 31 Port: A0 TEMP_BED_PIN + */ + +// +// Limit Switches +// +#define X_MIN_PIN 21 +#define Y_MIN_PIN 18 + +#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) + #define Z_MIN_PIN 25 +#else + #define Z_MIN_PIN 13 +#endif + +// +// Steppers +// +#define X_STEP_PIN 23 +#define X_DIR_PIN 22 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 20 +#define Y_DIR_PIN 19 +#define Y_ENABLE_PIN 24 + +#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) + #define Z_STEP_PIN 27 + #define Z_DIR_PIN 26 +#else + #define Z_STEP_PIN 17 + #define Z_DIR_PIN 16 +#endif + +#define Z_ENABLE_PIN 24 + +#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) + #define E0_STEP_PIN 15 + #define E0_DIR_PIN 14 +#else + #define E0_STEP_PIN 27 + #define E0_DIR_PIN 26 +#endif + +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN 15 +#define E1_DIR_PIN 14 +#define E1_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 0 +#define HEATER_BED_PIN 1 +#define FAN_PIN 28 +#define FAN1_PIN -1 + +// +//filament run out sensor +// +#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) + #define FIL_RUNOUT_PIN 13 +#else + #define FIL_RUNOUT_PIN 25 // Z-MIN +#endif + +// +// SD card +// +#if ENABLED(SDSUPPORT) + #define SDSS 4 +#endif +#define SD_DETECT_PIN -1 + +/*=================================================== + * ZMIB Version 1 - EXP1 Connector + * MOSI(D5) TX1(D11) ENA(D12) ENC(D29/A2) 5V + * SCK(D7) RX1(D10) SCS(D4) ENB(D2) GND + *=================================================== + * ZMIB Version 2 - EXP1 Connector + * MOSI(D5) TX1(D11) ENA(D12) ENC(D29/A2) 5V + * SCK(D7) RX1(D10) SCS(D3) ENB(D2) GND + *=================================================== + * LCD 128x64 + *==================================================*/ + +#if ENABLED(ZONESTAR_12864LCD) + // + // LCD 128x64 + // + #define LCDSCREEN_NAME "ZONESTAR_12864LCD" + #define FORCE_SOFT_SPI + //#define LCD_SDSS 11 + #define LCD_PINS_RS 11 // ST7920_CS_PIN LCD_PIN_RS (PIN4 of LCD module) + #ifdef IS_ZMIB_V2 + #define LCD_PINS_ENABLE 3 // ST7920_DAT_PIN LCD_PIN_R/W (PIN5 of LCD module) + #else + #define LCD_PINS_ENABLE 4 // ST7920_DAT_PIN LCD_PIN_R/W (PIN5 of LCD module) + #endif + #define LCD_PINS_D4 10 // ST7920_CLK_PIN LCD_PIN_ENABLE (PIN6 of LCD module) + + // Alter timing for graphical display + #define ST7920_DELAY_1 DELAY_2_NOP + #define ST7920_DELAY_2 DELAY_2_NOP + #define ST7920_DELAY_3 DELAY_2_NOP + +#elif EITHER(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) + // + // OLED 128x64 + // + #define LCDSCREEN_NAME "ZONESTAR 12864OLED" + #define FORCE_SOFT_SPI + #ifdef IS_ZMIB_V2 + #define LCD_PINS_RS 3 // RESET + #else + #define LCD_PINS_RS 4 // RESET + #endif + #define LCD_PINS_DC 10 // DC + #define DOGLCD_CS 11 // CS + #if ENABLED(OLED_HW_IIC) + #error "Oops! can't choose HW IIC for ZMIB board!!" + #elif ENABLED(OLED_HW_SPI) + // HW SPI + #define DOGLCD_A0 LCD_PINS_DC // A0 = DC + #else + // SW SPI + #define DOGLCD_A0 LCD_PINS_DC // A0 = DC + #define DOGLCD_MOSI AVR_MOSI_PIN // SDA + #define DOGLCD_SCK AVR_SCK_PIN // SCK + #endif + +#endif + +// +// All the above are also RRDSC with rotary encoder +// +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define BTN_EN1 2 + #define BTN_EN2 12 + #define BTN_ENC 29 + #define BEEPER_PIN -1 + #define KILL_PIN -1 +#endif diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index c56d690b2e..6ff2793e93 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -240,8 +240,15 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { watchdog_refresh(); // In case init takes too long // Set pin modes - extDigitalWrite(chipSelectPin_, HIGH); // For some CPUs pinMode can write the wrong data so init desired data value first - pinMode(chipSelectPin_, OUTPUT); // Solution for #8746 by @benlye + #if ENABLED(ZONESTAR_12864OLED) + if (chipSelectPin_ != DOGLCD_CS) { + SET_OUTPUT(DOGLCD_CS); + WRITE(DOGLCD_CS, HIGH); + } + #else + extDigitalWrite(chipSelectPin_, HIGH); // For some CPUs pinMode can write the wrong data so init desired data value first + pinMode(chipSelectPin_, OUTPUT); // Solution for #8746 by @benlye + #endif spiBegin(); // Set SCK rate for initialization commands diff --git a/platformio.ini b/platformio.ini index ee4d4e12f8..fdb120ae88 100644 --- a/platformio.ini +++ b/platformio.ini @@ -869,7 +869,6 @@ board = genericSTM32F103VE platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_nano35.py -lib_deps = ${common_stm32f1.lib_deps} build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 debug_tool = jlink From 8d6a263c1c56918005786db7649b1fd3c044565d Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 8 Aug 2020 10:59:09 +1200 Subject: [PATCH 0057/1370] HW PWM sanity checks for SPINDLE_LASER_FREQUENCY (#18947) --- Marlin/src/HAL/DUE/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/ESP32/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/LINUX/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/LPC1768/fast_pwm.cpp | 2 +- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 4 ++++ Marlin/src/HAL/SAMD51/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/STM32/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h | 4 ++-- 11 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h index cdea34436e..6880696506 100644 --- a/Marlin/src/HAL/DUE/inc/SanityCheck.h +++ b/Marlin/src/HAL/DUE/inc/SanityCheck.h @@ -52,8 +52,8 @@ #endif #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on DUE." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/ESP32/inc/SanityCheck.h b/Marlin/src/HAL/ESP32/inc/SanityCheck.h index 7653f6fe7f..f57a6c5910 100644 --- a/Marlin/src/HAL/ESP32/inc/SanityCheck.h +++ b/Marlin/src/HAL/ESP32/inc/SanityCheck.h @@ -25,8 +25,8 @@ #error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on ESP32." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/LINUX/inc/SanityCheck.h b/Marlin/src/HAL/LINUX/inc/SanityCheck.h index 8d23cdabbf..84167c97a1 100644 --- a/Marlin/src/HAL/LINUX/inc/SanityCheck.h +++ b/Marlin/src/HAL/LINUX/inc/SanityCheck.h @@ -30,8 +30,8 @@ #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on LINUX." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/LPC1768/fast_pwm.cpp b/Marlin/src/HAL/LPC1768/fast_pwm.cpp index 46507ac0da..dd440b5e77 100644 --- a/Marlin/src/HAL/LPC1768/fast_pwm.cpp +++ b/Marlin/src/HAL/LPC1768/fast_pwm.cpp @@ -35,5 +35,5 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255 LPC176x::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size); } -#endif // FAST_PWM_FAN || SPINDLE_LASER_PWM +#endif // NEEDS_HARDWARE_PWM #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 964538962c..0a4e59c6c4 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -59,6 +59,10 @@ */ static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are incompatible with FAST_PWM_FAN on LPC176x boards."); +#if SPINDLE_LASER_FREQUENCY + static_assert(!NUM_SERVOS, "BLTOUCH and Servos are incompatible with SPINDLE_LASER_FREQUENCY on LPC176x boards."); +#endif + /** * Test LPC176x-specific configuration values for errors at compile-time. */ diff --git a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h index ee04e2e2e0..5d610acac8 100644 --- a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h +++ b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h @@ -47,6 +47,6 @@ #error "SDIO_SUPPORT is not supported on SAMD51." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on SAMD51." #endif diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 37ca3d5a30..30d0750d90 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -28,8 +28,8 @@ // #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" //#endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32." #endif #if ENABLED(SDCARD_EEPROM_EMULATION) && DISABLED(SDSUPPORT) diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index ec7e8cf176..c0cb486952 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -29,8 +29,8 @@ #error "EMERGENCY_PARSER is not yet implemented for STM32F1. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F1." #endif #if !defined(HAVE_SW_SERIAL) && HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h index 53b15ba190..9bb36f3bbb 100644 --- a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h @@ -32,8 +32,8 @@ #error "EMERGENCY_PARSER is not yet implemented for STM32F4/7. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F4/F7." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h index 0b731a61d3..3932ee6a76 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h @@ -29,8 +29,8 @@ #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.1/3.2. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on Teensy 3.1/3.2." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h index 36b8018085..ee80e42696 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h @@ -29,8 +29,8 @@ #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.5/3.6. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on Teensy 3.5/3.6." #endif #if HAS_TMC_SW_SERIAL From 7a8e99de7d922155f5d29c05249c27de7a39521f Mon Sep 17 00:00:00 2001 From: cbaugher Date: Fri, 7 Aug 2020 18:06:25 -0500 Subject: [PATCH 0058/1370] Fix Z height after tool change (#18951) --- Marlin/src/module/tool_change.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 225f4cbb91..5d2dc7d3be 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1132,7 +1132,8 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if ENABLED(TOOLCHANGE_PARK) if (toolchange_settings.enable_park) do_blocking_move_to_xy_z(destination, destination.z, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); #else - do_blocking_move_to_xy(destination); + do_blocking_move_to_xy(destination, planner.settings.max_feedrate_mm_s[X_AXIS]); + do_blocking_move_to_z(destination, planner.settings.max_feedrate_mm_s[Z_AXIS]); #endif #endif From 8af8ef4404545141eae2554e71f21daa9570e18a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 7 Aug 2020 19:30:35 -0500 Subject: [PATCH 0059/1370] Use uintptr_t for pointer-to-int --- Marlin/src/gcode/calibrate/M100.cpp | 8 ++++---- Marlin/src/libs/hex_print.cpp | 12 ++++++------ Marlin/src/libs/hex_print.h | 6 ------ 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index f03b13e233..5ec709fb40 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -156,8 +156,8 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { // Start and end the dump on a nice 16 byte boundary // (even though the values are not 16-byte aligned). // - start_free_memory = (char*)(ptr_int_t(uint32_t(start_free_memory) & ~0xFUL)); // Align to 16-byte boundary - end_free_memory = (char*)(ptr_int_t(uint32_t(end_free_memory) | 0xFUL)); // Align end_free_memory to the 15th byte (at or above end_free_memory) + start_free_memory = (char*)(uintptr_t(uint32_t(start_free_memory) & ~0xFUL)); // Align to 16-byte boundary + end_free_memory = (char*)(uintptr_t(uint32_t(end_free_memory) | 0xFUL)); // Align end_free_memory to the 15th byte (at or above end_free_memory) // Dump command main loop while (start_free_memory < end_free_memory) { @@ -189,8 +189,8 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { // Round the start and end locations to produce full lines of output // dump_free_memory( - (char*)(ptr_int_t(uint32_t(start) & ~0xFUL)), // Align to 16-byte boundary - (char*)(ptr_int_t(uint32_t(end) | 0xFUL)) // Align end_free_memory to the 15th byte (at or above end_free_memory) + (char*)(uintptr_t(uint32_t(start) & ~0xFUL)), // Align to 16-byte boundary + (char*)(uintptr_t(uint32_t(end) | 0xFUL)) // Align end_free_memory to the 15th byte (at or above end_free_memory) ); } diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp index 6bcc00e420..360b50e5e3 100644 --- a/Marlin/src/libs/hex_print.cpp +++ b/Marlin/src/libs/hex_print.cpp @@ -20,12 +20,12 @@ * */ -#include "../inc/MarlinConfig.h" -#include "../gcode/parser.h" +#include "../inc/MarlinConfigPre.h" #if NEED_HEX_PRINT #include "hex_print.h" +#include "../core/serial.h" #ifdef CPU_32_BIT constexpr int byte_start = 4; @@ -54,7 +54,7 @@ char* hex_word(const uint16_t w) { } #ifdef CPU_32_BIT - char* hex_long(const uint32_t l) { + char* hex_long(const uintptr_t l) { _hex[2] = hex_nybble(l >> 28); _hex[3] = hex_nybble(l >> 24); _hex[4] = hex_nybble(l >> 20); @@ -66,9 +66,9 @@ char* hex_word(const uint16_t w) { char* hex_address(const void * const w) { #ifdef CPU_32_BIT - (void)hex_long((ptr_int_t)w); + (void)hex_long((uintptr_t)w); #else - (void)hex_word((ptr_int_t)w); + (void)hex_word((uintptr_t)w); #endif return _hex; } @@ -78,7 +78,7 @@ void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } -void print_hex_long(const uint32_t w, const char delimiter) { +void print_hex_long(const uintptr_t w, const char delimiter) { SERIAL_ECHOPGM("0x"); for (int B = 24; B >= 8; B -= 8){ print_hex_byte(w >> B); diff --git a/Marlin/src/libs/hex_print.h b/Marlin/src/libs/hex_print.h index 2fac6c9892..40baa15bcc 100644 --- a/Marlin/src/libs/hex_print.h +++ b/Marlin/src/libs/hex_print.h @@ -39,9 +39,3 @@ void print_hex_byte(const uint8_t b); void print_hex_word(const uint16_t w); void print_hex_address(const void * const w); void print_hex_long(const uint32_t w, const char delimiter); - -#ifdef CPU_32_BIT - typedef uint32_t ptr_int_t; -#else - typedef uint16_t ptr_int_t; -#endif From 3dc0f9c0b4afe33467fca831b3e95042fdcf2421 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 7 Aug 2020 20:51:40 -0500 Subject: [PATCH 0060/1370] configuration_store => settings --- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/gcode/bedlevel/M420.cpp | 2 +- Marlin/src/gcode/eeprom/M500-M504.cpp | 2 +- Marlin/src/lcd/dwin/dwin.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/module/{configuration_store.cpp => settings.cpp} | 2 +- Marlin/src/module/{configuration_store.h => settings.h} | 0 Marlin/src/sd/cardreader.cpp | 2 +- 13 files changed, 12 insertions(+), 12 deletions(-) rename Marlin/src/module/{configuration_store.cpp => settings.cpp} (99%) rename Marlin/src/module/{configuration_store.h => settings.h} (100%) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8c5966f744..a8c4407be2 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -43,7 +43,7 @@ #include "module/planner.h" #include "module/endstops.h" #include "module/temperature.h" -#include "module/configuration_store.h" +#include "module/settings.h" #include "module/printcounter.h" // PrintCounter or Stopwatch #include "module/stepper.h" diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 63b4482344..809caecf49 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -31,7 +31,7 @@ #include "../../../MarlinCore.h" #include "../../../gcode/gcode.h" - #include "../../../module/configuration_store.h" + #include "../../../module/settings.h" #include "../../../module/planner.h" #include "../../../module/motion.h" #include "../../../module/probe.h" diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 760d2cdd1e..69a66420f8 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -29,7 +29,7 @@ #include "../../../MarlinCore.h" #include "../../../HAL/shared/eeprom_api.h" #include "../../../libs/hex_print.h" - #include "../../../module/configuration_store.h" + #include "../../../module/settings.h" #include "../../../lcd/ultralcd.h" #include "../../../module/stepper.h" #include "../../../module/planner.h" diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index d515434171..96122c18f8 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -30,7 +30,7 @@ #include "../../module/probe.h" #if ENABLED(EEPROM_SETTINGS) - #include "../../module/configuration_store.h" + #include "../../module/settings.h" #endif #if ENABLED(EXTENSIBLE_UI) diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp index 30fa2b6e25..26c50a6129 100644 --- a/Marlin/src/gcode/eeprom/M500-M504.cpp +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -21,7 +21,7 @@ */ #include "../gcode.h" -#include "../../module/configuration_store.h" +#include "../../module/settings.h" #include "../../core/serial.h" #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 0daaf3982a..74a0e6d8ff 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -47,7 +47,7 @@ #include "../../feature/powerloss.h" #include "../../feature/babystep.h" -#include "../../module/configuration_store.h" +#include "../../module/settings.h" #include "../../module/temperature.h" #include "../../module/printcounter.h" #include "../../module/motion.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp index b52096a13b..def31e4a40 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -29,7 +29,7 @@ #include "../archim2-flash/flash_storage.h" -#include "../../../../../module/configuration_store.h" +#include "../../../../../module/settings.h" #if ENABLED(LULZBOT_PRINTCOUNTER) #include "../../../../../module/printcounter.h" diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 1c37b2f2d3..34def4d3bd 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -48,7 +48,7 @@ #endif #if ENABLED(SD_FIRMWARE_UPDATE) - #include "../../module/configuration_store.h" + #include "../../module/settings.h" #endif void menu_tmc(); diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 997130a91a..d1c1e6dd0a 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -33,7 +33,7 @@ #include "../../gcode/queue.h" #include "../../module/motion.h" #include "../../module/planner.h" -#include "../../module/configuration_store.h" +#include "../../module/settings.h" #include "../../feature/bedlevel/bedlevel.h" static int16_t ubl_storage_slot = 0, diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 6482cf33d0..670c916dd7 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -123,7 +123,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #include "lcdprint.h" #include "../sd/cardreader.h" -#include "../module/configuration_store.h" +#include "../module/settings.h" #include "../module/temperature.h" #include "../module/planner.h" #include "../module/motion.h" diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/settings.cpp similarity index 99% rename from Marlin/src/module/configuration_store.cpp rename to Marlin/src/module/settings.cpp index 28e15cfeb0..3df2067f5f 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/settings.cpp @@ -44,7 +44,7 @@ // Can be disabled for production build. //#define DEBUG_EEPROM_READWRITE -#include "configuration_store.h" +#include "settings.h" #include "endstops.h" #include "planner.h" diff --git a/Marlin/src/module/configuration_store.h b/Marlin/src/module/settings.h similarity index 100% rename from Marlin/src/module/configuration_store.h rename to Marlin/src/module/settings.h diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index bc1f88083a..864552516b 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -36,7 +36,7 @@ #include "../module/planner.h" // for synchronize #include "../module/printcounter.h" #include "../gcode/queue.h" -#include "../module/configuration_store.h" +#include "../module/settings.h" #include "../module/stepper/indirection.h" #if ENABLED(EMERGENCY_PARSER) From 24f0c9da11e5617ee01d52c942713146f40e758b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 7 Aug 2020 20:37:55 -0500 Subject: [PATCH 0061/1370] Clean up whitespace --- .../PlatformIO/variants/FLY_F407ZG/PeripheralPins.c | 12 ------------ .../PlatformIO/variants/MARLIN_F103Zx/ldscript.ld | 9 +++------ 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c index 0ac1d25ce9..bd2a47062c 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c @@ -151,9 +151,7 @@ WEAK const PinMap PinMap_PWM[] = { {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 @@ -167,7 +165,6 @@ WEAK const PinMap PinMap_PWM[] = { //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 @@ -183,12 +180,9 @@ WEAK const PinMap PinMap_PWM[] = { //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N @@ -196,23 +190,17 @@ WEAK const PinMap PinMap_PWM[] = { //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld index 098e83b060..09088b622c 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld @@ -102,7 +102,7 @@ SECTIONS . = ALIGN(4); } >FLASH - .ARM.extab : { + .ARM.extab : { . = ALIGN(4); *(.ARM.extab* .gnu.linkonce.armextab.*) . = ALIGN(4); @@ -146,7 +146,7 @@ SECTIONS _sidata = LOADADDR(.data); /* Initialized data sections into "RAM" Ram type memory */ - .data : + .data : { . = ALIGN(4); _sdata = .; /* create a global symbol at data start */ @@ -157,7 +157,7 @@ SECTIONS _edata = .; /* define a global symbol at data end */ } >RAM AT> FLASH - + /* Uninitialized data section into "RAM" Ram type memory */ . = ALIGN(4); .bss : @@ -185,8 +185,6 @@ SECTIONS . = ALIGN(8); } >RAM - - /* Remove information from the compiler libraries */ /DISCARD/ : { @@ -197,4 +195,3 @@ SECTIONS .ARM.attributes 0 : { *(.ARM.attributes) } } - From 02eb4bd80673b6ccc3c5bf5ece148c1309a367c9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 27 Jul 2020 18:09:52 -0500 Subject: [PATCH 0062/1370] General cleanup --- Marlin/src/gcode/control/M997.cpp | 2 ++ Marlin/src/module/settings.cpp | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/control/M997.cpp b/Marlin/src/gcode/control/M997.cpp index 6c28d42f41..cdff96f1ac 100644 --- a/Marlin/src/gcode/control/M997.cpp +++ b/Marlin/src/gcode/control/M997.cpp @@ -28,7 +28,9 @@ * M997: Perform in-application firmware update */ void GcodeSuite::M997() { + flashFirmware(parser.intval('S')); + } #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 3df2067f5f..34af8f2ea3 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2517,8 +2517,7 @@ void MarlinSettings::reset() { #if HAS_PROBE_XY_OFFSET LOOP_XYZ(a) probe.offset[a] = dpo[a]; #else - probe.offset.x = probe.offset.y = 0; - probe.offset.z = dpo[Z_AXIS]; + probe.offset.set(0, 0, dpo[Z_AXIS]); #endif #endif From f3959607418929e56f8036d2c9833a7e0540c4b8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 8 Aug 2020 00:14:02 -0500 Subject: [PATCH 0063/1370] Patch hex_print --- Marlin/src/libs/hex_print.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp index 360b50e5e3..0f746d6284 100644 --- a/Marlin/src/libs/hex_print.cpp +++ b/Marlin/src/libs/hex_print.cpp @@ -78,7 +78,7 @@ void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } -void print_hex_long(const uintptr_t w, const char delimiter) { +void print_hex_long(const uint32_t w, const char delimiter) { SERIAL_ECHOPGM("0x"); for (int B = 24; B >= 8; B -= 8){ print_hex_byte(w >> B); From 9af3b06fc2a52a19c97151b8d783547eba5d4364 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 8 Aug 2020 02:32:30 -0300 Subject: [PATCH 0064/1370] Marlin Color UI (FSMC) for STM32F1 (#18952) --- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 6 +- Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 236 ++++++++++++++++++ Marlin/src/HAL/STM32F1/tft/tft_fsmc.h | 64 +++++ Marlin/src/HAL/STM32F1/tft/xpt2046.cpp | 143 +++++++++++ Marlin/src/HAL/STM32F1/tft/xpt2046.h | 78 ++++++ Marlin/src/lcd/tft/touch.cpp | 1 - Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 47 +++- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 23 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 22 ++ 9 files changed, 604 insertions(+), 16 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp create mode 100644 Marlin/src/HAL/STM32F1/tft/tft_fsmc.h create mode 100644 Marlin/src/HAL/STM32F1/tft/xpt2046.cpp create mode 100644 Marlin/src/HAL/STM32F1/tft/xpt2046.h diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index 14977381e1..0a1d6c8202 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -26,12 +26,12 @@ #undef SD_CHECK_AND_RETRY #endif -#if HAS_GRAPHICAL_TFT - #error "Sorry! TFT displays are not available for HAL/STM32F1." +#if HAS_SPI_TFT + #error "Sorry! SPI TFT displays are not available for HAL/STM32F1 (yet)." #endif // This platform has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) +#if ENABLED(TOUCH_SCREEN) && !HAS_FSMC_TFT #undef TOUCH_SCREEN #undef TOUCH_SCREEN_CALIBRATION #define HAS_TOUCH_XPT2046 1 diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp new file mode 100644 index 0000000000..33cddd1e05 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -0,0 +1,236 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_FSMC_TFT + +#include "tft_fsmc.h" +#include +#include +#include + +LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD; + +/** + * FSMC LCD IO + */ +#define __ASM __asm +#define __STATIC_INLINE static inline + +__attribute__((always_inline)) __STATIC_INLINE void __DSB() { + __ASM volatile ("dsb 0xF":::"memory"); +} + +#define FSMC_CS_NE1 PD7 + +#if ENABLED(STM32_XL_DENSITY) + #define FSMC_CS_NE2 PG9 + #define FSMC_CS_NE3 PG10 + #define FSMC_CS_NE4 PG12 + + #define FSMC_RS_A0 PF0 + #define FSMC_RS_A1 PF1 + #define FSMC_RS_A2 PF2 + #define FSMC_RS_A3 PF3 + #define FSMC_RS_A4 PF4 + #define FSMC_RS_A5 PF5 + #define FSMC_RS_A6 PF12 + #define FSMC_RS_A7 PF13 + #define FSMC_RS_A8 PF14 + #define FSMC_RS_A9 PF15 + #define FSMC_RS_A10 PG0 + #define FSMC_RS_A11 PG1 + #define FSMC_RS_A12 PG2 + #define FSMC_RS_A13 PG3 + #define FSMC_RS_A14 PG4 + #define FSMC_RS_A15 PG5 +#endif + +#define FSMC_RS_A16 PD11 +#define FSMC_RS_A17 PD12 +#define FSMC_RS_A18 PD13 +#define FSMC_RS_A19 PE3 +#define FSMC_RS_A20 PE4 +#define FSMC_RS_A21 PE5 +#define FSMC_RS_A22 PE6 +#define FSMC_RS_A23 PE2 + +#if ENABLED(STM32_XL_DENSITY) + #define FSMC_RS_A24 PG13 + #define FSMC_RS_A25 PG14 +#endif + +/* Timing configuration */ +#define FSMC_ADDRESS_SETUP_TIME 15 // AddressSetupTime +#define FSMC_DATA_SETUP_TIME 15 // DataSetupTime + +static uint8_t fsmcInit = 0; +void TFT_FSMC::Init() { + uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN; + uint32_t controllerAddress; + + #if PIN_EXISTS(TFT_RESET) + OUT_WRITE(TFT_RESET_PIN, HIGH); + delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif + + struct fsmc_nor_psram_reg_map* fsmcPsramRegion; + + if (fsmcInit) return; + fsmcInit = 1; + + switch (cs) { + case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; + #if ENABLED(STM32_XL_DENSITY) + case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; + case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; + case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; + #endif + default: return; + } + + #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) + + switch (rs) { + #if ENABLED(STM32_XL_DENSITY) + case FSMC_RS_A0: _ORADDR( 1); break; + case FSMC_RS_A1: _ORADDR( 2); break; + case FSMC_RS_A2: _ORADDR( 3); break; + case FSMC_RS_A3: _ORADDR( 4); break; + case FSMC_RS_A4: _ORADDR( 5); break; + case FSMC_RS_A5: _ORADDR( 6); break; + case FSMC_RS_A6: _ORADDR( 7); break; + case FSMC_RS_A7: _ORADDR( 8); break; + case FSMC_RS_A8: _ORADDR( 9); break; + case FSMC_RS_A9: _ORADDR(10); break; + case FSMC_RS_A10: _ORADDR(11); break; + case FSMC_RS_A11: _ORADDR(12); break; + case FSMC_RS_A12: _ORADDR(13); break; + case FSMC_RS_A13: _ORADDR(14); break; + case FSMC_RS_A14: _ORADDR(15); break; + case FSMC_RS_A15: _ORADDR(16); break; + #endif + case FSMC_RS_A16: _ORADDR(17); break; + case FSMC_RS_A17: _ORADDR(18); break; + case FSMC_RS_A18: _ORADDR(19); break; + case FSMC_RS_A19: _ORADDR(20); break; + case FSMC_RS_A20: _ORADDR(21); break; + case FSMC_RS_A21: _ORADDR(22); break; + case FSMC_RS_A22: _ORADDR(23); break; + case FSMC_RS_A23: _ORADDR(24); break; + #if ENABLED(STM32_XL_DENSITY) + case FSMC_RS_A24: _ORADDR(25); break; + case FSMC_RS_A25: _ORADDR(26); break; + #endif + default: return; + } + + rcc_clk_enable(RCC_FSMC); + + gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 + gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 + gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); // FSMC_D02 + gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); // FSMC_D03 + gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); // FSMC_D04 + gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); // FSMC_D05 + gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); // FSMC_D06 + gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 + gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 + gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 + gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 + gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 + gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 + gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); // FSMC_D13 + gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); // FSMC_D14 + gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 + + gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // FSMC_NOE + gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // FSMC_NWE + + gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx + gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax + + fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; + + afio_remap(AFIO_REMAP_FSMC_NADV); + + LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; +} + +void TFT_FSMC::Transmit(uint16_t Data) { + LCD->RAM = Data; + __DSB(); +} + +void TFT_FSMC::WriteReg(uint16_t Reg) { + LCD->REG = Reg; + __DSB(); +} + +uint32_t TFT_FSMC::GetID() { + uint32_t id; + WriteReg(0x0000); + id = LCD->RAM; + + if (id == 0) + id = ReadID(LCD_READ_ID); + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + + uint32_t TFT_FSMC::ReadID(uint16_t Reg) { + uint32_t id; + WriteReg(Reg); + id = LCD->RAM; // dummy read + id = Reg << 24; + id |= (LCD->RAM & 0x00FF) << 16; + id |= (LCD->RAM & 0x00FF) << 8; + id |= LCD->RAM & 0x00FF; + return id; + } + +bool TFT_FSMC::isBusy() { + return false; +} + +void TFT_FSMC::Abort() { + +} + +void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); + dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); + dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + + while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; + dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); +} + +#endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h new file mode 100644 index 0000000000..5c43361c0c --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h @@ -0,0 +1,64 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#include + +#define DATASIZE_8BIT DMA_SIZE_8BITS +#define DATASIZE_16BIT DMA_SIZE_16BITS +#define TFT_IO TFT_FSMC + +typedef struct { + __IO uint16_t REG; + __IO uint16_t RAM; +} LCD_CONTROLLER_TypeDef; + +class TFT_FSMC { + private: + static LCD_CONTROLLER_TypeDef *LCD; + + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + + public: + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort(); + + static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {}; + static void DataTransferEnd() {}; + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg); + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_MODE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_CIRC_MODE, &Data, Count); } +}; diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp new file mode 100644 index 0000000000..dc34b0d5b5 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -0,0 +1,143 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TFT_XPT2046 + +#include "xpt2046.h" +#include + +uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include + + SPIClass XPT2046::SPIx(TOUCH_BUTTONS_HW_SPI_DEVICE); + + static void touch_spi_init(uint8_t spiRate) { + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + XPT2046::SPIx.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); + XPT2046::SPIx.setClockDivider(clock); + XPT2046::SPIx.setBitOrder(MSBFIRST); + XPT2046::SPIx.setDataMode(SPI_MODE0); + } +#endif // TOUCH_BUTTONS_HW_SPI + +void XPT2046::Init() { + SET_INPUT(TOUCH_MISO_PIN); + SET_OUTPUT(TOUCH_MOSI_PIN); + SET_OUTPUT(TOUCH_SCK_PIN); + OUT_WRITE(TOUCH_CS_PIN, HIGH); + + #if PIN_EXISTS(TOUCH_INT) + // Optional Pendrive interrupt pin + SET_INPUT(TOUCH_INT_PIN); + #endif + + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + touch_spi_init(SPI_SPEED_6); + #endif + + // Read once to enable pendrive status pin + getRawData(XPT2046_X); +} + +bool XPT2046::isTouched() { + return isBusy() ? false : ( + #if PIN_EXISTS(TOUCH_INT) + READ(TOUCH_INT_PIN) != HIGH + #else + getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD + #endif + ); +} + +bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { + if (isBusy()) return false; + if (!isTouched()) return false; + *x = getRawData(XPT2046_X); + *y = getRawData(XPT2046_Y); + return isTouched(); +} + +uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { + uint16_t data[3]; + + DataTransferBegin(); + + for (uint16_t i = 0; i < 3 ; i++) { + IO(coordinate); + data[i] = (IO() << 4) | (IO() >> 4); + } + + DataTransferEnd(); + + uint16_t delta01 = delta(data[0], data[1]), + delta02 = delta(data[0], data[2]), + delta12 = delta(data[1], data[2]); + + if (delta01 > delta02 || delta01 > delta12) + data[delta02 > delta12 ? 0 : 1] = data[2]; + + return (data[0] + data[1]) >> 1; +} + +uint16_t XPT2046::IO(uint16_t data) { + TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); +} + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + uint16_t XPT2046::HardwareIO(uint16_t data) { + SPIx.begin(); + uint16_t result = SPIx.transfer(data); + SPIx.end(); + return result; + } +#endif + +uint16_t XPT2046::SoftwareIO(uint16_t data) { + uint16_t result = 0; + + for (uint8_t j = 0x80; j; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); + if (READ(TOUCH_MISO_PIN)) result |= j; + WRITE(TOUCH_SCK_PIN, HIGH); + } + WRITE(TOUCH_SCK_PIN, LOW); + + return result; +} + +#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h new file mode 100644 index 0000000000..d2b7ad29b0 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h @@ -0,0 +1,78 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include +#endif + +#if !PIN_EXISTS(TOUCH_MISO) + #error "TOUCH_MISO_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_MOSI) + #error "TOUCH_MOSI_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_SCK) + #error "TOUCH_SCK_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_CS) + #error "TOUCH_CS_PIN is not defined." +#endif + +#ifndef TOUCH_INT_PIN + #define TOUCH_INT_PIN -1 +#endif + +#define XPT2046_DFR_MODE 0x00 +#define XPT2046_SER_MODE 0x04 +#define XPT2046_CONTROL 0x80 + +enum XPTCoordinate : uint8_t { + XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, +}; + +#if !defined(XPT2046_Z1_THRESHOLD) + #define XPT2046_Z1_THRESHOLD 10 +#endif + +class XPT2046 { +private: + static bool isBusy() { return false; } + + static uint16_t getRawData(const XPTCoordinate coordinate); + static bool isTouched(); + + static inline void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; + static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + static uint16_t HardwareIO(uint16_t data); + #endif + static uint16_t SoftwareIO(uint16_t data); + static uint16_t IO(uint16_t data = 0); + +public: + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + static SPIClass SPIx; + #endif + + static void Init(); + static bool getRawPoint(int16_t *x, int16_t *y); +}; diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 3407389f27..69f4ada86f 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -22,7 +22,6 @@ #if ENABLED(TOUCH_SCREEN) #include "touch.h" -#include "pinconfig.h" #include "../ultralcd.h" #include "../menu/menu.h" diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 6a39365887..6be67fc1a2 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -148,8 +148,8 @@ #endif // SPI Flash -#define SPI_FLASH_SIZE 0x200000 // 2MB -#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x200000 // 2MB +#define HAS_SPI_FLASH 1 // SPI 2 #define W25QXX_CS_PIN PB12 @@ -197,24 +197,47 @@ #define LCD_PIXEL_OFFSET_X 48 #define LCD_PIXEL_OFFSET_Y 48 - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 + #define XPT2046_X_CALIBRATION -12316 + #define XPT2046_Y_CALIBRATION 8981 + #define XPT2046_X_OFFSET 340 + #define XPT2046_Y_OFFSET -20 #define USE_XPT2046 1 #define XPT2046_XY_SWAP 0 #define XPT2046_X_INV 1 #define XPT2046_Y_INV 0 - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 140 - #define XPT2046_Y_MIN 200 + #define XPT2046_HOR_RES 480 + #define XPT2046_VER_RES 320 + #define XPT2046_X_MIN 140 + #define XPT2046_Y_MIN 200 #define XPT2046_X_MAX 1900 #define XPT2046_Y_MAX 1900 - #define XPT2046_AVG 4 - #define XPT2046_INV 0 + #define XPT2046_AVG 4 + #define XPT2046_INV 0 + +#elif ENABLED(TFT_480x320) + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 + + #define TOUCH_CS_PIN PB7 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index be64512b50..4633de40f2 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -156,6 +156,29 @@ #define XPT2046_Y_OFFSET -20 #endif #endif + +#elif ENABLED(TFT_480x320) + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 + + #define TOUCH_CS_PIN PB7 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #endif // SPI Flash diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index a68b481071..d314c30fcd 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -215,6 +215,28 @@ #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif +#elif ENABLED(TFT_480x320) + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 + + #define TOUCH_CS_PIN PA7 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #endif #define SPI_FLASH From ad30383b46bc366042165ccf8464ceaa9b6648ee Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 8 Aug 2020 18:21:44 -0500 Subject: [PATCH 0065/1370] Fix up STATIC_ITEM (#18962) --- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/feature/powerloss.h | 2 +- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 12 +++++++----- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 17 +++++++++-------- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/lcdprint.h | 1 + Marlin/src/lcd/menu/menu.h | 20 +++++++++++--------- Marlin/src/lcd/menu/menu_addon.h | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 4 ++-- Marlin/src/lcd/menu/menu_filament.cpp | 4 ++-- Marlin/src/lcd/menu/menu_info.cpp | 4 ++-- Marlin/src/lcd/menu/menu_led.cpp | 2 +- Marlin/src/lcd/menu/menu_mmu2.cpp | 4 ++-- Marlin/src/lcd/menu/menu_motion.cpp | 8 ++++---- Marlin/src/lcd/tft/ui_320x240.cpp | 6 +++--- Marlin/src/lcd/tft/ui_480x320.cpp | 6 +++--- 16 files changed, 51 insertions(+), 45 deletions(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 29a2cef97c..9a3eee31b5 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -21,7 +21,7 @@ */ /** - * power_loss_recovery.cpp - Resume an SD print after power-loss + * feature/powerloss.cpp - Resume an SD print after power-loss */ #include "../inc/MarlinConfigPre.h" diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 30ea343424..10653493ab 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -22,7 +22,7 @@ #pragma once /** - * power_loss_recovery.h - Resume an SD print after power-loss + * feature/powerloss.h - Resume an SD print after power-loss */ #include "../sd/cardreader.h" diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index a924528c30..22dd63f68c 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -997,15 +997,17 @@ void MarlinUI::draw_status_screen() { #endif // ADVANCED_PAUSE_FEATURE // Draw a static item with no left-right margin required. Centered by default. - void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { int8_t n = LCD_WIDTH; lcd_moveto(0, row); - if ((style & SS_CENTER) && !valstr) { - int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; + const int8_t plen = pstr ? utf8_strlen_P(pstr) : 0, + vlen = vstr ? utf8_strlen(vstr) : 0; + if (style & SS_CENTER) { + int8_t pad = (LCD_WIDTH - plen - vlen) / 2; while (--pad >= 0) { lcd_put_wchar(' '); n--; } } - n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); - if (valstr) n -= lcd_put_u8str_max(valstr, n); + if (plen) n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); + if (vlen) n -= lcd_put_u8str_max(vstr, n); for (; n > 0; --n) lcd_put_wchar(' '); } diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index c6c67bf97e..d17c336eec 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -347,20 +347,21 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } // Draw a static line of text in the same idiom as a menu item - void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { if (mark_as_selected(row, style & SS_INVERT)) { pixel_len_t n = LCD_PIXEL_WIDTH; // pixel width of string allowed - if ((style & SS_CENTER) && !valstr) - for (int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; pad > 0; --pad) { - lcd_put_wchar(' '); - n -= MENU_FONT_WIDTH; - } + const int8_t plen = pstr ? utf8_strlen_P(pstr) : 0, + vlen = vstr ? utf8_strlen(vstr) : 0; + if (style & SS_CENTER) { + int8_t pad = (LCD_WIDTH - plen - vlen) / 2; + while (--pad >= 0) n -= lcd_put_wchar(' '); + } - n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n / (MENU_FONT_WIDTH)) * (MENU_FONT_WIDTH); - if (valstr) n -= lcd_put_u8str_max(valstr, n); + if (plen) n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n / (MENU_FONT_WIDTH)) * (MENU_FONT_WIDTH); + if (vlen) n -= lcd_put_u8str_max(vstr, n); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); } } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 391cb598cf..ca7ddd2b03 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -504,7 +504,7 @@ namespace Language_en { #if LCD_WIDTH >= 20 PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Print Count"); PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total Print time"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total Print Time"); PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time"); PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded Total"); #else diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 8e611bde83..00139808ae 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -99,6 +99,7 @@ #endif +#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) int lcd_glyph_height(); diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index d298376ce2..7c3df79a19 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -83,7 +83,7 @@ class MenuItemBase { class MenuItem_static : public MenuItemBase { public: - static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const valstr=nullptr); + static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const vstr=nullptr); }; // CONFIRM_ITEM(LABEL,Y,N,FY,FN,V...), @@ -418,16 +418,17 @@ class MenuItem_bool : public MenuEditItemBase { }while(0) #define _MENU_ITEM_P(TYPE, V...) do { \ - _skipStatic = false; \ - if (_menuLineNr == _thisItemNr) \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ _MENU_INNER_P(TYPE, ##V); \ + } \ NEXT_ITEM(); \ }while(0) // Indexed items set a global index value and optional data #define _MENU_ITEM_N_S_P(TYPE, N, S, V...) do{ \ - _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ MenuItemBase::init(N, S); \ _MENU_INNER_P(TYPE, ##V); \ } \ @@ -436,8 +437,8 @@ class MenuItem_bool : public MenuEditItemBase { // Indexed items set a global index value #define _MENU_ITEM_N_P(TYPE, N, V...) do{ \ - _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ MenuItemBase::itemIndex = N; \ _MENU_INNER_P(TYPE, ##V); \ } \ @@ -446,8 +447,8 @@ class MenuItem_bool : public MenuEditItemBase { // Items with a unique string #define _MENU_ITEM_S_P(TYPE, S, V...) do{ \ - _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ MenuItemBase::itemString = S; \ _MENU_INNER_P(TYPE, ##V); \ } \ @@ -550,16 +551,17 @@ class MenuItem_bool : public MenuEditItemBase { // Indexed items set a global index value and optional data #define _CONFIRM_ITEM_P(PLABEL, V...) do { \ - _skipStatic = false; \ - if (_menuLineNr == _thisItemNr) \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ + } \ NEXT_ITEM(); \ }while(0) // Indexed items set a global index value #define _CONFIRM_ITEM_N_S_P(N, S, V...) do{ \ - _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ MenuItemBase::init(N, S); \ _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ } \ diff --git a/Marlin/src/lcd/menu/menu_addon.h b/Marlin/src/lcd/menu/menu_addon.h index c276c8865b..b6eb8e1634 100644 --- a/Marlin/src/lcd/menu/menu_addon.h +++ b/Marlin/src/lcd/menu/menu_addon.h @@ -25,6 +25,6 @@ #define MENU_ITEM_ADDON_START(X) do{ \ if (ui.should_draw() && _menuLineNr == _thisItemNr - 1) { \ - SETCURSOR(X, _lcdLineNr) + SETCURSOR_X(X) #define MENU_ITEM_ADDON_END() } }while(0) diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index ef3ad1ffed..26120fc5da 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -66,7 +66,7 @@ void menu_advanced_settings(); bar_percent += (int8_t)ui.encoderPosition; LIMIT(bar_percent, 0, 100); ui.encoderPosition = 0; - MenuItem_static::draw(0, GET_TEXT(MSG_PROGRESS_BAR_TEST), SS_CENTER|SS_INVERT); + MenuItem_static::draw(0, GET_TEXT(MSG_PROGRESS_BAR_TEST), SS_DEFAULT|SS_INVERT); lcd_put_int((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2, bar_percent); lcd_put_wchar('%'); lcd_moveto(0, LCD_HEIGHT - 1); ui.draw_progress_bar(bar_percent); } @@ -307,7 +307,7 @@ void menu_advanced_settings(); #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0) const uint8_t m = MenuItemBase::itemIndex; START_MENU(); - STATIC_ITEM_P(ui.get_preheat_label(m), SS_CENTER|SS_INVERT); + STATIC_ITEM_P(ui.get_preheat_label(m), SS_DEFAULT|SS_INVERT); BACK_ITEM(MSG_CONFIGURATION); #if HAS_FAN editable.uint8 = uint8_t(ui.material_preset[m].fan_speed); diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index b430e0448b..1b11438f4c 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -87,7 +87,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { _change_filament_mode = mode; _change_filament_extruder = extruder; START_MENU(); - if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_CENTER|SS_INVERT); + if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_DEFAULT|SS_INVERT); BACK_ITEM(MSG_BACK); #if PREHEAT_COUNT LOOP_L_N(m, PREHEAT_COUNT) @@ -266,7 +266,7 @@ void _lcd_pause_message(PGM_P const msg) { skip1 = !has2 && (LCD_HEIGHT) >= 5; START_SCREEN(); - STATIC_ITEM_P(pause_header(), SS_CENTER|SS_INVERT); // 1: Header + STATIC_ITEM_P(pause_header(), SS_DEFAULT|SS_INVERT); // 1: Header if (skip1) SKIP_ITEM(); // Move a single-line message down STATIC_ITEM_P(msg1); // 2: Message Line 1 if (has2) STATIC_ITEM_P(msg2); // 3: Message Line 2 diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 697d4b767e..b94be2e53f 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -205,7 +205,7 @@ void menu_info_board() { if (ui.use_click()) return ui.go_back(); START_SCREEN(); - STATIC_ITEM_P(PSTR(BOARD_INFO_NAME), SS_CENTER|SS_INVERT); // MyPrinterController + STATIC_ITEM_P(PSTR(BOARD_INFO_NAME), SS_DEFAULT|SS_INVERT); // MyPrinterController #ifdef BOARD_WEBSITE_URL STATIC_ITEM_P(PSTR(BOARD_WEBSITE_URL), SS_LEFT); // www.my3dprinter.com #endif @@ -237,7 +237,7 @@ void menu_info_board() { void menu_info_printer() { if (ui.use_click()) return ui.go_back(); START_SCREEN(); - STATIC_ITEM(MSG_MARLIN, SS_CENTER|SS_INVERT); // Marlin + STATIC_ITEM(MSG_MARLIN, SS_DEFAULT|SS_INVERT); // Marlin STATIC_ITEM_P(PSTR(SHORT_BUILD_VERSION)); // x.x.x-Branch STATIC_ITEM_P(PSTR(STRING_DISTRIBUTION_DATE)); // YYYY-MM-DD HH:MM STATIC_ITEM_P(PSTR(MACHINE_NAME)); // My3DPrinter diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index ac56ca0e52..b117e0baa1 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -37,7 +37,7 @@ void menu_led_presets() { START_MENU(); #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_LED_PRESETS, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_LED_PRESETS, SS_DEFAULT|SS_INVERT); #endif BACK_ITEM(MSG_LED_CONTROL); ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white); diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index e9627b8411..304e958877 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -131,7 +131,7 @@ inline void action_mmu2_choose(const uint8_t tool) { void menu_mmu2_choose_filament() { START_MENU(); #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_DEFAULT|SS_INVERT); #endif LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_choose(MenuItemBase::itemIndex); }); END_MENU(); @@ -145,7 +145,7 @@ void menu_mmu2_pause() { currentTool = mmu2.get_current_tool(); START_MENU(); #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_DEFAULT|SS_INVERT); #endif ACTION_ITEM(MSG_MMU2_RESUME, []{ mmuMenuWait = false; }); ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, []{ mmu2.unload(); }); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 60118a3017..622cd091c0 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -178,12 +178,12 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int START_MENU(); if (LCD_HEIGHT >= 4) { switch (axis) { - case X_AXIS: STATIC_ITEM(MSG_MOVE_X, SS_CENTER|SS_INVERT); break; - case Y_AXIS: STATIC_ITEM(MSG_MOVE_Y, SS_CENTER|SS_INVERT); break; - case Z_AXIS: STATIC_ITEM(MSG_MOVE_Z, SS_CENTER|SS_INVERT); break; + case X_AXIS: STATIC_ITEM(MSG_MOVE_X, SS_DEFAULT|SS_INVERT); break; + case Y_AXIS: STATIC_ITEM(MSG_MOVE_Y, SS_DEFAULT|SS_INVERT); break; + case Z_AXIS: STATIC_ITEM(MSG_MOVE_Z, SS_DEFAULT|SS_INVERT); break; default: TERN_(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin = current_position.e); - STATIC_ITEM(MSG_MOVE_E, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_MOVE_E, SS_DEFAULT|SS_INVERT); break; } } diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 0b800abc39..a4ac1465ea 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -341,11 +341,11 @@ void MarlinUI::draw_status_screen() { } // Draw a static item with no left-right margin required. Centered by default. -void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { menu_item(row); tft_string.set(pstr, itemIndex, itemString); - if (valstr) - tft_string.add(valstr); + if (vstr) + tft_string.add(vstr); tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 3eeed903cb..c9f0bfd0e9 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -345,11 +345,11 @@ void MarlinUI::draw_status_screen() { } // Draw a static item with no left-right margin required. Centered by default. -void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { menu_item(row); tft_string.set(pstr, itemIndex, itemString); - if (valstr) - tft_string.add(valstr); + if (vstr) + tft_string.add(vstr); tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); } From d7d3827f4752e7b02d6ec7f8ead511113af289f4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 8 Aug 2020 20:40:12 -0300 Subject: [PATCH 0066/1370] Fix compiler search in non-default PIO installs (#18960) --- buildroot/share/PlatformIO/scripts/common-dependencies.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index e09c639ad7..6c1b571bf1 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -156,16 +156,16 @@ def search_compiler(): # Find the current platform compiler by searching the $PATH if env['PLATFORM'] == 'win32': path_separator = ';' - path_regex = r'platformio\\packages.*\\bin' + path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + r'.*\\bin' gcc = "g++.exe" else: path_separator = ':' - path_regex = r'platformio/packages.*/bin' + path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + r'.*/bin' gcc = "g++" # Search for the compiler for path in env['ENV']['PATH'].split(path_separator): - if not re.search(path_regex, path): + if not re.search(path_regex, path, re.IGNORECASE): continue for file in os.listdir(path): if not file.endswith(gcc): From 6f686b18011c21e0458743470246840aba2d87ad Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 8 Aug 2020 20:45:34 -0300 Subject: [PATCH 0067/1370] Marlin Color UI for STM32F1 (SPI) (#18958) --- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 6 +- Marlin/src/HAL/STM32F1/tft/tft_spi.cpp | 144 ++++++++++++++++++ Marlin/src/HAL/STM32F1/tft/tft_spi.h | 65 ++++++++ Marlin/src/HAL/STM32F1/tft/xpt2046.cpp | 10 +- Marlin/src/lcd/tft/ili9488.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 9 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 31 ++++ 7 files changed, 253 insertions(+), 16 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/tft/tft_spi.cpp create mode 100644 Marlin/src/HAL/STM32F1/tft/tft_spi.h diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index 0a1d6c8202..09d79030b5 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -26,12 +26,8 @@ #undef SD_CHECK_AND_RETRY #endif -#if HAS_SPI_TFT - #error "Sorry! SPI TFT displays are not available for HAL/STM32F1 (yet)." -#endif - // This platform has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) && !HAS_FSMC_TFT +#if ENABLED(TOUCH_SCREEN) && !HAS_FSMC_TFT && !HAS_SPI_TFT #undef TOUCH_SCREEN #undef TOUCH_SCREEN_CALIBRATION #define HAS_TOUCH_XPT2046 1 diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp new file mode 100644 index 0000000000..a64f90f2b5 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp @@ -0,0 +1,144 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT + +#include "tft_spi.h" + +// TFT_SPI tft; + +SPIClass TFT_SPI::SPIx(1); + +#define SPI_TFT_CS_H OUT_WRITE(TFT_CS_PIN, HIGH) +#define SPI_TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW) + +#define SPI_TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH) +#define SPI_TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW) + +#define SPI_TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH) +#define SPI_TFT_RST_L OUT_WRITE(TFT_RST_PIN, LOW) + +#define SPI_TFT_BLK_H OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH) +#define SPI_TFT_BLK_L OUT_WRITE(TFT_BACKLIGHT_PIN, LOW) + +void TFT_SPI::Init() { + #if PIN_EXISTS(TFT_RESET) + // OUT_WRITE(TFT_RESET_PIN, HIGH); + SPI_TFT_RST_H; + delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + // OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + SPI_TFT_BLK_H; + #endif + + SPI_TFT_DC_H; + SPI_TFT_CS_H; + + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + #if SPI_DEVICE == 1 + #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 + #else + #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 + #endif + uint8_t clock; + uint8_t spiRate = SPI_FULL_SPEED; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX ; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + SPIx.setModule(1); + SPIx.setClockDivider(clock); + SPIx.setBitOrder(MSBFIRST); + SPIx.setDataMode(SPI_MODE0); +} + +void TFT_SPI::DataTransferBegin(uint16_t DataSize) { + SPIx.setDataSize(DataSize); + SPIx.begin(); + SPI_TFT_CS_L; +} + +uint32_t TFT_SPI::GetID() { + uint32_t id; + id = ReadID(LCD_READ_ID); + + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + +uint32_t TFT_SPI::ReadID(uint16_t Reg) { + #if !PIN_EXISTS(TFT_MISO) + return 0; + #else + uint16_t d = 0; + DataTransferBegin(DATASIZE_8BIT); + WriteReg(Reg); + + SPI.read((uint8_t*)&d, 1); //dummy read + SPI.read((uint8_t*)&d, 1); + + DataTransferEnd(); + + return d >> 7; + #endif +} + +bool TFT_SPI::isBusy() { + return false; +} + +void TFT_SPI::Abort() { + DataTransferEnd(); +} + +void TFT_SPI::Transmit(uint16_t Data) { + SPIx.send(Data); +} + +void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + DataTransferBegin(); + SPI_TFT_DC_H; + if (MemoryIncrease == DMA_MINC_ENABLE) { + SPIx.dmaSend(Data, Count, true); + } + else { + SPIx.dmaSend(Data, Count, false); + } + + DataTransferEnd(); +} + +#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.h b/Marlin/src/HAL/STM32F1/tft/tft_spi.h new file mode 100644 index 0000000000..1d1c9b444c --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.h @@ -0,0 +1,65 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#include + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#define DATASIZE_8BIT DATA_SIZE_8BIT +#define DATASIZE_16BIT DATA_SIZE_16BIT +#define TFT_IO TFT_SPI + +#define DMA_MINC_ENABLE 1 +#define DMA_MINC_DISABLE 0 + +class TFT_SPI { +private: + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + +public: + static SPIClass SPIx; + + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort(); + + static void DataTransferBegin(uint16_t DataWidth = DATA_SIZE_16BIT); + static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); SPIx.end(); }; + static void DataTransferAbort(); + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg) { WRITE(TFT_A0_PIN, LOW); Transmit(Reg); WRITE(TFT_A0_PIN, HIGH); } + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } +}; diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp index dc34b0d5b5..e06cace741 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -65,9 +65,7 @@ void XPT2046::Init() { SET_INPUT(TOUCH_INT_PIN); #endif - #if ENABLED(TOUCH_BUTTONS_HW_SPI) - touch_spi_init(SPI_SPEED_6); - #endif + TERN_(TOUCH_BUTTONS_HW_SPI, touch_spi_init(SPI_SPEED_6)); // Read once to enable pendrive status pin getRawData(XPT2046_X); @@ -95,12 +93,14 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { uint16_t data[3]; DataTransferBegin(); + TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.begin()); for (uint16_t i = 0; i < 3 ; i++) { IO(coordinate); data[i] = (IO() << 4) | (IO() >> 4); } + TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.end()); DataTransferEnd(); uint16_t delta01 = delta(data[0], data[1]), @@ -114,14 +114,12 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { } uint16_t XPT2046::IO(uint16_t data) { - TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); + return TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); } #if ENABLED(TOUCH_BUTTONS_HW_SPI) uint16_t XPT2046::HardwareIO(uint16_t data) { - SPIx.begin(); uint16_t result = SPIx.transfer(data); - SPIx.end(); return result; } #endif diff --git a/Marlin/src/lcd/tft/ili9488.h b/Marlin/src/lcd/tft/ili9488.h index 135f94a57f..6aad704865 100644 --- a/Marlin/src/lcd/tft/ili9488.h +++ b/Marlin/src/lcd/tft/ili9488.h @@ -39,7 +39,9 @@ #define ILI9488_ORIENTATION_DOWN ILI9488_MADCTL_MX // 320x480 ; Cable on the upper side #define ILI9488_COLOR_BGR -#define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT +#ifndef ILI9488_ORIENTATION + #define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT +#endif #define ILI9488_MADCTL_DATA (ILI9488_ORIENTATION | TERN(ILI9488_COLOR_BGR, ILI9488_MADCTL_BGR, ILI9488_MADCTL_RGB)) #define ILI9488_NOP 0x00 // No Operation diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index d314c30fcd..afa9354aa2 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -225,10 +225,10 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define XPT2046_X_CALIBRATION -17181 - #define XPT2046_Y_CALIBRATION 11434 - #define XPT2046_X_OFFSET 501 - #define XPT2046_Y_OFFSET -9 + #define XPT2046_X_CALIBRATION 17880 + #define XPT2046_Y_CALIBRATION -12234 + #define XPT2046_X_OFFSET -45 + #define XPT2046_Y_OFFSET 349 #define TOUCH_CS_PIN PA7 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK @@ -237,6 +237,7 @@ #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 + #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV #endif #define SPI_FLASH diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 9f4e57dd70..4552f8cd9f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -344,6 +344,37 @@ #define MKS_LCD12864B #undef SHOW_BOOTSCREEN + #elif ENABLED(TFT_480x320_SPI) + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 + + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 + + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 From 438a9bb4aa38e68832ffaf9b7e203dcc67d6cd67 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 8 Aug 2020 21:24:31 -0300 Subject: [PATCH 0068/1370] W25QXX SPI Flash support (#18897) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/control/M993_M994.cpp | 92 +++++++++++++++++++ Marlin/src/gcode/gcode.cpp | 5 + Marlin/src/gcode/gcode.h | 7 ++ .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 2 + .../lcd/extui/lib/mks_ui/SPIFlashStorage.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 1 - .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 4 + .../lib/mks_ui/tft_lvgl_configuration.cpp | 1 - .../{lcd/extui/lib/mks_ui => libs}/W25Qxx.cpp | 44 ++++----- .../{lcd/extui/lib/mks_ui => libs}/W25Qxx.h | 50 +--------- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 5 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 5 +- 14 files changed, 140 insertions(+), 84 deletions(-) create mode 100644 Marlin/src/gcode/control/M993_M994.cpp rename Marlin/src/{lcd/extui/lib/mks_ui => libs}/W25Qxx.cpp (90%) rename Marlin/src/{lcd/extui/lib/mks_ui => libs}/W25Qxx.h (67%) diff --git a/Marlin/src/gcode/control/M993_M994.cpp b/Marlin/src/gcode/control/M993_M994.cpp new file mode 100644 index 0000000000..4e13aa9d77 --- /dev/null +++ b/Marlin/src/gcode/control/M993_M994.cpp @@ -0,0 +1,92 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ALL(HAS_SPI_FLASH, SDSUPPORT, MARLIN_DEV_MODE) + +#include "../gcode.h" +#include "../../sd/cardreader.h" +#include "../../libs/W25Qxx.h" + +/** + * M993: Backup SPI Flash to SD + */ +void GcodeSuite::M993() { + if (!card.isMounted()) card.mount(); + + char fname[] = "spiflash.bin"; + card.openFileWrite(fname); + if (!card.isFileOpen()) { + SERIAL_ECHOLNPAIR("Failed to open ", fname, " to write."); + return; + } + + W25QXXFlash W25QXX; + + uint8_t buf[1024]; + uint32_t addr = 0; + W25QXX.init(SPI_QUARTER_SPEED); + SERIAL_ECHOPGM("Save SPI Flash"); + while (addr < SPI_FLASH_SIZE) { + W25QXX.SPI_FLASH_BufferRead(buf, addr, COUNT(buf)); + addr += COUNT(buf); + card.write(buf, COUNT(buf)); + if (addr % (COUNT(buf) * 10) == 0) SERIAL_CHAR('.'); + } + SERIAL_ECHOLNPGM(" done"); + + card.closefile(); +} + +/** + * M994: Load a backup from SD to SPI Flash + */ +void GcodeSuite::M994() { + if (!card.isMounted()) card.mount(); + + char fname[] = "spiflash.bin"; + card.openFileRead(fname); + if (!card.isFileOpen()) { + SERIAL_ECHOLNPAIR("Failed to open ", fname, " to read."); + return; + } + + W25QXXFlash W25QXX; + + uint8_t buf[1024]; + uint32_t addr = 0; + W25QXX.init(SPI_QUARTER_SPEED); + W25QXX.SPI_FLASH_BulkErase(); + SERIAL_ECHOPGM("Load SPI Flash"); + while(addr < SPI_FLASH_SIZE) { + card.read(buf, COUNT(buf)); + W25QXX.SPI_FLASH_BufferWrite(buf, addr, COUNT(buf)); + addr += COUNT(buf); + if (addr % (COUNT(buf) * 10) == 0) SERIAL_CHAR('.'); + } + SERIAL_ECHOLNPGM(" done"); + + card.closefile(); +} + +#endif // HAS_SPI_FLASH && SDSUPPORT && MARLIN_DEV_MODE diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index f1692ee807..2309953f88 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -871,6 +871,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe #endif + #if BOTH(HAS_SPI_FLASH, SDSUPPORT) + case 993: M993(); break; // M993: Backup SPI Flash to SD + case 994: M994(); break; // M994: Load a Backup from SD to SPI Flash + #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) case 995: M995(); break; // M995: Touch screen calibration for TFT display #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7e89e809d0..783781b9c3 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -276,6 +276,8 @@ * ************ Custom codes - This can change to suit future G-code regulations * G425 - Calibrate using a conductive object. (Requires CALIBRATION_GCODE) * M928 - Start SD logging: "M928 filename.gco". Stop with M29. (Requires SDSUPPORT) + * M993 - Backup SPI Flash to SD + * M994 - Load a Backup from SD to SPI Flash * M995 - Touch screen calibration for TFT display * M997 - Perform in-application firmware update * M999 - Restart after being stopped by error @@ -846,6 +848,11 @@ private: TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); + #if BOTH(HAS_SPI_FLASH, SDSUPPORT) + static void M993(); + static void M994(); + #endif + TERN_(PLATFORM_M997_SUPPORT, static void M997()); static void M999(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index 9d3adc1bab..979c916e5c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -27,6 +27,8 @@ #include "../../../../inc/MarlinConfig.h" #include "SPIFlashStorage.h" +extern W25QXXFlash W25QXX; + uint8_t SPIFlashStorage::m_pageData[SPI_FLASH_PageSize]; uint32_t SPIFlashStorage::m_currentPage; uint16_t SPIFlashStorage::m_pageDataUsed; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h index 5a12413709..98c8067bd3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h @@ -21,7 +21,7 @@ */ #pragma once -#include "W25Qxx.h" +#include "../../../../libs/W25Qxx.h" #define HAS_SPI_FLASH_COMPRESSION 1 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index e8899b9ad1..5d87eb9f87 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -27,7 +27,6 @@ #include "SPI_TFT.h" #endif -#include "W25Qxx.h" #include "tft_lvgl_configuration.h" #include "pic_manager.h" @@ -50,6 +49,7 @@ #include "../../../../feature/pause.h" #endif +W25QXXFlash W25QXX; CFG_ITMES gCfgItems; UI_CFG uiCfg; DISP_STATE_STACK disp_state_stack; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index 00371d7ab5..a35ae29701 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -29,7 +29,6 @@ #include "tft_lvgl_configuration.h" #include "draw_ready_print.h" -#include "W25Qxx.h" #include "mks_hardware_test.h" #include "draw_ui.h" #include "pic_manager.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 072213e499..447303a887 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -29,10 +29,10 @@ #include "mks_hardware_test.h" #include "SPIFlashStorage.h" -#include "W25Qxx.h" +#include "../../../../libs/W25Qxx.h" -#include "../../../../MarlinCore.h" #include "../../../../sd/cardreader.h" +#include "../../../../MarlinCore.h" extern uint16_t DeviceCode; extern unsigned char bmp_public_buf[17 * 1024]; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 354e11a540..4d9d08a9b4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -23,6 +23,8 @@ #include "../../../../inc/MarlinConfig.h" +#include "../../../../libs/W25Qxx.h" + #include #include @@ -154,6 +156,8 @@ extern void spi_flash_read_test(); extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); +extern W25QXXFlash W25QXX; + #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index fc5b8c1bf2..81b50a1018 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -35,7 +35,6 @@ #include "tft_lvgl_configuration.h" #include "draw_ready_print.h" -#include "W25Qxx.h" #include "pic_manager.h" #include "mks_hardware_test.h" #include "draw_ui.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp similarity index 90% rename from Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp rename to Marlin/src/libs/W25Qxx.cpp index 60b4d0b7ea..d51dfb819d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -19,13 +19,12 @@ * along with this program. If not, see . * */ -#include "../../../../inc/MarlinConfigPre.h" -#if 1 // ENABLED(SPI_FLASH) -#if HAS_TFT_LVGL_UI +#include "../inc/MarlinConfig.h" + +#if HAS_SPI_FLASH #include -#include "../../../../inc/MarlinConfig.h" #include "W25Qxx.h" @@ -45,9 +44,7 @@ #define W25QXX_CS_H OUT_WRITE(SPI_FLASH_CS_PIN, HIGH) #define W25QXX_CS_L OUT_WRITE(SPI_FLASH_CS_PIN, LOW) -ext_FLASH W25QXX; - -void ext_FLASH::init(uint8_t spiRate) { +void W25QXXFlash::init(uint8_t spiRate) { OUT_WRITE(SPI_FLASH_CS_PIN, HIGH); @@ -85,12 +82,12 @@ void ext_FLASH::init(uint8_t spiRate) { * * @details */ -uint8_t ext_FLASH::spi_flash_Rec() { +uint8_t W25QXXFlash::spi_flash_Rec() { uint8_t returnByte = SPI.transfer(ff); return returnByte; } -uint8_t ext_FLASH::spi_flash_read_write_byte(uint8_t data) { +uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { uint8_t returnByte = SPI.transfer(data); return returnByte; } @@ -104,7 +101,7 @@ uint8_t ext_FLASH::spi_flash_read_write_byte(uint8_t data) { * * @details Uses DMA */ -void ext_FLASH::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); } +void W25QXXFlash::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); } /** * @brief Send a single byte on SPI port @@ -113,7 +110,7 @@ void ext_FLASH::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0 * * @details */ -void ext_FLASH::spi_flash_Send(uint8_t b) { SPI.send(b); } +void W25QXXFlash::spi_flash_Send(uint8_t b) { SPI.send(b); } /** * @brief Write token and then write from 512 byte buffer to SPI (for SD card) @@ -123,12 +120,12 @@ void ext_FLASH::spi_flash_Send(uint8_t b) { SPI.send(b); } * * @details Use DMA */ -void ext_FLASH::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { +void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { SPI.send(token); SPI.dmaSend(const_cast(buf), 512); } -uint16_t ext_FLASH::W25QXX_ReadID(void) { +uint16_t W25QXXFlash::W25QXX_ReadID(void) { uint16_t Temp = 0; W25QXX_CS_L; spi_flash_Send(0x90); @@ -141,7 +138,7 @@ uint16_t ext_FLASH::W25QXX_ReadID(void) { return Temp; } -void ext_FLASH::SPI_FLASH_WriteEnable(void) { +void W25QXXFlash::SPI_FLASH_WriteEnable(void) { /* Select the FLASH: Chip Select low */ W25QXX_CS_L; /* Send "Write Enable" instruction */ @@ -159,7 +156,7 @@ void ext_FLASH::SPI_FLASH_WriteEnable(void) { * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_WaitForWriteEnd(void) { +void W25QXXFlash::SPI_FLASH_WaitForWriteEnd(void) { uint8_t FLASH_Status = 0; /* Select the FLASH: Chip Select low */ @@ -178,7 +175,7 @@ void ext_FLASH::SPI_FLASH_WaitForWriteEnd(void) { W25QXX_CS_H; } -void ext_FLASH::SPI_FLASH_SectorErase(uint32_t SectorAddr) { +void W25QXXFlash::SPI_FLASH_SectorErase(uint32_t SectorAddr) { /* Send write enable instruction */ SPI_FLASH_WriteEnable(); @@ -200,7 +197,7 @@ void ext_FLASH::SPI_FLASH_SectorErase(uint32_t SectorAddr) { SPI_FLASH_WaitForWriteEnd(); } -void ext_FLASH::SPI_FLASH_BlockErase(uint32_t BlockAddr) { +void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { SPI_FLASH_WriteEnable(); W25QXX_CS_L; /* Send Sector Erase instruction */ @@ -224,7 +221,7 @@ void ext_FLASH::SPI_FLASH_BlockErase(uint32_t BlockAddr) { * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_BulkErase(void) { +void W25QXXFlash::SPI_FLASH_BulkErase(void) { /* Send write enable instruction */ SPI_FLASH_WriteEnable(); @@ -253,7 +250,7 @@ void ext_FLASH::SPI_FLASH_BulkErase(void) { * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { +void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { /* Enable the write access to the FLASH */ SPI_FLASH_WriteEnable(); @@ -296,7 +293,7 @@ void ext_FLASH::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16 * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { +void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % SPI_FLASH_PageSize; @@ -361,7 +358,7 @@ void ext_FLASH::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { +void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { /* Select the FLASH: Chip Select low */ W25QXX_CS_L; @@ -389,7 +386,4 @@ void ext_FLASH::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16 W25QXX_CS_H; } -void ext_FLASH::lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);} - -#endif // HAS_TFT_LVGL_UI -#endif // 1 ... SPI_FLASH +#endif // HAS_SPI_FLASH diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h b/Marlin/src/libs/W25Qxx.h similarity index 67% rename from Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h rename to Marlin/src/libs/W25Qxx.h index 88d5d6c2f5..81e9643450 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h +++ b/Marlin/src/libs/W25Qxx.h @@ -52,49 +52,7 @@ #define SPI_FLASH_PageSize 256 #define SPI_FLASH_PerWritePageSize 256 -#if 0 - - #define PIC_NAME_MAX_LEN 50 - - #define LOGO_MAX_SIZE (300*1024) - #define TITLELOGO_MAX_SIZE (150*1024) - #define DEFAULT_VIEW_MAX_SIZE (200*200*2) - #define FLASH_VIEW_MAX_SIZE (200*200*2) - - //Robin 2 - #define PIC_NAME_ADDR 0x003000 - #define PIC_SIZE_ADDR 0x007000 - #define PIC_COUNTER_ADDR 0x008000 - #define PIC_LOGO_ADDR 0x009000 - //#define PIC_DATA_ADDR 0x02f000 - - #define DEFAULT_VIEW_ADDR 0XC5800 - #define BAK_VIEW_ADDR (DEFAULT_VIEW_ADDR+90*1024) - #define PIC_ICON_LOGO_ADDR (BAK_VIEW_ADDR+80*1024) - - #define PIC_DATA_ADDR (PIC_ICON_LOGO_ADDR+350*1024) - - #define FONTINFOADDR 0x600000 - #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 - #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024 - - #define PER_PIC_MAX_SPACE (32*1024) - - union union32 { - uint8_t bytes[4]; - uint32_t dwords; - }; - - struct pic_msg { - uint8_t name[PIC_NAME_MAX_LEN]; - union union32 size; - }; - - typedef struct pic_msg PIC_MSG; - -#endif // if 0 - -class ext_FLASH { +class W25QXXFlash { public: void init(uint8_t spiRate); static uint8_t spi_flash_Rec(); @@ -111,14 +69,8 @@ public: static void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); static void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); static void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); - //uint32_t lv_get_pic_addr(uint8_t *Pname); - void lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); }; -extern ext_FLASH W25QXX; - -//extern uint32_t lv_get_pic_addr(uint8_t *Pname); - //#ifdef __cplusplus //} /* C-declarations for C++ */ //#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index afa9354aa2..1604064352 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -240,8 +240,9 @@ #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV #endif -#define SPI_FLASH -#if ENABLED(SPI_FLASH) +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB +#if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 4552f8cd9f..be363e4537 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -398,8 +398,9 @@ #endif // HAS_SPI_LCD -#define SPI_FLASH -#if ENABLED(SPI_FLASH) +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB +#if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 From 9e44df9c5f6431eeb777b2e5d2abb566384d2926 Mon Sep 17 00:00:00 2001 From: sherwin-dc <59867245+sherwin-dc@users.noreply.github.com> Date: Sun, 9 Aug 2020 09:00:42 +0800 Subject: [PATCH 0069/1370] Password via G-code and MarlinUI (#18399) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 31 +++ Marlin/src/MarlinCore.cpp | 14 +- Marlin/src/core/language.h | 7 + Marlin/src/core/macros.h | 51 +++-- Marlin/src/feature/password/password.cpp | 58 ++++++ Marlin/src/feature/password/password.h | 57 ++++++ .../src/gcode/feature/password/M510-M512.cpp | 83 ++++++++ Marlin/src/gcode/gcode.cpp | 25 +++ Marlin/src/gcode/gcode.h | 13 ++ Marlin/src/inc/SanityCheck.h | 11 ++ Marlin/src/lcd/language/language_en.h | 11 ++ Marlin/src/lcd/menu/menu_advanced.cpp | 8 + Marlin/src/lcd/menu/menu_main.cpp | 8 +- Marlin/src/lcd/menu/menu_password.cpp | 184 ++++++++++++++++++ Marlin/src/module/settings.cpp | 42 +++- .../PlatformIO/scripts/common-dependencies.h | 3 + buildroot/tests/DUE-tests | 2 +- buildroot/tests/rambo-tests | 1 + platformio.ini | 4 + 19 files changed, 588 insertions(+), 25 deletions(-) create mode 100644 Marlin/src/feature/password/password.cpp create mode 100644 Marlin/src/feature/password/password.h create mode 100644 Marlin/src/gcode/feature/password/M510-M512.cpp create mode 100644 Marlin/src/lcd/menu/menu_password.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 3ad7dfdab3..3b6155f969 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1642,6 +1642,37 @@ */ //#define PRINTCOUNTER +/** + * Password + * + * Set a numerical password for the printer which can be requested: + * + * - When the printer boots up + * - Upon opening the 'Print from Media' Menu + * - When SD printing is completed or aborted + * + * The following G-codes can be used: + * + * M510 - Lock Printer. Blocks all commands except M511. + * M511 - Unlock Printer. + * M512 - Set, Change and Remove Password. + * + * If you forget the password and get locked out you'll need to re-flash + * the firmware with the feature disabled, reset EEPROM, and (optionally) + * re-flash the firmware again with this feature enabled. + */ +//#define PASSWORD_FEATURE +#if ENABLED(PASSWORD_FEATURE) + #define PASSWORD_LENGTH 4 // (#) Number of digits (1-9). 3 or 4 is recommended + #define PASSWORD_ON_STARTUP + #define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P command. Disable to prevent brute-force attack. + #define PASSWORD_CHANGE_GCODE // Change the password with M512 P N. + //#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent gcodes from running + //#define PASSWORD_AFTER_SD_PRINT_END + //#define PASSWORD_AFTER_SD_PRINT_ABORT + //#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE +#endif + //============================================================================= //============================= LCD and SD support ============================ //============================================================================= diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index a8c4407be2..39530395eb 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -213,6 +213,10 @@ #include "libs/L64XX/L64XX_Marlin.h" #endif +#if ENABLED(PASSWORD_FEATURE) + #include "feature/password/password.h" +#endif + PGMSTR(NUL_STR, ""); PGMSTR(M112_KILL_STR, "M112 Shutdown"); PGMSTR(G28_STR, "G28"); @@ -452,11 +456,15 @@ void startOrResumeJob() { #ifdef EVENT_GCODE_SD_STOP queue.inject_P(PSTR(EVENT_GCODE_SD_STOP)); #endif + + TERN_(PASSWORD_AFTER_SD_PRINT_ABORT, password.lock_machine()); } inline void finishSDPrinting() { - if (queue.enqueue_one_P(PSTR("M1001"))) + if (queue.enqueue_one_P(PSTR("M1001"))) { marlin_state = MF_RUNNING; + TERN_(PASSWORD_AFTER_SD_PRINT_END, password.lock_machine()); + } } #endif // SDSUPPORT @@ -1205,6 +1213,10 @@ void setup() { SETUP_RUN(tft_lvgl_init()); #endif + #if ENABLED(PASSWORD_ON_STARTUP) + SETUP_RUN(password.lock_machine()); // Will not proceed until correct password provided + #endif + marlin_state = MF_RUNNING; SETUP_LOG("setup() completed."); diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 5208b3e1bf..48431455f0 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -266,6 +266,13 @@ #define STR_DEBUG_COMMUNICATION "COMMUNICATION" #define STR_DEBUG_LEVELING "LEVELING" +#define STR_PRINTER_LOCKED "Printer locked! (Unlock with M511 or LCD)" +#define STR_WRONG_PASSWORD "Incorrect Password" +#define STR_PASSWORD_TOO_LONG "Password too long" +#define STR_PASSWORD_REMOVED "Password removed" +#define STR_REMINDER_SAVE_SETTINGS "Remember to save!" +#define STR_PASSWORD_SET "Password is " + // LCD Menu Messages #define LANGUAGE_DATA_INCL_(M) STRINGIFY_(fontdata/langdata_##M.h) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 3bd273872a..5fc1081019 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -342,15 +342,22 @@ #endif // Macros for adding -#define INC_0 1 -#define INC_1 2 -#define INC_2 3 -#define INC_3 4 -#define INC_4 5 -#define INC_5 6 -#define INC_6 7 -#define INC_7 8 -#define INC_8 9 +#define INC_0 1 +#define INC_1 2 +#define INC_2 3 +#define INC_3 4 +#define INC_4 5 +#define INC_5 6 +#define INC_6 7 +#define INC_7 8 +#define INC_8 9 +#define INC_9 10 +#define INC_10 11 +#define INC_11 12 +#define INC_12 13 +#define INC_13 14 +#define INC_14 15 +#define INC_15 16 #define INCREMENT_(n) INC_##n #define INCREMENT(n) INCREMENT_(n) @@ -367,16 +374,22 @@ #define ADD10(N) ADD5(ADD5(N)) // Macros for subtracting -#define DEC_0 0 -#define DEC_1 0 -#define DEC_2 1 -#define DEC_3 2 -#define DEC_4 3 -#define DEC_5 4 -#define DEC_6 5 -#define DEC_7 6 -#define DEC_8 7 -#define DEC_9 8 +#define DEC_0 0 +#define DEC_1 0 +#define DEC_2 1 +#define DEC_3 2 +#define DEC_4 3 +#define DEC_5 4 +#define DEC_6 5 +#define DEC_7 6 +#define DEC_8 7 +#define DEC_9 8 +#define DEC_10 9 +#define DEC_11 10 +#define DEC_12 11 +#define DEC_13 12 +#define DEC_14 13 +#define DEC_15 14 #define DECREMENT_(n) DEC_##n #define DECREMENT(n) DECREMENT_(n) diff --git a/Marlin/src/feature/password/password.cpp b/Marlin/src/feature/password/password.cpp new file mode 100644 index 0000000000..c519ee7c9c --- /dev/null +++ b/Marlin/src/feature/password/password.cpp @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(PASSWORD_FEATURE) + +#include "password.h" +#include "../../gcode/gcode.h" +#include "../../core/serial.h" + +Password password; + +// public: +bool Password::is_set, Password::is_locked; +uint32_t Password::value, Password::value_entry; + +// +// Authenticate user with password. +// Called from Setup, after SD Prinitng Stops/Aborts, and M510 +// +void Password::lock_machine() { + is_locked = true; + TERN_(HAS_LCD_MENU, authenticate_user(ui.status_screen, screen_password_entry)); +} + +// +// Authentication check +// +void Password::authentication_check() { + if (value_entry == value) + is_locked = false; + else + SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); + + TERN_(HAS_LCD_MENU, authentication_done()); +} + +#endif // PASSWORD_FEATURE diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h new file mode 100644 index 0000000000..66f1c70ba3 --- /dev/null +++ b/Marlin/src/feature/password/password.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../lcd/ultralcd.h" + +class Password { +public: + static bool is_set, is_locked; + static uint32_t value, value_entry; + + Password() { is_locked = false; } + + static void lock_machine(); + + #if HAS_LCD_MENU + static void access_menu_password(); + static void authentication_check(); + static void authentication_done(); + static void media_gatekeeper(); + + private: + static void authenticate_user(const screenFunc_t, const screenFunc_t); + static void menu_password(); + static void menu_password_entry(); + static void screen_password_entry(); + static void screen_set_password(); + static void start_over(); + + static void digit_entered(); + static void set_password_done(); + static void menu_password_report(); + + static void remove_password(); + #endif +}; + +extern Password password; diff --git a/Marlin/src/gcode/feature/password/M510-M512.cpp b/Marlin/src/gcode/feature/password/M510-M512.cpp new file mode 100644 index 0000000000..bcdeb7b91c --- /dev/null +++ b/Marlin/src/gcode/feature/password/M510-M512.cpp @@ -0,0 +1,83 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(PASSWORD_FEATURE) + +#include "../../../feature/password/password.h" +#include "../../../core/serial.h" +#include "../../gcode.h" + +// +// M510: Lock Printer +// +void GcodeSuite::M510() { + password.lock_machine(); +} + +// +// M511: Unlock Printer +// +#if ENABLED(PASSWORD_UNLOCK_GCODE) + + void GcodeSuite::M511() { + if (password.is_locked) { + password.value_entry = parser.ulongval('P'); + password.authentication_check(); + } + } + +#endif // PASSWORD_UNLOCK_GCODE + +// +// M512: Set/Change/Remove Password +// +#if ENABLED(PASSWORD_CHANGE_GCODE) + + void GcodeSuite::M512() { + if (password.is_set && parser.ulongval('P') != password.value) { + SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); + return; + } + + if (parser.seenval('N')) { + password.value_entry = parser.ulongval('N'); + + if (password.value_entry < CAT(1e, PASSWORD_LENGTH)) { + password.is_set = true; + password.value = password.value_entry; + SERIAL_ECHOLNPAIR(STR_PASSWORD_SET, password.value); // TODO: Update password.string + } + else + SERIAL_ECHOLNPGM(STR_PASSWORD_TOO_LONG); + } + else { + password.is_set = false; + SERIAL_ECHOLNPGM(STR_PASSWORD_REMOVED); + } + SERIAL_ECHOLNPGM(STR_REMINDER_SAVE_SETTINGS); + } + +#endif // PASSWORD_CHANGE_GCODE + +#endif // PASSWORD_FEATURE diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 2309953f88..840df54f6a 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -57,6 +57,10 @@ GcodeSuite gcode; #include "../feature/spindle_laser.h" #endif +#if ENABLED(PASSWORD_FEATURE) + #include "../feature/password/password.h" +#endif + #include "../MarlinCore.h" // for idle() // Inactivity shutdown @@ -241,6 +245,17 @@ void GcodeSuite::dwell(millis_t time) { void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { KEEPALIVE_STATE(IN_HANDLER); + /** + * Block all Gcodes except M511 Unlock Printer, if printer is locked + * Will still block Gcodes if M511 is disabled, in which case the printer should be unlocked via LCD Menu + */ + #if ENABLED(PASSWORD_FEATURE) + if (password.is_locked && !(parser.command_letter == 'M' && parser.codenum == 511)) { + SERIAL_ECHO_MSG(STR_PRINTER_LOCKED); + return; + } + #endif + // Handle a known G, M, or T switch (parser.command_letter) { case 'G': switch (parser.codenum) { @@ -736,6 +751,16 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 504: M504(); break; // M504: Validate EEPROM contents #endif + #if ENABLED(PASSWORD_FEATURE) + case 510: M510(); break; // M510: Lock Printer + #if ENABLED(PASSWORD_UNLOCK_GCODE) + case 511: M511(); break; // M511: Unlock Printer + #endif + #if ENABLED(PASSWORD_CHANGE_GCODE) + case 512: M512(); break; + #endif // M512: Set/Change/Remove Password + #endif + #if ENABLED(SDSUPPORT) case 524: M524(); break; // M524: Abort the current SD print job #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 783781b9c3..e04cd637eb 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -225,6 +225,9 @@ * M502 - Revert to the default "factory settings". ** Does not write them to EEPROM! ** * M503 - Print the current settings (in memory): "M503 S". S0 specifies compact output. * M504 - Validate EEPROM contents. (Requires EEPROM_SETTINGS) + * M510 - Lock Printer + * M511 - Unlock Printer + * M512 - Set/Change/Remove Password * M524 - Abort the current SD print job started with M24. (Requires SDSUPPORT) * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires SD_ABORT_ON_ENDSTOP_HIT) * M569 - Enable stealthChop on an axis. (Requires at least one _DRIVER_TYPE to be TMC2130/2160/2208/2209/5130/5160) @@ -760,6 +763,16 @@ private: #endif TERN_(EEPROM_SETTINGS, static void M504()); + #if ENABLED(PASSWORD_FEATURE) + static void M510(); + #if ENABLED(PASSWORD_UNLOCK_GCODE) + static void M511(); + #endif + #if ENABLED(PASSWORD_CHANGE_GCODE) + static void M512(); + #endif + #endif + TERN_(SDSUPPORT, static void M524()); TERN_(SD_ABORT_ON_ENDSTOP_HIT, static void M540()); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 7fbfda4fe1..f9b65c8bf4 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3083,5 +3083,16 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 controller." #endif +/** + * Sanity Check for Password Feature + */ +#if ENABLED(PASSWORD_FEATURE) + #if NONE(HAS_LCD_MENU, PASSWORD_UNLOCK_GCODE, PASSWORD_CHANGE_GCODE) + #error "Without PASSWORD_UNLOCK_GCODE, PASSWORD_CHANGE_GCODE, or a supported LCD there's no way to unlock the printer or set a password." + #elif DISABLED(EEPROM_SETTINGS) + #warning "PASSWORD_FEATURE settings will be lost on power-off without EEPROM_SETTINGS." + #endif +#endif + // Misc. Cleanup #undef _TEST_PWM diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index ca7ddd2b03..9f6178ae50 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -588,6 +588,17 @@ namespace Language_en { PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Bad page index"); PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Bad page speed"); + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Edit Password"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login Required"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Password Settings"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Enter Digit"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Set/Edit Password"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Remove Password"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Password is "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Start Over"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Remember to Save!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Password Removed"); + // // Filament Change screens show up to 3 lines on a 4-line display // ...or up to 2 lines on a 3-line display diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 34def4d3bd..e417861072 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -51,6 +51,10 @@ #include "../../module/settings.h" #endif +#if ENABLED(PASSWORD_FEATURE) + #include "../../feature/password/password.h" +#endif + void menu_tmc(); void menu_backlash(); @@ -603,6 +607,10 @@ void menu_advanced_settings() { }); #endif + #if ENABLED(PASSWORD_FEATURE) + SUBMENU(MSG_PASSWORD_SETTINGS, password.access_menu_password); + #endif + #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) CONFIRM_ITEM(MSG_INIT_EEPROM, MSG_BUTTON_INIT, MSG_BUTTON_CANCEL, diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 059290c523..9a1d2ece68 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -50,6 +50,10 @@ #include "../../lcd/menu/menu_mmu2.h" #endif +#if ENABLED(PASSWORD_FEATURE) + #include "../../feature/password/password.h" +#endif + void menu_tune(); void menu_cancelobject(); void menu_motion(); @@ -133,7 +137,7 @@ void menu_main() { if (card_detected) { if (!card_open) { - SUBMENU(MSG_MEDIA_MENU, menu_media); + SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); MENU_ITEM(gcode, #if PIN_EXISTS(SD_DETECT) MSG_CHANGE_MEDIA, M21_STR @@ -240,7 +244,7 @@ void menu_main() { MSG_RELEASE_MEDIA, PSTR("M22") #endif ); - SUBMENU(MSG_MEDIA_MENU, menu_media); + SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); } } else { diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp new file mode 100644 index 0000000000..f8e0b56721 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -0,0 +1,184 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// +// Advanced Settings Menus +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, PASSWORD_FEATURE) + +#include "../../feature/password/password.h" + +#include "menu.h" +#include "menu_addon.h" + +void menu_advanced_settings(); + +screenFunc_t success_screen, fail_screen; +bool authenticating; // = false +char string[(PASSWORD_LENGTH) + 1]; +static uint8_t digit_no; + +// +// Screen for both editing and setting the password +// +void Password::menu_password_entry() { + START_MENU(); + + // "Login" or "New Code" + STATIC_ITEM_P(authenticating ? GET_TEXT(MSG_LOGIN_REQUIRED) : GET_TEXT(MSG_EDIT_PASSWORD), SS_CENTER|SS_INVERT); + + STATIC_ITEM_P(PSTR(""), SS_CENTER|SS_INVERT, string); + + // Make the digit edit item look like a sub-menu + PGM_P const label = GET_TEXT(MSG_ENTER_DIGIT); + EDIT_ITEM_P(uint8, label, &editable.uint8, 0, 9, digit_entered); + MENU_ITEM_ADDON_START(utf8_strlen_P(label) + 1); + lcd_put_wchar(' '); + lcd_put_wchar('1' + digit_no); + SETCURSOR_X(LCD_WIDTH - 1); + lcd_put_wchar('>'); + MENU_ITEM_ADDON_END(); + + ACTION_ITEM(MSG_START_OVER, start_over); + + if (!authenticating) BACK_ITEM(MSG_BUTTON_CANCEL); + + END_MENU(); +} + +// +// Authentication check +// +void Password::authentication_done() { + ui.goto_screen(is_locked ? fail_screen : success_screen); + ui.completion_feedback(!is_locked); +} + +// A single digit was completed +void Password::digit_entered() { + uint32_t multiplier = CAT(1e, PASSWORD_LENGTH); // 1e5 = 100000 + LOOP_LE_N(i, digit_no) multiplier /= 10; + value_entry += editable.uint8 * multiplier; + string[digit_no++] = '0' + editable.uint8; + + // Exit edit screen menu and go to another screen + ui.goto_previous_screen(); + ui.use_click(); + ui.goto_screen(menu_password_entry); + + // After password has been keyed in + if (digit_no == PASSWORD_LENGTH) { + if (authenticating) + authentication_check(); + else + set_password_done(); + } +} + +// +// Set/Change Password +// +void Password::screen_password_entry() { + value_entry = 0; + digit_no = 0; + editable.uint8 = 0; + memset(string, '-', PASSWORD_LENGTH); + string[PASSWORD_LENGTH] = '\0'; + menu_password_entry(); +} + +void Password::screen_set_password() { + authenticating = false; + screen_password_entry(); +} + +void Password::authenticate_user(const screenFunc_t in_succ_scr, const screenFunc_t in_fail_scr) { + success_screen = in_succ_scr; + fail_screen = in_fail_scr; + if (is_set) { + authenticating = true; + ui.goto_screen(screen_password_entry); + ui.defer_status_screen(); + ui.update(); + } + else { + ui.goto_screen(in_succ_scr); + is_locked = false; + } +} + +void Password::access_menu_password() { + authenticate_user(menu_password, menu_advanced_settings); +} + +#if ENABLED(PASSWORD_ON_SD_PRINT_MENU) + void Password::media_gatekeeper() { + authenticate_user(menu_media, menu_main); + } +#endif + +void Password::start_over() { + ui.goto_previous_screen(); // Goto previous screen, if any + ui.goto_screen(screen_password_entry); +} + +void Password::menu_password_report() { + START_SCREEN(); + BACK_ITEM(MSG_PASSWORD_SETTINGS); + STATIC_ITEM(MSG_PASSWORD_SET, SS_LEFT, string); + STATIC_ITEM(MSG_REMINDER_SAVE_SETTINGS, SS_LEFT); + END_SCREEN(); +} + +void Password::set_password_done() { + is_set = true; + value = value_entry; + ui.completion_feedback(true); + ui.goto_screen(menu_password_report); +} + +void Password::remove_password() { + is_set = false; + string[0] = '0'; + string[1] = '\0'; + ui.completion_feedback(true); + ui.goto_screen(menu_password_report); +} + +// +// Password Menu +// +void Password::menu_password() { + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + SUBMENU(MSG_CHANGE_PASSWORD, screen_set_password); + ACTION_ITEM(MSG_REMOVE_PASSWORD, []{ ui.save_previous_screen(); remove_password(); } ); + #if ENABLED(EEPROM_SETTINGS) + ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); + #endif + END_MENU(); +} + +#endif // HAS_LCD_MENU && PASSWORD_FEATURE diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 34af8f2ea3..f1ab0fca69 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -140,6 +140,10 @@ #define HAS_CASE_LIGHT_BRIGHTNESS 1 #endif +#if ENABLED(PASSWORD_FEATURE) + #include "../feature/password/password.h" +#endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) #include "../lcd/tft/touch.h" #endif @@ -152,7 +156,7 @@ typedef struct { int16_t X, Y, Z, X2, Y2, Z2, Z3, Z4; typedef struct { bool X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_stealth_enabled_t; // Limit an index to an array size -#define ALIM(I,ARR) _MIN(I, signed(COUNT(ARR) - 1)) +#define ALIM(I,ARR) _MIN(I, (signed)COUNT(ARR) - 1) // Defaults for reset / fill in on load static const uint32_t _DMA[] PROGMEM = DEFAULT_MAX_ACCELERATION; @@ -407,6 +411,14 @@ typedef struct SettingsDataStruct { uint8_t caselight_brightness; // M355 P #endif + // + // PASSWORD_FEATURE + // + #if ENABLED(PASSWORD_FEATURE) + bool password_is_set; + uint32_t password_value; + #endif + // // TOUCH_SCREEN_CALIBRATION // @@ -1345,6 +1357,14 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(caselight.brightness); #endif + // + // Password feature + // + #if ENABLED(PASSWORD_FEATURE) + EEPROM_WRITE(password.is_set); + EEPROM_WRITE(password.value); + #endif + // // TOUCH_SCREEN_CALIBRATION // @@ -2185,6 +2205,15 @@ void MarlinSettings::postprocess() { EEPROM_READ(caselight.brightness); #endif + // + // Password feature + // + #if ENABLED(PASSWORD_FEATURE) + _FIELD_TEST(password_is_set); + EEPROM_READ(password.is_set); + EEPROM_READ(password.value); + #endif + // // TOUCH_SCREEN_CALIBRATION // @@ -2665,7 +2694,7 @@ void MarlinSettings::reset() { #define PID_DEFAULT(N,E) DEFAULT_##N #endif HOTEND_LOOP() { - PID_PARAM(Kp, e) = float(PID_DEFAULT(Kp, ALIM(e, defKp))); + PID_PARAM(Kp, e) = float(PID_DEFAULT(Kp, ALIM(e, defKp))); PID_PARAM(Ki, e) = scalePID_i(PID_DEFAULT(Ki, ALIM(e, defKi))); PID_PARAM(Kd, e) = scalePID_d(PID_DEFAULT(Kd, ALIM(e, defKd))); TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = float(PID_DEFAULT(Kc, ALIM(e, defKc)))); @@ -2783,6 +2812,15 @@ void MarlinSettings::reset() { } #endif + #if ENABLED(PASSWORD_FEATURE) + #ifdef PASSWORD_DEFAULT_VALUE + password.is_set = true; + password.value = PASSWORD_DEFAULT_VALUE; + #else + password.is_set = false; + #endif + #endif + postprocess(); DEBUG_ECHO_START(); diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index d18cb8c281..c41027003e 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -143,6 +143,9 @@ #if ENABLED(MMU2_MENUS) #define HAS_MENU_MMU2 #endif + #if ENABLED(PASSWORD_FEATURE) + #define HAS_MENU_PASSWORD + #endif #if HAS_TRINAMIC_CONFIG #define HAS_MENU_TMC #endif diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 5c36db0367..7f488f6126 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -33,7 +33,7 @@ opt_set EXTRUDER_AUTO_FAN_SPEED 100 opt_set TEMP_SENSOR_CHAMBER 3 opt_add TEMP_CHAMBER_PIN 6 opt_set HEATER_CHAMBER_PIN 45 -exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), EXTENSIBLE_UI, S-Curve, many options." +exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." restore_configs opt_set MOTHERBOARD BOARD_RADDS diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 0b249e2149..ec8af16c23 100644 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -33,6 +33,7 @@ opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TE PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LEVEL_BED_CORNERS \ NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM \ ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \ + PASSWORD_FEATURE PASSWORD_ON_STARTUP PASSWORD_ON_SD_PRINT_MENU PASSWORD_AFTER_SD_PRINT_END PASSWORD_AFTER_SD_PRINT_ABORT \ AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DISTINCT_E_FACTORS \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ diff --git a/platformio.ini b/platformio.ini index fdb120ae88..10990b4d21 100644 --- a/platformio.ini +++ b/platformio.ini @@ -41,6 +41,7 @@ default_src_filter = + - - + - - - + - - - - @@ -86,6 +87,7 @@ default_src_filter = + - - + - - - - + - - - - - - @@ -231,6 +233,7 @@ HAS_MENU_LED = src_filter=+ HAS_MENU_MEDIA = src_filter=+ HAS_MENU_MIXER = src_filter=+ HAS_MENU_MMU2 = src_filter=+ +HAS_MENU_PASSWORD = src_filter=+ HAS_MENU_POWER_MONITOR = src_filter=+ HAS_MENU_CUTTER = src_filter=+ HAS_MENU_TEMPERATURE = src_filter=+ @@ -276,6 +279,7 @@ TEMP_STAT_LEDS = src_filter=+ MAX7219_DEBUG = src_filter=+ + MIXING_EXTRUDER = src_filter=+ + PRUSA_MMU2 = src_filter=+ + +PASSWORD_FEATURE = src_filter=+ + ADVANCED_PAUSE_FEATURE = src_filter=+ + + AUTO_POWER_CONTROL = src_filter=+ HAS_POWER_MONITOR = src_filter=+ + From ab61bcafa33b8bf458bbdb43856516eb99bc033d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 8 Aug 2020 20:13:15 -0500 Subject: [PATCH 0070/1370] Password followup --- Marlin/src/gcode/feature/password/M510-M512.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/feature/password/M510-M512.cpp b/Marlin/src/gcode/feature/password/M510-M512.cpp index bcdeb7b91c..f26fb75fda 100644 --- a/Marlin/src/gcode/feature/password/M510-M512.cpp +++ b/Marlin/src/gcode/feature/password/M510-M512.cpp @@ -60,8 +60,8 @@ void GcodeSuite::M510() { return; } - if (parser.seenval('N')) { - password.value_entry = parser.ulongval('N'); + if (parser.seenval('S')) { + password.value_entry = parser.ulongval('S'); if (password.value_entry < CAT(1e, PASSWORD_LENGTH)) { password.is_set = true; From b94b3e6315ea621bcfc6fc23d146bd63a572ed78 Mon Sep 17 00:00:00 2001 From: cbaugher Date: Sun, 9 Aug 2020 15:46:47 -0500 Subject: [PATCH 0071/1370] Tool-change Z move followup (#18963) --- Marlin/src/module/tool_change.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 5d2dc7d3be..d1017cea80 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1133,7 +1133,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (toolchange_settings.enable_park) do_blocking_move_to_xy_z(destination, destination.z, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); #else do_blocking_move_to_xy(destination, planner.settings.max_feedrate_mm_s[X_AXIS]); - do_blocking_move_to_z(destination, planner.settings.max_feedrate_mm_s[Z_AXIS]); + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); #endif #endif From ca8fbbc2bea7b73146b2b53af9f8f0678fa998ed Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 9 Aug 2020 15:55:11 -0500 Subject: [PATCH 0072/1370] Shorthand values for M575 B --- Marlin/src/gcode/config/M575.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/config/M575.cpp b/Marlin/src/gcode/config/M575.cpp index 4144c366d1..3aa5844653 100644 --- a/Marlin/src/gcode/config/M575.cpp +++ b/Marlin/src/gcode/config/M575.cpp @@ -33,7 +33,21 @@ * B - Baud rate (bits per second) */ void GcodeSuite::M575() { - const int32_t baud = parser.ulongval('B'); + int32_t baud = parser.ulongval('B'); + switch (baud) { + case 24: + case 96: + case 192: + case 384: + case 576: + case 1152: baud *= 100; break; + case 250: + case 500: baud *= 1000; break; + case 19: baud = 19200; break; + case 38: baud = 38400; break; + case 57: baud = 57600; break; + case 115: baud = 115200; break; + } switch (baud) { case 2400: case 9600: case 19200: case 38400: case 57600: case 115200: case 250000: case 500000: case 1000000: { From c82ff17d3b44c802c0f51249bd8460edf0a2e0d4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 9 Aug 2020 15:57:59 -0500 Subject: [PATCH 0073/1370] Followup for SPI Flash --- Marlin/src/gcode/gcode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 840df54f6a..edbeca9c92 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -896,7 +896,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe #endif - #if BOTH(HAS_SPI_FLASH, SDSUPPORT) + #if ALL(HAS_SPI_FLASH, SDSUPPORT, MARLIN_DEV_MODE) case 993: M993(); break; // M993: Backup SPI Flash to SD case 994: M994(); break; // M994: Load a Backup from SD to SPI Flash #endif From a13834b9f94480d06c2b95cb4cb975bc26950117 Mon Sep 17 00:00:00 2001 From: ftk Date: Mon, 10 Aug 2020 01:19:35 +0300 Subject: [PATCH 0074/1370] Remaining Time for LIGHTWEIGHT_UI (#18875) --- .../lcd/dogm/status_screen_lite_ST7920.cpp | 22 +++++++++++++++---- .../src/lcd/dogm/status_screen_lite_ST7920.h | 10 ++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index fba485d706..211acc86c6 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -591,16 +591,17 @@ void ST7920_Lite_Status_Screen::draw_fan_speed(const uint8_t value) { write_byte('%'); } -void ST7920_Lite_Status_Screen::draw_print_time(const duration_t &elapsed) { +void ST7920_Lite_Status_Screen::draw_print_time(const duration_t &elapsed, char suffix) { #if HOTENDS == 1 set_ddram_address(DDRAM_LINE_3); #else set_ddram_address(DDRAM_LINE_3 + 5); #endif char str[7]; - str[elapsed.toDigital(str)] = ' '; + int str_length = elapsed.toDigital(str); + str[str_length++] = suffix; begin_data(); - write_str(str, 6); + write_str(str, str_length); } void ST7920_Lite_Status_Screen::draw_feedrate_percentage(const uint16_t percentage) { @@ -714,6 +715,7 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { if (forceUpdate || indicators_changed()) { const bool blink = ui.get_blink(); const duration_t elapsed = print_job_timer.duration(); + duration_t remaining = TERN0(USE_M73_REMAINING_TIME, ui.get_remaining_time()); const uint16_t feedrate_perc = feedrate_percentage; const int16_t extruder_1_temp = thermalManager.degHotend(0), extruder_1_target = thermalManager.degTargetHotend(0); @@ -738,7 +740,19 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { #endif draw_fan_speed(thermalManager.fanPercent(spd)); - draw_print_time(elapsed); + + // Draw elapsed/remaining time + const bool show_remaining = ENABLED(SHOW_REMAINING_TIME) && (DISABLED(ROTATE_PROGRESS_DISPLAY) || blink); + if (show_remaining && !remaining.second()) { + const auto progress = ui.get_progress_percent(); + if (progress) + remaining = elapsed.second() * (100 - progress) / progress; + } + if (show_remaining && remaining.second()) + draw_print_time(remaining, 'R'); + else + draw_print_time(elapsed); + draw_feedrate_percentage(feedrate_perc); // Update the fan and bed animations diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h index bc18c43f10..9f0815d099 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h @@ -80,14 +80,14 @@ class ST7920_Lite_Status_Screen { static void draw_fan_icon(const bool whichIcon); static void draw_heat_icon(const bool whichIcon, const bool heating); static void draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange); - static void draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); - static void draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); - static void draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); + static void draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); + static void draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); + static void draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); static void draw_fan_speed(const uint8_t value); - static void draw_print_time(const duration_t &elapsed); + static void draw_print_time(const duration_t &elapsed, char suffix=' '); static void draw_feedrate_percentage(const uint16_t percentage); static void draw_status_message(); - static void draw_position(const xyze_pos_t &pos, bool position_known = true); + static void draw_position(const xyze_pos_t &pos, bool position_known=true); static bool indicators_changed(); static bool position_changed(); From 069993e880637dcbf2f795daa598b6d025bcedcb Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 10 Aug 2020 03:48:57 +0200 Subject: [PATCH 0075/1370] Fix DISABLE_[XYZE] code (#18970) Co-authored-by: Scott Lahteine --- Marlin/src/module/planner.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index c2a9e6ac77..931daa3322 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1281,7 +1281,7 @@ void Planner::recalculate() { void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) - xyze_bool_t axis_active = { true, true, true, true }; + xyze_bool_t axis_active = { false }; #endif #if HAS_FAN @@ -1316,10 +1316,10 @@ void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { block_t *block = &block_buffer[b]; - if (ENABLED(DISABLE_X) && block->steps[X_AXIS]) axis_active[X_AXIS] = true; - if (ENABLED(DISABLE_Y) && block->steps[Y_AXIS]) axis_active[Y_AXIS] = true; - if (ENABLED(DISABLE_Z) && block->steps[Z_AXIS]) axis_active[Z_AXIS] = true; - if (ENABLED(DISABLE_E) && block->steps[E_AXIS]) axis_active[E_AXIS] = true; + if (ENABLED(DISABLE_X) && block->steps.x) axis_active.x = true; + if (ENABLED(DISABLE_Y) && block->steps.y) axis_active.y = true; + if (ENABLED(DISABLE_Z) && block->steps.z) axis_active.z = true; + if (ENABLED(DISABLE_E) && block->steps.e) axis_active.e = true; } #endif } From cae4c76b56ae1d5623a2c1abd228c5d97e39f4bc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 10 Aug 2020 01:44:11 -0500 Subject: [PATCH 0076/1370] Fix scripts using gawk and wget --- buildroot/bin/use_example_configs | 17 ++++++++++------- buildroot/share/fonts/uxggenpages.sh | 5 ++++- buildroot/share/git/ghtp | 9 ++++++--- buildroot/share/git/mfclean | 5 ++++- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index 96be67e53d..a7fe39a859 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -1,18 +1,21 @@ #!/usr/bin/env bash IFS=: read -r PART1 PART2 <<< "$@" -[ -n "${PART2}" ] && { REPO="$PART1" ; RDIR="$PART2" ; } \ - || { REPO=bugfix-2.0.x ; RDIR="$PART1" ; } +[ -n "${PART2}" ] && { REPO="$PART1" ; RDIR="${PART2// /%20}" ; } \ + || { REPO=bugfix-2.0.x ; RDIR="${PART1// /%20}" ; } EXAMPLES="https://raw.githubusercontent.com/MarlinFirmware/Configurations/$REPO/config/examples" +which curl >/dev/null && TOOL='curl -L -s -S -f -o wgot' +which wget >/dev/null && TOOL='wget -q -O wgot' + restore_configs cd Marlin -wget -q "$EXAMPLES/$RDIR/Configuration.h" -O wgot && mv wgot Configuration.h -wget -q "$EXAMPLES/$RDIR/Configuration_adv.h" -O wgot && mv wgot Configuration_adv.h -wget -q "$EXAMPLES/$RDIR/_Bootscreen.h" -O wgot && mv wgot _Bootscreen.h -wget -q "$EXAMPLES/$RDIR/_Statusscreen.h" -O wgot && mv wgot _Statusscreen.h -rm -f wgot +$TOOL "$EXAMPLES/$RDIR/Configuration.h" >/dev/null 2>&1 && mv wgot Configuration.h +$TOOL "$EXAMPLES/$RDIR/Configuration_adv.h" >/dev/null 2>&1 && mv wgot Configuration.h +$TOOL "$EXAMPLES/$RDIR/_Bootscreen.h" >/dev/null 2>&1 && mv wgot Configuration.h +$TOOL "$EXAMPLES/$RDIR/_Statusscreen.h" >/dev/null 2>&1 && mv wgot Configuration.h +rm -f wgot cd - >/dev/null diff --git a/buildroot/share/fonts/uxggenpages.sh b/buildroot/share/fonts/uxggenpages.sh index 9207835148..46ad438f9c 100755 --- a/buildroot/share/fonts/uxggenpages.sh +++ b/buildroot/share/fonts/uxggenpages.sh @@ -139,11 +139,14 @@ BEGIN { } EOF +which awk >/dev/null && AWK=awk +which gawk >/dev/null && AWK=gawk + grep -Hrn _UxGT . | grep '"' \ | sed 's/_UxGT("/\n&/g;s/[^\n]*\n_UxGT("\([^"]*\)[^\n]*/\1 /g;s/.$//' \ | ${EXEC_GENPAGES} \ | sort -k 1n -k 2n | uniq \ - | gawk -v EXEC_PREFIX=${DN_EXEC} -f "proc.awk" \ + | "$AWK" -v EXEC_PREFIX=${DN_EXEC} -f "proc.awk" \ | while read PAGE BEGIN END UTF8BEGIN UTF8END; do \ if [ ! -f ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h ]; then \ ${EXEC_BDF2U8G} -u ${PAGE} -b ${BEGIN} -e ${END} ${FN_FONT} fontpage_${PAGE}_${BEGIN}_${END} ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h > /dev/null 2>&1 ; diff --git a/buildroot/share/git/ghtp b/buildroot/share/git/ghtp index f7a6263012..a2fac985dd 100755 --- a/buildroot/share/git/ghtp +++ b/buildroot/share/git/ghtp @@ -13,14 +13,17 @@ case "$1" in -[Hh]) TYPE=HTTPS ; MATCH="git@" ; FORMULA="$GH_SSH/$GH_HTTPS" ;; -[Ss]) TYPE=SSH ; MATCH="https:" ; FORMULA="$GH_HTTPS/$GH_SSH" ;; *) - echo "usage: `basename $0` -h | -s" 1>&2 + echo "Usage: `basename $0` -h | -s" 1>&2 echo -e " \e[0;92m-h\e[0m to switch to HTTPS" 1>&2 echo -e " \e[0;92m-s\e[0m to switch to SSH" 1>&2 exit 1 ;; esac -REMOTES=$(git remote -v | egrep "\t$MATCH" | gawk '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") +which awk >/dev/null && AWK=awk +which gawk >/dev/null && AWK=gawk + +REMOTES=$(git remote -v | egrep "\t$MATCH" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") if [[ -z $REMOTES ]]; then echo "Nothing to do." ; exit @@ -29,5 +32,5 @@ fi echo "$REMOTES" | xargs -n2 git remote set-url echo -n "Remotes set to $TYPE: " -echo "$REMOTES" | gawk '{printf "%s ", $1}' +echo "$REMOTES" | "$AWK" '{printf "%s ", $1}' echo diff --git a/buildroot/share/git/mfclean b/buildroot/share/git/mfclean index f38997405b..b6ad2b5149 100755 --- a/buildroot/share/git/mfclean +++ b/buildroot/share/git/mfclean @@ -6,6 +6,9 @@ # Great way to clean up your branches after messing around a lot # +which awk >/dev/null && AWK=awk +which gawk >/dev/null && AWK=gawk + KEEP="RC|RCBugFix|dev|master|bugfix-1|bugfix-2" echo "Fetching latest upstream and origin..." @@ -18,7 +21,7 @@ git branch --merged | egrep -v "^\*|$KEEP" | xargs -n 1 git branch -d echo echo "Pruning Remotely-deleted Branches..." -git branch -vv | egrep -v "^\*|$KEEP" | grep ': gone]' | gawk '{print $1}' | xargs -n 1 git branch -D +git branch -vv | egrep -v "^\*|$KEEP" | grep ': gone]' | "$AWK" '{print $1}' | xargs -n 1 git branch -D echo # List fork branches that don't match local branches From b23da503faa62b984c7519368125db4b71aaa77c Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Mon, 10 Aug 2020 21:04:40 -0400 Subject: [PATCH 0077/1370] Fix Ender-3 V2 DWIN with manual mesh, host prompt (#18981) --- Marlin/src/lcd/dwin/dwin.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 74a0e6d8ff..87db3c4b25 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -53,6 +53,10 @@ #include "../../module/motion.h" #include "../../module/planner.h" +#if ENABLED(HOST_ACTION_COMMANDS) + #include "../../feature/host_actions.h" +#endif + #if HAS_LEVELING #include "../../feature/bedlevel/bedlevel.h" #endif @@ -124,7 +128,7 @@ constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other #define MBASE(L) (49 + (L)*MLINE) -#define BABY_Z_VAR TERN(HAS_LEVELING, probe.offset.z, zprobe_zoffset) +#define BABY_Z_VAR TERN(HAS_BED_PROBE, probe.offset.z, zprobe_zoffset) /* Value Init */ HMI_value_t HMI_ValueStruct; @@ -1116,11 +1120,11 @@ void HMI_Zoffset(void) { if (HMI_ValueStruct.show_mode == -4) { checkkey = Prepare; - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(4 + MROWS - index_prepare), TERN(HAS_LEVELING, probe.offset.z * 100, HMI_ValueStruct.offset_value)); + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(4 + MROWS - index_prepare), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); } else { checkkey = Tune; - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5 + MROWS - index_tune), TERN(HAS_LEVELING, probe.offset.z * 100, HMI_ValueStruct.offset_value)); + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5 + MROWS - index_tune), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); } DWIN_UpdateLCD(); return; @@ -1484,7 +1488,7 @@ void update_variable(void) { DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); last_speed = feedrate_percentage; } - #if HAS_LEVELING + #if HAS_BED_PROBE if (last_probe_zoffset != probe.offset.z) { show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, probe.offset.z * 100); last_probe_zoffset = probe.offset.z; @@ -2188,7 +2192,7 @@ void HMI_Prepare(void) { Popup_Window_Home(); break; case 4: // Z-offset - #if HAS_LEVELING + #if HAS_BED_PROBE checkkey = Homeoffset; HMI_ValueStruct.show_mode = -4; HMI_ValueStruct.offset_value = probe.offset.z * 100; @@ -3390,7 +3394,7 @@ void EachMomentUpdate(void) { else if (abort_flag && !HMI_flag.home_flag) { // Print Stop abort_flag = 0; HMI_ValueStruct.print_speed = feedrate_percentage = 100; - zprobe_zoffset = TERN(HAS_LEVELING, probe.offset.z, 0); + zprobe_zoffset = TERN(HAS_BED_PROBE, probe.offset.z, 0); planner.finish_and_disable(); From 3eafce4683ef78cb6b8e12c34e234427b03ae587 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Mon, 10 Aug 2020 19:06:19 -0600 Subject: [PATCH 0078/1370] For FTDI800 compatibility, remove VERTEX_FORMAT dependency (#18982) --- .../screens/bed_mesh_screen.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index f8a30e8241..663555f05d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -88,7 +88,15 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: const float scale_z = ((val_max == val_min) ? 1 : 1/(val_max - val_min)) * autoscale_max; - // These equations determine the appearance of the grid on the screen. + /** + * The 3D points go through a 3D graphics pipeline to determine the final 2D point on the screen. + * This is written out as a stack of macros that each apply an affine transformation to the point. + * At compile time, the compiler should be able to reduce these expressions. + * + * The last transformation in the chain (TRANSFORM_5) is initially set to a no-op so we can measure + * the dimensions of the grid, but is later replaced with a scaling transform that scales the grid + * to fit. + */ #define TRANSFORM_5(X,Y,Z) (X), (Y) // No transform #define TRANSFORM_4(X,Y,Z) TRANSFORM_5((X)/(Z),(Y)/-(Z), 0) // Perspective @@ -119,8 +127,12 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: const float center_x = x + w/2; const float center_y = y + h/2; + // Now replace the last transformation in the chain with a scaling operation. + #undef TRANSFORM_5 - #define TRANSFORM_5(X,Y,Z) center_x + (X - grid_cx) * scale_x, center_y + (Y - grid_cy) * scale_y // Fit to bounds + #define TRANSFORM_6(X,Y,Z) (X)*16, (Y)*16 // Scale to 1/16 pixel units + #define TRANSFORM_5(X,Y,Z) TRANSFORM_6( center_x + ((X) - grid_cx) * scale_x, \ + center_y + ((Y) - grid_cy) * scale_y, 0) // Scale to bounds // Draw the grid @@ -128,7 +140,6 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: CommandProcessor cmd; cmd.cmd(SAVE_CONTEXT()) - .cmd(VERTEX_FORMAT(0)) .cmd(TAG_MASK(false)) .cmd(SAVE_CONTEXT()); From 489143f1608a99b91d92a1d3e9f01239c9c1211f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 10 Aug 2020 20:03:13 -0500 Subject: [PATCH 0079/1370] Add'l CI/git script tweaks, fixes --- buildroot/bin/use_example_configs | 6 +++--- buildroot/share/fonts/uxggenpages.sh | 3 +-- buildroot/share/git/ghtp | 3 +-- buildroot/share/git/mfclean | 3 +-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index a7fe39a859..83c0f5485d 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -13,9 +13,9 @@ restore_configs cd Marlin $TOOL "$EXAMPLES/$RDIR/Configuration.h" >/dev/null 2>&1 && mv wgot Configuration.h -$TOOL "$EXAMPLES/$RDIR/Configuration_adv.h" >/dev/null 2>&1 && mv wgot Configuration.h -$TOOL "$EXAMPLES/$RDIR/_Bootscreen.h" >/dev/null 2>&1 && mv wgot Configuration.h -$TOOL "$EXAMPLES/$RDIR/_Statusscreen.h" >/dev/null 2>&1 && mv wgot Configuration.h +$TOOL "$EXAMPLES/$RDIR/Configuration_adv.h" >/dev/null 2>&1 && mv wgot Configuration_adv.h +$TOOL "$EXAMPLES/$RDIR/_Bootscreen.h" >/dev/null 2>&1 && mv wgot _Bootscreen.h +$TOOL "$EXAMPLES/$RDIR/_Statusscreen.h" >/dev/null 2>&1 && mv wgot _Statusscreen.h rm -f wgot cd - >/dev/null diff --git a/buildroot/share/fonts/uxggenpages.sh b/buildroot/share/fonts/uxggenpages.sh index 46ad438f9c..a99fd99024 100755 --- a/buildroot/share/fonts/uxggenpages.sh +++ b/buildroot/share/fonts/uxggenpages.sh @@ -139,8 +139,7 @@ BEGIN { } EOF -which awk >/dev/null && AWK=awk -which gawk >/dev/null && AWK=gawk +AWK=$(which gawk || which awk) grep -Hrn _UxGT . | grep '"' \ | sed 's/_UxGT("/\n&/g;s/[^\n]*\n_UxGT("\([^"]*\)[^\n]*/\1 /g;s/.$//' \ diff --git a/buildroot/share/git/ghtp b/buildroot/share/git/ghtp index a2fac985dd..3c0e21e371 100755 --- a/buildroot/share/git/ghtp +++ b/buildroot/share/git/ghtp @@ -20,8 +20,7 @@ case "$1" in ;; esac -which awk >/dev/null && AWK=awk -which gawk >/dev/null && AWK=gawk +AWK=$(which gawk || which awk) REMOTES=$(git remote -v | egrep "\t$MATCH" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") diff --git a/buildroot/share/git/mfclean b/buildroot/share/git/mfclean index b6ad2b5149..fd131c4263 100755 --- a/buildroot/share/git/mfclean +++ b/buildroot/share/git/mfclean @@ -6,8 +6,7 @@ # Great way to clean up your branches after messing around a lot # -which awk >/dev/null && AWK=awk -which gawk >/dev/null && AWK=gawk +AWK=$(which gawk || which awk) KEEP="RC|RCBugFix|dev|master|bugfix-1|bugfix-2" From 3e2b272239f03266843a020b6857a78e0a501565 Mon Sep 17 00:00:00 2001 From: Anders Sahlman <57940217+AndersSahlman@users.noreply.github.com> Date: Tue, 11 Aug 2020 03:21:48 +0200 Subject: [PATCH 0080/1370] MKS Robin new 320x240 TFT Color UI support (#18985) --- Marlin/src/lcd/tft/ili9341.h | 8 +- Marlin/src/lcd/tft/ili9488.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 128 ++++++++++++------ 3 files changed, 96 insertions(+), 44 deletions(-) diff --git a/Marlin/src/lcd/tft/ili9341.h b/Marlin/src/lcd/tft/ili9341.h index 42a36b7e34..22709e4cf7 100644 --- a/Marlin/src/lcd/tft/ili9341.h +++ b/Marlin/src/lcd/tft/ili9341.h @@ -38,8 +38,12 @@ #define ILI9341_ORIENTATION_LEFT ILI9341_MADCTL_MY | ILI9341_MADCTL_MX | ILI9341_MADCTL_MV // 320x240 ; Cable on the left side #define ILI9341_ORIENTATION_DOWN ILI9341_MADCTL_MX // 240x320 ; Cable on the upper side -#define ILI9341_COLOR_BGR -#define ILI9341_ORIENTATION ILI9341_ORIENTATION_LEFT +#ifndef ILI9341_COLOR_RGB + #define ILI9341_COLOR_BGR +#endif +#ifndef ILI9341_ORIENTATION + #define ILI9341_ORIENTATION ILI9341_ORIENTATION_LEFT +#endif #define ILI9341_MADCTL_DATA (ILI9341_ORIENTATION | TERN(ILI9341_COLOR_BGR, ILI9341_MADCTL_BGR, ILI9341_MADCTL_RGB)) #define ILI9341_NOP 0x00 // No Operation diff --git a/Marlin/src/lcd/tft/ili9488.h b/Marlin/src/lcd/tft/ili9488.h index 6aad704865..19fdc78e0a 100644 --- a/Marlin/src/lcd/tft/ili9488.h +++ b/Marlin/src/lcd/tft/ili9488.h @@ -38,7 +38,9 @@ #define ILI9488_ORIENTATION_LEFT ILI9488_MADCTL_MY | ILI9488_MADCTL_MX | ILI9488_MADCTL_MV // 480x320 ; Cable on the left side #define ILI9488_ORIENTATION_DOWN ILI9488_MADCTL_MX // 320x480 ; Cable on the upper side -#define ILI9488_COLOR_BGR +#ifndef ILI9488_COLOR_RGB + #define ILI9488_COLOR_BGR +#endif #ifndef ILI9488_ORIENTATION #define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 73e1b12b88..716cb16375 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -22,34 +22,33 @@ #pragma once /** - * MKS Robin MINI (STM32F130VET6) board pin assignments + * MKS Robin mini (STM32F130VET6) board pin assignments */ #ifndef __STM32F1__ #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin mini supports up to 1 hotends / E-steppers. Comment out this line to continue." + #error "MKS Robin mini only supports 1 hotend / E-stepper. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "MKS Robin mini" +#define BOARD_INFO_NAME "MKS Robin Mini" // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // #define DISABLE_DEBUG +// +// EEPROM +// #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - // 2K in a AT24C16N - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) + #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif -// -// Note: MKS Robin mini board is using SPI2 interface. -// -#define SPI_MODULE 2 +#define ENABLE_SPI2 // // Limit Switches @@ -82,6 +81,15 @@ #define E0_STEP_PIN PD6 #define E0_DIR_PIN PD3 + +// Motor current PWM pins +#define MOTOR_CURRENT_PWM_XY_PIN PA6 +#define MOTOR_CURRENT_PWM_Z_PIN PA7 +#define MOTOR_CURRENT_PWM_E_PIN PB0 +#define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp +#ifndef DEFAULT_PWM_MOTOR_CURRENT + #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } +#endif // // Temperature Sensors // @@ -91,64 +99,102 @@ // // Heaters / Fans // -#define HEATER_0_PIN PC3 // HEATER1 -#define HEATER_BED_PIN PA0 // HOT BED +#define HEATER_0_PIN PC3 +#define HEATER_BED_PIN PA0 #define FAN_PIN PB1 // FAN -// -// Thermocouples -// -//#define MAX6675_SS_PIN PE5 // TC1 - CS1 -//#define MAX6675_SS_PIN PE6 // TC2 - CS2 - // // Misc. Functions // #define POWER_LOSS_PIN PA2 // PW_DET #define PS_ON_PIN PA3 // PW_OFF -//#define LED_PIN PB2 +#define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) + +#define MT_DET_1_PIN PA4 +#define MT_DET_PIN_INVERTING false + +#define WIFI_IO0_PIN PC13 + +// +// SD Card +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define SDIO_SUPPORT +#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SD_DETECT_PIN PD12 +#define ONBOARD_SD_CS_PIN PC11 // // LCD / Controller // #define BEEPER_PIN PC5 -#define SD_DETECT_PIN PD12 /** * Note: MKS Robin TFT screens use various TFT controllers. * If the screen stays white, disable 'LCD_RESET_PIN' * to let the bootloader init the screen. */ + #define XPT2046_X_CALIBRATION 12033 + #define XPT2046_Y_CALIBRATION -9047 + #define XPT2046_X_OFFSET -30 + #define XPT2046_Y_OFFSET 254 + #if ENABLED(FSMC_GRAPHICAL_TFT) + #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 - #define LCD_RESET_PIN PC6 + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PC2 - #define TOUCH_SCK_PIN PB13 - #define TOUCH_MOSI_PIN PB15 - #define TOUCH_MISO_PIN PB14 + #define TOUCH_CS_PIN PC2 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif + +#elif ENABLED(TFT_320x240) //TFT32/28 + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define TOUCH_CS_PIN PC2 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + + #define TFT_DRIVER ILI9341 + #define TFT_BUFFER_SIZE 14400 + + // YV for normal screen mounting + #define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV + // XV for 180° rotated screen mounting + //#define ILI9341_ORIENTATION ILI9341_MADCTL_MX | ILI9341_MADCTL_MV + + #define ILI9341_COLOR_RGB #endif -// Motor current PWM pins -#define MOTOR_CURRENT_PWM_XY_PIN PA6 -#define MOTOR_CURRENT_PWM_Z_PIN PA7 -#define MOTOR_CURRENT_PWM_E_PIN PB0 -#define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp -#define DEFAULT_PWM_MOTOR_CURRENT { 1030, 1030, 1030 } // 1.05Amp per driver, here is XY, Z and E. This values determined empirically. - -// This is a kind of workaround in case native marlin "digipot" interface won't work. -// Required to enable related code in STM32F1/HAL.cpp -//#ifndef MKS_ROBIN_MINI_VREF_PWM -// #define MKS_ROBIN_MINI_VREF_PWM -//#endif - -//#define VREF_XY_PIN PA6 -//#define VREF_Z_PIN PA7 -//#define VREF_E1_PIN PB0 +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB +#if HAS_SPI_FLASH + #define W25QXX_CS_PIN PB12 // Flash chip-select + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif From 648b253f414723d030ce3efa2eecdfe65079fea5 Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Tue, 11 Aug 2020 08:25:35 +0700 Subject: [PATCH 0081/1370] EVENT_GCODE_SD_STOP => ABORT (#18978) --- Marlin/Configuration_adv.h | 2 +- Marlin/src/MarlinCore.cpp | 4 ++-- Marlin/src/inc/SanityCheck.h | 6 ++++-- Marlin/src/lcd/dwin/dwin.cpp | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a3013611cb..1b31f0bc34 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1137,7 +1137,7 @@ //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files - #define EVENT_GCODE_SD_STOP "G28XY" // G-code to run on Stop Print (e.g., "G28XY" or "G27") + #define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27") #if ENABLED(PRINTER_EVENT_LEDS) #define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 39530395eb..30b6fbe3d5 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -453,8 +453,8 @@ void startOrResumeJob() { #endif wait_for_heatup = false; TERN_(POWER_LOSS_RECOVERY, recovery.purge()); - #ifdef EVENT_GCODE_SD_STOP - queue.inject_P(PSTR(EVENT_GCODE_SD_STOP)); + #ifdef EVENT_GCODE_SD_ABORT + queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); #endif TERN_(PASSWORD_AFTER_SD_PRINT_ABORT, password.lock_machine()); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index f9b65c8bf4..6fcd867981 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -517,6 +517,8 @@ #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." #elif defined(ANYCUBIC_TFT_MODEL) #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." +#elif defined(EVENT_GCODE_SD_STOP) + #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT. Please update your Configuration.h." #endif #ifdef FIL_RUNOUT_INVERTING @@ -742,8 +744,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif #endif -#if defined(EVENT_GCODE_SD_STOP) && DISABLED(NOZZLE_PARK_FEATURE) - static_assert(nullptr == strstr(EVENT_GCODE_SD_STOP, "G27"), "NOZZLE_PARK_FEATURE is required to use G27 in EVENT_GCODE_SD_STOP."); +#if defined(EVENT_GCODE_SD_ABORT) && DISABLED(NOZZLE_PARK_FEATURE) + static_assert(nullptr == strstr(EVENT_GCODE_SD_ABORT, "G27"), "NOZZLE_PARK_FEATURE is required to use G27 in EVENT_GCODE_SD_ABORT."); #endif /** diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 87db3c4b25..1aa2656dcf 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -2072,9 +2072,9 @@ void HMI_PauseOrStop(void) { #ifdef ACTION_ON_CANCEL host_action_cancel(); #endif - #ifdef EVENT_GCODE_SD_STOP + #ifdef EVENT_GCODE_SD_ABORT Popup_Window_Home(); - queue.inject_P(PSTR(EVENT_GCODE_SD_STOP)); // For Ender 3 "G28 X Y" + queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); #endif abort_flag = true; #endif From 95f373448d7ed3505968fefd5ddcfec9215cd899 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Tue, 11 Aug 2020 10:11:40 +0200 Subject: [PATCH 0082/1370] Mention units for MANUAL_FEEDRATE (#18993) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1b31f0bc34..1c29af1f46 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1025,7 +1025,7 @@ // @section lcd #if EITHER(ULTIPANEL, EXTENSIBLE_UI) - #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/m) Feedrates for manual moves along X, Y, Z, E from panel #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) #if ENABLED(ULTIPANEL) #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" From 3dfbdbc66cb6e6f668a961ec130d768332099877 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 12 Aug 2020 16:46:51 -0500 Subject: [PATCH 0083/1370] String interpolation for 2-digit numbers (#18998) --- Marlin/src/core/language.h | 4 ++-- Marlin/src/lcd/lcdprint.cpp | 18 ++++++++++++------ Marlin/src/lcd/tft/tft_string.cpp | 21 ++++++++++----------- Marlin/src/lcd/tft/tft_string.h | 6 +++--- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 48431455f0..f0ddbdd6d0 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -353,7 +353,7 @@ * */ #if ENABLED(NUMBER_TOOLS_FROM_0) - #define LCD_FIRST_TOOL '0' + #define LCD_FIRST_TOOL 0 #define LCD_STR_N0 "0" #define LCD_STR_N1 "1" #define LCD_STR_N2 "2" @@ -363,7 +363,7 @@ #define LCD_STR_N6 "6" #define LCD_STR_N7 "7" #else - #define LCD_FIRST_TOOL '1' + #define LCD_FIRST_TOOL 1 #define LCD_STR_N0 "1" #define LCD_STR_N1 "2" #define LCD_STR_N2 "3" diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index c982cfe2aa..0f7f945a99 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -44,22 +44,28 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const i if (ch == '=' || ch == '~' || ch == '*') { if (ind >= 0) { if (ch == '*') { lcd_put_wchar('E'); n--; } - if (n) { lcd_put_wchar(ind + ((ch == '=') ? '0' : LCD_FIRST_TOOL)); n--; } + if (n) { + int8_t inum = ind + ((ch == '=') ? 0 : LCD_FIRST_TOOL); + if (inum >= 10) { + lcd_put_wchar('0' + (inum / 10)); n--; + inum %= 10; + } + if (n) { lcd_put_wchar('0' + inum); n--; } + } } else { PGM_P const b = ind == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED); n -= lcd_put_u8str_max_P(b, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); } if (n) n -= lcd_put_u8str_max_P((PGM_P)p, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); - continue; } else if (ch == '$' && inStr) { n -= lcd_put_u8str_max_P(inStr, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); - continue; } - - lcd_put_wchar(ch); - n--; + else { + lcd_put_wchar(ch); + n--; + } } return n; } diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index f4e203445d..7e66c3d29c 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -86,33 +86,32 @@ void TFT_String::set() { uint8_t read_byte(uint8_t *byte) { return *byte; } -void TFT_String::add(uint8_t *string, uint8_t index, uint8_t *itemString) { - uint8_t character; +void TFT_String::add(uint8_t *string, int8_t index, uint8_t *itemString) { wchar_t wchar; while (*string) { string = get_utf8_value_cb(string, read_byte, &wchar); - if (wchar > 255) - wchar |= 0x0080; - character = (uint8_t) (wchar & 0x00FF); + if (wchar > 255) wchar |= 0x0080; + uint8_t ch = uint8_t(wchar & 0x00FF); - if (character == '=' || character == '~' || character == '*') { + if (ch == '=' || ch == '~' || ch == '*') { if (index >= 0) { - if (character == '*') - add_character('E'); - add_character(index + ((character == '=') ? '0' : LCD_FIRST_TOOL)); + int8_t inum = index + ((ch == '=') ? 0 : LCD_FIRST_TOOL); + if (ch == '*') add_character('E'); + if (inum >= 10) { add_character('0' + (inum / 10)); inum %= 10; } + add_character('0' + inum); } else { add(index == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED)); } continue; } - else if (character == '$' && itemString) { + else if (ch == '$' && itemString) { add(itemString); continue; } - add_character(character); + add_character(ch); } eol(); } diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h index b4c94953f7..d83d3af702 100644 --- a/Marlin/src/lcd/tft/tft_string.h +++ b/Marlin/src/lcd/tft/tft_string.h @@ -86,11 +86,11 @@ class TFT_String { static void set(); static void add(uint8_t character) { add_character(character); eol(); } static void add(uint8_t *string) { while (*string) { add_character(*string++); } eol(); } - static void add(uint8_t *string, uint8_t index, uint8_t *itemString = NULL); + static void add(uint8_t *string, int8_t index, uint8_t *itemString = NULL); static void set(uint8_t *string) { set(); add(string); }; - static void set(uint8_t *string, uint8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; + static void set(uint8_t *string, int8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; static inline void set(const char *string) { set((uint8_t *)string); } - static inline void set(const char *string, uint8_t index, const char *itemString = NULL) { set((uint8_t *)string, index, itemString); } + static inline void set(const char *string, int8_t index, const char *itemString = NULL) { set((uint8_t *)string, index, itemString); } static inline void add(const char *string) { add((uint8_t *)string); } static void trim(uint8_t character = 0x20); From 4e7c5f19fe86ec2d77146ad5212f939c53dc5e42 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 13 Aug 2020 20:31:59 -0300 Subject: [PATCH 0084/1370] Optimize LVGL with HAL TFT IO (SPI and FSMC) (#18974) --- Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 16 +- Marlin/src/HAL/STM32F1/tft/tft_fsmc.h | 7 + Marlin/src/HAL/STM32F1/tft/tft_spi.cpp | 15 +- Marlin/src/HAL/STM32F1/tft/tft_spi.h | 7 + Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 186 ++---------- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h | 20 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 2 + Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 69 +---- .../extui/lib/mks_ui/mks_hardware_test.cpp | 2 - Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 260 ++-------------- .../lib/mks_ui/tft_lvgl_configuration.cpp | 280 +++--------------- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 25 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 25 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 11 + .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 29 +- 16 files changed, 181 insertions(+), 775 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp index 33cddd1e05..e0047e7d59 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_FSMC_TFT +#if HAS_FSMC_TFT || ENABLED(TFT_LVGL_UI_FSMC) #include "tft_fsmc.h" #include @@ -224,13 +224,15 @@ void TFT_FSMC::Abort() { } void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + #if defined(FSMC_DMA_DEV) && defined(FSMC_DMA_CHANNEL) + dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); + dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); + dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; + dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + #endif } #endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h index 5c43361c0c..6fcfea8a11 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h @@ -61,4 +61,11 @@ class TFT_FSMC { static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_MODE, Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_CIRC_MODE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + while (Count > 0) { + TransmitDMA(DMA_CIRC_MODE, &Data, Count > 0xFFFF ? 0xFFFF : Count); + Count = Count > 0xFFFF ? Count - 0xFFFF : 0; + } + } }; diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp index a64f90f2b5..2610262b0f 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_SPI_TFT +#if HAS_SPI_TFT || ENABLED(TFT_LVGL_UI_SPI) #include "tft_spi.h" @@ -103,16 +103,21 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { #if !PIN_EXISTS(TFT_MISO) return 0; #else - uint16_t d = 0; + uint8_t d = 0; + uint32_t data = 0; + SPIx.setClockDivider(SPI_CLOCK_DIV16); DataTransferBegin(DATASIZE_8BIT); WriteReg(Reg); - SPI.read((uint8_t*)&d, 1); //dummy read - SPI.read((uint8_t*)&d, 1); + LOOP_L_N(i, 4) { + SPIx.read((uint8_t*)&d, 1); + data = (data << 8) | d; + } DataTransferEnd(); + SPIx.setClockDivider(SPI_CLOCK_MAX); - return d >> 7; + return data >> 7; #endif } diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.h b/Marlin/src/HAL/STM32F1/tft/tft_spi.h index 1d1c9b444c..bb26fc21b6 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.h @@ -62,4 +62,11 @@ public: static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + while (Count > 0) { + TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count); + Count = Count > 0xFFFF ? Count - 0xFFFF : 0; + } + } }; diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 277131289a..fa4f0cd9b1 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -252,7 +252,7 @@ #endif // Full Touch Screen needs 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) +#if EITHER(TOUCH_SCREEN, HAS_TFT_LVGL_UI) #define HAS_TFT_XPT2046 1 #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index 0febc4edbd..607090ba39 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -54,112 +54,27 @@ TFT SPI_TFT; // use SPI1 for the spi tft. void TFT::spi_init(uint8_t spiRate) { - - SPI_TFT_CS_H; - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(1); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -} - -uint8_t TFT::spi_Rec() { - uint8_t returnByte = SPI.transfer(ff); - return returnByte; -} - -uint8_t TFT::spi_read_write_byte(uint8_t data) { - uint8_t returnByte = SPI.transfer(data); - return returnByte; -} - -/** - * @brief Receive a number of bytes from the SPI port to a buffer - * - * @param buf Pointer to starting address of buffer to write to. - * @param nbyte Number of bytes to receive. - * @return Nothing - * - * @details Uses DMA - */ -void TFT::spi_Read(uint8_t* buf, uint16_t nbyte) {SPI.dmaTransfer(0, const_cast(buf), nbyte);} - -/** - * @brief Send a single byte on SPI port - * - * @param b Byte to send - * - * @details - */ -void TFT::spi_Send(uint8_t b) {SPI.send(b);} - -/** - * @brief Write token and then write from 512 byte buffer to SPI (for SD card) - * - * @param buf Pointer with buffer start address - * @return Nothing - * - * @details Use DMA - */ -void TFT::spi_SendBlock(uint8_t token, const uint8_t* buf) { - SPI.send(token); - SPI.dmaSend(const_cast(buf), 512); + tftio.Init(); } void TFT::LCD_WR_REG(uint8_t cmd) { - SPI_TFT_CS_L; - SPI_TFT_DC_L; - spi_Send(cmd); - SPI_TFT_CS_H; + tftio.WriteReg(cmd); } -void TFT::LCD_WR_DATA(uint8_t data) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - spi_Send(data); - SPI_TFT_CS_H; -} -void TFT::LCD_WriteRAM_Prepare() {LCD_WR_REG(0X2C);} -void TFT::SetCursor(uint16_t x, uint16_t y) { - LCD_WR_REG(0x2A); - LCD_WR_DATA(x >> 8); - LCD_WR_DATA(x); - LCD_WR_DATA(x >> 8); - LCD_WR_DATA(x); - LCD_WR_REG(0x2B); - LCD_WR_DATA(y >> 8); - LCD_WR_DATA(y); - LCD_WR_DATA(y >> 8); - LCD_WR_DATA(y); +void TFT::LCD_WR_DATA(uint8_t data) { + tftio.WriteData(data); } void TFT::SetPoint(uint16_t x, uint16_t y, uint16_t point) { if ((x > 480) || (y > 320)) return; - SetCursor(x, y); - - LCD_WriteRAM_Prepare(); - LCD_WR_DATA((uint8_t)(point >> 8)); - LCD_WR_DATA((uint8_t)point); + SetWindows(x, y, 1, 1); + tftio.WriteMultiple(point, (uint16_t)1); } void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { + tftio.DataTransferBegin(DATASIZE_8BIT); + LCD_WR_REG(0x2A); LCD_WR_DATA(x >> 8); LCD_WR_DATA(x); @@ -171,6 +86,10 @@ void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { LCD_WR_DATA(y); LCD_WR_DATA((y + height - 1) >> 8); LCD_WR_DATA(y + height - 1); + + LCD_WR_REG(0X2C); + + tftio.DataTransferEnd(); } void TFT::LCD_init() { @@ -180,6 +99,8 @@ void TFT::LCD_init() { delay(150); SPI_TFT_RST_H; + tftio.DataTransferBegin(DATASIZE_8BIT); + delay(120); LCD_WR_REG(0x11); delay(120); @@ -251,6 +172,8 @@ void TFT::LCD_init() { delay(120); // Delay 120ms LCD_WR_REG(0x29); // Display ON + tftio.DataTransferEnd(); + LCD_clear(0x0000); // LCD_Draw_Logo(); SPI_TFT_BLK_H; @@ -258,81 +181,18 @@ void TFT::LCD_init() { } void TFT::LCD_clear(uint16_t color) { - unsigned int i; - uint8_t tbuf[960]; - - SetCursor(0, 0); - SetWindows(0, 0, 480 - 1, 320 - 1); - LCD_WriteRAM_Prepare(); - SPI_TFT_CS_L; - SPI_TFT_DC_H; - for (i = 0; i < 960;) { - tbuf[i] = color >> 8; - tbuf[i + 1] = color; - i += 2; - } - for (i = 0; i < 320; i++) { - // for (m=0;m<480;m++) - // { - // LCD_WR_DATA(color>>8); - // LCD_WR_DATA(color); - SPI.dmaSend(tbuf, 960, true); - // SPI_TFT_CS_H; - // } - } - SPI_TFT_CS_H; + SetWindows(0, 0, (LCD_FULL_PIXEL_WIDTH) - 1, (LCD_FULL_PIXEL_HEIGHT) - 1); + tftio.WriteMultiple(color, (uint32_t)(LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); } extern unsigned char bmp_public_buf[17 * 1024]; void TFT::LCD_Draw_Logo() { - uint16_t i,y_off = 0; - uint16_t *p_index; - uint16_t Color; - - #if 1 - for (y_off = 0; y_off < 320; y_off ++) { - Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, 960); - - SPI_TFT.spi_init(SPI_FULL_SPEED); - SetWindows(0, y_off, 480, 1); - LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ - for (i = 0; i < 960;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i+=2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(bmp_public_buf,960,true); - SPI_TFT_CS_H; - } - - #else - - for (index = 0; index < 40; index ++) { - Pic_Logo_Read((uint8_t *)"", bmp_public_buf, 480*8*2); - i = 0; - SetCursor(0,0); - SetWindows(0, y_off * 8, 480, 8); - LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ - for (i = 0; i < 480 * 8 * 2;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(bmp_public_buf,480*8*2,true); - SPI_TFT_CS_H; - - y_off++; - } - #endif - - SetWindows(0, 0, 479, 319); + SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); + for (uint16_t i = 0; i < (LCD_FULL_PIXEL_HEIGHT); i ++) { + Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (LCD_FULL_PIXEL_WIDTH) * 2); + tftio.WriteSequence((uint16_t *)bmp_public_buf, LCD_FULL_PIXEL_WIDTH); + } } #endif // HAS_TFT_LVGL_UI_SPI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h index 9b67684313..c4b04e1c21 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -21,13 +21,13 @@ */ #pragma once -#include +#include "../../inc/MarlinConfigPre.h" -#define SPI_TFT_CS_H OUT_WRITE(SPI_TFT_CS_PIN, HIGH) -#define SPI_TFT_CS_L OUT_WRITE(SPI_TFT_CS_PIN, LOW) - -#define SPI_TFT_DC_H OUT_WRITE(SPI_TFT_DC_PIN, HIGH) -#define SPI_TFT_DC_L OUT_WRITE(SPI_TFT_DC_PIN, LOW) +#if ENABLED(TFT_LVGL_UI_SPI) + #include HAL_PATH(../../HAL, tft/tft_spi.h) +#elif ENABLED(TFT_LVGL_UI_FSMC) + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) +#endif #define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) #define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) @@ -37,20 +37,14 @@ class TFT { public: + TFT_IO tftio; void spi_init(uint8_t spiRate); - uint8_t spi_Rec(); - uint8_t spi_read_write_byte(uint8_t data); - void spi_Read(uint8_t* buf, uint16_t nbyte); - void spi_Send(uint8_t b); - void spi_SendBlock(uint8_t token, const uint8_t* buf); void LCD_WR_REG(uint8_t cmd); void LCD_WR_DATA(uint8_t data); - void SetCursor(uint16_t x, uint16_t y); void SetPoint(uint16_t x, uint16_t y, uint16_t point); void SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height); void LCD_init(); void LCD_clear(uint16_t color); - void LCD_WriteRAM_Prepare(); void LCD_Draw_Logo(); }; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 9ef27afc9b..aad5e4362e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -51,6 +51,8 @@ #endif #include "../../../../gcode/gcode.h" +#include "pic_manager.h" + static lv_obj_t * scr; extern uint8_t sel_id; extern uint8_t once_flag; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 5d87eb9f87..dc5e4910e9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -500,14 +500,9 @@ char *creat_title_text() { } } - //SERIAL_ECHOLNPAIR("gPicturePreviewStart: ", gPicturePreviewStart, " PREVIEW_LITTLE_PIC_SIZE: ", PREVIEW_LITTLE_PIC_SIZE); - card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.spi_init(SPI_FULL_SPEED); - //SPI_TFT.SetCursor(0,0); SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); - SPI_TFT.LCD_WriteRAM_Prepare(); #else ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); LCD_WriteRAM_Prepare(); @@ -525,19 +520,11 @@ char *creat_title_text() { if (j >= 400) break; } #if ENABLED(TFT_LVGL_UI_SPI) - uint16_t Color, SpiColor; - SpiColor = (LV_COLOR_BACKGROUND.full >> 8) | ((LV_COLOR_BACKGROUND.full & 0xFF) << 8); - for (i = 0; i < 400;) { + for (i = 0; i < 400; i += 2) { p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = SpiColor; + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(bmp_public_buf, 400, true); - SPI_TFT_CS_H; + SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); #else for (i = 0; i < 400;) { p_index = (uint16_t *)(&bmp_public_buf[i]); @@ -627,10 +614,7 @@ char *creat_title_text() { card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.spi_init(SPI_FULL_SPEED); - //SPI_TFT.SetCursor(0,0); SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); - SPI_TFT.LCD_WriteRAM_Prepare(); #else ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); LCD_WriteRAM_Prepare(); @@ -750,9 +734,6 @@ char *creat_title_text() { void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { int index; int y_off = 0; - int _y; - uint16_t *p_index; - int i; for (index = 0; index < 10; index++) { // 200*200 #if HAS_BAK_VIEW_IN_FLASH @@ -761,58 +742,24 @@ char *creat_title_text() { } else { default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 20k - #if ENABLED(TFT_LVGL_UI_SPI) - uint16_t Color; - for (i = 0; i < (DEFAULT_VIEW_MAX_SIZE / 10);) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xff) << 8); - i += 2; - } - #endif } #else default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 20k - #if ENABLED(TFT_LVGL_UI_SPI) - for (i = 0; i < (DEFAULT_VIEW_MAX_SIZE / 10);) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xff) << 8); - i += 2; - } - #endif #endif - i = 0; #if ENABLED(TFT_LVGL_UI_SPI) - - //SPI_TFT.spi_init(SPI_FULL_SPEED); - //SPI_TFT.SetWindows(xpos_pixel, y_off * 20+ypos_pixel, 200,20); //200*200 - //SPI_TFT.LCD_WriteRAM_Prepare(); - int j = 0; - for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { - SPI_TFT.spi_init(SPI_FULL_SPEED); - SPI_TFT.SetWindows(xpos_pixel, y_off * 20 + ypos_pixel + j, 200, 1); // 200*200 - SPI_TFT.LCD_WriteRAM_Prepare(); - - j++; - //memcpy(public_buf,&bmp_public_buf[i],400); - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(&bmp_public_buf[i], 400, true); - SPI_TFT_CS_H; - - i += 400; - if (i >= 8000) break; - } + SPI_TFT.SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 + SPI_TFT.tftio.WriteSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20); #else int x_off = 0; uint16_t temp_p; + int i = 0; + uint16_t *p_index; ili9320_SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 LCD_WriteRAM_Prepare(); - for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { + for (int _y = y_off * 20; _y < (y_off + 1) * 20; _y++) { for (x_off = 0; x_off < 200; x_off++) { if (sel == 1) { temp_p = (uint16_t)(bmp_public_buf[i] | bmp_public_buf[i + 1] << 8); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index a35ae29701..a2795e933b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -590,8 +590,6 @@ void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint1 } void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor) { - // Select TFT SPI so it can receive data - TERN_(TFT_LVGL_UI_SPI, SPI_TFT.spi_init(SPI_FULL_SPEED)); while (*string != '\0') { disp_char_1624(x, y, *string, charColor, bkColor); string++; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index a257d03489..62967b9d80 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -22,249 +22,39 @@ #include "../../../../inc/MarlinConfig.h" -#if HAS_TFT_LVGL_UI +#if ENABLED(TFT_LVGL_UI_FSMC) -#if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs +#include HAL_PATH(../../HAL, tft/tft_fsmc.h) +TFT_IO tftio; - #include - #include - #include - #include +void LCD_IO_Init(uint8_t cs, uint8_t rs); +void LCD_IO_WriteData(uint16_t RegValue); +void LCD_IO_WriteReg(uint16_t Reg); +#ifdef LCD_USE_DMA_FSMC + void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); +#endif - /* Timing configuration */ - #define FSMC_ADDRESS_SETUP_TIME 15// AddressSetupTime - #define FSMC_DATA_SETUP_TIME 15// DataSetupTime +void LCD_IO_Init(uint8_t cs, uint8_t rs) { + tftio.Init(); +} - void LCD_IO_Init(uint8_t cs, uint8_t rs); - void LCD_IO_WriteData(uint16_t RegValue); - void LCD_IO_WriteReg(uint16_t Reg); - uint16_t LCD_IO_ReadData(uint16_t RegValue); - uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); - uint16_t ILI9488_ReadRAM(); - #ifdef LCD_USE_DMA_FSMC - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); - #endif +void LCD_IO_WriteData(uint16_t RegValue) { + tftio.WriteData(RegValue); +} - /** - * FSMC LCD IO - */ - #define __ASM __asm - #define __STATIC_INLINE static inline +void LCD_IO_WriteReg(uint16_t Reg) { + tftio.WriteReg(Reg); +} - __attribute__((always_inline)) __STATIC_INLINE void __DSB() {__ASM volatile ("dsb 0xF" ::: "memory");} - - #define FSMC_CS_NE1 PD7 - - #if ENABLED(STM32_XL_DENSITY) - #define FSMC_CS_NE2 PG9 - #define FSMC_CS_NE3 PG10 - #define FSMC_CS_NE4 PG12 - - #define FSMC_RS_A0 PF0 - #define FSMC_RS_A1 PF1 - #define FSMC_RS_A2 PF2 - #define FSMC_RS_A3 PF3 - #define FSMC_RS_A4 PF4 - #define FSMC_RS_A5 PF5 - #define FSMC_RS_A6 PF12 - #define FSMC_RS_A7 PF13 - #define FSMC_RS_A8 PF14 - #define FSMC_RS_A9 PF15 - #define FSMC_RS_A10 PG0 - #define FSMC_RS_A11 PG1 - #define FSMC_RS_A12 PG2 - #define FSMC_RS_A13 PG3 - #define FSMC_RS_A14 PG4 - #define FSMC_RS_A15 PG5 - #endif - - #define FSMC_RS_A16 PD11 - #define FSMC_RS_A17 PD12 - #define FSMC_RS_A18 PD13 - #define FSMC_RS_A19 PE3 - #define FSMC_RS_A20 PE4 - #define FSMC_RS_A21 PE5 - #define FSMC_RS_A22 PE6 - #define FSMC_RS_A23 PE2 - - #if ENABLED(STM32_XL_DENSITY) - #define FSMC_RS_A24 PG13 - #define FSMC_RS_A25 PG14 - #endif - - static uint8_t fsmcInit = 0; - - typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; - } LCD_CONTROLLER_TypeDef; - - LCD_CONTROLLER_TypeDef *LCD; - - void LCD_IO_Init(uint8_t cs, uint8_t rs) { - uint32_t controllerAddress; - struct fsmc_nor_psram_reg_map* fsmcPsramRegion; - - if (fsmcInit) return; - fsmcInit = 1; - - switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; - #endif - default: return; - } - - #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) - - switch (rs) { - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A0: _ORADDR( 1); break; - case FSMC_RS_A1: _ORADDR( 2); break; - case FSMC_RS_A2: _ORADDR( 3); break; - case FSMC_RS_A3: _ORADDR( 4); break; - case FSMC_RS_A4: _ORADDR( 5); break; - case FSMC_RS_A5: _ORADDR( 6); break; - case FSMC_RS_A6: _ORADDR( 7); break; - case FSMC_RS_A7: _ORADDR( 8); break; - case FSMC_RS_A8: _ORADDR( 9); break; - case FSMC_RS_A9: _ORADDR(10); break; - case FSMC_RS_A10: _ORADDR(11); break; - case FSMC_RS_A11: _ORADDR(12); break; - case FSMC_RS_A12: _ORADDR(13); break; - case FSMC_RS_A13: _ORADDR(14); break; - case FSMC_RS_A14: _ORADDR(15); break; - case FSMC_RS_A15: _ORADDR(16); break; - #endif - case FSMC_RS_A16: _ORADDR(17); break; - case FSMC_RS_A17: _ORADDR(18); break; - case FSMC_RS_A18: _ORADDR(19); break; - case FSMC_RS_A19: _ORADDR(20); break; - case FSMC_RS_A20: _ORADDR(21); break; - case FSMC_RS_A21: _ORADDR(22); break; - case FSMC_RS_A22: _ORADDR(23); break; - case FSMC_RS_A23: _ORADDR(24); break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A24: _ORADDR(25); break; - case FSMC_RS_A25: _ORADDR(26); break; - #endif - default: return; - } - - rcc_clk_enable(RCC_FSMC); - - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP);// FSMC_D02 - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP);// FSMC_D03 - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP);// FSMC_D04 - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP);// FSMC_D05 - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP);// FSMC_D06 - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP);// FSMC_D13 - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP);// FSMC_D14 - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 - - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP);// FSMC_NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP);// FSMC_NWE - - gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx - gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - - fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - - afio_remap(AFIO_REMAP_FSMC_NADV); - - LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; +#ifdef LCD_USE_DMA_FSMC + void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { + tftio.WriteMultiple(color, count); } - void LCD_IO_WriteData(uint16_t RegValue) { - LCD->RAM = RegValue; - __DSB(); + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { + tftio.WriteSequence(data, length); } +#endif // LCD_USE_DMA_FSMC - void LCD_IO_WriteReg(uint16_t Reg) { - LCD->REG = Reg; - __DSB(); - } - - uint16_t LCD_IO_ReadData(uint16_t RegValue) { - LCD->REG = RegValue; - __DSB(); - - return LCD->RAM; - } - - uint16_t ILI9488_ReadRAM() { - uint16_t data; - data = LCD->RAM; - return data; - } - - uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - volatile uint32_t data; - LCD->REG = RegValue; - __DSB(); - - data = LCD->RAM; // dummy read - data = LCD->RAM & 0x00FF; - - while (--ReadSize) { - data <<= 8; - data |= (LCD->RAM & 0x00FF); - } - return uint32_t(data); - } - - #ifdef LCD_USE_DMA_FSMC - - void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { - while (count > 0) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, &color, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, count > 65535 ? 65535 : count); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {} - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - count = count > 65535 ? count - 65535 : 0; - } - } - - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {} - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - } - - void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - } - - void LCD_IO_WaitSequence_Async() { - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {} - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - } - - #endif // LCD_USE_DMA_FSMC - -#endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 81b50a1018..391e12ba3f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -42,9 +42,8 @@ #include "../../../../inc/MarlinConfig.h" -#if HAS_TOUCH_XPT2046 - #include "../../../touch/xpt2046.h" -#endif +#include HAL_PATH(../../HAL, tft/xpt2046.h) +XPT2046 touch; #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -121,14 +120,14 @@ void tft_set_cursor(uint16_t x, uint16_t y) { void LCD_WriteRAM_Prepare(void) { #if 0 - if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x8989)) { - ClrCs - LCD->LCD_REG = R34; - SetCs - } - else { - LCD_WrtReg(0x002C); - } + switch (DeviceCode) { + case 0x9325: case 0x9328: case 0x8989: { + ClrCs + LCD->LCD_REG = R34; + SetCs + } break; + default: LCD_WrtReg(0x002C); + } #else LCD_IO_WriteReg(0x002C); #endif @@ -197,8 +196,8 @@ void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16 LCD_WriteReg(0x0053, yEnd);*/ LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit - LCD_WriteReg(0x0052, 320 - xEnd); - LCD_WriteReg(0x0053, 320 - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0052, (LCD_FULL_PIXEL_HEIGHT) - xEnd); + LCD_WriteReg(0x0053, (LCD_FULL_PIXEL_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit } else { @@ -268,28 +267,10 @@ void LCD_Clear(uint16_t Color) { } } -extern uint16_t ILI9488_ReadRAM(); - +#include HAL_PATH(../../HAL, tft/tft_fsmc.h) +extern TFT_IO tftio; void init_tft() { uint16_t i; - //************* Start Initial Sequence **********// - - //start lcd pins and dma - #if PIN_EXISTS(LCD_BACKLIGHT) - OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away - #endif - - #if PIN_EXISTS(LCD_RESET) - // Perform a clean hardware reset with needed delays - OUT_WRITE(LCD_RESET_PIN, LOW); - _delay_ms(5); - WRITE(LCD_RESET_PIN, HIGH); - _delay_ms(5); - #endif - - #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) - WRITE(LCD_BACKLIGHT_PIN, HIGH); - #endif TERN_(HAS_LCD_CONTRAST, refresh_contrast()); @@ -303,12 +284,9 @@ void init_tft() { _delay_ms(5); - LCD_IO_WriteReg(0x00D3); - DeviceCode = ILI9488_ReadRAM(); //dummy read - DeviceCode = ILI9488_ReadRAM(); - DeviceCode = ILI9488_ReadRAM(); - DeviceCode <<= 8; - DeviceCode |= ILI9488_ReadRAM(); + DeviceCode = tftio.GetID() & 0xFFFF; + // Chitu and others + if (DeviceCode == 0x8066) DeviceCode = 0x9488; if (DeviceCode == 0x9488) { LCD_IO_WriteReg(0x00E0); @@ -436,7 +414,7 @@ void tft_lvgl_init() { //spi_flash_read_test(); - TERN_(HAS_TOUCH_XPT2046, touch.init()); + touch.Init(); lv_init(); @@ -492,35 +470,14 @@ void tft_lvgl_init() { void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { #if ENABLED(TFT_LVGL_UI_SPI) uint16_t i, width, height; - uint16_t clr_temp; - uint8_t tbuf[(LCD_FULL_PIXEL_WIDTH) * 2]; - - SPI_TFT.spi_init(SPI_FULL_SPEED); width = area->x2 - area->x1 + 1; height = area->y2 - area->y1 + 1; - for (int j = 0; j < height; j++) { - SPI_TFT.SetCursor(0, 0); - SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1 + j, width, 1); - SPI_TFT.LCD_WriteRAM_Prepare(); - - for (i = 0; i < width * 2;) { - clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) - | ((uint16_t)color_p->ch.green << 5) - | ((uint16_t)color_p->ch.blue)); - - tbuf[i] = clr_temp >> 8; - tbuf[i + 1] = clr_temp; - i += 2; - color_p++; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(tbuf, width * 2, true); - SPI_TFT_CS_H; + SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height); + for (i = 0; i < height; i++) { + SPI_TFT.tftio.WriteSequence((uint16_t*)(color_p + width * i), width); } - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ W25QXX.init(SPI_QUARTER_SPEED); @@ -556,174 +513,23 @@ unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { return TICK_CYCLE * (lastTick <= curTick ? (curTick - lastTick) : (0xFFFFFFFF - lastTick + curTick)); } -#if ENABLED(TFT_LVGL_UI_SPI) +static bool get_point(int16_t *x, int16_t *y) { + bool is_touched = touch.getRawPoint(x, y); - #ifndef USE_XPT2046 - #define USE_XPT2046 1 - #define XPT2046_XY_SWAP 1 - #define XPT2046_X_INV 1 - #define XPT2046_Y_INV 0 - #endif - - #if USE_XPT2046 - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 201 - #define XPT2046_Y_MIN 164 - #define XPT2046_X_MAX 3919 - #define XPT2046_Y_MAX 3776 - #define XPT2046_AVG 4 - #define XPT2046_INV 1 - #endif - -#else - - #ifndef USE_XPT2046 - #define USE_XPT2046 1 - #ifndef XPT2046_XY_SWAP - #define XPT2046_XY_SWAP 1 - #endif - #ifndef XPT2046_X_INV - #define XPT2046_X_INV 0 - #endif - #ifndef XPT2046_Y_INV - #define XPT2046_Y_INV 1 - #endif - #endif - - #if USE_XPT2046 - #ifndef XPT2046_HOR_RES - #define XPT2046_HOR_RES 480 - #endif - #ifndef XPT2046_VER_RES - #define XPT2046_VER_RES 320 - #endif - #ifndef XPT2046_X_MIN - #define XPT2046_X_MIN 201 - #endif - #ifndef XPT2046_Y_MIN - #define XPT2046_Y_MIN 164 - #endif - #ifndef XPT2046_X_MAX - #define XPT2046_X_MAX 3919 - #endif - #ifndef XPT2046_Y_MAX - #define XPT2046_Y_MAX 3776 - #endif - #ifndef XPT2046_AVG - #define XPT2046_AVG 4 - #endif - #ifndef XPT2046_INV - #define XPT2046_INV 0 - #endif - #endif - -#endif - -static void xpt2046_corr(uint16_t *x, uint16_t *y) { - #if XPT2046_XY_SWAP - int16_t swap_tmp; - swap_tmp = *x; - *x = *y; - *y = swap_tmp; - #endif - if ((*x) > XPT2046_X_MIN) (*x) -= XPT2046_X_MIN; else (*x) = 0; - if ((*y) > XPT2046_Y_MIN) (*y) -= XPT2046_Y_MIN; else (*y) = 0; - (*x) = uint32_t(uint32_t(*x) * XPT2046_HOR_RES) / (XPT2046_X_MAX - XPT2046_X_MIN); - (*y) = uint32_t(uint32_t(*y) * XPT2046_VER_RES) / (XPT2046_Y_MAX - XPT2046_Y_MIN); - #if XPT2046_X_INV - (*x) = XPT2046_HOR_RES - (*x); - #endif - #if XPT2046_Y_INV - (*y) = XPT2046_VER_RES - (*y); - #endif -} - -#define times 4 -#define CHX 0x90 -#define CHY 0xD0 - -int SPI2_ReadWrite2Bytes(void) { - #define SPI_READ_WRITE_BYTE(B) TERN(TFT_LVGL_UI_SPI, SPI_TFT.spi_read_write_byte, W25QXX.spi_flash_read_write_byte)(B) - const uint16_t t1 = SPI_READ_WRITE_BYTE(0xFF), - t2 = SPI_READ_WRITE_BYTE(0xFF); - return (((t1 << 8) | t2) >> 3) & 0x0FFF; -} - -uint16_t x_addata[times], y_addata[times]; -void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { - uint16_t i, j, k; - - TERN(TFT_LVGL_UI_SPI, SPI_TFT.spi_init, W25QXX.init)(SPI_SPEED_6); - - for (i = 0; i < times; i++) { - #if ENABLED(TFT_LVGL_UI_SPI) - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI_TFT.spi_read_write_byte(CHX); - y_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI_TFT.spi_read_write_byte(CHY); - x_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - #else // #if HAS_TOUCH_XPT2046 - OUT_WRITE(TOUCH_CS_PIN, LOW); - W25QXX.spi_flash_read_write_byte(CHX); - y_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - - OUT_WRITE(TOUCH_CS_PIN, LOW); - W25QXX.spi_flash_read_write_byte(CHY); - x_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - #endif - - } - TERN(TFT_LVGL_UI_SPI,,W25QXX.init(SPI_QUARTER_SPEED)); - - for (i = 0; i < times; i++) - for (j = i + 1; j < times; j++) - if (x_addata[j] > x_addata[i]) { - k = x_addata[j]; - x_addata[j] = x_addata[i]; - x_addata[i] = k; - } - if (x_addata[times / 2 - 1] - x_addata[times / 2] > 50) { - *X_Addata = *Y_Addata = 0; - return; + if (is_touched) { + *x = int16_t((int32_t(*x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; + *y = int16_t((int32_t(*y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; } - *X_Addata = (x_addata[times / 2 - 1] + x_addata[times / 2]) / 2; + #if ENABLED(GRAPHICAL_TFT_ROTATE_180) + x = (LCD_FULL_PIXEL_WIDTH) - x; + y = (LCD_FULL_PIXEL_HEIGHT) - y; + #endif - for (i = 0; i < times; i++) - for (j = i + 1; j < times; j++) - if (y_addata[j] > y_addata[i]) { - k = y_addata[j]; - y_addata[j] = y_addata[i]; - y_addata[i] = k; - } - - if (y_addata[times / 2 - 1] - y_addata[times / 2] > 50) { - *X_Addata = *Y_Addata = 0; - return; - } - - *Y_Addata = (y_addata[times / 2 - 1] + y_addata[times / 2]) / 2; + return is_touched; } -#define ADC_VALID_OFFSET 10 - -uint8_t TOUCH_PressValid(uint16_t _usX, uint16_t _usY) { - if ( (_usX <= ADC_VALID_OFFSET) - || (_usY <= ADC_VALID_OFFSET) - || (_usX >= 4095 - ADC_VALID_OFFSET) - || (_usY >= 4095 - ADC_VALID_OFFSET) - ) return 0; - return 1; -} - -static lv_coord_t last_x = 0, last_y = 0; +static int16_t last_x = 0, last_y = 0; bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { uint32_t tmpTime, diffTime = 0; @@ -735,34 +541,24 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { //touchpad_get_xy(&last_x, &last_y); /*Save the pressed coordinates and the state*/ if (diffTime > 10) { - //use marlin touch code if enabled - #if HAS_TOUCH_XPT2046 - touch.getTouchPoint(reinterpret_cast(last_x), reinterpret_cast(last_y)); - #else - XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y); - #endif - if (TOUCH_PressValid(last_x, last_y)) { + if (get_point(&last_x, &last_y)) { data->state = LV_INDEV_STATE_PR; - /* Set the coordinates (if released use the last pressed coordinates) */ + // Set the coordinates (if released use the last-pressed coordinates) - // SERIAL_ECHOLNPAIR("antes X: ", last_x, ", y: ", last_y); - xpt2046_corr((uint16_t *)&last_x, (uint16_t *)&last_y); - // SERIAL_ECHOLNPAIR("X: ", last_x, ", y: ", last_y); data->point.x = last_x; data->point.y = last_y; - last_x = 0; - last_y = 0; + last_x = last_y = 0; } - else { + else data->state = LV_INDEV_STATE_REL; - } + touch_time1 = tmpTime; } - return false; /*Return `false` because we are not buffering and no more data to read*/ + return false; // Return `false` since no data is buffering or left to read } #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 6be67fc1a2..e4f0014417 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -164,7 +164,6 @@ #define HAS_LANG_SELECT_SCREEN 1 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - #define HAS_TOUCH_XPT2046 1 #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK @@ -183,6 +182,8 @@ #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_CS_PIN PD7 @@ -197,24 +198,10 @@ #define LCD_PIXEL_OFFSET_X 48 #define LCD_PIXEL_OFFSET_Y 48 - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 - - #define USE_XPT2046 1 - #define XPT2046_XY_SWAP 0 - #define XPT2046_X_INV 1 - #define XPT2046_Y_INV 0 - - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 140 - #define XPT2046_Y_MIN 200 - #define XPT2046_X_MAX 1900 - #define XPT2046_Y_MAX 1900 - #define XPT2046_AVG 4 - #define XPT2046_INV 0 + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 #elif ENABLED(TFT_480x320) #define TFT_RESET_PIN PF11 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 4633de40f2..3d36de8242 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -198,7 +198,6 @@ #define HAS_LANG_SELECT_SCREEN 0 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - #define HAS_TOUCH_XPT2046 1 #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK @@ -217,6 +216,8 @@ #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_CS_PIN PD7 @@ -231,24 +232,10 @@ #define LCD_PIXEL_OFFSET_X 48 #define LCD_PIXEL_OFFSET_Y 48 - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 - - #define USE_XPT2046 1 - #define XPT2046_XY_SWAP 0 - #define XPT2046_X_INV 1 - #define XPT2046_Y_INV 0 - - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 140 - #define XPT2046_Y_MIN 200 - #define XPT2046_X_MAX 1900 - #define XPT2046_Y_MAX 1900 - #define XPT2046_AVG 4 - #define XPT2046_INV 0 + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 1604064352..948663f6f0 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -177,6 +177,17 @@ #define LCD_BACKLIGHT_PIN PD13 + #define XPT2046_X_CALIBRATION 17880 + #define XPT2046_Y_CALIBRATION -12234 + #define XPT2046_X_OFFSET -45 + #define XPT2046_Y_OFFSET 349 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + #elif ENABLED(FSMC_GRAPHICAL_TFT) #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index be363e4537..feac729c73 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -261,17 +261,30 @@ #define BTN_EN2 PE11 #define BTN_ENC PE13 -#elif ENABLED(TFT_LITTLE_VGL_UI) + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - #define LCD_BACKLIGHT_PIN PD13 + #ifndef LCD_FULL_PIXEL_WIDTH + #define LCD_FULL_PIXEL_WIDTH 480 + #endif + #ifndef LCD_FULL_PIXEL_HEIGHT + #define LCD_FULL_PIXEL_HEIGHT 320 + #endif #endif From dc6e3d083ea0dfe787652b2c9ffb96bdb25cd908 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Fri, 14 Aug 2020 05:32:01 +0200 Subject: [PATCH 0085/1370] TFT: Restore ILI9341 colors and reversed logic (#19010) Followup to #18877, #18901, #18817 --- .../lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp | 5 ++++- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 205cafbccb..e42faf0255 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -366,7 +366,7 @@ static const uint16_t ili9328_init[] = { static const uint16_t ili9341_init[] = { ESC_REG(0x0010), ESC_DELAY(10), ESC_REG(0x0001), ESC_DELAY(200), - ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028), + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x0028, 0x00E8), ESC_REG(0x003A), 0x0055, ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F, ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF, @@ -658,6 +658,9 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u setWindow = setWindow_ili9328; break; case 0x9341: // ILI9341 + WRITE_ESC_SEQUENCE(ili9341_init); + setWindow = setWindow_st7789v; + break; case 0x8066: // Anycubic / TronXY TFTs (480x320) WRITE_ESC_SEQUENCE(ili9488_init); setWindow = setWindow_st7789v; diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 2f5dbd0105..490fb617d1 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -130,6 +130,12 @@ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 +#define FSMC_UPSCALE 2 +#define LCD_FULL_PIXEL_WIDTH 320 +#define LCD_FULL_PIXEL_HEIGHT 240 +#define LCD_PIXEL_OFFSET_X 32 +#define LCD_PIXEL_OFFSET_Y 32 + /** * Note: Alfawise U20/U30 boards DON'T use SPI2, as the hardware designer * mixed up MOSI and MISO pins. SPI is managed in SW, and needs pins From 28d6dc38af2667f850189610ba2496d1f0cbaea0 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Fri, 14 Aug 2020 05:37:57 +0200 Subject: [PATCH 0086/1370] Fix 'sync_plan_position' call (#19016) --- Marlin/src/module/stepper/indirection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 1fd1a72e7e..e9705cd3c3 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -850,7 +850,7 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define ENABLE_AXIS_Z() do{ ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); }while(0) #ifdef Z_AFTER_DEACTIVATE - #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; planner.sync_plan_position(); }while(0) + #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; sync_plan_position(); }while(0) #else #define Z_RESET() #endif From 1801eb6393452899aa614a2229e5c88c539a1d35 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Aug 2020 00:47:09 -0500 Subject: [PATCH 0087/1370] config-labels.py needs py3 --- buildroot/share/scripts/config-labels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/share/scripts/config-labels.py b/buildroot/share/scripts/config-labels.py index 8effb54eed..267aa2d273 100755 --- a/buildroot/share/scripts/config-labels.py +++ b/buildroot/share/scripts/config-labels.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # for python3.5 or higher #----------------------------------- From 77ab354a5a957ea75c2d433fc17ccdec6bddaddb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Aug 2020 21:17:48 -0500 Subject: [PATCH 0088/1370] Fix touch test --- Marlin/src/lcd/touch/xpt2046.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/touch/xpt2046.cpp b/Marlin/src/lcd/touch/xpt2046.cpp index 1fed5b78f0..4407d945d3 100644 --- a/Marlin/src/lcd/touch/xpt2046.cpp +++ b/Marlin/src/lcd/touch/xpt2046.cpp @@ -133,12 +133,14 @@ uint8_t XPT2046::read_buttons() { // Touch within the button area simulates an encoder button if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) return WITHIN(x, 14, 77) ? EN_D - : WITHIN(x, 90, 153) ? EN_A - : WITHIN(x, 166, 229) ? EN_B - : WITHIN(x, 242, 305) ? EN_C - : 0; + : WITHIN(x, 90, 153) ? EN_A + : WITHIN(x, 166, 229) ? EN_B + : WITHIN(x, 242, 305) ? EN_C + : 0; - if (x > TOUCH_SENSOR_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0; + if ( !WITHIN(x, SCREEN_START_LEFT, SCREEN_START_LEFT + SCREEN_WIDTH) + || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT) + ) return 0; // Column and row above BUTTON_AREA_TOP int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH), @@ -161,6 +163,7 @@ bool XPT2046::isTouched() { } #if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include static void touch_spi_init(uint8_t spiRate) { From eee101b9dd35f3bbfee7d941e8b6f82baba408d9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Aug 2020 21:30:12 -0500 Subject: [PATCH 0089/1370] Clean up M80/M81, DWIN --- Marlin/src/gcode/control/M80_M81.cpp | 14 +++++--------- Marlin/src/lcd/dwin/dwin.cpp | 8 +++++--- Marlin/src/lcd/fontutils.h | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 0dede7ea64..3498bfbc39 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -22,15 +22,11 @@ #include "../gcode.h" #include "../../module/temperature.h" -#include "../../module/stepper.h" -#include "../../module/printcounter.h" // for print_job_timer +#include "../../module/printcounter.h" // for print_job_timer +#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM_P #include "../../inc/MarlinConfig.h" -#if HAS_LCD_MENU - #include "../../lcd/ultralcd.h" -#endif - #if HAS_SUICIDE #include "../../MarlinCore.h" #endif @@ -39,6 +35,8 @@ #if ENABLED(AUTO_POWER_CONTROL) #include "../../feature/power.h" + #else + void restore_stepper_drivers(); #endif // Could be moved to a feature, but this is all the data @@ -108,7 +106,5 @@ void GcodeSuite::M81() { PSU_OFF(); #endif - #if HAS_LCD_MENU - LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF ".")); - #endif + LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF ".")); } diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 1aa2656dcf..8cd7af1574 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -935,7 +935,8 @@ void Goto_PrintProcess(void) { // Copy into filebuf string before entry char * const name = card.longest_filename(); - DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2, 60, name); + const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2; + DWIN_Draw_String(false, false, font8x16, White, Background_black, npos, 60, name); DWIN_ICON_Show(ICON, ICON_PrintTime, 17, 193); DWIN_ICON_Show(ICON, ICON_RemainTime, 150, 191); @@ -1523,7 +1524,7 @@ inline void make_name_without_ext(char *dst, char *src, int maxlen=MENU_CHAR_LIM if (!card.flag.filenameIsDir) while (pos && src[pos] != '.') pos--; // find last '.' (stop at 0) - int len = pos; // nul or '.' + size_t len = pos; // nul or '.' if (len > maxlen) { // Keep the name short pos = len = maxlen; // move nul down dst[--pos] = '.'; // insert dots @@ -3436,7 +3437,8 @@ void EachMomentUpdate(void) { Popup_Window_Resume(); draw_first_option(false); char * const name = card.longest_filename(); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2, 252, name); + const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, npos, 252, name); DWIN_UpdateLCD(); break; } diff --git a/Marlin/src/lcd/fontutils.h b/Marlin/src/lcd/fontutils.h index 8839e36a2b..74c4a87fb9 100644 --- a/Marlin/src/lcd/fontutils.h +++ b/Marlin/src/lcd/fontutils.h @@ -38,6 +38,6 @@ int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, /* Get the character, decoding multibyte UTF8 characters and returning a pointer to the start of the next UTF8 character */ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval); -/* Returns lenght of string in CHARACTERS, NOT BYTES */ +/* Returns length of string in CHARACTERS, NOT BYTES */ uint8_t utf8_strlen(const char *pstart); uint8_t utf8_strlen_P(PGM_P pstart); From 1327eaa83b03f0356d7bfc25c1720813c27c3eee Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Aug 2020 00:16:12 -0500 Subject: [PATCH 0090/1370] Do runout.reset after EEPROM read --- Marlin/src/module/settings.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index f1ab0fca69..c84bbb44ae 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -626,7 +626,12 @@ void MarlinSettings::postprocess() { #endif EEPROM_WRITE(home_offset); #endif + } + // + // Hotend Offsets, if any + // + { #if HAS_HOTEND_OFFSET // Skip hotend 0 which must be 0 LOOP_S_L_N(e, 1, HOTENDS) @@ -1521,6 +1526,8 @@ void MarlinSettings::postprocess() { _FIELD_TEST(runout_sensor_enabled); EEPROM_READ(runout_sensor_enabled); + TERN_(HAS_FILAMENT_SENSOR, if (runout.enabled) runout.reset()); + float runout_distance_mm; EEPROM_READ(runout_distance_mm); #if HAS_FILAMENT_RUNOUT_DISTANCE From 80480ae9197f529cc5eee51236b83ace39f10d12 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Aug 2020 00:32:59 -0500 Subject: [PATCH 0091/1370] M80 followup --- Marlin/src/gcode/control/M80_M81.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 3498bfbc39..6302bb5c67 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -21,8 +21,10 @@ */ #include "../gcode.h" + #include "../../module/temperature.h" -#include "../../module/printcounter.h" // for print_job_timer +#include "../../module/planner.h" // for planner.finish_and_disable +#include "../../module/printcounter.h" // for print_job_timer.stop #include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM_P #include "../../inc/MarlinConfig.h" From 492f49c06afcdf949d7d0d725d77d978c9e30550 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Aug 2020 06:26:18 -0500 Subject: [PATCH 0092/1370] Unhide /src folders in Sublime --- buildroot/share/sublime/MarlinFirmware.sublime-project | 1 - 1 file changed, 1 deletion(-) diff --git a/buildroot/share/sublime/MarlinFirmware.sublime-project b/buildroot/share/sublime/MarlinFirmware.sublime-project index e437369ec2..9b5234f7a1 100644 --- a/buildroot/share/sublime/MarlinFirmware.sublime-project +++ b/buildroot/share/sublime/MarlinFirmware.sublime-project @@ -8,7 +8,6 @@ "MarlinFirmware/lib", "Marlin/lib", "datatmp", - "Marlin/*/src", ".vscode" ], "binary_file_patterns": From a99c844296045bb75841217e625016674600b6b2 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 15 Aug 2020 01:25:45 +1200 Subject: [PATCH 0093/1370] Add option to arrange Neopixel sets in series (#18992) --- Marlin/Configuration.h | 1 + Marlin/src/feature/leds/neopixel.cpp | 2 +- Marlin/src/feature/leds/neopixel.h | 27 ++++++++++++++++++++------- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 3b6155f969..a4b6c51ae5 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2354,6 +2354,7 @@ #define NEOPIXEL_PIN 4 // LED driving pin //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE //#define NEOPIXEL2_PIN 5 + #define NEOPIXEL2_INSERIES false // The default behaviour is 'false' with neopixel2 in parallel #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 neopixel strips are used #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 5d80cfe5d2..520d4d63b2 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -38,7 +38,7 @@ Marlin_NeoPixel neo; int8_t Marlin_NeoPixel::neoindex; Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800) - #if MULTIPLE_NEOPIXEL_TYPES + #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) , Marlin_NeoPixel::adaneo2(NEOPIXEL_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE + NEO_KHZ800) #endif ; diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 17057498d4..0155785e9a 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -61,7 +61,7 @@ class Marlin_NeoPixel { private: static Adafruit_NeoPixel adaneo1 - #if MULTIPLE_NEOPIXEL_TYPES + #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) , adaneo2 #endif ; @@ -82,23 +82,36 @@ public: static inline void begin() { adaneo1.begin(); - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.begin()); + #if ENABLED(NEOPIXEL2_INSERIES) + adaneo2.begin(); + #else + TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.begin()); + #endif } static inline void set_pixel_color(const uint16_t n, const uint32_t c) { - adaneo1.setPixelColor(n, c); - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setPixelColor(n, c)); + #if ENABLED(NEOPIXEL2_INSERIES) + if (n >= NEOPIXEL_PIXELS) adaneo2.setPixelColor(n - (NEOPIXEL_PIXELS), c); + else adaneo1.setPixelColor(n, c); + #else + adaneo1.setPixelColor(n, c); + TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setPixelColor(n, c)); + #endif } static inline void set_brightness(const uint8_t b) { adaneo1.setBrightness(b); - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setBrightness(b)); + #if ENABLED(NEOPIXEL2_INSERIES) + adaneo2.setBrightness(b); + #else + TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setBrightness(b)); + #endif } static inline void show() { adaneo1.show(); #if PIN_EXISTS(NEOPIXEL2) - #if MULTIPLE_NEOPIXEL_TYPES + #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) adaneo2.show(); #else adaneo1.setPin(NEOPIXEL2_PIN); @@ -113,7 +126,7 @@ public: #endif // Accessors - static inline uint16_t pixels() { return adaneo1.numPixels(); } + static inline uint16_t pixels() { TERN(NEOPIXEL2_INSERIES, return adaneo1.numPixels() * 2, return adaneo1.numPixels()); } static inline uint8_t brightness() { return adaneo1.getBrightness(); } static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { return adaneo1.Color(r, g, b, w); From c9ddbaa2c0bbd83df213043b17216e940da51dca Mon Sep 17 00:00:00 2001 From: Tommy Hartmann Date: Fri, 14 Aug 2020 15:35:53 +0200 Subject: [PATCH 0094/1370] ENDER2_STOCKDISPLAY for BTT SKR 1.4 (and Turbo) (#19002) --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index f467ba58cb..83543703e5 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -250,6 +250,30 @@ #define LCD_PINS_ENABLE P1_23 #define LCD_PINS_D4 P1_21 + #elif ENABLED(ENDER2_STOCKDISPLAY) + + /** Creality Ender-2 display pinout + * _____ + * 5V | 1 2 | GND + * (MOSI) 1.23 | 3 4 | 1.22 (LCD_RS) + * (LCD_A0) 1.21 | 5 6 | 1.20 (BTN_EN2) + * RESET 1.19 | 7 8 | 1.18 (BTN_EN1) + * (BTN_ENC) 0.28 | 9 10| 1.30 (SCK) + * ----- + * EXP1 + */ + + #define BTN_EN1 P1_18 + #define BTN_EN2 P1_20 + #define BTN_ENC P0_28 + + #define DOGLCD_CS P1_22 + #define DOGLCD_A0 P1_21 + #define DOGLCD_SCK P1_30 + #define DOGLCD_MOSI P1_23 + #define FORCE_SOFT_SPI + #define LCD_BACKLIGHT_PIN -1 + #else #define BTN_ENC P0_28 // (58) open-drain From 8258a76c9b119fe86768c1c0bfacd92f9d986533 Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Fri, 14 Aug 2020 20:38:00 +0700 Subject: [PATCH 0095/1370] Wait for hotend temp before Resume move (#19009) --- Marlin/src/feature/pause.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 77f352c399..2cb9c2df71 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -582,6 +582,9 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_RESUME)); + // Check Temperature before moving hotend + ensure_safe_temperature(); + // Retract to prevent oozing unscaled_e_move(-(PAUSE_PARK_RETRACT_LENGTH), feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); @@ -594,8 +597,6 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Unretract unscaled_e_move(PAUSE_PARK_RETRACT_LENGTH, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); - ensure_safe_temperature(); - // Intelligent resuming #if ENABLED(FWRETRACT) // If retracted before goto pause From 16f2f2bce79505d0b8e605f542d7c4b859e2083a Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Fri, 14 Aug 2020 15:41:44 +0200 Subject: [PATCH 0096/1370] Let laser/spindle use free AVR servo timers (#19011) --- Marlin/src/HAL/AVR/ServoTimers.h | 8 +++++--- Marlin/src/HAL/AVR/inc/SanityCheck.h | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Marlin/src/HAL/AVR/ServoTimers.h b/Marlin/src/HAL/AVR/ServoTimers.h index 564714df6e..598db62578 100644 --- a/Marlin/src/HAL/AVR/ServoTimers.h +++ b/Marlin/src/HAL/AVR/ServoTimers.h @@ -60,9 +60,11 @@ #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) //#define _useTimer1 #define _useTimer3 - #define _useTimer4 - #if !HAS_MOTOR_CURRENT_PWM - #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. + #if NUM_SERVOS > SERVOS_PER_TIMER + #define _useTimer4 + #if !HAS_MOTOR_CURRENT_PWM && SERVOS > 2 * SERVOS_PER_TIMER + #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. + #endif #endif #elif defined(__AVR_ATmega32U4__) #define _useTimer3 diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h index e55e45b73b..731cf92865 100644 --- a/Marlin/src/HAL/AVR/inc/SanityCheck.h +++ b/Marlin/src/HAL/AVR/inc/SanityCheck.h @@ -36,9 +36,10 @@ * Sanity checks for Spindle / Laser PWM */ #if ENABLED(SPINDLE_LASER_PWM) + #include "../ServoTimers.h" // Needed to check timer availability (_useTimer3) #if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13) #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt." - #elif NUM_SERVOS > 0 && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) + #elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system." #endif #elif defined(SPINDLE_LASER_FREQUENCY) From f9f514a46c8b4ea1ee06844eaab0739231056f96 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Aug 2020 08:45:48 -0500 Subject: [PATCH 0097/1370] Fix ExtUI base methods --- Marlin/src/lcd/extui/ui_api.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index c192754495..3df9c17f6b 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -548,7 +548,7 @@ namespace ExtUI { void setAxisSteps_per_mm(const float value, const extruder_t extruder) { UNUSED_E(extruder); - planner.settings.axis_steps_per_mm[E_AXIS_N(axis - E0)] = value; + planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)] = value; } feedRate_t getAxisMaxFeedrate_mm_s(const axis_t axis) { @@ -557,7 +557,7 @@ namespace ExtUI { feedRate_t getAxisMaxFeedrate_mm_s(const extruder_t extruder) { UNUSED_E(extruder); - return planner.settings.max_feedrate_mm_s[E_AXIS_N(axis - E0)]; + return planner.settings.max_feedrate_mm_s[E_AXIS_N(extruder - E0)]; } void setAxisMaxFeedrate_mm_s(const feedRate_t value, const axis_t axis) { From 73d1a98ce6b3525d1bd69c36767f0584bfbea8ec Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 15 Aug 2020 21:38:13 -0300 Subject: [PATCH 0098/1370] Update build script for PIO 4.4 (#19034) --- .github/workflows/test-builds.yml | 2 +- .../PlatformIO/scripts/common-dependencies.py | 24 ++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index fdb81fbdc9..1467f1b33f 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -106,7 +106,7 @@ jobs: - name: Install PlatformIO run: | - pip install -U https://github.com/platformio/platformio-core/archive/develop.zip + pip install -U https://github.com/platformio/platformio-core/archive/master.zip platformio update - name: Check out the PR diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 6c1b571bf1..d5f6fc1958 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -9,12 +9,24 @@ try: import configparser except ImportError: import ConfigParser as configparser -from platformio.managers.package import PackageManager +try: + # PIO < 4.4 + from platformio.managers.package import PackageManager +except ImportError: + # PIO >= 4.4 + from platformio.package.meta import PackageSpec as PackageManager Import("env") FEATURE_CONFIG = {} +def parse_pkg_uri(spec): + if PackageManager.__name__ == 'PackageSpec': + return PackageManager(spec).name + else: + name, _, _ = PackageManager.parse_pkg_uri(spec) + return name + def add_to_feat_cnf(feature, flines): feat = FEATURE_CONFIG[feature] atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') @@ -56,7 +68,7 @@ def get_all_known_libs(): if not 'lib_deps' in feat: continue for dep in feat['lib_deps']: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) known_libs.append(name) return known_libs @@ -64,7 +76,7 @@ def get_all_env_libs(): env_libs = [] lib_deps = env.GetProjectOption('lib_deps') for dep in lib_deps: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) env_libs.append(name) return env_libs @@ -96,20 +108,20 @@ def apply_features_config(): # feat to add deps_to_add = {} for dep in feat['lib_deps']: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) deps_to_add[name] = dep # Does the env already have the dependency? deps = env.GetProjectOption('lib_deps') for dep in deps: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] # Are there any libraries that should be ignored? lib_ignore = env.GetProjectOption('lib_ignore') for dep in deps: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] From 8320c435892a9e2dc7a55d30e3b7c679ba605b82 Mon Sep 17 00:00:00 2001 From: Julius Mumme Date: Sun, 16 Aug 2020 05:50:28 +0200 Subject: [PATCH 0099/1370] Fix IS_PROBE_PIN macro (#19024) --- Marlin/src/inc/Conditionals_post.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 6243d82aa8..29ab2cfc29 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1622,7 +1622,7 @@ // // Is an endstop plug used for extra Z endstops or the probe? -#define IS_PROBE_PIN(A,M) (HAS_CUSTOM_PROBE_PIN && Z_MIN_PROBE_PIN == P) +#define IS_PROBE_PIN(A,M) (HAS_CUSTOM_PROBE_PIN && Z_MIN_PROBE_PIN == A##_##M##_PIN) #define IS_X2_ENDSTOP(A,M) (ENABLED(X_DUAL_ENDSTOPS) && X2_USE_ENDSTOP == _##A##M##_) #define IS_Y2_ENDSTOP(A,M) (ENABLED(Y_DUAL_ENDSTOPS) && Y2_USE_ENDSTOP == _##A##M##_) #define IS_Z2_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && Z2_USE_ENDSTOP == _##A##M##_) From 58975fc8b54234eb093ad6b6f85c8ecc3201a04f Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 16 Aug 2020 15:57:07 +1200 Subject: [PATCH 0100/1370] Checks for CR10_STOCKDISPLAY with Creality v4 (#19019) --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index ed281eb00c..c36b4561b0 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -134,6 +134,10 @@ #define ONBOARD_SD_CS_PIN PA4 // SDSS #define SDIO_SUPPORT +#if ENABLED(CR10_STOCKDISPLAY) && NONE(RET6_12864_LCD, VET6_12864_LCD) + #error "Define RET6_12864_LCD or VET6_12864_LCD to select pins for CR10_STOCKDISPLAY with the Creality V4 controller." +#endif + #if ENABLED(RET6_12864_LCD) /* RET6 12864 LCD */ @@ -146,6 +150,7 @@ #define BTN_EN2 PB14 #define BEEPER_PIN PC6 + #elif ENABLED(VET6_12864_LCD) /* VET6 12864 LCD */ From 8075eafe91e5eff3922a076fbd52a8034ce320ba Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Aug 2020 01:49:38 -0500 Subject: [PATCH 0101/1370] Creality DWIN simple beeper --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index c36b4561b0..5aab757129 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -170,7 +170,10 @@ #define BTN_EN2 PB12 //#define LCD_LED_PIN PB2 - #define BEEPER_PIN PB13 + #ifndef BEEPER_PIN + #define BEEPER_PIN PB13 + #undef SPEAKER + #endif #elif ENABLED(DWIN_VET6_CREALITY_LCD) From 7a750156ef37de5ab1c185e5fb553c3640621873 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Aug 2020 00:49:23 -0500 Subject: [PATCH 0102/1370] Creality DWIN cleanup --- Marlin/src/lcd/dwin/dwin.cpp | 137 +++++++++++++++++------------------ Marlin/src/lcd/dwin/dwin.h | 4 +- 2 files changed, 70 insertions(+), 71 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 8cd7af1574..e527c8dba0 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -65,8 +65,6 @@ #include "../../module/probe.h" #endif -#include "../../libs/buzzer.h" - #ifndef MACHINE_SIZE #define MACHINE_SIZE "220x220x250" #endif @@ -1065,36 +1063,40 @@ void HMI_Move_Z(void) { } } -void HMI_Move_E(void) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Move_E_scale += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Move_E_scale -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - checkkey = AxisMove; - EncoderRate.encoderRateEnabled = 0; - last_E_scale = HMI_ValueStruct.Move_E_scale; - show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - if (!planner.is_full()) { - planner.synchronize(); // Wait for planner moves to finish! - planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); +#if EXTRUDERS + + void HMI_Move_E(void) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (encoder_diffState == ENCODER_DIFF_CW) { + HMI_ValueStruct.Move_E_scale += EncoderRate.encoderMoveValue; } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + HMI_ValueStruct.Move_E_scale -= EncoderRate.encoderMoveValue; + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + checkkey = AxisMove; + EncoderRate.encoderRateEnabled = 0; + last_E_scale = HMI_ValueStruct.Move_E_scale; + show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + if (!planner.is_full()) { + planner.synchronize(); // Wait for planner moves to finish! + planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); + } + DWIN_UpdateLCD(); + return; + } + if ((HMI_ValueStruct.Move_E_scale - last_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) + HMI_ValueStruct.Move_E_scale = last_E_scale + (EXTRUDE_MAXLENGTH) * MINUNITMULT; + else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) + HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; + current_position.e = HMI_ValueStruct.Move_E_scale / 10; + show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); DWIN_UpdateLCD(); - return; } - if ((HMI_ValueStruct.Move_E_scale - last_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scale = last_E_scale + (EXTRUDE_MAXLENGTH) * MINUNITMULT; - else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; - current_position.e = HMI_ValueStruct.Move_E_scale / 10; - show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - DWIN_UpdateLCD(); } -} + +#endif void HMI_Zoffset(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); @@ -2096,7 +2098,9 @@ inline void Draw_Move_Menu() { DWIN_Frame_AreaCopy(1, 58, 118, 271 - 165, 479 - 347, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 109, 118, 271 - 114, 479 - 347, LBLX, MBASE(2)); DWIN_Frame_AreaCopy(1, 160, 118, 271 - 62, 479 - 347, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 212, 118, 271 - 18, 479 - 348, LBLX, MBASE(4)); + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 212, 118, 271 - 18, 479 - 348, LBLX, MBASE(4)); + #endif } else { #ifdef USE_STRING_HEADINGS @@ -2107,7 +2111,9 @@ inline void Draw_Move_Menu() { draw_move_en(MBASE(1)); say_x(33 + 3, MBASE(1)); // "Move X" draw_move_en(MBASE(2)); say_y(33 + 3, MBASE(2)); // "Move Y" draw_move_en(MBASE(3)); say_z(33 + 3, MBASE(3)); // "Move Z" - DWIN_Frame_AreaCopy(1, 123, 192, 271 - 95, 479 - 277, LBLX, MBASE(4)); // "Extruder" + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 123, 192, 271 - 95, 479 - 277, LBLX, MBASE(4)); // "Extruder" + #endif } Draw_Back_First(select_axis.now == 0); @@ -2116,6 +2122,18 @@ inline void Draw_Move_Menu() { LOOP_L_N(i, MROWS) Draw_Menu_Line(i + 1, ICON_MoveX + i); } +#include "../../libs/buzzer.h" + +void HMI_AudioFeedback(const bool success=true) { + if (success) { + buzzer.tone(100, 659); + buzzer.tone(10, 0); + buzzer.tone(100, 698); + } + else + buzzer.tone(40, 440); +} + /* Prepare */ void HMI_Prepare(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); @@ -2202,8 +2220,7 @@ void HMI_Prepare(void) { #else // Apply workspace offset, making the current position 0,0,0 queue.inject_P(PSTR("G92 X0 Y0 Z0")); - buzzer.tone(100, 659); - buzzer.tone(100, 698); + HMI_AudioFeedback(); #endif break; case 5: // PLA preheat @@ -2347,27 +2364,17 @@ void HMI_Control(void) { select_motion.reset(); Draw_Motion_Menu(); break; - case 3: // write EEPROM - if (settings.save()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else - buzzer.tone(20, 440); - break; - case 4: // read EEPROM - if (settings.load()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else {buzzer.tone(20, 440);} - break; + case 3: { // write EEPROM + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + case 4: { // read EEPROM + const bool success = settings.load(); + HMI_AudioFeedback(success); + } break; case 5: // resume EEPROM settings.reset(); - #if HAS_BUZZER - buzzer.tone(100, 659); - buzzer.tone(100, 698); - #endif + HMI_AudioFeedback(); break; case 6: // info checkkey = Info; @@ -3006,14 +3013,10 @@ void HMI_PLAPreheatSetting(void) { EncoderRate.encoderRateEnabled = 1; break; #endif - case 4: // save PLA configuration - if (settings.save()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else - buzzer.tone(20, 440); - break; + case 4: { // save PLA configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; default: break; } } @@ -3064,14 +3067,10 @@ void HMI_ABSPreheatSetting(void) { EncoderRate.encoderRateEnabled = 1; break; #endif - case 4: // save PLA configuration - if (settings.save()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else - buzzer.tone(20, 440); - break; + case 4: { // save ABS configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; default: break; } @@ -3496,11 +3495,11 @@ void DWIN_HandleScreen(void) { case Move_X: HMI_Move_X(); break; case Move_Y: HMI_Move_Y(); break; case Move_Z: HMI_Move_Z(); break; - case Extruder: HMI_Move_E(); break; - case Homeoffset: HMI_Zoffset(); break; #if HAS_HOTEND + case Extruder: HMI_Move_E(); break; case ETemp: HMI_ETemp(); break; #endif + case Homeoffset: HMI_Zoffset(); break; #if HAS_HEATED_BED case BedTemp: HMI_BedTemp(); break; #endif diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/dwin.h index 2d24d2504e..cddc582fc2 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/dwin.h @@ -68,11 +68,11 @@ enum processID { Move_X, Move_Y, Move_Z, - Extruder, - Homeoffset, #if HAS_HOTEND + Extruder, ETemp, #endif + Homeoffset, #if HAS_HEATED_BED BedTemp, #endif From acc90ad09fc0ddad0adb44cfba834c68f52069dc Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 19 Aug 2020 09:49:46 +0200 Subject: [PATCH 0103/1370] Fix PSU on for PID autotune (#19066) --- Marlin/src/feature/power.cpp | 5 ++--- Marlin/src/module/temperature.cpp | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 74850122c2..5be554e5e4 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -59,7 +59,6 @@ bool Power::is_power_needed() { // If any of the drivers or the bed are enabled... if (X_ENABLE_READ() == X_ENABLE_ON || Y_ENABLE_READ() == Y_ENABLE_ON || Z_ENABLE_READ() == Z_ENABLE_ON - || TERN0(HAS_HEATED_BED, thermalManager.temp_bed.soft_pwm_amount > 0) #if HAS_X2_ENABLE || X2_ENABLE_READ() == X_ENABLE_ON #endif @@ -75,8 +74,8 @@ bool Power::is_power_needed() { #endif ) return true; - HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0) return true; - if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0)) return true; + HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0 || thermalManager.temp_hotend[e].soft_pwm_amount > 0) return true; + if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0 || thermalManager.temp_bed.soft_pwm_amount > 0)) return true; #if HAS_HOTEND && AUTO_POWER_E_TEMP HOTEND_LOOP() if (thermalManager.degHotend(e) >= AUTO_POWER_E_TEMP) return true; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1dc480a927..a217fc9ab8 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -444,6 +444,7 @@ volatile bool Temperature::raw_temps_ready = false; LEDColor color = ONHEATINGSTART(); #endif + TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = false); // PID Tuning loop From 349bddc652d7b6986c9613152de52da5bb58fb5a Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Wed, 19 Aug 2020 10:58:41 +0300 Subject: [PATCH 0104/1370] "SD init fail" status error (#19064) --- Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/sd/cardreader.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 9f6178ae50..3791a4ad18 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -48,6 +48,7 @@ namespace Language_en { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media Inserted"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media Removed"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Waiting for media"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD Init Fail"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Media read error"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB device removed"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB start failed"); diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 864552516b..3aa7156e7b 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -376,8 +376,13 @@ void CardReader::mount() { flag.mounted = true; SERIAL_ECHO_MSG(STR_SD_CARD_OK); } - cdroot(); + if (flag.mounted) + cdroot(); + else { + spiInit(SPI_SPEED); // Return to base SPI speed + ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); + } ui.refresh(); } From 5a7979b435d82d16eb946152a1af67e28caa9076 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 19 Aug 2020 09:59:37 +0200 Subject: [PATCH 0105/1370] Fix __ARM__ / __arm__ typo (#19063) --- Marlin/src/module/stepper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index c9d87486f8..e5f65a3cdd 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1264,7 +1264,7 @@ void Stepper::set_directions() { } FORCE_INLINE int32_t Stepper::_eval_bezier_curve(const uint32_t curr_step) { - #if defined(__ARM__) || defined(__thumb__) + #if defined(__arm__) || defined(__thumb__) // For ARM Cortex M3/M4 CPUs, we have the optimized assembler version, that takes 43 cycles to execute uint32_t flo = 0; From 16c1e8049157fd1b824529759108d567984b89a7 Mon Sep 17 00:00:00 2001 From: Steven Haigh Date: Thu, 20 Aug 2020 09:58:18 +1000 Subject: [PATCH 0106/1370] Default Filament Runout Sensor enabled state (#19013) --- Marlin/Configuration.h | 9 +++++---- Marlin/src/feature/runout.cpp | 8 -------- Marlin/src/feature/runout.h | 35 ++++++++++++++++++++++++---------- Marlin/src/module/settings.cpp | 21 +++++++++++--------- 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index a4b6c51ae5..24d7c46a68 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1178,10 +1178,11 @@ */ //#define FILAMENT_RUNOUT_SENSOR #if ENABLED(FILAMENT_RUNOUT_SENSOR) - #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. - #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. - #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. - //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500. + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. // Set one or more commands to execute on filament runout. // (After 'M412 H' Marlin will ask the host to handle the process.) diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 0b5c0ebc2e..71f31f2145 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -44,14 +44,6 @@ bool FilamentMonitorBase::enabled = true, #include "../module/tool_change.h" #endif -/** - * Called by FilamentSensorSwitch::run when filament is detected. - * Called by FilamentSensorEncoder::block_completed when motion is detected. - */ -void FilamentSensorBase::filament_present(const uint8_t extruder) { - runout.filament_present(extruder); // calls response.filament_present(extruder) -} - #if HAS_FILAMENT_RUNOUT_DISTANCE float RunoutResponseDelayed::runout_distance_mm = FILAMENT_RUNOUT_DISTANCE_MM; volatile float RunoutResponseDelayed::runout_mm_countdown[EXTRUDERS]; diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 450ae1830a..a7f8366849 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -48,6 +48,24 @@ void event_filament_runout(); +template +class TFilamentMonitor; +class FilamentSensorEncoder; +class FilamentSensorSwitch; +class RunoutResponseDelayed; +class RunoutResponseDebounced; + +/********************************* TEMPLATE SPECIALIZATION *********************************/ + +typedef TFilamentMonitor< + TERN(HAS_FILAMENT_RUNOUT_DISTANCE, RunoutResponseDelayed, RunoutResponseDebounced), + TERN(FILAMENT_MOTION_SENSOR, FilamentSensorEncoder, FilamentSensorSwitch) + > FilamentMonitor; + +extern FilamentMonitor runout; + +/*******************************************************************************************/ + class FilamentMonitorBase { public: static bool enabled, filament_ran_out; @@ -121,7 +139,13 @@ class TFilamentMonitor : public FilamentMonitorBase { class FilamentSensorBase { protected: - static void filament_present(const uint8_t extruder); + /** + * Called by FilamentSensorSwitch::run when filament is detected. + * Called by FilamentSensorEncoder::block_completed when motion is detected. + */ + static inline void filament_present(const uint8_t extruder) { + runout.filament_present(extruder); // ...which calls response.filament_present(extruder) + } public: static inline void setup() { @@ -311,12 +335,3 @@ class FilamentSensorBase { }; #endif // !HAS_FILAMENT_RUNOUT_DISTANCE - -/********************************* TEMPLATE SPECIALIZATION *********************************/ - -typedef TFilamentMonitor< - TERN(HAS_FILAMENT_RUNOUT_DISTANCE, RunoutResponseDelayed, RunoutResponseDebounced), - TERN(FILAMENT_MOTION_SENSOR, FilamentSensorEncoder, FilamentSensorSwitch) - > FilamentMonitor; - -extern FilamentMonitor runout; diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c84bbb44ae..29b12e5caf 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -106,6 +106,9 @@ #if HAS_FILAMENT_SENSOR #include "../feature/runout.h" + #ifndef FIL_RUNOUT_ENABLED_DEFAULT + #define FIL_RUNOUT_ENABLED_DEFAULT true + #endif #endif #if ENABLED(EXTRA_LIN_ADVANCE_K) @@ -646,15 +649,16 @@ void MarlinSettings::postprocess() { #if HAS_FILAMENT_SENSOR const bool &runout_sensor_enabled = runout.enabled; #else - constexpr bool runout_sensor_enabled = true; + constexpr int8_t runout_sensor_enabled = -1; #endif + _FIELD_TEST(runout_sensor_enabled); + EEPROM_WRITE(runout_sensor_enabled); + #if HAS_FILAMENT_RUNOUT_DISTANCE const float &runout_distance_mm = runout.runout_distance(); #else constexpr float runout_distance_mm = 0; #endif - _FIELD_TEST(runout_sensor_enabled); - EEPROM_WRITE(runout_sensor_enabled); EEPROM_WRITE(runout_distance_mm); } @@ -1518,13 +1522,12 @@ void MarlinSettings::postprocess() { // Filament Runout Sensor // { - #if HAS_FILAMENT_SENSOR - const bool &runout_sensor_enabled = runout.enabled; - #else - bool runout_sensor_enabled; - #endif + int8_t runout_sensor_enabled; _FIELD_TEST(runout_sensor_enabled); EEPROM_READ(runout_sensor_enabled); + #if HAS_FILAMENT_SENSOR + runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; + #endif TERN_(HAS_FILAMENT_SENSOR, if (runout.enabled) runout.reset()); @@ -2476,7 +2479,7 @@ void MarlinSettings::reset() { // #if HAS_FILAMENT_SENSOR - runout.enabled = true; + runout.enabled = FIL_RUNOUT_ENABLED_DEFAULT; runout.reset(); TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, runout.set_runout_distance(FILAMENT_RUNOUT_DISTANCE_MM)); #endif From 24139c6ff0cc1dc4034b193e9f96605fa02c3353 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 20 Aug 2020 12:18:39 +1200 Subject: [PATCH 0107/1370] Env mega2560ext adds pins 70-85 (#19022) --- .../copy_marlin_variant_to_framework.py | 14 +- .../variants/megaextendedpins/pins_arduino.h | 461 ++++++++++++++++++ platformio.ini | 17 +- 3 files changed, 488 insertions(+), 4 deletions(-) create mode 100755 buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index 02957ec470..b66ba27fa6 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -1,6 +1,7 @@ import os,shutil from SCons.Script import DefaultEnvironment from platformio import util +from platformio.managers.package import PackageManager def copytree(src, dst, symlinks=False, ignore=None): for item in os.listdir(src): @@ -16,7 +17,18 @@ platform = env.PioPlatform() board = env.BoardConfig() variant = board.get("build.variant") -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32") +platform_packages = env.GetProjectOption('platform_packages') +# if there's no framework defined, take it from the class name of platform +framewords = { + "Ststm32Platform": "framework-arduinoststm32", + "AtmelavrPlatform": "framework-arduino-avr" +} +if len(platform_packages) == 0: + platform_name = framewords[platform.__class__.__name__] +else: + platform_name, _, _ = PackageManager.parse_pkg_uri(platform_packages[0]) + +FRAMEWORK_DIR = platform.get_package_dir(platform_name) assert os.path.isdir(FRAMEWORK_DIR) assert os.path.isdir("buildroot/share/PlatformIO/variants") diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h new file mode 100755 index 0000000000..77d0beca9b --- /dev/null +++ b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h @@ -0,0 +1,461 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2007 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define NUM_DIGITAL_PINS 86 +#define NUM_ANALOG_INPUTS 16 +#define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1) +#define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46)) + +#define PIN_SPI_SS (53) +#define PIN_SPI_MOSI (51) +#define PIN_SPI_MISO (50) +#define PIN_SPI_SCK (52) + +static const uint8_t SS = PIN_SPI_SS; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +#define PIN_WIRE_SDA (20) +#define PIN_WIRE_SCL (21) + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; + +#define LED_BUILTIN 13 + +#define PIN_A0 (54) +#define PIN_A1 (55) +#define PIN_A2 (56) +#define PIN_A3 (57) +#define PIN_A4 (58) +#define PIN_A5 (59) +#define PIN_A6 (60) +#define PIN_A7 (61) +#define PIN_A8 (62) +#define PIN_A9 (63) +#define PIN_A10 (64) +#define PIN_A11 (65) +#define PIN_A12 (66) +#define PIN_A13 (67) +#define PIN_A14 (68) +#define PIN_A15 (69) + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; +static const uint8_t A3 = PIN_A3; +static const uint8_t A4 = PIN_A4; +static const uint8_t A5 = PIN_A5; +static const uint8_t A6 = PIN_A6; +static const uint8_t A7 = PIN_A7; +static const uint8_t A8 = PIN_A8; +static const uint8_t A9 = PIN_A9; +static const uint8_t A10 = PIN_A10; +static const uint8_t A11 = PIN_A11; +static const uint8_t A12 = PIN_A12; +static const uint8_t A13 = PIN_A13; +static const uint8_t A14 = PIN_A14; +static const uint8_t A15 = PIN_A15; + +// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins) +// Only pins available for RECEIVE (TRANSMIT can be on any pin): +// (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me) +// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 + +#define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \ + (((p) >= 50) && ((p) <= 53)) || \ + (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) ) + +#define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \ + ( (((p) >= 62) && ((p) <= 69)) ? 2 : \ + 0 ) ) + +#define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \ + ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \ + ((uint8_t *)0) ) ) + +#define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \ + ( ((p) == 50) ? 3 : \ + ( ((p) == 51) ? 2 : \ + ( ((p) == 52) ? 1 : \ + ( ((p) == 53) ? 0 : \ + ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \ + 0 ) ) ) ) ) ) + +#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT))) + +#ifdef ARDUINO_MAIN + +const uint16_t PROGMEM port_to_mode_PGM[] = { + NOT_A_PORT, + (uint16_t) &DDRA, + (uint16_t) &DDRB, + (uint16_t) &DDRC, + (uint16_t) &DDRD, + (uint16_t) &DDRE, + (uint16_t) &DDRF, + (uint16_t) &DDRG, + (uint16_t) &DDRH, + NOT_A_PORT, + (uint16_t) &DDRJ, + (uint16_t) &DDRK, + (uint16_t) &DDRL, +}; + +const uint16_t PROGMEM port_to_output_PGM[] = { + NOT_A_PORT, + (uint16_t) &PORTA, + (uint16_t) &PORTB, + (uint16_t) &PORTC, + (uint16_t) &PORTD, + (uint16_t) &PORTE, + (uint16_t) &PORTF, + (uint16_t) &PORTG, + (uint16_t) &PORTH, + NOT_A_PORT, + (uint16_t) &PORTJ, + (uint16_t) &PORTK, + (uint16_t) &PORTL, +}; + +const uint16_t PROGMEM port_to_input_PGM[] = { + NOT_A_PIN, + (uint16_t) &PINA, + (uint16_t) &PINB, + (uint16_t) &PINC, + (uint16_t) &PIND, + (uint16_t) &PINE, + (uint16_t) &PINF, + (uint16_t) &PING, + (uint16_t) &PINH, + NOT_A_PIN, + (uint16_t) &PINJ, + (uint16_t) &PINK, + (uint16_t) &PINL, +}; + +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { + // PORTLIST + // ------------------------------------------- + PE , // PE 0 ** 0 ** USART0_RX + PE , // PE 1 ** 1 ** USART0_TX + PE , // PE 4 ** 2 ** PWM2 + PE , // PE 5 ** 3 ** PWM3 + PG , // PG 5 ** 4 ** PWM4 + PE , // PE 3 ** 5 ** PWM5 + PH , // PH 3 ** 6 ** PWM6 + PH , // PH 4 ** 7 ** PWM7 + PH , // PH 5 ** 8 ** PWM8 + PH , // PH 6 ** 9 ** PWM9 + PB , // PB 4 ** 10 ** PWM10 + PB , // PB 5 ** 11 ** PWM11 + PB , // PB 6 ** 12 ** PWM12 + PB , // PB 7 ** 13 ** PWM13 + PJ , // PJ 1 ** 14 ** USART3_TX + PJ , // PJ 0 ** 15 ** USART3_RX + PH , // PH 1 ** 16 ** USART2_TX + PH , // PH 0 ** 17 ** USART2_RX + PD , // PD 3 ** 18 ** USART1_TX + PD , // PD 2 ** 19 ** USART1_RX + PD , // PD 1 ** 20 ** I2C_SDA + PD , // PD 0 ** 21 ** I2C_SCL + PA , // PA 0 ** 22 ** D22 + PA , // PA 1 ** 23 ** D23 + PA , // PA 2 ** 24 ** D24 + PA , // PA 3 ** 25 ** D25 + PA , // PA 4 ** 26 ** D26 + PA , // PA 5 ** 27 ** D27 + PA , // PA 6 ** 28 ** D28 + PA , // PA 7 ** 29 ** D29 + PC , // PC 7 ** 30 ** D30 + PC , // PC 6 ** 31 ** D31 + PC , // PC 5 ** 32 ** D32 + PC , // PC 4 ** 33 ** D33 + PC , // PC 3 ** 34 ** D34 + PC , // PC 2 ** 35 ** D35 + PC , // PC 1 ** 36 ** D36 + PC , // PC 0 ** 37 ** D37 + PD , // PD 7 ** 38 ** D38 + PG , // PG 2 ** 39 ** D39 + PG , // PG 1 ** 40 ** D40 + PG , // PG 0 ** 41 ** D41 + PL , // PL 7 ** 42 ** D42 + PL , // PL 6 ** 43 ** D43 + PL , // PL 5 ** 44 ** D44 + PL , // PL 4 ** 45 ** D45 + PL , // PL 3 ** 46 ** D46 + PL , // PL 2 ** 47 ** D47 + PL , // PL 1 ** 48 ** D48 + PL , // PL 0 ** 49 ** D49 + PB , // PB 3 ** 50 ** SPI_MISO + PB , // PB 2 ** 51 ** SPI_MOSI + PB , // PB 1 ** 52 ** SPI_SCK + PB , // PB 0 ** 53 ** SPI_SS + PF , // PF 0 ** 54 ** A0 + PF , // PF 1 ** 55 ** A1 + PF , // PF 2 ** 56 ** A2 + PF , // PF 3 ** 57 ** A3 + PF , // PF 4 ** 58 ** A4 + PF , // PF 5 ** 59 ** A5 + PF , // PF 6 ** 60 ** A6 + PF , // PF 7 ** 61 ** A7 + PK , // PK 0 ** 62 ** A8 + PK , // PK 1 ** 63 ** A9 + PK , // PK 2 ** 64 ** A10 + PK , // PK 3 ** 65 ** A11 + PK , // PK 4 ** 66 ** A12 + PK , // PK 5 ** 67 ** A13 + PK , // PK 6 ** 68 ** A14 + PK , // PK 7 ** 69 ** A15 + PG , // PG 4 ** 70 ** D70 + PG , // PG 3 ** 71 ** D71 + PJ , // PJ 2 ** 72 ** D72 + PJ , // PJ 3 ** 73 ** D73 + PJ , // PJ 7 ** 74 ** D74 + PJ , // PJ 4 ** 75 ** D75 + PJ , // PJ 5 ** 76 ** D76 + PJ , // PJ 6 ** 77 ** D77 + PE , // PE 2 ** 78 ** D78 + PE , // PE 6 ** 79 ** D79 + PE , // PE 7 ** 80 ** D80 + PD , // PD 4 ** 81 ** D81 + PD , // PD 5 ** 82 ** D82 + PD , // PD 6 ** 83 ** D83 + PH , // PH 2 ** 84 ** D84 + PH , // PH 7 ** 85 ** D85 +}; + +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { + // PIN IN PORT + // ------------------------------------------- + _BV( 0 ) , // PE 0 ** 0 ** USART0_RX + _BV( 1 ) , // PE 1 ** 1 ** USART0_TX + _BV( 4 ) , // PE 4 ** 2 ** PWM2 + _BV( 5 ) , // PE 5 ** 3 ** PWM3 + _BV( 5 ) , // PG 5 ** 4 ** PWM4 + _BV( 3 ) , // PE 3 ** 5 ** PWM5 + _BV( 3 ) , // PH 3 ** 6 ** PWM6 + _BV( 4 ) , // PH 4 ** 7 ** PWM7 + _BV( 5 ) , // PH 5 ** 8 ** PWM8 + _BV( 6 ) , // PH 6 ** 9 ** PWM9 + _BV( 4 ) , // PB 4 ** 10 ** PWM10 + _BV( 5 ) , // PB 5 ** 11 ** PWM11 + _BV( 6 ) , // PB 6 ** 12 ** PWM12 + _BV( 7 ) , // PB 7 ** 13 ** PWM13 + _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX + _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX + _BV( 1 ) , // PH 1 ** 16 ** USART2_TX + _BV( 0 ) , // PH 0 ** 17 ** USART2_RX + _BV( 3 ) , // PD 3 ** 18 ** USART1_TX + _BV( 2 ) , // PD 2 ** 19 ** USART1_RX + _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA + _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL + _BV( 0 ) , // PA 0 ** 22 ** D22 + _BV( 1 ) , // PA 1 ** 23 ** D23 + _BV( 2 ) , // PA 2 ** 24 ** D24 + _BV( 3 ) , // PA 3 ** 25 ** D25 + _BV( 4 ) , // PA 4 ** 26 ** D26 + _BV( 5 ) , // PA 5 ** 27 ** D27 + _BV( 6 ) , // PA 6 ** 28 ** D28 + _BV( 7 ) , // PA 7 ** 29 ** D29 + _BV( 7 ) , // PC 7 ** 30 ** D30 + _BV( 6 ) , // PC 6 ** 31 ** D31 + _BV( 5 ) , // PC 5 ** 32 ** D32 + _BV( 4 ) , // PC 4 ** 33 ** D33 + _BV( 3 ) , // PC 3 ** 34 ** D34 + _BV( 2 ) , // PC 2 ** 35 ** D35 + _BV( 1 ) , // PC 1 ** 36 ** D36 + _BV( 0 ) , // PC 0 ** 37 ** D37 + _BV( 7 ) , // PD 7 ** 38 ** D38 + _BV( 2 ) , // PG 2 ** 39 ** D39 + _BV( 1 ) , // PG 1 ** 40 ** D40 + _BV( 0 ) , // PG 0 ** 41 ** D41 + _BV( 7 ) , // PL 7 ** 42 ** D42 + _BV( 6 ) , // PL 6 ** 43 ** D43 + _BV( 5 ) , // PL 5 ** 44 ** D44 + _BV( 4 ) , // PL 4 ** 45 ** D45 + _BV( 3 ) , // PL 3 ** 46 ** D46 + _BV( 2 ) , // PL 2 ** 47 ** D47 + _BV( 1 ) , // PL 1 ** 48 ** D48 + _BV( 0 ) , // PL 0 ** 49 ** D49 + _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO + _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI + _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK + _BV( 0 ) , // PB 0 ** 53 ** SPI_SS + _BV( 0 ) , // PF 0 ** 54 ** A0 + _BV( 1 ) , // PF 1 ** 55 ** A1 + _BV( 2 ) , // PF 2 ** 56 ** A2 + _BV( 3 ) , // PF 3 ** 57 ** A3 + _BV( 4 ) , // PF 4 ** 58 ** A4 + _BV( 5 ) , // PF 5 ** 59 ** A5 + _BV( 6 ) , // PF 6 ** 60 ** A6 + _BV( 7 ) , // PF 7 ** 61 ** A7 + _BV( 0 ) , // PK 0 ** 62 ** A8 + _BV( 1 ) , // PK 1 ** 63 ** A9 + _BV( 2 ) , // PK 2 ** 64 ** A10 + _BV( 3 ) , // PK 3 ** 65 ** A11 + _BV( 4 ) , // PK 4 ** 66 ** A12 + _BV( 5 ) , // PK 5 ** 67 ** A13 + _BV( 6 ) , // PK 6 ** 68 ** A14 + _BV( 7 ) , // PK 7 ** 69 ** A15 + _BV( 4 ) , // PG 4 ** 70 ** D70 + _BV( 3 ) , // PG 3 ** 71 ** D71 + _BV( 2 ) , // PJ 2 ** 72 ** D72 + _BV( 3 ) , // PJ 3 ** 73 ** D73 + _BV( 7 ) , // PJ 7 ** 74 ** D74 + _BV( 4 ) , // PJ 4 ** 75 ** D75 + _BV( 5 ) , // PJ 5 ** 76 ** D76 + _BV( 6 ) , // PJ 6 ** 77 ** D77 + _BV( 2 ) , // PE 2 ** 78 ** D78 + _BV( 6 ) , // PE 6 ** 79 ** D79 + _BV( 7 ) , // PE 7 ** 80 ** D80 + _BV( 4 ) , // PD 4 ** 81 ** D81 + _BV( 5 ) , // PD 5 ** 82 ** D82 + _BV( 6 ) , // PD 6 ** 83 ** D83 + _BV( 2 ) , // PH 2 ** 84 ** D84 + _BV( 7 ) , // PH 7 ** 85 ** D85 +}; + +const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { + // TIMERS + // ------------------------------------------- + NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX + NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX + TIMER3B , // PE 4 ** 2 ** PWM2 + TIMER3C , // PE 5 ** 3 ** PWM3 + TIMER0B , // PG 5 ** 4 ** PWM4 + TIMER3A , // PE 3 ** 5 ** PWM5 + TIMER4A , // PH 3 ** 6 ** PWM6 + TIMER4B , // PH 4 ** 7 ** PWM7 + TIMER4C , // PH 5 ** 8 ** PWM8 + TIMER2B , // PH 6 ** 9 ** PWM9 + TIMER2A , // PB 4 ** 10 ** PWM10 + TIMER1A , // PB 5 ** 11 ** PWM11 + TIMER1B , // PB 6 ** 12 ** PWM12 + TIMER0A , // PB 7 ** 13 ** PWM13 + NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX + NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX + NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX + NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX + NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX + NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX + NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA + NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL + NOT_ON_TIMER , // PA 0 ** 22 ** D22 + NOT_ON_TIMER , // PA 1 ** 23 ** D23 + NOT_ON_TIMER , // PA 2 ** 24 ** D24 + NOT_ON_TIMER , // PA 3 ** 25 ** D25 + NOT_ON_TIMER , // PA 4 ** 26 ** D26 + NOT_ON_TIMER , // PA 5 ** 27 ** D27 + NOT_ON_TIMER , // PA 6 ** 28 ** D28 + NOT_ON_TIMER , // PA 7 ** 29 ** D29 + NOT_ON_TIMER , // PC 7 ** 30 ** D30 + NOT_ON_TIMER , // PC 6 ** 31 ** D31 + NOT_ON_TIMER , // PC 5 ** 32 ** D32 + NOT_ON_TIMER , // PC 4 ** 33 ** D33 + NOT_ON_TIMER , // PC 3 ** 34 ** D34 + NOT_ON_TIMER , // PC 2 ** 35 ** D35 + NOT_ON_TIMER , // PC 1 ** 36 ** D36 + NOT_ON_TIMER , // PC 0 ** 37 ** D37 + NOT_ON_TIMER , // PD 7 ** 38 ** D38 + NOT_ON_TIMER , // PG 2 ** 39 ** D39 + NOT_ON_TIMER , // PG 1 ** 40 ** D40 + NOT_ON_TIMER , // PG 0 ** 41 ** D41 + NOT_ON_TIMER , // PL 7 ** 42 ** D42 + NOT_ON_TIMER , // PL 6 ** 43 ** D43 + TIMER5C , // PL 5 ** 44 ** D44 + TIMER5B , // PL 4 ** 45 ** D45 + TIMER5A , // PL 3 ** 46 ** D46 + NOT_ON_TIMER , // PL 2 ** 47 ** D47 + NOT_ON_TIMER , // PL 1 ** 48 ** D48 + NOT_ON_TIMER , // PL 0 ** 49 ** D49 + NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO + NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI + NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK + NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS + NOT_ON_TIMER , // PF 0 ** 54 ** A0 + NOT_ON_TIMER , // PF 1 ** 55 ** A1 + NOT_ON_TIMER , // PF 2 ** 56 ** A2 + NOT_ON_TIMER , // PF 3 ** 57 ** A3 + NOT_ON_TIMER , // PF 4 ** 58 ** A4 + NOT_ON_TIMER , // PF 5 ** 59 ** A5 + NOT_ON_TIMER , // PF 6 ** 60 ** A6 + NOT_ON_TIMER , // PF 7 ** 61 ** A7 + NOT_ON_TIMER , // PK 0 ** 62 ** A8 + NOT_ON_TIMER , // PK 1 ** 63 ** A9 + NOT_ON_TIMER , // PK 2 ** 64 ** A10 + NOT_ON_TIMER , // PK 3 ** 65 ** A11 + NOT_ON_TIMER , // PK 4 ** 66 ** A12 + NOT_ON_TIMER , // PK 5 ** 67 ** A13 + NOT_ON_TIMER , // PK 6 ** 68 ** A14 + NOT_ON_TIMER , // PK 7 ** 69 ** A15 + NOT_ON_TIMER , // PG 4 ** 70 ** D70 + NOT_ON_TIMER , // PG 3 ** 71 ** D71 + NOT_ON_TIMER , // PJ 2 ** 72 ** D72 + NOT_ON_TIMER , // PJ 3 ** 73 ** D73 + NOT_ON_TIMER , // PJ 7 ** 74 ** D74 + NOT_ON_TIMER , // PJ 4 ** 75 ** D75 + NOT_ON_TIMER , // PJ 5 ** 76 ** D76 + NOT_ON_TIMER , // PJ 6 ** 77 ** D77 + NOT_ON_TIMER , // PE 2 ** 78 ** D78 + NOT_ON_TIMER , // PE 6 ** 79 ** D79 + NOT_ON_TIMER , // PE 7 ** 80 ** D80 + NOT_ON_TIMER , // PD 4 ** 81 ** D81 + NOT_ON_TIMER , // PD 5 ** 82 ** D82 + NOT_ON_TIMER , // PD 6 ** 83 ** D83 + NOT_ON_TIMER , // PH 2 ** 84 ** D84 + NOT_ON_TIMER , // PH 7 ** 85 ** D85 +}; + +#endif + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE Serial +#define SERIAL_PORT_HARDWARE1 Serial1 +#define SERIAL_PORT_HARDWARE2 Serial2 +#define SERIAL_PORT_HARDWARE3 Serial3 +#define SERIAL_PORT_HARDWARE_OPEN Serial1 +#define SERIAL_PORT_HARDWARE_OPEN1 Serial2 +#define SERIAL_PORT_HARDWARE_OPEN2 Serial3 + +#endif diff --git a/platformio.ini b/platformio.ini index 10990b4d21..27b11b2aa7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -406,9 +406,20 @@ src_filter = ${common.default_src_filter} + # ATmega2560 # [env:mega2560] -platform = atmelavr -extends = common_avr8 -board = megaatmega2560 +platform = atmelavr +extends = common_avr8 +board = megaatmega2560 + +# +# ATmega2560 with extended pins 70-85 defined +# +[env:mega2560ext] +platform = atmelavr +extends = mega2560 +board = megaatmega2560 +board_build.variant = megaextendedpins +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py # # ATmega1280 From f7dade8c2c83257df8cc0e32d84334e400161aaf Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Thu, 20 Aug 2020 03:11:20 +0200 Subject: [PATCH 0108/1370] Configurable number of M106 fans (#18883) --- Marlin/Configuration.h | 4 ++++ Marlin/src/inc/Conditionals_post.h | 22 +++++++++++++++++++--- Marlin/src/inc/SanityCheck.h | 7 +++++++ Marlin/src/module/temperature.cpp | 2 +- Marlin/src/pins/sam/pins_CNCONTROLS_15D.h | 2 +- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 24d7c46a68..986b9efb65 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2275,6 +2275,10 @@ // @section extras +// Set number of user-controlled fans. Disable to use all board-defined fans. +// :[1,2,3,4,5,6,7,8] +//#define NUM_M106_FANS 1 + // Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 29ab2cfc29..5d7322753f 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1876,12 +1876,28 @@ #undef AUTO_POWER_CHAMBER_FAN #endif -// Other fans +// Print Cooling fans (limit) +#ifdef NUM_M106_FANS + #define MAX_FANS NUM_M106_FANS +#else + #define MAX_FANS 8 // Max supported fans +#endif + +#define _NOT_E_AUTO(N,F) (E##N##_AUTO_FAN_PIN != FAN##F##_PIN) +#define _HAS_FAN(F) (PIN_EXISTS(FAN##F) \ + && CONTROLLER_FAN_PIN != FAN##F##_PIN \ + && _NOT_E_AUTO(0,F) \ + && _NOT_E_AUTO(1,F) \ + && _NOT_E_AUTO(2,F) \ + && _NOT_E_AUTO(3,F) \ + && _NOT_E_AUTO(4,F) \ + && _NOT_E_AUTO(5,F) \ + && _NOT_E_AUTO(6,F) \ + && _NOT_E_AUTO(7,F) \ + && F < MAX_FANS) #if PIN_EXISTS(FAN) #define HAS_FAN0 1 #endif -#define _NOT_E_AUTO(N,F) (E##N##_AUTO_FAN_PIN != FAN##F##_PIN) -#define _HAS_FAN(F) (PIN_EXISTS(FAN##F) && CONTROLLER_FAN_PIN != FAN##F##_PIN && _NOT_E_AUTO(0,F) && _NOT_E_AUTO(1,F) && _NOT_E_AUTO(2,F) && _NOT_E_AUTO(3,F) && _NOT_E_AUTO(4,F) && _NOT_E_AUTO(5,F) && _NOT_E_AUTO(6,F) && _NOT_E_AUTO(7,F)) #if _HAS_FAN(1) #define HAS_FAN1 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6fcd867981..d31a826778 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1106,6 +1106,13 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "FANMUX0_PIN and FANMUX1_PIN must be set before FANMUX2_PIN can be set." #endif +/** + * Limited user-controlled fans + */ +#if NUM_M106_FANS > FAN_COUNT + #error "The selected board doesn't support enough user-controlled fans. Reduce NUM_M106_FANS." +#endif + /** * Limited number of servos */ diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a217fc9ab8..1208e4e995 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -195,7 +195,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif #if ENABLED(ADAPTIVE_FAN_SLOWING) - uint8_t Temperature::fan_speed_scaler[FAN_COUNT] = ARRAY_N(FAN_COUNT, 128, 128, 128, 128, 128, 128); + uint8_t Temperature::fan_speed_scaler[FAN_COUNT] = ARRAY_N(FAN_COUNT, 128, 128, 128, 128, 128, 128, 128, 128); #endif /** diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h index b977ad1aba..a2094bee4d 100644 --- a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h +++ b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h @@ -92,7 +92,7 @@ // // Fans // -//#define FAN0_PIN 8 +//#define FAN_PIN 8 // // Auto fans From 7e7e870eae769af80517afdab3259cd73a734ff5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Aug 2020 20:03:49 -0500 Subject: [PATCH 0109/1370] Config adjustments --- Marlin/Configuration.h | 2 +- Marlin/Configuration_adv.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 986b9efb65..dc0416d516 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2359,7 +2359,7 @@ #define NEOPIXEL_PIN 4 // LED driving pin //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE //#define NEOPIXEL2_PIN 5 - #define NEOPIXEL2_INSERIES false // The default behaviour is 'false' with neopixel2 in parallel + //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 neopixel strips are used #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1c29af1f46..529dcc3091 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -825,13 +825,13 @@ //#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated -// Minimum time that a segment needs to take as the buffer gets emptied -#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. - // Default Minimum Feedrates for printing and travel moves #define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. #define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. +// Minimum time that a segment needs to take as the buffer gets emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. + // Slow down the machine if the lookahead buffer is (by default) half full. // Increase the slowdown divisor for larger buffer sizes. #define SLOWDOWN From d1aed522803db945841472087df3040f3dc897d4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 20 Aug 2020 01:38:22 -0500 Subject: [PATCH 0110/1370] Move ExtUI displays to sub-folder (#19070) --- .../anycubic_chiron_lcd.cpp} | 6 ++--- .../anycubic_i3mega_lcd.cpp} | 8 +++---- .../dgus_lcd.cpp} | 12 +++++----- .../{extui_example.cpp => extui/example.cpp} | 6 ++--- .../malyan_lcd.cpp} | 24 +++++++++---------- platformio.ini | 16 ++++++------- 6 files changed, 36 insertions(+), 36 deletions(-) rename Marlin/src/lcd/{extui_anycubic_chiron_lcd.cpp => extui/anycubic_chiron_lcd.cpp} (99%) rename Marlin/src/lcd/{extui_anycubic_i3mega_lcd.cpp => extui/anycubic_i3mega_lcd.cpp} (95%) rename Marlin/src/lcd/{extui_dgus_lcd.cpp => extui/dgus_lcd.cpp} (95%) rename Marlin/src/lcd/{extui_example.cpp => extui/example.cpp} (97%) rename Marlin/src/lcd/{extui_malyan_lcd.cpp => extui/malyan_lcd.cpp} (97%) diff --git a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp similarity index 99% rename from Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp rename to Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index 15cc96711c..889a25b859 100644 --- a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -21,16 +21,16 @@ */ /** - * extui_anycubic_chiron_lcd.cpp + * anycubic_chiron_lcd.cpp * * Anycubic Chiron TFT support for Marlin */ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if ENABLED(ANYCUBIC_LCD_CHIRON) -#include "extui/ui_api.h" +#include "ui_api.h" #if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if GRID_MAX_POINTS_X != 5 || GRID_MAX_POINTS_Y != 5 diff --git a/Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp similarity index 95% rename from Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp rename to Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp index 360ea75de8..15526d16fc 100644 --- a/Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp @@ -21,15 +21,15 @@ */ /** - * extui_anycubic_i3mega_lcd.cpp + * anycubic_i3mega_lcd.cpp */ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if ENABLED(ANYCUBIC_LCD_I3MEGA) -#include "extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h" -#include "extui/ui_api.h" +#include "lib/anycubic_i3mega/anycubic_i3mega_lcd.h" +#include "ui_api.h" #include // for the ::tone() call diff --git a/Marlin/src/lcd/extui_dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp similarity index 95% rename from Marlin/src/lcd/extui_dgus_lcd.cpp rename to Marlin/src/lcd/extui/dgus_lcd.cpp index c3978eb7e1..d175b5acac 100644 --- a/Marlin/src/lcd/extui_dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -21,19 +21,19 @@ */ /** - * extui_dgus_lcd.cpp + * dgus_lcd.cpp * * DGUS implementation for Marlin by coldtobi, Feb-May 2019 */ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if HAS_DGUS_LCD -#include "extui/ui_api.h" -#include "extui/lib/dgus/DGUSDisplay.h" -#include "extui/lib/dgus/DGUSDisplayDef.h" -#include "extui/lib/dgus/DGUSScreenHandler.h" +#include "ui_api.h" +#include "lib/dgus/DGUSDisplay.h" +#include "lib/dgus/DGUSDisplayDef.h" +#include "lib/dgus/DGUSScreenHandler.h" extern const char NUL_STR[]; diff --git a/Marlin/src/lcd/extui_example.cpp b/Marlin/src/lcd/extui/example.cpp similarity index 97% rename from Marlin/src/lcd/extui_example.cpp rename to Marlin/src/lcd/extui/example.cpp index 5258a5b6a2..a5ef5652bc 100644 --- a/Marlin/src/lcd/extui_example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -1,5 +1,5 @@ /********************* - * extui_example.cpp * + * example.cpp * *********************/ /**************************************************************************** @@ -19,11 +19,11 @@ * location: . * ****************************************************************************/ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if BOTH(EXTUI_EXAMPLE, EXTENSIBLE_UI) -#include "extui/ui_api.h" +#include "ui_api.h" // To implement a new UI, complete the functions below and // read or update Marlin's state using the methods in the diff --git a/Marlin/src/lcd/extui_malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp similarity index 97% rename from Marlin/src/lcd/extui_malyan_lcd.cpp rename to Marlin/src/lcd/extui/malyan_lcd.cpp index 38a8fbc0f9..b5148065c7 100644 --- a/Marlin/src/lcd/extui_malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -21,7 +21,7 @@ */ /** - * extui_malyan_lcd.cpp + * malyan_lcd.cpp * * LCD implementation for Malyan's LCD, a separate ESP8266 MCU running * on Serial1 for the M200 board. This module outputs a pseudo-gcode @@ -41,25 +41,25 @@ * Copyright (c) 2017 Jason Nelson (xC0000005) */ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if ENABLED(MALYAN_LCD) #define DEBUG_MALYAN_LCD -#include "extui/ui_api.h" +#include "ui_api.h" -#include "ultralcd.h" -#include "../sd/cardreader.h" -#include "../module/temperature.h" -#include "../module/stepper.h" -#include "../module/motion.h" -#include "../libs/duration_t.h" -#include "../module/printcounter.h" -#include "../gcode/queue.h" +#include "../ultralcd.h" +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/stepper.h" +#include "../../module/motion.h" +#include "../../libs/duration_t.h" +#include "../../module/printcounter.h" +#include "../../gcode/queue.h" #define DEBUG_OUT ENABLED(DEBUG_MALYAN_LCD) -#include "../core/debug_out.h" +#include "../../core/debug_out.h" // On the Malyan M200, this will be Serial1. On a RAMPS board, // it might not be. diff --git a/platformio.ini b/platformio.ini index 27b11b2aa7..e3ff6c1526 100644 --- a/platformio.ini +++ b/platformio.ini @@ -49,12 +49,12 @@ default_src_filter = + - - + - - - - - - - - - - + - - + - + - - - - - + - - - - @@ -241,11 +241,11 @@ HAS_MENU_TMC = src_filter=+ HAS_MENU_TOUCH_SCREEN = src_filter=+ HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_I3MEGA = src_filter=+ -HAS_DGUS_LCD = src_filter=+ + +HAS_DGUS_LCD = src_filter=+ + TOUCH_UI_FTDI_EVE = src_filter=+ -HAS_ANYCUBIC_TFT_EXTUI = src_filter=+ -EXTUI_EXAMPLE = src_filter=+ -MALYAN_LCD = src_filter=+ +HAS_ANYCUBIC_TFT_EXTUI = src_filter=+ +EXTUI_EXAMPLE = src_filter=+ +MALYAN_LCD = src_filter=+ HAS_SPI_LCD = src_filter=+ USB_FLASH_DRIVE_SUPPORT = src_filter=+ AUTO_BED_LEVELING_BILINEAR = src_filter=+ From c43d264d3e52dd9cc926518333ad1a1fcc0b5dfe Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 20 Aug 2020 02:47:16 -0500 Subject: [PATCH 0111/1370] Add custom_verbose, custom_gcc deps flags --- .../PlatformIO/scripts/common-dependencies.py | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index d5f6fc1958..def3bf40c2 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -18,7 +18,16 @@ except ImportError: Import("env") -FEATURE_CONFIG = {} +#print(env.Dump()) + +try: + verbose = int(env.GetProjectOption('custom_verbose')) +except: + verbose = 0 + +def blab(str): + if verbose: + print(str) def parse_pkg_uri(spec): if PackageManager.__name__ == 'PackageSpec': @@ -27,6 +36,8 @@ def parse_pkg_uri(spec): name, _, _ = PackageManager.parse_pkg_uri(spec) return name +FEATURE_CONFIG = {} + def add_to_feat_cnf(feature, flines): feat = FEATURE_CONFIG[feature] atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') @@ -91,7 +102,8 @@ def force_ignore_unused_libs(): known_libs = get_all_known_libs() diff = (list(set(known_libs) - set(env_libs))) lib_ignore = env.GetProjectOption('lib_ignore') + diff - print("Ignore libraries:", lib_ignore) + if verbose: + print("Ignore libraries:", lib_ignore) set_env_field('lib_ignore', lib_ignore) def apply_features_config(): @@ -103,7 +115,7 @@ def apply_features_config(): feat = FEATURE_CONFIG[feature] if 'lib_deps' in feat and len(feat['lib_deps']): - print("Adding lib_deps for %s... " % feature) + blab("Adding lib_deps for %s... " % feature) # feat to add deps_to_add = {} @@ -131,11 +143,11 @@ def apply_features_config(): set_env_field('lib_deps', deps + list(deps_to_add.values())) if 'extra_scripts' in feat: - print("Running extra_scripts for %s... " % feature) + blab("Running extra_scripts for %s... " % feature) env.SConscript(feat['extra_scripts'], exports="env") if 'src_filter' in feat: - print("Adding src_filter for %s... " % feature) + blab("Adding src_filter for %s... " % feature) src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder my_srcs = re.findall( r'[+-](<.*?>)', feat['src_filter']) @@ -149,7 +161,7 @@ def apply_features_config(): env.Replace(SRC_FILTER=src_filter) if 'lib_ignore' in feat: - print("Adding lib_ignore for %s... " % feature) + blab("Adding lib_ignore for %s... " % feature) lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] set_env_field('lib_ignore', lib_ignore) @@ -159,41 +171,49 @@ def apply_features_config(): ENV_BUILD_PATH = os.path.join(env.Dictionary('PROJECT_BUILD_DIR'), env['PIOENV']) GCC_PATH_CACHE = os.path.join(ENV_BUILD_PATH, ".gcc_path") def search_compiler(): + try: + filepath = env.GetProjectOption('custom_gcc') + blab('Getting compiler from env') + return filepath + except: + pass + if os.path.exists(GCC_PATH_CACHE): - print('Getting g++ path from cache') + blab('Getting g++ path from cache') with open(GCC_PATH_CACHE, 'r') as f: return f.read() - # PlatformIO inserts the toolchain bin folder on the front of the $PATH # Find the current platform compiler by searching the $PATH + # which will be in a platformio toolchain bin folder + path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + gcc = "g++" if env['PLATFORM'] == 'win32': path_separator = ';' - path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + r'.*\\bin' - gcc = "g++.exe" + path_regex += r'.*\\bin' + gcc += ".exe" else: path_separator = ':' - path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + r'.*/bin' - gcc = "g++" + path_regex += r'/.+/bin' # Search for the compiler - for path in env['ENV']['PATH'].split(path_separator): - if not re.search(path_regex, path, re.IGNORECASE): + for pathdir in env['ENV']['PATH'].split(path_separator): + if not re.search(path_regex, pathdir, re.IGNORECASE): continue - for file in os.listdir(path): - if not file.endswith(gcc): + for filepath in os.listdir(pathdir): + if not filepath.endswith(gcc): continue # Cache the g++ path to no search always if os.path.exists(ENV_BUILD_PATH): - print('Caching g++ for current env') + blab('Caching g++ for current env') with open(GCC_PATH_CACHE, 'w+') as f: - f.write(file) + f.write(filepath) - return file + return filepath - file = env.get('CXX') - print("Couldn't find a compiler! Fallback to", file) - return file + filepath = env.get('CXX') + blab("Couldn't find a compiler! Fallback to %s" % filepath) + return filepath # # Use the compiler to get a list of all enabled features @@ -203,7 +223,6 @@ def load_marlin_features(): return # Process defines - #print(env.Dump()) build_flags = env.get('BUILD_FLAGS') build_flags = env.ParseFlagsExtended(build_flags) @@ -221,7 +240,7 @@ def load_marlin_features(): cmd += ['-w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] cmd = ' '.join(cmd) - print(cmd) + blab(cmd) define_list = subprocess.check_output(cmd, shell=True).splitlines() marlin_features = {} for define in define_list: From 615af841f0521f38cb605432a1755e07710e3286 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 20 Aug 2020 00:08:06 -0500 Subject: [PATCH 0112/1370] Update some comments --- Marlin/src/module/settings.cpp | 2 +- Marlin/src/module/settings.h | 4 ++++ Marlin/src/module/temperature.cpp | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 29b12e5caf..d5f41a3246 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -21,7 +21,7 @@ */ /** - * configuration_store.cpp + * settings.cpp * * Settings and EEPROM storage * diff --git a/Marlin/src/module/settings.h b/Marlin/src/module/settings.h index c654b11bd5..b213de93a4 100644 --- a/Marlin/src/module/settings.h +++ b/Marlin/src/module/settings.h @@ -21,6 +21,10 @@ */ #pragma once +// +// settings.cpp - Settings and EEPROM storage +// + #include "../inc/MarlinConfig.h" #if ENABLED(EEPROM_SETTINGS) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1208e4e995..e8be3dbf01 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -361,7 +361,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif #if ENABLED(PID_EXTRUSION_SCALING) - int16_t Temperature::lpq_len; // Initialized in configuration_store + int16_t Temperature::lpq_len; // Initialized in settings.cpp #endif #if HAS_PID_HEATING From ca54d67814dd552b20f4eb8d51501ad9ea0a4f26 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 02:41:33 -0500 Subject: [PATCH 0113/1370] Fix Select Screen cancel destination --- Marlin/src/lcd/menu/menu.cpp | 5 ++++- Marlin/src/lcd/menu/menu.h | 1 + Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 8 ++++---- Marlin/src/lcd/menu/menu_mixer.cpp | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 373051fd4e..3a3cd0934b 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -412,7 +412,10 @@ void MenuItem_confirm::select_screen( const bool ui_selection = ui.update_selection(), got_click = ui.use_click(); if (got_click || ui.should_draw()) { draw_select_screen(yes, no, ui_selection, pref, string, suff); - if (got_click) { ui_selection ? yesFunc() : noFunc(); } + if (got_click) { + selectFunc_t callFunc = ui_selection ? yesFunc : noFunc; + if (callFunc) callFunc(); else ui.goto_previous_screen(); + } ui.defer_status_screen(); } } diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 7c3df79a19..3a29a87d5e 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -542,6 +542,7 @@ class MenuItem_bool : public MenuEditItemBase { #define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ if (encoderLine == _thisItemNr && ui.use_click()) { \ + ui.save_previous_screen(); \ ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ return; \ } \ diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index e417861072..942fb67569 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -614,7 +614,7 @@ void menu_advanced_settings() { #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) CONFIRM_ITEM(MSG_INIT_EEPROM, MSG_BUTTON_INIT, MSG_BUTTON_CANCEL, - ui.init_eeprom, ui.goto_previous_screen, + ui.init_eeprom, nullptr, GET_TEXT(MSG_INIT_EEPROM), (const char *)nullptr, PSTR("?") ); #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 26120fc5da..e834009f77 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -224,11 +224,11 @@ void menu_advanced_settings(); ACTION_ITEM(MSG_BLTOUCH_STOW, bltouch._stow); ACTION_ITEM(MSG_BLTOUCH_SW_MODE, bltouch._set_SW_mode); #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU) - CONFIRM_ITEM(MSG_BLTOUCH_5V_MODE, MSG_BLTOUCH_5V_MODE, MSG_BUTTON_CANCEL, bltouch._set_5V_mode, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); - CONFIRM_ITEM(MSG_BLTOUCH_OD_MODE, MSG_BLTOUCH_OD_MODE, MSG_BUTTON_CANCEL, bltouch._set_OD_mode, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); + CONFIRM_ITEM(MSG_BLTOUCH_5V_MODE, MSG_BLTOUCH_5V_MODE, MSG_BUTTON_CANCEL, bltouch._set_5V_mode, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); + CONFIRM_ITEM(MSG_BLTOUCH_OD_MODE, MSG_BLTOUCH_OD_MODE, MSG_BUTTON_CANCEL, bltouch._set_OD_mode, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); ACTION_ITEM(MSG_BLTOUCH_MODE_STORE, bltouch._mode_store); - CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_5V, MSG_BLTOUCH_MODE_STORE_5V, MSG_BUTTON_CANCEL, bltouch.mode_conv_5V, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); - CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_OD, MSG_BLTOUCH_MODE_STORE_OD, MSG_BUTTON_CANCEL, bltouch.mode_conv_OD, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); + CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_5V, MSG_BLTOUCH_MODE_STORE_5V, MSG_BUTTON_CANCEL, bltouch.mode_conv_5V, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); + CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_OD, MSG_BLTOUCH_MODE_STORE_OD, MSG_BUTTON_CANCEL, bltouch.mode_conv_OD, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); ACTION_ITEM(MSG_BLTOUCH_MODE_ECHO, bltouch_report); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index 3f57d257ad..2bcde1c286 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -264,7 +264,7 @@ void menu_mixer() { LCD_MESSAGEPGM(MSG_VTOOLS_RESET); ui.return_to_status(); }, - ui.goto_previous_screen, + nullptr, GET_TEXT(MSG_RESET_VTOOLS), (const char *)nullptr, PSTR("?") ); From 87d2c471db8f93ba6bb4e2406b1ca84818dec6a4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 02:42:50 -0500 Subject: [PATCH 0114/1370] Apply specific menu item types --- Marlin/src/lcd/menu/menu_main.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 9a1d2ece68..fd86aaf112 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -138,13 +138,11 @@ void menu_main() { if (card_detected) { if (!card_open) { SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); - MENU_ITEM(gcode, - #if PIN_EXISTS(SD_DETECT) - MSG_CHANGE_MEDIA, M21_STR - #else - MSG_RELEASE_MEDIA, PSTR("M22") - #endif - ); + #if PIN_EXISTS(SD_DETECT) + GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); + #else + GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); + #endif } } else { @@ -172,7 +170,7 @@ void menu_main() { #endif #if HAS_POWER_MONITOR - MENU_ITEM(submenu, MSG_POWER_MONITOR, menu_power_monitor); + SUBMENU(MSG_POWER_MONITOR, menu_power_monitor); #endif #if ENABLED(MIXING_EXTRUDER) @@ -237,13 +235,11 @@ void menu_main() { if (card_detected) { if (!card_open) { - MENU_ITEM(gcode, - #if PIN_EXISTS(SD_DETECT) - MSG_CHANGE_MEDIA, M21_STR - #else - MSG_RELEASE_MEDIA, PSTR("M22") - #endif - ); + #if PIN_EXISTS(SD_DETECT) + GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); + #else + GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); + #endif SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); } } From f860152a35696b196c780184550e5b47004e1e33 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 02:52:05 -0500 Subject: [PATCH 0115/1370] Fix up mixer menu display --- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 1 + Marlin/src/lcd/lcdprint.h | 11 ++-- Marlin/src/lcd/menu/menu_addon.h | 7 ++- Marlin/src/lcd/menu/menu_mixer.cpp | 77 +++++++++++---------------- 4 files changed, 42 insertions(+), 54 deletions(-) diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index d17c336eec..7ebabd6950 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -439,6 +439,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop lcd_put_u8str(value); } } + TERN_(USE_BIG_EDIT_FONT, ui.set_font(FONT_MENU)); } inline void draw_boxed_string(const u8g_uint_t x, const u8g_uint_t y, PGM_P const pstr, const bool inv) { diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 00139808ae..031d467bf9 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -76,8 +76,8 @@ #define INFO_FONT_HEIGHT (INFO_FONT_ASCENT + INFO_FONT_DESCENT) #define INFO_FONT_WIDTH 6 - #define SETCURSOR(col, row) lcd_moveto(col * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) - #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) + #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) + #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) #else @@ -94,12 +94,13 @@ #define LCD_PIXEL_WIDTH LCD_WIDTH #define LCD_PIXEL_HEIGHT LCD_HEIGHT - #define SETCURSOR(col, row) lcd_moveto(col, row) - #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_WIDTH - (len), row) + #define SETCURSOR(col, row) lcd_moveto(col, row) + #define SETCURSOR_RJ(len, row) SETCURSOR(LCD_WIDTH - (len), row) #endif -#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) +#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) +#define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr) #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) int lcd_glyph_height(); diff --git a/Marlin/src/lcd/menu/menu_addon.h b/Marlin/src/lcd/menu/menu_addon.h index b6eb8e1634..73e7061bf3 100644 --- a/Marlin/src/lcd/menu/menu_addon.h +++ b/Marlin/src/lcd/menu/menu_addon.h @@ -23,8 +23,11 @@ #include "../lcdprint.h" -#define MENU_ITEM_ADDON_START(X) do{ \ +#define _MENU_ITEM_ADDON_START(N,X) do{ \ if (ui.should_draw() && _menuLineNr == _thisItemNr - 1) { \ - SETCURSOR_X(X) + N(X) + +#define MENU_ITEM_ADDON_START(X) _MENU_ITEM_ADDON_START(SETCURSOR_X, X) +#define MENU_ITEM_ADDON_START_RJ(X) _MENU_ITEM_ADDON_START(SETCURSOR_X_RJ, X) #define MENU_ITEM_ADDON_END() } }while(0) diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index 2bcde1c286..abb56e4c5a 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -37,52 +37,33 @@ #if ENABLED(GRADIENT_MIX) - void lcd_mixer_gradient_z_start_edit() { + void _lcd_mixer_gradient_z_edit(const bool isend) { ui.defer_status_screen(); ENCODER_RATE_MULTIPLY(true); - if (ui.encoderPosition != 0) { - mixer.gradient.start_z += float(int32_t(ui.encoderPosition)) * 0.1; + + float &zvar = isend ? mixer.gradient.end_z : mixer.gradient.start_z; + + if (ui.encoderPosition) { + zvar += float(int32_t(ui.encoderPosition)) * 0.1; ui.encoderPosition = 0; - NOLESS(mixer.gradient.start_z, 0); - NOMORE(mixer.gradient.start_z, Z_MAX_POS); + NOLESS(zvar, 0); + NOMORE(zvar, Z_MAX_POS); } + if (ui.should_draw()) { - char tmp[21]; - strcpy_P(tmp, GET_TEXT(MSG_START_Z)); - sprintf_P(tmp + strlen(tmp), PSTR(": %4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10); - SETCURSOR(2, (LCD_HEIGHT - 1) / 2); + char tmp[16]; + SETCURSOR(1, (LCD_HEIGHT - 1) / 2); + lcd_put_u8str_P(isend ? GET_TEXT(MSG_END_Z) : GET_TEXT(MSG_START_Z)); + sprintf_P(tmp, PSTR("%4d.%d mm"), int(zvar), int(zvar * 10) % 10); + SETCURSOR_RJ(9, (LCD_HEIGHT - 1) / 2); lcd_put_u8str(tmp); } if (ui.lcd_clicked) { - if (mixer.gradient.start_z > mixer.gradient.end_z) - mixer.gradient.end_z = mixer.gradient.start_z; - mixer.refresh_gradient(); - ui.goto_previous_screen(); - } - } - - void lcd_mixer_gradient_z_end_edit() { - ui.defer_status_screen(); - ENCODER_RATE_MULTIPLY(true); - if (ui.encoderPosition != 0) { - mixer.gradient.end_z += float(int32_t(ui.encoderPosition)) * 0.1; - ui.encoderPosition = 0; - NOLESS(mixer.gradient.end_z, 0); - NOMORE(mixer.gradient.end_z, Z_MAX_POS); - } - - if (ui.should_draw()) { - char tmp[21]; - strcpy_P(tmp, GET_TEXT(MSG_END_Z)); - sprintf_P(tmp + strlen(tmp), PSTR(": %4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10); - SETCURSOR(2, (LCD_HEIGHT - 1) / 2); - lcd_put_u8str(tmp); - } - - if (ui.lcd_clicked) { - if (mixer.gradient.end_z < mixer.gradient.start_z) - mixer.gradient.start_z = mixer.gradient.end_z; + if (isend && zvar < mixer.gradient.start_z) + mixer.gradient.start_z = zvar; + else if (!isend && zvar > mixer.gradient.end_z) + mixer.gradient.end_z = zvar; mixer.refresh_gradient(); ui.goto_previous_screen(); } @@ -96,19 +77,21 @@ EDIT_ITEM(int8, MSG_END_VTOOL, &mixer.gradient.end_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); #if ENABLED(GRADIENT_VTOOL) - EDIT_ITEM(int8, MSG_GRADIENT_ALIAS, &mixer.gradient.vtool_index, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); + EDIT_ITEM(int8, MSG_GRADIENT_ALIAS, &mixer.gradient.vtool_index, -1, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); #endif char tmp[18]; - SUBMENU(MSG_START_Z, lcd_mixer_gradient_z_start_edit); - MENU_ITEM_ADDON_START(9); + PGM_P const slabel = GET_TEXT(MSG_START_Z); + SUBMENU_P(slabel, []{ _lcd_mixer_gradient_z_edit(false); }); + MENU_ITEM_ADDON_START_RJ(11); sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); - SUBMENU(MSG_END_Z, lcd_mixer_gradient_z_end_edit); - MENU_ITEM_ADDON_START(9); + PGM_P const elabel = GET_TEXT(MSG_END_Z); + SUBMENU_P(elabel, []{ _lcd_mixer_gradient_z_edit(true); }); + MENU_ITEM_ADDON_START_RJ(11); sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); @@ -125,7 +108,7 @@ static uint8_t v_index; char tmp[20]; // "100%_100%" sprintf_P(tmp, PSTR("%3d%% %3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); SETCURSOR(2, y); lcd_put_u8str_P(GET_TEXT(MSG_MIX)); - SETCURSOR_RJ(9, y); lcd_put_u8str(tmp); + SETCURSOR_RJ(10, y); lcd_put_u8str(tmp); } #endif @@ -157,7 +140,7 @@ void lcd_mixer_mix_edit() { #if HAS_DUAL_MIXING && !CHANNEL_MIX_EDITING // Adjust 2-channel mix from the encoder - if (ui.encoderPosition != 0) { + if (ui.encoderPosition) { mixer.mix[0] += int32_t(ui.encoderPosition); ui.encoderPosition = 0; if (mixer.mix[0] < 0) mixer.mix[0] += 101; @@ -241,9 +224,9 @@ void menu_mixer() { #if HAS_DUAL_MIXING { - char tmp[10]; + char tmp[11]; SUBMENU(MSG_MIX, lcd_mixer_mix_edit); - MENU_ITEM_ADDON_START(10); + MENU_ITEM_ADDON_START_RJ(9); mixer.update_mix_from_vtool(); sprintf_P(tmp, PSTR("%3d;%3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); lcd_put_u8str(tmp); @@ -272,7 +255,7 @@ void menu_mixer() { { char tmp[13]; SUBMENU(MSG_GRADIENT, lcd_mixer_edit_gradient_menu); - MENU_ITEM_ADDON_START(10); + MENU_ITEM_ADDON_START_RJ(9); sprintf_P(tmp, PSTR("T%i->T%i"), mixer.gradient.start_vtool, mixer.gradient.end_vtool); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); From 737a5453d9ec6ceb7b3b1e6767aa5cfb64cbc4b2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 16:22:53 -0500 Subject: [PATCH 0116/1370] Allow 'ghtp' to set a specific remote --- buildroot/share/git/ghtp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/buildroot/share/git/ghtp b/buildroot/share/git/ghtp index 3c0e21e371..14afd8a27b 100755 --- a/buildroot/share/git/ghtp +++ b/buildroot/share/git/ghtp @@ -5,13 +5,15 @@ # Set all remotes in the current repo to HTTPS or SSH connection. # Useful when switching environments, using public wifi, etc. # +# Optionally, specify a particular remote to change. +# GH_SSH="git@github\.com:" GH_HTTPS="https:\/\/github\.com\/" case "$1" in - -[Hh]) TYPE=HTTPS ; MATCH="git@" ; FORMULA="$GH_SSH/$GH_HTTPS" ;; - -[Ss]) TYPE=SSH ; MATCH="https:" ; FORMULA="$GH_HTTPS/$GH_SSH" ;; + -[Hh]) TYPE=HTTPS ; MATCH="git@" ; REPLACE="$GH_SSH/$GH_HTTPS" ;; + -[Ss]) TYPE=SSH ; MATCH="https:" ; REPLACE="$GH_HTTPS/$GH_SSH" ;; *) echo "Usage: `basename $0` -h | -s" 1>&2 echo -e " \e[0;92m-h\e[0m to switch to HTTPS" 1>&2 @@ -22,12 +24,14 @@ esac AWK=$(which gawk || which awk) -REMOTES=$(git remote -v | egrep "\t$MATCH" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") +# Match all or specified remotes of the other type +REGEX="\t$MATCH" ; [[ $# > 1 ]] && REGEX="^$2$REGEX" -if [[ -z $REMOTES ]]; then - echo "Nothing to do." ; exit -fi +REMOTES=$(git remote -v | egrep "$REGEX" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$REPLACE/") +[[ -z $REMOTES ]] && { echo "Nothing to do." ; exit ; } + +# Update a remote for each results pair echo "$REMOTES" | xargs -n2 git remote set-url echo -n "Remotes set to $TYPE: " From 24636eb7f1ab40769ee6c1f2fcb77a3aeb68fa86 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 21 Aug 2020 15:04:32 -0700 Subject: [PATCH 0117/1370] Fix M512 comment (#19108) --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index dc0416d516..7f7931ae7d 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1667,7 +1667,7 @@ #define PASSWORD_LENGTH 4 // (#) Number of digits (1-9). 3 or 4 is recommended #define PASSWORD_ON_STARTUP #define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P command. Disable to prevent brute-force attack. - #define PASSWORD_CHANGE_GCODE // Change the password with M512 P N. + #define PASSWORD_CHANGE_GCODE // Change the password with M512 P S. //#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent gcodes from running //#define PASSWORD_AFTER_SD_PRINT_END //#define PASSWORD_AFTER_SD_PRINT_ABORT From a1bdc1974aa9021a0cad8a76878a3eb8b1b39af7 Mon Sep 17 00:00:00 2001 From: BigTreeTech <38851044+bigtreetech@users.noreply.github.com> Date: Sat, 22 Aug 2020 06:06:51 +0800 Subject: [PATCH 0118/1370] Broadcast SD Print Completion (#19102) --- Marlin/src/gcode/sd/M1001.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 54bc452f97..b28429f631 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -75,7 +75,10 @@ void GcodeSuite::M1001() { TERN_(POWER_LOSS_RECOVERY, recovery.purge()); // Announce SD file completion - SERIAL_ECHOLNPGM(STR_FILE_PRINTED); + { + PORT_REDIRECT(SERIAL_BOTH); + SERIAL_ECHOLNPGM(STR_FILE_PRINTED); + } // Update the status LED color #if HAS_LEDS_OFF_FLAG From fd0a3df315a5597357acdee72e4978548e969053 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 05:21:34 -0500 Subject: [PATCH 0119/1370] Header for individual menus --- Marlin/src/lcd/menu/menu.cpp | 11 - Marlin/src/lcd/menu/menu.h | 449 +----------------- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_backlash.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 2 +- Marlin/src/lcd/menu/menu_cancelobject.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/lcd/menu/menu_custom.cpp | 2 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 +- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_game.cpp | 2 +- Marlin/src/lcd/menu/menu_info.cpp | 2 +- Marlin/src/lcd/menu/menu_item.h | 450 +++++++++++++++++++ Marlin/src/lcd/menu/menu_job_recovery.cpp | 2 +- Marlin/src/lcd/menu/menu_led.cpp | 2 +- Marlin/src/lcd/menu/menu_main.cpp | 2 +- Marlin/src/lcd/menu/menu_media.cpp | 2 +- Marlin/src/lcd/menu/menu_mixer.cpp | 2 +- Marlin/src/lcd/menu/menu_mmu2.cpp | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_password.cpp | 2 +- Marlin/src/lcd/menu/menu_power_monitor.cpp | 2 +- Marlin/src/lcd/menu/menu_spindle_laser.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 2 +- Marlin/src/lcd/menu/menu_tmc.cpp | 2 +- Marlin/src/lcd/menu/menu_touch_screen.cpp | 2 +- Marlin/src/lcd/menu/menu_tune.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 5 +- Marlin/src/lcd/ultralcd.cpp | 2 + Marlin/src/lcd/ultralcd.h | 3 + 32 files changed, 494 insertions(+), 478 deletions(-) create mode 100644 Marlin/src/lcd/menu/menu_item.h diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 3a3cd0934b..309ad06a4c 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -99,12 +99,6 @@ void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_b return_to_status(); } -//////////////////////////////////////////// -/////////// Common Menu Actions //////////// -//////////////////////////////////////////// - -void MenuItem_gcode::action(PGM_P const, PGM_P const pgcode) { queue.inject_P(pgcode); } - //////////////////////////////////////////// /////////// Menu Editing Actions /////////// //////////////////////////////////////////// @@ -193,11 +187,6 @@ DEFINE_MENU_EDIT_ITEM(float52sign); // +123.45 DEFINE_MENU_EDIT_ITEM(long5); // 12345 right-justified DEFINE_MENU_EDIT_ITEM(long5_25); // 12345 right-justified (25 increment) -void MenuItem_bool::action(PGM_P const, bool * const ptr, screenFunc_t callback) { - *ptr ^= true; ui.refresh(); - if (callback) (*callback)(); -} - //////////////////////////////////////////// ///////////////// Menu Tree //////////////// //////////////////////////////////////////// diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 3a29a87d5e..c457eaf295 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -43,14 +43,6 @@ typedef void (*selectFunc_t)(); void _lcd_zoffset_overlay_gfx(const float zvalue); #endif -#if HAS_BED_PROBE - #if Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 - #define LCD_Z_OFFSET_TYPE float43 // Values from -9.000 to +9.000 - #else - #define LCD_Z_OFFSET_TYPE float42_52 // Values from -99.99 to 99.99 - #endif -#endif - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) && Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 #define BABYSTEP_TO_STR(N) ftostr43sign(N) #elif ENABLED(BABYSTEPPING) @@ -81,13 +73,14 @@ class MenuItemBase { } }; +// STATIC_ITEM(LABEL,...) class MenuItem_static : public MenuItemBase { public: static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const vstr=nullptr); }; -// CONFIRM_ITEM(LABEL,Y,N,FY,FN,V...), -// YESNO_ITEM(LABEL,FY,FN,V...) +// CONFIRM_ITEM(LABEL,Y,N,FY,FN,...), +// YESNO_ITEM(LABEL,FY,FN,...) class MenuItem_confirm : public MenuItemBase { public: FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { @@ -123,60 +116,6 @@ class MenuItem_confirm : public MenuItemBase { } }; -// BACK_ITEM(LABEL) -class MenuItem_back : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { - _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); - } - // Back Item action goes back one step in history - FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } -}; - -// SUBMENU(LABEL, screen_handler) -class MenuItem_submenu : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]); - } - static inline void action(PGM_P const, const screenFunc_t func) { ui.save_previous_screen(); ui.goto_screen(func); } -}; - -// Any menu item that invokes an immediate action -class MenuItem_button : public MenuItemBase { - public: - // Button-y Items are selectable lines with no other indicator - static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', ' '); - } -}; - -// GCODES_ITEM(LABEL, GCODES) -class MenuItem_gcode : public MenuItem_button { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', ' '); - } - static void action(PGM_P const, const char * const pgcode); - static inline void action(PGM_P const pstr, const uint8_t, const char * const pgcode) { action(pstr, pgcode); } -}; - -// ACTION_ITEM(LABEL, FUNC) -class MenuItem_function : public MenuItem_button { - public: - //static inline void action(PGM_P const, const uint8_t, const menuAction_t func) { (*func)(); }; - static inline void action(PGM_P const, const menuAction_t func) { (*func)(); }; -}; - -#if ENABLED(SDSUPPORT) - class CardReader; - class MenuItem_sdbase { - public: - // Implemented for HD44780 and DOGM - static void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard, const bool isDir); - }; -#endif - //////////////////////////////////////////// ///////////// Edit Menu Items ////////////// //////////////////////////////////////////// @@ -233,361 +172,15 @@ class MenuEditItemBase : public MenuItemBase { static inline void draw_edit_screen(const char* const value) { draw_edit_screen(editLabel, value); } }; -// Template for specific Menu Edit Item Types -template -class TMenuEditItem : MenuEditItemBase { - private: - typedef typename NAME::type_t type_t; - static inline float scale(const float value) { return NAME::scale(value); } - static inline float unscale(const float value) { return NAME::unscale(value); } - static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } - static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); } - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t * const data, ...) { - MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(*(data))); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t (*pget)(), ...) { - MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(pget())); - } - // Edit screen for this type of item - static void edit_screen() { MenuEditItemBase::edit_screen(to_string, load); } - static void action( - PGM_P const pstr, // Edit label - type_t * const ptr, // Value pointer - const type_t minValue, // Value range - const type_t maxValue, - const screenFunc_t callback=nullptr, // Value update callback - const bool live=false // Callback during editing - ) { - // Make sure minv and maxv fit within int32_t - const int32_t minv = _MAX(scale(minValue), INT32_MIN), - maxv = _MIN(scale(maxValue), INT32_MAX); - goto_edit_screen(pstr, ptr, minv, maxv - minv, scale(*ptr) - minv, - edit_screen, callback, live); - } -}; - -// Provide a set of Edit Item Types which encompass a primitive -// type, a string function, and a scale factor for edit and display. -// These items call the Edit Item draw method passing the prepared string. -#define __DOFIXfloat PROBE() -#define _DOFIX(TYPE,V) TYPE(TERN(IS_PROBE(__DOFIX##TYPE),FIXFLOAT(V),(V))) -#define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, V...) \ - struct MenuEditItemInfo_##NAME { \ - typedef TYPE type_t; \ - static inline float scale(const float value) { return value * (SCALE) + (V+0); } \ - static inline float unscale(const float value) { return value / (SCALE) + (V+0); } \ - static inline const char* strfunc(const float value) { return STRFUNC(_DOFIX(TYPE,value)); } \ - }; \ - typedef TMenuEditItem MenuItem_##NAME - -// NAME TYPE STRFUNC SCALE +ROUND -DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, 0.5f); // 100% right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint8 ,uint8_t ,ui8tostr3rj , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_3 ,uint16_t ,ui16tostr3rj , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_4 ,uint16_t ,ui16tostr4rj , 0.1f ); // 1234 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3 , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 ); // _2.34, 12.34, -2.34 or 123.45, -23.45 -DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); // -1.234, _1.234, +1.234 -DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) -DEFINE_MENU_EDIT_ITEM_TYPE(float51 ,float ,ftostr51rj , 10 ); // 1234.5 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 ); // +12.3 -DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 ); // +123.4 -DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 ); // +1234.5 -DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 ); // +123.45 -DEFINE_MENU_EDIT_ITEM_TYPE(long5 ,uint32_t ,ftostr5rj , 0.01f ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(long5_25 ,uint32_t ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) - -class MenuItem_bool : public MenuEditItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const bool onoff) { - MenuEditItemBase::draw(sel, row, pstr, onoff ? GET_TEXT(MSG_LCD_ON) : GET_TEXT(MSG_LCD_OFF), true); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, bool * const data, ...) { - draw(sel, row, pstr, *data); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, PGM_P const, bool (*pget)(), ...) { - draw(sel, row, pstr, pget()); - } - static void action(PGM_P const pstr, bool * const ptr, const screenFunc_t callbackFunc=nullptr); -}; - -//////////////////////////////////////////// -//////////// Menu System Macros //////////// -//////////////////////////////////////////// - -/** - * Marlin's native menu screens work by running a loop from the top visible line index - * to the bottom visible line index (according to how much the screen has been scrolled). - * This complete loop is done on every menu screen call. - * - * The menu system is highly dynamic, so it doesn't know ahead of any menu loop which - * items will be visible or hidden, so menu items don't have a fixed index number. - * - * During the loop, each menu item checks to see if its line is the current one. If it is, - * then it checks to see if a click has arrived so it can run its action. If the action - * doesn't redirect to another screen then the menu item calls its draw method. - * - * Menu item add-ons can do whatever they like. - * - * This mixture of drawing and processing inside a loop has the advantage that a single - * line can be used to represent a menu item, and that is the rationale for this design. - * - * One of the pitfalls of this method is that DOGM displays call the screen handler 2x, - * 4x, or 8x per screen update to draw just one segment of the screen. As a result, any - * menu item that exists in two screen segments is drawn and processed twice per screen - * update. With each item processed 5, 10, 20, or 40 times the logic has to be simple. - * - * To avoid repetition and side-effects, function calls for testing menu item conditions - * should be done before the menu loop (START_MENU / START_SCREEN). - */ - -/** - * SCREEN_OR_MENU_LOOP generates header code for a screen or menu - * - * encoderTopLine is the top menu line to display - * _lcdLineNr is the index of the LCD line (e.g., 0-3) - * _menuLineNr is the menu item to draw and process - * _thisItemNr is the index of each MENU_ITEM or STATIC_ITEM - */ -#define SCREEN_OR_MENU_LOOP(IS_MENU) \ - scroll_screen(IS_MENU ? 1 : LCD_HEIGHT, IS_MENU); \ - int8_t _menuLineNr = encoderTopLine, _thisItemNr = 0; \ - bool _skipStatic = IS_MENU; UNUSED(_thisItemNr); \ - for (int8_t _lcdLineNr = 0; _lcdLineNr < LCD_HEIGHT; _lcdLineNr++, _menuLineNr++) { \ - _thisItemNr = 0 - -/** - * START_SCREEN Opening code for a screen having only static items. - * Do simplified scrolling of the entire screen. - * - * START_MENU Opening code for a screen with menu items. - * Scroll as-needed to keep the selected line in view. - */ -#define START_SCREEN() SCREEN_OR_MENU_LOOP(false) -#define START_MENU() SCREEN_OR_MENU_LOOP(true) -#define NEXT_ITEM() (++_thisItemNr) -#define SKIP_ITEM() NEXT_ITEM() -#define END_SCREEN() } screen_items = _thisItemNr -#define END_MENU() END_SCREEN(); UNUSED(_skipStatic) - -#if ENABLED(ENCODER_RATE_MULTIPLIER) - #define ENCODER_RATE_MULTIPLY(F) (ui.encoderRateMultiplierEnabled = F) - #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) do{ if (USE_MULTIPLIER) ui.enable_encoder_multiplier(true); }while(0) - //#define ENCODER_RATE_MULTIPLIER_DEBUG // If defined, output the encoder steps per second value -#else - #define ENCODER_RATE_MULTIPLY(F) NOOP - #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) +#if ENABLED(SDSUPPORT) + class CardReader; + class MenuItem_sdbase { + public: + // Implemented for HD44780 and DOGM + static void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard, const bool isDir); + }; #endif -/** - * MENU_ITEM generates draw & handler code for a menu item, potentially calling: - * - * MenuItem_::draw(sel, row, label, arg3...) - * MenuItem_::action(arg3...) - * - * Examples: - * BACK_ITEM(MSG_INFO_SCREEN) - * MenuItem_back::action(plabel, ...) - * MenuItem_back::draw(sel, row, plabel, ...) - * - * ACTION_ITEM(MSG_PAUSE_PRINT, lcd_sdcard_pause) - * MenuItem_function::action(plabel, lcd_sdcard_pause) - * MenuItem_function::draw(sel, row, plabel, lcd_sdcard_pause) - * - * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) - * MenuItem_int3::action(plabel, &feedrate_percentage, 10, 999) - * MenuItem_int3::draw(sel, row, plabel, &feedrate_percentage, 10, 999) - */ - -#define _MENU_INNER_P(TYPE, USE_MULTIPLIER, PLABEL, V...) do { \ - PGM_P const plabel = PLABEL; \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ - MenuItem_##TYPE::action(plabel, ##V); \ - if (ui.screen_changed) return; \ - } \ - if (ui.should_draw()) \ - MenuItem_##TYPE::draw \ - (encoderLine == _thisItemNr, _lcdLineNr, plabel, ##V); \ -}while(0) - -#define _MENU_ITEM_P(TYPE, V...) do { \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value and optional data -#define _MENU_ITEM_N_S_P(TYPE, N, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::init(N, S); \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _MENU_ITEM_N_P(TYPE, N, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::itemIndex = N; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Items with a unique string -#define _MENU_ITEM_S_P(TYPE, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::itemString = S; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// STATIC_ITEM draws a styled string with no highlight. -// Parameters: label [, style [, char *value] ] - -#define STATIC_ITEM_INNER_P(PLABEL, V...) do{ \ - if (_skipStatic && encoderLine <= _thisItemNr) { \ - ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ - ++encoderLine; \ - } \ - if (ui.should_draw()) \ - MenuItem_static::draw(_lcdLineNr, PLABEL, ##V); \ -} while(0) - -#define STATIC_ITEM_P(PLABEL, V...) do{ \ - if (_menuLineNr == _thisItemNr) \ - STATIC_ITEM_INNER_P(PLABEL, ##V); \ - NEXT_ITEM(); \ -} while(0) - -#define STATIC_ITEM_N_P(PLABEL, N, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - MenuItemBase::init(N); \ - STATIC_ITEM_INNER_P(PLABEL, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) -#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) - -#define MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, false, PLABEL, ##V) -#define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, false, PLABEL, ##V) -#define MENU_ITEM_S(TYPE, S, LABEL, V...) MENU_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, false, PLABEL, ##V) -#define MENU_ITEM_N(TYPE, N, LABEL, V...) MENU_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) -#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) - -#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) - -#define ACTION_ITEM_N_S_P(N, S, PLABEL, ACTION) MENU_ITEM_N_S_P(function, N, S, PLABEL, ACTION) -#define ACTION_ITEM_N_S(N, S, LABEL, ACTION) ACTION_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_S_P(S, PLABEL, ACTION) MENU_ITEM_S_P(function, S, PLABEL, ACTION) -#define ACTION_ITEM_S(S, LABEL, ACTION) ACTION_ITEM_S_P(S, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_N_P(N, PLABEL, ACTION) MENU_ITEM_N_P(function, N, PLABEL, ACTION) -#define ACTION_ITEM_N(N, LABEL, ACTION) ACTION_ITEM_N_P(N, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_P(PLABEL, ACTION) MENU_ITEM_P(function, PLABEL, ACTION) -#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_P(GET_TEXT(LABEL), ACTION) - -#define GCODES_ITEM_N_S_P(N, S, PLABEL, GCODES) MENU_ITEM_N_S_P(gcode, N, S, PLABEL, GCODES) -#define GCODES_ITEM_N_S(N, S, LABEL, GCODES) GCODES_ITEM_N_S_P(N, S, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_S_P(S, PLABEL, GCODES) MENU_ITEM_S_P(gcode, S, PLABEL, GCODES) -#define GCODES_ITEM_S(S, LABEL, GCODES) GCODES_ITEM_S_P(S, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_N_P(N, PLABEL, GCODES) MENU_ITEM_N_P(gcode, N, PLABEL, GCODES) -#define GCODES_ITEM_N(N, LABEL, GCODES) GCODES_ITEM_N_P(N, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_P(PLABEL, GCODES) MENU_ITEM_P(gcode, PLABEL, GCODES) -#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_P(GET_TEXT(LABEL), GCODES) - -#define SUBMENU_N_S_P(N, S, PLABEL, DEST) MENU_ITEM_N_S_P(submenu, N, S, PLABEL, DEST) -#define SUBMENU_N_S(N, S, LABEL, DEST) SUBMENU_N_S_P(N, S, GET_TEXT(LABEL), DEST) -#define SUBMENU_S_P(S, PLABEL, DEST) MENU_ITEM_S_P(submenu, S, PLABEL, DEST) -#define SUBMENU_S(S, LABEL, DEST) SUBMENU_S_P(S, GET_TEXT(LABEL), DEST) -#define SUBMENU_N_P(N, PLABEL, DEST) MENU_ITEM_N_P(submenu, N, PLABEL, DEST) -#define SUBMENU_N(N, LABEL, DEST) SUBMENU_N_P(N, GET_TEXT(LABEL), DEST) -#define SUBMENU_P(PLABEL, DEST) MENU_ITEM_P(submenu, PLABEL, DEST) -#define SUBMENU(LABEL, DEST) SUBMENU_P(GET_TEXT(LABEL), DEST) - -#define EDIT_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, ##V) -#define EDIT_ITEM_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_S_P(TYPE, S, PLABEL, V...) MENU_ITEM_S_P(TYPE, S, PLABEL, ##V) -#define EDIT_ITEM_S(TYPE, S, LABEL, V...) EDIT_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_N_P(TYPE, N, PLABEL, V...) MENU_ITEM_N_P(TYPE, N, PLABEL, ##V) -#define EDIT_ITEM_N(TYPE, N, LABEL, V...) EDIT_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_P(TYPE, PLABEL, V...) MENU_ITEM_P(TYPE, PLABEL, ##V) -#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) - -#define EDIT_ITEM_FAST_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_FAST_N_S_P(TYPE, N, S, true, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_S(TYPE, S, LABEL, V...) EDIT_ITEM_FAST_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_N(TYPE, N, LABEL, V...) EDIT_ITEM_FAST_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, true, PLABEL, ##V) -#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_P(TYPE, GET_TEXT(LABEL), ##V) - -#define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - ui.save_previous_screen(); \ - ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ - return; \ - } \ - if (ui.should_draw()) MenuItem_confirm::draw \ - (encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ##V); \ -}while(0) - -// Indexed items set a global index value and optional data -#define _CONFIRM_ITEM_P(PLABEL, V...) do { \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _CONFIRM_ITEM_N_S_P(N, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::init(N, S); \ - _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _CONFIRM_ITEM_N_P(N, V...) _CONFIRM_ITEM_N_S_P(N, nullptr, V) - -#define CONFIRM_ITEM_P(PLABEL,A,B,V...) _CONFIRM_ITEM_P(PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM(LABEL, V...) CONFIRM_ITEM_P(GET_TEXT(LABEL), ##V) - -#define YESNO_ITEM_P(PLABEL, V...) _CONFIRM_ITEM_P(PLABEL, ##V) -#define YESNO_ITEM(LABEL, V...) YESNO_ITEM_P(GET_TEXT(LABEL), ##V) - -#define CONFIRM_ITEM_N_S_P(N,S,PLABEL,A,B,V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM_N_S(N,S,LABEL,V...) CONFIRM_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) -#define CONFIRM_ITEM_N_P(N,PLABEL,A,B,V...) _CONFIRM_ITEM_N_P(N, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM_N(N,LABEL, V...) CONFIRM_ITEM_N_P(N, GET_TEXT(LABEL), ##V) - -#define YESNO_ITEM_N_S_P(N,S,PLABEL, V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, ##V) -#define YESNO_ITEM_N_S(N,S,LABEL, V...) YESNO_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) -#define YESNO_ITEM_N_P(N,PLABEL, V...) _CONFIRM_ITEM_N_P(N, PLABEL, ##V) -#define YESNO_ITEM_N(N,LABEL, V...) YESNO_ITEM_N_P(N, GET_TEXT(LABEL), ##V) - //////////////////////////////////////////// /////////////// Menu Screens /////////////// //////////////////////////////////////////// @@ -599,20 +192,10 @@ void menu_move(); void menu_media(); #endif -// First Fan Speed title in "Tune" and "Control>Temperature" menus -#if HAS_FAN && HAS_FAN0 - #if FAN_COUNT > 1 - #define FAN_SPEED_1_SUFFIX " 1" - #else - #define FAN_SPEED_1_SUFFIX "" - #endif -#endif - //////////////////////////////////////////// //////// Menu Item Helper Functions //////// //////////////////////////////////////////// -void lcd_move_z(); void _lcd_draw_homing(); #define HAS_LINE_TO_Z ANY(DELTA, PROBE_MANUALLY, MESH_BED_LEVELING, LEVEL_BED_CORNERS) @@ -625,10 +208,6 @@ void _lcd_draw_homing(); void _lcd_zoffset_overlay_gfx(const float zvalue); #endif -#if ENABLED(LEVEL_BED_CORNERS) - void _lcd_level_bed_corners(); -#endif - #if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) void _lcd_toggle_bed_leveling(); #endif @@ -651,11 +230,3 @@ void _lcd_draw_homing(); #endif #endif - -#if ENABLED(POWER_LOSS_RECOVERY) - void menu_job_recovery(); -#endif - -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - void touch_screen_calibration(); -#endif diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 942fb67569..9978bc7eab 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #include "../../module/planner.h" #if DISABLED(NO_VOLUMETRICS) diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp index 2aad9a415f..0e1bfb5910 100644 --- a/Marlin/src/lcd/menu/menu_backlash.cpp +++ b/Marlin/src/lcd/menu/menu_backlash.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, BACKLASH_GCODE) -#include "menu.h" +#include "menu_item.h" #include "../../feature/backlash.h" diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 6dbe7c6d18..16f9992c18 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, LEVEL_BED_CORNERS) -#include "menu.h" +#include "menu_item.h" #include "../../module/motion.h" #include "../../module/planner.h" diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 3796f44ff6..6841561c1b 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -28,7 +28,7 @@ #if ENABLED(LCD_BED_LEVELING) -#include "menu.h" +#include "menu_item.h" #include "../../module/planner.h" #include "../../feature/bedlevel/bedlevel.h" diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp index 55b88c45b0..a8ced05759 100644 --- a/Marlin/src/lcd/menu/menu_cancelobject.cpp +++ b/Marlin/src/lcd/menu/menu_cancelobject.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, CANCEL_OBJECTS) -#include "menu.h" +#include "menu_item.h" #include "menu_addon.h" #include "../../feature/cancel_object.h" diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index e834009f77..32fedce237 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #if HAS_FILAMENT_SENSOR #include "../../feature/runout.h" diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp index 729254cda4..7c54ec6e26 100644 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ b/Marlin/src/lcd/menu/menu_custom.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, CUSTOM_USER_MENUS) -#include "menu.h" +#include "menu_item.h" #include "../../gcode/queue.h" #ifdef USER_SCRIPT_DONE diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index 6b99355a60..705ec41611 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) -#include "menu.h" +#include "menu_item.h" #include "../../module/delta.h" #include "../../module/motion.h" diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 1b11438f4c..316b2bc782 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) -#include "menu.h" +#include "menu_item.h" #include "../../module/temperature.h" #include "../../feature/pause.h" #include "../../gcode/queue.h" diff --git a/Marlin/src/lcd/menu/menu_game.cpp b/Marlin/src/lcd/menu/menu_game.cpp index 21e101404a..fa56d7eee2 100644 --- a/Marlin/src/lcd/menu/menu_game.cpp +++ b/Marlin/src/lcd/menu/menu_game.cpp @@ -24,7 +24,7 @@ #if HAS_GAME_MENU -#include "menu.h" +#include "menu_item.h" #include "game/game.h" void menu_game() { diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index b94be2e53f..2fe8ccbab6 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, LCD_INFO_MENU) -#include "menu.h" +#include "menu_item.h" #if HAS_GAMES #include "game/game.h" diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h new file mode 100644 index 0000000000..66ed0e402d --- /dev/null +++ b/Marlin/src/lcd/menu/menu_item.h @@ -0,0 +1,450 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "menu.h" +#include "../ultralcd.h" +#include "../../gcode/queue.h" // for inject_P + +#include "../../inc/MarlinConfigPre.h" + +void lcd_move_z(); + +//////////////////////////////////////////// +///////////// Base Menu Items ////////////// +//////////////////////////////////////////// + +// BACK_ITEM(LABEL) +class MenuItem_back : public MenuItemBase { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { + _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); + } + // Back Item action goes back one step in history + FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } +}; + +// SUBMENU(LABEL, screen_handler) +class MenuItem_submenu : public MenuItemBase { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { + _draw(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]); + } + static inline void action(PGM_P const, const screenFunc_t func) { ui.save_previous_screen(); ui.goto_screen(func); } +}; + +// Any menu item that invokes an immediate action +class MenuItem_button : public MenuItemBase { + public: + // Button-y Items are selectable lines with no other indicator + static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { + _draw(sel, row, pstr, '>', ' '); + } +}; + +// ACTION_ITEM(LABEL, FUNC) +class MenuItem_function : public MenuItem_button { + public: + //static inline void action(PGM_P const, const uint8_t, const menuAction_t func) { (*func)(); }; + static inline void action(PGM_P const, const menuAction_t func) { (*func)(); }; +}; + +// GCODES_ITEM(LABEL, GCODES) +class MenuItem_gcode : public MenuItem_button { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { + _draw(sel, row, pstr, '>', ' '); + } + static void action(PGM_P const, PGM_P const pgcode) { queue.inject_P(pgcode); } + static inline void action(PGM_P const pstr, const uint8_t, const char * const pgcode) { action(pstr, pgcode); } +}; + +//////////////////////////////////////////// +///////////// Edit Menu Items ////////////// +//////////////////////////////////////////// + +// Template for specific Menu Edit Item Types +template +class TMenuEditItem : MenuEditItemBase { + private: + typedef typename NAME::type_t type_t; + static inline float scale(const float value) { return NAME::scale(value); } + static inline float unscale(const float value) { return NAME::unscale(value); } + static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } + static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); } + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t * const data, ...) { + MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(*(data))); + } + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t (*pget)(), ...) { + MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(pget())); + } + // Edit screen for this type of item + static void edit_screen() { MenuEditItemBase::edit_screen(to_string, load); } + static void action( + PGM_P const pstr, // Edit label + type_t * const ptr, // Value pointer + const type_t minValue, // Value range + const type_t maxValue, + const screenFunc_t callback=nullptr, // Value update callback + const bool live=false // Callback during editing + ) { + // Make sure minv and maxv fit within int32_t + const int32_t minv = _MAX(scale(minValue), INT32_MIN), + maxv = _MIN(scale(maxValue), INT32_MAX); + goto_edit_screen(pstr, ptr, minv, maxv - minv, scale(*ptr) - minv, + edit_screen, callback, live); + } +}; + +// Provide a set of Edit Item Types which encompass a primitive +// type, a string function, and a scale factor for edit and display. +// These items call the Edit Item draw method passing the prepared string. +#define __DOFIXfloat PROBE() +#define _DOFIX(TYPE,V) TYPE(TERN(IS_PROBE(__DOFIX##TYPE),FIXFLOAT(V),(V))) +#define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, V...) \ + struct MenuEditItemInfo_##NAME { \ + typedef TYPE type_t; \ + static inline float scale(const float value) { return value * (SCALE) + (V+0); } \ + static inline float unscale(const float value) { return value / (SCALE) + (V+0); } \ + static inline const char* strfunc(const float value) { return STRFUNC(_DOFIX(TYPE,value)); } \ + }; \ + typedef TMenuEditItem MenuItem_##NAME + +// NAME TYPE STRFUNC SCALE +ROUND +DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, 0.5f); // 100% right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint8 ,uint8_t ,ui8tostr3rj , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_3 ,uint16_t ,ui16tostr3rj , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_4 ,uint16_t ,ui16tostr4rj , 0.1f ); // 1234 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3 , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 ); // _2.34, 12.34, -2.34 or 123.45, -23.45 +DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); // -1.234, _1.234, +1.234 +DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) +DEFINE_MENU_EDIT_ITEM_TYPE(float51 ,float ,ftostr51rj , 10 ); // 1234.5 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 ); // +12.3 +DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 ); // +123.4 +DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 ); // +1234.5 +DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 ); // +123.45 +DEFINE_MENU_EDIT_ITEM_TYPE(long5 ,uint32_t ,ftostr5rj , 0.01f ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(long5_25 ,uint32_t ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) + +#if HAS_BED_PROBE + #if Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 + #define LCD_Z_OFFSET_TYPE float43 // Values from -9.000 to +9.000 + #else + #define LCD_Z_OFFSET_TYPE float42_52 // Values from -99.99 to 99.99 + #endif +#endif + +class MenuItem_bool : public MenuEditItemBase { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const bool onoff) { + MenuEditItemBase::draw(sel, row, pstr, onoff ? GET_TEXT(MSG_LCD_ON) : GET_TEXT(MSG_LCD_OFF), true); + } + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, bool * const data, ...) { + draw(sel, row, pstr, *data); + } + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, PGM_P const, bool (*pget)(), ...) { + draw(sel, row, pstr, pget()); + } + static void action(PGM_P const pstr, bool * const ptr, const screenFunc_t callbackFunc=nullptr) { + *ptr ^= true; ui.refresh(); + if (callbackFunc) (*callbackFunc)(); + } +}; + +/** + * //////////////////////////////////////////// + * //////////// Menu System Macros //////////// + * //////////////////////////////////////////// + * + * Marlin's native menu screens work by running a loop from the top visible line index + * to the bottom visible line index (according to how much the screen has been scrolled). + * This complete loop is done on every menu screen call. + * + * The menu system is highly dynamic, so it doesn't know ahead of any menu loop which + * items will be visible or hidden, so menu items don't have a fixed index number. + * + * During the loop, each menu item checks to see if its line is the current one. If it is, + * then it checks to see if a click has arrived so it can run its action. If the action + * doesn't redirect to another screen then the menu item calls its draw method. + * + * Menu item add-ons can do whatever they like. + * + * This mixture of drawing and processing inside a loop has the advantage that a single + * line can be used to represent a menu item, and that is the rationale for this design. + * + * One of the pitfalls of this method is that DOGM displays call the screen handler 2x, + * 4x, or 8x per screen update to draw just one segment of the screen. As a result, any + * menu item that exists in two screen segments is drawn and processed twice per screen + * update. With each item processed 5, 10, 20, or 40 times the logic has to be simple. + * + * To avoid repetition and side-effects, function calls for testing menu item conditions + * should be done before the menu loop (START_MENU / START_SCREEN). + */ + +/** + * SCREEN_OR_MENU_LOOP generates header code for a screen or menu + * + * encoderTopLine is the top menu line to display + * _lcdLineNr is the index of the LCD line (e.g., 0-3) + * _menuLineNr is the menu item to draw and process + * _thisItemNr is the index of each MENU_ITEM or STATIC_ITEM + */ +#define SCREEN_OR_MENU_LOOP(IS_MENU) \ + scroll_screen(IS_MENU ? 1 : LCD_HEIGHT, IS_MENU); \ + int8_t _menuLineNr = encoderTopLine, _thisItemNr = 0; \ + bool _skipStatic = IS_MENU; UNUSED(_thisItemNr); \ + for (int8_t _lcdLineNr = 0; _lcdLineNr < LCD_HEIGHT; _lcdLineNr++, _menuLineNr++) { \ + _thisItemNr = 0 + +/** + * START_SCREEN Opening code for a screen having only static items. + * Do simplified scrolling of the entire screen. + * + * START_MENU Opening code for a screen with menu items. + * Scroll as-needed to keep the selected line in view. + */ +#define START_SCREEN() SCREEN_OR_MENU_LOOP(false) +#define START_MENU() SCREEN_OR_MENU_LOOP(true) +#define NEXT_ITEM() (++_thisItemNr) +#define SKIP_ITEM() NEXT_ITEM() +#define END_SCREEN() } screen_items = _thisItemNr +#define END_MENU() END_SCREEN(); UNUSED(_skipStatic) + +/** + * MENU_ITEM generates draw & handler code for a menu item, potentially calling: + * + * MenuItem_::draw(sel, row, label, arg3...) + * MenuItem_::action(arg3...) + * + * Examples: + * BACK_ITEM(MSG_INFO_SCREEN) + * MenuItem_back::action(plabel, ...) + * MenuItem_back::draw(sel, row, plabel, ...) + * + * ACTION_ITEM(MSG_PAUSE_PRINT, lcd_sdcard_pause) + * MenuItem_function::action(plabel, lcd_sdcard_pause) + * MenuItem_function::draw(sel, row, plabel, lcd_sdcard_pause) + * + * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) + * MenuItem_int3::action(plabel, &feedrate_percentage, 10, 999) + * MenuItem_int3::draw(sel, row, plabel, &feedrate_percentage, 10, 999) + */ + +#if ENABLED(ENCODER_RATE_MULTIPLIER) + #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) do{ if (USE_MULTIPLIER) ui.enable_encoder_multiplier(true); }while(0) +#else + #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) +#endif + +#define _MENU_INNER_P(TYPE, USE_MULTIPLIER, PLABEL, V...) do { \ + PGM_P const plabel = PLABEL; \ + if (encoderLine == _thisItemNr && ui.use_click()) { \ + _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ + MenuItem_##TYPE::action(plabel, ##V); \ + if (ui.screen_changed) return; \ + } \ + if (ui.should_draw()) \ + MenuItem_##TYPE::draw \ + (encoderLine == _thisItemNr, _lcdLineNr, plabel, ##V); \ +}while(0) + +#define _MENU_ITEM_P(TYPE, V...) do { \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Indexed items set a global index value and optional data +#define _MENU_ITEM_N_S_P(TYPE, N, S, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + MenuItemBase::init(N, S); \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Indexed items set a global index value +#define _MENU_ITEM_N_P(TYPE, N, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + MenuItemBase::itemIndex = N; \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Items with a unique string +#define _MENU_ITEM_S_P(TYPE, S, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + MenuItemBase::itemString = S; \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// STATIC_ITEM draws a styled string with no highlight. +// Parameters: label [, style [, char *value] ] + +#define STATIC_ITEM_INNER_P(PLABEL, V...) do{ \ + if (_skipStatic && encoderLine <= _thisItemNr) { \ + ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ + ++encoderLine; \ + } \ + if (ui.should_draw()) \ + MenuItem_static::draw(_lcdLineNr, PLABEL, ##V); \ +} while(0) + +#define STATIC_ITEM_P(PLABEL, V...) do{ \ + if (_menuLineNr == _thisItemNr) \ + STATIC_ITEM_INNER_P(PLABEL, ##V); \ + NEXT_ITEM(); \ +} while(0) + +#define STATIC_ITEM_N_P(PLABEL, N, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + MenuItemBase::init(N); \ + STATIC_ITEM_INNER_P(PLABEL, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) +#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) + +#define MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, false, PLABEL, ##V) +#define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, false, PLABEL, ##V) +#define MENU_ITEM_S(TYPE, S, LABEL, V...) MENU_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, false, PLABEL, ##V) +#define MENU_ITEM_N(TYPE, N, LABEL, V...) MENU_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) +#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) + +#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) + +#define ACTION_ITEM_N_S_P(N, S, PLABEL, ACTION) MENU_ITEM_N_S_P(function, N, S, PLABEL, ACTION) +#define ACTION_ITEM_N_S(N, S, LABEL, ACTION) ACTION_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_S_P(S, PLABEL, ACTION) MENU_ITEM_S_P(function, S, PLABEL, ACTION) +#define ACTION_ITEM_S(S, LABEL, ACTION) ACTION_ITEM_S_P(S, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_N_P(N, PLABEL, ACTION) MENU_ITEM_N_P(function, N, PLABEL, ACTION) +#define ACTION_ITEM_N(N, LABEL, ACTION) ACTION_ITEM_N_P(N, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_P(PLABEL, ACTION) MENU_ITEM_P(function, PLABEL, ACTION) +#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_P(GET_TEXT(LABEL), ACTION) + +#define GCODES_ITEM_N_S_P(N, S, PLABEL, GCODES) MENU_ITEM_N_S_P(gcode, N, S, PLABEL, GCODES) +#define GCODES_ITEM_N_S(N, S, LABEL, GCODES) GCODES_ITEM_N_S_P(N, S, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_S_P(S, PLABEL, GCODES) MENU_ITEM_S_P(gcode, S, PLABEL, GCODES) +#define GCODES_ITEM_S(S, LABEL, GCODES) GCODES_ITEM_S_P(S, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_N_P(N, PLABEL, GCODES) MENU_ITEM_N_P(gcode, N, PLABEL, GCODES) +#define GCODES_ITEM_N(N, LABEL, GCODES) GCODES_ITEM_N_P(N, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_P(PLABEL, GCODES) MENU_ITEM_P(gcode, PLABEL, GCODES) +#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_P(GET_TEXT(LABEL), GCODES) + +#define SUBMENU_N_S_P(N, S, PLABEL, DEST) MENU_ITEM_N_S_P(submenu, N, S, PLABEL, DEST) +#define SUBMENU_N_S(N, S, LABEL, DEST) SUBMENU_N_S_P(N, S, GET_TEXT(LABEL), DEST) +#define SUBMENU_S_P(S, PLABEL, DEST) MENU_ITEM_S_P(submenu, S, PLABEL, DEST) +#define SUBMENU_S(S, LABEL, DEST) SUBMENU_S_P(S, GET_TEXT(LABEL), DEST) +#define SUBMENU_N_P(N, PLABEL, DEST) MENU_ITEM_N_P(submenu, N, PLABEL, DEST) +#define SUBMENU_N(N, LABEL, DEST) SUBMENU_N_P(N, GET_TEXT(LABEL), DEST) +#define SUBMENU_P(PLABEL, DEST) MENU_ITEM_P(submenu, PLABEL, DEST) +#define SUBMENU(LABEL, DEST) SUBMENU_P(GET_TEXT(LABEL), DEST) + +#define EDIT_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, ##V) +#define EDIT_ITEM_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_S_P(TYPE, S, PLABEL, V...) MENU_ITEM_S_P(TYPE, S, PLABEL, ##V) +#define EDIT_ITEM_S(TYPE, S, LABEL, V...) EDIT_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_N_P(TYPE, N, PLABEL, V...) MENU_ITEM_N_P(TYPE, N, PLABEL, ##V) +#define EDIT_ITEM_N(TYPE, N, LABEL, V...) EDIT_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_P(TYPE, PLABEL, V...) MENU_ITEM_P(TYPE, PLABEL, ##V) +#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) + +#define EDIT_ITEM_FAST_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_FAST_N_S_P(TYPE, N, S, true, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_S(TYPE, S, LABEL, V...) EDIT_ITEM_FAST_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_N(TYPE, N, LABEL, V...) EDIT_ITEM_FAST_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, true, PLABEL, ##V) +#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_P(TYPE, GET_TEXT(LABEL), ##V) + +#define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ + if (encoderLine == _thisItemNr && ui.use_click()) { \ + ui.save_previous_screen(); \ + ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ + return; \ + } \ + if (ui.should_draw()) MenuItem_confirm::draw \ + (encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ##V); \ +}while(0) + +// Indexed items set a global index value and optional data +#define _CONFIRM_ITEM_P(PLABEL, V...) do { \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Indexed items set a global index value +#define _CONFIRM_ITEM_N_S_P(N, S, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + MenuItemBase::init(N, S); \ + _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Indexed items set a global index value +#define _CONFIRM_ITEM_N_P(N, V...) _CONFIRM_ITEM_N_S_P(N, nullptr, V) + +#define CONFIRM_ITEM_P(PLABEL,A,B,V...) _CONFIRM_ITEM_P(PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) +#define CONFIRM_ITEM(LABEL, V...) CONFIRM_ITEM_P(GET_TEXT(LABEL), ##V) + +#define YESNO_ITEM_P(PLABEL, V...) _CONFIRM_ITEM_P(PLABEL, ##V) +#define YESNO_ITEM(LABEL, V...) YESNO_ITEM_P(GET_TEXT(LABEL), ##V) + +#define CONFIRM_ITEM_N_S_P(N,S,PLABEL,A,B,V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) +#define CONFIRM_ITEM_N_S(N,S,LABEL,V...) CONFIRM_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) +#define CONFIRM_ITEM_N_P(N,PLABEL,A,B,V...) _CONFIRM_ITEM_N_P(N, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) +#define CONFIRM_ITEM_N(N,LABEL, V...) CONFIRM_ITEM_N_P(N, GET_TEXT(LABEL), ##V) + +#define YESNO_ITEM_N_S_P(N,S,PLABEL, V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, ##V) +#define YESNO_ITEM_N_S(N,S,LABEL, V...) YESNO_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) +#define YESNO_ITEM_N_P(N,PLABEL, V...) _CONFIRM_ITEM_N_P(N, PLABEL, ##V) +#define YESNO_ITEM_N(N,LABEL, V...) YESNO_ITEM_N_P(N, GET_TEXT(LABEL), ##V) + +#if ENABLED(LEVEL_BED_CORNERS) + void _lcd_level_bed_corners(); +#endif diff --git a/Marlin/src/lcd/menu/menu_job_recovery.cpp b/Marlin/src/lcd/menu/menu_job_recovery.cpp index a2743ef58b..7cd2949d62 100644 --- a/Marlin/src/lcd/menu/menu_job_recovery.cpp +++ b/Marlin/src/lcd/menu/menu_job_recovery.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, POWER_LOSS_RECOVERY) -#include "menu.h" +#include "menu_item.h" #include "../../gcode/queue.h" #include "../../sd/cardreader.h" #include "../../feature/powerloss.h" diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index b117e0baa1..61ffbfd663 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) -#include "menu.h" +#include "menu_item.h" #if ENABLED(LED_CONTROL_MENU) #include "../../feature/leds/leds.h" diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index fd86aaf112..8908f49fb2 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #include "../../module/temperature.h" #include "../../gcode/queue.h" #include "../../module/printcounter.h" diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index c22314fa9f..3c0c6532f0 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, SDSUPPORT) -#include "menu.h" +#include "menu_item.h" #include "../../sd/cardreader.h" void lcd_sd_updir() { diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index abb56e4c5a..8010239336 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, MIXING_EXTRUDER) -#include "menu.h" +#include "menu_item.h" #include "menu_addon.h" #include "../../feature/mixing.h" diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index 304e958877..0a63d90c63 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -26,7 +26,7 @@ #include "../../feature/mmu2/mmu2.h" #include "menu_mmu2.h" -#include "menu.h" +#include "menu_item.h" uint8_t currentTool; bool mmuMenuWait; diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 622cd091c0..914b229008 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #include "menu_addon.h" #include "../../module/motion.h" diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp index f8e0b56721..c3924b5686 100644 --- a/Marlin/src/lcd/menu/menu_password.cpp +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -30,7 +30,7 @@ #include "../../feature/password/password.h" -#include "menu.h" +#include "menu_item.h" #include "menu_addon.h" void menu_advanced_settings(); diff --git a/Marlin/src/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp index bacf7f379f..e88bdb28d8 100644 --- a/Marlin/src/lcd/menu/menu_power_monitor.cpp +++ b/Marlin/src/lcd/menu/menu_power_monitor.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && HAS_POWER_MONITOR -#include "menu.h" +#include "menu_item.h" #include "../../feature/power_monitor.h" void menu_power_monitor() { diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index 00a98d1244..04b999eaf6 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && HAS_CUTTER - #include "menu.h" + #include "menu_item.h" #include "../../feature/spindle_laser.h" diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 4be98f132d..141a8138b5 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && HAS_TEMPERATURE -#include "menu.h" +#include "menu_item.h" #include "../../module/temperature.h" #if FAN_COUNT > 1 || ENABLED(SINGLENOZZLE) diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index f2f26886fc..402ee41a1b 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && HAS_TRINAMIC_CONFIG -#include "menu.h" +#include "menu_item.h" #include "../../module/stepper/indirection.h" #include "../../feature/tmc_util.h" diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp index 71fb7b7556..96eae2298e 100644 --- a/Marlin/src/lcd/menu/menu_touch_screen.cpp +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -24,7 +24,7 @@ #if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) -#include "menu.h" +#include "menu_item.h" #include "../ultralcd.h" void touch_screen_calibration() { diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 2d40318156..c02906f7f9 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #include "../../module/motion.h" #include "../../module/planner.h" #include "../../module/temperature.h" diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index d1c1e6dd0a..d034de0952 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) -#include "menu.h" +#include "menu_item.h" #include "../../gcode/gcode.h" #include "../../gcode/queue.h" #include "../../module/motion.h" diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 69f4ada86f..00c7439a58 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -23,8 +23,9 @@ #include "touch.h" -#include "../ultralcd.h" -#include "../menu/menu.h" +#include "../ultralcd.h" // for ui methods +#include "../menu/menu.h" // for touch_screen_calibration + #include "../../module/temperature.h" #include "../../module/planner.h" diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 670c916dd7..6fa3006fb7 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -938,6 +938,8 @@ void MarlinUI::update() { if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100; else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; + // Enable to output the encoder steps per second value + //#define ENCODER_RATE_MULTIPLIER_DEBUG #if ENABLED(ENCODER_RATE_MULTIPLIER_DEBUG) SERIAL_ECHO_START(); SERIAL_ECHOPAIR("Enc Step Rate: ", encoderStepRate); diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 662adef0c5..d6a9f31e6c 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -514,6 +514,9 @@ public: static bool encoderRateMultiplierEnabled; static millis_t lastEncoderMovementMillis; static void enable_encoder_multiplier(const bool onoff); + #define ENCODER_RATE_MULTIPLY(F) (ui.encoderRateMultiplierEnabled = F) + #else + #define ENCODER_RATE_MULTIPLY(F) NOOP #endif // Manual Movement From 7dea6c53eda17a10705727982f3f71d94aa40c36 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 05:21:55 -0500 Subject: [PATCH 0120/1370] Remove extraneous defines --- Marlin/src/lcd/menu/menu.cpp | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 309ad06a4c..e6739a135c 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -163,30 +163,6 @@ void MenuEditItemBase::goto_edit_screen( liveEdit = le; } -// TODO: Remove these but test build size with and without -#define DEFINE_MENU_EDIT_ITEM(NAME) template class TMenuEditItem - -DEFINE_MENU_EDIT_ITEM(percent); // 100% right-justified -DEFINE_MENU_EDIT_ITEM(int3); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM(int4); // 1234, -123 right-justified -DEFINE_MENU_EDIT_ITEM(int8); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM(uint8); // 123 right-justified -DEFINE_MENU_EDIT_ITEM(uint16_3); // 123 right-justified -DEFINE_MENU_EDIT_ITEM(uint16_4); // 1234 right-justified -DEFINE_MENU_EDIT_ITEM(uint16_5); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM(float3); // 123 right-justified -DEFINE_MENU_EDIT_ITEM(float42_52); // _2.34, 12.34, -2.34 or 123.45, -23.45 -DEFINE_MENU_EDIT_ITEM(float43); // 1.234 -DEFINE_MENU_EDIT_ITEM(float5); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM(float5_25); // 12345 right-justified (25 increment) -DEFINE_MENU_EDIT_ITEM(float51); // 1234.5 right-justified -DEFINE_MENU_EDIT_ITEM(float31sign); // +12.3 -DEFINE_MENU_EDIT_ITEM(float41sign); // +123.4 -DEFINE_MENU_EDIT_ITEM(float51sign); // +1234.5 -DEFINE_MENU_EDIT_ITEM(float52sign); // +123.45 -DEFINE_MENU_EDIT_ITEM(long5); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM(long5_25); // 12345 right-justified (25 increment) - //////////////////////////////////////////// ///////////////// Menu Tree //////////////// //////////////////////////////////////////// From dded56c4bbe62c0ce998e9573af470db5876fe75 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 21 Aug 2020 20:54:21 -0300 Subject: [PATCH 0121/1370] Emulated DOGM via HAL TFT, XPT IO (#19017) --- .../STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp | 331 ------------------ .../STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp | 236 ------------- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 4 +- Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 2 +- Marlin/src/HAL/STM32F1/tft/tft_spi.cpp | 30 +- Marlin/src/HAL/STM32F1/tft/xpt2046.cpp | 2 +- Marlin/src/HAL/STM32F1/tft/xpt2046.h | 20 +- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 9 +- Marlin/src/inc/SanityCheck.h | 6 + Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 15 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 165 +++++---- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 39 +-- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h | 8 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 6 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 2 - .../lib/mks_ui/tft_lvgl_configuration.cpp | 30 +- Marlin/src/lcd/scaled_tft.h | 28 +- Marlin/src/lcd/touch/touch_buttons.cpp | 112 ++++++ .../lcd/touch/{xpt2046.h => touch_buttons.h} | 24 +- Marlin/src/lcd/touch/xpt2046.cpp | 251 ------------- Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 131 +++---- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 147 +++----- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 20 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 122 +++---- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 187 ++++------ buildroot/share/scripts/pinsformat.js | 41 ++- 28 files changed, 595 insertions(+), 1377 deletions(-) delete mode 100644 Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp delete mode 100644 Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp create mode 100644 Marlin/src/lcd/touch/touch_buttons.cpp rename Marlin/src/lcd/touch/{xpt2046.h => touch_buttons.h} (56%) delete mode 100644 Marlin/src/lcd/touch/xpt2046.cpp diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp deleted file mode 100644 index 445e53b67f..0000000000 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * u8g_com_stm32duino_fsmc.cpp - * - * Communication interface for FSMC - */ - -#include "../../../inc/MarlinConfig.h" - -#if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs - -#if HAS_GRAPHICAL_LCD - -#include -#include -#include -#include -#include - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif - -/* Timing configuration */ -#define FSMC_ADDRESS_SETUP_TIME 15 // AddressSetupTime -#define FSMC_DATA_SETUP_TIME 15 // DataSetupTime - -void LCD_IO_Init(uint8_t cs, uint8_t rs); -void LCD_IO_WriteData(uint16_t RegValue); -void LCD_IO_WriteReg(uint16_t Reg); -uint16_t LCD_IO_ReadData(uint16_t RegValue); -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); -#ifdef LCD_USE_DMA_FSMC - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); -#endif - -static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT - -uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - if (msgInitCount) { - if (msg == U8G_COM_MSG_INIT) msgInitCount--; - if (msgInitCount) return -1; - } - - static uint8_t isCommand; - - switch (msg) { - case U8G_COM_MSG_STOP: break; - case U8G_COM_MSG_INIT: - u8g_SetPIOutput(u8g, U8G_PI_RESET); - - #ifdef LCD_USE_DMA_FSMC - dma_init(FSMC_DMA_DEV); - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); - #endif - - LCD_IO_Init(u8g->pin_list[U8G_PI_CS], u8g->pin_list[U8G_PI_A0]); - u8g_Delay(50); - - if (arg_ptr) { - *((uint32_t *)arg_ptr) = LCD_IO_ReadData(0x0000); - if (*((uint32_t *)arg_ptr) == 0) - *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3); - } - isCommand = 0; - break; - - case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) - isCommand = arg_val == 0 ? 1 : 0; - break; - - case U8G_COM_MSG_RESET: - u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_WRITE_BYTE: - if (isCommand) - LCD_IO_WriteReg(arg_val); - else - LCD_IO_WriteData((uint16_t)arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: - for (uint8_t i = 0; i < arg_val; i += 2) - LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); - break; - } - return 1; -} - -/** - * FSMC LCD IO - */ -#define __ASM __asm -#define __STATIC_INLINE static inline - -__attribute__((always_inline)) __STATIC_INLINE void __DSB() { - __ASM volatile ("dsb 0xF":::"memory"); -} - -#define FSMC_CS_NE1 PD7 - -#if ENABLED(STM32_XL_DENSITY) - #define FSMC_CS_NE2 PG9 - #define FSMC_CS_NE3 PG10 - #define FSMC_CS_NE4 PG12 - - #define FSMC_RS_A0 PF0 - #define FSMC_RS_A1 PF1 - #define FSMC_RS_A2 PF2 - #define FSMC_RS_A3 PF3 - #define FSMC_RS_A4 PF4 - #define FSMC_RS_A5 PF5 - #define FSMC_RS_A6 PF12 - #define FSMC_RS_A7 PF13 - #define FSMC_RS_A8 PF14 - #define FSMC_RS_A9 PF15 - #define FSMC_RS_A10 PG0 - #define FSMC_RS_A11 PG1 - #define FSMC_RS_A12 PG2 - #define FSMC_RS_A13 PG3 - #define FSMC_RS_A14 PG4 - #define FSMC_RS_A15 PG5 -#endif - -#define FSMC_RS_A16 PD11 -#define FSMC_RS_A17 PD12 -#define FSMC_RS_A18 PD13 -#define FSMC_RS_A19 PE3 -#define FSMC_RS_A20 PE4 -#define FSMC_RS_A21 PE5 -#define FSMC_RS_A22 PE6 -#define FSMC_RS_A23 PE2 - -#if ENABLED(STM32_XL_DENSITY) - #define FSMC_RS_A24 PG13 - #define FSMC_RS_A25 PG14 -#endif - -static uint8_t fsmcInit = 0; - -typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; -} LCD_CONTROLLER_TypeDef; - -LCD_CONTROLLER_TypeDef *LCD; - -void LCD_IO_Init(uint8_t cs, uint8_t rs) { - uint32_t controllerAddress; - struct fsmc_nor_psram_reg_map* fsmcPsramRegion; - - if (fsmcInit) return; - fsmcInit = 1; - - switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; - #endif - default: return; - } - - #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) - - switch (rs) { - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A0: _ORADDR( 1); break; - case FSMC_RS_A1: _ORADDR( 2); break; - case FSMC_RS_A2: _ORADDR( 3); break; - case FSMC_RS_A3: _ORADDR( 4); break; - case FSMC_RS_A4: _ORADDR( 5); break; - case FSMC_RS_A5: _ORADDR( 6); break; - case FSMC_RS_A6: _ORADDR( 7); break; - case FSMC_RS_A7: _ORADDR( 8); break; - case FSMC_RS_A8: _ORADDR( 9); break; - case FSMC_RS_A9: _ORADDR(10); break; - case FSMC_RS_A10: _ORADDR(11); break; - case FSMC_RS_A11: _ORADDR(12); break; - case FSMC_RS_A12: _ORADDR(13); break; - case FSMC_RS_A13: _ORADDR(14); break; - case FSMC_RS_A14: _ORADDR(15); break; - case FSMC_RS_A15: _ORADDR(16); break; - #endif - case FSMC_RS_A16: _ORADDR(17); break; - case FSMC_RS_A17: _ORADDR(18); break; - case FSMC_RS_A18: _ORADDR(19); break; - case FSMC_RS_A19: _ORADDR(20); break; - case FSMC_RS_A20: _ORADDR(21); break; - case FSMC_RS_A21: _ORADDR(22); break; - case FSMC_RS_A22: _ORADDR(23); break; - case FSMC_RS_A23: _ORADDR(24); break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A24: _ORADDR(25); break; - case FSMC_RS_A25: _ORADDR(26); break; - #endif - default: return; - } - - rcc_clk_enable(RCC_FSMC); - - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); // FSMC_D02 - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); // FSMC_D03 - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); // FSMC_D04 - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); // FSMC_D05 - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); // FSMC_D06 - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); // FSMC_D13 - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); // FSMC_D14 - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 - - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // FSMC_NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // FSMC_NWE - - gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx - gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - - fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - - afio_remap(AFIO_REMAP_FSMC_NADV); - - LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; -} - -void LCD_IO_WriteData(uint16_t RegValue) { - LCD->RAM = RegValue; - __DSB(); -} - -void LCD_IO_WriteReg(uint16_t Reg) { - LCD->REG = Reg; - __DSB(); -} - -uint16_t LCD_IO_ReadData(uint16_t RegValue) { - LCD->REG = RegValue; - __DSB(); - - return LCD->RAM; -} - -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - volatile uint32_t data; - LCD->REG = RegValue; - __DSB(); - - data = LCD->RAM; // dummy read - data = LCD->RAM & 0x00FF; - - while (--ReadSize) { - data <<= 8; - data |= (LCD->RAM & 0x00FF); - } - return uint32_t(data); -} - -#ifdef LCD_USE_DMA_FSMC - -void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { - while (count > 0) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, &color, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, count > 65535 ? 65535 : count); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - count = count > 65535 ? count - 65535 : 0; - } -} - -void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); -} - -void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); -} - -void LCD_IO_WaitSequence_Async() { - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); -} - -#endif // LCD_USE_DMA_FSMC - -#endif // HAS_GRAPHICAL_LCD -#endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp deleted file mode 100644 index 206c3fda3d..0000000000 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __STM32F1__ - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) - -#include "../HAL.h" -#include -#include - -#define SPI_TFT_CS_H OUT_WRITE(SPI_TFT_CS_PIN, HIGH) -#define SPI_TFT_CS_L OUT_WRITE(SPI_TFT_CS_PIN, LOW) - -#define SPI_TFT_DC_H OUT_WRITE(SPI_TFT_DC_PIN, HIGH) -#define SPI_TFT_DC_L OUT_WRITE(SPI_TFT_DC_PIN, LOW) - -#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) -#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) - -#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) -#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) - -void LCD_IO_Init(uint8_t cs, uint8_t rs); -void LCD_IO_WriteData(uint16_t RegValue); -void LCD_IO_WriteReg(uint16_t Reg); -uint16_t LCD_IO_ReadData(uint16_t RegValue); -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); -#ifdef LCD_USE_DMA_SPI - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); -#endif - -void LCD_WR_REG(uint8_t cmd) { - SPI_TFT_CS_L; - SPI_TFT_DC_L; - SPI.send(cmd); - SPI_TFT_CS_H; -} -void LCD_WR_DATA(uint8_t data) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.send(data); - SPI_TFT_CS_H; -} - -void spi1Init(uint8_t spiRate) { - SPI_TFT_CS_H; - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(1); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -} - -void LCD_IO_Init(uint8_t cs, uint8_t rs) { - spi1Init(SPI_FULL_SPEED); -} - -void LCD_IO_WriteData(uint16_t RegValue) { - LCD_WR_DATA(RegValue); -} - -void LCD_IO_WriteReg(uint16_t Reg) { - LCD_WR_REG(Reg); -} - -uint16_t LCD_IO_ReadData(uint16_t RegValue) { - uint16_t d = 0; - SPI_TFT_CS_L; - - SPI_TFT_DC_L; - SPI.send(RegValue); - SPI_TFT_DC_H; - - SPI.read((uint8_t*)&d, 1); //dummy read - SPI.read((uint8_t*)&d, 1); - - SPI_TFT_CS_H; - return d >> 7; -} - -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - uint32_t data = 0; - uint8_t d = 0; - SPI_TFT_CS_L; - - SPI_TFT_DC_L; - SPI.send(RegValue); - SPI_TFT_DC_H; - - SPI.read((uint8_t*)&d, 1); //dummy read - SPI.read((uint8_t*)&d, 1); - data = d; - while (--ReadSize) { - data <<= 8; - SPI.read((uint8_t*)&d, 1); - data |= (d & 0xFF); - } - - SPI_TFT_CS_H; - return uint32_t(data >> 7); -} - -#ifdef LCD_USE_DMA_SPI - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - count *= 2; - } - while (count > 0) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(&data, 1, true); - SPI_TFT_CS_H; - count--; - } - } - - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - length *= 2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(data, length, true); - SPI_TFT_CS_H; - } - - void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - length *= 2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSendAsync(data, length, true); - SPI_TFT_CS_H; - } - - void LCD_IO_WaitSequence_Async() { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSendAsync(NULL, 0, true); - SPI_TFT_CS_H; - } -#endif - -static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif - -uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - if (msgInitCount) { - if (msg == U8G_COM_MSG_INIT) msgInitCount--; - if (msgInitCount) return -1; - } - - static uint8_t isCommand; - - LCD_IO_Init(-1, -1); - - switch (msg) { - case U8G_COM_MSG_STOP: break; - case U8G_COM_MSG_INIT: - u8g_SetPIOutput(u8g, U8G_PI_RESET); - - u8g_Delay(50); - - if (arg_ptr) { - spi1Init(SPI_EIGHTH_SPEED); - *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3); - spi1Init(SPI_FULL_SPEED); - } - isCommand = 0; - break; - - case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) - isCommand = arg_val == 0 ? 1 : 0; - break; - - case U8G_COM_MSG_RESET: - u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_WRITE_BYTE: - if (isCommand) - LCD_IO_WriteReg(arg_val); - else - LCD_IO_WriteData((uint16_t)arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: - for (uint8_t i = 0; i < arg_val; i += 2) - LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); - break; - - } - return 1; -} - -#endif // SPI_GRAPHICAL_TFT && !FORCE_SOFT_SPI -#endif // STM32F1 diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index 09d79030b5..25110d7c80 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -26,8 +26,8 @@ #undef SD_CHECK_AND_RETRY #endif -// This platform has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) && !HAS_FSMC_TFT && !HAS_SPI_TFT +// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT #undef TOUCH_SCREEN #undef TOUCH_SCREEN_CALIBRATION #define HAS_TOUCH_XPT2046 1 diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp index e0047e7d59..bc1b012dc7 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_FSMC_TFT || ENABLED(TFT_LVGL_UI_FSMC) +#if HAS_FSMC_TFT #include "tft_fsmc.h" #include diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp index 2610262b0f..1095389946 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_SPI_TFT || ENABLED(TFT_LVGL_UI_SPI) +#if HAS_SPI_TFT #include "tft_spi.h" @@ -30,32 +30,32 @@ SPIClass TFT_SPI::SPIx(1); -#define SPI_TFT_CS_H OUT_WRITE(TFT_CS_PIN, HIGH) -#define SPI_TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW) +#define TFT_CS_H OUT_WRITE(TFT_CS_PIN, HIGH) +#define TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW) -#define SPI_TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH) -#define SPI_TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW) +#define TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH) +#define TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW) -#define SPI_TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH) -#define SPI_TFT_RST_L OUT_WRITE(TFT_RST_PIN, LOW) +#define TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH) +#define TFT_RST_L OUT_WRITE(TFT_RST_PIN, LOW) -#define SPI_TFT_BLK_H OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH) -#define SPI_TFT_BLK_L OUT_WRITE(TFT_BACKLIGHT_PIN, LOW) +#define TFT_BLK_H OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH) +#define TFT_BLK_L OUT_WRITE(TFT_BACKLIGHT_PIN, LOW) void TFT_SPI::Init() { #if PIN_EXISTS(TFT_RESET) // OUT_WRITE(TFT_RESET_PIN, HIGH); - SPI_TFT_RST_H; + TFT_RST_H; delay(100); #endif #if PIN_EXISTS(TFT_BACKLIGHT) // OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - SPI_TFT_BLK_H; + TFT_BLK_H; #endif - SPI_TFT_DC_H; - SPI_TFT_CS_H; + TFT_DC_H; + TFT_CS_H; /** * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz @@ -87,7 +87,7 @@ void TFT_SPI::Init() { void TFT_SPI::DataTransferBegin(uint16_t DataSize) { SPIx.setDataSize(DataSize); SPIx.begin(); - SPI_TFT_CS_L; + TFT_CS_L; } uint32_t TFT_SPI::GetID() { @@ -135,7 +135,7 @@ void TFT_SPI::Transmit(uint16_t Data) { void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { DataTransferBegin(); - SPI_TFT_DC_H; + TFT_DC_H; if (MemoryIncrease == DMA_MINC_ENABLE) { SPIx.dmaSend(Data, Count, true); } diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp index e06cace741..616d05fead 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -19,7 +19,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_TFT_XPT2046 +#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046 #include "xpt2046.h" #include diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h index d2b7ad29b0..019f75efce 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h @@ -24,16 +24,18 @@ #include #endif -#if !PIN_EXISTS(TOUCH_MISO) - #error "TOUCH_MISO_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_MOSI) - #error "TOUCH_MOSI_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_SCK) - #error "TOUCH_SCK_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_CS) - #error "TOUCH_CS_PIN is not defined." +#ifndef TOUCH_MISO_PIN + #define TOUCH_MISO_PIN MISO_PIN +#endif +#ifndef TOUCH_MOSI_PIN + #define TOUCH_MOSI_PIN MOSI_PIN +#endif +#ifndef TOUCH_SCK_PIN + #define TOUCH_SCK_PIN SCK_PIN +#endif +#ifndef TOUCH_CS_PIN + #define TOUCH_CS_PIN CS_PIN #endif - #ifndef TOUCH_INT_PIN #define TOUCH_INT_PIN -1 #endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 30b6fbe3d5..3544a8840f 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -57,7 +57,7 @@ #include "lcd/ultralcd.h" #if HAS_TOUCH_XPT2046 - #include "lcd/touch/xpt2046.h" + #include "lcd/touch/touch_buttons.h" #endif #if HAS_TFT_LVGL_UI diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index d8c8103a42..ccafd413cf 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -286,14 +286,15 @@ #define DELAYED_BACKLIGHT_INIT #endif -// FSMC/SPI TFT Panels (HAL STM32) -#if EITHER(TFT_320x240, TFT_480x320) +// FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h +#if ANY(TFT_320x240, TFT_480x320, TFT_LVGL_UI_FSMC, FSMC_GRAPHICAL_TFT) #define HAS_FSMC_TFT 1 -#elif EITHER(TFT_320x240_SPI, TFT_480x320_SPI) +#elif ANY(TFT_320x240_SPI, TFT_480x320_SPI, TFT_LVGL_UI_SPI, SPI_GRAPHICAL_TFT) #define HAS_SPI_TFT 1 #endif -#if HAS_FSMC_TFT || HAS_SPI_TFT +// Color UI +#if ANY(TFT_320x240, TFT_480x320, TFT_320x240_SPI, TFT_480x320_SPI) #define HAS_GRAPHICAL_TFT 1 #define IS_ULTIPANEL #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d31a826778..01243219c2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -515,6 +515,12 @@ #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." #elif defined(TOUCH_BUTTONS) #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." +#elif defined(LCD_FULL_PIXEL_HEIGHT) + #error "LCD_FULL_PIXEL_HEIGHT is deprecated and should be removed. Please update your Configuration.h." +#elif defined(LCD_FULL_PIXEL_WIDTH) + #error "LCD_FULL_PIXEL_WIDTH is deprecated and should be removed. Please update your Configuration.h." +#elif defined(FSMC_UPSCALE) + #error "FSMC_UPSCALE is now GRAPHICAL_TFT_UPSCALE. Please update your Configuration.h." #elif defined(ANYCUBIC_TFT_MODEL) #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." #elif defined(EVENT_GCODE_SD_STOP) diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index 1f9621e9c0..455fc2388e 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -82,14 +82,9 @@ #define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn - #if PIN_EXISTS(FSMC_CS) - uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_fsmc_fn - #endif - - #if ENABLED(SPI_GRAPHICAL_TFT) - uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_spi_fn + #if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) + uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_TFT_FN u8g_com_stm32duino_tft_fn #endif #elif defined(TARGET_LPC1768) @@ -122,6 +117,6 @@ #ifndef U8G_COM_SSD_I2C_HAL #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn #endif -#ifndef U8G_COM_HAL_FSMC_FN - #define U8G_COM_HAL_FSMC_FN u8g_com_null_fn +#ifndef U8G_COM_HAL_TFT_FN + #define U8G_COM_HAL_TFT_FN u8g_com_null_fn #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index e42faf0255..dc8fbc53fa 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -67,28 +67,24 @@ #define HAS_LCD_IO 1 #endif -#if HAS_LCD_IO - extern void LCD_IO_Init(uint8_t cs, uint8_t rs); - extern uint16_t LCD_IO_ReadData(uint16_t Reg); - extern uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); - extern void LCD_IO_WriteReg(uint16_t Reg); - extern void LCD_IO_WriteData(uint16_t RegValue); - extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); - extern void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length); - extern void LCD_IO_WaitSequence_Async(); - extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); +#if ENABLED(SPI_GRAPHICAL_TFT) + #include HAL_PATH(../../HAL, tft/tft_spi.h) +#elif ENABLED(FSMC_GRAPHICAL_TFT) + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) #endif +TFT_IO tftio; + #define WIDTH LCD_PIXEL_WIDTH #define HEIGHT LCD_PIXEL_HEIGHT #define PAGE_HEIGHT 8 #include "../scaled_tft.h" -#define UPSCALE0(M) ((M) * (FSMC_UPSCALE)) +#define UPSCALE0(M) ((M) * (GRAPHICAL_TFT_UPSCALE)) #define UPSCALE(A,M) (UPSCALE0(M) + (A)) -#define X_HI (UPSCALE(LCD_PIXEL_OFFSET_X, WIDTH) - 1) -#define Y_HI (UPSCALE(LCD_PIXEL_OFFSET_Y, HEIGHT) - 1) +#define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) +#define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) // see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html @@ -156,7 +152,8 @@ static uint32_t lcd_id = 0; static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { #if HAS_LCD_IO - #define IO_REG_DATA(R,D) do { LCD_IO_WriteReg(R); LCD_IO_WriteData(D); }while(0) + tftio.DataTransferBegin(DATASIZE_8BIT); + #define IO_REG_DATA(R,D) do { tftio.WriteReg(R); tftio.WriteData(D); }while(0) #else #define IO_REG_DATA(R,D) do { u8g_WriteByte(u8g, dev, R); u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&D); }while(0) #endif @@ -174,7 +171,8 @@ static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_ IO_REG_DATA(ILI9328_VASET, Xmin); #if HAS_LCD_IO - LCD_IO_WriteReg(ILI9328_WRITE_RAM); + tftio.WriteReg(ILI9328_WRITE_RAM); + tftio.DataTransferEnd(); #else u8g_WriteByte(u8g, dev, ILI9328_WRITE_RAM); u8g_SetAddress(u8g, dev, 1); @@ -183,19 +181,21 @@ static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_ static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { #if HAS_LCD_IO - LCD_IO_WriteReg(ST7789V_CASET); - LCD_IO_WriteData((Xmin >> 8) & 0xFF); - LCD_IO_WriteData(Xmin & 0xFF); - LCD_IO_WriteData((Xmax >> 8) & 0xFF); - LCD_IO_WriteData(Xmax & 0xFF); + tftio.DataTransferBegin(DATASIZE_8BIT); + tftio.WriteReg(ST7789V_CASET); + tftio.WriteData((Xmin >> 8) & 0xFF); + tftio.WriteData(Xmin & 0xFF); + tftio.WriteData((Xmax >> 8) & 0xFF); + tftio.WriteData(Xmax & 0xFF); - LCD_IO_WriteReg(ST7789V_RASET); - LCD_IO_WriteData((Ymin >> 8) & 0xFF); - LCD_IO_WriteData(Ymin & 0xFF); - LCD_IO_WriteData((Ymax >> 8) & 0xFF); - LCD_IO_WriteData(Ymax & 0xFF); + tftio.WriteReg(ST7789V_RASET); + tftio.WriteData((Ymin >> 8) & 0xFF); + tftio.WriteData(Ymin & 0xFF); + tftio.WriteData((Ymax >> 8) & 0xFF); + tftio.WriteData(Ymax & 0xFF); - LCD_IO_WriteReg(ST7789V_WRITE_RAM); + tftio.WriteReg(ST7789V_WRITE_RAM); + tftio.DataTransferEnd(); #else u8g_SetAddress(u8g, dev, 0); u8g_WriteByte(u8g, dev, ST7789V_CASET); u8g_SetAddress(u8g, dev, 1); u8g_WriteByte(u8g, dev, (Xmin >> 8) & 0xFF); @@ -227,17 +227,17 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint for (;;) { data = *sequence++; if (data != 0xFFFF) { - LCD_IO_WriteData(data); + tftio.WriteData(data); continue; } data = *sequence++; if (data == 0x7FFF) return; if (data == 0xFFFF) { - LCD_IO_WriteData(data); + tftio.WriteData(data); } else if (data & 0x8000) { delay(data & 0x7FFF); } else if ((data & 0xFF00) == 0) { - LCD_IO_WriteReg(data); + tftio.WriteReg(data); } } } @@ -591,7 +591,7 @@ static const uint16_t st7796_init[] = { #define BUTTON_Y_HI (UPSCALE(BUTTON_Y_LO, BUTTON_SIZE_Y) - 1) void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) { - uint16_t buffer[BUTTON_SIZE_X * sq(FSMC_UPSCALE)]; + uint16_t buffer[BUTTON_SIZE_X * sq(GRAPHICAL_TFT_UPSCALE)]; if (length > BUTTON_SIZE_X) return; @@ -603,16 +603,16 @@ static const uint16_t st7796_init[] = { v = color; else v = TFT_MARLINBG_COLOR; - LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = v; + LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = v; } #if HAS_LCD_IO - LOOP_S_L_N(n, 1, FSMC_UPSCALE) + LOOP_S_L_N(n, 1, GRAPHICAL_TFT_UPSCALE) for (uint16_t l = 0; l < UPSCALE0(length); l++) buffer[l + n * UPSCALE0(length)] = buffer[l]; - LCD_IO_WriteSequence(buffer, length * sq(FSMC_UPSCALE)); + tftio.WriteSequence(buffer, length * sq(GRAPHICAL_TFT_UPSCALE)); #else - for (uint8_t i = FSMC_UPSCALE; i--;) + for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); #endif } @@ -632,22 +632,17 @@ static uint8_t page; uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - #if ENABLED(SPI_GRAPHICAL_TFT) - LCD_IO_Init(-1, -1); - #endif - #if HAS_LCD_IO - static uint16_t bufferA[WIDTH * sq(FSMC_UPSCALE)], bufferB[WIDTH * sq(FSMC_UPSCALE)]; + static uint16_t bufferA[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)], bufferB[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)]; uint16_t* buffer = &bufferA[0]; - bool allow_async = DISABLED(SPI_GRAPHICAL_TFT); #else - uint16_t buffer[WIDTH * FSMC_UPSCALE]; // 16-bit RGB 565 pixel line buffer + uint16_t buffer[WIDTH * GRAPHICAL_TFT_UPSCALE]; // 16-bit RGB 565 pixel line buffer #endif switch (msg) { case U8G_DEV_MSG_INIT: dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); - + tftio.DataTransferBegin(DATASIZE_8BIT); switch (lcd_id & 0xFFFF) { case 0x8552: // ST7789V WRITE_ESC_SEQUENCE(st7789v_init); @@ -682,6 +677,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u setWindow = (lcd_id & 0xFF000000) ? setWindow_st7789v : setWindow_ili9328; break; } + tftio.DataTransferEnd(); if (preinit) { preinit = false; @@ -689,13 +685,13 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u } // Clear Screen - setWindow(u8g, dev, 0, 0, (LCD_FULL_PIXEL_WIDTH) - 1, (LCD_FULL_PIXEL_HEIGHT) - 1); + setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); #if HAS_LCD_IO - LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); + tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); #else - memset2(buffer, TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) / 2); - for (uint16_t i = 0; i < (LCD_FULL_PIXEL_HEIGHT) * sq(FSMC_UPSCALE); i++) - u8g_WriteSequence(u8g, dev, LCD_FULL_PIXEL_WIDTH / 2, (uint8_t *)buffer); + memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2); + for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++) + u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer); #endif // Bottom buttons @@ -719,7 +715,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u case U8G_DEV_MSG_PAGE_FIRST: page = 0; - setWindow(u8g, dev, LCD_PIXEL_OFFSET_X, LCD_PIXEL_OFFSET_Y, X_HI, Y_HI); + setWindow(u8g, dev, TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI); break; case U8G_DEV_MSG_PAGE_NEXT: @@ -733,26 +729,18 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { const uint8_t b = *(((uint8_t *)pb->buf) + i); const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR; - LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = c; + LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = c; } #if HAS_LCD_IO - LOOP_S_L_N(n, 1, FSMC_UPSCALE) + LOOP_S_L_N(n, 1, GRAPHICAL_TFT_UPSCALE) for (uint16_t l = 0; l < UPSCALE0(WIDTH); l++) buffer[l + n * UPSCALE0(WIDTH)] = buffer[l]; - if (allow_async) { - if (y > 0 || page > 1) LCD_IO_WaitSequence_Async(); - if (y == 7 && page == 8) - LCD_IO_WriteSequence(buffer, COUNT(bufferA)); // last line of last page - else - LCD_IO_WriteSequence_Async(buffer, COUNT(bufferA)); - } - else - LCD_IO_WriteSequence(buffer, COUNT(bufferA)); + tftio.WriteSequence(buffer, COUNT(bufferA)); #else uint8_t* bufptr = (uint8_t*) buffer; - for (uint8_t i = FSMC_UPSCALE; i--;) { - LOOP_S_L_N(n, 0, FSMC_UPSCALE * 2) { + for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) { + LOOP_S_L_N(n, 0, GRAPHICAL_TFT_UPSCALE * 2) { u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH * n]); } } @@ -770,6 +758,59 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } -U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_FSMC_FN); +static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT + +uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + if (msgInitCount) { + if (msg == U8G_COM_MSG_INIT) msgInitCount--; + if (msgInitCount) return -1; + } + + static uint8_t isCommand; + + switch (msg) { + case U8G_COM_MSG_STOP: break; + case U8G_COM_MSG_INIT: + u8g_SetPIOutput(u8g, U8G_PI_RESET); + + u8g_Delay(50); + + tftio.Init(); + + if (arg_ptr) { + *((uint32_t *)arg_ptr) = tftio.GetID(); + } + isCommand = 0; + break; + + case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) + isCommand = arg_val == 0 ? 1 : 0; + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + tftio.DataTransferBegin(DATASIZE_8BIT); + if (isCommand) + tftio.WriteReg(arg_val); + else + tftio.WriteData((uint16_t)arg_val); + tftio.DataTransferEnd(); + break; + + case U8G_COM_MSG_WRITE_SEQ: + tftio.DataTransferBegin(DATASIZE_8BIT); + for (uint8_t i = 0; i < arg_val; i += 2) + tftio.WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); + tftio.DataTransferEnd(); + break; + + } + return 1; +} + +U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_TFT_FN); #endif // HAS_GRAPHICAL_LCD && FSMC_CS diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index 607090ba39..ea94d6c1a5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -33,25 +33,6 @@ TFT SPI_TFT; -#ifndef SPI_TFT_MISO_PIN - #define SPI_TFT_MISO_PIN PA6 -#endif -#ifndef SPI_TFT_MOSI_PIN - #define SPI_TFT_MOSI_PIN PA7 -#endif -#ifndef SPI_TFT_SCK_PIN - #define SPI_TFT_SCK_PIN PA5 -#endif -#ifndef SPI_TFT_CS_PIN - #define SPI_TFT_CS_PIN PD11 -#endif -#ifndef SPI_TFT_DC_PIN - #define SPI_TFT_DC_PIN PD10 -#endif -#ifndef SPI_TFT_RST_PIN - #define SPI_TFT_RST_PIN PC6 -#endif - // use SPI1 for the spi tft. void TFT::spi_init(uint8_t spiRate) { tftio.Init(); @@ -93,11 +74,11 @@ void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { } void TFT::LCD_init() { - SPI_TFT_RST_H; + TFT_RST_H; delay(150); - SPI_TFT_RST_L; + TFT_RST_L; delay(150); - SPI_TFT_RST_H; + TFT_RST_H; tftio.DataTransferBegin(DATASIZE_8BIT); @@ -176,22 +157,22 @@ void TFT::LCD_init() { LCD_clear(0x0000); // LCD_Draw_Logo(); - SPI_TFT_BLK_H; + TFT_BLK_H; delay(2000); } void TFT::LCD_clear(uint16_t color) { - SetWindows(0, 0, (LCD_FULL_PIXEL_WIDTH) - 1, (LCD_FULL_PIXEL_HEIGHT) - 1); - tftio.WriteMultiple(color, (uint32_t)(LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); + SetWindows(0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); + tftio.WriteMultiple(color, (uint32_t)(TFT_WIDTH) * (TFT_HEIGHT)); } extern unsigned char bmp_public_buf[17 * 1024]; void TFT::LCD_Draw_Logo() { - SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); - for (uint16_t i = 0; i < (LCD_FULL_PIXEL_HEIGHT); i ++) { - Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (LCD_FULL_PIXEL_WIDTH) * 2); - tftio.WriteSequence((uint16_t *)bmp_public_buf, LCD_FULL_PIXEL_WIDTH); + SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); + for (uint16_t i = 0; i < (TFT_HEIGHT); i ++) { + Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); + tftio.WriteSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h index c4b04e1c21..e40039fe86 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -29,11 +29,11 @@ #include HAL_PATH(../../HAL, tft/tft_fsmc.h) #endif -#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) -#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) +#define TFT_RST_H OUT_WRITE(TFT_RESET_PIN, HIGH) +#define TFT_RST_L OUT_WRITE(TFT_RESET_PIN, LOW) -#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) -#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) +#define TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) +#define TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) class TFT { public: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index dc5e4910e9..ff9d0518d3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -653,10 +653,10 @@ char *creat_title_text() { i += 2; if (*p_index == 0x0000) *p_index = 0xC318; } - SPI_TFT_CS_L; - SPI_TFT_DC_H; + TFT_CS_L; + TFT_DC_H; SPI.dmaSend(bmp_public_buf, 400, true); - SPI_TFT_CS_H; + TFT_CS_H; #else for (i = 0; i < 400;) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index a2795e933b..297ba723de 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -34,8 +34,6 @@ #include "pic_manager.h" #include -#include "../../../touch/xpt2046.h" - #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" #include "../../../../sd/cardreader.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 391e12ba3f..23072d27c7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -51,11 +51,11 @@ XPT2046 touch; #include -#ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 +#ifndef TFT_WIDTH + #define TFT_WIDTH 480 #endif -#ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 #endif #if HAS_SPI_FLASH_FONT @@ -135,7 +135,7 @@ void LCD_WriteRAM_Prepare(void) { void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { //if (DeviceCode == 0x9488) { - if (x > (LCD_FULL_PIXEL_WIDTH) || y > (LCD_FULL_PIXEL_HEIGHT)) return; + if (x > (TFT_WIDTH) || y > (TFT_HEIGHT)) return; //} tft_set_cursor(x, y); @@ -196,8 +196,8 @@ void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16 LCD_WriteReg(0x0053, yEnd);*/ LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit - LCD_WriteReg(0x0052, (LCD_FULL_PIXEL_HEIGHT) - xEnd); - LCD_WriteReg(0x0053, (LCD_FULL_PIXEL_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0052, (TFT_HEIGHT) - xEnd); + LCD_WriteReg(0x0053, (TFT_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit } else { @@ -231,16 +231,16 @@ void LCD_Clear(uint16_t Color) { if (DeviceCode == 0x9488) { tft_set_cursor(0, 0); - ili9320_SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); + ili9320_SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); LCD_WriteRAM_Prepare(); #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteMultiple(Color, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); + LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); #else - //index = (LCD_FULL_PIXEL_HEIGHT) / 2 * (LCD_FULL_PIXEL_WIDTH); - for (index = 0; index < (LCD_FULL_PIXEL_HEIGHT) * (LCD_FULL_PIXEL_WIDTH); index++) + //index = (TFT_HEIGHT) / 2 * (TFT_WIDTH); + for (index = 0; index < (TFT_HEIGHT) * (TFT_WIDTH); index++) LCD_IO_WriteData(Color); #endif - //LCD_IO_WriteMultiple(Color, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); + //LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); //while(index --) LCD_IO_WriteData(Color); } else if (DeviceCode == 0x5761) { @@ -378,7 +378,7 @@ void init_tft() { for (i = 0; i < 65535; i++); LCD_IO_WriteReg(0x0029); - ili9320_SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); + ili9320_SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); LCD_Clear(0x0000); OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); @@ -522,8 +522,8 @@ static bool get_point(int16_t *x, int16_t *y) { } #if ENABLED(GRAPHICAL_TFT_ROTATE_180) - x = (LCD_FULL_PIXEL_WIDTH) - x; - y = (LCD_FULL_PIXEL_HEIGHT) - y; + x = (TFT_WIDTH) - x; + y = (TFT_HEIGHT) - y; #endif return is_touched; diff --git a/Marlin/src/lcd/scaled_tft.h b/Marlin/src/lcd/scaled_tft.h index f22bdf696a..be846f70a9 100644 --- a/Marlin/src/lcd/scaled_tft.h +++ b/Marlin/src/lcd/scaled_tft.h @@ -23,28 +23,28 @@ #include "../inc/MarlinConfig.h" -#ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 2 +#ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 2 #endif -#ifndef LCD_FULL_PIXEL_WIDTH - #if FSMC_UPSCALE == 3 - #define LCD_FULL_PIXEL_WIDTH 480 +#ifndef TFT_WIDTH + #if GRAPHICAL_TFT_UPSCALE == 3 + #define TFT_WIDTH 480 #else - #define LCD_FULL_PIXEL_WIDTH 320 + #define TFT_WIDTH 320 #endif #endif -#ifndef LCD_FULL_PIXEL_HEIGHT - #if FSMC_UPSCALE == 3 - #define LCD_FULL_PIXEL_HEIGHT 320 +#ifndef TFT_HEIGHT + #if GRAPHICAL_TFT_UPSCALE == 3 + #define TFT_HEIGHT 320 #else - #define LCD_FULL_PIXEL_HEIGHT 240 + #define TFT_HEIGHT 240 #endif #endif -#ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 48 +#ifndef TFT_PIXEL_OFFSET_X + #define TFT_PIXEL_OFFSET_X 48 #endif -#ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 48 +#ifndef TFT_PIXEL_OFFSET_Y + #define TFT_PIXEL_OFFSET_Y 48 #endif diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp new file mode 100644 index 0000000000..8eae73df11 --- /dev/null +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -0,0 +1,112 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_TOUCH_XPT2046 + +#include "touch_buttons.h" +#include "../scaled_tft.h" + +#include HAL_PATH(../../HAL, tft/xpt2046.h) +XPT2046 touchIO; + +#include "../../lcd/ultralcd.h" // For EN_C bit mask + +/** + * Draw and Touch processing + * + * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. + * TOUCH_SENSOR_WIDTH/HEIGHT (320x240) is the Touch Area resolution. + * TFT_WIDTH/HEIGHT (320x240 or 480x320) is the Actual (FSMC) Display resolution. + * + * - All native (u8g) drawing is done in LCD_PIXEL_* (128x64) + * - The DOGM pixels are is upscaled 2-3x (as needed) for display. + * - Touch coordinates use TOUCH_SENSOR_* resolution and are converted to + * click and scroll-wheel events (emulating of a common DOGM display). + * + * TOUCH_SCREEN resolution exists to fit our calibration values. The original touch code was made + * and originally calibrated for 320x240. If you decide to change the resolution of the touch code, + * new calibration values will be needed. + * + * The Marlin menus are drawn scaled in the upper region of the screen. The bottom region (in a + * fixed location in TOUCH_SCREEN* coordinate space) is used for 4 general-purpose buttons to + * navigate and select menu items. Both regions are touchable. + * + * The Marlin screen touchable area starts at TFT_PIXEL_OFFSET_X/Y (translated to SCREEN_PCT_LEFT/TOP) + * and spans LCD_PIXEL_WIDTH/HEIGHT (scaled to SCREEN_PCT_WIDTH/HEIGHT). + */ + +// Touch sensor resolution independent of display resolution +#define TOUCH_SENSOR_WIDTH 320 +#define TOUCH_SENSOR_HEIGHT 240 + +#define SCREEN_PCT_WIDE(X) ((X) * (TOUCH_SENSOR_WIDTH) / (TFT_WIDTH)) +#define SCREEN_PCT_HIGH(Y) ((Y) * (TOUCH_SENSOR_HEIGHT) / (TFT_HEIGHT)) + +#define SCREEN_PCT_LEFT SCREEN_PCT_WIDE(TFT_PIXEL_OFFSET_X) +#define SCREEN_PCT_TOP SCREEN_PCT_HIGH(TFT_PIXEL_OFFSET_Y) +#define SCREEN_PCT_WIDTH SCREEN_PCT_WIDE((GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_WIDTH)) +#define SCREEN_PCT_HEIGHT SCREEN_PCT_HIGH((GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_HEIGHT)) + +// Coordinates in terms of 240-unit-tall touch area +#define BUTTON_AREA_TOP 175 +#define BUTTON_AREA_BOT 234 + +TouchButtons touch; + +void TouchButtons::init() { touchIO.Init(); } + +uint8_t TouchButtons::read_buttons() { + #ifdef HAS_SPI_LCD + int16_t x, y; + + if (!touchIO.getRawPoint(&x, &y)) return 0; + + x = uint16_t((uint32_t(x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; + y = uint16_t((uint32_t(y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; + + #if ENABLED(GRAPHICAL_TFT_ROTATE_180) + x = TOUCH_SENSOR_WIDTH - x; + y = TOUCH_SENSOR_HEIGHT - y; + #endif + + // Touch within the button area simulates an encoder button + if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) + return WITHIN(x, 14, 77) ? EN_D + : WITHIN(x, 90, 153) ? EN_A + : WITHIN(x, 166, 229) ? EN_B + : WITHIN(x, 242, 305) ? EN_C + : 0; + + if ( !WITHIN(x, SCREEN_PCT_LEFT, SCREEN_PCT_LEFT + SCREEN_PCT_WIDTH) + || !WITHIN(y, SCREEN_PCT_TOP, SCREEN_PCT_TOP + SCREEN_PCT_HEIGHT) + ) return 0; + + // Column and row above BUTTON_AREA_TOP + int8_t col = (x - (SCREEN_PCT_LEFT)) * (LCD_WIDTH) / (SCREEN_PCT_WIDTH), + row = (y - (SCREEN_PCT_TOP)) * (LCD_HEIGHT) / (SCREEN_PCT_HEIGHT); + + // Send the touch to the UI (which will simulate the encoder wheel) + MarlinUI::screen_click(row, col, x, y); + #endif + return 0; +} + +#endif // HAS_TOUCH_XPT2046 diff --git a/Marlin/src/lcd/touch/xpt2046.h b/Marlin/src/lcd/touch/touch_buttons.h similarity index 56% rename from Marlin/src/lcd/touch/xpt2046.h rename to Marlin/src/lcd/touch/touch_buttons.h index 467317901b..451e5a5a37 100644 --- a/Marlin/src/lcd/touch/xpt2046.h +++ b/Marlin/src/lcd/touch/touch_buttons.h @@ -20,30 +20,10 @@ #include -// Relies on XPT2046-compatible mode of ADS7843, -// hence no Z1 / Z2 measurements are possible. - -#define XPT2046_DFR_MODE 0x00 -#define XPT2046_SER_MODE 0x04 -#define XPT2046_CONTROL 0x80 - -enum XPTCoordinate : uint8_t { - XPT2046_X = 0x10, - XPT2046_Y = 0x50, - XPT2046_Z1 = 0x30, - XPT2046_Z2 = 0x40 -}; - -class XPT2046 { +class TouchButtons { public: static void init(); static uint8_t read_buttons(); - bool getTouchPoint(uint16_t &x, uint16_t &y); - static bool isTouched(); - inline void waitForRelease() { while (isTouched()) { /* nada */ } } - inline void waitForTouch(uint16_t &x, uint16_t &y) { while (!getTouchPoint(x, y)) { /* nada */ } } -private: - static uint16_t getInTouch(const XPTCoordinate coordinate); }; -extern XPT2046 touch; +extern TouchButtons touch; diff --git a/Marlin/src/lcd/touch/xpt2046.cpp b/Marlin/src/lcd/touch/xpt2046.cpp deleted file mode 100644 index 4407d945d3..0000000000 --- a/Marlin/src/lcd/touch/xpt2046.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_TOUCH_XPT2046 - -#include "xpt2046.h" -#include "../scaled_tft.h" - -#ifndef XPT2046_Z1_THRESHOLD - #define XPT2046_Z1_THRESHOLD 10 -#endif - -/** - * Draw and Touch processing - * - * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. - * TOUCH_SENSOR_WIDTH/HEIGHT (320x240) is the Touch Area resolution. - * LCD_FULL_PIXEL_WIDTH/HEIGHT (320x240 or 480x320) is the Actual (FSMC) Display resolution. - * - * - All native (u8g) drawing is done in LCD_PIXEL_* (128x64) - * - The DOGM pixels are is upscaled 2-3x (as needed) for display. - * - Touch coordinates use TOUCH_SENSOR_* resolution and are converted to - * click and scroll-wheel events (emulating of a common DOGM display). - * - * TOUCH_SCREEN resolution exists to fit our calibration values. The original touch code was made - * and originally calibrated for 320x240. If you decide to change the resolution of the touch code, - * new calibration values will be needed. - * - * The Marlin menus are drawn scaled in the upper region of the screen. The bottom region (in a - * fixed location in TOUCH_SCREEN* coordinate space) is used for 4 general-purpose buttons to - * navigate and select menu items. Both regions are touchable. - * - * The Marlin screen touchable area starts at LCD_PIXEL_OFFSET_X/Y (translated to SCREEN_START_LEFT/TOP) - * and spans LCD_PIXEL_WIDTH/HEIGHT (scaled to SCREEN_WIDTH/HEIGHT). - */ - -// Coordinates in terms of touch area -#define BUTTON_AREA_TOP 175 -#define BUTTON_AREA_BOT 234 - -// Touch sensor resolution independent of display resolution -#define TOUCH_SENSOR_WIDTH 320 -#define TOUCH_SENSOR_HEIGHT 240 - -#define SCREEN_WIDTH_PCT(X) ((X) * (TOUCH_SENSOR_WIDTH) / (LCD_FULL_PIXEL_WIDTH)) -#define SCREEN_HEIGHT_PCT(Y) ((Y) * (TOUCH_SENSOR_HEIGHT) / (LCD_FULL_PIXEL_HEIGHT)) - -#define SCREEN_START_LEFT SCREEN_WIDTH_PCT(LCD_PIXEL_OFFSET_X) -#define SCREEN_START_TOP SCREEN_HEIGHT_PCT(LCD_PIXEL_OFFSET_Y) -#define SCREEN_WIDTH SCREEN_WIDTH_PCT((LCD_PIXEL_WIDTH) * (FSMC_UPSCALE)) -#define SCREEN_HEIGHT SCREEN_HEIGHT_PCT((LCD_PIXEL_HEIGHT) * (FSMC_UPSCALE)) - -#define TOUCHABLE_X_WIDTH SCREEN_WIDTH -#define TOUCHABLE_Y_HEIGHT SCREEN_HEIGHT - -#ifndef TOUCH_INT_PIN - #define TOUCH_INT_PIN -1 -#endif -#ifndef TOUCH_MISO_PIN - #define TOUCH_MISO_PIN MISO_PIN -#endif -#ifndef TOUCH_MOSI_PIN - #define TOUCH_MOSI_PIN MOSI_PIN -#endif -#ifndef TOUCH_SCK_PIN - #define TOUCH_SCK_PIN SCK_PIN -#endif -#ifndef TOUCH_CS_PIN - #define TOUCH_CS_PIN CS_PIN -#endif - -XPT2046 touch; - -void XPT2046::init() { - SET_INPUT(TOUCH_MISO_PIN); - SET_OUTPUT(TOUCH_MOSI_PIN); - SET_OUTPUT(TOUCH_SCK_PIN); - OUT_WRITE(TOUCH_CS_PIN, HIGH); - - #if PIN_EXISTS(TOUCH_INT) - // Optional Pendrive interrupt pin - SET_INPUT(TOUCH_INT_PIN); - #endif - - // Read once to enable pendrive status pin - getInTouch(XPT2046_X); -} - -#include "../../lcd/ultralcd.h" // For EN_C bit mask - -uint8_t XPT2046::read_buttons() { - #ifdef HAS_SPI_LCD - int16_t tsoffsets[4] = { 0 }; - - if (tsoffsets[0] + tsoffsets[1] == 0) { - // Not yet set, so use defines as fallback... - tsoffsets[0] = XPT2046_X_CALIBRATION; - tsoffsets[1] = XPT2046_X_OFFSET; - tsoffsets[2] = XPT2046_Y_CALIBRATION; - tsoffsets[3] = XPT2046_Y_OFFSET; - } - - // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible. - - if (!isTouched()) return 0; - uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], - y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; - if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. - - #if ENABLED(GRAPHICAL_TFT_ROTATE_180) - x = TOUCH_SENSOR_WIDTH - x; - y = TOUCH_SENSOR_HEIGHT - y; - #endif - - // Touch within the button area simulates an encoder button - if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) - return WITHIN(x, 14, 77) ? EN_D - : WITHIN(x, 90, 153) ? EN_A - : WITHIN(x, 166, 229) ? EN_B - : WITHIN(x, 242, 305) ? EN_C - : 0; - - if ( !WITHIN(x, SCREEN_START_LEFT, SCREEN_START_LEFT + SCREEN_WIDTH) - || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT) - ) return 0; - - // Column and row above BUTTON_AREA_TOP - int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH), - row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT); - - // Send the touch to the UI (which will simulate the encoder wheel) - MarlinUI::screen_click(row, col, x, y); - #endif - return 0; -} - -bool XPT2046::isTouched() { - return ( - #if PIN_EXISTS(TOUCH_INT) - READ(TOUCH_INT_PIN) != HIGH - #else - getInTouch(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD - #endif - ); -} - -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - - #include - - static void touch_spi_init(uint8_t spiRate) { - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - } -#endif // TOUCH_BUTTONS_HW_SPI - -uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) { - uint16_t data[3]; - const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE; - - #if ENABLED(TOUCH_BUTTONS_HW_SPI) - - touch_spi_init(SPI_SPEED_6); - for (uint16_t i = 0; i < 3; i++) { - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI.transfer(coord); - data[i] = (((SPI.transfer(0xFF) << 8) | SPI.transfer(0xFF)) >> 3) & 0x0FFF; - WRITE(TOUCH_CS_PIN, HIGH); - } - - #else // !TOUCH_BUTTONS_HW_SPI - - OUT_WRITE(TOUCH_CS_PIN, LOW); - for (uint16_t i = 0; i < 3; i++) { - for (uint8_t j = 0x80; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - WRITE(TOUCH_MOSI_PIN, bool(coord & j)); - WRITE(TOUCH_SCK_PIN, HIGH); - } - - data[i] = 0; - for (uint16_t j = 0x8000; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - if (READ(TOUCH_MISO_PIN)) data[i] |= j; - WRITE(TOUCH_SCK_PIN, HIGH); - } - WRITE(TOUCH_SCK_PIN, LOW); - data[i] >>= 4; - } - WRITE(TOUCH_CS_PIN, HIGH); - - #endif // !TOUCH_BUTTONS_HW_SPI - - uint16_t delta01 = _MAX(data[0], data[1]) - _MIN(data[0], data[1]), - delta02 = _MAX(data[0], data[2]) - _MIN(data[0], data[2]), - delta12 = _MAX(data[1], data[2]) - _MIN(data[1], data[2]); - - if (delta01 <= delta02 && delta01 <= delta12) - return (data[0] + data[1]) >> 1; - - if (delta02 <= delta12) - return (data[0] + data[2]) >> 1; - - return (data[1] + data[2]) >> 1; -} - -bool XPT2046::getTouchPoint(uint16_t &x, uint16_t &y) { - if (isTouched()) { - x = getInTouch(XPT2046_X); - y = getInTouch(XPT2046_Y); - } - return isTouched(); -} - -#endif // HAS_TOUCH_XPT2046 diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 6fa3006fb7..f30d9c68cf 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -150,7 +150,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; volatile uint8_t MarlinUI::slow_buttons; #endif #if HAS_TOUCH_XPT2046 - #include "touch/xpt2046.h" + #include "touch/touch_buttons.h" bool MarlinUI::on_edit_screen = false; #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index e4f0014417..5267888f44 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -44,7 +44,7 @@ #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif // @@ -104,49 +104,6 @@ //#define POWER_LOSS_PIN -1 #define FIL_RUNOUT_PIN PA15 -// -// TronXY TFT Support -// -//#define FSMC_GRAPHICAL_TFT -//#define HAS_TOUCH_XPT2046 1 - -#if ENABLED(FSMC_GRAPHICAL_TFT) - #define FSMC_UPSCALE 3 - - #define LCD_RESET_PIN PF11 - #define LCD_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens - #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif - - #endif -#endif - // SPI Flash #define SPI_FLASH_SIZE 0x200000 // 2MB #define HAS_SPI_FLASH 1 @@ -157,28 +114,18 @@ #define W25QXX_MISO_PIN PB14 #define W25QXX_SCK_PIN PB13 -#if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 1 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 1 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 +// +// TronXY TFT Support +// + +#if HAS_FSMC_TFT + + // Shared FSMC #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - //#define TOUCH_INT_PIN PB6 - - #if ENABLED(TFT_LVGL_UI_SPI) - #define SPI_TFT_CS_PIN TOUCH_CS_PIN - #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN - #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN - #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN - #define SPI_TFT_DC_PIN PB6 - #define SPI_TFT_RST_PIN PF11 - #endif #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -191,12 +138,23 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_PIXEL_WIDTH 480 - #define LCD_PIXEL_HEIGHT 320 - #define LCD_FULL_PIXEL_WIDTH LCD_PIXEL_WIDTH - #define LCD_FULL_PIXEL_HEIGHT LCD_PIXEL_HEIGHT - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_PIXEL_OFFSET_Y 48 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_PIXEL_OFFSET_X 48 + #define TFT_PIXEL_OFFSET_Y 32 + +#endif + +#if HAS_TFT_LVGL_UI + + // LVGL + + #define HAS_SPI_FLASH_FONT 1 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 1 + #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 #define XPT2046_X_CALIBRATION -17181 #define XPT2046_Y_CALIBRATION 11434 @@ -204,31 +162,38 @@ #define XPT2046_Y_OFFSET -9 #elif ENABLED(TFT_480x320) - #define TFT_RESET_PIN PF11 - #define TFT_BACKLIGHT_PIN PD13 - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 + // Color UI + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #define XPT2046_X_CALIBRATION -17181 #define XPT2046_Y_CALIBRATION 11434 #define XPT2046_X_OFFSET 501 #define XPT2046_Y_OFFSET -9 - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI +#elif ENABLED(FSMC_GRAPHICAL_TFT) - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 + // Emulated DOGM + + #define GRAPHICAL_TFT_UPSCALE 3 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available -// We nee to use the SPI2 +// Needs to use SPI2 #define ENABLE_SPI2 #define SCK_PIN PB13 #define MISO_PIN PB14 @@ -240,5 +205,5 @@ // #define SDIO_SUPPORT #define SD_DETECT_PIN -1 // PF0, but it isn't connected -#define SDIO_CLOCK 4500000 -#define SDIO_READ_RETRIES 16 +#define SDIO_CLOCK 4500000 +#define SDIO_READ_RETRIES 16 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 3d36de8242..d128d4e1ae 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -48,7 +48,7 @@ #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif // @@ -96,7 +96,7 @@ // #define HEATER_0_PIN PG12 // HEATER1 #define HEATER_BED_PIN PG11 // HOT BED -//#define HEATER_BED_INVERTING true +//#define HEATER_BED_INVERTING true // // Fans @@ -119,71 +119,9 @@ #define FIL_RUNOUT2_PIN PF13 #endif -// -// TronXY TFT Support -// -#if ENABLED(FSMC_GRAPHICAL_TFT) - #define FSMC_UPSCALE 3 - - #define LCD_RESET_PIN PF11 - #define LCD_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens - #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif - #endif - -#elif ENABLED(TFT_480x320) - #define TFT_RESET_PIN PF11 - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define XPT2046_X_CALIBRATION -17181 - #define XPT2046_Y_CALIBRATION 11434 - #define XPT2046_X_OFFSET 501 - #define XPT2046_Y_OFFSET -9 - - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 -#endif - // SPI Flash -#define SPI_FLASH_SIZE 0x200000 // 2MB -#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x200000 // 2MB +#define HAS_SPI_FLASH 1 // SPI 2 #define W25QXX_CS_PIN PB12 @@ -191,28 +129,16 @@ #define W25QXX_MISO_PIN PB14 #define W25QXX_SCK_PIN PB13 -#if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 0 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 0 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 +// +// TronXY TFT Support +// +// Shared FSMC Configs +#if HAS_FSMC_TFT #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - //#define TOUCH_INT_PIN PB6 - - #if ENABLED(TFT_LVGL_UI_SPI) - #define SPI_TFT_CS_PIN TOUCH_CS_PIN - #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN - #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN - #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN - #define SPI_TFT_DC_PIN PB6 - #define SPI_TFT_RST_PIN PF11 - #endif #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -225,17 +151,56 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_PIXEL_WIDTH 480 - #define LCD_PIXEL_HEIGHT 320 - #define LCD_FULL_PIXEL_WIDTH LCD_PIXEL_WIDTH - #define LCD_FULL_PIXEL_HEIGHT LCD_PIXEL_HEIGHT - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_PIXEL_OFFSET_Y 48 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_PIXEL_OFFSET_X 48 + #define TFT_PIXEL_OFFSET_Y 32 + +#endif + +// LVGL Configs +#if HAS_TFT_LVGL_UI + + #define HAS_SPI_FLASH_FONT 1 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 1 + #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 #define XPT2046_X_CALIBRATION -17181 #define XPT2046_Y_CALIBRATION 11434 #define XPT2046_X_OFFSET 501 #define XPT2046_Y_OFFSET -9 + +// Color UI Configs +#elif ENABLED(TFT_480x320) + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 + + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 + +// Emulated DOGM +#elif ENABLED(FSMC_GRAPHICAL_TFT) + #define GRAPHICAL_TFT_UPSCALE 3 + + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif + #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available @@ -251,5 +216,5 @@ // #define SDIO_SUPPORT #define SD_DETECT_PIN -1 // PF0, but it isn't connected -#define SDIO_CLOCK 4500000 -#define SDIO_READ_RETRIES 16 +#define SDIO_CLOCK 4500000 +#define SDIO_READ_RETRIES 16 diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 490fb617d1..32e7e2993c 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -86,8 +86,8 @@ #define FAN_PIN PA15 // pin 77 (4cm Fan) #define FAN_SOFT_PWM // Required to avoid issues with heating or STLink -#define FAN_MIN_PWM 35 // Fan will not start in 1-30 range -#define FAN_MAX_PWM 255 +#define FAN_MIN_PWM 35 // Fan will not start in 1-30 range +#define FAN_MAX_PWM 255 //#define BEEPER_PIN PD13 // pin 60 (Servo PWM output 5V/GND on Board V0G+) made for BL-Touch sensor // Can drive a PC Buzzer, if connected between PWM and 5V pins @@ -130,11 +130,11 @@ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 -#define FSMC_UPSCALE 2 -#define LCD_FULL_PIXEL_WIDTH 320 -#define LCD_FULL_PIXEL_HEIGHT 240 -#define LCD_PIXEL_OFFSET_X 32 -#define LCD_PIXEL_OFFSET_Y 32 +#define GRAPHICAL_TFT_UPSCALE 2 +#define TFT_WIDTH 320 +#define TFT_HEIGHT 240 +#define TFT_PIXEL_OFFSET_X 32 +#define TFT_PIXEL_OFFSET_Y 32 /** * Note: Alfawise U20/U30 boards DON'T use SPI2, as the hardware designer @@ -160,12 +160,12 @@ #if ENABLED(SPI_EEPROM) // SPI1 EEPROM Winbond W25Q64 (8MB/64Mbits) - #define SPI_CHAN_EEPROM1 1 + #define SPI_CHAN_EEPROM1 1 #define SPI_EEPROM1_CS PC5 // pin 34 #define EEPROM_SCK BOARD_SPI1_SCK_PIN // PA5 pin 30 #define EEPROM_MISO BOARD_SPI1_MISO_PIN // PA6 pin 31 #define EEPROM_MOSI BOARD_SPI1_MOSI_PIN // PA7 pin 32 - #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) + #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64KB for now... #elif ENABLED(FLASH_EEPROM_EMULATION) // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) @@ -173,5 +173,5 @@ #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE (EEPROM_PAGE_SIZE) #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 948663f6f0..6a015a4709 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -127,10 +127,10 @@ #define PS_ON_PIN PA3 // PW_OFF //#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define SUICIDE_PIN_INVERTING false +//#define SUICIDE_PIN_INVERTING false //#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY +//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY #define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY @@ -138,7 +138,7 @@ #define MT_DET_1_PIN PA4 #define MT_DET_2_PIN PE6 -#define MT_DET_PIN_INVERTING false +#define MT_DET_PIN_INVERTING false #define WIFI_IO0_PIN PC13 @@ -150,7 +150,7 @@ #endif #define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SDIO_CLOCK 4500000 // 4.5 MHz #define SD_DETECT_PIN PD12 #define ONBOARD_SD_CS_PIN PC11 @@ -165,8 +165,8 @@ * to let the bootloader init the screen. */ -#if ENABLED(TFT_LVGL_UI_FSMC) - +// Shared FSMC Configs +#if HAS_FSMC_TFT #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -175,59 +175,10 @@ #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - #define LCD_BACKLIGHT_PIN PD13 - - #define XPT2046_X_CALIBRATION 17880 - #define XPT2046_Y_CALIBRATION -12234 - #define XPT2046_X_OFFSET -45 - #define XPT2046_Y_OFFSET 349 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - -#elif ENABLED(FSMC_GRAPHICAL_TFT) - - #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h - #define DOGLCD_SCK -1 - - #ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 3 - #endif - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 - #endif - #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 48 - #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 - #endif - #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 - #endif - - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - #endif - -#elif ENABLED(TFT_480x320) - #define TFT_RESET_PIN PC6 + #define TFT_RESET_PIN PC6 // FSMC_RST #define TFT_BACKLIGHT_PIN PD13 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT @@ -236,23 +187,66 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 +#endif + +// LVGL Configs +#if ENABLED(TFT_LVGL_UI_FSMC) + #define XPT2046_X_CALIBRATION 17880 #define XPT2046_Y_CALIBRATION -12234 #define XPT2046_X_OFFSET -45 #define XPT2046_Y_OFFSET 349 - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI +// Emulated DOGM Configs +#elif ENABLED(FSMC_GRAPHICAL_TFT) - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 + #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h + #define DOGLCD_SCK -1 + + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 + #endif + #ifndef TFT_WIDTH + #define TFT_WIDTH 480 + #endif + #ifndef TFT_PIXEL_OFFSET_X + #define TFT_PIXEL_OFFSET_X 48 + #endif + #ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 + #endif + #ifndef TFT_PIXEL_OFFSET_Y + #define TFT_PIXEL_OFFSET_Y 32 + #endif + + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 12149 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -8746 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -35 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 256 + #endif + +#elif ENABLED(TFT_480x320) + #define XPT2046_X_CALIBRATION 17880 + #define XPT2046_Y_CALIBRATION -12234 + #define XPT2046_X_OFFSET -45 + #define XPT2046_Y_OFFSET 349 + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV #endif -#define HAS_SPI_FLASH 1 -#define SPI_FLASH_SIZE 0x1000000 // 16MB +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index feac729c73..0f9e6eb371 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -29,6 +29,8 @@ #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." +#elif HAS_FSMC_TFT + #error "MKS Robin nano v2 doesn't support FSMC-based TFT displays." #endif #define BOARD_INFO_NAME "MKS Robin nano V2.0" @@ -47,13 +49,13 @@ #if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM // EEPROM on I2C-0 - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // // Note: MKS Robin board is using SPI2 interface. // -//#define SPI_MODULE 2 +//#define SPI_MODULE 2 #define ENABLE_SPI2 // @@ -162,7 +164,7 @@ #define E1_SERIAL_RX_PIN PD8 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // TMC2208 || TMC2209 // @@ -194,10 +196,10 @@ #define PS_ON_PIN PA3 // PW_OFF //#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define SUICIDE_PIN_INVERTING false +//#define SUICIDE_PIN_INVERTING false //#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY +//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY #define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY @@ -205,7 +207,7 @@ #define MT_DET_1_PIN PA4 #define MT_DET_2_PIN PE6 -#define MT_DET_PIN_INVERTING false +#define MT_DET_PIN_INVERTING false #ifndef FIL_RUNOUT_PIN #define FIL_RUNOUT_PIN MT_DET_1_PIN @@ -224,7 +226,7 @@ #endif #define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SDIO_CLOCK 4500000 // 4.5 MHz #define SD_DETECT_PIN PD12 #define ONBOARD_SD_CS_PIN PC11 @@ -241,14 +243,9 @@ * to let the bootloader init the screen. */ -#if ENABLED(TFT_LVGL_UI_SPI) +#if HAS_SPI_TFT - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 + // Shared SPI TFT #define LCD_BACKLIGHT_PIN PD13 @@ -261,87 +258,88 @@ #define BTN_EN2 PE11 #define BTN_ENC PE13 - #define TFT_CS_PIN PD11 - #define TFT_SCK_PIN PA5 - #define TFT_MISO_PIN PA6 - #define TFT_MOSI_PIN PA7 - #define TFT_DC_PIN PD10 - #define TFT_RST_PIN PC6 - #define TFT_A0_PIN TFT_DC_PIN + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 - #define XPT2046_X_CALIBRATION -17253 - #define XPT2046_Y_CALIBRATION 11579 - #define XPT2046_X_OFFSET 514 - #define XPT2046_Y_OFFSET -24 #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 + #ifndef TFT_WIDTH + #define TFT_WIDTH 480 #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 + #ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 #endif + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + #endif -#if HAS_SPI_LCD +#if ENABLED(TFT_LVGL_UI_SPI) - #if ENABLED(SPI_GRAPHICAL_TFT) // Emulated DOGM SPI - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 + // LVGL - #define LCD_BACKLIGHT_PIN PD13 + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 - #define LCD_READ_ID 0xD3 - #define LCD_USE_DMA_SPI +#elif ENABLED(SPI_GRAPHICAL_TFT) - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + // Emulated DOGM SPI - //#define TOUCH_SCREEN - #if EITHER(TOUCH_SCREEN, NEED_TOUCH_PINS) - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11386 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8684 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 339 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -18 + #endif - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -5481 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 4000 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 343 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 0 - #endif - #endif + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 + #endif + #ifndef TFT_PIXEL_OFFSET_Y + #define TFT_PIXEL_OFFSET_Y 32 + #endif - #ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 3 - #endif - #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 - #endif + #define BTN_ENC PE13 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 - #define BTN_ENC PE13 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 +#elif ENABLED(TFT_480x320_SPI) + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 - #elif ENABLED(MKS_MINI_12864) + #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 + +#endif + +#if HAS_SPI_LCD && !HAS_SPI_TFT + + // NON TFT Displays + + #if ENABLED(MKS_MINI_12864) // MKS MINI12864 and MKS LCD12864B // If using MKS LCD12864A (Need to remove RPK2 resistor) @@ -357,37 +355,6 @@ #define MKS_LCD12864B #undef SHOW_BOOTSCREEN - #elif ENABLED(TFT_480x320_SPI) - #define TFT_CS_PIN PD11 - #define TFT_SCK_PIN PA5 - #define TFT_MISO_PIN PA6 - #define TFT_MOSI_PIN PA7 - #define TFT_DC_PIN PD10 - #define TFT_RST_PIN PC6 - #define TFT_A0_PIN TFT_DC_PIN - - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 - - #define XPT2046_X_CALIBRATION -17253 - #define XPT2046_Y_CALIBRATION 11579 - #define XPT2046_X_OFFSET 514 - #define XPT2046_Y_OFFSET -24 - - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define TFT_DRIVER ST7796 - #define TFT_BUFFER_SIZE 14400 - - #define LCD_READ_ID 0xD3 - #define LCD_USE_DMA_SPI - - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 @@ -409,10 +376,10 @@ #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD +#endif // HAS_SPI_LCD && !HAS_SPI_TFT -#define HAS_SPI_FLASH 1 -#define SPI_FLASH_SIZE 0x1000000 // 16MB +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 diff --git a/buildroot/share/scripts/pinsformat.js b/buildroot/share/scripts/pinsformat.js index 3e2a57b556..a82c2f2659 100755 --- a/buildroot/share/scripts/pinsformat.js +++ b/buildroot/share/scripts/pinsformat.js @@ -38,10 +38,12 @@ for (let m of mpatt) mexpr.push(new RegExp('^' + m + '$')); const argv = process.argv.slice(2), argc = argv.length; -var src_file = 0, src_name = 'STDIN', dst_file; +var src_file = 0, src_name = 'STDIN', dst_file, do_log = false; if (argc > 0) { - src_file = src_name = argv[0]; - dst_file = argv[argc > 1 ? 1 : 0]; + let ind = 0; + if (argv[0] == '-v') { do_log = true; ind++; } + dst_file = src_file = src_name = argv[ind++]; + if (ind < argc) dst_file = argv[ind]; } // Read from file or STDIN until it terminates @@ -81,7 +83,7 @@ function process_text(txt) { aliasPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([A-Z_][A-Z0-9_()]+)\\s*(//.*)?$'), switchPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'), undefPatt = new RegExp('^(\\s*(//)?#undef)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'), - defPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(\\w+)\\s*(//.*)?$'), + defPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([-_\\w]+)\\s*(//.*)?$'), condPatt = new RegExp('^(\\s*(//)?#(if|ifn?def|else|elif)(\\s+\\S+)*)\\s+(//.*)$'), commPatt = new RegExp('^\\s{20,}(//.*)?$'); const col_value_lj = col_comment - patt.pad - 2; @@ -98,6 +100,7 @@ function process_text(txt) { // // #define MY_PIN [pin] // + if (do_log) console.log("pin:", line); const pinnum = r[4].charAt(0) == 'P' ? r[4] : r[4].lpad(patt.pad); line = r[1] + ' ' + r[3]; line = line.rpad(col_value_lj) + pinnum; @@ -107,31 +110,57 @@ function process_text(txt) { // // #define MY_PIN -1 // + if (do_log) console.log("pin -1:", line); line = r[1] + ' ' + r[3]; line = line.rpad(col_value_lj) + '-1'; if (r[5]) line = line.rpad(col_comment) + r[5]; } else if ((r = skipPatt.exec(line)) !== null) { + // + // #define SKIP_ME + // + if (do_log) console.log("skip:", line); } else if ((r = aliasPatt.exec(line)) !== null) { + // + // #define ALIAS OTHER + // + if (do_log) console.log("alias:", line); line = r[1] + ' ' + r[3]; line += r[4].lpad(col_value_rj + 1 - line.length); if (r[5]) line = line.rpad(col_comment) + r[5]; } else if ((r = switchPatt.exec(line)) !== null) { + // + // #define SWITCH + // + if (do_log) console.log("switch:", line); line = r[1] + ' ' + r[3]; if (r[4]) line = line.rpad(col_comment) + r[4]; check_comment_next = true; } else if ((r = defPatt.exec(line)) !== null) { - line = r[1] + ' ' + r[3] + ' ' + r[4]; - if (r[5]) line = line.rpad(col_comment) + r[5]; + // + // #define ... + // + if (do_log) console.log("def:", line); + line = r[1] + ' ' + r[3] + ' '; + line += r[4].lpad(col_value_rj + 1 - line.length); + if (r[5]) line = line.rpad(col_comment - 1) + ' ' + r[5]; } else if ((r = undefPatt.exec(line)) !== null) { + // + // #undef ... + // + if (do_log) console.log("undef:", line); line = r[1] + ' ' + r[3]; if (r[4]) line = line.rpad(col_comment) + r[4]; } else if ((r = condPatt.exec(line)) !== null) { + // + // #if ... + // + if (do_log) console.log("cond:", line); line = r[1].rpad(col_comment) + r[5]; check_comment_next = true; } From 7852b060381948b8f94f07b7b627de059cea766a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 20:26:16 -0500 Subject: [PATCH 0122/1370] Menu headers followup --- Marlin/src/lcd/menu/menu.h | 5 +++++ Marlin/src/lcd/tft/touch.cpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index c457eaf295..1dff9d94fc 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -196,6 +196,7 @@ void menu_move(); //////// Menu Item Helper Functions //////// //////////////////////////////////////////// +void lcd_move_z(); void _lcd_draw_homing(); #define HAS_LINE_TO_Z ANY(DELTA, PROBE_MANUALLY, MESH_BED_LEVELING, LEVEL_BED_CORNERS) @@ -230,3 +231,7 @@ void _lcd_draw_homing(); #endif #endif + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + void touch_screen_calibration(); +#endif diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 00c7439a58..d2b860ab15 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -24,7 +24,7 @@ #include "touch.h" #include "../ultralcd.h" // for ui methods -#include "../menu/menu.h" // for touch_screen_calibration +#include "../menu/menu_item.h" // for touch_screen_calibration #include "../../module/temperature.h" #include "../../module/planner.h" From 038945110f6ce5c2ed62ab21276cc731aa6376b8 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 22 Aug 2020 04:20:30 +0200 Subject: [PATCH 0123/1370] Optional homing in LCD Repeatability Test (#19104) --- Marlin/src/gcode/calibrate/M48.cpp | 169 +++++++++++++------------- Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/language/language_it.h | 1 + Marlin/src/lcd/menu/menu_motion.cpp | 2 +- 4 files changed, 90 insertions(+), 83 deletions(-) diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 47c72eece7..fc9d22957b 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -27,13 +27,10 @@ #include "../gcode.h" #include "../../module/motion.h" #include "../../module/probe.h" +#include "../../lcd/ultralcd.h" #include "../../feature/bedlevel/bedlevel.h" -#if HAS_SPI_LCD - #include "../../lcd/ultralcd.h" -#endif - #if HAS_LEVELING #include "../../module/planner.h" #endif @@ -77,61 +74,85 @@ void GcodeSuite::M48() { const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - xy_float_t next_pos = current_position; - - const xy_pos_t probe_pos = { - parser.linearval('X', next_pos.x + probe.offset_xy.x), // If no X use the probe's current X position - parser.linearval('Y', next_pos.y + probe.offset_xy.y) // If no Y, ditto + // Test at the current position by default, overridden by X and Y + const xy_pos_t test_position = { + parser.linearval('X', current_position.x + probe.offset_xy.x), // If no X use the probe's current X position + parser.linearval('Y', current_position.y + probe.offset_xy.y) // If no Y, ditto }; - if (!probe.can_reach(probe_pos)) { + if (!probe.can_reach(test_position)) { + ui.set_status_P(GET_TEXT(MSG_M48_OUT_OF_BOUNDS), 99); SERIAL_ECHOLNPGM("? (X,Y) out of bounds."); return; } + // Get the number of leg moves per test-point bool seen_L = parser.seen('L'); uint8_t n_legs = seen_L ? parser.value_byte() : 0; if (n_legs > 15) { - SERIAL_ECHOLNPGM("?Number of legs in movement not plausible (0-15)."); + SERIAL_ECHOLNPGM("?Legs of movement implausible (0-15)."); return; } if (n_legs == 1) n_legs = 2; + // Schizoid motion as an optional stress-test const bool schizoid_flag = parser.boolval('S'); if (schizoid_flag && !seen_L) n_legs = 7; - /** - * Now get everything to the specified probe point So we can safely do a - * probe to get us close to the bed. If the Z-Axis is far from the bed, - * we don't want to use that as a starting point for each probe. - */ if (verbose_level > 2) SERIAL_ECHOLNPGM("Positioning the probe..."); - // Disable bed level correction in M48 because we want the raw data when we probe + // Always disable Bed Level correction before probing... #if HAS_LEVELING const bool was_enabled = planner.leveling_active; set_bed_leveling_enabled(false); #endif + // Work with reasonable feedrates remember_feedrate_scaling_off(); - float mean = 0.0, sigma = 0.0, min = 99999.9, max = -99999.9, sample_set[n_samples]; + // Working variables + float mean = 0.0, // The average of all points so far, used to calculate deviation + sigma = 0.0, // Standard deviation of all points so far + min = 99999.9, // Smallest value sampled so far + max = -99999.9, // Largest value sampled so far + sample_set[n_samples]; // Storage for sampled values + + auto dev_report = [](const bool verbose, const float &mean, const float &sigma, const float &min, const float &max, const bool final=false) { + if (verbose) { + SERIAL_ECHOPAIR_F("Mean: ", mean, 6); + if (!final) SERIAL_ECHOPAIR_F(" Sigma: ", sigma, 6); + SERIAL_ECHOPAIR_F(" Min: ", min, 3); + SERIAL_ECHOPAIR_F(" Max: ", max, 3); + SERIAL_ECHOPAIR_F(" Range: ", max-min, 3); + if (final) SERIAL_EOL(); + } + if (final) { + SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); + SERIAL_EOL(); + } + }; // Move to the first point, deploy, and probe - const float t = probe.probe_at_point(probe_pos, raise_after, verbose_level); + const float t = probe.probe_at_point(test_position, raise_after, verbose_level); bool probing_good = !isnan(t); if (probing_good) { randomSeed(millis()); + float sample_sum = 0.0; + LOOP_L_N(n, n_samples) { #if HAS_SPI_LCD // Display M48 progress in the status bar ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); #endif + + // When there are "legs" of movement move around the point before probing if (n_legs) { + + // Pick a random direction, starting angle, and radius const int dir = (random(0, 10) > 5.0) ? -1 : 1; // clockwise or counter clockwise float angle = random(0, 360); const float radius = random( @@ -142,48 +163,51 @@ void GcodeSuite::M48() { int(5), int(0.125 * _MIN(X_BED_SIZE, Y_BED_SIZE)) #endif ); - if (verbose_level > 3) { SERIAL_ECHOPAIR("Start radius:", radius, " angle:", angle, " dir:"); if (dir > 0) SERIAL_CHAR('C'); SERIAL_ECHOLNPGM("CW"); } + // Move from leg to leg in rapid succession LOOP_L_N(l, n_legs - 1) { - float delta_angle; + // Move some distance around the perimeter + float delta_angle; if (schizoid_flag) { - // The points of a 5 point star are 72 degrees apart. We need to - // skip a point and go to the next one on the star. + // The points of a 5 point star are 72 degrees apart. + // Skip a point and go to the next one on the star. delta_angle = dir * 2.0 * 72.0; } else { - // If we do this line, we are just trying to move further - // around the circle. - delta_angle = dir * (float) random(25, 45); + // Just move further along the perimeter. + delta_angle = dir * (float)random(25, 45); } - angle += delta_angle; - while (angle > 360.0) angle -= 360.0; // We probably do not need to keep the angle between 0 and 2*PI, but the - // Arduino documentation says the trig functions should not be given values - while (angle < 0.0) angle += 360.0; // outside of this range. It looks like they behave correctly with - // numbers outside of the range, but just to be safe we clamp them. - const xy_pos_t noz_pos = probe_pos - probe.offset_xy; - next_pos.set(noz_pos.x + cos(RADIANS(angle)) * radius, - noz_pos.y + sin(RADIANS(angle)) * radius); + // Trig functions work without clamping, but just to be safe... + while (angle > 360.0) angle -= 360.0; + while (angle < 0.0) angle += 360.0; - #if DISABLED(DELTA) - LIMIT(next_pos.x, X_MIN_POS, X_MAX_POS); - LIMIT(next_pos.y, Y_MIN_POS, Y_MAX_POS); - #else - // If we have gone out too far, we can do a simple fix and scale the numbers - // back in closer to the origin. + // Choose the next position as an offset to chosen test position + const xy_pos_t noz_pos = test_position - probe.offset_xy; + xy_pos_t next_pos = { + noz_pos.x + cos(RADIANS(angle)) * radius, + noz_pos.y + sin(RADIANS(angle)) * radius + }; + + #if ENABLED(DELTA) + // If the probe can't reach the point on a round bed... + // Simply scale the numbers to bring them closer to origin. while (!probe.can_reach(next_pos)) { next_pos *= 0.8f; if (verbose_level > 3) SERIAL_ECHOLNPAIR_P(PSTR("Moving inward: X"), next_pos.x, SP_Y_STR, next_pos.y); } + #else + // For a rectangular bed just keep the probe in bounds + LIMIT(next_pos.x, X_MIN_POS, X_MAX_POS); + LIMIT(next_pos.y, Y_MIN_POS, Y_MAX_POS); #endif if (verbose_level > 3) @@ -194,45 +218,35 @@ void GcodeSuite::M48() { } // n_legs // Probe a single point - sample_set[n] = probe.probe_at_point(probe_pos, raise_after, 0); + const float pz = probe.probe_at_point(test_position, raise_after, 0); // Break the loop if the probe fails - probing_good = !isnan(sample_set[n]); + probing_good = !isnan(pz); if (!probing_good) break; - /** - * Get the current mean for the data points we have so far - */ - float sum = 0.0; - LOOP_LE_N(j, n) sum += sample_set[j]; - mean = sum / (n + 1); + // Store the new sample + sample_set[n] = pz; - NOMORE(min, sample_set[n]); - NOLESS(max, sample_set[n]); + // Keep track of the largest and smallest samples + NOMORE(min, pz); + NOLESS(max, pz); - /** - * Now, use that mean to calculate the standard deviation for the - * data points we have so far - */ - sum = 0.0; - LOOP_LE_N(j, n) - sum += sq(sample_set[j] - mean); + // Get the mean value of all samples thus far + sample_sum += pz; + mean = sample_sum / (n + 1); - sigma = SQRT(sum / (n + 1)); - if (verbose_level > 0) { - if (verbose_level > 1) { - SERIAL_ECHO(n + 1); - SERIAL_ECHOPAIR(" of ", int(n_samples)); - SERIAL_ECHOPAIR_F(": z: ", sample_set[n], 3); - if (verbose_level > 2) { - SERIAL_ECHOPAIR_F(" mean: ", mean, 4); - SERIAL_ECHOPAIR_F(" sigma: ", sigma, 6); - SERIAL_ECHOPAIR_F(" min: ", min, 3); - SERIAL_ECHOPAIR_F(" max: ", max, 3); - SERIAL_ECHOPAIR_F(" range: ", max-min, 3); - } - SERIAL_EOL(); - } + // Calculate the standard deviation so far. + // The value after the last sample will be the final output. + float dev_sum = 0.0; + LOOP_LE_N(j, n) dev_sum += sq(sample_set[j] - mean); + sigma = SQRT(dev_sum / (n + 1)); + + if (verbose_level > 1) { + SERIAL_ECHO(n + 1); + SERIAL_ECHOPAIR(" of ", int(n_samples)); + SERIAL_ECHOPAIR_F(": z: ", pz, 3); + dev_report(verbose_level > 2, mean, sigma, min, max); + SERIAL_EOL(); } } // n_samples loop @@ -242,16 +256,7 @@ void GcodeSuite::M48() { if (probing_good) { SERIAL_ECHOLNPGM("Finished!"); - - if (verbose_level > 0) { - SERIAL_ECHOPAIR_F("Mean: ", mean, 6); - SERIAL_ECHOPAIR_F(" Min: ", min, 3); - SERIAL_ECHOPAIR_F(" Max: ", max, 3); - SERIAL_ECHOLNPAIR_F(" Range: ", max-min, 3); - } - - SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); - SERIAL_EOL(); + dev_report(verbose_level > 0, mean, sigma, min, max, true); #if HAS_SPI_LCD // Display M48 results in the status bar diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 3791a4ad18..5aa0d76a84 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -124,6 +124,7 @@ namespace Language_en { PROGMEM Language_Str MSG_USER_MENU = _UxGT("Custom Commands"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Probe out of bounds"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviation"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mode"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 1a5bdb22e9..43765d7c3a 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -122,6 +122,7 @@ namespace Language_it { PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz."); PROGMEM Language_Str MSG_M48_TEST = _UxGT("Test sonda M48"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("Punto M48"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviazione"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Strumenti Offsets"); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 914b229008..027be4029d 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -386,7 +386,7 @@ void menu_motion() { #endif #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - GCODES_ITEM(MSG_M48_TEST, PSTR("G28\nM48 P10")); + GCODES_ITEM(MSG_M48_TEST, PSTR("G28 O\nM48 P10")); #endif // From 46744e8433b224f30bf55584f384c40354a56062 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 22 Aug 2020 14:56:18 +1200 Subject: [PATCH 0124/1370] Creality3D v4.2.7 (#19088) --- Marlin/src/core/boards.h | 3 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 40 ++++++++++++---- Marlin/src/pins/stm32f1/pins_CREALITY_V427.h | 48 ++++++++++++++++++++ 4 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V427.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 32b9168a62..cadbc71421 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -313,7 +313,8 @@ #define BOARD_CHITU3D_V5 4031 // Chitu3D TronXY X5SA V5 Board #define BOARD_CHITU3D_V6 4032 // Chitu3D TronXY X5SA V5 Board #define BOARD_CREALITY_V4 4033 // Creality v4.x (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4034 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_CREALITY_V427 4034 // Creality v4.2.7 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4035 // Trigorilla Pro (STM32F103ZET6) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 9b6be5a6e1..f2aec72c46 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -550,6 +550,8 @@ #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 #elif MB(CREALITY_V4) #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality +#elif MB(CREALITY_V427) + #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality #elif MB(TRIGORILLA_PRO) #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 5aab757129..f42d786695 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -32,8 +32,12 @@ #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "CREALITY V4" -#define DEFAULT_MACHINE_NAME "Ender 3 V2" +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Creality V4" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "Ender 3 V2" +#endif // // EEPROM @@ -90,20 +94,36 @@ // Steppers // #define X_ENABLE_PIN PC3 -#define X_STEP_PIN PC2 -#define X_DIR_PIN PB9 +#ifndef X_STEP_PIN + #define X_STEP_PIN PC2 +#endif +#ifndef X_DIR_PIN + #define X_DIR_PIN PB9 +#endif #define Y_ENABLE_PIN PC3 -#define Y_STEP_PIN PB8 -#define Y_DIR_PIN PB7 +#ifndef Y_STEP_PIN + #define Y_STEP_PIN PB8 +#endif +#ifndef Y_DIR_PIN + #define Y_DIR_PIN PB7 +#endif #define Z_ENABLE_PIN PC3 -#define Z_STEP_PIN PB6 -#define Z_DIR_PIN PB5 +#ifndef Z_STEP_PIN + #define Z_STEP_PIN PB6 +#endif +#ifndef Z_DIR_PIN + #define Z_DIR_PIN PB5 +#endif #define E0_ENABLE_PIN PC3 -#define E0_STEP_PIN PB4 -#define E0_DIR_PIN PB3 +#ifndef E0_STEP_PIN + #define E0_STEP_PIN PB4 +#endif +#ifndef E0_DIR_PIN + #define E0_DIR_PIN PB3 +#endif // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h new file mode 100644 index 0000000000..9453a6d515 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * CREALITY v4.2.7 (STM32F103) board pin assignments + */ + +#ifndef __STM32F1__ + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Creality v4.2.7" +#define DEFAULT_MACHINE_NAME "Creality3D" + +// +// Steppers +// +#define X_STEP_PIN PB9 +#define X_DIR_PIN PC2 +#define Y_STEP_PIN PB7 + +#define Y_DIR_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB6 + +#define E0_STEP_PIN PB3 +#define E0_DIR_PIN PB4 + +#include "pins_CREALITY_V4.h" From 744f74506fb64aa4f5fa0542b5a86e8cffab2a56 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 21:59:59 -0500 Subject: [PATCH 0125/1370] More menu header fu --- Marlin/src/lcd/menu/menu.h | 10 ++++++++++ Marlin/src/lcd/menu/menu_item.h | 10 ---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 1dff9d94fc..d692144464 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -79,6 +79,16 @@ class MenuItem_static : public MenuItemBase { static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const vstr=nullptr); }; +// BACK_ITEM(LABEL) +class MenuItem_back : public MenuItemBase { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { + _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); + } + // Back Item action goes back one step in history + FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } +}; + // CONFIRM_ITEM(LABEL,Y,N,FY,FN,...), // YESNO_ITEM(LABEL,FY,FN,...) class MenuItem_confirm : public MenuItemBase { diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 66ed0e402d..b322246e50 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -33,16 +33,6 @@ void lcd_move_z(); ///////////// Base Menu Items ////////////// //////////////////////////////////////////// -// BACK_ITEM(LABEL) -class MenuItem_back : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { - _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); - } - // Back Item action goes back one step in history - FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } -}; - // SUBMENU(LABEL, screen_handler) class MenuItem_submenu : public MenuItemBase { public: From 0ffd5aa743abb2d952c501f07c56f022583c20c6 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 22 Aug 2020 00:03:32 -0300 Subject: [PATCH 0126/1370] CI with PIO-dev (#19058) --- .github/workflows/test-builds.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 1467f1b33f..fdb81fbdc9 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -106,7 +106,7 @@ jobs: - name: Install PlatformIO run: | - pip install -U https://github.com/platformio/platformio-core/archive/master.zip + pip install -U https://github.com/platformio/platformio-core/archive/develop.zip platformio update - name: Check out the PR From 070412a6a5faf60b29ac3b64ce362193efeb9431 Mon Sep 17 00:00:00 2001 From: mmajoor Date: Sat, 22 Aug 2020 05:04:31 +0200 Subject: [PATCH 0127/1370] GRAPHICAL_TFT_ROTATE_180 for ST7789V (#19042) --- Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index dc8fbc53fa..b8bfdb293a 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -298,7 +298,7 @@ static const uint16_t st7789v_init[] = { ESC_REG(0x0010), ESC_DELAY(10), ESC_REG(0x0001), ESC_DELAY(200), ESC_REG(0x0011), ESC_DELAY(120), - ESC_REG(0x0036), 0x00A0, + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x0060, 0x00A0), ESC_REG(0x003A), 0x0055, ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F, ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF, From a5dc42c47cf40d8c8d55403a7b14330151402d8e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 22:50:45 -0500 Subject: [PATCH 0128/1370] Update copy_marlin_variant_to_framework.py --- .../scripts/copy_marlin_variant_to_framework.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index b66ba27fa6..f7d3f0d03a 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -1,7 +1,19 @@ import os,shutil from SCons.Script import DefaultEnvironment from platformio import util -from platformio.managers.package import PackageManager +try: + # PIO < 4.4 + from platformio.managers.package import PackageManager +except ImportError: + # PIO >= 4.4 + from platformio.package.meta import PackageSpec as PackageManager + +def parse_pkg_uri(spec): + if PackageManager.__name__ == 'PackageSpec': + return PackageManager(spec).name + else: + name, _, _ = PackageManager.parse_pkg_uri(spec) + return name def copytree(src, dst, symlinks=False, ignore=None): for item in os.listdir(src): @@ -26,7 +38,7 @@ framewords = { if len(platform_packages) == 0: platform_name = framewords[platform.__class__.__name__] else: - platform_name, _, _ = PackageManager.parse_pkg_uri(platform_packages[0]) + platform_name = parse_pkg_uri(platform_packages[0]) FRAMEWORK_DIR = platform.get_package_dir(platform_name) assert os.path.isdir(FRAMEWORK_DIR) From fe1e880ffe2ead1bee5734cc563d2f493a9ac871 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 22 Aug 2020 06:13:43 +0200 Subject: [PATCH 0129/1370] HIGH/LOW naming of pin state settings (#19089) --- Marlin/Configuration.h | 2 +- Marlin/Configuration_adv.h | 2 +- Marlin/src/HAL/DUE/usb/arduino_due_x.h | 2 +- Marlin/src/MarlinCore.h | 4 ++-- Marlin/src/feature/spindle_laser.cpp | 12 ++++++------ Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/SanityCheck.h | 14 +++++++++----- 7 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 7f7931ae7d..2b36f883cc 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -330,7 +330,7 @@ //#define PSU_NAME "Power Supply" #if ENABLED(PSU_CONTROL) - #define PSU_ACTIVE_HIGH false // Set 'false' for ATX, 'true' for X-Box + #define PSU_ACTIVE_STATE LOW // Set 'LOW' for ATX, 'HIGH' for X-Box //#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80 //#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 529dcc3091..b27d7c79ea 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2851,7 +2851,7 @@ //#define SPINDLE_FEATURE //#define LASER_FEATURE #if EITHER(SPINDLE_FEATURE, LASER_FEATURE) - #define SPINDLE_LASER_ACTIVE_HIGH false // Set to "true" if the on/off function is active HIGH + #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if the on/off function is active HIGH #define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power #define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower diff --git a/Marlin/src/HAL/DUE/usb/arduino_due_x.h b/Marlin/src/HAL/DUE/usb/arduino_due_x.h index b5be621791..d3b333fb34 100644 --- a/Marlin/src/HAL/DUE/usb/arduino_due_x.h +++ b/Marlin/src/HAL/DUE/usb/arduino_due_x.h @@ -93,5 +93,5 @@ #define USB_VBOF_GPIO (PIO_PB10_IDX) #define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT) /*! Active level of the USB_VBOF output pin. */ -#define USB_VBOF_ACTIVE_LEVEL LOW +#define USB_VBOF_ACTIVE_STATE LOW /* ------------------------------------------------------------------------ */ diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index 81041c8ee6..69afc7f30e 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -89,8 +89,8 @@ extern bool wait_for_heatup; #if ENABLED(PSU_CONTROL) extern bool powersupply_on; - #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_HIGH); powersupply_on = true; }while(0) - #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_HIGH); powersupply_on = false; }while(0) + #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_STATE); powersupply_on = true; }while(0) + #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE); powersupply_on = false; }while(0) #if ENABLED(AUTO_POWER_CONTROL) #define PSU_ON() powerManager.power_on() #define PSU_OFF() powerManager.power_off() diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 9d2ee7d9e5..bc387a9334 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -37,7 +37,7 @@ cutter_power_t SpindleLaser::menuPower, // Power s SpindleLaser::unitPower; // LCD status power in PWM, PERCENT, or RPM #if ENABLED(MARLIN_DEV_MODE) - cutter_frequency_t SpindleLaser::frequency; // setting PWM frequency; range: 2K - 50K + cutter_frequency_t SpindleLaser::frequency; // PWM frequency setting; range: 2K - 50K #endif #define SPINDLE_LASER_PWM_OFF ((SPINDLE_LASER_PWM_INVERT) ? 255 : 0) @@ -45,13 +45,13 @@ cutter_power_t SpindleLaser::menuPower, // Power s // Init the cutter to a safe OFF state // void SpindleLaser::init() { - OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Init spindle to off + OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Init spindle to off #if ENABLED(SPINDLE_CHANGE_DIR) OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // Init rotation to clockwise (M3) #endif #if ENABLED(SPINDLE_LASER_PWM) SET_PWM(SPINDLE_LASER_PWM_PIN); - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // set to lowest speed + analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed #endif #if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY); @@ -64,14 +64,14 @@ void SpindleLaser::init() { * Set the cutter PWM directly to the given ocr value */ void SpindleLaser::set_ocr(const uint8_t ocr) { - WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_HIGH); // turn spindle on + WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_STATE); // Turn spindle on analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); #endif } void SpindleLaser::ocr_off() { - WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Turn spindle off + WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Turn spindle off analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Only write low byte } #endif @@ -98,7 +98,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) { isReady = false; } #else - WRITE(SPINDLE_LASER_ENA_PIN, enabled() == SPINDLE_LASER_ACTIVE_HIGH); + WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE); isReady = true; #endif } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 5d7322753f..f566643bdb 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -403,7 +403,7 @@ #ifndef PSU_NAME #if DISABLED(PSU_CONTROL) #define PSU_NAME "Generic" // No control - #elif PSU_ACTIVE_HIGH + #elif PSU_ACTIVE_STATE #define PSU_NAME "XBox" // X-Box 360 (203W) #else #define PSU_NAME "ATX" // ATX style diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 01243219c2..ddefcc8b60 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -419,8 +419,10 @@ #error "SPINDLE_DIR_CHANGE is now SPINDLE_CHANGE_DIR. Please update your Configuration_adv.h." #elif defined(SPINDLE_STOP_ON_DIR_CHANGE) #error "SPINDLE_STOP_ON_DIR_CHANGE is now SPINDLE_CHANGE_DIR_STOP. Please update your Configuration_adv.h." +#elif defined(SPINDLE_LASER_ACTIVE_HIGH) + #error "SPINDLE_LASER_ACTIVE_HIGH is now SPINDLE_LASER_ACTIVE_STATE. Please update your Configuration_adv.h." #elif defined(SPINDLE_LASER_ENABLE_INVERT) - #error "SPINDLE_LASER_ENABLE_INVERT is now SPINDLE_LASER_ACTIVE_HIGH. Please update your Configuration_adv.h." + #error "SPINDLE_LASER_ENABLE_INVERT is now SPINDLE_LASER_ACTIVE_STATE. Please update your Configuration_adv.h." #elif defined(CUTTER_POWER_DISPLAY) #error "CUTTER_POWER_DISPLAY is now CUTTER_POWER_UNIT. Please update your Configuration_adv.h." #elif defined(CHAMBER_HEATER_PIN) @@ -441,10 +443,12 @@ #error "USB_SD_DISABLED is now NO_SD_HOST_DRIVE. Please update your Configuration_adv.h." #elif defined(USB_SD_ONBOARD) #error "USB_SD_ONBOARD is obsolete. Disable NO_SD_HOST_DRIVE instead." +#elif defined(PSU_ACTIVE_HIGH) + #error "PSU_ACTIVE_HIGH is now PSU_ACTIVE_STATE. Please update your configuration." #elif POWER_SUPPLY == 1 - #error "Replace POWER_SUPPLY 1 by enabling PSU_CONTROL and setting PSU_ACTIVE_HIGH to 'false'." + #error "Replace POWER_SUPPLY 1 by enabling PSU_CONTROL and setting PSU_ACTIVE_STATE to 'LOW'." #elif POWER_SUPPLY == 2 - #error "Replace POWER_SUPPLY 2 by enabling PSU_CONTROL and setting PSU_ACTIVE_HIGH to 'true'." + #error "Replace POWER_SUPPLY 2 by enabling PSU_CONTROL and setting PSU_ACTIVE_STATE to 'HIGH'." #elif defined(POWER_SUPPLY) #error "POWER_SUPPLY is now obsolete. Please remove it from Configuration.h." #elif defined(MKS_ROBIN_TFT) @@ -2923,8 +2927,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) * Ensure this option is set intentionally */ #if ENABLED(PSU_CONTROL) - #ifndef PSU_ACTIVE_HIGH - #error "PSU_CONTROL requires PSU_ACTIVE_HIGH to be defined as 'true' or 'false'." + #ifndef PSU_ACTIVE_STATE + #error "PSU_CONTROL requires PSU_ACTIVE_STATE to be defined as 'HIGH' or 'LOW'." #elif !PIN_EXISTS(PS_ON) #error "PSU_CONTROL requires PS_ON_PIN." #endif From ee19e1d3ffd38ddbf9675a3731ea10725be0905e Mon Sep 17 00:00:00 2001 From: Steven Haigh Date: Sat, 22 Aug 2020 14:44:21 +1000 Subject: [PATCH 0130/1370] Translatable strings on Ender-3 V2 DWIN (#19053) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dwin/dwin.cpp | 392 +++++++++++++++++++---------------- Marlin/src/lcd/dwin/dwin.h | 8 +- 2 files changed, 218 insertions(+), 182 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index e527c8dba0..0d719542e1 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -190,23 +190,23 @@ float last_zoffset = 0, last_probe_zoffset = 0; #define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) // BL24CXX::check() uses 0x00 -void lcd_select_language(void) { - BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); - if (HMI_flag.language_flag) +void HMI_SetLanguage(void) { + BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); + if (HMI_flag.language_chinese) DWIN_JPG_CacheTo1(Language_Chinese); else DWIN_JPG_CacheTo1(Language_English); } -void set_english_to_eeprom(void) { - HMI_flag.language_flag = 0; +void HMI_SetAndSaveLanguageWestern(void) { + HMI_flag.language_chinese = false; DWIN_JPG_CacheTo1(Language_English); - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); } -void set_chinese_to_eeprom(void) { - HMI_flag.language_flag = 1; +void HMI_SetAndSaveLanguageChinese(void) { + HMI_flag.language_chinese = true; DWIN_JPG_CacheTo1(Language_Chinese); - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); } void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { @@ -223,14 +223,14 @@ void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNu void ICON_Print() { if (select_page.now == 0) { DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 58, 201); else DWIN_Frame_AreaCopy(1, 1, 451, 271 - 240, 479 - 16, 72 - 15, 201); } else { DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 405, 271 - 243, 420, 58, 201); else DWIN_Frame_AreaCopy(1, 1, 423, 271 - 240, 423 + 12, 72 - 15, 201); @@ -240,14 +240,14 @@ void ICON_Print() { void ICON_Prepare() { if (select_page.now == 1) { DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 31, 447, 271 - 213, 479 - 19, 186, 201); else DWIN_Frame_AreaCopy(1, 33, 451, 271 - 189, 479 - 13, 200 - 25, 201); } else { DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 31, 405, 271 - 213, 420, 186, 201); else DWIN_Frame_AreaCopy(1, 33, 423, 271 - 189, 423 + 15, 200 - 25, 201); @@ -257,14 +257,14 @@ void ICON_Prepare() { void ICON_Control() { if (select_page.now == 2) { DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 61, 447, 271 - 183, 479 - 19, 58, 318); else DWIN_Frame_AreaCopy(1, 85, 451, 271 - 139, 479 - 16, 72 - 24, 318); } else { DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 61, 405, 271 - 183, 420, 58, 318); else DWIN_Frame_AreaCopy(1, 85, 423, 271 - 139, 479 - 45, 72 - 24, 318); @@ -274,14 +274,14 @@ void ICON_Control() { void ICON_StartInfo(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 91, 447, 271 - 153, 479 - 19, 186, 318); else DWIN_Frame_AreaCopy(1, 132, 451, 159, 479 - 13, 186, 318); } else { DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 91, 405, 271 - 153, 420, 186, 318); else DWIN_Frame_AreaCopy(1, 132, 423, 159, 423 + 12, 186, 318); @@ -291,14 +291,14 @@ void ICON_StartInfo(bool show) { void ICON_Leveling(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 211, 447, 238, 479 - 19, 186, 318); else DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 200 - 18, 318); } else { DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 211, 405, 238, 420, 186, 318); else DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 200 - 18, 318); @@ -308,14 +308,14 @@ void ICON_Leveling(bool show) { void ICON_Tune() { if (select_print.now == 0) { DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 121, 447, 271 - 123, 479 - 21, 34, 325); else DWIN_Frame_AreaCopy(1, 1, 465, 271 - 237, 479 - 2, 48 - 17, 325); } else { DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 121, 405, 271 - 123, 420, 34, 325); else DWIN_Frame_AreaCopy(1, 1, 438, 271 - 239, 479 - 31, 48 - 17, 325); @@ -325,14 +325,14 @@ void ICON_Tune() { void ICON_Pause() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 181, 447, 271 - 63, 479 - 20, 124, 325); else DWIN_Frame_AreaCopy(1, 177, 451, 271 - 55, 479 - 17, 136 - 20, 325); } else { DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 181, 405, 271 - 63, 420, 124, 325); else DWIN_Frame_AreaCopy(1, 177, 423, 271 - 56, 479 - 46, 136 - 20, 325); @@ -342,14 +342,14 @@ void ICON_Pause() { void ICON_Continue() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 124, 325); else DWIN_Frame_AreaCopy(1, 1, 451, 271 - 239, 479 - 16, 136 - 15, 325); } else { DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 405, 271 - 243, 420, 124, 325); else DWIN_Frame_AreaCopy(1, 1, 424, 271 - 240, 479 - 45, 136 - 15, 325); @@ -359,14 +359,14 @@ void ICON_Continue() { void ICON_Stop() { if (select_print.now == 2) { DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 151, 447, 271 - 93, 479 - 20, 210, 325); else DWIN_Frame_AreaCopy(1, 218, 451, 271 - 22, 479 - 14, 224 - 15, 325); } else { DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 151, 405, 271 - 93, 420, 210, 325); else DWIN_Frame_AreaCopy(1, 218, 423, 271 - 24, 479 - 43, 224 - 15, 325); @@ -454,7 +454,7 @@ inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char // The "Back" label is always on the first line inline void Draw_Back_Label(void) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 129, 72, 271 - 115, 479 - 395, LBLX, MBASE(0)); else DWIN_Frame_AreaCopy(1, 226, 179, 271 - 15, 479 - 290, LBLX, MBASE(0)); @@ -476,7 +476,7 @@ inline void draw_move_en(const uint16_t line) { } inline void Prepare_Item_Move(const uint8_t row) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 159, 70, 271 - 71, 479 - 395, LBLX, MBASE(row)); else draw_move_en(MBASE(row)); // "Move >" @@ -485,7 +485,7 @@ inline void Prepare_Item_Move(const uint8_t row) { } inline void Prepare_Item_Disable(const uint8_t row) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 204, 70, 271 - 12, 479 - 397, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 103, 59, 271 - 71, 479 - 405, LBLX, MBASE(row)); // "Disable Stepper" @@ -493,7 +493,7 @@ inline void Prepare_Item_Disable(const uint8_t row) { } inline void Prepare_Item_Home(const uint8_t row) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 0, 89, 271 - 230, 479 - 378, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 202, 61, 271 - 0, 479 - 408, LBLX, MBASE(row)); // "Auto Home" @@ -501,7 +501,7 @@ inline void Prepare_Item_Home(const uint8_t row) { } inline void Prepare_Item_Offset(const uint8_t row) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 174, 164, 271 - 48, 479 - 302, LBLX, MBASE(row)); show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); @@ -521,7 +521,7 @@ inline void Prepare_Item_Offset(const uint8_t row) { } inline void Prepare_Item_PLA(const uint8_t row) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 100, 89, 271 - 93 - 27, 479 - 378, LBLX, MBASE(row)); } else { @@ -532,7 +532,7 @@ inline void Prepare_Item_PLA(const uint8_t row) { } inline void Prepare_Item_ABS(const uint8_t row) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 180, 89, 271 - 11 - 27, 479 - 379, LBLX, MBASE(row)); } else { @@ -543,7 +543,7 @@ inline void Prepare_Item_ABS(const uint8_t row) { } inline void Prepare_Item_Cool(const uint8_t row) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 104, 271 - 215, 479 - 362, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 200, 76, 271 - 7, 479 - 393, LBLX, MBASE(row));// "Cooldown" @@ -551,7 +551,7 @@ inline void Prepare_Item_Cool(const uint8_t row) { } inline void Prepare_Item_Lang(const uint8_t row) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 239, 134, 271 - 5, 479 - 333, LBLX, MBASE(row)); DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), (char*)"CN"); } @@ -569,7 +569,7 @@ inline void Draw_Prepare_Menu() { #define PSCROL(L) (scroll + (L)) #define PVISI(L) WITHIN(PSCROL(L), 0, MROWS) - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 133, 1, 271 - 111, 479 - 465 - 1, 14, 8); // "Prepare" } else { @@ -604,7 +604,7 @@ inline void Draw_Control_Menu() { if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 1, 271 - 141, 479 - 465, 14, 8); DWIN_Frame_AreaCopy(1, 57, 104, 271 - 187, 479 - 363, LBLX, CLINE(1)); // Temperature > DWIN_Frame_AreaCopy(1, 87, 104, 271 - 157, 479 - 363, LBLX, CLINE(2)); // Motion > @@ -618,22 +618,25 @@ inline void Draw_Control_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_CONTROL)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + if (CVISI(6)) + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 5), (char*)"Info"); #else DWIN_Frame_AreaCopy(1, 128, 2, 271 - 95, 479 - 467, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX, CLINE(1));// Temperature > + DWIN_Frame_AreaCopy(1, 84, 89, 271 - 143, 479 - 380, LBLX, CLINE(2));// Motion > + DWIN_Frame_AreaCopy(1, 131 + 17, 89, 271 - 3, 479 - 377 - 1, LBLX, CLINE(3));// "Store Configuration" + DWIN_Frame_AreaCopy(1, 26, 104, 271 - 214, 479 - 365, LBLX, CLINE(4)); // "Read" + DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 31 + 3, CLINE(4)); // "Configuration" + DWIN_Frame_AreaCopy(1, 59, 104, 271 - 178, 479 - 365, LBLX, CLINE(5)); // "Reset" + DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 34 + 3, CLINE(5)); // "Configuration" + if (CVISI(6)) + DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > #endif - - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX, CLINE(1));// Temperature > - DWIN_Frame_AreaCopy(1, 84, 89, 271 - 143, 479 - 380, LBLX, CLINE(2));// Motion > - DWIN_Frame_AreaCopy(1, 131 + 17, 89, 271 - 3, 479 - 377 - 1, LBLX, CLINE(3));// "Store Configuration" - - DWIN_Frame_AreaCopy(1, 26, 104, 271 - 214, 479 - 365, LBLX, CLINE(4)); // "Read" - DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 31 + 3, CLINE(4)); // "Configuration" - - DWIN_Frame_AreaCopy(1, 59, 104, 271 - 178, 479 - 365, LBLX, CLINE(5)); // "Reset" - DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 34 + 3, CLINE(5)); // "Configuration" - - if (CVISI(6)) - DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > } if (select_control.now && CVISI(select_control.now)) @@ -651,9 +654,8 @@ inline void Draw_Control_Menu() { inline void Draw_Tune_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 73, 2, 271 - 171, 479 - 466, 14, 9); - DWIN_Frame_AreaCopy(1, 116, 164, 271 - 100, 479 - 303, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX, MBASE(2)); DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX, MBASE(3)); @@ -663,16 +665,21 @@ inline void Draw_Tune_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TUNE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else DWIN_Frame_AreaCopy(1, 94, 2, 271 - 145, 479 - 467, 14, 9); + DWIN_Frame_AreaCopy(1, 1, 179, 271 - 179, 479 - 287 - 2, LBLX, MBASE(1)); // print speed + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(2)); // Hotend... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(2)); // ...Temperature + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(3)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(3)); // ...Temperature + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(4)); // fan speed + DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(5)); // Z-offset #endif - DWIN_Frame_AreaCopy(1, 1, 179, 271 - 179, 479 - 287 - 2, LBLX, MBASE(1)); // print speed - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(2)); // Hotend... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(3)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(3)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(4)); // fan speed - DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(5)); // Z-offset } Draw_Back_First(select_tune.now == 0); @@ -723,7 +730,7 @@ inline void say_e(const uint16_t inset, const uint16_t line) { inline void Draw_Motion_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); DWIN_Frame_AreaCopy(1, 173, 133, 228, 479 - 332, LBLX, MBASE(1)); // max speed @@ -737,13 +744,17 @@ inline void Draw_Motion_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Feedrate"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_ACCELERATION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STEPS_PER_MM)); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + draw_max_en(MBASE(1)); draw_speed_en(24 + 3, MBASE(1)); // "Max Speed" + draw_max_accel_en(MBASE(2)); // "Max Acceleration" + draw_max_en(MBASE(3)); draw_corner_en(MBASE(3)); // "Max Corner" + draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" #endif - draw_max_en(MBASE(1)); draw_speed_en(24 + 3, MBASE(1)); // "Max Speed" - draw_max_accel_en(MBASE(2)); // "Max Acceleration" - draw_max_en(MBASE(3)); draw_corner_en(MBASE(3)); // "Max Corner" - draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" } Draw_Back_First(select_motion.now == 0); @@ -766,7 +777,7 @@ void Popup_Window_Temperature(const bool toohigh) { Draw_Popup_Bkgd_105(); if (toohigh) { DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 371, 237, 479 - 93, 52, 285); DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); @@ -778,7 +789,7 @@ void Popup_Window_Temperature(const bool toohigh) { } else { DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 371, 271 - 1, 479 - 93, 52, 285); DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); } @@ -799,7 +810,7 @@ inline void Draw_Popup_Bkgd_60() { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 371, 136, 479 - 93, 69, 240); DWIN_Frame_AreaCopy(1, 170, 371, 271 - 1, 479 - 93, 69 + 33, 240); DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); @@ -815,7 +826,7 @@ inline void Draw_Popup_Bkgd_60() { void Popup_Window_Resume(void) { Clear_Popup_Area(); Draw_Popup_Bkgd_105(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 160, 338, 271 - 36, 479 - 125, 98, 135); DWIN_Frame_AreaCopy(1, 103, 321, 271 - 0, 479 - 144, 52, 192); DWIN_ICON_Show(ICON, ICON_Continue_C, 26, 307); @@ -834,13 +845,13 @@ void Popup_Window_Home(void) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_BLTouch, 101, 105); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 0, 371, 33, 386, 85, 240); DWIN_Frame_AreaCopy(1, 203, 286, 271, 302, 118, 240); DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 80, 230, (char*)"Auto homing..."); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 80, 230, (char*)GET_TEXT_F(MSG_LEVEL_BED_HOMING)); DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); } } @@ -849,12 +860,12 @@ void Popup_Window_Leveling(void) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 0, 371, 100, 386, 84, 240); DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 76, 230, (char*)"Auto leveling..."); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 76, 230, (char*)GET_TEXT_F(MSG_BED_LEVELING)); DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); } } @@ -872,7 +883,7 @@ void Draw_Select_Highlight(const bool sel) { void Popup_window_PauseOrStop(void) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { if (select_print.now == 1) DWIN_Frame_AreaCopy(1, 237, 338, 269, 356, 98, 150); else if (select_print.now == 2) DWIN_Frame_AreaCopy(1, 221, 320, 253, 336, 98, 150); DWIN_Frame_AreaCopy(1, 220, 304, 264, 319, 130, 150); @@ -880,8 +891,8 @@ void Popup_window_PauseOrStop(void) { DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); } else { - if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 88, 150, (char*)"Pause print?"); - else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 150, (char*)"Stop print?"); + if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 88, 150, (char*)GET_TEXT_F(MSG_PAUSE_PRINT)); + else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 150, (char*)GET_TEXT_F(MSG_STOP_PRINT)); DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); } @@ -889,7 +900,7 @@ void Popup_window_PauseOrStop(void) { } void Draw_Printing_Screen(void) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 30, 1, 271 - 200, 479 - 465, 14, 9);// Tune DWIN_Frame_AreaCopy(1, 0, 72, 271 - 208, 479 - 393, 41, 188);// Pause DWIN_Frame_AreaCopy(1, 65, 72, 271 - 143, 479 - 393, 176, 188); // Stop @@ -949,7 +960,7 @@ void Goto_MainMenu(void) { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 2, 2, 271 - 244, 479 - 465, 14, 9); // "Home" } else { @@ -1715,7 +1726,7 @@ inline void Draw_Info_Menu() { DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 30, 17, 271 - 214, 479 - 450, 14, 8); DWIN_Frame_AreaCopy(1, 197, 149, 271 - 19, 479 - 318, 108, 102); @@ -1746,7 +1757,7 @@ inline void Draw_Info_Menu() { inline void Draw_Print_File_Menu() { Clear_Title_Bar(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 0, 31, 271 - 216, 479 - 435, 14, 8); } else { @@ -2093,7 +2104,7 @@ void HMI_PauseOrStop(void) { inline void Draw_Move_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 192, 1, 271 - 38, 479 - 465, 14, 8); DWIN_Frame_AreaCopy(1, 58, 118, 271 - 165, 479 - 347, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 109, 118, 271 - 114, 479 - 347, LBLX, MBASE(2)); @@ -2239,13 +2250,13 @@ void HMI_Prepare(void) { break; case 8: // language /* select language */ - HMI_flag.language_flag = !HMI_flag.language_flag; - if (HMI_flag.language_flag) { - set_chinese_to_eeprom(); + HMI_flag.language_chinese ^= true; + if (HMI_flag.language_chinese) { + HMI_SetAndSaveLanguageChinese(); DWIN_JPG_CacheTo1(Language_Chinese); } else { - set_english_to_eeprom(); + HMI_SetAndSaveLanguageWestern(); DWIN_JPG_CacheTo1(Language_English); } Draw_Prepare_Menu(); @@ -2260,7 +2271,7 @@ void HMI_Prepare(void) { void Draw_Temperature_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 236, 2, 271 - 8, 479 - 466, 14, 8); DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX, MBASE(1)); @@ -2272,21 +2283,25 @@ void Draw_Temperature_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"PLA Preheat Settings"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)"ABS Preheat Settings"); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(1)); // Nozzle... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(1)); // ...Temperature + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(2)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(2)); // ...Temperature + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(3)); // Fan speed + DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(4)); // Preheat... + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX + 49 + 3, MBASE(4)); // ...PLA + DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 24 + 6, MBASE(4)); // PLA setting + DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(5)); // Preheat... + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 49 + 3, MBASE(5)); // ...ABS + DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 3 + 26 + 3, MBASE(5)); // ABS setting #endif - - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(1)); // Nozzle... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(1)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(2)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(3)); // Fan speed - DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(4)); // Preheat... - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX + 49 + 3, MBASE(4)); // ...PLA - DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 24 + 6, MBASE(4)); // PLA setting - DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(5)); // Preheat... - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 49 + 3, MBASE(5)); // ...ABS - DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 3 + 26 + 3, MBASE(5)); // ABS setting } Draw_Back_First(select_temp.now == 0); @@ -2319,7 +2334,7 @@ void HMI_Control(void) { Draw_More_Icon(2 + MROWS - index_control); // Motion > if (index_control > MROWS) { Draw_More_Icon(6 + MROWS - index_control); // Info > - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 231, 104, 271 - 13, 479 - 363, LBLX, MBASE(5)); else DWIN_Frame_AreaCopy(1, 0, 104, 271 - 247, 479 - 365, LBLX, MBASE(5)); @@ -2523,7 +2538,7 @@ void HMI_Temperature(void) { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 59, 16, 271 - 132, 479 - 450, 14, 8); DWIN_Frame_AreaCopy(1, 100, 89, 124, 479 - 378, LBLX, MBASE(1)); @@ -2537,19 +2552,22 @@ void HMI_Temperature(void) { else { #ifdef USE_STRING_HEADINGS Draw_Title("PLA Settings"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Nozzle Temp"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Bed Temp"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // PLA bed temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // PLA fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); // save PLA configuration #endif - - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // PLA bed temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); // save PLA configuration } Draw_Back_First(); @@ -2572,7 +2590,7 @@ void HMI_Temperature(void) { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 142, 16, 271 - 48, 479 - 450, 14, 8); DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX, MBASE(1)); @@ -2587,20 +2605,23 @@ void HMI_Temperature(void) { else { #ifdef USE_STRING_HEADINGS Draw_Title("ABS Settings"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Nozzle Temp"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Bed Temp"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // ABS nozzle temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // ABS bed temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // ABS fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 33, MBASE(4)); // save ABS configuration #endif - - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // ABS bed temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 33, MBASE(4)); // save ABS configuration } Draw_Back_First(); @@ -2624,7 +2645,7 @@ void HMI_Temperature(void) { inline void Draw_Max_Speed_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); auto say_max_speed = [](const uint16_t row) { @@ -2643,24 +2664,28 @@ inline void Draw_Max_Speed_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Feedrate X"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Feedrate Y"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Feedrate Z"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Feedrate E"); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + + draw_max_en(MBASE(1)); // "Max" + DWIN_Frame_AreaCopy(1, 184, 119, 271 - 37, 479 - 347, LBLX + 24 + 3, MBASE(1)); // "Speed X" + + draw_max_en(MBASE(2)); // "Max" + draw_speed_en(24 + 3, MBASE(2)); // "Speed" + say_y(24 + 40 + 6, MBASE(2)); // "Y" + + draw_max_en(MBASE(3)); // "Max" + draw_speed_en(24 + 3, MBASE(3)); // "Speed" + say_z(24 + 40 + 6, MBASE(3)); // "Z" + + draw_max_en(MBASE(4)); // "Max" + draw_speed_en(24 + 3, MBASE(4)); // "Speed" + say_e(24 + 40 + 6, MBASE(4)); // "E" #endif - - draw_max_en(MBASE(1)); // "Max" - DWIN_Frame_AreaCopy(1, 184, 119, 271 - 37, 479 - 347, LBLX + 24 + 3, MBASE(1)); // "Speed X" - - draw_max_en(MBASE(2)); // "Max" - draw_speed_en(24 + 3, MBASE(2)); // "Speed" - say_y(24 + 40 + 6, MBASE(2)); // "Y" - - draw_max_en(MBASE(3)); // "Max" - draw_speed_en(24 + 3, MBASE(3)); // "Speed" - say_z(24 + 40 + 6, MBASE(3)); // "Z" - - draw_max_en(MBASE(4)); // "Max" - draw_speed_en(24 + 3, MBASE(4)); // "Speed" - say_e(24 + 40 + 6, MBASE(4)); // "E" } Draw_Back_First(); @@ -2675,7 +2700,7 @@ inline void Draw_Max_Speed_Menu() { inline void Draw_Max_Accel_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(1)); @@ -2693,14 +2718,18 @@ inline void Draw_Max_Accel_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Max Accel (mm/s/s)"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Accel X"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Accel Y"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Accel Z"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Accel E"); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + draw_max_accel_en(MBASE(1)); say_x(24 + 78 + 6, MBASE(1)); // "Max Acceleration X" + draw_max_accel_en(MBASE(2)); say_y(24 + 78 + 6, MBASE(2)); // "Max Acceleration Y" + draw_max_accel_en(MBASE(3)); say_z(24 + 78 + 6, MBASE(3)); // "Max Acceleration Z" + draw_max_accel_en(MBASE(4)); say_e(24 + 78 + 6, MBASE(4)); // "Max Acceleration E" #endif - draw_max_accel_en(MBASE(1)); say_x(24 + 78 + 6, MBASE(1)); // "Max Acceleration X" - draw_max_accel_en(MBASE(2)); say_y(24 + 78 + 6, MBASE(2)); // "Max Acceleration Y" - draw_max_accel_en(MBASE(3)); say_z(24 + 78 + 6, MBASE(3)); // "Max Acceleration Z" - draw_max_accel_en(MBASE(4)); say_e(24 + 78 + 6, MBASE(4)); // "Max Acceleration E" } Draw_Back_First(); @@ -2715,7 +2744,7 @@ inline void Draw_Max_Accel_Menu() { inline void Draw_Max_Jerk_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(1)); @@ -2737,30 +2766,33 @@ inline void Draw_Max_Jerk_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Max Corner"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Jerk X"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Jerk Y"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Jerk Z"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Jerk E"); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + draw_max_en(MBASE(1)); // "Max" + draw_corner_en(MBASE(1)); // "Corner" + draw_speed_en(66 + 6, MBASE(1)); // "Speed" + say_x(106 + 9, MBASE(1)); // "X" + + draw_max_en(MBASE(2)); // "Max" + draw_corner_en(MBASE(2)); // "Corner" + draw_speed_en(66 + 6, MBASE(2)); // "Speed" + say_y(106 + 9, MBASE(2)); // "Y" + + draw_max_en(MBASE(3)); // "Max" + draw_corner_en(MBASE(3)); // "Corner" + draw_speed_en(66 + 6, MBASE(3)); // "Speed" + say_z(106 + 9, MBASE(3)); // "Z" + + draw_max_en(MBASE(4)); // "Max" + draw_corner_en(MBASE(4)); // "Corner" + draw_speed_en(66 + 6, MBASE(4)); // "Speed" + say_e(106 + 9, MBASE(4)); // "E" #endif - - draw_max_en(MBASE(1)); // "Max" - draw_corner_en(MBASE(1)); // "Corner" - draw_speed_en(66 + 6, MBASE(1)); // "Speed" - say_x(106 + 9, MBASE(1)); // "X" - - draw_max_en(MBASE(2)); // "Max" - draw_corner_en(MBASE(2)); // "Corner" - draw_speed_en(66 + 6, MBASE(2)); // "Speed" - say_y(106 + 9, MBASE(2)); // "Y" - - draw_max_en(MBASE(3)); // "Max" - draw_corner_en(MBASE(3)); // "Corner" - draw_speed_en(66 + 6, MBASE(3)); // "Speed" - say_z(106 + 9, MBASE(3)); // "Z" - - draw_max_en(MBASE(4)); // "Max" - draw_corner_en(MBASE(4)); // "Corner" - draw_speed_en(66 + 6, MBASE(4)); // "Speed" - say_e(106 + 9, MBASE(4)); // "E" } Draw_Back_First(); @@ -2775,7 +2807,7 @@ inline void Draw_Max_Jerk_Menu() { inline void Draw_Steps_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(1)); @@ -2789,14 +2821,18 @@ inline void Draw_Steps_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Steps-per-mm"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Steps/mm X"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Steps/mm Y"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Steps/mm Z"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Steps/mm E"); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + draw_steps_per_mm(MBASE(1)); say_x(100 + 3, MBASE(1)); // "Steps-per-mm X" + draw_steps_per_mm(MBASE(2)); say_y(100 + 3, MBASE(2)); // "Y" + draw_steps_per_mm(MBASE(3)); say_z(100 + 3, MBASE(3)); // "Z" + draw_steps_per_mm(MBASE(4)); say_e(100 + 3, MBASE(4)); // "E" #endif - draw_steps_per_mm(MBASE(1)); say_x(100 + 3, MBASE(1)); // "Steps-per-mm X" - draw_steps_per_mm(MBASE(2)); say_y(100 + 3, MBASE(2)); // "Y" - draw_steps_per_mm(MBASE(3)); say_z(100 + 3, MBASE(3)); // "Z" - draw_steps_per_mm(MBASE(4)); say_e(100 + 3, MBASE(4)); // "E" } Draw_Back_First(); @@ -2947,16 +2983,16 @@ void HMI_Tune(void) { break; case 6: // Language // Select language - HMI_flag.language_flag = !HMI_flag.language_flag; + HMI_flag.language_chinese ^= true; Clear_Main_Window(); - if (HMI_flag.language_flag) { - set_chinese_to_eeprom(); + if (HMI_flag.language_chinese) { + HMI_SetAndSaveLanguageChinese(); DWIN_JPG_CacheTo1(Language_Chinese); } else { - set_english_to_eeprom(); + HMI_SetAndSaveLanguageWestern(); DWIN_JPG_CacheTo1(Language_English); } @@ -3304,7 +3340,7 @@ void HMI_Init(void) { delay(20); } - lcd_select_language(); + HMI_SetLanguage(); #if ENABLED(FIX_MOUNTED_PROBE) // For "CREALITY_TOUCH" probe too? SET_OUTPUT(COM_PIN); @@ -3345,7 +3381,7 @@ void EachMomentUpdate(void) { // show print done confirm DWIN_Draw_Rectangle(1, Background_black, 0, 250, 271, 360); - DWIN_ICON_Show(ICON, HMI_flag.language_flag ? ICON_Confirm_C : ICON_Confirm_E, 86, 302 - 19); + DWIN_ICON_Show(ICON, HMI_flag.language_chinese ? ICON_Confirm_C : ICON_Confirm_E, 86, 302 - 19); } else if (HMI_flag.pause_flag != printingIsPaused()) { // print status update diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/dwin.h index cddc582fc2..3446a0d4c1 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/dwin.h @@ -244,7 +244,7 @@ typedef struct { } HMI_value_t; typedef struct { - bool language_flag; // 0: EN, 1: CN + bool language_chinese; // 0: EN, 1: CN bool pause_flag:1; bool print_finish:1; bool confirm_flag:1; @@ -269,9 +269,9 @@ extern HMI_value_t HMI_ValueStruct; extern HMI_Flag HMI_flag; // Language -void lcd_select_language(void); -void set_english_to_eeprom(void); -void set_chinese_to_eeprom(void); +void HMI_SetLanguage(void); +void HMI_SetAndSaveLanguageWestern(void); +void HMI_SetAndSaveLanguageChinese(void); // Show ICO void ICON_Print(bool show); From e02fb4a862f7de3d581864944be81b30f83eda5d Mon Sep 17 00:00:00 2001 From: Greg Nutt Date: Sat, 22 Aug 2020 00:47:25 -0400 Subject: [PATCH 0131/1370] DIGIPOT_I2C pins for SMOOTHIEBOARD (#19098) --- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 0712a274bb..c9bd9ec3ae 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -114,3 +114,20 @@ #error "Marlin's Smoothieboard support cannot drive your LCD." #endif + +/** + * I2C Digipots - MCP4451 + * Address 58 (2C << 1) + * Set from 0 - 127 with stop bit. + * (Ex. 3F << 1 | 1) + */ +#define DIGIPOTS_I2C_SCL P0_0 +#define DIGIPOTS_I2C_SDA_X P0_04 +#define DIGIPOTS_I2C_SDA_Y P0_10 +#define DIGIPOTS_I2C_SDA_Z P0_19 +#define DIGIPOTS_I2C_SDA_E0 P0_21 +#define DIGIPOTS_I2C_SDA_E1 P4_29 + +#ifndef DIGIPOT_I2C_ADDRESS_A + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address (58 <- 2C << 1) +#endif From 3aa5b457681db7bceb1d21c6b509e18ce5166888 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 22 Aug 2020 06:49:39 +0200 Subject: [PATCH 0132/1370] Prefer Servo AVR timer4 over 3 (#19025) --- Marlin/src/HAL/AVR/ServoTimers.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/HAL/AVR/ServoTimers.h b/Marlin/src/HAL/AVR/ServoTimers.h index 598db62578..436b28141f 100644 --- a/Marlin/src/HAL/AVR/ServoTimers.h +++ b/Marlin/src/HAL/AVR/ServoTimers.h @@ -59,9 +59,9 @@ // Say which 16 bit timers can be used and in what order #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) //#define _useTimer1 - #define _useTimer3 + #define _useTimer4 #if NUM_SERVOS > SERVOS_PER_TIMER - #define _useTimer4 + #define _useTimer3 #if !HAS_MOTOR_CURRENT_PWM && SERVOS > 2 * SERVOS_PER_TIMER #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. #endif From 8565f1e681e6b14cb8a2a06c7d459302ad6184bb Mon Sep 17 00:00:00 2001 From: mmajoor Date: Sat, 22 Aug 2020 07:35:39 +0200 Subject: [PATCH 0133/1370] Permit ST7789V orientation override (#19044) --- Marlin/src/lcd/tft/st7789v.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/tft/st7789v.h b/Marlin/src/lcd/tft/st7789v.h index 6ed7c0ce66..f6e937c2c2 100644 --- a/Marlin/src/lcd/tft/st7789v.h +++ b/Marlin/src/lcd/tft/st7789v.h @@ -39,7 +39,9 @@ #define ST7789V_ORIENTATION_DOWN 0 // 240x320 ; Cable on the lower side //#define ST7789V_COLOR_BGR -#define ST7789V_ORIENTATION ST7789V_ORIENTATION_LEFT +#ifndef ST7789V_ORIENTATION + #define ST7789V_ORIENTATION ST7789V_ORIENTATION_LEFT +#endif #define ST7789V_MADCTL_DATA (ST7789V_ORIENTATION | TERN(ST7789V_COLOR_BGR, ST7789V_MADCTL_BGR, ST7789V_MADCTL_RGB)) #define ST7789V_NOP 0x00 // No Operation From 98ec7b61a963cb7bd18e8a6c93514c90aad60448 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 22 Aug 2020 01:22:14 -0500 Subject: [PATCH 0134/1370] Reformat pins files --- Marlin/src/pins/linux/pins_RAMPS_LINUX.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 2 +- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 4 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 2 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 4 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN.h | 2 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 2 +- Marlin/src/pins/mega/pins_INTAMSYS40.h | 2 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 2 +- Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h | 4 +- Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h | 2 +- Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 2 +- Marlin/src/pins/sam/pins_RADDS.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_SMART.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 2 +- Marlin/src/pins/samd/pins_RAMPS_144.h | 2 +- Marlin/src/pins/stm32f0/pins_MALYAN_M300.h | 4 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 10 +- .../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 8 +- .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 4 +- .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 8 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 6 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 6 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 6 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 8 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 8 +- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 8 +- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 8 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 4 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MALYAN_M200.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 2 +- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 11 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 4 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 148 +++++++++--------- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 148 +++++++++--------- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 2 +- Marlin/src/pins/stm32f4/pins_ARMED.h | 4 +- Marlin/src/pins/stm32f4/pins_BEAST.h | 148 +++++++++--------- .../src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 2 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 4 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 4 +- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 4 +- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 4 +- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 4 +- .../src/pins/stm32f4/pins_GENERIC_STM32F4.h | 4 +- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 4 +- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 10 +- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 6 +- Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h | 4 +- Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 4 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 2 +- Marlin/src/pins/stm32f7/pins_THE_BORG.h | 4 +- Marlin/src/pins/teensy2/pins_5DPRINT.h | 2 +- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 2 +- 67 files changed, 343 insertions(+), 344 deletions(-) diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h index 9361680c23..2b7909221e 100644 --- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h +++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h @@ -50,7 +50,7 @@ #endif #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif #define IS_RAMPS_EFB diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index 9e26a33597..fb1218068e 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -182,7 +182,7 @@ #define E1_SERIAL_RX_PIN P1_01 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif /** diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 83543703e5..69f4f24451 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -208,7 +208,7 @@ #define Z2_SERIAL_RX_PIN P1_01 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index cc35dfb0d4..bfae569cc4 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -30,7 +30,7 @@ #endif // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Steppers diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 7012068d61..6bba067cbe 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -28,7 +28,7 @@ #define BOARD_INFO_NAME "GMARSH X6 REV1" // Ignore temp readings during develpment. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Enable 12MHz clock output on P1.27 pin to sync TMC2208 chip clocks @@ -97,7 +97,7 @@ #define E2_SERIAL_RX_PIN P2_06 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #else #error "TMC2208 UART configuration is required for GMarsh X6." #endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index db8551c114..c898072278 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -324,7 +324,7 @@ #define E0_SERIAL_RX_PIN P0_26 // TH4 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // UNUSED diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index c4bc90c17f..733751eb0a 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -188,7 +188,7 @@ #define Z2_SERIAL_RX_PIN P1_17 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // TMC2208 || TMC2209 // diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 554c060cb4..32c9ad2711 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -158,7 +158,7 @@ #endif // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index 042b724e8c..8d5080b280 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -82,11 +82,11 @@ // DIGIPOT slave addresses // #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT #endif #ifndef DIGIPOT_I2C_ADDRESS_B - #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT #endif // diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index 23275e86b6..c9f3ff7aae 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -56,5 +56,5 @@ #define E1_SERIAL_RX_PIN P4_28 // J8-6 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index a1d3b08caa..81f5b75016 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -89,7 +89,7 @@ #define E0_SERIAL_RX_PIN P0_21 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h index 19725eda2f..b6ff30a4fc 100644 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -82,7 +82,7 @@ // Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range #ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 2000 + #define MOTOR_CURRENT_PWM_RANGE 2000 #endif #define DEFAULT_PWM_MOTOR_CURRENT { 1300, 1300, 1250 } diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index efa9916420..526c9bfc68 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -116,7 +116,7 @@ #define DIGIPOTS_I2C_SDA_E1 77 // J6 #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1) + #define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1) #endif // diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h index a23ada0aca..5eee450fc5 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -67,10 +67,10 @@ // DIGIPOT slave addresses #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT 0x2C (0x58 <- 0x2C << 1) + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT 0x2C (0x58 <- 0x2C << 1) #endif #ifndef DIGIPOT_I2C_ADDRESS_B - #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT 0x2E (0x5C <- 0x2E << 1) + #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT 0x2E (0x5C <- 0x2E << 1) #endif // diff --git a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h index b2a412e305..1dc898e6ca 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h @@ -64,5 +64,5 @@ #define SUICIDE_PIN 12 // Used by CR2020 Industrial series #ifndef SUICIDE_PIN_INVERTING - #define SUICIDE_PIN_INVERTING true + #define SUICIDE_PIN_INVERTING true #endif diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index 5d8716b678..be6b0fb2ed 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -147,7 +147,7 @@ #define FET_SAFETY_PIN 31 // PA7 must be pulsed low every 50 mS or FETs are turned off #define FET_SAFETY_DELAY 50 // 50 mS delay between pulses -#define FET_SAFETY_INVERTED true // true - negative going pulse of 2 uS +#define FET_SAFETY_INVERTED true // true - negative going pulse of 2 uS ///////////////////////////////////////////////////////// diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index 78231afaff..a0192aadb6 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -36,7 +36,7 @@ // #if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB #endif // diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h index 4c26d19caf..06eee2d970 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_SMART.h +++ b/Marlin/src/pins/sam/pins_RAMPS_SMART.h @@ -70,7 +70,7 @@ // I2C EEPROM with 4K of space #define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 +#define MARLIN_EEPROM_SIZE 0x1000 #define RESET_PIN 42 // Resets the board if the jumper is attached diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 22353611b6..dd490e3893 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -186,7 +186,7 @@ // // EEPROM // -#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) +#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) #define I2C_EEPROM // EEPROM on I2C-0 //#define EEPROM_SD // EEPROM on SDCARD //#define SPI_EEPROM // EEPROM on SPI-0 diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 19b8ac9775..8a6287fb65 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -172,7 +172,7 @@ // // EEPROM // -#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) +#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) #define I2C_EEPROM // EEPROM on I2C-0 //#define EEPROM_SD // EEPROM on SDCARD //#define SPI_EEPROM // EEPROM on SPI-0 diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index 319584b5eb..93e758b3ae 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -46,7 +46,7 @@ // //#define QSPI_EEPROM // Use AGCM4 onboard QSPI EEPROM (Uses 4K of RAM) #define I2C_EEPROM // EEPROM on I2C-0 -#define MARLIN_EEPROM_SIZE 0x8000 // 32K (24lc256) +#define MARLIN_EEPROM_SIZE 0x8000 // 32K (24lc256) // // Limit Switches diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h index b8c2ed9503..d6a83aca1a 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h @@ -43,8 +43,8 @@ // // Timers // -#define STEP_TIMER 6 -#define TEMP_TIMER 7 +#define STEP_TIMER 6 +#define TEMP_TIMER 7 // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 3801a9bae4..cff34daf2f 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -31,7 +31,7 @@ #define DISABLE_JTAG // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION @@ -138,7 +138,7 @@ #define E0_SERIAL_RX_PIN PD2 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // @@ -158,7 +158,7 @@ // USB connect control // #define USB_CONNECT_PIN PC13 -#define USB_CONNECT_INVERTING false +#define USB_CONNECT_INVERTING false /** * _____ @@ -260,7 +260,7 @@ * */ - #define CLCD_SPI_BUS 1 // SPI1 connector + #define CLCD_SPI_BUS 1 // SPI1 connector #define BEEPER_PIN PB6 @@ -288,5 +288,5 @@ #error "SD CUSTOM_CABLE is not compatible with SKR E3 DIP." #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index a8df0e5c02..923b0fa4c1 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -29,7 +29,7 @@ #define DISABLE_JTAG // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION @@ -108,7 +108,7 @@ #define USB_CONNECT_PIN PC13 #endif -#define USB_CONNECT_INVERTING false +#define USB_CONNECT_INVERTING false /** * SKR Mini E3 V1.0, V1.2 SKR Mini E3 V2.0 @@ -208,7 +208,7 @@ * */ - #define CLCD_SPI_BUS 1 // SPI1 connector + #define CLCD_SPI_BUS 1 // SPI1 connector #define BEEPER_PIN EXP1_9 @@ -236,5 +236,5 @@ #error "SD CUSTOM_CABLE is not compatible with SKR Mini E3." #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index db31eb377f..4a12d5d32d 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -31,7 +31,7 @@ #define DISABLE_JTAG // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION @@ -213,5 +213,5 @@ #define MOSI_PIN PA7 #define SS_PIN PA4 #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index f99721f144..af1e4c1145 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -43,9 +43,9 @@ // #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE 0x800U // 2KB + #define EEPROM_PAGE_SIZE 0x800U // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -95,7 +95,7 @@ #define E0_SERIAL_RX_PIN PC4 // Reduce baud rate to improve software serial reliability -#define TMC_BAUD_RATE 19200 +#define TMC_BAUD_RATE 19200 // // Temperature Sensors @@ -173,7 +173,7 @@ #define SS_PIN PA4 #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for SD-NAND #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index e3b7d2f547..bf9a7d8e05 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -36,7 +36,7 @@ //#define I2C_EEPROM // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Steppers diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 5267888f44..54ff9a779a 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -177,7 +177,7 @@ // Emulated DOGM - #define GRAPHICAL_TFT_UPSCALE 3 + #define GRAPHICAL_TFT_UPSCALE 3 #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12316 #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index d128d4e1ae..a825db275c 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -186,7 +186,7 @@ // Emulated DOGM #elif ENABLED(FSMC_GRAPHICAL_TFT) - #define GRAPHICAL_TFT_UPSCALE 3 + #define GRAPHICAL_TFT_UPSCALE 3 #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12316 diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index f42d786695..9ee8aa7423 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -51,10 +51,10 @@ #if ENABLED(IIC_BL24CXX_EEPROM) #define IIC_EEPROM_SDA PA11 #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) #else #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb #endif // SPI @@ -150,7 +150,7 @@ // #define SD_DETECT_PIN PC7 #define SDCARD_CONNECTION ONBOARD -#define ON_BOARD_SPI_DEVICE 1 +#define ON_BOARD_SPI_DEVICE 1 #define ONBOARD_SD_CS_PIN PA4 // SDSS #define SDIO_SUPPORT diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index 6a30a2cb23..ca9364a570 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -33,7 +33,7 @@ #define pins_v2_20190128 // new pins define // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Flash EEPROM Emulation @@ -112,7 +112,7 @@ // Stepper current PWM // #ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 1500 // origin:2000 + #define MOTOR_CURRENT_PWM_RANGE 1500 // origin:2000 #endif #define DEFAULT_PWM_MOTOR_CURRENT { 500, 500, 400 } // origin: {1300,1300,1250} @@ -152,7 +152,7 @@ #define DOGLCD_CS PB7 #endif - //#define LCD_CONTRAST_INIT 190 + //#define LCD_CONTRAST_INIT 190 //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 7143176bd7..1f5e70a15a 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -32,7 +32,7 @@ // https://github.com/FYSETC/Cheetah // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 #define DISABLE_JTAG @@ -151,7 +151,7 @@ #define LCD_PINS_D4 PB13 // SCLK #define LCD_PINS_ENABLE PB15 // DATA MOSI - //#define LCD_CONTRAST_INIT 190 + //#define LCD_CONTRAST_INIT 190 #if ENABLED(NEWPANEL) #define BTN_EN1 PC10 @@ -172,6 +172,6 @@ #define CLCD_SOFT_SPI_MISO PB14 #define CLCD_SOFT_SPI_SCLK PB13 #else - #define CLCD_SPI_BUS 2 + #define CLCD_SPI_BUS 2 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index 03f9ce0216..fe6c0b1325 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -49,12 +49,12 @@ //#define DISABLE_JTAGSWD // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -236,6 +236,6 @@ // ESP WiFi can be soldered to J9 connector which is wired to USART2. // Must define WIFISUPPORT in Configuration.h for the printer. // -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 #define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 3f5a39a90c..716de610a7 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -49,12 +49,12 @@ //#define DISABLE_JTAGSWD // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -230,6 +230,6 @@ // ESP WiFi can be soldered to J9 connector which is wired to USART2. // Must define WIFISUPPORT in Configuration.h for the printer. // -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 #define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index 03f9ce0216..fe6c0b1325 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -49,12 +49,12 @@ //#define DISABLE_JTAGSWD // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -236,6 +236,6 @@ // ESP WiFi can be soldered to J9 connector which is wired to USART2. // Must define WIFISUPPORT in Configuration.h for the printer. // -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 #define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index c39c89e42c..1fc4fa9424 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -49,12 +49,12 @@ //#define DISABLE_JTAGSWD // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -233,6 +233,6 @@ // ESP WiFi can be soldered to J9 connector which is wired to USART2. // Must define WIFISUPPORT in Configuration.h for the printer. // -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 #define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index dcd1c868f4..d474eb25f6 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -43,10 +43,10 @@ // Enable EEPROM Emulation for this board, so that we don't overwrite factory data //#define I2C_EEPROM // AT24C64 -//#define MARLIN_EEPROM_SIZE 0x8000UL // 64KB +//#define MARLIN_EEPROM_SIZE 0x8000UL // 64KB //#define FLASH_EEPROM_EMULATION -//#define MARLIN_EEPROM_SIZE 0x1000UL // 4KB +//#define MARLIN_EEPROM_SIZE 0x1000UL // 4KB //#define MARLIN_EEPROM_SIZE (EEPROM_START_ADDRESS + (EEPROM_PAGE_SIZE) * 2UL) //#define EEPROM_CHITCHAT diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 32e7e2993c..cbc43a7ac8 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -130,7 +130,7 @@ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 -#define GRAPHICAL_TFT_UPSCALE 2 +#define GRAPHICAL_TFT_UPSCALE 2 #define TFT_WIDTH 320 #define TFT_HEIGHT 240 #define TFT_PIXEL_OFFSET_X 32 diff --git a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h index 6a8f316b0d..39c52ab0d3 100644 --- a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h +++ b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h @@ -44,8 +44,8 @@ // On STM32F103: // PB3, PB6, PB7, and PB8 can be used with pwm, which rules out TIM2 and TIM4. // On STM32F070, 16 and 17 are in use, but 1 and 3 are available. -#define STEP_TIMER 1 -#define TEMP_TIMER 3 +#define STEP_TIMER 1 +#define TEMP_TIMER 3 // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 5193ddad23..1ab9165830 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -212,6 +212,6 @@ // Reduce baud rate for software serial reliability #if HAS_TMC_SW_SERIAL - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 0f55de8245..1346e8099a 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -105,7 +105,7 @@ #define E0_SERIAL_RX_PIN PC11 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 716cb16375..cb3ab62cc2 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -81,7 +81,6 @@ #define E0_STEP_PIN PD6 #define E0_DIR_PIN PD3 - // Motor current PWM pins #define MOTOR_CURRENT_PWM_XY_PIN PA6 #define MOTOR_CURRENT_PWM_Z_PIN PA7 @@ -113,7 +112,7 @@ #define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) #define MT_DET_1_PIN PA4 -#define MT_DET_PIN_INVERTING false +#define MT_DET_PIN_INVERTING false #define WIFI_IO0_PIN PC13 @@ -149,9 +148,9 @@ #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 + #define FSMC_DMA_CHANNEL DMA_CH5 #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 @@ -163,7 +162,7 @@ #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif -#elif ENABLED(TFT_320x240) //TFT32/28 +#elif ENABLED(TFT_320x240) //TFT32/28 #define TFT_RESET_PIN PC6 #define TFT_BACKLIGHT_PIN PD13 @@ -190,7 +189,7 @@ #define ILI9341_COLOR_RGB #endif -#define HAS_SPI_FLASH 1 +#define HAS_SPI_FLASH 1 #define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 // Flash chip-select diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 6a015a4709..83b3bcc42d 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -188,7 +188,7 @@ #define FSMC_DMA_CHANNEL DMA_CH5 #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 #endif // LVGL Configs @@ -206,7 +206,7 @@ #define DOGLCD_SCK -1 #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 + #define GRAPHICAL_TFT_UPSCALE 3 #endif #ifndef TFT_WIDTH #define TFT_WIDTH 480 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 0f9e6eb371..228049d139 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -311,7 +311,7 @@ #endif #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 + #define GRAPHICAL_TFT_UPSCALE 3 #endif #ifndef TFT_PIXEL_OFFSET_Y #define TFT_PIXEL_OFFSET_Y 32 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 3ca59a93a3..c00466677a 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -41,7 +41,7 @@ // // Note: MKS Robin board is using SPI2 interface. // -//#define SPI_MODULE 2 +//#define SPI_MODULE 2 #define ENABLE_SPI2 // diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index 475f31cb71..63fb383c9b 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -33,7 +33,7 @@ #define DEFAULT_MACHINE_NAME "STM32F103RET6" // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches @@ -100,9 +100,9 @@ #if HAS_SPI_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock #elif BOTH(NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -118,13 +118,13 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 #endif #endif @@ -132,125 +132,125 @@ #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN 37 + #define BEEPER_PIN 37 - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 + #define LCD_BACKLIGHT_PIN 39 #endif #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 #elif ENABLED(LCD_I2C_PANELOLU2) - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 #define SD_DETECT_PIN -1 - #define KILL_PIN 41 + #define KILL_PIN 41 #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 #elif ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 #define LCD_SCREEN_ROT_180 - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 - #define SDSS 53 + #define SDSS 53 #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - #define KILL_PIN 31 + #define KILL_PIN 31 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 #elif ENABLED(MINIPANEL) - #define BEEPER_PIN 42 + #define BEEPER_PIN 42 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 - #define KILL_PIN 64 + #define KILL_PIN 64 // GLCD features // Uncomment screen orientation //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 // not connected to a pin - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN 49 #else // Beeper on AUX-4 - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 #endif #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #else //#define SD_DETECT_PIN -1 // Ramps doesn't use this #endif diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index eb7fc94939..c18642fb1d 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -36,7 +36,7 @@ #define I2C_EEPROM // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches @@ -115,9 +115,9 @@ #if HAS_SPI_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock #elif BOTH(NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -133,13 +133,13 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 #endif #endif @@ -155,126 +155,126 @@ #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN 37 + #define BEEPER_PIN 37 - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 + #define LCD_BACKLIGHT_PIN 39 #endif #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 #elif ENABLED(LCD_I2C_PANELOLU2) - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 #define SD_DETECT_PIN -1 - #define KILL_PIN 41 + #define KILL_PIN 41 #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 #elif ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 #define LCD_SCREEN_ROT_180 - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 - #define SDSS 53 + #define SDSS 53 #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - #define KILL_PIN 31 + #define KILL_PIN 31 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 #elif ENABLED(MINIPANEL) - #define BEEPER_PIN 42 + #define BEEPER_PIN 42 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 - #define KILL_PIN 64 + #define KILL_PIN 64 // GLCD features // Uncomment screen orientation //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 // not connected to a pin - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN 49 #else // Beeper on AUX-4 - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 #endif #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #else //#define SD_DETECT_PIN -1 // Ramps doesn't use this #endif diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index c0a0c016b0..598db026fd 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -92,7 +92,7 @@ // #define HEATER_0_PIN PG12 // HEATER1 #define HEATER_BED_PIN PG11 // HOT BED -#define HEATER_BED_INVERTING true +#define HEATER_BED_INVERTING true // // Fans diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h index 232337f6df..6962416936 100644 --- a/Marlin/src/pins/stm32f4/pins_ARMED.h +++ b/Marlin/src/pins/stm32f4/pins_ARMED.h @@ -39,7 +39,7 @@ #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME #define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB // // Limit Switches @@ -225,5 +225,5 @@ #define Z2_SERIAL_RX_PIN EXT4_PIN #define Z2_SERIAL_TX_PIN EXT4_PIN - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h index 676f1f8c9b..691b468c34 100644 --- a/Marlin/src/pins/stm32f4/pins_BEAST.h +++ b/Marlin/src/pins/stm32f4/pins_BEAST.h @@ -36,7 +36,7 @@ #define I2C_EEPROM // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Steppers @@ -123,9 +123,9 @@ #if HAS_SPI_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock #elif BOTH(NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -141,13 +141,13 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 #endif #endif @@ -155,126 +155,126 @@ #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN 37 + #define BEEPER_PIN 37 - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 + #define LCD_BACKLIGHT_PIN 39 #endif #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 #elif ENABLED(LCD_I2C_PANELOLU2) - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 #define SD_DETECT_PIN -1 - #define KILL_PIN 41 + #define KILL_PIN 41 #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 #elif ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 #define LCD_SCREEN_ROT_180 - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 - #define SDSS 53 + #define SDSS 53 #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - #define KILL_PIN 31 + #define KILL_PIN 31 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 #elif ENABLED(MINIPANEL) - #define BEEPER_PIN 42 + #define BEEPER_PIN 42 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 - #define KILL_PIN 64 + #define KILL_PIN 64 // GLCD features // Uncomment screen orientation //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 // not connected to a pin - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN 49 #else // Beeper on AUX-4 - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 #endif #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #else //#define SD_DETECT_PIN -1 // Ramps doesn't use this #endif diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index e6350f71dc..dc0dab1cd1 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -41,7 +41,7 @@ //#define I2C_EEPROM #define SRAM_EEPROM_EMULATION -#define MARLIN_EEPROM_SIZE 0x2000 // 8KB +#define MARLIN_EEPROM_SIZE 0x2000 // 8KB // // Servos diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 0e81237ad9..d3510b1ff8 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -42,7 +42,7 @@ #endif // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches @@ -153,7 +153,7 @@ #define E0_SERIAL_RX_PIN PD7 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 776ab1d811..bc882316e7 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -33,7 +33,7 @@ // Onboard I2C EEPROM #define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24C64 ... 64Kb = 8KB) +#define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24C64 ... 64Kb = 8KB) #define TP // Enable to define servo and probe pins @@ -223,7 +223,7 @@ #define E7_SERIAL_RX_PIN PH14 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index b6bb854d5b..e13c4a227a 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -212,7 +212,7 @@ #define E2_SERIAL_RX_PIN PD6 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // @@ -366,7 +366,7 @@ *  ̄ ̄ * W1 */ -#define ESP_WIFI_MODULE_COM 6 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this +#define ESP_WIFI_MODULE_COM 6 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this #define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT & SERIAL_PORT_2 #define ESP_WIFI_MODULE_RESET_PIN PG0 #define ESP_WIFI_MODULE_ENABLE_PIN PG1 diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 499edc8dc0..a3a5ccdff8 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -45,11 +45,11 @@ // the 128kB sector allocated for EEPROM emulation. #define FLASH_EEPROM_LEVELING #elif ENABLED(I2C_EEPROM) - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB #endif #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 03960584fb..116aa14cf1 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -35,7 +35,7 @@ #endif // Change the priority to 3. Priority 2 is for software serial. -//#define TEMP_TIMER_IRQ_PRIO 3 +//#define TEMP_TIMER_IRQ_PRIO 3 // // EEPROM Emulation @@ -51,7 +51,7 @@ // 128 kB sector allocated for EEPROM emulation. #define FLASH_EEPROM_LEVELING #elif ENABLED(I2C_EEPROM) - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h index b84c724667..44b2e6b27c 100644 --- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h +++ b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h @@ -37,11 +37,11 @@ //#define I2C_EEPROM #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 126d571464..0f0d3d048c 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -147,10 +147,10 @@ // Misc. Functions // #define SDSS PC11 -#define LED_PIN PA15 // Alive +#define LED_PIN PA15 // Alive #define PS_ON_PIN -1 #define KILL_PIN -1 -#define POWER_LOSS_PIN PA4 // Power-loss / nAC_FAULT +#define POWER_LOSS_PIN PA4 // Power-loss / nAC_FAULT #define SCK_PIN PC12 #define MISO_PIN PC8 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index 8f9a4339cd..d20fd5a6c1 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -27,8 +27,8 @@ #define BOARD_INFO_NAME "Lerdge S" #define DEFAULT_MACHINE_NAME "LERDGE" -#define STEP_TIMER 4 -#define TEMP_TIMER 2 +#define STEP_TIMER 4 +#define TEMP_TIMER 2 //#define I2C_EEPROM @@ -173,15 +173,15 @@ #if ENABLED(SPI_EEPROM) // Lerdge has an SPI EEPROM Winbond W25Q128 (128Mbits) https://www.pjrc.com/teensy/W25Q128FV.pdf - #define SPI_CHAN_EEPROM1 1 + #define SPI_CHAN_EEPROM1 1 #define SPI_EEPROM1_CS PB12 // datasheet: /CS pin, found with multimeter, not tested #define EEPROM_SCK PB13 // datasheet: CLK pin, found with multimeter, not tested #define EEPROM_MISO PB14 // datasheet: DO pin, found with multimeter, not tested #define EEPROM_MOSI PB15 // datasheet: DI pin, found with multimeter, not tested - #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) + #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64KB for now... #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif // diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 745d911e3a..da2851c131 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -27,8 +27,8 @@ #define BOARD_INFO_NAME "Lerdge X" #define DEFAULT_MACHINE_NAME "LERDGE" -#define STEP_TIMER 4 -#define TEMP_TIMER 2 +#define STEP_TIMER 4 +#define TEMP_TIMER 2 #define I2C_EEPROM @@ -115,7 +115,7 @@ #define KILL_PIN -1 // Lerdge supports auto-power off and power loss sense through a single pin. -#define POWER_LOSS_PIN PC14 // Power-loss / nAC_FAULT +#define POWER_LOSS_PIN PC14 // Power-loss / nAC_FAULT #define SCK_PIN PC12 #define MISO_PIN PC8 diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h index de8d13c546..a60a278149 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h @@ -33,10 +33,10 @@ #if NO_EEPROM_SELECTED #if MB(RUMBA32_V1_0) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #elif MB(RUMBA32_V1_1) #define I2C_EEPROM - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24LC64T-I/OT) + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24LC64T-I/OT) #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h index d67962b1a6..fe6e559bdb 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h @@ -37,7 +37,7 @@ #if NO_EEPROM_SELECTED #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif #if ENABLED(FLASH_EEPROM_EMULATION) diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index aa481a8b74..3b513b31ca 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -44,8 +44,8 @@ // TIM7 is used for SERVO // TIMER_SERIAL defaults to TIM7 so we'll override it here // -#define STEP_TIMER 10 -#define TEMP_TIMER 14 +#define STEP_TIMER 10 +#define TEMP_TIMER 14 #define TIMER_SERIAL TIM9 #define HAL_TIMER_RATE F_CPU diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index 01e9da590a..d34458c044 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -31,7 +31,7 @@ #define BOARD_INFO_NAME "STM32F4 VAkE" //#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB // // Servos diff --git a/Marlin/src/pins/stm32f7/pins_THE_BORG.h b/Marlin/src/pins/stm32f7/pins_THE_BORG.h index fa4279920c..756f495e4b 100644 --- a/Marlin/src/pins/stm32f7/pins_THE_BORG.h +++ b/Marlin/src/pins/stm32f7/pins_THE_BORG.h @@ -31,11 +31,11 @@ #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 + #define MARLIN_EEPROM_SIZE 0x1000 #endif // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h index f473ad145e..7ba1fbcf8d 100644 --- a/Marlin/src/pins/teensy2/pins_5DPRINT.h +++ b/Marlin/src/pins/teensy2/pins_5DPRINT.h @@ -144,5 +144,5 @@ //DIGIPOTS slave addresses #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for DIGIPOT 0x2C (0x58 <- 0x2C << 1) + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for DIGIPOT 0x2C (0x58 <- 0x2C << 1) #endif diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index 7bf0f334f4..83b17b6560 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -158,7 +158,7 @@ #define DAC_STEPPER_MAX 3520 #define DAC_STEPPER_VREF 1 // internal Vref, gain 1x = 2.048V #define DAC_STEPPER_GAIN 0 -#define DAC_OR_ADDRESS 0x00 +#define DAC_OR_ADDRESS 0x00 // // Temperature Sensors From 05d2bb0df595273644eba176160fc8c4f5f3fbd2 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sat, 22 Aug 2020 09:04:28 +0200 Subject: [PATCH 0135/1370] Change XY_PROBE_SPEED format to (x*60) (#18997) --- Marlin/Configuration.h | 18 +++++++++--------- Marlin/Configuration_adv.h | 20 ++++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2b36f883cc..2639bcd97b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -235,8 +235,8 @@ #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) - #define MPE_FAST_SPEED 9000 // (mm/m) Speed for travel before last distance point - #define MPE_SLOW_SPEED 4500 // (mm/m) Speed for last distance travel to park and couple + #define MPE_FAST_SPEED 9000 // (mm/min) Speed for travel before last distance point + #define MPE_SLOW_SPEED 4500 // (mm/min) Speed for last distance travel to park and couple #define MPE_TRAVEL_DISTANCE 10 // (mm) Last distance point #define MPE_COMPENSATION 0 // Offset Compensation -1 , 0 , 1 (multiplier) only for coupling @@ -284,8 +284,8 @@ #if ENABLED(PRIME_BEFORE_REMOVE) #define SWITCHING_TOOLHEAD_PRIME_MM 20 // (mm) Extruder prime length #define SWITCHING_TOOLHEAD_RETRACT_MM 10 // (mm) Retract after priming length - #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/m) Extruder prime feedrate - #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/m) Extruder retract feedrate + #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/min) Extruder prime feedrate + #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/min) Extruder retract feedrate #endif #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) #define SWITCHING_TOOLHEAD_Z_HOP 2 // (mm) Z raise for switching @@ -999,13 +999,13 @@ // with NOZZLE_AS_PROBE this can be negative for a wider probing area. #define PROBING_MARGIN 10 -// X and Y axis travel speed (mm/m) between probes -#define XY_PROBE_SPEED 8000 +// X and Y axis travel speed (mm/min) between probes +#define XY_PROBE_SPEED (133*60) -// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) #define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z -// Feedrate (mm/m) for the "accurate" probe of each point +// Feedrate (mm/min) for the "accurate" probe of each point #define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) /** @@ -1399,7 +1399,7 @@ #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing #endif -// Homing speeds (mm/m) +// Homing speeds (mm/min) #define HOMING_FEEDRATE_XY (50*60) #define HOMING_FEEDRATE_Z (4*60) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b27d7c79ea..7d9182ad9b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -339,7 +339,7 @@ #if ENABLED(EXTRUDER_RUNOUT_PREVENT) #define EXTRUDER_RUNOUT_MINTEMP 190 #define EXTRUDER_RUNOUT_SECONDS 30 - #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/m) + #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/min) #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) #endif @@ -883,7 +883,7 @@ // increments while checking for the contact to be broken. #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) - #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/m) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/min) #endif #endif #endif @@ -1025,7 +1025,7 @@ // @section lcd #if EITHER(ULTIPANEL, EXTENSIBLE_UI) - #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/m) Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) #if ENABLED(ULTIPANEL) #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" @@ -1985,13 +1985,13 @@ // Load / Unload #define TOOLCHANGE_FS_LENGTH 12 // (mm) Load / Unload length #define TOOLCHANGE_FS_EXTRA_RESUME_LENGTH 0 // (mm) Extra length for better restart, fine tune by LCD/Gcode) - #define TOOLCHANGE_FS_RETRACT_SPEED (50*60) // (mm/m) (Unloading) - #define TOOLCHANGE_FS_UNRETRACT_SPEED (25*60) // (mm/m) (On SINGLENOZZLE or Bowden loading must be slowed down) + #define TOOLCHANGE_FS_RETRACT_SPEED (50*60) // (mm/min) (Unloading) + #define TOOLCHANGE_FS_UNRETRACT_SPEED (25*60) // (mm/min) (On SINGLENOZZLE or Bowden loading must be slowed down) // Longer prime to clean out a SINGLENOZZLE #define TOOLCHANGE_FS_EXTRA_PRIME 0 // (mm) Extra priming length - #define TOOLCHANGE_FS_PRIME_SPEED (4.6*60) // (mm/m) Extra priming feedrate - #define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm/m) Retract before cooling for less stringing, better wipe, etc. + #define TOOLCHANGE_FS_PRIME_SPEED (4.6*60) // (mm/min) Extra priming feedrate + #define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm/min) Retract before cooling for less stringing, better wipe, etc. // Cool after prime to reduce stringing #define TOOLCHANGE_FS_FAN -1 // Fan index or -1 to skip @@ -2027,7 +2027,7 @@ //#define TOOLCHANGE_PARK #if ENABLED(TOOLCHANGE_PARK) #define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 } - #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/m) + #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/min) //#define TOOLCHANGE_PARK_X_ONLY // X axis only move //#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move #endif @@ -3151,7 +3151,7 @@ //#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc. // Enable and set a (default) feedrate for all G0 moves -//#define G0_FEEDRATE 3000 // (mm/m) +//#define G0_FEEDRATE 3000 // (mm/min) #ifdef G0_FEEDRATE //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode #endif @@ -3468,7 +3468,7 @@ #if ENABLED(PRUSA_MMU2_S_MODE) #define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries) - #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/m) + #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min) #define MMU2_CAN_LOAD_SEQUENCE \ { 0.1, MMU2_CAN_LOAD_FEEDRATE }, \ { 60.0, MMU2_CAN_LOAD_FEEDRATE }, \ From fe89f5fdff3d2d78fcb37e77b91680d48ce41cb0 Mon Sep 17 00:00:00 2001 From: Mathew Winters Date: Sun, 23 Aug 2020 09:20:37 +1200 Subject: [PATCH 0136/1370] NOZZLE_CLEAN_NO_Y (#18870) --- Marlin/Configuration.h | 5 ++++- Marlin/src/libs/nozzle.cpp | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2639bcd97b..d23b69c02b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1604,9 +1604,12 @@ // Move the nozzle to the initial position after cleaning #define NOZZLE_CLEAN_GOBACK - // Enable for a purge/clean station that's always at the gantry height (thus no Z move) + // For a purge/clean station that's always at the gantry height (thus no Z move) //#define NOZZLE_CLEAN_NO_Z + // For a purge/clean station mounted on the X axis + //#define NOZZLE_CLEAN_NO_Y + // Explicit wipe G-code script applies to a G12 with no arguments. //#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0" diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 21e6ffb7cd..f93e552481 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -46,15 +46,24 @@ Nozzle nozzle; // Move to the starting point #if ENABLED(NOZZLE_CLEAN_NO_Z) - do_blocking_move_to_xy(start); + #if ENABLED(NOZZLE_CLEAN_NO_Y) + do_blocking_move_to_x(start.x); + #else + do_blocking_move_to_xy(start); + #endif #else do_blocking_move_to(start); #endif // Start the stroke pattern LOOP_L_N(i, strokes >> 1) { - do_blocking_move_to_xy(end); - do_blocking_move_to_xy(start); + #if ENABLED(NOZZLE_CLEAN_NO_Y) + do_blocking_move_to_x(end.x); + do_blocking_move_to_x(start.x); + #else + do_blocking_move_to_xy(end); + do_blocking_move_to_xy(start); + #endif } TERN_(NOZZLE_CLEAN_GOBACK, do_blocking_move_to(oldpos)); From f3d0b49928d633766d3bbc4320c41ed7d3e6e51d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 22 Aug 2020 16:40:22 -0500 Subject: [PATCH 0137/1370] PGMSTR constexpr => const --- Marlin/src/HAL/HAL.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index 29702f2d2b..c7b7531442 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -38,7 +38,7 @@ // String helper #ifndef PGMSTR - #define PGMSTR(NAM,STR) constexpr char NAM[] = STR + #define PGMSTR(NAM,STR) const char NAM[] = STR #endif inline void watchdog_refresh() { From db04bcb7273389d145ed4e54eb949d897f7d3c1c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 22 Aug 2020 17:28:44 -0500 Subject: [PATCH 0138/1370] Fix probing margin sanity-check --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ddefcc8b60..5aa614f116 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1328,7 +1328,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS static_assert(PROBING_MARGIN_RIGHT >= 0, "PROBING_MARGIN_RIGHT must be >= 0."); #endif - #define _MARGIN(A) TERN(IS_SCARA, SCARA_PRINTABLE_RADIUS, TERN(DELTA, DELTA_PRINTABLE_RADIUS, A##_CENTER)) + #define _MARGIN(A) TERN(IS_SCARA, SCARA_PRINTABLE_RADIUS, TERN(DELTA, DELTA_PRINTABLE_RADIUS, ((A##_BED_SIZE) / 2))) static_assert(PROBING_MARGIN < _MARGIN(X), "PROBING_MARGIN is too large."); static_assert(PROBING_MARGIN_BACK < _MARGIN(Y), "PROBING_MARGIN_BACK is too large."); static_assert(PROBING_MARGIN_FRONT < _MARGIN(Y), "PROBING_MARGIN_FRONT is too large."); From e7b730528efb4067e41d30eb45a633b4404c8e0f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 00:12:03 -0500 Subject: [PATCH 0139/1370] Consistent static/value item macros --- Marlin/src/lcd/fontutils.cpp | 3 +- Marlin/src/lcd/menu/menu_info.cpp | 63 +++++++++++++++---------------- Marlin/src/lcd/menu/menu_item.h | 14 +++++++ 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp index ffa6d0df70..8b046af9a7 100644 --- a/Marlin/src/lcd/fontutils.cpp +++ b/Marlin/src/lcd/fontutils.cpp @@ -73,7 +73,7 @@ int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, return -1; } -/* This function gets the character at the pstart position, interpreting UTF8 multybyte sequences +/* This function gets the character at the pstart position, interpreting UTF8 multibyte sequences and returns the pointer to the next character */ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval) { uint32_t val = 0; @@ -161,7 +161,6 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t } static inline uint8_t utf8_strlen_cb(const char *pstart, read_byte_cb_t cb_read_byte) { - uint8_t cnt = 0; uint8_t *pnext = (uint8_t *)pstart; for (;;) { diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 2fe8ccbab6..00ab9ad195 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -34,9 +34,6 @@ #include "game/game.h" #endif -#define VALUE_ITEM(MSG, VALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy(msg + 2, VALUE); STATIC_ITEM(MSG, STYL, msg); }while(0) -#define VALUE_ITEM_P(MSG, PVALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy_P(msg + 2, PSTR(PVALUE)); STATIC_ITEM(MSG, STYL, msg); }while(0) - #if ENABLED(PRINTCOUNTER) #include "../../module/printcounter.h" @@ -52,14 +49,14 @@ char buffer[21]; START_SCREEN(); // 12345678901234567890 - VALUE_ITEM(MSG_INFO_PRINT_COUNT, i16tostr3left(stats.totalPrints), SS_LEFT); // Print Count: 999 - VALUE_ITEM(MSG_INFO_COMPLETED_PRINTS, i16tostr3left(stats.finishedPrints), SS_LEFT); // Completed : 666 + STATIC_ITEM(MSG_INFO_PRINT_COUNT, SS_LEFT, i16tostr3left(stats.totalPrints)); // Print Count: 999 + STATIC_ITEM(MSG_INFO_COMPLETED_PRINTS, SS_LEFT, i16tostr3left(stats.finishedPrints)); // Completed : 666 STATIC_ITEM(MSG_INFO_PRINT_TIME, SS_LEFT); // Total print Time: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s STATIC_ITEM(MSG_INFO_PRINT_LONGEST, SS_LEFT); // Longest job time: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.longestPrint).toString(buffer)); // > 99y 364d 23h 59m 59s + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.longestPrint).toString(buffer)); // > 99y 364d 23h 59m 59s STATIC_ITEM(MSG_INFO_PRINT_FILAMENT, SS_LEFT); // Extruded total: sprintf_P(buffer, PSTR("%ld.%im") @@ -73,8 +70,8 @@ #endif #if SERVICE_INTERVAL_1 > 0 - STATIC_ITEM_P(PSTR(SERVICE_NAME_1 " "), SS_LEFT, buffer); // Service X in: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService1).toString(buffer)); // > 7d 12h 11m 10s + STATIC_ITEM_P(PSTR(SERVICE_NAME_1 " "), SS_LEFT, buffer); // Service X in: + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService1).toString(buffer)); // > 7d 12h 11m 10s #endif #if SERVICE_INTERVAL_2 > 0 @@ -104,8 +101,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_0 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E0 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_0_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_0_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_0_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_0_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_1 != 0 @@ -113,8 +110,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_1 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E1 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_1_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_1_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_1_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_1_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_2 != 0 @@ -122,8 +119,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_2 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E2 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_2_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_2_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_2_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_2_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_3 != 0 @@ -131,8 +128,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_3 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E3 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_3_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_3_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_3_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_3_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_4 != 0 @@ -140,8 +137,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_4 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E4 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_4_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_4_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_4_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_4_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_5 != 0 @@ -149,8 +146,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_5 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E5 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_5_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_5_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_5_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_5_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_6 != 0 @@ -158,8 +155,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_6 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E6 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_6_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_6_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_6_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_6_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_7 != 0 @@ -167,8 +164,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_7 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E7 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_7_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_7_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_7_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_7_MAXTEMP), SS_LEFT); #endif #if EXTRUDERS @@ -180,8 +177,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_BED #include "../thermistornames.h" STATIC_ITEM_P(PSTR("BED:" THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT); STATIC_ITEM(TERN(WATCH_BED, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); #endif @@ -190,8 +187,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_CHAMBER #include "../thermistornames.h" STATIC_ITEM_P(PSTR("CHAM:" THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(CHAMBER_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(CHAMBER_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(CHAMBER_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(CHAMBER_MAXTEMP), SS_LEFT); STATIC_ITEM(TERN(WATCH_CHAMBER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); #endif @@ -209,9 +206,9 @@ void menu_info_board() { #ifdef BOARD_WEBSITE_URL STATIC_ITEM_P(PSTR(BOARD_WEBSITE_URL), SS_LEFT); // www.my3dprinter.com #endif - VALUE_ITEM_P(MSG_INFO_BAUDRATE, STRINGIFY(BAUDRATE), SS_CENTER); // Baud: 250000 - VALUE_ITEM_P(MSG_INFO_PROTOCOL, PROTOCOL_VERSION, SS_CENTER); // Protocol: 1.0 - VALUE_ITEM_P(MSG_INFO_PSU, PSU_NAME, SS_CENTER); + PSTRING_ITEM(MSG_INFO_BAUDRATE, STRINGIFY(BAUDRATE), SS_CENTER); // Baud: 250000 + PSTRING_ITEM(MSG_INFO_PROTOCOL, PROTOCOL_VERSION, SS_CENTER); // Protocol: 1.0 + PSTRING_ITEM(MSG_INFO_PSU, PSU_NAME, SS_CENTER); END_SCREEN(); } @@ -242,7 +239,7 @@ void menu_info_board() { STATIC_ITEM_P(PSTR(STRING_DISTRIBUTION_DATE)); // YYYY-MM-DD HH:MM STATIC_ITEM_P(PSTR(MACHINE_NAME)); // My3DPrinter STATIC_ITEM_P(PSTR(WEBSITE_URL)); // www.my3dprinter.com - VALUE_ITEM_P(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2 + PSTRING_ITEM(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2 #if HAS_LEVELING STATIC_ITEM( TERN_(AUTO_BED_LEVELING_3POINT, MSG_3POINT_LEVELING) // 3-Point Leveling diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index b322246e50..bee05141bb 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -328,6 +328,20 @@ class MenuItem_bool : public MenuEditItemBase { NEXT_ITEM(); \ }while(0) +// PSTRING_ITEM is like STATIC_ITEM but it takes +// two PSTRs with the style as the last parameter. + +#define PSTRING_ITEM_P(PLABEL, PVAL, STYL) do{ \ + constexpr int m = 20; \ + char msg[m+1]; \ + msg[0] = ':'; msg[1] = ' '; \ + strncpy_P(msg+2, PSTR(PVAL), m-2); \ + if (msg[m-1] & 0x80) msg[m-1] = '\0'; \ + STATIC_ITEM_P(PLABEL, STYL, msg); \ +}while(0) + +#define PSTRING_ITEM(LABEL, V...) PSTRING_ITEM_P(GET_TEXT(LABEL), ##V) + #define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) #define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) From ba3b995e58ba33c796a4e5e0e6cb6086bb8acfbc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 02:07:42 -0500 Subject: [PATCH 0140/1370] Fix DUET_SMART_EFFECTOR --- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/gcode/config/M672.cpp | 19 +++++++++---------- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 ++-- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 3544a8840f..f371ddfc6e 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -922,7 +922,7 @@ void setup() { SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers #endif - #if ENABLED(SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Put Smart Effector into NORMAL mode #endif diff --git a/Marlin/src/gcode/config/M672.cpp b/Marlin/src/gcode/config/M672.cpp index 58dc271770..af74230516 100644 --- a/Marlin/src/gcode/config/M672.cpp +++ b/Marlin/src/gcode/config/M672.cpp @@ -22,20 +22,12 @@ #include "../../inc/MarlinConfig.h" -#if ENABLED(SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) +#if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) #include "../gcode.h" #include "../../HAL/shared/Delay.h" #include "../parser.h" -/** - * M672 - Set/reset Duet Smart Effector sensitivity - * - * One of these is required: - * S - 0-255 - * R - Flag to reset sensitivity to default - */ - /** * The Marlin format for the M672 command is different than shown in the Duet Smart Effector * documentation https://duet3d.dozuki.com/Wiki/Smart_effector_and_carriage_adapters_for_delta_printer @@ -77,6 +69,13 @@ void M672_send(uint8_t b) { // bit rate requirement: 1KHz +/- 30% } } +/** + * M672 - Set/reset Duet Smart Effector sensitivity + * + * One of these is required: + * S - 0-255 + * R - Flag to reset sensitivity to default + */ void GcodeSuite::M672() { if (parser.seen('R')) { M672_send(M672_ERASEBYTE); @@ -96,4 +95,4 @@ void GcodeSuite::M672() { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Keep Smart Effector in NORMAL mode } -#endif // SMART_EFFECTOR && SMART_EFFECTOR_MOD_PIN +#endif // DUET_SMART_EFFECTOR && SMART_EFFECTOR_MOD_PIN diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index edbeca9c92..c0a795025f 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -790,7 +790,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 666: M666(); break; // M666: Set delta or multiple endstop adjustment #endif - #if ENABLED(SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) case 672: M672(); break; // M672: Set/clear Duet Smart Effector sensitivity #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index e04cd637eb..8848450fc2 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -236,7 +236,7 @@ * M605 - Set Dual X-Carriage movement mode: "M605 S [X] [R]". (Requires DUAL_X_CARRIAGE) * M665 - Set delta configurations: "M665 H L R S B X Y Z (Requires DELTA) * M666 - Set/get offsets for delta (Requires DELTA) or dual endstops. (Requires [XYZ]_DUAL_ENDSTOPS) - * M672 - Set/Reset Duet Smart Effector's sensitivity. (Requires SMART_EFFECTOR and SMART_EFFECTOR_MOD_PIN) + * M672 - Set/Reset Duet Smart Effector's sensitivity. (Requires DUET_SMART_EFFECTOR and SMART_EFFECTOR_MOD_PIN) * M701 - Load filament (Requires FILAMENT_LOAD_UNLOAD_GCODES) * M702 - Unload filament (Requires FILAMENT_LOAD_UNLOAD_GCODES) * M810-M819 - Define/execute a G-code macro (Requires GCODE_MACROS) @@ -792,7 +792,7 @@ private: static void M666(); #endif - #if ENABLED(SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) static void M672(); #endif From 19a237bbb0c40a8e9e1eead65e6ee1312c6dc1a4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 02:45:58 -0500 Subject: [PATCH 0141/1370] Fix up conditions, comments --- Marlin/src/inc/SanityCheck.h | 20 +++++++------------- Marlin/src/pins/ramps/pins_RAMPS_PLUS.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 2 +- buildroot/share/vscode/avrdude.conf | 2 +- buildroot/share/vscode/avrdude_linux.conf | 2 +- buildroot/share/vscode/avrdude_macOS.conf | 2 +- 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5aa614f116..01d07ea4da 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -39,26 +39,20 @@ #define TEST2 1 #define TEST3 0 #define TEST4 true -#if ENABLED(TEST0) +#if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3) #error "ENABLED is borked!" #endif -#if DISABLED(TEST1) - #error "DISABLED is borked!" +#if BOTH(TEST0, TEST1) + #error "BOTH is borked!" #endif -#if !ENABLED(TEST2) - #error "ENABLED is borked!" -#endif -#if ENABLED(TEST3) - #error "ENABLED is borked!" -#endif -#if DISABLED(TEST4) +#if DISABLED(TEST1) || !DISABLED(TEST3) || DISABLED(TEST4) || DISABLED(TEST0, TEST1, TEST2, TEST4) || !DISABLED(TEST0, TEST3) #error "DISABLED is borked!" #endif #if !ANY(TEST1, TEST2, TEST3, TEST4) || ANY(TEST0, TEST3) #error "ANY is borked!" #endif -#if DISABLED(TEST0, TEST1, TEST2, TEST4) - #error "DISABLED is borked!" +#if NONE(TEST0, TEST1, TEST2, TEST4) || !NONE(TEST0, TEST3) + #error "NONE is borked!" #endif #undef TEST1 #undef TEST2 @@ -2202,7 +2196,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + (ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && DISABLED(IS_RRD_FG_SC)) \ + (ENABLED(ULTRA_LCD) && DISABLED(IS_ULTRA_LCD)) \ + (ENABLED(U8GLIB_SSD1306) && DISABLED(IS_U8GLIB_SSD1306)) \ - + (ENABLED(MINIPANEL) && DISABLED(MKS_MINI_12864, ENDER2_STOCKDISPLAY)) \ + + (ENABLED(MINIPANEL) && NONE(MKS_MINI_12864, ENDER2_STOCKDISPLAY)) \ + (ENABLED(MKS_MINI_12864) && DISABLED(MKS_LCD12864)) \ + (ENABLED(EXTENSIBLE_UI) && DISABLED(IS_EXTUI)) \ + (ENABLED(ULTIPANEL) && DISABLED(IS_ULTIPANEL)) \ diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h index 9af4a3e05c..bdd53abbc0 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -74,7 +74,7 @@ #undef E0_CS_PIN #undef E1_CS_PIN -#if ENABLED(ULTRA_LCD, REPRAPWORLD_GRAPHICAL_LCD, CR10_STOCKDISPLAY) && !BOTH(NEWPANEL, PANEL_ONE) +#if ENABLED(ULTRA_LCD) && NONE(REPRAPWORLD_GRAPHICAL_LCD, CR10_STOCKDISPLAY) && !BOTH(NEWPANEL, PANEL_ONE) #if DISABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) #undef LCD_PINS_RS #define LCD_PINS_RS 42 // 3DYMY boards pin 16 -> 42 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index 9558015584..a44baf26e4 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -174,7 +174,7 @@ #define LCD_PINS_D6 32 #define LCD_PINS_D7 30 -#elif ENABLED(BOARD_REV_1_5, ULTRA_LCD) +#elif BOTH(BOARD_REV_1_5, ULTRA_LCD) #define BEEPER_PIN 18 diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf index 9f85aa0d26..991d255750 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/vscode/avrdude.conf @@ -151,7 +151,7 @@ # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma seperated list of +# Instruction formats are specified as a comma separated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf index 64d3b677d5..ff429a028c 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -151,7 +151,7 @@ # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma seperated list of +# Instruction formats are specified as a comma separated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: diff --git a/buildroot/share/vscode/avrdude_macOS.conf b/buildroot/share/vscode/avrdude_macOS.conf index 814e87e35e..6147a2259a 100644 --- a/buildroot/share/vscode/avrdude_macOS.conf +++ b/buildroot/share/vscode/avrdude_macOS.conf @@ -151,7 +151,7 @@ # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma seperated list of +# Instruction formats are specified as a comma separated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: From 42604cf4b261e5b91feeb857098f5f15de49ad88 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 03:14:11 -0500 Subject: [PATCH 0142/1370] Neopixel => NeoPixel --- Marlin/Configuration.h | 10 +++++----- Marlin/Configuration_adv.h | 2 +- Marlin/src/feature/leds/neopixel.h | 2 +- Marlin/src/gcode/feature/leds/M150.cpp | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d23b69c02b..f84d78a507 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2062,7 +2062,7 @@ //#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default //#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on) //#define FYSETC_MINI_12864_2_0 // Type A/B. Discreet RGB Backlight -//#define FYSETC_MINI_12864_2_1 // Type A/B. Neopixel RGB Backlight +//#define FYSETC_MINI_12864_2_1 // Type A/B. NeoPixel RGB Backlight //#define FYSETC_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight. // @@ -2332,13 +2332,13 @@ * Adds the M150 command to set the LED (or LED strip) color. * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of * luminance values can be set from 0 to 255. - * For Neopixel LED an overall brightness parameter is also available. + * For NeoPixel LED an overall brightness parameter is also available. * * *** CAUTION *** * LED Strips require a MOSFET Chip between PWM lines and LEDs, * as the Arduino cannot handle the current the LEDs will require. * Failure to follow this precaution can destroy your Arduino! - * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * NOTE: A separate 5V power supply is required! The NeoPixel LED needs * more current than the Arduino 5V linear regulator can produce. * *** CAUTION *** * @@ -2355,7 +2355,7 @@ //#define RGB_LED_W_PIN -1 #endif -// Support for Adafruit Neopixel LED driver +// Support for Adafruit NeoPixel LED driver //#define NEOPIXEL_LED #if ENABLED(NEOPIXEL_LED) #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) @@ -2368,7 +2368,7 @@ #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup - // Use a single Neopixel LED for static (background) lighting + // Use a single NeoPixel LED for static (background) lighting //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W #endif diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7d9182ad9b..e773b5378f 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -488,7 +488,7 @@ //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. - //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light, requires NEOPIXEL_LED. #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } #endif diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 0155785e9a..c3c8e2fbdc 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -22,7 +22,7 @@ #pragma once /** - * Neopixel support + * NeoPixel support */ // ------------------------ diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index 88f02951ad..1c81c6d6be 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -35,7 +35,7 @@ * If brightness is left out, no value changed * * With NEOPIXEL_LED: - * I Set the Neopixel index to affect. Default: All + * I Set the NeoPixel index to affect. Default: All * * Examples: * diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 69f4f24451..8fbf382be7 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -345,7 +345,7 @@ #endif // -// Neopixel LED +// NeoPixel LED // #ifndef NEOPIXEL_PIN #define NEOPIXEL_PIN P1_24 From b93a4bae45268885bbc3f1f4fe947d724a8c6505 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sun, 23 Aug 2020 12:08:47 +0200 Subject: [PATCH 0143/1370] Feedrate comment (#19116) --- Marlin/Configuration_adv.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e773b5378f..19906819a1 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -909,9 +909,9 @@ #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm - #define CALIBRATION_FEEDRATE_SLOW 60 // mm/m - #define CALIBRATION_FEEDRATE_FAST 1200 // mm/m - #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/m + #define CALIBRATION_FEEDRATE_SLOW 60 // mm/min + #define CALIBRATION_FEEDRATE_FAST 1200 // mm/min + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min // The following parameters refer to the conical section of the nozzle tip. #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm From f473145d42f0c340501215475c4476c0789a13ed Mon Sep 17 00:00:00 2001 From: Oleksii Zelivianskyi <50808386+alexeyzel@users.noreply.github.com> Date: Mon, 24 Aug 2020 06:13:49 +0300 Subject: [PATCH 0144/1370] TFT32 for MKS Robin Nano 1.2 (#19031) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 83b3bcc42d..2c1d016f8c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -234,6 +234,36 @@ #define XPT2046_Y_OFFSET 256 #endif +#elif ENABLED(TFT_320x240) // TFT32/28 + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define XPT2046_X_CALIBRATION -12246 + #define XPT2046_Y_CALIBRATION 9453 + #define XPT2046_X_OFFSET 360 + #define XPT2046_Y_OFFSET -22 + + #define TOUCH_CS_PIN PA7 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + + #define TFT_DRIVER ILI9341 + #define TFT_BUFFER_SIZE 14400 + + // YV for normal screen mounting + //#define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV + // XV for 180° rotated screen mounting + #define ILI9341_ORIENTATION ILI9341_MADCTL_MX | ILI9341_MADCTL_MV + + #define ILI9341_COLOR_RGB + #elif ENABLED(TFT_480x320) #define XPT2046_X_CALIBRATION 17880 #define XPT2046_Y_CALIBRATION -12234 From 9d2241efe75e7183f13eae861c7adca550cce736 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 23:57:51 -0500 Subject: [PATCH 0145/1370] Minor cleanup w/r/t LEDs --- Marlin/Configuration.h | 2 +- Marlin/src/feature/leds/leds.cpp | 9 +++------ Marlin/src/feature/leds/leds.h | 8 ++------ Marlin/src/feature/leds/neopixel.cpp | 13 ++++++------- Marlin/src/feature/leds/neopixel.h | 6 ++---- Marlin/src/feature/leds/pca9533.cpp | 2 +- Marlin/src/feature/leds/pca9533.h | 2 +- Marlin/src/feature/leds/pca9632.cpp | 4 ++-- Marlin/src/feature/leds/pca9632.h | 4 ++-- Marlin/src/feature/password/password.cpp | 2 +- Marlin/src/feature/password/password.h | 2 +- Marlin/src/gcode/feature/password/M510-M512.cpp | 2 +- Marlin/src/gcode/gcode.h | 2 +- Marlin/src/lcd/menu/menu_led.cpp | 15 ++++++++------- Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 2 +- 16 files changed, 34 insertions(+), 43 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f84d78a507..39dc195231 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2363,7 +2363,7 @@ //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE //#define NEOPIXEL2_PIN 5 //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel - #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 neopixel strips are used + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 NeoPixel strips are used #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index eec0cde630..d1c0bfd5e1 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -129,12 +129,9 @@ void LEDLights::set_color(const LEDColor &incol #endif - #if ENABLED(PCA9632) - // Update I2C LED driver - pca9632_set_led_color(incol); - #endif - - TERN_(PCA9533, PCA9533_setColor(incol.r, incol.g, incol.b)); + // Update I2C LED driver + TERN_(PCA9632, PCA9632_set_led_color(incol)); + TERN_(PCA9533, PCA9533_set_rgb(incol.r, incol.g, incol.b)); #if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) // Don't update the color when OFF diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index 577c94752f..1302f63c15 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -104,11 +104,7 @@ typedef struct LEDColor { bool operator!=(const LEDColor &right) { return !operator==(right); } bool is_off() const { - return 3 > r + g + b - #if HAS_WHITE_LED - + w - #endif - ; + return 3 > r + g + b + TERN0(HAS_WHITE_LED, w); } } LEDColor; @@ -156,7 +152,7 @@ public: #endif ); - inline void set_color(uint8_t r, uint8_t g, uint8_t b + static inline void set_color(uint8_t r, uint8_t g, uint8_t b #if HAS_WHITE_LED , uint8_t w=0 #if ENABLED(NEOPIXEL_LED) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 520d4d63b2..ce2e4ee77b 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -53,9 +53,9 @@ Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIX #endif void Marlin_NeoPixel::set_color(const uint32_t color) { - if (get_neo_index() >= 0) { - set_pixel_color(get_neo_index(), color); - set_neo_index(-1); + if (neoindex >= 0) { + set_pixel_color(neoindex, color); + neoindex = -1; } else { for (uint16_t i = 0; i < pixels(); ++i) { @@ -78,18 +78,17 @@ void Marlin_NeoPixel::set_color_startup(const uint32_t color) { } void Marlin_NeoPixel::init() { - set_neo_index(-1); // -1 .. NEOPIXEL_PIXELS-1 range + neoindex = -1; // -1 .. NEOPIXEL_PIXELS-1 range set_brightness(NEOPIXEL_BRIGHTNESS); // 0 .. 255 range begin(); show(); // initialize to all off #if ENABLED(NEOPIXEL_STARTUP_TEST) set_color_startup(adaneo1.Color(255, 0, 0, 0)); // red - safe_delay(1000); + safe_delay(500); set_color_startup(adaneo1.Color(0, 255, 0, 0)); // green - safe_delay(1000); + safe_delay(500); set_color_startup(adaneo1.Color(0, 0, 255, 0)); // blue - safe_delay(1000); #endif #ifdef NEOPIXEL_BKGD_LED_INDEX diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index c3c8e2fbdc..0d9fdefc06 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -65,17 +65,15 @@ private: , adaneo2 #endif ; - static int8_t neoindex; public: + static int8_t neoindex; + static void init(); static void set_color_startup(const uint32_t c); static void set_color(const uint32_t c); - FORCE_INLINE static void set_neo_index(const int8_t neoIndex) { neoindex = neoIndex; } - FORCE_INLINE static int8_t get_neo_index() { return neoindex; } - #ifdef NEOPIXEL_BKGD_LED_INDEX static void set_color_background(); #endif diff --git a/Marlin/src/feature/leds/pca9533.cpp b/Marlin/src/feature/leds/pca9533.cpp index bcc4bc50a4..0fd4d66757 100644 --- a/Marlin/src/feature/leds/pca9533.cpp +++ b/Marlin/src/feature/leds/pca9533.cpp @@ -62,7 +62,7 @@ void PCA9533_setOff() { PCA9533_writeRegister(PCA9533_REG_SEL, 0); } -void PCA9533_setColor(uint8_t red, uint8_t green, uint8_t blue) { +void PCA9533_set_rgb(uint8_t red, uint8_t green, uint8_t blue) { uint8_t r_pwm0 = 0; // Register data - PWM value uint8_t r_pwm1 = 0; // Register data - PWM value diff --git a/Marlin/src/feature/leds/pca9533.h b/Marlin/src/feature/leds/pca9533.h index 899418ff23..431058c491 100644 --- a/Marlin/src/feature/leds/pca9533.h +++ b/Marlin/src/feature/leds/pca9533.h @@ -55,5 +55,5 @@ void PCA9533_init(); void PCA9533_reset(); -void PCA9533_setColor(uint8_t red, uint8_t green, uint8_t blue); +void PCA9533_set_rgb(uint8_t red, uint8_t green, uint8_t blue); void PCA9533_setOff(); diff --git a/Marlin/src/feature/leds/pca9632.cpp b/Marlin/src/feature/leds/pca9632.cpp index df991ded36..d8af31cb6c 100644 --- a/Marlin/src/feature/leds/pca9632.cpp +++ b/Marlin/src/feature/leds/pca9632.cpp @@ -120,7 +120,7 @@ static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const } #endif -void pca9632_set_led_color(const LEDColor &color) { +void PCA9632_set_led_color(const LEDColor &color) { Wire.begin(); if (!PCA_init) { PCA_init = 1; @@ -138,7 +138,7 @@ void pca9632_set_led_color(const LEDColor &color) { #if ENABLED(PCA9632_BUZZER) - void pca9632_buzz(const long, const uint16_t) { + void PCA9632_buzz(const long, const uint16_t) { uint8_t data[] = PCA9632_BUZZER_DATA; Wire.beginTransmission(I2C_ADDRESS(PCA9632_ADDRESS)); Wire.write(data, sizeof(data)); diff --git a/Marlin/src/feature/leds/pca9632.h b/Marlin/src/feature/leds/pca9632.h index 34aceb31d6..fb59a8c184 100644 --- a/Marlin/src/feature/leds/pca9632.h +++ b/Marlin/src/feature/leds/pca9632.h @@ -29,9 +29,9 @@ struct LEDColor; typedef LEDColor LEDColor; -void pca9632_set_led_color(const LEDColor &color); +void PCA9632_set_led_color(const LEDColor &color); #if ENABLED(PCA9632_BUZZER) #include - void pca9632_buzz(const long, const uint16_t); + void PCA9632_buzz(const long, const uint16_t); #endif diff --git a/Marlin/src/feature/password/password.cpp b/Marlin/src/feature/password/password.cpp index c519ee7c9c..90bb647118 100644 --- a/Marlin/src/feature/password/password.cpp +++ b/Marlin/src/feature/password/password.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h index 66f1c70ba3..3ed584b29d 100644 --- a/Marlin/src/feature/password/password.h +++ b/Marlin/src/feature/password/password.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/gcode/feature/password/M510-M512.cpp b/Marlin/src/gcode/feature/password/M510-M512.cpp index f26fb75fda..79f1da065b 100644 --- a/Marlin/src/gcode/feature/password/M510-M512.cpp +++ b/Marlin/src/gcode/feature/password/M510-M512.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 8848450fc2..23bf2c0ce5 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -155,7 +155,7 @@ * M141 - Set heated chamber target temp. S (Requires a chamber heater) * M145 - Set heatup values for materials on the LCD. H B F for S (0=PLA, 1=ABS) * M149 - Set temperature units. (Requires TEMPERATURE_UNITS_SUPPORT) - * M150 - Set Status LED Color as R U B P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, PCA9533, or PCA9632). + * M150 - Set Status LED Color as R U B W P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, PCA9533, or PCA9632). * M155 - Auto-report temperatures with interval of S. (Requires AUTO_REPORT_TEMPERATURES) * M163 - Set a single proportion for a mixing extruder. (Requires MIXING_EXTRUDER) * M164 - Commit the mix and save to a virtual tool (current, or as specified by 'S'). (Requires MIXING_EXTRUDER) diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 61ffbfd663..290b0ddf63 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -34,18 +34,19 @@ #include "../../feature/leds/leds.h" #if ENABLED(LED_COLOR_PRESETS) + void menu_led_presets() { START_MENU(); #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_LED_PRESETS, SS_DEFAULT|SS_INVERT); #endif BACK_ITEM(MSG_LED_CONTROL); - ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white); - ACTION_ITEM(MSG_SET_LEDS_RED, leds.set_red); + ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white); + ACTION_ITEM(MSG_SET_LEDS_RED, leds.set_red); ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds.set_orange); - ACTION_ITEM(MSG_SET_LEDS_YELLOW,leds.set_yellow); - ACTION_ITEM(MSG_SET_LEDS_GREEN, leds.set_green); - ACTION_ITEM(MSG_SET_LEDS_BLUE, leds.set_blue); + ACTION_ITEM(MSG_SET_LEDS_YELLOW, leds.set_yellow); + ACTION_ITEM(MSG_SET_LEDS_GREEN, leds.set_green); + ACTION_ITEM(MSG_SET_LEDS_BLUE, leds.set_blue); ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds.set_indigo); ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds.set_violet); END_MENU(); @@ -83,11 +84,10 @@ #endif #endif - - void menu_led() { START_MENU(); BACK_ITEM(MSG_MAIN); + #if ENABLED(LED_CONTROL_MENU) bool led_on = leds.lights_on; EDIT_ITEM(bool, MSG_LEDS, &led_on, leds.toggle); @@ -97,6 +97,7 @@ void menu_led() { #endif SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom); #endif + // // Set Case light on/off/brightness // diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index f30d9c68cf..09767c72aa 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -81,7 +81,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #endif void MarlinUI::buzz(const long duration, const uint16_t freq) { #if ENABLED(PCA9632_BUZZER) - pca9632_buzz(duration, freq); + PCA9632_buzz(duration, freq); #elif USE_BEEPER buzzer.tone(duration, freq); #endif diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index af1e4c1145..5254166fa5 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -113,7 +113,7 @@ #define FAN1_PIN PA8 // FAN (fan0 on board) e0 cool fan #define FAN2_PIN PB9 // FAN (fan1 on board) controller cool fan -// One neopixel onboard and a connector for other neopixels +// One NeoPixel onboard and a connector for other NeoPixels #define NEOPIXEL_PIN PC7 // The NEOPIXEL LED driving pin /** From 008362cd77e9e856f2846d89981742e3e748221b Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 24 Aug 2020 16:54:25 +0200 Subject: [PATCH 0146/1370] Fix auto-power in PID autotune (#19119) --- Marlin/src/module/temperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index e8be3dbf01..813bcc061b 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -435,6 +435,7 @@ volatile bool Temperature::raw_temps_ready = false; SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_START); disable_all_heaters(); + TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); SHV(bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1); @@ -444,7 +445,6 @@ volatile bool Temperature::raw_temps_ready = false; LEDColor color = ONHEATINGSTART(); #endif - TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = false); // PID Tuning loop From 40b89456af556d60cfff79c27a3fd50d3edf689f Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 24 Aug 2020 15:23:32 -0300 Subject: [PATCH 0147/1370] Color UI + Robin Nano test (#19118) --- buildroot/tests/mks_robin_nano35-tests | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index ac72050875..92c97be756 100644 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -35,5 +35,12 @@ opt_disable TOUCH_SCREEN opt_enable TFT_LVGL_UI_SPI exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_320x240 +opt_enable TOUCH_SCREEN +opt_enable TFT_480x320_SPI +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" + # cleanup restore_configs From 0decb50fcd8b5a87534f2f28dc446d7c950e17f0 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 26 Aug 2020 01:16:43 +1200 Subject: [PATCH 0148/1370] LEDs followup (#19133) --- Marlin/src/gcode/feature/leds/M150.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index 1c81c6d6be..83bd24c41c 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -50,7 +50,7 @@ */ void GcodeSuite::M150() { #if ENABLED(NEOPIXEL_LED) - neo.set_neo_index(parser.intval('I', -1)); + neo.neoindex = parser.intval('I', -1); #endif leds.set_color(MakeLEDColor( parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, From 9bf6ddd4f1e34f78e80e01b252e48b0968d45636 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 25 Aug 2020 23:34:53 -0500 Subject: [PATCH 0149/1370] No COM_PIN needed for DWIN --- Marlin/src/lcd/dwin/dwin.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 0d719542e1..d82efc5689 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -3341,13 +3341,6 @@ void HMI_Init(void) { } HMI_SetLanguage(); - - #if ENABLED(FIX_MOUNTED_PROBE) // For "CREALITY_TOUCH" probe too? - SET_OUTPUT(COM_PIN); - WRITE(COM_PIN, 1); - #endif - - delay(200); } void DWIN_Update(void) { From 0070a0642ba8fb6a68c998dc10cf2df00172c972 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 25 Aug 2020 23:57:48 -0500 Subject: [PATCH 0150/1370] Warn about MARLIN_DEV_MODE --- Marlin/src/inc/SanityCheck.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 01d07ea4da..671d6e84f8 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -75,6 +75,10 @@ #endif #undef HEXIFY +#if ENABLED(MARLIN_DEV_MODE) + #warning "WARNING! Disable MARLIN_DEV_MODE for the final build!" +#endif + /** * Warnings for old configurations */ @@ -523,16 +527,11 @@ #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." #elif defined(EVENT_GCODE_SD_STOP) #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT. Please update your Configuration.h." -#endif - -#ifdef FIL_RUNOUT_INVERTING +#elif defined(FIL_RUNOUT_INVERTING) #if FIL_RUNOUT_INVERTING - #warning "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update Configuration.h." + #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update your Configuration.h." #else - #warning "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW. Please update Configuration.h." - #endif - #ifndef FIL_RUNOUT_STATE - #define FIL_RUNOUT_STATE ((FIL_RUNOUT_INVERTING) ? HIGH : LOW) + #error "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW. Please update your Configuration.h." #endif #endif From 6043f5d5d0bea2752e4d0030775466d45b2c2ce7 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 25 Aug 2020 22:43:33 -0700 Subject: [PATCH 0151/1370] Fix SD pins for SKR Pro and GTR (#19047) --- Marlin/src/lcd/extui/ui_api.cpp | 4 -- Marlin/src/lcd/ultralcd.cpp | 4 -- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 54 +++++++++++-------- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 23 ++++---- Marlin/src/sd/cardreader.cpp | 4 ++ 5 files changed, 49 insertions(+), 40 deletions(-) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 3df9c17f6b..31449fcef4 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -1057,10 +1057,6 @@ namespace ExtUI { // At the moment, we piggy-back off the ultralcd calls, but this could be cleaned up in the future void MarlinUI::init() { - #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - SET_INPUT_PULLUP(SD_DETECT_PIN); - #endif - ExtUI::onStartup(); } diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 09767c72aa..b30f6e49c9 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -372,10 +372,6 @@ void MarlinUI::init() { #endif // HAS_SHIFT_ENCODER - #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - SET_INPUT_PULLUP(SD_DETECT_PIN); - #endif - #if HAS_ENCODER_ACTION && HAS_SLOW_BUTTONS slow_buttons = 0; #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index bc882316e7..ea643322b6 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -280,24 +280,29 @@ //#define FAN6_PIN PC9 // Fan6 //#define FAN7_PIN PE14 // Fan7 -// -// By default the onboard SD (SPI1) is enabled -// -#define CUSTOM_SPI_PINS -#if DISABLED(CUSTOM_SPI_PINS) - #define SDSS PB12 +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD #endif -// HAL SPI1 pins group -#if ENABLED(CUSTOM_SPI_PINS) +// +// By default the LCD SD (SPI2) is enabled +// Onboard SD is on a completely separate SPI bus, and requires +// overriding pins to access. +// +#if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN PB10 + #define SDSS PB12 +#elif SD_CONNECTION_IS(ONBOARD) + // Instruct the STM32 HAL to override the default SPI pins from the variant.h file + #define CUSTOM_SPI_PINS #define SDSS PA4 - #define SD_DETECT_PIN PC4 - #define LCD_SDSS PA4 - + #define SS_PIN SDSS #define SCK_PIN PA5 #define MISO_PIN PA6 #define MOSI_PIN PA7 - #define SS_PIN PA4 // Chip select for SD card used by Marlin + #define SD_DETECT_PIN PC4 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #define "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" #endif /** @@ -319,7 +324,6 @@ #define BTN_ENC PA15 #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS PG6 #define BTN_EN1 PC10 @@ -333,6 +337,15 @@ #undef BOARD_ST7920_DELAY_2 #undef BOARD_ST7920_DELAY_3 + #elif ENABLED(MKS_MINI_12864) + #define DOGLCD_A0 PG6 + #define DOGLCD_CS PG7 + #define BTN_EN1 PD10 + #define BTN_EN2 PH10 + + #if SD_CONNECTION_IS(ONBOARD) + #define SOFTWARE_SPI + #endif #else #define LCD_PINS_RS PA8 @@ -340,17 +353,17 @@ #define BTN_EN1 PD10 #define BTN_EN2 PH10 - #if DISABLED(CUSTOM_SPI_PINS) - #define SD_DETECT_PIN PB10 - #define LCD_SDSS PB12 - #endif - #define LCD_PINS_ENABLE PC10 #define LCD_PINS_D4 PG8 #if ENABLED(FYSETC_MINI_12864) #define DOGLCD_CS PC10 #define DOGLCD_A0 PA8 + + #if SD_CONNECTION_IS(ONBOARD) + #define SOFTWARE_SPI + #endif + //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN PG8 // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) @@ -389,11 +402,6 @@ #endif #endif - //#define DOGLCD_CS PB12 - //#define DOGLCD_A0 PA8 - //#define LCD_PINS_DC PB14 - //#define DOGLCD_MOSI PB15 - #endif // HAS_SPI_LCD #undef TP diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index e13c4a227a..56c509562f 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -250,12 +250,22 @@ // Onboard SD card // Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2 // -#if SD_CONNECTION_IS(ONBOARD) - #define SOFTWARE_SPI // Use soft SPI for onboard SD +#if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN PF12 + #define SDSS PB12 +#elif SD_CONNECTION_IS(ONBOARD) + // The SKR Pro's ONBOARD SD interface is on SPI1. + // Due to a pull resistor on the clock line, it needs to use SPI Data Mode 3 to + // function with Hardware SPI. This is not currently configurable in the HAL, + // so force Software SPI to work around this issue. + #define SOFTWARE_SPI #define SDSS PA4 #define SCK_PIN PA5 #define MISO_PIN PA6 #define MOSI_PIN PB5 + #define SD_DETECT_PIN PB11 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #define "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" #endif /** @@ -275,9 +285,6 @@ #if HAS_SPI_LCD #define BEEPER_PIN PG4 #define BTN_ENC PA8 - #if SD_CONNECTION_IS(LCD) - #define SDSS PB12 // Uses default hardware SPI for LCD's SD - #endif #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS PG6 @@ -296,16 +303,14 @@ #elif ENABLED(MKS_MINI_12864) #define DOGLCD_A0 PG6 #define DOGLCD_CS PG3 - + #define BTN_EN1 PG10 + #define BTN_EN2 PF11 #else #define LCD_PINS_RS PD10 #define BTN_EN1 PG10 #define BTN_EN2 PF11 - #define SD_DETECT_PIN PF12 - - #define LCD_SDSS PB12 #define LCD_PINS_ENABLE PD11 #define LCD_PINS_D4 PG2 diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 3aa7156e7b..29f9672e92 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -137,6 +137,10 @@ CardReader::CardReader() { // Disable autostart until card is initialized autostart_index = -1; + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + SET_INPUT_PULLUP(SD_DETECT_PIN); + #endif + #if PIN_EXISTS(SDPOWER) OUT_WRITE(SDPOWER_PIN, HIGH); // Power the SD reader #endif From 6844ef21d469c41b5319a75dbcd57b1ad7a1586a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 25 Aug 2020 22:44:15 -0700 Subject: [PATCH 0152/1370] Add Einsy Rambo Filament Runout Pin (#19136) --- Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 8fb3be47da..e2a4940e87 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -80,6 +80,13 @@ #define Z_MIN_PROBE_PIN 10 #endif +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 62 +#endif + // // Steppers // From 1b129ede4ea60cd8e033d7beb422abc75da68ea4 Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Mon, 24 Aug 2020 08:56:19 -0600 Subject: [PATCH 0153/1370] Fixes to FTDI Touch UI (#19134) - Fix unused variable warning - Fix for filament runout sound - Fix for developer menu access - Fix compilation error when using CALIBRATION_GCODE - Remove material labels in change filament screen - Add decimals to status screen Z coordinate - Add more descriptive message on heater timeout --- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h | 4 ++-- .../lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h | 3 --- .../src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp | 2 ++ .../ftdi_eve_touch_ui/screens/change_filament_screen.cpp | 6 +++--- .../screens/confirm_auto_calibration_dialog_box.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp | 4 ++-- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h | 2 +- Marlin/src/lcd/language/language_en.h | 6 +++++- 10 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h index 972c38395b..b12ab286e1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -144,8 +144,8 @@ class UIScreen { static bool onTouchEnd(uint8_t) {return true;} }; -#define PUSH_SCREEN(screen) current_screen.push(screen::onRedraw); -#define GOTO_SCREEN(screen) current_screen.goTo(screen::onRedraw); +#define PUSH_SCREEN(screen) current_screen.push(screen::onRedraw) +#define GOTO_SCREEN(screen) current_screen.goTo(screen::onRedraw) #define GOTO_PREVIOUS() current_screen.goBack(); #define AT_SCREEN(screen) (current_screen.getType() == current_screen.lookupScreen(screen::onRedraw)) #define IS_PARENT_SCREEN(screen) (current_screen.peek() == current_screen.lookupScreen(screen::onRedraw)) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index b00c836ce4..f2971087c1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -91,9 +91,6 @@ namespace Language_en { PROGMEM Language_Str MSG_UNITS_STEP_MM = u8"st/mm"; PROGMEM Language_Str MSG_UNITS_PERCENT = u8"%"; PROGMEM Language_Str MSG_UNITS_C = DEGREE_SIGN u8"C"; - PROGMEM Language_Str MSG_MATERIAL_PLA = u8"PLA"; - PROGMEM Language_Str MSG_MATERIAL_ABS = u8"ABS"; - PROGMEM Language_Str MSG_MATERIAL_HIGH_TEMP = u8"High"; PROGMEM Language_Str MSG_IDLE = u8"idle"; PROGMEM Language_Str MSG_SET_MAXIMUM = u8"Set Maximum"; PROGMEM Language_Str MSG_PRINT_SPEED = u8"Print Speed"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index a9b4ec6cd8..e06f9f3a29 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -92,7 +92,7 @@ namespace ExtUI { char lcd_msg[30]; sprintf_P(lcd_msg, PSTR("Extruder %d Filament Error"), extruder + 1); StatusScreen::setStatusMessage(lcd_msg); - InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED); + InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED, FTDI::PLAY_SYNCHRONOUS); } void onFactoryReset() { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp index 47a35cd0a8..9cd17637bd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp @@ -80,6 +80,7 @@ void AboutScreen::onRedraw(draw_mode_t) { #endif , OPT_CENTER, font_xlarge ); + cmd.tag(3); draw_text_box(cmd, FW_VERS_POS, #ifdef TOUCH_UI_VERSION F(TOUCH_UI_VERSION) @@ -87,6 +88,7 @@ void AboutScreen::onRedraw(draw_mode_t) { progmem_str(getFirmwareName_str()) #endif , OPT_CENTER, font_medium); + cmd.tag(0); draw_text_box(cmd, FW_INFO_POS, about_str, OPT_CENTER, font_medium); draw_text_box(cmd, INSET_POS(LICENSE_POS), GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index afa3211a01..589da9b210 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -207,13 +207,13 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { { char str[30]; - format_temp_and_material(str, LOW_TEMP, GET_TEXT(MSG_MATERIAL_PLA)); + format_temp(str, LOW_TEMP); cmd.tag(2) .TOG_STYLE(tog2) .button (BTN_POS(2,6), BTN_SIZE(1,1), str); - format_temp_and_material(str, MED_TEMP, GET_TEXT(MSG_MATERIAL_ABS)); + format_temp(str, MED_TEMP); cmd.tag(3) .TOG_STYLE(tog3) .button (BTN_POS(2,5), BTN_SIZE(1,1), str); - format_temp_and_material(str, HIGH_TEMP, GET_TEXT(MSG_MATERIAL_HIGH_TEMP)); + format_temp(str, HIGH_TEMP); cmd.tag(4) .TOG_STYLE(tog4) .button (BTN_POS(2,4), BTN_SIZE(1,1), str); } cmd.colors(normal_btn) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp index 974ce3a6e1..7e1a82025d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp @@ -38,7 +38,7 @@ bool ConfirmAutoCalibrationDialogBox::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_SCREEN(StatusScreen); - injectCommands_P(PSTR(CALIBRATION_COMMANDS)); + injectCommands_P(PSTR("G425")); return true; default: return DialogBoxBaseClass::onTouchEnd(tag); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index ac1fccd579..f2524c7982 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -97,7 +97,7 @@ void StatusScreen::draw_axis_position(draw_mode_t what) { strcpy_P(y_str, PSTR("?")); if (isAxisPositionKnown(Z)) - format_position(z_str, getAxisPosition_mm(Z)); + format_position(z_str, getAxisPosition_mm(Z), 2); else strcpy_P(z_str, PSTR("?")); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp index 340ffd0553..b7ce76ecd2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp @@ -61,8 +61,8 @@ void format_temp_and_material(char *str, float t1, const char *material) { /** * Formats a position value (e.g. "10 mm") */ -void format_position(char *str, float p) { - dtostrf(p, 5, 1, str); +void format_position(char *str, float p, uint8_t decimals) { + dtostrf(p, 4 + decimals, decimals, str); strcat_P(str, PSTR(" ")); strcat_P(str, GET_TEXT(MSG_UNITS_MM)); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h index ce3af4db87..e37a82d28a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h @@ -25,5 +25,5 @@ void format_temp(char *str, float t1); void format_temp_and_idle(char *str, float t1); void format_temp_and_temp(char *str, float t1, float t2); void format_temp_and_material(char *str, float t1, const char *material); -void format_position(char *str, float p); +void format_position(char *str, float p, uint8_t decimals = 1); void format_position(char *str, float x, float y, float z); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 5aa0d76a84..fde21f2bba 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -647,7 +647,11 @@ namespace Language_en { PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Level X Axis"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrate"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heater Timeout"); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Idle timeout, temperature decreased. Press Okay to reheat and again to resume."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heater Timeout"); + #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("Reheat"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Reheating..."); } From 8670f475b8cb309ad2a068d2c1fc648bd2c19087 Mon Sep 17 00:00:00 2001 From: Colin Godsey Date: Wed, 26 Aug 2020 00:32:56 -0600 Subject: [PATCH 0154/1370] Direct Stepping update (#19135) --- Marlin/src/feature/direct_stepping.cpp | 49 ++++++++++---------------- Marlin/src/feature/direct_stepping.h | 6 +--- Marlin/src/module/stepper.cpp | 30 ++++++++-------- 3 files changed, 34 insertions(+), 51 deletions(-) diff --git a/Marlin/src/feature/direct_stepping.cpp b/Marlin/src/feature/direct_stepping.cpp index d3bdb43ab3..9766d14640 100644 --- a/Marlin/src/feature/direct_stepping.cpp +++ b/Marlin/src/feature/direct_stepping.cpp @@ -56,9 +56,6 @@ namespace DirectStepping { template volatile bool SerialPageManager::page_states_dirty; - template - millis_t SerialPageManager::next_response; - template uint8_t SerialPageManager::pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; @@ -80,7 +77,6 @@ namespace DirectStepping { page_states[i] = PageState::FREE; fatal_error = false; - next_response = 0; state = State::NEWLINE; page_states_dirty = false; @@ -181,15 +177,8 @@ namespace DirectStepping { return; } - // Runs on a set interval also, as responses may get lost. - if (next_response && next_response < millis()) { - page_states_dirty = true; - } - if (!page_states_dirty) return; - page_states_dirty = false; - next_response = millis() + Cfg::RESPONSE_INTERVAL_MS; SERIAL_ECHO(Cfg::CONTROL_CHAR); constexpr int state_bits = 2; @@ -238,29 +227,29 @@ const uint8_t segment_table[DirectStepping::Config::NUM_SEGMENTS][DirectStepping #if STEPPER_PAGE_FORMAT == SP_4x4D_128 - { 1, 1, 1, 1, 1, 1, 1, 0 }, // 0 = -7 - { 1, 1, 1, 0, 1, 1, 1, 0 }, // 1 = -6 - { 0, 1, 1, 0, 1, 0, 1, 1 }, // 2 = -5 - { 0, 1, 0, 1, 0, 1, 0, 1 }, // 3 = -4 - { 0, 1, 0, 0, 1, 0, 0, 1 }, // 4 = -3 - { 0, 0, 1, 0, 0, 0, 1, 0 }, // 5 = -2 - { 0, 0, 0, 0, 1, 0, 0, 0 }, // 6 = -1 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // 7 = 0 - { 0, 0, 0, 0, 1, 0, 0, 0 }, // 8 = 1 - { 0, 0, 1, 0, 0, 0, 1, 0 }, // 9 = 2 - { 0, 1, 0, 0, 1, 0, 0, 1 }, // 10 = 3 - { 0, 1, 0, 1, 0, 1, 0, 1 }, // 11 = 4 - { 0, 1, 1, 0, 1, 0, 1, 1 }, // 12 = 5 - { 1, 1, 1, 0, 1, 1, 1, 0 }, // 13 = 6 - { 1, 1, 1, 1, 1, 1, 1, 0 }, // 14 = 7 + { 1, 1, 1, 1, 1, 1, 1 }, // 0 = -7 + { 1, 1, 1, 0, 1, 1, 1 }, // 1 = -6 + { 1, 1, 1, 0, 1, 0, 1 }, // 2 = -5 + { 1, 1, 0, 1, 0, 1, 0 }, // 3 = -4 + { 1, 1, 0, 0, 1, 0, 0 }, // 4 = -3 + { 0, 0, 1, 0, 0, 0, 1 }, // 5 = -2 + { 0, 0, 0, 1, 0, 0, 0 }, // 6 = -1 + { 0, 0, 0, 0, 0, 0, 0 }, // 7 = 0 + { 0, 0, 0, 1, 0, 0, 0 }, // 8 = 1 + { 0, 0, 1, 0, 0, 0, 1 }, // 9 = 2 + { 1, 1, 0, 0, 1, 0, 0 }, // 10 = 3 + { 1, 1, 0, 1, 0, 1, 0 }, // 11 = 4 + { 1, 1, 1, 0, 1, 0, 1 }, // 12 = 5 + { 1, 1, 1, 0, 1, 1, 1 }, // 13 = 6 + { 1, 1, 1, 1, 1, 1, 1 }, // 14 = 7 { 0 } #elif STEPPER_PAGE_FORMAT == SP_4x2_256 - { 0, 0, 0, 0 }, // 0 - { 0, 1, 0, 0 }, // 1 - { 1, 0, 1, 0 }, // 2 - { 1, 1, 1, 0 }, // 3 + { 0, 0, 0 }, // 0 + { 0, 1, 0 }, // 1 + { 1, 0, 1 }, // 2 + { 1, 1, 1 }, // 3 #elif STEPPER_PAGE_FORMAT == SP_4x1_512 diff --git a/Marlin/src/feature/direct_stepping.h b/Marlin/src/feature/direct_stepping.h index dea2616508..cde9d1a0b4 100644 --- a/Marlin/src/feature/direct_stepping.h +++ b/Marlin/src/feature/direct_stepping.h @@ -70,7 +70,6 @@ namespace DirectStepping { static volatile PageState page_states[Cfg::NUM_PAGES]; static volatile bool page_states_dirty; - static millis_t next_response; static uint8_t pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; static uint8_t checksum; @@ -94,14 +93,11 @@ namespace DirectStepping { static constexpr int DIRECTIONAL = dir ? 1 : 0; static constexpr int SEGMENTS = segments; - static constexpr int RAW = (BITS_SEGMENT == 1) ? 1 : 0; static constexpr int NUM_SEGMENTS = 1 << BITS_SEGMENT; - static constexpr int SEGMENT_STEPS = 1 << (BITS_SEGMENT - DIRECTIONAL - RAW); + static constexpr int SEGMENT_STEPS = (1 << (BITS_SEGMENT - DIRECTIONAL)) - 1; static constexpr int TOTAL_STEPS = SEGMENT_STEPS * SEGMENTS; static constexpr int PAGE_SIZE = (NUM_AXES * BITS_SEGMENT * SEGMENTS) / 8; - static constexpr millis_t RESPONSE_INTERVAL_MS = 50; - typedef typename TypeSelector<(PAGE_SIZE>256), uint16_t, uint8_t>::type write_byte_idx_t; typedef typename TypeSelector<(NUM_PAGES>256), uint16_t, uint8_t>::type page_idx_t; }; diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index e5f65a3cdd..0e70fd370c 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1578,12 +1578,11 @@ void Stepper::pulse_phase_isr() { #if STEPPER_PAGE_FORMAT == SP_4x4D_128 - #define PAGE_SEGMENT_UPDATE(AXIS, VALUE, MID) do{ \ - if ((VALUE) == MID) {} \ - else if ((VALUE) < MID) SBI(dm, _AXIS(AXIS)); \ - else CBI(dm, _AXIS(AXIS)); \ - page_step_state.sd[_AXIS(AXIS)] = VALUE; \ - page_step_state.bd[_AXIS(AXIS)] += VALUE; \ + #define PAGE_SEGMENT_UPDATE(AXIS, VALUE) do{ \ + if ((VALUE) < 7) SBI(dm, _AXIS(AXIS)); \ + else if ((VALUE) > 7) CBI(dm, _AXIS(AXIS)); \ + page_step_state.sd[_AXIS(AXIS)] = VALUE; \ + page_step_state.bd[_AXIS(AXIS)] += VALUE; \ }while(0) #define PAGE_PULSE_PREP(AXIS) do{ \ @@ -1592,7 +1591,7 @@ void Stepper::pulse_phase_isr() { }while(0) switch (page_step_state.segment_steps) { - case 8: + case DirectStepping::Config::SEGMENT_STEPS: page_step_state.segment_idx += 2; page_step_state.segment_steps = 0; // fallthru @@ -1601,10 +1600,10 @@ void Stepper::pulse_phase_isr() { high = page_step_state.page[page_step_state.segment_idx + 1]; uint8_t dm = last_direction_bits; - PAGE_SEGMENT_UPDATE(X, low >> 4, 7); - PAGE_SEGMENT_UPDATE(Y, low & 0xF, 7); - PAGE_SEGMENT_UPDATE(Z, high >> 4, 7); - PAGE_SEGMENT_UPDATE(E, high & 0xF, 7); + PAGE_SEGMENT_UPDATE(X, low >> 4); + PAGE_SEGMENT_UPDATE(Y, low & 0xF); + PAGE_SEGMENT_UPDATE(Z, high >> 4); + PAGE_SEGMENT_UPDATE(E, high & 0xF); if (dm != last_direction_bits) { last_direction_bits = dm; @@ -1615,9 +1614,9 @@ void Stepper::pulse_phase_isr() { default: break; } - PAGE_PULSE_PREP(X), - PAGE_PULSE_PREP(Y), - PAGE_PULSE_PREP(Z), + PAGE_PULSE_PREP(X); + PAGE_PULSE_PREP(Y); + PAGE_PULSE_PREP(Z); PAGE_PULSE_PREP(E); page_step_state.segment_steps++; @@ -1634,7 +1633,7 @@ void Stepper::pulse_phase_isr() { }while(0) switch (page_step_state.segment_steps) { - case 4: + case DirectStepping::Config::SEGMENT_STEPS: page_step_state.segment_idx++; page_step_state.segment_steps = 0; // fallthru @@ -1664,7 +1663,6 @@ void Stepper::pulse_phase_isr() { }while(0) uint8_t steps = page_step_state.page[page_step_state.segment_idx >> 1]; - if (page_step_state.segment_idx & 0x1) steps >>= 4; PAGE_PULSE_PREP(X, 3); From 5059586fc39d38b6e07e2bced4a595154a7fc777 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 26 Aug 2020 02:15:43 -0500 Subject: [PATCH 0155/1370] =?UTF-8?q?Prusa=20=3D>=20Pr=C5=AF=C5=A1a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 8 ++++---- Marlin/Configuration_adv.h | 8 ++++---- Marlin/src/MarlinCore.cpp | 4 ++-- Marlin/src/gcode/calibrate/G76_M871.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/module/thermistor/thermistors.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 2 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 39dc195231..d1f94c51f0 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -177,7 +177,7 @@ #endif /** - * Prusa Multi-Material Unit v2 + * Průša Multi-Material Unit v2 * * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. * Requires EXTRUDERS = 5 @@ -373,7 +373,7 @@ * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan, J-Head, and E3D) (4.7k pullup) * 501 : 100K Zonestar (Tronxy X3A) Thermistor - * 502 : 100K Zonestar Thermistor used by hot bed in Zonestar Prusa P802M + * 502 : 100K Zonestar Thermistor used by hot bed in Zonestar Průša P802M * 512 : 100k RPW-Ultra hotend thermistor (4.7k pullup) * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) @@ -1720,9 +1720,9 @@ #define DISPLAY_CHARSET_HD44780 JAPANESE /** - * Info Screen Style (0:Classic, 1:Prusa) + * Info Screen Style (0:Classic, 1:Průša) * - * :[0:'Classic', 1:'Prusa'] + * :[0:'Classic', 1:'Průša'] */ #define LCD_INFO_SCREEN_STYLE 0 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 19906819a1..8df05e8a2c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2424,7 +2424,7 @@ * CHOPPER_DEFAULT_24V * CHOPPER_DEFAULT_36V * CHOPPER_09STEP_24V // 0.9 degree steppers (24V) - * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Prusa firmware for MK3 (24V) + * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V) * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 * * Define you own with @@ -3396,7 +3396,7 @@ #endif /** - * Prusa Multi-Material Unit v2 + * Průša Multi-Material Unit v2 * Enable in Configuration.h */ #if ENABLED(PRUSA_MMU2) @@ -3420,7 +3420,7 @@ //#define MMU2_MENUS #if ENABLED(MMU2_MENUS) // Settings for filament load / unload from the LCD menu. - // This is for Prusa MK3-style extruders. Customize for your hardware. + // This is for Průša MK3-style extruders. Customize for your hardware. #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ { 7.2, 1145 }, \ @@ -3446,7 +3446,7 @@ /** * MMU Extruder Sensor * - * Support for a Prusa (or other) IR Sensor to detect filament near the extruder + * Support for a Průša (or other) IR Sensor to detect filament near the extruder * and make loading more reliable. Suitable for an extruder equipped with a filament * sensor less than 38mm from the gears. * diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index f371ddfc6e..a5fcfba6c0 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -684,7 +684,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { * - Read Buttons and Update the LCD * - Run i2c Position Encoders * - Auto-report Temperatures / SD Status - * - Update the Prusa MMU2 + * - Update the Průša MMU2 * - Handle Joystick jogging */ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { @@ -760,7 +760,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { } #endif - // Update the Prusa MMU2 + // Update the Průša MMU2 TERN_(PRUSA_MMU2, mmu2.mmu_loop()); // Handle Joystick jogging diff --git a/Marlin/src/gcode/calibrate/G76_M871.cpp b/Marlin/src/gcode/calibrate/G76_M871.cpp index f2f53d213d..9870d9fbe5 100644 --- a/Marlin/src/gcode/calibrate/G76_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M871.cpp @@ -45,7 +45,7 @@ * - When calibrating bed, probe temperature is held constant. * Compensation values are deltas to first probe measurement at bed temp. = 60°C. * - The hotend will not be heated at any time. - * - On my Prusa MK3S clone I put a piece of paper between the probe and the hotend + * - On my Průša MK3S clone I put a piece of paper between the probe and the hotend * so the hotend fan would not cool my probe constantly. Alternativly you could just * make sure the fan is not running while running the calibration process. * diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index ccafd413cf..112ff93a0e 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -512,7 +512,7 @@ #undef DISABLE_INACTIVE_EXTRUDER #endif -// Prusa MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE +// Průša MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE #if EITHER(MK2_MULTIPLEXER, PRUSA_MMU2) #define SINGLENOZZLE #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 671d6e84f8..932cccd9e9 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2876,7 +2876,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif /** - * Prusa MMU2 requirements + * Průša MMU2 requirements */ #if ENABLED(PRUSA_MMU2) #if EXTRUDERS != 5 diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 44680a7baa..56921c6d18 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -72,7 +72,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(501) // 100K Zonestar thermistor #include "thermistor_501.h" #endif -#if ANY_THERMISTOR_IS(502) // Unknown thermistor used by the Zonestar Prusa P802M hot bed +#if ANY_THERMISTOR_IS(502) // Unknown thermistor used by the Zonestar Průša P802M hot bed #include "thermistor_502.h" #endif #if ANY_THERMISTOR_IS(512) // 100k thermistor in RPW-Ultra hotend, Pull-up = 4.7 kOhm, "unknown model" diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index d20fd5a6c1..2e55782edb 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -127,7 +127,7 @@ #endif // -// Prusa i3 MK2 Multi Material Multiplexer Support +// Průša i3 MK2 Multi Material Multiplexer Support // //#define E_MUX0_PIN -1 //#define E_MUX1_PIN -1 diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index d34458c044..1ffe25b499 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -147,7 +147,7 @@ //#define NEOPIXEL_PIN PF13 // -// Prusa i3 MK2 Multi Material Multiplexer Support +// Průša i3 MK2 Multi Material Multiplexer Support // //#define E_MUX0_PIN PG3 //#define E_MUX1_PIN PG4 From 3b4779fa15679392c11787ace0d5c1ae6306f731 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 26 Aug 2020 07:13:58 -0300 Subject: [PATCH 0156/1370] TFT (plus Hardware SPI) for LPC (#19139) --- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 256 ++++++++++++++++-- Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h | 11 +- Marlin/src/HAL/LPC1768/include/SPI.h | 140 +++++++++- Marlin/src/HAL/LPC1768/tft/tft_spi.cpp | 153 +++++++++++ Marlin/src/HAL/LPC1768/tft/tft_spi.h | 77 ++++++ Marlin/src/HAL/LPC1768/tft/xpt2046.cpp | 129 +++++++++ Marlin/src/HAL/LPC1768/tft/xpt2046.h | 80 ++++++ Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 10 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 4 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 32 +++ Marlin/src/pins/pinsDebug_list.h | 19 ++ 11 files changed, 862 insertions(+), 49 deletions(-) create mode 100644 Marlin/src/HAL/LPC1768/tft/tft_spi.cpp create mode 100644 Marlin/src/HAL/LPC1768/tft/tft_spi.h create mode 100644 Marlin/src/HAL/LPC1768/tft/xpt2046.cpp create mode 100644 Marlin/src/HAL/LPC1768/tft/xpt2046.h diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index e34a102012..00b4310d1d 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -30,7 +30,7 @@ */ /** - * Hardware SPI and a software SPI implementations are included in this file. + * Hardware SPI and Software SPI implementations are included in this file. * The hardware SPI runs faster and has higher throughput but is not compatible * with some LCD interfaces/adapters. * @@ -51,6 +51,10 @@ #include "../../inc/MarlinConfig.h" #include +// Hardware SPI and SPIClass +#include +#include + // ------------------------ // Public functions // ------------------------ @@ -96,12 +100,6 @@ #else - // Hardware SPI - - #include - #include - #include - // decide which HW SPI device to use #ifndef LPC_HW_SPI_DEV #if (SCK_PIN == P0_07 && MISO_PIN == P0_08 && MOSI_PIN == P0_09) @@ -114,7 +112,7 @@ #endif #endif #endif - #if (LPC_HW_SPI_DEV == 0) + #if LPC_HW_SPI_DEV == 0 #define LPC_SSPn LPC_SSP0 #else #define LPC_SSPn LPC_SSP1 @@ -192,7 +190,7 @@ for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF); } - static uint8_t spiTransfer(uint8_t b) { + uint8_t spiTransfer(uint8_t b) { return doio(b); } @@ -211,30 +209,236 @@ #endif // LPC_SOFTWARE_SPI -void SPIClass::begin() { spiBegin(); } - -void SPIClass::beginTransaction(const SPISettings &cfg) { - uint8_t spiRate; - switch (cfg.spiRate()) { - case 8000000: spiRate = 0; break; - case 4000000: spiRate = 1; break; - case 2000000: spiRate = 2; break; - case 1000000: spiRate = 3; break; - case 500000: spiRate = 4; break; - case 250000: spiRate = 5; break; - case 125000: spiRate = 6; break; - default: spiRate = 2; break; - } - spiInit(spiRate); +/** + * @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset. + */ +static inline void waitSpiTxEnd(LPC_SSP_TypeDef *spi_d) { + while (SSP_GetStatus(spi_d, SSP_STAT_TXFIFO_EMPTY) == RESET) { /* nada */ } // wait until TXE=1 + while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0 } -uint8_t SPIClass::transfer(const uint8_t B) { return spiTransfer(B); } +SPIClass::SPIClass(uint8_t device) { + // Init things specific to each SPI device + // clock divider setup is a bit of hack, and needs to be improved at a later date. + + PINSEL_CFG_Type PinCfg; // data structure to hold init values + #if BOARD_NR_SPI >= 1 + _settings[0].spi_d = LPC_SSP0; + // _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); + PinCfg.Funcnum = 2; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_SCK_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_SCK_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(BOARD_SPI1_SCK_PIN); + + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_MISO_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_MISO_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_INPUT(BOARD_SPI1_MISO_PIN); + + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_MOSI_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_MOSI_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(BOARD_SPI1_MOSI_PIN); + #endif + + #if BOARD_NR_SPI >= 2 + _settings[1].spi_d = LPC_SSP1; + // _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); + PinCfg.Funcnum = 2; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_SCK_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_SCK_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(BOARD_SPI2_SCK_PIN); + + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_MISO_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_MISO_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_INPUT(BOARD_SPI2_MISO_PIN); + + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_MOSI_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_MOSI_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(BOARD_SPI2_MOSI_PIN); + #endif + + setModule(device); + + /* Initialize GPDMA controller */ + //TODO: call once in the constructor? or each time? + GPDMA_Init(); +} + +void SPIClass::begin() { + updateSettings(); + SSP_Cmd(_currentSetting->spi_d, ENABLE); // start SSP running +} + +void SPIClass::beginTransaction(const SPISettings &cfg) { + setBitOrder(cfg.bitOrder); + setDataMode(cfg.dataMode); + setDataSize(cfg.dataSize); + //setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); + begin(); +} + +uint8_t SPIClass::transfer(const uint16_t b) { + /* send and receive a single byte */ + SSP_ReceiveData(_currentSetting->spi_d); // read any previous data + SSP_SendData(_currentSetting->spi_d, b); + waitSpiTxEnd(_currentSetting->spi_d); // wait for it to finish + return SSP_ReceiveData(_currentSetting->spi_d); +} uint16_t SPIClass::transfer16(const uint16_t data) { return (transfer((data >> 8) & 0xFF) << 8) | (transfer(data & 0xFF) & 0xFF); } -SPIClass SPI; +void SPIClass::end() { + // SSP_Cmd(_currentSetting->spi_d, DISABLE); // stop device or SSP_DeInit? + SSP_DeInit(_currentSetting->spi_d); +} + +void SPIClass::send(uint8_t data) { + SSP_SendData(_currentSetting->spi_d, data); +} + +void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) { + //TODO: LPC dma can only write 0xFFF bytes at once. + GPDMA_Channel_CFG_Type GPDMACfg; + + /* Configure GPDMA channel 0 -------------------------------------------------------------*/ + /* DMA Channel 0 */ + GPDMACfg.ChannelNum = 0; + // Source memory + GPDMACfg.SrcMemAddr = (uint32_t)buf; + // Destination memory - Not used + GPDMACfg.DstMemAddr = 0; + // Transfer size + GPDMACfg.TransferSize = (minc ? length : 1); + // Transfer width + GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE; + // Transfer type + GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P; + // Source connection - unused + GPDMACfg.SrcConn = 0; + // Destination connection + GPDMACfg.DstConn = (_currentSetting->spi_d == LPC_SSP0) ? GPDMA_CONN_SSP0_Tx : GPDMA_CONN_SSP1_Tx; + + GPDMACfg.DMALLI = 0; + + // Enable dma on SPI + SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE); + + // if minc=false, I'm repeating the same byte 'length' times, as I could not find yet how do GPDMA without memory increment + do { + // Setup channel with given parameter + GPDMA_Setup(&GPDMACfg); + + // enabled dma + GPDMA_ChannelCmd(0, ENABLE); + + // wait data transfer + while (!GPDMA_IntGetStatus(GPDMA_STAT_INTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_INTERR, 0)) { } + + // clear err and int + GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); + GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0); + + // dma disable + GPDMA_ChannelCmd(0, DISABLE); + + --length; + } while (!minc && length > 0); + + waitSpiTxEnd(_currentSetting->spi_d); + + SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, DISABLE); +} + +uint16_t SPIClass::read() { + return SSP_ReceiveData(_currentSetting->spi_d); +} + +void SPIClass::read(uint8_t *buf, uint32_t len) { + for (uint16_t i = 0; i < len; i++) buf[i] = transfer(0xFF); +} + +void SPIClass::setClock(uint32_t clock) { + _currentSetting->clock = clock; +} + +void SPIClass::setModule(uint8_t device) { + _currentSetting = &_settings[device - 1];// SPI channels are called 1 2 and 3 but the array is zero indexed +} + +void SPIClass::setBitOrder(uint8_t bitOrder) { + _currentSetting->bitOrder = bitOrder; +} + +void SPIClass::setDataMode(uint8_t dataMode) { + _currentSetting->dataSize = dataMode; +} + +void SPIClass::setDataSize(uint32_t ds) { + _currentSetting->dataSize = ds; +} + +/** + * Set up/tear down + */ +void SPIClass::updateSettings() { + //SSP_DeInit(_currentSetting->spi_d); //todo: need force de init?! + + // divide PCLK by 2 for SSP0 + CLKPWR_SetPCLKDiv(_currentSetting->spi_d == LPC_SSP0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2); + + SSP_CFG_Type HW_SPI_init; // data structure to hold init values + SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode + HW_SPI_init.ClockRate = _currentSetting->clock; + HW_SPI_init.Databit = _currentSetting->dataSize; + + /** + * SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge + * 0 0 0 Falling Rising + * 1 0 1 Rising Falling + * 2 1 0 Rising Falling + * 3 1 1 Falling Rising + */ + switch (_currentSetting->dataMode) { + case SPI_MODE0: + HW_SPI_init.CPHA = SSP_CPHA_FIRST; + HW_SPI_init.CPOL = SSP_CPOL_HI; + break; + case SPI_MODE1: + HW_SPI_init.CPHA = SSP_CPHA_SECOND; + HW_SPI_init.CPOL = SSP_CPOL_HI; + break; + case SPI_MODE2: + HW_SPI_init.CPHA = SSP_CPHA_FIRST; + HW_SPI_init.CPOL = SSP_CPOL_LO; + break; + case SPI_MODE3: + HW_SPI_init.CPHA = SSP_CPHA_SECOND; + HW_SPI_init.CPOL = SSP_CPOL_LO; + break; + default: + break; + } + + // TODO: handle bitOrder + SSP_Init(_currentSetting->spi_d, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers +} + +#if MISO_PIN == BOARD_SPI1_MISO_PIN + SPIClass SPI(1); +#elif MISO_PIN == BOARD_SPI2_MISO_PIN + SPIClass SPI(2); +#endif #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h index 7d4de40faa..b9bc0bf82e 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h @@ -21,6 +21,13 @@ */ #pragma once -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/LPC1768." +#if HAS_FSMC_TFT + #error "Sorry! FSMC TFT displays are not current available for HAL/LPC1768." +#endif + +// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT + #undef TOUCH_SCREEN + #undef TOUCH_SCREEN_CALIBRATION + #define HAS_TOUCH_XPT2046 1 #endif diff --git a/Marlin/src/HAL/LPC1768/include/SPI.h b/Marlin/src/HAL/LPC1768/include/SPI.h index 4acd9e7022..e2645b9290 100644 --- a/Marlin/src/HAL/LPC1768/include/SPI.h +++ b/Marlin/src/HAL/LPC1768/include/SPI.h @@ -24,25 +24,139 @@ #include "../../shared/HAL_SPI.h" #include +#include +#include -#define MSBFIRST 1 -#define SPI_MODE3 0 +//#define MSBFIRST 1 + +#define SPI_MODE0 0 +#define SPI_MODE1 1 +#define SPI_MODE2 2 +#define SPI_MODE3 3 + +#define DATA_SIZE_8BIT SSP_DATABIT_8 +#define DATA_SIZE_16BIT SSP_DATABIT_16 + +#define SPI_CLOCK_DIV2 8333333 //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED +#define SPI_CLOCK_DIV4 4166667 //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED +#define SPI_CLOCK_DIV8 2083333 //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED +#define SPI_CLOCK_DIV16 1000000 //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED +#define SPI_CLOCK_DIV32 500000 //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 +#define SPI_CLOCK_DIV64 250000 //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 +#define SPI_CLOCK_DIV128 125000 //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h + +#define SPI_CLOCK_MAX SPI_CLOCK_DIV2 + +#define BOARD_NR_SPI 2 + +//#define BOARD_SPI1_NSS_PIN PA4 ?! +#define BOARD_SPI1_SCK_PIN P0_15 +#define BOARD_SPI1_MISO_PIN P0_17 +#define BOARD_SPI1_MOSI_PIN P0_18 + +//#define BOARD_SPI2_NSS_PIN PB12 ?! +#define BOARD_SPI2_SCK_PIN P0_07 +#define BOARD_SPI2_MISO_PIN P0_08 +#define BOARD_SPI2_MOSI_PIN P0_09 class SPISettings { - public: - SPISettings(uint32_t speed, int, int) : spi_speed(speed) {}; - uint32_t spiRate() const { return spi_speed; } - private: - uint32_t spi_speed; +public: + SPISettings(uint32_t speed, int, int) : spi_speed(speed) {}; + SPISettings(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { + if (__builtin_constant_p(inClock)) + init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); + else + init_MightInline(inClock, inBitOrder, inDataMode, inDataSize); + } + SPISettings() { + init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); + } + + uint32_t spiRate() const { return spi_speed; } + +private: + void init_MightInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { + init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); + } + void init_AlwaysInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) __attribute__((__always_inline__)) { + clock = inClock; + bitOrder = inBitOrder; + dataMode = inDataMode; + dataSize = inDataSize; + } + + uint32_t spi_speed; + uint32_t clock; + uint32_t dataSize; + //uint32_t clockDivider; + uint8_t bitOrder; + uint8_t dataMode; + LPC_SSP_TypeDef *spi_d; + + friend class SPIClass; }; +/** + * @brief Wirish SPI interface. + * + * This is the same interface is available across HAL + * + * This implementation uses software slave management, so the caller + * is responsible for controlling the slave select line. + */ class SPIClass { - public: - void begin(); - void beginTransaction(const SPISettings&); - void endTransaction() {}; - uint8_t transfer(uint8_t data); - uint16_t transfer16(uint16_t data); +public: + /** + * @param spiPortNumber Number of the SPI port to manage. + */ + SPIClass(uint8_t spiPortNumber); + + /** + * Select and configure the current selected SPI device to use + */ + void begin(); + + /** + * Disable the current SPI device + */ + void end(); + + void beginTransaction(const SPISettings&); + void endTransaction() {}; + + // Transfer using 1 "Data Size" + uint8_t transfer(uint16_t data); + // Transfer 2 bytes in 8 bit mode + uint16_t transfer16(uint16_t data); + + void send(uint8_t data); + + uint16_t read(); + void read(uint8_t *buf, uint32_t len); + + void dmaSend(void *buf, uint16_t length, bool minc); + + /** + * @brief Sets the number of the SPI peripheral to be used by + * this HardwareSPI instance. + * + * @param spi_num Number of the SPI port. 1-2 in low density devices + * or 1-3 in high density devices. + */ + void setModule(uint8_t device); + + void setClock(uint32_t clock); + void setBitOrder(uint8_t bitOrder); + void setDataMode(uint8_t dataMode); + void setDataSize(uint32_t ds); + + inline uint32_t getDataSize() { return _currentSetting->dataSize; } + +private: + SPISettings _settings[BOARD_NR_SPI]; + SPISettings *_currentSetting; + + void updateSettings(); }; extern SPIClass SPI; diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp new file mode 100644 index 0000000000..84907acd07 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp @@ -0,0 +1,153 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT + +#include "tft_spi.h" + +//TFT_SPI tft; + +SPIClass TFT_SPI::SPIx(1); + +#define TFT_CS_H WRITE(TFT_CS_PIN, HIGH) +#define TFT_CS_L WRITE(TFT_CS_PIN, LOW) + +#define TFT_DC_H WRITE(TFT_DC_PIN, HIGH) +#define TFT_DC_L WRITE(TFT_DC_PIN, LOW) + +#define TFT_RST_H WRITE(TFT_RESET_PIN, HIGH) +#define TFT_RST_L WRITE(TFT_RESET_PIN, LOW) + +#define TFT_BLK_H WRITE(TFT_BACKLIGHT_PIN, HIGH) +#define TFT_BLK_L WRITE(TFT_BACKLIGHT_PIN, LOW) + +void TFT_SPI::Init() { + #if PIN_EXISTS(TFT_RESET) + SET_OUTPUT(TFT_RESET_PIN); + TFT_RST_H; + delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + SET_OUTPUT(TFT_BACKLIGHT_PIN); + TFT_BLK_H; + #endif + + SET_OUTPUT(TFT_DC_PIN); + SET_OUTPUT(TFT_CS_PIN); + + TFT_DC_H; + TFT_CS_H; + + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + #if 0 + #if SPI_DEVICE == 1 + #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 + #else + #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 + #endif + uint8_t clock; + uint8_t spiRate = SPI_FULL_SPEED; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX ; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + #endif + + #if TFT_MISO_PIN == BOARD_SPI1_MISO_PIN + SPIx.setModule(1); + #elif TFT_MISO_PIN == BOARD_SPI2_MISO_PIN + SPIx.setModule(2); + #endif + SPIx.setClock(SPI_CLOCK_MAX); + SPIx.setBitOrder(MSBFIRST); + SPIx.setDataMode(SPI_MODE0); +} + +void TFT_SPI::DataTransferBegin(uint16_t DataSize) { + SPIx.setDataSize(DataSize); + SPIx.begin(); + TFT_CS_L; +} + +uint32_t TFT_SPI::GetID() { + uint32_t id; + id = ReadID(LCD_READ_ID); + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + +uint32_t TFT_SPI::ReadID(uint16_t Reg) { + uint32_t data = 0; + + #if PIN_EXISTS(TFT_MISO) + uint8_t d = 0; + SPIx.setDataSize(DATASIZE_8BIT); + SPIx.setClock(SPI_CLOCK_DIV64); + SPIx.begin(); + TFT_CS_L; + WriteReg(Reg); + + LOOP_L_N(i, 4) { + SPIx.read((uint8_t*)&d, 1); + data = (data << 8) | d; + } + + DataTransferEnd(); + SPIx.setClock(SPI_CLOCK_MAX); + #endif + + return data >> 7; +} + +bool TFT_SPI::isBusy() { + return false; +} + +void TFT_SPI::Abort() { + DataTransferEnd(); +} + +void TFT_SPI::Transmit(uint16_t Data) { + SPIx.transfer(Data); +} + +void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + DataTransferBegin(DATASIZE_16BIT); //16 + TFT_DC_H; + SPIx.dmaSend(Data, Count, MemoryIncrease); + DataTransferEnd(); +} + +#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.h b/Marlin/src/HAL/LPC1768/tft/tft_spi.h new file mode 100644 index 0000000000..8d3e3127bb --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.h @@ -0,0 +1,77 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#include +#include +// #include + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#define DATASIZE_8BIT SSP_DATABIT_8 +#define DATASIZE_16BIT SSP_DATABIT_16 +#define TFT_IO TFT_SPI + +#define DMA_MINC_ENABLE 1 +#define DMA_MINC_DISABLE 0 + +class TFT_SPI { +private: + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + +public: + static SPIClass SPIx; + + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort(); + + static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT); + static void DataTransferEnd() { OUT_WRITE(TFT_CS_PIN, HIGH); SPIx.end(); }; + static void DataTransferAbort(); + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg) { OUT_WRITE(TFT_A0_PIN, LOW); Transmit(Reg); OUT_WRITE(TFT_A0_PIN, HIGH); } + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } + // static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + //LPC dma can only write 0xFFF bytes at once. + #define MAX_DMA_SIZE (0xFFF - 1) + while (Count > 0) { + TransmitDMA(DMA_MINC_DISABLE, &Data, Count > MAX_DMA_SIZE ? MAX_DMA_SIZE : Count); + Count = Count > MAX_DMA_SIZE ? Count - MAX_DMA_SIZE : 0; + } + #undef MAX_DMA_SIZE + } +}; diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp new file mode 100644 index 0000000000..c72e5f0eac --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046 + +#include "xpt2046.h" +#include + +uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include + + SPIClass XPT2046::SPIx(TOUCH_BUTTONS_HW_SPI_DEVICE); + + static void touch_spi_init(uint8_t spiRate) { + XPT2046::SPIx.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); + XPT2046::SPIx.setClock(SPI_CLOCK_DIV128); + XPT2046::SPIx.setBitOrder(MSBFIRST); + XPT2046::SPIx.setDataMode(SPI_MODE0); + XPT2046::SPIx.setDataSize(DATA_SIZE_8BIT); + } +#endif + +void XPT2046::Init() { + SET_INPUT(TOUCH_MISO_PIN); + SET_OUTPUT(TOUCH_MOSI_PIN); + SET_OUTPUT(TOUCH_SCK_PIN); + OUT_WRITE(TOUCH_CS_PIN, HIGH); + + #if PIN_EXISTS(TOUCH_INT) + // Optional Pendrive interrupt pin + SET_INPUT(TOUCH_INT_PIN); + #endif + + TERN_(TOUCH_BUTTONS_HW_SPI, touch_spi_init(SPI_SPEED_6)); + + // Read once to enable pendrive status pin + getRawData(XPT2046_X); +} + +bool XPT2046::isTouched() { + return isBusy() ? false : ( + #if PIN_EXISTS(TOUCH_INT) + READ(TOUCH_INT_PIN) != HIGH + #else + getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD + #endif + ); +} + +bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { + if (isBusy()) return false; + if (!isTouched()) return false; + *x = getRawData(XPT2046_X); + *y = getRawData(XPT2046_Y); + SERIAL_ECHOLNPAIR("X: ", *x, ", Y: ", *y); + return isTouched(); +} + +uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { + uint16_t data[3]; + + DataTransferBegin(); + TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.begin()); + + for (uint16_t i = 0; i < 3 ; i++) { + IO(coordinate); + data[i] = (IO() << 4) | (IO() >> 4); + } + + TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.end()); + DataTransferEnd(); + + uint16_t delta01 = delta(data[0], data[1]), + delta02 = delta(data[0], data[2]), + delta12 = delta(data[1], data[2]); + + if (delta01 > delta02 || delta01 > delta12) + data[delta02 > delta12 ? 0 : 1] = data[2]; + + return (data[0] + data[1]) >> 1; +} + +uint16_t XPT2046::IO(uint16_t data) { + return TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); +} + +extern uint8_t spiTransfer(uint8_t b); + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + uint16_t XPT2046::HardwareIO(uint16_t data) { + return SPIx.transfer(data & 0xFF); + } +#endif + +uint16_t XPT2046::SoftwareIO(uint16_t data) { + uint16_t result = 0; + + for (uint8_t j = 0x80; j; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); + if (READ(TOUCH_MISO_PIN)) result |= j; + WRITE(TOUCH_SCK_PIN, HIGH); + } + WRITE(TOUCH_SCK_PIN, LOW); + + return result; +} + +#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.h b/Marlin/src/HAL/LPC1768/tft/xpt2046.h new file mode 100644 index 0000000000..019f75efce --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.h @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include +#endif + +#ifndef TOUCH_MISO_PIN + #define TOUCH_MISO_PIN MISO_PIN +#endif +#ifndef TOUCH_MOSI_PIN + #define TOUCH_MOSI_PIN MOSI_PIN +#endif +#ifndef TOUCH_SCK_PIN + #define TOUCH_SCK_PIN SCK_PIN +#endif +#ifndef TOUCH_CS_PIN + #define TOUCH_CS_PIN CS_PIN +#endif +#ifndef TOUCH_INT_PIN + #define TOUCH_INT_PIN -1 +#endif + +#define XPT2046_DFR_MODE 0x00 +#define XPT2046_SER_MODE 0x04 +#define XPT2046_CONTROL 0x80 + +enum XPTCoordinate : uint8_t { + XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, +}; + +#if !defined(XPT2046_Z1_THRESHOLD) + #define XPT2046_Z1_THRESHOLD 10 +#endif + +class XPT2046 { +private: + static bool isBusy() { return false; } + + static uint16_t getRawData(const XPTCoordinate coordinate); + static bool isTouched(); + + static inline void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; + static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + static uint16_t HardwareIO(uint16_t data); + #endif + static uint16_t SoftwareIO(uint16_t data); + static uint16_t IO(uint16_t data = 0); + +public: + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + static SPIClass SPIx; + #endif + + static void Init(); + static bool getRawPoint(int16_t *x, int16_t *y); +}; diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index 455fc2388e..da7d4f6f1e 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -82,11 +82,6 @@ #define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn - #if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) - uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_TFT_FN u8g_com_stm32duino_tft_fn - #endif - #elif defined(TARGET_LPC1768) uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); @@ -117,6 +112,9 @@ #ifndef U8G_COM_SSD_I2C_HAL #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn #endif -#ifndef U8G_COM_HAL_TFT_FN +#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) + uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_TFT_FN u8g_com_hal_tft_fn +#else #define U8G_COM_HAL_TFT_FN u8g_com_null_fn #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index b8bfdb293a..39c294defe 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -760,7 +760,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT -uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { +uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { if (msgInitCount) { if (msg == U8G_COM_MSG_INIT) msgInitCount--; if (msgInitCount) return -1; @@ -801,7 +801,7 @@ uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void break; case U8G_COM_MSG_WRITE_SEQ: - tftio.DataTransferBegin(DATASIZE_8BIT); + tftio.DataTransferBegin(DATASIZE_16BIT); for (uint8_t i = 0; i < arg_val; i += 2) tftio.WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); tftio.DataTransferEnd(); diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 8fbf382be7..b32f99c68d 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -274,6 +274,38 @@ #define FORCE_SOFT_SPI #define LCD_BACKLIGHT_PIN -1 + #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI + #define SS_PIN -1 + //#define ONBOARD_SD_CS_PIN -1 + + #define TFT_CS_PIN P1_22 + #define TFT_A0_PIN P1_23 + #define TFT_DC_PIN P1_23 + #define TFT_MISO_PIN P0_17 + #define TFT_BACKLIGHT_PIN P1_18 + #define TFT_RESET_PIN P1_19 + + #define LPC_HW_SPI_DEV 0 + #define LCD_USE_DMA_SPI + + #define TOUCH_INT_PIN P1_21 + #define TOUCH_CS_PIN P1_20 + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 + #endif + + // SPI 1 + #define SCK_PIN P0_15 + #define MISO_PIN P0_17 + #define MOSI_PIN P0_18 + + // Disable any LCD related PINs config + #define LCD_PINS_ENABLE -1 + #define LCD_PINS_RS -1 + #else #define BTN_ENC P0_28 // (58) open-drain diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 3307cbde97..ac15a3c9ba 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -1421,3 +1421,22 @@ #if PIN_EXISTS(ESP_WIFI_MODULE_GPIO2) REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_GPIO2_PIN) #endif +// TFT PINS +#if PIN_EXISTS(TFT_CS) + REPORT_NAME_DIGITAL(__LINE__, TFT_CS_PIN) +#endif +#if PIN_EXISTS(TFT_A0) + REPORT_NAME_DIGITAL(__LINE__, TFT_A0_PIN) +#endif +#if PIN_EXISTS(TFT_DC) + REPORT_NAME_DIGITAL(__LINE__, TFT_DC_PIN) +#endif +#if PIN_EXISTS(TFT_MISO) + REPORT_NAME_DIGITAL(__LINE__, TFT_MISO_PIN) +#endif +#if PIN_EXISTS(TFT_BACKLIGHT) + REPORT_NAME_DIGITAL(__LINE__, TFT_BACKLIGHT_PIN) +#endif +#if PIN_EXISTS(TFT_RESET) + REPORT_NAME_DIGITAL(__LINE__, TFT_RESET_PIN) +#endif From 7769f19bf5cd42ec71d40cb01b63618268924d15 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 26 Aug 2020 22:14:54 +1200 Subject: [PATCH 0157/1370] Fix NEOPIXEL_STARTUP_TEST last delay (#19156) --- Marlin/src/feature/leds/neopixel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index ce2e4ee77b..12759302e6 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -89,6 +89,7 @@ void Marlin_NeoPixel::init() { set_color_startup(adaneo1.Color(0, 255, 0, 0)); // green safe_delay(500); set_color_startup(adaneo1.Color(0, 0, 255, 0)); // blue + safe_delay(500); #endif #ifdef NEOPIXEL_BKGD_LED_INDEX From f5e94cd7f1fcf380c6f286e1ae9183754937c794 Mon Sep 17 00:00:00 2001 From: thordarsen <50306469+thordarsen@users.noreply.github.com> Date: Wed, 26 Aug 2020 06:23:56 -0400 Subject: [PATCH 0158/1370] Fix SINGLENOZZLE fan speed bug (#19152) --- Marlin/src/module/temperature.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 813bcc061b..b162173bc6 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -210,9 +210,10 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, if (target < EXTRUDERS) singlenozzle_fan_speed[target] = speed; return; } - target = 0; // Always use fan index 0 with SINGLENOZZLE #endif + TERN_(SINGLENOZZLE, target = 0); // Always use fan index 0 with SINGLENOZZLE + if (target >= FAN_COUNT) return; fan_speed[target] = speed; From 8a24c33151525fc617db76fa5010cbd186d23082 Mon Sep 17 00:00:00 2001 From: George Fu Date: Thu, 27 Aug 2020 08:41:15 +0800 Subject: [PATCH 0159/1370] FYSETC S6 2.0 (#19140) --- Marlin/src/core/boards.h | 5 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 59 ++++++++++------ Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h | 67 +++++++++++++++++++ 4 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index cadbc71421..c880b3d325 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -345,8 +345,9 @@ #define BOARD_LERDGE_X 4215 // Lerdge X (STM32F407VE) #define BOARD_VAKE403D 4216 // VAkE 403D (STM32F446VET6) #define BOARD_FYSETC_S6 4217 // FYSETC S6 board -#define BOARD_FLYF407ZG 4218 // FLYF407ZG board (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4219 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_FYSETC_S6_V2_0 4218 // FYSETC S6 v2.0 board +#define BOARD_FLYF407ZG 4219 // FLYF407ZG board (STM32F407ZG) +#define BOARD_MKS_ROBIN2 4220 // MKS_ROBIN2 (STM32F407ZE) // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index f2aec72c46..22f6ea663c 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -606,6 +606,8 @@ #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG #elif MB(MKS_ROBIN2) #include "stm32f4/pins_MKS_ROBIN2.h" // STM32F4 env:MKS_ROBIN2 +#elif MB(FYSETC_S6_V2_0) + #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 // // ARM Cortex M7 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 116aa14cf1..9ffedc2ac4 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -28,7 +28,7 @@ #endif #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "FYSETC_S6" + #define BOARD_INFO_NAME "FYSETC S6" #endif #ifndef DEFAULT_MACHINE_NAME #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME @@ -82,7 +82,9 @@ // #define X_STEP_PIN PE11 #define X_DIR_PIN PE10 -#define X_ENABLE_PIN PE12 +#ifndef X_ENABLE_PIN + #define X_ENABLE_PIN PE12 +#endif #define X_CS_PIN PE7 #define Y_STEP_PIN PD8 @@ -118,23 +120,42 @@ // // Software serial // - #define X_SERIAL_TX_PIN PE9 - #define X_SERIAL_RX_PIN PE8 - - #define Y_SERIAL_TX_PIN PE14 - #define Y_SERIAL_RX_PIN PE13 - - #define Z_SERIAL_TX_PIN PD11 - #define Z_SERIAL_RX_PIN PD12 - - #define E0_SERIAL_TX_PIN PD3 - #define E0_SERIAL_RX_PIN PA15 - - #define E1_SERIAL_TX_PIN PC4 - #define E1_SERIAL_RX_PIN PC5 - - #define E2_SERIAL_TX_PIN PE1 - #define E2_SERIAL_RX_PIN PE0 + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN PE9 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN PE8 + #endif + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN PE14 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN PE13 + #endif + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN PD11 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN PD12 + #endif + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN PD3 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN PA15 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN PC4 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN PC5 + #endif + #ifndef E2_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN PE1 + #endif + #ifndef E2_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN PE0 + #endif #endif // diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h new file mode 100644 index 0000000000..6cd970501f --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define BOARD_INFO_NAME "FYSETC S6 2.0" + +// +// EEPROM Emulation +// +#if NO_EEPROM_SELECTED + #undef NO_EEPROM_SELECTED + //#define FLASH_EEPROM_EMULATION + //#define SRAM_EEPROM_EMULATION + #define I2C_EEPROM +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PE9 + +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN PE8 + #define Y_SERIAL_TX_PIN PC4 + #define Y_SERIAL_RX_PIN PC4 + #define Z_SERIAL_TX_PIN PD12 + #define E0_SERIAL_TX_PIN PA15 + #define E1_SERIAL_TX_PIN PC5 + #define E2_SERIAL_TX_PIN PE0 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#define TMC_USE_SW_SPI +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PE14 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PE13 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PE12 + #endif +#endif + +#include "pins_FYSETC_S6.h" From 9419331500605aea050534ca469f703a6fc31640 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 27 Aug 2020 13:29:07 -0300 Subject: [PATCH 0160/1370] One MARLIN_DEV_MODE warning per rebuild (#19163) --- Marlin/src/MarlinCore.cpp | 4 ++++ Marlin/src/inc/SanityCheck.h | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index a5fcfba6c0..e040c3b26c 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -30,6 +30,10 @@ #include "MarlinCore.h" +#if ENABLED(MARLIN_DEV_MODE) + #warning "WARNING! Disable MARLIN_DEV_MODE for the final build!" +#endif + #include "HAL/shared/Delay.h" #include "HAL/shared/esp_wifi.h" diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 932cccd9e9..b345147ed9 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -75,10 +75,6 @@ #endif #undef HEXIFY -#if ENABLED(MARLIN_DEV_MODE) - #warning "WARNING! Disable MARLIN_DEV_MODE for the final build!" -#endif - /** * Warnings for old configurations */ From fd1731a7b9b73e6809886864b6468b298c448a78 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 12:22:47 -0500 Subject: [PATCH 0161/1370] Allocate sufficient MSG_MOVE_Z_DIST buffer See #19158 --- Marlin/src/lcd/menu/menu_motion.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 027be4029d..77ab643cd6 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -195,11 +195,12 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - char tmp[20], numstr[10]; // Determine digits needed right of decimal - const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + constexpr uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + PGM_P const label = GET_TEXT(MSG_MOVE_Z_DIST); + char tmp[strlen_P(label) + 10 + 1], numstr[10]; + sprintf_P(tmp, label, dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); #if DISABLED(HAS_GRAPHICAL_TFT) extern const char NUL_STR[]; From a6829838c68bf0a8228971a091642484bbe65c06 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 14:01:36 -0500 Subject: [PATCH 0162/1370] =?UTF-8?q?Fix=20small=20typ=C3=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d1f94c51f0..44f14a8ee3 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1689,7 +1689,7 @@ * Select the language to display on the LCD. These languages are available: * * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it, - * jp_kana, ko_KR, nl, pl, pt, pt_br, ro ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ From d62933fba577b1cad7364e41ea1dfcfe96b33e71 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 14:01:56 -0500 Subject: [PATCH 0163/1370] Fix Creality V4 probe pin --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 9ee8aa7423..ded0ba405b 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -81,7 +81,7 @@ #define Y_STOP_PIN PA6 #define Z_STOP_PIN PA7 -#define Z_PROBE_PIN PB1 // BLTouch IN +#define Z_MIN_PROBE_PIN PB1 // BLTouch IN // // Filament Runout Sensor From 757ab484ac7e0ecb6124bccbb6afcbe95f65bb4d Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Thu, 27 Aug 2020 14:18:16 -0500 Subject: [PATCH 0164/1370] Independent Neopixel option (#19115) --- Marlin/Configuration.h | 13 ++++- Marlin/Configuration_adv.h | 9 ++++ Marlin/src/MarlinCore.cpp | 4 ++ Marlin/src/feature/leds/leds.cpp | 51 +++++++++++++++---- Marlin/src/feature/leds/leds.h | 45 +++++++++++++++-- Marlin/src/feature/leds/neopixel.cpp | 53 ++++++++++++++++++- Marlin/src/feature/leds/neopixel.h | 70 ++++++++++++++++++++------ Marlin/src/gcode/feature/leds/M150.cpp | 28 +++++++++-- Marlin/src/inc/Conditionals_LCD.h | 5 ++ Marlin/src/inc/Conditionals_adv.h | 22 ++++++++ Marlin/src/inc/SanityCheck.h | 5 ++ 11 files changed, 269 insertions(+), 36 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 44f14a8ee3..8cd2faf7f8 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2362,12 +2362,21 @@ #define NEOPIXEL_PIN 4 // LED driving pin //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE //#define NEOPIXEL2_PIN 5 - //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel - #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 NeoPixel strips are used + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.) #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup + // Support for second Adafruit NeoPixel LED driver controlled with M150 S1 ... + //#define NEOPIXEL2_SEPARATE + #if ENABLED(NEOPIXEL2_SEPARATE) + #define NEOPIXEL2_PIXELS 15 // Number of LEDs in the second strip + #define NEOPIXEL2_BRIGHTNESS 127 // Initial brightness (0-255) + #define NEOPIXEL2_STARTUP_TEST // Cycle through colors at startup + #else + //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel + #endif + // Use a single NeoPixel LED for static (background) lighting //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8df05e8a2c..e4b3fbf2ae 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1065,6 +1065,7 @@ //#define LED_CONTROL_MENU #if ENABLED(LED_CONTROL_MENU) #define LED_COLOR_PRESETS // Enable the Preset Color menu option + //#define NEO2_COLOR_PRESETS // Enable a second NeoPixel Preset Color menu option #if ENABLED(LED_COLOR_PRESETS) #define LED_USER_PRESET_RED 255 // User defined RED value #define LED_USER_PRESET_GREEN 128 // User defined GREEN value @@ -1073,6 +1074,14 @@ #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup #endif + #if ENABLED(NEO2_COLOR_PRESETS) + #define NEO2_USER_PRESET_RED 255 // User defined RED value + #define NEO2_USER_PRESET_GREEN 128 // User defined GREEN value + #define NEO2_USER_PRESET_BLUE 0 // User defined BLUE value + #define NEO2_USER_PRESET_WHITE 255 // User defined WHITE value + #define NEO2_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define NEO2_USER_PRESET_STARTUP // Have the printer display the user preset color on startup for the second strip + #endif #endif #endif // HAS_LCD_MENU diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e040c3b26c..e703eaf8d9 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -995,6 +995,10 @@ void setup() { SETUP_RUN(leds.setup()); #endif + #if ENABLED(NEOPIXEL2_SEPARATE) + SETUP_RUN(leds2.setup()); + #endif + #if ENABLED(USE_CONTROLLER_FAN) // Set up fan controller to initialize also the default configurations. SETUP_RUN(controllerFan.setup()); #endif diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index d1c0bfd5e1..01bca80926 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -44,11 +44,8 @@ #if ENABLED(LED_COLOR_PRESETS) const LEDColor LEDLights::defaultLEDColor = MakeLEDColor( - LED_USER_PRESET_RED, - LED_USER_PRESET_GREEN, - LED_USER_PRESET_BLUE, - LED_USER_PRESET_WHITE, - LED_USER_PRESET_BRIGHTNESS + LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, + LED_USER_PRESET_WHITE, LED_USER_PRESET_BRIGHTNESS ); #endif @@ -117,12 +114,13 @@ void LEDLights::set_color(const LEDColor &incol // This variant uses 3-4 separate pins for the RGB(W) components. // If the pins can do PWM then their intensity will be set. - #define UPDATE_RGBW(C,c) do { if (PWM_PIN(RGB_LED_##C##_PIN)) \ + #define UPDATE_RGBW(C,c) do { \ + if (PWM_PIN(RGB_LED_##C##_PIN)) \ analogWrite(pin_t(RGB_LED_##C##_PIN), incol.c); \ - else WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); }while(0) - UPDATE_RGBW(R,r); - UPDATE_RGBW(G,g); - UPDATE_RGBW(B,b); + else \ + WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); \ + }while(0) + UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b); #if ENABLED(RGBW_LED) UPDATE_RGBW(W,w); #endif @@ -158,4 +156,35 @@ void LEDLights::set_color(const LEDColor &incol #endif -#endif // HAS_COLOR_LEDS +#if ENABLED(NEOPIXEL2_SEPARATE) + + #if ENABLED(NEO2_COLOR_PRESETS) + const LEDColor LEDLights2::defaultLEDColor = MakeLEDColor( + NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, + NEO2_USER_PRESET_WHITE, NEO2_USER_PRESET_BRIGHTNESS + ); + #endif + + #if ENABLED(LED_CONTROL_MENU) + LEDColor LEDLights2::color; + bool LEDLights2::lights_on; + #endif + + LEDLights2 leds2; + + void LEDLights2::setup() { + neo2.init(); + TERN_(NEO2_USER_PRESET_STARTUP, set_default()); + } + + void LEDLights2::set_color(const LEDColor &incol) { + const uint32_t neocolor = LEDColorWhite() == incol + ? neo2.Color(NEO2_WHITE) + : neo2.Color(incol.r, incol.g, incol.b, incol.w); + neo2.set_brightness(incol.i); + neo2.set_color(neocolor); + } + +#endif // NEOPIXEL2_SEPARATE + +#endif // HAS_COLOR_LEDS diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index 1302f63c15..a13f960a3b 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -155,11 +155,9 @@ public: static inline void set_color(uint8_t r, uint8_t g, uint8_t b #if HAS_WHITE_LED , uint8_t w=0 - #if ENABLED(NEOPIXEL_LED) - , uint8_t i=NEOPIXEL_BRIGHTNESS - #endif #endif #if ENABLED(NEOPIXEL_LED) + , uint8_t i=NEOPIXEL_BRIGHTNESS , bool isSequence=false #endif ) { @@ -212,3 +210,44 @@ public: }; extern LEDLights leds; + +#if ENABLED(NEOPIXEL2_SEPARATE) + + class LEDLights2 { + public: + LEDLights2() {} + + static void setup(); // init() + + static void set_color(const LEDColor &color); + + inline void set_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w=0, uint8_t i=NEOPIXEL2_BRIGHTNESS) { + set_color(MakeLEDColor(r, g, b, w, i)); + } + + static inline void set_off() { set_color(LEDColorOff()); } + static inline void set_green() { set_color(LEDColorGreen()); } + static inline void set_white() { set_color(LEDColorWhite()); } + + #if ENABLED(NEO2_COLOR_PRESETS) + static const LEDColor defaultLEDColor; + static inline void set_default() { set_color(defaultLEDColor); } + static inline void set_red() { set_color(LEDColorRed()); } + static inline void set_orange() { set_color(LEDColorOrange()); } + static inline void set_yellow() { set_color(LEDColorYellow()); } + static inline void set_blue() { set_color(LEDColorBlue()); } + static inline void set_indigo() { set_color(LEDColorIndigo()); } + static inline void set_violet() { set_color(LEDColorViolet()); } + #endif + + #if ENABLED(LED_CONTROL_MENU) + static LEDColor color; // last non-off color + static bool lights_on; // the last set color was "on" + static void toggle(); // swap "off" with color + static inline void update() { set_color(color); } + #endif + }; + + extern LEDLights2 leds2; + +#endif // NEOPIXEL2_SEPARATE diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 12759302e6..27bbeb348c 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -30,7 +30,7 @@ #include "neopixel.h" -#if ENABLED(NEOPIXEL_STARTUP_TEST) +#if EITHER(NEOPIXEL_STARTUP_TEST, NEOPIXEL2_STARTUP_TEST) #include "../../core/utility.h" #endif @@ -38,7 +38,7 @@ Marlin_NeoPixel neo; int8_t Marlin_NeoPixel::neoindex; Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800) - #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #if CONJOINED_NEOPIXEL , Marlin_NeoPixel::adaneo2(NEOPIXEL_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE + NEO_KHZ800) #endif ; @@ -120,4 +120,53 @@ bool Marlin_NeoPixel::set_led_color(const uint8_t r, const uint8_t g, const uint } #endif +#if ENABLED(NEOPIXEL2_SEPARATE) + + Marlin_NeoPixel2 neo2; + + int8_t Marlin_NeoPixel2::neoindex; + Adafruit_NeoPixel Marlin_NeoPixel2::adaneo(NEOPIXEL2_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE); + + void Marlin_NeoPixel2::set_color(const uint32_t color) { + if (neoindex >= 0) { + set_pixel_color(neoindex, color); + neoindex = -1; + } + else { + for (uint16_t i = 0; i < pixels(); ++i) + set_pixel_color(i, color); + } + show(); + } + + void Marlin_NeoPixel2::set_color_startup(const uint32_t color) { + for (uint16_t i = 0; i < pixels(); ++i) + set_pixel_color(i, color); + show(); + } + + void Marlin_NeoPixel2::init() { + neoindex = -1; // -1 .. NEOPIXEL2_PIXELS-1 range + set_brightness(NEOPIXEL2_BRIGHTNESS); // 0 .. 255 range + begin(); + show(); // initialize to all off + + #if ENABLED(NEOPIXEL2_STARTUP_TEST) + set_color_startup(adaneo.Color(255, 0, 0, 0)); // red + safe_delay(500); + set_color_startup(adaneo.Color(0, 255, 0, 0)); // green + safe_delay(500); + set_color_startup(adaneo.Color(0, 0, 255, 0)); // blue + safe_delay(500); + #endif + + #if ENABLED(NEO2_USER_PRESET_STARTUP) + set_color(adaneo.Color(NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, NEO2_USER_PRESET_WHITE)); + #else + set_color(adaneo.Color(0, 0, 0, 0)); + #endif + } + +#endif // NEOPIXEL2_SEPARATE + #endif // NEOPIXEL_LED diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 0d9fdefc06..81a0a8b1c6 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -38,10 +38,14 @@ // Defines // ------------------------ -#if defined(NEOPIXEL2_TYPE) && NEOPIXEL2_TYPE != NEOPIXEL_TYPE +#if defined(NEOPIXEL2_TYPE) && NEOPIXEL2_TYPE != NEOPIXEL_TYPE && DISABLED(NEOPIXEL2_SEPARATE) #define MULTIPLE_NEOPIXEL_TYPES 1 #endif +#if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #define CONJOINED_NEOPIXEL 1 +#endif + #if NEOPIXEL_TYPE == NEO_RGB || NEOPIXEL_TYPE == NEO_RBG || NEOPIXEL_TYPE == NEO_GRB || NEOPIXEL_TYPE == NEO_GBR || NEOPIXEL_TYPE == NEO_BRG || NEOPIXEL_TYPE == NEO_BGR #define NEOPIXEL_IS_RGB 1 #else @@ -61,7 +65,7 @@ class Marlin_NeoPixel { private: static Adafruit_NeoPixel adaneo1 - #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #if CONJOINED_NEOPIXEL , adaneo2 #endif ; @@ -80,11 +84,7 @@ public: static inline void begin() { adaneo1.begin(); - #if ENABLED(NEOPIXEL2_INSERIES) - adaneo2.begin(); - #else - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.begin()); - #endif + TERN_(CONJOINED_NEOPIXEL, adaneo2.begin()); } static inline void set_pixel_color(const uint16_t n, const uint32_t c) { @@ -93,23 +93,21 @@ public: else adaneo1.setPixelColor(n, c); #else adaneo1.setPixelColor(n, c); - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setPixelColor(n, c)); + #if MULTIPLE_NEOPIXEL_TYPES + adaneo2.setPixelColor(n, c); + #endif #endif } static inline void set_brightness(const uint8_t b) { adaneo1.setBrightness(b); - #if ENABLED(NEOPIXEL2_INSERIES) - adaneo2.setBrightness(b); - #else - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setBrightness(b)); - #endif + TERN_(CONJOINED_NEOPIXEL, adaneo2.setBrightness(b)); } static inline void show() { adaneo1.show(); #if PIN_EXISTS(NEOPIXEL2) - #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #if CONJOINED_NEOPIXEL adaneo2.show(); #else adaneo1.setPin(NEOPIXEL2_PIN); @@ -132,3 +130,47 @@ public: }; extern Marlin_NeoPixel neo; + +// Neo pixel channel 2 +#if ENABLED(NEOPIXEL2_SEPARATE) + + #if NEOPIXEL2_TYPE == NEO_RGB || NEOPIXEL2_TYPE == NEO_RBG || NEOPIXEL2_TYPE == NEO_GRB || NEOPIXEL2_TYPE == NEO_GBR || NEOPIXEL2_TYPE == NEO_BRG || NEOPIXEL2_TYPE == NEO_BGR + #define NEOPIXEL2_IS_RGB 1 + #else + #define NEOPIXEL2_IS_RGBW 1 + #endif + + #if NEOPIXEL2_IS_RGB + #define NEO2_WHITE 255, 255, 255, 0 + #else + #define NEO2_WHITE 0, 0, 0, 255 + #endif + + class Marlin_NeoPixel2 { + private: + static Adafruit_NeoPixel adaneo; + + public: + static int8_t neoindex; + + static void init(); + static void set_color_startup(const uint32_t c); + + static void set_color(const uint32_t c); + + static inline void begin() { adaneo.begin(); } + static inline void set_pixel_color(const uint16_t n, const uint32_t c) { adaneo.setPixelColor(n, c); } + static inline void set_brightness(const uint8_t b) { adaneo.setBrightness(b); } + static inline void show() { adaneo.show(); } + + // Accessors + static inline uint16_t pixels() { return adaneo.numPixels();} + static inline uint8_t brightness() { return adaneo.getBrightness(); } + static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { + return adaneo.Color(r, g, b, w); + } + }; + + extern Marlin_NeoPixel2 neo2; + +#endif // NEOPIXEL2_SEPARATE diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index 83bd24c41c..cf09bf14ea 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -37,6 +37,9 @@ * With NEOPIXEL_LED: * I Set the NeoPixel index to affect. Default: All * + * With NEOPIXEL2_SEPARATE: + * S The NeoPixel strip to set. Default is index 0. + * * Examples: * * M150 R255 ; Turn LED red @@ -47,18 +50,35 @@ * M150 P127 ; Set LED 50% brightness * M150 P ; Set LED full brightness * M150 I1 R ; Set NEOPIXEL index 1 to red + * M150 S1 I1 R ; Set SEPARATE index 1 to red */ + void GcodeSuite::M150() { #if ENABLED(NEOPIXEL_LED) - neo.neoindex = parser.intval('I', -1); + const uint8_t index = parser.intval('I', -1); + #if ENABLED(NEOPIXEL2_SEPARATE) + const uint8_t unit = parser.intval('S'), + brightness = unit ? neo2.brightness() : neo.brightness(); + *(unit ? &neo2.neoindex : &neo.neoindex) = index; + #else + const uint8_t brightness = neo.brightness(); + neo.neoindex = index; + #endif #endif - leds.set_color(MakeLEDColor( + + const LEDColor color = MakeLEDColor( parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('U') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('B') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('W') ? (parser.has_value() ? parser.value_byte() : 255) : 0, - parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : neo.brightness() - )); + parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : brightness + ); + + #if ENABLED(NEOPIXEL2_SEPARATE) + if (unit == 1) { leds2.set_color(color); return; } + #endif + + leds.set_color(color); } #endif // HAS_COLOR_LEDS diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 112ff93a0e..bbe89b7c50 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -780,3 +780,8 @@ #ifndef EXTRUDE_MINTEMP #define EXTRUDE_MINTEMP 170 #endif + +// This flag indicates if Neopixel pins are shared or separated +#if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #define CONJOINED_NEOPIXEL 1 +#endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index fa4f0cd9b1..35542f9412 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -246,6 +246,28 @@ #endif #endif +#if BOTH(LED_CONTROL_MENU, NEOPIXEL2_SEPARATE) + #ifndef LED2_USER_PRESET_RED + #define LED2_USER_PRESET_RED 255 + #endif + #ifndef LED2_USER_PRESET_GREEN + #define LED2_USER_PRESET_GREEN 255 + #endif + #ifndef LED2_USER_PRESET_BLUE + #define LED2_USER_PRESET_BLUE 255 + #endif + #ifndef LED2_USER_PRESET_WHITE + #define LED2_USER_PRESET_WHITE 0 + #endif + #ifndef LED2_USER_PRESET_BRIGHTNESS + #ifdef NEOPIXEL2_BRIGHTNESS + #define LED2_USER_PRESET_BRIGHTNESS NEOPIXEL2_BRIGHTNESS + #else + #define LED2_USER_PRESET_BRIGHTNESS 255 + #endif + #endif +#endif + // If platform requires early initialization of watchdog to properly boot #if ENABLED(USE_WATCHDOG) && defined(ARDUINO_ARCH_SAM) #define EARLY_WATCHDOG 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b345147ed9..da5ddc1c2d 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2120,7 +2120,12 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if !(PIN_EXISTS(NEOPIXEL) && NEOPIXEL_PIXELS > 0) #error "NEOPIXEL_LED requires NEOPIXEL_PIN and NEOPIXEL_PIXELS." #endif + #elif ENABLED(NEOPIXEL2_SEPARATE) + #if !(PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) + #error "NEOPIXEL2 requires NEOPIXEL2_PIN and NEOPIXEL2_PIXELS." + #endif #endif + #undef _RGB_TEST #if DISABLED(NO_COMPILE_TIME_PWM) From d10f7eae31f1c4628611e1052085de6301c8369c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 14:48:42 -0500 Subject: [PATCH 0165/1370] set_axis_not_trusted => set_axis_never_homed --- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/module/motion.cpp | 8 ++++---- Marlin/src/module/motion.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 786065b346..7595067dbf 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -176,7 +176,7 @@ void GcodeSuite::G35() { probe.stow(); // After this operation the Z position needs correction - set_axis_not_trusted(Z_AXIS); + set_axis_never_homed(Z_AXIS); // Home Z after the alignment procedure process_subcommands_now_P(PSTR("G28Z")); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 3360dc050f..1fd0754ec7 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -346,7 +346,7 @@ void GcodeSuite::G34() { #if ENABLED(HOME_AFTER_G34) // After this operation the z position needs correction - set_axis_not_trusted(Z_AXIS); + set_axis_never_homed(Z_AXIS); // Home Z after the alignment procedure process_subcommands_now_P(PSTR("G28Z")); #else diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 9b8c1c60ff..c6378d67fc 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1431,15 +1431,15 @@ void set_axis_is_at_home(const AxisEnum axis) { } /** - * Set an axis' to be unhomed. + * Set an axis to be unhomed. */ -void set_axis_not_trusted(const AxisEnum axis) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_not_trusted(", axis_codes[axis], ")"); +void set_axis_never_homed(const AxisEnum axis) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); CBI(axis_known_position, axis); CBI(axis_homed, axis); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_not_trusted(", axis_codes[axis], ")"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); } diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 38ce980dae..1a0971d281 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -251,7 +251,7 @@ bool axis_unhomed_error(uint8_t axis_bits=0x07); void set_axis_is_at_home(const AxisEnum axis); -void set_axis_not_trusted(const AxisEnum axis); +void set_axis_never_homed(const AxisEnum axis); void homeaxis(const AxisEnum axis); From 7d2e4481c73ef427d424f696f59e746f904c0176 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Thu, 27 Aug 2020 23:05:53 +0200 Subject: [PATCH 0166/1370] Mark axes not-homed with HOME_AFTER_DEACTIVATE (#18907) --- Marlin/src/feature/babystep.cpp | 5 +++-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/gcode/bedlevel/G26.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/calibrate/G28.cpp | 6 +++--- Marlin/src/gcode/calibrate/G425.cpp | 2 +- Marlin/src/gcode/calibrate/M48.cpp | 2 +- Marlin/src/gcode/feature/camera/M240.cpp | 2 +- Marlin/src/gcode/feature/clean/G12.cpp | 2 +- Marlin/src/gcode/feature/pause/G27.cpp | 2 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 4 ++-- Marlin/src/gcode/geometry/M206_M428.cpp | 2 +- Marlin/src/gcode/motion/G0_G1.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/module/motion.cpp | 15 +++++++-------- Marlin/src/module/motion.h | 19 +++++++------------ Marlin/src/module/probe.cpp | 2 +- Marlin/src/module/stepper/indirection.h | 7 ++++--- Marlin/src/module/tool_change.cpp | 2 +- 20 files changed, 40 insertions(+), 44 deletions(-) diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp index 41d0a9cb1e..b076881461 100644 --- a/Marlin/src/feature/babystep.cpp +++ b/Marlin/src/feature/babystep.cpp @@ -26,7 +26,8 @@ #include "babystep.h" #include "../MarlinCore.h" -#include "../module/planner.h" +#include "../module/motion.h" // for axes_should_home() +#include "../module/planner.h" // for axis_steps_per_mm[] #include "../module/stepper.h" #if ENABLED(BABYSTEP_ALWAYS_AVAILABLE) @@ -54,7 +55,7 @@ void Babystep::add_mm(const AxisEnum axis, const float &mm) { } void Babystep::add_steps(const AxisEnum axis, const int16_t distance) { - if (DISABLED(BABYSTEP_WITHOUT_HOMING) && !TEST(axis_known_position, axis)) return; + if (DISABLED(BABYSTEP_WITHOUT_HOMING) && axes_should_home(_BV(axis))) return; accum += distance; // Count up babysteps for the UI steps[BS_AXIS_IND(axis)] += distance; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 69a66420f8..d13a8c3dc4 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -321,7 +321,7 @@ // Check for commands that require the printer to be homed if (may_move) { planner.synchronize(); - if (axes_need_homing()) gcode.home_all_axes(); + if (axes_should_home()) gcode.home_all_axes(); TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); } diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 2cb9c2df71..a7ed93425c 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -413,7 +413,7 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float unscaled_e_move(retract, PAUSE_PARK_RETRACT_FEEDRATE); // Park the nozzle by moving up by z_lift and then moving to (x_pos, y_pos) - if (!axes_need_homing()) + if (!axes_should_home()) nozzle.park(0, park_point); #if ENABLED(DUAL_X_CARRIAGE) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 2399f207bf..cd0dbb13cd 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -490,7 +490,7 @@ void GcodeSuite::G26() { // Don't allow Mesh Validation without homing first, // or if the parameter parsing did not go OK, abort - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; // Change the tool first, if specified if (parser.seenval('T')) tool_change(parser.value_int()); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index f25fe32b07..e7651cc743 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -183,7 +183,7 @@ G29_TYPE GcodeSuite::G29() { faux = ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) ? parser.boolval('C') : no_action; // Don't allow auto-leveling without homing first - if (axis_unhomed_error()) G29_RETURN(false); + if (homing_needed_error()) G29_RETURN(false); if (!no_action && planner.leveling_active && parser.boolval('O')) { // Auto-level only if needed if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> Auto-level not needed, skip"); diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 78695bc05b..0e1f707898 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -118,7 +118,7 @@ DEBUG_SECTION(log_G28, "home_z_safely", DEBUGGING(LEVELING)); // Disallow Z homing if X or Y homing is needed - if (axis_unhomed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return; + if (homing_needed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return; sync_plan_position(); @@ -299,8 +299,8 @@ void GcodeSuite::G28() { #else // NOT DELTA const bool homeZ = parser.seen('Z'), - needX = homeZ && TERN0(Z_SAFE_HOMING, axes_need_homing(_BV(X_AXIS))), - needY = homeZ && TERN0(Z_SAFE_HOMING, axes_need_homing(_BV(Y_AXIS))), + needX = homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(X_AXIS))), + needY = homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(Y_AXIS))), homeX = needX || parser.seen('X'), homeY = needY || parser.seen('Y'), home_all = homeX == homeY && homeX == homeZ, // All or None doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ; diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index 0ef23d28f9..746cb10876 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -584,7 +584,7 @@ void GcodeSuite::G425() { TEMPORARY_SOFT_ENDSTOP_STATE(false); TEMPORARY_BED_LEVELING_STATE(false); - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; measurements_t m; diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index fc9d22957b..aaf58eed1c 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -55,7 +55,7 @@ extern const char SP_Y_STR[]; void GcodeSuite::M48() { - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; const int8_t verbose_level = parser.byteval('V', 1); if (!WITHIN(verbose_level, 0, 4)) { diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp index 9664ce1522..fc350d8a55 100644 --- a/Marlin/src/gcode/feature/camera/M240.cpp +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -126,7 +126,7 @@ void GcodeSuite::M240() { #ifdef PHOTO_POSITION - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; const xyz_pos_t old_pos = { current_position.x + parser.linearval('A'), diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp index fc99cc5c1d..f91db39703 100644 --- a/Marlin/src/gcode/feature/clean/G12.cpp +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -45,7 +45,7 @@ */ void GcodeSuite::G12() { // Don't allow nozzle cleaning without homing first - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; #ifdef WIPE_SEQUENCE_COMMANDS if (!parser.seen_any()) { diff --git a/Marlin/src/gcode/feature/pause/G27.cpp b/Marlin/src/gcode/feature/pause/G27.cpp index ea6aadf173..3ce618d675 100644 --- a/Marlin/src/gcode/feature/pause/G27.cpp +++ b/Marlin/src/gcode/feature/pause/G27.cpp @@ -34,7 +34,7 @@ */ void GcodeSuite::G27() { // Don't allow nozzle parking without homing first - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; nozzle.park(parser.ushortval('P')); } diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index 7449787d78..a02f2368e2 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -61,7 +61,7 @@ void GcodeSuite::M701() { #if ENABLED(NO_MOTION_BEFORE_HOMING) // Don't raise Z if the machine isn't homed - if (axes_need_homing()) park_point.z = 0; + if (axes_should_home()) park_point.z = 0; #endif #if ENABLED(MIXING_EXTRUDER) @@ -149,7 +149,7 @@ void GcodeSuite::M702() { #if ENABLED(NO_MOTION_BEFORE_HOMING) // Don't raise Z if the machine isn't homed - if (axes_need_homing()) park_point.z = 0; + if (axes_should_home()) park_point.z = 0; #endif #if ENABLED(MIXING_EXTRUDER) diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index 2a007427a7..a477a1a526 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -61,7 +61,7 @@ void GcodeSuite::M206() { * Use M206 to set these values directly. */ void GcodeSuite::M428() { - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; xyz_float_t diff; LOOP_XYZ(i) { diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp index 3aa082c25e..b6ddf9634b 100644 --- a/Marlin/src/gcode/motion/G0_G1.cpp +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -52,7 +52,7 @@ void GcodeSuite::G0_G1( if (IsRunning() #if ENABLED(NO_MOTION_BEFORE_HOMING) - && !axis_unhomed_error( + && !homing_needed_error( (parser.seen('X') ? _BV(X_AXIS) : 0) | (parser.seen('Y') ? _BV(Y_AXIS) : 0) | (parser.seen('Z') ? _BV(Z_AXIS) : 0) ) diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 32fedce237..a77e9a7354 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -181,7 +181,7 @@ void menu_advanced_settings(); #if ENABLED(DUAL_X_CARRIAGE) void menu_idex() { - const bool need_g28 = !(TEST(axis_known_position, Y_AXIS) && TEST(axis_known_position, Z_AXIS)); + const bool need_g28 = axes_should_home(_BV(Y_AXIS)|_BV(Z_AXIS)); START_MENU(); BACK_ITEM(MSG_CONFIGURATION); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index c6378d67fc..401721140b 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1097,17 +1097,16 @@ void prepare_line_to_destination() { current_position = destination; } -uint8_t axes_need_homing(uint8_t axis_bits/*=0x07*/) { - #define HOMED_FLAGS TERN(HOME_AFTER_DEACTIVATE, axis_known_position, axis_homed) - // Clear test bits that are homed - if (TEST(axis_bits, X_AXIS) && TEST(HOMED_FLAGS, X_AXIS)) CBI(axis_bits, X_AXIS); - if (TEST(axis_bits, Y_AXIS) && TEST(HOMED_FLAGS, Y_AXIS)) CBI(axis_bits, Y_AXIS); - if (TEST(axis_bits, Z_AXIS) && TEST(HOMED_FLAGS, Z_AXIS)) CBI(axis_bits, Z_AXIS); +uint8_t axes_should_home(uint8_t axis_bits/*=0x07*/) { + // Clear test bits that are trusted + if (TEST(axis_bits, X_AXIS) && TEST(axis_homed, X_AXIS)) CBI(axis_bits, X_AXIS); + if (TEST(axis_bits, Y_AXIS) && TEST(axis_homed, Y_AXIS)) CBI(axis_bits, Y_AXIS); + if (TEST(axis_bits, Z_AXIS) && TEST(axis_homed, Z_AXIS)) CBI(axis_bits, Z_AXIS); return axis_bits; } -bool axis_unhomed_error(uint8_t axis_bits/*=0x07*/) { - if ((axis_bits = axes_need_homing(axis_bits))) { +bool homing_needed_error(uint8_t axis_bits/*=0x07*/) { + if ((axis_bits = axes_should_home(axis_bits))) { PGM_P home_first = GET_TEXT(MSG_HOME_FIRST); char msg[strlen_P(home_first)+1]; sprintf_P(msg, home_first, diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 1a0971d281..d71003906f 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -40,8 +40,7 @@ constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); FORCE_INLINE bool no_axes_homed() { return !axis_homed; } FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } -FORCE_INLINE void set_all_unhomed() { axis_homed = 0; } -FORCE_INLINE void set_all_unknown() { axis_known_position = 0; } +FORCE_INLINE void set_all_unhomed() { axis_homed = axis_known_position = 0; } FORCE_INLINE bool homing_needed() { return !TERN(HOME_AFTER_DEACTIVATE, all_axes_known, all_axes_homed)(); @@ -239,22 +238,18 @@ void do_z_clearance(const float &zclear, const bool z_known=true, const bool rai // // Homing // - -uint8_t axes_need_homing(uint8_t axis_bits=0x07); -bool axis_unhomed_error(uint8_t axis_bits=0x07); +void homeaxis(const AxisEnum axis); +void set_axis_is_at_home(const AxisEnum axis); +void set_axis_never_homed(const AxisEnum axis); +uint8_t axes_should_home(uint8_t axis_bits=0x07); +bool homing_needed_error(uint8_t axis_bits=0x07); #if ENABLED(NO_MOTION_BEFORE_HOMING) - #define MOTION_CONDITIONS (IsRunning() && !axis_unhomed_error()) + #define MOTION_CONDITIONS (IsRunning() && !homing_needed_error()) #else #define MOTION_CONDITIONS IsRunning() #endif -void set_axis_is_at_home(const AxisEnum axis); - -void set_axis_never_homed(const AxisEnum axis); - -void homeaxis(const AxisEnum axis); - /** * Workspace offsets */ diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 4fab4ec27b..12b617ec43 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -359,7 +359,7 @@ bool Probe::set_deployed(const bool deploy) { do_z_raise(_MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) - if (axis_unhomed_error(TERN_(Z_PROBE_SLED, _BV(X_AXIS)))) { + if (homing_needed_error(TERN_(Z_PROBE_SLED, _BV(X_AXIS)))) { SERIAL_ERROR_MSG(STR_STOP_UNHOMED); stop(); return true; diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index e9705cd3c3..ec0d63a89d 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -840,12 +840,13 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // // Axis steppers enable / disable macros // +#define FORGET_AXIS(A) TERN(HOME_AFTER_DEACTIVATE, set_axis_never_homed(A), CBI(axis_known_position, A)) #define ENABLE_AXIS_X() do{ ENABLE_STEPPER_X(); ENABLE_STEPPER_X2(); }while(0) -#define DISABLE_AXIS_X() do{ DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); CBI(axis_known_position, X_AXIS); }while(0) +#define DISABLE_AXIS_X() do{ DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); FORGET_AXIS(X_AXIS); }while(0) #define ENABLE_AXIS_Y() do{ ENABLE_STEPPER_Y(); ENABLE_STEPPER_Y2(); }while(0) -#define DISABLE_AXIS_Y() do{ DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); CBI(axis_known_position, Y_AXIS); }while(0) +#define DISABLE_AXIS_Y() do{ DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); FORGET_AXIS(Y_AXIS); }while(0) #define ENABLE_AXIS_Z() do{ ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); }while(0) @@ -854,7 +855,7 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #else #define Z_RESET() #endif -#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); CBI(axis_known_position, Z_AXIS); Z_RESET(); }while(0) +#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); FORGET_AXIS(Z_AXIS); Z_RESET(); }while(0) // // Extruder steppers enable / disable macros diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index d1017cea80..8557560266 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -174,7 +174,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a grabpos = mpe_settings.parking_xpos[new_tool] + (new_tool ? mpe_settings.grab_distance : -mpe_settings.grab_distance), offsetcompensation = TERN0(HAS_HOTEND_OFFSET, hotend_offset[active_extruder].x * mpe_settings.compensation_factor); - if (axis_unhomed_error(_BV(X_AXIS))) return; + if (homing_needed_error(_BV(X_AXIS))) return; /** * Z Lift and Nozzle Offset shift ar defined in caller method to work equal with any Multi Hotend realization From ee572856e9b2b5bd2b07bb5c079500959fdd4bf9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 16:38:02 -0500 Subject: [PATCH 0167/1370] Add set_all_homed --- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/module/motion.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 9a3eee31b5..06296dd215 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -365,7 +365,7 @@ void PrintJobRecovery::resume() { #endif // Pretend that all axes are homed - axis_homed = axis_known_position = xyz_bits; + set_all_homed(); // Recover volumetric extrusion state #if DISABLED(NO_VOLUMETRICS) diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index d71003906f..c3f2d9b779 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -40,6 +40,7 @@ constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); FORCE_INLINE bool no_axes_homed() { return !axis_homed; } FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } +FORCE_INLINE void set_all_homed() { axis_homed = axis_known_position = xyz_bits; } FORCE_INLINE void set_all_unhomed() { axis_homed = axis_known_position = 0; } FORCE_INLINE bool homing_needed() { From 414136f33afc431642e189f574c12e8ec23d9e28 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 1 Sep 2020 08:05:42 +1200 Subject: [PATCH 0168/1370] Fix 'cmd' array warning (#19193) --- Marlin/src/lcd/menu/menu_filament.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 316b2bc782..5d02d674aa 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -138,8 +138,9 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { SUBMENU_N_P(s, msg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, MenuItemBase::itemIndex); }); else { ACTION_ITEM_N_P(s, msg, []{ - char cmd[13]; - sprintf_P(cmd, PSTR("M600 B0 T%i"), int(MenuItemBase::itemIndex)); + PGM_P const cmdpstr = PSTR("M600 B0 T%i"); + char cmd[strlen_P(cmdpstr) + 3 + 1]; + sprintf_P(cmd, cmdpstr, int(MenuItemBase::itemIndex)); queue.inject(cmd); }); } From df7e35ccd7f40ff2999a45754fbc5e531ea7f528 Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Mon, 31 Aug 2020 16:06:24 -0500 Subject: [PATCH 0169/1370] Separate Neopixels followup (#19179) --- Marlin/src/feature/leds/neopixel.h | 9 ++++++--- Marlin/src/inc/Conditionals_LCD.h | 5 ----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 81a0a8b1c6..09a5cf8b39 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -110,7 +110,7 @@ public: #if CONJOINED_NEOPIXEL adaneo2.show(); #else - adaneo1.setPin(NEOPIXEL2_PIN); + TERN_(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); adaneo1.show(); adaneo1.setPin(NEOPIXEL_PIN); #endif @@ -133,7 +133,7 @@ extern Marlin_NeoPixel neo; // Neo pixel channel 2 #if ENABLED(NEOPIXEL2_SEPARATE) - + #if NEOPIXEL2_TYPE == NEO_RGB || NEOPIXEL2_TYPE == NEO_RBG || NEOPIXEL2_TYPE == NEO_GRB || NEOPIXEL2_TYPE == NEO_GBR || NEOPIXEL2_TYPE == NEO_BRG || NEOPIXEL2_TYPE == NEO_BGR #define NEOPIXEL2_IS_RGB 1 #else @@ -161,7 +161,10 @@ extern Marlin_NeoPixel neo; static inline void begin() { adaneo.begin(); } static inline void set_pixel_color(const uint16_t n, const uint32_t c) { adaneo.setPixelColor(n, c); } static inline void set_brightness(const uint8_t b) { adaneo.setBrightness(b); } - static inline void show() { adaneo.show(); } + static inline void show() { + adaneo.show(); + adaneo.setPin(NEOPIXEL2_PIN); + } // Accessors static inline uint16_t pixels() { return adaneo.numPixels();} diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index bbe89b7c50..112ff93a0e 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -780,8 +780,3 @@ #ifndef EXTRUDE_MINTEMP #define EXTRUDE_MINTEMP 170 #endif - -// This flag indicates if Neopixel pins are shared or separated -#if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) - #define CONJOINED_NEOPIXEL 1 -#endif From 7967590682602a8a878a9374a2e1b6fddee8cbd5 Mon Sep 17 00:00:00 2001 From: Martin <34376785+G4Cab@users.noreply.github.com> Date: Tue, 1 Sep 2020 01:56:58 +0200 Subject: [PATCH 0170/1370] Permit touch params override w/ Robin nano (#19196) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 2c1d016f8c..d54a794616 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -194,10 +194,18 @@ // LVGL Configs #if ENABLED(TFT_LVGL_UI_FSMC) - #define XPT2046_X_CALIBRATION 17880 - #define XPT2046_Y_CALIBRATION -12234 - #define XPT2046_X_OFFSET -45 - #define XPT2046_Y_OFFSET 349 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 17880 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -12234 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -45 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 349 + #endif // Emulated DOGM Configs #elif ENABLED(FSMC_GRAPHICAL_TFT) @@ -244,10 +252,18 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define XPT2046_X_CALIBRATION -12246 - #define XPT2046_Y_CALIBRATION 9453 - #define XPT2046_X_OFFSET 360 - #define XPT2046_Y_OFFSET -22 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12246 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 9453 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 360 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -22 + #endif #define TOUCH_CS_PIN PA7 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK @@ -265,11 +281,19 @@ #define ILI9341_COLOR_RGB #elif ENABLED(TFT_480x320) - #define XPT2046_X_CALIBRATION 17880 - #define XPT2046_Y_CALIBRATION -12234 - #define XPT2046_X_OFFSET -45 - #define XPT2046_Y_OFFSET 349 - + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 17880 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -12234 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -45 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 349 + #endif + #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV From 0c85e2838c54642b15a4ebc40d454f1fcca8be0f Mon Sep 17 00:00:00 2001 From: Ludy Date: Tue, 1 Sep 2020 05:23:28 +0200 Subject: [PATCH 0171/1370] Update German, fix Mix component index (#19206) --- Marlin/src/lcd/language/language_cz.h | 2 +- Marlin/src/lcd/language/language_de.h | 86 ++++++++++++++++++++++++--- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- 6 files changed, 84 insertions(+), 12 deletions(-) diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index c21cacddc8..aea831a36d 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -527,7 +527,7 @@ namespace Language_cz { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("VytáhnÄ›te, kliknÄ›te"); PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponenta ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponenta ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("PÅ™echod"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Celý pÅ™echod"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index ebd0805037..90a8ed4bdc 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -33,10 +33,10 @@ namespace Language_de { using namespace Language_en; // Inherit undefined strings from English constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Deutsche"); + PROGMEM Language_Str LANGUAGE = _UxGT("Deutsch"); PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" bereit"); - + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); PROGMEM Language_Str MSG_YES = _UxGT("JA"); PROGMEM Language_Str MSG_NO = _UxGT("NEIN"); PROGMEM Language_Str MSG_BACK = _UxGT("Zurück"); @@ -44,9 +44,11 @@ namespace Language_de { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Medium erkannt"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Medium entfernt"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Warten auf Medium"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD Init fehlgesch."); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Medium Lesefehler"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB Gerät entfernt"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB Start fehlge."); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall überschritten"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopp"); // Max length 8 characters PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Software-Endstopp"); PROGMEM Language_Str MSG_MAIN = _UxGT("Hauptmenü"); @@ -56,7 +58,13 @@ namespace Language_de { PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren deaktivieren"); // M84 :: Max length 19 characters PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug-Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Statusbalken-Test"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Z-Achsen ausgleichen"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Bett ausrichten"); // Bettausrichtung + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ homen"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klick zum Starten"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Nächste Koordinate"); PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivellieren fertig!"); @@ -110,9 +118,9 @@ namespace Language_de { PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z-Wert"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Benutzer-Menü"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Berührungspunkt"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Sondentest"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punkt"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Zu weit draußen"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Abweichung"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX-Modus"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Werkzeugversätze"); @@ -126,6 +134,7 @@ namespace Language_de { PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 ausführen"); PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL-Werkzeuge"); PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Berührungspunkt"); PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Netz manuell erst."); PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Unterlegen & messen"); PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Messen"); @@ -154,6 +163,7 @@ namespace Language_de { PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Eig. Netz validieren"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 heizt Bett"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Düse aufheizen"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manuell Prime..."); PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Feste Länge Prime"); PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Priming fertig"); PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 abgebrochen"); @@ -234,6 +244,7 @@ namespace Language_de { PROGMEM Language_Str MSG_NOZZLE = _UxGT("Düse"); PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Düse ~"); PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Düse geparkt"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Düse bereit"); PROGMEM Language_Str MSG_BED = _UxGT("Bett"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Gehäuse"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Lüfter"); @@ -255,6 +266,22 @@ namespace Language_de { PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto Temperatur"); PROGMEM Language_Str MSG_LCD_ON = _UxGT("an"); PROGMEM Language_Str MSG_LCD_OFF = _UxGT("aus"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID Tuning fertig"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune fehlge. Falscher Extruder"); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune fehlge. Temperatur zu hoch."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autotune fehlge.! Timeout."); + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); + PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); + PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Auswählen"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Auswählen *"); PROGMEM Language_Str MSG_ACC = _UxGT("Beschleunigung"); @@ -281,6 +308,8 @@ namespace Language_de { PROGMEM Language_Str MSG_AMAX_EN = _UxGT("A max *"); PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A Einzug"); PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A Leerfahrt"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("max. Frequenz"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("min. Vorschub"); PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" Steps/mm"); PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" Steps/mm"); @@ -291,6 +320,8 @@ namespace Language_de { PROGMEM Language_Str MSG_MOTION = _UxGT("Bewegung"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filamentdurchmesser"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Filamentdurchmesser *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Entladen mm"); @@ -302,6 +333,9 @@ namespace Language_de { PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Konfig. laden"); PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Standardwerte laden"); PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Werkseinstellungen"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Fehler"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Fehler"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Fehler"); PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Einstell. gespei."); PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("FW Update vom Medium"); PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Drucker neustarten"); @@ -309,19 +343,26 @@ namespace Language_de { PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Vorbereitung"); PROGMEM Language_Str MSG_TUNE = _UxGT("Justierung"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Power Monitor"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Strom"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Spannung"); + PROGMEM Language_Str MSG_POWER = _UxGT("Power"); PROGMEM Language_Str MSG_START_PRINT = _UxGT("Starte Druck"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Weiter"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Bestätigen"); PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Drucken"); PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reseten"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignorieren"); PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Abbrechen"); PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Fertig"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Zurück"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Weiter"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Pause..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("SD-Druck pausieren"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("SD-Druck fortsetzen"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("SD-Druck abbrechen"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objekt drucken"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objekt abbrechen"); PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objekt abbrechen ="); PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Wiederh. n. Stroma."); @@ -346,12 +387,22 @@ namespace Language_de { PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Autom. Einzug"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Einzugslänge"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Einzug"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Entladelänge"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Werkzeugwechsel"); PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z anheben"); PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime-Geschwin."); PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Einzug-Geschwin."); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Düsen-Standby"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Kopf parken"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Rückzugsgeschwindigkeit"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Lüfter Geschwindigkeit"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Lüfter Zeit"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto AN"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto AUS"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Werkzeugmigration"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-Migration"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Letzter Extruder"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrieren zu *"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Filament wechseln"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Filament wechseln *"); PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Filament laden"); @@ -367,6 +418,7 @@ namespace Language_de { PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Selbsttest"); PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Zurücksetzen"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Einfahren"); PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Ausfahren"); PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Modus"); PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Modus"); @@ -374,7 +426,6 @@ namespace Language_de { PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Setze auf 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Setze auf OD"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Einfahren"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Modus: "); PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ACHTUNG: Falsche Einstellung - kann zu Beschädigung führen! Fortfahren?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); @@ -443,6 +494,9 @@ namespace Language_de { PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruder"); PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudrate"); PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: AUS"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: AN"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout"); PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Beleuchtung"); PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Helligkeit"); @@ -508,7 +562,7 @@ namespace Language_de { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Entfernen, klicken"); PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponente ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponente ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); // equal Farbverlauf PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Volle Gradient"); @@ -531,6 +585,20 @@ namespace Language_de { PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("ungült. Seitenzahl"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ungült. Seitengeschw."); + + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Passwort bearbeiten"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login erforderlich"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Passwort Einstellungen"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("PIN eingeben"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Passwort ändern"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Passwort löschen"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Passwort ist "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("von vorn beginnen"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Bald speichern!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Passwort gelöscht"); + // // Die Filament-Change-Bildschirme können bis zu 3 Zeilen auf einem 4-Zeilen-Display anzeigen // ...oder 2 Zeilen auf einem 3-Zeilen-Display. @@ -576,7 +644,11 @@ namespace Language_de { PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Glätten"); PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Achse leveln"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto. Kalibiren"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heizung Timeout"); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Idle Timeout, Temperatur fällt. Drücke Okay, um erneut aufzuheizen und fortzufahren."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heizungs Timeout"); + #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("Erneut aufheizen"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Erneut aufhei. ..."); } diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index d403477eb0..0042a30f8e 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -508,7 +508,7 @@ namespace Language_fr { PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Réinit. MMU..."); PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Retrait, click"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Composante ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Composante ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixeur"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Dégradé"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Dégradé complet"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 43765d7c3a..930adf3a87 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -561,7 +561,7 @@ namespace Language_it { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Rimuovi, click"); PROGMEM Language_Str MSG_MIX = _UxGT("Miscela"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Componente ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Componente ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Miscelatore"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradiente"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Gradiente pieno"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 79190ddfcb..8e0d0904e4 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -500,7 +500,7 @@ namespace Language_pl { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("UsuÅ„, kliknij"); PROGMEM Language_Str MSG_MIX = _UxGT("Miks"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponent ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponent ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mikser"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("PeÅ‚ny gradient"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 736e2069d9..4f54ba96ae 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -551,7 +551,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Odstráňte, kliknite"); PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Plný gradient"); From 2212bf85b7550faa81deefd1e2a8a7ff943fcba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane?= <43587190+stef-ladefense@users.noreply.github.com> Date: Tue, 1 Sep 2020 05:27:42 +0200 Subject: [PATCH 0172/1370] Fix Anycubic I3 Mega (S) original screen % display (#19210) --- .../lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 1c9b9299fc..1de962826a 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -28,6 +28,7 @@ #include "../../../../inc/MarlinConfig.h" #include "../../ui_api.h" #include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage // command sending macro's with debugging capability #define SEND_PGM(x) send_P(PSTR(x)) @@ -412,6 +413,7 @@ void AnycubicTFTClass::RenderCurrentFileList() { uint16_t selectedNumber = 0; SelectedDirectory[0] = 0; SelectedFile[0] = 0; + ExtUI::FileList currentFileList; SENDLINE_PGM("FN "); // Filelist start @@ -427,7 +429,7 @@ void AnycubicTFTClass::RenderCurrentFileList() { if (SpecialMenu) RenderSpecialMenu(selectedNumber); - else + else if (selectedNumber <= currentFileList.count()) RenderCurrentFolder(selectedNumber); } SENDLINE_PGM("END"); // Filelist stop @@ -804,7 +806,6 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 20: { // A20 read printing speed - int16_t feedrate_percentage = 100; if (CodeSeen('S')) feedrate_percentage = constrain(CodeValue(), 40, 999); From 881bb7bf0a9f36f9c8a5ba0c5e75db7b086ec4d1 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 1 Sep 2020 23:59:29 +0200 Subject: [PATCH 0173/1370] Delete old LCD strings (#19227) --- Marlin/src/lcd/language/language_cz.h | 2 -- Marlin/src/lcd/language/language_de.h | 2 -- Marlin/src/lcd/language/language_en.h | 2 -- Marlin/src/lcd/language/language_es.h | 2 -- Marlin/src/lcd/language/language_gl.h | 2 -- Marlin/src/lcd/language/language_hu.h | 2 -- Marlin/src/lcd/language/language_it.h | 4 +--- Marlin/src/lcd/language/language_pl.h | 2 -- Marlin/src/lcd/language/language_pt_br.h | 2 -- Marlin/src/lcd/language/language_ro.h | 2 -- Marlin/src/lcd/language/language_ru.h | 2 -- Marlin/src/lcd/language/language_sk.h | 2 -- Marlin/src/lcd/language/language_tr.h | 2 -- Marlin/src/lcd/language/language_uk.h | 2 -- Marlin/src/lcd/language/language_vi.h | 1 - Marlin/src/lcd/language/language_zh_CN.h | 2 -- Marlin/src/lcd/language/language_zh_TW.h | 2 -- 17 files changed, 1 insertion(+), 34 deletions(-) diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index aea831a36d..069a8e5a55 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -404,8 +404,6 @@ namespace Language_cz { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkem"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop abort"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba zahřívání"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Chyba zahÅ™.podl."); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chyba zahÅ™.komory"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEPLOTA"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNà ÚNIK"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPL. ÚNIK PODL."); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 90a8ed4bdc..84b304c242 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -446,8 +446,6 @@ namespace Language_de { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abbr. mit Endstopp"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("HEIZEN ERFOLGLOS"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bett heizen fehlge."); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Geh. heizen fehlge."); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEMP-ABWEI."); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BETT") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index fde21f2bba..39bb85d378 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -447,8 +447,6 @@ namespace Language_en { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bed Heating Failed"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chamber Heating Fail"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 2b10bfe313..5beab6c1c9 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -415,8 +415,6 @@ namespace Language_es { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Calent. fallido"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Calent. cama fallido"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Calent. Cám. fallido"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP. REDUN."); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 4415fc5e1c..90e4129abd 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -437,8 +437,6 @@ namespace Language_gl { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Erro FinCarro"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fallo Quentando"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Fallo Quent. Cama"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Fallo Quent. Cámara"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 182ed27072..64ea482249 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -439,8 +439,6 @@ namespace Language_hu { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Teljes"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Végállás megszakítva!"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fütés hiba!"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Ãgy fütés hiba!"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Kamra fütés hiba!"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hiba: SZÃœKSÉGTELEN HÖFOK"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÃœTÉS KIMARADÃS"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÃGY FÃœTÉS KIMARADÃS"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 930adf3a87..0a56fdf5ec 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -445,9 +445,7 @@ namespace Language_it { PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Totali"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Finecorsa annullati"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Riscald. Fallito"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Risc. piatto fallito"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Risc. camera fallito"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Risc.Fallito"); // Max 12 caratteri PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP RIDONDANTE"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEMP FUORI CONTROLLO"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEMP PIAT.FUORI CTRL"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 8e0d0904e4..17ca0bd00f 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -385,8 +385,6 @@ namespace Language_pl { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("ÅÄ…cznie"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("BÅ‚Ä…d kraÅ„cówki"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Rozgrz. nieudane"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Rozgrz. stoÅ‚u nieudane"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Rozgrz. komory nieudane"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("BÅ‚Ä…d temperatury"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ZANIK TEMPERATURY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ZANIK TEMP. STOÅU"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index e0a52fc390..2c6c2af148 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -351,8 +351,6 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abortar Fim de Curso"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Aquecer mesa falhou"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Aquecer câmara falhou"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ESCAPE TÉRMICO"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ESCAPE TÉRMICO MESA"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 39e5cb9e2c..dc55911176 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -442,8 +442,6 @@ namespace Language_ro { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bed Heating Failed"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chamber Heating Fail"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 6228e92346..e1abfa5429 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -530,8 +530,6 @@ namespace Language_ru { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Сработал концевик"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Разогрев не удалÑÑ"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Сбой нагрева Ñтола"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Сбой нагрева камеры"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Ошибка:Ð˜Ð·Ð±Ñ‹Ñ‚Ð¾Ñ‡Ð½Ð°Ñ Ð¢"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("УТЕЧКРТЕПЛÐ"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("УТЕЧКРТЕПЛРСТОЛÐ"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 4f54ba96ae..71949014b7 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -435,8 +435,6 @@ namespace Language_sk { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkom"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Zastavenie Endstop"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba ohrevu"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Chyba ohrevu podl."); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chyba ohrevu komory"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Chyba: REDUND. TEP."); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNà SKOK"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPLOTNà SKOK PODL."); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index bb68a61717..c0ce4bfdc5 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -414,8 +414,6 @@ namespace Language_tr { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Toplam"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop iptal"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Isınma baÅŸarısız"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Yatak Isınma BaÅŸrsız"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Oda Isıtma Hatası"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hata: Sıcaklık Aşımı"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TERMAL PROBLEM"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TABLA TERMAL PROBLEM"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 686657246f..30d45338d9 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -524,8 +524,6 @@ namespace Language_uk { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Кінцевик Ñпрацював"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Збій нагріву"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Збій нагріву Ñтолу"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Збій нагріву камери"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("ЗÐВИЩЕÐРТ") LCD_STR_DEGREE; PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ВИТІК ТЕПЛÐ"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ВИТІК ТЕПЛРСТОЛУ"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 227a4950f3..02453e5879 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -330,7 +330,6 @@ namespace Language_vi { PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Nhít Z"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Hủy bá» công tắc"); // Endstop abort PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Sưởi đầu phun không thành công"); // Heating failed - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Sưởi bàn không thành công"); // Bed heating failed PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Äiều sai: nhiệt Ä‘á»™ dÆ°"); // Err: REDUNDANT TEMP PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Vấn Ä‘á» nhiệt"); // THERMAL RUNAWAY | problem PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("Vấn Ä‘á» nhiệt bàn"); // BED THERMAL RUNAWAY diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index cf772caaef..49d7acd94c 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -441,8 +441,6 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("总计"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("挡å—终止"); //"Endstop abort" PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("加热失败"); //"Heating failed" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("热床加热失败"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("机箱加热失败"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("错误:冗余温度"); //"Err: REDUNDANT TEMP" PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("温控失控"); //"THERMAL RUNAWAY" PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("热床热é‡å¤±æŽ§"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 94a7944b35..ac54358534 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -382,8 +382,6 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("總計"); //"Total" PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("擋塊終止"); //"Endstop abort" PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("加熱失敗"); //"Heating failed" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("熱床加熱失敗"); //"Bed Heating Failed" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("機箱加熱失敗"); //"Chamber Heating Fail" PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("錯誤:冗餘溫度"); //"Err: REDUNDANT TEMP" PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("溫度失控"); //"THERMAL RUNAWAY" PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("熱床溫度失控"); //"BED THERMAL RUNAWAY" From c7335bcd4d0a83cfe74a2ae601a6c19aeb056e30 Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Tue, 1 Sep 2020 17:03:28 -0500 Subject: [PATCH 0174/1370] Separate Neopixel followup (#19224) --- Marlin/src/feature/leds/neopixel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 09a5cf8b39..f8300c4d98 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -110,7 +110,7 @@ public: #if CONJOINED_NEOPIXEL adaneo2.show(); #else - TERN_(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); + TERN_(NEOPIXEL2_SEPARATE,adaneo1.setPin(NEOPIXEL2_PIN)); adaneo1.show(); adaneo1.setPin(NEOPIXEL_PIN); #endif From 755a4440e7d50ea7c35f64289355d21d3316db60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane?= <43587190+stef-ladefense@users.noreply.github.com> Date: Wed, 2 Sep 2020 00:05:52 +0200 Subject: [PATCH 0175/1370] Fix Anycubic LCDs / Trigorilla 1.4 pins (#19220) --- Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index 708f8fa26c..412aa22902 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -64,7 +64,7 @@ #elif TEMP_SENSOR_BED // EFB (Anycubic Kossel default) #define RAMPS_D9_PIN TG_FAN0_PIN - #if ENABLED(ANYCUBIC_CHIRON) + #if ENABLED(ANYCUBIC_LCD_CHIRON) #define RAMPS_D8_PIN TG_HEATER_1_PIN // Heated bed is connected to HEATER1 output #else #define RAMPS_D8_PIN TG_HEATER_BED_PIN @@ -84,7 +84,7 @@ #define E0_AUTO_FAN_PIN TG_FAN2_PIN // Used in Anycubic Kossel example config #endif -#if ENABLED(ANYCUBIC_I3MEGA) +#if ENABLED(ANYCUBIC_LCD_I3MEGA) #define CONTROLLER_FAN_PIN TG_FAN1_PIN #endif @@ -105,14 +105,14 @@ #if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) #define X_MAX_PIN 43 #define Y_STOP_PIN 19 -#elif EITHER(ANYCUBIC_CHIRON, ANYCUBIC_I3MEGA) +#elif EITHER(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_I3MEGA) #define Y_STOP_PIN 42 #define Z2_MIN_PIN 43 #ifndef Z_MIN_PROBE_PIN #define Z_MIN_PROBE_PIN 2 #endif #ifndef FIL_RUNOUT_PIN - #if ENABLED(ANYCUBIC_CHIRON) + #if ENABLED(ANYCUBIC_LCD_CHIRON) #define FIL_RUNOUT_PIN 33 #else #define FIL_RUNOUT_PIN 19 From 919ea2a76d9d454e91a1b552953b3a6ce4bf33af Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 1 Sep 2020 19:09:28 -0300 Subject: [PATCH 0176/1370] Fail SD mount without SPI re-init (#19226) --- Marlin/src/sd/cardreader.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 29f9672e92..32bdc73bcd 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -140,7 +140,7 @@ CardReader::CardReader() { #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) SET_INPUT_PULLUP(SD_DETECT_PIN); #endif - + #if PIN_EXISTS(SDPOWER) OUT_WRITE(SDPOWER_PIN, HIGH); // Power the SD reader #endif @@ -383,10 +383,9 @@ void CardReader::mount() { if (flag.mounted) cdroot(); - else { - spiInit(SPI_SPEED); // Return to base SPI speed + else if (marlin_state != MF_INITIALIZING) ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); - } + ui.refresh(); } From edba363d54c601dfe4d607f8fe71911ff338f891 Mon Sep 17 00:00:00 2001 From: makerbase <4164049@qq.com> Date: Wed, 2 Sep 2020 07:20:16 +0800 Subject: [PATCH 0177/1370] MKS SGEN L V2 (#18822) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 357 +++++++++++++++++++ Marlin/src/pins/pins.h | 2 + 3 files changed, 360 insertions(+) create mode 100644 Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index c880b3d325..e280d955b8 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -235,6 +235,7 @@ #define BOARD_SMOOTHIEBOARD 2506 // Smoothieboard #define BOARD_TH3D_EZBOARD 2507 // TH3D EZBoard v1.0 #define BOARD_BTT_SKR_V1_4_TURBO 2508 // BigTreeTech SKR v1.4 TURBO (Power outputs: Hotend0, Hotend1, Fan, Bed) +#define BOARD_MKS_SGEN_L_V2 2509 // MKS SGEN_L V2 (Power outputs: Hotend0, Hotend1, Bed, Fan) // // SAM3X8E ARM Cortex M3 diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h new file mode 100644 index 0000000000..d112cc5d50 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -0,0 +1,357 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * MKS SGen pin assignments + */ + +#ifndef MCU_LPC1769 + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "MKS SGEN_L V2" +#define BOARD_WEBSITE_URL "github.com/makerbase-mks" + +// +// EEPROM, MKS SGEN_L V2.0 hardware has 4K EEPROM on the board +// +#if NO_EEPROM_SELECTED + //#define SDCARD_EEPROM_EMULATION + //#define I2C_EEPROM // AT24C32 + #define FLASH_EEPROM_EMULATION + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// +// Servos +// +#define SERVO0_PIN P1_23 // SERVO P1.23 +#define SERVO1_PIN P2_00 // SERVO P2.0 + +// +// Trinamic Stallguard pins, can connect or disconnect by jumpers cap on the board +// +#define X_DIAG_PIN P1_29 // X- +#define Y_DIAG_PIN P1_27 // Y- +#define Z_DIAG_PIN P1_25 // Z- +#define E0_DIAG_PIN P1_28 // X+ +#define E1_DIAG_PIN P1_26 // Y+ + +// +// Limit Switches +// +#if X_STALL_SENSITIVITY + #define X_STOP_PIN X_DIAG_PIN + #if X_HOME_DIR < 0 + #define X_MAX_PIN P1_28 // X+ + #else + #define X_MIN_PIN P1_28 // X+ + #endif +#else + #define X_MIN_PIN P1_29 // X- + #define X_MAX_PIN P1_28 // X+ +#endif + +#if Y_STALL_SENSITIVITY + #define Y_STOP_PIN Y_DIAG_PIN + #if Y_HOME_DIR < 0 + #define Y_MAX_PIN P1_26 // Y+ + #else + #define Y_MIN_PIN P1_26 // Y+ + #endif +#else + #define Y_MIN_PIN P1_27 // Y- + #define Y_MAX_PIN P1_26 // Y+ +#endif + +#if Z_STALL_SENSITIVITY + #define Z_STOP_PIN Z_DIAG_PIN + #if Z_HOME_DIR < 0 + #define Z_MAX_PIN P1_24 // Z+ + #else + #define Z_MIN_PIN P1_24 // Z+ + #endif +#else + #define Z_MIN_PIN P1_25 // Z- + #define Z_MAX_PIN P1_24 // Z+ +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN P1_24 +#endif + +// +// Steppers +// +#define X_STEP_PIN P2_02 +#define X_DIR_PIN P2_03 +#define X_ENABLE_PIN P2_01 +#ifndef X_CS_PIN + #define X_CS_PIN P1_01 +#endif + +#define Y_STEP_PIN P0_19 +#define Y_DIR_PIN P0_20 +#define Y_ENABLE_PIN P2_08 +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_08 +#endif + +#define Z_STEP_PIN P0_22 +#define Z_DIR_PIN P2_11 +#define Z_ENABLE_PIN P0_21 +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_10 +#endif + +#define E0_STEP_PIN P2_13 +#define E0_DIR_PIN P0_11 +#define E0_ENABLE_PIN P2_12 +#ifndef E0_CS_PIN + #define E0_CS_PIN P1_15 +#endif + +#define E1_STEP_PIN P1_09 +#define E1_DIR_PIN P1_14 +#define E1_ENABLE_PIN P0_10 +#ifndef E1_CS_PIN + #define E1_CS_PIN P1_17 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_16 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P0_05 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P0_04 + #endif +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + #define X_SERIAL_TX_PIN P1_01 + #define X_SERIAL_RX_PIN P1_01 + #define Y_SERIAL_TX_PIN P1_08 + #define Y_SERIAL_RX_PIN P1_08 + #define Z_SERIAL_TX_PIN P1_10 + #define Z_SERIAL_RX_PIN P1_10 + #define E0_SERIAL_TX_PIN P1_15 + #define E0_SERIAL_RX_PIN P1_15 + #define E1_SERIAL_TX_PIN P1_17 + #define E1_SERIAL_RX_PIN P1_17 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif // HAS_TMC_UART + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_23_A0 // Analog Input A0 (TH1) +#define TEMP_BED_PIN P0_24_A1 // Analog Input A1 (TB) +#define TEMP_1_PIN P0_25_A2 // Analog Input A2 (TH2) +#define TEMP_2_PIN P0_26_A3 // Analog Input A3 (P0.26, No pull up) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 +#if HOTENDS == 1 + #ifndef FAN1_PIN + #define FAN1_PIN P2_06 + #endif +#else + #ifndef HEATER_1_PIN + #define HEATER_1_PIN P2_06 + #endif +#endif +#ifndef FAN_PIN + #define FAN_PIN P2_04 +#endif +#ifndef FAN2_PIN + #define FAN2_PIN P1_04 +#endif + +// +// Misc. Functions +// +#define LED_PIN P1_18 // Used as a status indicator +#define LED2_PIN P1_19 +#define LED3_PIN P1_20 +#define LED4_PIN P1_21 + +/** + * _____ _____ + * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) + * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) + * (LCD_D4) 0.15 | · ·| 0.17 (LCD_D5) (BTN_EN2) 3.26 | · ·| 0.9 (SD_MOSI) + * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST + * GND | · · | 5V GND | · · | NC + * ----- ----- + * EXP1 EXP2 + */ +#if HAS_SPI_LCD + #define BEEPER_PIN P1_31 + #define BTN_ENC P1_30 + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS P1_00 + + #define BTN_EN1 P0_18 + #define BTN_EN2 P0_15 + + #define LCD_PINS_ENABLE P1_22 + #define LCD_PINS_D4 P0_17 + + #else + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + + #define LCD_SDSS P0_28 + + #if ENABLED(MKS_12864OLED_SSD1306) + + #define LCD_PINS_DC P0_17 + #define DOGLCD_CS P0_16 + #define DOGLCD_A0 LCD_PINS_DC + #define DOGLCD_SCK P0_15 + #define DOGLCD_MOSI P0_18 + + #define LCD_PINS_RS P1_00 + #define LCD_PINS_D7 P1_22 + #define KILL_PIN -1 // NC + + #else // !MKS_12864OLED_SSD1306 + + #define LCD_PINS_RS P0_16 + + #define LCD_PINS_ENABLE P0_18 + #define LCD_PINS_D4 P0_15 + + #if ENABLED(FYSETC_MINI_12864) + + #define DOGLCD_CS P0_18 + #define DOGLCD_A0 P0_16 + #define DOGLCD_SCK P0_07 + #define DOGLCD_MOSI P1_20 + + #define LCD_BACKLIGHT_PIN -1 + + #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems + // results in LCD soft SPI mode 3, SD soft SPI mode 0 + + #define LCD_RESET_PIN P0_15 // Must be high or open for LCD to operate normally. + + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN P0_17 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN P1_00 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN P1_22 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN P0_17 + #endif + + #else // !FYSETC_MINI_12864 + + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_CS P0_17 + #define DOGLCD_A0 P1_00 + #endif + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 P0_17 + #define LCD_PINS_D6 P1_00 + #define LCD_PINS_D7 P1_22 + #endif + + #endif // !FYSETC_MINI_12864 + + #endif // !MKS_12864OLED_SSD1306 + + #endif // !CR10_STOCKDISPLAY + +#endif // HAS_SPI_LCD + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card + +#if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD) + #define SD_DETECT_PIN P0_27 + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #if SD_CONNECTION_IS(ONBOARD) + #define SS_PIN ONBOARD_SD_CS_PIN + #else + #define SS_PIN P0_28 + #endif +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif + +// +// Other Pins +// +//#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0) +//#define PIN_P0_03 P0_03 // AUX1 (Interrupt Capable/ADC/Serial Port 0) +//#define PS_ON_PIN P1_23 // SERVO P1.23 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 22f6ea663c..2dfb2b53b8 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -410,6 +410,8 @@ #include "lpc1769/pins_TH3D_EZBOARD.h" // LPC1769 env:LPC1769 #elif MB(BTT_SKR_V1_4_TURBO) #include "lpc1769/pins_BTT_SKR_V1_4_TURBO.h" // LPC1769 env:LPC1769 +#elif MB(MKS_SGEN_L_V2) + #include "lpc1769/pins_MKS_SGEN_L_V2.h" // LPC1769 env:LPC1769 // // Due (ATSAM) boards From c113984b3240ff5110cc53f0614a08ad8f9bddc4 Mon Sep 17 00:00:00 2001 From: ManuelMcLure Date: Tue, 1 Sep 2020 23:32:52 -0700 Subject: [PATCH 0178/1370] Fix UBL 'G29 I' for large meshes (#19231) --- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 809caecf49..087fdf42b2 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -48,7 +48,7 @@ void unified_bed_leveling::report_current_mesh() { if (!leveling_is_valid()) return; - SERIAL_ECHO_MSG(" G29 I99"); + SERIAL_ECHO_MSG(" G29 I999"); GRID_LOOP(x, y) if (!isnan(z_values[x][y])) { SERIAL_ECHO_START(); From 4f1a14532b51d614afcdcba8b46b3d88f0439a3f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 3 Sep 2020 16:52:31 -0500 Subject: [PATCH 0179/1370] Hide multi-step G29 on Ender 3 V2 --- Marlin/src/lcd/dwin/dwin.cpp | 39 ++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index d82efc5689..6bc0d74f23 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -28,6 +28,10 @@ #if ENABLED(DWIN_CREALITY_LCD) +#if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) && DISABLED(PROBE_MANUALLY) + #define HAS_ONESTEP_LEVELING 1 +#endif + #include "dwin.h" #include @@ -57,7 +61,7 @@ #include "../../feature/host_actions.h" #endif -#if HAS_LEVELING +#if HAS_ONESTEP_LEVELING #include "../../feature/bedlevel/bedlevel.h" #endif @@ -596,7 +600,7 @@ inline void Draw_Prepare_Menu() { inline void Draw_Control_Menu() { Clear_Main_Window(); - const int16_t scroll = TERN(HAS_LEVELING, MROWS - index_control, 0); // Scrolled-up lines + const int16_t scroll = TERN(HAS_ONESTEP_LEVELING, MROWS - index_control, 0); // Scrolled-up lines #define CSCROL(L) (scroll + (L)) #define CLINE(L) MBASE(CSCROL(L)) @@ -976,7 +980,7 @@ void Goto_MainMenu(void) { ICON_Print(); ICON_Prepare(); ICON_Control(); - TERN(HAS_LEVELING, ICON_Leveling, ICON_StartInfo)(select_page.now == 3); + TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(select_page.now == 3); } inline ENCODER_DiffState get_encoder_state() { @@ -1782,7 +1786,7 @@ void HMI_MainMenu(void) { case 0: ICON_Print(); break; case 1: ICON_Print(); ICON_Prepare(); break; case 2: ICON_Prepare(); ICON_Control(); break; - case 3: ICON_Control(); TERN(HAS_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; + case 3: ICON_Control(); TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; } } } @@ -1791,8 +1795,8 @@ void HMI_MainMenu(void) { switch (select_page.now) { case 0: ICON_Print(); ICON_Prepare(); break; case 1: ICON_Prepare(); ICON_Control(); break; - case 2: ICON_Control(); TERN(HAS_LEVELING, ICON_Leveling, ICON_StartInfo)(0); break; - case 3: TERN(HAS_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; + case 2: ICON_Control(); TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(0); break; + case 3: TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; } } } @@ -1822,7 +1826,7 @@ void HMI_MainMenu(void) { /* Leveling */ case 3: - #if HAS_LEVELING + #if HAS_ONESTEP_LEVELING checkkey = Leveling; HMI_Leveling(); #else @@ -2324,7 +2328,7 @@ void HMI_Control(void) { // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - #define CONTROL_ITEMS (5 + ENABLED(HAS_LEVELING)) + #define CONTROL_ITEMS (5 + ENABLED(HAS_ONESTEP_LEVELING)) if (select_control.inc(CONTROL_ITEMS)) { if (select_control.now > MROWS && select_control.now > index_control) { index_control = select_control.now; @@ -2402,12 +2406,17 @@ void HMI_Control(void) { DWIN_UpdateLCD(); } -/* Leveling */ -void HMI_Leveling(void) { - Popup_Window_Leveling(); - DWIN_UpdateLCD(); - queue.inject_P(PSTR("G28O\nG29")); -} + +#if HAS_ONESTEP_LEVELING + + /* Leveling */ + void HMI_Leveling(void) { + Popup_Window_Leveling(); + DWIN_UpdateLCD(); + queue.inject_P(PSTR("G28O\nG29")); + } + +#endif /* Axis Move */ void HMI_AxisMove(void) { @@ -2896,7 +2905,7 @@ void HMI_Info(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_ENTER) { - #if HAS_LEVELING + #if HAS_ONESTEP_LEVELING checkkey = Control; select_control.set(CONTROL_ITEMS); Draw_Control_Menu(); From 43e40524c479c72247bb79b0fc19c7ea3de3f6b5 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Fri, 4 Sep 2020 00:40:29 +0200 Subject: [PATCH 0180/1370] Fix Longer3D TFT defines, disable DMA (#19251) --- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index cbc43a7ac8..d08045ec16 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -119,11 +119,12 @@ */ #define LCD_RESET_PIN PC4 // pin 33 -#define LCD_BACKLIGHT_PIN PD12 // pin 59 +#define TFT_RESET_PIN PC4 // pin 33 +#define TFT_BACKLIGHT_PIN PD12 // pin 59 #define FSMC_CS_PIN PD7 // pin 88 = FSMC_NE1 #define FSMC_RS_PIN PD11 // pin 58 A16 Register. Only one address needed -#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT +//#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT (broken) #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 @@ -136,6 +137,8 @@ #define TFT_PIXEL_OFFSET_X 32 #define TFT_PIXEL_OFFSET_Y 32 +//#define TFT_DRIVER ILI9341 + /** * Note: Alfawise U20/U30 boards DON'T use SPI2, as the hardware designer * mixed up MOSI and MISO pins. SPI is managed in SW, and needs pins From ffba220ae821edc74ef5f71d0e1bfc590af4e2fb Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Thu, 3 Sep 2020 17:43:52 -0500 Subject: [PATCH 0181/1370] Separate Neopixel followup (#19250) --- Marlin/src/feature/leds/neopixel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index f8300c4d98..42046fa563 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -110,7 +110,7 @@ public: #if CONJOINED_NEOPIXEL adaneo2.show(); #else - TERN_(NEOPIXEL2_SEPARATE,adaneo1.setPin(NEOPIXEL2_PIN)); + TERN(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); adaneo1.show(); adaneo1.setPin(NEOPIXEL_PIN); #endif From 6a511b6ea7ba9a7509afda36e020c85522a4a553 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 3 Sep 2020 19:46:05 -0300 Subject: [PATCH 0182/1370] Only show "SD Init Fail" with detectable media (#19236) --- Marlin/src/sd/cardreader.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 32bdc73bcd..59a5f1da8b 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -383,8 +383,10 @@ void CardReader::mount() { if (flag.mounted) cdroot(); - else if (marlin_state != MF_INITIALIZING) - ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); + #if ENABLED(USB_FLASH_DRIVE_SUPPORT) || PIN_EXISTS(SD_DETECT) + else if (marlin_state != MF_INITIALIZING) + ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); + #endif ui.refresh(); } From 94809feac7cd59f7f504fd248ba9256e8d301c75 Mon Sep 17 00:00:00 2001 From: Greg Nutt Date: Thu, 3 Sep 2020 18:52:14 -0400 Subject: [PATCH 0183/1370] Smoothieboard GLCD w/ SD support (#19241) --- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 43 +++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index c9bd9ec3ae..67482b3a49 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -111,7 +111,48 @@ #elif HAS_SPI_LCD - #error "Marlin's Smoothieboard support cannot drive your LCD." + /* + The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either + a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board + found at http://smoothieware.org/rrdglcdadapter + + Other links to information about setting up a display panel with Smoothieboard + http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg + http://smoothieware.org/panel + */ + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + // EXP1 Pins + #define BEEPER_PIN P1_31 // EXP1 Pin 1 + #define BTN_ENC P1_30 // EXP1 Pin 2 + #define LCD_PINS_ENABLE P0_18 // EXP1 Pin 3 (MOSI) + #define LCD_PINS_RS P0_16 // EXP1 Pin 4 (CS) + #define LCD_PINS_D4 P0_15 // EXP1 Pin 5 (SCK) + // EXP2 Pins + #define BTN_EN2 P3_26 // EXP2 Pin 3 + #define BTN_EN1 P3_25 // EXP2 Pin 5 + + /* + SD Support + + For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be + hooked up to the onboard SDCard SPI and use a spare pin for the SDCS. + Also note that an external SDCard sharing the SPI port with the + onboard/internal SDCard must be ejected before rebooting as the bootloader + does not like the external card. NOTE Smoothie will not boot if the external + sdcard is inserted in the RRD LCD sdcard slot at boot time, it must be + inserted after it has booted. + */ + + #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) + #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) + #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) + #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) + #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) + + #else + #error "Marlin's Smoothieboard support cannot drive your LCD." + #endif #endif From 47753d8a016be3a2a8d5c82a5d49c692396b904a Mon Sep 17 00:00:00 2001 From: Victor Sokolov Date: Fri, 4 Sep 2020 05:12:53 +0400 Subject: [PATCH 0184/1370] MarkForged kinematics (#19235) --- Marlin/Configuration.h | 3 +- Marlin/src/core/utility.cpp | 9 +++--- Marlin/src/gcode/host/M360.cpp | 9 +++--- Marlin/src/inc/Conditionals_post.h | 7 ++++- Marlin/src/inc/SanityCheck.h | 17 ++++++++--- Marlin/src/module/endstops.cpp | 12 ++++---- Marlin/src/module/motion.cpp | 17 ++++++----- Marlin/src/module/planner.cpp | 48 ++++++++++++++++++++++++++---- Marlin/src/module/stepper.cpp | 12 ++++++-- 9 files changed, 100 insertions(+), 34 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 8cd2faf7f8..52af1375a5 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -608,7 +608,7 @@ // @section machine -// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics, // either in the usual order or reversed //#define COREXY //#define COREXZ @@ -616,6 +616,7 @@ //#define COREYX //#define COREZX //#define COREZY +//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042 //=========================================================================== //============================== Endstop Settings =========================== diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index 295657fa64..f999568167 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -57,10 +57,11 @@ void safe_delay(millis_t ms) { void log_machine_info() { SERIAL_ECHOLNPGM("Machine Type: " - TERN_(DELTA, "Delta") - TERN_(IS_SCARA, "SCARA") - TERN_(IS_CORE, "Core") - TERN_(IS_CARTESIAN, "Cartesian") + TERN_(DELTA, "Delta") + TERN_(IS_SCARA, "SCARA") + TERN_(IS_CORE, "Core") + TERN_(MARKFORGED_XY, "MarkForged") + TERN_(IS_CARTESIAN, "Cartesian") ); SERIAL_ECHOLNPGM("Probe: " diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 87ca23becd..9970dc4df9 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -145,10 +145,11 @@ void GcodeSuite::M360() { config_prefix(PSTR("PrinterType")); SERIAL_ECHOLNPGM( - TERN_(DELTA, "Delta") - TERN_(IS_SCARA, "SCARA") - TERN_(IS_CORE, "Core") - TERN_(IS_CARTESIAN, "Cartesian") + TERN_(DELTA, "Delta") + TERN_(IS_SCARA, "SCARA") + TERN_(IS_CORE, "Core") + TERN_(MARKFORGED_XY, "MarkForged") + TERN_(IS_CARTESIAN, "Cartesian") ); // diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index f566643bdb..71ae4bb285 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -149,11 +149,16 @@ #define CORE_AXIS_2 C_AXIS #endif #define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n)) +#elif ENABLED(MARKFORGED_XY) + // Markforged kinematics + #define CORE_AXIS_1 A_AXIS + #define CORE_AXIS_2 B_AXIS + #define NORMAL_AXIS Z_AXIS #endif // Calibration codes only for non-core axes #if EITHER(BACKLASH_GCODE, CALIBRATION_GCODE) - #if IS_CORE + #if EITHER(IS_CORE, MARKFORGED_XY) #define X_AXIS_INDEX 0 #define Y_AXIS_INDEX 1 #define Z_AXIS_INDEX 2 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index da5ddc1c2d..dcd6e4f18b 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -764,6 +764,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(BABYSTEPPING) #if ENABLED(SCARA) #error "BABYSTEPPING is not implemented for SCARA yet." + #elif BOTH(MARKFORGED_XY, BABYSTEP_XY) + #error "BABYSTEPPING only implemented for Z axis on MarkForged." #elif BOTH(DELTA, BABYSTEP_XY) #error "BABYSTEPPING only implemented for Z axis on deltabots." #elif BOTH(BABYSTEP_ZPROBE_OFFSET, MESH_BED_LEVELING) @@ -1155,8 +1157,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS + ENABLED(COREYZ) \ + ENABLED(COREYX) \ + ENABLED(COREZX) \ - + ENABLED(COREZY) - #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, or COREZY." + + ENABLED(COREZY) \ + + ENABLED(MARKFORGED_XY) + #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." #endif /** @@ -1576,8 +1579,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if ENABLED(DUAL_X_CARRIAGE) #if EXTRUDERS < 2 #error "DUAL_X_CARRIAGE requires 2 (or more) extruders." - #elif CORE_IS_XY || CORE_IS_XZ - #error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, or COREZX." + #elif ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) + #error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, COREZX, or MARKFORGED_XY." #elif !GOOD_AXIS_PINS(X2) #error "DUAL_X_CARRIAGE requires X2 stepper pins to be defined." #elif !HAS_X_MAX @@ -2533,6 +2536,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "CoreXZ requires both X and Z to use sensorless homing if either one does." #elif CORE_IS_YZ && Y_SENSORLESS != Z_SENSORLESS && !HOMING_Z_WITH_PROBE #error "CoreYZ requires both Y and Z to use sensorless homing if either one does." +#elif ENABLED(MARKFORGED_XY) && X_SENSORLESS != Y_SENSORLESS + #error "MARKFORGED_XY requires both X and Y to use sensorless homing if either one does." #endif // Other TMC feature requirements @@ -2848,6 +2853,10 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "BACKLASH_COMPENSATION requires BACKLASH_DISTANCE_MM." #elif !defined(BACKLASH_CORRECTION) #error "BACKLASH_COMPENSATION requires BACKLASH_CORRECTION." + #elif ENABLED(MARKFORGED_XY) + constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM; + static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2], + "BACKLASH_COMPENSATION can only apply to " STRINGIFY(NORMAL_AXIS) " on a MarkForged system."); #elif IS_CORE constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM; static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2], diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 289270072d..1169ede2dc 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -498,7 +498,7 @@ void Endstops::update() { #define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT_TO(live_state, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) #define COPY_LIVE_STATE(SRC_BIT, DST_BIT) SET_BIT_TO(live_state, DST_BIT, TEST(live_state, SRC_BIT)) - #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) + #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && NONE(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) // If G38 command is active check Z_MIN_PROBE for ALL movement if (G38_move) UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); #endif @@ -514,12 +514,12 @@ void Endstops::update() { #endif // Use HEAD for core axes, AXIS for others - #if CORE_IS_XY || CORE_IS_XZ + #if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) #define X_AXIS_HEAD X_HEAD #else #define X_AXIS_HEAD X_AXIS #endif - #if CORE_IS_XY || CORE_IS_YZ + #if ANY(CORE_IS_XY, CORE_IS_YZ, MARKFORGED_XY) #define Y_AXIS_HEAD Y_HEAD #else #define Y_AXIS_HEAD Y_AXIS @@ -736,7 +736,7 @@ void Endstops::update() { #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_DUAL_ENDSTOP(Z, MINMAX) #endif - #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) + #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && NONE(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) #if ENABLED(G38_PROBE_AWAY) #define _G38_OPEN_STATE (G38_move >= 4) #else @@ -865,7 +865,7 @@ void Endstops::update() { bool hit = false; #if X_SPI_SENSORLESS if (tmc_spi_homing.x && (stepperX.test_stall_status() - #if CORE_IS_XY && Y_SPI_SENSORLESS + #if ANY(CORE_IS_XY, MARKFORGED_XY) && Y_SPI_SENSORLESS || stepperY.test_stall_status() #elif CORE_IS_XZ && Z_SPI_SENSORLESS || stepperZ.test_stall_status() @@ -877,7 +877,7 @@ void Endstops::update() { #endif #if Y_SPI_SENSORLESS if (tmc_spi_homing.y && (stepperY.test_stall_status() - #if CORE_IS_XY && X_SPI_SENSORLESS + #if ANY(CORE_IS_XY, MARKFORGED_XY) && X_SPI_SENSORLESS || stepperX.test_stall_status() #elif CORE_IS_YZ && Z_SPI_SENSORLESS || stepperZ.test_stall_status() diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 401721140b..2f12302e59 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1152,7 +1152,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if AXIS_HAS_STALLGUARD(X2) stealth_states.x2 = tmc_enable_stallguard(stepperX2); #endif - #if CORE_IS_XY && Y_SENSORLESS + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS stealth_states.y = tmc_enable_stallguard(stepperY); #elif CORE_IS_XZ && Z_SENSORLESS stealth_states.z = tmc_enable_stallguard(stepperZ); @@ -1165,7 +1165,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if AXIS_HAS_STALLGUARD(Y2) stealth_states.y2 = tmc_enable_stallguard(stepperY2); #endif - #if CORE_IS_XY && X_SENSORLESS + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS stealth_states.x = tmc_enable_stallguard(stepperX); #elif CORE_IS_YZ && Z_SENSORLESS stealth_states.z = tmc_enable_stallguard(stepperZ); @@ -1216,7 +1216,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if AXIS_HAS_STALLGUARD(X2) tmc_disable_stallguard(stepperX2, enable_stealth.x2); #endif - #if CORE_IS_XY && Y_SENSORLESS + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS tmc_disable_stallguard(stepperY, enable_stealth.y); #elif CORE_IS_XZ && Z_SENSORLESS tmc_disable_stallguard(stepperZ, enable_stealth.z); @@ -1229,7 +1229,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if AXIS_HAS_STALLGUARD(Y2) tmc_disable_stallguard(stepperY2, enable_stealth.y2); #endif - #if CORE_IS_XY && X_SENSORLESS + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS tmc_disable_stallguard(stepperX, enable_stealth.x); #elif CORE_IS_YZ && Z_SENSORLESS tmc_disable_stallguard(stepperZ, enable_stealth.z); @@ -1789,7 +1789,7 @@ void homeaxis(const AxisEnum axis) { do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis)); } - #else // CARTESIAN / CORE + #else // CARTESIAN / CORE / MARKFORGED_XY set_axis_is_at_home(axis); sync_plan_position(); @@ -1818,8 +1818,11 @@ void homeaxis(const AxisEnum axis) { #if ENABLED(SENSORLESS_HOMING) planner.synchronize(); - if (TERN0(IS_CORE, axis != NORMAL_AXIS)) - safe_delay(200); // Short delay to allow belts to spring back + if (false + #if EITHER(IS_CORE, MARKFORGED_XY) + || axis != NORMAL_AXIS + #endif + ) safe_delay(200); // Short delay to allow belts to spring back #endif } #endif diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 931daa3322..82c62ed579 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1614,6 +1614,7 @@ void Planner::finish_and_disable() { float Planner::get_axis_position_mm(const AxisEnum axis) { float axis_steps; #if IS_CORE + // Requesting one of the "core" axes? if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { @@ -1631,9 +1632,30 @@ float Planner::get_axis_position_mm(const AxisEnum axis) { } else axis_steps = stepper.position(axis); + + #elif ENABLED(MARKFORGED_XY) + + // Requesting one of the joined axes? + if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { + // Protect the access to the position. + const bool was_enabled = stepper.suspend(); + + const int32_t p1 = stepper.position(CORE_AXIS_1), + p2 = stepper.position(CORE_AXIS_2); + + if (was_enabled) stepper.wake_up(); + + axis_steps = ((axis == CORE_AXIS_1) ? p1 - p2 : p2); + } + else + axis_steps = stepper.position(axis); + #else + axis_steps = stepper.position(axis); + #endif + return axis_steps * steps_to_mm[axis]; } @@ -1808,6 +1830,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, if (dc < 0) SBI(dm, Z_HEAD); // ...and Z if (db + dc < 0) SBI(dm, B_AXIS); // Motor B direction if (CORESIGN(db - dc) < 0) SBI(dm, C_AXIS); // Motor C direction + #elif ENABLED(MARKFORGED_XY) + if (da < 0) SBI(dm, X_HEAD); // Save the real Extruder (head) direction in X Axis + if (db < 0) SBI(dm, Y_HEAD); // ...and Y + if (dc < 0) SBI(dm, Z_AXIS); + if (da + db < 0) SBI(dm, A_AXIS); // Motor A direction + if (db < 0) SBI(dm, B_AXIS); // Motor B direction #else if (da < 0) SBI(dm, X_AXIS); if (db < 0) SBI(dm, Y_AXIS); @@ -1843,6 +1871,8 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->steps.set(ABS(da + dc), ABS(db), ABS(da - dc)); #elif CORE_IS_YZ block->steps.set(ABS(da), ABS(db + dc), ABS(db - dc)); + #elif ENABLED(MARKFORGED_XY) + block->steps.set(ABS(da + db), ABS(db), ABS(dc)); #elif IS_SCARA block->steps.set(ABS(da), ABS(db), ABS(dc)); #else @@ -1859,7 +1889,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, * Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. */ struct DistanceMM : abce_float_t { - TERN_(IS_CORE, xyz_pos_t head); + #if EITHER(IS_CORE, MARKFORGED_XY) + xyz_pos_t head; + #endif } steps_dist_mm; #if IS_CORE #if CORE_IS_XY @@ -1881,6 +1913,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, steps_dist_mm.b = (db + dc) * steps_to_mm[B_AXIS]; steps_dist_mm.c = CORESIGN(db - dc) * steps_to_mm[C_AXIS]; #endif + #elif ENABLED(MARKFORGED_XY) + steps_dist_mm.head.x = da * steps_to_mm[A_AXIS]; + steps_dist_mm.head.y = db * steps_to_mm[B_AXIS]; + steps_dist_mm.z = dc * steps_to_mm[Z_AXIS]; + steps_dist_mm.a = (da - db) * steps_to_mm[A_AXIS]; + steps_dist_mm.b = db * steps_to_mm[B_AXIS]; #else steps_dist_mm.a = da * steps_to_mm[A_AXIS]; steps_dist_mm.b = db * steps_to_mm[B_AXIS]; @@ -1907,7 +1945,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->millimeters = millimeters; else block->millimeters = SQRT( - #if CORE_IS_XY + #if EITHER(CORE_IS_XY, MARKFORGED_XY) sq(steps_dist_mm.head.x) + sq(steps_dist_mm.head.y) + sq(steps_dist_mm.z) #elif CORE_IS_XZ sq(steps_dist_mm.head.x) + sq(steps_dist_mm.y) + sq(steps_dist_mm.head.z) @@ -1964,7 +2002,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif // Enable active axes - #if CORE_IS_XY + #if EITHER(CORE_IS_XY, MARKFORGED_XY) if (block->steps.a || block->steps.b) { ENABLE_AXIS_X(); ENABLE_AXIS_Y(); @@ -2325,9 +2363,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, * On CoreXY the length of the vector [A,B] is SQRT(2) times the length of the head movement vector [X,Y]. * So taking Z and E into account, we cannot scale to a unit vector with "inverse_millimeters". * => normalize the complete junction vector. - * Elsewise, when needed JD factors in the E component + * Elsewise, when needed JD will factor-in the E component */ - if (ENABLED(IS_CORE) || esteps > 0) + if (EITHER(IS_CORE, MARKFORGED_XY) || esteps > 0) normalize_junction_vector(unit_vec); // Normalize with XYZE components else unit_vec *= inverse_millimeters; // Use pre-calculated (1 / SQRT(x^2 + y^2 + z^2)) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 0e70fd370c..fab1a61548 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2041,6 +2041,8 @@ uint32_t Stepper::block_phase_isr() { #define X_CMP(A,B) ((A)!=(B)) #endif #define X_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && X_CMP(D_(1),D_(2))) ) + #elif ENABLED(MARKFORGED_XY) + #define X_MOVE_TEST (current_block->steps.a != current_block->steps.b) #else #define X_MOVE_TEST !!current_block->steps.a #endif @@ -2614,6 +2616,8 @@ void Stepper::_set_position(const int32_t &a, const int32_t &b, const int32_t &c #elif CORE_IS_YZ // coreyz planning count_position.set(a, b + c, CORESIGN(b - c)); + #elif ENABLED(MARKFORGED_XY) + count_position.set(a - b, b, c); #else // default non-h-bot planning count_position.set(a, b, c); @@ -2680,6 +2684,10 @@ void Stepper::endstop_triggered(const AxisEnum axis) { ? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2]) : count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2] ) * double(0.5) + #elif ENABLED(MARKFORGED_XY) + axis == CORE_AXIS_1 + ? count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2] + : count_position[CORE_AXIS_2] #else // !IS_CORE count_position[axis] #endif @@ -2709,12 +2717,12 @@ int32_t Stepper::triggered_position(const AxisEnum axis) { } void Stepper::report_a_position(const xyz_long_t &pos) { - #if CORE_IS_XY || CORE_IS_XZ || ENABLED(DELTA) || IS_SCARA + #if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY, DELTA, IS_SCARA) SERIAL_ECHOPAIR(STR_COUNT_A, pos.x, " B:", pos.y); #else SERIAL_ECHOPAIR_P(PSTR(STR_COUNT_X), pos.x, SP_Y_LBL, pos.y); #endif - #if CORE_IS_XZ || CORE_IS_YZ || ENABLED(DELTA) + #if ANY(CORE_IS_XZ, CORE_IS_YZ, DELTA) SERIAL_ECHOLNPAIR(" C:", pos.z); #else SERIAL_ECHOLNPAIR_P(SP_Z_LBL, pos.z); From e2625db1ddfa508fbb3652cb11d7cf71948ab7d1 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 3 Sep 2020 21:15:45 -0700 Subject: [PATCH 0185/1370] Tweak ESP32 Wifi sanity-check message (#19257) --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index dcd6e4f18b..17501177a8 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3102,7 +3102,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) * Sanity check for WIFI */ #if EITHER(ESP3D_WIFISUPPORT, WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) - #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 controller." + #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 MOTHERBOARD." #endif /** From d94b5b5ad062f1979452fe8c939ecc8ff8801cb6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Sep 2020 14:15:06 -0500 Subject: [PATCH 0186/1370] Fix Creality V4 SD Detect --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index ded0ba405b..090f3ee3f8 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -153,6 +153,7 @@ #define ON_BOARD_SPI_DEVICE 1 #define ONBOARD_SD_CS_PIN PA4 // SDSS #define SDIO_SUPPORT +#define NO_SD_HOST_DRIVE // This board's SD is only seen by the printer #if ENABLED(CR10_STOCKDISPLAY) && NONE(RET6_12864_LCD, VET6_12864_LCD) #error "Define RET6_12864_LCD or VET6_12864_LCD to select pins for CR10_STOCKDISPLAY with the Creality V4 controller." From f7cb9455c86cc6410964fe8237f295e7eabab707 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Sep 2020 19:57:07 -0500 Subject: [PATCH 0187/1370] No 'ls' if media isn't mounted --- Marlin/src/core/language.h | 1 + Marlin/src/gcode/sd/M20.cpp | 10 +++++++--- Marlin/src/sd/cardreader.cpp | 6 ++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index f0ddbdd6d0..1d81ee61fb 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -120,6 +120,7 @@ #define STR_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " #define STR_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " #define STR_FILE_PRINTED "Done printing file" +#define STR_NO_MEDIA "No media" #define STR_BEGIN_FILE_LIST "Begin file list" #define STR_END_FILE_LIST "End file list" #define STR_INVALID_EXTRUDER "Invalid extruder" diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp index 6d4c55752c..7ac4affdae 100644 --- a/Marlin/src/gcode/sd/M20.cpp +++ b/Marlin/src/gcode/sd/M20.cpp @@ -31,9 +31,13 @@ * M20: List SD card to serial output */ void GcodeSuite::M20() { - SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); - card.ls(); - SERIAL_ECHOLNPGM(STR_END_FILE_LIST); + if (card.flag.mounted) { + SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); + card.ls(); + SERIAL_ECHOLNPGM(STR_END_FILE_LIST); + } + else + SERIAL_ECHO_MSG(STR_NO_MEDIA); } #endif // SDSUPPORT diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 59a5f1da8b..3eacf8b69f 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -276,8 +276,10 @@ void CardReader::printListing(SdFile parent, const char * const prepend/*=nullpt // List all files on the SD card // void CardReader::ls() { - root.rewind(); - printListing(root); + if (flag.mounted) { + root.rewind(); + printListing(root); + } } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) From c1d9e8d5714e4036575629648273d90e1b6bd88a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Sep 2020 13:50:08 -0500 Subject: [PATCH 0188/1370] SD card debugging --- Marlin/src/sd/cardreader.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 3eacf8b69f..f8f1bf18e6 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -24,6 +24,8 @@ #if ENABLED(SDSUPPORT) +//#define DEBUG_CARDREADER + #include "cardreader.h" #include "../MarlinCore.h" @@ -51,6 +53,9 @@ #include "../feature/pause.h" #endif +#define DEBUG_OUT ENABLED(DEBUG_CARDREADER) +#include "../core/debug_out.h" + // public: card_flags_t CardReader::flag; @@ -405,6 +410,8 @@ void CardReader::manage_media() { uint8_t stat = uint8_t(IS_SD_INSERTED()); if (stat == prev_stat) return; + DEBUG_ECHOLNPAIR("SD: Status changed from ", prev_stat, " to ", stat); + flag.workDirIsRoot = true; // Return to root on mount/release if (ui.detected()) { @@ -431,12 +438,15 @@ void CardReader::manage_media() { if (stat) { TERN_(SDCARD_EEPROM_EMULATION, settings.first_load()); if (old_stat == 2) // First mount? + DEBUG_ECHOLNPGM("First mount."); TERN(POWER_LOSS_RECOVERY, recovery.check(), // Check for PLR file. (If not there it will beginautostart) beginautostart() // Look for auto0.g on the next loop ); } } + else + DEBUG_ECHOLNPGM("SD: No UI Detected."); } void CardReader::release() { From 563bd5b5bca129e16c61750d1485d303fc3df6b4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 6 Sep 2020 19:23:36 -0300 Subject: [PATCH 0189/1370] Emergency Parser for STM32F1 (#19279) --- Marlin/src/HAL/STM32F1/HAL.h | 13 +--- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 93 ++++++++++++++++++++++++ Marlin/src/HAL/STM32F1/MarlinSerial.h | 50 +++++++++++++ Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 - 4 files changed, 145 insertions(+), 15 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/MarlinSerial.cpp create mode 100644 Marlin/src/HAL/STM32F1/MarlinSerial.h diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 5a0b046009..f76d8c54a0 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -46,6 +46,8 @@ #include "msc_sd.h" #endif +#include "MarlinSerial.h" + // ------------------------ // Defines // ------------------------ @@ -64,17 +66,6 @@ #else #define UsbSerial MarlinCompositeSerial #endif - #define MSerial1 Serial1 - #define MSerial2 Serial2 - #define MSerial3 Serial3 - #define MSerial4 Serial4 - #define MSerial5 Serial5 -#else - #define MSerial1 Serial - #define MSerial2 Serial1 - #define MSerial3 Serial2 - #define MSerial4 Serial3 - #define MSerial5 Serial4 #endif #if SERIAL_PORT == 0 diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp new file mode 100644 index 0000000000..f965bc99cf --- /dev/null +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -0,0 +1,93 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" +#include "MarlinSerial.h" +#include + +// Copied from ~/.platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/usart_private.h +// Changed to handle Emergency Parser +static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb, usart_reg_map *regs, MarlinSerial &serial) { + /* Handle RXNEIE and TXEIE interrupts. + * RXNE signifies availability of a byte in DR. + * + * See table 198 (sec 27.4, p809) in STM document RM0008 rev 15. + * We enable RXNEIE. + */ + if ((regs->CR1 & USART_CR1_RXNEIE) && (regs->SR & USART_SR_RXNE)) { + uint8_t c = (uint8)regs->DR; + #ifdef USART_SAFE_INSERT + // If the buffer is full and the user defines USART_SAFE_INSERT, + // ignore new bytes. + rb_safe_insert(rb, c); + #else + // By default, push bytes around in the ring buffer. + rb_push_insert(rb, c); + #endif + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(serial.emergency_state, c); + #endif + } + // TXE signifies readiness to send a byte to DR. + if ((regs->CR1 & USART_CR1_TXEIE) && (regs->SR & USART_SR_TXE)) { + if (!rb_is_empty(wb)) + regs->DR=rb_remove(wb); + else + regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE + } +} + +#define DEFINE_HWSERIAL_MARLIN(name, n) \ + MarlinSerial name(USART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN); \ + extern "C" void __irq_usart##n(void) { \ + my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \ + } + +#define DEFINE_HWSERIAL_UART_MARLIN(name, n) \ + MarlinSerial name(UART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN); \ + extern "C" void __irq_usart##n(void) { \ + my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \ + } + +#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1 + DEFINE_HWSERIAL_MARLIN(MSerial1, 1); +#endif + +#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2 + DEFINE_HWSERIAL_MARLIN(MSerial2, 2); +#endif + +#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3 + DEFINE_HWSERIAL_MARLIN(MSerial3, 3); +#endif + +#if SERIAL_PORT == 4 || SERIAL_PORT_2 == 4 || DGUS_SERIAL_PORT == 4 + DEFINE_HWSERIAL_UART_MARLIN(MSerial4, 4); +#endif + +#if SERIAL_PORT == 5 || SERIAL_PORT_2 == 5 || DGUS_SERIAL_PORT == 5 + DEFINE_HWSERIAL_UART_MARLIN(MSerial5, 5); +#endif diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h new file mode 100644 index 0000000000..4e8a47d2f9 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include +#include + +#include "../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +class MarlinSerial : public HardwareSerial { +public: + MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) : + HardwareSerial(usart_device, tx_pin, rx_pin) + #if ENABLED(EMERGENCY_PARSER) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { } + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif +}; + +extern MarlinSerial MSerial1; +extern MarlinSerial MSerial2; +extern MarlinSerial MSerial3; +extern MarlinSerial MSerial4; +extern MarlinSerial MSerial5; diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index c0cb486952..9d5026fbab 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -25,10 +25,6 @@ * Test STM32F1-specific configuration values for errors at compile-time. */ -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for STM32F1. Disable EMERGENCY_PARSER to continue." -#endif - #if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F1." #endif From 24fbfae0fdb08e5ab970c4b1f6d76d35ad26269b Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 6 Sep 2020 19:29:43 -0300 Subject: [PATCH 0190/1370] Fix STM32F1 SPI device init, MKS_LCD12864 (#19271) --- Marlin/src/HAL/STM32F1/SPI.cpp | 5 +- .../lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp | 1 + Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 50 +++++++++---------- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 3 -- .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 2 - .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 4 -- 6 files changed, 28 insertions(+), 37 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp index 423772dbc9..0452cf6293 100644 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -40,6 +40,9 @@ #include #include +#include "../../inc/MarlinConfig.h" +#include "spi_pins.h" + /** Time in ms for DMA receive timeout */ #define DMA_TIMEOUT 100 @@ -710,6 +713,6 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { return baud_rates[i]; } -SPIClass SPI(1); +SPIClass SPI(SPI_DEVICE); #endif // __STM32F1__ diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp index 85339e8349..e4e387c190 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp @@ -112,6 +112,7 @@ static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = { U8G_ESC_CS(1), // enable chip UC1701_ALL_PIX(0), // normal display U8G_ESC_CS(0), // disable chip + U8G_ESC_DLY(150), // delay 150 ms before sending any data U8G_ESC_END // end of sequence }; diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index 7ebabd6950..bf0edbb8de 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -240,39 +240,35 @@ bool MarlinUI::detected() { return true; } // Initialize or re-initialize the LCD void MarlinUI::init_lcd() { - #if DISABLED(MKS_LCD12864) + #if PIN_EXISTS(LCD_BACKLIGHT) + OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away + #endif - #if PIN_EXISTS(LCD_BACKLIGHT) - OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) + SET_OUTPUT(LCD_PINS_DC); + #ifndef LCD_RESET_PIN + #define LCD_RESET_PIN LCD_PINS_RS #endif + #endif - #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) - SET_OUTPUT(LCD_PINS_DC); - #ifndef LCD_RESET_PIN - #define LCD_RESET_PIN LCD_PINS_RS - #endif - #endif + #if PIN_EXISTS(LCD_RESET) + // Perform a clean hardware reset with needed delays + OUT_WRITE(LCD_RESET_PIN, LOW); + _delay_ms(5); + WRITE(LCD_RESET_PIN, HIGH); + _delay_ms(5); + u8g.begin(); + #endif - #if PIN_EXISTS(LCD_RESET) - // Perform a clean hardware reset with needed delays - OUT_WRITE(LCD_RESET_PIN, LOW); - _delay_ms(5); - WRITE(LCD_RESET_PIN, HIGH); - _delay_ms(5); - u8g.begin(); - #endif + #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) + WRITE(LCD_BACKLIGHT_PIN, HIGH); + #endif - #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) - WRITE(LCD_BACKLIGHT_PIN, HIGH); - #endif + TERN_(HAS_LCD_CONTRAST, refresh_contrast()); - TERN_(HAS_LCD_CONTRAST, refresh_contrast()); - - TERN_(LCD_SCREEN_ROT_90, u8g.setRot90()); - TERN_(LCD_SCREEN_ROT_180, u8g.setRot180()); - TERN_(LCD_SCREEN_ROT_270, u8g.setRot270()); - - #endif // !MKS_LCD12864 + TERN_(LCD_SCREEN_ROT_90, u8g.setRot90()); + TERN_(LCD_SCREEN_ROT_180, u8g.setRot180()); + TERN_(LCD_SCREEN_ROT_270, u8g.setRot270()); uxg_SetUtf8Fonts(g_fontinfo, COUNT(g_fontinfo)); } diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 1346e8099a..9461a828af 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -33,7 +33,6 @@ //#define DISABLE_DEBUG #define DISABLE_JTAG -#define ENABLE_SPI2 // // EEPROM @@ -152,8 +151,6 @@ #define DOGLCD_SCK PB13 #define DOGLCD_MOSI PB15 - #undef SHOW_BOOTSCREEN - #else #define LCD_PINS_D4 PA6 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 9cf8685dfa..6ce6c60105 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -115,8 +115,6 @@ #define DOGLCD_SCK PB13 #define DOGLCD_MOSI PB15 - #undef SHOW_BOOTSCREEN - #else // !MKS_MINI_12864 #define LCD_PINS_D4 PA6 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 228049d139..1295c7c46b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -351,10 +351,6 @@ #define DOGLCD_SCK PA5 #define DOGLCD_MOSI PA7 - // Required for MKS_MINI_12864 with this board - #define MKS_LCD12864B - #undef SHOW_BOOTSCREEN - #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 From 3a1145b999145903dffcf63a226ecce2fe305037 Mon Sep 17 00:00:00 2001 From: cosmoderp <36945803+cosmoderp@users.noreply.github.com> Date: Sun, 6 Sep 2020 18:34:08 -0400 Subject: [PATCH 0191/1370] Fix Ender 3 V2 (DWIN) buffer overrun (#19268) --- Marlin/src/lcd/dwin/dwin_lcd.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 0ca6b8a3ae..b3d969cc8c 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -37,9 +37,9 @@ #include "dwin_lcd.h" #include // for memset -// Make sure DWIN_SendBuf is large enough to hold the largest -// printed string plus the draw command and tail. -uint8_t DWIN_SendBuf[11 + 24] = { 0xAA }; +// Make sure DWIN_SendBuf is large enough to hold the largest string plus draw command and tail. +// Assume the narrowest (6 pixel) font and 2-byte gb2312-encoded characters. +uint8_t DWIN_SendBuf[11 + DWIN_WIDTH / 6 * 2] = { 0xAA }; uint8_t DWIN_BufTail[4] = { 0xCC, 0x33, 0xC3, 0x3C }; uint8_t databuf[26] = { 0 }; uint8_t receivedType; @@ -63,7 +63,7 @@ inline void DWIN_Long(size_t &i, const uint32_t lval) { } inline void DWIN_String(size_t &i, char * const string) { - const size_t len = strlen(string); + const size_t len = _MIN(sizeof(DWIN_SendBuf) - i, strlen(string)); memcpy(&DWIN_SendBuf[i+1], string, len); i += len; } From e79af802b1d1eb52016d27c975df55446a0c01e6 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sun, 6 Sep 2020 16:37:16 -0600 Subject: [PATCH 0192/1370] Touch UI long filenames fixes (#19262) * Improvements to FTDI DLCache functionality. * Better handling of long file names in Touch UI - Long file names now truncated and shown with ellipsis. - Increased display cache buffer to allow for longer filenames. - Visual error message when display cache is exceeded. --- .../ftdi_eve_lib/basic/commands.h | 1 + .../ftdi_eve_lib/extended/dl_cache.cpp | 80 ++++++++++--------- .../ftdi_eve_lib/extended/dl_cache.h | 18 +++-- .../ftdi_eve_lib/extended/ftdi_extended.h | 1 + .../ftdi_eve_lib/extended/screen_types.h | 11 +++ .../ftdi_eve_lib/extended/text_ellipsis.cpp | 80 +++++++++++++++++++ .../ftdi_eve_lib/extended/text_ellipsis.h | 31 +++++++ .../screens/files_screen.cpp | 15 ++-- .../lib/ftdi_eve_touch_ui/screens/screens.h | 2 +- 9 files changed, 187 insertions(+), 52 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h index 1bb35a5995..a9fdb5c5c7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h @@ -133,6 +133,7 @@ class CLCD { static void set_brightness (uint8_t brightness); static uint8_t get_brightness(); static void host_cmd (unsigned char host_command, unsigned char byte2); + static uint32_t dl_size() {return CLCD::mem_read_32(REG::CMD_DL) & 0x1FFF;} static void get_font_metrics (uint8_t font, struct FontMetrics &fm); static uint16_t get_text_width(const uint8_t font, const char *str); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp index 728e433154..439541bd51 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -32,7 +32,8 @@ * * The cache memory begins with a table at * DL_CACHE_START: each table entry contains - * an address and size for a cached DL slot. + * an address, size and used bytes for a cached + * DL slot. * * Immediately following the table is the * DL_FREE_ADDR, which points to free cache @@ -44,11 +45,14 @@ * * DL_CACHE_START slot0_addr 4 * slot0_size 4 + * slot0_used 4 * slot1_addr 4 * slot1_size 4 + * slot1_used 4 * ... * slotN_addr 4 * slotN_size 4 + * slotN_used 4 * DL_FREE_ADDR dl_free_ptr 4 * cached data * ... @@ -57,7 +61,7 @@ */ #define DL_CACHE_START MAP::RAM_G_SIZE - 0xFFFF -#define DL_FREE_ADDR DL_CACHE_START + DL_CACHE_SLOTS * 8 +#define DL_FREE_ADDR DL_CACHE_START + DL_CACHE_SLOTS * 12 using namespace FTDI; @@ -66,12 +70,12 @@ using namespace FTDI; void DLCache::init() { CLCD::mem_write_32(DL_FREE_ADDR, DL_FREE_ADDR + 4); for(uint8_t slot = 0; slot < DL_CACHE_SLOTS; slot++) { - save_slot(slot, 0, 0); + save_slot(slot, 0, 0, 0); } } bool DLCache::has_data() { - return dl_size != 0; + return dl_slot_size != 0; } bool DLCache::wait_until_idle() { @@ -93,12 +97,12 @@ bool DLCache::wait_until_idle() { * that it can be appended later. The memory is * dynamically allocated following DL_FREE_ADDR. * - * If num_bytes is provided, then that many bytes + * If min_bytes is provided, then that many bytes * will be reserved so that the cache may be re-written * later with potentially a bigger DL. */ -bool DLCache::store(uint32_t num_bytes /* = 0*/) { +bool DLCache::store(uint32_t min_bytes /* = 0*/) { CLCD::CommandFifo cmd; // Execute any commands already in the FIFO @@ -107,67 +111,67 @@ bool DLCache::store(uint32_t num_bytes /* = 0*/) { return false; // Figure out how long the display list is - uint32_t new_dl_size = CLCD::mem_read_32(REG::CMD_DL) & 0x1FFF; - uint32_t free_space = 0; - uint32_t dl_alloc = 0; + const uint32_t dl_size = CLCD::dl_size(); - if (dl_addr == 0) { + if (dl_slot_addr == 0) { // If we are allocating new space... - dl_addr = CLCD::mem_read_32(DL_FREE_ADDR); - free_space = MAP::RAM_G_SIZE - dl_addr; - dl_alloc = num_bytes ?: new_dl_size; - dl_size = new_dl_size; - } else { - // Otherwise, we can only store as much space - // as was previously allocated. - free_space = num_bytes ?: dl_size; - dl_alloc = 0; - dl_size = new_dl_size; + dl_slot_addr = CLCD::mem_read_32(DL_FREE_ADDR); + dl_slot_size = max(dl_size, min_bytes); + + const uint32_t free_space = MAP::RAM_G_SIZE - dl_slot_addr; + if(dl_slot_size <= free_space) { + CLCD::mem_write_32(DL_FREE_ADDR, dl_slot_addr + dl_slot_size); + } else { + dl_slot_addr = 0; + dl_slot_size = 0; + dl_slot_used = 0; + } } - if (dl_size > free_space) { + if (dl_size > dl_slot_size) { // Not enough memory to cache the display list. #if ENABLED(TOUCH_UI_DEBUG) SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Not enough space in GRAM to cache display list, free space: ", free_space); + SERIAL_ECHOPAIR ("Not enough space in GRAM to cache display list, free space: ", dl_slot_size); SERIAL_ECHOLNPAIR(" Required: ", dl_size); #endif + dl_slot_used = 0; + save_slot(); return false; } else { #if ENABLED(TOUCH_UI_DEBUG) SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Saving DL to RAMG cache, bytes: ", dl_size); - SERIAL_ECHOLNPAIR(" Free space: ", free_space); + SERIAL_ECHOPAIR ("Saving DL to RAMG cache, bytes: ", dl_slot_used); + SERIAL_ECHOLNPAIR(" Free space: ", dl_slot_size); #endif - cmd.memcpy(dl_addr, MAP::RAM_DL, dl_size); + dl_slot_used = dl_size; + save_slot(); + cmd.memcpy(dl_slot_addr, MAP::RAM_DL, dl_slot_used); cmd.execute(); - save_slot(dl_slot, dl_addr, dl_size); - if (dl_alloc > 0) { - // If we allocated space dynamically, then adjust dl_free_addr. - CLCD::mem_write_32(DL_FREE_ADDR, dl_addr + dl_alloc); - } return true; } } -void DLCache::save_slot(uint8_t dl_slot, uint32_t dl_addr, uint32_t dl_size) { - CLCD::mem_write_32(DL_CACHE_START + dl_slot * 8 + 0, dl_addr); - CLCD::mem_write_32(DL_CACHE_START + dl_slot * 8 + 4, dl_size); +void DLCache::save_slot(uint8_t indx, uint32_t addr, uint16_t size, uint16_t used) { + CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 0, addr); + CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 4, size); + CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 8, used); } -void DLCache::load_slot() { - dl_addr = CLCD::mem_read_32(DL_CACHE_START + dl_slot * 8 + 0); - dl_size = CLCD::mem_read_32(DL_CACHE_START + dl_slot * 8 + 4); +void DLCache::load_slot(uint8_t indx, uint32_t &addr, uint16_t &size, uint16_t &used) { + addr = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 0); + size = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 4); + used = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 8); } void DLCache::append() { CLCD::CommandFifo cmd; - cmd.append(dl_addr, dl_size); + cmd.append(dl_slot_addr, dl_slot_used); #if ENABLED(TOUCH_UI_DEBUG) cmd.execute(); wait_until_idle(); SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Appending to DL from RAMG cache, bytes: ", dl_size); + SERIAL_ECHOPAIR ("Appending to DL from RAMG cache, bytes: ", dl_slot_used); SERIAL_ECHOLNPAIR(" REG_CMD_DL: ", CLCD::mem_read_32(REG::CMD_DL)); #endif } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h index 4ae4bce3ef..c4bb22fbd7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h @@ -44,12 +44,16 @@ class DLCache { typedef FTDI::ftdi_registers REG; typedef FTDI::ftdi_memory_map MAP; - uint8_t dl_slot; - uint32_t dl_addr; - uint16_t dl_size; + uint8_t dl_slot_indx; + uint32_t dl_slot_addr; + uint16_t dl_slot_size; + uint16_t dl_slot_used; - void load_slot(); - static void save_slot(uint8_t dl_slot, uint32_t dl_addr, uint32_t dl_size); + void load_slot() {load_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} + void save_slot() {save_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} + + static void load_slot(uint8_t indx, uint32_t &addr, uint16_t &size, uint16_t &used); + static void save_slot(uint8_t indx, uint32_t addr, uint16_t size, uint16_t used); bool wait_until_idle(); @@ -57,12 +61,12 @@ class DLCache { static void init(); DLCache(uint8_t slot) { - dl_slot = slot; + dl_slot_indx = slot; load_slot(); } bool has_data(); - bool store(uint32_t num_bytes = 0); + bool store(uint32_t min_bytes = 0); void append(); }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h index e1904511b2..6e4d0668fe 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -47,4 +47,5 @@ #include "sound_list.h" #include "polygon.h" #include "text_box.h" + #include "text_ellipsis.h" #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h index b12ab286e1..d1f84c8a6e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -173,10 +173,21 @@ class UncachedScreen { template class CachedScreen { protected: + static void gfxError() { + using namespace FTDI; + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR(true,true,true)) + .font(30) + .text(0, 0, display_width, display_height, F("GFX MEM FULL")); + } + static bool storeBackground() { DLCache dlcache(DL_SLOT); if (!dlcache.store(DL_SIZE)) { SERIAL_ECHO_MSG("CachedScreen::storeBackground() failed: not enough DL cache space"); + gfxError(); // Try to cache a shorter error message instead. + dlcache.store(DL_SIZE); return false; } return true; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp new file mode 100644 index 0000000000..3746f1cde0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -0,0 +1,80 @@ +/********************* + * text_ellipsis.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "ftdi_extended.h" + +#ifdef FTDI_EXTENDED + +namespace FTDI { + + /** + * Helper function for drawing text with ellipses. The str buffer may be modified and should have space for up to two extra characters. + */ + static void _draw_text_with_ellipsis(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, char *str, uint16_t options, uint8_t font) { + FontMetrics fm(font); + const uint16_t ellipsisWidth = fm.get_char_width('.') * 3; + + // Compute the total line length, as well as + // the location in the string where it can + // split and still allow the ellipsis to fit. + uint16_t lineWidth = 0; + char *breakPoint = str; + for(char* c = str; *c; c++) { + lineWidth += fm.get_char_width(*c); + if(lineWidth + ellipsisWidth < w) + breakPoint = c; + } + + if(lineWidth > w) { + *breakPoint = '\0'; + strcpy_P(breakPoint,PSTR("...")); + } + + cmd.apply_text_alignment(x, y, w, h, options); + #ifdef TOUCH_UI_USE_UTF8 + if (has_utf8_chars(str)) { + draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options); + } else + #endif + { + cmd.CLCD::CommandFifo::text(x, y, font, options); + cmd.CLCD::CommandFifo::str(str); + } + } + + /** + * These functions draws text inside a bounding box, truncating the text and + * adding ellipsis if the text does not fit. + */ + void draw_text_with_ellipsis(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) { + char tmp[strlen(str) + 3]; + strcpy(tmp, str); + _draw_text_with_ellipsis(cmd, x, y, w, h, tmp, options, font); + } + + void draw_text_with_ellipsis(CommandProcessor& cmd, int x, int y, int w, int h, progmem_str pstr, uint16_t options, uint8_t font) { + char tmp[strlen_P((const char*)pstr) + 3]; + strcpy_P(tmp, (const char*)pstr); + _draw_text_with_ellipsis(cmd, x, y, w, h, tmp, options, font); + } +} // namespace FTDI + +#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h new file mode 100644 index 0000000000..7852b7ec3e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h @@ -0,0 +1,31 @@ +/******************* + * text_ellipsis.h * + *******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 - SynDaver Labs, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +/** + * This function draws text inside a bounding box, truncating the text and + * showing ellipsis if it does not fit. + */ +namespace FTDI { + void draw_text_with_ellipsis(class CommandProcessor& cmd, int x, int y, int w, int h, progmem_str str, uint16_t options = 0, uint8_t font = 31); + void draw_text_with_ellipsis(class CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options = 0, uint8_t font = 31); +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index e304302422..8d6fb18603 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -83,15 +83,19 @@ void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, cmd.font(font_medium) .rectangle( 0, BTN_Y(header_h+line), display_width, BTN_H(1)); cmd.cmd(COLOR_RGB(is_highlighted ? normal_btn.rgb : bg_text_enabled)); + constexpr uint16_t dim[2] = {BTN_SIZE(6,1)}; + #define POS_AND_SHORTEN(SHORTEN) BTN_POS(1,header_h+line), dim[0] - (SHORTEN), dim[1] + #define POS_AND_SIZE POS_AND_SHORTEN(0) #if ENABLED(SCROLL_LONG_FILENAMES) if (is_highlighted) { cmd.cmd(SAVE_CONTEXT()); cmd.cmd(MACRO(0)); - } + cmd.text(POS_AND_SIZE, filename, OPT_CENTERY | OPT_NOFIT); + } else #endif - cmd.text (BTN_POS(1,header_h+line), BTN_SIZE(6,1), filename, OPT_CENTERY | TERN0(SCROLL_LONG_FILENAMES, OPT_NOFIT)); - if (is_dir) { - cmd.text(BTN_POS(1,header_h+line), BTN_SIZE(6,1), F("> "), OPT_CENTERY | OPT_RIGHTX); + draw_text_with_ellipsis(cmd, POS_AND_SHORTEN(is_dir ? 20 : 0), filename, OPT_CENTERY, font_medium); + if (is_dir && !is_highlighted) { + cmd.text(POS_AND_SIZE, F("> "), OPT_CENTERY | OPT_RIGHTX); } #if ENABLED(SCROLL_LONG_FILENAMES) if (is_highlighted) { @@ -102,7 +106,7 @@ void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, void FilesScreen::drawFileList() { FileList files; - screen_data.FilesScreen.num_page = max(1,(ceil)(float(files.count()) / files_per_page)); + screen_data.FilesScreen.num_page = max(1,ceil(float(files.count()) / files_per_page)); screen_data.FilesScreen.cur_page = min(screen_data.FilesScreen.cur_page, screen_data.FilesScreen.num_page-1); screen_data.FilesScreen.flags.is_root = files.isAtRootDir(); @@ -134,7 +138,6 @@ void FilesScreen::drawHeader() { sprintf_P(str, PSTR("Page %d of %d"), screen_data.FilesScreen.cur_page + 1, screen_data.FilesScreen.num_page); - CommandProcessor cmd; cmd.colors(normal_btn) .font(font_small) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 92e6b230f7..ae48f75240 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -96,7 +96,7 @@ enum { #define STATUS_SCREEN_DL_SIZE 2048 #define ALERT_BOX_DL_SIZE 3072 #define SPINNER_DL_SIZE 3072 -#define FILE_SCREEN_DL_SIZE 3072 +#define FILE_SCREEN_DL_SIZE 4160 #define PRINTING_SCREEN_DL_SIZE 2048 /************************* MENU SCREEN DECLARATIONS *************************/ From 83dba77955d7b70e933a108055216e42a394c892 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 6 Sep 2020 15:51:19 -0700 Subject: [PATCH 0193/1370] Clarify disabling StallGuard for axes (#19263) --- Marlin/Configuration_adv.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e4b3fbf2ae..2712312747 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2487,7 +2487,7 @@ #define E7_HYBRID_THRESHOLD 30 /** - * Use StallGuard2 to home / probe X, Y, Z. + * Use StallGuard to home / probe X, Y, Z. * * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. @@ -2508,6 +2508,8 @@ * * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when * homing and adds a guard period for endstop triggering. + * + * Comment *_STALL_SENSITIVITY to disable sensorless homing for that axis. */ //#define SENSORLESS_HOMING // StallGuard capable drivers only From a8db9f52ecdc52d6b5e4860b164d3bcab4981ae2 Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Sun, 6 Sep 2020 20:00:24 -0500 Subject: [PATCH 0194/1370] Menu items for Separate NeoPixel (#19280) --- Marlin/src/feature/leds/leds.cpp | 10 ++++++ Marlin/src/feature/leds/leds.h | 2 +- Marlin/src/inc/SanityCheck.h | 18 ++++++----- Marlin/src/lcd/language/language_en.h | 4 +++ Marlin/src/lcd/menu/menu_led.cpp | 44 +++++++++++++++++++++++++-- 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index 01bca80926..28a6814b43 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -183,7 +183,17 @@ void LEDLights::set_color(const LEDColor &incol : neo2.Color(incol.r, incol.g, incol.b, incol.w); neo2.set_brightness(incol.i); neo2.set_color(neocolor); + + #if ENABLED(LED_CONTROL_MENU) + // Don't update the color when OFF + lights_on = !incol.is_off(); + if (lights_on) color = incol; + #endif } + + #if ENABLED(LED_CONTROL_MENU) + void LEDLights2::toggle() { if (lights_on) set_off(); else update(); } + #endif #endif // NEOPIXEL2_SEPARATE diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index a13f960a3b..055ea0df37 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -240,7 +240,7 @@ extern LEDLights leds; static inline void set_violet() { set_color(LEDColorViolet()); } #endif - #if ENABLED(LED_CONTROL_MENU) + #if ENABLED(NEOPIXEL2_SEPARATE) static LEDColor color; // last non-off color static bool lights_on; // the last set color was "on" static void toggle(); // swap "off" with color diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 17501177a8..0c79ead373 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2119,18 +2119,20 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if !(_RGB_TEST && PIN_EXISTS(RGB_LED_W)) #error "RGBW_LED requires RGB_LED_R_PIN, RGB_LED_G_PIN, RGB_LED_B_PIN, and RGB_LED_W_PIN." #endif -#elif ENABLED(NEOPIXEL_LED) - #if !(PIN_EXISTS(NEOPIXEL) && NEOPIXEL_PIXELS > 0) +#endif +#undef _RGB_TEST + +// NeoPixel requirements +#if ENABLED(NEOPIXEL_LED) + #if !PIN_EXISTS(NEOPIXEL) || NEOPIXEL_PIXELS == 0 #error "NEOPIXEL_LED requires NEOPIXEL_PIN and NEOPIXEL_PIXELS." - #endif - #elif ENABLED(NEOPIXEL2_SEPARATE) - #if !(PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) - #error "NEOPIXEL2 requires NEOPIXEL2_PIN and NEOPIXEL2_PIXELS." + #elif ENABLED(NEOPIXEL2_SEPARATE) && !(NEOPIXEL2_TYPE && PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) + #error "NEOPIXEL2_SEPARATE requires NEOPIXEL2_PIN, NEOPIXEL2_TYPE and NEOPIXEL2_PIXELS." + #elif ENABLED(NEO2_COLOR_PRESETS) && DISABLED(NEOPIXEL2_SEPARATE) + #error "NEO2_COLOR_PRESETS requires NEOPIXEL2_SEPARATE to be enabled." #endif #endif -#undef _RGB_TEST - #if DISABLED(NO_COMPILE_TIME_PWM) #define _TEST_PWM(P) PWM_PIN(P) #else diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 39bb85d378..8ae40304bd 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -222,6 +222,10 @@ namespace Language_en { PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("White"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Default"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Channel ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Lights #2"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Light #2 Presets"); + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Brightness"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Custom Lights"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Red Intensity"); PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Green Intensity"); diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 290b0ddf63..386a4d799a 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -54,9 +54,33 @@ #endif + #if ENABLED(NEO2_COLOR_PRESETS) + + void menu_leds2_presets() { + START_MENU(); + #if LCD_HEIGHT > 2 + STATIC_ITEM(MSG_NEO2_PRESETS, SS_DEFAULT|SS_INVERT); + #endif + BACK_ITEM(MSG_LED_CONTROL); + ACTION_ITEM(MSG_SET_LEDS_WHITE, leds2.set_white); + ACTION_ITEM(MSG_SET_LEDS_RED, leds2.set_red); + ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds2.set_orange); + ACTION_ITEM(MSG_SET_LEDS_YELLOW, leds2.set_yellow); + ACTION_ITEM(MSG_SET_LEDS_GREEN, leds2.set_green); + ACTION_ITEM(MSG_SET_LEDS_BLUE, leds2.set_blue); + ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds2.set_indigo); + ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds2.set_violet); + END_MENU(); + } + + #endif + void menu_led_custom() { START_MENU(); BACK_ITEM(MSG_LED_CONTROL); + #if ENABLED(NEOPIXEL2_SEPARATE) + STATIC_ITEM_N(MSG_LED_CHANNEL_N, 1, SS_DEFAULT|SS_INVERT); + #endif EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds.color.r, 0, 255, leds.update, true); EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds.color.g, 0, 255, leds.update, true); EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds.color.b, 0, 255, leds.update, true); @@ -66,6 +90,14 @@ EDIT_ITEM(uint8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true); #endif #endif + #if ENABLED(NEOPIXEL2_SEPARATE) + STATIC_ITEM_N(MSG_LED_CHANNEL_N, 2, SS_DEFAULT|SS_INVERT); + EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds2.color.r, 0, 255, leds2.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds2.color.g, 0, 255, leds2.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds2.color.b, 0, 255, leds2.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds2.color.w, 0, 255, leds2.update, true); + EDIT_ITEM(uint8, MSG_NEO2_BRIGHTNESS, &leds2.color.i, 0, 255, leds2.update, true); + #endif END_MENU(); } #endif @@ -89,12 +121,20 @@ void menu_led() { BACK_ITEM(MSG_MAIN); #if ENABLED(LED_CONTROL_MENU) - bool led_on = leds.lights_on; - EDIT_ITEM(bool, MSG_LEDS, &led_on, leds.toggle); + editable.state = leds.lights_on; + EDIT_ITEM(bool, MSG_LEDS, &editable.state, leds.toggle); ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds.set_default); + #if ENABLED(NEOPIXEL2_SEPARATE) + editable.state = leds2.lights_on; + EDIT_ITEM(bool, MSG_LEDS2, &editable.state, leds2.toggle); + ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds2.set_default); + #endif #if ENABLED(LED_COLOR_PRESETS) SUBMENU(MSG_LED_PRESETS, menu_led_presets); #endif + #if ENABLED(NEO2_COLOR_PRESETS) + SUBMENU(MSG_NEO2_PRESETS, menu_leds2_presets); + #endif SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom); #endif From 643f1925150b8c2a72a3e6ffa19bc63f1255e20a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 6 Sep 2020 22:04:20 -0300 Subject: [PATCH 0195/1370] STM32F1 EP with USB_COMPOSITE (#19281) --- Marlin/src/HAL/STM32F1/msc_sd.cpp | 18 +++++++++++++++++- Marlin/src/HAL/STM32F1/msc_sd.h | 20 +++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index ab5530174e..6a4652e467 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -21,7 +21,7 @@ #define PRODUCT_ID 0x29 USBMassStorage MarlinMSC; -USBCompositeSerial MarlinCompositeSerial; +MarlinUSBCompositeSerial MarlinCompositeSerial; #include "../../inc/MarlinConfig.h" @@ -38,6 +38,17 @@ USBCompositeSerial MarlinCompositeSerial; #endif +#if ENABLED(EMERGENCY_PARSER) + void (*real_rx_callback)(void); + + void my_rx_callback(void) { + real_rx_callback(); + int len = MarlinCompositeSerial.available(); + while (len-- > 0) // >0 because available() may return a negative value + emergency_parser.update(MarlinCompositeSerial.emergency_state, MarlinCompositeSerial.peek()); + } +#endif + void MSC_SD_init() { USBComposite.setProductId(PRODUCT_ID); // Just set MarlinCompositeSerial enabled to true @@ -59,6 +70,11 @@ void MSC_SD_init() { // Register composite Serial MarlinCompositeSerial.registerComponent(); USBComposite.begin(); + #if ENABLED(EMERGENCY_PARSER) + //rx is usbSerialPart.endpoints[2] + real_rx_callback = usbSerialPart.endpoints[2].callback; + usbSerialPart.endpoints[2].callback = my_rx_callback; + #endif } #endif // USE_USB_COMPOSITE diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h index 8715888f47..d9cdbe6bb3 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.h +++ b/Marlin/src/HAL/STM32F1/msc_sd.h @@ -17,7 +17,25 @@ #include +#include "../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +class MarlinUSBCompositeSerial : public USBCompositeSerial { +public: + MarlinUSBCompositeSerial() : USBCompositeSerial() + #if ENABLED(EMERGENCY_PARSER) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { } + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif +}; + extern USBMassStorage MarlinMSC; -extern USBCompositeSerial MarlinCompositeSerial; +extern MarlinUSBCompositeSerial MarlinCompositeSerial; void MSC_SD_init(); From a1860ed68019d004d290912ed38f29f1d0a4c2aa Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 6 Sep 2020 18:10:25 -0700 Subject: [PATCH 0196/1370] Adjust GTR PeripheralPins to avoid timer conflicts (#19183) --- .../variants/BIGTREE_GTR_V1/PeripheralPins.c | 103 ++++++++++-------- .../variants/BIGTREE_GTR_V1/variant.h | 4 +- 2 files changed, 57 insertions(+), 50 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c index 4014a519a3..db0a439562 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c @@ -125,38 +125,62 @@ const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED const PinMap PinMap_PWM[] = { - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 HEATER0 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 HEATER1 - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 HEATER2 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 BED - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN0 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN2 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 EXTENSION1-4 - {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 BL-TOUCH-SERVO - // These pins have been defined for something else on the board but they MIGHT be - // used by the user as PWM pins if they aren't used for their primary purpose. + // Some pins can perform PWM from more than one timer. These were selected to utilize as many channels as + // possible from timers which were already dedicated to PWM output. + // TIM1 = [FAN4, FAN5, HEATER6, FAN7] + // TIM2 = [, HEATER1, BED, ] + // TIM3 = [, , HEATER2, HEATER0] + // TIM4 = [HEATER5, HEATER4, , HEATER3] + // TIM8 = [FAN3, HEATER7, FAN2, FAN6] + // TIM9 = [FAN0, FAN1, , ] + + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 HEATER0 + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 HEATER1 + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 HEATER2 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 HEATER3 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 HEATER4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 HEATER5 + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 HEATER6 + {PI_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 HEATER7 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BED + + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN0 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN1 + {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN2 + {PI_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 FAN3 + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 FAN4 + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 FAN5 + {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 FAN6 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 FAN7 + + + // Alternate timer assignments for pins commonly using PWM + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N HEATER0 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N HEATER0 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 HEATER1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N HEATER2 + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N HEATER2 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 BED + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 BED + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 FAN2 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 FAN6 + + // Pins with an available timer channel, on a timer already allocated for PWM. + // These can be freely used for purposes requiring PWM, without creating new timer conflicts. + // This pins are very likely already used for other purposes and enabling PWM on them won't be useful. + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 BLTouch / Probe Output {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 ESP8266 connector. Available if 8266 isn't used {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 ESP8266 connector. Available if 8266 isn't used - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 I2C connector, SDA pin. Available if I2C isn't used. - // TIM5_CH1 is used by the Servo Library - {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 BL-TOUCH port. Available if Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - /** - * Unused by specifications on SKR-Pro. + /* + * Pins not utilizing hardware PWM on the GTR. * Uncomment the corresponding line if you want to have HardwarePWM on some pins. * WARNING: check timers' usage first to avoid conflicts. * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) - * If you alter this section DO NOT report bugs to Marlin team since they are most likely caused by you. Thank you. */ //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 BLTOUCH is a "servo" - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BLTOUCH is a "servo" - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 @@ -173,20 +197,16 @@ const PinMap PinMap_PWM[] = { //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N @@ -197,30 +217,17 @@ const PinMap PinMap_PWM[] = { //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - #endif - #if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - {PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - {PI_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - {PI_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - #endif + //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h index 1ba0a18d6a..2da195c6cf 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h @@ -255,8 +255,8 @@ extern "C" { // Timer Definitions //Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c -#define TIMER_TONE TIM2 -#define TIMER_SERVO TIM5 // Only 1 Servo PIN on SKR-PRO, so use the same timer as defined in PeripheralPins +#define TIMER_TONE TIM10 +#define TIMER_SERVO TIM5 #define TIMER_SERIAL TIM7 // UART Definitions From 9172271c7f2e563877707aa55dc92ee2ce2c11ec Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 6 Sep 2020 22:51:53 -0500 Subject: [PATCH 0197/1370] Whitespace cleanup --- Marlin/src/feature/leds/leds.cpp | 4 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 2 +- .../ftdi_eve_lib/extended/dl_cache.cpp | 10 +- .../ftdi_eve_lib/extended/dl_cache.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- .../variants/megaextendedpins/pins_arduino.h | 428 +++++++++--------- 7 files changed, 227 insertions(+), 225 deletions(-) diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index 28a6814b43..ef9099fb20 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -183,14 +183,14 @@ void LEDLights::set_color(const LEDColor &incol : neo2.Color(incol.r, incol.g, incol.b, incol.w); neo2.set_brightness(incol.i); neo2.set_color(neocolor); - + #if ENABLED(LED_CONTROL_MENU) // Don't update the color when OFF lights_on = !incol.is_off(); if (lights_on) color = incol; #endif } - + #if ENABLED(LED_CONTROL_MENU) void LEDLights2::toggle() { if (lights_on) set_off(); else update(); } #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 1de962826a..9b54dbdd2b 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -413,7 +413,7 @@ void AnycubicTFTClass::RenderCurrentFileList() { uint16_t selectedNumber = 0; SelectedDirectory[0] = 0; SelectedFile[0] = 0; - ExtUI::FileList currentFileList; + ExtUI::FileList currentFileList; SENDLINE_PGM("FN "); // Filelist start diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp index 439541bd51..f736916a3b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -117,11 +117,12 @@ bool DLCache::store(uint32_t min_bytes /* = 0*/) { // If we are allocating new space... dl_slot_addr = CLCD::mem_read_32(DL_FREE_ADDR); dl_slot_size = max(dl_size, min_bytes); - + const uint32_t free_space = MAP::RAM_G_SIZE - dl_slot_addr; - if(dl_slot_size <= free_space) { + if (dl_slot_size <= free_space) { CLCD::mem_write_32(DL_FREE_ADDR, dl_slot_addr + dl_slot_size); - } else { + } + else { dl_slot_addr = 0; dl_slot_size = 0; dl_slot_used = 0; @@ -138,7 +139,8 @@ bool DLCache::store(uint32_t min_bytes /* = 0*/) { dl_slot_used = 0; save_slot(); return false; - } else { + } + else { #if ENABLED(TOUCH_UI_DEBUG) SERIAL_ECHO_START(); SERIAL_ECHOPAIR ("Saving DL to RAMG cache, bytes: ", dl_slot_used); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h index c4bb22fbd7..da927aeae2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h @@ -51,7 +51,7 @@ class DLCache { void load_slot() {load_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} void save_slot() {save_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} - + static void load_slot(uint8_t indx, uint32_t &addr, uint16_t &size, uint16_t &used); static void save_slot(uint8_t indx, uint32_t addr, uint16_t size, uint16_t used); diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index cb3ab62cc2..19b04c9e7c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -87,7 +87,7 @@ #define MOTOR_CURRENT_PWM_E_PIN PB0 #define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp #ifndef DEFAULT_PWM_MOTOR_CURRENT - #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } + #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } #endif // // Temperature Sensors @@ -180,7 +180,7 @@ #define TFT_DRIVER ILI9341 #define TFT_BUFFER_SIZE 14400 - + // YV for normal screen mounting #define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV // XV for 180° rotated screen mounting diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index d54a794616..d66338b8ad 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -293,7 +293,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET 349 #endif - + #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h index 77d0beca9b..81f2ae3e19 100755 --- a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h +++ b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h @@ -160,77 +160,77 @@ const uint16_t PROGMEM port_to_input_PGM[] = { }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { - // PORTLIST - // ------------------------------------------- - PE , // PE 0 ** 0 ** USART0_RX - PE , // PE 1 ** 1 ** USART0_TX - PE , // PE 4 ** 2 ** PWM2 - PE , // PE 5 ** 3 ** PWM3 - PG , // PG 5 ** 4 ** PWM4 - PE , // PE 3 ** 5 ** PWM5 - PH , // PH 3 ** 6 ** PWM6 - PH , // PH 4 ** 7 ** PWM7 - PH , // PH 5 ** 8 ** PWM8 - PH , // PH 6 ** 9 ** PWM9 - PB , // PB 4 ** 10 ** PWM10 - PB , // PB 5 ** 11 ** PWM11 - PB , // PB 6 ** 12 ** PWM12 - PB , // PB 7 ** 13 ** PWM13 - PJ , // PJ 1 ** 14 ** USART3_TX - PJ , // PJ 0 ** 15 ** USART3_RX - PH , // PH 1 ** 16 ** USART2_TX - PH , // PH 0 ** 17 ** USART2_RX - PD , // PD 3 ** 18 ** USART1_TX - PD , // PD 2 ** 19 ** USART1_RX - PD , // PD 1 ** 20 ** I2C_SDA - PD , // PD 0 ** 21 ** I2C_SCL - PA , // PA 0 ** 22 ** D22 - PA , // PA 1 ** 23 ** D23 - PA , // PA 2 ** 24 ** D24 - PA , // PA 3 ** 25 ** D25 - PA , // PA 4 ** 26 ** D26 - PA , // PA 5 ** 27 ** D27 - PA , // PA 6 ** 28 ** D28 - PA , // PA 7 ** 29 ** D29 - PC , // PC 7 ** 30 ** D30 - PC , // PC 6 ** 31 ** D31 - PC , // PC 5 ** 32 ** D32 - PC , // PC 4 ** 33 ** D33 - PC , // PC 3 ** 34 ** D34 - PC , // PC 2 ** 35 ** D35 - PC , // PC 1 ** 36 ** D36 - PC , // PC 0 ** 37 ** D37 - PD , // PD 7 ** 38 ** D38 - PG , // PG 2 ** 39 ** D39 - PG , // PG 1 ** 40 ** D40 - PG , // PG 0 ** 41 ** D41 - PL , // PL 7 ** 42 ** D42 - PL , // PL 6 ** 43 ** D43 - PL , // PL 5 ** 44 ** D44 - PL , // PL 4 ** 45 ** D45 - PL , // PL 3 ** 46 ** D46 - PL , // PL 2 ** 47 ** D47 - PL , // PL 1 ** 48 ** D48 - PL , // PL 0 ** 49 ** D49 - PB , // PB 3 ** 50 ** SPI_MISO - PB , // PB 2 ** 51 ** SPI_MOSI - PB , // PB 1 ** 52 ** SPI_SCK - PB , // PB 0 ** 53 ** SPI_SS - PF , // PF 0 ** 54 ** A0 - PF , // PF 1 ** 55 ** A1 - PF , // PF 2 ** 56 ** A2 - PF , // PF 3 ** 57 ** A3 - PF , // PF 4 ** 58 ** A4 - PF , // PF 5 ** 59 ** A5 - PF , // PF 6 ** 60 ** A6 - PF , // PF 7 ** 61 ** A7 - PK , // PK 0 ** 62 ** A8 - PK , // PK 1 ** 63 ** A9 - PK , // PK 2 ** 64 ** A10 - PK , // PK 3 ** 65 ** A11 - PK , // PK 4 ** 66 ** A12 - PK , // PK 5 ** 67 ** A13 - PK , // PK 6 ** 68 ** A14 + // PORTLIST + // ------------------------------------------- + PE , // PE 0 ** 0 ** USART0_RX + PE , // PE 1 ** 1 ** USART0_TX + PE , // PE 4 ** 2 ** PWM2 + PE , // PE 5 ** 3 ** PWM3 + PG , // PG 5 ** 4 ** PWM4 + PE , // PE 3 ** 5 ** PWM5 + PH , // PH 3 ** 6 ** PWM6 + PH , // PH 4 ** 7 ** PWM7 + PH , // PH 5 ** 8 ** PWM8 + PH , // PH 6 ** 9 ** PWM9 + PB , // PB 4 ** 10 ** PWM10 + PB , // PB 5 ** 11 ** PWM11 + PB , // PB 6 ** 12 ** PWM12 + PB , // PB 7 ** 13 ** PWM13 + PJ , // PJ 1 ** 14 ** USART3_TX + PJ , // PJ 0 ** 15 ** USART3_RX + PH , // PH 1 ** 16 ** USART2_TX + PH , // PH 0 ** 17 ** USART2_RX + PD , // PD 3 ** 18 ** USART1_TX + PD , // PD 2 ** 19 ** USART1_RX + PD , // PD 1 ** 20 ** I2C_SDA + PD , // PD 0 ** 21 ** I2C_SCL + PA , // PA 0 ** 22 ** D22 + PA , // PA 1 ** 23 ** D23 + PA , // PA 2 ** 24 ** D24 + PA , // PA 3 ** 25 ** D25 + PA , // PA 4 ** 26 ** D26 + PA , // PA 5 ** 27 ** D27 + PA , // PA 6 ** 28 ** D28 + PA , // PA 7 ** 29 ** D29 + PC , // PC 7 ** 30 ** D30 + PC , // PC 6 ** 31 ** D31 + PC , // PC 5 ** 32 ** D32 + PC , // PC 4 ** 33 ** D33 + PC , // PC 3 ** 34 ** D34 + PC , // PC 2 ** 35 ** D35 + PC , // PC 1 ** 36 ** D36 + PC , // PC 0 ** 37 ** D37 + PD , // PD 7 ** 38 ** D38 + PG , // PG 2 ** 39 ** D39 + PG , // PG 1 ** 40 ** D40 + PG , // PG 0 ** 41 ** D41 + PL , // PL 7 ** 42 ** D42 + PL , // PL 6 ** 43 ** D43 + PL , // PL 5 ** 44 ** D44 + PL , // PL 4 ** 45 ** D45 + PL , // PL 3 ** 46 ** D46 + PL , // PL 2 ** 47 ** D47 + PL , // PL 1 ** 48 ** D48 + PL , // PL 0 ** 49 ** D49 + PB , // PB 3 ** 50 ** SPI_MISO + PB , // PB 2 ** 51 ** SPI_MOSI + PB , // PB 1 ** 52 ** SPI_SCK + PB , // PB 0 ** 53 ** SPI_SS + PF , // PF 0 ** 54 ** A0 + PF , // PF 1 ** 55 ** A1 + PF , // PF 2 ** 56 ** A2 + PF , // PF 3 ** 57 ** A3 + PF , // PF 4 ** 58 ** A4 + PF , // PF 5 ** 59 ** A5 + PF , // PF 6 ** 60 ** A6 + PF , // PF 7 ** 61 ** A7 + PK , // PK 0 ** 62 ** A8 + PK , // PK 1 ** 63 ** A9 + PK , // PK 2 ** 64 ** A10 + PK , // PK 3 ** 65 ** A11 + PK , // PK 4 ** 66 ** A12 + PK , // PK 5 ** 67 ** A13 + PK , // PK 6 ** 68 ** A14 PK , // PK 7 ** 69 ** A15 PG , // PG 4 ** 70 ** D70 PG , // PG 3 ** 71 ** D71 @@ -251,78 +251,78 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = { }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { - // PIN IN PORT - // ------------------------------------------- - _BV( 0 ) , // PE 0 ** 0 ** USART0_RX - _BV( 1 ) , // PE 1 ** 1 ** USART0_TX - _BV( 4 ) , // PE 4 ** 2 ** PWM2 - _BV( 5 ) , // PE 5 ** 3 ** PWM3 - _BV( 5 ) , // PG 5 ** 4 ** PWM4 - _BV( 3 ) , // PE 3 ** 5 ** PWM5 - _BV( 3 ) , // PH 3 ** 6 ** PWM6 - _BV( 4 ) , // PH 4 ** 7 ** PWM7 - _BV( 5 ) , // PH 5 ** 8 ** PWM8 - _BV( 6 ) , // PH 6 ** 9 ** PWM9 - _BV( 4 ) , // PB 4 ** 10 ** PWM10 - _BV( 5 ) , // PB 5 ** 11 ** PWM11 - _BV( 6 ) , // PB 6 ** 12 ** PWM12 - _BV( 7 ) , // PB 7 ** 13 ** PWM13 - _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX - _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX - _BV( 1 ) , // PH 1 ** 16 ** USART2_TX - _BV( 0 ) , // PH 0 ** 17 ** USART2_RX - _BV( 3 ) , // PD 3 ** 18 ** USART1_TX - _BV( 2 ) , // PD 2 ** 19 ** USART1_RX - _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA - _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL - _BV( 0 ) , // PA 0 ** 22 ** D22 - _BV( 1 ) , // PA 1 ** 23 ** D23 - _BV( 2 ) , // PA 2 ** 24 ** D24 - _BV( 3 ) , // PA 3 ** 25 ** D25 - _BV( 4 ) , // PA 4 ** 26 ** D26 - _BV( 5 ) , // PA 5 ** 27 ** D27 - _BV( 6 ) , // PA 6 ** 28 ** D28 - _BV( 7 ) , // PA 7 ** 29 ** D29 - _BV( 7 ) , // PC 7 ** 30 ** D30 - _BV( 6 ) , // PC 6 ** 31 ** D31 - _BV( 5 ) , // PC 5 ** 32 ** D32 - _BV( 4 ) , // PC 4 ** 33 ** D33 - _BV( 3 ) , // PC 3 ** 34 ** D34 - _BV( 2 ) , // PC 2 ** 35 ** D35 - _BV( 1 ) , // PC 1 ** 36 ** D36 - _BV( 0 ) , // PC 0 ** 37 ** D37 - _BV( 7 ) , // PD 7 ** 38 ** D38 - _BV( 2 ) , // PG 2 ** 39 ** D39 - _BV( 1 ) , // PG 1 ** 40 ** D40 - _BV( 0 ) , // PG 0 ** 41 ** D41 - _BV( 7 ) , // PL 7 ** 42 ** D42 - _BV( 6 ) , // PL 6 ** 43 ** D43 - _BV( 5 ) , // PL 5 ** 44 ** D44 - _BV( 4 ) , // PL 4 ** 45 ** D45 - _BV( 3 ) , // PL 3 ** 46 ** D46 - _BV( 2 ) , // PL 2 ** 47 ** D47 - _BV( 1 ) , // PL 1 ** 48 ** D48 - _BV( 0 ) , // PL 0 ** 49 ** D49 - _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO - _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI - _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK - _BV( 0 ) , // PB 0 ** 53 ** SPI_SS - _BV( 0 ) , // PF 0 ** 54 ** A0 - _BV( 1 ) , // PF 1 ** 55 ** A1 - _BV( 2 ) , // PF 2 ** 56 ** A2 - _BV( 3 ) , // PF 3 ** 57 ** A3 - _BV( 4 ) , // PF 4 ** 58 ** A4 - _BV( 5 ) , // PF 5 ** 59 ** A5 - _BV( 6 ) , // PF 6 ** 60 ** A6 - _BV( 7 ) , // PF 7 ** 61 ** A7 - _BV( 0 ) , // PK 0 ** 62 ** A8 - _BV( 1 ) , // PK 1 ** 63 ** A9 - _BV( 2 ) , // PK 2 ** 64 ** A10 - _BV( 3 ) , // PK 3 ** 65 ** A11 - _BV( 4 ) , // PK 4 ** 66 ** A12 - _BV( 5 ) , // PK 5 ** 67 ** A13 - _BV( 6 ) , // PK 6 ** 68 ** A14 - _BV( 7 ) , // PK 7 ** 69 ** A15 + // PIN IN PORT + // ------------------------------------------- + _BV( 0 ) , // PE 0 ** 0 ** USART0_RX + _BV( 1 ) , // PE 1 ** 1 ** USART0_TX + _BV( 4 ) , // PE 4 ** 2 ** PWM2 + _BV( 5 ) , // PE 5 ** 3 ** PWM3 + _BV( 5 ) , // PG 5 ** 4 ** PWM4 + _BV( 3 ) , // PE 3 ** 5 ** PWM5 + _BV( 3 ) , // PH 3 ** 6 ** PWM6 + _BV( 4 ) , // PH 4 ** 7 ** PWM7 + _BV( 5 ) , // PH 5 ** 8 ** PWM8 + _BV( 6 ) , // PH 6 ** 9 ** PWM9 + _BV( 4 ) , // PB 4 ** 10 ** PWM10 + _BV( 5 ) , // PB 5 ** 11 ** PWM11 + _BV( 6 ) , // PB 6 ** 12 ** PWM12 + _BV( 7 ) , // PB 7 ** 13 ** PWM13 + _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX + _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX + _BV( 1 ) , // PH 1 ** 16 ** USART2_TX + _BV( 0 ) , // PH 0 ** 17 ** USART2_RX + _BV( 3 ) , // PD 3 ** 18 ** USART1_TX + _BV( 2 ) , // PD 2 ** 19 ** USART1_RX + _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA + _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL + _BV( 0 ) , // PA 0 ** 22 ** D22 + _BV( 1 ) , // PA 1 ** 23 ** D23 + _BV( 2 ) , // PA 2 ** 24 ** D24 + _BV( 3 ) , // PA 3 ** 25 ** D25 + _BV( 4 ) , // PA 4 ** 26 ** D26 + _BV( 5 ) , // PA 5 ** 27 ** D27 + _BV( 6 ) , // PA 6 ** 28 ** D28 + _BV( 7 ) , // PA 7 ** 29 ** D29 + _BV( 7 ) , // PC 7 ** 30 ** D30 + _BV( 6 ) , // PC 6 ** 31 ** D31 + _BV( 5 ) , // PC 5 ** 32 ** D32 + _BV( 4 ) , // PC 4 ** 33 ** D33 + _BV( 3 ) , // PC 3 ** 34 ** D34 + _BV( 2 ) , // PC 2 ** 35 ** D35 + _BV( 1 ) , // PC 1 ** 36 ** D36 + _BV( 0 ) , // PC 0 ** 37 ** D37 + _BV( 7 ) , // PD 7 ** 38 ** D38 + _BV( 2 ) , // PG 2 ** 39 ** D39 + _BV( 1 ) , // PG 1 ** 40 ** D40 + _BV( 0 ) , // PG 0 ** 41 ** D41 + _BV( 7 ) , // PL 7 ** 42 ** D42 + _BV( 6 ) , // PL 6 ** 43 ** D43 + _BV( 5 ) , // PL 5 ** 44 ** D44 + _BV( 4 ) , // PL 4 ** 45 ** D45 + _BV( 3 ) , // PL 3 ** 46 ** D46 + _BV( 2 ) , // PL 2 ** 47 ** D47 + _BV( 1 ) , // PL 1 ** 48 ** D48 + _BV( 0 ) , // PL 0 ** 49 ** D49 + _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO + _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI + _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK + _BV( 0 ) , // PB 0 ** 53 ** SPI_SS + _BV( 0 ) , // PF 0 ** 54 ** A0 + _BV( 1 ) , // PF 1 ** 55 ** A1 + _BV( 2 ) , // PF 2 ** 56 ** A2 + _BV( 3 ) , // PF 3 ** 57 ** A3 + _BV( 4 ) , // PF 4 ** 58 ** A4 + _BV( 5 ) , // PF 5 ** 59 ** A5 + _BV( 6 ) , // PF 6 ** 60 ** A6 + _BV( 7 ) , // PF 7 ** 61 ** A7 + _BV( 0 ) , // PK 0 ** 62 ** A8 + _BV( 1 ) , // PK 1 ** 63 ** A9 + _BV( 2 ) , // PK 2 ** 64 ** A10 + _BV( 3 ) , // PK 3 ** 65 ** A11 + _BV( 4 ) , // PK 4 ** 66 ** A12 + _BV( 5 ) , // PK 5 ** 67 ** A13 + _BV( 6 ) , // PK 6 ** 68 ** A14 + _BV( 7 ) , // PK 7 ** 69 ** A15 _BV( 4 ) , // PG 4 ** 70 ** D70 _BV( 3 ) , // PG 3 ** 71 ** D71 _BV( 2 ) , // PJ 2 ** 72 ** D72 @@ -342,77 +342,77 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { - // TIMERS - // ------------------------------------------- - NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX - NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX - TIMER3B , // PE 4 ** 2 ** PWM2 - TIMER3C , // PE 5 ** 3 ** PWM3 - TIMER0B , // PG 5 ** 4 ** PWM4 - TIMER3A , // PE 3 ** 5 ** PWM5 - TIMER4A , // PH 3 ** 6 ** PWM6 - TIMER4B , // PH 4 ** 7 ** PWM7 - TIMER4C , // PH 5 ** 8 ** PWM8 - TIMER2B , // PH 6 ** 9 ** PWM9 - TIMER2A , // PB 4 ** 10 ** PWM10 - TIMER1A , // PB 5 ** 11 ** PWM11 - TIMER1B , // PB 6 ** 12 ** PWM12 - TIMER0A , // PB 7 ** 13 ** PWM13 - NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX - NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX - NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX - NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX - NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX - NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX - NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA - NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL - NOT_ON_TIMER , // PA 0 ** 22 ** D22 - NOT_ON_TIMER , // PA 1 ** 23 ** D23 - NOT_ON_TIMER , // PA 2 ** 24 ** D24 - NOT_ON_TIMER , // PA 3 ** 25 ** D25 - NOT_ON_TIMER , // PA 4 ** 26 ** D26 - NOT_ON_TIMER , // PA 5 ** 27 ** D27 - NOT_ON_TIMER , // PA 6 ** 28 ** D28 - NOT_ON_TIMER , // PA 7 ** 29 ** D29 - NOT_ON_TIMER , // PC 7 ** 30 ** D30 - NOT_ON_TIMER , // PC 6 ** 31 ** D31 - NOT_ON_TIMER , // PC 5 ** 32 ** D32 - NOT_ON_TIMER , // PC 4 ** 33 ** D33 - NOT_ON_TIMER , // PC 3 ** 34 ** D34 - NOT_ON_TIMER , // PC 2 ** 35 ** D35 - NOT_ON_TIMER , // PC 1 ** 36 ** D36 - NOT_ON_TIMER , // PC 0 ** 37 ** D37 - NOT_ON_TIMER , // PD 7 ** 38 ** D38 - NOT_ON_TIMER , // PG 2 ** 39 ** D39 - NOT_ON_TIMER , // PG 1 ** 40 ** D40 - NOT_ON_TIMER , // PG 0 ** 41 ** D41 - NOT_ON_TIMER , // PL 7 ** 42 ** D42 - NOT_ON_TIMER , // PL 6 ** 43 ** D43 - TIMER5C , // PL 5 ** 44 ** D44 - TIMER5B , // PL 4 ** 45 ** D45 - TIMER5A , // PL 3 ** 46 ** D46 - NOT_ON_TIMER , // PL 2 ** 47 ** D47 - NOT_ON_TIMER , // PL 1 ** 48 ** D48 - NOT_ON_TIMER , // PL 0 ** 49 ** D49 - NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO - NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI - NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK - NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS - NOT_ON_TIMER , // PF 0 ** 54 ** A0 - NOT_ON_TIMER , // PF 1 ** 55 ** A1 - NOT_ON_TIMER , // PF 2 ** 56 ** A2 - NOT_ON_TIMER , // PF 3 ** 57 ** A3 - NOT_ON_TIMER , // PF 4 ** 58 ** A4 - NOT_ON_TIMER , // PF 5 ** 59 ** A5 - NOT_ON_TIMER , // PF 6 ** 60 ** A6 - NOT_ON_TIMER , // PF 7 ** 61 ** A7 - NOT_ON_TIMER , // PK 0 ** 62 ** A8 - NOT_ON_TIMER , // PK 1 ** 63 ** A9 - NOT_ON_TIMER , // PK 2 ** 64 ** A10 - NOT_ON_TIMER , // PK 3 ** 65 ** A11 - NOT_ON_TIMER , // PK 4 ** 66 ** A12 - NOT_ON_TIMER , // PK 5 ** 67 ** A13 - NOT_ON_TIMER , // PK 6 ** 68 ** A14 + // TIMERS + // ------------------------------------------- + NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX + NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX + TIMER3B , // PE 4 ** 2 ** PWM2 + TIMER3C , // PE 5 ** 3 ** PWM3 + TIMER0B , // PG 5 ** 4 ** PWM4 + TIMER3A , // PE 3 ** 5 ** PWM5 + TIMER4A , // PH 3 ** 6 ** PWM6 + TIMER4B , // PH 4 ** 7 ** PWM7 + TIMER4C , // PH 5 ** 8 ** PWM8 + TIMER2B , // PH 6 ** 9 ** PWM9 + TIMER2A , // PB 4 ** 10 ** PWM10 + TIMER1A , // PB 5 ** 11 ** PWM11 + TIMER1B , // PB 6 ** 12 ** PWM12 + TIMER0A , // PB 7 ** 13 ** PWM13 + NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX + NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX + NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX + NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX + NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX + NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX + NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA + NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL + NOT_ON_TIMER , // PA 0 ** 22 ** D22 + NOT_ON_TIMER , // PA 1 ** 23 ** D23 + NOT_ON_TIMER , // PA 2 ** 24 ** D24 + NOT_ON_TIMER , // PA 3 ** 25 ** D25 + NOT_ON_TIMER , // PA 4 ** 26 ** D26 + NOT_ON_TIMER , // PA 5 ** 27 ** D27 + NOT_ON_TIMER , // PA 6 ** 28 ** D28 + NOT_ON_TIMER , // PA 7 ** 29 ** D29 + NOT_ON_TIMER , // PC 7 ** 30 ** D30 + NOT_ON_TIMER , // PC 6 ** 31 ** D31 + NOT_ON_TIMER , // PC 5 ** 32 ** D32 + NOT_ON_TIMER , // PC 4 ** 33 ** D33 + NOT_ON_TIMER , // PC 3 ** 34 ** D34 + NOT_ON_TIMER , // PC 2 ** 35 ** D35 + NOT_ON_TIMER , // PC 1 ** 36 ** D36 + NOT_ON_TIMER , // PC 0 ** 37 ** D37 + NOT_ON_TIMER , // PD 7 ** 38 ** D38 + NOT_ON_TIMER , // PG 2 ** 39 ** D39 + NOT_ON_TIMER , // PG 1 ** 40 ** D40 + NOT_ON_TIMER , // PG 0 ** 41 ** D41 + NOT_ON_TIMER , // PL 7 ** 42 ** D42 + NOT_ON_TIMER , // PL 6 ** 43 ** D43 + TIMER5C , // PL 5 ** 44 ** D44 + TIMER5B , // PL 4 ** 45 ** D45 + TIMER5A , // PL 3 ** 46 ** D46 + NOT_ON_TIMER , // PL 2 ** 47 ** D47 + NOT_ON_TIMER , // PL 1 ** 48 ** D48 + NOT_ON_TIMER , // PL 0 ** 49 ** D49 + NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO + NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI + NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK + NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS + NOT_ON_TIMER , // PF 0 ** 54 ** A0 + NOT_ON_TIMER , // PF 1 ** 55 ** A1 + NOT_ON_TIMER , // PF 2 ** 56 ** A2 + NOT_ON_TIMER , // PF 3 ** 57 ** A3 + NOT_ON_TIMER , // PF 4 ** 58 ** A4 + NOT_ON_TIMER , // PF 5 ** 59 ** A5 + NOT_ON_TIMER , // PF 6 ** 60 ** A6 + NOT_ON_TIMER , // PF 7 ** 61 ** A7 + NOT_ON_TIMER , // PK 0 ** 62 ** A8 + NOT_ON_TIMER , // PK 1 ** 63 ** A9 + NOT_ON_TIMER , // PK 2 ** 64 ** A10 + NOT_ON_TIMER , // PK 3 ** 65 ** A11 + NOT_ON_TIMER , // PK 4 ** 66 ** A12 + NOT_ON_TIMER , // PK 5 ** 67 ** A13 + NOT_ON_TIMER , // PK 6 ** 68 ** A14 NOT_ON_TIMER , // PK 7 ** 69 ** A15 NOT_ON_TIMER , // PG 4 ** 70 ** D70 NOT_ON_TIMER , // PG 3 ** 71 ** D71 From c360705e6a72cd0fee4770c7ff668af5f2dd5d53 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 6 Sep 2020 21:40:58 -0500 Subject: [PATCH 0198/1370] Clean up LCD conditionals, DWIN --- Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/feature/power_monitor.h | 4 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 28 +++- Marlin/src/inc/Conditionals_post.h | 4 +- Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp | 2 +- Marlin/src/lcd/dwin/dwin_lcd.cpp | 28 +--- Marlin/src/lcd/dwin/dwin_lcd.h | 139 ++++++++++++++---- Marlin/src/lcd/dwin/{ => e3v2}/README.md | 0 Marlin/src/lcd/dwin/{ => e3v2}/dwin.cpp | 40 ++--- Marlin/src/lcd/dwin/{ => e3v2}/dwin.h | 4 +- .../lcd/dwin/{ => e3v2}/rotary_encoder.cpp | 8 +- .../src/lcd/dwin/{ => e3v2}/rotary_encoder.h | 4 +- Marlin/src/lcd/lcdprint.h | 2 +- Marlin/src/lcd/ultralcd.h | 24 +-- Marlin/src/module/settings.cpp | 2 +- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 27 ++-- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 14 +- Marlin/src/pins/mega/pins_MEGATRONICS.h | 2 +- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 9 +- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 2 +- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 11 +- Marlin/src/pins/sam/pins_ARCHIM2.h | 8 +- Marlin/src/pins/sam/pins_DUE3DOM.h | 2 +- Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 2 +- Marlin/src/pins/sam/pins_RADDS.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 2 +- Marlin/src/pins/sanguino/pins_ANET_10.h | 2 +- Marlin/src/pins/teensy2/pins_PRINTRBOARD.h | 2 +- Marlin/src/pins/teensy2/pins_TEENSYLU.h | 2 +- Marlin/src/sd/cardreader.cpp | 2 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 32 ++-- 35 files changed, 253 insertions(+), 169 deletions(-) rename Marlin/src/lcd/dwin/{ => e3v2}/README.md (100%) rename Marlin/src/lcd/dwin/{ => e3v2}/dwin.cpp (99%) rename Marlin/src/lcd/dwin/{ => e3v2}/dwin.h (99%) rename Marlin/src/lcd/dwin/{ => e3v2}/rotary_encoder.cpp (98%) rename Marlin/src/lcd/dwin/{ => e3v2}/rotary_encoder.h (97%) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e703eaf8d9..89791c9082 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -72,9 +72,9 @@ #endif #if ENABLED(DWIN_CREALITY_LCD) - #include "lcd/dwin/dwin.h" + #include "lcd/dwin/e3v2/dwin.h" #include "lcd/dwin/dwin_lcd.h" - #include "lcd/dwin/rotary_encoder.h" + #include "lcd/dwin/e3v2/rotary_encoder.h" #endif #if ENABLED(IIC_BL24CXX_EEPROM) diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index ca52ed74c6..a86bd07ec4 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -89,7 +89,9 @@ public: #endif #if HAS_SPI_LCD - FORCE_INLINE static bool display_enabled() { return flags != 0x00; } + #if HAS_GRAPHICAL_LCD && DISABLED(LIGHTWEIGHT_UI) + FORCE_INLINE static bool display_enabled() { return flags != 0x00; } + #endif #if ENABLED(POWER_MONITOR_CURRENT) static void draw_current(); FORCE_INLINE static bool current_display_enabled() { return TEST(flags, PM_DISP_BIT_I); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index e7651cc743..9bb1ebe238 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -61,7 +61,7 @@ #endif #if ENABLED(DWIN_CREALITY_LCD) - #include "../../../lcd/dwin/dwin.h" + #include "../../../lcd/dwin/e3v2/dwin.h" #endif #if HAS_MULTI_HOTEND diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 0e1f707898..be222a7b17 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -47,7 +47,7 @@ #include "../../lcd/ultralcd.h" #if ENABLED(DWIN_CREALITY_LCD) - #include "../../lcd/dwin/dwin.h" + #include "../../lcd/dwin/e3v2/dwin.h" #endif #if HAS_L64XX // set L6470 absolute position registers to counts diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 112ff93a0e..d5ef62b621 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -26,6 +26,7 @@ * Conditionals that need to be set before Configuration_adv.h or pins.h */ +// Kinematics #if ENABLED(MORGAN_SCARA) #define IS_SCARA 1 #define IS_KINEMATIC 1 @@ -35,10 +36,26 @@ #define IS_CARTESIAN 1 #endif +// MKS_LCD12864 is a variant of MKS_MINI_12864 #if ENABLED(MKS_LCD12864) #define MKS_MINI_12864 #endif +/** + * General Flags that may be set below by specific LCDs + * + * DOGLCD : Run a Graphical LCD through U8GLib (with MarlinUI) + * IS_ULTIPANEL : Define LCD_PINS_D5/6/7 for direct-connected "Ultipanel" LCDs + * IS_ULTRA_LCD : Ultra LCD, not necessarily Ultipanel. Used most often with NEWPANEL. + * IS_RRD_SC : Common RRD Smart Controller digital interface pins + * IS_RRD_FG_SC : Common RRD Full Graphical Smart Controller digital interface pins + * U8GLIB_ST7920 : Most common DOGM display SPI interface, supporting a "lightweight" display mode. + * U8GLIB_SH1106 : SH1106 OLED with I2C interface via U8GLib + * IS_U8GLIB_SSD1306 : SSD1306 OLED with I2C interface via U8GLib + * U8GLIB_SSD1309 : SSD1309 OLED with I2C interface via U8GLib + * U8GLIB_ST7565_64128N : ST7565 128x64 LCD with SPI interface via U8GLib + * U8GLIB_LM6059_AF : LM6059 with Hardware SPI via U8GLib + */ #if EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define MINIPANEL @@ -48,6 +65,11 @@ #define DOGLCD #define IS_ULTIPANEL +#elif EITHER(DWIN_MARLINUI_PORTRAIT, DWIN_MARLINUI_LANDSCAPE) + + #define IS_DWIN_MARLINUI 1 + #define IS_ULTIPANEL + #elif ENABLED(ZONESTAR_LCD) #define ADC_KEYPAD @@ -85,7 +107,6 @@ #elif ANY(miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864) - #define IS_ULTRA_LCD #define DOGLCD #define IS_ULTIPANEL @@ -234,9 +255,9 @@ // 128x64 I2C OLED LCDs - SSD1306/SSD1309/SH1106 #if ANY(U8GLIB_SSD1306, U8GLIB_SSD1309, U8GLIB_SH1106) - #define HAS_SSD1306_OLED_I2C 1 + #define HAS_U8GLIB_I2C_OLED 1 #endif -#if HAS_SSD1306_OLED_I2C +#if HAS_U8GLIB_I2C_OLED #define IS_ULTRA_LCD #define DOGLCD #endif @@ -402,7 +423,6 @@ #define IS_ULTRA_LCD #define NEWPANEL #endif - #if ENABLED(IS_ULTRA_LCD) #define ULTRA_LCD #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 71ae4bb285..89dc73fb5c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2612,14 +2612,14 @@ #ifndef LCD_WIDTH #if HAS_GRAPHICAL_LCD #define LCD_WIDTH 21 - #else + #elif HAS_CHARACTER_LCD #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) #endif #endif #ifndef LCD_HEIGHT #if HAS_GRAPHICAL_LCD #define LCD_HEIGHT 5 - #else + #elif HAS_CHARACTER_LCD #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) #endif #endif diff --git a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp index 9ba9b871ec..9fe69d4428 100644 --- a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp +++ b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp @@ -982,7 +982,7 @@ int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { if (max_length < 1) return 0; - // TODO: fix the '\\' that doesnt exist in the HD44870 + // TODO: fix the '\\' that doesn't exist in the HD44870 if (c < 128) { lcd.write((uint8_t)c); return 1; diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index b3d969cc8c..3b30629a8d 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -37,6 +37,9 @@ #include "dwin_lcd.h" #include // for memset +//#define DEBUG_OUT 1 +#include "../../core/debug_out.h" + // Make sure DWIN_SendBuf is large enough to hold the largest string plus draw command and tail. // Assume the narrowest (6 pixel) font and 2-byte gb2312-encoded characters. uint8_t DWIN_SendBuf[11 + DWIN_WIDTH / 6 * 2] = { 0xAA }; @@ -79,10 +82,8 @@ inline void DWIN_String(size_t &i, const __FlashStringHelper * string) { // Send the data in the buffer and the packet end inline void DWIN_Send(size_t &i) { ++i; - LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); - delayMicroseconds(1); } - LOOP_L_N(n, 4) { MYSERIAL1.write(DWIN_BufTail[n]); - delayMicroseconds(1); } + LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); delayMicroseconds(1); } + LOOP_L_N(n, 4) { MYSERIAL1.write(DWIN_BufTail[n]); delayMicroseconds(1); } } /*-------------------------------------- System variable function --------------------------------------*/ @@ -185,7 +186,6 @@ void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, DWIN_Send(i); } -// // Move a screen area // mode: 0, circle shift; 1, translation // dir: 0=left, 1=right, 2=up, 3=down @@ -230,19 +230,6 @@ void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, DWIN_Send(i); } -void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, - uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const __FlashStringHelper *string) { - size_t i = 0; - DWIN_Byte(i, 0x11); - DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); - DWIN_Word(i, color); - DWIN_Word(i, bColor); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_String(i, string); - DWIN_Send(i); -} - // Draw a positive integer // bShow: true=display background color; false=don't display background color // zeroFill: true=zero fill; false=no zero fill @@ -343,8 +330,9 @@ void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { DWIN_Send(i); } -// Unzip the JPG picture to virtual display area #1 -// id: picture ID +// Unzip the JPG picture to a virtual display area +// n: Cache index +// id: Picture ID void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { size_t i = 0; DWIN_Byte(i, 0x25); diff --git a/Marlin/src/lcd/dwin/dwin_lcd.h b/Marlin/src/lcd/dwin/dwin_lcd.h index 3fae1ccfc9..0893974e4c 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.h +++ b/Marlin/src/lcd/dwin/dwin_lcd.h @@ -42,70 +42,151 @@ #define DWIN_WIDTH 272 #define DWIN_HEIGHT 480 -/*接收数æ®è§£æž 返回值:true,接收到数æ®;false,未接收到数æ®*/ -bool DWIN_ReceiveAnalyze(void); +/*-------------------------------------- System variable function --------------------------------------*/ -/*å‘é€å½“å‰BUF中的数æ®ä»¥åŠåŒ…å°¾æ•°æ® len:整包数æ®é•¿åº¦*/ -void DWIN_Send_BufTail(const uint8_t len); - -/*----------------------------------------------系统å˜é‡å‡½æ•°----------------------------------------------*/ -/*æ¡æ‰‹ 1: æ¡æ‰‹æˆåŠŸ 2: æ¡æ‰‹å¤±è´¥*/ +// Handshake (1: Success, 0: Fail) bool DWIN_Handshake(void); -/*设定背光亮度 luminance:亮度(0x00~0xFF)*/ +// Common DWIN startup +void DWIN_Startup(void); + +// Set the backlight luminance +// luminance: (0x00-0xFF) void DWIN_Backlight_SetLuminance(const uint8_t luminance); -/*设定画é¢æ˜¾ç¤ºæ–¹å‘ dir:0,0°; 1,90°; 2,180°; 3,270°*/ +// Set screen display direction +// dir: 0=0°, 1=90°, 2=180°, 3=270° void DWIN_Frame_SetDir(uint8_t dir); -/*更新显示*/ +// Update display void DWIN_UpdateLCD(void); -/*----------------------------------------------绘图相关函数----------------------------------------------*/ -/*ç”»é¢æ¸…å± color:清å±é¢œè‰²*/ +/*---------------------------------------- Drawing functions ----------------------------------------*/ + +// Clear screen +// color: Clear screen color void DWIN_Frame_Clear(const uint16_t color); -/*ç”»é¢ç”»çº¿ color:线段颜色 xStart:X起始åæ ‡ yStart:Y起始åæ ‡ xEnd:X终止åæ ‡ yEnd:Y终止åæ ‡*/ +// Draw a line +// color: Line segment color +// xStart/yStart: Start point +// xEnd/yEnd: End point void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); -/*ç”»é¢ç”»çŸ©å½¢ mode:0,外框;1,å¡«å……;2,异或填充 color:颜色 xStart/yStart:矩形左上åæ ‡ xEnd/yEnd:矩形å³ä¸‹åæ ‡*/ +// Draw a Horizontal line +// color: Line segment color +// xStart/yStart: Start point +// xLength: Line Length +inline void DWIN_Draw_HLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xLength) { + DWIN_Draw_Line(color, xStart, yStart, xStart + xLength - 1, yStart); +} + +// Draw a Vertical line +// color: Line segment color +// xStart/yStart: Start point +// yLength: Line Length +inline void DWIN_Draw_VLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t yLength) { + DWIN_Draw_Line(color, xStart, yStart, xStart, yStart + yLength - 1); +} + +// Draw a rectangle +// mode: 0=frame, 1=fill, 2=XOR fill +// color: Rectangle color +// xStart/yStart: upper left point +// xEnd/yEnd: lower right point void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); -/*ç”»é¢åŒºåŸŸç§»åŠ¨ mode:0,环移;1,平移 dir:0,å‘左移动;1,å‘å³ç§»åŠ¨;2,å‘上移动;3,å‘下移动 dis:移动è·ç¦» - color:填充颜色 xStart/yStart:选定区域左上åæ ‡ xEnd/yEnd:选定区域å³ä¸‹åæ ‡*/ +// Draw a box +// mode: 0=frame, 1=fill, 2=XOR fill +// color: Rectangle color +// xStart/yStart: upper left point +// xSize/ySize: box size +inline void DWIN_Draw_Box(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xSize, uint16_t ySize) { + DWIN_Draw_Rectangle(mode, color, xStart, yStart, xStart + xSize - 1, yStart + ySize - 1); +} + +// Move a screen area +// mode: 0, circle shift; 1, translation +// dir: 0=left, 1=right, 2=up, 3=down +// dis: Distance +// color: Fill color +// xStart/yStart: upper left point +// xEnd/yEnd: bottom right point void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); -/*----------------------------------------------文本相关函数----------------------------------------------*/ -/*ç”»é¢æ˜¾ç¤ºå­—符串 widthAdjust:true,自调整字符宽度;false,ä¸è°ƒæ•´å­—符宽度 bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 x/y:字符串左上åæ ‡ *string:字符串*/ +/*---------------------------------------- Text related functions ----------------------------------------*/ + +// Draw a string +// widthAdjust: true=self-adjust character width; false=no adjustment +// bShow: true=display background color; false=don't display background color +// size: Font size +// color: Character color +// bColor: Background color +// x/y: Upper-left coordinate of the string +// *string: The string void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, char *string); -/*ç”»é¢æ˜¾ç¤ºæ­£æ•´æ•° bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² zeroFill:true,补零;false,ä¸è¡¥é›¶ zeroMode:1,无效0显示为0; 0,无效0显示为空格 size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 iNum:ä½æ•° x/y:å˜é‡å·¦ä¸Šåæ ‡ value:æ•´åž‹å˜é‡*/ +class __FlashStringHelper; + +inline void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const __FlashStringHelper *title) { + DWIN_Draw_String(widthAdjust, bShow, size, color, bColor, x, y, (char *)title); +} + +// Draw a positive integer +// bShow: true=display background color; false=don't display background color +// zeroFill: true=zero fill; false=no zero fill +// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space +// size: Font size +// color: Character color +// bColor: Background color +// iNum: Number of digits +// x/y: Upper-left coordinate +// value: Integer value void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint16_t value); -/*ç”»é¢æ˜¾ç¤ºæµ®ç‚¹æ•° bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² zeroFill:true,补零;false,ä¸è¡¥é›¶ zeroMode:1,无效0显示为0; 0,无效0显示为空格 size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 iNum:æ•´æ•°ä½æ•° fNum:å°æ•°ä½æ•° x/y:å˜é‡å·¦ä¸Šåæ ‡ value:浮点数å˜é‡*/ +// Draw a floating point number +// bShow: true=display background color; false=don't display background color +// zeroFill: true=zero fill; false=no zero fill +// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space +// size: Font size +// color: Character color +// bColor: Background color +// iNum: Number of whole digits +// fNum: Number of decimal digits +// x/y: Upper-left point +// value: Float value void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); -/*----------------------------------------------图片相关函数----------------------------------------------*/ -/*jpg图片显示并缓存在#0虚拟显示区 id:图片ID*/ +/*---------------------------------------- Picture related functions ----------------------------------------*/ + +// Draw JPG and cached in #0 virtual display area +// id: Picture ID void DWIN_JPG_ShowAndCache(const uint8_t id); -/*图标显示 libID:图标库ID picID:图标ID x/y:图标左上åæ ‡*/ +// Draw an Icon +// libID: Icon library ID +// picID: Icon ID +// x/y: Upper-left point void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y); -/*jpg图片解压到#1虚拟显示区 id:图片ID*/ +// Unzip the JPG picture to a virtual display area +// n: Cache index +// id: Picture ID void DWIN_JPG_CacheToN(uint8_t n, uint8_t id); -/*jpg图片解压到#1虚拟显示区 id:图片ID*/ +// Unzip the JPG picture to virtual display area #1 +// id: Picture ID inline void DWIN_JPG_CacheTo1(uint8_t id) { DWIN_JPG_CacheToN(1, id); } -/*从虚拟显示区å¤åˆ¶åŒºåŸŸè‡³å½“å‰ç”»é¢ cacheID:è™šæ‹ŸåŒºå· xStart/yStart:虚拟区左上åæ ‡ xEnd/yEnd:虚拟区å³ä¸‹åæ ‡ x/y:当å‰ç”»é¢ç²˜è´´åæ ‡*/ +// Copy area from virtual display area to current screen +// cacheID: virtual area number +// xStart/yStart: Upper-left of virtual area +// xEnd/yEnd: Lower-right of virtual area +// x/y: Screen paste point void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y); diff --git a/Marlin/src/lcd/dwin/README.md b/Marlin/src/lcd/dwin/e3v2/README.md similarity index 100% rename from Marlin/src/lcd/dwin/README.md rename to Marlin/src/lcd/dwin/e3v2/README.md diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp similarity index 99% rename from Marlin/src/lcd/dwin/dwin.cpp rename to Marlin/src/lcd/dwin/e3v2/dwin.cpp index 6bc0d74f23..1d9c83e6da 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -24,7 +24,7 @@ * DWIN by Creality3D */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if ENABLED(DWIN_CREALITY_LCD) @@ -38,35 +38,35 @@ #include #include -#include "../fontutils.h" -#include "../ultralcd.h" +#include "../../fontutils.h" +#include "../../ultralcd.h" -#include "../../sd/cardreader.h" +#include "../../../sd/cardreader.h" -#include "../../MarlinCore.h" -#include "../../core/serial.h" -#include "../../core/macros.h" -#include "../../gcode/queue.h" +#include "../../../MarlinCore.h" +#include "../../../core/serial.h" +#include "../../../core/macros.h" +#include "../../../gcode/queue.h" -#include "../../feature/powerloss.h" -#include "../../feature/babystep.h" +#include "../../../feature/powerloss.h" +#include "../../../feature/babystep.h" -#include "../../module/settings.h" -#include "../../module/temperature.h" -#include "../../module/printcounter.h" -#include "../../module/motion.h" -#include "../../module/planner.h" +#include "../../../module/settings.h" +#include "../../../module/temperature.h" +#include "../../../module/printcounter.h" +#include "../../../module/motion.h" +#include "../../../module/planner.h" #if ENABLED(HOST_ACTION_COMMANDS) - #include "../../feature/host_actions.h" + #include "../../../feature/host_actions.h" #endif #if HAS_ONESTEP_LEVELING - #include "../../feature/bedlevel/bedlevel.h" + #include "../../../feature/bedlevel/bedlevel.h" #endif #if HAS_BED_PROBE - #include "../../module/probe.h" + #include "../../../module/probe.h" #endif #ifndef MACHINE_SIZE @@ -1532,7 +1532,7 @@ void update_variable(void) { #define strcasecmp_P(a, b) strcasecmp((a), (b)) #endif -inline void make_name_without_ext(char *dst, char *src, int maxlen=MENU_CHAR_LIMIT) { +inline void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_LIMIT) { char * const name = card.longest_filename(); size_t pos = strlen(name); // index of ending nul @@ -2137,7 +2137,7 @@ inline void Draw_Move_Menu() { LOOP_L_N(i, MROWS) Draw_Menu_Line(i + 1, ICON_MoveX + i); } -#include "../../libs/buzzer.h" +#include "../../../libs/buzzer.h" void HMI_AudioFeedback(const bool success=true) { if (success) { diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h similarity index 99% rename from Marlin/src/lcd/dwin/dwin.h rename to Marlin/src/lcd/dwin/e3v2/dwin.h index 3446a0d4c1..dffd40bd03 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -25,9 +25,9 @@ * DWIN by Creality3D */ -#include "dwin_lcd.h" +#include "../dwin_lcd.h" #include "rotary_encoder.h" -#include "../../libs/BL24CXX.h" +#include "../../../libs/BL24CXX.h" #include diff --git a/Marlin/src/lcd/dwin/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp similarity index 98% rename from Marlin/src/lcd/dwin/rotary_encoder.cpp rename to Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp index 62e2cda351..e4c563cf6b 100644 --- a/Marlin/src/lcd/dwin/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp @@ -30,17 +30,17 @@ ****************************************************************************** **/ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if ENABLED(DWIN_CREALITY_LCD) #include "rotary_encoder.h" -#include "../../MarlinCore.h" -#include "../../HAL/shared/Delay.h" +#include "../../../MarlinCore.h" +#include "../../../HAL/shared/Delay.h" #if HAS_BUZZER - #include "../../libs/buzzer.h" + #include "../../../libs/buzzer.h" #endif #include diff --git a/Marlin/src/lcd/dwin/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h similarity index 97% rename from Marlin/src/lcd/dwin/rotary_encoder.h rename to Marlin/src/lcd/dwin/e3v2/rotary_encoder.h index 5c5a8f86a2..db074098eb 100644 --- a/Marlin/src/lcd/dwin/rotary_encoder.h +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h @@ -31,8 +31,8 @@ ****************************************************************************** **/ -#include "../../inc/MarlinConfig.h" -#include "../../MarlinCore.h" +#include "../../../inc/MarlinConfig.h" +#include "../../../MarlinCore.h" /*********************** Encoder Set ***********************/ diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 031d467bf9..8ea174bd65 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -79,7 +79,7 @@ #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) -#else +#elif HAS_CHARACTER_LCD #define _UxGT(a) a typedef uint8_t lcd_uint_t; diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index d6a9f31e6c..0200d39014 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -312,16 +312,18 @@ public: static void media_changed(const uint8_t old_stat, const uint8_t stat); #endif + #if ENABLED(DWIN_CREALITY_LCD) + static void refresh(); + #else + FORCE_INLINE static void refresh() { + TERN_(HAS_SPI_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW)); + } + #endif + #if HAS_SPI_LCD static bool detected(); static void init_lcd(); - FORCE_INLINE static void refresh() { refresh(LCDVIEW_CLEAR_CALL_REDRAW); } #else - #if ENABLED(DWIN_CREALITY_LCD) - static void refresh(); - #else - static inline void refresh() {} - #endif static inline bool detected() { return true; } static inline void init_lcd() {} #endif @@ -403,14 +405,10 @@ public: #if HAS_GRAPHICAL_LCD - static bool drawing_screen, first_page; - static void set_font(const MarlinFont font_nr); #else - static constexpr bool drawing_screen = false, first_page = true; - static void set_custom_characters(const HD44780CharSet screen_charset=CHARSET_INFO); #if ENABLED(LCD_PROGRESS_BAR) @@ -460,6 +458,12 @@ public: #endif + #if HAS_GRAPHICAL_LCD + static bool drawing_screen, first_page; + #else + static constexpr bool drawing_screen = false, first_page = true; + #endif + static bool get_blink(); static void kill_screen(PGM_P const lcd_error, PGM_P const lcd_component); static void draw_kill_screen(); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d5f41a3246..8af2071e36 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -52,7 +52,7 @@ #include "temperature.h" #if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/dwin.h" + #include "../lcd/dwin/e3v2/dwin.h" #endif #include "../lcd/ultralcd.h" diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index b162173bc6..6b22c50a7b 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -37,7 +37,7 @@ #include "../lcd/ultralcd.h" #if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/dwin.h" + #include "../lcd/dwin/e3v2/dwin.h" #endif #if ENABLED(EXTENSIBLE_UI) diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index c898072278..54f3dfd95c 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -289,20 +289,21 @@ #define E0_CS_PIN P2_11 #define E1_CS_PIN P4_28 -// Hardware SPI is on EXP2. See if you can make it work: -// https://github.com/makerbase-mks/MKS-SBASE/issues/25 -#define TMC_USE_SW_SPI -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P0_03 // AUX1 + // Hardware SPI is on EXP2. See if you can make it work: + // https://github.com/makerbase-mks/MKS-SBASE/issues/25 + #define TMC_USE_SW_SPI + #if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P0_03 // AUX1 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P0_02 // AUX1 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P0_26 // TH4 + #endif #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P0_02 // AUX1 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P0_26 // TH4 - #endif - #endif + #endif #if MB(MKS_SBASE) && HAS_TMC_UART diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 67482b3a49..de148995ca 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -125,16 +125,16 @@ // EXP1 Pins #define BEEPER_PIN P1_31 // EXP1 Pin 1 #define BTN_ENC P1_30 // EXP1 Pin 2 - #define LCD_PINS_ENABLE P0_18 // EXP1 Pin 3 (MOSI) - #define LCD_PINS_RS P0_16 // EXP1 Pin 4 (CS) + #define LCD_PINS_ENABLE P0_18 // EXP1 Pin 3 (MOSI) + #define LCD_PINS_RS P0_16 // EXP1 Pin 4 (CS) #define LCD_PINS_D4 P0_15 // EXP1 Pin 5 (SCK) - // EXP2 Pins + // EXP2 Pins #define BTN_EN2 P3_26 // EXP2 Pin 3 #define BTN_EN1 P3_25 // EXP2 Pin 5 - + /* SD Support - + For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be hooked up to the onboard SDCard SPI and use a spare pin for the SDCS. Also note that an external SDCard sharing the SPI port with the @@ -145,11 +145,11 @@ */ #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) - #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) + #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) - + #else #error "Marlin's Smoothieboard support cannot drive your LCD." #endif diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index 84346e5f66..2d98256fe7 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -124,7 +124,7 @@ #define SD_DETECT_PIN -1 // RAMPS doesn't use this -#endif // HAS_SPI_LCD && NEWPANEL +#endif // ULTRA_LCD && NEWPANEL // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index 0df977a05b..672c372414 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -166,11 +166,11 @@ // // LCD / Controller // -#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL || ENABLED(TOUCH_UI_FTDI_EVE) +#if ANY(HAS_SPI_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #define KILL_PIN 32 - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL || ENABLED(TOUCH_UI_FTDI_EVE) + #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS 85 @@ -194,5 +194,6 @@ #define SD_DETECT_PIN 15 - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_SPI_LCD + #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE + +#endif // HAS_SPI_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index f89bba2d7f..0c14d9f46b 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -189,4 +189,4 @@ #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_SPI_LCD +#endif // HAS_SPI_LCD || TOUCH_UI_ULTIPANEL diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index 7cd81456b1..4d08ed784d 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -144,17 +144,16 @@ // LCD / Controller // #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCD_PINS_RS 18 #define LCD_PINS_ENABLE 15 #define LCD_PINS_D4 19 #define BEEPER_PIN 64 + #undef UI_VOLTAGE_LEVEL + #define UI_VOLTAGE_LEVEL 1 +#endif +#if ENABLED(NEWPANEL) #define BTN_EN1 14 #define BTN_EN2 16 #define BTN_ENC 17 - - #undef UI_VOLTAGE_LEVEL - #define UI_VOLTAGE_LEVEL 1 - -#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +#endif diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h index bbd4804dbd..b527b51183 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM2.h +++ b/Marlin/src/pins/sam/pins_ARCHIM2.h @@ -237,7 +237,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL || ENABLED(TOUCH_UI_FTDI_EVE) +#if ANY(HAS_SPI_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #define BEEPER_PIN 23 // D24 PA15_CTS1 #define LCD_PINS_RS 17 // D17 PA12_RXD1 #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 @@ -248,10 +248,10 @@ #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL || ENABLED(TOUCH_UI_FTDI_EVE) + #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) // Buttons on AUX-2 #define BTN_EN1 60 // D60 PA3_TIOB1 #define BTN_EN2 13 // D13 PB27_TIOB0 #define BTN_ENC 16 // D16 PA13_TXD1 // the click - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_SPI_LCD + #endif +#endif diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index e0a56137f7..260a2810f5 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -147,7 +147,7 @@ #define SDSS 4 #define SD_DETECT_PIN 14 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BTN_EN1 50 #define BTN_EN2 52 diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 9a488e3126..946cadcfa9 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -139,7 +139,7 @@ #define SDSS 4 #define SD_DETECT_PIN 14 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BTN_EN1 50 #define BTN_EN2 52 diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index a0192aadb6..bbbfb2e558 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -266,7 +266,7 @@ #define SDSS 10 #define SD_DETECT_PIN 14 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BTN_EN1 50 #define BTN_EN2 52 diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index dd490e3893..3ecd64aa8a 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -221,7 +221,7 @@ #define LCD_PINS_RS 52 #define LCD_PINS_ENABLE 53 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BEEPER_PIN 62 #define LCD_SDSS 10 diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 8a6287fb65..2b52338d35 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -207,7 +207,7 @@ #define LCD_PINS_RS 52 #define LCD_PINS_ENABLE 53 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BEEPER_PIN 62 #define LCD_SDSS 10 diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index a2ef1e2c17..6830192f31 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -163,7 +163,7 @@ #define LCD_PINS_D6 16 #define LCD_PINS_D7 17 #define ADC_KEYPAD_PIN 1 - #elif EITHER(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD) + #elif EITHER(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index 51080b2fd1..7d96bd12ff 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -166,4 +166,4 @@ #endif -#endif // HAS_SPI_LCD && NEWPANEL +#endif // ULTRA_LCD && NEWPANEL diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index 8ee07a427d..c69a1c06a7 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -155,7 +155,7 @@ #define SD_DETECT_PIN -1 -#endif // HAS_SPI_LCD && NEWPANEL +#endif // ULTRA_LCD && NEWPANEL // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index f8f1bf18e6..538fca3c88 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -32,7 +32,7 @@ #include "../lcd/ultralcd.h" #if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/dwin.h" + #include "../lcd/dwin/e3v2/dwin.h" #endif #include "../module/planner.h" // for synchronize diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index 78f338fdae..a097df5105 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -94,9 +94,7 @@ static_assert(USB_INTR_PIN != -1, "USB_INTR_PIN must be defined"); #include "Sd2Card_FlashDrive.h" -#if HAS_DISPLAY - #include "../../lcd/ultralcd.h" -#endif +#include "../../lcd/ultralcd.h" static enum { UNINITIALIZED, @@ -116,9 +114,7 @@ bool Sd2Card::usbStartup() { SERIAL_ECHOPGM("Starting USB host..."); if (!UHS_START) { SERIAL_ECHOLNPGM(" failed."); - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - LCD_MESSAGEPGM(MSG_MEDIA_USB_FAILED); - #endif + LCD_MESSAGEPGM(MSG_MEDIA_USB_FAILED); return false; } @@ -213,9 +209,7 @@ void Sd2Card::idle() { #if USB_DEBUG >= 1 SERIAL_ECHOLNPGM("Waiting for media"); #endif - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - LCD_MESSAGEPGM(MSG_MEDIA_WAITING); - #endif + LCD_MESSAGEPGM(MSG_MEDIA_WAITING); GOTO_STATE_AFTER_DELAY(state, 2000); } break; @@ -229,11 +223,9 @@ void Sd2Card::idle() { #if USB_DEBUG >= 1 SERIAL_ECHOLNPGM("USB device removed"); #endif - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - if (state != MEDIA_READY) - LCD_MESSAGEPGM(MSG_MEDIA_USB_REMOVED); - #endif - GOTO_STATE_AFTER_DELAY( WAIT_FOR_DEVICE, 0 ); + if (state != MEDIA_READY) + LCD_MESSAGEPGM(MSG_MEDIA_USB_REMOVED); + GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0); } else if (state > WAIT_FOR_LUN && !bulk.LUNIsGood(0)) { @@ -241,17 +233,13 @@ void Sd2Card::idle() { #if USB_DEBUG >= 1 SERIAL_ECHOLNPGM("Media removed"); #endif - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - LCD_MESSAGEPGM(MSG_MEDIA_REMOVED); - #endif - GOTO_STATE_AFTER_DELAY( WAIT_FOR_DEVICE, 0 ); + LCD_MESSAGEPGM(MSG_MEDIA_REMOVED); + GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0); } else if (task_state == UHS_STATE(ERROR)) { - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - LCD_MESSAGEPGM(MSG_MEDIA_READ_ERROR); - #endif - GOTO_STATE_AFTER_DELAY( MEDIA_ERROR, 0 ); + LCD_MESSAGEPGM(MSG_MEDIA_READ_ERROR); + GOTO_STATE_AFTER_DELAY(MEDIA_ERROR, 0); } } } From b186ab90a2caa40887d3d64c65286d45087e2dda Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Mon, 7 Sep 2020 02:59:31 -0500 Subject: [PATCH 0199/1370] Separate Neopixel followup (#19287) --- Marlin/src/inc/SanityCheck.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 0c79ead373..9d05194184 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2126,8 +2126,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if ENABLED(NEOPIXEL_LED) #if !PIN_EXISTS(NEOPIXEL) || NEOPIXEL_PIXELS == 0 #error "NEOPIXEL_LED requires NEOPIXEL_PIN and NEOPIXEL_PIXELS." - #elif ENABLED(NEOPIXEL2_SEPARATE) && !(NEOPIXEL2_TYPE && PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) - #error "NEOPIXEL2_SEPARATE requires NEOPIXEL2_PIN, NEOPIXEL2_TYPE and NEOPIXEL2_PIXELS." + #elif ENABLED(NEOPIXEL2_SEPARATE) && !(defined(NEOPIXEL2_TYPE) && PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) + #error "NEOPIXEL2_SEPARATE requires NEOPIXEL2_TYPE, NEOPIXEL2_PIN and NEOPIXEL2_PIXELS." #elif ENABLED(NEO2_COLOR_PRESETS) && DISABLED(NEOPIXEL2_SEPARATE) #error "NEO2_COLOR_PRESETS requires NEOPIXEL2_SEPARATE to be enabled." #endif From 0bd7a2fc7eaf547d9e225a2e83d2a853a89e6118 Mon Sep 17 00:00:00 2001 From: Kadah Date: Mon, 7 Sep 2020 01:15:42 -0700 Subject: [PATCH 0200/1370] Fix M166 Gradient Mix for DELTA (#19285) --- Marlin/src/feature/mixing.cpp | 7 ++++++- Marlin/src/gcode/feature/mixing/M166.cpp | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index 7de4eb79ea..b002e9808a 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -180,7 +180,12 @@ void Mixer::refresh_collector(const float proportion/*=1.0*/, const uint8_t t/*= } void Mixer::update_gradient_for_planner_z() { - update_gradient_for_z(planner.get_axis_position_mm(Z_AXIS)); + #if ENABLED(DELTA) + get_cartesian_from_steppers(); + update_gradient_for_z(cartes.z); + #else + update_gradient_for_z(planner.get_axis_position_mm(Z_AXIS)); + #endif } #endif // GRADIENT_MIX diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp index 5f2c4f042a..9e071a47ec 100644 --- a/Marlin/src/gcode/feature/mixing/M166.cpp +++ b/Marlin/src/gcode/feature/mixing/M166.cpp @@ -86,7 +86,14 @@ void GcodeSuite::M166() { echo_zt(mixer.gradient.end_vtool, mixer.gradient.end_z); mixer.update_mix_from_gradient(); - SERIAL_ECHOPAIR(" ; Current Z", planner.get_axis_position_mm(Z_AXIS)); + + SERIAL_ECHOPGM(" ; Current Z"); + #if ENABLED(DELTA) + get_cartesian_from_steppers(); + SERIAL_ECHO(cartes.z); + #else + SERIAL_ECHO(planner.get_axis_position_mm(Z_AXIS)); + #endif echo_mix(); } From f5dc18730c2e1925d37018e04f835d0a826d5265 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 7 Sep 2020 05:17:35 -0300 Subject: [PATCH 0201/1370] Sanity-check BABYSTEP_DISPLAY_TOTAL with ColorUI (#19284) --- Marlin/src/inc/SanityCheck.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9d05194184..775899febb 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -789,6 +789,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(BABYSTEP_XY) static_assert(BABYSTEP_MULTIPLICATOR_XY <= 0.25f, "BABYSTEP_MULTIPLICATOR_XY must be less than or equal to 0.25mm."); #endif + #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) && ANY(TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI) + #error "New Color UI (TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI) does not support BABYSTEP_DISPLAY_TOTAL yet." #endif #endif From 09a5014b3c6f3860d80da0c05195b4b527fb6ae6 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 7 Sep 2020 15:07:53 -0700 Subject: [PATCH 0202/1370] TFT is neither "graphical" nor "character" (#19297) --- Marlin/src/inc/Conditionals_post.h | 4 ++-- Marlin/src/lcd/lcdprint.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 89dc73fb5c..71ae4bb285 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2612,14 +2612,14 @@ #ifndef LCD_WIDTH #if HAS_GRAPHICAL_LCD #define LCD_WIDTH 21 - #elif HAS_CHARACTER_LCD + #else #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) #endif #endif #ifndef LCD_HEIGHT #if HAS_GRAPHICAL_LCD #define LCD_HEIGHT 5 - #elif HAS_CHARACTER_LCD + #else #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) #endif #endif diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 8ea174bd65..031d467bf9 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -79,7 +79,7 @@ #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) -#elif HAS_CHARACTER_LCD +#else #define _UxGT(a) a typedef uint8_t lcd_uint_t; From 5fcfecc56e6263dd1cb77376b5fd0fb439ff6bd7 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 8 Sep 2020 04:29:45 +0200 Subject: [PATCH 0203/1370] Make M600 heat up the nozzle. Reset runout on fail. (#19298) Co-authored-by: Scott Lahteine --- Marlin/src/feature/pause.cpp | 64 +++++++++++++++++++------ Marlin/src/feature/pause.h | 2 + Marlin/src/gcode/feature/pause/M600.cpp | 7 +++ Marlin/src/module/temperature.h | 2 +- 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index a7ed93425c..4089e2b87b 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -29,6 +29,8 @@ #if ENABLED(ADVANCED_PAUSE_FEATURE) +//#define DEBUG_PAUSE_RESUME + #include "../MarlinCore.h" #include "../gcode/gcode.h" #include "../module/motion.h" @@ -62,6 +64,9 @@ #include "../libs/nozzle.h" #include "pause.h" +#define DEBUG_OUT ENABLED(DEBUG_PAUSE_RESUME) +#include "../core/debug_out.h" + // private: static xyze_pos_t resume_position; @@ -120,26 +125,33 @@ fil_change_settings_t fc_settings[EXTRUDERS]; * Returns 'true' if heating was completed, 'false' for abort */ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=PAUSE_MODE_SAME) { + DEBUG_SECTION(est, "ensure_safe_temperature", true); + DEBUG_ECHOLNPAIR("... wait:", int(wait), " mode:", int(mode)); + + if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder); + + #if HAS_LCD_MENU + lcd_pause_show_message(PAUSE_MESSAGE_HEATING, mode); + #endif + UNUSED(mode); + + if (wait) + return thermalManager.wait_for_hotend(active_extruder); + + wait_for_heatup = true; // Allow interruption by Emergency Parser M108 + while (wait_for_heatup && ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW) + idle(); + wait_for_heatup = false; #if ENABLED(PREVENT_COLD_EXTRUSION) + // A user can cancel wait-for-heating with M108 if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) { SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD); return false; } #endif - #if HAS_LCD_MENU - lcd_pause_show_message(PAUSE_MESSAGE_HEATING, mode); - #else - UNUSED(mode); - #endif - - if (wait) - return thermalManager.wait_for_hotend(active_extruder); - - while (ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW) - idle(); - return true; } @@ -160,7 +172,10 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ DXC_ARGS ) { - TERN(HAS_LCD_MENU,,UNUSED(show_lcd)); + DEBUG_SECTION(lf, "load_filament", true); + DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " showlcd:", int(show_lcd), " pauseforuser:", int(pause_for_user), " pausemode:", int(mode) DXC_SAY); + + UNUSED(show_lcd); if (!ensure_safe_temperature(false, mode)) { #if HAS_LCD_MENU @@ -292,7 +307,14 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, , const float &mix_multiplier/*=1.0*/ #endif ) { - TERN(HAS_LCD_MENU,,UNUSED(show_lcd)); + DEBUG_SECTION(uf, "unload_filament", true); + DEBUG_ECHOLNPAIR("... unloadlen:", unload_length, " showlcd:", int(show_lcd), " mode:", int(mode) + #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) + , " mixmult:", mix_multiplier + #endif + ); + + UNUSED(show_lcd); #if !BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) constexpr float mix_multiplier = 1.0; @@ -358,7 +380,10 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, uint8_t did_pause_print = 0; bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { - TERN(HAS_LCD_MENU,,UNUSED(show_lcd)); + DEBUG_SECTION(pp, "pause_print", true); + DEBUG_ECHOLNPAIR("... retract:", retract, " park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", int(show_lcd) DXC_SAY); + + UNUSED(show_lcd); if (did_pause_print) return false; // already paused @@ -449,12 +474,18 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float */ void show_continue_prompt(const bool is_reload) { + DEBUG_SECTION(scp, "pause_print", true); + DEBUG_ECHOLNPAIR("... is_reload:", int(is_reload)); + TERN_(HAS_LCD_MENU, lcd_pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING)); SERIAL_ECHO_START(); serialprintPGM(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); } void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) { + DEBUG_SECTION(wfc, "wait_for_confirmation", true); + DEBUG_ECHOLNPAIR("... is_reload:", is_reload, " maxbeep:", int(max_beep_count) DXC_SAY); + bool nozzle_timed_out = false; show_continue_prompt(is_reload); @@ -551,6 +582,9 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep * - Resume the current SD print job, if any */ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, int16_t targetTemp/*=0*/ DXC_ARGS) { + DEBUG_SECTION(rp, "resume_print", true); + DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " targetTemp:", targetTemp DXC_SAY); + /* SERIAL_ECHOLNPAIR( "start of resume_print()\ndual_x_carriage_mode:", dual_x_carriage_mode, diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index d8a676afa4..016b0ce3f7 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -77,10 +77,12 @@ extern uint8_t did_pause_print; #define DXC_PARAMS , const int8_t DXC_ext=-1 #define DXC_ARGS , const int8_t DXC_ext #define DXC_PASS , DXC_ext + #define DXC_SAY , " dxc:", int(DXC_ext) #else #define DXC_PARAMS #define DXC_ARGS #define DXC_PASS + #define DXC_SAY #endif bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length=0, const bool show_lcd=false DXC_PARAMS); diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 673c7387ef..b78608f7ae 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -45,6 +45,10 @@ #include "../../../feature/mixing.h" #endif +#if HAS_FILAMENT_SENSOR + #include "../../../feature/runout.h" +#endif + /** * M600: Pause for filament change * @@ -158,6 +162,9 @@ void GcodeSuite::M600() { beep_count, (parser.seenval('R') ? parser.value_celsius() : 0) DXC_PASS); #endif } + else { + TERN_(HAS_FILAMENT_SENSOR, runout.reset()); + } #if EXTRUDERS > 1 // Restore toolhead if it was changed diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 94eb42fd0f..4d3efceafd 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -330,7 +330,7 @@ class Temperature { #if ENABLED(PREVENT_COLD_EXTRUSION) static bool allow_cold_extrude; static int16_t extrude_min_temp; - FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp; } + FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } FORCE_INLINE static bool tooColdToExtrude(const uint8_t E_NAME) { return tooCold(degHotend(HOTEND_INDEX)); } From 784016a25ec8dd45adc3cd38eca34137125d6797 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 7 Sep 2020 19:41:48 -0700 Subject: [PATCH 0204/1370] Update HAL/STM32 platform to 8.0 (#18496) --- .github/workflows/test-builds.yml | 1 + Marlin/Makefile | 2 +- Marlin/src/HAL/STM32/SoftwareSerial.cpp | 396 ------------------ Marlin/src/HAL/STM32/SoftwareSerial.h | 114 ----- Marlin/src/HAL/STM32/timers.cpp | 130 ++++-- Marlin/src/HAL/STM32/timers.h | 22 +- Marlin/src/core/boards.h | 2 +- Marlin/src/pins/pins.h | 2 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 2 +- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 11 +- buildroot/share/PlatformIO/boards/LERDGE.json | 3 +- .../share/PlatformIO/boards/malyanM200v2.json | 2 +- .../{fysetc_s6.json => marlin_fysetc_s6.json} | 4 +- .../PlatformIO/scripts/fysetc_STM32S6.py | 33 -- .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../{FYSETC_S6 => MARLIN_FYSETC_S6}/variant.h | 2 +- buildroot/tests/STM32F070CB_malyan-tests | 15 + platformio.ini | 68 ++- 23 files changed, 180 insertions(+), 633 deletions(-) delete mode 100644 Marlin/src/HAL/STM32/SoftwareSerial.cpp delete mode 100644 Marlin/src/HAL/STM32/SoftwareSerial.h rename buildroot/share/PlatformIO/boards/{fysetc_s6.json => marlin_fysetc_s6.json} (94%) delete mode 100644 buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/variant.h (99%) create mode 100644 buildroot/tests/STM32F070CB_malyan-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index fdb81fbdc9..35cd920adf 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -70,6 +70,7 @@ jobs: - mks_robin_stm32 - ARMED - FYSETC_S6 + - STM32F070CB_malyan - STM32F070RB_malyan - malyan_M300 - mks_robin_lite diff --git a/Marlin/Makefile b/Marlin/Makefile index 95135ab594..5ab0d1eefd 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -694,7 +694,7 @@ ifeq ($(HARDWARE_VARIANT), Teensy) LIB_CXXSRC += usb_api.cpp else ifeq ($(HARDWARE_VARIANT), archim) - CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT="Archim"' + CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"' LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp PluggableUSB.cpp USBCore.cpp LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c diff --git a/Marlin/src/HAL/STM32/SoftwareSerial.cpp b/Marlin/src/HAL/STM32/SoftwareSerial.cpp deleted file mode 100644 index 2228a177be..0000000000 --- a/Marlin/src/HAL/STM32/SoftwareSerial.cpp +++ /dev/null @@ -1,396 +0,0 @@ -/* - * SoftwareSerial.cpp (formerly NewSoftSerial.cpp) - * - * Multi-instance software serial library for Arduino/Wiring - * -- Interrupt-driven receive and other improvements by ladyada - * - * -- Tuning, circular buffer, derivation from class Print/Stream, - * multi-instance support, porting to 8MHz processors, - * various optimizations, PROGMEM delay tables, inverse logic and - * direct port writing by Mikal Hart - * -- Pin change interrupt macros by Paul Stoffregen - * -- 20MHz processor support by Garrett Mace - * -- ATmega1280/2560 support by Brett Hagman - * -- STM32 support by Armin van der Togt - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * The latest version of this library can always be found at - * http://arduiniana.org. - */ - -// -// Includes -// -#if defined(PLATFORMIO) && defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -#include "SoftwareSerial.h" - -#define OVERSAMPLE 3 // in RX, Timer will generate interruption OVERSAMPLE time during a bit. Thus OVERSAMPLE ticks in a bit. (interrupt not synchonized with edge). - -// defined in bit-periods -#define HALFDUPLEX_SWITCH_DELAY 5 -// It's best to define TIMER_SERIAL in variant.h. If not defined, we choose one here -// The order is based on (lack of) features and compare channels, we choose the simplest available -// because we only need an update interrupt -#if !defined(TIMER_SERIAL) -#if defined(TIM18_BASE) -#define TIMER_SERIAL TIM18 -#elif defined(TIM7_BASE) -#define TIMER_SERIAL TIM7 -#elif defined(TIM6_BASE) -#define TIMER_SERIAL TIM6 -#elif defined(TIM22_BASE) -#define TIMER_SERIAL TIM22 -#elif defined(TIM21_BASE) -#define TIMER_SERIAL TIM21 -#elif defined(TIM17_BASE) -#define TIMER_SERIAL TIM17 -#elif defined(TIM16_BASE) -#define TIMER_SERIAL TIM16 -#elif defined(TIM15_BASE) -#define TIMER_SERIAL TIM15 -#elif defined(TIM14_BASE) -#define TIMER_SERIAL TIM14 -#elif defined(TIM13_BASE) -#define TIMER_SERIAL TIM13 -#elif defined(TIM11_BASE) -#define TIMER_SERIAL TIM11 -#elif defined(TIM10_BASE) -#define TIMER_SERIAL TIM10 -#elif defined(TIM12_BASE) -#define TIMER_SERIAL TIM12 -#elif defined(TIM19_BASE) -#define TIMER_SERIAL TIM19 -#elif defined(TIM9_BASE) -#define TIMER_SERIAL TIM9 -#elif defined(TIM5_BASE) -#define TIMER_SERIAL TIM5 -#elif defined(TIM4_BASE) -#define TIMER_SERIAL TIM4 -#elif defined(TIM3_BASE) -#define TIMER_SERIAL TIM3 -#elif defined(TIM2_BASE) -#define TIMER_SERIAL TIM2 -#elif defined(TIM20_BASE) -#define TIMER_SERIAL TIM20 -#elif defined(TIM8_BASE) -#define TIMER_SERIAL TIM8 -#elif defined(TIM1_BASE) -#define TIMER_SERIAL TIM1 -#else -#error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h -#endif -#endif -// -// Statics -// -HardwareTimer SoftwareSerial::timer(TIMER_SERIAL); -const IRQn_Type SoftwareSerial::timer_interrupt_number = static_cast(getTimerUpIrq(TIMER_SERIAL)); -uint32_t SoftwareSerial::timer_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO); -SoftwareSerial *SoftwareSerial::active_listener = nullptr; -SoftwareSerial *volatile SoftwareSerial::active_out = nullptr; -SoftwareSerial *volatile SoftwareSerial::active_in = nullptr; -int32_t SoftwareSerial::tx_tick_cnt = 0; // OVERSAMPLE ticks needed for a bit -int32_t volatile SoftwareSerial::rx_tick_cnt = 0; // OVERSAMPLE ticks needed for a bit -uint32_t SoftwareSerial::tx_buffer = 0; -int32_t SoftwareSerial::tx_bit_cnt = 0; -uint32_t SoftwareSerial::rx_buffer = 0; -int32_t SoftwareSerial::rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit -uint32_t SoftwareSerial::cur_speed = 0; - -void SoftwareSerial::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { - timer_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority); -} - -// -// Private methods -// - -void SoftwareSerial::setSpeed(uint32_t speed) { - if (speed != cur_speed) { - timer.pause(); - if (speed != 0) { - // Disable the timer - uint32_t clock_rate, cmp_value; - // Get timer clock - clock_rate = timer.getTimerClkFreq(); - int pre = 1; - // Calculate prescale an compare value - do { - cmp_value = clock_rate / (speed * OVERSAMPLE); - if (cmp_value >= UINT16_MAX) { - clock_rate /= 2; - pre *= 2; - } - } while (cmp_value >= UINT16_MAX); - timer.setPrescaleFactor(pre); - timer.setOverflow(cmp_value); - timer.setCount(0); - timer.attachInterrupt(&handleInterrupt); - timer.resume(); - NVIC_SetPriority(timer_interrupt_number, timer_interrupt_priority); - } - else - timer.detachInterrupt(); - cur_speed = speed; - } -} - -// This function sets the current object as the "listening" -// one and returns true if it replaces another -bool SoftwareSerial::listen() { - if (active_listener != this) { - // wait for any transmit to complete as we may change speed - while (active_out); - active_listener->stopListening(); - rx_tick_cnt = 1; // 1 : next interrupt will decrease rx_tick_cnt to 0 which means RX pin level will be considered. - rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit - setSpeed(_speed); - active_listener = this; - if (!_half_duplex) active_in = this; - return true; - } - return false; -} - -// Stop listening. Returns true if we were actually listening. -bool SoftwareSerial::stopListening() { - if (active_listener == this) { - // wait for any output to complete - while (active_out); - if (_half_duplex) setRXTX(false); - active_listener = nullptr; - active_in = nullptr; - // turn off ints - setSpeed(0); - return true; - } - return false; -} - -inline void SoftwareSerial::setTX() { - if (_inverse_logic) - LL_GPIO_ResetOutputPin(_transmitPinPort, _transmitPinNumber); - else - LL_GPIO_SetOutputPin(_transmitPinPort, _transmitPinNumber); - pinMode(_transmitPin, OUTPUT); -} - -inline void SoftwareSerial::setRX() { - pinMode(_receivePin, _inverse_logic ? INPUT_PULLDOWN : INPUT_PULLUP); // pullup for normal logic! -} - -inline void SoftwareSerial::setRXTX(bool input) { - if (_half_duplex) { - if (input) { - if (active_in != this) { - setRX(); - rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit - rx_tick_cnt = 2; // 2 : next interrupt will be discarded. 2 interrupts required to consider RX pin level - active_in = this; - } - } - else { - if (active_in == this) { - setTX(); - active_in = nullptr; - } - } - } -} - -inline void SoftwareSerial::send() { - if (--tx_tick_cnt <= 0) { // if tx_tick_cnt > 0 interrupt is discarded. Only when tx_tick_cnt reaches 0 is TX pin set. - if (tx_bit_cnt++ < 10) { // tx_bit_cnt < 10 transmission is not finished (10 = 1 start +8 bits + 1 stop) - // Send data (including start and stop bits) - if (tx_buffer & 1) - LL_GPIO_SetOutputPin(_transmitPinPort, _transmitPinNumber); - else - LL_GPIO_ResetOutputPin(_transmitPinPort, _transmitPinNumber); - tx_buffer >>= 1; - tx_tick_cnt = OVERSAMPLE; // Wait OVERSAMPLE ticks to send next bit - } - else { // Transmission finished - tx_tick_cnt = 1; - if (_output_pending) { - active_out = nullptr; - - // In half-duplex mode wait HALFDUPLEX_SWITCH_DELAY bit-periods after the byte has - // been transmitted before allowing the switch to RX mode - } - else if (tx_bit_cnt > 10 + OVERSAMPLE * HALFDUPLEX_SWITCH_DELAY) { - if (_half_duplex && active_listener == this) setRXTX(true); - active_out = nullptr; - } - } - } -} - -// -// The receive routine called by the interrupt handler -// -inline void SoftwareSerial::recv() { - if (--rx_tick_cnt <= 0) { // if rx_tick_cnt > 0 interrupt is discarded. Only when rx_tick_cnt reaches 0 is RX pin considered - bool inbit = LL_GPIO_IsInputPinSet(_receivePinPort, _receivePinNumber) ^ _inverse_logic; - if (rx_bit_cnt == -1) { // rx_bit_cnt = -1 : waiting for start bit - if (!inbit) { - // got start bit - rx_bit_cnt = 0; // rx_bit_cnt == 0 : start bit received - rx_tick_cnt = OVERSAMPLE + 1; // Wait 1 bit (OVERSAMPLE ticks) + 1 tick in order to sample RX pin in the middle of the edge (and not too close to the edge) - rx_buffer = 0; - } - else - rx_tick_cnt = 1; // Waiting for start bit, but wrong level. Wait for next Interrupt to check RX pin level - } - else if (rx_bit_cnt >= 8) { // rx_bit_cnt >= 8 : waiting for stop bit - if (inbit) { - // Stop-bit read complete. Add to buffer. - uint8_t next = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF; - if (next != _receive_buffer_head) { - // save new data in buffer: tail points to byte destination - _receive_buffer[_receive_buffer_tail] = rx_buffer; // save new byte - _receive_buffer_tail = next; - } - else // rx_bit_cnt = x with x = [0..7] correspond to new bit x received - _buffer_overflow = true; - } - // Full trame received. Restart waiting for start bit at next interrupt - rx_tick_cnt = 1; - rx_bit_cnt = -1; - } - else { - // data bits - rx_buffer >>= 1; - if (inbit) rx_buffer |= 0x80; - rx_bit_cnt++; // Prepare for next bit - rx_tick_cnt = OVERSAMPLE; // Wait OVERSAMPLE ticks before sampling next bit - } - } -} - -// -// Interrupt handling -// - -/* static */ -inline void SoftwareSerial::handleInterrupt(HardwareTimer*) { - if (active_in) active_in->recv(); - if (active_out) active_out->send(); -} - -// -// Constructor -// -SoftwareSerial::SoftwareSerial(uint16_t receivePin, uint16_t transmitPin, bool inverse_logic /* = false */) : - _receivePin(receivePin), - _transmitPin(transmitPin), - _receivePinPort(digitalPinToPort(receivePin)), - _receivePinNumber(STM_LL_GPIO_PIN(digitalPinToPinName(receivePin))), - _transmitPinPort(digitalPinToPort(transmitPin)), - _transmitPinNumber(STM_LL_GPIO_PIN(digitalPinToPinName(transmitPin))), - _speed(0), - _buffer_overflow(false), - _inverse_logic(inverse_logic), - _half_duplex(receivePin == transmitPin), - _output_pending(0), - _receive_buffer_tail(0), - _receive_buffer_head(0) -{ - if ((receivePin < NUM_DIGITAL_PINS) || (transmitPin < NUM_DIGITAL_PINS)) { - /* Enable GPIO clock for tx and rx pin*/ - set_GPIO_Port_Clock(STM_PORT(digitalPinToPinName(transmitPin))); - set_GPIO_Port_Clock(STM_PORT(digitalPinToPinName(receivePin))); - } - else - _Error_Handler("ERROR: invalid pin number\n", -1); -} - -// -// Destructor -// -SoftwareSerial::~SoftwareSerial() { end(); } - -// -// Public methods -// - -void SoftwareSerial::begin(long speed) { - #ifdef FORCE_BAUD_RATE - speed = FORCE_BAUD_RATE; - #endif - _speed = speed; - if (!_half_duplex) { - setTX(); - setRX(); - listen(); - } - else - setTX(); -} - -void SoftwareSerial::end() { - stopListening(); -} - -// Read data from buffer -int SoftwareSerial::read() { - // Empty buffer? - if (_receive_buffer_head == _receive_buffer_tail) return -1; - - // Read from "head" - uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte - _receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF; - return d; -} - -int SoftwareSerial::available() { - return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF; -} - -size_t SoftwareSerial::write(uint8_t b) { - // wait for previous transmit to complete - _output_pending = 1; - while (active_out) { /* nada */ } - // add start and stop bits. - tx_buffer = b << 1 | 0x200; - if (_inverse_logic) tx_buffer = ~tx_buffer; - tx_bit_cnt = 0; - tx_tick_cnt = OVERSAMPLE; - setSpeed(_speed); - if (_half_duplex) setRXTX(false); - _output_pending = 0; - // make us active - active_out = this; - return 1; -} - -void SoftwareSerial::flush() { - noInterrupts(); - _receive_buffer_head = _receive_buffer_tail = 0; - interrupts(); -} - -int SoftwareSerial::peek() { - // Empty buffer? - if (_receive_buffer_head == _receive_buffer_tail) return -1; - - // Read from "head" - return _receive_buffer[_receive_buffer_head]; -} - -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/SoftwareSerial.h b/Marlin/src/HAL/STM32/SoftwareSerial.h deleted file mode 100644 index 1a4f742c32..0000000000 --- a/Marlin/src/HAL/STM32/SoftwareSerial.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * SoftwareSerial.h (formerly NewSoftSerial.h) - * - * Multi-instance software serial library for Arduino/Wiring - * -- Interrupt-driven receive and other improvements by ladyada - * (https://ladyada.net) - * -- Tuning, circular buffer, derivation from class Print/Stream, - * multi-instance support, porting to 8MHz processors, - * various optimizations, PROGMEM delay tables, inverse logic and - * direct port writing by Mikal Hart (http://www.arduiniana.org) - * -- Pin change interrupt macros by Paul Stoffregen (https://www.pjrc.com) - * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) - * -- ATmega1280/2560 support by Brett Hagman (https://www.roguerobotics.com/) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * The latest version of this library can always be found at - * http://arduiniana.org. - */ -#pragma once - -#include - -/****************************************************************************** - * Definitions - ******************************************************************************/ - -#define _SS_MAX_RX_BUFF 64 // RX buffer size - -class SoftwareSerial : public Stream { - private: - // per object data - uint16_t _receivePin; - uint16_t _transmitPin; - GPIO_TypeDef *_receivePinPort; - uint32_t _receivePinNumber; - GPIO_TypeDef *_transmitPinPort; - uint32_t _transmitPinNumber; - uint32_t _speed; - - uint16_t _buffer_overflow: 1; - uint16_t _inverse_logic: 1; - uint16_t _half_duplex: 1; - uint16_t _output_pending: 1; - - unsigned char _receive_buffer[_SS_MAX_RX_BUFF]; - volatile uint8_t _receive_buffer_tail; - volatile uint8_t _receive_buffer_head; - - uint32_t delta_start = 0; - - // static data - static HardwareTimer timer; - static const IRQn_Type timer_interrupt_number; - static uint32_t timer_interrupt_priority; - static SoftwareSerial *active_listener; - static SoftwareSerial *volatile active_out; - static SoftwareSerial *volatile active_in; - static int32_t tx_tick_cnt; - static volatile int32_t rx_tick_cnt; - static uint32_t tx_buffer; - static int32_t tx_bit_cnt; - static uint32_t rx_buffer; - static int32_t rx_bit_cnt; - static uint32_t cur_speed; - - // private methods - void send(); - void recv(); - void setTX(); - void setRX(); - void setSpeed(uint32_t speed); - void setRXTX(bool input); - static void handleInterrupt(HardwareTimer *timer); - - public: - // public methods - - SoftwareSerial(uint16_t receivePin, uint16_t transmitPin, bool inverse_logic=false); - virtual ~SoftwareSerial(); - void begin(long speed); - bool listen(); - void end(); - bool isListening() { return active_listener == this; } - bool stopListening(); - bool overflow() { - bool ret = _buffer_overflow; - if (ret) _buffer_overflow = false; - return ret; - } - int peek(); - - virtual size_t write(uint8_t byte); - virtual int read(); - virtual int available(); - virtual void flush(); - operator bool() { return true; } - - static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); - - using Print::write; -}; diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index 1196731448..c0ba19abe5 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -110,7 +110,6 @@ // ------------------------ HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { NULL }; -bool timer_enabled[NUM_HARDWARE_TIMERS] = { false }; // ------------------------ // Public functions @@ -135,6 +134,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { * which changes the prescaler when an IRQ frequency change is needed * (for example when steppers are turned on) */ + timer_instance[timer_num]->setPrescaleFactor(STEPPER_TIMER_PRESCALE); //the -1 is done internally timer_instance[timer_num]->setOverflow(_MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE) /* /frequency */), TICK_FORMAT); break; @@ -145,15 +145,13 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { break; } + // Disable preload. Leaving it default-enabled can cause the timer to stop if it happens + // to exit the ISR after the start time for the next interrupt has already passed. + timer_instance[timer_num]->setPreloadEnable(false); + HAL_timer_enable_interrupt(timer_num); - /* - * Initializes (and unfortunately starts) the timer. - * This is needed to set correct IRQ priority at the moment but causes - * no harm since every call to HAL_timer_start() is actually followed by - * a call to HAL_timer_enable_interrupt() which means that there isn't - * a case in which you want the timer to run without a callback. - */ + // Start the timer. timer_instance[timer_num]->resume(); // First call to resume() MUST follow the attachInterrupt() // This is fixed in Arduino_Core_STM32 1.8. @@ -161,47 +159,34 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { // timer_instance[timer_num]->setInterruptPriority switch (timer_num) { case STEP_TIMER_NUM: - HAL_NVIC_SetPriority(STEP_TIMER_IRQ_NAME, STEP_TIMER_IRQ_PRIO, 0); + timer_instance[timer_num]->setInterruptPriority(STEP_TIMER_IRQ_PRIO, 0); break; case TEMP_TIMER_NUM: - HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_NAME, TEMP_TIMER_IRQ_PRIO, 0); + timer_instance[timer_num]->setInterruptPriority(TEMP_TIMER_IRQ_PRIO, 0); break; } } } void HAL_timer_enable_interrupt(const uint8_t timer_num) { - if (HAL_timer_initialized(timer_num) && !timer_enabled[timer_num]) { - timer_enabled[timer_num] = true; + if (HAL_timer_initialized(timer_num) && !timer_instance[timer_num]->hasInterrupt()) { switch (timer_num) { case STEP_TIMER_NUM: - timer_instance[timer_num]->attachInterrupt(Step_Handler); - break; - case TEMP_TIMER_NUM: - timer_instance[timer_num]->attachInterrupt(Temp_Handler); - break; + timer_instance[timer_num]->attachInterrupt(Step_Handler); + break; + case TEMP_TIMER_NUM: + timer_instance[timer_num]->attachInterrupt(Temp_Handler); + break; } } } void HAL_timer_disable_interrupt(const uint8_t timer_num) { - if (HAL_timer_interrupt_enabled(timer_num)) { - timer_instance[timer_num]->detachInterrupt(); - timer_enabled[timer_num] = false; - } + if (HAL_timer_initialized(timer_num)) timer_instance[timer_num]->detachInterrupt(); } bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - return HAL_timer_initialized(timer_num) && timer_enabled[timer_num]; -} - -// Only for use within the HAL -TIM_TypeDef * HAL_timer_device(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: return STEP_TIMER_DEV; - case TEMP_TIMER_NUM: return TEMP_TIMER_DEV; - } - return nullptr; + return HAL_timer_initialized(timer_num) && timer_instance[timer_num]->hasInterrupt(); } void SetTimerInterruptPriorities() { @@ -209,4 +194,87 @@ void SetTimerInterruptPriorities() { TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIO, 0)); } +// This is a terrible hack to replicate the behavior used in the framework's SoftwareSerial.cpp +// to choose a serial timer. It will select TIM7 on most boards used by Marlin, but this is more +// resiliant to new MCUs which may not have a TIM7. Best practice is to explicitly specify +// TIMER_SERIAL to avoid relying on framework selections which may not be predictable. +#if !defined(TIMER_SERIAL) + #if defined (TIM18_BASE) + #define TIMER_SERIAL TIM18 + #elif defined (TIM7_BASE) + #define TIMER_SERIAL TIM7 + #elif defined (TIM6_BASE) + #define TIMER_SERIAL TIM6 + #elif defined (TIM22_BASE) + #define TIMER_SERIAL TIM22 + #elif defined (TIM21_BASE) + #define TIMER_SERIAL TIM21 + #elif defined (TIM17_BASE) + #define TIMER_SERIAL TIM17 + #elif defined (TIM16_BASE) + #define TIMER_SERIAL TIM16 + #elif defined (TIM15_BASE) + #define TIMER_SERIAL TIM15 + #elif defined (TIM14_BASE) + #define TIMER_SERIAL TIM14 + #elif defined (TIM13_BASE) + #define TIMER_SERIAL TIM13 + #elif defined (TIM11_BASE) + #define TIMER_SERIAL TIM11 + #elif defined (TIM10_BASE) + #define TIMER_SERIAL TIM10 + #elif defined (TIM12_BASE) + #define TIMER_SERIAL TIM12 + #elif defined (TIM19_BASE) + #define TIMER_SERIAL TIM19 + #elif defined (TIM9_BASE) + #define TIMER_SERIAL TIM9 + #elif defined (TIM5_BASE) + #define TIMER_SERIAL TIM5 + #elif defined (TIM4_BASE) + #define TIMER_SERIAL TIM4 + #elif defined (TIM3_BASE) + #define TIMER_SERIAL TIM3 + #elif defined (TIM2_BASE) + #define TIMER_SERIAL TIM2 + #elif defined (TIM20_BASE) + #define TIMER_SERIAL TIM20 + #elif defined (TIM8_BASE) + #define TIMER_SERIAL TIM8 + #elif defined (TIM1_BASE) + #define TIMER_SERIAL TIM1 + #else + #error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h + #endif +#endif + +// Place all timers used into an array, then recursively check for duplicates during compilation. +// This does not currently account for timers used for PWM, such as for fans. +// Timers are actually pointers. Convert to integers to simplify constexpr logic. +static constexpr uintptr_t timers_in_use[] = { + uintptr_t(TEMP_TIMER_DEV), // Override in pins file + uintptr_t(STEP_TIMER_DEV), // Override in pins file + #if HAS_TMC_SW_SERIAL + uintptr_t(TIMER_SERIAL), // Set in variant.h, or as a define in platformio.h if not present in variant.h + #endif + #if ENABLED(SPEAKER) + uintptr_t(TIMER_TONE), // Set in variant.h, or as a define in platformio.h if not present in variant.h + #endif + #if HAS_SERVOS + uintptr_t(TIMER_SERVO), // Set in variant.h, or as a define in platformio.h if not present in variant.h + #endif + }; + +static constexpr bool verify_no_duplicate_timers() { + LOOP_L_N(i, COUNT(timers_in_use)) + LOOP_S_L_N(j, i + 1, COUNT(timers_in_use)) + if (timers_in_use[i] == timers_in_use[j]) return false; + return true; +} + +// If this assertion fails at compile time, review the timers_in_use array. If default_envs is +// defined properly in platformio.ini, VS Code can evaluate the array when hovering over it, +// making it easy to identify the conflicting timers. +static_assert(verify_no_duplicate_timers(), "One or more timer conflict detected"); + #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/timers.h b/Marlin/src/HAL/STM32/timers.h index 000f86043b..5515219ead 100644 --- a/Marlin/src/HAL/STM32/timers.h +++ b/Marlin/src/HAL/STM32/timers.h @@ -30,8 +30,18 @@ #define FORCE_INLINE __attribute__((always_inline)) inline +// STM32 timers may be 16 or 32 bit. Limiting HAL_TIMER_TYPE_MAX to 16 bits +// avoids issues with STM32F0 MCUs, which seem to pause timers if UINT32_MAX +// is written to the register. STM32F4 timers do not manifest this issue, +// even when writing to 16 bit timers. +// +// The range of the timer can be queried at runtime using IS_TIM_32B_COUNTER_INSTANCE. +// This is a more expensive check than a simple compile-time constant, so its +// implementation is deferred until the desire for a 32-bit range outweighs the cost +// of adding a run-time check and HAL_TIMER_TYPE_MAX is refactored to allow unique +// values for each timer. #define hal_timer_t uint32_t -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF // Timers can be 16 or 32 bit +#define HAL_TIMER_TYPE_MAX UINT16_MAX #ifndef STEP_TIMER_NUM #define STEP_TIMER_NUM 0 // Timer Index for Stepper @@ -61,14 +71,14 @@ #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) -extern void Step_Handler(HardwareTimer *htim); -extern void Temp_Handler(HardwareTimer *htim); +extern void Step_Handler(); +extern void Temp_Handler(); #ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() void Step_Handler(HardwareTimer *htim) + #define HAL_STEP_TIMER_ISR() void Step_Handler() #endif #ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() void Temp_Handler(HardwareTimer *htim) + #define HAL_TEMP_TIMER_ISR() void Temp_Handler() #endif // ------------------------ @@ -90,8 +100,6 @@ bool HAL_timer_interrupt_enabled(const uint8_t timer_num); // Exposed here to allow all timer priority information to reside in timers.cpp void SetTimerInterruptPriorities(); -//TIM_TypeDef* HAL_timer_device(const uint8_t timer_num); no need to be public for now. not public = not used externally - // FORCE_INLINE because these are used in performance-critical situations FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_num) { return timer_instance[timer_num] != NULL; diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index e280d955b8..c8e1f28754 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -282,7 +282,7 @@ #define BOARD_STM32F103RE 4000 // STM32F103RE Libmaple-based STM32F1 controller #define BOARD_MALYAN_M200 4001 // STM32C8T6 Libmaple-based STM32F1 controller -#define BOARD_MALYAN_M200_V2 4002 // STM32F070RB Libmaple-based STM32F0 controller +#define BOARD_MALYAN_M200_V2 4002 // STM32F070CB STM32F0 controller #define BOARD_STM3R_MINI 4003 // STM32F103RE Libmaple-based STM32F1 controller #define BOARD_GTM32_PRO_VB 4004 // STM32F103VET6 controller #define BOARD_MORPHEUS 4005 // STM32F103C8 / STM32F103CB Libmaple-based STM32F1 controller diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 2dfb2b53b8..9f120b8b00 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -480,7 +480,7 @@ // STM32 ARM Cortex-M0 // #elif MB(MALYAN_M200_V2) - #include "stm32f0/pins_MALYAN_M200_V2.h" // STM32F0 env:STM32F070RB_malyan + #include "stm32f0/pins_MALYAN_M200_V2.h" // STM32F0 env:STM32F070RB_malyan env:STM32F070CB_malyan #elif MB(MALYAN_M300) #include "stm32f0/pins_MALYAN_M300.h" // STM32F070 env:malyan_M300 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index d3510b1ff8..009b1b65f1 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F4 +#ifndef STM32F4 #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "BIGTREE BTT002 V1.0 supports up to 1 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index ea643322b6..55d1a37aa7 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F4 +#ifndef STM32F4 #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 8 || E_STEPPERS > 8 #error "BIGTREE GTR V1.0 supports up to 8 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 56c509562f..9e6a43c36b 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F4 +#ifndef STM32F4 #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 3b513b31ca..90f9e50013 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -42,11 +42,12 @@ // Configure Timers // TIM6 is used for TONE // TIM7 is used for SERVO -// TIMER_SERIAL defaults to TIM7 so we'll override it here -// -#define STEP_TIMER 10 -#define TEMP_TIMER 14 -#define TIMER_SERIAL TIM9 +// TIMER_SERIAL defaults to TIM7 and must be overridden in the platformio.h file if SERVO will also be used. +// This will be difficult to solve from the Arduino IDE, without modifying the RUMBA32 variant +// included with the STM32 framework. + +#define STEP_TIMER 10 +#define TEMP_TIMER 14 #define HAL_TIMER_RATE F_CPU // diff --git a/buildroot/share/PlatformIO/boards/LERDGE.json b/buildroot/share/PlatformIO/boards/LERDGE.json index 21df8db48e..011814a133 100644 --- a/buildroot/share/PlatformIO/boards/LERDGE.json +++ b/buildroot/share/PlatformIO/boards/LERDGE.json @@ -15,7 +15,8 @@ ] ], "mcu": "stm32f407zgt6", - "variant": "LERDGE" + "variant": "LERDGE", + "ldscript": "LERDGE.ld" }, "debug": { "jlink_device": "STM32F407ZG", diff --git a/buildroot/share/PlatformIO/boards/malyanM200v2.json b/buildroot/share/PlatformIO/boards/malyanM200v2.json index 9e301ee79f..765a0c0a00 100644 --- a/buildroot/share/PlatformIO/boards/malyanM200v2.json +++ b/buildroot/share/PlatformIO/boards/malyanM200v2.json @@ -4,7 +4,7 @@ "extra_flags": "-DSTM32F070xB", "f_cpu": "48000000L", "mcu": "stm32f070rbt6", - "variant": "MALYANM200_F070CB", + "variant": "MALYANMx00_F070CB", "vec_tab_addr": "0x8002000" }, "debug": { diff --git a/buildroot/share/PlatformIO/boards/fysetc_s6.json b/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json similarity index 94% rename from buildroot/share/PlatformIO/boards/fysetc_s6.json rename to buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json index 489a15b9ef..286e46ffbd 100644 --- a/buildroot/share/PlatformIO/boards/fysetc_s6.json +++ b/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json @@ -4,7 +4,7 @@ "extra_flags": "-DSTM32F446xx", "f_cpu": "180000000L", "mcu": "stm32f446ret6", - "variant": "FYSETC_S6" + "variant": "MARLIN_FYSETC_S6" }, "connectivity": [ "can" @@ -32,4 +32,4 @@ }, "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html", "vendor": "FYSETC" -} \ No newline at end of file +} diff --git a/buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py b/buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py deleted file mode 100644 index f6598ede65..0000000000 --- a/buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py +++ /dev/null @@ -1,33 +0,0 @@ -from os.path import join -Import("env") - -import os,shutil -from SCons.Script import DefaultEnvironment -from platformio import util - -env = DefaultEnvironment() -platform = env.PioPlatform() -board = env.BoardConfig() - -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32") -#FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32@3.10500.190327") -CMSIS_DIR = os.path.join(FRAMEWORK_DIR, "CMSIS", "CMSIS") -assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir(CMSIS_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") - -mcu_type = board.get("build.mcu")[:-2] -variant = board.get("build.variant") -series = mcu_type[:7].upper() + "xx" -variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) - -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) -assert os.path.isdir(source_dir) - -if not os.path.isdir(variant_dir): - os.mkdir(variant_dir) - -for file_name in os.listdir(source_dir): - full_file_name = os.path.join(source_dir, file_name) - if os.path.isfile(full_file_name): - shutil.copy(full_file_name, variant_dir) diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h similarity index 99% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h index da6a8249ee..ee4b1ef296 100644 --- a/buildroot/share/PlatformIO/variants/FYSETC_S6/variant.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h @@ -115,7 +115,7 @@ extern "C" { #define NUM_ANALOG_FIRST 80 // PWM resolution -#define PWM_RESOLUTION 12 +// #define PWM_RESOLUTION 12 #define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans #define PWM_MAX_DUTY_CYCLE 255 diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan-tests new file mode 100644 index 0000000000..20bd111fa9 --- /dev/null +++ b/buildroot/tests/STM32F070CB_malyan-tests @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F070CB Malyan M200 v2 +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 +opt_set SERIAL_PORT -1 +exec_test $1 $2 "Malyan M200 v2 Default Config" + +# cleanup +restore_configs diff --git a/platformio.ini b/platformio.ini index e3ff6c1526..f46e609969 100644 --- a/platformio.ini +++ b/platformio.ini @@ -661,13 +661,10 @@ board = nxp_lpc1769 # HAL/STM32 Base Environment values # [common_stm32] -platform = ststm32@~6.1.0 -platform_packages = framework-arduinoststm32@>=4.10700,<4.10800 -lib_ignore = SoftwareSerial +platform = ststm32@~8.0 build_flags = ${common.build_flags} - -IMarlin/src/HAL/STM32 -std=gnu++14 + -std=gnu++14 -DUSBCON -DUSBD_USE_CDC - -DUSBD_VID=0x0483 -DTIM_IRQ_PRIO=13 build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + @@ -676,7 +673,7 @@ src_filter = ${common.default_src_filter} + # HAL/STM32F1 Common Environment values # [common_stm32f1] -platform = ${common_stm32.platform} +platform = ststm32@~6.1 build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DHAVE_SW_SERIAL build_unflags = -std=gnu11 -std=gnu++11 @@ -828,7 +825,6 @@ platform = ${common_stm32.platform} extends = common_stm32 board = armed_v1 build_flags = ${common_stm32.build_flags} - '-DUSB_PRODUCT="ARMED_V1"' -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing # @@ -1008,20 +1004,29 @@ lib_ignore = ${common_stm32f1.lib_ignore} platform = ${common_stm32.platform} extends = common_stm32 board = malyanM200v2 -build_flags = ${common_stm32.build_flags} -DSTM32F0xx -DUSB_PRODUCT=\"STM32F070RB\" -DHAL_PCD_MODULE_ENABLED - -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing -std=gnu11 -std=gnu++11 +build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED + -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing -DCUSTOM_STARTUP_FILE -lib_ignore = SoftwareSerial + +# +# Malyan M200 v2 (STM32F070CB) +# +[env:STM32F070CB_malyan] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanm200_f070cb +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -DCUSTOM_STARTUP_FILE # # Malyan M300 (STM32F070CB) # [env:malyan_M300] -platform = ststm32@>=6.1.0,<6.2.0 +platform = ${common_stm32.platform} +extends = common_stm32 board = malyanm300_f070cb -build_flags = ${common.build_flags} - -DUSBCON -DUSBD_VID=0x0483 "-DUSB_MANUFACTURER=\"Unknown\"" "-DUSB_PRODUCT=\"MALYAN_M300\"" - -DHAL_PCD_MODULE_ENABLED -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED src_filter = ${common.default_src_filter} + # @@ -1074,13 +1079,11 @@ platform = ${common_stm32.platform} extends = common_stm32 board = STEVAL_STM32F401VE build_flags = ${common_stm32.build_flags} - -DTARGET_STM32F4 -DARDUINO_STEVAL -DSTM32F401xE - -DUSB_PRODUCT=\"STEVAL_F401VE\" + -DARDUINO_STEVAL -DSTM32F401xE -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py -lib_ignore = SoftwareSerial # # FLYF407ZG @@ -1090,8 +1093,7 @@ platform = ${common_stm32.platform} extends = common_stm32 board = FLYF407ZG build_flags = ${common_stm32.build_flags} - -DSTM32F4 -DUSB_PRODUCT=\"STM32F407ZG\" - -DTARGET_STM32F4 -DVECT_TAB_OFFSET=0x8000 + -DVECT_TAB_OFFSET=0x8000 extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py @@ -1101,14 +1103,13 @@ extra_scripts = ${common.extra_scripts} [env:FYSETC_S6] platform = ${common_stm32.platform} extends = common_stm32 -platform_packages = ${common_stm32.platform_packages} - tool-stm32duino -board = fysetc_s6 +platform_packages = tool-stm32duino +board = marlin_fysetc_s6 build_flags = ${common_stm32.build_flags} - -DTARGET_STM32F4 -DVECT_TAB_OFFSET=0x10000 - -DHAL_PCD_MODULE_ENABLED '-DUSB_PRODUCT="FYSETC_S6"' + -DVECT_TAB_OFFSET=0x10000 + -DHAL_PCD_MODULE_ENABLED extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py debug_tool = stlink upload_protocol = dfu upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" @@ -1123,12 +1124,10 @@ platform = ${common_stm32.platform} extends = common_stm32 board = blackSTM32F407VET6 build_flags = ${common_stm32.build_flags} - -DTARGET_STM32F4 -DARDUINO_BLACK_F407VE - -DUSB_PRODUCT=\"BLACK_F407VE\" + -DARDUINO_BLACK_F407VE -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -lib_ignore = SoftwareSerial # # BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) @@ -1138,8 +1137,7 @@ platform = ${common_stm32.platform} extends = common_stm32 board = BigTree_SKR_Pro build_flags = ${common_stm32.build_flags} - -DUSB_PRODUCT=\"STM32F407ZG\" - -DTARGET_STM32F4 -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py #upload_protocol = stlink @@ -1151,14 +1149,13 @@ debug_init_break = # Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) # [env:BIGTREE_GTR_V1_0] -platform = ststm32@>=5.7.0,<6.2.0 +platform = ${common_stm32.platform} extends = common_stm32 board = BigTree_GTR_v1 extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py build_flags = ${common_stm32.build_flags} - -DUSB_PRODUCT=\"STM32F407IG\" - -DTARGET_STM32F4 -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 # # BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) @@ -1168,8 +1165,7 @@ platform = ${common_stm32.platform} extends = common_stm32 board = BigTree_Btt002 build_flags = ${common_stm32.build_flags} - -DUSB_PRODUCT=\"STM32F407VG\" - -DTARGET_STM32F4 -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 + -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 -DHAVE_HWSERIAL2 -DHAVE_HWSERIAL3 -DPIN_SERIAL2_RX=PD_6 @@ -1226,10 +1222,10 @@ platform = ${common_stm32.platform} extends = common_stm32 build_flags = ${common_stm32.build_flags} -Os - "-DUSB_PRODUCT=\"RUMBA32\"" -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED + -DTIMER_SERIAL=TIM9 board = rumba32_f446ve upload_protocol = dfu monitor_speed = 500000 From a8904d25baf979a79983db1937db4e46295fea05 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 8 Sep 2020 22:14:59 -0500 Subject: [PATCH 0205/1370] Minor HAL cleanup --- .../dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp | 2 +- Marlin/src/HAL/STM32F1/SoftwareSerial.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.h | 6 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 11 +- Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp | 2 +- .../src/HAL/shared/backtrace/unwmemaccess.cpp | 220 +++++++++--------- 7 files changed, 127 insertions(+), 118 deletions(-) diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp index 2ef7011b1c..28e82d70d4 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -147,4 +147,4 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va #endif // HAS_GRAPHICAL_LCD -#endif //__SAM3X8E__ +#endif // __SAM3X8E__ diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp index 3641c9fdf0..993403cf72 100644 --- a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp +++ b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp @@ -57,4 +57,4 @@ void SoftwareSerial::stopListening() { listening = false; } -#endif //__STM32F1__ +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp index 6fe81819ab..ebd0b4cee7 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp @@ -72,7 +72,7 @@ static SPISettings spiConfig; */ void spiBegin() { #if !defined(SS_PIN) || SS_PIN < 0 - #error SS_PIN not defined! + #error "SS_PIN not defined!" #endif OUT_WRITE(SS_PIN, HIGH); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 890930f7f8..ad095cba83 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -44,8 +44,10 @@ //#undef MOTHERBOARD //#define MOTHERBOARD BOARD_TEENSY31_32 -#define IS_32BIT_TEENSY defined(__MK20DX256__) -#define IS_TEENSY32 defined(__MK20DX256__) +#ifdef __MK20DX256__ + #define IS_32BIT_TEENSY 1 + #define IS_TEENSY32 1 +#endif #define NUM_SERIAL 1 diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 5442ae2d3b..96be08d7b7 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -45,9 +45,14 @@ // Defines // ------------------------ -#define IS_32BIT_TEENSY (defined(__MK64FX512__) || defined(__MK66FX1M0__)) -#define IS_TEENSY35 defined(__MK64FX512__) -#define IS_TEENSY36 defined(__MK66FX1M0__) +#ifdef __MK64FX512__ + #define IS_32BIT_TEENSY 1 + #define IS_TEENSY35 1 +#endif +#ifdef __MK66FX1M0__ + #define IS_32BIT_TEENSY 1 + #define IS_TEENSY36 1 +#endif #define NUM_SERIAL 1 diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp index 0b1ae4afa4..812aa90c83 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp @@ -31,7 +31,7 @@ static SPISettings spiConfig; void spiBegin() { #if !PIN_EXISTS(SS) - #error SS_PIN not defined! + #error "SS_PIN not defined!" #endif OUT_WRITE(SS_PIN, HIGH); SET_OUTPUT(SCK_PIN); diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index 8cf31cadf5..02a6ad34f0 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -20,124 +20,126 @@ /* Validate address */ #ifdef ARDUINO_ARCH_SAM -// For DUE, valid address ranges are -// SRAM (0x20070000 - 0x20088000) (96kb) -// FLASH (0x00080000 - 0x00100000) (512kb) -// -#define START_SRAM_ADDR 0x20070000 -#define END_SRAM_ADDR 0x20088000 -#define START_FLASH_ADDR 0x00080000 -#define END_FLASH_ADDR 0x00100000 -#endif -#ifdef TARGET_LPC1768 -// For LPC1769: -// SRAM (0x10000000 - 0x10008000) (32kb) -// FLASH (0x00000000 - 0x00080000) (512kb) -// -#define START_SRAM_ADDR 0x10000000 -#define END_SRAM_ADDR 0x10008000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00080000 -#endif + // For DUE, valid address ranges are + // SRAM (0x20070000 - 0x20088000) (96kb) + // FLASH (0x00080000 - 0x00100000) (512kb) + // + #define START_SRAM_ADDR 0x20070000 + #define END_SRAM_ADDR 0x20088000 + #define START_FLASH_ADDR 0x00080000 + #define END_FLASH_ADDR 0x00100000 -#if 0 -// For STM32F103CBT6 -// SRAM (0x20000000 - 0x20005000) (20kb) -// FLASH (0x00000000 - 0x00020000) (128kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20005000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00020000 -#endif +#elif defined(TARGET_LPC1768) -#if defined(__STM32F1__) || defined(STM32F1xx) || defined(STM32F0xx) -// For STM32F103ZET6/STM32F103VET6/STM32F0xx -// SRAM (0x20000000 - 0x20010000) (64kb) -// FLASH (0x00000000 - 0x00080000) (512kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20010000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00080000 -#endif + // For LPC1769: + // SRAM (0x10000000 - 0x10008000) (32kb) + // FLASH (0x00000000 - 0x00080000) (512kb) + // + #define START_SRAM_ADDR 0x10000000 + #define END_SRAM_ADDR 0x10008000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00080000 -#if defined(STM32F4) || defined(STM32F4xx) -// For STM32F407VET -// SRAM (0x20000000 - 0x20030000) (192kb) -// FLASH (0x08000000 - 0x08080000) (512kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20030000 -#define START_FLASH_ADDR 0x08000000 -#define END_FLASH_ADDR 0x08080000 -#endif +#elif 0 -#if MB(THE_BORG) -// For STM32F765 in BORG -// SRAM (0x20000000 - 0x20080000) (512kb) -// FLASH (0x08000000 - 0x08100000) (1024kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20080000 -#define START_FLASH_ADDR 0x08000000 -#define END_FLASH_ADDR 0x08100000 -#endif + // For STM32F103CBT6 + // SRAM (0x20000000 - 0x20005000) (20kb) + // FLASH (0x00000000 - 0x00020000) (128kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20005000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00020000 -#if MB(REMRAM_V1) -// For STM32F765VI in RemRam v1 -// SRAM (0x20000000 - 0x20080000) (512kb) -// FLASH (0x08000000 - 0x08200000) (2048kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20080000 -#define START_FLASH_ADDR 0x08000000 -#define END_FLASH_ADDR 0x08200000 -#endif +#elif defined(__STM32F1__) || defined(STM32F1xx) || defined(STM32F0xx) -#ifdef __MK20DX256__ -// For MK20DX256 in TEENSY 3.1 or TEENSY 3.2 -// SRAM (0x1FFF8000 - 0x20008000) (64kb) -// FLASH (0x00000000 - 0x00040000) (256kb) -// -#define START_SRAM_ADDR 0x1FFF8000 -#define END_SRAM_ADDR 0x20008000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00040000 -#endif + // For STM32F103ZET6/STM32F103VET6/STM32F0xx + // SRAM (0x20000000 - 0x20010000) (64kb) + // FLASH (0x00000000 - 0x00080000) (512kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20010000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00080000 -#ifdef __MK64FX512__ -// For MK64FX512 in TEENSY 3.5 -// SRAM (0x1FFF0000 - 0x20020000) (192kb) -// FLASH (0x00000000 - 0x00080000) (512kb) -// -#define START_SRAM_ADDR 0x1FFF0000 -#define END_SRAM_ADDR 0x20020000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00080000 -#endif +#elif defined(STM32F4) || defined(STM32F4xx) -#ifdef __MK66FX1M0__ -// For MK66FX1M0 in TEENSY 3.6 -// SRAM (0x1FFF0000 - 0x20030000) (256kb) -// FLASH (0x00000000 - 0x00140000) (1.25Mb) -// -#define START_SRAM_ADDR 0x1FFF0000 -#define END_SRAM_ADDR 0x20030000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00140000 -#endif + // For STM32F407VET + // SRAM (0x20000000 - 0x20030000) (192kb) + // FLASH (0x08000000 - 0x08080000) (512kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20030000 + #define START_FLASH_ADDR 0x08000000 + #define END_FLASH_ADDR 0x08080000 + +#elif MB(THE_BORG) + + // For STM32F765 in BORG + // SRAM (0x20000000 - 0x20080000) (512kb) + // FLASH (0x08000000 - 0x08100000) (1024kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20080000 + #define START_FLASH_ADDR 0x08000000 + #define END_FLASH_ADDR 0x08100000 + +#elif MB(REMRAM_V1) + + // For STM32F765VI in RemRam v1 + // SRAM (0x20000000 - 0x20080000) (512kb) + // FLASH (0x08000000 - 0x08200000) (2048kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20080000 + #define START_FLASH_ADDR 0x08000000 + #define END_FLASH_ADDR 0x08200000 + +#elif defined(__MK20DX256__) + + // For MK20DX256 in TEENSY 3.1 or TEENSY 3.2 + // SRAM (0x1FFF8000 - 0x20008000) (64kb) + // FLASH (0x00000000 - 0x00040000) (256kb) + // + #define START_SRAM_ADDR 0x1FFF8000 + #define END_SRAM_ADDR 0x20008000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00040000 + +#elif defined(__MK64FX512__) + + // For MK64FX512 in TEENSY 3.5 + // SRAM (0x1FFF0000 - 0x20020000) (192kb) + // FLASH (0x00000000 - 0x00080000) (512kb) + // + #define START_SRAM_ADDR 0x1FFF0000 + #define END_SRAM_ADDR 0x20020000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00080000 + +#elif defined(__MK66FX1M0__) + + // For MK66FX1M0 in TEENSY 3.6 + // SRAM (0x1FFF0000 - 0x20030000) (256kb) + // FLASH (0x00000000 - 0x00140000) (1.25Mb) + // + #define START_SRAM_ADDR 0x1FFF0000 + #define END_SRAM_ADDR 0x20030000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00140000 + +#elif defined(__SAMD51P20A__) + + // For SAMD51x20, valid address ranges are + // SRAM (0x20000000 - 0x20040000) (256kb) + // FLASH (0x00000000 - 0x00100000) (1024kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20040000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00100000 -#ifdef __SAMD51P20A__ -// For SAMD51x20, valid address ranges are -// SRAM (0x20000000 - 0x20040000) (256kb) -// FLASH (0x00000000 - 0x00100000) (1024kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20040000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00100000 #endif static bool validate_addr(uint32_t addr) { @@ -177,4 +179,4 @@ bool UnwReadB(const uint32_t a, uint8_t *v) { return true; } -#endif +#endif // __arm__ || __thumb__ From ea39d3c45e0a9076f2cd74702af96b2a9d3c43cc Mon Sep 17 00:00:00 2001 From: bilsef Date: Wed, 9 Sep 2020 16:57:20 -0700 Subject: [PATCH 0206/1370] Support for Teensy 4 (#19311) --- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 167 ++++++++++++++++ Marlin/src/HAL/TEENSY40_41/HAL.h | 180 ++++++++++++++++++ Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp | 138 ++++++++++++++ Marlin/src/HAL/TEENSY40_41/Servo.cpp | 57 ++++++ Marlin/src/HAL/TEENSY40_41/Servo.h | 39 ++++ Marlin/src/HAL/TEENSY40_41/eeprom.cpp | 77 ++++++++ .../src/HAL/TEENSY40_41/endstop_interrupts.h | 66 +++++++ Marlin/src/HAL/TEENSY40_41/fastio.h | 58 ++++++ .../HAL/TEENSY40_41/inc/Conditionals_LCD.h | 26 +++ .../HAL/TEENSY40_41/inc/Conditionals_adv.h | 22 +++ .../HAL/TEENSY40_41/inc/Conditionals_post.h | 26 +++ Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h | 38 ++++ Marlin/src/HAL/TEENSY40_41/pinsDebug.h | 146 ++++++++++++++ Marlin/src/HAL/TEENSY40_41/spi_pins.h | 27 +++ Marlin/src/HAL/TEENSY40_41/timers.cpp | 114 +++++++++++ Marlin/src/HAL/TEENSY40_41/timers.h | 119 ++++++++++++ Marlin/src/HAL/TEENSY40_41/watchdog.cpp | 52 +++++ Marlin/src/HAL/TEENSY40_41/watchdog.h | 30 +++ Marlin/src/HAL/platforms.h | 2 + .../src/HAL/shared/backtrace/unwmemaccess.cpp | 13 ++ Marlin/src/HAL/shared/servo.h | 2 + Marlin/src/core/boards.h | 5 + Marlin/src/libs/private_spi.h | 2 +- Marlin/src/module/motion.h | 16 +- Marlin/src/pins/pins.h | 4 + Marlin/src/pins/teensy4/pins_T41U5XBB.h | 119 ++++++++++++ Marlin/src/pins/teensy4/pins_TEENSY41.h | 129 +++++++++++++ README.md | 7 + buildroot/share/git/mftest | 4 +- buildroot/tests/teensy41-tests | 123 ++++++++++++ platformio.ini | 13 ++ 31 files changed, 1814 insertions(+), 7 deletions(-) create mode 100644 Marlin/src/HAL/TEENSY40_41/HAL.cpp create mode 100644 Marlin/src/HAL/TEENSY40_41/HAL.h create mode 100644 Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp create mode 100644 Marlin/src/HAL/TEENSY40_41/Servo.cpp create mode 100644 Marlin/src/HAL/TEENSY40_41/Servo.h create mode 100644 Marlin/src/HAL/TEENSY40_41/eeprom.cpp create mode 100644 Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h create mode 100644 Marlin/src/HAL/TEENSY40_41/fastio.h create mode 100644 Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h create mode 100644 Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h create mode 100644 Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h create mode 100644 Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h create mode 100644 Marlin/src/HAL/TEENSY40_41/pinsDebug.h create mode 100644 Marlin/src/HAL/TEENSY40_41/spi_pins.h create mode 100644 Marlin/src/HAL/TEENSY40_41/timers.cpp create mode 100644 Marlin/src/HAL/TEENSY40_41/timers.h create mode 100644 Marlin/src/HAL/TEENSY40_41/watchdog.cpp create mode 100644 Marlin/src/HAL/TEENSY40_41/watchdog.h create mode 100644 Marlin/src/pins/teensy4/pins_T41U5XBB.h create mode 100644 Marlin/src/pins/teensy4/pins_TEENSY41.h create mode 100644 buildroot/tests/teensy41-tests diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp new file mode 100644 index 0000000000..f5d37f5fc4 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -0,0 +1,167 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: HAL for Teensy40 (IMXRT1062) + */ + +#ifdef __IMXRT1062__ + +#include "HAL.h" +#include "../shared/Delay.h" +#include "timers.h" + +#include + +uint16_t HAL_adc_result, HAL_adc_select; + +static const uint8_t pin2sc1a[] = { + 0x07, // 0/A0 AD_B1_02 + 0x08, // 1/A1 AD_B1_03 + 0x0C, // 2/A2 AD_B1_07 + 0x0B, // 3/A3 AD_B1_06 + 0x06, // 4/A4 AD_B1_01 + 0x05, // 5/A5 AD_B1_00 + 0x0F, // 6/A6 AD_B1_10 + 0x00, // 7/A7 AD_B1_11 + 0x0D, // 8/A8 AD_B1_08 + 0x0E, // 9/A9 AD_B1_09 + 0x01, // 24/A10 AD_B0_12 + 0x02, // 25/A11 AD_B0_13 + 0x83, // 26/A12 AD_B1_14 - only on ADC2, 3 + 0x84, // 27/A13 AD_B1_15 - only on ADC2, 4 + 0x07, // 14/A0 AD_B1_02 + 0x08, // 15/A1 AD_B1_03 + 0x0C, // 16/A2 AD_B1_07 + 0x0B, // 17/A3 AD_B1_06 + 0x06, // 18/A4 AD_B1_01 + 0x05, // 19/A5 AD_B1_00 + 0x0F, // 20/A6 AD_B1_10 + 0x00, // 21/A7 AD_B1_11 + 0x0D, // 22/A8 AD_B1_08 + 0x0E, // 23/A9 AD_B1_09 + 0x01, // 24/A10 AD_B0_12 + 0x02, // 25/A11 AD_B0_13 + 0x83, // 26/A12 AD_B1_14 - only on ADC2, 3 + 0x84, // 27/A13 AD_B1_15 - only on ADC2, 4 + #ifdef ARDUINO_TEENSY41 + 0xFF, // 28 + 0xFF, // 29 + 0xFF, // 30 + 0xFF, // 31 + 0xFF, // 32 + 0xFF, // 33 + 0xFF, // 34 + 0xFF, // 35 + 0xFF, // 36 + 0xFF, // 37 + 0x81, // 38/A14 AD_B1_12 - only on ADC2, 1 + 0x82, // 39/A15 AD_B1_13 - only on ADC2, 2 + 0x09, // 40/A16 AD_B1_04 + 0x0A, // 41/A17 AD_B1_05 + #endif +}; + +/* +// disable interrupts +void cli() { noInterrupts(); } + +// enable interrupts +void sei() { interrupts(); } +*/ + +void HAL_adc_init() { + analog_init(); + while (ADC1_GC & ADC_GC_CAL) ; + while (ADC2_GC & ADC_GC_CAL) ; +} + +void HAL_clear_reset_source() { + uint32_t reset_source = SRC_SRSR; + SRC_SRSR = reset_source; + } + +uint8_t HAL_get_reset_source() { + switch (SRC_SRSR & 0xFF) { + case 1: return RST_POWER_ON; break; + case 2: return RST_SOFTWARE; break; + case 4: return RST_EXTERNAL; break; + // case 8: return RST_BROWN_OUT; break; + case 16: return RST_WATCHDOG; break; + case 64: return RST_JTAG; break; + // case 128: return RST_OVERTEMP; break; + } + return 0; +} + +#define __bss_end _ebss + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + // Doesn't work on Teensy 4.x + uint32_t freeMemory() { + uint32_t free_memory; + if ((uint32_t)__brkval == 0) + free_memory = ((uint32_t)&free_memory) - ((uint32_t)&__bss_end); + else + free_memory = ((uint32_t)&free_memory) - ((uint32_t)__brkval); + return free_memory; + } +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + const uint16_t pin = pin2sc1a[adc_pin]; + if (pin == 0xFF) { + HAL_adc_select = -1; // Digital only + } + else if (pin & 0x80) { + HAL_adc_select = 1; + ADC2_HC0 = pin & 0x7F; + } + else { + HAL_adc_select = 0; + ADC1_HC0 = pin; + } +} + +uint16_t HAL_adc_get_result() { + switch (HAL_adc_select) { + case 0: + while (!(ADC1_HS & ADC_HS_COCO0)) ; // wait + return ADC1_R0; + case 1: + while (!(ADC2_HS & ADC_HS_COCO0)) ; // wait + return ADC2_R0; + } + return 0; +} + +bool is_output(uint8_t pin) { + const struct digital_pin_bitband_and_config_table_struct *p; + p = digital_pin_to_info_PGM + pin; + return (*(p->reg + 1) & p->mask); +} + +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h new file mode 100644 index 0000000000..0626d4ee9c --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Description: HAL for Teensy 4.0 and Teensy 4.1 + */ + +#define CPU_32_BIT + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio.h" +#include "watchdog.h" + +#include +#include + +//#define ST7920_DELAY_1 DELAY_NS(600) +//#define ST7920_DELAY_2 DELAY_NS(750) +//#define ST7920_DELAY_3 DELAY_NS(750) + +// ------------------------ +// Defines +// ------------------------ + +#ifdef __IMXRT1062__ + #define IS_32BIT_TEENSY 1 + #define IS_TEENSY41 1 +#endif + +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 0 + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 +#elif SERIAL_PORT == 4 + #define MYSERIAL0 Serial4 +#elif SERIAL_PORT == 5 + #define MYSERIAL0 Serial5 +#elif SERIAL_PORT == 6 + #define MYSERIAL0 Serial6 +#elif SERIAL_PORT == 7 + #define MYSERIAL0 Serial7 +#elif SERIAL_PORT == 8 + #define MYSERIAL0 Serial8 +#else + #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." +#endif + +#ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different from SERIAL_PORT. Please update your configuration." + #elif SERIAL_PORT_2 == -1 + #define MYSERIAL1 usbSerial + #elif SERIAL_PORT_2 == 0 + #define MYSERIAL1 Serial + #elif SERIAL_PORT_2 == 1 + #define MYSERIAL1 Serial1 + #elif SERIAL_PORT_2 == 2 + #define MYSERIAL1 Serial2 + #elif SERIAL_PORT_2 == 3 + #define MYSERIAL1 Serial3 + #elif SERIAL_PORT_2 == 4 + #define MYSERIAL1 Serial4 + #elif SERIAL_PORT_2 == 5 + #define MYSERIAL1 Serial5 + #elif SERIAL_PORT_2 == 6 + #define MYSERIAL1 Serial6 + #elif SERIAL_PORT_2 == 7 + #define MYSERIAL1 Serial7 + #elif SERIAL_PORT_2 == 8 + #define MYSERIAL1 Serial8 + #else + #error "SERIAL_PORT_2 must be from -1 to 8. Please update your configuration." + #endif + #define NUM_SERIAL 2 +#else + #define NUM_SERIAL 1 +#endif + +#define HAL_SERVO_LIB libServo + +typedef int8_t pin_t; + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) +#endif + +#define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_primask()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +#undef sq +#define sq(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Don't place string constants in PROGMEM +#undef PSTR +#define PSTR(str) ({static const char *data = (str); &data[0];}) + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +// Add type-checking to pgm_read_word +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +// Enable hooks into idle and setup for HAL +#define HAL_IDLETASK 1 +FORCE_INLINE void HAL_idletask() {} +FORCE_INLINE void HAL_init() {} + +// Clear reset reason +void HAL_clear_reset_source(); + +// Reset reason +uint8_t HAL_get_reset_source(); + +FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +extern "C" { + uint32_t freeMemory(); +} +#pragma GCC diagnostic pop + +// ADC + +void HAL_adc_init(); + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_ADC_FILTERED // turn off ADC oversampling +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_get_result() +#define HAL_ADC_READY() true + +#define HAL_ANALOG_SELECT(pin) + +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(); + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +bool is_output(uint8_t pin); diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp new file mode 100644 index 0000000000..9ccbb3a1f4 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp @@ -0,0 +1,138 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __IMXRT1062__ + +#include "HAL.h" +#include +#include +#include "spi_pins.h" +#include "../../core/macros.h" + +static SPISettings spiConfig; + +// ------------------------ +// Public functions +// ------------------------ + +#if ENABLED(SOFTWARE_SPI) + // ------------------------ + // Software SPI + // ------------------------ + #error "Software SPI not supported for Teensy 4. Use Hardware SPI." +#else + +// ------------------------ +// Hardware SPI +// ------------------------ + +void spiBegin() { + #ifndef SS_PIN + #error "SS_PIN is not defined!" + #endif + + OUT_WRITE(SS_PIN, HIGH); + + //SET_OUTPUT(SCK_PIN); + //SET_INPUT(MISO_PIN); + //SET_OUTPUT(MOSI_PIN); + + #if 0 && DISABLED(SOFTWARE_SPI) + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif + // set a default rate + spiInit(SPI_HALF_SPEED); // 1 + #endif +} + +void spiInit(uint8_t spiRate) { + // Use Marlin data-rates + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 10000000; break; + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 312500; break; + default: + clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +uint8_t spiRec() { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; + //SPDR = 0xFF; + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //return SPDR; +} + +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transfer(buf, nbyte); + SPI.endTransaction(); + //if (nbyte-- == 0) return; + // SPDR = 0xFF; + //for (uint16_t i = 0; i < nbyte; i++) { + // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + // buf[i] = SPDR; + // SPDR = 0xFF; + //} + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //buf[nbyte] = SPDR; +} + +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); + //SPDR = b; + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +} + +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPI.endTransaction(); +} + +// Begin SPI transaction, set clock, bit order, data mode +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + SPI.beginTransaction(spiConfig); +} + +#endif // SOFTWARE_SPI +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.cpp b/Marlin/src/HAL/TEENSY40_41/Servo.cpp new file mode 100644 index 0000000000..e3d0d03449 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/Servo.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __IMXRT1062__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +int8_t libServo::attach(const int inPin) { + if (inPin > 0) servoPin = inPin; + return super::attach(servoPin); +} + +int8_t libServo::attach(const int inPin, const int inMin, const int inMax) { + if (inPin > 0) servoPin = inPin; + return super::attach(servoPin, inMin, inMax); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (attach(0) >= 0) { + write(value); + safe_delay(servo_delay[servoIndex]); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +void libServo::detach() { + // PWMServo library does not have detach() function + //super::detach(); +} + +#endif // HAS_SERVOS + +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.h b/Marlin/src/HAL/TEENSY40_41/Servo.h new file mode 100644 index 0000000000..ce910ed8a8 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/Servo.h @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +// Inherit and expand on core Servo library +class libServo : public PWMServo { + public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); + void detach(void); + private: + typedef PWMServo super; + uint8_t servoPin; + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // Index into the channel data for this servo +}; diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp new file mode 100644 index 0000000000..5491e04fbc --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp @@ -0,0 +1,77 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __IMXRT1062__ + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with implementations supplied by the framework. + */ + +#include "../shared/eeprom_api.h" +#include + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { return true; } +bool PersistentStore::access_finish() { return true; } + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + } + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h new file mode 100644 index 0000000000..92e22efc0f --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h @@ -0,0 +1,66 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/TEENSY40_41/fastio.h b/Marlin/src/HAL/TEENSY40_41/fastio.h new file mode 100644 index 0000000000..19b8114509 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/fastio.h @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Fast I/O interfaces for Teensy 4 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef PWM + #define PWM OUTPUT +#endif + +#define READ(IO) digitalRead(IO) +#define WRITE(IO,V) digitalWrite(IO,V) + +#define _GET_MODE(IO) !is_output(IO) +#define _SET_MODE(IO,M) pinMode(IO, M) +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) +#define SET_PWM(IO) _SET_MODE(IO, PWM) + +#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) + +#define IS_INPUT(IO) !is_output(IO) +#define IS_OUTPUT(IO) is_output(IO) + +#define PWM_PIN(P) digitalPinHasPWM(P) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h new file mode 100644 index 0000000000..6a8540927b --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/TEENSY40_41." +#endif diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h new file mode 100644 index 0000000000..5f1c4b1601 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h new file mode 100644 index 0000000000..998f1dcc0d --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if USE_FALLBACK_EEPROM + #define USE_WIRED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h new file mode 100644 index 0000000000..fbfe7b0fc3 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Test TEENSY41 specific configuration values for errors at compile-time. + */ + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for Teensy 4.0/4.1. Disable EMERGENCY_PARSER to continue." +#endif + +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on Teensy 4.0/4.1." +#endif + +#if HAS_TMC_SW_SERIAL + #error "TMC220x Software Serial is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h new file mode 100644 index 0000000000..890f668650 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h @@ -0,0 +1,146 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#warning "PINS_DEBUGGING is not fully supported for Teensy 4.0 / 4.1 so 'M43' may cause hangs." + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS + +#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin +#define PRINT_PORT(p) +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital +#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0) +#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) +#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(13)) || ((P) >= analogInputToDigitalPin(14) && (P) <= analogInputToDigitalPin(17)) +#define pwm_status(pin) HAL_pwm_status(pin) +#define GET_PINMODE(PIN) (VALID_PIN(pin) && IS_OUTPUT(pin)) +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +struct pwm_pin_info_struct { + uint8_t type; // 0=no pwm, 1=flexpwm, 2=quad + uint8_t module; // 0-3, 0-3 + uint8_t channel; // 0=X, 1=A, 2=B + uint8_t muxval; // +}; + +#define M(a, b) ((((a) - 1) << 4) | (b)) + +const struct pwm_pin_info_struct pwm_pin_info[] = { + {1, M(1, 1), 0, 4}, // FlexPWM1_1_X 0 // AD_B0_03 + {1, M(1, 0), 0, 4}, // FlexPWM1_0_X 1 // AD_B0_02 + {1, M(4, 2), 1, 1}, // FlexPWM4_2_A 2 // EMC_04 + {1, M(4, 2), 2, 1}, // FlexPWM4_2_B 3 // EMC_05 + {1, M(2, 0), 1, 1}, // FlexPWM2_0_A 4 // EMC_06 + {1, M(2, 1), 1, 1}, // FlexPWM2_1_A 5 // EMC_08 + {1, M(2, 2), 1, 2}, // FlexPWM2_2_A 6 // B0_10 + {1, M(1, 3), 2, 6}, // FlexPWM1_3_B 7 // B1_01 + {1, M(1, 3), 1, 6}, // FlexPWM1_3_A 8 // B1_00 + {1, M(2, 2), 2, 2}, // FlexPWM2_2_B 9 // B0_11 + {2, M(1, 0), 0, 1}, // QuadTimer1_0 10 // B0_00 + {2, M(1, 2), 0, 1}, // QuadTimer1_2 11 // B0_02 + {2, M(1, 1), 0, 1}, // QuadTimer1_1 12 // B0_01 + {2, M(2, 0), 0, 1}, // QuadTimer2_0 13 // B0_03 + {2, M(3, 2), 0, 1}, // QuadTimer3_2 14 // AD_B1_02 + {2, M(3, 3), 0, 1}, // QuadTimer3_3 15 // AD_B1_03 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {2, M(3, 1), 0, 1}, // QuadTimer3_1 18 // AD_B1_01 + {2, M(3, 0), 0, 1}, // QuadTimer3_0 19 // AD_B1_00 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(4, 0), 1, 1}, // FlexPWM4_0_A 22 // AD_B1_08 + {1, M(4, 1), 1, 1}, // FlexPWM4_1_A 23 // AD_B1_09 + {1, M(1, 2), 0, 4}, // FlexPWM1_2_X 24 // AD_B0_12 + {1, M(1, 3), 0, 4}, // FlexPWM1_3_X 25 // AD_B0_13 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(3, 1), 2, 1}, // FlexPWM3_1_B 28 // EMC_32 + {1, M(3, 1), 1, 1}, // FlexPWM3_1_A 29 // EMC_31 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(2, 0), 2, 1}, // FlexPWM2_0_B 33 // EMC_07 + #ifdef ARDUINO_TEENSY40 + {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 34 // SD_B0_03 + {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 35 // SD_B0_02 + {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 36 // SD_B0_01 + {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 37 // SD_B0_00 + {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 38 // SD_B0_05 + {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 39 // SD_B0_04 + #endif + #ifdef ARDUINO_TEENSY41 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(2, 3), 1, 6}, // FlexPWM2_3_A 36 // B1_00 + {1, M(2, 3), 2, 6}, // FlexPWM2_3_B 37 // B1_01 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 42 // SD_B0_03 + {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 43 // SD_B0_02 + {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 44 // SD_B0_01 + {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 45 // SD_B0_00 + {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 46 // SD_B0_05 + {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 47 // SD_B0_04 + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_0_B + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_2_A + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_2_B + {1, M(3, 3), 2, 1}, // FlexPWM3_3_B 51 // EMC_22 + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_1_B + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_1_A + {1, M(3, 0), 1, 1}, // FlexPWM3_0_A 53 // EMC_29 + #endif +}; + +void HAL_print_analog_pin(char buffer[], int8_t pin) { + if (pin <= 23) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 14)); + else if (pin <= 41) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 24)); +} + +void HAL_analog_pin_state(char buffer[], int8_t pin) { + if (pin <= 23) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 14)); + else if (pin <= 41) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 24)); +} + +#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), V); SERIAL_ECHO(buffer); }while(0) + +/** + * Print a pin's PWM status. + * Return true if it's currently a PWM pin. + */ +bool HAL_pwm_status(int8_t pin) { + char buffer[20]; // for the sprintf statements + const struct pwm_pin_info_struct *info; + + if (pin >= CORE_NUM_DIGITAL) return 0; + info = pwm_pin_info + pin; + + if (info->type == 0) return 0; + + /* TODO decode pwm value from timers */ + // for now just indicate if output is set as pwm + PWM_PRINT(*(portConfigRegister(pin)) == info->muxval); + return (*(portConfigRegister(pin)) == info->muxval); +} + +static void pwm_details(uint8_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/TEENSY40_41/spi_pins.h b/Marlin/src/HAL/TEENSY40_41/spi_pins.h new file mode 100644 index 0000000000..276d4f456a --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/spi_pins.h @@ -0,0 +1,27 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define SCK_PIN 13 +#define MISO_PIN 12 +#define MOSI_PIN 11 +#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY40_41/timers.cpp b/Marlin/src/HAL/TEENSY40_41/timers.cpp new file mode 100644 index 0000000000..15f5185a6b --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/timers.cpp @@ -0,0 +1,114 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Teensy4.0/4.1 (__IMXRT1062__) + */ + +#ifdef __IMXRT1062__ + +#include "../../inc/MarlinConfig.h" + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + CCM_CSCMR1 &= ~CCM_CSCMR1_PERCLK_CLK_SEL; // turn off 24mhz mode + CCM_CCGR1 |= CCM_CCGR1_GPT1_BUS(CCM_CCGR_ON); + + GPT1_CR = 0; // disable timer + GPT1_SR = 0x3F; // clear all prior status + GPT1_PR = GPT1_TIMER_PRESCALE - 1; + GPT1_CR |= GPT_CR_CLKSRC(1); //clock selection #1 (peripheral clock = 150 MHz) + GPT1_CR |= GPT_CR_ENMOD; //reset count to zero before enabling + GPT1_CR |= GPT_CR_OM1(1); // toggle mode + GPT1_OCR1 = (GPT1_TIMER_RATE / frequency) -1; // Initial compare value + GPT1_IR = GPT_IR_OF1IE; // Compare3 value + GPT1_CR |= GPT_CR_EN; //enable GPT2 counting at 150 MHz + + OUT_WRITE(15, HIGH); + attachInterruptVector(IRQ_GPT1, &stepTC_Handler); + NVIC_SET_PRIORITY(IRQ_GPT1, 16); + break; + case 1: + CCM_CSCMR1 &= ~CCM_CSCMR1_PERCLK_CLK_SEL; // turn off 24mhz mode + CCM_CCGR0 |= CCM_CCGR0_GPT2_BUS(CCM_CCGR_ON); + + GPT2_CR = 0; // disable timer + GPT2_SR = 0x3F; // clear all prior status + GPT2_PR = GPT2_TIMER_PRESCALE - 1; + GPT2_CR |= GPT_CR_CLKSRC(1); //clock selection #1 (peripheral clock = 150 MHz) + GPT2_CR |= GPT_CR_ENMOD; //reset count to zero before enabling + GPT2_CR |= GPT_CR_OM1(1); // toggle mode + GPT2_OCR1 = (GPT2_TIMER_RATE / frequency) -1; // Initial compare value + GPT2_IR = GPT_IR_OF1IE; // Compare3 value + GPT2_CR |= GPT_CR_EN; //enable GPT2 counting at 150 MHz + + OUT_WRITE(14, HIGH); + attachInterruptVector(IRQ_GPT2, &tempTC_Handler); + NVIC_SET_PRIORITY(IRQ_GPT2, 32); + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: + NVIC_ENABLE_IRQ(IRQ_GPT1); + break; + case 1: + NVIC_ENABLE_IRQ(IRQ_GPT2); + break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DISABLE_IRQ(IRQ_GPT1); break; + case 1: NVIC_DISABLE_IRQ(IRQ_GPT2); break; + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + asm volatile("dsb"); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return (NVIC_IS_ENABLED(IRQ_GPT1)); + case 1: return (NVIC_IS_ENABLED(IRQ_GPT2)); + } + return false; +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case 0: + GPT1_SR = GPT_IR_OF1IE; // clear OF3 bit + break; + case 1: + GPT2_SR = GPT_IR_OF1IE; // clear OF3 bit + break; + } + asm volatile("dsb"); +} + +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/timers.h b/Marlin/src/HAL/TEENSY40_41/timers.h new file mode 100644 index 0000000000..9c4bf8c274 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/timers.h @@ -0,0 +1,119 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +/** + * Description: HAL for + * Teensy4.0/4.1 (__IMXRT1062__) + */ + +#include + +// ------------------------ +// Defines +// ------------------------ + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFE + +#define GPT_TIMER_RATE F_BUS_ACTUAL // 150MHz + +#define GPT1_TIMER_PRESCALE 2 +#define GPT2_TIMER_PRESCALE 10 + +#define GPT1_TIMER_RATE (GPT_TIMER_RATE / GPT1_TIMER_PRESCALE) // 75MHz +#define GPT2_TIMER_RATE (GPT_TIMER_RATE / GPT2_TIMER_PRESCALE) // 15MHz + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif + +#define TEMP_TIMER_RATE 1000000 +#define TEMP_TIMER_FREQUENCY 1000 + +#define STEPPER_TIMER_RATE GPT1_TIMER_RATE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) +#define STEPPER_TIMER_PRESCALE ((GPT_TIMER_RATE / 1000000) / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() // GPT1_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() // GPT2_Handler() +#endif + +extern "C" void stepTC_Handler(); +extern "C" void tempTC_Handler(); + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: + GPT1_OCR1 = compare - 1; + break; + case 1: + GPT2_OCR1 = compare - 1; + break; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return GPT1_OCR1; + case 1: return GPT2_OCR1; + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return GPT1_CNT; + case 1: return GPT2_CNT; + } + return 0; +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +void HAL_timer_isr_prologue(const uint8_t timer_num); +//void HAL_timer_isr_epilogue(const uint8_t timer_num) {} +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp new file mode 100644 index 0000000000..4253944f2b --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __IMXRT1062__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog.h" + +// 4 seconds timeout +#define WDTO 4 //seconds + +uint8_t timeoutval = (WDTO - 0.5f) / 0.5f; + +void watchdog_init() { + + CCM_CCGR3 |= CCM_CCGR3_WDOG1(3); // enable WDOG1 clocks + WDOG1_WMCR = 0; // disable power down PDE + WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval); + WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE; + +} + +void HAL_watchdog_refresh() { + // Watchdog refresh sequence + WDOG1_WSR = 0x5555; + WDOG1_WSR = 0xAAAA; +} + +#endif // USE_WATCHDOG + +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.h b/Marlin/src/HAL/TEENSY40_41/watchdog.h new file mode 100644 index 0000000000..f10ecb5aef --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/watchdog.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Watchdog for Teensy4.0/4.1 (__IMXRT1062__) + */ + +void watchdog_init(); + +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h index d4cec64267..ef17d19170 100644 --- a/Marlin/src/HAL/platforms.h +++ b/Marlin/src/HAL/platforms.h @@ -31,6 +31,8 @@ #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY31_32/NAME) #elif defined(__MK64FX512__) || defined(__MK66FX1M0__) #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY35_36/NAME) +#elif defined(__IMXRT1062__) + #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY40_41/NAME) #elif defined(TARGET_LPC1768) #define HAL_PATH(PATH, NAME) XSTR(PATH/LPC1768/NAME) #elif defined(__STM32F1__) || defined(TARGET_STM32F1) diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index 02a6ad34f0..4b085f90ce 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -129,6 +129,19 @@ #define START_FLASH_ADDR 0x00000000 #define END_FLASH_ADDR 0x00140000 +#elif defined(__IMXRT1062__) + + // For IMXRT1062 in TEENSY 4.0/4/1 + // ITCM (rwx): ORIGIN = 0x00000000, LENGTH = 512K + // DTCM (rwx): ORIGIN = 0x20000000, LENGTH = 512K + // RAM (rwx): ORIGIN = 0x20200000, LENGTH = 512K + // FLASH (rwx): ORIGIN = 0x60000000, LENGTH = 1984K + // + #define START_SRAM_ADDR 0x00000000 + #define END_SRAM_ADDR 0x20280000 + #define START_FLASH_ADDR 0x60000000 + #define END_FLASH_ADDR 0x601F0000 + #elif defined(__SAMD51P20A__) // For SAMD51x20, valid address ranges are diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h index f9c4784118..ccaf1f0255 100644 --- a/Marlin/src/HAL/shared/servo.h +++ b/Marlin/src/HAL/shared/servo.h @@ -71,6 +71,8 @@ #include "../TEENSY31_32/Servo.h" #elif IS_TEENSY35 || IS_TEENSY36 #include "../TEENSY35_36/Servo.h" +#elif IS_TEENSY40 || IS_TEENSY41 + #include "../TEENSY40_41/Servo.h" #elif defined(TARGET_LPC1768) #include "../LPC1768/Servo.h" #elif defined(__STM32F1__) || defined(TARGET_STM32F1) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index c8e1f28754..e10c493097 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -356,10 +356,13 @@ #define BOARD_THE_BORG 5000 // THE-BORG (Power outputs: Hotend0, Hotend1, Bed, Fan) #define BOARD_REMRAM_V1 5001 // RemRam v1 +#define BOARD_TEENSY41 5002 // Teensy4.0 and Teensy4.1 +#define BOARD_T41U5XBB 5003 // T41U5XBB Teensy4.1 breakout board // // Espressif ESP32 WiFi // + #define BOARD_ESPRESSIF_ESP32 6000 // Generic ESP32 #define BOARD_MRR_ESPA 6001 // MRR ESPA board based on ESP32 (native pins only) #define BOARD_MRR_ESPE 6002 // MRR ESPE board based on ESP32 (with I2S stepper stream) @@ -368,11 +371,13 @@ // // SAMD51 ARM Cortex M4 // + #define BOARD_AGCM4_RAMPS_144 6100 // RAMPS 1.4.4 // // Custom board // + #define BOARD_CUSTOM 9998 // Custom pins definition for development and/or rare boards // diff --git a/Marlin/src/libs/private_spi.h b/Marlin/src/libs/private_spi.h index c2a054235b..9c0ffe7486 100644 --- a/Marlin/src/libs/private_spi.h +++ b/Marlin/src/libs/private_spi.h @@ -43,7 +43,7 @@ class SPIclass { SET_INPUT_PULLUP(MISO_PIN); } FORCE_INLINE static uint8_t receive() { - #if defined(__AVR__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) + #if defined(__AVR__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1062__) SPDR = 0; for (;!TEST(SPSR, SPIF);); return SPDR; diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index c3f2d9b779..052e3180c8 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -108,22 +108,28 @@ extern int16_t feedrate_percentage; extern float e_move_accumulator; #endif -inline float pgm_read_any(const float *p) { return pgm_read_float(p); } -inline signed char pgm_read_any(const signed char *p) { return pgm_read_byte(p); } +#ifdef __IMXRT1062__ + #define DEFS_PROGMEM +#else + #define DEFS_PROGMEM PROGMEM +#endif + +inline float pgm_read_any(const float *p) { return TERN(__IMXRT1062__, *p, pgm_read_float(p)); } +inline int8_t pgm_read_any(const int8_t *p) { return TERN(__IMXRT1062__, *p, pgm_read_byte(p)); } #define XYZ_DEFS(T, NAME, OPT) \ inline T NAME(const AxisEnum axis) { \ - static const XYZval NAME##_P PROGMEM = { X_##OPT, Y_##OPT, Z_##OPT }; \ + static const XYZval NAME##_P DEFS_PROGMEM = { X_##OPT, Y_##OPT, Z_##OPT }; \ return pgm_read_any(&NAME##_P[axis]); \ } XYZ_DEFS(float, base_min_pos, MIN_POS); XYZ_DEFS(float, base_max_pos, MAX_POS); XYZ_DEFS(float, base_home_pos, HOME_POS); XYZ_DEFS(float, max_length, MAX_LENGTH); -XYZ_DEFS(signed char, home_dir, HOME_DIR); +XYZ_DEFS(int8_t, home_dir, HOME_DIR); inline float home_bump_mm(const AxisEnum axis) { - static const xyz_pos_t home_bump_mm_P PROGMEM = HOMING_BUMP_MM; + static const xyz_pos_t home_bump_mm_P DEFS_PROGMEM = HOMING_BUMP_MM; return pgm_read_any(&home_bump_mm_P[axis]); } diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 9f120b8b00..7aff582c6d 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -619,6 +619,10 @@ #include "stm32f7/pins_THE_BORG.h" // STM32F7 env:STM32F7 #elif MB(REMRAM_V1) #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:STM32F7 +#elif MB(TEENSY40_41) + #include "teensy4/pins_TEENSY41.h" // Teensy-4.x env:teensy41 +#elif MB(T41U5XBB) + #include "teensy4/pins_T41U5XBB.h" // Teensy-4.x env:teensy41 // // Espressif ESP32 diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h new file mode 100644 index 0000000000..1541bfbd62 --- /dev/null +++ b/Marlin/src/pins/teensy4/pins_T41U5XBB.h @@ -0,0 +1,119 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/**************************************************************************************** +* Teensy 4.1 (IMXRT1062) Breadboard pin assignments +* Requires the Teensyduino software with Teensy 4.1 selected in Arduino IDE! +* https://www.pjrc.com/teensy/teensyduino.html +****************************************************************************************/ + +#if !IS_32BIT_TEENSY || !IS_TEENSY41 + #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" +#else + #define BOARD_INFO_NAME "Teensy4.1" +#endif + +#define AT90USB 1286 // Disable MarlinSerial etc. +#define USBCON //1286 // Disable MarlinSerial etc. +/* + + plan for Teensy4.0 and Teensy4.1: + USB + GND |-----#####-----| VIN (3.65 TO 5.5V) + RX1 CS1 RX1 PWM 0 | ##### | GND + TX1 MISO1 TX1 PWM 1 | | 3.3V + STPX PWM 2 | | 23 A9 PWM + DIRX PWM 3 | | 22 A8 PWM LIMZ + STPY PWM 4 | | 21 A7 RX5 LIMY + DIRY PWM 5 | | 20 A6 TX5 LIMX + STPZ PWM 6 | | 19 A5 PWM SCL0 COOL + DIRZ RX2 PWM 7 | | 18 A4 PWM SDA0 MIST + STPA TX2 PWM 8 | | 17 A3 RX4 SDA1 CYST + DIRA PWM 9 | | 16 A2 TX4 SCL1 EHOLD + STEN PWM 10 | | 15 A1 PWM RX3 PRB + SPDI MOSI0 PWM 11 | | 14 A0 PWM TX3 PANIC + SPEN MISO0 PWM 12 | | 13 LED PWM SCK0 SPWM + 3.3V | | GND + SCL PWM 24 | | 41 A17 KPSTR + SDA PWM 25 | | 40 A16 STENY + STPB MOSI1 26 | | 39 A15 MISO1 STENZ + DIRB SCK1 27 | * * * * * | 38 A14 STENA + LIMB RX7 PWM 28 | | 37 PWM STENB + DOOR TX7 PWM 29 | | 36 PWM ST0 + ST1 30 | | 35 TX8 ST3 + AUX0 31 | SDCARD | 34 RX8 ST2 + AUX1 32 |_______________| 33 PWM AUX2 + + +*/ + +// +// Limit Switches +// +#define X_STOP_PIN 20 +#define Y_STOP_PIN 21 +#define Z_STOP_PIN 22 + +// +// Steppers +// +#define X_STEP_PIN 2 +#define X_DIR_PIN 3 +#define X_ENABLE_PIN 10 +//#define X_CS_PIN 30 + +#define Y_STEP_PIN 4 +#define Y_DIR_PIN 5 +#define Y_ENABLE_PIN 40 +//#define Y_CS_PIN 31 + +#define Z_STEP_PIN 6 +#define Z_DIR_PIN 7 +#define Z_ENABLE_PIN 39 +//#define Z_CS_PIN 32 + +#define E0_STEP_PIN 8 +#define E0_DIR_PIN 9 +#define E0_ENABLE_PIN 38 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 27 +#define E1_ENABLE_PIN 37 + +#define HEATER_0_PIN 31 +#define HEATER_1_PIN 32 +#define HEATER_BED_PIN 33 + +#define TEMP_0_PIN 5 // Extruder / Analog pin numbering: 2 => A2 +#define TEMP_1_PIN 4 +#define TEMP_BED_PIN 15 // Bed / Analog pin numbering + +#define LED_PIN 13 + +#define SOL0_PIN 17 +#define SERVO0_PIN 24 +#define SERVO1_PIN 25 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h new file mode 100644 index 0000000000..08a3f5e0d1 --- /dev/null +++ b/Marlin/src/pins/teensy4/pins_TEENSY41.h @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/**************************************************************************************** +* Teensy 4.1 (IMXRT1062) Breadboard pin assignments +* Requires the Teensyduino software with Teensy 4.1 selected in Arduino IDE! +* https://www.pjrc.com/teensy/teensyduino.html +****************************************************************************************/ + +#if !IS_32BIT_TEENSY || !IS_TEENSY41 + #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" +#else + #define BOARD_INFO_NAME "Teensy4.1" +#endif + +#define AT90USB 1286 // Disable MarlinSerial etc. +#define USBCON //1286 // Disable MarlinSerial etc. +/* + + plan for Teensy4.0 and Teensy4.1: + USB + GND |-----#####-----| VIN (3.65 TO 5.5V) + X_STEP_PIN CS1 RX1 PWM 0 | ##### | GND + X_DIR_PIN MISO1 TX1 PWM 1 | | 3.3V + Y_STEP_PIN PWM 2 | | 23 A9 PWM SERVO1_PIN + Y_DIR_PIN PWM 3 | | 22 A8 PWM SERVO0_PIN + Z_STEP_PIN PWM 4 | | 21 A7 RX5 + Z_DIR_PIN PWM 5 | | 20 A6 TX5 FILWIDTH_PIN + X_ENABLE_PIN PWM 6 | | 19 A5 PWM SCL0 + Y_ENABLE_PIN RX2 PWM 7 | | 18 A4 PWM SDA0 HEATER_1_PIN + Z_ENABLE_PIN TX2 PWM 8 | | 17 A3 RX4 SDA1 + E0_STEP_PIN PWM 9 | | 16 A2 TX4 SCL1 TEMP_0_PIN + E0_DIR_PIN PWM 10 | | 15 A1 PWM RX3 TEMP_BED_PIN + MOSI_PIN MOSI0 PWM 11 | | 14 A0 PWM TX3 TEMP_1_PIN + MISO_PIN MISO0 PWM 12 | | 13 LED PWM SCK0 SCK_PIN + 3.3V | | GND + Z_STOP_PIN PWM 24 | | 41 A17 + E0_ENABLE_PIN PWM 25 | | 40 A16 + FAN_PIN MOSI1 26 | | 39 A15 MISO1 X_STOP_PIN + Z-PROBE PWR SCK1 27 | * * * * * | 38 A14 Y_STOP_PIN + SOL1_PIN RX7 PWM 28 | | 37 PWM HEATER_0_PIN + FAN_PIN TX7 PWM 29 | | 36 PWM HEATER_BED_PIN + X_CS_PIN 30 | | 35 TX8 E1_ENABLE_PIN + y_CS_PIN 31 | SDCARD | 34 RX8 E1_DIR_PIN + Z_CS_PIN 32 |_______________| 33 PWM E1_STEP_PIN + + +*/ + +// +// Limit Switches +// +#define X_STOP_PIN 39 +#define Y_STOP_PIN 38 +#define Z_STOP_PIN 24 + +// +// Steppers +// +#define X_STEP_PIN 0 +#define X_DIR_PIN 1 +#define X_ENABLE_PIN 6 +//#define X_CS_PIN 30 + +#define Y_STEP_PIN 2 +#define Y_DIR_PIN 3 +#define Y_ENABLE_PIN 7 +//#define Y_CS_PIN 31 + +#define Z_STEP_PIN 4 +#define Z_DIR_PIN 5 +#define Z_ENABLE_PIN 8 +//#define Z_CS_PIN 32 + +#define E0_STEP_PIN 9 +#define E0_DIR_PIN 10 +#define E0_ENABLE_PIN 25 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 35 + +#define HEATER_0_PIN 37 +#define HEATER_1_PIN 18 +#define HEATER_BED_PIN 36 +#ifndef FAN_PIN + #define FAN_PIN 29 +#endif + +#define TEMP_0_PIN 2 // Extruder / Analog pin numbering: 2 => A2 +#define TEMP_1_PIN 0 +#define TEMP_BED_PIN 1 // Bed / Analog pin numbering + +#define LED_PIN 13 +//#define PS_ON_PIN 1 +//#define ALARM_PIN -1 + +//#define FILWIDTH_PIN 6 // A6 +#define SOL0_PIN 28 +#define SERVO0_PIN 22 +#define SERVO1_PIN 23 + +//#define SCK_PIN 13 +//#define MISO_PIN 12 +//#define MOSI_PIN 11 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif diff --git a/README.md b/README.md index 042cf3303b..839b9f3f65 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,13 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level [Teensy 3.5](https://www.pjrc.com/store/teensy35.html)|[MK64FX512VMD12](https://www.mouser.com/ProductDetail/NXP-Freescale/MK64FX512VMD12) ARM-Cortex M4|120MHz|512k|192k|3.3-5V|yes [Teensy 3.6](https://www.pjrc.com/store/teensy36.html)|[MK66FX1M0VMD18](https://www.mouser.com/ProductDetail/NXP-Freescale/MK66FX1M0VMD18) ARM-Cortex M4|180MHz|1M|256k|3.3V|yes + #### Teensy 4.0 / 4.1 + + boards|processor|speed|flash|sram|logic|fpu + ----|---------|-----|-----|----|-----|--- + [Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|[IMXRT1062](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes + [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|[IMXRT1062](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes + ## Submitting Patches Proposed patches should be submitted as a Pull Request against the ([bugfix-2.0.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.0.x)) branch. diff --git a/buildroot/share/git/mftest b/buildroot/share/git/mftest index 3a88bf5f28..cfb5dd05f3 100755 --- a/buildroot/share/git/mftest +++ b/buildroot/share/git/mftest @@ -48,6 +48,8 @@ case $TESTENV in t32) TESTENV='teensy31' ;; t35) TESTENV='teensy35' ;; t36) TESTENV='teensy35' ;; + t40) TESTENV='teensy41' ;; + t41) TESTENV='teensy41' ;; -h|--help) echo -e "$(basename $0) : Marlin Firmware test, build, and upload\n" echo "Usage: $(basename $0) ................. Select env and test to apply / run" @@ -56,7 +58,7 @@ case $TESTENV in echo " $(basename $0) -b [variant] .... Auto-build the specified variant" echo " $(basename $0) -u [variant] .... Auto-build and upload the specified variant" echo - echo "env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36" + echo "env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41" exit ;; diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests new file mode 100644 index 0000000000..04baf029d9 --- /dev/null +++ b/buildroot/tests/teensy41-tests @@ -0,0 +1,123 @@ +#!/usr/bin/env bash +# +# Build tests for Teensy 4.0/4.1 (ARM Cortex-M7) +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +exec_test $1 $2 "Teensy4.1 with default config" + +# +# Test as many features together as possible +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_0 1 +opt_set TEMP_SENSOR_1 5 +opt_set TEMP_SENSOR_BED 1 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ + FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ + PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER \ + ADVANCED_PAUSE_FEATURE ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES PARK_HEAD_ON_PAUSE \ + PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ + HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT +opt_set I2C_SLAVE_ADDRESS 63 +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "Teensy4.1 with many features" + +# +# Test a Sled Z Probe with Linear leveling +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable EEPROM_SETTINGS Z_PROBE_SLED Z_SAFE_HOMING AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE GCODE_MACROS +exec_test $1 $2 "Sled Z Probe with Linear leveling" + +# +# Test a Servo Probe +# +# restore_configs +# opt_set MOTHERBOARD BOARD_TEENSY41 +# opt_enable Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE \ +# AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS +# opt_set NUM_SERVOS 1 +# exec_test $1 $2 "Servo Probe" +# +# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES +# +# opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS \ +# EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES +# exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" + +# +# Test MAGNETIC_PARKING_EXTRUDER with LCD +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 1 +opt_enable MAGNETIC_PARKING_EXTRUDER ULTIMAKERCONTROLLER +exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" + +# +# Mixing Extruder +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +opt_set MIXING_STEPPERS 2 +exec_test $1 $2 "Mixing Extruder" + +# +# Test SWITCHING_EXTRUDER +# +# restore_configs +# opt_set MOTHERBOARD BOARD_TEENSY41 +# opt_set EXTRUDERS 2 +# opt_set NUM_SERVOS 1 +# opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER +# exec_test $1 $2 "SWITCHING_EXTRUDER" + +# +# Enable COREXY +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable COREXY +opt_set X_DRIVER_TYPE TMC5160 +opt_set Y_DRIVER_TYPE TMC5160 +opt_set X_MIN_ENDSTOP_INVERTING true +opt_set Y_MIN_ENDSTOP_INVERTING true +opt_add X_CS_PIN 46 +opt_add Y_CS_PIN 47 +opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +exec_test $1 $2 "Teensy 4.0/4.1 COREXY" + +# +# Enable COREXZ +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable COREXZ +exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" + +# +# Enable Dual Z with Dual Z endstops +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable Z_MULTI_ENDSTOPS +opt_set NUM_Z_STEPPER_DRIVERS 2 +pins_set ramps/RAMPS X_MAX_PIN -1 +opt_add Z2_MAX_PIN 2 +opt_enable USE_XMAX_PLUG +exec_test $1 $2 "Dual Z with Dual Z endstops" + +# Clean up +restore_configs diff --git a/platformio.ini b/platformio.ini index f46e609969..38d874d865 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1264,6 +1264,19 @@ platform = teensy board = teensy35 src_filter = ${common.default_src_filter} + +[env:teensy36] +platform = teensy +board = teensy36 +src_filter = ${common.default_src_filter} + + +# +# Teensy 4.0 / 4.1 (ARM Cortex-M7) +# +[env:teensy41] +platform = teensy +board = teensy41 +src_filter = ${common.default_src_filter} + + # # Native # No supported Arduino libraries, base Marlin only From e6cf9591701ca615650af3e969ce7a44b48a6a60 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 9 Sep 2020 19:23:01 -0700 Subject: [PATCH 0207/1370] Fix compile with Danish, Basque (#19325) --- Marlin/src/lcd/language/language_da.h | 4 ++-- Marlin/src/lcd/language/language_eu.h | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index 7a9321d001..c6f5647d5a 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -52,7 +52,7 @@ namespace Language_da { #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Forvarm ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Forvarm ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end") + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end"); PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ~"); PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Alle"); PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Bed"); @@ -60,7 +60,7 @@ namespace Language_da { PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Forvarm $"); PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Forvarm $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Forvarm $ end") + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Forvarm $ end"); PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Forvarm $ end ~"); PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Forvarm $ Alle"); PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Forvarm $ Bed"); diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 5b38299e76..36586fd2fa 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -278,8 +278,7 @@ namespace Language_eu { PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudioak"); PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoloa"); PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Kabina Argia"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS - = ; + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Argiaren Distira"); #if LCD_WIDTH >= 20 PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Inprim. Zenbaketa"); PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa"); From 2af9e2f759a8950497a00d7152fefb6203c15f48 Mon Sep 17 00:00:00 2001 From: makerbase <4164049@qq.com> Date: Thu, 10 Sep 2020 10:48:42 +0800 Subject: [PATCH 0208/1370] MKS Gen L V2.1 (#19314) --- Marlin/Makefile | 8 +- Marlin/src/core/boards.h | 7 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h | 85 ++++++++++++++++++++++ 4 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h diff --git a/Marlin/Makefile b/Marlin/Makefile index 5ab0d1eefd..9f2d18d268 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -268,12 +268,14 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1148) else ifeq ($(HARDWARE_MOTHERBOARD),1149) # MKS GEN L V2 else ifeq ($(HARDWARE_MOTHERBOARD),1150) -# Copymaster 3D +# MKS GEN L V2.1 else ifeq ($(HARDWARE_MOTHERBOARD),1151) -# Ortur 4 +# Copymaster 3D else ifeq ($(HARDWARE_MOTHERBOARD),1152) -# Tenlog D3 Hero +# Ortur 4 else ifeq ($(HARDWARE_MOTHERBOARD),1153) +# Tenlog D3 Hero +else ifeq ($(HARDWARE_MOTHERBOARD),1154) # # RAMBo and derivatives diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index e10c493097..b933147121 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -104,9 +104,10 @@ #define BOARD_HJC2560C_REV2 1148 // ADIMLab Gantry v2 #define BOARD_TANGO 1149 // BIQU Tango V1 #define BOARD_MKS_GEN_L_V2 1150 // MKS GEN L V2 -#define BOARD_COPYMASTER_3D 1151 // Copymaster 3D -#define BOARD_ORTUR_4 1152 // Ortur 4 -#define BOARD_TENLOG_D3_HERO 1153 // Tenlog D3 Hero IDEX printer +#define BOARD_MKS_GEN_L_V21 1151 // MKS GEN L V2.1 +#define BOARD_COPYMASTER_3D 1152 // Copymaster 3D +#define BOARD_ORTUR_4 1153 // Ortur 4 +#define BOARD_TENLOG_D3_HERO 1154 // Tenlog D3 Hero IDEX printer // // RAMBo and derivatives diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 7aff582c6d..9dce52b420 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -196,6 +196,8 @@ #include "ramps/pins_ORTUR_4.h" // ATmega2560 env:mega2560 #elif MB(TENLOG_D3_HERO) #include "ramps/pins_TENLOG_D3_HERO.h" // ATmega2560 env:mega2560 +#elif MB(MKS_GEN_L_V21) + #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560 // // RAMBo and derivatives diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h new file mode 100644 index 0000000000..24e04a39ff --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h @@ -0,0 +1,85 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * MKS GEN L V2 – Arduino Mega2560 with RAMPS v1.4 pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS GEN L V2.1 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS GEN L V2.1" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +// +// CS Pins wired to avoid conflict with the LCD +// See https://www.thingiverse.com/asset:66604 +// + +#ifndef X_CS_PIN + #define X_CS_PIN 63 +#endif +#ifndef Y_CS_PIN + #define Y_CS_PIN 64 +#endif +#ifndef Z_CS_PIN + #define Z_CS_PIN 65 +#endif +#ifndef E0_CS_PIN + #define E0_CS_PIN 66 +#endif +#ifndef E1_CS_PIN + #define E1_CS_PIN 12 +#endif + +// TMC2130 Diag Pins (currently just for reference) +#define X_DIAG_PIN 3 +#define Y_DIAG_PIN 14 +#define Z_DIAG_PIN 18 +#define E0_DIAG_PIN 2 +#define E1_DIAG_PIN 15 + +#ifndef SERVO1_PIN + #define SERVO1_PIN 21 +#endif +#ifndef SERVO2_PIN + #define SERVO2_PIN 39 +#endif +#ifndef SERVO3_PIN + #define SERVO3_PIN 32 +#endif + +#ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN 20 +#endif +#ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN 12 +#endif + +#include "pins_RAMPS.h" From ba6659f6bebf51533aecd717be76f1bc2ccb3d08 Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Tue, 8 Sep 2020 14:31:20 -0600 Subject: [PATCH 0209/1370] Fix ExtUI SD sorting, compile issues --- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 4 ++++ Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index f965bc99cf..61fde718b3 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -20,6 +20,8 @@ * */ +#ifdef __STM32F1__ + #include "../../inc/MarlinConfigPre.h" #include "MarlinSerial.h" #include @@ -91,3 +93,5 @@ static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb #if SERIAL_PORT == 5 || SERIAL_PORT_2 == 5 || DGUS_SERIAL_PORT == 5 DEFINE_HWSERIAL_UART_MARLIN(MSerial5, 5); #endif + +#endif // __STM32F1__ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index e06f9f3a29..270ec55819 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -61,7 +61,7 @@ namespace ExtUI { if (AT_SCREEN(StatusScreen) || isPrintingFromMedia()) StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED)); - if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen) + if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen); } void onMediaError() { diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 31449fcef4..c40a869421 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -1003,7 +1003,7 @@ namespace ExtUI { bool FileList::seek(const uint16_t pos, const bool skip_range_check) { #if ENABLED(SDSUPPORT) if (!skip_range_check && (pos + 1) > count()) return false; - card.getfilename_sorted(pos); + card.getfilename_sorted(SD_ORDER(pos, count())); return card.filename[0] != '\0'; #else UNUSED(pos); From f7885bbddef3e70a87917a1bbfbd75a7f4c9c65c Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 9 Sep 2020 19:59:42 -0700 Subject: [PATCH 0210/1370] Warn in platformio.ini about RCT6 512K (#19312) --- platformio.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platformio.ini b/platformio.ini index 38d874d865..4a2abf5830 100644 --- a/platformio.ini +++ b/platformio.ini @@ -739,6 +739,11 @@ upload_protocol = serial # STM32F103RC_btt_512K ........ RCT6 with 512K # STM32F103RC_btt_512K_USB .... RCT6 with 512K (USB mass storage) # +# WARNING! If you have an SKR Mini v1.1 or an SKR Mini E3 1.0 / 1.2 / 2.0 / DIP +# and experience a printer freeze, re-flash Marlin using the regular (non-512K) +# build option. 256K chips may be re-branded 512K chips, but this means the +# upper 256K is sketchy, and failure is very likely. +# [env:STM32F103RC_btt] platform = ${common_stm32f1.platform} From 13f2915b650a33918ca9f6c8b569fa2b475045e6 Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Wed, 9 Sep 2020 22:04:10 -0500 Subject: [PATCH 0211/1370] Fix Separate Neopixel menu labels (#19303) --- Marlin/src/lcd/menu/menu_item.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index bee05141bb..a92f917f9f 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -342,8 +342,8 @@ class MenuItem_bool : public MenuEditItemBase { #define PSTRING_ITEM(LABEL, V...) PSTRING_ITEM_P(GET_TEXT(LABEL), ##V) -#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) -#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) +#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) +#define STATIC_ITEM_N(LABEL, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) #define MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, false, PLABEL, ##V) #define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) From 8393c6a63d030bd9b3ae9578a74086678186e42a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 10 Sep 2020 00:46:50 -0300 Subject: [PATCH 0212/1370] Raise STM32F1 UART IRQ Priority, add error handling (#19301) (Error handling for Overrun, Framing and Parity.) --- Marlin/src/HAL/STM32/MarlinSerial.cpp | 6 +-- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 55 ++++++++++++++++--------- Marlin/src/HAL/STM32F1/MarlinSerial.h | 15 +++++++ 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index 8d99ab7855..2d799ea54d 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -55,10 +55,8 @@ void MarlinSerial::begin(unsigned long baud, uint8_t config) { HardwareSerial::begin(baud, config); - // replace the IRQ callback with the one we have defined - #if ENABLED(EMERGENCY_PARSER) - _serial.rx_callback = _rx_callback; - #endif + // Replace the IRQ callback with the one we have defined + TERN_(EMERGENCY_PARSER, _serial.rx_callback = _rx_callback); } // This function is Copyright (c) 2006 Nicholas Zambetti. diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index 61fde718b3..9a48e901f4 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -29,28 +29,43 @@ // Copied from ~/.platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/usart_private.h // Changed to handle Emergency Parser static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb, usart_reg_map *regs, MarlinSerial &serial) { - /* Handle RXNEIE and TXEIE interrupts. - * RXNE signifies availability of a byte in DR. - * - * See table 198 (sec 27.4, p809) in STM document RM0008 rev 15. - * We enable RXNEIE. - */ - if ((regs->CR1 & USART_CR1_RXNEIE) && (regs->SR & USART_SR_RXNE)) { - uint8_t c = (uint8)regs->DR; - #ifdef USART_SAFE_INSERT - // If the buffer is full and the user defines USART_SAFE_INSERT, - // ignore new bytes. - rb_safe_insert(rb, c); - #else - // By default, push bytes around in the ring buffer. - rb_push_insert(rb, c); - #endif - #if ENABLED(EMERGENCY_PARSER) - emergency_parser.update(serial.emergency_state, c); - #endif + /* Handle RXNEIE and TXEIE interrupts. + * RXNE signifies availability of a byte in DR. + * + * See table 198 (sec 27.4, p809) in STM document RM0008 rev 15. + * We enable RXNEIE. + */ + uint32_t srflags = regs->SR, cr1its = regs->CR1; + + if ((cr1its & USART_CR1_RXNEIE) && (srflags & USART_SR_RXNE)) { + if (srflags & USART_SR_FE || srflags & USART_SR_PE ) { + // framing error or parity error + regs->DR; // Read and throw away the data, which also clears FE and PE + } + else { + uint8_t c = (uint8)regs->DR; + #ifdef USART_SAFE_INSERT + // If the buffer is full and the user defines USART_SAFE_INSERT, + // ignore new bytes. + rb_safe_insert(rb, c); + #else + // By default, push bytes around in the ring buffer. + rb_push_insert(rb, c); + #endif + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(serial.emergency_state, c); + #endif + } } + else if (srflags & USART_SR_ORE) { + // overrun and empty data, just do a dummy read to clear ORE + // and prevent a raise condition where a continous interrupt stream (due to ORE set) occurs + // (see chapter "Overrun error" ) in STM32 reference manual + regs->DR; + } + // TXE signifies readiness to send a byte to DR. - if ((regs->CR1 & USART_CR1_TXEIE) && (regs->SR & USART_SR_TXE)) { + if ((cr1its & USART_CR1_TXEIE) && (srflags & USART_SR_TXE)) { if (!rb_is_empty(wb)) regs->DR=rb_remove(wb); else diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index 4e8a47d2f9..eb0059bfbc 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -22,6 +22,7 @@ #pragma once #include +#include #include #include "../../inc/MarlinConfigPre.h" @@ -29,6 +30,8 @@ #include "../../feature/e_parser.h" #endif +#define UART_IRQ_PRIO 1 + class MarlinSerial : public HardwareSerial { public: MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) : @@ -38,6 +41,18 @@ public: #endif { } + #ifdef UART_IRQ_PRIO + // shadow the parent methods to set irq priority after the begin + void begin(uint32 baud) { + MarlinSerial::begin(baud, SERIAL_8N1); + } + + void begin(uint32 baud, uint8_t config) { + HardwareSerial::begin(baud, config); + nvic_irq_set_priority(c_dev()->irq_num, UART_IRQ_PRIO); + } + #endif + #if ENABLED(EMERGENCY_PARSER) EmergencyParser::State emergency_state; #endif From 42619a3a81fe8201640a9e636494dcef05a3e6b2 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 10 Sep 2020 02:41:26 -0300 Subject: [PATCH 0213/1370] LPC: Finish DMA transfer, use HW SPI class (#19191) --- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 109 ++++++-------------- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 2 +- Marlin/src/HAL/LPC1768/include/SPI.h | 22 +++- Marlin/src/HAL/LPC1768/tft/xpt2046.cpp | 1 - Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 17 ++- platformio.ini | 1 + 6 files changed, 61 insertions(+), 91 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index 00b4310d1d..3c64ea812f 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -100,72 +100,25 @@ #else - // decide which HW SPI device to use - #ifndef LPC_HW_SPI_DEV - #if (SCK_PIN == P0_07 && MISO_PIN == P0_08 && MOSI_PIN == P0_09) - #define LPC_HW_SPI_DEV 1 - #else - #if (SCK_PIN == P0_15 && MISO_PIN == P0_17 && MOSI_PIN == P0_18) - #define LPC_HW_SPI_DEV 0 - #else - #error "Invalid pins selected for hardware SPI" - #endif - #endif - #endif - #if LPC_HW_SPI_DEV == 0 - #define LPC_SSPn LPC_SSP0 - #else - #define LPC_SSPn LPC_SSP1 - #endif - void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0 - PINSEL_CFG_Type PinCfg; // data structure to hold init values - PinCfg.Funcnum = 2; - PinCfg.OpenDrain = 0; - PinCfg.Pinmode = 0; - PinCfg.Pinnum = LPC176x::pin_bit(SCK_PIN); - PinCfg.Portnum = LPC176x::pin_port(SCK_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_OUTPUT(SCK_PIN); - - PinCfg.Pinnum = LPC176x::pin_bit(MISO_PIN); - PinCfg.Portnum = LPC176x::pin_port(MISO_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_INPUT(MISO_PIN); - - PinCfg.Pinnum = LPC176x::pin_bit(MOSI_PIN); - PinCfg.Portnum = LPC176x::pin_port(MOSI_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_OUTPUT(MOSI_PIN); - // divide PCLK by 2 for SSP0 - CLKPWR_SetPCLKDiv(LPC_HW_SPI_DEV == 0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2); - spiInit(0); - SSP_Cmd(LPC_SSPn, ENABLE); // start SSP running + spiInit(SPI_SPEED); } void spiInit(uint8_t spiRate) { - // table to convert Marlin spiRates (0-5 plus default) into bit rates - uint32_t Marlin_speed[7]; // CPSR is always 2 - Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED - Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED - Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED - Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED - Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 - Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 - Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h - // setup for SPI mode - SSP_CFG_Type HW_SPI_init; // data structure to hold init values - SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode - HW_SPI_init.ClockRate = Marlin_speed[_MIN(spiRate, 6)]; // put in the specified bit rate - HW_SPI_init.Mode |= SSP_CR1_SSP_EN; - SSP_Init(LPC_SSPn, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers + #if MISO_PIN == BOARD_SPI1_MISO_PIN + SPI.setModule(1); + #elif MISO_PIN == BOARD_SPI2_MISO_PIN + SPI.setModule(2); + #endif + SPI.setDataSize(DATA_SIZE_8BIT); + SPI.setDataMode(SPI_MODE0); + + SPI.setClock(SPISettings::spiRate2Clock(spiRate)); + SPI.begin(); } static uint8_t doio(uint8_t b) { - /* send and receive a single byte */ - SSP_SendData(LPC_SSPn, b & 0x00FF); - while (SSP_GetStatus(LPC_SSPn, SSP_STAT_BUSY)); // wait for it to finish - return SSP_ReceiveData(LPC_SSPn) & 0x00FF; + return SPI.transfer(b & 0x00FF) & 0x00FF; } void spiSend(uint8_t b) { doio(b); } @@ -224,6 +177,9 @@ SPIClass::SPIClass(uint8_t device) { PINSEL_CFG_Type PinCfg; // data structure to hold init values #if BOARD_NR_SPI >= 1 _settings[0].spi_d = LPC_SSP0; + _settings[0].dataMode = SPI_MODE0; + _settings[0].dataSize = DATA_SIZE_8BIT; + _settings[0].clock = SPI_CLOCK_MAX; // _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); PinCfg.Funcnum = 2; PinCfg.OpenDrain = 0; @@ -246,6 +202,9 @@ SPIClass::SPIClass(uint8_t device) { #if BOARD_NR_SPI >= 2 _settings[1].spi_d = LPC_SSP1; + _settings[1].dataMode = SPI_MODE0; + _settings[1].dataSize = DATA_SIZE_8BIT; + _settings[1].clock = SPI_CLOCK_MAX; // _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); PinCfg.Funcnum = 2; PinCfg.OpenDrain = 0; @@ -320,7 +279,7 @@ void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) { // Destination memory - Not used GPDMACfg.DstMemAddr = 0; // Transfer size - GPDMACfg.TransferSize = (minc ? length : 1); + GPDMACfg.TransferSize = length; // Transfer width GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE; // Transfer type @@ -335,26 +294,24 @@ void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) { // Enable dma on SPI SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE); - // if minc=false, I'm repeating the same byte 'length' times, as I could not find yet how do GPDMA without memory increment - do { - // Setup channel with given parameter - GPDMA_Setup(&GPDMACfg); + // only increase memory if minc is true + GPDMACfg.MemoryIncrease = (minc ? GPDMA_DMACCxControl_SI : 0); - // enabled dma - GPDMA_ChannelCmd(0, ENABLE); + // Setup channel with given parameter + GPDMA_Setup(&GPDMACfg); - // wait data transfer - while (!GPDMA_IntGetStatus(GPDMA_STAT_INTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_INTERR, 0)) { } + // enabled dma + GPDMA_ChannelCmd(0, ENABLE); - // clear err and int - GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); - GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0); + // wait data transfer + while (!GPDMA_IntGetStatus(GPDMA_STAT_RAWINTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_RAWINTERR, 0)) { } - // dma disable - GPDMA_ChannelCmd(0, DISABLE); + // clear err and int + GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); + GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0); - --length; - } while (!minc && length > 0); + // dma disable + GPDMA_ChannelCmd(0, DISABLE); waitSpiTxEnd(_currentSetting->spi_d); @@ -382,7 +339,7 @@ void SPIClass::setBitOrder(uint8_t bitOrder) { } void SPIClass::setDataMode(uint8_t dataMode) { - _currentSetting->dataSize = dataMode; + _currentSetting->dataMode = dataMode; } void SPIClass::setDataSize(uint32_t ds) { diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 0a4e59c6c4..caec347bf5 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -24,7 +24,7 @@ #if PIO_PLATFORM_VERSION < 1001 #error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically." #endif -#if PIO_FRAMEWORK_VERSION < 2002 +#if PIO_FRAMEWORK_VERSION < 2005 #error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries." #endif diff --git a/Marlin/src/HAL/LPC1768/include/SPI.h b/Marlin/src/HAL/LPC1768/include/SPI.h index e2645b9290..9da2a32556 100644 --- a/Marlin/src/HAL/LPC1768/include/SPI.h +++ b/Marlin/src/HAL/LPC1768/include/SPI.h @@ -61,7 +61,9 @@ class SPISettings { public: - SPISettings(uint32_t speed, int, int) : spi_speed(speed) {}; + SPISettings(uint32_t spiRate, int inBitOrder, int inDataMode) { + init_AlwaysInline(spiRate2Clock(spiRate), inBitOrder, inDataMode, DATA_SIZE_8BIT); + } SPISettings(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { if (__builtin_constant_p(inClock)) init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); @@ -72,7 +74,19 @@ public: init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); } - uint32_t spiRate() const { return spi_speed; } + //uint32_t spiRate() const { return spi_speed; } + + static inline uint32_t spiRate2Clock(uint32_t spiRate) { + uint32_t Marlin_speed[7]; // CPSR is always 2 + Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED + Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED + Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED + Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED + Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 + Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 + Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h + return Marlin_speed[spiRate > 6 ? 6 : spiRate]; + } private: void init_MightInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { @@ -85,7 +99,7 @@ private: dataSize = inDataSize; } - uint32_t spi_speed; + //uint32_t spi_speed; uint32_t clock; uint32_t dataSize; //uint32_t clockDivider; @@ -122,7 +136,7 @@ public: void end(); void beginTransaction(const SPISettings&); - void endTransaction() {}; + void endTransaction() {} // Transfer using 1 "Data Size" uint8_t transfer(uint16_t data); diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp index c72e5f0eac..5f96630043 100644 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp @@ -72,7 +72,6 @@ bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { if (!isTouched()) return false; *x = getRawData(XPT2046_X); *y = getRawData(XPT2046_Y); - SERIAL_ECHOLNPAIR("X: ", *x, ", Y: ", *y); return isTouched(); } diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index b32f99c68d..49c4dffa04 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -275,9 +275,6 @@ #define LCD_BACKLIGHT_PIN -1 #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI - #define SS_PIN -1 - //#define ONBOARD_SD_CS_PIN -1 - #define TFT_CS_PIN P1_22 #define TFT_A0_PIN P1_23 #define TFT_DC_PIN P1_23 @@ -285,7 +282,6 @@ #define TFT_BACKLIGHT_PIN P1_18 #define TFT_RESET_PIN P1_19 - #define LPC_HW_SPI_DEV 0 #define LCD_USE_DMA_SPI #define TOUCH_INT_PIN P1_21 @@ -297,15 +293,18 @@ #define GRAPHICAL_TFT_UPSCALE 3 #endif - // SPI 1 - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - // Disable any LCD related PINs config #define LCD_PINS_ENABLE -1 #define LCD_PINS_RS -1 + // Emulated DOGM have xpt calibration values independent of display resolution + #if ENABLED(SPI_GRAPHICAL_TFT) + #define XPT2046_X_CALIBRATION -11245 + #define XPT2046_Y_CALIBRATION 8629 + #define XPT2046_X_OFFSET 685 + #define XPT2046_Y_OFFSET -285 + #endif + #else #define BTN_ENC P0_28 // (58) open-drain diff --git a/platformio.ini b/platformio.ini index 4a2abf5830..0c301a4044 100644 --- a/platformio.ini +++ b/platformio.ini @@ -623,6 +623,7 @@ debug_tool = jlink # [common_LPC] platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.3.zip +platform_packages = framework-arduino-lpc176x@^0.2.5 board = nxp_lpc1768 lib_ldf_mode = off lib_compat_mode = strict From d6bbcd020b7f13e5b26f2563f95a99a646240691 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 9 Sep 2020 17:56:01 -0500 Subject: [PATCH 0214/1370] General cleanup --- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 8 ++++---- Marlin/src/HAL/STM32F1/sdio.cpp | 2 +- Marlin/src/gcode/motion/G2_G3.cpp | 4 +--- Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp | 10 +++++----- Marlin/src/lcd/dwin/e3v2/rotary_encoder.h | 6 +++--- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 8 ++++---- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index 3c64ea812f..e13f2d98cb 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -370,19 +370,19 @@ void SPIClass::updateSettings() { switch (_currentSetting->dataMode) { case SPI_MODE0: HW_SPI_init.CPHA = SSP_CPHA_FIRST; - HW_SPI_init.CPOL = SSP_CPOL_HI; + HW_SPI_init.CPOL = SSP_CPOL_HI; break; case SPI_MODE1: HW_SPI_init.CPHA = SSP_CPHA_SECOND; - HW_SPI_init.CPOL = SSP_CPOL_HI; + HW_SPI_init.CPOL = SSP_CPOL_HI; break; case SPI_MODE2: HW_SPI_init.CPHA = SSP_CPHA_FIRST; - HW_SPI_init.CPOL = SSP_CPOL_LO; + HW_SPI_init.CPOL = SSP_CPOL_LO; break; case SPI_MODE3: HW_SPI_init.CPHA = SSP_CPHA_SECOND; - HW_SPI_init.CPOL = SSP_CPOL_LO; + HW_SPI_init.CPOL = SSP_CPOL_LO; break; default: break; diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp index 0e8a745810..0e9a3b2d04 100644 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -108,7 +108,7 @@ bool SDIO_ReadBlock_DMA(uint32_t blockAddress, uint8_t *data) { SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); return false; - } + } //Wait for DMA transaction to complete while ((DMA2_BASE->ISR & (DMA_ISR_TEIF4|DMA_ISR_TCIF4)) == 0 ) { /* wait */ } diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 59a5346356..61d9f1d3a6 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -115,9 +115,7 @@ void plan_arc( ); // Divide total travel by nominal segment length uint16_t segments = FLOOR(mm_of_travel / seg_length); - if (segments < min_segments) { // Too few segments? - segments = min_segments; // More segments - } + NOLESS(segments, min_segments); // At least some segments seg_length = mm_of_travel / segments; /** diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp index e4c563cf6b..82a1bcae2c 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp @@ -127,15 +127,15 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { // if must encoder rati multiplier if (EncoderRate.encoderRateEnabled) { - const float abs_diff = ABS(temp_diff); - const float encoderMovementSteps = abs_diff / (ENCODER_PULSES_PER_STEP); + const float abs_diff = ABS(temp_diff), + encoderMovementSteps = abs_diff / (ENCODER_PULSES_PER_STEP); if (EncoderRate.lastEncoderTime) { // Note that the rate is always calculated between two passes through the // loop and that the abs of the temp_diff value is tracked. const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000; - if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100; - else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; - else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5; + if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100; + else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; + else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5; } EncoderRate.lastEncoderTime = ms; } diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h index db074098eb..72327725cd 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h @@ -55,9 +55,9 @@ extern ENCODER_Rate EncoderRate; typedef enum { ENCODER_DIFF_NO = 0, - ENCODER_DIFF_CW = 1, + ENCODER_DIFF_CW = 1, ENCODER_DIFF_CCW = 2, - ENCODER_DIFF_ENTER = 3 + ENCODER_DIFF_ENTER = 3 } ENCODER_DiffState; /*ç¼–ç å™¨åˆå§‹åŒ– PB12:Encoder_A PB13:Encoder_B PB14:Encoder_C*/ @@ -87,7 +87,7 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void); /*状æ€LEDåˆå§‹åŒ–*/ void STATE_LED_Configuration(void); - /*LEDç¯æ“作*/ + /*LEDç¯æ“作*/ void LED_Action(void); /*LEDåˆå§‹åŒ–*/ diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 090f3ee3f8..f122a2b7c2 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -161,7 +161,7 @@ #if ENABLED(RET6_12864_LCD) - /* RET6 12864 LCD */ + // RET6 12864 LCD #define LCD_PINS_RS PB12 #define LCD_PINS_ENABLE PB15 #define LCD_PINS_D4 PB13 @@ -174,7 +174,7 @@ #elif ENABLED(VET6_12864_LCD) - /* VET6 12864 LCD */ + // VET6 12864 LCD #define LCD_PINS_RS PA4 #define LCD_PINS_ENABLE PA7 #define LCD_PINS_D4 PA5 @@ -185,7 +185,7 @@ #elif ENABLED(DWIN_CREALITY_LCD) - /* RET6 DWIN ENCODER LCD */ + // RET6 DWIN ENCODER LCD #define BTN_ENC PB14 #define BTN_EN1 PB15 #define BTN_EN2 PB12 @@ -198,7 +198,7 @@ #elif ENABLED(DWIN_VET6_CREALITY_LCD) - /* VET6 DWIN ENCODER LCD */ + // VET6 DWIN ENCODER LCD #define BTN_ENC PA6 #define BTN_EN1 PA7 #define BTN_EN2 PA4 From 136b7a53054e821e422bfcb86d4efb95f4ab3c34 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 10 Sep 2020 02:50:38 -0500 Subject: [PATCH 0215/1370] Warning if SDCARD_READONLY should be disabled --- Marlin/src/inc/SanityCheck.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 775899febb..1ee082720d 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2182,16 +2182,16 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif /** - * Make sure features that need to write to the SD card are - * disabled unless write support is enabled. + * Make sure features that need to write to the SD card can */ -#if ENABLED(SDCARD_READONLY) +#if ENABLED(SDCARD_READONLY) && ANY(POWER_LOSS_RECOVERY, BINARY_FILE_TRANSFER, SDCARD_EEPROM_EMULATION) + #undef SDCARD_READONLY #if ENABLED(POWER_LOSS_RECOVERY) - #error "POWER_LOSS_RECOVERY is incompatible with SDCARD_READONLY." + #warning "Either disable SDCARD_READONLY or disable POWER_LOSS_RECOVERY." #elif ENABLED(BINARY_FILE_TRANSFER) - #error "BINARY_FILE_TRANSFER is incompatible with SDCARD_READONLY." + #warning "Either disable SDCARD_READONLY or disable BINARY_FILE_TRANSFER." #elif ENABLED(SDCARD_EEPROM_EMULATION) - #error "SDCARD_EEPROM_EMULATION is incompatible with SDCARD_READONLY." + #warning "Either disable SDCARD_READONLY or disable SDCARD_EEPROM_EMULATION." #endif #endif From 3adb07aa00171de79ce15bfb6f22a08e1a67d39a Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Thu, 10 Sep 2020 23:47:58 +0200 Subject: [PATCH 0216/1370] Fix "too cold" in M600 (#19332) --- Marlin/src/feature/pause.cpp | 26 ++++++++---------------- Marlin/src/gcode/feature/pause/M600.cpp | 3 --- Marlin/src/lcd/language/language_cz.h | 1 - Marlin/src/lcd/language/language_de.h | 1 - Marlin/src/lcd/language/language_en.h | 1 - Marlin/src/lcd/language/language_es.h | 1 - Marlin/src/lcd/language/language_eu.h | 1 - Marlin/src/lcd/language/language_fr.h | 1 - Marlin/src/lcd/language/language_gl.h | 1 - Marlin/src/lcd/language/language_hu.h | 1 - Marlin/src/lcd/language/language_it.h | 1 - Marlin/src/lcd/language/language_pl.h | 1 - Marlin/src/lcd/language/language_pt_br.h | 1 - Marlin/src/lcd/language/language_ro.h | 1 - Marlin/src/lcd/language/language_ru.h | 1 - Marlin/src/lcd/language/language_sk.h | 1 - Marlin/src/lcd/language/language_tr.h | 1 - Marlin/src/lcd/language/language_uk.h | 1 - Marlin/src/lcd/language/language_vi.h | 1 - Marlin/src/lcd/language/language_zh_CN.h | 1 - Marlin/src/lcd/language/language_zh_TW.h | 1 - 21 files changed, 8 insertions(+), 40 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 4089e2b87b..efc6510756 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -381,7 +381,7 @@ uint8_t did_pause_print = 0; bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { DEBUG_SECTION(pp, "pause_print", true); - DEBUG_ECHOLNPAIR("... retract:", retract, " park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", int(show_lcd) DXC_SAY); + DEBUG_ECHOLNPAIR("... park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", int(show_lcd) DXC_SAY); UNUSED(show_lcd); @@ -397,19 +397,6 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Pause"), DISMISS_STR)); - if (!DEBUGGING(DRYRUN) && unload_length && thermalManager.targetTooColdToExtrude(active_extruder)) { - SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD); - - #if HAS_LCD_MENU - if (show_lcd) { // Show status screen - lcd_pause_show_message(PAUSE_MESSAGE_STATUS); - LCD_MESSAGEPGM(MSG_M600_TOO_COLD); - } - #endif - - return false; // unable to reach safe temperature - } - // Indicate that the printer is paused ++did_pause_print; @@ -434,8 +421,10 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float #endif // Initial retract before move to filament change position - if (retract && thermalManager.hotEnoughToExtrude(active_extruder)) + if (retract && thermalManager.hotEnoughToExtrude(active_extruder)) { + DEBUG_ECHOLNPAIR("... retract:", retract); unscaled_e_move(retract, PAUSE_PARK_RETRACT_FEEDRATE); + } // Park the nozzle by moving up by z_lift and then moving to (x_pos, y_pos) if (!axes_should_home()) @@ -603,11 +592,12 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le thermalManager.reset_hotend_idle_timer(e); } - if (targetTemp > thermalManager.degTargetHotend(active_extruder)) + if (targetTemp > thermalManager.degTargetHotend(active_extruder)) { thermalManager.setTargetHotend(targetTemp, active_extruder); + } - if (nozzle_timed_out || thermalManager.hotEnoughToExtrude(active_extruder)) // Load the new filament - load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out, PAUSE_MODE_SAME DXC_PASS); + // Load the new filament + load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out, PAUSE_MODE_SAME DXC_PASS); if (targetTemp > 0) { thermalManager.setTargetHotend(targetTemp, active_extruder); diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index b78608f7ae..fe1d90109e 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -162,9 +162,6 @@ void GcodeSuite::M600() { beep_count, (parser.seenval('R') ? parser.value_celsius() : 0) DXC_PASS); #endif } - else { - TERN_(HAS_FILAMENT_SENSOR, runout.reset()); - } #if EXTRUDERS > 1 // Restore toolhead if it was changed diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 069a8e5a55..e7d2611bc4 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -501,7 +501,6 @@ namespace Language_cz { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Délka mm senz.fil."); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Parkování selhalo"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrace selhala"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Moc studený"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 84b304c242..e353229daa 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -536,7 +536,6 @@ namespace Language_de { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout-Weg mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Homing gescheitert"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing gescheitert"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: zu kalt"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMENT WÄHLEN"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 8ae40304bd..fadce16439 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -541,7 +541,6 @@ namespace Language_en { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Homing Failed"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Too Cold"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 5beab6c1c9..11cb8cc2a9 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -504,7 +504,6 @@ namespace Language_es { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist. filamento mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Ir a origen Fallado"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondeo Fallado"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Muy Frio"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ELIJE FILAMENTO"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 36586fd2fa..d04b3037ab 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -309,7 +309,6 @@ namespace Language_eu { PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Pita: "); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Hasi. huts egin du"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Neurketak huts egin du"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: hotzegi"); PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Inprimagailu okerra"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 0042a30f8e..c1980a9141 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -485,7 +485,6 @@ namespace Language_fr { PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Capteur fil."); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Echec origine"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Echec sonde"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Trop froid"); PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MAJ firmware MMU!!"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOISIR FILAMENT"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 90e4129abd..d47ec0b67d 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -526,7 +526,6 @@ namespace Language_gl { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm Sensor Fil"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Fallo ao ir á Orixe"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Fallo ao Sondar"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Moi Frío"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ESCOLLE FILAMENTO"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 64ea482249..962fb17511 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -528,7 +528,6 @@ namespace Language_hu { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás Táv. mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Tájolási hiba"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Szondázás hiba"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Túl hideg"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SZÃLVÃLASZTÃS"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 0a56fdf5ec..39980b846e 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -535,7 +535,6 @@ namespace Language_it { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm filo term."); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Home fallito"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondaggio fallito"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600:Troppo freddo"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SCELTA FILAMENTO"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 17ca0bd00f..7c3f9c1bb1 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -474,7 +474,6 @@ namespace Language_pl { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dystans do czujnika mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Zerowanie nieudane"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondowanie nieudane"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: za zimne"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("WYBIERZ FILAMENT"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 2c6c2af148..b9fd91fa29 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -432,7 +432,6 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sensor filamento"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Falha ao ir à origem"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Falha ao sondar"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Muito frio"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ESCOLHER FILAMENTO"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index dc55911176..0d5b1568a7 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -532,7 +532,6 @@ namespace Language_ro { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Homing Failed"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Too Cold"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index e1abfa5429..0e2c63ca13 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -640,7 +640,6 @@ namespace Language_ru { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("До конца, мм"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Ошибка парковки"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Ошибка зондированиÑ"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: ÐÐ¸Ð·ÐºÐ°Ñ Ð¢") LCD_STR_DEGREE; PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ВЫБИРЕТЕ ФИЛÐМЕÐТ"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("ÐаÑтройки MMU"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 71949014b7..ace2ba6da4 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -525,7 +525,6 @@ namespace Language_sk { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Vzd. mm fil. senz."); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Parkovanie zlyhalo"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrácia zlyhala"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: PríliÅ¡ studený"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU2"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index c0ce4bfdc5..ed11ec87c5 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -500,7 +500,6 @@ namespace Language_tr { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Aşınma Farkı mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Sıfırlama BaÅŸarısız"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing BaÅŸarısız"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Çok SoÄŸuk"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMAN SEÇ"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 30d45338d9..99d70cc252 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -650,7 +650,6 @@ namespace Language_uk { #endif PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Помилка паркуваннÑ"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Помилка зондуваннÑ"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: низька Т") LCD_STR_DEGREE; PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ОБЕРІТЬ ПРУТОК"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ MMU"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 02453e5879..5074901883 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -405,7 +405,6 @@ namespace Language_vi { PROGMEM Language_Str MSG_RUNOUT_SENSOR_ENABLE = _UxGT("Cảm Biến Hết"); // Runout Sensor PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("SÆ°Ì£ nhà không thành công"); // Homing failed PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT(" không thành công"); // Probing failed - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Quá lạnh"); // // Filament Change screens show up to 3 lines on a 4-line display diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 49d7acd94c..2a98d58e81 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -532,7 +532,6 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("æ–­æ–™è·ç¦»mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("归原ä½å¤±è´¥"); // "Homing failed" PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("探针探测失败"); // "Probing failed" - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: 太凉"); // "M600: Too cold" PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("选择料"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index ac54358534..532886d451 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -472,7 +472,6 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("çµ²è·é›¢mm"); //"Runout Dist mm" PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("歸原ä½å¤±æ•—"); // "Homing failed" PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("探é‡æŽ¢æ¸¬å¤±æ•—"); // "Probing failed" - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: 太冷"); // "M600: Too cold" // // Filament Change screens show up to 3 lines on a 4-line display From e48b283e3955c3863b51732aa3a229c9a198c1e6 Mon Sep 17 00:00:00 2001 From: riodoro1 Date: Fri, 11 Sep 2020 00:06:37 +0200 Subject: [PATCH 0217/1370] Fix missing BOARD_K8800 (#19331) --- Marlin/Makefile | 106 ++++++++++++++++++++------------------- Marlin/src/core/boards.h | 103 ++++++++++++++++++------------------- 2 files changed, 106 insertions(+), 103 deletions(-) diff --git a/Marlin/Makefile b/Marlin/Makefile index 9f2d18d268..68dd05bdfb 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -170,112 +170,114 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1100) else ifeq ($(HARDWARE_MOTHERBOARD),1101) # Velleman K8400 Controller (derived from 3Drag Controller) else ifeq ($(HARDWARE_MOTHERBOARD),1102) -# Velleman K8600 Controller (derived from 3Drag Controller) +# Velleman K8600 Controller (Vertex Nano) else ifeq ($(HARDWARE_MOTHERBOARD),1103) -# 2PrintBeta BAM&DICE with STK drivers +# Velleman K8800 Controller (Vertex Delta) else ifeq ($(HARDWARE_MOTHERBOARD),1104) -# 2PrintBeta BAM&DICE Due with STK drivers +# 2PrintBeta BAM&DICE with STK drivers else ifeq ($(HARDWARE_MOTHERBOARD),1105) -# MKS BASE v1.0 +# 2PrintBeta BAM&DICE Due with STK drivers else ifeq ($(HARDWARE_MOTHERBOARD),1106) -# MKS v1.4 with A4982 stepper drivers +# MKS BASE v1.0 else ifeq ($(HARDWARE_MOTHERBOARD),1107) -# MKS v1.5 with Allegro A4982 stepper drivers +# MKS v1.4 with A4982 stepper drivers else ifeq ($(HARDWARE_MOTHERBOARD),1108) -# MKS v1.6 with Allegro A4982 stepper drivers +# MKS v1.5 with Allegro A4982 stepper drivers else ifeq ($(HARDWARE_MOTHERBOARD),1109) -# MKS BASE 1.0 with Heroic HR4982 stepper drivers +# MKS v1.6 with Allegro A4982 stepper drivers else ifeq ($(HARDWARE_MOTHERBOARD),1110) -# MKS GEN v1.3 or 1.4 +# MKS BASE 1.0 with Heroic HR4982 stepper drivers else ifeq ($(HARDWARE_MOTHERBOARD),1111) -# MKS GEN L +# MKS GEN v1.3 or 1.4 else ifeq ($(HARDWARE_MOTHERBOARD),1112) -# zrib V2.0 control board (Chinese knock off RAMPS replica) +# MKS GEN L else ifeq ($(HARDWARE_MOTHERBOARD),1113) -# BigTreeTech or BIQU KFB2.0 +# zrib V2.0 control board (Chinese knock off RAMPS replica) else ifeq ($(HARDWARE_MOTHERBOARD),1114) -# Felix 2.0+ Electronics Board (RAMPS like) +# BigTreeTech or BIQU KFB2.0 else ifeq ($(HARDWARE_MOTHERBOARD),1115) -# Invent-A-Part RigidBoard +# Felix 2.0+ Electronics Board (RAMPS like) else ifeq ($(HARDWARE_MOTHERBOARD),1116) -# Invent-A-Part RigidBoard V2 +# Invent-A-Part RigidBoard else ifeq ($(HARDWARE_MOTHERBOARD),1117) -# Sainsmart 2-in-1 board +# Invent-A-Part RigidBoard V2 else ifeq ($(HARDWARE_MOTHERBOARD),1118) -# Ultimaker +# Sainsmart 2-in-1 board else ifeq ($(HARDWARE_MOTHERBOARD),1119) -# Ultimaker (Older electronics. Pre 1.5.4. This is rare) +# Ultimaker else ifeq ($(HARDWARE_MOTHERBOARD),1120) +# Ultimaker (Older electronics. Pre 1.5.4. This is rare) +else ifeq ($(HARDWARE_MOTHERBOARD),1121) MCU ?= atmega1280 # Azteeg X3 -else ifeq ($(HARDWARE_MOTHERBOARD),1121) -# Azteeg X3 Pro else ifeq ($(HARDWARE_MOTHERBOARD),1122) -# Ultimainboard 2.x (Uses TEMP_SENSOR 20) +# Azteeg X3 Pro else ifeq ($(HARDWARE_MOTHERBOARD),1123) -# Rumba +# Ultimainboard 2.x (Uses TEMP_SENSOR 20) else ifeq ($(HARDWARE_MOTHERBOARD),1124) -# Raise3D Rumba +# Rumba else ifeq ($(HARDWARE_MOTHERBOARD),1125) -# Rapide Lite RL200 Rumba +# Raise3D Rumba else ifeq ($(HARDWARE_MOTHERBOARD),1126) -# Formbot T-Rex 2 Plus +# Rapide Lite RL200 Rumba else ifeq ($(HARDWARE_MOTHERBOARD),1127) -# Formbot T-Rex 3 +# Formbot T-Rex 2 Plus else ifeq ($(HARDWARE_MOTHERBOARD),1128) -# Formbot Raptor +# Formbot T-Rex 3 else ifeq ($(HARDWARE_MOTHERBOARD),1129) -# Formbot Raptor 2 +# Formbot Raptor else ifeq ($(HARDWARE_MOTHERBOARD),1130) -# bq ZUM Mega 3D +# Formbot Raptor 2 else ifeq ($(HARDWARE_MOTHERBOARD),1131) -# MakeBoard Mini v2.1.2 is a control board sold by MicroMake +# bq ZUM Mega 3D else ifeq ($(HARDWARE_MOTHERBOARD),1132) -# TriGorilla Anycubic version 1.3 based on RAMPS EFB +# MakeBoard Mini v2.1.2 is a control board sold by MicroMake else ifeq ($(HARDWARE_MOTHERBOARD),1133) -# TriGorilla Anycubic version 1.4 based on RAMPS EFB +# TriGorilla Anycubic version 1.3 based on RAMPS EFB else ifeq ($(HARDWARE_MOTHERBOARD),1134) -# TriGorilla Anycubic version 1.4 Rev 1.1 +# TriGorilla Anycubic version 1.4 based on RAMPS EFB else ifeq ($(HARDWARE_MOTHERBOARD),1135) -# Creality: Ender-4, CR-8 +# TriGorilla Anycubic version 1.4 Rev 1.1 else ifeq ($(HARDWARE_MOTHERBOARD),1136) -# Creality: CR10S, CR20, CR-X +# Creality: Ender-4, CR-8 else ifeq ($(HARDWARE_MOTHERBOARD),1137) -# Dagoma F5 +# Creality: CR10S, CR20, CR-X else ifeq ($(HARDWARE_MOTHERBOARD),1138) -# FYSETC F6 1.3 +# Dagoma F5 else ifeq ($(HARDWARE_MOTHERBOARD),1139) -# FYSETC F6 1.5 +# FYSETC F6 1.3 else ifeq ($(HARDWARE_MOTHERBOARD),1140) -# Duplicator i3 Plus +# FYSETC F6 1.5 else ifeq ($(HARDWARE_MOTHERBOARD),1141) -# VORON +# Duplicator i3 Plus else ifeq ($(HARDWARE_MOTHERBOARD),1142) -# TRONXY V3 1.0 +# VORON else ifeq ($(HARDWARE_MOTHERBOARD),1143) -# Z-Bolt X Series +# TRONXY V3 1.0 else ifeq ($(HARDWARE_MOTHERBOARD),1144) -# TT OSCAR +# Z-Bolt X Series else ifeq ($(HARDWARE_MOTHERBOARD),1145) -# Overlord/Overlord Pro +# TT OSCAR else ifeq ($(HARDWARE_MOTHERBOARD),1146) -# ADIMLab Gantry v1 +# Overlord/Overlord Pro else ifeq ($(HARDWARE_MOTHERBOARD),1147) -# ADIMLab Gantry v2 +# ADIMLab Gantry v1 else ifeq ($(HARDWARE_MOTHERBOARD),1148) -# BIQU Tango V1 +# ADIMLab Gantry v2 else ifeq ($(HARDWARE_MOTHERBOARD),1149) -# MKS GEN L V2 +# BIQU Tango V1 else ifeq ($(HARDWARE_MOTHERBOARD),1150) -# MKS GEN L V2.1 +# MKS GEN L V2 else ifeq ($(HARDWARE_MOTHERBOARD),1151) -# Copymaster 3D +# MKS GEN L V2.1 else ifeq ($(HARDWARE_MOTHERBOARD),1152) -# Ortur 4 +# Copymaster 3D else ifeq ($(HARDWARE_MOTHERBOARD),1153) -# Tenlog D3 Hero +# Ortur 4 else ifeq ($(HARDWARE_MOTHERBOARD),1154) +# Tenlog D3 Hero +else ifeq ($(HARDWARE_MOTHERBOARD),1155) # # RAMBo and derivatives diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index b933147121..581c801feb 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -57,57 +57,58 @@ #define BOARD_K8200 1101 // Velleman K8200 Controller (derived from 3Drag Controller) #define BOARD_K8400 1102 // Velleman K8400 Controller (derived from 3Drag Controller) #define BOARD_K8600 1103 // Velleman K8600 Controller (Vertex Nano) -#define BOARD_BAM_DICE 1104 // 2PrintBeta BAM&DICE with STK drivers -#define BOARD_BAM_DICE_DUE 1105 // 2PrintBeta BAM&DICE Due with STK drivers -#define BOARD_MKS_BASE 1106 // MKS BASE v1.0 -#define BOARD_MKS_BASE_14 1107 // MKS BASE v1.4 with Allegro A4982 stepper drivers -#define BOARD_MKS_BASE_15 1108 // MKS BASE v1.5 with Allegro A4982 stepper drivers -#define BOARD_MKS_BASE_16 1109 // MKS BASE v1.6 with Allegro A4982 stepper drivers -#define BOARD_MKS_BASE_HEROIC 1110 // MKS BASE 1.0 with Heroic HR4982 stepper drivers -#define BOARD_MKS_GEN_13 1111 // MKS GEN v1.3 or 1.4 -#define BOARD_MKS_GEN_L 1112 // MKS GEN L -#define BOARD_KFB_2 1113 // BigTreeTech or BIQU KFB2.0 -#define BOARD_ZRIB_V20 1114 // zrib V2.0 control board (Chinese knock off RAMPS replica) -#define BOARD_FELIX2 1115 // Felix 2.0+ Electronics Board (RAMPS like) -#define BOARD_RIGIDBOARD 1116 // Invent-A-Part RigidBoard -#define BOARD_RIGIDBOARD_V2 1117 // Invent-A-Part RigidBoard V2 -#define BOARD_SAINSMART_2IN1 1118 // Sainsmart 2-in-1 board -#define BOARD_ULTIMAKER 1119 // Ultimaker -#define BOARD_ULTIMAKER_OLD 1120 // Ultimaker (Older electronics. Pre 1.5.4. This is rare) -#define BOARD_AZTEEG_X3 1121 // Azteeg X3 -#define BOARD_AZTEEG_X3_PRO 1122 // Azteeg X3 Pro -#define BOARD_ULTIMAIN_2 1123 // Ultimainboard 2.x (Uses TEMP_SENSOR 20) -#define BOARD_RUMBA 1124 // Rumba -#define BOARD_RUMBA_RAISE3D 1125 // Raise3D N series Rumba derivative -#define BOARD_RL200 1126 // Rapide Lite 200 (v1, low-cost RUMBA clone with drv) -#define BOARD_FORMBOT_TREX2PLUS 1127 // Formbot T-Rex 2 Plus -#define BOARD_FORMBOT_TREX3 1128 // Formbot T-Rex 3 -#define BOARD_FORMBOT_RAPTOR 1129 // Formbot Raptor -#define BOARD_FORMBOT_RAPTOR2 1130 // Formbot Raptor 2 -#define BOARD_BQ_ZUM_MEGA_3D 1131 // bq ZUM Mega 3D -#define BOARD_MAKEBOARD_MINI 1132 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake -#define BOARD_TRIGORILLA_13 1133 // TriGorilla Anycubic version 1.3-based on RAMPS EFB -#define BOARD_TRIGORILLA_14 1134 // ... Ver 1.4 -#define BOARD_TRIGORILLA_14_11 1135 // ... Rev 1.1 (new servo pin order) -#define BOARD_RAMPS_ENDER_4 1136 // Creality: Ender-4, CR-8 -#define BOARD_RAMPS_CREALITY 1137 // Creality: CR10S, CR20, CR-X -#define BOARD_RAMPS_DAGOMA 1138 // Dagoma F5 -#define BOARD_FYSETC_F6_13 1139 // FYSETC F6 1.3 -#define BOARD_FYSETC_F6_14 1140 // FYSETC F6 1.4 -#define BOARD_DUPLICATOR_I3_PLUS 1141 // Wanhao Duplicator i3 Plus -#define BOARD_VORON 1142 // VORON Design -#define BOARD_TRONXY_V3_1_0 1143 // Tronxy TRONXY-V3-1.0 -#define BOARD_Z_BOLT_X_SERIES 1144 // Z-Bolt X Series -#define BOARD_TT_OSCAR 1145 // TT OSCAR -#define BOARD_OVERLORD 1146 // Overlord/Overlord Pro -#define BOARD_HJC2560C_REV1 1147 // ADIMLab Gantry v1 -#define BOARD_HJC2560C_REV2 1148 // ADIMLab Gantry v2 -#define BOARD_TANGO 1149 // BIQU Tango V1 -#define BOARD_MKS_GEN_L_V2 1150 // MKS GEN L V2 -#define BOARD_MKS_GEN_L_V21 1151 // MKS GEN L V2.1 -#define BOARD_COPYMASTER_3D 1152 // Copymaster 3D -#define BOARD_ORTUR_4 1153 // Ortur 4 -#define BOARD_TENLOG_D3_HERO 1154 // Tenlog D3 Hero IDEX printer +#define BOARD_K8800 1104 // Velleman K8800 Controller (Vertex Delta) +#define BOARD_BAM_DICE 1105 // 2PrintBeta BAM&DICE with STK drivers +#define BOARD_BAM_DICE_DUE 1106 // 2PrintBeta BAM&DICE Due with STK drivers +#define BOARD_MKS_BASE 1107 // MKS BASE v1.0 +#define BOARD_MKS_BASE_14 1108 // MKS BASE v1.4 with Allegro A4982 stepper drivers +#define BOARD_MKS_BASE_15 1109 // MKS BASE v1.5 with Allegro A4982 stepper drivers +#define BOARD_MKS_BASE_16 1110 // MKS BASE v1.6 with Allegro A4982 stepper drivers +#define BOARD_MKS_BASE_HEROIC 1111 // MKS BASE 1.0 with Heroic HR4982 stepper drivers +#define BOARD_MKS_GEN_13 1112 // MKS GEN v1.3 or 1.4 +#define BOARD_MKS_GEN_L 1113 // MKS GEN L +#define BOARD_KFB_2 1114 // BigTreeTech or BIQU KFB2.0 +#define BOARD_ZRIB_V20 1115 // zrib V2.0 control board (Chinese knock off RAMPS replica) +#define BOARD_FELIX2 1116 // Felix 2.0+ Electronics Board (RAMPS like) +#define BOARD_RIGIDBOARD 1117 // Invent-A-Part RigidBoard +#define BOARD_RIGIDBOARD_V2 1118 // Invent-A-Part RigidBoard V2 +#define BOARD_SAINSMART_2IN1 1119 // Sainsmart 2-in-1 board +#define BOARD_ULTIMAKER 1120 // Ultimaker +#define BOARD_ULTIMAKER_OLD 1121 // Ultimaker (Older electronics. Pre 1.5.4. This is rare) +#define BOARD_AZTEEG_X3 1122 // Azteeg X3 +#define BOARD_AZTEEG_X3_PRO 1123 // Azteeg X3 Pro +#define BOARD_ULTIMAIN_2 1124 // Ultimainboard 2.x (Uses TEMP_SENSOR 20) +#define BOARD_RUMBA 1125 // Rumba +#define BOARD_RUMBA_RAISE3D 1126 // Raise3D N series Rumba derivative +#define BOARD_RL200 1127 // Rapide Lite 200 (v1, low-cost RUMBA clone with drv) +#define BOARD_FORMBOT_TREX2PLUS 1128 // Formbot T-Rex 2 Plus +#define BOARD_FORMBOT_TREX3 1129 // Formbot T-Rex 3 +#define BOARD_FORMBOT_RAPTOR 1130 // Formbot Raptor +#define BOARD_FORMBOT_RAPTOR2 1131 // Formbot Raptor 2 +#define BOARD_BQ_ZUM_MEGA_3D 1132 // bq ZUM Mega 3D +#define BOARD_MAKEBOARD_MINI 1133 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake +#define BOARD_TRIGORILLA_13 1134 // TriGorilla Anycubic version 1.3-based on RAMPS EFB +#define BOARD_TRIGORILLA_14 1135 // ... Ver 1.4 +#define BOARD_TRIGORILLA_14_11 1136 // ... Rev 1.1 (new servo pin order) +#define BOARD_RAMPS_ENDER_4 1137 // Creality: Ender-4, CR-8 +#define BOARD_RAMPS_CREALITY 1138 // Creality: CR10S, CR20, CR-X +#define BOARD_RAMPS_DAGOMA 1139 // Dagoma F5 +#define BOARD_FYSETC_F6_13 1140 // FYSETC F6 1.3 +#define BOARD_FYSETC_F6_14 1141 // FYSETC F6 1.4 +#define BOARD_DUPLICATOR_I3_PLUS 1142 // Wanhao Duplicator i3 Plus +#define BOARD_VORON 1143 // VORON Design +#define BOARD_TRONXY_V3_1_0 1144 // Tronxy TRONXY-V3-1.0 +#define BOARD_Z_BOLT_X_SERIES 1145 // Z-Bolt X Series +#define BOARD_TT_OSCAR 1146 // TT OSCAR +#define BOARD_OVERLORD 1147 // Overlord/Overlord Pro +#define BOARD_HJC2560C_REV1 1148 // ADIMLab Gantry v1 +#define BOARD_HJC2560C_REV2 1149 // ADIMLab Gantry v2 +#define BOARD_TANGO 1150 // BIQU Tango V1 +#define BOARD_MKS_GEN_L_V2 1151 // MKS GEN L V2 +#define BOARD_MKS_GEN_L_V21 1152 // MKS GEN L V2.1 +#define BOARD_COPYMASTER_3D 1153 // Copymaster 3D +#define BOARD_ORTUR_4 1154 // Ortur 4 +#define BOARD_TENLOG_D3_HERO 1155 // Tenlog D3 Hero IDEX printer // // RAMBo and derivatives From 5e3d051b6a96b9666a67eb7af91d6aad23a9c2b7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 10 Sep 2020 18:06:29 -0500 Subject: [PATCH 0218/1370] Translate encoder comments --- Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp | 43 ++++++++++--------- Marlin/src/lcd/dwin/e3v2/rotary_encoder.h | 47 ++++++++++----------- 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp index 82a1bcae2c..dbbd356eff 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp @@ -20,15 +20,13 @@ * */ -/** - ****************************************************************************** - * @file rotary_encoder.cpp - * @author LEO / Creality3D - * @date 2019/07/06 - * @version 2.0.1 - * @brief 旋转编ç å™¨æ“作函数 - ****************************************************************************** -**/ +/***************************************************************************** + * @file rotary_encoder.cpp + * @author LEO / Creality3D + * @date 2019/07/06 + * @version 2.0.1 + * @brief Rotary encoder functions + *****************************************************************************/ #include "../../../inc/MarlinConfigPre.h" @@ -47,14 +45,14 @@ ENCODER_Rate EncoderRate; -/*蜂鸣器å“*/ +// Buzzer void Encoder_tick(void) { WRITE(BEEPER_PIN, 1); delay(10); WRITE(BEEPER_PIN, 0); } -/*ç¼–ç å™¨åˆå§‹åŒ– PB12:Encoder_A PB13:Encoder_B PB14:Encoder_C*/ +// Encoder initialization void Encoder_Configuration(void) { #if BUTTON_EXISTS(EN1) SET_INPUT_PULLUP(BTN_EN1); @@ -70,8 +68,7 @@ void Encoder_Configuration(void) { #endif } -millis_t next_click_update_ms; -/*接收数æ®è§£æž 返回值:ENCODER_DIFF_NO,无状æ€; ENCODER_DIFF_CW,顺时针旋转; ENCODER_DIFF_CCW,逆时针旋转; ENCODER_DIFF_ENTER,按下*/ +// Analyze encoder value and return state ENCODER_DiffState Encoder_ReceiveAnalyze(void) { const millis_t now = millis(); static unsigned char lastEncoderBits; @@ -82,6 +79,7 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { if (BUTTON_PRESSED(EN1)) newbutton |= 0x01; if (BUTTON_PRESSED(EN2)) newbutton |= 0x02; if (BUTTON_PRESSED(ENC)) { + static millis_t next_click_update_ms; if (ELAPSED(now, next_click_update_ms)) { next_click_update_ms = millis() + 300; Encoder_tick(); @@ -154,22 +152,22 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { #if PIN_EXISTS(LCD_LED) - /*å–低24ä½æœ‰æ•ˆ 24Bit: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0*/ + // Take the low 24 valid bits 24Bit: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0 unsigned int LED_DataArray[LED_NUM]; - /*LEDç¯æ“作*/ + // LED light operation void LED_Action(void) { LED_Control(RGB_SCALE_WARM_WHITE,0x0F); delay(30); LED_Control(RGB_SCALE_WARM_WHITE,0x00); } - /*LEDåˆå§‹åŒ–*/ + // LED initialization void LED_Configuration(void) { SET_OUTPUT(LCD_LED_PIN); } - /*LED写数æ®*/ + // LED write data void LED_WriteData(void) { unsigned char tempCounter_LED, tempCounter_Bit; for (tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) { @@ -189,7 +187,9 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { } } - /*LED控制 RGB_Scale:RGB色彩é…比 luminance:亮度(0~0xFF)*/ + // LED control + // RGB_Scale: RGB color ratio + // luminance: brightness (0~0xFF) void LED_Control(unsigned char RGB_Scale, unsigned char luminance) { unsigned char temp_Counter; for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { @@ -203,7 +203,10 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { LED_WriteData(); } - /*LEDæ¸å˜æŽ§åˆ¶ RGB_Scale:RGB色彩é…比 luminance:亮度(0~0xFF) change_Time:æ¸å˜æ—¶é—´(ms)*/ + // LED gradient control + // RGB_Scale: RGB color ratio + // luminance: brightness (0~0xFF) + // change_Time: gradient time (ms) void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval) { unsigned char temp_Counter; unsigned char LED_R_Data[LED_NUM], LED_G_Data[LED_NUM], LED_B_Data[LED_NUM]; @@ -246,6 +249,6 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { } } -#endif +#endif // LCD_LED #endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h index 72327725cd..fb8102f8b2 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h @@ -21,15 +21,13 @@ */ #pragma once -/** - ****************************************************************************** +/***************************************************************************** * @file rotary_encoder.h * @author LEO / Creality3D * @date 2019/07/06 * @version 2.0.1 - * @brief 旋转编ç å™¨æ“作函数 - ****************************************************************************** -**/ + * @brief Rotary encoder functions + ****************************************************************************/ #include "../../../inc/MarlinConfig.h" #include "../../../MarlinCore.h" @@ -54,19 +52,18 @@ typedef struct { extern ENCODER_Rate EncoderRate; typedef enum { - ENCODER_DIFF_NO = 0, - ENCODER_DIFF_CW = 1, - ENCODER_DIFF_CCW = 2, - ENCODER_DIFF_ENTER = 3 + ENCODER_DIFF_NO = 0, // no state + ENCODER_DIFF_CW = 1, // clockwise rotation + ENCODER_DIFF_CCW = 2, // counterclockwise rotation + ENCODER_DIFF_ENTER = 3 // click } ENCODER_DiffState; -/*ç¼–ç å™¨åˆå§‹åŒ– PB12:Encoder_A PB13:Encoder_B PB14:Encoder_C*/ +// Encoder initialization void Encoder_Configuration(void); -/*接收数æ®è§£æž 返回值:ENCODER_DIFF_NO,无状æ€; ENCODER_DIFF_CW,顺时针旋转; ENCODER_DIFF_CCW,逆时针旋转; ENCODER_DIFF_ENTER,按下*/ +// Analyze encoder value and return state ENCODER_DiffState Encoder_ReceiveAnalyze(void); - /*********************** Encoder LED ***********************/ #if PIN_EXISTS(LCD_LED) @@ -78,28 +75,30 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void); #define RGB_SCALE_R10_G7_B5 1 #define RGB_SCALE_R10_G7_B4 2 #define RGB_SCALE_R10_G8_B7 3 - #define RGB_SCALE_NEUTRAL_WHITE RGB_SCALE_R10_G7_B5 //正白 - #define RGB_SCALE_WARM_WHITE RGB_SCALE_R10_G7_B4 //暖白 - #define RGB_SCALE_COOL_WHITE RGB_SCALE_R10_G8_B7 //冷白 + #define RGB_SCALE_NEUTRAL_WHITE RGB_SCALE_R10_G7_B5 + #define RGB_SCALE_WARM_WHITE RGB_SCALE_R10_G7_B4 + #define RGB_SCALE_COOL_WHITE RGB_SCALE_R10_G8_B7 extern unsigned int LED_DataArray[LED_NUM]; - /*状æ€LEDåˆå§‹åŒ–*/ - void STATE_LED_Configuration(void); - - /*LEDç¯æ“作*/ + // LED light operation void LED_Action(void); - /*LEDåˆå§‹åŒ–*/ + // LED initialization void LED_Configuration(void); - /*LED写数æ®*/ + // LED write data void LED_WriteData(void); - /*LED控制 RGB_Scale:RGB色彩é…比 luminance:亮度(0~0xFF)*/ + // LED control + // RGB_Scale: RGB color ratio + // luminance: brightness (0~0xFF) void LED_Control(unsigned char RGB_Scale, unsigned char luminance); - /*LEDæ¸å˜æŽ§åˆ¶ RGB_Scale:RGB色彩é…比 luminance:亮度(0~0xFF) change_Time:æ¸å˜æ—¶é—´(ms)*/ + // LED gradient control + // RGB_Scale: RGB color ratio + // luminance: brightness (0~0xFF) + // change_Time: gradient time (ms) void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval); -#endif +#endif // LCD_LED From a2a53406c89228f5cf4313b4776b6005df1c4337 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 10 Sep 2020 20:52:00 -0500 Subject: [PATCH 0219/1370] Use F() for Ender 3 V2 DWIN --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 138 +++++++++++++++--------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 1d9c83e6da..b7e72f09a1 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -215,11 +215,11 @@ void HMI_SetAndSaveLanguageChinese(void) { void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { if (value < 0) { - DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, (char*)"-"); + DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, F("-")); DWIN_Draw_FloatValue(true, true, 0, size, White, bColor, iNum, fNum, x, y, -value); } else { - DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, (char*)" "); + DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, F(" ")); DWIN_Draw_FloatValue(true, true, 0, size, White, bColor, iNum, fNum, x, y, value); } } @@ -557,11 +557,11 @@ inline void Prepare_Item_Cool(const uint8_t row) { inline void Prepare_Item_Lang(const uint8_t row) { if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 239, 134, 271 - 5, 479 - 333, LBLX, MBASE(row)); - DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), (char*)"CN"); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), F("CN")); } else { DWIN_Frame_AreaCopy(1, 0, 194, 271 - 150, 479 - 272, LBLX, MBASE(row)); // "Language selection" - DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), (char*)"EN"); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), F("EN")); } Draw_Menu_Icon(row, ICON_Language); } @@ -622,13 +622,13 @@ inline void Draw_Control_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_CONTROL)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_MOTION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); if (CVISI(6)) - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 5), (char*)"Info"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 5), F("Info")); #else DWIN_Frame_AreaCopy(1, 128, 2, 271 - 95, 479 - 467, 14, 8); DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX, CLINE(1));// Temperature > @@ -669,11 +669,11 @@ inline void Draw_Tune_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TUNE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), GET_TEXT_F(MSG_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else DWIN_Frame_AreaCopy(1, 94, 2, 271 - 145, 479 - 467, 14, 9); DWIN_Frame_AreaCopy(1, 1, 179, 271 - 179, 479 - 287 - 2, LBLX, MBASE(1)); // print speed @@ -748,10 +748,10 @@ inline void Draw_Motion_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOTION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Feedrate"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_ACCELERATION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STEPS_PER_MM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Feedrate")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_ACCELERATION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STEPS_PER_MM)); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); draw_max_en(MBASE(1)); draw_speed_en(24 + 3, MBASE(1)); // "Max Speed" @@ -787,8 +787,8 @@ void Popup_Window_Temperature(const bool toohigh) { DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, (char*)"Nozzle or Bed temperature"); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, (char*)"is too high"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, F("is too high")); } } else { @@ -798,8 +798,8 @@ void Popup_Window_Temperature(const bool toohigh) { DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, (char*)"Nozzle or Bed temperature"); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, (char*)"is too low"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, F("is too low")); } } } @@ -820,7 +820,7 @@ inline void Draw_Popup_Bkgd_60() { DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 20, 235, (char*)"Nozzle is too cold"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 20, 235, F("Nozzle is too cold")); DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280); } } @@ -837,9 +837,9 @@ void Popup_Window_Resume(void) { DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 307); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 120, 115, (char*)"Tips"); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 192, (char*)"I see the file stopped"); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 68, 212, (char*)"unexpectedly last time"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 120, 115, F("Tips")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 192, F("I see the file stopped")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 68, 212, F("unexpectedly last time")); DWIN_ICON_Show(ICON, ICON_Continue_E, 26, 307); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 307); } @@ -855,8 +855,8 @@ void Popup_Window_Home(void) { DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 80, 230, (char*)GET_TEXT_F(MSG_LEVEL_BED_HOMING)); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 80, 230, GET_TEXT_F(MSG_LEVEL_BED_HOMING)); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, F("Please wait until completed")); } } @@ -869,8 +869,8 @@ void Popup_Window_Leveling(void) { DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 76, 230, (char*)GET_TEXT_F(MSG_BED_LEVELING)); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 76, 230, GET_TEXT_F(MSG_BED_LEVELING)); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, F("Please wait until completed")); } } @@ -895,8 +895,8 @@ void Popup_window_PauseOrStop(void) { DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); } else { - if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 88, 150, (char*)GET_TEXT_F(MSG_PAUSE_PRINT)); - else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 150, (char*)GET_TEXT_F(MSG_STOP_PRINT)); + if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 88, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); + else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 150, GET_TEXT_F(MSG_STOP_PRINT)); DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); } @@ -920,19 +920,19 @@ void Draw_Print_ProgressBar() { DWIN_ICON_Show(ICON, ICON_Bar, 15, 93); DWIN_Draw_Rectangle(1, BarFill_Color, 16 + Percentrecord * 240 / 100, 93, 256, 113); DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Background_black, 2, 117, 133, Percentrecord); - DWIN_Draw_String(false, false, font8x16, Percent_Color, Background_black, 117 + 16, 133, (char*)"%"); + DWIN_Draw_String(false, false, font8x16, Percent_Color, Background_black, 117 + 16, 133, F("%")); } void Draw_Print_ProgressElapsed() { duration_t elapsed = print_job_timer.duration(); // print timer DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 42, 212, elapsed.value / 3600); - DWIN_Draw_String(false, false, font8x16, White, Background_black, 42 + 16, 212, (char*)":"); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 42 + 16, 212, F(":")); DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 42 + 24, 212, (elapsed.value % 3600) / 60); } void Draw_Print_ProgressRemain() { DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 176, 212, remain_time / 3600); - DWIN_Draw_String(false, false, font8x16, White, Background_black, 176 + 16, 212, (char*)":"); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 176 + 16, 212, F(":")); DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 176 + 24, 212, (remain_time % 3600) / 60); } @@ -1595,7 +1595,7 @@ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { if (row < 0) row = item + 1 + MROWS - index_file; const bool is_subdir = !card.flag.workDirIsRoot; if (is_subdir && item == 0) { - Draw_Menu_Line(row, ICON_Folder, (char*)".."); + Draw_Menu_Line(row, ICON_Folder, ".."); return; } @@ -1712,11 +1712,11 @@ void HMI_StartFrame(const bool with_update) { DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + (2 + 3) * STAT_CHR_W + 2, 429, (char*)"%"); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + (2 + 3) * STAT_CHR_W + 2, 429, F("%")); show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178, 429, BABY_Z_VAR * 100); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 3 * STAT_CHR_W + 5, 383, (char*)"/"); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 178 + 3 * STAT_CHR_W + 5, 383, (char*)"/"); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); if (with_update) { DWIN_UpdateLCD(); @@ -2287,11 +2287,11 @@ void Draw_Temperature_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"PLA Preheat Settings"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)"ABS Preheat Settings"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("PLA Preheat Settings")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), F("ABS Preheat Settings")); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(1)); // Nozzle... @@ -2561,10 +2561,10 @@ void HMI_Temperature(void) { else { #ifdef USE_STRING_HEADINGS Draw_Title("PLA Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Nozzle Temp"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Bed Temp"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Nozzle Temp")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Bed Temp")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STORE_EEPROM)); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(1)); @@ -2614,10 +2614,10 @@ void HMI_Temperature(void) { else { #ifdef USE_STRING_HEADINGS Draw_Title("ABS Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Nozzle Temp"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Bed Temp"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Nozzle Temp")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Bed Temp")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STORE_EEPROM)); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(1)); @@ -2673,10 +2673,10 @@ inline void Draw_Max_Speed_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Feedrate X"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Feedrate Y"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Feedrate Z"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Feedrate E"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Max Feedrate X")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Max Feedrate Y")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Feedrate Z")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Feedrate E")); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); @@ -2728,10 +2728,10 @@ inline void Draw_Max_Accel_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Accel X"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Accel Y"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Accel Z"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Accel E"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Max Accel X")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Max Accel Y")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Accel Z")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Accel E")); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); draw_max_accel_en(MBASE(1)); say_x(24 + 78 + 6, MBASE(1)); // "Max Acceleration X" @@ -2776,10 +2776,10 @@ inline void Draw_Max_Jerk_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Jerk X"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Jerk Y"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Jerk Z"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Jerk E"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Max Jerk X")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Max Jerk Y")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Jerk Z")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Jerk E")); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); draw_max_en(MBASE(1)); // "Max" @@ -2831,10 +2831,10 @@ inline void Draw_Steps_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Steps/mm X"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Steps/mm Y"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Steps/mm Z"); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Steps/mm E"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Steps/mm X")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Steps/mm Y")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Steps/mm Z")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Steps/mm E")); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); draw_steps_per_mm(MBASE(1)); say_x(100 + 3, MBASE(1)); // "Steps-per-mm X" From ade9476721fb88fcdc23a770aebbbae32db10583 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 10 Sep 2020 17:34:41 -0500 Subject: [PATCH 0220/1370] Clean up W25QXXFlash class --- Marlin/src/gcode/control/M993_M994.cpp | 4 ---- Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 2 -- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 1 - Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 -- Marlin/src/libs/W25Qxx.cpp | 3 ++- Marlin/src/libs/W25Qxx.h | 10 ++-------- 6 files changed, 4 insertions(+), 18 deletions(-) diff --git a/Marlin/src/gcode/control/M993_M994.cpp b/Marlin/src/gcode/control/M993_M994.cpp index 4e13aa9d77..ddc95238bf 100644 --- a/Marlin/src/gcode/control/M993_M994.cpp +++ b/Marlin/src/gcode/control/M993_M994.cpp @@ -41,8 +41,6 @@ void GcodeSuite::M993() { return; } - W25QXXFlash W25QXX; - uint8_t buf[1024]; uint32_t addr = 0; W25QXX.init(SPI_QUARTER_SPEED); @@ -71,8 +69,6 @@ void GcodeSuite::M994() { return; } - W25QXXFlash W25QXX; - uint8_t buf[1024]; uint32_t addr = 0; W25QXX.init(SPI_QUARTER_SPEED); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index 979c916e5c..9d3adc1bab 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -27,8 +27,6 @@ #include "../../../../inc/MarlinConfig.h" #include "SPIFlashStorage.h" -extern W25QXXFlash W25QXX; - uint8_t SPIFlashStorage::m_pageData[SPI_FLASH_PageSize]; uint32_t SPIFlashStorage::m_currentPage; uint16_t SPIFlashStorage::m_pageDataUsed; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index ff9d0518d3..6bdea3fd21 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -49,7 +49,6 @@ #include "../../../../feature/pause.h" #endif -W25QXXFlash W25QXX; CFG_ITMES gCfgItems; UI_CFG uiCfg; DISP_STATE_STACK disp_state_stack; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 4d9d08a9b4..f1086fd1b9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -156,8 +156,6 @@ extern void spi_flash_read_test(); extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); -extern W25QXXFlash W25QXX; - #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index d51dfb819d..9abe45fbaf 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -24,9 +24,10 @@ #if HAS_SPI_FLASH +#include "W25Qxx.h" #include -#include "W25Qxx.h" +W25QXXFlash W25QXX; #ifndef SPI_FLASH_MISO_PIN #define SPI_FLASH_MISO_PIN W25QXX_MISO_PIN diff --git a/Marlin/src/libs/W25Qxx.h b/Marlin/src/libs/W25Qxx.h index 81e9643450..ac3e8a169b 100644 --- a/Marlin/src/libs/W25Qxx.h +++ b/Marlin/src/libs/W25Qxx.h @@ -1,4 +1,4 @@ -/** +/** * Marlin 3D Printer Firmware * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * @@ -21,10 +21,6 @@ */ #pragma once -//#ifdef __cplusplus -//extern "C" { /* C-declarations for C++ */ -//#endif - #include #define W25X_WriteEnable 0x06 @@ -71,6 +67,4 @@ public: static void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); }; -//#ifdef __cplusplus -//} /* C-declarations for C++ */ -//#endif +extern W25QXXFlash W25QXX; From 26492ff0ea041c677697abee2a3f526988d0f781 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 11 Sep 2020 00:12:49 -0700 Subject: [PATCH 0221/1370] Fix Creality RET6 env - RE (#19340) --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 0c301a4044..d0a4cb7b10 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1065,7 +1065,7 @@ build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX [env:STM32F103RET6_creality] platform = ${common_stm32f1.platform} extends = common_stm32f1 -board = genericSTM32F103RC +board = genericSTM32F103RE build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DSTM32_XL_DENSITY -DTEMP_TIMER_CHAN=4 extra_scripts = ${common.extra_scripts} From ad5e73d772bd0c57525536e9d5c09d7fd93d6334 Mon Sep 17 00:00:00 2001 From: Haxk20 <16738302+Haxk20@users.noreply.github.com> Date: Sat, 12 Sep 2020 02:53:06 +0200 Subject: [PATCH 0222/1370] Fix Print Stats appearance (#19348) --- Marlin/src/lcd/menu/menu_info.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 00ab9ad195..864e855df2 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -34,6 +34,9 @@ #include "game/game.h" #endif +#define VALUE_ITEM(MSG, VALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy(msg + 2, VALUE); STATIC_ITEM(MSG, STYL, msg); }while(0) +#define VALUE_ITEM_P(MSG, PVALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy_P(msg + 2, PSTR(PVALUE)); STATIC_ITEM(MSG, STYL, msg); }while(0) + #if ENABLED(PRINTCOUNTER) #include "../../module/printcounter.h" @@ -49,8 +52,8 @@ char buffer[21]; START_SCREEN(); // 12345678901234567890 - STATIC_ITEM(MSG_INFO_PRINT_COUNT, SS_LEFT, i16tostr3left(stats.totalPrints)); // Print Count: 999 - STATIC_ITEM(MSG_INFO_COMPLETED_PRINTS, SS_LEFT, i16tostr3left(stats.finishedPrints)); // Completed : 666 + VALUE_ITEM(MSG_INFO_PRINT_COUNT, i16tostr3left(stats.totalPrints), SS_LEFT); // Print Count: 999 + VALUE_ITEM(MSG_INFO_COMPLETED_PRINTS, i16tostr3left(stats.finishedPrints), SS_LEFT); // Completed : 666 STATIC_ITEM(MSG_INFO_PRINT_TIME, SS_LEFT); // Total print Time: STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s From bf6ce68ed18ca3e9744e60d2026df45f28e076bb Mon Sep 17 00:00:00 2001 From: Neskik Date: Sat, 12 Sep 2020 05:51:19 +0200 Subject: [PATCH 0223/1370] M872 wait for probe temperature (#19344) --- .../{G76_M871.cpp => G76_M871-M872.cpp} | 46 +++++-- Marlin/src/gcode/gcode.cpp | 1 + Marlin/src/gcode/gcode.h | 6 +- Marlin/src/lcd/language/language_en.h | 2 + Marlin/src/lcd/language/language_fr.h | 2 + Marlin/src/module/temperature.cpp | 116 +++++++++++++++--- Marlin/src/module/temperature.h | 3 + 7 files changed, 150 insertions(+), 26 deletions(-) rename Marlin/src/gcode/calibrate/{G76_M871.cpp => G76_M871-M872.cpp} (90%) diff --git a/Marlin/src/gcode/calibrate/G76_M871.cpp b/Marlin/src/gcode/calibrate/G76_M871-M872.cpp similarity index 90% rename from Marlin/src/gcode/calibrate/G76_M871.cpp rename to Marlin/src/gcode/calibrate/G76_M871-M872.cpp index 9870d9fbe5..4f7c2874b1 100644 --- a/Marlin/src/gcode/calibrate/G76_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M871-M872.cpp @@ -37,6 +37,17 @@ #include "../../module/probe.h" #include "../../feature/probe_temp_comp.h" +#include "../../lcd/ultralcd.h" +#include "../../MarlinCore.h" // for wait_for_heatup and idle() + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" +#endif + +#if ENABLED(PRINTER_EVENTS_LEDS) + #include "../../feature/leds/leds.h" +#endif + /** * G76: calibrate probe and/or bed temperature offsets * Notes: @@ -303,17 +314,17 @@ void GcodeSuite::M871() { } else if (parser.seen("BPE")) { if (!parser.seenval('V')) return; - const int16_t val = parser.value_int(); + const int16_t offset_val = parser.value_int(); if (!parser.seenval('I')) return; const int16_t idx = parser.value_int(); const TempSensorID mod = (parser.seen('B') ? TSI_BED : - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - parser.seen('E') ? TSI_EXT : - #endif - TSI_PROBE + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + parser.seen('E') ? TSI_EXT : + #endif + TSI_PROBE ); - if (idx > 0 && temp_comp.set_offset(mod, idx - 1, val)) - SERIAL_ECHOLNPAIR("Set value: ", val); + if (idx > 0 && temp_comp.set_offset(mod, idx - 1, offset_val)) + SERIAL_ECHOLNPAIR("Set value: ", offset_val); else SERIAL_ECHOLNPGM("!Invalid index. Failed to set value (note: value at index 0 is constant)."); @@ -322,4 +333,25 @@ void GcodeSuite::M871() { temp_comp.print_offsets(); } +/** + * M872: Wait for probe temperature sensor to reach a target + * + * Select only one of these flags: + * R - Wait for heating or cooling + * S - Wait only for heating + */ +void GcodeSuite::M872() { + if (DEBUGGING(DRYRUN)) return; + + const bool no_wait_for_cooling = parser.seenval('S'); + if (!no_wait_for_cooling && ! parser.seenval('R')) { + SERIAL_ERROR_MSG("No target temperature set."); + return; + } + + const float target_temp = parser.value_celsius(); + ui.set_status_P(thermalManager.isProbeBelowTemp(target_temp) ? GET_TEXT(MSG_PROBE_HEATING) : GET_TEXT(MSG_PROBE_COOLING)); + thermalManager.wait_for_probe(target_temp, no_wait_for_cooling); +} + #endif // PROBE_TEMP_COMPENSATION diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index c0a795025f..bace7adc75 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -819,6 +819,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(PROBE_TEMP_COMPENSATION) case 871: M871(); break; // M871: Print/reset/clear first layer temperature offset values + case 872: M872(); break; // M872: Wait for probe temp #endif #if ENABLED(LIN_ADVANCE) diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 23bf2c0ce5..72a2d0966f 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -253,6 +253,7 @@ * M868 - Report or set position encoder module error correction threshold. * M869 - Report position encoder module error. * M871 - Print/reset/clear first layer temperature offset values. (Requires PROBE_TEMP_COMPENSATION) + * M872 - Wait for probe temp (Requires PROBE_TEMP_COMPENSATION) * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER) * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) @@ -820,7 +821,10 @@ private: FORCE_INLINE static void M869() { I2CPEM.M869(); } #endif - TERN_(PROBE_TEMP_COMPENSATION, static void M871()); + #if ENABLED(PROBE_TEMP_COMPENSATION) + static void M871(); + static void M872(); + #endif TERN_(LIN_ADVANCE, static void M900()); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index fadce16439..f5ba320881 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -470,6 +470,8 @@ namespace Language_en { PROGMEM Language_Str MSG_COOLING = _UxGT("Cooling..."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bed Heating..."); PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bed Cooling..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Probe Heating..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Probe Cooling..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chamber Heating..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index c1980a9141..21f7757fa9 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -413,6 +413,8 @@ namespace Language_fr { PROGMEM Language_Str MSG_COOLING = _UxGT("Refroidissement"); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Lit en chauffe..."); PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Refroid. du lit..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Probe en chauffe..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Refroid. Probe..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chauffe caisson..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Refroid. caisson..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibration Delta"); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 6b22c50a7b..fbdd1fd6ec 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -440,7 +440,6 @@ volatile bool Temperature::raw_temps_ready = false; SHV(bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1); - wait_for_heatup = true; // Can be interrupted with M108 #if ENABLED(PRINTER_EVENT_LEDS) const float start_temp = GHV(temp_bed.celsius, temp_hotend[heater].celsius); LEDColor color = ONHEATINGSTART(); @@ -449,6 +448,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = false); // PID Tuning loop + wait_for_heatup = true; // Can be interrupted with M108 while (wait_for_heatup) { const millis_t ms = millis(); @@ -632,6 +632,7 @@ volatile bool Temperature::raw_temps_ready = false; } TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); } + wait_for_heatup = false; disable_all_heaters(); @@ -3060,10 +3061,10 @@ void Temperature::tick() { printerEventLEDs.onHotendHeatingStart(); #endif - float target_temp = -1.0, old_temp = 9999.0; bool wants_to_cool = false; - wait_for_heatup = true; + float target_temp = -1.0, old_temp = 9999.0; millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + wait_for_heatup = true; do { // Target temperature might be changed during the loop if (target_temp != degTargetHotend(target_extruder)) { @@ -3137,6 +3138,7 @@ void Temperature::tick() { } while (wait_for_heatup && TEMP_CONDITIONS); if (wait_for_heatup) { + wait_for_heatup = false; #if ENABLED(DWIN_CREALITY_LCD) HMI_flag.heat_flag = 0; duration_t elapsed = print_job_timer.duration(); // print timer @@ -3145,9 +3147,10 @@ void Temperature::tick() { ui.reset_status(); #endif TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onHeatingDone()); + return true; } - return wait_for_heatup; + return false; } #endif // HAS_TEMP_HOTEND @@ -3176,11 +3179,6 @@ void Temperature::tick() { #define TEMP_BED_CONDITIONS (wants_to_cool ? isCoolingBed() : isHeatingBed()) #endif - float target_temp = -1, old_temp = 9999; - bool wants_to_cool = false; - wait_for_heatup = true; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; - #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) KEEPALIVE_STATE(NOT_BUSY); #endif @@ -3190,6 +3188,10 @@ void Temperature::tick() { printerEventLEDs.onBedHeatingStart(); #endif + bool wants_to_cool = false; + float target_temp = -1, old_temp = 9999; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + wait_for_heatup = true; do { // Target temperature might be changed during the loop if (target_temp != degTargetBed()) { @@ -3264,9 +3266,13 @@ void Temperature::tick() { } while (wait_for_heatup && TEMP_BED_CONDITIONS); - if (wait_for_heatup) ui.reset_status(); + if (wait_for_heatup) { + wait_for_heatup = false; + ui.reset_status(); + return true; + } - return wait_for_heatup; + return false; } void Temperature::wait_for_bed_heating() { @@ -3280,6 +3286,77 @@ void Temperature::tick() { #endif // HAS_HEATED_BED + #if HAS_TEMP_PROBE + + #ifndef MIN_DELTA_SLOPE_DEG_PROBE + #define MIN_DELTA_SLOPE_DEG_PROBE 1.0 + #endif + #ifndef MIN_DELTA_SLOPE_TIME_PROBE + #define MIN_DELTA_SLOPE_TIME_PROBE 600 + #endif + + bool Temperature::wait_for_probe(const float target_temp, bool no_wait_for_cooling/*=true*/) { + + const bool wants_to_cool = isProbeAboveTemp(target_temp); + const bool will_wait = !(wants_to_cool && no_wait_for_cooling); + if (will_wait) + SERIAL_ECHOLNPAIR("Waiting for probe to ", (wants_to_cool ? PSTR("cool down") : PSTR("heat up")), " to ", target_temp, " degrees."); + + #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + float old_temp = 9999; + millis_t next_temp_ms = 0, next_delta_check_ms = 0; + wait_for_heatup = true; + while (will_wait && wait_for_heatup) { + + // Print Temp Reading every 10 seconds while heating up. + millis_t now = millis(); + if (!next_temp_ms || ELAPSED(now, next_temp_ms)) { + next_temp_ms = now + 10000UL; + print_heater_states(active_extruder); + SERIAL_EOL(); + } + + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + + // Break after MIN_DELTA_SLOPE_TIME_PROBE seconds if the temperature + // did not drop at least MIN_DELTA_SLOPE_DEG_PROBE. This avoids waiting + // forever as the probe is not actively heated. + if (!next_delta_check_ms || ELAPSED(now, next_delta_check_ms)) { + const float temp = degProbe(), + delta_temp = old_temp > temp ? old_temp - temp : temp - old_temp; + if (delta_temp < float(MIN_DELTA_SLOPE_DEG_PROBE)) { + SERIAL_ECHOLNPGM("Timed out waiting for probe temperature."); + break; + } + next_delta_check_ms = now + 1000UL * MIN_DELTA_SLOPE_TIME_PROBE; + old_temp = temp; + } + + // Loop until the temperature is very close target + if (!(wants_to_cool ? isProbeAboveTemp(target_temp) : isProbeBelowTemp(target_temp))) { + SERIAL_ECHOLN(wants_to_cool ? PSTR("Cooldown") : PSTR("Heatup")); + SERIAL_ECHOLNPGM(" complete, target probe temperature reached."); + break; + } + } + + if (wait_for_heatup) { + wait_for_heatup = false; + ui.reset_status(); + return true; + } + else if (will_wait) + SERIAL_ECHOLNPGM("Canceled wait for probe temperature."); + + return false; + } + + #endif // HAS_TEMP_PROBE + #if HAS_HEATED_CHAMBER #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER @@ -3300,15 +3377,14 @@ void Temperature::tick() { #define TEMP_CHAMBER_CONDITIONS (wants_to_cool ? isCoolingChamber() : isHeatingChamber()) #endif - float target_temp = -1, old_temp = 9999; - bool wants_to_cool = false; - wait_for_heatup = true; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; - #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) KEEPALIVE_STATE(NOT_BUSY); #endif + bool wants_to_cool = false; + float target_temp = -1, old_temp = 9999; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + wait_for_heatup = true; do { // Target temperature might be changed during the loop if (target_temp != degTargetChamber()) { @@ -3367,9 +3443,13 @@ void Temperature::tick() { } } while (wait_for_heatup && TEMP_CHAMBER_CONDITIONS); - if (wait_for_heatup) ui.reset_status(); + if (wait_for_heatup) { + wait_for_heatup = false; + ui.reset_status(); + return true; + } - return wait_for_heatup; + return false; } #endif // HAS_HEATED_CHAMBER diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 4d3efceafd..2148f4cb68 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -654,6 +654,9 @@ class Temperature { FORCE_INLINE static int16_t rawProbeTemp() { return temp_probe.raw; } #endif FORCE_INLINE static float degProbe() { return temp_probe.celsius; } + FORCE_INLINE static bool isProbeBelowTemp(const float target_temp) { return temp_probe.celsius < target_temp; } + FORCE_INLINE static bool isProbeAboveTemp(const float target_temp) { return temp_probe.celsius > target_temp; } + static bool wait_for_probe(const float target_temp, bool no_wait_for_cooling=true); #endif #if WATCH_PROBE From 09d1bf37e7eb161dea98fda7c4a9bd6c6e20843c Mon Sep 17 00:00:00 2001 From: Jesse S Date: Sat, 12 Sep 2020 19:50:15 -0700 Subject: [PATCH 0224/1370] Highlight Creality DWIN menu icons (#19368) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index b7e72f09a1..8aa908e423 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -227,6 +227,7 @@ void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNu void ICON_Print() { if (select_page.now == 0) { DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); + DWIN_Draw_Rectangle(0, White, 17, 130, 126, 229); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 58, 201); else @@ -244,6 +245,7 @@ void ICON_Print() { void ICON_Prepare() { if (select_page.now == 1) { DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); + DWIN_Draw_Rectangle(0, White, 145, 130, 254, 229); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 31, 447, 271 - 213, 479 - 19, 186, 201); else @@ -261,6 +263,7 @@ void ICON_Prepare() { void ICON_Control() { if (select_page.now == 2) { DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); + DWIN_Draw_Rectangle(0, White, 17, 246, 126, 345); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 61, 447, 271 - 183, 479 - 19, 58, 318); else @@ -278,6 +281,7 @@ void ICON_Control() { void ICON_StartInfo(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); + DWIN_Draw_Rectangle(0, White, 145, 246, 254, 345); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 91, 447, 271 - 153, 479 - 19, 186, 318); else @@ -295,6 +299,7 @@ void ICON_StartInfo(bool show) { void ICON_Leveling(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); + DWIN_Draw_Rectangle(0, White, 145, 246, 254, 345); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 211, 447, 238, 479 - 19, 186, 318); else @@ -312,6 +317,7 @@ void ICON_Leveling(bool show) { void ICON_Tune() { if (select_print.now == 0) { DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); + DWIN_Draw_Rectangle(0, White, 8, 252, 87, 351); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 121, 447, 271 - 123, 479 - 21, 34, 325); else @@ -329,6 +335,7 @@ void ICON_Tune() { void ICON_Pause() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); + DWIN_Draw_Rectangle(0, White, 96, 252, 175, 351); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 181, 447, 271 - 63, 479 - 20, 124, 325); else @@ -346,6 +353,7 @@ void ICON_Pause() { void ICON_Continue() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); + DWIN_Draw_Rectangle(0, White, 96, 252, 175, 351); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 124, 325); else @@ -363,6 +371,7 @@ void ICON_Continue() { void ICON_Stop() { if (select_print.now == 2) { DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); + DWIN_Draw_Rectangle(0, White, 184, 252, 263, 351); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 151, 447, 271 - 93, 479 - 20, 210, 325); else From ee32e3eb40404b17e257caf2c8b90cdc809df559 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sun, 13 Sep 2020 04:51:20 +0200 Subject: [PATCH 0225/1370] Update Italian language (#19365) --- Marlin/src/lcd/language/language_it.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 39980b846e..27087e5a55 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -46,6 +46,7 @@ namespace Language_it { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media inserito"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media rimosso"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Aspettando media"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Inizial.SD fallita"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Err.leggendo media"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Dispos.USB rimosso"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Avvio USB fallito"); @@ -221,6 +222,10 @@ namespace Language_it { PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Viola"); PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Bianco"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Predefinito"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Canale ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Luci #2"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Luce #2 Presets"); + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Luminosità"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luci personalizzate"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensità rosso"); PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensità verde"); @@ -465,6 +470,8 @@ namespace Language_it { PROGMEM Language_Str MSG_COOLING = _UxGT("Raffreddamento.."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Risc. piatto..."); PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Raffr. piatto..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Risc. sonda..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Raffr. sonda..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Risc. camera..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Raffr. camera..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibraz. Delta"); @@ -585,6 +592,17 @@ namespace Language_it { PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Indice pag. errato"); PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Vel. pag. errata"); + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Modif.password"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login richiesto"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Impostaz.password"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Inserisci cifra"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Imp./Modif.password"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Elimina password"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("La password è "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Ricominciare"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Ricordati di mem.!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Password eliminata"); + // // Le schermate di Cambio Filamento possono visualizzare fino a 3 linee su un display a 4 righe // ...o fino a 2 linee su un display a 3 righe. From c517c2ea653aa44e0756a45c503ab5f07d750172 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 12 Sep 2020 19:52:46 -0700 Subject: [PATCH 0226/1370] Fix EXP2 pin define for MKS SGEN_L (#19369) --- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 733751eb0a..23558b2e04 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -229,7 +229,7 @@ * _____ _____ * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) - * (LCD_D4) 0.15 | · · | 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · | 1.20 (SD_MOSI) + * (LCD_D4) 0.15 | · · | 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · | 0.9 (SD_MOSI) * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST * GND | · · | 5V GND | · · | NC * ----- ----- @@ -279,7 +279,7 @@ #define DOGLCD_CS P0_18 #define DOGLCD_A0 P0_16 #define DOGLCD_SCK P0_07 - #define DOGLCD_MOSI P1_20 + #define DOGLCD_MOSI P0_09 #define LCD_BACKLIGHT_PIN -1 From 4d146672669550483d9d2692a1c6e5f5ac719295 Mon Sep 17 00:00:00 2001 From: ManuelMcLure Date: Sat, 12 Sep 2020 20:59:20 -0700 Subject: [PATCH 0227/1370] Read from backup TMC StealthChop state (#19364) --- Marlin/src/feature/tmc_util.h | 3 ++ Marlin/src/module/settings.cpp | 64 +++++++++++++++++----------------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 2779ae4ef4..d96939c916 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -105,6 +105,7 @@ class TMCMarlin : public TMC, public TMCStorage { #if HAS_STEALTHCHOP inline void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); } inline bool get_stealthChop_status() { return this->en_pwm_mode(); } + inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } #endif #if ENABLED(HYBRID_THRESHOLD) @@ -171,6 +172,7 @@ class TMCMarlin : public TMC220 #if HAS_STEALTHCHOP inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } inline bool get_stealthChop_status() { return !this->en_spreadCycle(); } + inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } #endif #if ENABLED(HYBRID_THRESHOLD) @@ -216,6 +218,7 @@ class TMCMarlin : public TMC220 #if HAS_STEALTHCHOP inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } inline bool get_stealthChop_status() { return !this->en_spreadCycle(); } + inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } #endif #if ENABLED(HYBRID_THRESHOLD) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 8af2071e36..2c679068b9 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1191,60 +1191,60 @@ void MarlinSettings::postprocess() { #if HAS_STEALTHCHOP #if AXIS_HAS_STEALTHCHOP(X) - tmc_stealth_enabled.X = stepperX.get_stealthChop_status(); + tmc_stealth_enabled.X = stepperX.get_stored_stealthChop_status(); #endif #if AXIS_HAS_STEALTHCHOP(Y) - tmc_stealth_enabled.Y = stepperY.get_stealthChop_status(); + tmc_stealth_enabled.Y = stepperY.get_stored_stealthChop_status(); #endif #if AXIS_HAS_STEALTHCHOP(Z) - tmc_stealth_enabled.Z = stepperZ.get_stealthChop_status(); + tmc_stealth_enabled.Z = stepperZ.get_stored_stealthChop_status(); #endif #if AXIS_HAS_STEALTHCHOP(X2) - tmc_stealth_enabled.X2 = stepperX2.get_stealthChop_status(); + tmc_stealth_enabled.X2 = stepperX2.get_stored_stealthChop_status(); #endif #if AXIS_HAS_STEALTHCHOP(Y2) - tmc_stealth_enabled.Y2 = stepperY2.get_stealthChop_status(); + tmc_stealth_enabled.Y2 = stepperY2.get_stored_stealthChop_status(); #endif #if AXIS_HAS_STEALTHCHOP(Z2) - tmc_stealth_enabled.Z2 = stepperZ2.get_stealthChop_status(); + tmc_stealth_enabled.Z2 = stepperZ2.get_stored_stealthChop_status(); #endif #if AXIS_HAS_STEALTHCHOP(Z3) - tmc_stealth_enabled.Z3 = stepperZ3.get_stealthChop_status(); + tmc_stealth_enabled.Z3 = stepperZ3.get_stored_stealthChop_status(); #endif #if AXIS_HAS_STEALTHCHOP(Z4) - tmc_stealth_enabled.Z4 = stepperZ4.get_stealthChop_status(); + tmc_stealth_enabled.Z4 = stepperZ4.get_stored_stealthChop_status(); #endif #if MAX_EXTRUDERS #if AXIS_HAS_STEALTHCHOP(E0) - tmc_stealth_enabled.E0 = stepperE0.get_stealthChop_status(); + tmc_stealth_enabled.E0 = stepperE0.get_stored_stealthChop_status(); #endif #if MAX_EXTRUDERS > 1 #if AXIS_HAS_STEALTHCHOP(E1) - tmc_stealth_enabled.E1 = stepperE1.get_stealthChop_status(); + tmc_stealth_enabled.E1 = stepperE1.get_stored_stealthChop_status(); #endif #if MAX_EXTRUDERS > 2 #if AXIS_HAS_STEALTHCHOP(E2) - tmc_stealth_enabled.E2 = stepperE2.get_stealthChop_status(); + tmc_stealth_enabled.E2 = stepperE2.get_stored_stealthChop_status(); #endif #if MAX_EXTRUDERS > 3 #if AXIS_HAS_STEALTHCHOP(E3) - tmc_stealth_enabled.E3 = stepperE3.get_stealthChop_status(); + tmc_stealth_enabled.E3 = stepperE3.get_stored_stealthChop_status(); #endif #if MAX_EXTRUDERS > 4 #if AXIS_HAS_STEALTHCHOP(E4) - tmc_stealth_enabled.E4 = stepperE4.get_stealthChop_status(); + tmc_stealth_enabled.E4 = stepperE4.get_stored_stealthChop_status(); #endif #if MAX_EXTRUDERS > 5 #if AXIS_HAS_STEALTHCHOP(E5) - tmc_stealth_enabled.E5 = stepperE5.get_stealthChop_status(); + tmc_stealth_enabled.E5 = stepperE5.get_stored_stealthChop_status(); #endif #if MAX_EXTRUDERS > 6 #if AXIS_HAS_STEALTHCHOP(E6) - tmc_stealth_enabled.E6 = stepperE6.get_stealthChop_status(); + tmc_stealth_enabled.E6 = stepperE6.get_stored_stealthChop_status(); #endif #if MAX_EXTRUDERS > 7 #if AXIS_HAS_STEALTHCHOP(E7) - tmc_stealth_enabled.E7 = stepperE7.get_stealthChop_status(); + tmc_stealth_enabled.E7 = stepperE7.get_stored_stealthChop_status(); #endif #endif // MAX_EXTRUDERS > 7 #endif // MAX_EXTRUDERS > 6 @@ -3595,17 +3595,17 @@ void MarlinSettings::reset() { #if HAS_STEALTHCHOP CONFIG_ECHO_HEADING("Driver stepping mode:"); #if AXIS_HAS_STEALTHCHOP(X) - const bool chop_x = stepperX.get_stealthChop_status(); + const bool chop_x = stepperX.get_stored_stealthChop_status(); #else constexpr bool chop_x = false; #endif #if AXIS_HAS_STEALTHCHOP(Y) - const bool chop_y = stepperY.get_stealthChop_status(); + const bool chop_y = stepperY.get_stored_stealthChop_status(); #else constexpr bool chop_y = false; #endif #if AXIS_HAS_STEALTHCHOP(Z) - const bool chop_z = stepperZ.get_stealthChop_status(); + const bool chop_z = stepperZ.get_stored_stealthChop_status(); #else constexpr bool chop_z = false; #endif @@ -3619,17 +3619,17 @@ void MarlinSettings::reset() { } #if AXIS_HAS_STEALTHCHOP(X2) - const bool chop_x2 = stepperX2.get_stealthChop_status(); + const bool chop_x2 = stepperX2.get_stored_stealthChop_status(); #else constexpr bool chop_x2 = false; #endif #if AXIS_HAS_STEALTHCHOP(Y2) - const bool chop_y2 = stepperY2.get_stealthChop_status(); + const bool chop_y2 = stepperY2.get_stored_stealthChop_status(); #else constexpr bool chop_y2 = false; #endif #if AXIS_HAS_STEALTHCHOP(Z2) - const bool chop_z2 = stepperZ2.get_stealthChop_status(); + const bool chop_z2 = stepperZ2.get_stored_stealthChop_status(); #else constexpr bool chop_z2 = false; #endif @@ -3643,36 +3643,36 @@ void MarlinSettings::reset() { } #if AXIS_HAS_STEALTHCHOP(Z3) - if (stepperZ3.get_stealthChop_status()) { say_M569(forReplay, PSTR("I2 Z"), true); } + if (stepperZ3.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("I2 Z"), true); } #endif #if AXIS_HAS_STEALTHCHOP(Z4) - if (stepperZ4.get_stealthChop_status()) { say_M569(forReplay, PSTR("I3 Z"), true); } + if (stepperZ4.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("I3 Z"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E0) - if (stepperE0.get_stealthChop_status()) { say_M569(forReplay, PSTR("T0 E"), true); } + if (stepperE0.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T0 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E1) - if (stepperE1.get_stealthChop_status()) { say_M569(forReplay, PSTR("T1 E"), true); } + if (stepperE1.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T1 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E2) - if (stepperE2.get_stealthChop_status()) { say_M569(forReplay, PSTR("T2 E"), true); } + if (stepperE2.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T2 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E3) - if (stepperE3.get_stealthChop_status()) { say_M569(forReplay, PSTR("T3 E"), true); } + if (stepperE3.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T3 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E4) - if (stepperE4.get_stealthChop_status()) { say_M569(forReplay, PSTR("T4 E"), true); } + if (stepperE4.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T4 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E5) - if (stepperE5.get_stealthChop_status()) { say_M569(forReplay, PSTR("T5 E"), true); } + if (stepperE5.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T5 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E6) - if (stepperE6.get_stealthChop_status()) { say_M569(forReplay, PSTR("T6 E"), true); } + if (stepperE6.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T6 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E7) - if (stepperE7.get_stealthChop_status()) { say_M569(forReplay, PSTR("T7 E"), true); } + if (stepperE7.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T7 E"), true); } #endif #endif // HAS_STEALTHCHOP From c1dcbab932f02c4e759dc514633b185f460f2e5b Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 13 Sep 2020 16:01:03 +1200 Subject: [PATCH 0228/1370] Fix extra string substitution bug (#19351) --- Marlin/src/lcd/lcdprint.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index 0f7f945a99..1355dbbf2d 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -57,7 +57,10 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const i PGM_P const b = ind == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED); n -= lcd_put_u8str_max_P(b, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); } - if (n) n -= lcd_put_u8str_max_P((PGM_P)p, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); + if (n) { + n -= lcd_put_u8str_max_P((PGM_P)p, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); + break; + } } else if (ch == '$' && inStr) { n -= lcd_put_u8str_max_P(inStr, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); From 196a72b29e2e82c90a9a5f19d6263e9b05fc7aa9 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sat, 12 Sep 2020 22:32:00 -0600 Subject: [PATCH 0229/1370] Touch UI "Leveling" menu, misc. fixes (#19349) --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 3 + .../ftdi_eve_lib/extras/poly_ui.h | 41 ++-- .../ftdi_eve_touch_ui/language/language_en.h | 3 +- .../screens/advanced_settings_menu.cpp | 20 +- .../screens/bed_mesh_screen.cpp | 43 +++-- .../screens/bio_status_screen.cpp | 35 ++-- .../screens/filament_menu.cpp | 65 +++---- .../screens/files_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 52 ++---- .../ftdi_eve_touch_ui/screens/screen_data.h | 1 + .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 15 +- .../lib/ftdi_eve_touch_ui/screens/screens.h | 175 ++++++++++-------- .../lib/ftdi_eve_touch_ui/theme/colors.h | 8 +- Marlin/src/lcd/extui/ui_api.cpp | 4 + Marlin/src/lcd/extui/ui_api.h | 7 +- 15 files changed, 257 insertions(+), 217 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index d13a8c3dc4..9fc9ec099e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -736,6 +736,7 @@ uint8_t count = GRID_MAX_POINTS; mesh_index_pair best; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); do { if (do_ubl_mesh_map) display_map(g29_map_type); @@ -775,6 +776,8 @@ } while (best.pos.x >= 0 && --count); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_FINISH)); + // Release UI during stow to allow for PAUSE_BEFORE_DEPLOY_STOW TERN_(HAS_LCD_MENU, ui.release()); probe.stow(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h index 3abc6fca2d..450b9c4415 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once @@ -36,7 +36,7 @@ * * PolyReader r(data, N_ELEMENTS(data)); * - * for(r.start();r.has_more(); r.next()) { + * for (r.start();r.has_more(); r.next()) { * uint16_t x = r.x; * uint16_t y = r.y; * @@ -107,8 +107,8 @@ class PolyReader { } } - bool has_more() {return p != NULL;} - bool end_of_loop() {return start_x == eol;} + bool has_more() { return p != NULL; } + bool end_of_loop() { return start_x == eol; } }; /** @@ -129,7 +129,7 @@ class TransformedPolyReader : public PolyReader { */ static constexpr uint8_t fract_bits = 5; typedef int16_t fix_t; - fix_t makefix(float f) {return f * (1 << fract_bits);} + fix_t makefix(float f) { return f * (1 << fract_bits); } // First two rows of 3x3 transformation matrix fix_t a, b, c; @@ -254,6 +254,13 @@ class GenericPolyUI { draw_mode_t mode; public: + enum ButtonStyle : uint8_t { + FILL = 1, + STROKE = 2, + SHADOW = 4, + REGULAR = 7 + }; + typedef POLY_READER poly_reader_t; GenericPolyUI(CommandProcessor &c, draw_mode_t what = BOTH) : cmd(c), mode(what) {} @@ -276,7 +283,7 @@ class GenericPolyUI { Polygon p(cmd); p.begin_fill(); p.begin_loop(); - for(r.start();r.has_more();r.next()) { + for (r.start();r.has_more();r.next()) { p(r.x * 16, r.y * 16); if (r.end_of_loop()) { p.end_loop(); @@ -306,7 +313,7 @@ class GenericPolyUI { Polygon p(cmd); p.begin_stroke(); p.begin_loop(); - for(r.start();r.has_more(); r.next()) { + for (r.start();r.has_more(); r.next()) { p(r.x * 16, r.y * 16); if (r.end_of_loop()) { p.end_loop(); @@ -323,7 +330,7 @@ class GenericPolyUI { int16_t y_min = INT16_MAX; int16_t x_max = INT16_MIN; int16_t y_max = INT16_MIN; - for(r.start(); r.has_more(); r.next()) { + for (r.start(); r.has_more(); r.next()) { x_min = min(x_min, int16_t(r.x)); x_max = max(x_max, int16_t(r.x)); y_min = min(y_min, int16_t(r.y)); @@ -355,11 +362,11 @@ class GenericPolyUI { btn_shadow_depth = depth; } - void button(const uint8_t tag, poly_reader_t r) { + void button(const uint8_t tag, poly_reader_t r, uint8_t style = REGULAR) { using namespace FTDI; // Draw the shadow #if FTDI_API_LEVEL >= 810 - if (mode & BACKGROUND) { + if (mode & BACKGROUND && style & SHADOW) { cmd.cmd(SAVE_CONTEXT()); cmd.cmd(TAG(tag)); cmd.cmd(VERTEX_TRANSLATE_X(btn_shadow_depth * 16)); @@ -381,11 +388,15 @@ class GenericPolyUI { #endif // Draw the fill and stroke cmd.cmd(TAG(tag)); - cmd.cmd(COLOR_RGB(btn_fill_color)); - fill(r, false); - cmd.cmd(COLOR_RGB(btn_stroke_color)); - cmd.cmd(LINE_WIDTH(btn_stroke_width)); - stroke(r); + if (style & FILL) { + cmd.cmd(COLOR_RGB(btn_fill_color)); + fill(r, false); + } + if (style & STROKE) { + cmd.cmd(COLOR_RGB(btn_stroke_color)); + cmd.cmd(LINE_WIDTH(btn_stroke_width)); + stroke(r); + } cmd.cmd(RESTORE_CONTEXT()); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index f2971087c1..e465aa0b93 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -145,7 +145,8 @@ namespace Language_en { PROGMEM Language_Str MSG_TOUCH_CALIBRATION_PROMPT = u8"Touch the dots to calibrate"; PROGMEM Language_Str MSG_AUTOLEVEL_X_AXIS = u8"Level X Axis"; PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished"; - PROGMEM Language_Str MSG_RESET_BLTOUCH = u8"Reset BLTouch"; + PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; + PROGMEM Language_Str MSG_SHOW_MESH = u8"Show Bed Mesh"; #ifdef TOUCH_UI_LULZBOT_BIO PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 35040734b4..67b077a553 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -55,11 +55,11 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { #define ACCELERATION_POS BTN_POS(2,5), BTN_SIZE(1,1) #define ENDSTOPS_POS BTN_POS(1,6), BTN_SIZE(1,1) #define JERK_POS BTN_POS(2,6), BTN_SIZE(1,1) - #define OFFSETS_POS BTN_POS(1,7), BTN_SIZE(1,1) + #define CASE_LIGHT_POS BTN_POS(1,7), BTN_SIZE(1,1) #define BACKLASH_POS BTN_POS(2,7), BTN_SIZE(1,1) - #define CASE_LIGHT_POS BTN_POS(1,8), BTN_SIZE(1,1) + #define OFFSETS_POS BTN_POS(1,8), BTN_SIZE(1,1) #define TMC_HOMING_THRS_POS BTN_POS(2,8), BTN_SIZE(1,1) - #if EITHER(CASE_LIGHT_ENABLE, SENSORLESS_HOMING) + #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING) #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) #else #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) @@ -98,8 +98,8 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { .tag(13).button( TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT)) .enabled(ENABLED(SENSORLESS_HOMING)) .tag(14).button( TMC_HOMING_THRS_POS, GET_TEXT_F(MSG_TMC_HOMING_THRS)) - .enabled(EITHER(HAS_MULTI_HOTEND, BLTOUCH)) - .tag(4) .button( OFFSETS_POS, GET_TEXT_F(TERN(HAS_MULTI_HOTEND, MSG_OFFSETS_MENU, MSG_RESET_BLTOUCH))) + .enabled(ENABLED(HAS_MULTI_HOTEND)) + .tag(4) .button( OFFSETS_POS, GET_TEXT_F(MSG_OFFSETS_MENU)) .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) .tag(11).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) .tag(12).button( ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) @@ -123,13 +123,9 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { case 2: GOTO_SCREEN(ZOffsetScreen); break; #endif case 3: GOTO_SCREEN(StepsScreen); break; - case 4: - #if HAS_MULTI_HOTEND - GOTO_SCREEN(NozzleOffsetScreen); - #elif ENABLED(BLTOUCH) - injectCommands_P(PSTR("M280 P0 S60")); - #endif - break; + #if ENABLED(HAS_MULTI_HOTEND) + case 4: GOTO_SCREEN(NozzleOffsetScreen); break; + #endif case 5: GOTO_SCREEN(MaxVelocityScreen); break; case 6: GOTO_SCREEN(DefaultAccelerationScreen); break; case 7: GOTO_SCREEN(TERN(HAS_JUNCTION_DEVIATION, JunctionDeviationScreen, JerkScreen)); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 663555f05d..eea2268c5b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -222,7 +222,8 @@ bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) { void BedMeshScreen::onEntry() { screen_data.BedMeshScreen.highlightedTag = 0; - screen_data.BedMeshScreen.count = 0; + screen_data.BedMeshScreen.count = GRID_MAX_POINTS; + screen_data.BedMeshScreen.showMappingDone = false; BaseScreen::onEntry(); } @@ -251,6 +252,10 @@ void BedMeshScreen::drawHighlightedPointValue() { .colors(action_btn) .tag(1).button( OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); + + if (screen_data.BedMeshScreen.showMappingDone) { + cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); + } } void BedMeshScreen::onRedraw(draw_mode_t what) { @@ -270,17 +275,13 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { if (what & FOREGROUND) { constexpr float autoscale_max_amplitude = 0.03; - const bool levelingFinished = screen_data.BedMeshScreen.count >= GRID_MAX_POINTS; - const float levelingProgress = sq(float(screen_data.BedMeshScreen.count) / GRID_MAX_POINTS); - if (levelingFinished) { + const bool gotAllPoints = screen_data.BedMeshScreen.count >= GRID_MAX_POINTS; + if (gotAllPoints) { drawHighlightedPointValue(); - CommandProcessor cmd; - cmd.font(Theme::font_medium) - .text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); } - + const float levelingProgress = sq(float(screen_data.BedMeshScreen.count) / GRID_MAX_POINTS); BedMeshScreen::drawMesh(INSET_POS(MESH_POS), ExtUI::getMeshArray(), - USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (levelingFinished ? USE_COLORS : 0), + USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (gotAllPoints ? USE_COLORS : 0), autoscale_max_amplitude * levelingProgress ); } @@ -307,11 +308,29 @@ void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { } void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { - if (state == ExtUI::PROBE_FINISH) { - screen_data.BedMeshScreen.highlightedTag = pointToTag(x, y); - screen_data.BedMeshScreen.count++; + switch(state) { + case ExtUI::MESH_START: + screen_data.BedMeshScreen.count = 0; + screen_data.BedMeshScreen.showMappingDone = false; + break; + case ExtUI::MESH_FINISH: + screen_data.BedMeshScreen.count = GRID_MAX_POINTS; + screen_data.BedMeshScreen.showMappingDone = true; + break; + case ExtUI::PROBE_START: + screen_data.BedMeshScreen.highlightedTag = pointToTag(x, y); + break; + case ExtUI::PROBE_FINISH: + screen_data.BedMeshScreen.count++; + break; } BedMeshScreen::onMeshUpdate(x, y, 0); } +void BedMeshScreen::startMeshProbe() { + GOTO_SCREEN(BedMeshScreen); + screen_data.BedMeshScreen.count = 0; + injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); +} + #endif // TOUCH_UI_FTDI_EVE && HAS_MESH diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index 6d72fc92a2..cfae53c724 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -29,7 +29,9 @@ #include "../ftdi_eve_lib/extras/poly_ui.h" -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_COCOA_PRESS) + #include "cocoa_press_ui.h" +#elif ENABLED(TOUCH_UI_PORTRAIT) #include "bio_printer_ui_portrait.h" #else #include "bio_printer_ui_landscape.h" @@ -100,7 +102,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { // heating zones, but has no bed temperature cmd.cmd(COLOR_RGB(bg_text_enabled)); - cmd.font(font_medium); + cmd.font(font_xsmall); ui.bounds(POLY(h0_label), x, y, h, v); cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_1)); @@ -221,7 +223,7 @@ void StatusScreen::draw_syringe(draw_mode_t what) { ui.color(syringe_rgb); ui.fill(POLY(syringe_outline)); - ui.color(fill_rgb); + ui.color(fluid_rgb); ui.bounds(POLY(syringe_fluid), x, y, h, v); cmd.cmd(SAVE_CONTEXT()); cmd.cmd(SCISSOR_XY(x,y + v * (1.0 - fill_level))); @@ -245,23 +247,25 @@ void StatusScreen::draw_arrows(draw_mode_t what) { ui.button_stroke(stroke_rgb, 28); ui.button_shadow(shadow_rgb, shadow_depth); + constexpr uint8_t style = TERN(TOUCH_UI_COCOA_PRESS, PolyUI::FILL | PolyUI::SHADOW, PolyUI::REGULAR); + if ((what & BACKGROUND) || jog_xy) { - ui.button(1, POLY(x_neg)); - ui.button(2, POLY(x_pos)); - ui.button(3, POLY(y_neg)); - ui.button(4, POLY(y_pos)); + ui.button(1, POLY(x_neg), style); + ui.button(2, POLY(x_pos), style); + ui.button(3, POLY(y_neg), style); + ui.button(4, POLY(y_pos), style); } if ((what & BACKGROUND) || z_homed) { - ui.button(5, POLY(z_neg)); - ui.button(6, POLY(z_pos)); + ui.button(5, POLY(z_neg), style); + ui.button(6, POLY(z_pos), style); } if ((what & BACKGROUND) || e_homed) { #if DISABLED(TOUCH_UI_COCOA_PRESS) - ui.button(7, POLY(e_neg)); + ui.button(7, POLY(e_neg), style); #endif - ui.button(8, POLY(e_pos)); + ui.button(8, POLY(e_pos), style); } } @@ -300,13 +304,14 @@ void StatusScreen::draw_overlay_icons(draw_mode_t what) { PolyUI ui(cmd, what); if (what & FOREGROUND) { - ui.button_fill (fill_rgb); + ui.button_fill (TERN(TOUCH_UI_COCOA_PRESS, stroke_rgb, fill_rgb); ui.button_stroke(stroke_rgb, 28); ui.button_shadow(shadow_rgb, shadow_depth); - if (!jog_xy) ui.button(12, POLY(padlock)); - if (!e_homed) ui.button(13, POLY(home_e)); - if (!z_homed) ui.button(14, POLY(home_z)); + constexpr uint8_t style = TERN(TOUCH_UI_COCOA_PRESS, PolyUI::FILL | PolyUI::SHADOW, PolyUI::REGULAR); + if (!jog_xy) ui.button(12, POLY(padlock), style); + if (!e_homed) ui.button(13, POLY(home_e), style); + if (!z_homed) ui.button(14, POLY(home_z), style); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp index 575f75a74e..82ee118e4c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp @@ -30,6 +30,22 @@ using namespace FTDI; using namespace ExtUI; using namespace Theme; +#ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 9 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define RUNOUT_SENSOR_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LIN_ADVANCE_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) +#else + #define GRID_ROWS 6 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define RUNOUT_SENSOR_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LIN_ADVANCE_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,6), BTN_SIZE(2,1) +#endif + void FilamentMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { CommandProcessor cmd; @@ -41,47 +57,14 @@ void FilamentMenu::onRedraw(draw_mode_t what) { if (what & FOREGROUND) { CommandProcessor cmd; cmd.font(font_large) - #ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 9 - #define GRID_COLS 2 - .text ( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_FILAMENT)) - .font(font_medium).colors(normal_btn) - .enabled( - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - 1 - #endif - ) - .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_RUNOUT_SENSOR)) - .enabled( - #if ENABLED(LIN_ADVANCE) - 1 - #endif - ) - .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_LINEAR_ADVANCE)) - .colors(action_btn) - .tag(1) .button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - #undef GRID_COLS - #undef GRID_ROWS - #else - #define GRID_ROWS 6 - #define GRID_COLS 3 - .text ( BTN_POS(1,1), BTN_SIZE(3,1), GET_TEXT_F(MSG_FILAMENT)) - .font(font_medium).colors(normal_btn) - .enabled( - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - 1 - #endif - ) - .tag(2).button( BTN_POS(1,2), BTN_SIZE(3,1), GET_TEXT_F(MSG_RUNOUT_SENSOR)) - .enabled( - #if ENABLED(LIN_ADVANCE) - 1 - #endif - ) - .tag(3).button( BTN_POS(1,3), BTN_SIZE(3,1), GET_TEXT_F(MSG_LINEAR_ADVANCE)) - .colors(action_btn) - .tag(1) .button( BTN_POS(1,6), BTN_SIZE(3,1), GET_TEXT_F(MSG_BACK)); - #endif + .text(TITLE_POS, GET_TEXT_F(MSG_FILAMENT)) + .font(font_medium).colors(normal_btn) + .enabled(ENABLED(FILAMENT_RUNOUT_SENSOR)) + .tag(2).button(RUNOUT_SENSOR_POS, GET_TEXT_F(MSG_RUNOUT_SENSOR)) + .enabled(ENABLED(LIN_ADVANCE)) + .tag(3).button(LIN_ADVANCE_POS, GET_TEXT_F(MSG_LINEAR_ADVANCE)) + .colors(action_btn) + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index 8d6fb18603..dd0eb263d5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) +#if BOTH(TOUCH_UI_FTDI_EVE, SDSUPPORT) #include "screens.h" #include "screen_data.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index dfb23daa52..53e3ab00c7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -44,15 +44,14 @@ void MainMenu::onRedraw(draw_mode_t what) { #define ADVANCED_SETTINGS_POS BTN_POS(1,2), BTN_SIZE(2,1) #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(2,1) #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(2,1) - #define MOVE_AXIS_POS BTN_POS(1,5), BTN_SIZE(1,1) - #define DISABLE_STEPPERS_POS BTN_POS(2,5), BTN_SIZE(1,1) - #define AUTO_HOME_POS BTN_POS(1,6), BTN_SIZE(1,1) - #define CLEAN_NOZZLE_POS BTN_POS(2,6), BTN_SIZE(1,1) - #define LEVEL_BED_POS BTN_POS(1,7), BTN_SIZE(1,1) - #define LEVEL_AXIS_POS BTN_POS(2,7), BTN_SIZE(1,1) + #define DISABLE_STEPPERS_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define MOVE_AXIS_POS BTN_POS(1,6), BTN_SIZE(1,1) + #define LEVELING_POS BTN_POS(2,6), BTN_SIZE(1,1) + #define AUTO_HOME_POS BTN_POS(1,7), BTN_SIZE(1,1) + #define CLEAN_NOZZLE_POS BTN_POS(2,7), BTN_SIZE(1,1) #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) #else - #define GRID_ROWS 6 + #define GRID_ROWS 5 #define GRID_COLS 2 #define ADVANCED_SETTINGS_POS BTN_POS(1,1), BTN_SIZE(1,1) #define ABOUT_PRINTER_POS BTN_POS(2,1), BTN_SIZE(1,1) @@ -62,9 +61,8 @@ void MainMenu::onRedraw(draw_mode_t what) { #define DISABLE_STEPPERS_POS BTN_POS(2,3), BTN_SIZE(1,1) #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(1,1) #define FILAMENTCHANGE_POS BTN_POS(2,4), BTN_SIZE(1,1) - #define LEVEL_BED_POS BTN_POS(1,5), BTN_SIZE(1,1) - #define LEVEL_AXIS_POS BTN_POS(2,5), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,6), BTN_SIZE(2,1) + #define LEVELING_POS BTN_POS(1,5), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(2,5), BTN_SIZE(1,1) #endif if (what & FOREGROUND) { @@ -100,24 +98,13 @@ void MainMenu::onRedraw(draw_mode_t what) { #endif )) .tag(8).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .enabled( - #ifdef PRINTCOUNTER - 1 - #endif - ) - .enabled( - #ifdef AXIS_LEVELING_COMMANDS - 1 - #endif - ) - .tag(9).button( LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) .enabled( #ifdef HAS_LEVELING 1 #endif ) - .tag(10).button( LEVEL_BED_POS, GET_TEXT_F(MSG_LEVEL_BED)) - .tag(11).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .tag(9).button( LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) + .tag(10).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); } @@ -143,23 +130,10 @@ bool MainMenu::onTouchEnd(uint8_t tag) { case 7: GOTO_SCREEN(ChangeFilamentScreen); break; #endif case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; - #ifdef AXIS_LEVELING_COMMANDS - case 9: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS)); break; + #ifdef HAS_LEVELING + case 9: GOTO_SCREEN(LevelingMenu); break; #endif - #if HAS_LEVELING - case 10: - #ifndef BED_LEVELING_COMMANDS - #define BED_LEVELING_COMMANDS "G29" - #endif - #if HAS_MESH - GOTO_SCREEN(BedMeshScreen); - injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); - #else - SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); - #endif - break; - #endif - case 11: GOTO_SCREEN(AboutScreen); break; + case 10: GOTO_SCREEN(AboutScreen); break; default: return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index 207277b824..39e9ce4bc5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -62,6 +62,7 @@ union screen_data_t { } MoveAxisScreen; #if HAS_MESH struct { + bool showMappingDone; uint8_t count; uint8_t highlightedTag; } BedMeshScreen; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 01438aeb94..16aa682168 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -55,9 +55,6 @@ SCREEN_TABLE { #endif #if ENABLED(BABYSTEPPING) DECL_SCREEN(NudgeNozzleScreen), -#endif -#if HAS_MESH - DECL_SCREEN(BedMeshScreen), #endif DECL_SCREEN(MoveAxisScreen), DECL_SCREEN(StepsScreen), @@ -65,8 +62,14 @@ SCREEN_TABLE { DECL_SCREEN(StepperCurrentScreen), DECL_SCREEN(StepperBumpSensitivityScreen), #endif -#if HAS_BED_PROBE - DECL_SCREEN(ZOffsetScreen), +#if HAS_LEVELING + DECL_SCREEN(LevelingMenu), + #if HAS_BED_PROBE + DECL_SCREEN(ZOffsetScreen), + #endif + #if HAS_MESH + DECL_SCREEN(BedMeshScreen), + #endif #endif #if HAS_MULTI_HOTEND DECL_SCREEN(NozzleOffsetScreen), @@ -100,7 +103,9 @@ SCREEN_TABLE { DECL_SCREEN(InterfaceSettingsScreen), DECL_SCREEN(InterfaceSoundsScreen), DECL_SCREEN(LockScreen), +#if ENABLED(SDSUPPORT) DECL_SCREEN(FilesScreen), +#endif DECL_SCREEN(EndstopStatesScreen), #if ENABLED(TOUCH_UI_LULZBOT_BIO) DECL_SCREEN(BioPrintingDialogBox), diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index ae48f75240..ec8df27607 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -39,24 +39,37 @@ enum { STATUS_SCREEN_CACHE, MENU_SCREEN_CACHE, TUNE_SCREEN_CACHE, - ADJUST_OFFSETS_SCREEN_CACHE, ALERT_BOX_CACHE, SPINNER_CACHE, ADVANCED_SETTINGS_SCREEN_CACHE, MOVE_AXIS_SCREEN_CACHE, TEMPERATURE_SCREEN_CACHE, STEPS_SCREEN_CACHE, - STEPPER_CURRENT_SCREEN_CACHE, - STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE, - ZOFFSET_SCREEN_CACHE, - NOZZLE_OFFSET_SCREEN_CACHE, - BACKLASH_COMPENSATION_SCREEN_CACHE, MAX_FEEDRATE_SCREEN_CACHE, MAX_VELOCITY_SCREEN_CACHE, MAX_ACCELERATION_SCREEN_CACHE, DEFAULT_ACCELERATION_SCREEN_CACHE, -#if HAS_MESH - BED_MESH_SCREEN_CACHE, +#if HAS_LEVELING + LEVELING_SCREEN_CACHE, + #if HAS_BED_PROBE + ZOFFSET_SCREEN_CACHE, + #endif + #if HAS_MESH + BED_MESH_SCREEN_CACHE, + #endif +#endif +#if ENABLED(BABYSTEPPING) + ADJUST_OFFSETS_SCREEN_CACHE, +#endif +#if HAS_TRINAMIC_CONFIG + STEPPER_CURRENT_SCREEN_CACHE, + STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE, +#endif +#if HAS_MULTI_HOTEND + NOZZLE_OFFSET_SCREEN_CACHE, +#endif +#if ENABLED(BACKLASH_GCODE) + BACKLASH_COMPENSATION_SCREEN_CACHE, #endif #if HAS_JUNCTION_DEVIATION JUNC_DEV_SCREEN_CACHE, @@ -81,12 +94,14 @@ enum { #if ENABLED(TOUCH_UI_COCOA_PRESS) PREHEAT_MENU_CACHE, PREHEAT_TIMER_SCREEN_CACHE, +#endif +#if ENABLED(SDSUPPORT) + FILES_SCREEN_CACHE, #endif CHANGE_FILAMENT_SCREEN_CACHE, INTERFACE_SETTINGS_SCREEN_CACHE, INTERFACE_SOUNDS_SCREEN_CACHE, LOCK_SCREEN_CACHE, - FILES_SCREEN_CACHE, DISPLAY_TIMINGS_SCREEN_CACHE }; @@ -133,33 +148,6 @@ class AboutScreen : public BaseScreen, public UncachedScreen { static bool onTouchEnd(uint8_t tag); }; -#if HAS_MESH -class BedMeshScreen : public BaseScreen, public CachedScreen { - private: - enum MeshOpts { - USE_POINTS = 0x01, - USE_COLORS = 0x02, - USE_TAGS = 0x04, - USE_HIGHLIGHT = 0x08, - USE_AUTOSCALE = 0x10 - }; - - static uint8_t pointToTag(uint8_t x, uint8_t y); - static bool tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y); - static float getHightlightedValue(); - static void drawHighlightedPointValue(); - static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); - - public: - static void onMeshUpdate(const int8_t x, const int8_t y, const float val); - static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); -}; -#endif - #if ENABLED(PRINTCOUNTER) class StatisticsScreen : public BaseScreen, public UncachedScreen { public: @@ -505,14 +493,6 @@ class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#endif - #if HAS_MULTI_HOTEND class NozzleOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { public: @@ -522,6 +502,51 @@ class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; + + #if HAS_BED_PROBE + class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; + #endif + + #if HAS_MESH + class BedMeshScreen : public BaseScreen, public CachedScreen { + private: + enum MeshOpts { + USE_POINTS = 0x01, + USE_COLORS = 0x02, + USE_TAGS = 0x04, + USE_HIGHLIGHT = 0x08, + USE_AUTOSCALE = 0x10 + }; + + static uint8_t pointToTag(uint8_t x, uint8_t y); + static bool tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y); + static float getHightlightedValue(); + static void drawHighlightedPointValue(); + static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); + + public: + static void onMeshUpdate(const int8_t x, const int8_t y, const float val); + static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + + static void startMeshProbe(); + }; + #endif +#endif + #if ENABLED(BABYSTEPPING) class NudgeNozzleScreen : public BaseNumericAdjustmentScreen, public CachedScreen { public: @@ -707,40 +732,42 @@ class LockScreen : public BaseScreen, public CachedScreen { static bool onTouchEnd(uint8_t tag); }; -class FilesScreen : public BaseScreen, public CachedScreen { - private: - #ifdef TOUCH_UI_PORTRAIT - static constexpr uint8_t header_h = 2; - static constexpr uint8_t footer_h = 2; - static constexpr uint8_t files_per_page = 11; - #else - static constexpr uint8_t header_h = 1; - static constexpr uint8_t footer_h = 1; - static constexpr uint8_t files_per_page = 6; - #endif +#if ENABLED(SDSUPPORT) + class FilesScreen : public BaseScreen, public CachedScreen { + private: + #ifdef TOUCH_UI_PORTRAIT + static constexpr uint8_t header_h = 2; + static constexpr uint8_t footer_h = 2; + static constexpr uint8_t files_per_page = 11; + #else + static constexpr uint8_t header_h = 1; + static constexpr uint8_t footer_h = 1; + static constexpr uint8_t files_per_page = 6; + #endif - static uint8_t getTagForLine(uint8_t line) {return line + 2;} - static uint8_t getLineForTag(uint8_t tag) {return tag - 2;} - static uint16_t getFileForTag(uint8_t tag); - static uint16_t getSelectedFileIndex(); + static uint8_t getTagForLine(uint8_t line) {return line + 2;} + static uint8_t getLineForTag(uint8_t tag) {return tag - 2;} + static uint16_t getFileForTag(uint8_t tag); + static uint16_t getSelectedFileIndex(); - inline static const char *getSelectedShortFilename() {return getSelectedFilename(false);} - inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);} - static const char *getSelectedFilename(bool longName); + inline static const char *getSelectedShortFilename() {return getSelectedFilename(false);} + inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);} + static const char *getSelectedFilename(bool longName); - static void drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted); - static void drawFileList(); - static void drawHeader(); - static void drawFooter(); - static void drawSelectedFile(); + static void drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted); + static void drawFileList(); + static void drawHeader(); + static void drawFooter(); + static void drawSelectedFile(); - static void gotoPage(uint8_t); - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; + static void gotoPage(uint8_t); + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); + }; +#endif class EndstopStatesScreen : public BaseScreen, public UncachedScreen { public: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h index f99c0fd3eb..84639b59e1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -124,7 +124,13 @@ namespace Theme { constexpr uint32_t shadow_rgb = gray_color_6; constexpr uint32_t stroke_rgb = accent_color_1; constexpr uint32_t fill_rgb = accent_color_3; - constexpr uint32_t syringe_rgb = accent_color_5; + #if ENABLED(TOUCH_UI_COCOA_PRESS) + constexpr uint32_t syringe_rgb = 0xFFFFFF; + constexpr uint32_t fluid_rgb = accent_color_5; + #else + constexpr uint32_t syringe_rgb = accent_color_5; + constexpr uint32_t fluid_rgb = accent_color_3; + #endif #if ENABLED(TOUCH_UI_ROYAL_THEME) constexpr uint32_t x_axis = hsl_to_rgb(0, 1.00, 0.26); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index c40a869421..c2eab2ba06 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -544,11 +544,13 @@ namespace ExtUI { void setAxisSteps_per_mm(const float value, const axis_t axis) { planner.settings.axis_steps_per_mm[axis] = value; + planner.refresh_positioning(); } void setAxisSteps_per_mm(const float value, const extruder_t extruder) { UNUSED_E(extruder); planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)] = value; + planner.refresh_positioning(); } feedRate_t getAxisMaxFeedrate_mm_s(const axis_t axis) { @@ -580,11 +582,13 @@ namespace ExtUI { void setAxisMaxAcceleration_mm_s2(const float value, const axis_t axis) { planner.set_max_acceleration(axis, value); + planner.reset_acceleration_rates(); } void setAxisMaxAcceleration_mm_s2(const float value, const extruder_t extruder) { UNUSED_E(extruder); planner.set_max_acceleration(E_AXIS_N(extruder - E0), value); + planner.reset_acceleration_rates(); } #if HAS_FILAMENT_SENSOR diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index ca12d79a8b..02c4717d77 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -143,7 +143,12 @@ namespace ExtUI { void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval); inline void onMeshUpdate(const xy_int8_t &pos, const float zval) { onMeshUpdate(pos.x, pos.y, zval); } - typedef enum : unsigned char { PROBE_START, PROBE_FINISH } probe_state_t; + typedef enum : unsigned char { + MESH_START, // Prior to start of probe + MESH_FINISH, // Following probe of all points + PROBE_START, // Beginning probe of grid location + PROBE_FINISH // Finished probe of grid location + } probe_state_t; void onMeshUpdate(const int8_t xpos, const int8_t ypos, probe_state_t state); inline void onMeshUpdate(const xy_int8_t &pos, probe_state_t state) { onMeshUpdate(pos.x, pos.y, state); } #endif From a941faccb0f8ed5826e990976ac18119f73841e8 Mon Sep 17 00:00:00 2001 From: mmajoor Date: Sun, 13 Sep 2020 06:33:55 +0200 Subject: [PATCH 0230/1370] Allow SWD debug on Robin Nano (#19345) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index d66338b8ad..c3e8be74e8 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -25,7 +25,7 @@ * MKS Robin nano (STM32F130VET6) board pin assignments */ -#ifndef __STM32F1__ +#if !defined(STM32F1) && !defined(STM32F1xx) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." @@ -36,7 +36,7 @@ // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // -#define DISABLE_DEBUG +#define DISABLE_JTAG // // EEPROM From 2396b4e27fcf9d5dfbb526e2ad4b95994630519e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 13 Sep 2020 18:06:14 -0500 Subject: [PATCH 0231/1370] heater_ind_t => heater_id_t --- Marlin/src/gcode/temp/M303.cpp | 2 +- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 14 ++-- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 24 +++---- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/module/temperature.cpp | 72 ++++++++++----------- Marlin/src/module/temperature.h | 14 ++-- 6 files changed, 64 insertions(+), 64 deletions(-) diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 3340e4fa49..ccce09b4f1 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -62,7 +62,7 @@ void GcodeSuite::M303() { #define SI TERN(PIDTEMPBED, H_BED, H_E0) #define EI TERN(PIDTEMP, HOTENDS - 1, H_BED) - const heater_ind_t e = (heater_ind_t)parser.intval('E'); + const heater_id_t e = (heater_id_t)parser.intval('E'); if (!WITHIN(e, SI, EI)) { SERIAL_ECHOLNPGM(STR_PID_BAD_EXTRUDER_NUM); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_EXTRUDER_NUM)); diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 22dd63f68c..81ba4653a1 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -519,13 +519,13 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const } } -FORCE_INLINE void _draw_heater_status(const heater_ind_t heater, const char prefix, const bool blink) { +FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { #if HAS_HEATED_BED - const bool isBed = heater < 0; - const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater)), - t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater)); + const bool isBed = heater_id < 0; + const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), + t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); #else - const float t1 = thermalManager.degHotend(heater), t2 = thermalManager.degTargetHotend(heater); + const float t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); #endif if (prefix >= 0) lcd_put_wchar(prefix); @@ -540,7 +540,7 @@ FORCE_INLINE void _draw_heater_status(const heater_ind_t heater, const char pref #if HAS_HEATED_BED isBed ? thermalManager.bed_idle.timed_out : #endif - thermalManager.hotend_idle[heater].timed_out + thermalManager.hotend_idle[heater_id].timed_out ); if (!blink && is_idle) { @@ -990,7 +990,7 @@ void MarlinUI::draw_status_screen() { void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { if (row < LCD_HEIGHT) { lcd_moveto(LCD_WIDTH - 9, row); - _draw_heater_status((heater_ind_t)extruder, LCD_STR_THERMOMETER[0], get_blink()); + _draw_heater_status((heater_id_t)extruder, LCD_STR_THERMOMETER[0], get_blink()); } } diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index bdd9f25703..f668e453cc 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -178,17 +178,17 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons #if DO_DRAW_HOTENDS // Draw hotend bitmap with current and target temperatures - FORCE_INLINE void _draw_hotend_status(const heater_ind_t heater, const bool blink) { + FORCE_INLINE void _draw_hotend_status(const heater_id_t heater_id, const bool blink) { #if !HEATER_IDLE_HANDLER UNUSED(blink); #endif - const bool isHeat = HOTEND_ALT(heater); + const bool isHeat = HOTEND_ALT(heater_id); - const uint8_t tx = STATUS_HOTEND_TEXT_X(heater); + const uint8_t tx = STATUS_HOTEND_TEXT_X(heater_id); - const float temp = thermalManager.degHotend(heater), - target = thermalManager.degTargetHotend(heater); + const float temp = thermalManager.degHotend(heater_id), + target = thermalManager.degTargetHotend(heater_id); #if DISABLED(STATUS_HOTEND_ANIM) #define STATIC_HOTEND true @@ -237,24 +237,24 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons #if ANIM_HOTEND // Draw hotend bitmap, either whole or split by the heating percent - const uint8_t hx = STATUS_HOTEND_X(heater), - bw = STATUS_HOTEND_BYTEWIDTH(heater); + const uint8_t hx = STATUS_HOTEND_X(heater_id), + bw = STATUS_HOTEND_BYTEWIDTH(heater_id); #if ENABLED(STATUS_HEAT_PERCENT) if (isHeat && tall <= BAR_TALL) { const uint8_t ph = STATUS_HEATERS_HEIGHT - 1 - tall; - u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, ph, HOTEND_BITMAP(heater, false)); - u8g.drawBitmapP(hx, STATUS_HEATERS_Y + ph, bw, tall + 1, HOTEND_BITMAP(heater, true) + ph * bw); + u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, ph, HOTEND_BITMAP(heater_id, false)); + u8g.drawBitmapP(hx, STATUS_HEATERS_Y + ph, bw, tall + 1, HOTEND_BITMAP(heater_id, true) + ph * bw); } else #endif - u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, STATUS_HEATERS_HEIGHT, HOTEND_BITMAP(heater, isHeat)); + u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, STATUS_HEATERS_HEIGHT, HOTEND_BITMAP(heater_id, isHeat)); #endif } // PAGE_CONTAINS if (PAGE_UNDER(7)) { #if HEATER_IDLE_HANDLER - const bool dodraw = (blink || !thermalManager.hotend_idle[heater].timed_out); + const bool dodraw = (blink || !thermalManager.hotend_idle[heater_id].timed_out); #else constexpr bool dodraw = true; #endif @@ -597,7 +597,7 @@ void MarlinUI::draw_status_screen() { // Extruders #if DO_DRAW_HOTENDS LOOP_L_N(e, MAX_HOTEND_DRAW) - _draw_hotend_status((heater_ind_t)e, blink); + _draw_hotend_status((heater_id_t)e, blink); #endif // Laser / Spindle diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index c2eab2ba06..53b7dc6279 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -868,7 +868,7 @@ namespace ExtUI { } void startPIDTune(const float temp, extruder_t tool) { - thermalManager.PID_autotune(temp, (heater_ind_t)tool, 8, true); + thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true); } #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index fbdd1fd6ec..06864c6b97 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -377,7 +377,7 @@ volatile bool Temperature::raw_temps_ready = false; * Needs sufficient heater power to make some overshoot at target * temperature to succeed. */ - void Temperature::PID_autotune(const float &target, const heater_ind_t heater, const int8_t ncycles, const bool set_result/*=false*/) { + void Temperature::PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { float current_temp = 0.0; int cycles = 0; bool heating = true; @@ -389,11 +389,11 @@ volatile bool Temperature::raw_temps_ready = false; PID_t tune_pid = { 0, 0, 0 }; float maxT = 0, minT = 10000; - const bool isbed = (heater == H_BED); + const bool isbed = (heater_id == H_BED); #if HAS_PID_FOR_BOTH #define GHV(B,H) (isbed ? (B) : (H)) - #define SHV(B,H) do{ if (isbed) temp_bed.soft_pwm_amount = B; else temp_hotend[heater].soft_pwm_amount = H; }while(0) + #define SHV(B,H) do{ if (isbed) temp_bed.soft_pwm_amount = B; else temp_hotend[heater_id].soft_pwm_amount = H; }while(0) #define ONHEATINGSTART() (isbed ? printerEventLEDs.onBedHeatingStart() : printerEventLEDs.onHotendHeatingStart()) #define ONHEATING(S,C,T) (isbed ? printerEventLEDs.onBedHeating(S,C,T) : printerEventLEDs.onHotendHeating(S,C,T)) #elif ENABLED(PIDTEMPBED) @@ -403,7 +403,7 @@ volatile bool Temperature::raw_temps_ready = false; #define ONHEATING(S,C,T) printerEventLEDs.onBedHeating(S,C,T) #else #define GHV(B,H) H - #define SHV(B,H) (temp_hotend[heater].soft_pwm_amount = H) + #define SHV(B,H) (temp_hotend[heater_id].soft_pwm_amount = H) #define ONHEATINGSTART() printerEventLEDs.onHotendHeatingStart() #define ONHEATING(S,C,T) printerEventLEDs.onHotendHeating(S,C,T) #endif @@ -427,7 +427,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_AUTO_FAN, next_auto_fan_check_ms = next_temp_ms + 2500UL); - if (target > GHV(BED_MAX_TARGET, temp_range[heater].maxtemp - HOTEND_OVERSHOOT)) { + if (target > GHV(BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); return; @@ -441,7 +441,7 @@ volatile bool Temperature::raw_temps_ready = false; SHV(bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1); #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = GHV(temp_bed.celsius, temp_hotend[heater].celsius); + const float start_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); LEDColor color = ONHEATINGSTART(); #endif @@ -457,7 +457,7 @@ volatile bool Temperature::raw_temps_ready = false; updateTemperaturesFromRawValues(); // Get the current temperature and constrain it - current_temp = GHV(temp_bed.celsius, temp_hotend[heater].celsius); + current_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); NOLESS(maxT, current_temp); NOMORE(minT, current_temp); @@ -549,7 +549,7 @@ volatile bool Temperature::raw_temps_ready = false; // Report heater states every 2 seconds if (ELAPSED(ms, next_temp_ms)) { #if HAS_TEMP_SENSOR - print_heater_states(isbed ? active_extruder : heater); + print_heater_states(isbed ? active_extruder : heater_id); SERIAL_EOL(); #endif next_temp_ms = ms + 2000UL; @@ -564,10 +564,10 @@ volatile bool Temperature::raw_temps_ready = false; if (current_temp > watch_temp_target) heated = true; // - Flag if target temperature reached } else if (ELAPSED(ms, temp_change_ms)) // Watch timer expired - _temp_error(heater, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); + _temp_error(heater_id, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); } else if (current_temp < target - (MAX_OVERSHOOT_PID_AUTOTUNE)) // Heated, then temperature fell too far? - _temp_error(heater, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + _temp_error(heater_id, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); } #endif } // every 2 seconds @@ -608,9 +608,9 @@ volatile bool Temperature::raw_temps_ready = false; }while(0) #define _SET_EXTRUDER_PID() do { \ - PID_PARAM(Kp, heater) = tune_pid.Kp; \ - PID_PARAM(Ki, heater) = scalePID_i(tune_pid.Ki); \ - PID_PARAM(Kd, heater) = scalePID_d(tune_pid.Kd); \ + PID_PARAM(Kp, heater_id) = tune_pid.Kp; \ + PID_PARAM(Ki, heater_id) = scalePID_i(tune_pid.Ki); \ + PID_PARAM(Kd, heater_id) = scalePID_d(tune_pid.Kd); \ updatePID(); }while(0) // Use the result? (As with "M303 U1") @@ -651,7 +651,7 @@ volatile bool Temperature::raw_temps_ready = false; * Class and Instance Methods */ -int16_t Temperature::getHeaterPower(const heater_ind_t heater_id) { +int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { switch (heater_id) { #if HAS_HEATED_BED case H_BED: return temp_bed.soft_pwm_amount; @@ -758,7 +758,7 @@ int16_t Temperature::getHeaterPower(const heater_ind_t heater_id) { // Temperature Error Handlers // -inline void loud_kill(PGM_P const lcd_msg, const heater_ind_t heater) { +inline void loud_kill(PGM_P const lcd_msg, const heater_id_t heater_id) { marlin_state = MF_KILLED; #if USE_BEEPER for (uint8_t i = 20; i--;) { @@ -767,10 +767,10 @@ inline void loud_kill(PGM_P const lcd_msg, const heater_ind_t heater) { } WRITE(BEEPER_PIN, HIGH); #endif - kill(lcd_msg, HEATER_PSTR(heater)); + kill(lcd_msg, HEATER_PSTR(heater_id)); } -void Temperature::_temp_error(const heater_ind_t heater, PGM_P const serial_msg, PGM_P const lcd_msg) { +void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_msg, PGM_P const lcd_msg) { static uint8_t killed = 0; @@ -778,9 +778,9 @@ void Temperature::_temp_error(const heater_ind_t heater, PGM_P const serial_msg, SERIAL_ERROR_START(); serialprintPGM(serial_msg); SERIAL_ECHOPGM(STR_STOPPED_HEATER); - if (heater >= 0) - SERIAL_ECHO((int)heater); - else if (TERN0(HAS_HEATED_CHAMBER, heater == H_CHAMBER)) + if (heater_id >= 0) + SERIAL_ECHO((int)heater_id); + else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) SERIAL_ECHOPGM(STR_HEATER_CHAMBER); else SERIAL_ECHOPGM(STR_HEATER_BED); @@ -801,25 +801,25 @@ void Temperature::_temp_error(const heater_ind_t heater, PGM_P const serial_msg, if (ELAPSED(ms, expire_ms)) ++killed; break; case 2: - loud_kill(lcd_msg, heater); + loud_kill(lcd_msg, heater_id); ++killed; break; } #elif defined(BOGUS_TEMPERATURE_GRACE_PERIOD) UNUSED(killed); #else - if (!killed) { killed = 1; loud_kill(lcd_msg, heater); } + if (!killed) { killed = 1; loud_kill(lcd_msg, heater_id); } #endif } -void Temperature::max_temp_error(const heater_ind_t heater) { +void Temperature::max_temp_error(const heater_id_t heater_id) { TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(1)); - _temp_error(heater, PSTR(STR_T_MAXTEMP), GET_TEXT(MSG_ERR_MAXTEMP)); + _temp_error(heater_id, PSTR(STR_T_MAXTEMP), GET_TEXT(MSG_ERR_MAXTEMP)); } -void Temperature::min_temp_error(const heater_ind_t heater) { +void Temperature::min_temp_error(const heater_id_t heater_id) { TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(0)); - _temp_error(heater, PSTR(STR_T_MINTEMP), GET_TEXT(MSG_ERR_MINTEMP)); + _temp_error(heater_id, PSTR(STR_T_MINTEMP), GET_TEXT(MSG_ERR_MINTEMP)); } #if HAS_HOTEND @@ -1041,14 +1041,14 @@ void Temperature::manage_heater() { HOTEND_LOOP() { #if ENABLED(THERMAL_PROTECTION_HOTENDS) if (degHotend(e) > temp_range[e].maxtemp) - _temp_error((heater_ind_t)e, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + _temp_error((heater_id_t)e, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); #endif TERN_(HEATER_IDLE_HANDLER, hotend_idle[e].update(ms)); #if ENABLED(THERMAL_PROTECTION_HOTENDS) // Check for thermal runaway - thermal_runaway_protection(tr_state_machine[e], temp_hotend[e].celsius, temp_hotend[e].target, (heater_ind_t)e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS); + thermal_runaway_protection(tr_state_machine[e], temp_hotend[e].celsius, temp_hotend[e].target, (heater_id_t)e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS); #endif temp_hotend[e].soft_pwm_amount = (temp_hotend[e].celsius > temp_range[e].mintemp || is_preheating(e)) && temp_hotend[e].celsius < temp_range[e].maxtemp ? (int)get_pid_output_hotend(e) >> 1 : 0; @@ -1058,7 +1058,7 @@ void Temperature::manage_heater() { if (watch_hotend[e].next_ms && ELAPSED(ms, watch_hotend[e].next_ms)) { // Time to check this extruder? if (degHotend(e) < watch_hotend[e].target) { // Failed to increase enough? TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(0)); - _temp_error((heater_ind_t)e, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); + _temp_error((heater_id_t)e, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); } else // Start again if the target is still far off start_watching_hotend(e); @@ -1945,7 +1945,7 @@ void Temperature::init() { Temperature::tr_state_machine_t Temperature::tr_state_machine_chamber; // = { TRInactive, 0 }; #endif - void Temperature::thermal_runaway_protection(Temperature::tr_state_machine_t &sm, const float ¤t, const float &target, const heater_ind_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { + void Temperature::thermal_runaway_protection(Temperature::tr_state_machine_t &sm, const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { static float tr_target_temperature[HOTENDS + 1] = { 0.0 }; @@ -2311,12 +2311,12 @@ void Temperature::readings_ready() { const bool heater_on = (temp_hotend[e].target > 0 || TERN0(PIDTEMP, temp_hotend[e].soft_pwm_amount) > 0 ); - if (rawtemp > temp_range[e].raw_max * tdir) max_temp_error((heater_ind_t)e); + if (rawtemp > temp_range[e].raw_max * tdir) max_temp_error((heater_id_t)e); if (heater_on && rawtemp < temp_range[e].raw_min * tdir && !is_preheating(e)) { #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED if (++consecutive_low_temperature_error[e] >= MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED) #endif - min_temp_error((heater_ind_t)e); + min_temp_error((heater_id_t)e); } #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED else @@ -2883,7 +2883,7 @@ void Temperature::tick() { #if ENABLED(SHOW_TEMP_ADC_VALUES) , const float r #endif - , const heater_ind_t e=INDEX_NONE + , const heater_id_t e=INDEX_NONE ) { char k; switch (e) { @@ -2974,10 +2974,10 @@ void Temperature::tick() { #if ENABLED(SHOW_TEMP_ADC_VALUES) , rawHotendTemp(e) #endif - , (heater_ind_t)e + , (heater_id_t)e ); #endif - SERIAL_ECHOPAIR(" @:", getHeaterPower((heater_ind_t)target_extruder)); + SERIAL_ECHOPAIR(" @:", getHeaterPower((heater_id_t)target_extruder)); #if HAS_HEATED_BED SERIAL_ECHOPAIR(" B@:", getHeaterPower(H_BED)); #endif @@ -2988,7 +2988,7 @@ void Temperature::tick() { HOTEND_LOOP() { SERIAL_ECHOPAIR(" @", e); SERIAL_CHAR(':'); - SERIAL_ECHO(getHeaterPower((heater_ind_t)e)); + SERIAL_ECHO(getHeaterPower((heater_id_t)e)); } #endif } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 2148f4cb68..37d1140f5e 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -45,7 +45,7 @@ typedef enum : int8_t { INDEX_NONE = -5, H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED, H_E0, H_E1, H_E2, H_E3, H_E4, H_E5, H_E6, H_E7 -} heater_ind_t; +} heater_id_t; // PID storage typedef struct { float Kp, Ki, Kd; } PID_t; @@ -701,7 +701,7 @@ class Temperature { /** * The software PWM power for a heater */ - static int16_t getHeaterPower(const heater_ind_t heater); + static int16_t getHeaterPower(const heater_id_t heater_id); /** * Switch off all heaters, set all target temperatures to 0 @@ -720,7 +720,7 @@ class Temperature { * Perform auto-tuning for hotend or bed in response to M303 */ #if HAS_PID_HEATING - static void PID_autotune(const float &target, const heater_ind_t hotend, const int8_t ncycles, const bool set_result=false); + static void PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); #if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) static bool adaptive_fan_slowing; @@ -811,9 +811,9 @@ class Temperature { TERN_(HAS_HEATED_CHAMBER, static float get_pid_output_chamber()); - static void _temp_error(const heater_ind_t e, PGM_P const serial_msg, PGM_P const lcd_msg); - static void min_temp_error(const heater_ind_t e); - static void max_temp_error(const heater_ind_t e); + static void _temp_error(const heater_id_t e, PGM_P const serial_msg, PGM_P const lcd_msg); + static void min_temp_error(const heater_id_t e); + static void max_temp_error(const heater_id_t e); #define HAS_THERMAL_PROTECTION (EITHER(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER) || HAS_THERMALLY_PROTECTED_BED) @@ -830,7 +830,7 @@ class Temperature { TERN_(HAS_THERMALLY_PROTECTED_BED, static tr_state_machine_t tr_state_machine_bed); TERN_(THERMAL_PROTECTION_CHAMBER, static tr_state_machine_t tr_state_machine_chamber); - static void thermal_runaway_protection(tr_state_machine_t &state, const float ¤t, const float &target, const heater_ind_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); + static void thermal_runaway_protection(tr_state_machine_t &state, const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); #endif // HAS_THERMAL_PROTECTION }; From 4fdfdaf2e6ee22d154e3e052ebe412437b34ca86 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 14 Sep 2020 16:58:39 +1200 Subject: [PATCH 0232/1370] Improve temperature runaway, idle timeout (#19339) Co-authored-by: Scott Lahteine --- Marlin/src/feature/pause.cpp | 8 +- Marlin/src/inc/Conditionals_adv.h | 9 ++ Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 28 +---- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 4 +- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 6 +- Marlin/src/lcd/language/language_cz.h | 4 - Marlin/src/lcd/language/language_da.h | 2 - Marlin/src/lcd/language/language_de.h | 4 - Marlin/src/lcd/language/language_el.h | 2 - Marlin/src/lcd/language/language_el_gr.h | 2 - Marlin/src/lcd/language/language_en.h | 4 - Marlin/src/lcd/language/language_es.h | 4 - Marlin/src/lcd/language/language_eu.h | 2 - Marlin/src/lcd/language/language_gl.h | 4 - Marlin/src/lcd/language/language_hu.h | 4 - Marlin/src/lcd/language/language_it.h | 4 - Marlin/src/lcd/language/language_jp_kana.h | 2 - Marlin/src/lcd/language/language_nl.h | 2 - Marlin/src/lcd/language/language_pl.h | 4 - Marlin/src/lcd/language/language_pt.h | 2 - Marlin/src/lcd/language/language_pt_br.h | 4 - Marlin/src/lcd/language/language_ro.h | 4 - Marlin/src/lcd/language/language_ru.h | 4 - Marlin/src/lcd/language/language_sk.h | 4 - Marlin/src/lcd/language/language_tr.h | 4 - Marlin/src/lcd/language/language_uk.h | 4 - Marlin/src/lcd/language/language_vi.h | 2 - Marlin/src/lcd/language/language_zh_CN.h | 4 - Marlin/src/lcd/language/language_zh_TW.h | 4 - Marlin/src/lcd/menu/menu.cpp | 4 - Marlin/src/module/temperature.cpp | 125 ++++++++++---------- Marlin/src/module/temperature.h | 88 ++++++++++---- 33 files changed, 153 insertions(+), 201 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index efc6510756..f8a7d83260 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -484,7 +484,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep // Start the heater idle timers const millis_t nozzle_timeout = SEC_TO_MS(PAUSE_PARK_NOZZLE_TIMEOUT); - HOTEND_LOOP() thermalManager.hotend_idle[e].start(nozzle_timeout); + HOTEND_LOOP() thermalManager.heater_idle[e].start(nozzle_timeout); #if ENABLED(DUAL_X_CARRIAGE) const int8_t saved_ext = active_extruder; @@ -503,7 +503,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep // If the nozzle has timed out... if (!nozzle_timed_out) - HOTEND_LOOP() nozzle_timed_out |= thermalManager.hotend_idle[e].timed_out; + HOTEND_LOOP() nozzle_timed_out |= thermalManager.heater_idle[e].timed_out; // Wait for the user to press the button to re-heat the nozzle, then // re-heat the nozzle, re-show the continue prompt, restart idle timers, start over @@ -533,7 +533,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep // Start the heater idle timers const millis_t nozzle_timeout = SEC_TO_MS(PAUSE_PARK_NOZZLE_TIMEOUT); - HOTEND_LOOP() thermalManager.hotend_idle[e].start(nozzle_timeout); + HOTEND_LOOP() thermalManager.heater_idle[e].start(nozzle_timeout); TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Reheat Done"), CONTINUE_STR)); TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Reheat finished."))); wait_for_user = true; @@ -588,7 +588,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Re-enable the heaters if they timed out bool nozzle_timed_out = false; HOTEND_LOOP() { - nozzle_timed_out |= thermalManager.hotend_idle[e].timed_out; + nozzle_timed_out |= thermalManager.heater_idle[e].timed_out; thermalManager.reset_hotend_idle_timer(e); } diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 35542f9412..9742967a09 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -56,6 +56,15 @@ #undef SHOW_TEMP_ADC_VALUES #endif +#if TEMP_SENSOR_BED == 0 + #undef THERMAL_PROTECTION_BED + #undef THERMAL_PROTECTION_BED_PERIOD +#endif + +#if TEMP_SENSOR_CHAMBER == 0 + #undef THERMAL_PROTECTION_CHAMBER +#endif + #if ENABLED(MIXING_EXTRUDER) && (ENABLED(RETRACT_SYNC_MIXING) || BOTH(FILAMENT_LOAD_UNLOAD_GCODES, FILAMENT_UNLOAD_ALL_EXTRUDERS)) #define HAS_MIXER_SYNC_CHANNEL 1 #endif diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 81ba4653a1..0a1177d63e 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -521,7 +521,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { #if HAS_HEATED_BED - const bool isBed = heater_id < 0; + const bool isBed = TERN(HAS_HEATED_CHAMBER, heater_id == H_BED, heater_id < 0); const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); #else @@ -536,14 +536,7 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char pr #if !HEATER_IDLE_HANDLER UNUSED(blink); #else - const bool is_idle = ( - #if HAS_HEATED_BED - isBed ? thermalManager.bed_idle.timed_out : - #endif - thermalManager.hotend_idle[heater_id].timed_out - ); - - if (!blink && is_idle) { + if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) { lcd_put_wchar(' '); if (t2 >= 10) lcd_put_wchar(' '); if (t2 >= 100) lcd_put_wchar(' '); @@ -560,27 +553,14 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char pr } FORCE_INLINE void _draw_bed_status(const bool blink) { - _draw_heater_status(H_BED, ( - #if HAS_LEVELING - planner.leveling_active && blink ? '_' : - #endif - LCD_STR_BEDTEMP[0] - ), - blink - ); + _draw_heater_status(H_BED, TERN0(HAS_LEVELING, blink && planner.leveling_active) ? '_' : LCD_STR_BEDTEMP[0], blink); } #if HAS_PRINT_PROGRESS FORCE_INLINE void _draw_print_progress() { const uint8_t progress = ui.get_progress_percent(); - lcd_put_u8str_P(PSTR( - #if ENABLED(SDSUPPORT) - "SD" - #elif ENABLED(LCD_SET_PROGRESS_MANUALLY) - "P:" - #endif - )); + lcd_put_u8str_P(PSTR(TERN(SDSUPPORT, "SD", "P:"))); if (progress) lcd_put_u8str(ui8tostr3rj(progress)); else diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index f668e453cc..4b51c2949b 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -254,7 +254,7 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons if (PAGE_UNDER(7)) { #if HEATER_IDLE_HANDLER - const bool dodraw = (blink || !thermalManager.hotend_idle[heater_id].timed_out); + const bool dodraw = (blink || !thermalManager.heater_idle[heater_id].timed_out); #else constexpr bool dodraw = true; #endif @@ -327,7 +327,7 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons if (PAGE_UNDER(7)) { #if HEATER_IDLE_HANDLER - const bool dodraw = (blink || !thermalManager.bed_idle.timed_out); + const bool dodraw = (blink || !thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out); #else constexpr bool dodraw = true; #endif diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index bf0edbb8de..b4f32d3343 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -308,7 +308,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop lcd_put_u8str(i16tostr3rj(thermalManager.degHotend(extruder))); lcd_put_wchar('/'); - if (get_blink() || !thermalManager.hotend_idle[extruder].timed_out) + if (get_blink() || !thermalManager.heater_idle[extruder].timed_out) lcd_put_u8str(i16tostr3rj(thermalManager.degTargetHotend(extruder))); } diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 53b7dc6279..4d65429bf1 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -223,7 +223,7 @@ namespace ExtUI { bool isHeaterIdle(const extruder_t extruder) { #if HAS_HOTEND && HEATER_IDLE_HANDLER - return thermalManager.hotend_idle[extruder - E0].timed_out; + return thermalManager.heater_idle[extruder - E0].timed_out; #else UNUSED(extruder); return false; @@ -233,10 +233,10 @@ namespace ExtUI { bool isHeaterIdle(const heater_t heater) { #if HEATER_IDLE_HANDLER switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return thermalManager.bed_idle.timed_out); + TERN_(HAS_HEATED_BED, case BED: return thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out); TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return false); // Chamber has no idle timer default: - return TERN0(HAS_HOTEND, thermalManager.hotend_idle[heater - H0].timed_out); + return TERN0(HAS_HOTEND, thermalManager.heater_idle[heater - H0].timed_out); } #else UNUSED(heater); diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index e7d2611bc4..b11a3686cb 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -410,10 +410,6 @@ namespace Language_cz { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPL. ÚNIK KOMORA"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("VYSOKà TEPLOTA"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("NÃZKA TEPLOTA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("VYS. TEPL. PODL."); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("NÃZ. TEPL. PODL."); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP KOMORA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP KOMORA"); PROGMEM Language_Str MSG_HALTED = _UxGT("TISK. ZASTAVENA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("ProveÄte reset"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index c6f5647d5a..da282be0b4 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -142,8 +142,6 @@ namespace Language_da { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Temp løber løbsk"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Fejl: Maks temp"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Fejl: Min temp"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Fejl: Maks Plade temp"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Fejl: Min Plade temp"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER STOPPET"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reset Venligst"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // Kun et bogstav diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index e353229daa..875444c0e7 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -452,10 +452,6 @@ namespace Language_de { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("GEH.") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); PROGMEM Language_Str MSG_ERR_MAXTEMP = " " LCD_STR_THERMOMETER _UxGT(" ÃœBERSCHRITTEN"); PROGMEM Language_Str MSG_ERR_MINTEMP = " " LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" ÃœBERSCHRITTEN"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err:Gehäuse max Temp"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err:Gehäuse min Temp"); PROGMEM Language_Str MSG_HALTED = _UxGT("DRUCKER GESTOPPT"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Bitte neustarten"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("t"); // One character only diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index cee8dd0e55..8fe8887653 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -180,8 +180,6 @@ namespace Language_el { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΚΡΑΣΙΑΣ"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ΠΕΡΙΤΗ ΘΕΡΜΟΚΡΑΣΙΑ"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("ΜΗ ΕΠΑΡΚΗΣ ΘΕΡΜΟΚΡΑΣΙΑΣ"); //SHORTEN - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("ΜΕΓΙΣΤΗ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΠ. ΕΚΤΥΠΩΣΗΣ"); //SHORTEN - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΠ. ΕΚΤΥΠΩΣΗΣ"); //SHORTEN PROGMEM Language_Str MSG_HALTED = _UxGT("H εκτÏπωση διακόπηκε"); PROGMEM Language_Str MSG_HEATING = _UxGT("ΘεÏμαίνεται…"); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("ΘέÏμανση ΕΠ. ΕκτÏπωσης"); //SHORTEN diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index d7bead9ea6..ad170a3487 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -182,8 +182,6 @@ namespace Language_el_gr { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙÎΗΣ"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙÎΗΣ"); PROGMEM Language_Str MSG_HEATING = _UxGT("ΘεÏμαίνεται…"); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("ΘέÏμανση κλίνης…"); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Βαθμονόμηση Delta"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index f5ba320881..fc9e065abe 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -457,10 +457,6 @@ namespace Language_en { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: MAXTEMP BED"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: MINTEMP BED"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP CHAMBER"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP CHAMBER"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Please Reset"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 11cb8cc2a9..15fa35ac75 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -421,10 +421,6 @@ namespace Language_es { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CAMARA"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err:TEMP. MÃX"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err:TEMP. MIN"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err:TEMP. MÃX CAMA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err:TEMP. MIN CAMA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err:TEMP. MÃX CÃMARA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err:TEMP. MIN CÃMARA"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA DETENIDA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Por favor, reinicie"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index d04b3037ab..bee571bbde 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -244,8 +244,6 @@ namespace Language_eu { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TENP. KONTROL EZA"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: Tenp Maximoa"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Tenp Minimoa"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: Ohe Tenp Max"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: Ohe Tenp Min"); PROGMEM Language_Str MSG_HALTED = _UxGT("INPRIMA. GELDIRIK"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Berrabia. Mesedez"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index d47ec0b67d..53b0803518 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -443,10 +443,6 @@ namespace Language_gl { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CÃMARA"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Erro:TEMP MÃX"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Erro:TEMP MÃN"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Erro:TEMP MÃX CAMA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Erro:TEMP MÃN CAMA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Erro:TEMP MÃX CÃMARA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Erro:TEMP MÃN CÃMARA"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA DETIDA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Debe reiniciar!"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 962fb17511..76aff51d9c 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -445,10 +445,6 @@ namespace Language_hu { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÃœTÉS KIMARADÃS"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX Höfok"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN Höfok"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Hiba: MAX ÃGY HÖFOK"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Hiba: MIN ÃGY HÖFOK"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Hiba: MAX KAMRA HÖFOK"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Hiba: MIN KAMRA HÖFOK"); PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEFAGYOTT"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Indítsd újra!"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // Csak egy karakter diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 27087e5a55..e22e58708f 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -457,10 +457,6 @@ namespace Language_it { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("T.CAMERA FUORI CTRL"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MASSIMA"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: TEMP MAX PIATTO"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: TEMP MIN PIATTO"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: TEMP MAX CAMERA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: TEMP MIN CAMERA"); PROGMEM Language_Str MSG_HALTED = _UxGT("STAMPANTE FERMATA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Riavviare prego"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("g"); // Un solo carattere diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index 5f679dd49d..df6ad9b5d9 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -184,8 +184,6 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ãƒãƒ„ボウソウ"); // "THERMAL RUNAWAY" PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("エラー:サイコウオンãƒãƒ§ã‚¦ã‚«"); // "Err: MAXTEMP" PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("エラー:サイテイオンミマン"); // "Err: MINTEMP" - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("エラー:ベッド サイコウオンãƒãƒ§ã‚¦ã‚«"); // "Err: MAXTEMP BED" - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("エラー:ベッド サイテイオンミマン"); // "Err: MINTEMP BED" PROGMEM Language_Str MSG_HALTED = _UxGT("プリンターãƒãƒ†ã‚¤ã‚·ã‚·ãƒžã‚·ã‚¿"); // "PRINTER HALTED" PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("リセットシテクダサイ"); // "Please reset" PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index c8c79e472a..c1a1a0605b 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -164,8 +164,6 @@ namespace Language_nl { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Therm. wegloop"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: Max. temp"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Min. temp"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: Max.tmp bed"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: Min.tmp bed"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER GESTOPT"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reset A.U.B."); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only. Keep English standard diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 7c3f9c1bb1..f6a9e12c8e 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -391,10 +391,6 @@ namespace Language_pl { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ZANIK TEMP.KOMORY"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("BÅ‚Ä…d: MAXTEMP"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("BÅ‚Ä…d: MINTEMP"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("BÅ‚Ä…d: MAXTEMP STÓÅ"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("BÅ‚Ä…d: MINTEMP STÓÅ"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("BÅ‚Ä…d: MAXTEMP KOMORA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("BÅ‚Ä…d: MINTEMP KOMORA"); PROGMEM Language_Str MSG_HALTED = _UxGT("Drukarka zatrzym."); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("ProszÄ™ zresetować"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 1180649c98..8bd94d06e1 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -150,8 +150,6 @@ namespace Language_pt { PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: T Máxima"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: T Mínima"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: T Base Máxima"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: T Base Mínima"); PROGMEM Language_Str MSG_HEATING = _UxGT("Aquecendo..."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Aquecendo base..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibração Delta"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index b9fd91fa29..eb1e2f9bf3 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -357,10 +357,6 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ESCAPE TÉRMICO CAMARA"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Erro:Temp Máxima"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Erro:Temp Mínima"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Erro:Temp Mesa Máx"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Erro:Temp Mesa Mín"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Erro:Temp Câmara Máx"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Erro:Temp Câmara Min"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESSORA PAROU"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Favor resetar"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 0d5b1568a7..d71471a09d 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -448,10 +448,6 @@ namespace Language_ro { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: MAXTEMP BED"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: MINTEMP BED"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP CHAMBER"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP CHAMBER"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Please Reset"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 0e2c63ca13..b8c146e515 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -536,10 +536,6 @@ namespace Language_ru { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("УТЕЧКРТЕПЛРКÐМЕРЫ"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Ошибка: Т макÑ."); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Ошибка: Т мин."); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Ошибка: Т Ñтола макÑ"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Ошибка: Т Ñтола мин."); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Ошибка:Т камеры макÑ"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Ошибка:Т камеры мин."); PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИÐТЕР ОСТÐÐОВЛЕÐ"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Сделайте ÑброÑ"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index ace2ba6da4..e936110d07 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -441,10 +441,6 @@ namespace Language_sk { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPLOTNà SKOK KOMO."); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Chyba: MAXTEMP"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Chyba: MINTEMP"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Chyba: MAXTEMP PODL."); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Chyba: MINTEMP PODL."); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Chyba: MAXTEMP KOMO."); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Chyba: MINTEMP KOMO."); PROGMEM Language_Str MSG_HALTED = _UxGT("TLAÄŒIAREŇ ZASTAVENÃ"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("ReÅ¡tartuje ju"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index ed11ec87c5..95e4fb2a8b 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -420,10 +420,6 @@ namespace Language_tr { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ODA TERMAL PROBLEM"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hata: MAX.SICAKLIK"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hata: MIN.SICAKLIK"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Hata: MAX.SIC. TABLA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Hata: MIN.SIC. TABLA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Hata: MAX.SIC ODA"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Hata: MIN.SIC ODA"); PROGMEM Language_Str MSG_HALTED = _UxGT("YAZICI DURDURULDU"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Lütfen Resetleyin"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("G"); // One character only diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 99d70cc252..9041decbb2 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -530,10 +530,6 @@ namespace Language_uk { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ВИТІК ТЕПЛРКÐМЕРИ"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ПЕРЕГРІВ"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE; - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("ПЕРЕГРІВ СТОЛУ"); - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE _UxGT(" СТОЛУ"); - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("ПЕРЕГРІВ КÐМЕРИ"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE _UxGT(" КÐМЕРИ"); PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИÐТЕР ЗУПИÐЕÐО"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Перезавантажте"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 5074901883..afd87d3798 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -335,8 +335,6 @@ namespace Language_vi { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("Vấn Ä‘á» nhiệt bàn"); // BED THERMAL RUNAWAY PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Äiều sai: nhiệt Ä‘á»™ tối Ä‘a"); // Err: MAXTEMP PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Äiều sai: nhiệt Ä‘á»™ tối thiểu"); // Err: MINTEMP - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Äiều sai: nhiệt Ä‘á»™ bàn tối Ä‘a"); // Err: MAXTEMP BED - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Äiều sai: nhiệt Ä‘á»™ bàn tối thiểu"); // Err: MINTEMP BED PROGMEM Language_Str MSG_HALTED = _UxGT("MÃY IN Äà DỪNG LAÌ£I"); // PRINTER HALTED PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Xin bặt lại"); // Please reset PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 2a98d58e81..d30ee789dd 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -447,10 +447,6 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("机箱热é‡å¤±æŽ§"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("错误:最高温度"); //"Err: MAXTEMP" PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("错误:最低温度"); //"Err: MINTEMP" - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("错误:最高热床温度"); //"Err: MAXTEMP BED" - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("错误:最低热床温度"); //"Err: MINTEMP BED" - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("错误:最高机箱温度"); - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("错误:最低机箱温度"); PROGMEM Language_Str MSG_HALTED = _UxGT("打å°åœæœº"); //"PRINTER HALTED" PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("请é‡ç½®"); //"Please reset" PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("天"); //"d" // One character only diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 532886d451..6764af6d73 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -388,10 +388,6 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("機箱溫度失控"); //"CHAMBER T. RUNAWAY" PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("錯誤:最高溫度"); //"Err: MAXTEMP" PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("錯誤:最低溫度"); //"Err: MINTEMP" - PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("錯誤:最高熱床溫度"); //"Err: MAXTEMP BED" - PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("錯誤:最低熱床溫度"); //"Err: MINTEMP BED" - PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("錯誤:最高機箱溫度"); //"Err: MAXTEMP CHAMBER" - PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("錯誤:最低機箱溫度"); //"Err: MINTEMP CHAMBER" PROGMEM Language_Str MSG_HALTED = _UxGT("å°è¡¨æ©Ÿåœæ©Ÿ"); //"PRINTER HALTED" PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("è«‹é‡ç½®"); //"Please reset" PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("天"); //"d" // One character only diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index e6739a135c..64923547e8 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -34,10 +34,6 @@ #include "../../libs/buzzer.h" #endif -#if WATCH_HOTENDS || WATCH_BED - #include "../../module/temperature.h" -#endif - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) #include "../../module/probe.h" #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 06864c6b97..e0fa6fa98f 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -252,7 +252,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, hotend_watch_t Temperature::watch_hotend[HOTENDS]; // = { { 0 } } #endif #if HEATER_IDLE_HANDLER - hotend_idle_t Temperature::hotend_idle[HOTENDS]; // = { { 0 } } + Temperature::heater_idle_t Temperature::heater_idle[NR_HEATER_IDLE]; // = { { 0 } } #endif #if HAS_HEATED_BED @@ -266,7 +266,6 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } TERN(PIDTEMPBED,, millis_t Temperature::next_bed_check_ms); - TERN_(HEATER_IDLE_HANDLER, hotend_idle_t Temperature::bed_idle); // = { 0 } #endif // HAS_HEATED_BED #if HAS_TEMP_CHAMBER @@ -841,7 +840,7 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { if (temp_hotend[ee].target == 0 || pid_error < -(PID_FUNCTIONAL_RANGE) - || TERN0(HEATER_IDLE_HANDLER, hotend_idle[ee].timed_out) + || TERN0(HEATER_IDLE_HANDLER, heater_idle[ee].timed_out) ) { pid_output = 0; pid_reset[ee] = true; @@ -926,7 +925,7 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { #else // No PID enabled - const bool is_idling = TERN0(HEATER_IDLE_HANDLER, hotend_idle[ee].timed_out); + const bool is_idling = TERN0(HEATER_IDLE_HANDLER, heater_idle[ee].timed_out); const float pid_output = (!is_idling && temp_hotend[ee].celsius < temp_hotend[ee].target) ? BANG_MAX : 0; #endif @@ -1040,15 +1039,14 @@ void Temperature::manage_heater() { HOTEND_LOOP() { #if ENABLED(THERMAL_PROTECTION_HOTENDS) - if (degHotend(e) > temp_range[e].maxtemp) - _temp_error((heater_id_t)e, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + if (degHotend(e) > temp_range[e].maxtemp) max_temp_error((heater_id_t)e); #endif - TERN_(HEATER_IDLE_HANDLER, hotend_idle[e].update(ms)); + TERN_(HEATER_IDLE_HANDLER, heater_idle[e].update(ms)); #if ENABLED(THERMAL_PROTECTION_HOTENDS) // Check for thermal runaway - thermal_runaway_protection(tr_state_machine[e], temp_hotend[e].celsius, temp_hotend[e].target, (heater_id_t)e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS); + tr_state_machine[e].run(temp_hotend[e].celsius, temp_hotend[e].target, (heater_id_t)e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS); #endif temp_hotend[e].soft_pwm_amount = (temp_hotend[e].celsius > temp_range[e].mintemp || is_preheating(e)) && temp_hotend[e].celsius < temp_range[e].maxtemp ? (int)get_pid_output_hotend(e) >> 1 : 0; @@ -1093,8 +1091,7 @@ void Temperature::manage_heater() { #if HAS_HEATED_BED #if ENABLED(THERMAL_PROTECTION_BED) - if (degBed() > BED_MAXTEMP) - _temp_error(H_BED, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + if (degBed() > BED_MAXTEMP) max_temp_error(H_BED); #endif #if WATCH_BED @@ -1127,12 +1124,14 @@ void Temperature::manage_heater() { TERN_(PAUSE_CHANGE_REQD, last_pause_state = paused); #endif - TERN_(HEATER_IDLE_HANDLER, bed_idle.update(ms)); + TERN_(HEATER_IDLE_HANDLER, heater_idle[IDLE_INDEX_BED].update(ms)); - TERN_(HAS_THERMALLY_PROTECTED_BED, thermal_runaway_protection(tr_state_machine_bed, temp_bed.celsius, temp_bed.target, H_BED, THERMAL_PROTECTION_BED_PERIOD, THERMAL_PROTECTION_BED_HYSTERESIS)); + #if HAS_THERMALLY_PROTECTED_BED + tr_state_machine[RUNAWAY_IND_BED].run(temp_bed.celsius, temp_bed.target, H_BED, THERMAL_PROTECTION_BED_PERIOD, THERMAL_PROTECTION_BED_HYSTERESIS); + #endif #if HEATER_IDLE_HANDLER - if (bed_idle.timed_out) { + if (heater_idle[IDLE_INDEX_BED].timed_out) { temp_bed.soft_pwm_amount = 0; #if DISABLED(PIDTEMPBED) WRITE_HEATER_BED(LOW); @@ -1173,8 +1172,7 @@ void Temperature::manage_heater() { #endif #if ENABLED(THERMAL_PROTECTION_CHAMBER) - if (degChamber() > CHAMBER_MAXTEMP) - _temp_error(H_CHAMBER, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + if (degChamber() > CHAMBER_MAXTEMP) max_temp_error(H_CHAMBER); #endif #if WATCH_CHAMBER @@ -1205,7 +1203,9 @@ void Temperature::manage_heater() { WRITE_HEATER_CHAMBER(LOW); } - TERN_(THERMAL_PROTECTION_CHAMBER, thermal_runaway_protection(tr_state_machine_chamber, temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS)); + #if ENABLED(THERMAL_PROTECTION_CHAMBER) + tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); + #endif } // TODO: Implement true PID pwm @@ -1935,61 +1935,66 @@ void Temperature::init() { #if HAS_THERMAL_PROTECTION - #if ENABLED(THERMAL_PROTECTION_HOTENDS) - Temperature::tr_state_machine_t Temperature::tr_state_machine[HOTENDS]; // = { { TRInactive, 0 } }; - #endif - #if HAS_THERMALLY_PROTECTED_BED - Temperature::tr_state_machine_t Temperature::tr_state_machine_bed; // = { TRInactive, 0 }; - #endif - #if ENABLED(THERMAL_PROTECTION_CHAMBER) - Temperature::tr_state_machine_t Temperature::tr_state_machine_chamber; // = { TRInactive, 0 }; - #endif + Temperature::tr_state_machine_t Temperature::tr_state_machine[NR_HEATER_RUNAWAY]; // = { { TRInactive, 0 } }; - void Temperature::thermal_runaway_protection(Temperature::tr_state_machine_t &sm, const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { + /** + * @brief Thermal Runaway state machine for a single heater + * @param current current measured temperature + * @param target current target temperature + * @param heater_id extruder index + * @param period_seconds missed temperature allowed time + * @param hysteresis_degc allowed distance from target + * + * TODO: Embed the last 3 parameters during init, if not less optimal + */ + void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { - static float tr_target_temperature[HOTENDS + 1] = { 0.0 }; + #if HEATER_IDLE_HANDLER + // Convert the given heater_id_t to an idle array index + const IdleIndex idle_index = idle_index_for_id(heater_id); + #endif /** SERIAL_ECHO_START(); SERIAL_ECHOPGM("Thermal Runaway Running. Heater ID: "); - if (heater_id == H_CHAMBER) SERIAL_ECHOPGM("chamber"); - if (heater_id < 0) SERIAL_ECHOPGM("bed"); else SERIAL_ECHO(heater_id); - SERIAL_ECHOPAIR(" ; State:", sm.state, " ; Timer:", sm.timer, " ; Temperature:", current, " ; Target Temp:", target); - if (heater_id >= 0) - SERIAL_ECHOPAIR(" ; Idle Timeout:", hotend_idle[heater_id].timed_out); - else - SERIAL_ECHOPAIR(" ; Idle Timeout:", bed_idle.timed_out); - SERIAL_EOL(); + switch (heater_id) { + case H_BED: SERIAL_ECHOPGM("bed"); break; + case H_CHAMBER: SERIAL_ECHOPGM("chamber"); break; + default: SERIAL_ECHO(heater_id); + } + SERIAL_ECHOLNPAIR( + " ; sizeof(running_temp):", sizeof(running_temp), + " ; State:", state, " ; Timer:", timer, " ; Temperature:", current, " ; Target Temp:", target + #if HEATER_IDLE_HANDLER + , " ; Idle Timeout:", heater_idle[idle_index].timed_out + #endif + ); //*/ - const int heater_index = heater_id >= 0 ? heater_id : HOTENDS; - #if HEATER_IDLE_HANDLER // If the heater idle timeout expires, restart - if ((heater_id >= 0 && hotend_idle[heater_id].timed_out) - || TERN0(HAS_HEATED_BED, (heater_id < 0 && bed_idle.timed_out)) - ) { - sm.state = TRInactive; - tr_target_temperature[heater_index] = 0; + if (heater_idle[idle_index].timed_out) { + state = TRInactive; + running_temp = 0; } else #endif { // If the target temperature changes, restart - if (tr_target_temperature[heater_index] != target) { - tr_target_temperature[heater_index] = target; - sm.state = target > 0 ? TRFirstHeating : TRInactive; + if (running_temp != target) { + running_temp = target; + state = target > 0 ? TRFirstHeating : TRInactive; } } - switch (sm.state) { + switch (state) { // Inactive state waits for a target temperature to be set case TRInactive: break; // When first heating, wait for the temperature to be reached then go to Stable state case TRFirstHeating: - if (current < tr_target_temperature[heater_index]) break; - sm.state = TRStable; + if (current < running_temp) break; + state = TRStable; // While the temperature is stable watch for a bad temperature case TRStable: @@ -1997,25 +2002,25 @@ void Temperature::init() { #if ENABLED(ADAPTIVE_FAN_SLOWING) if (adaptive_fan_slowing && heater_id >= 0) { const int fan_index = _MIN(heater_id, FAN_COUNT - 1); - if (fan_speed[fan_index] == 0 || current >= tr_target_temperature[heater_id] - (hysteresis_degc * 0.25f)) + if (fan_speed[fan_index] == 0 || current >= running_temp - (hysteresis_degc * 0.25f)) fan_speed_scaler[fan_index] = 128; - else if (current >= tr_target_temperature[heater_id] - (hysteresis_degc * 0.3335f)) + else if (current >= running_temp - (hysteresis_degc * 0.3335f)) fan_speed_scaler[fan_index] = 96; - else if (current >= tr_target_temperature[heater_id] - (hysteresis_degc * 0.5f)) + else if (current >= running_temp - (hysteresis_degc * 0.5f)) fan_speed_scaler[fan_index] = 64; - else if (current >= tr_target_temperature[heater_id] - (hysteresis_degc * 0.8f)) + else if (current >= running_temp - (hysteresis_degc * 0.8f)) fan_speed_scaler[fan_index] = 32; else fan_speed_scaler[fan_index] = 0; } #endif - if (current >= tr_target_temperature[heater_index] - hysteresis_degc) { - sm.timer = millis() + SEC_TO_MS(period_seconds); + if (current >= running_temp - hysteresis_degc) { + timer = millis() + SEC_TO_MS(period_seconds); break; } - else if (PENDING(millis(), sm.timer)) break; - sm.state = TRRunaway; + else if (PENDING(millis(), timer)) break; + state = TRRunaway; case TRRunaway: TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(0)); @@ -2086,8 +2091,8 @@ void Temperature::disable_all_heaters() { if (p != paused) { paused = p; if (p) { - HOTEND_LOOP() hotend_idle[e].expire(); // Timeout immediately - TERN_(HAS_HEATED_BED, bed_idle.expire()); // Timeout immediately + HOTEND_LOOP() heater_idle[e].expire(); // Timeout immediately + TERN_(HAS_HEATED_BED, heater_idle[IDLE_INDEX_BED].expire()); // Timeout immediately } else { HOTEND_LOOP() reset_hotend_idle_timer(e); @@ -2333,9 +2338,7 @@ void Temperature::readings_ready() { #else #define BEDCMP(A,B) ((A)>(B)) #endif - const bool bed_on = temp_bed.target > 0 - || TERN0(PIDTEMPBED, temp_bed.soft_pwm_amount) > 0 - ; + const bool bed_on = (temp_bed.target > 0) || TERN0(PIDTEMPBED, temp_bed.soft_pwm_amount > 0); if (BEDCMP(temp_bed.raw, maxtemp_raw_BED)) max_temp_error(H_BED); if (bed_on && BEDCMP(mintemp_raw_BED, temp_bed.raw)) min_temp_error(H_BED); #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 37d1140f5e..57b0fecbcc 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -40,7 +40,7 @@ #define HOTEND_INDEX TERN(HAS_MULTI_HOTEND, e, 0) #define E_NAME TERN_(HAS_MULTI_HOTEND, e) -// Identifiers for other heaters +// Heater identifiers. Positive values are hotends. Negative values are other heaters. typedef enum : int8_t { INDEX_NONE = -5, H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED, @@ -211,16 +211,6 @@ struct PIDHeaterInfo : public HeaterInfo { typedef temp_info_t chamber_info_t; #endif -// Heater idle handling -typedef struct { - millis_t timeout_ms; - bool timed_out; - inline void update(const millis_t &ms) { if (!timed_out && timeout_ms && ELAPSED(ms, timeout_ms)) timed_out = true; } - inline void start(const millis_t &ms) { timeout_ms = millis() + ms; timed_out = false; } - inline void reset() { timeout_ms = 0; timed_out = false; } - inline void expire() { start(0); } -} hotend_idle_t; - // Heater watch handling template struct HeaterWatch { @@ -346,9 +336,38 @@ class Temperature { FORCE_INLINE static bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } #if HEATER_IDLE_HANDLER - static hotend_idle_t hotend_idle[HOTENDS]; - TERN_(HAS_HEATED_BED, static hotend_idle_t bed_idle); - TERN_(HAS_HEATED_CHAMBER, static hotend_idle_t chamber_idle); + + // Heater idle handling. Marlin creates one per hotend and one for the heated bed. + typedef struct { + millis_t timeout_ms; + bool timed_out; + inline void update(const millis_t &ms) { if (!timed_out && timeout_ms && ELAPSED(ms, timeout_ms)) timed_out = true; } + inline void start(const millis_t &ms) { timeout_ms = millis() + ms; timed_out = false; } + inline void reset() { timeout_ms = 0; timed_out = false; } + inline void expire() { start(0); } + } heater_idle_t; + + // Indices and size for the heater_idle array + #define _ENUM_FOR_E(N) IDLE_INDEX_E##N, + enum IdleIndex : uint8_t { + REPEAT(HOTENDS, _ENUM_FOR_E) + #if ENABLED(HAS_HEATED_BED) + IDLE_INDEX_BED, + #endif + NR_HEATER_IDLE + }; + #undef _ENUM_FOR_E + + // Convert the given heater_id_t to idle array index + static inline IdleIndex idle_index_for_id(const int8_t heater_id) { + #if HAS_HEATED_BED + if (heater_id == H_BED) return IDLE_INDEX_BED; + #endif + return (IdleIndex)_MAX(heater_id, 0); + } + + static heater_idle_t heater_idle[NR_HEATER_IDLE]; + #endif private: @@ -747,13 +766,13 @@ class Temperature { #if HEATER_IDLE_HANDLER static void reset_hotend_idle_timer(const uint8_t E_NAME) { - hotend_idle[HOTEND_INDEX].reset(); + heater_idle[HOTEND_INDEX].reset(); start_watching_hotend(HOTEND_INDEX); } #if HAS_HEATED_BED static void reset_bed_idle_timer() { - bed_idle.reset(); + heater_idle[IDLE_INDEX_BED].reset(); start_watching_bed(); } #endif @@ -815,22 +834,47 @@ class Temperature { static void min_temp_error(const heater_id_t e); static void max_temp_error(const heater_id_t e); - #define HAS_THERMAL_PROTECTION (EITHER(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER) || HAS_THERMALLY_PROTECTED_BED) + #define HAS_THERMAL_PROTECTION ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER, HAS_THERMALLY_PROTECTED_BED) #if HAS_THERMAL_PROTECTION + // Indices and size for the tr_state_machine array. One for each protected heater. + #define _ENUM_FOR_E(N) RUNAWAY_IND_E##N, + enum RunawayIndex : uint8_t { + #if ENABLED(THERMAL_PROTECTION_HOTENDS) + REPEAT(HOTENDS, _ENUM_FOR_E) + #endif + #if ENABLED(HAS_THERMALLY_PROTECTED_BED) + RUNAWAY_IND_BED, + #endif + #if ENABLED(THERMAL_PROTECTION_CHAMBER) + RUNAWAY_IND_CHAMBER, + #endif + NR_HEATER_RUNAWAY + }; + #undef _ENUM_FOR_E + + // Convert the given heater_id_t to runaway state array index + static inline RunawayIndex runaway_index_for_id(const int8_t heater_id) { + #if HAS_THERMALLY_PROTECTED_CHAMBER + if (heater_id == H_CHAMBER) return RUNAWAY_IND_CHAMBER; + #endif + #if HAS_THERMALLY_PROTECTED_BED + if (heater_id == H_BED) return RUNAWAY_IND_BED; + #endif + return (RunawayIndex)_MAX(heater_id, 0); + } + enum TRState : char { TRInactive, TRFirstHeating, TRStable, TRRunaway }; typedef struct { millis_t timer = 0; TRState state = TRInactive; + float running_temp; + void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); } tr_state_machine_t; - TERN_(THERMAL_PROTECTION_HOTENDS, static tr_state_machine_t tr_state_machine[HOTENDS]); - TERN_(HAS_THERMALLY_PROTECTED_BED, static tr_state_machine_t tr_state_machine_bed); - TERN_(THERMAL_PROTECTION_CHAMBER, static tr_state_machine_t tr_state_machine_chamber); - - static void thermal_runaway_protection(tr_state_machine_t &state, const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); + static tr_state_machine_t tr_state_machine[NR_HEATER_RUNAWAY]; #endif // HAS_THERMAL_PROTECTION }; From 7742e70865a6fe629e59d97f87aeb5530f791716 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 11 Sep 2020 23:05:27 -0500 Subject: [PATCH 0233/1370] Better choice of code Followup to #19344 --- .../gcode/calibrate/{G76_M871-M872.cpp => G76_M192_M871.cpp} | 4 ++-- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename Marlin/src/gcode/calibrate/{G76_M871-M872.cpp => G76_M192_M871.cpp} (99%) diff --git a/Marlin/src/gcode/calibrate/G76_M871-M872.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp similarity index 99% rename from Marlin/src/gcode/calibrate/G76_M871-M872.cpp rename to Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 4f7c2874b1..89393b4582 100644 --- a/Marlin/src/gcode/calibrate/G76_M871-M872.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -334,13 +334,13 @@ void GcodeSuite::M871() { } /** - * M872: Wait for probe temperature sensor to reach a target + * M192: Wait for probe temperature sensor to reach a target * * Select only one of these flags: * R - Wait for heating or cooling * S - Wait only for heating */ -void GcodeSuite::M872() { +void GcodeSuite::M192() { if (DEBUGGING(DRYRUN)) return; const bool no_wait_for_cooling = parser.seenval('S'); diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index bace7adc75..c1b6deeadd 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -818,8 +818,8 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #endif #if ENABLED(PROBE_TEMP_COMPENSATION) + case 192: M192(); break; // M192: Wait for probe temp case 871: M871(); break; // M871: Print/reset/clear first layer temperature offset values - case 872: M872(); break; // M872: Wait for probe temp #endif #if ENABLED(LIN_ADVANCE) diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 72a2d0966f..2427301262 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -253,7 +253,7 @@ * M868 - Report or set position encoder module error correction threshold. * M869 - Report position encoder module error. * M871 - Print/reset/clear first layer temperature offset values. (Requires PROBE_TEMP_COMPENSATION) - * M872 - Wait for probe temp (Requires PROBE_TEMP_COMPENSATION) + * M192 - Wait for probe temp (Requires PROBE_TEMP_COMPENSATION) * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER) * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) @@ -822,8 +822,8 @@ private: #endif #if ENABLED(PROBE_TEMP_COMPENSATION) + static void M192(); static void M871(); - static void M872(); #endif TERN_(LIN_ADVANCE, static void M900()); From c6e35ce066ebb717b3a2a550f615270bea1e77c7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 10 Sep 2020 20:44:13 -0500 Subject: [PATCH 0234/1370] Always show Compiled: --- Marlin/src/MarlinCore.cpp | 12 ++++-------- Marlin/src/core/language.h | 2 -- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 89791c9082..2927a3e40b 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -977,18 +977,14 @@ void setup() { SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); SERIAL_EOL(); - #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) SERIAL_ECHO_MSG( - STR_CONFIGURATION_VER - STRING_DISTRIBUTION_DATE - STR_AUTHOR STRING_CONFIG_H_AUTHOR + " Last Updated: " STRING_DISTRIBUTION_DATE + " | Author: " STRING_CONFIG_H_AUTHOR ); - SERIAL_ECHO_MSG("Compiled: " __DATE__); #endif - - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); + SERIAL_ECHO_MSG("Compiled: " __DATE__); + SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); // Set up LEDs early #if HAS_COLOR_LEDS diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 1d81ee61fb..0f932f9d3f 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -108,8 +108,6 @@ #define STR_BROWNOUT_RESET " Brown out Reset" #define STR_WATCHDOG_RESET " Watchdog Reset" #define STR_SOFTWARE_RESET " Software Reset" -#define STR_AUTHOR " | Author: " -#define STR_CONFIGURATION_VER " Last Updated: " #define STR_FREE_MEMORY " Free Memory: " #define STR_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " #define STR_OK "ok" From 2877dc9794e8ecef454434574f7e701f563b90a1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 10 Sep 2020 22:02:18 -0500 Subject: [PATCH 0235/1370] M115 strings --- Marlin/src/core/language.h | 1 - Marlin/src/gcode/host/M115.cpp | 12 ++++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 0f932f9d3f..0bcf799ac3 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -125,7 +125,6 @@ #define STR_INVALID_E_STEPPER "Invalid E stepper" #define STR_E_STEPPER_NOT_SPECIFIED "E stepper not specified" #define STR_INVALID_SOLENOID "Invalid solenoid" -#define STR_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " (" __DATE__ " " __TIME__ ") SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID #define STR_COUNT_X " Count X:" #define STR_COUNT_A " Count A:" #define STR_WATCHDOG_FIRED "Watchdog timeout. Reset required." diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index cd64c563f9..53c5163bba 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -42,8 +42,16 @@ * the capability is not present. */ void GcodeSuite::M115() { - - SERIAL_ECHOLNPGM(STR_M115_REPORT); + SERIAL_ECHOLNPGM( + "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " (" __DATE__ " " __TIME__ ") " + "SOURCE_CODE_URL:" SOURCE_CODE_URL " " + "PROTOCOL_VERSION:" PROTOCOL_VERSION " " + "MACHINE_TYPE:" MACHINE_NAME " " + "EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " " + #ifdef MACHINE_UUID + "UUID:" MACHINE_UUID + #endif + ); #if ENABLED(EXTENDED_CAPABILITIES_REPORT) From 8e3ac54de3e28925f1d7b9f0d6e32be144bf19e1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 14 Sep 2020 02:48:45 -0500 Subject: [PATCH 0236/1370] Allow E3 V2 DWIN without EEPROM, POWER_LOSS_RECOVERY --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 308 ++++++++++++++++-------------- Marlin/src/lcd/dwin/e3v2/dwin.h | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 2 +- 3 files changed, 164 insertions(+), 148 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 8aa908e423..ccd5f2bc20 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -48,15 +48,17 @@ #include "../../../core/macros.h" #include "../../../gcode/queue.h" -#include "../../../feature/powerloss.h" #include "../../../feature/babystep.h" -#include "../../../module/settings.h" #include "../../../module/temperature.h" #include "../../../module/printcounter.h" #include "../../../module/motion.h" #include "../../../module/planner.h" +#if ENABLED(EEPROM_SETTINGS) + #include "../../../module/settings.h" +#endif + #if ENABLED(HOST_ACTION_COMMANDS) #include "../../../feature/host_actions.h" #endif @@ -69,6 +71,10 @@ #include "../../../module/probe.h" #endif +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../feature/powerloss.h" +#endif + #ifndef MACHINE_SIZE #define MACHINE_SIZE "220x220x250" #endif @@ -130,7 +136,7 @@ constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other #define MBASE(L) (49 + (L)*MLINE) -#define BABY_Z_VAR TERN(HAS_BED_PROBE, probe.offset.z, zprobe_zoffset) +#define BABY_Z_VAR TERN(HAS_BED_PROBE, probe.offset.z, dwin_zoffset) /* Value Init */ HMI_value_t HMI_ValueStruct; @@ -188,8 +194,8 @@ float last_E_scale = 0; bool DWIN_lcd_sd_status = 0; bool pause_action_flag = 0; int temphot = 0, tempbed = 0; -float zprobe_zoffset = 0; -float last_zoffset = 0, last_probe_zoffset = 0; +float dwin_zoffset = 0; +float last_zoffset = 0; #define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) // BL24CXX::check() uses 0x00 @@ -213,7 +219,7 @@ void HMI_SetAndSaveLanguageChinese(void) { BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); } -void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { +void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { if (value < 0) { DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, F("-")); DWIN_Draw_FloatValue(true, true, 0, size, White, bColor, iNum, fNum, x, y, -value); @@ -517,7 +523,7 @@ inline void Prepare_Item_Offset(const uint8_t row) { if (HMI_flag.language_chinese) { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 174, 164, 271 - 48, 479 - 302, LBLX, MBASE(row)); - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else DWIN_Frame_AreaCopy(1, 43, 89, 271 - 173, 479 - 378, LBLX, MBASE(row)); #endif @@ -525,7 +531,7 @@ inline void Prepare_Item_Offset(const uint8_t row) { else { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(row)); // "Z-Offset" - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else DWIN_Frame_AreaCopy(1, 1, 76, 271 - 165, 479 - 393, LBLX, MBASE(row)); // "..." #endif @@ -633,22 +639,28 @@ inline void Draw_Control_Menu() { Draw_Title(GET_TEXT_F(MSG_CONTROL)); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), GET_TEXT_F(MSG_TEMPERATURE)); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_MOTION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); - if (CVISI(6)) - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 5), F("Info")); + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + if (CVISI(6)) DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 5), F("Info")); + #else + if (CVISI(3)) DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Info")); + #endif #else DWIN_Frame_AreaCopy(1, 128, 2, 271 - 95, 479 - 467, 14, 8); DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX, CLINE(1));// Temperature > DWIN_Frame_AreaCopy(1, 84, 89, 271 - 143, 479 - 380, LBLX, CLINE(2));// Motion > - DWIN_Frame_AreaCopy(1, 131 + 17, 89, 271 - 3, 479 - 377 - 1, LBLX, CLINE(3));// "Store Configuration" - DWIN_Frame_AreaCopy(1, 26, 104, 271 - 214, 479 - 365, LBLX, CLINE(4)); // "Read" - DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 31 + 3, CLINE(4)); // "Configuration" - DWIN_Frame_AreaCopy(1, 59, 104, 271 - 178, 479 - 365, LBLX, CLINE(5)); // "Reset" - DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 34 + 3, CLINE(5)); // "Configuration" - if (CVISI(6)) - DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 131 + 17, 89, 271 - 3, 479 - 377 - 1, LBLX, CLINE(3));// "Store Configuration" + DWIN_Frame_AreaCopy(1, 26, 104, 271 - 214, 479 - 365, LBLX, CLINE(4)); // "Read" + DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 31 + 3, CLINE(4)); // "Configuration" + DWIN_Frame_AreaCopy(1, 59, 104, 271 - 178, 479 - 365, LBLX, CLINE(5)); // "Reset" + DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 34 + 3, CLINE(5)); // "Configuration" + if (CVISI(6)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > + #else + if (CVISI(3)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(3)); // Info > + #endif #endif } @@ -708,7 +720,7 @@ inline void Draw_Tune_Menu() { DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), thermalManager.temp_hotend[0].target); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), thermalManager.temp_bed.target); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(4), thermalManager.fan_speed[0]); - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5), BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(5), BABY_Z_VAR * 100); } inline void draw_max_en(const uint16_t line) { @@ -1102,7 +1114,7 @@ void HMI_Move_Z(void) { checkkey = AxisMove; EncoderRate.encoderRateEnabled = 0; last_E_scale = HMI_ValueStruct.Move_E_scale; - show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); if (!planner.is_full()) { planner.synchronize(); // Wait for planner moves to finish! planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); @@ -1115,7 +1127,7 @@ void HMI_Move_Z(void) { else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; current_position.e = HMI_ValueStruct.Move_E_scale / 10; - show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); DWIN_UpdateLCD(); } } @@ -1125,7 +1137,7 @@ void HMI_Move_Z(void) { void HMI_Zoffset(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - last_zoffset = zprobe_zoffset; + last_zoffset = dwin_zoffset; if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.offset_value += EncoderRate.encoderMoveValue; } @@ -1134,24 +1146,22 @@ void HMI_Zoffset(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { EncoderRate.encoderRateEnabled = 0; - zprobe_zoffset = HMI_ValueStruct.offset_value / 100; + dwin_zoffset = HMI_ValueStruct.offset_value / 100; #if HAS_BED_PROBE - if (WITHIN(zprobe_zoffset - last_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) - probe.offset.z = zprobe_zoffset; - settings.save(); + if (WITHIN(dwin_zoffset - last_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) + probe.offset.z = dwin_zoffset; + TERN_(EEPROM_SETTINGS, settings.save()); #elif ENABLED(BABYSTEPPING) - babystep.add_mm(Z_AXIS, (zprobe_zoffset - last_zoffset)); - #else - UNUSED(zprobe_zoffset - last_zoffset); + babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset); #endif if (HMI_ValueStruct.show_mode == -4) { checkkey = Prepare; - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(4 + MROWS - index_prepare), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(4 + MROWS - index_prepare), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); } else { checkkey = Tune; - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5 + MROWS - index_tune), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(5 + MROWS - index_tune), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); } DWIN_UpdateLCD(); return; @@ -1159,9 +1169,9 @@ void HMI_Zoffset(void) { NOLESS(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100); NOMORE(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MAX) * 100); if (HMI_ValueStruct.show_mode == -4) - show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(4 + MROWS - index_prepare), HMI_ValueStruct.offset_value); + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(4 + MROWS - index_prepare), HMI_ValueStruct.offset_value); else - show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(5 + MROWS - index_tune), HMI_ValueStruct.offset_value); + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(5 + MROWS - index_tune), HMI_ValueStruct.offset_value); DWIN_UpdateLCD(); } } @@ -1213,7 +1223,7 @@ void HMI_Zoffset(void) { } } -#endif // if HAS_HOTEND +#endif // HAS_HOTEND #if HAS_HEATED_BED @@ -1262,7 +1272,7 @@ void HMI_Zoffset(void) { } } -#endif // if HAS_HEATED_BED +#endif // HAS_HEATED_BED #if HAS_FAN @@ -1311,7 +1321,7 @@ void HMI_Zoffset(void) { } } -#endif // if HAS_FAN +#endif // HAS_FAN void HMI_PrintSpeed(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); @@ -1515,27 +1525,20 @@ void update_variable(void) { DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); last_speed = feedrate_percentage; } - #if HAS_BED_PROBE - if (last_probe_zoffset != probe.offset.z) { - show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, probe.offset.z * 100); - last_probe_zoffset = probe.offset.z; - } - #else - if (last_zoffset != zprobe_zoffset) { - show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, zprobe_zoffset * 100); - last_zoffset = zprobe_zoffset; - } - #endif + if (last_zoffset != BABY_Z_VAR) { + DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, BABY_Z_VAR * 100); + last_zoffset = BABY_Z_VAR; + } } /** -* Read and cache the working directory. -* -* TODO: New code can follow the pattern of menu_media.cpp -* and rely on Marlin caching for performance. No need to -* cache files here. -* -*/ + * Read and cache the working directory. + * + * TODO: New code can follow the pattern of menu_media.cpp + * and rely on Marlin caching for performance. No need to + * cache files here. + * + */ #ifndef strcasecmp_P #define strcasecmp_P(a, b) strcasecmp((a), (b)) @@ -1723,7 +1726,7 @@ void HMI_StartFrame(const bool with_update) { DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + (2 + 3) * STAT_CHR_W + 2, 429, F("%")); - show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178, 429, BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178, 429, BABY_Z_VAR * 100); DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); @@ -2223,7 +2226,7 @@ void HMI_Prepare(void) { DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), current_position[X_AXIS] * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), current_position[Y_AXIS] * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), current_position[Z_AXIS] * MINUNITMULT); - show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), current_position.e * MINUNITMULT); + DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), current_position.e * MINUNITMULT); break; case 2: // close motion queue.inject_P(PSTR("M84")); @@ -2237,9 +2240,9 @@ void HMI_Prepare(void) { case 4: // Z-offset #if HAS_BED_PROBE checkkey = Homeoffset; - HMI_ValueStruct.show_mode = -4; + HMI_ValueStruct.show_mode = -4; HMI_ValueStruct.offset_value = probe.offset.z * 100; - show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(4 + MROWS - index_prepare), HMI_ValueStruct.offset_value); + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(4 + MROWS - index_prepare), HMI_ValueStruct.offset_value); EncoderRate.encoderRateEnabled = 1; #else // Apply workspace offset, making the current position 0,0,0 @@ -2392,19 +2395,22 @@ void HMI_Control(void) { select_motion.reset(); Draw_Motion_Menu(); break; - case 3: { // write EEPROM - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; - case 4: { // read EEPROM - const bool success = settings.load(); - HMI_AudioFeedback(success); - } break; - case 5: // resume EEPROM - settings.reset(); - HMI_AudioFeedback(); - break; - case 6: // info + case 3: + #if ENABLED(EEPROM_SETTINGS) + { // write EEPROM + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + case 4: { // read EEPROM + const bool success = settings.load(); + HMI_AudioFeedback(success); + } break; + case 5: // resume EEPROM + settings.reset(); + HMI_AudioFeedback(); + break; + case 6: // info + #endif checkkey = Info; Draw_Info_Menu(); break; @@ -2442,7 +2448,7 @@ void HMI_AxisMove(void) { DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); DWIN_UpdateLCD(); } return; @@ -2495,7 +2501,7 @@ void HMI_AxisMove(void) { #endif checkkey = Extruder; HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; - show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); EncoderRate.encoderRateEnabled = 1; break; #endif @@ -2593,7 +2599,9 @@ void HMI_Temperature(void) { Draw_Menu_Line(1, ICON_SetEndTemp); Draw_Menu_Line(2, ICON_SetBedTemp); Draw_Menu_Line(3, ICON_FanSpeed); - Draw_Menu_Line(4, ICON_WriteEEPROM); + #if ENABLED(EEPROM_SETTINGS) + Draw_Menu_Line(4, ICON_WriteEEPROM); + #endif DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); @@ -2647,14 +2655,16 @@ void HMI_Temperature(void) { Draw_Menu_Line(1, ICON_SetEndTemp); Draw_Menu_Line(2, ICON_SetBedTemp); Draw_Menu_Line(3, ICON_FanSpeed); - Draw_Menu_Line(4, ICON_WriteEEPROM); + #if ENABLED(EEPROM_SETTINGS) + Draw_Menu_Line(4, ICON_WriteEEPROM); + #endif DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); break; - #endif // if HAS_HOTEND + #endif // HAS_HOTEND } } DWIN_UpdateLCD(); @@ -2996,7 +3006,7 @@ void HMI_Tune(void) { case 5: // Z-offset checkkey = Homeoffset; HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; - show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(5 + MROWS - index_tune), HMI_ValueStruct.offset_value); + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(5 + MROWS - index_tune), HMI_ValueStruct.offset_value); EncoderRate.encoderRateEnabled = 1; break; case 6: // Language @@ -3067,10 +3077,12 @@ void HMI_PLAPreheatSetting(void) { EncoderRate.encoderRateEnabled = 1; break; #endif - case 4: { // save PLA configuration - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; + #if ENABLED(EEPROM_SETTINGS) + case 4: { // save PLA configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + #endif default: break; } } @@ -3121,10 +3133,12 @@ void HMI_ABSPreheatSetting(void) { EncoderRate.encoderRateEnabled = 1; break; #endif - case 4: { // save ABS configuration - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; + #if ENABLED(EEPROM_SETTINGS) + case 4: { // save ABS configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + #endif default: break; } @@ -3441,7 +3455,7 @@ void EachMomentUpdate(void) { else if (abort_flag && !HMI_flag.home_flag) { // Print Stop abort_flag = 0; HMI_ValueStruct.print_speed = feedrate_percentage = 100; - zprobe_zoffset = TERN(HAS_BED_PROBE, probe.offset.z, 0); + dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); planner.finish_and_disable(); @@ -3452,70 +3466,72 @@ void EachMomentUpdate(void) { select_page.set(0); Goto_MainMenu(); } - else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off - recovery.dwin_flag = false; + #if ENABLED(POWER_LOSS_RECOVERY) + else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off + recovery.dwin_flag = false; - recovery.load(); - if (!recovery.valid()) return recovery.purge(); + recovery.load(); + if (!recovery.valid()) return recovery.purge(); - auto draw_first_option = [](const bool sel) { - const uint16_t c1 = sel ? Background_window : Select_Color; - DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345); - DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346); - }; + auto draw_first_option = [](const bool sel) { + const uint16_t c1 = sel ? Background_window : Select_Color; + DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345); + DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346); + }; - auto update_selection = [&](const bool sel) { - HMI_flag.select_flag = sel; - draw_first_option(sel); - const uint16_t c2 = sel ? Select_Color : Background_window; - DWIN_Draw_Rectangle(0, c2, 145, 306, 246, 345); - DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346); - }; + auto update_selection = [&](const bool sel) { + HMI_flag.select_flag = sel; + draw_first_option(sel); + const uint16_t c2 = sel ? Select_Color : Background_window; + DWIN_Draw_Rectangle(0, c2, 145, 306, 246, 345); + DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346); + }; - const uint16_t fileCnt = card.get_num_Files(); - for (uint16_t i = 0; i < fileCnt; i++) { - // TODO: Resume print via M1000 then update the UI - // with the active filename which can come from CardReader. - card.getfilename_sorted(SD_ORDER(i, fileCnt)); - if (!strcmp(card.filename, &recovery.info.sd_filename[1])) { // Resume print before power failure while have the same file - recovery_flag = 1; - HMI_flag.select_flag = 1; - Popup_Window_Resume(); - draw_first_option(false); - char * const name = card.longest_filename(); - const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, npos, 252, name); - DWIN_UpdateLCD(); - break; - } - } - - // if hasn't resumable G-code file - if (!recovery_flag) return; - - while (recovery_flag) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_ENTER) { - recovery_flag = 0; - if (HMI_flag.select_flag) break; - TERN_(POWER_LOSS_RECOVERY, recovery.cancel()); - HMI_StartFrame(true); - return; + const uint16_t fileCnt = card.get_num_Files(); + for (uint16_t i = 0; i < fileCnt; i++) { + // TODO: Resume print via M1000 then update the UI + // with the active filename which can come from CardReader. + card.getfilename_sorted(SD_ORDER(i, fileCnt)); + if (!strcmp(card.filename, &recovery.info.sd_filename[1])) { // Resume print before power failure while have the same file + recovery_flag = 1; + HMI_flag.select_flag = 1; + Popup_Window_Resume(); + draw_first_option(false); + char * const name = card.longest_filename(); + const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, npos, 252, name); + DWIN_UpdateLCD(); + break; } - else - update_selection(encoder_diffState == ENCODER_DIFF_CCW); - - DWIN_UpdateLCD(); } - } - select_print.set(0); - HMI_ValueStruct.show_mode = 0; - HMI_StartFrame(false); - recovery.resume(); - return; - } + // if hasn't resumable G-code file + if (!recovery_flag) return; + + while (recovery_flag) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (encoder_diffState == ENCODER_DIFF_ENTER) { + recovery_flag = 0; + if (HMI_flag.select_flag) break; + TERN_(POWER_LOSS_RECOVERY, recovery.cancel()); + HMI_StartFrame(true); + return; + } + else + update_selection(encoder_diffState == ENCODER_DIFF_CCW); + + DWIN_UpdateLCD(); + } + } + + select_print.set(0); + HMI_ValueStruct.show_mode = 0; + HMI_StartFrame(false); + recovery.resume(); + return; + } + #endif DWIN_UpdateLCD(); } @@ -3572,7 +3588,7 @@ void DWIN_CompletedHoming(void) { } else if (checkkey == Back_Main) { HMI_ValueStruct.print_speed = feedrate_percentage = 100; - zprobe_zoffset = TERN0(BLTOUCH, probe.offset.z); + dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); planner.finish_and_disable(); Goto_MainMenu(); } diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index dffd40bd03..e5d95f6166 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -318,7 +318,7 @@ void HMI_MaxCornerXYZE(void); void HMI_StepXYZE(void); void update_variable(void); -void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); +void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); // SD Card void HMI_SDCardInit(void); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 4d65429bf1..1637d32877 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -759,7 +759,7 @@ namespace ExtUI { if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) probe.offset.z = value; #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) - babystep.add_mm(Z_AXIS, (value - getZOffset_mm())); + babystep.add_mm(Z_AXIS, value - getZOffset_mm()); #else UNUSED(value); #endif From 9aceb3711bff4b09b4629cbe974bcf9bbb78b4b9 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Mon, 14 Sep 2020 02:25:20 -0600 Subject: [PATCH 0237/1370] Add missing FTDI EVE menu source (#19382) --- .../ftdi_eve_lib/extended/text_ellipsis.cpp | 4 +- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 4 +- .../screens/bio_status_screen.cpp | 2 +- .../screens/leveling_menu.cpp | 121 ++++++++++++++++++ .../screens/status_screen.cpp | 4 +- 5 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp index 3746f1cde0..266b6efdab 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -30,12 +30,12 @@ namespace FTDI { */ static void _draw_text_with_ellipsis(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, char *str, uint16_t options, uint8_t font) { FontMetrics fm(font); - const uint16_t ellipsisWidth = fm.get_char_width('.') * 3; + const int16_t ellipsisWidth = fm.get_char_width('.') * 3; // Compute the total line length, as well as // the location in the string where it can // split and still allow the ellipsis to fit. - uint16_t lineWidth = 0; + int16_t lineWidth = 0; char *breakPoint = str; for(char* c = str; *c; c++) { lineWidth += fm.get_char_width(*c); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index 270ec55819..fe68faefee 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -61,7 +61,9 @@ namespace ExtUI { if (AT_SCREEN(StatusScreen) || isPrintingFromMedia()) StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED)); - if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen); + #if ENABLED(SDSUPPORT) + if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen); + #endif } void onMediaError() { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index cfae53c724..e881995f2e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -304,7 +304,7 @@ void StatusScreen::draw_overlay_icons(draw_mode_t what) { PolyUI ui(cmd, what); if (what & FOREGROUND) { - ui.button_fill (TERN(TOUCH_UI_COCOA_PRESS, stroke_rgb, fill_rgb); + ui.button_fill (TERN(TOUCH_UI_COCOA_PRESS, stroke_rgb, fill_rgb)); ui.button_stroke(stroke_rgb, 28); ui.button_shadow(shadow_rgb, shadow_depth); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp new file mode 100644 index 0000000000..2eab27c608 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -0,0 +1,121 @@ +/********************* + * leveling_menu.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE,HAS_LEVELING) + +#include "screens.h" + +#if BOTH(HAS_BED_PROBE,BLTOUCH) + #include "../../../../../feature/bltouch.h" +#endif + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +#ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 9 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define SHOW_MESH_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define BLTOUCH_TITLE_POS BTN_POS(1,6), BTN_SIZE(2,1) + #define BLTOUCH_RESET_POS BTN_POS(1,7), BTN_SIZE(1,1) + #define BLTOUCH_TEST_POS BTN_POS(2,7), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) +#else + #define GRID_ROWS 7 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define SHOW_MESH_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define BLTOUCH_TITLE_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define BLTOUCH_RESET_POS BTN_POS(1,6), BTN_SIZE(1,1) + #define BLTOUCH_TEST_POS BTN_POS(2,6), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,7), BTN_SIZE(2,1) +#endif + +void LevelingMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.font(font_large) + .text(TITLE_POS, GET_TEXT_F(MSG_LEVELING)) + .font(font_medium).colors(normal_btn) + .tag(2).button(LEVEL_BED_POS, GET_TEXT_F(MSG_LEVEL_BED)) + .enabled( + #ifdef AXIS_LEVELING_COMMANDS + 1 + #endif + ) + .tag(3).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) + .enabled(ENABLED(HAS_MESH)) + .tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)); + #if ENABLED(BLTOUCH) + cmd.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) + .tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) + .tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)); + #endif + cmd.colors(action_btn) + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool LevelingMenu::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + case 2: + #ifndef BED_LEVELING_COMMANDS + #define BED_LEVELING_COMMANDS "G29" + #endif + #if HAS_MESH + BedMeshScreen::startMeshProbe(); + #else + SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); + #endif + break; + #ifdef AXIS_LEVELING_COMMANDS + case 3: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS)); break; + #endif + #if HAS_MESH + case 4: GOTO_SCREEN(BedMeshScreen); break; + #endif + #if ENABLED(BLTOUCH) + case 5: injectCommands_P(PSTR("M280 P0 S60")); break; + case 6: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; + #endif + default: return false; + } + return true; +} + +#endif // BOTH(TOUCH_UI_FTDI_EVE,HAS_LEVELING) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index f2524c7982..6b258b5389 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -376,7 +376,9 @@ bool StatusScreen::onTouchEnd(uint8_t tag) { using namespace ExtUI; switch (tag) { - case 3: GOTO_SCREEN(FilesScreen); break; + #if ENABLED(SDSUPPORT) + case 3: GOTO_SCREEN(FilesScreen); break; + #endif case 4: if (isPrinting()) { GOTO_SCREEN(TuneMenu); From 8debad803ca524c53d39334e0eac80d7d2303b3f Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Mon, 14 Sep 2020 03:28:21 -0500 Subject: [PATCH 0238/1370] More strict STATIC_ITEM_N (#19378) --- Marlin/src/lcd/menu/menu_item.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index a92f917f9f..755135d14d 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -342,8 +342,8 @@ class MenuItem_bool : public MenuEditItemBase { #define PSTRING_ITEM(LABEL, V...) PSTRING_ITEM_P(GET_TEXT(LABEL), ##V) -#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) -#define STATIC_ITEM_N(LABEL, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) +#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) +#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), N, ##V) #define MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, false, PLABEL, ##V) #define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) From d3f88a2482dba02d7152994cd27e778e46728f8f Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 14 Sep 2020 19:16:19 -0300 Subject: [PATCH 0239/1370] Only set up SPI pins as needed (#19372) --- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 104 +++++++++++++++-------------- 1 file changed, 54 insertions(+), 50 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index e13f2d98cb..b3d2908ac9 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -39,10 +39,10 @@ * Some of the LCD interfaces/adapters result in the LCD SPI and the SD card * SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with * WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is - * active. If any of these pins are shared then the software SPI must be used. + * active. If any of these pins are shared then the software SPI must be used. * - * A more sophisticated hardware SPI can be found at the following link. This - * implementation has not been fully debugged. + * A more sophisticated hardware SPI can be found at the following link. + * This implementation has not been fully debugged. * https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e */ @@ -170,34 +170,20 @@ static inline void waitSpiTxEnd(LPC_SSP_TypeDef *spi_d) { while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0 } +// Retain the pin init state of the SPI, to avoid init more than once, +// even if more instances of SPIClass exist +static bool spiInitialised[BOARD_NR_SPI] = { false }; + SPIClass::SPIClass(uint8_t device) { // Init things specific to each SPI device // clock divider setup is a bit of hack, and needs to be improved at a later date. - PINSEL_CFG_Type PinCfg; // data structure to hold init values #if BOARD_NR_SPI >= 1 _settings[0].spi_d = LPC_SSP0; _settings[0].dataMode = SPI_MODE0; _settings[0].dataSize = DATA_SIZE_8BIT; _settings[0].clock = SPI_CLOCK_MAX; - // _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); - PinCfg.Funcnum = 2; - PinCfg.OpenDrain = 0; - PinCfg.Pinmode = 0; - PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_SCK_PIN); - PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_SCK_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_OUTPUT(BOARD_SPI1_SCK_PIN); - - PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_MISO_PIN); - PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_MISO_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_INPUT(BOARD_SPI1_MISO_PIN); - - PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_MOSI_PIN); - PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_MOSI_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_OUTPUT(BOARD_SPI1_MOSI_PIN); + //_settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); #endif #if BOARD_NR_SPI >= 2 @@ -205,34 +191,53 @@ SPIClass::SPIClass(uint8_t device) { _settings[1].dataMode = SPI_MODE0; _settings[1].dataSize = DATA_SIZE_8BIT; _settings[1].clock = SPI_CLOCK_MAX; - // _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); - PinCfg.Funcnum = 2; - PinCfg.OpenDrain = 0; - PinCfg.Pinmode = 0; - PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_SCK_PIN); - PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_SCK_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_OUTPUT(BOARD_SPI2_SCK_PIN); - - PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_MISO_PIN); - PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_MISO_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_INPUT(BOARD_SPI2_MISO_PIN); - - PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_MOSI_PIN); - PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_MOSI_PIN); - PINSEL_ConfigPin(&PinCfg); - SET_OUTPUT(BOARD_SPI2_MOSI_PIN); + //_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); #endif setModule(device); - /* Initialize GPDMA controller */ - //TODO: call once in the constructor? or each time? + // Init the GPDMA controller + // TODO: call once in the constructor? or each time? GPDMA_Init(); } void SPIClass::begin() { + // Init the SPI pins in the first begin call + if ((_currentSetting->spi_d == LPC_SSP0 && spiInitialised[0] == false) || + (_currentSetting->spi_d == LPC_SSP1 && spiInitialised[1] == false)) { + pin_t sck, miso, mosi; + if (_currentSetting->spi_d == LPC_SSP0) { + sck = BOARD_SPI1_SCK_PIN; + miso = BOARD_SPI1_MISO_PIN; + mosi = BOARD_SPI1_MOSI_PIN; + spiInitialised[0] = true; + } + else if (_currentSetting->spi_d == LPC_SSP1) { + sck = BOARD_SPI2_SCK_PIN; + miso = BOARD_SPI2_MISO_PIN; + mosi = BOARD_SPI2_MOSI_PIN; + spiInitialised[1] = true; + } + PINSEL_CFG_Type PinCfg; // data structure to hold init values + PinCfg.Funcnum = 2; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = LPC176x::pin_bit(sck); + PinCfg.Portnum = LPC176x::pin_port(sck); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(sck); + + PinCfg.Pinnum = LPC176x::pin_bit(miso); + PinCfg.Portnum = LPC176x::pin_port(miso); + PINSEL_ConfigPin(&PinCfg); + SET_INPUT(miso); + + PinCfg.Pinnum = LPC176x::pin_bit(mosi); + PinCfg.Portnum = LPC176x::pin_port(mosi); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(mosi); + } + updateSettings(); SSP_Cmd(_currentSetting->spi_d, ENABLE); // start SSP running } @@ -246,7 +251,7 @@ void SPIClass::beginTransaction(const SPISettings &cfg) { } uint8_t SPIClass::transfer(const uint16_t b) { - /* send and receive a single byte */ + // Send and receive a single byte SSP_ReceiveData(_currentSetting->spi_d); // read any previous data SSP_SendData(_currentSetting->spi_d, b); waitSpiTxEnd(_currentSetting->spi_d); // wait for it to finish @@ -254,8 +259,7 @@ uint8_t SPIClass::transfer(const uint16_t b) { } uint16_t SPIClass::transfer16(const uint16_t data) { - return (transfer((data >> 8) & 0xFF) << 8) - | (transfer(data & 0xFF) & 0xFF); + return (transfer((data >> 8) & 0xFF) << 8) | (transfer(data & 0xFF) & 0xFF); } void SPIClass::end() { @@ -294,23 +298,23 @@ void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) { // Enable dma on SPI SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE); - // only increase memory if minc is true + // Only increase memory if minc is true GPDMACfg.MemoryIncrease = (minc ? GPDMA_DMACCxControl_SI : 0); // Setup channel with given parameter GPDMA_Setup(&GPDMACfg); - // enabled dma + // Enable DMA GPDMA_ChannelCmd(0, ENABLE); - // wait data transfer + // Wait for data transfer while (!GPDMA_IntGetStatus(GPDMA_STAT_RAWINTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_RAWINTERR, 0)) { } - // clear err and int + // Clear err and int GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0); - // dma disable + // Disable DMA GPDMA_ChannelCmd(0, DISABLE); waitSpiTxEnd(_currentSetting->spi_d); From 34d0b5de90ecb24e5830f9db537ba3f9c5b1111e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 16 Sep 2020 04:35:30 -0500 Subject: [PATCH 0240/1370] E3 V2 DWIN cleanup --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 743 +++++++++++++++--------------- Marlin/src/lcd/dwin/e3v2/dwin.h | 52 +-- 2 files changed, 393 insertions(+), 402 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index ccd5f2bc20..1bef8f1408 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -162,7 +162,7 @@ select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0} , select_PLA{0}, select_ABS{0} , select_speed{0} , select_acc{0} - , select_corner{0} + , select_jerk{0} , select_step{0} // , select_leveling{0} ; @@ -235,16 +235,16 @@ void ICON_Print() { DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); DWIN_Draw_Rectangle(0, White, 17, 130, 126, 229); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 58, 201); + DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 58, 201); else - DWIN_Frame_AreaCopy(1, 1, 451, 271 - 240, 479 - 16, 72 - 15, 201); + DWIN_Frame_AreaCopy(1, 1, 451, 31, 463, 57, 201); } else { DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 1, 405, 271 - 243, 420, 58, 201); + DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 58, 201); else - DWIN_Frame_AreaCopy(1, 1, 423, 271 - 240, 423 + 12, 72 - 15, 201); + DWIN_Frame_AreaCopy(1, 1, 423, 31, 435, 57, 201); } } @@ -253,16 +253,16 @@ void ICON_Prepare() { DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); DWIN_Draw_Rectangle(0, White, 145, 130, 254, 229); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 31, 447, 271 - 213, 479 - 19, 186, 201); + DWIN_Frame_AreaCopy(1, 31, 447, 58, 460, 186, 201); else - DWIN_Frame_AreaCopy(1, 33, 451, 271 - 189, 479 - 13, 200 - 25, 201); + DWIN_Frame_AreaCopy(1, 33, 451, 82, 466, 175, 201); } else { DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 31, 405, 271 - 213, 420, 186, 201); + DWIN_Frame_AreaCopy(1, 31, 405, 58, 420, 186, 201); else - DWIN_Frame_AreaCopy(1, 33, 423, 271 - 189, 423 + 15, 200 - 25, 201); + DWIN_Frame_AreaCopy(1, 33, 423, 82, 438, 175, 201); } } @@ -271,16 +271,16 @@ void ICON_Control() { DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); DWIN_Draw_Rectangle(0, White, 17, 246, 126, 345); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 61, 447, 271 - 183, 479 - 19, 58, 318); + DWIN_Frame_AreaCopy(1, 61, 447, 88, 460, 58, 318); else - DWIN_Frame_AreaCopy(1, 85, 451, 271 - 139, 479 - 16, 72 - 24, 318); + DWIN_Frame_AreaCopy(1, 85, 451, 132, 463, 48, 318); } else { DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 61, 405, 271 - 183, 420, 58, 318); + DWIN_Frame_AreaCopy(1, 61, 405, 88, 420, 58, 318); else - DWIN_Frame_AreaCopy(1, 85, 423, 271 - 139, 479 - 45, 72 - 24, 318); + DWIN_Frame_AreaCopy(1, 85, 423, 132, 434, 48, 318); } } @@ -289,16 +289,16 @@ void ICON_StartInfo(bool show) { DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); DWIN_Draw_Rectangle(0, White, 145, 246, 254, 345); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 91, 447, 271 - 153, 479 - 19, 186, 318); + DWIN_Frame_AreaCopy(1, 91, 447, 118, 460, 186, 318); else - DWIN_Frame_AreaCopy(1, 132, 451, 159, 479 - 13, 186, 318); + DWIN_Frame_AreaCopy(1, 132, 451, 159, 466, 186, 318); } else { DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 91, 405, 271 - 153, 420, 186, 318); + DWIN_Frame_AreaCopy(1, 91, 405, 118, 420, 186, 318); else - DWIN_Frame_AreaCopy(1, 132, 423, 159, 423 + 12, 186, 318); + DWIN_Frame_AreaCopy(1, 132, 423, 159, 435, 186, 318); } } @@ -307,16 +307,16 @@ void ICON_Leveling(bool show) { DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); DWIN_Draw_Rectangle(0, White, 145, 246, 254, 345); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 211, 447, 238, 479 - 19, 186, 318); + DWIN_Frame_AreaCopy(1, 211, 447, 238, 460, 186, 318); else - DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 200 - 18, 318); + DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 182, 318); } else { DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 211, 405, 238, 420, 186, 318); else - DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 200 - 18, 318); + DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 182, 318); } } @@ -325,16 +325,16 @@ void ICON_Tune() { DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); DWIN_Draw_Rectangle(0, White, 8, 252, 87, 351); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 121, 447, 271 - 123, 479 - 21, 34, 325); + DWIN_Frame_AreaCopy(1, 121, 447, 148, 458, 34, 325); else - DWIN_Frame_AreaCopy(1, 1, 465, 271 - 237, 479 - 2, 48 - 17, 325); + DWIN_Frame_AreaCopy(1, 1, 465, 34, 477, 31, 325); } else { DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 121, 405, 271 - 123, 420, 34, 325); + DWIN_Frame_AreaCopy(1, 121, 405, 148, 420, 34, 325); else - DWIN_Frame_AreaCopy(1, 1, 438, 271 - 239, 479 - 31, 48 - 17, 325); + DWIN_Frame_AreaCopy(1, 1, 438, 32, 448, 31, 325); } } @@ -343,16 +343,16 @@ void ICON_Pause() { DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); DWIN_Draw_Rectangle(0, White, 96, 252, 175, 351); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 181, 447, 271 - 63, 479 - 20, 124, 325); + DWIN_Frame_AreaCopy(1, 181, 447, 208, 459, 124, 325); else - DWIN_Frame_AreaCopy(1, 177, 451, 271 - 55, 479 - 17, 136 - 20, 325); + DWIN_Frame_AreaCopy(1, 177, 451, 216, 462, 116, 325); } else { DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 181, 405, 271 - 63, 420, 124, 325); + DWIN_Frame_AreaCopy(1, 181, 405, 208, 420, 124, 325); else - DWIN_Frame_AreaCopy(1, 177, 423, 271 - 56, 479 - 46, 136 - 20, 325); + DWIN_Frame_AreaCopy(1, 177, 423, 215, 433, 116, 325); } } @@ -361,16 +361,16 @@ void ICON_Continue() { DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); DWIN_Draw_Rectangle(0, White, 96, 252, 175, 351); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 124, 325); + DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 124, 325); else - DWIN_Frame_AreaCopy(1, 1, 451, 271 - 239, 479 - 16, 136 - 15, 325); + DWIN_Frame_AreaCopy(1, 1, 451, 32, 463, 121, 325); } else { DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 1, 405, 271 - 243, 420, 124, 325); + DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 124, 325); else - DWIN_Frame_AreaCopy(1, 1, 424, 271 - 240, 479 - 45, 136 - 15, 325); + DWIN_Frame_AreaCopy(1, 1, 424, 31, 434, 121, 325); } } @@ -379,16 +379,16 @@ void ICON_Stop() { DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); DWIN_Draw_Rectangle(0, White, 184, 252, 263, 351); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 151, 447, 271 - 93, 479 - 20, 210, 325); + DWIN_Frame_AreaCopy(1, 151, 447, 178, 459, 210, 325); else - DWIN_Frame_AreaCopy(1, 218, 451, 271 - 22, 479 - 14, 224 - 15, 325); + DWIN_Frame_AreaCopy(1, 218, 451, 249, 465, 209, 325); } else { DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 151, 405, 271 - 93, 420, 210, 325); + DWIN_Frame_AreaCopy(1, 151, 405, 178, 420, 210, 325); else - DWIN_Frame_AreaCopy(1, 218, 423, 271 - 24, 479 - 43, 224 - 15, 325); + DWIN_Frame_AreaCopy(1, 218, 423, 247, 436, 209, 325); } } @@ -405,7 +405,7 @@ inline void Draw_Title(const __FlashStringHelper * title) { } inline void Clear_Menu_Area(void) { - DWIN_Draw_Rectangle(1, Background_black, 0, 31, 272, 360); + DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, 360); } inline void Clear_Main_Window(void) { @@ -415,11 +415,11 @@ inline void Clear_Main_Window(void) { inline void Clear_Popup_Area(void) { Clear_Title_Bar(); - DWIN_Draw_Rectangle(1, Background_black, 0, 31, 272, 480); + DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); } void Draw_Popup_Bkgd_105(void) { - DWIN_Draw_Rectangle(1, Background_window, 14, 105, 271 - 13, 479 - 105); + DWIN_Draw_Rectangle(1, Background_window, 14, 105, 258, 374); } inline void Draw_More_Icon(const uint8_t line) { @@ -446,7 +446,7 @@ inline void Add_Menu_Line() { } inline void Scroll_Menu(const uint8_t dir) { - DWIN_Frame_AreaMove(1, dir, MLINE, Background_black, 0, 31, 272, 349); + DWIN_Frame_AreaMove(1, dir, MLINE, Background_black, 0, 31, DWIN_WIDTH, 349); switch (dir) { case DWIN_SCROLL_DOWN: Move_Highlight(-1, 0); break; case DWIN_SCROLL_UP: Add_Menu_Line(); break; @@ -474,9 +474,9 @@ inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char // The "Back" label is always on the first line inline void Draw_Back_Label(void) { if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 129, 72, 271 - 115, 479 - 395, LBLX, MBASE(0)); + DWIN_Frame_AreaCopy(1, 129, 72, 156, 84, LBLX, MBASE(0)); else - DWIN_Frame_AreaCopy(1, 226, 179, 271 - 15, 479 - 290, LBLX, MBASE(0)); + DWIN_Frame_AreaCopy(1, 226, 179, 256, 189, LBLX, MBASE(0)); } // Draw "Back" line at the top @@ -491,12 +491,12 @@ inline void Draw_Back_First(const bool is_sel=true) { // inline void draw_move_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 69, 61, 271 - 169, 479 - 408, LBLX, line); // "Move" + DWIN_Frame_AreaCopy(1, 69, 61, 102, 71, LBLX, line); // "Move" } inline void Prepare_Item_Move(const uint8_t row) { if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 159, 70, 271 - 71, 479 - 395, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 159, 70, 200, 84, LBLX, MBASE(row)); else draw_move_en(MBASE(row)); // "Move >" Draw_Menu_Line(row, ICON_Axis); @@ -505,35 +505,35 @@ inline void Prepare_Item_Move(const uint8_t row) { inline void Prepare_Item_Disable(const uint8_t row) { if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 204, 70, 271 - 12, 479 - 397, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 204, 70, 259, 82, LBLX, MBASE(row)); else - DWIN_Frame_AreaCopy(1, 103, 59, 271 - 71, 479 - 405, LBLX, MBASE(row)); // "Disable Stepper" + DWIN_Frame_AreaCopy(1, 103, 59, 200, 74, LBLX, MBASE(row)); // "Disable Stepper" Draw_Menu_Line(row, ICON_CloseMotor); } inline void Prepare_Item_Home(const uint8_t row) { if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 0, 89, 271 - 230, 479 - 378, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 0, 89, 41, 101, LBLX, MBASE(row)); else - DWIN_Frame_AreaCopy(1, 202, 61, 271 - 0, 479 - 408, LBLX, MBASE(row)); // "Auto Home" + DWIN_Frame_AreaCopy(1, 202, 61, 271, 71, LBLX, MBASE(row)); // "Auto Home" Draw_Menu_Line(row, ICON_Homing); } inline void Prepare_Item_Offset(const uint8_t row) { if (HMI_flag.language_chinese) { #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 174, 164, 271 - 48, 479 - 302, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else - DWIN_Frame_AreaCopy(1, 43, 89, 271 - 173, 479 - 378, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 43, 89, 98, 101, LBLX, MBASE(row)); #endif } else { #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(row)); // "Z-Offset" + DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else - DWIN_Frame_AreaCopy(1, 1, 76, 271 - 165, 479 - 393, LBLX, MBASE(row)); // "..." + DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." #endif } Draw_Menu_Line(row, ICON_SetHome); @@ -541,41 +541,41 @@ inline void Prepare_Item_Offset(const uint8_t row) { inline void Prepare_Item_PLA(const uint8_t row) { if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 100, 89, 271 - 93 - 27, 479 - 378, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row)); } else { - DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX + 49 + 3, MBASE(row)); // "PLA" + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" } Draw_Menu_Line(row, ICON_PLAPreheat); } inline void Prepare_Item_ABS(const uint8_t row) { if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 180, 89, 271 - 11 - 27, 479 - 379, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row)); } else { - DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 49 + 3, MBASE(row)); // "ABS" + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" } Draw_Menu_Line(row, ICON_ABSPreheat); } inline void Prepare_Item_Cool(const uint8_t row) { if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 1, 104, 271 - 215, 479 - 362, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); else - DWIN_Frame_AreaCopy(1, 200, 76, 271 - 7, 479 - 393, LBLX, MBASE(row));// "Cooldown" + DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" Draw_Menu_Line(row, ICON_Cool); } inline void Prepare_Item_Lang(const uint8_t row) { if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 239, 134, 271 - 5, 479 - 333, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 239, 134, 266, 146, LBLX, MBASE(row)); DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), F("CN")); } else { - DWIN_Frame_AreaCopy(1, 0, 194, 271 - 150, 479 - 272, LBLX, MBASE(row)); // "Language selection" + DWIN_Frame_AreaCopy(1, 0, 194, 121, 207, LBLX, MBASE(row)); // "Language selection" DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), F("EN")); } Draw_Menu_Icon(row, ICON_Language); @@ -589,13 +589,13 @@ inline void Draw_Prepare_Menu() { #define PVISI(L) WITHIN(PSCROL(L), 0, MROWS) if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 133, 1, 271 - 111, 479 - 465 - 1, 14, 8); // "Prepare" + DWIN_Frame_AreaCopy(1, 133, 1, 160, 13, 14, 8); // "Prepare" } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_PREPARE)); #else - DWIN_Frame_AreaCopy(1, 178, 2, 271 - 42, 479 - 464 - 1, 14, 8); // "Prepare" + DWIN_Frame_AreaCopy(1, 178, 2, 229, 14, 14, 8); // "Prepare" #endif } @@ -621,18 +621,18 @@ inline void Draw_Control_Menu() { #define CLINE(L) MBASE(CSCROL(L)) #define CVISI(L) WITHIN(CSCROL(L), 0, MROWS) - if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back + if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 103, 1, 271 - 141, 479 - 465, 14, 8); - DWIN_Frame_AreaCopy(1, 57, 104, 271 - 187, 479 - 363, LBLX, CLINE(1)); // Temperature > - DWIN_Frame_AreaCopy(1, 87, 104, 271 - 157, 479 - 363, LBLX, CLINE(2)); // Motion > - DWIN_Frame_AreaCopy(1, 117, 104, 271 - 99, 479 - 363, LBLX, CLINE(3)); // Store Config - DWIN_Frame_AreaCopy(1, 174, 103, 271 - 42, 479 - 363, LBLX, CLINE(4)); // Read Config - DWIN_Frame_AreaCopy(1, 1, 118, 271 - 215, 479 - 348, LBLX, CLINE(5)); // Reset Config + DWIN_Frame_AreaCopy(1, 103, 1, 130, 14, 14, 8); + DWIN_Frame_AreaCopy(1, 57, 104, 84, 116, LBLX, CLINE(1)); // Temperature > + DWIN_Frame_AreaCopy(1, 87, 104, 114, 116, LBLX, CLINE(2)); // Motion > + DWIN_Frame_AreaCopy(1, 117, 104, 172, 116, LBLX, CLINE(3)); // Store Config + DWIN_Frame_AreaCopy(1, 174, 103, 229, 116, LBLX, CLINE(4)); // Read Config + DWIN_Frame_AreaCopy(1, 1, 118, 56, 131, LBLX, CLINE(5)); // Reset Config if (CVISI(6)) - DWIN_Frame_AreaCopy(1, 231, 104, 271 - 13, 479 - 363, LBLX, CLINE(6)); // Info > + DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, CLINE(6)); // Info > } else { #ifdef USE_STRING_HEADINGS @@ -648,18 +648,18 @@ inline void Draw_Control_Menu() { if (CVISI(3)) DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Info")); #endif #else - DWIN_Frame_AreaCopy(1, 128, 2, 271 - 95, 479 - 467, 14, 8); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX, CLINE(1));// Temperature > - DWIN_Frame_AreaCopy(1, 84, 89, 271 - 143, 479 - 380, LBLX, CLINE(2));// Motion > + DWIN_Frame_AreaCopy(1, 128, 2, 176, 12, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(1)); // Temperature > + DWIN_Frame_AreaCopy(1, 84, 89, 128, 99, LBLX, CLINE(2)); // Motion > #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 131 + 17, 89, 271 - 3, 479 - 377 - 1, LBLX, CLINE(3));// "Store Configuration" - DWIN_Frame_AreaCopy(1, 26, 104, 271 - 214, 479 - 365, LBLX, CLINE(4)); // "Read" - DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 31 + 3, CLINE(4)); // "Configuration" - DWIN_Frame_AreaCopy(1, 59, 104, 271 - 178, 479 - 365, LBLX, CLINE(5)); // "Reset" - DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 34 + 3, CLINE(5)); // "Configuration" - if (CVISI(6)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > + DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX, CLINE(3)); // "Store Configuration" + DWIN_Frame_AreaCopy(1, 26, 104, 57, 114, LBLX, CLINE(4)); // "Read" + DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 34, CLINE(4)); // "Configuration" + DWIN_Frame_AreaCopy(1, 59, 104, 93, 114, LBLX, CLINE(5)); // "Reset" + DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 37, CLINE(5)); // "Configuration" + if (CVISI(6)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > #else - if (CVISI(3)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(3)); // Info > + if (CVISI(3)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(3)); // Info > #endif #endif } @@ -680,12 +680,12 @@ inline void Draw_Tune_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 73, 2, 271 - 171, 479 - 466, 14, 9); - DWIN_Frame_AreaCopy(1, 116, 164, 271 - 100, 479 - 303, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 271 - 101, 479 - 333, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 174, 164, 271 - 48, 479 - 302, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 73, 2, 100, 13, 14, 9); + DWIN_Frame_AreaCopy(1, 116, 164, 171, 176, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(5)); } else { #ifdef USE_STRING_HEADINGS @@ -696,14 +696,14 @@ inline void Draw_Tune_Menu() { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_FAN_SPEED)); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else - DWIN_Frame_AreaCopy(1, 94, 2, 271 - 145, 479 - 467, 14, 9); - DWIN_Frame_AreaCopy(1, 1, 179, 271 - 179, 479 - 287 - 2, LBLX, MBASE(1)); // print speed - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(2)); // Hotend... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(3)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(3)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(4)); // fan speed - DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(5)); // Z-offset + DWIN_Frame_AreaCopy(1, 94, 2, 126, 12, 14, 9); + DWIN_Frame_AreaCopy(1, 1, 179, 92, 190, LBLX, MBASE(1)); // print speed + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(2)); // Hotend... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(2)); // ...Temperature + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(3)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(3)); // ...Temperature + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(4)); // fan speed + DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(5)); // Z-offset #endif } @@ -724,47 +724,47 @@ inline void Draw_Tune_Menu() { } inline void draw_max_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 245, 119, 271 - 2, 479 - 350, LBLX, line); // "Max" + DWIN_Frame_AreaCopy(1, 245, 119, 269, 129, LBLX, line); // "Max" } inline void draw_max_accel_en(const uint16_t line) { draw_max_en(line); - DWIN_Frame_AreaCopy(1, 1, 135, 271 - 192, 479 - 334, LBLX + 24 + 3, line); // "Acceleration" + DWIN_Frame_AreaCopy(1, 1, 135, 79, 145, LBLX + 27, line); // "Acceleration" } inline void draw_speed_en(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 184, 119, 224, 479 - 347, LBLX + inset, line); // "Speed" + DWIN_Frame_AreaCopy(1, 184, 119, 224, 132, LBLX + inset, line); // "Speed" } -inline void draw_corner_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 64, 119, 271 - 165, 479 - 350, LBLX + 24 + 3, line); // "Corner" +inline void draw_jerk_en(const uint16_t line) { + DWIN_Frame_AreaCopy(1, 64, 119, 106, 129, LBLX + 27, line); // "Jerk" } inline void draw_steps_per_mm(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 1, 151, 271 - 170, 479 - 318, LBLX, line); // "Steps-per-mm" + DWIN_Frame_AreaCopy(1, 1, 151, 101, 161, LBLX, line); // "Steps-per-mm" } inline void say_x(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 95, 104, 271 - 169, 479 - 365, LBLX + inset, line); // "X" + DWIN_Frame_AreaCopy(1, 95, 104, 102, 114, LBLX + inset, line); // "X" } inline void say_y(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 104, 104, 271 - 161, 479 - 365, LBLX + inset, line); // "Y" + DWIN_Frame_AreaCopy(1, 104, 104, 110, 114, LBLX + inset, line); // "Y" } inline void say_z(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 112, 104, 271 - 151, 479 - 365, LBLX + inset, line); // "Z" + DWIN_Frame_AreaCopy(1, 112, 104, 120, 114, LBLX + inset, line); // "Z" } inline void say_e(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 237, 119, 271 - 27, 479 - 350, LBLX + inset, line); // "E" + DWIN_Frame_AreaCopy(1, 237, 119, 244, 129, LBLX + inset, line); // "E" } inline void Draw_Motion_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); - DWIN_Frame_AreaCopy(1, 173, 133, 228, 479 - 332, LBLX, MBASE(1)); // max speed - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(2)); // max... - DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(2) + 1); // ...acceleration - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(3)); // max... - DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(3) + 1); // ... - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 54, MBASE(3)); // ...jerk - DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(4)); // flow ratio + DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, MBASE(1)); // Max speed + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(2)); // Max... + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(2) + 1); // ...acceleration + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(3)); // Max... + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); // ... + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 54, MBASE(3)); // ...jerk + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(4)); // Flow ratio } else { #ifdef USE_STRING_HEADINGS @@ -774,11 +774,11 @@ inline void Draw_Motion_Menu() { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_JERK)); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STEPS_PER_MM)); #else - DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); - draw_max_en(MBASE(1)); draw_speed_en(24 + 3, MBASE(1)); // "Max Speed" - draw_max_accel_en(MBASE(2)); // "Max Acceleration" - draw_max_en(MBASE(3)); draw_corner_en(MBASE(3)); // "Max Corner" - draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" + DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); + draw_max_en(MBASE(1)); draw_speed_en(27, MBASE(1)); // "Max Speed" + draw_max_accel_en(MBASE(2)); // "Max Acceleration" + draw_max_en(MBASE(3)); draw_jerk_en(MBASE(3)); // "Max Jerk" + draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" #endif } @@ -803,9 +803,9 @@ void Popup_Window_Temperature(const bool toohigh) { if (toohigh) { DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 103, 371, 237, 479 - 93, 52, 285); + DWIN_Frame_AreaCopy(1, 103, 371, 237, 386, 52, 285); DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); + DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); } else { DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); @@ -815,8 +815,8 @@ void Popup_Window_Temperature(const bool toohigh) { else { DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 103, 371, 271 - 1, 479 - 93, 52, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); + DWIN_Frame_AreaCopy(1, 103, 371, 270, 386, 52, 285); + DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); } else { DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); @@ -826,7 +826,7 @@ void Popup_Window_Temperature(const bool toohigh) { } inline void Draw_Popup_Bkgd_60() { - DWIN_Draw_Rectangle(1, Background_window, 14, 60, 271 - 13, 330); + DWIN_Draw_Rectangle(1, Background_window, 14, 60, 258, 330); } #if HAS_HOTEND @@ -836,8 +836,8 @@ inline void Draw_Popup_Bkgd_60() { Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 103, 371, 136, 479 - 93, 69, 240); - DWIN_Frame_AreaCopy(1, 170, 371, 271 - 1, 479 - 93, 69 + 33, 240); + DWIN_Frame_AreaCopy(1, 103, 371, 136, 386, 69, 240); + DWIN_Frame_AreaCopy(1, 170, 371, 270, 386, 102, 240); DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); } else { @@ -852,8 +852,8 @@ void Popup_Window_Resume(void) { Clear_Popup_Area(); Draw_Popup_Bkgd_105(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 160, 338, 271 - 36, 479 - 125, 98, 135); - DWIN_Frame_AreaCopy(1, 103, 321, 271 - 0, 479 - 144, 52, 192); + DWIN_Frame_AreaCopy(1, 160, 338, 235, 354, 98, 135); + DWIN_Frame_AreaCopy(1, 103, 321, 271, 335, 52, 192); DWIN_ICON_Show(ICON, ICON_Continue_C, 26, 307); DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 307); } @@ -926,14 +926,14 @@ void Popup_window_PauseOrStop(void) { void Draw_Printing_Screen(void) { if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 30, 1, 271 - 200, 479 - 465, 14, 9);// Tune - DWIN_Frame_AreaCopy(1, 0, 72, 271 - 208, 479 - 393, 41, 188);// Pause - DWIN_Frame_AreaCopy(1, 65, 72, 271 - 143, 479 - 393, 176, 188); // Stop + DWIN_Frame_AreaCopy(1, 30, 1, 71, 14, 14, 9); // Tune + DWIN_Frame_AreaCopy(1, 0, 72, 63, 86, 41, 188); // Pause + DWIN_Frame_AreaCopy(1, 65, 72, 128, 86, 176, 188); // Stop } else { - DWIN_Frame_AreaCopy(1, 40, 2, 271 - 179, 479 - 464 - 1, 14, 9);// Tune - DWIN_Frame_AreaCopy(1, 0, 44, 271 - 175, 479 - 420 - 1, 41, 188);// Pause - DWIN_Frame_AreaCopy(1, 98, 44, 271 - 119, 479 - 420 - 1, 176, 188); // Stop + DWIN_Frame_AreaCopy(1, 40, 2, 92, 14, 14, 9); // Tune + DWIN_Frame_AreaCopy(1, 0, 44, 96, 58, 41, 188); // Pause + DWIN_Frame_AreaCopy(1, 98, 44, 152, 58, 176, 188); // Stop } } @@ -941,20 +941,20 @@ void Draw_Print_ProgressBar() { DWIN_ICON_Show(ICON, ICON_Bar, 15, 93); DWIN_Draw_Rectangle(1, BarFill_Color, 16 + Percentrecord * 240 / 100, 93, 256, 113); DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Background_black, 2, 117, 133, Percentrecord); - DWIN_Draw_String(false, false, font8x16, Percent_Color, Background_black, 117 + 16, 133, F("%")); + DWIN_Draw_String(false, false, font8x16, Percent_Color, Background_black, 133, 133, F("%")); } void Draw_Print_ProgressElapsed() { duration_t elapsed = print_job_timer.duration(); // print timer DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 42, 212, elapsed.value / 3600); - DWIN_Draw_String(false, false, font8x16, White, Background_black, 42 + 16, 212, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 42 + 24, 212, (elapsed.value % 3600) / 60); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 58, 212, F(":")); + DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 66, 212, (elapsed.value % 3600) / 60); } void Draw_Print_ProgressRemain() { DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 176, 212, remain_time / 3600); - DWIN_Draw_String(false, false, font8x16, White, Background_black, 176 + 16, 212, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 176 + 24, 212, (remain_time % 3600) / 60); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 192, 212, F(":")); + DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 200, 212, (remain_time % 3600) / 60); } void Goto_PrintProcess(void) { @@ -986,13 +986,13 @@ void Goto_MainMenu(void) { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 2, 2, 271 - 244, 479 - 465, 14, 9); // "Home" + DWIN_Frame_AreaCopy(1, 2, 2, 27, 14, 14, 9); // "Home" } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MAIN)); #else - DWIN_Frame_AreaCopy(1, 0, 2, 271 - 232, 479 - 467, 14, 9); + DWIN_Frame_AreaCopy(1, 0, 2, 39, 12, 14, 9); #endif } @@ -1411,37 +1411,37 @@ void HMI_MaxAccelerationXYZE(void) { } } -void HMI_MaxCornerXYZE(void) { +void HMI_MaxJerkXYZE(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Max_Corner += EncoderRate.encoderMoveValue; + HMI_ValueStruct.Max_Jerk += EncoderRate.encoderMoveValue; } else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Max_Corner -= EncoderRate.encoderMoveValue; + HMI_ValueStruct.Max_Jerk -= EncoderRate.encoderMoveValue; } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return - checkkey = MaxCorner; + checkkey = MaxJerk; EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.corner_flag == X_AXIS) planner.set_max_jerk(X_AXIS, HMI_ValueStruct.Max_Corner / 10); - else if (HMI_flag.corner_flag == Y_AXIS) planner.set_max_jerk(Y_AXIS, HMI_ValueStruct.Max_Corner / 10); - else if (HMI_flag.corner_flag == Z_AXIS) planner.set_max_jerk(Z_AXIS, HMI_ValueStruct.Max_Corner / 10); - else if (HMI_flag.corner_flag == E_AXIS) planner.set_max_jerk(E_AXIS, HMI_ValueStruct.Max_Corner / 10); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + if (HMI_flag.jerk_flag == X_AXIS) planner.set_max_jerk(X_AXIS, HMI_ValueStruct.Max_Jerk / 10); + else if (HMI_flag.jerk_flag == Y_AXIS) planner.set_max_jerk(Y_AXIS, HMI_ValueStruct.Max_Jerk / 10); + else if (HMI_flag.jerk_flag == Z_AXIS) planner.set_max_jerk(Z_AXIS, HMI_ValueStruct.Max_Jerk / 10); + else if (HMI_flag.jerk_flag == E_AXIS) planner.set_max_jerk(E_AXIS, HMI_ValueStruct.Max_Jerk / 10); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); return; } - // MaxCorner limit - if (HMI_flag.corner_flag == X_AXIS) - NOMORE(HMI_ValueStruct.Max_Corner, default_max_jerk[X_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.corner_flag == Y_AXIS) - NOMORE(HMI_ValueStruct.Max_Corner, default_max_jerk[Y_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.corner_flag == Z_AXIS) - NOMORE(HMI_ValueStruct.Max_Corner, default_max_jerk[Z_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.corner_flag == E_AXIS) - NOMORE(HMI_ValueStruct.Max_Corner, default_max_jerk[E_AXIS] * 2 * MINUNITMULT); - NOLESS(HMI_ValueStruct.Max_Corner, (MIN_MAXCORNER) * MINUNITMULT); - // MaxCorner value - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + // MaxJerk limit + if (HMI_flag.jerk_flag == X_AXIS) + NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[X_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.jerk_flag == Y_AXIS) + NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[Y_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.jerk_flag == Z_AXIS) + NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[Z_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.jerk_flag == E_AXIS) + NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[E_AXIS] * 2 * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXCORNER) * MINUNITMULT); + // MaxJerk value + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); } } @@ -1707,7 +1707,7 @@ void HMI_SDCardUpdate(void) { void HMI_StartFrame(const bool with_update) { Goto_MainMenu(); - DWIN_Draw_Rectangle(1, Background_black, 0, 360, 272, 479); + DWIN_Draw_Rectangle(1, Background_black, 0, 360, DWIN_WIDTH, DWIN_HEIGHT - 1); DWIN_ICON_Show(ICON, ICON_HotendTemp, 13, 381); #if HOTENDS > 1 @@ -1724,7 +1724,7 @@ void HMI_StartFrame(const bool with_update) { DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + (2 + 3) * STAT_CHR_W + 2, 429, F("%")); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 5 * STAT_CHR_W + 2, 429, F("%")); DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178, 429, BABY_Z_VAR * 100); DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); @@ -1743,23 +1743,23 @@ inline void Draw_Info_Menu() { DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 30, 17, 271 - 214, 479 - 450, 14, 8); + DWIN_Frame_AreaCopy(1, 30, 17, 57, 29, 14, 8); - DWIN_Frame_AreaCopy(1, 197, 149, 271 - 19, 479 - 318, 108, 102); - DWIN_Frame_AreaCopy(1, 1, 164, 271 - 215, 479 - 303, 108, 175); - DWIN_Frame_AreaCopy(1, 58, 164, 271 - 158, 479 - 303, 105, 248); + DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); + DWIN_Frame_AreaCopy(1, 1, 164, 56, 176, 108, 175); + DWIN_Frame_AreaCopy(1, 58, 164, 113, 176, 105, 248); DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_C); } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_INFO_SCREEN)); #else - DWIN_Frame_AreaCopy(1, 190, 16, 271 - 56, 479 - 453, 14, 8); + DWIN_Frame_AreaCopy(1, 190, 16, 215, 26, 14, 8); #endif - DWIN_Frame_AreaCopy(1, 120, 150, 146, 479 - 318, 124, 102); - DWIN_Frame_AreaCopy(1, 146, 151, 271 - 17, 479 - 318, 82, 175); - DWIN_Frame_AreaCopy(1, 0, 165, 271 - 177, 479 - 304, 89, 248); + DWIN_Frame_AreaCopy(1, 120, 150, 146, 161, 124, 102); + DWIN_Frame_AreaCopy(1, 146, 151, 254, 161, 82, 175); + DWIN_Frame_AreaCopy(1, 0, 165, 94, 175, 89, 248); DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(CORP_WEBSITE_E) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_E); } @@ -1774,13 +1774,13 @@ inline void Draw_Print_File_Menu() { Clear_Title_Bar(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 0, 31, 271 - 216, 479 - 435, 14, 8); + DWIN_Frame_AreaCopy(1, 0, 31, 55, 44, 14, 8); } else { #ifdef USE_STRING_HEADINGS Draw_Title("Print file"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 52, 31, 271 - 134, 479 - 438, 14, 8); // "Print file" + DWIN_Frame_AreaCopy(1, 52, 31, 137, 41, 14, 8); // "Print file" #endif } @@ -2054,8 +2054,7 @@ void HMI_Printing(void) { Popup_window_PauseOrStop(); break; - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -2121,25 +2120,25 @@ inline void Draw_Move_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 192, 1, 271 - 38, 479 - 465, 14, 8); - DWIN_Frame_AreaCopy(1, 58, 118, 271 - 165, 479 - 347, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 109, 118, 271 - 114, 479 - 347, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 160, 118, 271 - 62, 479 - 347, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 192, 1, 233, 14, 14, 8); + DWIN_Frame_AreaCopy(1, 58, 118, 106, 132, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 109, 118, 157, 132, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 160, 118, 209, 132, LBLX, MBASE(3)); #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 212, 118, 271 - 18, 479 - 348, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 212, 118, 253, 131, LBLX, MBASE(4)); #endif } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOVE_AXIS)); #else - DWIN_Frame_AreaCopy(1, 231, 2, 271 - 6, 479 - 467, 14, 8); + DWIN_Frame_AreaCopy(1, 231, 2, 265, 12, 14, 8); #endif - draw_move_en(MBASE(1)); say_x(33 + 3, MBASE(1)); // "Move X" - draw_move_en(MBASE(2)); say_y(33 + 3, MBASE(2)); // "Move Y" - draw_move_en(MBASE(3)); say_z(33 + 3, MBASE(3)); // "Move Z" + draw_move_en(MBASE(1)); say_x(36, MBASE(1)); // "Move X" + draw_move_en(MBASE(2)); say_y(36, MBASE(2)); // "Move Y" + draw_move_en(MBASE(3)); say_z(36, MBASE(3)); // "Move Z" #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 123, 192, 271 - 95, 479 - 277, LBLX, MBASE(4)); // "Extruder" + DWIN_Frame_AreaCopy(1, 123, 192, 176, 202, LBLX, MBASE(4)); // "Extruder" #endif } @@ -2277,8 +2276,7 @@ void HMI_Prepare(void) { } Draw_Prepare_Menu(); break; - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -2288,13 +2286,13 @@ void Draw_Temperature_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 236, 2, 271 - 8, 479 - 466, 14, 8); + DWIN_Frame_AreaCopy(1, 236, 2, 263, 13, 14, 8); - DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 115, 134, 271 - 101, 479 - 333, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 100, 89, 271 - 93, 479 - 378, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 180, 89, 271 - 11, 479 - 379, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 100, 89, 178, 101, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 180, 89, 260, 100, LBLX, MBASE(5)); } else { #ifdef USE_STRING_HEADINGS @@ -2305,18 +2303,18 @@ void Draw_Temperature_Menu() { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("PLA Preheat Settings")); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), F("ABS Preheat Settings")); #else - DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(1)); // Nozzle... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(1)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(2)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(3)); // Fan speed - DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(4)); // Preheat... - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX + 49 + 3, MBASE(4)); // ...PLA - DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 24 + 6, MBASE(4)); // PLA setting - DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(5)); // Preheat... - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 49 + 3, MBASE(5)); // ...ABS - DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 3 + 26 + 3, MBASE(5)); // ABS setting + DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(1)); // Nozzle... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(1)); // ...Temperature + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(2)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(2)); // ...Temperature + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(3)); // Fan speed + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(4)); // Preheat... + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(4)); // ...PLA + DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 79, MBASE(4)); // PLA setting + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(5)); // Preheat... + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(5)); // ...ABS + DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 81, MBASE(5)); // ABS setting #endif } @@ -2351,9 +2349,9 @@ void HMI_Control(void) { if (index_control > MROWS) { Draw_More_Icon(6 + MROWS - index_control); // Info > if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 231, 104, 271 - 13, 479 - 363, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, MBASE(5)); else - DWIN_Frame_AreaCopy(1, 0, 104, 271 - 247, 479 - 365, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, MBASE(5)); } } else { @@ -2414,8 +2412,7 @@ void HMI_Control(void) { checkkey = Info; Draw_Info_Menu(); break; - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -2563,15 +2560,15 @@ void HMI_Temperature(void) { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 59, 16, 271 - 132, 479 - 450, 14, 8); + DWIN_Frame_AreaCopy(1, 59, 16, 139, 29, 14, 8); - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479 - 378, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX + 24, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479 - 378, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX + 24, MBASE(2)); // PLA bed temp - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479 - 378, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 271 - 101, 479 - 333, LBLX + 24, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 72, 148, 271 - 120, 479 - 317, LBLX, MBASE(4)); // save PLA configuration + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(1)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(2)); // PLA bed temp + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(3)); // PLA fan speed + DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(4)); // save PLA configuration } else { #ifdef USE_STRING_HEADINGS @@ -2581,16 +2578,16 @@ void HMI_Temperature(void) { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_FAN_SPEED)); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STORE_EEPROM)); #else - DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // PLA bed temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); // save PLA configuration + DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(1)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(2) + 3); // PLA bed temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(3)); // PLA fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(4)); // save PLA configuration #endif } @@ -2617,16 +2614,16 @@ void HMI_Temperature(void) { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 142, 16, 271 - 48, 479 - 450, 14, 8); + DWIN_Frame_AreaCopy(1, 142, 16, 223, 29, 14, 8); - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX + 24, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX + 24, MBASE(2)); // ABS bed temp - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 271 - 101, 479 - 333, LBLX + 24, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 72, 148, 271 - 120, 479 - 317, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX + 28, MBASE(4) + 2); // save ABS configuration + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(1)); // ABS nozzle temp + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(2)); // ABS bed temp + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(3)); // ABS fan speed + DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX + 28, MBASE(4) + 2); // save ABS configuration } else { #ifdef USE_STRING_HEADINGS @@ -2636,17 +2633,17 @@ void HMI_Temperature(void) { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_FAN_SPEED)); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STORE_EEPROM)); #else - DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // ABS bed temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 33, MBASE(4)); // save ABS configuration + DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(1)); // ABS nozzle temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(2) + 3); // ABS bed temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(3)); // ABS fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 33, MBASE(4)); // save ABS configuration #endif } @@ -2674,20 +2671,20 @@ inline void Draw_Max_Speed_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); auto say_max_speed = [](const uint16_t row) { - DWIN_Frame_AreaCopy(1, 173, 133, 228, 479 - 332, LBLX, row); // "Max speed" + DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, row); // "Max speed" }; - say_max_speed(MBASE(1)); // "Max speed" - DWIN_Frame_AreaCopy(1, 229, 133, 236, 479 - 332, LBLX + 55 + 3, MBASE(1)); // X - say_max_speed(MBASE(2)); // "Max speed" - DWIN_Frame_AreaCopy(1, 1, 150, 271 - 264, 479 - 319, LBLX + 55 + 3, MBASE(2) + 3); // Y - say_max_speed(MBASE(3)); // "Max speed" - DWIN_Frame_AreaCopy(1, 9, 150, 271 - 255, 479 - 319, LBLX + 55 + 3, MBASE(3) + 3); // Z - say_max_speed(MBASE(4)); // "Max speed" - DWIN_Frame_AreaCopy(1, 18, 150, 271 - 246, 479 - 319, LBLX + 55 + 3, MBASE(4) + 3); // E + say_max_speed(MBASE(1)); // "Max speed" + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(1)); // X + say_max_speed(MBASE(2)); // "Max speed" + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(2) + 3); // Y + say_max_speed(MBASE(3)); // "Max speed" + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(3) + 3); // Z + say_max_speed(MBASE(4)); // "Max speed" + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 58, MBASE(4) + 3); // E } else { #ifdef USE_STRING_HEADINGS @@ -2697,22 +2694,22 @@ inline void Draw_Max_Speed_Menu() { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Feedrate Z")); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Feedrate E")); #else - DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); draw_max_en(MBASE(1)); // "Max" - DWIN_Frame_AreaCopy(1, 184, 119, 271 - 37, 479 - 347, LBLX + 24 + 3, MBASE(1)); // "Speed X" + DWIN_Frame_AreaCopy(1, 184, 119, 234, 132, LBLX + 27, MBASE(1)); // "Speed X" draw_max_en(MBASE(2)); // "Max" - draw_speed_en(24 + 3, MBASE(2)); // "Speed" - say_y(24 + 40 + 6, MBASE(2)); // "Y" + draw_speed_en(27, MBASE(2)); // "Speed" + say_y(70, MBASE(2)); // "Y" draw_max_en(MBASE(3)); // "Max" - draw_speed_en(24 + 3, MBASE(3)); // "Speed" - say_z(24 + 40 + 6, MBASE(3)); // "Z" + draw_speed_en(27, MBASE(3)); // "Speed" + say_z(70, MBASE(3)); // "Z" draw_max_en(MBASE(4)); // "Max" - draw_speed_en(24 + 3, MBASE(4)); // "Speed" - say_e(24 + 40 + 6, MBASE(4)); // "E" + draw_speed_en(27, MBASE(4)); // "Speed" + say_e(70, MBASE(4)); // "E" #endif } @@ -2729,20 +2726,20 @@ inline void Draw_Max_Accel_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(1) + 1); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 479 - 332, LBLX + 27 + 41 + 3, MBASE(1)); // max acceleration X - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(2) + 1); - DWIN_Frame_AreaCopy(1, 1, 150, 271 - 264, 479 - 319, LBLX + 27 + 41 + 3, MBASE(2) + 2); // max acceleration Y - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(3) + 1); - DWIN_Frame_AreaCopy(1, 9, 150, 271 - 255, 479 - 319, LBLX + 27 + 41 + 3, MBASE(3) + 2); // max acceleration Z - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(4) + 1); - DWIN_Frame_AreaCopy(1, 18, 150, 271 - 246, 479 - 319, LBLX + 27 + 41 + 3, MBASE(4) + 2); // max acceleration E + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(1) + 1); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 71, MBASE(1)); // Max acceleration X + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(2) + 1); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 71, MBASE(2) + 2); // Max acceleration Y + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(3) + 1); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 71, MBASE(3) + 2); // Max acceleration Z + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 71, MBASE(4) + 2); // Max acceleration E } else { #ifdef USE_STRING_HEADINGS @@ -2752,11 +2749,11 @@ inline void Draw_Max_Accel_Menu() { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Accel Z")); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Accel E")); #else - DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); - draw_max_accel_en(MBASE(1)); say_x(24 + 78 + 6, MBASE(1)); // "Max Acceleration X" - draw_max_accel_en(MBASE(2)); say_y(24 + 78 + 6, MBASE(2)); // "Max Acceleration Y" - draw_max_accel_en(MBASE(3)); say_z(24 + 78 + 6, MBASE(3)); // "Max Acceleration Z" - draw_max_accel_en(MBASE(4)); say_e(24 + 78 + 6, MBASE(4)); // "Max Acceleration E" + DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); + draw_max_accel_en(MBASE(1)); say_x(108, MBASE(1)); // "Max Acceleration X" + draw_max_accel_en(MBASE(2)); say_y(108, MBASE(2)); // "Max Acceleration Y" + draw_max_accel_en(MBASE(3)); say_z(108, MBASE(3)); // "Max Acceleration Z" + draw_max_accel_en(MBASE(4)); say_e(108, MBASE(4)); // "Max Acceleration E" #endif } @@ -2773,24 +2770,24 @@ inline void Draw_Max_Jerk_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(1) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 53, MBASE(1)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 479 - 332, LBLX + 80 + 3, MBASE(1)); // max corner speed X - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(2) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 53, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 150, 271 - 264, 479 - 319, LBLX + 80 + 3, MBASE(2) + 3); // max corner speed Y - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(3) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 53, MBASE(3)); - DWIN_Frame_AreaCopy(1, 9, 150, 271 - 255, 479 - 319, LBLX + 80 + 3, MBASE(3) + 3); // max corner speed Z - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(4) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 53, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 271 - 246, 479 - 319, LBLX + 80 + 3, MBASE(4) + 3); // max corner speed E + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(1)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max jerk speed X + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max jerk speed Y + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(3)); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max jerk speed Z + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max jerk speed E } else { #ifdef USE_STRING_HEADINGS @@ -2800,31 +2797,31 @@ inline void Draw_Max_Jerk_Menu() { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Jerk Z")); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Jerk E")); #else - DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); - draw_max_en(MBASE(1)); // "Max" - draw_corner_en(MBASE(1)); // "Corner" - draw_speed_en(66 + 6, MBASE(1)); // "Speed" - say_x(106 + 9, MBASE(1)); // "X" + DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); + draw_max_en(MBASE(1)); // "Max" + draw_jerk_en(MBASE(1)); // "Jerk" + draw_speed_en(72, MBASE(1)); // "Speed" + say_x(115, MBASE(1)); // "X" - draw_max_en(MBASE(2)); // "Max" - draw_corner_en(MBASE(2)); // "Corner" - draw_speed_en(66 + 6, MBASE(2)); // "Speed" - say_y(106 + 9, MBASE(2)); // "Y" + draw_max_en(MBASE(2)); // "Max" + draw_jerk_en(MBASE(2)); // "Jerk" + draw_speed_en(72, MBASE(2)); // "Speed" + say_y(115, MBASE(2)); // "Y" - draw_max_en(MBASE(3)); // "Max" - draw_corner_en(MBASE(3)); // "Corner" - draw_speed_en(66 + 6, MBASE(3)); // "Speed" - say_z(106 + 9, MBASE(3)); // "Z" + draw_max_en(MBASE(3)); // "Max" + draw_jerk_en(MBASE(3)); // "Jerk" + draw_speed_en(72, MBASE(3)); // "Speed" + say_z(115, MBASE(3)); // "Z" - draw_max_en(MBASE(4)); // "Max" - draw_corner_en(MBASE(4)); // "Corner" - draw_speed_en(66 + 6, MBASE(4)); // "Speed" - say_e(106 + 9, MBASE(4)); // "E" + draw_max_en(MBASE(4)); // "Max" + draw_jerk_en(MBASE(4)); // "Jerk" + draw_speed_en(72, MBASE(4)); // "Speed" + say_e(115, MBASE(4)); // "E" #endif } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeedCornerX + i); + LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); @@ -2836,16 +2833,16 @@ inline void Draw_Steps_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); - DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 479 - 332, LBLX + 41 + 3, MBASE(1)); // Transmission Ratio X - DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 150, 271 - 264, 479 - 319, LBLX + 41 + 3, MBASE(2) + 3); // Transmission Ratio Y - DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 9, 150, 271 - 255, 479 - 319, LBLX + 41 + 3, MBASE(3) + 3); // Transmission Ratio Z - DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 271 - 246, 479 - 319, LBLX + 41 + 3, MBASE(4) + 3); // Transmission Ratio E + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 44, MBASE(1)); // Transmission Ratio X + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 44, MBASE(2) + 3); // Transmission Ratio Y + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 44, MBASE(3) + 3); // Transmission Ratio Z + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 44, MBASE(4) + 3); // Transmission Ratio E } else { #ifdef USE_STRING_HEADINGS @@ -2855,11 +2852,11 @@ inline void Draw_Steps_Menu() { DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Steps/mm Z")); DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Steps/mm E")); #else - DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); - draw_steps_per_mm(MBASE(1)); say_x(100 + 3, MBASE(1)); // "Steps-per-mm X" - draw_steps_per_mm(MBASE(2)); say_y(100 + 3, MBASE(2)); // "Y" - draw_steps_per_mm(MBASE(3)); say_z(100 + 3, MBASE(3)); // "Z" - draw_steps_per_mm(MBASE(4)); say_e(100 + 3, MBASE(4)); // "E" + DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); + draw_steps_per_mm(MBASE(1)); say_x(103, MBASE(1)); // "Steps-per-mm X" + draw_steps_per_mm(MBASE(2)); say_y(103, MBASE(2)); // "Y" + draw_steps_per_mm(MBASE(3)); say_z(103, MBASE(3)); // "Z" + draw_steps_per_mm(MBASE(4)); say_e(103, MBASE(4)); // "E" #endif } @@ -2902,9 +2899,9 @@ void HMI_Motion(void) { select_acc.reset(); Draw_Max_Accel_Menu(); break; - case 3: // max corner speed - checkkey = MaxCorner; - select_corner.reset(); + case 3: // max jerk speed + checkkey = MaxJerk; + select_jerk.reset(); Draw_Max_Jerk_Menu(); break; case 4: // transmission ratio @@ -2912,8 +2909,7 @@ void HMI_Motion(void) { select_step.reset(); Draw_Steps_Menu(); break; - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -3139,8 +3135,7 @@ void HMI_ABSPreheatSetting(void) { HMI_AudioFeedback(success); } break; #endif - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -3193,8 +3188,7 @@ void HMI_MaxSpeed(void) { DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); EncoderRate.encoderRateEnabled = 1; break; - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -3247,62 +3241,60 @@ void HMI_MaxAcceleration(void) { DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); EncoderRate.encoderRateEnabled = 1; break; - default: - break; + default: break; } } DWIN_UpdateLCD(); } -/* Max Corner */ -void HMI_MaxCorner(void) { +/* Max Jerk */ +void HMI_MaxJerk(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_corner.inc(4)) Move_Highlight(1, select_corner.now); + if (select_jerk.inc(4)) Move_Highlight(1, select_jerk.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_corner.dec()) Move_Highlight(-1, select_corner.now); + if (select_jerk.dec()) Move_Highlight(-1, select_jerk.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_corner.now) { + switch (select_jerk.now) { case 0: // back checkkey = Motion; select_motion.now = 3; Draw_Motion_Menu(); break; - case 1: // max corner X - checkkey = MaxCorner_value; - HMI_flag.corner_flag = X_AXIS; - HMI_ValueStruct.Max_Corner = planner.max_jerk[X_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + case 1: // max jerk X + checkkey = MaxJerk_value; + HMI_flag.jerk_flag = X_AXIS; + HMI_ValueStruct.Max_Jerk = planner.max_jerk[X_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); EncoderRate.encoderRateEnabled = 1; break; - case 2: // max corner Y - checkkey = MaxCorner_value; - HMI_flag.corner_flag = Y_AXIS; - HMI_ValueStruct.Max_Corner = planner.max_jerk[Y_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + case 2: // max jerk Y + checkkey = MaxJerk_value; + HMI_flag.jerk_flag = Y_AXIS; + HMI_ValueStruct.Max_Jerk = planner.max_jerk[Y_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); EncoderRate.encoderRateEnabled = 1; break; - case 3: // max corner Z - checkkey = MaxCorner_value; - HMI_flag.corner_flag = Z_AXIS; - HMI_ValueStruct.Max_Corner = planner.max_jerk[Z_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + case 3: // max jerk Z + checkkey = MaxJerk_value; + HMI_flag.jerk_flag = Z_AXIS; + HMI_ValueStruct.Max_Jerk = planner.max_jerk[Z_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); EncoderRate.encoderRateEnabled = 1; break; - case 4: // max corner E - checkkey = MaxCorner_value; - HMI_flag.corner_flag = E_AXIS; - HMI_ValueStruct.Max_Corner = planner.max_jerk[E_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + case 4: // max jerk E + checkkey = MaxJerk_value; + HMI_flag.jerk_flag = E_AXIS; + HMI_ValueStruct.Max_Jerk = planner.max_jerk[E_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); EncoderRate.encoderRateEnabled = 1; break; - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -3355,8 +3347,7 @@ void HMI_Step(void) { DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); EncoderRate.encoderRateEnabled = 1; break; - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -3406,7 +3397,7 @@ void EachMomentUpdate(void) { // show print done confirm DWIN_Draw_Rectangle(1, Background_black, 0, 250, 271, 360); - DWIN_ICON_Show(ICON, HMI_flag.language_chinese ? ICON_Confirm_C : ICON_Confirm_E, 86, 302 - 19); + DWIN_ICON_Show(ICON, HMI_flag.language_chinese ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); } else if (HMI_flag.pause_flag != printingIsPaused()) { // print status update @@ -3553,7 +3544,7 @@ void DWIN_HandleScreen(void) { case ABSPreheat: HMI_ABSPreheatSetting(); break; case MaxSpeed: HMI_MaxSpeed(); break; case MaxAcceleration: HMI_MaxAcceleration(); break; - case MaxCorner: HMI_MaxCorner(); break; + case MaxJerk: HMI_MaxJerk(); break; case Step: HMI_Step(); break; case Move_X: HMI_Move_X(); break; case Move_Y: HMI_Move_Y(); break; @@ -3572,7 +3563,7 @@ void DWIN_HandleScreen(void) { case PrintSpeed: HMI_PrintSpeed(); break; case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break; case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break; - case MaxCorner_value: HMI_MaxCornerXYZE(); break; + case MaxJerk_value: HMI_MaxJerkXYZE(); break; case Step_value: HMI_StepXYZE(); break; default: break; } diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index e5d95f6166..467cc433e7 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -52,8 +52,8 @@ enum processID { MaxSpeed_value, MaxAcceleration, MaxAcceleration_value, - MaxCorner, - MaxCorner_value, + MaxJerk, + MaxJerk_value, Step, Step_value, @@ -150,7 +150,7 @@ enum processID { #define ICON_MaxSpeed 51 #define ICON_MaxAccelerated 52 -#define ICON_MaxCorner 53 +#define ICON_MaxJerk 53 #define ICON_Step 54 #define ICON_PrintSize 55 #define ICON_Version 56 @@ -164,10 +164,10 @@ enum processID { #define ICON_MaxAccY 64 #define ICON_MaxAccZ 65 #define ICON_MaxAccE 66 -#define ICON_MaxSpeedCornerX 67 -#define ICON_MaxSpeedCornerY 68 -#define ICON_MaxSpeedCornerZ 69 -#define ICON_MaxSpeedCornerE 70 +#define ICON_MaxSpeedJerkX 67 +#define ICON_MaxSpeedJerkY 68 +#define ICON_MaxSpeedJerkZ 69 +#define ICON_MaxSpeedJerkE 70 #define ICON_StepX 71 #define ICON_StepY 72 #define ICON_StepZ 73 @@ -231,7 +231,7 @@ typedef struct { int16_t print_speed = 100; float Max_Feedspeed = 0; float Max_Acceleration = 0; - float Max_Corner = 0; + float Max_Jerk = 0; float Max_Step = 0; float Move_X_scale = 0; float Move_Y_scale = 0; @@ -261,7 +261,7 @@ typedef struct { char feedspeed_flag; #endif char acc_flag; - char corner_flag; + char jerk_flag; char step_flag; } HMI_Flag; @@ -314,7 +314,7 @@ void HMI_PrintSpeed(void); void HMI_MaxFeedspeedXYZE(void); void HMI_MaxAccelerationXYZE(void); -void HMI_MaxCornerXYZE(void); +void HMI_MaxJerkXYZE(void); void HMI_StepXYZE(void); void update_variable(void); @@ -332,28 +332,28 @@ void Icon_leveling(bool value); // Other bool Pause_HeatStatus(); -void HMI_StartFrame(const bool with_update); // startup screen -void HMI_MainMenu(void); // main process screen -void HMI_SelectFile(void); // file page -void HMI_Printing(void); // print page -void HMI_Prepare(void); // prepare page -void HMI_Control(void); // control page -void HMI_Leveling(void); // Level the page -void HMI_AxisMove(void); // Axis movement menu -void HMI_Temperature(void); // Temperature menu -void HMI_Motion(void); // Sports menu -void HMI_Info(void); // Information menu -void HMI_Tune(void); // Adjust the menu +void HMI_StartFrame(const bool with_update); // Startup screen +void HMI_MainMenu(void); // Main process screen +void HMI_SelectFile(void); // File page +void HMI_Printing(void); // Print page +void HMI_Prepare(void); // Prepare page +void HMI_Control(void); // Control page +void HMI_Leveling(void); // Level the page +void HMI_AxisMove(void); // Axis movement menu +void HMI_Temperature(void); // Temperature menu +void HMI_Motion(void); // Sports menu +void HMI_Info(void); // Information menu +void HMI_Tune(void); // Adjust the menu #if HAS_HOTEND void HMI_PLAPreheatSetting(void); // PLA warm-up setting void HMI_ABSPreheatSetting(void); // ABS warm-up setting #endif -void HMI_MaxSpeed(void); // Maximum speed submenu -void HMI_MaxAcceleration(void); // Maximum acceleration submenu -void HMI_MaxCorner(void); // Maximum corner speed submenu -void HMI_Step(void); // transmission ratio +void HMI_MaxSpeed(void); // Maximum speed submenu +void HMI_MaxAcceleration(void); // Maximum acceleration submenu +void HMI_MaxJerk(void); // Maximum jerk speed submenu +void HMI_Step(void); // Transmission ratio void HMI_Init(void); void DWIN_Update(void); From fbd812ebb346284398618c1d413e37041b27f4dc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 16 Sep 2020 06:56:48 -0500 Subject: [PATCH 0241/1370] More DWIN cleanup --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 707 +++++++++++++----------------- Marlin/src/lcd/dwin/e3v2/dwin.h | 8 +- 2 files changed, 317 insertions(+), 398 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 1bef8f1408..c942929805 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -32,6 +32,10 @@ #define HAS_ONESTEP_LEVELING 1 #endif +#if HAS_HOTEND || HAS_HEATED_BED || HAS_FAN + #define HAS_COOLDOWN 1 +#endif + #include "dwin.h" #include @@ -116,7 +120,7 @@ // Feedspeed limit (max feedspeed = DEFAULT_MAX_FEEDRATE * 2) #define MIN_MAXFEEDSPEED 1 #define MIN_MAXACCELERATION 1 -#define MIN_MAXCORNER 0.1 +#define MIN_MAXJERK 0.1 #define MIN_STEP 1 #define FEEDRATE_E (60) @@ -134,7 +138,7 @@ constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other LBLX = 60, // Menu item label X MENU_CHR_W = 8, STAT_CHR_W = 10; -#define MBASE(L) (49 + (L)*MLINE) +#define MBASE(L) (49 + MLINE * (L)) #define BABY_Z_VAR TERN(HAS_BED_PROBE, probe.offset.z, dwin_zoffset) @@ -415,7 +419,7 @@ inline void Clear_Main_Window(void) { inline void Clear_Popup_Area(void) { Clear_Title_Bar(); - DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); + DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); } void Draw_Popup_Bkgd_105(void) { @@ -423,16 +427,16 @@ void Draw_Popup_Bkgd_105(void) { } inline void Draw_More_Icon(const uint8_t line) { - DWIN_ICON_Show(ICON, ICON_More, 226, 46 + line * MLINE); + DWIN_ICON_Show(ICON, ICON_More, 226, MBASE(line) - 3); } inline void Draw_Menu_Cursor(const uint8_t line) { - // DWIN_ICON_Show(ICON,ICON_Rectangle, 0, 31 + line * MLINE); - DWIN_Draw_Rectangle(1, Rectangle_Color, 0, 31 + line * MLINE, 14, 31 + (line + 1) * MLINE - 2); + // DWIN_ICON_Show(ICON,ICON_Rectangle, 0, MBASE(line) - 18); + DWIN_Draw_Rectangle(1, Rectangle_Color, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); } inline void Erase_Menu_Cursor(const uint8_t line) { - DWIN_Draw_Rectangle(1, Background_black, 0, 31 + line * MLINE, 14, 31 + (line + 1) * MLINE - 2); + DWIN_Draw_Rectangle(1, Background_black, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); } inline void Move_Highlight(const int16_t from, const uint16_t newline) { @@ -442,7 +446,7 @@ inline void Move_Highlight(const int16_t from, const uint16_t newline) { inline void Add_Menu_Line() { Move_Highlight(1, MROWS); - DWIN_Draw_Line(Line_Color, 16, 82 + MROWS * MLINE, 256, 83 + MROWS * MLINE); + DWIN_Draw_Line(Line_Color, 16, MBASE(MROWS + 1) - 20, 256, MBASE(MROWS + 1) - 19); } inline void Scroll_Menu(const uint8_t dir) { @@ -458,17 +462,17 @@ inline uint16_t nr_sd_menu_items() { } inline void Draw_Menu_Icon(const uint8_t line, const uint8_t icon) { - DWIN_ICON_Show(ICON, icon, 26, 46 + line * MLINE); + DWIN_ICON_Show(ICON, icon, 26, MBASE(line) - 3); } inline void Erase_Menu_Text(const uint8_t line) { - DWIN_Draw_Rectangle(1, Background_black, LBLX, 31 + line * MLINE + 4, 271, 28 + (line + 1) * MLINE - 4); + DWIN_Draw_Rectangle(1, Background_black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); } inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr) { - if (label) DWIN_Draw_String(false, false, font8x16, White, Background_black, LBLX, 48 + line * MLINE, (char*)label); + if (label) DWIN_Draw_String(false, false, font8x16, White, Background_black, LBLX, MBASE(line) - 1, (char*)label); if (icon) Draw_Menu_Icon(line, icon); - DWIN_Draw_Line(Line_Color, 16, 29 + (line + 1) * MLINE, 256, 30 + (line + 1) * MLINE); + DWIN_Draw_Line(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); } // The "Back" label is always on the first line @@ -494,6 +498,8 @@ inline void draw_move_en(const uint16_t line) { DWIN_Frame_AreaCopy(1, 69, 61, 102, 71, LBLX, line); // "Move" } +inline void DWIN_Frame_TitleCopy(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { DWIN_Frame_AreaCopy(id, x1, y1, x2, y2, 14, 8); } + inline void Prepare_Item_Move(const uint8_t row) { if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 159, 70, 200, 84, LBLX, MBASE(row)); @@ -523,17 +529,17 @@ inline void Prepare_Item_Offset(const uint8_t row) { if (HMI_flag.language_chinese) { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); #else DWIN_Frame_AreaCopy(1, 43, 89, 98, 101, LBLX, MBASE(row)); #endif } else { #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); + DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); #else - DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." + DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." #endif } Draw_Menu_Line(row, ICON_SetHome); @@ -544,8 +550,8 @@ inline void Prepare_Item_PLA(const uint8_t row) { DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row)); } else { - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" } Draw_Menu_Line(row, ICON_PLAPreheat); } @@ -555,17 +561,17 @@ inline void Prepare_Item_ABS(const uint8_t row) { DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row)); } else { - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" } Draw_Menu_Line(row, ICON_ABSPreheat); } inline void Prepare_Item_Cool(const uint8_t row) { if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); else - DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" + DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" Draw_Menu_Line(row, ICON_Cool); } @@ -589,13 +595,13 @@ inline void Draw_Prepare_Menu() { #define PVISI(L) WITHIN(PSCROL(L), 0, MROWS) if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 133, 1, 160, 13, 14, 8); // "Prepare" + DWIN_Frame_TitleCopy(1, 133, 1, 160, 13); // "Prepare" } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_PREPARE)); #else - DWIN_Frame_AreaCopy(1, 178, 2, 229, 14, 14, 8); // "Prepare" + DWIN_Frame_TitleCopy(1, 178, 2, 229, 14); // "Prepare" #endif } @@ -615,13 +621,13 @@ inline void Draw_Prepare_Menu() { inline void Draw_Control_Menu() { Clear_Main_Window(); - const int16_t scroll = TERN(HAS_ONESTEP_LEVELING, MROWS - index_control, 0); // Scrolled-up lines + const int16_t scroll = TERN(HAS_ONESTEP_LEVELING, MROWS - index_control, 0); // Scrolled-up lines #define CSCROL(L) (scroll + (L)) #define CLINE(L) MBASE(CSCROL(L)) #define CVISI(L) WITHIN(CSCROL(L), 0, MROWS) - if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back + if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 1, 130, 14, 14, 8); @@ -637,15 +643,15 @@ inline void Draw_Control_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_CONTROL)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), GET_TEXT_F(MSG_MOTION)); #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); - if (CVISI(6)) DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 5), F("Info")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(5), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + if (CVISI(6)) DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(6), F("Info")); #else - if (CVISI(3)) DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Info")); + if (CVISI(3)) DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Info")); #endif #else DWIN_Frame_AreaCopy(1, 128, 2, 176, 12, 14, 8); @@ -690,11 +696,11 @@ inline void Draw_Tune_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TUNE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), GET_TEXT_F(MSG_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), GET_TEXT_F(MSG_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(5), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else DWIN_Frame_AreaCopy(1, 94, 2, 126, 12, 14, 9); DWIN_Frame_AreaCopy(1, 1, 179, 92, 190, LBLX, MBASE(1)); // print speed @@ -769,10 +775,10 @@ inline void Draw_Motion_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOTION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Feedrate")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_ACCELERATION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STEPS_PER_MM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Feedrate")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), GET_TEXT_F(MSG_ACCELERATION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_STEPS_PER_MM)); #else DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); draw_max_en(MBASE(1)); draw_speed_en(27, MBASE(1)); // "Max Speed" @@ -1035,7 +1041,7 @@ void HMI_Move_X(void) { } NOLESS(HMI_ValueStruct.Move_X_scale, (X_MIN_POS) * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_X_scale, (X_MAX_POS) * MINUNITMULT); - current_position[X_AXIS] = HMI_ValueStruct.Move_X_scale / 10; + current_position.x = HMI_ValueStruct.Move_X_scale / 10; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); DWIN_UpdateLCD(); } @@ -1064,7 +1070,7 @@ void HMI_Move_Y(void) { } NOLESS(HMI_ValueStruct.Move_Y_scale, (Y_MIN_POS) * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_Y_scale, (Y_MAX_POS) * MINUNITMULT); - current_position[Y_AXIS] = HMI_ValueStruct.Move_Y_scale / 10; + current_position.y = HMI_ValueStruct.Move_Y_scale / 10; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); DWIN_UpdateLCD(); } @@ -1093,13 +1099,13 @@ void HMI_Move_Z(void) { } NOLESS(HMI_ValueStruct.Move_Z_scale, Z_MIN_POS * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_Z_scale, Z_MAX_POS * MINUNITMULT); - current_position[Z_AXIS] = HMI_ValueStruct.Move_Z_scale / 10; + current_position.z = HMI_ValueStruct.Move_Z_scale / 10; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); DWIN_UpdateLCD(); } } -#if EXTRUDERS +#if HAS_HOTEND void HMI_Move_E(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); @@ -1335,7 +1341,7 @@ void HMI_PrintSpeed(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = Tune; EncoderRate.encoderRateEnabled = 0; - feedrate_percentage = HMI_ValueStruct.print_speed; + feedrate_percentage = HMI_ValueStruct.print_speed; DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1 + MROWS - index_tune), HMI_ValueStruct.print_speed); return; } @@ -1359,22 +1365,14 @@ void HMI_MaxFeedspeedXYZE(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = MaxSpeed; EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.feedspeed_flag == X_AXIS) planner.set_max_feedrate(X_AXIS, HMI_ValueStruct.Max_Feedspeed); - else if (HMI_flag.feedspeed_flag == Y_AXIS) planner.set_max_feedrate(Y_AXIS, HMI_ValueStruct.Max_Feedspeed); - else if (HMI_flag.feedspeed_flag == Z_AXIS) planner.set_max_feedrate(Z_AXIS, HMI_ValueStruct.Max_Feedspeed); - #if HAS_HOTEND - else if (HMI_flag.feedspeed_flag == E_AXIS) planner.set_max_feedrate(E_AXIS, HMI_ValueStruct.Max_Feedspeed); - #endif + if (WITHIN(HMI_flag.feedspeed_flag, X_AXIS, E_AXIS)) + planner.set_max_feedrate(HMI_flag.feedspeed_flag, HMI_ValueStruct.Max_Feedspeed); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); return; } // MaxFeedspeed limit - if (HMI_flag.feedspeed_flag == X_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[X_AXIS] * 2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[X_AXIS] * 2; } - else if (HMI_flag.feedspeed_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Y_AXIS] * 2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Y_AXIS] * 2; } - else if (HMI_flag.feedspeed_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Z_AXIS] * 2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Z_AXIS] * 2; } - #if HAS_HOTEND - else if (HMI_flag.feedspeed_flag == E_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[E_AXIS] * 2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[E_AXIS] * 2; } - #endif + if (WITHIN(HMI_flag.feedspeed_flag, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Feedspeed, default_max_feedrate[HMI_flag.feedspeed_flag] * 2); if (HMI_ValueStruct.Max_Feedspeed < MIN_MAXFEEDSPEED) HMI_ValueStruct.Max_Feedspeed = MIN_MAXFEEDSPEED; // MaxFeedspeed value DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); @@ -1399,12 +1397,8 @@ void HMI_MaxAccelerationXYZE(void) { return; } // MaxAcceleration limit - if (HMI_flag.acc_flag == X_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[X_AXIS] * 2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[X_AXIS] * 2; } - else if (HMI_flag.acc_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Y_AXIS] * 2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Y_AXIS] * 2; } - else if (HMI_flag.acc_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Z_AXIS] * 2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Z_AXIS] * 2; } - #if HAS_HOTEND - else if (HMI_flag.acc_flag == E_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[E_AXIS] * 2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[E_AXIS] * 2; } - #endif + if (WITHIN(HMI_flag.acc_flag, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Acceleration, default_max_acceleration[HMI_flag.acc_flag] * 2); if (HMI_ValueStruct.Max_Acceleration < MIN_MAXACCELERATION) HMI_ValueStruct.Max_Acceleration = MIN_MAXACCELERATION; // MaxAcceleration value DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); @@ -1439,7 +1433,7 @@ void HMI_MaxJerkXYZE(void) { NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[Z_AXIS] * 2 * MINUNITMULT); else if (HMI_flag.jerk_flag == E_AXIS) NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[E_AXIS] * 2 * MINUNITMULT); - NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXCORNER) * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXJERK) * MINUNITMULT); // MaxJerk value DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); } @@ -1457,22 +1451,14 @@ void HMI_StepXYZE(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = Step; EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.step_flag == X_AXIS) planner.settings.axis_steps_per_mm[X_AXIS] = HMI_ValueStruct.Max_Step / 10; - else if (HMI_flag.step_flag == Y_AXIS) planner.settings.axis_steps_per_mm[Y_AXIS] = HMI_ValueStruct.Max_Step / 10; - else if (HMI_flag.step_flag == Z_AXIS) planner.settings.axis_steps_per_mm[Z_AXIS] = HMI_ValueStruct.Max_Step / 10; - else if (HMI_flag.step_flag == E_AXIS) planner.settings.axis_steps_per_mm[E_AXIS] = HMI_ValueStruct.Max_Step / 10; + if (WITHIN(HMI_flag.step_flag, X_AXIS, E_AXIS)) + planner.settings.axis_steps_per_mm[HMI_flag.step_flag] = HMI_ValueStruct.Max_Step / 10; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); return; } // Step limit - if (HMI_flag.step_flag == X_AXIS) - NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[X_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.step_flag == Y_AXIS) - NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[Y_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.step_flag == Z_AXIS) - NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[Z_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.step_flag == E_AXIS) - NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[E_AXIS] * 2 * MINUNITMULT); + if (WITHIN(HMI_flag.step_flag, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[HMI_flag.step_flag] * 2 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); // Step value DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); @@ -1743,7 +1729,7 @@ inline void Draw_Info_Menu() { DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 30, 17, 57, 29, 14, 8); + DWIN_Frame_TitleCopy(1, 30, 17, 57, 29); // "Info" DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); DWIN_Frame_AreaCopy(1, 1, 164, 56, 176, 108, 175); @@ -1754,7 +1740,7 @@ inline void Draw_Info_Menu() { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_INFO_SCREEN)); #else - DWIN_Frame_AreaCopy(1, 190, 16, 215, 26, 14, 8); + DWIN_Frame_TitleCopy(1, 190, 16, 215, 26); // "Info" #endif DWIN_Frame_AreaCopy(1, 120, 150, 146, 161, 124, 102); @@ -1774,13 +1760,13 @@ inline void Draw_Print_File_Menu() { Clear_Title_Bar(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 0, 31, 55, 44, 14, 8); + DWIN_Frame_TitleCopy(1, 0, 31, 55, 44); // "Print file" } else { #ifdef USE_STRING_HEADINGS Draw_Title("Print file"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 52, 31, 137, 41, 14, 8); // "Print file" + DWIN_Frame_TitleCopy(1, 52, 31, 137, 41); // "Print file" #endif } @@ -1814,30 +1800,26 @@ void HMI_MainMenu(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_page.now) { - /* Print File */ - case 0: + case 0: // Print File checkkey = SelectFile; Draw_Print_File_Menu(); break; - /* Prepare */ - case 1: + case 1: // Prepare checkkey = Prepare; select_prepare.reset(); index_prepare = MROWS; Draw_Prepare_Menu(); break; - /* Control */ - case 2: + case 2: // Control checkkey = Control; select_control.reset(); index_control = MROWS; Draw_Control_Menu(); break; - /* Leveling */ - case 3: + case 3: // Leveling or Info #if HAS_ONESTEP_LEVELING checkkey = Leveling; HMI_Leveling(); @@ -1851,7 +1833,7 @@ void HMI_MainMenu(void) { DWIN_UpdateLCD(); } -/* Select (and Print) File */ +// Select (and Print) File void HMI_SelectFile(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); @@ -2017,14 +1999,14 @@ void HMI_Printing(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_print.now) { - case 0: // setting + case 0: // Setting checkkey = Tune; HMI_ValueStruct.show_mode = 0; select_tune.reset(); index_tune = 5; Draw_Tune_Menu(); break; - case 1: // pause + case 1: // Pause /* pause */ if (HMI_flag.pause_flag) { ICON_Pause(); @@ -2047,7 +2029,7 @@ void HMI_Printing(void) { } break; - case 2: // stop + case 2: // Stop /* stop */ HMI_flag.select_flag = 1; checkkey = Print_window; @@ -2060,7 +2042,7 @@ void HMI_Printing(void) { DWIN_UpdateLCD(); } -/* pause and stop window */ +/* Pause and Stop window */ void HMI_PauseOrStop(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; @@ -2120,7 +2102,7 @@ inline void Draw_Move_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 192, 1, 233, 14, 14, 8); + DWIN_Frame_TitleCopy(1, 192, 1, 233, 14); // "Move" DWIN_Frame_AreaCopy(1, 58, 118, 106, 132, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 109, 118, 157, 132, LBLX, MBASE(2)); DWIN_Frame_AreaCopy(1, 160, 118, 209, 132, LBLX, MBASE(3)); @@ -2132,7 +2114,7 @@ inline void Draw_Move_Menu() { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOVE_AXIS)); #else - DWIN_Frame_AreaCopy(1, 231, 2, 265, 12, 14, 8); + DWIN_Frame_TitleCopy(1, 231, 2, 265, 12); // "Move" #endif draw_move_en(MBASE(1)); say_x(36, MBASE(1)); // "Move X" draw_move_en(MBASE(2)); say_y(36, MBASE(2)); // "Move Y" @@ -2145,7 +2127,8 @@ inline void Draw_Move_Menu() { Draw_Back_First(select_axis.now == 0); if (select_axis.now) Draw_Menu_Cursor(select_axis.now); - LOOP_L_N(i, MROWS) Draw_Menu_Line(i + 1, ICON_MoveX + i); + // Draw separators so it looks like a menu + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MoveX + i); } #include "../../../libs/buzzer.h" @@ -2211,7 +2194,7 @@ void HMI_Prepare(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_prepare.now) { - case 0: // back + case 0: // Back select_page.set(1); Goto_MainMenu(); break; @@ -2222,10 +2205,12 @@ void HMI_Prepare(void) { queue.inject_P(PSTR("G92 E0")); current_position.e = HMI_ValueStruct.Move_E_scale = 0; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), current_position[X_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), current_position[Y_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), current_position[Z_AXIS] * MINUNITMULT); - DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), current_position.e * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), current_position.x * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT); + #if HAS_HOTEND + DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), current_position.e * MINUNITMULT); + #endif break; case 2: // close motion queue.inject_P(PSTR("M84")); @@ -2297,11 +2282,11 @@ void Draw_Temperature_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("PLA Preheat Settings")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), F("ABS Preheat Settings")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("PLA Preheat Settings")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(5), F("ABS Preheat Settings")); #else DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(1)); // Nozzle... @@ -2378,7 +2363,7 @@ void HMI_Control(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_control.now) { - case 0: // back + case 0: // Back select_page.set(2); Goto_MainMenu(); break; @@ -2461,7 +2446,7 @@ void HMI_AxisMove(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_axis.now) { - case 0: // back + case 0: // Back checkkey = Prepare; select_prepare.set(1); index_prepare = MROWS; @@ -2469,19 +2454,19 @@ void HMI_AxisMove(void) { break; case 1: // X axis move checkkey = Move_X; - HMI_ValueStruct.Move_X_scale = current_position[X_AXIS] * MINUNITMULT; + HMI_ValueStruct.Move_X_scale = current_position.x * MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); EncoderRate.encoderRateEnabled = 1; break; case 2: // Y axis move checkkey = Move_Y; - HMI_ValueStruct.Move_Y_scale = current_position[Y_AXIS] * MINUNITMULT; + HMI_ValueStruct.Move_Y_scale = current_position.y * MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); EncoderRate.encoderRateEnabled = 1; break; case 3: // Z axis move checkkey = Move_Z; - HMI_ValueStruct.Move_Z_scale = current_position[Z_AXIS] * MINUNITMULT; + HMI_ValueStruct.Move_Z_scale = current_position.z * MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); EncoderRate.encoderRateEnabled = 1; break; @@ -2521,7 +2506,7 @@ void HMI_Temperature(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_temp.now) { - case 0: // back + case 0: // Back checkkey = Control; select_control.set(1); index_control = MROWS; @@ -2573,10 +2558,10 @@ void HMI_Temperature(void) { else { #ifdef USE_STRING_HEADINGS Draw_Title("PLA Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Nozzle Temp")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Bed Temp")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Nozzle Temp")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Bed Temp")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_STORE_EEPROM)); #else DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(1)); @@ -2628,10 +2613,10 @@ void HMI_Temperature(void) { else { #ifdef USE_STRING_HEADINGS Draw_Title("ABS Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Nozzle Temp")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Bed Temp")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Nozzle Temp")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Bed Temp")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_STORE_EEPROM)); #else DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(1)); @@ -2671,62 +2656,69 @@ inline void Draw_Max_Speed_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Max Speed (mm/s)" auto say_max_speed = [](const uint16_t row) { - DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, row); // "Max speed" + DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, row); // "Max speed" }; - say_max_speed(MBASE(1)); // "Max speed" - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(1)); // X - say_max_speed(MBASE(2)); // "Max speed" - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(2) + 3); // Y - say_max_speed(MBASE(3)); // "Max speed" - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(3) + 3); // Z - say_max_speed(MBASE(4)); // "Max speed" - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 58, MBASE(4) + 3); // E + say_max_speed(MBASE(1)); // "Max speed" + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(1)); // X + say_max_speed(MBASE(2)); // "Max speed" + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(2) + 3); // Y + say_max_speed(MBASE(3)); // "Max speed" + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(3) + 3); // Z + #if HAS_HOTEND + say_max_speed(MBASE(4)); // "Max speed" + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 58, MBASE(4) + 3); // E + #endif } else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Max Feedrate X")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Max Feedrate Y")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Feedrate Z")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Feedrate E")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Max Feedrate X")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Max Feedrate Y")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Max Feedrate Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Max Feedrate E")); + #endif #else - DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Max Speed (mm/s)" - draw_max_en(MBASE(1)); // "Max" + draw_max_en(MBASE(1)); // "Max" DWIN_Frame_AreaCopy(1, 184, 119, 234, 132, LBLX + 27, MBASE(1)); // "Speed X" - draw_max_en(MBASE(2)); // "Max" - draw_speed_en(27, MBASE(2)); // "Speed" - say_y(70, MBASE(2)); // "Y" + draw_max_en(MBASE(2)); // "Max" + draw_speed_en(27, MBASE(2)); // "Speed" + say_y(70, MBASE(2)); // "Y" - draw_max_en(MBASE(3)); // "Max" - draw_speed_en(27, MBASE(3)); // "Speed" - say_z(70, MBASE(3)); // "Z" + draw_max_en(MBASE(3)); // "Max" + draw_speed_en(27, MBASE(3)); // "Speed" + say_z(70, MBASE(3)); // "Z" - draw_max_en(MBASE(4)); // "Max" - draw_speed_en(27, MBASE(4)); // "Speed" - say_e(70, MBASE(4)); // "E" + #if HAS_HOTEND + draw_max_en(MBASE(4)); // "Max" + draw_speed_en(27, MBASE(4)); // "Speed" + say_e(70, MBASE(4)); // "E" + #endif #endif } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeedX + i); - + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedX + i); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(1), planner.settings.max_feedrate_mm_s[X_AXIS]); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(2), planner.settings.max_feedrate_mm_s[Y_AXIS]); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(3), planner.settings.max_feedrate_mm_s[Z_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(4), planner.settings.max_feedrate_mm_s[E_AXIS]); + #if HAS_HOTEND + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(4), planner.settings.max_feedrate_mm_s[E_AXIS]); + #endif } inline void Draw_Max_Accel_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Acceleration" DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(1) + 1); @@ -2737,103 +2729,117 @@ inline void Draw_Max_Accel_Menu() { DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(3)); DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(3) + 1); DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 71, MBASE(3) + 2); // Max acceleration Z - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(4) + 1); - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 71, MBASE(4) + 2); // Max acceleration E + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 71, MBASE(4) + 2); // Max acceleration E + #endif } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Max Accel X")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Max Accel Y")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Accel Z")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Accel E")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Max Accel X")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Max Accel Y")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Max Accel Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Max Accel E")); + #endif #else - DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); - draw_max_accel_en(MBASE(1)); say_x(108, MBASE(1)); // "Max Acceleration X" - draw_max_accel_en(MBASE(2)); say_y(108, MBASE(2)); // "Max Acceleration Y" - draw_max_accel_en(MBASE(3)); say_z(108, MBASE(3)); // "Max Acceleration Z" - draw_max_accel_en(MBASE(4)); say_e(108, MBASE(4)); // "Max Acceleration E" + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Acceleration" + draw_max_accel_en(MBASE(1)); say_x(108, MBASE(1)); // "Max Acceleration X" + draw_max_accel_en(MBASE(2)); say_y(108, MBASE(2)); // "Max Acceleration Y" + draw_max_accel_en(MBASE(3)); say_z(108, MBASE(3)); // "Max Acceleration Z" + #if HAS_HOTEND + draw_max_accel_en(MBASE(4)); say_e(108, MBASE(4)); // "Max Acceleration E" + #endif #endif } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxAccX + i); - + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxAccX + i); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(1), planner.settings.max_acceleration_mm_per_s2[X_AXIS]); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(2), planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(3), planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(4), planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + #if HAS_HOTEND + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(4), planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + #endif } inline void Draw_Max_Jerk_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk" - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1); + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1); DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(1)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max jerk speed X - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max Jerk speed X + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1); DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max jerk speed Y - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max Jerk speed Y + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(3)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(3)); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max jerk speed Z - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max jerk speed E + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max Jerk speed Z + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(4)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max Jerk speed E + #endif } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Max Jerk X")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Max Jerk Y")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Max Jerk Z")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Max Jerk E")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Max Jerk X")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Max Jerk Y")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Max Jerk Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Max Jerk E")); + #endif #else - DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); - draw_max_en(MBASE(1)); // "Max" - draw_jerk_en(MBASE(1)); // "Jerk" - draw_speed_en(72, MBASE(1)); // "Speed" - say_x(115, MBASE(1)); // "X" + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk" + draw_max_en(MBASE(1)); // "Max" + draw_jerk_en(MBASE(1)); // "Jerk" + draw_speed_en(72, MBASE(1)); // "Speed" + say_x(115, MBASE(1)); // "X" - draw_max_en(MBASE(2)); // "Max" - draw_jerk_en(MBASE(2)); // "Jerk" - draw_speed_en(72, MBASE(2)); // "Speed" - say_y(115, MBASE(2)); // "Y" + draw_max_en(MBASE(2)); // "Max" + draw_jerk_en(MBASE(2)); // "Jerk" + draw_speed_en(72, MBASE(2)); // "Speed" + say_y(115, MBASE(2)); // "Y" - draw_max_en(MBASE(3)); // "Max" - draw_jerk_en(MBASE(3)); // "Jerk" - draw_speed_en(72, MBASE(3)); // "Speed" - say_z(115, MBASE(3)); // "Z" + draw_max_en(MBASE(3)); // "Max" + draw_jerk_en(MBASE(3)); // "Jerk" + draw_speed_en(72, MBASE(3)); // "Speed" + say_z(115, MBASE(3)); // "Z" - draw_max_en(MBASE(4)); // "Max" - draw_jerk_en(MBASE(4)); // "Jerk" - draw_speed_en(72, MBASE(4)); // "Speed" - say_e(115, MBASE(4)); // "E" + #if HAS_HOTEND + draw_max_en(MBASE(4)); // "Max" + draw_jerk_en(MBASE(4)); // "Jerk" + draw_speed_en(72, MBASE(4)); // "Speed" + say_e(115, MBASE(4)); // "E" + #endif #endif } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); - + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); + #if HAS_HOTEND + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); + #endif } inline void Draw_Steps_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Steps per mm" DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 44, MBASE(1)); // Transmission Ratio X @@ -2841,32 +2847,39 @@ inline void Draw_Steps_Menu() { DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 44, MBASE(2) + 3); // Transmission Ratio Y DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(3)); DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 44, MBASE(3) + 3); // Transmission Ratio Z - DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 44, MBASE(4) + 3); // Transmission Ratio E + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 44, MBASE(4) + 3); // Transmission Ratio E + #endif } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), F("Steps/mm X")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), F("Steps/mm Y")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), F("Steps/mm Z")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), F("Steps/mm E")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Steps/mm X")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Steps/mm Y")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Steps/mm Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Steps/mm E")); + #endif #else - DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Steps per mm" draw_steps_per_mm(MBASE(1)); say_x(103, MBASE(1)); // "Steps-per-mm X" draw_steps_per_mm(MBASE(2)); say_y(103, MBASE(2)); // "Y" draw_steps_per_mm(MBASE(3)); say_z(103, MBASE(3)); // "Z" - draw_steps_per_mm(MBASE(4)); say_e(103, MBASE(4)); // "E" + #if HAS_HOTEND + draw_steps_per_mm(MBASE(4)); say_e(103, MBASE(4)); // "E" + #endif #endif } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_StepX + i); - + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_StepX + i); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); + #if HAS_HOTEND + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); + #endif } /* Motion */ @@ -2883,7 +2896,7 @@ void HMI_Motion(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_motion.now) { - case 0: // back + case 0: // Back checkkey = Control; select_control.set(2); index_control = MROWS; @@ -3043,7 +3056,7 @@ void HMI_PLAPreheatSetting(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_PLA.now) { - case 0: // back + case 0: // Back checkkey = TemperatureID; select_temp.now = 4; HMI_ValueStruct.show_mode = -1; @@ -3074,7 +3087,7 @@ void HMI_PLAPreheatSetting(void) { break; #endif #if ENABLED(EEPROM_SETTINGS) - case 4: { // save PLA configuration + case 4: { // Save PLA configuration const bool success = settings.save(); HMI_AudioFeedback(success); } break; @@ -3099,7 +3112,7 @@ void HMI_ABSPreheatSetting(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_ABS.now) { - case 0: // back + case 0: // Back checkkey = TemperatureID; select_temp.now = 5; HMI_ValueStruct.show_mode = -1; @@ -3154,41 +3167,17 @@ void HMI_MaxSpeed(void) { if (select_speed.dec()) Move_Highlight(-1, select_speed.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_speed.now) { - case 0: // back - checkkey = Motion; - select_motion.now = 1; - Draw_Motion_Menu(); - break; - case 1: // max Speed X - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = X_AXIS; - HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[X_AXIS]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); - EncoderRate.encoderRateEnabled = 1; - break; - case 2: // max Speed Y - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = Y_AXIS; - HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[Y_AXIS]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); - EncoderRate.encoderRateEnabled = 1; - break; - case 3: // max Speed Z - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = Z_AXIS; - HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[Z_AXIS]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); - EncoderRate.encoderRateEnabled = 1; - break; - case 4: // max Speed E - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = E_AXIS; - HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[E_AXIS]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); - EncoderRate.encoderRateEnabled = 1; - break; - default: break; + if (WITHIN(select_speed.now, 1, 4)) { + checkkey = MaxSpeed_value; + HMI_flag.feedspeed_flag = AxisEnum(select_speed.now - 1); + HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[HMI_flag.feedspeed_flag]; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + EncoderRate.encoderRateEnabled = 1; + } + else { // Back + checkkey = Motion; + select_motion.now = 1; + Draw_Motion_Menu(); } } DWIN_UpdateLCD(); @@ -3207,41 +3196,17 @@ void HMI_MaxAcceleration(void) { if (select_acc.dec()) Move_Highlight(-1, select_acc.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_acc.now) { - case 0: // back - checkkey = Motion; - select_motion.now = 2; - Draw_Motion_Menu(); - break; - case 1: // max acceleration X - checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = X_AXIS; - HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[X_AXIS]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); - EncoderRate.encoderRateEnabled = 1; - break; - case 2: // max acceleration Y - checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = Y_AXIS; - HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[Y_AXIS]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); - EncoderRate.encoderRateEnabled = 1; - break; - case 3: // max acceleration Z - checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = Z_AXIS; - HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[Z_AXIS]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); - EncoderRate.encoderRateEnabled = 1; - break; - case 4: // max acceleration E - checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = E_AXIS; - HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[E_AXIS]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); - EncoderRate.encoderRateEnabled = 1; - break; - default: break; + if (WITHIN(select_acc.now, 1, 4)) { + checkkey = MaxAcceleration_value; + HMI_flag.acc_flag = AxisEnum(select_acc.now - 1); + HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[HMI_flag.acc_flag]; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + EncoderRate.encoderRateEnabled = 1; + } + else { // Back + checkkey = Motion; + select_motion.now = 2; + Draw_Motion_Menu(); } } DWIN_UpdateLCD(); @@ -3260,41 +3225,17 @@ void HMI_MaxJerk(void) { if (select_jerk.dec()) Move_Highlight(-1, select_jerk.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_jerk.now) { - case 0: // back - checkkey = Motion; - select_motion.now = 3; - Draw_Motion_Menu(); - break; - case 1: // max jerk X - checkkey = MaxJerk_value; - HMI_flag.jerk_flag = X_AXIS; - HMI_ValueStruct.Max_Jerk = planner.max_jerk[X_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - EncoderRate.encoderRateEnabled = 1; - break; - case 2: // max jerk Y - checkkey = MaxJerk_value; - HMI_flag.jerk_flag = Y_AXIS; - HMI_ValueStruct.Max_Jerk = planner.max_jerk[Y_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - EncoderRate.encoderRateEnabled = 1; - break; - case 3: // max jerk Z - checkkey = MaxJerk_value; - HMI_flag.jerk_flag = Z_AXIS; - HMI_ValueStruct.Max_Jerk = planner.max_jerk[Z_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - EncoderRate.encoderRateEnabled = 1; - break; - case 4: // max jerk E - checkkey = MaxJerk_value; - HMI_flag.jerk_flag = E_AXIS; - HMI_ValueStruct.Max_Jerk = planner.max_jerk[E_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - EncoderRate.encoderRateEnabled = 1; - break; - default: break; + if (WITHIN(select_jerk.now, 1, 4)) { + checkkey = MaxJerk_value; + HMI_flag.jerk_flag = AxisEnum(select_jerk.now - 1); + HMI_ValueStruct.Max_Jerk = planner.max_jerk[HMI_flag.jerk_flag] * MINUNITMULT; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + EncoderRate.encoderRateEnabled = 1; + } + else { // Back + checkkey = Motion; + select_motion.now = 3; + Draw_Motion_Menu(); } } DWIN_UpdateLCD(); @@ -3313,41 +3254,17 @@ void HMI_Step(void) { if (select_step.dec()) Move_Highlight(-1, select_step.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_step.now) { - case 0: // back - checkkey = Motion; - select_motion.now = 4; - Draw_Motion_Menu(); - break; - case 1: // max step X - checkkey = Step_value; - HMI_flag.step_flag = X_AXIS; - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); - EncoderRate.encoderRateEnabled = 1; - break; - case 2: // max step Y - checkkey = Step_value; - HMI_flag.step_flag = Y_AXIS; - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); - EncoderRate.encoderRateEnabled = 1; - break; - case 3: // max step Z - checkkey = Step_value; - HMI_flag.step_flag = Z_AXIS; - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); - EncoderRate.encoderRateEnabled = 1; - break; - case 4: // max step E - checkkey = Step_value; - HMI_flag.step_flag = E_AXIS; - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); - EncoderRate.encoderRateEnabled = 1; - break; - default: break; + if (WITHIN(select_step.now, 1, 4)) { + checkkey = Step_value; + HMI_flag.step_flag = AxisEnum(select_step.now - 1); + HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[HMI_flag.step_flag] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + EncoderRate.encoderRateEnabled = 1; + } + else { // Back + checkkey = Motion; + select_motion.now = 4; + Draw_Motion_Menu(); } } DWIN_UpdateLCD(); @@ -3429,16 +3346,18 @@ void EachMomentUpdate(void) { } duration_t elapsed = print_job_timer.duration(); // print timer - /* already print time */ + + // Print time so far const uint16_t min = (elapsed.value % 3600) / 60; if (last_Printtime != min) { // 1 minute update last_Printtime = min; Draw_Print_ProgressElapsed(); } - /* remain print time */ + + // Estimate remaining time every 20 seconds static millis_t next_remain_time_update = 0; - if (elapsed.minute() > 5 && ELAPSED(ms, next_remain_time_update) && HMI_flag.heat_flag == 0) { // show after 5 min and 20s update - remain_time = ((elapsed.value - dwin_heat_time) * ((float)card.getFileSize() / (float)card.getIndex())) - (elapsed.value - dwin_heat_time); + if (Percentrecord > 1 && ELAPSED(ms, next_remain_time_update) && HMI_flag.heat_flag == 0) { + remain_time = (elapsed.value - dwin_heat_time) / (Percentrecord * 0.01f) - (elapsed.value - dwin_heat_time); next_remain_time_update += 20 * 1000UL; Draw_Print_ProgressRemain(); } @@ -3528,43 +3447,43 @@ void EachMomentUpdate(void) { void DWIN_HandleScreen(void) { switch (checkkey) { - case MainMenu: HMI_MainMenu(); break; - case SelectFile: HMI_SelectFile(); break; - case Prepare: HMI_Prepare(); break; - case Control: HMI_Control(); break; - case Leveling: break; - case PrintProcess: HMI_Printing(); break; - case Print_window: HMI_PauseOrStop(); break; - case AxisMove: HMI_AxisMove(); break; - case TemperatureID: HMI_Temperature(); break; - case Motion: HMI_Motion(); break; - case Info: HMI_Info(); break; - case Tune: HMI_Tune(); break; - case PLAPreheat: HMI_PLAPreheatSetting(); break; - case ABSPreheat: HMI_ABSPreheatSetting(); break; - case MaxSpeed: HMI_MaxSpeed(); break; - case MaxAcceleration: HMI_MaxAcceleration(); break; - case MaxJerk: HMI_MaxJerk(); break; - case Step: HMI_Step(); break; - case Move_X: HMI_Move_X(); break; - case Move_Y: HMI_Move_Y(); break; - case Move_Z: HMI_Move_Z(); break; + case MainMenu: HMI_MainMenu(); break; + case SelectFile: HMI_SelectFile(); break; + case Prepare: HMI_Prepare(); break; + case Control: HMI_Control(); break; + case Leveling: break; + case PrintProcess: HMI_Printing(); break; + case Print_window: HMI_PauseOrStop(); break; + case AxisMove: HMI_AxisMove(); break; + case TemperatureID: HMI_Temperature(); break; + case Motion: HMI_Motion(); break; + case Info: HMI_Info(); break; + case Tune: HMI_Tune(); break; + case PLAPreheat: HMI_PLAPreheatSetting(); break; + case ABSPreheat: HMI_ABSPreheatSetting(); break; + case MaxSpeed: HMI_MaxSpeed(); break; + case MaxAcceleration: HMI_MaxAcceleration(); break; + case MaxJerk: HMI_MaxJerk(); break; + case Step: HMI_Step(); break; + case Move_X: HMI_Move_X(); break; + case Move_Y: HMI_Move_Y(); break; + case Move_Z: HMI_Move_Z(); break; #if HAS_HOTEND - case Extruder: HMI_Move_E(); break; - case ETemp: HMI_ETemp(); break; + case Extruder: HMI_Move_E(); break; + case ETemp: HMI_ETemp(); break; #endif - case Homeoffset: HMI_Zoffset(); break; + case Homeoffset: HMI_Zoffset(); break; #if HAS_HEATED_BED - case BedTemp: HMI_BedTemp(); break; + case BedTemp: HMI_BedTemp(); break; #endif #if HAS_FAN - case FanSpeed: HMI_FanSpeed(); break; + case FanSpeed: HMI_FanSpeed(); break; #endif - case PrintSpeed: HMI_PrintSpeed(); break; - case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break; + case PrintSpeed: HMI_PrintSpeed(); break; + case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break; case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break; - case MaxJerk_value: HMI_MaxJerkXYZE(); break; - case Step_value: HMI_StepXYZE(); break; + case MaxJerk_value: HMI_MaxJerkXYZE(); break; + case Step_value: HMI_StepXYZE(); break; default: break; } } diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 467cc433e7..abdf343a9d 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -258,11 +258,11 @@ typedef struct { bool leveling_offset_flag:1; #endif #if HAS_FAN - char feedspeed_flag; + AxisEnum feedspeed_flag; #endif - char acc_flag; - char jerk_flag; - char step_flag; + AxisEnum acc_flag; + AxisEnum jerk_flag; + AxisEnum step_flag; } HMI_Flag; extern HMI_value_t HMI_ValueStruct; From 07f13c28ee1a588b6f90d67259f5efb9985c86c4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 16 Sep 2020 05:52:01 -0500 Subject: [PATCH 0242/1370] MarlinUI percent methods for all --- Marlin/src/lcd/ultralcd.h | 62 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 0200d39014..ee7f50dabf 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -328,6 +328,37 @@ public: static inline void init_lcd() {} #endif + #if HAS_PRINT_PROGRESS + #if HAS_PRINT_PROGRESS_PERMYRIAD + typedef uint16_t progress_t; + #define PROGRESS_SCALE 100U + #define PROGRESS_MASK 0x7FFF + #else + typedef uint8_t progress_t; + #define PROGRESS_SCALE 1U + #define PROGRESS_MASK 0x7F + #endif + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + static progress_t progress_override; + static void set_progress(const progress_t p) { progress_override = _MIN(p, 100U * (PROGRESS_SCALE)); } + static void set_progress_done() { progress_override = (PROGRESS_MASK + 1U) + 100U * (PROGRESS_SCALE); } + static void progress_reset() { if (progress_override & (PROGRESS_MASK + 1U)) set_progress(0); } + #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + static uint32_t remaining_time; + FORCE_INLINE static void set_remaining_time(const uint32_t r) { remaining_time = r; } + FORCE_INLINE static uint32_t get_remaining_time() { return remaining_time; } + FORCE_INLINE static void reset_remaining_time() { set_remaining_time(0); } + #endif + #endif + static progress_t _get_progress(); + #if HAS_PRINT_PROGRESS_PERMYRIAD + FORCE_INLINE static uint16_t get_progress_permyriad() { return _get_progress(); } + #endif + static uint8_t get_progress_percent() { return uint8_t(_get_progress() / (PROGRESS_SCALE)); } + #else + static constexpr uint8_t get_progress_percent() { return 0; } + #endif + #if HAS_DISPLAY static void init(); @@ -350,37 +381,6 @@ public: static void pause_print(); static void resume_print(); - #if HAS_PRINT_PROGRESS - #if HAS_PRINT_PROGRESS_PERMYRIAD - typedef uint16_t progress_t; - #define PROGRESS_SCALE 100U - #define PROGRESS_MASK 0x7FFF - #else - typedef uint8_t progress_t; - #define PROGRESS_SCALE 1U - #define PROGRESS_MASK 0x7F - #endif - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) - static progress_t progress_override; - static void set_progress(const progress_t p) { progress_override = _MIN(p, 100U * (PROGRESS_SCALE)); } - static void set_progress_done() { progress_override = (PROGRESS_MASK + 1U) + 100U * (PROGRESS_SCALE); } - static void progress_reset() { if (progress_override & (PROGRESS_MASK + 1U)) set_progress(0); } - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - static uint32_t remaining_time; - FORCE_INLINE static void set_remaining_time(const uint32_t r) { remaining_time = r; } - FORCE_INLINE static uint32_t get_remaining_time() { return remaining_time; } - FORCE_INLINE static void reset_remaining_time() { set_remaining_time(0); } - #endif - #endif - static progress_t _get_progress(); - #if HAS_PRINT_PROGRESS_PERMYRIAD - FORCE_INLINE static uint16_t get_progress_permyriad() { return _get_progress(); } - #endif - static uint8_t get_progress_percent() { return uint8_t(_get_progress() / (PROGRESS_SCALE)); } - #else - static constexpr uint8_t get_progress_percent() { return 0; } - #endif - #if HAS_SPI_LCD static millis_t next_button_update_ms; From 68c98811a16c6e858521dbe26e8be72c854aff6e Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 17 Sep 2020 01:06:01 -0700 Subject: [PATCH 0243/1370] Demo and test multiple PID defaults (#19413) --- Marlin/Configuration.h | 29 ++++++++++---------------- buildroot/tests/BIGTREE_GTR_V1_0-tests | 5 ++++- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 52af1375a5..2635bc750e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -486,24 +486,17 @@ //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM) //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) // Set/get with gcode: M301 E[extruder number, 0-2] - - // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it - - // Ultimaker - #define DEFAULT_Kp 22.2 - #define DEFAULT_Ki 1.08 - #define DEFAULT_Kd 114 - - // MakerGear - //#define DEFAULT_Kp 7.0 - //#define DEFAULT_Ki 0.1 - //#define DEFAULT_Kd 12 - - // Mendel Parts V9 on 12V - //#define DEFAULT_Kp 63.0 - //#define DEFAULT_Ki 2.25 - //#define DEFAULT_Kd 440 - + #if ENABLED(PID_PARAMS_PER_HOTEND) + // Specify between 1 and HOTENDS values per array. + // If fewer than EXTRUDER values are provided, the last element will be repeated. + #define DEFAULT_Kp_LIST { 22.20, 20.0 } + #define DEFAULT_Ki_LIST { 1.08, 1.0 } + #define DEFAULT_Kd_LIST { 114.00, 112.0 } + #else + #define DEFAULT_Kp 22.20 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114.00 + #endif #endif // PIDTEMP //=========================================================================== diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests index 58f6f71fda..e8d47562aa 100644 --- a/buildroot/tests/BIGTREE_GTR_V1_0-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0-tests @@ -36,7 +36,10 @@ opt_set TEMP_SENSOR_3 1 opt_set TEMP_SENSOR_4 1 opt_set TEMP_SENSOR_5 1 opt_set NUM_Z_STEPPER_DRIVERS 3 -opt_enable TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_MIGRATION_FEATURE TOOLCHANGE_FS_INIT_BEFORE_SWAP TOOLCHANGE_FS_PRIME_FIRST_USED +opt_set DEFAULT_Kp_LIST "{ 22.2, 20.0, 21.0, 19.0, 18.0, 17.0 }" +opt_set DEFAULT_Ki_LIST "{ 1.08 }" +opt_set DEFAULT_Kd_LIST "{ 114.0, 112.0, 110.0, 108.0 }" +opt_enable TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_MIGRATION_FEATURE TOOLCHANGE_FS_INIT_BEFORE_SWAP TOOLCHANGE_FS_PRIME_FIRST_USED PID_PARAMS_PER_HOTEND exec_test $1 $2 "BigTreeTech GTR 6 Extruders Triple Z" # clean up From 08a7dedbc929150d2fa7df5cdd8d8442f2cf238f Mon Sep 17 00:00:00 2001 From: tovam Date: Thu, 17 Sep 2020 10:07:03 +0200 Subject: [PATCH 0244/1370] Fix missing spaces in info menu (#19404) --- Marlin/src/lcd/menu/menu_info.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 864e855df2..a4cbc31d8b 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -179,7 +179,7 @@ void menu_info_thermistors() { #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_BED #include "../thermistornames.h" - STATIC_ITEM_P(PSTR("BED:" THERMISTOR_NAME), SS_INVERT); + STATIC_ITEM_P(PSTR("BED: " THERMISTOR_NAME), SS_INVERT); PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT); PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT); STATIC_ITEM(TERN(WATCH_BED, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); @@ -189,7 +189,7 @@ void menu_info_thermistors() { #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_CHAMBER #include "../thermistornames.h" - STATIC_ITEM_P(PSTR("CHAM:" THERMISTOR_NAME), SS_INVERT); + STATIC_ITEM_P(PSTR("CHAM: " THERMISTOR_NAME), SS_INVERT); PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(CHAMBER_MINTEMP), SS_LEFT); PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(CHAMBER_MAXTEMP), SS_LEFT); STATIC_ITEM(TERN(WATCH_CHAMBER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); From c407c08b0b9528ce60da6b0749044d7c2231eb87 Mon Sep 17 00:00:00 2001 From: enigmaquip Date: Thu, 17 Sep 2020 02:17:47 -0600 Subject: [PATCH 0245/1370] Add more DWIN commands, docs (#19395) --- Marlin/src/lcd/dwin/dwin_lcd.cpp | 92 ++++++++++++++++++++++++++++++++ Marlin/src/lcd/dwin/dwin_lcd.h | 21 ++++++++ 2 files changed, 113 insertions(+) diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 3b30629a8d..7d1528bed1 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -153,6 +153,20 @@ void DWIN_Frame_Clear(const uint16_t color) { DWIN_Send(i); } +// Draw a point +// width: point width 0x01-0x0F +// height: point height 0x01-0x0F +// x,y: upper left point +void DWIN_Draw_Point(uint8_t width, uint8_t height, uint16_t x, uint16_t y) { + size_t i = 0; + DWIN_Byte(i, 0x02); + DWIN_Byte(i, width); + DWIN_Byte(i, height); + DWIN_Word(i, x); + DWIN_Word(i, y); + DWIN_Send(i); +} + // Draw a line // color: Line segment color // xStart/yStart: Start point @@ -221,6 +235,10 @@ void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, char *string) { size_t i = 0; DWIN_Byte(i, 0x11); + // Bit 7: widthAdjust + // Bit 6: bShow + // Bit 5-4: Unused (0) + // Bit 3-0: size DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); DWIN_Word(i, color); DWIN_Word(i, bColor); @@ -244,6 +262,11 @@ void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint16_t value) { size_t i = 0; DWIN_Byte(i, 0x14); + // Bit 7: bshow + // Bit 6: 1 = signed; 0 = unsigned number; + // Bit 5: zeroFill + // Bit 4: zeroMode + // Bit 3-0: size DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); DWIN_Word(i, color); DWIN_Word(i, bColor); @@ -360,4 +383,73 @@ void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, DWIN_Send(i); } +// Animate a series of icons +// animID: Animation ID; 0x00-0x0F +// animate: true on; false off; +// libID: Icon library ID +// picIDs: Icon starting ID +// picIDe: Icon ending ID +// x/y: Upper-left point +// interval: Display time interval, unit 10mS +void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval) { + NOMORE(x, DWIN_WIDTH - 1); + NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl + size_t i = 0; + DWIN_Byte(i, 0x28); + DWIN_Word(i, x); + DWIN_Word(i, y); + // Bit 7: animation on or off + // Bit 6: start from begin or end + // Bit 5-4: unused (0) + // Bit 3-0: animID + DWIN_Byte(i, (animate * 0x80) | 0x40 | animID); + DWIN_Byte(i, libID); + DWIN_Byte(i, picIDs); + DWIN_Byte(i, picIDe); + DWIN_Byte(i, interval); + DWIN_Send(i); +} + +// Animation Control +// state: 16 bits, each bit is the state of an animation id +void DWIN_ICON_AnimationControl(uint16_t state) { + size_t i = 0; + DWIN_Byte(i, 0x28); + DWIN_Word(i, state); + DWIN_Send(i); +} + +/*---------------------------------------- Memory functions ----------------------------------------*/ +// The LCD has an additional 32KB SRAM and 16KB Flash + +// Data can be written to the sram and save to one of the jpeg page files + +// Write Data Memory +// command 0x31 +// Type: Write memory selection; 0x5A=SRAM; 0xA5=Flash +// Address: Write data memory address; 0x000-0x7FFF for SRAM; 0x000-0x3FFF for Flash +// Data: data +// +// Flash writing returns 0xA5 0x4F 0x4B + +// Read Data Memory +// command 0x32 +// Type: Read memory selection; 0x5A=SRAM; 0xA5=Flash +// Address: Read data memory address; 0x000-0x7FFF for SRAM; 0x000-0x3FFF for Flash +// Length: leangth of data to read; 0x01-0xF0 +// +// Response: +// Type, Address, Length, Data + +// Write Picture Memory +// Write the contents of the 32KB SRAM data memory into the designated image memory space +// Issued: 0x5A, 0xA5, PIC_ID +// Response: 0xA5 0x4F 0x4B +// +// command 0x33 +// 0x5A, 0xA5 +// PicId: Picture Memory location, 0x00-0x0F +// +// Flash writing returns 0xA5 0x4F 0x4B + #endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/dwin_lcd.h b/Marlin/src/lcd/dwin/dwin_lcd.h index 0893974e4c..11409666d8 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.h +++ b/Marlin/src/lcd/dwin/dwin_lcd.h @@ -67,6 +67,12 @@ void DWIN_UpdateLCD(void); // color: Clear screen color void DWIN_Frame_Clear(const uint16_t color); +// Draw a point +// width: point width 0x01-0x0F +// height: point height 0x01-0x0F +// x,y: upper left point +void DWIN_Draw_Point(uint8_t width, uint8_t height, uint16_t x, uint16_t y); + // Draw a line // color: Line segment color // xStart/yStart: Start point @@ -190,3 +196,18 @@ inline void DWIN_JPG_CacheTo1(uint8_t id) { DWIN_JPG_CacheToN(1, id); } // x/y: Screen paste point void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y); + +// Animate a series of icons +// animID: Animation ID up to 16 +// animate: animation on or off +// libID: Icon library ID +// picIDs: Icon starting ID +// picIDe: Icon ending ID +// x/y: Upper-left point +// interval: Display time interval, unit 10mS +void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, + uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval); + +// Animation Control +// state: 16 bits, each bit is the state of an animation id +void DWIN_ICON_AnimationControl(uint16_t state); From 7e56e6c4eaaad6ec8a841b5459761c2e1f7bbaec Mon Sep 17 00:00:00 2001 From: cosmoderp <36945803+cosmoderp@users.noreply.github.com> Date: Thu, 17 Sep 2020 06:35:04 -0400 Subject: [PATCH 0246/1370] E3 V2 DWIN: Z-Offset, cleanup, versatility (#19384) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2268 +++++++++-------- Marlin/src/lcd/dwin/e3v2/dwin.h | 136 +- Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp | 2 +- Marlin/src/lcd/dwin/e3v2/rotary_encoder.h | 2 +- Marlin/src/module/temperature.cpp | 26 +- .../PlatformIO/scripts/common-dependencies.h | 4 - platformio.ini | 2 - 9 files changed, 1357 insertions(+), 1087 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 2712312747..d46ba55a92 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1572,6 +1572,7 @@ #if ENABLED(BABYSTEPPING) //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR //#define BABYSTEP_WITHOUT_HOMING + //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way //#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps @@ -1582,7 +1583,6 @@ #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. // Note: Extra time may be added to mitigate controller latency. - //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle. #if ENABLED(MOVE_Z_WHEN_IDLE) #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 9742967a09..ff13d2897d 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -59,7 +59,7 @@ #if TEMP_SENSOR_BED == 0 #undef THERMAL_PROTECTION_BED #undef THERMAL_PROTECTION_BED_PERIOD -#endif +#endif #if TEMP_SENSOR_CHAMBER == 0 #undef THERMAL_PROTECTION_CHAMBER diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index c942929805..d45511f5bc 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -28,15 +28,19 @@ #if ENABLED(DWIN_CREALITY_LCD) +#include "dwin.h" + #if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) && DISABLED(PROBE_MANUALLY) #define HAS_ONESTEP_LEVELING 1 #endif -#if HAS_HOTEND || HAS_HEATED_BED || HAS_FAN - #define HAS_COOLDOWN 1 +#if ANY(BABYSTEPPING, HAS_BED_PROBE, HAS_WORKSPACE_OFFSET) + #define HAS_ZOFFSET_ITEM 1 #endif -#include "dwin.h" +#if !HAS_BED_PROBE && ENABLED(BABYSTEPPING) + #define JUST_BABYSTEP 1 +#endif #include #include @@ -52,8 +56,6 @@ #include "../../../core/macros.h" #include "../../../gcode/queue.h" -#include "../../../feature/babystep.h" - #include "../../../module/temperature.h" #include "../../../module/printcounter.h" #include "../../../module/motion.h" @@ -75,6 +77,10 @@ #include "../../../module/probe.h" #endif +#if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) + #include "../../../feature/babystep.h" +#endif + #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../feature/powerloss.h" #endif @@ -89,7 +95,7 @@ #define CORP_WEBSITE_E "www.creality.com" #endif -#define PAUSE_HEAT true +#define PAUSE_HEAT #define USE_STRING_HEADINGS @@ -98,6 +104,7 @@ #define HEADER_FONT font10x20 #define MENU_CHAR_LIMIT 24 +#define STATUS_Y 360 // Fan speed limit #define FANON 255 @@ -146,11 +153,9 @@ constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other HMI_value_t HMI_ValueStruct; HMI_Flag HMI_flag{0}; -millis_t Encoder_ms = 0; -millis_t Wait_ms = 0; millis_t dwin_heat_time = 0; -int checkkey = 0, last_checkkey = 0; +uint8_t checkkey = 0; typedef struct { uint8_t now, last; @@ -158,7 +163,7 @@ typedef struct { void reset() { set(0); } bool changed() { bool c = (now != last); if (c) last = now; return c; } bool dec() { if (now) now--; return changed(); } - bool inc(uint8_t v) { if (now < v) now++; else now = v; return changed(); } + bool inc(uint8_t v) { if (now < (v - 1)) now++; else now = (v - 1); return changed(); } } select_t; select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0} @@ -175,13 +180,9 @@ uint8_t index_file = MROWS, index_prepare = MROWS, index_control = MROWS, index_leveling = MROWS, - index_tune = 5; + index_tune = MROWS; -// char filebuf[50]; - -uint8_t countbuf = 0; - -bool recovery_flag = false, abort_flag = false; +bool dwin_abort_flag = false; constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; @@ -189,38 +190,41 @@ constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, constexpr float default_axis_steps_per_unit[] = DEFAULT_AXIS_STEPS_PER_UNIT; uint8_t Percentrecord = 0; -uint16_t last_Printtime = 0, remain_time = 0; -float last_temp_hotend_target = 0, last_temp_bed_target = 0; -float last_temp_hotend_current = 0, last_temp_bed_current = 0; -uint8_t last_fan_speed = 0; -uint16_t last_speed = 0; -float last_E_scale = 0; -bool DWIN_lcd_sd_status = 0; -bool pause_action_flag = 0; -int temphot = 0, tempbed = 0; -float dwin_zoffset = 0; -float last_zoffset = 0; +uint16_t remain_time = 0; + +#if ENABLED(PAUSE_HEAT) + #if HAS_HOTEND + uint16_t temphot = 0; + #endif + #if HAS_HEATED_BED + uint16_t tempbed = 0; + #endif +#endif + +#if HAS_ZOFFSET_ITEM + float dwin_zoffset = 0, last_zoffset = 0; +#endif #define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) // BL24CXX::check() uses 0x00 -void HMI_SetLanguage(void) { - BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); - if (HMI_flag.language_chinese) - DWIN_JPG_CacheTo1(Language_Chinese); - else - DWIN_JPG_CacheTo1(Language_English); +void HMI_SetLanguageCache() { + DWIN_JPG_CacheTo1(HMI_flag.language_chinese ? Language_Chinese : Language_English); } -void HMI_SetAndSaveLanguageWestern(void) { - HMI_flag.language_chinese = false; - DWIN_JPG_CacheTo1(Language_English); - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); +void HMI_SetLanguage() { + #if ENABLED(EEPROM_SETTINGS) + BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); + #endif + HMI_SetLanguageCache(); } -void HMI_SetAndSaveLanguageChinese(void) { - HMI_flag.language_chinese = true; - DWIN_JPG_CacheTo1(Language_Chinese); - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); + +void HMI_ToggleLanguage() { + HMI_flag.language_chinese ^= true; + HMI_SetLanguageCache(); + #if ENABLED(EEPROM_SETTINGS) + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); + #endif } void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { @@ -331,14 +335,14 @@ void ICON_Tune() { if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 121, 447, 148, 458, 34, 325); else - DWIN_Frame_AreaCopy(1, 1, 465, 34, 477, 31, 325); + DWIN_Frame_AreaCopy(1, 0, 466, 34, 476, 31, 325); } else { DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 121, 405, 148, 420, 34, 325); else - DWIN_Frame_AreaCopy(1, 1, 438, 32, 448, 31, 325); + DWIN_Frame_AreaCopy(1, 0, 438, 32, 448, 31, 325); } } @@ -367,7 +371,7 @@ void ICON_Continue() { if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 124, 325); else - DWIN_Frame_AreaCopy(1, 1, 451, 32, 463, 121, 325); + DWIN_Frame_AreaCopy(1, 1, 452, 32, 464, 121, 325); } else { DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); @@ -385,7 +389,7 @@ void ICON_Stop() { if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 151, 447, 178, 459, 210, 325); else - DWIN_Frame_AreaCopy(1, 218, 451, 249, 465, 209, 325); + DWIN_Frame_AreaCopy(1, 218, 452, 249, 466, 209, 325); } else { DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); @@ -396,8 +400,8 @@ void ICON_Stop() { } } -inline void Clear_Title_Bar(void) { - DWIN_Draw_Rectangle(1, Background_blue, 0, 0, DWIN_WIDTH, 30); +inline void Clear_Title_Bar() { + DWIN_Draw_Rectangle(1, Background_blue, 0, 0, DWIN_WIDTH, 30); } inline void Draw_Title(const char * const title) { @@ -408,21 +412,21 @@ inline void Draw_Title(const __FlashStringHelper * title) { DWIN_Draw_String(false, false, HEADER_FONT, White, Background_blue, 14, 4, (char*)title); } -inline void Clear_Menu_Area(void) { - DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, 360); +inline void Clear_Menu_Area() { + DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, STATUS_Y); } -inline void Clear_Main_Window(void) { +inline void Clear_Main_Window() { Clear_Title_Bar(); Clear_Menu_Area(); } -inline void Clear_Popup_Area(void) { +inline void Clear_Popup_Area() { Clear_Title_Bar(); DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); } -void Draw_Popup_Bkgd_105(void) { +void Draw_Popup_Bkgd_105() { DWIN_Draw_Rectangle(1, Background_window, 14, 105, 258, 374); } @@ -476,7 +480,7 @@ inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char } // The "Back" label is always on the first line -inline void Draw_Back_Label(void) { +inline void Draw_Back_Label() { if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 129, 72, 156, 84, LBLX, MBASE(0)); else @@ -494,13 +498,61 @@ inline void Draw_Back_First(const bool is_sel=true) { // Draw Menus // +#define MOTION_CASE_RATE 1 +#define MOTION_CASE_ACCEL 2 +#define MOTION_CASE_JERK (MOTION_CASE_ACCEL + ENABLED(HAS_CLASSIC_JERK)) +#define MOTION_CASE_STEPS (MOTION_CASE_JERK + 1) +#define MOTION_CASE_TOTAL MOTION_CASE_STEPS + +#define PREPARE_CASE_MOVE 1 +#define PREPARE_CASE_DISA 2 +#define PREPARE_CASE_HOME 3 +#define PREPARE_CASE_ZOFF (PREPARE_CASE_HOME + ENABLED(HAS_ZOFFSET_ITEM)) +#define PREPARE_CASE_PLA (PREPARE_CASE_ZOFF + ENABLED(HAS_HOTEND)) +#define PREPARE_CASE_ABS (PREPARE_CASE_PLA + ENABLED(HAS_HOTEND)) +#define PREPARE_CASE_COOL (PREPARE_CASE_ABS + EITHER(HAS_HOTEND, HAS_HEATED_BED)) +#define PREPARE_CASE_LANG (PREPARE_CASE_COOL + 1) +#define PREPARE_CASE_TOTAL PREPARE_CASE_LANG + +#define CONTROL_CASE_TEMP 1 +#define CONTROL_CASE_MOVE (CONTROL_CASE_TEMP + 1) +#define CONTROL_CASE_SAVE (CONTROL_CASE_MOVE + ENABLED(EEPROM_SETTINGS)) +#define CONTROL_CASE_LOAD (CONTROL_CASE_SAVE + ENABLED(EEPROM_SETTINGS)) +#define CONTROL_CASE_RESET (CONTROL_CASE_LOAD + ENABLED(EEPROM_SETTINGS)) +#define CONTROL_CASE_INFO (CONTROL_CASE_RESET + 1) +#define CONTROL_CASE_TOTAL CONTROL_CASE_INFO + +#define TUNE_CASE_SPEED 1 +#define TUNE_CASE_TEMP (TUNE_CASE_SPEED + ENABLED(HAS_HOTEND)) +#define TUNE_CASE_BED (TUNE_CASE_TEMP + ENABLED(HAS_HEATED_BED)) +#define TUNE_CASE_FAN (TUNE_CASE_BED + ENABLED(HAS_FAN)) +#define TUNE_CASE_ZOFF (TUNE_CASE_FAN + ENABLED(HAS_ZOFFSET_ITEM)) +#define TUNE_CASE_TOTAL TUNE_CASE_ZOFF + +#define TEMP_CASE_TEMP (0 + ENABLED(HAS_HOTEND)) +#define TEMP_CASE_BED (TEMP_CASE_TEMP + ENABLED(HAS_HEATED_BED)) +#define TEMP_CASE_FAN (TEMP_CASE_BED + ENABLED(HAS_FAN)) +#define TEMP_CASE_PLA (TEMP_CASE_FAN + ENABLED(HAS_HOTEND)) +#define TEMP_CASE_ABS (TEMP_CASE_PLA + ENABLED(HAS_HOTEND)) +#define TEMP_CASE_TOTAL TEMP_CASE_ABS + +#define PREHEAT_CASE_TEMP (0 + ENABLED(HAS_HOTEND)) +#define PREHEAT_CASE_BED (PREHEAT_CASE_TEMP + ENABLED(HAS_HEATED_BED)) +#define PREHEAT_CASE_FAN (PREHEAT_CASE_BED + ENABLED(HAS_FAN)) +#define PREHEAT_CASE_SAVE (PREHEAT_CASE_FAN + ENABLED(EEPROM_SETTINGS)) +#define PREHEAT_CASE_TOTAL PREHEAT_CASE_SAVE + +// +// Draw Menus +// + inline void draw_move_en(const uint16_t line) { DWIN_Frame_AreaCopy(1, 69, 61, 102, 71, LBLX, line); // "Move" } inline void DWIN_Frame_TitleCopy(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { DWIN_Frame_AreaCopy(id, x1, y1, x2, y2, 14, 8); } -inline void Prepare_Item_Move(const uint8_t row) { +inline void Item_Prepare_Move(const uint8_t row) { if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 159, 70, 200, 84, LBLX, MBASE(row)); else @@ -509,7 +561,7 @@ inline void Prepare_Item_Move(const uint8_t row) { Draw_More_Icon(row); } -inline void Prepare_Item_Disable(const uint8_t row) { +inline void Item_Prepare_Disable(const uint8_t row) { if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 204, 70, 259, 82, LBLX, MBASE(row)); else @@ -517,7 +569,7 @@ inline void Prepare_Item_Disable(const uint8_t row) { Draw_Menu_Line(row, ICON_CloseMotor); } -inline void Prepare_Item_Home(const uint8_t row) { +inline void Item_Prepare_Home(const uint8_t row) { if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 0, 89, 41, 101, LBLX, MBASE(row)); else @@ -525,57 +577,65 @@ inline void Prepare_Item_Home(const uint8_t row) { Draw_Menu_Line(row, ICON_Homing); } -inline void Prepare_Item_Offset(const uint8_t row) { - if (HMI_flag.language_chinese) { - #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); - #else - DWIN_Frame_AreaCopy(1, 43, 89, 98, 101, LBLX, MBASE(row)); - #endif - } - else { - #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); - #else - DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." - #endif - } - Draw_Menu_Line(row, ICON_SetHome); -} +#if HAS_ZOFFSET_ITEM -inline void Prepare_Item_PLA(const uint8_t row) { - if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row)); + inline void Item_Prepare_Offset(const uint8_t row) { + if (HMI_flag.language_chinese) { + #if HAS_BED_PROBE + DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); + #else + DWIN_Frame_AreaCopy(1, 43, 89, 98, 101, LBLX, MBASE(row)); + #endif + } + else { + #if HAS_BED_PROBE + DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); + #else + DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." + #endif + } + Draw_Menu_Line(row, ICON_SetHome); } - else { - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" - } - Draw_Menu_Line(row, ICON_PLAPreheat); -} -inline void Prepare_Item_ABS(const uint8_t row) { - if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row)); - } - else { - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" - } - Draw_Menu_Line(row, ICON_ABSPreheat); -} +#endif -inline void Prepare_Item_Cool(const uint8_t row) { - if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); - else - DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" - Draw_Menu_Line(row, ICON_Cool); -} +#if HAS_HOTEND + inline void Item_Prepare_PLA(const uint8_t row) { + if (HMI_flag.language_chinese) { + DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row)); + } + else { + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" + } + Draw_Menu_Line(row, ICON_PLAPreheat); + } -inline void Prepare_Item_Lang(const uint8_t row) { + inline void Item_Prepare_ABS(const uint8_t row) { + if (HMI_flag.language_chinese) { + DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row)); + } + else { + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" + } + Draw_Menu_Line(row, ICON_ABSPreheat); + } +#endif + +#if HAS_PREHEAT + inline void Item_Prepare_Cool(const uint8_t row) { + if (HMI_flag.language_chinese) + DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); + else + DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" + Draw_Menu_Line(row, ICON_Cool); + } +#endif + +inline void Item_Prepare_Lang(const uint8_t row) { if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 239, 134, 266, 146, LBLX, MBASE(row)); DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), F("CN")); @@ -605,15 +665,21 @@ inline void Draw_Prepare_Menu() { #endif } - if (PVISI(0)) Draw_Back_First(select_prepare.now == 0); // < Back - if (PVISI(1)) Prepare_Item_Move(PSCROL(1)); // Move > - if (PVISI(2)) Prepare_Item_Disable(PSCROL(2)); // Disable Stepper - if (PVISI(3)) Prepare_Item_Home(PSCROL(3)); // Auto Home - if (PVISI(4)) Prepare_Item_Offset(PSCROL(4)); // Z-Offset - if (PVISI(5)) Prepare_Item_PLA(PSCROL(5)); // Preheat PLA - if (PVISI(6)) Prepare_Item_ABS(PSCROL(6)); // Preheat ABS - if (PVISI(7)) Prepare_Item_Cool(PSCROL(7)); // Cooldown - if (PVISI(8)) Prepare_Item_Lang(PSCROL(8)); // Language CN/EN + if (PVISI(0)) Draw_Back_First(select_prepare.now == 0); // < Back + if (PVISI(PREPARE_CASE_MOVE)) Item_Prepare_Move(PSCROL(PREPARE_CASE_MOVE)); // Move > + if (PVISI(PREPARE_CASE_DISA)) Item_Prepare_Disable(PSCROL(PREPARE_CASE_DISA)); // Disable Stepper + if (PVISI(PREPARE_CASE_HOME)) Item_Prepare_Home(PSCROL(PREPARE_CASE_HOME)); // Auto Home + #if HAS_ZOFFSET_ITEM + if (PVISI(PREPARE_CASE_ZOFF)) Item_Prepare_Offset(PSCROL(PREPARE_CASE_ZOFF)); // Edit Z-Offset / Babystep / Set Home Offset + #endif + #if HAS_HOTEND + if (PVISI(PREPARE_CASE_PLA)) Item_Prepare_PLA(PSCROL(PREPARE_CASE_PLA)); // Preheat PLA + if (PVISI(PREPARE_CASE_ABS)) Item_Prepare_ABS(PSCROL(PREPARE_CASE_ABS)); // Preheat ABS + #endif + #if HAS_PREHEAT + if (PVISI(PREPARE_CASE_COOL)) Item_Prepare_Cool(PSCROL(PREPARE_CASE_COOL)); // Cooldown + #endif + if (PVISI(PREPARE_CASE_LANG)) Item_Prepare_Lang(PSCROL(PREPARE_CASE_LANG)); // Language CN/EN if (select_prepare.now) Draw_Menu_Cursor(PSCROL(select_prepare.now)); } @@ -621,52 +687,55 @@ inline void Draw_Prepare_Menu() { inline void Draw_Control_Menu() { Clear_Main_Window(); - const int16_t scroll = TERN(HAS_ONESTEP_LEVELING, MROWS - index_control, 0); // Scrolled-up lines - - #define CSCROL(L) (scroll + (L)) + #if CONTROL_CASE_TOTAL >= 6 + const int16_t scroll = MROWS - index_control; // Scrolled-up lines + #define CSCROL(L) (scroll + (L)) + #else + #define CSCROL(L) (L) + #endif #define CLINE(L) MBASE(CSCROL(L)) #define CVISI(L) WITHIN(CSCROL(L), 0, MROWS) if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 103, 1, 130, 14, 14, 8); - DWIN_Frame_AreaCopy(1, 57, 104, 84, 116, LBLX, CLINE(1)); // Temperature > - DWIN_Frame_AreaCopy(1, 87, 104, 114, 116, LBLX, CLINE(2)); // Motion > - DWIN_Frame_AreaCopy(1, 117, 104, 172, 116, LBLX, CLINE(3)); // Store Config - DWIN_Frame_AreaCopy(1, 174, 103, 229, 116, LBLX, CLINE(4)); // Read Config - DWIN_Frame_AreaCopy(1, 1, 118, 56, 131, LBLX, CLINE(5)); // Reset Config + DWIN_Frame_TitleCopy(1, 103, 1, 130, 14); // "Control" - if (CVISI(6)) - DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, CLINE(6)); // Info > + DWIN_Frame_AreaCopy(1, 57, 104, 84, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > + DWIN_Frame_AreaCopy(1, 87, 104, 114, 116, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > + + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 117, 104, 172, 116, LBLX, CLINE(CONTROL_CASE_SAVE)); // Store Configuration + DWIN_Frame_AreaCopy(1, 174, 103, 229, 116, LBLX, CLINE(CONTROL_CASE_LOAD)); // Read Configuration + DWIN_Frame_AreaCopy(1, 1, 118, 56, 131, LBLX, CLINE(CONTROL_CASE_RESET)); // Reset Configuration + #endif + + if (CVISI(CONTROL_CASE_INFO)) + DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Info > } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_CONTROL)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(5), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); - if (CVISI(6)) DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(6), F("Info")); - #else - if (CVISI(3)) DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Info")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); #endif + if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_INFO), F("Info")); #else - DWIN_Frame_AreaCopy(1, 128, 2, 176, 12, 14, 8); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(1)); // Temperature > - DWIN_Frame_AreaCopy(1, 84, 89, 128, 99, LBLX, CLINE(2)); // Motion > + DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control" + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > + DWIN_Frame_AreaCopy(1, 84, 89, 128, 99, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX, CLINE(3)); // "Store Configuration" - DWIN_Frame_AreaCopy(1, 26, 104, 57, 114, LBLX, CLINE(4)); // "Read" - DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 34, CLINE(4)); // "Configuration" - DWIN_Frame_AreaCopy(1, 59, 104, 93, 114, LBLX, CLINE(5)); // "Reset" - DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 37, CLINE(5)); // "Configuration" - if (CVISI(6)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > - #else - if (CVISI(3)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(3)); // Info > + DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX , CLINE(CONTROL_CASE_SAVE // "Store Configuration" + DWIN_Frame_AreaCopy(1, 26, 104, 57, 114, LBLX , CLINE(CONTROL_CASE_LOAD)); // "Read" + DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 34, CLINE(CONTROL_CASE_LOAD)); // "Configuration" + DWIN_Frame_AreaCopy(1, 59, 104, 93, 114, LBLX , CLINE(CONTROL_CASE_RESET)); // "Reset" + DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 37, CLINE(CONTROL_CASE_RESET)); // "Configuration" #endif + if (CVISI(CONTROL_CASE_INFO)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(CONTROL_CASE_INFO)); // Info > #endif } @@ -674,12 +743,23 @@ inline void Draw_Control_Menu() { Draw_Menu_Cursor(CSCROL(select_control.now)); // Draw icons and lines - LOOP_L_N(i, 6) - if (CVISI(i + 1)) Draw_Menu_Line(CSCROL(i + 1), ICON_Temperature + i); + uint8_t i = 0; + #define _TEMP_ICON(N) do{ ++i; if (CVISI(i)) Draw_Menu_Line(CSCROL(i), ICON_SetEndTemp + (N) - 1); }while(0) - Draw_More_Icon(CSCROL(1)); - Draw_More_Icon(CSCROL(2)); - if (CVISI(6)) Draw_More_Icon(CSCROL(6)); + _TEMP_ICON(CONTROL_CASE_TEMP); + if (CVISI(i)) Draw_More_Icon(CSCROL(i)); + + _TEMP_ICON(CONTROL_CASE_MOVE); + Draw_More_Icon(CSCROL(i)); + + #if ENABLED(EEPROM_SETTINGS) + _TEMP_ICON(CONTROL_CASE_SAVE); + _TEMP_ICON(CONTROL_CASE_LOAD); + _TEMP_ICON(CONTROL_CASE_RESET); + #endif + + _TEMP_ICON(CONTROL_CASE_INFO); + if (CVISI(CONTROL_CASE_INFO)) Draw_More_Icon(CSCROL(i)); } inline void Draw_Tune_Menu() { @@ -687,46 +767,76 @@ inline void Draw_Tune_Menu() { if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 73, 2, 100, 13, 14, 9); - DWIN_Frame_AreaCopy(1, 116, 164, 171, 176, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 116, 164, 171, 176, LBLX, MBASE(TUNE_CASE_SPEED)); + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(TUNE_CASE_TEMP)); + #endif + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(TUNE_CASE_BED)); + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(TUNE_CASE_FAN)); + #endif + #if HAS_ZOFFSET_ITEM + DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(TUNE_CASE_ZOFF)); + #endif } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TUNE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), GET_TEXT_F(MSG_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(5), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_SPEED), GET_TEXT_F(MSG_SPEED)); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + #endif + #if HAS_HEATED_BED + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + #endif + #if HAS_FAN + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_ZOFF), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else DWIN_Frame_AreaCopy(1, 94, 2, 126, 12, 14, 9); - DWIN_Frame_AreaCopy(1, 1, 179, 92, 190, LBLX, MBASE(1)); // print speed - DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(2)); // Hotend... - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(3)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(3)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(4)); // fan speed - DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(5)); // Z-offset + DWIN_Frame_AreaCopy(1, 1, 179, 92, 190, LBLX, MBASE(TUNE_CASE_SPEED)); // Print speed + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(TUNE_CASE_TEMP)); // Hotend... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(TUNE_CASE_TEMP)); // ...Temperature + #endif + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(TUNE_CASE_BED)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(TUNE_CASE_BED)); // ...Temperature + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(TUNE_CASE_FAN)); // Fan speed + #endif + #if HAS_ZOFFSET_ITEM + DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(TUNE_CASE_ZOFF)); // Z-offset + #endif #endif } Draw_Back_First(select_tune.now == 0); if (select_tune.now) Draw_Menu_Cursor(select_tune.now); - Draw_Menu_Line(1, ICON_Speed); - Draw_Menu_Line(2, ICON_HotendTemp); - Draw_Menu_Line(3, ICON_BedTemp); - Draw_Menu_Line(4, ICON_FanSpeed); - Draw_Menu_Line(5, ICON_Zoffset); + Draw_Menu_Line(TUNE_CASE_SPEED, ICON_Speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_SPEED), feedrate_percentage); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), feedrate_percentage); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), thermalManager.temp_hotend[0].target); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), thermalManager.temp_bed.target); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(4), thermalManager.fan_speed[0]); - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(5), BABY_Z_VAR * 100); + #if HAS_HOTEND + Draw_Menu_Line(TUNE_CASE_TEMP, ICON_HotendTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.temp_hotend[0].target); + #endif + #if HAS_HEATED_BED + Draw_Menu_Line(TUNE_CASE_BED, ICON_BedTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.temp_bed.target); + #endif + #if HAS_FAN + Draw_Menu_Line(TUNE_CASE_FAN, ICON_FanSpeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_FAN), thermalManager.fan_speed[0]); + #endif + #if HAS_ZOFFSET_ITEM + Draw_Menu_Line(TUNE_CASE_ZOFF, ICON_Zoffset); + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(TUNE_CASE_ZOFF), BABY_Z_VAR * 100); + #endif } inline void draw_max_en(const uint16_t line) { @@ -762,74 +872,84 @@ inline void Draw_Motion_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 1, 16, 28, 28, 14, 8); - - DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, MBASE(1)); // Max speed - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(2)); // Max... - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(2) + 1); // ...acceleration - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(3)); // Max... - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); // ... - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 54, MBASE(3)); // ...jerk - DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(4)); // Flow ratio + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Motion" + DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, MBASE(MOTION_CASE_RATE)); // Max speed + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(MOTION_CASE_ACCEL)); // Max... + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(MOTION_CASE_ACCEL) + 1); // ...Acceleration + #if HAS_CLASSIC_JERK + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(MOTION_CASE_JERK)); // Max... + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(MOTION_CASE_JERK) + 1); // ... + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 54, MBASE(MOTION_CASE_JERK)); // ...Jerk + #endif + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(MOTION_CASE_STEPS)); // Flow ratio } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOTION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Feedrate")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), GET_TEXT_F(MSG_ACCELERATION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_STEPS_PER_MM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(MOTION_CASE_RATE), F("Feedrate")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(MOTION_CASE_ACCEL), GET_TEXT_F(MSG_ACCELERATION)); + #if HAS_CLASSIC_JERK + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(MOTION_CASE_JERK), GET_TEXT_F(MSG_JERK)); + #endif + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(MOTION_CASE_STEPS), GET_TEXT_F(MSG_STEPS_PER_MM)); #else - DWIN_Frame_AreaCopy(1, 144, 16, 189, 26, 14, 8); - draw_max_en(MBASE(1)); draw_speed_en(27, MBASE(1)); // "Max Speed" - draw_max_accel_en(MBASE(2)); // "Max Acceleration" - draw_max_en(MBASE(3)); draw_jerk_en(MBASE(3)); // "Max Jerk" - draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Motion" + draw_max_en(MBASE(MOTION_CASE_RATE)); draw_speed_en(27, MBASE(MOTION_CASE_RATE)); // "Max Speed" + draw_max_accel_en(MBASE(MOTION_CASE_ACCEL)); // "Max Acceleration" + #if HAS_CLASSIC_JERK + draw_max_en(MBASE(MOTION_CASE_JERK)); draw_jerk_en(MBASE(MOTION_CASE_JERK)); // "Max Jerk" + #endif + draw_steps_per_mm(MBASE(MOTION_CASE_STEPS)); // "Steps-per-mm" #endif } Draw_Back_First(select_motion.now == 0); if (select_motion.now) Draw_Menu_Cursor(select_motion.now); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeed + i); - - Draw_More_Icon(1); - Draw_More_Icon(2); - Draw_More_Icon(3); - Draw_More_Icon(4); + uint8_t i = 0; + #define _MOTION_ICON(N) Draw_Menu_Line(++i, ICON_MaxSpeed + (N) - 1) + _MOTION_ICON(MOTION_CASE_RATE); Draw_More_Icon(i); + _MOTION_ICON(MOTION_CASE_ACCEL); Draw_More_Icon(i); + #if HAS_CLASSIC_JERK + _MOTION_ICON(MOTION_CASE_JERK); Draw_More_Icon(i); + #endif + _MOTION_ICON(MOTION_CASE_STEPS); Draw_More_Icon(i); } // // Draw Popup Windows // +#if HAS_HOTEND || HAS_HEATED_BED -void Popup_Window_Temperature(const bool toohigh) { - Clear_Popup_Area(); - Draw_Popup_Bkgd_105(); - if (toohigh) { - DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); - if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 103, 371, 237, 386, 52, 285); - DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); + void DWIN_Popup_Temperature(const bool toohigh) { + Clear_Popup_Area(); + Draw_Popup_Bkgd_105(); + if (toohigh) { + DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); + if (HMI_flag.language_chinese) { + DWIN_Frame_AreaCopy(1, 103, 371, 237, 386, 52, 285); + DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); + DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); + } + else { + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, F("is too high")); + } } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, F("is too high")); + DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); + if (HMI_flag.language_chinese) { + DWIN_Frame_AreaCopy(1, 103, 371, 270, 386, 52, 285); + DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); + } + else { + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, F("is too low")); + } } } - else { - DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); - if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 103, 371, 270, 386, 52, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); - } - else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, F("is too low")); - } - } -} + +#endif inline void Draw_Popup_Bkgd_60() { DWIN_Draw_Rectangle(1, Background_window, 14, 60, 258, 330); @@ -837,7 +957,7 @@ inline void Draw_Popup_Bkgd_60() { #if HAS_HOTEND - void Popup_Window_ETempTooLow(void) { + void Popup_Window_ETempTooLow() { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); @@ -854,7 +974,7 @@ inline void Draw_Popup_Bkgd_60() { #endif -void Popup_Window_Resume(void) { +void Popup_Window_Resume() { Clear_Popup_Area(); Draw_Popup_Bkgd_105(); if (HMI_flag.language_chinese) { @@ -864,15 +984,15 @@ void Popup_Window_Resume(void) { DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 307); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 120, 115, F("Tips")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 192, F("I see the file stopped")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 68, 212, F("unexpectedly last time")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 14) / 2, 115, F("Continue Print")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 22) / 2, 192, F("It looks like the last")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 22) / 2, 212, F("file was interrupted.")); DWIN_ICON_Show(ICON, ICON_Continue_E, 26, 307); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 307); } } -void Popup_Window_Home(void) { +void Popup_Window_Home(const bool parking/*=false*/) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_BLTouch, 101, 105); @@ -882,24 +1002,28 @@ void Popup_Window_Home(void) { DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 80, 230, GET_TEXT_F(MSG_LEVEL_BED_HOMING)); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, F("Please wait until completed")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * (parking ? 7 : 10)) / 2, 230, parking ? F("Parking") : F("Homing XYZ")); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); } } -void Popup_Window_Leveling(void) { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105); - if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 0, 371, 100, 386, 84, 240); - DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); +#if HAS_ONESTEP_LEVELING + + void Popup_Window_Leveling() { + Clear_Main_Window(); + Draw_Popup_Bkgd_60(); + DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105); + if (HMI_flag.language_chinese) { + DWIN_Frame_AreaCopy(1, 0, 371, 100, 386, 84, 240); + DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); + } + else { + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 13) / 2, 230, GET_TEXT_F(MSG_BED_LEVELING)); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); + } } - else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 76, 230, GET_TEXT_F(MSG_BED_LEVELING)); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, F("Please wait until completed")); - } -} + +#endif void Draw_Select_Highlight(const bool sel) { HMI_flag.select_flag = sel; @@ -911,34 +1035,34 @@ void Draw_Select_Highlight(const bool sel) { DWIN_Draw_Rectangle(0, c2, 144, 278, 247, 319); } -void Popup_window_PauseOrStop(void) { +void Popup_window_PauseOrStop() { Clear_Main_Window(); Draw_Popup_Bkgd_60(); if (HMI_flag.language_chinese) { - if (select_print.now == 1) DWIN_Frame_AreaCopy(1, 237, 338, 269, 356, 98, 150); + if (select_print.now == 1) DWIN_Frame_AreaCopy(1, 237, 338, 269, 356, 98, 150); else if (select_print.now == 2) DWIN_Frame_AreaCopy(1, 221, 320, 253, 336, 98, 150); DWIN_Frame_AreaCopy(1, 220, 304, 264, 319, 130, 150); DWIN_ICON_Show(ICON, ICON_Confirm_C, 26, 280); DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); } else { - if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 88, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); - else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 150, GET_TEXT_F(MSG_STOP_PRINT)); + if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 11) / 2, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); + else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 10) / 2, 150, GET_TEXT_F(MSG_STOP_PRINT)); DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); } Draw_Select_Highlight(true); } -void Draw_Printing_Screen(void) { +void Draw_Printing_Screen() { if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 30, 1, 71, 14, 14, 9); // Tune - DWIN_Frame_AreaCopy(1, 0, 72, 63, 86, 41, 188); // Pause + DWIN_Frame_AreaCopy(1, 30, 1, 71, 14, 14, 9); // Tune + DWIN_Frame_AreaCopy(1, 0, 72, 63, 86, 41, 188); // Pause DWIN_Frame_AreaCopy(1, 65, 72, 128, 86, 176, 188); // Stop } else { - DWIN_Frame_AreaCopy(1, 40, 2, 92, 14, 14, 9); // Tune - DWIN_Frame_AreaCopy(1, 0, 44, 96, 58, 41, 188); // Pause + DWIN_Frame_AreaCopy(1, 40, 2, 92, 14, 14, 9); // Tune + DWIN_Frame_AreaCopy(1, 0, 44, 96, 58, 41, 188); // Pause DWIN_Frame_AreaCopy(1, 98, 44, 152, 58, 176, 188); // Stop } } @@ -963,7 +1087,7 @@ void Draw_Print_ProgressRemain() { DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 200, 212, (remain_time % 3600) / 60); } -void Goto_PrintProcess(void) { +void Goto_PrintProcess() { checkkey = PrintProcess; Clear_Main_Window(); @@ -986,7 +1110,7 @@ void Goto_PrintProcess(void) { Draw_Print_ProgressRemain(); } -void Goto_MainMenu(void) { +void Goto_MainMenu() { checkkey = MainMenu; Clear_Main_Window(); @@ -1011,6 +1135,7 @@ void Goto_MainMenu(void) { } inline ENCODER_DiffState get_encoder_state() { + static millis_t Encoder_ms = 0; const millis_t ms = millis(); if (PENDING(ms, Encoder_ms)) return ENCODER_DIFF_NO; const ENCODER_DiffState state = Encoder_ReceiveAnalyze(); @@ -1018,7 +1143,7 @@ inline ENCODER_DiffState get_encoder_state() { return state; } -void HMI_Move_X(void) { +void HMI_Move_X() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { @@ -1029,7 +1154,7 @@ void HMI_Move_X(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; - EncoderRate.encoderRateEnabled = 0; + EncoderRate.enabled = false; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); if (!planner.is_full()) { // Wait for planner moves to finish! @@ -1047,7 +1172,7 @@ void HMI_Move_X(void) { } } -void HMI_Move_Y(void) { +void HMI_Move_Y() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { @@ -1058,7 +1183,7 @@ void HMI_Move_Y(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; - EncoderRate.encoderRateEnabled = 0; + EncoderRate.enabled = false; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); if (!planner.is_full()) { // Wait for planner moves to finish! @@ -1076,7 +1201,7 @@ void HMI_Move_Y(void) { } } -void HMI_Move_Z(void) { +void HMI_Move_Z() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { @@ -1087,7 +1212,7 @@ void HMI_Move_Z(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; - EncoderRate.encoderRateEnabled = 0; + EncoderRate.enabled = false; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); if (!planner.is_full()) { // Wait for planner moves to finish! @@ -1107,7 +1232,8 @@ void HMI_Move_Z(void) { #if HAS_HOTEND - void HMI_Move_E(void) { + void HMI_Move_E() { + static float last_E_scale = 0; ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { @@ -1118,7 +1244,7 @@ void HMI_Move_Z(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; - EncoderRate.encoderRateEnabled = 0; + EncoderRate.enabled = false; last_E_scale = HMI_ValueStruct.Move_E_scale; DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); if (!planner.is_full()) { @@ -1140,53 +1266,66 @@ void HMI_Move_Z(void) { #endif -void HMI_Zoffset(void) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - last_zoffset = dwin_zoffset; - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.offset_value += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.offset_value -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - EncoderRate.encoderRateEnabled = 0; - dwin_zoffset = HMI_ValueStruct.offset_value / 100; - #if HAS_BED_PROBE - if (WITHIN(dwin_zoffset - last_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) - probe.offset.z = dwin_zoffset; - TERN_(EEPROM_SETTINGS, settings.save()); - #elif ENABLED(BABYSTEPPING) - babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset); - #endif +#if HAS_ZOFFSET_ITEM - if (HMI_ValueStruct.show_mode == -4) { - checkkey = Prepare; - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(4 + MROWS - index_prepare), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); + bool printer_busy() { return planner.movesplanned() || printingIsActive(); } + + void HMI_Zoffset() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + uint8_t zoff_line; + switch (HMI_ValueStruct.show_mode) { + case -4: zoff_line = PREPARE_CASE_ZOFF + MROWS - index_prepare; break; + default: zoff_line = TUNE_CASE_ZOFF + MROWS - index_tune; } - else { - checkkey = Tune; - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(5 + MROWS - index_tune), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); + if (encoder_diffState == ENCODER_DIFF_CW) + HMI_ValueStruct.offset_value += EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_CCW) + HMI_ValueStruct.offset_value -= EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + EncoderRate.enabled = false; + #if HAS_BED_PROBE + probe.offset.z = dwin_zoffset; + TERN_(EEPROM_SETTINGS, settings.save()); + #endif + if (HMI_ValueStruct.show_mode == -4) { + checkkey = Prepare; + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); + } + else { + checkkey = Tune; + DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); + } + DWIN_UpdateLCD(); + return; } + NOLESS(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100); + NOMORE(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MAX) * 100); + last_zoffset = dwin_zoffset; + dwin_zoffset = HMI_ValueStruct.offset_value / 100.0f; + #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) + if ( (ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_known()) && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()) ) + babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset); + #endif + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(zoff_line), HMI_ValueStruct.offset_value); DWIN_UpdateLCD(); - return; } - NOLESS(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100); - NOMORE(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MAX) * 100); - if (HMI_ValueStruct.show_mode == -4) - DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(4 + MROWS - index_prepare), HMI_ValueStruct.offset_value); - else - DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(5 + MROWS - index_tune), HMI_ValueStruct.offset_value); - DWIN_UpdateLCD(); } -} + +#endif // HAS_ZOFFSET_ITEM #if HAS_HOTEND - void HMI_ETemp(void) { + void HMI_ETemp() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { + uint8_t temp_line; + switch (HMI_ValueStruct.show_mode) { + case -1: temp_line = TEMP_CASE_TEMP; break; + case -2: temp_line = PREHEAT_CASE_TEMP; break; + case -3: temp_line = PREHEAT_CASE_TEMP; break; + default: temp_line = TUNE_CASE_TEMP + MROWS - index_tune; + } if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.E_Temp += EncoderRate.encoderMoveValue; } @@ -1194,26 +1333,26 @@ void HMI_Zoffset(void) { HMI_ValueStruct.E_Temp -= EncoderRate.encoderMoveValue; } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return - EncoderRate.encoderRateEnabled = 0; + EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { // temperature checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(temp_line), ui.material_preset[0].hotend_temp); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(temp_line), ui.material_preset[1].hotend_temp); return; } else { // tune checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2 + MROWS - index_tune), HMI_ValueStruct.E_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0); return; @@ -1222,10 +1361,7 @@ void HMI_Zoffset(void) { NOMORE(HMI_ValueStruct.E_Temp, MAX_E_TEMP); NOLESS(HMI_ValueStruct.E_Temp, MIN_E_TEMP); // E_Temp value - if (HMI_ValueStruct.show_mode >= 0) // tune - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2 + MROWS - index_tune), HMI_ValueStruct.E_Temp); - else // other page - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } } @@ -1233,9 +1369,16 @@ void HMI_Zoffset(void) { #if HAS_HEATED_BED - void HMI_BedTemp(void) { + void HMI_BedTemp() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { + uint8_t bed_line; + switch (HMI_ValueStruct.show_mode) { + case -1: bed_line = TEMP_CASE_BED; break; + case -2: bed_line = PREHEAT_CASE_BED; break; + case -3: bed_line = PREHEAT_CASE_BED; break; + default: bed_line = TUNE_CASE_BED + MROWS - index_tune; + } if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Bed_Temp += EncoderRate.encoderMoveValue; } @@ -1243,26 +1386,26 @@ void HMI_Zoffset(void) { HMI_ValueStruct.Bed_Temp -= EncoderRate.encoderMoveValue; } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return - EncoderRate.encoderRateEnabled = 0; + EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(bed_line), ui.material_preset[0].bed_temp); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(bed_line), ui.material_preset[1].bed_temp); return; } else { checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3 + MROWS - index_tune), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); return; @@ -1271,20 +1414,25 @@ void HMI_Zoffset(void) { NOMORE(HMI_ValueStruct.Bed_Temp, BED_MAX_TARGET); NOLESS(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP); // Bed_Temp value - if (HMI_ValueStruct.show_mode >= 0) // tune page - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3 + MROWS - index_tune), HMI_ValueStruct.Bed_Temp); - else // other page - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } } #endif // HAS_HEATED_BED -#if HAS_FAN +#if HAS_PREHEAT - void HMI_FanSpeed(void) { + void HMI_FanSpeed() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { + uint8_t fan_line; + switch (HMI_ValueStruct.show_mode) { + case -1: fan_line = TEMP_CASE_FAN; break; + case -2: fan_line = PREHEAT_CASE_FAN; break; + case -3: fan_line = PREHEAT_CASE_FAN; break; + default: fan_line = TUNE_CASE_FAN + MROWS - index_tune; + } + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Fan_speed += EncoderRate.encoderMoveValue; } @@ -1292,26 +1440,26 @@ void HMI_Zoffset(void) { HMI_ValueStruct.Fan_speed -= EncoderRate.encoderMoveValue; } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return - EncoderRate.encoderRateEnabled = 0; + EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].fan_speed = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(fan_line), ui.material_preset[0].fan_speed); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(fan_line), ui.material_preset[1].fan_speed); return; } else { checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(4 + MROWS - index_tune), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); return; @@ -1320,16 +1468,13 @@ void HMI_Zoffset(void) { NOMORE(HMI_ValueStruct.Fan_speed, FANON); NOLESS(HMI_ValueStruct.Fan_speed, FANOFF); // Fan_speed value - if (HMI_ValueStruct.show_mode >= 0) // tune page - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(4 + MROWS - index_tune), HMI_ValueStruct.Fan_speed); - else // other page - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } } -#endif // HAS_FAN +#endif // HAS_PREHEAT -void HMI_PrintSpeed(void) { +void HMI_PrintSpeed() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { @@ -1340,20 +1485,20 @@ void HMI_PrintSpeed(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = Tune; - EncoderRate.encoderRateEnabled = 0; + EncoderRate.enabled = false; feedrate_percentage = HMI_ValueStruct.print_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1 + MROWS - index_tune), HMI_ValueStruct.print_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); return; } // print_speed limit NOMORE(HMI_ValueStruct.print_speed, MAX_PRINT_SPEED); NOLESS(HMI_ValueStruct.print_speed, MIN_PRINT_SPEED); // print_speed value - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1 + MROWS - index_tune), HMI_ValueStruct.print_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); } } -void HMI_MaxFeedspeedXYZE(void) { +void HMI_MaxFeedspeedXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { @@ -1364,82 +1509,76 @@ void HMI_MaxFeedspeedXYZE(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = MaxSpeed; - EncoderRate.encoderRateEnabled = 0; - if (WITHIN(HMI_flag.feedspeed_flag, X_AXIS, E_AXIS)) - planner.set_max_feedrate(HMI_flag.feedspeed_flag, HMI_ValueStruct.Max_Feedspeed); + EncoderRate.enabled = false; + if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) + planner.set_max_feedrate(HMI_flag.feedspeed_axis, HMI_ValueStruct.Max_Feedspeed); DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); return; } // MaxFeedspeed limit - if (WITHIN(HMI_flag.feedspeed_flag, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Feedspeed, default_max_feedrate[HMI_flag.feedspeed_flag] * 2); + if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Feedspeed, default_max_feedrate[HMI_flag.feedspeed_axis] * 2); if (HMI_ValueStruct.Max_Feedspeed < MIN_MAXFEEDSPEED) HMI_ValueStruct.Max_Feedspeed = MIN_MAXFEEDSPEED; // MaxFeedspeed value DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); } } -void HMI_MaxAccelerationXYZE(void) { +void HMI_MaxAccelerationXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Max_Acceleration += EncoderRate.encoderMoveValue;} else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Max_Acceleration -= EncoderRate.encoderMoveValue;} else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = MaxAcceleration; - EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.acc_flag == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_flag == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_flag == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration); + EncoderRate.enabled = false; + if (HMI_flag.acc_axis == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); + else if (HMI_flag.acc_axis == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration); + else if (HMI_flag.acc_axis == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration); #if HAS_HOTEND - else if (HMI_flag.acc_flag == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); + else if (HMI_flag.acc_axis == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); #endif DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); return; } // MaxAcceleration limit - if (WITHIN(HMI_flag.acc_flag, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Acceleration, default_max_acceleration[HMI_flag.acc_flag] * 2); + if (WITHIN(HMI_flag.acc_axis, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Acceleration, default_max_acceleration[HMI_flag.acc_axis] * 2); if (HMI_ValueStruct.Max_Acceleration < MIN_MAXACCELERATION) HMI_ValueStruct.Max_Acceleration = MIN_MAXACCELERATION; // MaxAcceleration value DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); } } -void HMI_MaxJerkXYZE(void) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Max_Jerk += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Max_Jerk -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return - checkkey = MaxJerk; - EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.jerk_flag == X_AXIS) planner.set_max_jerk(X_AXIS, HMI_ValueStruct.Max_Jerk / 10); - else if (HMI_flag.jerk_flag == Y_AXIS) planner.set_max_jerk(Y_AXIS, HMI_ValueStruct.Max_Jerk / 10); - else if (HMI_flag.jerk_flag == Z_AXIS) planner.set_max_jerk(Z_AXIS, HMI_ValueStruct.Max_Jerk / 10); - else if (HMI_flag.jerk_flag == E_AXIS) planner.set_max_jerk(E_AXIS, HMI_ValueStruct.Max_Jerk / 10); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - return; - } - // MaxJerk limit - if (HMI_flag.jerk_flag == X_AXIS) - NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[X_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.jerk_flag == Y_AXIS) - NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[Y_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.jerk_flag == Z_AXIS) - NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[Z_AXIS] * 2 * MINUNITMULT); - else if (HMI_flag.jerk_flag == E_AXIS) - NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[E_AXIS] * 2 * MINUNITMULT); - NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXJERK) * MINUNITMULT); - // MaxJerk value - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - } -} +#if HAS_CLASSIC_JERK -void HMI_StepXYZE(void) { + void HMI_MaxJerkXYZE() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (encoder_diffState == ENCODER_DIFF_CW) + HMI_ValueStruct.Max_Jerk += EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_CCW) + HMI_ValueStruct.Max_Jerk -= EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + checkkey = MaxJerk; + EncoderRate.enabled = false; + if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + planner.set_max_jerk(HMI_flag.step_axis, HMI_ValueStruct.Max_Jerk / 10); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + return; + } + // MaxJerk limit + if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXJERK) * MINUNITMULT); + // MaxJerk value + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + } + } + +#endif // HAS_CLASSIC_JERK + +void HMI_StepXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_CW) { @@ -1450,71 +1589,100 @@ void HMI_StepXYZE(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = Step; - EncoderRate.encoderRateEnabled = 0; - if (WITHIN(HMI_flag.step_flag, X_AXIS, E_AXIS)) - planner.settings.axis_steps_per_mm[HMI_flag.step_flag] = HMI_ValueStruct.Max_Step / 10; + EncoderRate.enabled = false; + if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + planner.settings.axis_steps_per_mm[HMI_flag.step_axis] = HMI_ValueStruct.Max_Step / 10; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); return; } // Step limit - if (WITHIN(HMI_flag.step_flag, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[HMI_flag.step_flag] * 2 * MINUNITMULT); + if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[HMI_flag.step_axis] * 2 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); // Step value DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); } } -void update_variable(void) { +void update_variable() { + #if HAS_HOTEND + static float last_temp_hotend_target = 0, last_temp_hotend_current = 0; + #endif + #if HAS_HEATED_BED + static float last_temp_bed_target = 0, last_temp_bed_current = 0; + #endif + #if HAS_FAN + static uint8_t last_fan_speed = 0; + #endif + /* Tune page temperature update */ if (checkkey == Tune) { - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2 + MROWS - index_tune), thermalManager.temp_hotend[0].target); - if (last_temp_bed_target != thermalManager.temp_bed.target) - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3 + MROWS - index_tune), thermalManager.temp_bed.target); - if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(4 + MROWS - index_tune), thermalManager.fan_speed[0]); - last_fan_speed = thermalManager.fan_speed[0]; - } + #if HAS_HOTEND + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + #endif + #if HAS_HEATED_BED + if (last_temp_bed_target != thermalManager.temp_bed.target) + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + #endif + #if HAS_FAN + if (last_fan_speed != thermalManager.fan_speed[0]) { + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); + last_fan_speed = thermalManager.fan_speed[0]; + } + #endif } /* Temperature page temperature update */ if (checkkey == TemperatureID) { - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); - if (last_temp_bed_target != thermalManager.temp_bed.target) - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), thermalManager.temp_bed.target); - if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), thermalManager.fan_speed[0]); - last_fan_speed = thermalManager.fan_speed[0]; - } + #if HAS_HOTEND + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TEMP_CASE_TEMP), thermalManager.temp_hotend[0].target); + #endif + #if HAS_HEATED_BED + if (last_temp_bed_target != thermalManager.temp_bed.target) + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TEMP_CASE_BED), thermalManager.temp_bed.target); + #endif + #if HAS_FAN + if (last_fan_speed != thermalManager.fan_speed[0]) { + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TEMP_CASE_FAN), thermalManager.fan_speed[0]); + last_fan_speed = thermalManager.fan_speed[0]; + } + #endif } /* Bottom temperature update */ - if (last_temp_hotend_current != thermalManager.temp_hotend[0].celsius) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - last_temp_hotend_current = thermalManager.temp_hotend[0].celsius; - } - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); - last_temp_hotend_target = thermalManager.temp_hotend[0].target; - } - if (last_temp_bed_current != thermalManager.temp_bed.celsius) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); - last_temp_bed_current = thermalManager.temp_bed.celsius; - } - if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); - last_temp_bed_target = thermalManager.temp_bed.target; - } + #if HAS_HOTEND + if (last_temp_hotend_current != thermalManager.temp_hotend[0].celsius) { + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); + last_temp_hotend_current = thermalManager.temp_hotend[0].celsius; + } + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); + last_temp_hotend_target = thermalManager.temp_hotend[0].target; + } + #endif + #if HAS_HEATED_BED + if (last_temp_bed_current != thermalManager.temp_bed.celsius) { + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); + last_temp_bed_current = thermalManager.temp_bed.celsius; + } + if (last_temp_bed_target != thermalManager.temp_bed.target) { + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); + last_temp_bed_target = thermalManager.temp_bed.target; + } + #endif + static uint16_t last_speed = 0; if (last_speed != feedrate_percentage) { DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); last_speed = feedrate_percentage; } - if (last_zoffset != BABY_Z_VAR) { - DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, BABY_Z_VAR * 100); - last_zoffset = BABY_Z_VAR; - } + #if HAS_ZOFFSET_ITEM + if (last_zoffset != BABY_Z_VAR) { + DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, BABY_Z_VAR * 100); + last_zoffset = BABY_Z_VAR; + } + #endif } /** @@ -1553,38 +1721,37 @@ inline void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_ while (pos--) dst[pos] = src[pos]; } -inline void HMI_SDCardInit(void) { card.cdroot(); } +inline void HMI_SDCardInit() { card.cdroot(); } -void MarlinUI::refresh() { - // The card was mounted or unmounted - // or some other status change occurred - // DWIN_lcd_sd_status = false; // On next DWIN_Update - // HMI_SDCardUpdate(); -} +void MarlinUI::refresh() { /* Nothing to see here */ } #define ICON_Folder ICON_More -char shift_name[LONG_FILENAME_LENGTH + 1]; -int8_t shift_amt; // = 0 -millis_t shift_ms; // = 0 +#if ENABLED(SCROLL_LONG_FILENAMES) -// Init the shift name based on the highlighted item -inline void Init_Shift_Name() { - const bool is_subdir = !card.flag.workDirIsRoot; - const int8_t filenum = select_file.now - 1 - is_subdir; // Skip "Back" and ".." - const uint16_t fileCnt = card.get_num_Files(); - if (WITHIN(filenum, 0, fileCnt - 1)) { - card.getfilename_sorted(SD_ORDER(filenum, fileCnt)); - char * const name = card.longest_filename(); - make_name_without_ext(shift_name, name, 100); + char shift_name[LONG_FILENAME_LENGTH + 1]; + int8_t shift_amt; // = 0 + millis_t shift_ms; // = 0 + + // Init the shift name based on the highlighted item + inline void Init_Shift_Name() { + const bool is_subdir = !card.flag.workDirIsRoot; + const int8_t filenum = select_file.now - 1 - is_subdir; // Skip "Back" and ".." + const uint16_t fileCnt = card.get_num_Files(); + if (WITHIN(filenum, 0, fileCnt - 1)) { + card.getfilename_sorted(SD_ORDER(filenum, fileCnt)); + char * const name = card.longest_filename(); + make_name_without_ext(shift_name, name, 100); + } } -} -inline void Init_SDItem_Shift() { - shift_amt = 0; - shift_ms = select_file.now > 0 && strlen(shift_name) > MENU_CHAR_LIMIT - ? millis() + 750UL : 0; -} + inline void Init_SDItem_Shift() { + shift_amt = 0; + shift_ms = select_file.now > 0 && strlen(shift_name) > MENU_CHAR_LIMIT + ? millis() + 750UL : 0; + } + +#endif /** * Display an SD item, adding a CDUP for subfolders. @@ -1600,37 +1767,42 @@ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { card.getfilename_sorted(item - is_subdir); char * const name = card.longest_filename(); - // Init the current selected name - // This is used during scroll drawing - if (item == select_file.now - 1) { - make_name_without_ext(shift_name, name, 100); - Init_SDItem_Shift(); - } + #if ENABLED(SCROLL_LONG_FILENAMES) + // Init the current selected name + // This is used during scroll drawing + if (item == select_file.now - 1) { + make_name_without_ext(shift_name, name, 100); + Init_SDItem_Shift(); + } + #endif + // Draw the file/folder with name aligned left char str[strlen(name) + 1]; - make_name_without_ext(str, name); - Draw_Menu_Line(row, card.flag.filenameIsDir ? ICON_Folder : ICON_File, str); } -inline void Draw_SDItem_Shifted(int8_t &shift) { - // Limit to the number of chars past the cutoff - const size_t len = strlen(shift_name); - NOMORE(shift, _MAX((signed)len - MENU_CHAR_LIMIT, 0)); +#if ENABLED(SCROLL_LONG_FILENAMES) - // Shorten to the available space - const size_t lastchar = _MIN((signed)len, shift + MENU_CHAR_LIMIT); + inline void Draw_SDItem_Shifted(int8_t &shift) { + // Limit to the number of chars past the cutoff + const size_t len = strlen(shift_name); + NOMORE(shift, _MAX((signed)len - MENU_CHAR_LIMIT, 0)); - const char c = shift_name[lastchar]; - shift_name[lastchar] = '\0'; + // Shorten to the available space + const size_t lastchar = _MIN((signed)len, shift + MENU_CHAR_LIMIT); - const uint8_t row = select_file.now + MROWS - index_file; // skip "Back" and scroll - Erase_Menu_Text(row); - Draw_Menu_Line(row, 0, &shift_name[shift]); + const char c = shift_name[lastchar]; + shift_name[lastchar] = '\0'; - shift_name[lastchar] = c; -} + const uint8_t row = select_file.now + MROWS - index_file; // skip "Back" and scroll + Erase_Menu_Text(row); + Draw_Menu_Line(row, 0, &shift_name[shift]); + + shift_name[lastchar] = c; + } + +#endif // Redraw the first set of SD Files inline void Redraw_SD_List() { @@ -1645,10 +1817,12 @@ inline void Redraw_SD_List() { LOOP_L_N(i, _MIN(nr_sd_menu_items(), MROWS)) Draw_SDItem(i, i + 1); - Init_SDItem_Shift(); + TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); } -inline void SDCard_Up(void) { +bool DWIN_lcd_sd_status = false; + +inline void SDCard_Up() { card.cdup(); Redraw_SD_List(); DWIN_lcd_sd_status = false; // On next DWIN_Update @@ -1663,7 +1837,7 @@ inline void SDCard_Folder(char * const dirname) { // // Watch for media mount / unmount // -void HMI_SDCardUpdate(void) { +void HMI_SDCardUpdate() { if (HMI_flag.home_flag) return; if (DWIN_lcd_sd_status != card.isMounted()) { DWIN_lcd_sd_status = card.isMounted(); @@ -1681,40 +1855,50 @@ void HMI_SDCardUpdate(void) { // TODO: Move card removed abort handling // to CardReader::manage_media. card.flag.abort_sd_printing = true; - wait_for_heatup = false; - abort_flag = true; + wait_for_heatup = false; + dwin_abort_flag = true; } } DWIN_UpdateLCD(); } } -/* Start */ +/* Start Frame */ + void HMI_StartFrame(const bool with_update) { Goto_MainMenu(); - DWIN_Draw_Rectangle(1, Background_black, 0, 360, DWIN_WIDTH, DWIN_HEIGHT - 1); + // Clear the bottom area of the screen + DWIN_Draw_Rectangle(1, Background_black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); - DWIN_ICON_Show(ICON, ICON_HotendTemp, 13, 381); + // + // Status Area + // + #if HAS_HOTEND + DWIN_ICON_Show(ICON, ICON_HotendTemp, 13, 381); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); + #endif #if HOTENDS > 1 // DWIN_ICON_Show(ICON,ICON_HotendTemp, 13, 381); #endif - DWIN_ICON_Show(ICON, ICON_BedTemp, 158, 381); - DWIN_ICON_Show(ICON, ICON_Speed, 13, 429); - DWIN_ICON_Show(ICON, ICON_Zoffset, 158, 428); - // Draw initial Status Area - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); + #if HAS_HEATED_BED + DWIN_ICON_Show(ICON, ICON_BedTemp, 158, 381); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); + #endif + DWIN_ICON_Show(ICON, ICON_Speed, 13, 429); DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 5 * STAT_CHR_W + 2, 429, F("%")); - DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178, 429, BABY_Z_VAR * 100); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); + #if HAS_ZOFFSET_ITEM + DWIN_ICON_Show(ICON, ICON_Zoffset, 158, 428); + DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178, 429, BABY_Z_VAR * 100); + #endif if (with_update) { DWIN_UpdateLCD(); @@ -1774,12 +1958,12 @@ inline void Draw_Print_File_Menu() { } /* Main Process */ -void HMI_MainMenu(void) { +void HMI_MainMenu() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_page.inc(3)) { + if (select_page.inc(4)) { switch (select_page.now) { case 0: ICON_Print(); break; case 1: ICON_Print(); ICON_Prepare(); break; @@ -1834,27 +2018,29 @@ void HMI_MainMenu(void) { } // Select (and Print) File -void HMI_SelectFile(void) { +void HMI_SelectFile() { ENCODER_DiffState encoder_diffState = get_encoder_state(); const uint16_t hasUpDir = !card.flag.workDirIsRoot; if (encoder_diffState == ENCODER_DIFF_NO) { - if (shift_ms && select_file.now >= 1 + hasUpDir) { - // Scroll selected filename every second - const millis_t ms = millis(); - if (ELAPSED(ms, shift_ms)) { - const bool was_reset = shift_amt < 0; - shift_ms = ms + 375UL + was_reset * 250UL; // ms per character - int8_t shift_new = shift_amt + 1; // Try to shift by... - Draw_SDItem_Shifted(shift_new); // Draw the item - if (!was_reset && shift_new == 0) // Was it limited to 0? - shift_ms = 0; // No scrolling needed - else if (shift_new == shift_amt) // Scroll reached the end - shift_new = -1; // Reset - shift_amt = shift_new; // Set new scroll + #if ENABLED(SCROLL_LONG_FILENAMES) + if (shift_ms && select_file.now >= 1 + hasUpDir) { + // Scroll selected filename every second + const millis_t ms = millis(); + if (ELAPSED(ms, shift_ms)) { + const bool was_reset = shift_amt < 0; + shift_ms = ms + 375UL + was_reset * 250UL; // ms per character + int8_t shift_new = shift_amt + 1; // Try to shift by... + Draw_SDItem_Shifted(shift_new); // Draw the item + if (!was_reset && shift_new == 0) // Was it limited to 0? + shift_ms = 0; // No scrolling needed + else if (shift_new == shift_amt) // Scroll reached the end + shift_new = -1; // Reset + shift_amt = shift_new; // Set new scroll + } } - } + #endif return; } @@ -1864,10 +2050,10 @@ void HMI_SelectFile(void) { const uint16_t fullCnt = nr_sd_menu_items(); if (encoder_diffState == ENCODER_DIFF_CW && fullCnt) { - if (select_file.inc(fullCnt)) { + if (select_file.inc(1 + fullCnt)) { const uint8_t itemnum = select_file.now - 1; // -1 for "Back" - if (shift_ms) { // If line was shifted - Erase_Menu_Text(select_file.now - 1 + MROWS - index_file); // Erase and + if (TERN0(SCROLL_LONG_FILENAMES, shift_ms)) { // If line was shifted + Erase_Menu_Text(itemnum + MROWS - index_file); // Erase and Draw_SDItem(itemnum - 1); // redraw } if (select_file.now > MROWS && select_file.now > index_file) { // Cursor past the bottom @@ -1877,15 +2063,15 @@ void HMI_SelectFile(void) { } else { Move_Highlight(1, select_file.now + MROWS - index_file); // Just move highlight - Init_Shift_Name(); // ...and init the shift name + TERN_(SCROLL_LONG_FILENAMES, Init_Shift_Name()); // ...and init the shift name } - Init_SDItem_Shift(); + TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); } } else if (encoder_diffState == ENCODER_DIFF_CCW && fullCnt) { if (select_file.dec()) { const uint8_t itemnum = select_file.now - 1; // -1 for "Back" - if (shift_ms) { // If line was shifted + if (TERN0(SCROLL_LONG_FILENAMES, shift_ms)) { // If line was shifted Erase_Menu_Text(select_file.now + 1 + MROWS - index_file); // Erase and Draw_SDItem(itemnum + 1); // redraw } @@ -1894,7 +2080,7 @@ void HMI_SelectFile(void) { Scroll_Menu(DWIN_SCROLL_DOWN); if (index_file == MROWS) { Draw_Back_First(); - shift_ms = 0; + TERN_(SCROLL_LONG_FILENAMES, shift_ms = 0); } else { Draw_SDItem(itemnum, 0); // Draw the item (and init shift name) @@ -1902,19 +2088,17 @@ void HMI_SelectFile(void) { } else { Move_Highlight(-1, select_file.now + MROWS - index_file); // Just move highlight - Init_Shift_Name(); // ...and init the shift name + TERN_(SCROLL_LONG_FILENAMES, Init_Shift_Name()); // ...and init the shift name } - Init_SDItem_Shift(); // Reset left. Init timer. + TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); // Reset left. Init timer. } } else if (encoder_diffState == ENCODER_DIFF_ENTER) { - if (select_file.now == 0) { - /* back */ + if (select_file.now == 0) { // Back select_page.set(0); Goto_MainMenu(); } - else if (hasUpDir && select_file.now == 1) { - /* CDUP */ + else if (hasUpDir && select_file.now == 1) { // CD-Up SDCard_Up(); goto HMI_SelectFileExit; } @@ -1933,8 +2117,8 @@ void HMI_SelectFile(void) { select_file.reset(); // Start choice and print SD file - HMI_flag.heat_flag = 1; - HMI_flag.print_finish = 0; + HMI_flag.heat_flag = true; + HMI_flag.print_finish = false; HMI_ValueStruct.show_mode = 0; card.openAndPrintFile(card.filename); @@ -1954,21 +2138,21 @@ HMI_SelectFileExit: } /* Printing */ -void HMI_Printing(void) { +void HMI_Printing() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (HMI_flag.confirm_flag) { + if (HMI_flag.done_confirm_flag) { if (encoder_diffState == ENCODER_DIFF_ENTER) { - HMI_flag.confirm_flag = 0; - abort_flag = 1; + HMI_flag.done_confirm_flag = false; + dwin_abort_flag = true; } return; } // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_print.inc(2)) { + if (select_print.inc(3)) { switch (select_print.now) { case 0: ICON_Tune(); break; case 1: @@ -1999,15 +2183,14 @@ void HMI_Printing(void) { } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_print.now) { - case 0: // Setting + case 0: // Tune checkkey = Tune; HMI_ValueStruct.show_mode = 0; select_tune.reset(); - index_tune = 5; + index_tune = MROWS; Draw_Tune_Menu(); break; case 1: // Pause - /* pause */ if (HMI_flag.pause_flag) { ICON_Pause(); @@ -2015,23 +2198,26 @@ void HMI_Printing(void) { cmd[0] = '\0'; #if ENABLED(PAUSE_HEAT) - if (tempbed) sprintf_P(cmd, PSTR("M190 S%i\n"), tempbed); - if (temphot) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), temphot); + #if HAS_HEATED_BED + if (tempbed) sprintf_P(cmd, PSTR("M190 S%i\n"), tempbed); + #endif + #if HAS_HOTEND + if (temphot) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), temphot); + #endif #endif strcat_P(cmd, PSTR("M24")); queue.inject(cmd); } else { - HMI_flag.select_flag = 1; + HMI_flag.select_flag = true; checkkey = Print_window; Popup_window_PauseOrStop(); } break; case 2: // Stop - /* stop */ - HMI_flag.select_flag = 1; + HMI_flag.select_flag = true; checkkey = Print_window; Popup_window_PauseOrStop(); break; @@ -2043,7 +2229,7 @@ void HMI_Printing(void) { } /* Pause and Stop window */ -void HMI_PauseOrStop(void) { +void HMI_PauseOrStop() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; @@ -2056,7 +2242,7 @@ void HMI_PauseOrStop(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (select_print.now == 1) { // pause window if (HMI_flag.select_flag) { - pause_action_flag = 1; + HMI_flag.pause_action = true; ICON_Continue(); #if ENABLED(POWER_LOSS_RECOVERY) if (recovery.enabled) recovery.save(true); @@ -2084,10 +2270,10 @@ void HMI_PauseOrStop(void) { host_action_cancel(); #endif #ifdef EVENT_GCODE_SD_ABORT - Popup_Window_Home(); + Popup_Window_Home(true); queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); #endif - abort_flag = true; + dwin_abort_flag = true; #endif } else { @@ -2114,20 +2300,20 @@ inline void Draw_Move_Menu() { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOVE_AXIS)); #else - DWIN_Frame_TitleCopy(1, 231, 2, 265, 12); // "Move" + DWIN_Frame_TitleCopy(1, 231, 2, 265, 12); // "Move" #endif draw_move_en(MBASE(1)); say_x(36, MBASE(1)); // "Move X" draw_move_en(MBASE(2)); say_y(36, MBASE(2)); // "Move Y" draw_move_en(MBASE(3)); say_z(36, MBASE(3)); // "Move Z" #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 123, 192, 176, 202, LBLX, MBASE(4)); // "Extruder" + DWIN_Frame_AreaCopy(1, 123, 192, 176, 202, LBLX, MBASE(4)); // "Extruder" #endif } Draw_Back_First(select_axis.now == 0); if (select_axis.now) Draw_Menu_Cursor(select_axis.now); - // Draw separators so it looks like a menu + // Draw separators and icons LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MoveX + i); } @@ -2144,13 +2330,13 @@ void HMI_AudioFeedback(const bool success=true) { } /* Prepare */ -void HMI_Prepare(void) { +void HMI_Prepare() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_prepare.inc(8)) { + if (select_prepare.inc(1 + PREPARE_CASE_TOTAL)) { if (select_prepare.now > MROWS && select_prepare.now > index_prepare) { index_prepare = select_prepare.now; @@ -2161,9 +2347,13 @@ void HMI_Prepare(void) { // Draw "More" icon for sub-menus if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); - if (index_prepare == 6) Prepare_Item_ABS(MROWS); - else if (index_prepare == 7) Prepare_Item_Cool(MROWS); - else if (index_prepare == 8) Prepare_Item_Lang(MROWS); + #if HAS_HOTEND + if (index_prepare == PREPARE_CASE_ABS) Item_Prepare_ABS(MROWS); + #endif + #if HAS_PREHEAT + if (index_prepare == PREPARE_CASE_COOL) Item_Prepare_Cool(MROWS); + #endif + if (index_prepare == PREPARE_CASE_LANG) Item_Prepare_Lang(MROWS); } else { Move_Highlight(1, select_prepare.now + MROWS - index_prepare); @@ -2183,9 +2373,9 @@ void HMI_Prepare(void) { if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); - if (index_prepare == 6) Prepare_Item_Move(0); - else if (index_prepare == 7) Prepare_Item_Disable(0); - else if (index_prepare == 8) Prepare_Item_Home(0); + if (index_prepare == 6) Item_Prepare_Move(0); + else if (index_prepare == 7) Item_Prepare_Disable(0); + else if (index_prepare == 8) Item_Prepare_Home(0); } else { Move_Highlight(-1, select_prepare.now + MROWS - index_prepare); @@ -2198,67 +2388,66 @@ void HMI_Prepare(void) { select_page.set(1); Goto_MainMenu(); break; - case 1: // axis move + case PREPARE_CASE_MOVE: // Axis move checkkey = AxisMove; select_axis.reset(); Draw_Move_Menu(); - queue.inject_P(PSTR("G92 E0")); - current_position.e = HMI_ValueStruct.Move_E_scale = 0; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), current_position.x * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT); #if HAS_HOTEND - DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), current_position.e * MINUNITMULT); + queue.inject_P(PSTR("G92 E0")); + current_position.e = HMI_ValueStruct.Move_E_scale = 0; + DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), 0); #endif break; - case 2: // close motion + case PREPARE_CASE_DISA: // Disable steppers queue.inject_P(PSTR("M84")); break; - case 3: // homing + case PREPARE_CASE_HOME: // Homing checkkey = Last_Prepare; index_prepare = MROWS; queue.inject_P(PSTR("G28")); // G28 will set home_flag Popup_Window_Home(); break; - case 4: // Z-offset - #if HAS_BED_PROBE - checkkey = Homeoffset; - HMI_ValueStruct.show_mode = -4; - HMI_ValueStruct.offset_value = probe.offset.z * 100; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(4 + MROWS - index_prepare), HMI_ValueStruct.offset_value); - EncoderRate.encoderRateEnabled = 1; - #else - // Apply workspace offset, making the current position 0,0,0 - queue.inject_P(PSTR("G92 X0 Y0 Z0")); - HMI_AudioFeedback(); - #endif - break; - case 5: // PLA preheat - thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0); - thermalManager.setTargetBed(ui.material_preset[0].bed_temp); - thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed); - break; - case 6: // ABS preheat - thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0); - thermalManager.setTargetBed(ui.material_preset[1].bed_temp); - thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed); - break; - case 7: // cool - thermalManager.zero_fan_speeds(); - thermalManager.disable_all_heaters(); - break; - case 8: // language - /* select language */ - HMI_flag.language_chinese ^= true; - if (HMI_flag.language_chinese) { - HMI_SetAndSaveLanguageChinese(); - DWIN_JPG_CacheTo1(Language_Chinese); - } - else { - HMI_SetAndSaveLanguageWestern(); - DWIN_JPG_CacheTo1(Language_English); - } + #if HAS_ZOFFSET_ITEM + case PREPARE_CASE_ZOFF: // Z-offset + #if EITHER(HAS_BED_PROBE, BABYSTEPPING) + checkkey = Homeoffset; + HMI_ValueStruct.show_mode = -4; + HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(PREPARE_CASE_ZOFF + MROWS - index_prepare), HMI_ValueStruct.offset_value); + EncoderRate.enabled = true; + #else + // Apply workspace offset, making the current position 0,0,0 + queue.inject_P(PSTR("G92 X0 Y0 Z0")); + HMI_AudioFeedback(); + #endif + break; + #endif + #if HAS_HOTEND + case PREPARE_CASE_PLA: // PLA preheat + thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0); + thermalManager.setTargetBed(ui.material_preset[0].bed_temp); + thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed); + break; + case PREPARE_CASE_ABS: // ABS preheat + thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0); + thermalManager.setTargetBed(ui.material_preset[1].bed_temp); + thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed); + break; + #endif + #if HAS_PREHEAT + case PREPARE_CASE_COOL: // Cool + TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); + #if HAS_HOTEND || HAS_HEATED_BED + thermalManager.disable_all_heaters(); + #endif + break; + #endif + case PREPARE_CASE_LANG: // Toggle Language + HMI_ToggleLanguage(); Draw_Prepare_Menu(); break; default: break; @@ -2271,72 +2460,108 @@ void Draw_Temperature_Menu() { Clear_Main_Window(); if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 236, 2, 263, 13, 14, 8); - - DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 100, 89, 178, 101, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 180, 89, 260, 100, LBLX, MBASE(5)); + DWIN_Frame_TitleCopy(1, 236, 2, 263, 13); // "Temperature" + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(TEMP_CASE_TEMP)); + #endif + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(TEMP_CASE_BED)); + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(TEMP_CASE_FAN)); + #endif + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 100, 89, 178, 101, LBLX, MBASE(TEMP_CASE_PLA)); + DWIN_Frame_AreaCopy(1, 180, 89, 260, 100, LBLX, MBASE(TEMP_CASE_ABS)); + #endif } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("PLA Preheat Settings")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(5), F("ABS Preheat Settings")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + #endif + #if HAS_HEATED_BED + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + #endif + #if HAS_FAN + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_PLA), F("PLA Preheat Settings")); + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_ABS), F("ABS Preheat Settings")); + #endif #else - DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); - DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(1)); // Nozzle... - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(1)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(2)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(3)); // Fan speed - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(4)); // Preheat... - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(4)); // ...PLA - DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 79, MBASE(4)); // PLA setting - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(5)); // Preheat... - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(5)); // ...ABS - DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 81, MBASE(5)); // ABS setting + DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "Temperature" + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(TEMP_CASE_TEMP)); // Nozzle... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(TEMP_CASE_TEMP)); // ...Temperature + #endif + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(TEMP_CASE_BED)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(TEMP_CASE_BED)); // ...Temperature + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(TEMP_CASE_FAN)); // Fan speed + #endif + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(TEMP_CASE_PLA)); // Preheat... + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(TEMP_CASE_PLA)); // ...PLA + DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 79, MBASE(TEMP_CASE_PLA)); // PLA setting + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(TEMP_CASE_ABS)); // Preheat... + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(TEMP_CASE_ABS)); // ...ABS + DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 81, MBASE(TEMP_CASE_ABS)); // ABS setting + #endif #endif } Draw_Back_First(select_temp.now == 0); if (select_temp.now) Draw_Menu_Cursor(select_temp.now); - LOOP_L_N(i, 5) Draw_Menu_Line(i + 1, ICON_SetEndTemp + i); - - Draw_More_Icon(4); - Draw_More_Icon(5); - - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), thermalManager.temp_bed.target); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + // Draw icons and lines + uint8_t i = 0; + #define _TMENU_ICON(N) Draw_Menu_Line(++i, ICON_SetEndTemp + (N) - 1) + #if HAS_HOTEND + _TMENU_ICON(TEMP_CASE_TEMP); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), thermalManager.temp_hotend[0].target); + #endif + #if HAS_HEATED_BED + _TMENU_ICON(TEMP_CASE_BED); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), thermalManager.temp_bed.target); + #endif + #if HAS_FAN + _TMENU_ICON(TEMP_CASE_FAN); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), thermalManager.fan_speed[0]); + #endif + #if HAS_HOTEND + // PLA/ABS items have submenus + _TMENU_ICON(TEMP_CASE_PLA); + Draw_More_Icon(i); + _TMENU_ICON(TEMP_CASE_ABS); + Draw_More_Icon(i); + #endif } /* Control */ -void HMI_Control(void) { +void HMI_Control() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - #define CONTROL_ITEMS (5 + ENABLED(HAS_ONESTEP_LEVELING)) - if (select_control.inc(CONTROL_ITEMS)) { + if (select_control.inc(1 + CONTROL_CASE_TOTAL)) { if (select_control.now > MROWS && select_control.now > index_control) { index_control = select_control.now; Scroll_Menu(DWIN_SCROLL_UP); - Draw_Menu_Icon(MROWS, ICON_Temperature + select_control.now - 1); - Draw_More_Icon(1 + MROWS - index_control); // Temperature > - Draw_More_Icon(2 + MROWS - index_control); // Motion > + Draw_Menu_Icon(MROWS, ICON_Temperature + index_control - 1); + Draw_More_Icon(CONTROL_CASE_TEMP + MROWS - index_control); // Temperature > + Draw_More_Icon(CONTROL_CASE_MOVE + MROWS - index_control); // Motion > if (index_control > MROWS) { - Draw_More_Icon(6 + MROWS - index_control); // Info > + Draw_More_Icon(CONTROL_CASE_INFO + MROWS - index_control); // Info > if (HMI_flag.language_chinese) - DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, MBASE(CONTROL_CASE_INFO - 1)); else - DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, MBASE(CONTROL_CASE_INFO - 1)); } } else { @@ -2367,33 +2592,32 @@ void HMI_Control(void) { select_page.set(2); Goto_MainMenu(); break; - case 1: // temperature + case CONTROL_CASE_TEMP: // Temperature checkkey = TemperatureID; HMI_ValueStruct.show_mode = -1; select_temp.reset(); Draw_Temperature_Menu(); break; - case 2: // motion + case CONTROL_CASE_MOVE: // Motion checkkey = Motion; select_motion.reset(); Draw_Motion_Menu(); break; - case 3: #if ENABLED(EEPROM_SETTINGS) - { // write EEPROM + case CONTROL_CASE_SAVE: { // Write EEPROM const bool success = settings.save(); HMI_AudioFeedback(success); } break; - case 4: { // read EEPROM + case CONTROL_CASE_LOAD: { // Read EEPROM const bool success = settings.load(); HMI_AudioFeedback(success); } break; - case 5: // resume EEPROM + case CONTROL_CASE_RESET: // Reset EEPROM settings.reset(); HMI_AudioFeedback(); break; - case 6: // info #endif + case CONTROL_CASE_INFO: // Info checkkey = Info; Draw_Info_Menu(); break; @@ -2407,7 +2631,7 @@ void HMI_Control(void) { #if HAS_ONESTEP_LEVELING /* Leveling */ - void HMI_Leveling(void) { + void HMI_Leveling() { Popup_Window_Leveling(); DWIN_UpdateLCD(); queue.inject_P(PSTR("G28O\nG29")); @@ -2416,21 +2640,21 @@ void HMI_Control(void) { #endif /* Axis Move */ -void HMI_AxisMove(void) { +void HMI_AxisMove() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; - #if HAS_HOTEND + #if ENABLED(PREVENT_COLD_EXTRUSION) // popup window resume if (HMI_flag.ETempTooLow_flag) { if (encoder_diffState == ENCODER_DIFF_ENTER) { - HMI_flag.ETempTooLow_flag = 0; - Draw_Move_Menu(); + HMI_flag.ETempTooLow_flag = false; current_position.e = HMI_ValueStruct.Move_E_scale = 0; + Draw_Move_Menu(); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), 0); DWIN_UpdateLCD(); } return; @@ -2439,7 +2663,7 @@ void HMI_AxisMove(void) { // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_axis.inc(4)) Move_Highlight(1, select_axis.now); + if (select_axis.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_axis.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_axis.dec()) Move_Highlight(-1, select_axis.now); @@ -2456,26 +2680,26 @@ void HMI_AxisMove(void) { checkkey = Move_X; HMI_ValueStruct.Move_X_scale = current_position.x * MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - EncoderRate.encoderRateEnabled = 1; + EncoderRate.enabled = true; break; case 2: // Y axis move checkkey = Move_Y; HMI_ValueStruct.Move_Y_scale = current_position.y * MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - EncoderRate.encoderRateEnabled = 1; + EncoderRate.enabled = true; break; case 3: // Z axis move checkkey = Move_Z; HMI_ValueStruct.Move_Z_scale = current_position.z * MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - EncoderRate.encoderRateEnabled = 1; + EncoderRate.enabled = true; break; #if HAS_HOTEND case 4: // Extruder // window tips #ifdef PREVENT_COLD_EXTRUSION if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) { - HMI_flag.ETempTooLow_flag = 1; + HMI_flag.ETempTooLow_flag = true; Popup_Window_ETempTooLow(); DWIN_UpdateLCD(); return; @@ -2484,7 +2708,7 @@ void HMI_AxisMove(void) { checkkey = Extruder; HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - EncoderRate.encoderRateEnabled = 1; + EncoderRate.enabled = true; break; #endif } @@ -2493,13 +2717,13 @@ void HMI_AxisMove(void) { } /* TemperatureID */ -void HMI_Temperature(void) { +void HMI_Temperature() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_temp.inc(5)) Move_Highlight(1, select_temp.now); + if (select_temp.inc(1 + TEMP_CASE_TOTAL)) Move_Highlight(1, select_temp.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_temp.dec()) Move_Highlight(-1, select_temp.now); @@ -2512,141 +2736,184 @@ void HMI_Temperature(void) { index_control = MROWS; Draw_Control_Menu(); break; - #if HAS_HOTEND - case 1: // nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_HEATED_BED - case 2: // bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_FAN - case 3: // fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_HOTEND - case 4: // PLA preheat setting - checkkey = PLAPreheat; - select_PLA.reset(); - HMI_ValueStruct.show_mode = -2; + #if HAS_HOTEND + case TEMP_CASE_TEMP: // Nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HEATED_BED + case TEMP_CASE_BED: // Bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); + EncoderRate.enabled = true; + break; + #endif + #if HAS_FAN + case TEMP_CASE_FAN: // Fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HOTEND + case TEMP_CASE_PLA: { // PLA preheat setting + checkkey = PLAPreheat; + select_PLA.reset(); + HMI_ValueStruct.show_mode = -2; - Clear_Main_Window(); + Clear_Main_Window(); - if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 59, 16, 139, 29, 14, 8); - - DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(2)); // PLA bed temp - DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(4)); // save PLA configuration - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("PLA Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Nozzle Temp")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Bed Temp")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_STORE_EEPROM)); - #else - DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(2) + 3); // PLA bed temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(4)); // save PLA configuration - #endif - } - - Draw_Back_First(); - - Draw_Menu_Line(1, ICON_SetEndTemp); - Draw_Menu_Line(2, ICON_SetBedTemp); - Draw_Menu_Line(3, ICON_FanSpeed); - #if ENABLED(EEPROM_SETTINGS) - Draw_Menu_Line(4, ICON_WriteEEPROM); + if (HMI_flag.language_chinese) { + DWIN_Frame_TitleCopy(1, 59, 16, 139, 29); // "PLA Settings" + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_BED)); + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(PREHEAT_CASE_BED)); // PLA bed temp #endif - - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); - - break; - - case 5: // ABS preheat setting - checkkey = ABSPreheat; - select_ABS.reset(); - HMI_ValueStruct.show_mode = -3; - - Clear_Main_Window(); - - if (HMI_flag.language_chinese) { - DWIN_Frame_AreaCopy(1, 142, 16, 223, 29, 14, 8); - - DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(2)); // ABS bed temp - DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX + 28, MBASE(4) + 2); // save ABS configuration - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("ABS Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Nozzle Temp")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Bed Temp")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), GET_TEXT_F(MSG_FAN_SPEED)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), GET_TEXT_F(MSG_STORE_EEPROM)); - #else - DWIN_Frame_AreaCopy(1, 56, 16, 141, 28, 14, 8); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(2) + 3); // ABS bed temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 33, MBASE(4)); // save ABS configuration - #endif - } - - Draw_Back_First(); - - Draw_Menu_Line(1, ICON_SetEndTemp); - Draw_Menu_Line(2, ICON_SetBedTemp); - Draw_Menu_Line(3, ICON_FanSpeed); - #if ENABLED(EEPROM_SETTINGS) - Draw_Menu_Line(4, ICON_WriteEEPROM); + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_FAN)); + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(PREHEAT_CASE_FAN)); // PLA fan speed #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("PLA Settings"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); + #if HAS_HEATED_BED + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); + #endif + #if HAS_FAN + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + #endif + #else + DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_BED) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(PREHEAT_CASE_BED) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(PREHEAT_CASE_BED) + 3); // PLA bed temp + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_FAN)); + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(PREHEAT_CASE_FAN)); // PLA fan speed + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration + #endif + #endif + } - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); + Draw_Back_First(); - break; - #endif // HAS_HOTEND + uint8_t i = 0; + Draw_Menu_Line(++i, ICON_SetEndTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[0].hotend_temp); + #if HAS_HEATED_BED + Draw_Menu_Line(++i, ICON_SetBedTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[0].bed_temp); + #endif + #if HAS_FAN + Draw_Menu_Line(++i, ICON_FanSpeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[0].fan_speed); + #endif + #if ENABLED(EEPROM_SETTINGS) + Draw_Menu_Line(++i, ICON_WriteEEPROM); + #endif + } break; + + case TEMP_CASE_ABS: { // ABS preheat setting + checkkey = ABSPreheat; + select_ABS.reset(); + HMI_ValueStruct.show_mode = -3; + + Clear_Main_Window(); + + if (HMI_flag.language_chinese) { + DWIN_Frame_TitleCopy(1, 142, 16, 223, 29); // "ABS Settings" + + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(PREHEAT_CASE_TEMP)); // ABS nozzle temp + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_BED)); + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(PREHEAT_CASE_BED)); // ABS bed temp + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_FAN)); + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(PREHEAT_CASE_FAN)); // ABS fan speed + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(PREHEAT_CASE_SAVE)); + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX + 28, MBASE(PREHEAT_CASE_SAVE) + 2); // Save ABS configuration + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("ABS Settings"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); + #if HAS_HEATED_BED + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); + #endif + #if HAS_FAN + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + #endif + #else + DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "ABS Settings" + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // ABS nozzle temp + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_BED) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(PREHEAT_CASE_BED) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(PREHEAT_CASE_BED) + 3); // ABS bed temp + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_FAN)); + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(PREHEAT_CASE_FAN)); // ABS fan speed + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 33, MBASE(PREHEAT_CASE_SAVE)); // Save ABS configuration + #endif + #endif + } + + Draw_Back_First(); + + uint8_t i = 0; + Draw_Menu_Line(++i, ICON_SetEndTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[1].hotend_temp); + #if HAS_HEATED_BED + Draw_Menu_Line(++i, ICON_SetBedTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[1].bed_temp); + #endif + #if HAS_FAN + Draw_Menu_Line(++i, ICON_FanSpeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[1].fan_speed); + #endif + #if ENABLED(EEPROM_SETTINGS) + Draw_Menu_Line(++i, ICON_WriteEEPROM); + #endif + + } break; + + #endif // HAS_HOTEND } } DWIN_UpdateLCD(); @@ -2659,18 +2926,18 @@ inline void Draw_Max_Speed_Menu() { DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Max Speed (mm/s)" auto say_max_speed = [](const uint16_t row) { - DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, row); // "Max speed" + DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, row); // "Max speed" }; - say_max_speed(MBASE(1)); // "Max speed" - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(1)); // X - say_max_speed(MBASE(2)); // "Max speed" - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(2) + 3); // Y - say_max_speed(MBASE(3)); // "Max speed" - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(3) + 3); // Z + say_max_speed(MBASE(1)); // "Max speed" + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(1)); // X + say_max_speed(MBASE(2)); // "Max speed" + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(2) + 3); // Y + say_max_speed(MBASE(3)); // "Max speed" + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(3) + 3); // Z #if HAS_HOTEND - say_max_speed(MBASE(4)); // "Max speed" - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 58, MBASE(4) + 3); // E + say_max_speed(MBASE(4)); // "Max speed" + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 58, MBASE(4) + 3); // E #endif } else { @@ -2745,7 +3012,7 @@ inline void Draw_Max_Accel_Menu() { DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Max Accel E")); #endif #else - DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Acceleration" + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Acceleration" draw_max_accel_en(MBASE(1)); say_x(108, MBASE(1)); // "Max Acceleration X" draw_max_accel_en(MBASE(2)); say_y(108, MBASE(2)); // "Max Acceleration Y" draw_max_accel_en(MBASE(3)); say_z(108, MBASE(3)); // "Max Acceleration Z" @@ -2883,13 +3150,13 @@ inline void Draw_Steps_Menu() { } /* Motion */ -void HMI_Motion(void) { +void HMI_Motion() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_motion.inc(4)) Move_Highlight(1, select_motion.now); + if (select_motion.inc(1 + MOTION_CASE_TOTAL)) Move_Highlight(1, select_motion.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_motion.dec()) Move_Highlight(-1, select_motion.now); @@ -2898,26 +3165,28 @@ void HMI_Motion(void) { switch (select_motion.now) { case 0: // Back checkkey = Control; - select_control.set(2); + select_control.set(CONTROL_CASE_MOVE); index_control = MROWS; Draw_Control_Menu(); break; - case 1: // max speed + case MOTION_CASE_RATE: // Max speed checkkey = MaxSpeed; select_speed.reset(); Draw_Max_Speed_Menu(); break; - case 2: // max acceleration + case MOTION_CASE_ACCEL: // Max acceleration checkkey = MaxAcceleration; select_acc.reset(); Draw_Max_Accel_Menu(); break; - case 3: // max jerk speed - checkkey = MaxJerk; - select_jerk.reset(); - Draw_Max_Jerk_Menu(); - break; - case 4: // transmission ratio + #if HAS_CLASSIC_JERK + case MOTION_CASE_JERK: // Max jerk + checkkey = MaxJerk; + select_jerk.reset(); + Draw_Max_Jerk_Menu(); + break; + #endif + case MOTION_CASE_STEPS: // Steps per mm checkkey = Step; select_step.reset(); Draw_Steps_Menu(); @@ -2929,13 +3198,13 @@ void HMI_Motion(void) { } /* Info */ -void HMI_Info(void) { +void HMI_Info() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_ENTER) { #if HAS_ONESTEP_LEVELING checkkey = Control; - select_control.set(CONTROL_ITEMS); + select_control.set(CONTROL_CASE_INFO); Draw_Control_Menu(); #else select_page.set(3); @@ -2946,17 +3215,16 @@ void HMI_Info(void) { } /* Tune */ -void HMI_Tune(void) { +void HMI_Tune() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_tune.inc(6)) { + if (select_tune.inc(1 + TUNE_CASE_TOTAL)) { if (select_tune.now > MROWS && select_tune.now > index_tune) { index_tune = select_tune.now; Scroll_Menu(DWIN_SCROLL_UP); - Prepare_Item_Lang(5); } else { Move_Highlight(1, select_tune.now + MROWS - index_tune); @@ -2982,186 +3250,180 @@ void HMI_Tune(void) { Goto_PrintProcess(); } break; - case 1: // Print speed + case TUNE_CASE_SPEED: // Print speed checkkey = PrintSpeed; HMI_ValueStruct.print_speed = feedrate_percentage; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1 + MROWS - index_tune), feedrate_percentage); - EncoderRate.encoderRateEnabled = 1; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), feedrate_percentage); + EncoderRate.enabled = true; break; - #if HAS_HOTEND - case 2: // Nozzle temp - checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2 + MROWS - index_tune), thermalManager.temp_hotend[0].target); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_HEATED_BED - case 3: // Bed temp - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3 + MROWS - index_tune), thermalManager.temp_bed.target); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_FAN - case 4: // Fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(4 + MROWS - index_tune), thermalManager.fan_speed[0]); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - case 5: // Z-offset - checkkey = Homeoffset; - HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(5 + MROWS - index_tune), HMI_ValueStruct.offset_value); - EncoderRate.encoderRateEnabled = 1; + #if HAS_HOTEND + case TUNE_CASE_TEMP: // Nozzle temp + checkkey = ETemp; + HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HEATED_BED + case TUNE_CASE_BED: // Bed temp + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + EncoderRate.enabled = true; + break; + #endif + #if HAS_FAN + case TUNE_CASE_FAN: // Fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); + EncoderRate.enabled = true; + break; + #endif + #if HAS_ZOFFSET_ITEM + case TUNE_CASE_ZOFF: // Z-offset + #if EITHER(HAS_BED_PROBE, BABYSTEPPING) + checkkey = Homeoffset; + HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(TUNE_CASE_ZOFF + MROWS - index_tune), HMI_ValueStruct.offset_value); + EncoderRate.enabled = true; + #else + // Apply workspace offset, making the current position 0,0,0 + queue.inject_P(PSTR("G92 X0 Y0 Z0")); + HMI_AudioFeedback(); + #endif break; - case 6: // Language - // Select language - HMI_flag.language_chinese ^= true; - - Clear_Main_Window(); - - if (HMI_flag.language_chinese) { - HMI_SetAndSaveLanguageChinese(); - DWIN_JPG_CacheTo1(Language_Chinese); - } - else { - HMI_SetAndSaveLanguageWestern(); - DWIN_JPG_CacheTo1(Language_English); - } - - Draw_Tune_Menu(); - break; - + #endif default: break; } } DWIN_UpdateLCD(); } -/* PLA Preheat */ -void HMI_PLAPreheatSetting(void) { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; +#if HAS_PREHEAT - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_PLA.inc(4)) Move_Highlight(1, select_PLA.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_PLA.dec()) Move_Highlight(-1, select_PLA.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_PLA.now) { - case 0: // Back - checkkey = TemperatureID; - select_temp.now = 4; - HMI_ValueStruct.show_mode = -1; - Draw_Temperature_Menu(); - break; + /* PLA Preheat */ + void HMI_PLAPreheatSetting() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_PLA.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_PLA.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_PLA.dec()) Move_Highlight(-1, select_PLA.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_PLA.now) { + case 0: // Back + checkkey = TemperatureID; + select_temp.now = TEMP_CASE_PLA; + HMI_ValueStruct.show_mode = -1; + Draw_Temperature_Menu(); + break; #if HAS_HOTEND - case 1: // set nozzle temperature + case PREHEAT_CASE_TEMP: // Nozzle temperature checkkey = ETemp; HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); - EncoderRate.encoderRateEnabled = 1; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[0].hotend_temp); + EncoderRate.enabled = true; break; #endif #if HAS_HEATED_BED - case 2: // set bed temperature + case PREHEAT_CASE_BED: // Bed temperature checkkey = BedTemp; HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); - EncoderRate.encoderRateEnabled = 1; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[0].bed_temp); + EncoderRate.enabled = true; break; #endif #if HAS_FAN - case 3: // set fan speed + case PREHEAT_CASE_FAN: // Fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); - EncoderRate.encoderRateEnabled = 1; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[0].fan_speed); + EncoderRate.enabled = true; break; #endif - #if ENABLED(EEPROM_SETTINGS) - case 4: { // Save PLA configuration - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; - #endif - default: break; + #if ENABLED(EEPROM_SETTINGS) + case 4: { // Save PLA configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + #endif + default: break; + } } + DWIN_UpdateLCD(); } - DWIN_UpdateLCD(); -} -/* ABS Preheat */ -void HMI_ABSPreheatSetting(void) { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; + /* ABS Preheat */ + void HMI_ABSPreheatSetting() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_ABS.inc(4)) Move_Highlight(1, select_ABS.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_ABS.dec()) Move_Highlight(-1, select_ABS.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_ABS.now) { - case 0: // Back - checkkey = TemperatureID; - select_temp.now = 5; - HMI_ValueStruct.show_mode = -1; - Draw_Temperature_Menu(); - break; + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_ABS.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_ABS.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_ABS.dec()) Move_Highlight(-1, select_ABS.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_ABS.now) { + case 0: // Back + checkkey = TemperatureID; + select_temp.now = TEMP_CASE_ABS; + HMI_ValueStruct.show_mode = -1; + Draw_Temperature_Menu(); + break; #if HAS_HOTEND - case 1: // set nozzle temperature + case PREHEAT_CASE_TEMP: // Set nozzle temperature checkkey = ETemp; HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); - EncoderRate.encoderRateEnabled = 1; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[1].hotend_temp); + EncoderRate.enabled = true; break; #endif #if HAS_HEATED_BED - case 2: // set bed temperature + case PREHEAT_CASE_BED: // Set bed temperature checkkey = BedTemp; HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); - EncoderRate.encoderRateEnabled = 1; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[1].bed_temp); + EncoderRate.enabled = true; break; #endif #if HAS_FAN - case 3: // set fan speed + case PREHEAT_CASE_FAN: // Set fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); - EncoderRate.encoderRateEnabled = 1; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[1].fan_speed); + EncoderRate.enabled = true; break; #endif - #if ENABLED(EEPROM_SETTINGS) - case 4: { // save ABS configuration - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; - #endif - default: break; + #if ENABLED(EEPROM_SETTINGS) + case PREHEAT_CASE_SAVE: { // Save ABS configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + #endif + default: break; + } } + DWIN_UpdateLCD(); } - DWIN_UpdateLCD(); -} + +#endif /* Max Speed */ -void HMI_MaxSpeed(void) { +void HMI_MaxSpeed() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_speed.inc(4)) Move_Highlight(1, select_speed.now); + if (select_speed.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_speed.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_speed.dec()) Move_Highlight(-1, select_speed.now); @@ -3169,14 +3431,14 @@ void HMI_MaxSpeed(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (WITHIN(select_speed.now, 1, 4)) { checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = AxisEnum(select_speed.now - 1); - HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[HMI_flag.feedspeed_flag]; + HMI_flag.feedspeed_axis = AxisEnum(select_speed.now - 1); + HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[HMI_flag.feedspeed_axis]; DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); - EncoderRate.encoderRateEnabled = 1; + EncoderRate.enabled = true; } else { // Back checkkey = Motion; - select_motion.now = 1; + select_motion.now = MOTION_CASE_RATE; Draw_Motion_Menu(); } } @@ -3184,13 +3446,13 @@ void HMI_MaxSpeed(void) { } /* Max Acceleration */ -void HMI_MaxAcceleration(void) { +void HMI_MaxAcceleration() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_acc.inc(4)) Move_Highlight(1, select_acc.now); + if (select_acc.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_acc.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_acc.dec()) Move_Highlight(-1, select_acc.now); @@ -3198,57 +3460,59 @@ void HMI_MaxAcceleration(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (WITHIN(select_acc.now, 1, 4)) { checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = AxisEnum(select_acc.now - 1); - HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[HMI_flag.acc_flag]; + HMI_flag.acc_axis = AxisEnum(select_acc.now - 1); + HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[HMI_flag.acc_axis]; DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); - EncoderRate.encoderRateEnabled = 1; + EncoderRate.enabled = true; } else { // Back checkkey = Motion; - select_motion.now = 2; + select_motion.now = MOTION_CASE_ACCEL; Draw_Motion_Menu(); } } DWIN_UpdateLCD(); } -/* Max Jerk */ -void HMI_MaxJerk(void) { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; +#if HAS_CLASSIC_JERK + /* Max Jerk */ + void HMI_MaxJerk() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_jerk.inc(4)) Move_Highlight(1, select_jerk.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_jerk.dec()) Move_Highlight(-1, select_jerk.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - if (WITHIN(select_jerk.now, 1, 4)) { - checkkey = MaxJerk_value; - HMI_flag.jerk_flag = AxisEnum(select_jerk.now - 1); - HMI_ValueStruct.Max_Jerk = planner.max_jerk[HMI_flag.jerk_flag] * MINUNITMULT; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - EncoderRate.encoderRateEnabled = 1; + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_jerk.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_jerk.now); } - else { // Back - checkkey = Motion; - select_motion.now = 3; - Draw_Motion_Menu(); + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_jerk.dec()) Move_Highlight(-1, select_jerk.now); } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (WITHIN(select_jerk.now, 1, 4)) { + checkkey = MaxJerk_value; + HMI_flag.jerk_axis = AxisEnum(select_jerk.now - 1); + HMI_ValueStruct.Max_Jerk = planner.max_jerk[HMI_flag.jerk_axis] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + EncoderRate.enabled = true; + } + else { // Back + checkkey = Motion; + select_motion.now = MOTION_CASE_JERK; + Draw_Motion_Menu(); + } + } + DWIN_UpdateLCD(); } - DWIN_UpdateLCD(); -} +#endif // HAS_CLASSIC_JERK /* Step */ -void HMI_Step(void) { +void HMI_Step() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_step.inc(4)) Move_Highlight(1, select_step.now); + if (select_step.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_step.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_step.dec()) Move_Highlight(-1, select_step.now); @@ -3256,21 +3520,21 @@ void HMI_Step(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (WITHIN(select_step.now, 1, 4)) { checkkey = Step_value; - HMI_flag.step_flag = AxisEnum(select_step.now - 1); - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[HMI_flag.step_flag] * MINUNITMULT; + HMI_flag.step_axis = AxisEnum(select_step.now - 1); + HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[HMI_flag.step_axis] * MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); - EncoderRate.encoderRateEnabled = 1; + EncoderRate.enabled = true; } else { // Back checkkey = Motion; - select_motion.now = 4; + select_motion.now = MOTION_CASE_STEPS; Draw_Motion_Menu(); } } DWIN_UpdateLCD(); } -void HMI_Init(void) { +void HMI_Init() { HMI_SDCardInit(); for (uint16_t t = 0; t <= 100; t += 2) { @@ -3283,13 +3547,13 @@ void HMI_Init(void) { HMI_SetLanguage(); } -void DWIN_Update(void) { +void DWIN_Update() { EachMomentUpdate(); // Status update HMI_SDCardUpdate(); // SD card update DWIN_HandleScreen(); // Rotary encoder update } -void EachMomentUpdate(void) { +void EachMomentUpdate() { static millis_t next_rts_update_ms = 0; const millis_t ms = millis(); if (PENDING(ms, next_rts_update_ms)) return; @@ -3300,9 +3564,9 @@ void EachMomentUpdate(void) { if (checkkey == PrintProcess) { // if print done - if (HMI_flag.print_finish && !HMI_flag.confirm_flag) { - HMI_flag.print_finish = 0; - HMI_flag.confirm_flag = 1; + if (HMI_flag.print_finish && !HMI_flag.done_confirm_flag) { + HMI_flag.print_finish = false; + HMI_flag.done_confirm_flag = true; TERN_(POWER_LOSS_RECOVERY, recovery.cancel()); @@ -3313,7 +3577,7 @@ void EachMomentUpdate(void) { Draw_Print_ProgressBar(); // show print done confirm - DWIN_Draw_Rectangle(1, Background_black, 0, 250, 271, 360); + DWIN_Draw_Rectangle(1, Background_black, 0, 250, DWIN_WIDTH - 1, STATUS_Y); DWIN_ICON_Show(ICON, HMI_flag.language_chinese ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); } else if (HMI_flag.pause_flag != printingIsPaused()) { @@ -3324,11 +3588,15 @@ void EachMomentUpdate(void) { } // pause after homing - if (pause_action_flag && printingIsPaused() && !planner.has_blocks_queued()) { - pause_action_flag = 0; + if (HMI_flag.pause_action && printingIsPaused() && !planner.has_blocks_queued()) { + HMI_flag.pause_action = false; #if ENABLED(PAUSE_HEAT) - tempbed = thermalManager.temp_bed.target; - temphot = thermalManager.temp_hotend[0].target; + #if HAS_HEATED_BED + tempbed = thermalManager.temp_bed.target; + #endif + #if HAS_HOTEND + temphot = thermalManager.temp_hotend[0].target; + #endif thermalManager.disable_all_heaters(); #endif queue.inject_P(PSTR("G1 F1200 X0 Y0")); @@ -3348,6 +3616,7 @@ void EachMomentUpdate(void) { duration_t elapsed = print_job_timer.duration(); // print timer // Print time so far + static uint16_t last_Printtime = 0; const uint16_t min = (elapsed.value % 3600) / 60; if (last_Printtime != min) { // 1 minute update last_Printtime = min; @@ -3356,14 +3625,14 @@ void EachMomentUpdate(void) { // Estimate remaining time every 20 seconds static millis_t next_remain_time_update = 0; - if (Percentrecord > 1 && ELAPSED(ms, next_remain_time_update) && HMI_flag.heat_flag == 0) { + if (Percentrecord > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag) { remain_time = (elapsed.value - dwin_heat_time) / (Percentrecord * 0.01f) - (elapsed.value - dwin_heat_time); next_remain_time_update += 20 * 1000UL; Draw_Print_ProgressRemain(); } } - else if (abort_flag && !HMI_flag.home_flag) { // Print Stop - abort_flag = 0; + else if (dwin_abort_flag && !HMI_flag.home_flag) { // Print Stop + dwin_abort_flag = false; HMI_ValueStruct.print_speed = feedrate_percentage = 100; dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); @@ -3378,6 +3647,7 @@ void EachMomentUpdate(void) { } #if ENABLED(POWER_LOSS_RECOVERY) else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off + static bool recovery_flag = false; recovery.dwin_flag = false; recovery.load(); @@ -3403,8 +3673,8 @@ void EachMomentUpdate(void) { // with the active filename which can come from CardReader. card.getfilename_sorted(SD_ORDER(i, fileCnt)); if (!strcmp(card.filename, &recovery.info.sd_filename[1])) { // Resume print before power failure while have the same file - recovery_flag = 1; - HMI_flag.select_flag = 1; + recovery_flag = true; + HMI_flag.select_flag = true; Popup_Window_Resume(); draw_first_option(false); char * const name = card.longest_filename(); @@ -3422,7 +3692,7 @@ void EachMomentUpdate(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_ENTER) { - recovery_flag = 0; + recovery_flag = false; if (HMI_flag.select_flag) break; TERN_(POWER_LOSS_RECOVERY, recovery.cancel()); HMI_StartFrame(true); @@ -3445,7 +3715,7 @@ void EachMomentUpdate(void) { DWIN_UpdateLCD(); } -void DWIN_HandleScreen(void) { +void DWIN_HandleScreen() { switch (checkkey) { case MainMenu: HMI_MainMenu(); break; case SelectFile: HMI_SelectFile(); break; @@ -3459,8 +3729,10 @@ void DWIN_HandleScreen(void) { case Motion: HMI_Motion(); break; case Info: HMI_Info(); break; case Tune: HMI_Tune(); break; - case PLAPreheat: HMI_PLAPreheatSetting(); break; - case ABSPreheat: HMI_ABSPreheatSetting(); break; + #if HAS_PREHEAT + case PLAPreheat: HMI_PLAPreheatSetting(); break; + case ABSPreheat: HMI_ABSPreheatSetting(); break; + #endif case MaxSpeed: HMI_MaxSpeed(); break; case MaxAcceleration: HMI_MaxAcceleration(); break; case MaxJerk: HMI_MaxJerk(); break; @@ -3472,11 +3744,13 @@ void DWIN_HandleScreen(void) { case Extruder: HMI_Move_E(); break; case ETemp: HMI_ETemp(); break; #endif - case Homeoffset: HMI_Zoffset(); break; + #if EITHER(HAS_BED_PROBE, BABYSTEPPING) + case Homeoffset: HMI_Zoffset(); break; + #endif #if HAS_HEATED_BED case BedTemp: HMI_BedTemp(); break; #endif - #if HAS_FAN + #if HAS_PREHEAT case FanSpeed: HMI_FanSpeed(); break; #endif case PrintSpeed: HMI_PrintSpeed(); break; @@ -3488,11 +3762,11 @@ void DWIN_HandleScreen(void) { } } -void DWIN_CompletedHoming(void) { +void DWIN_CompletedHoming() { HMI_flag.home_flag = false; if (checkkey == Last_Prepare) { checkkey = Prepare; - select_prepare.now = 3; + select_prepare.now = PREPARE_CASE_HOME; index_prepare = MROWS; Draw_Prepare_Menu(); } @@ -3504,7 +3778,7 @@ void DWIN_CompletedHoming(void) { } } -void DWIN_CompletedLeveling(void) { +void DWIN_CompletedLeveling() { if (checkkey == Leveling) Goto_MainMenu(); } diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index abdf343a9d..fedb87afdd 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -29,9 +29,16 @@ #include "rotary_encoder.h" #include "../../../libs/BL24CXX.h" -#include +#include "../../../inc/MarlinConfigPre.h" -enum processID { +#if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) && PREHEAT_COUNT + #define HAS_PREHEAT 1 + #if PREHEAT_COUNT < 2 + #error "Creality DWIN requires two material preheat presets." + #endif +#endif + +enum processID : uint8_t { // Process ID MainMenu, SelectFile, @@ -44,7 +51,7 @@ enum processID { Motion, Info, Tune, - #if HAS_HOTEND + #if HAS_PREHEAT PLAPreheat, ABSPreheat, #endif @@ -218,7 +225,7 @@ enum processID { #define BarFill_Color 0x10E4 // fill color of progress bar #define Select_Color 0x33BB // selected color -extern int checkkey, last_checkkey; +extern uint8_t checkkey; extern float zprobe_zoffset; extern char print_filename[16]; @@ -227,7 +234,7 @@ extern millis_t dwin_heat_time; typedef struct { TERN_(HAS_HOTEND, int16_t E_Temp = 0); TERN_(HAS_HEATED_BED, int16_t Bed_Temp = 0); - TERN_(HAS_FAN, int16_t Fan_speed = 0); + TERN_(HAS_PREHEAT, int16_t Fan_speed = 0); int16_t print_speed = 100; float Max_Feedspeed = 0; float Max_Acceleration = 0; @@ -236,7 +243,7 @@ typedef struct { float Move_X_scale = 0; float Move_Y_scale = 0; float Move_Z_scale = 0; - #if EXTRUDERS + #if HAS_HOTEND float Move_E_scale = 0; #endif float offset_value = 0; @@ -246,33 +253,27 @@ typedef struct { typedef struct { bool language_chinese; // 0: EN, 1: CN bool pause_flag:1; + bool pause_action:1; bool print_finish:1; - bool confirm_flag:1; + bool done_confirm_flag:1; bool select_flag:1; bool home_flag:1; bool heat_flag:1; // 0: heating done 1: during heating - #if HAS_HOTEND + #if ENABLED(PREVENT_COLD_EXTRUSION) bool ETempTooLow_flag:1; #endif #if HAS_LEVELING bool leveling_offset_flag:1; #endif #if HAS_FAN - AxisEnum feedspeed_flag; + AxisEnum feedspeed_axis; #endif - AxisEnum acc_flag; - AxisEnum jerk_flag; - AxisEnum step_flag; + AxisEnum acc_axis, jerk_axis, step_axis; } HMI_Flag; extern HMI_value_t HMI_ValueStruct; extern HMI_Flag HMI_flag; -// Language -void HMI_SetLanguage(void); -void HMI_SetAndSaveLanguageWestern(void); -void HMI_SetAndSaveLanguageChinese(void); - // Show ICO void ICON_Print(bool show); void ICON_Prepare(bool show); @@ -285,44 +286,47 @@ void ICON_Pause(bool show); void ICON_Continue(bool show); void ICON_Stop(bool show); -// Popup window tips -#if HAS_HOTEND - void Popup_Window_Temperature(const bool toohigh); - void Popup_Window_ETempTooLow(void); +#if HAS_HOTEND || HAS_HEATED_BED + // Popup message window + void DWIN_Popup_Temperature(const bool toohigh); #endif -void Popup_Window_Resume(void); -void Popup_Window_Home(void); -void Popup_Window_Leveling(void); +#if HAS_HOTEND + void Popup_Window_ETempTooLow(); +#endif -void Goto_PrintProcess(void); -void Goto_MainMenu(void); +void Popup_Window_Resume(); +void Popup_Window_Home(const bool parking=false); +void Popup_Window_Leveling(); + +void Goto_PrintProcess(); +void Goto_MainMenu(); // Variable control -void HMI_Move_X(void); -void HMI_Move_Y(void); -void HMI_Move_Z(void); -void HMI_Move_E(void); +void HMI_Move_X(); +void HMI_Move_Y(); +void HMI_Move_Z(); +void HMI_Move_E(); -void HMI_Zoffset(void); +void HMI_Zoffset(); -TERN_(HAS_HOTEND, void HMI_ETemp(void)); -TERN_(HAS_HEATED_BED, void HMI_BedTemp(void)); -TERN_(HAS_FAN, void HMI_FanSpeed(void)); +TERN_(HAS_HOTEND, void HMI_ETemp()); +TERN_(HAS_HEATED_BED, void HMI_BedTemp()); +TERN_(HAS_FAN, void HMI_FanSpeed()); -void HMI_PrintSpeed(void); +void HMI_PrintSpeed(); -void HMI_MaxFeedspeedXYZE(void); -void HMI_MaxAccelerationXYZE(void); -void HMI_MaxJerkXYZE(void); -void HMI_StepXYZE(void); +void HMI_MaxFeedspeedXYZE(); +void HMI_MaxAccelerationXYZE(); +void HMI_MaxJerkXYZE(); +void HMI_StepXYZE(); -void update_variable(void); +void update_variable(); void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); // SD Card -void HMI_SDCardInit(void); -void HMI_SDCardUpdate(void); +void HMI_SDCardInit(); +void HMI_SDCardUpdate(); // Main Process void Icon_print(bool value); @@ -333,32 +337,32 @@ void Icon_leveling(bool value); // Other bool Pause_HeatStatus(); void HMI_StartFrame(const bool with_update); // Startup screen -void HMI_MainMenu(void); // Main process screen -void HMI_SelectFile(void); // File page -void HMI_Printing(void); // Print page -void HMI_Prepare(void); // Prepare page -void HMI_Control(void); // Control page -void HMI_Leveling(void); // Level the page -void HMI_AxisMove(void); // Axis movement menu -void HMI_Temperature(void); // Temperature menu -void HMI_Motion(void); // Sports menu -void HMI_Info(void); // Information menu -void HMI_Tune(void); // Adjust the menu +void HMI_MainMenu(); // Main process screen +void HMI_SelectFile(); // File page +void HMI_Printing(); // Print page +void HMI_Prepare(); // Prepare page +void HMI_Control(); // Control page +void HMI_Leveling(); // Level the page +void HMI_AxisMove(); // Axis movement menu +void HMI_Temperature(); // Temperature menu +void HMI_Motion(); // Sports menu +void HMI_Info(); // Information menu +void HMI_Tune(); // Adjust the menu -#if HAS_HOTEND - void HMI_PLAPreheatSetting(void); // PLA warm-up setting - void HMI_ABSPreheatSetting(void); // ABS warm-up setting +#if HAS_PREHEAT + void HMI_PLAPreheatSetting(); // PLA warm-up setting + void HMI_ABSPreheatSetting(); // ABS warm-up setting #endif -void HMI_MaxSpeed(void); // Maximum speed submenu -void HMI_MaxAcceleration(void); // Maximum acceleration submenu -void HMI_MaxJerk(void); // Maximum jerk speed submenu -void HMI_Step(void); // Transmission ratio +void HMI_MaxSpeed(); // Maximum speed submenu +void HMI_MaxAcceleration(); // Maximum acceleration submenu +void HMI_MaxJerk(); // Maximum jerk speed submenu +void HMI_Step(); // Transmission ratio -void HMI_Init(void); -void DWIN_Update(void); -void EachMomentUpdate(void); -void DWIN_HandleScreen(void); +void HMI_Init(); +void DWIN_Update(); +void EachMomentUpdate(); +void DWIN_HandleScreen(); -void DWIN_CompletedHoming(void); -void DWIN_CompletedLeveling(void); +void DWIN_CompletedHoming(); +void DWIN_CompletedLeveling(); diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp index dbbd356eff..b1d905d9ad 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp @@ -124,7 +124,7 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { int32_t encoderMultiplier = 1; // if must encoder rati multiplier - if (EncoderRate.encoderRateEnabled) { + if (EncoderRate.enabled) { const float abs_diff = ABS(temp_diff), encoderMovementSteps = abs_diff / (ENCODER_PULSES_PER_STEP); if (EncoderRate.lastEncoderTime) { diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h index fb8102f8b2..93e54839d6 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h @@ -44,7 +44,7 @@ #define BUTTON_PRESSED(BN) !READ(BTN_## BN) typedef struct { - bool encoderRateEnabled = 0; + bool enabled = false; int encoderMoveValue = 0; millis_t lastEncoderTime = 0; } ENCODER_Rate; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index e0fa6fa98f..d2145bcc80 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -576,7 +576,7 @@ volatile bool Temperature::raw_temps_ready = false; #define MAX_CYCLE_TIME_PID_AUTOTUNE 20L #endif if ((ms - _MIN(t1, t2)) > (MAX_CYCLE_TIME_PID_AUTOTUNE * 60L * 1000L)) { - TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(0)); + TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); break; @@ -812,12 +812,16 @@ void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_ms } void Temperature::max_temp_error(const heater_id_t heater_id) { - TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(1)); + #if ENABLED(DWIN_CREALITY_LCD) && (HAS_HOTEND || HAS_HEATED_BED) + DWIN_Popup_Temperature(1); + #endif _temp_error(heater_id, PSTR(STR_T_MAXTEMP), GET_TEXT(MSG_ERR_MAXTEMP)); } void Temperature::min_temp_error(const heater_id_t heater_id) { - TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(0)); + #if ENABLED(DWIN_CREALITY_LCD) && (HAS_HOTEND || HAS_HEATED_BED) + DWIN_Popup_Temperature(0); + #endif _temp_error(heater_id, PSTR(STR_T_MINTEMP), GET_TEXT(MSG_ERR_MINTEMP)); } @@ -1055,7 +1059,7 @@ void Temperature::manage_heater() { // Make sure temperature is increasing if (watch_hotend[e].next_ms && ELAPSED(ms, watch_hotend[e].next_ms)) { // Time to check this extruder? if (degHotend(e) < watch_hotend[e].target) { // Failed to increase enough? - TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(0)); + TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); _temp_error((heater_id_t)e, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); } else // Start again if the target is still far off @@ -1098,7 +1102,7 @@ void Temperature::manage_heater() { // Make sure temperature is increasing if (watch_bed.elapsed(ms)) { // Time to check the bed? if (degBed() < watch_bed.target) { // Failed to increase enough? - TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(0)); + TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); _temp_error(H_BED, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); } else // Start again if the target is still far off @@ -2023,7 +2027,7 @@ void Temperature::init() { state = TRRunaway; case TRRunaway: - TERN_(DWIN_CREALITY_LCD, Popup_Window_Temperature(0)); + TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); _temp_error(heater_id, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); } } @@ -2440,14 +2444,8 @@ void Temperature::tick() { #if DISABLED(SLOW_PWM_HEATERS) - #if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER - constexpr uint8_t pwm_mask = - #if ENABLED(SOFT_PWM_DITHER) - _BV(SOFT_PWM_SCALE) - 1 - #else - 0 - #endif - ; + #if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_HEATED_CHAMBER, FAN_SOFT_PWM) + constexpr uint8_t pwm_mask = TERN0(SOFT_PWM_DITHER, _BV(SOFT_PWM_SCALE) - 1); #define _PWM_MOD(N,S,T) do{ \ const bool on = S.add(pwm_mask, T.soft_pwm_amount); \ WRITE_HEATER_##N(on); \ diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index c41027003e..e27e628b9a 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -89,10 +89,6 @@ #define HAS_GCODE_M876 #endif -#if PREHEAT_COUNT - #define HAS_PREHEAT_COUNT -#endif - #if EXTRUDERS #define HAS_EXTRUDERS #if EXTRUDERS > 1 diff --git a/platformio.ini b/platformio.ini index d0a4cb7b10..bf43936df6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -153,7 +153,6 @@ default_src_filter = + - - + - - - - - - - - @@ -330,7 +329,6 @@ HOST_KEEPALIVE_FEATURE = src_filter=+ REPETIER_GCODE_M360 = src_filter=+ HAS_GCODE_M876 = src_filter=+ HAS_RESUME_CONTINUE = src_filter=+ -HAS_PREHEAT_COUNT = src_filter=+ HAS_LCD_CONTRAST = src_filter=+ LCD_SET_PROGRESS_MANUALLY = src_filter=+ TOUCH_SCREEN_CALIBRATION = src_filter=+ From 9cdb8ca244dcbea0c6d33b2ae40f9d7f059bf4c7 Mon Sep 17 00:00:00 2001 From: deram Date: Thu, 17 Sep 2020 13:41:13 +0300 Subject: [PATCH 0247/1370] SHOW_REMAINING_TIME for HD44780 character LCD (#19416) --- Marlin/Configuration_adv.h | 31 +++++++++++---------- Marlin/src/inc/SanityCheck.h | 6 ++-- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 29 ++++++++++++++++--- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d46ba55a92..214bf4afdd 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1105,23 +1105,26 @@ #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) #endif -#if HAS_GRAPHICAL_LCD && EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) - //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits - //#define SHOW_REMAINING_TIME // Display estimated time to completion +#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && (HAS_GRAPHICAL_LCD || HAS_CHARACTER_LCD) + //#define SHOW_REMAINING_TIME // Display estimated time to completion #if ENABLED(SHOW_REMAINING_TIME) - //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation - //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time + //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation + //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time #endif -#endif -#if HAS_CHARACTER_LCD && EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) - //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing - #if ENABLED(LCD_PROGRESS_BAR) - #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar - #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message - #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) - //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it - //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #if HAS_GRAPHICAL_LCD + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits + #endif + + #if HAS_CHARACTER_LCD + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif #endif #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1ee082720d..9f15d7e5e3 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -692,8 +692,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif PROGRESS_MSG_EXPIRE < 0 #error "PROGRESS_MSG_EXPIRE must be greater than or equal to 0." #endif -#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_GRAPHICAL_LCD, HAS_GRAPHICAL_TFT, EXTENSIBLE_UI) - #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Graphical LCD, TFT, or EXTENSIBLE_UI." +#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_GRAPHICAL_LCD, HAS_GRAPHICAL_TFT, HAS_CHARACTER_LCD, EXTENSIBLE_UI) + #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Character LCD, Graphical LCD, TFT, or EXTENSIBLE_UI." #endif #if !HAS_LCD_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE) @@ -3055,8 +3055,6 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #if !HAS_GRAPHICAL_LCD #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD." - #elif ENABLED(SHOW_REMAINING_TIME) - #error "SHOW_REMAINING_TIME currently requires a Graphical LCD." #endif #endif diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 0a1177d63e..3dc0925b43 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -845,10 +845,31 @@ void MarlinUI::draw_status_screen() { lcd_put_wchar('%'); char buffer[14]; - duration_t elapsed = print_job_timer.duration(); - const uint8_t len = elapsed.toDigital(buffer), - timepos = LCD_WIDTH - len - 1; - lcd_put_wchar(timepos, 2, LCD_STR_CLOCK[0]); + uint8_t timepos = 0; + #if ENABLED(SHOW_REMAINING_TIME) + const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE); + if (show_remain) { + #if ENABLED(USE_M73_REMAINING_TIME) + duration_t remaining = get_remaining_time(); + #else + uint8_t progress = get_progress_percent(); + uint32_t elapsed = print_job_timer.duration(); + duration_t remaining = (progress > 0) ? ((elapsed * 25600 / progress) >> 8) - elapsed : 0; + #endif + const uint8_t len = remaining.toDigital(buffer); + timepos = LCD_WIDTH - 1 - len; + lcd_put_wchar(timepos, 2, 'R'); + } + #else + constexpr bool show_remain = false; + #endif + + if (!show_remain) { + duration_t elapsed = print_job_timer.duration(); + const uint8_t len = elapsed.toDigital(buffer); + timepos = LCD_WIDTH - 1 - len; + lcd_put_wchar(timepos, 2, LCD_STR_CLOCK[0]); + } lcd_put_u8str(buffer); #if LCD_WIDTH >= 20 From 90dea98a144ead5c4daacd18810da6e9dfb08794 Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Mon, 14 Sep 2020 16:32:54 -0600 Subject: [PATCH 0248/1370] Add warning to ExtUI Bed Mesh Screen. (#19397) - Show a warning on the Mesh Bed Leveling screen if some points aren't probed. --- .../ftdi_eve_touch_ui/language/language_en.h | 1 + .../screens/bed_mesh_screen.cpp | 27 ++++++-- .../ftdi_eve_touch_ui/screens/screen_data.h | 64 ++++++++++--------- .../lib/ftdi_eve_touch_ui/screens/screens.h | 1 + 4 files changed, 58 insertions(+), 35 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index e465aa0b93..bd64032729 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -145,6 +145,7 @@ namespace Language_en { PROGMEM Language_Str MSG_TOUCH_CALIBRATION_PROMPT = u8"Touch the dots to calibrate"; PROGMEM Language_Str MSG_AUTOLEVEL_X_AXIS = u8"Level X Axis"; PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished"; + PROGMEM Language_Str MSG_BED_MAPPING_INCOMPLETE = u8"Not all points probed"; PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; PROGMEM Language_Str MSG_SHOW_MESH = u8"Show Bed Mesh"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index eea2268c5b..5f7c8d3b99 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -223,7 +223,7 @@ bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) { void BedMeshScreen::onEntry() { screen_data.BedMeshScreen.highlightedTag = 0; screen_data.BedMeshScreen.count = GRID_MAX_POINTS; - screen_data.BedMeshScreen.showMappingDone = false; + screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; BaseScreen::onEntry(); } @@ -253,8 +253,10 @@ void BedMeshScreen::drawHighlightedPointValue() { .tag(1).button( OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); - if (screen_data.BedMeshScreen.showMappingDone) { - cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); + switch(screen_data.BedMeshScreen.message) { + case screen_data.BedMeshScreen.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; + case screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; + default: break; } } @@ -307,15 +309,30 @@ void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { onRefresh(); } +bool BedMeshScreen::isMeshComplete(ExtUI::bed_mesh_t data) { + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { + if (isnan(data[x][y])) { + return false; + } + } + } + return true; +} + void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { switch(state) { case ExtUI::MESH_START: screen_data.BedMeshScreen.count = 0; - screen_data.BedMeshScreen.showMappingDone = false; + screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; break; case ExtUI::MESH_FINISH: + if (screen_data.BedMeshScreen.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) { + screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_COMPLETE; + } else { + screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE; + } screen_data.BedMeshScreen.count = GRID_MAX_POINTS; - screen_data.BedMeshScreen.showMappingDone = true; break; case ExtUI::PROBE_START: screen_data.BedMeshScreen.highlightedTag = pointToTag(x, y); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index 39e9ce4bc5..a274fef9e7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -52,42 +52,46 @@ union screen_data_t { uint8_t num_page; uint8_t cur_page; #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) - uint16_t scroll_pos; - uint16_t scroll_max; + uint16_t scroll_pos; + uint16_t scroll_max; #endif } FilesScreen; struct { struct base_numeric_adjustment_t placeholder; float e_rel[ExtUI::extruderCount]; } MoveAxisScreen; -#if HAS_MESH - struct { - bool showMappingDone; - uint8_t count; - uint8_t highlightedTag; - } BedMeshScreen; -#endif -#if ENABLED(TOUCH_UI_DEVELOPER_MENU) - struct { - uint32_t next_watchdog_trigger; - const char* message; - } StressTestScreen; -#endif -#if ENABLED(TOUCH_UI_COCOA_PRESS) - struct { - uint32_t start_ms; - } PreheatTimerScreen; -#endif -#if ENABLED(BABYSTEPPING) - struct { - struct base_numeric_adjustment_t placeholder; - xyz_int_t rel; - #if EXTRUDERS > 1 - bool link_nozzles; - #endif - bool show_offsets; - } NudgeNozzleScreen; -#endif + #if HAS_MESH + struct { + enum : uint8_t { + MSG_NONE, + MSG_MESH_COMPLETE, + MSG_MESH_INCOMPLETE + } message; + uint8_t count; + uint8_t highlightedTag; + } BedMeshScreen; + #endif + #if ENABLED(TOUCH_UI_DEVELOPER_MENU) + struct { + uint32_t next_watchdog_trigger; + const char* message; + } StressTestScreen; + #endif + #if ENABLED(TOUCH_UI_COCOA_PRESS) + struct { + uint32_t start_ms; + } PreheatTimerScreen; + #endif + #if ENABLED(BABYSTEPPING) + struct { + struct base_numeric_adjustment_t placeholder; + xyz_int_t rel; + #if EXTRUDERS > 1 + bool link_nozzles; + #endif + bool show_offsets; + } NudgeNozzleScreen; + #endif }; extern screen_data_t screen_data; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index ec8df27607..b425c4fa45 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -533,6 +533,7 @@ class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen Date: Thu, 17 Sep 2020 07:52:47 -0300 Subject: [PATCH 0249/1370] Fix MKS UI SPI flash typo (#19410) --- Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index 9d3adc1bab..ad116d5045 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -221,7 +221,7 @@ void SPIFlashStorage::flushPage() { #if HAS_SPI_FLASH_COMPRESSION // Restart the compressed buffer, keep the pointers of the uncompressed buffer m_compressedDataUsed = 0; - #elif + #else m_pageDataUsed = 0; #endif m_currentPage++; From 70c58719101b1b9cb320716633bc79e40a77ba2c Mon Sep 17 00:00:00 2001 From: jahartley <52391697+jahartley@users.noreply.github.com> Date: Thu, 17 Sep 2020 07:01:10 -0400 Subject: [PATCH 0250/1370] Expose JOYSTICK_DEBUG to the general user (#19394) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 1 + Marlin/src/feature/joystick.h | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 214bf4afdd..35b1dcc563 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3339,6 +3339,7 @@ #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } + //#define JOYSTICK_DEBUG #endif /** diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h index ca46834578..1d25a30cc2 100644 --- a/Marlin/src/feature/joystick.h +++ b/Marlin/src/feature/joystick.h @@ -30,8 +30,6 @@ #include "../core/macros.h" #include "../module/temperature.h" -//#define JOYSTICK_DEBUG - class Joystick { friend class Temperature; private: From 23376b8a31872e7eb3bc67f3b1cdc57e6aaa53ed Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Thu, 17 Sep 2020 07:36:21 -0400 Subject: [PATCH 0251/1370] Host Action: Start (#19398) --- Marlin/src/feature/host_actions.cpp | 3 +++ Marlin/src/feature/host_actions.h | 3 +++ Marlin/src/inc/Conditionals_adv.h | 3 +++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_main.cpp | 8 ++++++++ 5 files changed, 18 insertions(+) diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index 9539c82b64..3012639220 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -62,6 +62,9 @@ void host_action(PGM_P const pstr, const bool eol) { #ifdef ACTION_ON_CANCEL void host_action_cancel() { host_action(PSTR(ACTION_ON_CANCEL)); } #endif +#ifdef ACTION_ON_START + void host_action_start() { host_action(PSTR(ACTION_ON_START)); } +#endif #if ENABLED(HOST_PROMPT_SUPPORT) diff --git a/Marlin/src/feature/host_actions.h b/Marlin/src/feature/host_actions.h index a6ad2c0485..09eeed23e2 100644 --- a/Marlin/src/feature/host_actions.h +++ b/Marlin/src/feature/host_actions.h @@ -44,6 +44,9 @@ void host_action(PGM_P const pstr, const bool eol=true); #ifdef ACTION_ON_CANCEL void host_action_cancel(); #endif +#ifdef ACTION_ON_START + void host_action_start(); +#endif #if ENABLED(HOST_PROMPT_SUPPORT) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index ff13d2897d..73e034d05f 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -196,6 +196,9 @@ #ifndef ACTION_ON_CANCEL #define ACTION_ON_CANCEL "cancel" #endif + #ifndef ACTION_ON_START + #define ACTION_ON_START "start" + #endif #ifndef ACTION_ON_KILL #define ACTION_ON_KILL "poweroff" #endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index fc9e065abe..04c58fd22a 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -366,6 +366,7 @@ namespace Language_en { PROGMEM Language_Str MSG_PAUSING = _UxGT("Pausing..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause Print"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resume Print"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Host Start"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop Print"); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Printing Object"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancel Object"); diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 8908f49fb2..334d998d5c 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -54,6 +54,10 @@ #include "../../feature/password/password.h" #endif +#ifdef ACTION_ON_START + #include "../../feature/host_actions.h" +#endif + void menu_tune(); void menu_cancelobject(); void menu_motion(); @@ -158,6 +162,10 @@ void menu_main() { if (TERN0(MACHINE_CAN_PAUSE, printingIsPaused())) ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print); + #ifdef ACTION_ON_START + ACTION_ITEM(MSG_HOST_START_PRINT, host_action_start); + #endif + SUBMENU(MSG_MOTION, menu_motion); } From 9d5f978d00fc12052813311a832cff248c8b3b84 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 17 Sep 2020 08:52:21 -0300 Subject: [PATCH 0252/1370] Move screen for Color UI (#19386) --- .../src/lcd/tft/bitmaps/btn_64x52_rounded.bmp | Bin 0 -> 10040 bytes Marlin/src/lcd/tft/bitmaps/home.bmp | Bin 0 -> 12344 bytes .../lcd/tft/images/btn_rounded_64x52x4.cpp | 82 ++++ Marlin/src/lcd/tft/images/home_64x64x4.cpp | 94 ++++ Marlin/src/lcd/tft/tft_color.h | 10 +- Marlin/src/lcd/tft/tft_image.cpp | 2 + Marlin/src/lcd/tft/tft_image.h | 6 + Marlin/src/lcd/tft/touch.cpp | 11 + Marlin/src/lcd/tft/touch.h | 5 + Marlin/src/lcd/tft/ui_320x240.cpp | 3 + Marlin/src/lcd/tft/ui_320x240.h | 2 + Marlin/src/lcd/tft/ui_480x320.cpp | 435 ++++++++++++++++++ Marlin/src/lcd/tft/ui_480x320.h | 2 + Marlin/src/lcd/ultralcd.h | 4 + .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 12 +- 15 files changed, 662 insertions(+), 6 deletions(-) create mode 100644 Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/home.bmp create mode 100644 Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp create mode 100644 Marlin/src/lcd/tft/images/home_64x64x4.cpp diff --git a/Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp b/Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp new file mode 100644 index 0000000000000000000000000000000000000000..04e879dbb0d8ff6406b5808f0e3cdcba32af85fb GIT binary patch literal 10040 zcmeI2OG{fp7>3jSh|)h$+8`{3Z=(1tRbAyb?WP7Gfr@bKp5=9e}B%<=JYp-`X^Spq6*ZEf{T zAfE59&HO1y*4EapudhMf*w|nTQH9_?KR+i)nXC(|LltPQ3AtT0kh0koJN0ntyGLO`m0b?eomvmyjChk8vRwM zDnF;uUtTK}BaQwlRF$98=r6C8ijhWt6{^b5`9k#9_W3zr*3;&O&!08-FaE*rbUHC* zboP&g&nxt|{3HB3k-?h86k}1axv`LhQ%}7FUDL!64B}J+V1m~2@9(`m#PC9oE_lU-e1v;&S((*q1( zK*HMvwN|TvD*S6qy;7+}^6Kh}O``Mp0S*aZ@`Ad)zHXf#5Pv(4j*iIVUvF=3W2Djo zEP*BmArK!Y9b+9lAgk3X%Cn=y`3?A4fEK_zZPUI$()k3bX@R31T4SHSfVObmiN zM7RhNo>A~3M`FT(1aA;dcpwB8O-K|Fi0&5(n@;sicTZ2x4D3<~Jyq2;e|`Voe^>qW z5AlCQ{O;H-;ao%bi{1PC$?+RChvR4N|N4vg+wI`;=+UFU4{ZVduR~t2{o&O>IF1?q zJ0^;u91}9`7z$AjFvHKJ4Gj%D0)<@+BoDd@(vYn(>kZ(WL+6$&=^LpU=w5LKI)o z0!uym{K6%|!ouR?F(~neEG685&V?X zr%z8!O_>w({mq*<7cX9v-O#2#Gm)>-Gf;a$Z6Kr)&>Oyy?XV^6|mIrFMjr~;NW0FRsuf^ zP9f|hsy}}GcxY%SL9)c@s_8HOZ{NN>e*8EsEiF4cTRE$xq@>WCpPzR{tL?YOPs~pd zF%lIE>yMViT93rP%jM*7t;BB(P!8$5cc^f1_~F5l6bN0#pWG7X>!PBf8#iw7>Kzb% zz~E<1D=aM39__I|ivwfo>gpmRBYE`*c<^4%ZX6%D>u&sG&0DnJ!he{ZRSQd|rltl4 z26DR3$jBf;Ap#QdAQ&?%F4=|oSdenCivUi+qLq&-2?x_ zhYztT>lkYnXV|5srNza?7cX9r$-y_&{2VjUZfgy*(gx~|Do{0!vFd6X9)}y7)d@v>i0pjwY8Pp{@B=b$`$;~%nYbXYD@6*AW)&8pulOWVQXuP7vEFVDX!Jbn69AD&lIfmib%1Qmqa=vZEYm-zjwLQ6{vmLDA* zb>%i%crCxbR1j{{-{0>RyiFH@wANq$8 z#j55jHu5Vfz{!S1HkBMK8NB7?WzL3VENzEpMtk{%3gl;?C0EZc4s2fJkkN>%I&Wj% z!ulg^=NHp)WZ>5j{(Fa98Oc>~g3u?icGpY%)?h4r>p#G6LF)tcmBar3^A5+qc0^VJ literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp b/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp new file mode 100644 index 0000000000..69a045d85a --- /dev/null +++ b/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp @@ -0,0 +1,82 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t btn_rounded_64x52x4[1664] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, + 0x88, 0x88, 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x87, 0x77, 0x78, + 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x66, 0x78, + 0x88, 0x8d, 0xff, 0xb8, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x7b, 0xff, 0xc6, 0x67, + 0x87, 0xbf, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, 0xf9, 0x56, + 0x87, 0xef, 0x84, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x58, 0xfd, 0x46, + 0x87, 0xff, 0x54, 0x44, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xff, 0x45, + 0x87, 0xff, 0x44, 0x45, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xff, 0x45, + 0x87, 0xff, 0x44, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, + 0x87, 0xef, 0x84, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xfe, 0x44, + 0x87, 0xaf, 0xf6, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xf9, 0x44, + 0x87, 0x7d, 0xff, 0xb8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9c, 0xff, 0xd4, 0x45, + 0x87, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x45, + 0x87, 0x76, 0x56, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x64, 0x44, 0x46, + 0x87, 0x77, 0x65, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x56, + 0x88, 0x77, 0x76, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x67, + 0x88, 0x77, 0x77, 0x66, 0x65, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x66, 0x78, + 0x88, 0x88, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x78, +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/home_64x64x4.cpp b/Marlin/src/lcd/tft/images/home_64x64x4.cpp new file mode 100644 index 0000000000..107c76e54e --- /dev/null +++ b/Marlin/src/lcd/tft/images/home_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t home_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9d, 0xff, 0xea, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x40, 0xbf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf6, 0x54, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x57, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, + 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, + 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xb, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, + 0x87, 0x7f, 0xff, 0xff, 0xff, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0xfb, 0x68, 0x88, + 0x87, 0x7f, 0xff, 0xff, 0xf7, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xfd, 0x67, 0x88, + 0x87, 0x3d, 0xff, 0xff, 0x75, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x30, 0xbf, 0xff, 0xfa, 0x68, 0x88, + 0x88, 0x44, 0xce, 0xd7, 0x58, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x74, 0x19, 0xee, 0xa6, 0x88, 0x88, + 0x88, 0x73, 0x24, 0x56, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x52, 0x35, 0x68, 0x88, 0x88, + 0x88, 0x87, 0x66, 0x78, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x87, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x44, 0x44, 0x44, 0x12, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x72, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x4c, 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0x97, 0x88, 0x88, 0x88, 0x84, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x32, 0x44, 0x44, 0x44, 0x44, 0x33, 0x57, 0x88, 0x88, 0x88, 0x88, 0x86, 0x43, 0x34, 0x44, 0x44, 0x44, 0x34, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h index d2c5d8e7db..14906a1bcf 100644 --- a/Marlin/src/lcd/tft/tft_color.h +++ b/Marlin/src/lcd/tft/tft_color.h @@ -42,6 +42,7 @@ #define COLOR_SCARLET 0xF904 // #FF2020 #define COLOR_LIME 0x7E00 // #00FF00 #define COLOR_BLUE 0x001F // #0000FF +#define COLOR_LIGHT_BLUE 0x061F // #00C3FF #define COLOR_YELLOW 0xFFE0 // #FFFF00 #define COLOR_MAGENTA 0xF81F // #FF00FF #define COLOR_FUCHSIA 0xF81F // #FF00FF @@ -66,10 +67,11 @@ #define COLOR_DARK_PURPLE 0x9930 // #992380 - -#define COLOR_BACKGROUND 0x20AC // #1E156E -#define COLOR_SELECTION_BG 0x9930 // #992380 -#define COLOR_WEBSITE_URL 0x03B7 +#ifndef COLOR_BACKGROUND + #define COLOR_BACKGROUND 0x20AC // #1E156E +#endif +#define COLOR_SELECTION_BG 0x9930 // #992380 +#define COLOR_WEBSITE_URL 0x03B7 #define COLOR_INACTIVE COLOR_GREY #define COLOR_COLD COLOR_AQUA diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index ff60bee9a9..27749cb7f3 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -45,6 +45,8 @@ const tImage Fan_Slow1_64x64x4 = { (void *)fan_slow1_64x64x4, 64, 64, GREYS const tImage Fan_Fast0_64x64x4 = { (void *)fan_fast0_64x64x4, 64, 64, GREYSCALE4 }; const tImage Fan_Fast1_64x64x4 = { (void *)fan_fast1_64x64x4, 64, 64, GREYSCALE4 }; const tImage SD_64x64x4 = { (void *)sd_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Home_64x64x4 = { (void *)home_64x64x4, 64, 64, GREYSCALE4 }; +const tImage BtnRounded_64x52x4 = { (void *)btn_rounded_64x52x4, 64, 52, GREYSCALE4 }; const tImage Menu_64x64x4 = { (void *)menu_64x64x4, 64, 64, GREYSCALE4 }; const tImage Settings_64x64x4 = { (void *)settings_64x64x4, 64, 64, GREYSCALE4 }; const tImage Confirm_64x64x4 = { (void *)confirm_64x64x4, 64, 64, GREYSCALE4 }; diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h index cf48065968..1f13967ba2 100644 --- a/Marlin/src/lcd/tft/tft_image.h +++ b/Marlin/src/lcd/tft/tft_image.h @@ -39,6 +39,8 @@ extern const uint8_t fan0_64x64x4[], fan1_64x64x4[]; extern const uint8_t fan_slow0_64x64x4[], fan_slow1_64x64x4[]; extern const uint8_t fan_fast0_64x64x4[], fan_fast1_64x64x4[]; extern const uint8_t sd_64x64x4[]; +extern const uint8_t home_64x64x4[]; +extern const uint8_t btn_rounded_64x52x4[]; extern const uint8_t menu_64x64x4[]; extern const uint8_t settings_64x64x4[]; extern const uint8_t confirm_64x64x4[]; @@ -90,6 +92,8 @@ enum MarlinImage : uint8_t { imgRefresh, imgLeveling, imgSlider, + imgHome, + imgBtn52Rounded, imgCount, noImage = imgCount, imgPageUp = imgLeft, @@ -136,6 +140,8 @@ extern const tImage Fan_Slow1_64x64x4; extern const tImage Fan_Fast0_64x64x4; extern const tImage Fan_Fast1_64x64x4; extern const tImage SD_64x64x4; +extern const tImage Home_64x64x4; +extern const tImage BtnRounded_64x52x4; extern const tImage Menu_64x64x4; extern const tImage Settings_64x64x4; extern const tImage Confirm_64x64x4; diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index d2b860ab15..d19cc4bf1d 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -35,6 +35,7 @@ #include "tft.h" +bool Touch::enabled = true; int16_t Touch::x, Touch::y; touch_control_t Touch::controls[]; touch_control_t *Touch::current_control; @@ -54,6 +55,7 @@ void Touch::init() { calibration_reset(); reset(); io.Init(); + enable(); } void Touch::add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data) { @@ -72,6 +74,8 @@ void Touch::idle() { uint16_t i; int16_t _x, _y; + if (!enabled) return; + if (now == millis()) return; now = millis(); @@ -253,6 +257,13 @@ void Touch::touch(touch_control_t *control) { case UBL: hold(control, UBL_REPEAT_DELAY); ui.encoderPosition += control->data; break; #endif + case MOVE_AXIS: + ui.goto_screen((screenFunc_t)ui.move_axis_screen); + break; + + // TODO: TOUCH could receive data to pass to the callback + case BUTTON: ((screenFunc_t)control->data)(); break; + default: break; } } diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h index f3e53ae461..7d8f222918 100644 --- a/Marlin/src/lcd/tft/touch.h +++ b/Marlin/src/lcd/tft/touch.h @@ -79,6 +79,8 @@ enum TouchControlType : uint16_t { FEEDRATE, FLOWRATE, UBL, + MOVE_AXIS, + BUTTON, }; typedef void (*screenFunc_t)(); @@ -132,6 +134,7 @@ class Touch { private: static TOUCH_DRIVER io; static int16_t x, y; + static bool enabled; static touch_control_t controls[MAX_CONTROLS]; static touch_control_t *current_control; @@ -162,6 +165,8 @@ class Touch { static void clear() { controls_count = 0; } static void idle(); static bool is_clicked() { return touch_control_type == CLICK; } + static void disable() { enabled = false; } + static void enable() { enabled = true; } static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data = 0); diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index a4ac1465ea..2f4c90e170 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -650,4 +650,7 @@ void menu_item(const uint8_t row, bool sel ) { TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 2 + 34 * row, 320, 32, encoderTopLine + row)); } +void MarlinUI::move_axis_screen() { +} + #endif // HAS_UI_320x240 diff --git a/Marlin/src/lcd/tft/ui_320x240.h b/Marlin/src/lcd/tft/ui_320x240.h index ed69acbcd2..c9822f11cc 100644 --- a/Marlin/src/lcd/tft/ui_320x240.h +++ b/Marlin/src/lcd/tft/ui_320x240.h @@ -73,6 +73,8 @@ const tImage Images[imgCount] = { Refresh_32x32x4, Leveling_32x32x4, Slider8x16x4, + Home_64x64x4, + BtnRounded_64x52x4, }; #if HAS_TEMP_CHAMBER && HOTENDS > 1 diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index c9f0bfd0e9..d6409c1dca 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -291,6 +291,7 @@ void MarlinUI::draw_status_screen() { offset += 32 - tft_string.width(); } tft.add_text(455 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, 132, TFT_WIDTH - 8, 34)); // feed rate tft.canvas(96, 180, 100, 32); @@ -654,4 +655,438 @@ void menu_item(const uint8_t row, bool sel ) { TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row)); } +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "../../feature/babystep.h" +#endif + +#if HAS_BED_PROBE + #include "../../module/probe.h" +#endif + +#define Z_SELECTION_Z 1 +#define Z_SELECTION_Z_PROBE -1 + +struct MotionAxisState { + xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos; + float currentStepSize = 10.0; + int z_selection = Z_SELECTION_Z; + uint8_t e_selection = 0; + bool homming = false; + bool blocked = false; + char message[32]; +}; + +MotionAxisState motionAxisState; + +#define E_BTN_COLOR COLOR_YELLOW +#define X_BTN_COLOR COLOR_CORAL_RED +#define Y_BTN_COLOR COLOR_VIVID_GREEN +#define Z_BTN_COLOR COLOR_LIGHT_BLUE + +#define BTN_WIDTH 64 +#define BTN_HEIGHT 52 +#define X_MARGIN 20 +#define Y_MARGIN 15 + +static void quick_feedback() { + #if HAS_CHIRP + ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle? + #if BOTH(HAS_LCD_MENU, USE_BEEPER) + for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } + #elif HAS_LCD_MENU + delay(10); + #endif + #endif +} + +#define CUR_STEP_VALUE_WIDTH 104 +static void drawCurStepValue() { + tft_string.set((uint8_t *)ftostr52sp(motionAxisState.currentStepSize)); + tft_string.add("mm"); + tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string); +} + +static void drawCurZSelection() { + tft_string.set("Z"); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + tft.queue.sync(); + tft_string.set("Offset"); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34); + tft.set_background(COLOR_BACKGROUND); + if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + } +} + +static void drawCurESelection() { + tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set("E"); + tft.add_text(0, 0, E_BTN_COLOR , tft_string); + tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); +} + +static void drawMessage(const char *msg) { + tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(0, 0, COLOR_YELLOW, msg); +} + +static void drawAxisValue(AxisEnum axis) { + const float value = + #if HAS_BED_PROBE + axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? + probe.offset.z : + #endif + NATIVE_TO_LOGICAL( + ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), + axis + ); + xy_int_t pos; + uint16_t color; + switch (axis) { + case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; + case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; + case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; + case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + default: return; + } + tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ftostr52sp(value)); + tft.add_text(0, 0, color, tft_string); +} + +static void moveAxis(AxisEnum axis, const int8_t direction) { + quick_feedback(); + + if (axis == E_AXIS && thermalManager.temp_hotend[motionAxisState.e_selection].celsius < EXTRUDE_MINTEMP) { + drawMessage("Too cold"); + return; + } + + const float diff = motionAxisState.currentStepSize * direction; + + if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; + const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; + const float bsDiff = planner.steps_to_mm[Z_AXIS] * babystep_increment, + new_probe_offset = probe.offset.z + bsDiff, + new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET + , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff + , new_probe_offset + ); + if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + babystep.add_steps(Z_AXIS, babystep_increment); + if (do_probe) + probe.offset.z = new_offs; + else + TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); + drawMessage(""); // clear the error + drawAxisValue(axis); + } + else { + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + #elif HAS_BED_PROBE + // only change probe.offset.z + probe.offset.z += diff; + if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) { + current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) { + current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else { + drawMessage(""); // clear the error + } + drawAxisValue(axis); + #endif + return; + } + + if (!ui.manual_move.processing) { + // Start with no limits to movement + float min = current_position[axis] - 1000, + max = current_position[axis] + 1000; + + // Limit to software endstops, if enabled + #if HAS_SOFTWARE_ENDSTOPS + if (soft_endstops_enabled) switch (axis) { + case X_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_X, min = soft_endstop.min.x); + TERN_(MAX_SOFTWARE_ENDSTOP_X, max = soft_endstop.max.x); + break; + case Y_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_Y, min = soft_endstop.min.y); + TERN_(MAX_SOFTWARE_ENDSTOP_Y, max = soft_endstop.max.y); + break; + case Z_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_Z, min = soft_endstop.min.z); + TERN_(MAX_SOFTWARE_ENDSTOP_Z, max = soft_endstop.max.z); + default: break; + } + #endif // HAS_SOFTWARE_ENDSTOPS + + // Delta limits XY based on the current offset from center + // This assumes the center is 0,0 + #if ENABLED(DELTA) + if (axis != Z_AXIS && axis != E_AXIS) { + max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis + min = -max; + } + #endif + + // Get the new position + #if IS_KINEMATIC + ui.manual_move.offset += diff; + if (direction < 0) + NOLESS(ui.manual_move.offset, min - current_position[axis]); + else + NOMORE(ui.manual_move.offset, max - current_position[axis]); + #else + current_position[axis] += diff; + if (direction < 0 && current_position[axis] < min) { + current_position[axis] = min; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position[axis] > max) { + current_position[axis] = max; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else { + drawMessage(""); // clear the error + } + #endif + + ui.manual_move.soon(axis + #if MULTI_MANUAL + , motionAxisState.e_selection + #endif + ); + } + + drawAxisValue(axis); +} + +static void e_plus() { + moveAxis(E_AXIS, 1); +} + +static void e_minus() { + moveAxis(E_AXIS, -1); +} + +static void x_minus() { + moveAxis(X_AXIS, -1); +} + +static void x_plus() { + moveAxis(X_AXIS, 1); +} + +static void y_plus() { + moveAxis(Y_AXIS, 1); +} + +static void y_minus() { + moveAxis(Y_AXIS, -1); +} + +static void z_plus() { + moveAxis(Z_AXIS, 1); +} + +static void z_minus() { + moveAxis(Z_AXIS, -1); +} + +static void e_select() { + motionAxisState.e_selection++; + if (motionAxisState.e_selection >= EXTRUDERS) { + motionAxisState.e_selection = 0; + } + + quick_feedback(); + drawCurESelection(); + drawAxisValue(E_AXIS); +} + +static void do_home() { + quick_feedback(); + drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING)); + queue.inject_P(G28_STR); + // Disable touch until home is done + touch.disable(); + drawAxisValue(E_AXIS); + drawAxisValue(X_AXIS); + drawAxisValue(Y_AXIS); + drawAxisValue(Z_AXIS); +} + +static void step_size() { + motionAxisState.currentStepSize = motionAxisState.currentStepSize / 10.0; + if (motionAxisState.currentStepSize < 0.0015) motionAxisState.currentStepSize = 10.0; + quick_feedback(); + drawCurStepValue(); +} + +#if HAS_BED_PROBE + static void z_select() { + motionAxisState.z_selection *= -1; + quick_feedback(); + drawCurZSelection(); + drawAxisValue(Z_AXIS); + } +#endif + +static void disable_steppers() { + quick_feedback(); + queue.inject_P(PSTR("M84")); +} + +static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { + uint16_t width = Images[imgBtn52Rounded].width; + uint16_t height = Images[imgBtn52Rounded].height; + + tft.queue.sync(); //need sync to change font + + if (!enabled) bgColor = COLOR_CONTROL_DISABLED; + + tft.canvas(x, y, width, height); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgBtn52Rounded, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + + if (label != NULL) { + tft.set_font(Helvetica12Bold); + tft_string.set_font(Helvetica12Bold); + tft_string.set(label); + tft_string.trim(); + tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); + + tft.queue.sync(); + tft_string.set_font(Helvetica18); + tft.set_font(Helvetica18); + } + else { + tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + } + + if (enabled) touch.add_control(BUTTON, x, y, width, height, data); +} + +void MarlinUI::move_axis_screen() { + // Reset + motionAxisState.blocked = false; + touch.enable(); + + ui.clear_lcd(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + const bool busy = printingIsActive(); + + // if we have baby step and we are printing, select baby step + if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + + // ROW 1 -> E- Y- CurY Z+ + int x = X_MARGIN, y = Y_MARGIN, spacing = 0; + + drawBtn(x, y, "E+", (int32_t)e_plus, imgUp, E_BTN_COLOR, !busy); + + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Y+", (int32_t)y_plus, imgUp, Y_BTN_COLOR, !busy); + + // Cur Y + x += BTN_WIDTH; + motionAxisState.yValuePos.x = x + 2; + motionAxisState.yValuePos.y = y; + drawAxisValue(Y_AXIS); + + x += spacing; + drawBtn(x, y, "Z+", (int32_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + // ROW 2 -> "Ex" X- HOME X+ "Z" + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; + + motionAxisState.eNamePos.x = x; + motionAxisState.eNamePos.y = y; + drawCurESelection(); + if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "X-", (int32_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; //imgHome is 64x64 + add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy); + + x += BTN_WIDTH + spacing; + uint16_t xplus_x = x; + drawBtn(x, y, "X+", (int32_t)x_plus, imgRight, X_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; + motionAxisState.zTypePos.x = x; + motionAxisState.zTypePos.y = y; + drawCurZSelection(); + #if HAS_BED_PROBE + if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (int32_t)z_select); + #endif + + // ROW 3 -> E- CurX Y- Z- + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + + drawBtn(x, y, "E-", (int32_t)e_minus, imgDown, E_BTN_COLOR, !busy); + + // Cur E + motionAxisState.eValuePos.x = x; + motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; + drawAxisValue(E_AXIS); + + // Cur X + motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos + motionAxisState.xValuePos.y = y - 10; + drawAxisValue(X_AXIS); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Y-", (int32_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Z-", (int32_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + // Cur Z + motionAxisState.zValuePos.x = x; + motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; + drawAxisValue(Z_AXIS); + + // ROW 4 -> step_size disable steppers back + y = TFT_HEIGHT - Y_MARGIN - 32; // + x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2; + motionAxisState.stepValuePos.x = x; + motionAxisState.stepValuePos.y = y; + if (!busy) { + drawCurStepValue(); + touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size); + } + + // alinged with x+ + drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (int32_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); + + add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack); +} + +#undef BTN_WIDTH +#undef BTN_HEIGHT + #endif // HAS_UI_480x320 diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h index d803df4a24..053ee78158 100644 --- a/Marlin/src/lcd/tft/ui_480x320.h +++ b/Marlin/src/lcd/tft/ui_480x320.h @@ -73,6 +73,8 @@ const tImage Images[imgCount] = { Refresh_32x32x4, Leveling_32x32x4, Slider8x16x4, + Home_64x64x4, + BtnRounded_64x52x4, }; #if HAS_TEMP_CHAMBER && HOTENDS > 1 diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index ee7f50dabf..59e7cbe7d1 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -682,6 +682,10 @@ public: static void touch_calibration(); #endif + #if HAS_GRAPHICAL_TFT + static void move_axis_screen(); + #endif + private: #if HAS_DISPLAY diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 1295c7c46b..f9652f3934 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -325,13 +325,21 @@ #define LCD_PINS_RS PC6 #elif ENABLED(TFT_480x320_SPI) + #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17253 + #endif + #ifndef XPT2046_Y_CALIBRATION #define XPT2046_Y_CALIBRATION 11579 + #endif + #ifndef XPT2046_X_OFFSET #define XPT2046_X_OFFSET 514 + #endif + #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -24 + #endif - #define TFT_DRIVER ST7796 - #define TFT_BUFFER_SIZE 14400 + #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 #endif From 9d60047018663309013e26bec73767b5dd4b91c0 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 18 Sep 2020 02:45:56 -0700 Subject: [PATCH 0253/1370] Fix missing include (#19418) Co-authored-by: ellensp <530024+ellensp@users.noreply.github.com> --- Marlin/src/gcode/bedlevel/G35.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 7595067dbf..926e6e82c5 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -29,6 +29,10 @@ #include "../../module/probe.h" #include "../../feature/bedlevel/bedlevel.h" +#if HAS_MULTI_HOTEND + #include "../../module/tool_change.h" +#endif + #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../../core/debug_out.h" From 9065a8da894bd95df9de2ed031bdaf292d7b12df Mon Sep 17 00:00:00 2001 From: Cole Markham Date: Sat, 19 Sep 2020 08:14:34 -0500 Subject: [PATCH 0254/1370] Fix CoreXY compile with backlash cal. (#19422) --- Marlin/src/gcode/calibrate/M425.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 5 +---- Marlin/src/lcd/menu/menu_backlash.cpp | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Marlin/src/gcode/calibrate/M425.cpp b/Marlin/src/gcode/calibrate/M425.cpp index 3e54186a5f..40441ac08d 100644 --- a/Marlin/src/gcode/calibrate/M425.cpp +++ b/Marlin/src/gcode/calibrate/M425.cpp @@ -56,7 +56,7 @@ void GcodeSuite::M425() { }; LOOP_XYZ(a) { - if (AXIS_CAN_CALIBRATE(a) && parser.seen(XYZ_CHAR(a))) { + if (axis_can_calibrate(a) && parser.seen(XYZ_CHAR(a))) { planner.synchronize(); backlash.distance_mm[a] = parser.has_value() ? parser.value_linear_units() : backlash.get_measurement(AxisEnum(a)); noArgs = false; diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 71ae4bb285..2b232623a3 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -159,10 +159,7 @@ // Calibration codes only for non-core axes #if EITHER(BACKLASH_GCODE, CALIBRATION_GCODE) #if EITHER(IS_CORE, MARKFORGED_XY) - #define X_AXIS_INDEX 0 - #define Y_AXIS_INDEX 1 - #define Z_AXIS_INDEX 2 - #define CAN_CALIBRATE(A,B) (A##_AXIS_INDEX == B##_INDEX) + #define CAN_CALIBRATE(A,B) (_AXIS(A) == B) #else #define CAN_CALIBRATE(A,B) 1 #endif diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp index 0e1bfb5910..9d0b970ae1 100644 --- a/Marlin/src/lcd/menu/menu_backlash.cpp +++ b/Marlin/src/lcd/menu/menu_backlash.cpp @@ -50,4 +50,4 @@ void menu_backlash() { END_MENU(); } -#endif // HAS_LCD_MENU && BACKLASH_COMPENSATION +#endif // HAS_LCD_MENU && BACKLASH_GCODE From dc7e2965d60593aeadcb4ca9bc7f51fb2d0041ca Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 19 Sep 2020 07:56:01 -0500 Subject: [PATCH 0255/1370] Change some dwin defines --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 446 +++++++++++++++--------------- Marlin/src/lcd/dwin/e3v2/dwin.h | 18 +- 2 files changed, 232 insertions(+), 232 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index d45511f5bc..ca3a5cccff 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -99,9 +99,9 @@ #define USE_STRING_HEADINGS -#define MENU_FONT font8x16 -#define STAT_FONT font10x20 -#define HEADER_FONT font10x20 +#define DWIN_FONT_MENU font8x16 +#define DWIN_FONT_STAT font10x20 +#define DWIN_FONT_HEAD font10x20 #define MENU_CHAR_LIMIT 24 #define STATUS_Y 360 @@ -229,19 +229,19 @@ void HMI_ToggleLanguage() { void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { if (value < 0) { - DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, F("-")); - DWIN_Draw_FloatValue(true, true, 0, size, White, bColor, iNum, fNum, x, y, -value); + DWIN_Draw_String(false, true, size, Color_White, bColor, x - 6, y, F("-")); + DWIN_Draw_FloatValue(true, true, 0, size, Color_White, bColor, iNum, fNum, x, y, -value); } else { - DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, F(" ")); - DWIN_Draw_FloatValue(true, true, 0, size, White, bColor, iNum, fNum, x, y, value); + DWIN_Draw_String(false, true, size, Color_White, bColor, x - 6, y, F(" ")); + DWIN_Draw_FloatValue(true, true, 0, size, Color_White, bColor, iNum, fNum, x, y, value); } } void ICON_Print() { if (select_page.now == 0) { DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); - DWIN_Draw_Rectangle(0, White, 17, 130, 126, 229); + DWIN_Draw_Rectangle(0, Color_White, 17, 130, 126, 229); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 58, 201); else @@ -259,7 +259,7 @@ void ICON_Print() { void ICON_Prepare() { if (select_page.now == 1) { DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); - DWIN_Draw_Rectangle(0, White, 145, 130, 254, 229); + DWIN_Draw_Rectangle(0, Color_White, 145, 130, 254, 229); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 31, 447, 58, 460, 186, 201); else @@ -277,7 +277,7 @@ void ICON_Prepare() { void ICON_Control() { if (select_page.now == 2) { DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); - DWIN_Draw_Rectangle(0, White, 17, 246, 126, 345); + DWIN_Draw_Rectangle(0, Color_White, 17, 246, 126, 345); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 61, 447, 88, 460, 58, 318); else @@ -295,7 +295,7 @@ void ICON_Control() { void ICON_StartInfo(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); - DWIN_Draw_Rectangle(0, White, 145, 246, 254, 345); + DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 91, 447, 118, 460, 186, 318); else @@ -313,7 +313,7 @@ void ICON_StartInfo(bool show) { void ICON_Leveling(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); - DWIN_Draw_Rectangle(0, White, 145, 246, 254, 345); + DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 211, 447, 238, 460, 186, 318); else @@ -331,7 +331,7 @@ void ICON_Leveling(bool show) { void ICON_Tune() { if (select_print.now == 0) { DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); - DWIN_Draw_Rectangle(0, White, 8, 252, 87, 351); + DWIN_Draw_Rectangle(0, Color_White, 8, 252, 87, 351); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 121, 447, 148, 458, 34, 325); else @@ -349,7 +349,7 @@ void ICON_Tune() { void ICON_Pause() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); - DWIN_Draw_Rectangle(0, White, 96, 252, 175, 351); + DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 181, 447, 208, 459, 124, 325); else @@ -367,7 +367,7 @@ void ICON_Pause() { void ICON_Continue() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); - DWIN_Draw_Rectangle(0, White, 96, 252, 175, 351); + DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 124, 325); else @@ -385,7 +385,7 @@ void ICON_Continue() { void ICON_Stop() { if (select_print.now == 2) { DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); - DWIN_Draw_Rectangle(0, White, 184, 252, 263, 351); + DWIN_Draw_Rectangle(0, Color_White, 184, 252, 263, 351); if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 151, 447, 178, 459, 210, 325); else @@ -401,19 +401,19 @@ void ICON_Stop() { } inline void Clear_Title_Bar() { - DWIN_Draw_Rectangle(1, Background_blue, 0, 0, DWIN_WIDTH, 30); + DWIN_Draw_Rectangle(1, Color_Bg_Blue, 0, 0, DWIN_WIDTH, 30); } inline void Draw_Title(const char * const title) { - DWIN_Draw_String(false, false, HEADER_FONT, White, Background_blue, 14, 4, (char*)title); + DWIN_Draw_String(false, false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, (char*)title); } inline void Draw_Title(const __FlashStringHelper * title) { - DWIN_Draw_String(false, false, HEADER_FONT, White, Background_blue, 14, 4, (char*)title); + DWIN_Draw_String(false, false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, (char*)title); } inline void Clear_Menu_Area() { - DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, STATUS_Y); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y); } inline void Clear_Main_Window() { @@ -423,11 +423,11 @@ inline void Clear_Main_Window() { inline void Clear_Popup_Area() { Clear_Title_Bar(); - DWIN_Draw_Rectangle(1, Background_black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); } void Draw_Popup_Bkgd_105() { - DWIN_Draw_Rectangle(1, Background_window, 14, 105, 258, 374); + DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 105, 258, 374); } inline void Draw_More_Icon(const uint8_t line) { @@ -440,7 +440,7 @@ inline void Draw_Menu_Cursor(const uint8_t line) { } inline void Erase_Menu_Cursor(const uint8_t line) { - DWIN_Draw_Rectangle(1, Background_black, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); } inline void Move_Highlight(const int16_t from, const uint16_t newline) { @@ -454,7 +454,7 @@ inline void Add_Menu_Line() { } inline void Scroll_Menu(const uint8_t dir) { - DWIN_Frame_AreaMove(1, dir, MLINE, Background_black, 0, 31, DWIN_WIDTH, 349); + DWIN_Frame_AreaMove(1, dir, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); switch (dir) { case DWIN_SCROLL_DOWN: Move_Highlight(-1, 0); break; case DWIN_SCROLL_UP: Add_Menu_Line(); break; @@ -470,11 +470,11 @@ inline void Draw_Menu_Icon(const uint8_t line, const uint8_t icon) { } inline void Erase_Menu_Text(const uint8_t line) { - DWIN_Draw_Rectangle(1, Background_black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); + DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); } inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr) { - if (label) DWIN_Draw_String(false, false, font8x16, White, Background_black, LBLX, MBASE(line) - 1, (char*)label); + if (label) DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, (char*)label); if (icon) Draw_Menu_Icon(line, icon); DWIN_Draw_Line(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); } @@ -583,7 +583,7 @@ inline void Item_Prepare_Home(const uint8_t row) { if (HMI_flag.language_chinese) { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); #else DWIN_Frame_AreaCopy(1, 43, 89, 98, 101, LBLX, MBASE(row)); #endif @@ -591,7 +591,7 @@ inline void Item_Prepare_Home(const uint8_t row) { else { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); #else DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." #endif @@ -638,11 +638,11 @@ inline void Item_Prepare_Home(const uint8_t row) { inline void Item_Prepare_Lang(const uint8_t row) { if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 239, 134, 266, 146, LBLX, MBASE(row)); - DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), F("CN")); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("CN")); } else { DWIN_Frame_AreaCopy(1, 0, 194, 121, 207, LBLX, MBASE(row)); // "Language selection" - DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), F("EN")); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("EN")); } Draw_Menu_Icon(row, ICON_Language); } @@ -716,14 +716,14 @@ inline void Draw_Control_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_CONTROL)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); #endif - if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(CONTROL_CASE_INFO), F("Info")); + if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_INFO), F("Info")); #else DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control" DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > @@ -784,17 +784,17 @@ inline void Draw_Tune_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TUNE)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_SPEED), GET_TEXT_F(MSG_SPEED)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_SPEED), GET_TEXT_F(MSG_SPEED)); #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); #endif #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); #endif #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); #endif - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TUNE_CASE_ZOFF), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_ZOFF), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else DWIN_Frame_AreaCopy(1, 94, 2, 126, 12, 14, 9); DWIN_Frame_AreaCopy(1, 1, 179, 92, 190, LBLX, MBASE(TUNE_CASE_SPEED)); // Print speed @@ -819,23 +819,23 @@ inline void Draw_Tune_Menu() { if (select_tune.now) Draw_Menu_Cursor(select_tune.now); Draw_Menu_Line(TUNE_CASE_SPEED, ICON_Speed); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_SPEED), feedrate_percentage); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_SPEED), feedrate_percentage); #if HAS_HOTEND Draw_Menu_Line(TUNE_CASE_TEMP, ICON_HotendTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.temp_hotend[0].target); #endif #if HAS_HEATED_BED Draw_Menu_Line(TUNE_CASE_BED, ICON_BedTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.temp_bed.target); #endif #if HAS_FAN Draw_Menu_Line(TUNE_CASE_FAN, ICON_FanSpeed); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_FAN), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_FAN), thermalManager.fan_speed[0]); #endif #if HAS_ZOFFSET_ITEM Draw_Menu_Line(TUNE_CASE_ZOFF, ICON_Zoffset); - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(TUNE_CASE_ZOFF), BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(TUNE_CASE_ZOFF), BABY_Z_VAR * 100); #endif } @@ -886,12 +886,12 @@ inline void Draw_Motion_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOTION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(MOTION_CASE_RATE), F("Feedrate")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(MOTION_CASE_ACCEL), GET_TEXT_F(MSG_ACCELERATION)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_RATE), F("Feedrate")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_ACCEL), GET_TEXT_F(MSG_ACCELERATION)); #if HAS_CLASSIC_JERK - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(MOTION_CASE_JERK), GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_JERK), GET_TEXT_F(MSG_JERK)); #endif - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(MOTION_CASE_STEPS), GET_TEXT_F(MSG_STEPS_PER_MM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_STEPS), GET_TEXT_F(MSG_STEPS_PER_MM)); #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Motion" draw_max_en(MBASE(MOTION_CASE_RATE)); draw_speed_en(27, MBASE(MOTION_CASE_RATE)); // "Max Speed" @@ -932,8 +932,8 @@ inline void Draw_Motion_Menu() { DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, F("is too high")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too high")); } } else { @@ -943,8 +943,8 @@ inline void Draw_Motion_Menu() { DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, F("Nozzle or Bed temperature")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, F("is too low")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too low")); } } } @@ -952,7 +952,7 @@ inline void Draw_Motion_Menu() { #endif inline void Draw_Popup_Bkgd_60() { - DWIN_Draw_Rectangle(1, Background_window, 14, 60, 258, 330); + DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 60, 258, 330); } #if HAS_HOTEND @@ -967,7 +967,7 @@ inline void Draw_Popup_Bkgd_60() { DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 20, 235, F("Nozzle is too cold")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 20, 235, F("Nozzle is too cold")); DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280); } } @@ -984,9 +984,9 @@ void Popup_Window_Resume() { DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 307); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 14) / 2, 115, F("Continue Print")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 22) / 2, 192, F("It looks like the last")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 22) / 2, 212, F("file was interrupted.")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 14) / 2, 115, F("Continue Print")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 192, F("It looks like the last")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 212, F("file was interrupted.")); DWIN_ICON_Show(ICON, ICON_Continue_E, 26, 307); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 307); } @@ -1002,8 +1002,8 @@ void Popup_Window_Home(const bool parking/*=false*/) { DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * (parking ? 7 : 10)) / 2, 230, parking ? F("Parking") : F("Homing XYZ")); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * (parking ? 7 : 10)) / 2, 230, parking ? F("Parking") : F("Homing XYZ")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); } } @@ -1018,8 +1018,8 @@ void Popup_Window_Home(const bool parking/*=false*/) { DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 13) / 2, 230, GET_TEXT_F(MSG_BED_LEVELING)); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 13) / 2, 230, GET_TEXT_F(MSG_BED_LEVELING)); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); } } @@ -1027,8 +1027,8 @@ void Popup_Window_Home(const bool parking/*=false*/) { void Draw_Select_Highlight(const bool sel) { HMI_flag.select_flag = sel; - const uint16_t c1 = sel ? Select_Color : Background_window, - c2 = sel ? Background_window : Select_Color; + const uint16_t c1 = sel ? Select_Color : Color_Bg_Window, + c2 = sel ? Color_Bg_Window : Select_Color; DWIN_Draw_Rectangle(0, c1, 25, 279, 126, 318); DWIN_Draw_Rectangle(0, c1, 24, 278, 127, 319); DWIN_Draw_Rectangle(0, c2, 145, 279, 246, 318); @@ -1046,8 +1046,8 @@ void Popup_window_PauseOrStop() { DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); } else { - if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 11) / 2, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); - else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (272 - 8 * 10) / 2, 150, GET_TEXT_F(MSG_STOP_PRINT)); + if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 11) / 2, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); + else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 10) / 2, 150, GET_TEXT_F(MSG_STOP_PRINT)); DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); } @@ -1070,21 +1070,21 @@ void Draw_Printing_Screen() { void Draw_Print_ProgressBar() { DWIN_ICON_Show(ICON, ICON_Bar, 15, 93); DWIN_Draw_Rectangle(1, BarFill_Color, 16 + Percentrecord * 240 / 100, 93, 256, 113); - DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Background_black, 2, 117, 133, Percentrecord); - DWIN_Draw_String(false, false, font8x16, Percent_Color, Background_black, 133, 133, F("%")); + DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Color_Bg_Black, 2, 117, 133, Percentrecord); + DWIN_Draw_String(false, false, font8x16, Percent_Color, Color_Bg_Black, 133, 133, F("%")); } void Draw_Print_ProgressElapsed() { duration_t elapsed = print_job_timer.duration(); // print timer - DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 42, 212, elapsed.value / 3600); - DWIN_Draw_String(false, false, font8x16, White, Background_black, 58, 212, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 66, 212, (elapsed.value % 3600) / 60); + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 42, 212, elapsed.value / 3600); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 58, 212, F(":")); + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 66, 212, (elapsed.value % 3600) / 60); } void Draw_Print_ProgressRemain() { - DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 176, 212, remain_time / 3600); - DWIN_Draw_String(false, false, font8x16, White, Background_black, 192, 212, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 200, 212, (remain_time % 3600) / 60); + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 176, 212, remain_time / 3600); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 192, 212, F(":")); + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 200, 212, (remain_time % 3600) / 60); } void Goto_PrintProcess() { @@ -1100,7 +1100,7 @@ void Goto_PrintProcess() { // Copy into filebuf string before entry char * const name = card.longest_filename(); const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2; - DWIN_Draw_String(false, false, font8x16, White, Background_black, npos, 60, name); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, npos, 60, name); DWIN_ICON_Show(ICON, ICON_PrintTime, 17, 193); DWIN_ICON_Show(ICON, ICON_RemainTime, 150, 191); @@ -1155,7 +1155,7 @@ void HMI_Move_X() { else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -1167,7 +1167,7 @@ void HMI_Move_X() { NOLESS(HMI_ValueStruct.Move_X_scale, (X_MIN_POS) * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_X_scale, (X_MAX_POS) * MINUNITMULT); current_position.x = HMI_ValueStruct.Move_X_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); DWIN_UpdateLCD(); } } @@ -1184,7 +1184,7 @@ void HMI_Move_Y() { else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -1196,7 +1196,7 @@ void HMI_Move_Y() { NOLESS(HMI_ValueStruct.Move_Y_scale, (Y_MIN_POS) * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_Y_scale, (Y_MAX_POS) * MINUNITMULT); current_position.y = HMI_ValueStruct.Move_Y_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); DWIN_UpdateLCD(); } } @@ -1213,7 +1213,7 @@ void HMI_Move_Z() { else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -1225,7 +1225,7 @@ void HMI_Move_Z() { NOLESS(HMI_ValueStruct.Move_Z_scale, Z_MIN_POS * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_Z_scale, Z_MAX_POS * MINUNITMULT); current_position.z = HMI_ValueStruct.Move_Z_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); DWIN_UpdateLCD(); } } @@ -1246,7 +1246,7 @@ void HMI_Move_Z() { checkkey = AxisMove; EncoderRate.enabled = false; last_E_scale = HMI_ValueStruct.Move_E_scale; - DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); if (!planner.is_full()) { planner.synchronize(); // Wait for planner moves to finish! planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); @@ -1290,11 +1290,11 @@ void HMI_Move_Z() { #endif if (HMI_ValueStruct.show_mode == -4) { checkkey = Prepare; - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); } else { checkkey = Tune; - DWIN_Draw_Signed_Float(font8x16, Background_black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); } DWIN_UpdateLCD(); return; @@ -1336,23 +1336,23 @@ void HMI_Move_Z() { EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { // temperature checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(temp_line), ui.material_preset[0].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), ui.material_preset[0].hotend_temp); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(temp_line), ui.material_preset[1].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), ui.material_preset[1].hotend_temp); return; } else { // tune checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0); return; @@ -1361,7 +1361,7 @@ void HMI_Move_Z() { NOMORE(HMI_ValueStruct.E_Temp, MAX_E_TEMP); NOLESS(HMI_ValueStruct.E_Temp, MIN_E_TEMP); // E_Temp value - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } } @@ -1389,23 +1389,23 @@ void HMI_Move_Z() { EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(bed_line), ui.material_preset[0].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), ui.material_preset[0].bed_temp); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(bed_line), ui.material_preset[1].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), ui.material_preset[1].bed_temp); return; } else { checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); return; @@ -1414,7 +1414,7 @@ void HMI_Move_Z() { NOMORE(HMI_ValueStruct.Bed_Temp, BED_MAX_TARGET); NOLESS(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP); // Bed_Temp value - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } } @@ -1443,23 +1443,23 @@ void HMI_Move_Z() { EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].fan_speed = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(fan_line), ui.material_preset[0].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), ui.material_preset[0].fan_speed); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(fan_line), ui.material_preset[1].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), ui.material_preset[1].fan_speed); return; } else { checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); return; @@ -1468,7 +1468,7 @@ void HMI_Move_Z() { NOMORE(HMI_ValueStruct.Fan_speed, FANON); NOLESS(HMI_ValueStruct.Fan_speed, FANOFF); // Fan_speed value - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } } @@ -1487,14 +1487,14 @@ void HMI_PrintSpeed() { checkkey = Tune; EncoderRate.enabled = false; feedrate_percentage = HMI_ValueStruct.print_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); return; } // print_speed limit NOMORE(HMI_ValueStruct.print_speed, MAX_PRINT_SPEED); NOLESS(HMI_ValueStruct.print_speed, MIN_PRINT_SPEED); // print_speed value - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); } } @@ -1512,7 +1512,7 @@ void HMI_MaxFeedspeedXYZE() { EncoderRate.enabled = false; if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) planner.set_max_feedrate(HMI_flag.feedspeed_axis, HMI_ValueStruct.Max_Feedspeed); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); return; } // MaxFeedspeed limit @@ -1520,7 +1520,7 @@ void HMI_MaxFeedspeedXYZE() { NOMORE(HMI_ValueStruct.Max_Feedspeed, default_max_feedrate[HMI_flag.feedspeed_axis] * 2); if (HMI_ValueStruct.Max_Feedspeed < MIN_MAXFEEDSPEED) HMI_ValueStruct.Max_Feedspeed = MIN_MAXFEEDSPEED; // MaxFeedspeed value - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); } } @@ -1538,7 +1538,7 @@ void HMI_MaxAccelerationXYZE() { #if HAS_HOTEND else if (HMI_flag.acc_axis == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); #endif - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); return; } // MaxAcceleration limit @@ -1546,7 +1546,7 @@ void HMI_MaxAccelerationXYZE() { NOMORE(HMI_ValueStruct.Max_Acceleration, default_max_acceleration[HMI_flag.acc_axis] * 2); if (HMI_ValueStruct.Max_Acceleration < MIN_MAXACCELERATION) HMI_ValueStruct.Max_Acceleration = MIN_MAXACCELERATION; // MaxAcceleration value - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); } } @@ -1564,7 +1564,7 @@ void HMI_MaxAccelerationXYZE() { EncoderRate.enabled = false; if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) planner.set_max_jerk(HMI_flag.step_axis, HMI_ValueStruct.Max_Jerk / 10); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); return; } // MaxJerk limit @@ -1572,7 +1572,7 @@ void HMI_MaxAccelerationXYZE() { NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXJERK) * MINUNITMULT); // MaxJerk value - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); } } @@ -1592,7 +1592,7 @@ void HMI_StepXYZE() { EncoderRate.enabled = false; if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) planner.settings.axis_steps_per_mm[HMI_flag.step_axis] = HMI_ValueStruct.Max_Step / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); return; } // Step limit @@ -1600,7 +1600,7 @@ void HMI_StepXYZE() { NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[HMI_flag.step_axis] * 2 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); // Step value - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); } } @@ -1619,15 +1619,15 @@ void update_variable() { if (checkkey == Tune) { #if HAS_HOTEND if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); #endif #if HAS_HEATED_BED if (last_temp_bed_target != thermalManager.temp_bed.target) - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); #endif #if HAS_FAN if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); last_fan_speed = thermalManager.fan_speed[0]; } #endif @@ -1637,15 +1637,15 @@ void update_variable() { if (checkkey == TemperatureID) { #if HAS_HOTEND if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TEMP_CASE_TEMP), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_TEMP), thermalManager.temp_hotend[0].target); #endif #if HAS_HEATED_BED if (last_temp_bed_target != thermalManager.temp_bed.target) - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TEMP_CASE_BED), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_BED), thermalManager.temp_bed.target); #endif #if HAS_FAN if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(TEMP_CASE_FAN), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_FAN), thermalManager.fan_speed[0]); last_fan_speed = thermalManager.fan_speed[0]; } #endif @@ -1654,32 +1654,32 @@ void update_variable() { /* Bottom temperature update */ #if HAS_HOTEND if (last_temp_hotend_current != thermalManager.temp_hotend[0].celsius) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); last_temp_hotend_current = thermalManager.temp_hotend[0].celsius; } if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); last_temp_hotend_target = thermalManager.temp_hotend[0].target; } #endif #if HAS_HEATED_BED if (last_temp_bed_current != thermalManager.temp_bed.celsius) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, thermalManager.temp_bed.celsius); last_temp_bed_current = thermalManager.temp_bed.celsius; } if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); last_temp_bed_target = thermalManager.temp_bed.target; } #endif static uint16_t last_speed = 0; if (last_speed != feedrate_percentage) { - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); last_speed = feedrate_percentage; } #if HAS_ZOFFSET_ITEM if (last_zoffset != BABY_Z_VAR) { - DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178 + STAT_CHR_W, 429, BABY_Z_VAR * 100); last_zoffset = BABY_Z_VAR; } #endif @@ -1869,16 +1869,16 @@ void HMI_StartFrame(const bool with_update) { Goto_MainMenu(); // Clear the bottom area of the screen - DWIN_Draw_Rectangle(1, Background_black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); // // Status Area // #if HAS_HOTEND DWIN_ICON_Show(ICON, ICON_HotendTemp, 13, 381); - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); #endif #if HOTENDS > 1 // DWIN_ICON_Show(ICON,ICON_HotendTemp, 13, 381); @@ -1886,18 +1886,18 @@ void HMI_StartFrame(const bool with_update) { #if HAS_HEATED_BED DWIN_ICON_Show(ICON, ICON_BedTemp, 158, 381); - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, thermalManager.temp_bed.celsius); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); #endif DWIN_ICON_Show(ICON, ICON_Speed, 13, 429); - DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); - DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 5 * STAT_CHR_W + 2, 429, F("%")); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 33 + 5 * STAT_CHR_W + 2, 429, F("%")); #if HAS_ZOFFSET_ITEM DWIN_ICON_Show(ICON, ICON_Zoffset, 158, 428); - DWIN_Draw_Signed_Float(STAT_FONT, Background_black, 2, 2, 178, 429, BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178, 429, BABY_Z_VAR * 100); #endif if (with_update) { @@ -1909,8 +1909,8 @@ void HMI_StartFrame(const bool with_update) { inline void Draw_Info_Menu() { Clear_Main_Window(); - DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); - DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); if (HMI_flag.language_chinese) { DWIN_Frame_TitleCopy(1, 30, 17, 57, 29); // "Info" @@ -1918,7 +1918,7 @@ inline void Draw_Info_Menu() { DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); DWIN_Frame_AreaCopy(1, 1, 164, 56, 176, 108, 175); DWIN_Frame_AreaCopy(1, 58, 164, 113, 176, 105, 248); - DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_C); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_C); } else { #ifdef USE_STRING_HEADINGS @@ -1930,7 +1930,7 @@ inline void Draw_Info_Menu() { DWIN_Frame_AreaCopy(1, 120, 150, 146, 161, 124, 102); DWIN_Frame_AreaCopy(1, 146, 151, 254, 161, 82, 175); DWIN_Frame_AreaCopy(1, 0, 165, 94, 175, 89, 248); - DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(CORP_WEBSITE_E) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_E); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_E) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_E); } Draw_Back_First(); @@ -2393,13 +2393,13 @@ void HMI_Prepare() { select_axis.reset(); Draw_Move_Menu(); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), current_position.x * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), current_position.x * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT); #if HAS_HOTEND queue.inject_P(PSTR("G92 E0")); current_position.e = HMI_ValueStruct.Move_E_scale = 0; - DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), 0); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0); #endif break; case PREPARE_CASE_DISA: // Disable steppers @@ -2479,17 +2479,17 @@ void Draw_Temperature_Menu() { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); #endif #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); #endif #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); #endif #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_PLA), F("PLA Preheat Settings")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(TEMP_CASE_ABS), F("ABS Preheat Settings")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_PLA), F("PLA Preheat Settings")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_ABS), F("ABS Preheat Settings")); #endif #else DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "Temperature" @@ -2523,15 +2523,15 @@ void Draw_Temperature_Menu() { #define _TMENU_ICON(N) Draw_Menu_Line(++i, ICON_SetEndTemp + (N) - 1) #if HAS_HOTEND _TMENU_ICON(TEMP_CASE_TEMP); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_hotend[0].target); #endif #if HAS_HEATED_BED _TMENU_ICON(TEMP_CASE_BED); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_bed.target); #endif #if HAS_FAN _TMENU_ICON(TEMP_CASE_FAN); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.fan_speed[0]); #endif #if HAS_HOTEND // PLA/ABS items have submenus @@ -2651,10 +2651,10 @@ void HMI_AxisMove() { HMI_flag.ETempTooLow_flag = false; current_position.e = HMI_ValueStruct.Move_E_scale = 0; Draw_Move_Menu(); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - DWIN_Draw_Signed_Float(font8x16, Background_black, 3, 1, 216, MBASE(4), 0); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0); DWIN_UpdateLCD(); } return; @@ -2679,19 +2679,19 @@ void HMI_AxisMove() { case 1: // X axis move checkkey = Move_X; HMI_ValueStruct.Move_X_scale = current_position.x * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); EncoderRate.enabled = true; break; case 2: // Y axis move checkkey = Move_Y; HMI_ValueStruct.Move_Y_scale = current_position.y * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); EncoderRate.enabled = true; break; case 3: // Z axis move checkkey = Move_Z; HMI_ValueStruct.Move_Z_scale = current_position.z * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); EncoderRate.enabled = true; break; #if HAS_HOTEND @@ -2740,7 +2740,7 @@ void HMI_Temperature() { case TEMP_CASE_TEMP: // Nozzle temperature checkkey = ETemp; HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); EncoderRate.enabled = true; break; #endif @@ -2748,7 +2748,7 @@ void HMI_Temperature() { case TEMP_CASE_BED: // Bed temperature checkkey = BedTemp; HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); EncoderRate.enabled = true; break; #endif @@ -2756,7 +2756,7 @@ void HMI_Temperature() { case TEMP_CASE_FAN: // Fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); EncoderRate.enabled = true; break; #endif @@ -2787,15 +2787,15 @@ void HMI_Temperature() { else { #ifdef USE_STRING_HEADINGS Draw_Title("PLA Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); #endif #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); #endif #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); #endif #else DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" @@ -2821,14 +2821,14 @@ void HMI_Temperature() { uint8_t i = 0; Draw_Menu_Line(++i, ICON_SetEndTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[0].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].hotend_temp); #if HAS_HEATED_BED Draw_Menu_Line(++i, ICON_SetBedTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[0].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].bed_temp); #endif #if HAS_FAN Draw_Menu_Line(++i, ICON_FanSpeed); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[0].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].fan_speed); #endif #if ENABLED(EEPROM_SETTINGS) Draw_Menu_Line(++i, ICON_WriteEEPROM); @@ -2863,15 +2863,15 @@ void HMI_Temperature() { else { #ifdef USE_STRING_HEADINGS Draw_Title("ABS Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); #endif #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); #endif #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); #endif #else DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "ABS Settings" @@ -2898,14 +2898,14 @@ void HMI_Temperature() { uint8_t i = 0; Draw_Menu_Line(++i, ICON_SetEndTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[1].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].hotend_temp); #if HAS_HEATED_BED Draw_Menu_Line(++i, ICON_SetBedTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[1].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].bed_temp); #endif #if HAS_FAN Draw_Menu_Line(++i, ICON_FanSpeed); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(i), ui.material_preset[1].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].fan_speed); #endif #if ENABLED(EEPROM_SETTINGS) Draw_Menu_Line(++i, ICON_WriteEEPROM); @@ -2943,11 +2943,11 @@ inline void Draw_Max_Speed_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Max Feedrate X")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Max Feedrate Y")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Max Feedrate Z")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Feedrate X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Feedrate Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Feedrate Z")); #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Max Feedrate E")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Feedrate E")); #endif #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Max Speed (mm/s)" @@ -2973,11 +2973,11 @@ inline void Draw_Max_Speed_Menu() { Draw_Back_First(); LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedX + i); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(1), planner.settings.max_feedrate_mm_s[X_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(2), planner.settings.max_feedrate_mm_s[Y_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(3), planner.settings.max_feedrate_mm_s[Z_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(1), planner.settings.max_feedrate_mm_s[X_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(2), planner.settings.max_feedrate_mm_s[Y_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(3), planner.settings.max_feedrate_mm_s[Z_AXIS]); #if HAS_HOTEND - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(4), planner.settings.max_feedrate_mm_s[E_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(4), planner.settings.max_feedrate_mm_s[E_AXIS]); #endif } @@ -3005,11 +3005,11 @@ inline void Draw_Max_Accel_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Max Accel X")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Max Accel Y")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Max Accel Z")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Accel X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Accel Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Accel Z")); #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Max Accel E")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Accel E")); #endif #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Acceleration" @@ -3024,11 +3024,11 @@ inline void Draw_Max_Accel_Menu() { Draw_Back_First(); LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxAccX + i); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(1), planner.settings.max_acceleration_mm_per_s2[X_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(2), planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(3), planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(1), planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(2), planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(3), planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); #if HAS_HOTEND - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(4), planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(4), planner.settings.max_acceleration_mm_per_s2[E_AXIS]); #endif } @@ -3060,11 +3060,11 @@ inline void Draw_Max_Jerk_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Max Jerk X")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Max Jerk Y")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Max Jerk Z")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Jerk X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Jerk Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Jerk Z")); #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Max Jerk E")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Jerk E")); #endif #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk" @@ -3094,11 +3094,11 @@ inline void Draw_Max_Jerk_Menu() { Draw_Back_First(); LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); #if HAS_HOTEND - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); #endif } @@ -3122,11 +3122,11 @@ inline void Draw_Steps_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(1), F("Steps/mm X")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(2), F("Steps/mm Y")); - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(3), F("Steps/mm Z")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Steps/mm X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Steps/mm Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Steps/mm Z")); #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, White, Background_black, LBLX, MBASE(4), F("Steps/mm E")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Steps/mm E")); #endif #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Steps per mm" @@ -3141,11 +3141,11 @@ inline void Draw_Steps_Menu() { Draw_Back_First(); LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_StepX + i); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); #if HAS_HOTEND - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); #endif } @@ -3253,14 +3253,14 @@ void HMI_Tune() { case TUNE_CASE_SPEED: // Print speed checkkey = PrintSpeed; HMI_ValueStruct.print_speed = feedrate_percentage; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), feedrate_percentage); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), feedrate_percentage); EncoderRate.enabled = true; break; #if HAS_HOTEND case TUNE_CASE_TEMP: // Nozzle temp checkkey = ETemp; HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); EncoderRate.enabled = true; break; #endif @@ -3268,7 +3268,7 @@ void HMI_Tune() { case TUNE_CASE_BED: // Bed temp checkkey = BedTemp; HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); EncoderRate.enabled = true; break; #endif @@ -3276,7 +3276,7 @@ void HMI_Tune() { case TUNE_CASE_FAN: // Fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); EncoderRate.enabled = true; break; #endif @@ -3326,7 +3326,7 @@ void HMI_Tune() { case PREHEAT_CASE_TEMP: // Nozzle temperature checkkey = ETemp; HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[0].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[0].hotend_temp); EncoderRate.enabled = true; break; #endif @@ -3334,7 +3334,7 @@ void HMI_Tune() { case PREHEAT_CASE_BED: // Bed temperature checkkey = BedTemp; HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[0].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[0].bed_temp); EncoderRate.enabled = true; break; #endif @@ -3342,7 +3342,7 @@ void HMI_Tune() { case PREHEAT_CASE_FAN: // Fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[0].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[0].fan_speed); EncoderRate.enabled = true; break; #endif @@ -3382,7 +3382,7 @@ void HMI_Tune() { case PREHEAT_CASE_TEMP: // Set nozzle temperature checkkey = ETemp; HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[1].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[1].hotend_temp); EncoderRate.enabled = true; break; #endif @@ -3390,7 +3390,7 @@ void HMI_Tune() { case PREHEAT_CASE_BED: // Set bed temperature checkkey = BedTemp; HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[1].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[1].bed_temp); EncoderRate.enabled = true; break; #endif @@ -3398,7 +3398,7 @@ void HMI_Tune() { case PREHEAT_CASE_FAN: // Set fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[1].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[1].fan_speed); EncoderRate.enabled = true; break; #endif @@ -3433,7 +3433,7 @@ void HMI_MaxSpeed() { checkkey = MaxSpeed_value; HMI_flag.feedspeed_axis = AxisEnum(select_speed.now - 1); HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[HMI_flag.feedspeed_axis]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); EncoderRate.enabled = true; } else { // Back @@ -3462,7 +3462,7 @@ void HMI_MaxAcceleration() { checkkey = MaxAcceleration_value; HMI_flag.acc_axis = AxisEnum(select_acc.now - 1); HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[HMI_flag.acc_axis]; - DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); EncoderRate.enabled = true; } else { // Back @@ -3492,7 +3492,7 @@ void HMI_MaxAcceleration() { checkkey = MaxJerk_value; HMI_flag.jerk_axis = AxisEnum(select_jerk.now - 1); HMI_ValueStruct.Max_Jerk = planner.max_jerk[HMI_flag.jerk_axis] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); EncoderRate.enabled = true; } else { // Back @@ -3522,7 +3522,7 @@ void HMI_Step() { checkkey = Step_value; HMI_flag.step_axis = AxisEnum(select_step.now - 1); HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[HMI_flag.step_axis] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); EncoderRate.enabled = true; } else { // Back @@ -3539,7 +3539,7 @@ void HMI_Init() { for (uint16_t t = 0; t <= 100; t += 2) { DWIN_ICON_Show(ICON, ICON_Bar, 15, 260); - DWIN_Draw_Rectangle(1, Background_black, 15 + t * 242 / 100, 260, 257, 280); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 15 + t * 242 / 100, 260, 257, 280); DWIN_UpdateLCD(); delay(20); } @@ -3577,7 +3577,7 @@ void EachMomentUpdate() { Draw_Print_ProgressBar(); // show print done confirm - DWIN_Draw_Rectangle(1, Background_black, 0, 250, DWIN_WIDTH - 1, STATUS_Y); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 250, DWIN_WIDTH - 1, STATUS_Y); DWIN_ICON_Show(ICON, HMI_flag.language_chinese ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); } else if (HMI_flag.pause_flag != printingIsPaused()) { @@ -3654,7 +3654,7 @@ void EachMomentUpdate() { if (!recovery.valid()) return recovery.purge(); auto draw_first_option = [](const bool sel) { - const uint16_t c1 = sel ? Background_window : Select_Color; + const uint16_t c1 = sel ? Color_Bg_Window : Select_Color; DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345); DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346); }; @@ -3662,7 +3662,7 @@ void EachMomentUpdate() { auto update_selection = [&](const bool sel) { HMI_flag.select_flag = sel; draw_first_option(sel); - const uint16_t c2 = sel ? Select_Color : Background_window; + const uint16_t c2 = sel ? Select_Color : Color_Bg_Window; DWIN_Draw_Rectangle(0, c2, 145, 306, 246, 345); DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346); }; @@ -3679,7 +3679,7 @@ void EachMomentUpdate() { draw_first_option(false); char * const name = card.longest_filename(); const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, npos, 252, name); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name); DWIN_UpdateLCD(); break; } diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index fedb87afdd..7b759d9cbf 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -214,16 +214,16 @@ enum processID : uint8_t { #define font32x64 0x09 // Color -#define White 0xFFFF -#define Background_window 0x31E8 // Popup background color -#define Background_blue 0x1125 // Dark blue background color -#define Background_black 0x0841 // black background color -#define Font_window 0xD6BA // Popup font background color +#define Color_White 0xFFFF +#define Color_Bg_Window 0x31E8 // Popup background color +#define Color_Bg_Blue 0x1125 // Dark blue background color +#define Color_Bg_Black 0x0841 // Black background color +#define Popup_Text_Color 0xD6BA // Popup font background color #define Line_Color 0x3A6A // Split line color -#define Rectangle_Color 0xEE2F // blue square cursor color -#define Percent_Color 0xFE29 // percentage color -#define BarFill_Color 0x10E4 // fill color of progress bar -#define Select_Color 0x33BB // selected color +#define Rectangle_Color 0xEE2F // Blue square cursor color +#define Percent_Color 0xFE29 // Percentage color +#define BarFill_Color 0x10E4 // Fill color of progress bar +#define Select_Color 0x33BB // Selected color extern uint8_t checkkey; extern float zprobe_zoffset; From a50633d8e0e84bace52d35fabd4e222fcb732a79 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 19 Sep 2020 10:20:15 -0400 Subject: [PATCH 0256/1370] Fix compile for Taz Pro (#19424) --- .../ftdi_eve_touch_ui/screens/boot_screen.cpp | 2 +- .../screens/leveling_menu.cpp | 3 -- .../lib/ftdi_eve_touch_ui/screens/screens.h | 4 ++ .../theme/bootscreen_logo_portrait.h | 42 +++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp index 2c2c0c6a18..4ce8f608f1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -32,7 +32,7 @@ #ifdef SHOW_CUSTOM_BOOTSCREEN #ifdef TOUCH_UI_PORTRAIT - #include "../theme/_bootscreen_portrait.h" + #include "../theme/bootscreen_logo_portrait.h" #else #include "../theme/_bootscreen_landscape.h" #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index 2eab27c608..74ab332fb4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -94,9 +94,6 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); break; case 2: - #ifndef BED_LEVELING_COMMANDS - #define BED_LEVELING_COMMANDS "G29" - #endif #if HAS_MESH BedMeshScreen::startMeshProbe(); #else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index b425c4fa45..2108cff8df 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -27,6 +27,10 @@ #include "../theme/theme.h" #include "string_format.h" +#ifndef BED_LEVELING_COMMANDS + #define BED_LEVELING_COMMANDS "G29" +#endif + extern tiny_timer_t refresh_timer; /********************************* DL CACHE SLOTS ******************************/ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h new file mode 100644 index 0000000000..6ea317dbc3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +/** + * This file was auto-generated using "svg2cpp.pl" + * + * The encoding consists of x,y pairs with the min and max scaled to + * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the + * start of a new closed path. + */ + +#pragma once + +constexpr float x_min = 0.000000, x_max = 272.000000, + y_min = 0.000000, y_max = 480.000000; + +const PROGMEM uint16_t logo_green[] = {0x8048, 0x46D9, 0x27BC, 0x9DBA, 0xD8D3, 0x9DBA}; +const PROGMEM uint16_t logo_mark[] = {0xDB9F, 0xAC0C, 0xDA6F, 0xAC2D, 0xD970, 0xAC91, 0xD8C0, 0xAD23, 0xD885, 0xADCF, 0xD8C0, 0xAE7A, 0xD970, 0xAF0C, 0xDA6F, 0xAF6F, 0xDB9F, 0xAF8F, 0xDCCE, 0xAF6F, 0xDDD0, 0xAF0C, 0xDE7D, 0xAE7B, 0xDEB9, 0xADCF, 0xDE7D, 0xAD22, 0xDDD0, 0xAC91, 0xDCCE, 0xAC2D, 0xFFFF, 0xDB9F, 0xABC3, 0xDCFE, 0xABEA, 0xDE28, 0xAC5E, 0xDEF1, 0xAD06, 0xDF36, 0xADCF, 0xDEF1, 0xAE95, 0xDE28, 0xAF3E, 0xDCFE, 0xAFB1, 0xDB9F, 0xAFD8, 0xDA3F, 0xAFB1, 0xD916, 0xAF3E, 0xD849, 0xAE95, 0xD808, 0xADCF, 0xD849, 0xAD06, 0xD916, 0xAC5E, 0xDA3F, 0xABEA, 0xFFFF, 0xDB7D, 0xACE6, 0xDAE4, 0xACE6, 0xDAE4, 0xADA9, 0xDB7D, 0xADA9, 0xDC3B, 0xAD94, 0xDC71, 0xAD48, 0xDC3B, 0xACFD, 0xFFFF, 0xDB85, 0xAC9E, 0xDCCB, 0xACC8, 0xDD37, 0xAD47, 0xDCF6, 0xADAC, 0xDC3E, 0xADDE, 0xDC85, 0xADFF, 0xDCE8, 0xAE4E, 0xDD92, 0xAEEA, 0xDCBD, 0xAEEA, 0xDC1E, 0xAE58, 0xDBA7, 0xAE03, 0xDB36, 0xADEF, 0xDAE4, 0xADEF, 0xDAE4, 0xAEEA, 0xDA26, 0xAEEA, 0xDA26, 0xAC9E}; +const PROGMEM uint16_t logo_type[] = {0xD8D5, 0xA520, 0xD8A5, 0xA563, 0xD82E, 0xA57F, 0xD348, 0xA57F, 0xD2D1, 0xA598, 0xD2A0, 0xA5D9, 0xD2A0, 0xAF7A, 0xD274, 0xAFBE, 0xD202, 0xAFDA, 0xCD37, 0xAFDA, 0xCCBF, 0xAFBE, 0xCC8F, 0xAF7A, 0xCC8F, 0xA5D9, 0xCC63, 0xA598, 0xCBF1, 0xA57F, 0xC70B, 0xA57F, 0xC694, 0xA563, 0xC664, 0xA520, 0xC664, 0xA28C, 0xC70B, 0xA22C, 0xD82E, 0xA22C, 0xD8A5, 0xA248, 0xD8D5, 0xA28C, 0xFFFF, 0xB138, 0xAC8C, 0xB952, 0xAC8C, 0xB952, 0xA57F, 0xB138, 0xA57F, 0xFFFF, 0xBF27, 0xA421, 0xBF57, 0xA476, 0xBF6D, 0xA4D0, 0xBF6D, 0xAD36, 0xBF57, 0xAD90, 0xBF27, 0xADE6, 0xBBFA, 0xAFB2, 0xBB60, 0xAFCF, 0xBABD, 0xAFDA, 0xAFCE, 0xAFDA, 0xAF30, 0xAFCF, 0xAE9A, 0xAFB2, 0xAB6E, 0xADE6, 0xAB39, 0xAD90, 0xAB28, 0xAD36, 0xAB28, 0xA4D0, 0xAB39, 0xA476, 0xAB6E, 0xA421, 0xAE9A, 0xA255, 0xAF30, 0xA239, 0xAFCE, 0xA22C, 0xBABD, 0xA22C, 0xBB60, 0xA239, 0xBBFA, 0xA255, 0xFFFF, 0x93A4, 0xACDC, 0x9CEA, 0xACDC, 0x9CEA, 0xAA34, 0x93A4, 0xAA34, 0x93A4, 0xACDC, 0xFFFF, 0x93A4, 0xA796, 0x9CEA, 0xA796, 0x9CEA, 0xA525, 0x93A4, 0xA525, 0xFFFF, 0xA227, 0xA421, 0xA258, 0xA478, 0xA26E, 0xA4D5, 0xA26E, 0xA700, 0xA24F, 0xA757, 0xA204, 0xA7A5, 0xA089, 0xA8B8, 0xA061, 0xA903, 0xA092, 0xA949, 0xA1FC, 0xAA43, 0xA24B, 0xAA91, 0xA26E, 0xAAE8, 0xA26E, 0xAD36, 0xA258, 0xAD90, 0xA227, 0xADE6, 0x9EFC, 0xAFB2, 0x9E61, 0xAFCF, 0x9DBE, 0xAFDA, 0x8ED0, 0xAFDA, 0x8E28, 0xAF7A, 0x8E28, 0xA28C, 0x8E59, 0xA248, 0x8ED0, 0xA22C, 0x9DBE, 0xA22C, 0x9E61, 0xA239, 0x9EFC, 0xA255, 0xFFFF, 0x853C, 0xA502, 0x8517, 0xA557, 0x84C9, 0xA5A2, 0x7994, 0xACC8, 0x8494, 0xACC8, 0x850A, 0xACE4, 0x853C, 0xAD27, 0x853C, 0xAF7A, 0x850A, 0xAFBE, 0x8494, 0xAFDA, 0x7371, 0xAFDA, 0x72C9, 0xAF7A, 0x72C9, 0xAD09, 0x72E8, 0xACB2, 0x7333, 0xAC64, 0x7EA5, 0xA53E, 0x73A6, 0xA53E, 0x732F, 0xA522, 0x72FE, 0xA4DF, 0x72FE, 0xA28C, 0x732F, 0xA248, 0x73A6, 0xA22C, 0x8494, 0xA22C, 0x850A, 0xA248, 0x853C, 0xA28C, 0xFFFF, 0x6B68, 0xAC87, 0x6BDB, 0xACA3, 0x6C07, 0xACE6, 0x6C07, 0xAF7A, 0x6BDB, 0xAFBE, 0x6B68, 0xAFDA, 0x5C84, 0xAFDA, 0x5BDC, 0xAF7A, 0x5BDC, 0xA28C, 0x5C84, 0xA22C, 0x6146, 0xA22C, 0x61EE, 0xA28C, 0x61EE, 0xAC2D, 0x621E, 0xAC6E, 0x6295, 0xAC87, 0xFFFF, 0x52C6, 0xA248, 0x52F7, 0xA28C, 0x52F7, 0xAD45, 0x52EE, 0xAD45, 0x52DC, 0xAD9B, 0x52B1, 0xADE6, 0x4F85, 0xAFB2, 0x4EEA, 0xAFCF, 0x4E47, 0xAFDA, 0x4359, 0xAFDA, 0x42BA, 0xAFCF, 0x4224, 0xAFB2, 0x3EF8, 0xADE6, 0x3EC3, 0xAD90, 0x3EB2, 0xAD36, 0x3EB2, 0xA28C, 0x3EE2, 0xA248, 0x3F5A, 0xA22C, 0x441B, 0xA22C, 0x4493, 0xA248, 0x44C3, 0xA28C, 0x44C3, 0xAC2D, 0x44F4, 0xAC71, 0x456B, 0xAC8C, 0x4C3E, 0xAC8C, 0x4CB1, 0xAC71, 0x4CDD, 0xAC2D, 0x4CDD, 0xA28C, 0x4D0D, 0xA248, 0x4D85, 0xA22C, 0x524F, 0xA22C, 0xFFFF, 0x3748, 0xAC87, 0x37BB, 0xACA3, 0x37E7, 0xACE6, 0x37E7, 0xAF7A, 0x37BB, 0xAFBE, 0x3748, 0xAFDA, 0x2864, 0xAFDA, 0x27BC, 0xAF7A, 0x27BC, 0xA28C, 0x2864, 0xA22C, 0x2D26, 0xA22C, 0x2DCD, 0xA28C, 0x2DCD, 0xAC2D, 0x2DFE, 0xAC6E, 0x2E75, 0xAC87}; +const PROGMEM uint16_t logo_black[] = {0x8048, 0x527A, 0x8ADE, 0x5CDE, 0x75B2, 0x5CDE, 0xFFFF, 0x8048, 0x4FF6, 0x71D9, 0x5E20, 0x8EB8, 0x5E20, 0x8048, 0x4FF6, 0xFFFF, 0x4436, 0x8D8E, 0x4ECC, 0x97F2, 0x39A0, 0x97F2, 0xFFFF, 0x4436, 0x8B0A, 0x35C8, 0x9934, 0x52A5, 0x9934, 0xFFFF, 0xBC3D, 0x8D8E, 0xC6D4, 0x97F2, 0xB1A7, 0x97F2, 0xFFFF, 0xBC3D, 0x8B0A, 0xADCE, 0x9934, 0xCAAC, 0x9934, 0xFFFF, 0x8045, 0x6778, 0x7F6D, 0x67A7, 0x7E9D, 0x689F, 0x7D49, 0x69EA, 0x7B41, 0x6A81, 0x7908, 0x6A3A, 0x7726, 0x692C, 0x75EA, 0x685A, 0x7505, 0x684C, 0x744A, 0x6899, 0x73F5, 0x69A8, 0x7345, 0x6B1A, 0x7193, 0x6BF8, 0x6F4D, 0x6C08, 0x6CFA, 0x6B45, 0x6B61, 0x6AA3, 0x6A7D, 0x6AB7, 0x69EB, 0x6B1D, 0x6A1D, 0x6C34, 0x6A22, 0x6DB8, 0x68E5, 0x6ECD, 0x66B9, 0x6F33, 0x6417, 0x6EC5, 0x6239, 0x6E5C, 0x6165, 0x6E91, 0x6108, 0x6F09, 0x61C1, 0x7018, 0x6282, 0x7196, 0x61CF, 0x72D1, 0x5FE5, 0x7384, 0x5D38, 0x7380, 0x5B4B, 0x7365, 0x5A97, 0x73B7, 0x5A74, 0x7438, 0x5B90, 0x7520, 0x5CE8, 0x7671, 0x5CCB, 0x77BB, 0x5B43, 0x78B0, 0x58B6, 0x7914, 0x56D7, 0x7944, 0x564F, 0x79AD, 0x5667, 0x7A2F, 0x57DA, 0x7AE3, 0x59B7, 0x7BF3, 0x5A31, 0x7D37, 0x5927, 0x7E5D, 0x56E0, 0x7F1E, 0x5529, 0x7F93, 0x54D7, 0x800D, 0x5529, 0x8087, 0x56E0, 0x80FD, 0x5926, 0x81BE, 0x5A30, 0x82E5, 0x59B5, 0x8428, 0x57D8, 0x8538, 0x5664, 0x85EB, 0x564C, 0x866D, 0x56D4, 0x86D7, 0x58B2, 0x8708, 0x5B3F, 0x876B, 0x5CC6, 0x8860, 0x5CE3, 0x89AA, 0x5B8B, 0x8AFC, 0x5A6D, 0x8BE3, 0x5A91, 0x8C65, 0x5B44, 0x8CB7, 0x5D32, 0x8C9C, 0x5FDE, 0x8C98, 0x61C7, 0x8D4B, 0x627A, 0x8E87, 0x61B9, 0x9005, 0x60FF, 0x9114, 0x615C, 0x918B, 0x622F, 0x91C0, 0x640E, 0x9158, 0x66B0, 0x90EA, 0x68DC, 0x9150, 0x6A18, 0x9266, 0x6A12, 0x93E9, 0x69E0, 0x9501, 0x6A72, 0x9567, 0x6B56, 0x957B, 0x6CEE, 0x94D9, 0x6F43, 0x9417, 0x7188, 0x9428, 0x7339, 0x9506, 0x73E9, 0x9678, 0x743E, 0x9787, 0x74F8, 0x97D4, 0x75DD, 0x97C6, 0x771A, 0x96F4, 0x78FB, 0x95E6, 0x7B35, 0x95A1, 0x7D3D, 0x9637, 0x7E91, 0x9782, 0x7F60, 0x987A, 0x8038, 0x98AA, 0x810F, 0x987B, 0x81DF, 0x9782, 0x8333, 0x9638, 0x853B, 0x95A1, 0x8775, 0x95E7, 0x8956, 0x96F5, 0x8A92, 0x97C8, 0x8B78, 0x97D6, 0x8C32, 0x9789, 0x8C88, 0x967A, 0x8D37, 0x9508, 0x8EE9, 0x942A, 0x912F, 0x941A, 0x9383, 0x94DD, 0x951B, 0x957F, 0x95FF, 0x956B, 0x9690, 0x9505, 0x9660, 0x93ED, 0x9659, 0x926A, 0x9797, 0x9154, 0x99C3, 0x90EF, 0x9C65, 0x915D, 0x9E43, 0x91C6, 0x9F17, 0x9191, 0x9F74, 0x9119, 0x9EBB, 0x900A, 0x9DFA, 0x8E8C, 0x9EAE, 0x8D51, 0xA098, 0x8C9E, 0xA345, 0x8CA2, 0xA531, 0x8CBE, 0xA5E5, 0x8C6B, 0xA609, 0x8BEA, 0xA4EC, 0x8B02, 0xA394, 0x89B1, 0xA3B2, 0x8867, 0xA53A, 0x8772, 0xA7C6, 0x870E, 0xA9A5, 0x86DE, 0xAA2D, 0x8675, 0xAA14, 0x85F2, 0xA8A2, 0x853F, 0xA6C5, 0x842E, 0xA64B, 0x82EB, 0xA755, 0x81C5, 0xA99C, 0x8104, 0xAB52, 0x808F, 0xABA6, 0x8015, 0xAB52, 0x7F9B, 0xA99C, 0x7F25, 0xA755, 0x7E64, 0xA64C, 0x7D3E, 0xA6C7, 0x7BFA, 0xA8A5, 0x7AEA, 0xAA18, 0x7A37, 0xAA31, 0x79B5, 0xA9A9, 0x794B, 0xA7CA, 0x791B, 0xA53C, 0x78B7, 0xA3B6, 0x77C1, 0xA39A, 0x7677, 0xA4F1, 0x7526, 0xA60E, 0x743F, 0xA5EB, 0x73BD, 0xA538, 0x736B, 0xA34B, 0x7387, 0xA09E, 0x738A, 0x9EB4, 0x72D6, 0x9E02, 0x719B, 0x9EC4, 0x701D, 0x9F7E, 0x6F0E, 0x9F20, 0x6E96, 0x9E4E, 0x6E61, 0x9C6E, 0x6ECA, 0x99CB, 0x6F37, 0x97A0, 0x6ED2, 0x9664, 0x6DBC, 0x966B, 0x6C38, 0x969B, 0x6B21, 0x960B, 0x6ABB, 0x9526, 0x6AA6, 0x938E, 0x6B48, 0x913B, 0x6C0B, 0x8EF4, 0x6BFA, 0x8D43, 0x6B1D, 0x8C94, 0x69AA, 0x8C3F, 0x689B, 0x8B85, 0x684D, 0x8A9E, 0x685C, 0x8962, 0x692E, 0x8781, 0x6A3C, 0x8546, 0x6A82, 0x833F, 0x69EA, 0x81EC, 0x68A0, 0x811C, 0x67A8, 0x8045, 0x6778, 0x8045, 0x6778, 0xFFFF, 0x8047, 0x6AA0, 0x81C8, 0x6AFA, 0x8268, 0x6BD5, 0x81C8, 0x6CAF, 0x8047, 0x6D09, 0x7EC6, 0x6CAF, 0x7E27, 0x6BD5, 0x7EC6, 0x6AFA, 0x8047, 0x6AA0, 0x8047, 0x6AA0, 0xFFFF, 0x803E, 0x6E19, 0x867C, 0x6E71, 0x8C65, 0x6F75, 0x91D7, 0x711B, 0x96AD, 0x735B, 0x9ABC, 0x762C, 0x9DA2, 0x794C, 0x9F5F, 0x7CA2, 0x9FF3, 0x8011, 0x9F5E, 0x8380, 0x9DA1, 0x86D5, 0x9ABA, 0x89F6, 0x96AB, 0x8CC7, 0x91D6, 0x8F08, 0x8C65, 0x90AD, 0x867C, 0x91B1, 0x803D, 0x9209, 0x7A00, 0x91B1, 0x7416, 0x90AD, 0x6EA6, 0x8F08, 0x69D0, 0x8CC7, 0x65D6, 0x8A0A, 0x62EE, 0x86F4, 0x6125, 0x839B, 0x6089, 0x8011, 0x6124, 0x7C88, 0x62ED, 0x792E, 0x65D6, 0x7619, 0x69CF, 0x735B, 0x6EA5, 0x711B, 0x7416, 0x6F75, 0x7A00, 0x6E71, 0x803E, 0x6E19, 0x803E, 0x6E19, 0xFFFF, 0x803E, 0x6EB2, 0x7A5A, 0x6F04, 0x74B2, 0x6FF8, 0x6F4B, 0x7194, 0x6A8F, 0x73C7, 0x66A2, 0x7681, 0x63D5, 0x7986, 0x6226, 0x7CBF, 0x6197, 0x8011, 0x6226, 0x8363, 0x63D5, 0x869C, 0x66A2, 0x89A2, 0x6A8F, 0x8C5B, 0x6F4B, 0x8E8E, 0x74B2, 0x902B, 0x7A5A, 0x911E, 0x803D, 0x9170, 0x803E, 0x9170, 0x8621, 0x911E, 0x8BCA, 0x902B, 0x9130, 0x8E8E, 0x95ED, 0x8C5B, 0x99CF, 0x89AB, 0x9CA7, 0x869C, 0x9E55, 0x8367, 0x9EE5, 0x8011, 0x9E55, 0x7CBB, 0x9CA7, 0x7986, 0x99CF, 0x7677, 0x95ED, 0x73C7, 0x9130, 0x7194, 0x8BCA, 0x6FF8, 0x8621, 0x6F04, 0x803E, 0x6EB2, 0x803E, 0x6EB2, 0xFFFF, 0x80BC, 0x6FD7, 0x80AF, 0x71D8, 0x7FC8, 0x71D9, 0x7FB7, 0x6FD8, 0x80BC, 0x6FD7, 0x80BC, 0x6FD7, 0xFFFF, 0x83CB, 0x6FF6, 0x84CD, 0x700B, 0x843E, 0x7206, 0x835B, 0x71F4, 0xFFFF, 0x7CA9, 0x6FF8, 0x7D1A, 0x71F5, 0x7C37, 0x7207, 0x7BA7, 0x700D, 0x7CA9, 0x6FF8, 0x7CA9, 0x6FF8, 0xFFFF, 0x87CD, 0x7068, 0x88C7, 0x7092, 0x87BA, 0x727C, 0x86DF, 0x7258, 0xFFFF, 0x78A8, 0x706B, 0x7997, 0x725A, 0x78BA, 0x727E, 0x77AD, 0x7095, 0x78A8, 0x706B, 0x78A8, 0x706B, 0xFFFF, 0x6700, 0x708A, 0x6880, 0x70E5, 0x6920, 0x71BF, 0x6880, 0x7299, 0x66FF, 0x72F4, 0x657F, 0x7299, 0x64E0, 0x71BF, 0x657F, 0x70E4, 0x6700, 0x708A, 0x6700, 0x708A, 0xFFFF, 0x998D, 0x708C, 0x9B0E, 0x70E6, 0x9BAE, 0x71C0, 0x9B0E, 0x729B, 0x998D, 0x72F6, 0x980D, 0x729B, 0x976E, 0x71C1, 0x980D, 0x70E7, 0x998D, 0x708C, 0x998D, 0x708C, 0xFFFF, 0x8BA7, 0x712C, 0x8C95, 0x716A, 0x8B10, 0x7339, 0x8A3F, 0x7303, 0x8BA7, 0x712C, 0xFFFF, 0x74CE, 0x712F, 0x7635, 0x7307, 0x7564, 0x733C, 0x73DE, 0x716D, 0x74CE, 0x712F, 0x74CE, 0x712F, 0xFFFF, 0x8F47, 0x723F, 0x9023, 0x728E, 0x8E2D, 0x743A, 0x8D6B, 0x73F4, 0x8F47, 0x723F, 0xFFFF, 0x712D, 0x7242, 0x7308, 0x73F7, 0x7248, 0x743D, 0x7050, 0x7292, 0x712D, 0x7242, 0x712D, 0x7242, 0xFFFF, 0x803E, 0x72F6, 0x891B, 0x73F4, 0x909A, 0x76CC, 0x959F, 0x7B0B, 0x975E, 0x8011, 0x959F, 0x8517, 0x909A, 0x8957, 0x891B, 0x8C2E, 0x803E, 0x8D2B, 0x7761, 0x8C2E, 0x6FE2, 0x8957, 0x6ADD, 0x8517, 0x691E, 0x8011, 0x6ADD, 0x7B0B, 0x6FE2, 0x76CC, 0x7761, 0x73F4, 0x803E, 0x72F6, 0x803E, 0x72F6, 0xFFFF, 0x803E, 0x738F, 0x77C8, 0x7481, 0x70A0, 0x7738, 0x6BD7, 0x7B46, 0x6A2C, 0x8011, 0x6BD7, 0x84DC, 0x70A1, 0x88EA, 0x77C9, 0x8BA1, 0x803E, 0x8C93, 0x88B4, 0x8BA1, 0x8FDB, 0x88EA, 0x94A5, 0x84DD, 0x9650, 0x8011, 0x94A5, 0x7B46, 0x8FDB, 0x7738, 0x88B4, 0x7481, 0x803E, 0x738F, 0x803E, 0x738F, 0xFFFF, 0x929B, 0x739A, 0x935C, 0x73FA, 0x9100, 0x7578, 0x905A, 0x7527, 0x9175, 0x745E, 0xFFFF, 0x6DDC, 0x739D, 0x7022, 0x7527, 0x6F74, 0x757C, 0x6D16, 0x73FF, 0x6DDC, 0x739D, 0x6DDC, 0x739D, 0xFFFF, 0x9589, 0x7533, 0x9634, 0x75A4, 0x937E, 0x76ED, 0x92E8, 0x768B, 0xFFFF, 0x6AEB, 0x7539, 0x6D8D, 0x7690, 0x6CFB, 0x76F0, 0x6CEC, 0x76FA, 0x6BED, 0x7674, 0x6A40, 0x75A9, 0x6A45, 0x75A7, 0x6AEB, 0x7539, 0x6AEB, 0x7539, 0xFFFF, 0x980B, 0x7707, 0x989A, 0x7784, 0x9597, 0x7892, 0x951A, 0x7825, 0xFFFF, 0x686A, 0x770C, 0x6B5B, 0x782A, 0x6ADF, 0x7897, 0x67DD, 0x7788, 0x686A, 0x770C, 0x686A, 0x770C, 0xFFFF, 0x9A12, 0x790A, 0x9A7E, 0x7991, 0x9740, 0x7A5E, 0x96E1, 0x79E8, 0x9A12, 0x790A, 0xFFFF, 0x6664, 0x790F, 0x6996, 0x79ED, 0x6937, 0x7A63, 0x65F9, 0x7996, 0x6664, 0x790F, 0x6664, 0x790F, 0xFFFF, 0x9B91, 0x7B32, 0x9BDB, 0x7BC1, 0x9870, 0x7C48, 0x9831, 0x7BCB, 0xFFFF, 0x64E6, 0x7B37, 0x6847, 0x7BD0, 0x6807, 0x7C4C, 0x649D, 0x7BC5, 0x64E6, 0x7B37, 0x64E6, 0x7B37, 0xFFFF, 0x9C82, 0x7D72, 0x9CA7, 0x7E06, 0x9925, 0x7E46, 0x9903, 0x7DC5, 0xFFFF, 0x63F7, 0x7D78, 0x6776, 0x7DC9, 0x6756, 0x7E49, 0x63D3, 0x7E0A, 0x63F7, 0x7D78, 0x63F7, 0x7D78, 0xFFFF, 0x5C87, 0x7EDB, 0x5E08, 0x7F35, 0x5EA8, 0x800F, 0x5E08, 0x80E9, 0x5C87, 0x8144, 0x5C85, 0x8144, 0x5B06, 0x80E9, 0x5A67, 0x800F, 0x5B06, 0x7F35, 0x5C87, 0x7EDB, 0x5C87, 0x7EDB, 0xFFFF, 0xA402, 0x7EDE, 0xA583, 0x7F38, 0xA623, 0x8011, 0xA623, 0x8013, 0xA583, 0x80EC, 0xA402, 0x8147, 0xA281, 0x80ED, 0xA1E2, 0x8013, 0xA281, 0x7F38, 0xA402, 0x7EDE, 0xA402, 0x7EDE, 0xFFFF, 0x9CE0, 0x7FC0, 0x9CE0, 0x8055, 0x9957, 0x804D, 0x9957, 0x7FCB, 0xFFFF, 0x639D, 0x7FC5, 0x6726, 0x7FCE, 0x6726, 0x8051, 0x639D, 0x805A, 0x639D, 0x7FC5, 0x639D, 0x7FC5, 0xFFFF, 0x9927, 0x81D1, 0x9CAA, 0x8210, 0x9C87, 0x82A2, 0x9907, 0x8252, 0x9927, 0x81D1, 0x9927, 0x81D1, 0xFFFF, 0x6757, 0x81D5, 0x6777, 0x8255, 0x63F9, 0x82A7, 0x63D4, 0x8214, 0xFFFF, 0x9877, 0x83CF, 0x9BE2, 0x8455, 0x9B99, 0x84E3, 0x9838, 0x844C, 0x9877, 0x83CF, 0x9877, 0x83CF, 0xFFFF, 0x6808, 0x83D3, 0x6848, 0x8450, 0x64E7, 0x84E8, 0x649E, 0x845A, 0xFFFF, 0x9749, 0x85B9, 0x9A88, 0x8684, 0x9A1D, 0x870C, 0x96EB, 0x862E, 0x9749, 0x85B9, 0x9749, 0x85B9, 0xFFFF, 0x6938, 0x85BD, 0x6997, 0x8634, 0x6665, 0x8710, 0x65F9, 0x8689, 0xFFFF, 0x95A2, 0x8785, 0x98A5, 0x8892, 0x9818, 0x890F, 0x9527, 0x87F2, 0x95A2, 0x8785, 0x95A2, 0x8785, 0xFFFF, 0x6ADF, 0x878A, 0x6B5B, 0x87F8, 0x686A, 0x8914, 0x67DC, 0x8897, 0x6ADF, 0x878A, 0xFFFF, 0x6CF7, 0x892F, 0x6D8D, 0x8991, 0x6AEB, 0x8AE9, 0x6A40, 0x8A79, 0xFFFF, 0x9380, 0x8932, 0x9645, 0x8A72, 0x963E, 0x8A77, 0x9599, 0x8AE3, 0x92F5, 0x898D, 0x9380, 0x8932, 0x9380, 0x8932, 0xFFFF, 0x9110, 0x8AA1, 0x936F, 0x8C1F, 0x92AA, 0x8C80, 0x9064, 0x8AF7, 0x9110, 0x8AA1, 0x9110, 0x8AA1, 0xFFFF, 0x6F73, 0x8AA5, 0x7021, 0x8AFB, 0x7035, 0x8B04, 0x6DED, 0x8C8B, 0x6DE1, 0x8C87, 0x6D17, 0x8C23, 0xFFFF, 0x8E3E, 0x8BE1, 0x9037, 0x8D8B, 0x8F59, 0x8DDC, 0x8D7C, 0x8C27, 0x8E3E, 0x8BE1, 0x8E3E, 0x8BE1, 0xFFFF, 0x7259, 0x8BEB, 0x731B, 0x8C31, 0x7140, 0x8DE7, 0x7064, 0x8D97, 0xFFFF, 0x8B21, 0x8CE3, 0x8CA9, 0x8EB2, 0x8BBA, 0x8EEF, 0x8A51, 0x8D18, 0x8B21, 0x8CE3, 0x8B21, 0x8CE3, 0xFFFF, 0x7576, 0x8CEB, 0x7648, 0x8D20, 0x74E0, 0x8EF8, 0x73F2, 0x8EBB, 0xFFFF, 0x66F3, 0x8D2F, 0x6874, 0x8D8A, 0x687D, 0x8D8F, 0x6886, 0x8D94, 0x6926, 0x8E6E, 0x6887, 0x8F48, 0x6705, 0x8FA2, 0x6584, 0x8F49, 0x657F, 0x8F45, 0x6570, 0x8F3E, 0x6573, 0x8F3E, 0x64D3, 0x8E63, 0x6573, 0x8D89, 0x66F3, 0x8D2F, 0x66F3, 0x8D2F, 0xFFFF, 0x9993, 0x8D31, 0x9B13, 0x8D8C, 0x9BB4, 0x8E66, 0x9B16, 0x8F40, 0x9993, 0x8F9A, 0x9814, 0x8F40, 0x9774, 0x8E66, 0x9812, 0x8D8C, 0x9993, 0x8D31, 0x9993, 0x8D31, 0xFFFF, 0x87CD, 0x8DA1, 0x88DC, 0x8F8B, 0x87E0, 0x8FB5, 0x86F0, 0x8DC6, 0x87CD, 0x8DA1, 0x87CD, 0x8DA1, 0xFFFF, 0x78CD, 0x8DA8, 0x79A8, 0x8DCB, 0x78BC, 0x8FBB, 0x77C1, 0x8F92, 0xFFFF, 0x8450, 0x8E19, 0x84E2, 0x9014, 0x83E0, 0x9029, 0x836C, 0x8E2C, 0x8450, 0x8E19, 0x8450, 0x8E19, 0xFFFF, 0x7C48, 0x8E1C, 0x7D2B, 0x8E2E, 0x7CBD, 0x902C, 0x7BBB, 0x9017, 0x7C48, 0x8E1C, 0xFFFF, 0x80BF, 0x8E49, 0x80D2, 0x904A, 0x7FCC, 0x904A, 0x7FD9, 0x8E49, 0x80BF, 0x8E49, 0x80BF, 0x8E49, 0xFFFF, 0x804F, 0x9321, 0x81D0, 0x937A, 0x8271, 0x9455, 0x81D1, 0x952F, 0x8051, 0x958A, 0x7ECF, 0x9530, 0x7E2F, 0x9456, 0x7ECE, 0x937B, 0x804F, 0x9321, 0x804F, 0x9321, 0xFFFF, 0x8048, 0x46D9, 0x27BC, 0x9DBA, 0xD8D3, 0x9DBA, 0xFFFF, 0x8048, 0x4BC9, 0x952E, 0x604A, 0x6B62, 0x604A, 0xFFFF, 0x68D2, 0x62CE, 0x97BF, 0x62CE, 0xB9BA, 0x8427, 0xA239, 0x9B36, 0x5E16, 0x9B36, 0x46B6, 0x8446, 0x68D2, 0x62CE, 0xFFFF, 0xBC3E, 0x869F, 0xD13B, 0x9B36, 0xA742, 0x9B36, 0xFFFF, 0x4431, 0x86BE, 0x590E, 0x9B36, 0x2F54, 0x9B36, 0x4431, 0x86BE}; +const PROGMEM uint16_t logo_white[] = {0x80BC, 0x6FD7, 0x80AF, 0x71D8, 0x7FC8, 0x71D9, 0x7FB7, 0x6FD8, 0x80BC, 0x6FD7, 0xFFFF, 0x83CB, 0x6FF6, 0x84CD, 0x700B, 0x843E, 0x7206, 0x835B, 0x71F4, 0xFFFF, 0x7CA9, 0x6FF8, 0x7D1A, 0x71F5, 0x7C37, 0x7207, 0x7BA7, 0x700D, 0x7CA9, 0x6FF8, 0x7CA9, 0x6FF8, 0xFFFF, 0x87CD, 0x7068, 0x88C7, 0x7092, 0x87BA, 0x727C, 0x86DF, 0x7258, 0xFFFF, 0x78A8, 0x706B, 0x7997, 0x725A, 0x78BA, 0x727E, 0x77AD, 0x7095, 0x78A8, 0x706B, 0x78A8, 0x706B, 0xFFFF, 0x8BA7, 0x712C, 0x8C95, 0x716A, 0x8B10, 0x7339, 0x8A3F, 0x7303, 0xFFFF, 0x74CE, 0x712F, 0x7635, 0x7307, 0x7564, 0x733C, 0x73DE, 0x716D, 0x74CE, 0x712F, 0x74CE, 0x712F, 0xFFFF, 0x8F47, 0x723F, 0x9023, 0x728E, 0x8E2D, 0x743A, 0x8D6B, 0x73F4, 0xFFFF, 0x712D, 0x7242, 0x7309, 0x73F7, 0x7248, 0x743D, 0x7050, 0x7292, 0x712D, 0x7242, 0x712D, 0x7242, 0xFFFF, 0x929B, 0x739A, 0x935C, 0x73FA, 0x9100, 0x7578, 0x905A, 0x7527, 0xFFFF, 0x6DDC, 0x739D, 0x7022, 0x7527, 0x6F74, 0x757C, 0x6D16, 0x73FF, 0x6DDC, 0x739D, 0x6DDC, 0x739D, 0xFFFF, 0x9589, 0x7533, 0x9634, 0x75A4, 0x937E, 0x76ED, 0x92E8, 0x768B, 0xFFFF, 0x6AEB, 0x7539, 0x6D8D, 0x7690, 0x6CFB, 0x76F0, 0x6A40, 0x75A9, 0x6AEB, 0x7539, 0xFFFF, 0x980B, 0x7707, 0x989A, 0x7784, 0x9597, 0x7892, 0x951A, 0x7825, 0xFFFF, 0x686A, 0x770C, 0x6B5B, 0x782A, 0x6ADF, 0x7897, 0x67DD, 0x7788, 0x686A, 0x770C, 0x686A, 0x770C, 0xFFFF, 0x9A12, 0x790A, 0x9A7E, 0x7991, 0x9740, 0x7A5E, 0x96E1, 0x79E8, 0xFFFF, 0x6664, 0x790F, 0x6996, 0x79ED, 0x6937, 0x7A63, 0x65F9, 0x7996, 0x6664, 0x790F, 0x6664, 0x790F, 0xFFFF, 0x9B91, 0x7B32, 0x9BDB, 0x7BC1, 0x9870, 0x7C48, 0x9831, 0x7BCC, 0xFFFF, 0x64E6, 0x7B37, 0x6847, 0x7BD0, 0x6807, 0x7C4C, 0x649D, 0x7BC5, 0x64E6, 0x7B37, 0x64E6, 0x7B37, 0xFFFF, 0x9C82, 0x7D72, 0x9CA7, 0x7E06, 0x9925, 0x7E46, 0x9903, 0x7DC5, 0xFFFF, 0x63F7, 0x7D78, 0x6776, 0x7DC9, 0x6756, 0x7E49, 0x63D3, 0x7E0A, 0x63F7, 0x7D78, 0x63F7, 0x7D78, 0xFFFF, 0x9CE0, 0x7FC0, 0x9CE0, 0x8055, 0x9957, 0x804D, 0x9957, 0x7FCB, 0xFFFF, 0x639D, 0x7FC5, 0x6726, 0x7FCE, 0x6726, 0x8051, 0x639D, 0x805A, 0x639D, 0x7FC5, 0xFFFF, 0x9927, 0x81D1, 0x9CAA, 0x8210, 0x9C87, 0x82A2, 0x9907, 0x8252, 0x9927, 0x81D1, 0x9927, 0x81D1, 0xFFFF, 0x6757, 0x81D5, 0x6777, 0x8256, 0x63F9, 0x82A7, 0x63D4, 0x8214, 0xFFFF, 0x9877, 0x83CF, 0x9BE2, 0x8455, 0x9B99, 0x84E3, 0x9838, 0x844C, 0x9877, 0x83CF, 0xFFFF, 0x6808, 0x83D3, 0x6848, 0x8450, 0x64E7, 0x84E8, 0x649E, 0x845A, 0xFFFF, 0x9749, 0x85B9, 0x9A88, 0x8684, 0x9A1D, 0x870C, 0x96EB, 0x862E, 0x9749, 0x85B9, 0x9749, 0x85B9, 0xFFFF, 0x6938, 0x85BD, 0x6997, 0x8634, 0x6665, 0x8710, 0x65F9, 0x8689, 0xFFFF, 0x95A2, 0x8785, 0x98A5, 0x8892, 0x9818, 0x890F, 0x9527, 0x87F2, 0x95A2, 0x8785, 0x95A2, 0x8785, 0xFFFF, 0x6ADF, 0x878A, 0x6B5B, 0x87F8, 0x686A, 0x8915, 0x67DC, 0x8897, 0xFFFF, 0x6CF7, 0x8930, 0x6D8D, 0x8991, 0x6AEB, 0x8AE9, 0x6A40, 0x8A79, 0xFFFF, 0x9380, 0x8932, 0x9645, 0x8A72, 0x9599, 0x8AE3, 0x92F5, 0x898D, 0x9380, 0x8932, 0xFFFF, 0x9110, 0x8AA1, 0x936F, 0x8C1F, 0x92AA, 0x8C80, 0x9064, 0x8AF7, 0x9110, 0x8AA1, 0x9110, 0x8AA1, 0xFFFF, 0x6F73, 0x8AA5, 0x7021, 0x8AFB, 0x6DED, 0x8C8C, 0x6D17, 0x8C23, 0xFFFF, 0x8E3E, 0x8BE1, 0x9037, 0x8D8B, 0x8F59, 0x8DDC, 0x8D7C, 0x8C27, 0x8E3E, 0x8BE1, 0x8E3E, 0x8BE1, 0xFFFF, 0x7259, 0x8BEB, 0x731B, 0x8C31, 0x7140, 0x8DE7, 0x7064, 0x8D97, 0xFFFF, 0x8B21, 0x8CE3, 0x8CA9, 0x8EB2, 0x8BBA, 0x8EEF, 0x8A51, 0x8D18, 0x8B21, 0x8CE3, 0x8B21, 0x8CE3, 0xFFFF, 0x7576, 0x8CEB, 0x7648, 0x8D20, 0x74E0, 0x8EF8, 0x73F2, 0x8EBB, 0xFFFF, 0x87CD, 0x8DA1, 0x88DC, 0x8F8B, 0x87E0, 0x8FB5, 0x86F0, 0x8DC6, 0x87CD, 0x8DA1, 0x87CD, 0x8DA1, 0xFFFF, 0x78CC, 0x8DA8, 0x79A8, 0x8DCB, 0x78BC, 0x8FBB, 0x77C0, 0x8F92, 0xFFFF, 0x8450, 0x8E19, 0x84E2, 0x9014, 0x83E0, 0x9029, 0x836C, 0x8E2C, 0x8450, 0x8E19, 0x8450, 0x8E19, 0xFFFF, 0x7C48, 0x8E1C, 0x7D2B, 0x8E2E, 0x7CBD, 0x902C, 0x7BBB, 0x9017, 0xFFFF, 0x80BE, 0x8E49, 0x80D1, 0x904A, 0x7FCC, 0x904A, 0x7FD9, 0x8E49, 0x80BE, 0x8E49, 0xFFFF, 0x8276, 0x75D6, 0x83AF, 0x75FE, 0x8436, 0x7628, 0x84AE, 0x7661, 0x8542, 0x7706, 0x8512, 0x77BA, 0x8457, 0x7845, 0x8335, 0x788B, 0x8318, 0x7882, 0x82D8, 0x7860, 0x831E, 0x7830, 0x8353, 0x7823, 0x83E6, 0x77F9, 0x8464, 0x7790, 0x847A, 0x771A, 0x8415, 0x76B7, 0x83B6, 0x7691, 0x8351, 0x7676, 0x827F, 0x7662, 0x81BB, 0x7687, 0x8161, 0x76AF, 0x8123, 0x76DA, 0x80E5, 0x771A, 0x80C5, 0x774D, 0x80B8, 0x77C1, 0x80D1, 0x77EE, 0x8107, 0x7814, 0x81CC, 0x786B, 0x837F, 0x7918, 0x8464, 0x7983, 0x84C0, 0x79B2, 0x852D, 0x79FD, 0x859D, 0x7ABC, 0x858E, 0x7B79, 0x8545, 0x7C25, 0x84D9, 0x7CC5, 0x8469, 0x7D4D, 0x843B, 0x7DCD, 0x8555, 0x7DA8, 0x85D3, 0x7D67, 0x870D, 0x7CA0, 0x87E0, 0x7BC0, 0x880D, 0x7B5B, 0x886D, 0x7A46, 0x88B3, 0x799B, 0x88CC, 0x7970, 0x893A, 0x78EA, 0x8995, 0x78A8, 0x8A01, 0x786F, 0x8AF8, 0x781F, 0x8BA6, 0x77FD, 0x8C0C, 0x77EF, 0x8C96, 0x77FB, 0x8D1D, 0x7815, 0x8D59, 0x7826, 0x8E40, 0x7889, 0x8EDB, 0x7925, 0x8EFC, 0x797B, 0x8EFF, 0x79D4, 0x8E71, 0x7A7B, 0x8D58, 0x7AD2, 0x8C23, 0x7ADE, 0x8AFF, 0x7A97, 0x8AF5, 0x7A81, 0x8AEF, 0x7A4E, 0x8B68, 0x7A52, 0x8B96, 0x7A5F, 0x8C39, 0x7A87, 0x8D33, 0x7A7F, 0x8E07, 0x7A3F, 0x8E66, 0x79CB, 0x8E63, 0x7985, 0x8E43, 0x793F, 0x8DC6, 0x78C6, 0x8CFA, 0x7876, 0x8C7E, 0x785F, 0x8C18, 0x7857, 0x8B84, 0x7874, 0x8B22, 0x788F, 0x8A7D, 0x78CA, 0x8A2E, 0x78F9, 0x89F0, 0x7930, 0x89A3, 0x79A5, 0x8979, 0x7AC0, 0x897C, 0x7B9C, 0x8972, 0x7BF2, 0x88CC, 0x7D32, 0x87B7, 0x7E4C, 0x8665, 0x7F52, 0x8660, 0x7F5A, 0x878F, 0x7F01, 0x88AE, 0x7EC2, 0x89FD, 0x7E9E, 0x8B8D, 0x7EC6, 0x8C40, 0x7F0E, 0x8CB6, 0x7F68, 0x8D1D, 0x7FD7, 0x8DFA, 0x80BD, 0x8EA8, 0x816E, 0x8F34, 0x81D4, 0x8F8A, 0x81F9, 0x8FDA, 0x820A, 0x90AB, 0x820F, 0x9120, 0x81FF, 0x91A5, 0x81DC, 0x91F4, 0x81B8, 0x922C, 0x8198, 0x9288, 0x812B, 0x927D, 0x80AB, 0x9252, 0x8068, 0x921C, 0x8033, 0x9174, 0x7FEB, 0x9099, 0x7FEB, 0x8FCF, 0x8029, 0x8F5D, 0x808D, 0x8F47, 0x80A4, 0x8ED4, 0x80A4, 0x8EC5, 0x8070, 0x8F65, 0x7FE6, 0x906D, 0x7F92, 0x91A4, 0x7F90, 0x92A8, 0x7FF7, 0x92FC, 0x8043, 0x9331, 0x8090, 0x9349, 0x813D, 0x92D1, 0x81E3, 0x9264, 0x8227, 0x91E5, 0x825B, 0x915D, 0x8280, 0x90D3, 0x8296, 0x8FA0, 0x829A, 0x8F2C, 0x8286, 0x8EE7, 0x8273, 0x8E78, 0x824A, 0x8DA9, 0x81D4, 0x8CB9, 0x8127, 0x8B68, 0x802C, 0x8B22, 0x8001, 0x8AC3, 0x7FE7, 0x8A50, 0x7FF4, 0x88FD, 0x8068, 0x87A4, 0x811D, 0x879E, 0x812D, 0x8904, 0x81F1, 0x89D4, 0x8285, 0x8A7C, 0x8343, 0x8A94, 0x8431, 0x8A4E, 0x84A1, 0x89E8, 0x850E, 0x892F, 0x85E5, 0x88B0, 0x86E5, 0x88C0, 0x8757, 0x88F2, 0x878D, 0x8927, 0x87AD, 0x8ABF, 0x8821, 0x8B0E, 0x881E, 0x8B70, 0x8811, 0x8C1B, 0x87D6, 0x8C9B, 0x8776, 0x8CC4, 0x873D, 0x8CD3, 0x8705, 0x8CA2, 0x86A3, 0x8C06, 0x8662, 0x8B39, 0x864F, 0x8A77, 0x8662, 0x89F9, 0x864D, 0x8A10, 0x8606, 0x8A66, 0x85F7, 0x8B35, 0x85DC, 0x8C50, 0x85FD, 0x8D3C, 0x8663, 0x8D94, 0x870A, 0x8D7D, 0x875F, 0x8D3A, 0x87B8, 0x8CB1, 0x882D, 0x8BC1, 0x888C, 0x8B30, 0x88A7, 0x8A8D, 0x88AE, 0x89EE, 0x8898, 0x896E, 0x887E, 0x8869, 0x882D, 0x87EE, 0x87EA, 0x87A4, 0x87A8, 0x878E, 0x8785, 0x874D, 0x86E3, 0x875D, 0x8637, 0x87FD, 0x8466, 0x8705, 0x835A, 0x86B8, 0x8359, 0x84A4, 0x8358, 0x7F20, 0x851B, 0x7F13, 0x864D, 0x8016, 0x86F9, 0x818E, 0x87D8, 0x823B, 0x8869, 0x8272, 0x88C9, 0x8276, 0x8915, 0x8266, 0x893D, 0x81FB, 0x89D8, 0x8197, 0x8A21, 0x8119, 0x8A62, 0x80A7, 0x8A8A, 0x8016, 0x8AAA, 0x7EDC, 0x8AAE, 0x7DC5, 0x8A63, 0x7D55, 0x8A29, 0x7CFA, 0x89E5, 0x7CAD, 0x8939, 0x7D1B, 0x8895, 0x7E00, 0x8825, 0x7F27, 0x8800, 0x7F66, 0x880F, 0x7F69, 0x8850, 0x7E49, 0x8873, 0x7D9A, 0x88C9, 0x7D4F, 0x893E, 0x7D8B, 0x89B2, 0x7DD8, 0x89E6, 0x7E36, 0x8A10, 0x7F02, 0x8A40, 0x7FDB, 0x8A34, 0x8046, 0x8A16, 0x8091, 0x89F5, 0x80A5, 0x89EB, 0x80FE, 0x89AB, 0x8126, 0x8981, 0x8159, 0x8918, 0x814F, 0x88E6, 0x8128, 0x88B8, 0x8094, 0x8856, 0x7EFC, 0x8796, 0x7D74, 0x86E7, 0x7D3D, 0x86C5, 0x7CD8, 0x8674, 0x7C98, 0x8605, 0x7CA0, 0x8536, 0x7D7C, 0x83E6, 0x7E07, 0x8357, 0x7DED, 0x835B, 0x79CC, 0x843E, 0x7962, 0x8448, 0x77CB, 0x8450, 0x76F3, 0x8438, 0x763E, 0x841E, 0x7502, 0x83FE, 0x746C, 0x83FD, 0x73E4, 0x840A, 0x72CE, 0x8444, 0x729B, 0x8457, 0x71E6, 0x84B7, 0x71B5, 0x84EB, 0x719B, 0x853B, 0x719B, 0x8558, 0x71D4, 0x85E0, 0x72B0, 0x8642, 0x73D4, 0x8661, 0x74B3, 0x8616, 0x74AD, 0x84D7, 0x74B2, 0x84B3, 0x74B5, 0x849B, 0x751E, 0x8496, 0x753B, 0x84B8, 0x75C5, 0x856E, 0x756D, 0x865A, 0x74D0, 0x86B8, 0x73FA, 0x86EA, 0x7250, 0x86CF, 0x70E7, 0x863F, 0x707E, 0x85C8, 0x705F, 0x8549, 0x7075, 0x84CC, 0x70AC, 0x8475, 0x70CD, 0x8452, 0x71FF, 0x839C, 0x7287, 0x8376, 0x736A, 0x833A, 0x7443, 0x8319, 0x751E, 0x8311, 0x76AC, 0x8327, 0x77C4, 0x8341, 0x7810, 0x8340, 0x799F, 0x8313, 0x7A2A, 0x82EA, 0x7B24, 0x8281, 0x7BE4, 0x820C, 0x7BEC, 0x81B1, 0x7A5E, 0x81C8, 0x7809, 0x81ED, 0x7751, 0x81F8, 0x7664, 0x81EF, 0x7571, 0x81B4, 0x74BB, 0x8141, 0x7483, 0x80F9, 0x7408, 0x802F, 0x73D9, 0x7FEB, 0x7359, 0x7F50, 0x72A0, 0x7EC4, 0x719E, 0x7E89, 0x7074, 0x7EA8, 0x7015, 0x7ECC, 0x6FD0, 0x7EF8, 0x6FA3, 0x7F19, 0x6F6B, 0x7FBB, 0x6F93, 0x8017, 0x6FA7, 0x8032, 0x6FD7, 0x805A, 0x70DF, 0x8092, 0x7205, 0x805A, 0x729E, 0x7FCB, 0x72B3, 0x7FBC, 0x7309, 0x7FA6, 0x733B, 0x7FDE, 0x72F9, 0x804B, 0x726D, 0x80A7, 0x70E6, 0x80FB, 0x700D, 0x80EC, 0x6F48, 0x80A8, 0x6EFC, 0x8073, 0x6EC1, 0x8026, 0x6E93, 0x7FCC, 0x6ED4, 0x7ED8, 0x6F54, 0x7E72, 0x6FCB, 0x7E3A, 0x700B, 0x7E25, 0x71AB, 0x7DED, 0x7356, 0x7E3E, 0x7472, 0x7EF4, 0x7536, 0x7FBD, 0x75DA, 0x8075, 0x7628, 0x80B6, 0x767B, 0x80D8, 0x76D9, 0x80EF, 0x7755, 0x80FC, 0x7881, 0x80D5, 0x7931, 0x8093, 0x7A00, 0x801E, 0x799B, 0x7D9B, 0x789A, 0x7CD8, 0x77C0, 0x7BE5, 0x7783, 0x7B55, 0x7787, 0x7AB9, 0x77AE, 0x7A67, 0x77E6, 0x7A1D, 0x781E, 0x79CD, 0x785E, 0x7909, 0x7853, 0x78C0, 0x7823, 0x788B, 0x7808, 0x7875, 0x7649, 0x77E8, 0x74B6, 0x7869, 0x7488, 0x78B3, 0x7472, 0x7901, 0x74D2, 0x796F, 0x75D8, 0x799A, 0x76EE, 0x7971, 0x774A, 0x797A, 0x7751, 0x79B4, 0x76A0, 0x79F0, 0x75E4, 0x7A0A, 0x7454, 0x79E1, 0x73AF, 0x7986, 0x7369, 0x7909, 0x7374, 0x7891, 0x739D, 0x783C, 0x73B6, 0x781E, 0x74B7, 0x7768, 0x765D, 0x772C, 0x77ED, 0x7769, 0x7932, 0x77FC, 0x7979, 0x7836, 0x79B8, 0x787B, 0x79DF, 0x7912, 0x7998, 0x7A14, 0x7967, 0x7AB4, 0x796A, 0x7AD8, 0x79C5, 0x7B60, 0x7A9D, 0x7BE9, 0x7B72, 0x7C47, 0x7EBA, 0x7BD6, 0x8206, 0x7CA8, 0x82FA, 0x7C2E, 0x8391, 0x7BB4, 0x83F6, 0x7B40, 0x8413, 0x7AD0, 0x83DD, 0x7A71, 0x838A, 0x7A39, 0x8296, 0x79B7, 0x80F3, 0x78FA, 0x8016, 0x788A, 0x7FB4, 0x7833, 0x7F8D, 0x77DF, 0x7F92, 0x77A9, 0x7FB3, 0x7718, 0x7FF6, 0x76C2, 0x8036, 0x768A, 0x8097, 0x764A, 0x80DF, 0x762A, 0x813C, 0x7605, 0x8275, 0x75D5}; + +#define LOGO_BACKGROUND 0xDEEA5C + +#define LOGO_PAINT_PATHS \ + LOGO_PAINT_PATH(0xC1D82F, logo_green) \ + LOGO_PAINT_PATH(0x000000, logo_black) \ + LOGO_PAINT_PATH(0x000000, logo_type) \ + LOGO_PAINT_PATH(0x000000, logo_mark) \ + LOGO_PAINT_PATH(0xFFFFFF, logo_white) From 7735be367face5bf5cb62c28f9b66aaaeda67da8 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sat, 19 Sep 2020 08:23:56 -0600 Subject: [PATCH 0257/1370] Fix case light brightness save/load (#19436) --- Marlin/src/module/settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 2c679068b9..3cb88da4ee 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -138,7 +138,7 @@ void M710_report(const bool forReplay); #endif -#if ENABLED(CASE_LIGHT_MENU) && DISABLED(CASE_LIGHT_NO_BRIGHTNESS) +#if ENABLED(CASE_LIGHT_ENABLE) && DISABLED(CASE_LIGHT_NO_BRIGHTNESS) #include "../feature/caselight.h" #define HAS_CASE_LIGHT_BRIGHTNESS 1 #endif From 2f483a25e96edac215cd3d62b1e386240091bc91 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sat, 19 Sep 2020 17:17:24 +0200 Subject: [PATCH 0258/1370] Optional Host Start menu item (#19443) --- Marlin/Configuration_adv.h | 1 + Marlin/src/lcd/menu/menu_main.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 35b1dcc563..a010856d18 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3232,6 +3232,7 @@ //#define HOST_ACTION_COMMANDS #if ENABLED(HOST_ACTION_COMMANDS) //#define HOST_PROMPT_SUPPORT + //#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start #endif /** diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 334d998d5c..5b98382559 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -54,7 +54,7 @@ #include "../../feature/password/password.h" #endif -#ifdef ACTION_ON_START +#if ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START) #include "../../feature/host_actions.h" #endif @@ -162,7 +162,7 @@ void menu_main() { if (TERN0(MACHINE_CAN_PAUSE, printingIsPaused())) ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print); - #ifdef ACTION_ON_START + #if ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START) ACTION_ITEM(MSG_HOST_START_PRINT, host_action_start); #endif From 7a0d6552928ea885b76c4eac7bbb95fd1187fa9b Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 20 Sep 2020 03:18:42 +1200 Subject: [PATCH 0259/1370] Ultratronics Pro SPI pins (#19444) --- Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h index 671307bc00..75b29629e9 100644 --- a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h +++ b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h @@ -23,6 +23,7 @@ /** * ReprapWorld ULTRATRONICS v1.0 + * https://reprapworld.com/documentation/datasheet_ultratronics10_05.pdf */ #ifndef ARDUINO_ARCH_SAM @@ -146,6 +147,10 @@ #define SPI_EEPROM2_CS -1 #define SPI_FLASH_CS -1 +#define SCK_PIN 76 +#define MISO_PIN 74 +#define MOSI_PIN 75 + // SPI for Max6675 or Max31855 Thermocouple #define MAX6675_SS_PIN 65 #define MAX31855_SS0 65 From 584a8cd1a8b26d4546ab8036b26a130915cfc129 Mon Sep 17 00:00:00 2001 From: enigmaquip Date: Sat, 19 Sep 2020 09:19:45 -0600 Subject: [PATCH 0260/1370] Fix Creality DWIN Control menu icons (#19441) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index ca3a5cccff..131c96bef1 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -744,7 +744,7 @@ inline void Draw_Control_Menu() { // Draw icons and lines uint8_t i = 0; - #define _TEMP_ICON(N) do{ ++i; if (CVISI(i)) Draw_Menu_Line(CSCROL(i), ICON_SetEndTemp + (N) - 1); }while(0) + #define _TEMP_ICON(N) do{ ++i; if (CVISI(i)) Draw_Menu_Line(CSCROL(i), ICON_Temperature + (N) - 1); }while(0) _TEMP_ICON(CONTROL_CASE_TEMP); if (CVISI(i)) Draw_More_Icon(CSCROL(i)); From 5a35595a3a910e7bcba850b801a4056fa656e4be Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 20 Sep 2020 18:24:05 -0500 Subject: [PATCH 0261/1370] Whitespace cleanup --- Marlin/src/HAL/ESP32/WebSocketSerial.cpp | 5 +-- Marlin/src/HAL/STM32/tft/xpt2046.cpp | 4 +- Marlin/src/feature/binary_stream.h | 4 +- Marlin/src/feature/spindle_laser.h | 2 +- Marlin/src/gcode/control/M993_M994.cpp | 2 +- Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp | 4 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- Marlin/src/lcd/tft/ili9341.h | 4 +- Marlin/src/lcd/tft/st7735.h | 4 +- Marlin/src/lcd/tft/st7789v.h | 2 +- Marlin/src/lcd/tft/st7796s.h | 40 +++++++++---------- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- 14 files changed, 40 insertions(+), 41 deletions(-) diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp index 533f873e4f..ca7f47a1f8 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp @@ -86,7 +86,7 @@ int RingBuffer::read() { ring_buffer_pos_t RingBuffer::read(uint8_t *buffer) { ring_buffer_pos_t len = available(); - for(ring_buffer_pos_t i = 0; read_index != write_index; i++) { + for (ring_buffer_pos_t i = 0; read_index != write_index; i++) { buffer[i] = data[read_index]; read_index = NEXT_INDEX(read_index, size); } @@ -139,9 +139,8 @@ size_t WebSocketSerial::write(const uint8_t c) { size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) { size_t written = 0; - for(size_t i = 0; i < size; i++) { + for (size_t i = 0; i < size; i++) written += write(buffer[i]); - } return written; } diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp index 49e64da6a1..921e377a9f 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp @@ -155,9 +155,9 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { uint16_t XPT2046::HardwareIO(uint16_t data) { __HAL_SPI_ENABLE(&SPIx); - while((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} + while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} SPIx.Instance->DR = data; - while((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} + while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} __HAL_SPI_DISABLE(&SPIx); return SPIx.Instance->DR; diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index 10dea10d47..32ebcce2f6 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -441,9 +441,9 @@ public: } void dispatch() { - switch(static_cast(packet.header.protocol())) { + switch (static_cast(packet.header.protocol())) { case Protocol::CONTROL: - switch(static_cast(packet.header.type())) { + switch (static_cast(packet.header.type())) { case ProtocolControl::CLOSE: // revert back to ASCII mode card.flag.binary_mode = false; break; diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 8240efa2dd..15ff661c73 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -224,7 +224,7 @@ public: */ // Force disengage planner power control - static inline void inline_disable() { + static inline void inline_disable() { isReady = false; unitPower = 0; planner.laser_inline.status.isPlanned = false; diff --git a/Marlin/src/gcode/control/M993_M994.cpp b/Marlin/src/gcode/control/M993_M994.cpp index ddc95238bf..ff9ff85bf5 100644 --- a/Marlin/src/gcode/control/M993_M994.cpp +++ b/Marlin/src/gcode/control/M993_M994.cpp @@ -74,7 +74,7 @@ void GcodeSuite::M994() { W25QXX.init(SPI_QUARTER_SPEED); W25QXX.SPI_FLASH_BulkErase(); SERIAL_ECHOPGM("Load SPI Flash"); - while(addr < SPI_FLASH_SIZE) { + while (addr < SPI_FLASH_SIZE) { card.read(buf, COUNT(buf)); W25QXX.SPI_FLASH_BufferWrite(buf, addr, COUNT(buf)); addr += COUNT(buf); diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp index b1d905d9ad..d39c6cfbd5 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp @@ -194,7 +194,7 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { unsigned char temp_Counter; for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { LED_DataArray[temp_Counter] = 0; - switch(RGB_Scale) { + switch (RGB_Scale) { case RGB_SCALE_R10_G7_B5: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*5/10; break; case RGB_SCALE_R10_G7_B4: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*4/10; break; case RGB_SCALE_R10_G8_B7: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*8/10) << 16 | luminance*7/10; break; @@ -213,7 +213,7 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { bool LED_R_Flag = 0, LED_G_Flag = 0, LED_B_Flag = 0; for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { - switch(RGB_Scale) { + switch (RGB_Scale) { case RGB_SCALE_R10_G7_B5: { LED_R_Data[temp_Counter] = luminance*10/10; LED_G_Data[temp_Counter] = luminance*7/10; diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 9b54dbdd2b..a7173b1ad2 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -27,8 +27,8 @@ #include "../../../../inc/MarlinConfig.h" #include "../../ui_api.h" -#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers -#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage +#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage // command sending macro's with debugging capability #define SEND_PGM(x) send_P(PSTR(x)) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 595565e1c7..21c3b6185a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -161,7 +161,7 @@ typedef struct { uint8_t waitEndMoves; uint16_t moveSpeed; float move_dist; - uint8_t F[4]; + uint8_t F[4]; } UI_CFG; typedef enum { diff --git a/Marlin/src/lcd/tft/ili9341.h b/Marlin/src/lcd/tft/ili9341.h index 22709e4cf7..d4a493412f 100644 --- a/Marlin/src/lcd/tft/ili9341.h +++ b/Marlin/src/lcd/tft/ili9341.h @@ -33,10 +33,10 @@ #define ILI9341_MADCTL_RGB 0x00 #define ILI9341_MADCTL_MH 0x04 // Horizontal Refresh Order -#define ILI9341_ORIENTATION_UP ILI9341_MADCTL_MY // 240x320 ; Cable on the upper side +#define ILI9341_ORIENTATION_UP ILI9341_MADCTL_MY // 240x320 ; Cable on the upper side #define ILI9341_ORIENTATION_RIGHT ILI9341_MADCTL_MV // 320x240 ; Cable on the right side #define ILI9341_ORIENTATION_LEFT ILI9341_MADCTL_MY | ILI9341_MADCTL_MX | ILI9341_MADCTL_MV // 320x240 ; Cable on the left side -#define ILI9341_ORIENTATION_DOWN ILI9341_MADCTL_MX // 240x320 ; Cable on the upper side +#define ILI9341_ORIENTATION_DOWN ILI9341_MADCTL_MX // 240x320 ; Cable on the upper side #ifndef ILI9341_COLOR_RGB #define ILI9341_COLOR_BGR diff --git a/Marlin/src/lcd/tft/st7735.h b/Marlin/src/lcd/tft/st7735.h index 30e77fbd91..62f93d5044 100644 --- a/Marlin/src/lcd/tft/st7735.h +++ b/Marlin/src/lcd/tft/st7735.h @@ -33,7 +33,7 @@ #define ST7735_MADCTL_RGB 0x00 #define ST7735_MADCTL_MH 0x04 // Horizontal Refresh Order -#define ST7735_ORIENTATION_UP 0x00 // 128x160 ; Cable on the upper side +#define ST7735_ORIENTATION_UP 0x00 // 128x160 ; Cable on the upper side #define ST7735_ORIENTATION_RIGHT ST7735_MADCTL_MV | ST7735_MADCTL_MY // 160x128 ; Cable on the right side #define ST7735_ORIENTATION_LEFT ST7735_MADCTL_MV | ST7735_MADCTL_MX // 160x128 ; Cable on the left side #define ST7735_ORIENTATION_DOWN ST7735_MADCTL_MX | ST7735_MADCTL_MY // 128x160 ; Cable on the lower side @@ -71,7 +71,7 @@ #define ST7735_IDMOFF 0x38 // Idle Mode Off #define ST7735_IDMON 0x39 // Idle Mode On #define ST7735_COLMOD 0x3A // Interface Pixel Format -#define ST7735_RDID1 0xDA // Read ID1 Value +#define ST7735_RDID1 0xDA // Read ID1 Value #define ST7735_RDID2 0xDB // Read ID2 Value #define ST7735_RDID3 0xDC // Read ID3 Value diff --git a/Marlin/src/lcd/tft/st7789v.h b/Marlin/src/lcd/tft/st7789v.h index f6e937c2c2..67da67966d 100644 --- a/Marlin/src/lcd/tft/st7789v.h +++ b/Marlin/src/lcd/tft/st7789v.h @@ -89,7 +89,7 @@ #define ST7789V_WRCABCMB 0x5E // Write CABC Minimum Brightness #define ST7789V_RDCABCMB 0x5F // Read CABC Minimum Brightness #define ST7789V_RDABCSDR 0x68 // Read Automatic Brightness Control Self-Diagnostic Result -#define ST7789V_RDID1 0xDA // Read ID1 Value +#define ST7789V_RDID1 0xDA // Read ID1 Value #define ST7789V_RDID2 0xDB // Read ID2 Value #define ST7789V_RDID3 0xDC // Read ID3 Value diff --git a/Marlin/src/lcd/tft/st7796s.h b/Marlin/src/lcd/tft/st7796s.h index 7ddbcfae84..806977732c 100644 --- a/Marlin/src/lcd/tft/st7796s.h +++ b/Marlin/src/lcd/tft/st7796s.h @@ -133,8 +133,8 @@ static const uint16_t st7796s_init[] = { ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, /* Gamma Correction. */ - ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, - ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, + ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, + ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, ESC_REG(ST7796S_NORON), ESC_REG(ST7796S_WRCTRLD), 0x0024, @@ -146,30 +146,30 @@ static const uint16_t st7796s_init[] = { static const uint16_t lerdge_st7796s_init[] = { DATASIZE_8BIT, - ESC_REG(ST7796S_CSCON), 0x00C3, // enable command 2 part I - ESC_REG(ST7796S_CSCON), 0x0096, // enable command 2 part II + ESC_REG(ST7796S_CSCON), 0x00C3, // enable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0096, // enable command 2 part II - ESC_REG(ST7796S_MADCTL), ST7796S_MADCTL_DATA, + ESC_REG(ST7796S_MADCTL), ST7796S_MADCTL_DATA, ESC_REG(ST7796S_COLMOD), 0x0055, - ESC_REG(ST7796S_DIC), 0x0001, // 1-dot inversion - ESC_REG(ST7796S_EM), 0x00C6, + ESC_REG(ST7796S_DIC), 0x0001, // 1-dot inversion + ESC_REG(ST7796S_EM), 0x00C6, - ESC_REG(ST7796S_PWR2), 0x0015, - ESC_REG(ST7796S_PWR3), 0x00AF, - ESC_REG(0xC3), 0x0009, // Register not documented in datasheet - ESC_REG(ST7796S_VCMPCTL), 0x0022, - ESC_REG(ST7796S_VCMOST), 0x0000, - ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, + ESC_REG(ST7796S_PWR2), 0x0015, + ESC_REG(ST7796S_PWR3), 0x00AF, + ESC_REG(0xC3), 0x0009, // Register not documented in datasheet + ESC_REG(ST7796S_VCMPCTL), 0x0022, + ESC_REG(ST7796S_VCMOST), 0x0000, + ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, /* Gamma Correction. */ - ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, - ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, + ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, + ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, - ESC_REG(ST7796S_INVON), // Display inversion ON - ESC_REG(ST7796S_WRCTRLD), 0x0024, - ESC_REG(ST7796S_CSCON), 0x003C, // disable command 2 part I - ESC_REG(ST7796S_CSCON), 0x0069, // disable command 2 part II - ESC_REG(ST7796S_DISPON), + ESC_REG(ST7796S_INVON), // Display inversion ON + ESC_REG(ST7796S_WRCTRLD), 0x0024, + ESC_REG(ST7796S_CSCON), 0x003C, // disable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0069, // disable command 2 part II + ESC_REG(ST7796S_DISPON), ESC_END }; diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 2f4c90e170..de8498c5ff 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -603,7 +603,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const touch.clear(); if (calibration_stage < CALIBRATION_SUCCESS) { - switch(calibration_stage) { + switch (calibration_stage) { case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index d6409c1dca..b5b332910b 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -608,7 +608,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const touch.clear(); if (calibration_stage < CALIBRATION_SUCCESS) { - switch(calibration_stage) { + switch (calibration_stage) { case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; From b3890d385c60e39681e4b1f2cf5669ba36c15fa5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 20 Sep 2020 18:29:08 -0500 Subject: [PATCH 0262/1370] Add multi-extruder condition --- Marlin/Configuration_adv.h | 4 ++-- Marlin/src/HAL/DUE/HAL_SPI.cpp | 2 +- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 10 +++++----- Marlin/src/feature/dac/dac_dac084s085.cpp | 6 +++--- Marlin/src/feature/fwretract.cpp | 16 +++++++--------- Marlin/src/feature/fwretract.h | 4 ++-- Marlin/src/feature/powerloss.cpp | 10 +++++----- Marlin/src/feature/powerloss.h | 2 +- Marlin/src/gcode/config/M217.cpp | 4 ++-- Marlin/src/gcode/control/T.cpp | 2 +- Marlin/src/gcode/feature/fwretract/G10_G11.cpp | 4 ++-- Marlin/src/gcode/feature/pause/M600.cpp | 6 +++--- Marlin/src/gcode/feature/pause/M603.cpp | 2 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 12 ++++++------ Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 +--- Marlin/src/inc/Conditionals_LCD.h | 2 ++ Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/SanityCheck.h | 4 ++-- .../screens/endstop_state_screen.cpp | 2 +- .../screens/linear_advance_screen.cpp | 4 ++-- .../screens/max_velocity_screen.cpp | 2 +- .../screens/move_axis_screen.cpp | 4 ++-- .../screens/nudge_nozzle_screen.cpp | 12 ++++++------ .../lib/ftdi_eve_touch_ui/screens/screen_data.h | 2 +- .../screens/stepper_current_screen.cpp | 4 ++-- .../ftdi_eve_touch_ui/screens/steps_screen.cpp | 4 ++-- .../screens/stress_test_screen.cpp | 4 +--- .../lcd/extui/lib/mks_ui/draw_change_speed.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_extrusion.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 4 ++-- .../src/lcd/extui/lib/mks_ui/draw_printing.cpp | 12 +++++++----- Marlin/src/lcd/extui/ui_api.cpp | 17 ++++++----------- Marlin/src/lcd/menu/menu_advanced.cpp | 12 ++++++------ Marlin/src/lcd/menu/menu_configuration.cpp | 10 +++++----- Marlin/src/lcd/menu/menu_tune.cpp | 4 ++-- Marlin/src/lcd/ultralcd.cpp | 6 ++---- Marlin/src/module/endstops.cpp | 2 +- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/motion.h | 2 +- Marlin/src/module/planner.cpp | 4 ++-- Marlin/src/module/planner.h | 2 +- Marlin/src/module/settings.cpp | 12 ++++++------ Marlin/src/module/stepper.cpp | 12 ++++++------ Marlin/src/module/stepper.h | 13 ++++--------- Marlin/src/module/tool_change.cpp | 6 +++--- Marlin/src/module/tool_change.h | 2 +- Marlin/src/pins/sensitive_pins.h | 4 ++-- .../PlatformIO/scripts/common-dependencies.h | 3 --- 50 files changed, 127 insertions(+), 144 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a010856d18..23d39b4d0a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1979,7 +1979,7 @@ * Universal tool change settings. * Applies to all types of extruders except where explicitly noted. */ -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER // Z raise distance for tool-change, as needed for some extruders #define TOOLCHANGE_ZRAISE 2 // (mm) //#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled) @@ -2043,7 +2043,7 @@ //#define TOOLCHANGE_PARK_X_ONLY // X axis only move //#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move #endif -#endif // EXTRUDERS > 1 +#endif // HAS_MULTI_EXTRUDER /** * Advanced Pause diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 6d8f7ef819..97d69f0d72 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -595,7 +595,7 @@ SPI_Enable(SPI0); SET_OUTPUT(DAC0_SYNC); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER SET_OUTPUT(DAC1_SYNC); WRITE(DAC1_SYNC, HIGH); #endif diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index caec347bf5..3fc1dd801a 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -141,7 +141,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #error "Serial port pins (2) conflict with probe pin!" #elif IS_TX2(X_ENABLE_PIN) || IS_RX2(X_DIR_PIN) || IS_TX2(Y_ENABLE_PIN) || IS_RX2(Y_DIR_PIN) #error "Serial port pins (2) conflict with X/Y stepper pins!" - #elif EXTRUDERS > 1 && (IS_TX2(E1_ENABLE_PIN) || (AXIS_HAS_SPI(E1) && IS_TX2(E1_CS_PIN))) + #elif HAS_MULTI_EXTRUDER && (IS_TX2(E1_ENABLE_PIN) || (AXIS_HAS_SPI(E1) && IS_TX2(E1_CS_PIN))) #error "Serial port pins (2) conflict with E1 stepper pins!" #elif EXTRUDERS && (IS_RX2(E0_DIR_PIN) || IS_RX2(E0_STEP_PIN)) #error "Serial port pins (2) conflict with E stepper pins!" @@ -168,7 +168,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #error "Serial port pins (3) conflict with Z3 pins!" #elif PIN_IS_TX3(Z4_DIR) || PIN_IS_RX3(Z4_STEP) #error "Serial port pins (3) conflict with Z4 pins!" - #elif EXTRUDERS > 1 && (PIN_IS_TX3(E1_DIR) || PIN_IS_RX3(E1_STEP)) + #elif HAS_MULTI_EXTRUDER && (PIN_IS_TX3(E1_DIR) || PIN_IS_RX3(E1_STEP)) #error "Serial port pins (3) conflict with E1 pins!" #endif #undef PIN_IS_TX3 @@ -214,7 +214,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #error "One or more i2c (1) pins overlaps with Z3 pins! Disable i2c peripherals." #elif PIN_IS_SDA1(Z4_DIR) || PIN_IS_SCL1(Z4_STEP) #error "One or more i2c (1) pins overlaps with Z4 pins! Disable i2c peripherals." - #elif EXTRUDERS > 1 && (PIN_IS_SDA1(E1_DIR) || PIN_IS_SCL1(E1_STEP)) + #elif HAS_MULTI_EXTRUDER && (PIN_IS_SDA1(E1_DIR) || PIN_IS_SCL1(E1_STEP)) #error "One or more i2c (1) pins overlaps with E1 pins! Disable i2c peripherals." #endif #undef PIN_IS_SDA1 @@ -240,9 +240,9 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #error "i2c SDA2 overlaps with Z3 enable pin! Disable i2c peripherals." #elif PIN_IS_SDA2(Z4_ENABLE) #error "i2c SDA2 overlaps with Z4 enable pin! Disable i2c peripherals." - #elif EXTRUDERS > 1 && PIN_IS_SDA2(E1_ENABLE) + #elif HAS_MULTI_EXTRUDER && PIN_IS_SDA2(E1_ENABLE) #error "i2c SDA2 overlaps with E1 enable pin! Disable i2c peripherals." - #elif EXTRUDERS > 1 && AXIS_HAS_SPI(E1) && PIN_IS_SDA2(E1_CS) + #elif HAS_MULTI_EXTRUDER && AXIS_HAS_SPI(E1) && PIN_IS_SDA2(E1_CS) #error "i2c SDA2 overlaps with E1 CS pin! Disable i2c peripherals." #elif EXTRUDERS && (PIN_IS_SDA2(E0_STEP) || PIN_IS_SDA2(E0_DIR)) #error "i2c SCL2 overlaps with E0 STEP/DIR pin! Disable i2c peripherals." diff --git a/Marlin/src/feature/dac/dac_dac084s085.cpp b/Marlin/src/feature/dac/dac_dac084s085.cpp index a07dc071dd..82d17fa28f 100644 --- a/Marlin/src/feature/dac/dac_dac084s085.cpp +++ b/Marlin/src/feature/dac/dac_dac084s085.cpp @@ -21,7 +21,7 @@ void dac084s085::begin() { // All SPI chip-select HIGH SET_OUTPUT(DAC0_SYNC); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER SET_OUTPUT(DAC1_SYNC); #endif cshigh(); @@ -38,7 +38,7 @@ void dac084s085::begin() { spiSend(SPI_CHAN_DAC, externalDac_buf, COUNT(externalDac_buf)); WRITE(DAC0_SYNC, HIGH); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER //init Piggy DAC DELAY_US(2); WRITE(DAC1_SYNC, LOW); @@ -86,7 +86,7 @@ void dac084s085::setValue(const uint8_t channel, const uint8_t value) { void dac084s085::cshigh() { WRITE(DAC0_SYNC, HIGH); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER WRITE(DAC1_SYNC, HIGH); #endif WRITE(SPI_EEPROM1_CS, HIGH); diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index c0e4db0a45..e5c52562a9 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -42,7 +42,7 @@ FWRetract fwretract; // Single instance - this calls the constructor // private: -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER bool FWRetract::retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted #endif @@ -73,9 +73,7 @@ void FWRetract::reset() { LOOP_L_N(i, EXTRUDERS) { retracted[i] = false; - #if EXTRUDERS > 1 - retracted_swap[i] = false; - #endif + TERN_(HAS_MULTI_EXTRUDER, retracted_swap[i] = false); current_retract[i] = 0.0; } } @@ -92,7 +90,7 @@ void FWRetract::reset() { * included in the G-code. Use M207 Z0 to to prevent double hop. */ void FWRetract::retract(const bool retracting - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER , bool swapping/*=false*/ #endif ) { @@ -100,7 +98,7 @@ void FWRetract::retract(const bool retracting if (retracted[active_extruder] == retracting) return; // Prevent two swap-retract or recovers in a row - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER // Allow G10 S1 only after G11 if (swapping && retracted_swap[active_extruder] == retracting) return; // G11 priority to recover the long retract if activated @@ -117,7 +115,7 @@ void FWRetract::retract(const bool retracting ); LOOP_L_N(i, EXTRUDERS) { SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); #endif } @@ -180,7 +178,7 @@ void FWRetract::retract(const bool retracting retracted[active_extruder] = retracting; // Active extruder now retracted / recovered // If swap retract/recover update the retracted_swap flag too - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER if (swapping) retracted_swap[active_extruder] = retracting; #endif @@ -190,7 +188,7 @@ void FWRetract::retract(const bool retracting SERIAL_ECHOLNPAIR("active_extruder ", active_extruder); LOOP_L_N(i, EXTRUDERS) { SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); #endif } diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h index 3d68736429..134851965d 100644 --- a/Marlin/src/feature/fwretract.h +++ b/Marlin/src/feature/fwretract.h @@ -42,7 +42,7 @@ typedef struct { class FWRetract { private: - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER static bool retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted #endif @@ -75,7 +75,7 @@ public: } static void retract(const bool retracting - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER , bool swapping = false #endif ); diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 06296dd215..ed3a4b9fad 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -186,13 +186,13 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift); info.feedrate = uint16_t(feedrate_mm_s * 60.0f); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER info.active_extruder = active_extruder; #endif #if DISABLED(NO_VOLUMETRICS) info.volumetric_enabled = parser.volumetric_enabled; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER for (int8_t e = 0; e < EXTRUDERS; e++) info.filament_size[e] = planner.filament_size[e]; #else if (parser.volumetric_enabled) info.filament_size[0] = planner.filament_size[active_extruder]; @@ -369,7 +369,7 @@ void PrintJobRecovery::resume() { // Recover volumetric extrusion state #if DISABLED(NO_VOLUMETRICS) - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER for (int8_t e = 0; e < EXTRUDERS; e++) { sprintf_P(cmd, PSTR("M200 T%i D%s"), e, dtostrf(info.filament_size[e], 1, 3, str_1)); gcode.process_subcommands_now(cmd); @@ -411,7 +411,7 @@ void PrintJobRecovery::resume() { #endif // Select the previously active tool (with no_move) - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER sprintf_P(cmd, PSTR("T%i S"), info.active_extruder); gcode.process_subcommands_now(cmd); #endif @@ -543,7 +543,7 @@ void PrintJobRecovery::resume() { DEBUG_ECHOLNPAIR("feedrate: ", info.feedrate); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER DEBUG_ECHOLNPAIR("active_extruder: ", int(info.active_extruder)); #endif diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 10653493ab..1943175b05 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -58,7 +58,7 @@ typedef struct { uint16_t feedrate; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER uint8_t active_extruder; #endif diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index 0d049ede16..b57dec31f3 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfigPre.h" -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER #include "../gcode.h" #include "../../module/tool_change.h" @@ -170,4 +170,4 @@ void GcodeSuite::M217() { M217_report(); } -#endif // EXTRUDERS > 1 +#endif // HAS_MULTI_EXTRUDER diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 46cdfebf11..729f7f2223 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -23,7 +23,7 @@ #include "../gcode.h" #include "../../module/tool_change.h" -#if ENABLED(DEBUG_LEVELING_FEATURE) || EXTRUDERS > 1 +#if EITHER(HAS_MULTI_EXTRUDER, DEBUG_LEVELING_FEATURE) #include "../../module/motion.h" #endif diff --git a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp index 05f0150360..219502f28a 100644 --- a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp +++ b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp @@ -33,11 +33,11 @@ * TODO: Handle 'G10 P' for tool settings and 'G10 L' for workspace settings */ void GcodeSuite::G10() { - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER const bool rs = parser.boolval('S'); #endif fwretract.retract(true - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER , rs #endif ); diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index fe1d90109e..7c9be54b29 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -29,7 +29,7 @@ #include "../../../module/motion.h" #include "../../../module/printcounter.h" -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER #include "../../../module/tool_change.h" #endif @@ -105,7 +105,7 @@ void GcodeSuite::M600() { if (!all_axes_known()) home_all_axes(); #endif - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER // Change toolhead if specified const uint8_t active_extruder_before_filament_change = active_extruder; if (active_extruder != target_extruder && TERN1(DUAL_X_CARRIAGE, !dxc_is_duplicating())) @@ -163,7 +163,7 @@ void GcodeSuite::M600() { #endif } - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER // Restore toolhead if it was changed if (active_extruder_before_filament_change != active_extruder) tool_change(active_extruder_before_filament_change, false); diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp index a62b5cd46d..c40f3ae6e1 100644 --- a/Marlin/src/gcode/feature/pause/M603.cpp +++ b/Marlin/src/gcode/feature/pause/M603.cpp @@ -29,7 +29,7 @@ #include "../../../module/motion.h" #include "../../../module/printcounter.h" -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER #include "../../../module/tool_change.h" #endif diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index a02f2368e2..c1f7223142 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -30,7 +30,7 @@ #include "../../../module/temperature.h" #include "../../../feature/pause.h" -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER #include "../../../module/tool_change.h" #endif @@ -86,7 +86,7 @@ void GcodeSuite::M701() { // Show initial "wait for load" message TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder)); - #if EXTRUDERS > 1 && DISABLED(PRUSA_MMU2) + #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) // Change toolhead if specified uint8_t active_extruder_before_filament_change = active_extruder; if (active_extruder != target_extruder) @@ -121,7 +121,7 @@ void GcodeSuite::M701() { if (park_point.z > 0) do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); - #if EXTRUDERS > 1 && DISABLED(PRUSA_MMU2) + #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) // Restore toolhead if it was changed if (active_extruder_before_filament_change != active_extruder) tool_change(active_extruder_before_filament_change, false); @@ -186,7 +186,7 @@ void GcodeSuite::M702() { // Show initial "wait for unload" message TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder)); - #if EXTRUDERS > 1 && DISABLED(PRUSA_MMU2) + #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) // Change toolhead if specified uint8_t active_extruder_before_filament_change = active_extruder; if (active_extruder != target_extruder) @@ -201,7 +201,7 @@ void GcodeSuite::M702() { #if ENABLED(PRUSA_MMU2) mmu2.unload(); #else - #if EXTRUDERS > 1 && ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) + #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS) if (!parser.seenval('T')) { HOTEND_LOOP() { if (e != active_extruder) tool_change(e, false); @@ -227,7 +227,7 @@ void GcodeSuite::M702() { if (park_point.z > 0) do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); - #if EXTRUDERS > 1 && DISABLED(PRUSA_MMU2) + #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) // Restore toolhead if it was changed if (active_extruder_before_filament_change != active_extruder) tool_change(active_extruder_before_filament_change, false); diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index c1b6deeadd..39276bc729 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -614,7 +614,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 211: M211(); break; // M211: Enable, Disable, and/or Report software endstops #endif - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER case 217: M217(); break; // M217: Set filament swap parameters #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 2427301262..085f6b3618 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -661,9 +661,7 @@ private: static void M211(); - #if EXTRUDERS > 1 - static void M217(); - #endif + TERN_(HAS_MULTI_EXTRUDER, static void M217()); TERN_(HAS_HOTEND_OFFSET, static void M218()); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index d5ef62b621..95c93beb9e 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -501,6 +501,8 @@ #undef MK2_MULTIPLEXER #undef PRUSA_MMU2 #undef HOTEND_IDLE_TIMEOUT +#elif EXTRUDERS > 1 + #define HAS_MULTI_EXTRUDER 1 #endif #if ENABLED(SWITCHING_EXTRUDER) // One stepper for every two EXTRUDERS diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 2b232623a3..2ae4f4e399 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2334,7 +2334,7 @@ #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 #endif -#if EXTRUDERS > 1 && !defined(TOOLCHANGE_FS_EXTRA_PRIME) +#if HAS_MULTI_EXTRUDER && !defined(TOOLCHANGE_FS_EXTRA_PRIME) #define TOOLCHANGE_FS_EXTRA_PRIME 0 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9f15d7e5e3..8d68b33ece 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -865,7 +865,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Options only for EXTRUDERS > 1 */ -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER #if EXTRUDERS > 8 #error "Marlin supports a maximum of 8 EXTRUDERS." @@ -987,7 +987,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * Mixing Extruder requirements */ #if ENABLED(MIXING_EXTRUDER) - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER #error "For MIXING_EXTRUDER set MIXING_STEPPERS > 1 instead of EXTRUDERS > 1." #elif MIXING_STEPPERS < 2 #error "You must set MIXING_STEPPERS >= 2 for a mixing extruder." diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp index 6044d0a951..7f3f507fd6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -96,7 +96,7 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { #else PIN_DISABLED(1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT) #endif - #if ENABLED(FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) && EXTRUDERS > 1 + #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT_STATE) #else PIN_DISABLED(3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp index fb90ae1133..8a5c675fac 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp @@ -34,7 +34,7 @@ void LinearAdvanceScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(2, DEFAULT_LOWEST).color(e_axis); w.heading( GET_TEXT_F(MSG_LINEAR_ADVANCE)); - #if EXTRUDERS == 1 + #if !HAS_MULTI_EXTRUDER w.adjuster( 2, GET_TEXT_F(MSG_LINEAR_ADVANCE_K), getLinearAdvance_mm_mm_s(E0) ); #else w.adjuster( 2, GET_TEXT_F(MSG_LINEAR_ADVANCE_K1), getLinearAdvance_mm_mm_s(E0) ); @@ -55,7 +55,7 @@ bool LinearAdvanceScreen::onTouchHeld(uint8_t tag) { switch (tag) { case 2: UI_DECREMENT(LinearAdvance_mm_mm_s, E0); break; case 3: UI_INCREMENT(LinearAdvance_mm_mm_s, E0); break; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER case 4: UI_DECREMENT(LinearAdvance_mm_mm_s, E1); break; case 5: UI_INCREMENT(LinearAdvance_mm_mm_s, E1); break; #if EXTRUDERS > 2 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp index 95e29c197d..2316f93ee2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp @@ -41,7 +41,7 @@ void MaxVelocityScreen::onRedraw(draw_mode_t what) { w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_VMAX_Z), getAxisMaxFeedrate_mm_s(Z) ); #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_VMAX_E), getAxisMaxFeedrate_mm_s(E0) ); - #elif EXTRUDERS > 1 + #elif HAS_MULTI_EXTRUDER w.heading(GET_TEXT_F(MSG_VMAX_E)); w.color(e_axis) .adjuster( 8, F(LCD_STR_E0), getAxisMaxFeedrate_mm_s(E0) ); w.color(e_axis) .adjuster( 10, F(LCD_STR_E1), getAxisMaxFeedrate_mm_s(E1) ); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index 14ca6fe297..5dd3174821 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -55,7 +55,7 @@ void MoveAxisScreen::onRedraw(draw_mode_t what) { w.color(Theme::e_axis); #if EXTRUDERS == 1 w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); - #elif EXTRUDERS > 1 + #elif HAS_MULTI_EXTRUDER w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1)); #if EXTRUDERS > 2 @@ -82,7 +82,7 @@ bool MoveAxisScreen::onTouchHeld(uint8_t tag) { // For extruders, also update relative distances. case 8: UI_DECREMENT_AXIS(E0); screen_data.MoveAxisScreen.e_rel[0] -= increment; break; case 9: UI_INCREMENT_AXIS(E0); screen_data.MoveAxisScreen.e_rel[0] += increment; break; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER case 10: UI_DECREMENT_AXIS(E1); screen_data.MoveAxisScreen.e_rel[1] -= increment; break; case 11: UI_INCREMENT_AXIS(E1); screen_data.MoveAxisScreen.e_rel[1] += increment; break; #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp index 091ad8f124..ed3c8d999b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp @@ -33,7 +33,7 @@ using namespace ExtUI; void NudgeNozzleScreen::onEntry() { screen_data.NudgeNozzleScreen.show_offsets = false; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER screen_data.NudgeNozzleScreen.link_nozzles = true; #endif screen_data.NudgeNozzleScreen.rel.reset(); @@ -52,11 +52,11 @@ void NudgeNozzleScreen::onRedraw(draw_mode_t what) { #endif w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), screen_data.NudgeNozzleScreen.rel.z / getAxisSteps_per_mm(Z)); w.increments(); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER w.toggle(8, GET_TEXT_F(MSG_ADJUST_BOTH_NOZZLES), screen_data.NudgeNozzleScreen.link_nozzles); #endif - #if EXTRUDERS > 1 || HAS_BED_PROBE + #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE w.toggle(9, GET_TEXT_F(MSG_SHOW_OFFSETS), screen_data.NudgeNozzleScreen.show_offsets); if (screen_data.NudgeNozzleScreen.show_offsets) { @@ -82,7 +82,7 @@ void NudgeNozzleScreen::onRedraw(draw_mode_t what) { bool NudgeNozzleScreen::onTouchHeld(uint8_t tag) { const float inc = getIncrement(); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER const bool link = screen_data.NudgeNozzleScreen.link_nozzles; #else constexpr bool link = true; @@ -95,13 +95,13 @@ bool NudgeNozzleScreen::onTouchHeld(uint8_t tag) { case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); screen_data.NudgeNozzleScreen.rel.y += steps; break; case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); screen_data.NudgeNozzleScreen.rel.z -= steps; break; case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); screen_data.NudgeNozzleScreen.rel.z += steps; break; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER case 8: screen_data.NudgeNozzleScreen.link_nozzles = !link; break; #endif case 9: screen_data.NudgeNozzleScreen.show_offsets = !screen_data.NudgeNozzleScreen.show_offsets; break; default: return false; } - #if EXTRUDERS > 1 || HAS_BED_PROBE + #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE SaveSettingsDialogBox::settingsChanged(); #endif return true; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index a274fef9e7..dc38890a0e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -86,7 +86,7 @@ union screen_data_t { struct { struct base_numeric_adjustment_t placeholder; xyz_int_t rel; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER bool link_nozzles; #endif bool show_offsets; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp index a8e948a9c3..e89bbd2020 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp @@ -40,7 +40,7 @@ void StepperCurrentScreen::onRedraw(draw_mode_t what) { w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ); #if EXTRUDERS == 1 w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AXIS_E), getAxisCurrent_mA(E0) ); - #elif EXTRUDERS > 1 + #elif HAS_MULTI_EXTRUDER w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), getAxisCurrent_mA(E0) ); w.color(e_axis).adjuster(10, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) ); #if EXTRUDERS > 2 @@ -64,7 +64,7 @@ bool StepperCurrentScreen::onTouchHeld(uint8_t tag) { case 7: UI_INCREMENT(AxisCurrent_mA, Z ); break; case 8: UI_DECREMENT(AxisCurrent_mA, E0); break; case 9: UI_INCREMENT(AxisCurrent_mA, E0); break; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER case 10: UI_DECREMENT(AxisCurrent_mA, E1); break; case 11: UI_INCREMENT(AxisCurrent_mA, E1); break; #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp index f3957c0173..92035d1b1c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp @@ -40,7 +40,7 @@ void StepsScreen::onRedraw(draw_mode_t what) { w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisSteps_per_mm(Z) ); #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_E), getAxisSteps_per_mm(E0) ); - #elif EXTRUDERS > 1 + #elif HAS_MULTI_EXTRUDER w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), getAxisSteps_per_mm(E0) ); w.color(e_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_E2), getAxisSteps_per_mm(E1) ); #if EXTRUDERS > 2 @@ -64,7 +64,7 @@ bool StepsScreen::onTouchHeld(uint8_t tag) { case 7: UI_INCREMENT(AxisSteps_per_mm, Z); break; case 8: UI_DECREMENT(AxisSteps_per_mm, E0); break; case 9: UI_INCREMENT(AxisSteps_per_mm, E0); break; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER case 10: UI_DECREMENT(AxisSteps_per_mm, E1); break; case 11: UI_INCREMENT(AxisSteps_per_mm, E1); break; #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp index 321c608abd..0f1fdaceac 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -127,9 +127,7 @@ void StressTestScreen::onIdle() { injectCommands_P(PSTR( "G0 X100 Y100 Z100 F6000\n" "T0\nG4 S1" - #if EXTRUDERS > 1 - "\nT1\nG4 S1" - #endif + TERN_(HAS_MULTI_EXTRUDER, "\nT1\nG4 S1") "\nG0 X150 Y150 Z150" )); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index 264d528c03..3589b96d6a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -70,7 +70,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { //planner.flow_percentage[1] = planner.flow_percentage[0]; //planner.e_factor[1]= planner.flow_percentage[1]*0.01; planner.refresh_e_factor(0); - if (EXTRUDERS == 2) { + #if HAS_MULTI_EXTRUDER planner.flow_percentage[1] = planner.flow_percentage[0]; planner.refresh_e_factor(1); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index aad5e4362e..3b4fc8d207 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -95,7 +95,7 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { //saved_feedrate_percentage = feedrate_percentage; planner.flow_percentage[0] = 100; planner.e_factor[0] = planner.flow_percentage[0] * 0.01f; - #if EXTRUDERS == 2 + #if HAS_MULTI_EXTRUDER planner.flow_percentage[1] = 100; planner.e_factor[1] = planner.flow_percentage[1] * 0.01f; #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index ca84b4b5ec..95d0a15bea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -90,7 +90,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - if (EXTRUDERS == 2) { + if (ENABLED(HAS_MULTI_EXTRUDER)) { if (uiCfg.curSprayerChoose == 0) { uiCfg.curSprayerChoose = 1; queue.inject_P(PSTR("T1")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 801114e6b2..196522b8d4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -61,7 +61,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } } - #if !defined(SINGLENOZZLE) && EXTRUDERS >= 2 + #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); @@ -117,7 +117,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (uiCfg.curTempType == 0) { - if (EXTRUDERS == 2) { + if (ENABLED(HAS_MULTI_EXTRUDER)) { if (uiCfg.curSprayerChoose == 0) { uiCfg.curSprayerChoose = 1; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 2079ed8245..e5a7bb18d9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -242,8 +242,10 @@ void lv_draw_printing(void) { #endif // if 1 lv_obj_set_pos(buttonExt1, 205, 136); - if (EXTRUDERS == 2) + + #if HAS_MULTI_EXTRUDER lv_obj_set_pos(buttonExt2, 350, 136); + #endif #if HAS_HEATED_BED lv_obj_set_pos(buttonBedstate, 205, 186); @@ -275,11 +277,11 @@ void lv_draw_printing(void) { lv_obj_set_style(labelExt1, &tft_style_label_rel); lv_obj_set_pos(labelExt1, 250, 146); - if (EXTRUDERS == 2) { + #if HAS_MULTI_EXTRUDER labelExt2 = lv_label_create(scr, NULL); lv_obj_set_style(labelExt2, &tft_style_label_rel); lv_obj_set_pos(labelExt2, 395, 146); - } + #endif #if HAS_HEATED_BED labelBed = lv_label_create(scr, NULL); @@ -344,11 +346,11 @@ void disp_ext_temp() { sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target); lv_label_set_text(labelExt1, public_buf_l); - if (EXTRUDERS == 2) { + #if HAS_MULTI_EXTRUDER ZERO(public_buf_l); sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target); lv_label_set_text(labelExt2, public_buf_l); - } + #endif } void disp_bed_temp() { diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 1637d32877..afc9c6692e 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -61,7 +61,7 @@ #include "../../libs/numtostr.h" #endif -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER #include "../../module/tool_change.h" #endif @@ -348,7 +348,7 @@ namespace ExtUI { } void setActiveTool(const extruder_t extruder, bool no_move) { - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER const uint8_t e = extruder - E0; if (e != active_extruder) tool_change(e, no_move); active_extruder = e; @@ -699,21 +699,17 @@ namespace ExtUI { */ void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles) { const float mm = steps * planner.steps_to_mm[axis]; + UNUSED(mm); if (!babystepAxis_steps(steps, axis)) return; #if ENABLED(BABYSTEP_ZPROBE_OFFSET) // Make it so babystepping in Z adjusts the Z probe offset. - if (axis == Z - #if EXTRUDERS > 1 - && (linked_nozzles || active_extruder == 0) - #endif - ) probe.offset.z += mm; - #else - UNUSED(mm); + if (axis == Z && TERN1(HAS_MULTI_EXTRUDER, linked_nozzles || active_extruder == 0)) + probe.offset.z += mm; #endif - #if EXTRUDERS > 1 && HAS_HOTEND_OFFSET + #if HAS_MULTI_EXTRUDER && HAS_HOTEND_OFFSET /** * When linked_nozzles is false, as an axis is babystepped * adjust the hotend offsets so that the other nozzles are @@ -730,7 +726,6 @@ namespace ExtUI { } #else UNUSED(linked_nozzles); - UNUSED(mm); #endif } diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 9978bc7eab..5bca89141f 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -111,7 +111,7 @@ void menu_backlash(); #if ENABLED(LIN_ADVANCE) #if EXTRUDERS == 1 EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); - #elif EXTRUDERS > 1 + #elif HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); #endif @@ -122,7 +122,7 @@ void menu_backlash(); #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) EDIT_ITEM_FAST(float42_52, MSG_VOLUMETRIC_LIMIT, &planner.volumetric_extruder_limit[active_extruder], 0.0f, 20.0f, planner.calculate_volumetric_extruder_limits); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) EDIT_ITEM_FAST_N(float42_52, n, MSG_VOLUMETRIC_LIMIT_E, &planner.volumetric_extruder_limit[n], 0.0f, 20.00f, planner.calculate_volumetric_extruder_limits); #endif @@ -130,7 +130,7 @@ void menu_backlash(); if (parser.volumetric_enabled) { EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) EDIT_ITEM_FAST_N(float43, n, MSG_FILAMENT_DIAM_E, &planner.filament_size[n], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); #endif @@ -141,13 +141,13 @@ void menu_backlash(); constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999); EDIT_ITEM_FAST(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTUNLOAD_E, &fc_settings[n].unload_length, 0, extrude_maxlength); #endif EDIT_ITEM_FAST(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTLOAD_E, &fc_settings[n].load_length, 0, extrude_maxlength); #endif @@ -583,7 +583,7 @@ void menu_advanced_settings() { #elif ENABLED(LIN_ADVANCE) #if EXTRUDERS == 1 EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); - #elif EXTRUDERS > 1 + #elif HAS_MULTI_EXTRUDER LOOP_L_N(n, E_STEPPERS) EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index a77e9a7354..2953b3b464 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -94,7 +94,7 @@ void menu_advanced_settings(); #endif -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER #include "../../module/tool_change.h" @@ -280,17 +280,17 @@ void menu_advanced_settings(); EDIT_ITEM(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract); #endif EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100); #endif EDIT_ITEM(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999); EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999); EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_extra, -100, 100); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_extra, -100, 100); #endif EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999); - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999); #endif END_MENU(); @@ -380,7 +380,7 @@ void menu_configuration() { // // Set single nozzle filament retract and prime length // - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER SUBMENU(MSG_TOOL_CHANGE, menu_tool_change); #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) SUBMENU(MSG_TOOL_MIGRATION, menu_toolchange_migration); diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index c02906f7f9..758d75c8e9 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -215,7 +215,7 @@ void menu_tune() { #if EXTRUDERS EDIT_ITEM(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, []{ planner.refresh_e_factor(active_extruder); }); // Flow En: - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) EDIT_ITEM_N(int3, n, MSG_FLOW_N, &planner.flow_percentage[n], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); #endif @@ -227,7 +227,7 @@ void menu_tune() { #if ENABLED(LIN_ADVANCE) && DISABLED(SLIM_LCD_MENUS) #if EXTRUDERS == 1 EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); - #elif EXTRUDERS > 1 + #elif HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); #endif diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index b30f6e49c9..fc55c3c2f6 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -695,7 +695,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { #if IS_KINEMATIC - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER const int8_t old_extruder = active_extruder; if (axis == E_AXIS) active_extruder = e_index; #endif @@ -716,9 +716,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { prepare_internal_move_to_destination(fr_mm_s); // will set current_position from destination processing = false; - #if EXTRUDERS > 1 - active_extruder = old_extruder; - #endif + TERN_(HAS_MULTI_EXTRUDER, active_extruder = old_extruder); #else diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 1169ede2dc..a3a89736e5 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -505,7 +505,7 @@ void Endstops::update() { // With Dual X, endstops are only checked in the homing direction for the active extruder #if ENABLED(DUAL_X_CARRIAGE) - #define E0_ACTIVE stepper.movement_extruder() == 0 + #define E0_ACTIVE stepper.last_moved_extruder == 0 #define X_MIN_TEST() ((X_HOME_DIR < 0 && E0_ACTIVE) || (X2_HOME_DIR < 0 && !E0_ACTIVE)) #define X_MAX_TEST() ((X_HOME_DIR > 0 && E0_ACTIVE) || (X2_HOME_DIR > 0 && !E0_ACTIVE)) #else diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 2f12302e59..b904309018 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -111,7 +111,7 @@ xyze_pos_t destination; // {0} #endif // The active extruder (tool). Set with T command. -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER uint8_t active_extruder = 0; // = 0 #endif diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 052e3180c8..2b108b0531 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -98,7 +98,7 @@ extern feedRate_t feedrate_mm_s; extern int16_t feedrate_percentage; // The active extruder (tool). Set with T command. -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER extern uint8_t active_extruder; #else constexpr uint8_t active_extruder = 0; diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 82c62ed579..30e1ffb0ca 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1992,7 +1992,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->e_to_p_pressure = baricuda_e_to_p_pressure; #endif - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER block->extruder = extruder; #endif @@ -2843,7 +2843,7 @@ bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, con FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; #endif - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER block->extruder = extruder; #endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index f3a3a0e0fc..660d9ad5aa 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -164,7 +164,7 @@ typedef struct block_t { }; uint32_t step_event_count; // The number of step events required to complete this block - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER uint8_t extruder; // The extruder to move (if E move) #else static constexpr uint8_t extruder = 0; diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 3cb88da4ee..6608b40332 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -115,7 +115,7 @@ extern float other_extruder_advance_K[EXTRUDERS]; #endif -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER #include "tool_change.h" void M217_report(const bool eeprom); #endif @@ -388,7 +388,7 @@ typedef struct SettingsDataStruct { // // Tool-change settings // - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER toolchange_settings_t toolchange_settings; // M217 S P R #endif @@ -1320,7 +1320,7 @@ void MarlinSettings::postprocess() { // Multiple Extruders // - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER _FIELD_TEST(toolchange_settings); EEPROM_WRITE(toolchange_settings); #endif @@ -2167,7 +2167,7 @@ void MarlinSettings::postprocess() { // // Tool-change settings // - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER _FIELD_TEST(toolchange_settings); EEPROM_READ(toolchange_settings); #endif @@ -2488,7 +2488,7 @@ void MarlinSettings::reset() { // Tool-change Settings // - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) toolchange_settings.swap_length = TOOLCHANGE_FS_LENGTH; toolchange_settings.extra_resume = TOOLCHANGE_FS_EXTRA_RESUME_LENGTH; @@ -3719,7 +3719,7 @@ void MarlinSettings::reset() { #endif #endif - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER CONFIG_ECHO_HEADING("Tool-changing:"); CONFIG_ECHO_START(); M217_report(true); diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index fab1a61548..56a75d1b48 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -155,7 +155,7 @@ uint8_t Stepper::last_direction_bits, // = 0 bool Stepper::abort_current_block; -#if DISABLED(MIXING_EXTRUDER) && EXTRUDERS > 1 +#if DISABLED(MIXING_EXTRUDER) && HAS_MULTI_EXTRUDER uint8_t Stepper::last_moved_extruder = 0xFF; #endif @@ -191,7 +191,7 @@ uint32_t Stepper::advance_divisor = 0, Stepper::decelerate_after, // The count at which to start decelerating Stepper::step_event_count; // The total event count for the current block -#if EXTRUDERS > 1 || ENABLED(MIXING_EXTRUDER) +#if EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) uint8_t Stepper::stepper_extruder; #else constexpr uint8_t Stepper::stepper_extruder; @@ -357,11 +357,11 @@ xyze_int8_t Stepper::count_direction{0}; #elif ENABLED(DUAL_X_CARRIAGE) #define X_APPLY_DIR(v,ALWAYS) do{ \ if (extruder_duplication_enabled || ALWAYS) { X_DIR_WRITE(v); X2_DIR_WRITE(mirrored_duplication_mode ? !(v) : v); } \ - else if (movement_extruder()) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ + else if (last_moved_extruder) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ }while(0) #define X_APPLY_STEP(v,ALWAYS) do{ \ if (extruder_duplication_enabled || ALWAYS) { X_STEP_WRITE(v); X2_STEP_WRITE(v); } \ - else if (movement_extruder()) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ + else if (last_moved_extruder) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ }while(0) #else #define X_APPLY_DIR(v,Q) X_DIR_WRITE(v) @@ -2131,7 +2131,7 @@ uint32_t Stepper::block_phase_isr() { MIXER_STEPPER_SETUP(); #endif - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER stepper_extruder = current_block->extruder; #endif @@ -2156,7 +2156,7 @@ uint32_t Stepper::block_phase_isr() { || TERN(MIXING_EXTRUDER, false, stepper_extruder != last_moved_extruder) ) { last_direction_bits = current_block->direction_bits; - #if EXTRUDERS > 1 + #if HAS_MULTI_EXTRUDER last_moved_extruder = stepper_extruder; #endif diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 3b68553689..f83142444a 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -263,10 +263,10 @@ class Stepper { static bool abort_current_block; // Signals to the stepper that current block should be aborted // Last-moved extruder, as set when the last movement was fetched from planner - #if EXTRUDERS < 2 - static constexpr uint8_t last_moved_extruder = 0; - #elif DISABLED(MIXING_EXTRUDER) + #if HAS_MULTI_EXTRUDER static uint8_t last_moved_extruder; + #else + static constexpr uint8_t last_moved_extruder = 0; #endif #if ENABLED(X_DUAL_ENDSTOPS) @@ -304,7 +304,7 @@ class Stepper { decelerate_after, // The point from where we need to start decelerating step_event_count; // The total event count for the current block - #if EXTRUDERS > 1 || ENABLED(MIXING_EXTRUDER) + #if EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) static uint8_t stepper_extruder; #else static constexpr uint8_t stepper_extruder = 0; @@ -451,11 +451,6 @@ class Stepper { // The last movement direction was not null on the specified axis. Note that motor direction is not necessarily the same. FORCE_INLINE static bool axis_is_moving(const AxisEnum axis) { return TEST(axis_did_move, axis); } - // The extruder associated to the last movement - FORCE_INLINE static uint8_t movement_extruder() { - return (EXTRUDERS > 1 && DISABLED(MIXING_EXTRUDER)) ? last_moved_extruder : 0; - } - // Handle a triggered endstop static void endstop_triggered(const AxisEnum axis); diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 8557560266..0f823cfbd0 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -36,7 +36,7 @@ #define DEBUG_OUT ENABLED(DEBUG_TOOL_CHANGE) #include "../core/debug_out.h" -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER toolchange_settings_t toolchange_settings; // Initialized by settings.load() #endif @@ -870,7 +870,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (new_tool) invalid_extruder_error(new_tool); return; - #else // EXTRUDERS > 1 + #elif HAS_MULTI_EXTRUDER planner.synchronize(); @@ -1197,7 +1197,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(active_extruder)); - #endif // EXTRUDERS > 1 + #endif // HAS_MULTI_EXTRUDER } #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index d0cb57841b..38347191d3 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -24,7 +24,7 @@ #include "../inc/MarlinConfigPre.h" #include "../core/types.h" -#if EXTRUDERS > 1 +#if HAS_MULTI_EXTRUDER typedef struct { #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h index 5f61389cf9..169f74b437 100644 --- a/Marlin/src/pins/sensitive_pins.h +++ b/Marlin/src/pins/sensitive_pins.h @@ -354,7 +354,7 @@ #endif #endif -#elif EXTRUDERS > 1 || ENABLED(MIXING_EXTRUDER) +#elif EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) #undef _E1_PINS #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, _E1_CS _E1_MS1 _E1_MS2 _E1_MS3 @@ -383,7 +383,7 @@ #endif // EXTRUDERS > 3 || MIXING_EXTRUDER > 3 #endif // EXTRUDERS > 2 || MIXING_EXTRUDER > 2 -#endif // EXTRUDERS > 1 || MIXING_EXTRUDER +#endif // HAS_MULTI_EXTRUDER || MIXING_EXTRUDER // // Heaters, Fans, Temp Sensors diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index e27e628b9a..e88e74e81d 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -91,9 +91,6 @@ #if EXTRUDERS #define HAS_EXTRUDERS - #if EXTRUDERS > 1 - #define HAS_MULTI_EXTRUDER - #endif #endif #if HAS_LCD_MENU From ee1232051c718834567acb7df93f385c1c5227a4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 20 Sep 2020 19:07:59 -0500 Subject: [PATCH 0263/1370] Cleanup before MKS changes --- Marlin/src/HAL/DUE/usb/compiler.h | 39 ++--- Marlin/src/HAL/STM32/tft/tft_fsmc.cpp | 2 +- .../archim2-flash/flash_storage.cpp | 12 +- .../ftdi_eve_lib/extended/dl_cache.cpp | 3 +- .../ftdi_eve_lib/extended/grid_layout.h | 4 +- .../ftdi_eve_lib/extended/screen_types.cpp | 5 +- .../ftdi_eve_lib/extended/text_box.cpp | 8 +- .../ftdi_eve_lib/extended/text_ellipsis.cpp | 6 +- .../screens/bed_mesh_screen.cpp | 4 +- .../screens/files_screen.cpp | 2 +- .../screens/interface_settings_screen.cpp | 4 +- .../screens/interface_sounds_screen.cpp | 2 +- .../screens/status_screen.cpp | 13 +- .../screens/stress_test_screen.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_about.h | 4 +- .../lib/mks_ui/draw_acceleration_settings.h | 4 +- .../extui/lib/mks_ui/draw_advance_settings.h | 4 +- .../extui/lib/mks_ui/draw_change_speed.cpp | 24 +-- .../lcd/extui/lib/mks_ui/draw_change_speed.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 4 +- .../extui/lib/mks_ui/draw_eeprom_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_error_message.h | 4 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 21 ++- .../src/lcd/extui/lib/mks_ui/draw_extrusion.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 27 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 1 - Marlin/src/lcd/extui/lib/mks_ui/draw_home.h | 4 +- .../lcd/extui/lib/mks_ui/draw_jerk_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_language.cpp | 21 +-- .../src/lcd/extui/lib/mks_ui/draw_language.h | 4 +- .../lcd/extui/lib/mks_ui/draw_machine_para.h | 4 +- .../extui/lib/mks_ui/draw_machine_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 16 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.h | 4 +- .../lib/mks_ui/draw_max_feedrate_settings.h | 4 +- .../extui/lib/mks_ui/draw_motor_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 20 +-- .../lcd/extui/lib/mks_ui/draw_move_motor.h | 4 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 15 +- .../lcd/extui/lib/mks_ui/draw_number_key.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_operation.h | 4 +- .../lcd/extui/lib/mks_ui/draw_pause_message.h | 4 +- .../extui/lib/mks_ui/draw_pause_position.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 13 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.h | 4 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_print_file.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_printing.h | 4 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 10 +- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.h | 4 +- .../lcd/extui/lib/mks_ui/draw_step_settings.h | 4 +- .../lib/mks_ui/draw_tmc_current_settings.cpp | 1 + .../lib/mks_ui/draw_tmc_current_settings.h | 4 +- .../lib/mks_ui/draw_tmc_step_mode_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 4 +- .../extui/lib/mks_ui/printer_operation.cpp | 1 + .../lcd/extui/lib/mks_ui/printer_operation.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h | 4 +- Marlin/src/lcd/tft/st7796s.h | 164 +++++++++--------- Marlin/src/pins/pins.h | 20 +-- 66 files changed, 294 insertions(+), 318 deletions(-) diff --git a/Marlin/src/HAL/DUE/usb/compiler.h b/Marlin/src/HAL/DUE/usb/compiler.h index 7b746543c4..879007fa2a 100644 --- a/Marlin/src/HAL/DUE/usb/compiler.h +++ b/Marlin/src/HAL/DUE/usb/compiler.h @@ -173,11 +173,11 @@ # define __always_inline __forceinline #elif (defined __GNUC__) #ifdef __always_inline -# undef __always_inline +# undef __always_inline #endif -# define __always_inline inline __attribute__((__always_inline__)) +# define __always_inline inline __attribute__((__always_inline__)) #elif (defined __ICCARM__) -# define __always_inline _Pragma("inline=forced") +# define __always_inline _Pragma("inline=forced") #endif /** @@ -188,11 +188,11 @@ * heuristics and not inline the function. */ #ifdef __CC_ARM -# define __no_inline __attribute__((noinline)) +# define __no_inline __attribute__((noinline)) #elif (defined __GNUC__) -# define __no_inline __attribute__((__noinline__)) +# define __no_inline __attribute__((__noinline__)) #elif (defined __ICCARM__) -# define __no_inline _Pragma("inline=never") +# define __no_inline _Pragma("inline=never") #endif /*! \brief This macro is used to test fatal errors. @@ -211,9 +211,9 @@ # else #undef TEST_SUITE_DEFINE_ASSERT_MACRO # define Assert(expr) \ - {\ - if (!(expr)) while (true);\ - } + {\ + if (!(expr)) while (true);\ + } # endif #else # define Assert(expr) ((void) 0) @@ -1106,17 +1106,16 @@ static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data) /* Converts a 8 Byte array into a 32-Bit value */ static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data) { - union - { - uint32_t u32; - uint8_t u8[8]; - }long_addr; - uint8_t index; - for (index = 0; index < 4; index++) - { - long_addr.u8[index] = *data++; - } - return long_addr.u32; + union + { + uint32_t u32; + uint8_t u8[8]; + }long_addr; + uint8_t index; + for (index = 0; index < 4; index++) { + long_addr.u8[index] = *data++; + } + return long_addr.u32; } /** diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp index f11fab39db..3a080d5e27 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp @@ -87,7 +87,7 @@ void TFT_FSMC::Init() { __HAL_RCC_FSMC_CLK_ENABLE(); - for(uint16_t i = 0; PinMap_FSMC[i].pin != NC; i++) + for (uint16_t i = 0; PinMap_FSMC[i].pin != NC; i++) pinmap_pinout(PinMap_FSMC[i].pin, PinMap_FSMC); pinmap_pinout(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); pinmap_pinout(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp index 0c38c8216c..6a635b9ddb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp @@ -188,7 +188,7 @@ bool UIFlashStorage::is_present = false; } void UIFlashStorage::initialize() { - for(uint8_t i = 0; i < 10; i++) { + for (uint8_t i = 0; i < 10; i++) { if (check_known_device()) { is_present = true; break; @@ -239,7 +239,7 @@ bool UIFlashStorage::is_present = false; uint16_t stride = 4 + block_size; int32_t read_offset = -1; - for(uint32_t offset = 0; offset < (data_storage_area_size - stride); offset += stride) { + for (uint32_t offset = 0; offset < (data_storage_area_size - stride); offset += stride) { uint32_t delim; spi_read_begin(offset); spi_read_bulk (&delim, sizeof(delim)); @@ -395,9 +395,8 @@ bool UIFlashStorage::is_present = false; uint32_t UIFlashStorage::get_media_file_start(uint8_t slot) { uint32_t addr = media_storage_addr + sizeof(uint32_t) * media_storage_slots; spi_read_begin(media_storage_addr); - for(uint8_t i = 0; i < slot; i++) { + for (uint8_t i = 0; i < slot; i++) addr += spi_read_32(); - } spi_read_end(); return addr; } @@ -442,7 +441,7 @@ bool UIFlashStorage::is_present = false; addr = get_media_file_start(slot); // Write out the file itself - for(;;) { + for (;;) { const int16_t nBytes = reader.read(buff, write_page_size); if (nBytes == -1) { SERIAL_ECHOLNPGM("Failed to read from file"); @@ -450,8 +449,7 @@ bool UIFlashStorage::is_present = false; } addr = write(addr, buff, nBytes); - if (nBytes != write_page_size) - break; + if (nBytes != write_page_size) break; TERN_(EXTENSIBLE_UI, ExtUI::yield()); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp index f736916a3b..baed9f8502 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -69,9 +69,8 @@ using namespace FTDI; void DLCache::init() { CLCD::mem_write_32(DL_FREE_ADDR, DL_FREE_ADDR + 4); - for(uint8_t slot = 0; slot < DL_CACHE_SLOTS; slot++) { + for (uint8_t slot = 0; slot < DL_CACHE_SLOTS; slot++) save_slot(slot, 0, 0, 0); - } } bool DLCache::has_data() { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h index 1975d36af7..e3c3ebb39d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h @@ -74,12 +74,12 @@ #define DRAW_LAYOUT_GRID \ { \ cmd.cmd(LINE_WIDTH(4)); \ - for(int i = 1; i <= GRID_COLS; i++) { \ + for (int i = 1; i <= GRID_COLS; i++) { \ cmd.cmd(BEGIN(LINES)); \ cmd.cmd(VERTEX2F(GRID_X(i) *16, 0 *16)); \ cmd.cmd(VERTEX2F(GRID_X(i) *16, FTDI::display_height *16)); \ } \ - for(int i = 1; i < GRID_ROWS; i++) { \ + for (int i = 1; i < GRID_ROWS; i++) { \ cmd.cmd(BEGIN(LINES)); \ cmd.cmd(VERTEX2F(0 *16, GRID_Y(i) *16)); \ cmd.cmd(VERTEX2F(FTDI::display_width *16, GRID_Y(i) *16)); \ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp index bebee5467d..57a9e3e89b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp @@ -26,7 +26,7 @@ /********************** VIRTUAL DISPATCH DATA TYPE ******************************/ uint8_t ScreenRef::lookupScreen(onRedraw_func_t onRedraw_ptr) { - for(uint8_t type = 0; type < functionTableSize; type++) { + for (uint8_t type = 0; type < functionTableSize; type++) { if (GET_METHOD(type, onRedraw) == onRedraw_ptr) { return type; } @@ -50,9 +50,8 @@ void ScreenRef::setScreen(onRedraw_func_t onRedraw_ptr) { } void ScreenRef::initializeAll() { - for(uint8_t type = 0; type < functionTableSize; type++) { + for (uint8_t type = 0; type < functionTableSize; type++) GET_METHOD(type, onStartup)(); - } } /********************** SCREEN STACK ******************************/ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp index 9600bd1289..3616f15ab6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp @@ -34,7 +34,7 @@ namespace FTDI { const char *p = str; end = str; uint16_t lw = 0, result = 0; - for(;;) { + for (;;) { utf8_char_t c = get_utf8_char_and_inc(p); if (c == ' ' || c == '\n' || c == '\0') { if (lw < w || end == str) { @@ -60,7 +60,7 @@ namespace FTDI { const char *line_end; const uint16_t wrap_width = width; width = height = 0; - for(;;) { + for (;;) { uint16_t line_width = find_line_break(fm, wrap_width, line_start, line_end); if (line_end == line_start) break; width = max(width, line_width); @@ -78,7 +78,7 @@ namespace FTDI { FontMetrics fm(font); // Shrink the font until we find a font that fits - for(;;) { + for (;;) { box_width = w; measure_text_box(fm, str, box_width, box_height); if (box_width <= (uint16_t)w && box_height <= (uint16_t)h) break; @@ -91,7 +91,7 @@ namespace FTDI { const char *line_start = str; const char *line_end; - for(;;) { + for (;;) { find_line_break(fm, w, line_start, line_end); if (line_end == line_start) break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp index 266b6efdab..b2f62f060c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -37,13 +37,13 @@ namespace FTDI { // split and still allow the ellipsis to fit. int16_t lineWidth = 0; char *breakPoint = str; - for(char* c = str; *c; c++) { + for (char* c = str; *c; c++) { lineWidth += fm.get_char_width(*c); - if(lineWidth + ellipsisWidth < w) + if (lineWidth + ellipsisWidth < w) breakPoint = c; } - if(lineWidth > w) { + if (lineWidth > w) { *breakPoint = '\0'; strcpy_P(breakPoint,PSTR("...")); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 5f7c8d3b99..a11609dd97 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -253,7 +253,7 @@ void BedMeshScreen::drawHighlightedPointValue() { .tag(1).button( OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); - switch(screen_data.BedMeshScreen.message) { + switch (screen_data.BedMeshScreen.message) { case screen_data.BedMeshScreen.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; case screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; default: break; @@ -321,7 +321,7 @@ bool BedMeshScreen::isMeshComplete(ExtUI::bed_mesh_t data) { } void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { - switch(state) { + switch (state) { case ExtUI::MESH_START: screen_data.BedMeshScreen.count = 0; screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index dd0eb263d5..f4c224dbe8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -115,7 +115,7 @@ void FilesScreen::drawFileList() { #define MARGIN_T 0 #define MARGIN_B 0 uint16_t fileIndex = screen_data.FilesScreen.cur_page * files_per_page; - for(uint8_t i = 0; i < files_per_page; i++, fileIndex++) { + for (uint8_t i = 0; i < files_per_page; i++, fileIndex++) { if (files.seek(fileIndex)) { drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp index def31e4a40..c806ef499b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -222,7 +222,7 @@ void InterfaceSettingsScreen::saveSettings(char *buff) { eeprom.touch_transform_f = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_F); eeprom.display_h_offset_adj = CLCD::mem_read_16(CLCD::REG::HOFFSET) - FTDI::Hoffset; eeprom.display_v_offset_adj = CLCD::mem_read_16(CLCD::REG::VOFFSET) - FTDI::Voffset; - for(uint8_t i = 0; i < InterfaceSoundsScreen::NUM_EVENTS; i++) + for (uint8_t i = 0; i < InterfaceSoundsScreen::NUM_EVENTS; i++) eeprom.event_sounds[i] = InterfaceSoundsScreen::event_sounds[i]; memcpy(buff, &eeprom, sizeof(eeprom)); @@ -251,7 +251,7 @@ void InterfaceSettingsScreen::loadSettings(const char *buff) { CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_F, eeprom.touch_transform_f); CLCD::mem_write_16(CLCD::REG::HOFFSET, eeprom.display_h_offset_adj + FTDI::Hoffset); CLCD::mem_write_16(CLCD::REG::VOFFSET, eeprom.display_v_offset_adj + FTDI::Voffset); - for(uint8_t i = 0; i < InterfaceSoundsScreen::NUM_EVENTS; i++) + for (uint8_t i = 0; i < InterfaceSoundsScreen::NUM_EVENTS; i++) InterfaceSoundsScreen::event_sounds[i] = eeprom.event_sounds[i]; TERN_(TOUCH_UI_DEVELOPER_MENU, StressTestScreen::startupCheck()); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp index 6c05c3a887..25a44c1adb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp @@ -43,7 +43,7 @@ void InterfaceSoundsScreen::toggleSoundSelection(event_t event) { } void InterfaceSoundsScreen::setSoundSelection(event_t event, const SoundPlayer::sound_t* sound) { - for(uint8_t i = 0; i < SoundList::n; i++) + for (uint8_t i = 0; i < SoundList::n; i++) if (SoundList::data(i) == sound) event_sounds[event] = i; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index 6b258b5389..fc7453fca7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -176,11 +176,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { char bed_str[20]; char fan_str[20]; - sprintf_P( - fan_str, - PSTR("%-3d %%"), - int8_t(getActualFan_percent(FAN0)) - ); + sprintf_P(fan_str, PSTR("%-3d %%"), int8_t(getActualFan_percent(FAN0))); if (isHeaterIdle(BED)) format_temp_and_idle(bed_str, getActualTemp_celsius(BED)); @@ -193,16 +189,13 @@ void StatusScreen::draw_temperature(draw_mode_t what) { format_temp_and_temp(e0_str, getActualTemp_celsius(H0), getTargetTemp_celsius(H0)); - #if EXTRUDERS == 2 + #if HAS_MULTI_EXTRUDER if (isHeaterIdle(H1)) format_temp_and_idle(e1_str, getActualTemp_celsius(H1)); else format_temp_and_temp(e1_str, getActualTemp_celsius(H1), getTargetTemp_celsius(H1)); #else - strcpy_P( - e1_str, - PSTR("-") - ); + strcpy_P(e1_str, PSTR("-")); #endif cmd.tag(5) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp index 0f1fdaceac..44ee453f15 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -38,7 +38,7 @@ using namespace ExtUI; void StressTestScreen::drawDots(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { CommandProcessor cmd; - for(uint8_t i = 0; i < 100; i++) { + for (uint8_t i = 0; i < 100; i++) { cmd.cmd(BEGIN(POINTS)) .cmd(POINT_SIZE(20*16)) .cmd(COLOR_RGB(random(0xFFFFFF))) @@ -111,7 +111,7 @@ void StressTestScreen::recursiveLockup() { void StressTestScreen::iterativeLockup() { screen_data.StressTestScreen.message = PSTR("Test 3: Printer will restart."); - for(;;) current_screen.onRefresh(); + for (;;) current_screen.onRefresh(); } void StressTestScreen::onIdle() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index 94a865d045..e2df14a36b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -75,7 +75,7 @@ void lv_draw_about(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ + // Create an Image button buttonBack = lv_imgbtn_create(scr, NULL); #if 1 @@ -88,8 +88,8 @@ void lv_draw_about(void) { lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - /*Create a label on the Image button*/ + // Create a label on the image button label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h index 4c6c288d08..2ee7ec04c6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_about(void); @@ -30,5 +30,5 @@ extern void lv_clear_about(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h index b5b62fdc4c..6ab49713c9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_acceleration_settings(void); extern void lv_clear_acceleration_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h index bfd76125bb..84e4a4d4cf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_advance_settings(void); extern void lv_clear_advance_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index 3589b96d6a..cc3f847bce 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -73,7 +73,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { #if HAS_MULTI_EXTRUDER planner.flow_percentage[1] = planner.flow_percentage[0]; planner.refresh_e_factor(1); - } + #endif } disp_print_speed(); } @@ -98,10 +98,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { //planner.flow_percentage[1] = planner.flow_percentage[0]; //planner.e_factor[1]= planner.flow_percentage[1] * 0.01; planner.refresh_e_factor(0); - if (EXTRUDERS == 2) { + #if HAS_MULTI_EXTRUDER planner.flow_percentage[1] = planner.flow_percentage[0]; planner.refresh_e_factor(1); - } + #endif } disp_print_speed(); } @@ -177,7 +177,7 @@ void lv_draw_change_speed(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ + // Create an Image button buttonAdd = lv_imgbtn_create(scr, NULL); buttonDec = lv_imgbtn_create(scr, NULL); buttonMov = lv_imgbtn_create(scr, NULL); @@ -228,7 +228,7 @@ void lv_draw_change_speed(void) { lv_obj_set_pos(buttonStep, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); lv_btn_set_layout(buttonMov, LV_LAYOUT_OFF); @@ -236,12 +236,12 @@ void lv_draw_change_speed(void) { lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t * labelDec = lv_label_create(buttonDec, NULL); - labelMov = lv_label_create(buttonMov, NULL); - labelExt = lv_label_create(buttonExt, NULL); - labelStep = lv_label_create(buttonStep, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); + lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); + labelMov = lv_label_create(buttonMov, NULL); + labelExt = lv_label_create(buttonExt, NULL); + labelStep = lv_label_create(buttonStep, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelAdd, speed_menu.add); @@ -286,7 +286,7 @@ void disp_speed_step() { } void disp_print_speed() { - char buf[30] = {0}; + char buf[30] = { 0 }; public_buf_l[0] = '\0'; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h index d071da20bb..c4996a3ef7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif #define MIN_EXT_SPEED_PERCENT 10 @@ -36,5 +36,5 @@ extern void disp_speed_type(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index a5b829a2cf..f08c7b779a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif #define DIALOG_TYPE_STOP 0 @@ -79,5 +79,5 @@ extern void lv_clear_dialog(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h index da699353ba..6d5ecf0870 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_eeprom_settings(void); extern void lv_clear_eeprom_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h index 010b612ff7..8f64d67f93 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif #ifndef PGM_P @@ -34,5 +34,5 @@ extern void lv_clear_error_message(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 95d0a15bea..9f5977d70c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -100,9 +100,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { queue.inject_P(PSTR("T0")); } } - else { + else uiCfg.curSprayerChoose = 0; - } + extructAmount = 0; disp_hotend_temp(); disp_ext_type(); @@ -149,7 +149,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } - void lv_draw_extrusion(void) { lv_obj_t *buttonAdd, *buttonDec, *buttonBack; @@ -174,7 +173,7 @@ void lv_draw_extrusion(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ + // Create image buttons buttonAdd = lv_imgbtn_create(scr, NULL); buttonDec = lv_imgbtn_create(scr, NULL); buttoType = lv_imgbtn_create(scr, NULL); @@ -224,7 +223,7 @@ void lv_draw_extrusion(void) { lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); @@ -232,12 +231,12 @@ void lv_draw_extrusion(void) { lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t * labelDec = lv_label_create(buttonDec, NULL); - labelType = lv_label_create(buttoType, NULL); - labelStep = lv_label_create(buttonStep, NULL); - labelSpeed = lv_label_create(buttonSpeed, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); + lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); + labelType = lv_label_create(buttoType, NULL); + labelStep = lv_label_create(buttonStep, NULL); + labelSpeed = lv_label_create(buttonSpeed, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelAdd, extrude_menu.in); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h index a7b2afcd8a..576cc6c66c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_extrusion(void); @@ -35,5 +35,5 @@ extern void disp_extru_amount(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index 4dcac62aee..e1975aca7e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -140,12 +140,12 @@ void lv_draw_fan(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); + // Create an Image button + buttonAdd = lv_imgbtn_create(scr, NULL); + buttonDec = lv_imgbtn_create(scr, NULL); buttonHigh = lv_imgbtn_create(scr, NULL); - buttonMid = lv_imgbtn_create(scr, NULL); - buttonOff = lv_imgbtn_create(scr, NULL); + buttonMid = lv_imgbtn_create(scr, NULL); + buttonOff = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_F_ADD, "bmp_Add.bin", 0); @@ -154,6 +154,7 @@ void lv_draw_fan(void) { lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); + #if 1 lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_F_DEC, "bmp_Dec.bin", 0); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); @@ -184,6 +185,7 @@ void lv_draw_fan(void) { lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); @@ -193,7 +195,7 @@ void lv_draw_fan(void) { lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); lv_btn_set_layout(buttonHigh, LV_LAYOUT_OFF); @@ -201,13 +203,12 @@ void lv_draw_fan(void) { lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t * labelDec = lv_label_create(buttonDec, NULL); - lv_obj_t * labelHigh = lv_label_create(buttonHigh, NULL); - lv_obj_t * labelMid = lv_label_create(buttonMid, NULL); - lv_obj_t * labelOff = lv_label_create(buttonOff, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); - + lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); + lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); + lv_obj_t *labelHigh = lv_label_create(buttonHigh, NULL); + lv_obj_t *labelMid = lv_label_create(buttonMid, NULL); + lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelAdd, fan_menu.add); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h index ef17885926..602d02c6c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_fan(void); @@ -31,5 +31,5 @@ extern void disp_fan_value(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 35d442ebae..595d1078c7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -96,7 +96,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_draw_tool(); } break; - } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h index e93c0a0fad..c5060127a8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_home(void); @@ -30,5 +30,5 @@ extern void lv_clear_home(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h index 5badcde529..0531dae9da 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_jerk_settings(void); extern void lv_clear_jerk_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 65d0961248..9029f6868c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -246,7 +246,7 @@ void lv_draw_language(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ + // Create image buttons buttonCN = lv_imgbtn_create(scr, NULL); buttonT_CN = lv_imgbtn_create(scr, NULL); buttonEN = lv_imgbtn_create(scr, NULL); @@ -304,6 +304,7 @@ void lv_draw_language(void) { lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 lv_obj_set_pos(buttonCN, INTERVAL_V, titleHeight); @@ -315,7 +316,7 @@ void lv_draw_language(void) { lv_obj_set_pos(buttonIT, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonCN, LV_LAYOUT_OFF); lv_btn_set_layout(buttonT_CN, LV_LAYOUT_OFF); lv_btn_set_layout(buttonEN, LV_LAYOUT_OFF); @@ -325,14 +326,14 @@ void lv_draw_language(void) { lv_btn_set_layout(buttonIT, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * label_CN = lv_label_create(buttonCN, NULL); - lv_obj_t * label_T_CN = lv_label_create(buttonT_CN, NULL); - lv_obj_t * label_EN = lv_label_create(buttonEN, NULL); - lv_obj_t * label_RU = lv_label_create(buttonRU, NULL); - lv_obj_t * label_ES = lv_label_create(buttonES, NULL); - lv_obj_t * label_FR = lv_label_create(buttonFR, NULL); - lv_obj_t * label_IT = lv_label_create(buttonIT, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *label_CN = lv_label_create(buttonCN, NULL); + lv_obj_t *label_T_CN = lv_label_create(buttonT_CN, NULL); + lv_obj_t *label_EN = lv_label_create(buttonEN, NULL); + lv_obj_t *label_RU = lv_label_create(buttonRU, NULL); + lv_obj_t *label_ES = lv_label_create(buttonES, NULL); + lv_obj_t *label_FR = lv_label_create(buttonFR, NULL); + lv_obj_t *label_IT = lv_label_create(buttonIT, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); disp_language(gCfgItems.language, SELECTED); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h index 4b6b2b0221..ca6d40bfc3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_language(void); @@ -30,5 +30,5 @@ extern void lv_clear_language(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h index d75df293b1..e830f75db7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_machine_para(void); extern void lv_clear_machine_para(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h index 37029c85c4..38d02e7189 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_machine_settings(void); extern void lv_clear_machine_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index ab4d9eb881..6530b1554c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -187,7 +187,7 @@ void lv_draw_manualLevel(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ + // Create an Image button buttonPoint1 = lv_imgbtn_create(scr, NULL); buttonPoint2 = lv_imgbtn_create(scr, NULL); buttonPoint3 = lv_imgbtn_create(scr, NULL); @@ -240,7 +240,7 @@ void lv_draw_manualLevel(void) { lv_obj_set_pos(buttonPoint5, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonPoint1, LV_LAYOUT_OFF); lv_btn_set_layout(buttonPoint2, LV_LAYOUT_OFF); lv_btn_set_layout(buttonPoint3, LV_LAYOUT_OFF); @@ -248,12 +248,12 @@ void lv_draw_manualLevel(void) { lv_btn_set_layout(buttonPoint5, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * label_Point1 = lv_label_create(buttonPoint1, NULL); - lv_obj_t * label_Point2 = lv_label_create(buttonPoint2, NULL); - lv_obj_t * label_Point3 = lv_label_create(buttonPoint3, NULL); - lv_obj_t * label_Point4 = lv_label_create(buttonPoint4, NULL); - lv_obj_t * label_Point5 = lv_label_create(buttonPoint5, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *label_Point1 = lv_label_create(buttonPoint1, NULL); + lv_obj_t *label_Point2 = lv_label_create(buttonPoint2, NULL); + lv_obj_t *label_Point3 = lv_label_create(buttonPoint3, NULL); + lv_obj_t *label_Point4 = lv_label_create(buttonPoint4, NULL); + lv_obj_t *label_Point5 = lv_label_create(buttonPoint5, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(label_Point1, leveling_menu.position1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h index 4ec33afce3..cfa10370e1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_manualLevel(void); @@ -30,5 +30,5 @@ extern void lv_clear_manualLevel(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h index 24edae27e4..78caca5ade 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_max_feedrate_settings(void); extern void lv_clear_max_feedrate_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h index bae1918ad5..9a1c7a4db5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_motor_settings(void); extern void lv_clear_motor_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index e0d29467e6..24abadb57c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -34,7 +34,7 @@ static lv_obj_t * scr; -static lv_obj_t * labelV, *buttonV; +static lv_obj_t *labelV, *buttonV; #define ID_M_X_P 1 #define ID_M_X_N 2 @@ -181,7 +181,7 @@ void lv_draw_move_motor(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ + // Create an Image button buttonXI = lv_imgbtn_create(scr, NULL); buttonXD = lv_imgbtn_create(scr, NULL); buttonYI = lv_imgbtn_create(scr, NULL); @@ -249,7 +249,7 @@ void lv_draw_move_motor(void) { lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF); lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF); @@ -259,14 +259,14 @@ void lv_draw_move_motor(void) { lv_btn_set_layout(buttonV, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * labelXI = lv_label_create(buttonXI, NULL); - lv_obj_t * labelXD = lv_label_create(buttonXD, NULL); - lv_obj_t * labelYI = lv_label_create(buttonYI, NULL); - lv_obj_t * labelYD = lv_label_create(buttonYD, NULL); - lv_obj_t * labelZI = lv_label_create(buttonZI, NULL); - lv_obj_t * labelZD = lv_label_create(buttonZD, NULL); + lv_obj_t *labelXI = lv_label_create(buttonXI, NULL); + lv_obj_t *labelXD = lv_label_create(buttonXD, NULL); + lv_obj_t *labelYI = lv_label_create(buttonYI, NULL); + lv_obj_t *labelYD = lv_label_create(buttonYD, NULL); + lv_obj_t *labelZI = lv_label_create(buttonZI, NULL); + lv_obj_t *labelZD = lv_label_create(buttonZD, NULL); labelV = lv_label_create(buttonV, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelXI, move_menu.x_add); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h index c2583c7ef3..fdbb61f6f9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_move_motor(void); @@ -31,5 +31,5 @@ extern void disp_move_dist(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 7a4e7257e2..2fe32b04c9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -34,8 +34,9 @@ #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" #include "../../../../gcode/queue.h" + #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../../feature/powerloss.h" + #include "../../../../feature/powerloss.h" #endif #include "../../../../gcode/gcode.h" @@ -253,15 +254,12 @@ static void set_value_confirm() { switch (value) { case PrintAcceleration: planner.settings.acceleration = atof(key_value); - break; case RetractAcceleration: planner.settings.retract_acceleration = atof(key_value); - break; case TravelAcceleration: planner.settings.travel_acceleration = atof(key_value); - break; case XAcceleration: planner.settings.max_acceleration_mm_per_s2[X_AXIS] = atof(key_value); @@ -293,7 +291,6 @@ static void set_value_confirm() { case E1MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); break; - case XJerk: #if HAS_CLASSIC_JERK planner.max_jerk[X_AXIS] = atof(key_value); @@ -314,7 +311,6 @@ static void set_value_confirm() { planner.max_jerk[E_AXIS] = atof(key_value); #endif break; - case Xstep: planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value); break; @@ -330,43 +326,36 @@ static void set_value_confirm() { case E1step: planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); break; - case Xcurrent: #if AXIS_IS_TMC(X) current_mA = atoi(key_value); stepperX.rms_current(current_mA); #endif break; - case Ycurrent: #if AXIS_IS_TMC(Y) current_mA = atoi(key_value); stepperY.rms_current(current_mA); #endif break; - case Zcurrent: #if AXIS_IS_TMC(Z) current_mA = atoi(key_value); stepperZ.rms_current(current_mA); #endif break; - case E0current: #if AXIS_IS_TMC(E0) current_mA = atoi(key_value); stepperE0.rms_current(current_mA); #endif break; - case E1current: #if AXIS_IS_TMC(E1) current_mA = atoi(key_value); stepperE1.rms_current(current_mA); #endif break; - - break; case pause_pos_x: gCfgItems.pausePosX = atof(key_value); update_spi_flash(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h index d35cee6343..7902da3649 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_number_key(void); extern void lv_clear_number_key(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h index e2eaaf06a4..cca1f6a2a5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_operation(void); @@ -30,5 +30,5 @@ extern void lv_clear_operation(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h index ce541ee68b..7d55d83756 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_pause_message(const PauseMessage msg); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h index 5f1b4dc960..3e9e079827 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_pause_position(void); extern void lv_clear_pause_position(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 196522b8d4..ff7641ddfd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -267,7 +267,7 @@ void lv_draw_preHeat(void) { lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); @@ -275,13 +275,12 @@ void lv_draw_preHeat(void) { lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t * labelDec = lv_label_create(buttonDec, NULL); + lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); + lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); labelType = lv_label_create(buttoType, NULL); labelStep = lv_label_create(buttonStep, NULL); - lv_obj_t * labelOff = lv_label_create(buttonOff, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); - + lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelAdd, preheat_menu.add); @@ -306,7 +305,6 @@ void lv_draw_preHeat(void) { } void disp_temp_type() { - if (uiCfg.curTempType == 0) { if (uiCfg.curSprayerChoose == 1) { lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_extru2.bin", 0); @@ -331,7 +329,6 @@ void disp_temp_type() { lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } - } void disp_desire_temp() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h index db0e361764..c8de942f3f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_preHeat(void); @@ -33,5 +33,5 @@ extern void disp_desire_temp(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 33405a905f..13a92269f8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -305,6 +305,7 @@ void disp_gcode_icon(uint8_t file_num) { lv_refr_now(lv_refr_get_disp_refreshing()); + // Create image buttons buttonPageUp = lv_imgbtn_create(scr, NULL); buttonPageDown = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); @@ -334,8 +335,7 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_set_pos(buttonPageDown, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H); lv_obj_set_pos(buttonBack, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL * 2 + INTERVAL_H * 2); - /*Create a label on the Image button*/ - + // Create labels on the image buttons lv_btn_set_layout(buttonPageUp, LV_LAYOUT_OFF); lv_btn_set_layout(buttonPageDown, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h index 987282c079..226e4f668e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif typedef struct { @@ -61,5 +61,5 @@ extern void lv_clear_print_file(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h index 1f7d9f909d..b7d464e4f0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif #define IDLE 0 @@ -48,5 +48,5 @@ extern void setProBarRate(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index c987ddb084..38750d608d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -159,7 +159,7 @@ void lv_draw_ready_print(void) { //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); //lv_label_set_text(title, creat_title_text()); - /*Create an Image button*/ + // Create image buttons //buttonPrint = lv_imgbtn_create(scr, NULL); buttonTool = lv_imgbtn_create(scr, NULL); //buttonSet = lv_imgbtn_create(scr, NULL); @@ -196,14 +196,14 @@ void lv_draw_ready_print(void) { //lv_obj_set_pos(buttonSet,BTN_X_PIXEL+SIMPLE_FIRST_PAGE_GRAP*2+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); //lv_obj_set_pos(buttonPrint,BTN_X_PIXEL*2+SIMPLE_FIRST_PAGE_GRAP*3+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - /*Create a label on the Image button*/ + // Create labels on the image buttons //lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); //lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); - //lv_obj_t * label_print = lv_label_create(buttonPrint, NULL); - //lv_obj_t * label_set = lv_label_create(buttonSet, NULL); - lv_obj_t * label_tool = lv_label_create(buttonTool, NULL); + //lv_obj_t *label_print = lv_label_create(buttonPrint, NULL); + //lv_obj_t *label_set = lv_label_create(buttonSet, NULL); + lv_obj_t *label_tool = lv_label_create(buttonTool, NULL); if (gCfgItems.multiple_language != 0) { //lv_label_set_text(label_print, main_menu.print); //lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index 9951beaa41..5cefe8b59b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_ready_print(void); @@ -35,5 +35,5 @@ extern void lv_clear_ready_print(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h index 1cb60b5681..b243bca296 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_set(void); @@ -30,5 +30,5 @@ extern void lv_clear_set(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h index 1a5efda408..b7eaeb4c61 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_step_settings(void); extern void lv_clear_step_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index f1559e0f55..24650ee930 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -25,6 +25,7 @@ #include "lv_conf.h" #include "draw_ui.h" + #include "../../../../MarlinCore.h" #include "../../../../module/planner.h" #include "../../../../module/stepper/indirection.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h index 46463dd3c6..927db37138 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h @@ -22,13 +22,13 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_tmc_current_settings(void); extern void lv_clear_tmc_current_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h index 93085b7ca1..35c57ab0cc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h @@ -22,12 +22,12 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_tmc_step_mode_settings(void); extern void lv_clear_tmc_step_mode_settings(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 91dd2f36ab..a2d0937e47 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -140,7 +140,7 @@ void lv_draw_tool(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ + // Create image buttons buttonPreHeat = lv_imgbtn_create(scr, NULL); buttonExtrusion = lv_imgbtn_create(scr, NULL); buttonMove = lv_imgbtn_create(scr, NULL); @@ -210,7 +210,7 @@ void lv_draw_tool(void) { //lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h index 14be3bce4f..8a033e2c40 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_tool(void); @@ -30,5 +30,5 @@ extern void lv_clear_tool(); //extern void disp_temp_ready_print(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 21c3b6185a..8cd4670ffa 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -328,5 +328,5 @@ extern void LV_TASK_HANDLER(); extern void lv_ex_line(lv_obj_t * line, lv_point_t *points); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index f1086fd1b9..24b2945d73 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -124,7 +124,7 @@ #define VAR_INF_ADDR 0x000000 #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif union union32 { @@ -157,5 +157,5 @@ extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 138168b12f..2d03373a7f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -51,6 +51,7 @@ void printer_state_polling() { if (uiCfg.waitEndMoves > 20) { uiCfg.waitEndMoves = 0; planner.synchronize(); + gcode.process_subcommands_now_P(PSTR("M25")); if (gCfgItems.pausePosZ != (float)-1) { gcode.process_subcommands_now_P(PSTR("G91")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h index 9605d65085..f304158824 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h @@ -22,7 +22,7 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif #define MIN_FILE_PRINTED 100 //5000 @@ -32,5 +32,5 @@ extern void filament_pin_setup(); extern void filament_check(); #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h index f7b0e0d310..b2e19d66f8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h @@ -22,9 +22,9 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif #ifdef __cplusplus -} /* C-declarations for C++ */ + } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/tft/st7796s.h b/Marlin/src/lcd/tft/st7796s.h index 806977732c..10452293de 100644 --- a/Marlin/src/lcd/tft/st7796s.h +++ b/Marlin/src/lcd/tft/st7796s.h @@ -25,92 +25,92 @@ #include "../../inc/MarlinConfig.h" -#define ST7796S_MADCTL_MY 0x80 // Row Address Order -#define ST7796S_MADCTL_MX 0x40 // Column Address Order -#define ST7796S_MADCTL_MV 0x20 // Row/Column Exchange -#define ST7796S_MADCTL_ML 0x10 // Vertical Refresh Order -#define ST7796S_MADCTL_BGR 0x08 // RGB-BGR ORDER -#define ST7796S_MADCTL_RGB 0x00 -#define ST7796S_MADCTL_MH 0x04 // Horizontal Refresh Order +#define ST7796S_MADCTL_MY 0x80 // Row Address Order +#define ST7796S_MADCTL_MX 0x40 // Column Address Order +#define ST7796S_MADCTL_MV 0x20 // Row/Column Exchange +#define ST7796S_MADCTL_ML 0x10 // Vertical Refresh Order +#define ST7796S_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ST7796S_MADCTL_RGB 0x00 +#define ST7796S_MADCTL_MH 0x04 // Horizontal Refresh Order #define ST7796S_COLOR_BGR -#define ST7796S_ORIENTATION ST7796S_MADCTL_MV -#define ST7796S_MADCTL_DATA (ST7796S_ORIENTATION | TERN(ST7796S_COLOR_BGR, ST7796S_MADCTL_BGR, ST7796S_MADCTL_RGB)) +#define ST7796S_ORIENTATION ST7796S_MADCTL_MV +#define ST7796S_MADCTL_DATA (ST7796S_ORIENTATION | TERN(ST7796S_COLOR_BGR, ST7796S_MADCTL_BGR, ST7796S_MADCTL_RGB)) -#define ST7796S_NOP 0x00 // No Operation -#define ST7796S_SWRESET 0x01 // Software reset -#define ST7796S_RDDID 0x04 // Read Display ID -#define ST7796S_RDNUMED 0x05 // Read Number of the Errors on DSI -#define ST7796S_RDDST 0x09 // Read Display Status -#define ST7796S_RDDPM 0x0A // Read Display Power Mode -#define ST7796S_RDDMADCTL 0x0B // Read Display MADCTL -#define ST7796S_RDDCOLMOD 0x0C // Read Display Pixel Format -#define ST7796S_RDDIM 0x0D // Read Display Image Mode -#define ST7796S_RDDSM 0x0E // Read Display Signal Status -#define ST7796S_RDDSDR 0x0F // Read Display Self-Diagnostic Result -#define ST7796S_SLPIN 0x10 // Sleep In -#define ST7796S_SLPOUT 0x11 // Sleep Out -#define ST7796S_PTLON 0x12 // Partial Display Mode On -#define ST7796S_NORON 0x13 // Normal Display Mode On -#define ST7796S_INVOFF 0x20 // Display Inversion Off -#define ST7796S_INVON 0x21 // Display Inversion On -#define ST7796S_DISPOFF 0x28 // Display Off -#define ST7796S_DISPON 0x29 // Display On -#define ST7796S_CASET 0x2A // Column Address Set -#define ST7796S_RASET 0x2B // Row Address Set -#define ST7796S_RAMWR 0x2C // Memory Write -#define ST7796S_RAMRD 0x2E // Memory Read -#define ST7796S_PTLAR 0x30 // Partial Area -#define ST7796S_VSCRDEF 0x33 // Vertical Scrolling Definition -#define ST7796S_TEOFF 0x34 // Tearing Effect Line OFF -#define ST7796S_TEON 0x35 // Tearing Effect Line On -#define ST7796S_MADCTL 0x36 // Memory Data Access Control -#define ST7796S_VSCSAD 0x37 // Vertical Scroll Start Address of RAM -#define ST7796S_IDMOFF 0x38 // Idle Mode Off -#define ST7796S_IDMON 0x39 // Idle Mode On -#define ST7796S_COLMOD 0x3A // Interface Pixel Format -#define ST7796S_WRMEMC 0x3C // Write Memory Continue -#define ST7796S_RDMEMC 0x3E // Read Memory Continue -#define ST7796S_STE 0x44 // Set Tear ScanLine -#define ST7796S_GSCAN 0x45 // Get ScanLine -#define ST7796S_WRDISBV 0x51 // Write Display Brightness -#define ST7796S_RDDISBV 0x52 // Read Display Brightness Value -#define ST7796S_WRCTRLD 0x53 // Write CTRL Display -#define ST7796S_RDCTRLD 0x54 // Read CTRL value Display -#define ST7796S_WRCABC 0x55 // Write Adaptive Brightness Control -#define ST7796S_RDCABC 0x56 // Read Content Adaptive Brightness Control -#define ST7796S_WRCABCMB 0x5E // Write CABC Minimum Brightness -#define ST7796S_RDCABCMB 0x5F // Read CABC Minimum Brightness -#define ST7796S_RDFCS 0xAA // Read First Checksum -#define ST7796S_RDCFCS 0xAF // Read Continue Checksum -#define ST7796S_RDID1 0xDA // Read ID1 -#define ST7796S_RDID2 0xDB // Read ID2 -#define ST7796S_RDID3 0xDC // Read ID3 +#define ST7796S_NOP 0x00 // No Operation +#define ST7796S_SWRESET 0x01 // Software reset +#define ST7796S_RDDID 0x04 // Read Display ID +#define ST7796S_RDNUMED 0x05 // Read Number of the Errors on DSI +#define ST7796S_RDDST 0x09 // Read Display Status +#define ST7796S_RDDPM 0x0A // Read Display Power Mode +#define ST7796S_RDDMADCTL 0x0B // Read Display MADCTL +#define ST7796S_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ST7796S_RDDIM 0x0D // Read Display Image Mode +#define ST7796S_RDDSM 0x0E // Read Display Signal Status +#define ST7796S_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ST7796S_SLPIN 0x10 // Sleep In +#define ST7796S_SLPOUT 0x11 // Sleep Out +#define ST7796S_PTLON 0x12 // Partial Display Mode On +#define ST7796S_NORON 0x13 // Normal Display Mode On +#define ST7796S_INVOFF 0x20 // Display Inversion Off +#define ST7796S_INVON 0x21 // Display Inversion On +#define ST7796S_DISPOFF 0x28 // Display Off +#define ST7796S_DISPON 0x29 // Display On +#define ST7796S_CASET 0x2A // Column Address Set +#define ST7796S_RASET 0x2B // Row Address Set +#define ST7796S_RAMWR 0x2C // Memory Write +#define ST7796S_RAMRD 0x2E // Memory Read +#define ST7796S_PTLAR 0x30 // Partial Area +#define ST7796S_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ST7796S_TEOFF 0x34 // Tearing Effect Line OFF +#define ST7796S_TEON 0x35 // Tearing Effect Line On +#define ST7796S_MADCTL 0x36 // Memory Data Access Control +#define ST7796S_VSCSAD 0x37 // Vertical Scroll Start Address of RAM +#define ST7796S_IDMOFF 0x38 // Idle Mode Off +#define ST7796S_IDMON 0x39 // Idle Mode On +#define ST7796S_COLMOD 0x3A // Interface Pixel Format +#define ST7796S_WRMEMC 0x3C // Write Memory Continue +#define ST7796S_RDMEMC 0x3E // Read Memory Continue +#define ST7796S_STE 0x44 // Set Tear ScanLine +#define ST7796S_GSCAN 0x45 // Get ScanLine +#define ST7796S_WRDISBV 0x51 // Write Display Brightness +#define ST7796S_RDDISBV 0x52 // Read Display Brightness Value +#define ST7796S_WRCTRLD 0x53 // Write CTRL Display +#define ST7796S_RDCTRLD 0x54 // Read CTRL value Display +#define ST7796S_WRCABC 0x55 // Write Adaptive Brightness Control +#define ST7796S_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define ST7796S_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define ST7796S_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define ST7796S_RDFCS 0xAA // Read First Checksum +#define ST7796S_RDCFCS 0xAF // Read Continue Checksum +#define ST7796S_RDID1 0xDA // Read ID1 +#define ST7796S_RDID2 0xDB // Read ID2 +#define ST7796S_RDID3 0xDC // Read ID3 -#define ST7796S_IFMODE 0xB0 // Interface Mode Control -#define ST7796S_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) -#define ST7796S_FRMCTR2 0xB2 // Frame Rate Control 2 (In Idle Mode/8 colors) -#define ST7796S_FRMCTR3 0xB3 // Frame Rate Control 3(In Partial Mode/Full Colors) -#define ST7796S_DIC 0xB4 // Display Inversion Control -#define ST7796S_BPC 0xB5 // Blanking Porch Control -#define ST7796S_DFC 0xB6 // Display Function Control -#define ST7796S_EM 0xB7 // Entry Mode Set -#define ST7796S_PWR1 0xC0 // Power Control 1 -#define ST7796S_PWR2 0xC1 // Power Control 2 -#define ST7796S_PWR3 0xC2 // Power Control 3 -#define ST7796S_VCMPCTL 0xC5 // VCOM Control -#define ST7796S_VCMOST 0xC6 // VCOM Offset Register -#define ST7796S_NVMADW 0xD0 // NVM Address/Data Write -#define ST7796S_NVMBPROG 0xD1 // NVM Byte Program -#define ST7796S_NVMSTRD 0xD2 // NVM Status Read -#define ST7796S_RDID4 0xD3 // Read ID4 -#define ST7796S_PGC 0xE0 // Positive Gamma Control -#define ST7796S_NGC 0xE1 // Negative Gamma Control -#define ST7796S_DGC1 0xE2 // Digital Gamma Control 1 -#define ST7796S_DGC2 0xE3 // Digital Gamma Control 2 -#define ST7796S_DOCA 0xE8 // Display Output Ctrl Adjust -#define ST7796S_CSCON 0xF0 // Command Set Control -#define ST7796S_SPIRC 0xFB // SPI Read Control +#define ST7796S_IFMODE 0xB0 // Interface Mode Control +#define ST7796S_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) +#define ST7796S_FRMCTR2 0xB2 // Frame Rate Control 2 (In Idle Mode/8 colors) +#define ST7796S_FRMCTR3 0xB3 // Frame Rate Control 3(In Partial Mode/Full Colors) +#define ST7796S_DIC 0xB4 // Display Inversion Control +#define ST7796S_BPC 0xB5 // Blanking Porch Control +#define ST7796S_DFC 0xB6 // Display Function Control +#define ST7796S_EM 0xB7 // Entry Mode Set +#define ST7796S_PWR1 0xC0 // Power Control 1 +#define ST7796S_PWR2 0xC1 // Power Control 2 +#define ST7796S_PWR3 0xC2 // Power Control 3 +#define ST7796S_VCMPCTL 0xC5 // VCOM Control +#define ST7796S_VCMOST 0xC6 // VCOM Offset Register +#define ST7796S_NVMADW 0xD0 // NVM Address/Data Write +#define ST7796S_NVMBPROG 0xD1 // NVM Byte Program +#define ST7796S_NVMSTRD 0xD2 // NVM Status Read +#define ST7796S_RDID4 0xD3 // Read ID4 +#define ST7796S_PGC 0xE0 // Positive Gamma Control +#define ST7796S_NGC 0xE1 // Negative Gamma Control +#define ST7796S_DGC1 0xE2 // Digital Gamma Control 1 +#define ST7796S_DGC2 0xE3 // Digital Gamma Control 2 +#define ST7796S_DOCA 0xE8 // Display Output Ctrl Adjust +#define ST7796S_CSCON 0xF0 // Command Set Control +#define ST7796S_SPIRC 0xFB // SPI Read Control static const uint16_t st7796s_init[] = { DATASIZE_8BIT, diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 9dce52b420..d07d363399 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -498,10 +498,10 @@ #include "stm32f1/pins_STM3R_MINI.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_PRO_VB) #include "stm32f1/pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F103RE -#elif MB(GTM32_MINI_A30) - #include "stm32f1/pins_GTM32_MINI_A30.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_MINI) #include "stm32f1/pins_GTM32_MINI.h" // STM32F1 env:STM32F103RE +#elif MB(GTM32_MINI_A30) + #include "stm32f1/pins_GTM32_MINI_A30.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_REV_B) #include "stm32f1/pins_GTM32_REV_B.h" // STM32F1 env:STM32F103RE #elif MB(MORPHEUS) @@ -518,6 +518,14 @@ #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano35 #elif MB(MKS_ROBIN_LITE) #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite +#elif MB(MKS_ROBIN_LITE3) + #include "stm32f1/pins_MKS_ROBIN_LITE3.h" // STM32F1 env:mks_robin_lite3 +#elif MB(MKS_ROBIN_PRO) + #include "stm32f1/pins_MKS_ROBIN_PRO.h" // STM32F1 env:mks_robin_pro +#elif MB(MKS_ROBIN_E3) + #include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3 +#elif MB(MKS_ROBIN_E3D) + #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3 #elif MB(BTT_SKR_MINI_V1_1) #include "stm32f1/pins_BTT_SKR_MINI_V1_1.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB #elif MB(BTT_SKR_MINI_E3_V1_0) @@ -538,14 +546,6 @@ #include "stm32f1/pins_FYSETC_CHEETAH_V12.h" // STM32F1 env:STM32F103RC_fysetc #elif MB(LONGER3D_LK) #include "stm32f1/pins_LONGER3D_LK.h" // STM32F1 env:STM32F103VE_longer -#elif MB(MKS_ROBIN_LITE3) - #include "stm32f1/pins_MKS_ROBIN_LITE3.h" // STM32F1 env:mks_robin_lite3 -#elif MB(MKS_ROBIN_PRO) - #include "stm32f1/pins_MKS_ROBIN_PRO.h" // STM32F1 env:mks_robin_pro -#elif MB(MKS_ROBIN_E3D) - #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3 -#elif MB(MKS_ROBIN_E3) - #include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3 #elif MB(CCROBOT_MEEB_3DP) #include "stm32f1/pins_CCROBOT_MEEB_3DP.h" // STM32F1 env:STM32F103RC_meeb #elif MB(CHITU3D_V5) From 32cd5a3dc4a65a6b67b11cec296a0c43b541e624 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 20 Sep 2020 19:08:08 -0500 Subject: [PATCH 0264/1370] Add HAS_ROTARY_ENCODER --- Marlin/src/inc/Conditionals_post.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 2ae4f4e399..c9a29b351c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2622,6 +2622,10 @@ #endif #endif +#if BUTTONS_EXIST(EN1, EN2, ENC) + #define HAS_ROTARY_ENCODER 1 +#endif + #if !NUM_SERIAL #undef BAUD_RATE_GCODE #elif NUM_SERIAL > 1 From 33788c840588e704c6e2e991e038facb972f314f Mon Sep 17 00:00:00 2001 From: makerbase <4164049@qq.com> Date: Mon, 21 Sep 2020 09:55:02 +0800 Subject: [PATCH 0265/1370] Add MKS Robin E3P, improve LVGL UI (#19442) --- Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 2 + Marlin/src/MarlinCore.cpp | 11 + Marlin/src/core/boards.h | 73 +- .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 2 + Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 5 +- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 41 +- .../lib/mks_ui/draw_acceleration_settings.cpp | 318 ++- .../lib/mks_ui/draw_advance_settings.cpp | 234 +- .../draw_auto_level_offset_settings.cpp | 203 ++ .../mks_ui/draw_auto_level_offset_settings.h | 33 + .../extui/lib/mks_ui/draw_baby_stepping.cpp | 352 +++ .../lcd/extui/lib/mks_ui/draw_baby_stepping.h | 36 + .../extui/lib/mks_ui/draw_change_speed.cpp | 83 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 455 +++- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 5 + .../extui/lib/mks_ui/draw_eeprom_settings.cpp | 139 +- .../lib/mks_ui/draw_encoder_settings.cpp | 172 ++ .../extui/lib/mks_ui/draw_encoder_settings.h | 33 + .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 97 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 56 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 270 +++ .../extui/lib/mks_ui/draw_filament_change.h | 36 + .../lib/mks_ui/draw_filament_settings.cpp | 329 +++ .../extui/lib/mks_ui/draw_filament_settings.h | 33 + Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 135 +- .../draw_homing_sensitivity_settings.cpp | 262 +++ .../mks_ui/draw_homing_sensitivity_settings.h | 33 + .../extui/lib/mks_ui/draw_jerk_settings.cpp | 150 +- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 286 +++ .../src/lcd/extui/lib/mks_ui/draw_keyboard.h | 33 + .../lcd/extui/lib/mks_ui/draw_language.cpp | 136 +- .../extui/lib/mks_ui/draw_level_settings.cpp | 261 +++ .../extui/lib/mks_ui/draw_level_settings.h | 33 + .../extui/lib/mks_ui/draw_machine_para.cpp | 114 +- .../lib/mks_ui/draw_machine_settings.cpp | 81 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 69 +- .../mks_ui/draw_manual_level_pos_settings.cpp | 459 ++++ .../mks_ui/draw_manual_level_pos_settings.h | 33 + .../lib/mks_ui/draw_max_feedrate_settings.cpp | 208 +- .../extui/lib/mks_ui/draw_motor_settings.cpp | 164 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 87 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 291 ++- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 277 ++- .../extui/lib/mks_ui/draw_pause_position.cpp | 120 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 97 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 103 +- .../lcd/extui/lib/mks_ui/draw_print_file.h | 3 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 187 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 128 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 255 ++- .../extui/lib/mks_ui/draw_step_settings.cpp | 212 +- .../lib/mks_ui/draw_tmc_current_settings.cpp | 387 ++-- .../mks_ui/draw_tmc_step_mode_settings.cpp | 468 ++-- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 159 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 493 +++-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 170 +- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 222 ++ Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h | 38 + .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 235 ++ .../src/lcd/extui/lib/mks_ui/draw_wifi_list.h | 76 + .../extui/lib/mks_ui/draw_wifi_settings.cpp | 299 +++ .../lcd/extui/lib/mks_ui/draw_wifi_settings.h | 36 + .../lcd/extui/lib/mks_ui/draw_wifi_tips.cpp | 85 + .../src/lcd/extui/lib/mks_ui/draw_wifi_tips.h | 51 + .../src/lcd/extui/lib/mks_ui/irq_overrid.cpp | 69 + .../extui/lib/mks_ui/mks_hardware_test.cpp | 100 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 174 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 13 +- .../extui/lib/mks_ui/printer_operation.cpp | 42 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 54 +- .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 5 - .../lcd/extui/lib/mks_ui/tft_Language_it.h | 5 - .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 5 - .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 52 +- .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 5 - .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 51 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 904 +++++--- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 51 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 291 +-- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 75 +- .../src/lcd/extui/lib/mks_ui/wifiSerial.cpp | 120 + Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h | 102 + .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 1927 +++++++++++++++++ Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h | 202 ++ .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 847 ++++++++ Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h | 74 + Marlin/src/module/stepper.h | 14 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 377 ++++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 38 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 46 +- .../PlatformIO/ldscripts/mks_robin_e3p.ld | 14 + .../share/PlatformIO/scripts/mks_robin_e3p.py | 40 + platformio.ini | 18 +- 94 files changed, 12687 insertions(+), 2984 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h create mode 100644 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h create mode 100644 buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld create mode 100644 buildroot/share/PlatformIO/scripts/mks_robin_e3p.py diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp index bc1b012dc7..069be7ad54 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -201,6 +201,8 @@ uint32_t TFT_FSMC::GetID() { id = ReadID(LCD_READ_ID); if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) id = ReadID(LCD_READ_ID4); + if ((id & 0xFF00) == 0 && (id & 0xFF) != 0) + id = ReadID(LCD_READ_ID4); return id; } diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 2927a3e40b..22935c1460 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -796,6 +796,10 @@ void kill(PGM_P const lcd_error/*=nullptr*/, PGM_P const lcd_component/*=nullptr UNUSED(lcd_component); #endif + #if HAS_TFT_LVGL_UI + lv_draw_error_message(lcd_error); + #endif + #ifdef ACTION_ON_KILL host_action_kill(); #endif @@ -920,6 +924,13 @@ void setup() { SERIAL_ECHO_MSG("start"); #endif + #if BOTH(HAS_TFT_LVGL_UI, USE_WIFI_FUNCTION) + mks_esp_wifi_init(); + WIFISERIAL.begin(WIFI_BAUDRATE); + serial_connect_timeout = millis() + 1000UL; + while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #endif + SETUP_RUN(HAL_init()); #if HAS_L64XX diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 581c801feb..293c6a5230 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -282,42 +282,43 @@ // STM32 ARM Cortex-M3 // -#define BOARD_STM32F103RE 4000 // STM32F103RE Libmaple-based STM32F1 controller -#define BOARD_MALYAN_M200 4001 // STM32C8T6 Libmaple-based STM32F1 controller -#define BOARD_MALYAN_M200_V2 4002 // STM32F070CB STM32F0 controller -#define BOARD_STM3R_MINI 4003 // STM32F103RE Libmaple-based STM32F1 controller -#define BOARD_GTM32_PRO_VB 4004 // STM32F103VET6 controller -#define BOARD_MORPHEUS 4005 // STM32F103C8 / STM32F103CB Libmaple-based STM32F1 controller -#define BOARD_CHITU3D 4006 // Chitu3D (STM32F103RET6) -#define BOARD_MKS_ROBIN 4007 // MKS Robin (STM32F103ZET6) -#define BOARD_MKS_ROBIN_MINI 4008 // MKS Robin Mini (STM32F103VET6) -#define BOARD_MKS_ROBIN_NANO 4009 // MKS Robin Nano (STM32F103VET6) -#define BOARD_MKS_ROBIN_NANO_V2 4010 // MKS Robin Nano V2 (STM32F103VET6) -#define BOARD_MKS_ROBIN_LITE 4011 // MKS Robin Lite/Lite2 (STM32F103RCT6) -#define BOARD_MKS_ROBIN_LITE3 4012 // MKS Robin Lite3 (STM32F103RCT6) -#define BOARD_MKS_ROBIN_PRO 4013 // MKS Robin Pro (STM32F103ZET6) -#define BOARD_BTT_SKR_MINI_V1_1 4014 // BigTreeTech SKR Mini v1.1 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V1_0 4015 // BigTreeTech SKR Mini E3 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V1_2 4016 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V2_0 4017 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) -#define BOARD_BTT_SKR_E3_DIP 4018 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) -#define BOARD_JGAURORA_A5S_A1 4019 // JGAurora A5S A1 (STM32F103ZET6) -#define BOARD_FYSETC_AIO_II 4020 // FYSETC AIO_II -#define BOARD_FYSETC_CHEETAH 4021 // FYSETC Cheetah -#define BOARD_FYSETC_CHEETAH_V12 4022 // FYSETC Cheetah V1.2 -#define BOARD_LONGER3D_LK 4023 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 -#define BOARD_GTM32_MINI 4024 // STM32F103VET6 controller -#define BOARD_GTM32_MINI_A30 4025 // STM32F103VET6 controller -#define BOARD_GTM32_REV_B 4026 // STM32F103VET6 controller -#define BOARD_MKS_ROBIN_E3D 4027 // MKS Robin E3D (STM32F103RCT6) -#define BOARD_MKS_ROBIN_E3 4028 // MKS Robin E3 (STM32F103RCT6) -#define BOARD_MALYAN_M300 4029 // STM32F070-based delta -#define BOARD_CCROBOT_MEEB_3DP 4030 // ccrobot-online.com MEEB_3DP (STM32F103RC) -#define BOARD_CHITU3D_V5 4031 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CHITU3D_V6 4032 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CREALITY_V4 4033 // Creality v4.x (STM32F103RE) -#define BOARD_CREALITY_V427 4034 // Creality v4.2.7 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4035 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_MALYAN_M200_V2 4000 // STM32F070CB STM32F0 controller +#define BOARD_MALYAN_M300 4001 // STM32F070-based delta +#define BOARD_STM32F103RE 4002 // STM32F103RE Libmaple-based STM32F1 controller +#define BOARD_MALYAN_M200 4003 // STM32C8T6 Libmaple-based STM32F1 controller +#define BOARD_STM3R_MINI 4004 // STM32F103RE Libmaple-based STM32F1 controller +#define BOARD_GTM32_PRO_VB 4005 // STM32F103VET6 controller +#define BOARD_GTM32_MINI 4006 // STM32F103VET6 controller +#define BOARD_GTM32_MINI_A30 4007 // STM32F103VET6 controller +#define BOARD_GTM32_REV_B 4008 // STM32F103VET6 controller +#define BOARD_MORPHEUS 4009 // STM32F103C8 / STM32F103CB Libmaple-based STM32F1 controller +#define BOARD_CHITU3D 4010 // Chitu3D (STM32F103RET6) +#define BOARD_MKS_ROBIN 4011 // MKS Robin (STM32F103ZET6) +#define BOARD_MKS_ROBIN_MINI 4012 // MKS Robin Mini (STM32F103VET6) +#define BOARD_MKS_ROBIN_NANO 4013 // MKS Robin Nano (STM32F103VET6) +#define BOARD_MKS_ROBIN_NANO_V2 4014 // MKS Robin Nano V2 (STM32F103VET6) +#define BOARD_MKS_ROBIN_LITE 4015 // MKS Robin Lite/Lite2 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_LITE3 4016 // MKS Robin Lite3 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_PRO 4017 // MKS Robin Pro (STM32F103ZET6) +#define BOARD_MKS_ROBIN_E3 4018 // MKS Robin E3 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3D 4019 // MKS Robin E3D (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3P 4020 // MKS Robin E3p (STM32F103VET6) +#define BOARD_BTT_SKR_MINI_V1_1 4021 // BigTreeTech SKR Mini v1.1 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V1_0 4022 // BigTreeTech SKR Mini E3 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V1_2 4023 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V2_0 4024 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) +#define BOARD_BTT_SKR_E3_DIP 4025 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) +#define BOARD_JGAURORA_A5S_A1 4026 // JGAurora A5S A1 (STM32F103ZET6) +#define BOARD_FYSETC_AIO_II 4027 // FYSETC AIO_II +#define BOARD_FYSETC_CHEETAH 4028 // FYSETC Cheetah +#define BOARD_FYSETC_CHEETAH_V12 4029 // FYSETC Cheetah V1.2 +#define BOARD_LONGER3D_LK 4030 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 +#define BOARD_CCROBOT_MEEB_3DP 4031 // ccrobot-online.com MEEB_3DP (STM32F103RC) +#define BOARD_CHITU3D_V5 4032 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CHITU3D_V6 4033 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CREALITY_V4 4034 // Creality v4.x (STM32F103RE) +#define BOARD_CREALITY_V427 4035 // Creality v4.2.7 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4036 // Trigorilla Pro (STM32F103ZET6) // // ARM Cortex-M4F diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index ad116d5045..3f57124451 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -27,6 +27,8 @@ #include "../../../../inc/MarlinConfig.h" #include "SPIFlashStorage.h" +extern W25QXXFlash W25QXX; + uint8_t SPIFlashStorage::m_pageData[SPI_FLASH_PageSize]; uint32_t SPIFlashStorage::m_currentPage; uint16_t SPIFlashStorage::m_pageDataUsed; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index ea94d6c1a5..351d033d01 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -26,6 +26,7 @@ #include "SPI_TFT.h" #include "pic_manager.h" +#include "tft_lvgl_configuration.h" #include "../../../../inc/MarlinConfig.h" @@ -74,6 +75,7 @@ void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { } void TFT::LCD_init() { + TFT_BLK_L; TFT_RST_H; delay(150); TFT_RST_L; @@ -92,8 +94,7 @@ void TFT::LCD_init() { LCD_WR_DATA(0x96); LCD_WR_REG(0x36); - LCD_WR_DATA(0x28); - + LCD_WR_DATA(0x28 + TERN0(GRAPHICAL_TFT_ROTATE_180, 0x80)); LCD_WR_REG(0x3A); LCD_WR_DATA(0x55); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index e2df14a36b..34b7427860 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -33,8 +33,9 @@ #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" +extern lv_group_t * g; static lv_obj_t * scr; -static lv_obj_t * fw_type, *board, *fw_version; +static lv_obj_t * fw_type, *board; //*fw_version; #define ID_A_RETURN 1 @@ -73,17 +74,18 @@ void lv_draw_about(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - // Create an Image button buttonBack = lv_imgbtn_create(scr, NULL); #if 1 - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_A_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_A_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif #endif lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); @@ -97,30 +99,27 @@ void lv_draw_about(void) { lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } - fw_version = lv_label_create(scr, NULL); - lv_obj_set_style(fw_version, &tft_style_label_rel); - lv_label_set_text(fw_version, SHORT_BUILD_VERSION); - lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60); + //fw_version = lv_label_create(scr, NULL); + //lv_obj_set_style(fw_version, &tft_style_label_rel); + //lv_label_set_text(fw_version, SHORT_BUILD_VERSION); + //lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60); fw_type = lv_label_create(scr, NULL); lv_obj_set_style(fw_type, &tft_style_label_rel); - lv_label_set_text(fw_type, - #if MB(MKS_ROBIN_PRO) - "Firmware: Robin_Pro35" - #elif MB(MKS_ROBIN_NANO, MKS_ROBIN_NANO_V2) - "Firmware: Robin_Nano35" - #else - CUSTOM_MACHINE_NAME - #endif - ); + lv_label_set_text(fw_type, "Firmware: Marlin " SHORT_BUILD_VERSION); lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20); board = lv_label_create(scr, NULL); lv_obj_set_style(board, &tft_style_label_rel); lv_label_set_text(board, "Board: " BOARD_INFO_NAME); - lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, 20); + lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, -60); } -void lv_clear_about() { lv_obj_del(scr); } +void lv_clear_about() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index b6906a6dfe..a30c99dba0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -29,6 +29,7 @@ #include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_ACCE_RETURN 1 @@ -160,14 +161,14 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_acceleration_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonPrintText = NULL, *labelPrintText = NULL, *buttonPrintValue = NULL, *labelPrintValue = NULL; - lv_obj_t *buttonRetraText = NULL, *labelRetraText = NULL, *buttonRetraValue = NULL, *labelRetraValue = NULL; - lv_obj_t *buttonTravelText = NULL, *labelTravelText = NULL, *buttonTravelValue = NULL, *labelTravelValue = NULL; - lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t *labelPrintText = NULL, *buttonPrintValue = NULL, *labelPrintValue = NULL; + lv_obj_t *labelRetraText = NULL, *buttonRetraValue = NULL, *labelRetraValue = NULL; + lv_obj_t *labelTravelText = NULL, *buttonTravelValue = NULL, *labelTravelValue = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ACCELERATION_UI) { disp_state_stack._disp_index++; @@ -188,231 +189,202 @@ void lv_draw_acceleration_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - // LV_IMG_DECLARE(bmp_para_arrow); - LV_IMG_DECLARE(bmp_para_bank); - if (uiCfg.para_ui_page != 1) { - buttonPrintText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonPrintText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonPrintText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonPrintText, event_handler); - lv_btn_set_style(buttonPrintText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonPrintText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonPrintText, LV_LAYOUT_OFF); - labelPrintText = lv_label_create(buttonPrintText, NULL); /*Add a label to the button*/ - buttonPrintValue = lv_imgbtn_create(scr, NULL); + labelPrintText = lv_label_create(scr, NULL); + lv_obj_set_style(labelPrintText, &tft_style_label_rel); + lv_obj_set_pos(labelPrintText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelPrintText, machine_menu.PrintAcceleration); + + buttonPrintValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonPrintValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonPrintValue, event_handler, ID_ACCE_PRINT, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonPrintValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonPrintValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonPrintValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonPrintValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonPrintValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonPrintValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonPrintValue, event_handler, ID_ACCE_PRINT, NULL, 0); + lv_btn_set_style(buttonPrintValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonPrintValue, LV_BTN_STYLE_PR, &style_para_value); labelPrintValue = lv_label_create(buttonPrintValue, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonRetraText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonRetraText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonRetraText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonRetraText, event_handler); - lv_btn_set_style(buttonRetraText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonRetraText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonRetraText, LV_LAYOUT_OFF); - labelRetraText = lv_label_create(buttonRetraText, NULL); /*Add a label to the button*/ + labelRetraText = lv_label_create(scr, NULL); + lv_obj_set_style(labelRetraText, &tft_style_label_rel); + lv_obj_set_pos(labelRetraText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelRetraText, machine_menu.RetractAcceleration); - buttonRetraValue = lv_imgbtn_create(scr, NULL); + buttonRetraValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonRetraValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonRetraValue, event_handler, ID_ACCE_RETRA, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonRetraValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonRetraValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonRetraValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonRetraValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonRetraValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonRetraValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonRetraValue, event_handler, ID_ACCE_RETRA, NULL, 0); + lv_btn_set_style(buttonRetraValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonRetraValue, LV_BTN_STYLE_PR, &style_para_value); labelRetraValue = lv_label_create(buttonRetraValue, NULL); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonTravelText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonTravelText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonTravelText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonTravelText, event_handler); - lv_btn_set_style(buttonTravelText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonTravelText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonTravelText, LV_LAYOUT_OFF); - labelTravelText = lv_label_create(buttonTravelText, NULL); /*Add a label to the button*/ + labelTravelText = lv_label_create(scr, NULL); + lv_obj_set_style(labelTravelText, &tft_style_label_rel); + lv_obj_set_pos(labelTravelText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelTravelText, machine_menu.TravelAcceleration); - buttonTravelValue = lv_imgbtn_create(scr, NULL); + buttonTravelValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonTravelValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonTravelValue, event_handler, ID_ACCE_TRAVEL, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonTravelValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonTravelValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonTravelValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonTravelValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonTravelValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonTravelValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonTravelValue, event_handler, ID_ACCE_TRAVEL, NULL, 0); + lv_btn_set_style(buttonTravelValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonTravelValue, LV_BTN_STYLE_PR, &style_para_value); labelTravelValue = lv_label_create(buttonTravelValue, NULL); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonXText, event_handler); - lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); - labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelXText, machine_menu.X_Acceleration); - buttonXValue = lv_imgbtn_create(scr, NULL); + buttonXValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_ACCE_X, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_ACCE_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); labelXValue = lv_label_create(buttonXValue, NULL); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_DOWN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPrintValue); + lv_group_add_obj(g, buttonRetraValue); + lv_group_add_obj(g, buttonTravelValue); + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonTurnPage); + } + #endif } else { - buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonYText, event_handler); - lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); - labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelYText, machine_menu.Y_Acceleration); - buttonYValue = lv_imgbtn_create(scr, NULL); + buttonYValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); labelYValue = lv_label_create(buttonYValue, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonZText, event_handler); - lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); - labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Acceleration); - buttonZValue = lv_imgbtn_create(scr, NULL); + buttonZValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_ACCE_Z, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_ACCE_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); labelZValue = lv_label_create(buttonZValue, NULL); + line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE0Text, event_handler); - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); - labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + labelE0Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE0Text, &tft_style_label_rel); + lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelE0Text, machine_menu.E0_Acceleration); - buttonE0Value = lv_imgbtn_create(scr, NULL); + buttonE0Value = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_ACCE_E0, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); + lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_ACCE_E0, NULL, 0); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); labelE0Value = lv_label_create(buttonE0Value, NULL); + line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE1Text, event_handler); - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); - labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + labelE1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE1Text, &tft_style_label_rel); + lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelE1Text, machine_menu.E1_Acceleration); - buttonE1Value = lv_imgbtn_create(scr, NULL); + buttonE1Value = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_ACCE_E1, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); + lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_ACCE_E1, NULL, 0); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); labelE1Value = lv_label_create(buttonE1Value, NULL); + line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_UP, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_UP, NULL, 0); + //lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + //lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + //lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonE0Value); + lv_group_add_obj(g, buttonE1Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif } + //lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + //lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + //labelTurnPage = lv_label_create(buttonTurnPage, NULL); lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); labelTurnPage = lv_label_create(buttonTurnPage, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ACCE_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ACCE_RETURN, NULL, 0); + //lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + //lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + //lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); label_Back = lv_label_create(buttonBack, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + //lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + //lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); if (gCfgItems.multiple_language != 0) { if (uiCfg.para_ui_page != 1) { - lv_label_set_text(labelPrintText, machine_menu.PrintAcceleration); - lv_obj_align(labelPrintText, buttonPrintText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelRetraText, machine_menu.RetractAcceleration); - lv_obj_align(labelRetraText, buttonRetraText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelTravelText, machine_menu.TravelAcceleration); - lv_obj_align(labelTravelText, buttonTravelText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelXText, machine_menu.X_Acceleration); - lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); lv_label_set_text(labelTurnPage, machine_menu.next); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); @@ -438,17 +410,6 @@ void lv_draw_acceleration_settings(void) { lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); } else { - lv_label_set_text(labelYText, machine_menu.Y_Acceleration); - lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelZText, machine_menu.Z_Acceleration); - lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelE0Text, machine_menu.E0_Acceleration); - lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelE1Text, machine_menu.E1_Acceleration); - lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); lv_label_set_text(labelTurnPage, machine_menu.previous); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); @@ -478,6 +439,11 @@ void lv_draw_acceleration_settings(void) { } } -void lv_clear_acceleration_settings() { lv_obj_del(scr); } +void lv_clear_acceleration_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp index 7d3eab436b..5b1b241716 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -28,11 +28,18 @@ #include "../../../../MarlinCore.h" +extern lv_group_t * g; static lv_obj_t * scr; -#define ID_ADVANCE_RETURN 1 -#define ID_PAUSE_POS 2 -#define ID_PAUSE_POS_ARROW 3 +#define ID_ADVANCE_RETURN 1 +#define ID_PAUSE_POS 2 +#define ID_PAUSE_POS_ARROW 3 +#define ID_WIFI_PARA 4 +#define ID_WIFI_PARA_ARROW 5 +#define ID_FILAMENT_SETTINGS 6 +#define ID_FILAMENT_SETTINGS_ARROW 7 +#define ID_ENCODER_SETTINGS 8 +#define ID_ENCODER_SETTINGS_ARROW 9 static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { @@ -63,13 +70,79 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_draw_pause_position(); } break; + case ID_FILAMENT_SETTINGS: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_filament_settings(); + } + break; + case ID_FILAMENT_SETTINGS_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_filament_settings(); + } + break; + #if ENABLED(USE_WIFI_FUNCTION) + case ID_WIFI_PARA: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_wifi_settings(); + } + break; + case ID_WIFI_PARA_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_wifi_settings(); + } + break; + #endif + #if HAS_ROTARY_ENCODER + case ID_ENCODER_SETTINGS: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_encoder_settings(); + } + break; + case ID_ENCODER_SETTINGS_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_encoder_settings(); + } + break; + #endif } } void lv_draw_advance_settings(void) { lv_obj_t *buttonBack, *label_Back; lv_obj_t *buttonPausePos, *labelPausePos, *buttonPausePosNarrow; - lv_obj_t * line1; + lv_obj_t *buttonFilamentSettings, *labelFilamentSettings, *buttonFilamentSettingsNarrow; + lv_obj_t * line1,* line2; + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_t *buttonWifiSet,*labelWifiSet,*buttonWifiSetNarrow; + #endif + #if HAS_ROTARY_ENCODER + lv_obj_t *buttonEcoder,*labelEcoder,*buttonEcoderNarrow; + #endif + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ADVANCED_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = ADVANCED_UI; @@ -89,24 +162,24 @@ void lv_draw_advance_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - LV_IMG_DECLARE(bmp_para_arrow); - - buttonPausePos = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonPausePos, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonPausePos, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + buttonPausePos = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonPausePos, PARA_UI_POS_X, PARA_UI_POS_Y); + lv_obj_set_size(buttonPausePos, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonPausePos, event_handler, ID_PAUSE_POS, NULL, 0); - lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_PR, &tft_style_label_pre); lv_btn_set_layout(buttonPausePos, LV_LAYOUT_OFF); - labelPausePos = lv_label_create(buttonPausePos, NULL); /*Add a label to the button*/ + labelPausePos = lv_label_create(buttonPausePos, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPausePos); + #endif buttonPausePosNarrow = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonPausePosNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonPausePosNarrow, event_handler, ID_PAUSE_POS_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_event_cb_mks(buttonPausePosNarrow, event_handler, ID_PAUSE_POS_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonPausePosNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPausePosNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonPausePosNarrow, LV_LAYOUT_OFF); @@ -114,13 +187,117 @@ void lv_draw_advance_settings(void) { line1 = lv_line_create(lv_scr_act(), NULL); lv_ex_line(line1, line_points[0]); + buttonFilamentSettings = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonFilamentSettings, PARA_UI_POS_X, PARA_UI_POS_Y*2); + lv_obj_set_size(buttonFilamentSettings, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonFilamentSettings, event_handler, ID_FILAMENT_SETTINGS, NULL, 0); + lv_btn_set_style(buttonFilamentSettings, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonFilamentSettings, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonFilamentSettings, LV_LAYOUT_OFF); + labelFilamentSettings = lv_label_create(buttonFilamentSettings, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonFilamentSettings); + #endif + + buttonFilamentSettingsNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonFilamentSettingsNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y*2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonFilamentSettingsNarrow, event_handler, ID_FILAMENT_SETTINGS_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonFilamentSettingsNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonFilamentSettingsNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonFilamentSettingsNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFilamentSettingsNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonFilamentSettingsNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line2, line_points[1]); + + #if ENABLED(USE_WIFI_FUNCTION) + + buttonWifiSet = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonWifiSet, PARA_UI_POS_X,PARA_UI_POS_Y*3); + lv_obj_set_size(buttonWifiSet, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonWifiSet, event_handler,ID_WIFI_PARA,NULL,0); + lv_btn_set_style(buttonWifiSet, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonWifiSet, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonWifiSet, LV_LAYOUT_OFF); + labelWifiSet = lv_label_create(buttonWifiSet, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonWifiSet); + #endif + + buttonWifiSetNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonWifiSetNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*3+PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonWifiSetNarrow, event_handler,ID_WIFI_PARA_ARROW, NULL,0); + lv_imgbtn_set_src(buttonWifiSetNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonWifiSetNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonWifiSetNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonWifiSetNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonWifiSetNarrow, LV_LAYOUT_OFF); + + lv_obj_t * line3 = lv_line_create(scr, NULL); + lv_ex_line(line3,line_points[2]); + + #if HAS_ROTARY_ENCODER + buttonEcoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonEcoder, PARA_UI_POS_X,PARA_UI_POS_Y*4); + lv_obj_set_size(buttonEcoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonEcoder, event_handler,ID_ENCODER_SETTINGS,NULL,0); + lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonEcoder, LV_LAYOUT_OFF); + labelEcoder = lv_label_create(buttonEcoder, NULL); + + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEcoder); + + buttonEcoderNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonEcoderNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*4+PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonEcoderNarrow, event_handler,ID_ENCODER_SETTINGS_ARROW, NULL,0); + lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonEcoderNarrow, LV_LAYOUT_OFF); + + lv_obj_t * line4 = lv_line_create(scr, NULL); + lv_ex_line(line4,line_points[3]); + #endif + + #elif HAS_ROTARY_ENCODER + buttonEcoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonEcoder, PARA_UI_POS_X,PARA_UI_POS_Y*3); + lv_obj_set_size(buttonEcoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonEcoder, event_handler,ID_ENCODER_SETTINGS,NULL,0); + lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonEcoder, LV_LAYOUT_OFF); + labelEcoder = lv_label_create(buttonEcoder, NULL); + + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEcoder); + + buttonEcoderNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonEcoderNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*3+PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonEcoderNarrow, event_handler,ID_ENCODER_SETTINGS_ARROW, NULL,0); + lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonEcoderNarrow, LV_LAYOUT_OFF); + + lv_obj_t * line3 = lv_line_create(scr, NULL); + lv_ex_line(line3,line_points[2]); + #endif + buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ADVANCE_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ADVANCE_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); @@ -131,10 +308,27 @@ void lv_draw_advance_settings(void) { lv_label_set_text(labelPausePos, machine_menu.PausePosition); lv_obj_align(labelPausePos, buttonPausePos, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelFilamentSettings, machine_menu.FilamentConf); + lv_obj_align(labelFilamentSettings, buttonFilamentSettings, LV_ALIGN_IN_LEFT_MID, 0, 0); + + #if ENABLED(USE_WIFI_FUNCTION) + lv_label_set_text(labelWifiSet, machine_menu.WifiSettings); + lv_obj_align(labelWifiSet, buttonWifiSet, LV_ALIGN_IN_LEFT_MID,0, 0); + #endif + #if HAS_ROTARY_ENCODER + lv_label_set_text(labelEcoder, machine_menu.EncoderSettings); + lv_obj_align(labelEcoder, buttonEcoder, LV_ALIGN_IN_LEFT_MID,0, 0); + #endif } } -void lv_clear_advance_settings() { lv_obj_del(scr); } +void lv_clear_advance_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp new file mode 100644 index 0000000000..bb6b45aebe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -0,0 +1,203 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_TFT_LVGL_UI, HAS_BED_PROBE) + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" +#include "../../../../module/probe.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_OFFSET_RETURN 1 +#define ID_OFFSET_X 2 +#define ID_OFFSET_Y 3 +#define ID_OFFSET_Z 4 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_OFFSET_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_auto_level_offset_settings(); + draw_return_ui(); + } + break; + case ID_OFFSET_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = x_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); + } + break; + case ID_OFFSET_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = y_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); + } + break; + case ID_OFFSET_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = z_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); + } + break; + } +} + +void lv_draw_auto_level_offset_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NOZZLE_PROBE_OFFSET_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = NOZZLE_PROBE_OFFSET_UI; + } + disp_state = NOZZLE_PROBE_OFFSET_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.OffsetConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.Xoffset); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_OFFSET_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Yoffset); + + buttonYValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_OFFSET_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Zoffset); + + buttonZValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_OFFSET_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_OFFSET_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonBack); + } + #endif + + if (gCfgItems.multiple_language != 0) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.y, 0)); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), probe.offset.z); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_auto_level_offset_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI && HAS_BED_PROBE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h new file mode 100644 index 0000000000..688cd205d0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_auto_level_offset_settings(void); +extern void lv_clear_auto_level_offset_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp new file mode 100644 index 0000000000..70564c036c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -0,0 +1,352 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" + +#if HAS_BED_PROBE + #include "../../../../module/probe.h" +#endif + +extern lv_group_t * g; +static lv_obj_t * scr; + +static lv_obj_t *labelV, *buttonV, * zOffsetText; + +#define ID_BABY_STEP_X_P 1 +#define ID_BABY_STEP_X_N 2 +#define ID_BABY_STEP_Y_P 3 +#define ID_BABY_STEP_Y_N 4 +#define ID_BABY_STEP_Z_P 5 +#define ID_BABY_STEP_Z_N 6 +#define ID_BABY_STEP_DIST 7 +#define ID_BABY_STEP_RETURN 8 + +static float babystep_dist=0.01; +static uint8_t has_adjust_z = 0; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + char baby_buf[30]={0}; + switch (obj->mks_obj_id) { + case ID_BABY_STEP_X_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 X%.3f"),babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_X_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 X%.3f"),((float)0 - babystep_dist)); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_Y_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 Y%.3f"), babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_Y_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 Y%.3f"),((float)0 - babystep_dist)); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_Z_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_Z_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 Z%.3f"),((float)0 - babystep_dist)); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_DIST: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (abs((int)(100 * babystep_dist)) == 1) + babystep_dist = 0.05; + else if (abs((int)(100 * babystep_dist)) == 5) + babystep_dist = 0.1; + else + babystep_dist = 0.01; + disp_baby_step_dist(); + } + + break; + case ID_BABY_STEP_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (has_adjust_z == 1) { + gcode.process_subcommands_now_P(PSTR("M500")); + has_adjust_z = 0; + } + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_baby_stepping(void) { + lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD, *buttonZI, *buttonZD, *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != BABY_STEP_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = BABY_STEP_UI; + } + disp_state = BABY_STEP_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, creat_title_text()); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + // Create an Image button + buttonXI = lv_imgbtn_create(scr, NULL); + buttonXD = lv_imgbtn_create(scr, NULL); + buttonYI = lv_imgbtn_create(scr, NULL); + buttonYD = lv_imgbtn_create(scr, NULL); + buttonZI = lv_imgbtn_create(scr, NULL); + buttonZD = lv_imgbtn_create(scr, NULL); + buttonV = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_BABY_STEP_X_P, NULL, 0); + lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin"); + lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin"); + lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_label_rel); + + #if 1 + lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_BABY_STEP_X_N, NULL, 0); + lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin"); + lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin"); + lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_BABY_STEP_Y_P, NULL, 0); + lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin"); + lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin"); + lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_BABY_STEP_Y_N, NULL, 0); + lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin"); + lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin"); + lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_BABY_STEP_Z_P, NULL, 0); + lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin"); + lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin"); + lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_BABY_STEP_Z_N, NULL, 0); + lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin"); + lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin"); + lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonV, event_handler, ID_BABY_STEP_DIST, NULL, 0); + lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_BABY_STEP_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + #endif // if 1 + lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight); + lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); + lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); + lv_obj_set_pos(buttonV, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); + lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonYD, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + + // Create labels on the image buttons + lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonV, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + lv_obj_t *labelXI = lv_label_create(buttonXI, NULL); + lv_obj_t *labelXD = lv_label_create(buttonXD, NULL); + lv_obj_t *labelYI = lv_label_create(buttonYI, NULL); + lv_obj_t *labelYD = lv_label_create(buttonYD, NULL); + lv_obj_t *labelZI = lv_label_create(buttonZI, NULL); + lv_obj_t *labelZD = lv_label_create(buttonZD, NULL); + labelV = lv_label_create(buttonV, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelXI, move_menu.x_add); + lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelXD, move_menu.x_dec); + lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelYI, move_menu.y_add); + lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelYD, move_menu.y_dec); + lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelZI, move_menu.z_add); + lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelZD, move_menu.z_dec); + lv_obj_align(labelZD, buttonZD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXI); + lv_group_add_obj(g, buttonXD); + lv_group_add_obj(g, buttonYI); + lv_group_add_obj(g, buttonYD); + lv_group_add_obj(g, buttonZI); + lv_group_add_obj(g, buttonZD); + lv_group_add_obj(g, buttonV); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_baby_step_dist(); + + zOffsetText = lv_label_create(scr, NULL); + lv_obj_set_style(zOffsetText, &tft_style_label_rel); + lv_obj_set_pos(zOffsetText, 290, TITLE_YPOS); + disp_z_offset_value(); +} + +void disp_baby_step_dist() { + // char buf[30] = {0}; + + if ((int)(100 * babystep_dist) == 1) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_01.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_01.bin"); + } + else if ((int)(100 * babystep_dist) == 5) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_05.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_05.bin"); + } + else if ((int)(100 * babystep_dist) == 10) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_1.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_1.bin"); + } + if (gCfgItems.multiple_language != 0) { + if ((int)(100 * babystep_dist) == 1) { + lv_label_set_text(labelV, move_menu.step_001mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if ((int)(100 * babystep_dist) == 5) { + lv_label_set_text(labelV, move_menu.step_005mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if ((int)(100 * babystep_dist) == 10) { + lv_label_set_text(labelV, move_menu.step_01mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } +} + +void disp_z_offset_value() { + char buf[20]; + + ZERO(buf); + sprintf_P(buf, PSTR("offset Z: %.3f"), (double)TERN(HAS_BED_PROBE, probe.offset.z, 0)); + lv_label_set_text(zOffsetText, buf); +} + +void lv_clear_baby_stepping() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h new file mode 100644 index 0000000000..333ba2d597 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_baby_stepping(void); +extern void lv_clear_baby_stepping(); +extern void disp_baby_step_dist(); +extern void disp_z_offset_value(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index cc3f847bce..c60000afae 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -34,9 +34,10 @@ #include "../../../../module/temperature.h" #include "../../../../module/planner.h" +extern lv_group_t * g; static lv_obj_t * scr; -static lv_obj_t * labelStep, *buttonStep, *buttonMov, *buttonExt; -static lv_obj_t * labelMov, *labelExt; +static lv_obj_t *labelStep, *buttonStep, *buttonMov, *buttonExt; +static lv_obj_t *labelMov, *labelExt; static lv_obj_t * printSpeedText; #define ID_C_ADD 1 @@ -175,7 +176,6 @@ void lv_draw_change_speed(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); // Create an Image button buttonAdd = lv_imgbtn_create(scr, NULL); @@ -185,38 +185,34 @@ void lv_draw_change_speed(void) { buttonStep = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_C_ADD, "bmp_Add.bin", 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_C_ADD, NULL, 0); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_C_DEC, "bmp_Dec.bin", 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_C_DEC, NULL, 0); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, NULL, 0); lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, NULL, 0); lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, NULL, 0); lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_C_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_C_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif @@ -253,6 +249,17 @@ void lv_draw_change_speed(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAdd); + lv_group_add_obj(g, buttonDec); + lv_group_add_obj(g, buttonMov); + lv_group_add_obj(g, buttonExt); + lv_group_add_obj(g, buttonStep); + lv_group_add_obj(g, buttonBack); + } + #endif + disp_speed_type(); disp_speed_step(); @@ -262,13 +269,18 @@ void lv_draw_change_speed(void) { } void disp_speed_step() { - if (uiCfg.stepPrintSpeed == 1) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_step1_percent.bin", 0); - else if (uiCfg.stepPrintSpeed == 5) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_step5_percent.bin", 0); - else if (uiCfg.stepPrintSpeed == 10) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_step10_percent.bin", 0); - + if (uiCfg.stepPrintSpeed == 1) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_percent.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_percent.bin"); + } + else if (uiCfg.stepPrintSpeed == 5) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_percent.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_percent.bin"); + } + else if (uiCfg.stepPrintSpeed == 10) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_percent.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_percent.bin"); + } if (gCfgItems.multiple_language != 0) { if (uiCfg.stepPrintSpeed == 1) { lv_label_set_text(labelStep, speed_menu.step_1percent); @@ -309,13 +321,17 @@ void disp_print_speed() { void disp_speed_type() { switch (speedType) { case 1: - lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_extruct_sel.bin", 0); - lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_changeSpeed.bin", 0); + lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, "F:/bmp_mov_changeSpeed.bin"); + lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, "F:/bmp_mov_changeSpeed.bin"); + lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, "F:/bmp_extruct_sel.bin"); + lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, "F:/bmp_extruct_sel.bin"); break; default: - lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_speed_extruct.bin", 0); - lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_sel.bin", 0); + lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, "F:/bmp_mov_sel.bin"); + lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, "F:/bmp_mov_sel.bin"); + lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, "F:/bmp_speed_extruct.bin"); + lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, "F:/bmp_speed_extruct.bin"); break; } lv_obj_refresh_ext_draw_pad(buttonExt); @@ -330,6 +346,11 @@ void disp_speed_type() { } } -void lv_clear_change_speed() { lv_obj_del(scr); } +void lv_clear_change_speed() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 3b4fc8d207..c848323010 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -41,6 +41,7 @@ #include "../../../../gcode/queue.h" #include "../../../../module/temperature.h" #include "../../../../module/planner.h" +#include "../../../../gcode/gcode.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -51,20 +52,25 @@ #endif #include "../../../../gcode/gcode.h" -#include "pic_manager.h" - +extern lv_group_t * g; static lv_obj_t * scr; +static lv_obj_t * tempText1; +static lv_obj_t * filament_bar; + extern uint8_t sel_id; extern uint8_t once_flag; extern uint8_t gcode_preview_over; -uint8_t DialogType; +extern int upload_result ; +extern uint32_t upload_time; +extern uint32_t upload_size; +extern uint8_t temperature_change_frequency; static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { if (event == LV_EVENT_CLICKED) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - if (DialogType == DIALOG_TYPE_PRINT_FILE) { + if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) { #if HAS_GCODE_PREVIEW preview_gcode_prehandle(list_file.file_name[sel_id]); #endif @@ -108,7 +114,8 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { } #endif } - else if (DialogType == DIALOG_TYPE_STOP) { + else if (uiCfg.dialogType == DIALOG_TYPE_STOP) { + wait_for_heatup = false; stop_print_time(); lv_clear_dialog(); lv_draw_ready_print(); @@ -130,40 +137,57 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { //queue.inject_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0\nM84\nM107")); #endif } - else if (DialogType == DIALOG_TYPE_FINISH_PRINT) { + else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) { clear_cur_ui(); lv_draw_ready_print(); } #if ENABLED(ADVANCED_PAUSE_FEATURE) - else if (DialogType == DIALOG_PAUSE_MESSAGE_WAITING - || DialogType == DIALOG_PAUSE_MESSAGE_INSERT - || DialogType == DIALOG_PAUSE_MESSAGE_HEAT + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT ) { wait_for_user = false; } - else if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; } - else if (DialogType == DIALOG_PAUSE_MESSAGE_RESUME) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { clear_cur_ui(); draw_return_ui(); } #endif - else if (DialogType == DIALOG_STORE_EEPROM_TIPS) { + else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) { gcode.process_subcommands_now_P(PSTR("M500")); clear_cur_ui(); draw_return_ui(); } - else if (DialogType == DIALOG_READ_EEPROM_TIPS) { + else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) { gcode.process_subcommands_now_P(PSTR("M501")); clear_cur_ui(); draw_return_ui(); } - else if (DialogType == DIALOG_REVERT_EEPROM_TIPS) { + else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { gcode.process_subcommands_now_P(PSTR("M502")); clear_cur_ui(); draw_return_ui(); } + else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) { + uiCfg.configWifi = 1; + clear_cur_ui(); + draw_return_ui(); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) { + uiCfg.filament_heat_completed_load = 1; + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) { + uiCfg.filament_heat_completed_unload = 1; + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED + ) { + clear_cur_ui(); + draw_return_ui(); + } } } @@ -172,11 +196,35 @@ static void btn_cancel_event_cb(lv_obj_t * btn, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { #if ENABLED(ADVANCED_PAUSE_FEATURE) pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; #endif } + else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) + ) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak; + clear_cur_ui(); + draw_return_ui(); + } + else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) + ) { + queue.enqueue_one_P(PSTR("M410")); + uiCfg.filament_rate = 0; + uiCfg.filament_loading_completed = 0; + uiCfg.filament_unloading_completed = 0; + uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_time_cnt = 0; + uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_time_cnt = 0; + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + clear_cur_ui(); + draw_return_ui(); + } else { clear_cur_ui(); draw_return_ui(); @@ -186,13 +234,15 @@ static void btn_cancel_event_cb(lv_obj_t * btn, lv_event_t event) { void lv_draw_dialog(uint8_t type) { + lv_obj_t * btnOk = NULL; + lv_obj_t * btnCancel = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != DIALOG_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = DIALOG_UI; } disp_state = DIALOG_UI; - DialogType = type; + uiCfg.dialogType = type; scr = lv_obj_create(NULL, NULL); @@ -208,7 +258,6 @@ void lv_draw_dialog(uint8_t type) { lv_refr_now(lv_refr_get_disp_refreshing()); - //LV_IMG_DECLARE(bmp_pic); static lv_style_t style_btn_rel; // A variable to store the released style lv_style_copy(&style_btn_rel, &lv_style_plain); // Initialize from a built-in style @@ -231,60 +280,151 @@ void lv_draw_dialog(uint8_t type) { style_btn_pr.text.color = lv_color_hex3(0xBCD); style_btn_pr.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - lv_obj_t * labelDialog = lv_label_create(scr, NULL); + lv_obj_t *labelDialog = lv_label_create(scr, NULL); lv_obj_set_style(labelDialog, &tft_style_label_rel); - if (DialogType == DIALOG_TYPE_FINISH_PRINT || DialogType == DIALOG_PAUSE_MESSAGE_RESUME) { - lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text + if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { + btnOk = lv_btn_create(scr, NULL); // Add a button the current screen + lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position + lv_obj_set_size(btnOk, 100, 50); // Set its size + lv_obj_set_event_cb(btnOk, btn_ok_event_cb); + lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style + lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style + lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text } - else if (DialogType == DIALOG_PAUSE_MESSAGE_WAITING - || DialogType == DIALOG_PAUSE_MESSAGE_INSERT - || DialogType == DIALOG_PAUSE_MESSAGE_HEAT + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT ) { - lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen + btnOk = lv_btn_create(scr, NULL); // Add a button the current screen lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position lv_obj_set_size(btnOk, 100, 50); // Set its size lv_obj_set_event_cb(btnOk, btn_ok_event_cb); lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text } - else if (DialogType == DIALOG_PAUSE_MESSAGE_PAUSING - || DialogType == DIALOG_PAUSE_MESSAGE_CHANGING - || DialogType == DIALOG_PAUSE_MESSAGE_UNLOAD - || DialogType == DIALOG_PAUSE_MESSAGE_LOAD - || DialogType == DIALOG_PAUSE_MESSAGE_PURGE - || DialogType == DIALOG_PAUSE_MESSAGE_RESUME - || DialogType == DIALOG_PAUSE_MESSAGE_HEATING + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING ) { // nothing to do } + else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + } + else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + } + #if ENABLED(USE_WIFI_FUNCTION) + else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) { + if (upload_result == 2) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + } + else if (upload_result == 3) { + btnOk = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnOk, 100, 50); + lv_obj_set_event_cb(btnOk, btn_ok_event_cb); + lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelOk = lv_label_create(btnOk, NULL); + lv_label_set_text(labelOk, print_file_dialog_menu.confirm); + } + } + #endif //USE_WIFI_FUNCTION + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT + ) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + + tempText1 = lv_label_create(scr, NULL); + lv_obj_set_style(tempText1, &tft_style_label_rel); + filament_sprayer_temp(); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED + ) { + btnOk = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnOk, 100, 50); + lv_obj_set_event_cb(btnOk, btn_ok_event_cb); + lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelOk = lv_label_create(btnOk, NULL); + lv_label_set_text(labelOk, print_file_dialog_menu.confirm); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING + ) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + + filament_bar = lv_bar_create(scr, NULL); + lv_obj_set_pos(filament_bar, (TFT_WIDTH-400)/2, ((TFT_HEIGHT - titleHeight)-40)/2); + lv_obj_set_size(filament_bar, 400, 25); + lv_bar_set_style(filament_bar, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); + lv_bar_set_anim_time(filament_bar, 1000); + lv_bar_set_value(filament_bar, 0, LV_ANIM_ON); + } else { - lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen + btnOk = lv_btn_create(scr, NULL); // Add a button the current screen lv_obj_set_pos(btnOk, BTN_OK_X, BTN_OK_Y); // Set its position lv_obj_set_size(btnOk, 100, 50); // Set its size lv_obj_set_event_cb(btnOk, btn_ok_event_cb); lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button - lv_obj_t * btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen + btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen lv_obj_set_pos(btnCancel, BTN_CANCEL_X, BTN_CANCEL_Y); // Set its position lv_obj_set_size(btnCancel, 100, 50); // Set its size lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t * labelCancel = lv_label_create(btnCancel, NULL); // Add a label to the button + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); // Add a label to the button - if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text lv_label_set_text(labelCancel, pause_msg_menu.continuePrint); } @@ -293,82 +433,271 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } } - if (DialogType == DIALOG_TYPE_PRINT_FILE) { + if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) { lv_label_set_text(labelDialog, print_file_dialog_menu.print_file); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - lv_obj_t * labelFile = lv_label_create(scr, NULL); + lv_obj_t *labelFile = lv_label_create(scr, NULL); lv_obj_set_style(labelFile, &tft_style_label_rel); lv_label_set_text(labelFile, list_file.long_name[sel_id]); lv_obj_align(labelFile, NULL, LV_ALIGN_CENTER, 0, -60); } - else if (DialogType == DIALOG_TYPE_STOP) { + else if (uiCfg.dialogType == DIALOG_TYPE_STOP) { lv_label_set_text(labelDialog, print_file_dialog_menu.cancle_print); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_TYPE_FINISH_PRINT) { + else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) { lv_label_set_text(labelDialog, print_file_dialog_menu.print_finish); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_PAUSING) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING) { lv_label_set_text(labelDialog, pause_msg_menu.pausing); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_CHANGING) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING) { lv_label_set_text(labelDialog, pause_msg_menu.changing); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_UNLOAD) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD) { lv_label_set_text(labelDialog, pause_msg_menu.unload); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_WAITING) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING) { lv_label_set_text(labelDialog, pause_msg_menu.waiting); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_INSERT) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT) { lv_label_set_text(labelDialog, pause_msg_menu.insert); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_LOAD) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD) { lv_label_set_text(labelDialog, pause_msg_menu.load); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_PURGE) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE) { lv_label_set_text(labelDialog, pause_msg_menu.purge); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_RESUME) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { lv_label_set_text(labelDialog, pause_msg_menu.resume); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_HEAT) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT) { lv_label_set_text(labelDialog, pause_msg_menu.heat); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_HEATING) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING) { lv_label_set_text(labelDialog, pause_msg_menu.heating); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { lv_label_set_text(labelDialog, pause_msg_menu.option); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_STORE_EEPROM_TIPS) { + else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) { lv_label_set_text(labelDialog, eeprom_menu.storeTips); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_READ_EEPROM_TIPS) { + else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) { lv_label_set_text(labelDialog, eeprom_menu.readTips); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } - else if (DialogType == DIALOG_REVERT_EEPROM_TIPS) { + else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { lv_label_set_text(labelDialog, eeprom_menu.revertTips); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } + else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) { + lv_label_set_text(labelDialog, machine_menu.wifiConfigTips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) { + lv_label_set_text(labelDialog, print_file_dialog_menu.wifi_enable_tips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { + lv_label_set_text(labelDialog, DIALOG_UPDATE_NO_DEVICE_EN); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + #if ENABLED(USE_WIFI_FUNCTION) + else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) { + if (upload_result == 1) { + lv_label_set_text(labelDialog, DIALOG_UPLOAD_ING_EN); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (upload_result == 2) { + lv_label_set_text(labelDialog, DIALOG_UPLOAD_ERROR_EN); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (upload_result == 3) { + char buf[200]; + int _index = 0; + + ZERO(buf); + + strcpy(buf, DIALOG_UPLOAD_FINISH_EN); + _index = strlen(buf); + buf[_index] = '\n'; + _index++; + strcat(buf, DIALOG_UPLOAD_SIZE_EN); + + _index = strlen(buf); + buf[_index] = ':'; + _index++; + sprintf(&buf[_index], " %d KBytes\n", (int)(upload_size / 1024)); + + strcat(buf, DIALOG_UPLOAD_TIME_EN); + _index = strlen(buf); + buf[_index] = ':'; + _index++; + sprintf(&buf[_index], " %d s\n", (int)upload_time); + + strcat(buf, DIALOG_UPLOAD_SPEED_EN); + _index = strlen(buf); + buf[_index] = ':'; + _index++; + sprintf(&buf[_index], " %d KBytes/s\n", (int)(upload_size / upload_time / 1024)); + + lv_label_set_text(labelDialog, buf); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + + } + } + #endif //USE_WIFI_FUNCTION + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat_confirm); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat_confirm); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_completed); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_completed); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_loading); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_unloading); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + if (btnOk) lv_group_add_obj(g, btnOk); + if (btnCancel) lv_group_add_obj(g, btnCancel); + } + #endif } -void lv_clear_dialog() { lv_obj_del(scr); } +void filament_sprayer_temp() { + char buf[20] = {0}; + + public_buf_l[0] = '\0'; + + if (uiCfg.curSprayerChoose < 1) + strcat(public_buf_l, preheat_menu.ext1); + else + strcat(public_buf_l, preheat_menu.ext2); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + + strcat_P(public_buf_l, PSTR(": ")); + strcat(public_buf_l, buf); + lv_label_set_text(tempText1, public_buf_l); + lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); +} + +void filament_dialog_handle() { + if ((temperature_change_frequency == 1) + && ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT)) + ) { + filament_sprayer_temp(); + temperature_change_frequency = 0; + } + if (uiCfg.filament_heat_completed_load == 1) { + uiCfg.filament_heat_completed_load = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOADING); + planner.synchronize(); + uiCfg.filament_loading_time_flg = 1; + uiCfg.filament_loading_time_cnt = 0; + ZERO(public_buf_m); + sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_load_length,gCfgItems.filamentchange_load_speed); + queue.inject_P(PSTR(public_buf_m)); + //gcode.process_subcommands_now_P(PSTR(public_buf_m)); + } + if (uiCfg.filament_heat_completed_unload == 1) { + uiCfg.filament_heat_completed_unload = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOADING); + planner.synchronize(); + uiCfg.filament_unloading_time_flg = 1; + uiCfg.filament_unloading_time_cnt = 0; + ZERO(public_buf_m); + sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E-%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_unload_length,gCfgItems.filamentchange_unload_speed); + queue.inject_P(PSTR(public_buf_m)); + } + + if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) + || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) + && (uiCfg.filament_load_heat_flg == 1) + ) { + uiCfg.filament_load_heat_flg = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); + } + + if (uiCfg.filament_loading_completed == 1) { + uiCfg.filament_rate = 0; + uiCfg.filament_loading_completed = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED); + } + if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) + || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) + && (uiCfg.filament_unload_heat_flg == 1) + ) { + uiCfg.filament_unload_heat_flg = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); + } + + if (uiCfg.filament_unloading_completed == 1) { + uiCfg.filament_rate = 0; + uiCfg.filament_unloading_completed = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED); + } + + if ( uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING + ) lv_filament_setbar(); +} + +void lv_filament_setbar() { + lv_bar_set_value(filament_bar, uiCfg.filament_rate, LV_ANIM_ON); +} + +void lv_clear_dialog() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index f08c7b779a..dc5adc5ad6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -69,6 +69,8 @@ #define DIALOG_READ_EEPROM_TIPS 33 #define DIALOG_REVERT_EEPROM_TIPS 34 +#define DIALOG_WIFI_CONFIG_TIPS 35 +#define DIALOG_TRANSFER_NO_DEVICE 36 #define BTN_OK_X 100 #define BTN_OK_Y 180 #define BTN_CANCEL_X 280 @@ -76,6 +78,9 @@ extern void lv_draw_dialog(uint8_t type); extern void lv_clear_dialog(); +extern void filament_sprayer_temp(); +extern void filament_dialog_handle(); +extern void lv_filament_setbar(); //extern void disp_temp_ready_print(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp index f340ca4632..ca7d2d1e31 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp @@ -28,6 +28,7 @@ #include "../../../../MarlinCore.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_EEPROM_RETURN 1 @@ -48,26 +49,25 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { draw_return_ui(); } break; + case ID_EEPROM_STORE: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); + } + break; + case ID_EEPROM_STORE_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); + } + break; #if 0 - case ID_EEPROM_STORE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); - } - break; - case ID_EEPROM_STORE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); - } - break; case ID_EEPROM_READ: if (event == LV_EVENT_CLICKED) { @@ -111,10 +111,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_eeprom_settings(void) { lv_obj_t *buttonBack, *label_Back; - //lv_obj_t *buttonStore,*labelStore,*buttonStoreNarrow; + lv_obj_t *buttonStore,*labelStore,*buttonStoreNarrow; //lv_obj_t *buttonRead,*labelRead,*buttonReadNarrow; lv_obj_t *buttonRevert, *labelRevert, *buttonRevertNarrow; - lv_obj_t * line1; // * line2,* line3; + lv_obj_t * line1, * line2; //* line3; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EEPROM_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = EEPROM_SETTINGS_UI; @@ -134,53 +134,6 @@ void lv_draw_eeprom_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - LV_IMG_DECLARE(bmp_para_arrow); - #if 0 - buttonStore = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonStore, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonStore, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonStore, event_handler, ID_EEPROM_STORE, NULL, 0); - lv_btn_set_style(buttonStore, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonStore, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonStore, LV_LAYOUT_OFF); - labelStore = lv_label_create(buttonStore, NULL); /*Add a label to the button*/ - - buttonStoreNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonStoreNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStoreNarrow, event_handler, ID_EEPROM_STORE_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); - lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonStoreNarrow, LV_LAYOUT_OFF); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonRead = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonRead, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonRead, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonRead, event_handler, ID_EEPROM_READ, NULL, 0); - lv_btn_set_style(buttonRead, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonRead, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonRead, LV_LAYOUT_OFF); - labelRead = lv_label_create(buttonRead, NULL); /*Add a label to the button*/ - - buttonReadNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonReadNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonReadNarrow, event_handler, ID_EEPROM_READ_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonReadNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonReadNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); - lv_imgbtn_set_style(buttonReadNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonReadNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonReadNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - #endif // if 0 buttonRevert = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonRevert, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonRevert, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ @@ -193,9 +146,9 @@ void lv_draw_eeprom_settings(void) { buttonRevertNarrow = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonRevertNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonRevertNarrow, event_handler, ID_EEPROM_REVERT_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_event_cb_mks(buttonRevertNarrow, event_handler, ID_EEPROM_REVERT_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonRevertNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonRevertNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonRevertNarrow, LV_LAYOUT_OFF); @@ -205,10 +158,32 @@ void lv_draw_eeprom_settings(void) { line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); + buttonStore = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonStore, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonStore, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + //lv_obj_set_event_cb(buttonMotor, event_handler); + lv_obj_set_event_cb_mks(buttonStore, event_handler, ID_EEPROM_STORE, NULL, 0); + lv_btn_set_style(buttonStore, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonStore, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonStore, LV_LAYOUT_OFF); + labelStore = lv_label_create(buttonStore, NULL); /*Add a label to the button*/ + + buttonStoreNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonStoreNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonStoreNarrow, event_handler, ID_EEPROM_STORE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonStoreNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_EEPROM_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_EEPROM_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); @@ -220,8 +195,8 @@ void lv_draw_eeprom_settings(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - //lv_label_set_text(labelStore, eeprom_menu.store); - //lv_obj_align(labelStore, buttonStore, LV_ALIGN_IN_LEFT_MID,0, 0); + lv_label_set_text(labelStore, eeprom_menu.store); + lv_obj_align(labelStore, buttonStore, LV_ALIGN_IN_LEFT_MID,0, 0); //lv_label_set_text(labelRead, eeprom_menu.read); //lv_obj_align(labelRead, buttonRead, LV_ALIGN_IN_LEFT_MID,0, 0); @@ -229,9 +204,21 @@ void lv_draw_eeprom_settings(void) { lv_label_set_text(labelRevert, eeprom_menu.revert); lv_obj_align(labelRevert, buttonRevert, LV_ALIGN_IN_LEFT_MID, 0, 0); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonRevert); + lv_group_add_obj(g, buttonStore); + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_eeprom_settings() { lv_obj_del(scr); } +void lv_clear_eeprom_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp new file mode 100644 index 0000000000..0ad2bb5f1d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp @@ -0,0 +1,172 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" +#include "../../../../module/stepper/indirection.h" +#include "../../../../feature/tmc_util.h" +#include "../../../../gcode/gcode.h" +#include "../../../../module/planner.h" + +#if BUTTONS_EXIST(EN1, EN2) + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t * buttonEncoderState = NULL; +static lv_obj_t *labelEncoderState = NULL; + +#define ID_ENCODER_RETURN 1 +#define ID_ENCODER_STATE 2 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_ENCODER_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_encoder_settings(); + draw_return_ui(); + } + break; + case ID_ENCODER_STATE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.encoder_enable) { + gCfgItems.encoder_enable = false; + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + lv_label_set_text(labelEncoderState, machine_menu.disable); + update_spi_flash(); + } + else { + gCfgItems.encoder_enable = true; + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelEncoderState, machine_menu.enable); + update_spi_flash(); + } + } + break; + } +} + +void lv_draw_encoder_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *labelEncoderTips = NULL; + + lv_obj_t * line1 = NULL; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ENCODER_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = ENCODER_SETTINGS_UI; + } + disp_state = ENCODER_SETTINGS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.EncoderConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + labelEncoderTips = lv_label_create(scr, NULL); + lv_obj_set_style(labelEncoderTips, &tft_style_label_rel); + lv_obj_set_pos(labelEncoderTips, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelEncoderTips, machine_menu.EncoderConfText); + + buttonEncoderState = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonEncoderState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); + if (gCfgItems.encoder_enable) { + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + + lv_obj_set_event_cb_mks(buttonEncoderState, event_handler, ID_ENCODER_STATE, NULL, 0); + + lv_imgbtn_set_style(buttonEncoderState, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEncoderState, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonEncoderState, LV_LAYOUT_OFF); + labelEncoderState = lv_label_create(buttonEncoderState, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ENCODER_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.encoder_enable) { + lv_label_set_text(labelEncoderState, machine_menu.enable); + lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); + } + else { + lv_label_set_text(labelEncoderState, machine_menu.disable); + lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); + } + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonEncoderState); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_encoder_settings() { + #if HAS_ROTARY_ENCODER + lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // BUTTONS_EXIST(EN1, EN2) + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h new file mode 100644 index 0000000000..62892a6ec1 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_encoder_settings(void); +extern void lv_clear_encoder_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 9f5977d70c..543202067f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -35,10 +35,11 @@ #include "../../../../gcode/queue.h" static lv_obj_t * scr; +extern lv_group_t* g; static lv_obj_t * buttoType, *buttonStep, *buttonSpeed; -static lv_obj_t * labelType; -static lv_obj_t * labelStep; -static lv_obj_t * labelSpeed; +static lv_obj_t *labelType; +static lv_obj_t *labelStep; +static lv_obj_t *labelSpeed; static lv_obj_t * tempText; static lv_obj_t * ExtruText; @@ -171,8 +172,6 @@ void lv_draw_extrusion(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - // Create image buttons buttonAdd = lv_imgbtn_create(scr, NULL); buttonDec = lv_imgbtn_create(scr, NULL); @@ -181,37 +180,35 @@ void lv_draw_extrusion(void) { buttonSpeed = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_E_ADD, "bmp_in.bin", 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_E_ADD, NULL, 0); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_in.bin"); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_in.bin"); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); + #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_E_DEC, "bmp_out.bin", 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_E_DEC, NULL, 0); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_out.bin"); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_out.bin"); lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, NULL, 0); lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, NULL, 0); lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, NULL, 0); lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_E_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_E_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif @@ -249,6 +246,17 @@ void lv_draw_extrusion(void) { lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAdd); + lv_group_add_obj(g, buttonDec); + lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonStep); + lv_group_add_obj(g, buttonSpeed); + lv_group_add_obj(g, buttonBack); + } + #endif + disp_ext_type(); disp_ext_step(); disp_ext_speed(); @@ -264,14 +272,16 @@ void lv_draw_extrusion(void) { void disp_ext_type() { if (uiCfg.curSprayerChoose == 1) { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, "bmp_extru2.bin", 0); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, extrude_menu.ext2); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } else { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, "bmp_extru1.bin", 0); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, extrude_menu.ext1); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -280,12 +290,18 @@ void disp_ext_type() { } void disp_ext_speed() { - if (uiCfg.extruSpeed == 20) - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_speed_high.bin", 0); - else if (uiCfg.extruSpeed == 1) - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_speed_slow.bin", 0); - else - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_speed_normal.bin", 0); + if (uiCfg.extruSpeed == 20) { + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_high.bin"); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_high.bin"); + } + else if (uiCfg.extruSpeed == 1) { + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_slow.bin"); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_slow.bin"); + } + else { + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_normal.bin"); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_normal.bin"); + } if (gCfgItems.multiple_language != 0) { if (uiCfg.extruSpeed == 20) { @@ -348,12 +364,18 @@ void disp_extru_amount() { } void disp_ext_step() { - if (uiCfg.extruStep == 1) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_step1_mm.bin", 0); - else if (uiCfg.extruStep == 5) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_step5_mm.bin", 0); - else if (uiCfg.extruStep == 10) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_step10_mm.bin", 0); + if (uiCfg.extruStep == 1) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_mm.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_mm.bin"); + } + else if (uiCfg.extruStep == 5) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_mm.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_mm.bin"); + } + else if (uiCfg.extruStep == 10) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_mm.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_mm.bin"); + } if (gCfgItems.multiple_language != 0) { if (uiCfg.extruStep == 1) { @@ -371,6 +393,11 @@ void disp_ext_step() { } } -void lv_clear_extrusion() { lv_obj_del(scr); } +void lv_clear_extrusion() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index e1975aca7e..8cdc14964f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -35,6 +35,7 @@ #include "../../../../gcode/queue.h" #include "../../../../gcode/gcode.h" +extern lv_group_t * g; static lv_obj_t * scr; static lv_obj_t * fanText; @@ -138,8 +139,6 @@ void lv_draw_fan(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - // Create an Image button buttonAdd = lv_imgbtn_create(scr, NULL); buttonDec = lv_imgbtn_create(scr, NULL); @@ -148,41 +147,41 @@ void lv_draw_fan(void) { buttonOff = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_F_ADD, "bmp_Add.bin", 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_F_ADD, NULL, 0); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_F_DEC, "bmp_Dec.bin", 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_F_DEC, NULL, 0); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonHigh, event_handler,ID_F_HIGH,"bmp_speed255.bin",0); - lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonHigh, event_handler,ID_F_HIGH, NULL,0); + lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_REL, "F:/bmp_speed255.bin"); + lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_PR, "F:/bmp_speed255.bin"); lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonMid, event_handler,ID_F_MID,"bmp_speed127.bin",0); - lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonMid, event_handler,ID_F_MID, NULL,0); + lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_REL, "F:/bmp_speed127.bin"); + lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_PR, "F:/bmp_speed127.bin"); lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOff, event_handler,ID_F_OFF,"bmp_speed0.bin",0); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonOff, event_handler,ID_F_OFF, NULL,0); + lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, "F:/bmp_speed0.bin"); + lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, "F:/bmp_speed0.bin"); lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_F_RETURN,"bmp_return.bin",0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_F_RETURN, NULL,0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); @@ -229,6 +228,16 @@ void lv_draw_fan(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAdd); + lv_group_add_obj(g, buttonDec); + lv_group_add_obj(g, buttonHigh); + lv_group_add_obj(g, buttonMid); + lv_group_add_obj(g, buttonOff); + lv_group_add_obj(g, buttonBack); + } + #endif fanText = lv_label_create(scr, NULL); lv_obj_set_style(fanText, &tft_style_label_rel); @@ -246,6 +255,11 @@ void disp_fan_value() { lv_obj_align(fanText, NULL, LV_ALIGN_CENTER, 0, -65); } -void lv_clear_fan() { lv_obj_del(scr); } +void lv_clear_fan() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp new file mode 100644 index 0000000000..83f9e53677 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -0,0 +1,270 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" +#include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" +#include "../../../../module/motion.h" +#include "../../../../module/planner.h" + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *buttoType; +static lv_obj_t *labelType; +static lv_obj_t * tempText1; + +#define ID_FILAMNT_IN 1 +#define ID_FILAMNT_OUT 2 +#define ID_FILAMNT_TYPE 3 +#define ID_FILAMNT_RETURN 4 + +extern feedRate_t feedrate_mm_s; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_FILAMNT_IN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.filament_load_heat_flg = 1; + if ((abs(thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius) <= 1) + || (gCfgItems.filament_limit_temper <= thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); + } + else { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } + } + } + break; + case ID_FILAMNT_OUT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.filament_unload_heat_flg=1; + if ((thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > 0) + && ((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) <= 1) + || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= gCfgItems.filament_limit_temper)) + ) { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); + } + else { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } + filament_sprayer_temp(); + } + } + break; + case ID_FILAMNT_TYPE: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + #if HAS_MULTI_EXTRUDER + if (uiCfg.curSprayerChoose == 0) + uiCfg.curSprayerChoose = 1; + else if (uiCfg.curSprayerChoose == 1) + uiCfg.curSprayerChoose = 0; + #endif + disp_filament_type(); + } + break; + case ID_FILAMNT_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + #if HAS_MULTI_EXTRUDER + if (uiCfg.print_state != IDLE && uiCfg.print_state != REPRINTED) + gcode.process_subcommands_now_P(uiCfg.curSprayerChoose_bak == 1 ? PSTR("T1") : PSTR("T0")); + #endif + feedrate_mm_s = (float)uiCfg.moveSpeed_bak; + if (uiCfg.print_state == PAUSED) + planner.set_e_position_mm((destination.e = current_position.e = uiCfg.current_e_position_bak)); + //current_position.e = destination.e = uiCfg.current_e_position_bak; + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_filament_change(void) { + lv_obj_t *buttonIn, *buttonOut; + lv_obj_t *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENTCHANGE_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENTCHANGE_UI; + } + disp_state = FILAMENTCHANGE_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, creat_title_text()); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + // Create an Image button + buttonIn = lv_imgbtn_create(scr, NULL); + buttonOut = lv_imgbtn_create(scr, NULL); + buttoType = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonIn, event_handler, ID_FILAMNT_IN, NULL, 0); + lv_imgbtn_set_src(buttonIn, LV_BTN_STATE_REL, "F:/bmp_in.bin"); + lv_imgbtn_set_src(buttonIn, LV_BTN_STATE_PR, "F:/bmp_in.bin"); + lv_imgbtn_set_style(buttonIn, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonIn, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_clear_protect(buttonIn, LV_PROTECT_FOLLOW); + + lv_obj_set_event_cb_mks(buttonOut, event_handler, ID_FILAMNT_OUT, NULL, 0); + lv_imgbtn_set_src(buttonOut, LV_BTN_STATE_REL, "F:/bmp_out.bin"); + lv_imgbtn_set_src(buttonOut, LV_BTN_STATE_PR, "F:/bmp_out.bin"); + lv_imgbtn_set_style(buttonOut, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonOut, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_FILAMNT_TYPE, NULL, 0); + lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FILAMNT_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonIn, INTERVAL_V, titleHeight); + lv_obj_set_pos(buttonOut, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); + lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + + // Create labels on the image buttons + lv_btn_set_layout(buttonIn, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonOut, LV_LAYOUT_OFF); + lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + lv_obj_t *labelIn = lv_label_create(buttonIn, NULL); + lv_obj_t *labelOut = lv_label_create(buttonOut, NULL); + labelType = lv_label_create(buttoType, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelIn, filament_menu.in); + lv_obj_align(labelIn, buttonIn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelOut, filament_menu.out); + lv_obj_align(labelOut, buttonOut, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonIn); + lv_group_add_obj(g, buttonOut); + lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_filament_type(); + + tempText1 = lv_label_create(scr, NULL); + lv_obj_set_style(tempText1, &tft_style_label_rel); + disp_filament_temp(); +} + +void disp_filament_type() { + if (uiCfg.curSprayerChoose == 1) { + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelType, preheat_menu.ext2); + lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } + else { + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelType, preheat_menu.ext1); + lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } +} + +void disp_filament_temp() { + char buf[20] = {0}; + + public_buf_l[0] = '\0'; + + if (uiCfg.curSprayerChoose < 1) + strcat(public_buf_l, preheat_menu.ext1); + else + strcat(public_buf_l, preheat_menu.ext2); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + + strcat_P(public_buf_l, PSTR(": ")); + strcat(public_buf_l, buf); + lv_label_set_text(tempText1, public_buf_l); + lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); +} + +void lv_clear_filament_change() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h new file mode 100644 index 0000000000..b0068f7f0f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_filament_change(void); +extern void lv_clear_filament_change(); +extern void disp_filament_type(); +extern void disp_filament_temp(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp new file mode 100644 index 0000000000..06ab35f3f0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -0,0 +1,329 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_FILAMENT_SET_RETURN 1 +#define ID_FILAMENT_SET_IN_LENGTH 2 +#define ID_FILAMENT_SET_IN_SPEED 3 +#define ID_FILAMENT_SET_OUT_LENGTH 4 +#define ID_FILAMENT_SET_OUT_SPEED 5 +#define ID_FILAMENT_SET_TEMP 6 +#define ID_FILAMENT_SET_DOWN 12 +#define ID_FILAMENT_SET_UP 13 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_FILAMENT_SET_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_filament_settings(); + draw_return_ui(); + } + break; + case ID_FILAMENT_SET_IN_LENGTH: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = load_length; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_IN_SPEED: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = load_speed; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_OUT_LENGTH: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = unload_length; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_OUT_SPEED: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = unload_speed; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_TEMP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = filament_temp; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_filament_settings(); + lv_draw_filament_settings(); + } + break; + case ID_FILAMENT_SET_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_filament_settings(); + lv_draw_filament_settings(); + } + break; + } +} + +void lv_draw_filament_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *labelInLengthText = NULL, *buttonInLengthValue = NULL, *labelInLengthValue = NULL; + lv_obj_t *labelInSpeedText = NULL, *buttonInSpeedValue = NULL, *labelInSpeedValue = NULL; + lv_obj_t *labelOutLengthText = NULL, *buttonOutLengthValue = NULL, *labelOutLengthValue = NULL; + lv_obj_t *labelOutSpeedText = NULL, *buttonOutSpeedValue = NULL, *labelOutSpeedValue = NULL; + lv_obj_t *labelTemperText = NULL, *buttonTemperValue = NULL, *labelTemperValue = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENT_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENT_SETTINGS_UI; + } + disp_state = FILAMENT_SETTINGS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.FilamentConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + if (uiCfg.para_ui_page != 1) { + labelInLengthText = lv_label_create(scr, NULL); + lv_obj_set_style(labelInLengthText, &tft_style_label_rel); + lv_obj_set_pos(labelInLengthText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelInLengthText, machine_menu.InLength); + + buttonInLengthValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonInLengthValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonInLengthValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonInLengthValue, event_handler, ID_FILAMENT_SET_IN_LENGTH, NULL, 0); + lv_btn_set_style(buttonInLengthValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonInLengthValue, LV_BTN_STYLE_PR, &style_para_value); + labelInLengthValue = lv_label_create(buttonInLengthValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelInSpeedText = lv_label_create(scr, NULL); + lv_obj_set_style(labelInSpeedText, &tft_style_label_rel); + lv_obj_set_pos(labelInSpeedText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelInSpeedText, machine_menu.InSpeed); + + buttonInSpeedValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonInSpeedValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonInSpeedValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonInSpeedValue, event_handler, ID_FILAMENT_SET_IN_SPEED, NULL, 0); + lv_btn_set_style(buttonInSpeedValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonInSpeedValue, LV_BTN_STYLE_PR, &style_para_value); + labelInSpeedValue = lv_label_create(buttonInSpeedValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelOutLengthText = lv_label_create(scr, NULL); + lv_obj_set_style(labelOutLengthText, &tft_style_label_rel); + lv_obj_set_pos(labelOutLengthText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 6); + lv_label_set_text(labelOutLengthText, machine_menu.OutLength); + + buttonOutLengthValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonOutLengthValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonOutLengthValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonOutLengthValue, event_handler, ID_FILAMENT_SET_OUT_LENGTH, NULL, 0); + lv_btn_set_style(buttonOutLengthValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonOutLengthValue, LV_BTN_STYLE_PR, &style_para_value); + labelOutLengthValue = lv_label_create(buttonOutLengthValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelOutSpeedText = lv_label_create(scr, NULL); + lv_obj_set_style(labelOutSpeedText, &tft_style_label_rel); + lv_obj_set_pos(labelOutSpeedText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelOutSpeedText, machine_menu.OutSpeed); + + buttonOutSpeedValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonOutSpeedValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonOutSpeedValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonOutSpeedValue, event_handler, ID_FILAMENT_SET_OUT_SPEED, NULL, 0); + lv_btn_set_style(buttonOutSpeedValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonOutSpeedValue, LV_BTN_STYLE_PR, &style_para_value); + labelOutSpeedValue = lv_label_create(buttonOutSpeedValue, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FILAMENT_SET_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonInLengthValue); + lv_group_add_obj(g, buttonInSpeedValue); + lv_group_add_obj(g, buttonOutLengthValue); + lv_group_add_obj(g, buttonOutSpeedValue); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + else { + labelTemperText = lv_label_create(scr, NULL); + lv_obj_set_style(labelTemperText, &tft_style_label_rel); + lv_obj_set_pos(labelTemperText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelTemperText, machine_menu.FilamentTemperature); + + buttonTemperValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonTemperValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonTemperValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonTemperValue, event_handler, ID_FILAMENT_SET_TEMP, NULL, 0); + lv_btn_set_style(buttonTemperValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonTemperValue, LV_BTN_STYLE_PR, &style_para_value); + labelTemperValue = lv_label_create(buttonTemperValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FILAMENT_SET_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonTemperValue); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FILAMENT_SET_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); + lv_label_set_text(labelInLengthValue, public_buf_l); + lv_obj_align(labelInLengthValue, buttonInLengthValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_speed); + lv_label_set_text(labelInSpeedValue, public_buf_l); + lv_obj_align(labelInSpeedValue, buttonInSpeedValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_length); + lv_label_set_text(labelOutLengthValue, public_buf_l); + lv_obj_align(labelOutLengthValue, buttonOutLengthValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_speed); + lv_label_set_text(labelOutSpeedValue, public_buf_l); + lv_obj_align(labelOutSpeedValue, buttonOutSpeedValue, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + } + else { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temper); + lv_label_set_text(labelTemperValue, public_buf_l); + lv_obj_align(labelTemperValue, buttonTemperValue, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + } + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_filament_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h new file mode 100644 index 0000000000..a5ae542895 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_filament_settings(void); +extern void lv_clear_filament_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 595d1078c7..22e05f0e00 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -34,6 +34,7 @@ #include "draw_ui.h" #include "../../../../gcode/queue.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_H_ALL 1 @@ -92,7 +93,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { if (event == LV_EVENT_CLICKED) { } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_home(); lv_draw_tool(); } break; @@ -125,128 +126,93 @@ void lv_draw_home(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - - /*Create an Image button*/ - //buttonWifi = lv_imgbtn_create(scr, NULL); - buttonHomeAll = lv_imgbtn_create(scr, NULL); - buttonHomeX = lv_imgbtn_create(scr, NULL); + // Create image buttons + //buttonWifi = lv_imgbtn_create(scr, NULL); + buttonHomeAll = lv_imgbtn_create(scr, NULL); + buttonHomeX = lv_imgbtn_create(scr, NULL); //buttonContinue = lv_imgbtn_create(scr, NULL); - buttonHomeY = lv_imgbtn_create(scr, NULL); - buttonHomeZ = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - buttonOffAll = lv_imgbtn_create(scr, NULL); - buttonOffXY = lv_imgbtn_create(scr, NULL); + buttonHomeY = lv_imgbtn_create(scr, NULL); + buttonHomeZ = lv_imgbtn_create(scr, NULL); + buttonOffAll = lv_imgbtn_create(scr, NULL); + buttonOffXY = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); - //lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,"bmp_Wifi.bin",0); - //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_clear_protect(buttonWifi, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonHomeAll, event_handler,ID_H_ALL,"bmp_zero.bin",0); - lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonHomeAll, event_handler,ID_H_ALL, NULL,0); + lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_REL, "F:/bmp_zeroAll.bin"); + lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_PR, "F:/bmp_zeroAll.bin"); lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonHomeX, event_handler, ID_H_X, "bmp_zeroX.bin", 0); - lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonHomeX, event_handler, ID_H_X, NULL, 0); + lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_REL, "F:/bmp_zeroX.bin"); + lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_PR, "F:/bmp_zeroX.bin"); lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_set_event_cb_mks(buttonContinue, event_handler,ID_S_CONTINUE,"bmp_Breakpoint.bin",0); - //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHomeY, event_handler, ID_H_Y, "bmp_zeroY.bin", 0); - lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonHomeY, event_handler, ID_H_Y, NULL, 0); + lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_REL, "F:/bmp_zeroY.bin"); + lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_PR, "F:/bmp_zeroY.bin"); lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonHomeZ, event_handler, ID_H_Z, "bmp_zeroZ.bin", 0); - lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonHomeZ, event_handler, ID_H_Z, NULL, 0); + lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_REL, "F:/bmp_zeroZ.bin"); + lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_PR, "F:/bmp_zeroZ.bin"); lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOffAll, event_handler,ID_H_OFF_ALL,"bmp_function1.bin",0); - lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonOffAll, event_handler,ID_H_OFF_ALL, NULL,0); + lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); + lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOffXY, event_handler,ID_H_OFF_XY,"bmp_function1.bin",0); - lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonOffXY, event_handler,ID_H_OFF_XY, NULL,0); + lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); + lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_H_RETURN,"bmp_return.bin",0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_H_RETURN, NULL,0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif - /*lv_obj_set_pos(buttonWifi, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonFan, BTN_X_PIXEL+INTERVAL_V*2, titleHeight); - lv_obj_set_pos(buttonAbout, BTN_X_PIXEL*2+INTERVAL_V*3, titleHeight); - lv_obj_set_pos(buttonContinue, BTN_X_PIXEL*3+INTERVAL_V*4, titleHeight); - lv_obj_set_pos(buMotorOff, INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonLanguage, BTN_X_PIXEL+INTERVAL_V*2, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ - - //lv_obj_set_pos(buttonWifi, INTERVAL_V, titleHeight); + lv_obj_set_pos(buttonHomeAll, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonHomeX, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonHomeY, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); lv_obj_set_pos(buttonHomeZ, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonHomeAll, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonOffAll, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonOffXY, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ - //lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); + // Create labels on the image buttons lv_btn_set_layout(buttonHomeAll, LV_LAYOUT_OFF); lv_btn_set_layout(buttonHomeX, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonContinue, LV_LAYOUT_OFF); lv_btn_set_layout(buttonHomeY, LV_LAYOUT_OFF); lv_btn_set_layout(buttonHomeZ, LV_LAYOUT_OFF); lv_btn_set_layout(buttonOffAll, LV_LAYOUT_OFF); lv_btn_set_layout(buttonOffXY, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - //lv_obj_t * labelWifi= lv_label_create(buttonWifi, NULL); - lv_obj_t * labelHomeAll = lv_label_create(buttonHomeAll, NULL); - lv_obj_t * labelHomeX = lv_label_create(buttonHomeX, NULL); - //lv_obj_t * label_Continue = lv_label_create(buttonContinue, NULL); - lv_obj_t * labelHomeY = lv_label_create(buttonHomeY, NULL); - lv_obj_t * labelHomeZ = lv_label_create(buttonHomeZ, NULL); - lv_obj_t * labelOffAll = lv_label_create(buttonOffAll, NULL); - lv_obj_t * labelOffXY = lv_label_create(buttonOffXY, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); - + lv_obj_t *labelHomeAll = lv_label_create(buttonHomeAll, NULL); + lv_obj_t *labelHomeX = lv_label_create(buttonHomeX, NULL); + lv_obj_t *labelHomeY = lv_label_create(buttonHomeY, NULL); + lv_obj_t *labelHomeZ = lv_label_create(buttonHomeZ, NULL); + lv_obj_t *labelOffAll = lv_label_create(buttonOffAll, NULL); + lv_obj_t *labelOffXY = lv_label_create(buttonOffXY, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { - //lv_label_set_text(labelWifi, set_menu.wifi); - //lv_obj_align(labelWifi, buttonWifi, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(labelHomeAll, home_menu.home_all); lv_obj_align(labelHomeAll, buttonHomeAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(labelHomeX, home_menu.home_x); lv_obj_align(labelHomeX, buttonHomeX, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - //lv_label_set_text(label_Continue, set_menu.breakpoint); - //lv_obj_align(label_Continue, buttonContinue, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(labelHomeY, home_menu.home_y); lv_obj_align(labelHomeY, buttonHomeY, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -262,8 +228,25 @@ void lv_draw_home(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonHomeAll); + lv_group_add_obj(g, buttonHomeX); + lv_group_add_obj(g, buttonHomeY); + lv_group_add_obj(g, buttonHomeZ); + lv_group_add_obj(g, buttonOffAll); + lv_group_add_obj(g, buttonOffXY); + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_home() { lv_obj_del(scr); } +void lv_clear_home() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp new file mode 100644 index 0000000000..d22eeb157e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp @@ -0,0 +1,262 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" +#include "../../../../module/probe.h" + +#if USE_SENSORLESS +#include "../../../../module/stepper/indirection.h" +#include "../../../../feature/tmc_util.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_SENSITIVITY_RETURN 1 +#define ID_SENSITIVITY_X 2 +#define ID_SENSITIVITY_Y 3 +#define ID_SENSITIVITY_Z 4 +#define ID_SENSITIVITY_Z2 5 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_SENSITIVITY_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_homing_sensitivity_settings(); + draw_return_ui(); + } + break; + case ID_SENSITIVITY_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = x_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); + } + break; + case ID_SENSITIVITY_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = y_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); + } + break; + case ID_SENSITIVITY_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = z_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); + } + break; + #if Z2_SENSORLESS + case ID_SENSITIVITY_Z2: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = z2_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); + } + break; + #endif + } +} + +void lv_draw_homing_sensitivity_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; + #if Z2_SENSORLESS + lv_obj_t *labelZ2Text = NULL, *buttonZ2Value = NULL, *labelZ2Value = NULL; + lv_obj_t * line4 = NULL; + #endif + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != HOMING_SENSITIVITY_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = HOMING_SENSITIVITY_UI; + } + disp_state = HOMING_SENSITIVITY_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.HomingSensitivityConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.X_Sensitivity); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_SENSITIVITY_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + labelXValue = lv_label_create(buttonXValue, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXValue); + #endif + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Y_Sensitivity); + + buttonYValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_SENSITIVITY_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYValue); + #endif + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Sensitivity); + + buttonZValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_SENSITIVITY_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) lv_group_add_obj(g, buttonZValue); + #endif + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + #if Z2_SENSORLESS + labelZ2Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelZ2Text, &tft_style_label_rel); + lv_obj_set_pos(labelZ2Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelZ2Text, machine_menu.Z2_Sensitivity); + + buttonZ2Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonZ2Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonZ2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZ2Value, event_handler, ID_SENSITIVITY_Z2, NULL, 0); + lv_btn_set_style(buttonZ2Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZ2Value, LV_BTN_STYLE_PR, &style_para_value); + labelZ2Value = lv_label_create(buttonZ2Value, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZ2Value); + #endif + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + #endif + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_SENSITIVITY_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + if (gCfgItems.multiple_language != 0) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + + #if Z2_SENSORLESS + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); + lv_label_set_text(labelZ2Value, public_buf_l); + lv_obj_align(labelZ2Value, buttonZ2Value, LV_ALIGN_CENTER, 0, 0); + #endif + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_homing_sensitivity_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // USE_SENSORLESS + +#endif // HAS_TFT_LVGL_UI && USE_SENSORLESS diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h new file mode 100644 index 0000000000..0c554702b1 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_homing_sensitivity_settings(void); +extern void lv_clear_homing_sensitivity_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp index a552762cf3..8c359233e6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -29,6 +29,7 @@ #include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_JERK_RETURN 1 @@ -93,10 +94,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_jerk_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonEText = NULL, *labelEText = NULL, *buttonEValue = NULL, *labelEValue = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelEText = NULL, *buttonEValue = NULL, *labelEValue = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != JERK_UI) { disp_state_stack._disp_index++; @@ -117,109 +118,89 @@ void lv_draw_jerk_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - // LV_IMG_DECLARE(bmp_para_arrow); - LV_IMG_DECLARE(bmp_para_bank); + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.X_Jerk); - buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonXText, event_handler); - lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); - labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ - - buttonXValue = lv_imgbtn_create(scr, NULL); + buttonXValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_JERK_X, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_JERK_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); labelXValue = lv_label_create(buttonXValue, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonYText, event_handler); - lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); - labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Y_Jerk); - buttonYValue = lv_imgbtn_create(scr, NULL); + buttonYValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_JERK_Y, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_JERK_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); labelYValue = lv_label_create(buttonYValue, NULL); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonZText, event_handler); - lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); - labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Jerk); - buttonZValue = lv_imgbtn_create(scr, NULL); + buttonZValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_JERK_Z, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_JERK_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); labelZValue = lv_label_create(buttonZValue, NULL); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonEText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonEText, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonEText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonEText, event_handler); - lv_btn_set_style(buttonEText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonEText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonEText, LV_LAYOUT_OFF); - labelEText = lv_label_create(buttonEText, NULL); /*Add a label to the button*/ + labelEText = lv_label_create(scr, NULL); + lv_obj_set_style(labelEText, &tft_style_label_rel); + lv_obj_set_pos(labelEText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelEText, machine_menu.E_Jerk); - buttonEValue = lv_imgbtn_create(scr, NULL); + buttonEValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonEValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonEValue, event_handler, ID_JERK_E, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonEValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonEValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonEValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonEValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonEValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonEValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonEValue, event_handler, ID_JERK_E, NULL, 0); + lv_btn_set_style(buttonEValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonEValue, LV_BTN_STYLE_PR, &style_para_value); labelEValue = lv_label_create(buttonEValue, NULL); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_JERK_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_JERK_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); label_Back = lv_label_create(buttonBack, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonEValue); + lv_group_add_obj(g, buttonBack); + } + #endif + if (gCfgItems.multiple_language != 0) { ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); @@ -241,23 +222,16 @@ void lv_draw_jerk_settings(void) { lv_label_set_text(labelEValue, public_buf_l); lv_obj_align(labelEValue, buttonEValue, LV_ALIGN_CENTER, 0, 0); - lv_label_set_text(labelXText, machine_menu.X_Jerk); - lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelYText, machine_menu.Y_Jerk); - lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelZText, machine_menu.Z_Jerk); - lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelEText, machine_menu.E_Jerk); - lv_obj_align(labelEText, buttonEText, LV_ALIGN_IN_LEFT_MID, 0, 0); - lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); } } -void lv_clear_jerk_settings() { lv_obj_del(scr); } +void lv_clear_jerk_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI && HAS_CLASSIC_JERK diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp new file mode 100644 index 0000000000..f126ffe1dd --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -0,0 +1,286 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../../Configuration.h" +#include "../../../../MarlinCore.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define LV_KB_CTRL_BTN_FLAGS (LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_CLICK_TRIG) + +static const char * kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n", + "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n", + LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; + +static const lv_btnm_ctrl_t kb_ctrl_lc_map[] = { + LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; + +static const char * kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n", + "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n", + LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; + +static const lv_btnm_ctrl_t kb_ctrl_uc_map[] = { + LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; + +static const char * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", + "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", + "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", + LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; + +static const lv_btnm_ctrl_t kb_ctrl_spec_map[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, + LV_KB_CTRL_BTN_FLAGS | 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; + +static const lv_btnm_ctrl_t kb_ctrl_num_map[] = { + 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, + 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, + 1, 1, 1, 2, + 1, 1, 1, 1, 1}; + +static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { + //LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + + if (event != LV_EVENT_VALUE_CHANGED) return; + + lv_kb_ext_t * ext = (lv_kb_ext_t * )lv_obj_get_ext_attr(kb); + const uint16_t btn_id = lv_btnm_get_active_btn(kb); + if (btn_id == LV_BTNM_BTN_NONE) return; + if (lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_HIDDEN | LV_BTNM_CTRL_INACTIVE)) return; + if (lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_NO_REPEAT) && event == LV_EVENT_LONG_PRESSED_REPEAT) return; + + const char * txt = lv_btnm_get_active_btn_text(kb); + if (txt == NULL) return; + + // Do the corresponding action according to the text of the button + if (strcmp(txt, "abc") == 0) { + lv_btnm_set_map(kb, kb_map_lc); + lv_btnm_set_ctrl_map(kb, kb_ctrl_lc_map); + return; + } + else if (strcmp(txt, "ABC") == 0) { + lv_btnm_set_map(kb, kb_map_uc); + lv_btnm_set_ctrl_map(kb, kb_ctrl_uc_map); + return; + } + else if (strcmp(txt, "1#") == 0) { + lv_btnm_set_map(kb, kb_map_spec); + lv_btnm_set_ctrl_map(kb, kb_ctrl_spec_map); + return; + } + else if (strcmp(txt, LV_SYMBOL_CLOSE) == 0) { + if (kb->event_cb != lv_kb_def_event_cb) { + //lv_res_t res = lv_event_send(kb, LV_EVENT_CANCEL, NULL); + //if (res != LV_RES_OK) return; + lv_clear_keyboard(); + draw_return_ui(); + } + else { + lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ + lv_obj_del(kb); + return; + } + return; + } + else if (strcmp(txt, LV_SYMBOL_OK) == 0) { + if (kb->event_cb != lv_kb_def_event_cb) { + //lv_res_t res = lv_event_send(kb, LV_EVENT_APPLY, NULL); + //if (res != LV_RES_OK) return; + const char * ret_ta_txt = lv_ta_get_text(ext->ta); + switch (keyboard_value) { + #if ENABLED(USE_WIFI_FUNCTION) + case wifiName: + memcpy(uiCfg.wifi_name,ret_ta_txt,sizeof(uiCfg.wifi_name)); + lv_clear_keyboard(); + draw_return_ui(); + break; + case wifiPassWord: + memcpy(uiCfg.wifi_key,ret_ta_txt,sizeof(uiCfg.wifi_name)); + lv_clear_keyboard(); + draw_return_ui(); + break; + case wifiConfig: + memset((void *)uiCfg.wifi_name, 0, sizeof(uiCfg.wifi_name)); + memcpy((void *)uiCfg.wifi_name, wifi_list.wifiName[wifi_list.nameIndex], 32); + + memset((void *)uiCfg.wifi_key, 0, sizeof(uiCfg.wifi_key)); + memcpy((void *)uiCfg.wifi_key, ret_ta_txt, sizeof(uiCfg.wifi_key)); + + gCfgItems.wifi_mode_sel = STA_MODEL; + + package_to_wifi(WIFI_PARA_SET, (char *)0, 0); + + memset(public_buf_l,0,sizeof(public_buf_l)); + + public_buf_l[0] = 0xA5; + public_buf_l[1] = 0x09; + public_buf_l[2] = 0x01; + public_buf_l[3] = 0x00; + public_buf_l[4] = 0x01; + public_buf_l[5] = 0xFC; + public_buf_l[6] = 0x00; + raw_send_to_wifi(public_buf_l, 6); + + last_disp_state = KEY_BOARD_UI; + lv_clear_keyboard(); + wifi_tips_type = TIPS_TYPE_JOINING; + lv_draw_wifi_tips(); + break; + #endif // USE_WIFI_FUNCTION + case gcodeCommand: + uint8_t buf[100]; + strncpy((char *)buf,ret_ta_txt,sizeof(buf)); + update_gcode_command(AUTO_LEVELING_COMMAND_ADDR,buf); + lv_clear_keyboard(); + draw_return_ui(); + break; + default: break; + } + } + else { + lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ + } + return; + } + + /*Add the characters to the text area if set*/ + if (ext->ta == NULL) return; + + if (strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) + lv_ta_add_char(ext->ta, '\n'); + else if (strcmp(txt, LV_SYMBOL_LEFT) == 0) + lv_ta_cursor_left(ext->ta); + else if (strcmp(txt, LV_SYMBOL_RIGHT) == 0) + lv_ta_cursor_right(ext->ta); + else if (strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) + lv_ta_del_char(ext->ta); + else if (strcmp(txt, "+/-") == 0) { + uint16_t cur = lv_ta_get_cursor_pos(ext->ta); + const char * ta_txt = lv_ta_get_text(ext->ta); + if (ta_txt[0] == '-') { + lv_ta_set_cursor_pos(ext->ta, 1); + lv_ta_del_char(ext->ta); + lv_ta_add_char(ext->ta, '+'); + lv_ta_set_cursor_pos(ext->ta, cur); + } + else if (ta_txt[0] == '+') { + lv_ta_set_cursor_pos(ext->ta, 1); + lv_ta_del_char(ext->ta); + lv_ta_add_char(ext->ta, '-'); + lv_ta_set_cursor_pos(ext->ta, cur); + } + else { + lv_ta_set_cursor_pos(ext->ta, 0); + lv_ta_add_char(ext->ta, '-'); + lv_ta_set_cursor_pos(ext->ta, cur + 1); + } + } + else { + lv_ta_add_text(ext->ta, txt); + } +} + +void lv_draw_keyboard() { + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != KEY_BOARD_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = KEY_BOARD_UI; + } + disp_state = KEY_BOARD_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + /*Create styles for the keyboard*/ + static lv_style_t rel_style, pr_style; + + lv_style_copy(&rel_style, &lv_style_btn_rel); + rel_style.body.radius = 0; + rel_style.body.border.width = 1; + rel_style.body.main_color = lv_color_make(0xa9, 0x62, 0x1d); + rel_style.body.grad_color = lv_color_make(0xa7, 0x59, 0x0e); + + lv_style_copy(&pr_style, &lv_style_btn_pr); + pr_style.body.radius = 0; + pr_style.body.border.width = 1; + pr_style.body.main_color = lv_color_make(0x72, 0x42, 0x15); + pr_style.body.grad_color = lv_color_make(0x6a, 0x3a, 0x0c); + + /*Create a keyboard and apply the styles*/ + lv_obj_t *kb = lv_kb_create(scr, NULL); + lv_obj_set_event_cb(kb, lv_kb_event_cb); + lv_kb_set_cursor_manage(kb, true); + lv_kb_set_style(kb, LV_KB_STYLE_BG, &lv_style_transp_tight); + lv_kb_set_style(kb, LV_KB_STYLE_BTN_REL, &rel_style); + lv_kb_set_style(kb, LV_KB_STYLE_BTN_PR, &pr_style); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + //lv_group_add_obj(g, kb); + //lv_group_set_editing(g, true); + } + #endif + + /*Create a text area. The keyboard will write here*/ + lv_obj_t *ta = lv_ta_create(scr, NULL); + lv_obj_align(ta, NULL, LV_ALIGN_IN_TOP_MID, 0, 10); + if (keyboard_value == gcodeCommand) { + get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); + public_buf_m[sizeof(public_buf_m)-1] = 0; + lv_ta_set_text(ta, public_buf_m); + } + else { + lv_ta_set_text(ta, ""); + } + + /*Assign the text area to the keyboard*/ + lv_kb_set_ta(kb, ta); +} + +void lv_clear_keyboard() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { /* lv_group_remove_all_objs(g); */ } + #endif + lv_obj_del(scr); +} + + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h new file mode 100644 index 0000000000..0013dc4030 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_keyboard(); +extern void lv_clear_keyboard(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 9029f6868c..3e4ad06477 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -49,6 +49,7 @@ static void disp_language(uint8_t language, uint8_t state); +extern lv_group_t * g; static lv_obj_t * scr; static lv_obj_t *buttonCN, *buttonT_CN, *buttonEN, *buttonRU; static lv_obj_t *buttonES, *buttonFR, *buttonIT, *buttonBack; @@ -61,9 +62,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_simplified_cn_sel.bin", 0); + lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, "F:/bmp_simplified_cn_sel.bin"); + lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, "F:/bmp_simplified_cn_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonCN); gCfgItems.language = LANG_SIMPLE_CHINESE; - gCfg_to_spiFlah(); + update_spi_flash(); disp_language_init(); } break; @@ -73,9 +76,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_traditional_cn_sel.bin", 0); + lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, "F:/bmp_traditional_cn_sel.bin"); + lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, "F:/bmp_traditional_cn_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonT_CN); gCfgItems.language = LANG_COMPLEX_CHINESE; - gCfg_to_spiFlah(); + update_spi_flash(); disp_language_init(); } break; @@ -85,9 +90,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, "bmp_english_sel.bin", 0); + lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, "F:/bmp_english_sel.bin"); + lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, "F:/bmp_english_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonEN); gCfgItems.language = LANG_ENGLISH; - gCfg_to_spiFlah(); + update_spi_flash(); disp_language_init(); } break; @@ -97,9 +104,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, "bmp_russian_sel.bin", 0); + lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, "F:/bmp_russian_sel.bin"); + lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, "F:/bmp_russian_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonRU); gCfgItems.language = LANG_RUSSIAN; - gCfg_to_spiFlah(); + update_spi_flash(); disp_language_init(); } break; @@ -109,9 +118,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, "bmp_spanish_sel.bin", 0); + lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, "F:/bmp_spanish_sel.bin"); + lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, "F:/bmp_spanish_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonES); gCfgItems.language = LANG_SPANISH; - gCfg_to_spiFlah(); + update_spi_flash(); disp_language_init(); } break; @@ -121,9 +132,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, "bmp_french_sel.bin", 0); + lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, "F:/bmp_french_sel.bin"); + lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, "F:/bmp_french_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonFR); gCfgItems.language = LANG_FRENCH; - gCfg_to_spiFlah(); + update_spi_flash(); disp_language_init(); } break; @@ -133,9 +146,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_FR, "bmp_italy_sel.bin", 0); + lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, "F:/bmp_italy_sel.bin"); + lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, "F:/bmp_italy_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonIT); gCfgItems.language = LANG_ITALY; - gCfg_to_spiFlah(); + update_spi_flash(); disp_language_init(); } break; @@ -154,8 +169,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { buttonFR = NULL; buttonIT = NULL; buttonBack = NULL; - - lv_obj_del(scr); + lv_clear_language(); lv_draw_set(); } break; @@ -172,42 +186,42 @@ static void disp_language(uint8_t language, uint8_t state) { switch (language) { case LANG_SIMPLE_CHINESE: id = ID_CN; - strcpy_P(public_buf_l, PSTR("bmp_simplified_cn")); + strcpy_P(public_buf_l, PSTR("F:/bmp_simplified_cn")); obj = buttonCN; break; case LANG_COMPLEX_CHINESE: id = ID_T_CN; - strcpy_P(public_buf_l, PSTR("bmp_traditional_cn")); + strcpy_P(public_buf_l, PSTR("F:/bmp_traditional_cn")); obj = buttonT_CN; break; case LANG_ENGLISH: id = ID_EN; - strcpy_P(public_buf_l, PSTR("bmp_english")); + strcpy_P(public_buf_l, PSTR("F:/bmp_english")); obj = buttonEN; break; case LANG_RUSSIAN: id = ID_RU; - strcpy_P(public_buf_l, PSTR("bmp_russian")); + strcpy_P(public_buf_l, PSTR("F:/bmp_russian")); obj = buttonRU; break; case LANG_SPANISH: id = ID_ES; - strcpy_P(public_buf_l, PSTR("bmp_spanish")); + strcpy_P(public_buf_l, PSTR("F:/bmp_spanish")); obj = buttonES; break; case LANG_FRENCH: id = ID_FR; - strcpy_P(public_buf_l, PSTR("bmp_french")); + strcpy_P(public_buf_l, PSTR("F:/bmp_french")); obj = buttonFR; break; case LANG_ITALY: id = ID_IT; - strcpy_P(public_buf_l, PSTR("bmp_italy")); + strcpy_P(public_buf_l, PSTR("F:/bmp_italy")); obj = buttonIT; break; default: id = ID_CN; - strcpy_P(public_buf_l, PSTR("bmp_simplified_cn")); + strcpy_P(public_buf_l, PSTR("F:/bmp_simplified_cn")); obj = buttonCN; break; } @@ -216,7 +230,9 @@ static void disp_language(uint8_t language, uint8_t state) { strcat_P(public_buf_l, PSTR(".bin")); - lv_obj_set_event_cb_mks(obj, event_handler, id, public_buf_l, 0); + lv_obj_set_event_cb_mks(obj, event_handler, id, NULL, 0); + lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, public_buf_l); + lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, public_buf_l); if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj); } @@ -244,8 +260,6 @@ void lv_draw_language(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - // Create image buttons buttonCN = lv_imgbtn_create(scr, NULL); buttonT_CN = lv_imgbtn_create(scr, NULL); @@ -256,52 +270,53 @@ void lv_draw_language(void) { buttonIT = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_simplified_cn.bin", 0); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, NULL, 0); + lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, "F:/bmp_simplified_cn.bin"); + lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, "F:/bmp_simplified_cn.bin"); lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW); + #if 1 - lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_traditional_cn.bin", 0); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, NULL, 0); + lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, "F:/bmp_traditional_cn.bin"); + lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, "F:/bmp_traditional_cn.bin"); lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, "bmp_english.bin", 0); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, NULL, 0); + lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, "F:/bmp_english.bin"); + lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, "F:/bmp_english.bin"); lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, "bmp_russian.bin", 0); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, NULL, 0); + lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, "F:/bmp_russian.bin"); + lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, "F:/bmp_russian.bin"); lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, "bmp_spanish.bin", 0); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, NULL, 0); + lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, "F:/bmp_spanish.bin"); + lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, "F:/bmp_spanish.bin"); lv_imgbtn_set_style(buttonES, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonES, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, "bmp_french.bin", 0); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, NULL, 0); + lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, "F:/bmp_french.bin"); + lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, "F:/bmp_french.bin"); lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_IT, "bmp_italy.bin", 0); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_IT, NULL, 0); + lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, "F:/bmp_italy.bin"); + lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, "F:/bmp_italy.bin"); lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_L_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_L_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); @@ -362,8 +377,25 @@ void lv_draw_language(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonCN); + lv_group_add_obj(g, buttonT_CN); + lv_group_add_obj(g, buttonEN); + lv_group_add_obj(g, buttonRU); + lv_group_add_obj(g, buttonES); + lv_group_add_obj(g, buttonFR); + lv_group_add_obj(g, buttonIT); + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_language() { lv_obj_del(scr); } +void lv_clear_language() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp new file mode 100644 index 0000000000..0e0283d32a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -0,0 +1,261 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_LEVEL_RETURN 1 +#define ID_LEVEL_POSITION 2 +#define ID_LEVEL_POSITION_ARROW 3 +#define ID_LEVEL_COMMAND 4 +#define ID_LEVEL_COMMAND_ARROW 5 +#define ID_LEVEL_ZOFFSET 6 +#define ID_LEVEL_ZOFFSET_ARROW 7 + + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_LEVEL_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + draw_return_ui(); + } + break; + case ID_LEVEL_POSITION: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + lv_draw_manual_level_pos_settings(); + } + break; + case ID_LEVEL_POSITION_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + lv_draw_manual_level_pos_settings(); + } + break; + case ID_LEVEL_COMMAND: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + keyboard_value = gcodeCommand; + lv_clear_level_settings(); + lv_draw_keyboard(); + } + break; + case ID_LEVEL_COMMAND_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + keyboard_value = gcodeCommand; + lv_clear_level_settings(); + lv_draw_keyboard(); + } + break; + #if HAS_BED_PROBE + case ID_LEVEL_ZOFFSET: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + lv_draw_auto_level_offset_settings(); + } + break; + case ID_LEVEL_ZOFFSET_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + lv_draw_auto_level_offset_settings(); + } + break; + #endif + } +} + +void lv_draw_level_settings(void) { + lv_obj_t *buttonBack, *label_Back; + lv_obj_t *buttonPosition, *labelPosition, *buttonPositionNarrow; + lv_obj_t *buttonCommand, *labelCommand, *buttonCommandNarrow; + #if HAS_BED_PROBE + lv_obj_t *buttonZoffset, *labelZoffset, *buttonZoffsetNarrow; + lv_obj_t * line3; + #endif + lv_obj_t * line1, * line2; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_PARA_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_PARA_UI; + } + disp_state = LEVELING_PARA_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.LevelingParaConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + + buttonPosition = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonPosition, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonPosition, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb_mks(buttonPosition, event_handler, ID_LEVEL_POSITION, NULL, 0); + lv_btn_set_style(buttonPosition, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonPosition, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonPosition, LV_LAYOUT_OFF); + labelPosition = lv_label_create(buttonPosition, NULL); /*Add a label to the button*/ + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPosition); + #endif + + buttonPositionNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonPositionNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonPositionNarrow, event_handler, ID_LEVEL_POSITION_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonPositionNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonPositionNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonPositionNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPositionNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonPositionNarrow, LV_LAYOUT_OFF); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonCommand = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonCommand, PARA_UI_POS_X, PARA_UI_POS_Y * 2); + lv_obj_set_size(buttonCommand, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonCommand, event_handler, ID_LEVEL_COMMAND, NULL, 0); + lv_btn_set_style(buttonCommand, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonCommand, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonCommand, LV_LAYOUT_OFF); + labelCommand = lv_label_create(buttonCommand, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonCommand); + #endif + + buttonCommandNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonCommandNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonCommandNarrow, event_handler, ID_LEVEL_COMMAND_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonCommandNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonCommandNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonCommandNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonCommandNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonCommandNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + #if HAS_BED_PROBE + + buttonZoffset = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonZoffset, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb_mks(buttonZoffset, event_handler, ID_LEVEL_ZOFFSET, NULL, 0); + lv_btn_set_style(buttonZoffset, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZoffset, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZoffset, LV_LAYOUT_OFF); + labelZoffset = lv_label_create(buttonZoffset, NULL); /*Add a label to the button*/ + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZoffset); + #endif + + buttonZoffsetNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZoffsetNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonZoffsetNarrow, event_handler, ID_LEVEL_ZOFFSET_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonZoffsetNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonZoffsetNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonZoffsetNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonZoffsetNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonZoffsetNarrow, LV_LAYOUT_OFF); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + #endif // HAS_BED_PROBE + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_LEVEL_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelPosition, machine_menu.LevelingManuPosConf); + lv_obj_align(labelPosition, buttonPosition, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelCommand, machine_menu.LevelingAutoCommandConf); + lv_obj_align(labelCommand, buttonCommand, LV_ALIGN_IN_LEFT_MID, 0, 0); + #if HAS_BED_PROBE + lv_label_set_text(labelZoffset, machine_menu.LevelingAutoZoffsetConf); + lv_obj_align(labelZoffset, buttonZoffset, LV_ALIGN_IN_LEFT_MID, 0, 0); + #endif + } + +} + +void lv_clear_level_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h new file mode 100644 index 0000000000..ce290172b6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_level_settings(void); +extern void lv_clear_level_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp index d441f2ac51..9f03793c24 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -28,6 +28,7 @@ #include "../../../../MarlinCore.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_PARA_RETURN 1 @@ -35,8 +36,10 @@ static lv_obj_t * scr; #define ID_PARA_MACHINE_ARROW 3 #define ID_PARA_MOTOR 4 #define ID_PARA_MOTOR_ARROW 5 -#define ID_PARA_ADVANCE 6 -#define ID_PARA_ADVANCE_ARROW 7 +#define ID_PARA_LEVEL 6 +#define ID_PARA_LEVEL_ARROW 7 +#define ID_PARA_ADVANCE 8 +#define ID_PARA_ADVANCE_ARROW 9 static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { @@ -85,6 +88,24 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_draw_motor_settings(); } break; + case ID_PARA_LEVEL: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_level_settings(); + } + break; + case ID_PARA_LEVEL_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_level_settings(); + } + break; case ID_PARA_ADVANCE: if (event == LV_EVENT_CLICKED) { @@ -110,8 +131,9 @@ void lv_draw_machine_para(void) { lv_obj_t *buttonBack, *label_Back; lv_obj_t *buttonMachine, *labelMachine, *buttonMachineNarrow; lv_obj_t *buttonMotor, *labelMotor, *buttonMotorNarrow; + lv_obj_t *buttonLevel, *labelLevel, *buttonLevelNarrow; lv_obj_t *buttonAdvance, *labelAdvance, *buttonAdvanceNarrow; - lv_obj_t * line1, * line2, * line3; + lv_obj_t * line1, * line2, * line3, * line4; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_PARA_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_PARA_UI; @@ -131,9 +153,6 @@ void lv_draw_machine_para(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - LV_IMG_DECLARE(bmp_para_arrow); - buttonMachine = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonMachine, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonMachine, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ @@ -146,9 +165,9 @@ void lv_draw_machine_para(void) { buttonMachineNarrow = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonMachineNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMachineNarrow, event_handler, ID_PARA_MACHINE_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_event_cb_mks(buttonMachineNarrow, event_handler, ID_PARA_MACHINE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonMachineNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonMachineNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonMachineNarrow, LV_LAYOUT_OFF); @@ -168,9 +187,9 @@ void lv_draw_machine_para(void) { buttonMotorNarrow = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonMotorNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMotorNarrow, event_handler, ID_PARA_MOTOR_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_event_cb_mks(buttonMotorNarrow, event_handler, ID_PARA_MOTOR_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonMotorNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonMotorNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonMotorNarrow, LV_LAYOUT_OFF); @@ -178,8 +197,30 @@ void lv_draw_machine_para(void) { line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); + buttonLevel = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonLevel, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonLevel, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + //lv_obj_set_event_cb(buttonMotor, event_handler); + lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_PARA_LEVEL, NULL, 0); + lv_btn_set_style(buttonLevel, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonLevel, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); + labelLevel = lv_label_create(buttonLevel, NULL); /*Add a label to the button*/ + + buttonLevelNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonLevelNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonLevelNarrow, event_handler, ID_PARA_LEVEL_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonLevelNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonLevelNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonLevelNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonLevelNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonLevelNarrow, LV_LAYOUT_OFF); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + buttonAdvance = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonAdvance, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_pos(buttonAdvance, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ lv_obj_set_size(buttonAdvance, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonAdvance, event_handler, ID_PARA_ADVANCE, NULL, 0); @@ -189,44 +230,61 @@ void lv_draw_machine_para(void) { labelAdvance = lv_label_create(buttonAdvance, NULL); /*Add a label to the button*/ buttonAdvanceNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonAdvanceNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonAdvanceNarrow, event_handler, ID_PARA_ADVANCE_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_pos(buttonAdvanceNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 4 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonAdvanceNarrow, event_handler, ID_PARA_ADVANCE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonAdvanceNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonAdvanceNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonAdvanceNarrow, LV_LAYOUT_OFF); - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PARA_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PARA_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, -2); lv_label_set_text(labelMachine, MachinePara_menu.MachineSetting); - lv_obj_align(labelMachine, buttonMachine, LV_ALIGN_IN_LEFT_MID, 0, 0); + lv_obj_align(labelMachine, buttonMachine, LV_ALIGN_IN_LEFT_MID, 0, -3); lv_label_set_text(labelMotor, MachinePara_menu.MotorSetting); - lv_obj_align(labelMotor, buttonMotor, LV_ALIGN_IN_LEFT_MID, 0, 0); + lv_obj_align(labelMotor, buttonMotor, LV_ALIGN_IN_LEFT_MID, 0, -3); + + lv_label_set_text(labelLevel, MachinePara_menu.leveling); + lv_obj_align(labelLevel, buttonLevel, LV_ALIGN_IN_LEFT_MID, 0, -3); lv_label_set_text(labelAdvance, MachinePara_menu.AdvanceSetting); - lv_obj_align(labelAdvance, buttonAdvance, LV_ALIGN_IN_LEFT_MID, 0, 0); + lv_obj_align(labelAdvance, buttonAdvance, LV_ALIGN_IN_LEFT_MID, 0, -3); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonMachine); + lv_group_add_obj(g, buttonMotor); + lv_group_add_obj(g, buttonLevel); + lv_group_add_obj(g, buttonAdvance); + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_machine_para() { lv_obj_del(scr); } +void lv_clear_machine_para() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp index 88a66c6599..0cf5bbaf7f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -28,6 +28,7 @@ #include "../../../../MarlinCore.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_MACHINE_RETURN 1 @@ -138,24 +139,21 @@ void lv_draw_machine_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - LV_IMG_DECLARE(bmp_para_arrow); - - buttonAcceleration = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonAcceleration, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + buttonAcceleration = lv_btn_create(scr, NULL); // Add a button the current screen + lv_obj_set_pos(buttonAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y); // Set its position + lv_obj_set_size(buttonAcceleration, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonAcceleration, event_handler, ID_MACHINE_ACCELERATION, NULL, 0); - lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style + lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style lv_btn_set_layout(buttonAcceleration, LV_LAYOUT_OFF); - labelAcceleration = lv_label_create(buttonAcceleration, NULL); /*Add a label to the button*/ + labelAcceleration = lv_label_create(buttonAcceleration, NULL); // Add a label to the button buttonAccelerationNarrow = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonAccelerationNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonAccelerationNarrow, event_handler, ID_MACHINE_ACCELERATION_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_event_cb_mks(buttonAccelerationNarrow, event_handler, ID_MACHINE_ACCELERATION_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonAccelerationNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonAccelerationNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonAccelerationNarrow, LV_LAYOUT_OFF); @@ -163,21 +161,21 @@ void lv_draw_machine_settings(void) { line1 = lv_line_create(lv_scr_act(), NULL); lv_ex_line(line1, line_points[0]); - buttonMaxFeedrate = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonMaxFeedrate, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonMaxFeedrate, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + buttonMaxFeedrate = lv_btn_create(scr, NULL); // Add a button the current screen + lv_obj_set_pos(buttonMaxFeedrate, PARA_UI_POS_X, PARA_UI_POS_Y * 2); // Set its position + lv_obj_set_size(buttonMaxFeedrate, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonMaxFeedrate, event_handler, ID_MACHINE_FEEDRATE, NULL, 0); - lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style + lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style lv_btn_set_layout(buttonMaxFeedrate, LV_LAYOUT_OFF); - labelMaxFeedrate = lv_label_create(buttonMaxFeedrate, NULL); /*Add a label to the button*/ + labelMaxFeedrate = lv_label_create(buttonMaxFeedrate, NULL); // Add a label to the button buttonMaxFeedrateNarrow = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonMaxFeedrateNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMaxFeedrateNarrow, event_handler, ID_MACHINE_FEEDRATE_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_event_cb_mks(buttonMaxFeedrateNarrow, event_handler, ID_MACHINE_FEEDRATE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonMaxFeedrateNarrow, LV_LAYOUT_OFF); @@ -186,21 +184,21 @@ void lv_draw_machine_settings(void) { lv_ex_line(line2, line_points[1]); #if HAS_CLASSIC_JERK - buttonJerk = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonJerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonJerk, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + buttonJerk = lv_btn_create(scr, NULL); // Add a button the current screen + lv_obj_set_pos(buttonJerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3); // Set its position + lv_obj_set_size(buttonJerk, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonJerk, event_handler, ID_MACHINE_JERK, NULL, 0); - lv_btn_set_style(buttonJerk, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonJerk, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_style(buttonJerk, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style + lv_btn_set_style(buttonJerk, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style lv_btn_set_layout(buttonJerk, LV_LAYOUT_OFF); - labelJerk = lv_label_create(buttonJerk, NULL); /*Add a label to the button*/ + labelJerk = lv_label_create(buttonJerk, NULL); // Add a label to the button buttonJerkNarrow = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonJerkNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonJerkNarrow, event_handler, ID_MACHINE_JERK_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_event_cb_mks(buttonJerkNarrow, event_handler, ID_MACHINE_JERK_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonJerkNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonJerkNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonJerkNarrow, LV_LAYOUT_OFF); @@ -210,9 +208,9 @@ void lv_draw_machine_settings(void) { #endif buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MACHINE_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MACHINE_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); @@ -234,8 +232,23 @@ void lv_draw_machine_settings(void) { lv_obj_align(labelJerk, buttonJerk, LV_ALIGN_IN_LEFT_MID, 0, 0); #endif } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAcceleration); + lv_group_add_obj(g, buttonMaxFeedrate); + #if HAS_CLASSIC_JERK + lv_group_add_obj(g, buttonJerk); + #endif + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_machine_settings() { lv_obj_del(scr); } +void lv_clear_machine_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 6530b1554c..3d68019b35 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -32,7 +32,7 @@ #include "draw_ui.h" #include "../../../../gcode/queue.h" -//static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; +extern lv_group_t * g; static lv_obj_t * scr; #define ID_M_POINT1 1 @@ -59,7 +59,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { queue.enqueue_now_P(PSTR("G1 Z10")); ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_MIN_POS + 30, Y_MIN_POS + 30); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[0][0], (int)gCfgItems.levelingPos[0][1]); queue.enqueue_one_now(public_buf_l); queue.enqueue_now_P(PSTR("G1 Z0")); } @@ -79,7 +79,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { queue.enqueue_now_P(PSTR("G1 Z10")); ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_MAX_POS - 30, Y_MIN_POS + 30); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[1][0], (int)gCfgItems.levelingPos[1][1]); queue.enqueue_one_now(public_buf_l); queue.enqueue_now_P(PSTR("G1 Z0")); } @@ -99,7 +99,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { queue.enqueue_now_P(PSTR("G1 Z10")); ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_MAX_POS - 30, Y_MAX_POS - 30); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[2][0], (int)gCfgItems.levelingPos[2][1]); queue.enqueue_one_now(public_buf_l); queue.enqueue_now_P(PSTR("G1 Z0")); } @@ -120,7 +120,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { queue.enqueue_now_P(PSTR("G1 Z10")); ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_MIN_POS + 30, Y_MAX_POS - 30); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[3][0], (int)gCfgItems.levelingPos[3][1]); queue.enqueue_one_now(public_buf_l); queue.enqueue_now_P(PSTR("G1 Z0")); } @@ -140,7 +140,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { queue.enqueue_now_P(PSTR("G1 Z10")); ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_BED_SIZE / 2, Y_BED_SIZE / 2); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[4][0], (int)gCfgItems.levelingPos[4][1]); queue.enqueue_one_now(public_buf_l); queue.enqueue_now_P(PSTR("G1 Z0")); } @@ -159,7 +159,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } - void lv_draw_manualLevel(void) { lv_obj_t *buttonPoint1, *buttonPoint2, *buttonPoint3, *buttonPoint4, *buttonPoint5; lv_obj_t *buttonBack; @@ -185,8 +184,6 @@ void lv_draw_manualLevel(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - // Create an Image button buttonPoint1 = lv_imgbtn_create(scr, NULL); buttonPoint2 = lv_imgbtn_create(scr, NULL); @@ -195,40 +192,41 @@ void lv_draw_manualLevel(void) { buttonPoint5 = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonPoint1, event_handler, ID_M_POINT1, "bmp_leveling1.bin", 0); - lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonPoint1, event_handler, ID_M_POINT1, NULL, 0); + lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_REL, "F:/bmp_leveling1.bin"); + lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_PR, "F:/bmp_leveling1.bin"); lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonPoint1, LV_PROTECT_FOLLOW); + #if 1 - lv_obj_set_event_cb_mks(buttonPoint2, event_handler, ID_M_POINT2, "bmp_leveling2.bin", 0); - lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonPoint2, event_handler, ID_M_POINT2, NULL, 0); + lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_REL, "F:/bmp_leveling2.bin"); + lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_PR, "F:/bmp_leveling2.bin"); lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonPoint3, event_handler, ID_M_POINT3, "bmp_leveling3.bin", 0); - lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonPoint3, event_handler, ID_M_POINT3, NULL, 0); + lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_REL, "F:/bmp_leveling3.bin"); + lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_PR, "F:/bmp_leveling3.bin"); lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonPoint4, event_handler, ID_M_POINT4, "bmp_leveling4.bin", 0); - lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonPoint4, event_handler, ID_M_POINT4, NULL, 0); + lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_REL, "F:/bmp_leveling4.bin"); + lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_PR, "F:/bmp_leveling4.bin"); lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonPoint5, event_handler, ID_M_POINT5, "bmp_leveling5.bin", 0); - lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonPoint5, event_handler, ID_M_POINT5, NULL, 0); + lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_REL, "F:/bmp_leveling5.bin"); + lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_PR, "F:/bmp_leveling5.bin"); lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif @@ -274,8 +272,23 @@ void lv_draw_manualLevel(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPoint1); + lv_group_add_obj(g, buttonPoint2); + lv_group_add_obj(g, buttonPoint3); + lv_group_add_obj(g, buttonPoint4); + lv_group_add_obj(g, buttonPoint5); + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_manualLevel() { lv_obj_del(scr); } +void lv_clear_manualLevel() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp new file mode 100644 index 0000000000..9b7200b5a9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -0,0 +1,459 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_MANUAL_POS_RETURN 1 +#define ID_MANUAL_POS_X1 2 +#define ID_MANUAL_POS_Y1 3 +#define ID_MANUAL_POS_X2 4 +#define ID_MANUAL_POS_Y2 5 +#define ID_MANUAL_POS_X3 6 +#define ID_MANUAL_POS_Y3 7 +#define ID_MANUAL_POS_X4 8 +#define ID_MANUAL_POS_Y4 9 +#define ID_MANUAL_POS_X5 10 +#define ID_MANUAL_POS_Y5 11 +#define ID_MANUAL_POS_DOWN 12 +#define ID_MANUAL_POS_UP 13 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_MANUAL_POS_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_manual_level_pos_settings(); + draw_return_ui(); + } + break; + case ID_MANUAL_POS_X1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_x1; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y1; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_X2: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_x2; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y2: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y2; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_X3: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_x3; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y3: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y3; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_X4: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_x4; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y4: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y4; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_X5: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y5; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y5: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y5; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_manual_level_pos_settings(); + lv_draw_manual_level_pos_settings(); + } + break; + case ID_MANUAL_POS_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_manual_level_pos_settings(); + lv_draw_manual_level_pos_settings(); + } + break; + } +} + +void lv_draw_manual_level_pos_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *labelPoint1Text = NULL, *buttonX1Value = NULL, *labelX1Value = NULL; + lv_obj_t *buttonY1Value = NULL, *labelY1Value = NULL; + lv_obj_t *labelPoint2Text = NULL, *buttonX2Value = NULL, *labelX2Value = NULL; + lv_obj_t *buttonY2Value = NULL, *labelY2Value = NULL; + lv_obj_t *labelPoint3Text = NULL, *buttonX3Value = NULL, *labelX3Value = NULL; + lv_obj_t *buttonY3Value = NULL, *labelY3Value = NULL; + lv_obj_t *labelPoint4Text = NULL, *buttonX4Value = NULL, *labelX4Value = NULL; + lv_obj_t *buttonY4Value = NULL, *labelY4Value = NULL; + lv_obj_t *labelPoint5Text = NULL, *buttonX5Value = NULL, *labelX5Value = NULL; + lv_obj_t *buttonY5Value = NULL, *labelY5Value = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MANUAL_LEVELING_POSIGION_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = MANUAL_LEVELING_POSIGION_UI; + } + disp_state = MANUAL_LEVELING_POSIGION_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.LevelingParaConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + if (uiCfg.para_ui_page != 1) { + labelPoint1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint1Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelPoint1Text, leveling_menu.position1); + + buttonX1Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX1Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX1Value, event_handler, ID_MANUAL_POS_X1, NULL, 0); + lv_btn_set_style(buttonX1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX1Value, LV_BTN_STYLE_PR, &style_para_value); + labelX1Value = lv_label_create(buttonX1Value, NULL); + + buttonY1Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY1Value, event_handler, ID_MANUAL_POS_Y1, NULL, 0); + lv_btn_set_style(buttonY1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY1Value, LV_BTN_STYLE_PR, &style_para_value); + labelY1Value = lv_label_create(buttonY1Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelPoint2Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint2Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint2Text, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelPoint2Text, leveling_menu.position2); + + buttonX2Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX2Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX2Value, event_handler, ID_MANUAL_POS_X2, NULL, 0); + lv_btn_set_style(buttonX2Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX2Value, LV_BTN_STYLE_PR, &style_para_value); + labelX2Value = lv_label_create(buttonX2Value, NULL); + + buttonY2Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY2Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY2Value, event_handler, ID_MANUAL_POS_Y2, NULL, 0); + lv_btn_set_style(buttonY2Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY2Value, LV_BTN_STYLE_PR, &style_para_value); + labelY2Value = lv_label_create(buttonY2Value, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelPoint3Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint3Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint3Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelPoint3Text, leveling_menu.position3); + + buttonX3Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX3Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX3Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX3Value, event_handler, ID_MANUAL_POS_X3, NULL, 0); + lv_btn_set_style(buttonX3Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX3Value, LV_BTN_STYLE_PR, &style_para_value); + labelX3Value = lv_label_create(buttonX3Value, NULL); + + buttonY3Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY3Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY3Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY3Value, event_handler, ID_MANUAL_POS_Y3, NULL, 0); + lv_btn_set_style(buttonY3Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY3Value, LV_BTN_STYLE_PR, &style_para_value); + labelY3Value = lv_label_create(buttonY3Value, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelPoint4Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint4Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint4Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelPoint4Text, leveling_menu.position4); + + buttonX4Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX4Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX4Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX4Value, event_handler, ID_MANUAL_POS_X4, NULL, 0); + lv_btn_set_style(buttonX4Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX4Value, LV_BTN_STYLE_PR, &style_para_value); + labelX4Value = lv_label_create(buttonX4Value, NULL); + + buttonY4Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY4Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY4Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY4Value, event_handler, ID_MANUAL_POS_Y4, NULL, 0); + lv_btn_set_style(buttonY4Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY4Value, LV_BTN_STYLE_PR, &style_para_value); + labelY4Value = lv_label_create(buttonY4Value, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonX1Value); + lv_group_add_obj(g, buttonY1Value); + lv_group_add_obj(g, buttonX2Value); + lv_group_add_obj(g, buttonY2Value); + lv_group_add_obj(g, buttonX3Value); + lv_group_add_obj(g, buttonY3Value); + lv_group_add_obj(g, buttonX4Value); + lv_group_add_obj(g, buttonY4Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + else { + labelPoint5Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint5Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint5Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelPoint5Text, leveling_menu.position5); + + buttonX5Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX5Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX5Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX5Value, event_handler, ID_MANUAL_POS_X5, NULL, 0); + lv_btn_set_style(buttonX5Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX5Value, LV_BTN_STYLE_PR, &style_para_value); + labelX5Value = lv_label_create(buttonX5Value, NULL); + + buttonY5Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY5Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY5Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY5Value, event_handler, ID_MANUAL_POS_Y5, NULL, 0); + lv_btn_set_style(buttonY5Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY5Value, LV_BTN_STYLE_PR, &style_para_value); + labelY5Value = lv_label_create(buttonY5Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonX5Value); + lv_group_add_obj(g, buttonY5Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_POS_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); + lv_label_set_text(labelX1Value, public_buf_l); + lv_obj_align(labelX1Value, buttonX1Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][1]); + lv_label_set_text(labelY1Value, public_buf_l); + lv_obj_align(labelY1Value, buttonY1Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][0]); + lv_label_set_text(labelX2Value, public_buf_l); + lv_obj_align(labelX2Value, buttonX2Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][1]); + lv_label_set_text(labelY2Value, public_buf_l); + lv_obj_align(labelY2Value, buttonY2Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][0]); + lv_label_set_text(labelX3Value, public_buf_l); + lv_obj_align(labelX3Value, buttonX3Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][1]); + lv_label_set_text(labelY3Value, public_buf_l); + lv_obj_align(labelY3Value, buttonY3Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][0]); + lv_label_set_text(labelX4Value, public_buf_l); + lv_obj_align(labelX4Value, buttonX4Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][1]); + lv_label_set_text(labelY4Value, public_buf_l); + lv_obj_align(labelY4Value, buttonY4Value, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + } + else { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][0]); + lv_label_set_text(labelX5Value, public_buf_l); + lv_obj_align(labelX5Value, buttonX5Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][1]); + lv_label_set_text(labelY5Value, public_buf_l); + lv_obj_align(labelY5Value, buttonY5Value, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + } + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_manual_level_pos_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h new file mode 100644 index 0000000000..8e89ecf559 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_manual_level_pos_settings(void); +extern void lv_clear_manual_level_pos_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index c78c6f5bb8..e82124f705 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -29,6 +29,7 @@ #include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_FEED_RETURN 1 @@ -127,11 +128,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_max_feedrate_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MAXFEEDRATE_UI) { disp_state_stack._disp_index++; @@ -152,166 +153,139 @@ void lv_draw_max_feedrate_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - // LV_IMG_DECLARE(bmp_para_arrow); - LV_IMG_DECLARE(bmp_para_bank); - if (uiCfg.para_ui_page != 1) { - buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonXText, event_handler); - lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); - labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.XMaxFeedRate); - buttonXValue = lv_imgbtn_create(scr, NULL); + buttonXValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_FEED_X, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_FEED_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); labelXValue = lv_label_create(buttonXValue, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonYText, event_handler); - lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); - labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.YMaxFeedRate); - buttonYValue = lv_imgbtn_create(scr, NULL); + buttonYValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_FEED_Y, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_FEED_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); labelYValue = lv_label_create(buttonYValue, NULL); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonZText, event_handler); - lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); - labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.ZMaxFeedRate); - buttonZValue = lv_imgbtn_create(scr, NULL); + buttonZValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_FEED_Z, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_FEED_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); labelZValue = lv_label_create(buttonZValue, NULL); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE0Text, event_handler); - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); - labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + labelE0Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE0Text, &tft_style_label_rel); + lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelE0Text, machine_menu.E0MaxFeedRate); - buttonE0Value = lv_imgbtn_create(scr, NULL); + buttonE0Value = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_FEED_E0, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_FEED_E0, NULL, 0); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); labelE0Value = lv_label_create(buttonE0Value, NULL); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_DOWN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonE0Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif } else { - buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE1Text, event_handler); - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); - labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + labelE1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE1Text, &tft_style_label_rel); + lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelE1Text, machine_menu.E1MaxFeedRate); - buttonE1Value = lv_imgbtn_create(scr, NULL); + buttonE1Value = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_FEED_E1, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_FEED_E1, NULL, 0); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); labelE1Value = lv_label_create(buttonE1Value, NULL); + line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_UP, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonE1Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif } lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); labelTurnPage = lv_label_create(buttonTurnPage, NULL); - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FEED_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FEED_RETURN, NULL, 0); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); label_Back = lv_label_create(buttonBack, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif if (gCfgItems.multiple_language != 0) { if (uiCfg.para_ui_page != 1) { - lv_label_set_text(labelXText, machine_menu.XMaxFeedRate); - lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelYText, machine_menu.YMaxFeedRate); - lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelZText, machine_menu.ZMaxFeedRate); - lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelE0Text, machine_menu.E0MaxFeedRate); - lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); lv_label_set_text(labelTurnPage, machine_menu.next); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); @@ -337,9 +311,6 @@ void lv_draw_max_feedrate_settings(void) { lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); } else { - lv_label_set_text(labelE1Text, machine_menu.E1MaxFeedRate); - lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - lv_label_set_text(labelTurnPage, machine_menu.previous); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); @@ -354,6 +325,11 @@ void lv_draw_max_feedrate_settings(void) { } } -void lv_clear_max_feedrate_settings() { lv_obj_del(scr); } +void lv_clear_max_feedrate_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp index 7da477bd51..f6568df143 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -28,6 +28,7 @@ #include "../../../../MarlinCore.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_MOTOR_RETURN 1 @@ -37,6 +38,8 @@ static lv_obj_t * scr; #define ID_MOTOR_TMC_CURRENT_ARROW 5 #define ID_MOTOR_STEP_MODE 6 #define ID_MOTOR_STEP_MODE_ARROW 7 +#define ID_HOME_SENSE 8 +#define ID_HOME_SENSE_ARROW 9 static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { @@ -67,6 +70,26 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_draw_step_settings(); } break; + #if USE_SENSORLESS + case ID_HOME_SENSE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_homing_sensitivity_settings(); + } + break; + case ID_HOME_SENSE_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_homing_sensitivity_settings(); + } + break; + #endif #if HAS_TRINAMIC_CONFIG case ID_MOTOR_TMC_CURRENT: if (event == LV_EVENT_CLICKED) { @@ -113,15 +136,27 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_motor_settings(void) { lv_obj_t *buttonBack, *label_Back; lv_obj_t *buttonSteps, *labelSteps, *buttonStepsNarrow; - #if HAS_TRINAMIC_CONFIG - lv_obj_t *buttonTMCcurrent, *labelTMCcurrent, *buttonTMCcurrentNarrow; + lv_obj_t * line1; + #if USE_SENSORLESS + lv_obj_t *buttonSensitivity, *labelSensitivity, *buttonSensitivityNarrow; lv_obj_t * line2; - #if HAS_STEALTHCHOP - lv_obj_t *buttonStepMode, *labelStepMode, *buttonStepModeNarrow; + #endif + #if HAS_TRINAMIC_CONFIG + #if USE_SENSORLESS lv_obj_t * line3; + #else + lv_obj_t * line2; + #endif + lv_obj_t *buttonTMCcurrent, *labelTMCcurrent, *buttonTMCcurrentNarrow; + #if HAS_STEALTHCHOP + #if USE_SENSORLESS + lv_obj_t * line4; + #else + lv_obj_t * line3; + #endif + lv_obj_t *buttonStepMode, *labelStepMode, *buttonStepModeNarrow; #endif #endif - lv_obj_t * line1; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOTOR_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MOTOR_SETTINGS_UI; @@ -141,9 +176,6 @@ void lv_draw_motor_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - LV_IMG_DECLARE(bmp_para_arrow); - buttonSteps = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonSteps, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonSteps, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ @@ -154,20 +186,54 @@ void lv_draw_motor_settings(void) { lv_btn_set_layout(buttonSteps, LV_LAYOUT_OFF); labelSteps = lv_label_create(buttonSteps, NULL); /*Add a label to the button*/ + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSteps); + #endif + buttonStepsNarrow = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonStepsNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStepsNarrow, event_handler, ID_MOTOR_STEPS_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_event_cb_mks(buttonStepsNarrow, event_handler, ID_MOTOR_STEPS_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonStepsNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonStepsNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonStepsNarrow, LV_LAYOUT_OFF); - line1 = lv_line_create(lv_scr_act(), NULL); + line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); + + #if USE_SENSORLESS + buttonSensitivity = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonSensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonSensitivity, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + //lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonSensitivity, event_handler, ID_HOME_SENSE, NULL, 0); + lv_btn_set_style(buttonSensitivity, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonSensitivity, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonSensitivity, LV_LAYOUT_OFF); + labelSensitivity = lv_label_create(buttonSensitivity, NULL); /*Add a label to the button*/ + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSensitivity); + #endif + + buttonSensitivityNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonSensitivityNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonSensitivityNarrow, event_handler, ID_HOME_SENSE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonSensitivityNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonSensitivityNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonSensitivityNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonSensitivityNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonSensitivityNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + #endif + + #if HAS_TRINAMIC_CONFIG buttonTMCcurrent = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonTMCcurrent, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_pos(buttonTMCcurrent, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2)); lv_obj_set_size(buttonTMCcurrent, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonTMCcurrent, event_handler, ID_MOTOR_TMC_CURRENT, NULL, 0); @@ -175,61 +241,86 @@ void lv_draw_motor_settings(void) { lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ lv_btn_set_layout(buttonTMCcurrent, LV_LAYOUT_OFF); labelTMCcurrent = lv_label_create(buttonTMCcurrent, NULL); /*Add a label to the button*/ + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTMCcurrent); + #endif buttonTMCcurrentNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonTMCcurrentNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonTMCcurrentNarrow, event_handler, ID_MOTOR_TMC_CURRENT_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_pos(buttonTMCcurrentNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2) + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonTMCcurrentNarrow, event_handler, ID_MOTOR_TMC_CURRENT_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonTMCcurrentNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line2, line_points[1]); + #if USE_SENSORLESS + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + #else + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + #endif #if HAS_STEALTHCHOP buttonStepMode = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonStepMode, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_pos(buttonStepMode, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3)); lv_obj_set_size(buttonStepMode, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonStepMode, event_handler, ID_MOTOR_STEP_MODE, NULL, 0); lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ lv_btn_set_layout(buttonStepMode, LV_LAYOUT_OFF); labelStepMode = lv_label_create(buttonStepMode, NULL); /*Add a label to the button*/ + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonStepMode); + #endif + buttonStepModeNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonStepModeNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStepModeNarrow, event_handler, ID_MOTOR_STEP_MODE_ARROW, "bmp_arrow.bin", 0); - lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); - lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_obj_set_pos(buttonStepModeNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3) + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonStepModeNarrow, event_handler, ID_MOTOR_STEP_MODE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); lv_imgbtn_set_style(buttonStepModeNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonStepModeNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonStepModeNarrow, LV_LAYOUT_OFF); - line3 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line3, line_points[2]); - #endif + #if USE_SENSORLESS + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + #else + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + #endif + + #endif // HAS_STEALTHCHOP + #endif // HAS_TRINAMIC_CONFIG buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MOTOR_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MOTOR_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + if (gCfgItems.multiple_language != 0) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(labelSteps, machine_menu.StepsConf); lv_obj_align(labelSteps, buttonSteps, LV_ALIGN_IN_LEFT_MID, 0, 0); + + #if USE_SENSORLESS + lv_label_set_text(labelSensitivity, machine_menu.HomingSensitivityConf); + lv_obj_align(labelSensitivity, buttonSensitivity, LV_ALIGN_IN_LEFT_MID, 0, 0); + #endif #if HAS_TRINAMIC_CONFIG lv_label_set_text(labelTMCcurrent, machine_menu.TMCcurrentConf); lv_obj_align(labelTMCcurrent, buttonTMCcurrent, LV_ALIGN_IN_LEFT_MID, 0, 0); @@ -242,6 +333,11 @@ void lv_draw_motor_settings(void) { } -void lv_clear_motor_settings() { lv_obj_del(scr); } +void lv_clear_motor_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 24abadb57c..a6c0c0551a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -32,6 +32,7 @@ #include "draw_ui.h" #include "../../../../gcode/queue.h" +extern lv_group_t * g; static lv_obj_t * scr; static lv_obj_t *labelV, *buttonV; @@ -179,8 +180,6 @@ void lv_draw_move_motor(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - // Create an Image button buttonXI = lv_imgbtn_create(scr, NULL); buttonXD = lv_imgbtn_create(scr, NULL); @@ -191,55 +190,56 @@ void lv_draw_move_motor(void) { buttonV = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_M_X_P, "bmp_xAdd.bin", 0); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_M_X_P, NULL, 0); + lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin"); + lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin"); lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW); + #if 1 - lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_M_X_N, "bmp_xDec.bin", 0); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_M_X_N, NULL, 0); + lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin"); + lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin"); lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_M_Y_P, "bmp_yAdd.bin", 0); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_M_Y_P, NULL, 0); + lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin"); + lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin"); lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_M_Y_N, "bmp_yDec.bin", 0); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_M_Y_N, NULL, 0); + lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin"); + lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin"); lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_M_Z_P, "bmp_zAdd.bin", 0); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_M_Z_P, NULL, 0); + lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin"); + lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin"); lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_M_Z_N, "bmp_zDec.bin", 0); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_M_Z_N, NULL, 0); + lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin"); + lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin"); lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel); //lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, NULL, 0); lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_M_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_M_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif // if 1 + lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); @@ -290,6 +290,18 @@ void lv_draw_move_motor(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXI); + lv_group_add_obj(g, buttonXD); + lv_group_add_obj(g, buttonYI); + lv_group_add_obj(g, buttonYD); + lv_group_add_obj(g, buttonZI); + lv_group_add_obj(g, buttonZD); + lv_group_add_obj(g, buttonV); + lv_group_add_obj(g, buttonBack); + } + #endif disp_move_dist(); } @@ -297,12 +309,18 @@ void lv_draw_move_motor(void) { void disp_move_dist() { // char buf[30] = {0}; - if ((int)(10 * uiCfg.move_dist) == 1) - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_step_move0_1.bin", 0); - else if ((int)(10 * uiCfg.move_dist) == 10) - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_step_move1.bin", 0); - else if ((int)(10 * uiCfg.move_dist) == 100) - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_step_move10.bin", 0); + if ((int)(10 * uiCfg.move_dist) == 1) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move0_1.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move0_1.bin"); + } + else if ((int)(10 * uiCfg.move_dist) == 10) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move1.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move1.bin"); + } + else if ((int)(10 * uiCfg.move_dist) == 100) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move10.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move10.bin"); + } if (gCfgItems.multiple_language != 0) { if ((int)(10 * uiCfg.move_dist) == 1) { lv_label_set_text(labelV, move_menu.step_01mm); @@ -319,6 +337,11 @@ void disp_move_dist() { } } -void lv_clear_move_motor() { lv_obj_del(scr); } +void lv_clear_move_motor() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 2fe32b04c9..4842776304 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -47,6 +47,11 @@ #include "../../../../feature/tmc_util.h" #endif +#if HAS_BED_PROBE + #include "../../../../module/probe.h" +#endif + +extern lv_group_t * g; static lv_obj_t * scr; static lv_obj_t *buttonValue = NULL; static lv_obj_t *labelValue = NULL; @@ -77,113 +82,92 @@ static void disp_key_value() { float milliamps; #endif + ZERO(public_buf_m); + switch (value) { case PrintAcceleration: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.acceleration); break; case RetractAcceleration: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.retract_acceleration); break; case TravelAcceleration: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.travel_acceleration); break; case XAcceleration: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); break; case YAcceleration: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); break; case ZAcceleration: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); break; case E0Acceleration: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); break; case E1Acceleration: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); break; case XMaxFeedRate: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); break; case YMaxFeedRate: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); break; case ZMaxFeedRate: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); break; case E0MaxFeedRate: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); break; case E1MaxFeedRate: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); break; case XJerk: #if HAS_CLASSIC_JERK - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[X_AXIS]); #endif break; case YJerk: #if HAS_CLASSIC_JERK - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); #endif break; case ZJerk: #if HAS_CLASSIC_JERK - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); #endif break; case EJerk: #if HAS_CLASSIC_JERK - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[E_AXIS]); #endif break; case Xstep: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); break; case Ystep: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); break; case Zstep: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); break; case E0step: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); break; case E1step: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); break; case Xcurrent: #if AXIS_IS_TMC(X) - ZERO(public_buf_m); milliamps = stepperX.getMilliamps(); sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); #endif @@ -191,7 +175,6 @@ static void disp_key_value() { case Ycurrent: #if AXIS_IS_TMC(Y) - ZERO(public_buf_m); milliamps = stepperY.getMilliamps(); sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); #endif @@ -199,7 +182,6 @@ static void disp_key_value() { case Zcurrent: #if AXIS_IS_TMC(Z) - ZERO(public_buf_m); milliamps = stepperZ.getMilliamps(); sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); #endif @@ -207,7 +189,6 @@ static void disp_key_value() { case E0current: #if AXIS_IS_TMC(E0) - ZERO(public_buf_m); milliamps = stepperE0.getMilliamps(); sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); #endif @@ -215,24 +196,100 @@ static void disp_key_value() { case E1current: #if AXIS_IS_TMC(E1) - ZERO(public_buf_m); milliamps = stepperE1.getMilliamps(); sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); #endif break; case pause_pos_x: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosX); break; case pause_pos_y: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosY); break; case pause_pos_z: - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosZ); break; + case level_pos_x1: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][0]); + break; + case level_pos_y1: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][1]); + break; + case level_pos_x2: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][0]); + break; + case level_pos_y2: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][1]); + break; + case level_pos_x3: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][0]); + break; + case level_pos_y3: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][1]); + break; + case level_pos_x4: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][0]); + break; + case level_pos_y4: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][1]); + break; + case level_pos_x5: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][0]); + break; + case level_pos_y5: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][1]); + break; + #if HAS_BED_PROBE + case x_offset: + #if HAS_PROBE_XY_OFFSET + sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.x); + #endif + break; + case y_offset: + #if HAS_PROBE_XY_OFFSET + sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.y); + #endif + break; + case z_offset: + sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.z); + break; + #endif + case load_length: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_length); + break; + case load_speed: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_speed); + break; + case unload_length: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_length); + break; + case unload_speed: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_speed); + break; + case filament_temp: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temper); + break; + case x_sensitivity: + #if X_SENSORLESS + sprintf_P(public_buf_m, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); + #endif + break; + case y_sensitivity: + #if Y_SENSORLESS + sprintf_P(public_buf_m, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); + #endif + break; + case z_sensitivity: + #if Z_SENSORLESS + sprintf_P(public_buf_m, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); + #endif + break; + case z2_sensitivity: + #if Z2_SENSORLESS + sprintf_P(public_buf_m, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); + #endif + break; } ZERO(key_value); strcpy(key_value, public_buf_m); @@ -313,18 +370,23 @@ static void set_value_confirm() { break; case Xstep: planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value); + planner.refresh_positioning(); break; case Ystep: planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value); + planner.refresh_positioning(); break; case Zstep: planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value); + planner.refresh_positioning(); break; case E0step: planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value); + planner.refresh_positioning(); break; case E1step: planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); + planner.refresh_positioning(); break; case Xcurrent: #if AXIS_IS_TMC(X) @@ -368,6 +430,114 @@ static void set_value_confirm() { gCfgItems.pausePosZ = atof(key_value); update_spi_flash(); break; + case level_pos_x1: + gCfgItems.levelingPos[0][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y1: + gCfgItems.levelingPos[0][1] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_x2: + gCfgItems.levelingPos[1][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y2: + gCfgItems.levelingPos[1][1] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_x3: + gCfgItems.levelingPos[2][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y3: + gCfgItems.levelingPos[2][1] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_x4: + gCfgItems.levelingPos[3][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y4: + gCfgItems.levelingPos[3][1] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_x5: + gCfgItems.levelingPos[4][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y5: + gCfgItems.levelingPos[4][1] = atoi(key_value); + update_spi_flash(); + break; + #if HAS_BED_PROBE + case x_offset: + #if HAS_PROBE_XY_OFFSET + float x; + x = atof(key_value); + if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) + probe.offset.x = x; + #endif + break; + case y_offset: + #if HAS_PROBE_XY_OFFSET + float y; + y = atof(key_value); + if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) + probe.offset.y = y; + #endif + break; + case z_offset: + float z; + z = atof(key_value); + if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) + probe.offset.z = z; + break; + #endif + case load_length: + gCfgItems.filamentchange_load_length = atoi(key_value); + uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length*60.0/gCfgItems.filamentchange_load_speed)+0.5); + update_spi_flash(); + break; + case load_speed: + gCfgItems.filamentchange_load_speed = atoi(key_value); + uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length*60.0/gCfgItems.filamentchange_load_speed)+0.5); + update_spi_flash(); + break; + case unload_length: + gCfgItems.filamentchange_unload_length = atoi(key_value); + uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length*60.0/gCfgItems.filamentchange_unload_speed)+0.5); + update_spi_flash(); + break; + case unload_speed: + gCfgItems.filamentchange_unload_speed = atoi(key_value); + uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length*60.0/gCfgItems.filamentchange_unload_speed)+0.5); + update_spi_flash(); + break; + case filament_temp: + gCfgItems.filament_limit_temper = atoi(key_value); + update_spi_flash(); + break; + case x_sensitivity: + #if X_SENSORLESS + stepperX.homing_threshold(atoi(key_value)); + #endif + break; + case y_sensitivity: + #if Y_SENSORLESS + stepperY.homing_threshold(atoi(key_value)); + #endif + break; + case z_sensitivity: + #if Z_SENSORLESS + stepperZ.homing_threshold(atoi(key_value)); + #endif + break; + case z2_sensitivity: + #if Z2_SENSORLESS + stepperZ2.homing_threshold(atoi(key_value)); + #endif + break; } gcode.process_subcommands_now_P(PSTR("M500")); } @@ -604,15 +774,13 @@ void lv_draw_number_key(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - //LV_IMG_DECLARE(bmp_pic); - buttonValue = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonValue, 92, 40); /*Set its position*/ lv_obj_set_size(buttonValue, 296, 40); lv_obj_set_event_cb_mks(buttonValue, event_handler, ID_NUM_KEY1, NULL, 0); lv_btn_set_style(buttonValue, LV_BTN_STYLE_REL, &style_num_text); /*Set the button's released style*/ lv_btn_set_style(buttonValue, LV_BTN_STYLE_PR, &style_num_text); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonValue, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonValue, LV_LAYOUT_OFF); labelValue = lv_label_create(buttonValue, NULL); /*Add a label to the button*/ NumberKey_1 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ @@ -621,7 +789,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_1, event_handler, ID_NUM_KEY1, NULL, 0); lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_1, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_1, LV_LAYOUT_OFF); labelKey_1 = lv_label_create(NumberKey_1, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_1, machine_menu.key_1); lv_obj_align(labelKey_1, NumberKey_1, LV_ALIGN_CENTER, 0, 0); @@ -632,7 +800,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_2, event_handler, ID_NUM_KEY2, NULL, 0); lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_2, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_2, LV_LAYOUT_OFF); labelKey_2 = lv_label_create(NumberKey_2, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_2, machine_menu.key_2); lv_obj_align(labelKey_2, NumberKey_2, LV_ALIGN_CENTER, 0, 0); @@ -643,7 +811,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_3, event_handler, ID_NUM_KEY3, NULL, 0); lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_3, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_3, LV_LAYOUT_OFF); labelKey_3 = lv_label_create(NumberKey_3, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_3, machine_menu.key_3); lv_obj_align(labelKey_3, NumberKey_3, LV_ALIGN_CENTER, 0, 0); @@ -654,7 +822,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_4, event_handler, ID_NUM_KEY4, NULL, 0); lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_4, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_4, LV_LAYOUT_OFF); labelKey_4 = lv_label_create(NumberKey_4, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_4, machine_menu.key_4); lv_obj_align(labelKey_4, NumberKey_4, LV_ALIGN_CENTER, 0, 0); @@ -665,7 +833,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_5, event_handler, ID_NUM_KEY5, NULL, 0); lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_5, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_5, LV_LAYOUT_OFF); labelKey_5 = lv_label_create(NumberKey_5, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_5, machine_menu.key_5); lv_obj_align(labelKey_5, NumberKey_5, LV_ALIGN_CENTER, 0, 0); @@ -676,7 +844,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_6, event_handler, ID_NUM_KEY6, NULL, 0); lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_6, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_6, LV_LAYOUT_OFF); labelKey_6 = lv_label_create(NumberKey_6, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_6, machine_menu.key_6); lv_obj_align(labelKey_6, NumberKey_6, LV_ALIGN_CENTER, 0, 0); @@ -687,7 +855,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_7, event_handler, ID_NUM_KEY7, NULL, 0); lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_7, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_7, LV_LAYOUT_OFF); labelKey_7 = lv_label_create(NumberKey_7, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_7, machine_menu.key_7); lv_obj_align(labelKey_7, NumberKey_7, LV_ALIGN_CENTER, 0, 0); @@ -698,7 +866,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_8, event_handler, ID_NUM_KEY8, NULL, 0); lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_8, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_8, LV_LAYOUT_OFF); labelKey_8 = lv_label_create(NumberKey_8, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_8, machine_menu.key_8); lv_obj_align(labelKey_8, NumberKey_8, LV_ALIGN_CENTER, 0, 0); @@ -709,7 +877,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_9, event_handler, ID_NUM_KEY9, NULL, 0); lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_9, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_9, LV_LAYOUT_OFF); labelKey_9 = lv_label_create(NumberKey_9, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_9, machine_menu.key_9); lv_obj_align(labelKey_9, NumberKey_9, LV_ALIGN_CENTER, 0, 0); @@ -720,7 +888,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(NumberKey_0, event_handler, ID_NUM_KEY0, NULL, 0); lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(NumberKey_0, LV_LAYOUT_OFF); + //lv_btn_set_layout(NumberKey_0, LV_LAYOUT_OFF); labelKey_0 = lv_label_create(NumberKey_0, NULL); /*Add a label to the button*/ lv_label_set_text(labelKey_0, machine_menu.key_0); lv_obj_align(labelKey_0, NumberKey_0, LV_ALIGN_CENTER, 0, 0); @@ -731,7 +899,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(KeyBack, event_handler, ID_NUM_BACK, NULL, 0); lv_btn_set_style(KeyBack, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(KeyBack, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(KeyBack, LV_LAYOUT_OFF); + //lv_btn_set_layout(KeyBack, LV_LAYOUT_OFF); labelKeyBack = lv_label_create(KeyBack, NULL); /*Add a label to the button*/ lv_label_set_text(labelKeyBack, machine_menu.key_back); lv_obj_align(labelKeyBack, KeyBack, LV_ALIGN_CENTER, 0, 0); @@ -742,7 +910,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(KeyReset, event_handler, ID_NUM_RESET, NULL, 0); lv_btn_set_style(KeyReset, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(KeyReset, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(KeyReset, LV_LAYOUT_OFF); + //lv_btn_set_layout(KeyReset, LV_LAYOUT_OFF); labelKeyReset = lv_label_create(KeyReset, NULL); /*Add a label to the button*/ lv_label_set_text(labelKeyReset, machine_menu.key_reset); lv_obj_align(labelKeyReset, KeyReset, LV_ALIGN_CENTER, 0, 0); @@ -753,7 +921,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(KeyConfirm, event_handler, ID_NUM_CONFIRM, NULL, 0); lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(KeyConfirm, LV_LAYOUT_OFF); + //lv_btn_set_layout(KeyConfirm, LV_LAYOUT_OFF); labelKeyConfirm = lv_label_create(KeyConfirm, NULL); /*Add a label to the button*/ lv_label_set_text(labelKeyConfirm, machine_menu.key_confirm); lv_obj_align(labelKeyConfirm, KeyConfirm, LV_ALIGN_CENTER, 0, 0); @@ -764,7 +932,7 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(KeyPoint, event_handler, ID_NUM_POINT, NULL, 0); lv_btn_set_style(KeyPoint, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(KeyPoint, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(KeyPoint, LV_LAYOUT_OFF); + //lv_btn_set_layout(KeyPoint, LV_LAYOUT_OFF); labelKeyPoint = lv_label_create(KeyPoint, NULL); /*Add a label to the button*/ lv_label_set_text(labelKeyPoint, machine_menu.key_point); lv_obj_align(labelKeyPoint, KeyPoint, LV_ALIGN_CENTER, 0, 0); @@ -775,14 +943,39 @@ void lv_draw_number_key(void) { lv_obj_set_event_cb_mks(Minus, event_handler, ID_NUM_NAGETIVE, NULL, 0); lv_btn_set_style(Minus, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(Minus, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - lv_btn_set_layout(Minus, LV_LAYOUT_OFF); + //lv_btn_set_layout(Minus, LV_LAYOUT_OFF); labelMinus = lv_label_create(Minus, NULL); /*Add a label to the button*/ lv_label_set_text(labelMinus, machine_menu.negative); lv_obj_align(labelMinus, Minus, LV_ALIGN_CENTER, 0, 0); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, NumberKey_1); + lv_group_add_obj(g, NumberKey_2); + lv_group_add_obj(g, NumberKey_3); + lv_group_add_obj(g, KeyBack); + lv_group_add_obj(g, NumberKey_4); + lv_group_add_obj(g, NumberKey_5); + lv_group_add_obj(g, NumberKey_6); + lv_group_add_obj(g, KeyReset); + lv_group_add_obj(g, NumberKey_7); + lv_group_add_obj(g, NumberKey_8); + lv_group_add_obj(g, NumberKey_9); + lv_group_add_obj(g, NumberKey_0); + lv_group_add_obj(g, Minus); + lv_group_add_obj(g, KeyPoint); + lv_group_add_obj(g, KeyConfirm); + } + #endif + disp_key_value(); } -void lv_clear_number_key() { lv_obj_del(scr); } +void lv_clear_number_key() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index ad8cad03e0..4a4a0ee130 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -31,7 +31,11 @@ //#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" +#include "../../../../module/motion.h" +#include "../../../../sd/cardreader.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_O_PRE_HEAT 1 @@ -42,10 +46,13 @@ static lv_obj_t * scr; #define ID_O_RETURN 6 #define ID_O_FAN 7 #define ID_O_POWER_OFF 8 +#define ID_O_BABY_STEP 9 static lv_obj_t *label_PowerOff; static lv_obj_t *buttonPowerOff; +extern feedRate_t feedrate_mm_s; + static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_O_PRE_HEAT: @@ -80,6 +87,20 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { + #if HAS_MULTI_EXTRUDER + uiCfg.curSprayerChoose_bak = active_extruder; + #endif + if (uiCfg.print_state == WORKING) { + #if ENABLED(SDSUPPORT) + card.pauseSDPrint(); + stop_print_time(); + uiCfg.print_state = PAUSING; + #endif + } + uiCfg.moveSpeed_bak = (uint16_t)feedrate_mm_s; + uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[active_extruder].target; + lv_clear_operation(); + lv_draw_filament_change(); } break; case ID_O_FAN: @@ -116,7 +137,8 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (gCfgItems.finish_power_off == 1) { gCfgItems.finish_power_off = 0; - lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0); // didn't find bmp_Mamual... + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); lv_label_set_text(label_PowerOff, printing_more_menu.manual); lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_obj_refresh_ext_draw_pad(label_PowerOff); @@ -124,7 +146,8 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else { gCfgItems.finish_power_off = 1; - lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_auto_off.bin", 0); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_obj_refresh_ext_draw_pad(label_PowerOff); @@ -132,16 +155,26 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } break; - + case ID_O_BABY_STEP: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_operation(); + lv_draw_baby_stepping(); + } + break; } } void lv_draw_operation(void) { - lv_obj_t *buttonPreHeat, *buttonExtrusion, *buttonSpeed; - lv_obj_t *buttonBack, *buttonFan; - lv_obj_t *labelPreHeat, *labelExtrusion; - lv_obj_t *label_Back, *label_Speed, *label_Fan; + lv_obj_t *buttonPreHeat = NULL, *buttonExtrusion = NULL, *buttonSpeed = NULL; + lv_obj_t *buttonBack = NULL, *buttonFan = NULL; + lv_obj_t *labelPreHeat = NULL, *labelExtrusion = NULL; + lv_obj_t *label_Back = NULL, *label_Speed = NULL, *label_Fan = NULL; lv_obj_t *buttonMove = NULL, *label_Move = NULL; + lv_obj_t *buttonBabyStep = NULL, *label_BabyStep = NULL; + lv_obj_t *buttonFilament = NULL, *label_Filament = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != OPERATE_UI) { disp_state_stack._disp_index++; @@ -162,165 +195,219 @@ void lv_draw_operation(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - - /*Create an Image button*/ - buttonPreHeat = lv_imgbtn_create(scr, NULL); - buttonExtrusion = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, NULL); - buttonSpeed = lv_imgbtn_create(scr, NULL); - + // Create image buttons + buttonPreHeat = lv_imgbtn_create(scr, NULL); + buttonFilament = lv_imgbtn_create(scr, NULL); + buttonFan = lv_imgbtn_create(scr, NULL); + buttonPowerOff = lv_imgbtn_create(scr, NULL); if (uiCfg.print_state != WORKING) { - //buttonFilament = lv_imgbtn_create(scr, NULL); - //} else { - buttonMove = lv_imgbtn_create(scr, NULL); + buttonExtrusion = lv_imgbtn_create(scr, NULL); + buttonMove = lv_imgbtn_create(scr, NULL); } + else { + buttonSpeed = lv_imgbtn_create(scr, NULL); + buttonBabyStep = lv_imgbtn_create(scr, NULL); + } + buttonBack = lv_imgbtn_create(scr, NULL); - buttonPowerOff = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_O_PRE_HEAT, "bmp_temp.bin", 0); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_O_PRE_HEAT, NULL, 0); + lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, "F:/bmp_temp.bin"); + lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, "F:/bmp_temp.bin"); lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonPreHeat, LV_PROTECT_FOLLOW); - #if 1 - lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_O_EXTRUCT, "bmp_extrude_opr.bin", 0); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_O_FAN, "bmp_fan.bin", 0); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonFilament, event_handler, ID_O_FILAMENT, NULL, 0); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, "F:/bmp_filamentchange.bin"); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, "F:/bmp_filamentchange.bin"); + lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); + + #if 1 + lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_O_FAN, NULL, 0); + lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, "F:/bmp_fan.bin"); + lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, "F:/bmp_fan.bin"); lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_O_SPEED, "bmp_speed.bin", 0); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); - - if (uiCfg.print_state != WORKING) { - /* - lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_O_FILAMENT,"bmp_Filamentchange.bin",0); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); - } else { - */ - lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_O_MOV, "bmp_move_opr.bin", 0); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); + if (gCfgItems.finish_power_off == 1) { + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); } - if (gCfgItems.finish_power_off == 1) - lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_auto_off.bin", 0); - else - lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, &bmp_pic); + else { + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); + } + lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, NULL, 0); lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_O_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPreHeat); + lv_group_add_obj(g, buttonFilament); + lv_group_add_obj(g, buttonFan); + lv_group_add_obj(g, buttonPowerOff); + } + #endif + + if (uiCfg.print_state != WORKING) { + lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_O_EXTRUCT, NULL, 0); + lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, "F:/bmp_extrude_opr.bin"); + lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, "F:/bmp_extrude_opr.bin"); + lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_O_MOV, NULL, 0); + lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, "F:/bmp_move_opr.bin"); + lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, "F:/bmp_move_opr.bin"); + lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonExtrusion); + lv_group_add_obj(g, buttonMove); + } + #endif + } + else { + lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_O_SPEED, NULL, 0); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed.bin"); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed.bin"); + lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonBabyStep, event_handler, ID_O_BABY_STEP, NULL, 0); + lv_imgbtn_set_src(buttonBabyStep, LV_BTN_STATE_REL, "F:/bmp_mov.bin"); + lv_imgbtn_set_src(buttonBabyStep, LV_BTN_STATE_PR, "F:/bmp_mov.bin"); + lv_imgbtn_set_style(buttonBabyStep, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBabyStep, LV_BTN_STATE_REL, &tft_style_label_rel); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonSpeed); + lv_group_add_obj(g, buttonBabyStep); + } + #endif + } + + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_O_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif // if 1 - lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonExtrusion, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); + lv_obj_set_pos(buttonFilament, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonFan, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); + lv_obj_set_pos(buttonPowerOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); if (uiCfg.print_state != WORKING) { /* lv_obj_set_pos(buttonFilament,INTERVAL_V,BTN_Y_PIXEL+INTERVAL_H+titleHeight); } else { */ - lv_obj_set_pos(buttonMove, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonPowerOff, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonExtrusion, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonMove, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); } else { - lv_obj_set_pos(buttonPowerOff, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonSpeed, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBabyStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); } + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + // Create labels on the image buttons lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonPowerOff, LV_LAYOUT_OFF); if (uiCfg.print_state != WORKING) { /* lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); } else { */ + lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); } - lv_btn_set_layout(buttonPowerOff, LV_LAYOUT_OFF); + else { + lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBabyStep, LV_LAYOUT_OFF); + } + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); labelPreHeat = lv_label_create(buttonPreHeat, NULL); - labelExtrusion = lv_label_create(buttonExtrusion, NULL); - + label_Filament = lv_label_create(buttonFilament, NULL); label_Fan = lv_label_create(buttonFan, NULL); - label_Speed = lv_label_create(buttonSpeed, NULL); + label_PowerOff = lv_label_create(buttonPowerOff, NULL); if (uiCfg.print_state != WORKING) { /* label_Filament = lv_label_create(buttonFilament, NULL); } else { */ - label_Move = lv_label_create(buttonMove, NULL); + labelExtrusion = lv_label_create(buttonExtrusion, NULL); + label_Move = lv_label_create(buttonMove, NULL); + } + else { + label_Speed = lv_label_create(buttonSpeed, NULL); + label_BabyStep = lv_label_create(buttonBabyStep, NULL); } - label_PowerOff = lv_label_create(buttonPowerOff, NULL); - label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelPreHeat, operation_menu.temp); lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(labelExtrusion, operation_menu.extr); - lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_label_set_text(label_Filament, operation_menu.filament); + lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(label_Fan, operation_menu.fan); lv_obj_align(label_Fan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(label_Speed, operation_menu.speed); - lv_obj_align(label_Speed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - if (uiCfg.print_state != WORKING) { - /* - lv_label_set_text(label_Filament, operation_menu.filament); - lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - } else { - */ - lv_label_set_text(label_Move, operation_menu.move); - lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - if (gCfgItems.finish_power_off == 1) lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); else lv_label_set_text(label_PowerOff, printing_more_menu.manual); lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + if (uiCfg.print_state != WORKING) { + /* + lv_label_set_text(label_Filament, operation_menu.filament); + lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + } else { + */ + lv_label_set_text(labelExtrusion, operation_menu.extr); + lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Move, operation_menu.move); + lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else { + lv_label_set_text(label_Speed, operation_menu.speed); + lv_obj_align(label_Speed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_BabyStep, operation_menu.babystep); + lv_obj_align(label_BabyStep, buttonBabyStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } -void lv_clear_operation() { lv_obj_del(scr); } +void lv_clear_operation() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index 56caf812b1..9b99971f4f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -29,6 +29,7 @@ #include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_PAUSE_RETURN 1 @@ -82,9 +83,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_pause_position(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PAUSE_POS_UI) { @@ -106,85 +107,60 @@ void lv_draw_pause_position(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - // LV_IMG_DECLARE(bmp_para_arrow); - LV_IMG_DECLARE(bmp_para_bank); + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.xPos); - buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonXText, event_handler); - lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); - labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ - - buttonXValue = lv_imgbtn_create(scr, NULL); + buttonXValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_PAUSE_X, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_PAUSE_X, NULL, 0); labelXValue = lv_label_create(buttonXValue, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonYText, event_handler); - lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); - labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.yPos); - buttonYValue = lv_imgbtn_create(scr, NULL); + buttonYValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_PAUSE_Y, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_PAUSE_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); labelYValue = lv_label_create(buttonYValue, NULL); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonZText, event_handler); - lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); - labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.zPos); - buttonZValue = lv_imgbtn_create(scr, NULL); + buttonZValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_PAUSE_Z, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_PAUSE_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); labelZValue = lv_label_create(buttonZValue, NULL); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PAUSE_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - + buttonBack = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PAUSE_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { @@ -203,20 +179,24 @@ void lv_draw_pause_position(void) { lv_label_set_text(labelZValue, public_buf_l); lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - lv_label_set_text(labelXText, machine_menu.xPos); - lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelYText, machine_menu.yPos); - lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelZText, machine_menu.zPos); - lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); - lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_pause_position() { lv_obj_del(scr); } +void lv_clear_pause_position() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index ff7641ddfd..f58a47b341 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -34,9 +34,10 @@ #include "../../../../module/temperature.h" static lv_obj_t * scr; +extern lv_group_t* g; static lv_obj_t *buttoType, *buttonStep; -static lv_obj_t * labelType; -static lv_obj_t * labelStep; +static lv_obj_t *labelType; +static lv_obj_t *labelStep; static lv_obj_t * tempText1; #define ID_P_ADD 1 @@ -58,23 +59,22 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { if (uiCfg.curSprayerChoose == 0) { if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } } #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } #endif + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } #if HAS_HEATED_BED else { thermalManager.temp_bed.target += uiCfg.stepHeat; if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); - thermalManager.start_watching_bed(); } + thermalManager.start_watching_bed(); } #endif disp_desire_temp(); @@ -88,23 +88,21 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { if (uiCfg.curTempType == 0) { if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > uiCfg.stepHeat) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target -= uiCfg.stepHeat; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } else { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } #if HAS_HEATED_BED else { if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) { thermalManager.temp_bed.target -= uiCfg.stepHeat; - thermalManager.start_watching_bed(); } else { thermalManager.temp_bed.target = (float)0; - thermalManager.start_watching_bed(); } + thermalManager.start_watching_bed(); } #endif disp_desire_temp(); @@ -212,9 +210,7 @@ void lv_draw_preHeat(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - - /*Create an Image button*/ + // Create image buttons buttonAdd = lv_imgbtn_create(scr, NULL); buttonDec = lv_imgbtn_create(scr, NULL); buttoType = lv_imgbtn_create(scr, NULL); @@ -222,40 +218,37 @@ void lv_draw_preHeat(void) { buttonOff = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_P_ADD, "bmp_Add.bin", 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_P_ADD, NULL, 0); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); + #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_P_DEC, "bmp_Dec.bin", 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_P_DEC, NULL, 0); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, NULL, 0); lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, NULL, 0); lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_P_OFF, "bmp_speed0.bin", 0); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_P_OFF, NULL, 0); + lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, "F:/bmp_speed0.bin"); + lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, "F:/bmp_speed0.bin"); lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif @@ -295,6 +288,16 @@ void lv_draw_preHeat(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAdd); + lv_group_add_obj(g, buttonDec); + lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonStep); + lv_group_add_obj(g, buttonOff); + lv_group_add_obj(g, buttonBack); + } + #endif disp_temp_type(); disp_step_heat(); @@ -307,14 +310,16 @@ void lv_draw_preHeat(void) { void disp_temp_type() { if (uiCfg.curTempType == 0) { if (uiCfg.curSprayerChoose == 1) { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_extru2.bin", 0); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, preheat_menu.ext2); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } else { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_extru1.bin", 0); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, preheat_menu.ext1); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -323,7 +328,8 @@ void disp_temp_type() { } else { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_bed.bin", 0); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_bed.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_bed.bin"); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, preheat_menu.hotbed); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -356,12 +362,18 @@ void disp_desire_temp() { } void disp_step_heat() { - if (uiCfg.stepHeat == 1) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_step1_degree.bin", 0); - else if (uiCfg.stepHeat == 5) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_step5_degree.bin", 0); - else if (uiCfg.stepHeat == 10) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_step10_degree.bin", 0); + if (uiCfg.stepHeat == 1) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_degree.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_degree.bin"); + } + else if (uiCfg.stepHeat == 5) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_degree.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_degree.bin"); + } + else if (uiCfg.stepHeat == 10) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_degree.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_degree.bin"); + } if (gCfgItems.multiple_language != 0) { if (uiCfg.stepHeat == 1) { @@ -379,6 +391,11 @@ void disp_step_heat() { } } -void lv_clear_preHeat() { lv_obj_del(scr); } +void lv_clear_preHeat() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 13a92269f8..add0f0394b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -33,6 +33,7 @@ #include "../../../../sd/cardreader.h" static lv_obj_t * scr; +extern lv_group_t* g; static lv_obj_t *buttonPageUp, *buttonPageDown, *buttonBack, *buttonGcode[FILE_BTN_CNT], *labelPageUp[FILE_BTN_CNT], *buttonText[FILE_BTN_CNT]; @@ -132,11 +133,6 @@ uint8_t have_pre_pic(char *path) { return 0; } -LV_IMG_DECLARE(bmp_pic_117x92); -LV_IMG_DECLARE(bmp_pic_100x100); -LV_IMG_DECLARE(bmp_pic); -LV_IMG_DECLARE(bmp_pic_100x40); - static void event_handler(lv_obj_t * obj, lv_event_t event) { uint8_t i, file_count = 0; //switch (obj->mks_obj_id) @@ -157,7 +153,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { #endif if (file_count != 0) { dir_offset[curDirLever].curPage--; - lv_obj_del(scr); + lv_clear_print_file(); disp_gcode_icon(file_count); } } @@ -175,7 +171,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { #endif if (file_count != 0) { dir_offset[curDirLever].curPage++; - lv_obj_del(scr); + lv_clear_print_file(); disp_gcode_icon(file_count); } if (file_count < FILE_NUM) @@ -202,12 +198,12 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { #if ENABLED(SDSUPPORT) file_count = search_file(); #endif - lv_obj_del(scr); + lv_clear_print_file(); disp_gcode_icon(file_count); } } else { - lv_obj_del(scr); + lv_clear_print_file(); lv_draw_ready_print(); } } @@ -227,12 +223,12 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { #if ENABLED(SDSUPPORT) file_count = search_file(); #endif - lv_obj_del(scr); + lv_clear_print_file(); disp_gcode_icon(file_count); } else { sel_id = i; - lv_obj_del(scr); + lv_clear_print_file(); lv_draw_dialog(DIALOG_TYPE_PRINT_FILE); } break; @@ -269,9 +265,9 @@ void lv_draw_print_file(void) { #endif disp_gcode_icon(file_count); - //lv_obj_t * labelPageUp = lv_label_create(buttonPageUp, NULL); - //lv_obj_t * labelPageDown = lv_label_create(buttonPageDown, NULL); - //lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); + //lv_obj_t *labelPageUp = lv_label_create(buttonPageUp, NULL); + //lv_obj_t *labelPageDown = lv_label_create(buttonPageDown, NULL); + //lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); /* if (gCfgItems.multiple_language != 0) { @@ -286,7 +282,7 @@ void lv_draw_print_file(void) { } */ } - +static char test_public_buf_l[40]; void disp_gcode_icon(uint8_t file_num) { uint8_t i; @@ -310,23 +306,22 @@ void disp_gcode_icon(uint8_t file_num) { buttonPageDown = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonPageUp, event_handler, ID_P_UP, "bmp_pageUp.bin", 0); - lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_REL, &bmp_pic_117x92); - lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_PR, &bmp_pic_117x92); + lv_obj_set_event_cb_mks(buttonPageUp, event_handler, ID_P_UP, NULL, 0); + lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_REL, "F:/bmp_pageUp.bin"); + lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_PR, "F:/bmp_pageUp.bin"); lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonPageUp, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonPageDown, event_handler, ID_P_DOWN, "bmp_pageDown.bin", 0); - lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_REL, &bmp_pic_117x92); - lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_PR, &bmp_pic_117x92); + lv_obj_set_event_cb_mks(buttonPageDown, event_handler, ID_P_DOWN, NULL, 0); + lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_REL, "F:/bmp_pageDown.bin"); + lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_PR, "F:/bmp_pageDown.bin"); lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_back.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic_117x92); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic_117x92); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif @@ -365,9 +360,9 @@ void disp_gcode_icon(uint8_t file_num) { cutFileName((char *)list_file.long_name[i], 16, 8, (char *)public_buf_m); if (list_file.IsFolder[i] == 1) { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "bmp_dir.bin", 0); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, "F:/bmp_dir.bin"); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, "F:/bmp_dir.bin"); if (i < 3) lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); else @@ -380,9 +375,17 @@ void disp_gcode_icon(uint8_t file_num) { } else { if (have_pre_pic((char *)list_file.file_name[i])) { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), list_file.file_name[i], 1); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, &bmp_pic_100x100); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, &bmp_pic_100x100); + + //lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), list_file.file_name[i], 1); + + ZERO(test_public_buf_l); + strcat(test_public_buf_l,"S:"); + strcat(test_public_buf_l,list_file.file_name[i]); + char *temp = strstr(test_public_buf_l,".GCO"); + if (temp) { strcpy(temp,".bin"); } + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, test_public_buf_l); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, test_public_buf_l); if (i < 3) { lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET); buttonText[i] = lv_btn_create(scr, NULL); @@ -395,8 +398,6 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0); - //lv_imgbtn_set_src(buttonText[i], LV_BTN_STATE_REL, &bmp_pic_100x40); - //lv_imgbtn_set_src(buttonText[i], LV_BTN_STATE_PR, &bmp_pic_100x40); lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); lv_obj_set_size(buttonText[i], 100, 40); } @@ -412,8 +413,6 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0); - //lv_imgbtn_set_src(buttonText[i], LV_BTN_STATE_REL, &bmp_pic_100x40); - //lv_imgbtn_set_src(buttonText[i], LV_BTN_STATE_PR, &bmp_pic_100x40); lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); lv_obj_set_size(buttonText[i], 100, 40); } @@ -423,9 +422,9 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_align(labelPageUp[i], buttonText[i], LV_ALIGN_IN_BOTTOM_MID, 0, 0); } else { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "bmp_file.bin", 0); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, "F:/bmp_file.bin"); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, "F:/bmp_file.bin"); if (i < 3) lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); else @@ -437,15 +436,26 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5); } } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonGcode[i]); + #endif + #else // !TFT35 #endif // !TFT35 } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPageUp); + lv_group_add_obj(g, buttonPageDown); + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_open_gcode_file(char *path) { +uint32_t lv_open_gcode_file(char *path) { #if ENABLED(SDSUPPORT) uint32_t *ps4; - int pre_sread_cnt; + uint32_t pre_sread_cnt = 0; char *cur_name; cur_name = strrchr(path, '/'); @@ -458,10 +468,10 @@ void lv_open_gcode_file(char *path) { pre_sread_cnt = (uint32_t)ps4 - (uint32_t)((uint32_t *)(&public_buf[0])); card.setIndex(pre_sread_cnt); } + return pre_sread_cnt; #endif // SDSUPPORT } - int ascii2dec_test(char *ascii) { int result = 0; if (ascii == 0) return 0; @@ -534,6 +544,10 @@ void lv_gcode_file_read(uint8_t *data_buf) { void lv_close_gcode_file() {TERN_(SDSUPPORT, card.closefile());} +void lv_gcode_file_seek(uint32_t pos) { + card.setIndex(pos); +} + void cutFileName(char *path, int len, int bytePerLine, char *outStr) { #if _LFN_UNICODE TCHAR *tmpFile; @@ -616,6 +630,11 @@ void cutFileName(char *path, int len, int bytePerLine, char *outStr) { #endif } -void lv_clear_print_file() { lv_obj_del(scr); } +void lv_clear_print_file() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h index 226e4f668e..083b3d9acf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -52,12 +52,13 @@ extern LIST_FILE list_file; extern void disp_gcode_icon(uint8_t file_num); extern void lv_draw_print_file(void); -extern void lv_open_gcode_file(char *path); +extern uint32_t lv_open_gcode_file(char *path); extern void lv_gcode_file_read(uint8_t *data_buf); extern void lv_close_gcode_file(); extern void cutFileName(char *path, int len, int bytePerLine, char *outStr); extern int ascii2dec_test(char *ascii); extern void lv_clear_print_file(); +extern void lv_gcode_file_seek(uint32_t pos); //extern void disp_temp_ready_print(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index e5a7bb18d9..a81b5b851b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -35,6 +35,7 @@ #include "../../../../module/motion.h" #include "../../../../sd/cardreader.h" #include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -43,10 +44,11 @@ #include "../../../ultralcd.h" #endif +extern lv_group_t * g; static lv_obj_t * scr; -static lv_obj_t * labelExt1, * labelExt2, * labelFan, * labelZpos, * labelTime; -static lv_obj_t * labelPause, * labelStop, * labelOperat; -static lv_obj_t * bar1; +static lv_obj_t *labelExt1, * labelExt2, * labelFan, * labelZpos, * labelTime; +static lv_obj_t *labelPause, * labelStop, * labelOperat; +static lv_obj_t * bar1, *bar1ValueText; static lv_obj_t * buttonPause, *buttonOperat, *buttonStop; #if HAS_HEATED_BED @@ -57,8 +59,6 @@ static lv_obj_t * buttonPause, *buttonOperat, *buttonStop; #define ID_STOP 2 #define ID_OPTION 3 -lv_style_t lv_bar_style_indic; - uint8_t once_flag = 0; extern uint32_t To_pre_view; extern uint8_t flash_preview_begin; @@ -82,21 +82,23 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { stop_print_time(); uiCfg.print_state = PAUSING; #endif - lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_resume.bin", 0); + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_resume.bin"); + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_resume.bin"); lv_label_set_text(labelPause, printing_menu.resume); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); } else if (uiCfg.print_state == PAUSED) { uiCfg.print_state = RESUMING; - // if (IS_SD_PAUSED())queue.inject_P(PSTR("M24"));// queue.inject_P(M24_STR); - lv_obj_set_event_cb_mks(obj, event_handler, ID_PAUSE, "bmp_pause.bin", 0); + lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); + lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); lv_label_set_text(labelPause, printing_menu.pause); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); } #if ENABLED(POWER_LOSS_RECOVERY) else if (uiCfg.print_state == REPRINTING) { uiCfg.print_state = REPRINTED; - lv_obj_set_event_cb_mks(obj, event_handler, ID_PAUSE, "bmp_pause.bin", 0); + lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); + lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); lv_label_set_text(labelPause, printing_menu.pause); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); // recovery.resume(); @@ -115,7 +117,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (gcode_preview_over != 1) { - lv_obj_del(scr); + lv_clear_printing(); lv_draw_dialog(DIALOG_TYPE_STOP); } } @@ -126,7 +128,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (gcode_preview_over != 1) { - lv_obj_del(scr); + lv_clear_printing(); lv_draw_operation(); } } @@ -159,88 +161,71 @@ void lv_draw_printing(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic_150x80); - LV_IMG_DECLARE(bmp_pic_45x45); - - /*Create an Image button*/ - buttonExt1 = lv_imgbtn_create(scr, NULL); - if (EXTRUDERS == 2) - buttonExt2 = lv_imgbtn_create(scr, NULL); - - #if HAS_HEATED_BED - buttonBedstate = lv_imgbtn_create(scr, NULL); + // Create image buttons + buttonExt1 = lv_img_create(scr, NULL); + #if HAS_MULTI_EXTRUDER + buttonExt2 = lv_img_create(scr, NULL); #endif - - buttonFanstate = lv_imgbtn_create(scr, NULL); - buttonZpos = lv_imgbtn_create(scr, NULL); + #if HAS_HEATED_BED + buttonBedstate = lv_img_create(scr, NULL); + #endif + buttonFanstate = lv_img_create(scr, NULL); + buttonTime = lv_img_create(scr, NULL); + buttonZpos = lv_img_create(scr, NULL); buttonPause = lv_imgbtn_create(scr, NULL); buttonStop = lv_imgbtn_create(scr, NULL); buttonOperat = lv_imgbtn_create(scr, NULL); - buttonTime = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonExt1, event_handler, 0, "bmp_ext1_state.bin", 0); - lv_imgbtn_set_src(buttonExt1, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonExt1, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonExt1, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExt1, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonExt1, LV_PROTECT_FOLLOW); + lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); #if 1 - if (EXTRUDERS == 2) { - lv_obj_set_event_cb_mks(buttonExt2, event_handler, 0, "bmp_ext2_state.bin", 0); - lv_imgbtn_set_src(buttonExt2, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonExt2, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonExt2, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExt2, LV_BTN_STATE_REL, &tft_style_label_rel); - } + #if HAS_MULTI_EXTRUDER + lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); + #endif #if HAS_HEATED_BED - lv_obj_set_event_cb_mks(buttonBedstate, event_handler, 0, "bmp_bed_state.bin", 0); - lv_imgbtn_set_src(buttonBedstate, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonBedstate, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonBedstate, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBedstate, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); #endif - lv_obj_set_event_cb_mks(buttonFanstate, event_handler, 0, "bmp_fan_state.bin", 0); - lv_imgbtn_set_src(buttonFanstate, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonFanstate, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonFanstate, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFanstate, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); - lv_obj_set_event_cb_mks(buttonTime, event_handler, 0, "bmp_time_state.bin", 0); - lv_imgbtn_set_src(buttonTime, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonTime, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonTime, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTime, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_img_set_src(buttonTime, "F:/bmp_time_state.bin"); - lv_obj_set_event_cb_mks(buttonZpos, event_handler, 0, "bmp_zpos_state.bin", 0); - lv_imgbtn_set_src(buttonZpos, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonZpos, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonZpos, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZpos, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_img_set_src(buttonZpos, "F:/bmp_zpos_state.bin"); - if (uiCfg.print_state == WORKING) - lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_pause.bin", 0); - else - lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_resume.bin", 0); + if (uiCfg.print_state == WORKING) { + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); + } + else { + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_resume.bin"); + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_resume.bin"); + } - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, &bmp_pic_150x80); - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, &bmp_pic_150x80); + lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, NULL, 0); lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonStop, event_handler, ID_STOP, "bmp_stop.bin", 0); - lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_REL, &bmp_pic_150x80); - lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_PR, &bmp_pic_150x80); + lv_obj_set_event_cb_mks(buttonStop, event_handler, ID_STOP, NULL, 0); + lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_REL, "F:/bmp_stop.bin"); + lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_PR, "F:/bmp_stop.bin"); lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOperat, event_handler, ID_OPTION, "bmp_operate.bin", 0); - lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_REL, &bmp_pic_150x80); - lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_PR, &bmp_pic_150x80); + lv_obj_set_event_cb_mks(buttonOperat, event_handler, ID_OPTION, NULL, 0); + lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_REL, "F:/bmp_operate.bin"); + lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_PR, "F:/bmp_operate.bin"); lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPause); + lv_group_add_obj(g, buttonStop); + lv_group_add_obj(g, buttonOperat); + } + #endif + lv_obj_set_pos(buttonExt1, 205, 136); #if HAS_MULTI_EXTRUDER @@ -258,17 +243,19 @@ void lv_draw_printing(void) { lv_obj_set_pos(buttonStop, 165, 240); lv_obj_set_pos(buttonOperat, 325, 240); - /*Create a label on the Image button*/ - lv_btn_set_layout(buttonExt1, LV_LAYOUT_OFF); - if (EXTRUDERS == 2) - lv_btn_set_layout(buttonExt2, LV_LAYOUT_OFF); + // Create labels on the image buttons + //lv_btn_set_layout(buttonExt1, LV_LAYOUT_OFF); + //#if HAS_MULTI_EXTRUDER + //lv_btn_set_layout(buttonExt2, LV_LAYOUT_OFF); + //#endif - #if HAS_HEATED_BED - lv_btn_set_layout(buttonBedstate, LV_LAYOUT_OFF); - #endif + //#if HAS_HEATED_BED + //lv_btn_set_layout(buttonBedstate, LV_LAYOUT_OFF); + //#endif - lv_btn_set_layout(buttonFanstate, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZpos, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonFanstate, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonTime, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonZpos, LV_LAYOUT_OFF); lv_btn_set_layout(buttonPause, LV_LAYOUT_OFF); lv_btn_set_layout(buttonStop, LV_LAYOUT_OFF); lv_btn_set_layout(buttonOperat, LV_LAYOUT_OFF); @@ -293,23 +280,20 @@ void lv_draw_printing(void) { lv_obj_set_style(labelFan, &tft_style_label_rel); lv_obj_set_pos(labelFan, 395, 196); - labelZpos = lv_label_create(scr, NULL); - lv_obj_set_style(labelZpos, &tft_style_label_rel); - lv_obj_set_pos(labelZpos, 395, 96); - labelTime = lv_label_create(scr, NULL); lv_obj_set_style(labelTime, &tft_style_label_rel); lv_obj_set_pos(labelTime, 250, 96); + labelZpos = lv_label_create(scr, NULL); + lv_obj_set_style(labelZpos, &tft_style_label_rel); + lv_obj_set_pos(labelZpos, 395, 96); + labelPause = lv_label_create(buttonPause, NULL); labelStop = lv_label_create(buttonStop, NULL); labelOperat = lv_label_create(buttonOperat, NULL); if (gCfgItems.multiple_language != 0) { - if (uiCfg.print_state == WORKING) - lv_label_set_text(labelPause, printing_menu.pause); - else - lv_label_set_text(labelPause, printing_menu.resume); + lv_label_set_text(labelPause, uiCfg.print_state == WORKING ? printing_menu.pause : printing_menu.resume); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 20, 0); lv_label_set_text(labelStop, printing_menu.stop); @@ -319,20 +303,15 @@ void lv_draw_printing(void) { lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 20, 0); } - lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color); - lv_bar_style_indic.text.color = lv_color_hex3(0xADF); - lv_bar_style_indic.image.color = lv_color_hex3(0xADF); - lv_bar_style_indic.line.color = lv_color_hex3(0xADF); - lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF); - lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF); - lv_bar_style_indic.body.border.color = lv_color_hex3(0xADF); - bar1 = lv_bar_create(scr, NULL); lv_obj_set_pos(bar1, 205, 36); lv_obj_set_size(bar1, 270, 40); lv_bar_set_style(bar1, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); lv_bar_set_anim_time(bar1, 1000); lv_bar_set_value(bar1, 0, LV_ANIM_ON); + bar1ValueText = lv_label_create(bar1, NULL); + lv_label_set_text(bar1ValueText,"0%"); + lv_obj_align(bar1ValueText, bar1, LV_ALIGN_CENTER, 0, 0); disp_ext_temp(); disp_bed_temp(); @@ -419,6 +398,10 @@ void setProBarRate() { if (disp_state == PRINTING_UI) { lv_bar_set_value(bar1, rate, LV_ANIM_ON); + ZERO(public_buf_l); + sprintf_P(public_buf_l, "%d%%", rate); + lv_label_set_text(bar1ValueText,public_buf_l); + lv_obj_align(bar1ValueText, bar1, LV_ALIGN_CENTER, 0, 0); if (marlin_state == MF_SD_COMPLETE) { if (once_flag == 0) { @@ -432,14 +415,22 @@ void setProBarRate() { once_flag = 1; #if HAS_SUICIDE - if (gCfgItems.finish_power_off == 1) - suicide(); + if (gCfgItems.finish_power_off == 1) { + gcode.process_subcommands_now_P(PSTR("M1001")); + queue.inject_P(PSTR("M81")); + marlin_state = MF_RUNNING; + } #endif } } } } -void lv_clear_printing() { lv_obj_del(scr); } +void lv_clear_printing() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 38750d608d..54ffdca64a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -42,6 +42,7 @@ #include //static lv_obj_t *buttonPrint,*buttonTool,*buttonSet; +extern lv_group_t* g; static lv_obj_t * scr; #if ENABLED(MKS_TEST) uint8_t curent_disp_ui = 0; @@ -59,7 +60,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_ready_print(); lv_draw_tool(); } break; @@ -68,7 +69,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_ready_print(); lv_draw_set(); } break; @@ -77,7 +78,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_ready_print(); lv_draw_print_file(); } break; @@ -111,7 +112,7 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - //lv_obj_t * label_tool2 = lv_label_create(scr, NULL); + //lv_obj_t *label_tool2 = lv_label_create(scr, NULL); //lv_obj_set_pos(label_tool,20,50); ZERO(buf); sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.temp_hotend[0].celsius); @@ -132,7 +133,6 @@ void mks_disp_test() { #endif } -extern unsigned char bmp_public_buf[17 * 1024]; void lv_draw_ready_print(void) { char buf[30] = {0}; lv_obj_t *buttonPrint, *buttonTool, *buttonSet; @@ -151,9 +151,7 @@ void lv_draw_ready_print(void) { //lv_obj_set_hidden(scr,true); lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - - if (mks_test_flag == 0x1e) { + if (mks_test_flag == 0x1E) { //lv_obj_t * title = lv_label_create(scr, NULL); //lv_obj_set_style(title, &tft_style_label_rel); //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); @@ -164,26 +162,10 @@ void lv_draw_ready_print(void) { buttonTool = lv_imgbtn_create(scr, NULL); //buttonSet = lv_imgbtn_create(scr, NULL); - //lv_obj_set_event_cb_mks(buttonPrint, event_handler,ID_PRINT,"bmp_printing.bin",0); - //lv_imgbtn_set_src_mks(buttonPrint, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_printing.bin"); - //lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_clear_protect(buttonPrint, LV_PROTECT_FOLLOW); - #if 1 - //lv_obj_set_event_cb_mks(buttonSet, event_handler,ID_SET,"bmp_set.bin",0); - //lv_imgbtn_set_src_mks(buttonSet, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_set.bin"); - //lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, "bmp_tool.bin", 0); - //lv_imgbtn_set_src_mks(buttonTool, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_tool.bin"); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, NULL, 0); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, "F:/bmp_tool.bin"); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, "F:/bmp_tool.bin"); lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); #endif @@ -266,56 +248,37 @@ void lv_draw_ready_print(void) { } else { - //lv_obj_t * title = lv_label_create(scr, NULL); - //lv_obj_set_style(title, &tft_style_label_rel); - //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - //lv_label_set_text(title, creat_title_text()); - - /*Create an Image button*/ - buttonPrint = lv_imgbtn_create(scr, NULL); - buttonTool = lv_imgbtn_create(scr, NULL); - buttonSet = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, "bmp_printing.bin", 0); - //lv_imgbtn_set_src_mks(buttonPrint, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_printing.bin"); - lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonPrint, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonSet, event_handler, ID_SET, "bmp_set.bin", 0); - //lv_imgbtn_set_src_mks(buttonSet, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_set.bin"); - lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, "bmp_tool.bin", 0); - //lv_imgbtn_set_src_mks(buttonTool, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_tool.bin"); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - + // Create an Image button + buttonTool = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonTool, 20, 90); - lv_obj_set_pos(buttonSet, 180, 90); - lv_obj_set_pos(buttonPrint, 340, 90); - - //lv_obj_set_pos(buttonTool,SIMPLE_FIRST_PAGE_GRAP+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - //lv_obj_set_pos(buttonSet,BTN_X_PIXEL+SIMPLE_FIRST_PAGE_GRAP*2+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - //lv_obj_set_pos(buttonPrint,BTN_X_PIXEL*2+SIMPLE_FIRST_PAGE_GRAP*3+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - - /*Create a label on the Image button*/ - lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); + lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, NULL, 0); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, "F:/bmp_tool.bin"); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, "F:/bmp_tool.bin"); + lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_t *label_tool = lv_label_create(buttonTool, NULL); lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); - lv_obj_t * label_print = lv_label_create(buttonPrint, NULL); - lv_obj_t * label_set = lv_label_create(buttonSet, NULL); - lv_obj_t * label_tool = lv_label_create(buttonTool, NULL); + buttonSet = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonSet, 180, 90); + lv_obj_set_event_cb_mks(buttonSet, event_handler, ID_SET, NULL, 0); + lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, "F:/bmp_set.bin"); + lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, "F:/bmp_set.bin"); + lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_t *label_set = lv_label_create(buttonSet, NULL); + lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); + + buttonPrint = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonPrint, 340, 90); + lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, NULL, 0); + lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, "F:/bmp_printing.bin"); + lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, "F:/bmp_printing.bin"); + lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_t *label_print = lv_label_create(buttonPrint, NULL); + lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); + if (gCfgItems.multiple_language != 0) { lv_label_set_text(label_print, main_menu.print); lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -323,14 +286,25 @@ void lv_draw_ready_print(void) { lv_label_set_text(label_set, main_menu.set); lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - //lv_label_set_style(label_tool,LV_BTN_STATE_PR,&tft_style_label_pre); - //lv_label_set_style(label_tool,LV_BTN_STATE_REL,&tft_style_label_rel); lv_label_set_text(label_tool, main_menu.tool); lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) { + lv_group_add_obj(g, buttonTool); + lv_group_add_obj(g, buttonSet); + lv_group_add_obj(g, buttonPrint); + } + #endif } } -void lv_clear_ready_print() { lv_obj_del(scr); } +void lv_clear_ready_print() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index eebb9fcf1c..6c10713d8a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -36,6 +36,7 @@ #include "pic_manager.h" static lv_obj_t * scr; +extern lv_group_t* g; #define ID_S_WIFI 1 #define ID_S_FAN 2 @@ -48,20 +49,17 @@ static lv_obj_t * scr; #define ID_S_RETURN 9 static void event_handler(lv_obj_t * obj, lv_event_t event) { + #if ENABLED(USE_WIFI_FUNCTION) + char buf[6] = { 0 }; + #endif switch (obj->mks_obj_id) { - case ID_S_WIFI: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - } - break; + case ID_S_FAN: if (event == LV_EVENT_CLICKED) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_set(); lv_draw_fan(); } break; @@ -70,7 +68,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_set(); lv_draw_about(); } break; @@ -94,7 +92,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_set(); lv_draw_language(); } break; @@ -103,7 +101,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_set(); lv_draw_machine_para(); } break; @@ -112,7 +110,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_set(); lv_draw_eeprom_settings(); } break; @@ -121,11 +119,50 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_obj_del(scr); + lv_clear_set(); lv_draw_ready_print(); } break; + #if ENABLED(USE_WIFI_FUNCTION) + case ID_S_WIFI: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + if (wifi_link_state == WIFI_CONNECTED) { + last_disp_state = SET_UI; + lv_clear_set(); + lv_draw_wifi(); + } + else { + if (uiCfg.command_send == 1) { + buf[0] = 0xA5; + buf[1] = 0x07; + buf[2] = 0x00; + buf[3] = 0x00; + buf[4] = 0xFC; + raw_send_to_wifi(buf, 5); + + last_disp_state = SET_UI; + lv_clear_set(); + lv_draw_wifi_list(); + } + else { + last_disp_state = SET_UI; + lv_clear_set(); + lv_draw_dialog(WIFI_ENABLE_TIPS); + } + } + } + else { + last_disp_state = SET_UI; + lv_clear_set(); + lv_draw_wifi(); + } + } + break; + #endif } } @@ -137,6 +174,9 @@ void lv_draw_set(void) { #endif lv_obj_t *buttonMachinePara; lv_obj_t *buttonEepromSet; + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_t *buttonWifi; + #endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) { disp_state_stack._disp_index++; @@ -159,79 +199,81 @@ void lv_draw_set(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - - /*Create an Image button*/ - //buttonWifi = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, NULL); - buttonAbout = lv_imgbtn_create(scr, NULL); - //buttonContinue = lv_imgbtn_create(scr, NULL); - buMotorOff = lv_imgbtn_create(scr, NULL); - #if HAS_LANG_SELECT_SCREEN - buttonLanguage = lv_imgbtn_create(scr, NULL); - #endif - buttonMachinePara = lv_imgbtn_create(scr, NULL); + // Create image buttons buttonEepromSet = lv_imgbtn_create(scr, NULL); + //buttonWifi = lv_imgbtn_create(scr, NULL); + buttonFan = lv_imgbtn_create(scr, NULL); + buttonAbout = lv_imgbtn_create(scr, NULL); + //buttonContinue = lv_imgbtn_create(scr, NULL); + buMotorOff = lv_imgbtn_create(scr, NULL); + buttonMachinePara = lv_imgbtn_create(scr, NULL); + #if HAS_LANG_SELECT_SCREEN + buttonLanguage = lv_imgbtn_create(scr, NULL); + #endif + #if ENABLED(USE_WIFI_FUNCTION) + buttonWifi = lv_imgbtn_create(scr, NULL); + #endif buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonEepromSet, event_handler, ID_S_EEPROM_SET, NULL, 0); + lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_REL, "F:/bmp_eeprom_settings.bin"); + lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_PR, "F:/bmp_eeprom_settings.bin"); + lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,"bmp_Wifi.bin",0); - //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_clear_protect(buttonWifi, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_S_FAN, "bmp_fan.bin", 0); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_S_FAN, NULL, 0); + lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, "F:/bmp_fan.bin"); + lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, "F:/bmp_fan.bin"); lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonAbout, event_handler, ID_S_ABOUT, "bmp_about.bin", 0); - lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonAbout, event_handler, ID_S_ABOUT, NULL, 0); + lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_REL, "F:/bmp_about.bin"); + lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_PR, "F:/bmp_about.bin"); lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_set_event_cb_mks(buttonContinue, event_handler,ID_S_CONTINUE,"bmp_Breakpoint.bin",0); - //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, NULL, 0); + #if HAS_SUICIDE - lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_Mamual.bin", 0); + lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); + lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); #else - lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_function1.bin", 0); + lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); + lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); #endif - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_REL, &tft_style_label_rel); - #if HAS_LANG_SELECT_SCREEN - lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, "bmp_language.bin", 0); - lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - lv_obj_set_event_cb_mks(buttonMachinePara, event_handler, ID_S_MACHINE_PARA, "bmp_machine_para.bin", 0); - lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonMachinePara, event_handler, ID_S_MACHINE_PARA, NULL, 0); + lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_REL, "F:/bmp_machine_para.bin"); + lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_PR, "F:/bmp_machine_para.bin"); lv_imgbtn_set_style(buttonMachinePara, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonMachinePara, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonEepromSet, event_handler, ID_S_EEPROM_SET, "bmp_eeprom_settings.bin", 0); - lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); + #if HAS_LANG_SELECT_SCREEN + lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, NULL, 0); + lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, "F:/bmp_language.bin"); + lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, "F:/bmp_language.bin"); + lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif + + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,NULL,0); + lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, "F:/bmp_wifi.bin"); + lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, "F:/bmp_wifi.bin"); + lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif + + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN,NULL , 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 /*lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); @@ -243,45 +285,56 @@ void lv_draw_set(void) { lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ //lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); + lv_obj_set_pos(buttonEepromSet, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonFan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonAbout, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); lv_obj_set_pos(buMotorOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - #if HAS_LANG_SELECT_SCREEN - lv_obj_set_pos(buttonLanguage, INTERVAL_V, titleHeight); - #endif + lv_obj_set_pos(buttonMachinePara, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonEepromSet, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + #if HAS_LANG_SELECT_SCREEN + lv_obj_set_pos(buttonLanguage, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + #endif + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_set_pos(buttonWifi,BTN_X_PIXEL*2+INTERVAL_V*3,BTN_Y_PIXEL+INTERVAL_H+titleHeight); + #endif lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - /*Create a label on the Image button*/ + /// Create labels on the buttons //lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonEepromSet, LV_LAYOUT_OFF); lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); lv_btn_set_layout(buttonAbout, LV_LAYOUT_OFF); //lv_btn_set_layout(buttonContinue, LV_LAYOUT_OFF); lv_btn_set_layout(buMotorOff, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonMachinePara, LV_LAYOUT_OFF); #if HAS_LANG_SELECT_SCREEN lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF); #endif - lv_btn_set_layout(buttonMachinePara, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonEepromSet, LV_LAYOUT_OFF); + #if ENABLED(USE_WIFI_FUNCTION) + lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); + #endif lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - //lv_obj_t * labelWifi= lv_label_create(buttonWifi, NULL); - lv_obj_t * labelFan = lv_label_create(buttonFan, NULL); - lv_obj_t * label_About = lv_label_create(buttonAbout, NULL); - //lv_obj_t * label_Continue = lv_label_create(buttonContinue, NULL); - lv_obj_t * label_MotorOff = lv_label_create(buMotorOff, NULL); + //lv_obj_t *labelWifi= lv_label_create(buttonWifi, NULL); + lv_obj_t *label_EepromSet = lv_label_create(buttonEepromSet, NULL); + lv_obj_t *labelFan = lv_label_create(buttonFan, NULL); + lv_obj_t *label_About = lv_label_create(buttonAbout, NULL); + //lv_obj_t *label_Continue = lv_label_create(buttonContinue, NULL); + lv_obj_t *label_MotorOff = lv_label_create(buMotorOff, NULL); + lv_obj_t *label_MachinePara = lv_label_create(buttonMachinePara, NULL); #if HAS_LANG_SELECT_SCREEN - lv_obj_t * label_Language = lv_label_create(buttonLanguage, NULL); + lv_obj_t *label_Language = lv_label_create(buttonLanguage, NULL); #endif - lv_obj_t * label_MachinePara = lv_label_create(buttonMachinePara, NULL); - lv_obj_t * label_EepromSet = lv_label_create(buttonEepromSet, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_t *label_Wifi = lv_label_create(buttonWifi, NULL); + #endif + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { - //lv_label_set_text(labelWifi, set_menu.wifi); - //lv_obj_align(labelWifi, buttonWifi, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_EepromSet, set_menu.eepromSet); + lv_obj_align(label_EepromSet, buttonEepromSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(labelFan, set_menu.fan); lv_obj_align(labelFan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -291,28 +344,46 @@ void lv_draw_set(void) { //lv_label_set_text(label_Continue, set_menu.breakpoint); //lv_obj_align(label_Continue, buttonContinue, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - #if HAS_SUICIDE - lv_label_set_text(label_MotorOff, set_menu.shutdown); - #else - lv_label_set_text(label_MotorOff, set_menu.motoroff); - #endif + lv_label_set_text(label_MotorOff, set_menu.TERN(HAS_SUICIDE, shutdown, motoroff)); lv_obj_align(label_MotorOff, buMotorOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_label_set_text(label_MachinePara, set_menu.machine_para); + lv_obj_align(label_MachinePara, buttonMachinePara, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #if HAS_LANG_SELECT_SCREEN lv_label_set_text(label_Language, set_menu.language); lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif - lv_label_set_text(label_MachinePara, set_menu.machine_para); - lv_obj_align(label_MachinePara, buttonMachinePara, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(label_EepromSet, set_menu.eepromSet); - lv_obj_align(label_EepromSet, buttonEepromSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #if ENABLED(USE_WIFI_FUNCTION) + lv_label_set_text(label_Wifi, set_menu.wifi); + lv_obj_align(label_Wifi, buttonWifi, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + #endif lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonEepromSet); + lv_group_add_obj(g, buttonFan); + lv_group_add_obj(g, buttonAbout); + lv_group_add_obj(g, buMotorOff); + lv_group_add_obj(g, buttonMachinePara); + lv_group_add_obj(g, buttonLanguage); + #if ENABLED(USE_WIFI_FUNCTION) + lv_group_add_obj(g, buttonWifi); + #endif + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_set() { lv_obj_del(scr); } +void lv_clear_set() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index 434c2f8579..baad23f9ae 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -29,6 +29,7 @@ #include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_STEP_RETURN 1 @@ -127,11 +128,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_step_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != STEPS_UI) { disp_state_stack._disp_index++; @@ -152,166 +153,133 @@ void lv_draw_step_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - // LV_IMG_DECLARE(bmp_para_arrow); - LV_IMG_DECLARE(bmp_para_bank); - if (uiCfg.para_ui_page != 1) { - buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonXText, event_handler); - lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); - labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.X_Steps); - buttonXValue = lv_imgbtn_create(scr, NULL); + buttonXValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_STEP_X, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_STEP_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); labelXValue = lv_label_create(buttonXValue, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonYText, event_handler); - lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); - labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Y_Steps); - buttonYValue = lv_imgbtn_create(scr, NULL); + buttonYValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_STEP_Y, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_STEP_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); labelYValue = lv_label_create(buttonYValue, NULL); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonZText, event_handler); - lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); - labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Steps); - buttonZValue = lv_imgbtn_create(scr, NULL); + buttonZValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_STEP_Z, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_STEP_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); labelZValue = lv_label_create(buttonZValue, NULL); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE0Text, event_handler); - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); - labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + labelE0Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE0Text, &tft_style_label_rel); + lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelE0Text, machine_menu.E0_Steps); - buttonE0Value = lv_imgbtn_create(scr, NULL); + buttonE0Value = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_STEP_E0, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); + lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_STEP_E0, NULL, 0); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); labelE0Value = lv_label_create(buttonE0Value, NULL); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_DOWN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonE0Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif } else { - buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE1Text, event_handler); - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); - labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + labelE1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE1Text, &tft_style_label_rel); + lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelE1Text, machine_menu.E1_Steps); - buttonE1Value = lv_imgbtn_create(scr, NULL); + buttonE1Value = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_STEP_E1, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); + lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_STEP_E1, NULL, 0); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); labelE1Value = lv_label_create(buttonE1Value, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_UP, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonE1Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif } lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); labelTurnPage = lv_label_create(buttonTurnPage, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_STEP_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - + buttonBack = lv_btn_create(scr, NULL); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_STEP_RETURN, NULL, 0); label_Back = lv_label_create(buttonBack, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif if (gCfgItems.multiple_language != 0) { if (uiCfg.para_ui_page != 1) { - lv_label_set_text(labelXText, machine_menu.X_Steps); - lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelYText, machine_menu.Y_Steps); - lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelZText, machine_menu.Z_Steps); - lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelE0Text, machine_menu.E0_Steps); - lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - lv_label_set_text(labelTurnPage, machine_menu.next); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); @@ -336,9 +304,6 @@ void lv_draw_step_settings(void) { lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); } else { - lv_label_set_text(labelE1Text, machine_menu.E1_Steps); - lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - lv_label_set_text(labelTurnPage, machine_menu.previous); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); @@ -353,6 +318,11 @@ void lv_draw_step_settings(void) { } } -void lv_clear_step_settings() { lv_obj_del(scr); } +void lv_clear_step_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index 24650ee930..10aa7badff 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -31,6 +31,7 @@ #include "../../../../module/stepper/indirection.h" #include "../../../../feature/tmc_util.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_TMC_CURRENT_RETURN 1 @@ -54,16 +55,20 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { draw_return_ui(); } break; - case ID_TMC_CURRENT_X: - if (event == LV_EVENT_CLICKED) { + #if AXIS_IS_TMC(X) + case ID_TMC_CURRENT_X: + if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - value = Xcurrent; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } - break; + } + else if (event == LV_EVENT_RELEASED) { + value = Xcurrent; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); + } + break; + #endif + + #if AXIS_IS_TMC(Y) case ID_TMC_CURRENT_Y: if (event == LV_EVENT_CLICKED) { @@ -74,6 +79,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_draw_number_key(); } break; + #endif + + #if AXIS_IS_TMC(Z) case ID_TMC_CURRENT_Z: if (event == LV_EVENT_CLICKED) { @@ -84,64 +92,68 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_draw_number_key(); } break; - case ID_TMC_CURRENT_E0: + #endif + + #if AXIS_IS_TMC(E0) + case ID_TMC_CURRENT_E0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E0current; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); + } + break; + #endif + + #if AXIS_IS_TMC(E1) + case ID_TMC_CURRENT_E1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E1current; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); + } + break; + #endif + case ID_TMC_CURRENT_UP: if (event == LV_EVENT_CLICKED) { } else if (event == LV_EVENT_RELEASED) { - value = E0current; + uiCfg.para_ui_page = 0; lv_clear_tmc_current_settings(); - lv_draw_number_key(); + lv_draw_tmc_current_settings(); } break; - #if AXIS_IS_TMC(E1) - case ID_TMC_CURRENT_E1: - if (event == LV_EVENT_CLICKED) { + case ID_TMC_CURRENT_DOWN: + if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - value = E1current; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } - break; - - case ID_TMC_CURRENT_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_current_settings(); - lv_draw_tmc_current_settings(); - } - break; - case ID_TMC_CURRENT_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_tmc_current_settings(); - lv_draw_tmc_current_settings(); - } - break; - #endif + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_tmc_current_settings(); + lv_draw_tmc_current_settings(); + } + break; } } void lv_draw_tmc_current_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - #if AXIS_IS_TMC(E1) + //#if AXIS_IS_TMC(E1) lv_obj_t *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; - #endif + lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + //#endif float milliamps; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_CURRENT_UI) { @@ -163,217 +175,201 @@ void lv_draw_tmc_current_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - // LV_IMG_DECLARE(bmp_para_arrow); - LV_IMG_DECLARE(bmp_para_bank); - if (uiCfg.para_ui_page != 1) { - buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonXText, event_handler); - lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); - labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.X_Current); - buttonXValue = lv_imgbtn_create(scr, NULL); + buttonXValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_TMC_CURRENT_X, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_TMC_CURRENT_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); labelXValue = lv_label_create(buttonXValue, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonYText, event_handler); - lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); - labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Y_Current); - buttonYValue = lv_imgbtn_create(scr, NULL); + buttonYValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_TMC_CURRENT_Y, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_TMC_CURRENT_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); labelYValue = lv_label_create(buttonYValue, NULL); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonZText, event_handler); - lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); - labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Current); - buttonZValue = lv_imgbtn_create(scr, NULL); + buttonZValue = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_TMC_CURRENT_Z, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_TMC_CURRENT_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); labelZValue = lv_label_create(buttonZValue, NULL); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE0Text, event_handler); - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); - labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + labelE0Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE0Text, &tft_style_label_rel); + lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelE0Text, machine_menu.E0_Current); - buttonE0Value = lv_imgbtn_create(scr, NULL); + buttonE0Value = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_TMC_CURRENT_E0, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); + lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_TMC_CURRENT_E0, NULL, 0); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); labelE0Value = lv_label_create(buttonE0Value, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonE0Value); + } + #endif + line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - #if AXIS_IS_TMC(E1) - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_DOWN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif + //#if AXIS_IS_TMC(E1) + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); + #endif + //#endif } else { - #if AXIS_IS_TMC(E1) - buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE1Text, event_handler); - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); - labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + //#if AXIS_IS_TMC(E1) + labelE1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE1Text, &tft_style_label_rel); + lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelE1Text, machine_menu.E1_Current); - buttonE1Value = lv_imgbtn_create(scr, NULL); + buttonE1Value = lv_btn_create(scr, NULL); lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_TMC_CURRENT_E1, "bmp_value_blank.bin", 0); - lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_REL, &bmp_para_bank); - lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_PR, &bmp_para_bank); - lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_REL, &style_para_value_rel); - lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); + lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_TMC_CURRENT_E1, NULL, 0); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); labelE1Value = lv_label_create(buttonE1Value, NULL); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_UP, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonE1Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + //#endif } - #if AXIS_IS_TMC(E1) + //#if AXIS_IS_TMC(E1) lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); labelTurnPage = lv_label_create(buttonTurnPage, NULL); + //#endif + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_CURRENT_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_CURRENT_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { if (uiCfg.para_ui_page != 1) { - lv_label_set_text(labelXText, machine_menu.X_Current); - lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelYText, machine_menu.Y_Current); - lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelZText, machine_menu.Z_Current); - lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelE0Text, machine_menu.E0_Current); - lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if AXIS_IS_TMC(E1) + //#if AXIS_IS_TMC(E1) lv_label_set_text(labelTurnPage, machine_menu.next); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - #endif + //#endif #if AXIS_IS_TMC(X) milliamps = stepperX.getMilliamps(); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + #else + milliamps = -1; #endif + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + #if AXIS_IS_TMC(Y) milliamps = stepperY.getMilliamps(); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + #else + milliamps = -1; #endif + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + #if AXIS_IS_TMC(Z) milliamps = stepperZ.getMilliamps(); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + #else + milliamps = -1; #endif + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + #if AXIS_IS_TMC(E0) milliamps = stepperE0.getMilliamps(); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); + #else + milliamps = -1; #endif + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelE0Value, public_buf_l); + lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); } else { - #if AXIS_IS_TMC(E1) - lv_label_set_text(labelE1Text, machine_menu.E1_Current); - lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - + //#if AXIS_IS_TMC(E1) lv_label_set_text(labelTurnPage, machine_menu.previous); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - milliamps = stepperE1.getMilliamps(); + #if AXIS_IS_TMC(E1) + milliamps = stepperE1.getMilliamps(); + #else + milliamps = -1; + #endif ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); lv_label_set_text(labelE1Value, public_buf_l); lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - #endif + //#endif } lv_label_set_text(label_Back, common_menu.text_back); @@ -381,6 +377,11 @@ void lv_draw_tmc_current_settings(void) { } } -void lv_clear_tmc_current_settings() { lv_obj_del(scr); } +void lv_clear_tmc_current_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI && HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index b0d40fde28..3e014a781c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -33,6 +33,7 @@ #include "../../../../gcode/gcode.h" #include "../../../../module/planner.h" +extern lv_group_t * g; static lv_obj_t * scr; #define ID_TMC_MODE_RETURN 1 @@ -47,9 +48,9 @@ static lv_obj_t * scr; static lv_obj_t *labelXState = NULL, *labelYState = NULL, *labelZState = NULL, *labelE0State = NULL; static lv_obj_t *buttonXState = NULL, *buttonYState = NULL, *buttonZState = NULL, *buttonE0State = NULL; -#if AXIS_HAS_STEALTHCHOP(E1) +//#if AXIS_HAS_STEALTHCHOP(E1) static lv_obj_t *labelE1State = NULL, *buttonE1State = NULL; -#endif +//#endif static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { @@ -63,136 +64,158 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { draw_return_ui(); } break; - case ID_TMC_MODE_X: + + #if AXIS_HAS_STEALTHCHOP(X) + case ID_TMC_MODE_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperX.stored.stealthChop_enabled) { + stepperX.stored.stealthChop_enabled = false; + stepperX.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + lv_label_set_text(labelXState, machine_menu.disable); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + // gcode.process_subcommands_now_P(PSTR("M500")); + } + else { + stepperX.stored.stealthChop_enabled = true; + stepperX.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelXState, machine_menu.enable); + // gcode.process_subcommands_now_P(PSTR("M500")); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(X) + + #if AXIS_HAS_STEALTHCHOP(Y) + case ID_TMC_MODE_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperY.stored.stealthChop_enabled) { + stepperY.stored.stealthChop_enabled = false; + stepperY.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + lv_label_set_text(labelYState, machine_menu.disable); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + } + else { + stepperY.stored.stealthChop_enabled = true; + stepperY.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelYState, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(Y) + + #if AXIS_HAS_STEALTHCHOP(Z) + case ID_TMC_MODE_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperZ.stored.stealthChop_enabled) { + stepperZ.stored.stealthChop_enabled = false; + stepperZ.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + lv_label_set_text(labelZState, machine_menu.disable); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + } + else { + stepperZ.stored.stealthChop_enabled = true; + stepperZ.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelZState, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(Z) + + #if AXIS_HAS_STEALTHCHOP(E0) + case ID_TMC_MODE_E0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperE0.stored.stealthChop_enabled) { + stepperE0.stored.stealthChop_enabled = false; + stepperE0.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + lv_label_set_text(labelE0State, machine_menu.disable); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + } + else { + stepperE0.stored.stealthChop_enabled = true; + stepperE0.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelE0State, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(E0) + + #if AXIS_HAS_STEALTHCHOP(E1) + case ID_TMC_MODE_E1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperE1.stored.stealthChop_enabled) { + stepperE1.stored.stealthChop_enabled = false; + stepperE1.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + lv_label_set_text(labelE1State, machine_menu.disable); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + } + else { + stepperE1.stored.stealthChop_enabled = true; + stepperE1.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelE1State, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(E1) + case ID_TMC_MODE_UP: if (event == LV_EVENT_CLICKED) { } else if (event == LV_EVENT_RELEASED) { - if (stepperX.stored.stealthChop_enabled == true) { - stepperX.stored.stealthChop_enabled = false; - stepperX.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_disable.bin", 0); - lv_label_set_text(labelXState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - // gcode.process_subcommands_now_P(PSTR("M500")); - } - else { - stepperX.stored.stealthChop_enabled = true; - stepperX.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_enable.bin", 0); - lv_label_set_text(labelXState, machine_menu.enable); - // gcode.process_subcommands_now_P(PSTR("M500")); - } - gcode.process_subcommands_now_P(PSTR("M500")); + uiCfg.para_ui_page = 0; + lv_clear_tmc_step_mode_settings(); + lv_draw_tmc_step_mode_settings(); } break; - case ID_TMC_MODE_Y: + case ID_TMC_MODE_DOWN: if (event == LV_EVENT_CLICKED) { } else if (event == LV_EVENT_RELEASED) { - if (stepperY.stored.stealthChop_enabled == true) { - stepperY.stored.stealthChop_enabled = false; - stepperY.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_disable.bin", 0); - lv_label_set_text(labelYState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - else { - stepperY.stored.stealthChop_enabled = true; - stepperY.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_enable.bin", 0); - lv_label_set_text(labelYState, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); + uiCfg.para_ui_page = 1; + lv_clear_tmc_step_mode_settings(); + lv_draw_tmc_step_mode_settings(); } break; - case ID_TMC_MODE_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperZ.stored.stealthChop_enabled == true) { - stepperZ.stored.stealthChop_enabled = false; - stepperZ.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_disable.bin", 0); - lv_label_set_text(labelZState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - else { - stepperZ.stored.stealthChop_enabled = true; - stepperZ.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_enable.bin", 0); - lv_label_set_text(labelZState, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); - } - break; - case ID_TMC_MODE_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperE0.stored.stealthChop_enabled == true) { - stepperE0.stored.stealthChop_enabled = false; - stepperE0.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_disable.bin", 0); - lv_label_set_text(labelE0State, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - else { - stepperE0.stored.stealthChop_enabled = true; - stepperE0.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_enable.bin", 0); - lv_label_set_text(labelE0State, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); - } - break; - #if AXIS_HAS_STEALTHCHOP(E1) - case ID_TMC_MODE_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperE1.stored.stealthChop_enabled == true) { - stepperE1.stored.stealthChop_enabled = false; - stepperE1.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_disable.bin", 0); - lv_label_set_text(labelE1State, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - else { - stepperE1.stored.stealthChop_enabled = true; - stepperE1.refresh_stepping_mode(); - lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_enable.bin", 0); - lv_label_set_text(labelE1State, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); - } - break; - - case ID_TMC_MODE_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_step_mode_settings(); - lv_draw_tmc_step_mode_settings(); - } - break; - case ID_TMC_MODE_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_tmc_step_mode_settings(); - lv_draw_tmc_step_mode_settings(); - } - break; - #endif // if AXIS_HAS_STEALTHCHOP(E1) } } @@ -204,10 +227,10 @@ void lv_draw_tmc_step_mode_settings(void) { lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - #if AXIS_HAS_STEALTHCHOP(E1) + //#if AXIS_HAS_STEALTHCHOP(E1) lv_obj_t *buttonTurnPage = NULL, *labelTurnPage = NULL; lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL; - #endif + //#endif labelXState = NULL; @@ -218,10 +241,10 @@ void lv_draw_tmc_step_mode_settings(void) { buttonZState = NULL; labelE0State = NULL; buttonE0State = NULL; - #if AXIS_HAS_STEALTHCHOP(E1) + //#if AXIS_HAS_STEALTHCHOP(E1) labelE1State = NULL; buttonE1State = NULL; - #endif + //#endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_MODE_UI) { disp_state_stack._disp_index++; @@ -242,10 +265,6 @@ void lv_draw_tmc_step_mode_settings(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_para_back); - LV_IMG_DECLARE(bmp_para_state); - // LV_IMG_DECLARE(bmp_para_bank); - if (uiCfg.para_ui_page != 1) { buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ @@ -258,16 +277,28 @@ void lv_draw_tmc_step_mode_settings(void) { buttonXState = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonXState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - if (stepperX.get_stealthChop_status()) - lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_enable.bin", 0); - else - lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_disable.bin", 0); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, &bmp_para_state); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, &bmp_para_state); + #if AXIS_HAS_STEALTHCHOP(X) + if (stepperX.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, NULL, 0); + lv_imgbtn_set_style(buttonXState, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonXState, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonXState, LV_LAYOUT_OFF); labelXState = lv_label_create(buttonXState, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXState); + #endif line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); @@ -283,16 +314,28 @@ void lv_draw_tmc_step_mode_settings(void) { buttonYState = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonYState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_STATE_V); - if (stepperY.get_stealthChop_status()) - lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_enable.bin", 0); - else - lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_disable.bin", 0); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, &bmp_para_state); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, &bmp_para_state); + #if AXIS_HAS_STEALTHCHOP(Y) + if (stepperY.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, NULL, 0); + lv_imgbtn_set_style(buttonYState, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonYState, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonYState, LV_LAYOUT_OFF); labelYState = lv_label_create(buttonYState, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYState); + #endif line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); @@ -308,16 +351,27 @@ void lv_draw_tmc_step_mode_settings(void) { buttonZState = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonZState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_STATE_V); - if (stepperZ.get_stealthChop_status()) - lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_enable.bin", 0); - else - lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_disable.bin", 0); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, &bmp_para_state); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, &bmp_para_state); + #if AXIS_HAS_STEALTHCHOP(Z) + if (stepperZ.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, NULL, 0); lv_imgbtn_set_style(buttonZState, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonZState, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonZState, LV_LAYOUT_OFF); labelZState = lv_label_create(buttonZState, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZState); + #endif line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); @@ -333,31 +387,48 @@ void lv_draw_tmc_step_mode_settings(void) { buttonE0State = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonE0State, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V); - if (stepperE0.get_stealthChop_status()) - lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_enable.bin", 0); - else - lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_disable.bin", 0); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, &bmp_para_state); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, &bmp_para_state); + #if AXIS_HAS_STEALTHCHOP(E0) + if (stepperE0.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + + lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, NULL, 0); + lv_imgbtn_set_style(buttonE0State, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonE0State, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonE0State, LV_LAYOUT_OFF); labelE0State = lv_label_create(buttonE0State, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE0State); + #endif + line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - #if AXIS_HAS_STEALTHCHOP(E1) + //#if AXIS_HAS_STEALTHCHOP(E1) buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_DOWN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_DOWN, NULL, 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); + #endif + //#endif } else { - #if AXIS_HAS_STEALTHCHOP(E1) + //#if AXIS_HAS_STEALTHCHOP(E1) buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ @@ -369,40 +440,54 @@ void lv_draw_tmc_step_mode_settings(void) { buttonE1State = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonE1State, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - if (stepperE1.get_stealthChop_status()) - lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_enable.bin", 0); - else - lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_disable.bin", 0); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, &bmp_para_state); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, &bmp_para_state); + #if AXIS_HAS_STEALTHCHOP(E1) + if (stepperE1.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, NULL, 0); lv_imgbtn_set_style(buttonE1State, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonE1State, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonE1State, LV_LAYOUT_OFF); labelE1State = lv_label_create(buttonE1State, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE1State); + #endif line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_UP, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_UP, NULL, 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif + //#endif } - #if AXIS_HAS_STEALTHCHOP(E1) + //#if AXIS_HAS_STEALTHCHOP(E1) lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); labelTurnPage = lv_label_create(buttonTurnPage, NULL); - #endif + //#endif buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_MODE_RETURN, "bmp_back70x40.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_MODE_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); @@ -422,50 +507,68 @@ void lv_draw_tmc_step_mode_settings(void) { lv_label_set_text(labelE0Text, machine_menu.E0_StepMode); lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + #if AXIS_HAS_STEALTHCHOP(X) if (stepperX.get_stealthChop_status()) lv_label_set_text(labelXState, machine_menu.enable); else lv_label_set_text(labelXState, machine_menu.disable); + #else + lv_label_set_text(labelXState, machine_menu.disable); + #endif lv_obj_align(labelXState, buttonXState, LV_ALIGN_CENTER, 0, 0); + #if AXIS_HAS_STEALTHCHOP(Y) if (stepperY.get_stealthChop_status()) lv_label_set_text(labelYState, machine_menu.enable); else lv_label_set_text(labelYState, machine_menu.disable); + #else + lv_label_set_text(labelYState, machine_menu.disable); + #endif lv_obj_align(labelYState, buttonYState, LV_ALIGN_CENTER, 0, 0); + #if AXIS_HAS_STEALTHCHOP(Z) if (stepperZ.get_stealthChop_status()) lv_label_set_text(labelZState, machine_menu.enable); else lv_label_set_text(labelZState, machine_menu.disable); + #else + lv_label_set_text(labelZState, machine_menu.disable); + #endif lv_obj_align(labelZState, buttonZState, LV_ALIGN_CENTER, 0, 0); + #if AXIS_HAS_STEALTHCHOP(E0) if (stepperE0.get_stealthChop_status()) lv_label_set_text(labelE0State, machine_menu.enable); else lv_label_set_text(labelE0State, machine_menu.disable); + #else + lv_label_set_text(labelE0State, machine_menu.disable); + #endif lv_obj_align(labelE0State, buttonE0State, LV_ALIGN_CENTER, 0, 0); - #if AXIS_HAS_STEALTHCHOP(E1) + //#if AXIS_HAS_STEALTHCHOP(E1) lv_label_set_text(labelTurnPage, machine_menu.next); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - #endif + //#endif } else { - #if AXIS_HAS_STEALTHCHOP(E1) + //#if AXIS_HAS_STEALTHCHOP(E1) lv_label_set_text(labelE1Text, machine_menu.E1_StepMode); lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - + #if AXIS_HAS_STEALTHCHOP(E1) if (stepperE1.get_stealthChop_status()) lv_label_set_text(labelE1State, machine_menu.enable); else lv_label_set_text(labelE1State, machine_menu.disable); + #else + lv_label_set_text(labelE1State, machine_menu.disable); + #endif lv_obj_align(labelE1State, buttonE1State, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(labelTurnPage, machine_menu.previous); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - #endif + //#endif } lv_label_set_text(label_Back, common_menu.text_back); @@ -473,6 +576,11 @@ void lv_draw_tmc_step_mode_settings(void) { } } -void lv_clear_tmc_step_mode_settings() { lv_obj_del(scr); } +void lv_clear_tmc_step_mode_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI && HAS_STEALTHCHOP diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index a2d0937e47..3681b1b2d6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -32,8 +32,9 @@ #include "../../../../MarlinCore.h" #include "../../../../gcode/queue.h" +#include "../../../../module/temperature.h" -// static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; +extern lv_group_t * g; static lv_obj_t * scr; #define ID_T_PRE_HEAT 1 @@ -45,6 +46,10 @@ static lv_obj_t * scr; #define ID_T_MORE 7 #define ID_T_RETURN 8 +#if ENABLED(MKS_TEST) + extern uint8_t curent_disp_ui; +#endif + static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_T_PRE_HEAT: @@ -89,8 +94,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - queue.enqueue_one_P(PSTR("G28")); - queue.enqueue_one_P(PSTR("G29")); + //queue.enqueue_one_P(PSTR("G28")); + //queue.enqueue_one_P(PSTR("G29")); + get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); + public_buf_m[sizeof(public_buf_m)-1] = 0; + queue.inject_P(PSTR(public_buf_m)); #else uiCfg.leveling_first_time = 1; lv_clear_tool(); @@ -98,7 +106,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { #endif } break; - case ID_T_FILAMENT: break; + case ID_T_FILAMENT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; + lv_clear_tool(); + lv_draw_filament_change(); + } + break; case ID_T_MORE: break; case ID_T_RETURN: if (event == LV_EVENT_CLICKED) { @@ -106,7 +123,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { TERN_(MKS_TEST, curent_disp_ui = 1); - lv_obj_del(scr); + lv_clear_tool(); lv_draw_ready_print(); } break; @@ -115,6 +132,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_tool(void) { lv_obj_t *buttonPreHeat, *buttonExtrusion, *buttonMove, *buttonHome, *buttonLevel; + lv_obj_t *buttonFilament; lv_obj_t *buttonBack; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TOOL_UI) { @@ -138,75 +156,64 @@ void lv_draw_tool(void) { lv_refr_now(lv_refr_get_disp_refreshing()); - LV_IMG_DECLARE(bmp_pic); - // Create image buttons buttonPreHeat = lv_imgbtn_create(scr, NULL); buttonExtrusion = lv_imgbtn_create(scr, NULL); buttonMove = lv_imgbtn_create(scr, NULL); buttonHome = lv_imgbtn_create(scr, NULL); buttonLevel = lv_imgbtn_create(scr, NULL); - // buttonFilament = lv_imgbtn_create(scr, NULL); - // buttonMore = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); + buttonFilament = lv_imgbtn_create(scr, NULL); + //buttonMore = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_T_PRE_HEAT, "bmp_preHeat.bin", 0); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, &bmp_pic); + lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_T_PRE_HEAT, NULL, 0); + lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, "F:/bmp_preHeat.bin"); + lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, "F:/bmp_preHeat.bin"); lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonPreHeat, LV_PROTECT_FOLLOW); - #if 1 - lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_T_EXTRUCT, "bmp_extruct.bin", 0); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_T_EXTRUCT, NULL, 0); + lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, "F:/bmp_extruct.bin"); + lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, "F:/bmp_extruct.bin"); + lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_T_MOV, "bmp_mov.bin", 0); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_T_MOV, NULL, 0); + lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, "F:/bmp_mov.bin"); + lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, "F:/bmp_mov.bin"); + lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonHome, event_handler, ID_T_HOME, "bmp_zero.bin", 0); - lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_event_cb_mks(buttonHome, event_handler, ID_T_HOME, NULL, 0); + lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_REL, "F:/bmp_zero.bin"); + lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_PR, "F:/bmp_zero.bin"); + lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_T_LEVELING, "bmp_leveling.bin", 0); - lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_T_LEVELING, NULL, 0); + lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_REL, "F:/bmp_leveling.bin"); + lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_PR, "F:/bmp_leveling.bin"); + lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,"bmp_Filamentchange.bin",0); - //lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,NULL,0); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, "F:/bmp_filamentchange.bin"); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, "F:/bmp_filamentchange.bin"); + lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_set_event_cb_mks(buttonMore, event_handler,ID_T_MORE,"bmp_More.bin",0); - //lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_T_RETURN, "bmp_return.bin", 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif // if 1 + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_T_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonExtrusion, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonMove, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); lv_obj_set_pos(buttonHome, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); lv_obj_set_pos(buttonLevel, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - //lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); //lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); @@ -216,18 +223,18 @@ void lv_draw_tool(void) { lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); lv_btn_set_layout(buttonHome, LV_LAYOUT_OFF); lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); //lv_btn_set_layout(buttonMore, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * labelPreHeat = lv_label_create(buttonPreHeat, NULL); - lv_obj_t * labelExtrusion = lv_label_create(buttonExtrusion, NULL); - lv_obj_t * label_Move = lv_label_create(buttonMove, NULL); - lv_obj_t * label_Home = lv_label_create(buttonHome, NULL); - lv_obj_t * label_Level = lv_label_create(buttonLevel, NULL); - //lv_obj_t * label_Filament = lv_label_create(buttonFilament, NULL); - //lv_obj_t * label_More = lv_label_create(buttonMore, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelPreHeat = lv_label_create(buttonPreHeat, NULL); + lv_obj_t *labelExtrusion = lv_label_create(buttonExtrusion, NULL); + lv_obj_t *label_Move = lv_label_create(buttonMove, NULL); + lv_obj_t *label_Home = lv_label_create(buttonHome, NULL); + lv_obj_t *label_Level = lv_label_create(buttonLevel, NULL); + lv_obj_t *label_Filament = lv_label_create(buttonFilament, NULL); + //lv_obj_t *label_More = lv_label_create(buttonMore, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelPreHeat, tool_menu.preheat); @@ -242,17 +249,11 @@ void lv_draw_tool(void) { lv_label_set_text(label_Home, tool_menu.home); lv_obj_align(label_Home, buttonHome, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - /* - if (gCfgItems.leveling_mode != 2) { - lv_label_set_text(label_Level, gCfgItems.leveling_mode == 1 ? tool_menu.autoleveling : tool_menu.leveling); - lv_obj_align(label_Level, buttonLevel, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - */ lv_label_set_text(label_Level, tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling)); lv_obj_align(label_Level, buttonLevel, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - //lv_label_set_text(label_Filament, tool_menu.filament); - //lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_label_set_text(label_Filament, tool_menu.filament); + lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); //lv_label_set_text(label_More, tool_menu.more); //lv_obj_align(label_More, buttonMore, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -260,8 +261,24 @@ void lv_draw_tool(void) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPreHeat); + lv_group_add_obj(g, buttonExtrusion); + lv_group_add_obj(g, buttonMove); + lv_group_add_obj(g, buttonHome); + lv_group_add_obj(g, buttonLevel); + lv_group_add_obj(g, buttonFilament); + lv_group_add_obj(g, buttonBack); + } + #endif } -void lv_clear_tool() { lv_obj_del(scr); } +void lv_clear_tool() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 6bdea3fd21..922f6a2dc7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -55,7 +55,8 @@ DISP_STATE_STACK disp_state_stack; DISP_STATE disp_state = MAIN_UI; DISP_STATE last_disp_state; PRINT_TIME print_time; -value_state value; +num_key_value_state value; +keyboard_value_state keyboard_value; uint32_t To_pre_view; uint8_t gcode_preview_over; @@ -73,6 +74,14 @@ extern uint8_t bmp_public_buf[17 * 1024]; extern void LCD_IO_WriteData(uint16_t RegValue); +static const char custom_gcode_command[][100] = { + "G28\nG29\nM500", + "G28", + "G28", + "G28", + "G28" +}; + lv_point_t line_points[4][2] = { {{PARA_UI_POS_X, PARA_UI_POS_Y + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y + PARA_UI_SIZE_Y}}, {{PARA_UI_POS_X, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}}, @@ -108,22 +117,58 @@ void gCfgItems_init() { #elif LCD_LANGUAGE == pt gCfgItems.language = LANG_PORTUGUESE; #endif - gCfgItems.leveling_mode = 0; - gCfgItems.from_flash_pic = 0; - gCfgItems.curFilesize = 0; - gCfgItems.finish_power_off = 0; - gCfgItems.pause_reprint = 0; - gCfgItems.pausePosX = -1; - gCfgItems.pausePosY = -1; - gCfgItems.pausePosZ = 5; + gCfgItems.leveling_mode = 0; + gCfgItems.from_flash_pic = 0; + gCfgItems.curFilesize = 0; + gCfgItems.finish_power_off = 0; + gCfgItems.pause_reprint = 0; + gCfgItems.pausePosX = -1; + gCfgItems.pausePosY = -1; + gCfgItems.pausePosZ = 5; + gCfgItems.levelingPos[0][0] = X_MIN_POS + 30; + gCfgItems.levelingPos[0][1] = Y_MIN_POS + 30; + gCfgItems.levelingPos[1][0] = X_MAX_POS - 30; + gCfgItems.levelingPos[1][1] = Y_MIN_POS + 30; + gCfgItems.levelingPos[2][0] = X_MAX_POS - 30; + gCfgItems.levelingPos[2][1] = Y_MAX_POS - 30; + gCfgItems.levelingPos[3][0] = X_MIN_POS + 30; + gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30; + gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2; + gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2; + gCfgItems.cloud_enable = true; + #if ENABLED(USE_WIFI_FUNCTION) + gCfgItems.wifi_mode_sel = STA_MODEL; + gCfgItems.fileSysType = FILE_SYS_SD; + gCfgItems.wifi_type = ESP_WIFI; + #endif + gCfgItems.filamentchange_load_length = 200; + gCfgItems.filamentchange_load_speed = 1000; + gCfgItems.filamentchange_unload_length = 200; + gCfgItems.filamentchange_unload_speed = 1000; + gCfgItems.filament_limit_temper = 200; + + gCfgItems.encoder_enable = true; + W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems.spi_flash_flag, VAR_INF_ADDR, sizeof(gCfgItems.spi_flash_flag)); - if (gCfgItems.spi_flash_flag == GCFG_FLAG_VALUE) { + if (gCfgItems.spi_flash_flag == FLASH_INF_VALID_FLAG) { W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); } else { - gCfgItems.spi_flash_flag = GCFG_FLAG_VALUE; + gCfgItems.spi_flash_flag = FLASH_INF_VALID_FLAG; W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); + //init gcode command + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[0], AUTO_LEVELING_COMMAND_ADDR, 100); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[1], OTHERS_COMMAND_ADDR_1, 100); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[2], OTHERS_COMMAND_ADDR_2, 100); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[3], OTHERS_COMMAND_ADDR_3, 100); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[4], OTHERS_COMMAND_ADDR_4, 100); + } + + const byte rot = TERN0(GRAPHICAL_TFT_ROTATE_180, 0xEE); + if (gCfgItems.disp_rotation_180 != rot) { + gCfgItems.disp_rotation_180 = rot; + update_spi_flash(); } uiCfg.F[0] = 'N'; @@ -134,11 +179,6 @@ void gCfgItems_init() { W25QXX.SPI_FLASH_BufferWrite(uiCfg.F,REFLSHE_FLGA_ADD,4); } -void gCfg_to_spiFlah() { - W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); -} - void ui_cfg_init() { uiCfg.curTempType = 0; uiCfg.curSprayerChoose = 0; @@ -150,12 +190,81 @@ void ui_cfg_init() { uiCfg.move_dist = 1; uiCfg.moveSpeed = 3000; uiCfg.stepPrintSpeed = 10; + uiCfg.command_send = 0; + uiCfg.dialogType = 0; + uiCfg.filament_heat_completed_load = 0; + uiCfg.filament_rate = 0; + uiCfg.filament_loading_completed = 0; + uiCfg.filament_unloading_completed = 0; + uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_time_cnt = 0; + uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_time_cnt = 0; + + #if ENABLED(USE_WIFI_FUNCTION) + memset(&wifiPara, 0, sizeof(wifiPara)); + memset(&ipPara, 0, sizeof(ipPara)); + strcpy(wifiPara.ap_name, WIFI_AP_NAME); + strcpy(wifiPara.keyCode, WIFI_KEY_CODE); + //client + strcpy(ipPara.ip_addr, IP_ADDR); + strcpy(ipPara.mask, IP_MASK); + strcpy(ipPara.gate, IP_GATE); + strcpy(ipPara.dns, IP_DNS); + + ipPara.dhcp_flag = IP_DHCP_FLAG; + + //AP + strcpy(ipPara.dhcpd_ip, AP_IP_ADDR); + strcpy(ipPara.dhcpd_mask, AP_IP_MASK); + strcpy(ipPara.dhcpd_gate, AP_IP_GATE); + strcpy(ipPara.dhcpd_dns, AP_IP_DNS); + strcpy(ipPara.start_ip_addr, IP_START_IP); + strcpy(ipPara.end_ip_addr, IP_END_IP); + + ipPara.dhcpd_flag = AP_IP_DHCP_FLAG; + + strcpy((char*)uiCfg.cloud_hostUrl, "baizhongyun.cn"); + uiCfg.cloud_port = 10086; + #endif + + uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length * 60.0 / gCfgItems.filamentchange_load_speed) + 0.5); + uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0 / gCfgItems.filamentchange_unload_speed) + 0.5); } void update_spi_flash() { + uint8_t command_buf[512]; + W25QXX.init(SPI_QUARTER_SPEED); + //read back the gcode command befor erase spi flash + W25QXX.SPI_FLASH_BufferRead((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); +} + +void update_gcode_command(int addr,uint8_t *s) { + uint8_t command_buf[512]; + + W25QXX.init(SPI_QUARTER_SPEED); + //read back the gcode command befor erase spi flash + W25QXX.SPI_FLASH_BufferRead((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); + W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); + switch (addr) { + case AUTO_LEVELING_COMMAND_ADDR: memcpy(&command_buf[0*100], s, 100); break; + case OTHERS_COMMAND_ADDR_1: memcpy(&command_buf[1*100], s, 100); break; + case OTHERS_COMMAND_ADDR_2: memcpy(&command_buf[2*100], s, 100); break; + case OTHERS_COMMAND_ADDR_3: memcpy(&command_buf[3*100], s, 100); break; + case OTHERS_COMMAND_ADDR_4: memcpy(&command_buf[4*100], s, 100); break; + default: break; + } + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); +} + +void get_gcode_command(int addr,uint8_t *d) { + W25QXX.init(SPI_QUARTER_SPEED); + W25QXX.SPI_FLASH_BufferRead((uint8_t *)d, addr, 100); } lv_style_t tft_style_scr; @@ -169,6 +278,13 @@ lv_style_t style_num_key_pre; lv_style_t style_num_key_rel; lv_style_t style_num_text; +lv_style_t style_sel_text; + +lv_style_t style_para_value; +lv_style_t style_para_back; + +lv_style_t lv_bar_style_indic; + void tft_style_init() { lv_style_copy(&tft_style_scr, &lv_style_scr); tft_style_scr.body.main_color = LV_COLOR_BACKGROUND; @@ -197,12 +313,13 @@ void tft_style_init() { tft_style_label_rel.text.letter_space = 0; tft_style_label_pre.text.line_space = -5; tft_style_label_rel.text.line_space = -5; + lv_style_copy(&style_para_value_pre, &lv_style_scr); lv_style_copy(&style_para_value_rel, &lv_style_scr); style_para_value_pre.body.main_color = LV_COLOR_BACKGROUND; style_para_value_pre.body.grad_color = LV_COLOR_BACKGROUND; - style_para_value_pre.text.color = LV_COLOR_BLACK; - style_para_value_pre.text.sel_color = LV_COLOR_BLACK; + style_para_value_pre.text.color = LV_COLOR_TEXT; + style_para_value_pre.text.sel_color = LV_COLOR_TEXT; style_para_value_rel.body.main_color = LV_COLOR_BACKGROUND; style_para_value_rel.body.grad_color = LV_COLOR_BACKGROUND; style_para_value_rel.text.color = LV_COLOR_BLACK; @@ -215,6 +332,7 @@ void tft_style_init() { style_para_value_rel.text.letter_space = 0; style_para_value_pre.text.line_space = -5; style_para_value_rel.text.line_space = -5; + lv_style_copy(&style_num_key_pre, &lv_style_scr); lv_style_copy(&style_num_key_rel, &lv_style_scr); style_num_key_pre.body.main_color = LV_COLOR_KEY_BACKGROUND; @@ -250,10 +368,48 @@ void tft_style_init() { style_num_text.text.letter_space = 0; style_num_text.text.line_space = -5; + lv_style_copy(&style_sel_text, &lv_style_scr); + style_sel_text.body.main_color = LV_COLOR_BACKGROUND; + style_sel_text.body.grad_color = LV_COLOR_BACKGROUND; + style_sel_text.text.color = LV_COLOR_YELLOW; + style_sel_text.text.sel_color = LV_COLOR_YELLOW; + style_sel_text.text.font = &gb2312_puhui32; + style_sel_text.line.width = 0; + style_sel_text.text.letter_space = 0; + style_sel_text.text.line_space = -5; lv_style_copy(&style_line, &lv_style_plain); style_line.line.color = LV_COLOR_MAKE(0x49, 0x54, 0xff); style_line.line.width = 1; style_line.line.rounded = 1; + + lv_style_copy(&style_para_value, &lv_style_plain); + style_para_value.body.border.color = LV_COLOR_BACKGROUND; + style_para_value.body.border.width = 1; + style_para_value.body.main_color = LV_COLOR_WHITE; + style_para_value.body.grad_color = LV_COLOR_WHITE; + style_para_value.body.shadow.width = 0; + style_para_value.body.radius = 3; + style_para_value.text.color = LV_COLOR_BLACK; + style_para_value.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); + + lv_style_copy(&style_para_back, &lv_style_plain); + style_para_back.body.border.color = LV_COLOR_BACKGROUND; + style_para_back.body.border.width = 1; + style_para_back.body.main_color = TFT_LV_PARA_BACK_BODY_COLOR; + style_para_back.body.grad_color = TFT_LV_PARA_BACK_BODY_COLOR; + style_para_back.body.shadow.width = 0; + style_para_back.body.radius = 3; + style_para_back.text.color = LV_COLOR_WHITE; + style_para_back.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); + + lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color); + lv_bar_style_indic.text.color = lv_color_hex3(0xADF); + lv_bar_style_indic.image.color = lv_color_hex3(0xADF); + lv_bar_style_indic.line.color = lv_color_hex3(0xADF); + lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF); + lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF); + lv_bar_style_indic.body.border.color = lv_color_hex3(0xADF); + } #define MAX_TITLE_LEN 28 @@ -360,15 +516,14 @@ char *getDispText(int index) { case BIND_UI: strcpy(public_buf_l, cloud_menu.title); break; - case ZOFFSET_UI: - strcpy(public_buf_l, zoffset_menu.title); - break; case TOOL_UI: strcpy(public_buf_l, tool_menu.title); break; case WIFI_LIST_UI: - //strcpy(public_buf_l, list_menu.title); - break; + #if ENABLED(USE_WIFI_FUNCTION) + strcpy(public_buf_l, list_menu.title); + break; + #endif case MACHINE_PARA_UI: strcpy(public_buf_l, MachinePara_menu.title); break; @@ -503,7 +658,7 @@ char *creat_title_text() { #if ENABLED(TFT_LVGL_UI_SPI) SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); #else - ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); + LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); LCD_WriteRAM_Prepare(); #endif @@ -582,10 +737,10 @@ char *creat_title_text() { //saved_feedrate_percentage = feedrate_percentage; planner.flow_percentage[0] = 100; planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - if (EXTRUDERS == 2) { + #if HAS_MULTI_EXTRUDER planner.flow_percentage[1] = 100; planner.e_factor[1] = planner.flow_percentage[1] * 0.01; - } + #endif card.startFileprint(); TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); once_flag = 0; @@ -615,7 +770,7 @@ char *creat_title_text() { #if ENABLED(TFT_LVGL_UI_SPI) SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); #else - ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); + LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); LCD_WriteRAM_Prepare(); #endif @@ -714,10 +869,10 @@ char *creat_title_text() { //saved_feedrate_percentage = feedrate_percentage; planner.flow_percentage[0] = 100; planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - if (EXTRUDERS == 2) { + #if HAS_MULTI_EXTRUDER planner.flow_percentage[1] = 100; planner.e_factor[1] = planner.flow_percentage[1] * 0.01; - } + #endif card.startFileprint(); TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); once_flag = 0; @@ -733,17 +888,17 @@ char *creat_title_text() { void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { int index; int y_off = 0; - + W25QXX.init(SPI_QUARTER_SPEED); for (index = 0; index < 10; index++) { // 200*200 #if HAS_BAK_VIEW_IN_FLASH if (sel == 1) { flash_view_Read(bmp_public_buf, 8000); // 20k } else { - default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 20k + default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k } #else - default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 20k + default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k #endif #if ENABLED(TFT_LVGL_UI_SPI) @@ -754,7 +909,7 @@ char *creat_title_text() { uint16_t temp_p; int i = 0; uint16_t *p_index; - ili9320_SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 + LCD_setWindowArea(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 LCD_WriteRAM_Prepare(); @@ -904,29 +1059,28 @@ void GUI_RefreshPage() { */ break; - case WIFI_UI: - /* - if (wifi_refresh_flg == 1) { - disp_wifi_state(); - wifi_refresh_flg = 0; - } - */ - break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_UI: + if (temperature_change_frequency == 1) { + disp_wifi_state(); + temperature_change_frequency = 0; + } + break; + #endif + case BIND_UI: /*refresh_bind_ui();*/ break; case FILAMENTCHANGE_UI: - /* if (temperature_change_frequency) { temperature_change_frequency = 0; - disp_filament_sprayer_temp(); + disp_filament_temp(); } - */ break; case DIALOG_UI: - /*filament_dialog_handle(); - wifi_scan_handle();*/ + filament_dialog_handle(); + TERN_(USE_WIFI_FUNCTION, wifi_scan_handle()); break; case MESHLEVELING_UI: /*disp_zpos();*/ @@ -934,66 +1088,68 @@ void GUI_RefreshPage() { case HARDWARE_TEST_UI: break; case WIFI_LIST_UI: - /* - if (wifi_refresh_flg == 1) { - disp_wifi_list(); - wifi_refresh_flg = 0; - } - */ + #if ENABLED(USE_WIFI_FUNCTION) + if (printing_rate_update_flag == 1) { + disp_wifi_list(); + printing_rate_update_flag = 0; + } + #endif break; case KEY_BOARD_UI: /*update_password_disp(); update_join_state_disp();*/ break; - case TIPS_UI: - /* - switch (tips_type) { - case TIPS_TYPE_JOINING: - if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[wifi_list.nameIndex]) == 0) { - tips_disp.timer = TIPS_TIMER_STOP; - tips_disp.timer_count = 0; - Clear_Tips(); - tips_type = TIPS_TYPE_WIFI_CONECTED; - draw_Tips(); - } - if (tips_disp.timer_count >= 30) { - tips_disp.timer = TIPS_TIMER_STOP; - tips_disp.timer_count = 0; - Clear_Tips(); - tips_type = TIPS_TYPE_TAILED_JOIN; - draw_Tips(); - } - break; - case TIPS_TYPE_TAILED_JOIN: - if (tips_disp.timer_count >= 3) { - tips_disp.timer = TIPS_TIMER_STOP; - tips_disp.timer_count = 0; - last_disp_state = TIPS_UI; - Clear_Tips(); - draw_Wifi_list(); - } - break; - case TIPS_TYPE_WIFI_CONECTED: - if (tips_disp.timer_count >= 3) { - tips_disp.timer = TIPS_TIMER_STOP; - tips_disp.timer_count = 0; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_TIPS_UI: + switch (wifi_tips_type) { + case TIPS_TYPE_JOINING: + if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName,(const char *)wifi_list.wifiName[wifi_list.nameIndex]) == 0) { + tips_disp.timer = TIPS_TIMER_STOP; + tips_disp.timer_count = 0; + + lv_clear_wifi_tips(); + wifi_tips_type = TIPS_TYPE_WIFI_CONECTED; + lv_draw_wifi_tips(); + + } + if (tips_disp.timer_count >= 30 * 1000) { + tips_disp.timer = TIPS_TIMER_STOP; + tips_disp.timer_count = 0; + lv_clear_wifi_tips(); + wifi_tips_type = TIPS_TYPE_TAILED_JOIN; + lv_draw_wifi_tips(); + } + break; + case TIPS_TYPE_TAILED_JOIN: + if (tips_disp.timer_count >= 3 * 1000) { + tips_disp.timer = TIPS_TIMER_STOP; + tips_disp.timer_count = 0; + + last_disp_state = WIFI_TIPS_UI; + lv_clear_wifi_tips(); + lv_draw_wifi_list(); + } + break; + case TIPS_TYPE_WIFI_CONECTED: + if (tips_disp.timer_count >= 3 * 1000) { + tips_disp.timer = TIPS_TIMER_STOP; + tips_disp.timer_count = 0; + + last_disp_state = WIFI_TIPS_UI; + lv_clear_wifi_tips(); + lv_draw_wifi(); + } + break; + default: break; + } + break; + #endif - last_disp_state = TIPS_UI; - Clear_Tips(); - draw_Wifi(); - } - break; - default: break; - } - */ - break; case BABY_STEP_UI: - /* if (temperature_change_frequency == 1) { temperature_change_frequency = 0; disp_z_offset_value(); } - */ break; default: break; } @@ -1060,9 +1216,11 @@ void clear_cur_ui() { case DISK_UI: //Clear_Disk(); break; - case WIFI_UI: - //Clear_Wifi(); - break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_UI: + lv_clear_wifi(); + break; + #endif case MORE_UI: //Clear_more(); break; @@ -1078,15 +1236,20 @@ void clear_cur_ui() { case PRINT_MORE_UI: //Clear_Printmore(); break; + case FILAMENTCHANGE_UI: + lv_clear_filament_change(); + break; case LEVELING_UI: lv_clear_manualLevel(); break; case BIND_UI: //Clear_Bind(); break; - case ZOFFSET_UI: - //Clear_Zoffset(); - break; + #if HAS_BED_PROBE + case NOZZLE_PROBE_OFFSET_UI: + lv_clear_auto_level_offset_settings(); + break; + #endif case TOOL_UI: lv_clear_tool(); break; @@ -1096,15 +1259,19 @@ void clear_cur_ui() { case HARDWARE_TEST_UI: //Clear_Hardwaretest(); break; - case WIFI_LIST_UI: - //Clear_Wifi_list(); - break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_LIST_UI: + lv_clear_wifi_list(); + break; + #endif case KEY_BOARD_UI: - //Clear_Keyboard(); - break; - case TIPS_UI: - //Clear_Tips(); + lv_clear_keyboard(); break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_TIPS_UI: + lv_clear_wifi_tips(); + break; + #endif case MACHINE_PARA_UI: lv_clear_machine_para(); break; @@ -1130,19 +1297,19 @@ void clear_cur_ui() { //Clear_EndstopType(); break; case FILAMENT_SETTINGS_UI: - //Clear_FilamentSettings(); + lv_clear_filament_settings(); break; case LEVELING_SETTIGNS_UI: //Clear_LevelingSettings(); break; case LEVELING_PARA_UI: - //Clear_LevelingPara(); + lv_clear_level_settings(); break; case DELTA_LEVELING_PARA_UI: //Clear_DeltaLevelPara(); break; - case XYZ_LEVELING_PARA_UI: - //Clear_XYZLevelPara(); + case MANUAL_LEVELING_POSIGION_UI: + lv_clear_manual_level_pos_settings(); break; case MAXFEEDRATE_UI: lv_clear_max_feedrate_settings(); @@ -1183,7 +1350,7 @@ void clear_cur_ui() { lv_clear_number_key(); break; case BABY_STEP_UI: - //Clear_babyStep(); + lv_clear_baby_stepping(); break; case PAUSE_POS_UI: lv_clear_pause_position(); @@ -1201,8 +1368,22 @@ void clear_cur_ui() { lv_clear_tmc_step_mode_settings(); break; #endif - default: + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_SETTINGS_UI: + lv_clear_wifi_settings(); break; + #endif + #if USE_SENSORLESS + case HOMING_SENSITIVITY_UI: + lv_clear_homing_sensitivity_settings(); + break; + #endif + #if HAS_ROTARY_ENCODER + case ENCODER_SETTINGS_UI: + lv_clear_encoder_settings(); + break; + #endif + default: break; } //GUI_Clear(); } @@ -1267,21 +1448,17 @@ void draw_return_ui() { lv_draw_about(); break; - #if tan_mask - case LOG_UI: - //draw_Connect(); - break; - #endif - case CALIBRATE_UI: //draw_calibrate(); break; case DISK_UI: //draw_Disk(); break; - case WIFI_UI: - //draw_Wifi(); - break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_UI: + lv_draw_wifi(); + break; + #endif case MORE_UI: //draw_More(); break; @@ -1289,7 +1466,7 @@ void draw_return_ui() { //draw_printmore(); break; case FILAMENTCHANGE_UI: - //draw_FilamentChange(); + lv_draw_filament_change(); break; case LEVELING_UI: lv_draw_manualLevel(); @@ -1297,13 +1474,11 @@ void draw_return_ui() { case BIND_UI: //draw_bind(); break; - - #if tan_mask - case ZOFFSET_UI: - //draw_Zoffset(); - break; - #endif - + #if HAS_BED_PROBE + case NOZZLE_PROBE_OFFSET_UI: + lv_draw_auto_level_offset_settings(); + break; + #endif case TOOL_UI: lv_draw_tool(); break; @@ -1314,13 +1489,17 @@ void draw_return_ui() { //draw_Hardwaretest(); break; case WIFI_LIST_UI: - //draw_Wifi_list(); + #if ENABLED(USE_WIFI_FUNCTION) + lv_draw_wifi_list(); + #endif break; case KEY_BOARD_UI: - //draw_Keyboard(); + lv_draw_keyboard(); break; - case TIPS_UI: - //draw_Tips(); + case WIFI_TIPS_UI: + #if ENABLED(USE_WIFI_FUNCTION) + lv_draw_wifi_tips(); + #endif break; case MACHINE_PARA_UI: lv_draw_machine_para(); @@ -1347,19 +1526,19 @@ void draw_return_ui() { //draw_EndstopType(); break; case FILAMENT_SETTINGS_UI: - //draw_FilamentSettings(); + lv_draw_filament_settings(); break; case LEVELING_SETTIGNS_UI: //draw_LevelingSettings(); break; case LEVELING_PARA_UI: - //draw_LevelingPara(); + lv_draw_level_settings(); break; case DELTA_LEVELING_PARA_UI: //draw_DeltaLevelPara(); break; - case XYZ_LEVELING_PARA_UI: - //draw_XYZLevelPara(); + case MANUAL_LEVELING_POSIGION_UI: + lv_draw_manual_level_pos_settings(); break; case MAXFEEDRATE_UI: lv_draw_max_feedrate_settings(); @@ -1400,10 +1579,10 @@ void draw_return_ui() { lv_draw_number_key(); break; case DIALOG_UI: - //draw_dialog(DialogType); + //draw_dialog(uiCfg.dialogType); break; case BABY_STEP_UI: - //draw_babyStep(); + lv_draw_baby_stepping(); break; case PAUSE_POS_UI: lv_draw_pause_position(); @@ -1421,6 +1600,21 @@ void draw_return_ui() { lv_draw_tmc_step_mode_settings(); break; #endif + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_SETTINGS_UI: + lv_draw_wifi_settings(); + break; + #endif + #if USE_SENSORLESS + case HOMING_SENSITIVITY_UI: + lv_draw_homing_sensitivity_settings(); + break; + #endif + #if HAS_ROTARY_ENCODER + case ENCODER_SETTINGS_UI: + lv_draw_encoder_settings(); + break; + #endif default: break; } } @@ -1440,8 +1634,8 @@ void draw_return_ui() { #endif void lv_ex_line(lv_obj_t * line, lv_point_t *points) { - /*Copy the previous line and apply the new style*/ - lv_line_set_points(line, points, 2); /*Set the points*/ + // Copy the previous line and apply the new style + lv_line_set_points(line, points, 2); // Set the points lv_line_set_style(line, LV_LINE_STYLE_MAIN, &style_line); lv_obj_align(line, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); } @@ -1450,18 +1644,29 @@ extern volatile uint32_t systick_uptime_millis; void print_time_count() { if ((systick_uptime_millis % 1000) == 0) - if (print_time.start == 1) print_time.seconds++; + if (print_time.start == 1) print_time.seconds++; } void LV_TASK_HANDLER() { //lv_tick_inc(1); lv_task_handler(); if (mks_test_flag == 0x1e) mks_hardware_test(); + #if HAS_GCODE_PREVIEW disp_pre_gcode(2, 36); #endif + GUI_RefreshPage(); + + #if ENABLED(USE_WIFI_FUNCTION) + get_wifi_commands(); + #endif + //sd_detection(); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_update_encoder(); + #endif } #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 8cd4670ffa..09e39d8412 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -34,7 +34,11 @@ #undef LV_COLOR_BACKGROUND #define LV_COLOR_BACKGROUND LV_COLOR_MAKE(0x1A, 0x1A, 0x1A) // LV_COLOR_MAKE(0x00, 0x00, 0x00) +#define TFT_LV_PARA_BACK_BODY_COLOR LV_COLOR_MAKE(0x4A, 0x52, 0xFF) + +#include "tft_lvgl_configuration.h" #include "tft_multi_language.h" +#include "pic_manager.h" #include "draw_ready_print.h" #include "draw_language.h" #include "draw_set.h" @@ -66,8 +70,33 @@ #include "draw_eeprom_settings.h" #include "draw_max_feedrate_settings.h" #include "draw_tmc_step_mode_settings.h" +#include "draw_level_settings.h" +#include "draw_manual_level_pos_settings.h" +#include "draw_auto_level_offset_settings.h" +#include "draw_filament_change.h" +#include "draw_filament_settings.h" +#include "draw_homing_sensitivity_settings.h" +#include "draw_baby_stepping.h" +#include "draw_keyboard.h" +#include "draw_encoder_settings.h" + +#if ENABLED(USE_WIFI_FUNCTION) + #include "wifiSerial.h" + #include "wifi_module.h" + #include "wifi_upload.h" + #include "draw_wifi_settings.h" + #include "draw_wifi.h" + #include "draw_wifi_list.h" + #include "draw_wifi_tips.h" +#endif #include "../../inc/MarlinConfigPre.h" +#define FILE_SYS_USB 0 +#define FILE_SYS_SD 1 + +#define TICK_CYCLE 1 + +#define PARA_SEL_ICON_TEXT_COLOR LV_COLOR_MAKE(0x4a, 0x52, 0xff); #define TFT35 @@ -100,30 +129,38 @@ #define PREVIEW_LITTLE_PIC_SIZE 40910 // 400*100+9*101+1 #define PREVIEW_SIZE 202720 // (PREVIEW_LITTLE_PIC_SIZE+800*200+201*9+1) - #define GCFG_FLAG_VALUE 0xEE - // machine parameter ui - #define PARA_UI_POS_X 10 - #define PARA_UI_POS_Y 50 + #define PARA_UI_POS_X 10 + #define PARA_UI_POS_Y 50 - #define PARA_UI_SIZE_X 450 - #define PARA_UI_SIZE_Y 40 + #define PARA_UI_SIZE_X 450 + #define PARA_UI_SIZE_Y 40 #define PARA_UI_ARROW_V 12 - #define PARA_UI_BACL_POS_X 400 - #define PARA_UI_BACL_POS_Y 270 + #define PARA_UI_BACL_POS_X 400 + #define PARA_UI_BACL_POS_Y 270 - #define PARA_UI_TURN_PAGE_POS_X 320 - #define PARA_UI_TURN_PAGE_POS_Y 270 + #define PARA_UI_TURN_PAGE_POS_X 320 + #define PARA_UI_TURN_PAGE_POS_Y 270 - #define PARA_UI_VALUE_SIZE_X 370 - #define PARA_UI_VALUE_POS_X 400 + #define PARA_UI_VALUE_SIZE_X 370 + #define PARA_UI_VALUE_POS_X 400 #define PARA_UI_VALUE_V 5 - #define PARA_UI_STATE_POS_X 380 + #define PARA_UI_STATE_POS_X 380 #define PARA_UI_STATE_V 2 + #define PARA_UI_VALUE_SIZE_X_2 200 + #define PARA_UI_VALUE_POS_X_2 320 + #define PARA_UI_VALUE_V_2 5 + + #define PARA_UI_VALUE_BTN_X_SIZE 70 + #define PARA_UI_VALUE_BTN_Y_SIZE 28 + + #define PARA_UI_BACK_BTN_X_SIZE 70 + #define PARA_UI_BACK_BTN_Y_SIZE 40 + #else // ifdef TFT35 #define TFT_WIDTH 320 @@ -135,13 +172,25 @@ extern char public_buf_m[100]; extern char public_buf_l[30]; typedef struct { - uint8_t spi_flash_flag; + uint32_t spi_flash_flag; + uint8_t disp_rotation_180; uint8_t multiple_language; uint8_t language; uint8_t leveling_mode; uint8_t from_flash_pic; uint8_t finish_power_off; uint8_t pause_reprint; + uint8_t wifi_mode_sel; + uint8_t fileSysType; + uint8_t wifi_type; + bool cloud_enable; + bool encoder_enable; + int levelingPos[5][2]; + int filamentchange_load_length; + int filamentchange_load_speed; + int filamentchange_unload_length; + int filamentchange_unload_speed; + int filament_limit_temper; float pausePosX; float pausePosY; float pausePosZ; @@ -153,15 +202,42 @@ typedef struct { curSprayerChoose : 3, stepHeat : 4; uint8_t leveling_first_time : 1, - para_ui_page : 1; + para_ui_page:1, + configWifi:1, + command_send:1, + filament_load_heat_flg:1, + filament_heat_completed_load:1, + filament_unload_heat_flg:1, + filament_heat_completed_unload:1; + uint8_t filament_loading_completed:1, + filament_unloading_completed:1, + filament_loading_time_flg:1, + filament_unloading_time_flg:1, + curSprayerChoose_bak:4; + uint8_t wifi_name[32]; + uint8_t wifi_key[64]; + uint8_t cloud_hostUrl[96]; uint8_t extruStep; uint8_t extruSpeed; uint8_t print_state; uint8_t stepPrintSpeed; uint8_t waitEndMoves; - uint16_t moveSpeed; - float move_dist; + uint8_t dialogType; uint8_t F[4]; + uint8_t filament_rate; + uint16_t moveSpeed; + uint16_t cloud_port; + uint16_t moveSpeed_bak; + uint32_t totalSend; + uint32_t filament_loading_time; + uint32_t filament_unloading_time; + uint32_t filament_loading_time_cnt; + uint32_t filament_unloading_time_cnt; + float move_dist; + float desireSprayerTempBak; + float current_x_position_bak; + float current_y_position_bak; + float current_e_position_bak; } UI_CFG; typedef enum { @@ -196,12 +272,14 @@ typedef enum { LEVELING_UI, MESHLEVELING_UI, BIND_UI, - ZOFFSET_UI, + #if HAS_BED_PROBE + NOZZLE_PROBE_OFFSET_UI, + #endif TOOL_UI, HARDWARE_TEST_UI, WIFI_LIST_UI, KEY_BOARD_UI, - TIPS_UI, + WIFI_TIPS_UI, MACHINE_PARA_UI, MACHINE_SETTINGS_UI, TEMPERATURE_SETTINGS_UI, @@ -214,7 +292,7 @@ typedef enum { LEVELING_SETTIGNS_UI, LEVELING_PARA_UI, DELTA_LEVELING_PARA_UI, - XYZ_LEVELING_PARA_UI, + MANUAL_LEVELING_POSIGION_UI, MAXFEEDRATE_UI, STEPS_UI, ACCELERATION_UI, @@ -232,7 +310,10 @@ typedef enum { PAUSE_POS_UI, TMC_CURRENT_UI, TMC_MODE_UI, - EEPROM_SETTINGS_UI + EEPROM_SETTINGS_UI, + WIFI_SETTINGS_UI, + HOMING_SENSITIVITY_UI, + ENCODER_SETTINGS_UI } DISP_STATE; typedef struct { @@ -285,10 +366,45 @@ typedef enum { pause_pos_x, pause_pos_y, - pause_pos_z + pause_pos_z, -}value_state; -extern value_state value; + level_pos_x1, + level_pos_y1, + level_pos_x2, + level_pos_y2, + level_pos_x3, + level_pos_y3, + level_pos_x4, + level_pos_y4, + level_pos_x5, + level_pos_y5 + #if HAS_BED_PROBE + , + x_offset, + y_offset, + z_offset + #endif + , + load_length, + load_speed, + unload_length, + unload_speed, + filament_temp, + + x_sensitivity, + y_sensitivity, + z_sensitivity, + z2_sensitivity +} num_key_value_state; +extern num_key_value_state value; + +typedef enum { + wifiName, + wifiPassWord, + wifiConfig, + gcodeCommand +} keyboard_value_state; +extern keyboard_value_state keyboard_value; extern CFG_ITMES gCfgItems; extern UI_CFG uiCfg; @@ -305,6 +421,10 @@ extern lv_style_t style_para_value_rel; extern lv_style_t style_num_key_pre; extern lv_style_t style_num_key_rel; extern lv_style_t style_num_text; +extern lv_style_t style_sel_text; +extern lv_style_t style_para_value; +extern lv_style_t style_para_back; +extern lv_style_t lv_bar_style_indic; extern lv_point_t line_points[4][2]; @@ -314,6 +434,8 @@ extern void tft_style_init(); extern char *creat_title_text(void); extern void preview_gcode_prehandle(char *path); extern void update_spi_flash(); +extern void update_gcode_command(int addr,uint8_t *s); +extern void get_gcode_command(int addr,uint8_t *d); #if HAS_GCODE_PREVIEW extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp new file mode 100644 index 0000000000..9cf4555b25 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -0,0 +1,222 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../../Configuration.h" +#include "../../../../module/temperature.h" + +extern lv_group_t * g; +static lv_obj_t *scr, *wifi_name_text, *wifi_key_text, *wifi_state_text, *wifi_ip_text; + +#define ID_W_RETURN 1 +#define ID_W_CLOUD 2 +#define ID_W_RECONNECT 3 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_W_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + lv_draw_set(); + } + break; + case ID_W_CLOUD: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + //clear_cur_ui(); + //draw_return_ui(); + } + break; + case ID_W_RECONNECT: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + lv_draw_wifi_list(); + } + break; + } +} + +void lv_draw_wifi(void) { + lv_obj_t *buttonBack=NULL,*label_Back=NULL; + lv_obj_t *buttonCloud=NULL,*label_Cloud=NULL; + lv_obj_t *buttonReconnect=NULL,*label_Reconnect=NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_UI; + } + disp_state = WIFI_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); + lv_label_set_text(title, creat_title_text()); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + // Create an Image button + buttonBack = lv_imgbtn_create(scr, NULL); + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + //buttonCloud = lv_imgbtn_create(scr, NULL); + buttonReconnect = lv_imgbtn_create(scr, NULL); + } + + lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_W_RETURN, NULL,0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + + lv_obj_set_event_cb_mks(buttonReconnect, event_handler,ID_W_RECONNECT, NULL,0); + lv_imgbtn_set_src(buttonReconnect, LV_BTN_STATE_REL, "F:/bmp_wifi.bin"); + lv_imgbtn_set_src(buttonReconnect, LV_BTN_STATE_PR, "F:/bmp_wifi.bin"); + lv_imgbtn_set_style(buttonReconnect, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonReconnect, LV_BTN_STATE_REL, &tft_style_label_rel); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonReconnect); + #endif + + lv_obj_set_pos(buttonReconnect,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_btn_set_layout(buttonReconnect, LV_LAYOUT_OFF); + } + + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + //label_Cloud = lv_label_create(buttonCloud, NULL); + label_Reconnect = lv_label_create(buttonReconnect, NULL); + } + + if (gCfgItems.multiple_language !=0) { + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + //lv_label_set_text(label_Cloud, common_menu.text_back); + //lv_obj_align(label_Cloud, buttonCloud, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Reconnect, wifi_menu.reconnect); + lv_obj_align(label_Reconnect, buttonReconnect, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + } + } + + wifi_ip_text = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_ip_text, &tft_style_label_rel); + + wifi_name_text = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_name_text, &tft_style_label_rel); + + wifi_key_text = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_key_text, &tft_style_label_rel); + + wifi_state_text = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_state_text, &tft_style_label_rel); + + disp_wifi_state(); +} + +void disp_wifi_state() { + memset(public_buf_m, 0, sizeof(public_buf_m)); + strcpy(public_buf_m,wifi_menu.ip); + strcat(public_buf_m,ipPara.ip_addr); + lv_label_set_text(wifi_ip_text, public_buf_m); + lv_obj_align(wifi_ip_text, NULL, LV_ALIGN_CENTER,0, -100); + + memset(public_buf_m, 0, sizeof(public_buf_m)); + strcpy(public_buf_m,wifi_menu.wifi); + strcat(public_buf_m,wifiPara.ap_name); + lv_label_set_text(wifi_name_text, public_buf_m); + lv_obj_align(wifi_name_text, NULL, LV_ALIGN_CENTER,0, -70); + + if (wifiPara.mode == AP_MODEL) { + memset(public_buf_m, 0, sizeof(public_buf_m)); + strcpy(public_buf_m,wifi_menu.key); + strcat(public_buf_m,wifiPara.keyCode); + lv_label_set_text(wifi_key_text, public_buf_m); + lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER,0, -40); + + memset(public_buf_m, 0, sizeof(public_buf_m)); + strcpy(public_buf_m,wifi_menu.state_ap); + if (wifi_link_state == WIFI_CONNECTED) + strcat(public_buf_m,wifi_menu.connected); + else if (wifi_link_state == WIFI_NOT_CONFIG) + strcat(public_buf_m,wifi_menu.disconnected); + else + strcat(public_buf_m,wifi_menu.exception); + lv_label_set_text(wifi_state_text, public_buf_m); + lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER,0, -10); + } + else { + ZERO(public_buf_m); + strcpy(public_buf_m, wifi_menu.state_sta); + if (wifi_link_state == WIFI_CONNECTED) + strcat(public_buf_m, wifi_menu.connected); + else if (wifi_link_state == WIFI_NOT_CONFIG) + strcat(public_buf_m, wifi_menu.disconnected); + else + strcat(public_buf_m, wifi_menu.exception); + lv_label_set_text(wifi_state_text, public_buf_m); + lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER,0, -40); + + lv_label_set_text(wifi_key_text, ""); + lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER,0, -10); + } +} + +void lv_clear_wifi() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h new file mode 100644 index 0000000000..966a84d3b1 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + + +extern void lv_draw_wifi(void); +extern void lv_clear_wifi(); +extern void disp_wifi_state(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif + + + diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp new file mode 100644 index 0000000000..14fd63f852 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -0,0 +1,235 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../../Configuration.h" +#include "../../../../module/temperature.h" + +#define NAME_BTN_X 330 +#define NAME_BTN_Y 48 + +#define MARK_BTN_X 0 +#define MARK_BTN_Y 68 + +WIFI_LIST wifi_list; +list_menu_def list_menu; + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *buttonWifiN[NUMBER_OF_PAGE]; +static lv_obj_t *lableWifiText[NUMBER_OF_PAGE]; +static lv_obj_t *lablePageText; + +#define ID_WL_RETURN 11 +#define ID_WL_DOWN 12 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + if (obj->mks_obj_id == ID_WL_RETURN) { + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + lv_draw_set(); + } + } + else if (obj->mks_obj_id == ID_WL_DOWN) { + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (wifi_list.getNameNum > 0) { + if ((wifi_list.nameIndex + NUMBER_OF_PAGE) >= wifi_list.getNameNum) { + wifi_list.nameIndex = 0; + wifi_list.currentWifipage = 1; + } + else { + wifi_list.nameIndex += NUMBER_OF_PAGE; + wifi_list.currentWifipage++; + } + disp_wifi_list(); + } + } + } + else { + for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { + if (obj->mks_obj_id == i + 1) { + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (wifi_list.getNameNum != 0) { + const bool do_wifi = wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[wifi_list.nameIndex + i]) == 0; + wifi_list.nameIndex += i; + last_disp_state = WIFI_LIST_UI; + lv_clear_wifi_list(); + if (do_wifi) + lv_draw_wifi(); + else { + keyboard_value = wifiConfig; + lv_draw_keyboard(); + } + } + } + } + } + } +} + +void lv_draw_wifi_list(void) { + lv_obj_t *buttonBack = NULL, *buttonDown = NULL; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_LIST_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_LIST_UI; + } + disp_state = WIFI_LIST_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); + lv_label_set_text(title, creat_title_text()); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + buttonDown = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonDown, event_handler,ID_WL_DOWN,NULL,0); + lv_imgbtn_set_src(buttonDown, LV_BTN_STATE_REL, "F:/bmp_pageDown.bin"); + lv_imgbtn_set_src(buttonDown, LV_BTN_STATE_PR, "F:/bmp_pageDown.bin"); + lv_imgbtn_set_style(buttonDown, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonDown, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_WL_RETURN,NULL,0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back.bin"); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonDown,OTHER_BTN_XPIEL*3+INTERVAL_V*4,titleHeight+OTHER_BTN_YPIEL+INTERVAL_H); + lv_obj_set_pos(buttonBack,OTHER_BTN_XPIEL*3+INTERVAL_V*4,titleHeight+OTHER_BTN_YPIEL*2+INTERVAL_H*2); + + lv_btn_set_layout(buttonDown, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { + buttonWifiN[i] = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonWifiN[i], 0,NAME_BTN_Y*i+10+titleHeight); /*Set its position*/ + lv_obj_set_size(buttonWifiN[i], NAME_BTN_X,NAME_BTN_Y); /*Set its size*/ + lv_obj_set_event_cb_mks(buttonWifiN[i], event_handler,(i+1),NULL,0); + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonWifiN[i], LV_LAYOUT_OFF); + lableWifiText[i] = lv_label_create(buttonWifiN[i], NULL); + #if HAS_ROTARY_ENCODER + uint8_t j = 0; + if (gCfgItems.encoder_enable) { + j = wifi_list.nameIndex + i; + if (j < wifi_list.getNameNum) lv_group_add_obj(g, buttonWifiN[i]); + } + #endif + } + + lablePageText = lv_label_create(scr, NULL); + lv_obj_set_style(lablePageText, &tft_style_label_rel); + + wifi_list.nameIndex = 0; + wifi_list.currentWifipage = 1; + + if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode == STA_MODEL) { + memset(wifi_list.wifiConnectedName, 0, sizeof(&wifi_list.wifiConnectedName)); + memcpy(wifi_list.wifiConnectedName, wifiPara.ap_name, sizeof(wifi_list.wifiConnectedName)); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonDown); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_wifi_list(); +} + +void disp_wifi_list(void) { + int8_t tmpStr[WIFI_NAME_BUFFER_SIZE] = { 0 }; + uint8_t i, j; + + sprintf((char *)tmpStr, list_menu.file_pages, wifi_list.currentWifipage, wifi_list.getPage); + lv_label_set_text(lablePageText, (const char *)tmpStr); + lv_obj_align(lablePageText, NULL, LV_ALIGN_CENTER, 50, -100); + + for (i = 0; i < NUMBER_OF_PAGE; i++) { + memset(tmpStr, 0, sizeof(tmpStr)); + + j = wifi_list.nameIndex + i; + if (j >= wifi_list.getNameNum) { + lv_label_set_text(lableWifiText[i], (const char *)tmpStr); + lv_obj_align(lableWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); + } + else { + lv_label_set_text(lableWifiText[i], (char const *)wifi_list.wifiName[j]); + lv_obj_align(lableWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); + + if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[j]) == 0) { + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &style_sel_text); + } + else { + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &tft_style_label_rel); + } + } + } +} + +void wifi_scan_handle() { + if (uiCfg.dialogType != WIFI_ENABLE_TIPS || uiCfg.command_send != 1) return; + last_disp_state = DIALOG_UI; + lv_clear_dialog(); + if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode != AP_MODEL) + lv_draw_wifi(); + else + lv_draw_wifi_list(); +} + +void lv_clear_wifi_list() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // USE_WIFI_FUNCTION + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h new file mode 100644 index 0000000000..e2d9275ef9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h @@ -0,0 +1,76 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_wifi_list(); +extern void lv_clear_wifi_list(); +extern void disp_wifi_list(void); +extern void cutWifiName(char *name, int len,char *outStr); +extern void wifi_scan_handle(); + +#define NUMBER_OF_PAGE 5 + +#define WIFI_TOTAL_NUMBER 20 +#define WIFI_NAME_BUFFER_SIZE 33 + +typedef struct { + int8_t getNameNum; + int8_t nameIndex; + int8_t currentWifipage; + int8_t getPage; + int8_t RSSI[WIFI_TOTAL_NUMBER]; + uint8_t wifiName[WIFI_TOTAL_NUMBER][WIFI_NAME_BUFFER_SIZE]; + uint8_t wifiConnectedName[WIFI_NAME_BUFFER_SIZE]; +} WIFI_LIST; +extern WIFI_LIST wifi_list; + +typedef struct list_menu_disp { + const char *title; + const char *file_pages; +} list_menu_def; +extern list_menu_def list_menu; + +typedef struct keyboard_menu_disp { + const char *title; + const char *apply; + const char *password; + const char *letter; + const char *digital; + const char *symbol; + const char *space; +} keyboard_menu_def; +extern keyboard_menu_def keyboard_menu; + +typedef struct tips_menu_disp { + const char *joining; + const char *failedJoin; + const char *wifiConected; +} tips_menu_def; +extern tips_menu_def tips_menu; + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp new file mode 100644 index 0000000000..86733470dd --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp @@ -0,0 +1,299 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../../Configuration.h" +#include "../../../../module/planner.h" + +extern lv_group_t * g; +static lv_obj_t *scr, *labelModelValue = NULL, *buttonModelValue = NULL, *labelCloudValue = NULL; + +#define ID_WIFI_RETURN 1 +#define ID_WIFI_MODEL 2 +#define ID_WIFI_NAME 3 +#define ID_WIFI_PASSWORD 4 +#define ID_WIFI_CLOUD 5 +#define ID_WIFI_CONFIG 6 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_WIFI_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_wifi_settings(); + draw_return_ui(); + } + break; + case ID_WIFI_MODEL: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.wifi_mode_sel == AP_MODEL) { + gCfgItems.wifi_mode_sel = STA_MODEL; + lv_label_set_text(labelModelValue, WIFI_STA_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + update_spi_flash(); + } + else{ + gCfgItems.wifi_mode_sel = AP_MODEL; + lv_label_set_text(labelModelValue, WIFI_AP_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + update_spi_flash(); + } + } + break; + case ID_WIFI_NAME: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + keyboard_value=wifiName; + lv_clear_wifi_settings(); + lv_draw_keyboard(); + } + break; + case ID_WIFI_PASSWORD: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + keyboard_value=wifiPassWord; + lv_clear_wifi_settings(); + lv_draw_keyboard(); + } + break; + case ID_WIFI_CLOUD: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.cloud_enable) { + gCfgItems.cloud_enable = false; + lv_obj_set_event_cb_mks(obj, event_handler,ID_WIFI_CLOUD,"bmp_disable.bin",0); + lv_label_set_text(labelCloudValue, machine_menu.disable); + update_spi_flash(); + } + else { + gCfgItems.cloud_enable = true; + lv_obj_set_event_cb_mks(obj, event_handler,ID_WIFI_CLOUD,"bmp_enable.bin",0); + lv_label_set_text(labelCloudValue, machine_menu.enable); + update_spi_flash(); + } + } + break; + case ID_WIFI_CONFIG: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_wifi_settings(); + lv_draw_dialog(DIALOG_WIFI_CONFIG_TIPS); + } + break; + } +} + +void lv_draw_wifi_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonConfig = NULL, *labelConfig = NULL; + lv_obj_t *labelModelText = NULL; + lv_obj_t *labelNameText = NULL, *buttonNameValue = NULL, *labelNameValue = NULL; + lv_obj_t *labelPassWordText = NULL, *buttonPassWordValue = NULL, *labelPassWordValue = NULL; + lv_obj_t *labelCloudText = NULL, *buttonCloudValue = NULL; + lv_obj_t * line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_SETTINGS_UI; + } + disp_state = WIFI_SETTINGS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); + lv_label_set_text(title, machine_menu.WifiConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + labelModelText = lv_label_create(scr, NULL); + lv_obj_set_style(labelModelText, &tft_style_label_rel); + lv_obj_set_pos(labelModelText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelModelText, machine_menu.wifiMode); + + buttonModelValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonModelValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y+PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonModelValue, event_handler,ID_WIFI_MODEL, NULL,0); + lv_imgbtn_set_src(buttonModelValue, LV_BTN_STATE_REL, "F:/bmp_blank_sel.bin"); + lv_imgbtn_set_src(buttonModelValue, LV_BTN_STATE_PR, "F:/bmp_blank_sel.bin"); + lv_imgbtn_set_style(buttonModelValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonModelValue, LV_BTN_STATE_REL, &style_para_value_pre); + lv_btn_set_layout(buttonModelValue, LV_LAYOUT_OFF); + labelModelValue = lv_label_create(buttonModelValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1,line_points[0]); + + labelNameText = lv_label_create(scr, NULL); + lv_obj_set_style(labelNameText, &tft_style_label_rel); + lv_obj_set_pos(labelNameText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + + buttonNameValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonNameValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y*2+PARA_UI_VALUE_V); + lv_obj_set_size(buttonNameValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonNameValue, event_handler,ID_WIFI_NAME, NULL,0); + lv_btn_set_style(buttonNameValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonNameValue, LV_BTN_STYLE_PR, &style_para_value); + labelNameValue = lv_label_create(buttonNameValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2,line_points[1]); + + labelPassWordText = lv_label_create(scr, NULL); + lv_obj_set_style(labelPassWordText, &tft_style_label_rel); + lv_obj_set_pos(labelPassWordText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + + buttonPassWordValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonPassWordValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y*3+PARA_UI_VALUE_V); + lv_obj_set_size(buttonPassWordValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonPassWordValue, event_handler,ID_WIFI_PASSWORD, NULL,0); + lv_btn_set_style(buttonPassWordValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonPassWordValue, LV_BTN_STYLE_PR, &style_para_value); + labelPassWordValue = lv_label_create(buttonPassWordValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3,line_points[2]); + + labelCloudText = lv_label_create(scr, NULL); + lv_obj_set_style(labelCloudText, &tft_style_label_rel); + lv_obj_set_pos(labelCloudText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelCloudText, machine_menu.wifiCloud); + + buttonCloudValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonCloudValue,PARA_UI_STATE_POS_X,PARA_UI_POS_Y*4+PARA_UI_STATE_V); + if (gCfgItems.cloud_enable) { + lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + lv_obj_set_event_cb_mks(buttonCloudValue, event_handler,ID_WIFI_CLOUD, NULL,0); + lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonCloudValue, LV_LAYOUT_OFF); + labelCloudValue = lv_label_create(buttonCloudValue, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4,line_points[3]); + + buttonConfig = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonConfig, event_handler,ID_WIFI_CONFIG, NULL,0); + lv_imgbtn_set_src(buttonConfig, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonConfig, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_style(buttonConfig, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonConfig, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_pos(buttonConfig, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_btn_set_layout(buttonConfig, LV_LAYOUT_OFF); + labelConfig = lv_label_create(buttonConfig, NULL); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_WIFI_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language !=0) { + if (gCfgItems.wifi_mode_sel == AP_MODEL) { + lv_label_set_text(labelModelValue, WIFI_AP_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + } + else { + lv_label_set_text(labelModelValue, WIFI_STA_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + } + memset(public_buf_m,0,sizeof(public_buf_m)); + strcat(public_buf_m,machine_menu.wifiName); + strcat(public_buf_m,(const char *)uiCfg.wifi_name); + lv_label_set_text(labelNameText,public_buf_m); + + lv_label_set_text(labelNameValue,machine_menu.wifiEdit); + lv_obj_align(labelNameValue, buttonNameValue, LV_ALIGN_CENTER,0, 0); + + memset(public_buf_m,0,sizeof(public_buf_m)); + strcat(public_buf_m,machine_menu.wifiPassWord); + strcat(public_buf_m,(const char *)uiCfg.wifi_key); + lv_label_set_text(labelPassWordText,public_buf_m); + + lv_label_set_text(labelPassWordValue,machine_menu.wifiEdit); + lv_obj_align(labelPassWordValue, buttonPassWordValue, LV_ALIGN_CENTER,0, 0); + + lv_label_set_text(labelCloudValue, gCfgItems.cloud_enable ? machine_menu.enable : machine_menu.disable); + lv_obj_align(labelCloudValue, buttonCloudValue, LV_ALIGN_CENTER,0, 0); + + lv_label_set_text(labelConfig,machine_menu.wifiConfig); + lv_obj_align(labelConfig, buttonConfig, LV_ALIGN_CENTER,0, 0); + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER,0, 0); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonModelValue); + lv_group_add_obj(g, buttonNameValue); + lv_group_add_obj(g, buttonPassWordValue); + lv_group_add_obj(g, buttonCloudValue); + lv_group_add_obj(g, buttonConfig); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_wifi_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // USE_WIFI_FUNCTION + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h new file mode 100644 index 0000000000..c0d6e0ccdd --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +#define WIFI_AP_TEXT "AP" +#define WIFI_STA_TEXT "STA" + +extern void lv_draw_wifi_settings(void); +extern void lv_clear_wifi_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp new file mode 100644 index 0000000000..50fa0aaf99 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp @@ -0,0 +1,85 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../../Configuration.h" +#include "../../../../module/temperature.h" + +static lv_obj_t * scr; + +TIPS_TYPE wifi_tips_type; +TIPS_DISP tips_disp; +tips_menu_def tips_menu; + +void lv_draw_wifi_tips(void) { + static lv_obj_t * text_tips,*wifi_name; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_TIPS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_TIPS_UI; + } + disp_state = WIFI_TIPS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + lv_refr_now(lv_refr_get_disp_refreshing()); + + text_tips = lv_label_create(scr, NULL); + lv_obj_set_style(text_tips, &tft_style_label_rel); + + wifi_name = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_name, &tft_style_label_rel); + + if (wifi_tips_type == TIPS_TYPE_JOINING) { + lv_label_set_text(text_tips, tips_menu.joining); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + } + else if (wifi_tips_type == TIPS_TYPE_TAILED_JOIN) { + lv_label_set_text(text_tips, tips_menu.failedJoin); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + } + else if (wifi_tips_type == TIPS_TYPE_WIFI_CONECTED) { + lv_label_set_text(text_tips, tips_menu.wifiConected); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + } + + lv_label_set_text(wifi_name, (const char *)wifi_list.wifiName[wifi_list.nameIndex]); + lv_obj_align(wifi_name, NULL, LV_ALIGN_CENTER,0, -20); + + tips_disp.timer = TIPS_TIMER_START; + tips_disp.timer_count = 0; +} + +void lv_clear_wifi_tips() { lv_obj_del(scr); } + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h new file mode 100644 index 0000000000..4f81f00a43 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h @@ -0,0 +1,51 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + + +extern void lv_draw_wifi_tips(void); +extern void lv_clear_wifi_tips(); + +typedef enum { + TIPS_TYPE_JOINING, + TIPS_TYPE_TAILED_JOIN, + TIPS_TYPE_WIFI_CONECTED +} TIPS_TYPE; +extern TIPS_TYPE wifi_tips_type; + +typedef struct { + unsigned char timer; + unsigned int timer_count; +} TIPS_DISP; +extern TIPS_DISP tips_disp; + +#define TIPS_TIMER_START 1 +#define TIPS_TIMER_STOP 0 + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif + diff --git a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp new file mode 100644 index 0000000000..cf64571292 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp @@ -0,0 +1,69 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "draw_ui.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "wifiSerial.h" + +#include +#include +#include +#include +#include + +#include "../../../../inc/MarlinConfig.h" + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); +#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); + +void __irq_usart1(void) { + WIFISERIAL.wifi_usart_irq(USART1_BASE); + if (wifi_link_state == WIFI_TRANS_FILE) { + if (WIFISERIAL.available() == (400)) WIFI_IO1_SET(); + if (WIFISERIAL.wifi_rb_is_full()) { + if (esp_state == TRANSFER_IDLE) esp_state = TRANSFERING; + if (storeRcvData(UART_RX_BUFFER_SIZE)) { + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); + } + else { + WIFI_IO1_SET(); + esp_state = TRANSFER_STORE; + } + } + } +} + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index 297ba723de..743863d1f7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -38,7 +38,10 @@ #include "../../../../module/temperature.h" #include "../../../../sd/cardreader.h" -uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det2_sta, mt_det3_sta; +uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det3_sta; +#if PIN_EXISTS(MT_DET_2) + uint8_t mt_det2_sta; +#endif uint8_t endstopx1_sta, endstopx2_sta, endstopy1_sta, endstopy2_sta, endstopz1_sta, endstopz2_sta; void test_gpio_readlevel_L() { #if ENABLED(MKS_TEST) @@ -46,15 +49,17 @@ void test_gpio_readlevel_L() { WRITE(WIFI_IO0_PIN, HIGH); itest = 10000; while (itest--); - pw_det_sta = (READ(POWER_LOSS_PIN) == 0); - pw_off_sta = (READ(PS_ON_PIN) == 0); + pw_det_sta = (READ(MKS_TEST_POWER_LOSS_PIN) == 0); + pw_off_sta = (READ(MKS_TEST_PS_ON_PIN) == 0); mt_det_sta = (READ(MT_DET_1_PIN) == 0); - mt_det2_sta = (READ(MT_DET_2_PIN) == 0); + #if PIN_EXISTS(MT_DET_2) + mt_det2_sta = (READ(MT_DET_2_PIN) == 0); + #endif //mt_det3_sta = (READ(FIL_RUNOUT_3_PIN) == 0); endstopx1_sta = (READ(X_MIN_PIN) == 0); - endstopx2_sta = (READ(X_MAX_PIN) == 0); + //endstopx2_sta = (READ(X_MAX_PIN) == 0); endstopy1_sta = (READ(Y_MIN_PIN) == 0); - endstopy2_sta = (READ(Y_MAX_PIN) == 0); + //endstopy2_sta = (READ(Y_MAX_PIN) == 0); endstopz1_sta = (READ(Z_MIN_PIN) == 0); endstopz2_sta = (READ(Z_MAX_PIN) == 0); #endif @@ -66,15 +71,17 @@ void test_gpio_readlevel_H() { WRITE(WIFI_IO0_PIN, LOW); itest = 10000; while (itest--); - pw_det_sta = (READ(POWER_LOSS_PIN) == 1); - pw_off_sta = (READ(PS_ON_PIN) == 1); + pw_det_sta = (READ(MKS_TEST_POWER_LOSS_PIN) == 1); + pw_off_sta = (READ(MKS_TEST_PS_ON_PIN) == 1); mt_det_sta = (READ(MT_DET_1_PIN) == 1); - mt_det2_sta = (READ(MT_DET_2_PIN) == 1); + #if PIN_EXISTS(MT_DET_2) + mt_det2_sta = (READ(MT_DET_2_PIN) == 1); + #endif //mt_det3_sta = (READ(MT_DET_3_PIN) == 1); endstopx1_sta = (READ(X_MIN_PIN) == 1); - endstopx2_sta = (READ(X_MAX_PIN) == 1); + //endstopx2_sta = (READ(X_MAX_PIN) == 1); endstopy1_sta = (READ(Y_MIN_PIN) == 1); - endstopy2_sta = (READ(Y_MAX_PIN) == 1); + //endstopy2_sta = (READ(Y_MAX_PIN) == 1); endstopz1_sta = (READ(Z_MIN_PIN) == 1); endstopz2_sta = (READ(Z_MAX_PIN) == 1); #endif @@ -83,20 +90,22 @@ void test_gpio_readlevel_H() { void init_test_gpio() { #ifdef MKS_TEST SET_INPUT_PULLUP(X_MIN_PIN); - SET_INPUT_PULLUP(X_MAX_PIN); + //SET_INPUT_PULLUP(X_MAX_PIN); SET_INPUT_PULLUP(Y_MIN_PIN); - SET_INPUT_PULLUP(Y_MAX_PIN); + //SET_INPUT_PULLUP(Y_MAX_PIN); SET_INPUT_PULLUP(Z_MIN_PIN); SET_INPUT_PULLUP(Z_MAX_PIN); SET_OUTPUT(WIFI_IO0_PIN); SET_INPUT_PULLUP(MT_DET_1_PIN); - SET_INPUT_PULLUP(MT_DET_2_PIN); + #if PIN_EXISTS(MT_DET_2) + SET_INPUT_PULLUP(MT_DET_2_PIN); + #endif //SET_INPUT_PULLUP(MT_DET_3_PIN); - SET_INPUT_PULLUP(POWER_LOSS_PIN); - SET_INPUT_PULLUP(PS_ON_PIN); + SET_INPUT_PULLUP(MKS_TEST_POWER_LOSS_PIN); + SET_INPUT_PULLUP(MKS_TEST_PS_ON_PIN); SET_INPUT_PULLUP(SERVO0_PIN); @@ -104,14 +113,28 @@ void init_test_gpio() { SET_OUTPUT(Y_ENABLE_PIN); SET_OUTPUT(Z_ENABLE_PIN); SET_OUTPUT(E0_ENABLE_PIN); - SET_OUTPUT(E1_ENABLE_PIN); + #if !MB(MKS_ROBIN_E3P) + SET_OUTPUT(E1_ENABLE_PIN); + #endif WRITE(X_ENABLE_PIN, LOW); WRITE(Y_ENABLE_PIN, LOW); WRITE(Z_ENABLE_PIN, LOW); WRITE(E0_ENABLE_PIN, LOW); - WRITE(E1_ENABLE_PIN, LOW); + #if !MB(MKS_ROBIN_E3P) + WRITE(E1_ENABLE_PIN, LOW); + #endif //WRITE(E2_ENABLE_PIN, LOW); + + #if MB(MKS_ROBIN_E3P) + SET_INPUT_PULLUP(PA1); + SET_INPUT_PULLUP(PA3); + SET_INPUT_PULLUP(PC2); + SET_INPUT_PULLUP(PD8); + SET_INPUT_PULLUP(PE5); + SET_INPUT_PULLUP(PE6); + SET_INPUT_PULLUP(PE7); + #endif #endif } @@ -124,22 +147,37 @@ void mks_test_beeper() { #endif } -void mks_gpio_test(){ +void mks_gpio_test() { #if ENABLED(MKS_TEST) init_test_gpio(); test_gpio_readlevel_L(); test_gpio_readlevel_H(); test_gpio_readlevel_L(); - if ((pw_det_sta == 1) && (mt_det_sta == 1) && (mt_det2_sta == 1)) // &&(mt_det3_sta == 1)) + if ((pw_det_sta == 1) + && (pw_off_sta == 1) + && (mt_det_sta == 1) + #if PIN_EXISTS(MT_DET_2) + && (mt_det2_sta == 1) + #endif + #if MB(MKS_ROBIN_E3P) + && (READ(PA1) == 0) + && (READ(PA3) == 0) + && (READ(PC2) == 0) + && (READ(PD8) == 0) + && (READ(PE5) == 0) + && (READ(PE6) == 0) + && (READ(PE7) == 0) + #endif + ) // &&(mt_det3_sta == 1)) disp_det_ok(); else disp_det_error(); if ( (endstopx1_sta == 1) - && (endstopx2_sta == 1) + //&& (endstopx2_sta == 1) && (endstopy1_sta == 1) - && (endstopy2_sta == 1) + //&& (endstopy2_sta == 1) && (endstopz1_sta == 1) && (endstopz2_sta == 1) ) @@ -149,18 +187,22 @@ void mks_gpio_test(){ #endif } -void mks_hardware_test(){ +void mks_hardware_test() { #if ENABLED(MKS_TEST) if (millis() % 2000 < 1000) { WRITE(X_DIR_PIN, LOW); WRITE(Y_DIR_PIN, LOW); WRITE(Z_DIR_PIN, LOW); WRITE(E0_DIR_PIN, LOW); - WRITE(E1_DIR_PIN, LOW); + #if !MB(MKS_ROBIN_E3P) + WRITE(E1_DIR_PIN, LOW); + #endif //WRITE(E2_DIR_PIN, LOW); thermalManager.fan_speed[0] = 255; //WRITE(HEATER_2_PIN, HIGH); // HE2 - WRITE(HEATER_1_PIN, HIGH); // HE1 + #if !MB(MKS_ROBIN_E3P) + WRITE(HEATER_1_PIN, HIGH); // HE1 + #endif WRITE(HEATER_0_PIN, HIGH); // HE0 WRITE(HEATER_BED_PIN, HIGH); // HOT-BED } @@ -169,11 +211,15 @@ void mks_hardware_test(){ WRITE(Y_DIR_PIN, HIGH); WRITE(Z_DIR_PIN, HIGH); WRITE(E0_DIR_PIN, HIGH); - WRITE(E1_DIR_PIN, HIGH); + #if !MB(MKS_ROBIN_E3P) + WRITE(E1_DIR_PIN, HIGH); + #endif //WRITE(E2_DIR_PIN, HIGH); thermalManager.fan_speed[0] = 0; //WRITE(HEATER_2_PIN, LOW); // HE2 - WRITE(HEATER_1_PIN, LOW); // HE1 + #if !MB(MKS_ROBIN_E3P) + WRITE(HEATER_1_PIN, LOW); // HE1 + #endif WRITE(HEATER_0_PIN, LOW); // HE0 WRITE(HEATER_BED_PIN, LOW); // HOT-BED } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 447303a887..e629915309 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -24,6 +24,7 @@ #if HAS_TFT_LVGL_UI #include "string.h" +#include "draw_ui.h" #include "pic_manager.h" #include "draw_ready_print.h" #include "mks_hardware_test.h" @@ -41,59 +42,61 @@ extern unsigned char bmp_public_buf[17 * 1024]; extern char *createFilename(char * const buffer, const dir_t &p); #endif -static char assets[][LONG_FILENAME_LENGTH] = { +static const char assets[][LONG_FILENAME_LENGTH] = { //homing screen - "bmp_Zero.bin", + "bmp_zeroAll.bin", + "bmp_zero.bin", "bmp_zeroX.bin", "bmp_zeroY.bin", "bmp_zeroZ.bin", "bmp_manual_off.bin", //tool screen - "bmp_PreHeat.bin", - "bmp_Extruct.bin", - "bmp_Mov.bin", + "bmp_preHeat.bin", + "bmp_extruct.bin", + "bmp_mov.bin", // "bmp_Zero.bin", - "bmp_Leveling.bin", + "bmp_leveling.bin", + "bmp_filamentchange.bin", //fan screen "bmp_Add.bin", "bmp_Dec.bin", - "bmp_Speed255.bin", - "bmp_Speed127.bin", - "bmp_Speed0.bin", + "bmp_speed255.bin", + "bmp_speed127.bin", + "bmp_speed0.bin", //preheat screen // "bmp_Add.bin", // "bmp_Dec.bin", - "bmp_Speed0.bin", + "bmp_speed0.bin", // "bmp_Extru2.bin", // "bmp_Extru1.bin", - "bmp_Bed.bin", - "bmp_Step1_degree.bin", - "bmp_Step5_degree.bin", - "bmp_Step10_degree.bin", + "bmp_bed.bin", + "bmp_step1_degree.bin", + "bmp_step5_degree.bin", + "bmp_step10_degree.bin", //extrusion screen - "bmp_In.bin", - "bmp_Out.bin", - "bmp_Extru1.bin", - #if EXTRUDERS > 1 - "bmp_Extru2.bin", + "bmp_in.bin", + "bmp_out.bin", + "bmp_extru1.bin", + #if HAS_MULTI_EXTRUDER + "bmp_extru2.bin", #endif - "bmp_Speed_high.bin", - "bmp_Speed_slow.bin", - "bmp_Speed_normal.bin", - "bmp_Step1_mm.bin", - "bmp_Step5_mm.bin", - "bmp_Step10_mm.bin", + "bmp_speed_high.bin", + "bmp_speed_slow.bin", + "bmp_speed_normal.bin", + "bmp_step1_mm.bin", + "bmp_step5_mm.bin", + "bmp_step10_mm.bin", //select file screen "bmp_pageUp.bin", "bmp_pageDown.bin", - "bmp_Back.bin", //TODO: why two back buttons? Why not just one? (return / back) - "bmp_Dir.bin", - "bmp_File.bin", + "bmp_back.bin", //TODO: why two back buttons? Why not just one? (return / back) + "bmp_dir.bin", + "bmp_file.bin", //move motor screen //TODO: 6 equal icons, just in diffenct rotation... it may be optimized too @@ -103,68 +106,69 @@ static char assets[][LONG_FILENAME_LENGTH] = { "bmp_yDec.bin", "bmp_zAdd.bin", "bmp_zDec.bin", - "bmp_Step_move0_1.bin", - "bmp_Step_move1.bin", - "bmp_Step_move10.bin", + "bmp_step_move0_1.bin", + "bmp_step_move1.bin", + "bmp_step_move10.bin", //operation screen "bmp_auto_off.bin", - "bmp_Speed.bin", + "bmp_speed.bin", //"bmp_Mamual.bin", //TODO: didn't find it.. changed to bmp_manual_off.bin - "bmp_Fan.bin", - //"bmp_PreHeat.bin", - //"bmp_Extruct.bin", - // "bmp_Mov.bin", + "bmp_fan.bin", + "bmp_temp.bin", + "bmp_extrude_opr.bin", + "bmp_move_opr.bin", //change speed screen - "bmp_Step1_percent.bin", - "bmp_Step5_percent.bin", - "bmp_Step10_percent.bin", + "bmp_step1_percent.bin", + "bmp_step5_percent.bin", + "bmp_step10_percent.bin", "bmp_extruct_sel.bin", "bmp_mov_changespeed.bin", // "bmp_extrude_opr.bin", equal to "bmp_Extruct.bin" "bmp_mov_sel.bin", + "bmp_speed_extruct.bin", //printing screen - "bmp_Pause.bin", - "bmp_Resume.bin", - "bmp_Stop.bin", - "bmp_Ext1_state.bin", - #if EXTRUDERS > 1 - "bmp_Ext2_state.bin", + "bmp_pause.bin", + "bmp_resume.bin", + "bmp_stop.bin", + "bmp_ext1_state.bin", + #if HAS_MULTI_EXTRUDER + "bmp_ext2_state.bin", #endif - "bmp_Bed_state.bin", - "bmp_Fan_state.bin", - "bmp_Time_state.bin", - "bmp_Zpos_state.bin", - "bmp_Operate.bin", + "bmp_bed_state.bin", + "bmp_fan_state.bin", + "bmp_time_state.bin", + "bmp_zpos_state.bin", + "bmp_operate.bin", //manual leval screen (only if disabled auto level) #if DISABLED(AUTO_BED_LEVELING_BILINEAR) - "bmp_Leveling1.bin", - "bmp_Leveling2.bin", - "bmp_Leveling3.bin", - "bmp_Leveling4.bin", - "bmp_Leveling5.bin", + "bmp_leveling1.bin", + "bmp_leveling2.bin", + "bmp_leveling3.bin", + "bmp_leveling4.bin", + "bmp_leveling5.bin", #endif //lang select screen #if HAS_LANG_SELECT_SCREEN - "bmp_Language.bin", + "bmp_language.bin", "bmp_simplified_cn.bin", "bmp_simplified_cn_sel.bin", "bmp_traditional_cn.bin", "bmp_traditional_cn_sel.bin", - "bmp_English.bin", - "bmp_English_sel.bin", - "bmp_Russian.bin", - "bmp_Russian_sel.bin", - "bmp_Spanish.bin", - "bmp_Spanish_sel.bin", - "bmp_French.bin", - "bmp_French_sel.bin", - "bmp_Italy.bin", - "bmp_Italy_sel.bin", + "bmp_english.bin", + "bmp_english_sel.bin", + "bmp_russian.bin", + "bmp_russian_sel.bin", + "bmp_spanish.bin", + "bmp_spanish_sel.bin", + "bmp_french.bin", + "bmp_french_sel.bin", + "bmp_italy.bin", + "bmp_italy_sel.bin", #endif // HAS_LANG_SELECT_SCREEN // gcode preview @@ -177,21 +181,15 @@ static char assets[][LONG_FILENAME_LENGTH] = { #endif // settings screen - "bmp_About.bin", + "bmp_about.bin", //"bmp_Language.bin", //"bmp_Fan.bin", //"bmp_manual_off.bin", //start screen "bmp_printing.bin", - "bmp_Set.bin", - "bmp_Tool.bin", - - #if ENABLED(HAS_STEALTHCHOP) - //"bmp_back70x40.bin", - "bmp_disable.bin", - "bmp_enable.bin", - #endif + "bmp_set.bin", + "bmp_tool.bin", // settings screen "bmp_eeprom_settings.bin", @@ -202,14 +200,27 @@ static char assets[][LONG_FILENAME_LENGTH] = { "bmp_arrow.bin", "bmp_back70x40.bin", "bmp_value_blank.bin", - "bmp_Return.bin" + "bmp_blank_sel.bin", + "bmp_disable.bin", + "bmp_enable.bin", + "bmp_return.bin", + + #if ENABLED(USE_WIFI_FUNCTION) + //wifi screen + "bmp_wifi.bin", + #endif + + //babystep screen + "bmp_baby_move0_01.bin", + "bmp_baby_move0_05.bin", + "bmp_baby_move0_1.bin" }; #if HAS_SPI_FLASH_FONT static char fonts[][LONG_FILENAME_LENGTH] = { "FontUNIGBK.bin" }; #endif -static uint8_t currentFlashPage = 0; +uint8_t currentFlashPage = 0; uint32_t lv_get_pic_addr(uint8_t *Pname) { uint8_t Pic_cnt; @@ -253,8 +264,13 @@ const char *bakPath = "_assets"; void spiFlashErase_PIC() { volatile uint32_t pic_sectorcnt = 0; W25QXX.init(SPI_QUARTER_SPEED); - for (pic_sectorcnt = 0; pic_sectorcnt < PIC_SIZE_xM * 1024 / 64; pic_sectorcnt++) - W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024); + //erase 0x001000 -64K + for (pic_sectorcnt = 0; pic_sectorcnt < (64 - 4) / 4; pic_sectorcnt++) { + W25QXX.SPI_FLASH_SectorErase(PICINFOADDR + pic_sectorcnt * 4 * 1024); + } + //erase 64K -- 6M + for (pic_sectorcnt = 0; pic_sectorcnt < (PIC_SIZE_xM * 1024 / 64 - 1); pic_sectorcnt++) + W25QXX.SPI_FLASH_BlockErase((pic_sectorcnt + 1) * 64 * 1024); } #if HAS_SPI_FLASH_FONT diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 24b2945d73..b1bd88a60d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -21,7 +21,7 @@ */ #pragma once -#include "../../../../inc/MarlinConfig.h" +#include "../../../../inc/MarlinConfigPre.h" #include "../../../../libs/W25Qxx.h" @@ -119,9 +119,18 @@ // Flash flag #define REFLSHE_FLGA_ADD (0X800000-32) -#define FLASH_INF_VALID_FLAG 0xAA558761 + // SD card information first addr #define VAR_INF_ADDR 0x000000 +#define FLASH_INF_VALID_FLAG 0x20200831 + +//Store some gcode commands, such as auto leveling commands +#define GCODE_COMMAND_ADDR VAR_INF_ADDR + 3*1024 +#define AUTO_LEVELING_COMMAND_ADDR GCODE_COMMAND_ADDR +#define OTHERS_COMMAND_ADDR_1 AUTO_LEVELING_COMMAND_ADDR + 100 +#define OTHERS_COMMAND_ADDR_2 OTHERS_COMMAND_ADDR_1 + 100 +#define OTHERS_COMMAND_ADDR_3 OTHERS_COMMAND_ADDR_2 + 100 +#define OTHERS_COMMAND_ADDR_4 OTHERS_COMMAND_ADDR_3 + 100 #ifdef __cplusplus extern "C" { /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 2d03373a7f..0e4526734c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -53,6 +53,11 @@ void printer_state_polling() { planner.synchronize(); gcode.process_subcommands_now_P(PSTR("M25")); + + //save the positon + uiCfg.current_x_position_bak = current_position.x; + uiCfg.current_y_position_bak = current_position.y; + if (gCfgItems.pausePosZ != (float)-1) { gcode.process_subcommands_now_P(PSTR("G91")); ZERO(public_buf_l); @@ -66,6 +71,7 @@ void printer_state_polling() { gcode.process_subcommands_now(public_buf_l); } uiCfg.print_state = PAUSED; + uiCfg.current_e_position_bak = current_position.e; // #if ENABLED(POWER_LOSS_RECOVERY) // if (recovery.enabled) recovery.save(true); @@ -83,7 +89,19 @@ void printer_state_polling() { if (uiCfg.print_state == RESUMING) { if (IS_SD_PAUSED()) { - gcode.process_subcommands_now_P(PSTR("M24\nG91\nG1 Z-5\nG90")); + if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("G1 X%.1f Y%.1f"), uiCfg.current_x_position_bak, uiCfg.current_y_position_bak); + gcode.process_subcommands_now(public_buf_m); + } + if (gCfgItems.pausePosZ != (float)-1) { + gcode.process_subcommands_now_P(PSTR("G91")); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); + gcode.process_subcommands_now(public_buf_l); + gcode.process_subcommands_now_P(PSTR("G90")); + } + gcode.process_subcommands_now_P(PSTR("M24")); uiCfg.print_state = WORKING; start_print_time(); @@ -108,11 +126,25 @@ void printer_state_polling() { } #endif - if (gCfgItems.pause_reprint == 1) { - gcode.process_subcommands_now_P(PSTR("G91\nG1 Z-5\nG90")); - } recovery.resume(); + #if 0 + // Move back to the saved XY + char str_1[16], str_2[16]; + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("G1 X%s Y%s F2000"), + dtostrf(recovery.info.current_position.x, 1, 3, str_1), + dtostrf(recovery.info.current_position.y, 1, 3, str_2) + ); + gcode.process_subcommands_now(public_buf_m); + if ((gCfgItems.pause_reprint) == 1 && (gCfgItems.pausePosZ != (float)-1)) { + gcode.process_subcommands_now_P(PSTR("G91")); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); + gcode.process_subcommands_now(public_buf_l); + gcode.process_subcommands_now_P(PSTR("G90")); + } + #endif uiCfg.print_state = WORKING; start_print_time(); @@ -123,6 +155,8 @@ void printer_state_polling() { if (uiCfg.print_state == WORKING) filament_check(); + + TERN_(USE_WIFI_FUNCTION, wifi_looping()); } void filament_pin_setup() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 54e06f5826..fa8d5a52a4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -46,8 +46,8 @@ #define MACHINE_PARA_TITLE_EN "Config" #define MACHINE_TYPE_CNOFIG_EN "Machine settings" -#define TEMPERATURE_CONFIG_EN "Temperature settings" #define MOTOR_CONFIG_EN "Motor settings" +#define MACHINE_LEVELING_CONFIG_EN "Leveling settings" #define ADVANCE_CONFIG_EN "Adavance settings" #define MACHINE_CONFIG_TITLE_EN "Machine Settings" @@ -56,7 +56,6 @@ #define MACHINE_HOMEDIR_EN "Home direction" #define MACHINE_ENDSTOP_TYPE_EN "Endstop type" #define MACHINE_FILAMENT_CONFIG_EN "Filament settings" -#define MACHINE_LEVELING_CONFIG_EN "Leveling settings" #define MACHINE_TYPE_CONFIG_TITLE_EN "Machine Settings>Machine type" #define MACHINE_TYPE_XYZ_EN "XYZ Machine" @@ -91,18 +90,18 @@ #define ENDSTOP_OPENED_EN "Open" #define ENDSTOP_CLOSED_EN "Close" -#define FILAMENT_CONF_TITLE_EN "Filament settings" -#define FILAMENT_IN_TEMPERATURE_EN "Load temperature" +#define FILAMENT_CONF_TITLE_EN "Machine Settings>Filament settings" #define FILAMENT_IN_LENGTH_EN "Load length" #define FILAMENT_IN_SPEED_EN "Load speed" -#define FILAMENT_OUT_TEMPERATURE_EN "Unload temperature" +#define FILAMENT_TEMPERATURE_EN "Filament temperature" #define FILAMENT_OUT_LENGTH_EN "Unload length" #define FILAMENT_OUT_SPEED_EN "Unload speed" -#define LEVELING_CONF_TITLE_EN "Leveling settings" +#define LEVELING_CONF_TITLE_EN "Machine Settings>Leveling settings" #define LEVELING_PARA_CONF_EN "Leveling settings" -#define LEVELING_DELTA_EN "delta machine leveling" -#define LEVELING_XYZ_EN "Manual leveling coordinate settings" +#define LEVELING_MANUAL_POS_EN "Manual leveling coordinate settings" +#define LEVELING_AUTO_COMMAND_EN "AutoLeveling command settings" +#define LEVELING_AUTO_ZOFFSET_EN "Nozzle-to-probe offsets settings" #define LEVELING_PARA_CONF_TITLE_EN "leveling setting" #define AUTO_LEVELING_ENABLE_EN "Enable auto leveling" @@ -226,6 +225,9 @@ #define HAVE_UPS_EN "Has UPS power supply" #define Z2_AND_Z2ENDSTOP_CONF_EN "Z2 Settings" #define ENABLE_PINS_CONF_EN "Enable pins level settings" +#define WIFI_SETTINGS_EN "Wi-Fi parameter settings" +#define HOMING_SENSITIVITY_CONF_EN "Homing sensitivity settings" +#define ENCODER_SETTINGS_EN "Rotary encoder settings" #define Z2_AND_Z2ENDSTOP_CONF_TITLE_EN "Z2 Settings" #define Z2_ENABLE_EN "Z2 Enable" @@ -243,6 +245,29 @@ #define PAUSE_POSITION_Y_EN "Y axis position (Absolute position,-1 invalid)" #define PAUSE_POSITION_Z_EN "Z axis position (Relative position,-1 invalid)" +#define WIFI_SETTINGS_TITLE_EN "Machine Settings>Wi-Fi Parameter" +#define WIFI_SETTINGS_MODE_EN "Wi-Fi Mode" +#define WIFI_SETTINGS_NAME_EN "Wi-Fi Name: " +#define WIFI_SETTINGS_PASSWORD_EN "Wi-Fi Password: " +#define WIFI_SETTINGS_CLOUD_EN "Do you use cloud services?" +#define WIFI_SETTINGS_CONFIG_EN "Config" +#define WIFI_SETTINGS_EDIT_EN "Edit" +#define WIFI_CONFIG_TIPS_EN "Wi-Fi configuration?" + +#define OFFSET_TITLE_EN "Machine Settings>Offset" +#define OFFSET_X_EN "X offset" +#define OFFSET_Y_EN "Y offset" +#define OFFSET_Z_EN "Z offset" + +#define HOMING_SENSITIVITY_CONF_TITLE_EN "Machine Settings>Sensitivity" +#define X_SENSITIVITY_EN "X Axis Sensitivity" +#define Y_SENSITIVITY_EN "Y Axis Sensitivity" +#define Z_SENSITIVITY_EN "Z Axis Sensitivity" +#define Z2_SENSITIVITY_EN "Z2 Axis Sensitivity" + +#define ENCODER_CONF_TITLE_EN "Machine Settings>Rotary encoder settings" +#define ENCODER_CONF_TEXT_EN "Is the encoder function used?" + #define TOOL_TEXT_EN "Tool" #define PREHEAT_TEXT_EN "Preheat" #define MOVE_TEXT_EN "Move" @@ -429,10 +454,6 @@ #define STEP_5PERCENT_EN "5%" #define STEP_10PERCENT_EN "10%" -#define ZOFFSET_EN "Z Offset" -#define ZOFFSET_INC_EN "Add" -#define ZOFFSET_DEC_EN "Dec" - #define TITLE_READYPRINT_EN "ReadyPrint" #define TITLE_PREHEAT_EN "Preheat" #define TITLE_MOVE_EN "Move" @@ -455,7 +476,6 @@ #define TITLE_CLOUD_TEXT_EN "Cloud" #define TITLE_DIALOG_CONFIRM_EN "Confirm" #define TITLE_FILESYS_EN "FileSys" -#define TITLE_ZOFFSET_EN "Z Offset" #define AUTO_SHUTDOWN_EN "Auto" #define MANUAL_SHUTDOWN_EN "Manual" @@ -494,11 +514,9 @@ #define TEXT_WIFI_SYMBOL_EN "#+=" #define TEXT_WIFI_PASSWORD_EN "Password" -#define TEXT_WIFI_POINT_BOLD_EN "`" - -#define TEXT_WIFI_JOINING_EN "Joining\nNetwork..." -#define TEXT_WIFI_FAILED_JOIN_EN "Failed to\nJoin Wi-Fi" -#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi\nConnected" +#define TEXT_WIFI_JOINING_EN "Joining Network..." +#define TEXT_WIFI_FAILED_JOIN_EN "Failed to Join Wi-Fi" +#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi Connected" #define TEXT_BUTTON_DISCONECTED_EN "Disconnect" #define TEXT_WIFI_FORGET_EN "Forget Network" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index 3fe95654b1..6944d6b235 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -208,10 +208,6 @@ #define STEP_5PERCENT_FR "5%" #define STEP_10PERCENT_FR "10%" -#define ZOFFSET_FR "Z Offset" -#define ZOFFSET_INC_FR "Ajouter" -#define ZOFFSET_DEC_FR "Réduire" - #define TITLE_READYPRINT_FR "Prête" #define TITLE_PREHEAT_FR "Préchauffe" #define TITLE_MOVE_FR "Déplace" @@ -234,7 +230,6 @@ #define TITLE_CLOUD_TEXT_FR "Cloud" #define TITLE_DIALOG_CONFIRM_FR "Confirm" #define TITLE_FILESYS_FR "FileSys" -#define TITLE_ZOFFSET_FR "Z Offset" #define DIALOG_CLOSE_MACHINE_FR "Closing machine......" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index aef6cfaf96..f64ca4df79 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -205,10 +205,6 @@ #define STEP_5PERCENT_IT "5%" #define STEP_10PERCENT_IT "10%" -#define ZOFFSET_IT "Z Offset" -#define ZOFFSET_INC_IT "Add" -#define ZOFFSET_DEC_IT "Dec" - #define TITLE_READYPRINT_IT "Pronto" #define TITLE_PREHEAT_IT "Preris" #define TITLE_MOVE_IT "Muovi" @@ -231,7 +227,6 @@ #define TITLE_CLOUD_TEXT_IT "Cloud" #define TITLE_DIALOG_CONFIRM_IT "Confirm" #define TITLE_FILESYS_IT "FileSys" -#define TITLE_ZOFFSET_IT "Z Offset" #define AUTO_SHUTDOWN_IT "Auto" #define MANUAL_SHUTDOWN_IT "Manuale" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index 2ec39ab016..9f695b376b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -205,10 +205,6 @@ #define STEP_5PERCENT_RU "5%" #define STEP_10PERCENT_RU "10%" -#define ZOFFSET_RU "Z Offset" -#define ZOFFSET_INC_RU "добавить" -#define ZOFFSET_DEC_RU "уменьшить" - #define TITLE_READYPRINT_RU "готов к" #define TITLE_PREHEAT_RU "движение" #define TITLE_MOVE_RU "движение" @@ -232,7 +228,6 @@ #define TITLE_CLOUD_TEXT_RU "Cloud" #define TITLE_DIALOG_CONFIRM_RU "Confirm" #define TITLE_FILESYS_RU "FileSys" -#define TITLE_ZOFFSET_RU "Z Offset" #define AUTO_SHUTDOWN_RU "авто-откл" #define MANUAL_SHUTDOWN_RU "ручн-откл" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index ea481c89a2..1189927770 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -31,8 +31,8 @@ #define MACHINE_PARA_TITLE_CN "机器å‚æ•°" #define MACHINE_TYPE_CNOFIG_CN "机器设置" -#define TEMPERATURE_CONFIG_CN "温度设置" #define MOTOR_CONFIG_CN "电机设置" +#define MACHINE_LEVELING_CONFIG_CN "调平设置" #define ADVANCE_CONFIG_CN "高级设置" #define MACHINE_CONFIG_TITLE_CN "机器å‚æ•°>机器é…ç½®" @@ -41,7 +41,6 @@ #define MACHINE_HOMEDIR_CN "归零方å‘" #define MACHINE_ENDSTOP_TYPE_CN "é™ä½å¼€å…³ç±»åž‹" #define MACHINE_FILAMENT_CONFIG_CN "æ¢æ–™è®¾ç½®" -#define MACHINE_LEVELING_CONFIG_CN "调平设置" #define MACHINE_TYPE_CONFIG_TITLE_CN "机器å‚æ•°>机型选择" #define MACHINE_TYPE_XYZ_CN "XYZ机型" @@ -77,17 +76,17 @@ #define ENDSTOP_CLOSED_CN "常闭" #define FILAMENT_CONF_TITLE_CN "æ¢æ–™è®¾ç½®" -#define FILAMENT_IN_TEMPERATURE_CN "进料温度" #define FILAMENT_IN_LENGTH_CN "进料长度" #define FILAMENT_IN_SPEED_CN "进料速度" -#define FILAMENT_OUT_TEMPERATURE_CN "退料温度" +#define FILAMENT_TEMPERATURE_CN "æ¢æ–™æ¸©åº¦" #define FILAMENT_OUT_LENGTH_CN "退料长度" #define FILAMENT_OUT_SPEED_CN "退料速度" -#define LEVELING_CONF_TITLE_CN "调平设置" +#define LEVELING_CONF_TITLE_CN "机器å‚æ•°>调平设置" #define LEVELING_PARA_CONF_CN "调平设置" -#define LEVELING_DELTA_CN "delta机型设置" -#define LEVELING_XYZ_CN "手动调平å标设置" +#define LEVELING_MANUAL_POS_CN "手动调平å标设置" +#define LEVELING_AUTO_COMMAND_CN "自动调平指令设置" +#define LEVELING_AUTO_ZOFFSET_CN "挤出头与调平开关å移设置" #define LEVELING_PARA_CONF_TITLE_CN "调平å‚æ•°" #define AUTO_LEVELING_ENABLE_CN "自动调平" @@ -146,6 +145,7 @@ #define TMC_STEP_MODE_CN "TMC 驱动模å¼è®¾ç½®" #define MOTORDIRCONF_CN "电机方å‘设置" #define HOMEFEEDRATECONF_CN "归零速度设置" +#define HOMING_SENSITIVITY_CONF_CN "æ— é™ä½å›žé›¶çµæ•åº¦è°ƒèŠ‚" #define MAXFEEDRATE_CONF_TITLE_CN "机器å‚æ•°>最大速度" #define X_MAXFEEDRATE_CN "X轴最大速度" @@ -211,6 +211,8 @@ #define HAVE_UPS_CN "机器é…备UPS电æº" #define Z2_AND_Z2ENDSTOP_CONF_CN "åŒZè½´åŒé™ä½åŠŸèƒ½è®¾ç½®" #define ENABLE_PINS_CONF_CN "电机使能脚电平设置" +#define WIFI_SETTINGS_CN "Wi-Fiå‚数设置" +#define ENCODER_SETTINGS_CN "旋钮设置" #define Z2_AND_Z2ENDSTOP_CONF_TITLE_CN "åŒzåŒé™ä½è®¾ç½®" #define Z2_ENABLE_CN "å¯ç”¨Z2è½´" @@ -223,10 +225,33 @@ #define Z_ENABLE_PINS_INVERT_CN "Z轴电机使能电平" #define E_ENABLE_PINS_INVERT_CN "E轴电机使能电平" -#define PAUSE_POSITION_CN "打å°æš‚åœä½ç½®è®¾ç½®" -#define PAUSE_POSITION_X_CN "Xè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" -#define PAUSE_POSITION_Y_CN "Yè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" -#define PAUSE_POSITION_Z_CN "Zè½´æš‚åœä½ç½®(相对ä½ç½®,-1无效)" +#define PAUSE_POSITION_CN "打å°æš‚åœä½ç½®è®¾ç½®" +#define PAUSE_POSITION_X_CN "Xè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" +#define PAUSE_POSITION_Y_CN "Yè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" +#define PAUSE_POSITION_Z_CN "Zè½´æš‚åœä½ç½®(相对ä½ç½®,-1无效)" +#define WIFI_SETTINGS_TITLE_CN "机器å‚æ•°>Wi-Fi设置" +#define WIFI_SETTINGS_MODE_CN "Wi-Fi 模å¼" +#define WIFI_SETTINGS_NAME_CN "Wi-Fi å称: " +#define WIFI_SETTINGS_PASSWORD_CN "Wi-Fi 密ç : " +#define WIFI_SETTINGS_CLOUD_CN "是å¦ä½¿ç”¨äº‘æœåŠ¡?" +#define WIFI_SETTINGS_CONFIG_CN "é…ç½®" +#define WIFI_SETTINGS_EDIT_CN "编辑" +#define WIFI_CONFIG_TIPS_CN "进行Wi-Fié…ç½®?" + +#define OFFSET_TITLE_CN "机器å‚æ•°>å移设置" +#define OFFSET_X_CN "X轴与调平开关å移" +#define OFFSET_Y_CN "Y轴与调平开关å移" +#define OFFSET_Z_CN "Z轴与调平开关å移" + +#define HOMING_SENSITIVITY_CONF_TITLE_CN "机器å‚æ•°>çµæ•åº¦è°ƒèŠ‚" +#define X_SENSITIVITY_CN "Xè½´çµæ•åº¦" +#define Y_SENSITIVITY_CN "Yè½´çµæ•åº¦" +#define Z_SENSITIVITY_CN "Zè½´çµæ•åº¦" +#define Z2_SENSITIVITY_CN "Z2è½´çµæ•åº¦" + +#define ENCODER_CONF_TITLE_CN "机器å‚æ•°>旋钮设置" +#define ENCODER_CONF_TEXT_CN "是å¦ä½¿ç”¨æ—‹é’®åŠŸèƒ½?" + #define TOOL_TEXT_CN "工具" #define PREHEAT_TEXT_CN "预热" #define MOVE_TEXT_CN "移动" @@ -395,10 +420,6 @@ #define STEP_5PERCENT_CN "5%" #define STEP_10PERCENT_CN "10%" -#define ZOFFSET_CN "Z Offset" -#define ZOFFSET_INC_CN "增加" -#define ZOFFSET_DEC_CN "å‡å°‘" - #define TITLE_READYPRINT_CN "准备打å°" #define TITLE_PREHEAT_CN "预热" #define TITLE_MOVE_CN "移动" @@ -421,7 +442,6 @@ #define TITLE_CLOUD_TEXT_CN "云æœåŠ¡" #define TITLE_DIALOG_CONFIRM_CN "确认" #define TITLE_FILESYS_CN "文件系统" -#define TITLE_ZOFFSET_CN "Z Offset" #define AUTO_SHUTDOWN_CN "自动关机" #define MANUAL_SHUTDOWN_CN "手动关机" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 289874c6ba..2babbaba93 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -206,10 +206,6 @@ #define STEP_5PERCENT_SP "5%" #define STEP_10PERCENT_SP "10%" -#define ZOFFSET_SP "Z Offset" -#define ZOFFSET_INC_SP "Más" -#define ZOFFSET_DEC_SP "Menos" - #define TITLE_READYPRINT_SP "Inicio" #define TITLE_PREHEAT_SP "Precalentar" #define TITLE_MOVE_SP "Mover" @@ -233,7 +229,6 @@ #define TITLE_CLOUD_TEXT_SP "Cloud" #define TITLE_DIALOG_CONFIRM_SP "Confirmar" #define TITLE_FILESYS_SP "Puerto" -#define TITLE_ZOFFSET_SP "Z Offset" #define AUTO_SHUTDOWN_SP "Auto" #define MANUAL_SHUTDOWN_SP "manual" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 19bd511d9a..d956e14aad 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -31,8 +31,8 @@ #define MACHINE_PARA_TITLE_T_CN "機器åƒæ•¸" #define MACHINE_TYPE_CNOFIG_T_CN "機器設置" -#define TEMPERATURE_CONFIG_T_CN "溫度設置" #define MOTOR_CONFIG_T_CN "電機設置" +#define MACHINE_LEVELING_CONFIG_T_CN "調平設置" #define ADVANCE_CONFIG_T_CN "高級設置" #define MACHINE_CONFIG_TITLE_T_CN "機器åƒæ•¸>機器é…ç½®" @@ -41,7 +41,6 @@ #define MACHINE_HOMEDIR_T_CN "歸零方å‘" #define MACHINE_ENDSTOP_TYPE_T_CN "é™ä½é–‹é—œé¡žåž‹" #define MACHINE_FILAMENT_CONFIG_T_CN "æ›æ–™è¨­ç½®" -#define MACHINE_LEVELING_CONFIG_T_CN "調平設置" #define MACHINE_TYPE_CONFIG_TITLE_T_CN "機器åƒæ•¸>æ©Ÿåž‹é¸æ“‡" #define MACHINE_TYPE_XYZ_T_CN "XYZæ©Ÿåž‹" @@ -77,17 +76,17 @@ #define ENDSTOP_CLOSED_T_CN "常閉" #define FILAMENT_CONF_TITLE_T_CN "æ›æ–™è¨­ç½®" -#define FILAMENT_IN_TEMPERATURE_T_CN "進料溫度" #define FILAMENT_IN_LENGTH_T_CN "進料長度" #define FILAMENT_IN_SPEED_T_CN "進料速度" -#define FILAMENT_OUT_TEMPERATURE_T_CN "退料溫度" +#define FILAMENT_TEMPERATURE_T_CN "æ›æ–™æº«åº¦" #define FILAMENT_OUT_LENGTH_T_CN "退料長度" #define FILAMENT_OUT_SPEED_T_CN "退料速度" -#define LEVELING_CONF_TITLE_T_CN "調平設置" +#define LEVELING_CONF_TITLE_T_CN "機器åƒæ•¸>調平設置" #define LEVELING_PARA_CONF_T_CN "調平設置" -#define LEVELING_DELTA_T_CN "delta機型設置" -#define LEVELING_XYZ_T_CN "手動調平å標設置" +#define LEVELING_MANUAL_POS_T_CN "手動調平å標設置" +#define LEVELING_AUTO_COMMAND_T_CN "自動調平指令設置" +#define LEVELING_AUTO_ZOFFSET_T_CN "擠出頭與調平開關å移設置" #define LEVELING_PARA_CONF_TITLE_T_CN "調平åƒæ•¸" #define AUTO_LEVELING_ENABLE_T_CN "自動調平" @@ -146,6 +145,7 @@ #define TMC_STEP_MODE_T_CN "TMC 驅動模å¼è¨­ç½®" #define MOTORDIRCONF_T_CN "電機方å‘設置" #define HOMEFEEDRATECONF_T_CN "歸零速度設置" +#define HOMING_SENSITIVITY_CONF_T_CN "ç„¡é™ä½å›žé›¶éˆæ•åº¦èª¿ç¯€" #define MAXFEEDRATE_CONF_TITLE_T_CN "機器åƒæ•¸>最大速度" #define X_MAXFEEDRATE_T_CN "X軸最大速度" @@ -211,6 +211,8 @@ #define HAVE_UPS_T_CN "機器é…å‚™UPS電壓" #define Z2_AND_Z2ENDSTOP_CONF_T_CN "é›™z軸雙é™ä½åŠŸèƒ½è¨­ç½®" #define ENABLE_PINS_CONF_T_CN "電機使能腳電平設置" +#define WIFI_SETTINGS_T_CN "Wi-Fiåƒæ•¸è¨­ç½®" +#define ENCODER_SETTINGS_T_CN "旋鈕設置" #define Z2_AND_Z2ENDSTOP_CONF_TITLE_T_CN "é›™z軸雙é™ä½è¨­ç½®" #define Z2_ENABLE_T_CN "啟用Z2軸" @@ -223,10 +225,32 @@ #define Z_ENABLE_PINS_INVERT_T_CN "Z軸電機使能電平" #define E_ENABLE_PINS_INVERT_T_CN "E軸電機使能電平" -#define PAUSE_POSITION_T_CN "打å°æš«åœä½ç½®è¨­ç½®" -#define PAUSE_POSITION_X_T_CN "X軸暫åœä½ç½®(絕å°ä½ç½®,-1無效)" -#define PAUSE_POSITION_Y_T_CN "Y軸暫åœä½ç½®(絕å°ä½ç½®,-1無效)" -#define PAUSE_POSITION_Z_T_CN "Z軸暫åœä½ç½®(相å°ä½ç½®,-1無效)" +#define PAUSE_POSITION_T_CN "打å°æš«åœä½ç½®è¨­ç½®" +#define PAUSE_POSITION_X_T_CN "X軸暫åœä½ç½®(絕å°ä½ç½®,-1無效)" +#define PAUSE_POSITION_Y_T_CN "Y軸暫åœä½ç½®(絕å°ä½ç½®,-1無效)" +#define PAUSE_POSITION_Z_T_CN "Z軸暫åœä½ç½®(相å°ä½ç½®,-1無效)" +#define WIFI_SETTINGS_TITLE_T_CN "機器åƒæ•¸>Wi-Fi設置" +#define WIFI_SETTINGS_MODE_T_CN "Wi-Fi 模å¼" +#define WIFI_SETTINGS_NAME_T_CN "Wi-Fi å稱: " +#define WIFI_SETTINGS_PASSWORD_T_CN "Wi-Fi 密碼: " +#define WIFI_SETTINGS_CLOUD_T_CN "是å¦ä½¿ç”¨é›²æœå‹™?" +#define WIFI_SETTINGS_CONFIG_T_CN "é…ç½®" +#define WIFI_SETTINGS_EDIT_T_CN "編輯" +#define WIFI_CONFIG_TIPS_T_CN "進行Wi-Fié…ç½®?" + +#define OFFSET_TITLE_T_CN "機器åƒæ•¸>å移設置" +#define OFFSET_X_T_CN "X軸與調平開關å移" +#define OFFSET_Y_T_CN "Y軸與調平開關å移" +#define OFFSET_Z_T_CN "Z軸與調平開關å移" + +#define HOMING_SENSITIVITY_CONF_TITLE_T_CN "機器åƒæ•¸>éˆæ•åº¦èª¿ç¯€" +#define X_SENSITIVITY_T_CN "X軸éˆæ•åº¦" +#define Y_SENSITIVITY_T_CN "Y軸éˆæ•åº¦" +#define Z_SENSITIVITY_T_CN "Z軸éˆæ•åº¦" +#define Z2_SENSITIVITY_T_CN "Z2軸éˆæ•åº¦" + +#define ENCODER_CONF_TITLE_T_CN "機器åƒæ•¸>旋鈕設置" +#define ENCODER_CONF_TEXT_T_CN "是å¦ä½¿ç”¨æ—‹éˆ•åŠŸèƒ½?" #define TOOL_TEXT_T_CN "工具" #define PREHEAT_TEXT_T_CN "é ç†±" @@ -398,10 +422,6 @@ #define STEP_5PERCENT_T_CN "5%%" #define STEP_10PERCENT_T_CN "10%%" -#define ZOFFSET_T_CN "Z Offset" -#define ZOFFSET_INC_T_CN "增加" -#define ZOFFSET_DEC_T_CN "減少" - #define TITLE_READYPRINT_T_CN "準備打å°" #define TITLE_PREHEAT_T_CN "é ç†±" #define TITLE_MOVE_T_CN "移動" @@ -424,7 +444,6 @@ #define TITLE_CLOUD_TEXT_T_CN "雲æœå‹™" #define TITLE_DIALOG_CONFIRM_T_CN "確èª" #define TITLE_FILESYS_T_CN "文件系統" -#define TITLE_ZOFFSET_T_CN "Z Offset" #define AUTO_SHUTDOWN_T_CN "自動關機" #define MANUAL_SHUTDOWN_T_CN "手動關機" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 23072d27c7..af292db7d5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -35,14 +35,18 @@ #include "tft_lvgl_configuration.h" #include "draw_ready_print.h" + #include "pic_manager.h" #include "mks_hardware_test.h" #include "draw_ui.h" +#include "SPIFlashStorage.h" #include +#include "../../../../MarlinCore.h" #include "../../../../inc/MarlinConfig.h" #include HAL_PATH(../../HAL, tft/xpt2046.h) +#include "../../../ultralcd.h" XPT2046 touch; #if ENABLED(POWER_LOSS_RECOVERY) @@ -63,6 +67,7 @@ XPT2046 touch; #endif static lv_disp_buf_t disp_buf; +lv_group_t* g; #if ENABLED(SDSUPPORT) extern void UpdateAssets(); #endif @@ -89,306 +94,349 @@ extern uint8_t sel_id; extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg; +uint8_t bmp_public_buf[17 * 1024]; + void SysTick_Callback() { lv_tick_inc(1); print_time_count(); + #if ENABLED(USE_WIFI_FUNCTION) + if (tips_disp.timer == TIPS_TIMER_START) { + tips_disp.timer_count++; + } + #endif + if (uiCfg.filament_loading_time_flg == 1) { + uiCfg.filament_loading_time_cnt++; + uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_loading_time_cnt / (uiCfg.filament_loading_time * 1000.0)) * 100.0) + 0.5); + if (uiCfg.filament_loading_time_cnt >= (uiCfg.filament_loading_time * 1000)) { + uiCfg.filament_loading_time_cnt = 0; + uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_completed = 1; + } + } + if (uiCfg.filament_unloading_time_flg == 1) { + uiCfg.filament_unloading_time_cnt++; + uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_unloading_time_cnt / (uiCfg.filament_unloading_time * 1000.0)) * 100.0) + 0.5); + if (uiCfg.filament_unloading_time_cnt >= (uiCfg.filament_unloading_time * 1000)) { + uiCfg.filament_unloading_time_cnt = 0; + uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_completed = 1; + uiCfg.filament_rate = 100; + } + } } #if DISABLED(TFT_LVGL_UI_SPI) -extern void LCD_IO_Init(uint8_t cs, uint8_t rs); -extern void LCD_IO_WriteData(uint16_t RegValue); -extern void LCD_IO_WriteReg(uint16_t Reg); - -extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); -void tft_set_cursor(uint16_t x, uint16_t y) { - LCD_IO_WriteReg(0x002A); - LCD_IO_WriteData(x >> 8); - LCD_IO_WriteData(x & 0x00FF); - LCD_IO_WriteData(x >> 8); - LCD_IO_WriteData(x & 0x00FF); - //ILI9488_WriteData(0x01); - //ILI9488_WriteData(0xDF); - LCD_IO_WriteReg(0x002B); - LCD_IO_WriteData(y >> 8); - LCD_IO_WriteData(y & 0x00FF); - LCD_IO_WriteData(y >> 8); - LCD_IO_WriteData(y & 0x00FF); - //ILI9488_WriteData(0x01); - //ILI9488_WriteData(0x3F); -} - -void LCD_WriteRAM_Prepare(void) { - #if 0 - switch (DeviceCode) { - case 0x9325: case 0x9328: case 0x8989: { - ClrCs - LCD->LCD_REG = R34; - SetCs - } break; - default: LCD_WrtReg(0x002C); - } - #else - LCD_IO_WriteReg(0x002C); - #endif -} - -void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { - //if (DeviceCode == 0x9488) { - if (x > (TFT_WIDTH) || y > (TFT_HEIGHT)) return; - //} - tft_set_cursor(x, y); - - LCD_WriteRAM_Prepare(); - //LCD_WriteRAM(point); - LCD_IO_WriteData(point); -} - -void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) { - /* Write 16-bit Index, then Write Reg */ - ClrCs - LCD_IO_WriteReg(LCD_Reg); - /* Write 16-bit Reg */ - LCD_IO_WriteData(LCD_RegValue); - SetCs -} - -void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh) { - uint16_t s_h, s_l, e_h, e_l; - uint16_t xEnd, yEnd; - xEnd = StartX + width; - yEnd = StartY + heigh - 1; - if (DeviceCode == 0x8989) { - /*LCD_WriteReg(0x0044, (StartX & 0xFF) | (xEnd << 8)); - LCD_WriteReg(0x0045, StartY); - LCD_WriteReg(0x0046, yEnd);*/ - LCD_WriteReg(0x0044, (StartY & 0xFF) | (yEnd << 8)); - LCD_WriteReg(0x0045, StartX); - LCD_WriteReg(0x0046, xEnd); - } - else if (DeviceCode == 0x9488) { - s_h = (StartX >> 8) & 0x00ff; - s_l = StartX & 0x00ff; - e_h = ((StartX + width - 1) >> 8) & 0x00ff; - e_l = (StartX + width - 1) & 0x00ff; + extern void LCD_IO_Init(uint8_t cs, uint8_t rs); + extern void LCD_IO_WriteData(uint16_t RegValue); + extern void LCD_IO_WriteReg(uint16_t Reg); + extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); + void tft_set_cursor(uint16_t x, uint16_t y) { LCD_IO_WriteReg(0x002A); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - - s_h = (StartY >> 8) & 0x00ff; - s_l = StartY & 0x00ff; - e_h = ((StartY + heigh - 1) >> 8) & 0x00ff; - e_l = (StartY + heigh - 1) & 0x00ff; - + LCD_IO_WriteData(x >> 8); + LCD_IO_WriteData(x & 0x00FF); + LCD_IO_WriteData(x >> 8); + LCD_IO_WriteData(x & 0x00FF); + //ILI9488_WriteData(0x01); + //ILI9488_WriteData(0xDF); LCD_IO_WriteReg(0x002B); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); + LCD_IO_WriteData(y >> 8); + LCD_IO_WriteData(y & 0x00FF); + LCD_IO_WriteData(y >> 8); + LCD_IO_WriteData(y & 0x00FF); + //ILI9488_WriteData(0x01); + //ILI9488_WriteData(0x3F); } - else if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x1505)) { - /* LCD_WriteReg(0x0050, StartX); - LCD_WriteReg(0x0052, StartY); - LCD_WriteReg(0x0051, xEnd); - LCD_WriteReg(0x0053, yEnd);*/ - LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit - LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit - LCD_WriteReg(0x0052, (TFT_HEIGHT) - xEnd); - LCD_WriteReg(0x0053, (TFT_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit - } - else { - s_h = (StartX >> 8) & 0xFF; - s_l = StartX & 0xFF; - e_h = ((StartX + width - 1) >> 8) & 0xFF; - e_l = (StartX + width - 1) & 0xFF; - - LCD_IO_WriteReg(0x2A); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - - s_h = (StartY >> 8) & 0xFF; - s_l = StartY & 0xFF; - e_h = ((StartY + heigh - 1) >> 8) & 0xFF; - e_l = (StartY + heigh - 1) & 0xFF; - - LCD_IO_WriteReg(0x2B); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - } -} - -void LCD_Clear(uint16_t Color) { - uint32_t index = 0; - unsigned int count; - - if (DeviceCode == 0x9488) { - tft_set_cursor(0, 0); - ili9320_SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); - LCD_WriteRAM_Prepare(); - #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); + void LCD_WriteRAM_Prepare(void) { + #if 0 + switch (DeviceCode) { + case 0x9325: case 0x9328: case 0x8989: { + ClrCs + LCD->LCD_REG = R34; + SetCs + } break; + default: LCD_WrtReg(0x002C); + } #else - //index = (TFT_HEIGHT) / 2 * (TFT_WIDTH); - for (index = 0; index < (TFT_HEIGHT) * (TFT_WIDTH); index++) - LCD_IO_WriteData(Color); + LCD_IO_WriteReg(0x002C); #endif - //LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); - //while(index --) LCD_IO_WriteData(Color); } - else if (DeviceCode == 0x5761) { - LCD_IO_WriteReg(0x002a); - LCD_IO_WriteData(0); - LCD_IO_WriteData(0); - LCD_IO_WriteData(HDP >> 8); - LCD_IO_WriteData(HDP & 0x00ff); - LCD_IO_WriteReg(0x002b); - LCD_IO_WriteData(0); - LCD_IO_WriteData(0); - LCD_IO_WriteData(VDP >> 8); - LCD_IO_WriteData(VDP & 0x00ff); - LCD_IO_WriteReg(0x002c); - LCD_IO_WriteReg(0x002c); - for (count = 0; count < (HDP + 1) * (VDP + 1); count++) - LCD_IO_WriteData(Color); - } - else { - tft_set_cursor(0, 0); - LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ - for (index = 0; index < 76800; index++) - LCD_IO_WriteData(Color); - } -} -#include HAL_PATH(../../HAL, tft/tft_fsmc.h) -extern TFT_IO tftio; -void init_tft() { - uint16_t i; - - TERN_(HAS_LCD_CONTRAST, refresh_contrast()); - - #ifdef LCD_USE_DMA_FSMC - dma_init(FSMC_DMA_DEV); - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); - #endif - - LCD_IO_Init(FSMC_CS_PIN, FSMC_RS_PIN); - - _delay_ms(5); - - DeviceCode = tftio.GetID() & 0xFFFF; - // Chitu and others - if (DeviceCode == 0x8066) DeviceCode = 0x9488; - - if (DeviceCode == 0x9488) { - LCD_IO_WriteReg(0x00E0); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x000f); - LCD_IO_WriteData(0x000D); - LCD_IO_WriteData(0x001B); - LCD_IO_WriteData(0x000A); - LCD_IO_WriteData(0x003c); - LCD_IO_WriteData(0x0078); - LCD_IO_WriteData(0x004A); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x000E); - LCD_IO_WriteData(0x0009); - LCD_IO_WriteData(0x001B); - LCD_IO_WriteData(0x001e); - LCD_IO_WriteData(0x000f); - - LCD_IO_WriteReg(0x00E1); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0022); - LCD_IO_WriteData(0x0024); - LCD_IO_WriteData(0x0006); - LCD_IO_WriteData(0x0012); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x0036); - LCD_IO_WriteData(0x0047); - LCD_IO_WriteData(0x0047); - LCD_IO_WriteData(0x0006); - LCD_IO_WriteData(0x000a); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x0030); - LCD_IO_WriteData(0x0037); - LCD_IO_WriteData(0x000f); - - LCD_IO_WriteReg(0x00C0); - LCD_IO_WriteData(0x0010); - LCD_IO_WriteData(0x0010); - - LCD_IO_WriteReg(0x00C1); - LCD_IO_WriteData(0x0041); - - LCD_IO_WriteReg(0x00C5); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0022); - LCD_IO_WriteData(0x0080); - - LCD_IO_WriteReg(0x0036); - //ILI9488_WriteData(0x0068); - //if (gCfgItems.overturn_180 != 0xEE) { - LCD_IO_WriteData(0x0068); - //} - //else { - //ILI9488_WriteData(0x00A8); + void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { + //if (DeviceCode == 0x9488) { + if (x > (TFT_WIDTH) || y > (TFT_HEIGHT)) return; //} + tft_set_cursor(x, y); - LCD_IO_WriteReg(0x003A); //Interface Mode Control - LCD_IO_WriteData(0x0055); - - LCD_IO_WriteReg(0x00B0); //Interface Mode Control - LCD_IO_WriteData(0x0000); - LCD_IO_WriteReg(0x00B1); //Frame rate 70HZ - LCD_IO_WriteData(0x00B0); - LCD_IO_WriteData(0x0011); - LCD_IO_WriteReg(0x00B4); - LCD_IO_WriteData(0x0002); - LCD_IO_WriteReg(0x00B6); //RGB/MCU Interface Control - LCD_IO_WriteData(0x0002); - LCD_IO_WriteData(0x0042); - - LCD_IO_WriteReg(0x00B7); - LCD_IO_WriteData(0x00C6); - - //WriteComm(0xBE); - //WriteData(0x00); - //WriteData(0x04); - - LCD_IO_WriteReg(0x00E9); - LCD_IO_WriteData(0x0000); - - LCD_IO_WriteReg(0x00F7); - LCD_IO_WriteData(0x00A9); - LCD_IO_WriteData(0x0051); - LCD_IO_WriteData(0x002C); - LCD_IO_WriteData(0x0082); - - LCD_IO_WriteReg(0x0011); - for (i = 0; i < 65535; i++); - LCD_IO_WriteReg(0x0029); - - ili9320_SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); - LCD_Clear(0x0000); - - OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); + LCD_WriteRAM_Prepare(); + //LCD_WriteRAM(point); + LCD_IO_WriteData(point); + } + + void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) { + /* Write 16-bit Index, then Write Reg */ + ClrCs + LCD_IO_WriteReg(LCD_Reg); + /* Write 16-bit Reg */ + LCD_IO_WriteData(LCD_RegValue); + SetCs + } + + void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh) { + uint16_t s_h, s_l, e_h, e_l; + uint16_t xEnd, yEnd; + xEnd = StartX + width; + yEnd = StartY + heigh - 1; + if (DeviceCode == 0x8989) { + /*LCD_WriteReg(0x0044, (StartX & 0xFF) | (xEnd << 8)); + LCD_WriteReg(0x0045, StartY); + LCD_WriteReg(0x0046, yEnd);*/ + LCD_WriteReg(0x0044, (StartY & 0xFF) | (yEnd << 8)); + LCD_WriteReg(0x0045, StartX); + LCD_WriteReg(0x0046, xEnd); + } + else if (DeviceCode == 0x9488) { + s_h = (StartX >> 8) & 0x00ff; + s_l = StartX & 0x00ff; + e_h = ((StartX + width - 1) >> 8) & 0x00ff; + e_l = (StartX + width - 1) & 0x00ff; + + LCD_IO_WriteReg(0x002A); + LCD_IO_WriteData(s_h); + LCD_IO_WriteData(s_l); + LCD_IO_WriteData(e_h); + LCD_IO_WriteData(e_l); + + s_h = (StartY >> 8) & 0x00ff; + s_l = StartY & 0x00ff; + e_h = ((StartY + heigh - 1) >> 8) & 0x00ff; + e_l = (StartY + heigh - 1) & 0x00ff; + + LCD_IO_WriteReg(0x002B); + LCD_IO_WriteData(s_h); + LCD_IO_WriteData(s_l); + LCD_IO_WriteData(e_h); + LCD_IO_WriteData(e_l); + } + else if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x1505)) { + /* LCD_WriteReg(0x0050, StartX); + LCD_WriteReg(0x0052, StartY); + LCD_WriteReg(0x0051, xEnd); + LCD_WriteReg(0x0053, yEnd);*/ + LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit + LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0052, (TFT_HEIGHT) - xEnd); + LCD_WriteReg(0x0053, (TFT_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit + + } + else { + s_h = (StartX >> 8) & 0xFF; + s_l = StartX & 0xFF; + e_h = ((StartX + width - 1) >> 8) & 0xFF; + e_l = (StartX + width - 1) & 0xFF; + + LCD_IO_WriteReg(0x2A); + LCD_IO_WriteData(s_h); + LCD_IO_WriteData(s_l); + LCD_IO_WriteData(e_h); + LCD_IO_WriteData(e_l); + + s_h = (StartY >> 8) & 0xFF; + s_l = StartY & 0xFF; + e_h = ((StartY + heigh - 1) >> 8) & 0xFF; + e_l = (StartY + heigh - 1) & 0xFF; + + LCD_IO_WriteReg(0x2B); + LCD_IO_WriteData(s_h); + LCD_IO_WriteData(s_l); + LCD_IO_WriteData(e_h); + LCD_IO_WriteData(e_l); + } + } + + void LCD_Clear(uint16_t Color) { + uint32_t index = 0; + unsigned int count; + + if (DeviceCode == 0x9488) { + tft_set_cursor(0, 0); + LCD_setWindowArea(0, 0, TFT_WIDTH, TFT_HEIGHT); + LCD_WriteRAM_Prepare(); + #ifdef LCD_USE_DMA_FSMC + LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); + #else + //index = (TFT_HEIGHT) / 2 * (TFT_WIDTH); + for (index = 0; index < (TFT_HEIGHT) * (TFT_WIDTH); index++) + LCD_IO_WriteData(Color); + #endif + //LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); + //while(index --) LCD_IO_WriteData(Color); + } + else if (DeviceCode == 0x5761) { + LCD_IO_WriteReg(0x002a); + LCD_IO_WriteData(0); + LCD_IO_WriteData(0); + LCD_IO_WriteData(HDP >> 8); + LCD_IO_WriteData(HDP & 0x00ff); + LCD_IO_WriteReg(0x002b); + LCD_IO_WriteData(0); + LCD_IO_WriteData(0); + LCD_IO_WriteData(VDP >> 8); + LCD_IO_WriteData(VDP & 0x00ff); + LCD_IO_WriteReg(0x002c); + LCD_IO_WriteReg(0x002c); + for (count = 0; count < (HDP + 1) * (VDP + 1); count++) + LCD_IO_WriteData(Color); + } + else { + tft_set_cursor(0, 0); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + for (index = 0; index < 76800; index++) + LCD_IO_WriteData(Color); + } + } + + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) + extern TFT_IO tftio; + void fsmc_tft_init() { + uint16_t i; + + TERN_(HAS_LCD_CONTRAST, refresh_contrast()); + + #ifdef LCD_USE_DMA_FSMC + dma_init(FSMC_DMA_DEV); + dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); + #endif + + LCD_IO_Init(FSMC_CS_PIN, FSMC_RS_PIN); + + _delay_ms(5); + + DeviceCode = tftio.GetID() & 0xFFFF; + // Chitu and others + if (DeviceCode == 0x8066) DeviceCode = 0x9488; + + if (DeviceCode == 0x9488) { + LCD_IO_WriteReg(0x00E0); + LCD_IO_WriteData(0x0000); + LCD_IO_WriteData(0x0007); + LCD_IO_WriteData(0x000f); + LCD_IO_WriteData(0x000D); + LCD_IO_WriteData(0x001B); + LCD_IO_WriteData(0x000A); + LCD_IO_WriteData(0x003c); + LCD_IO_WriteData(0x0078); + LCD_IO_WriteData(0x004A); + LCD_IO_WriteData(0x0007); + LCD_IO_WriteData(0x000E); + LCD_IO_WriteData(0x0009); + LCD_IO_WriteData(0x001B); + LCD_IO_WriteData(0x001e); + LCD_IO_WriteData(0x000f); + + LCD_IO_WriteReg(0x00E1); + LCD_IO_WriteData(0x0000); + LCD_IO_WriteData(0x0022); + LCD_IO_WriteData(0x0024); + LCD_IO_WriteData(0x0006); + LCD_IO_WriteData(0x0012); + LCD_IO_WriteData(0x0007); + LCD_IO_WriteData(0x0036); + LCD_IO_WriteData(0x0047); + LCD_IO_WriteData(0x0047); + LCD_IO_WriteData(0x0006); + LCD_IO_WriteData(0x000a); + LCD_IO_WriteData(0x0007); + LCD_IO_WriteData(0x0030); + LCD_IO_WriteData(0x0037); + LCD_IO_WriteData(0x000f); + + LCD_IO_WriteReg(0x00C0); + LCD_IO_WriteData(0x0010); + LCD_IO_WriteData(0x0010); + + LCD_IO_WriteReg(0x00C1); + LCD_IO_WriteData(0x0041); + + LCD_IO_WriteReg(0x00C5); + LCD_IO_WriteData(0x0000); + LCD_IO_WriteData(0x0022); + LCD_IO_WriteData(0x0080); + + LCD_IO_WriteReg(0x0036); + LCD_IO_WriteData(TERN(GRAPHICAL_TFT_ROTATE_180, 0xE8, 0x0068)); + + LCD_IO_WriteReg(0x003A); //Interface Mode Control + LCD_IO_WriteData(0x0055); + + LCD_IO_WriteReg(0x00B0); //Interface Mode Control + LCD_IO_WriteData(0x0000); + LCD_IO_WriteReg(0x00B1); //Frame rate 70HZ + LCD_IO_WriteData(0x00B0); + LCD_IO_WriteData(0x0011); + LCD_IO_WriteReg(0x00B4); + LCD_IO_WriteData(0x0002); + LCD_IO_WriteReg(0x00B6); //RGB/MCU Interface Control + LCD_IO_WriteData(0x0002); + LCD_IO_WriteData(0x0042); + + LCD_IO_WriteReg(0x00B7); + LCD_IO_WriteData(0x00C6); + + //WriteComm(0xBE); + //WriteData(0x00); + //WriteData(0x04); + + LCD_IO_WriteReg(0x00E9); + LCD_IO_WriteData(0x0000); + + LCD_IO_WriteReg(0x00F7); + LCD_IO_WriteData(0x00A9); + LCD_IO_WriteData(0x0051); + LCD_IO_WriteData(0x002C); + LCD_IO_WriteData(0x0082); + + LCD_IO_WriteReg(0x0011); + for (i = 0; i < 65535; i++) { /* do nothing */ } + LCD_IO_WriteReg(0x0029); + + LCD_setWindowArea(0, 0, TFT_WIDTH, TFT_HEIGHT); + + OUT_WRITE(LCD_BACKLIGHT_PIN, LOW); + LCD_Clear(0x0000); + + lcd_draw_logo(); + + OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); + delay(2000); + } + } + + extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); + + void lcd_draw_logo() { + LCD_setWindowArea(0, 0, TFT_WIDTH, TFT_HEIGHT); + LCD_WriteRAM_Prepare(); + + for (uint16_t i = 0; i < (TFT_HEIGHT); i ++) { + Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); + #ifdef LCD_USE_DMA_FSMC + LCD_IO_WriteSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); + #else + int index = 0;,x_off = 0; + for (x_off = 0; x_off < TFT_WIDTH; x_off++) { + LCD_IO_WriteData((uint16_t)bmp_public_buf[index]); + index += 2; + } + #endif + } } -} #endif // !TFT_LVGL_UI_SPI -extern uint8_t bmp_public_buf[17 * 1024]; - void tft_lvgl_init() { //uint16_t test_id=0; @@ -404,16 +452,15 @@ void tft_lvgl_init() { SPI_TFT.spi_init(SPI_FULL_SPEED); SPI_TFT.LCD_init(); #else - init_tft(); + fsmc_tft_init(); #endif + //spi_flash_read_test(); #if ENABLED(SDSUPPORT) UpdateAssets(); #endif mks_test_get(); - //spi_flash_read_test(); - touch.Init(); lv_init(); @@ -432,6 +479,36 @@ void tft_lvgl_init() { indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ + #if HAS_ROTARY_ENCODER + g = lv_group_create(); + lv_indev_drv_t enc_drv; + lv_indev_drv_init(&enc_drv); + enc_drv.type = LV_INDEV_TYPE_ENCODER; + enc_drv.read_cb = my_mousewheel_read; + lv_indev_t * enc_indev = lv_indev_drv_register(&enc_drv); + lv_indev_set_group(enc_indev, g); + #endif + + lv_fs_drv_t spi_flash_drv; + lv_fs_drv_init(&spi_flash_drv); + spi_flash_drv.letter = 'F'; + spi_flash_drv.open_cb = spi_flash_open_cb; + spi_flash_drv.close_cb = spi_flash_close_cb; + spi_flash_drv.read_cb = spi_flash_read_cb; + spi_flash_drv.seek_cb = spi_flash_seek_cb; + spi_flash_drv.tell_cb = spi_flash_tell_cb; + lv_fs_drv_register(&spi_flash_drv); + + lv_fs_drv_t sd_drv; + lv_fs_drv_init(&sd_drv); + sd_drv.letter = 'S'; + sd_drv.open_cb = sd_open_cb; + sd_drv.close_cb = sd_close_cb; + sd_drv.read_cb = sd_read_cb; + sd_drv.seek_cb = sd_seek_cb; + sd_drv.tell_cb = sd_tell_cb; + lv_fs_drv_register(&sd_drv); + systick_attach_callback(SysTick_Callback); #if HAS_SPI_FLASH_FONT @@ -442,7 +519,10 @@ void tft_lvgl_init() { filament_pin_setup(); + lv_encoder_pin_init(); + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.load(); if (recovery.valid()) { if (gCfgItems.from_flash_pic == 1) flash_preview_begin = 1; @@ -486,16 +566,16 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co #if 1 uint16_t i, width, height; - uint16_t clr_temp; + //uint16_t clr_temp; width = area->x2 - area->x1 + 1; height = area->y2 - area->y1 + 1; - ili9320_SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height); + LCD_setWindowArea((uint16_t)area->x1, (uint16_t)area->y1, width, height); LCD_WriteRAM_Prepare(); for (i = 0; i < width * height - 2; i++) { - clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) - | ((uint16_t)color_p->ch.green << 5) - | ((uint16_t)color_p->ch.blue)); - LCD_IO_WriteData(clr_temp); + //clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) + //| ((uint16_t)color_p->ch.green << 5) + //| ((uint16_t)color_p->ch.blue)); + LCD_IO_WriteData(color_p->full); color_p++; } @@ -507,8 +587,6 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co #define TICK_CYCLE 1 -static int32_t touch_time1 = 0; - unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { return TICK_CYCLE * (lastTick <= curTick ? (curTick - lastTick) : (0xFFFFFFFF - lastTick + curTick)); } @@ -522,15 +600,17 @@ static bool get_point(int16_t *x, int16_t *y) { } #if ENABLED(GRAPHICAL_TFT_ROTATE_180) - x = (TFT_WIDTH) - x; - y = (TFT_HEIGHT) - y; + *x = int16_t((TFT_WIDTH) - (int)(*x)); + *y = int16_t((TFT_HEIGHT) - (int)(*y)); #endif return is_touched; } -static int16_t last_x = 0, last_y = 0; bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { + static int16_t last_x = 0, last_y = 0; + static uint8_t last_touch_state = LV_INDEV_STATE_REL; + static int32_t touch_time1 = 0; uint32_t tmpTime, diffTime = 0; tmpTime = millis(); @@ -540,9 +620,10 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { //if (data->state == LV_INDEV_STATE_PR) ADS7843_Rd_Addata((u16 *)&last_x, (u16 *)&last_y); //touchpad_get_xy(&last_x, &last_y); /*Save the pressed coordinates and the state*/ - if (diffTime > 10) { + if (diffTime > 20) { if (get_point(&last_x, &last_y)) { + if (last_touch_state == LV_INDEV_STATE_PR) return false; data->state = LV_INDEV_STATE_PR; // Set the coordinates (if released use the last-pressed coordinates) @@ -551,9 +632,13 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { data->point.y = last_y; last_x = last_y = 0; + last_touch_state = LV_INDEV_STATE_PR; + } + else { + if (last_touch_state == LV_INDEV_STATE_PR) + data->state = LV_INDEV_STATE_REL; + last_touch_state = LV_INDEV_STATE_REL; } - else - data->state = LV_INDEV_STATE_REL; touch_time1 = tmpTime; } @@ -561,4 +646,233 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { return false; // Return `false` since no data is buffering or left to read } +int16_t enc_diff = 0; +lv_indev_state_t state = LV_INDEV_STATE_REL; + +bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { + (void) indev_drv; /*Unused*/ + + data->state = state; + data->enc_diff = enc_diff; + enc_diff = 0; + + return false; /*No more data to read so return false*/ +} + +extern uint8_t currentFlashPage; + +//spi_flash +uint32_t pic_read_base_addr = 0, pic_read_addr_offset = 0; +lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { + static char last_path_name[30]; + if (strcasecmp(last_path_name,path) != 0) { + pic_read_base_addr = lv_get_pic_addr((uint8_t *)path); + ZERO(last_path_name); + strcpy(last_path_name,path); + } + else { + W25QXX.init(SPI_QUARTER_SPEED); + currentFlashPage = 0; + } + pic_read_addr_offset = pic_read_base_addr; + return LV_FS_RES_OK; +} + +lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p) { + lv_fs_res_t res = LV_FS_RES_OK; + /* Add your code here*/ + pic_read_addr_offset = pic_read_base_addr; + return res; +} + +lv_fs_res_t spi_flash_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) { + lv_pic_test((uint8_t *)buf, pic_read_addr_offset, btr); + *br = btr; + return LV_FS_RES_OK; +} + +lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { + #if HAS_SPI_FLASH_COMPRESSION + if (pos == 4) { + uint8_t bmp_header[4]; + SPIFlash.beginRead(pic_read_base_addr); + SPIFlash.readData(bmp_header, 4); + currentFlashPage = 1; + } + pic_read_addr_offset = pic_read_base_addr; + #else + pic_read_addr_offset = pic_read_base_addr + pos; + #endif + return LV_FS_RES_OK; +} + +lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { + *pos_p = pic_read_addr_offset - pic_read_base_addr; + return LV_FS_RES_OK; +} + +//sd +char *cur_namefff; +uint32_t sd_read_base_addr = 0,sd_read_addr_offset = 0; +lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { + //cur_namefff = strrchr(path, '/'); + char name_buf[100]; + ZERO(name_buf); + strcat(name_buf,"/"); + strcat(name_buf,path); + char *temp = strstr(name_buf,".bin"); + if (temp) { strcpy(temp,".GCO"); } + sd_read_base_addr = lv_open_gcode_file((char *)name_buf); + sd_read_addr_offset = sd_read_base_addr; + return LV_FS_RES_OK; +} + +lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p) { + /* Add your code here*/ + lv_close_gcode_file(); + return LV_FS_RES_OK; +} + +lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) { + if (btr == 200) { + lv_gcode_file_read((uint8_t *)buf); + //pic_read_addr_offset += 208; + *br = 200; + } + else if (btr == 4) { + uint8_t header_pic[4] = { 0x04, 0x90, 0x81, 0x0C }; + memcpy(buf, header_pic, 4); + //pic_read_addr_offset += 4; + *br = 4; + } + return LV_FS_RES_OK; +} + +lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { + sd_read_addr_offset = sd_read_base_addr + (pos - 4) / 200 * 409; + lv_gcode_file_seek(sd_read_addr_offset); + return LV_FS_RES_OK; +} + +lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { + if (sd_read_addr_offset) *pos_p = 0; + else *pos_p = (sd_read_addr_offset - sd_read_base_addr) / 409 * 200 + 4; + return LV_FS_RES_OK; +} + +void lv_encoder_pin_init() { + #if 1 // HAS_DIGITAL_BUTTONS + + #if BUTTON_EXISTS(EN1) + SET_INPUT_PULLUP(BTN_EN1); + #endif + #if BUTTON_EXISTS(EN2) + SET_INPUT_PULLUP(BTN_EN2); + #endif + #if BUTTON_EXISTS(ENC) + SET_INPUT_PULLUP(BTN_ENC); + #endif + + #if BUTTON_EXISTS(BACK) + SET_INPUT_PULLUP(BTN_BACK); + #endif + + #if BUTTON_EXISTS(UP) + SET_INPUT(BTN_UP); + #endif + #if BUTTON_EXISTS(DWN) + SET_INPUT(BTN_DWN); + #endif + #if BUTTON_EXISTS(LFT) + SET_INPUT(BTN_LFT); + #endif + #if BUTTON_EXISTS(RT) + SET_INPUT(BTN_RT); + #endif + + #endif // HAS_DIGITAL_BUTTONS +} + +#if 1 // HAS_ENCODER_ACTION + + //static const int8_t encoderDirection = 1; + //static int16_t enc_Direction; + void lv_update_encoder() { + static uint8_t buttons; + static uint32_t encoder_time1; + uint32_t tmpTime, diffTime = 0; + tmpTime = millis(); + diffTime = getTickDiff(tmpTime, encoder_time1); + if (diffTime > 50) { + + #if ANY_BUTTON(EN1, EN2, ENC, BACK) + + uint8_t newbutton = 0; + + #if BUTTON_EXISTS(EN1) + if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; + #endif + #if BUTTON_EXISTS(EN2) + if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; + #endif + #if BUTTON_EXISTS(ENC) + if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; + #endif + #if BUTTON_EXISTS(BACK) + if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; + #endif + + #else + + constexpr uint8_t newbutton = 0; + + #endif + + buttons = newbutton; + + #if HAS_ENCODER_WHEEL + static uint8_t lastEncoderBits; + + #define encrot0 0 + #define encrot1 1 + #define encrot2 2 + + // Manage encoder rotation + //#define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: enc_Direction += encoderDirection; break; case _E2: enc_Direction -= encoderDirection; } + + uint8_t enc = 0; + if (buttons & EN_A) enc |= B01; + if (buttons & EN_B) enc |= B10; + if (enc != lastEncoderBits) { + switch (enc) { + case encrot1: + if (lastEncoderBits == encrot0) { + enc_diff--; + encoder_time1 = tmpTime; + } + break; + case encrot2: + if (lastEncoderBits == encrot0) { + enc_diff++; + encoder_time1 = tmpTime; + } + break; + } + lastEncoderBits = enc; + } + static uint8_t last_button_state = LV_INDEV_STATE_REL; + const uint8_t enc_c = (buttons & EN_C) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; + if (enc_c != last_button_state) { + state = enc_c ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; + + last_button_state = enc_c; + } + + #endif // HAS_ENCODER_WHEEL + + } // next_button_update_ms + } + +#endif // HAS_ENCODER_ACTION + #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index 1b33d6e6bf..7e24f948fd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -22,25 +22,44 @@ #pragma once /** - * @file tft_lvgl_configuration.h - * @date 2020-02-21 - * */ + * @file lcd/extui/lib/mks_ui/tft_lvgl_configuration.h + * @date 2020-02-21 + */ -//#ifdef __cplusplus -//extern "C" { -//#endif +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif #include -void tft_lvgl_init(); -void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); -bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); +//#define GRAPHICAL_TFT_ROTATE_180 +#define USE_WIFI_FUNCTION 0 -void LCD_Clear(uint16_t Color); -void tft_set_point(uint16_t x, uint16_t y, uint16_t point); -void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); -void LCD_WriteRAM_Prepare(void); +extern void tft_lvgl_init(); +extern void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); +extern bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); +extern bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); -//#ifdef __cplusplus -//} /* extern "C" */ -//#endif +extern void LCD_Clear(uint16_t Color); +extern void tft_set_point(uint16_t x, uint16_t y, uint16_t point); +extern void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); +extern void LCD_WriteRAM_Prepare(void); +extern void lcd_draw_logo(); +extern void lv_encoder_pin_init(); +extern void lv_update_encoder(); + +extern lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); +extern lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p); +extern lv_fs_res_t spi_flash_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +extern lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); +extern lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +extern lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); +extern lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p); +extern lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +extern lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); +extern lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 1ea47cef2d..e230195eab 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -54,11 +54,8 @@ dialog_menu_def dialog_menu; language_menu_def language_menu; print_file_dialog_menu_def print_file_dialog_menu; filesys_menu_def filesys_menu; -zoffset_menu_def zoffset_menu; tool_menu_def tool_menu; MachinePara_menu_def MachinePara_menu; -MachineSettings_menu_def MachineSettings_menu; -TemperatureSettings_menu_def TemperatureSettings_menu; pause_msg_def pause_msg_menu; eeprom_def eeprom_menu; @@ -67,8 +64,8 @@ void machine_setting_disp() { if (gCfgItems.language == LANG_SIMPLE_CHINESE) { MachinePara_menu.title = MACHINE_PARA_TITLE_CN; MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_CN; - MachinePara_menu.TemperatureSetting = TEMPERATURE_CONFIG_CN; MachinePara_menu.MotorSetting = MOTOR_CONFIG_CN; + MachinePara_menu.leveling = MACHINE_LEVELING_CONFIG_CN; MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_CN; machine_menu.default_value = DEFAULT_CN; @@ -81,7 +78,6 @@ void machine_setting_disp() { machine_menu.HomeDir = MACHINE_HOMEDIR_CN; machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_CN; machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_CN; - machine_menu.LevelingConf = MACHINE_LEVELING_CONFIG_CN; machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_CN; machine_menu.xyz = MACHINE_TYPE_XYZ_CN; @@ -116,18 +112,18 @@ void machine_setting_disp() { machine_menu.opened = ENDSTOP_OPENED_CN; machine_menu.closed = ENDSTOP_CLOSED_CN; - machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_CN; - machine_menu.InTemperature = FILAMENT_IN_TEMPERATURE_CN; - machine_menu.InLength = FILAMENT_IN_LENGTH_CN; - machine_menu.InSpeed = FILAMENT_IN_SPEED_CN; - machine_menu.OutTemperature = FILAMENT_OUT_TEMPERATURE_CN; - machine_menu.OutLength = FILAMENT_OUT_LENGTH_CN; - machine_menu.OutSpeed = FILAMENT_OUT_SPEED_CN; + machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_CN; + machine_menu.InLength = FILAMENT_IN_LENGTH_CN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_CN; + machine_menu.FilamentTemperature = FILAMENT_TEMPERATURE_CN; + machine_menu.OutLength = FILAMENT_OUT_LENGTH_CN; + machine_menu.OutSpeed = FILAMENT_OUT_SPEED_CN; - machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_CN; - machine_menu.LevelingParaConf = LEVELING_PARA_CONF_CN; - machine_menu.DeltaLevelConf = LEVELING_DELTA_CN; - machine_menu.XYZLevelconf = LEVELING_XYZ_CN; + machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_CN; + machine_menu.LevelingParaConf = LEVELING_PARA_CONF_CN; + machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_CN; + machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_CN; + machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_CN; machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_CN; machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_CN; @@ -177,16 +173,19 @@ void machine_setting_disp() { machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_CN; machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_CN; - machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_CN; - machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_CN; - machine_menu.AccelerationConf = ACCELERATION_CONF_CN; - machine_menu.JerkConf = JERKCONF_CN; - machine_menu.StepsConf = STEPSCONF_CN; - machine_menu.TMCcurrentConf = TMC_CURRENT_CN; - machine_menu.TMCStepModeConf = TMC_STEP_MODE_CN; - machine_menu.MotorDirConf = MOTORDIRCONF_CN; - machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_CN; - machine_menu.PausePosition = PAUSE_POSITION_CN; + machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_CN; + machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_CN; + machine_menu.AccelerationConf = ACCELERATION_CONF_CN; + machine_menu.JerkConf = JERKCONF_CN; + machine_menu.StepsConf = STEPSCONF_CN; + machine_menu.TMCcurrentConf = TMC_CURRENT_CN; + machine_menu.TMCStepModeConf = TMC_STEP_MODE_CN; + machine_menu.MotorDirConf = MOTORDIRCONF_CN; + machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_CN; + machine_menu.PausePosition = PAUSE_POSITION_CN; + machine_menu.WifiSettings = WIFI_SETTINGS_CN; + machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_CN; + machine_menu.EncoderSettings = ENCODER_SETTINGS_CN; machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_CN; machine_menu.XMaxFeedRate = X_MAXFEEDRATE_CN; @@ -268,16 +267,38 @@ void machine_setting_disp() { machine_menu.key_reset = KEY_REST_CN; machine_menu.key_confirm = KEY_CONFIRM_CN; - machine_menu.PausePosText = PAUSE_POSITION_CN; - machine_menu.xPos = PAUSE_POSITION_X_CN; - machine_menu.yPos = PAUSE_POSITION_Y_CN; - machine_menu.zPos = PAUSE_POSITION_Z_CN; + machine_menu.PausePosText = PAUSE_POSITION_CN; + machine_menu.xPos = PAUSE_POSITION_X_CN; + machine_menu.yPos = PAUSE_POSITION_Y_CN; + machine_menu.zPos = PAUSE_POSITION_Z_CN; + machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_CN; + machine_menu.wifiMode = WIFI_SETTINGS_MODE_CN; + machine_menu.wifiName = WIFI_SETTINGS_NAME_CN; + machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_CN; + machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_CN; + machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_CN; + machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_CN; + machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_CN; + + machine_menu.OffsetConfTitle = OFFSET_TITLE_CN; + machine_menu.Xoffset = OFFSET_X_CN; + machine_menu.Yoffset = OFFSET_Y_CN; + machine_menu.Zoffset = OFFSET_Z_CN; + + machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_CN; + machine_menu.X_Sensitivity = X_SENSITIVITY_CN; + machine_menu.Y_Sensitivity = Y_SENSITIVITY_CN; + machine_menu.Z_Sensitivity = Z_SENSITIVITY_CN; + machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_CN; + + machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_CN; + machine_menu.EncoderConfText = ENCODER_CONF_TEXT_CN; } else if (gCfgItems.language == LANG_COMPLEX_CHINESE) { MachinePara_menu.title = MACHINE_PARA_TITLE_T_CN; MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_T_CN; - MachinePara_menu.TemperatureSetting = TEMPERATURE_CONFIG_T_CN; MachinePara_menu.MotorSetting = MOTOR_CONFIG_T_CN; + MachinePara_menu.leveling = MACHINE_LEVELING_CONFIG_T_CN; MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_T_CN; machine_menu.default_value = DEFAULT_T_CN; @@ -290,7 +311,6 @@ void machine_setting_disp() { machine_menu.HomeDir = MACHINE_HOMEDIR_T_CN; machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_T_CN; machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_T_CN; - machine_menu.LevelingConf = MACHINE_LEVELING_CONFIG_T_CN; machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_T_CN; machine_menu.xyz = MACHINE_TYPE_XYZ_T_CN; @@ -325,18 +345,18 @@ void machine_setting_disp() { machine_menu.opened = ENDSTOP_OPENED_T_CN; machine_menu.closed = ENDSTOP_CLOSED_T_CN; - machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_T_CN; - machine_menu.InTemperature = FILAMENT_IN_TEMPERATURE_T_CN; - machine_menu.InLength = FILAMENT_IN_LENGTH_T_CN; - machine_menu.InSpeed = FILAMENT_IN_SPEED_T_CN; - machine_menu.OutTemperature = FILAMENT_OUT_TEMPERATURE_T_CN; - machine_menu.OutLength = FILAMENT_OUT_LENGTH_T_CN; - machine_menu.OutSpeed = FILAMENT_OUT_SPEED_T_CN; + machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_T_CN; + machine_menu.InLength = FILAMENT_IN_LENGTH_T_CN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_T_CN; + machine_menu.FilamentTemperature = FILAMENT_TEMPERATURE_T_CN; + machine_menu.OutLength = FILAMENT_OUT_LENGTH_T_CN; + machine_menu.OutSpeed = FILAMENT_OUT_SPEED_T_CN; - machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_T_CN; - machine_menu.LevelingParaConf = LEVELING_PARA_CONF_T_CN; - machine_menu.DeltaLevelConf = LEVELING_DELTA_T_CN; - machine_menu.XYZLevelconf = LEVELING_XYZ_T_CN; + machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_T_CN; + machine_menu.LevelingParaConf = LEVELING_PARA_CONF_T_CN; + machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_T_CN; + machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_T_CN; + machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_T_CN; machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_T_CN; machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_T_CN; @@ -386,16 +406,19 @@ void machine_setting_disp() { machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_T_CN; machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_T_CN; - machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_T_CN; - machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_T_CN; - machine_menu.AccelerationConf = ACCELERATION_CONF_T_CN; - machine_menu.JerkConf = JERKCONF_T_CN; - machine_menu.StepsConf = STEPSCONF_T_CN; - machine_menu.TMCcurrentConf = TMC_CURRENT_T_CN; - machine_menu.TMCStepModeConf = TMC_STEP_MODE_T_CN; - machine_menu.MotorDirConf = MOTORDIRCONF_T_CN; - machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_T_CN; - machine_menu.PausePosition = PAUSE_POSITION_T_CN; + machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_T_CN; + machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_T_CN; + machine_menu.AccelerationConf = ACCELERATION_CONF_T_CN; + machine_menu.JerkConf = JERKCONF_T_CN; + machine_menu.StepsConf = STEPSCONF_T_CN; + machine_menu.TMCcurrentConf = TMC_CURRENT_T_CN; + machine_menu.TMCStepModeConf = TMC_STEP_MODE_T_CN; + machine_menu.MotorDirConf = MOTORDIRCONF_T_CN; + machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_T_CN; + machine_menu.PausePosition = PAUSE_POSITION_T_CN; + machine_menu.WifiSettings = WIFI_SETTINGS_T_CN; + machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_T_CN; + machine_menu.EncoderSettings = ENCODER_SETTINGS_T_CN; machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_T_CN; machine_menu.XMaxFeedRate = X_MAXFEEDRATE_T_CN; @@ -484,12 +507,34 @@ void machine_setting_disp() { machine_menu.yPos = PAUSE_POSITION_Y_T_CN; machine_menu.zPos = PAUSE_POSITION_Z_T_CN; + machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_T_CN; + machine_menu.wifiMode = WIFI_SETTINGS_MODE_T_CN; + machine_menu.wifiName = WIFI_SETTINGS_NAME_T_CN; + machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_T_CN; + machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_T_CN; + machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_T_CN; + machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_T_CN; + machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_T_CN; + + machine_menu.OffsetConfTitle = OFFSET_TITLE_T_CN; + machine_menu.Xoffset = OFFSET_X_T_CN; + machine_menu.Yoffset = OFFSET_Y_T_CN; + machine_menu.Zoffset = OFFSET_Z_T_CN; + + machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_T_CN; + machine_menu.X_Sensitivity = X_SENSITIVITY_T_CN; + machine_menu.Y_Sensitivity = Y_SENSITIVITY_T_CN; + machine_menu.Z_Sensitivity = Z_SENSITIVITY_T_CN; + machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_T_CN; + + machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_T_CN; + machine_menu.EncoderConfText = ENCODER_CONF_TEXT_T_CN; } else { MachinePara_menu.title = MACHINE_PARA_TITLE_EN; MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_EN; - MachinePara_menu.TemperatureSetting = TEMPERATURE_CONFIG_EN; MachinePara_menu.MotorSetting = MOTOR_CONFIG_EN; + MachinePara_menu.leveling = MACHINE_LEVELING_CONFIG_EN; MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_EN; machine_menu.default_value = DEFAULT_EN; @@ -502,7 +547,6 @@ void machine_setting_disp() { machine_menu.HomeDir = MACHINE_HOMEDIR_EN; machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_EN; machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_EN; - machine_menu.LevelingConf = MACHINE_LEVELING_CONFIG_EN; machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_EN; machine_menu.xyz = MACHINE_TYPE_XYZ_EN; @@ -537,18 +581,18 @@ void machine_setting_disp() { machine_menu.opened = ENDSTOP_OPENED_EN; machine_menu.closed = ENDSTOP_CLOSED_EN; - machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_EN; - machine_menu.InTemperature = FILAMENT_IN_TEMPERATURE_EN; - machine_menu.InLength = FILAMENT_IN_LENGTH_EN; - machine_menu.InSpeed = FILAMENT_IN_SPEED_EN; - machine_menu.OutTemperature = FILAMENT_OUT_TEMPERATURE_EN; - machine_menu.OutLength = FILAMENT_OUT_LENGTH_EN; - machine_menu.OutSpeed = FILAMENT_OUT_SPEED_EN; + machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_EN; + machine_menu.InLength = FILAMENT_IN_LENGTH_EN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_EN; + machine_menu.FilamentTemperature = FILAMENT_TEMPERATURE_EN; + machine_menu.OutLength = FILAMENT_OUT_LENGTH_EN; + machine_menu.OutSpeed = FILAMENT_OUT_SPEED_EN; - machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_EN; - machine_menu.LevelingParaConf = LEVELING_PARA_CONF_EN; - machine_menu.DeltaLevelConf = LEVELING_DELTA_EN; - machine_menu.XYZLevelconf = LEVELING_XYZ_EN; + machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_EN; + machine_menu.LevelingParaConf = LEVELING_PARA_CONF_EN; + machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_EN; + machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_EN; + machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_EN; machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_EN; machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_EN; @@ -598,16 +642,19 @@ void machine_setting_disp() { machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_EN; machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_EN; - machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_EN; - machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_EN; - machine_menu.AccelerationConf = ACCELERATION_CONF_EN; - machine_menu.JerkConf = JERKCONF_EN; - machine_menu.StepsConf = STEPSCONF_EN; - machine_menu.TMCcurrentConf = TMC_CURRENT_EN; - machine_menu.TMCStepModeConf = TMC_STEP_MODE_EN; - machine_menu.MotorDirConf = MOTORDIRCONF_EN; - machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_EN; - machine_menu.PausePosition = PAUSE_POSITION_EN; + machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_EN; + machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_EN; + machine_menu.AccelerationConf = ACCELERATION_CONF_EN; + machine_menu.JerkConf = JERKCONF_EN; + machine_menu.StepsConf = STEPSCONF_EN; + machine_menu.TMCcurrentConf = TMC_CURRENT_EN; + machine_menu.TMCStepModeConf = TMC_STEP_MODE_EN; + machine_menu.MotorDirConf = MOTORDIRCONF_EN; + machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_EN; + machine_menu.PausePosition = PAUSE_POSITION_EN; + machine_menu.WifiSettings = WIFI_SETTINGS_EN; + machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_EN; + machine_menu.EncoderSettings = ENCODER_SETTINGS_EN; machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_EN; machine_menu.XMaxFeedRate = X_MAXFEEDRATE_EN; @@ -692,10 +739,32 @@ void machine_setting_disp() { machine_menu.high_level = MOTOR_EN_HIGH_LEVEL_EN; machine_menu.low_level = MOTOR_EN_LOW_LEVEL_EN; - machine_menu.PausePosText = PAUSE_POSITION_EN; - machine_menu.xPos = PAUSE_POSITION_X_EN; - machine_menu.yPos = PAUSE_POSITION_Y_EN; - machine_menu.zPos = PAUSE_POSITION_Z_EN; + machine_menu.PausePosText = PAUSE_POSITION_EN; + machine_menu.xPos = PAUSE_POSITION_X_EN; + machine_menu.yPos = PAUSE_POSITION_Y_EN; + machine_menu.zPos = PAUSE_POSITION_Z_EN; + machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_EN; + machine_menu.wifiMode = WIFI_SETTINGS_MODE_EN; + machine_menu.wifiName = WIFI_SETTINGS_NAME_EN; + machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_EN; + machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_EN; + machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_EN; + machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_EN; + machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_EN; + + machine_menu.OffsetConfTitle = OFFSET_TITLE_EN; + machine_menu.Xoffset = OFFSET_X_EN; + machine_menu.Yoffset = OFFSET_Y_EN; + machine_menu.Zoffset = OFFSET_Z_EN; + + machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_EN; + machine_menu.X_Sensitivity = X_SENSITIVITY_EN; + machine_menu.Y_Sensitivity = Y_SENSITIVITY_EN; + machine_menu.Z_Sensitivity = Z_SENSITIVITY_EN; + machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_EN; + + machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_EN; + machine_menu.EncoderConfText = ENCODER_CONF_TEXT_EN; } } @@ -771,10 +840,6 @@ void disp_language_init() { filament_menu.stat_temp = TEXT_VALUE; - zoffset_menu.step001 = ZOFFSET_STEP001; - zoffset_menu.step01 = ZOFFSET_STEP01; - zoffset_menu.step1 = ZOFFSET_STEP1; - machine_menu.key_0 = KEYBOARD_KEY0_EN; machine_menu.key_1 = KEYBOARD_KEY1_EN; machine_menu.key_2 = KEYBOARD_KEY2_EN; @@ -788,22 +853,15 @@ void disp_language_init() { machine_menu.key_point = KEYBOARD_KEY_POINT_EN; machine_menu.negative = KEYBOARD_KEY_NEGATIVE_EN; // wifi-list - #if 0 - list_menu.title = TEXT_WIFI_MENU_TITLE_EN; - list_menu.file_pages = FILE_PAGES_EN; - // keyboard - keyboard_menu.apply = MANUAL_IP_APPLY_EN; - keyboard_menu.password = TEXT_WIFI_PASSWORD_EN; - keyboard_menu.space = TEXT_WIFI_SAPCE_EN; - keyboard_menu.letter = TEXT_WIFI_LETTER_EN; - keyboard_menu.digital = TEXT_WIFI_DIGITAL_EN; - keyboard_menu.symbol = TEXT_WIFI_SYMBOL_EN; + #if ENABLED(USE_WIFI_FUNCTION) + list_menu.title = TEXT_WIFI_MENU_TITLE_EN; + list_menu.file_pages = FILE_PAGES_EN; + // tips - tips_menu.pointBold = TEXT_WIFI_POINT_BOLD_EN; tips_menu.joining = TEXT_WIFI_JOINING_EN; tips_menu.failedJoin = TEXT_WIFI_FAILED_JOIN_EN; tips_menu.wifiConected = TEXT_WIFI_WIFI_CONECTED_EN; - #endif + #endif //USE_WIFI_FUNCTION machine_setting_disp(); operation_menu.babystep = TEXT_BABY_STEP_EN; @@ -904,7 +962,6 @@ void disp_language_init() { filesys_menu.usb_sys = U_DISK_TEXT_CN; // more_menu.title = TITLE_MORE_CN; - more_menu.zoffset = ZOFFSET_CN; // WIFI wifi_menu.title = WIFI_TEXT; // wifi_menu.key = WIFI_KEY_TEXT_CN; @@ -1016,11 +1073,6 @@ void disp_language_init() { print_file_dialog_menu.reprint = DIALOG_REPRINT_CN; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_CN; - // ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_CN; - zoffset_menu.inc = ZOFFSET_INC_CN; - zoffset_menu.dec = ZOFFSET_DEC_CN; - pause_msg_menu.pausing = MESSAGE_PAUSING_CN; pause_msg_menu.changing = MESSAGE_CHANGING_CN; pause_msg_menu.unload = MESSAGE_UNLOAD_CN; @@ -1092,7 +1144,6 @@ void disp_language_init() { preheat_menu.step_10c = TEXT_10C_T_CN; // move_menu.title = MOVE_TEXT_T_CN; - more_menu.zoffset = ZOFFSET_T_CN; // home_menu.title = TITLE_HOME_T_CN; home_menu.stopmove = HOME_STOPMOVE_T_CN; @@ -1249,10 +1300,6 @@ void disp_language_init() { print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_T_CN; print_file_dialog_menu.reprint = DIALOG_REPRINT_T_CN; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_T_CN; - // ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_T_CN; - zoffset_menu.inc = ZOFFSET_INC_T_CN; - zoffset_menu.dec = ZOFFSET_DEC_T_CN; pause_msg_menu.pausing = MESSAGE_PAUSING_T_CN; pause_msg_menu.changing = MESSAGE_CHANGING_T_CN; @@ -1359,7 +1406,6 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_EN; set_menu.eepromSet = EEPROM_SETTINGS_EN; more_menu.title = TITLE_MORE_EN; - more_menu.zoffset = ZOFFSET_EN; // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; @@ -1469,10 +1515,6 @@ void disp_language_init() { print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN; print_file_dialog_menu.reprint = DIALOG_REPRINT_EN; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN; - // ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_EN; - zoffset_menu.inc = ZOFFSET_INC_EN; - zoffset_menu.dec = ZOFFSET_DEC_EN; pause_msg_menu.pausing = MESSAGE_PAUSING_EN; pause_msg_menu.changing = MESSAGE_CHANGING_EN; @@ -1579,7 +1621,6 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_RU; set_menu.eepromSet = EEPROM_SETTINGS_RU; more_menu.title = TITLE_MORE_RU; - more_menu.zoffset = ZOFFSET_RU; // filesys_menu.title = TITLE_FILESYS_RU; filesys_menu.sd_sys = SD_CARD_TEXT_RU; @@ -1689,10 +1730,6 @@ void disp_language_init() { print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_RU; print_file_dialog_menu.reprint = DIALOG_REPRINT_RU; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_RU; - // ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_RU; - zoffset_menu.inc = ZOFFSET_INC_RU; - zoffset_menu.dec = ZOFFSET_DEC_RU; pause_msg_menu.pausing = MESSAGE_PAUSING_RU; pause_msg_menu.changing = MESSAGE_CHANGING_RU; @@ -1803,7 +1840,6 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_SP; set_menu.eepromSet = EEPROM_SETTINGS_SP; more_menu.title = TITLE_MORE_SP; - more_menu.zoffset = ZOFFSET_SP; // filesys_menu.title = TITLE_FILESYS_SP; filesys_menu.sd_sys = SD_CARD_TEXT_SP; @@ -1914,10 +1950,6 @@ void disp_language_init() { print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_SP; print_file_dialog_menu.reprint = DIALOG_REPRINT_SP; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_SP; - // ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_SP; - zoffset_menu.inc = ZOFFSET_INC_SP; - zoffset_menu.dec = ZOFFSET_DEC_SP; pause_msg_menu.pausing = MESSAGE_PAUSING_SP; pause_msg_menu.changing = MESSAGE_CHANGING_SP; @@ -2025,7 +2057,6 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_FR; set_menu.eepromSet = EEPROM_SETTINGS_FR; more_menu.title = TITLE_MORE_FR; - more_menu.zoffset = ZOFFSET_FR; // filesys_menu.title = TITLE_FILESYS_FR; filesys_menu.sd_sys = SD_CARD_TEXT_FR; @@ -2137,10 +2168,6 @@ void disp_language_init() { print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_FR; print_file_dialog_menu.reprint = DIALOG_REPRINT_FR; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_FR; - // ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_FR; - zoffset_menu.inc = ZOFFSET_INC_FR; - zoffset_menu.dec = ZOFFSET_DEC_FR; pause_msg_menu.pausing = MESSAGE_PAUSING_FR; pause_msg_menu.changing = MESSAGE_CHANGING_FR; @@ -2249,7 +2276,6 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_IT; set_menu.eepromSet = EEPROM_SETTINGS_IT; more_menu.title = TITLE_MORE_IT; - more_menu.zoffset = ZOFFSET_IT; // filesys_menu.title = TITLE_FILESYS_IT; filesys_menu.sd_sys = SD_CARD_TEXT_IT; @@ -2358,10 +2384,6 @@ void disp_language_init() { print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_IT; print_file_dialog_menu.reprint = DIALOG_REPRINT_IT; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_IT; - // ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_IT; - zoffset_menu.inc = ZOFFSET_INC_IT; - zoffset_menu.dec = ZOFFSET_DEC_IT; pause_msg_menu.pausing = MESSAGE_PAUSING_IT; pause_msg_menu.changing = MESSAGE_CHANGING_IT; @@ -2472,7 +2494,6 @@ void disp_language_init() { set_menu.eepromSet = EEPROM_SETTINGS_EN; // more_menu.title = TITLE_MORE_EN; - more_menu.zoffset = ZOFFSET_EN; // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; @@ -2582,10 +2603,6 @@ void disp_language_init() { print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN; print_file_dialog_menu.reprint = DIALOG_REPRINT_EN; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN; - // ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_EN; - zoffset_menu.inc = ZOFFSET_INC_EN; - zoffset_menu.dec = ZOFFSET_DEC_EN; pause_msg_menu.pausing = MESSAGE_PAUSING_EN; pause_msg_menu.changing = MESSAGE_CHANGING_EN; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 5851009356..675fd41f16 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -60,7 +60,6 @@ typedef struct machine_common_disp{ const char *HomeDir; const char *EndStopType; const char *FilamentConf; - const char *LevelingConf; const char *MachineTypeConfTitle; const char *xyz; @@ -96,17 +95,17 @@ typedef struct machine_common_disp{ const char *closed; const char *FilamentConfTitle; - const char *InTemperature; const char *InLength; const char *InSpeed; - const char *OutTemperature; + const char *FilamentTemperature; const char *OutLength; const char *OutSpeed; const char *LevelingParaConfTitle; const char *LevelingParaConf; - const char *DeltaLevelConf; - const char *XYZLevelconf; + const char *LevelingManuPosConf; + const char *LevelingAutoCommandConf; + const char *LevelingAutoZoffsetConf; const char *LevelingSubConfTitle; const char *AutoLevelEnable; @@ -165,6 +164,7 @@ typedef struct machine_common_disp{ const char *HomeFeedRateConf; const char *TMCcurrentConf; const char *TMCStepModeConf; + const char *HomingSensitivityConf; const char *MaxFeedRateConfTitle; const char *XMaxFeedRate; @@ -210,6 +210,12 @@ typedef struct machine_common_disp{ const char *E0_StepMode; const char *E1_StepMode; + const char *HomingSensitivityConfTitle; + const char *X_Sensitivity; + const char *Y_Sensitivity; + const char *Z_Sensitivity; + const char *Z2_Sensitivity; + const char *MotorDirConfTitle; const char *X_MotorDir; const char *Y_MotorDir; @@ -231,6 +237,8 @@ typedef struct machine_common_disp{ const char *Z2andZ2Endstop; const char *EnablePinsInvert; const char *PausePosition; + const char *WifiSettings; + const char *EncoderSettings; const char *Z2ConfTitle; const char *Z2Enable; @@ -266,6 +274,23 @@ typedef struct machine_common_disp{ const char *yPos; const char *zPos; + const char *WifiConfTitle; + const char *wifiMode; + const char *wifiName; + const char *wifiPassWord; + const char *wifiCloud; + const char *wifiConfig; + const char *wifiEdit; + const char *wifiConfigTips; + + const char *OffsetConfTitle; + const char *Xoffset; + const char *Yoffset; + const char *Zoffset; + + const char *EncoderConfTitle; + const char *EncoderConfText; + } machine_common_def; extern machine_common_def machine_menu; @@ -435,7 +460,6 @@ extern filesys_menu_def filesys_menu; typedef struct more_menu_disp { const char *title; - const char *zoffset; const char *back; } more_menu_def; @@ -661,18 +685,6 @@ typedef struct print_file_dialog_disp { extern print_file_dialog_menu_def print_file_dialog_menu; -typedef struct zoffset_menu_disp { - const char *title; - const char *inc; - const char *dec; - const char *step001; - const char *step01; - const char *step1; - const char *back; -} zoffset_menu_def; - -extern zoffset_menu_def zoffset_menu; - typedef struct tool_menu_disp { const char *title; const char *preheat; @@ -691,37 +703,13 @@ extern tool_menu_def tool_menu; typedef struct MachinePara_menu_disp { const char *title; const char *MachineSetting; - const char *TemperatureSetting; const char *MotorSetting; + const char *leveling; const char *AdvanceSetting; - //const char *back; } MachinePara_menu_def; extern MachinePara_menu_def MachinePara_menu; -typedef struct MachineSettings_menu_disp { - const char *title; - const char *Machine; - const char *Stroke; - const char *HomeDir; - const char *EndStopType; - const char *filamet; - const char *leveling; - const char *back; -} MachineSettings_menu_def; - -extern MachineSettings_menu_def MachineSettings_menu; - -typedef struct TemperatureSettings_menu_disp { - const char *title; - const char *nozzle; - const char *hotbed; - const char *preheat; - const char *back; -} TemperatureSettings_menu_def; - -extern TemperatureSettings_menu_def TemperatureSettings_menu; - typedef struct pause_msg_disp { const char *pausing; const char *changing; @@ -842,6 +830,7 @@ extern eeprom_def eeprom_menu; #define DIALOG_UPLOAD_SPEED_EN "Speed" #define DIALOG_UPDATE_WIFI_FIRMWARE_EN "Updating wifi model firmware" #define DIALOG_UPDATE_WIFI_WEB_EN "Updating wifi model web data" +#define DIALOG_UPDATE_NO_DEVICE_EN "please check \nwether memory device insert!" #define ZOFFSET_STEP001 "0.01mm" #define ZOFFSET_STEP01 "0.1mm" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp new file mode 100644 index 0000000000..01c86ad7cb --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp @@ -0,0 +1,120 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "draw_ui.h" +#include "wifiSerial.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include +#include +#include +#include +#include + +#include "../../../../MarlinCore.h" + +DEFINE_WFSERIAL(WifiSerial1, 1); + +WifiSerial::WifiSerial(usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) { + this->usart_device = usart_device; + this->tx_pin = tx_pin; + this->rx_pin = rx_pin; +} + +/** + * Set up / tear down + */ +#if STM32_MCU_SERIES == STM32_SERIES_F1 + /* F1 MCUs have no GPIO_AFR[HL], so turn off PWM if there's a conflict + * on this GPIO bit. */ + static void disable_timer_if_necessary(timer_dev *dev, uint8 ch) { + if (dev != nullptr) timer_set_mode(dev, ch, TIMER_DISABLED); + } +#elif STM32_MCU_SERIES == STM32_SERIES_F2 || STM32_MCU_SERIES == STM32_SERIES_F4 + #define disable_timer_if_necessary(dev, ch) ((void)0) +#else + #warning "Unsupported STM32 series; timer conflicts are possible" +#endif + +void WifiSerial::begin(uint32 baud) { begin(baud, SERIAL_8N1); } + +/** + * Roger Clark. + * Note. The config parameter is not currently used. This is a work in progress. + * Code needs to be written to set the config of the hardware serial control register in question. + */ + +void WifiSerial::begin(uint32 baud, uint8_t config) { + //ASSERT(baud <= this->usart_device->max_baud); // Roger Clark. Assert doesn't do anything useful, we may as well save the space in flash and ram etc + + if (baud > this->usart_device->max_baud) return; + + const stm32_pin_info *txi = &PIN_MAP[this->tx_pin], + *rxi = &PIN_MAP[this->rx_pin]; + + disable_timer_if_necessary(txi->timer_device, txi->timer_channel); + + usart_init(this->usart_device); + + // Reinitialize the receive buffer, mks_esp8266 fixed data frame length is 1k bytes + rb_init(this->usart_device->rb, WIFI_RX_BUF_SIZE, wifiRxBuf); + + usart_config_gpios_async(this->usart_device, + rxi->gpio_device, rxi->gpio_bit, + txi->gpio_device, txi->gpio_bit, + config); + usart_set_baud_rate(this->usart_device, USART_USE_PCLK, baud); + usart_enable(this->usart_device); +} + +void WifiSerial::end(void) { + usart_disable(this->usart_device); +} + +int WifiSerial::available(void) { + return usart_data_available(this->usart_device); +} + +// +// I/O +// + +int WifiSerial::read(void) { + if (usart_data_available(usart_device) <= 0) return -1; + return usart_getc(usart_device); +} + +int WifiSerial::write(unsigned char ch) { + usart_putc(this->usart_device, ch); + return 1; +} + +int WifiSerial::wifi_rb_is_full(void) { + return rb_is_full(this->usart_device->rb); +} + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h new file mode 100644 index 0000000000..9d3946fee7 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h @@ -0,0 +1,102 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft_lvgl_configuration.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#if SERIAL_PORT_2 != -1 + #error "SERIAL_PORT_2 must be set to -1 with HAS_TFT_LVGL_UI and USE_WIFI_FUNCTION." +#endif + +#define WIFI_BAUDRATE 115200 +#define WIFI_UPLOAD_BAUDRATE 1958400 +#define USART_SAFE_INSERT + +#define WIFI_RX_BUF_SIZE (1024+1) + +#include +#include +#include +#include +#include +#include + +#define DEFINE_WFSERIAL(name, n)\ + WifiSerial name(USART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN) + +class WifiSerial { + public: + uint8 wifiRxBuf[WIFI_RX_BUF_SIZE]; + + public: + WifiSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin); + + /* Set up/tear down */ + void begin(uint32 baud); + void begin(uint32 baud,uint8_t config); + void end(); + int available(void); + int read(void); + int write(uint8_t); + inline void wifi_usart_irq(usart_reg_map *regs) { + /* Handling RXNEIE and TXEIE interrupts. + * RXNE signifies availability of a byte in DR. + * + * See table 198 (sec 27.4, p809) in STM document RM0008 rev 15. + * We enable RXNEIE. + */ + if ((regs->CR1 & USART_CR1_RXNEIE) && (regs->SR & USART_SR_RXNE)) { + #ifdef USART_SAFE_INSERT + /* If the buffer is full and the user defines USART_SAFE_INSERT, + * ignore new bytes. */ + rb_safe_insert(this->usart_device->rb, (uint8)regs->DR); + #else + /* By default, push bytes around in the ring buffer. */ + rb_push_insert(this->usart_device->rb, (uint8)regs->DR); + #endif + } + /* TXE signifies readiness to send a byte to DR. */ + if ((regs->CR1 & USART_CR1_TXEIE) && (regs->SR & USART_SR_TXE)) { + if (!rb_is_empty(this->usart_device->wb)) + regs->DR=rb_remove(this->usart_device->wb); + else + regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE + } + } + + int wifi_rb_is_full(void); + + private: + struct usart_dev *usart_device; + uint8 tx_pin; + uint8 rx_pin; +}; + +extern WifiSerial WifiSerial1; + +#define WIFISERIAL WifiSerial1 + +#endif // USE_WIFI_FUNCTION diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp new file mode 100644 index 0000000000..5c025f13f9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -0,0 +1,1927 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "draw_ui.h" +#include "wifi_module.h" +#include "wifi_upload.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" +#include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" +#include "../../../../lcd/ultralcd.h" +#include "../../../../sd/cardreader.h" +#include "../../../../module/planner.h" +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif +#if ENABLED(PARK_HEAD_ON_PAUSE) + #include "../../../../feature/pause.h" +#endif + +#define WIFI_SET() WRITE(WIFI_RESET_PIN, HIGH); +#define WIFI_RESET() WRITE(WIFI_RESET_PIN, LOW); +#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); +#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); + +extern uint8_t Explore_Disk (char* path , uint8_t recu_level); + +extern uint8_t commands_in_queue; +extern uint8_t sel_id; + +int usartFifoAvailable(SZ_USART_FIFO *fifo); +int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len); +int writeUsartFifo(SZ_USART_FIFO * fifo, int8_t * buf, int32_t len); +extern unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick); + +volatile SZ_USART_FIFO WifiRxFifo; + +#define WAIT_ESP_TRANS_TIMEOUT_TICK 10500 + +int cfg_cloud_flag = 0; + +extern PRINT_TIME print_time; + +char wifi_firm_ver[20] = {0}; +WIFI_GCODE_BUFFER espGcodeFifo; +extern uint8_t pause_resum; + +uint8_t wifi_connect_flg = 0; +extern volatile uint8_t get_temp_flag; + + +#define WIFI_MODE 2 +#define WIFI_AP_MODE 3 + +int upload_result = 0; + +uint32_t upload_time = 0; +uint32_t upload_size = 0; + +volatile WIFI_STATE wifi_link_state; +WIFI_PARA wifiPara; +IP_PARA ipPara; +CLOUD_PARA cloud_para; + +char wifi_check_time = 0; + +extern uint8_t gCurDir[100]; + +extern uint32_t wifi_loop_cycle; + +volatile TRANSFER_STATE esp_state; + +uint8_t left_to_send = 0; +uint8_t left_to_save[96] = {0}; + +volatile WIFI_DMA_RCV_FIFO wifiDmaRcvFifo; + +volatile WIFI_TRANS_ERROR wifiTransError; + +static bool need_ok_later = false; + +extern volatile WIFI_STATE wifi_link_state; +extern WIFI_PARA wifiPara; +extern IP_PARA ipPara; +extern CLOUD_PARA cloud_para; + +extern uint8_t once_flag; +extern uint8_t flash_preview_begin; +extern uint8_t default_preview_flg; +extern uint8_t gcode_preview_over; + +extern uint8_t bmp_public_buf[17 * 1024]; + +uint32_t getWifiTick() { + return millis(); +} + +uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { + if (lastTick <= curTick) { + return (curTick - lastTick) * TICK_CYCLE; + } + else { + return (0xffffffff - lastTick + curTick) * TICK_CYCLE; + } +} + +void wifi_delay(int n) { + uint32_t begin = getWifiTick(); + uint32_t end = begin; + + while (getWifiTickDiff(begin, end) < (uint32_t)n) { + end = getWifiTick(); + } +} + +void wifi_reset() { + uint32_t start, now; + start = getWifiTick(); + now = start; + WIFI_RESET(); + while (getWifiTickDiff(start, now) < 500) { + now = getWifiTick(); + } + WIFI_SET(); + +} + +void mount_file_sys(uint8_t disk_type) { + if (disk_type == FILE_SYS_SD) { + card.mount(); + } + else if (disk_type == FILE_SYS_USB) { + + } +} + +static void dma_init() { + #if 0 + __HAL_RCC_DMA1_CLK_ENABLE(); + + //HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); + HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 4, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); + + hdma_usart1_rx.Instance = DMA1_Channel5; + //hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; + hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart1_rx.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart1_rx.Init.Mode = DMA_NORMAL; + hdma_usart1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; + if (HAL_DMA_Init((DMA_HandleTypeDef *)&hdma_usart1_rx) != HAL_OK) { + Error_Handler(); + } + + + HAL_DMA_Start_IT((DMA_HandleTypeDef *)&hdma_usart1_rx, + (uint32_t)&huart1.Instance->DR, + (uint32_t)(&WifiRxFifo.uartTxBuffer[0]), + UART_RX_BUFFER_SIZE); + + //HAL_UART_Receive_DMA(&huart1,(uint8_t*)&WifiRxFifo.uartTxBuffer[0], UART_RX_BUFFER_SIZE); + + /* Enable the DMA transfer for the receiver request by setting the DMAR bit + in the UART CR3 register */ + SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); + + #endif + for (uint8_t i = 0; i < TRANS_RCV_FIFO_BLOCK_NUM; i++) { + wifiDmaRcvFifo.bufferAddr[i] = &bmp_public_buf[1024 * i]; + wifiDmaRcvFifo.state[i] = udisk_buf_empty; + } + + memset(wifiDmaRcvFifo.bufferAddr[0], 0, 1024 * TRANS_RCV_FIFO_BLOCK_NUM); + wifiDmaRcvFifo.read_cur = 0; + wifiDmaRcvFifo.write_cur = 0; + +} + +static void wifi_deInit() { + #if 0 + HAL_DMA_Abort((DMA_HandleTypeDef *)&hdma_usart1_rx); + HAL_DMA_DeInit((DMA_HandleTypeDef *)&hdma_usart1_rx); + __HAL_DMA_DISABLE((DMA_HandleTypeDef *)&hdma_usart1_rx); + #endif +} + +extern uint8_t mksUsart1Rx; + +void esp_port_begin(uint8_t interrupt) { + WifiRxFifo.uart_read_point = 0; + WifiRxFifo.uart_write_point = 0; + #if 0 + NVIC_InitTypeDef NVIC_InitStructure; + + USART_InitTypeDef USART_InitStructure; + GPIO_InitTypeDef GPIO_InitStruct; + + WifiRxFifo.uart_read_point = 0; + WifiRxFifo.uart_write_point = 0; + memset((uint8_t*)WifiRxFifo.uartTxBuffer, 0, sizeof(WifiRxFifo.uartTxBuffer)); + + if (interrupt) { + #if TAN + wifi_deInit (); + + //SZ_STM32_COMInit(COM1, 115200); + __HAL_UART_ENABLE_IT(USART1, USART_IT_RXNE); + + USART_InitStructure.USART_BaudRate = 115200; //���ڵIJ����ʣ�����115200 ��ߴ�4.5Mbits/s + USART_InitStructure.USART_WordLength = USART_WordLength_8b; //�����ֳ���(8�9λ) + USART_InitStructure.USART_StopBits = USART_StopBits_1; //�����õ�ֹͣλ-֧��1��2��ֹͣλ + USART_InitStructure.USART_Parity = USART_Parity_No; //����żУ�� + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //��Ӳ�������� + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //˫��ģʽ��ʹ�ܷ��ͺͽ��� + + __HAL_RCC_USART1_CLK_ENABLE(); + + GPIO_InitStruct.Pin = TFT_WIFI_TX_Pin|TFT_WIFI_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pin = TFT_WIFI_RX_Pin; + HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); + + USART_Init(USART1, &USART_InitStructure); + + NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; + // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + + NVIC_Init(&NVIC_InitStructure); + #else + HAL_UART_DeInit(&huart1); + MX_USART1_UART_Init(3); + //__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); + HAL_UART_Receive_IT(&huart1,&mksUsart1Rx,1); + #endif + } + else{ + #if 0 + NVIC_DisableIRQ(SZ_STM32_COM1_IRQn); + + USART_Cmd(SZ_STM32_COM1, DISABLE); + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); + + SZ_STM32_COMInit(COM1, 1958400); + + USART_Cmd(SZ_STM32_COM1, ENABLE); + + wifi_delay(10); + + dma_init(); + #endif + HAL_UART_DeInit(&huart1); + MX_USART1_UART_Init(5); + //dma1_5_IRQ_sel = 1; + dma_init(); + } + #endif + if (interrupt) { + #if ENABLED(USE_WIFI_FUNCTION) + WIFISERIAL.end(); + for (uint16_t i = 0; i < 65535; i++); + WIFISERIAL.begin(WIFI_BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + //for(uint8_t i=0;i<100;i++)WIFISERIAL.write(0x33); + #endif + } + else { + #if ENABLED(USE_WIFI_FUNCTION) + WIFISERIAL.end(); + for (uint16_t i = 0; i < 65535; i++); + WIFISERIAL.begin(WIFI_UPLOAD_BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + //for(uint16_t i=0;i<65535;i++);//WIFISERIAL.write(0x33); + #endif + dma_init(); + } +} + +#if ENABLED(USE_WIFI_FUNCTION) + +int raw_send_to_wifi(char *buf, int len) { + if (buf == 0 || len <= 0) return 0; + + for (int i = 0; i < len; i++) + WIFISERIAL.write(*(buf + i)); + + return len; +} + +#endif // USE_WIFI_FUNCTION + +void wifi_ret_ack() {} + +char buf_to_wifi[256]; +int index_to_wifi = 0; +int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { + char wifi_ret_head = 0xa5; + char wifi_ret_tail = 0xfc; + + if (type == WIFI_PARA_SET) { + int data_offset = 4; + int apLen = strlen((const char *)uiCfg.wifi_name); + int keyLen = strlen((const char *)uiCfg.wifi_key); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + + buf_to_wifi[data_offset] = gCfgItems.wifi_mode_sel; + buf_to_wifi[data_offset + 1] = apLen; + strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.wifi_name, apLen); + buf_to_wifi[data_offset + apLen + 2] = keyLen; + strncpy(&buf_to_wifi[data_offset + apLen + 3], (const char *)uiCfg.wifi_key, keyLen); + buf_to_wifi[data_offset + apLen + keyLen + 3] = wifi_ret_tail; + + index_to_wifi = apLen + keyLen + 3; + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = index_to_wifi & 0xff; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xff; + + raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + + } + else if (type == WIFI_TRANS_INF) { + if (len > (int)(sizeof(buf_to_wifi) - index_to_wifi - 5)) { + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + return 0; + } + + if (len > 0) { + memcpy(&buf_to_wifi[4 + index_to_wifi], buf, len); + index_to_wifi += len; + + if (index_to_wifi < 1) + return 0; + + if (buf_to_wifi[index_to_wifi + 3] == '\n') { + //mask "wait" "busy" "X:" + if (((buf_to_wifi[4] == 'w') && (buf_to_wifi[5] == 'a') && (buf_to_wifi[6] == 'i') && (buf_to_wifi[7] == 't') ) + || ((buf_to_wifi[4] == 'b') && (buf_to_wifi[5] == 'u') && (buf_to_wifi[6] == 's') && (buf_to_wifi[7] == 'y') ) + || ((buf_to_wifi[4] == 'X') && (buf_to_wifi[5] == ':') ) + ) { + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + return 0; + } + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = index_to_wifi & 0xff; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xff; + buf_to_wifi[4 + index_to_wifi] = wifi_ret_tail; + + raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + } + } + } + else if (type == WIFI_EXCEP_INF) { + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = 1; + buf_to_wifi[3] = 0; + buf_to_wifi[4] = *buf; + buf_to_wifi[5] = wifi_ret_tail; + + raw_send_to_wifi(buf_to_wifi, 6); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + } + else if (type == WIFI_CLOUD_CFG) { + int data_offset = 4; + int urlLen = strlen((const char *)uiCfg.cloud_hostUrl); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + + if (gCfgItems.cloud_enable == true) + buf_to_wifi[data_offset] = 0x0a; + else + buf_to_wifi[data_offset] = 0x05; + + buf_to_wifi[data_offset + 1] = urlLen; + strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.cloud_hostUrl, urlLen); + buf_to_wifi[data_offset + urlLen + 2] = uiCfg.cloud_port & 0xff; + buf_to_wifi[data_offset + urlLen + 3] = (uiCfg.cloud_port >> 8) & 0xff; + buf_to_wifi[data_offset + urlLen + 4] = wifi_ret_tail; + + index_to_wifi = urlLen + 4; + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = index_to_wifi & 0xff; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xff; + + raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + } + else if (type == WIFI_CLOUD_UNBIND) { + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = 0; + buf_to_wifi[3] = 0; + buf_to_wifi[4] = wifi_ret_tail; + + raw_send_to_wifi(buf_to_wifi, 5); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + } +} + + +int send_to_wifi(char *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } + +void set_cur_file_sys(int fileType) { + gCfgItems.fileSysType = fileType; +} + +void get_file_list(char *path) { + if ( path == 0) { + return; + } + + if (gCfgItems.fileSysType == FILE_SYS_SD) { + #if ENABLED(SDSUPPORT) + card.mount(); + #endif + } + else if (gCfgItems.fileSysType == FILE_SYS_USB) { + //udisk + } + Explore_Disk(path, 0); +} + +char wait_ip_back_flag = 0; + +typedef struct { + char write_buf[513]; + int write_index; + uint8_t saveFileName[30]; + uint32_t fileLen; + uint32_t tick_begin; + uint32_t tick_end; +} FILE_WRITER; + +FILE_WRITER file_writer; + +int32_t lastFragment = 0; + +char lastBinaryCmd[50] = {0}; + +int total_write = 0; +char binary_head[2] = {0, 0}; +unsigned char binary_data_len = 0; + +int write_to_file(char *buf, int len) { + int i; + int res; + + for (i = 0; i < len; i++) { + file_writer.write_buf[file_writer.write_index++] = buf[i]; + if (file_writer.write_index >= 512) { + res = card.write(file_writer.write_buf, file_writer.write_index); + if (res == -1) { + return -1; + } + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + } + } + return 0; +} + +#define ESP_PROTOC_HEAD (uint8_t)0xa5 +#define ESP_PROTOC_TAIL (uint8_t)0xfc + +#define ESP_TYPE_NET (uint8_t)0x0 +#define ESP_TYPE_GCODE (uint8_t)0x1 +#define ESP_TYPE_FILE_FIRST (uint8_t)0x2 +#define ESP_TYPE_FILE_FRAGMENT (uint8_t)0x3 + +#define ESP_TYPE_WIFI_LIST (uint8_t)0x4 + +uint8_t esp_msg_buf[UART_RX_BUFFER_SIZE] = {0}; +uint16_t esp_msg_index = 0; + +typedef struct { + uint8_t head; + uint8_t type; + uint16_t dataLen; + uint8_t *data; + uint8_t tail; +} ESP_PROTOC_FRAME; + + +static int cut_msg_head(uint8_t *msg, uint16_t msgLen, uint16_t cutLen) { + if (msgLen < cutLen) return 0; + + else if (msgLen == cutLen) { + memset(msg, 0, msgLen); + return 0; + } + + for (int i = 0; i < (msgLen - cutLen); i++) + msg[i] = msg[cutLen + i]; + + memset(&msg[msgLen - cutLen], 0, cutLen); + + return msgLen - cutLen; +} + + +uint8_t Explore_Disk (char* path , uint8_t recu_level) { + char tmp[200]; + char Fstream[200]; + + if (path == 0)return 0; + + const uint8_t fileCnt = card.get_num_Files(); + + for (uint8_t i = 0; i < fileCnt; i++) { + const uint16_t nr = + #if ENABLED(SDCARD_RATHERRECENTFIRST) && DISABLED(SDCARD_SORT_ALPHA) + fileCnt - 1 - + #endif + i; + + #if ENABLED(SDCARD_SORT_ALPHA) + card.getfilename_sorted(nr); + #else + card.getfilename_sorted(nr); + #endif + memset(tmp, 0, sizeof(tmp)); + //if (card.longFilename[0] == 0) + strcpy(tmp, card.filename); + //else + //strcpy(tmp, card.longFilename); + + memset(Fstream, 0, sizeof(Fstream)); + strcpy(Fstream, tmp); + + if (card.flag.filenameIsDir && (recu_level <= 10)) { + strcat(Fstream, ".DIR\r\n"); + send_to_wifi(Fstream, strlen(Fstream)); + } + else { + strcat(Fstream, "\r\n"); + send_to_wifi(Fstream, strlen(Fstream)); + } + } + + return fileCnt; +} + +static void wifi_gcode_exec(uint8_t *cmd_line) { + int8_t tempBuf[100] = {0}; + uint8_t *tmpStr = 0; + int cmd_value; + volatile int print_rate; + if ((strstr((char *)&cmd_line[0], "\n") != 0) && ((strstr((char *)&cmd_line[0], "G") != 0) || (strstr((char *)&cmd_line[0], "M") != 0) || (strstr((char *)&cmd_line[0], "T") != 0) )) { + + tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "\n"); + if (tmpStr) { + *tmpStr = '\0'; + } + tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "\r"); + if (tmpStr) { + *tmpStr = '\0'; + } + tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "*"); + if (tmpStr) { + *tmpStr = '\0'; + } + tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "M"); + if ( tmpStr) { + cmd_value = atoi((char *)(tmpStr + 1)); + tmpStr = (uint8_t *)strstr((char *)tmpStr, " "); + + switch (cmd_value) { + + case 20: //print sd / udisk file + if (uiCfg.print_state == IDLE) { + int index = 0; + + if (tmpStr == 0) { + gCfgItems.fileSysType = FILE_SYS_SD; + send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); + + get_file_list((char *)"0:/"); + + send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); + + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + break; + } + + while (tmpStr[index] == ' ') + index++; + + if (gCfgItems.wifi_type == ESP_WIFI) { + char *path = (char *)tempBuf; + + if (strlen((char *)&tmpStr[index]) < 80) { + send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); + + if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { + gCfgItems.fileSysType = FILE_SYS_SD; + + } + else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { + gCfgItems.fileSysType = FILE_SYS_USB; + } + strcpy((char *)path, (char *)&tmpStr[index]); + get_file_list(path); + send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); + } + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + } + } + break; + + case 21: + /*init sd card*/ + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + break; + + case 23: + /*select the file*/ + if (uiCfg.print_state == IDLE) { + int index = 0; + while (tmpStr[index] == ' ') + index++; + + if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { + if (strlen((char *)&tmpStr[index]) < 80) { + memset(list_file.file_name[sel_id], 0, sizeof(list_file.file_name[sel_id])); + + if (gCfgItems.wifi_type == ESP_WIFI) { + if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { + gCfgItems.fileSysType = FILE_SYS_SD; + + } + else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { + gCfgItems.fileSysType = FILE_SYS_USB; + } + else { + if (tmpStr[index] != '/') + strcat((char *)list_file.file_name[0], "/"); + } + strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); + + } + else { + strcpy(list_file.file_name[sel_id], (char *)&tmpStr[index]); + } + + char *cur_name=strrchr(list_file.file_name[sel_id],'/'); + + card.openFileRead(cur_name); + + if (card.isFileOpen()) { + send_to_wifi((char *)"File selected\r\n", strlen("File selected\r\n")); + + } + else { + send_to_wifi((char *)"file.open failed\r\n", strlen("file.open failed\r\n")); + strcpy(list_file.file_name[sel_id], "notValid"); + } + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + + } + + + } + } + break; + + case 24: + if (strcmp(list_file.file_name[sel_id], "notValid") != 0) { + if (uiCfg.print_state == IDLE) { + clear_cur_ui(); + reset_print_time(); + start_print_time(); + preview_gcode_prehandle(list_file.file_name[sel_id]); + uiCfg.print_state = WORKING; + lv_draw_printing(); + + if (gcode_preview_over != 1) { + #if ENABLED(SDSUPPORT) + char *cur_name; + cur_name=strrchr(list_file.file_name[sel_id],'/'); + + SdFile file; + SdFile *curDir; + card.endFilePrint(); + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_READ)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + update_spi_flash(); + } + card.openFileRead(cur_name); + if (card.isFileOpen()) { + feedrate_percentage = 100; + //saved_feedrate_percentage = feedrate_percentage; + planner.flow_percentage[0] = 100; + planner.e_factor[0]= planner.flow_percentage[0]*0.01; + if (EXTRUDERS==2) { + planner.flow_percentage[1] = 100; + planner.e_factor[1]= planner.flow_percentage[1]*0.01; + } + card.startFileprint(); + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.prepare(); + #endif + once_flag = 0; + } + #endif + + } + } + else if (uiCfg.print_state == PAUSED) { + uiCfg.print_state = RESUMING; + clear_cur_ui(); + start_print_time(); + + if (gCfgItems.from_flash_pic==1) + flash_preview_begin = 1; + else + default_preview_flg = 1; + lv_draw_printing(); + } + else if (uiCfg.print_state == REPRINTING) { + uiCfg.print_state = REPRINTED; + clear_cur_ui(); + start_print_time(); + if (gCfgItems.from_flash_pic==1) + flash_preview_begin = 1; + else + default_preview_flg = 1; + lv_draw_printing(); + } + } + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + break; + + case 25: + /*pause print file*/ + if (uiCfg.print_state == WORKING) { + stop_print_time(); + + clear_cur_ui(); + + #if ENABLED(SDSUPPORT) + card.pauseSDPrint(); + uiCfg.print_state = PAUSING; + #endif + if (gCfgItems.from_flash_pic==1) + flash_preview_begin = 1; + else + default_preview_flg = 1; + lv_draw_printing(); + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + } + break; + + case 26: + /*stop print file*/ + if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED) || (uiCfg.print_state == REPRINTING)) { + stop_print_time(); + + clear_cur_ui(); + #if ENABLED(SDSUPPORT) + uiCfg.print_state = IDLE; + card.flag.abort_sd_printing = true; + #endif + + lv_draw_ready_print(); + + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + } + break; + + case 27: + /*report print rate*/ + if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)|| (uiCfg.print_state == REPRINTING)) { + print_rate = uiCfg.totalSend; + + memset((char *)tempBuf, 0, sizeof(tempBuf)); + + sprintf((char *)tempBuf, "M27 %d\r\n", print_rate); + + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + + } + + break; + + case 28: + /*begin to transfer file to filesys*/ + if (uiCfg.print_state == IDLE) { + + int index = 0; + while (tmpStr[index] == ' ') + index++; + + if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { + strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); + + if (gCfgItems.fileSysType == FILE_SYS_SD) { + memset(tempBuf, 0, sizeof(tempBuf)); + sprintf((char *)tempBuf, "%s", file_writer.saveFileName); + } + else if (gCfgItems.fileSysType == FILE_SYS_USB) { + memset(tempBuf, 0, sizeof(tempBuf)); + sprintf((char *)tempBuf, "%s", (char *)file_writer.saveFileName); + } + mount_file_sys(gCfgItems.fileSysType); + + #if ENABLED(SDSUPPORT) + char *cur_name=strrchr(list_file.file_name[sel_id],'/'); + card.openFileWrite(cur_name); + if (card.isFileOpen()) { + memset(file_writer.saveFileName, 0, sizeof(file_writer.saveFileName)); + strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); + memset(tempBuf, 0, sizeof(tempBuf)); + sprintf((char *)tempBuf, "Writing to file: %s\r\n", (char *)file_writer.saveFileName); + wifi_ret_ack(); + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + + total_write = 0; + wifi_link_state = WIFI_WAIT_TRANS_START; + + } + else{ + wifi_link_state = WIFI_CONNECTED; + clear_cur_ui(); + lv_draw_dialog(DIALOG_TRANSFER_NO_DEVICE); + } + #endif + + } + + } + break; + case 105: + case 991: + memset(tempBuf, 0, sizeof(tempBuf)); + if (cmd_value == 105) { + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + sprintf((char *)tempBuf,"T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n", + + (float)thermalManager.temp_hotend[0].celsius,(float)thermalManager.temp_hotend[0].target, + #if HAS_HEATED_BED + (float)thermalManager.temp_bed.celsius,(float)thermalManager.temp_bed.target, + #else + (float)0,(float)0, + #endif + (float)thermalManager.temp_hotend[0].celsius,(float)thermalManager.temp_hotend[0].target, + #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + (float)thermalManager.temp_hotend[1].celsius,(float)thermalManager.temp_hotend[1].target + #else + (float)0,(float)0 + #endif + ); + } + else { + sprintf((char *)tempBuf,"T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n", + + (int)thermalManager.temp_hotend[0].celsius,(int)thermalManager.temp_hotend[0].target, + #if HAS_HEATED_BED + (int)thermalManager.temp_bed.celsius,(int)thermalManager.temp_bed.target, + #else + 0,0, + #endif + (int)thermalManager.temp_hotend[0].celsius,(int)thermalManager.temp_hotend[0].target, + #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + (int)thermalManager.temp_hotend[1].celsius,(int)thermalManager.temp_hotend[1].target + #else + 0,0 + #endif + ); + } + + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + + queue.enqueue_one_P(PSTR("M105")); + + break; + case 992: + if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { + memset(tempBuf,0,sizeof(tempBuf)); + sprintf((char *)tempBuf, "M992 %d%d:%d%d:%d%d\r\n", print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); + wifi_ret_ack(); + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + } + + break; + case 994: + if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { + memset(tempBuf,0,sizeof(tempBuf)); + if (strlen((char *)list_file.file_name[sel_id]) > (100-1)) { + return; + } + sprintf((char *)tempBuf, "M994 %s;%d\n", list_file.file_name[sel_id],(int)gCfgItems.curFilesize); + wifi_ret_ack(); + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + } + break; + case 997: + if (uiCfg.print_state == IDLE) { + wifi_ret_ack(); + send_to_wifi((char *)"M997 IDLE\r\n", strlen("M997 IDLE\r\n")); + } + else if (uiCfg.print_state == WORKING) { + wifi_ret_ack(); + send_to_wifi((char *)"M997 PRINTING\r\n", strlen("M997 PRINTING\r\n")); + } + else if (uiCfg.print_state == PAUSED) { + wifi_ret_ack(); + send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); + } + else if (uiCfg.print_state == REPRINTING) { + wifi_ret_ack(); + send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); + } + if (uiCfg.command_send == 0) get_wifi_list_command_send(); + break; + + case 998: + if (uiCfg.print_state == IDLE) { + if (atoi((char *)tmpStr) == 0) { + set_cur_file_sys(0); + } + else if (atoi((char *)tmpStr) == 1) { + set_cur_file_sys(1); + } + wifi_ret_ack(); + } + break; + + case 115: + memset(tempBuf,0,sizeof(tempBuf)); + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + send_to_wifi((char *)"FIRMWARE_NAME:Robin_nano\r\n", strlen("FIRMWARE_NAME:Robin_nano\r\n")); + break; + + default: + strcat((char *)cmd_line, "\n"); + + uint32_t left; + + if (espGcodeFifo.wait_tick> 5) { + + if (espGcodeFifo.r > espGcodeFifo.w) + left = espGcodeFifo.r - espGcodeFifo.w - 1; + else + left = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; + if (left >= strlen((const char *)cmd_line)) { + uint32_t index = 0; + while (index < strlen((const char *)cmd_line)) { + espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; + espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; + index++; + } + if (left - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + else + need_ok_later = true; + + } + + } + break; + + } + } + else{ + strcat((char *)cmd_line, "\n"); + uint32_t left_g; + + if (espGcodeFifo.wait_tick > 5) { + + if (espGcodeFifo.r > espGcodeFifo.w) + left_g = espGcodeFifo.r - espGcodeFifo.w - 1; + else + left_g = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; + if (left_g >= strlen((const char *)cmd_line)) { + uint32_t index = 0; + while (index < strlen((const char *)cmd_line)) { + espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; + espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; + index++; + } + if (left_g - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + else + need_ok_later = true; + + } + } + } + } +} + +static int32_t charAtArray(const uint8_t *_array, uint32_t _arrayLen, uint8_t _char) { + for (uint32_t i = 0; i < _arrayLen; i++) + if (*(_array + i) == _char) return i; + return -1; +} + +void get_wifi_list_command_send() { + char buf[6] = {0}; + buf[0] = 0xA5; + buf[1] = 0x07; + buf[2] = 0x00; + buf[3] = 0x00; + buf[4] = 0xFC; + raw_send_to_wifi(buf, 5); +} + +static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { + int wifiNameLen, wifiKeyLen, hostLen, id_len, ver_len; + + if (msgLen <= 0) return; + //ip + sprintf(ipPara.ip_addr, "%d.%d.%d.%d", msg[0], msg[1], msg[2], msg[3]); + + //port + //connect state + if (msg[6] == 0x0A) + wifi_link_state = WIFI_CONNECTED; + else if (msg[6] == 0x0E) + wifi_link_state = WIFI_EXCEPTION; + else + wifi_link_state = WIFI_NOT_CONFIG; + + //mode + wifiPara.mode = msg[7]; + + + //wifi name + wifiNameLen = msg[8]; + wifiKeyLen = msg[9 + wifiNameLen]; + if (wifiNameLen < 32) { + memset(wifiPara.ap_name, 0, sizeof(wifiPara.ap_name)); + memcpy(wifiPara.ap_name, &msg[9], wifiNameLen); + + memset(&wifi_list.wifiConnectedName,0,sizeof(wifi_list.wifiConnectedName)); + memcpy(&wifi_list.wifiConnectedName,&msg[9],wifiNameLen); + + //wifi key + if (wifiKeyLen < 64) { + memset(wifiPara.keyCode, 0, sizeof(wifiPara.keyCode)); + memcpy(wifiPara.keyCode, &msg[10 + wifiNameLen], wifiKeyLen); + } + } + + + cloud_para.state =msg[10 + wifiNameLen + wifiKeyLen]; + hostLen = msg[11 + wifiNameLen + wifiKeyLen]; + if (cloud_para.state) { + if (hostLen < 96) { + memset(cloud_para.hostUrl, 0, sizeof(cloud_para.hostUrl)); + memcpy(cloud_para.hostUrl, &msg[12 + wifiNameLen + wifiKeyLen], hostLen); + } + cloud_para.port = msg[12 + wifiNameLen + wifiKeyLen + hostLen] + (msg[13 + wifiNameLen + wifiKeyLen + hostLen] << 8); + + } + + // id + id_len = msg[14 + wifiNameLen + wifiKeyLen + hostLen]; + if (id_len == 20) { + memset(cloud_para.id, 0, sizeof(cloud_para.id)); + memcpy(cloud_para.id, (const char *)&msg[15 + wifiNameLen + wifiKeyLen + hostLen], id_len); + } + ver_len = msg[15 + wifiNameLen + wifiKeyLen + hostLen + id_len]; + if (ver_len < 20) { + memset(wifi_firm_ver, 0, sizeof(wifi_firm_ver)); + memcpy(wifi_firm_ver, (const char *)&msg[16 + wifiNameLen + wifiKeyLen + hostLen + id_len], ver_len); + } + + if (uiCfg.configWifi == 1) { + if ((wifiPara.mode != gCfgItems.wifi_mode_sel) + || (strncmp(wifiPara.ap_name, (const char *)uiCfg.wifi_name, 32) != 0) + || (strncmp(wifiPara.keyCode, (const char *)uiCfg.wifi_key, 64) != 0)) { + package_to_wifi(WIFI_PARA_SET, (char *)0, 0); + } + else uiCfg.configWifi = 0; + } + if (cfg_cloud_flag == 1) { + if (((cloud_para.state >> 4) != (char)gCfgItems.cloud_enable) + || (strncmp(cloud_para.hostUrl, (const char *)uiCfg.cloud_hostUrl, 96) != 0) + || (cloud_para.port != uiCfg.cloud_port)) { + package_to_wifi(WIFI_CLOUD_CFG, (char *)0, 0); + } + else cfg_cloud_flag = 0; + } +} + +static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { + int wifiNameLen,wifiMsgIdex=1; + int8_t wifi_name_is_same=0; + int8_t i,j; + int8_t wifi_name_num=0; + uint8_t *str=0; + int8_t valid_name_num; + + if (msgLen <= 0) + return; + if (disp_state == KEY_BOARD_UI) + return; + + wifi_list.getNameNum = msg[0]; + + if (wifi_list.getNameNum < 20) { + uiCfg.command_send = 1; + + memset(wifi_list.wifiName,0,sizeof(wifi_list.wifiName)); + + wifi_name_num = wifi_list.getNameNum; + + valid_name_num=0; + str = wifi_list.wifiName[valid_name_num]; + + if (wifi_list.getNameNum > 0) wifi_list.currentWifipage = 1; + + for (i = 0; i 0x80) { + wifi_name_is_same = 1; + //break; + } + //} + } + if (wifi_name_is_same == 1) { + wifi_name_is_same = 0; + wifiMsgIdex += wifiNameLen; + //wifi_list.RSSI[i] = msg[wifiMsgIdex]; + wifiMsgIdex += 1; + wifi_name_num--; + //i--; + continue; + } + if (i < WIFI_TOTAL_NUMBER-1) { + str = wifi_list.wifiName[++valid_name_num]; + } + } + wifiMsgIdex += wifiNameLen; + wifi_list.RSSI[i] = msg[wifiMsgIdex]; + wifiMsgIdex += 1; + } + wifi_list.getNameNum = wifi_name_num; + if (wifi_list.getNameNum % NUMBER_OF_PAGE == 0) { + wifi_list.getPage = wifi_list.getNameNum/NUMBER_OF_PAGE; + } + else { + wifi_list.getPage = wifi_list.getNameNum/NUMBER_OF_PAGE + 1; + } + wifi_list.nameIndex = 0; + if (disp_state == WIFI_LIST_UI) + disp_wifi_list(); + } +} + +static void gcode_msg_handle(uint8_t * msg, uint16_t msgLen) { + uint8_t gcodeBuf[100] = {0}; + char *index_s; + char *index_e; + + if (msgLen <= 0) + return; + + index_s = (char *)msg; + index_e = (char *)strstr((char *)msg, "\n"); + if (*msg == 'N') { + index_s = (char *)strstr((char *)msg, " "); + while ((*index_s) == ' ') { + index_s++; + } + } + while ((index_e != 0) && ((int)index_s < (int)index_e)) { + if ((int)(index_e - index_s) < (int)sizeof(gcodeBuf)) { + memset(gcodeBuf, 0, sizeof(gcodeBuf)); + + memcpy(gcodeBuf, index_s, index_e - index_s + 1); + + wifi_gcode_exec(gcodeBuf); + } + while ((*index_e == '\r') || (*index_e == '\n')) + index_e++; + + index_s = index_e; + index_e = (char *)strstr(index_s, "\n"); + } +} + +void utf8_2_unicode(uint8_t *source,uint8_t Len) { + uint8_t i=0,char_i=0,char_byte_num=0; + uint16_t u16_h,u16_m,u16_l,u16_value; + uint8_t FileName_unicode[30]; + + memset(FileName_unicode, 0, sizeof(FileName_unicode)); + + while (1) { + char_byte_num = source[i] & 0xF0; + if (source[i] < 0X80) { + //ASCII --1byte + FileName_unicode[char_i] = source[i]; + i += 1; + char_i += 1; + } + else if (char_byte_num == 0XC0 || char_byte_num == 0XD0) { + //--2byte + + u16_h = (((uint16_t)source[i] <<8) & 0x1f00) >> 2; + u16_l = ((uint16_t)source[i+1] & 0x003f); + u16_value = (u16_h | u16_l); + FileName_unicode[char_i] = (uint8_t)((u16_value & 0xff00) >> 8); + FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00ff); + i += 2; + char_i += 2; + } + else if (char_byte_num == 0XE0) { + //--3byte + u16_h = (((uint16_t)source[i] <<8 ) & 0x0f00) << 4; + u16_m = (((uint16_t)source[i+1] << 8) & 0x3f00) >> 2; + u16_l = ((uint16_t)source[i+2] & 0x003f); + u16_value = (u16_h | u16_m | u16_l); + FileName_unicode[char_i] = (uint8_t)((u16_value & 0xff00) >> 8); + FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00ff); + i += 3; + char_i += 2; + } + else if (char_byte_num == 0XF0) { + //--4byte + i += 4; + //char_i += 3; + } + else { + break; + } + if (i >= Len || i >= 255)break; + } + memcpy(source, FileName_unicode, sizeof(FileName_unicode)); +} + +char saveFilePath[50]; + +static bool longName2DosName(const char* longName, uint8_t* dosName) { + uint8_t i = 11; + while (i--) dosName[i] = '\0'; + while (*longName) { + uint8_t c = *longName++; + if (c == '.') { // For a dot... + if (i == 0) return false; + else { strcat((char *)dosName,".GCO"); return dosName[0] != '\0'; } + } + else { + // Fail for illegal characters + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + while (uint8_t b = pgm_read_byte(p++)) if (b == c) return false; + if (c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters + dosName[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name + } + if (i >= 5) strcat((char *)dosName,"~1.GCO"); + } + return dosName[0] != '\0'; // Return true if any name was set +} + +static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { + uint8_t fileNameLen = *msg; + + if (msgLen != fileNameLen + 5) return; + + file_writer.fileLen = *((uint32_t *)(msg + 1)); + memset(file_writer.saveFileName, 0, sizeof(file_writer.saveFileName)); + + memcpy(file_writer.saveFileName, msg + 5, fileNameLen); + + utf8_2_unicode(file_writer.saveFileName,fileNameLen); + + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + + if (strlen((const char *)file_writer.saveFileName) > sizeof(saveFilePath)) + return; + + memset(saveFilePath, 0, sizeof(saveFilePath)); + + if (gCfgItems.fileSysType == FILE_SYS_SD) { + //sprintf((char *)saveFilePath, "/%s", file_writer.saveFileName); + card.mount(); + + //ZERO(list_file.long_name[sel_id]); + //memcpy(list_file.long_name[sel_id],file_writer.saveFileName,sizeof(list_file.long_name[sel_id])); + } + else if (gCfgItems.fileSysType == FILE_SYS_USB) { + + } + file_writer.write_index = 0; + lastFragment = -1; + + wifiTransError.flag = 0; + wifiTransError.start_tick = 0; + wifiTransError.now_tick = 0; + + TERN_(SDSUPPORT, card.closefile()); + + wifi_delay(1000); + + #if ENABLED(SDSUPPORT) + + uint8_t dosName[FILENAME_LENGTH]; + + if (!longName2DosName((const char *)file_writer.saveFileName,dosName)) { + clear_cur_ui(); + upload_result = 2; + wifiTransError.flag = 1; + wifiTransError.start_tick = getWifiTick(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + return; + } + sprintf((char *)saveFilePath, "/%s", dosName); + + ZERO(list_file.long_name[sel_id]); + memcpy(list_file.long_name[sel_id],dosName,sizeof(dosName)); + + char *cur_name=strrchr((const char *)saveFilePath,'/'); + + SdFile file; + SdFile *curDir; + card.endFilePrint(); + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { + gCfgItems.curFilesize = file.fileSize(); + } + else { + clear_cur_ui(); + upload_result = 2; + wifiTransError.flag = 1; + wifiTransError.start_tick = getWifiTick(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + return; + } + #endif + + wifi_link_state = WIFI_TRANS_FILE; + + upload_result = 1; + + clear_cur_ui(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + + lv_task_handler(); + + file_writer.tick_begin = getWifiTick(); +} + +#define FRAG_MASK _BV32(31) + +static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { + uint32_t frag = *((uint32_t *)msg); + + if ((frag & FRAG_MASK) != (uint32_t)(lastFragment + 1)) { + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + wifi_link_state = WIFI_CONNECTED; + upload_result = 2; + } + else { + if (write_to_file((char *)msg + 4, msgLen - 4) < 0) { + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + wifi_link_state = WIFI_CONNECTED; + upload_result = 2; + return; + } + lastFragment = frag; + + if ((frag & (~FRAG_MASK))) { + int res = card.write(file_writer.write_buf, file_writer.write_index); + if (res == -1) { + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + wifi_link_state = WIFI_CONNECTED; + upload_result = 2; + return; + } + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + file_writer.tick_end = getWifiTick(); + upload_time = getWifiTickDiff(file_writer.tick_begin, file_writer.tick_end) / 1000; + upload_size = gCfgItems.curFilesize; + wifi_link_state = WIFI_CONNECTED; + upload_result = 3; + } + + } +} + +void esp_data_parser(char *cmdRxBuf, int len) { + int32_t head_pos; + int32_t tail_pos; + uint16_t cpyLen; + int16_t leftLen = len; + bool loop_again = false; + + ESP_PROTOC_FRAME esp_frame; + + while (leftLen > 0 || loop_again) { + loop_again = false; + + if (esp_msg_index != 0) { + head_pos = 0; + cpyLen = (leftLen < (int16_t)((sizeof(esp_msg_buf) - esp_msg_index)) ? leftLen : sizeof(esp_msg_buf) - esp_msg_index); + + memcpy(&esp_msg_buf[esp_msg_index], cmdRxBuf + len - leftLen, cpyLen); + + esp_msg_index += cpyLen; + + leftLen = leftLen - cpyLen; + tail_pos = charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL); + + if (tail_pos == -1) { + if (esp_msg_index >= sizeof(esp_msg_buf)) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + } + return; + } + } + else { + head_pos = charAtArray((uint8_t const *)&cmdRxBuf[len - leftLen], leftLen, ESP_PROTOC_HEAD); + if (head_pos == -1) return; + + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + memcpy(esp_msg_buf, &cmdRxBuf[len - leftLen + head_pos], leftLen - head_pos); + + esp_msg_index = leftLen - head_pos; + + leftLen = 0; + head_pos = 0; + tail_pos = charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL); + if (tail_pos == -1) { + if (esp_msg_index >= sizeof(esp_msg_buf)) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + } + return; + } + } + + esp_frame.type = esp_msg_buf[1]; + if ((esp_frame.type != ESP_TYPE_NET) && (esp_frame.type != ESP_TYPE_GCODE) + && (esp_frame.type != ESP_TYPE_FILE_FIRST) && (esp_frame.type != ESP_TYPE_FILE_FRAGMENT) + &&(esp_frame.type != ESP_TYPE_WIFI_LIST)) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + return; + } + + esp_frame.dataLen = esp_msg_buf[2] + (esp_msg_buf[3] << 8); + + if ((int)(4 + esp_frame.dataLen) > (int)(sizeof(esp_msg_buf))) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + return; + } + + if (esp_msg_buf[4 + esp_frame.dataLen] != ESP_PROTOC_TAIL) { + if (esp_msg_index >= sizeof(esp_msg_buf)) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + } + return; + } + + esp_frame.data = &esp_msg_buf[4]; + switch (esp_frame.type) { + case ESP_TYPE_NET: + net_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + case ESP_TYPE_GCODE: + gcode_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + case ESP_TYPE_FILE_FIRST: + file_first_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + case ESP_TYPE_FILE_FRAGMENT: + file_fragment_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + case ESP_TYPE_WIFI_LIST: + wifi_list_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + default: break; + } + + esp_msg_index = cut_msg_head(esp_msg_buf, esp_msg_index, esp_frame.dataLen + 5); + if (esp_msg_index > 0) { + if (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) == -1) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + return; + } + + if ((charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) != -1) && (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL) != -1)) + loop_again = true; + } + } +} + +int32_t tick_net_time1, tick_net_time2; + +int storeRcvData(int32_t len) { + unsigned char tmpW = wifiDmaRcvFifo.write_cur; + if (len <= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpW] == udisk_buf_empty) { + for (uint16_t i = 0; i < len; i++) + wifiDmaRcvFifo.bufferAddr[tmpW][i] = WIFISERIAL.read(); + wifiDmaRcvFifo.state[tmpW] = udisk_buf_full; + wifiDmaRcvFifo.write_cur = (tmpW + 1) % TRANS_RCV_FIFO_BLOCK_NUM; + return 1; + } + return 0; +} + +int32_t readWifiFifo(uint8_t *retBuf, uint32_t bufLen) { + unsigned char tmpR = wifiDmaRcvFifo.read_cur; + if (bufLen >= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpR] == udisk_buf_full) { + memcpy(retBuf, (unsigned char *)wifiDmaRcvFifo.bufferAddr[tmpR], UDISKBUFLEN); + wifiDmaRcvFifo.state[tmpR] = udisk_buf_empty; + wifiDmaRcvFifo.read_cur = (tmpR + 1) % TRANS_RCV_FIFO_BLOCK_NUM; + return UDISKBUFLEN; + } + return 0; +} + +void stopEspTransfer() { + if (wifi_link_state == WIFI_TRANS_FILE) + wifi_link_state = WIFI_CONNECTED; + + TERN_(SDSUPPORT, card.closefile()); + + if (upload_result != 3) { + wifiTransError.flag = 1; + wifiTransError.start_tick = getWifiTick(); + card.removeFile((const char *)saveFilePath); + } + else { + } + wifi_delay(200); + WIFI_IO1_SET(); + //exchangeFlashMode(1); //change spi flash to use dma mode + esp_port_begin(1); + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); +} + +void wifi_rcv_handle() { + int32_t len = 0; + uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = {0}; + int8_t getDataF = 0; + + if (wifi_link_state == WIFI_TRANS_FILE) { + #if 0 + if (WIFISERIAL.available() == UART_RX_BUFFER_SIZE) { + for (uint16_t i=0;i 0) { + esp_data_parser((char *)ucStr, len); + if (wifi_link_state == WIFI_CONNECTED) { + clear_cur_ui(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + stopEspTransfer(); + } + getDataF = 1; + } + if (esp_state == TRANSFER_STORE) { + if (storeRcvData(UART_RX_BUFFER_SIZE)) { + esp_state = TRANSFERING; + //esp_dma_pre(); + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); + } + else + WIFI_IO1_SET(); + } + } + else { + //len = readUsartFifo((SZ_USART_FIFO *)&WifiRxFifo, (int8_t *)ucStr, UART_RX_BUFFER_SIZE); + len = readWifiBuf((int8_t *)ucStr, UART_RX_BUFFER_SIZE); + if (len > 0) { + esp_data_parser((char *)ucStr, len); + + if (wifi_link_state == WIFI_TRANS_FILE) { + //exchangeFlashMode(0); //change spi flash not use dma mode + wifi_delay(10); + esp_port_begin(0); + wifi_delay(10); + tick_net_time1 = 0; + } + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); + getDataF = 1; + } + if (need_ok_later && (queue.length < BUFSIZE)) { + need_ok_later = false; + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + } + } + + if (getDataF == 1) { + tick_net_time1 = getWifiTick(); + } + else { + tick_net_time2 = getWifiTick(); + + if (wifi_link_state == WIFI_TRANS_FILE) { + if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 4500)) { + wifi_link_state = WIFI_CONNECTED; + upload_result = 2; + clear_cur_ui(); + stopEspTransfer(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + } + } + + if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 10000)) + wifi_link_state = WIFI_NOT_CONFIG; + + if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 120000)) { + wifi_link_state = WIFI_NOT_CONFIG; + wifi_reset(); + tick_net_time1 = getWifiTick(); + } + } + + if (wifiTransError.flag == 0x1) { + wifiTransError.now_tick = getWifiTick(); + if (getWifiTickDiff(wifiTransError.start_tick, wifiTransError.now_tick) > WAIT_ESP_TRANS_TIMEOUT_TICK) { + wifiTransError.flag = 0; + WIFI_IO1_RESET(); + } + } +} + +void wifi_looping() { + do { wifi_rcv_handle(); } while (wifi_link_state == WIFI_TRANS_FILE); +} + +void mks_esp_wifi_init() { + wifi_link_state = WIFI_NOT_CONFIG; + + SET_OUTPUT(WIFI_RESET_PIN); + WIFI_SET(); + SET_OUTPUT(WIFI_IO1_PIN); + SET_INPUT_PULLUP(WIFI_IO0_PIN); + WIFI_IO1_SET(); + + esp_state = TRANSFER_IDLE; + esp_port_begin(1); + + wifi_reset(); + + #if 0 + res = f_open(&esp_upload.uploadFile, ESP_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); + + if (res == FR_OK) { + f_close(&esp_upload.uploadFile); + + wifi_delay(2000); + + if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { + return; + } + + clear_cur_ui(); + + draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); + + if (wifi_upload(0) >= 0) { + + f_unlink("1:/MKS_WIFI_CUR"); + f_rename(ESP_FIRMWARE_FILE,"/MKS_WIFI_CUR"); + } + draw_return_ui(); + + update_flag = 1; + } + if (update_flag == 0) { + res = f_open(&esp_upload.uploadFile, ESP_WEB_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); + + if (res == FR_OK) { + f_close(&esp_upload.uploadFile); + + wifi_delay(2000); + + if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { + return; + } + + clear_cur_ui(); + + draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); + if (wifi_upload(1) >= 0) { + + f_unlink("1:/MKS_WIFI_CUR"); + f_rename(ESP_WEB_FIRMWARE_FILE,"/MKS_WIFI_CUR"); + } + draw_return_ui(); + update_flag = 1; + } + + } + if (update_flag == 0) { + res = f_open(&esp_upload.uploadFile, ESP_WEB_FILE, FA_OPEN_EXISTING | FA_READ); + if (res == FR_OK) { + f_close(&esp_upload.uploadFile); + + wifi_delay(2000); + + if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { + return; + } + + clear_cur_ui(); + + draw_dialog(DIALOG_TYPE_UPDATE_ESP_DATA); + + if (wifi_upload(2) >= 0) { + + f_unlink("1:/MKS_WEB_CONTROL_CUR"); + f_rename(ESP_WEB_FILE,"/MKS_WEB_CONTROL_CUR"); + } + draw_return_ui(); + } + } + #endif + wifiPara.decodeType = WIFI_DECODE_TYPE; + wifiPara.baud = 115200; + wifi_link_state = WIFI_NOT_CONFIG; +} + +#define BUF_INC_POINTER(p) ((p + 1 == UART_FIFO_BUFFER_SIZE) ? 0 : (p + 1)) + +int usartFifoAvailable(SZ_USART_FIFO *fifo) { + int diff = fifo->uart_write_point - fifo->uart_read_point; + if (diff < 0) diff += UART_FIFO_BUFFER_SIZE; + return diff; +} + +int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { + int i = 0 ; + while (i < len && fifo->uart_read_point != fifo->uart_write_point) { + buf[i++] = fifo->uartTxBuffer[fifo->uart_read_point]; + fifo->uart_read_point = BUF_INC_POINTER(fifo->uart_read_point); + } + return i; +} + +int writeUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { + if (buf == 0 || len <= 0) return -1; + + int i = 0 ; + while (i < len && fifo->uart_read_point != BUF_INC_POINTER(fifo->uart_write_point)) { + fifo->uartTxBuffer[fifo->uart_write_point] = buf[i++]; + fifo->uart_write_point = BUF_INC_POINTER(fifo->uart_write_point); + } + return i; +} + +void get_wifi_commands() { + static char wifi_line_buffer[MAX_CMD_SIZE]; + static bool wifi_comment_mode = false; + static int wifi_read_count = 0; + + if (espGcodeFifo.wait_tick > 5) { + while ((queue.length < BUFSIZE) && (espGcodeFifo.r != espGcodeFifo.w)) { + + espGcodeFifo.wait_tick = 0; + + char wifi_char = espGcodeFifo.Buffer[espGcodeFifo.r]; + + espGcodeFifo.r = (espGcodeFifo.r + 1) % WIFI_GCODE_BUFFER_SIZE; + + /** + * If the character ends the line + */ + if (wifi_char == '\n' || wifi_char == '\r') { + + wifi_comment_mode = false; // end of line == end of comment + + if (!wifi_read_count) continue; // skip empty lines + + wifi_line_buffer[wifi_read_count] = 0; // terminate string + wifi_read_count = 0; //reset buffer + + char* command = wifi_line_buffer; + while (*command == ' ') command++; // skip any leading spaces + + // Movement commands alert when stopped + if (IsStopped()) { + char* gpos = strchr(command, 'G'); + if (gpos) { + switch (strtol(gpos + 1, nullptr, 10)) { + case 0 ... 1: + #if ENABLED(ARC_SUPPORT) + case 2 ... 3: + #endif + #if ENABLED(BEZIER_CURVE_SUPPORT) + case 5: + #endif + SERIAL_ECHOLNPGM(STR_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + break; + } + } + } + + #if DISABLED(EMERGENCY_PARSER) + // Process critical commands early + if (strcmp(command, "M108") == 0) { + wait_for_heatup = false; + TERN_(HAS_LCD_MENU, wait_for_user = false); + } + if (strcmp(command, "M112") == 0) kill(M112_KILL_STR, nullptr, true); + if (strcmp(command, "M410") == 0) quickstop_stepper(); + #endif + + // Add the command to the queue + queue.enqueue_one_P(wifi_line_buffer); + } + else if (wifi_read_count >= MAX_CMD_SIZE - 1) { + + } + else { // it's not a newline, carriage return or escape char + if (wifi_char == ';') wifi_comment_mode = true; + if (!wifi_comment_mode) wifi_line_buffer[wifi_read_count++] = wifi_char; + } + } + }// queue has space, serial has data + else { + espGcodeFifo.wait_tick++; + } +} + +int readWifiBuf(int8_t *buf, int32_t len) { + int i = 0; + while (i < len && WIFISERIAL.available()) + buf[i++] = WIFISERIAL.read(); + return i; +} + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h new file mode 100644 index 0000000000..0b402a3adb --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -0,0 +1,202 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +#include "../../inc/MarlinConfigPre.h" + +#include +#include +#include + +#define UART_RX_BUFFER_SIZE 1024 +#define UART_FIFO_BUFFER_SIZE 1024 + +#define ESP_WIFI 0x02 + +#define AP_MODEL 0x01 +#define STA_MODEL 0x02 + +#define WIFI_DECODE_TYPE 1 + +#define IP_DHCP_FLAG 1 + +#define WIFI_AP_NAME "TP-LINK_MKS" +#define WIFI_KEY_CODE "makerbase" + +#define IP_ADDR "192.168.3.100" +#define IP_MASK "255.255.255.0" +#define IP_GATE "192.168.3.1" +#define IP_DNS "192.168.3.1" + +#define AP_IP_DHCP_FLAG 1 +#define AP_IP_ADDR "192.168.3.100" +#define AP_IP_MASK "255.255.255.0" +#define AP_IP_GATE "192.168.3.1" +#define AP_IP_DNS "192.168.3.1" +#define IP_START_IP "192.168.3.1" +#define IP_END_IP "192.168.3.255" + +#define UDISKBUFLEN 1024 + +typedef enum{ + udisk_buf_empty = 0, + udisk_buf_full, +} UDISK_DATA_BUFFER_STATE; + +#define TRANS_RCV_FIFO_BLOCK_NUM 8 + +typedef struct { + unsigned char *bufferAddr[TRANS_RCV_FIFO_BLOCK_NUM]; + unsigned char *p; + UDISK_DATA_BUFFER_STATE state[TRANS_RCV_FIFO_BLOCK_NUM]; + unsigned char read_cur; + unsigned char write_cur; +} WIFI_DMA_RCV_FIFO; + +typedef struct { + uint8_t flag; // 0x0: no error; 0x01: error + uint32_t start_tick; //error start time + uint32_t now_tick; +} WIFI_TRANS_ERROR; + +extern volatile WIFI_TRANS_ERROR wifiTransError; + +typedef struct { + char ap_name[32]; //wifi-name + char keyCode[64]; //wifi password + int decodeType; + int baud; + int mode; +} WIFI_PARA; + +typedef struct { + char state; + char hostUrl[96]; + int port; + char id[21]; +} CLOUD_PARA; + +typedef struct { + char dhcp_flag; + char ip_addr[16]; + char mask[16]; + char gate[16]; + char dns[16]; + + char dhcpd_flag; + char dhcpd_ip[16]; + char dhcpd_mask[16]; + char dhcpd_gate[16]; + char dhcpd_dns[16]; + char start_ip_addr[16]; + char end_ip_addr[16]; +} IP_PARA; + +typedef enum { + WIFI_NOT_CONFIG, + WIFI_CONFIG_MODE, + WIFI_CONFIG_DHCP, + WIFI_CONFIG_AP, + WIFI_CONFIG_IP_INF, + WIFI_CONFIG_DNS, + WIFI_CONFIG_TCP, + WIFI_CONFIG_SERVER, + WIFI_CONFIG_REMOTE_PORT, + WIFI_CONFIG_BAUD, + WIFI_CONFIG_COMMINT, + WIFI_CONFIG_OK, + WIFI_GET_IP_OK, + WIFI_RECONN, + WIFI_CONNECTED, + WIFI_WAIT_TRANS_START, + WIFI_TRANS_FILE, + WIFI_CONFIG_DHCPD, + WIFI_COFIG_DHCPD_IP, + WIFI_COFIG_DHCPD_DNS, + WIFI_EXCEPTION, +} WIFI_STATE; + +typedef enum { + TRANSFER_IDLE, + TRANSFERING, + TRANSFER_STORE, +} TRANSFER_STATE; +extern volatile TRANSFER_STATE esp_state; + +typedef struct { + char buf[20][80]; + int rd_index; + int wt_index; +} QUEUE; + +typedef enum { + WIFI_PARA_SET, // 0x0:net parameter + WIFI_PRINT_INF, // 0x1:print message + WIFI_TRANS_INF, // 0x2:Pass through information + WIFI_EXCEP_INF, // 0x3:Exception information + WIFI_CLOUD_CFG, // 0x4:cloud config + WIFI_CLOUD_UNBIND, // 0x5:Unbind ID +} WIFI_RET_TYPE; + +typedef struct { + uint32_t uart_read_point; + uint32_t uart_write_point; + uint8_t uartTxBuffer[UART_FIFO_BUFFER_SIZE]; +} SZ_USART_FIFO; + +#define WIFI_GCODE_BUFFER_LEAST_SIZE 96 +#define WIFI_GCODE_BUFFER_SIZE (WIFI_GCODE_BUFFER_LEAST_SIZE * 3) +typedef struct { + uint8_t wait_tick; + uint8_t Buffer[WIFI_GCODE_BUFFER_SIZE]; + uint32_t r; + uint32_t w; +} WIFI_GCODE_BUFFER; + +extern volatile WIFI_STATE wifi_link_state; +extern WIFI_PARA wifiPara; +extern IP_PARA ipPara; +extern CLOUD_PARA cloud_para; + +extern WIFI_GCODE_BUFFER espGcodeFifo; + +extern uint32_t getWifiTick(); +extern uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); + +extern void mks_esp_wifi_init(); +extern int cfg_cloud_flag; +extern int send_to_wifi(char *buf, int len); +extern void wifi_looping(); +extern int raw_send_to_wifi(char *buf, int len); +extern int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len); +extern void get_wifi_list_command_send(); +extern void get_wifi_commands(); +extern int readWifiBuf(int8_t *buf, int32_t len); +extern int storeRcvData(int32_t len); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp new file mode 100644 index 0000000000..132838c8a9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -0,0 +1,847 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "draw_ui.h" +#include "wifi_module.h" +#include "wifi_upload.h" + +#include "../../../../MarlinCore.h" + +#define WIFI_SET() WRITE(WIFI_RESET_PIN, HIGH); +#define WIFI_RESET() WRITE(WIFI_RESET_PIN, LOW); +#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); +#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); + +extern SZ_USART_FIFO WifiRxFifo; + +extern int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len); +extern int writeUsartFifo(SZ_USART_FIFO * fifo, int8_t * buf, int32_t len); +extern void esp_port_begin(uint8_t interrupt); +extern int usartFifoAvailable(SZ_USART_FIFO *fifo); +extern void wifi_delay(int n); + +#define ARRAY_SIZE(a) sizeof(a) / sizeof((a)[0]) + +//typedef signed char bool; + +// ESP8266 command codes +const uint8_t ESP_FLASH_BEGIN = 0x02; +const uint8_t ESP_FLASH_DATA = 0x03; +const uint8_t ESP_FLASH_END = 0x04; +const uint8_t ESP_MEM_BEGIN = 0x05; +const uint8_t ESP_MEM_END = 0x06; +const uint8_t ESP_MEM_DATA = 0x07; +const uint8_t ESP_SYNC = 0x08; +const uint8_t ESP_WRITE_REG = 0x09; +const uint8_t ESP_READ_REG = 0x0a; + +// MAC address storage locations +const uint32_t ESP_OTP_MAC0 = 0x3ff00050; +const uint32_t ESP_OTP_MAC1 = 0x3ff00054; +const uint32_t ESP_OTP_MAC2 = 0x3ff00058; +const uint32_t ESP_OTP_MAC3 = 0x3ff0005c; + +const size_t EspFlashBlockSize = 0x0400; // 1K byte blocks + +const uint8_t ESP_IMAGE_MAGIC = 0xe9; +const uint8_t ESP_CHECKSUM_MAGIC = 0xef; + +const uint32_t ESP_ERASE_CHIP_ADDR = 0x40004984; // &SPIEraseChip +const uint32_t ESP_SEND_PACKET_ADDR = 0x40003c80; // &send_packet +const uint32_t ESP_SPI_READ_ADDR = 0x40004b1c; // &SPIRead +const uint32_t ESP_UNKNOWN_ADDR = 0x40001121; // not used +const uint32_t ESP_USER_DATA_RAM_ADDR = 0x3ffe8000; // &user data ram +const uint32_t ESP_IRAM_ADDR = 0x40100000; // instruction RAM +const uint32_t ESP_FLASH_ADDR = 0x40200000; // address of start of Flash +//const uint32_t ESP_FLASH_READ_STUB_BEGIN = IRAM_ADDR + 0x18; + +UPLOAD_STRUCT esp_upload; + +static const unsigned int retriesPerReset = 3; +static const uint32_t connectAttemptInterval = 50; +static const unsigned int percentToReportIncrement = 5; // how often we report % complete +static const uint32_t defaultTimeout = 500; +static const uint32_t eraseTimeout = 15000; +static const uint32_t blockWriteTimeout = 200; +static const uint32_t blockWriteInterval = 15; // 15ms is long enough, 10ms is mostly too short + +// Messages corresponding to result codes, should make sense when followed by " error" +const char *resultMessages[] = { + "no", + "timeout", + "comm write", + "connect", + "bad reply", + "file read", + "empty file", + "response header", + "slip frame", + "slip state", + "slip data" +}; + +// A note on baud rates. +// The ESP8266 supports 921600, 460800, 230400, 115200, 74880 and some lower baud rates. +// 921600b is not reliable because even though it sometimes succeeds in connecting, we get a bad response during uploading after a few blocks. +// Probably our UART ISR cannot receive bytes fast enough, perhaps because of the latency of the system tick ISR. +// 460800b doesn't always manage to connect, but if it does then uploading appears to be reliable. +// 230400b always manages to connect. +static const uint32_t uploadBaudRates[] = { 460800, 230400, 115200, 74880 }; + + + +signed char IsReady() { + return esp_upload.state == upload_idle; +} + + + + + +void uploadPort_write(const uint8_t *buf, size_t len) { + #if 0 + int i; + + for(i = 0; i < len; i++) { + while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); + + USART_SendData(USART1, *(buf + i)); + } + #endif +} + +char uploadPort_read() { + uint8_t retChar; + if (readUsartFifo(&WifiRxFifo, (int8_t *)&retChar, 1) == 1) + return retChar; + else + return 0; + +} + +int uploadPort_available() { + return usartFifoAvailable(&WifiRxFifo); +} + + +void uploadPort_begin() { + esp_port_begin(1); +} + +void uploadPort_close() { + + //WIFI_COM.end(); + //WIFI_COM.begin(115200, true); + + esp_port_begin(0); + +} + + +void flushInput() { + while (uploadPort_available() != 0) { + (void)uploadPort_read(); + //IWDG_ReloadCounter(); + } +} + +// Extract 1-4 bytes of a value in little-endian order from a buffer beginning at a specified offset +uint32_t getData(unsigned byteCnt, const uint8_t *buf, int ofst) { + uint32_t val = 0; + + if (buf && byteCnt) { + unsigned int shiftCnt = 0; + if (byteCnt > 4) + byteCnt = 4; + do{ + val |= (uint32_t)buf[ofst++] << shiftCnt; + shiftCnt += 8; + } while (--byteCnt); + } + return(val); +} + +// Put 1-4 bytes of a value in little-endian order into a buffer beginning at a specified offset. +void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { + if (buf && byteCnt) { + if (byteCnt > 4) { + byteCnt = 4; + } + do { + buf[ofst++] = (uint8_t)(val & 0xff); + val >>= 8; + } while (--byteCnt); + } +} + +// Read a byte optionally performing SLIP decoding. The return values are: +// +// 2 - an escaped byte was read successfully +// 1 - a non-escaped byte was read successfully +// 0 - no data was available +// -1 - the value 0xc0 was encountered (shouldn't happen) +// -2 - a SLIP escape byte was found but the following byte wasn't available +// -3 - a SLIP escape byte was followed by an invalid byte +int ReadByte(uint8_t *data, signed char slipDecode) { + if (uploadPort_available() == 0) { + return(0); + } + + // at least one byte is available + *data = uploadPort_read(); + if (!slipDecode) { + return(1); + } + + if (*data == 0xc0) { + // this shouldn't happen + return(-1); + } + + // if not the SLIP escape, we're done + if (*data != 0xdb) { + return(1); + } + + // SLIP escape, check availability of subsequent byte + if (uploadPort_available() == 0) { + return(-2); + } + + // process the escaped byte + *data = uploadPort_read(); + if (*data == 0xdc) { + *data = 0xc0; + return(2); + } + + if (*data == 0xdd) { + *data = 0xdb; + return(2); + } + // invalid + return(-3); +} +// When we write a sync packet, there must be no gaps between most of the characters. +// So use this function, which does a block write to the UART buffer in the latest CoreNG. +void _writePacketRaw(const uint8_t *buf, size_t len) { + uploadPort_write(buf, len); +} + +// Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. +void WriteByteRaw(uint8_t b) { + uploadPort_write((const uint8_t *)&b, 1); +} + +// Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. +void WriteByteSlip(uint8_t b) { + if (b == 0xC0) { + WriteByteRaw(0xDB); + WriteByteRaw(0xDC); + } + else if (b == 0xDB) { + WriteByteRaw(0xDB); + WriteByteRaw(0xDD); + } + else { + uploadPort_write((const uint8_t *)&b, 1); + } +} + +// Wait for a data packet to be returned. If the body of the packet is +// non-zero length, return an allocated buffer indirectly containing the +// data and return the data length. Note that if the pointer for returning +// the data buffer is NULL, the response is expected to be two bytes of zero. +// +// If an error occurs, return a negative value. Otherwise, return the number +// of bytes in the response (or zero if the response was not the standard "two bytes of zero"). +EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t msTimeout) { + typedef enum { + begin = 0, + header, + body, + end, + done + } PacketState; + + uint8_t resp, opRet; + + const size_t headerLength = 8; + + uint32_t startTime = getWifiTick(); + uint8_t hdr[headerLength]; + uint16_t hdrIdx = 0; + + uint16_t bodyIdx = 0; + uint8_t respBuf[2]; + + // wait for the response + uint16_t needBytes = 1; + + PacketState state = begin; + + *bodyLen = 0; + + + while (state != done) { + uint8_t c; + EspUploadResult stat; + + //IWDG_ReloadCounter(); + + if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) { + return(timeout); + } + + if (uploadPort_available() < needBytes) { + // insufficient data available + // preferably, return to Spin() here + continue; + } + + // sufficient bytes have been received for the current state, process them + switch(state) { + case begin: // expecting frame start + c = uploadPort_read(); + if (c != (uint8_t)0xc0) { + break; + } + state = header; + needBytes = 2; + + break; + case end: // expecting frame end + c = uploadPort_read(); + if (c != (uint8_t)0xc0) { + return slipFrame; + } + state = done; + + break; + + case header: // reading an 8-byte header + case body: // reading the response body + { + int rslt; + // retrieve a byte with SLIP decoding + rslt = ReadByte(&c, 1); + if (rslt != 1 && rslt != 2) { + // some error occurred + stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; + return stat; + } + else if (state == header) { + //store the header byte + hdr[hdrIdx++] = c; + if (hdrIdx >= headerLength) { + // get the body length, prepare a buffer for it + *bodyLen = (uint16_t)getData(2, hdr, 2); + + // extract the value, if requested + if (valp != 0) { + *valp = getData(4, hdr, 4); + } + + if (*bodyLen != 0) { + state = body; + } + else { + needBytes = 1; + state = end; + } + } + } + else { + // Store the response body byte, check for completion + if (bodyIdx < ARRAY_SIZE(respBuf)) { + respBuf[bodyIdx] = c; + } + ++bodyIdx; + if (bodyIdx >= *bodyLen) { + needBytes = 1; + state = end; + } + } + } + break; + + default: // this shouldn't happen + return slipState; + } + } + + // Extract elements from the header + resp = (uint8_t)getData(1, hdr, 0); + opRet = (uint8_t)getData(1, hdr, 1); + // Sync packets often provoke a response with a zero opcode instead of ESP_SYNC + if (resp != 0x01 || opRet != op) { +//debug//printf("resp %02x %02x\n", resp, opRet); + return respHeader; + } + + return success; +} + +// Send a block of data performing SLIP encoding of the content. +void _writePacket(const uint8_t *data, size_t len) { + unsigned char outBuf[2048] = {0}; + unsigned int outIndex = 0; + while (len != 0) { + if (*data == 0xC0) { + outBuf[outIndex++] = 0xDB; + outBuf[outIndex++] = 0xDC; + } + else if (*data == 0xDB) { + outBuf[outIndex++] = 0xDB; + outBuf[outIndex++] = 0xDD; + } + else { + outBuf[outIndex++] = *data; + + } + data++; + --len; + } + uploadPort_write((const uint8_t *)outBuf, outIndex); +} + +// Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. +// A SLIP packet begins and ends with 0xc0. The data encapsulated has the bytes +// 0xc0 and 0xdb replaced by the two-byte sequences {0xdb, 0xdc} and {0xdb, 0xdd} respectively. + +void writePacket(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { + + WriteByteRaw(0xc0); // send the packet start character + _writePacket(hdr, hdrLen); // send the header + _writePacket(data, dataLen); // send the data block + WriteByteRaw(0xc0); // send the packet end character +} + +// Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. +// This is like writePacket except that it does a fast block write for both the header and the main data with no SLIP encoding. Used to send sync commands. +void writePacketRaw(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { + WriteByteRaw(0xc0); // send the packet start character + _writePacketRaw(hdr, hdrLen); // send the header + _writePacketRaw(data, dataLen); // send the data block in raw mode + WriteByteRaw(0xc0); // send the packet end character +} + +// Send a command to the attached device together with the supplied data, if any. +// The data is supplied via a list of one or more segments. +void sendCommand(uint8_t op, uint32_t checkVal, const uint8_t *data, size_t dataLen) { + // populate the header + uint8_t hdr[8]; + putData(0, 1, hdr, 0); + putData(op, 1, hdr, 1); + putData(dataLen, 2, hdr, 2); + putData(checkVal, 4, hdr, 4); + + // send the packet + //flushInput(); + if (op == ESP_SYNC) { + writePacketRaw(hdr, sizeof(hdr), data, dataLen); + } + else { + writePacket(hdr, sizeof(hdr), data, dataLen); + } +} + +// Send a command to the attached device together with the supplied data, if any, and get the response +EspUploadResult doCommand(uint8_t op, const uint8_t *data, size_t dataLen, uint32_t checkVal, uint32_t *valp, uint32_t msTimeout) { + size_t bodyLen; + EspUploadResult stat; + + sendCommand(op, checkVal, data, dataLen); + + stat = readPacket(op, valp, &bodyLen, msTimeout); + if (stat == success && bodyLen != 2) { + stat = badReply; + } + + return stat; +} + +// Send a synchronising packet to the serial port in an attempt to induce +// the ESP8266 to auto-baud lock on the baud rate. +EspUploadResult Sync(uint16_t timeout) { + uint8_t buf[36]; + EspUploadResult stat; + int i ; + + // compose the data for the sync attempt + memset(buf, 0x55, sizeof(buf)); + buf[0] = 0x07; + buf[1] = 0x07; + buf[2] = 0x12; + buf[3] = 0x20; + + stat = doCommand(ESP_SYNC, buf, sizeof(buf), 0, 0, timeout); + + // If we got a response other than sync, discard it and wait for a sync response. This happens at higher baud rates. + for (i = 0; i < 10 && stat == respHeader; ++i) { + size_t bodyLen; + stat = readPacket(ESP_SYNC, 0, &bodyLen, timeout); + } + + if (stat == success) { + // Read and discard additional replies + for (;;) { + size_t bodyLen; + EspUploadResult rc = readPacket(ESP_SYNC, 0, &bodyLen, defaultTimeout); + if (rc != success || bodyLen != 2) { + break; + } + } + } + //DEBUG + //else debug//printf("stat=%d\n", (int)stat); + return stat; +} + +// Send a command to the device to begin the Flash process. +EspUploadResult flashBegin(uint32_t addr, uint32_t size) { + // determine the number of blocks represented by the size + uint32_t blkCnt; + uint8_t buf[16]; + uint32_t timeout; + + blkCnt = (size + EspFlashBlockSize - 1) / EspFlashBlockSize; + + // ensure that the address is on a block boundary + addr &= ~(EspFlashBlockSize - 1); + + // begin the Flash process + putData(size, 4, buf, 0); + putData(blkCnt, 4, buf, 4); + putData(EspFlashBlockSize, 4, buf, 8); + putData(addr, 4, buf, 12); + + timeout = (size != 0) ? eraseTimeout : defaultTimeout; + return doCommand(ESP_FLASH_BEGIN, buf, sizeof(buf), 0, 0, timeout); +} + +// Send a command to the device to terminate the Flash process +EspUploadResult flashFinish(signed char reboot) { + uint8_t buf[4]; + putData(reboot ? 0 : 1, 4, buf, 0); + return doCommand(ESP_FLASH_END, buf, sizeof(buf), 0, 0, defaultTimeout); +} + +// Compute the checksum of a block of data +uint16_t checksum(const uint8_t *data, uint16_t dataLen, uint16_t cksum) { + if (data != NULL) { + while (dataLen--) { + cksum ^= (uint16_t)*data++; + } + } + return(cksum); +} + +EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { + #if 0 + const uint32_t blkSize = EspFlashBlockSize; + int i; + + // Allocate a data buffer for the combined header and block data + const uint16_t hdrOfst = 0; + const uint16_t dataOfst = 16; + const uint16_t blkBufSize = dataOfst + blkSize; + uint32_t blkBuf32[blkBufSize/4]; + uint8_t * const blkBuf = (uint8_t*)(blkBuf32); + uint32_t cnt; + uint16_t cksum; + EspUploadResult stat; + + // Prepare the header for the block + putData(blkSize, 4, blkBuf, hdrOfst + 0); + putData(esp_upload.uploadBlockNumber, 4, blkBuf, hdrOfst + 4); + putData(0, 4, blkBuf, hdrOfst + 8); + putData(0, 4, blkBuf, hdrOfst + 12); + + // Get the data for the block + f_read(&esp_upload.uploadFile, blkBuf + dataOfst, blkSize, &cnt );//->Read(reinterpret_cast(blkBuf + dataOfst), blkSize); + if (cnt != blkSize) { + if (f_tell(&esp_upload.uploadFile) == esp_upload.fileSize) { + // partial last block, fill the remainder + memset(blkBuf + dataOfst + cnt, 0xff, blkSize - cnt); + } + else { + return fileRead; + } + } + + // Patch the flash parameters into the first block if it is loaded at address 0 + if (esp_upload.uploadBlockNumber == 0 && esp_upload.uploadAddress == 0 && blkBuf[dataOfst] == ESP_IMAGE_MAGIC && flashParmMask != 0) { + // update the Flash parameters + uint32_t flashParm = getData(2, blkBuf + dataOfst + 2, 0) & ~(uint32_t)flashParmMask; + putData(flashParm | flashParmVal, 2, blkBuf + dataOfst + 2, 0); + } + + // Calculate the block checksum + cksum = checksum(blkBuf + dataOfst, blkSize, ESP_CHECKSUM_MAGIC); + + for (i = 0; i < 3; i++) { + if ((stat = doCommand(ESP_FLASH_DATA, blkBuf, blkBufSize, cksum, 0, blockWriteTimeout)) == success) { + break; + } + } + + //printf("Upload %d\%\n", ftell(&esp_upload.uploadFile) * 100 / esp_upload.fileSize); + + return stat; + #endif +} + +void upload_spin() { + #if 0 + switch (esp_upload.state) { + case resetting: + + if (esp_upload.connectAttemptNumber == 9) { + // Time to give up + //Network::ResetWiFi(); + esp_upload.uploadResult = connected; + esp_upload.state = done; + } + else{ + + // Reset the serial port at the new baud rate. Also reset the ESP8266. + // const uint32_t baud = uploadBaudRates[esp_upload.connectAttemptNumber/esp_upload.retriesPerBaudRate]; + if (esp_upload.connectAttemptNumber % esp_upload.retriesPerBaudRate == 0) { + } + // uploadPort.begin(baud); + // uploadPort_close(); + + + uploadPort_begin(); + + wifi_delay(2000); + + flushInput(); + + esp_upload.lastAttemptTime = esp_upload.lastResetTime = getWifiTick(); + esp_upload.state = connecting; + } + + break; + + case connecting: + if ((getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= connectAttemptInterval) && (getWifiTickDiff(esp_upload.lastResetTime, getWifiTick()) >= 500)) { + // Attempt to establish a connection to the ESP8266. + EspUploadResult res = Sync(5000); + esp_upload.lastAttemptTime = getWifiTick(); + if (res == success) { + // Successful connection +// //MessageF(" success on attempt %d\n", (connectAttemptNumber % retriesPerBaudRate) + 1); + //printf("connect success\n"); + esp_upload.state = erasing; + } + else { + // This attempt failed + esp_upload.connectAttemptNumber++; + if (esp_upload.connectAttemptNumber % retriesPerReset == 0) { + esp_upload.state = resetting; // try a reset and a lower baud rate + } + } + } + break; + + case erasing: + if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= blockWriteInterval) { + uint32_t eraseSize; + const uint32_t sectorsPerBlock = 16; + const uint32_t sectorSize = 4096; + const uint32_t numSectors = (esp_upload.fileSize + sectorSize - 1)/sectorSize; + const uint32_t startSector = esp_upload.uploadAddress/sectorSize; + uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); + + if (numSectors < headSectors) { + headSectors = numSectors; + } + eraseSize = (numSectors < 2 * headSectors) + ? (numSectors + 1) / 2 * sectorSize + : (numSectors - headSectors) * sectorSize; + + //MessageF("Erasing %u bytes...\n", fileSize); + esp_upload.uploadResult = flashBegin(esp_upload.uploadAddress, eraseSize); + if (esp_upload.uploadResult == success) { + //MessageF("Uploading file...\n"); + esp_upload.uploadBlockNumber = 0; + esp_upload.uploadNextPercentToReport = percentToReportIncrement; + esp_upload.lastAttemptTime = getWifiTick(); + esp_upload.state = uploading; + } + else { + //MessageF("Erase failed\n"); + esp_upload.state = done; + } + } + break; + + case uploading: + // The ESP needs several milliseconds to recover from one packet before it will accept another + if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= 15) { + unsigned int percentComplete; + const uint32_t blkCnt = (esp_upload.fileSize + EspFlashBlockSize - 1) / EspFlashBlockSize; + if (esp_upload.uploadBlockNumber < blkCnt) { + esp_upload.uploadResult = flashWriteBlock(0, 0); + esp_upload.lastAttemptTime = getWifiTick(); + if (esp_upload.uploadResult != success) { + //MessageF("Flash block upload failed\n"); + esp_upload.state = done; + } + percentComplete = (100 * esp_upload.uploadBlockNumber)/blkCnt; + ++esp_upload.uploadBlockNumber; + if (percentComplete >= esp_upload.uploadNextPercentToReport) { + //MessageF("%u%% complete\n", percentComplete); + esp_upload.uploadNextPercentToReport += percentToReportIncrement; + } + } + else { + esp_upload.state = done; + } + } + break; + + case done: + f_close(&esp_upload.uploadFile); + //uploadPort.end(); + //uploadPort_close(); + + //WIFI_COM.begin(115200, true); + //wifi_init(); + + if (esp_upload.uploadResult == success) { + //printf("upload successfully\n"); + } + else { + //printf("upload failed\n"); + } + esp_upload.state = upload_idle;//idle; + break; + + default: + break; + } + #endif +} + +// Try to upload the given file at the given address +void SendUpdateFile(const char *file, uint32_t address) { + #if 0 + FRESULT res = f_open(&esp_upload.uploadFile, file, FA_OPEN_EXISTING | FA_READ); + + if (res != FR_OK) return; + + esp_upload.fileSize = f_size(&esp_upload.uploadFile); + if (esp_upload.fileSize == 0) { + f_close(&esp_upload.uploadFile); + return; + } + f_lseek(&esp_upload.uploadFile, 0); + + esp_upload.uploadAddress = address; + esp_upload.connectAttemptNumber = 0; + esp_upload.state = resetting; + #endif +} + +static const uint32_t FirmwareAddress = 0x00000000, WebFilesAddress = 0x00100000; + +void ResetWiFiForUpload(int begin_or_end) { + #if 0 + uint32_t start, now; + + GPIO_InitTypeDef GPIO_InitStructure; + + #if V1_0_V1_1 + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Pin = GPIO_Pin_8; + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + #else + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStructure.Pin = GPIO_Pin_13; + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; + HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); + #endif + start = getWifiTick(); + now = start; + + if (begin_or_end == 0) { + #if V1_0_V1_1 + HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_RESET); //update mode + #else + HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_RESET); //update mode + #endif + } + else { + #if V1_0_V1_1 + #if V1_0_V1_1 + HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_SET); //boot mode + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Pin = GPIO_Pin_8; + GPIO_InitStructure.Mode = GPIO_MODE_INPUT; + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + #endif + #else + HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_SET); //boot mode + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStructure.Pin = GPIO_Pin_13; + GPIO_InitStructure.Mode = GPIO_MODE_INPUT; + HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); + #endif + } + WIFI_RESET(); + while (getWifiTickDiff(start, now) < 500) now = getWifiTick(); + WIFI_SET(); + #endif +} + +int32_t wifi_upload(int type) { + esp_upload.retriesPerBaudRate = 9; + + ResetWiFiForUpload(0); + + if (type == 0) + SendUpdateFile(ESP_FIRMWARE_FILE, FirmwareAddress); + else if (type == 1) + SendUpdateFile(ESP_WEB_FIRMWARE_FILE, FirmwareAddress); + else if (type == 2) + SendUpdateFile(ESP_WEB_FILE, WebFilesAddress); + else + return -1; + + while (esp_upload.state != upload_idle) { + upload_spin(); + //IWDG_ReloadCounter(); + } + + ResetWiFiForUpload(1); + + return esp_upload.uploadResult == success ? 0 : -1; +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h new file mode 100644 index 0000000000..d942a2c84f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h @@ -0,0 +1,74 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +#define ESP_FIRMWARE_FILE "1:/MksWifi.bin" +#define ESP_WEB_FIRMWARE_FILE "1:/MksWifi_Web.bin" +#define ESP_WEB_FILE "1:/MksWifi_WebView.bin" + +typedef enum { + upload_idle, + resetting, + connecting, + erasing, + uploading, + done +} UploadState; + +typedef enum { + success = 0, + timeout, + connected, + badReply, + fileRead, + emptyFile, + respHeader, + slipFrame, + slipState, + slipData, +} EspUploadResult; + +typedef struct { + //FIL uploadFile; + uint32_t fileSize; + + uint32_t uploadAddress; + UploadState state; + uint32_t retriesPerBaudRate; + uint32_t connectAttemptNumber; + uint32_t lastAttemptTime; + uint32_t lastResetTime; + uint32_t uploadBlockNumber; + uint32_t uploadNextPercentToReport; + EspUploadResult uploadResult; +} UPLOAD_STRUCT; + +extern UPLOAD_STRUCT esp_upload; +int32_t wifi_upload(int type); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index f83142444a..da38192d8e 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -253,6 +253,13 @@ class Stepper { static bool initialized; #endif + // Last-moved extruder, as set when the last movement was fetched from planner + #if HAS_MULTI_EXTRUDER + static uint8_t last_moved_extruder; + #else + static constexpr uint8_t last_moved_extruder = 0; + #endif + private: static block_t* current_block; // A pointer to the block currently being traced @@ -262,13 +269,6 @@ class Stepper { static bool abort_current_block; // Signals to the stepper that current block should be aborted - // Last-moved extruder, as set when the last movement was fetched from planner - #if HAS_MULTI_EXTRUDER - static uint8_t last_moved_extruder; - #else - static constexpr uint8_t last_moved_extruder = 0; - #endif - #if ENABLED(X_DUAL_ENDSTOPS) static bool locked_X_motor, locked_X2_motor; #endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index d07d363399..3908a243ce 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -526,6 +526,8 @@ #include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3 #elif MB(MKS_ROBIN_E3D) #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3 +#elif MB(MKS_ROBIN_E3P) + #include "stm32f1/pins_MKS_ROBIN_E3P.h" // STM32F1 env:mks_robin_e3p #elif MB(BTT_SKR_MINI_V1_1) #include "stm32f1/pins_BTT_SKR_MINI_V1_1.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB #elif MB(BTT_SKR_MINI_E3_V1_0) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h new file mode 100644 index 0000000000..3f4dee0f68 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -0,0 +1,377 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * MKS Robin nano (STM32F130VET6) board pin assignments + */ + +#ifndef __STM32F1__ + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "MKS Robin e3p supports up to 1 hotends / E-steppers. Comment out this line to continue." +#elif HAS_FSMC_TFT + #error "MKS Robin e3p doesn't support FSMC-based TFT displays." +#endif + +#define BOARD_INFO_NAME "MKS Robin e3p" + +// +// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role +// + +#define DISABLE_DEBUG + +// +// EEPROM +// +//#define FLASH_EEPROM_EMULATION +//#define SDCARD_EEPROM_EMULATION + +#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) + #define I2C_EEPROM // EEPROM on I2C-0 + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// +// Note: MKS Robin board is using SPI2 interface. +// +//#define SPI_MODULE 2 +#define ENABLE_SPI2 + +// +// Limit Switches +// +#define X_DIAG_PIN PA15 +#define Y_DIAG_PIN PA12 +#define Z_DIAG_PIN PA11 +#define E0_DIAG_PIN PC4 + +#define X_STOP_PIN PA15 +#define Y_STOP_PIN PA12 +#define Z_MIN_PIN PA11 +#define Z_MAX_PIN PC4 + +// +// Steppers +// +#define X_ENABLE_PIN PE4 +#define X_STEP_PIN PE3 +#define X_DIR_PIN PE2 +#ifndef X_CS_PIN + #define X_CS_PIN PD5 +#endif + +#define Y_ENABLE_PIN PE1 +#define Y_STEP_PIN PE0 +#define Y_DIR_PIN PB9 +#ifndef Y_CS_PIN + #define Y_CS_PIN PD7 +#endif + +#define Z_ENABLE_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB4 +#ifndef Z_CS_PIN + #define Z_CS_PIN PD4 +#endif + +#define E0_ENABLE_PIN PB3 +#define E0_STEP_PIN PD6 +#define E0_DIR_PIN PD3 +#ifndef E0_CS_PIN + #define E0_CS_PIN PD9 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PD14 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PD1 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PD0 + #endif +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + + #define X_SERIAL_TX_PIN PD5 + #define X_SERIAL_RX_PIN PD5 + + #define Y_SERIAL_TX_PIN PD7 + #define Y_SERIAL_RX_PIN PD7 + + #define Z_SERIAL_TX_PIN PD4 + #define Z_SERIAL_RX_PIN PD4 + + #define E0_SERIAL_TX_PIN PD9 + #define E0_SERIAL_RX_PIN PD9 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif // TMC2208 || TMC2209 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // TH1 +#define TEMP_BED_PIN PC0 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC3 // HEATER1 +#define HEATER_BED_PIN PA0 // HOT BED + +#define FAN_PIN PB1 // FAN + +// +// Misc. Functions +// +#if HAS_TFT_LVGL_UI + //#define MKSPWC + #ifdef MKSPWC + #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN + #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE + #define KILL_PIN PA2 // Enable MKSPWC DET PIN + #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE + #endif + + #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN + #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE + + #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN + #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN + #define WIFI_RESET_PIN PE9 // MKS ESP WIFI RESET PIN + + #if ENABLED(MKS_TEST) + #define MKS_TEST_POWER_LOSS_PIN PA2 // PW_DET + #define MKS_TEST_PS_ON_PIN PB0 // PW_OFF + #endif +#else + //#define POWER_LOSS_PIN PA2 // PW_DET + //#define PS_ON_PIN PB2 // PW_OFF + #define FIL_RUNOUT_PIN PA4 +#endif + +#define SERVO0_PIN PA8 // Enable BLTOUCH + +//#define LED_PIN PB2 + +// +// SD Card +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define SDIO_SUPPORT +#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SD_DETECT_PIN PD12 +#define ONBOARD_SD_CS_PIN PC11 + +// +// LCD / Controller +// +#ifndef BEEPER_PIN + #define BEEPER_PIN PC5 +#endif + +/** + * Note: MKS Robin TFT screens use various TFT controllers. + * If the screen stays white, disable 'LCD_RESET_PIN' + * to let the bootloader init the screen. + */ + +#if HAS_SPI_TFT + + // Shared SPI TFT + + #define LCD_BACKLIGHT_PIN PD13 + + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define BTN_ENC PE13 + + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + #ifndef TFT_WIDTH + #define TFT_WIDTH 480 + #endif + #ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 + #endif + + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + +#endif + +#if ENABLED(TFT_LVGL_UI_SPI) + + // LVGL + + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 + +#elif ENABLED(SPI_GRAPHICAL_TFT) + + // Emulated DOGM SPI + + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11386 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8684 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 339 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -18 + #endif + + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 + #endif + #ifndef TFT_PIXEL_OFFSET_Y + #define TFT_PIXEL_OFFSET_Y 32 + #endif + + #define BTN_ENC PE13 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 + +#elif ENABLED(TFT_480x320_SPI) + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 + + #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 + +#endif + +#if HAS_SPI_LCD && !HAS_SPI_TFT + + // NON TFT Displays + + #if ENABLED(MKS_MINI_12864) + + // MKS MINI12864 and MKS LCD12864B + // If using MKS LCD12864A (Need to remove RPK2 resistor) + + #define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN -1 + #define DOGLCD_A0 PD11 + #define DOGLCD_CS PE15 + #define DOGLCD_SCK PA5 + #define DOGLCD_MOSI PA7 + + // Required for MKS_MINI_12864 with this board + #define MKS_LCD12864B + #undef SHOW_BOOTSCREEN + + #else // !MKS_MINI_12864 + + #define LCD_PINS_D4 PE14 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PE15 + #define LCD_PINS_D6 PD11 + #define LCD_PINS_D7 PD10 + #endif + + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif + + #endif // !MKS_MINI_12864 + +#endif // HAS_SPI_LCD && !HAS_SPI_TFT + +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB +#if HAS_SPI_FLASH + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif + +#if ENABLED(SPEAKER) && BEEPER_PIN == PC5 + #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER." +#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index c3e8be74e8..88333e9b9f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -58,10 +58,6 @@ #define Z_MIN_PIN PA11 #define Z_MAX_PIN PC4 -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PA4 // MT_DET -#endif - // // Steppers // @@ -123,25 +119,33 @@ // // Misc. Functions // -#define POWER_LOSS_PIN PA2 // PW_DET -#define PS_ON_PIN PA3 // PW_OFF +#if HAS_TFT_LVGL_UI + //#define MKSPWC + #ifdef MKSPWC + #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN + #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE + #define KILL_PIN PA2 // Enable MKSPWC DET PIN + #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE + #endif -//#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define SUICIDE_PIN_INVERTING false + #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN + #define MT_DET_2_PIN PE6 // LVGL UI FILAMENT RUNOUT2 PIN + #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE -//#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY + #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN + #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN + #define WIFI_RESET_PIN PA5 // MKS ESP WIFI RESET PIN +#else + //#define POWER_LOSS_PIN PA2 // PW_DET + //#define PS_ON_PIN PB2 // PW_OFF + #define FIL_RUNOUT_PIN PA4 + #define FIL_RUNOUT2_PIN PE6 +#endif -#define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY +#define SERVO0_PIN PA8 // Enable BLTOUCH support //#define LED_PIN PB2 -#define MT_DET_1_PIN PA4 -#define MT_DET_2_PIN PE6 -#define MT_DET_PIN_INVERTING false - -#define WIFI_IO0_PIN PC13 - // // SD Card // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index f9652f3934..01415d7bf0 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -192,32 +192,38 @@ // // Misc. Functions // -#define POWER_LOSS_PIN PA2 // PW_DET -#define PS_ON_PIN PA3 // PW_OFF +#if HAS_TFT_LVGL_UI + //#define MKSPWC + #ifdef MKSPWC + #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN + #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE + #define KILL_PIN PA2 // Enable MKSPWC DET PIN + #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE + #endif -//#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define SUICIDE_PIN_INVERTING false + #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN + #define MT_DET_2_PIN PE6 // LVGL UI FILAMENT RUNOUT2 PIN + #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE + + #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN + #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN + #define WIFI_RESET_PIN PE9 // MKS ESP WIFI RESET PIN -//#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY + #if ENABLED(MKS_TEST) + #define MKS_TEST_POWER_LOSS_PIN PA2 // PW_DET + #define MKS_TEST_PS_ON_PIN PB2 // PW_OFF + #endif +#else + //#define POWER_LOSS_PIN PA2 // PW_DET + //#define PS_ON_PIN PB2 // PW_OFF + #define FIL_RUNOUT_PIN PA4 + #define FIL_RUNOUT2_PIN PE6 +#endif -#define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY +#define SERVO0_PIN PA8 // Enable BLTOUCH //#define LED_PIN PB2 -#define MT_DET_1_PIN PA4 -#define MT_DET_2_PIN PE6 -#define MT_DET_PIN_INVERTING false - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN MT_DET_1_PIN -#endif -#ifndef FIL_RUNOUT2_PIN - #define FIL_RUNOUT2_PIN MT_DET_2_PIN -#endif - -#define WIFI_IO0_PIN PC13 - // // SD Card // diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld new file mode 100644 index 0000000000..d8a138ca2e --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 + rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py new file mode 100644 index 0000000000..2aab14bab7 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py @@ -0,0 +1,40 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08007000 +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld") +for i, flag in enumerate(env["LINKFLAGS"]): + if "-Wl,-T" in flag: + env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script + elif flag == "-T": + env["LINKFLAGS"][i + 1] = custom_ld_script + + +# Encrypt ${PROGNAME}.bin and save it as 'mks_robin_e3p.bin' +def encrypt(source, target, env): + import sys + + key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] + + firmware = open(target[0].path, "rb") + robin = open(target[0].dir.path +'/Robin_e3p.bin', "wb") + length = os.path.getsize(target[0].path) + position = 0 + try: + while position < length: + byte = firmware.read(1) + if position >= 320 and position < 31040: + byte = chr(ord(byte) ^ key[position & 31]) + if sys.version_info[0] > 2: + byte = bytes(byte, 'latin1') + robin.write(byte) + position += 1 + finally: + firmware.close() + robin.close() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/platformio.ini b/platformio.ini index bf43936df6..c1b6f2c24d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -191,7 +191,7 @@ lib_deps = # Feature Dependencies # [features] -HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip +HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip src_filter=+ extra_scripts=download_mks_assets.py HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 @@ -955,6 +955,22 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 +# +# MKS Robin E3p (STM32F103VET6) +# - LVGL UI +# +[env:mks_robin_e3p] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSS_TIMER=4 +debug_tool = jlink +upload_protocol = jlink + # # MKS Robin Lite/Lite2 (STM32F103RCT6) # From d2a36b38ca4a8c15edcbe85439cdb67b44631889 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Mon, 21 Sep 2020 05:29:34 +0200 Subject: [PATCH 0266/1370] Optional menu item for Assisted Tramming (#19447) --- Marlin/Configuration_adv.h | 5 +++-- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 23d39b4d0a..65cbd21a94 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -773,7 +773,6 @@ // //#define ASSISTED_TRAMMING #if ENABLED(ASSISTED_TRAMMING) - // Define positions for probing points, use the hotend as reference not the sensor. #define TRAMMING_POINT_XY { { 20, 20 }, { 200, 20 }, { 200, 200 }, { 20, 200 } } @@ -786,6 +785,9 @@ // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G35 + // Add a menu item for Assisted Tramming + //#define ASSISTED_TRAMMING_MENU_ITEM + /** * Screw thread: * M3: 30 = Clockwise, 31 = Counter-Clockwise @@ -793,7 +795,6 @@ * M5: 50 = Clockwise, 51 = Counter-Clockwise */ #define TRAMMING_SCREW_THREAD 30 - #endif // @section motion diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 77ab643cd6..9fea0597db 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -348,7 +348,7 @@ void menu_motion() { // // Assisted Bed Tramming // - #if ENABLED(ASSISTED_TRAMMING) + #if ENABLED(ASSISTED_TRAMMING_MENU_ITEM) GCODES_ITEM(MSG_ASSISTED_TRAMMING, PSTR("G35")); #endif From b52a2176fe3241ddfd88b67e8023e7f5141fd1a1 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 20 Sep 2020 20:30:20 -0700 Subject: [PATCH 0267/1370] Replace Serial with Serial1 in pins files (#19459) --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index fb1218068e..a38be0bef7 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -151,7 +151,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 49c4dffa04..ce1372ed7a 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -174,7 +174,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 23558b2e04..59d6a06cf4 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -153,7 +153,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index d112cc5d50..2d09fe1fea 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -163,7 +163,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 01415d7bf0..d911ab2b51 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -132,7 +132,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index c00466677a..9b3817df8c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -125,7 +125,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 55d1a37aa7..8cc1ca5e98 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -171,7 +171,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 9e6a43c36b..b45914284a 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -178,7 +178,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h index fe6e559bdb..ab277d4372 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h @@ -57,7 +57,7 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial + //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 From 9dd49b6c6aff0d022cfcfdaacb3be6693b37f602 Mon Sep 17 00:00:00 2001 From: Chris Pepper Date: Mon, 21 Sep 2020 16:19:09 +0100 Subject: [PATCH 0268/1370] Update pins_ANET_10.h --- Marlin/src/pins/sanguino/pins_ANET_10.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index 6830192f31..d1ac131c03 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -163,7 +163,7 @@ #define LCD_PINS_D6 16 #define LCD_PINS_D7 17 #define ADC_KEYPAD_PIN 1 - #elif EITHER(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 From 5ccb2c62a9c221ab4af0565d49a453969fc6b7c3 Mon Sep 17 00:00:00 2001 From: riodoro1 Date: Tue, 22 Sep 2020 22:08:14 +0200 Subject: [PATCH 0269/1370] Fix up K8800 pins (#19476) --- Marlin/src/pins/ramps/pins_K8800.h | 61 ++++++++++++++++++------------ 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h index 2783f69896..64e3c25660 100644 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -39,8 +39,13 @@ // #define X_STOP_PIN 3 #define Y_STOP_PIN 14 -#define Z_MIN_PIN 68 // Used for bed leveling -#define Z_MAX_PIN 66 +#define Z_STOP_PIN 66 + +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 68 +#endif + +#define FIL_RUNOUT_PIN 69 // PK7 // // Steppers @@ -61,10 +66,6 @@ #define E0_DIR_PIN 28 #define E0_ENABLE_PIN 24 -#define E1_STEP_PIN 32 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 - // // Temperature Sensors // @@ -80,30 +81,42 @@ // // Misc. Functions // -#define SDSS 25 - -#define FIL_RUNOUT_PIN 69 // PK7 #define KILL_PIN 20 // PD1 +#define CASE_LIGHT_PIN 7 + +// +// SD Card +// +#define SDSS 25 +#define SD_DETECT_PIN 21 // PD0 // // LCD / Controller // -#define SD_DETECT_PIN 21 // PD0 -#define LCD_SDSS 53 #define BEEPER_PIN 6 -#define DOGLCD_CS 29 -#define DOGLCD_A0 27 +#if HAS_SPI_LCD -#define LCD_PINS_RS 27 -#define LCD_PINS_ENABLE 29 -#define LCD_PINS_D4 37 -#define LCD_PINS_D5 35 -#define LCD_PINS_D6 33 -#define LCD_PINS_D7 31 + #define LCD_SDSS 53 -#if ENABLED(NEWPANEL) - #define BTN_EN1 17 - #define BTN_EN2 16 - #define BTN_ENC 23 -#endif + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 37 + #define LCD_PINS_D5 35 + #define LCD_PINS_D6 33 + #define LCD_PINS_D7 31 + + #define LCD_CONTRAST_MIN 0 + #define LCD_CONTRAST_MAX 100 + #define DEFAULT_LCD_CONTRAST 30 + + #if ENABLED(NEWPANEL) + #define BTN_EN1 17 + #define BTN_EN2 16 + #define BTN_ENC 23 + #endif + +#endif // HAS_SPI_LCD From a08217a33cffbb25574c3f455a598421ccff57ee Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 22 Sep 2020 17:44:17 -0300 Subject: [PATCH 0270/1370] Define ::softSPI (#19419) --- Marlin/src/module/temperature.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index d2145bcc80..f589140895 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1567,6 +1567,7 @@ void Temperature::updateTemperaturesFromRawValues() { } #if MAX6675_SEPARATE_SPI + template SoftSPI SPIclass::softSPI; SPIclass max6675_spi; #endif From 05680a4662d7a62264d2003ac23f6b8a6a9df91d Mon Sep 17 00:00:00 2001 From: makerbase <4164049@qq.com> Date: Wed, 23 Sep 2020 04:57:17 +0800 Subject: [PATCH 0271/1370] MKS SGEN L V2 adaptable heaters/fans (#19462) --- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 2d09fe1fea..b6f11a133d 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -207,20 +207,20 @@ // #define HEATER_BED_PIN P2_05 #define HEATER_0_PIN P2_07 -#if HOTENDS == 1 - #ifndef FAN1_PIN - #define FAN1_PIN P2_06 - #endif -#else +#if HAS_MULTI_HOTEND #ifndef HEATER_1_PIN #define HEATER_1_PIN P2_06 #endif +#else + #ifndef FAN2_PIN + #define FAN2_PIN P2_06 // HE1 for FAN3 + #endif #endif #ifndef FAN_PIN - #define FAN_PIN P2_04 + #define FAN_PIN P2_04 // FAN1 #endif -#ifndef FAN2_PIN - #define FAN2_PIN P1_04 +#ifndef FAN1_PIN + #define FAN1_PIN P1_04 // FAN2 #endif // From d1eeb692c108b387342ab653ce29eb4a3cf56487 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 22 Sep 2020 15:36:59 -0700 Subject: [PATCH 0272/1370] Update board/teensy comment (#19456) --- .github/workflows/test-builds.yml | 1 + Marlin/src/core/boards.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 35cd920adf..b228783799 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -41,6 +41,7 @@ jobs: - mega2560 - teensy31 - teensy35 + - teensy41 - SAMD51_grandcentral_m4 # Extended AVR Environments diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 293c6a5230..e27448b022 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -359,8 +359,8 @@ #define BOARD_THE_BORG 5000 // THE-BORG (Power outputs: Hotend0, Hotend1, Bed, Fan) #define BOARD_REMRAM_V1 5001 // RemRam v1 -#define BOARD_TEENSY41 5002 // Teensy4.0 and Teensy4.1 -#define BOARD_T41U5XBB 5003 // T41U5XBB Teensy4.1 breakout board +#define BOARD_TEENSY41 5002 // Teensy 4.1 +#define BOARD_T41U5XBB 5003 // T41U5XBB Teensy 4.1 breakout board // // Espressif ESP32 WiFi From 0b18034055c5e14263e2e1a622da9ad102bf25f1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 22 Sep 2020 17:51:59 -0500 Subject: [PATCH 0273/1370] Fix Teensy 4.1 include --- Marlin/src/pins/pins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 3908a243ce..861810d95b 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -623,7 +623,7 @@ #include "stm32f7/pins_THE_BORG.h" // STM32F7 env:STM32F7 #elif MB(REMRAM_V1) #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:STM32F7 -#elif MB(TEENSY40_41) +#elif MB(TEENSY41) #include "teensy4/pins_TEENSY41.h" // Teensy-4.x env:teensy41 #elif MB(T41U5XBB) #include "teensy4/pins_T41U5XBB.h" // Teensy-4.x env:teensy41 From bc081473f20df8748171fbe96e36524a0467292d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 22 Sep 2020 19:58:06 -0500 Subject: [PATCH 0274/1370] Fix up tests, warnings --- Marlin/src/gcode/calibrate/M48.cpp | 4 ++-- Marlin/src/lcd/extui/ui_api.cpp | 2 +- buildroot/tests/teensy41-tests | 13 +++++++------ platformio.ini | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index aaf58eed1c..88273b46e4 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -192,8 +192,8 @@ void GcodeSuite::M48() { // Choose the next position as an offset to chosen test position const xy_pos_t noz_pos = test_position - probe.offset_xy; xy_pos_t next_pos = { - noz_pos.x + cos(RADIANS(angle)) * radius, - noz_pos.y + sin(RADIANS(angle)) * radius + noz_pos.x + float(cos(RADIANS(angle))) * radius, + noz_pos.y + float(sin(RADIANS(angle))) * radius }; #if ENABLED(DELTA) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index afc9c6692e..1270e3d649 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -705,7 +705,7 @@ namespace ExtUI { #if ENABLED(BABYSTEP_ZPROBE_OFFSET) // Make it so babystepping in Z adjusts the Z probe offset. - if (axis == Z && TERN1(HAS_MULTI_EXTRUDER, linked_nozzles || active_extruder == 0)) + if (axis == Z && TERN1(HAS_MULTI_EXTRUDER, (linked_nozzles || active_extruder == 0))) probe.offset.z += mm; #endif diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests index 04baf029d9..8d32d131e9 100644 --- a/buildroot/tests/teensy41-tests +++ b/buildroot/tests/teensy41-tests @@ -19,14 +19,15 @@ opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_0 1 opt_set TEMP_SENSOR_1 5 opt_set TEMP_SENSOR_BED 1 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ - FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ +opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ + FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ - PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \ + PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ ADVANCED_PAUSE_FEATURE ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES PARK_HEAD_ON_PAUSE \ PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT +opt_add EXTUI_EXAMPLE opt_set I2C_SLAVE_ADDRESS 63 opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Teensy4.1 with many features" @@ -62,7 +63,7 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 1 -opt_enable MAGNETIC_PARKING_EXTRUDER ULTIMAKERCONTROLLER +opt_enable MAGNETIC_PARKING_EXTRUDER exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" # @@ -70,7 +71,7 @@ exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" # restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL opt_set MIXING_STEPPERS 2 exec_test $1 $2 "Mixing Extruder" diff --git a/platformio.ini b/platformio.ini index c1b6f2c24d..c68daf2c71 100644 --- a/platformio.ini +++ b/platformio.ini @@ -207,7 +207,7 @@ HAS_L64XX = Arduino-L6470@0.8.0 NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 -HAS_GRAPHICAL_LCD = U8glib-HAL@0.4.1 +HAS_GRAPHICAL_LCD = U8glib-HAL@~0.4.1 src_filter=+ USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 From f34ea44d73b7466b5b2c00d9d5eabb693a0271e2 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 22 Sep 2020 18:36:31 -0700 Subject: [PATCH 0275/1370] Catch a TMC address conflict early (#19458) --- Marlin/src/module/stepper/trinamic.cpp | 105 +++++++++++++++++++++++++ buildroot/bin/opt_set | 4 +- buildroot/tests/STM32F103RC_btt-tests | 7 +- buildroot/tests/esp32-tests | 4 + 4 files changed, 117 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index 3dda98698b..a4b1b240f7 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -209,113 +209,145 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if AXIS_HAS_UART(X) #ifdef X_HARDWARE_SERIAL TMC_UART_DEFINE(HW, X, X); + #define X_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE(SW, X, X); + #define X_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(X2) #ifdef X2_HARDWARE_SERIAL TMC_UART_DEFINE(HW, X2, X); + #define X2_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE(SW, X2, X); + #define X2_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(Y) #ifdef Y_HARDWARE_SERIAL TMC_UART_DEFINE(HW, Y, Y); + #define Y_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE(SW, Y, Y); + #define Y_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(Y2) #ifdef Y2_HARDWARE_SERIAL TMC_UART_DEFINE(HW, Y2, Y); + #define Y2_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE(SW, Y2, Y); + #define Y2_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(Z) #ifdef Z_HARDWARE_SERIAL TMC_UART_DEFINE(HW, Z, Z); + #define Z_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE(SW, Z, Z); + #define Z_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(Z2) #ifdef Z2_HARDWARE_SERIAL TMC_UART_DEFINE(HW, Z2, Z); + #define Z2_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE(SW, Z2, Z); + #define Z2_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(Z3) #ifdef Z3_HARDWARE_SERIAL TMC_UART_DEFINE(HW, Z3, Z); + #define Z3_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE(SW, Z3, Z); + #define Z3_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(Z4) #ifdef Z4_HARDWARE_SERIAL TMC_UART_DEFINE(HW, Z4, Z); + #define Z4_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE(SW, Z4, Z); + #define Z4_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(E0) #ifdef E0_HARDWARE_SERIAL TMC_UART_DEFINE_E(HW, 0); + #define E0_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE_E(SW, 0); + #define E0_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(E1) #ifdef E1_HARDWARE_SERIAL TMC_UART_DEFINE_E(HW, 1); + #define E1_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE_E(SW, 1); + #define E1_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(E2) #ifdef E2_HARDWARE_SERIAL TMC_UART_DEFINE_E(HW, 2); + #define E2_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE_E(SW, 2); + #define E2_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(E3) #ifdef E3_HARDWARE_SERIAL TMC_UART_DEFINE_E(HW, 3); + #define E3_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE_E(SW, 3); + #define E3_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(E4) #ifdef E4_HARDWARE_SERIAL TMC_UART_DEFINE_E(HW, 4); + #define E4_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE_E(SW, 4); + #define E4_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(E5) #ifdef E5_HARDWARE_SERIAL TMC_UART_DEFINE_E(HW, 5); + #define E5_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE_E(SW, 5); + #define E5_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(E6) #ifdef E6_HARDWARE_SERIAL TMC_UART_DEFINE_E(HW, 6); + #define E6_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE_E(SW, 6); + #define E6_HAS_SW_SERIAL 1 #endif #endif #if AXIS_HAS_UART(E7) #ifdef E7_HARDWARE_SERIAL TMC_UART_DEFINE_E(HW, 7); + #define E7_HAS_HW_SERIAL 1 #else TMC_UART_DEFINE_E(SW, 7); + #define E7_HAS_SW_SERIAL 1 #endif #endif @@ -769,4 +801,77 @@ void reset_trinamic_drivers() { stepper.set_directions(); } +// TMC Slave Address Conflict Detection +// +// Conflict detection is performed in the following way. Similar methods are used for +// hardware and software serial, but the implementations are indepenent. +// +// 1. Populate a data structure with UART parameters and addresses for all possible axis. +// If an axis is not in use, populate it with recognizable placeholder data. +// 2. For each axis in use, static_assert using a constexpr function, which counts the +// number of matching/conflicting axis. If the value is not exactly 1, fail. + +#if ANY_AXIS_HAS(HW_SERIAL) + // Hardware serial names are compared as strings, since actually resolving them cannot occur in a constexpr. + // Using a fixed-length character array for the port name allows this to be constexpr compatible. + struct SanityHwSerialDetails { const char port[20]; uint32_t address; }; + #define TMC_HW_DETAIL_ARGS(A) TERN(A##_HAS_HW_SERIAL, STRINGIFY(A##_HARDWARE_SERIAL), ""), TERN0(A##_HAS_HW_SERIAL, A##_SLAVE_ADDRESS) + #define TMC_HW_DETAIL(A) {TMC_HW_DETAIL_ARGS(A)} + constexpr SanityHwSerialDetails sanity_tmc_hw_details[] = { + TMC_HW_DETAIL(X), TMC_HW_DETAIL(X2), + TMC_HW_DETAIL(Y), TMC_HW_DETAIL(Y2), + TMC_HW_DETAIL(Z), TMC_HW_DETAIL(Z2), TMC_HW_DETAIL(Z3), TMC_HW_DETAIL(Z4), + TMC_HW_DETAIL(E0), TMC_HW_DETAIL(E1), TMC_HW_DETAIL(E2), TMC_HW_DETAIL(E3), TMC_HW_DETAIL(E4), TMC_HW_DETAIL(E5), TMC_HW_DETAIL(E6), TMC_HW_DETAIL(E7) + }; + + // constexpr compatible string comparison + constexpr bool str_eq_ce(const char * a, const char * b) { + return *a == *b && (*a == '\0' || str_eq_ce(a+1,b+1)); + } + + constexpr bool sc_hw_done(size_t start, size_t end) { return start == end; } + constexpr bool sc_hw_skip(const char* port_name) { return !(*port_name); } + constexpr bool sc_hw_match(const char* port_name, uint32_t address, size_t start, size_t end) { + return !sc_hw_done(start, end) && !sc_hw_skip(port_name) && (address == sanity_tmc_hw_details[start].address && str_eq_ce(port_name, sanity_tmc_hw_details[start].port)); + } + constexpr int count_tmc_hw_serial_matches(const char* port_name, uint32_t address, size_t start, size_t end) { + return sc_hw_done(start, end) ? 0 : ((sc_hw_skip(port_name) ? 0 : (sc_hw_match(port_name, address, start, end) ? 1 : 0)) + count_tmc_hw_serial_matches(port_name, address, start + 1, end)); + } + + #define TMC_HWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_HARDWARE_SERIAL" + #define SA_NO_TMC_HW_C(A) static_assert(1 >= count_tmc_hw_serial_matches(TMC_HW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_hw_details)), TMC_HWSERIAL_CONFLICT_MSG(A)); + SA_NO_TMC_HW_C(X);SA_NO_TMC_HW_C(X2); + SA_NO_TMC_HW_C(Y);SA_NO_TMC_HW_C(Y2); + SA_NO_TMC_HW_C(Z);SA_NO_TMC_HW_C(Z2);SA_NO_TMC_HW_C(Z3);SA_NO_TMC_HW_C(Z4); + SA_NO_TMC_HW_C(E0);SA_NO_TMC_HW_C(E1);SA_NO_TMC_HW_C(E2);SA_NO_TMC_HW_C(E3);SA_NO_TMC_HW_C(E4);SA_NO_TMC_HW_C(E5);SA_NO_TMC_HW_C(E6);SA_NO_TMC_HW_C(E7); +#endif + +#if ANY_AXIS_HAS(SW_SERIAL) + struct SanitySwSerialDetails { int32_t txpin; int32_t rxpin; uint32_t address; }; + #define TMC_SW_DETAIL_ARGS(A) TERN(A##_HAS_SW_SERIAL, A##_SERIAL_TX_PIN, -1), TERN(A##_HAS_SW_SERIAL, A##_SERIAL_RX_PIN, -1), TERN0(A##_HAS_SW_SERIAL, A##_SLAVE_ADDRESS) + #define TMC_SW_DETAIL(A) TMC_SW_DETAIL_ARGS(A) + constexpr SanitySwSerialDetails sanity_tmc_sw_details[] = { + TMC_SW_DETAIL(X), TMC_SW_DETAIL(X2), + TMC_SW_DETAIL(Y), TMC_SW_DETAIL(Y2), + TMC_SW_DETAIL(Z), TMC_SW_DETAIL(Z2), TMC_SW_DETAIL(Z3), TMC_SW_DETAIL(Z4), + TMC_SW_DETAIL(E0), TMC_SW_DETAIL(E1), TMC_SW_DETAIL(E2), TMC_SW_DETAIL(E3), TMC_SW_DETAIL(E4), TMC_SW_DETAIL(E5), TMC_SW_DETAIL(E6), TMC_SW_DETAIL(E7) + }; + + constexpr bool sc_sw_done(size_t start, size_t end) { return start == end; } + constexpr bool sc_sw_skip(int32_t txpin) { return txpin < 0; } + constexpr bool sc_sw_match(int32_t txpin, int32_t rxpin, uint32_t address, size_t start, size_t end) { + return !sc_sw_done(start, end) && !sc_sw_skip(txpin) && (txpin == sanity_tmc_sw_details[start].txpin || rxpin == sanity_tmc_sw_details[start].rxpin) && (address == sanity_tmc_sw_details[start].address); + } + constexpr int count_tmc_sw_serial_matches(int32_t txpin, int32_t rxpin, uint32_t address, size_t start, size_t end) { + return sc_sw_done(start, end) ? 0 : ((sc_sw_skip(txpin) ? 0 : (sc_sw_match(txpin, rxpin, address, start, end) ? 1 : 0)) + count_tmc_sw_serial_matches(txpin, rxpin, address, start + 1, end)); + } + + #define TMC_SWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_SERIAL_RX_PIN or " STRINGIFY(A) "_SERIAL_TX_PIN" + #define SA_NO_TMC_SW_C(A) static_assert(1 >= count_tmc_sw_serial_matches(TMC_SW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_sw_details)), TMC_SWSERIAL_CONFLICT_MSG(A)); + SA_NO_TMC_SW_C(X);SA_NO_TMC_SW_C(X2); + SA_NO_TMC_SW_C(Y);SA_NO_TMC_SW_C(Y2); + SA_NO_TMC_SW_C(Z);SA_NO_TMC_SW_C(Z2);SA_NO_TMC_SW_C(Z3);SA_NO_TMC_SW_C(Z4); + SA_NO_TMC_SW_C(E0);SA_NO_TMC_SW_C(E1);SA_NO_TMC_SW_C(E2);SA_NO_TMC_SW_C(E3);SA_NO_TMC_SW_C(E4);SA_NO_TMC_SW_C(E5);SA_NO_TMC_SW_C(E6);SA_NO_TMC_SW_C(E7); +#endif + #endif // HAS_TRINAMIC_CONFIG diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set index f23a1d3d07..a646e09ae7 100755 --- a/buildroot/bin/opt_set +++ b/buildroot/bin/opt_set @@ -6,7 +6,7 @@ set -e SED=$(which gsed || which sed) # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 -eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define \b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || -eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define \b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || +eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || +eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || eval "echo '#define ${@}' >>Marlin/Configuration_adv.h" || (echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests index 8780eb535c..ad15ee7237 100644 --- a/buildroot/tests/STM32F103RC_btt-tests +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -16,7 +16,12 @@ opt_set SERIAL_PORT_2 -1 opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2209 opt_set Z_DRIVER_TYPE TMC2209 -opt_set E_DRIVER_TYPE TMC2209 +opt_set E0_DRIVER_TYPE TMC2209 +opt_set X_SLAVE_ADDRESS 0 +opt_set Y_SLAVE_ADDRESS 1 +opt_set Z_SLAVE_ADDRESS 2 +opt_set E0_SLAVE_ADDRESS 3 + exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" # clean up diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32-tests index 992b3ec5ff..204e7aa708 100755 --- a/buildroot/tests/esp32-tests +++ b/buildroot/tests/esp32-tests @@ -30,6 +30,10 @@ opt_set X_HARDWARE_SERIAL Serial1 opt_set Y_HARDWARE_SERIAL Serial1 opt_set Z_HARDWARE_SERIAL Serial1 opt_set E0_HARDWARE_SERIAL Serial1 +opt_set X_SLAVE_ADDRESS 0 +opt_set Y_SLAVE_ADDRESS 1 +opt_set Z_SLAVE_ADDRESS 2 +opt_set E0_SLAVE_ADDRESS 3 opt_enable HOTEND_IDLE_TIMEOUT exec_test $1 $2 "ESP32, TMC HW Serial, Hotend Idle" From 1978a29678391695fa6cf8127b35817af9703953 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Tue, 22 Sep 2020 20:01:01 -0600 Subject: [PATCH 0276/1370] New Touch UI buttons (#19465) --- .../screens/leveling_menu.cpp | 47 +++++++++++-------- .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 15 ++++-- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index 74ab332fb4..763403d287 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -35,27 +35,29 @@ using namespace ExtUI; using namespace Theme; #ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 9 + #define GRID_ROWS 10 #define GRID_COLS 2 #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define SHOW_MESH_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define Z_AUTO_ALIGN_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define BLTOUCH_TITLE_POS BTN_POS(1,7), BTN_SIZE(2,1) + #define BLTOUCH_RESET_POS BTN_POS(1,8), BTN_SIZE(1,1) + #define BLTOUCH_TEST_POS BTN_POS(2,8), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,10), BTN_SIZE(2,1) +#else + #define GRID_ROWS 8 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define Z_AUTO_ALIGN_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(2,1) #define BLTOUCH_TITLE_POS BTN_POS(1,6), BTN_SIZE(2,1) #define BLTOUCH_RESET_POS BTN_POS(1,7), BTN_SIZE(1,1) #define BLTOUCH_TEST_POS BTN_POS(2,7), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) -#else - #define GRID_ROWS 7 - #define GRID_COLS 2 - #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define SHOW_MESH_POS BTN_POS(1,4), BTN_SIZE(2,1) - #define BLTOUCH_TITLE_POS BTN_POS(1,5), BTN_SIZE(2,1) - #define BLTOUCH_RESET_POS BTN_POS(1,6), BTN_SIZE(1,1) - #define BLTOUCH_TEST_POS BTN_POS(2,6), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,7), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) #endif void LevelingMenu::onRedraw(draw_mode_t what) { @@ -78,12 +80,14 @@ void LevelingMenu::onRedraw(draw_mode_t what) { #endif ) .tag(3).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) + .enabled(ENABLED(Z_STEPPER_AUTO_ALIGN)) + .tag(4).button(Z_AUTO_ALIGN_POS, GET_TEXT_F(MSG_AUTO_Z_ALIGN)) .enabled(ENABLED(HAS_MESH)) - .tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)); + .tag(5).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)); #if ENABLED(BLTOUCH) cmd.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) - .tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) - .tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)); + .tag(6).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) + .tag(7).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)); #endif cmd.colors(action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); @@ -103,12 +107,15 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { #ifdef AXIS_LEVELING_COMMANDS case 3: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS)); break; #endif + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + case 4: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break; + #endif #if HAS_MESH - case 4: GOTO_SCREEN(BedMeshScreen); break; + case 5: GOTO_SCREEN(BedMeshScreen); break; #endif #if ENABLED(BLTOUCH) - case 5: injectCommands_P(PSTR("M280 P0 S60")); break; - case 6: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; + case 6: injectCommands_P(PSTR("M280 P0 S60")); break; + case 7: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; #endif default: return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index 4e3fb7d17e..9fe2f1e9cb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -37,7 +37,7 @@ void TuneMenu::onRedraw(draw_mode_t what) { } #ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 8 + #define GRID_ROWS 9 #define GRID_COLS 2 #define TEMPERATURE_POS BTN_POS(1,1), BTN_SIZE(2,1) #define FIL_CHANGE_POS BTN_POS(1,2), BTN_SIZE(2,1) @@ -46,9 +46,10 @@ void TuneMenu::onRedraw(draw_mode_t what) { #define SPEED_POS BTN_POS(1,5), BTN_SIZE(2,1) #define PAUSE_POS BTN_POS(1,6), BTN_SIZE(2,1) #define STOP_POS BTN_POS(1,7), BTN_SIZE(2,1) - #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) + #define CASE_LIGHT_POS BTN_POS(1,8), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) #else - #define GRID_ROWS 4 + #define GRID_ROWS 5 #define GRID_COLS 2 #define TEMPERATURE_POS BTN_POS(1,1), BTN_SIZE(1,1) #define NUDGE_NOZ_POS BTN_POS(2,1), BTN_SIZE(1,1) @@ -57,7 +58,8 @@ void TuneMenu::onRedraw(draw_mode_t what) { #define PAUSE_POS BTN_POS(1,3), BTN_SIZE(1,1) #define STOP_POS BTN_POS(2,3), BTN_SIZE(1,1) #define FILAMENT_POS BTN_POS(1,4), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(2,4), BTN_SIZE(1,1) + #define CASE_LIGHT_POS BTN_POS(2,4), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,5), BTN_SIZE(2,1) #endif if (what & FOREGROUND) { @@ -79,6 +81,8 @@ void TuneMenu::onRedraw(draw_mode_t what) { .button( PAUSE_POS, isPrintingFromMediaPaused() ? GET_TEXT_F(MSG_RESUME_PRINT) : GET_TEXT_F(MSG_PAUSE_PRINT)) .enabled(TERN0(SDSUPPORT, isPrintingFromMedia())) .tag(8).button( STOP_POS, GET_TEXT_F(MSG_STOP_PRINT)) + .enabled(ENABLED(CASE_LIGHT_ENABLE)) + .tag(10).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) .tag(1).colors(action_btn) .button( BACK_POS, GET_TEXT_F(MSG_BACK)); } @@ -111,6 +115,9 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) case 9: GOTO_SCREEN(FilamentMenu); break; #endif + #if ENABLED(CASE_LIGHT_ENABLE) + case 10: GOTO_SCREEN(CaseLightScreen); break; + #endif default: return false; } From 873b5db13dc1064d83a60b55622139aa14886ed5 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 23 Sep 2020 17:06:36 -0300 Subject: [PATCH 0277/1370] Include pins.h in dependencies script (#19468) --- Marlin/src/pins/esp32/pins_E4D.h | 2 +- Marlin/src/pins/esp32/pins_ESP32.h | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 2 +- Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h | 2 +- Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 2 +- Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 4 ++++ Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 4 ++-- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 4 ++-- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 2 +- Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h | 2 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h | 2 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 2 +- .../src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h | 2 +- Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h | 2 +- Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h | 2 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN.h | 2 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 2 +- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 2 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 2 +- Marlin/src/pins/mega/pins_CHEAPTRONIC.h | 2 +- Marlin/src/pins/mega/pins_CHEAPTRONICv2.h | 2 +- Marlin/src/pins/mega/pins_CNCONTROLS_11.h | 2 +- Marlin/src/pins/mega/pins_CNCONTROLS_12.h | 2 +- Marlin/src/pins/mega/pins_CNCONTROLS_15.h | 2 +- Marlin/src/pins/mega/pins_EINSTART-S.h | 2 +- Marlin/src/pins/mega/pins_ELEFU_3.h | 2 +- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 2 +- Marlin/src/pins/mega/pins_GT2560_V3.h | 2 +- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 2 +- Marlin/src/pins/mega/pins_INTAMSYS40.h | 2 +- Marlin/src/pins/mega/pins_LEAPFROG.h | 2 +- Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h | 2 +- Marlin/src/pins/mega/pins_MEGACONTROLLER.h | 2 +- Marlin/src/pins/mega/pins_MEGATRONICS.h | 2 +- Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 2 +- Marlin/src/pins/mega/pins_MEGATRONICS_3.h | 2 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 2 +- Marlin/src/pins/mega/pins_MINITRONICS.h | 2 +- Marlin/src/pins/mega/pins_OVERLORD.h | 2 +- Marlin/src/pins/mega/pins_PICA.h | 2 +- Marlin/src/pins/mega/pins_SILVER_GATE.h | 2 +- Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h | 2 +- Marlin/src/pins/pins.h | 7 +++++++ Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 2 +- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 2 +- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 2 +- Marlin/src/pins/rambo/pins_RAMBO.h | 2 +- Marlin/src/pins/rambo/pins_SCOOVO_X9H.h | 2 +- Marlin/src/pins/ramps/pins_AZTEEG_X3.h | 2 +- Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h | 2 +- Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h | 2 +- Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 2 +- Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h | 2 +- Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h | 2 +- Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h | 2 +- Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 2 +- Marlin/src/pins/ramps/pins_K8800.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS.h | 9 +++++---- Marlin/src/pins/ramps/pins_RAMPS_OLD.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_PLUS.h | 2 +- Marlin/src/pins/ramps/pins_RUMBA.h | 2 +- Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h | 2 +- Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h | 2 +- Marlin/src/pins/ramps/pins_TT_OSCAR.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAIN_2.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 2 +- Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h | 2 +- Marlin/src/pins/sam/pins_ADSK.h | 2 +- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 2 +- Marlin/src/pins/sam/pins_ARCHIM1.h | 2 +- Marlin/src/pins/sam/pins_ARCHIM2.h | 2 +- Marlin/src/pins/sam/pins_CNCONTROLS_15D.h | 2 +- Marlin/src/pins/sam/pins_DUE3DOM.h | 2 +- Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 2 +- Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 2 +- Marlin/src/pins/sam/pins_RADDS.h | 2 +- Marlin/src/pins/sam/pins_RAMPS4DUE.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_DUO.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_FD_V1.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_SMART.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 2 +- Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h | 2 +- Marlin/src/pins/samd/pins_RAMPS_144.h | 2 +- Marlin/src/pins/sanguino/pins_ANET_10.h | 2 +- Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h | 2 +- Marlin/src/pins/sanguino/pins_GEN3_PLUS.h | 2 +- Marlin/src/pins/sanguino/pins_GEN6.h | 2 +- Marlin/src/pins/sanguino/pins_GEN7_12.h | 2 +- Marlin/src/pins/sanguino/pins_GEN7_14.h | 2 +- Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h | 2 +- Marlin/src/pins/sanguino/pins_OMCA.h | 2 +- Marlin/src/pins/sanguino/pins_OMCA_A.h | 2 +- Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h | 2 +- Marlin/src/pins/sanguino/pins_SETHI.h | 2 +- Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 2 +- Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h | 2 +- Marlin/src/pins/stm32f0/pins_MALYAN_M300.h | 2 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 2 +- .../pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 2 +- Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V427.h | 2 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 2 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 2 +- .../src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 2 +- Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 2 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MALYAN_M200.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 4 ++-- .../src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 4 ++-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- Marlin/src/pins/stm32f1/pins_MORPHEUS.h | 2 +- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 2 +- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 2 +- Marlin/src/pins/stm32f4/pins_ARMED.h | 2 +- Marlin/src/pins/stm32f4/pins_BEAST.h | 2 +- Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 2 +- .../src/pins/stm32f4/pins_BTT_SKR_PRO_common.h | 2 +- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 2 +- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 2 +- Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 2 +- Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 2 +- Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h | 2 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 2 +- Marlin/src/pins/stm32f7/pins_REMRAM_V1.h | 2 +- Marlin/src/pins/stm32f7/pins_THE_BORG.h | 2 +- Marlin/src/pins/teensy2/pins_5DPRINT.h | 2 +- Marlin/src/pins/teensy2/pins_BRAINWAVE.h | 2 +- Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h | 2 +- Marlin/src/pins/teensy2/pins_PRINTRBOARD.h | 2 +- Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 2 +- Marlin/src/pins/teensy2/pins_SAV_MKI.h | 2 +- Marlin/src/pins/teensy2/pins_TEENSY2.h | 2 +- Marlin/src/pins/teensy2/pins_TEENSYLU.h | 2 +- Marlin/src/pins/teensy3/pins_TEENSY31_32.h | 2 +- Marlin/src/pins/teensy3/pins_TEENSY35_36.h | 2 +- Marlin/src/pins/teensy4/pins_T41U5XBB.h | 8 ++++---- Marlin/src/pins/teensy4/pins_TEENSY41.h | 16 ++++++++-------- .../scripts/common-dependencies-post.py | 16 ++++++++++++++++ .../PlatformIO/scripts/common-dependencies.h | 3 +++ .../PlatformIO/scripts/common-dependencies.py | 2 +- platformio.ini | 1 + 169 files changed, 213 insertions(+), 181 deletions(-) create mode 100644 buildroot/share/PlatformIO/scripts/common-dependencies-post.py diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index e66bb669f7..7b5595444c 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -27,7 +27,7 @@ * for more info check https://atbox.tech/ and join to Facebook page E4d@box. */ -#ifndef ARDUINO_ARCH_ESP32 +#if NOT_TARGET(ARDUINO_ARCH_ESP32) #error "Oops! Select an ESP32 board in 'Tools > Board.'" #elif EXTRUDERS > 1 || E_STEPPERS > 1 #error "E4d@box only supports one E Stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/esp32/pins_ESP32.h b/Marlin/src/pins/esp32/pins_ESP32.h index 5f793f1cf2..d54a92b9c4 100644 --- a/Marlin/src/pins/esp32/pins_ESP32.h +++ b/Marlin/src/pins/esp32/pins_ESP32.h @@ -25,7 +25,7 @@ * Espressif ESP32 (Tensilica Xtensa LX6) pin assignments */ -#ifndef ARDUINO_ARCH_ESP32 +#if NOT_TARGET(ARDUINO_ARCH_ESP32) "Oops! Select an ESP32 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index 8a5b11ed71..0457b0afca 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -27,7 +27,7 @@ * Supports 4 stepper drivers, heated bed, single hotend. */ -#ifndef ARDUINO_ARCH_ESP32 +#if NOT_TARGET(ARDUINO_ARCH_ESP32) #error "Oops! Select an ESP32 board in 'Tools > Board.'" #elif EXTRUDERS > 1 || E_STEPPERS > 1 #error "MRR ESPA only supports one E Stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index b38a88351d..459d00e3e7 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -28,7 +28,7 @@ * single hotend, and LCD controller. */ -#ifndef ARDUINO_ARCH_ESP32 +#if NOT_TARGET(ARDUINO_ARCH_ESP32) #error "Oops! Select an ESP32 board in 'Tools > Board.'" #elif EXTRUDERS > 2 || E_STEPPERS > 2 #error "MRR ESPE only supports two E Steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h index ffc149279c..78e7426674 100644 --- a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h +++ b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h @@ -25,7 +25,7 @@ * AZSMZ MINI pin assignments */ -#ifndef MCU_LPC1768 +#if NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h index 6ccfca1cac..13e30b961c 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -30,7 +30,7 @@ * */ -#ifndef MCU_LPC1768 +#if NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index 20edcb07a7..ed5fd530e0 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -30,7 +30,7 @@ * */ -#ifndef MCU_LPC1768 +#if NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index ce1372ed7a..1846b16e46 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -25,6 +25,10 @@ #define BOARD_INFO_NAME "BTT SKR V1.4" #endif +#ifndef BOARD_CUSTOM_BUILD_FLAGS + #define BOARD_CUSTOM_BUILD_FLAGS -DLPC_PINCFG_UART3_P4_28 +#endif + // // SD Connection // diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index bfae569cc4..9fade582e9 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -22,10 +22,10 @@ #pragma once #ifdef SKR_HAS_LPC1769 - #ifndef MCU_LPC1769 + #if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif -#elif !defined(MCU_LPC1768) +#elif NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 6bba067cbe..5132081a55 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef MCU_LPC1768 +#if NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 54f3dfd95c..7d0745aa2d 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -25,9 +25,9 @@ * MKS SBASE pin assignments */ -#if defined(MKS_HAS_LPC1769) && !defined(MCU_LPC1769) +#if defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#elif !defined(MKS_HAS_LPC1769) && !defined(MCU_LPC1768) +#elif NOT_TARGET(MKS_HAS_LPC1769, MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 59d6a06cf4..c57c987a75 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -25,7 +25,7 @@ * MKS SGEN-L pin assignments */ -#ifndef MCU_LPC1768 +#if NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 32c9ad2711..7b87c95f84 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -36,7 +36,7 @@ // Numbers in parentheses () are the corresponding mega2560 pin numbers -#ifndef MCU_LPC1768 +#if NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h index e717511c12..f9b9db918d 100644 --- a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h +++ b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h @@ -25,7 +25,7 @@ * Selena Compact pin assignments */ -#ifndef MCU_LPC1768 +#if NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h index 83cf17eee9..adf9085262 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h @@ -25,7 +25,7 @@ * Azteeg X5 GT pin assignments */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index 8d5080b280..d798e38735 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -25,7 +25,7 @@ * Azteeg X5 MINI pin assignments */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h index 592f666e39..99ff0fd25a 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h @@ -25,7 +25,7 @@ * Azteeg X5 MINI pin assignments */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h index d5c7d9868f..0314c5049f 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h @@ -25,7 +25,7 @@ * Cohesion3D Mini pin assignments */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h index 3870902881..9dc870a353 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -25,7 +25,7 @@ * Cohesion3D ReMix pin assignments */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index c9f3ff7aae..19c2d50320 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -29,7 +29,7 @@ * */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index b6f11a133d..3df10a41d7 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -25,7 +25,7 @@ * MKS SGen pin assignments */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index de148995ca..696270b417 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -25,7 +25,7 @@ * Smoothieboard pin assignments */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index 81f5b75016..75c899fe01 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -25,7 +25,7 @@ * TH3D EZBoard pin assignments */ -#ifndef MCU_LPC1769 +#if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h index 90d4340ba8..98427d9e59 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h @@ -25,7 +25,7 @@ * Cheaptronic v1.0 pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h index 18bcc9e407..3a84f4395f 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h @@ -27,7 +27,7 @@ * www.reprapobchod.cz */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h index 6f792ad5fa..675d4b7262 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h @@ -25,7 +25,7 @@ * CartesioV11 pin assignments */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h index 7040c2babb..35426a4531 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h @@ -25,7 +25,7 @@ * CartesioV12 pin assignments */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h index 4af0d991e9..8bafbdf000 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h @@ -25,7 +25,7 @@ * CNControls V15 for HMS434 pin assignments */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_EINSTART-S.h b/Marlin/src/pins/mega/pins_EINSTART-S.h index eeaf0c4197..40d65c353e 100644 --- a/Marlin/src/pins/mega/pins_EINSTART-S.h +++ b/Marlin/src/pins/mega/pins_EINSTART-S.h @@ -26,7 +26,7 @@ * PCB Silkscreen: 3DPrinterCon_v3.5 */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_ELEFU_3.h b/Marlin/src/pins/mega/pins_ELEFU_3.h index 685611f78d..af93c408a2 100644 --- a/Marlin/src/pins/mega/pins_ELEFU_3.h +++ b/Marlin/src/pins/mega/pins_ELEFU_3.h @@ -25,7 +25,7 @@ * Elefu RA Board Pin Assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index ebfdd24bb4..2fb112f5af 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -27,7 +27,7 @@ * Richard Smith */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 9b396d8db2..d71a195419 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -25,7 +25,7 @@ * GT2560 RevB + GT2560 V3.0 + GT2560 V3.1 + GT2560 V4.0 pin assignment */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index 2cbac0723c..d21cd22e53 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -25,7 +25,7 @@ * HJC2560-C Rev2.x pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h index b6ff30a4fc..3dc9c9a6be 100644 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -27,7 +27,7 @@ * 2208 version exists and may or may not work */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_LEAPFROG.h b/Marlin/src/pins/mega/pins_LEAPFROG.h index 99872e1fb4..9e6802b24b 100644 --- a/Marlin/src/pins/mega/pins_LEAPFROG.h +++ b/Marlin/src/pins/mega/pins_LEAPFROG.h @@ -25,7 +25,7 @@ * Leapfrog Driver board pin assignments */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h index 61f5508cdc..9c316aa759 100644 --- a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h +++ b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h @@ -29,7 +29,7 @@ * printer models. As such this file is currently specific to the Xeed. */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h index 6b90b884c2..938ad82eff 100644 --- a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h +++ b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h @@ -25,7 +25,7 @@ * Mega controller pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Mega Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index 2d98256fe7..1c37b21ab7 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -25,7 +25,7 @@ * MegaTronics pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index 481dc35fa3..9005ac2acf 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -25,7 +25,7 @@ * MegaTronics v2.0 pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h index 0938896748..45ebd163a7 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h @@ -25,7 +25,7 @@ * MegaTronics v3.0 / v3.1 / v3.2 pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index 526c9bfc68..74a45eac01 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -37,7 +37,7 @@ * number (B5) agrees with the schematic but B5 is assigned to logical pin 11. */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_MINITRONICS.h b/Marlin/src/pins/mega/pins_MINITRONICS.h index 138d4b4431..9cb4401da9 100644 --- a/Marlin/src/pins/mega/pins_MINITRONICS.h +++ b/Marlin/src/pins/mega/pins_MINITRONICS.h @@ -32,7 +32,7 @@ * */ -#ifndef __AVR_ATmega1281__ +#if NOT_TARGET(__AVR_ATmega1281__) #error "Oops! Select 'Minitronics' in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Minitronics supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h index bbccc93561..9589fa5851 100644 --- a/Marlin/src/pins/mega/pins_OVERLORD.h +++ b/Marlin/src/pins/mega/pins_OVERLORD.h @@ -25,7 +25,7 @@ * Dreammaker Overlord v1.1 pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Overlord Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h index 40ef3a610f..acaeefe178 100644 --- a/Marlin/src/pins/mega/pins_PICA.h +++ b/Marlin/src/pins/mega/pins_PICA.h @@ -42,7 +42,7 @@ AD12 = 66; AD13 = 67; AD14 = 68; AD15 = 69; */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." #endif diff --git a/Marlin/src/pins/mega/pins_SILVER_GATE.h b/Marlin/src/pins/mega/pins_SILVER_GATE.h index a67725d9bc..e339b0472a 100644 --- a/Marlin/src/pins/mega/pins_SILVER_GATE.h +++ b/Marlin/src/pins/mega/pins_SILVER_GATE.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(__AVR_ATmega1281__) && !defined(__AVR_ATmega2561__) +#if NOT_TARGET(__AVR_ATmega1281__, __AVR_ATmega2561__) #error "Oops! Select 'Silvergate' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h index ba7f64768b..52e757c534 100644 --- a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h +++ b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h @@ -25,7 +25,7 @@ * Wanhao 0ne+ pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 861810d95b..bf95c87312 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -51,6 +51,13 @@ #define HAS_FREE_AUX2_PINS !(BOTH(ULTRA_LCD, NEWPANEL) && ANY(PANEL_ONE, VIKI2, miniVIKI, MINIPANEL, REPRAPWORLD_KEYPAD)) +// Test the target within the included pins file +#ifdef __MARLIN_PREBUILD__ + #define NOT_TARGET(V...) 0 +#else + #define NOT_TARGET(V...) NONE(V) +#endif + // // RAMPS 1.3 / 1.4 - ATmega1280, ATmega2560 // diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index e2a4940e87..21e43bb361 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -25,7 +25,7 @@ * Einsy-Rambo pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index 672c372414..39ba3ddf04 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -25,7 +25,7 @@ * Einsy-Retro pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index 0c14d9f46b..c41a6ac179 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -25,7 +25,7 @@ * Mini-RAMBo pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'RAMBo' in 'Tools > Board' or the Mega2560 environment in PlatformIO." #endif diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 5abf1f2d90..2109eb615b 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -41,7 +41,7 @@ * Rambo pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h index bba628f307..4af38e1de3 100644 --- a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h +++ b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h @@ -25,7 +25,7 @@ * Rambo pin assignments MODIFIED FOR Scoovo X9H ************************************************/ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h index d142fb903e..e919b30cf9 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h @@ -25,7 +25,7 @@ * AZTEEG_X3 Arduino Mega with RAMPS v1.4 pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Azteeg X3 supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h index 5eee450fc5..9ba6a0c1ac 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -25,7 +25,7 @@ * AZTEEG_X3_PRO (Arduino Mega) pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 5 || E_STEPPERS > 5 #error "Azteeg X3 Pro supports up to 5 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h index 1420aaaa56..967fec7b47 100644 --- a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h +++ b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h @@ -25,7 +25,7 @@ * bq ZUM Mega 3D board definition */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h index de80851df0..3fa738e322 100644 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -25,7 +25,7 @@ * Wanhao Duplicator i3 Plus pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h index f1e6e6727c..0877d168d6 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h @@ -25,7 +25,7 @@ * Formbot Raptor pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 3 || E_STEPPERS > 3 #error "Formbot supports up to 3 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h index 4a9b9e1d59..362ff7ae43 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h @@ -25,7 +25,7 @@ * Formbot pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h index a804df4ed3..0470fc47e9 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h @@ -25,7 +25,7 @@ * Formbot pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index ffaa72d988..3f7575497c 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -25,7 +25,7 @@ // FYSETC F6 1.3 (and 1.4) pin assignments // -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'FYSETC F6' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h index 64e3c25660..f526b9b226 100644 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -25,7 +25,7 @@ * Velleman K8800 (Vertex) */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index e32c79afa9..b2d394e61d 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -51,12 +51,13 @@ #error "Oops! Set MOTHERBOARD to an STM32F1-based board when building for STM32F1." #endif -#if NONE(IS_RAMPS_SMART, IS_RAMPS_DUO, IS_RAMPS4DUE, TARGET_LPC1768) - #if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" - #endif +#if NOT_TARGET(IS_RAMPS_SMART, IS_RAMPS_DUO, IS_RAMPS4DUE, TARGET_LPC1768, __AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS 1.4" #endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h index d154b2fdd0..6d2dad2314 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h @@ -25,7 +25,7 @@ * Arduino Mega with RAMPS v1.0, v1.1, v1.2 pin assignments */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h index bdd53abbc0..19209f1e23 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -38,7 +38,7 @@ * */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h index 5b4f830328..5be2896e18 100644 --- a/Marlin/src/pins/ramps/pins_RUMBA.h +++ b/Marlin/src/pins/ramps/pins_RUMBA.h @@ -25,7 +25,7 @@ * RUMBA pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA supports up to 3 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h index 98a20fb3fd..e7a59a69df 100644 --- a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h +++ b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h @@ -25,7 +25,7 @@ * Tenlog pin assignments */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Tenlog supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h index d02a063e80..f342eff8aa 100644 --- a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h +++ b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h @@ -25,7 +25,7 @@ * Arduino Mega for Tronxy X5S-2E, etc. */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "TRONXY-V3-1.0 supports only 2 hotends/E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index ab3dc1a32b..33b2a60d64 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -20,7 +20,7 @@ * */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index cbf9523eac..c6251ae817 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -33,7 +33,7 @@ * case light */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index f316fad778..2dfde42bac 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -33,7 +33,7 @@ * case light */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index a44baf26e4..c5bbd02bf5 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -60,7 +60,7 @@ //#define BOARD_REV_1_0 //#define BOARD_REV_1_5 -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h index 4bf63f348f..096d970871 100644 --- a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h +++ b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h @@ -25,7 +25,7 @@ * Z-Bolt X Series board – based on Arduino Mega2560 */ -#ifndef __AVR_ATmega2560__ +#if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 4 || E_STEPPERS > 4 #error "Z-Bolt X Series board supports up to 4 hotends / E-steppers." diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h index 289fa462cc..c4d7c07940 100644 --- a/Marlin/src/pins/sam/pins_ADSK.h +++ b/Marlin/src/pins/sam/pins_ADSK.h @@ -27,7 +27,7 @@ #define BOARD_INFO_NAME "ADSK" -#if !defined(__SAM3X8E__) && !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index 4d08ed784d..8d6906117d 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -26,7 +26,7 @@ * https://reprap.org/wiki/Alligator_Board */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h index 134049781a..8c54cad3b6 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM1.h +++ b/Marlin/src/pins/sam/pins_ARCHIM1.h @@ -37,7 +37,7 @@ * https://github.com/ultimachine/Archim/wiki */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Archim' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h index b527b51183..3223ac7a0e 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM2.h +++ b/Marlin/src/pins/sam/pins_ARCHIM2.h @@ -37,7 +37,7 @@ * https://github.com/ultimachine/Archim/wiki */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Archim' in 'Tools > Board.'" #elif DISABLED(TMC_USE_SW_SPI) #error "Archim2 requires Software SPI. Enable TMC_USE_SW_SPI in Configuration_adv.h." diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h index a2094bee4d..fcd2bb4c67 100644 --- a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h +++ b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h @@ -24,7 +24,7 @@ * CNControls V15 for HMS434 with DUE pin assignments */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index 260a2810f5..b7c01f843a 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -25,7 +25,7 @@ * DUE3DOM pin assignments */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 946cadcfa9..7f559f1190 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -25,7 +25,7 @@ * DUE3DOM MINI pin assignments */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index be6b0fb2ed..2cfbecc086 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -25,7 +25,7 @@ * PRINTRBOARD_G2 */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index bbbfb2e558..c82c7e9c53 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -25,7 +25,7 @@ * RADDS */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_RAMPS4DUE.h b/Marlin/src/pins/sam/pins_RAMPS4DUE.h index 2bd894f9ae..54548333b5 100644 --- a/Marlin/src/pins/sam/pins_RAMPS4DUE.h +++ b/Marlin/src/pins/sam/pins_RAMPS4DUE.h @@ -39,7 +39,7 @@ * A15 | NC */ -#if !defined(__SAM3X8E__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h index 5f8864ab14..94f1b50776 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -43,7 +43,7 @@ * A15 | A11 */ -#if !defined(__SAM3X8E__) && !defined(__AVR_ATmega2560__) +#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h index eb9889607d..5662590e26 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -28,7 +28,7 @@ * Use 4k7 thermistor tables */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h index 06eee2d970..9b76ee290b 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_SMART.h +++ b/Marlin/src/pins/sam/pins_RAMPS_SMART.h @@ -60,7 +60,7 @@ * (Search the web for "Arduino DUE Board Pinout" to see the correct header.) */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 3ecd64aa8a..524c14d198 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -32,7 +32,7 @@ * | */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 2b52338d35..187473b3dd 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -32,7 +32,7 @@ * | */ -#ifndef __SAM3X8E__ +#if NOT_TARGET(__SAM3X8E__) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h index 75b29629e9..0b91ba61d6 100644 --- a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h +++ b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h @@ -26,7 +26,7 @@ * https://reprapworld.com/documentation/datasheet_ultratronics10_05.pdf */ -#ifndef ARDUINO_ARCH_SAM +#if NOT_TARGET(ARDUINO_ARCH_SAM) #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index 93e758b3ae..388ac1a331 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -25,7 +25,7 @@ * AGCM4 with RAMPS v1.4.4 pin assignments */ -#ifndef ARDUINO_GRAND_CENTRAL_M4 +#if NOT_TARGET(ARDUINO_GRAND_CENTRAL_M4) #error "Oops! Select 'Adafruit Grand Central M4' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index d1ac131c03..3978198eef 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -89,7 +89,7 @@ * Many thanks to Hans Raaf (@oderwat) for developing the Anet-specific software and supporting the Anet community. */ -#ifndef __AVR_ATmega1284P__ +#if NOT_TARGET(__AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega1284P' in 'Tools > Processor.' (For PlatformIO, use 'melzi' or 'melzi_optiboot.')" #endif diff --git a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h index 901e326742..e927aac124 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h @@ -50,7 +50,7 @@ * */ -#ifndef __AVR_ATmega644P__ +#if NOT_TARGET(__AVR_ATmega644P__) #error "Oops! Select 'Sanguino' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h index a28b4c039c..1961446e22 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h @@ -50,7 +50,7 @@ * */ -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h index ad54f3cd76..98eb616892 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6.h +++ b/Marlin/src/pins/sanguino/pins_GEN6.h @@ -52,7 +52,7 @@ * */ -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h index 75b75cdc6f..ed550624f7 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_12.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_12.h @@ -52,7 +52,7 @@ * */ -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h index af0d824151..752fe3074f 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_14.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h @@ -52,7 +52,7 @@ * */ -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h index 27ec622fce..1a19c33dea 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h @@ -55,7 +55,7 @@ * */ -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_OMCA.h b/Marlin/src/pins/sanguino/pins_OMCA.h index 8e4c6d2b64..d9f43995d4 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA.h +++ b/Marlin/src/pins/sanguino/pins_OMCA.h @@ -77,7 +77,7 @@ * */ -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__) #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega644' or 'ATmega644P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_OMCA_A.h b/Marlin/src/pins/sanguino/pins_OMCA_A.h index 922ef69b5e..1b4c9b68b2 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA_A.h +++ b/Marlin/src/pins/sanguino/pins_OMCA_A.h @@ -76,7 +76,7 @@ * */ -#ifndef __AVR_ATmega644__ +#if NOT_TARGET(__AVR_ATmega644__) #error "Oops! Select 'Sanguino' in 'Tools > Board' and ATmega644 in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index 83c2d56d2b..4b4fb1d70e 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -52,7 +52,7 @@ * */ -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_SETHI.h b/Marlin/src/pins/sanguino/pins_SETHI.h index 19fea9ff53..e0a0604619 100644 --- a/Marlin/src/pins/sanguino/pins_SETHI.h +++ b/Marlin/src/pins/sanguino/pins_SETHI.h @@ -50,7 +50,7 @@ * */ -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index 262199e310..838ffe38aa 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" #endif diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h index 0e5bd58987..abdd088f9b 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h @@ -22,7 +22,7 @@ #pragma once -#ifndef STM32F0xx +#if NOT_TARGET(STM32F0xx) #error "Oops! Select an STM32F0 board in your IDE." #endif diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h index d6a83aca1a..dfa413b63f 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h @@ -22,7 +22,7 @@ #pragma once -#if NONE(__STM32F1__, STM32F1xx, STM32F0xx) +#if NOT_TARGET(__STM32F1__, STM32F1xx, STM32F0xx) #error "Oops! Select a 'Malyan M300' board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index cff34daf2f..e4f8e614bb 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F1 +#if NOT_TARGET(TARGET_STM32F1) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 923b0fa4c1..85c5f646d9 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F1 +#if NOT_TARGET(TARGET_STM32F1) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index 4a12d5d32d..09dff2ef30 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F1 +#if NOT_TARGET(TARGET_STM32F1) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index 5254166fa5..420ffc631f 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F1 +#if NOT_TARGET(TARGET_STM32F1) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "CCROBOT-ONLINE MEEB_3DP only supports 1 hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index bf9a7d8e05..2521359e53 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(__STM32F1__) && !defined(__STM32F4__) +#if NOT_TARGET(__STM32F1__, __STM32F4__) #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 54ff9a779a..10c615e524 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(__STM32F1__) && !defined(__STM32F4__) +#if NOT_TARGET(__STM32F1__, __STM32F4__) #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index a825db275c..f8f3225f3c 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(__STM32F1__) && !defined(__STM32F4__) +#if NOT_TARGET(__STM32F1__, __STM32F4__) #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index f122a2b7c2..c1f1e315df 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -24,7 +24,7 @@ * CREALITY (STM32F103) board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h index 9453a6d515..5b51ece07f 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h @@ -24,7 +24,7 @@ * CREALITY v4.2.7 (STM32F103) board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index ca9364a570..b7db592e78 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 1f5e70a15a..24aa83d948 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h index f07320db40..5e8bd11b4b 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index fe6c0b1325..b6520d563c 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -26,7 +26,7 @@ * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 716de610a7..7dbee215a0 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -26,7 +26,7 @@ * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index fe6c0b1325..b6520d563c 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -26,7 +26,7 @@ * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index 1fc4fa9424..7731ffb5e7 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -26,7 +26,7 @@ * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index d474eb25f6..64948039ba 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -28,7 +28,7 @@ * Pin assignments for 32-bit JGAurora A5S & A1 */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "JGAurora 32-bit board only supports 1 hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index d08045ec16..799477ac10 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -22,7 +22,7 @@ * Longer3D LK1/LK2 & Alfawise U20/U30 (STM32F103VET6) board pin assignments */ -#if !defined(__STM32F1__) && !defined(STM32F1xx) +#if NOT_TARGET(__STM32F1__, STM32F1xx) #error "Oops! Select a STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "Longer3D board only supports 1 hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h index 39c52ab0d3..d3c26c497d 100644 --- a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h +++ b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h @@ -25,7 +25,7 @@ * MALYAN M200 pin assignments */ -#if NONE(__STM32F1__, STM32F1xx, STM32F0xx) +#if NOT_TARGET(__STM32F1__, STM32F1xx, STM32F0xx) #error "Oops! Select an STM32 board in your IDE." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 1ab9165830..e39c8f2342 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -27,7 +27,7 @@ * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware */ -#if !defined(STM32F1) && !defined(STM32F1xx) +#if NOT_TARGET(STM32F1, STM32F1xx) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 3f4dee0f68..19f3c3efda 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -25,7 +25,7 @@ * MKS Robin nano (STM32F130VET6) board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin e3p supports up to 1 hotends / E-steppers. Comment out this line to continue." @@ -184,7 +184,7 @@ #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE - + #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN #define WIFI_RESET_PIN PE9 // MKS ESP WIFI RESET PIN diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 9461a828af..f6a3b555c3 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -25,7 +25,7 @@ * MKS Robin E3 & E3D (STM32F103RCT6) common board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index 3cf0bce06d..2bd417951f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin Lite supports only 1 hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 6ce6c60105..bcb731df71 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -25,7 +25,7 @@ * MKS Robin Lite 3 (STM32F103RCT6) board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin Lite3 supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 19b04c9e7c..a7e6a6e227 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -25,7 +25,7 @@ * MKS Robin mini (STM32F130VET6) board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin mini only supports 1 hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 88333e9b9f..e705b7b570 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -25,7 +25,7 @@ * MKS Robin nano (STM32F130VET6) board pin assignments */ -#if !defined(STM32F1) && !defined(STM32F1xx) +#if NOT_TARGET(STM32F1, STM32F1xx) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index d911ab2b51..ccb07b35f8 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -25,7 +25,7 @@ * MKS Robin nano (STM32F130VET6) board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." @@ -204,7 +204,7 @@ #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN #define MT_DET_2_PIN PE6 // LVGL UI FILAMENT RUNOUT2 PIN #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE - + #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN #define WIFI_RESET_PIN PE9 // MKS ESP WIFI RESET PIN diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 9b3817df8c..2e74b6b15f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -25,7 +25,7 @@ * MKS Robin pro (STM32F103ZET6) board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 3 || E_STEPPERS > 3 #error "MKS Robin pro supports up to 3 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h index 1cd3780ec5..28262eaa82 100644 --- a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h +++ b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h @@ -30,7 +30,7 @@ * MORPHEUS Board pin assignments */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index 63fb383c9b..79f53f02c2 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index c18642fb1d..468ee5394a 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(__STM32F1__) && !defined(__STM32F4__) +#if NOT_TARGET(__STM32F1__, __STM32F4__) #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 598db026fd..4745641ea9 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -28,7 +28,7 @@ * https://github.com/MarlinFirmware/Marlin/files/3401484/x5sa-main_board-2.pdf */ -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Trigorilla Pro supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h index 6962416936..db57db14d5 100644 --- a/Marlin/src/pins/stm32f4/pins_ARMED.h +++ b/Marlin/src/pins/stm32f4/pins_ARMED.h @@ -24,7 +24,7 @@ #pragma once -#ifndef STM32F4 +#if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Arm'ed supports up to 2 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h index 691b468c34..d23442cced 100644 --- a/Marlin/src/pins/stm32f4/pins_BEAST.h +++ b/Marlin/src/pins/stm32f4/pins_BEAST.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(__STM32F1__) && !defined(__STM32F4__) +#if NOT_TARGET(__STM32F1__, __STM32F4__) #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index dc0dab1cd1..b13d495542 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -27,7 +27,7 @@ * Shield - https://github.com/jmz52/Hardware */ -#if !defined(STM32F4) && !defined(STM32F4xx) +#if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "Black STM32F4VET6 supports up to 2 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 009b1b65f1..7843572e13 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef STM32F4 +#if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "BIGTREE BTT002 V1.0 supports up to 1 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 8cc1ca5e98..ddca719e53 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef STM32F4 +#if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 8 || E_STEPPERS > 8 #error "BIGTREE GTR V1.0 supports up to 8 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index b45914284a..e9abd66795 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef STM32F4 +#if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index a3a5ccdff8..808751d7a5 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(STM32F4) && !defined(STM32F4xx) +#if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 6 || E_STEPPERS > 6 #error "FLYF407ZG supports up to 6 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 9ffedc2ac4..a6d7f8a495 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef STM32F4 +#if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA32 supports up to 3 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h index 44b2e6b27c..ae469365a9 100644 --- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h +++ b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h @@ -25,7 +25,7 @@ * To build with Arduino IDE use "Discovery F407VG" * To build with PlatformIO use environment "STM32F4" */ -#if !defined(STM32F4) && !defined(STM32F4xx) +#if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "STM32F4 supports up to 2 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 0f0d3d048c..48973688a0 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -18,7 +18,7 @@ */ #pragma once -#if !defined(STM32F4) && !defined(STM32F4xx) +#if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "LERDGE K supports up to 2 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index 2e55782edb..0600ed4338 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -18,7 +18,7 @@ */ #pragma once -#if !defined(STM32F4) && !defined(STM32F4xx) +#if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "LERDGE S supports up to 2 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index da2851c131..bed51ca660 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -18,7 +18,7 @@ */ #pragma once -#if !defined(STM32F4) && !defined(STM32F4xx) +#if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "LERDGE X supports only one hotend / E-steppers" diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h index bb04cb82ec..c2f5f324ba 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef STM32F4 +#if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS_ROBIN2 supports up to 2 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 90f9e50013..338fda1e53 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -26,7 +26,7 @@ * */ -#ifndef STM32F4 +#if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA32 boards support up to 3 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h index a0bd38b6ac..0278dd8434 100644 --- a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h +++ b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h @@ -40,7 +40,7 @@ #pragma once -#ifndef STM32F4 +#if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index 1ffe25b499..6c826b068d 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -21,7 +21,7 @@ */ #pragma once -#if !defined(STM32F4) && !defined(STM32F4xx) +#if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "STM32F4 supports up to 2 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h index 6706d26f64..c3dc004728 100644 --- a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h +++ b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef STM32F7xx +#if NOT_TARGET(STM32F7xx) #error "Oops! Select an STM32F7 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f7/pins_THE_BORG.h b/Marlin/src/pins/stm32f7/pins_THE_BORG.h index 756f495e4b..c050824a83 100644 --- a/Marlin/src/pins/stm32f7/pins_THE_BORG.h +++ b/Marlin/src/pins/stm32f7/pins_THE_BORG.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef STM32F7 +#if NOT_TARGET(STM32F7) #error "Oops! Select an STM32F7 board in 'Tools > Board.'" #elif HOTENDS > 3 || E_STEPPERS > 3 #error "The-Borg supports up to 3 hotends / E-steppers." diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h index 7ba1fbcf8d..908e12e0ba 100644 --- a/Marlin/src/pins/teensy2/pins_5DPRINT.h +++ b/Marlin/src/pins/teensy2/pins_5DPRINT.h @@ -68,7 +68,7 @@ * https://bitbucket.org/makible/5dprint-d8-controller-board */ -#ifndef __AVR_AT90USB1286__ +#if NOT_TARGET(__AVR_AT90USB1286__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h index ce1b4e3bbf..97d210a0f8 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h @@ -68,7 +68,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#ifndef __AVR_AT90USB646__ +#if NOT_TARGET(__AVR_AT90USB646__) #error "Oops! Select 'AT90USB646_TEENSYPP' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h index eeca39c14c..e41fcaab94 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h @@ -75,7 +75,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#ifndef __AVR_AT90USB1286__ +#if NOT_TARGET(__AVR_AT90USB1286__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index 7d96bd12ff..ffecc03b4a 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -62,7 +62,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#ifndef __AVR_AT90USB1286__ +#if NOT_TARGET(__AVR_AT90USB1286__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index 83b17b6560..3fb8c7f259 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -63,7 +63,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#ifndef __AVR_AT90USB1286__ +#if NOT_TARGET(__AVR_AT90USB1286__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h index cdd9b634bd..4d083ecd12 100644 --- a/Marlin/src/pins/teensy2/pins_SAV_MKI.h +++ b/Marlin/src/pins/teensy2/pins_SAV_MKI.h @@ -62,7 +62,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#ifndef __AVR_AT90USB1286__ +#if NOT_TARGET(__AVR_AT90USB1286__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy2/pins_TEENSY2.h b/Marlin/src/pins/teensy2/pins_TEENSY2.h index 9ef31e84ba..4efd83d9bc 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSY2.h +++ b/Marlin/src/pins/teensy2/pins_TEENSY2.h @@ -107,7 +107,7 @@ * E DIR 35 a7 a3 31 Y DIR */ -#ifndef __AVR_AT90USB1286__ +#if NOT_TARGET(__AVR_AT90USB1286__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index c69a1c06a7..09bbeebdd8 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -73,7 +73,7 @@ * The pin assignments in this file match the silkscreen. */ -#if !defined(__AVR_AT90USB1286__) && !defined(__AVR_AT90USB1286P__) +#if NOT_TARGET(__AVR_AT90USB1286__, __AVR_AT90USB1286P__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h index 863137e9c8..18d158295a 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h @@ -27,7 +27,7 @@ * https://www.pjrc.com/teensy/teensyduino.html */ -#if !IS_32BIT_TEENSY +#if NOT_TARGET(IS_32BIT_TEENSY) #error "Oops! Select 'Teensy 3.1' or 'Teensy 3.2' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h index 02d8374f23..6de50f0991 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h @@ -27,7 +27,7 @@ * https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ -#if !IS_32BIT_TEENSY +#if NOT_TARGET(IS_32BIT_TEENSY) #error "Oops! Select 'Teensy 3.5' or 'Teensy 3.6' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h index 1541bfbd62..b985d0bd9c 100644 --- a/Marlin/src/pins/teensy4/pins_T41U5XBB.h +++ b/Marlin/src/pins/teensy4/pins_T41U5XBB.h @@ -27,7 +27,7 @@ * https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ -#if !IS_32BIT_TEENSY || !IS_TEENSY41 +#if NOT_TARGET(IS_32BIT_TEENSY) || NOT_TARGET(IS_TEENSY41) #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" #else #define BOARD_INFO_NAME "Teensy4.1" @@ -42,7 +42,7 @@ GND |-----#####-----| VIN (3.65 TO 5.5V) RX1 CS1 RX1 PWM 0 | ##### | GND TX1 MISO1 TX1 PWM 1 | | 3.3V - STPX PWM 2 | | 23 A9 PWM + STPX PWM 2 | | 23 A9 PWM DIRX PWM 3 | | 22 A8 PWM LIMZ STPY PWM 4 | | 21 A7 RX5 LIMY DIRY PWM 5 | | 20 A6 TX5 LIMX @@ -58,13 +58,13 @@ SDA PWM 25 | | 40 A16 STENY STPB MOSI1 26 | | 39 A15 MISO1 STENZ DIRB SCK1 27 | * * * * * | 38 A14 STENA - LIMB RX7 PWM 28 | | 37 PWM STENB + LIMB RX7 PWM 28 | | 37 PWM STENB DOOR TX7 PWM 29 | | 36 PWM ST0 ST1 30 | | 35 TX8 ST3 AUX0 31 | SDCARD | 34 RX8 ST2 AUX1 32 |_______________| 33 PWM AUX2 - + */ // diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h index 08a3f5e0d1..c06fdc83e8 100644 --- a/Marlin/src/pins/teensy4/pins_TEENSY41.h +++ b/Marlin/src/pins/teensy4/pins_TEENSY41.h @@ -27,7 +27,7 @@ * https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ -#if !IS_32BIT_TEENSY || !IS_TEENSY41 +#if NOT_TARGET(IS_32BIT_TEENSY) || NOT_TARGET(IS_TEENSY41) #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" #else #define BOARD_INFO_NAME "Teensy4.1" @@ -44,27 +44,27 @@ X_DIR_PIN MISO1 TX1 PWM 1 | | 3.3V Y_STEP_PIN PWM 2 | | 23 A9 PWM SERVO1_PIN Y_DIR_PIN PWM 3 | | 22 A8 PWM SERVO0_PIN - Z_STEP_PIN PWM 4 | | 21 A7 RX5 + Z_STEP_PIN PWM 4 | | 21 A7 RX5 Z_DIR_PIN PWM 5 | | 20 A6 TX5 FILWIDTH_PIN - X_ENABLE_PIN PWM 6 | | 19 A5 PWM SCL0 + X_ENABLE_PIN PWM 6 | | 19 A5 PWM SCL0 Y_ENABLE_PIN RX2 PWM 7 | | 18 A4 PWM SDA0 HEATER_1_PIN - Z_ENABLE_PIN TX2 PWM 8 | | 17 A3 RX4 SDA1 + Z_ENABLE_PIN TX2 PWM 8 | | 17 A3 RX4 SDA1 E0_STEP_PIN PWM 9 | | 16 A2 TX4 SCL1 TEMP_0_PIN E0_DIR_PIN PWM 10 | | 15 A1 PWM RX3 TEMP_BED_PIN MOSI_PIN MOSI0 PWM 11 | | 14 A0 PWM TX3 TEMP_1_PIN MISO_PIN MISO0 PWM 12 | | 13 LED PWM SCK0 SCK_PIN 3.3V | | GND - Z_STOP_PIN PWM 24 | | 41 A17 - E0_ENABLE_PIN PWM 25 | | 40 A16 + Z_STOP_PIN PWM 24 | | 41 A17 + E0_ENABLE_PIN PWM 25 | | 40 A16 FAN_PIN MOSI1 26 | | 39 A15 MISO1 X_STOP_PIN Z-PROBE PWR SCK1 27 | * * * * * | 38 A14 Y_STOP_PIN - SOL1_PIN RX7 PWM 28 | | 37 PWM HEATER_0_PIN + SOL1_PIN RX7 PWM 28 | | 37 PWM HEATER_0_PIN FAN_PIN TX7 PWM 29 | | 36 PWM HEATER_BED_PIN X_CS_PIN 30 | | 35 TX8 E1_ENABLE_PIN y_CS_PIN 31 | SDCARD | 34 RX8 E1_DIR_PIN Z_CS_PIN 32 |_______________| 33 PWM E1_STEP_PIN - + */ // diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py new file mode 100644 index 0000000000..2b1b948119 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py @@ -0,0 +1,16 @@ +# +# common-dependencies-post.py +# Convenience script to add build flags for Marlin Enabled Features +# + +Import("env") +Import("projenv") + +def apply_board_build_flags(): + if not 'BOARD_CUSTOM_BUILD_FLAGS' in env['MARLIN_FEATURES']: + return + projenv.Append(CCFLAGS=env['MARLIN_FEATURES']['BOARD_CUSTOM_BUILD_FLAGS'].split()) + +# We need to add the board build flags in a post script +# so the platform build script doesn't overwrite the custom CCFLAGS +apply_board_build_flags() diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index e88e74e81d..344dce9f13 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -149,3 +149,6 @@ #define HAS_MENU_UBL #endif #endif + +// Include pins for the current board. Platform tests will be skipped. No HAL-defined pins. +#include "../../../../Marlin/src/pins/pins.h" diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index def3bf40c2..6005855156 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -238,7 +238,7 @@ def load_marlin_features(): else: cmd += ['-D' + s] - cmd += ['-w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] + cmd += ['-D__MARLIN_PREBUILD__ -w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] cmd = ' '.join(cmd) blab(cmd) define_list = subprocess.check_output(cmd, shell=True).splitlines() diff --git a/platformio.ini b/platformio.ini index c68daf2c71..f8ec029de3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -184,6 +184,7 @@ default_src_filter = + - - + extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py + post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants lib_deps = From 632ac54440194b52830d4bb85af93c8e1298ab43 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 23 Sep 2020 13:07:34 -0700 Subject: [PATCH 0278/1370] MKS Robin Mini uses ONBOARD_SPI_DEVICE (#19460) --- Marlin/src/HAL/STM32F1/onboard_sd.cpp | 16 ++++++++-------- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 2 +- .../pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 2 +- Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 1 + 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.cpp b/Marlin/src/HAL/STM32F1/onboard_sd.cpp index 099e2a0686..0440db9438 100644 --- a/Marlin/src/HAL/STM32F1/onboard_sd.cpp +++ b/Marlin/src/HAL/STM32F1/onboard_sd.cpp @@ -21,23 +21,23 @@ #include "fastio.h" #if HAS_SHARED_MEDIA - #ifndef ON_BOARD_SPI_DEVICE - #define ON_BOARD_SPI_DEVICE SPI_DEVICE + #ifndef ONBOARD_SPI_DEVICE + #define ONBOARD_SPI_DEVICE SPI_DEVICE #endif #define ONBOARD_SD_SPI SPI #else - SPIClass OnBoardSPI(ON_BOARD_SPI_DEVICE); - #define ONBOARD_SD_SPI OnBoardSPI + SPIClass OnboardSPI(ONBOARD_SPI_DEVICE); + #define ONBOARD_SD_SPI OnboardSPI #endif -#if ON_BOARD_SPI_DEVICE == 1 +#if ONBOARD_SPI_DEVICE == 1 #define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_4 #else #define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_2 #endif -#define CS_LOW() WRITE(ONBOARD_SD_CS_PIN, LOW) /* Set OnBoardSPI cs low */ -#define CS_HIGH() WRITE(ONBOARD_SD_CS_PIN, HIGH) /* Set OnBoardSPI cs high */ +#define CS_LOW() WRITE(ONBOARD_SD_CS_PIN, LOW) /* Set OnboardSPI cs low */ +#define CS_HIGH() WRITE(ONBOARD_SD_CS_PIN, HIGH) /* Set OnboardSPI cs high */ #define FCLK_FAST() ONBOARD_SD_SPI.setClockDivider(SPI_CLOCK_MAX) #define FCLK_SLOW() ONBOARD_SD_SPI.setClockDivider(SPI_BAUD_PCLK_DIV_256) @@ -152,7 +152,7 @@ static int select() { /* 1:OK, 0:Timeout */ /*-----------------------------------------------------------------------*/ static void power_on() { /* Enable SSP module and attach it to I/O pads */ - ONBOARD_SD_SPI.setModule(ON_BOARD_SPI_DEVICE); + ONBOARD_SD_SPI.setModule(ONBOARD_SPI_DEVICE); ONBOARD_SD_SPI.begin(); ONBOARD_SD_SPI.setBitOrder(MSBFIRST); ONBOARD_SD_SPI.setDataMode(SPI_MODE0); diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index e4f8e614bb..f018a40c3e 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -288,5 +288,5 @@ #error "SD CUSTOM_CABLE is not compatible with SKR E3 DIP." #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ONBOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 85c5f646d9..4f03d3bbd7 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -236,5 +236,5 @@ #error "SD CUSTOM_CABLE is not compatible with SKR Mini E3." #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ONBOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index 09dff2ef30..aaecc05442 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -213,5 +213,5 @@ #define MOSI_PIN PA7 #define SS_PIN PA4 #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ONBOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index 420ffc631f..e67a6d3b1b 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -173,7 +173,7 @@ #define SS_PIN PA4 #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ONBOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for SD-NAND #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index c1f1e315df..eb910dd846 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -150,7 +150,7 @@ // #define SD_DETECT_PIN PC7 #define SDCARD_CONNECTION ONBOARD -#define ON_BOARD_SPI_DEVICE 1 +#define ONBOARD_SPI_DEVICE 1 #define ONBOARD_SD_CS_PIN PA4 // SDSS #define SDIO_SUPPORT #define NO_SD_HOST_DRIVE // This board's SD is only seen by the printer diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index a7e6a6e227..b159ae3f4c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -126,6 +126,7 @@ #define SDIO_SUPPORT #define SDIO_CLOCK 4500000 // 4.5 MHz #define SD_DETECT_PIN PD12 +#define ONBOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PC11 // From 8b69d697ddcd92adec8c5ab7a81ab95a9773f234 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Sep 2020 15:33:54 -0500 Subject: [PATCH 0279/1370] Teensy pins cleanup --- Marlin/src/pins/teensy3/pins_TEENSY31_32.h | 11 +-- Marlin/src/pins/teensy3/pins_TEENSY35_36.h | 100 ++++++++++----------- Marlin/src/pins/teensy4/pins_T41U5XBB.h | 83 +++++++++-------- Marlin/src/pins/teensy4/pins_TEENSY41.h | 86 +++++++++--------- 4 files changed, 135 insertions(+), 145 deletions(-) diff --git a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h index 18d158295a..b98c78fde1 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h @@ -35,9 +35,6 @@ #define BOARD_INFO_NAME "Teensy3.2" #endif -#define AT90USB 1286 // Disable MarlinSerial etc. -#define USBCON //1286 // Disable MarlinSerial etc. - // // Limit Switches // @@ -92,20 +89,14 @@ // // Misc. Functions // - -//#define SDSS 16 // 8 #define LED_PIN 13 - //#define SOL1_PIN 28 +//#define SDSS 16 // 8 // // LCD / Controller // -//#define SCK_PIN 13 -//#define MISO_PIN 12 -//#define MOSI_PIN 11 - /* #if HAS_SPI_LCD #define LCD_PINS_RS 40 diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h index 6de50f0991..961dc0cff0 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h @@ -37,48 +37,44 @@ #define BOARD_INFO_NAME "Teensy3.6" #endif -#define AT90USB 1286 // Disable MarlinSerial etc. -#define USBCON //1286 // Disable MarlinSerial etc. -/* - - teemuatlut plan for Teensy3.5 and Teensy3.6: - USB - GND |-----#####-----| VIN 5V - X_STEP_PIN MOSI1 RX1 0 | ##### | Analog GND - X_DIR_PIN MISO1 TX1 1 | | 3.3V - Y_STEP_PIN PWM 2 | *NC AREF* | 23 A9 PWM - Y_DIR_PIN SCL2 CAN0TX PWM 3 | *A26 A10* | 22 A8 PWM - Z_STEP_PIN SDA2 CAN0RX PWM 4 | *A25 A11* | 21 A7 PWM CS0 MOSI1 RX1 - Z_DIR_PIN MISO1 TX1 PWM 5 | *GND * * 57 | 20 A6 PWM CS0 SCK1 FILWIDTH_PIN - X_ENABLE_PIN PWM 6 | *GND * * 56 | 19 A5 SCL0 E0_STEP_PIN - Y_ENABLE_PIN SCL0 MOSI0 RX3 PWM 7 | * * 55 | 18 A4 SDA0 E0_DIR_PIN - Z_ENABLE_PIN SDA0 MISO0 TX3 PWM 8 | * * 54 | 17 A3 SDA0 E0_ENABLE_PIN - CS0 RX2 PWM 9 | | 16 A2 SCL0 TEMP_0_PIN - CS0 TX2 PWM 10 | | 15 A1 CS0 TEMP_BED_PIN - X_STOP_PIN MOSI0 11 | | 14 A0 PWM CS0 TEMP_1_PIN - Y_STOP_PIN MISO0 12 | | 13 LED SCK0 LED_PIN - 3.3V | | GND - Z_STOP_PIN 24 | 40 * * 53 | A22 DAC1 -AUX2 25 | 41 * * 52 | A21 DAC0 -AUX2 FAN_PIN SCL2 TX1 26 | 42 * * 51 | 39 A20 MISO0 SDSS -AUX2 Z-PROBE PWR SCK0 RX1 27 | * * * * * | 38 A19 PWM SDA1 -AUX2 SOL1_PIN MOSI0 28 | 43 * * 50 | 37 A18 PWM SCL1 -D10 CONTROLLER_FAN_PIN CAN0TX PWM 29 | 44 * * 49 | 36 A17 PWM -D9 HEATER_0_PIN CAN0RX PWM 30 | 45 * * 48 | 35 A16 PWM E1_ENABLE_PIN -D8 HEATER_BED_PIN CS1 RX4 A12 31 | 46 * * 47 | 34 A15 PWM SDA0 RX5 E1_DIR_PIN - SCK1 TX4 A13 32 |__GND_*_*_3.3V_| 33 A14 PWM SCL0 TX5 E1_STEP_PIN - - Interior pins: - LCD_PINS_RS 40 * * 53 SCK2 - LCD_PINS_ENABLE 41 * * 52 MOSI2 - LCD_PINS_D4 42 * * 51 MISO2 - LCD_PINS_D5 CS2 43 * * 50 A24 - LCD_PINS_D6 MOSI2 44 * * 49 A23 - LCD_PINS_D7 MISO2 45 * * 48 TX6 SDA0 BTN_ENC - BTN_EN1 SCK2 46 * * 47 RX6 SCL0 BTN_EN2 - GND * * 3.3V - -*/ +/** + * Plan for Teensy 3.5 and Teensy 3.6: + * USB + * GND |-----#####-----| VIN 5V + * X_STEP_PIN MOSI1 RX1 0 | ##### | Analog GND + * X_DIR_PIN MISO1 TX1 1 | | 3.3V + * Y_STEP_PIN PWM 2 | *NC AREF* | 23 A9 PWM + * Y_DIR_PIN SCL2 CAN0TX PWM 3 | *A26 A10* | 22 A8 PWM + * Z_STEP_PIN SDA2 CAN0RX PWM 4 | *A25 A11* | 21 A7 PWM CS0 MOSI1 RX1 + * Z_DIR_PIN MISO1 TX1 PWM 5 | *GND * * 57 | 20 A6 PWM CS0 SCK1 FILWIDTH_PIN + * X_ENABLE_PIN PWM 6 | *GND * * 56 | 19 A5 SCL0 E0_STEP_PIN + * Y_ENABLE_PIN SCL0 MOSI0 RX3 PWM 7 | * * 55 | 18 A4 SDA0 E0_DIR_PIN + * Z_ENABLE_PIN SDA0 MISO0 TX3 PWM 8 | * * 54 | 17 A3 SDA0 E0_ENABLE_PIN + * CS0 RX2 PWM 9 | | 16 A2 SCL0 TEMP_0_PIN + * CS0 TX2 PWM 10 | | 15 A1 CS0 TEMP_BED_PIN + * X_STOP_PIN MOSI0 11 | | 14 A0 PWM CS0 TEMP_1_PIN + * Y_STOP_PIN MISO0 12 | | 13 LED SCK0 LED_PIN + * 3.3V | | GND + * Z_STOP_PIN 24 | 40 * * 53 | A22 DAC1 + * AUX2 25 | 41 * * 52 | A21 DAC0 + * AUX2 FAN_PIN SCL2 TX1 26 | 42 * * 51 | 39 A20 MISO0 SDSS + * AUX2 Z-PROBE PWR SCK0 RX1 27 | * * * * * | 38 A19 PWM SDA1 + * AUX2 SOL1_PIN MOSI0 28 | 43 * * 50 | 37 A18 PWM SCL1 + * D10 CONTROLLER_FAN_PIN CAN0TX PWM 29 | 44 * * 49 | 36 A17 PWM + * D9 HEATER_0_PIN CAN0RX PWM 30 | 45 * * 48 | 35 A16 PWM E1_ENABLE_PIN + * D8 HEATER_BED_PIN CS1 RX4 A12 31 | 46 * * 47 | 34 A15 PWM SDA0 RX5 E1_DIR_PIN + * SCK1 TX4 A13 32 |__GND_*_*_3.3V_| 33 A14 PWM SCL0 TX5 E1_STEP_PIN + * + * Interior pins: + * LCD_PINS_RS 40 * * 53 SCK2 + * LCD_PINS_ENABLE 41 * * 52 MOSI2 + * LCD_PINS_D4 42 * * 51 MISO2 + * LCD_PINS_D5 CS2 43 * * 50 A24 + * LCD_PINS_D6 MOSI2 44 * * 49 A23 + * LCD_PINS_D7 MISO2 45 * * 48 TX6 SDA0 BTN_ENC + * BTN_EN1 SCK2 46 * * 47 RX6 SCL0 BTN_EN2 + * GND * * 3.3V + */ // // Limit Switches @@ -121,24 +117,18 @@ D8 HEATER_BED_PIN CS1 RX4 A12 31 | 46 * * 47 | 34 A15 PWM #define TEMP_1_PIN 0 #define TEMP_BED_PIN 1 // Bed / Analog pin numbering -#define SDSS 39 // 8 +// +// Misc. Functions +// #define LED_PIN 13 #define PS_ON_PIN 1 -#define ALARM_PIN -1 - #define FILWIDTH_PIN 6 #define SOL1_PIN 28 -#if 0 -// Pretty sure this is obsolete! -// Please use Marlin 1.1.x pins files as reference for new pins files. -#ifndef SDSUPPORT - // these are defined in the SD library if building with SD support - #define SCK_PIN 13 - #define MISO_PIN 12 - #define MOSI_PIN 11 -#endif -#endif +// +// SD Card +// +#define SDSS 39 // 8 #if HAS_SPI_LCD #define LCD_PINS_RS 40 diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h index b985d0bd9c..cb4c0ea879 100644 --- a/Marlin/src/pins/teensy4/pins_T41U5XBB.h +++ b/Marlin/src/pins/teensy4/pins_T41U5XBB.h @@ -33,39 +33,44 @@ #define BOARD_INFO_NAME "Teensy4.1" #endif -#define AT90USB 1286 // Disable MarlinSerial etc. -#define USBCON //1286 // Disable MarlinSerial etc. -/* +/** + * Plan for Teensy 4.0 and Teensy 4.1: + * USB + * GND |-----#####-----| VIN (3.65 TO 5.5V) + * RX1 CS1 RX1 PWM 0 | ##### | GND + * TX1 MISO1 TX1 PWM 1 | | 3.3V + * STPX PWM 2 | | 23 A9 PWM + * DIRX PWM 3 | | 22 A8 PWM LIMZ + * STPY PWM 4 | | 21 A7 RX5 LIMY + * DIRY PWM 5 | | 20 A6 TX5 LIMX + * STPZ PWM 6 | | 19 A5 PWM SCL0 COOL + * DIRZ RX2 PWM 7 | | 18 A4 PWM SDA0 MIST + * STPA TX2 PWM 8 | | 17 A3 RX4 SDA1 CYST + * DIRA PWM 9 | | 16 A2 TX4 SCL1 EHOLD + * STEN PWM 10 | | 15 A1 PWM RX3 PRB + * SPDI MOSI0 PWM 11 | | 14 A0 PWM TX3 PANIC + * SPEN MISO0 PWM 12 | | 13 LED PWM SCK0 SPWM + * 3.3V | | GND + * SCL PWM 24 | | 41 A17 KPSTR + * SDA PWM 25 | | 40 A16 STENY + * STPB MOSI1 26 | | 39 A15 MISO1 STENZ + * DIRB SCK1 27 | * * * * * | 38 A14 STENA + * LIMB RX7 PWM 28 | | 37 PWM STENB + * DOOR TX7 PWM 29 | | 36 PWM ST0 + * ST1 30 | | 35 TX8 ST3 + * AUX0 31 | SDCARD | 34 RX8 ST2 + * AUX1 32 |_______________| 33 PWM AUX2 + */ - plan for Teensy4.0 and Teensy4.1: - USB - GND |-----#####-----| VIN (3.65 TO 5.5V) - RX1 CS1 RX1 PWM 0 | ##### | GND - TX1 MISO1 TX1 PWM 1 | | 3.3V - STPX PWM 2 | | 23 A9 PWM - DIRX PWM 3 | | 22 A8 PWM LIMZ - STPY PWM 4 | | 21 A7 RX5 LIMY - DIRY PWM 5 | | 20 A6 TX5 LIMX - STPZ PWM 6 | | 19 A5 PWM SCL0 COOL - DIRZ RX2 PWM 7 | | 18 A4 PWM SDA0 MIST - STPA TX2 PWM 8 | | 17 A3 RX4 SDA1 CYST - DIRA PWM 9 | | 16 A2 TX4 SCL1 EHOLD - STEN PWM 10 | | 15 A1 PWM RX3 PRB - SPDI MOSI0 PWM 11 | | 14 A0 PWM TX3 PANIC - SPEN MISO0 PWM 12 | | 13 LED PWM SCK0 SPWM - 3.3V | | GND - SCL PWM 24 | | 41 A17 KPSTR - SDA PWM 25 | | 40 A16 STENY - STPB MOSI1 26 | | 39 A15 MISO1 STENZ - DIRB SCK1 27 | * * * * * | 38 A14 STENA - LIMB RX7 PWM 28 | | 37 PWM STENB - DOOR TX7 PWM 29 | | 36 PWM ST0 - ST1 30 | | 35 TX8 ST3 - AUX0 31 | SDCARD | 34 RX8 ST2 - AUX1 32 |_______________| 33 PWM AUX2 +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif - -*/ +// +// Servos +// +#define SERVO0_PIN 24 +#define SERVO1_PIN 25 // // Limit Switches @@ -100,20 +105,22 @@ #define E1_DIR_PIN 27 #define E1_ENABLE_PIN 37 +// +// Heaters / Fans +// #define HEATER_0_PIN 31 #define HEATER_1_PIN 32 #define HEATER_BED_PIN 33 +// +// Temperature Sensors +// #define TEMP_0_PIN 5 // Extruder / Analog pin numbering: 2 => A2 #define TEMP_1_PIN 4 #define TEMP_BED_PIN 15 // Bed / Analog pin numbering +// +// Misc. Functions +// #define LED_PIN 13 - #define SOL0_PIN 17 -#define SERVO0_PIN 24 -#define SERVO1_PIN 25 - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h index c06fdc83e8..cc7341bc23 100644 --- a/Marlin/src/pins/teensy4/pins_TEENSY41.h +++ b/Marlin/src/pins/teensy4/pins_TEENSY41.h @@ -33,39 +33,40 @@ #define BOARD_INFO_NAME "Teensy4.1" #endif -#define AT90USB 1286 // Disable MarlinSerial etc. -#define USBCON //1286 // Disable MarlinSerial etc. -/* +/** + * Plan for Teensy 4.0 and Teensy 4.1: + * USB + * GND |-----#####-----| VIN (3.65 TO 5.5V) + * X_STEP_PIN CS1 RX1 PWM 0 | ##### | GND + * X_DIR_PIN MISO1 TX1 PWM 1 | | 3.3V + * Y_STEP_PIN PWM 2 | | 23 A9 PWM SERVO1_PIN + * Y_DIR_PIN PWM 3 | | 22 A8 PWM SERVO0_PIN + * Z_STEP_PIN PWM 4 | | 21 A7 RX5 + * Z_DIR_PIN PWM 5 | | 20 A6 TX5 FILWIDTH_PIN + * X_ENABLE_PIN PWM 6 | | 19 A5 PWM SCL0 + * Y_ENABLE_PIN RX2 PWM 7 | | 18 A4 PWM SDA0 HEATER_1_PIN + * Z_ENABLE_PIN TX2 PWM 8 | | 17 A3 RX4 SDA1 + * E0_STEP_PIN PWM 9 | | 16 A2 TX4 SCL1 TEMP_0_PIN + * E0_DIR_PIN PWM 10 | | 15 A1 PWM RX3 TEMP_BED_PIN + * MOSI_PIN MOSI0 PWM 11 | | 14 A0 PWM TX3 TEMP_1_PIN + * MISO_PIN MISO0 PWM 12 | | 13 LED PWM SCK0 SCK_PIN + * 3.3V | | GND + * Z_STOP_PIN PWM 24 | | 41 A17 + * E0_ENABLE_PIN PWM 25 | | 40 A16 + * FAN_PIN MOSI1 26 | | 39 A15 MISO1 X_STOP_PIN + * Z-PROBE PWR SCK1 27 | * * * * * | 38 A14 Y_STOP_PIN + * SOL1_PIN RX7 PWM 28 | | 37 PWM HEATER_0_PIN + * FAN_PIN TX7 PWM 29 | | 36 PWM HEATER_BED_PIN + * X_CS_PIN 30 | | 35 TX8 E1_ENABLE_PIN + * y_CS_PIN 31 | SDCARD | 34 RX8 E1_DIR_PIN + * Z_CS_PIN 32 |_______________| 33 PWM E1_STEP_PIN + */ - plan for Teensy4.0 and Teensy4.1: - USB - GND |-----#####-----| VIN (3.65 TO 5.5V) - X_STEP_PIN CS1 RX1 PWM 0 | ##### | GND - X_DIR_PIN MISO1 TX1 PWM 1 | | 3.3V - Y_STEP_PIN PWM 2 | | 23 A9 PWM SERVO1_PIN - Y_DIR_PIN PWM 3 | | 22 A8 PWM SERVO0_PIN - Z_STEP_PIN PWM 4 | | 21 A7 RX5 - Z_DIR_PIN PWM 5 | | 20 A6 TX5 FILWIDTH_PIN - X_ENABLE_PIN PWM 6 | | 19 A5 PWM SCL0 - Y_ENABLE_PIN RX2 PWM 7 | | 18 A4 PWM SDA0 HEATER_1_PIN - Z_ENABLE_PIN TX2 PWM 8 | | 17 A3 RX4 SDA1 - E0_STEP_PIN PWM 9 | | 16 A2 TX4 SCL1 TEMP_0_PIN - E0_DIR_PIN PWM 10 | | 15 A1 PWM RX3 TEMP_BED_PIN - MOSI_PIN MOSI0 PWM 11 | | 14 A0 PWM TX3 TEMP_1_PIN - MISO_PIN MISO0 PWM 12 | | 13 LED PWM SCK0 SCK_PIN - 3.3V | | GND - Z_STOP_PIN PWM 24 | | 41 A17 - E0_ENABLE_PIN PWM 25 | | 40 A16 - FAN_PIN MOSI1 26 | | 39 A15 MISO1 X_STOP_PIN - Z-PROBE PWR SCK1 27 | * * * * * | 38 A14 Y_STOP_PIN - SOL1_PIN RX7 PWM 28 | | 37 PWM HEATER_0_PIN - FAN_PIN TX7 PWM 29 | | 36 PWM HEATER_BED_PIN - X_CS_PIN 30 | | 35 TX8 E1_ENABLE_PIN - y_CS_PIN 31 | SDCARD | 34 RX8 E1_DIR_PIN - Z_CS_PIN 32 |_______________| 33 PWM E1_STEP_PIN - - -*/ +// +// Servos +// +#define SERVO0_PIN 22 +#define SERVO1_PIN 23 // // Limit Switches @@ -100,6 +101,9 @@ #define E1_DIR_PIN 34 #define E1_ENABLE_PIN 35 +// +// Heaters / Fans +// #define HEATER_0_PIN 37 #define HEATER_1_PIN 18 #define HEATER_BED_PIN 36 @@ -107,22 +111,20 @@ #define FAN_PIN 29 #endif +// +// Temperature Sensors +// #define TEMP_0_PIN 2 // Extruder / Analog pin numbering: 2 => A2 #define TEMP_1_PIN 0 #define TEMP_BED_PIN 1 // Bed / Analog pin numbering +// +// Misc. Functions +// #define LED_PIN 13 -//#define PS_ON_PIN 1 -//#define ALARM_PIN -1 - -//#define FILWIDTH_PIN 6 // A6 #define SOL0_PIN 28 -#define SERVO0_PIN 22 -#define SERVO1_PIN 23 - -//#define SCK_PIN 13 -//#define MISO_PIN 12 -//#define MOSI_PIN 11 +//#define PS_ON_PIN 1 +//#define FILWIDTH_PIN 6 // A6 #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD From cbaba010f2e16fa2f4e6ff0bd6e9b43d97599b0c Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 24 Sep 2020 08:44:15 +1200 Subject: [PATCH 0280/1370] Preserve brightness in EEPROM validate (#19485) Co-authored-by: Scott Lahteine --- Marlin/src/module/settings.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 6608b40332..0fc23099cc 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1804,10 +1804,11 @@ void MarlinSettings::postprocess() { // { _FIELD_TEST(lcd_contrast); - int16_t lcd_contrast; EEPROM_READ(lcd_contrast); - TERN_(HAS_LCD_CONTRAST, ui.set_contrast(lcd_contrast)); + if (!validating) { + TERN_(HAS_LCD_CONTRAST, ui.set_contrast(lcd_contrast)); + } } // From a3a5b334c488b4c5ae196757094c80a35bf28c13 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 24 Sep 2020 09:03:07 +1200 Subject: [PATCH 0281/1370] Define UART pins for LPC debug based on LPC_PINCFG_UART (#19475) --- Marlin/src/HAL/AVR/fastio.h | 16 ++++--- Marlin/src/HAL/AVR/pinsDebug.h | 4 +- Marlin/src/pins/pinsDebug.h | 82 ++++++++++++++++++++++++---------- 3 files changed, 73 insertions(+), 29 deletions(-) diff --git a/Marlin/src/HAL/AVR/fastio.h b/Marlin/src/HAL/AVR/fastio.h index bd6935aaf0..dd01634661 100644 --- a/Marlin/src/HAL/AVR/fastio.h +++ b/Marlin/src/HAL/AVR/fastio.h @@ -29,11 +29,17 @@ #include -#define AVR_AT90USB1286_FAMILY (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__)) -#define AVR_ATmega1284_FAMILY (defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)) -#define AVR_ATmega2560_FAMILY (defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)) -#define AVR_ATmega2561_FAMILY (defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)) -#define AVR_ATmega328_FAMILY (defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)) +#if defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__) + #define AVR_AT90USB1286_FAMILY 1 +#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__) + #define AVR_ATmega1284_FAMILY 1 +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #define AVR_ATmega2560_FAMILY 1 +#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + #define AVR_ATmega2561_FAMILY 1 +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) + #define AVR_ATmega328_FAMILY 1 +#endif /** * Include Ports and Functions diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h index d73f520d14..2cf740a559 100644 --- a/Marlin/src/HAL/AVR/pinsDebug.h +++ b/Marlin/src/HAL/AVR/pinsDebug.h @@ -26,7 +26,9 @@ #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define AVR_ATmega2560_FAMILY_PLUS_70 MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H) +#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H) + #define AVR_ATmega2560_FAMILY_PLUS_70 1 +#endif #if AVR_AT90USB1286_FAMILY diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index 0766d818e7..06a8144291 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -45,7 +45,7 @@ #line 46 // manually add pins that have names that are macros which don't play well with these macros -#if (AVR_ATmega2560_FAMILY || AVR_ATmega1284_FAMILY || defined(ARDUINO_ARCH_SAM) || defined(TARGET_LPC1768)) +#if ANY(AVR_ATmega2560_FAMILY, AVR_ATmega1284_FAMILY, ARDUINO_ARCH_SAM, TARGET_LPC1768) #if SERIAL_PORT == 0 static const char RXD_NAME_0[] PROGMEM = { "RXD0" }; static const char TXD_NAME_0[] PROGMEM = { "TXD0" }; @@ -110,83 +110,119 @@ const PinInfo pin_array[] PROGMEM = { // manually add pins ... #if SERIAL_PORT == 0 - #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_0, 0, true }, { TXD_NAME_0, 1, true }, #elif AVR_ATmega1284_FAMILY { RXD_NAME_0, 8, true }, { TXD_NAME_0, 9, true }, - #elif defined(TARGET_LPC1768) + #elif defined(TARGET_LPC1768) // TX P0_02 RX P0_03 { RXD_NAME_0, 3, true }, { TXD_NAME_0, 2, true }, #endif #elif SERIAL_PORT == 1 - #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_1, 19, true }, { TXD_NAME_1, 18, true }, #elif AVR_ATmega1284_FAMILY { RXD_NAME_1, 10, true }, { TXD_NAME_1, 11, true }, #elif defined(TARGET_LPC1768) - { RXD_NAME_1, 16, true }, - { TXD_NAME_1, 15, true }, + #ifdef LPC_PINCFG_UART1_P2_00 // TX P2_00 RX P2_01 + { RXD_NAME_1, 0x41, true }, + { TXD_NAME_1, 0x40, true }, + #else // TX P0_15 RX P0_16 + { RXD_NAME_1, 16, true }, + { TXD_NAME_1, 15, true }, + #endif #endif #elif SERIAL_PORT == 2 - #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_2, 17, true }, { TXD_NAME_2, 16, true }, #elif defined(TARGET_LPC1768) - { RXD_NAME_2, 11, true }, - { TXD_NAME_2, 10, true }, + #ifdef LPC_PINCFG_UART2_P2_08 // TX P2_08 RX P2_09 + { RXD_NAME_2, 0x49, true }, + { TXD_NAME_2, 0x48, true }, + #else // TX P0_10 RX P0_11 + { RXD_NAME_2, 11, true }, + { TXD_NAME_2, 10, true }, + #endif #endif #elif SERIAL_PORT == 3 - #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_3, 15, true }, { TXD_NAME_3, 14, true }, #elif defined(TARGET_LPC1768) - { RXD_NAME_3, 1, true }, - { TXD_NAME_3, 0, true }, + #ifdef LPC_PINCFG_UART3_P0_25 // TX P0_25 RX P0_26 + { RXD_NAME_3, 0x1A, true }, + { TXD_NAME_3, 0x19, true }, + #elif defined(LPC_PINCFG_UART3_P4_28) // TX P4_28 RX P4_29 + { RXD_NAME_3, 0x9D, true }, + { TXD_NAME_3, 0x9C, true }, + #else // TX P0_00 RX P0_01 + { RXD_NAME_3, 1, true }, + { TXD_NAME_3, 0, true }, + #endif #endif #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == 0 - #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_0, 0, true }, { TXD_NAME_0, 1, true }, #elif AVR_ATmega1284_FAMILY { RXD_NAME_0, 8, true }, { TXD_NAME_0, 9, true }, - #elif defined(TARGET_LPC1768) + #elif defined(TARGET_LPC1768) // TX P0_02 RX P0_03 { RXD_NAME_0, 3, true }, { TXD_NAME_0, 2, true }, #endif #elif SERIAL_PORT_2 == 1 - #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_1, 19, true }, { TXD_NAME_1, 18, true }, #elif AVR_ATmega1284_FAMILY { RXD_NAME_1, 10, true }, { TXD_NAME_1, 11, true }, #elif defined(TARGET_LPC1768) - { RXD_NAME_1, 16, true }, - { TXD_NAME_1, 15, true }, + #ifdef LPC_PINCFG_UART1_P2_00 // TX P2_00 RX P2_01 + { RXD_NAME_1, 0x41, true }, + { TXD_NAME_1, 0x40, true }, + #else // TX P0_15 RX P0_16 + { RXD_NAME_1, 16, true }, + { TXD_NAME_1, 15, true }, + #endif #endif #elif SERIAL_PORT_2 == 2 - #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_2, 17, true }, { TXD_NAME_2, 16, true }, #elif defined(TARGET_LPC1768) - { RXD_NAME_2, 11, true }, - { TXD_NAME_2, 10, true }, + #ifdef LPC_PINCFG_UART2_P2_08 // TX P2_08 RX P2_09 + { RXD_NAME_2, 0x49, true }, + { TXD_NAME_2, 0x48, true }, + #else // TX P0_10 RX P0_11 + { RXD_NAME_2, 11, true }, + { TXD_NAME_2, 10, true }, + #endif #endif #elif SERIAL_PORT_2 == 3 - #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_3, 15, true }, { TXD_NAME_3, 14, true }, #elif defined(TARGET_LPC1768) - { RXD_NAME_3, 1, true }, - { TXD_NAME_3, 0, true }, + #ifdef LPC_PINCFG_UART3_P0_25 // TX P0_25 RX P0_26 + { RXD_NAME_3, 0x1A, true }, + { TXD_NAME_3, 0x19, true }, + #elif defined(LPC_PINCFG_UART3_P4_28) // TX P4_28 RX P4_29 + { RXD_NAME_3, 0x9D, true }, + { TXD_NAME_3, 0x9C, true }, + #else // TX P0_00 RX P0_01 + { RXD_NAME_3, 1, true }, + { TXD_NAME_3, 0, true }, + #endif #endif #endif #endif From 27c067612c416e0eefa5ea6f8bea9cfe074599b4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Sep 2020 17:40:00 -0500 Subject: [PATCH 0282/1370] Whitespace cleanup --- Marlin/src/lcd/dwin/dwin_lcd.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h | 2 +- Marlin/src/module/stepper/trinamic.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin_lcd.h b/Marlin/src/lcd/dwin/dwin_lcd.h index 11409666d8..9ae6d076d5 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.h +++ b/Marlin/src/lcd/dwin/dwin_lcd.h @@ -205,7 +205,7 @@ void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, // picIDe: Icon ending ID // x/y: Upper-left point // interval: Display time interval, unit 10mS -void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, +void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval); // Animation Control diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h index 84639b59e1..4e2fde6ab3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -127,7 +127,7 @@ namespace Theme { #if ENABLED(TOUCH_UI_COCOA_PRESS) constexpr uint32_t syringe_rgb = 0xFFFFFF; constexpr uint32_t fluid_rgb = accent_color_5; - #else + #else constexpr uint32_t syringe_rgb = accent_color_5; constexpr uint32_t fluid_rgb = accent_color_3; #endif diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index a4b1b240f7..d5a861d71b 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -802,10 +802,10 @@ void reset_trinamic_drivers() { } // TMC Slave Address Conflict Detection -// +// // Conflict detection is performed in the following way. Similar methods are used for // hardware and software serial, but the implementations are indepenent. -// +// // 1. Populate a data structure with UART parameters and addresses for all possible axis. // If an axis is not in use, populate it with recognizable placeholder data. // 2. For each axis in use, static_assert using a constexpr function, which counts the @@ -815,7 +815,7 @@ void reset_trinamic_drivers() { // Hardware serial names are compared as strings, since actually resolving them cannot occur in a constexpr. // Using a fixed-length character array for the port name allows this to be constexpr compatible. struct SanityHwSerialDetails { const char port[20]; uint32_t address; }; - #define TMC_HW_DETAIL_ARGS(A) TERN(A##_HAS_HW_SERIAL, STRINGIFY(A##_HARDWARE_SERIAL), ""), TERN0(A##_HAS_HW_SERIAL, A##_SLAVE_ADDRESS) + #define TMC_HW_DETAIL_ARGS(A) TERN(A##_HAS_HW_SERIAL, STRINGIFY(A##_HARDWARE_SERIAL), ""), TERN0(A##_HAS_HW_SERIAL, A##_SLAVE_ADDRESS) #define TMC_HW_DETAIL(A) {TMC_HW_DETAIL_ARGS(A)} constexpr SanityHwSerialDetails sanity_tmc_hw_details[] = { TMC_HW_DETAIL(X), TMC_HW_DETAIL(X2), From f588d50d578aac370c28db9411bfcbd82ebca73e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Sep 2020 19:45:33 -0500 Subject: [PATCH 0283/1370] HAL and serial cleanup Co-Authored-By: Jason Smith <20053467+sjasonsmith@users.noreply.github.com> --- Marlin/src/HAL/AVR/HAL.h | 21 +---- Marlin/src/HAL/AVR/MarlinSerial.cpp | 20 ++--- Marlin/src/HAL/AVR/MarlinSerial.h | 6 +- Marlin/src/HAL/DUE/HAL.h | 47 +++-------- Marlin/src/HAL/ESP32/HAL.h | 3 - Marlin/src/HAL/HAL.h | 6 ++ Marlin/src/HAL/LINUX/HAL.h | 1 - Marlin/src/HAL/LINUX/main.cpp | 2 +- Marlin/src/HAL/LPC1768/HAL.h | 47 +++-------- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 37 ++++++--- Marlin/src/HAL/SAMD51/HAL.h | 46 +++-------- Marlin/src/HAL/STM32/HAL.h | 81 ++++++------------- Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h | 2 +- Marlin/src/HAL/STM32F1/HAL.h | 5 +- Marlin/src/HAL/STM32F1/MarlinSerial.h | 1 + Marlin/src/HAL/STM32F1/sdio.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/HAL.h | 61 +++----------- Marlin/src/HAL/TEENSY31_32/HAL.h | 14 ++-- Marlin/src/HAL/TEENSY35_36/HAL.h | 14 ++-- Marlin/src/HAL/TEENSY40_41/HAL.h | 51 +++--------- Marlin/src/MarlinCore.cpp | 18 ++--- Marlin/src/gcode/config/M575.cpp | 19 +---- Marlin/src/inc/SanityCheck.h | 40 +++++++-- Marlin/src/lcd/extui/malyan_lcd.cpp | 6 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 8 +- .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h | 8 +- .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h | 8 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 8 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 16 ++-- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 8 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 16 ++-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 17 ++-- buildroot/tests/malyan_M300-tests | 1 + 33 files changed, 220 insertions(+), 420 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 609375e386..fcaaf75c4a 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -81,12 +81,7 @@ typedef int8_t pin_t; // Serial ports #ifdef USBCON - #if ENABLED(BLUETOOTH) - #define MYSERIAL0 bluetoothSerial - #else - #define MYSERIAL0 Serial - #endif - #define NUM_SERIAL 1 + #define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial) #else #if !WITHIN(SERIAL_PORT, -1, 3) #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." @@ -97,36 +92,22 @@ typedef int8_t pin_t; #ifdef SERIAL_PORT_2 #if !WITHIN(SERIAL_PORT_2, -1, 3) #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." - #elif SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration." #endif #define MYSERIAL1 customizedSerial2 - #define NUM_SERIAL 2 - #else - #define NUM_SERIAL 1 #endif #endif #ifdef DGUS_SERIAL_PORT #if !WITHIN(DGUS_SERIAL_PORT, -1, 3) #error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." - #elif DGUS_SERIAL_PORT == SERIAL_PORT - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." #endif #define DGUS_SERIAL internalDgusSerial - #define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.get_tx_buffer_free #endif #ifdef ANYCUBIC_LCD_SERIAL_PORT #if !WITHIN(ANYCUBIC_LCD_SERIAL_PORT, -1, 3) #error "ANYCUBIC_LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." - #elif ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT - #error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT_2 - #error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." #endif #define ANYCUBIC_LCD_SERIAL anycubicLcdSerial #endif diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 3d44a3f59f..838627001d 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -712,11 +712,11 @@ } // Hookup ISR handlers - ISR(SERIAL_REGNAME(USART,SERIAL_PORT,_RX_vect)) { + ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) { MarlinSerial>::store_rxd_char(); } - ISR(SERIAL_REGNAME(USART,SERIAL_PORT,_UDRE_vect)) { + ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) { MarlinSerial>::_tx_udr_empty_irq(); } @@ -729,11 +729,11 @@ #ifdef SERIAL_PORT_2 // Hookup ISR handlers - ISR(SERIAL_REGNAME(USART,SERIAL_PORT_2,_RX_vect)) { + ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _RX_vect)) { MarlinSerial>::store_rxd_char(); } - ISR(SERIAL_REGNAME(USART,SERIAL_PORT_2,_UDRE_vect)) { + ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _UDRE_vect)) { MarlinSerial>::_tx_udr_empty_irq(); } @@ -749,11 +749,11 @@ #ifdef INTERNAL_SERIAL_PORT - ISR(SERIAL_REGNAME(USART,INTERNAL_SERIAL_PORT,_RX_vect)) { + ISR(SERIAL_REGNAME(USART, INTERNAL_SERIAL_PORT, _RX_vect)) { MarlinSerial>::store_rxd_char(); } - ISR(SERIAL_REGNAME(USART,INTERNAL_SERIAL_PORT,_UDRE_vect)) { + ISR(SERIAL_REGNAME(USART, INTERNAL_SERIAL_PORT, _UDRE_vect)) { MarlinSerial>::_tx_udr_empty_irq(); } @@ -776,11 +776,11 @@ return ret; } - ISR(SERIAL_REGNAME(USART,DGUS_SERIAL_PORT,_RX_vect)) { + ISR(SERIAL_REGNAME(USART, DGUS_SERIAL_PORT, _RX_vect)) { MarlinSerial>::store_rxd_char(); } - ISR(SERIAL_REGNAME(USART,DGUS_SERIAL_PORT,_UDRE_vect)) { + ISR(SERIAL_REGNAME(USART, DGUS_SERIAL_PORT, _UDRE_vect)) { MarlinSerial>::_tx_udr_empty_irq(); } @@ -794,11 +794,11 @@ #ifdef ANYCUBIC_LCD_SERIAL_PORT - ISR(SERIAL_REGNAME(USART,ANYCUBIC_LCD_SERIAL_PORT,_RX_vect)) { + ISR(SERIAL_REGNAME(USART, ANYCUBIC_LCD_SERIAL_PORT, _RX_vect)) { MarlinSerial>::store_rxd_char(); } - ISR(SERIAL_REGNAME(USART,ANYCUBIC_LCD_SERIAL_PORT,_UDRE_vect)) { + ISR(SERIAL_REGNAME(USART, ANYCUBIC_LCD_SERIAL_PORT, _UDRE_vect)) { MarlinSerial>::_tx_udr_empty_irq(); } diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index e8bfc5583a..8dbed4d85b 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -48,11 +48,11 @@ // These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor // requires two levels of indirection to expand macro values properly) - #define SERIAL_REGNAME(registerbase,number,suffix) SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) + #define SERIAL_REGNAME(registerbase,number,suffix) _SERIAL_REGNAME(registerbase,number,suffix) #if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary - #define SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) registerbase##suffix + #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##suffix #else - #define SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) registerbase##number##suffix + #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##number##suffix #endif // Registers used by MarlinSerial class (expanded depending on selected serial port) diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 31409c76dd..974f1ccc16 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -38,57 +38,34 @@ #include +#define _MSERIAL(X) Serial##X +#define MSERIAL(X) _MSERIAL(X) +#define Serial0 Serial + // Define MYSERIAL0/1 before MarlinSerial includes! #if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER) #define MYSERIAL0 customizedSerial1 -#elif SERIAL_PORT == 0 - #define MYSERIAL0 Serial -#elif SERIAL_PORT == 1 - #define MYSERIAL0 Serial1 -#elif SERIAL_PORT == 2 - #define MYSERIAL0 Serial2 -#elif SERIAL_PORT == 3 - #define MYSERIAL0 Serial3 +#elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different from SERIAL_PORT. Please update your configuration." - #elif SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER) + #if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER) #define MYSERIAL1 customizedSerial2 - #elif SERIAL_PORT_2 == 0 - #define MYSERIAL1 Serial - #elif SERIAL_PORT_2 == 1 - #define MYSERIAL1 Serial1 - #elif SERIAL_PORT_2 == 2 - #define MYSERIAL1 Serial2 - #elif SERIAL_PORT_2 == 3 - #define MYSERIAL1 Serial3 + #elif WITHIN(SERIAL_PORT_2, 0, 3) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 #endif #ifdef DGUS_SERIAL_PORT - #if DGUS_SERIAL_PORT == SERIAL_PORT - #error "DGUS_SERIAL_PORT must be different from SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." - #elif DGUS_SERIAL_PORT == -1 + #if DGUS_SERIAL_PORT == -1 #define DGUS_SERIAL internalDgusSerial - #elif DGUS_SERIAL_PORT == 0 - #define DGUS_SERIAL Serial - #elif DGUS_SERIAL_PORT == 1 - #define DGUS_SERIAL Serial1 - #elif DGUS_SERIAL_PORT == 2 - #define DGUS_SERIAL Serial2 - #elif DGUS_SERIAL_PORT == 3 - #define DGUS_SERIAL Serial3 + #elif WITHIN(DGUS_SERIAL_PORT, 0, 3) + #define DGUS_SERIAL MSERIAL(DGUS_SERIAL_PORT) #else #error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index c91f9efff0..5eb84fdc30 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -58,9 +58,6 @@ extern portMUX_TYPE spinlock; #else #define MYSERIAL1 webSocketSerial #endif - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 #endif #define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock) diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index c7b7531442..8b6a978d21 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -25,6 +25,12 @@ #include HAL_PATH(.,HAL.h) +#ifdef SERIAL_PORT_2 + #define NUM_SERIAL 2 +#else + #define NUM_SERIAL 1 +#endif + #define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) #ifndef I2C_ADDRESS diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index 96e121d915..778ba2db4d 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -62,7 +62,6 @@ uint8_t _getc(); extern HalSerial usb_serial; #define MYSERIAL0 usb_serial -#define NUM_SERIAL 1 #define ST7920_DELAY_1 DELAY_NS(600) #define ST7920_DELAY_2 DELAY_NS(750) diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp index 4eeef318e7..481f059030 100644 --- a/Marlin/src/HAL/LINUX/main.cpp +++ b/Marlin/src/HAL/LINUX/main.cpp @@ -107,7 +107,7 @@ int main() { std::thread write_serial (write_serial_thread); std::thread read_serial (read_serial_thread); - #if NUM_SERIAL > 0 + #ifdef MYSERIAL0 MYSERIAL0.begin(BAUDRATE); SERIAL_ECHOLNPGM("x86_64 Initialized"); SERIAL_FLUSHTX(); diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 0153bacf42..e9f05fcc61 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -63,56 +63,33 @@ extern "C" volatile uint32_t _millis; #define ST7920_DELAY_3 DELAY_NS(750) #endif +#define _MSERIAL(X) MSerial##X +#define MSERIAL(X) _MSERIAL(X) +#define MSerial0 MSerial + #if SERIAL_PORT == -1 #define MYSERIAL0 UsbSerial -#elif SERIAL_PORT == 0 - #define MYSERIAL0 MSerial -#elif SERIAL_PORT == 1 - #define MYSERIAL0 MSerial1 -#elif SERIAL_PORT == 2 - #define MYSERIAL0 MSerial2 -#elif SERIAL_PORT == 3 - #define MYSERIAL0 MSerial3 +#elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration." - #elif SERIAL_PORT_2 == -1 + #if SERIAL_PORT_2 == -1 #define MYSERIAL1 UsbSerial - #elif SERIAL_PORT_2 == 0 - #define MYSERIAL1 MSerial - #elif SERIAL_PORT_2 == 1 - #define MYSERIAL1 MSerial1 - #elif SERIAL_PORT_2 == 2 - #define MYSERIAL1 MSerial2 - #elif SERIAL_PORT_2 == 3 - #define MYSERIAL1 MSerial3 + #elif WITHIN(SERIAL_PORT_2, 0, 3) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 #endif #ifdef DGUS_SERIAL_PORT - #if DGUS_SERIAL_PORT == SERIAL_PORT - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." - #elif DGUS_SERIAL_PORT == -1 + #if DGUS_SERIAL_PORT == -1 #define DGUS_SERIAL UsbSerial - #elif DGUS_SERIAL_PORT == 0 - #define DGUS_SERIAL MSerial - #elif DGUS_SERIAL_PORT == 1 - #define DGUS_SERIAL MSerial1 - #elif DGUS_SERIAL_PORT == 2 - #define DGUS_SERIAL MSerial2 - #elif DGUS_SERIAL_PORT == 3 - #define DGUS_SERIAL MSerial3 + #elif WITHIN(DGUS_SERIAL_PORT, 0, 3) + #define DGUS_SERIAL MSERIAL(DGUS_SERIAL_PORT) #else #error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 3fc1dd801a..2ca8a29da4 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -89,6 +89,9 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o * Serial2 | P0_10 | P0_11 | * Serial3 | P0_00 | P0_01 | */ +#define ANY_TX(N,V...) DO(IS_TX##N,||,V) +#define ANY_RX(N,V...) DO(IS_RX##N,||,V) + #if (defined(SERIAL_PORT) && SERIAL_PORT == 0) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == 0) || (defined(DGUS_SERIAL_PORT) && DGUS_SERIAL_PORT == 0) #define IS_TX0(P) (P == P0_02) #define IS_RX0(P) (P == P0_03) @@ -106,48 +109,56 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1 #define IS_TX1(P) (P == P0_15) #define IS_RX1(P) (P == P0_16) + #define _IS_TX1_1 IS_TX1 + #define _IS_RX1_1 IS_RX1 #if IS_TX1(TMC_SW_SCK) #error "Serial port pins (1) conflict with other pins!" #elif HAS_SPI_LCD #if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1) #error "Serial port pins (1) conflict with Encoder Buttons!" - #elif IS_TX1(SCK_PIN) || IS_TX1(LCD_PINS_D4) || IS_TX1(DOGLCD_SCK) || IS_TX1(LCD_RESET_PIN) || IS_TX1(LCD_PINS_RS) || IS_TX1(SHIFT_CLK) \ - || IS_RX1(LCD_SDSS) || IS_RX1(LCD_PINS_RS) || IS_RX1(MISO_PIN) || IS_RX1(DOGLCD_A0) || IS_RX1(SS_PIN) || IS_RX1(LCD_SDSS) || IS_RX1(DOGLCD_CS) || IS_RX1(LCD_RESET_PIN) || IS_RX1(LCD_BACKLIGHT_PIN) + #elif ANY_TX(1, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \ + || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, MISO_PIN, DOGLCD_A0, SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN) #error "Serial port pins (1) conflict with LCD pins!" #endif #endif #undef IS_TX1 #undef IS_RX1 + #undef _IS_TX1_1 + #undef _IS_RX1_1 #endif #if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2 #define IS_TX2(P) (P == P0_10) #define IS_RX2(P) (P == P0_11) - #if IS_TX2(X2_ENABLE_PIN) || IS_RX2(X2_DIR_PIN) || IS_RX2(X2_STEP_PIN) || (AXIS_HAS_SPI(X2) && IS_TX2(X2_CS_PIN)) + #define _IS_TX2_1 IS_TX2 + #define _IS_RX2_1 IS_RX2 + #if IS_TX2(X2_ENABLE_PIN) || ANY_RX(2, X2_DIR_PIN, X2_STEP_PIN) || (AXIS_HAS_SPI(X2) && IS_TX2(X2_CS_PIN)) #error "Serial port pins (2) conflict with X2 pins!" - #elif IS_TX2(Y2_ENABLE_PIN) || IS_RX2(Y2_DIR_PIN) || IS_RX2(Y2_STEP_PIN) || (AXIS_HAS_SPI(Y2) && IS_TX2(Y2_CS_PIN)) + #elif IS_TX2(Y2_ENABLE_PIN) || ANY_RX(2, Y2_DIR_PIN, Y2_STEP_PIN) || (AXIS_HAS_SPI(Y2) && IS_TX2(Y2_CS_PIN)) #error "Serial port pins (2) conflict with Y2 pins!" - #elif IS_TX2(Z2_ENABLE_PIN) || IS_RX2(Z2_DIR_PIN) || IS_RX2(Z2_STEP_PIN) || (AXIS_HAS_SPI(Z2) && IS_TX2(Z2_CS_PIN)) + #elif IS_TX2(Z2_ENABLE_PIN) || ANY_RX(2, Z2_DIR_PIN, Z2_STEP_PIN) || (AXIS_HAS_SPI(Z2) && IS_TX2(Z2_CS_PIN)) #error "Serial port pins (2) conflict with Z2 pins!" - #elif IS_TX2(Z3_ENABLE_PIN) || IS_RX2(Z3_DIR_PIN) || IS_RX2(Z3_STEP_PIN) || (AXIS_HAS_SPI(Z3) && IS_TX2(Z3_CS_PIN)) + #elif IS_TX2(Z3_ENABLE_PIN) || ANY_RX(2, Z3_DIR_PIN, Z3_STEP_PIN) || (AXIS_HAS_SPI(Z3) && IS_TX2(Z3_CS_PIN)) #error "Serial port pins (2) conflict with Z3 pins!" - #elif IS_TX2(Z4_ENABLE_PIN) || IS_RX2(Z4_DIR_PIN) || IS_RX2(Z4_STEP_PIN) || (AXIS_HAS_SPI(Z4) && IS_TX2(Z4_CS_PIN)) + #elif IS_TX2(Z4_ENABLE_PIN) || ANY_RX(2, Z4_DIR_PIN, Z4_STEP_PIN) || (AXIS_HAS_SPI(Z4) && IS_TX2(Z4_CS_PIN)) #error "Serial port pins (2) conflict with Z4 pins!" - #elif IS_RX2(X_DIR_PIN) || IS_RX2(Y_DIR_PIN) + #elif ANY_RX(2, X_DIR_PIN, Y_DIR_PIN) #error "Serial port pins (2) conflict with other pins!" #elif Y_HOME_DIR < 0 && IS_TX2(Y_STOP_PIN) #error "Serial port pins (2) conflict with Y endstop pin!" #elif HAS_CUSTOM_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN) #error "Serial port pins (2) conflict with probe pin!" - #elif IS_TX2(X_ENABLE_PIN) || IS_RX2(X_DIR_PIN) || IS_TX2(Y_ENABLE_PIN) || IS_RX2(Y_DIR_PIN) + #elif ANY_TX(2, X_ENABLE_PIN, Y_ENABLE_PIN) || ANY_RX(2, X_DIR_PIN, Y_DIR_PIN) #error "Serial port pins (2) conflict with X/Y stepper pins!" #elif HAS_MULTI_EXTRUDER && (IS_TX2(E1_ENABLE_PIN) || (AXIS_HAS_SPI(E1) && IS_TX2(E1_CS_PIN))) #error "Serial port pins (2) conflict with E1 stepper pins!" - #elif EXTRUDERS && (IS_RX2(E0_DIR_PIN) || IS_RX2(E0_STEP_PIN)) + #elif EXTRUDERS && ANY_RX(2, E0_DIR_PIN, E0_STEP_PIN) #error "Serial port pins (2) conflict with E stepper pins!" #endif #undef IS_TX2 #undef IS_RX2 + #undef _IS_TX2_1 + #undef _IS_RX2_1 #endif #if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3 @@ -155,8 +166,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #define PIN_IS_RX3(P) (P##_PIN == P0_01) #if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX) #error "Serial port pins (3) conflict with X endstop pins!" - #elif PIN_IS_TX3(Y_SERIAL_TX) || PIN_IS_TX3(Y_SERIAL_RX) \ - || PIN_IS_RX3(X_SERIAL_TX) || PIN_IS_RX3(X_SERIAL_RX) + #elif PIN_IS_TX3(Y_SERIAL_TX) || PIN_IS_TX3(Y_SERIAL_RX) || PIN_IS_RX3(X_SERIAL_TX) || PIN_IS_RX3(X_SERIAL_RX) #error "Serial port pins (3) conflict with X/Y axis UART pins!" #elif PIN_IS_TX3(X2_DIR) || PIN_IS_RX3(X2_STEP) #error "Serial port pins (3) conflict with X2 pins!" @@ -175,6 +185,9 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef PIN_IS_RX3 #endif +#undef ANY_TX +#undef ANY_RX + // // Flag any i2c pin conflicts // diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index ea0f694cdc..b516cb769f 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -35,56 +35,32 @@ // MYSERIAL0 required before MarlinSerial includes! + #define _MSERIAL(X) Serial##X + #define MSERIAL(X) _MSERIAL(INCREMENT(X)) + #if SERIAL_PORT == -1 #define MYSERIAL0 Serial - #elif SERIAL_PORT == 0 - #define MYSERIAL0 Serial1 - #elif SERIAL_PORT == 1 - #define MYSERIAL0 Serial2 - #elif SERIAL_PORT == 2 - #define MYSERIAL0 Serial3 - #elif SERIAL_PORT == 3 - #define MYSERIAL0 Serial4 + #elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration." - #elif SERIAL_PORT_2 == -1 + #if SERIAL_PORT_2 == -1 #define MYSERIAL1 Serial - #elif SERIAL_PORT_2 == 0 - #define MYSERIAL1 Serial1 - #elif SERIAL_PORT_2 == 1 - #define MYSERIAL1 Serial2 - #elif SERIAL_PORT_2 == 2 - #define MYSERIAL1 Serial3 - #elif SERIAL_PORT_2 == 3 - #define MYSERIAL1 Serial4 + #elif WITHIN(SERIAL_PORT_2, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif - #define NUM_SERIAL 2 - #else - #define NUM_SERIAL 1 #endif #ifdef DGUS_SERIAL_PORT - #if DGUS_SERIAL_PORT == SERIAL_PORT - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." - #elif DGUS_SERIAL_PORT == -1 + #if DGUS_SERIAL_PORT == -1 #define DGUS_SERIAL Serial - #elif DGUS_SERIAL_PORT == 0 - #define DGUS_SERIAL Serial1 - #elif DGUS_SERIAL_PORT == 1 - #define DGUS_SERIAL Serial2 - #elif DGUS_SERIAL_PORT == 2 - #define DGUS_SERIAL Serial3 - #elif DGUS_SERIAL_PORT == 2 - #define DGUS_SERIAL Serial4 + #elif WITHIN(DGUS_SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(DGUS_SERIAL_PORT) #else #error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 08081331b7..9ec2d5c19e 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -43,82 +43,47 @@ // ------------------------ // Defines // ------------------------ +#define _MSERIAL(X) MSerial##X +#define MSERIAL(X) _MSERIAL(X) -#if SERIAL_PORT == 0 - #error "SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." -#elif SERIAL_PORT == -1 +#if SERIAL_PORT == -1 #define MYSERIAL0 SerialUSB -#elif SERIAL_PORT == 1 - #define MYSERIAL0 MSerial1 -#elif SERIAL_PORT == 2 - #define MYSERIAL0 MSerial2 -#elif SERIAL_PORT == 3 - #define MYSERIAL0 MSerial3 -#elif SERIAL_PORT == 4 - #define MYSERIAL0 MSerial4 -#elif SERIAL_PORT == 5 - #define MYSERIAL0 MSerial5 -#elif SERIAL_PORT == 6 - #define MYSERIAL0 MSerial6 +#elif WITHIN(SERIAL_PORT, 1, 6) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else - #error "SERIAL_PORT must be from -1 to 6. Please update your configuration." + #error "SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." #endif #ifdef SERIAL_PORT_2 - #define NUM_SERIAL 2 - #if SERIAL_PORT_2 == 0 - #error "SERIAL_PORT_2 cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration." - #elif SERIAL_PORT_2 == -1 + #if SERIAL_PORT_2 == -1 #define MYSERIAL1 SerialUSB - #elif SERIAL_PORT_2 == 1 - #define MYSERIAL1 MSerial1 - #elif SERIAL_PORT_2 == 2 - #define MYSERIAL1 MSerial2 - #elif SERIAL_PORT_2 == 3 - #define MYSERIAL1 MSerial3 - #elif SERIAL_PORT_2 == 4 - #define MYSERIAL1 MSerial4 - #elif SERIAL_PORT_2 == 5 - #define MYSERIAL1 MSerial5 - #elif SERIAL_PORT_2 == 6 - #define MYSERIAL1 MSerial6 + #elif WITHIN(SERIAL_PORT_2, 1, 6) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else - #error "SERIAL_PORT_2 must be from -1 to 6. Please update your configuration." + #error "SERIAL_PORT_2 must be -1 or from 1 to 6. Please update your configuration." #endif -#else - #define NUM_SERIAL 1 #endif #if HAS_DGUS_LCD - #if DGUS_SERIAL_PORT == 0 - #error "DGUS_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif DGUS_SERIAL_PORT == SERIAL_PORT - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." - #elif DGUS_SERIAL_PORT == -1 + #if DGUS_SERIAL_PORT == -1 #define DGUS_SERIAL SerialUSB - #elif DGUS_SERIAL_PORT == 1 - #define DGUS_SERIAL MSerial1 - #elif DGUS_SERIAL_PORT == 2 - #define DGUS_SERIAL MSerial2 - #elif DGUS_SERIAL_PORT == 3 - #define DGUS_SERIAL MSerial3 - #elif DGUS_SERIAL_PORT == 4 - #define DGUS_SERIAL MSerial4 - #elif DGUS_SERIAL_PORT == 5 - #define DGUS_SERIAL MSerial5 - #elif DGUS_SERIAL_PORT == 6 - #define DGUS_SERIAL MSerial6 + #elif WITHIN(DGUS_SERIAL_PORT, 1, 6) + #define DGUS_SERIAL MSERIAL(DGUS_SERIAL_PORT) #else - #error "DGUS_SERIAL_PORT must be from -1 to 6. Please update your configuration." + #error "DGUS_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." #endif - #define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.availableForWrite #endif +#if ENABLED(MALYAN_LCD) + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL SerialUSB + #elif WITHIN(LCD_SERIAL_PORT, 1, 6) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) + #else + #error "LCD_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." + #endif +#endif /** * TODO: review this to return 1 for pins that are not analog input diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h b/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h index 5ff40debea..9069d9f7bd 100644 --- a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h +++ b/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h @@ -98,7 +98,7 @@ static inline void pwm_details(const pin_t pin) { timer_dev * const tdev = PIN_MAP[pin].timer_device; const uint8_t channel = PIN_MAP[pin].timer_channel; const char num = ( - #if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) + #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) tdev == &timer8 ? '8' : tdev == &timer5 ? '5' : #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index f76d8c54a0..47414cb45e 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -53,7 +53,7 @@ // ------------------------ #ifndef STM32_FLASH_SIZE - #if defined(MCU_STM32F103RE) || defined(MCU_STM32F103VE) + #if EITHER(MCU_STM32F103RE, MCU_STM32F103VE) #define STM32_FLASH_SIZE 512 #else #define STM32_FLASH_SIZE 256 @@ -106,9 +106,6 @@ #else #error "SERIAL_PORT_2 must be from -1 to 5. Please update your configuration." #endif - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 #endif #ifdef DGUS_SERIAL diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index eb0059bfbc..b9248e50ca 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -30,6 +30,7 @@ #include "../../feature/e_parser.h" #endif +// Increase priority of serial interrupts, to reduce overflow errors #define UART_IRQ_PRIO 1 class MarlinSerial : public HardwareSerial { diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp index 0e9a3b2d04..ffa6db1206 100644 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) +#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) #include "sdio.h" diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.h b/Marlin/src/HAL/STM32_F4_F7/HAL.h index 5601400c5a..e132168205 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.h +++ b/Marlin/src/HAL/STM32_F4_F7/HAL.h @@ -46,24 +46,16 @@ // Serial override //extern HalSerial usb_serial; +#define _MSERIAL(X) SerialUART##X +#define MSERIAL(X) _MSERIAL(X) +#define SerialUART0 Serial1 + #if defined(STM32F4) && SERIAL_PORT == 0 #error "SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." #elif SERIAL_PORT == -1 #define MYSERIAL0 SerialUSB -#elif SERIAL_PORT == 0 - #define MYSERIAL0 Serial1 -#elif SERIAL_PORT == 1 - #define MYSERIAL0 SerialUART1 -#elif SERIAL_PORT == 2 - #define MYSERIAL0 SerialUART2 -#elif SERIAL_PORT == 3 - #define MYSERIAL0 SerialUART3 -#elif SERIAL_PORT == 4 - #define MYSERIAL0 SerialUART4 -#elif SERIAL_PORT == 5 - #define MYSERIAL0 SerialUART5 -#elif SERIAL_PORT == 6 - #define MYSERIAL0 SerialUART6 +#elif WITHIN(SERIAL_PORT, 0, 6) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be from -1 to 6. Please update your configuration." #endif @@ -71,55 +63,22 @@ #ifdef SERIAL_PORT_2 #if defined(STM32F4) && SERIAL_PORT_2 == 0 #error "SERIAL_PORT_2 cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration." #elif SERIAL_PORT_2 == -1 #define MYSERIAL1 SerialUSB - #elif SERIAL_PORT_2 == 0 - #define MYSERIAL1 Serial1 - #elif SERIAL_PORT_2 == 1 - #define MYSERIAL1 SerialUART1 - #elif SERIAL_PORT_2 == 2 - #define MYSERIAL1 SerialUART2 - #elif SERIAL_PORT_2 == 3 - #define MYSERIAL1 SerialUART3 - #elif SERIAL_PORT_2 == 4 - #define MYSERIAL1 SerialUART4 - #elif SERIAL_PORT_2 == 5 - #define MYSERIAL1 SerialUART5 - #elif SERIAL_PORT_2 == 6 - #define MYSERIAL1 SerialUART6 + #elif WITHIN(SERIAL_PORT_2, 0, 6) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 6. Please update your configuration." #endif - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 #endif #ifdef DGUS_SERIAL_PORT #if defined(STM32F4) && DGUS_SERIAL_PORT == 0 #error "DGUS_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif DGUS_SERIAL_PORT == SERIAL_PORT - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." #elif DGUS_SERIAL_PORT == -1 #define DGUS_SERIAL SerialUSB - #elif DGUS_SERIAL_PORT == 0 - #define DGUS_SERIAL Serial1 - #elif DGUS_SERIAL_PORT == 1 - #define DGUS_SERIAL SerialUART1 - #elif DGUS_SERIAL_PORT == 2 - #define DGUS_SERIAL SerialUART2 - #elif DGUS_SERIAL_PORT == 3 - #define DGUS_SERIAL SerialUART3 - #elif DGUS_SERIAL_PORT == 4 - #define DGUS_SERIAL SerialUART4 - #elif DGUS_SERIAL_PORT == 5 - #define DGUS_SERIAL SerialUART5 - #elif DGUS_SERIAL_PORT == 6 - #define DGUS_SERIAL SerialUART6 + #elif WITHIN(DGUS_SERIAL_PORT, 0, 6) + #define DGUS_SERIAL MSERIAL(DGUS_SERIAL_PORT) #else #error "DGUS_SERIAL_PORT must be from -1 to 6. Please update your configuration." #endif diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index ad095cba83..31ceb8b87c 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -49,18 +49,14 @@ #define IS_TEENSY32 1 #endif -#define NUM_SERIAL 1 +#define _MSERIAL(X) Serial##X +#define MSERIAL(X) _MSERIAL(X) +#define Serial0 Serial #if SERIAL_PORT == -1 #define MYSERIAL0 SerialUSB -#elif SERIAL_PORT == 0 - #define MYSERIAL0 Serial -#elif SERIAL_PORT == 1 - #define MYSERIAL0 Serial1 -#elif SERIAL_PORT == 2 - #define MYSERIAL0 Serial2 -#elif SERIAL_PORT == 3 - #define MYSERIAL0 Serial3 +#elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) #endif #define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 96be08d7b7..11f0fb941e 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -54,18 +54,14 @@ #define IS_TEENSY36 1 #endif -#define NUM_SERIAL 1 +#define _MSERIAL(X) Serial##X +#define MSERIAL(X) _MSERIAL(X) +#define Serial0 Serial #if SERIAL_PORT == -1 #define MYSERIAL0 SerialUSB -#elif SERIAL_PORT == 0 - #define MYSERIAL0 Serial -#elif SERIAL_PORT == 1 - #define MYSERIAL0 Serial1 -#elif SERIAL_PORT == 2 - #define MYSERIAL0 Serial2 -#elif SERIAL_PORT == 3 - #define MYSERIAL0 Serial3 +#elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) #endif #define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 0626d4ee9c..77f7af2956 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -50,59 +50,26 @@ #define IS_TEENSY41 1 #endif +#define _MSERIAL(X) Serial##X +#define MSERIAL(X) _MSERIAL(X) +#define Serial0 Serial + #if SERIAL_PORT == -1 #define MYSERIAL0 SerialUSB -#elif SERIAL_PORT == 0 - #define MYSERIAL0 Serial -#elif SERIAL_PORT == 1 - #define MYSERIAL0 Serial1 -#elif SERIAL_PORT == 2 - #define MYSERIAL0 Serial2 -#elif SERIAL_PORT == 3 - #define MYSERIAL0 Serial3 -#elif SERIAL_PORT == 4 - #define MYSERIAL0 Serial4 -#elif SERIAL_PORT == 5 - #define MYSERIAL0 Serial5 -#elif SERIAL_PORT == 6 - #define MYSERIAL0 Serial6 -#elif SERIAL_PORT == 7 - #define MYSERIAL0 Serial7 -#elif SERIAL_PORT == 8 - #define MYSERIAL0 Serial8 +#elif WITHIN(SERIAL_PORT, 0, 8) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." #endif #ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different from SERIAL_PORT. Please update your configuration." - #elif SERIAL_PORT_2 == -1 + #if SERIAL_PORT_2 == -1 #define MYSERIAL1 usbSerial - #elif SERIAL_PORT_2 == 0 - #define MYSERIAL1 Serial - #elif SERIAL_PORT_2 == 1 - #define MYSERIAL1 Serial1 - #elif SERIAL_PORT_2 == 2 - #define MYSERIAL1 Serial2 - #elif SERIAL_PORT_2 == 3 - #define MYSERIAL1 Serial3 - #elif SERIAL_PORT_2 == 4 - #define MYSERIAL1 Serial4 - #elif SERIAL_PORT_2 == 5 - #define MYSERIAL1 Serial5 - #elif SERIAL_PORT_2 == 6 - #define MYSERIAL1 Serial6 - #elif SERIAL_PORT_2 == 7 - #define MYSERIAL1 Serial7 - #elif SERIAL_PORT_2 == 8 - #define MYSERIAL1 Serial8 + #elif WITHIN(SERIAL_PORT_2, 0, 8) + #define MYSERIAL0 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 8. Please update your configuration." #endif - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 #endif #define HAL_SERVO_LIB libServo diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 22935c1460..e11439861b 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -912,17 +912,15 @@ void setup() { #endif #endif - #if NUM_SERIAL > 0 - MYSERIAL0.begin(BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - #if HAS_MULTI_SERIAL - MYSERIAL1.begin(BAUDRATE); - serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - #endif - SERIAL_ECHO_MSG("start"); + MYSERIAL0.begin(BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #if HAS_MULTI_SERIAL + MYSERIAL1.begin(BAUDRATE); + serial_connect_timeout = millis() + 1000UL; + while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif + SERIAL_ECHO_MSG("start"); #if BOTH(HAS_TFT_LVGL_UI, USE_WIFI_FUNCTION) mks_esp_wifi_init(); diff --git a/Marlin/src/gcode/config/M575.cpp b/Marlin/src/gcode/config/M575.cpp index 3aa5844653..44723b7f2f 100644 --- a/Marlin/src/gcode/config/M575.cpp +++ b/Marlin/src/gcode/config/M575.cpp @@ -53,23 +53,10 @@ void GcodeSuite::M575() { case 115200: case 250000: case 500000: case 1000000: { const int8_t port = parser.intval('P', -99); const bool set0 = (port == -99 || port == 0); - if (set0) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(" Serial " - #if HAS_MULTI_SERIAL - , '0', - #else - "0" - #endif - " baud rate set to ", baud - ); - } + if (set0) SERIAL_ECHO_MSG(" Serial ", '0', " baud rate set to ", baud); #if HAS_MULTI_SERIAL const bool set1 = (port == -99 || port == 1); - if (set1) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(" Serial ", '1', " baud rate set to ", baud); - } + if (set1) SERIAL_ECHO_MSG(" Serial ", '1', " baud rate set to ", baud); #endif SERIAL_FLUSH(); @@ -85,4 +72,4 @@ void GcodeSuite::M575() { } } -#endif // NUM_SERIAL > 0 && BAUD_RATE_GCODE +#endif // BAUD_RATE_GCODE diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 8d68b33ece..4c0b68e8ae 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -582,12 +582,10 @@ #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." #endif -#if SERIAL_PORT > 7 - #error "Set SERIAL_PORT to the port on your board. Usually this is 0." -#endif - -#if defined(SERIAL_PORT_2) && NUM_SERIAL < 2 - #error "SERIAL_PORT_2 is not supported for your MOTHERBOARD. Disable it to continue." +#ifndef SERIAL_PORT + #error "SERIAL_PORT must be defined in Configuration.h" +#elif defined(SERIAL_PORT_2) && SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT. Please update your configuration." #endif /** @@ -2280,6 +2278,36 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "Please enable only one LCD_SCREEN_ROT_* option: 0, 90, 180, or 270." #endif +/** + * Serial displays require a dedicated serial port + */ +#if HAS_DGUS_LCD + #ifndef DGUS_SERIAL_PORT + #error "The DGUS LCD requires DGUS_SERIAL_PORT to be defined in Configuration.h" + #elif DGUS_SERIAL_PORT == SERIAL_PORT + #error "DGUS_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." + #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 + #error "DGUS_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." + #endif +#elif ENABLED(MALYAN_LCD) + #ifndef LCD_SERIAL_PORT + #error "MALYAN_LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #elif LCD_SERIAL_PORT == SERIAL_PORT + #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." + #elif defined(SERIAL_PORT_2) && LCD_SERIAL_PORT == SERIAL_PORT_2 + #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." + #endif +#elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + #ifndef ANYCUBIC_LCD_SERIAL_PORT + #error "The ANYCUBIC LCD requires ANYCUBIC_LCD_SERIAL_PORT to be defined in Configuration.h" + #elif ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT + #error "ANYCUBIC_LCD_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." + #elif defined(SERIAL_PORT_2) && ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT_2 + #error "ANYCUBIC_LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." + #endif + #define ANYCUBIC_LCD_SERIAL anycubicLcdSerial +#endif + /** * FYSETC Mini 12864 RGB backlighting required */ diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index b5148065c7..ece1b14235 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -45,7 +45,7 @@ #if ENABLED(MALYAN_LCD) -#define DEBUG_MALYAN_LCD +//#define DEBUG_MALYAN_LCD #include "ui_api.h" @@ -61,10 +61,6 @@ #define DEBUG_OUT ENABLED(DEBUG_MALYAN_LCD) #include "../../core/debug_out.h" -// On the Malyan M200, this will be Serial1. On a RAMPS board, -// it might not be. -#define LCD_SERIAL Serial1 - // This is based on longest sys command + a filename, plus some buffer // in case we encounter some data we don't recognize // There is no evidence a line will ever be this long, but better safe than sorry diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index f018a40c3e..a3cb987fff 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -117,10 +117,10 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 + //#define X_HARDWARE_SERIAL MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 // // Software serial diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h index b658f3d714..78751a6bac 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h @@ -30,8 +30,8 @@ * Hardware serial communication ports. */ #if HAS_TMC_UART - #define X_HARDWARE_SERIAL Serial4 - #define Y_HARDWARE_SERIAL Serial4 - #define Z_HARDWARE_SERIAL Serial4 - #define E0_HARDWARE_SERIAL Serial4 + #define X_HARDWARE_SERIAL MSerial4 + #define Y_HARDWARE_SERIAL MSerial4 + #define Z_HARDWARE_SERIAL MSerial4 + #define E0_HARDWARE_SERIAL MSerial4 #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h index cb94f0bdca..0a0d857db3 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h @@ -52,8 +52,8 @@ * Hardware serial communication ports. */ #if HAS_TMC_UART - #define X_HARDWARE_SERIAL Serial4 - #define Y_HARDWARE_SERIAL Serial4 - #define Z_HARDWARE_SERIAL Serial4 - #define E0_HARDWARE_SERIAL Serial4 + #define X_HARDWARE_SERIAL MSerial4 + #define Y_HARDWARE_SERIAL MSerial4 + #define Z_HARDWARE_SERIAL MSerial4 + #define E0_HARDWARE_SERIAL MSerial4 #endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index b7db592e78..a04d6d261f 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -93,10 +93,10 @@ // // Hardware serial with switch // - #define X_HARDWARE_SERIAL Serial1 - #define Y_HARDWARE_SERIAL Serial1 - #define Z_HARDWARE_SERIAL Serial1 - #define E0_HARDWARE_SERIAL Serial1 + #define X_HARDWARE_SERIAL MSerial1 + #define Y_HARDWARE_SERIAL MSerial1 + #define Z_HARDWARE_SERIAL MSerial1 + #define E0_HARDWARE_SERIAL MSerial1 // The 4xTMC2209 module doesn't have a serial multiplexer and // needs to set *_SLAVE_ADDRESS in Configuration_adv.h for X,Y,Z,E0 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index e39c8f2342..48da17adc5 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -188,17 +188,11 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 + //#define X_HARDWARE_SERIAL MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 + //#define E1_HARDWARE_SERIAL MSerial1 // Unused servo pins may be repurposed with SoftwareSerialM //#define X_SERIAL_TX_PIN PF8 // SERVO3_PIN -- XS2 - 6 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index f6a3b555c3..bbacbf5585 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -83,10 +83,10 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 + //#define X_HARDWARE_SERIAL MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 // // Software serial diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index ccb07b35f8..be3b130c85 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -132,17 +132,11 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 + //#define X_HARDWARE_SERIAL MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 + //#define E1_HARDWARE_SERIAL MSerial1 // // Software serial diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 2e74b6b15f..e445b8169b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -125,17 +125,12 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 + //#define X_HARDWARE_SERIAL MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 + //#define E1_HARDWARE_SERIAL MSerial1 + //#define E2_HARDWARE_SERIAL MSerial1 // // Software serial diff --git a/buildroot/tests/malyan_M300-tests b/buildroot/tests/malyan_M300-tests index ada60d5584..1955accaa5 100755 --- a/buildroot/tests/malyan_M300-tests +++ b/buildroot/tests/malyan_M300-tests @@ -9,6 +9,7 @@ set -e restore_configs use_example_configs "delta/Malyan M300" opt_disable AUTO_BED_LEVELING_3POINT +opt_set LCD_SERIAL_PORT 1 exec_test $1 $2 "Malyan M300 (delta)" # cleanup From bfa6cd36937d32bd2a7a47a5f66ec73b9bba4e11 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Sep 2020 21:36:31 -0500 Subject: [PATCH 0284/1370] HAL/serial followup --- Marlin/src/HAL/AVR/HAL.h | 1 - Marlin/src/HAL/SAMD51/HAL.h | 2 +- Marlin/src/HAL/STM32F1/HAL.h | 2 +- Marlin/src/HAL/TEENSY40_41/HAL.h | 2 +- .../lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp | 6 +++++- Marlin/src/lcd/extui/malyan_lcd.cpp | 6 +++++- 6 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index fcaaf75c4a..af7e142679 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -86,7 +86,6 @@ typedef int8_t pin_t; #if !WITHIN(SERIAL_PORT, -1, 3) #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif - #define MYSERIAL0 customizedSerial1 #ifdef SERIAL_PORT_2 diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index b516cb769f..c72613e772 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -50,7 +50,7 @@ #if SERIAL_PORT_2 == -1 #define MYSERIAL1 Serial #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 47414cb45e..0f3c3e1460 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -108,7 +108,7 @@ #endif #endif -#ifdef DGUS_SERIAL +#ifdef DGUS_SERIAL_PORT #if DGUS_SERIAL_PORT == 0 #error "DGUS_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." #elif DGUS_SERIAL_PORT == SERIAL_PORT diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 77f7af2956..b3b0144d13 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -66,7 +66,7 @@ #if SERIAL_PORT_2 == -1 #define MYSERIAL1 usbSerial #elif WITHIN(SERIAL_PORT_2, 0, 8) - #define MYSERIAL0 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 8. Please update your configuration." #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index a7173b1ad2..16779c0773 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -113,7 +113,11 @@ static void sendLine_P(PGM_P str) { AnycubicTFTClass::AnycubicTFTClass() {} void AnycubicTFTClass::OnSetup() { - ANYCUBIC_LCD_SERIAL.begin(115200); + #ifndef LCD_BAUDRATE + #define LCD_BAUDRATE 115200 + #endif + LCD_SERIAL.begin(LCD_BAUDRATE); + SENDLINE_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset ExtUI::delay_ms(10); diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index ece1b14235..79a5fb961a 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -428,7 +428,11 @@ namespace ExtUI { * it and translate into ExtUI operations where possible. */ inbound_count = 0; - LCD_SERIAL.begin(500000); + + #ifndef LCD_BAUDRATE + #define LCD_BAUDRATE 500000 + #endif + LCD_SERIAL.begin(LCD_BAUDRATE); // Signal init write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); From 449a31dea9b1280edb1ced9223e33177199ea766 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Sep 2020 21:36:39 -0500 Subject: [PATCH 0285/1370] Fix some pin inits --- .../lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp | 6 ++---- Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 16779c0773..486f262778 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -123,12 +123,10 @@ void AnycubicTFTClass::OnSetup() { // initialise the state of the key pins running on the tft #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - pinMode(SD_DETECT_PIN, INPUT); - WRITE(SD_DETECT_PIN, HIGH); + SET_INPUT_PULLUP(SD_DETECT_PIN); #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) - pinMode(FIL_RUNOUT_PIN, INPUT); - WRITE(FIL_RUNOUT_PIN, HIGH); + SET_INPUT_PULLUP(FIL_RUNOUT_PIN); #endif mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 0e4526734c..2b6f5f89f6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -161,13 +161,13 @@ void printer_state_polling() { void filament_pin_setup() { #if PIN_EXISTS(MT_DET_1) - pinMode(MT_DET_1_PIN, INPUT_PULLUP); + SET_INPUT_PULLUP(MT_DET_1_PIN); #endif #if PIN_EXISTS(MT_DET_2) - pinMode(MT_DET_2_PIN, INPUT_PULLUP); + SET_INPUT_PULLUP(MT_DET_2_PIN); #endif #if PIN_EXISTS(MT_DET_3) - pinMode(MT_DET_3_PIN, INPUT_PULLUP); + SET_INPUT_PULLUP(MT_DET_3_PIN); #endif } From 9d02cedfed0c68a4872cbfdb74d098b29a4cc547 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 24 Sep 2020 18:28:48 -0700 Subject: [PATCH 0286/1370] Fix and improve STM32F1 serial (#19464) --- Marlin/Configuration.h | 5 +- Marlin/Configuration_adv.h | 10 +- Marlin/src/HAL/AVR/HAL.h | 17 +- Marlin/src/HAL/AVR/MarlinSerial.cpp | 1340 ++++++++--------- Marlin/src/HAL/AVR/MarlinSerial.h | 71 +- Marlin/src/HAL/DUE/HAL.h | 12 +- Marlin/src/HAL/DUE/MarlinSerial.h | 2 + Marlin/src/HAL/LINUX/include/serial.h | 1 + Marlin/src/HAL/LPC1768/HAL.h | 12 +- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 8 +- Marlin/src/HAL/LPC1768/MarlinSerial.h | 1 + Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 8 +- Marlin/src/HAL/LPC1768/usb_serial.cpp | 2 + Marlin/src/HAL/SAMD51/HAL.h | 12 +- Marlin/src/HAL/STM32/HAL.h | 16 +- Marlin/src/HAL/STM32/MarlinSerial.cpp | 4 +- Marlin/src/HAL/STM32/MarlinSerial.h | 4 + Marlin/src/HAL/STM32F1/HAL.h | 82 +- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 133 +- Marlin/src/HAL/STM32F1/MarlinSerial.h | 21 +- Marlin/src/HAL/STM32F1/msc_sd.h | 1 + Marlin/src/HAL/STM32_F4_F7/HAL.h | 16 +- Marlin/src/inc/Conditionals_adv.h | 34 + Marlin/src/inc/SanityCheck.h | 33 +- Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 25 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 18 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 62 +- buildroot/tests/mks_robin_pro-tests | 1 + 28 files changed, 1009 insertions(+), 942 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2635bc750e..93e2a0229a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2165,6 +2165,9 @@ // Touch-screen LCD for Malyan M200/M300 printers // //#define MALYAN_LCD +#if ENABLED(MALYAN_LCD) + #define LCD_SERIAL_PORT 1 // Default is 1 for Malyan M200 +#endif // // Touch UI for FTDI EVE (FT800/FT810) displays @@ -2178,7 +2181,7 @@ //#define ANYCUBIC_LCD_I3MEGA //#define ANYCUBIC_LCD_CHIRON #if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - #define ANYCUBIC_LCD_SERIAL_PORT 3 + #define LCD_SERIAL_PORT 3 // Default is 3 for Anycubic //#define ANYCUBIC_LCD_DEBUG #endif diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 65cbd21a94..a8c9205538 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1404,8 +1404,8 @@ // Additional options for DGUS / DWIN displays // #if HAS_DGUS_LCD - #define DGUS_SERIAL_PORT 3 - #define DGUS_BAUDRATE 115200 + #define LCD_SERIAL_PORT 3 + #define LCD_BAUDRATE 115200 #define DGUS_RX_BUFFER_SIZE 128 #define DGUS_TX_BUFFER_SIZE 48 @@ -3419,10 +3419,10 @@ #if ENABLED(PRUSA_MMU2) // Serial port used for communication with MMU2. - // For AVR enable the UART port used for the MMU. (e.g., internalSerial) + // For AVR enable the UART port used for the MMU. (e.g., mmuSerial) // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) - #define INTERNAL_SERIAL_PORT 2 - #define MMU2_SERIAL internalSerial + #define MMU2_SERIAL_PORT 2 + #define MMU2_SERIAL mmuSerial // Use hardware reset for MMU if a pin is defined for it //#define MMU2_RST_PIN 23 diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index af7e142679..41f1acd32f 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -96,19 +96,14 @@ typedef int8_t pin_t; #endif #endif -#ifdef DGUS_SERIAL_PORT - #if !WITHIN(DGUS_SERIAL_PORT, -1, 3) - #error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." +#ifdef LCD_SERIAL_PORT + #if !WITHIN(LCD_SERIAL_PORT, -1, 3) + #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif - #define DGUS_SERIAL internalDgusSerial - #define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.get_tx_buffer_free -#endif - -#ifdef ANYCUBIC_LCD_SERIAL_PORT - #if !WITHIN(ANYCUBIC_LCD_SERIAL_PORT, -1, 3) - #error "ANYCUBIC_LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #define LCD_SERIAL lcdSerial + #if HAS_DGUS_LCD + #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free() #endif - #define ANYCUBIC_LCD_SERIAL anycubicLcdSerial #endif // ------------------------ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 838627001d..63599efd41 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -40,407 +40,370 @@ #if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) - #include "MarlinSerial.h" - #include "../../MarlinCore.h" +#include "MarlinSerial.h" +#include "../../MarlinCore.h" + +#if ENABLED(DIRECT_STEPPING) + #include "../../feature/direct_stepping.h" +#endif + +template typename MarlinSerial::ring_buffer_r MarlinSerial::rx_buffer = { 0, 0, { 0 } }; +template typename MarlinSerial::ring_buffer_t MarlinSerial::tx_buffer = { 0 }; +template bool MarlinSerial::_written = false; +template uint8_t MarlinSerial::xon_xoff_state = MarlinSerial::XON_XOFF_CHAR_SENT | MarlinSerial::XON_CHAR; +template uint8_t MarlinSerial::rx_dropped_bytes = 0; +template uint8_t MarlinSerial::rx_buffer_overruns = 0; +template uint8_t MarlinSerial::rx_framing_errors = 0; +template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::rx_max_enqueued = 0; + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() asm volatile("": : :"memory"); + +#include "../../feature/e_parser.h" + +// "Atomically" read the RX head index value without disabling interrupts: +// This MUST be called with RX interrupts enabled, and CAN'T be called +// from the RX ISR itself! +template +FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_head() { + if (Cfg::RX_SIZE > 256) { + // Keep reading until 2 consecutive reads return the same value, + // meaning there was no update in-between caused by an interrupt. + // This works because serial RX interrupts happen at a slower rate + // than successive reads of a variable, so 2 consecutive reads with + // the same value means no interrupt updated it. + ring_buffer_pos_t vold, vnew = rx_buffer.head; + sw_barrier(); + do { + vold = vnew; + vnew = rx_buffer.head; + sw_barrier(); + } while (vold != vnew); + return vnew; + } + else { + // With an 8bit index, reads are always atomic. No need for special handling + return rx_buffer.head; + } +} + +template +volatile bool MarlinSerial::rx_tail_value_not_stable = false; +template +volatile uint16_t MarlinSerial::rx_tail_value_backup = 0; + +// Set RX tail index, taking into account the RX ISR could interrupt +// the write to this variable in the middle - So a backup strategy +// is used to ensure reads of the correct values. +// -Must NOT be called from the RX ISR - +template +FORCE_INLINE void MarlinSerial::atomic_set_rx_tail(typename MarlinSerial::ring_buffer_pos_t value) { + if (Cfg::RX_SIZE > 256) { + // Store the new value in the backup + rx_tail_value_backup = value; + sw_barrier(); + // Flag we are about to change the true value + rx_tail_value_not_stable = true; + sw_barrier(); + // Store the new value + rx_buffer.tail = value; + sw_barrier(); + // Signal the new value is completely stored into the value + rx_tail_value_not_stable = false; + sw_barrier(); + } + else + rx_buffer.tail = value; +} + +// Get the RX tail index, taking into account the read could be +// interrupting in the middle of the update of that index value +// -Called from the RX ISR - +template +FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_tail() { + if (Cfg::RX_SIZE > 256) { + // If the true index is being modified, return the backup value + if (rx_tail_value_not_stable) return rx_tail_value_backup; + } + // The true index is stable, return it + return rx_buffer.tail; +} + +// (called with RX interrupts disabled) +template +FORCE_INLINE void MarlinSerial::store_rxd_char() { + + static EmergencyParser::State emergency_state; // = EP_RESET + + // This must read the R_UCSRA register before reading the received byte to detect error causes + if (Cfg::DROPPED_RX && B_DOR && !++rx_dropped_bytes) --rx_dropped_bytes; + if (Cfg::RX_OVERRUNS && B_DOR && !++rx_buffer_overruns) --rx_buffer_overruns; + if (Cfg::RX_FRAMING_ERRORS && B_FE && !++rx_framing_errors) --rx_framing_errors; + + // Read the character from the USART + uint8_t c = R_UDR; #if ENABLED(DIRECT_STEPPING) - #include "../../feature/direct_stepping.h" + if (page_manager.maybe_store_rxd_char(c)) return; #endif - template typename MarlinSerial::ring_buffer_r MarlinSerial::rx_buffer = { 0, 0, { 0 } }; - template typename MarlinSerial::ring_buffer_t MarlinSerial::tx_buffer = { 0 }; - template bool MarlinSerial::_written = false; - template uint8_t MarlinSerial::xon_xoff_state = MarlinSerial::XON_XOFF_CHAR_SENT | MarlinSerial::XON_CHAR; - template uint8_t MarlinSerial::rx_dropped_bytes = 0; - template uint8_t MarlinSerial::rx_buffer_overruns = 0; - template uint8_t MarlinSerial::rx_framing_errors = 0; - template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::rx_max_enqueued = 0; + // Get the tail - Nothing can alter its value while this ISR is executing, but there's + // a chance that this ISR interrupted the main process while it was updating the index. + // The backup mechanism ensures the correct value is always returned. + const ring_buffer_pos_t t = atomic_read_rx_tail(); - // A SW memory barrier, to ensure GCC does not overoptimize loops - #define sw_barrier() asm volatile("": : :"memory"); + // Get the head pointer - This ISR is the only one that modifies its value, so it's safe to read here + ring_buffer_pos_t h = rx_buffer.head; - #include "../../feature/e_parser.h" + // Get the next element + ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - // "Atomically" read the RX head index value without disabling interrupts: - // This MUST be called with RX interrupts enabled, and CAN'T be called - // from the RX ISR itself! - template - FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_head() { - if (Cfg::RX_SIZE > 256) { - // Keep reading until 2 consecutive reads return the same value, - // meaning there was no update in-between caused by an interrupt. - // This works because serial RX interrupts happen at a slower rate - // than successive reads of a variable, so 2 consecutive reads with - // the same value means no interrupt updated it. - ring_buffer_pos_t vold, vnew = rx_buffer.head; - sw_barrier(); - do { - vold = vnew; - vnew = rx_buffer.head; - sw_barrier(); - } while (vold != vnew); - return vnew; - } - else { - // With an 8bit index, reads are always atomic. No need for special handling - return rx_buffer.head; - } + if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the RX FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; + + if (Cfg::MAX_RX_QUEUED) { + // Calculate count of bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // Keep track of the maximum count of enqueued bytes + NOLESS(rx_max_enqueued, rx_count); } - template - volatile bool MarlinSerial::rx_tail_value_not_stable = false; - template - volatile uint16_t MarlinSerial::rx_tail_value_backup = 0; + if (Cfg::XONOFF) { + // If the last char that was sent was an XON + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { - // Set RX tail index, taking into account the RX ISR could interrupt - // the write to this variable in the middle - So a backup strategy - // is used to ensure reads of the correct values. - // -Must NOT be called from the RX ISR - - template - FORCE_INLINE void MarlinSerial::atomic_set_rx_tail(typename MarlinSerial::ring_buffer_pos_t value) { - if (Cfg::RX_SIZE > 256) { - // Store the new value in the backup - rx_tail_value_backup = value; - sw_barrier(); - // Flag we are about to change the true value - rx_tail_value_not_stable = true; - sw_barrier(); - // Store the new value - rx_buffer.tail = value; - sw_barrier(); - // Signal the new value is completely stored into the value - rx_tail_value_not_stable = false; - sw_barrier(); - } - else - rx_buffer.tail = value; - } - - // Get the RX tail index, taking into account the read could be - // interrupting in the middle of the update of that index value - // -Called from the RX ISR - - template - FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_tail() { - if (Cfg::RX_SIZE > 256) { - // If the true index is being modified, return the backup value - if (rx_tail_value_not_stable) return rx_tail_value_backup; - } - // The true index is stable, return it - return rx_buffer.tail; - } - - // (called with RX interrupts disabled) - template - FORCE_INLINE void MarlinSerial::store_rxd_char() { - - static EmergencyParser::State emergency_state; // = EP_RESET - - // This must read the R_UCSRA register before reading the received byte to detect error causes - if (Cfg::DROPPED_RX && B_DOR && !++rx_dropped_bytes) --rx_dropped_bytes; - if (Cfg::RX_OVERRUNS && B_DOR && !++rx_buffer_overruns) --rx_buffer_overruns; - if (Cfg::RX_FRAMING_ERRORS && B_FE && !++rx_framing_errors) --rx_framing_errors; - - // Read the character from the USART - uint8_t c = R_UDR; - - #if ENABLED(DIRECT_STEPPING) - if (page_manager.maybe_store_rxd_char(c)) return; - #endif - - // Get the tail - Nothing can alter its value while this ISR is executing, but there's - // a chance that this ISR interrupted the main process while it was updating the index. - // The backup mechanism ensures the correct value is always returned. - const ring_buffer_pos_t t = atomic_read_rx_tail(); - - // Get the head pointer - This ISR is the only one that modifies its value, so it's safe to read here - ring_buffer_pos_t h = rx_buffer.head; - - // Get the next element - ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the RX FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; - - if (Cfg::MAX_RX_QUEUED) { - // Calculate count of bytes stored into the RX buffer + // Bytes stored into the RX buffer const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - // Keep track of the maximum count of enqueued bytes - NOLESS(rx_max_enqueued, rx_count); - } + // If over 12.5% of RX buffer capacity, send XOFF before running out of + // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react + // and stop sending bytes. This translates to 13mS propagation time. + if (rx_count >= (Cfg::RX_SIZE) / 8) { - if (Cfg::XONOFF) { - // If the last char that was sent was an XON - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { + // At this point, definitely no TX interrupt was executing, since the TX ISR can't be preempted. + // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens + // to be in the middle of trying to disable the RX interrupt in the main program, eventually the + // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure + // the sending of the XOFF char is to send it HERE AND NOW. - // Bytes stored into the RX buffer - const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + // About to send the XOFF char + xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; - // If over 12.5% of RX buffer capacity, send XOFF before running out of - // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react - // and stop sending bytes. This translates to 13mS propagation time. - if (rx_count >= (Cfg::RX_SIZE) / 8) { + // Wait until the TX register becomes empty and send it - Here there could be a problem + // - While waiting for the TX register to empty, the RX register could receive a new + // character. This must also handle that situation! + while (!B_UDRE) { - // At this point, definitely no TX interrupt was executing, since the TX ISR can't be preempted. - // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens - // to be in the middle of trying to disable the RX interrupt in the main program, eventually the - // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure - // the sending of the XOFF char is to send it HERE AND NOW. + if (B_RXC) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! - // About to send the XOFF char - xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - // Wait until the TX register becomes empty and send it - Here there could be a problem - // - While waiting for the TX register to empty, the RX register could receive a new - // character. This must also handle that situation! - while (!B_UDRE) { + // Read the character from the USART + c = R_UDR; - if (B_RXC) { - // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); - i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // Read the character from the USART - c = R_UDR; - - if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; } - sw_barrier(); + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; } - - R_UDR = XOFF_CHAR; - - // Clear the TXC bit -- "can be cleared by writing a one to its bit - // location". This makes sure flush() won't return until the bytes - // actually got written - B_TXC = 1; - - // At this point there could be a race condition between the write() function - // and this sending of the XOFF char. This interrupt could happen between the - // wait to be empty TX buffer loop and the actual write of the character. Since - // the TX buffer is full because it's sending the XOFF char, the only way to be - // sure the write() function will succeed is to wait for the XOFF char to be - // completely sent. Since an extra character could be received during the wait - // it must also be handled! - while (!B_UDRE) { - - if (B_RXC) { - // A char arrived while waiting for the TX buffer to be empty - Receive and process it! - - i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // Read the character from the USART - c = R_UDR; - - if (Cfg::EMERGENCYPARSER) - emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; - } - sw_barrier(); - } - - // At this point everything is ready. The write() function won't - // have any issues writing to the UART TX register if it needs to! + sw_barrier(); } + + R_UDR = XOFF_CHAR; + + // Clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + B_TXC = 1; + + // At this point there could be a race condition between the write() function + // and this sending of the XOFF char. This interrupt could happen between the + // wait to be empty TX buffer loop and the actual write of the character. Since + // the TX buffer is full because it's sending the XOFF char, the only way to be + // sure the write() function will succeed is to wait for the XOFF char to be + // completely sent. Since an extra character could be received during the wait + // it must also be handled! + while (!B_UDRE) { + + if (B_RXC) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // Read the character from the USART + c = R_UDR; + + if (Cfg::EMERGENCYPARSER) + emergency_parser.update(emergency_state, c); + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; + } + sw_barrier(); + } + + // At this point everything is ready. The write() function won't + // have any issues writing to the UART TX register if it needs to! } } - - // Store the new head value - The main loop will retry until the value is stable - rx_buffer.head = h; } - // (called with TX irqs disabled) - template - FORCE_INLINE void MarlinSerial::_tx_udr_empty_irq() { - if (Cfg::TX_SIZE > 0) { - // Read positions - uint8_t t = tx_buffer.tail; - const uint8_t h = tx_buffer.head; + // Store the new head value - The main loop will retry until the value is stable + rx_buffer.head = h; +} - if (Cfg::XONOFF) { - // If an XON char is pending to be sent, do it now - if (xon_xoff_state == XON_CHAR) { +// (called with TX irqs disabled) +template +FORCE_INLINE void MarlinSerial::_tx_udr_empty_irq() { + if (Cfg::TX_SIZE > 0) { + // Read positions + uint8_t t = tx_buffer.tail; + const uint8_t h = tx_buffer.head; - // Send the character - R_UDR = XON_CHAR; + if (Cfg::XONOFF) { + // If an XON char is pending to be sent, do it now + if (xon_xoff_state == XON_CHAR) { - // clear the TXC bit -- "can be cleared by writing a one to its bit - // location". This makes sure flush() won't return until the bytes - // actually got written - B_TXC = 1; + // Send the character + R_UDR = XON_CHAR; - // Remember we sent it. - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + // clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + B_TXC = 1; - // If nothing else to transmit, just disable TX interrupts. - if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + // Remember we sent it. + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - return; - } - } + // If nothing else to transmit, just disable TX interrupts. + if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) - // If nothing to transmit, just disable TX interrupts. This could - // happen as the result of the non atomicity of the disabling of RX - // interrupts that could end reenabling TX interrupts as a side effect. - if (h == t) { - B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) return; } - - // There is something to TX, Send the next byte - const uint8_t c = tx_buffer.buffer[t]; - t = (t + 1) & (Cfg::TX_SIZE - 1); - R_UDR = c; - tx_buffer.tail = t; - - // Clear the TXC bit (by writing a one to its bit location). - // Ensures flush() won't return until the bytes are actually written/ - B_TXC = 1; - - // Disable interrupts if there is nothing to transmit following this byte - if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) - } - } - - // Public Methods - template - void MarlinSerial::begin(const long baud) { - uint16_t baud_setting; - bool useU2X = true; - - #if F_CPU == 16000000UL && SERIAL_PORT == 0 - // Hard-coded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards, and the firmware on the - // 8U2 on the Uno and Mega 2560. - if (baud == 57600) useU2X = false; - #endif - - R_UCSRA = 0; - if (useU2X) { - B_U2X = 1; - baud_setting = (F_CPU / 4 / baud - 1) / 2; - } - else - baud_setting = (F_CPU / 8 / baud - 1) / 2; - - // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) - R_UBRRH = baud_setting >> 8; - R_UBRRL = baud_setting; - - B_RXEN = 1; - B_TXEN = 1; - B_RXCIE = 1; - if (Cfg::TX_SIZE > 0) B_UDRIE = 0; - _written = false; - } - - template - void MarlinSerial::end() { - B_RXEN = 0; - B_TXEN = 0; - B_RXCIE = 0; - B_UDRIE = 0; - } - - template - int MarlinSerial::peek() { - const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; - return h == t ? -1 : rx_buffer.buffer[t]; - } - - template - int MarlinSerial::read() { - const ring_buffer_pos_t h = atomic_read_rx_head(); - - // Read the tail. Main thread owns it, so it is safe to directly read it - ring_buffer_pos_t t = rx_buffer.tail; - - // If nothing to read, return now - if (h == t) return -1; - - // Get the next char - const int v = rx_buffer.buffer[t]; - t = (ring_buffer_pos_t)(t + 1) & (Cfg::RX_SIZE - 1); - - // Advance tail - Making sure the RX ISR will always get an stable value, even - // if it interrupts the writing of the value of that variable in the middle. - atomic_set_rx_tail(t); - - if (Cfg::XONOFF) { - // If the XOFF char was sent, or about to be sent... - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { - // Get count of bytes in the RX buffer - const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - if (rx_count < (Cfg::RX_SIZE) / 10) { - if (Cfg::TX_SIZE > 0) { - // Signal we want an XON character to be sent. - xon_xoff_state = XON_CHAR; - // Enable TX ISR. Non atomic, but it will eventually enable them - B_UDRIE = 1; - } - else { - // If not using TX interrupts, we must send the XON char now - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - while (!B_UDRE) sw_barrier(); - R_UDR = XON_CHAR; - } - } - } } - return v; + // If nothing to transmit, just disable TX interrupts. This could + // happen as the result of the non atomicity of the disabling of RX + // interrupts that could end reenabling TX interrupts as a side effect. + if (h == t) { + B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + return; + } + + // There is something to TX, Send the next byte + const uint8_t c = tx_buffer.buffer[t]; + t = (t + 1) & (Cfg::TX_SIZE - 1); + R_UDR = c; + tx_buffer.tail = t; + + // Clear the TXC bit (by writing a one to its bit location). + // Ensures flush() won't return until the bytes are actually written/ + B_TXC = 1; + + // Disable interrupts if there is nothing to transmit following this byte + if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) } +} - template - typename MarlinSerial::ring_buffer_pos_t MarlinSerial::available() { - const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; - return (ring_buffer_pos_t)(Cfg::RX_SIZE + h - t) & (Cfg::RX_SIZE - 1); +// Public Methods +template +void MarlinSerial::begin(const long baud) { + uint16_t baud_setting; + bool useU2X = true; + + #if F_CPU == 16000000UL && SERIAL_PORT == 0 + // Hard-coded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards, and the firmware on the + // 8U2 on the Uno and Mega 2560. + if (baud == 57600) useU2X = false; + #endif + + R_UCSRA = 0; + if (useU2X) { + B_U2X = 1; + baud_setting = (F_CPU / 4 / baud - 1) / 2; } + else + baud_setting = (F_CPU / 8 / baud - 1) / 2; - template - void MarlinSerial::flush() { + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + R_UBRRH = baud_setting >> 8; + R_UBRRL = baud_setting; - // Set the tail to the head: - // - Read the RX head index in a safe way. (See atomic_read_rx_head.) - // - Set the tail, making sure the RX ISR will always get a stable value, even - // if it interrupts the writing of the value of that variable in the middle. - atomic_set_rx_tail(atomic_read_rx_head()); + B_RXEN = 1; + B_TXEN = 1; + B_RXCIE = 1; + if (Cfg::TX_SIZE > 0) B_UDRIE = 0; + _written = false; +} - if (Cfg::XONOFF) { - // If the XOFF char was sent, or about to be sent... - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { +template +void MarlinSerial::end() { + B_RXEN = 0; + B_TXEN = 0; + B_RXCIE = 0; + B_UDRIE = 0; +} + +template +int MarlinSerial::peek() { + const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; + return h == t ? -1 : rx_buffer.buffer[t]; +} + +template +int MarlinSerial::read() { + const ring_buffer_pos_t h = atomic_read_rx_head(); + + // Read the tail. Main thread owns it, so it is safe to directly read it + ring_buffer_pos_t t = rx_buffer.tail; + + // If nothing to read, return now + if (h == t) return -1; + + // Get the next char + const int v = rx_buffer.buffer[t]; + t = (ring_buffer_pos_t)(t + 1) & (Cfg::RX_SIZE - 1); + + // Advance tail - Making sure the RX ISR will always get an stable value, even + // if it interrupts the writing of the value of that variable in the middle. + atomic_set_rx_tail(t); + + if (Cfg::XONOFF) { + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + // Get count of bytes in the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + if (rx_count < (Cfg::RX_SIZE) / 10) { if (Cfg::TX_SIZE > 0) { // Signal we want an XON character to be sent. xon_xoff_state = XON_CHAR; - // Enable TX ISR. Non atomic, but it will eventually enable it. + // Enable TX ISR. Non atomic, but it will eventually enable them B_UDRIE = 1; } else { @@ -453,363 +416,384 @@ } } - template - void MarlinSerial::write(const uint8_t c) { - if (Cfg::TX_SIZE == 0) { + return v; +} - _written = true; - while (!B_UDRE) sw_barrier(); +template +typename MarlinSerial::ring_buffer_pos_t MarlinSerial::available() { + const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; + return (ring_buffer_pos_t)(Cfg::RX_SIZE + h - t) & (Cfg::RX_SIZE - 1); +} + +template +void MarlinSerial::flush() { + + // Set the tail to the head: + // - Read the RX head index in a safe way. (See atomic_read_rx_head.) + // - Set the tail, making sure the RX ISR will always get a stable value, even + // if it interrupts the writing of the value of that variable in the middle. + atomic_set_rx_tail(atomic_read_rx_head()); + + if (Cfg::XONOFF) { + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + if (Cfg::TX_SIZE > 0) { + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX ISR. Non atomic, but it will eventually enable it. + B_UDRIE = 1; + } + else { + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!B_UDRE) sw_barrier(); + R_UDR = XON_CHAR; + } + } + } +} + +template +void MarlinSerial::write(const uint8_t c) { + if (Cfg::TX_SIZE == 0) { + + _written = true; + while (!B_UDRE) sw_barrier(); + R_UDR = c; + + } + else { + + _written = true; + + // If the TX interrupts are disabled and the data register + // is empty, just write the byte to the data register and + // be done. This shortcut helps significantly improve the + // effective datarate at high (>500kbit/s) bitrates, where + // interrupt overhead becomes a slowdown. + // Yes, there is a race condition between the sending of the + // XOFF char at the RX ISR, but it is properly handled there + if (!B_UDRIE && B_UDRE) { R_UDR = c; + // clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + B_TXC = 1; + return; + } + + const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Make room by polling if it is possible to transmit, and do so! + while (i == tx_buffer.tail) { + + // If we can transmit another byte, do it. + if (B_UDRE) _tx_udr_empty_irq(); + + // Make sure compiler rereads tx_buffer.tail + sw_barrier(); + } } else { - - _written = true; - - // If the TX interrupts are disabled and the data register - // is empty, just write the byte to the data register and - // be done. This shortcut helps significantly improve the - // effective datarate at high (>500kbit/s) bitrates, where - // interrupt overhead becomes a slowdown. - // Yes, there is a race condition between the sending of the - // XOFF char at the RX ISR, but it is properly handled there - if (!B_UDRIE && B_UDRE) { - R_UDR = c; - - // clear the TXC bit -- "can be cleared by writing a one to its bit - // location". This makes sure flush() won't return until the bytes - // actually got written - B_TXC = 1; - return; - } - - const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); - - // If global interrupts are disabled (as the result of being called from an ISR)... - if (!ISRS_ENABLED()) { - - // Make room by polling if it is possible to transmit, and do so! - while (i == tx_buffer.tail) { - - // If we can transmit another byte, do it. - if (B_UDRE) _tx_udr_empty_irq(); - - // Make sure compiler rereads tx_buffer.tail - sw_barrier(); - } - } - else { - // Interrupts are enabled, just wait until there is space - while (i == tx_buffer.tail) sw_barrier(); - } - - // Store new char. head is always safe to move - tx_buffer.buffer[tx_buffer.head] = c; - tx_buffer.head = i; - - // Enable TX ISR - Non atomic, but it will eventually enable TX ISR - B_UDRIE = 1; + // Interrupts are enabled, just wait until there is space + while (i == tx_buffer.tail) sw_barrier(); } + + // Store new char. head is always safe to move + tx_buffer.buffer[tx_buffer.head] = c; + tx_buffer.head = i; + + // Enable TX ISR - Non atomic, but it will eventually enable TX ISR + B_UDRIE = 1; } +} - template - void MarlinSerial::flushTX() { +template +void MarlinSerial::flushTX() { - if (Cfg::TX_SIZE == 0) { - // No bytes written, no need to flush. This special case is needed since there's - // no way to force the TXC (transmit complete) bit to 1 during initialization. - if (!_written) return; + if (Cfg::TX_SIZE == 0) { + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + // Wait until everything was transmitted + while (!B_TXC) sw_barrier(); + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + + } + else { + + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Wait until everything was transmitted - We must do polling, as interrupts are disabled + while (tx_buffer.head != tx_buffer.tail || !B_TXC) { + + // If there is more space, send an extra character + if (B_UDRE) _tx_udr_empty_irq(); + + sw_barrier(); + } + + } + else { // Wait until everything was transmitted - while (!B_TXC) sw_barrier(); - - // At this point nothing is queued anymore (DRIE is disabled) and - // the hardware finished transmission (TXC is set). - - } - else { - - // No bytes written, no need to flush. This special case is needed since there's - // no way to force the TXC (transmit complete) bit to 1 during initialization. - if (!_written) return; - - // If global interrupts are disabled (as the result of being called from an ISR)... - if (!ISRS_ENABLED()) { - - // Wait until everything was transmitted - We must do polling, as interrupts are disabled - while (tx_buffer.head != tx_buffer.tail || !B_TXC) { - - // If there is more space, send an extra character - if (B_UDRE) _tx_udr_empty_irq(); - - sw_barrier(); - } - - } - else { - // Wait until everything was transmitted - while (tx_buffer.head != tx_buffer.tail || !B_TXC) sw_barrier(); - } - - // At this point nothing is queued anymore (DRIE is disabled) and - // the hardware finished transmission (TXC is set). - } - } - - /** - * Imports from print.h - */ - - template - void MarlinSerial::print(char c, int base) { - print((long)c, base); - } - - template - void MarlinSerial::print(unsigned char b, int base) { - print((unsigned long)b, base); - } - - template - void MarlinSerial::print(int n, int base) { - print((long)n, base); - } - - template - void MarlinSerial::print(unsigned int n, int base) { - print((unsigned long)n, base); - } - - template - void MarlinSerial::print(long n, int base) { - if (base == 0) write(n); - else if (base == 10) { - if (n < 0) { print('-'); n = -n; } - printNumber(n, 10); - } - else - printNumber(n, base); - } - - template - void MarlinSerial::print(unsigned long n, int base) { - if (base == 0) write(n); - else printNumber(n, base); - } - - template - void MarlinSerial::print(double n, int digits) { - printFloat(n, digits); - } - - template - void MarlinSerial::println() { - print('\r'); - print('\n'); - } - - template - void MarlinSerial::println(const String& s) { - print(s); - println(); - } - - template - void MarlinSerial::println(const char c[]) { - print(c); - println(); - } - - template - void MarlinSerial::println(char c, int base) { - print(c, base); - println(); - } - - template - void MarlinSerial::println(unsigned char b, int base) { - print(b, base); - println(); - } - - template - void MarlinSerial::println(int n, int base) { - print(n, base); - println(); - } - - template - void MarlinSerial::println(unsigned int n, int base) { - print(n, base); - println(); - } - - template - void MarlinSerial::println(long n, int base) { - print(n, base); - println(); - } - - template - void MarlinSerial::println(unsigned long n, int base) { - print(n, base); - println(); - } - - template - void MarlinSerial::println(double n, int digits) { - print(n, digits); - println(); - } - - // Private Methods - - template - void MarlinSerial::printNumber(unsigned long n, uint8_t base) { - if (n) { - unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 - int8_t i = 0; - while (n) { - buf[i++] = n % base; - n /= base; - } - while (i--) - print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); - } - else - print('0'); - } - - template - void MarlinSerial::printFloat(double number, uint8_t digits) { - // Handle negative numbers - if (number < 0.0) { - print('-'); - number = -number; + while (tx_buffer.head != tx_buffer.tail || !B_TXC) sw_barrier(); } - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - LOOP_L_N(i, digits) rounding *= 0.1; - number += rounding; + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } +} - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); +/** + * Imports from print.h + */ - // Print the decimal point, but only if there are digits beyond - if (digits) { - print('.'); - // Extract digits from the remainder one at a time - while (digits--) { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } +template +void MarlinSerial::print(char c, int base) { + print((long)c, base); +} + +template +void MarlinSerial::print(unsigned char b, int base) { + print((unsigned long)b, base); +} + +template +void MarlinSerial::print(int n, int base) { + print((long)n, base); +} + +template +void MarlinSerial::print(unsigned int n, int base) { + print((unsigned long)n, base); +} + +template +void MarlinSerial::print(long n, int base) { + if (base == 0) write(n); + else if (base == 10) { + if (n < 0) { print('-'); n = -n; } + printNumber(n, 10); + } + else + printNumber(n, base); +} + +template +void MarlinSerial::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); +} + +template +void MarlinSerial::print(double n, int digits) { + printFloat(n, digits); +} + +template +void MarlinSerial::println() { + print('\r'); + print('\n'); +} + +template +void MarlinSerial::println(const String& s) { + print(s); + println(); +} + +template +void MarlinSerial::println(const char c[]) { + print(c); + println(); +} + +template +void MarlinSerial::println(char c, int base) { + print(c, base); + println(); +} + +template +void MarlinSerial::println(unsigned char b, int base) { + print(b, base); + println(); +} + +template +void MarlinSerial::println(int n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(unsigned int n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(long n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(unsigned long n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(double n, int digits) { + print(n, digits); + println(); +} + +// Private Methods + +template +void MarlinSerial::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); +} + +template +void MarlinSerial::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + LOOP_L_N(i, digits) rounding *= 0.1; + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; } } +} + +// Hookup ISR handlers +ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) { + MarlinSerial>::store_rxd_char(); +} + +ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); +} + +// Preinstantiate +template class MarlinSerial>; + +// Instantiate +MarlinSerial> customizedSerial1; + +#ifdef SERIAL_PORT_2 // Hookup ISR handlers - ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) { - MarlinSerial>::store_rxd_char(); + ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _RX_vect)) { + MarlinSerial>::store_rxd_char(); } - ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); + ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); } // Preinstantiate - template class MarlinSerial>; + template class MarlinSerial>; // Instantiate - MarlinSerial> customizedSerial1; + MarlinSerial> customizedSerial2; - #ifdef SERIAL_PORT_2 +#endif - // Hookup ISR handlers - ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _RX_vect)) { - MarlinSerial>::store_rxd_char(); +#ifdef MMU2_SERIAL_PORT + + ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _RX_vect)) { + MarlinSerial>::store_rxd_char(); + } + + ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); + } + + // Preinstantiate + template class MarlinSerial>; + + // Instantiate + MarlinSerial> mmuSerial; + +#endif + +#ifdef LCD_SERIAL_PORT + + ISR(SERIAL_REGNAME(USART, LCD_SERIAL_PORT, _RX_vect)) { + MarlinSerial>::store_rxd_char(); + } + + ISR(SERIAL_REGNAME(USART, LCD_SERIAL_PORT, _UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); + } + + // Preinstantiate + template class MarlinSerial>; + + // Instantiate + MarlinSerial> lcdSerial; + + #if HAS_DGUS_LCD + template + typename MarlinSerial::ring_buffer_pos_t MarlinSerial::get_tx_buffer_free() { + const ring_buffer_pos_t t = tx_buffer.tail, // next byte to send. + h = tx_buffer.head; // next pos for queue. + int ret = t - h - 1; + if (ret < 0) ret += Cfg::TX_SIZE + 1; + return ret; } - - ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); - } - - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> customizedSerial2; - #endif +#endif + #endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) -#ifdef INTERNAL_SERIAL_PORT - - ISR(SERIAL_REGNAME(USART, INTERNAL_SERIAL_PORT, _RX_vect)) { - MarlinSerial>::store_rxd_char(); - } - - ISR(SERIAL_REGNAME(USART, INTERNAL_SERIAL_PORT, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); - } - - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> internalSerial; - -#endif - -#ifdef DGUS_SERIAL_PORT - - template - typename MarlinSerial::ring_buffer_pos_t MarlinSerial::get_tx_buffer_free() { - const ring_buffer_pos_t t = tx_buffer.tail, // next byte to send. - h = tx_buffer.head; // next pos for queue. - int ret = t - h - 1; - if (ret < 0) ret += Cfg::TX_SIZE + 1; - return ret; - } - - ISR(SERIAL_REGNAME(USART, DGUS_SERIAL_PORT, _RX_vect)) { - MarlinSerial>::store_rxd_char(); - } - - ISR(SERIAL_REGNAME(USART, DGUS_SERIAL_PORT, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); - } - - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> internalDgusSerial; - -#endif - -#ifdef ANYCUBIC_LCD_SERIAL_PORT - - ISR(SERIAL_REGNAME(USART, ANYCUBIC_LCD_SERIAL_PORT, _RX_vect)) { - MarlinSerial>::store_rxd_char(); - } - - ISR(SERIAL_REGNAME(USART, ANYCUBIC_LCD_SERIAL_PORT, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); - } - - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> anycubicLcdSerial; - -#endif - // For AT90USB targets use the UART for BT interfacing #if defined(USBCON) && ENABLED(BLUETOOTH) HardwareSerial bluetoothSerial; diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 8dbed4d85b..cb906e2b65 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -217,10 +217,12 @@ static ring_buffer_pos_t available(); static void write(const uint8_t c); static void flushTX(); - #ifdef DGUS_SERIAL_PORT + #if HAS_DGUS_LCD static ring_buffer_pos_t get_tx_buffer_free(); #endif + static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } + FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } @@ -278,55 +280,50 @@ #endif // !USBCON -#ifdef INTERNAL_SERIAL_PORT +#ifdef MMU2_SERIAL_PORT template - struct MarlinInternalSerialCfg { + struct MMU2SerialCfg { static constexpr int PORT = serial; + static constexpr bool XONOFF = false; + static constexpr bool EMERGENCYPARSER = false; + static constexpr bool DROPPED_RX = false; + static constexpr bool RX_FRAMING_ERRORS = false; + static constexpr bool MAX_RX_QUEUED = false; static constexpr unsigned int RX_SIZE = 32; static constexpr unsigned int TX_SIZE = 32; - static constexpr bool XONOFF = false; - static constexpr bool EMERGENCYPARSER = false; - static constexpr bool DROPPED_RX = false; static constexpr bool RX_OVERRUNS = false; - static constexpr bool RX_FRAMING_ERRORS = false; - static constexpr bool MAX_RX_QUEUED = false; }; - extern MarlinSerial> internalSerial; + extern MarlinSerial> mmuSerial; #endif -#ifdef DGUS_SERIAL_PORT +#ifdef LCD_SERIAL_PORT + template - struct MarlinInternalSerialCfg { - static constexpr int PORT = serial; - static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE; - static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE; - static constexpr bool XONOFF = false; - static constexpr bool EMERGENCYPARSER = false; - static constexpr bool DROPPED_RX = false; - static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS); - static constexpr bool RX_FRAMING_ERRORS = false; - static constexpr bool MAX_RX_QUEUED = false; + struct LCDSerialCfg { + static constexpr int PORT = serial; + static constexpr bool XONOFF = false; + static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); + static constexpr bool DROPPED_RX = false; + static constexpr bool RX_FRAMING_ERRORS = false; + static constexpr bool MAX_RX_QUEUED = false; + #if HAS_DGUS_LCD + static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE; + static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE; + static constexpr bool RX_OVERRUNS = ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS); + #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + static constexpr unsigned int RX_SIZE = 64; + static constexpr unsigned int TX_SIZE = 128; + static constexpr bool RX_OVERRUNS = false; + #else + static constexpr unsigned int RX_SIZE = 64; + static constexpr unsigned int TX_SIZE = 128; + static constexpr bool RX_OVERRUNS = false + #endif }; - extern MarlinSerial> internalDgusSerial; -#endif + extern MarlinSerial> lcdSerial; -#ifdef ANYCUBIC_LCD_SERIAL_PORT - template - struct AnycubicLcdSerialCfg { - static constexpr int PORT = serial; - static constexpr unsigned int RX_SIZE = 64; - static constexpr unsigned int TX_SIZE = 128; - static constexpr bool XONOFF = false; - static constexpr bool EMERGENCYPARSER = false; - static constexpr bool DROPPED_RX = false; - static constexpr bool RX_OVERRUNS = false; - static constexpr bool RX_FRAMING_ERRORS = false; - static constexpr bool MAX_RX_QUEUED = false; - }; - - extern MarlinSerial> anycubicLcdSerial; #endif // Use the UART for Bluetooth in AT90USB configurations diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 974f1ccc16..7a057fdae4 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -61,13 +61,13 @@ #endif #endif -#ifdef DGUS_SERIAL_PORT - #if DGUS_SERIAL_PORT == -1 - #define DGUS_SERIAL internalDgusSerial - #elif WITHIN(DGUS_SERIAL_PORT, 0, 3) - #define DGUS_SERIAL MSERIAL(DGUS_SERIAL_PORT) +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL lcdSerial + #elif WITHIN(LCD_SERIAL_PORT, 0, 3) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else - #error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #endif diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h index dfafa15141..a194eba2f3 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.h +++ b/Marlin/src/HAL/DUE/MarlinSerial.h @@ -122,6 +122,8 @@ public: static void write(const uint8_t c); static void flushTX(); + static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } + FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h index 154e95aec2..94e0c758ee 100644 --- a/Marlin/src/HAL/LINUX/include/serial.h +++ b/Marlin/src/HAL/LINUX/include/serial.h @@ -79,6 +79,7 @@ public: #if ENABLED(EMERGENCY_PARSER) EmergencyParser::State emergency_state; + static inline bool emergency_parser_enabled() { return true; } #endif HalSerial() { host_connected = true; } diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index e9f05fcc61..3118aed1b2 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -85,13 +85,13 @@ extern "C" volatile uint32_t _millis; #endif #endif -#ifdef DGUS_SERIAL_PORT - #if DGUS_SERIAL_PORT == -1 - #define DGUS_SERIAL UsbSerial - #elif WITHIN(DGUS_SERIAL_PORT, 0, 3) - #define DGUS_SERIAL MSERIAL(DGUS_SERIAL_PORT) +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL UsbSerial + #elif WITHIN(LCD_SERIAL_PORT, 0, 3) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else - #error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #endif diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index c3fb3bd0e4..5374e005d3 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -24,28 +24,28 @@ #include "../../inc/MarlinConfigPre.h" #include "MarlinSerial.h" -#if (defined(SERIAL_PORT) && SERIAL_PORT == 0) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == 0) || (defined(DGUS_SERIAL_PORT) && DGUS_SERIAL_PORT == 0) +#if USING_SERIAL_0 MarlinSerial MSerial(LPC_UART0); extern "C" void UART0_IRQHandler() { MSerial.IRQHandler(); } #endif -#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1 +#if USING_SERIAL_1 MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1); extern "C" void UART1_IRQHandler() { MSerial1.IRQHandler(); } #endif -#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2 +#if USING_SERIAL_2 MarlinSerial MSerial2(LPC_UART2); extern "C" void UART2_IRQHandler() { MSerial2.IRQHandler(); } #endif -#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3 +#if USING_SERIAL_3 MarlinSerial MSerial3(LPC_UART3); extern "C" void UART3_IRQHandler() { MSerial3.IRQHandler(); diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h index 98ce73d377..8d6b64378a 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.h +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.h @@ -57,6 +57,7 @@ public: } EmergencyParser::State emergency_state; + static inline bool emergency_parser_enabled() { return true; } #endif }; diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 2ca8a29da4..b6491368cd 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -92,7 +92,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #define ANY_TX(N,V...) DO(IS_TX##N,||,V) #define ANY_RX(N,V...) DO(IS_RX##N,||,V) -#if (defined(SERIAL_PORT) && SERIAL_PORT == 0) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == 0) || (defined(DGUS_SERIAL_PORT) && DGUS_SERIAL_PORT == 0) +#if USING_SERIAL_0 #define IS_TX0(P) (P == P0_02) #define IS_RX0(P) (P == P0_03) #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) @@ -106,7 +106,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef IS_RX0 #endif -#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1 +#if USING_SERIAL_1 #define IS_TX1(P) (P == P0_15) #define IS_RX1(P) (P == P0_16) #define _IS_TX1_1 IS_TX1 @@ -127,7 +127,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef _IS_RX1_1 #endif -#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2 +#if USING_SERIAL_2 #define IS_TX2(P) (P == P0_10) #define IS_RX2(P) (P == P0_11) #define _IS_TX2_1 IS_TX2 @@ -161,7 +161,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef _IS_RX2_1 #endif -#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3 +#if USING_SERIAL_3 #define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00) #define PIN_IS_RX3(P) (P##_PIN == P0_01) #if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX) diff --git a/Marlin/src/HAL/LPC1768/usb_serial.cpp b/Marlin/src/HAL/LPC1768/usb_serial.cpp index 63a570efdf..d225ce4188 100644 --- a/Marlin/src/HAL/LPC1768/usb_serial.cpp +++ b/Marlin/src/HAL/LPC1768/usb_serial.cpp @@ -26,7 +26,9 @@ #if ENABLED(EMERGENCY_PARSER) #include "../../feature/e_parser.h" + EmergencyParser::State emergency_state; + bool CDC_RecvCallback(const char buffer) { emergency_parser.update(emergency_state, buffer); return true; diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index c72613e772..7fd826a1b6 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -56,13 +56,13 @@ #endif #endif - #ifdef DGUS_SERIAL_PORT - #if DGUS_SERIAL_PORT == -1 - #define DGUS_SERIAL Serial - #elif WITHIN(DGUS_SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(DGUS_SERIAL_PORT) + #ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL Serial + #elif WITHIN(LCD_SERIAL_PORT, 0, 3) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else - #error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 9ec2d5c19e..60ab45374a 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -64,18 +64,7 @@ #endif #endif -#if HAS_DGUS_LCD - #if DGUS_SERIAL_PORT == -1 - #define DGUS_SERIAL SerialUSB - #elif WITHIN(DGUS_SERIAL_PORT, 1, 6) - #define DGUS_SERIAL MSERIAL(DGUS_SERIAL_PORT) - #else - #error "DGUS_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." - #endif - #define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.availableForWrite -#endif - -#if ENABLED(MALYAN_LCD) +#ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 #define LCD_SERIAL SerialUSB #elif WITHIN(LCD_SERIAL_PORT, 1, 6) @@ -83,6 +72,9 @@ #else #error "LCD_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." #endif + #if HAS_DGUS_LCD + #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() + #endif #endif /** diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index 2d799ea54d..a146664366 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -49,8 +49,8 @@ DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) #endif -#if defined(DGUS_SERIAL_PORT) && DGUS_SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(DGUS_SERIAL_PORT) +#if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0 + DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT) #endif void MarlinSerial::begin(unsigned long baud, uint8_t config) { diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h index 5ab97ff3a9..3611cc78d7 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -35,6 +35,10 @@ public: #endif { } + #if ENABLED(EMERGENCY_PARSER) + static inline bool emergency_parser_enabled() { return true; } + #endif + void begin(unsigned long baud, uint8_t config); inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 0f3c3e1460..5c03593eb0 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -68,71 +68,49 @@ #endif #endif -#if SERIAL_PORT == 0 - #error "SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." -#elif SERIAL_PORT == -1 - #define MYSERIAL0 UsbSerial -#elif SERIAL_PORT == 1 - #define MYSERIAL0 MSerial1 -#elif SERIAL_PORT == 2 - #define MYSERIAL0 MSerial2 -#elif SERIAL_PORT == 3 - #define MYSERIAL0 MSerial3 -#elif SERIAL_PORT == 4 - #define MYSERIAL0 MSerial4 -#elif SERIAL_PORT == 5 - #define MYSERIAL0 MSerial5 +#define _MSERIAL(X) MSerial##X +#define MSERIAL(X) _MSERIAL(X) + +#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + #define NUM_UARTS 5 #else - #error "SERIAL_PORT must be from -1 to 5. Please update your configuration." + #define NUM_UARTS 3 +#endif + +#if SERIAL_PORT == -1 + #define MYSERIAL0 UsbSerial +#elif WITHIN(SERIAL_PORT, 1, NUM_UARTS) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#elif NUM_UARTS == 5 + #error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." +#else + #error "SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == 0 - #error "SERIAL_PORT_2 cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration." - #elif SERIAL_PORT_2 == -1 + #if SERIAL_PORT_2 == -1 #define MYSERIAL1 UsbSerial - #elif SERIAL_PORT_2 == 1 - #define MYSERIAL1 MSerial1 - #elif SERIAL_PORT_2 == 2 - #define MYSERIAL1 MSerial2 - #elif SERIAL_PORT_2 == 3 - #define MYSERIAL1 MSerial3 - #elif SERIAL_PORT_2 == 4 - #define MYSERIAL1 MSerial4 - #elif SERIAL_PORT_2 == 5 - #define MYSERIAL1 MSerial5 + #elif WITHIN(SERIAL_PORT_2, 1, NUM_UARTS) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #elif NUM_UARTS == 5 + #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration." #else - #error "SERIAL_PORT_2 must be from -1 to 5. Please update your configuration." + #error "SERIAL_PORT_2 must be -1 or from 1 to 3. Please update your configuration." #endif #endif -#ifdef DGUS_SERIAL_PORT - #if DGUS_SERIAL_PORT == 0 - #error "DGUS_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif DGUS_SERIAL_PORT == SERIAL_PORT - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 - #error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." - #elif DGUS_SERIAL_PORT == -1 - #define DGUS_SERIAL UsbSerial - #elif DGUS_SERIAL_PORT == 1 - #define DGUS_SERIAL MSerial1 - #elif DGUS_SERIAL_PORT == 2 - #define DGUS_SERIAL MSerial2 - #elif DGUS_SERIAL_PORT == 3 - #define DGUS_SERIAL MSerial3 - #elif DGUS_SERIAL_PORT == 4 - #define DGUS_SERIAL MSerial4 - #elif DGUS_SERIAL_PORT == 5 - #define DGUS_SERIAL MSerial5 +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL UsbSerial + #elif WITHIN(LCD_SERIAL_PORT, 1, NUM_UARTS) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) + #elif NUM_UARTS == 5 + #error "LCD_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." #else - #error "DGUS_SERIAL_PORT must be from -1 to 5. Please update your configuration." + #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." #endif #endif - // Set interrupt grouping for this MCU void HAL_init(); #define HAL_IDLETASK 1 diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index 9a48e901f4..ebf11cb429 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -22,7 +22,7 @@ #ifdef __STM32F1__ -#include "../../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfig.h" #include "MarlinSerial.h" #include @@ -53,7 +53,8 @@ static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb rb_push_insert(rb, c); #endif #if ENABLED(EMERGENCY_PARSER) - emergency_parser.update(serial.emergency_state, c); + if (serial.emergency_parser_enabled()) + emergency_parser.update(serial.emergency_state, c); #endif } } @@ -73,40 +74,120 @@ static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb } } -#define DEFINE_HWSERIAL_MARLIN(name, n) \ - MarlinSerial name(USART##n, \ - BOARD_USART##n##_TX_PIN, \ - BOARD_USART##n##_RX_PIN); \ - extern "C" void __irq_usart##n(void) { \ +// Not every MarlinSerial port should handle emergency parsing. +// It would not make sense to parse GCode from TMC responses, for example. +constexpr bool serial_handles_emergency(int port) { + return false + #ifdef SERIAL_PORT + || (SERIAL_PORT) == port + #endif + #ifdef SERIAL_PORT_2 + || (SERIAL_PORT_2) == port + #endif + #ifdef LCD_SERIAL_PORT + || (LCD_SERIAL_PORT) == port + #endif + ; +} + +#define DEFINE_HWSERIAL_MARLIN(name, n) \ + MarlinSerial name(USART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN, \ + serial_handles_emergency(n)); \ + extern "C" void __irq_usart##n(void) { \ my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \ } #define DEFINE_HWSERIAL_UART_MARLIN(name, n) \ MarlinSerial name(UART##n, \ - BOARD_USART##n##_TX_PIN, \ - BOARD_USART##n##_RX_PIN); \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN, \ + serial_handles_emergency(n)); \ extern "C" void __irq_usart##n(void) { \ - my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \ + my_usart_irq(UART##n->rb, UART##n->wb, UART##n##_BASE, MSerial##n); \ } -#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1 - DEFINE_HWSERIAL_MARLIN(MSerial1, 1); -#endif - -#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2 - DEFINE_HWSERIAL_MARLIN(MSerial2, 2); -#endif - -#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3 - DEFINE_HWSERIAL_MARLIN(MSerial3, 3); -#endif - -#if SERIAL_PORT == 4 || SERIAL_PORT_2 == 4 || DGUS_SERIAL_PORT == 4 +// Instantiate all UARTs even if they are not needed +// This avoids a bunch of logic to figure out every serial +// port which may be in use on the system. +DEFINE_HWSERIAL_MARLIN(MSerial1, 1); +DEFINE_HWSERIAL_MARLIN(MSerial2, 2); +DEFINE_HWSERIAL_MARLIN(MSerial3, 3); +#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) DEFINE_HWSERIAL_UART_MARLIN(MSerial4, 4); -#endif - -#if SERIAL_PORT == 5 || SERIAL_PORT_2 == 5 || DGUS_SERIAL_PORT == 5 DEFINE_HWSERIAL_UART_MARLIN(MSerial5, 5); #endif +// Check the type of each serial port by passing it to a template function. +// HardwareSerial is known to sometimes hang the controller when an error occurs, +// so this case will fail the static assert. All other classes are assumed to be ok. +template +constexpr bool IsSerialClassAllowed(const T&) { return true; } +constexpr bool IsSerialClassAllowed(const HardwareSerial&) { return false; } + +#define CHECK_CFG_SERIAL(A) static_assert(IsSerialClassAllowed(A), STRINGIFY(A) " is defined incorrectly"); +#define CHECK_AXIS_SERIAL(A) static_assert(IsSerialClassAllowed(A##_HARDWARE_SERIAL), STRINGIFY(A) "_HARDWARE_SERIAL must be defined in the form MSerial1, rather than Serial1"); + +// If you encounter this error, replace SerialX with MSerialX, for example MSerial3. + +// Non-TMC ports were already validated in HAL.h, so do not require verbose error messages. +#ifdef MYSERIAL0 + CHECK_CFG_SERIAL(MYSERIAL0); +#endif +#ifdef MYSERIAL1 + CHECK_CFG_SERIAL(MYSERIAL1); +#endif +#ifdef LCD_SERIAL + CHECK_CFG_SERIAL(LCD_SERIAL); +#endif +#if AXIS_HAS_HW_SERIAL(X) + CHECK_AXIS_SERIAL(X); +#endif +#if AXIS_HAS_HW_SERIAL(X2) + CHECK_AXIS_SERIAL(X2); +#endif +#if AXIS_HAS_HW_SERIAL(Y) + CHECK_AXIS_SERIAL(Y); +#endif +#if AXIS_HAS_HW_SERIAL(Y2) + CHECK_AXIS_SERIAL(Y2); +#endif +#if AXIS_HAS_HW_SERIAL(Z) + CHECK_AXIS_SERIAL(Z); +#endif +#if AXIS_HAS_HW_SERIAL(Z2) + CHECK_AXIS_SERIAL(Z2); +#endif +#if AXIS_HAS_HW_SERIAL(Z3) + CHECK_AXIS_SERIAL(Z3); +#endif +#if AXIS_HAS_HW_SERIAL(Z4) + CHECK_AXIS_SERIAL(Z4); +#endif +#if AXIS_HAS_HW_SERIAL(E0) + CHECK_AXIS_SERIAL(E0); +#endif +#if AXIS_HAS_HW_SERIAL(E1) + CHECK_AXIS_SERIAL(E1); +#endif +#if AXIS_HAS_HW_SERIAL(E2) + CHECK_AXIS_SERIAL(E2); +#endif +#if AXIS_HAS_HW_SERIAL(E3) + CHECK_AXIS_SERIAL(E3); +#endif +#if AXIS_HAS_HW_SERIAL(E4) + CHECK_AXIS_SERIAL(E4); +#endif +#if AXIS_HAS_HW_SERIAL(E5) + CHECK_AXIS_SERIAL(E5); +#endif +#if AXIS_HAS_HW_SERIAL(E6) + CHECK_AXIS_SERIAL(E6); +#endif +#if AXIS_HAS_HW_SERIAL(E7) + CHECK_AXIS_SERIAL(E7); +#endif + #endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index b9248e50ca..6aa94b64ff 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -35,15 +35,22 @@ class MarlinSerial : public HardwareSerial { public: - MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) : + #if ENABLED(EMERGENCY_PARSER) + const bool ep_enabled; + EmergencyParser::State emergency_state; + inline bool emergency_parser_enabled() { return ep_enabled; } + #endif + + MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin, bool TERN_(EMERGENCY_PARSER, ep_capable)) : HardwareSerial(usart_device, tx_pin, rx_pin) #if ENABLED(EMERGENCY_PARSER) + , ep_enabled(ep_capable) , emergency_state(EmergencyParser::State::EP_RESET) #endif { } #ifdef UART_IRQ_PRIO - // shadow the parent methods to set irq priority after the begin + // Shadow the parent methods to set IRQ priority after begin() void begin(uint32 baud) { MarlinSerial::begin(baud, SERIAL_8N1); } @@ -53,14 +60,12 @@ public: nvic_irq_set_priority(c_dev()->irq_num, UART_IRQ_PRIO); } #endif - - #if ENABLED(EMERGENCY_PARSER) - EmergencyParser::State emergency_state; - #endif }; extern MarlinSerial MSerial1; extern MarlinSerial MSerial2; extern MarlinSerial MSerial3; -extern MarlinSerial MSerial4; -extern MarlinSerial MSerial5; +#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + extern MarlinSerial MSerial4; + extern MarlinSerial MSerial5; +#endif diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h index d9cdbe6bb3..1e4e4c44b1 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.h +++ b/Marlin/src/HAL/STM32F1/msc_sd.h @@ -32,6 +32,7 @@ public: #if ENABLED(EMERGENCY_PARSER) EmergencyParser::State emergency_state; + inline bool emergency_parser_enabled() { return true; } #endif }; diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.h b/Marlin/src/HAL/STM32_F4_F7/HAL.h index e132168205..88e48f0fa0 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.h +++ b/Marlin/src/HAL/STM32_F4_F7/HAL.h @@ -72,15 +72,15 @@ #endif #endif -#ifdef DGUS_SERIAL_PORT - #if defined(STM32F4) && DGUS_SERIAL_PORT == 0 - #error "DGUS_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif DGUS_SERIAL_PORT == -1 - #define DGUS_SERIAL SerialUSB - #elif WITHIN(DGUS_SERIAL_PORT, 0, 6) - #define DGUS_SERIAL MSERIAL(DGUS_SERIAL_PORT) +#ifdef LCD_SERIAL_PORT + #if defined(STM32F4) && LCD_SERIAL_PORT == 0 + #error "LCD_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." + #elif LCD_SERIAL_PORT == -1 + #define LCD_SERIAL SerialUSB + #elif WITHIN(LCD_SERIAL_PORT, 0, 6) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else - #error "DGUS_SERIAL_PORT must be from -1 to 6. Please update your configuration." + #error "LCD_SERIAL_PORT must be from -1 to 6. Please update your configuration." #endif #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 73e034d05f..d3f608e0a4 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -422,3 +422,37 @@ #if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) #define NEED_LSF 1 #endif + +// Flag the indexed serial ports that are in use +#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) +#if ANY_SERIAL_IS(-1) + #define USING_SERIAL_DEFAULT +#endif +#if ANY_SERIAL_IS(0) + #define USING_SERIAL_0 1 +#endif +#if ANY_SERIAL_IS(1) + #define USING_SERIAL_1 1 +#endif +#if ANY_SERIAL_IS(2) + #define USING_SERIAL_2 1 +#endif +#if ANY_SERIAL_IS(3) + #define USING_SERIAL_3 1 +#endif +#if ANY_SERIAL_IS(4) + #define USING_SERIAL_4 1 +#endif +#if ANY_SERIAL_IS(5) + #define USING_SERIAL_5 1 +#endif +#if ANY_SERIAL_IS(6) + #define USING_SERIAL_6 1 +#endif +#if ANY_SERIAL_IS(7) + #define USING_SERIAL_7 1 +#endif +#if ANY_SERIAL_IS(8) + #define USING_SERIAL_8 1 +#endif +#undef ANY_SERIAL_IS diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 4c0b68e8ae..27bafe0048 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -477,6 +477,10 @@ #error "HOME_USING_SPREADCYCLE is now obsolete. Please remove it from Configuration_adv.h." #elif defined(DGUS_LCD) #error "DGUS_LCD is now DGUS_LCD_UI_(ORIGIN|FYSETC|HIPRECY). Please update your configuration." +#elif defined(DGUS_SERIAL_PORT) + #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." +#elif defined(DGUS_BAUDRATE) + #error "DGUS_BAUDRATE is now LCD_BAUDRATE. Please update your configuration." #elif defined(X_DUAL_ENDSTOPS_ADJUSTMENT) #error "X_DUAL_ENDSTOPS_ADJUSTMENT is now X2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." #elif defined(Y_DUAL_ENDSTOPS_ADJUSTMENT) @@ -2281,31 +2285,20 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Serial displays require a dedicated serial port */ -#if HAS_DGUS_LCD - #ifndef DGUS_SERIAL_PORT - #error "The DGUS LCD requires DGUS_SERIAL_PORT to be defined in Configuration.h" - #elif DGUS_SERIAL_PORT == SERIAL_PORT - #error "DGUS_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 - #error "DGUS_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." - #endif -#elif ENABLED(MALYAN_LCD) - #ifndef LCD_SERIAL_PORT - #error "MALYAN_LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" - #elif LCD_SERIAL_PORT == SERIAL_PORT +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == SERIAL_PORT #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." #elif defined(SERIAL_PORT_2) && LCD_SERIAL_PORT == SERIAL_PORT_2 #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." #endif -#elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - #ifndef ANYCUBIC_LCD_SERIAL_PORT - #error "The ANYCUBIC LCD requires ANYCUBIC_LCD_SERIAL_PORT to be defined in Configuration.h" - #elif ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT - #error "ANYCUBIC_LCD_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT_2 - #error "ANYCUBIC_LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." +#else + #if HAS_DGUS_LCD + #error "The DGUS LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + #error "The ANYCUBIC LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #elif ENABLED(MALYAN_LCD) + #error "MALYAN_LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" #endif - #define ANYCUBIC_LCD_SERIAL anycubicLcdSerial #endif /** diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index 889a25b859..4a8095b6e9 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -53,12 +53,12 @@ static bool is_printing_from_sd = false; static bool is_out_of_filament = false; static void sendNewLine(void) { - ANYCUBIC_LCD_SERIAL.write('\r'); - ANYCUBIC_LCD_SERIAL.write('\n'); + LCD_SERIAL.write('\r'); + LCD_SERIAL.write('\n'); } static void send(const char *str) { - ANYCUBIC_LCD_SERIAL.print(str); + LCD_SERIAL.print(str); } static void sendLine(const char *str) { @@ -68,7 +68,7 @@ static void sendLine(const char *str) { static void send_P(PGM_P str) { while (const char c = pgm_read_byte(str++)) - ANYCUBIC_LCD_SERIAL.write(c); + LCD_SERIAL.write(c); } static void sendLine_P(PGM_P str) { @@ -78,23 +78,23 @@ static void sendLine_P(PGM_P str) { static void sendValue_P(PGM_P prefix, int value) { send_P(prefix); - ANYCUBIC_LCD_SERIAL.print(value); + LCD_SERIAL.print(value); } static void sendValue_P(PGM_P prefix, float value) { send_P(prefix); - ANYCUBIC_LCD_SERIAL.print(value); + LCD_SERIAL.print(value); } static void sendValueLine_P(PGM_P prefix, int value) { send_P(prefix); - ANYCUBIC_LCD_SERIAL.print(value); + LCD_SERIAL.print(value); sendNewLine(); } static void sendValueLine_P(PGM_P prefix, float value) { send_P(prefix); - ANYCUBIC_LCD_SERIAL.print(value); + LCD_SERIAL.print(value); sendNewLine(); } @@ -426,8 +426,8 @@ namespace ExtUI { static char rxBuffer[RX_LEN_MAX+1]; static uint8_t rxLen = 0; - while (ANYCUBIC_LCD_SERIAL.available()) { - const char c = ANYCUBIC_LCD_SERIAL.read(); + while (LCD_SERIAL.available()) { + const char c = LCD_SERIAL.read(); switch (c) { case '\r': case '\n': if (rxLen > 0 && rxLen <= RX_LEN_MAX) { @@ -466,7 +466,10 @@ namespace ExtUI { } void onStartup() { - ANYCUBIC_LCD_SERIAL.begin(115200); + #ifndef LCD_BAUDRATE + #define LCD_BAUDRATE 115200 + #endif + LCD_SERIAL.begin(LCD_BAUDRATE); sendNewLine(); SENDLINE_PGM("J17"); // Reset delay_ms(10); diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 486f262778..c69fb8351a 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -59,12 +59,12 @@ char *itostr2(const uint8_t &x) { } static void sendNewLine(void) { - ANYCUBIC_LCD_SERIAL.write('\r'); - ANYCUBIC_LCD_SERIAL.write('\n'); + LCD_SERIAL.write('\r'); + LCD_SERIAL.write('\n'); } static void send(const char *str) { - ANYCUBIC_LCD_SERIAL.print(str); + LCD_SERIAL.print(str); } static void sendLine(const char *str) { @@ -74,7 +74,7 @@ static void sendLine(const char *str) { static void send_P(PGM_P str) { while (const char c = pgm_read_byte(str++)) - ANYCUBIC_LCD_SERIAL.write(c); + LCD_SERIAL.write(c); } static void sendLine_P(PGM_P str) { @@ -576,8 +576,8 @@ void AnycubicTFTClass::OnPrintTimerStopped() { void AnycubicTFTClass::GetCommandFromTFT() { char *starpos = NULL; - while (ANYCUBIC_LCD_SERIAL.available() > 0 && TFTbuflen < TFTBUFSIZE) { - serial3_char = ANYCUBIC_LCD_SERIAL.read(); + while (LCD_SERIAL.available() > 0 && TFTbuflen < TFTBUFSIZE) { + serial3_char = LCD_SERIAL.read(); if (serial3_char == '\n' || serial3_char == '\r' || serial3_char == ':' || @@ -639,11 +639,11 @@ void AnycubicTFTClass::GetCommandFromTFT() { float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); SEND_PGM("A5V X: "); - ANYCUBIC_LCD_SERIAL.print(xPostition); + LCD_SERIAL.print(xPostition); SEND_PGM(" Y: "); - ANYCUBIC_LCD_SERIAL.print(yPostition); + LCD_SERIAL.print(yPostition); SEND_PGM(" Z: "); - ANYCUBIC_LCD_SERIAL.print(zPostition); + LCD_SERIAL.print(zPostition); SENDLINE_PGM(""); } break; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index b788587c94..5181ba7cc4 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -59,23 +59,13 @@ constexpr uint8_t DGUS_CMD_READVAR = 0x83; bool dguslcd_local_debug; // = false; #endif -#define dgusserial DGUS_SERIAL - void DGUSDisplay::InitDisplay() { - dgusserial.begin(DGUS_BAUDRATE); - - if (true - #if ENABLED(POWER_LOSS_RECOVERY) - && !recovery.valid() - #endif - ) - RequestScreen( - #if ENABLED(SHOW_BOOTSCREEN) - DGUSLCD_SCREEN_BOOT - #else - DGUSLCD_SCREEN_MAIN - #endif - ); + #ifndef LCD_BAUDRATE + #define LCD_BAUDRATE 115200 + #endif + LCD_SERIAL.begin(LCD_BAUDRATE); + if (TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) + RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); } void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { @@ -89,7 +79,7 @@ void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t values strend = true; x = ' '; } - dgusserial.write(x); + LCD_SERIAL.write(x); } } @@ -133,41 +123,41 @@ void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t val strend = true; x = ' '; } - dgusserial.write(x); + LCD_SERIAL.write(x); } } void DGUSDisplay::ProcessRx() { #if ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS) - if (!dgusserial.available() && dgusserial.buffer_overruns()) { + if (!LCD_SERIAL.available() && LCD_SERIAL.buffer_overruns()) { // Overrun, but reset the flag only when the buffer is empty // We want to extract as many as valid datagrams possible... DEBUG_ECHOPGM("OVFL"); rx_datagram_state = DGUS_IDLE; - //dgusserial.reset_rx_overun(); - dgusserial.flush(); + //LCD_SERIAL.reset_rx_overun(); + LCD_SERIAL.flush(); } #endif uint8_t receivedbyte; - while (dgusserial.available()) { + while (LCD_SERIAL.available()) { switch (rx_datagram_state) { case DGUS_IDLE: // Waiting for the first header byte - receivedbyte = dgusserial.read(); + receivedbyte = LCD_SERIAL.read(); //DEBUG_ECHOPAIR("< ",x); if (DGUS_HEADER1 == receivedbyte) rx_datagram_state = DGUS_HEADER1_SEEN; break; case DGUS_HEADER1_SEEN: // Waiting for the second header byte - receivedbyte = dgusserial.read(); + receivedbyte = LCD_SERIAL.read(); //DEBUG_ECHOPAIR(" ",x); rx_datagram_state = (DGUS_HEADER2 == receivedbyte) ? DGUS_HEADER2_SEEN : DGUS_IDLE; break; case DGUS_HEADER2_SEEN: // Waiting for the length byte - rx_datagram_len = dgusserial.read(); + rx_datagram_len = LCD_SERIAL.read(); DEBUG_ECHOPAIR(" (", rx_datagram_len, ") "); // Telegram min len is 3 (command and one word of payload) @@ -175,10 +165,10 @@ void DGUSDisplay::ProcessRx() { break; case DGUS_WAIT_TELEGRAM: // wait for complete datagram to arrive. - if (dgusserial.available() < rx_datagram_len) return; + if (LCD_SERIAL.available() < rx_datagram_len) return; Initialized = true; // We've talked to it, so we defined it as initialized. - uint8_t command = dgusserial.read(); + uint8_t command = LCD_SERIAL.read(); DEBUG_ECHOPAIR("# ", command); @@ -186,7 +176,7 @@ void DGUSDisplay::ProcessRx() { unsigned char tmp[rx_datagram_len - 1]; unsigned char *ptmp = tmp; while (readlen--) { - receivedbyte = dgusserial.read(); + receivedbyte = LCD_SERIAL.read(); DEBUG_ECHOPAIR(" ", receivedbyte); *ptmp++ = receivedbyte; } @@ -229,19 +219,19 @@ void DGUSDisplay::ProcessRx() { } } -size_t DGUSDisplay::GetFreeTxBuffer() { return DGUS_SERIAL_GET_TX_BUFFER_FREE(); } +size_t DGUSDisplay::GetFreeTxBuffer() { return SERIAL_GET_TX_BUFFER_FREE(); } void DGUSDisplay::WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen) { - dgusserial.write(DGUS_HEADER1); - dgusserial.write(DGUS_HEADER2); - dgusserial.write(payloadlen + 3); - dgusserial.write(cmd); - dgusserial.write(adr >> 8); - dgusserial.write(adr & 0xFF); + LCD_SERIAL.write(DGUS_HEADER1); + LCD_SERIAL.write(DGUS_HEADER2); + LCD_SERIAL.write(payloadlen + 3); + LCD_SERIAL.write(cmd); + LCD_SERIAL.write(adr >> 8); + LCD_SERIAL.write(adr & 0xFF); } void DGUSDisplay::WritePGM(const char str[], uint8_t len) { - while (len--) dgusserial.write(pgm_read_byte(str++)); + while (len--) LCD_SERIAL.write(pgm_read_byte(str++)); } void DGUSDisplay::loop() { diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests index cfd36832fd..7ae4670fed 100644 --- a/buildroot/tests/mks_robin_pro-tests +++ b/buildroot/tests/mks_robin_pro-tests @@ -7,6 +7,7 @@ set -e use_example_configs Mks/Robin_Pro +opt_enable EMERGENCY_PARSER opt_set SDCARD_CONNECTION LCD opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 From d6b1563655343e4c4b4635f4748eb580a6f33526 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 24 Sep 2020 19:19:04 -0700 Subject: [PATCH 0287/1370] BigTreeTech SKR E3 Turbo (#19500) --- Marlin/src/MarlinCore.cpp | 53 ++++ Marlin/src/core/boards.h | 1 + .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 266 ++++++++++++++++++ Marlin/src/pins/pins.h | 2 + 4 files changed, 322 insertions(+) create mode 100644 Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e11439861b..c6c6ef9b0d 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -867,6 +867,57 @@ void stop() { } } +inline void tmc_standby_setup() { + #if PIN_EXISTS(X_STDBY) + SET_INPUT_PULLDOWN(X_STDBY_PIN); + #endif + #if PIN_EXISTS(X2_STDBY) + SET_INPUT_PULLDOWN(X2_STDBY_PIN); + #endif + #if PIN_EXISTS(Y_STDBY) + SET_INPUT_PULLDOWN(Y_STDBY_PIN); + #endif + #if PIN_EXISTS(Y2_STDBY) + SET_INPUT_PULLDOWN(Y2_STDBY_PIN); + #endif + #if PIN_EXISTS(Z_STDBY) + SET_INPUT_PULLDOWN(Z_STDBY_PIN); + #endif + #if PIN_EXISTS(Z2_STDBY) + SET_INPUT_PULLDOWN(Z2_STDBY_PIN); + #endif + #if PIN_EXISTS(Z3_STDBY) + SET_INPUT_PULLDOWN(Z3_STDBY_PIN); + #endif + #if PIN_EXISTS(Z4_STDBY) + SET_INPUT_PULLDOWN(Z4_STDBY_PIN); + #endif + #if PIN_EXISTS(E0_STDBY) + SET_INPUT_PULLDOWN(E0_STDBY_PIN); + #endif + #if PIN_EXISTS(E1_STDBY) + SET_INPUT_PULLDOWN(E1_STDBY_PIN); + #endif + #if PIN_EXISTS(E2_STDBY) + SET_INPUT_PULLDOWN(E2_STDBY_PIN); + #endif + #if PIN_EXISTS(E3_STDBY) + SET_INPUT_PULLDOWN(E3_STDBY_PIN); + #endif + #if PIN_EXISTS(E4_STDBY) + SET_INPUT_PULLDOWN(E4_STDBY_PIN); + #endif + #if PIN_EXISTS(E5_STDBY) + SET_INPUT_PULLDOWN(E5_STDBY_PIN); + #endif + #if PIN_EXISTS(E6_STDBY) + SET_INPUT_PULLDOWN(E6_STDBY_PIN); + #endif + #if PIN_EXISTS(E7_STDBY) + SET_INPUT_PULLDOWN(E7_STDBY_PIN); + #endif +} + /** * Marlin entry-point: Set up before the program loop * - Set up the kill pin, filament runout, power hold @@ -888,6 +939,8 @@ void stop() { */ void setup() { + tmc_standby_setup(); // TMC Low Power Standby pins must be set early or they're not usable + #if ENABLED(MARLIN_DEV_MODE) auto log_current_ms = [&](PGM_P const msg) { SERIAL_ECHO_START(); diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index e27448b022..9e0451486e 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -223,6 +223,7 @@ #define BOARD_BTT_SKR_V1_1 2012 // BigTreeTech SKR v1.1 (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_BTT_SKR_V1_3 2013 // BigTreeTech SKR v1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_BTT_SKR_V1_4 2014 // BigTreeTech SKR v1.4 (Power outputs: Hotend0, Hotend1, Fan, Bed) +#define BOARD_BTT_SKR_E3_TURBO 2015 // BigTreeTech SKR E3 Turbo (Power outputs: Hotend0, Hotend1, Fan, Bed) // // LPC1769 ARM Cortex M3 diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h new file mode 100644 index 0000000000..143504f0e3 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -0,0 +1,266 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "BTT SKR E3 Turbo" +#endif + +// Onboard I2C EEPROM +#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB (AT24C32) + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// TMC StallGuard DIAG pins +// +#define X_DIAG_PIN P1_29 // X-STOP +#define Y_DIAG_PIN P1_28 // Y-STOP +#define Z_DIAG_PIN P1_27 // Z-STOP +#define E0_DIAG_PIN P1_26 // E0DET +#define E1_DIAG_PIN P1_25 // E1DET + +// +// Limit Switches +#define X_STOP_PIN X_DIAG_PIN +#define Y_STOP_PIN Y_DIAG_PIN +#define Z_STOP_PIN Z_DIAG_PIN + +// +// Z Probe +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN P1_22 +#endif + +// +// Filament Runout Sensor +// +#define FIL_RUNOUT_PIN P1_26 // E0DET +#define FIL_RUNOUT2_PIN P1_25 // E1DET + +// +// Power Supply Control +// +#ifndef PS_ON_PIN + #define PS_ON_PIN P1_21 +#endif + +// LED driving pin +#define NEOPIXEL_PIN P1_24 + +// +// Power Loss Detection +// +#ifndef POWER_LOSS_PIN + #define POWER_LOSS_PIN P1_20 // PWRDET +#endif + +// +// Steppers +// +#define X_STEP_PIN P1_04 +#define X_DIR_PIN P1_08 +#define X_ENABLE_PIN P1_00 +#ifndef X_CS_PIN + #define X_CS_PIN P1_01 +#endif + +#define Y_STEP_PIN P1_14 +#define Y_DIR_PIN P1_15 +#define Y_ENABLE_PIN P1_09 +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_10 +#endif + +#define Z_STEP_PIN P4_29 +#define Z_DIR_PIN P4_28 +#define Z_ENABLE_PIN P1_16 +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_17 +#endif + +#define E0_STEP_PIN P2_06 +#define E0_DIR_PIN P2_07 +#define E0_ENABLE_PIN P0_04 +#ifndef E0_CS_PIN + #define E0_CS_PIN P0_05 +#endif + +#define E1_STEP_PIN P2_11 +#define E1_DIR_PIN P2_12 +#define E1_ENABLE_PIN P0_21 +#ifndef E1_CS_PIN + #define E1_CS_PIN P0_22 +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + + // + // Software serial + // + #define X_SERIAL_TX_PIN P1_01 + #define X_SERIAL_RX_PIN P1_01 + + #define Y_SERIAL_TX_PIN P1_10 + #define Y_SERIAL_RX_PIN P1_10 + + #define Z_SERIAL_TX_PIN P1_17 + #define Z_SERIAL_RX_PIN P1_17 + + #define E0_SERIAL_TX_PIN P0_05 + #define E0_SERIAL_RX_PIN P0_05 + + #define E1_SERIAL_TX_PIN P0_22 + #define E1_SERIAL_RX_PIN P0_22 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// TMC Low Power Standby pins +// +#define X_STDBY_PIN P3_26 +#define Y_STDBY_PIN P3_25 +#define Z_STDBY_PIN P1_18 +#define E0_STDBY_PIN P1_19 +#define E1_STDBY_PIN P2_13 + +// +// Temperature Sensors +// +#define TEMP_0_PIN P0_24 +#define TEMP_1_PIN P0_23 +//#define TEMP_2_PIN P1_30 // Onboard thermistor +#define TEMP_BED_PIN P0_25 + +// +// Heaters / Fans +// +#define HEATER_0_PIN P2_03 // EXTRUDER 0 +#define HEATER_1_PIN P2_04 // EXTRUDER 1 +#define HEATER_BED_PIN P2_05 // BED +#define FAN_PIN P2_01 +#define FAN1_PIN P2_02 + +// +// USB connect control +// +//#define USB_CONNECT_PIN P0_29 +//#define USB_CONNECT_INVERTING false + +/** + * _____ + * 5V | 1 2 | GND + * (LCD_EN) P0_18 | 3 4 | P0_17 (LCD_RS) + * (LCD_D4) P0_15 | 5 6 P0_20 (BTN_EN2) + * RESET | 7 8 | P0_19 (BTN_EN1) + * (BTN_ENC) P0_16 | 9 10| P2_08 (BEEPER) + * ----- + * EXP + */ + +#define EXPA1_03_PIN P0_18 +#define EXPA1_04_PIN P0_17 +#define EXPA1_05_PIN P0_15 +#define EXPA1_06_PIN P0_20 +#define EXPA1_07_PIN -1 +#define EXPA1_08_PIN P0_19 +#define EXPA1_09_PIN P0_16 +#define EXPA1_10_PIN P2_08 + +#if HAS_SPI_LCD + + #if ENABLED(CR10_STOCKDISPLAY) + + #define BEEPER_PIN EXPA1_10_PIN + + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN + #define BTN_ENC EXPA1_09_PIN + + #define LCD_PINS_RS EXPA1_04_PIN + #define LCD_PINS_ENABLE EXPA1_03_PIN + #define LCD_PINS_D4 EXPA1_05_PIN + + #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_SKR_E3_TURBO.h' for details. Comment out this line to continue." + + #define LCD_PINS_RS EXPA1_05_PIN + #define LCD_PINS_ENABLE EXPA1_09_PIN + #define LCD_PINS_D4 EXPA1_04_PIN + #define LCD_PINS_D5 EXPA1_06_PIN + #define LCD_PINS_D6 EXPA1_08_PIN + #define LCD_PINS_D7 EXPA1_10_PIN + #define ADC_KEYPAD_PIN P1_23 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN + #define BTN_ENC EXPA1_09_PIN + + #define DOGLCD_CS EXPA1_04_PIN + #define DOGLCD_A0 EXPA1_05_PIN + #define DOGLCD_SCK EXPA1_10_PIN + #define DOGLCD_MOSI EXPA1_03_PIN + #define FORCE_SOFT_SPI + #define LCD_BACKLIGHT_PIN -1 + + #else + + #error "Only ZONESTAR_LCD, MKS_MINI_12864, ENDER2_STOCKDISPLAY, and CR10_STOCKDISPLAY are currently supported on the BTT_SKR_E3_TURBO." + + #endif + +#endif // HAS_SPI_LCD + +// +// SD Support +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #define SD_DETECT_PIN P2_00 + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN P0_06 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "SD CUSTOM_CABLE is not compatible with SKR E3 Turbo." +#endif + +#define ON_BOARD_SPI_DEVICE 1 // SPI1 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index bf95c87312..0ccdadadde 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -421,6 +421,8 @@ #include "lpc1769/pins_BTT_SKR_V1_4_TURBO.h" // LPC1769 env:LPC1769 #elif MB(MKS_SGEN_L_V2) #include "lpc1769/pins_MKS_SGEN_L_V2.h" // LPC1769 env:LPC1769 +#elif MB(BTT_SKR_E3_TURBO) + #include "lpc1769/pins_BTT_SKR_E3_TURBO.h" // LPC1769 env:LPC1769 // // Due (ATSAM) boards From affb5e53dff42421f19d40e461d69fa4696bcbfa Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 24 Sep 2020 21:46:13 -0500 Subject: [PATCH 0288/1370] Sanity check old serial names --- Marlin/Configuration_adv.h | 2 +- Marlin/src/HAL/AVR/MarlinSerial.h | 2 +- Marlin/src/inc/SanityCheck.h | 8 ++++++++ Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a8c9205538..c5f56f18d0 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1409,7 +1409,7 @@ #define DGUS_RX_BUFFER_SIZE 128 #define DGUS_TX_BUFFER_SIZE 48 - //#define DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR) + //#define SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR) #define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index cb906e2b65..8a0423d143 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -310,7 +310,7 @@ #if HAS_DGUS_LCD static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE; static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE; - static constexpr bool RX_OVERRUNS = ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS); + static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) static constexpr unsigned int RX_SIZE = 64; static constexpr unsigned int TX_SIZE = 128; diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 27bafe0048..1cb8bcd7e9 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -481,6 +481,14 @@ #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." #elif defined(DGUS_BAUDRATE) #error "DGUS_BAUDRATE is now LCD_BAUDRATE. Please update your configuration." +#elif defined(DGUS_STATS_RX_BUFFER_OVERRUNS) + #error "DGUS_STATS_RX_BUFFER_OVERRUNS is now STATS_RX_BUFFER_OVERRUNS. Please update your configuration." +#elif defined(DGUS_SERIAL_PORT) + #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." +#elif defined(ANYCUBIC_LCD_SERIAL_PORT) + #error "ANYCUBIC_LCD_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." +#elif defined(INTERNAL_SERIAL_PORT) + #error "INTERNAL_SERIAL_PORT is now MMU2_SERIAL_PORT. Please update your configuration." #elif defined(X_DUAL_ENDSTOPS_ADJUSTMENT) #error "X_DUAL_ENDSTOPS_ADJUSTMENT is now X2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." #elif defined(Y_DUAL_ENDSTOPS_ADJUSTMENT) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index 5181ba7cc4..8577b76ce6 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -129,7 +129,7 @@ void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t val void DGUSDisplay::ProcessRx() { - #if ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS) + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) if (!LCD_SERIAL.available() && LCD_SERIAL.buffer_overruns()) { // Overrun, but reset the flag only when the buffer is empty // We want to extract as many as valid datagrams possible... From 3d521a2e34a4ed8057f22b809b0869126669ac9f Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 25 Sep 2020 16:58:28 -0300 Subject: [PATCH 0289/1370] TFT: No timeout on Move Screen (#19426) --- Marlin/src/lcd/tft/ui_480x320.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index b5b332910b..ffc619e8dc 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -956,24 +956,17 @@ static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage i uint16_t width = Images[imgBtn52Rounded].width; uint16_t height = Images[imgBtn52Rounded].height; - tft.queue.sync(); //need sync to change font - if (!enabled) bgColor = COLOR_CONTROL_DISABLED; tft.canvas(x, y, width, height); tft.set_background(COLOR_BACKGROUND); tft.add_image(0, 0, imgBtn52Rounded, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + // TODO: Make an add_text() taking a font arg if (label != NULL) { - tft.set_font(Helvetica12Bold); - tft_string.set_font(Helvetica12Bold); tft_string.set(label); tft_string.trim(); tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); - - tft.queue.sync(); - tft_string.set_font(Helvetica18); - tft.set_font(Helvetica18); } else { tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); @@ -984,6 +977,7 @@ static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage i void MarlinUI::move_axis_screen() { // Reset + defer_status_screen(true); motionAxisState.blocked = false; touch.enable(); From fd83407991c7fba4f67c9bae79767c03ed61f839 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 25 Sep 2020 21:45:01 -0300 Subject: [PATCH 0290/1370] Escape the M33 string arg (#19515) --- Marlin/src/gcode/parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 91a24d1dd0..b3172e7f6b 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -247,7 +247,7 @@ void GCodeParser::parse(char *p) { #if ENABLED(EXPECTED_PRINTER_CHECK) case 16: #endif - case 23: case 28: case 30: case 117: case 118: case 928: + case 23: case 28: case 30: case 33: case 117: case 118: case 928: string_arg = unescape_string(p); return; default: break; From 0fedd768193ba559bbca296bcaadbc3a8020908c Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 26 Sep 2020 12:47:22 +1200 Subject: [PATCH 0291/1370] Fix MKS Robin undefined pins error (#19507) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 48da17adc5..26a0c9260e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -126,12 +126,7 @@ #endif #define LED_PIN PB2 -#ifdef HAS_GRAPHICAL_TFT - #define TFT_RESET_PIN PF6 - #define TFT_BACKLIGHT_PIN PG11 - #define TFT_CS_PIN PG12 // NE4 - #define TFT_RS_PIN PF0 // A0 -#else +#if HAS_FSMC_TFT /** * Note: MKS Robin TFT screens use various TFT controllers * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) @@ -148,10 +143,17 @@ #define LCD_BACKLIGHT_PIN PG11 #define FSMC_CS_PIN PG12 // NE4 #define FSMC_RS_PIN PF0 // A0 + #define TFT_CS_PIN FSMC_CS_PIN + #define TFT_RS_PIN FSMC_RS_PIN #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 +#elif HAS_GRAPHICAL_TFT + #define TFT_RESET_PIN PF6 + #define TFT_BACKLIGHT_PIN PG11 + #define TFT_CS_PIN PG12 // NE4 + #define TFT_RS_PIN PF0 // A0 #endif #if NEED_TOUCH_PINS From 3065e4f94100c6d99d148a049046a965574a7761 Mon Sep 17 00:00:00 2001 From: Luke Harrison Date: Sat, 26 Sep 2020 02:48:24 +0200 Subject: [PATCH 0292/1370] Fix SKR 1.4 thermistor pin comments (#19510) --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 1846b16e46..fb383ff5ff 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -153,8 +153,8 @@ #define E1_CS_PIN P1_01 #endif -#define TEMP_1_PIN P0_23_A0 // A2 (T2) - (69) - TEMP_1_PIN -#define TEMP_BED_PIN P0_25_A2 // A0 (T0) - (67) - TEMP_BED_PIN +#define TEMP_1_PIN P0_23_A0 // A0 (T0) - (67) - TEMP_1_PIN +#define TEMP_BED_PIN P0_25_A2 // A2 (T2) - (69) - TEMP_BED_PIN // // Software SPI pins for TMC2130 stepper drivers From 9a2de1570c3dd69e6feaf75331475619faf1ea50 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 25 Sep 2020 17:49:36 -0700 Subject: [PATCH 0293/1370] SKR E3 Turbo followup (#19513) --- Marlin/src/core/boards.h | 2 +- Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 9e0451486e..beb348845d 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -223,7 +223,6 @@ #define BOARD_BTT_SKR_V1_1 2012 // BigTreeTech SKR v1.1 (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_BTT_SKR_V1_3 2013 // BigTreeTech SKR v1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_BTT_SKR_V1_4 2014 // BigTreeTech SKR v1.4 (Power outputs: Hotend0, Hotend1, Fan, Bed) -#define BOARD_BTT_SKR_E3_TURBO 2015 // BigTreeTech SKR E3 Turbo (Power outputs: Hotend0, Hotend1, Fan, Bed) // // LPC1769 ARM Cortex M3 @@ -239,6 +238,7 @@ #define BOARD_TH3D_EZBOARD 2507 // TH3D EZBoard v1.0 #define BOARD_BTT_SKR_V1_4_TURBO 2508 // BigTreeTech SKR v1.4 TURBO (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_MKS_SGEN_L_V2 2509 // MKS SGEN_L V2 (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_BTT_SKR_E3_TURBO 2510 // BigTreeTech SKR E3 Turbo (Power outputs: Hotend0, Hotend1, Bed, Fan0, Fan1) // // SAM3X8E ARM Cortex M3 diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 143504f0e3..de987f95d2 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -173,12 +173,6 @@ #define FAN_PIN P2_01 #define FAN1_PIN P2_02 -// -// USB connect control -// -//#define USB_CONNECT_PIN P0_29 -//#define USB_CONNECT_INVERTING false - /** * _____ * 5V | 1 2 | GND From d06e526dc28f28e2394099280891b1739b04d547 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 25 Sep 2020 21:58:45 -0300 Subject: [PATCH 0294/1370] Fix MBL "Click to continue" on Color UI touchscreen (#19514) --- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 6841561c1b..e19b04ccb5 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -36,6 +36,11 @@ #include "../../module/probe.h" #endif +#if HAS_GRAPHICAL_TFT + #include "../tft/touch.h" + #include "../tft/tft.h" +#endif + #if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) #include "../../module/motion.h" @@ -159,7 +164,11 @@ // Move to the first probe position // void _lcd_level_bed_homing_done() { - if (ui.should_draw()) MenuItem_static::draw(1, GET_TEXT(MSG_LEVEL_BED_WAITING)); + if (ui.should_draw()) { + MenuItem_static::draw(1, GET_TEXT(MSG_LEVEL_BED_WAITING)); + // Color UI needs a control to detect a touch + TERN_(HAS_GRAPHICAL_TFT, touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT)); + } if (ui.use_click()) { manual_probe_index = 0; _lcd_level_goto_next_point(); From e26edbc623e66efb2b4260d64004650b02365230 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 25 Sep 2020 22:05:23 -0300 Subject: [PATCH 0295/1370] Allow ColorUI color customization (#19484) --- Marlin/src/lcd/tft/tft_color.h | 122 +++++++++++++++++++++++++-------- 1 file changed, 92 insertions(+), 30 deletions(-) diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h index 14906a1bcf..8e380b366b 100644 --- a/Marlin/src/lcd/tft/tft_color.h +++ b/Marlin/src/lcd/tft/tft_color.h @@ -21,6 +21,8 @@ */ #pragma once +#include "../../inc/MarlinConfigPre.h" + #define RED(color) ((color >> 8) & 0xF8) #define GREEN(color) ((color >> 3) & 0xFC) #define BLUE(color) ((color << 3) & 0xF8) @@ -70,45 +72,105 @@ #ifndef COLOR_BACKGROUND #define COLOR_BACKGROUND 0x20AC // #1E156E #endif -#define COLOR_SELECTION_BG 0x9930 // #992380 -#define COLOR_WEBSITE_URL 0x03B7 +#ifndef COLOR_SELECTION_BG + #define COLOR_SELECTION_BG 0x9930 // #992380 +#endif +#ifndef COLOR_WEBSITE_URL + #define COLOR_WEBSITE_URL 0x03B7 +#endif -#define COLOR_INACTIVE COLOR_GREY -#define COLOR_COLD COLOR_AQUA -#define COLOR_HOTEND COLOR_SCARLET -#define COLOR_HEATED_BED COLOR_DARK_ORANGE -#define COLOR_CHAMBER COLOR_DARK_ORANGE -#define COLOR_FAN COLOR_AQUA +#ifndef COLOR_INACTIVE + #define COLOR_INACTIVE COLOR_GREY +#endif +#ifndef COLOR_COLD + #define COLOR_COLD COLOR_AQUA +#endif +#ifndef COLOR_HOTEND + #define COLOR_HOTEND COLOR_SCARLET +#endif +#ifndef COLOR_HEATED_BED + #define COLOR_HEATED_BED COLOR_DARK_ORANGE +#endif +#ifndef COLOR_CHAMBER + #define COLOR_CHAMBER COLOR_DARK_ORANGE +#endif +#ifndef COLOR_FAN + #define COLOR_FAN COLOR_AQUA +#endif -#define COLOR_AXIS_HOMED COLOR_WHITE -#define COLOR_AXIS_NOT_HOMED COLOR_YELLOW +#ifndef COLOR_AXIS_HOMED + #define COLOR_AXIS_HOMED COLOR_WHITE +#endif +#ifndef COLOR_AXIS_NOT_HOMED + #define COLOR_AXIS_NOT_HOMED COLOR_YELLOW +#endif -#define COLOR_RATE_100 COLOR_VIVID_GREEN -#define COLOR_RATE_ALTERED COLOR_YELLOW +#ifndef COLOR_RATE_100 + #define COLOR_RATE_100 COLOR_VIVID_GREEN +#endif +#ifndef COLOR_RATE_ALTERED + #define COLOR_RATE_ALTERED COLOR_YELLOW +#endif -#define COLOR_PRINT_TIME COLOR_AQUA +#ifndef COLOR_PRINT_TIME + #define COLOR_PRINT_TIME COLOR_AQUA +#endif -#define COLOR_PROGRESS_FRAME COLOR_WHITE -#define COLOR_PROGRESS_BAR COLOR_BLUE -#define COLOR_PROGRESS_BG COLOR_BLACK +#ifndef COLOR_PROGRESS_FRAME + #define COLOR_PROGRESS_FRAME COLOR_WHITE +#endif +#ifndef COLOR_PROGRESS_BAR + #define COLOR_PROGRESS_BAR COLOR_BLUE +#endif +#ifndef COLOR_PROGRESS_BG + #define COLOR_PROGRESS_BG COLOR_BLACK +#endif -#define COLOR_STATUS_MESSAGE COLOR_YELLOW +#ifndef COLOR_STATUS_MESSAGE + #define COLOR_STATUS_MESSAGE COLOR_YELLOW +#endif -#define COLOR_CONTROL_ENABLED COLOR_WHITE -#define COLOR_CONTROL_DISABLED COLOR_GREY -#define COLOR_CONTROL_CANCEL COLOR_SCARLET -#define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN -#define COLOR_BUSY COLOR_SILVER +#ifndef COLOR_CONTROL_ENABLED + #define COLOR_CONTROL_ENABLED COLOR_WHITE +#endif +#ifndef COLOR_CONTROL_DISABLED + #define COLOR_CONTROL_DISABLED COLOR_GREY +#endif +#ifndef COLOR_CONTROL_CANCEL + #define COLOR_CONTROL_CANCEL COLOR_SCARLET +#endif +#ifndef COLOR_CONTROL_CONFIRM + #define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN +#endif +#ifndef COLOR_BUSY + #define COLOR_BUSY COLOR_SILVER +#endif -#define COLOR_MENU_TEXT COLOR_YELLOW -#define COLOR_MENU_VALUE COLOR_WHITE +#ifndef COLOR_MENU_TEXT + #define COLOR_MENU_TEXT COLOR_YELLOW +#endif +#ifndef COLOR_MENU_VALUE + #define COLOR_MENU_VALUE COLOR_WHITE +#endif -#define COLOR_SLIDER COLOR_WHITE -#define COLOR_SLIDER_INACTIVE COLOR_GREY +#ifndef COLOR_SLIDER + #define COLOR_SLIDER COLOR_WHITE +#endif +#ifndef COLOR_SLIDER_INACTIVE + #define COLOR_SLIDER_INACTIVE COLOR_GREY +#endif -#define COLOR_UBL COLOR_WHITE +#ifndef COLOR_UBL + #define COLOR_UBL COLOR_WHITE +#endif -#define COLOR_TOUCH_CALIBRATION COLOR_WHITE +#ifndef COLOR_TOUCH_CALIBRATION + #define COLOR_TOUCH_CALIBRATION COLOR_WHITE +#endif -#define COLOR_KILL_SCREEN_BG COLOR_MAROON -#define COLOR_KILL_SCREEN_TEXT COLOR_WHITE +#ifndef COLOR_KILL_SCREEN_BG + #define COLOR_KILL_SCREEN_BG COLOR_MAROON +#endif +#ifndef COLOR_KILL_SCREEN_TEXT + #define COLOR_KILL_SCREEN_TEXT COLOR_WHITE +#endif From def328eec1b553ef5e4bab8e9b65d1250d693e7f Mon Sep 17 00:00:00 2001 From: Trocololo Date: Sat, 26 Sep 2020 03:28:01 +0200 Subject: [PATCH 0296/1370] MMU2 S Mode spins the BMG gears during C0 (#19429) --- Marlin/src/feature/mmu2/mmu2.cpp | 67 +++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index 35f2db45a9..31b179a3e5 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -54,6 +54,8 @@ MMU2 mmu2; #define MMU_CMD_TIMEOUT 45000UL // 45s timeout for mmu commands (except P0) #define MMU_P0_TIMEOUT 3000UL // Timeout for P0 command: 3seconds +#define MMU2_COMMAND(S) tx_str_P(PSTR(S "\n")) + #if ENABLED(MMU_EXTRUDER_SENSOR) uint8_t mmu_idl_sens = 0; static bool mmu_loading_flag = false; @@ -152,7 +154,7 @@ void MMU2::reset() { safe_delay(20); WRITE(MMU2_RST_PIN, HIGH); #else - tx_str_P(PSTR("X0\n")); // Send soft reset + MMU2_COMMAND("X0"); // Send soft reset #endif } @@ -175,9 +177,7 @@ void MMU2::mmu_loop() { DEBUG_ECHOLNPGM("MMU => 'start'"); DEBUG_ECHOLNPGM("MMU <= 'S1'"); - // send "read version" request - tx_str_P(PSTR("S1\n")); - + MMU2_COMMAND("S1"); // Read Version state = -2; } else if (millis() > 3000000) { @@ -192,7 +192,7 @@ void MMU2::mmu_loop() { DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'"); - tx_str_P(PSTR("S2\n")); // read build number + MMU2_COMMAND("S2"); // Read Build Number state = -3; } break; @@ -208,13 +208,13 @@ void MMU2::mmu_loop() { #if ENABLED(MMU2_MODE_12V) DEBUG_ECHOLNPGM("MMU <= 'M1'"); - tx_str_P(PSTR("M1\n")); // switch to stealth mode + MMU2_COMMAND("M1"); // Stealth Mode state = -5; #else DEBUG_ECHOLNPGM("MMU <= 'P0'"); - tx_str_P(PSTR("P0\n")); // read finda + MMU2_COMMAND("P0"); // Read FINDA state = -4; #endif } @@ -228,7 +228,7 @@ void MMU2::mmu_loop() { DEBUG_ECHOLNPGM("MMU <= 'P0'"); - tx_str_P(PSTR("P0\n")); // read finda + MMU2_COMMAND("P0"); // Read FINDA state = -4; } break; @@ -266,14 +266,14 @@ void MMU2::mmu_loop() { else if (cmd == MMU_CMD_C0) { // continue loading DEBUG_ECHOLNPGM("MMU <= 'C0'"); - tx_str_P(PSTR("C0\n")); + MMU2_COMMAND("C0"); state = 3; // wait for response } else if (cmd == MMU_CMD_U0) { // unload current DEBUG_ECHOLNPGM("MMU <= 'U0'"); - tx_str_P(PSTR("U0\n")); + MMU2_COMMAND("U0"); state = 3; // wait for response } else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) { @@ -286,7 +286,7 @@ void MMU2::mmu_loop() { else if (cmd == MMU_CMD_R0) { // recover after eject DEBUG_ECHOLNPGM("MMU <= 'R0'"); - tx_str_P(PSTR("R0\n")); + MMU2_COMMAND("R0"); state = 3; // wait for response } else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) { @@ -303,8 +303,7 @@ void MMU2::mmu_loop() { cmd = MMU_CMD_NONE; } else if (ELAPSED(millis(), prev_P0_request + 300)) { - // read FINDA - tx_str_P(PSTR("P0\n")); + MMU2_COMMAND("P0"); // Read FINDA state = 2; // wait for response } @@ -332,19 +331,32 @@ void MMU2::mmu_loop() { #if ENABLED(MMU_EXTRUDER_SENSOR) if (mmu_idl_sens) { if (FILAMENT_PRESENT() && mmu_loading_flag) { - DEBUG_ECHOLNPGM("MMU <= 'A'\n"); - tx_str_P(PSTR("A\n")); // send 'abort' request + DEBUG_ECHOLNPGM("MMU <= 'A'"); + MMU2_COMMAND("A"); // send 'abort' request mmu_idl_sens = 0; - DEBUG_ECHOLNPGM("MMU IDLER_SENSOR = 0 - ABORT\n"); + DEBUG_ECHOLNPGM("MMU IDLER_SENSOR = 0 - ABORT"); } } #endif if (rx_ok()) { - DEBUG_ECHOLNPGM("MMU => 'ok'"); - ready = true; - state = 1; - last_cmd = MMU_CMD_NONE; + // response to C0 mmu command in PRUSA_MMU2_S_MODE + bool can_reset = true; + if (ENABLED(PRUSA_MMU2_S_MODE) && last_cmd == MMU_CMD_C0) { + if (!mmu2s_triggered) { + can_reset = false; + // MMU ok received but filament sensor not triggered, retrying... + DEBUG_ECHOLNPGM("MMU => 'ok' (filament not present in gears)"); + DEBUG_ECHOLNPGM("MMU <= 'C0' (keep trying)"); + MMU2_COMMAND("C0"); + } + } + if (can_reset) { + DEBUG_ECHOLNPGM("MMU => 'ok'"); + ready = true; + state = 1; + last_cmd = MMU_CMD_NONE; + } } else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) { // resend request after timeout @@ -862,9 +874,18 @@ void MMU2::filament_runout() { void MMU2::check_filament() { const bool present = FILAMENT_PRESENT(); - if (present && !mmu2s_triggered) { - DEBUG_ECHOLNPGM("MMU <= 'A'"); - tx_str_P(PSTR("A\n")); + if (cmd == MMU_CMD_NONE && last_cmd == MMU_CMD_C0) { + if (present && !mmu2s_triggered) { + DEBUG_ECHOLNPGM("MMU <= 'A'"); + tx_str_P(PSTR("A\n")); + } + // Slowly spin the extruder during C0 + else { + while (planner.movesplanned() < 3) { + current_position.e += 0.25; + line_to_current_position(MMM_TO_MMS(120)); + } + } } mmu2s_triggered = present; } From 943a594ba0f2ccbe6494c15ebe67d1a634a7a604 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Sep 2020 02:01:56 -0500 Subject: [PATCH 0297/1370] Tweak MMU beeps, misc. cleanup --- Marlin/src/feature/mmu2/mmu2.cpp | 6 ++---- Marlin/src/gcode/config/M302.cpp | 2 +- Marlin/src/gcode/sd/M24_M25.cpp | 4 +++- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 4 ++-- Marlin/src/sd/cardreader.cpp | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index 31b179a3e5..31fa529d56 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -838,8 +838,7 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { if (move_axes && all_axes_homed()) { LCD_MESSAGEPGM(MSG_MMU2_RESUMING); - BUZZ(200, 404); - BUZZ(200, 404); + BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404); // Move XY to starting position, then Z do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); @@ -848,8 +847,7 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); } else { - BUZZ(200, 404); - BUZZ(200, 404); + BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404); LCD_MESSAGEPGM(MSG_MMU2_RESUMING); } } diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp index 14fbd9f572..afdc6c9e85 100644 --- a/Marlin/src/gcode/config/M302.cpp +++ b/Marlin/src/gcode/config/M302.cpp @@ -37,7 +37,7 @@ * * M302 ; report current cold extrusion state * M302 P0 ; enable cold extrusion checking - * M302 P1 ; disables cold extrusion checking + * M302 P1 ; disable cold extrusion checking * M302 S0 ; always allow extrusion (disables checking) * M302 S170 ; only allow extrusion above 170 * M302 S170 P1 ; set min extrude temp to 170 but leave disabled diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp index c27e03862c..bdb37f605c 100644 --- a/Marlin/src/gcode/sd/M24_M25.cpp +++ b/Marlin/src/gcode/sd/M24_M25.cpp @@ -98,7 +98,9 @@ void GcodeSuite::M25() { print_job_timer.pause(); - TERN(DWIN_CREALITY_LCD,,ui.reset_status()); + #if DISABLED(DWIN_CREALITY_LCD) + ui.reset_status(); + #endif #if ENABLED(HOST_ACTION_COMMANDS) TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("Pause SD"), PSTR("Resume"))); diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 131c96bef1..faf9720fa7 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1099,7 +1099,7 @@ void Goto_PrintProcess() { // Copy into filebuf string before entry char * const name = card.longest_filename(); - const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2; + const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2; DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, npos, 60, name); DWIN_ICON_Show(ICON, ICON_PrintTime, 17, 193); @@ -1787,7 +1787,7 @@ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { inline void Draw_SDItem_Shifted(int8_t &shift) { // Limit to the number of chars past the cutoff const size_t len = strlen(shift_name); - NOMORE(shift, _MAX((signed)len - MENU_CHAR_LIMIT, 0)); + NOMORE(shift, _MAX(len - MENU_CHAR_LIMIT, 0U)); // Shorten to the available space const size_t lastchar = _MIN((signed)len, shift + MENU_CHAR_LIMIT); diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 538fca3c88..5210c6ed92 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -53,7 +53,7 @@ #include "../feature/pause.h" #endif -#define DEBUG_OUT ENABLED(DEBUG_CARDREADER) +#define DEBUG_OUT EITHER(DEBUG_CARDREADER, MARLIN_DEV_MODE) #include "../core/debug_out.h" // public: @@ -716,7 +716,7 @@ void CardReader::beginautostart() { cdroot(); } -void CardReader::closefile(const bool store_location) { +void CardReader::closefile(const bool store_location/*=false*/) { file.sync(); file.close(); flag.saving = flag.logging = false; From 32b854a98bd10fb28eaead42eb7edc92b28c0d23 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 25 Sep 2020 16:47:14 -0500 Subject: [PATCH 0298/1370] Drop extra Bed PID --- Marlin/Configuration.h | 10 ++-------- Marlin/Configuration_adv.h | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 93e2a0229a..507b01b95a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -532,18 +532,12 @@ //#define MIN_BED_POWER 0 //#define PID_BED_DEBUG // Sends debug data to the serial port. - //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) - //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) #define DEFAULT_bedKp 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) - //from pidautotune - //#define DEFAULT_bedKp 97.1 - //#define DEFAULT_bedKi 1.41 - //#define DEFAULT_bedKd 1675.16 - // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. #endif // PIDTEMPBED diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index c5f56f18d0..e35f50fe62 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3473,7 +3473,7 @@ */ //#define MMU_EXTRUDER_SENSOR #if ENABLED(MMU_EXTRUDER_SENSOR) - #define MMU_LOADING_ATTEMPTS_NR 5 //max. number of attempts to load filament if first load fail + #define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail #endif /** From ac0511f02af0ca97b8a975b4cce2c3cce4ddb325 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Sep 2020 16:51:59 -0500 Subject: [PATCH 0299/1370] Allow M524 between M23 and M24 --- Marlin/src/gcode/sd/M524.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/src/gcode/sd/M524.cpp b/Marlin/src/gcode/sd/M524.cpp index b27814cc38..089d2e2f0c 100644 --- a/Marlin/src/gcode/sd/M524.cpp +++ b/Marlin/src/gcode/sd/M524.cpp @@ -34,6 +34,8 @@ void GcodeSuite::M524() { if (IS_SD_PRINTING()) card.flag.abort_sd_printing = true; + else if (card.isMounted()) + card.closefile(); } From 584c836918e46fd318fe9ff908610bdd61c8fab4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Sep 2020 16:46:26 -0500 Subject: [PATCH 0300/1370] E3 DWIN: General cleanup --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 128 +++++++++--------------------- Marlin/src/lcd/dwin/e3v2/dwin.h | 4 +- 2 files changed, 38 insertions(+), 94 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index faf9720fa7..1bd49d4dd2 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -494,6 +494,16 @@ inline void Draw_Back_First(const bool is_sel=true) { if (is_sel) Draw_Menu_Cursor(0); } +inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valref) { + if (encoder_diffState == ENCODER_DIFF_CW) + valref += EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_CCW) + valref -= EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_ENTER) + return true; + return false; +} + // // Draw Menus // @@ -1146,13 +1156,7 @@ inline ENCODER_DiffState get_encoder_state() { void HMI_Move_X() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Move_X_scale += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Move_X_scale -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_X_scale)) { checkkey = AxisMove; EncoderRate.enabled = false; DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); @@ -1175,13 +1179,7 @@ void HMI_Move_X() { void HMI_Move_Y() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Move_Y_scale += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Move_Y_scale -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Y_scale)) { checkkey = AxisMove; EncoderRate.enabled = false; DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); @@ -1204,13 +1202,7 @@ void HMI_Move_Y() { void HMI_Move_Z() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Move_Z_scale += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Move_Z_scale -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scale)) { checkkey = AxisMove; EncoderRate.enabled = false; DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); @@ -1236,13 +1228,7 @@ void HMI_Move_Z() { static float last_E_scale = 0; ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Move_E_scale += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Move_E_scale -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_E_scale)) { checkkey = AxisMove; EncoderRate.enabled = false; last_E_scale = HMI_ValueStruct.Move_E_scale; @@ -1278,11 +1264,7 @@ void HMI_Move_Z() { case -4: zoff_line = PREPARE_CASE_ZOFF + MROWS - index_prepare; break; default: zoff_line = TUNE_CASE_ZOFF + MROWS - index_tune; } - if (encoder_diffState == ENCODER_DIFF_CW) - HMI_ValueStruct.offset_value += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) - HMI_ValueStruct.offset_value -= EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.offset_value)) { EncoderRate.enabled = false; #if HAS_BED_PROBE probe.offset.z = dwin_zoffset; @@ -1326,13 +1308,7 @@ void HMI_Move_Z() { case -3: temp_line = PREHEAT_CASE_TEMP; break; default: temp_line = TUNE_CASE_TEMP + MROWS - index_tune; } - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.E_Temp += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.E_Temp -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.E_Temp)) { EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { // temperature checkkey = TemperatureID; @@ -1379,13 +1355,7 @@ void HMI_Move_Z() { case -3: bed_line = PREHEAT_CASE_BED; break; default: bed_line = TUNE_CASE_BED + MROWS - index_tune; } - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Bed_Temp += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Bed_Temp -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Bed_Temp)) { EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { checkkey = TemperatureID; @@ -1433,13 +1403,7 @@ void HMI_Move_Z() { default: fan_line = TUNE_CASE_FAN + MROWS - index_tune; } - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Fan_speed += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Fan_speed -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Fan_speed)) { EncoderRate.enabled = false; if (HMI_ValueStruct.show_mode == -1) { checkkey = TemperatureID; @@ -1477,13 +1441,7 @@ void HMI_Move_Z() { void HMI_PrintSpeed() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.print_speed += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.print_speed -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.print_speed)) { checkkey = Tune; EncoderRate.enabled = false; feedrate_percentage = HMI_ValueStruct.print_speed; @@ -1501,13 +1459,7 @@ void HMI_PrintSpeed() { void HMI_MaxFeedspeedXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Max_Feedspeed += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Max_Feedspeed -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Feedspeed)) { checkkey = MaxSpeed; EncoderRate.enabled = false; if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) @@ -1527,9 +1479,7 @@ void HMI_MaxFeedspeedXYZE() { void HMI_MaxAccelerationXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Max_Acceleration += EncoderRate.encoderMoveValue;} - else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Max_Acceleration -= EncoderRate.encoderMoveValue;} - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Acceleration)) { checkkey = MaxAcceleration; EncoderRate.enabled = false; if (HMI_flag.acc_axis == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); @@ -1555,11 +1505,7 @@ void HMI_MaxAccelerationXYZE() { void HMI_MaxJerkXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) - HMI_ValueStruct.Max_Jerk += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) - HMI_ValueStruct.Max_Jerk -= EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk)) { checkkey = MaxJerk; EncoderRate.enabled = false; if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) @@ -1581,13 +1527,7 @@ void HMI_MaxAccelerationXYZE() { void HMI_StepXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Max_Step += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Max_Step -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Step)) { checkkey = Step; EncoderRate.enabled = false; if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) @@ -1842,7 +1782,7 @@ void HMI_SDCardUpdate() { if (DWIN_lcd_sd_status != card.isMounted()) { DWIN_lcd_sd_status = card.isMounted(); // SERIAL_ECHOLNPAIR("HMI_SDCardUpdate: ", int(DWIN_lcd_sd_status)); - if (card.isMounted()) { + if (DWIN_lcd_sd_status) { if (checkkey == SelectFile) Redraw_SD_List(); } @@ -1863,10 +1803,11 @@ void HMI_SDCardUpdate() { } } -/* Start Frame */ - -void HMI_StartFrame(const bool with_update) { - Goto_MainMenu(); +// +// The status area is always on-screen, except during +// full-screen modal dialogs. (TODO: Keep alive during dialogs) +// +void Draw_Status_Area(const bool with_update) { // Clear the bottom area of the screen DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); @@ -1906,6 +1847,11 @@ void HMI_StartFrame(const bool with_update) { } } +void HMI_StartFrame(const bool with_update) { + Goto_MainMenu(); + Draw_Status_Area(with_update); +} + inline void Draw_Info_Menu() { Clear_Main_Window(); @@ -2233,12 +2179,10 @@ void HMI_PauseOrStop() { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (encoder_diffState == ENCODER_DIFF_CW) { + if (encoder_diffState == ENCODER_DIFF_CW) Draw_Select_Highlight(false); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { + else if (encoder_diffState == ENCODER_DIFF_CCW) Draw_Select_Highlight(true); - } else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (select_print.now == 1) { // pause window if (HMI_flag.select_flag) { diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 7b759d9cbf..8a1726691e 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -335,8 +335,8 @@ void Icon_temperature(bool value); void Icon_leveling(bool value); // Other -bool Pause_HeatStatus(); -void HMI_StartFrame(const bool with_update); // Startup screen +void Draw_Status_Area(const bool with_update); // Status Area +void HMI_StartFrame(const bool with_update); // Prepare the menu view void HMI_MainMenu(); // Main process screen void HMI_SelectFile(); // File page void HMI_Printing(); // Print page From 4bd1ecf8a72ff23e768d4f355190c9199b73a8e4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Sep 2020 16:48:03 -0500 Subject: [PATCH 0301/1370] E3 DWIN: "No Media" message --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 14 ++++++++++---- Marlin/src/lcd/dwin/e3v2/dwin.h | 2 ++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 1bd49d4dd2..c0096d379d 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1753,11 +1753,17 @@ inline void Redraw_SD_List() { Draw_Back_First(); - // As many files as will fit - LOOP_L_N(i, _MIN(nr_sd_menu_items(), MROWS)) - Draw_SDItem(i, i + 1); + if (card.isMounted()) { + // As many files as will fit + LOOP_L_N(i, _MIN(nr_sd_menu_items(), MROWS)) + Draw_SDItem(i, i + 1); - TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); + TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); + } + else { + DWIN_Draw_Rectangle(1, Color_Bg_Red, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); + DWIN_Draw_String(false, false, font16x32, Color_Yellow, Color_Bg_Red, ((DWIN_WIDTH) - 8 * 16) / 2, MBASE(3), F("No Media")); + } } bool DWIN_lcd_sd_status = false; diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 8a1726691e..1b2cb273e3 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -215,9 +215,11 @@ enum processID : uint8_t { // Color #define Color_White 0xFFFF +#define Color_Yellow 0xFF0F #define Color_Bg_Window 0x31E8 // Popup background color #define Color_Bg_Blue 0x1125 // Dark blue background color #define Color_Bg_Black 0x0841 // Black background color +#define Color_Bg_Red 0xF00F // Red background color #define Popup_Text_Color 0xD6BA // Popup font background color #define Line_Color 0x3A6A // Split line color #define Rectangle_Color 0xEE2F // Blue square cursor color From 46483512709d265c9bbf5a42e2d28b12f64f0edc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Sep 2020 16:50:53 -0500 Subject: [PATCH 0302/1370] CardReader cleanup --- Marlin/src/sd/cardreader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 5210c6ed92..37af4a3688 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -810,7 +810,7 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& curDir, const // Open curDir if (!sub->open(curDir, dosSubdirname, O_READ)) { - SERIAL_ECHOLNPAIR(STR_SD_OPEN_FILE_FAIL, dosSubdirname, "."); + openFailed(dosSubdirname); return nullptr; } From 7f93173659dd31f87599c7ef4f9352bccdeecd95 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 27 Sep 2020 23:22:08 -0300 Subject: [PATCH 0303/1370] LVGL followup fixing "C", etc. (#19517) --- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 8 ++++---- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 +- .../src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 09e39d8412..ddc9ea6271 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -21,10 +21,6 @@ */ #pragma once -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - #include #include @@ -168,6 +164,10 @@ #endif // ifdef TFT35 +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + extern char public_buf_m[100]; extern char public_buf_l[30]; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index b1bd88a60d..5d5227c2a4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -21,7 +21,7 @@ */ #pragma once -#include "../../../../inc/MarlinConfigPre.h" +#include "../../../../inc/MarlinConfig.h" #include "../../../../libs/W25Qxx.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index af292db7d5..c2ff2c4362 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -408,7 +408,7 @@ void SysTick_Callback() { OUT_WRITE(LCD_BACKLIGHT_PIN, LOW); LCD_Clear(0x0000); - lcd_draw_logo(); + TERN_(HAS_LOGO_IN_FLASH, lcd_draw_logo()); OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); delay(2000); @@ -724,6 +724,7 @@ lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_ if (temp) { strcpy(temp,".GCO"); } sd_read_base_addr = lv_open_gcode_file((char *)name_buf); sd_read_addr_offset = sd_read_base_addr; + if (sd_read_addr_offset == 0) return LV_FS_RES_NOT_EX; return LV_FS_RES_OK; } From 33f291d769a030c037ecfd5c898c5787f8cbe693 Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Mon, 28 Sep 2020 04:25:35 +0200 Subject: [PATCH 0304/1370] Fix Allen Key Probe pin test (#19520) --- Marlin/src/module/probe.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 12b617ec43..dd6bd70d2c 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -270,7 +270,13 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) do { #if ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED) - if (deploy == (READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING)) break; + if (deploy == ( + #if HAS_CUSTOM_PROBE_PIN + READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING + #else + READ(Z_MIN_PIN) == Z_MIN_ENDSTOP_INVERTING + #endif + )) break; #endif BUZZ(100, 659); From 717de1e703356ab14ad946962b1fed8186ee0b92 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Mon, 28 Sep 2020 04:28:48 +0200 Subject: [PATCH 0305/1370] Working LCD_USE_DMA_FSMC (#19522) --- Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 10 ++++++++++ Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp index 069be7ad54..008301d9bc 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -89,6 +89,16 @@ void TFT_FSMC::Init() { uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN; uint32_t controllerAddress; + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); + #endif + + #if ENABLED(LCD_USE_DMA_FSMC) + dma_init(FSMC_DMA_DEV); + dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); + #endif + #if PIN_EXISTS(TFT_RESET) OUT_WRITE(TFT_RESET_PIN, HIGH); delay(100); diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 799477ac10..47d7118b53 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -124,7 +124,7 @@ #define FSMC_CS_PIN PD7 // pin 88 = FSMC_NE1 #define FSMC_RS_PIN PD11 // pin 58 A16 Register. Only one address needed -//#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT (broken) +#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 From 03a5c7f52ad10da0b5143ca8356703826af8247a Mon Sep 17 00:00:00 2001 From: Emperor Date: Mon, 28 Sep 2020 04:38:30 +0200 Subject: [PATCH 0306/1370] Thermistor: Kis3d Silicone heater + precision cast plate (#19528) --- Marlin/Configuration.h | 1 + Marlin/src/lcd/thermistornames.h | 2 + Marlin/src/module/thermistor/thermistor_30.h | 66 ++++++++++++++++++++ Marlin/src/module/thermistor/thermistors.h | 3 + 4 files changed, 72 insertions(+) create mode 100644 Marlin/src/module/thermistor/thermistor_30.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 507b01b95a..35b45e7321 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -390,6 +390,7 @@ * 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....) * 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB) * 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB) + * 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup) * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup diff --git a/Marlin/src/lcd/thermistornames.h b/Marlin/src/lcd/thermistornames.h index bd0ca0e554..37f285d483 100644 --- a/Marlin/src/lcd/thermistornames.h +++ b/Marlin/src/lcd/thermistornames.h @@ -108,6 +108,8 @@ #define THERMISTOR_NAME "100k with 10k pull-up" // Modified thermistors +#elif THERMISTOR_ID == 30 + #define THERMISTOR_NAME "Kis3d EN AW NTC100K/3950" #elif THERMISTOR_ID == 51 #define THERMISTOR_NAME "EPCOS 1K" #elif THERMISTOR_ID == 52 diff --git a/Marlin/src/module/thermistor/thermistor_30.h b/Marlin/src/module/thermistor/thermistor_30.h new file mode 100644 index 0000000000..63cde610a4 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_30.h @@ -0,0 +1,66 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up +// Resistance 100k Ohms at 25deg. C +// Resistance Tolerance + / -1% +// B Value 3950K at 25/50 deg. C +// B Value Tolerance + / - 1% +// Kis3d Silicone Heater 24V 200W/300W with 6mm Precision cast plate (EN AW 5083) +// Temperature setting time 10 min to determine the 12Bit ADC value on the surface. (le3tspeak) +const temp_entry_t temptable_30[] PROGMEM = { + { OV( 1), 938 }, + { OV( 298), 125 }, // 1193 - 125° + { OV( 321), 121 }, // 1285 - 121° + { OV( 348), 117 }, // 1392 - 117° + { OV( 387), 113 }, // 1550 - 113° + { OV( 411), 110 }, // 1644 - 110° + { OV( 445), 106 }, // 1780 - 106° + { OV( 480), 101 }, // 1920 - 101° + { OV( 516), 97 }, // 2064 - 97° + { OV( 553), 92 }, // 2212 - 92° + { OV( 591), 88 }, // 2364 - 88° + { OV( 628), 84 }, // 2512 - 84° + { OV( 665), 79 }, // 2660 - 79° + { OV( 702), 75 }, // 2808 - 75° + { OV( 736), 71 }, // 2945 - 71° + { OV( 770), 67 }, // 3080 - 67° + { OV( 801), 63 }, // 3204 - 63° + { OV( 830), 59 }, // 3320 - 59° + { OV( 857), 55 }, // 3428 - 55° + { OV( 881), 51 }, // 3524 - 51° + { OV( 902), 47 }, // 3611 - 47° + { OV( 922), 42 }, // 3688 - 42° + { OV( 938), 38 }, // 3754 - 38° + { OV( 952), 34 }, // 3811 - 34° + { OV( 964), 29 }, // 3857 - 29° + { OV( 975), 25 }, // 3900 - 25° + { OV( 980), 23 }, // 3920 - 23° + { OV( 991), 17 }, // 3964 - 17° + { OV(1001), 9 }, // Calculated + { OV(1004), 5 }, // Calculated + { OV(1008), 0 }, // Calculated + { OV(1012), -5 }, // Calculated + { OV(1016), -10 }, // Calculated + { OV(1020), -15 } // Calculated +}; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 56921c6d18..0b0419c520 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -120,6 +120,9 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(23) // By AluOne #12622. Formerly 22 above. May need calibration/checking. #include "thermistor_23.h" #endif +#if ANY_THERMISTOR_IS(30) // Kis3d Silicone mat 24V 200W/300W with 6mm Precision cast plate (EN AW 5083) + #include "thermistor_30.h" +#endif #if ANY_THERMISTOR_IS(51) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 1 kOhm, "EPCOS" #include "thermistor_51.h" #endif From 5cd004defe1ac7fd0ab98f6f702041575172b4e3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 01:01:52 -0500 Subject: [PATCH 0307/1370] Update AnyCubic deps --- buildroot/share/PlatformIO/scripts/common-dependencies.h | 4 ---- platformio.ini | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index 344dce9f13..bc745733d1 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -77,10 +77,6 @@ #define USES_LIQUIDCRYSTAL #endif -#if BOTH(ANYCUBIC_LCD_I3MEGA, EXTENSIBLE_UI) - #define HAS_ANYCUBIC_TFT_EXTUI -#endif - #if SAVED_POSITIONS #define HAS_SAVED_POSITIONS #endif diff --git a/platformio.ini b/platformio.ini index f8ec029de3..bb4c74b7c6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -53,8 +53,8 @@ default_src_filter = + - - + - - - - - - - + - - + - - - - @@ -240,10 +240,10 @@ HAS_MENU_TEMPERATURE = src_filter=+ HAS_MENU_TMC = src_filter=+ HAS_MENU_TOUCH_SCREEN = src_filter=+ HAS_MENU_UBL = src_filter=+ -ANYCUBIC_LCD_I3MEGA = src_filter=+ +ANYCUBIC_LCD_CHIRON = src_filter=+ +ANYCUBIC_LCD_I3MEGA = src_filter=+ + HAS_DGUS_LCD = src_filter=+ + TOUCH_UI_FTDI_EVE = src_filter=+ -HAS_ANYCUBIC_TFT_EXTUI = src_filter=+ EXTUI_EXAMPLE = src_filter=+ MALYAN_LCD = src_filter=+ HAS_SPI_LCD = src_filter=+ From a11ba513899e8c4ed0400657635f18a37d1c650b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 01:01:35 -0500 Subject: [PATCH 0308/1370] Menu tweak --- Marlin/src/lcd/menu/menu.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 64923547e8..474f40ceca 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -343,8 +343,10 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { #endif // BABYSTEP_ZPROBE_OFFSET void _lcd_draw_homing() { - constexpr uint8_t line = (LCD_HEIGHT - 1) / 2; - if (ui.should_draw()) MenuItem_static::draw(line, GET_TEXT(MSG_LEVEL_BED_HOMING)); + if (ui.should_draw()) { + constexpr uint8_t line = (LCD_HEIGHT - 1) / 2; + MenuItem_static::draw(line, GET_TEXT(MSG_LEVEL_BED_HOMING)); + } } #if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) From ac900b17e01515d811a8cb0d53088add3f3e695f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 01:10:36 -0500 Subject: [PATCH 0309/1370] Prettier INI --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index bb4c74b7c6..75c64504ca 100644 --- a/platformio.ini +++ b/platformio.ini @@ -53,8 +53,8 @@ default_src_filter = + - - + - - - - - - - - + - + - - - - - From 58deab191524dbc230c6a1680204a39ff8880d66 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 01:13:27 -0500 Subject: [PATCH 0310/1370] Rename LCD conditionals (#19533) --- Marlin/Configuration_adv.h | 10 ++-- Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp | 4 +- .../dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp | 4 +- .../HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp | 4 +- .../dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp | 4 +- Marlin/src/HAL/LINUX/spi_pins.h | 2 +- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 2 +- Marlin/src/HAL/LPC1768/spi_pins.h | 2 +- .../u8g/u8g_com_HAL_LPC1768_hw_spi.cpp | 4 +- .../u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp | 4 +- .../u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp | 4 +- .../u8g/u8g_com_HAL_LPC1768_sw_spi.cpp | 4 +- .../STM32F1/dogm/u8g_com_stm32duino_swspi.cpp | 4 +- Marlin/src/HAL/shared/HAL_ST7920.h | 2 +- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/core/language.h | 2 +- Marlin/src/feature/power_monitor.cpp | 4 +- Marlin/src/feature/power_monitor.h | 4 +- Marlin/src/gcode/bedlevel/G26.cpp | 8 ++-- Marlin/src/gcode/calibrate/M48.cpp | 4 +- .../src/gcode/feature/power_monitor/M430.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 8 ++-- Marlin/src/inc/Conditionals_post.h | 12 ++--- Marlin/src/inc/SanityCheck.h | 20 ++++---- Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp | 4 +- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 4 +- Marlin/src/lcd/dogm/lcdprint_u8g.cpp | 4 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 4 +- .../u8g_dev_ssd1306_sh1106_128x64_I2C.cpp | 4 +- .../lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp | 4 +- .../lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp | 4 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 4 +- .../lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp | 4 +- Marlin/src/lcd/dogm/u8g_fontutf8.cpp | 4 +- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 4 +- Marlin/src/lcd/fontutils.cpp | 2 +- Marlin/src/lcd/lcdprint.cpp | 4 +- Marlin/src/lcd/lcdprint.h | 2 +- Marlin/src/lcd/menu/menu.cpp | 4 +- Marlin/src/lcd/menu/menu.h | 4 +- Marlin/src/lcd/menu/menu_configuration.cpp | 8 +++- Marlin/src/lcd/menu/menu_media.cpp | 4 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_tune.cpp | 8 ++-- Marlin/src/lcd/touch/touch_buttons.cpp | 2 +- Marlin/src/lcd/ultralcd.cpp | 28 +++++------ Marlin/src/lcd/ultralcd.h | 22 ++++----- Marlin/src/module/endstops.cpp | 4 +- Marlin/src/module/planner.cpp | 16 +++---- Marlin/src/module/planner.h | 6 +-- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 4 +- Marlin/src/pins/linux/pins_RAMPS_LINUX.h | 4 +- Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 6 +-- Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 6 +-- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 4 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 6 +-- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 5 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 9 ++-- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 4 +- .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 4 +- .../src/pins/lpc1769/pins_COHESION3D_MINI.h | 4 +- .../src/pins/lpc1769/pins_COHESION3D_REMIX.h | 4 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 5 +- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 2 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 2 +- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 4 +- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 4 +- Marlin/src/pins/mega/pins_INTAMSYS40.h | 2 +- Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 4 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 4 +- Marlin/src/pins/mega/pins_OVERLORD.h | 2 +- Marlin/src/pins/mega/pins_PICA.h | 2 +- Marlin/src/pins/mega/pins_SILVER_GATE.h | 2 +- Marlin/src/pins/pins.h | 4 +- Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 4 +- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 4 +- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 4 +- Marlin/src/pins/rambo/pins_RAMBO.h | 4 +- Marlin/src/pins/ramps/pins_3DRAG.h | 2 +- .../src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 2 +- .../src/pins/ramps/pins_FORMBOT_TREX2PLUS.h | 2 +- Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 2 +- Marlin/src/pins/ramps/pins_K8800.h | 4 +- Marlin/src/pins/ramps/pins_RAMPS.h | 4 +- Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 4 +- Marlin/src/pins/ramps/pins_TT_OSCAR.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER.h | 4 +- Marlin/src/pins/sam/pins_ARCHIM1.h | 4 +- Marlin/src/pins/sam/pins_ARCHIM2.h | 2 +- Marlin/src/pins/sam/pins_DUE3DOM.h | 4 +- Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 4 +- Marlin/src/pins/sam/pins_RADDS.h | 4 +- Marlin/src/pins/sam/pins_RAMPS_DUO.h | 4 +- Marlin/src/pins/sam/pins_RAMPS_FD_V1.h | 4 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 4 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 4 +- Marlin/src/pins/samd/pins_RAMPS_144.h | 4 +- Marlin/src/pins/sanguino/pins_ANET_10.h | 2 +- .../src/pins/sanguino/pins_MELZI_CREALITY.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI_V2.h | 2 +- .../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 6 +-- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 4 +- .../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 6 +-- .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 6 +-- .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 4 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 4 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 6 +-- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 6 +-- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 6 +-- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 6 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 4 +- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 6 +-- .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 4 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 11 +++-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 4 +- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 4 +- Marlin/src/pins/stm32f4/pins_BEAST.h | 4 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 15 +++--- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 16 ++++--- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 47 +++++++++++-------- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 6 +-- .../src/pins/stm32f4/pins_GENERIC_STM32F4.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 4 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 2 +- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 2 +- Marlin/src/pins/teensy3/pins_TEENSY31_32.h | 2 +- Marlin/src/pins/teensy3/pins_TEENSY35_36.h | 2 +- .../PlatformIO/scripts/common-dependencies.h | 2 +- platformio.ini | 10 ++-- 138 files changed, 353 insertions(+), 333 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e35f50fe62..915714039f 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1106,18 +1106,18 @@ #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) #endif -#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && (HAS_GRAPHICAL_LCD || HAS_CHARACTER_LCD) +#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && (HAS_MARLINUI_U8GLIB || HAS_MARLINUI_HD44780) //#define SHOW_REMAINING_TIME // Display estimated time to completion #if ENABLED(SHOW_REMAINING_TIME) //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time #endif - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits #endif - #if HAS_CHARACTER_LCD + #if HAS_MARLINUI_HD44780 //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar @@ -1328,7 +1328,7 @@ * controller events, as there is a trade-off between reliable * printing performance versus fast display updates. */ -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB // Show SD percentage next to the progress bar //#define DOGM_SD_PERCENT @@ -1398,7 +1398,7 @@ //#define MARLIN_SNAKE //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB // // Additional options for DGUS / DWIN displays diff --git a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp index c29b195578..cb95a48ccc 100644 --- a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp +++ b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp @@ -57,7 +57,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "../shared/Marduino.h" #include "../shared/Delay.h" @@ -189,5 +189,5 @@ uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB #endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp index 28e82d70d4..3e7f619997 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -59,7 +59,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include @@ -145,6 +145,6 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB #endif // __SAM3X8E__ diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp index 54c244d4f6..ea7204fa36 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp @@ -57,7 +57,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD && DISABLED(U8GLIB_ST7920) +#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920) #undef SPI_SPEED #define SPI_SPEED 2 // About 2 MHz @@ -144,5 +144,5 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void return 1; } -#endif // HAS_GRAPHICAL_LCD && !U8GLIB_ST7920 +#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920 #endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp index 960df1bd86..615a386c35 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp @@ -57,7 +57,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "../../shared/Delay.h" @@ -108,5 +108,5 @@ void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz } } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB #endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/LINUX/spi_pins.h b/Marlin/src/HAL/LINUX/spi_pins.h index a444196f04..01ba28e5b6 100644 --- a/Marlin/src/HAL/LINUX/spi_pins.h +++ b/Marlin/src/HAL/LINUX/spi_pins.h @@ -24,7 +24,7 @@ #include "../../core/macros.h" #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_GRAPHICAL_LCD, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) +#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently // needed due to the speed and mode required for communicating with each device being different. // This requirement can be removed if the SPI access to these devices is updated to use diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index b6491368cd..fd82e2884a 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -113,7 +113,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #define _IS_RX1_1 IS_RX1 #if IS_TX1(TMC_SW_SCK) #error "Serial port pins (1) conflict with other pins!" - #elif HAS_SPI_LCD + #elif HAS_WIRED_LCD #if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1) #error "Serial port pins (1) conflict with Encoder Buttons!" #elif ANY_TX(1, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \ diff --git a/Marlin/src/HAL/LPC1768/spi_pins.h b/Marlin/src/HAL/LPC1768/spi_pins.h index 2e6749bf57..b4da5d4df2 100644 --- a/Marlin/src/HAL/LPC1768/spi_pins.h +++ b/Marlin/src/HAL/LPC1768/spi_pins.h @@ -23,7 +23,7 @@ #include "../../core/macros.h" -#if BOTH(SDSUPPORT, HAS_GRAPHICAL_LCD) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) +#if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently // needed due to the speed and mode required for communicating with each device being different. // This requirement can be removed if the SPI access to these devices is updated to use diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp index befc348fab..057e10e0f5 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp @@ -57,7 +57,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include #include "../../shared/HAL_SPI.h" @@ -124,6 +124,6 @@ uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp index f03be9ab34..6f7efba4ae 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp @@ -77,7 +77,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include @@ -193,6 +193,6 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp index 1500c22a0d..592e27f6c0 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp @@ -57,7 +57,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include #include "../../shared/HAL_SPI.h" @@ -133,6 +133,6 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp index 4f52f7dd01..ca9d6ecfbe 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp @@ -57,7 +57,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD && DISABLED(U8GLIB_ST7920) +#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920) #include @@ -203,5 +203,5 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, return 1; } -#endif // HAS_GRAPHICAL_LCD && !U8GLIB_ST7920 +#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920 #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp index 894abb882a..f88fa88507 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp @@ -20,7 +20,7 @@ #include "../../../inc/MarlinConfig.h" -#if BOTH(HAS_GRAPHICAL_LCD, FORCE_SOFT_SPI) +#if BOTH(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) #include "../HAL.h" #include @@ -161,5 +161,5 @@ uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB #endif // STM32F1 diff --git a/Marlin/src/HAL/shared/HAL_ST7920.h b/Marlin/src/HAL/shared/HAL_ST7920.h index 05e8a1f2c5..4e362f96ba 100644 --- a/Marlin/src/HAL/shared/HAL_ST7920.h +++ b/Marlin/src/HAL/shared/HAL_ST7920.h @@ -27,7 +27,7 @@ * (bypassing U8G), it will allow the LIGHTWEIGHT_UI to operate. */ -#if BOTH(HAS_GRAPHICAL_LCD, LIGHTWEIGHT_UI) +#if BOTH(HAS_MARLINUI_U8GLIB, LIGHTWEIGHT_UI) void ST7920_cs(); void ST7920_ncs(); void ST7920_set_cmd(); diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index c6c6ef9b0d..8a425510c0 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1072,7 +1072,7 @@ void setup() { DWIN_UpdateLCD(); // Show bootscreen (first image) #else SETUP_RUN(ui.init()); - #if HAS_SPI_LCD && ENABLED(SHOW_BOOTSCREEN) + #if HAS_WIRED_LCD && ENABLED(SHOW_BOOTSCREEN) SETUP_RUN(ui.show_bootscreen()); #endif SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 0bcf799ac3..ed97e52f89 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -303,7 +303,7 @@ #define LCD_STR_C STR_C #define LCD_STR_E STR_E -#if HAS_CHARACTER_LCD +#if HAS_MARLINUI_HD44780 // Custom characters defined in the first 8 characters of the LCD #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string! diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp index bf5ac748a8..af31d156fc 100644 --- a/Marlin/src/feature/power_monitor.cpp +++ b/Marlin/src/feature/power_monitor.cpp @@ -44,7 +44,7 @@ uint8_t PowerMonitor::display_item; PowerMonitor power_monitor; // Single instance - this calls the constructor -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #if ENABLED(POWER_MONITOR_CURRENT) void PowerMonitor::draw_current() { @@ -70,6 +70,6 @@ PowerMonitor power_monitor; // Single instance - this calls the constructor } #endif -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB #endif // HAS_POWER_MONITOR diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index a86bd07ec4..a0eaf353f4 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -88,8 +88,8 @@ public: FORCE_INLINE static float getPower() { return getAmps() * getVolts(); } #endif - #if HAS_SPI_LCD - #if HAS_GRAPHICAL_LCD && DISABLED(LIGHTWEIGHT_UI) + #if HAS_WIRED_LCD + #if HAS_MARLINUI_U8GLIB && DISABLED(LIGHTWEIGHT_UI) FORCE_INLINE static bool display_enabled() { return flags != 0x00; } #endif #if ENABLED(POWER_MONITOR_CURRENT) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index cd0dbb13cd..c66d4a7d49 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -359,7 +359,7 @@ inline bool turn_on_heaters() { #if HAS_HEATED_BED if (g26_bed_temp > 25) { - #if HAS_SPI_LCD + #if HAS_WIRED_LCD ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99); ui.quick_feedback(); TERN_(HAS_LCD_MENU, ui.capture()); @@ -378,7 +378,7 @@ inline bool turn_on_heaters() { #endif // HAS_HEATED_BED // Start heating the active nozzle - #if HAS_SPI_LCD + #if HAS_WIRED_LCD ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99); ui.quick_feedback(); #endif @@ -391,7 +391,7 @@ inline bool turn_on_heaters() { #endif )) return G26_ERR; - #if HAS_SPI_LCD + #if HAS_WIRED_LCD ui.reset_status(); ui.quick_feedback(); #endif @@ -446,7 +446,7 @@ inline bool prime_nozzle() { else #endif { - #if HAS_SPI_LCD + #if HAS_WIRED_LCD ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99); ui.quick_feedback(); #endif diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 88273b46e4..8640dfa391 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -144,7 +144,7 @@ void GcodeSuite::M48() { float sample_sum = 0.0; LOOP_L_N(n, n_samples) { - #if HAS_SPI_LCD + #if HAS_WIRED_LCD // Display M48 progress in the status bar ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); #endif @@ -258,7 +258,7 @@ void GcodeSuite::M48() { SERIAL_ECHOLNPGM("Finished!"); dev_report(verbose_level > 0, mean, sigma, min, max, true); - #if HAS_SPI_LCD + #if HAS_WIRED_LCD // Display M48 results in the status bar char sigma_str[8]; ui.status_printf_P(0, PSTR(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str)); diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp index a669f0a76b..7639ea962d 100644 --- a/Marlin/src/gcode/feature/power_monitor/M430.cpp +++ b/Marlin/src/gcode/feature/power_monitor/M430.cpp @@ -38,7 +38,7 @@ */ void GcodeSuite::M430() { bool do_report = true; - #if HAS_SPI_LCD + #if HAS_WIRED_LCD #if ENABLED(POWER_MONITOR_CURRENT) if (parser.seen('I')) { power_monitor.set_current_display(parser.value_bool()); do_report = false; } #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 95c93beb9e..af8ef73817 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -456,11 +456,11 @@ #endif #if ENABLED(ULTRA_LCD) - #define HAS_SPI_LCD 1 + #define HAS_WIRED_LCD 1 #if ENABLED(DOGLCD) - #define HAS_GRAPHICAL_LCD 1 + #define HAS_MARLINUI_U8GLIB 1 #elif DISABLED(HAS_GRAPHICAL_TFT) - #define HAS_CHARACTER_LCD 1 + #define HAS_MARLINUI_HD44780 1 #endif #endif @@ -471,7 +471,7 @@ #define HAS_ADC_BUTTONS 1 #endif -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef LCD_PIXEL_WIDTH #define LCD_PIXEL_WIDTH 128 #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index c9a29b351c..bf297b633f 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -313,7 +313,7 @@ #elif ENABLED(MAKRPANEL) #define _LCD_CONTRAST_INIT 17 #elif ENABLED(MINIPANEL) - #define _LCD_CONTRAST_INIT 150 + #define _LCD_CONTRAST_INIT 150 #elif ENABLED(ZONESTAR_12864OLED) #define _LCD_CONTRAST_MIN 64 #define _LCD_CONTRAST_INIT 128 @@ -2455,7 +2455,7 @@ */ #if PIN_EXISTS(BEEPER) || EITHER(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) #define HAS_BUZZER 1 - #if NONE(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) + #if PIN_EXISTS(BEEPER) #define USE_BEEPER 1 #endif #endif @@ -2483,7 +2483,7 @@ /** * Make sure DOGLCD_SCK and DOGLCD_MOSI are defined. */ -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef DOGLCD_SCK #define DOGLCD_SCK SCK_PIN #endif @@ -2604,17 +2604,17 @@ #define HAS_FOLDER_SORTING 1 #endif -#if HAS_SPI_LCD +#if HAS_WIRED_LCD // Get LCD character width/height, which may be overridden by pins, configs, etc. #ifndef LCD_WIDTH - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #define LCD_WIDTH 21 #else #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) #endif #endif #ifndef LCD_HEIGHT - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #define LCD_HEIGHT 5 #else #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1cb8bcd7e9..7093d25219 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -680,7 +680,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * LCD Info Screen Style */ #if LCD_INFO_SCREEN_STYLE > 0 - #if HAS_GRAPHICAL_LCD || LCD_WIDTH < 20 || LCD_HEIGHT < 4 + #if HAS_MARLINUI_U8GLIB || LCD_WIDTH < 20 || LCD_HEIGHT < 4 #error "Alternative LCD_INFO_SCREEN_STYLE requires 20x4 Character LCD." #elif LCD_INFO_SCREEN_STYLE > 1 #error "LCD_INFO_SCREEN_STYLE only has options 0 and 1 at this time." @@ -693,16 +693,16 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(LCD_PROGRESS_BAR) #if NONE(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) #error "LCD_PROGRESS_BAR requires SDSUPPORT or LCD_SET_PROGRESS_MANUALLY." - #elif !HAS_CHARACTER_LCD + #elif !HAS_MARLINUI_HD44780 #error "LCD_PROGRESS_BAR requires a character LCD." - #elif HAS_GRAPHICAL_LCD + #elif HAS_MARLINUI_U8GLIB #error "LCD_PROGRESS_BAR does not apply to graphical displays." #elif ENABLED(FILAMENT_LCD_DISPLAY) #error "LCD_PROGRESS_BAR and FILAMENT_LCD_DISPLAY are not fully compatible. Comment out this line to use both." #elif PROGRESS_MSG_EXPIRE < 0 #error "PROGRESS_MSG_EXPIRE must be greater than or equal to 0." #endif -#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_GRAPHICAL_LCD, HAS_GRAPHICAL_TFT, HAS_CHARACTER_LCD, EXTENSIBLE_UI) +#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_MARLINUI_U8GLIB, HAS_GRAPHICAL_TFT, HAS_MARLINUI_HD44780, EXTENSIBLE_UI) #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Character LCD, Graphical LCD, TFT, or EXTENSIBLE_UI." #endif @@ -713,9 +713,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Custom Boot and Status screens */ -#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_GRAPHICAL_LCD, TOUCH_UI_FTDI_EVE) +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE) #error "SHOW_CUSTOM_BOOTSCREEN requires Graphical LCD or TOUCH_UI_FTDI_EVE." -#elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_GRAPHICAL_LCD +#elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_MARLINUI_U8GLIB #error "CUSTOM_STATUS_SCREEN_IMAGE requires a Graphical LCD." #endif @@ -782,7 +782,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "MESH_BED_LEVELING and BABYSTEP_ZPROBE_OFFSET is not a valid combination" #elif ENABLED(BABYSTEP_ZPROBE_OFFSET) && !HAS_BED_PROBE #error "BABYSTEP_ZPROBE_OFFSET requires a probe." - #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && !HAS_GRAPHICAL_LCD + #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && !HAS_MARLINUI_U8GLIB #error "BABYSTEP_ZPROBE_GFX_OVERLAY requires a Graphical LCD." #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && DISABLED(BABYSTEP_ZPROBE_OFFSET) #error "BABYSTEP_ZPROBE_GFX_OVERLAY requires a BABYSTEP_ZPROBE_OFFSET." @@ -1143,7 +1143,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Required LCD language */ -#if HAS_CHARACTER_LCD && !defined(DISPLAY_CHARSET_HD44780) +#if HAS_MARLINUI_HD44780 && !defined(DISPLAY_CHARSET_HD44780) #error "You must set DISPLAY_CHARSET_HD44780 to JAPANESE, WESTERN or CYRILLIC for your LCD controller." #endif @@ -1465,7 +1465,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif #endif -#if ENABLED(MESH_EDIT_GFX_OVERLAY) && !BOTH(AUTO_BED_LEVELING_UBL, HAS_GRAPHICAL_LCD) +#if ENABLED(MESH_EDIT_GFX_OVERLAY) && !BOTH(AUTO_BED_LEVELING_UBL, HAS_MARLINUI_U8GLIB) #error "MESH_EDIT_GFX_OVERLAY requires AUTO_BED_LEVELING_UBL and a Graphical LCD." #endif @@ -3081,7 +3081,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #undef _PIN_CONFLICT #endif -#if !HAS_GRAPHICAL_LCD +#if !HAS_MARLINUI_U8GLIB #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD." #endif diff --git a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp index 9fe69d4428..aa3c3c04a1 100644 --- a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp +++ b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp @@ -14,7 +14,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_CHARACTER_LCD +#if HAS_MARLINUI_HD44780 #include "../ultralcd.h" #include "../../MarlinCore.h" @@ -1119,4 +1119,4 @@ int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { #endif // DEBUG_LCDPRINT -#endif // HAS_CHARACTER_LCD +#endif // HAS_MARLINUI_HD44780 diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 3dc0925b43..e6cc227465 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_CHARACTER_LCD +#if HAS_MARLINUI_HD44780 /** * ultralcd_HD44780.cpp @@ -1517,4 +1517,4 @@ void MarlinUI::draw_status_screen() { #endif // HAS_LCD_MENU -#endif // HAS_CHARACTER_LCD +#endif // HAS_MARLINUI_HD44780 diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp index c9a55a16e3..a6bdb373dd 100644 --- a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp +++ b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp @@ -9,7 +9,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "ultralcd_DOGM.h" @@ -53,4 +53,4 @@ int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { return ret; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 4b51c2949b..82b6e768c6 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -27,7 +27,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD && DISABLED(LIGHTWEIGHT_UI) +#if HAS_MARLINUI_U8GLIB && DISABLED(LIGHTWEIGHT_UI) #include "dogm_Statusscreen.h" #include "ultralcd_DOGM.h" @@ -913,4 +913,4 @@ void MarlinUI::draw_status_message(const bool blink) { #endif } -#endif // HAS_GRAPHICAL_LCD && !LIGHTWEIGHT_UI +#endif // HAS_MARLINUI_U8GLIB && !LIGHTWEIGHT_UI diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index 70cb7c66d7..f97a323350 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -67,7 +67,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "HAL_LCD_com_defines.h" @@ -300,4 +300,4 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp index e70b3671b5..84c10dbb4d 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp @@ -55,7 +55,7 @@ #include "../../inc/MarlinConfig.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include #include "HAL_LCD_com_defines.h" @@ -233,4 +233,4 @@ u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_sw_spi = { u8g_dev_st7565_64128n_HAL_2x_f U8G_PB_DEV(u8g_dev_st7565_64128n_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_HAL_fn, U8G_COM_HAL_HW_SPI_FN); u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi = { u8g_dev_st7565_64128n_HAL_2x_fn, &u8g_dev_st7565_64128n_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN }; -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp index 838bee0ffc..740436d93c 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp @@ -55,7 +55,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "HAL_LCD_com_defines.h" @@ -205,4 +205,4 @@ u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_f u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; #endif -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 39c294defe..eb9b5315e5 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -56,7 +56,7 @@ #include "../../inc/MarlinConfig.h" -#if HAS_GRAPHICAL_LCD && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT)) +#if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT)) #include "HAL_LCD_com_defines.h" #include "ultralcd_DOGM.h" @@ -813,4 +813,4 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_TFT_FN); -#endif // HAS_GRAPHICAL_LCD && FSMC_CS +#endif // HAS_MARLINUI_U8GLIB && FSMC_CS diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp index e4e387c190..172afbd766 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp @@ -55,7 +55,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "HAL_LCD_com_defines.h" @@ -210,4 +210,4 @@ u8g_pb_t u8g_dev_uc1701_mini12864_HAL_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_SW_SPI_FN }; u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_hw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN }; -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp index 370b177470..89bdb09e1b 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp @@ -9,7 +9,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include #include "../fontutils.h" @@ -312,4 +312,4 @@ int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, PGM_P utf8_msg) { return data.adv; } -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index b4f32d3343..c48abac810 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -37,7 +37,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "ultralcd_DOGM.h" #include "u8g_fontutf8.h" @@ -687,4 +687,4 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop #endif // HAS_LCD_MENU -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp index 8b046af9a7..5bf07e1bd4 100644 --- a/Marlin/src/lcd/fontutils.cpp +++ b/Marlin/src/lcd/fontutils.cpp @@ -9,7 +9,7 @@ #include "../inc/MarlinConfig.h" -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #include "ultralcd.h" #include "../MarlinCore.h" #endif diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index 1355dbbf2d..e381c590f5 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -26,7 +26,7 @@ #include "../inc/MarlinConfigPre.h" -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #include "lcdprint.h" @@ -73,4 +73,4 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const i return n; } -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 031d467bf9..14df5309d7 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -34,7 +34,7 @@ #include "../inc/MarlinConfig.h" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "dogm/u8g_fontutf8.h" typedef u8g_uint_t lcd_uint_t; diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 474f40ceca..5d67410351 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -213,14 +213,14 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co clear_lcd(); // Re-initialize custom characters that may be re-used - #if HAS_CHARACTER_LCD + #if HAS_MARLINUI_HD44780 if (TERN1(AUTO_BED_LEVELING_UBL, !ubl.lcd_map_control)) set_custom_characters(on_status_screen() ? CHARSET_INFO : CHARSET_MENU); #endif refresh(LCDVIEW_CALL_REDRAW_NEXT); screen_changed = true; - TERN_(HAS_GRAPHICAL_LCD, drawing_screen = false); + TERN_(HAS_MARLINUI_U8GLIB, drawing_screen = false); TERN_(HAS_LCD_MENU, encoder_direction_normal()); diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index d692144464..5248662823 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -39,7 +39,7 @@ typedef void (*selectFunc_t)(); #define SS_INVERT 0x02 #define SS_DEFAULT SS_CENTER -#if HAS_GRAPHICAL_LCD && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) +#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) void _lcd_zoffset_overlay_gfx(const float zvalue); #endif @@ -215,7 +215,7 @@ void _lcd_draw_homing(); void line_to_z(const float &z); #endif -#if HAS_GRAPHICAL_LCD && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) +#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) void _lcd_zoffset_overlay_gfx(const float zvalue); #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 2953b3b464..22947ee514 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -60,7 +60,9 @@ void menu_advanced_settings(); static int8_t bar_percent = 0; if (ui.use_click()) { ui.goto_previous_screen(); - ui.set_custom_characters(CHARSET_MENU); + #if HAS_MARLINUI_HD44780 + ui.set_custom_characters(CHARSET_MENU); + #endif return; } bar_percent += (int8_t)ui.encoderPosition; @@ -73,7 +75,9 @@ void menu_advanced_settings(); void _progress_bar_test() { ui.goto_screen(progress_bar_test); - ui.set_custom_characters(CHARSET_INFO); + #if HAS_MARLINUI_HD44780 + ui.set_custom_characters(CHARSET_INFO); + #endif } #endif // LCD_PROGRESS_BAR_TEST diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index 3c0c6532f0..93ecc49d98 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -99,7 +99,7 @@ class MenuItem_sdfolder : public MenuItem_sdbase { encoderTopLine = 0; ui.encoderPosition = 2 * (ENCODER_STEPS_PER_MENU_ITEM); ui.screen_changed = true; - TERN_(HAS_GRAPHICAL_LCD, ui.drawing_screen = false); + TERN_(HAS_MARLINUI_U8GLIB, ui.drawing_screen = false); ui.refresh(); } }; @@ -107,7 +107,7 @@ class MenuItem_sdfolder : public MenuItem_sdbase { void menu_media() { ui.encoder_direction_menus(); - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB static uint16_t fileCnt; if (ui.first_page) fileCnt = card.get_num_Files(); #else diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 9fea0597db..4e356b3e0c 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -205,7 +205,7 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int #if DISABLED(HAS_GRAPHICAL_TFT) extern const char NUL_STR[]; SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_CHARACTER_LCD)); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); #else diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 758d75c8e9..b84cb8cbd7 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -46,7 +46,7 @@ #include "../../feature/babystep.h" #include "../lcdprint.h" - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #include "../dogm/ultralcd_DOGM.h" #endif @@ -68,10 +68,10 @@ const float spm = planner.steps_to_mm[axis]; MenuEditItemBase::draw_edit_screen(msg, BABYSTEP_TO_STR(spm * babystep.accum)); #if ENABLED(BABYSTEP_DISPLAY_TOTAL) - const bool in_view = TERN1(HAS_GRAPHICAL_LCD, PAGE_CONTAINS(LCD_PIXEL_HEIGHT - MENU_FONT_HEIGHT, LCD_PIXEL_HEIGHT - 1)); + const bool in_view = TERN1(HAS_MARLINUI_U8GLIB, PAGE_CONTAINS(LCD_PIXEL_HEIGHT - MENU_FONT_HEIGHT, LCD_PIXEL_HEIGHT - 1)); if (in_view) { - TERN_(HAS_GRAPHICAL_LCD, ui.set_font(FONT_MENU)); - lcd_moveto(0, TERN(HAS_GRAPHICAL_LCD, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1)); + TERN_(HAS_MARLINUI_U8GLIB, ui.set_font(FONT_MENU)); + lcd_moveto(0, TERN(HAS_MARLINUI_U8GLIB, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1)); lcd_put_u8str_P(GET_TEXT(MSG_BABYSTEP_TOTAL)); lcd_put_wchar(':'); lcd_put_u8str(BABYSTEP_TO_STR(spm * babystep.axis_total[BS_TOTAL_IND(axis)])); diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp index 8eae73df11..c97018c379 100644 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -74,7 +74,7 @@ TouchButtons touch; void TouchButtons::init() { touchIO.Init(); } uint8_t TouchButtons::read_buttons() { - #ifdef HAS_SPI_LCD + #ifdef HAS_WIRED_LCD int16_t x, y; if (!touchIO.getRawPoint(&x, &y)) return 0; diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index fc55c3c2f6..89dc0adaf3 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -51,7 +51,7 @@ MarlinUI ui; constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(STATUS_MESSAGE_SCROLLING) uint8_t MarlinUI::status_scroll_offset; // = 0 constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)); @@ -62,7 +62,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; constexpr uint8_t MAX_MESSAGE_LENGTH = 63; #endif -#if EITHER(HAS_SPI_LCD, EXTENSIBLE_UI) +#if EITHER(HAS_WIRED_LCD, EXTENSIBLE_UI) uint8_t MarlinUI::alert_level; // = 0 char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1]; #endif @@ -114,9 +114,9 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; } #endif -#if HAS_SPI_LCD +#if HAS_WIRED_LCD -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #include "dogm/ultralcd_DOGM.h" #endif @@ -167,7 +167,7 @@ uint8_t MarlinUI::lcd_status_update_delay = 1; // First update one loop delayed millis_t MarlinUI::next_button_update_ms; // = 0 -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB bool MarlinUI::drawing_screen, MarlinUI::first_page; // = false #endif @@ -372,7 +372,7 @@ void MarlinUI::init() { #endif // HAS_SHIFT_ENCODER - #if HAS_ENCODER_ACTION && HAS_SLOW_BUTTONS + #if BOTH(HAS_ENCODER_ACTION, HAS_SLOW_BUTTONS) slow_buttons = 0; #endif @@ -873,7 +873,7 @@ void MarlinUI::update() { #endif // HAS_LCD_MENU - if (ELAPSED(ms, next_lcd_update_ms) || TERN0(HAS_GRAPHICAL_LCD, drawing_screen)) { + if (ELAPSED(ms, next_lcd_update_ms) || TERN0(HAS_MARLINUI_U8GLIB, drawing_screen)) { next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; @@ -971,7 +971,7 @@ void MarlinUI::update() { // This runs every ~100ms when idling often enough. // Instead of tracking changes just redraw the Status Screen once per second. if (on_status_screen() && !lcd_status_update_delay--) { - lcd_status_update_delay = TERN(HAS_GRAPHICAL_LCD, 12, 9); + lcd_status_update_delay = TERN(HAS_MARLINUI_U8GLIB, 12, 9); if (max_display_update_time) max_display_update_time--; // Be sure never go to a very big number refresh(LCDVIEW_REDRAW_NOW); } @@ -1010,7 +1010,7 @@ void MarlinUI::update() { TERN_(HAS_ADC_BUTTONS, keypad_buttons = 0); - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #if ENABLED(LIGHTWEIGHT_UI) const bool in_status = on_status_screen(), @@ -1294,7 +1294,7 @@ void MarlinUI::update() { #endif // HAS_ENCODER_ACTION -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #if HAS_DISPLAY @@ -1342,7 +1342,7 @@ void MarlinUI::update() { next_filament_display = ms + 5000UL; // Show status message for 5s #endif - #if BOTH(HAS_SPI_LCD, STATUS_MESSAGE_SCROLLING) + #if BOTH(HAS_WIRED_LCD, STATUS_MESSAGE_SCROLLING) status_scroll_offset = 0; #endif @@ -1501,7 +1501,7 @@ void MarlinUI::update() { set_status_P(print_paused); #if ENABLED(PARK_HEAD_ON_PAUSE) - TERN_(HAS_SPI_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress + TERN_(HAS_WIRED_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress queue.inject_P(PSTR("M25 P\nM24")); #elif ENABLED(SDSUPPORT) queue.inject_P(PSTR("M25")); @@ -1610,11 +1610,11 @@ void MarlinUI::update() { refresh(); - #if HAS_SPI_LCD || defined(LED_BACKLIGHT_TIMEOUT) + #if HAS_WIRED_LCD || defined(LED_BACKLIGHT_TIMEOUT) const millis_t ms = millis(); #endif - TERN_(HAS_SPI_LCD, next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL); // Delay LCD update for SD activity + TERN_(HAS_WIRED_LCD, next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL); // Delay LCD update for SD activity #ifdef LED_BACKLIGHT_TIMEOUT leds.reset_timeout(ms); diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 59e7cbe7d1..c23dc5d84e 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -40,7 +40,7 @@ #if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT) #define HAS_DIGITAL_BUTTONS 1 #endif -#if !HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_SPI_LCD && DISABLED(NEWPANEL))) +#if !HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_WIRED_LCD && DISABLED(NEWPANEL))) #define HAS_SHIFT_ENCODER 1 #endif @@ -53,7 +53,7 @@ #define MULTI_MANUAL 1 #endif -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #include "../MarlinCore.h" @@ -104,7 +104,7 @@ #endif // HAS_LCD_MENU -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // REPRAPWORLD_KEYPAD (and ADC_KEYPAD) #if ENABLED(REPRAPWORLD_KEYPAD) @@ -231,7 +231,7 @@ #endif #endif -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB enum MarlinFont : uint8_t { FONT_STATUSMENU = 1, FONT_EDIT, @@ -316,11 +316,11 @@ public: static void refresh(); #else FORCE_INLINE static void refresh() { - TERN_(HAS_SPI_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW)); + TERN_(HAS_WIRED_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW)); } #endif - #if HAS_SPI_LCD + #if HAS_WIRED_LCD static bool detected(); static void init_lcd(); #else @@ -381,7 +381,7 @@ public: static void pause_print(); static void resume_print(); - #if HAS_SPI_LCD + #if HAS_WIRED_LCD static millis_t next_button_update_ms; @@ -403,7 +403,7 @@ public: static void show_bootscreen(); #endif - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB static void set_font(const MarlinFont font_nr); @@ -458,7 +458,7 @@ public: #endif - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB static bool drawing_screen, first_page; #else static constexpr bool drawing_screen = false, first_page = true; @@ -577,7 +577,7 @@ public: static void draw_select_screen_prompt(PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr); - #elif HAS_SPI_LCD + #elif HAS_WIRED_LCD static constexpr bool lcd_clicked = false; static constexpr bool on_status_screen() { return true; } @@ -692,7 +692,7 @@ private: static void finish_status(const bool persist); #endif - #if HAS_SPI_LCD + #if HAS_WIRED_LCD #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 static bool defer_return_to_status; #else diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index a3a89736e5..712182a0ea 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -351,7 +351,7 @@ void Endstops::event_handler() { if (hit_state == prev_hit_state) return; prev_hit_state = hit_state; if (hit_state) { - #if HAS_SPI_LCD + #if HAS_WIRED_LCD char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' '; #define _SET_STOP_CHAR(A,C) (chr## A = C) #else @@ -382,7 +382,7 @@ void Endstops::event_handler() { #endif SERIAL_EOL(); - TERN_(HAS_SPI_LCD, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP)); + TERN_(HAS_WIRED_LCD, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP)); #if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT) if (planner.abort_on_endstop_hit) { diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 30e1ffb0ca..2ef00f7959 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -234,7 +234,7 @@ float Planner::previous_nominal_speed_sqr; xyze_pos_t Planner::position_cart; #endif -#if HAS_SPI_LCD +#if HAS_WIRED_LCD volatile uint32_t Planner::block_buffer_runtime_us = 0; #endif @@ -747,7 +747,7 @@ block_t* Planner::get_current_block() { if (TEST(block->flag, BLOCK_BIT_RECALCULATE)) return nullptr; // We can't be sure how long an active block will take, so don't count it. - TERN_(HAS_SPI_LCD, block_buffer_runtime_us -= block->segment_time_us); + TERN_(HAS_WIRED_LCD, block_buffer_runtime_us -= block->segment_time_us); // As this block is busy, advance the nonbusy block pointer block_buffer_nonbusy = next_block_index(block_buffer_tail); @@ -761,7 +761,7 @@ block_t* Planner::get_current_block() { } // The queue became empty - TERN_(HAS_SPI_LCD, clear_block_buffer_runtime()); // paranoia. Buffer is empty now - so reset accumulated time to zero. + TERN_(HAS_WIRED_LCD, clear_block_buffer_runtime()); // paranoia. Buffer is empty now - so reset accumulated time to zero. return nullptr; } @@ -1578,7 +1578,7 @@ void Planner::quick_stop() { // forced to empty, there's no risk the ISR will touch this. delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; - #if HAS_SPI_LCD + #if HAS_WIRED_LCD // Clear the accumulated runtime clear_block_buffer_runtime(); #endif @@ -2081,7 +2081,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, const uint8_t moves_queued = nonbusy_movesplanned(); // Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill - #if EITHER(SLOWDOWN, HAS_SPI_LCD) || defined(XY_FREQUENCY_LIMIT) + #if EITHER(SLOWDOWN, HAS_WIRED_LCD) || defined(XY_FREQUENCY_LIMIT) // Segment time im micro seconds int32_t segment_time_us = LROUND(1000000.0f / inverse_secs); #endif @@ -2096,14 +2096,14 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Buffer is draining so add extra time. The amount of time added increases if the buffer is still emptied more. const int32_t nst = segment_time_us + LROUND(2 * time_diff / moves_queued); inverse_secs = 1000000.0f / nst; - #if defined(XY_FREQUENCY_LIMIT) || HAS_SPI_LCD + #if defined(XY_FREQUENCY_LIMIT) || HAS_WIRED_LCD segment_time_us = nst; #endif } } #endif - #if HAS_SPI_LCD + #if HAS_WIRED_LCD // Protect the access to the position. const bool was_enabled = stepper.suspend(); @@ -3029,7 +3029,7 @@ void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { #endif } -#if HAS_SPI_LCD +#if HAS_WIRED_LCD uint16_t Planner::block_buffer_runtime() { #ifdef __AVR__ diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 660d9ad5aa..c4e11490b1 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -218,7 +218,7 @@ typedef struct block_t { uint8_t valve_pressure, e_to_p_pressure; #endif - #if HAS_SPI_LCD + #if HAS_WIRED_LCD uint32_t segment_time_us; #endif @@ -438,7 +438,7 @@ class Planner { static uint8_t g_uc_extruder_last_move[EXTRUDERS]; #endif - #if HAS_SPI_LCD + #if HAS_WIRED_LCD volatile static uint32_t block_buffer_runtime_us; // Theoretical block buffer runtime in µs #endif @@ -871,7 +871,7 @@ class Planner { block_buffer_tail = next_block_index(block_buffer_tail); } - #if HAS_SPI_LCD + #if HAS_WIRED_LCD static uint16_t block_buffer_runtime(); static void clear_block_buffer_runtime(); #endif diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index 459d00e3e7..95f761f26a 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -124,7 +124,7 @@ // LCDs and Controllers // ////////////////////////// -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #define LCD_PINS_RS 13 #define LCD_PINS_ENABLE 17 @@ -152,7 +152,7 @@ #define BTN_EN2 12 #define BTN_ENC 14 -#endif // HAS_GRAPHICAL_LCD +#endif // HAS_MARLINUI_U8GLIB // Hardware serial pins // Add the following to Configuration.h or Configuration_adv.h to assign diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h index 2b7909221e..002d2ebd9c 100644 --- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h +++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h @@ -389,7 +389,7 @@ // LCDs and Controllers // ////////////////////////// -#if HAS_SPI_LCD +#if HAS_WIRED_LCD // // LCD Display output pins @@ -632,4 +632,4 @@ #endif #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h index 13e30b961c..c59c90ad1d 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -126,7 +126,7 @@ * for the onboard SD card, and a chip select signal is not provided for the remote * SD card. */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN P1_31 // EXP1-1 @@ -139,7 +139,7 @@ #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && HAS_CHARACTER_LCD + #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER) #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU B300 v1.0" #endif @@ -147,7 +147,7 @@ #error "SDSUPPORT is not supported by the BIQU B300 v1.0 when an LCD controller is used" #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD /** * SD Card Reader diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index ed5fd530e0..335e3a588d 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -97,7 +97,7 @@ * for the onboard SD card, and a chip select signal is not provided for the remote * SD card. */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN P1_31 // EXP1-1 @@ -110,7 +110,7 @@ #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && HAS_CHARACTER_LCD + #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER) #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU BQ111-A4" #endif @@ -118,7 +118,7 @@ #error "SDSUPPORT is not supported by the BIQU BQ111-A4 when an LCD controller is used" #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD /** * SD Card Reader diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h index d5e2560662..4165bb3503 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h @@ -65,7 +65,7 @@ * by redrawing the screen after SD card accesses. */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BTN_EN1 P3_26 #define BTN_EN2 P3_25 #define BTN_ENC P2_11 diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index a38be0bef7..e8983c7f54 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -214,7 +214,7 @@ #define EXPA2_09_PIN P0_15 #define EXPA2_10_PIN P0_17 -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(ANET_FULL_GRAPHICS_LCD) @@ -350,7 +350,7 @@ #endif // !CR10_STOCKDISPLAY -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Support diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index fb383ff5ff..3bdd3061b7 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -232,7 +232,7 @@ * ----- ----- * EXP2 EXP1 */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(ANET_FULL_GRAPHICS_LCD) #define LCD_PINS_RS P1_23 @@ -371,9 +371,9 @@ #endif // !FYSETC_MINI_12864 - #endif // HAS_GRAPHICAL_LCD + #endif // HAS_MARLINUI_U8GLIB -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #if HAS_ADC_BUTTONS #error "ADC BUTTONS do not work unmodifed on SKR 1.4, The ADC ports cannot take more than 3.3v." diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 9fade582e9..fd902afda4 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -92,7 +92,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN P1_30 // (37) not 5V tolerant #endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 7d0745aa2d..1cb6774a41 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -217,7 +217,7 @@ * that the garbage/lines are erased immediately after the SD card accesses are completed. */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN P1_31 // EXP1.1 #define BTN_ENC P1_30 // EXP1.2 #define BTN_EN1 P3_26 // EXP2.5 diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index c57c987a75..02fdaafd30 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -235,7 +235,8 @@ * ----- ----- * EXP1 EXP2 */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD + #define BEEPER_PIN P1_31 #define BTN_ENC P1_30 @@ -321,7 +322,7 @@ #endif // !CR10_STOCKDISPLAY -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 7b87c95f84..097f8be22a 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -326,7 +326,7 @@ #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD //#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 //#define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 @@ -370,8 +370,9 @@ #define DOGLCD_SCK SCK_PIN #define DOGLCD_MOSI MOSI_PIN - #define STAT_LED_BLUE_PIN P0_26 //(63) may change if cable changes + #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes + #else #if ENABLED(FYSETC_MINI_12864) @@ -420,9 +421,9 @@ //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 - #endif + #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // Ethernet pins diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index d798e38735..6331d6aa7c 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -109,7 +109,7 @@ // // Display // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(CR10_STOCKDISPLAY) @@ -185,7 +185,7 @@ #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Support diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index de987f95d2..0916d0d65b 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -193,7 +193,7 @@ #define EXPA1_09_PIN P0_16 #define EXPA1_10_PIN P2_08 -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(CR10_STOCKDISPLAY) @@ -238,7 +238,7 @@ #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Support diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h index 0314c5049f..d66ffbe4e5 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h @@ -141,7 +141,7 @@ // connector are shared with the onboard SD card, and Marlin does not support reading // G-code files from the onboard SD card. // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN P0_27 // EXP2-7 - open drain @@ -160,7 +160,7 @@ #error "SDSUPPORT is not currently supported by the Cohesion3D boards" #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // Ethernet pins diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h index 9dc870a353..66604ef635 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -206,7 +206,7 @@ #define NEOPIXEL_PIN P1_16 // EXP1-6 => Ethernet pin 6 (top row, 3 from left) #endif -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD #define BEEPER_PIN P1_31 // EXP1-1 //#define SD_DETECT_PIN P0_27 // EXP2-7 @@ -222,7 +222,7 @@ #define KILL_PIN P2_11 // EXP2-10 -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Support diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 3df10a41d7..a073a6fe30 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -241,11 +241,12 @@ * ----- ----- * EXP1 EXP2 */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN P1_31 #define BTN_ENC P1_30 #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS P1_00 #define BTN_EN1 P0_18 @@ -327,7 +328,7 @@ #endif // !CR10_STOCKDISPLAY -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 696270b417..33975df8ee 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -109,7 +109,7 @@ #define STAT_LED_RED_PIN P1_19 #define STAT_LED_BLUE_PIN P1_20 -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD /* The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index 75c899fe01..50e7eb1914 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -178,6 +178,6 @@ #define LCD_PINS_ENABLE P0_18 #define LCD_PINS_D4 P0_15 #define KILL_PIN P2_11 -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD #error "Only the CR10_STOCKDISPLAY is supported with TH3D EZBoard." #endif diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index 2fb112f5af..2fe9a43ba1 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -105,7 +105,7 @@ #define SUICIDE_PIN 54 // Must be enabled at startup to keep power flowing #define KILL_PIN -1 -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN 18 @@ -148,4 +148,4 @@ #endif // !NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index d21cd22e53..e30a65b90e 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -123,7 +123,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN 18 @@ -170,4 +170,4 @@ #endif // !NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h index 3dc9c9a6be..3c4f3c719a 100644 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -122,7 +122,7 @@ #define BEEPER_PIN 18 -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_PINS_RS 20 #define LCD_PINS_ENABLE 30 #define LCD_PINS_D4 14 diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index 9005ac2acf..ff7cf15714 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -130,7 +130,7 @@ // #define BEEPER_PIN 64 -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_PINS_RS 14 #define LCD_PINS_ENABLE 15 @@ -152,4 +152,4 @@ #define SHIFT_EN 17 #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index 74a45eac01..963911ec5d 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -212,7 +212,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) @@ -260,7 +260,7 @@ #define BTN_CENTER 15 // J0 #define BTN_ENC BTN_CENTER -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Card diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h index 9589fa5851..045c1bc0fa 100644 --- a/Marlin/src/pins/mega/pins_OVERLORD.h +++ b/Marlin/src/pins/mega/pins_OVERLORD.h @@ -119,7 +119,7 @@ // // LCD / Controller // -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB // OVERLORD OLED pins #define LCD_PINS_RS 20 #define LCD_PINS_D5 21 diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h index acaeefe178..ff4d3e834d 100644 --- a/Marlin/src/pins/mega/pins_PICA.h +++ b/Marlin/src/pins/mega/pins_PICA.h @@ -137,7 +137,7 @@ // #define BEEPER_PIN 29 -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_PINS_RS 33 #define LCD_PINS_ENABLE 30 #define LCD_PINS_D4 35 diff --git a/Marlin/src/pins/mega/pins_SILVER_GATE.h b/Marlin/src/pins/mega/pins_SILVER_GATE.h index e339b0472a..41cbe5e0e0 100644 --- a/Marlin/src/pins/mega/pins_SILVER_GATE.h +++ b/Marlin/src/pins/mega/pins_SILVER_GATE.h @@ -72,7 +72,7 @@ #define HEATER_BED_PIN 8 #define TEMP_BED_PIN 6 -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #if ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920 #define LCD_PINS_RS 30 #define LCD_PINS_ENABLE 20 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 0ccdadadde..3ec4e1a34b 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -1227,7 +1227,7 @@ #define LCD_PINS_D4 -1 #endif -#if HAS_CHARACTER_LCD || TOUCH_UI_ULTIPANEL +#if HAS_MARLINUI_HD44780 || TOUCH_UI_ULTIPANEL #ifndef LCD_PINS_D5 #define LCD_PINS_D5 -1 #endif @@ -1597,7 +1597,7 @@ #define Z4_MS3_PIN -1 #endif -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #if !defined(ST7920_DELAY_1) && defined(BOARD_ST7920_DELAY_1) #define ST7920_DELAY_1 BOARD_ST7920_DELAY_1 #endif diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 21e43bb361..2ea15c97d3 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -160,7 +160,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL +#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL #define KILL_PIN 32 @@ -188,4 +188,4 @@ #define SD_DETECT_PIN 15 #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index 39ba3ddf04..4a1bf70b6e 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -166,7 +166,7 @@ // // LCD / Controller // -#if ANY(HAS_SPI_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) +#if ANY(HAS_WIRED_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #define KILL_PIN 32 @@ -196,4 +196,4 @@ #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE -#endif // HAS_SPI_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE +#endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index c41a6ac179..6314bc07b8 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -141,7 +141,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL +#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL #if !MB(MINIRAMBO_10A) #define KILL_PIN 32 @@ -189,4 +189,4 @@ #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_SPI_LCD || TOUCH_UI_ULTIPANEL +#endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 2109eb615b..735852b2ff 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -183,7 +183,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL +#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL #define KILL_PIN 80 @@ -249,4 +249,4 @@ #endif // !NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h index 1989a1657f..f0057e1fc9 100644 --- a/Marlin/src/pins/ramps/pins_3DRAG.h +++ b/Marlin/src/pins/ramps/pins_3DRAG.h @@ -106,7 +106,7 @@ #define BEEPER_PIN 33 -#endif // HAS_SPI_LCD && NEWPANEL +#endif // ULTRA_LCD && NEWPANEL /** * M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h index 3fa738e322..87d24890c9 100644 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -87,7 +87,7 @@ // // LCDs and Controllers // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(ZONESTAR_LCD) #define LCD_PINS_RS 2 #define LCD_PINS_ENABLE 36 diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h index 362ff7ae43..75a219c177 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h @@ -197,7 +197,7 @@ #define LCD_PINS_D7 29 #endif -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(200) #endif diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index 3f7575497c..3fa3cc9e8c 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -261,7 +261,7 @@ #define NEOPIXEL_PIN 25 #endif - #elif HAS_GRAPHICAL_LCD + #elif HAS_MARLINUI_U8GLIB #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 17 diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h index f526b9b226..7e8c245a41 100644 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -95,7 +95,7 @@ // #define BEEPER_PIN 6 -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_SDSS 53 @@ -119,4 +119,4 @@ #define BTN_ENC 23 #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index b2d394e61d..aa73aabbc1 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -430,7 +430,7 @@ // LCDs and Controllers // ////////////////////////// -#if HAS_SPI_LCD +#if HAS_WIRED_LCD // // LCD Display output pins @@ -706,7 +706,7 @@ #endif #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #if ENABLED(REPRAPWORLD_KEYPAD) && DISABLED(ADC_KEYPAD) #define SHIFT_OUT 40 diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index 412aa22902..1c2cb60957 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -128,7 +128,7 @@ // AnyCubic made the following changes to 1.1.0-RC8 // If these are appropriate for your LCD let us know. // -#if 0 && HAS_SPI_LCD +#if 0 && HAS_WIRED_LCD // LCD Display output pins #if BOTH(NEWPANEL, PANEL_ONE) @@ -154,4 +154,4 @@ #define DOGLCD_A0 42 #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index 33b2a60d64..1568288e69 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -271,7 +271,7 @@ // LCDs and Controllers // ////////////////////////// -#if HAS_SPI_LCD +#if HAS_WIRED_LCD // // LCD Display output pins diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index 2dfde42bac..597a37bdbc 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -119,7 +119,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN 18 @@ -158,7 +158,7 @@ #endif // !NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h index 8c54cad3b6..6e3768c663 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM1.h +++ b/Marlin/src/pins/sam/pins_ARCHIM1.h @@ -181,7 +181,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN 23 // D24 PA15_CTS1 #define LCD_PINS_RS 17 // D17 PA12_RXD1 #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 @@ -198,4 +198,4 @@ #define BTN_EN2 13 // D13 PB27_TIOB0 #define BTN_ENC 16 // D16 PA13_TXD1 #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h index 3223ac7a0e..5a3fe0e4d5 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM2.h +++ b/Marlin/src/pins/sam/pins_ARCHIM2.h @@ -237,7 +237,7 @@ // // LCD / Controller // -#if ANY(HAS_SPI_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) +#if ANY(HAS_WIRED_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #define BEEPER_PIN 23 // D24 PA15_CTS1 #define LCD_PINS_RS 17 // D17 PA12_RXD1 #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index b7c01f843a..cd4033aa6f 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -113,7 +113,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_PINS_RS 42 #define LCD_PINS_ENABLE 43 @@ -168,4 +168,4 @@ #define BEEPER_PIN -1 #endif // SPARK_FULL_GRAPHICS -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 7f559f1190..5f9ad48a08 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -105,7 +105,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_PINS_RS 42 #define LCD_PINS_ENABLE 43 @@ -171,4 +171,4 @@ #define DOGLCD_CS 45 #endif // SPARK_FULL_GRAPHICS -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index c82c7e9c53..60fe351237 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -226,7 +226,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(RADDS_DISPLAY) @@ -287,7 +287,7 @@ #endif // SPARK_FULL_GRAPHICS -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #ifndef SDSS #define SDSS 4 diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h index 94f1b50776..bfc3968ffa 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -76,7 +76,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if BOTH(NEWPANEL, PANEL_ONE) #undef LCD_PINS_D4 @@ -129,4 +129,4 @@ #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h index 5662590e26..ee525eefaa 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -139,7 +139,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD // ramps-fd lcd adaptor #define BEEPER_PIN 37 @@ -203,7 +203,7 @@ #define DOGLCD_MISO 74 // MISO_PIN #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #if HAS_TMC_UART /** diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 524c14d198..b9e61fb27c 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -200,7 +200,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BEEPER_PIN 62 @@ -271,4 +271,4 @@ #define BTN_ENC 40 #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 187473b3dd..dc0c127995 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -186,7 +186,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BEEPER_PIN 62 @@ -253,4 +253,4 @@ #define BTN_ENC 40 #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index 388ac1a331..6076be07e9 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -287,7 +287,7 @@ // LCDs and Controllers // ////////////////////////// -#if HAS_SPI_LCD +#if HAS_WIRED_LCD // // LCD Display output pins @@ -594,7 +594,7 @@ #endif #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Support diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index 3978198eef..f33cdc83ac 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -152,7 +152,7 @@ * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_SDSS 28 #if ENABLED(ADC_KEYPAD) #define SERVO0_PIN 27 // free for BLTouch/3D-Touch diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index 4817ce8043..9f406c1f78 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -36,7 +36,7 @@ #define BOARD_INFO_NAME "Melzi (Creality)" // Alter timing for graphical display -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h index 8128fb86e6..5014620c6b 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h @@ -28,7 +28,7 @@ #define BOARD_INFO_NAME "Melzi (Malyan)" // Alter timing for graphical display -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif diff --git a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h index 9e433f19c4..f878941037 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h @@ -27,7 +27,7 @@ #define BOARD_INFO_NAME "Melzi (Tronxy)" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(0) #endif diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h index 1cdf51117f..275498d558 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_V2.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_V2.h @@ -24,7 +24,7 @@ #define BOARD_INFO_NAME "Melzi V2" -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(0) #endif diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index 4b4fb1d70e..121e1db6f2 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -154,11 +154,11 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define SD_DETECT_PIN -1 - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #if ENABLED(LCD_FOR_MELZI) @@ -290,7 +290,7 @@ #define BTN_EN2 10 #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index a3cb987fff..fd741d296d 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -171,7 +171,7 @@ * EXP1 */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(CR10_STOCKDISPLAY) @@ -225,7 +225,7 @@ #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and MKS_LCD12864 are currently supported on the BIGTREE_SKR_E3_DIP." #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 4f03d3bbd7..30d057d900 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -129,7 +129,7 @@ #define EXP1_3 PB7 #endif -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(CR10_STOCKDISPLAY) @@ -173,7 +173,7 @@ #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, and MKS_MINI_12864 are currently supported on the BIGTREE_SKR_MINI_E3." #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) @@ -185,7 +185,7 @@ * _____ _____ * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) MOD_RESET | 3 4 | SD_CS (PA10) - * (FREE) PB9 | 5 6 PA10 (SD_CS) (PB8) LCD_CS | 5 6 MOSI (SPI1-MOSI) + * (FREE) PB9 | 5 6 | PA10 (SD_CS) (PB8) LCD_CS | 5 6 | MOSI (SPI1-MOSI) * RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | RESET * (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V * ----- ----- diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index aaecc05442..3397c34f33 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -110,7 +110,7 @@ * EXP2 EXP1 */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PC10 #define BTN_ENC PC11 @@ -172,7 +172,7 @@ #endif // !FYSETC_MINI_12864 - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif @@ -186,7 +186,7 @@ #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Card diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index e67a6d3b1b..66930a2ea5 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -142,7 +142,7 @@ #endif // Alter timing for graphical display -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index 2521359e53..3a872db025 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -120,7 +120,7 @@ // // LCD Pins // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define LCD_PINS_RS PD1 // 49 // CS chip select /SS chip slave select @@ -281,4 +281,4 @@ #endif #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index a04d6d261f..ebe5964d05 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -139,11 +139,11 @@ // // LCD Pins // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PC9 - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #define DOGLCD_A0 PA15 #ifdef pins_v2_20190128 diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 24aa83d948..de5ea45d44 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -130,10 +130,10 @@ * Note: Pin 4 on the Cheetah board is assigned to an I/O, it is assigned to RESET on the Ender-3 board. */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PC9 - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #define DOGLCD_A0 PB14 #define DOGLCD_CS PB12 #define DOGLCD_SCK PB13 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index b6520d563c..ca25c45a7b 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -135,7 +135,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) // @@ -158,7 +158,7 @@ //#define LCD_UART_RX PD9 #endif - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif @@ -170,7 +170,7 @@ #endif #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) // diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 7dbee215a0..02fd3bcae7 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -135,7 +135,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) // @@ -166,7 +166,7 @@ //#define LCD_UART_RX PD9 #endif - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif @@ -178,7 +178,7 @@ #endif #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // Beeper diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index b6520d563c..ca25c45a7b 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -135,7 +135,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) // @@ -158,7 +158,7 @@ //#define LCD_UART_RX PD9 #endif - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif @@ -170,7 +170,7 @@ #endif #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) // diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index 7731ffb5e7..fc18263fdd 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -135,7 +135,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) @@ -168,7 +168,7 @@ //#define LCD_UART_RX PD9 #endif - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif @@ -180,7 +180,7 @@ #endif #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // Beeper diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 19f3c3efda..a530c89d2c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -320,7 +320,7 @@ #endif -#if HAS_SPI_LCD && !HAS_SPI_TFT +#if HAS_WIRED_LCD && !HAS_SPI_TFT // NON TFT Displays @@ -361,7 +361,7 @@ #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD && !HAS_SPI_TFT +#endif // HAS_WIRED_LCD && !HAS_SPI_TFT #define HAS_SPI_FLASH 1 #define SPI_FLASH_SIZE 0x1000000 // 16MB diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index bbacbf5585..015e29bdbe 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -132,7 +132,7 @@ * ----- ----- ----- * EXP1 EXP2 EXP3 */ -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PC1 #define BTN_ENC PC3 @@ -162,7 +162,7 @@ #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Card diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index 2bd417951f..aa1ccedb35 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -81,7 +81,7 @@ // // LCD Pins // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PD2 #define BTN_ENC PB3 #define LCD_PINS_RS PC3 @@ -111,7 +111,7 @@ #endif // !MKS_MINI_12864 - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif @@ -123,7 +123,7 @@ #endif #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // Motor current PWM pins #define MOTOR_CURRENT_PWM_XY_PIN PB0 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index bcb731df71..5cdeda3a83 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -96,7 +96,7 @@ // // LCD Pins // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PC1 #define BTN_ENC PC3 @@ -126,7 +126,7 @@ #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // SD Card diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index be3b130c85..caa5e2b8fc 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -233,9 +233,6 @@ // // LCD / Controller // -#ifndef BEEPER_PIN - #define BEEPER_PIN PC5 -#endif /** * Note: MKS Robin TFT screens use various TFT controllers. @@ -343,7 +340,7 @@ #endif -#if HAS_SPI_LCD && !HAS_SPI_TFT +#if HAS_WIRED_LCD && !HAS_SPI_TFT // NON TFT Displays @@ -380,7 +377,7 @@ #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD && !HAS_SPI_TFT +#endif // HAS_WIRED_LCD && !HAS_SPI_TFT #define HAS_SPI_FLASH 1 #define SPI_FLASH_SIZE 0x1000000 // 16MB @@ -391,6 +388,10 @@ #define W25QXX_SCK_PIN PB13 #endif +#ifndef BEEPER_PIN + #define BEEPER_PIN PC5 +#endif + #if ENABLED(SPEAKER) && BEEPER_PIN == PC5 #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index e445b8169b..93f0de33da 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -225,7 +225,7 @@ #define BTN_EN2 PG4 #endif -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD #define BEEPER_PIN PC5 #define BTN_ENC PG2 diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index 79f53f02c2..cf2ba2c5fa 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -97,7 +97,7 @@ // // LCD Pins // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define LCD_PINS_RS 49 // CS chip select /SS chip slave select @@ -258,4 +258,4 @@ #endif #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index 468ee5394a..e74698f89e 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -112,7 +112,7 @@ // // LCD Pins // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define LCD_PINS_RS 49 // CS chip select /SS chip slave select @@ -282,4 +282,4 @@ #endif #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h index d23442cced..268b7b59cd 100644 --- a/Marlin/src/pins/stm32f4/pins_BEAST.h +++ b/Marlin/src/pins/stm32f4/pins_BEAST.h @@ -120,7 +120,7 @@ // // LCD Pins // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define LCD_PINS_RS 49 // CS chip select /SS chip slave select @@ -282,4 +282,4 @@ #endif #endif // NEWPANEL -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 7843572e13..c37f6cce04 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -187,21 +187,22 @@ #define SDSS PA4 /** - * -------------------------------------BTT002 V1.0----------------------------------------------- - * _____ _____ | + * -------------------------------------BTT002 V1.0-------------------------------------------- + * ----- ----- | * PA3 | · · | GND 5V | · · | GND | * NRESET | · · | PC4(SD_DET) (LCD_D7) PE13 | · · | PE12 (LCD_D6) | * (MOSI)PA7 | · · | PB0(BTN_EN2) (LCD_D5) PE11 | · · | PE10 (LCD_D4) | * (SD_SS)PA4 | · · | PC5(BTN_EN1) (LCD_RS) PE8 | · · | PE9 (LCD_EN) | * (SCK)PA5 | · · | PA6(MISO) (BTN_ENC) PB1 | · · | PE7 (BEEPER) | - *  ̄ ̄  ̄ ̄ | + * ----- ----- | * EXP2 EXP1 | - * --------------------------------------------------------------------------------------------- + * -------------------------------------------------------------------------------------------- */ + // // LCDs and Controllers // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PE7 #define BTN_ENC PB1 @@ -236,7 +237,7 @@ #endif // Alter timing for graphical display - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif @@ -248,7 +249,7 @@ #endif #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD // // RGB LEDs diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index ddca719e53..dc8ce9f2d1 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -290,9 +290,12 @@ // overriding pins to access. // #if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN PB10 #define SDSS PB12 + #elif SD_CONNECTION_IS(ONBOARD) + // Instruct the STM32 HAL to override the default SPI pins from the variant.h file #define CUSTOM_SPI_PINS #define SDSS PA4 @@ -301,25 +304,26 @@ #define MISO_PIN PA6 #define MOSI_PIN PA7 #define SD_DETECT_PIN PC4 + #elif SD_CONNECTION_IS(CUSTOM_CABLE) - #define "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" + #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" #endif /** - * _____ _____ + * ----- ----- * NC | · · | GND 5V | · · | GND * RESET | · · | PB10(SD_DETECT) (LCD_D7) PG5 | · · | PG6 (LCD_D6) * (MOSI)PB15 | · · | PH10(BTN_EN2) (LCD_D5) PG7 | · · | PG8 (LCD_D4) * (SD_SS)PB12 | · · | PD10(BTN_EN1) (LCD_RS) PA8 | · · | PC10 (LCD_EN) * (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA15 | · · | PC11 (BEEPER) - *  ̄ ̄  ̄ ̄ + * ----- ----- * EXP2 EXP1 */ // // LCDs and Controllers // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PC11 #define BTN_ENC PA15 @@ -390,7 +394,7 @@ #endif // Alter timing for graphical display - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif @@ -402,6 +406,6 @@ #endif #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #undef TP diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index e9abd66795..8397276144 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -251,9 +251,12 @@ // Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2 // #if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN PF12 #define SDSS PB12 + #elif SD_CONNECTION_IS(ONBOARD) + // The SKR Pro's ONBOARD SD interface is on SPI1. // Due to a pull resistor on the clock line, it needs to use SPI Data Mode 3 to // function with Hardware SPI. This is not currently configurable in the HAL, @@ -264,29 +267,31 @@ #define MISO_PIN PA6 #define MOSI_PIN PB5 #define SD_DETECT_PIN PB11 + #elif SD_CONNECTION_IS(CUSTOM_CABLE) - #define "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" + #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" #endif /** - * _____ _____ + * ----- ----- * NC | · · | GND 5V | · · | GND * RESET | · · | PF12(SD_DETECT) (LCD_D7) PG7 | · · | PG6 (LCD_D6) * (MOSI)PB15 | · · | PF11(BTN_EN2) (LCD_D5) PG3 | · · | PG2 (LCD_D4) * (SD_SS)PB12 | · · | PG10(BTN_EN1) (LCD_RS) PD10 | · · | PD11 (LCD_EN) * (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA8 | · · | PG4 (BEEPER) - *  ̄ ̄  ̄ ̄ + * ----- ----- * EXP2 EXP1 */ // // LCDs and Controllers // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PG4 #define BTN_ENC PA8 #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS PG6 #define BTN_EN1 PD11 @@ -301,10 +306,12 @@ #undef BOARD_ST7920_DELAY_3 #elif ENABLED(MKS_MINI_12864) + #define DOGLCD_A0 PG6 #define DOGLCD_CS PG3 #define BTN_EN1 PG10 #define BTN_EN2 PF11 + #else #define LCD_PINS_RS PD10 @@ -343,32 +350,32 @@ #endif - // Alter timing for graphical display - #if HAS_GRAPHICAL_LCD - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) - #endif - #endif +#endif // HAS_WIRED_LCD -#endif // HAS_SPI_LCD +// Alter timing for graphical display +#if HAS_MARLINUI_U8GLIB + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #endif +#endif // // WIFI // /** - * _____ + * ----- * TX | 1 2 | GND Enable PG1 // Must be high for module to run * Enable | 3 4 | GPIO2 Reset PG0 // active low, probably OK to leave floating * Reset | 5 6 | GPIO0 GPIO2 PF15 // must be high (ESP3D software configures this with a pullup so OK to leave as floating) - * 3.3V| 7 8 | RX GPIO0 PF14 // Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) - *  ̄ ̄ + * 3.3V | 7 8 | RX GPIO0 PF14 // Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) + * ----- * W1 */ #define ESP_WIFI_MODULE_COM 6 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index a6d7f8a495..151f6c3bc0 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -199,7 +199,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BEEPER_PIN PC9 #define BTN_ENC PA8 @@ -261,7 +261,7 @@ #endif // Alter timing for graphical display - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif @@ -273,7 +273,7 @@ #endif #endif -#endif // HAS_SPI_LCD +#endif // HAS_WIRED_LCD #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN PB6 diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h index ae469365a9..4acfd743b7 100644 --- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h +++ b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h @@ -184,7 +184,7 @@ // // ST7920 Delays // -#if HAS_GRAPHICAL_LCD +#if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 338fda1e53..f386b7690b 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -147,7 +147,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define BTN_EN1 PB2 #define BTN_EN2 PB1 @@ -169,7 +169,7 @@ #endif // Alter timing for graphical display - #if HAS_GRAPHICAL_LCD + #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index 6c826b068d..e2463fd47e 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -165,7 +165,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #if ENABLED(SDSUPPORT) #define SDSS PB6 // CS for SD card in LCD #endif diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index 3fb8c7f259..6ffd35dff2 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -201,7 +201,7 @@ // //#define USE_INTERNAL_SD -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_PINS_RS 9 // E1 JP11-11 #define LCD_PINS_ENABLE 8 // E0 JP11-10 #define LCD_PINS_D4 7 // D7 JP11-8 diff --git a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h index b98c78fde1..45d1231f8e 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h @@ -98,7 +98,7 @@ // /* -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_PINS_RS 40 #define LCD_PINS_ENABLE 41 #define LCD_PINS_D4 42 diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h index 961dc0cff0..b1cd3d1612 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h @@ -130,7 +130,7 @@ // #define SDSS 39 // 8 -#if HAS_SPI_LCD +#if HAS_WIRED_LCD #define LCD_PINS_RS 40 #define LCD_PINS_ENABLE 41 #define LCD_PINS_D4 42 diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index bc745733d1..02a4502e3f 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -73,7 +73,7 @@ // Feature checks for SR_LCD_3W_NL #elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) #define USES_LIQUIDTWI2 -#elif ANY(HAS_CHARACTER_LCD, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) +#elif ANY(HAS_MARLINUI_HD44780, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) #define USES_LIQUIDCRYSTAL #endif diff --git a/platformio.ini b/platformio.ini index 75c64504ca..ff3c0fb810 100644 --- a/platformio.ini +++ b/platformio.ini @@ -208,13 +208,14 @@ HAS_L64XX = Arduino-L6470@0.8.0 NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 -HAS_GRAPHICAL_LCD = U8glib-HAL@~0.4.1 - src_filter=+ USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 -DWIN_CREALITY_LCD = src_filter=+ -HAS_CHARACTER_LCD = src_filter=+ +HAS_WIRED_LCD = src_filter=+ +HAS_MARLINUI_HD44780 = src_filter=+ +HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 + src_filter=+ HAS_GRAPHICAL_TFT = src_filter=+ +DWIN_CREALITY_LCD = src_filter=+ HAS_LCD_MENU = src_filter=+ HAS_GAMES = src_filter=+ MARLIN_BRICKOUT = src_filter=+ @@ -246,7 +247,6 @@ HAS_DGUS_LCD = src_filter=+ + EXTUI_EXAMPLE = src_filter=+ MALYAN_LCD = src_filter=+ -HAS_SPI_LCD = src_filter=+ USB_FLASH_DRIVE_SUPPORT = src_filter=+ AUTO_BED_LEVELING_BILINEAR = src_filter=+ AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ From 63e6437d661689688c20c3c02323ce37b6af6ce0 Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Mon, 28 Sep 2020 09:52:38 +0300 Subject: [PATCH 0311/1370] MarlinUI for SPI/I2C TFT-GLCD character-based display bridge (#19375) --- Marlin/Configuration.h | 8 + Marlin/Configuration_adv.h | 4 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 4 + Marlin/src/inc/Conditionals_LCD.h | 24 + Marlin/src/inc/Conditionals_post.h | 6 +- Marlin/src/inc/SanityCheck.h | 8 +- Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp | 1142 +++++++++++++++++ Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp | 1018 +++++++++++++++ Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h | 74 ++ Marlin/src/lcd/menu/menu_ubl.cpp | 8 +- Marlin/src/lcd/ultralcd.cpp | 14 +- Marlin/src/lcd/ultralcd.h | 6 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h | 16 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 8 + Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 8 + Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 15 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 9 + Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 9 + Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 11 +- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 53 +- Marlin/src/pins/pinsDebug_list.h | 3 + Marlin/src/pins/ramps/pins_RAMPS.h | 8 + Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 4 +- .../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 46 +- .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 11 + .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 6 + .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 13 + Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 7 + .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 9 +- buildroot/tests/LPC1769-tests | 14 + platformio.ini | 3 +- 31 files changed, 2516 insertions(+), 53 deletions(-) create mode 100644 Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp create mode 100644 Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp create mode 100644 Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 35b45e7321..bb724672b0 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1957,6 +1957,14 @@ // //#define FF_INTERFACEBOARD +// +// TFT GLCD Panel with Marlin UI +// Panel connected to main board by SPI or I2C interface. +// See https://github.com/Serhiy-K/TFTGLCDAdapter +// +//#define TFTGLCD_PANEL_SPI +//#define TFTGLCD_PANEL_I2C + //============================================================================= //======================= LCD / Controller Selection ======================= //========================= (Graphical LCDs) ======================== diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 915714039f..0435b6f97c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1106,7 +1106,7 @@ #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) #endif -#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && (HAS_MARLINUI_U8GLIB || HAS_MARLINUI_HD44780) +#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) //#define SHOW_REMAINING_TIME // Display estimated time to completion #if ENABLED(SHOW_REMAINING_TIME) //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation @@ -1117,7 +1117,7 @@ //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits #endif - #if HAS_MARLINUI_HD44780 + #if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 9fc9ec099e..dc91b7d6b1 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -997,6 +997,10 @@ if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point + #if IS_TFTGLCD_PANEL + ui.ubl_plot(lpos.x, lpos.y); // update plot screen + #endif + ui.refresh(); float new_z = z_values[lpos.x][lpos.y]; diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index af8ef73817..fa65991c2f 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -217,6 +217,28 @@ #define LCD_WIDTH 16 #define LCD_HEIGHT 2 +#elif EITHER(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) + + #define IS_TFTGLCD_PANEL 1 + #define IS_ULTIPANEL // Note that IS_ULTIPANEL leads to HAS_WIRED_LCD + + #if ENABLED(SDSUPPORT) && DISABLED(LCD_PROGRESS_BAR) + #define LCD_PROGRESS_BAR + #endif + #if ENABLED(TFTGLCD_PANEL_I2C) + #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD for I2C and SPI buses (LiquidTWI2 not required) + #define LCD_I2C_ADDRESS 0x27 // Must be equal to panel's I2C slave addres + #endif + #define STD_ENCODER_PULSES_PER_STEP 2 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 + #define LCD_WIDTH 20 // 20 or 24 chars in line + #define LCD_HEIGHT 10 // Character lines + #define LCD_CONTRAST_MIN 127 + #define LCD_CONTRAST_MAX 255 + #define DEFAULT_LCD_CONTRAST 250 + #define CONVERT_TO_EXT_ASCII // Use extended 128-255 symbols from ASCII table. + // At this time present conversion only for cyrillic - bg, ru and uk languages. + // First 7 ASCII symbols in panel font must be replaced with Marlin's special symbols. #endif #if ENABLED(IS_RRD_FG_SC) @@ -459,6 +481,8 @@ #define HAS_WIRED_LCD 1 #if ENABLED(DOGLCD) #define HAS_MARLINUI_U8GLIB 1 + #elif IS_TFTGLCD_PANEL + // Neither DOGM nor HD44780. Fully customized interface. #elif DISABLED(HAS_GRAPHICAL_TFT) #define HAS_MARLINUI_HD44780 1 #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index bf297b633f..80c42955e9 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -318,6 +318,10 @@ #define _LCD_CONTRAST_MIN 64 #define _LCD_CONTRAST_INIT 128 #define _LCD_CONTRAST_MAX 255 +#elif IS_TFTGLCD_PANEL + #define _LCD_CONTRAST_MIN 0 + #define _LCD_CONTRAST_INIT 250 + #define _LCD_CONTRAST_MAX 255 #endif #ifdef _LCD_CONTRAST_INIT @@ -2453,7 +2457,7 @@ /** * Buzzer/Speaker */ -#if PIN_EXISTS(BEEPER) || EITHER(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) +#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER, IS_TFTGLCD_PANEL) #define HAS_BUZZER 1 #if PIN_EXISTS(BEEPER) #define USE_BEEPER 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 7093d25219..5bd6ef7c78 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -693,8 +693,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(LCD_PROGRESS_BAR) #if NONE(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) #error "LCD_PROGRESS_BAR requires SDSUPPORT or LCD_SET_PROGRESS_MANUALLY." - #elif !HAS_MARLINUI_HD44780 - #error "LCD_PROGRESS_BAR requires a character LCD." + #elif NONE(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) + #error "LCD_PROGRESS_BAR only applies to HD44780 character LCD and TFTGLCD_PANEL_(SPI|I2C)." #elif HAS_MARLINUI_U8GLIB #error "LCD_PROGRESS_BAR does not apply to graphical displays." #elif ENABLED(FILAMENT_LCD_DISPLAY) @@ -2274,7 +2274,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(TFT_LVGL_UI_FSMC) \ + ENABLED(TFT_LVGL_UI_SPI) \ + ENABLED(ANYCUBIC_LCD_I3MEGA) \ - + ENABLED(ANYCUBIC_LCD_CHIRON) + + ENABLED(ANYCUBIC_LCD_CHIRON) \ + + ENABLED(TFTGLCD_PANEL_SPI) \ + + ENABLED(TFTGLCD_PANEL_I2C) #error "Please select only one LCD controller option." #endif diff --git a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp new file mode 100644 index 0000000000..6cf660a6a9 --- /dev/null +++ b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp @@ -0,0 +1,1142 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * @file lcdprint_TFTGLCD.cpp + * @brief LCD print API for TFT-GLCD interface + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +/** + * The TFTGLCD only supports ??? languages. + */ + +#include "../../inc/MarlinConfigPre.h" + +#if IS_TFTGLCD_PANEL + +#include "../ultralcd.h" +#include "../../MarlinCore.h" +#include "../../libs/numtostr.h" + +#include "ultralcd_TFTGLCD.h" + +#include + +int lcd_glyph_height(void) { return 1; } + +typedef struct _TFTGLCD_charmap_t { + wchar_t uchar; // the unicode char + uint8_t idx; // the glyph of the char in the ROM + uint8_t idx2; // the char used to be combined with the idx to simulate a single char +} TFTGLCD_charmap_t; + +#ifdef __AVR__ + #define IV(a) U##a +#else + #define IV(a) L##a +#endif + +static const TFTGLCD_charmap_t g_TFTGLCD_charmap_device[] PROGMEM = { + // sorted by uchar: + #if DISPLAY_CHARSET_HD44780 == JAPANESE + + {IV('¢'), 0xEC, 0}, // A2 + {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + {IV('ä'), 0xE1, 0}, // E4 + {IV('ö'), 0xEF, 0}, // F6 + {IV('÷'), 0xFD, 0}, // 00F7 + {IV('ü'), 0xF5, 0}, // 00FC + {IV('Ë£'), 0xEB, 0}, // 02E3 + + {IV('·'), 0xA5, 0}, // 0387 + {IV('Î'), 0xF4, 0}, // 038F + {IV('Θ'), 0xF2, 0}, // 0398, Theta + {IV('Ξ'), 0xE3, 0}, // 039E, Xi + {IV('Σ'), 0xF6, 0}, // 03A3, Sigma + {IV('Ω'), 0xF4, 0}, // 03A9, Omega + {IV('ά'), 0xE0, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('α'), 0xE0, 0}, // 03B1, alpha + {IV('β'), 0xE2, 0}, // 03B2, beta + {IV('ε'), 0xE3, 0}, // 03B5, epsilon + {IV('θ'), 0xF2, 0}, // 03B8, theta + {IV('μ'), 0xE4, 0}, // 03BC, mu + {IV('ξ'), 0xE3, 0}, // 03BE, xi + {IV('Ï€'), 0xF7, 0}, // 03C0, pi + {IV('Ï'), 0xE6, 0}, // 03C1, rho + {IV('σ'), 0xE5, 0}, // 03C3, sigma + + {IV('â†'), 0x7F, 0}, // 2190 + {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03) + {IV('√'), 0xE8, 0}, // 221A + {IV('∞'), 0xF3, 0}, // 221E + {IV('â–ˆ'), 0xFF, 0}, // 2588 + + //{IV(''), 0xA0, 0}, + {IV('。'), 0xA1, 0}, + {IV('「'), 0xA2, 0}, + {IV('ã€'), 0xA3, 0}, + {IV('ã‚›'), 0xDE, 0}, // ‶ + {IV('ã‚œ'), 0xDF, 0}, // '〫' + {IV('ã‚ '), '=', 0}, + {IV('ã‚¡'), 0xA7, 0}, + {IV('ã‚¢'), 0xB1, 0}, + {IV('ã‚£'), 0xA8, 0}, + {IV('イ'), 0xB2, 0}, + {IV('ã‚¥'), 0xA9, 0}, + {IV('ウ'), 0xB3, 0}, + {IV('ェ'), 0xAA, 0}, + {IV('エ'), 0xB4, 0}, + {IV('ã‚©'), 0xAB, 0}, + + {IV('オ'), 0xB5, 0}, + {IV('ã‚«'), 0xB6, 0}, + {IV('ガ'), 0xB6, 0xDE}, + {IV('ã‚­'), 0xB7, 0}, + {IV('ã‚®'), 0xB7, 0xDE}, // + {IV('ク'), 0xB8, 0}, + {IV('ã‚°'), 0xB8, 0xDE}, + {IV('ケ'), 0xB9, 0}, + {IV('ゲ'), 0xB9, 0xDE}, + {IV('コ'), 0xBA, 0}, + {IV('ã‚´'), 0xBA, 0xDE}, + {IV('サ'), 0xBB, 0}, + {IV('ザ'), 0xBB, 0xDE}, + {IV('ã‚·'), 0xBC, 0}, + {IV('ジ'), 0xBC, 0xDE}, + {IV('ス'), 0xBD, 0}, + {IV('ズ'), 0xBD, 0xDE}, + {IV('ã‚»'), 0xBE, 0}, + {IV('ゼ'), 0xBE, 0xDE}, + {IV('ソ'), 0xBF, 0}, + {IV('ゾ'), 0xBF, 0xDE}, + + {IV('ã‚¿'), 0xC0, 0}, + {IV('ダ'), 0xC0, 0xDE}, + {IV('ãƒ'), 0xC1, 0}, + {IV('ヂ'), 0xC1, 0xDE}, + {IV('ッ'), 0xAF, 0}, + {IV('ツ'), 0xC2, 0}, + {IV('ヅ'), 0xC2, 0xDE}, + {IV('テ'), 0xC3, 0}, + {IV('デ'), 0xC3, 0xDE}, + {IV('ト'), 0xC4, 0}, + {IV('ド'), 0xC4, 0xDE}, + {IV('ナ'), 0xC5, 0}, + {IV('ニ'), 0xC6, 0}, + {IV('ヌ'), 0xC7, 0}, + {IV('ãƒ'), 0xC8, 0}, + {IV('ノ'), 0xC9, 0}, + {IV('ãƒ'), 0xCA, 0}, + {IV('ãƒ'), 0xCA, 0xDE}, + {IV('パ'), 0xCA, 0xDF}, + {IV('ヒ'), 0xCB, 0}, + {IV('ビ'), 0xCB, 0xDE}, + {IV('ピ'), 0xCB, 0xDF}, + {IV('フ'), 0xCC, 0}, + {IV('ブ'), 0xCC, 0xDE}, + {IV('プ'), 0xCC, 0xDF}, + {IV('ヘ'), 0xCD, 0}, + {IV('ベ'), 0xCD, 0xDE}, + {IV('ペ'), 0xCD, 0xDF}, + {IV('ホ'), 0xCE, 0}, + {IV('ボ'), 0xCE, 0xDE}, + {IV('ãƒ'), 0xCE, 0xDF}, + {IV('マ'), 0xCF, 0}, + + {IV('ミ'), 0xD0, 0}, + {IV('ム'), 0xD1, 0}, + {IV('メ'), 0xD2, 0}, + {IV('モ'), 0xD3, 0}, + {IV('ャ'), 0xAC, 0}, + {IV('ヤ'), 0xD4, 0}, + {IV('ュ'), 0xAD, 0}, + {IV('ユ'), 0xD5, 0}, + {IV('ョ'), 0xAE, 0}, + {IV('ヨ'), 0xD6, 0}, + {IV('ラ'), 0xD7, 0}, + {IV('リ'), 0xD8, 0}, + {IV('ル'), 0xD9, 0}, + {IV('レ'), 0xDA, 0}, + {IV('ロ'), 0xDB, 0}, + {IV('ワ'), 0xDC, 0}, + {IV('ヲ'), 0xA6, 0}, + {IV('ン'), 0xDD, 0}, + {IV('ヴ'), 0xB3, 0xDE}, + {IV('ヷ'), 0xDC, 0xDE}, + {IV('ヺ'), 0xA6, 0xDE}, + {IV('・'), 0xA5, 0}, + {IV('ー'), 0xB0, 0}, + {IV('ヽ'), 0xA4, 0}, + + //{IV('g'), 0xE7, 0}, // error + //{IV(''), 0xE9, 0}, + //{IV('j'), 0xEA, 0}, // error + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + + //{IV('p'), 0xF0, 0}, // error + //{IV('q'), 0xF1, 0}, // error + //{IV(''), 0xF8, 0}, + //{IV('y'), 0xF9, 0}, // error + {IV('万'), 0xFB, 0}, + {IV('円'), 0xFC, 0}, + {IV('åƒ'), 0xFA, 0}, + //{IV(''), 0xFE, 0}, + + //、・ヲァィゥェォャュョッー + {IV('、'), 0xA4, 0}, //ヽ + {IV('ï½¥'), 0xA5, 0}, //・ + {IV('ヲ'), 0xA6, 0}, //ヲ + {IV('ァ'), 0xA7, 0}, //ã‚¡ + {IV('ィ'), 0xA8, 0}, //ã‚£ + {IV('ゥ'), 0xA9, 0}, //ã‚¥ + {IV('ェ'), 0xAA, 0}, //ェ + {IV('ォ'), 0xAB, 0}, //ã‚© + {IV('ャ'), 0xAC, 0}, //ャ + {IV('ï½­'), 0xAD, 0}, //ュ + {IV('ï½®'), 0xAE, 0}, //ョ + {IV('ッ'), 0xAF, 0}, //ッ + {IV('ï½°'), 0xB0, 0}, //ー + + //アイウエオカキクケコサシスセ + {IV('ï½±'), 0xB1, 0}, //ã‚¢ + {IV('ï½²'), 0xB2, 0}, //イ + {IV('ï½³'), 0xB3, 0}, //ウ + {IV('ï½´'), 0xB4, 0}, //エ + {IV('ï½µ'), 0xB5, 0}, //オ + {IV('カ'), 0xB6, 0}, //ã‚« + {IV('ï½·'), 0xB7, 0}, //ã‚­ + {IV('ク'), 0xB8, 0}, //ク + {IV('ï½¹'), 0xB9, 0}, //ケ + {IV('コ'), 0xBA, 0}, //コ + {IV('ï½»'), 0xBB, 0}, //サ + {IV('ï½¼'), 0xBC, 0}, //ã‚· + {IV('ï½½'), 0xBD, 0}, //ス + {IV('ï½¾'), 0xBE, 0}, //ã‚» + + //ソタï¾ï¾‚テトナニヌネノハヒフ + {IV('ソ'), 0xBF, 0}, //ソ + {IV('ï¾€'), 0xC0, 0}, //ã‚¿ + {IV('ï¾'), 0xC1, 0}, //ム+ {IV('ツ'), 0xC2, 0}, //ツ + {IV('テ'), 0xC3, 0}, //テ + {IV('ト'), 0xC4, 0}, //ト + {IV('ï¾…'), 0xC5, 0}, //ナ + {IV('ニ'), 0xC6, 0}, //ニ + {IV('ヌ'), 0xC7, 0}, //ヌ + {IV('ネ'), 0xC8, 0}, //ム+ {IV('ノ'), 0xC9, 0}, //ノ + {IV('ハ'), 0xCA, 0}, //ム+ {IV('ヒ'), 0xCB, 0}, //ヒ + {IV('フ'), 0xCC, 0}, //フ + + //ï¾ï¾Žï¾ï¾ï¾‘メモヤユヨラリルレロワï¾ï¾žï¾Ÿ + {IV('ï¾'), 0xCD, 0}, //ヘ + {IV('ホ'), 0xCE, 0}, //ホ + {IV('ï¾'), 0xCF, 0}, //マ + {IV('ï¾'), 0xD0, 0}, //ミ + {IV('ム'), 0xD1, 0}, //ム + {IV('ï¾’'), 0xD2, 0}, //メ + {IV('モ'), 0xD3, 0}, //モ + {IV('ï¾”'), 0xD4, 0}, //ヤ + {IV('ユ'), 0xD5, 0}, //ユ + {IV('ï¾–'), 0xD6, 0}, //ヨ + {IV('ï¾—'), 0xD7, 0}, //ラ + {IV('リ'), 0xD8, 0}, //リ + {IV('ï¾™'), 0xD9, 0}, //ル + {IV('レ'), 0xDA, 0}, //レ + {IV('ï¾›'), 0xDB, 0}, //ロ + {IV('ワ'), 0xDC, 0}, //ワ + {IV('ï¾'), 0xDD, 0}, //ン + {IV('゙'), 0xDE, 0}, // ã‚› + {IV('゚'), 0xDF, 0}, // ã‚œ + + {IV('ï¿¥'), 0x5C, 0}, + + #elif DISPLAY_CHARSET_HD44780 == WESTERN + // 0x10 -- 0x1F (except 0x1C) + // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF) + + {IV('¡'), 0xA9, 0}, + {IV('¢'), 0xA4, 0}, + {IV('£'), 0xA5, 0}, + {IV('Â¥'), 0xA6, 0}, + {IV('§'), 0xD2, 0}, // section sign + {IV('©'), 0xCF, 0}, + + {IV('ª'), 0x9D, 0}, + {IV('«'), 0xBB, 0}, + {IV('®'), 0xCE, 0}, + + {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09) + //{IV(''), 0xD1, 0}, + {IV('±'), 0x10, 0}, //∓± + //{'='), 0x1C, 0}, // error + {IV('²'), 0x1E, 0}, + {IV('³'), 0x1F, 0}, + {IV('¶'), 0xD3, 0}, // pilcrow sign + {IV('º'), 0x9E, 0}, + {IV('»'), 0xBC, 0}, // 00BB + //{IV(''), 0xB3, 0}, // error + //{IV(''), 0xB4, 0}, // error + {IV('¼'), 0xB6, 0}, // 00BC + {IV('½'), 0xB5, 0}, // 00BD + //{IV('¾'), '3', 0}, // 00BE + {IV('¿'), 0x9F, 0}, // 00BF + + {IV('Â'), 0x8F, 0}, + {IV('Ã'), 0xAA, 0}, + {IV('Ä'), 0x8E, 0}, + {IV('Æ'), 0x92, 0}, + {IV('Ç'), 0x80, 0}, + {IV('É'), 0x90, 0}, + {IV('Ñ'), 0x9C, 0}, + {IV('Õ'), 0xAC, 0}, + {IV('Ö'), 0x99, 0}, + {IV('×'), 0xB7, 0}, + {IV('Ø'), 0xAE, 0}, + {IV('Ãœ'), 0x9A, 0}, + {IV('à'), 0x85, 0}, + {IV('á'), 0xA0, 0}, + {IV('â'), 0x83, 0}, + {IV('ã'), 0xAB, 0}, + {IV('ä'), 0x84, 0}, + {IV('Ã¥'), 0x86, 0}, + {IV('æ'), 0x91, 0}, + {IV('ç'), 0x87, 0}, + {IV('è'), 0x8A, 0}, + {IV('é'), 0x82, 0}, + {IV('ê'), 0x88, 0}, + {IV('ë'), 0x89, 0}, + {IV('ì'), 0x8D, 0}, + {IV('í'), 0xA1, 0}, + {IV('î'), 0x8C, 0}, + {IV('ï'), 0x8B, 0}, + + {IV('ñ'), 0x9B, 0}, + {IV('ò'), 0x95, 0}, + {IV('ó'), 0xA2, 0}, + {IV('ô'), 0x93, 0}, + {IV('õ'), 0xAD, 0}, + {IV('ö'), 0x94, 0}, + {IV('÷'), 0xB8, 0}, + {IV('ø'), 0xAF, 0}, + {IV('ù'), 0x97, 0}, + {IV('ú'), 0xA3, 0}, + {IV('û'), 0x96, 0}, + {IV('ü'), 0x81, 0}, + {IV('ÿ'), 0x98, 0}, + + //{IV(''), 0xB0, 0}, // error + //{IV(''), 0xB1, 0}, // error + {IV('Æ’'), 0xA8, 0}, // 0192 + + {IV('ÎŽ'), 0xDB, 0}, // 038E + {IV('Î'), 0xDE, 0}, // 038F + {IV('Î'), 0xE7, 0}, // 0390 + + {IV('Γ'), 0xD4, 0}, // 0393, Gamma + {IV('Δ'), 0xD5, 0}, // 0394, Delta, â—¿ + {IV('Θ'), 0xD6, 0}, // 0398, Theta + {IV('Λ'), 0xD7, 0}, // 039B, Lambda + {IV('Ξ'), 0xD8, 0}, // 039E, Xi + {IV('Π'), 0xD9, 0}, // Pi + {IV('Σ'), 0xDA, 0}, // Sigma + {IV('Î¥'), 0xDB, 0}, // Upsilon + {IV('Φ'), 0xDC, 0}, // Phi + {IV('Ψ'), 0xDD, 0}, // Psi + {IV('Ω'), 0xDE, 0}, // Omega + + {IV('ά'), 0xDF, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('ή'), 0xE5, 0}, // 03AE + {IV('ί'), 0xE7, 0}, // 03AF + {IV('ΰ'), 0xF1, 0}, // 03B0 + + {IV('α'), 0xDF, 0}, // alpha + {IV('β'), 0xE0, 0}, // beta + {IV('γ'), 0xE1, 0}, // gamma + {IV('δ'), 0xE2, 0}, // delta + {IV('ε'), 0xE3, 0}, // epsilon + {IV('ζ'), 0xE4, 0}, // zeta + {IV('η'), 0xE5, 0}, // eta + {IV('θ'), 0xE6, 0}, // theta + {IV('ι'), 0xE7, 0}, // lota + {IV('κ'), 0xE8, 0}, // kappa + {IV('λ'), 0xE9, 0}, // lambda + {IV('μ'), 0xEA, 0}, // mu + {IV('ν'), 0xEB, 0}, // nu + {IV('ξ'), 0xEC, 0}, // xi + {IV('Ï€'), 0xED, 0}, // pi + {IV('Ï'), 0xEE, 0}, // rho + {IV('σ'), 0xEF, 0}, // sigma + + {IV('Ï„'), 0xF0, 0}, // tau + {IV('Ï…'), 0xF1, 0}, // upsilon + {IV('χ'), 0xF2, 0}, // chi + {IV('ψ'), 0xF3, 0}, // psi + {IV('ω'), 0xF4, 0}, // 03C9, omega + {IV('ÏŠ'), 0xE7, 0}, // 03CA + {IV('Ï‹'), 0xF1, 0}, // 03CB + {IV('Ï'), 0xF1, 0}, // 03CD + {IV('ÏŽ'), 0xF4, 0}, // 03CE + + {IV('•'), 0xCD, 0}, // · + {IV('â„ž'), 0xA7, 0}, // â„ž Pt ASCII 158 + {IV('â„¢'), 0xD0, 0}, + {IV('↤'), 0xF9, 0}, // ⟻ + {IV('↵'), 0xC4, 0}, + {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('⇥'), 0xFB, 0}, + {IV('√'), 0xBE, 0}, // √ + {IV('∞'), 0xC2, 0}, // infinity + {IV('∫'), 0x1B, 0}, + {IV('∼'), 0x1D, 0}, + {IV('≈'), 0x1A, 0}, + {IV('≠'), 0xBD, 0}, + {IV('≡'), 0x11, 0}, + {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾ + {IV('≥'), 0xBA, 0}, + //{IV(''), 0xBF, 0}, // error + + {IV('⌠'), 0xC0, 0}, + {IV('⌡'), 0xC1, 0}, + + {IV('⎧'), 0x14, 0}, + {IV('⎩'), 0x15, 0}, + {IV('⎫'), 0x16, 0}, + {IV('⎭'), 0x17, 0}, + {IV('⎰'), 0x18, 0}, + {IV('⎱'), 0x19, 0}, + {IV('⎲'), 0x12, 0}, + {IV('⎳'), 0x13, 0}, + + {IV('â±'), 0x07, 0}, // Marlin special: 'ðŸ•ðŸ•‘🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜ðŸ•ðŸ•žðŸ•ŸðŸ• ðŸ•¡ðŸ•¢ðŸ•£ðŸ•¤ðŸ•¥ðŸ•¦ðŸ•§ ⌚⌛â°â±â³â§–⧗' LCD_STR_CLOCK (0x05) + {IV('┌'), 0xC9, 0}, + {IV('â”'), 0xCA, 0}, + {IV('â””'), 0xCB, 0}, + {IV('┘'), 0xCC, 0}, + {IV('â—¸'), 0xC3, 0}, // â—¿ + {IV('â­ '), 0xC8, 0}, + {IV('â­¡'), 0xC5, 0}, + {IV('â­¢'), 0xC7, 0}, + {IV('â­£'), 0xC6, 0}, + + + {IV('⯆'), 0xF5, 0}, + {IV('⯇'), 0xF7, 0}, // ⯅ + {IV('⯈'), 0xF6, 0}, + //{IV(''), 0xF8, 0}, // error + //{IV(''), 0xFA, 0}, // error + //{IV(''), 0xFC, 0}, // error + //{IV(''), 0xFD, 0}, // error + //{IV(''), 0xFE, 0}, // error + //{IV(''), 0xFF, 0}, // error + + #elif DISPLAY_CHARSET_HD44780 == CYRILLIC + + #ifdef CONVERT_TO_EXT_ASCII + {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + {IV('²'), 0x0e, 0}, // 0x32 if no special symbol in panel font + {IV('³'), 0x0f, 0}, // 0x33 if no special symbol in panel font + + // translate to cp866 codepage + //first ASCII symbols in panel font must be replaced with Marlin special symbols + {IV('Ð'), 0xF0, 0}, // 0401 + {IV('Є'), 0xF2, 0}, // 0404 + {IV('І'), 'I', 0}, // 0406 + {IV('Ї'), 0xF4, 0}, // 0407 + {IV('ÐŽ'), 0xF6, 0}, // 040E + {IV('Ð'), 0x80, 0}, // 0410 + {IV('Б'), 0x81, 0}, + {IV('Ð’'), 0x82, 0}, + {IV('Г'), 0x83, 0}, + {IV('Д'), 0x84, 0}, + {IV('Е'), 0x85, 0}, + {IV('Ж'), 0x86, 0}, + {IV('З'), 0x87, 0}, + {IV('И'), 0x88, 0}, + {IV('Й'), 0x89, 0}, + {IV('К'), 0x8A, 0}, + {IV('Л'), 0x8B, 0}, + {IV('Ðœ'), 0x8C, 0}, + {IV('Ð'), 0x8D, 0}, + {IV('О'), 0x8E, 0}, + {IV('П'), 0x8F, 0}, + {IV('Р'), 0x90, 0}, + {IV('С'), 0x91, 0}, + {IV('Т'), 0x92, 0}, + {IV('У'), 0x93, 0}, + {IV('Ф'), 0x94, 0}, + {IV('Ð¥'), 0x95, 0}, + {IV('Ц'), 0x96, 0}, + {IV('Ч'), 0x97, 0}, + {IV('Ш'), 0x98, 0}, + {IV('Щ'), 0x99, 0}, + {IV('Ъ'), 0x9A, 0}, + {IV('Ы'), 0x9B, 0}, + {IV('Ь'), 0x9C, 0}, + {IV('Э'), 0x9D, 0}, + {IV('Ю'), 0x9E, 0}, + {IV('Я'), 0x9F, 0}, + + {IV('а'), 0xA0, 0}, + {IV('б'), 0xA1, 0}, + {IV('в'), 0xA2, 0}, + {IV('г'), 0xA3, 0}, + {IV('д'), 0xA4, 0}, + {IV('е'), 0xA5, 0}, + {IV('ж'), 0xA6, 0}, + {IV('з'), 0xA7, 0}, + {IV('и'), 0xA8, 0}, + {IV('й'), 0xA9, 0}, + {IV('к'), 0xAA, 0}, + {IV('л'), 0xAB, 0}, + {IV('м'), 0xAC, 0}, + {IV('н'), 0xAD, 0}, + {IV('о'), 0xAE, 0}, + {IV('п'), 0xAF, 0}, + {IV('Ñ€'), 0xE0, 0}, + {IV('Ñ'), 0xE1, 0}, + {IV('Ñ‚'), 0xE2, 0}, + {IV('у'), 0xE3, 0}, + {IV('Ñ„'), 0xE4, 0}, + {IV('Ñ…'), 0xE5, 0}, + {IV('ц'), 0xE6, 0}, + {IV('ч'), 0xE7, 0}, + {IV('ш'), 0xE8, 0}, + {IV('щ'), 0xE9, 0}, + {IV('ÑŠ'), 0xEA, 0}, + {IV('Ñ‹'), 0xEB, 0}, + {IV('ÑŒ'), 0xEC, 0}, + {IV('Ñ'), 0xED, 0}, + {IV('ÑŽ'), 0xEE, 0}, + {IV('Ñ'), 0xEF, 0}, // 044F + {IV('Ñ‘'), 0xF1, 0}, // 0451 + {IV('Ñ”'), 0xF3, 0}, // 0454 + {IV('Ñ–'), 'i', 0}, // 0456 + {IV('Ñ—'), 0xF5, 0}, // 0457 + {IV('Ñž'), 0xF7, 0}, // 045E + + #else + + {IV('¢'), 0x5C, 0}, // 00A2 + {IV('£'), 0xCF, 0}, // 00A3 + {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + + //{IV(''), 0x80, 0}, + //{IV(''), 0x81, 0}, + //{IV(''), 0x82, 0}, + //{IV(''), 0x83, 0}, + //{IV(''), 0x84, 0}, + //{IV(''), 0x85, 0}, + //{IV(''), 0x86, 0}, + //{IV(''), 0x87, 0}, + //{IV(''), 0x88, 0}, + //{IV(''), 0x89, 0}, + //{IV(''), 0x8A, 0}, + //{IV(''), 0x8B, 0}, + //{IV(''), 0x8C, 0}, + //{IV(''), 0x8D, 0}, + //{IV(''), 0x8E, 0}, + //{IV(''), 0x8F, 0}, + + //{IV(''), 0x90, 0}, + //{IV(''), 0x91, 0}, + //{IV(''), 0x92, 0}, + //{IV(''), 0x93, 0}, + //{IV(''), 0x94, 0}, + //{IV(''), 0x95, 0}, + //{IV(''), 0x96, 0}, + //{IV(''), 0x97, 0}, + //{IV(''), 0x98, 0}, + //{IV(''), 0x99, 0}, + //{IV(''), 0x9A, 0}, + //{IV(''), 0x9B, 0}, + //{IV(''), 0x9C, 0}, + //{IV(''), 0x9D, 0}, + //{IV(''), 0x9E, 0}, + //{IV(''), 0x9F, 0}, + + {IV('¼'), 0xF0, 0}, // 00BC + {IV('â…“'), 0xF1, 0}, + {IV('½'), 0xF2, 0}, // 00BD + {IV('¾'), 0xF3, 0}, // 00BE + {IV('¿'), 0xCD, 0}, // 00BF + + {IV('Ð'), 0xA2, 0}, // 0401 + {IV('Ð'), 'A', 0}, // 0410 + {IV('Б'), 0xA0, 0}, + {IV('Ð’'), 'B', 0}, + {IV('Г'), 0xA1, 0}, + {IV('Д'), 0xE0, 0}, + {IV('Е'), 'E', 0}, + {IV('Ж'), 0xA3, 0}, + {IV('З'), 0xA4, 0}, + {IV('И'), 0xA5, 0}, + {IV('Й'), 0xA6, 0}, + {IV('К'), 'K', 0}, + {IV('Л'), 0xA7, 0}, + {IV('Ðœ'), 'M', 0}, + {IV('Ð'), 'H', 0}, + {IV('О'), 'O', 0}, + {IV('П'), 0xA8, 0}, + {IV('Р'), 'P', 0}, + {IV('С'), 'C', 0}, + {IV('Т'), 'T', 0}, + {IV('У'), 0xA9, 0}, + {IV('Ф'), 0xAA, 0}, + {IV('Ð¥'), 'X', 0}, + {IV('Ц'), 0xE1, 0}, + {IV('Ч'), 0xAB, 0}, + {IV('Ш'), 0xAC, 0}, + {IV('Щ'), 0xE2, 0}, + {IV('Ъ'), 0xAD, 0}, + {IV('Ы'), 0xAE, 0}, + {IV('Ь'), 'b', 0}, + {IV('Э'), 0xAF, 0}, + {IV('Ю'), 0xB0, 0}, + {IV('Я'), 0xB1, 0}, + {IV('а'), 'a', 0}, + + {IV('б'), 0xB2, 0}, + {IV('в'), 0xB3, 0}, + {IV('г'), 0xB4, 0}, + {IV('д'), 0xE3, 0}, + {IV('е'), 'e', 0}, + {IV('ж'), 0xB6, 0}, + {IV('з'), 0xB7, 0}, + {IV('и'), 0xB8, 0}, + {IV('й'), 0xB9, 0}, + {IV('к'), 0xBA, 0}, + {IV('л'), 0xBB, 0}, + {IV('м'), 0xBC, 0}, + {IV('н'), 0xBD, 0}, + {IV('о'), 'o', 0}, + {IV('п'), 0xBE, 0}, + {IV('Ñ€'), 'p', 0}, + {IV('Ñ'), 'c', 0}, + {IV('Ñ‚'), 0xBF, 0}, + + {IV('у'), 'y', 0}, + {IV('Ñ„'), 0xE4, 0}, + {IV('Ñ…'), 'x', 0}, + {IV('ц'), 0xE5, 0}, + {IV('ч'), 0xC0, 0}, + {IV('ш'), 0xC1, 0}, + {IV('щ'), 0xE6, 0}, + {IV('ÑŠ'), 0xC2, 0}, + {IV('Ñ‹'), 0xC3, 0}, + {IV('ÑŒ'), 0xC4, 0}, + {IV('Ñ'), 0xC5, 0}, + {IV('ÑŽ'), 0xC6, 0}, + {IV('Ñ'), 0xC7, 0}, // 044F + {IV('Ñ‘'), 0xB5, 0}, // 0451 + //{IV(''), 0xC8, 0}, + //{IV(''), 0xC9, 0}, + //{IV(''), 0xCA, 0}, + //{IV(''), 0xCB, 0}, + //{IV(''), 0xCC, 0}, + //{IV(''), 0xCD, 0}, + //{IV(''), 0xCE, 0}, + + //{IV(''), 0xD0, 0}, + //{IV(''), 0xD1, 0}, + //{IV(''), 0xD2, 0}, + //{IV(''), 0xD3, 0}, + //{IV(''), 0xD4, 0}, + //{IV(''), 0xD5, 0}, + //{IV(''), 0xD6, 0}, + //{IV(''), 0xD7, 0}, + //{IV(''), 0xD8, 0}, + //{IV(''), 0xDB, 0}, + //{IV(''), 0xDC, 0}, + //{IV(''), 0xDD, 0}, + //{IV(''), 0xDE, 0}, + //{IV(''), 0xDF, 0}, + + //{IV(''), 0xE7, 0}, + //{IV(''), 0xE8, 0}, + //{IV(''), 0xE9, 0}, + //{IV(''), 0xEA, 0}, + //{IV(''), 0xEB, 0}, + //{IV(''), 0xEC, 0}, + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + //{IV(''), 0xEF, 0}, + + //{IV(''), 0xF4, 0}, + //{IV(''), 0xF5, 0}, + //{IV(''), 0xF6, 0}, + //{IV(''), 0xF7, 0}, + //{IV(''), 0xF8, 0}, + //{IV(''), 0xF9, 0}, + //{IV(''), 0xFA, 0}, + //{IV(''), 0xFB, 0}, + //{IV(''), 0xFC, 0}, + //{IV(''), 0xFD, 0}, + //{IV(''), 0xFE, 0}, + //{IV(''), 0xFF, 0}, + + {IV('↑'), 0xD9, 0}, // 2191 â†â†‘→↓ + {IV('↓'), 0xDA, 0}, // 2193 + + #endif + + #endif +}; + +// the plain ASCII replacement for various char +static const TFTGLCD_charmap_t g_TFTGLCD_charmap_common[] PROGMEM = { + {IV('¡'), 'i', 0}, // A1 + {IV('¢'), 'c', 0}, // A2 + {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09) + + #ifndef CONVERT_TO_EXT_ASCII //this time CONVERT_TO_EXT_ASCII works only with en, ru and uk languages + + // map WESTERN code to the plain ASCII + {IV('Ã'), 'A', 0}, // C1 + {IV('Â'), 'A', 0}, // C2 + {IV('Ã'), 'A', 0}, // C3 + {IV('Ä'), 'A', 0}, // C4 + {IV('Ã…'), 'A', 0}, // C5 + {IV('Æ'), 'A', 'E'}, // C6 + {IV('Ç'), 'C', 0}, // C7 + {IV('È'), 'E', 0}, // C8 + {IV('É'), 'E', 0}, // C9 + {IV('Ã'), 'I', 0}, // CD + {IV('Ñ'), 'N', 0}, // D1 + {IV('Õ'), 'O', 0}, // D5 + {IV('Ö'), 'O', 0}, // D6 + {IV('×'), 'x', 0}, // D7 + {IV('Ãœ'), 'U', 0}, // DC + {IV('Ã'), 'Y', 0}, // DD + {IV('à'), 'a', 0}, // E0 + {IV('á'), 'a', 0}, + {IV('â'), 'a', 0}, + {IV('ã'), 'a', 0}, + {IV('ä'), 'a', 0}, + {IV('Ã¥'), 'a', 0}, + {IV('æ'), 'a', 'e'}, + {IV('ç'), 'c', 0}, + {IV('è'), 'e', 0}, // 00E8 + {IV('é'), 'e', 0}, + {IV('ê'), 'e', 0}, + {IV('ë'), 'e', 0}, + {IV('ì'), 'i', 0}, // 00EC + {IV('í'), 'i', 0}, + {IV('î'), 'i', 0}, + {IV('ï'), 'i', 0}, // 00EF + + {IV('ñ'), 'n', 0}, // 00F1 + {IV('ò'), 'o', 0}, + {IV('ó'), 'o', 0}, + {IV('ô'), 'o', 0}, + {IV('õ'), 'o', 0}, + {IV('ö'), 'o', 0}, + //{IV('÷'), 0xB8, 0}, + {IV('ø'), 'o', 0}, + {IV('ù'), 'u', 0}, + {IV('ú'), 'u', 0}, + {IV('û'), 'u', 0}, + {IV('ü'), 'u', 0}, // FC + {IV('ý'), 'y', 0}, // FD + {IV('ÿ'), 'y', 0}, // FF + + {IV('Ä„'), 'A', 0}, // 0104 + {IV('Ä…'), 'a', 0}, // 0105 + {IV('Ć'), 'C', 0}, // 0106 + {IV('ć'), 'c', 0}, // 0107 + {IV('ÄŒ'), 'C', 0}, // 010C + {IV('Ä'), 'c', 0}, // 010D + {IV('ÄŽ'), 'D', 0}, // 010E + {IV('Ä'), 'd', 0}, // 010F + {IV('Ä‘'), 'd', 0}, // 0111 + {IV('Ä™'), 'e', 0}, // 0119 + {IV('ÄŸ'), 'g', 0}, // 011F + {IV('Ä°'), 'I', 0}, // 0130 + {IV('ı'), 'i', 0}, // 0131 + + {IV('Å'), 'L', 0}, // 0141 + {IV('Å‚'), 'l', 0}, // 0142 + {IV('Ń'), 'N', 0}, // 0143 + {IV('Å„'), 'n', 0}, // 0144 + {IV('ň'), 'n', 0}, // 0148 + + {IV('Å™'), 'r', 0}, // 0159 + {IV('Åš'), 'S', 0}, // 015A + {IV('Å›'), 's', 0}, // 015B + {IV('ÅŸ'), 's', 0}, // 015F + {IV('Å '), 'S', 0}, // 0160 + {IV('Å¡'), 's', 0}, // 0161 + {IV('Å¥'), 't', 0}, // 0165 + {IV('ů'), 'u', 0}, // 016F + {IV('ż'), 'z', 0}, // 017C + {IV('Ž'), 'Z', 0}, // 017D + {IV('ž'), 'z', 0}, // 017E + {IV('Æ’'), 'f', 0}, // 0192 + + {IV('Ë£'), 'x', 0}, // 02E3 + + {IV('΄'), '\'', 0}, // 0384 + {IV('Î…'), '\'', 0}, // 0385 + {IV('Ά'), 'A', 0}, // 0386 + {IV('·'), '.', 0}, // 0387 + {IV('Έ'), 'E', 0}, // 0388 + {IV('Ή'), 'H', 0}, // 0389 + {IV('Ί'), 'I', 0}, // 038A + {IV('ÎŒ'), 'O', 0}, // 038C + {IV('ÎŽ'), 'Y', 0}, // 038E + {IV('Î'), 'O', 0}, // 038F + {IV('Î'), 'i', 0}, // 0390 + {IV('Α'), 'A', 0}, // 0391 + {IV('Î’'), 'B', 0}, // 0392 + {IV('Γ'), 'T', 0}, // 0393, Gamma + {IV('Δ'), '4', 0}, // 0394, Delta, â—¿ + {IV('Ε'), 'E', 0}, // 0395 + {IV('Ζ'), 'Z', 0}, // 0396 + {IV('Η'), 'H', 0}, // 0397 + {IV('Θ'), '0', 0}, // 0398, Theta + {IV('Ι'), 'I', 0}, // 0399 + {IV('Κ'), 'K', 0}, // 039A + {IV('Λ'), '^', 0}, // 039B, Lambda + {IV('Îœ'), 'M', 0}, // 039C + {IV('Î'), 'N', 0}, // 039D + {IV('Ξ'), '3', 0}, // 039E, Xi + {IV('Ο'), 'O', 0}, // 039F + {IV('Π'), 'n', 0}, // 03A0, Pi + {IV('Ρ'), 'P', 0}, // 03A1 + {IV('Σ'), 'E', 0}, // 03A3, Sigma + {IV('Τ'), 'T', 0}, // 03A4 + {IV('Î¥'), 'Y', 0}, // 03A5, Upsilon + {IV('Φ'), 'p', 0}, // 03A6, Phi + {IV('Χ'), 'X', 0}, // 03A7 + {IV('Ψ'), 'P', 0}, // 03A8, Psi + {IV('Ω'), 'O', 0}, // 03A9, Omega + {IV('Ϊ'), 'I', 0}, // 03AA + {IV('Ϋ'), 'Y', 0}, // 03AB + {IV('ά'), 'a', 0}, // 03AC + {IV('έ'), 'e', 0}, // 03AD + {IV('ή'), 'n', 0}, // 03AE + {IV('ί'), 'i', 0}, // 03AF + {IV('ΰ'), 'v', 0}, // 03B0 + {IV('α'), 'a', 0}, // 03B1, alpha + {IV('β'), 'B', 0}, // 03B2, beta + {IV('γ'), 'v', 0}, // 03B3, gamma + {IV('δ'), 'd', 0}, // 03B4, delta + {IV('ε'), 'e', 0}, // 03B5, epsilon + {IV('ζ'), 'Z', 0}, // 03B6, zeta + {IV('η'), 'n', 0}, // 03B7, eta + {IV('θ'), '0', 0}, // 03B8, theta + {IV('ι'), 'i', 0}, // 03B9, lota + {IV('κ'), 'k', 0}, // 03BA, kappa + {IV('λ'), 'L', 0}, // 03BB, lambda + {IV('μ'), 'u', 0}, // 03BC, mu + {IV('ν'), 'v', 0}, // 03BD, nu + {IV('ξ'), 'e', 0}, // 03BE, xi + {IV('ο'), 'o', 0}, // 03BF + {IV('Ï€'), 'n', 0}, // 03C0, pi + {IV('Ï'), 'p', 0}, // 03C1, rho + {IV('Ï‚'), 'c', 0}, // 03C2 + {IV('σ'), 'o', 0}, // 03C3, sigma + {IV('Ï„'), 't', 0}, // 03C4, tau + {IV('Ï…'), 'v', 0}, // 03C5, upsilon + {IV('φ'), 'p', 0}, // 03C6 + {IV('χ'), 'X', 0}, // 03C7, chi + {IV('ψ'), 'W', 0}, // 03C8, psi + {IV('ω'), 'w', 0}, // 03C9, omega + {IV('ÏŠ'), 'i', 0}, // 03CA + {IV('Ï‹'), 'v', 0}, // 03CB + {IV('ÏŒ'), 'o', 0}, // 03CC + {IV('Ï'), 'v', 0}, // 03CD + {IV('ÏŽ'), 'w', 0}, // 03CE + + // map CYRILLIC code to the plain ASCII + {IV('Ð'), 'A', 0}, // 0410 + {IV('Б'), 'b', 0}, // 0411 + {IV('Ð’'), 'B', 0}, // 0412 + {IV('Г'), 'T', 0}, // 0413 + {IV('Д'), 'Q', 0}, // 0414 + {IV('Е'), 'E', 0}, // 0415 + {IV('Ж'), '*', 0}, // 0416 + {IV('З'), 'E', 0}, // 0417 + {IV('И'), 'N', 0}, // 0418 + {IV('Й'), 'N', 0}, // 0419 + {IV('К'), 'K', 0}, // 041A + {IV('Л'), 'T', 0}, // 041B + {IV('Ðœ'), 'M', 0}, // 041C + {IV('Ð'), 'H', 0}, // 041D + {IV('О'), 'O', 0}, // 041E + {IV('П'), 'n', 0}, // 041F + {IV('Р'), 'P', 0}, // 0420 + {IV('С'), 'C', 0}, // 0421 + {IV('Т'), 'T', 0}, // 0422 + {IV('У'), 'Y', 0}, + {IV('Ф'), 'o', 0}, + {IV('Ð¥'), 'X', 0}, + {IV('Ц'), 'U', 0}, + {IV('Ч'), 'y', 0}, + {IV('Ш'), 'W', 0}, + {IV('Щ'), 'W', 0}, + {IV('Ъ'), 'b', 0}, + {IV('Ы'), 'b', '|'}, + {IV('Ь'), 'b'}, + {IV('Э'), 'e'}, + {IV('Ю'), '|', 'O'}, + {IV('Я'), '9', '|'}, // 042F + + {IV('а'), 'a', 0}, // 0430 + {IV('б'), '6', 0}, // 0431 + {IV('в'), 'B', 0}, // 0432, + {IV('г'), 'r', 0}, // 0433 + {IV('д'), 'a', 0}, // 0434, + {IV('е'), 'e', 0}, // 0435 + {IV('ж'), '*', 0}, // 0436 + {IV('з'), 'e', 0}, // 0437, + {IV('и'), 'u', 0}, // 0438 + {IV('й'), 'u', 0}, // 0439, + {IV('к'), 'k', 0}, // 043A + {IV('л'), 'n', 0}, + {IV('м'), 'm', 0}, + {IV('н'), 'H', 0}, + {IV('о'), 'o', 0}, + {IV('п'), 'n', 0}, + {IV('Ñ€'), 'p', 0}, + {IV('Ñ'), 'c', 0}, + {IV('Ñ‚'), 't', 0}, + {IV('у'), 'y', 0}, + {IV('Ñ„'), 'q', 'p'}, + {IV('Ñ…'), 'x', 0}, + {IV('ц'), 'u', 0}, + {IV('ч'), 'y', 0}, + {IV('ш'), 'w', 0}, + {IV('щ'), 'w', 0}, + {IV('ÑŠ'), 'b', 0}, + {IV('Ñ‹'), 'b', '|'}, + {IV('ÑŒ'), 'b', 0}, + {IV('Ñ'), 'e', 0}, + {IV('ÑŽ'), '|', 'o'}, + {IV('Ñ'), 'g', 0}, // 044F + + #endif + + {IV('•'), '.', 0}, // 2022 · + {IV('â„ž'), 'P', 'x'}, // 211E â„ž Pt ASCII 158 + {IV('â„¢'), 'T', 'M'}, // 2122 + {IV('â†'), '<', '-'}, // 2190 + {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→âµâžŸâž âž¡' LCD_STR_ARROW_RIGHT (0x03) + //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('∼'), '~', 0}, // 223C + {IV('≈'), '~', '='}, // 2248 + {IV('≠'), '!', '='}, // 2260 + {IV('≡'), '=', 0}, // 2261 + {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾ + {IV('≥'), '>', '='}, // 2265 + {IV('â±'), 0x07, 0}, // 23F1, Marlin special: 'ðŸ•ðŸ•‘🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜ðŸ•ðŸ•žðŸ•ŸðŸ• ðŸ•¡ðŸ•¢ðŸ•£ðŸ•¤ðŸ•¥ðŸ•¦ðŸ•§ ⌚⌛â°â±â³â§–⧗' LCD_STR_CLOCK (0x05) + + {IV('ã‚ '), '=', 0}, // 30A0 + + // â°â±â²â³â—´â—µâ—¶â—· + // â»â¼â™â™‚ + //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07) + {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08) + {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: 'ðŸ“📂' LCD_STR_FOLDER (0x02) + //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06) +}; + +/* return v1 - v2 */ +static int TFTGLCD_charmap_compare(TFTGLCD_charmap_t * v1, TFTGLCD_charmap_t * v2) { + return (v1->uchar < v2->uchar) ? -1 : (v1->uchar > v2->uchar) ? 1 : 0; +} + +static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) { + TFTGLCD_charmap_t localval; + TFTGLCD_charmap_t *p_TFTGLCD_charmap = (TFTGLCD_charmap_t *)userdata; + memcpy_P(&localval, p_TFTGLCD_charmap + idx, sizeof(localval)); + return TFTGLCD_charmap_compare(&localval, (TFTGLCD_charmap_t *)data_pin); +} + +void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { lcd.setCursor(col, row); } + +void lcd_put_int(const int i) { + const char* str = i16tostr3left(i); + while (*str) lcd.write(*str++); +} + +// return < 0 on error +// return the advanced cols +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + + // find the HD44780 internal ROM first + int ret; + size_t idx = 0; + TFTGLCD_charmap_t pinval; + TFTGLCD_charmap_t *copy_address = nullptr; + pinval.uchar = c; + pinval.idx = -1; + + if (max_length < 1) return 0; + + if (c < 128) { + lcd.write((uint8_t)c); + return 1; + } + copy_address = nullptr; + ret = pf_bsearch_r((void *)g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) { + copy_address = (TFTGLCD_charmap_t *)(g_TFTGLCD_charmap_device + idx); + } + else { + ret = pf_bsearch_r((void *)g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) copy_address = (TFTGLCD_charmap_t *)(g_TFTGLCD_charmap_common + idx); + } + + if (ret >= 0) { + TFTGLCD_charmap_t localval; + // found + memcpy_P(&localval, copy_address, sizeof(localval)); + lcd.write(localval.idx); + if (max_length >= 2 && localval.idx2 > 0) { + lcd.write(localval.idx2); + return 2; + } + return 1; + } + + // Not found, print '?' instead + lcd.write((uint8_t)'?'); + return 1; +} + +/** + * @brief Draw a UTF-8 string + * + * @param utf8_str : the UTF-8 string + * @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM) + * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) + * + * @return the number of pixels advanced + * + * Draw a UTF-8 string + */ +static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) { + pixel_len_t ret = 0; + uint8_t *p = (uint8_t *)utf8_str; + while (ret < max_length) { + wchar_t ch = 0; + p = get_utf8_value_cb(p, cb_read_byte, &ch); + if (!ch) break; + ret += lcd_put_wchar_max(ch, max_length - ret); + } + return (int)ret; +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length); +} + +int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length); +} + +#if ENABLED(DEBUG_LCDPRINT) + + int test_TFTGLCD_charmap(TFTGLCD_charmap_t *data, size_t size, char *name, char flg_show_contents) { + int ret; + size_t idx = 0; + TFTGLCD_charmap_t preval = {0, 0, 0}; + TFTGLCD_charmap_t pinval = {0, 0, 0}; + char flg_error = 0; + + int i; + + TRACE("Test %s\n", name); + + for (i = 0; i < size; i ++) { + memcpy_P(&pinval, &(data[i]), sizeof(pinval)); + + if (flg_show_contents) { + #if 1 + TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #else + TRACE("[% 4d]", i); + TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar); + TRACE("0x%02X,", (unsigned int)(pinval.idx)); + TRACE("0x%02X,", (unsigned int)(pinval.idx2)); + TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #endif + } + if (preval.uchar >= pinval.uchar) { + flg_error = 1; + //TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + memcpy(&preval, &pinval, sizeof(pinval)); + + ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret < 0) { + flg_error = 1; + TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + if (idx != i) { + flg_error = 1; + TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + } + if (flg_error) { + TRACE("\nError: in array %s\n\n", name); + return -1; + } + TRACE("\nPASS array %s\n\n", name); + return 0; + } + + int test_TFTGLCD_charmap_all(void) { + int flg_error = 0; + if (test_TFTGLCD_charmap(g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), "g_TFTGLCD_charmap_device", 0) < 0) { + flg_error = 1; + test_TFTGLCD_charmap(g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), "g_TFTGLCD_charmap_device", 1); + } + if (test_TFTGLCD_charmap(g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), "g_TFTGLCD_charmap_common", 0) < 0) { + flg_error = 1; + test_TFTGLCD_charmap(g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), "g_TFTGLCD_charmap_common", 1); + } + if (flg_error) { + TRACE("\nFAILED in hd44780 tests!\n"); + return -1; + } + TRACE("\nPASS in hd44780 tests.\n"); + return 0; + } + +#endif // DEBUG_LCDPRINT + +#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp new file mode 100644 index 0000000000..c9a5b2525a --- /dev/null +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp @@ -0,0 +1,1018 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if IS_TFTGLCD_PANEL + +/** + * ultralcd_TFTGLCD.cpp + * + * Implementation of the LCD display routines for a TFT GLCD displays with external controller. + * This display looks as a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER but has good text font + * and supports color output. + */ + +#if NONE(__AVR__, MCU_LPC1768, __STM32F1__, STM32F4xx) + #warning "Selected platform not yet tested. Please contribute your good pin mappings." +#endif + +#if ENABLED(TFTGLCD_PANEL_SPI) + #include +#else + #include +#endif + +#include "ultralcd_TFTGLCD.h" +#include "../ultralcd.h" +#include "../../libs/numtostr.h" + +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/printcounter.h" +#include "../../module/planner.h" +#include "../../module/motion.h" + +#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + #include "../../feature/filwidth.h" + #include "../../gcode/parser.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +TFTGLCD lcd; + +#define ICON_LOGO B00000001 +#define ICON_TEMP1 B00000010 //hotend 1 +#define ICON_TEMP2 B00000100 //hotend 2 +#define ICON_TEMP3 B00001000 //hotend 3 +#define ICON_BED B00010000 +#define ICON_FAN B00100000 +#define ICON_HOT B01000000 //when any T > 50deg +#define PIC_MASK 0x7f + +//LEDs not used, for compatibility with Smoothieware +#define LED_HOTEND_ON B00000001 +#define LED_BED_ON B00000010 +#define LED_FAN_ON B00000100 +#define LED_HOT B00001000 +#define LED_MASK 0x0f + +#define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2) + +//markers for change line color +#define COLOR_EDIT '#' +#define COLOR_ERROR '!' + +#ifdef CONVERT_TO_EXT_ASCII //use standart pseudographic symbols in ASCII table + #define LR 179 //vertical line + #define TRC 191 //top right corner + #define BLC 192 //bottom left corner + #define GL 196 //horizontal line + #define BRC 217 //bottom right corner, should be replaced to 12 for some languages + #define TLC 218 //top left corner, should be replaced to 13 for some languages +#else //next symbols must be present in panel font + #define LR 8 //equal to 179 + #define TRC 9 //equal to 191 + #define BLC 10 //equal to 192 + #define GL 11 //equal to 196 + #define BRC 12 //equal to 217 + #define TLC 13 //equal to 218 +#endif + +#define Marlin 0x01 + +enum Commands { // based on Smoothieware commands + GET_SPI_DATA = 0, + READ_BUTTONS, // read buttons + READ_ENCODER, // read encoder + LCD_WRITE, // write all screen to LCD + BUZZER, // beep buzzer + CONTRAST, // set contrast (brightnes) + // Other commands... 0xE0 thru 0xFF + GET_LCD_ROW = 0xE0, // for detect panel + GET_LCD_COL, // reserved for compatibility with Smoothieware, not used + LCD_PUT, // write one line to LCD + INIT_SCREEN = 0xFE, // clear panel buffer +}; + +static unsigned char framebuffer[FBSIZE]; +static unsigned char *fb; +static uint8_t cour_line; +static uint8_t picBits, ledBits, hotBits; +static uint8_t PanelDetected = 0; + +// Constructor +TFTGLCD::TFTGLCD() {} + +//clearing local buffer +void TFTGLCD::clear_buffer() { + memset(&framebuffer[0], ' ', FBSIZE - 2); + framebuffer[FBSIZE - 1] = framebuffer[FBSIZE - 2] = 0; + picBits = ledBits = 0; +} + +//set new text cursor position +void TFTGLCD::setCursor(uint8_t col, uint8_t row) { + fb = &framebuffer[0] + col + row * LCD_WIDTH; + cour_line = row; +} + +//send char to buffer +void TFTGLCD::write(char c) { + *fb++ = c; +} + +//send text line to buffer +void TFTGLCD::print(const char *line) { + while (*line) *fb++ = *line++; +} + +// For menu +void TFTGLCD::print_line() { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + #ifdef __AVR__ + SPI.transfer(LCD_PUT); + SPI.transfer(cour_line); + SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); + #elif EITHER(MCU_LPC1768, __STM32F1__) + SPI.transfer(LCD_PUT); + SPI.transfer(cour_line); + for (uint16_t i = 0; i < LCD_WIDTH; i++) SPI.transfer(framebuffer[cour_line * LCD_WIDTH + i]); + #elif defined(STM32F4xx) + SPI.transfer(LCD_PUT, SPI_CONTINUE); + SPI.transfer(cour_line, SPI_CONTINUE); + SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH, SPI_CONTINUE); + #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + SPI.transfer(LCD_PUT); + SPI.transfer(cour_line); + SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); + #elif defined(ARDUINO_ARCH_ESP32) + SPI.write(LCD_PUT); + SPI.write(cour_line); + for (uint16_t i = 0; i < LCD_WIDTH; i++) SPI.write(framebuffer[cour_line * LCD_WIDTH + i]); + #endif + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address + Wire.write(LCD_PUT); + Wire.write(cour_line); + Wire.write(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); //transfer 1 line to txBuffer + Wire.endTransmission(); //transmit data + safe_delay(1); + #endif +} + +void TFTGLCD::print_screen(){ + if (!PanelDetected) return; + framebuffer[FBSIZE - 2] = picBits & PIC_MASK; + framebuffer[FBSIZE - 1] = ledBits; + #if ENABLED(TFTGLCD_PANEL_SPI) + // Send all framebuffer to panel + WRITE(TFTGLCD_CS, LOW); + #ifdef __AVR__ + SPI.transfer(LCD_WRITE); + SPI.transfer(&framebuffer[0], FBSIZE); + #elif EITHER(MCU_LPC1768, __STM32F1__) + SPI.transfer(LCD_WRITE); + for (uint16_t i = 0; i < FBSIZE; i++) SPI.transfer(framebuffer[i]); + #elif defined(STM32F4xx) + SPI.transfer(LCD_WRITE, SPI_CONTINUE); + SPI.transfer(&framebuffer[0], FBSIZE, SPI_CONTINUE); + #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + SPI.transfer(LCD_WRITE); + SPI.transfer(&framebuffer[0], FBSIZE); + #elif defined(ARDUINO_ARCH_ESP32) + SPI.write(LCD_WRITE); + for (uint16_t i = 0; i < FBSIZE; i++) SPI.write(framebuffer[i]); + #endif + WRITE(TFTGLCD_CS, HIGH); + #else + uint8_t r; + // Send framebuffer to panel by line + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + // First line + Wire.write(LCD_WRITE); + Wire.write(&framebuffer[0], LCD_WIDTH); + Wire.endTransmission(); + for (r = 1; r < (LCD_HEIGHT - 1); r++) { + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(&framebuffer[r * LCD_WIDTH], LCD_WIDTH); + Wire.endTransmission(); + } + // Last line + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(&framebuffer[r * LCD_WIDTH], LCD_WIDTH); + Wire.write(&framebuffer[FBSIZE - 2], 2); + Wire.endTransmission(); + #endif +} + +void TFTGLCD::setContrast(uint16_t contrast) { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) + SPI.transfer(CONTRAST); + SPI.transfer((uint8_t)contrast); + #elif defined(STM32F4xx) + SPI.transfer(CONTRAST, SPI_CONTINUE); + SPI.transfer((uint8_t)contrast, SPI_CONTINUE); + #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + SPI.transfer(CONTRAST); + SPI.transfer((uint8_t)contrast); + #elif defined(ARDUINO_ARCH_ESP32) + SPI.write(CONTRAST); + SPI.write((uint8_t)contrast); + #endif + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(CONTRAST); + Wire.write((uint8_t)contrast); + Wire.endTransmission(); + #endif +} + +//reading buttons and encoder states +extern volatile int8_t encoderDiff; + +uint8_t MarlinUI::read_slow_buttons(void) { + if (!PanelDetected) return 0; + #if ENABLED(TFTGLCD_PANEL_SPI) + uint8_t b = 0; + WRITE(TFTGLCD_CS, LOW); + #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) + SPI.transfer(READ_ENCODER); + WRITE(TFTGLCD_CS, LOW); //for delay + encoderDiff += SPI.transfer(READ_BUTTONS); + WRITE(TFTGLCD_CS, LOW); //for delay + b = SPI.transfer(GET_SPI_DATA); + #elif defined(STM32F4xx) + SPI.transfer(READ_ENCODER, SPI_CONTINUE); + encoderDiff += SPI.transfer(READ_BUTTONS, SPI_CONTINUE); + b = SPI.transfer(GET_SPI_DATA, SPI_CONTINUE); + #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + SPI.transfer(READ_ENCODER); + WRITE(TFTGLCD_CS, LOW); //for delay ???? + encoderDiff += SPI.transfer(READ_BUTTONS); + WRITE(TFTGLCD_CS, LOW); //for delay ???? + b = SPI.transfer(GET_SPI_DATA); + #elif defined(ARDUINO_ARCH_ESP32) + SPI.transfer(READ_ENCODER); + WRITE(TFTGLCD_CS, LOW); //for delay ???? + encoderDiff += SPI.transfer(READ_BUTTONS); + WRITE(TFTGLCD_CS, LOW); //for delay ???? + b = SPI.transfer(GET_SPI_DATA); + #endif + WRITE(TFTGLCD_CS, HIGH); + return b; + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(READ_ENCODER); + Wire.endTransmission(); + #ifdef __AVR__ + Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1); + #elif defined(__STM32F1__) + Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2); + #elif EITHER(STM32F4xx, MCU_LPC1768) + Wire.requestFrom(LCD_I2C_ADDRESS, 2); + #endif + encoderDiff += Wire.read(); + return Wire.read(); //buttons + #endif +} + +// duration in ms, freq in Hz +void MarlinUI::buzz(const long duration, const uint16_t freq) { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) + SPI.transfer(BUZZER); + SPI.transfer16((uint16_t)duration); + SPI.transfer16(freq); + #elif defined(STM32F4xx) + SPI.transfer(BUZZER, SPI_CONTINUE); + SPI.transfer16((uint16_t)duration, SPI_CONTINUE); + SPI.transfer16(freq, SPI_CONTINUE); + #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + SPI.transfer(BUZZER); + SPI.transfer16((uint16_t)duration); + SPI.transfer16(freq); + #elif defined(ARDUINO_ARCH_ESP32) + SPI.write(BUZZER); + SPI.write16((uint16_t)duration); + SPI.write16(freq); + #endif + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(BUZZER); + Wire.write((uint8_t)(duration >> 8)); + Wire.write((uint8_t)duration); + Wire.write((uint8_t)(freq >> 8)); + Wire.write((uint8_t)freq); + Wire.endTransmission(); + #endif +} + +void MarlinUI::init_lcd() { + uint8_t t; + lcd.clear_buffer(); + t = 0; + #if ENABLED(TFTGLCD_PANEL_SPI) + // SPI speed must be less 10MHz + OUT_WRITE(TFTGLCD_CS, HIGH); + spiInit(TERN(__STM32F1__, SPI_QUARTER_SPEED, SPI_FULL_SPEED)); + WRITE(TFTGLCD_CS, LOW); + #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) + SPI.transfer(GET_LCD_ROW); + t = SPI.transfer(GET_SPI_DATA); + #elif defined(STM32F4xx) + SPI.transfer(GET_LCD_ROW, SPI_CONTINUE); + t = SPI.transfer(GET_SPI_DATA, SPI_CONTINUE); + #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + SPI.transfer(GET_LCD_ROW); + t = SPI.transfer(GET_SPI_DATA); + #elif defined(ARDUINO_ARCH_ESP32) + SPI.write(GET_LCD_ROW); + t = SPI.transfer(GET_SPI_DATA); + #endif + #else + #ifdef MCU_LPC1768 + Wire.begin(); //init twi/I2C + #else + Wire.begin((uint8_t)LCD_I2C_ADDRESS); //init twi/I2C + #endif + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write((uint8_t)GET_LCD_ROW); // put command to buffer + Wire.endTransmission(); // send buffer + #ifdef __AVR__ + Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 1, 0, 0, 1); + #elif ANY(__STM32F1__, STM32F4xx, MCU_LPC1768) + Wire.requestFrom(LCD_I2C_ADDRESS, 1); + #endif + t = (uint8_t)Wire.read(); + #endif + + if (t == LCD_HEIGHT) { + PanelDetected = 1; + #if ENABLED(TFTGLCD_PANEL_SPI) + PanelDetected = 1; + #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) + SPI.transfer(INIT_SCREEN); + SPI.transfer(Marlin); + #elif defined(STM32F4xx) + SPI.transfer(INIT_SCREEN, SPI_CONTINUE); + SPI.transfer(Marlin, SPI_CONTINUE); + #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + SPI.transfer(INIT_SCREEN); + SPI.transfer(Marlin); + #elif defined(ARDUINO_ARCH_ESP32) + SPI.write(INIT_SCREEN); + SPI.write(Marlin); + #endif + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write((uint8_t)INIT_SCREEN); + Wire.write(Marlin); + Wire.endTransmission(); + #endif + } + else + PanelDetected = 0; + safe_delay(100); +} + +bool MarlinUI::detected() { + return PanelDetected; +} + +void MarlinUI::clear_lcd() { + if (!PanelDetected) return; + lcd.clear_buffer(); + lcd.print_screen(); +} + +int16_t MarlinUI::contrast; // Initialized by settings.load() + +void MarlinUI::set_contrast(const int16_t value) { + contrast = constrain(value, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX); + lcd.setContrast(contrast); +} + +static void center_text_P(PGM_P pstart, uint8_t y) { + uint8_t len = utf8_strlen_P(pstart); + if (len < LCD_WIDTH) + lcd.setCursor((LCD_WIDTH - len) / 2, y); + else + lcd.setCursor(0, y); + lcd_put_u8str_P(pstart); +} + +#if ENABLED(SHOW_BOOTSCREEN) + + void MarlinUI::show_bootscreen() { + if (!PanelDetected) return; + // + // Show the Marlin logo, splash line1, and splash line 2 + // + uint8_t indent = (LCD_WIDTH - 8) / 2; + // symbols 217 (bottom right corner) and 218 (top left corner) are using for letters in some languages + // and they should be moved to begining ASCII table as spetial symbols + lcd.setCursor(indent, 0); lcd.write(TLC); lcd_put_u8str_P(PSTR("------")); lcd.write(TRC); + lcd.setCursor(indent, 1); lcd.write(LR); lcd_put_u8str_P(PSTR("Marlin")); lcd.write(LR); + lcd.setCursor(indent, 2); lcd.write(BLC); lcd_put_u8str_P(PSTR("------")); lcd.write(BRC); + center_text_P(PSTR(SHORT_BUILD_VERSION), 3); + center_text_P(PSTR(MARLIN_WEBSITE_URL), 4); + picBits = ICON_LOGO; + lcd.print_screen(); + safe_delay(1500); + } + +#endif // SHOW_BOOTSCREEN + +void MarlinUI::draw_kill_screen() { + if (!PanelDetected) return; + lcd.clear_buffer(); + lcd.setCursor(0, 3); lcd.write(COLOR_ERROR); + lcd.setCursor((LCD_WIDTH - utf8_strlen(status_message)) / 2 + 1, 3); + lcd_put_u8str(status_message); + center_text_P(GET_TEXT(MSG_HALTED), 5); + center_text_P(GET_TEXT(MSG_PLEASE_RESET), 6); + lcd.print_screen(); +} + +// +// Before homing, blink '123' <-> '???'. +// Homed but unknown... '123' <-> ' '. +// Homed and known, display constantly. +// +FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { + lcd.write('X' + uint8_t(axis)); + if (blink) + lcd.print(value); + else { + if (!TEST(axis_homed, axis)) + while (const char c = *value++) lcd.write(c <= '.' ? c : '?'); + else { + #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) + if (!TEST(axis_known_position, axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + #endif + lcd_put_u8str(value); + } + } +} + +FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *prefix, const bool blink) { + uint8_t pic_hot_bits; + #if HAS_HEATED_BED + const bool isBed = heater_id < 0; + const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)); + const float t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); + #else + const float t1 = thermalManager.degHotend(heater_id); + const float t2 = thermalManager.degTargetHotend(heater_id); + #endif + + #if HOTENDS < 2 + if (heater_id == H_E0) { + lcd.setCursor(2, 5); lcd.print(prefix); //HE + lcd.setCursor(1, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(1, 7); + } + else { + lcd.setCursor(6, 5); lcd.print(prefix); //BED + lcd.setCursor(6, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(6, 7); + } + #else + if (heater_id > H_BED) { + lcd.setCursor(heater_id * 4, 5); lcd.print(prefix); //HE1 or HE2 or HE3 + lcd.setCursor(heater_id * 4, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(heater_id * 4, 7); + } + else { + lcd.setCursor(13, 5); lcd.print(prefix); //BED + lcd.setCursor(13, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(13, 7); + } + #endif // HOTENDS <= 1 + + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #else + if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) { + lcd.write(' '); + if (t2 >= 10) lcd.write(' '); + if (t2 >= 100) lcd.write(' '); + } + else + #endif // !HEATER_IDLE_HANDLER + lcd.print(i16tostr3rj(t2 + 0.5)); + + switch (heater_id) { + case H_BED: pic_hot_bits = ICON_BED; break; + case H_E0: pic_hot_bits = ICON_TEMP1; break; + case H_E1: pic_hot_bits = ICON_TEMP2; break; + case H_E2: pic_hot_bits = ICON_TEMP3; + default: break; + } + + if (t2) picBits |= pic_hot_bits; + else picBits &= ~pic_hot_bits; + + if (t1 > 50) hotBits |= pic_hot_bits; + else hotBits &= ~pic_hot_bits; + + if (hotBits) picBits |= ICON_HOT; + else picBits &= ~ICON_HOT; +} + +#if HAS_PRINT_PROGRESS + + FORCE_INLINE void _draw_print_progress() { + if (!PanelDetected) return; + const uint8_t progress = ui._get_progress(); + #if ENABLED(SDSUPPORT) + lcd_put_u8str_P(PSTR("SD")); + #elif ENABLED(LCD_SET_PROGRESS_MANUALLY) + lcd_put_u8str_P(PSTR("P:")); + #endif + if (progress) + lcd.print(ui8tostr3rj(progress)); + else + lcd_put_u8str_P(PSTR("---")); + lcd.write('%'); + } + +#endif // HAS_PRINT_PROGRESS + +#if ENABLED(LCD_PROGRESS_BAR) + + void MarlinUI::draw_progress_bar(const uint8_t percent) { + if (!PanelDetected) return; + if (fb == &framebuffer[0] + LCD_WIDTH * 2) { // For status screen + lcd.write('%'); lcd.write(percent); + } + else { // For progress bar test + lcd.setCursor(LCD_WIDTH / 2 - 2, LCD_HEIGHT / 2 - 2); + lcd.print(i16tostr3rj(percent)); lcd.write('%'); + lcd.print_line(); + lcd.setCursor(0, LCD_HEIGHT / 2 - 1); + lcd.write('%'); lcd.write(percent); + lcd.print_line(); + } + } + +#endif + +void MarlinUI::draw_status_message(const bool blink) { + if (!PanelDetected) return; + lcd.setCursor(0, 3); + #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + + // Alternate Status message and Filament display + if (ELAPSED(millis(), next_filament_display)) { + lcd_put_u8str_P(PSTR("Dia ")); + lcd.print(ftostr12ns(filament_width_meas)); + lcd_put_u8str_P(PSTR(" V")); + lcd.print(i16tostr3rj(100.0 * ( + parser.volumetric_enabled + ? planner.volumetric_area_nominal / planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + : planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + ) + )); + lcd.write('%'); + return; + } + + #endif // FILAMENT_LCD_DISPLAY && SDSUPPORT + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(status_message); + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + + static bool last_blink = false; + + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= LCD_WIDTH) { + + // The string isn't scrolling and may not fill the screen + lcd_put_u8str(status_message); + + // Fill the rest with spaces + while (slen < LCD_WIDTH) { lcd.write(' '); ++slen; } + } + else { + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + // and the string remaining length + uint8_t rlen; + const char *stat = status_and_len(rlen); + lcd_put_u8str_max(stat, LCD_WIDTH); // The string leaves space + + // If the remaining string doesn't completely fill the screen + if (rlen < LCD_WIDTH) { + lcd.write('.'); // Always at 1+ spaces left, draw a dot + uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters + if (--chars) { // Draw a second dot if there's space + lcd.write('.'); + if (--chars) + lcd_put_u8str_max(status_message, chars); // Print a second copy of the message + } + } + if (last_blink != blink) { + last_blink = blink; + advance_status_scroll(); + } + } + + #else + + UNUSED(blink); + + // Just print the string to the LCD + lcd_put_u8str_max(status_message, LCD_WIDTH); + + // Fill the rest with spaces if there are missing spaces + while (slen < LCD_WIDTH) { + lcd.write(' '); + ++slen; + } + + #endif +} + +/** +Possible status screens: + +Equal to 20x10 text LCD + +|X 000 Y 000 Z 000.00| +|FR100% SD100% C--:--| +| Progress bar line | +|Status message | +| | +| HE BED FAN | +| ttc ttc % | ttc - current temperature +| tts tts %%% | tts - setted temperature, %%% - percent for FAN +| ICO ICO ICO ICO | ICO - icon 48x48, placed in 2 text lines +| ICO ICO ICO ICO | ICO / + +or + +|X 000 Y 000 Z 000.00| +|FR100% SD100% C--:--| +| Progress bar line | +|Status message | +| | +|HE1 HE2 HE3 BED ICO| +|ttc ttc ttc ttc ICO| +|tts tts tts tts %%%| +|ICO ICO ICO ICO ICO| +|ICO ICO ICO ICO ICO| + +or + +Equal to 24x10 text LCD + +|X 000 Y 000 Z 000.00 | +|FR100% SD100% C--:--| +| Progress bar line | +|Status message | +| | +|HE1 HE2 HE3 BED FAN | +|ttc ttc ttc ttc % | +|tts tts tts tts %%% | +|ICO ICO ICO ICO ICO ICO| +|ICO ICO ICO ICO ICO ICO| +*/ + +void MarlinUI::draw_status_screen() { + if (!PanelDetected) return; + + const bool blink = get_blink(); + + lcd.clear_buffer(); + + // + // Line 1 - XYZ coordinates + // + + lcd.setCursor(0, 0); + _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' '); + _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' '); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); + + #if HAS_LEVELING && !HAS_HEATED_BED + lcd.write(planner.leveling_active || blink ? '_' : ' '); + #endif + + // + // Line 2 - feedrate, , time + // + + lcd.setCursor(0, 1); + lcd_put_u8str_P(PSTR("FR")); lcd.print(i16tostr3rj(feedrate_percentage)); lcd.write('%'); + + #if BOTH(SDSUPPORT, HAS_PRINT_PROGRESS) + lcd.setCursor(LCD_WIDTH / 2 - 3, 1); + _draw_print_progress(); + #endif + + char buffer[10]; + duration_t elapsed = print_job_timer.duration(); + uint8_t len = elapsed.toDigital(buffer); + + lcd.setCursor((LCD_WIDTH - 1) - len, 1); + lcd.write(0x07); lcd.print(buffer); // LCD_CLOCK_CHAR + + // + // Line 3 - progressbar + // + + lcd.setCursor(0, 2); + #if ENABLED(LCD_PROGRESS_BAR) + draw_progress_bar(_get_progress()); + #else + lcd.write('%'); lcd.write(0); + #endif + + // + // Line 4 - Status Message (which may be a Filament display) + // + + draw_status_message(blink); + + // + // Line 5 + // + + #if HOTENDS <= 1 || (HOTENDS <= 2 && !HAS_HEATED_BED) + #if DUAL_MIXING_EXTRUDER + lcd.setCursor(0, 4); + // Two-component mix / gradient instead of XY + char mixer_messages[12]; + const char *mix_label; + #if ENABLED(GRADIENT_MIX) + if (mixer.gradient.enabled) { + mixer.update_mix_from_gradient(); + mix_label = "Gr"; + } + else + #endif + { + mixer.update_mix_from_vtool(); + mix_label = "Mx"; + } + sprintf_P(mixer_messages, PSTR("%s %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); + lcd_put_u8str(mixer_messages); + #endif + #endif + + // + // Line 6..8 Temperatures, FAN + // + + #if HOTENDS < 2 + _draw_heater_status(H_E0, "HE", blink); // Hotend Temperature + #else + _draw_heater_status(H_E0, "HE1", blink); // Hotend 1 Temperature + _draw_heater_status(H_E1, "HE2", blink); // Hotend 2 Temperature + #if HOTENDS > 2 + _draw_heater_status(H_E2, "HE3", blink); // Hotend 3 Temperature + #endif + #endif // HOTENDS <= 1 + + #if HAS_HEATED_BED + #if HAS_LEVELING + _draw_heater_status(H_BED, (planner.leveling_active && blink ? "___" : "BED"), blink); + #else + _draw_heater_status(H_BED, "BED", blink); + #endif + #endif // HAS_HEATED_BED + + #if FAN_COUNT > 0 + uint16_t spd = thermalManager.fan_speed[0]; + + #if ENABLED(ADAPTIVE_FAN_SLOWING) + if (!blink) spd = thermalManager.scaledFanSpeed(0, spd); + #endif + + uint16_t per = thermalManager.fanPercent(spd); + #if HOTENDS < 2 + #define FANX 11 + #else + #define FANX 17 + #endif + lcd.setCursor(FANX, 5); lcd_put_u8str_P(PSTR("FAN")); + lcd.setCursor(FANX + 1, 6); lcd.write('%'); + lcd.setCursor(FANX, 7); + lcd.print(i16tostr3rj(per)); + + if (TERN0(HAS_FAN0, thermalManager.fan_speed[0]) || TERN0(HAS_FAN1, thermalManager.fan_speed[1]) || TERN0(HAS_FAN2, thermalManager.fan_speed[2])) + picBits |= ICON_FAN; + else + picBits &= ~ICON_FAN; + + #endif // FAN_COUNT > 0 + + // + // Line 9, 10 - icons + // + lcd.print_screen(); +} + +#if HAS_LCD_MENU + + #include "../menu/menu.h" + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + if (!PanelDetected) return; + lcd.setCursor((LCD_WIDTH - 14) / 2, row + 1); + lcd.write(0x02); lcd_put_u8str_P(" E"); lcd.write('1' + extruder); lcd.write(' '); + lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(0x01); lcd.write('/'); + lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(0x01); + lcd.print_line(); + } + + #endif // ADVANCED_PAUSE_FEATURE + + // Draw a static item with no left-right margin required. Centered by default. + void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + if (!PanelDetected) return; + uint8_t n = LCD_WIDTH; + lcd.setCursor(0, row); + if ((style & SS_CENTER) && !valstr) { + int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; + while (--pad >= 0) { lcd.write(' '); n--; } + } + n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); + if (valstr) n -= lcd_put_u8str_max(valstr, n); + for (; n; --n) lcd.write(' '); + lcd.print_line(); + } + + // Draw a generic menu item with pre_char (if selected) and post_char + void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { + if (!PanelDetected) return; + lcd.setCursor(0, row); + lcd.write(sel ? pre_char : ' '); + uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2); + for (; n; --n) lcd.write(' '); + lcd.write(post_char); + lcd.print_line(); + } + + // Draw a menu item with a (potentially) editable value + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + if (!PanelDetected) return; + const uint8_t vlen = data ? (pgm ? utf8_strlen_P(data) : utf8_strlen(data)) : 0; + lcd.setCursor(0, row); + lcd.write(sel ? LCD_STR_ARROW_RIGHT[0] : ' '); + uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vlen); + if (vlen) { + lcd.write(':'); + for (; n; --n) lcd.write(' '); + if (pgm) lcd_put_u8str_P(data); else lcd_put_u8str(data); + } + lcd.print_line(); + } + + // Low-level draw_edit_screen can be used to draw an edit screen from anyplace + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + if (!PanelDetected) return; + ui.encoder_direction_normal(); + lcd.setCursor(0, LCD_HEIGHT - 1); //last line is free most time + lcd.write(COLOR_EDIT); + lcd_put_u8str_P(pstr); + if (value != nullptr) { + lcd.write(':'); + lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), LCD_HEIGHT - 1); // Right-justified, padded by spaces + lcd.write(' '); // Overwrite char if value gets shorter + lcd.print(value); + lcd.write(' '); + lcd.print_line(); + } + } + + // The Select Screen presents a prompt and two "buttons" + void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) { + if (!PanelDetected) return; + ui.draw_select_screen_prompt(pref, string, suff); + lcd.setCursor(0, LCD_HEIGHT - 1); + lcd.write(COLOR_EDIT); + lcd.write(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd.write(yesno ? ' ' : ']'); + lcd.setCursor(LCD_WIDTH - utf8_strlen_P(yes) - 3, LCD_HEIGHT - 1); + lcd.write(yesno ? '[' : ' '); lcd_put_u8str_P(yes); lcd.write(yesno ? ']' : ' '); + lcd.print_line(); + } + + #if ENABLED(SDSUPPORT) + + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + if (!PanelDetected) return; + lcd.setCursor(0, row); + lcd.write(sel ? LCD_STR_ARROW_RIGHT[0] : ' '); + constexpr uint8_t maxlen = LCD_WIDTH - 2; + uint8_t n = maxlen - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), maxlen); + for (; n; --n) lcd.write(' '); + lcd.write(isDir ? LCD_STR_FOLDER[0] : ' '); + lcd.print_line(); + } + + #endif // SDSUPPORT + + #if ENABLED(LCD_HAS_STATUS_INDICATORS) + + void MarlinUI::update_indicators() {} + + #endif // LCD_HAS_STATUS_INDICATORS + + #if ENABLED(AUTO_BED_LEVELING_UBL) + /** + * Map screen: + * |/---------\ (00,00) | + * || . . . . | X:000.00| + * || . . . . | Y:000.00| + * || . . . . | Z:00.000| + * || . . . . | | + * || . . . . | | + * || . . . . | | + * |+---------/ | + * | | + * |____________________| + */ + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + if (!PanelDetected) return; + + #define _LCD_W_POS 12 + + lcd.clear_buffer(); + + //print only top left corner. All frame with grid points will be printed by panel + lcd.setCursor(0, 0); + *fb++ = TLC; //top left corner - marker for plot parameters + *fb = (GRID_MAX_POINTS_X << 4) + GRID_MAX_POINTS_Y; //set mesh size + + // Print plot position + lcd.setCursor(_LCD_W_POS, 0); + *fb++ = '('; lcd.print(i16tostr3left(x_plot)); + *fb++ = ','; lcd.print(i16tostr3left(y_plot)); *fb = ')'; + + // Show all values + lcd.setCursor(_LCD_W_POS, 1); lcd_put_u8str_P(PSTR("X:")); + lcd.print(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); + lcd.setCursor(_LCD_W_POS, 2); lcd_put_u8str_P(PSTR("Y:")); + lcd.print(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); + + // Show the location value + lcd.setCursor(_LCD_W_POS, 3); lcd_put_u8str_P(PSTR("Z:")); + + if (!isnan(ubl.z_values[x_plot][y_plot])) + lcd.print(ftostr43sign(ubl.z_values[x_plot][y_plot])); + else + lcd_put_u8str_P(PSTR(" -----")); + + center_text_P(GET_TEXT(MSG_UBL_FINE_TUNE_MESH), 8); + + lcd.print_screen(); + } + + #endif // AUTO_BED_LEVELING_UBL + +#endif // HAS_LCD_MENU + +#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h new file mode 100644 index 0000000000..9f54730c3c --- /dev/null +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h @@ -0,0 +1,74 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Implementation of the LCD display routines for a TFT GLCD displays with external controller. + */ + +#include "../../inc/MarlinConfig.h" + +#if IS_TFTGLCD_PANEL + +#include "../../libs/duration_t.h" + +//////////////////////////////////// +// Set up button and encode mappings for each panel (into 'buttons' variable) +// +// This is just to map common functions (across different panels) onto the same +// macro name. The mapping is independent of whether the button is directly connected or +// via a shift/i2c register. + +//////////////////////////////////// +// Create LCD class instance and chipset-specific information +class TFTGLCD { + private: + public: + TFTGLCD(); + void clear_buffer(); + void setCursor(uint8_t col, uint8_t row); + void write(char c); + void print(const char *line); + void print_line(); + void print_screen(); + void redraw_screen(); + void setContrast(uint16_t contrast); +}; + +extern TFTGLCD lcd; + +#include "../fontutils.h" +#include "../lcdprint.h" + +// Use panel encoder - free old encoder pins +#undef BTN_EN1 +#undef BTN_EN2 +#undef BTN_ENC +#define BTN_EN1 -1 +#define BTN_EN2 -1 +#define BTN_ENC -1 + +#ifndef EN_C + #define EN_C 4 //for click +#endif + +#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index d034de0952..2cd300958f 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -59,10 +59,14 @@ inline float rounded_mesh_value() { static void _lcd_mesh_fine_tune(PGM_P const msg) { ui.defer_status_screen(); if (ubl.encoder_diff) { - mesh_edit_accumulator += ubl.encoder_diff > 0 ? 0.005f : -0.005f; + mesh_edit_accumulator += TERN(IS_TFTGLCD_PANEL, + ubl.encoder_diff * 0.005f / ENCODER_PULSES_PER_STEP, + ubl.encoder_diff > 0 ? 0.005f : -0.005f + ); ubl.encoder_diff = 0; - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); + TERN(IS_TFTGLCD_PANEL,,ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); } + TERN_(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); if (ui.should_draw()) { const float rounded_f = rounded_mesh_value(); diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 89dc0adaf3..de534e4023 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -506,7 +506,7 @@ bool MarlinUI::get_blink() { * This is very display-dependent, so the lcd implementation draws this. */ -#if ENABLED(LCD_PROGRESS_BAR) +#if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL millis_t MarlinUI::progress_bar_ms; // = 0 #if PROGRESS_MSG_EXPIRE > 0 millis_t MarlinUI::expire_status_ms; // = 0 @@ -517,7 +517,7 @@ void MarlinUI::status_screen() { TERN_(HAS_LCD_MENU, ENCODER_RATE_MULTIPLY(false)); - #if ENABLED(LCD_PROGRESS_BAR) + #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL // // HD44780 implements the following message blinking and @@ -915,7 +915,7 @@ void MarlinUI::update() { const bool encoderPastThreshold = (abs_diff >= epps); if (encoderPastThreshold || lcd_clicked) { - if (encoderPastThreshold) { + if (encoderPastThreshold && TERN1(IS_TFTGLCD_PANEL, !external_control)) { #if BOTH(HAS_LCD_MENU, ENCODER_RATE_MULTIPLIER) @@ -1260,6 +1260,12 @@ void MarlinUI::update() { TERN(REPRAPWORLD_KEYPAD, keypad_buttons, buttons) = ~val; #endif + #if IS_TFTGLCD_PANEL + next_button_update_ms = now + (LCD_UPDATE_INTERVAL / 2); + buttons = slow_buttons; + TERN_(AUTO_BED_LEVELING_UBL, external_encoder()); + #endif + } // next_button_update_ms #if HAS_ENCODER_WHEEL @@ -1331,7 +1337,7 @@ void MarlinUI::update() { const millis_t ms = millis(); #endif - #if ENABLED(LCD_PROGRESS_BAR) + #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL progress_bar_ms = ms; #if PROGRESS_MSG_EXPIRE > 0 expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index c23dc5d84e..c7ef41596d 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -34,7 +34,7 @@ #if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY) #define HAS_ENCODER_ACTION 1 #endif -#if (!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTONS_EXIST(EN1, EN2) +#if ((!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL #define HAS_ENCODER_WHEEL 1 #endif #if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT) @@ -45,7 +45,7 @@ #endif // I2C buttons must be read in the main thread -#if EITHER(LCD_I2C_VIKI, LCD_I2C_PANELOLU2) +#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL) #define HAS_SLOW_BUTTONS 1 #endif @@ -215,7 +215,7 @@ #endif -#if BUTTON_EXISTS(BACK) || HAS_TOUCH_XPT2046 +#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_XPT2046, IS_TFTGLCD_PANEL) #define BLEN_D 3 #define EN_D _BV(BLEN_D) #define LCD_BACK_CLICKED() (buttons & EN_D) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h index 4165bb3503..0701e45992 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h @@ -65,7 +65,16 @@ * by redrawing the screen after SD card accesses. */ -#if HAS_WIRED_LCD +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_26 + #endif + + #define SD_DETECT_PIN P1_31 + +#elif HAS_WIRED_LCD + #define BTN_EN1 P3_26 #define BTN_EN2 P3_25 #define BTN_ENC P2_11 @@ -80,7 +89,8 @@ #define DOGLCD_CS P2_06 #define DOGLCD_A0 P0_16 #endif -#endif + +#endif // HAS_WIRED_LCD // // SD Support @@ -89,7 +99,7 @@ // requires jumpers on the SKR V1.1 board as documented here: // https://www.facebook.com/groups/505736576548648/permalink/630639874058317/ #ifndef SDCARD_CONNECTION - #if EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, IS_TFTGLCD_PANEL) #define SDCARD_CONNECTION LCD #else #define SDCARD_CONNECTION ONBOARD diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index e8983c7f54..31373fedff 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -265,6 +265,14 @@ #error "ADC BUTTONS do not work unmodifed on SKR 1.3, The ADC ports cannot take more than 3.3v." + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS EXPA2_08_PIN + #endif + + #define SD_DETECT_PIN EXPA2_04_PIN + #else // !CR10_STOCKDISPLAY #define LCD_PINS_RS EXPA1_07_PIN diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 3bdd3061b7..6f9f4bcf63 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -309,6 +309,14 @@ #define XPT2046_Y_OFFSET -285 #endif + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_26 + #endif + + #define SD_DETECT_PIN P1_31 + #else #define BTN_ENC P0_28 // (58) open-drain diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 1cb6774a41..1290200e55 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -217,7 +217,18 @@ * that the garbage/lines are erased immediately after the SD card accesses are completed. */ -#if HAS_WIRED_LCD +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_25 // EXP2.3 + #endif + + #if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN P0_28 // EXP2.4 + #endif + +#elif HAS_WIRED_LCD + #define BEEPER_PIN P1_31 // EXP1.1 #define BTN_ENC P1_30 // EXP1.2 #define BTN_EN1 P3_26 // EXP2.5 @@ -273,7 +284,7 @@ //#define LCD_SCREEN_ROT_270 #endif -#endif +#endif // HAS_WIRED_LCD /** * Example for trinamic drivers using the J8 connector on MKs Sbase. diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 02fdaafd30..d269ecbdc9 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -249,6 +249,15 @@ #define LCD_PINS_ENABLE P1_22 #define LCD_PINS_D4 P0_17 + #elif IS_TFTGLCD_PANEL + + #undef BEEPER_PIN + #undef BTN_ENC + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_25 + #endif + #else #define BTN_EN1 P3_25 diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 097f8be22a..41763fb33c 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -326,6 +326,15 @@ #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) +#elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_26 // (31) J3-2 & AUX-4 + #endif + + #define SD_DETECT_PIN P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + #elif HAS_WIRED_LCD //#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index a073a6fe30..cbbe8a9416 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -241,7 +241,16 @@ * ----- ----- * EXP1 EXP2 */ -#if HAS_WIRED_LCD +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_25 + #endif + + #define SD_DETECT_PIN P0_27 + +#elif HAS_WIRED_LCD + #define BEEPER_PIN P1_31 #define BTN_ENC P1_30 diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 33975df8ee..f2811b14ab 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -111,16 +111,33 @@ #elif HAS_WIRED_LCD - /* - The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either - a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board - found at http://smoothieware.org/rrdglcdadapter + /** + * SD Support + * + * For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be + * hooked up to the onboard SDCard SPI and use a spare pin for the SDCS. + * Also note that an external SDCard sharing the SPI port with the + * onboard/internal SDCard must be ejected before rebooting as the bootloader + * does not like the external card. NOTE Smoothie will not boot if the external + * sdcard is inserted in the RRD LCD sdcard slot at boot time, it must be + * inserted after it has booted. + */ + #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) - Other links to information about setting up a display panel with Smoothieboard - http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg - http://smoothieware.org/panel - */ + #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) + #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) + #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) + #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) + /** + * The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either + * a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board + * found at http://smoothieware.org/rrdglcdadapter + * + * Other links to information about setting up a display panel with Smoothieboard + * http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg + * http://smoothieware.org/panel + */ #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) // EXP1 Pins #define BEEPER_PIN P1_31 // EXP1 Pin 1 @@ -132,24 +149,14 @@ #define BTN_EN2 P3_26 // EXP2 Pin 3 #define BTN_EN1 P3_25 // EXP2 Pin 5 - /* - SD Support + #elif IS_TFTGLCD_PANEL - For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be - hooked up to the onboard SDCard SPI and use a spare pin for the SDCS. - Also note that an external SDCard sharing the SPI port with the - onboard/internal SDCard must be ejected before rebooting as the bootloader - does not like the external card. NOTE Smoothie will not boot if the external - sdcard is inserted in the RRD LCD sdcard slot at boot time, it must be - inserted after it has booted. - */ - - #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) - #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) - #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) - #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_26 // EXP2 Pin 3 + #endif + #else #error "Marlin's Smoothieboard support cannot drive your LCD." #endif diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index ac15a3c9ba..704f2a487f 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -261,6 +261,9 @@ #if defined(TMC_SW_SCK) && TMC_SW_SCK >= 0 REPORT_NAME_DIGITAL(__LINE__, TMC_SW_SCK) #endif +#if defined(TFTGLCD_CS) && TFTGLCD_CS >= 0 + REPORT_NAME_DIGITAL(__LINE__, TFTGLCD_CS) +#endif #if PIN_EXISTS(E_MUX0) REPORT_NAME_DIGITAL(__LINE__, E_MUX0_PIN) #endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index aa73aabbc1..de56d2b59d 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -450,6 +450,10 @@ #define LCD_PINS_D6 44 #define LCD_PINS_D7 64 + #elif ENABLED(TFTGLCD_PANEL_SPI) + + #define TFTGLCD_CS 33 + #else #if ENABLED(CR10_STOCKDISPLAY) @@ -682,6 +686,10 @@ // Pins only defined for RAMPS_SMART currently + #elif IS_TFTGLCD_PANEL + + #define SD_DETECT_PIN 49 + #else // Beeper on AUX-4 diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index fd741d296d..2bc94c45c5 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -279,9 +279,7 @@ #if SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN PC4 -#endif - -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) && SD_CONNECTION_IS(LCD) +#elif SD_CONNECTION_IS(LCD) && BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #define SD_DETECT_PIN PA15 #define SS_PIN PA10 #elif SD_CONNECTION_IS(CUSTOM_CABLE) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 30d057d900..09e47875ed 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -169,8 +169,48 @@ #define FORCE_SOFT_SPI #define LCD_BACKLIGHT_PIN -1 + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + + #error "CAUTION! TFTGLCD_PANEL_SPI requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." + + /** + * TFTGLCD_PANEL_SPI display pinout + * + * Board Display + * _____ _____ + * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) + * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) GLCD_CS | 3 4 | SD_CS (PA10) + * (FREE) PB9 | 5 6 | PA10 (SD_CS) (FREE) | 5 6 | MOSI (SPI1-MOSI) + * RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | (FREE) + * (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V + * ----- ----- + * EXP1 EXP1 + * + * Needs custom cable: + * + * Board Adapter Display + * _________ + * EXP1-1 ----------- EXP1-10 + * EXP1-2 ----------- EXP1-9 + * SPI1-4 ----------- EXP1-6 + * EXP1-4 ----------- FREE + * SPI1-3 ----------- EXP1-2 + * EXP1-6 ----------- EXP1-4 + * EXP1-7 ----------- FREE + * EXP1-8 ----------- EXP1-3 + * SPI1-1 ----------- EXP1-1 + * EXP1-10 ----------- EXP1-7 + * + */ + + #define TFTGLCD_CS PA9 + + #endif + #else - #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, and MKS_MINI_12864 are currently supported on the BIGTREE_SKR_MINI_E3." + #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the BIGTREE_SKR_MINI_E3." #endif #endif // HAS_WIRED_LCD @@ -227,9 +267,7 @@ #if SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN PC4 -#endif - -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) && SD_CONNECTION_IS(LCD) +#elif SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) #define SD_DETECT_PIN PB5 #define SS_PIN PA10 #elif SD_CONNECTION_IS(CUSTOM_CABLE) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index 3397c34f33..47fff4467c 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -123,6 +123,17 @@ #define LCD_PINS_ENABLE PC14 #define LCD_PINS_D4 PB7 + #elif IS_TFTGLCD_PANEL + + #undef BEEPER_PIN + #undef BTN_ENC + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS PD2 + #endif + + #define SD_DETECT_PIN PB9 + #else #define LCD_PINS_RS PC12 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 5cdeda3a83..d5318b8e87 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -115,6 +115,12 @@ #define DOGLCD_SCK PB13 #define DOGLCD_MOSI PB15 + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS PB11 + #endif + #else // !MKS_MINI_12864 #define LCD_PINS_D4 PA6 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index caa5e2b8fc..4e782649d3 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -356,6 +356,19 @@ #define DOGLCD_SCK PA5 #define DOGLCD_MOSI PA7 + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define PIN_SPI_SCK PA5 + #define PIN_TFT_MISO PA6 + #define PIN_TFT_MOSI PA7 + #define TFTGLCD_CS PE8 + #endif + + #ifndef BEEPER_PIN + #define BEEPER_PIN -1 + #endif + #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 93f0de33da..12c40b31b3 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -225,6 +225,12 @@ #define BTN_EN2 PG4 #endif +#elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS PG5 + #endif + #elif HAS_WIRED_LCD #define BEEPER_PIN PC5 @@ -254,6 +260,7 @@ #endif #endif // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY + #endif #ifndef BOARD_ST7920_DELAY_1 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 8397276144..1cd7e9dd89 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -286,7 +286,14 @@ // // LCDs and Controllers // -#if HAS_WIRED_LCD +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS PG10 + #endif + +#elif HAS_WIRED_LCD + #define BEEPER_PIN PG4 #define BTN_ENC PA8 diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index 9c7a1ba10e..a7a6456d02 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -26,6 +26,20 @@ opt_enable VIKI2 SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Smoothieboard with many features" +restore_configs +opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 -1 +opt_set TEMP_SENSOR_BED 5 +opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ + FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \ + PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ + Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ + LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI" + #restore_configs #opt_set MOTHERBOARD BOARD_AZTEEG_X5_MINI_WIFI #opt_enable COREYX USE_XMAX_PLUG DAC_MOTOR_CURRENT_DEFAULT \ diff --git a/platformio.ini b/platformio.ini index ff3c0fb810..c426c5223b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,7 +26,7 @@ include_dir = Marlin # [common] default_src_filter = + - - + - - - - - + - - - - - - - - - - - @@ -216,6 +216,7 @@ HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 src_filter=+ HAS_GRAPHICAL_TFT = src_filter=+ DWIN_CREALITY_LCD = src_filter=+ +IS_TFTGLCD_PANEL = src_filter=+ HAS_LCD_MENU = src_filter=+ HAS_GAMES = src_filter=+ MARLIN_BRICKOUT = src_filter=+ From 85573909d180913225aeac067d1fc172e1becf02 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 03:55:04 -0500 Subject: [PATCH 0312/1370] Update configs to 020007 --- Marlin/Configuration.h | 2 +- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/Version.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index bb724672b0..7fb3482afe 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -36,7 +36,7 @@ * Advanced settings can be found in Configuration_adv.h * */ -#define CONFIGURATION_H_VERSION 020006 +#define CONFIGURATION_H_VERSION 020007 //=========================================================================== //============================= Getting Started ============================= diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0435b6f97c..7d2d78e9dd 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -31,7 +31,7 @@ * Basic settings can be found in Configuration.h * */ -#define CONFIGURATION_ADV_H_VERSION 020006 +#define CONFIGURATION_ADV_H_VERSION 020007 // @section temperature diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 3f8df1517c..7b6a13bc56 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -52,7 +52,7 @@ * to alert users to major changes. */ -#define MARLIN_HEX_VERSION 020006 +#define MARLIN_HEX_VERSION 020007 #ifndef REQUIRED_CONFIGURATION_H_VERSION #define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION #endif From ad3c475dd154eb79d99a363381fc170dd81c55e1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 03:57:09 -0500 Subject: [PATCH 0313/1370] Tweaks to git helpers --- buildroot/share/git/mfinfo | 3 ++- buildroot/share/git/mfrb | 7 ++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/buildroot/share/git/mfinfo b/buildroot/share/git/mfinfo index c7bf04fb14..e17138e456 100755 --- a/buildroot/share/git/mfinfo +++ b/buildroot/share/git/mfinfo @@ -49,7 +49,8 @@ while [[ $# -gt 0 ]]; do done case "$REPO" in - Marlin ) TARG=bugfix-1.1.x ; [[ $INDEX == 2 ]] && TARG=bugfix-2.0.x ; [[ $INDEX == 3 ]] && TARG=dev-2.1.x ;; + Marlin ) TARG=bugfix-2.0.x ; [[ $INDEX == 1 ]] && TARG=bugfix-1.1.x ; [[ $INDEX == 3 ]] && TARG=dev-2.1.x ;; + Configurations ) TARG=import-2.0.x ;; MarlinDocumentation ) TARG=master ;; esac diff --git a/buildroot/share/git/mfrb b/buildroot/share/git/mfrb index 1edc99bbe9..071b0b3d59 100755 --- a/buildroot/share/git/mfrb +++ b/buildroot/share/git/mfrb @@ -23,8 +23,5 @@ done [[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } -# If the branch isn't currently the PR target -if [[ $TARG != $CURR ]]; then - [[ $QUICK ]] || git fetch upstream - git rebase upstream/$TARG && git rebase -i upstream/$TARG -fi +[[ $QUICK ]] || git fetch upstream +git rebase upstream/$TARG && git rebase -i upstream/$TARG From 25bf561aedc076495fc20e29f7b21d3fe8634838 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 04:39:29 -0500 Subject: [PATCH 0314/1370] Default E3 V2 to English --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 120 +++++++++++++++--------------- Marlin/src/lcd/dwin/e3v2/dwin.h | 9 ++- 2 files changed, 66 insertions(+), 63 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index c0096d379d..2aaf66854c 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -151,7 +151,7 @@ constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other /* Value Init */ HMI_value_t HMI_ValueStruct; -HMI_Flag HMI_flag{0}; +HMI_Flag_t HMI_flag{0}; millis_t dwin_heat_time = 0; @@ -173,7 +173,6 @@ select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0} , select_acc{0} , select_jerk{0} , select_step{0} - // , select_leveling{0} ; uint8_t index_file = MROWS, @@ -208,22 +207,24 @@ uint16_t remain_time = 0; #define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) // BL24CXX::check() uses 0x00 +inline bool HMI_IsChinese() { return HMI_flag.language == DWIN_CHINESE; } + void HMI_SetLanguageCache() { - DWIN_JPG_CacheTo1(HMI_flag.language_chinese ? Language_Chinese : Language_English); + DWIN_JPG_CacheTo1(HMI_IsChinese() ? Language_Chinese : Language_English); } void HMI_SetLanguage() { #if ENABLED(EEPROM_SETTINGS) - BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); + BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); #endif HMI_SetLanguageCache(); } void HMI_ToggleLanguage() { - HMI_flag.language_chinese ^= true; + HMI_flag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE; HMI_SetLanguageCache(); #if ENABLED(EEPROM_SETTINGS) - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); #endif } @@ -242,14 +243,14 @@ void ICON_Print() { if (select_page.now == 0) { DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); DWIN_Draw_Rectangle(0, Color_White, 17, 130, 126, 229); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 58, 201); else DWIN_Frame_AreaCopy(1, 1, 451, 31, 463, 57, 201); } else { DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 58, 201); else DWIN_Frame_AreaCopy(1, 1, 423, 31, 435, 57, 201); @@ -260,14 +261,14 @@ void ICON_Prepare() { if (select_page.now == 1) { DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); DWIN_Draw_Rectangle(0, Color_White, 145, 130, 254, 229); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 31, 447, 58, 460, 186, 201); else DWIN_Frame_AreaCopy(1, 33, 451, 82, 466, 175, 201); } else { DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 31, 405, 58, 420, 186, 201); else DWIN_Frame_AreaCopy(1, 33, 423, 82, 438, 175, 201); @@ -278,14 +279,14 @@ void ICON_Control() { if (select_page.now == 2) { DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); DWIN_Draw_Rectangle(0, Color_White, 17, 246, 126, 345); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 61, 447, 88, 460, 58, 318); else DWIN_Frame_AreaCopy(1, 85, 451, 132, 463, 48, 318); } else { DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 61, 405, 88, 420, 58, 318); else DWIN_Frame_AreaCopy(1, 85, 423, 132, 434, 48, 318); @@ -296,14 +297,14 @@ void ICON_StartInfo(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 91, 447, 118, 460, 186, 318); else DWIN_Frame_AreaCopy(1, 132, 451, 159, 466, 186, 318); } else { DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 91, 405, 118, 420, 186, 318); else DWIN_Frame_AreaCopy(1, 132, 423, 159, 435, 186, 318); @@ -314,14 +315,14 @@ void ICON_Leveling(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 211, 447, 238, 460, 186, 318); else DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 182, 318); } else { DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 211, 405, 238, 420, 186, 318); else DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 182, 318); @@ -332,14 +333,14 @@ void ICON_Tune() { if (select_print.now == 0) { DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); DWIN_Draw_Rectangle(0, Color_White, 8, 252, 87, 351); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 121, 447, 148, 458, 34, 325); else DWIN_Frame_AreaCopy(1, 0, 466, 34, 476, 31, 325); } else { DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 121, 405, 148, 420, 34, 325); else DWIN_Frame_AreaCopy(1, 0, 438, 32, 448, 31, 325); @@ -350,14 +351,14 @@ void ICON_Pause() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 181, 447, 208, 459, 124, 325); else DWIN_Frame_AreaCopy(1, 177, 451, 216, 462, 116, 325); } else { DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 181, 405, 208, 420, 124, 325); else DWIN_Frame_AreaCopy(1, 177, 423, 215, 433, 116, 325); @@ -368,14 +369,14 @@ void ICON_Continue() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 124, 325); else DWIN_Frame_AreaCopy(1, 1, 452, 32, 464, 121, 325); } else { DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 124, 325); else DWIN_Frame_AreaCopy(1, 1, 424, 31, 434, 121, 325); @@ -386,14 +387,14 @@ void ICON_Stop() { if (select_print.now == 2) { DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); DWIN_Draw_Rectangle(0, Color_White, 184, 252, 263, 351); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 151, 447, 178, 459, 210, 325); else DWIN_Frame_AreaCopy(1, 218, 452, 249, 466, 209, 325); } else { DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 151, 405, 178, 420, 210, 325); else DWIN_Frame_AreaCopy(1, 218, 423, 247, 436, 209, 325); @@ -481,7 +482,7 @@ inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char // The "Back" label is always on the first line inline void Draw_Back_Label() { - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 129, 72, 156, 84, LBLX, MBASE(0)); else DWIN_Frame_AreaCopy(1, 226, 179, 256, 189, LBLX, MBASE(0)); @@ -563,7 +564,7 @@ inline void draw_move_en(const uint16_t line) { inline void DWIN_Frame_TitleCopy(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { DWIN_Frame_AreaCopy(id, x1, y1, x2, y2, 14, 8); } inline void Item_Prepare_Move(const uint8_t row) { - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 159, 70, 200, 84, LBLX, MBASE(row)); else draw_move_en(MBASE(row)); // "Move >" @@ -572,7 +573,7 @@ inline void Item_Prepare_Move(const uint8_t row) { } inline void Item_Prepare_Disable(const uint8_t row) { - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 204, 70, 259, 82, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 103, 59, 200, 74, LBLX, MBASE(row)); // "Disable Stepper" @@ -580,7 +581,7 @@ inline void Item_Prepare_Disable(const uint8_t row) { } inline void Item_Prepare_Home(const uint8_t row) { - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 0, 89, 41, 101, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 202, 61, 271, 71, LBLX, MBASE(row)); // "Auto Home" @@ -590,7 +591,7 @@ inline void Item_Prepare_Home(const uint8_t row) { #if HAS_ZOFFSET_ITEM inline void Item_Prepare_Offset(const uint8_t row) { - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); @@ -613,7 +614,7 @@ inline void Item_Prepare_Home(const uint8_t row) { #if HAS_HOTEND inline void Item_Prepare_PLA(const uint8_t row) { - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row)); } else { @@ -624,7 +625,7 @@ inline void Item_Prepare_Home(const uint8_t row) { } inline void Item_Prepare_ABS(const uint8_t row) { - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row)); } else { @@ -637,7 +638,7 @@ inline void Item_Prepare_Home(const uint8_t row) { #if HAS_PREHEAT inline void Item_Prepare_Cool(const uint8_t row) { - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" @@ -646,7 +647,7 @@ inline void Item_Prepare_Home(const uint8_t row) { #endif inline void Item_Prepare_Lang(const uint8_t row) { - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 239, 134, 266, 146, LBLX, MBASE(row)); DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("CN")); } @@ -664,7 +665,7 @@ inline void Draw_Prepare_Menu() { #define PSCROL(L) (scroll + (L)) #define PVISI(L) WITHIN(PSCROL(L), 0, MROWS) - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 133, 1, 160, 13); // "Prepare" } else { @@ -708,7 +709,7 @@ inline void Draw_Control_Menu() { if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 103, 1, 130, 14); // "Control" DWIN_Frame_AreaCopy(1, 57, 104, 84, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > @@ -775,7 +776,7 @@ inline void Draw_Control_Menu() { inline void Draw_Tune_Menu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 73, 2, 100, 13, 14, 9); DWIN_Frame_AreaCopy(1, 116, 164, 171, 176, LBLX, MBASE(TUNE_CASE_SPEED)); #if HAS_HOTEND @@ -881,7 +882,7 @@ inline void say_e(const uint16_t inset, const uint16_t line) { inline void Draw_Motion_Menu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Motion" DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, MBASE(MOTION_CASE_RATE)); // Max speed DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(MOTION_CASE_ACCEL)); // Max... @@ -936,7 +937,7 @@ inline void Draw_Motion_Menu() { Draw_Popup_Bkgd_105(); if (toohigh) { DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 103, 371, 237, 386, 52, 285); DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); @@ -948,7 +949,7 @@ inline void Draw_Motion_Menu() { } else { DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 103, 371, 270, 386, 52, 285); DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); } @@ -971,7 +972,7 @@ inline void Draw_Popup_Bkgd_60() { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 103, 371, 136, 386, 69, 240); DWIN_Frame_AreaCopy(1, 170, 371, 270, 386, 102, 240); DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); @@ -987,7 +988,7 @@ inline void Draw_Popup_Bkgd_60() { void Popup_Window_Resume() { Clear_Popup_Area(); Draw_Popup_Bkgd_105(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 160, 338, 235, 354, 98, 135); DWIN_Frame_AreaCopy(1, 103, 321, 271, 335, 52, 192); DWIN_ICON_Show(ICON, ICON_Continue_C, 26, 307); @@ -1006,7 +1007,7 @@ void Popup_Window_Home(const bool parking/*=false*/) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_BLTouch, 101, 105); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 0, 371, 33, 386, 85, 240); DWIN_Frame_AreaCopy(1, 203, 286, 271, 302, 118, 240); DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); @@ -1023,7 +1024,7 @@ void Popup_Window_Home(const bool parking/*=false*/) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 0, 371, 100, 386, 84, 240); DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } @@ -1048,7 +1049,7 @@ void Draw_Select_Highlight(const bool sel) { void Popup_window_PauseOrStop() { Clear_Main_Window(); Draw_Popup_Bkgd_60(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { if (select_print.now == 1) DWIN_Frame_AreaCopy(1, 237, 338, 269, 356, 98, 150); else if (select_print.now == 2) DWIN_Frame_AreaCopy(1, 221, 320, 253, 336, 98, 150); DWIN_Frame_AreaCopy(1, 220, 304, 264, 319, 130, 150); @@ -1065,7 +1066,7 @@ void Popup_window_PauseOrStop() { } void Draw_Printing_Screen() { - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 30, 1, 71, 14, 14, 9); // Tune DWIN_Frame_AreaCopy(1, 0, 72, 63, 86, 41, 188); // Pause DWIN_Frame_AreaCopy(1, 65, 72, 128, 86, 176, 188); // Stop @@ -1125,7 +1126,7 @@ void Goto_MainMenu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 2, 2, 27, 14, 14, 9); // "Home" } else { @@ -1864,7 +1865,7 @@ inline void Draw_Info_Menu() { DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 30, 17, 57, 29); // "Info" DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); @@ -1895,7 +1896,7 @@ inline void Draw_Info_Menu() { inline void Draw_Print_File_Menu() { Clear_Title_Bar(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 0, 31, 55, 44); // "Print file" } else { @@ -2226,9 +2227,8 @@ void HMI_PauseOrStop() { dwin_abort_flag = true; #endif } - else { + else Goto_PrintProcess(); // cancel stop - } } } DWIN_UpdateLCD(); @@ -2237,7 +2237,7 @@ void HMI_PauseOrStop() { inline void Draw_Move_Menu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 192, 1, 233, 14); // "Move" DWIN_Frame_AreaCopy(1, 58, 118, 106, 132, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 109, 118, 157, 132, LBLX, MBASE(2)); @@ -2409,7 +2409,7 @@ void HMI_Prepare() { void Draw_Temperature_Menu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 236, 2, 263, 13); // "Temperature" #if HAS_HOTEND DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(TEMP_CASE_TEMP)); @@ -2508,7 +2508,7 @@ void HMI_Control() { Draw_More_Icon(CONTROL_CASE_MOVE + MROWS - index_control); // Motion > if (index_control > MROWS) { Draw_More_Icon(CONTROL_CASE_INFO + MROWS - index_control); // Info > - if (HMI_flag.language_chinese) + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, MBASE(CONTROL_CASE_INFO - 1)); else DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, MBASE(CONTROL_CASE_INFO - 1)); @@ -2718,7 +2718,7 @@ void HMI_Temperature() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 59, 16, 139, 29); // "PLA Settings" DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_TEMP)); DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp @@ -2792,7 +2792,7 @@ void HMI_Temperature() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 142, 16, 223, 29); // "ABS Settings" DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_TEMP)); @@ -2872,7 +2872,7 @@ void HMI_Temperature() { inline void Draw_Max_Speed_Menu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Max Speed (mm/s)" auto say_max_speed = [](const uint16_t row) { @@ -2934,7 +2934,7 @@ inline void Draw_Max_Speed_Menu() { inline void Draw_Max_Accel_Menu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Acceleration" DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(1)); @@ -2985,7 +2985,7 @@ inline void Draw_Max_Accel_Menu() { inline void Draw_Max_Jerk_Menu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk" DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1)); @@ -3055,7 +3055,7 @@ inline void Draw_Max_Jerk_Menu() { inline void Draw_Steps_Menu() { Clear_Main_Window(); - if (HMI_flag.language_chinese) { + if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Steps per mm" DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(1)); @@ -3528,7 +3528,7 @@ void EachMomentUpdate() { // show print done confirm DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 250, DWIN_WIDTH - 1, STATUS_Y); - DWIN_ICON_Show(ICON, HMI_flag.language_chinese ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); + DWIN_ICON_Show(ICON, HMI_IsChinese() ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); } else if (HMI_flag.pause_flag != printingIsPaused()) { // print status update diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 1b2cb273e3..5bff2e9f78 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -252,8 +252,11 @@ typedef struct { char show_mode = 0; // -1: Temperature control 0: Printing temperature } HMI_value_t; +#define DWIN_CHINESE 123 +#define DWIN_ENGLISH 0 + typedef struct { - bool language_chinese; // 0: EN, 1: CN + uint8_t language; bool pause_flag:1; bool pause_action:1; bool print_finish:1; @@ -271,10 +274,10 @@ typedef struct { AxisEnum feedspeed_axis; #endif AxisEnum acc_axis, jerk_axis, step_axis; -} HMI_Flag; +} HMI_Flag_t; extern HMI_value_t HMI_ValueStruct; -extern HMI_Flag HMI_flag; +extern HMI_Flag_t HMI_flag; // Show ICO void ICON_Print(bool show); From 3453d2d17a4744bd5a06be682baee993f3d996e2 Mon Sep 17 00:00:00 2001 From: Pavel Melnikov Date: Mon, 28 Sep 2020 16:55:46 +0700 Subject: [PATCH 0315/1370] Change "Fr" on LCD to ">>" (#18830) --- .../lcd/dogm/fontdata/fontdata_ISO10646_1.h | 486 +++++++++--------- Marlin/src/lcd/dogm/fontdata/langdata_ru.h | 57 +- Marlin/src/lcd/dogm/fontdata/langdata_uk.h | 106 ++-- Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h | 29 ++ buildroot/share/fonts/marlin-6x12-3.bdf | 17 +- 5 files changed, 355 insertions(+), 340 deletions(-) diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h index 451383045b..276cae522a 100644 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h @@ -25,97 +25,97 @@ Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h=10 x= 5 y= 5 dx= 6 dy= 0 ascent= 8 len=10 + Calculated Max Values w= 7 h=10 x= 5 y= 5 dx= 7 dy= 0 ascent= 8 len=10 Font Bounding box w=12 h=15 x= 0 y=-2 Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 Pure Font ascent = 7 descent=-2 X Font ascent = 8 descent=-2 Max Font ascent = 8 descent=-2 */ -const u8g_fntpgm_uint8_t ISO10646_1_5x7[1325] U8G_FONT_SECTION("ISO10646_1_5x7") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0x7f,0xfe,0x08,0xfe,0x08, +const u8g_fntpgm_uint8_t ISO10646_1_5x7[1324] U8G_FONT_SECTION("ISO10646_1_5x7") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x25,0x03,0xbb,0x01,0x7f,0xfe,0x08,0xfe,0x08, 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, - 0xb8,0x88,0x88,0x70,0x20,0x05,0x06,0x06,0x06,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a, - 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8, - 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70, - 0x03,0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, - 0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, - 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00, - 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8, - 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20, - 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68, - 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20, - 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40, - 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70, - 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02, - 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02, - 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, - 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88, - 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, - 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, - 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0, - 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05, - 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00, - 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8, - 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0, - 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00, - 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, - 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, - 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0, - 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, - 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88, - 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, - 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8, - 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, - 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, - 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0, - 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, - 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01, - 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, - 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05, - 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0, - 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, - 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, - 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, - 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, - 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40, - 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40, - 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff}; + 0xb8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xd8,0x6c,0x36,0x6c,0xd8, + 0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8,0x05, + 0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70,0x03, + 0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, + 0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00, + 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00,0x00, + 0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0, + 0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20,0x40, + 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x01, + 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40, + 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40, + 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70,0x20, + 0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02,0x03, + 0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02,0x02, + 0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20, + 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70, + 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50, + 0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0,0xc0, + 0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05,0x06, + 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00,0xf8, + 0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, + 0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0, + 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07,0x07, + 0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0, + 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88, + 0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xa8, + 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88, + 0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, + 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8,0x50, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20, + 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00, + 0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88, + 0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,0x00, + 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xe0, + 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07,0x07, + 0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01,0xfe, + 0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80, + 0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40,0x40, + 0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05,0x05, + 0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70, + 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78, + 0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,0x06, + 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xa8, + 0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07, + 0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40,0x80, + 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40,0x40, + 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff}; #else // extended (original) font (symbols 1 - 255) @@ -123,179 +123,179 @@ const u8g_fntpgm_uint8_t ISO10646_1_5x7[1325] U8G_FONT_SECTION("ISO10646_1_5x7") Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 6 h=10 x= 5 y= 7 dx= 6 dy= 0 ascent=10 len=10 + Calculated Max Values w= 7 h=10 x= 5 y= 7 dx= 7 dy= 0 ascent=10 len=10 Font Bounding box w=12 h=15 x= 0 y=-2 Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 Pure Font ascent = 7 descent=-2 X Font ascent = 8 descent=-2 Max Font ascent =10 descent=-2 */ -const u8g_fntpgm_uint8_t ISO10646_1_5x7[2648] U8G_FONT_SECTION("ISO10646_1_5x7") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0xff,0xfe,0x0a,0xfe,0x08, +const u8g_fntpgm_uint8_t ISO10646_1_5x7[2647] U8G_FONT_SECTION("ISO10646_1_5x7") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x25,0x03,0xbb,0x01,0xff,0xfe,0x0a,0xfe,0x08, 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, - 0xb8,0x88,0x88,0x70,0x20,0x05,0x06,0x06,0x06,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a, - 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8, - 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70, - 0x03,0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, - 0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, - 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00, - 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8, - 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20, - 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68, - 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20, - 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40, - 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70, - 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02, - 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02, - 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, - 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88, - 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, - 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, - 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0, - 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05, - 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00, - 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8, - 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0, - 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00, - 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, - 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, - 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0, - 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, - 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88, - 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, - 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8, - 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, - 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, - 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0, - 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, - 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01, - 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, - 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05, - 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0, - 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, - 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, - 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, - 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, - 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40, - 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40, - 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff,0xff,0xff,0xff, + 0xb8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xd8,0x6c,0x36,0x6c,0xd8, + 0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8,0x05, + 0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70,0x03, + 0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, + 0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00, + 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00,0x00, + 0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0, + 0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20,0x40, + 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x01, + 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40, + 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40, + 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70,0x20, + 0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02,0x03, + 0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02,0x02, + 0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20, + 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70, + 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50, + 0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0,0xc0, + 0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05,0x06, + 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00,0xf8, + 0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, + 0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0, + 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07,0x07, + 0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0, + 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88, + 0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xa8, + 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88, + 0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, + 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8,0x50, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20, + 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00, + 0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88, + 0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,0x00, + 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xe0, + 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07,0x07, + 0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01,0xfe, + 0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80, + 0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40,0x40, + 0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05,0x05, + 0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70, + 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78, + 0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,0x06, + 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xa8, + 0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07, + 0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40,0x80, + 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40,0x40, + 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, - 0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80, - 0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20,0x05,0x07,0x07, - 0x06,0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05,0x06,0x00,0x00, - 0xa8,0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xf8,0x20,0xf8, - 0x20,0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04, - 0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0,0x03,0x01,0x01, - 0x06,0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,0xb4,0x84, - 0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05,0x05,0x05,0x06, - 0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x08,0x08, - 0x03,0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4, - 0xa4,0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04,0x04,0x06,0x01, - 0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, - 0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xa0,0x20,0x40,0xe0,0x03,0x05,0x05, - 0x06,0x01,0x04,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40, - 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x08, - 0x08,0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06, - 0x02,0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03,0x05,0x05,0x06, - 0x01,0x04,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x40, - 0x00,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x0a,0x0a, - 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10,0x05,0x0a,0x0a, - 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38,0x05,0x0a,0x0a, - 0x06,0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10,0x05,0x07,0x07, - 0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00, - 0x40,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, - 0x10,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, - 0x20,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, - 0x68,0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00, - 0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, - 0x50,0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78, - 0xa0,0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x80, - 0x80,0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80, - 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80, - 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0xf8,0x80, - 0x80,0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00,0xe0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xe0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00,0xe0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40, - 0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8,0x48,0x48,0x70, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xff, - 0x08,0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, - 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, - 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, - 0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x06, + 0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x05, + 0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05,0x06,0x00,0x00,0xa8, + 0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xf8,0x20,0xf8,0x20, + 0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04,0x08, + 0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0,0x03,0x01,0x01,0x06, + 0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,0xb4,0x84,0x78, + 0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05,0x05,0x05,0x06,0x00, + 0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x08,0x08,0x03, + 0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4, + 0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04,0x04,0x06,0x01,0x05, + 0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00, + 0xf8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xa0,0x20,0x40,0xe0,0x03,0x05,0x05,0x06, + 0x01,0x04,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40,0x80, + 0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x08,0x08, + 0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06,0x02, + 0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03,0x05,0x05,0x06,0x01, + 0x04,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x40,0x00, + 0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10,0x05,0x07,0x07,0x06, + 0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, + 0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, + 0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, + 0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x68, + 0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x50, + 0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50, + 0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0xa0, + 0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x80,0x80, + 0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80,0xf0, + 0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00,0xe0,0x40,0x40,0x40, + 0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xe0,0x40,0x40,0x40, + 0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00,0xe0,0x40,0x40,0x40, + 0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40,0x40, + 0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8,0x48,0x48,0x70,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x05, + 0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xff,0x08, + 0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20, 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20, - 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xe0, - 0x90,0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xa0,0x90, - 0x88,0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78, - 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08, - 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06, - 0x00,0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, - 0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20, - 0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xa0,0x78, - 0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08, - 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00, - 0x00,0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20, - 0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70, - 0x88,0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40, - 0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0, - 0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,0x07, - 0x07,0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09,0x09,0x06,0x00, - 0x00,0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00, - 0x68,0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20, - 0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70, - 0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88, - 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98, - 0xa8,0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05, - 0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe, - 0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xfe, - 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x50, - 0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80}; + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50, + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00, + 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00, + 0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xe0,0x90, + 0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xa0,0x90,0x88, + 0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08, + 0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00, + 0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x50, + 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x70, + 0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xa0,0x78,0x05, + 0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08,0x06, + 0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00, + 0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50, + 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88, + 0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40,0x40, + 0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03, + 0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,0x07,0x07, + 0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09,0x09,0x06,0x00,0x00, + 0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68, + 0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88, + 0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98,0xa8, + 0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x70, + 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x08, + 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x10, + 0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x80, + 0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x50,0x00, + 0x88,0x88,0x88,0x50,0x20,0x40,0x80}; #endif diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ru.h b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h index cd0efda12f..87e3d422a5 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_ru.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h @@ -5,8 +5,8 @@ */ #include -const u8g_fntpgm_uint8_t fontpage_8_144_152[135] U8G_FONT_SECTION("fontpage_8_144_152") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x98,0x00,0x07,0xff,0x00, +const u8g_fntpgm_uint8_t fontpage_8_144_168[348] U8G_FONT_SECTION("fontpage_8_144_168") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0xa8,0x00,0x0a,0xfe,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, @@ -14,29 +14,27 @@ const u8g_fntpgm_uint8_t fontpage_8_144_152[135] U8G_FONT_SECTION("fontpage_8_14 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, 0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x70,0xa8,0xa8,0x05,0x07,0x07, 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_8_154_168[214] U8G_FONT_SECTION("fontpage_8_154_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0xa8,0x00,0x07,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, - 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, - 0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, - 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09, - 0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x07,0x07,0x06, - 0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xa8, - 0xa8,0xa8,0xa8,0xa8,0xa8,0xf8}; + 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88,0x70,0x00, + 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0, + 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88, + 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, + 0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, + 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8, + 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05, + 0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8}; const u8g_fntpgm_uint8_t fontpage_8_171_173[56] U8G_FONT_SECTION("fontpage_8_171_173") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xad,0x00,0x07,0x00,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xc8,0xa8,0xa8,0xc8,0x04,0x07, 0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0,0x05,0x07,0x07,0x06,0x00, 0x00,0x70,0x88,0x08,0x78,0x08,0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc9,0x00,0x08,0xfe,0x00, +const u8g_fntpgm_uint8_t fontpage_8_175_207[400] U8G_FONT_SECTION("fontpage_8_175_207") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xcf,0x00,0x08,0xfe,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, @@ -56,23 +54,20 @@ const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_17 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, 0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, - 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08}; -const u8g_fntpgm_uint8_t fontpage_8_203_207[72] U8G_FONT_SECTION("fontpage_8_203_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcf,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06, - 0x01,0x00,0x80,0x80,0xe0,0x90,0xe0,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70, - 0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05, - 0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90}; + 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0xe0,0x04, + 0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70,0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00, + 0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90 + }; const u8g_fntpgm_uint8_t fontpage_8_209_209[30] U8G_FONT_SECTION("fontpage_8_209_209") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x07,0x00,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xf0,0x80,0x70}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(8, 144, 152, fontpage_8_144_152), // 'Ð' -- 'И' - FONTDATA_ITEM(8, 154, 168, fontpage_8_154_168), // 'К' -- 'Ш' + FONTDATA_ITEM(8, 144, 168, fontpage_8_144_168), // 'Ð' -- 'Ш' FONTDATA_ITEM(8, 171, 173, fontpage_8_171_173), // 'Ы' -- 'Э' - FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ' - FONTDATA_ITEM(8, 203, 207, fontpage_8_203_207), // 'Ñ‹' -- 'Ñ' + FONTDATA_ITEM(8, 175, 207, fontpage_8_175_207), // 'Я' -- 'Ñ' FONTDATA_ITEM(8, 209, 209, fontpage_8_209_209), // 'Ñ‘' -- 'Ñ‘' }; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h index 5d34d1b994..e3800eb6bb 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h @@ -8,60 +8,55 @@ const u8g_fntpgm_uint8_t fontpage_8_134_134[30] U8G_FONT_SECTION("fontpage_8_134_134") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00, 0x00,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0}; -const u8g_fntpgm_uint8_t fontpage_8_144_146[56] U8G_FONT_SECTION("fontpage_8_144_146") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x92,0x00,0x07,0x00,0x00, +const u8g_fntpgm_uint8_t fontpage_8_144_169[363] U8G_FONT_SECTION("fontpage_8_144_169") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0xa9,0x00,0x0a,0xfe,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0}; -const u8g_fntpgm_uint8_t fontpage_8_148_149[44] U8G_FONT_SECTION("fontpage_8_148_149") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x94,0x95,0x00,0x07,0xff,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50,0x50,0xf8,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8}; -const u8g_fntpgm_uint8_t fontpage_8_151_154[72] U8G_FONT_SECTION("fontpage_8_151_154") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x9a,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00, - 0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88}; -const u8g_fntpgm_uint8_t fontpage_8_156_164[134] U8G_FONT_SECTION("fontpage_8_156_164") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0xa4,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50, + 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, + 0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x70,0xa8,0xa8,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88,0x70,0x00, + 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0, + 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88, 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80, 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05, 0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, - 0x70,0xa8,0xa8,0xa8,0x70,0x20}; -const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0xfe,0x00, - 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08 - }; -const u8g_fntpgm_uint8_t fontpage_8_168_168[30] U8G_FONT_SECTION("fontpage_8_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8}; -const u8g_fntpgm_uint8_t fontpage_8_176_201[321] U8G_FONT_SECTION("fontpage_8_176_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xc9,0x00,0x08,0xfe,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0, - 0x88,0xf0,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05, - 0x06,0x06,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70, - 0xa8,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x00,0x88,0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00, - 0x88,0x98,0xa8,0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90, - 0x05,0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0xd8,0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88, - 0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88, - 0x88,0xf0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05, - 0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe, - 0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70, - 0xa8,0xa8,0xa8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50, - 0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05, - 0x05,0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8, - 0xa8,0xa8,0xa8,0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08, - 0x08}; + 0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, + 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8, + 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05, + 0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8,0x05,0x09,0x09,0x06, + 0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08}; +const u8g_fntpgm_uint8_t fontpage_8_172_172[30] U8G_FONT_SECTION("fontpage_8_172_172") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x07,0x00,0x00, + 0x00,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0}; +const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc9,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, + 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8, + 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8, + 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8,0xa8,0xa8, + 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, + 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08}; const u8g_fntpgm_uint8_t fontpage_8_204_204[28] U8G_FONT_SECTION("fontpage_8_204_204") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x05,0x00,0x00, 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0xe0}; @@ -72,22 +67,19 @@ const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206 const u8g_fntpgm_uint8_t fontpage_8_212_212[28] U8G_FONT_SECTION("fontpage_8_212_212") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x05,0x00,0x00, 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x80,0xe0,0x80,0x70}; -const u8g_fntpgm_uint8_t fontpage_8_214_214[29] U8G_FONT_SECTION("fontpage_8_214_214") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x06,0x00,0x00, - 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0}; +const u8g_fntpgm_uint8_t fontpage_8_214_215[41] U8G_FONT_SECTION("fontpage_8_214_215") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd7,0x00,0x06,0x00,0x00, + 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x06,0x06, + 0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0xe0}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(8, 134, 134, fontpage_8_134_134), // 'І' -- 'І' - FONTDATA_ITEM(8, 144, 146, fontpage_8_144_146), // 'Ð' -- 'Ð’' - FONTDATA_ITEM(8, 148, 149, fontpage_8_148_149), // 'Д' -- 'Е' - FONTDATA_ITEM(8, 151, 154, fontpage_8_151_154), // 'З' -- 'К' - FONTDATA_ITEM(8, 156, 164, fontpage_8_156_164), // 'Ðœ' -- 'Ф' - FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц' - FONTDATA_ITEM(8, 168, 168, fontpage_8_168_168), // 'Ш' -- 'Ш' - FONTDATA_ITEM(8, 176, 201, fontpage_8_176_201), // 'а' -- 'щ' + FONTDATA_ITEM(8, 144, 169, fontpage_8_144_169), // 'Ð' -- 'Щ' + FONTDATA_ITEM(8, 172, 172, fontpage_8_172_172), // 'Ь' -- 'Ь' + FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ' FONTDATA_ITEM(8, 204, 204, fontpage_8_204_204), // 'ÑŒ' -- 'ÑŒ' FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ÑŽ' -- 'Ñ' FONTDATA_ITEM(8, 212, 212, fontpage_8_212_212), // 'Ñ”' -- 'Ñ”' - FONTDATA_ITEM(8, 214, 214, fontpage_8_214_214), // 'Ñ–' -- 'Ñ–' + FONTDATA_ITEM(8, 214, 215, fontpage_8_214_215), // 'Ñ–' -- 'Ñ—' }; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h index de697cbef4..af39ce5c48 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h @@ -5,6 +5,9 @@ */ #include +const u8g_fntpgm_uint8_t fontpage_64_157_157[26] U8G_FONT_SECTION("fontpage_64_157_157") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x07,0x00,0x00, + 0x00,0x05,0x03,0x03,0x06,0x00,0x04,0xd8,0x48,0x90}; const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; @@ -381,6 +384,10 @@ const u8g_fntpgm_uint8_t fontpage_172_232_232[45] U8G_FONT_SECTION("fontpage_172 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7b,0xc0,0x04, 0x80,0xff,0xe0,0x11,0x00,0xfb,0xe0,0x4a,0x40,0x4a,0x40,0x7b,0xc0}; +const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, + 0x40,0xa7,0xc0,0xe4,0x40,0x07,0xc0,0x04,0x40,0x07,0xc0,0x0c,0x60}; const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, @@ -941,6 +948,10 @@ const u8g_fntpgm_uint8_t fontpage_221_209_209[45] U8G_FONT_SECTION("fontpage_221 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x07,0x40,0x85,0x40,0x5f, 0xe0,0x34,0x60,0x27,0xc0,0xc4,0x40,0x47,0xc0,0x44,0x40,0x44,0xc0}; +const u8g_fntpgm_uint8_t fontpage_222_143_143[45] U8G_FONT_SECTION("fontpage_222_143_143") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x20,0x0f,0xe0,0x98,0x00,0x5f, + 0xe0,0x29,0x00,0x2f,0xe0,0xcd,0xa0,0x4b,0x60,0x5d,0xa0,0x49,0x60}; const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53, @@ -1145,6 +1156,10 @@ const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, 0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82, 0xfe,0x82}; +const u8g_fntpgm_uint8_t fontpage_259_243_243[45] U8G_FONT_SECTION("fontpage_259_243_243") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x08,0x00,0x11,0x00,0x20,0x80,0x7f, + 0xc0,0x04,0x00,0x04,0x00,0x3f,0x80,0x04,0x00,0x04,0x00,0xff,0xe0}; const u8g_fntpgm_uint8_t fontpage_263_220_220[45] U8G_FONT_SECTION("fontpage_263_220_220") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x01,0xc0,0x7e, @@ -1257,6 +1272,10 @@ const u8g_fntpgm_uint8_t fontpage_287_185_185[45] U8G_FONT_SECTION("fontpage_287 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x2f,0xe0,0x01,0x20,0xe1, 0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0xc0,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_193_193[45] U8G_FONT_SECTION("fontpage_287_193_193") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x21,0x00,0x01,0x00,0xef, + 0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x50,0x00,0x8f,0xe0}; const u8g_fntpgm_uint8_t fontpage_287_208_209[73] U8G_FONT_SECTION("fontpage_287_208_209") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x20,0x00,0x20,0x00,0x0f,0xe0,0xe2, @@ -1355,6 +1374,10 @@ const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6, 0x60,0x91,0x00,0x97,0xe0,0xd5,0x00,0xaf,0xe0,0x81,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_300_208_208[45] U8G_FONT_SECTION("fontpage_300_208_208") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf7,0xc0,0x94,0x40,0xa7,0xc0,0xc4,0x40,0xa7, + 0xc0,0x95,0x00,0x95,0x20,0xd5,0x40,0xa4,0x80,0x85,0x40,0x86,0x20}; const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1, @@ -1445,6 +1468,7 @@ const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510 #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(64, 157, 157, fontpage_64_157_157), // 'â€' -- 'â€' FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' @@ -1533,6 +1557,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(171, 183, 183, fontpage_171_183_183), // 'å–·' -- 'å–·' FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' FONTDATA_ITEM(172, 232, 232, fontpage_172_232_232), // '器' -- '器' + FONTDATA_ITEM(172, 244, 244, fontpage_172_244_244), // 'å™´' -- 'å™´' FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // 'å› ' -- 'å› ' FONTDATA_ITEM(173, 250, 250, fontpage_173_250_250), // '固' -- '固' @@ -1671,6 +1696,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // 'æº' -- 'æº' FONTDATA_ITEM(221, 162, 162, fontpage_221_162_162), // '溢' -- '溢' FONTDATA_ITEM(221, 209, 209, fontpage_221_209_209), // '滑' -- '滑' + FONTDATA_ITEM(222, 143, 143, fontpage_222_143_143), // 'æ¼' -- 'æ¼' FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // 'æ¿€' -- 'æ¿€' FONTDATA_ITEM(224, 239, 239, fontpage_224_239_239), // 'ç¯' -- 'ç¯' FONTDATA_ITEM(225, 185, 185, fontpage_225_185_185), // '点' -- '点' @@ -1722,6 +1748,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(256, 234, 234, fontpage_256_234_234), // 'èª' -- 'èª' FONTDATA_ITEM(257, 253, 253, fontpage_257_253_253), // '能' -- '能' FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' + FONTDATA_ITEM(259, 243, 243, fontpage_259_243_243), // '至' -- '至' FONTDATA_ITEM(263, 220, 220, fontpage_263_220_220), // 'èœ' -- 'èœ' FONTDATA_ITEM(265, 221, 221, fontpage_265_221_221), // 'è“' -- 'è“' FONTDATA_ITEM(269, 199, 199, fontpage_269_199_199), // '蛇' -- '蛇' @@ -1750,6 +1777,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(287, 145, 145, fontpage_287_145_145), // '辑' -- '辑' FONTDATA_ITEM(287, 147, 147, fontpage_287_147_147), // '输' -- '输' FONTDATA_ITEM(287, 185, 185, fontpage_287_185_185), // 'è¾¹' -- 'è¾¹' + FONTDATA_ITEM(287, 193, 193, fontpage_287_193_193), // 'è¿' -- 'è¿' FONTDATA_ITEM(287, 208, 209, fontpage_287_208_209), // 'è¿' -- 'è¿‘' FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // 'è¿”' -- 'è¿”' FONTDATA_ITEM(287, 216, 216, fontpage_287_216_216), // '还' -- '还' @@ -1774,6 +1802,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(299, 244, 244, fontpage_299_244_244), // 'é—´' -- 'é—´' FONTDATA_ITEM(300, 136, 136, fontpage_300_136_136), // '阈' -- '阈' FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // 'é™' -- 'é™' + FONTDATA_ITEM(300, 208, 208, fontpage_300_208_208), // 'é™' -- 'é™' FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' FONTDATA_ITEM(300, 233, 233, fontpage_300_233_233), // '险' -- '险' FONTDATA_ITEM(301, 246, 246, fontpage_301_246_246), // '零' -- '零' diff --git a/buildroot/share/fonts/marlin-6x12-3.bdf b/buildroot/share/fonts/marlin-6x12-3.bdf index ef90656eba..bc7a8827c0 100644 --- a/buildroot/share/fonts/marlin-6x12-3.bdf +++ b/buildroot/share/fonts/marlin-6x12-3.bdf @@ -106,16 +106,15 @@ B8 ENDCHAR STARTCHAR uni0006 ENCODING 6 -SWIDTH 545 0 -DWIDTH 6 0 -BBX 5 6 0 1 +SWIDTH 504 0 +DWIDTH 7 0 +BBX 8 5 0 1 BITMAP -E0 -8C -EA -8C -8A -0A +D8 +6C +36 +6C +D8 ENDCHAR STARTCHAR uni0007 ENCODING 7 From 04a712daccbda49bc528e3418c6d16d5a13d6d51 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Mon, 28 Sep 2020 21:53:50 +0200 Subject: [PATCH 0316/1370] Multi-line comments cleanup (#19535) --- Marlin/Configuration.h | 5 ----- Marlin/Configuration_adv.h | 3 --- Marlin/src/HAL/AVR/HAL.h | 1 + Marlin/src/HAL/AVR/Servo.cpp | 1 - Marlin/src/HAL/AVR/timers.h | 1 + Marlin/src/HAL/DUE/HAL_SPI.cpp | 1 - Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp | 1 - Marlin/src/HAL/DUE/eeprom_flash.cpp | 1 - Marlin/src/HAL/DUE/pinsDebug.h | 1 - Marlin/src/HAL/ESP32/HAL.h | 1 + Marlin/src/HAL/ESP32/ota.h | 1 + Marlin/src/HAL/LINUX/include/serial.h | 1 - Marlin/src/HAL/LINUX/servo_private.h | 1 - Marlin/src/HAL/LPC1768/Servo.h | 1 - Marlin/src/HAL/LPC1768/timers.h | 1 - Marlin/src/HAL/SAMD51/QSPIFlash.h | 1 - Marlin/src/HAL/SAMD51/pinsDebug.h | 1 - Marlin/src/HAL/STM32F1/onboard_sd.cpp | 1 - Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp | 2 -- Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h | 1 - Marlin/src/HAL/TEENSY35_36/timers.h | 1 + Marlin/src/HAL/TEENSY40_41/timers.h | 1 + Marlin/src/HAL/shared/servo.cpp | 1 - Marlin/src/HAL/shared/servo.h | 1 - Marlin/src/core/language.h | 1 - Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp | 2 -- Marlin/src/feature/encoder_i2c.cpp | 4 ---- Marlin/src/feature/mmu2/mmu2.cpp | 4 ---- Marlin/src/feature/twibus.h | 1 - Marlin/src/gcode/bedlevel/abl/G29.cpp | 1 - Marlin/src/gcode/bedlevel/mbl/G29.cpp | 1 - Marlin/src/gcode/calibrate/G28.cpp | 1 - Marlin/src/gcode/control/M999.cpp | 1 - Marlin/src/gcode/feature/L6470/M906.cpp | 2 -- Marlin/src/gcode/feature/L6470/M916-918.cpp | 6 ------ Marlin/src/gcode/feature/i2c/M260_M261.cpp | 1 - Marlin/src/gcode/feature/pause/M603.cpp | 1 - Marlin/src/gcode/gcode.h | 1 - Marlin/src/gcode/sd/M32.cpp | 1 - Marlin/src/inc/Conditionals_LCD.h | 1 - Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp | 1 - Marlin/src/lcd/dogm/status_screen_lite_ST7920.h | 1 - .../lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp | 1 - Marlin/src/lcd/dwin/e3v2/dwin.cpp | 1 - .../lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp | 1 - .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h | 1 - .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp | 1 - .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h | 1 - Marlin/src/lcd/extui/ui_api.h | 1 - Marlin/src/lcd/language/language_an.h | 1 - Marlin/src/lcd/language/language_bg.h | 1 - Marlin/src/lcd/language/language_ca.h | 1 - Marlin/src/lcd/language/language_cz.h | 1 - Marlin/src/lcd/language/language_da.h | 1 - Marlin/src/lcd/language/language_de.h | 1 - Marlin/src/lcd/language/language_el.h | 1 - Marlin/src/lcd/language/language_el_gr.h | 1 - Marlin/src/lcd/language/language_en.h | 1 - Marlin/src/lcd/language/language_es.h | 1 - Marlin/src/lcd/language/language_eu.h | 1 - Marlin/src/lcd/language/language_fi.h | 1 - Marlin/src/lcd/language/language_fr.h | 1 - Marlin/src/lcd/language/language_gl.h | 1 - Marlin/src/lcd/language/language_hr.h | 1 - Marlin/src/lcd/language/language_hu.h | 1 - Marlin/src/lcd/language/language_it.h | 1 - Marlin/src/lcd/language/language_jp_kana.h | 1 - Marlin/src/lcd/language/language_ko_KR.h | 1 - Marlin/src/lcd/language/language_nl.h | 1 - Marlin/src/lcd/language/language_pl.h | 1 - Marlin/src/lcd/language/language_pt.h | 1 - Marlin/src/lcd/language/language_pt_br.h | 1 - Marlin/src/lcd/language/language_ru.h | 1 - Marlin/src/lcd/language/language_sk.h | 1 - Marlin/src/lcd/language/language_test.h | 1 - Marlin/src/lcd/language/language_tr.h | 1 - Marlin/src/lcd/language/language_uk.h | 1 - Marlin/src/lcd/language/language_vi.h | 1 - Marlin/src/lcd/language/language_zh_CN.h | 1 - Marlin/src/lcd/language/language_zh_TW.h | 1 - Marlin/src/lcd/menu/menu_filament.cpp | 2 -- Marlin/src/libs/least_squares_fit.cpp | 1 - Marlin/src/libs/least_squares_fit.h | 1 - Marlin/src/module/planner.cpp | 2 -- Marlin/src/module/planner_bezier.cpp | 1 - Marlin/src/module/planner_bezier.h | 1 - Marlin/src/module/probe.cpp | 1 - Marlin/src/module/settings.cpp | 1 - Marlin/src/module/thermistor/thermistor_30.h | 6 +++--- Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 1 - Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 1 - Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 -- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 1 - Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 2 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN.h | 1 - Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 1 - Marlin/src/pins/mega/pins_INTAMSYS40.h | 1 - Marlin/src/pins/mega/pins_MINITRONICS.h | 1 - Marlin/src/pins/pinsDebug.h | 1 - Marlin/src/pins/ramps/pins_RAMPS_13.h | 1 - Marlin/src/pins/ramps/pins_RAMPS_PLUS.h | 1 - Marlin/src/pins/sam/pins_ADSK.h | 1 - Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 1 - Marlin/src/pins/sanguino/pins_ANET_10.h | 3 --- Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h | 2 -- Marlin/src/pins/sanguino/pins_GEN3_PLUS.h | 2 -- Marlin/src/pins/sanguino/pins_GEN6.h | 2 -- Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h | 2 -- Marlin/src/pins/sanguino/pins_GEN7_12.h | 2 -- Marlin/src/pins/sanguino/pins_GEN7_13.h | 2 -- Marlin/src/pins/sanguino/pins_GEN7_14.h | 2 -- Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h | 2 -- Marlin/src/pins/sanguino/pins_OMCA.h | 2 -- Marlin/src/pins/sanguino/pins_OMCA_A.h | 3 --- Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h | 2 -- Marlin/src/pins/sanguino/pins_SETHI.h | 1 - Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 1 - Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 -- Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 1 - Marlin/src/pins/teensy2/pins_TEENSYLU.h | 1 - Marlin/src/sd/SdBaseFile.cpp | 2 -- Marlin/src/sd/SdFatStructs.h | 2 -- Marlin/src/sd/SdFile.cpp | 1 - Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp | 1 - Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp | 2 -- .../UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h | 5 ----- .../sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h | 2 -- .../src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h | 3 --- .../src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h | 1 - Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h | 2 -- 131 files changed, 11 insertions(+), 176 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 7fb3482afe..dec1a81bee 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -34,7 +34,6 @@ * - Extra features * * Advanced settings can be found in Configuration_adv.h - * */ #define CONFIGURATION_H_VERSION 020007 @@ -855,7 +854,6 @@ * - For simple switches connect... * - normally-closed switches to GND and D32. * - normally-open switches to 5V and D32. - * */ //#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default @@ -1567,7 +1565,6 @@ * * Caveats: The ending Z should be the same as starting Z. * Attention: EXPERIMENTAL. G-code arguments may change. - * */ //#define NOZZLE_CLEAN_FEATURE @@ -1720,7 +1717,6 @@ * * SD Card support is disabled by default. If your controller has an SD slot, * you must uncomment the following option or it won't work. - * */ //#define SDSUPPORT @@ -2343,7 +2339,6 @@ * *** CAUTION *** * * LED Type. Enable only one of the following two options. - * */ //#define RGB_LED //#define RGBW_LED diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7d2d78e9dd..a7b6245c2b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -29,7 +29,6 @@ * Some of these settings can damage your printer if improperly set! * * Basic settings can be found in Configuration.h - * */ #define CONFIGURATION_ADV_H_VERSION 020007 @@ -738,7 +737,6 @@ * | 4 3 | 1 4 | 2 1 | 3 2 | * | | | | | * | 1 2 | 2 3 | 3 4 | 4 1 | - * */ #ifndef Z_STEPPER_ALIGN_XY //#define Z_STEPPERS_ORIENTATION 0 @@ -1954,7 +1952,6 @@ * Be sure to turn off auto-retract during filament change. * * Note that M207 / M208 / M209 settings are saved to EEPROM. - * */ //#define FWRETRACT #if ENABLED(FWRETRACT) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 41f1acd32f..b606d0c231 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -15,6 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ #pragma once diff --git a/Marlin/src/HAL/AVR/Servo.cpp b/Marlin/src/HAL/AVR/Servo.cpp index 66ed993c6f..526352b773 100644 --- a/Marlin/src/HAL/AVR/Servo.cpp +++ b/Marlin/src/HAL/AVR/Servo.cpp @@ -48,7 +48,6 @@ * readMicroseconds() - Get the last-written servo pulse width in microseconds. * attached() - Return true if a servo is attached. * detach() - Stop an attached servo from pulsing its i/o pin. - * */ #ifdef __AVR__ diff --git a/Marlin/src/HAL/AVR/timers.h b/Marlin/src/HAL/AVR/timers.h index 6c40d32209..82eb8b14b1 100644 --- a/Marlin/src/HAL/AVR/timers.h +++ b/Marlin/src/HAL/AVR/timers.h @@ -15,6 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ #pragma once diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 97d69f0d72..54ae8eceb1 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -759,7 +759,6 @@ * * All of the above can be avoided by defining FORCE_SOFT_SPI to force the * display to use software SPI. - * */ void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified) diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp index 3e7f619997..be4b49c0f9 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -52,7 +52,6 @@ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * */ #ifdef __SAM3X8E__ diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index d98f06039f..67f1f9e40f 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -53,7 +53,6 @@ * per page. We can't emulate EE endurance with FLASH for all * bytes, but we can emulate endurance for a given percent of * bytes. - * */ //#define EE_EMU_DEBUG diff --git a/Marlin/src/HAL/DUE/pinsDebug.h b/Marlin/src/HAL/DUE/pinsDebug.h index 28687ff267..a99ca8ecce 100644 --- a/Marlin/src/HAL/DUE/pinsDebug.h +++ b/Marlin/src/HAL/DUE/pinsDebug.h @@ -179,5 +179,4 @@ void pwm_details(int32_t pin) { * ----------------+-------- * ID | PB11 * VBOF | PB10 - * */ diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 5eb84fdc30..f6fa46dd93 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -15,6 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/ota.h b/Marlin/src/HAL/ESP32/ota.h index 7f9b237aa6..546ace82db 100644 --- a/Marlin/src/HAL/ESP32/ota.h +++ b/Marlin/src/HAL/ESP32/ota.h @@ -15,6 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h index 94e0c758ee..e916249389 100644 --- a/Marlin/src/HAL/LINUX/include/serial.h +++ b/Marlin/src/HAL/LINUX/include/serial.h @@ -33,7 +33,6 @@ * Generic RingBuffer * T type of the buffer array * S size of the buffer (must be power of 2) - * */ template class RingBuffer { public: diff --git a/Marlin/src/HAL/LINUX/servo_private.h b/Marlin/src/HAL/LINUX/servo_private.h index 122cfef3ea..bcc8d2037f 100644 --- a/Marlin/src/HAL/LINUX/servo_private.h +++ b/Marlin/src/HAL/LINUX/servo_private.h @@ -45,7 +45,6 @@ * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. * * The only modification was to update/delete macros to match the LPC176x. - * */ #include diff --git a/Marlin/src/HAL/LPC1768/Servo.h b/Marlin/src/HAL/LPC1768/Servo.h index e953cb9204..eb12fd20f4 100644 --- a/Marlin/src/HAL/LPC1768/Servo.h +++ b/Marlin/src/HAL/LPC1768/Servo.h @@ -46,7 +46,6 @@ * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. * * The only modification was to update/delete macros to match the LPC176x. - * */ #include diff --git a/Marlin/src/HAL/LPC1768/timers.h b/Marlin/src/HAL/LPC1768/timers.h index 23dc20e2eb..e6744fb005 100644 --- a/Marlin/src/HAL/LPC1768/timers.h +++ b/Marlin/src/HAL/LPC1768/timers.h @@ -21,7 +21,6 @@ #pragma once /** - * * HAL For LPC1768 */ diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.h b/Marlin/src/HAL/SAMD51/QSPIFlash.h index b6f22769ff..db4abec91c 100644 --- a/Marlin/src/HAL/SAMD51/QSPIFlash.h +++ b/Marlin/src/HAL/SAMD51/QSPIFlash.h @@ -24,7 +24,6 @@ * THE SOFTWARE. * * Derived from Adafruit_SPIFlash class with no SdFat references - * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/pinsDebug.h b/Marlin/src/HAL/SAMD51/pinsDebug.h index c28937d6c6..81376db79a 100644 --- a/Marlin/src/HAL/SAMD51/pinsDebug.h +++ b/Marlin/src/HAL/SAMD51/pinsDebug.h @@ -150,5 +150,4 @@ void pwm_details(int32_t pin) { * 93 | PA10 | QSPI: IO2 * 94 | PA11 | QSPI: IO3 * 95 | PB31 | SD: DETECT - * */ diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.cpp b/Marlin/src/HAL/STM32F1/onboard_sd.cpp index 0440db9438..da25271734 100644 --- a/Marlin/src/HAL/STM32F1/onboard_sd.cpp +++ b/Marlin/src/HAL/STM32F1/onboard_sd.cpp @@ -9,7 +9,6 @@ * No restriction on use. You can use, modify and redistribute it for * personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. * Redistributions of source code must retain the above copyright notice. - * */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp index 4d116f440b..df3d40f159 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp @@ -22,7 +22,6 @@ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. - * */ #if defined(STM32GENERIC) && defined(STM32F7) @@ -662,7 +661,6 @@ boolean TMC26XStepper::isEnabled() { return !!(chopper_config_register & T_OFF_P /** * reads a value from the TMC26X status register. The value is not obtained directly but can then * be read by the various status routines. - * */ void TMC26XStepper::readStatus(char read_value) { uint32_t old_driver_configuration_register_value = driver_configuration_register_value; diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h index f1d0133a3b..208c3bc7e0 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h @@ -22,7 +22,6 @@ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. - * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/timers.h b/Marlin/src/HAL/TEENSY35_36/timers.h index 68060d0e1c..ad6629f40d 100644 --- a/Marlin/src/HAL/TEENSY35_36/timers.h +++ b/Marlin/src/HAL/TEENSY35_36/timers.h @@ -16,6 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY40_41/timers.h b/Marlin/src/HAL/TEENSY40_41/timers.h index 9c4bf8c274..81891c366b 100644 --- a/Marlin/src/HAL/TEENSY40_41/timers.h +++ b/Marlin/src/HAL/TEENSY40_41/timers.h @@ -16,6 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ #pragma once diff --git a/Marlin/src/HAL/shared/servo.cpp b/Marlin/src/HAL/shared/servo.cpp index d69cf2fe2c..cfec6f3017 100644 --- a/Marlin/src/HAL/shared/servo.cpp +++ b/Marlin/src/HAL/shared/servo.cpp @@ -48,7 +48,6 @@ * readMicroseconds() - Get the last-written servo pulse width in microseconds. * attached() - Return true if a servo is attached. * detach() - Stop an attached servo from pulsing its i/o pin. - * */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h index ccaf1f0255..6d850da851 100644 --- a/Marlin/src/HAL/shared/servo.h +++ b/Marlin/src/HAL/shared/servo.h @@ -41,7 +41,6 @@ */ /** - * * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. * The servos are pulsed in the background using the value most recently written using the write() method * diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index ed97e52f89..a644ab2fc8 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -348,7 +348,6 @@ * However, internal to Marlin E0/T0 is the first tool, and * most board silkscreens say "E0." Zero-based labels will * make these indexes consistent but this defies expectation. - * */ #if ENABLED(NUMBER_TOOLS_FROM_0) #define LCD_FIRST_TOOL 0 diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 63559e0bb8..010b5951be 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -236,9 +236,7 @@ } /** - * * Generic case of a line crossing both X and Y Mesh lines. - * */ xy_int8_t cnt = (istart - iend).ABS(); diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index f67d50a6e0..8a3e959e07 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -816,7 +816,6 @@ int8_t I2CPositionEncodersMgr::parse() { * Y Report on Y axis encoder, if present. * Z Report on Z axis encoder, if present. * E Report on E axis encoder, if present. - * */ void I2CPositionEncodersMgr::M860() { if (parse()) return; @@ -846,7 +845,6 @@ void I2CPositionEncodersMgr::M860() { * Y Report on Y axis encoder, if present. * Z Report on Z axis encoder, if present. * E Report on E axis encoder, if present. - * */ void I2CPositionEncodersMgr::M861() { if (parse()) return; @@ -875,7 +873,6 @@ void I2CPositionEncodersMgr::M861() { * Y Report on Y axis encoder, if present. * Z Report on Z axis encoder, if present. * E Report on E axis encoder, if present. - * */ void I2CPositionEncodersMgr::M862() { if (parse()) return; @@ -905,7 +902,6 @@ void I2CPositionEncodersMgr::M862() { * Y Report on Y axis encoder, if present. * Z Report on Z axis encoder, if present. * E Report on E axis encoder, if present. - * */ void I2CPositionEncodersMgr::M863() { if (parse()) return; diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index 31fa529d56..37a2404c33 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -710,13 +710,11 @@ void MMU2::tool_change(const uint8_t index) { } /** - * * Handle special T?/Tx/Tc commands * * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. - * */ void MMU2::tool_change(const char* special) { if (!enabled) return; @@ -922,9 +920,7 @@ void MMU2::filament_runout() { } /** - * * Switch material and load to nozzle - * */ bool MMU2::load_filament_to_nozzle(const uint8_t index) { diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h index 8bc8eb4e74..82aa9aa16a 100644 --- a/Marlin/src/feature/twibus.h +++ b/Marlin/src/feature/twibus.h @@ -48,7 +48,6 @@ typedef void (*twiRequestFunc_t)(); * For more information see * - https://marlinfw.org/docs/gcode/M260.html * - https://marlinfw.org/docs/gcode/M261.html - * */ class TWIBus { private: diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 9bb1ebe238..e9b6e0e3a6 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -160,7 +160,6 @@ * E By default G29 will engage the Z probe, test the bed, then disengage. * Include "E" to engage/disengage the Z probe for each sample. * There's no extra effect if you have a fixed Z probe. - * */ G29_TYPE GcodeSuite::G29() { diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 68ac459ebb..5da99386ad 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -57,7 +57,6 @@ inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM(" * S3 In Jn Zn.nn Manually modify a single point * S4 Zn.nn Set z offset. Positive away from bed, negative closer to bed. * S5 Reset and disable mesh - * */ void GcodeSuite::G29() { diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index be222a7b17..7bc40b2127 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -192,7 +192,6 @@ * X Home to the X endstop * Y Home to the Y endstop * Z Home to the Z endstop - * */ void GcodeSuite::G28() { DEBUG_SECTION(log_G28, "G28", DEBUGGING(LEVELING)); diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp index 53d74322a3..3bd908cad6 100644 --- a/Marlin/src/gcode/control/M999.cpp +++ b/Marlin/src/gcode/control/M999.cpp @@ -34,7 +34,6 @@ * * Sending "M999 S1" will resume printing without flushing the * existing command buffer. - * */ void GcodeSuite::M999() { marlin_state = MF_RUNNING; diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp index cd7fc3dcb5..7bd446a1ab 100644 --- a/Marlin/src/gcode/feature/L6470/M906.cpp +++ b/Marlin/src/gcode/feature/L6470/M906.cpp @@ -33,7 +33,6 @@ #include "../../../core/debug_out.h" /** - * * M906: report or set KVAL_HOLD which sets the maximum effective voltage provided by the * PWMs to the steppers * @@ -56,7 +55,6 @@ * * L6470 is used in the STEP-CLOCK mode. KVAL_HOLD is the only KVAL_xxx * that affects the effective voltage seen by the stepper. - * */ /** diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp index 29efc06dd9..8165b71e44 100644 --- a/Marlin/src/gcode/feature/L6470/M916-918.cpp +++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp @@ -37,7 +37,6 @@ #include "../../../core/debug_out.h" /** - * * M916: increase KVAL_HOLD until get thermal warning * NOTE - on L6474 it is TVAL that is used * @@ -62,7 +61,6 @@ * * D - time (in seconds) to run each setting of KVAL_HOLD/TVAL * optional - defaults to zero (runs each setting once) - * */ /** @@ -187,7 +185,6 @@ void GcodeSuite::M916() { } /** - * * M917: Find minimum current thresholds * * Decrease OCD current until overcurrent error @@ -214,7 +211,6 @@ void GcodeSuite::M916() { * * K - value for KVAL_HOLD (0 - 255) (ignored for L6474) * optional - will report current value from driver if not specified - * */ void GcodeSuite::M917() { @@ -522,7 +518,6 @@ void GcodeSuite::M917() { } /** - * * M918: increase speed until error or max feedrate achieved (as shown in configuration.h)) * * J - select which driver(s) to monitor on multi-driver axis @@ -543,7 +538,6 @@ void GcodeSuite::M917() { * * M - value for microsteps (1 - 128) (optional) * optional - will report current value from driver if not specified - * */ void GcodeSuite::M918() { diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp index 13c2cd1d10..526d9101e1 100644 --- a/Marlin/src/gcode/feature/i2c/M260_M261.cpp +++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp @@ -42,7 +42,6 @@ * * M260 S1 ; Send the buffered data and reset the buffer * M260 R1 ; Reset the buffer without sending data - * */ void GcodeSuite::M260() { // Set the target address diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp index c40f3ae6e1..9c3b774bd2 100644 --- a/Marlin/src/gcode/feature/pause/M603.cpp +++ b/Marlin/src/gcode/feature/pause/M603.cpp @@ -39,7 +39,6 @@ * T[toolhead] - Select extruder to configure, active extruder if not specified * U[distance] - Retract distance for removal, for the specified extruder * L[distance] - Extrude distance for insertion, for the specified extruder - * */ void GcodeSuite::M603() { diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 085f6b3618..425a857369 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -289,7 +289,6 @@ * "T" Codes * * T0-T3 - Select an extruder (tool) by index: "T F" - * */ #include "../inc/MarlinConfig.h" diff --git a/Marlin/src/gcode/sd/M32.cpp b/Marlin/src/gcode/sd/M32.cpp index a6f9fbcd8d..55ec6ea497 100644 --- a/Marlin/src/gcode/sd/M32.cpp +++ b/Marlin/src/gcode/sd/M32.cpp @@ -38,7 +38,6 @@ * M32 !PATH/TO/FILE.GCO# ; Start FILE.GCO * M32 P !PATH/TO/FILE.GCO# ; Start FILE.GCO as a procedure * M32 S60 !PATH/TO/FILE.GCO# ; Start FILE.GCO at byte 60 - * */ void GcodeSuite::M32() { if (IS_SD_PRINTING()) planner.synchronize(); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index fa65991c2f..d2c939b9b4 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -512,7 +512,6 @@ * HOTENDS - Number of hotends, whether connected or separate * E_STEPPERS - Number of actual E stepper motors * E_MANUAL - Number of E steppers for LCD move options - * */ #if EXTRUDERS == 0 diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index 211acc86c6..806f370db3 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -11,7 +11,6 @@ * any later version. The code is distributed WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. - * */ /** diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h index 9f0815d099..b217246484 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h @@ -11,7 +11,6 @@ * any later version. The code is distributed WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. - * */ #pragma once diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index eb9b5315e5..0f53e45a27 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -51,7 +51,6 @@ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 2aaf66854c..55fcd842de 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1632,7 +1632,6 @@ void update_variable() { * TODO: New code can follow the pattern of menu_media.cpp * and rely on Marlin caching for performance. No need to * cache files here. - * */ #ifndef strcasecmp_P diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp index 6a635b9ddb..2c466ffd04 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp @@ -42,7 +42,6 @@ constexpr uint32_t flash_eeprom_version = 1; * 0 16 DATA STORAGE AREA * 16 1 VERSIONING DATA * 17 inf MEDIA STORAGE AREA - * */ #define DATA_STORAGE_SIZE_64K diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h index dd4be7a793..2429e30e79 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h @@ -32,7 +32,6 @@ * Selecting an LCD Display * Version 2.1 * Issue Date: 2017-11-14 - * */ #define COMPUTE_REGS_FROM_DATASHEET \ constexpr uint16_t Hoffset = thfp + thb - 1; \ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp index 9c5599ebe8..3dd2b88b19 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp @@ -109,7 +109,6 @@ namespace FTDI { * - Handles auto-repetition by sending onTouchHeld to the active screen periodically. * - Plays touch feedback "click" sounds when appropriate. * - Performs debouncing to supress spurious touch events. - * */ void EventLoop::process_events() { // If the LCD is processing commands, don't check diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h index 450b9c4415..a501de20ba 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h @@ -49,7 +49,6 @@ * ... * } * } - * */ class PolyReader { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 02c4717d77..15122ec69e 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -375,7 +375,6 @@ namespace ExtUI { * constexpr float increment = 10; * * UI_INCREMENT(TargetTemp_celsius, E0) - * */ #define UI_INCREMENT_BY(method, inc, ...) ExtUI::set ## method(ExtUI::get ## method (__VA_ARGS__) + inc, ##__VA_ARGS__) #define UI_DECREMENT_BY(method, inc, ...) ExtUI::set ## method(ExtUI::get ## method (__VA_ARGS__) - inc, ##__VA_ARGS__) diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index 1cb64f985b..a5030fcd56 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index 8917d98e68..dcb06e31e7 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_5 diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index 1c4a029ff7..0657c4a759 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ namespace Language_ca { using namespace Language_en; // Inherit undefined strings from English diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index b11a3686cb..716c0a0929 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -31,7 +31,6 @@ * Translated by Petr Zahradnik, Computer Laboratory * Blog and video blog Zahradnik se bavi * https://www.zahradniksebavi.cz - * */ #define DISPLAY_CHARSET_ISO10646_CZ diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index da282be0b4..0e4fa75aa6 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 875444c0e7..5492cd5d59 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ namespace Language_de { diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index 8fe8887653..fea2bf5818 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_GREEK diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index ad170a3487..344618b137 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_GREEK diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 04c58fd22a..f377a5184c 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define en 1234 diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 15fa35ac75..c77b12ee77 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ namespace Language_es { diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index bee571bbde..7e35c6ee41 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index 77424df353..af7dd22af9 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 21f7757fa9..714feeee99 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 53b0803518..2fd4bf6975 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index 4873f5c254..1b2ae41fce 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays. diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 76aff51d9c..f93e5ee4e2 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -29,7 +29,6 @@ * A Magyar fordítást készítette: AntoszHUN * * - * */ namespace Language_hu { diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index e22e58708f..a70463956a 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index df6ad9b5d9..f1289123a4 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -27,7 +27,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ //#define DISPLAY_CHARSET_ISO10646_KANA diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h index 2ffcdf7b41..1ab03dcf57 100644 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ b/Marlin/src/lcd/language/language_ko_KR.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ namespace Language_ko_KR { using namespace Language_en; // Inherit undefined strings from English diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index c1a1a0605b..7b6c16b3b3 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index f6a9e12c8e..770c872a40 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_PL diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 8bd94d06e1..56426c0321 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -27,7 +27,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_1 diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index eb1e2f9bf3..cf2f7a0cce 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -27,7 +27,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ namespace Language_pt_br { using namespace Language_en; // Inherit undefined strings from English diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index b8c146e515..0953bb8a71 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_5 diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index e936110d07..8a59bfc673 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -30,7 +30,6 @@ * * Translated by Michal HoleÅ¡, Farma MaM * https://www.facebook.com/farmamam - * */ #define DISPLAY_CHARSET_ISO10646_SK diff --git a/Marlin/src/lcd/language/language_test.h b/Marlin/src/lcd/language/language_test.h index b15f20619e..16cafbebbe 100644 --- a/Marlin/src/lcd/language/language_test.h +++ b/Marlin/src/lcd/language/language_test.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ // Select ONE of the following Mappers. diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 95e4fb2a8b..90208befe7 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -30,7 +30,6 @@ * Bu çeviri dosyasındaki sorunlar ve düzeltmeler için iletiÅŸim; * Contact for issues and corrections in this translation file; * Yücel Temel - (info@elektromanyetix.com) - https://elektromanyetix.com/ - * */ #define DISPLAY_CHARSET_ISO10646_TR diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 9041decbb2..54171e1ebc 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ #define DISPLAY_CHARSET_ISO10646_5 diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index afd87d3798..fb60a5d821 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ namespace Language_vi { using namespace Language_en; // Inherit undefined strings from English diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index d30ee789dd..53dac64c0b 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ namespace Language_zh_CN { using namespace Language_en; // Inherit undefined strings from English diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 6764af6d73..7f1fce649e 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -26,7 +26,6 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html - * */ namespace Language_zh_TW { using namespace Language_en; // Inherit undefined strings from English diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 5d02d674aa..d116a6a398 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -101,9 +101,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { } /** - * * "Change Filament" submenu - * */ #if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp index ef6ef9e90d..c7593c049f 100644 --- a/Marlin/src/libs/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -29,7 +29,6 @@ * it saves roughly 10K of program memory. It also does not require all of * coordinates to be present during the calculations. Each point can be * probed and then discarded. - * */ #include "../inc/MarlinConfig.h" diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h index 5cd6a02514..44ca8afc76 100644 --- a/Marlin/src/libs/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -30,7 +30,6 @@ * it saves roughly 10K of program memory. And even better... the data * fed into the algorithm does not need to all be present at the same time. * A point can be probed and its values fed into the algorithm and then discarded. - * */ #include "../inc/MarlinConfig.h" diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 2ef00f7959..4ad7c4ccf0 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -339,7 +339,6 @@ void Planner::init() { * const uint32_t r = _BV(24) - x * d; // Estimate remainder * if (r >= d) x++; // Check whether to adjust result * return uint32_t(x); // x holds the proper estimation - * */ static uint32_t get_period_inverse(uint32_t d) { @@ -2243,7 +2242,6 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #define MAX_E_JERK(N) TERN(HAS_LINEAR_E_JERK, max_e_jerk[E_INDEX_N(N)], max_jerk.e) /** - * * Use LIN_ADVANCE for blocks if all these are true: * * esteps : This is a print move, because we checked for A, B, C steps before. diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp index 4025b773ed..02d878d5f5 100644 --- a/Marlin/src/module/planner_bezier.cpp +++ b/Marlin/src/module/planner_bezier.cpp @@ -24,7 +24,6 @@ * planner_bezier.cpp * * Compute and buffer movement commands for bezier curves - * */ #include "../inc/MarlinConfig.h" diff --git a/Marlin/src/module/planner_bezier.h b/Marlin/src/module/planner_bezier.h index 41a88b4058..72048c4273 100644 --- a/Marlin/src/module/planner_bezier.h +++ b/Marlin/src/module/planner_bezier.h @@ -25,7 +25,6 @@ * planner_bezier.h * * Compute and buffer movement commands for Bézier curves - * */ #include "../core/types.h" diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index dd6bd70d2c..defc22b1fe 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -729,7 +729,6 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise * when starting up the machine or rebooting the board. * There's no way to know where the nozzle is positioned until * homing has been done - no homing with z-probe without init! - * */ STOW_Z_SERVO(); } diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 0fc23099cc..3ccd8ffd91 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -33,7 +33,6 @@ * ALSO: Variables in the Store and Retrieve sections must be in the same order. * If a feature is disabled, some data must still be written that, when read, * either sets a Sane Default, or results in No Change to the existing value. - * */ // Change EEPROM version if the structure changes diff --git a/Marlin/src/module/thermistor/thermistor_30.h b/Marlin/src/module/thermistor/thermistor_30.h index 63cde610a4..bc1781b135 100644 --- a/Marlin/src/module/thermistor/thermistor_30.h +++ b/Marlin/src/module/thermistor/thermistor_30.h @@ -26,11 +26,11 @@ // Resistance Tolerance + / -1% // B Value 3950K at 25/50 deg. C // B Value Tolerance + / - 1% -// Kis3d Silicone Heater 24V 200W/300W with 6mm Precision cast plate (EN AW 5083) +// Kis3d Silicone Heater 24V 200W/300W with 6mm Precision cast plate (EN AW 5083) // Temperature setting time 10 min to determine the 12Bit ADC value on the surface. (le3tspeak) const temp_entry_t temptable_30[] PROGMEM = { - { OV( 1), 938 }, - { OV( 298), 125 }, // 1193 - 125° + { OV( 1), 938 }, + { OV( 298), 125 }, // 1193 - 125° { OV( 321), 121 }, // 1285 - 121° { OV( 348), 117 }, // 1392 - 117° { OV( 387), 113 }, // 1550 - 113° diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h index c59c90ad1d..df182049f9 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -27,7 +27,6 @@ * Applies to the following boards: * * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) - * */ #if NOT_TARGET(MCU_LPC1768) diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index 335e3a588d..bcff04eb85 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -27,7 +27,6 @@ * Applies to the following boards: * * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) - * */ #if NOT_TARGET(MCU_LPC1768) diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 1290200e55..196503c822 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -372,7 +372,6 @@ * P1_31 - not 5V tolerant - EXP1 * P0_27 - open collector - EXP2 * P0_28 - open collector - EXP2 - * */ /** @@ -387,5 +386,4 @@ * P0_03 - AUX1 * P0_29 - Port -1 * P0_30 - USB - * */ diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 41763fb33c..c602af1c30 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -31,7 +31,6 @@ * RAMPS_14_EFF (Hotend, Fan0, Fan1) * RAMPS_14_EEF (Hotend0, Hotend1, Fan) * RAMPS_14_SF (Spindle, Controller Fan) - * */ // Numbers in parentheses () are the corresponding mega2560 pin numbers diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 0916d0d65b..76c54c3bba 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index 19c2d50320..d67549997b 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -26,7 +26,6 @@ * * The pins diagram can be found and the following URL: * https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20PIN.pdf - * */ #if NOT_TARGET(MCU_LPC1769) diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index 50e7eb1914..a0174f2602 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -166,7 +166,6 @@ * * A remote SD card is currently not supported because the pins routed to the EXP2 * connector are shared with the onboard SD card. - * */ #if ENABLED(CR10_STOCKDISPLAY) diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h index 3c4f3c719a..be5f461dda 100644 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -137,7 +137,6 @@ ///////////////////// SPARE HEADERS ////////////// /** - * * J25 * 1 D54 * 2 D55 diff --git a/Marlin/src/pins/mega/pins_MINITRONICS.h b/Marlin/src/pins/mega/pins_MINITRONICS.h index 9cb4401da9..bbe746461e 100644 --- a/Marlin/src/pins/mega/pins_MINITRONICS.h +++ b/Marlin/src/pins/mega/pins_MINITRONICS.h @@ -29,7 +29,6 @@ * Rev B 2 JAN 2017 * * Added pin definitions for M3, M4 & M5 spindle control commands - * */ #if NOT_TARGET(__AVR_ATmega1281__) diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index 06a8144291..5f153cfa2b 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -31,7 +31,6 @@ * * Both passes use the same pin list. The list contains two macro names. The * actual macro definitions are changed depending on which pass is being done. - * */ // first pass - put the name strings into FLASH diff --git a/Marlin/src/pins/ramps/pins_RAMPS_13.h b/Marlin/src/pins/ramps/pins_RAMPS_13.h index 032dd79c23..6e7c8cbab5 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_13.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_13.h @@ -31,7 +31,6 @@ * RAMPS_13_EFF (Extruder, Fan, Fan) * RAMPS_13_EEF (Extruder, Extruder, Fan) * RAMPS_13_SF (Spindle, Controller Fan) - * */ #ifndef BOARD_INFO_NAME diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h index 19209f1e23..9908d9494f 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -35,7 +35,6 @@ * RAMPS_PLUS_EFF (Extruder, Fan, Fan) * RAMPS_PLUS_EEF (Extruder, Extruder, Fan) * RAMPS_PLUS_SF (Spindle, Controller Fan) - * */ #if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h index c4d7c07940..b0e171cf17 100644 --- a/Marlin/src/pins/sam/pins_ADSK.h +++ b/Marlin/src/pins/sam/pins_ADSK.h @@ -204,5 +204,4 @@ A stepper for E0 extruder * * Standard ethernet pairs: 1&2, 3&6, 4&5, 7&8 * Use CAT7 cable to have all pairs shielded - * */ diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index 2cfbecc086..22edb70213 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -170,5 +170,4 @@ * None of these are in the arduino_due_x variant so digitalWrite and digitalRead can't be used on them. * * They can be accessed via FASTIO functions WRITE, READ, OUT_WRITE, OUTPUT, ... - * */ diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index f33cdc83ac..74692a21a3 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -30,7 +30,6 @@ * * 1) no longer uses Sanguino files to define some of the pins * 2) added pointers to useable Arduino IDE extensions - * */ /** @@ -48,7 +47,6 @@ * "Anet V1.0 (Optiboot)" frees up another 3K of FLASH. You'll need to burn * a new bootloader to the board to be able to automatically download a * compiled image. - * */ /** @@ -66,7 +64,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ /** diff --git a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h index e927aac124..29905c1089 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h @@ -29,7 +29,6 @@ * Rev B 26 DEC 2016 * * added pointer to a current Arduino IDE extension - * */ /** @@ -47,7 +46,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__) diff --git a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h index 1961446e22..33fc233f7a 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h @@ -29,7 +29,6 @@ * Rev B 26 DEC 2016 * * added pointer to a current Arduino IDE extension - * */ /** @@ -47,7 +46,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the SANGUINO board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h index 98eb616892..bfca8e90d9 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6.h +++ b/Marlin/src/pins/sanguino/pins_GEN6.h @@ -31,7 +31,6 @@ * 1) added pointer to a current Arduino IDE extension * 2) added support for M3, M4 & M5 spindle control commands * 3) added case light pin definition - * */ /** @@ -49,7 +48,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) diff --git a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h b/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h index a40c2ec15f..9c63570620 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h +++ b/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h @@ -29,7 +29,6 @@ * Rev B 26 DEC 2016 * * added pointer to a current Arduino IDE extension - * */ /** @@ -47,7 +46,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the SANGUINO board and then select the CPU. - * */ diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h index ed550624f7..9db7d7214a 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_12.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_12.h @@ -31,7 +31,6 @@ * 1) added pointer to a current Arduino IDE extension * 2) added support for M3, M4 & M5 spindle control commands * 3) added case light pin definition - * */ /** @@ -49,7 +48,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) diff --git a/Marlin/src/pins/sanguino/pins_GEN7_13.h b/Marlin/src/pins/sanguino/pins_GEN7_13.h index 6743c8cf75..55881aaff5 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_13.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_13.h @@ -29,7 +29,6 @@ * Rev B 26 DEC 2016 * * added pointer to a current Arduino IDE extension - * */ /** @@ -47,7 +46,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #define BOARD_INFO_NAME "Gen7 v1.3" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h index 752fe3074f..66dba533e9 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_14.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h @@ -31,7 +31,6 @@ * 1) added pointer to a current Arduino IDE extension * 2) added support for M3, M4 & M5 spindle control commands * 3) added case light pin definition - * */ /** @@ -49,7 +48,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h index 1a19c33dea..0c4871fb27 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h @@ -34,7 +34,6 @@ * 1) added pointer to a current Arduino IDE extension * 2) added support for M3, M4 & M5 spindle control commands * 3) added case light pin definition - * */ /** @@ -52,7 +51,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) diff --git a/Marlin/src/pins/sanguino/pins_OMCA.h b/Marlin/src/pins/sanguino/pins_OMCA.h index d9f43995d4..7f18283d1c 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA.h +++ b/Marlin/src/pins/sanguino/pins_OMCA.h @@ -56,7 +56,6 @@ * Rev B 26 DEC 2016 * * added pointer to a current Arduino IDE extension - * */ /** @@ -74,7 +73,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__) diff --git a/Marlin/src/pins/sanguino/pins_OMCA_A.h b/Marlin/src/pins/sanguino/pins_OMCA_A.h index 1b4c9b68b2..7707320519 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA_A.h +++ b/Marlin/src/pins/sanguino/pins_OMCA_A.h @@ -48,14 +48,12 @@ * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM * +--------+ - * */ /** * Rev B 26 DEC 2016 * * added pointer to a current Arduino IDE extension - * */ /** @@ -73,7 +71,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644__) diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index 121e1db6f2..438d49d615 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -31,7 +31,6 @@ * 1) added pointer to a current Arduino IDE extension * 2) added support for M3, M4 & M5 spindle control commands * 3) added case light pin definition - * */ /** @@ -49,7 +48,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) diff --git a/Marlin/src/pins/sanguino/pins_SETHI.h b/Marlin/src/pins/sanguino/pins_SETHI.h index e0a0604619..dc2133e441 100644 --- a/Marlin/src/pins/sanguino/pins_SETHI.h +++ b/Marlin/src/pins/sanguino/pins_SETHI.h @@ -47,7 +47,6 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. - * */ #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 2bc94c45c5..63b97b666f 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -257,7 +257,6 @@ * EXP1-8 ----------- EXP1-3 * SPI1-1 ----------- EXP1-1 * EXP1-10 ----------- EXP1-7 - * */ #define CLCD_SPI_BUS 1 // SPI1 connector diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 09e47875ed..50257f4f46 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -202,7 +202,6 @@ * EXP1-8 ----------- EXP1-3 * SPI1-1 ----------- EXP1-1 * EXP1-10 ----------- EXP1-7 - * */ #define TFTGLCD_CS PA9 @@ -245,7 +244,6 @@ * EXP1-8 ----------- EXP1-3 * SPI1-1 ----------- EXP1-1 * EXP1-10 ----------- EXP1-7 - * */ #define CLCD_SPI_BUS 1 // SPI1 connector diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h index 6cd970501f..021ef1d5f6 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index f386b7690b..d52bb11d12 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -23,7 +23,6 @@ /** * Common pin assignments for all RUMBA32 boards - * */ #if NOT_TARGET(STM32F4) diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index 09bbeebdd8..9de119b62b 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -17,7 +17,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * */ /** diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 98d762f10b..2bc9f96e8c 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -154,7 +154,6 @@ bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { * an invalid DOS 8.3 file name, the FAT volume has not been initialized, * a file is already open, the file already exists, the root * directory is full or an I/O error. - * */ bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char* path, uint32_t size) { if (ENABLED(SDCARD_READONLY)) return false; @@ -1663,7 +1662,6 @@ bool SdBaseFile::truncate(uint32_t length) { * \a nbyte. If an error occurs, write() returns -1. Possible errors * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. - * */ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { #if ENABLED(SDCARD_READONLY) diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h index e06e05981a..484d4e50c6 100644 --- a/Marlin/src/sd/SdFatStructs.h +++ b/Marlin/src/sd/SdFatStructs.h @@ -128,7 +128,6 @@ typedef struct masterBootRecord mbr_t; * \struct fat_boot * * \brief Boot sector for a FAT12/FAT16 volume. - * */ struct fat_boot { /** @@ -409,7 +408,6 @@ uint32_t const FSINFO_LEAD_SIG = 0x41615252, // 'AaRR' Lead signature for a F * \struct fat32_fsinfo * * \brief FSINFO sector for a FAT32 volume. - * */ struct fat32_fsinfo { uint32_t leadSignature; // must be 0x52, 0x52, 0x61, 0x41 'RRaA' diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp index a4f048d950..c82fe2c5ed 100644 --- a/Marlin/src/sd/SdFile.cpp +++ b/Marlin/src/sd/SdFile.cpp @@ -57,7 +57,6 @@ SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) { } * \a nbyte. If an error occurs, write() returns -1. Possible errors * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. - * */ int16_t SdFile::write(const void* buf, uint16_t nbyte) { return SdBaseFile::write(buf, nbyte); } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp index 8f0dbf42e9..8a989157b4 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp @@ -640,7 +640,6 @@ again: * 7: for (each driver) { * 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID * 8: if we get here, no driver likes the device plugged in, so exit failure. - * */ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { //uint8_t bAddress = 0; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp index 8ead0b0093..d707a41a27 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp @@ -828,7 +828,6 @@ uint8_t BulkOnly::ClearEpHalt(uint8_t index) { /** * For driver use only. - * */ void BulkOnly::Reset() { while (pUsb->ctrlReq(bAddress, 0, bmREQ_MASSOUT, MASS_REQ_BOMSR, 0, 0, bIface, 0, 0, nullptr, nullptr) == 0x01) delay(6); @@ -1163,7 +1162,6 @@ uint8_t BulkOnly::HandleSCSIError(uint8_t status) { //////////////////////////////////////////////////////////////////////////////// /** - * * @param ep_ptr */ void BulkOnly::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) { diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h index 45830de9a1..15ed427697 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h @@ -318,7 +318,6 @@ UHS_NI UHS_Bulk_Storage::UHS_Bulk_Storage(UHS_USB_HOST_BASE *p) { } /** - * * @param ei Enumeration information * @return true if this interface driver can handle this interface description */ @@ -375,7 +374,6 @@ uint8_t UHS_NI UHS_Bulk_Storage::SetInterface(ENUMERATION_INFO *ei) { }; /** - * * @return 0 for success */ uint8_t UHS_NI UHS_Bulk_Storage::Start() { @@ -628,7 +626,6 @@ void UHS_NI UHS_Bulk_Storage::CheckMedia() { /** * For driver use only. - * */ void UHS_NI UHS_Bulk_Storage::Poll() { if((long)(millis() - qNextPollTime) >= 0L) { @@ -839,7 +836,6 @@ uint8_t UHS_NI UHS_Bulk_Storage::ClearEpHalt(uint8_t index) { /** * For driver use only. - * */ void UHS_NI UHS_Bulk_Storage::Reset() { if(!bAddress) return; @@ -1185,7 +1181,6 @@ uint8_t UHS_NI UHS_Bulk_Storage::HandleSCSIError(uint8_t status) { //////////////////////////////////////////////////////////////////////////////// /** - * * @param ep_ptr */ void UHS_NI UHS_Bulk_Storage::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) { diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index dec083390e..7843013b04 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -101,7 +101,6 @@ uint8_t UHS_USB_HOST_BASE::setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t e * * @param maxep How many endpoints to initialize * @param device pointer to the device driver instance (this) - * */ void UHS_USB_HOST_BASE::DeviceDefaults(uint8_t maxep, UHS_USBInterface *interface) { @@ -208,7 +207,6 @@ uint8_t UHS_USB_HOST_BASE::doSoftReset(uint8_t parent, uint8_t port, uint8_t add * example of one of these documents, see page Five: * https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf * - * */ /** diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h index 625666170b..b289a896ef 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h @@ -350,7 +350,6 @@ public: /** * Executed before anything else in Release(). - * */ virtual void OnRelease() { return; @@ -403,7 +402,6 @@ public: #if 0 /** - * * @return true if this interface is Vendor Specific. */ virtual bool IsVSI() { @@ -414,7 +412,6 @@ public: #if 0 /** - * * Vendor Specific interface class. * This is used by a partner interface. * It can also be used to force-enumerate an interface that diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h index 114064044d..0ac90f0df3 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h @@ -6,7 +6,6 @@ * * To test: * gcc -DAJK_TEST_MACRO_LOGIC -E macro_logic.h - * */ #ifndef MACRO_LOGIC_H diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h index 5408a94ade..f86054cad8 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h @@ -165,7 +165,6 @@ static void Init_dyn_SWI() { } /** - * * @param klass class that extends dyn_SWI * @return 0 on queue full, else returns queue position (ones based) */ @@ -219,7 +218,6 @@ static void Init_dyn_SWI() { } /** - * * @param klass class that extends dyn_SWI * @return 0 on queue full, else returns queue position (ones based) */ From 806c908091130fc11f05bdef9ec2614b96c93e85 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 15:46:12 -0500 Subject: [PATCH 0317/1370] Fix diveToFile with open Dir object (#19539) * Fix CardReader diveToFile * Add CardReader::fileExists --- Marlin/src/sd/cardreader.cpp | 68 ++++++++++++++++++++++++------------ Marlin/src/sd/cardreader.h | 1 + 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 37af4a3688..49ee7747a2 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -571,11 +571,11 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* endFilePrint(); - SdFile *curDir; - const char * const fname = diveToFile(true, curDir, path); + SdFile *diveDir; + const char * const fname = diveToFile(true, diveDir, path); if (!fname) return; - if (file.open(curDir, fname, O_READ)) { + if (file.open(diveDir, fname, O_READ)) { filesize = file.fileSize(); sdpos = 0; @@ -606,14 +606,14 @@ void CardReader::openFileWrite(char * const path) { endFilePrint(); - SdFile *curDir; - const char * const fname = diveToFile(false, curDir, path); + SdFile *diveDir; + const char * const fname = diveToFile(false, diveDir, path); if (!fname) return; #if ENABLED(SDCARD_READONLY) openFailed(fname); #else - if (file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { + if (file.open(diveDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { flag.saving = true; selectFileByName(fname); TERN_(EMERGENCY_PARSER, emergency_parser.disable()); @@ -625,6 +625,16 @@ void CardReader::openFileWrite(char * const path) { #endif } +// +// Check if a file exists by absolute or workDir-relative path +// +bool CardReader::fileExists(const char * const path) { + if (!isMounted()) return false; + SdFile *diveDir = nullptr; + const char * const fname = diveToFile(false, diveDir, path); + return fname != nullptr; +} + // // Delete a file by name in the working directory // @@ -770,13 +780,15 @@ uint16_t CardReader::countFilesInWorkDir() { /** * Dive to the given DOS 8.3 file path, with optional echo of the dive paths. * - * On exit, curDir contains an SdFile reference to the file's directory. + * On exit: + * - Your curDir pointer contains an SdFile reference to the file's directory. + * - If update_cwd was 'true' the workDir now points to the file's directory. * * Returns a pointer to the last segment (filename) of the given DOS 8.3 path. * * A nullptr result indicates an unrecoverable error. */ -const char* CardReader::diveToFile(const bool update_cwd, SdFile*& curDir, const char * const path, const bool echo/*=false*/) { +const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, const char * const path, const bool echo/*=false*/) { // Track both parent and subfolder static SdFile newDir1, newDir2; SdFile *sub = &newDir1, *startDir; @@ -785,14 +797,15 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& curDir, const const char *item_name_adr = path; if (path[0] == '/') { // Starting at the root directory? - curDir = &root; - if (update_cwd) workDirDepth = 0; // The cwd can be updated for the benefit of sub-programs + diveDir = &root; item_name_adr++; + if (update_cwd) workDirDepth = 0; // The cwd can be updated for the benefit of sub-programs } else - curDir = &workDir; // Dive from workDir (as set by the UI) + diveDir = &workDir; // Dive from workDir (as set by the UI) + + startDir = diveDir; - startDir = curDir; while (item_name_adr) { // Find next subdirectory delimiter char * const name_end = strchr(item_name_adr, '/'); @@ -808,30 +821,39 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& curDir, const if (echo) SERIAL_ECHOLN(dosSubdirname); - // Open curDir - if (!sub->open(curDir, dosSubdirname, O_READ)) { + // Open diveDir (closing first) + sub->close(); + if (!sub->open(diveDir, dosSubdirname, O_READ)) { openFailed(dosSubdirname); - return nullptr; + item_name_adr = nullptr; + break; } - // Close curDir if not at starting-point - if (curDir != startDir) curDir->close(); + // Close diveDir if not at starting-point + if (diveDir != startDir) diveDir->close(); - // curDir now subDir - curDir = sub; + // diveDir now subDir + diveDir = sub; - // Update workDirParents, workDirDepth, and workDir + // Update workDirParents and workDirDepth if (update_cwd) { - if (workDirDepth < MAX_DIR_DEPTH) workDirParents[workDirDepth++] = *curDir; - workDir = *curDir; + if (workDirDepth < MAX_DIR_DEPTH) + workDirParents[workDirDepth++] = *diveDir; } // Point sub at the other scratch object - sub = (curDir != &newDir1) ? &newDir1 : &newDir2; + sub = (diveDir != &newDir1) ? &newDir1 : &newDir2; // Next path atom address item_name_adr = name_end + 1; } + + if (update_cwd) { + workDir = *diveDir; + flag.workDirIsRoot = (workDirDepth == 0); + TERN_(SDCARD_SORT_ALPHA, presort()); + } + return item_name_adr; } diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 62a6d87acf..33645b6531 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -99,6 +99,7 @@ public: static void openFileRead(char * const path, const uint8_t subcall=0); static void openFileWrite(char * const path); static void closefile(const bool store_location=false); + static bool fileExists(const char * const name); static void removeFile(const char * const name); static inline char* longest_filename() { return longFilename[0] ? longFilename : filename; } From 782b9ce69eba1b5360184c6914a2803031258ecd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 15:52:21 -0500 Subject: [PATCH 0318/1370] Improve Power-Loss Recovery (#19540) --- Marlin/src/feature/powerloss.cpp | 28 +++++++++++++++++--- Marlin/src/feature/powerloss.h | 11 +++++++- Marlin/src/gcode/feature/powerloss/M1000.cpp | 2 ++ Marlin/src/gcode/feature/powerloss/M413.cpp | 1 + 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index ed3a4b9fad..faf6202dbd 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -112,8 +112,7 @@ void PrintJobRecovery::check() { if (card.isMounted()) { load(); if (!valid()) return cancel(); - queue.inject_P(PSTR("M1000 S")); - TERN_(DWIN_CREALITY_LCD, dwin_flag = true); + queue.inject_P(PSTR("M1000S")); } } @@ -227,6 +226,10 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ // Elapsed print job time info.print_job_elapsed = print_job_timer.duration(); + // Misc. Marlin flags + info.flag.dryrun = !!(marlin_debug_flags & MARLIN_DEBUG_DRYRUN); + info.flag.allow_cold_extrusion = TERN0(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude); + write(); } } @@ -326,6 +329,12 @@ void PrintJobRecovery::resume() { const uint32_t resume_sdpos = info.sdpos; // Get here before the stepper ISR overwrites it + // Apply the dry-run flag if enabled + if (info.flag.dryrun) marlin_debug_flags |= MARLIN_DEBUG_DRYRUN; + + // Restore cold extrusion permission + TERN_(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude = info.flag.allow_cold_extrusion); + #if HAS_LEVELING // Make sure leveling is off before any G92 and G28 gcode.process_subcommands_now_P(PSTR("M420 S0 Z0")); @@ -337,7 +346,7 @@ void PrintJobRecovery::resume() { // If Z homing goes to max, just reset E and home all gcode.process_subcommands_now_P(PSTR( "G92.9 E0\n" - "G28R0" TERN_(MARLIN_DEV_MODE, "S") + "G28R0" )); #else // "G92.9 E0 ..." @@ -358,7 +367,6 @@ void PrintJobRecovery::resume() { gcode.process_subcommands_now_P(PSTR( "G28R0" // No raise during G28 - TERN_(MARLIN_DEV_MODE, "S") // Simulated Homing TERN_(IS_CARTESIAN, "XY") // Don't home Z on Cartesian )); @@ -498,6 +506,14 @@ void PrintJobRecovery::resume() { LOOP_XYZ(i) update_workspace_offset((AxisEnum)i); #endif + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + const uint8_t old_flags = marlin_debug_flags; + marlin_debug_flags |= MARLIN_DEBUG_ECHO; + #endif + + // Continue to apply PLR when a file is resumed! + enable(true); + // Resume the SD file from the last position char *fn = info.sd_filename; extern const char M23_STR[]; @@ -505,6 +521,8 @@ void PrintJobRecovery::resume() { gcode.process_subcommands_now(cmd); sprintf_P(cmd, PSTR("M24 S%ld T%ld"), resume_sdpos, info.print_job_elapsed); gcode.process_subcommands_now(cmd); + + TERN_(DEBUG_POWER_LOSS_RECOVERY, marlin_debug_flags = old_flags); } #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) @@ -584,6 +602,8 @@ void PrintJobRecovery::resume() { DEBUG_ECHOLNPAIR("sd_filename: ", info.sd_filename); DEBUG_ECHOLNPAIR("sdpos: ", info.sdpos); DEBUG_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed); + DEBUG_ECHOLNPAIR("dryrun: ", int(info.flag.dryrun)); + DEBUG_ECHOLNPAIR("allow_cold_extrusion: ", int(info.flag.allow_cold_extrusion)); } else DEBUG_ECHOLNPGM("INVALID DATA"); diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 1943175b05..e31b2ec915 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -107,6 +107,12 @@ typedef struct { // Job elapsed time millis_t print_job_elapsed; + // Misc. Marlin flags + struct { + bool dryrun:1; // M111 S8 + bool allow_cold_extrusion:1; // M302 P1 + } flag; + uint8_t valid_foot; bool valid() { return valid_head && valid_head == valid_foot; } @@ -173,7 +179,10 @@ class PrintJobRecovery { } #endif - static inline bool valid() { return info.valid(); } + // The referenced file exists + static inline bool interrupted_file_exists() { return card.fileExists(info.sd_filename); } + + static inline bool valid() { return info.valid() && interrupted_file_exists(); } #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) static void debug(PGM_P const prefix); diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index 58e810e5d0..e9477dd2fb 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -62,6 +62,8 @@ void GcodeSuite::M1000() { if (parser.seen('S')) { #if HAS_LCD_MENU ui.goto_screen(menu_job_recovery); + #elif ENABLED(DWIN_CREALITY_LCD) + recovery.dwin_flag = true; #elif ENABLED(EXTENSIBLE_UI) ExtUI::onPowerLossResume(); #else diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp index 5a08053e7c..3538ccaa6e 100644 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ b/Marlin/src/gcode/feature/powerloss/M413.cpp @@ -50,6 +50,7 @@ void GcodeSuite::M413() { if (parser.seen("RL")) recovery.load(); if (parser.seen('W')) recovery.save(true); if (parser.seen('P')) recovery.purge(); + if (parser.seen('D')) recovery.debug(PSTR("M413")); #if PIN_EXISTS(POWER_LOSS) if (parser.seen('O')) recovery._outage(); #endif From 9aff5cb0952be9d95224d5dcac975fea7fc02b86 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 16:37:00 -0500 Subject: [PATCH 0319/1370] Add extra CardReader debugging --- Marlin/src/sd/cardreader.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 49ee7747a2..ec834564ec 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -55,6 +55,7 @@ #define DEBUG_OUT EITHER(DEBUG_CARDREADER, MARLIN_DEV_MODE) #include "../core/debug_out.h" +#include "../libs/hex_print.h" // public: @@ -796,9 +797,12 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, cons // Parsing the path string const char *item_name_adr = path; + DEBUG_ECHOLNPAIR("diveToFile: path = '", path, "'"); + if (path[0] == '/') { // Starting at the root directory? diveDir = &root; item_name_adr++; + DEBUG_ECHOLNPAIR("diveToFile: CWD to root: ", hex_address((void*)diveDir)); if (update_cwd) workDirDepth = 0; // The cwd can be updated for the benefit of sub-programs } else @@ -806,6 +810,8 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, cons startDir = diveDir; + DEBUG_ECHOLNPAIR("diveToFile: startDir = ", hex_address((void*)startDir)); + while (item_name_adr) { // Find next subdirectory delimiter char * const name_end = strchr(item_name_adr, '/'); @@ -821,6 +827,8 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, cons if (echo) SERIAL_ECHOLN(dosSubdirname); + DEBUG_ECHOLNPAIR("diveToFile: sub = ", hex_address((void*)sub)); + // Open diveDir (closing first) sub->close(); if (!sub->open(diveDir, dosSubdirname, O_READ)) { @@ -830,19 +838,25 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, cons } // Close diveDir if not at starting-point - if (diveDir != startDir) diveDir->close(); + if (diveDir != startDir) { + DEBUG_ECHOLNPAIR("diveToFile: closing diveDir: ", hex_address((void*)diveDir)); + diveDir->close(); + } // diveDir now subDir diveDir = sub; + DEBUG_ECHOLNPAIR("diveToFile: diveDir = sub: ", hex_address((void*)diveDir)); // Update workDirParents and workDirDepth if (update_cwd) { + DEBUG_ECHOLNPAIR("diveToFile: update_cwd"); if (workDirDepth < MAX_DIR_DEPTH) workDirParents[workDirDepth++] = *diveDir; } // Point sub at the other scratch object sub = (diveDir != &newDir1) ? &newDir1 : &newDir2; + DEBUG_ECHOLNPAIR("diveToFile: swapping sub = ", hex_address((void*)sub)); // Next path atom address item_name_adr = name_end + 1; @@ -850,6 +864,7 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, cons if (update_cwd) { workDir = *diveDir; + DEBUG_ECHOLNPAIR("diveToFile: final workDir = ", hex_address((void*)diveDir)); flag.workDirIsRoot = (workDirDepth == 0); TERN_(SDCARD_SORT_ALPHA, presort()); } From de4f882a2288ce19fede72ba1c4b4224044547e5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Sep 2020 16:36:22 -0500 Subject: [PATCH 0320/1370] Fetch longname when a file exists --- Marlin/src/sd/cardreader.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index ec834564ec..e154ea9f31 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -628,11 +628,17 @@ void CardReader::openFileWrite(char * const path) { // // Check if a file exists by absolute or workDir-relative path +// If the file exists, the long name can also be fetched. // bool CardReader::fileExists(const char * const path) { if (!isMounted()) return false; SdFile *diveDir = nullptr; const char * const fname = diveToFile(false, diveDir, path); + if (fname) { + diveDir->rewind(); + selectByName(*diveDir, fname); + diveDir->close(); + } return fname != nullptr; } From bb90bc6165820e38d2fa8717f1fd9c301e7c1fe2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Sep 2020 16:51:16 -0500 Subject: [PATCH 0321/1370] Fix up E3 DWIN Power Panic --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 61 ++++++++++++------------------- 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 55fcd842de..85263a89ab 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -991,15 +991,15 @@ void Popup_Window_Resume() { if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 160, 338, 235, 354, 98, 135); DWIN_Frame_AreaCopy(1, 103, 321, 271, 335, 52, 192); - DWIN_ICON_Show(ICON, ICON_Continue_C, 26, 307); - DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 307); + DWIN_ICON_Show(ICON, ICON_Cancel_C, 26, 307); + DWIN_ICON_Show(ICON, ICON_Continue_C, 146, 307); } else { DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 14) / 2, 115, F("Continue Print")); DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 192, F("It looks like the last")); DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 212, F("file was interrupted.")); - DWIN_ICON_Show(ICON, ICON_Continue_E, 26, 307); - DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 307); + DWIN_ICON_Show(ICON, ICON_Cancel_E, 26, 307); + DWIN_ICON_Show(ICON, ICON_Continue_E, 146, 307); } } @@ -3597,45 +3597,30 @@ void EachMomentUpdate() { #if ENABLED(POWER_LOSS_RECOVERY) else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off static bool recovery_flag = false; + recovery.dwin_flag = false; - - recovery.load(); - if (!recovery.valid()) return recovery.purge(); - - auto draw_first_option = [](const bool sel) { - const uint16_t c1 = sel ? Color_Bg_Window : Select_Color; - DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345); - DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346); - }; + recovery_flag = true; auto update_selection = [&](const bool sel) { HMI_flag.select_flag = sel; - draw_first_option(sel); + const uint16_t c1 = sel ? Color_Bg_Window : Select_Color; + DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345); + DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346); const uint16_t c2 = sel ? Select_Color : Color_Bg_Window; DWIN_Draw_Rectangle(0, c2, 145, 306, 246, 345); DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346); }; - const uint16_t fileCnt = card.get_num_Files(); - for (uint16_t i = 0; i < fileCnt; i++) { - // TODO: Resume print via M1000 then update the UI - // with the active filename which can come from CardReader. - card.getfilename_sorted(SD_ORDER(i, fileCnt)); - if (!strcmp(card.filename, &recovery.info.sd_filename[1])) { // Resume print before power failure while have the same file - recovery_flag = true; - HMI_flag.select_flag = true; - Popup_Window_Resume(); - draw_first_option(false); - char * const name = card.longest_filename(); - const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name); - DWIN_UpdateLCD(); - break; - } - } + Popup_Window_Resume(); + update_selection(true); - // if hasn't resumable G-code file - if (!recovery_flag) return; + // TODO: Get the name of the current file from someplace + // + //(void)recovery.interrupted_file_exists(); + char * const name = card.longest_filename(); + const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name); + DWIN_UpdateLCD(); while (recovery_flag) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); @@ -3643,12 +3628,12 @@ void EachMomentUpdate() { if (encoder_diffState == ENCODER_DIFF_ENTER) { recovery_flag = false; if (HMI_flag.select_flag) break; - TERN_(POWER_LOSS_RECOVERY, recovery.cancel()); + TERN_(POWER_LOSS_RECOVERY, queue.inject_P(PSTR("M1000C"))); HMI_StartFrame(true); return; } else - update_selection(encoder_diffState == ENCODER_DIFF_CCW); + update_selection(encoder_diffState == ENCODER_DIFF_CW); DWIN_UpdateLCD(); } @@ -3656,9 +3641,9 @@ void EachMomentUpdate() { select_print.set(0); HMI_ValueStruct.show_mode = 0; - HMI_StartFrame(false); - recovery.resume(); - return; + queue.inject_P(PSTR("M1000")); + Goto_PrintProcess(); + Draw_Status_Area(true); } #endif DWIN_UpdateLCD(); From 2069ab3a15cfb578b6ee0c16ccfa1c8bf75cff83 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 29 Sep 2020 00:53:40 +0100 Subject: [PATCH 0322/1370] Anycubic Chiron full feature support (#19505) --- Marlin/Configuration_adv.h | 1 + Marlin/src/HAL/AVR/pinsDebug.h | 2 +- Marlin/src/HAL/AVR/pinsDebug_plus_70.h | 9 +- Marlin/src/feature/powerloss.cpp | 12 +- Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 538 ++--------- .../lib/anycubic_chiron/FileNavigator.cpp | 162 ++++ .../extui/lib/anycubic_chiron/FileNavigator.h | 56 ++ .../lcd/extui/lib/anycubic_chiron/Tunes.cpp | 62 ++ .../src/lcd/extui/lib/anycubic_chiron/Tunes.h | 224 +++++ .../extui/lib/anycubic_chiron/chiron_tft.cpp | 896 ++++++++++++++++++ .../extui/lib/anycubic_chiron/chiron_tft.h | 77 ++ .../lib/anycubic_chiron/chiron_tft_defs.h | 151 +++ .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 110 +-- .../lib/anycubic_i3mega/anycubic_i3mega_lcd.h | 6 - Marlin/src/libs/numtostr.cpp | 7 + Marlin/src/libs/numtostr.h | 3 + 16 files changed, 1739 insertions(+), 577 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp create mode 100644 Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h create mode 100644 Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp create mode 100644 Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h create mode 100644 Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp create mode 100644 Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h create mode 100644 Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a7b6245c2b..b6ea64c2af 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1166,6 +1166,7 @@ #if ENABLED(POWER_LOSS_RECOVERY) #define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) //#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss + //#define POWER_LOSS_RECOVER_ZHOME // Z homing is needed for proper recovery. 99.9% of the time this should be disabled! //#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h index 2cf740a559..dac6b1b150 100644 --- a/Marlin/src/HAL/AVR/pinsDebug.h +++ b/Marlin/src/HAL/AVR/pinsDebug.h @@ -26,7 +26,7 @@ #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H) +#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14) #define AVR_ATmega2560_FAMILY_PLUS_70 1 #endif diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h index 46c03088d2..db3fdf1f76 100644 --- a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h +++ b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h @@ -22,15 +22,12 @@ * Structures for 2560 family boards that use more than 70 pins */ -#undef NUM_DIGITAL_PINS -#if MB(BQ_ZUM_MEGA_3D) +#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14) + #undef NUM_DIGITAL_PINS #define NUM_DIGITAL_PINS 85 #elif MB(MIGHTYBOARD_REVE) + #undef NUM_DIGITAL_PINS #define NUM_DIGITAL_PINS 80 -#elif MB(MINIRAMBO) - #define NUM_DIGITAL_PINS 85 -#elif MB(SCOOVO_X9H) - #define NUM_DIGITAL_PINS 85 #endif #define PA 1 diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index faf6202dbd..e4bc605bb5 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -367,7 +367,9 @@ void PrintJobRecovery::resume() { gcode.process_subcommands_now_P(PSTR( "G28R0" // No raise during G28 - TERN_(IS_CARTESIAN, "XY") // Don't home Z on Cartesian + #if IS_CARTESIAN && DISABLED(POWER_LOSS_RECOVER_ZHOME) + "XY" // Don't home Z on Cartesian unless overridden + #endif )); #endif @@ -375,6 +377,12 @@ void PrintJobRecovery::resume() { // Pretend that all axes are homed set_all_homed(); + #if ENABLED(POWER_LOSS_RECOVER_ZHOME) + // Z has been homed so restore Z to ZsavedPos + POWER_LOSS_ZRAISE + sprintf_P(cmd, PSTR("G1 F500 Z%s"), dtostrf(info.current_position.z + POWER_LOSS_ZRAISE, 1, 3, str_1)); + gcode.process_subcommands_now(cmd); + #endif + // Recover volumetric extrusion state #if DISABLED(NO_VOLUMETRICS) #if HAS_MULTI_EXTRUDER @@ -481,7 +489,7 @@ void PrintJobRecovery::resume() { // Move back to the saved Z dtostrf(info.current_position.z, 1, 3, str_1); - #if Z_HOME_DIR > 0 + #if Z_HOME_DIR > 0 || ENABLED(POWER_LOSS_RECOVER_ZHOME) sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1); #else gcode.process_subcommands_now_P(PSTR("G1 Z0 F200")); diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index 4a8095b6e9..a7f9a7a0c3 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -21,7 +21,7 @@ */ /** - * anycubic_chiron_lcd.cpp + * lcd/extui/anycubic_chiron_lcd.cpp * * Anycubic Chiron TFT support for Marlin */ @@ -31,508 +31,90 @@ #if ENABLED(ANYCUBIC_LCD_CHIRON) #include "ui_api.h" +#include "lib/anycubic_chiron/chiron_tft.h" -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - #if GRID_MAX_POINTS_X != 5 || GRID_MAX_POINTS_Y != 5 - #error ANYCUBIC CHIRON LCD requires a 5x5 bed leveling grid (GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y) - #endif -#else - #error ANYCUBIC CHIRON LCD requires AUTO_BED_LEVELING_BILINEAR enabled -#endif - -#if DISABLED(FILAMENT_RUNOUT_SENSOR) - #error ANYCUBIC CHIRON LCD requires FILAMENT_RUNOUT_SENSOR enabled -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #error ANYCUBIC CHIRON LCD does not currently support POWER_LOSS_RECOVERY -#endif - -static bool is_auto_leveling = false; -static bool is_printing_from_sd = false; -static bool is_out_of_filament = false; - -static void sendNewLine(void) { - LCD_SERIAL.write('\r'); - LCD_SERIAL.write('\n'); -} - -static void send(const char *str) { - LCD_SERIAL.print(str); -} - -static void sendLine(const char *str) { - send(str); - sendNewLine(); -} - -static void send_P(PGM_P str) { - while (const char c = pgm_read_byte(str++)) - LCD_SERIAL.write(c); -} - -static void sendLine_P(PGM_P str) { - send_P(str); - sendNewLine(); -} - -static void sendValue_P(PGM_P prefix, int value) { - send_P(prefix); - LCD_SERIAL.print(value); -} - -static void sendValue_P(PGM_P prefix, float value) { - send_P(prefix); - LCD_SERIAL.print(value); -} - -static void sendValueLine_P(PGM_P prefix, int value) { - send_P(prefix); - LCD_SERIAL.print(value); - sendNewLine(); -} - -static void sendValueLine_P(PGM_P prefix, float value) { - send_P(prefix); - LCD_SERIAL.print(value); - sendNewLine(); -} - -static int parseIntArgument(const char *buffer, char letterId) { - char *p = strchr(buffer, letterId); - if (!p) - return -1; - return atoi(p+1); -} - -static float parseFloatArgument(const char *buffer, char letterId) { - char *p = strchr(buffer, letterId); - if (!p) - return NAN; - return strtof(p+1, nullptr); -} - -static int mmToHundredths(float x) { - // Round - if (x >= 0) - x += 0.005f; - else - x -= 0.005f; - return (int)(x * 100.0f); -} - -static float hundredthsToMm(int x) { - return x / 100.0f; -} - -#define SEND_PGM(str) send_P(PSTR(str)) -#define SENDLINE_PGM(str) sendLine_P(PSTR(str)) -#define SENDVALUE_PGM(prefix, value) sendValue_P(PSTR(prefix), value) -#define SENDVALUELINE_PGM(prefix, value) sendValueLine_P(PSTR(prefix), value) +using namespace Anycubic; namespace ExtUI { - static void moveAxis(float delta, feedRate_t feedrate, axis_t axis) { - float pos = getAxisPosition_mm(axis); - pos += delta; - setAxisPosition_mm(pos, axis, feedrate); + void onStartup() { Chiron.Startup(); } + + void onIdle() { Chiron.IdleLoop(); } + + void onPrinterKilled(PGM_P const error, PGM_P const component) { + Chiron.PrinterKilled(error,component); } - static void handleCmd(const char *rx) { - static FileList fileList; - static char selectedFileShortName[8+1+3+1]; - - if (rx[0] != 'A') { - SERIAL_ECHOPGM("Unexpected RX: "); - SERIAL_ECHOLN(rx); - - return; - } - - const int cmd = atoi(&rx[1]); - - // Uncomment for debugging RX - //if (cmd > 7 && cmd != 20) { - // SERIAL_ECHOPGM("RX: "); - // SERIAL_ECHOLN(rx); - //} - - switch (cmd) { - case 0: // Get Hotend Actual Temperature - SENDVALUELINE_PGM("A0V ", (int)getActualTemp_celsius(E0)); - break; - case 1: // Get Hotend Target Temperature - SENDVALUELINE_PGM("A1V ", (int)getTargetTemp_celsius(E0)); - break; - case 2: // Get Bed Actual Temperature - SENDVALUELINE_PGM("A2V ", (int)getActualTemp_celsius(BED)); - break; - case 3: // Get Bed Target Temperature - SENDVALUELINE_PGM("A3V ", (int)getTargetTemp_celsius(BED)); - break; - case 4: // Get Fan Speed - SENDVALUELINE_PGM("A4V ", (int)getTargetFan_percent(FAN0)); - break; - case 5: // Get Current Coordinates - SENDVALUE_PGM("A5V X: ", getAxisPosition_mm(X)); - SENDVALUE_PGM(" Y: ", getAxisPosition_mm(Y)); - SENDVALUE_PGM(" Z: ", getAxisPosition_mm(Z)); - sendNewLine(); - break; - case 6: // Get SD Card Print Status - if (isPrintingFromMedia()) - SENDVALUELINE_PGM("A6V ", (int)getProgress_percent()); - else - SENDLINE_PGM("A6V ---"); - break; - case 7: // Get Printing Time - if (isPrinting()) { - const int totalMinutes = getProgress_seconds_elapsed() / 60; - SENDVALUE_PGM("A7V ", (int)(totalMinutes/60)); - SENDVALUE_PGM(" H ", (int)(totalMinutes%60)); - SENDLINE_PGM(" M"); - } else { - SENDLINE_PGM("A7V 999:999"); - } - break; - case 8: // Get SD Card File List - if (isMediaInserted()) { - const int startIndex = parseIntArgument(rx, 'S'); - SENDLINE_PGM("FN "); - for (int i = 0, fileIndex = 0, numFiles = 0; i < (int)fileList.count() && numFiles < 4; i++) { - fileList.seek(i); - if (!fileList.isDir()) { - if (fileIndex >= startIndex) { - sendLine(fileList.shortFilename()); - sendLine(fileList.longFilename()); - numFiles++; - } - fileIndex++; - } - } - SENDLINE_PGM("END"); - } else { - SENDLINE_PGM("J02"); - } - break; - case 9: // Pause SD Card Print - if (isPrintingFromMedia()) { - pausePrint(); - is_printing_from_sd = false; - SENDLINE_PGM("J05"); - } else { - SENDLINE_PGM("J16"); // Print stopped - } - break; - case 10: // Resume SD Card Print - if (is_out_of_filament) { - is_out_of_filament = false; - // Filament change did eject the old filament automatically, - // now continue and load the new one - setUserConfirmed(); - SENDLINE_PGM("J04"); // Printing from SD card - } else if (isPrintingFromMediaPaused()) { - resumePrint(); - SENDLINE_PGM("J04"); // Printing from SD card - } - break; - case 11: // Stop SD Card Print - if (isPrintingFromMedia()) { - stopPrint(); - is_printing_from_sd = false; - SENDLINE_PGM("J16"); // Print stopped - } - break; - //case 12: // Kill - // break; - case 13: // Select File - if (!isPrinting()) { - // Store selected file name - char *p = strchr(rx, ' '); - if (p != nullptr && strlen(p+1) < sizeof(selectedFileShortName)) { - strcpy(selectedFileShortName, p+1); - SENDLINE_PGM("J20"); // Open succeeded - } - else - SENDLINE_PGM("J21"); // Open failed - } - break; - case 14: // Start Print - if (!isPrinting() && strcmp(selectedFileShortName, "") != 0) { - printFile(selectedFileShortName); - is_printing_from_sd = true; - SENDLINE_PGM("J04"); // Printing from SD card - } - break; - case 15: // Resume from power outage - // This is not supported, just report print as completed - SENDLINE_PGM("J16"); // Print stopped - break; - case 16: // Set Hotend Target Temperature - { - int temp = parseIntArgument(rx, 'S'); - if (temp >= 0) - setTargetTemp_celsius(temp, E0); - } - break; - case 17: // Set Bed Target Temperature - { - int temp = parseIntArgument(rx, 'S'); - if (temp >= 0) - setTargetTemp_celsius(temp, BED); - } - break; - case 18: // Set Fan Speed - { - int temp = parseIntArgument(rx, 'S'); - if (temp >= 0) - setTargetFan_percent(temp, FAN0); - } - break; - case 19: // Disable Motors - injectCommands_P(PSTR("M84")); - break; - case 20: // Get/Set Printing Speed - { - int newPerc = parseIntArgument(rx, 'S'); - if (newPerc >= 0) - setFeedrate_percent(newPerc); - else - SENDVALUELINE_PGM("A20V ", (int)getFeedrate_percent()); - } - break; - case 21: // Home axes - if (!isPrinting()) { - const bool hasX = strchr(rx, 'X') != nullptr, - hasY = strchr(rx, 'Y') != nullptr, - hasZ = strchr(rx, 'Z') != nullptr, - hasC = strchr(rx, 'C') != nullptr; - if (hasX || hasY || hasZ) { - if (hasX) injectCommands_P(PSTR("G28 X")); - if (hasY) injectCommands_P(PSTR("G28 Y")); - if (hasZ) injectCommands_P(PSTR("G28 Z")); - } else if (hasC) { - injectCommands_P(PSTR("G28")); - } - } - break; - case 22: // Move axes - if (!isPrinting()) { - const int feedrate = parseIntArgument(rx, 'F') / 60; - float delta; - if (!isnan(delta = parseFloatArgument(rx, 'X'))) - moveAxis(delta, feedrate, X); - else if (!isnan(delta = parseFloatArgument(rx, 'Y'))) - moveAxis(delta, feedrate, Y); - else if (!isnan(delta = parseFloatArgument(rx, 'Z'))) - moveAxis(delta, feedrate, Z); - } - break; - case 23: // Preheat PLA - setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); - setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); - SENDLINE_PGM("OK"); - break; - case 24: // Preheat ABS - setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); - setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); - SENDLINE_PGM("OK"); - break; - case 25: // Cool down - setTargetTemp_celsius(0, E0); - setTargetTemp_celsius(0, BED); - SENDLINE_PGM("J12"); - break; - case 26: // Refresh SD Card - fileList.refresh(); - break; - //case 27: // Adjust Servo Angles - // break; - //case 28: // Filament Test - // break; - case 29: // Get Bed Autolevel Grid - { - int x = parseIntArgument(rx, 'X'), - y = parseIntArgument(rx, 'Y'); - if (x != -1 && y != -1) { - xy_uint8_t coord; - coord.set(x, y); - const int value = mmToHundredths(getMeshPoint(coord)); - SENDVALUELINE_PGM("A29V ", value); - } - } - break; - case 30: // Autolevel - if (strchr(rx, 'S')) { // Autoleveling started by clicking "PROBE" and then "OK" - // Note: - // We check for completion by monitoring the command queue. - // Since it will become empty *while* processing the last injected command, - // we enqueue an extra 10ms delay so we can the determine when all the others - // have completed. - if (isMachineHomed()) - injectCommands_P(PSTR("G29\nG4 P10")); - else - injectCommands_P(PSTR("G28\nG29\nG4 P10")); - is_auto_leveling = true; - } else { // Entering Autoleveling screen - if (isPrinting()) - SENDLINE_PGM("J24"); // Disallow autoleveling - else - SENDLINE_PGM("J26"); // Allow autoleveling - } - break; - case 31: // Set Bed Autolevel Z offset - if (strchr(rx, 'G')) { // Get - SENDVALUELINE_PGM("A31V ", getZOffset_mm()); - } else if (strchr(rx, 'S')) { // Set - float delta = parseFloatArgument(rx, 'S'); - delta = constrain(delta, -1.0, 1.0); - setZOffset_mm(getZOffset_mm() + delta); - - SENDVALUELINE_PGM("A31V ", getZOffset_mm()); - } else if (strchr(rx, 'D')) { // Save - injectCommands_P(PSTR("M500")); - } - break; - //case 32: // ? - // break; - case 33: // Get Version Info - SENDLINE_PGM("J33 " SHORT_BUILD_VERSION); - break; - case 34: // Set Bed Autolevel Grid - { - int x = parseIntArgument(rx, 'X'), - y = parseIntArgument(rx, 'Y'), - v = parseIntArgument(rx, 'V'); - if (x != -1 && y != -1 && v != -1) { // Set new value - float value = hundredthsToMm(v); - value = constrain(value, -10, 10); - - xy_uint8_t coord; - coord.set(x, y); - setMeshPoint(coord, value); - } else if (strchr(rx, 'S')) { // Save (apply new values) - injectCommands_P(PSTR("M500")); - } else if (strchr(rx, 'C')) { // Cancel (discard new values) - injectCommands_P(PSTR("M501")); - } - } - break; - } - } - - #define RX_LEN_MAX 63 - static void parseSerialRx() { - static char rxBuffer[RX_LEN_MAX+1]; - static uint8_t rxLen = 0; - - while (LCD_SERIAL.available()) { - const char c = LCD_SERIAL.read(); - switch (c) { - case '\r': case '\n': - if (rxLen > 0 && rxLen <= RX_LEN_MAX) { - rxBuffer[rxLen] = '\0'; // Terminate string - handleCmd(rxBuffer); - } - rxLen = 0; - break; - default: - if (rxLen < RX_LEN_MAX) - rxBuffer[rxLen++] = c; - else { - rxLen = 0xFF; // Overrun - SERIAL_ECHOPGM("Warning: dropping long received line"); - } - break; - } - } - } - - static void detectPrintFromSdCompletion() { - // Note: printFile() queues some commands that actually start the print, so isPrintingFromMedia() - // initially returns false - if (is_printing_from_sd && !commandsInQueue() && !isPrintingFromMedia()) { - is_printing_from_sd = false; - SENDLINE_PGM("J14"); // Print done - } - } - - static void detectAutolevelingCompletion() { - if (is_auto_leveling && !commandsInQueue()) { - is_auto_leveling = false; - injectCommands_P(PSTR("M500")); - SENDLINE_PGM("J25"); // Autoleveling done - } - } - - void onStartup() { - #ifndef LCD_BAUDRATE - #define LCD_BAUDRATE 115200 - #endif - LCD_SERIAL.begin(LCD_BAUDRATE); - sendNewLine(); - SENDLINE_PGM("J17"); // Reset - delay_ms(10); - SENDLINE_PGM("J12"); // Ready - } - - void onIdle() { - parseSerialRx(); - detectAutolevelingCompletion(); - detectPrintFromSdCompletion(); - } - - void onPrinterKilled(PGM_P const error, PGM_P const component) { } - - void onMediaInserted() { - SENDLINE_PGM("J00"); // SD Inserted - } - - void onMediaError() { } - - void onMediaRemoved() { - SENDLINE_PGM("J01"); // SD Removed - } + void onMediaInserted() { Chiron.MediaEvent(AC_media_inserted); } + void onMediaError() { Chiron.MediaEvent(AC_media_error); } + void onMediaRemoved() { Chiron.MediaEvent(AC_media_removed); } void onPlayTone(const uint16_t frequency, const uint16_t duration) { - tone(BEEPER_PIN, frequency, duration); + #if ENABLED(SPEAKER) + ::tone(BEEPER_PIN, frequency, duration); + #endif } - void onPrintTimerStarted() { } + void onPrintTimerStarted() { Chiron.TimerEvent(AC_timer_started); } + void onPrintTimerPaused() { Chiron.TimerEvent(AC_timer_paused); } + void onPrintTimerStopped() { Chiron.TimerEvent(AC_timer_stopped); } + void onFilamentRunout(const extruder_t) { Chiron.FilamentRunout(); } + void onUserConfirmRequired(const char * const msg) { Chiron.ConfirmationRequest(msg); } + void onStatusChanged(const char * const msg) { Chiron.StatusChange(msg); } - void onPrintTimerPaused() { } + void onFactoryReset() {} - void onPrintTimerStopped() { } + void onStoreSettings(char *buff) { + // Called when saving to EEPROM (i.e. M500). If the ExtUI needs + // permanent data to be stored, it can write up to eeprom_data_size bytes + // into buff. - void onFilamentRunout(const extruder_t extruder) { - is_out_of_filament = true; - SENDLINE_PGM("J23"); // Filament runout - SENDLINE_PGM("J18"); // Print paused - // Note: printer will unload filament automatically + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } - void onUserConfirmRequired(const char * const msg) { } + void onLoadSettings(const char *buff) { + // Called while loading settings from EEPROM. If the ExtUI + // needs to retrieve data, it should copy up to eeprom_data_size bytes + // from buff - void onStatusChanged(const char * const msg) { } + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); + } - void onFactoryReset() { } + void onConfigurationStoreWritten(bool success) { + // Called after the entire EEPROM has been written, + // whether successful or not. + } - void onStoreSettings(char *buff) { } + void onConfigurationStoreRead(bool success) { + // Called after the entire EEPROM has been read, + // whether successful or not. + } - void onLoadSettings(const char *buff) { } + #if HAS_MESH + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); + } - void onConfigurationStoreWritten(bool success) { } - - void onConfigurationStoreRead(bool success) { } - - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { } + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + // Called to indicate a special condition + //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " state:", state); + } + #endif #if ENABLED(POWER_LOSS_RECOVERY) - void onPowerLossResume() { } + // Called on resume from power-loss + void onPowerLossResume() { Chiron.PowerLossRecovery(); } #endif #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { } + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + } #endif } diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp new file mode 100644 index 0000000000..fb4c84abb4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -0,0 +1,162 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * lcd/extui/lib/FileNavigator.cpp + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +/*************************************************************************** + * The AC panel wants files in block of 4 and can only display a flat list * + * This library allows full folder traversal. * + ***************************************************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "FileNavigator.h" +#include "chiron_tft.h" + +using namespace ExtUI; + +namespace Anycubic { + + FileList FileNavigator::filelist; // Instance of the Marlin file API + char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path + uint16_t FileNavigator::lastindex; + uint8_t FileNavigator::folderdepth; + uint16_t FileNavigator::currentindex; // override the panel request + + FileNavigator::FileNavigator() { reset(); } + + void FileNavigator::reset() { + currentfoldername[0] = '\0'; + folderdepth = 0; + currentindex = 0; + lastindex = 0; + // Start at root folder + while (!filelist.isAtRootDir()) filelist.upDir(); + refresh(); + } + + void FileNavigator::refresh() { filelist.refresh(); } + + void FileNavigator::getFiles(uint16_t index) { + uint8_t files = 4; + if (index == 0) currentindex = 0; + + // Each time we change folder we reset the file index to 0 and keep track + // of the current position as the TFT panel isnt aware of folders trees. + if (index > 0) { + --currentindex; // go back a file to take account off the .. we added to the root. + if (index > lastindex) + currentindex += files; + else + currentindex = currentindex < 4 ? 0 : currentindex - files; + } + lastindex = index; + + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR("index=", index, " currentindex=", currentindex); + #endif + + if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder + TFTSer.println("<<"); + TFTSer.println(".."); + files--; + } + + for (uint16_t seek = currentindex; seek < currentindex + files; seek++) { + if (filelist.seek(seek)) { + sendFile(); + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); + #endif + } + } + } + + void FileNavigator::sendFile() { + // send the file and folder info to the panel + // this info will be returned when the file is selected + // Permitted special characters in file name -_*#~ + // Panel can display 22 characters per line + if (filelist.isDir()) { + //TFTSer.print(currentfoldername); + TFTSer.println(filelist.shortFilename()); + TFTSer.print(filelist.shortFilename()); + TFTSer.println("/"); + } + else { + // Logical Name + TFTSer.print("/"); + if (folderdepth > 0) TFTSer.print(currentfoldername); + + TFTSer.println(filelist.shortFilename()); + + // Display Name + TFTSer.println(filelist.longFilename()); + } + } + void FileNavigator::changeDIR(char *folder) { + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR("currentfolder: ", currentfoldername, " New: ", folder); + #endif + if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth + strcat(currentfoldername, folder); + strcat(currentfoldername, "/"); + filelist.changeDir(folder); + refresh(); + folderdepth++; + currentindex = 0; + } + + void FileNavigator::upDIR() { + filelist.upDir(); + refresh(); + folderdepth--; + currentindex = 0; + // Remove the last child folder from the stored path + if (folderdepth == 0) { + currentfoldername[0] = '\0'; + reset(); + } + else { + char *pos = nullptr; + for (uint8_t f = 0; f < folderdepth; f++) + pos = strchr(currentfoldername, '/'); + + *(pos + 1) = '\0'; + } + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR("depth: ", folderdepth, " currentfoldername: ", currentfoldername); + #endif + } + + char* FileNavigator::getCurrentFolderName() { return currentfoldername; } +} + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h new file mode 100644 index 0000000000..8e03614a46 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h @@ -0,0 +1,56 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * lcd/extui/lib/FileNavigator.h + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +#include "chiron_tft_defs.h" +#include "../../ui_api.h" + +using namespace ExtUI; + +namespace Anycubic { + class FileNavigator { + public: + FileNavigator(); + void reset(); + void getFiles(uint16_t); + void upDIR(); + void changeDIR(char *); + void sendFile(); + void refresh(); + char * getCurrentFolderName(); + private: + static FileList filelist; + static char currentfoldername[MAX_PATH_LEN]; + static uint16_t lastindex; + static uint8_t folderdepth; + static uint16_t currentindex; + }; + extern FileNavigator filenavigator; +} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp new file mode 100644 index 0000000000..f09c4db3f2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * lcd/extui/lib/Tunes.cpp + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +/*********************************************************************** + * A Utility to play tunes using the buzzer in the printer controller. * + * See Tunes.h for note and tune definitions. * + ***********************************************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "Tunes.h" +#include "../../ui_api.h" + +namespace Anycubic { + + void PlayTune(uint8_t beeperPin, const uint16_t *tune, uint8_t speed=1) { + uint8_t pos = 1; + uint16_t wholenotelen = tune[0] / speed; + do { + uint16_t freq = tune[pos]; + uint16_t notelen = wholenotelen / tune[pos + 1]; + + ::tone(beeperPin, freq, notelen); + ExtUI::delay_ms(notelen); + pos += 2; + + if (pos >= MAX_TUNE_LENGTH) break; + } while (tune[pos] != n_END); + } + +} + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h new file mode 100644 index 0000000000..1bafec43ad --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h @@ -0,0 +1,224 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * lcd/extui/lib/Tunes.h + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +/************************************************************************** + * Notes definition from https://pages.mtu.edu/~suits/NoteFreqCalcs.html * + * * + * The format of a tune is: * + * {,,, ,, ... } * + * * + * 1) The first value is the length of a whole note in milliseconds * + * 2) Then a sequence of pitch and duration pairs * + * 3) Finally the END marker so your tunes can be any length up to * + * MAX_TUNE_LEN * + *************************************************************************/ + +#include + +#define MAX_TUNE_LENGTH 128 + +// Special notes! +#define n_P 0 // silence or pause +#define n_END 10000 // end of tune marker + +// Note duration divisors +#define l_T1 1 +#define l_T2 2 +#define l_T3 3 +#define l_T4 4 +#define l_T8 8 +#define l_T16 16 + +// Note Frequency +#define n_C0 16 +#define n_CS0 17 +#define n_D0 18 +#define n_DS0 19 +#define n_E0 21 +#define n_F0 22 +#define n_FS0 23 +#define n_G0 25 +#define n_GS0 26 +#define n_A0 28 +#define n_AS0 29 +#define n_B0 31 +#define n_C1 33 +#define n_CS1 35 +#define n_D1 37 +#define n_DS1 39 +#define n_E1 41 +#define n_F1 44 +#define n_FS1 46 +#define n_G1 49 +#define n_GS1 52 +#define n_A1 55 +#define n_AS1 58 +#define n_B1 62 +#define n_C2 65 +#define n_CS2 69 +#define n_D2 73 +#define n_DS2 78 +#define n_E2 82 +#define n_F2 87 +#define n_FS2 93 +#define n_G2 98 +#define n_GS2 104 +#define n_A2 110 +#define n_AS2 117 +#define n_B2 123 +#define n_C3 131 +#define n_CS3 139 +#define n_D3 147 +#define n_DS3 156 +#define n_E3 165 +#define n_F3 175 +#define n_FS3 185 +#define n_G3 196 +#define n_GS3 208 +#define n_A3 220 +#define n_AS3 233 +#define n_B3 247 +#define n_C4 262 +#define n_CS4 277 +#define n_D4 294 +#define n_DS4 311 +#define n_E4 330 +#define n_F4 349 +#define n_FS4 370 +#define n_G4 392 +#define n_GS4 415 +#define n_A4 440 +#define n_AS4 466 +#define n_B4 494 +#define n_C5 523 +#define n_CS5 554 +#define n_D5 587 +#define n_DS5 622 +#define n_E5 659 +#define n_F5 698 +#define n_FS5 740 +#define n_G5 784 +#define n_GS5 831 +#define n_A5 880 +#define n_AS5 932 +#define n_B5 988 +#define n_C6 1047 +#define n_CS6 1109 +#define n_D6 1175 +#define n_DS6 1245 +#define n_E6 1319 +#define n_F6 1397 +#define n_FS6 1480 +#define n_G6 1568 +#define n_GS6 1661 +#define n_A6 1760 +#define n_AS6 1865 +#define n_B6 1976 +#define n_C7 2093 +#define n_CS7 2217 +#define n_D7 2349 +#define n_DS7 2489 +#define n_E7 2637 +#define n_F7 2794 +#define n_FS7 2960 +#define n_G7 3136 +#define n_GS7 3322 +#define n_A7 3520 +#define n_AS7 3729 +#define n_B7 3951 +#define n_C8 4186 +#define n_CS8 4435 +#define n_D8 4699 +#define n_DS8 4978 +#define n_E8 5274 +#define n_F8 5587 +#define n_FS8 5920 +#define n_G8 6272 +#define n_GS8 6645 +#define n_A8 7040 +#define n_AS8 7459 +#define n_B8 7902 + +namespace Anycubic { + + void PlayTune(uint8_t beeperPin, const uint16_t *tune, uint8_t speed); + + // Only uncomment the tunes you are using to save memory + // This will help you write tunes! + // https://www.apronus.com/music/flashpiano.htm + + const uint16_t SOS[] = { + 250, + n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T1, + n_G6,l_T1, n_P,l_T3, n_G6,l_T1, n_P,l_T3, n_G6,l_T1, n_P,l_T1, + n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T1, + n_END + }; + + const uint16_t BeepBeep[] = { + 500, + n_C7,l_T8, n_P,l_T16, n_C7,l_T8, n_P,l_T8, + n_END + }; + + const uint16_t BeepBeepBeeep[] = { + 1000, + n_G7,l_T4, n_P,l_T16, n_G7,l_T4, n_P,l_T8, n_G7,l_T2, + n_END + }; + + const uint16_t Anycubic_PowerOn[] = { + 1000, + n_F7,l_T8, n_P,l_T8, n_C7,l_T8, n_P,l_T8, n_D7,l_T8, n_P,l_T8, + n_E7,l_T8, n_P,l_T8, n_D7,l_T4, n_P,l_T4, n_G7,l_T4, n_P,l_T4, + n_A7,l_T2, n_P,l_T1, + n_END + }; + + const uint16_t GB_PowerOn[] = { + 500, + n_C6,l_T4, n_P,l_T16, n_C7,l_T2, n_P,l_T8, + n_END + }; + + const uint16_t Heater_Timedout[] = { + 1000, + n_C6,l_T1, + n_END + }; + + const uint16_t FilamentOut[] = { + 1000, + n_AS7,l_T4, n_P,l_T16, n_FS7,l_T2, + n_END + }; + +} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp new file mode 100644 index 0000000000..5e492573e7 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -0,0 +1,896 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * lcd/extui/lib/chiron_tft.cpp + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "chiron_tft.h" +#include "Tunes.h" +#include "FileNavigator.h" + +#include "../../../../gcode/queue.h" +#include "../../../../sd/cardreader.h" +#include "../../../../libs/numtostr.h" +#include "../../../../MarlinCore.h" +namespace Anycubic { + + printer_state_t ChironTFT::printer_state; + paused_state_t ChironTFT::pause_state; + heater_state_t ChironTFT::hotend_state; + heater_state_t ChironTFT::hotbed_state; + xy_uint8_t ChironTFT::selectedmeshpoint; + char ChironTFT::selectedfile[MAX_PATH_LEN]; + char ChironTFT::panel_command[MAX_CMND_LEN]; + uint8_t ChironTFT::command_len; + float ChironTFT::live_Zoffset; + file_menu_t ChironTFT::file_menu; + + ChironTFT::ChironTFT(){} + + void ChironTFT::Startup() { + selectedfile[0] = '\0'; + panel_command[0] = '\0'; + command_len = 0; + printer_state = AC_printer_idle; + pause_state = AC_paused_idle; + hotend_state = AC_heater_off; + hotbed_state = AC_heater_off; + live_Zoffset = 0.0; + file_menu = AC_menu_file; + + // Setup pins for powerloss detection + // Two IO pins are connected on the Trigorilla Board + // On a power interruption the OUTAGECON_PIN goes low. + + #if ENABLED(POWER_LOSS_RECOVERY) + OUT_WRITE(OUTAGECON_PIN, HIGH); + #endif + + // Filament runout is handled by Marlin settings in Configuration.h + // set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. + // enable FIL_RUNOUT_PULLUP + + TFTSer.begin(115200); + + // Signal Board has reset + SendtoTFTLN(AC_msg_main_board_has_reset); + + safe_delay(200); + + // Enable levelling and Disable end stops during print + // as Z home places nozzle above the bed so we need to allow it past the end stops + injectCommands_P(AC_cmnd_enable_levelling); //M211 S0\n")); + + // Startup tunes are defined in Tunes.h + //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1); + PlayTune(BEEPER_PIN, GB_PowerOn, 1); + #if ACDEBUGLEVEL + SERIAL_ECHOLNPAIR("AC Debug Level ", ACDEBUGLEVEL); + #endif + SendtoTFTLN(AC_msg_ready); + } + + void ChironTFT::IdleLoop() { + if (ReadTFTCommand()) { + ProcessPanelRequest(); + command_len = 0; + } + CheckHeaters(); + } + + void ChironTFT::PrinterKilled(PGM_P error,PGM_P component) { + SendtoTFTLN(AC_msg_kill_lcd); + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("PrinterKilled()\nerror: ", error , "\ncomponent: ", component); + #endif + } + + void ChironTFT::MediaEvent(media_event_t event) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("ProcessMediaStatus() ", event); + #endif + switch (event) { + case AC_media_inserted: + SendtoTFTLN(AC_msg_sd_card_inserted); + break; + + case AC_media_removed: + SendtoTFTLN(AC_msg_sd_card_removed); + break; + + case AC_media_error: + SendtoTFTLN(AC_msg_no_sd_card); + break; + } + } + + void ChironTFT::TimerEvent(timer_event_t event) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("TimerEvent() ", event); + SERIAL_ECHOLNPAIR("Printer State: ", printer_state); + #endif + + switch (event) { + case AC_timer_started: { + live_Zoffset = 0.0; // reset print offset + setSoftEndstopState(false); // disable endstops to print + printer_state = AC_printer_printing; + SendtoTFTLN(AC_msg_print_from_sd_card); + } break; + + case AC_timer_paused: { + printer_state = AC_printer_paused; + pause_state = AC_paused_idle; + SendtoTFTLN(AC_msg_paused); + } break; + + case AC_timer_stopped: { + if (printer_state != AC_printer_idle) { + printer_state = AC_printer_stopping; + SendtoTFTLN(AC_msg_print_complete); + } + setSoftEndstopState(true); // enable endstops + } break; + } + } + + void ChironTFT::FilamentRunout() { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("FilamentRunout() printer_state ", printer_state); + #endif + // 1 Signal filament out + SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); + //printer_state = AC_printer_filament_out; + PlayTune(BEEPER_PIN, FilamentOut, 1); + } + + void ChironTFT::ConfirmationRequest(const char * const msg) { + // M108 continue + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("ConfirmationRequest() ", msg, " printer_state:", printer_state); + #endif + switch (printer_state) { + case AC_printer_pausing: { + if ( (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) || (strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0 ) ) { + SendtoTFTLN(AC_msg_paused); // enable continue button + printer_state = AC_printer_paused; + } + } break; + + case AC_printer_resuming_from_power_outage: + case AC_printer_printing: + case AC_printer_paused: { + // Heater timout, send acknowledgement + if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0 ) { + pause_state = AC_paused_heater_timed_out; + SendtoTFTLN(AC_msg_paused); // enable continue button + PlayTune(BEEPER_PIN,Heater_Timedout,1); + } + // Reheat finished, send acknowledgement + else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0 ) { + pause_state = AC_paused_idle; + SendtoTFTLN(AC_msg_paused); // enable continue button + } + // Filament Purging, send acknowledgement enter run mode + else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0 ) { + pause_state = AC_paused_purging_filament; + SendtoTFTLN(AC_msg_paused); // enable continue button + } + } break; + default: + break; + } + } + + void ChironTFT::StatusChange(const char * const msg) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("StatusChange() ", msg); + SERIAL_ECHOLNPAIR("printer_state:", printer_state); + #endif + bool msg_matched = false; + // The only way to get printer status is to parse messages + // Use the state to minimise the work we do here. + switch (printer_state) { + case AC_printer_probing: { + // If probing completes ok save the mesh and park + if (strcmp_P(msg, MARLIN_msg_ready) == 0 ) { + injectCommands_P(PSTR("M500\nG27")); + SendtoTFTLN(AC_msg_probing_complete); + printer_state = AC_printer_idle; + msg_matched = true; + } + // If probing fails dont save the mesh raise the probe above the bad point + if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0 ) { + PlayTune(BEEPER_PIN, BeepBeepBeeep, 1); + injectCommands_P(PSTR("G1 Z50 F500")); + SendtoTFTLN(AC_msg_probing_complete); + printer_state = AC_printer_idle; + msg_matched = true; + } + } break; + + case AC_printer_printing: { + if (strcmp_P(msg, MARLIN_msg_reheating) == 0 ) { + SendtoTFTLN(AC_msg_paused); // enable continue button + msg_matched = true; + } + } break; + + case AC_printer_pausing: { + if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) { + SendtoTFTLN(AC_msg_paused); + printer_state = AC_printer_paused; + pause_state = AC_paused_idle; + msg_matched = true; + } + } break; + + case AC_printer_stopping: { + if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0 ) { + SendtoTFTLN(AC_msg_stop); + printer_state = AC_printer_idle; + msg_matched = true; + } + } break; + default: + break; + } + + // If not matched earlier see if this was a heater message + if (!msg_matched) { + if (strcmp_P(msg, MARLIN_msg_extruder_heating) == 0) { + SendtoTFTLN(AC_msg_nozzle_heating); + hotend_state = AC_heater_temp_set; + } + else if (strcmp_P(msg, MARLIN_msg_bed_heating) == 0) { + SendtoTFTLN(AC_msg_bed_heating); + hotbed_state = AC_heater_temp_set; + } + } + } + + void ChironTFT::PowerLossRecovery() { + printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover. + PlayTune(BEEPER_PIN, SOS, 1); + SERIAL_ECHOLNPGM("Resuming from power outage..."); + SERIAL_ECHOLNPGM("Select SD file then press resume"); + } + + void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEN string to the panel + #if ACDEBUG(AC_SOME) + serialprintPGM(str); + #endif + while (const char c = pgm_read_byte(str++)) TFTSer.print(c); + } + + void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { + if (str != nullptr) { + #if ACDEBUG(AC_SOME) + SERIAL_ECHO("> "); + #endif + SendtoTFT(str); + #if ACDEBUG(AC_SOME) + SERIAL_EOL(); + #endif + } + TFTSer.println(""); + } + + bool ChironTFT::ReadTFTCommand() { + bool command_ready = false; + while( (TFTSer.available() > 0) && (command_len < MAX_CMND_LEN) ) { + panel_command[command_len] = TFTSer.read(); + if(panel_command[command_len] == '\n') { + command_ready = true; + break; + } + command_len++; + } + + if(command_ready) { + panel_command[command_len] = 0x00; + #if ACDEBUG(AC_ALL) + SERIAL_ECHOLNPAIR("< ", panel_command); + #endif + #if ACDEBUG(AC_SOME) + // Ignore status request commands + uint8_t req = atoi(&panel_command[1]); + if (req > 7 && req != 20) { + SERIAL_ECHOLNPAIR("> ", panel_command); + SERIAL_ECHOLNPAIR("printer_state:", printer_state); + } + #endif + } + return command_ready; + } + + int8_t ChironTFT::Findcmndpos(const char * buff, char q) { + bool found = false; + int8_t pos = 0; + do { + if (buff[pos] == q) { + found = true; + break; + } + pos ++; + } while(pos < MAX_CMND_LEN); + if (found) return pos; + return -1; + } + + void ChironTFT::CheckHeaters() { + uint8_t faultDuration = 0; float temp = 0; + + // if the hotend temp is abnormal, confirm state before signalling panel + temp = getActualTemp_celsius(E0); + if ( (temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ) { + do { + faultDuration ++; + if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { + SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp); + break; + } + delay_ms(500); + temp = getActualTemp_celsius(E0); + } while ((temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ); + } + + // if the hotbed temp is abnormal, confirm state before signalling panel + faultDuration = 0; + temp = getActualTemp_celsius(BED); + if ( (temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ) { + do { + faultDuration ++; + if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { + SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + SERIAL_ECHOLNPAIR_P("Bed temp abnormal! : ", temp); + break; + } + delay_ms(500); + temp = getActualTemp_celsius(E0); + } while ((temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ); + } + + // Update panel with hotend heater status + if (hotend_state != AC_heater_temp_reached) { + if ( WITHIN( getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1 ) ) { + SendtoTFTLN(AC_msg_nozzle_heating_done); + hotend_state = AC_heater_temp_reached; + } + } + + // Update panel with bed heater status + if (hotbed_state != AC_heater_temp_reached) { + if ( WITHIN( getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5 ) ) { + SendtoTFTLN(AC_msg_bed_heating_done); + hotbed_state = AC_heater_temp_reached; + } + } + } + + void ChironTFT::SendFileList(int8_t startindex) { + // respond to panel request for 4 files starting at index + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("## SendFileList ## ", startindex); + #endif + SendtoTFTLN(PSTR("FN ")); + filenavigator.getFiles(startindex); + SendtoTFTLN(PSTR("END")); + } + + void ChironTFT::SelectFile() { + strncpy(selectedfile,panel_command+4,command_len-4); + selectedfile[command_len-5] = '\0'; + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR_F(" Selected File: ",selectedfile); + #endif + switch (selectedfile[0]) { + case '/': // Valid file selected + SendtoTFTLN(AC_msg_sd_file_open_success); + break; + + case '<': // .. (go up folder level) + filenavigator.upDIR(); + SendtoTFTLN(AC_msg_sd_file_open_failed); + SendFileList( 0 ); + break; + default: // enter sub folder + filenavigator.changeDIR(selectedfile); + SendtoTFTLN(AC_msg_sd_file_open_failed); + SendFileList( 0 ); + break; + } + } + + void ChironTFT::InjectCommandandWait(PGM_P cmd) { + //injectCommands_P(cmnd); queue.enqueue_now_P(cmd); + //SERIAL_ECHOLN(PSTR("Inject>")); + } + + void ChironTFT::ProcessPanelRequest() { + // Break these up into logical blocks // as its easier to navigate than one huge switch case! + int8_t req = atoi(&panel_command[1]); + + // Information requests A0 - A8 and A33 + if (req <= 8 || req == 33) PanelInfo(req); + + // Simple Actions A9 - A28 + else if ( req <= 28) PanelAction(req); + + // Process Initiation + else if (req <= 34) PanelProcess(req); + + else SendtoTFTLN(); + } + + void ChironTFT::PanelInfo(uint8_t req) { + // information requests A0-A8 and A33 + switch (req) { + case 0: // A0 Get HOTEND Temp + SendtoTFT(PSTR("A0V ")); + TFTSer.println(getActualTemp_celsius(E0)); + break; + + case 1: // A1 Get HOTEND Target Temp + SendtoTFT(PSTR("A1V ")); + TFTSer.println(getTargetTemp_celsius(E0)); + break; + + case 2: // A2 Get BED Temp + SendtoTFT(PSTR("A2V ")); + TFTSer.println(getActualTemp_celsius(BED)); + break; + + case 3: // A3 Get BED Target Temp + SendtoTFT(PSTR("A3V ")); + TFTSer.println(getTargetTemp_celsius(BED)); + break; + + case 4: // A4 Get FAN Speed + SendtoTFT(PSTR("A4V ")); + TFTSer.println(getActualFan_percent(FAN0)); + break; + + case 5: // A5 Get Current Coordinates + SendtoTFT(PSTR("A5V X: ")); + TFTSer.print(getAxisPosition_mm(X)); + SendtoTFT(PSTR(" Y: ")); + TFTSer.print(getAxisPosition_mm(Y)); + SendtoTFT(PSTR(" Z: ")); + TFTSer.println(getAxisPosition_mm(Z)); + break; + + case 6: // A6 Get printing progress + if (isPrintingFromMedia()) { + SendtoTFT(PSTR("A6V ")); + TFTSer.println(ui8tostr2(getProgress_percent())); + + } + else + SendtoTFTLN(PSTR("A6V ---")); + break; + + case 7: { // A7 Get Printing Time + uint32_t time = getProgress_seconds_elapsed() / 60; + SendtoTFT(PSTR("A7V ")); + TFTSer.print(ui8tostr2(time / 60)); + SendtoTFT(PSTR(" H ")); + TFTSer.print(ui8tostr2(time % 60)); + SendtoTFT(PSTR(" M")); + #if ACDEBUG(AC_ALL) + SERIAL_ECHOLNPAIR("Print time ", ui8tostr2(time / 60), ":", ui8tostr2(time % 60)); + #endif + } break; + + case 8: // A8 Get SD Card list A8 S0 + if (!isMediaInserted()) safe_delay(500); + if (!isMediaInserted()) // Make sure the card is removed + SendtoTFTLN(AC_msg_no_sd_card); + else if (panel_command[3] == 'S') + SendFileList( atoi( &panel_command[4] ) ); + break; + + case 33: // A33 Get firmware info + SendtoTFT(PSTR("J33 ")); + SendtoTFTLN(PSTR(SHORT_BUILD_VERSION)); + break; + } + } + + void ChironTFT::PanelAction(uint8_t req) { + switch (req) { + case 9: // A9 Pause SD print + if (isPrintingFromMedia()) { + SendtoTFTLN(AC_msg_pause); + pausePrint(); + printer_state = AC_printer_pausing; + } + else + SendtoTFTLN(AC_msg_stop); + break; + + case 10: // A10 Resume SD Print + if (pause_state == AC_paused_idle || printer_state == AC_printer_resuming_from_power_outage) + resumePrint(); + else + setUserConfirmed(); + break; + + case 11: // A11 Stop SD print + if (isPrintingFromMedia()) { + printer_state = AC_printer_stopping; + stopPrint(); + } + else { + if (printer_state == AC_printer_resuming_from_power_outage) + injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery + SendtoTFTLN(AC_msg_stop); + printer_state = AC_printer_idle; + } + break; + + case 12: // A12 Kill printer + kill(); // from marlincore.h + break; + + case 13: // A13 Select file + SelectFile(); + break; + + case 14: { // A14 Start Printing + // Allows printer to restart the job if we dont want to recover + if (printer_state == AC_printer_resuming_from_power_outage) { + injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery + printer_state = AC_printer_idle; + } + #if ACDebugLevel >= 1 + SERIAL_ECHOLNPAIR_F("Print: ", selectedfile); + #endif + // the card library needs a path starting // but the File api doesn't... + char file[MAX_PATH_LEN]; + file[0] = '/'; + strcpy(file + 1, selectedfile); + printFile(file); + SendtoTFTLN(AC_msg_print_from_sd_card); + } break; + + case 15: // A15 Resuming from outage + if (printer_state == AC_printer_resuming_from_power_outage) + // Need to home here to restore the Z position + injectCommands_P(AC_cmnd_power_loss_recovery); + + injectCommands_P(PSTR("M1000\n")); // home and start recovery + break; + + case 16: { // A16 Set HotEnd temp A17 S170 + const float set_Htemp = atof(&panel_command[5]); + hotend_state = set_Htemp ? AC_heater_temp_set : AC_heater_off; + switch ((char)panel_command[4]) { + // Set Temp + case 'S': case 'C': setTargetTemp_celsius(set_Htemp, E0); + } + } break; + + case 17: { // A17 Set bed temp + const float set_Btemp = atof(&panel_command[5]); + hotbed_state = set_Btemp ? AC_heater_temp_set : AC_heater_off; + if (panel_command[4] == 'S') + setTargetTemp_celsius(set_Btemp, BED); + } break; + + case 18: // A18 Set Fan Speed + if (panel_command[4] == 'S') + setTargetFan_percent(atof(&panel_command[5]), FAN0); + break; + + case 19: // A19 Motors off + if (!isPrinting()) { + disable_all_steppers(); // from marlincore.h + SendtoTFTLN(AC_msg_ready); + } + break; + + case 20: // A20 Read/write print speed + if (panel_command[4] == 'S') + setFeedrate_percent(atoi(&panel_command[5])); + else { + SendtoTFT(PSTR("A20V ")); + TFTSer.println(getFeedrate_percent()); + } + break; + + case 21: // A21 Home Axis A21 X + if (!isPrinting()) { + switch ((char)panel_command[4]) { + case 'X': injectCommands_P(PSTR("G28 X\n")); break; + case 'Y': injectCommands_P(PSTR("G28 Y\n")); break; + case 'Z': injectCommands_P(PSTR("G28 Z\n")); break; + case 'C': injectCommands_P(PSTR("G28\n")); break; + } + } + break; + + case 22: // A22 Move Axis A22 Y +10F3000 + // Ignore request if printing + if (!isPrinting()) { + // setAxisPosition_mm() uses pre defined manual feedrates so ignore the feedrate from the panel + setSoftEndstopState(true); // enable endstops + float newposition = atof(&panel_command[6]); + + #if ACDEBUG(AC_ACTION) + SERIAL_ECHOLNPAIR("Nudge ", panel_command[4], " axis ", newposition); + #endif + + switch (panel_command[4]) { + case 'X': setAxisPosition_mm(getAxisPosition_mm(X) + newposition, X); break; + case 'Y': setAxisPosition_mm(getAxisPosition_mm(Y) + newposition, Y); break; + case 'Z': setAxisPosition_mm(getAxisPosition_mm(Z) + newposition, Z); break; + case 'E': // The only time we get this command is from the filament load/unload menu + // the standard movement is too slow so we will use the load unlod GCode to speed it up a bit + if (canMove(E0) && !commandsInQueue()) + injectCommands_P(newposition > 0 ? AC_cmnd_manual_load_filament : AC_cmnd_manual_unload_filament); + break; + } + } + break; + + case 23: // A23 Preheat PLA + // Ignore request if printing + if (!isPrinting()) { + // Temps defined in configuration.h + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); + SendtoTFTLN(); + hotbed_state = AC_heater_temp_set; + hotend_state = AC_heater_temp_set; + } + break; + + case 24: // A24 Preheat ABS + // Ignore request if printing + if (!isPrinting()) { + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); + SendtoTFTLN(); + hotbed_state = AC_heater_temp_set; + hotend_state = AC_heater_temp_set; + } + break; + + case 25: // A25 Cool Down + // Ignore request if printing + if (!isPrinting()) { + setTargetTemp_celsius(0, E0); + setTargetTemp_celsius(0, BED); + SendtoTFTLN(AC_msg_ready); + hotbed_state = AC_heater_off; + hotend_state = AC_heater_off; + } + break; + + case 26: // A26 Refresh SD + // M22 M21 maybe needed here to reset sd card + filenavigator.reset(); + break; + + case 27: // A27 Servo Angles adjust + break; + + case 28: // A28 Filament set A28 O/C + // Ignore request if printing + if (isPrinting()) break; + SendtoTFTLN(); + break; + } + } + + void ChironTFT::PanelProcess(uint8_t req) { + switch (req) { + case 29: { // A29 Read Mesh Point A29 X1 Y1 + xy_uint8_t pos; + float pos_z; + pos.x = atoi(&panel_command[5]); + pos.y = atoi(&panel_command[8]); + pos_z = getMeshPoint(pos); + + SendtoTFT(PSTR("A29V ")); + TFTSer.println(pos_z * 100); + if (!isPrinting()) { + setSoftEndstopState(true); // disable endstops + // If the same meshpoint is selected twice in a row, move the head to that ready for adjustment + if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { + if (!isPositionKnown()) + injectCommands_P(PSTR("G28\n")); // home + + if (isPositionKnown()) { + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Moving to mesh point at x: ", pos.x, " y: ", pos.y, " z: ", pos_z); + #endif + // Go up before moving + setAxisPosition_mm(3.0,Z); + + setAxisPosition_mm(17 + (93 * pos.x), X); + setAxisPosition_mm(20 + (93 * pos.y), Y); + setAxisPosition_mm(0.0, Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Current Z: ", getAxisPosition_mm(Z)); + #endif + } + } + selectedmeshpoint.x = pos.x; + selectedmeshpoint.y = pos.y; + } + } break; + + case 30: { // A30 Auto leveling + if (panel_command[3] == 'S') { // Start probing + // Ignore request if printing + if (isPrinting()) + SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling + else { + injectCommands_P(isMachineHomed() ? PSTR("G29") : PSTR("G28\nG29")); + printer_state = AC_printer_probing; + SendtoTFTLN(AC_msg_start_probing); + } + } + else SendtoTFTLN(AC_msg_start_probing); + } break; + + case 31: { // A31 Adjust all Probe Points + switch (panel_command[3]) { + case 'C': // Restore and apply original offsets + if (!isPrinting()) { + injectCommands_P(PSTR("M501\nM420 S1\n")); + selectedmeshpoint.x = 99; + selectedmeshpoint.y = 99; + } + break; + case 'D': // Save Z Offset tables and restore levelling state + if (!isPrinting()) { + setAxisPosition_mm(1.0,Z); + injectCommands_P(PSTR("M500\n")); + selectedmeshpoint.x = 99; + selectedmeshpoint.y = 99; + } + break; + case 'G': // Get current offset + SendtoTFT(PSTR("A31V ")); + // When printing use the live z Offset position + // we will use babystepping to move the print head + if (isPrinting()) + TFTSer.println(live_Zoffset); + else { + TFTSer.println(getZOffset_mm()); + selectedmeshpoint.x = 99; + selectedmeshpoint.y = 99; + } + break; + case 'S': { // Set offset (adjusts all points by value) + float Zshift = atof(&panel_command[4]); + setSoftEndstopState(false); // disable endstops + // Allow temporary Z position nudging during print + // From the levelling panel use the all points UI to adjust the print pos. + if (isPrinting()) { + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift); + #endif + if (isAxisPositionKnown(Z)) { + #if ACDEBUG(AC_INFO) + const float currZpos = getAxisPosition_mm(Z); + SERIAL_ECHOLNPAIR("Nudge Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); + #endif + // Use babystepping to adjust the head position + int16_t steps = mmToWholeSteps(constrain(Zshift,-0.05,0.05), Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Steps to move Z: ", steps); + #endif + babystepAxis_steps(steps, Z); + live_Zoffset += Zshift; + } + SendtoTFT(PSTR("A31V ")); + TFTSer.println(live_Zoffset); + } + else { + GRID_LOOP(x, y) { + const xy_uint8_t pos { x, y }; + const float currval = getMeshPoint(pos); + setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); + } + const float currZOffset = getZOffset_mm(); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change probe offset from ", currZOffset, " to ", currZOffset + Zshift); + #endif + + setZOffset_mm(currZOffset + Zshift); + SendtoTFT(PSTR("A31V ")); + TFTSer.println(getZOffset_mm()); + + if (isAxisPositionKnown(Z)) { + // Move Z axis + const float currZpos = getAxisPosition_mm(Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); + #endif + setAxisPosition_mm(currZpos+constrain(Zshift,-0.05,0.05),Z); + } + } + } break; + } // end switch + } break; + + case 32: { // A32 clean leveling beep flag + // Ignore request if printing + //if (isPrinting()) break; + //injectCommands_P(PSTR("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000")); + //TFTSer.println(""); + } break; + + // A33 firmware info request seet PanelInfo() + + case 34: { // A34 Adjust single mesh point A34 C/S X1 Y1 V123 + if (panel_command[3] == 'C') { // Restore original offsets + injectCommands_P(PSTR("M501\nM420 S1")); + selectedmeshpoint.x = 99; + selectedmeshpoint.y = 99; + //printer_state = AC_printer_idle; + } + else { + xy_uint8_t pos; + pos.x = atoi(&panel_command[5]); + pos.y = atoi(&panel_command[8]); + + float currmesh = getMeshPoint(pos); + float newval = atof(&panel_command[11])/100; + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change mesh point x:", pos.x, " y:", pos.y); + SERIAL_ECHOLNPAIR("from ", currmesh, " to ", newval); + #endif + // Update Meshpoint + setMeshPoint(pos,newval); + if ( (printer_state == AC_printer_idle) || (printer_state == AC_printer_probing) ) {//!isPrinting()) { + // if we are at the current mesh point indicated on the panel Move Z pos +/- 0.05mm ( The panel changes the mesh value by +/- 0.05mm on each button press) + if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { + setSoftEndstopState(false); + float currZpos = getAxisPosition_mm(Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(newval - currmesh, -0.05, 0.05)); + #endif + setAxisPosition_mm(currZpos + constrain(newval - currmesh, -0.05, 0.05), Z); + } + } + } + } break; + } + } +} // namespace + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h new file mode 100644 index 0000000000..267f2fe978 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h @@ -0,0 +1,77 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * lcd/extui/lib/chiron_tft.h + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +#include "chiron_tft_defs.h" +#include "../../../../inc/MarlinConfigPre.h" +#include "../../ui_api.h" +namespace Anycubic { + + class ChironTFT { + static printer_state_t printer_state; + static paused_state_t pause_state; + static heater_state_t hotend_state; + static heater_state_t hotbed_state; + static xy_uint8_t selectedmeshpoint; + static char panel_command[MAX_CMND_LEN]; + static uint8_t command_len; + static char selectedfile[MAX_PATH_LEN]; + static float live_Zoffset; + static file_menu_t file_menu; + public: + ChironTFT(); + void Startup(); + void IdleLoop(); + void PrinterKilled(PGM_P,PGM_P); + void MediaEvent(media_event_t); + void TimerEvent(timer_event_t); + void FilamentRunout(); + void ConfirmationRequest(const char * const ); + void StatusChange(const char * const ); + void PowerLossRecovery(); + + private: + void SendtoTFT(PGM_P); + void SendtoTFTLN(PGM_P); + bool ReadTFTCommand(); + int8_t Findcmndpos(const char *, char); + void CheckHeaters(); + void SendFileList(int8_t); + void SelectFile(); + void InjectCommandandWait(PGM_P); + void ProcessPanelRequest(); + void PanelInfo(uint8_t); + void PanelAction(uint8_t); + void PanelProcess(uint8_t); + }; + + extern ChironTFT Chiron; + +} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h new file mode 100644 index 0000000000..937bdfde33 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -0,0 +1,151 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * lcd/extui/lib/chiron_defs.h + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +#pragma once +#include "../../../../inc/MarlinConfigPre.h" +//#define ACDEBUGLEVEL 255 + +#if ACDEBUGLEVEL + // Bit-masks for selective debug: + enum ACDebugMask : uint8_t { + AC_INFO = 1, + AC_ACTION = 2, + AC_FILE = 4, + AC_PANEL = 8, + AC_MARLIN = 16, + AC_SOME = 32, + AC_ALL = 64 + }; + #define ACDEBUG(mask) ( ((mask) & ACDEBUGLEVEL) == mask ) // Debug flag macro +#else + #define ACDEBUG(mask) false +#endif + +#define TFTSer LCD_SERIAL // Serial interface for TFT panel now uses marlinserial +#define MAX_FOLDER_DEPTH 4 // Limit folder depth TFT has a limit for the file path +#define MAX_CMND_LEN 16 * MAX_FOLDER_DEPTH // Maximum Length for a Panel command +#define MAX_PATH_LEN 16 * MAX_FOLDER_DEPTH // Maximum number of characters in a SD file path + +#define AC_HEATER_FAULT_VALIDATION_TIME 5 // number of 1/2 second loops before signalling a heater fault +#define AC_LOWEST_MESHPOINT_VAL -7.00 // The lowest value you can set for a single mesh point offset + + // TFT panel commands +#define AC_msg_sd_card_inserted PSTR("J00") +#define AC_msg_sd_card_removed PSTR("J01") +#define AC_msg_no_sd_card PSTR("J02") +#define AC_msg_usb_connected PSTR("J03") +#define AC_msg_print_from_sd_card PSTR("J04") +#define AC_msg_pause PSTR("J05") +#define AC_msg_nozzle_heating PSTR("J06") +#define AC_msg_nozzle_heating_done PSTR("J07") +#define AC_msg_bed_heating PSTR("J08") +#define AC_msg_bed_heating_done PSTR("J09") +#define AC_msg_nozzle_temp_abnormal PSTR("J10") +#define AC_msg_kill_lcd PSTR("J11") +#define AC_msg_ready PSTR("J12") +#define AC_msg_low_nozzle_temp PSTR("J13") +#define AC_msg_print_complete PSTR("J14") +#define AC_msg_filament_out_alert PSTR("J15") +#define AC_msg_stop PSTR("J16") +#define AC_msg_main_board_has_reset PSTR("J17") +#define AC_msg_paused PSTR("J18") +#define AC_msg_j19_unknown PSTR("J19") +#define AC_msg_sd_file_open_success PSTR("J20") +#define AC_msg_sd_file_open_failed PSTR("J21") +#define AC_msg_level_monitor_finished PSTR("J22") +#define AC_msg_filament_out_block PSTR("J23") +#define AC_msg_probing_not_allowed PSTR("J24") +#define AC_msg_probing_complete PSTR("J25") +#define AC_msg_start_probing PSTR("J26") +#define AC_msg_version PSTR("J27") + +#define MARLIN_msg_start_probing PSTR("Probing Point 1/25") +#define MARLIN_msg_probing_failed PSTR("Probing Failed") +#define MARLIN_msg_ready PSTR("3D Printer Ready.") +#define MARLIN_msg_print_paused PSTR("Print Paused") +#define MARLIN_msg_print_aborted PSTR("Print Aborted") +#define MARLIN_msg_extruder_heating PSTR("E Heating...") +#define MARLIN_msg_bed_heating PSTR("Bed Heating...") + +#define MARLIN_msg_nozzle_parked PSTR("Nozzle Parked") +#define MARLIN_msg_heater_timeout PSTR("Heater Timeout") +#define MARLIN_msg_reheating PSTR("Reheating...") +#define MARLIN_msg_reheat_done PSTR("Reheat finished.") +#define MARLIN_msg_filament_purging PSTR("Filament Purging...") +#define MARLIN_msg_special_pause PSTR("PB") +#define AC_cmnd_auto_unload_filament PSTR("M701") // Use Marlin unload routine +#define AC_cmnd_auto_load_filament PSTR("M702 M0 PB") // Use Marlin load routing then pause for user to clean nozzle + +#define AC_cmnd_manual_load_filament PSTR("M83\nG1 E50 F700\nM82") // replace the manual panel commands with something a little faster +#define AC_cmnd_manual_unload_filament PSTR("M83\nG1 E-50 F1200\nM82") +#define AC_cmnd_enable_levelling PSTR("M420 S1 V1") +#define AC_cmnd_power_loss_recovery PSTR("G28 X Y R5\nG28 Z") // Lift, home X and Y then home Z when in 'safe' position + +namespace Anycubic { + enum heater_state_t : uint8_t { + AC_heater_off, + AC_heater_temp_set, + AC_heater_temp_reached + }; + + enum paused_state_t : uint8_t { + AC_paused_heater_timed_out, + AC_paused_purging_filament, + AC_paused_idle + }; + + enum printer_state_t : uint8_t { + AC_printer_idle, + AC_printer_probing, + AC_printer_printing, + AC_printer_pausing, + AC_printer_paused, + AC_printer_stopping, + AC_printer_resuming_from_power_outage + }; + + enum timer_event_t : uint8_t { + AC_timer_started, + AC_timer_paused, + AC_timer_stopped + }; + + enum media_event_t : uint8_t { + AC_media_inserted, + AC_media_removed, + AC_media_error + }; + enum file_menu_t : uint8_t { + AC_menu_file, + AC_menu_command, + AC_menu_change_to_file, + AC_menu_change_to_command + }; +} diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index c69fb8351a..b383cee09c 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -24,16 +24,17 @@ #if ENABLED(ANYCUBIC_LCD_I3MEGA) #include "anycubic_i3mega_lcd.h" - -#include "../../../../inc/MarlinConfig.h" #include "../../ui_api.h" -#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers + +#include "../../../../libs/numtostr.h" #include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage +#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +#include "../../../../inc/MarlinConfig.h" // command sending macro's with debugging capability #define SEND_PGM(x) send_P(PSTR(x)) #define SENDLINE_PGM(x) sendLine_P(PSTR(x)) -#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(itostr3(y))) +#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i8tostr3rj(y))) #define SEND(x) send(x) #define SENDLINE(x) sendLine(x) #if ENABLED(ANYCUBIC_LCD_DEBUG) @@ -44,20 +45,8 @@ #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) #endif - AnycubicTFTClass AnycubicTFT; -char _conv[8]; - -char *itostr2(const uint8_t &x) { - // sprintf(conv,"%5.1f",x); - int xx = x; - _conv[0] = (xx / 10) % 10 + '0'; - _conv[1] = (xx) % 10 + '0'; - _conv[2] = 0; - return _conv; -} - static void sendNewLine(void) { LCD_SERIAL.write('\r'); LCD_SERIAL.write('\n'); @@ -82,34 +71,6 @@ static void sendLine_P(PGM_P str) { sendNewLine(); } -#ifndef ULTRA_LCD - #define DIGIT(n) ('0' + (n)) - #define DIGIMOD(n, f) DIGIT((n) / (f) % 10) - #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') - #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) - - char* itostr3(const int x) { - int xx = x; - _conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); - _conv[5] = RJDIGIT(xx, 10); - _conv[6] = DIGIMOD(xx, 1); - return &_conv[4]; - } - -// Convert signed float to fixed-length string with 023.45 / -23.45 format - char *ftostr32(const float &x) { - long xx = x * 100; - _conv[1] = MINUSOR(xx, DIGIMOD(xx, 10000)); - _conv[2] = DIGIMOD(xx, 1000); - _conv[3] = DIGIMOD(xx, 100); - _conv[4] = '.'; - _conv[5] = DIGIMOD(xx, 10); - _conv[6] = DIGIMOD(xx, 1); - return &_conv[1]; - } - -#endif - AnycubicTFTClass::AnycubicTFTClass() {} void AnycubicTFTClass::OnSetup() { @@ -181,7 +142,7 @@ void AnycubicTFTClass::OnKillTFT() { void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered..."); - SERIAL_ECHO(itostr2(isInserted)); + SERIAL_ECHO(ui8tostr2(isInserted)); SERIAL_EOL(); #endif DoSDCardStateCheck(); @@ -622,19 +583,15 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 3: { // A3 GET HOTBED TARGET TEMP float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); - } - break; + } break; - case 4: // A4 GET FAN SPEED - { + case 4: { // A4 GET FAN SPEED float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); fanPercent = constrain(fanPercent, 0, 100); SEND_PGM_VAL("A4V ", int(fanPercent)); - } - break; + } break; - case 5: // A5 GET CURRENT COORDINATE - { + case 5: { // A5 GET CURRENT COORDINATE float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); @@ -645,39 +602,34 @@ void AnycubicTFTClass::GetCommandFromTFT() { SEND_PGM(" Z: "); LCD_SERIAL.print(zPostition); SENDLINE_PGM(""); - } - break; + } break; case 6: // A6 GET SD CARD PRINTING STATUS #if ENABLED(SDSUPPORT) if (ExtUI::isPrintingFromMedia()) { SEND_PGM("A6V "); - if (ExtUI::isMediaInserted()) { - SENDLINE(itostr3(int(ExtUI::getProgress_percent()))); - } - else { + if (ExtUI::isMediaInserted()) + SENDLINE(ui8tostr3rj(ExtUI::getProgress_percent())); + else SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); - } } - else { + else SENDLINE_PGM("A6V ---"); - } #endif break; case 7: { // A7 GET PRINTING TIME - uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); + const uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); SEND_PGM("A7V "); if (elapsedSeconds != 0) { // print time - uint32_t elapsedMinutes = elapsedSeconds / 60; - SEND(itostr2(elapsedMinutes / 60)); + const uint32_t elapsedMinutes = elapsedSeconds / 60; + SEND(ui8tostr2(elapsedMinutes / 60)); SEND_PGM(" H "); - SEND(itostr2(elapsedMinutes % 60)); + SEND(ui8tostr2(elapsedMinutes % 60)); SENDLINE_PGM(" M"); } - else { + else SENDLINE_PGM(" 999:999"); - } } break; @@ -692,7 +644,6 @@ void AnycubicTFTClass::GetCommandFromTFT() { #if ENABLED(SDSUPPORT) if (ExtUI::isPrintingFromMedia()) PausePrint(); - #endif break; @@ -700,14 +651,11 @@ void AnycubicTFTClass::GetCommandFromTFT() { #if ENABLED(SDSUPPORT) if (ExtUI::isPrintingFromMediaPaused()) ResumePrint(); - #endif break; case 11: // A11 STOP SD PRINT - #if ENABLED(SDSUPPORT) - StopPrint(); - #endif + TERN_(SDSUPPORT, StopPrint()); break; case 12: // A12 kill @@ -748,7 +696,6 @@ void AnycubicTFTClass::GetCommandFromTFT() { #if ENABLED(SDSUPPORT) if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) StartPrint(); - #endif break; @@ -771,8 +718,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } break; - case 17:// A17 set heated bed temp - { + case 17: { // A17 set heated bed temp unsigned int tempbed; if (CodeSeen('S')) { tempbed = constrain(CodeValue(), 0, 100); @@ -781,19 +727,17 @@ void AnycubicTFTClass::GetCommandFromTFT() { } break; - case 18:// A18 set fan speed - { + case 18: { // A18 set fan speed float fanPercent; if (CodeSeen('S')) { fanPercent = CodeValue(); fanPercent = constrain(fanPercent, 0, 100); ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); } - else { + else fanPercent = 100; - } - ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); SENDLINE_PGM(""); } break; @@ -807,13 +751,11 @@ void AnycubicTFTClass::GetCommandFromTFT() { SENDLINE_PGM(""); break; - case 20: { // A20 read printing speed - + case 20: // A20 read printing speed if (CodeSeen('S')) feedrate_percentage = constrain(CodeValue(), 40, 999); else SEND_PGM_VAL("A20V ", feedrate_percentage); - } break; case 21: // A21 all home diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h index ee011f1dfe..a4ecf5604f 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h @@ -23,12 +23,6 @@ #include "../../../../inc/MarlinConfigPre.h" #include "../../../../sd/SdFatConfig.h" // for the FILENAME_LENGTH macro -char *itostr2(const uint8_t &x); -#ifndef ULTRA_LCD - char *itostr3(const int); - char *ftostr32(const float &); -#endif - #define TFTBUFSIZE 4 #define TFT_MAX_CMD_SIZE 96 diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index 3b36c180e8..c3efb2b25a 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -52,6 +52,13 @@ const char* ui8tostr3rj(const uint8_t i) { return &conv[4]; } +// Convert uint8_t to string with 12 format +const char* ui8tostr2(const uint8_t i) { + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[5]; +} + // Convert signed 8bit int to rj string with 123 or -12 format const char* i8tostr3rj(const int8_t x) { int xx = x; diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index e52a7d9889..e7c1e67e12 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -26,6 +26,9 @@ // Convert a full-range unsigned 8bit int to a percentage const char* ui8tostr4pctrj(const uint8_t i); +// Convert uint8_t to string with 12 format +const char* ui8tostr2(const uint8_t x); + // Convert uint8_t to string with 123 format const char* ui8tostr3rj(const uint8_t i); From 059d966d7b6bdb84d29c09afc2038d227724a479 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 30 Sep 2020 22:06:32 -0300 Subject: [PATCH 0323/1370] Fix Move Screen with disabled Touch (#19558) --- Marlin/src/lcd/tft/ui_480x320.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index ffc619e8dc..549cbc4d9b 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -924,7 +924,7 @@ static void do_home() { drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING)); queue.inject_P(G28_STR); // Disable touch until home is done - touch.disable(); + TERN_(HAS_TFT_XPT2046, touch.disable()); drawAxisValue(E_AXIS); drawAxisValue(X_AXIS); drawAxisValue(Y_AXIS); @@ -972,14 +972,14 @@ static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage i tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); } - if (enabled) touch.add_control(BUTTON, x, y, width, height, data); + TERN_(HAS_TFT_XPT2046, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); } void MarlinUI::move_axis_screen() { // Reset defer_status_screen(true); motionAxisState.blocked = false; - touch.enable(); + TERN_(HAS_TFT_XPT2046, touch.enable()); ui.clear_lcd(); @@ -1016,13 +1016,13 @@ void MarlinUI::move_axis_screen() { motionAxisState.eNamePos.x = x; motionAxisState.eNamePos.y = y; drawCurESelection(); - if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select); + TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select)); x += BTN_WIDTH + spacing; drawBtn(x, y, "X-", (int32_t)x_minus, imgLeft, X_BTN_COLOR, !busy); x += BTN_WIDTH + spacing; //imgHome is 64x64 - add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy); + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy)); x += BTN_WIDTH + spacing; uint16_t xplus_x = x; @@ -1071,13 +1071,13 @@ void MarlinUI::move_axis_screen() { motionAxisState.stepValuePos.y = y; if (!busy) { drawCurStepValue(); - touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size); + TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size)); } // alinged with x+ drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (int32_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); - add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack); + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); } #undef BTN_WIDTH From 46c8775542c0ba474c7b2bca7d03beef21b9d4ef Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 30 Sep 2020 22:14:19 -0300 Subject: [PATCH 0324/1370] Fix Buzzer (pin) init for uninitialized FastIO (#19559) --- Marlin/src/MarlinCore.cpp | 5 +++++ Marlin/src/libs/buzzer.h | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8a425510c0..672858d05a 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1048,6 +1048,11 @@ void setup() { SERIAL_ECHO_MSG("Compiled: " __DATE__); SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); + // Init buzzer pin(s) + #if USE_BEEPER + SETUP_RUN(buzzer.init()); + #endif + // Set up LEDs early #if HAS_COLOR_LEDS SETUP_RUN(leds.setup()); diff --git a/Marlin/src/libs/buzzer.h b/Marlin/src/libs/buzzer.h index 022d94deaf..e901660c87 100644 --- a/Marlin/src/libs/buzzer.h +++ b/Marlin/src/libs/buzzer.h @@ -84,9 +84,9 @@ public: /** - * @brief Class constructor + * @brief Init Buzzer */ - Buzzer() { + static inline void init() { SET_OUTPUT(BEEPER_PIN); reset(); } From dc5f86e0393d9d659ee09f66182a479c7b656255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Morav=C4=8D=C3=ADk?= Date: Fri, 2 Oct 2020 00:47:24 +0200 Subject: [PATCH 0325/1370] Update Slovak language (#19561) --- Marlin/src/lcd/language/language_sk.h | 30 ++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 8a59bfc673..c9dc6b1a16 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -47,6 +47,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta vložená"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta vybraná"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("ÄŒakám na kartu"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Inicial. SD zlyhala"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Chyba Äítania karty"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB zaria. odstrán."); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Chyba spúšťania USB"); @@ -122,6 +123,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastné príkazy"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Bod"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda mimo hraníc"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchýlka"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX režim"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ofset nástrojov"); @@ -209,7 +211,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Nastavenie LED"); PROGMEM Language_Str MSG_LEDS = _UxGT("Svetlo"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Prednastavené farby"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Predvolby svetla"); PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("ÄŒervená"); PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Oranžová"); PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Žltá"); @@ -219,6 +221,10 @@ namespace Language_sk { PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fialová"); PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Biela"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("ObnoviÅ¥ nastavenie"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Kanál ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Svetlo #2"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Predvolby svetla #2"); + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Jas"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Vlastná farba"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Inten. Äervenej"); PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Inten. zelenej"); @@ -349,6 +355,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_PAUSING = _UxGT("Pozastavujem..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("PozastaviÅ¥ tlaÄ"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("ObnoviÅ¥ tlaÄ"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("SpustiÅ¥ z hosta"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("ZastaviÅ¥ tlaÄ"); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("TlaÄím objekt"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("ZruÅ¡iÅ¥ objekt"); @@ -449,6 +456,8 @@ namespace Language_sk { PROGMEM Language_Str MSG_COOLING = _UxGT("Ochladzovanie..."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ohrev podložky..."); PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ochladz. podložky..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Ohrev sondy..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Ochladz. sondy..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ohrev komory..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Ochladz. komory..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrácia"); @@ -543,7 +552,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Odstráňte, kliknite"); PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka ="); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka ~"); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Plný gradient"); @@ -570,6 +579,17 @@ namespace Language_sk { PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Chyb. index stránky"); PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Chyb. rých. stránky"); + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("ZmeniÅ¥ heslo"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Vyžad. sa prihl."); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Nastavenie hesla"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Zvoľte Äíslo"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("ZmeniÅ¥ heslo"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("OdstrániÅ¥ heslo"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Heslo je "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("ZaÄaÅ¥ odznova"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Nezabudnite uložiÅ¥!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Heslo odstránene"); + // // Filament Change screens show up to 3 lines on a 4-line display // ...or up to 2 lines on a 3-line display @@ -616,7 +636,11 @@ namespace Language_sk { PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("VyrovnaÅ¥ os X"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto-kalibrovaÅ¥"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("VyprÅ¡al Äas ohrevu"); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("VyprÅ¡al Äas ohrevu, znížená teplota. StlaÄte OK pre ohrev a eÅ¡te raz pre obnovu."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("VyprÅ¡al Äas ohrevu"); + #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("ZohriaÅ¥"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Zohrievanie..."); } From 58ce9a85c18a4fed10836be38bf280cfbdf06ade Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 1 Oct 2020 15:51:11 -0700 Subject: [PATCH 0326/1370] No move on Park = No move on Resume (#19569) --- Marlin/src/feature/pause.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index f8a7d83260..a36ff50756 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -612,11 +612,13 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Retract to prevent oozing unscaled_e_move(-(PAUSE_PARK_RETRACT_LENGTH), feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); - // Move XY to starting position, then Z - do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); + if (!axes_should_home()) { + // Move XY to starting position, then Z + do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); - // Move Z_AXIS to saved position - do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + // Move Z_AXIS to saved position + do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + } // Unretract unscaled_e_move(PAUSE_PARK_RETRACT_LENGTH, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); From bf3b36ae6a6dd66dc5988de7e3c3c6548618b93e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane?= <43587190+stef-ladefense@users.noreply.github.com> Date: Fri, 2 Oct 2020 01:09:39 +0200 Subject: [PATCH 0327/1370] Fix Anycubic i3 Mega target temperature display (#19572) Also includes a workaround for missing (probably un-fetched) long name in file listing --- .../lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index b383cee09c..efbc57e68a 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -34,7 +34,7 @@ // command sending macro's with debugging capability #define SEND_PGM(x) send_P(PSTR(x)) #define SENDLINE_PGM(x) sendLine_P(PSTR(x)) -#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i8tostr3rj(y))) +#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i16tostr3rj(y))) #define SEND(x) send(x) #define SENDLINE(x) sendLine(x) #if ENABLED(ANYCUBIC_LCD_DEBUG) @@ -496,12 +496,12 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { SEND_PGM("/"); SENDLINE(currentFileList.shortFilename()); SEND_PGM("/"); - SENDLINE(currentFileList.longFilename()); + SENDLINE(currentFileList.filename()); } else { SENDLINE(currentFileList.shortFilename()); - SENDLINE(currentFileList.longFilename()); + SENDLINE(currentFileList.filename()); } } } From 0af95b188ac68cc42024dcbbca1e21fb34957eb4 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Fri, 2 Oct 2020 01:17:11 +0200 Subject: [PATCH 0328/1370] G35 workaround for Pronterface "feature" (#19577) --- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 926e6e82c5..bd7f4f0411 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -157,7 +157,7 @@ void GcodeSuite::G35() { const int minutes = trunc(decimal_part * 60.0f); SERIAL_ECHOPAIR("Turn ", tramming_point_name[i], - " ", (screw_thread & 1) == (adjust > 0) ? "Counter-Clockwise" : "Clockwise", + " ", (screw_thread & 1) == (adjust > 0) ? "CCW" : "CW", " by ", abs(full_turns), " turns"); if (minutes) SERIAL_ECHOPAIR(" and ", abs(minutes), " minutes"); SERIAL_EOL(); From 0507df61b2940014f9b2ad57d32cb77a5deb632c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 1 Oct 2020 22:52:42 -0300 Subject: [PATCH 0329/1370] Minor SPI fixes, systick_callback for STM32F1 HAL compatibility (#19565) --- Marlin/src/HAL/STM32/HAL.cpp | 9 +++++++-- Marlin/src/HAL/STM32/HAL.h | 5 +++++ Marlin/src/HAL/STM32/HAL_SPI.cpp | 14 ++------------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index b1b727ce19..83604b1104 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -63,7 +63,7 @@ uint16_t HAL_adc_result; void HAL_init() { FastIO_init(); - #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) + #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) && (defined(SDSS) && SDSS != -1) OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up #endif @@ -122,9 +122,14 @@ extern "C" { // TODO: Make sure this doesn't cause any delay void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } - uint16_t HAL_adc_get_result() { return HAL_adc_result; } +// Reset the system (to initiate a firmware flash) void flashFirmware(const int16_t) { NVIC_SystemReset(); } +// Maple Compatibility +systickCallback_t systick_user_callback; +void systick_attach_callback(systickCallback_t cb) { systick_user_callback = cb; } +void HAL_SYSTICK_Callback() { if (systick_user_callback) systick_user_callback(); } + #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 60ab45374a..37919102ec 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -177,3 +177,8 @@ uint16_t HAL_adc_get_result(); #define PLATFORM_M997_SUPPORT void flashFirmware(const int16_t); + +// Maple Compatibility +typedef void (*systickCallback_t)(void); +void systick_attach_callback(systickCallback_t cb); +void HAL_SYSTICK_Callback(); diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp index 202442a71b..f947e6ef32 100644 --- a/Marlin/src/HAL/STM32/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp @@ -132,11 +132,9 @@ static SPISettings spiConfig; * @details Only configures SS pin since stm32duino creates and initialize the SPI object */ void spiBegin() { - #if !PIN_EXISTS(SS) - #error "SS_PIN not defined!" + #if PIN_EXISTS(SS) + OUT_WRITE(SS_PIN, HIGH); #endif - - OUT_WRITE(SS_PIN, HIGH); } // Configure SPI for specified SPI speed @@ -173,9 +171,7 @@ static SPISettings spiConfig; * @details */ uint8_t spiRec() { - SPI.beginTransaction(spiConfig); uint8_t returnByte = SPI.transfer(0xFF); - SPI.endTransaction(); return returnByte; } @@ -191,9 +187,7 @@ static SPISettings spiConfig; void spiRead(uint8_t* buf, uint16_t nbyte) { if (nbyte == 0) return; memset(buf, 0xFF, nbyte); - SPI.beginTransaction(spiConfig); SPI.transfer(buf, nbyte); - SPI.endTransaction(); } /** @@ -204,9 +198,7 @@ static SPISettings spiConfig; * @details */ void spiSend(uint8_t b) { - SPI.beginTransaction(spiConfig); SPI.transfer(b); - SPI.endTransaction(); } /** @@ -219,10 +211,8 @@ static SPISettings spiConfig; */ void spiSendBlock(uint8_t token, const uint8_t* buf) { uint8_t rxBuf[512]; - SPI.beginTransaction(spiConfig); SPI.transfer(token); SPI.transfer((uint8_t*)buf, &rxBuf, 512); - SPI.endTransaction(); } #endif // SOFTWARE_SPI From 02b17886c947c155d4add6be83b50ba2993e8e6f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 2 Oct 2020 17:04:23 -0500 Subject: [PATCH 0330/1370] Replace tabs with spaces --- Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp | 4 +- Marlin/src/lcd/tft/tft_color.h | 60 ++++++++++----------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp index c9a5b2525a..fd1b6858e8 100644 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp @@ -113,8 +113,8 @@ enum Commands { // based on Smoothieware commands // Other commands... 0xE0 thru 0xFF GET_LCD_ROW = 0xE0, // for detect panel GET_LCD_COL, // reserved for compatibility with Smoothieware, not used - LCD_PUT, // write one line to LCD - INIT_SCREEN = 0xFE, // clear panel buffer + LCD_PUT, // write one line to LCD + INIT_SCREEN = 0xFE, // clear panel buffer }; static unsigned char framebuffer[FBSIZE]; diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h index 8e380b366b..a72a079f6e 100644 --- a/Marlin/src/lcd/tft/tft_color.h +++ b/Marlin/src/lcd/tft/tft_color.h @@ -73,104 +73,104 @@ #define COLOR_BACKGROUND 0x20AC // #1E156E #endif #ifndef COLOR_SELECTION_BG - #define COLOR_SELECTION_BG 0x9930 // #992380 + #define COLOR_SELECTION_BG 0x9930 // #992380 #endif #ifndef COLOR_WEBSITE_URL - #define COLOR_WEBSITE_URL 0x03B7 + #define COLOR_WEBSITE_URL 0x03B7 #endif #ifndef COLOR_INACTIVE - #define COLOR_INACTIVE COLOR_GREY + #define COLOR_INACTIVE COLOR_GREY #endif #ifndef COLOR_COLD - #define COLOR_COLD COLOR_AQUA + #define COLOR_COLD COLOR_AQUA #endif #ifndef COLOR_HOTEND - #define COLOR_HOTEND COLOR_SCARLET + #define COLOR_HOTEND COLOR_SCARLET #endif #ifndef COLOR_HEATED_BED - #define COLOR_HEATED_BED COLOR_DARK_ORANGE + #define COLOR_HEATED_BED COLOR_DARK_ORANGE #endif #ifndef COLOR_CHAMBER - #define COLOR_CHAMBER COLOR_DARK_ORANGE + #define COLOR_CHAMBER COLOR_DARK_ORANGE #endif #ifndef COLOR_FAN - #define COLOR_FAN COLOR_AQUA + #define COLOR_FAN COLOR_AQUA #endif #ifndef COLOR_AXIS_HOMED - #define COLOR_AXIS_HOMED COLOR_WHITE + #define COLOR_AXIS_HOMED COLOR_WHITE #endif #ifndef COLOR_AXIS_NOT_HOMED - #define COLOR_AXIS_NOT_HOMED COLOR_YELLOW + #define COLOR_AXIS_NOT_HOMED COLOR_YELLOW #endif #ifndef COLOR_RATE_100 - #define COLOR_RATE_100 COLOR_VIVID_GREEN + #define COLOR_RATE_100 COLOR_VIVID_GREEN #endif #ifndef COLOR_RATE_ALTERED - #define COLOR_RATE_ALTERED COLOR_YELLOW + #define COLOR_RATE_ALTERED COLOR_YELLOW #endif #ifndef COLOR_PRINT_TIME - #define COLOR_PRINT_TIME COLOR_AQUA + #define COLOR_PRINT_TIME COLOR_AQUA #endif #ifndef COLOR_PROGRESS_FRAME - #define COLOR_PROGRESS_FRAME COLOR_WHITE + #define COLOR_PROGRESS_FRAME COLOR_WHITE #endif #ifndef COLOR_PROGRESS_BAR - #define COLOR_PROGRESS_BAR COLOR_BLUE + #define COLOR_PROGRESS_BAR COLOR_BLUE #endif #ifndef COLOR_PROGRESS_BG - #define COLOR_PROGRESS_BG COLOR_BLACK + #define COLOR_PROGRESS_BG COLOR_BLACK #endif #ifndef COLOR_STATUS_MESSAGE - #define COLOR_STATUS_MESSAGE COLOR_YELLOW + #define COLOR_STATUS_MESSAGE COLOR_YELLOW #endif #ifndef COLOR_CONTROL_ENABLED - #define COLOR_CONTROL_ENABLED COLOR_WHITE + #define COLOR_CONTROL_ENABLED COLOR_WHITE #endif #ifndef COLOR_CONTROL_DISABLED - #define COLOR_CONTROL_DISABLED COLOR_GREY + #define COLOR_CONTROL_DISABLED COLOR_GREY #endif #ifndef COLOR_CONTROL_CANCEL - #define COLOR_CONTROL_CANCEL COLOR_SCARLET + #define COLOR_CONTROL_CANCEL COLOR_SCARLET #endif #ifndef COLOR_CONTROL_CONFIRM - #define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN + #define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN #endif #ifndef COLOR_BUSY - #define COLOR_BUSY COLOR_SILVER + #define COLOR_BUSY COLOR_SILVER #endif #ifndef COLOR_MENU_TEXT - #define COLOR_MENU_TEXT COLOR_YELLOW + #define COLOR_MENU_TEXT COLOR_YELLOW #endif #ifndef COLOR_MENU_VALUE - #define COLOR_MENU_VALUE COLOR_WHITE + #define COLOR_MENU_VALUE COLOR_WHITE #endif #ifndef COLOR_SLIDER - #define COLOR_SLIDER COLOR_WHITE + #define COLOR_SLIDER COLOR_WHITE #endif #ifndef COLOR_SLIDER_INACTIVE - #define COLOR_SLIDER_INACTIVE COLOR_GREY + #define COLOR_SLIDER_INACTIVE COLOR_GREY #endif #ifndef COLOR_UBL - #define COLOR_UBL COLOR_WHITE + #define COLOR_UBL COLOR_WHITE #endif #ifndef COLOR_TOUCH_CALIBRATION - #define COLOR_TOUCH_CALIBRATION COLOR_WHITE + #define COLOR_TOUCH_CALIBRATION COLOR_WHITE #endif #ifndef COLOR_KILL_SCREEN_BG - #define COLOR_KILL_SCREEN_BG COLOR_MAROON + #define COLOR_KILL_SCREEN_BG COLOR_MAROON #endif #ifndef COLOR_KILL_SCREEN_TEXT - #define COLOR_KILL_SCREEN_TEXT COLOR_WHITE + #define COLOR_KILL_SCREEN_TEXT COLOR_WHITE #endif From 69917690f3ca522f927b9dd000f59c65a8d2149f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 2 Oct 2020 17:05:45 -0500 Subject: [PATCH 0331/1370] Adjust HAL platform defines, comments --- Marlin/src/HAL/DUE/HAL.cpp | 4 +--- Marlin/src/HAL/DUE/HAL.h | 4 +--- Marlin/src/HAL/DUE/HAL_SPI.cpp | 2 +- Marlin/src/HAL/DUE/timers.cpp | 4 +--- Marlin/src/HAL/DUE/timers.h | 4 +--- Marlin/src/HAL/ESP32/HAL.h | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 3 +-- Marlin/src/HAL/TEENSY31_32/HAL.h | 7 ++++--- Marlin/src/HAL/TEENSY31_32/Servo.cpp | 1 - Marlin/src/HAL/TEENSY31_32/eeprom.cpp | 3 +-- Marlin/src/HAL/TEENSY31_32/timers.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/timers.h | 3 +-- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 11 +++++------ Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp | 5 +++++ Marlin/src/HAL/TEENSY35_36/Servo.cpp | 6 +++++- Marlin/src/HAL/TEENSY35_36/Servo.h | 4 ++++ Marlin/src/HAL/TEENSY35_36/eeprom.cpp | 9 ++++----- Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h | 2 +- Marlin/src/HAL/TEENSY35_36/pinsDebug.h | 4 ++++ Marlin/src/HAL/TEENSY35_36/spi_pins.h | 4 ++++ Marlin/src/HAL/TEENSY35_36/timers.cpp | 3 +-- Marlin/src/HAL/TEENSY35_36/timers.h | 4 +--- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY40_41/HAL.h | 7 ++++--- Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp | 5 +++++ Marlin/src/HAL/TEENSY40_41/Servo.cpp | 6 +++++- Marlin/src/HAL/TEENSY40_41/Servo.h | 4 ++++ Marlin/src/HAL/TEENSY40_41/eeprom.cpp | 3 +-- Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h | 2 +- Marlin/src/HAL/TEENSY40_41/fastio.h | 2 +- Marlin/src/HAL/TEENSY40_41/pinsDebug.h | 4 ++++ Marlin/src/HAL/TEENSY40_41/spi_pins.h | 4 ++++ Marlin/src/HAL/TEENSY40_41/timers.cpp | 2 +- Marlin/src/HAL/TEENSY40_41/timers.h | 3 +-- Marlin/src/HAL/TEENSY40_41/watchdog.cpp | 6 +++++- Marlin/src/HAL/TEENSY40_41/watchdog.h | 2 +- Marlin/src/gcode/calibrate/M100.cpp | 2 +- Marlin/src/pins/teensy3/pins_TEENSY31_32.h | 2 +- Marlin/src/pins/teensy3/pins_TEENSY35_36.h | 2 +- Marlin/src/pins/teensy4/pins_T41U5XBB.h | 6 +++--- Marlin/src/pins/teensy4/pins_TEENSY41.h | 6 +++--- Marlin/src/sd/Sd2Card.h | 8 +++----- Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h | 13 +++++++------ README.md | 4 ++-- 45 files changed, 108 insertions(+), 80 deletions(-) diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index 4b9260c359..6ce85a4643 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -19,9 +19,7 @@ */ /** - * Description: HAL for Arduino Due and compatible (SAM3X8E) - * - * For ARDUINO_ARCH_SAM + * HAL for Arduino Due and compatible (SAM3X8E) */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 7a057fdae4..dbb84e2ac7 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -22,9 +22,7 @@ #pragma once /** - * Description: HAL for Arduino Due and compatible (SAM3X8E) - * - * For ARDUINO_ARCH_SAM + * HAL for Arduino Due and compatible (SAM3X8E) */ #define CPU_32_BIT diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 54ae8eceb1..0451d8bcc4 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -30,7 +30,7 @@ */ /** - * Description: HAL for Arduino Due and compatible (SAM3X8E) + * HAL for Arduino Due and compatible (SAM3X8E) * * For ARDUINO_ARCH_SAM */ diff --git a/Marlin/src/HAL/DUE/timers.cpp b/Marlin/src/HAL/DUE/timers.cpp index 795cdad66a..9b937d1a7c 100644 --- a/Marlin/src/HAL/DUE/timers.cpp +++ b/Marlin/src/HAL/DUE/timers.cpp @@ -21,9 +21,7 @@ */ /** - * Description: HAL for Arduino Due and compatible (SAM3X8E) - * - * For ARDUINO_ARCH_SAM + * HAL Timers for Arduino Due and compatible (SAM3X8E) */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/timers.h b/Marlin/src/HAL/DUE/timers.h index 9defe39a0a..0e1ea07cc2 100644 --- a/Marlin/src/HAL/DUE/timers.h +++ b/Marlin/src/HAL/DUE/timers.h @@ -21,9 +21,7 @@ #pragma once /** - * HAL for Arduino Due and compatible (SAM3X8E) - * - * For ARDUINO_ARCH_SAM + * HAL Timers for Arduino Due and compatible (SAM3X8E) */ #include diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index f6fa46dd93..aa3bcc775d 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -20,7 +20,7 @@ #pragma once /** - * Description: HAL for Espressif ESP32 WiFi + * HAL for Espressif ESP32 WiFi */ #define CPU_32_BIT diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index d276a4c880..8c3dd83377 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -20,9 +20,8 @@ * */ - /** - * Description: HAL for Teensy32 (MK20DX256) + * HAL for Teensy 3.2 (MK20DX256) */ #ifdef __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 31ceb8b87c..b434b9de76 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -22,7 +22,7 @@ #pragma once /** - * Description: HAL for Teensy 3.5 and Teensy 3.6 + * HAL for Teensy 3.2 (MK20DX256) */ #define CPU_32_BIT @@ -44,8 +44,9 @@ //#undef MOTHERBOARD //#define MOTHERBOARD BOARD_TEENSY31_32 -#ifdef __MK20DX256__ - #define IS_32BIT_TEENSY 1 +#define IS_32BIT_TEENSY 1 +#define IS_TEENSY_31_32 1 +#ifndef IS_TEENSY31 #define IS_TEENSY32 1 #endif diff --git a/Marlin/src/HAL/TEENSY31_32/Servo.cpp b/Marlin/src/HAL/TEENSY31_32/Servo.cpp index 544892cb7d..19d57cf1b3 100644 --- a/Marlin/src/HAL/TEENSY31_32/Servo.cpp +++ b/Marlin/src/HAL/TEENSY31_32/Servo.cpp @@ -51,5 +51,4 @@ void libServo::move(const int value) { } #endif // HAS_SERVOS - #endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp index f663132255..cc5c56f7d5 100644 --- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp @@ -23,8 +23,7 @@ #if USE_WIRED_EEPROM /** - * PersistentStore for Arduino-style EEPROM interface - * with implementations supplied by the framework. + * HAL PersistentStore for Teensy 3.2 (MK20DX256) */ #include "../shared/eeprom_api.h" diff --git a/Marlin/src/HAL/TEENSY31_32/timers.cpp b/Marlin/src/HAL/TEENSY31_32/timers.cpp index bf756af8a1..7e01a38f89 100644 --- a/Marlin/src/HAL/TEENSY31_32/timers.cpp +++ b/Marlin/src/HAL/TEENSY31_32/timers.cpp @@ -21,7 +21,7 @@ */ /** - * Teensy3.2 __MK20DX256__ + * HAL Timers for Teensy 3.2 (MK20DX256) */ #ifdef __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/timers.h b/Marlin/src/HAL/TEENSY31_32/timers.h index 4f004ef751..135b328830 100644 --- a/Marlin/src/HAL/TEENSY31_32/timers.h +++ b/Marlin/src/HAL/TEENSY31_32/timers.h @@ -22,8 +22,7 @@ #pragma once /** - * Description: HAL for - * Teensy3.2 (__MK20DX256__) + * HAL Timers for Teensy 3.2 (MK20DX256) */ #include diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index bcbee1d4c5..92907353b8 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -21,7 +21,7 @@ */ /** - * Description: HAL for Teensy35 (MK64FX512) + * HAL for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 11f0fb941e..f454e7af51 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -22,7 +22,7 @@ #pragma once /** - * Description: HAL for Teensy 3.5 and Teensy 3.6 + * HAL for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) */ #define CPU_32_BIT @@ -45,13 +45,12 @@ // Defines // ------------------------ -#ifdef __MK64FX512__ - #define IS_32BIT_TEENSY 1 - #define IS_TEENSY35 1 -#endif +#define IS_32BIT_TEENSY 1 +#define IS_TEENSY_35_36 1 #ifdef __MK66FX1M0__ - #define IS_32BIT_TEENSY 1 #define IS_TEENSY36 1 +#else // __MK64FX512__ + #define IS_TEENSY35 1 #endif #define _MSERIAL(X) Serial##X diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp index 812aa90c83..b36900a321 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp @@ -19,6 +19,11 @@ * along with this program. If not, see . * */ + +/** + * HAL SPI for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + #if defined(__MK64FX512__) || defined(__MK66FX1M0__) #include "HAL.h" diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.cpp b/Marlin/src/HAL/TEENSY35_36/Servo.cpp index d1390187a7..033858594f 100644 --- a/Marlin/src/HAL/TEENSY35_36/Servo.cpp +++ b/Marlin/src/HAL/TEENSY35_36/Servo.cpp @@ -19,6 +19,11 @@ * along with this program. If not, see . * */ + +/** + * HAL Servo for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + #if defined(__MK64FX512__) || defined(__MK66FX1M0__) #include "../../inc/MarlinConfig.h" @@ -51,5 +56,4 @@ void libServo::move(const int value) { } #endif // HAS_SERVOS - #endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.h b/Marlin/src/HAL/TEENSY35_36/Servo.h index ae904f0e2e..719011f102 100644 --- a/Marlin/src/HAL/TEENSY35_36/Servo.h +++ b/Marlin/src/HAL/TEENSY35_36/Servo.h @@ -21,6 +21,10 @@ */ #pragma once +/** + * HAL Servo for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + #include // Inherit and expand on core Servo library diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp index d2d7324cdd..ccbdc6b116 100644 --- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp @@ -22,15 +22,14 @@ */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) +/** + * HAL PersistentStore for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + #include "../../inc/MarlinConfig.h" #if USE_WIRED_EEPROM -/** - * PersistentStore for Arduino-style EEPROM interface - * with implementations supplied by the framework. - */ - #include "../shared/eeprom_api.h" #include diff --git a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h index 92e22efc0f..87e6a7507a 100644 --- a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h +++ b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h @@ -22,7 +22,7 @@ #pragma once /** - * Endstop Interrupts + * HAL Endstop Interrupts for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) * * Without endstop interrupts the endstop pins must be polled continually in * the temperature-ISR via endstops.update(), most of the time finding no change. diff --git a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h index e57c73c595..e529fa93be 100644 --- a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h +++ b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h @@ -18,6 +18,10 @@ */ #pragma once +/** + * HAL Pins Debugging for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS #define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin diff --git a/Marlin/src/HAL/TEENSY35_36/spi_pins.h b/Marlin/src/HAL/TEENSY35_36/spi_pins.h index 276d4f456a..c76344d075 100644 --- a/Marlin/src/HAL/TEENSY35_36/spi_pins.h +++ b/Marlin/src/HAL/TEENSY35_36/spi_pins.h @@ -21,6 +21,10 @@ */ #pragma once +/** + * HAL SPI Pins for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + #define SCK_PIN 13 #define MISO_PIN 12 #define MOSI_PIN 11 diff --git a/Marlin/src/HAL/TEENSY35_36/timers.cpp b/Marlin/src/HAL/TEENSY35_36/timers.cpp index 5725e83a85..8067d091dd 100644 --- a/Marlin/src/HAL/TEENSY35_36/timers.cpp +++ b/Marlin/src/HAL/TEENSY35_36/timers.cpp @@ -21,8 +21,7 @@ */ /** - * Teensy3.5 __MK64FX512__ - * Teensy3.6 __MK66FX1M0__ + * HAL Timers for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) diff --git a/Marlin/src/HAL/TEENSY35_36/timers.h b/Marlin/src/HAL/TEENSY35_36/timers.h index ad6629f40d..5c623cd801 100644 --- a/Marlin/src/HAL/TEENSY35_36/timers.h +++ b/Marlin/src/HAL/TEENSY35_36/timers.h @@ -21,9 +21,7 @@ #pragma once /** - * Description: HAL for - * Teensy3.5 (__MK64FX512__) - * Teensy3.6 (__MK66FX1M0__) + * HAL Timers for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) */ #include diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index f5d37f5fc4..5b1b4272f5 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -21,7 +21,7 @@ */ /** - * Description: HAL for Teensy40 (IMXRT1062) + * HAL for Teensy 4.0 / 4.1 (IMXRT1062) */ #ifdef __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index b3b0144d13..1aff6eed8e 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -22,7 +22,7 @@ #pragma once /** - * Description: HAL for Teensy 4.0 and Teensy 4.1 + * HAL for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ #define CPU_32_BIT @@ -45,8 +45,9 @@ // Defines // ------------------------ -#ifdef __IMXRT1062__ - #define IS_32BIT_TEENSY 1 +#define IS_32BIT_TEENSY 1 +#define IS_TEENSY_40_41 1 +#ifndef IS_TEENSY40 #define IS_TEENSY41 1 #endif diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp index 9ccbb3a1f4..20b472aa35 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp @@ -19,6 +19,11 @@ * along with this program. If not, see . * */ + +/** + * HAL SPI for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + #ifdef __IMXRT1062__ #include "HAL.h" diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.cpp b/Marlin/src/HAL/TEENSY40_41/Servo.cpp index e3d0d03449..ffb1102b14 100644 --- a/Marlin/src/HAL/TEENSY40_41/Servo.cpp +++ b/Marlin/src/HAL/TEENSY40_41/Servo.cpp @@ -19,6 +19,11 @@ * along with this program. If not, see . * */ + +/** + * HAL Servo for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + #ifdef __IMXRT1062__ #include "../../inc/MarlinConfig.h" @@ -53,5 +58,4 @@ void libServo::detach() { } #endif // HAS_SERVOS - #endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.h b/Marlin/src/HAL/TEENSY40_41/Servo.h index ce910ed8a8..699fd700c9 100644 --- a/Marlin/src/HAL/TEENSY40_41/Servo.h +++ b/Marlin/src/HAL/TEENSY40_41/Servo.h @@ -21,6 +21,10 @@ */ #pragma once +/** + * HAL Servo for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + #include // Inherit and expand on core Servo library diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp index 5491e04fbc..030a8c38af 100644 --- a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp @@ -27,8 +27,7 @@ #if USE_WIRED_EEPROM /** - * PersistentStore for Arduino-style EEPROM interface - * with implementations supplied by the framework. + * HAL PersistentStore for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ #include "../shared/eeprom_api.h" diff --git a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h index 92e22efc0f..a05e911668 100644 --- a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h +++ b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h @@ -22,7 +22,7 @@ #pragma once /** - * Endstop Interrupts + * HAL Endstop Interrupts for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) * * Without endstop interrupts the endstop pins must be polled continually in * the temperature-ISR via endstops.update(), most of the time finding no change. diff --git a/Marlin/src/HAL/TEENSY40_41/fastio.h b/Marlin/src/HAL/TEENSY40_41/fastio.h index 19b8114509..52f991dfb8 100644 --- a/Marlin/src/HAL/TEENSY40_41/fastio.h +++ b/Marlin/src/HAL/TEENSY40_41/fastio.h @@ -23,7 +23,7 @@ #pragma once /** - * Fast I/O interfaces for Teensy 4 + * Fast I/O interfaces for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) * These use GPIO functions instead of Direct Port Manipulation, as on AVR. */ diff --git a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h index 890f668650..4ad62d00fe 100644 --- a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h +++ b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h @@ -18,6 +18,10 @@ */ #pragma once +/** + * HAL Pins Debugging for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + #warning "PINS_DEBUGGING is not fully supported for Teensy 4.0 / 4.1 so 'M43' may cause hangs." #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS diff --git a/Marlin/src/HAL/TEENSY40_41/spi_pins.h b/Marlin/src/HAL/TEENSY40_41/spi_pins.h index 276d4f456a..d6f8d41bf6 100644 --- a/Marlin/src/HAL/TEENSY40_41/spi_pins.h +++ b/Marlin/src/HAL/TEENSY40_41/spi_pins.h @@ -21,6 +21,10 @@ */ #pragma once +/** + * HAL SPI Pins for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + #define SCK_PIN 13 #define MISO_PIN 12 #define MOSI_PIN 11 diff --git a/Marlin/src/HAL/TEENSY40_41/timers.cpp b/Marlin/src/HAL/TEENSY40_41/timers.cpp index 15f5185a6b..81c9b08c17 100644 --- a/Marlin/src/HAL/TEENSY40_41/timers.cpp +++ b/Marlin/src/HAL/TEENSY40_41/timers.cpp @@ -21,7 +21,7 @@ */ /** - * Teensy4.0/4.1 (__IMXRT1062__) + * HAL Timers for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ #ifdef __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/timers.h b/Marlin/src/HAL/TEENSY40_41/timers.h index 81891c366b..7e4cd080cb 100644 --- a/Marlin/src/HAL/TEENSY40_41/timers.h +++ b/Marlin/src/HAL/TEENSY40_41/timers.h @@ -21,8 +21,7 @@ #pragma once /** - * Description: HAL for - * Teensy4.0/4.1 (__IMXRT1062__) + * HAL Timers for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ #include diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp index 4253944f2b..8b05ddb153 100644 --- a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp +++ b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp @@ -19,6 +19,11 @@ * along with this program. If not, see . * */ + +/** + * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + #ifdef __IMXRT1062__ #include "../../inc/MarlinConfig.h" @@ -48,5 +53,4 @@ void HAL_watchdog_refresh() { } #endif // USE_WATCHDOG - #endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.h b/Marlin/src/HAL/TEENSY40_41/watchdog.h index f10ecb5aef..03ab151b07 100644 --- a/Marlin/src/HAL/TEENSY40_41/watchdog.h +++ b/Marlin/src/HAL/TEENSY40_41/watchdog.h @@ -22,7 +22,7 @@ #pragma once /** - * Watchdog for Teensy4.0/4.1 (__IMXRT1062__) + * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ void watchdog_init(); diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index 5ec709fb40..9ac2380e79 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -60,7 +60,7 @@ #define TEST_BYTE ((char) 0xE5) -#if defined(__AVR__) || IS_32BIT_TEENSY +#if EITHER(__AVR__, IS_32BIT_TEENSY) extern char __bss_end; char *end_bss = &__bss_end, diff --git a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h index 45d1231f8e..0edb5cb19d 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h @@ -27,7 +27,7 @@ * https://www.pjrc.com/teensy/teensyduino.html */ -#if NOT_TARGET(IS_32BIT_TEENSY) +#if NOT_TARGET(IS_TEENSY_31_32) #error "Oops! Select 'Teensy 3.1' or 'Teensy 3.2' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h index b1cd3d1612..2e09c8a425 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h @@ -27,7 +27,7 @@ * https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ -#if NOT_TARGET(IS_32BIT_TEENSY) +#if NOT_TARGET(IS_TEENSY_35_36) #error "Oops! Select 'Teensy 3.5' or 'Teensy 3.6' in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h index cb4c0ea879..830637bebd 100644 --- a/Marlin/src/pins/teensy4/pins_T41U5XBB.h +++ b/Marlin/src/pins/teensy4/pins_T41U5XBB.h @@ -27,12 +27,12 @@ * https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ -#if NOT_TARGET(IS_32BIT_TEENSY) || NOT_TARGET(IS_TEENSY41) +#if NOT_TARGET(IS_TEENSY41) #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" -#else - #define BOARD_INFO_NAME "Teensy4.1" #endif +#define BOARD_INFO_NAME "Teensy4.1" + /** * Plan for Teensy 4.0 and Teensy 4.1: * USB diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h index cc7341bc23..31c6fda5c9 100644 --- a/Marlin/src/pins/teensy4/pins_TEENSY41.h +++ b/Marlin/src/pins/teensy4/pins_TEENSY41.h @@ -27,12 +27,12 @@ * https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ -#if NOT_TARGET(IS_32BIT_TEENSY) || NOT_TARGET(IS_TEENSY41) +#if NOT_TARGET(IS_TEENSY41) #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" -#else - #define BOARD_INFO_NAME "Teensy4.1" #endif +#define BOARD_INFO_NAME "Teensy4.1" + /** * Plan for Teensy 4.0 and Teensy 4.1: * USB diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index da19283ef1..5a7ed375e5 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -78,13 +78,11 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 SD_CARD_TYPE_SDHC = 3; // High Capacity SD card /** - * define SOFTWARE_SPI to use bit-bang SPI + * Define SOFTWARE_SPI to use bit-bang SPI */ -#if MEGA_SOFT_SPI +#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) #define SOFTWARE_SPI -#elif USE_SOFTWARE_SPI - #define SOFTWARE_SPI -#endif // MEGA_SOFT_SPI +#endif /** * \class Sd2Card diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index 55a1099a3a..8ca95ba706 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -30,19 +30,20 @@ #include "../SdInfo.h" /** - * define SOFTWARE_SPI to use bit-bang SPI + * Define SOFTWARE_SPI to use bit-bang SPI */ -#if MEGA_SOFT_SPI || USE_SOFTWARE_SPI +#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) #define SOFTWARE_SPI #endif // SPI pin definitions - do not edit here - change in SdFatConfig.h -#if DISABLED(SOFTWARE_SPI) +#if ENABLED(SOFTWARE_SPI) + #warning "Auto-assigning '10' as the SD_CHIP_SELECT_PIN." + #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD +#else // hardware pin defs #define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS. -#else // SOFTWARE_SPI - #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD -#endif // SOFTWARE_SPI +#endif class Sd2Card { private: diff --git a/README.md b/README.md index 839b9f3f65..27becb9db6 100644 --- a/README.md +++ b/README.md @@ -100,8 +100,8 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level boards|processor|speed|flash|sram|logic|fpu ----|---------|-----|-----|----|-----|--- - [Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|[IMXRT1062](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes - [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|[IMXRT1062](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes + [Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|[IMXRT1062DVL6A](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes + [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|[IMXRT1062DVJ6A](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes ## Submitting Patches From de42ef017f171c026b64a9896871521b23928522 Mon Sep 17 00:00:00 2001 From: bilsef Date: Fri, 2 Oct 2020 15:08:50 -0700 Subject: [PATCH 0332/1370] Fix onboard SD card support for Teensy 3.6 & 4.1 (#19593) --- Marlin/src/sd/Sd2Card.cpp | 15 +++++++++++++++ Marlin/src/sd/Sd2Card.h | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index 6ff2793e93..491c0692c7 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -231,6 +231,13 @@ bool Sd2Card::eraseSingleBlockEnable() { * The reason for failure can be determined by calling errorCode() and errorData(). */ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { + #if IS_TEENSY_35_36 || IS_TEENSY_40_41 + chipSelectPin_ = BUILTIN_SDCARD; + const uint8_t ret = SDHC_CardInit(); + type_ = SDHC_CardGetType(); + return (ret == 0); + #endif + errorCode_ = type_ = 0; chipSelectPin_ = chipSelectPin; // 16-bit init start time allows over a minute @@ -332,6 +339,10 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { * \return true for success, false for failure. */ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { + #if IS_TEENSY_35_36 || IS_TEENSY_40_41 + return 0 == SDHC_CardReadBlock(dst, blockNumber); + #endif + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card #if ENABLED(SD_CHECK_AND_RETRY) @@ -547,6 +558,10 @@ bool Sd2Card::waitNotBusy(const millis_t timeout_ms) { bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { if (ENABLED(SDCARD_READONLY)) return false; + #if IS_TEENSY_35_36 || IS_TEENSY_40_41 + return 0 == SDHC_CardWriteBlock(src, blockNumber); + #endif + bool success = false; if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card if (!cardCommand(CMD24, blockNumber)) { diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index 5a7ed375e5..6900502e03 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -84,6 +84,11 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 #define SOFTWARE_SPI #endif +#if IS_TEENSY_35_36 || IS_TEENSY_40_41 + #include "NXP_SDHC.h" + #define BUILTIN_SDCARD 254 +#endif + /** * \class Sd2Card * \brief Raw access to SD and SDHC flash memory cards. From a2c4c4a9166e0009c33ab5b48f50a99d489067f9 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 3 Oct 2020 11:12:17 +1300 Subject: [PATCH 0333/1370] Fix compile of MMU2 with S-mode disabled (#19584) --- Marlin/src/feature/mmu2/mmu2.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index 37a2404c33..3d635369e4 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -340,17 +340,17 @@ void MMU2::mmu_loop() { #endif if (rx_ok()) { - // response to C0 mmu command in PRUSA_MMU2_S_MODE + // Response to C0 mmu command in PRUSA_MMU2_S_MODE bool can_reset = true; - if (ENABLED(PRUSA_MMU2_S_MODE) && last_cmd == MMU_CMD_C0) { - if (!mmu2s_triggered) { + #if ENABLED(PRUSA_MMU2_S_MODE) + if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) { can_reset = false; // MMU ok received but filament sensor not triggered, retrying... DEBUG_ECHOLNPGM("MMU => 'ok' (filament not present in gears)"); DEBUG_ECHOLNPGM("MMU <= 'C0' (keep trying)"); MMU2_COMMAND("C0"); } - } + #endif if (can_reset) { DEBUG_ECHOLNPGM("MMU => 'ok'"); ready = true; From 6bafa69f8fcd943fc822e18f9b66a584970c60c6 Mon Sep 17 00:00:00 2001 From: Andreas Setterlind Date: Sat, 3 Oct 2020 00:16:55 +0200 Subject: [PATCH 0334/1370] Add Configurations repo info to config/README.md (#19583) Co-authored-by: Scott Lahteine --- config/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/README.md b/config/README.md index be986b7058..b5013627ea 100644 --- a/config/README.md +++ b/config/README.md @@ -1,3 +1,9 @@ # Where have all the configurations gone? +Marlin configurations for specific machines are now maintained in their own repository at: + +## https://github.com/MarlinFirmware/Configurations + +Configuration files for use with the nightly `bugfix-2.0.x` branch can be downloaded from: + ## https://github.com/MarlinFirmware/Configurations/archive/bugfix-2.0.x.zip From c5614c85299926f4b44540e7234514510225ef75 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 3 Oct 2020 11:19:43 +1300 Subject: [PATCH 0335/1370] Fix TEMP_ADC_PROBE support for STM32F1 (#19582) Co-authored-by: ellensp --- Marlin/src/HAL/STM32F1/HAL.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index d7f9264be6..5920334bb1 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -97,6 +97,9 @@ const uint8_t adc_pins[] = { #if HAS_TEMP_ADC_0 TEMP_0_PIN, #endif + #if HAS_TEMP_ADC_PROBE + TEMP_PROBE_PIN, + #endif #if HAS_HEATED_BED TEMP_BED_PIN, #endif @@ -151,6 +154,9 @@ enum TempPinIndex : char { #if HAS_TEMP_ADC_0 TEMP_0, #endif + #if HAS_TEMP_ADC_PROBE + TEMP_PROBE, + #endif #if HAS_HEATED_BED TEMP_BED, #endif @@ -341,6 +347,9 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { #if HAS_TEMP_ADC_0 case TEMP_0_PIN: pin_index = TEMP_0; break; #endif + #if HAS_TEMP_ADC_PROBE + case TEMP_PROBE_PIN: pin_index = TEMP_PROBE; break; + #endif #if HAS_HEATED_BED case TEMP_BED_PIN: pin_index = TEMP_BED; break; #endif From 98046776693df30554f1fb1899ce1d90f92c44aa Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 3 Oct 2020 11:28:08 +1300 Subject: [PATCH 0336/1370] Fix wrappers on HAL/STM32F1 .cpp files (#19581) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/STM32F1/HAL_SPI.cpp | 3 --- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 3 +++ Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp | 3 +++ Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 10 +++++----- Marlin/src/HAL/STM32F1/msc_sd.cpp | 4 ++-- Marlin/src/HAL/STM32F1/onboard_sd.cpp | 3 +++ 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp index 4d72473e7f..550a79deae 100644 --- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp @@ -24,9 +24,6 @@ /** * Software SPI functions originally from Arduino Sd2Card Library * Copyright (c) 2009 by William Greiman - */ - -/** * Adapted to the STM32F1 HAL */ diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp index f77306a88a..658b7cd4a6 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -25,6 +25,8 @@ * with simple implementations supplied by Marlin. */ +#ifdef __STM32F1__ + #include "../../inc/MarlinConfig.h" #if ENABLED(IIC_BL24CXX_EEPROM) @@ -79,3 +81,4 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t } #endif // IIC_BL24CXX_EEPROM +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp index 33dd277add..ccc3fc537f 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp @@ -25,6 +25,8 @@ * Enable USE_SHARED_EEPROM if not supplied by the framework. */ +#ifdef __STM32F1__ + #include "../../inc/MarlinConfig.h" #if ENABLED(IIC_BL24CXX_EEPROM) @@ -49,3 +51,4 @@ uint8_t eeprom_read_byte(uint8_t *pos) { } #endif // IIC_BL24CXX_EEPROM +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp index b4699d00dc..fffd6ccaf0 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -17,17 +17,17 @@ * along with this program. If not, see . * */ + +/** + * HAL PersistentStore for STM32F1 + */ + #ifdef __STM32F1__ #include "../../inc/MarlinConfig.h" #if USE_WIRED_EEPROM -/** - * PersistentStore for Arduino-style EEPROM interface - * with simple implementations supplied by Marlin. - */ - #include "../shared/eeprom_if.h" #include "../shared/eeprom_api.h" diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index 6a4652e467..4f44f2ee90 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -13,7 +13,7 @@ * along with this program. If not, see . * */ -#ifdef USE_USB_COMPOSITE +#if defined(__STM32F1__) && defined(USE_USB_COMPOSITE) #include "msc_sd.h" #include "SPI.h" @@ -77,4 +77,4 @@ void MSC_SD_init() { #endif } -#endif // USE_USB_COMPOSITE +#endif // __STM32F1__ && USE_USB_COMPOSITE diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.cpp b/Marlin/src/HAL/STM32F1/onboard_sd.cpp index da25271734..9c2b128ddc 100644 --- a/Marlin/src/HAL/STM32F1/onboard_sd.cpp +++ b/Marlin/src/HAL/STM32F1/onboard_sd.cpp @@ -11,6 +11,8 @@ * Redistributions of source code must retain the above copyright notice. */ +#ifdef __STM32F1__ + #include "../../inc/MarlinConfig.h" #if SD_CONNECTION_IS(ONBOARD) @@ -553,3 +555,4 @@ DRESULT disk_read ( #endif // _DISKIO_IOCTL #endif // SD_CONNECTION_IS(ONBOARD) +#endif // __STM32F1__ From bf3f7ae5b958a71de07604ffd45d87c7b5ece3bc Mon Sep 17 00:00:00 2001 From: Marcio T Date: Fri, 2 Oct 2020 16:30:32 -0600 Subject: [PATCH 0337/1370] Touch UI support for X2, Y2 and Z2 (#19538) --- .../ftdi_eve_touch_ui/language/language_en.h | 3 + .../screens/advanced_settings_menu.cpp | 2 +- .../screens/stepper_current_screen.cpp | 101 ++++++++++++------ Marlin/src/lcd/extui/ui_api.cpp | 40 +++++-- 4 files changed, 104 insertions(+), 42 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index bd64032729..cc96c8b9cd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -57,8 +57,11 @@ namespace Language_en { PROGMEM Language_Str MSG_AMAX_Y = u8"Amax Y"; PROGMEM Language_Str MSG_AMAX_Z = u8"Amax Z"; PROGMEM Language_Str MSG_AXIS_X = u8"X"; + PROGMEM Language_Str MSG_AXIS_X2 = u8"X2"; PROGMEM Language_Str MSG_AXIS_Y = u8"Y"; + PROGMEM Language_Str MSG_AXIS_Y2 = u8"Y2"; PROGMEM Language_Str MSG_AXIS_Z = u8"Z"; + PROGMEM Language_Str MSG_AXIS_Z2 = u8"Z2"; PROGMEM Language_Str MSG_AXIS_E = u8"E"; PROGMEM Language_Str MSG_AXIS_E1 = u8"E1"; PROGMEM Language_Str MSG_AXIS_E2 = u8"E2"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 67b077a553..cfb268f0b4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -38,7 +38,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { } #ifdef TOUCH_UI_PORTRAIT - #if EITHER(CASE_LIGHT_ENABLE, SENSORLESS_HOMING) + #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING) #define GRID_ROWS 9 #else #define GRID_ROWS 8 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp index e89bbd2020..136582f09a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp @@ -35,20 +35,41 @@ void StepperCurrentScreen::onRedraw(draw_mode_t what) { w.precision(0); w.units(GET_TEXT_F(MSG_UNITS_MILLIAMP)); w.heading( GET_TEXT_F(MSG_TMC_CURRENT)); - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ); - #if EXTRUDERS == 1 - w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AXIS_E), getAxisCurrent_mA(E0) ); - #elif HAS_MULTI_EXTRUDER - w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), getAxisCurrent_mA(E0) ); - w.color(e_axis).adjuster(10, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) ); - #if EXTRUDERS > 2 - w.color(e_axis).adjuster(12, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) ); - #endif - #if EXTRUDERS > 3 - w.color(e_axis).adjuster(14, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) ); + #if AXIS_IS_TMC(X) + w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ); + #endif + #if AXIS_IS_TMC(X2) + w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2) ); + #endif + #if AXIS_IS_TMC(Y) + w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ); + #endif + #if AXIS_IS_TMC(Y2) + w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2) ); + #endif + #if AXIS_IS_TMC(Z) + w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ); + #endif + #if AXIS_IS_TMC(Z2) + w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2) ); + #endif + #if AXIS_IS_TMC(E0) + w.color(e_axis) .adjuster(14, GET_TEXT_F( + #if EXTRUDERS == 1 + MSG_AXIS_E + #else + MSG_AXIS_E1 #endif + ), getAxisCurrent_mA(E0) ); + #endif + #if AXIS_IS_TMC(E1) + w.color(e_axis).adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) ); + #endif + #if AXIS_IS_TMC(E2) + w.color(e_axis).adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) ); + #endif + #if AXIS_IS_TMC(E3) + w.color(e_axis).adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) ); #endif w.increments(); } @@ -56,25 +77,45 @@ void StepperCurrentScreen::onRedraw(draw_mode_t what) { bool StepperCurrentScreen::onTouchHeld(uint8_t tag) { const float increment = getIncrement(); switch (tag) { - case 2: UI_DECREMENT(AxisCurrent_mA, X ); break; - case 3: UI_INCREMENT(AxisCurrent_mA, X ); break; - case 4: UI_DECREMENT(AxisCurrent_mA, Y ); break; - case 5: UI_INCREMENT(AxisCurrent_mA, Y ); break; - case 6: UI_DECREMENT(AxisCurrent_mA, Z ); break; - case 7: UI_INCREMENT(AxisCurrent_mA, Z ); break; - case 8: UI_DECREMENT(AxisCurrent_mA, E0); break; - case 9: UI_INCREMENT(AxisCurrent_mA, E0); break; - #if HAS_MULTI_EXTRUDER - case 10: UI_DECREMENT(AxisCurrent_mA, E1); break; - case 11: UI_INCREMENT(AxisCurrent_mA, E1); break; + #if AXIS_IS_TMC(X) + case 2: UI_DECREMENT(AxisCurrent_mA, X ); break; + case 3: UI_INCREMENT(AxisCurrent_mA, X ); break; #endif - #if EXTRUDERS > 2 - case 12: UI_DECREMENT(AxisCurrent_mA, E2); break; - case 13: UI_INCREMENT(AxisCurrent_mA, E2); break; + #if AXIS_IS_TMC(X2) + case 4: UI_DECREMENT(AxisCurrent_mA, X2 ); break; + case 5: UI_INCREMENT(AxisCurrent_mA, X2 ); break; #endif - #if EXTRUDERS > 3 - case 14: UI_DECREMENT(AxisCurrent_mA, E3); break; - case 15: UI_INCREMENT(AxisCurrent_mA, E3); break; + #if AXIS_IS_TMC(Y) + case 6: UI_DECREMENT(AxisCurrent_mA, Y ); break; + case 7: UI_INCREMENT(AxisCurrent_mA, Y ); break; + #endif + #if AXIS_IS_TMC(Y2) + case 8: UI_DECREMENT(AxisCurrent_mA, Y2 ); break; + case 9: UI_INCREMENT(AxisCurrent_mA, Y2 ); break; + #endif + #if AXIS_IS_TMC(Z) + case 10: UI_DECREMENT(AxisCurrent_mA, Z ); break; + case 11: UI_INCREMENT(AxisCurrent_mA, Z ); break; + #endif + #if AXIS_IS_TMC(Z2) + case 12: UI_DECREMENT(AxisCurrent_mA, Z2 ); break; + case 13: UI_INCREMENT(AxisCurrent_mA, Z2 ); break; + #endif + #if AXIS_IS_TMC(E0) + case 14: UI_DECREMENT(AxisCurrent_mA, E0); break; + case 15: UI_INCREMENT(AxisCurrent_mA, E0); break; + #endif + #if AXIS_IS_TMC(E1) + case 16: UI_DECREMENT(AxisCurrent_mA, E1); break; + case 17: UI_INCREMENT(AxisCurrent_mA, E1); break; + #endif + #if AXIS_IS_TMC(E2) + case 18: UI_DECREMENT(AxisCurrent_mA, E2); break; + case 19: UI_INCREMENT(AxisCurrent_mA, E2); break; + #endif + #if AXIS_IS_TMC(E3) + case 20: UI_DECREMENT(AxisCurrent_mA, E3); break; + case 21: UI_INCREMENT(AxisCurrent_mA, E3); break; #endif default: return false; diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 1270e3d649..0acfc9c025 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -399,12 +399,21 @@ namespace ExtUI { #if AXIS_IS_TMC(X) case X: return stepperX.getMilliamps(); #endif + #if AXIS_IS_TMC(X2) + case X2: return stepperX2.getMilliamps(); + #endif #if AXIS_IS_TMC(Y) case Y: return stepperY.getMilliamps(); #endif + #if AXIS_IS_TMC(Y2) + case Y2: return stepperY2.getMilliamps(); + #endif #if AXIS_IS_TMC(Z) case Z: return stepperZ.getMilliamps(); #endif + #if AXIS_IS_TMC(Z2) + case Z2: return stepperZ2.getMilliamps(); + #endif default: return NAN; }; } @@ -442,13 +451,22 @@ namespace ExtUI { void setAxisCurrent_mA(const float mA, const axis_t axis) { switch (axis) { #if AXIS_IS_TMC(X) - case X: stepperX.rms_current(constrain(mA, 500, 1500)); break; + case X: stepperX.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(X2) + case X2: stepperX2.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(Y) - case Y: stepperY.rms_current(constrain(mA, 500, 1500)); break; + case Y: stepperY.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(Y2) + case Y2: stepperY2.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(Z) - case Z: stepperZ.rms_current(constrain(mA, 500, 1500)); break; + case Z: stepperZ.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(Z2) + case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break; #endif default: break; }; @@ -457,28 +475,28 @@ namespace ExtUI { void setAxisCurrent_mA(const float mA, const extruder_t extruder) { switch (extruder) { #if AXIS_IS_TMC(E0) - case E0: stepperE0.rms_current(constrain(mA, 500, 1500)); break; + case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(E1) - case E1: stepperE1.rms_current(constrain(mA, 500, 1500)); break; + case E1: stepperE1.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(E2) - case E2: stepperE2.rms_current(constrain(mA, 500, 1500)); break; + case E2: stepperE2.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(E3) - case E3: stepperE3.rms_current(constrain(mA, 500, 1500)); break; + case E3: stepperE3.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(E4) - case E4: stepperE4.rms_current(constrain(mA, 500, 1500)); break; + case E4: stepperE4.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(E5) - case E5: stepperE5.rms_current(constrain(mA, 500, 1500)); break; + case E5: stepperE5.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(E6) - case E6: stepperE6.rms_current(constrain(mA, 500, 1500)); break; + case E6: stepperE6.rms_current(constrain(mA, 400, 1500)); break; #endif #if AXIS_IS_TMC(E7) - case E7: stepperE7.rms_current(constrain(mA, 500, 1500)); break; + case E7: stepperE7.rms_current(constrain(mA, 400, 1500)); break; #endif default: break; }; From 85c6ffb364eb6ca7c991b7a83a7a209ec5157ddd Mon Sep 17 00:00:00 2001 From: Ryan V1 <55478432+V1EngineeringInc@users.noreply.github.com> Date: Fri, 2 Oct 2020 15:31:33 -0700 Subject: [PATCH 0338/1370] Fix 'bossac' upload on Windows (#19545) --- Marlin/src/HAL/DUE/upload_extra_script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/DUE/upload_extra_script.py b/Marlin/src/HAL/DUE/upload_extra_script.py index 06c2b914f5..d52a0a3642 100644 --- a/Marlin/src/HAL/DUE/upload_extra_script.py +++ b/Marlin/src/HAL/DUE/upload_extra_script.py @@ -14,5 +14,5 @@ if current_OS == 'Windows': # Use bossac.exe on Windows env.Replace( - UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot" + UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE" ) From 770f2b1e02e3f7debcb76441fc6a6e6b3231cf31 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 4 Oct 2020 14:29:02 -0500 Subject: [PATCH 0339/1370] Fix Tune/Fan edit items - Fixes #19617 - Followup to #18400 --- Marlin/src/lcd/language/language_en.h | 4 +- Marlin/src/lcd/language/language_hu.h | 4 +- Marlin/src/lcd/language/language_ro.h | 4 +- Marlin/src/lcd/language/language_ru.h | 4 +- Marlin/src/lcd/language/language_tr.h | 4 +- Marlin/src/lcd/language/language_uk.h | 4 +- Marlin/src/lcd/language/language_zh_CN.h | 4 +- Marlin/src/lcd/language/language_zh_TW.h | 4 +- Marlin/src/lcd/menu/menu_item.h | 28 ++++++++++++++ Marlin/src/lcd/menu/menu_temperature.cpp | 37 ++++--------------- Marlin/src/lcd/menu/menu_tune.cpp | 47 +++++++----------------- 11 files changed, 65 insertions(+), 79 deletions(-) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index f377a5184c..94cd3ef583 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -657,8 +657,8 @@ namespace Language_en { #if FAN_COUNT == 1 #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED #else #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N #endif diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index f93e5ee4e2..02f2a9bde2 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -623,8 +623,8 @@ namespace Language_hu { #if FAN_COUNT == 1 #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED #else #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N #endif diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index d71471a09d..46c54f1b99 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -631,8 +631,8 @@ namespace Language_ro { #if FAN_COUNT == 1 #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED #else #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N #endif diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 0953bb8a71..2a2f568573 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -767,8 +767,8 @@ namespace Language_ru { #if FAN_COUNT == 1 #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED #else #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N #endif diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 90208befe7..11fd3f21e8 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -590,8 +590,8 @@ namespace Language_tr { #if FAN_COUNT == 1 #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED #else #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N #endif diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 54171e1ebc..9cc1002964 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -762,8 +762,8 @@ namespace Language_uk { #if FAN_COUNT == 1 #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED #else #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N #endif diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 53dac64c0b..a70e0876a8 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -630,8 +630,8 @@ namespace Language_zh_CN { #if FAN_COUNT == 1 #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED #else #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N #endif diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 7f1fce649e..6b4bac37d1 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -501,8 +501,8 @@ namespace Language_zh_TW { #if FAN_COUNT == 1 #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED #else #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N #endif diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 755135d14d..fe1477288f 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -452,3 +452,31 @@ class MenuItem_bool : public MenuEditItemBase { #if ENABLED(LEVEL_BED_CORNERS) void _lcd_level_bed_corners(); #endif + +#if HAS_FAN + + #include "../../module/temperature.h" + + inline void on_fan_update() { + thermalManager.set_fan_speed(MenuItemBase::itemIndex, editable.uint8); + } + + #if ENABLED(EXTRA_FAN_SPEED) + #define EDIT_EXTRA_FAN_SPEED(V...) EDIT_ITEM_FAST_N(V) + #else + #define EDIT_EXTRA_FAN_SPEED(...) + #endif + + #define _FAN_EDIT_ITEMS(F,L) do{ \ + editable.uint8 = thermalManager.fan_speed[F]; \ + EDIT_ITEM_FAST_N(percent, F, MSG_##L, &editable.uint8, 0, 255, on_fan_update); \ + EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_##L, &thermalManager.new_fan_speed[F], 3, 255); \ + }while(0) + + #if FAN_COUNT > 1 + #define FAN_EDIT_ITEMS(F) _FAN_EDIT_ITEMS(F,FAN_SPEED_N) + #endif + + #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N) + +#endif // HAS_FAN diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 141a8138b5..1c5493af05 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -191,25 +191,6 @@ void menu_temperature() { // #if HAS_FAN - auto on_fan_update = []{ - thermalManager.set_fan_speed(MenuItemBase::itemIndex, editable.uint8); - }; - - #if ENABLED(EXTRA_FAN_SPEED) - #define EDIT_EXTRA_FAN_SPEED(V...) EDIT_ITEM_FAST_N(V) - #else - #define EDIT_EXTRA_FAN_SPEED(...) - #endif - - #if FAN_COUNT > 1 - #define FAN_EDIT_ITEMS(F) do{ \ - editable.uint8 = thermalManager.fan_speed[F]; \ - EDIT_ITEM_FAST_N(percent, F, MSG_FAN_SPEED_N, &editable.uint8, 0, 255, on_fan_update); \ - EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_FAN_SPEED_N, &thermalManager.new_fan_speed[F], 3, 255); \ - }while(0) - #endif - - #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N) #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) auto singlenozzle_item = [&](const uint8_t f) { editable.uint8 = singlenozzle_fan_speed[f]; @@ -218,11 +199,7 @@ void menu_temperature() { #endif #if HAS_FAN0 - editable.uint8 = thermalManager.fan_speed[0]; - EDIT_ITEM_FAST_N(percent, 0, MSG_FIRST_FAN_SPEED, &editable.uint8, 0, 255, on_fan_update); - #if ENABLED(EXTRA_FAN_SPEED) - EDIT_ITEM_FAST_N(percent, 0, MSG_FIRST_EXTRA_FAN_SPEED, &thermalManager.new_fan_speed[0], 3, 255); - #endif + _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); #endif #if HAS_FAN1 FAN_EDIT_ITEMS(1); @@ -232,32 +209,32 @@ void menu_temperature() { #if HAS_FAN2 FAN_EDIT_ITEMS(2); #elif SNFAN(2) - singlenozzle_item(1); + singlenozzle_item(2); #endif #if HAS_FAN3 FAN_EDIT_ITEMS(3); #elif SNFAN(3) - singlenozzle_item(1); + singlenozzle_item(3); #endif #if HAS_FAN4 FAN_EDIT_ITEMS(4); #elif SNFAN(4) - singlenozzle_item(1); + singlenozzle_item(4); #endif #if HAS_FAN5 FAN_EDIT_ITEMS(5); #elif SNFAN(5) - singlenozzle_item(1); + singlenozzle_item(5); #endif #if HAS_FAN6 FAN_EDIT_ITEMS(6); #elif SNFAN(6) - singlenozzle_item(1); + singlenozzle_item(6); #endif #if HAS_FAN7 FAN_EDIT_ITEMS(7); #elif SNFAN(7) - singlenozzle_item(1); + singlenozzle_item(7); #endif #endif // HAS_FAN diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index b84cb8cbd7..76dab7be8a 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -142,21 +142,6 @@ void menu_tune() { // #if HAS_FAN - auto on_fan_update = []{ - thermalManager.set_fan_speed(MenuItemBase::itemIndex, editable.uint8); - }; - - #if HAS_FAN1 || HAS_FAN2 || HAS_FAN3 || HAS_FAN4 || HAS_FAN5 || HAS_FAN6 || HAS_FAN7 - auto fan_edit_items = [&](const uint8_t f) { - editable.uint8 = thermalManager.fan_speed[f]; - EDIT_ITEM_FAST_N(percent, f, MSG_FAN_SPEED_N, &editable.uint8, 0, 255, on_fan_update); - #if ENABLED(EXTRA_FAN_SPEED) - EDIT_ITEM_FAST_N(percent, f, MSG_EXTRA_FAN_SPEED_N, &thermalManager.new_fan_speed[f], 3, 255); - #endif - }; - #endif - - #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N) #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) auto singlenozzle_item = [&](const uint8_t f) { editable.uint8 = singlenozzle_fan_speed[f]; @@ -165,46 +150,42 @@ void menu_tune() { #endif #if HAS_FAN0 - editable.uint8 = thermalManager.fan_speed[0]; - EDIT_ITEM_FAST_N(percent, 0, MSG_FIRST_FAN_SPEED, &editable.uint8, 0, 255, on_fan_update); - #if ENABLED(EXTRA_FAN_SPEED) - EDIT_ITEM_FAST_N(percent, 0, MSG_FIRST_EXTRA_FAN_SPEED, &thermalManager.new_fan_speed[0], 3, 255); - #endif + _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); #endif #if HAS_FAN1 - fan_edit_items(1); + FAN_EDIT_ITEMS(1); #elif SNFAN(1) singlenozzle_item(1); #endif #if HAS_FAN2 - fan_edit_items(2); + FAN_EDIT_ITEMS(2); #elif SNFAN(2) - singlenozzle_item(1); + singlenozzle_item(2); #endif #if HAS_FAN3 - fan_edit_items(3); + FAN_EDIT_ITEMS(3); #elif SNFAN(3) - singlenozzle_item(1); + singlenozzle_item(3); #endif #if HAS_FAN4 - fan_edit_items(4); + FAN_EDIT_ITEMS(4); #elif SNFAN(4) - singlenozzle_item(1); + singlenozzle_item(4); #endif #if HAS_FAN5 - fan_edit_items(5); + FAN_EDIT_ITEMS(5); #elif SNFAN(5) - singlenozzle_item(1); + singlenozzle_item(5); #endif #if HAS_FAN6 - fan_edit_items(6); + FAN_EDIT_ITEMS(6); #elif SNFAN(6) - singlenozzle_item(1); + singlenozzle_item(6); #endif #if HAS_FAN7 - fan_edit_items(7); + FAN_EDIT_ITEMS(7); #elif SNFAN(7) - singlenozzle_item(1); + singlenozzle_item(7); #endif #endif // HAS_FAN From 2a755d68d9acb705fc15750d1c19201aeed625a7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 4 Oct 2020 14:46:55 -0500 Subject: [PATCH 0340/1370] Shared singlenozzle item --- Marlin/src/lcd/menu/menu_item.h | 10 ++++++++++ Marlin/src/lcd/menu/menu_temperature.cpp | 7 +------ Marlin/src/lcd/menu/menu_tune.cpp | 7 +------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index fe1477288f..bd3af0cec6 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -479,4 +479,14 @@ class MenuItem_bool : public MenuEditItemBase { #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N) + #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) + #define DEFINE_SINGLENOZZLE_ITEM() \ + auto singlenozzle_item = [&](const uint8_t f) { \ + editable.uint8 = singlenozzle_fan_speed[f]; \ + EDIT_ITEM_FAST_N(percent, f, MSG_STORED_FAN_N, &editable.uint8, 0, 255, on_fan_update); \ + } + #else + #define DEFINE_SINGLENOZZLE_ITEM() NOOP + #endif + #endif // HAS_FAN diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 1c5493af05..0c70cd7e18 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -191,12 +191,7 @@ void menu_temperature() { // #if HAS_FAN - #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) - auto singlenozzle_item = [&](const uint8_t f) { - editable.uint8 = singlenozzle_fan_speed[f]; - EDIT_ITEM_FAST_N(percent, f, MSG_STORED_FAN_N, &editable.uint8, 0, 255, on_fan_update); - }; - #endif + DEFINE_SINGLENOZZLE_ITEM(); #if HAS_FAN0 _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 76dab7be8a..6bf5c3a15d 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -142,12 +142,7 @@ void menu_tune() { // #if HAS_FAN - #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) - auto singlenozzle_item = [&](const uint8_t f) { - editable.uint8 = singlenozzle_fan_speed[f]; - EDIT_ITEM_FAST_N(percent, f, MSG_STORED_FAN_N, &editable.uint8, 0, 255, on_fan_update); - }; - #endif + DEFINE_SINGLENOZZLE_ITEM(); #if HAS_FAN0 _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); From af4c2dab8d9ed912ad5446bc532eef94ca311a52 Mon Sep 17 00:00:00 2001 From: Speaka <48431623+Speaka@users.noreply.github.com> Date: Sun, 4 Oct 2020 21:50:12 +0200 Subject: [PATCH 0341/1370] Fix German translation purging/unloading (#19615) --- Marlin/src/lcd/language/language_de.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 5492cd5d59..88b78abeb8 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -601,10 +601,10 @@ namespace Language_de { PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filament einlegen", "und Knopf drücken", "um fortzusetzen")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Knopf drücken um", "Düse aufzuheizen")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Düse heizt auf", "bitte warten...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Warte auf", "Herausnahme", "des Filaments...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Warte auf", "Entnahme", "des Filaments...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Warte auf", "Laden des", "Filaments...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Warte auf", "Entladen des", "Filaments...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klicke um", "die Fila-Entladung", "zu beenden")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Warte auf", "Spülung", "der Düse...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klicke um", "die Düsenspülung", "zu beenden")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Warte auf", "Fortsetzen des", "Drucks...")); #else // LCD_HEIGHT < 4 PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Klick zum Fortsetzen")); @@ -613,10 +613,10 @@ namespace Language_de { PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Laden und Klick")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Klick zum Heizen")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heizen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Entladen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Entnehmen...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Laden...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Entladen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klick zum beenden", "der Fila-Entladung")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spülen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klick zum beenden", "der Düsenspülung")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsetzen...")); #endif // LCD_HEIGHT < 4 From 01c161d380093d4a9763df5daa7221f738ddd6ed Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 4 Oct 2020 15:45:13 -0500 Subject: [PATCH 0342/1370] Move SF_ARC_FIX option --- Marlin/Configuration.h | 12 ++---------- Marlin/Configuration_adv.h | 1 + 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index dec1a81bee..e03887a9d7 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2304,9 +2304,6 @@ // then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) //#define TEMP_STAT_LEDS -// SkeinForge sends the wrong arc G-codes when using Arc Point as fillet procedure -//#define SF_ARC_FIX - // Support for the BariCUDA Paste Extruder //#define BARICUDA @@ -2392,17 +2389,12 @@ #define PRINTER_EVENT_LEDS #endif -/** - * R/C SERVO support - * Sponsored by TrinityLabs, Reworked by codexmas - */ - /** * Number of servos * * For some servo-related options NUM_SERVOS will be set automatically. * Set this manually if there are extra servos needing manual control. - * Leave undefined or set to 0 to entirely disable the servo subsystem. + * Set to 0 to turn off servo support. */ //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command @@ -2414,5 +2406,5 @@ // Only power servos during movement, otherwise leave off to prevent jitter //#define DEACTIVATE_SERVOS_AFTER_MOVE -// Allow servo angle to be edited and saved to EEPROM +// Edit servo angles with M281 and save to EEPROM with M500 //#define EDITABLE_SERVO_ANGLES diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b6ea64c2af..32a26a1e51 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1768,6 +1768,7 @@ #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes + //#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure #endif // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. From 53b7ad3a9279b6b6297bd4345a63315559c4dbb7 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 5 Oct 2020 10:47:06 +1300 Subject: [PATCH 0343/1370] Fix Z_AFTER_HOMING without probe (#19607) --- Marlin/src/module/probe.h | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 14036a18d9..f0f56ec191 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -84,13 +84,6 @@ public: do_z_clearance(Z_AFTER_PROBING, true, true, true); // Move down still permitted #endif } - static inline void move_z_after_homing() { - #ifdef Z_AFTER_HOMING - do_z_clearance(Z_AFTER_HOMING, true, true, true); - #elif defined(Z_AFTER_PROBING) - move_z_after_probing(); - #endif - } static float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); static inline float probe_at_point(const xy_pos_t &pos, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true) { return probe_at_point(pos.x, pos.y, raise_after, verbose_level, probe_relative, sanity_check); @@ -98,8 +91,6 @@ public: #else - FORCE_INLINE static void move_z_after_homing() {} - static constexpr xyz_pos_t offset = xyz_pos_t({ 0, 0, 0 }); // See #16767 static bool set_deployed(const bool) { return false; } @@ -108,6 +99,14 @@ public: #endif + static inline void move_z_after_homing() { + #ifdef Z_AFTER_HOMING + do_z_clearance(Z_AFTER_HOMING, true, true, true); + #elif BOTH(Z_AFTER_PROBING,HAS_BED_PROBE) + move_z_after_probing(); + #endif + } + FORCE_INLINE static bool can_reach(const xy_pos_t &pos) { return can_reach(pos.x, pos.y); } FORCE_INLINE static bool good_bounds(const xy_pos_t &lf, const xy_pos_t &rb) { From 1ac7cf2ab6cfc2f978287fa31443b31f55e7a675 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 4 Oct 2020 17:29:12 -0500 Subject: [PATCH 0344/1370] Add HAS_FAST_MOVES --- Marlin/src/gcode/gcode.cpp | 16 ++++------------ Marlin/src/gcode/gcode.h | 10 +++++----- Marlin/src/gcode/motion/G0_G1.cpp | 6 +----- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 39276bc729..1de54259be 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -260,12 +260,8 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { switch (parser.command_letter) { case 'G': switch (parser.codenum) { - case 0: case 1: G0_G1( // G0: Fast Move, G1: Linear Move - #if IS_SCARA || defined(G0_FEEDRATE) - parser.codenum == 0 - #endif - ); - break; + case 0: case 1: // G0: Fast Move, G1: Linear Move + G0_G1(TERN_(HAS_FAST_MOVES, parser.codenum == 0)); break; #if ENABLED(ARC_SUPPORT) && DISABLED(SCARA) case 2: case 3: G2_G3(parser.codenum == 2); break; // G2: CW ARC, G3: CCW ARC @@ -315,13 +311,9 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if HAS_LEVELING case 29: // G29: Bed leveling calibration - #if ENABLED(G29_RETRY_AND_RECOVER) - G29_with_retry(); - #else - G29(); - #endif + TERN(G29_RETRY_AND_RECOVER, G29_with_retry, G29)(); break; - #endif // HAS_LEVELING + #endif #if HAS_BED_PROBE case 30: G30(); break; // G30: Single Z probe diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 425a857369..026083bcfc 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -298,6 +298,10 @@ #include "../feature/encoder_i2c.h" #endif +#if IS_SCARA || defined(G0_FEEDRATE) + #define HAS_FAST_MOVES 1 +#endif + enum AxisRelative : uint8_t { REL_X, REL_Y, REL_Z, REL_E, E_MODE_ABS, E_MODE_REL }; class GcodeSuite { @@ -404,11 +408,7 @@ public: private: - static void G0_G1( - #if IS_SCARA || defined(G0_FEEDRATE) - const bool fast_move=false - #endif - ); + static void G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move=false)); TERN_(ARC_SUPPORT, static void G2_G3(const bool clockwise)); diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp index b6ddf9634b..9ac49bd93c 100644 --- a/Marlin/src/gcode/motion/G0_G1.cpp +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -44,11 +44,7 @@ extern xyze_pos_t destination; /** * G0, G1: Coordinated movement of X Y Z E axes */ -void GcodeSuite::G0_G1( - #if IS_SCARA || defined(G0_FEEDRATE) - const bool fast_move/*=false*/ - #endif -) { +void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { if (IsRunning() #if ENABLED(NO_MOTION_BEFORE_HOMING) From cd33062a81c8cb4995be1a266f9d004cd2b0c026 Mon Sep 17 00:00:00 2001 From: Ryan V1 <55478432+V1EngineeringInc@users.noreply.github.com> Date: Sun, 4 Oct 2020 15:41:41 -0700 Subject: [PATCH 0345/1370] Fix Archim1 stepper timing (with new variant) (#19596) --- buildroot/share/PlatformIO/boards/archim.json | 59 ++ .../PlatformIO/variants/archim/.gitignore | 2 + .../variants/archim/build_gcc/Makefile | 42 ++ .../variants/archim/build_gcc/debug.mk | 25 + .../variants/archim/build_gcc/gcc.mk | 82 +++ .../build_gcc/libvariant_arduino_due_x.mk | 184 ++++++ .../variants/archim/build_gcc/release.mk | 25 + .../debug_scripts/gcc/arduino_due_x_flash.gdb | 37 ++ .../debug_scripts/gcc/arduino_due_x_sram.gdb | 37 ++ .../debug_scripts/iar/arduino_due_flash.mac | 44 ++ .../debug_scripts/iar/arduino_due_sram.mac | 44 ++ .../variants/archim/libsam_sam3x8e_gcc_rel.a | Bin 0 -> 117430 bytes .../archim/libsam_sam3x8e_gcc_rel.a.txt | 576 ++++++++++++++++++ .../archim/linker_scripts/gcc/flash.ld | 146 +++++ .../archim/linker_scripts/gcc/sram.ld | 145 +++++ .../archim/linker_scripts/iar/flash.icf | 49 ++ .../archim/linker_scripts/iar/sram.icf | 33 + .../PlatformIO/variants/archim/pins_arduino.h | 21 + .../PlatformIO/variants/archim/variant.cpp | 485 +++++++++++++++ .../PlatformIO/variants/archim/variant.h | 284 +++++++++ platformio.ini | 2 + 21 files changed, 2322 insertions(+) create mode 100644 buildroot/share/PlatformIO/boards/archim.json create mode 100644 buildroot/share/PlatformIO/variants/archim/.gitignore create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk create mode 100644 buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb create mode 100644 buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb create mode 100644 buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac create mode 100644 buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac create mode 100644 buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a create mode 100644 buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt create mode 100644 buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld create mode 100644 buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld create mode 100644 buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf create mode 100644 buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf create mode 100644 buildroot/share/PlatformIO/variants/archim/pins_arduino.h create mode 100644 buildroot/share/PlatformIO/variants/archim/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/archim/variant.h diff --git a/buildroot/share/PlatformIO/boards/archim.json b/buildroot/share/PlatformIO/boards/archim.json new file mode 100644 index 0000000000..60035197f2 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/archim.json @@ -0,0 +1,59 @@ +{ + "build": { + "core": "arduino", + "cpu": "cortex-m3", + "extra_flags": "-D__SAM3X8E__ -DARDUINO_ARCH_SAM -DARDUINO_SAM_DUE", + "f_cpu": "84000000L", + "hwids": [ + [ + "0x27B1", + "0x0001" + ], + [ + "0x2341", + "0x003E" + ], + [ + "0x2341", + "0x003D" + ] + ], + "ldscript": "linker_scripts/gcc/flash.ld", + "mcu": "at91sam3x8e", + "usb_product": "Archim", + "variant": "archim" + }, + "connectivity": [ + "can" + ], + "debug": { + "jlink_device": "ATSAM3X8E", + "openocd_chipname": "at91sam3X8E", + "openocd_target": "at91sam3XXX", + "svd_path": "ATSAM3X8E.svd" + }, + "frameworks": [ + "arduino", + "simba" + ], + "name": "Archim", + "upload": { + "disable_flushing": true, + "maximum_ram_size": 98304, + "maximum_size": 524288, + "native_usb": true, + "protocol": "sam-ba", + "protocols": [ + "sam-ba", + "jlink", + "blackmagic", + "atmel-ice", + "stlink" + ], + "require_upload_port": true, + "use_1200bps_touch": true, + "wait_for_upload_port": true + }, + "url": "https://ultimachine.com", + "vendor": "UltiMachine" +} diff --git a/buildroot/share/PlatformIO/variants/archim/.gitignore b/buildroot/share/PlatformIO/variants/archim/.gitignore new file mode 100644 index 0000000000..2827c7d4f0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/.gitignore @@ -0,0 +1,2 @@ +# Exception for libsam +!libsam_sam3x8e_gcc_rel.a diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile b/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile new file mode 100644 index 0000000000..4332f36080 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile @@ -0,0 +1,42 @@ +# +# Copyright (c) 2011 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +SUBMAKE_OPTIONS=--no-builtin-rules --no-builtin-variables --no-print-directory + +#------------------------------------------------------------------------------- +# Rules +#------------------------------------------------------------------------------- + +all: arduino_due_x + +.PHONY: arduino_due_x +arduino_due_x: + @echo ------------------------------------------------------------------------------------ + @echo --- Making variant arduino_due_x + @$(MAKE) DEBUG=1 $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk +# @$(MAKE) $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk + @echo ------------------------------------------------------------------------------------ + +.PHONY: clean +clean: + @echo ------------------------------------------------------------------------------------ + @echo --- Cleaning variant arduino_due_x + @$(MAKE) DEBUG=1 $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk $@ +# @$(MAKE) $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk $@ + @echo ------------------------------------------------------------------------------------ + diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk new file mode 100644 index 0000000000..d0716744a7 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk @@ -0,0 +1,25 @@ +# +# Copyright (c) 2011 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Optimization level +# -O1 Optimize +# -O2 Optimize even more +# -O3 Optimize yet more +# -O0 Reduce compilation time and make debugging produce the expected results +# -Os Optimize for size +OPTIMIZATION = -g -O0 -DDEBUG diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk new file mode 100644 index 0000000000..32f35d264c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk @@ -0,0 +1,82 @@ +# +# Copyright (c) 2011 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Tool suffix when cross-compiling +CROSS_COMPILE = $(ARM_GCC_TOOLCHAIN)/arm-none-eabi- + +# Compilation tools +AR = $(CROSS_COMPILE)ar +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +AS = $(CROSS_COMPILE)as +NM = $(CROSS_COMPILE)nm +ifeq ($(OS),Windows_NT) +RM=cs-rm -Rf +else +RM=rm -Rf +endif + +SEP=\\ + +# --------------------------------------------------------------------------------------- +# C Flags + +CFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int +CFLAGS += -Werror-implicit-function-declaration -Wmain -Wparentheses +CFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused +CFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef +CFLAGS += -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings +CFLAGS += -Wsign-compare -Waggregate-return -Wstrict-prototypes +CFLAGS += -Wmissing-prototypes -Wmissing-declarations +CFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations +CFLAGS += -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long +CFLAGS += -Wunreachable-code +CFLAGS += -Wcast-align +#CFLAGS += -Wmissing-noreturn +#CFLAGS += -Wconversion + +CFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -mlong-calls -ffunction-sections -fdata-sections -nostdlib -std=c99 +CFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) -D$(VARIANT) + +# To reduce application size use only integer printf function. +CFLAGS += -Dprintf=iprintf + +# --------------------------------------------------------------------------------------- +# CPP Flags + +CPPFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 +CPPFLAGS += -Wmain -Wparentheses -Wcast-align -Wunreachable-code +CPPFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused +CPPFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef +CPPFLAGS += -Wshadow -Wpointer-arith -Wwrite-strings +CPPFLAGS += -Wsign-compare -Waggregate-return -Wmissing-declarations +CPPFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations +CPPFLAGS += -Wpacked -Wredundant-decls -Winline -Wlong-long +#CPPFLAGS += -Wmissing-noreturn +#CPPFLAGS += -Wconversion + +CPPFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -mlong-calls -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -std=c++98 +CPPFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) + +# To reduce application size use only integer printf function. +CPPFLAGS += -Dprintf=iprintf + +# --------------------------------------------------------------------------------------- +# ASM Flags + +ASFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk new file mode 100644 index 0000000000..3f8b1b7603 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk @@ -0,0 +1,184 @@ +# +# Copyright (c) 2012 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Makefile for compiling libArduino +.SUFFIXES: .o .a .c .s + +CHIP=__SAM3X8E__ +VARIANT=arduino_due_x +LIBNAME=libvariant_$(VARIANT) +TOOLCHAIN=gcc + +#------------------------------------------------------------------------------- +# Path +#------------------------------------------------------------------------------- + +# Output directories +OUTPUT_BIN = ../../../cores/arduino + +# Libraries +PROJECT_BASE_PATH = .. +SYSTEM_PATH = ../../../system +CMSIS_ROOT_PATH = $(SYSTEM_PATH)/CMSIS +CMSIS_ARM_PATH=$(CMSIS_ROOT_PATH)/CMSIS/Include +CMSIS_ATMEL_PATH=$(CMSIS_ROOT_PATH)/Device/ATMEL +#CMSIS_CHIP_PATH=$(CMSIS_ROOT_PATH)/Device/ATMEL/$(CHIP_SERIE) + +ARDUINO_PATH = ../../../cores/arduino +VARIANT_BASE_PATH = ../../../variants +VARIANT_PATH = ../../../variants/$(VARIANT) + +#------------------------------------------------------------------------------- +# Files +#------------------------------------------------------------------------------- + +#vpath %.h $(PROJECT_BASE_PATH) $(SYSTEM_PATH) $(VARIANT_PATH) +vpath %.cpp $(PROJECT_BASE_PATH) + +VPATH+=$(PROJECT_BASE_PATH) + +INCLUDES = +#INCLUDES += -I$(PROJECT_BASE_PATH) +INCLUDES += -I$(ARDUINO_PATH) +INCLUDES += -I$(ARDUINO_PATH)/USB +INCLUDES += -I$(SYSTEM_PATH) +INCLUDES += -I$(SYSTEM_PATH)/libsam +INCLUDES += -I$(SYSTEM_PATH)/USBHost +INCLUDES += -I$(VARIANT_BASE_PATH) +INCLUDES += -I$(VARIANT_PATH) +INCLUDES += -I$(CMSIS_ARM_PATH) +INCLUDES += -I$(CMSIS_ATMEL_PATH) + +#------------------------------------------------------------------------------- +ifdef DEBUG +include debug.mk +else +include release.mk +endif + +#------------------------------------------------------------------------------- +# Tools +#------------------------------------------------------------------------------- + +include $(TOOLCHAIN).mk + +#------------------------------------------------------------------------------- +ifdef DEBUG +OUTPUT_OBJ=debug +OUTPUT_LIB_POSTFIX=dbg +else +OUTPUT_OBJ=release +OUTPUT_LIB_POSTFIX=rel +endif + +OUTPUT_LIB=$(LIBNAME)_$(TOOLCHAIN)_$(OUTPUT_LIB_POSTFIX).a +OUTPUT_PATH=$(OUTPUT_OBJ)_$(VARIANT) + +#------------------------------------------------------------------------------- +# C source files and objects +#------------------------------------------------------------------------------- +C_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.c) + +C_OBJ_TEMP = $(patsubst %.c, %.o, $(notdir $(C_SRC))) + +# during development, remove some files +C_OBJ_FILTER= + +C_OBJ=$(filter-out $(C_OBJ_FILTER), $(C_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# CPP source files and objects +#------------------------------------------------------------------------------- +CPP_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.cpp) + +CPP_OBJ_TEMP = $(patsubst %.cpp, %.o, $(notdir $(CPP_SRC))) + +# during development, remove some files +CPP_OBJ_FILTER= + +CPP_OBJ=$(filter-out $(CPP_OBJ_FILTER), $(CPP_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# Assembler source files and objects +#------------------------------------------------------------------------------- +A_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.s) + +A_OBJ_TEMP=$(patsubst %.s, %.o, $(notdir $(A_SRC))) + +# during development, remove some files +A_OBJ_FILTER= + +A_OBJ=$(filter-out $(A_OBJ_FILTER), $(A_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# Rules +#------------------------------------------------------------------------------- +all: $(VARIANT) + +$(VARIANT): create_output $(OUTPUT_LIB) + +.PHONY: create_output +create_output: + @echo ------------------------------------------------------------------------------------ + @echo ------------------------- + @echo --- Preparing variant $(VARIANT) files in $(OUTPUT_PATH) $(OUTPUT_BIN) + @echo ------------------------- +# @echo *$(INCLUDES) +# @echo ------------------------- +# @echo *$(C_SRC) +# @echo ------------------------- +# @echo *$(C_OBJ) +# @echo ------------------------- +# @echo *$(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) +# @echo ------------------------- +# @echo *$(CPP_SRC) +# @echo ------------------------- +# @echo *$(CPP_OBJ) +# @echo ------------------------- +# @echo *$(addprefix $(OUTPUT_PATH)/, $(CPP_OBJ)) +# @echo ------------------------- +# @echo *$(A_SRC) +# @echo ------------------------- + + -@mkdir $(OUTPUT_PATH) 1>NUL 2>&1 + @echo ------------------------------------------------------------------------------------ + +$(addprefix $(OUTPUT_PATH)/,$(C_OBJ)): $(OUTPUT_PATH)/%.o: %.c +# @"$(CC)" -v -c $(CFLAGS) $< -o $@ + @"$(CC)" -c $(CFLAGS) $< -o $@ + +$(addprefix $(OUTPUT_PATH)/,$(CPP_OBJ)): $(OUTPUT_PATH)/%.o: %.cpp +# @"$(CC)" -c $(CPPFLAGS) $< -o $@ + @"$(CC)" -xc++ -c $(CPPFLAGS) $< -o $@ + +$(addprefix $(OUTPUT_PATH)/,$(A_OBJ)): $(OUTPUT_PATH)/%.o: %.s + @"$(AS)" -c $(ASFLAGS) $< -o $@ + +$(OUTPUT_LIB): $(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(CPP_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(A_OBJ)) + @"$(AR)" -v -r "$(OUTPUT_BIN)/$@" $^ + @"$(NM)" "$(OUTPUT_BIN)/$@" > "$(OUTPUT_BIN)/$@.txt" + + +.PHONY: clean +clean: + @echo ------------------------------------------------------------------------------------ + @echo --- Cleaning $(VARIANT) files [$(OUTPUT_PATH)$(SEP)*.o] + -@$(RM) $(OUTPUT_PATH) 1>NUL 2>&1 + -@$(RM) $(OUTPUT_BIN)/$(OUTPUT_LIB) 1>NUL 2>&1 + @echo ------------------------------------------------------------------------------------ + diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk new file mode 100644 index 0000000000..0d15157f4f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk @@ -0,0 +1,25 @@ +# +# Copyright (c) 2011 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Optimization level +# -O1 Optimize +# -O2 Optimize even more +# -O3 Optimize yet more +# -O0 Reduce compilation time and make debugging produce the expected results +# -Os Optimize for size +OPTIMIZATION = -Os diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb new file mode 100644 index 0000000000..4e8375b5f1 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb @@ -0,0 +1,37 @@ +#******************************************************* +# +# Connect to J-Link and debug application in flash on SAM3X. +# + +# Define 'reset' command +define reset + +# Connect to the J-Link gdb server +target remote localhost:2331 + +# Reset the chip to get to a known state +monitor reset + +# Select flash device +monitor flash device = AT91SAM3X8E + +# Enable flash download and flash breakpoints +monitor flash download = 1 + +# Load the program +load + +# Reset peripheral (RSTC_CR) +set *0x400e1a00 = 0xA5000004 + +# Initialize PC and stack pointer +mon reg sp=(0x80000) +#set *0x80004 = *0x80004 & 0xFFFFFFFE +mon reg pc=(0x80004) + +info reg + +break main + +# End of 'reset' command +end diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb new file mode 100644 index 0000000000..15a1792a91 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb @@ -0,0 +1,37 @@ +#******************************************************* +# +# Connect to J-Link and debug application in sram on SAM3X. +# + +# Define 'reset' command +define reset + +# Connect to the J-Link gdb server +target remote localhost:2331 + +# Reset the chip to get to a known state +monitor reset + +# Select flash device +monitor flash device = AT91SAM3X8E + +# Enable flash download and flash breakpoints +monitor flash download = 1 + +# Load the program +load + +# Reset peripheral (RSTC_CR) +set *0x400e1a00 = 0xA5000004 + +# Initialize PC and stack pointer +mon reg sp=(0x20000000) +#set *0x20000004 = *0x20000004 & 0xFFFFFFFE +mon reg pc=(0x20000004) + +info reg + +break main + +# End of 'reset' command +end diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac new file mode 100644 index 0000000000..959583582c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac @@ -0,0 +1,44 @@ +// --------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// --------------------------------------------------------- +// The software is delivered "AS IS" without warranty or +// condition of any kind, either express, implied or +// statutory. This includes without limitation any warranty +// or condition with respect to merchantability or fitness +// for any particular purpose, or against the infringements of +// intellectual property rights of others. +// --------------------------------------------------------- +// File: at91sam3u-ek-flash.mac +// User setup file for CSPY debugger. +// --------------------------------------------------------- +__var __mac_i; +__var __mac_pt; + +/********************************************************************* +* +* execUserReset() +*/ +execUserReset() +{ + __message "------------------------------ execUserReset ---------------------------------"; + __message "-------------------------------Set PC Reset ----------------------------------"; + + __hwReset(0); + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} + +/********************************************************************* +* +* execUserPreload() +*/ +execUserPreload() +{ + __message "------------------------------ execUserPreload ---------------------------------"; + + __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac new file mode 100644 index 0000000000..ba86029d34 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac @@ -0,0 +1,44 @@ +// --------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// --------------------------------------------------------- +// The software is delivered "AS IS" without warranty or +// condition of any kind, either express, implied or +// statutory. This includes without limitation any warranty +// or condition with respect to merchantability or fitness +// for any particular purpose, or against the infringements of +// intellectual property rights of others. +// --------------------------------------------------------- +// File: at91sam3u-ek-sram.mac +// User setup file for CSPY debugger. +// --------------------------------------------------------- +__var __mac_i; +__var __mac_pt; + +/********************************************************************* +* +* execUserReset() +*/ +execUserReset() +{ + __message "------------------------------ execUserReset ---------------------------------"; + __message "-------------------------------Set PC Reset ----------------------------------"; + + //__hwReset(50); + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} + +/********************************************************************* +* +* execUserPreload() +*/ +execUserPreload() +{ + __message "------------------------------ execUserPreload ---------------------------------"; + + __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} diff --git a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a b/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a new file mode 100644 index 0000000000000000000000000000000000000000..3e25e6cabd1e3367a2031f76fbb34cc4a1e43d44 GIT binary patch literal 117430 zcmeFa3t(Nvc_%*S-Ye^2*_LD*Y-8Z+0m#@GNq#3Jk#uEQ4;w3%3?w0yuBB^BSe7o* zm2Fa5M4&Bc)0QN(b%1pFw@sUFvn_Vw2D)Kw0?j5_+O-L^kfg1evNdbct^h$)%r^V` z&EuRoqjO`Y(0@|ev5(Gt-}jqu9%o+Xn>lkUuS<{h55BkL+GN<(uV24z!@4c&H*HQP z>!is3n@n!rvH=phz7iq4yM1GpHX$zL zdT5yt=ez#k%R;!<7d|hzRM0h{y^|4an@%rWApPcLW&|T-d{;*Ma z=exeNR(R*Xy4rX4whWD@_Y7y+M{=35v59O>kl8gcJiI$Az1^8yOJ>jL#7KXpb!ZqM z!s>?95Oodheq zc?@ChJ~ULH(|aI2t~8K69yDn-XEp=!#&Q!`1Yw^*wf)0m`9!+l#)mVR?19k%)#x?z zP%Iws6!npAe(xFgl;_fM(8^vFmC{aF-u>tXb5 zVF4S*xMHHmV~038;FB#Ax!Y2=^$(-hV<-Sx&}sAx9ncIv*6!Oz`a>}TYVmew2hzEW zqkN8h_lRt%GODezs|l%WQT1$Cv<+54kIwb1Mym4ln6!9nw}WW?O;8S$|b1>A|07zb*ZO4G&(XTPDifv_{E>e3%AMw_MnUUP~p^=PCz^)$o9NRD!`83AH5bYNg!9hvspz`t4k6^wZ znWVpII6ZbiXdwp2jP$eKIQ{@A%b`1!+GT=u)7Qhw*5wbQWCYRm^y(D$NF)S$4A$Y4 z^6sv7jT7|hd`Q2aK}&$DK*}%EFm-)bs#|h`$cWyB<{;U!0!d%{c?-FMzg#FIk2ODf6LH8Ji9S+s4#T{eL+MFkjd?8k|E(~HlCDVnfDB#b8R2# zAIluTgAQ0h)UxFI_opy7%847%{fKUMOrqz;c4|(^W=F!55&eGf9qDmSrb4{#;q<|b z3NN!lMa-Nm4_YwqhH_|YVt04buAU&jnnuCM$PWzVkbM>9 zKp@jeb_6P0N}QfX)mQLW+{f%O@k8>{BbTBrbptKYXxKwsyi)mDXUQ-e1-<27c^_KoXyQXxX-hCVD$boit zKFXUK9m~jirMiAGE&&)khcKKDr^g3foIo_0TyI-?WPtPL%;Ek_mQSZQCyOIJfH^DG z(?cM-hSA{(`TWT0H}mt}+}O~*eb5l*W=9WY#(KwDYr}%^%&ij{yfQfK+|Yrck$sYx zQM2CkNdKUu2lRZ`XQ<+l31efRM~CUxgR#Zp#K>kFZBaZIyAS!+I5YTDv&}vz2P?xJ zMz4#hOTg6W%B5A-Oyq{9CgYd6LQ$*YQRO*~{JAWq$sc}t<;2EBAI0ahv-pS51CAb& zW#&li0tpu<=5rjV(M1fUhxL4nQJUPCBFY1El*##A@95sWh(GjvjhZ!E745bo}u)3 zZ~w#?OGv6PPhBZA#gtPdLmaZ_nkG`4>BgKzRD06n=%#k|Y-{WGo9({rUc6e4iG3&- z{hIF2`**jraJ1>p@!ge#>@MhO%7Hg1c`X^=OYzn&AGvj8AUg`JfDuq&0##V>n0soQay%B56FR{X?Pf2l!+2m%XTjAk+=bySq``7&RHDYbcwk>t#IsKJAjNW0?Rf2k`(Z zlNpezT(sWa_Hlox#z?Bi>Vb5BKRaqPEa_!cGu^Xf_*GH&*%nF-`>H>Y>^Utcq`|Ll zDkioepQT!dgopXMl}U-L?HoqX)W$jP;Eg36B-?HbK@>LEG!Z`@zl}%^^KN>Saa4$Y zIdn;p&e`7K%;6#0R~#`zTEmyGO%GAF3e#swo+;cAlLg=>Lv=E~!t_Xbcyu4jAU8HT z9OTmB_oqj6n-=uyXly?WGKX}M<#-T;h?1CerYCZvd(smFy~9J8OpK^UZw1XOHwxHG z4v(e>diS!m$OP%4jgZK?h}kphz=3RUe>$6kaSw?`tqElXrJOO9HZw3MQTfCsO_ak* zfM)fPP>Sa8{Q!s2VzQaEN`>jULrf-p>~QZm-nm)n_JtJtwLX-KFgM%^q~(L>$#I?A#z*fG8g z+6>t}gg7}q$OEwHSannt1m}8MkqqH$S7H-~?3EbD9!#W}O_ABFXU6oHu4D|B-Qby1 zV(Qo4xgwUBoReef(vLw$RdNPmkwr@whK4LzVN@arc37}*?j0RFzzN?0OzdS^t;b-Z zKo(&ikx~WrxV`5#$W@RQ7Ntw&77skV70cR5fcheZIlw26_iF zdubW!9nKtt$&La)R#ib%BbN`IQjp*~(}Q z(B(^whxLR#BcXhL$dsDHE0#`lP~q&fhPe#wbJW00uvIBY!eT623SVmjI&&bK^Jyf3 zkKCt$SIHPKA=u-{S2x88s)ej7RI93#>_`0~Ruzw3tIuNMpk6f&y9_K23reap7F&}m zn`wI2+}OxIoi-u;`nf7%PHEbZpzstpqC6!$%-6lTl*kN@%9SmZ#j)|6YATt-n6k4k zRxL#Gbz&yQF^XAiQxRSM9JrNUsc&vT7lE{*S05kUn>&=oh-^hFy}c@xLTa>7zEH&4BjTIN(#kWYHm}@$`Xphtq3EuPq6h8hE`U z2Z#E}#T#CIokUH5OeX8st!vn{Y5n>wo8YgjgGT@F#`Wuy$xU_Zbo_lKcWm9>>Uo|p z&J(pFpoDl%2@2NBd#xxI^Mu%zO1&#t+b!2W$8Jk*TfI8D9R~MgLtTCS+PZbutZ!JA zT)%e1+6K{7hj8gkde0EHCcs+&LsBkt_?jK-#JrNi9mTPV#1e0*cX51~x7=IdU6v4Q z$8S3T8xiigF?Am_J_O8(wXz+r-Gi5@wH$}|QoOcl*N(O69NtCtOu#~-l6+x*F9D4C zMXsb%`P2k%G3~9yow&HBU7RVit02cVmGk1T%|z;B`Os0{YUxvdsE^kMT!=HPxI*;8 zQ*Q{|O}ypso3v4kEi7UyJ=z%@?q0Qaq zC&bG?Fnr$Qergpr9!d%2c8sK%n!v?H0VQT=dWQ#%z zP<4M31k#vt!6Mn{Lolb8@CQT>uz@iIR!kQqo~)rYgL(Xnwhg3W8! zv01FIYiQVJugQ;=F;db7(IS8Y}f(`-TB9l_3B~!E4*_CK+IadYVjk@S+;ZB5`e4-~9g@Z8_L z=uIz(7cW?_AU^7i&Tp(f8;g5W@zKSp_`c@8?6z+fHVte)(X`jwTQOa-Xvqn0Pt%@H z6?)GsF7%!~IXhX_l=grsJ05$mX`mD-5>wvZ`A5Bsm}<(D9QFEf@ArTyd+htiFKg|* zte|yK>yp;Q>dO&xd^#R4t*8)HtqVJkYg+U9&enRoU9mS^}PzES;J+?Zw5X ze){qcHdnTOuxZ}*uf94Ne`wpwXGAjo@bqKiMDWznE?OrCiy9NB9vE8g=T*-$-#KF~ zC$MWH_dc%mMS2Hh!04W{4>BYZ0ksW=`GAs39~KQgT;0|CBLf`xYL{e)r8mQ@#f&B3 zV~t(!nhbb|bk5$%w_#%b?*sNM6hpXl+whltmBDR>AD=q-&fsnW$Hp~-Ug4vH zxp>aO-3&S^-j6!CKF~{W8E4|<{NIk3`lIwcO?nu)SU4$@X>u|6-tQHpf6<3m_P>CG6L<4mv@tQif%{6nF51ptj5KBaC~&%yKV;K zVepMJ`V4LEHvjDyH~B6YIP)|VhwouwIo``G7e}iI%S|gW;R_vk7#+tG4RiQ}0~bdr zh2?e);d3i-DP864G%o-w8io-r@W%lKPhW5EmchjF33qY=~eT;ghVu-zrTr=M{LK*Jzq)s=)J0XwDK8bjsObSoFAzsGt@Ojvz=>JEsL6>M z>|g!K|6G92F1AVt_S>yp()!Wti=a)y+WB2Em*NH76(Ya!O z)pRyimRi<-|42pQo6lyqiFpef6+b?Qzo?_^_~QN5n9nWlZ+zX0-#0S9y{0h!jQ8$; zI_)LP9-9wYHoh!XB&DAiDK3mb_QvUH%;L&8hlB1iUq=cvzJIx%MONC8me>)bMKCSz zVp=e7M$Y1~=IL0hgsF*rTBYV)Z=C)=NR7(p!Z|uh939Qj;fCj&RE76y3p)!=-#^$q zeMNKg%w)y=eJhlIx+u1S^W_x_8w)yb8Y-Kf6a}Y#`?ZI<%ieut?orZZ5B!KI}E&-ZWk0d8y@lL}lUBidz=7mp3lzC`rXqEB1JmM@C9ICgbOx zU3^RR^aJD7Gn4C5GdC|@yl2Z%aNw&(nJNxaD9iijPk!wO#qZlB;+=_(cxv&UPmMef z=W{L=n>_ifJ50!;AS9ksDbiMZv=p(IBK8$~vfJjvKVSMkJyOu|^+Kj1g;b=Fip7wt z_}=`%*Zw&M-ESgZ5An`}o~oIfE6R>m;aPZ7RnuOq88kIA{#fUc5iv7~w-^<^q_gb! z&S}x};GW{`B9Ulpf&b}a#jzzRZ|3&*m!=-vbN|REQBzHQ658@a*)`A9@mS}#hN@;J8@`pc(lOoWhgnm*{JG0(7eccaD|#;WhM4~J zkT~nbKH9wK)Uxz~spMwzzByY|uDFR)Ps|F>n_}HF^UI=sT?JmBviiZy<; zdEw~~rc0rL9B8N{FLC;b*+gYHd~xR}>feg={X?wFiH0{$7j*2L{z3g$W<@!}c@5`I zn>-dt><58un2vkrPA4=nA(7&0i9~s?sjWboN+9*(iRa=-!6%2xniELPU5!seXYlqY zb0O?_Js%LjJOOpY^TymQ51S##{v10&0tXHThe46udg$99O9%i_(m z)n!H_dzDX&6g9_Bv){1GvP5E=P?A3yKK3Kx;}?iGDfT+b(9%`i4R~EX4|Q{9Y7ct@ zg;Dee1G={GIfNTyZHje1Fu1G{$fPPu5sP(-nQY$?yvMVxU{W}f-4p9wj0O9Q-0-T-VjfK{^cHrm7)86O zSg{W+8}%}Q`dRd7-HGhBBrX-7_y;jn0v!9q75j>PT=E3!@5~$H;)M6^H%~9VwQ7ykjj1C+j!tMkv65q!CI^h!2shLw$CM9zOP{ofgu(528$SkEp zp!X362{igx=yQaDPKvGPX;K$_y*O7R_SL}R1D$q7&;hwcDN=5dlNW#_1p)nC8A0s) z3XrSl!FRKBW%;VM{(?|`LmPzBk5~)mJgBgEPT7aWbE>u}$WUuBg@7pMmbomMkifv_ zN?2GZ4;9IPrAw#E|1vUPvVB0lgsTrIgTgXtarru*{w4w|Ehb2mjGH8UzS`px#6_Xr zjuJ5W>?1z13;=mPwG03{slf-Ab41*lCU<7dkysyJ1~Mke-n(PvomsF&etzES_JW@z z8zyaL#_^q=t_>G$0>(PC9sVd>+QIRiy#<$XM&HkZVe9)GXvSfj!F>h{8#fI)O5c|q z+ssCcU#+&y`4*EzT^=D~fy!A${I7m<&{4z3Jl z;wap2IJm|U4T%l~k2cjv+Vt%ExPTvR=M!@+$n4{iy{!G0c(02kH2T;t%L z$)oRj2loPSQTZKpaI?UbMm&$7cW?=G{86~ybZ}*PaF05;m3eT_I=I?AxK|w9`aHNo z#u8XGh+5m40uEI=YpTcua2K++^*P|C5!N_913KQ(W%+LQBD8bZrr!KURXkk6P;rv;XXwC1t(6fG%!AIqc1C=k zuhQ<3nEvRsw4na0MGzA_E*3iFxzJgATWFy2o^Nd}XxH|xSEi@T(O)L@2kkaU86)7@ zTlfir4D|n#0R-t z8Yq|eiyZt#j(&6wmWzvv9sI=({$dNw^el7m%Ot+hM+G&HthiY2;Fn8$Q2&EfRE1yR z;8#d|FdhV}whDiVgTF-L(Y0yEx4^)~(Zh$!f2G9N`H-L{krfx0I`~VS^jzwPRQSsr z{ACXQG6#RTgTLItU+&paQ$E7;DegPU~%kB z2;;AD@Z7l&xVTvB;MY3%wE-BuxVYBAU+dtnb?|i#zE0wU@(fxs1IF>SMmYWT4!+*e z-{9aIBtGe*_&q@2;+VOG^{B@Dw3m$m7{0jJt z@XJM9+ZR|zDzF>zQcc%N`Vv9=6oSZin+l9qyF&O&#bAiOO#F0+zFd4#(`*S9A}RhL zL|2L@Lv)q+D^08XRg3S1=o&#g6Vs#0?+UR9FA)KKr7-pl_57|98$V zrdcN|(BJ(`h+ZvzHAJrwzZ0Ub5q}b**NW32`dTb(s`RP&>cqJaT`w+5D7h-{2C-Vx z>t%Y@iT7z*gEp|H{PM%z z=jY+Oltq8G=t*9`_F|#ed5%zw*OkWtYc;8Kb*O4 zMu1+@_T|bY9m_la*O|>TlQoG`Wo?gDmUUdz`B!JWnvXZ0nk~I|$=TvX3r@G4jTN<> zEiK)Cwy^NMsSSR*AA523uDkmT?v2xD&qSsDAeg_0>lCgxab=G$XuYU4(YpC)dFy<9 z8I))(d$gqOJC(&#nWMF>^{w;3YdI@gY9B3Vd!e$Rqo8vhax|}VWnVT__O%@H=^Be0 z%TWFwZ+v2~-CNo0wUnNCe73ae@!7H}>>w1IkBgU@7JqZLwE4H1=RIHCwsYp5TZ=l1 zJBwKluK4A~CkL-+j-M#22db>O?}^!>s?B~pTw$ckQpb|SYq5!u!DGz@&o69id}Vd{ z!j6TVg;NIx{{VVR+Dh<*ch3C!t@EYcf;YUEPYzy^@S2;?#$%-?o}67)_2lfzsvr-0 zp!*YAKfk)FPOV6lr@TF7k3BK??ZTcDkMH3(UtaZH*z@RB$DyyO&-m{2eIE8UYAJo` zW`t=|i`OTUvQ?Hd#M!>eTGY`qht~oLvUq%1V#>t#Ik@&@$O= zkIOI8?u5@Hg^ORO-H9u{iu*Qy5HEi2>*ALhV@T1HBQGOnZxVp7oX_TD+GRdx_J<-jlPN>zlg} z;w7*A$=U1bJMg8MDt#eN>T>d=u6fYakD4)0){Npuzk+!11snGtYxh-y2aU<1v^W>x z&KXh?S0k=TTyol|0rKcx|BI%Sf97Gtk-I5%I^fnHdfc+FDtth%Ies`edwK2JYt`s^ zt?V-U1&))F2jkq9ye^5Um8eY*5A7S_$p*qKpK6i4(9>_TPW4){2~c5)Dk{1JztP^|0_`IBy+7UEK@Os zc{-9X^G54Dbt_ur$DELUgFL9#k}2IrY(6KQlbQSgC~x)8S+^8RX6WPAA9m)t6;P!} z1`keVck71#pq&B1sU|)w+}W=k8&${CsQcR9-o5z!lHT668@H@$KvYs{aW~g*iQ=xS zi{Nfqw>g5ld40Xl#W^|kYXdTfeDnIqpmpp0paFK%mUVCaV4WY=&bK-}#G5r%T2yZ5 zxUU@yC(_aKWv_cabE#VKr>&G2UYtL?9~Y+0WK5o3-H_e?uEWS@QgG1 zrogcEebLGX*J+KubMV{x@Zk{Fg#%~u;qLUqXHKCVF$UKJWwyQ&SoBPtpjLz1=ithK zWBD3qaFY&hMIPM!4z4B-?zn?nn+M0QnDO6F`)1&x^6|eM+u>lZZ%4iBWyWW4tYDZNX$9`cx!rSG%3<}sM8fWxz=b)|cO-o-5z{FAC zHCmrZZyN;cJB>5?HaNH(1n2^N$28G(I=D{&XRp5-T-w3?XW;C81_pP?!JPn(R&wJE z?w1|hw}G?wQ5f8BYn)kQ`v>5jGD0Y&m)9{z-=k-g&AcoYk%?#pF z&dM+tJiQ>@rPKm@{=i}`jkLf9O@TESI9`29| z>sui81^o?2+Q4zgQy9O<$)CI9socTaHJ$PEJOJC-EsOHSjvST8a@>&=4!^{bGW=3U zZubO~U*yQ`7DoBSj@)iplrMAS!QKldggc1B>9cz*%2zmYd&WfhC60XVj-ar9y9ZKOUM?QB)PdNUh6`J}ho$!^8yvmVRIrW*XEpTysn-Pw$M&gq` zq{jEr6UR9-VGUP0@~f~%M>&>^C$4hjwSM2nC&v>`ZO0ulO`5@)<$<;xcf{<}3_ckT zwC%V9=EIu7n(u+O9e2FgjyqcRYX)1AC(qsp5Zu9XnqF_7-C>jj{ zipBz)3dvv%2xPPZ^!BF5aZWTo<%12w{e?RHOGwhX?Hfb1k?Duq$zj*gW;q!cWMGW* zImQGR)^C~Ee9NoF3z^-FsyXui_*ugLAAXh)^?DFjtXX|I7rS0fMq}MV(t{Ek+S0jr{Znt%6LbjGlBKHCTneu z;|E>iU{apaP(OXS#^3JaxvHs9!Ku~(?j9f46oIQd-ZJj!&8Y`&U#JpzPpCLjq@qI>L=27_QeNzvQE73iJ{bVBK}1B?uf0FG?g{YL2bQQricPE;w9LdHmeVGv2u+@BjL-;zZNg#QU3OgtzDD(!(V+ z$Is2Yk~mk<^TM&37*gEOJR_RRQy)6I@^DGj7jZgh?A+q!J=1r@o<*Gfe>%4g{{ro(ph<73Vv9gmdHC`-U`UNrXrIP}(jY`%!Z{Z|! zA>MzF@LIrc407R(F&E&aJ(-K8z%}=*$xb82fvfmTzW@C%ott?xacQK{lvM8@q7yTeCS{Inb{?Msk4QP|5(v`ThA6=^zCD>AG>n8u<+?))zk0e zPJ_~aI94@%c_DpQOy5y>Gxi?To<3O6dN$sFX$m#q)vae^&3xho=ay_poLjtv&$gia z>&H^lv3T=YuhM?HkISbUbDnNYOylWJqh^*J|NkES#iJiQy2L8qig_s8@zk_PEl)Mc z@+}f&j}^Aho+-t%`{KEmU-ix{Zc@)KE}z|BV_Jl>^QSNO9>-ezkikquF?yr)bB6bkO&D98unG5PoPOR?yQ4b7LT@ndx*!5cK|p(PvcCyW+%R>FWl*E{KOjE z6YIO2G9Xq?gaG;p@njTpK<2lqF?q00Eq;0|gW z>p$H;0C%hM%D=?%x&wb8${Nv6p@OV4gvOAhodG!C(eD1MRG^*l@^11#(Ij5Dvj|9w z)z!FI|5#3}i?+ULWR}m;IHS+d=5F)f4m&T~Sl|-!{e79wU}^*RFFBPK*|)xA4ab)6 z%i17*yJui|z5S=k2DzjDxnI79<#SJw4a=jyY;E&FeDZ;d`m!~UGCgy@WDUy~`)!1p zJ$a^cfS_I2cC-T<%PHHI7g`Zwd>8qaJGLn=w9-QP#kM-o%jCC5tds29`K8e|3&Aw) z#zi^%8rsP+npXHi+4lwEi^Zgt-!1X;1^ao*+2>Zkj({~04``_0z`_KwJzvG(z zili5b$2GlO(q+C~PNk<@Oldj$INH^Onq;a|b8TymZ4=@=A&_mx{6J5F{7Gxr@}nn2 zzLa#HDX3N?=T179?+?wOv{25JbRgHS=1UX?GbJ4ib0pO+W7TTCFIFi;5` zcIeB&{GswI=gP-&x#*L7^SpOA;0K1}Yxf1bci*l$S^vFzF?!XenaN5I`+O${v)d}C z??_e8{50OHS07DaAA173q6_dI9v{TJU&OokNrWjozUt9L+nqkv+allE{r%;fBhlG! zBssp3sLiN+>8Lx5Ukh8$w-Wufk;9ZX`Cjb5+|^@#PrkiJ5_p>G0lnkiI`q3m4}aXc z3wu!e)BFK@Ge_^?D~GJp_Irg@I3ZxS`bpj})Gsu?!o!muy5N90o&&XeGAZp1Pmj_DZ2WyhPbptDY0yz~%`ZE+zs`euTH{Qay#zXHuK8{7@oZTf z((x>)t;UJYMFfoeBzMJJzhKprn>J+@92jzD=J=z(4hBkMb z|F1FEH1Y5rbxKTF9(^iI(g&GVs2EYFy!cRf{v~tIaQITc&ZxOmsV#>71-N5XWUO`zXXCy|C2I*JOt1xx_<0o*nwp<`VT6{wq^_w}$iQ5=+pd;R_+mBx3S!6Ks=r;@W&X(OS@1 z)Vj3w2qe{glent;GJW{^NzM^U>lv`zptBnk&eiif`_G?YuUF~|ZtET{DXd|M<@#n*8__sjZNbi3ZLB79Q zY6bUs*LS75Ek5mmdI}+@B@Dj{YoiuKZq2vo_HnEr4~-9I0D7xtKiLPcO`6`x9s5oH zT?q_vrk{3kl+nGFIf6+8^_Y0y1HYX<_Bl~FEYF2-jiA{t8E5qE0mIhU0y+x!5eL@> zI*H3T6XqZo_SpY%bdLCs{!HD8BmFD5?05$?A2;bt`hFLbjpJZ!;v&%C{=~s?ZesWF z2KRLbHwik4%Q%C39t=C)hd?vk#u?l{fEdsve0tCFTRupuh;Qq_vWavmTtVB-{&(dc^9rg{{OUL_cErNQ@?fWr$7+7zVeh`8 zn%I5Gn)rSAn*P4h2Va<9aG$90{>$#!n!eu?N6)?f`ok|>v@`Lvx4vM_tEWZsqN(?^ z#MjJwZue~Bj=d|ng8oQz;q%Q$=Y3ARbhr2Z*(EE>`@E_3t=~HnKf1EdOBV9iYT01`Uk<94c+GMt;|C;wQ zR9n;a*KggPTyjo7WAuFxep}xW&{6tsaP+lV`j{@GZ_v^ABF%Ryy9o&2K;Ep-C);ze!9o+SKaHllRr1u8kY%2sv>Hc2h8Z_MxL67$HMjWr# z^xf$D5}5XLB!+H2JoFpfNf37V8C<2tu^!TW4Rq98_iFGlq-7OKh%HcjA#>ef;NE2- zLtx|O-K32=@5LPU6d0W2RO4cODZ}N?b^9>McUIYkcMesXFq8^&|y8#vBo!*Vo6%kf*Bu)NfgQvU)+Zr51K z7drB}cC@g5Gm}x#@bqC5qq5uaNe7N=vbN(I>`d7%y(1b89z^7{Mis)Dt;+MFA(>I=!L@U zaZ%w>UUJSecL~(qGQVkyyY)RZ=7;Tqa*(%YK6A(UV1$P+7~2_Aj_TUeEGJLku*_KQ zF;r}pOAHUGPSYI6Vl{fM4SACErP}rgT84Awm(P`R?JhUezuy=h{qwl;%+c$&Y-+gB z^~*J?1M=tSv^mD`%Yj~l{#87rxwu1AFYd$M(6NWly)s?c;cYH#@9LXQ-Z_gCdn-TH zx2&}sHcB-QFPjom{Ixi*a~W1L74M@D7j$~}E*o4v=-pqu;uFnpd^7fNAe#r-ios=r z-lr#5+|%qmS9fCeOdx*;&rR`Ed+=0y+eiAxGCU*5GB0vnQVOkC0e||6YDrm&#{gMj zZp7~>S!DNcCWHCxp7HUuy#t4=0B?Ds$h{kE=ca#SJ-3}1(<;Fv4r8WtE{-y~t8lT+ zpAW}&<;H9Gnq~xIJGAEmAIG?=`V=*$5=VN6qpt$@9tFn%f=SmI}J+4_FR(#KKJ=(`twTi-*VlemmC z>H9bsw!Y6>`j{W1??L$O=XO%daFfpH`$JHSm(P#xB(A9W)tA6W9mwJ)T|EL_$oy&m zxc_bf;m)||csF&C^me^2Nn7G_TudM95A$m39=u`=^7~8{h3^e~CTzo;uWZ#cW9FC5yEM%- zalUe+rjwEe${%Qr0WZ{X`h9ZHVf(D0n+|o(vP)JSG2&o4xTeTw#5+rzca|ydOc(FD zLqFOYLky@Ebq+x~Aj?ZGL@gL_&kbmf(_cvJ` z?~CuR#osWV@a*x0SkFwf);?O?)?ZnSQyxnYOBt}mJZZAJx-W?nCa;!fOlB>cALFy# zW}H!3(wS(zCUIn&sQ&G~f|-9VD69T#A67^QADCD0Y@+S6{=O=+UTVTuYEK!`ooIW) z$8q%)DfaD**Za8Sql?@AvT||9lFovuQfM!0E9-J3wF=a&VM{}NesWt-JQa>OkQg)FbWQu| z68ldci%wVVqw%&M1m9-$2jy+jz8QI3iW4<|>DHwkOK}qEf_d|vEpOu~tBtQ*T+WkL zk^Zd(r%HkO_^qYL!3=UBEw`^MFJ~UU$2=hYTl-2noBIB=?=!PyWnbw#vMo4+Gb#@< zOSfR1Szrc;`=q?9UkPUZig7~Z&T>Bg;;G7+L;cm$h4FRRIhVkhkvnHTcPsbK+25Km zjw4d3Dj%K_`iHkhhi`o4!{rQrr}eE`ID8$Rd*dtn%MqrPjB_HgZ$3Peb&rE&yD_qG?oHL;hjSsHmC?1ZIwNrGQZ2|9!?+3 z*nzE$f$U29MYiYAkbv!&)=YWiVJ$f@8dJ@#FvIurM-Jq<$FT349&9}uiw3W zJ5ID57{FFKwa0LCojDA0$Y!^;V)G%K77o!IjcC`0Hz>+ars_6t)+idoyDx927g8;U{0AEc+ED%(gx^ z3&8^$K^X7W<**b(`WLX_x zm~WwBQ^UFdWCh*4-VYjZ8`cNkv<2MyEfEJ8LT?neehW6jx@Rh)0HTtQ$xZ~eegpKr z^v)Jp#H7mvKhl2f(oPHEMep^)X#W-%rDD>m$(uo^eLs zAuw!xS?DwQwcl+y2e9?=ms*H3&gi=j3|rq3E5DqdoAmtw{Ip=64}3qwfj$ZGAl7F)DqWWZL?st@LrOYxI4~(U-uBZVhpNoU zgV!$?e&>h(emmzc^+wf$pLX<}gpwq}v79f(WuDt_IQsZKWmG%=l%sFT(#Q8`qt88m z^4>i9jyn4I@|uJmrmxb{cN#eS_w6uWhCa3n<0zv$K9Q1JV&;`<@<%xpgcKp1&-$#hV`poEDh=#N2b8#`vuYf zUm1Ymi(?ms>9hFcJ-MqQfbjf6lLO+s&!f$18uuF zR<^ck25V~6d4^&9D*sy=){Ln03)4CP#|kgv{K8Q!XU&N^zwl?YT$M-gB+2G^hFqhk zQ}SyRq5twc!%u6!DzCMU{8~95CR53;b>wyOyJ#|%{-CEIkLMdcK@XhDf4w5~-?;xp zonr78Gf%_IKJzAATm#^@amKOreh(Mr%qiCdW;NX=X{?DrNICmNt_fVOY0k;G-jF-ibjBd;>&+P@ulCQ@UkCJe95O#$2Va)+dCjKW~?aVRfrc@O#=%f z4XnN`(KkvlSYV2h@rNz3A=4A(zR`)q9CH(yzLAMUU|J#-7?ddYGA`$*$HpmBqm9@h7e-j2C? zm)N-Lo%|!-o3*@;_boae#21POxU9zI^!+gJ2+VfJ^vQBSp@+%=d{b^A+=l$PP=4Cx z=0}zv^d=c^9_m-+g< z__Of8`t71PS7}ZN5BmU*Hdc!%t{!H$6(22wKPmkmec1b?_dw^PsiFJvUE|~FqABlz zbw|Aiymxz_O5t0_?>{>ucM|dU)IRhme?9HOe^m{-KjA&l4c*_uw~>=WlgElf+P_`+ z{byf2v#ganl}^nj>bs$TN&UMY^{VkZg7|&5g#VjuOXP31m4UaU(o1613s>WiTJhqV zm0EMU(O+|Ve865uGBZk(N9OCzX9Eq5_@aQnDfc+8l={|l=p?@N49DHm)cjUr{wE3%?`fC+>alp^N?4J(|sHo1jj!?G|3lsl_?egrmJzVC^m;F1sRo|&D zPY4WYAsoktQXhrBTKfka+}(L_cR9FwL9-7x&glC!Fzoa_0-9+w&fxwF7&h*EpqV%0 z4DP>yVdIv8Fg7n@4enV7$8*z)2++>pUIT6G>j7cs!<664z}fb%oACmX1dnf|EJxy~ ze-Xml`fdkN2EK77-f9Q;anMoe+v4Ev18veookrhI2X`b7j(gGY->)wZ=D~f$!94^z zs=oY+#+hgEdC-+6v$%tl*Jm`&r1#H2FL7`rzo2oPuh9K1=v$Rn{sk%Z@x3Chrah9+ zUyi>JyV=hH_Y{?AXS}?dv{A(GryoKDSl;-d=h3Y}pcPxm}Z~zu1w7(cH@y=D2pY z`Hp<<0lm+4vP=;Pad;CRMJSf6ddXZSKlZntpC%N==npd3Eh>B9QW zEK0%ntwdOEuM9A}-Ev4T_173Ei8`;&P5|w6v~;mfw&0>&;u=k}q(rRoK3u5N4L8s9=7j=wN20Xn#(n$Y3_* z!{t0my&qqp-%qa;B8jq&fv({l9q*w5`>pN#?`?RmtHbLZ-1*Or{~{l(_1?A+^`{B% z6FX-_Duuh($u}=?09@9YQ?wYqoEFVodurADSbe#niNeS>i(UYM9dxXqxc-#CNY35Kn&5j6V}oJEq?rbe$2FQ}o#Q$I>q8(f6z|nE!^vMsV~1?)>Q?t) zcMNuyK!4B~Xi9ej4Dzy^nrDU)3D8*&n8#DdDF%V?c3{AkS7t@Svd$H^JnhAvy|`n=o`Na-YIs64371B@4ypF<7`2}Ig!bUM~VPkR8CJ&eJ-nSqr z9`ob`c}+*z@x}Y&)A6{s`s&UFr{do%zvU@!#j{sT)wZ_}70ugz0wYk<&Y3rw>ZZzX z`MNj%ndaxW=cZp4Q;UGA*dLqD#2q?$1YFPz6NU3fzm)yH$Jyn+Csxf&2P}3p*Ee9BE$E={+YZE2b8<-_sm>4kdkS z=~Suqi(BVSmB4==a@Ke&Wa;w0<#KHOPrGjP1k0*)VdEW7&5OP7OSSPkuKitnWQ{o9 zvFCGi%bMRl68>;eGE<{t8M*ge{T7rScXd<2xoG$?tKszcpjbNqYuQ?*$Pe?@O-?_q zan(-aYo;5U=U}U(jbT0rGHU1ufj6Xio)sy&-qZ$zFLLlj5`UeKXH5zm$JZqR37=ha_?+h27cK^hWpWQLj=xo! zW?kfXyIIq$OB`RZlqVhQiG14+50Yl&wK@=|3((z$4rX;24i5V7#udYZe?;G})o)H} zj6MIm*1C-i7kpm$!>ZExqDOi#rRa7Pp^Tc2Dy^J^i;g zo$gAk`~I1-j!!kmpB7cA*~IGEGYi`nc2-XJHG41jHC5r)q>jEedHMZ)@u%+}Y@Qao z?(ZwYH*^1d2HA;r_&z^c@b7^8jvY(!@|nr?wxve~5+;O353fsFYp_TT4NH#ojrX#rRcw7(ih zn&XXeq_IW9ccjhuLndiHXX8kJz!12T{wYnfE|nwwwBH&>`9VYAPWqz`eV;@Bu0!Ju z!*>k-4WCl_{=%W{&Y$?#9r--#0aL!%p_2~1#-aK9Q^qkozqc`tbeBVa*r9K6=tB;D zmqXv{&|L2_j`96xhyId7f7PL%b!g5zjibI-9on-R8|4cf`Vxoc_cO*3zuuu69eTS% z-{jEzUcfl&%R03F9TEwlobz7eNZ;qs4>>fyyD^UVM;!W39h&?8jU)bV9r_;~`kX@- zS$z=03u!r>$Qmn%nc#&-wO)L#c{nF}$1%E%_VdU2ddEMK855$1cmw+b=M z`!@VW#z6SsW#8tzA$lL?ri~l1LzC|O>v;(^arNIZH)5uF&HtWms@iey!^5rfS{Jq6 z+xlSZqCZ>oq`7|W#YN(7Twe9MK2f>zY+J1Hm00zyeP5kT)_-+2QU2B0CFNf__sYw$ zbLC^PN4+hbD?cQ@bneyfFX|LkyqBIUeDlMzRibZe!P8zt+10bBahh{o@znTWaqMHq zDiX_6v6*aDNouT5B+DLt?8WIjQ4FH7d67sB7UOq!%e?ui6zrg>!Kc0Dsc#;`@AgXS zlU{7PG1l%a#;;W*HKy?D?D3t`B3}C3caGiHT=evx-~6DM_eNso=LWrXYf^Xjy?Q45 zSeRF|`tH8hPK%nqJN8>I7Zv>BjCAsb*MxQ-i4)5mza!);{%{9P0Nu)Ng8dIK6r2>pvKe*T?F;su+GDCoqwMm>4&XfF2*ymfuV6uNP+C|2V0vUEGdx$29v<$UD>QNCmqdr#hf>sGdXcc)1Pn2L25jNM^zejT z8k7xVayy>ubwxS{xwKtGCV^otwS+mcbntLh@tb|ZrktV$%mdCzNsr+a^pV~J_`!2G z6M3bqMON5DI8c4`kQLgI&n@2Y z8a+roBhf-%Q||#Bv}C1%x!5z59`Eg+7-Jb*B2(w=>TAj-XEUke(AZEelN}q)!Srb9 zU}|kqbn3Eb*?ZFCsA6hc`P*Q){7G8JJHl~ByM(^4!Cg()6ytlCYjd2!)K$*ii6c$> zl!t2`E;`Of@jBo;4q0?J;j(ex0v(0RIXH}$p>qX{zE3&0e+F%@e;M4v4(=u-Vg-1{ z8QlK>!%p8Ah!O+B-QfP#!Ev8=6mHhR{XB4{jHuS=D*_+?eHqs+qi`2HxKDzPinq?e zai2GzlW`{A9S-hy^5}EV8R2)HQTl$)(f7xB^!=8DI|(|f9{e{4_vfHZ-DF-&KAv}Q zPlJvsmw$9{-^qhZKruxAGvL_>QTe^d!BKxyymbz4HV>}d!Nou?F%Qkk?>+~|bVQ|( z``zt)Btdh2X`Cs`&pNoxpszF_+(AnBRR{M|pgCtX&fs2ga3i3j+S}!ryV~iaT`;O1 zY;|zIo=4xXgX4OpZQBPa-7h=1uRsu$kIy?e+7(TiQIXO2-yPgvpZxnNQ_;6-_3(-aBzPQTvWO2aB#E0MLmzSgPVu+M&S-RIG&3Vh5Lkqs{$^n9eu&U ztpU!i_Yh0>4UI$crCSeNqxSP=a8GMootEW*yVb(6Y~5Y|VIy@<+pEoelawHVYBaQa~|wOrJ>FP0ejD|hyvqViZS>KqtLjPQ${ z@Y*1&K~d+zgu^d&!iQHwe;nt;gwwaeNuNFPuzt)vHzpi@r4t^8X3OO}MV;q>#ZC~!QN zCM>sC^O^p&j(lwp7{0i;){$Q;$G)If#e#z6;#mE#$HriHhXV1O8r$()8Z6PsF^BJX z+<$KIE%x25t_g#16&hShZzwf#)M3>6n zKBb)RG!;nAA8EOw7s_>xAp9a>-orSy^ZTyvYP`~4F82!%ujKeb3`7uqvA9ChDnCoa zyEV-+t-$ULuKx%4i$rgTzF3TETIpXVc-~=vUoL(%M6VF$eTIEN1^Smi358!N_&&n$ zoO@T`>$~r1nk}J%{R1Wglyl6lz`0Y`Xj+wTQuJtA<)>2QLh>r{YntYqt^(&sao!u~ zs}Wz>A$pDI57F0% z!h<&+9c zZq5U9l!a`jQEKJ@@|aUiuICt1DbSJn#?4Uihq;#7)Tnd}riSf@Q>Id~=NL(?$YBX3 zWr|6Yb4;Q}dz3NM$b2&>`VYPX#C{5&(+*^HO(0sQ=H=oro zIVZS~cj)I309zD%r>cXB6T_D8Xgi{Ejv<_nacnEY<-SAHreV+5j6Og^&gQ=z@6fh# zev>F0O}{8X+Zi0UT93ciB5&K-@*izSepe-bKJIN;h57OAAOE-5c5G{l-A3&CZS()N z+722GThC~2pWS@?)`R^>8|v!OQq(WP*Vol;T#xTy>g%>#_=#~U8wKpqcrH*W`jVpK zvCc~d<42EdD|$?_-)SR}|MMZv4ng@-jr+2DdxyrcHvg8#s~^{B#Ziinm2aMOe6}1V zjN_<5$Chc=^y?tt$ig=kVtA3}$izEFHtAaMmonpwe-{{xm+{jP7d1+L2z+~#JP!Io zM#&d}+mFjQ(*k+7M@d@3r@)(!s}vX07d1*Qf#530j5GQSZSFSz?P%#N-@qlL<$~!{ z&XlI2XlbTpBXH)aDh^LBvK_z7XI`0R-f0QJW>M*=nO{Z--JzHr-cBnp4M3J%3=jU= zdcE;ckI8=jvoX5=+0wv1iSGO}-|JN2`uz{>+LHB7>vQBs();j|uQ!?KS0)^F_;0qK zF(bR_7ue6(wb%Gt!RIqI{laGWqxyxN;M@Je?}NUOet|oGdvO`3s+5Y;?iZc{@en}l z^LR0RQT+l}SZ({J(Fb_Q+5ESoU!Wy2aHjMWN6w}LASp9}$*>O>Qb%&^F zo~>?N)xp2sx{}qeoxZBGHhE;*Rrq!`*?J}ZstczyjNLU`oBCj1O=q(8o3o;}YI<_) z3Eb(&_qM*@=2y*3?(#7qzi2jmV5EP=Aki!OcyHXZqEG78GW#r8nJfFx-(sLSS<+bE zS$2H+;MgCZc(wOeSG4lCx)*jrN72gG%PHc?dE*_e3a*=2*^Wta68C6A;l zk9xo|)Sf@~bm-G7rue>ZOK#g13n$^^s1hi?W>Go*SSd>izD6{i{uwj zU*#tY-#CT4H#r>>`gbRdZcj`nxJOvh38_QY5zw>8m$rT-9(!5rinqpIJ6UlA`JZeQ zudS(hX11>Bg~HdLy?Fb(AH8yLZA;_YdCy-l_@^&77R08+l`XT?eLc7?Y7tfcxjBC7 zS8x7OkJs=|XTVEd-2!QH-J?aA-!`tEf4UHLtY`{4t5v>G(@-ChRkf|NYUYc)6?US8 zld+dhHZUzrNqLqWuOWrMNG)7ZN4#~{Y_iOI>14h4GLE2s?PPh;;a#)UWnMjMH}*rT zdY?T$fBO^h_{*ZZXExatf9>SrOIt)WzAHcVk2n8$4}awq{N!S!GFg|^zjw+q|5h63 zu%L9ND^*#=JGa*%4Jgf$E>m82iTKNtsW|eYo`uN^pOsE2_Mi(9;KF%!aV8EiGl`ww zNI#y*Jk-NG1X>Bcc#oynUYe&TW3nbld8~68_RN2SPgK(HI2%^*=Frl@L-4!hM{L0_ z3+@KHJ$#r7Sxq_M%47LbgcyL+%> z6W^Q5-OYrhhBN6g;^uNC*atFr>nNZ*$HD^hQ;x{xM7G`EkLoKA_@OBHyNXV%Wbwxl z?eszW!6=@UF_i7F*&@zZTZi_J@?8Ja=mb;as6&3oGrMkz=J$Z_=a@$l%0mmAhKI3F z-al*_Q6NuE>ep2*{I*Q4bu4`#bN$4DJ=|}+?37io5sw!TKtr*IiZ99;^R zt?zfBk7=Pkrp4&vI<2j*3`7@r#up>Z2(NX&T+R^udrLWx5_nM=R-)Y;sPfYsEdbg>6Jcl8wTvj1*cKW!E z9EIEJ;P^fFJxGgjCf+9C>~i@Y@D zu%oXGZy~itnZ}VEbo3>lgy~`WxR!48O*;BEL!Ywp0im0zACU_Xx~R{D~N+obQCjz0d*VU)iA>F8T&>8rBz zncqV+`Q`bLQTgTmWvKMq2luryUB;Pmx!A#R-(*xhtpkqF6KbTZ1uiNdtrv*9S;t#v z>5F>%&H#rvvl=Eojd(BQ?fWU|7`uMO7F%Da27(ZX)gL*?-XyEv}eqns6#0ULD5EDbiVS^0g7dYt& z+bDVdco@IX!E+Z);CLQ+7{5s3gZ9A@DRA5$8pfA9_^_1wLBpKI5|5^@-D2aBckT}j zyC!uS;u zU*qFBQUorJ5jc!rDevH zFOJjf!uTo&U*+Iy9DI$Fo}i={kiSD1)_;Y>2lJLI9Q{{1_$wtos6SUa_^YHmU|xk2 z?3H61j{4oga1E^W#|VWFT0XVJ{a;a3I^+1o2OPN|`&Oojs|2k|B>(a`UXP1?>?vH_ zKY1hW#!-I25V(`R%b|bMq5lXp^>yLme#<{`sqex3xo$D<%(V?7HFC+qXPZQ@(^7vuGBQ2VFmh!Et*#0mx${_^iuzK1n-gfi^PzY zv!+y_eU59IC0~K|_cNMipIU+T#qZ+qUp{BoUYa%NHzpC^Zv>7Bgz`DY4?mD^_8>976?}mWhI-W1K);D8d!HL7%hIrO#Q}q0d>lNuRUw0U=HjhnMIldB>7$ z8}A=h^)rTWtYKnJ>_-!ZfJQ2URS@t(Q);=3I3|#=IB+!_3Qp$ zd*1>bM{%ZGJw2ltOS1Lw16dYkq>+t{4H15Tc}AL%#|8!L*ucpKvYxRlGXfh6$tLzD zSr4&cokVO1COM7`SqRB48@Tt_4!#RF@k-c`LlX9`thM(*9ybc%F2v4bYzyuLXE*oz zs=KZsNA*Z#x`Rv!1oUy>a23@r8PPEf>Jn9B!^HgsSS( z)vz~LPudZ!JVsk+tod+pQZwxF%}t|ntf1LwnlLg9^!Xh}qSeQMZ5{@e_D~C}V%0Ur zJL-FSmYhr3v!UaD#sc!~L#<=9YBP<`y=ijJNG)9tYa(R|sp z4ViP(i?Gx8A~|Zp|JKEkluJ9@v6F=;gLmYlsl>=ha#Wo4$O+0-ciy#2QTDBgL&eyF z5dSY4E{eLg(R=PZg!^!@5`F=HCH&#Kagn71@Gq*7V+nP9F5u_eFiKK4zC$!l?U}ys z0((qE*}&z~4*F-0zmR3Je9g!^M}wMCdxPbzsJG3s9>I^!u0C-2%W#0B7x$mvJPdvliLa* z+ut(z8nf&uWi~-3q%_AyV$w=JHP=|!YQ$1?nb3&QBt}G2by|+`AYaYTmA4iSME=HT zHfDUYb^i7LT5Nc3^6|>5@Q|^feD3HGk@&L_hW!I_xA=Hv<@ew(8;*Tw?!eXQ*vz|x zakb3fUH{{)dw*Z{wa{qmic8CujOK407rs1YjP^7}|E4_k;>m`xb5iDLYu_ct*Ts3M zvO-T;=wv<_dSh#;YH=9_z4qt`wfTTyIWUe`L~IQGCvC5w$MiF94MAjgteKBMvO z)(IFFV=ez6l^2s*Iex=>#&}D7s3;aU7eZm2)wmdlu#p015`2@&iD^bnp`I!_S`LUe z{&wR^j9^*gCeNRa-pFwi5#Nz48+va4H!*h7aLc3{jFva;ajfbCM)P)zm_gQphGfOi zpeas5>3CzXT3}qv96EZ-b8@6bJ&P$;9-FyekQkkmObq4KNE358gZtlLRIs-u6>dUq zCl3}gGjJ^o;hf3L!o2)nE&t=UmKrR^FTq&NeBP}x;0@b4X=vXYVr$dTqu=?gP|tuh zeseT>jOatf!oo0qIhloxBVNSIKnxcL7w*A107e{$2=*~@MtU%+7OBRl+PEP|nTPSA z8FK7rhQV6Hea?t9d(*2509_{4!BTPA!?vn`6(|r}V5e33s z;hy#3o`VsuJpgyihl@eLf&knveK^iWYze^qhYz<7xJ&@97KPBuK|AHAH5`g1-6a6= z`5^n!Esa?5Y*NagUyUEAJP~)N0^!cIc(LCISv`vN3~*;-NBtFWe@+3mQ(oRxUdg%z z4;9_fkv@JH7>pbstoXokHBQcJS(SpRgk>v;qQhW)oZB>qpxb!3xCrgpx=Q@srdbZI6E25v%5RZ$jbqo!NV-;>Z}a)Bqg~6> z5tmjV>Oj<;n%9U;jt0R%M}2avK15P^3Np#ObDNJQL9-=!R5TJE#f$;EN~UOA8FNUf zhB=gV45b~_R=pgiWyMjZNZ&r9 zGT2!{>)B#di-9v@u@R)c8Kq>7Sp{tMWIQsRIm&j|M>20kJ{*R=F=7C>Pv6K>^5sfi zE^f!Zi+$W;o^$PW@hqmk+*ju@X`ScY7tu-ISrM!iiDK1a?7psb*l!Vu>$2_oSi7!k zb2s-&4Fpk&wtU|w-?JO5%#C+_x1OAOY-(w_CW@tWvO1;$nFVaKziz{=ti_GJ8`QKr zr}%#EJMV7dOJucUN~6=;X|Nofx6#Ha-PVsY2!><3uj}!paMWcOM^9Jz5$vRUl@E70 zX!hllQ#$z#2+-wm6_l<;Djf9)9d`@pNw}0#xPAoaxE|2DmaK4(`*0ge;GXy4HkZKt z!iS^&5R|To%<1{dm%ugqaNB{?>rcsU_2C`@F6eo5`f%R>&g~btc~$$EC>c-s(pB}x z`FQwq(s~a5py&3i565xJW?afCc|Z2yP65DoO*w@->BCJ2t!v2&R{;-LPX1a-;AZ-8 zN#Io7GHoTV-G@s9r`Mmtt@h#ApH+3K%gft1>Y;R;=XR&%mH$D?{C^HO{C4>oOZPk& zXVV|%yv47oOd%%a(ebVYi*|H;^C&R;4V25WSK~r3({f=KZ)g1fB-uPaM=QepmSZl6hf7#2|e<4i2 z!pHabhbw*jN>@01oLA(PKOPdT=Vt-&&@{*XvKK$Lf9&N~NqO$?p-Pj+^s9aH_~y8d z{b8@X8kY$l`@dek{!1o*qK}XMnC3Xo$Qxg85g326k3Y7*>y1A}lg{|(_~NTsB^HeH zioEglFEry%^~tN3`)Bbt!Z(rgMu;HIm^{b%0-NTW!v6P%ZJH&k#ruk(X^H1EVePH+ z(BtGh63Vmq<%0cdm#z>8Jana;pW>!JUi_QQxAHeZsP>BGq_tu)z%IU8@ViRd%5RNW zX4B0QUn^9*!*4nJ(`udvpL8vr-(T5yi=Hf0yJF>kig?QATj`%8UbJZ|f2cJoSp!#L`z z!op6N@+Ar}CrtTtTY!ogcTmcgKyTgRvfr+JdE1vLxW19jsVM{b<0&(D;~LDN=Z(I& z?2qHlvsa?6^1dH7g4Re?oEEN6JzEq_ zh%3XYL(11MFNKq1o-H=a(?jxhNcrZ9E#gG7y7L)~^3EG9hH=GkO~O@&i?J{sJnsiv z5~Dqd)bS9;dd0kJxBM`7Ijj_7C1X@{(-#`C{EW{SnGaZ<8>i`gEYyM5rr?n99M`7Mwastw06f518`h|)y7 z<)DG995Qb(%&C|wv*NzYg`qmg90!?g1@TeLR;eYYp%(KvY7nc|Xf)mmol4y{yq`}C zC-|&Za$vVSAeuk7H@i~q80^e_58o{A-K*3qSP>3wJ3cr$-d z*-Mc#Q>Of5GBkYkzDv_)+GrWvUq5Sd`)`lHN|kQB?y-|GQ8u&ej95M+_wm$>f)SaK zxp(v8&6rbh)g{J-p~&b+7w1Y`lzM*izB8vz8COLL(a1%q$d=*###I-Z#^sUG)*EZX zq0#>crH@BM>+z7;nT@9_F!LrMe|L$DNYtk>+vmLK((sXO$!`obbsO{Fe66m&ZookP zt+k*m<0F_97&|a)pJ@hpW;fESZm1By9nXbSOG`zIZ42Q$1 z@%R_MZbCR53Aa{-Bav{bI)eX;Ys&C{No}O8ES#EHhX3u8qWGVl9K-)5Q=-vmxc!`1 zEE-PNMPspWYHAGs+uxryFMM_FT^4LB2?Oj;{Me9HSPW$>|kc6rWf(ZswBN(tkhcqVE_D*t%6RKKyoC0g-i^JsPT09#%|DU3(jeK@ z8+u_I^zd_uqZ;o+^RU z`>KG*vFxDyaV@f*zZXi#Gf{9IHw>I^5mNPXo)7oGfn$GKIfc92hkFHpAlywp9Bl+a zxIQ25cnKW$;nd5)G5a8SPxx@BO5oJq)wBuFy@`wV0_7k^I?lz?)8+f9;t-&4fAHZr z1|9U=rkh@Q6MzeP9&J8ceF-J+%Pm-pc=FOk28eK`JJf__KO`fxXuz`f$b zaV_<2vSzJ+Du2K8;kdVXCIDBBhYptW4CX<=4FNc=;ni{X0>^Klaw^^HeYhboW+@Qv z>K(fl9^F!#IoEn$FdadTgAvE~=MJAd?hE@m!j)6n_K*@6ewnqJ-fm>U_sX57!)f<;|8l$WI&;TNc-u*dx%3pCj?E z{=k;Qbv%p);=6M_sk3m+@^3wO%oT<(SKb71k%z7lOFVS7?+lk3vB|@)6`!|h>Tn#Zdc>yL z5^${QfQOzee(0g6IBSS4{5e9+Rj}wfF#(MsqR4iy79)RZ?g4cT&iuW?=CkGC88ORk z+NzHR(QVUK{>~NDgDB6Ur;A5yn$MhP#607P9~abzh_~vqQT)b3H;Hj*bIHF=ViL}o zE*VKTi#ax*I$AB(^j~GuOC>#1{FzP9lJxmvgH2Oss>S=P&UCTHI_HQlg0CFE_Fu7S z>M%8YKVc4VhW2P0uuNJEb_|i4-)~}cV+3)OF)PrZs6{QwR|0&dL@jCnN7;me%!_(a zXgBg37B$JG*eXxtJLW=PJWse2!LbtRXiwl+qoD?MO@a(mQoW%8CPIQWJD4H^&4P-_ zvgrmvCtSDpsX&hrkb!~bKZ(|?dLF}@pXplM$Wdl2^{M=r}JwB|8N%aPjud!X+6 zaC&cY(!jFO)|ps)Iy3QYk^BCBtY>d&D?HT}&tx-?=8P{HyQ&L@_}!7%SHCEX^fOp} zyXj+}SRTIkcdrfaXS%C1kL8S=#vblCo5&?b^YarKF%pWKdkY7d9!H2jySFW~%|RKv zn7hzkl<$2xPaAKWZE=>S0{?Yf z5;S!wak(spFp3DU5gpN z3s~ipmv>br@?PhQhy*yhFoBEtqdx1mYrT$uSxN}_nirJo^zaYtTL1a8n)%ypb*htZ zwCgx$*4s}WJ4e>b*S{=$%vHYlRq|W0#!15B=QP^!!oxYU`nQE|ipl}s8$-T1ZVcMJ zbjLZfv@Gx)Vb0hu|By{nF6WS5C_juEW9i(-P^Bu{1_jcrc-l!DM2U^o0~%m4n=Az8cV9XVT$NZOtp@y-`+y_e=B=(-Dkn{-#=;wzwZt5*1f zaM#&5)%Nn+5Y+ZkN7CEggP_l*?JWSe7MF6?YiZ?8Z+p4VGqL>k@jJ?L1hu_nux(aO z$y2nt>*4Q4+skjP>%vmMa>G=uTZo|bENs18{Ma!kS2pW8>Z~u|Gt+Ih7LEAwowJNR$-hzJI}UB?z?PXdHen|Cr>_my2EJ8u;*^z zLeDs5Vm4?hV`fv?ZP~+FgeTZL56S=7F{+OgaPpq&P88y13aAuj5?elFwt2+tPL1YQ znj=%6F}u-AUTFexxSMmb)oN)5gp4XH2S`XTS2 zE4r`gZa;2zjtd*3TMgI^vgOYtv(*Pz=GwZardHzG*ea6YkJ69cL)YW5kkLqo8sboMMcglj5j^T;4p^5=2U z;)5CaYcL}p*WfzXSmY&O!^z_!t)1Zme>F~^5ok*h4$BYxt(ITF-wJ>7R83!K-2+kc zsBy(xNBE0q!%T1$K3wL8o41L0MFxE2iaQH5BPVfO=!1;eUtr}*ky^QO2>T68M6T)v z4xg@q%=c$ojxU+i`s9YHPz~?uUc)m;q%DO!Y30;tTdnNftc59s(i3O{HwFPcfz&zg zfFTESO0{{>Dqrh1;K=lVa8Ay(PE+@;i&ybBuEEB%YqK!-tXkJ~SC?9FPPUUXYr3X2 z$yZy_PmC%O?80(>bRdX1$0;pc-Iz+PP3mO)?s4xU08RV!F{xQQiNx9_R5 zV90`H#neh+*Y22bK1!KPPcLTwcB;AM>VfDir^4Q`g8W|6kJ&#}PU)OW5kMVL>BrQ2 zX*W|&;XZ}{9hU*E;t;EF>)_XM)Omw&cl&UR=jw&7yf6E38%yB6<-^gYsM{q}{+{#U z?k$1)i4S)_=%D)hy$|;|Xxbf=Q|V4arReqYKLH5JA8my?j`gg`k(&c-o(*0MTyq`cG^QW9D?{9rLp2HLLKF1IasQYf3Ze38Ol9%w|!XnkxX+frE%f2;ErGkvhx>d9T$c}bKWM$Y zDzAAT?s3pT@AKDfT#H?*pBPwKktR7{|Ci z=Ap-lTWy-ZEABJ;DGyyC?z3qt{Yvq7Hf@cOjTeI+`~<-@R?LqjuS)#8O;gw7zN1_l zME--4t`P|mwqw0rVDl~fL~*rEKLQ@-p5A2B#Ma{Xsm{-_>f;=F4k1PIOV0CjzGUMq zdaC$44_)t^hhy=l366;~K6MwKxARjEeXjVmhn_C}-9w)zs?dhH@#CV=rmgyG6mx8v zI!Z0xZ|>Voyp?`JaDQ%>ZWcFt=owZ0*&yNZjjGPXwM$Fi}IC#@^=`0Xl+shL_Bb#P=w3>ZtUU!nYh{sc!)j6@3mo!w^EzhCXgtabZUwhd-7#Qy2& zL1W%`%XX;4-IrXC81VLMQN3J`SyGCY#=Z@kHuh}VXq)@qu?6nEHLs8Dk#cM+=&r`a zwnEtiTHz1Eebk5hh!zK4r@yw|hg(qs_jwMP2zZs~ZpJ`Iu-J5bmW1fpvz&sSvG+1~p5 zv^hK&ez%lU@)WJ^dicB1r=_mvx_5u9-78Cv3^H;bAAKZOa_tvvQy&&WjbSR?IhZ>p>X?>WrZ84WFb?k} z_6X|Ruy*4oF|0W@GctFptdiK8ft1g;-qYecp;nB}EVBQ8o5vqy!@gGgF2O6$)(sjn zy48ovfDXdlci~<9i)$p`f%SUf%DJ1-wPbSvC647xd|U<_5CLA zDO`FRrEpi-IHf;)7q}q(fqPo(`oo2w&qja907v_Ta>~oQ$^&^j@S$o&0IioC=Vh6K z^oJLsLi`du<&-={tGgclr_di%I=lzX&GYjA>-U=W&JCm%=DMK0r@eSus$BPO>_zQL zV|`6<^bgDC6L#jU^EXNTL+Kk9T_$csIG?FSN5x$p+MTCv=`Z8New%O6@b-LvQ+iu6bTSsI7;ZiF zo14ncm^URMaalp6lax9Cx37gy42ori))dmXvbkV}UxYLvCLY+HTNC~Lu?MgZX%TBU z2b15AU?a;qJ-_VbeP}zcFe)kvX@6_Y;}w#GLKZr2qCzy}ZxK#u86#uj@FG zt;77sI>fMcWsRAM40mS@+xI-~sW(SckFB1+rFYA;Fn8zOzj7<$?-$4JZ{I77QZ^e`EjCOMdm* zPmAF^&N3P&W{y8OK``u@lcK6)h;cjncPDF)tnUAXjL&zEary2Mrx3q6V#eD>%1-9Z zn-}jG_}+;Mb9SzOV9)+McB*YnHx^9eXT_dDv2$dJ*t4sBdi(9U`f$^+!>21u=3V8o zLd&I|!{5C2qoNS^CKn8Z<03wOWDcH~Va~}Q^_I@<_`m!YIrGHxk*%*q;t|fy{i3SP z3x8Q$_SH1r{gu0uSfQMb=05b&zx6*=oRvSFdaBqwxT}5FncttTJTq~d=$`X!apHTi zqs4~3jr;2NEiYaos_~2;>wl%+xMFuQHn6ymU%Yr!Ebb`Iy#Iw_czO8bOz~)c445l& zBA&t=>nkz`UoU;CeY zQzt`bYHp04*cOeaFF^U{=N1>jkrci>^D|;3KEp%`=ANafu~6jYGRs#T`FPnY{fYY+ z+8WuN+>||cC~;q7_bc7TiNnSg1-17W zYwx6arY0fg{QQWy=jNz+?24R)rR3pMeY=Z!uy{fB7m}eLKi19iM7ZKxx%Xv{ud}iFJ}E8!@6kM(Yzf}&Otm*2r*M)=L)Jf^9H?75CWID)A$c_jgD%l4_h$Zcv8l2xt zGd|fHQ4Spy>GY9h2DIZ^E;-geg+%+W!5)Khs-DrL zdT{9yxN{&(m-jK?f~*j2KHNs&;wn+xK}yHowqB08S~-|c;#kig_sQdFlXDTKoRY_$ zwJz^UP2MDcmAv)9Q7)=ixZ>e(Ibg^e-OEJN6_j;+viF z@@cz{GyKSR-4r>4igYV31AN_a#-A5|j!4@8eme{~9_Ys4$yi=|ojkdUh&V2+JEPZe zoDt~7PZeE?i;6bD*PV$kv=?75HraqY?uO?J&ibL2;W`sDobn)9JvZRujIqDAX|}N( z?Rwaz*_PJgSO0`fvn`}`=^4<<@i#Y!i}H5h;;sn)Y}0&F91(ieLsvU9#4PJrjW`#P z89y%ZwX!WB%{GBEzy$R|%X;M~!%|hWEI+mytcBPLFwUvgls~`TXR#cW&tkjU9%!ZL zNy&~1?NFA^D@jLXb||SRLksWh*&?&AX~_;o*N>e*zh>-V1n9&L-_nF7sq|meA-@wm zRr)CJ3+>aW=i0lL&BmxU!|@*T8HHdNeVupwD1J{LYQ`tXE^TLc}F rom + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > rom + PROVIDE_HIDDEN (__exidx_end = .); + + . = ALIGN(4); + _etext = .; + + .relocate : AT (_etext) + { + . = ALIGN(4); + _srelocate = .; + *(.ramfunc .ramfunc.*); + *(.data .data.*); + . = ALIGN(4); + _erelocate = .; + } > ram + + /* .bss section which is used for uninitialized data */ + .bss ALIGN(4) (NOLOAD) : + { + . = ALIGN(4); + _sbss = . ; + _szero = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + _ezero = .; + } > ram + + . = ALIGN(4); + _end = . ; + + /* .stack_dummy section doesn't contains any symbols. It is only + used for linker to calculate size of stack sections, and assign + values to stack symbols later */ + .stack_dummy : + { + *(.stack*) + } > ram + + /* Set stack top to end of ram, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(_sstack = __StackLimit); + PROVIDE(_estack = __StackTop); +} diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld new file mode 100644 index 0000000000..2a0d54e179 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------------- + * SAM Software Package License + * ---------------------------------------------------------------------------- + * Copyright (c) 2012, Atmel Corporation + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following condition is met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the disclaimer below. + * + * Atmel's name may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * ---------------------------------------------------------------------------- + */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +SEARCH_DIR(.) + +/* Memory Spaces Definitions */ +MEMORY +{ + rom (rx) : ORIGIN = 0x00080000, LENGTH = 0x00080000 /* Flash, 512K */ + sram0 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 /* sram0, 64K */ + sram1 (rwx) : ORIGIN = 0x20080000, LENGTH = 0x00008000 /* sram1, 32K */ + ram (rwx) : ORIGIN = 0x20070000, LENGTH = 0x00018000 /* sram, 96K */ +} + +/* The stack size used by the application. NOTE: you need to adjust */ +STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : 0x2000 ; + +/* Section Definitions */ +SECTIONS +{ + .text : + { + . = ALIGN(4); + _sfixed = .; + KEEP(*(.vectors .vectors.*)) + *(.text .text.* .gnu.linkonce.t.*) + *(.glue_7t) *(.glue_7) + *(.rodata .rodata* .gnu.linkonce.r.*) + *(.ARM.extab* .gnu.linkonce.armextab.*) + + /* Support C constructors, and C destructors in both user code + and the C library. This also provides support for C++ code. */ + . = ALIGN(4); + KEEP(*(.init)) + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + + . = ALIGN(4); + _efixed = .; /* End of text section */ + } > ram + + . = ALIGN(4); + _etext = .; + + .relocate : AT (_etext) + { + . = ALIGN(4); + _srelocate = .; + *(.ramfunc .ramfunc.*); + *(.data .data.*); + . = ALIGN(4); + _erelocate = .; + } > ram + + /* .bss section which is used for uninitialized data */ + .bss (NOLOAD) : + { + . = ALIGN(4); + _sbss = . ; + _szero = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + _ezero = .; + } > ram + + /* stack section */ + .stack (NOLOAD): + { + . = ALIGN(8); + _sstack = .; + . = . + STACK_SIZE; + . = ALIGN(8); + _estack = .; + } > ram + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > ram + PROVIDE_HIDDEN (__exidx_end = .); + + . = ALIGN(4); + _end = . ; +} + diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf new file mode 100644 index 0000000000..956230fbd3 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Vector table start*/ +define symbol __ICFEDIT_vector_start__ = 0x00080000; /*Add for CMSIS*/ +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_RAM0_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM0_end__ = 0x20007FFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20080000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x20083FFF; +define symbol __ICFEDIT_region_ROM0_start__ = 0x00080000; +define symbol __ICFEDIT_region_ROM0_end__ = 0x0009FFFF; +define symbol __ICFEDIT_region_ROM1_start__ = 0x00100000; +define symbol __ICFEDIT_region_ROM1_end__ = 0x0011FFFF; +/*-Sizes-*/ +/*define symbol __ICFEDIT_size_cstack__ = 0x1000;*//*for nandflash*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x200; +/*-Specials-*/ +/*define symbol __ICFEDIT_region_RAM_VECT_start__ = __ICFEDIT_region_RAM0_start__;*/ /*Referenced for CMSIS*/ +/*define symbol __ICFEDIT_size_vectors__ = 0x100;*/ /*Referenced for CMSIS*/ +/*-Exports-*/ +/*export symbol __ICFEDIT_region_RAM_VECT_start__;*/ +export symbol __ICFEDIT_vector_start__; /*Add for CMSIS*/ +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +/*define region RAM_VECT_region = mem:[from __ICFEDIT_region_RAM_VECT_start__ size __ICFEDIT_size_vectors__];*/ /*Referenced for CMSIS*/ +/*define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__];*/ /*Referenced for CMSIS*/ +define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__ to __ICFEDIT_region_RAM0_end__]; +define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +/*define region RAM_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__] | + mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];*/ /*Referenced for CMSIS*/ +define region ROM0_region = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]; +define region ROM1_region = mem:[from __ICFEDIT_region_ROM1_start__ to __ICFEDIT_region_ROM1_end__]; + +/*define block RamVect with alignment = 8, size = __ICFEDIT_size_vectors__ { };*/ +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +/*place at start of ROM0_region { readonly section .vectors };*/ /*Referenced for CMSIS*/ +place at address mem:__ICFEDIT_vector_start__ { readonly section .intvec }; /*Add for CMSIS*/ +place in ROM0_region { readonly }; +place in RAM0_region { readwrite, block HEAP }; +place in RAM1_region { block CSTACK }; /* for nandflash*/ +/*place in RAM_VECT_region { block RamVect };*/ /*Referenced for CMSIS*/ \ No newline at end of file diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf new file mode 100644 index 0000000000..d7d33537ac --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf @@ -0,0 +1,33 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Vector table start*/ +define symbol __ICFEDIT_vector_start__ = 0x20000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_RAM0_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM0_end__ = 0x20007FFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20080000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x20083FFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x900; +define symbol __ICFEDIT_size_heap__ = 0x200; +/*-Exports-*/ +export symbol __ICFEDIT_vector_start__; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__ to __ICFEDIT_region_RAM0_end__]; +define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +/*define region RAM_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__] | + mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];*/ + +/* define block RamVect with alignment = 8, size = __ICFEDIT_size_vectors__ { }; */ +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_vector_start__ { readonly section .intvec }; +place in RAM0_region { readonly }; +place in RAM1_region { readwrite, block CSTACK, block HEAP }; diff --git a/buildroot/share/PlatformIO/variants/archim/pins_arduino.h b/buildroot/share/PlatformIO/variants/archim/pins_arduino.h new file mode 100644 index 0000000000..4e279aa7be --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/pins_arduino.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +// API compatibility +#include "variant.h" + diff --git a/buildroot/share/PlatformIO/variants/archim/variant.cpp b/buildroot/share/PlatformIO/variants/archim/variant.cpp new file mode 100644 index 0000000000..72ad45ef46 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/variant.cpp @@ -0,0 +1,485 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" + +/* + * DUE Board pin | PORT | Label + * ----------------+--------+------- + * 0 | PA8 | "RX0" + * 1 | PA9 | "TX0" + * 2 TIOA0 | PB25 | + * 3 TIOA7 | PC28 | + * 4 NPCS1 | PA29 | + * TIOB6 | PC26 | + * 5 TIOA6 | PC25 | + * 6 PWML7 | PC24 | + * 7 PWML6 | PC23 | + * 8 PWML5 | PC22 | + * 9 PWML4 | PC21 | + * 10 NPCS0 | PA28 | + * TIOB7 | PC29 | + * 11 TIOA8 | PD7 | + * 12 TIOB8 | PD8 | + * 13 TIOB0 | PB27 | LED AMBER "L" + * 14 TXD3 | PD4 | "TX3" + * 15 RXD3 | PD5 | "RX3" + * 16 TXD1 | PA13 | "TX2" + * 17 RXD1 | PA12 | "RX2" + * 18 TXD0 | PA11 | "TX1" + * 19 RXD0 | PA10 | "RX1" + * 20 | PB12 | "SDA" + * 21 | PB13 | "SCL" + * 22 | PB26 | + * 23 | PA14 | + * 24 | PA15 | + * 25 | PD0 | + * 26 | PD1 | + * 27 | PD2 | + * 28 | PD3 | + * 29 | PD6 | + * 30 | PD9 | + * 31 | PA7 | + * 32 | PD10 | + * 33 | PC1 | + * 34 | PC2 | + * 35 | PC3 | + * 36 | PC4 | + * 37 | PC5 | + * 38 | PC6 | + * 39 | PC7 | + * 40 | PC8 | + * 41 | PC9 | + * 42 | PA19 | + * 43 | PA20 | + * 44 | PC19 | + * 45 | PC18 | + * 46 | PC17 | + * 47 | PC16 | + * 48 | PC15 | + * 49 | PC14 | + * 50 | PC13 | + * 51 | PC12 | + * 52 NPCS2 | PB21 | + * 53 | PB14 | + * 54 | PA16 | "A0" + * 55 | PA24 | "A1" + * 56 | PA23 | "A2" + * 57 | PA22 | "A3" + * 58 TIOB2 | PA6 | "A4" + * 69 | PA4 | "A5" + * 60 TIOB1 | PA3 | "A6" + * 61 TIOA1 | PA2 | "A7" + * 62 | PB17 | "A8" + * 63 | PB18 | "A9" + * 64 | PB19 | "A10" + * 65 | PB20 | "A11" + * 66 | PB15 | "DAC0" + * 67 | PB16 | "DAC1" + * 68 | PA1 | "CANRX" + * 69 | PA0 | "CANTX" + * 70 | PA17 | "SDA1" + * 71 | PA18 | "SCL1" + * 72 | PC30 | LED AMBER "RX" + * 73 | PA21 | LED AMBER "TX" + * 74 MISO | PA25 | + * 75 MOSI | PA26 | + * 76 SCLK | PA27 | + * 77 NPCS0 | PA28 | + * 78 NPCS3 | PB23 | unconnected! + * + * USB pin | PORT + * ----------------+-------- + * ID | PB11 + * VBOF | PB10 + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pins descriptions + */ +extern const PinDescription g_APinDescription[]= +{ + // 0 .. 53 - Digital pins + // ---------------------- + // 0/1 - UART (Serial) + { PIOA, PIO_PA8A_URXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // URXD + { PIOA, PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // UTXD + + // 2 + { PIOB, PIO_PB25B_TIOA0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHA0 }, // TIOA0 + { PIOC, PIO_PC28B_TIOA7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA7 }, // TIOA7 + { PIOC, PIO_PC26B_TIOB6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB6 }, // TIOB6 + + // 5 + { PIOC, PIO_PC25B_TIOA6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA6 }, // TIOA6 + { PIOC, PIO_PC24B_PWML7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH7, NOT_ON_TIMER }, // PWML7 + { PIOC, PIO_PC23B_PWML6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH6, NOT_ON_TIMER }, // PWML6 + { PIOC, PIO_PC22B_PWML5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWML5 + { PIOC, PIO_PC21B_PWML4, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH4, NOT_ON_TIMER }, // PWML4 + // 10 + { PIOC, PIO_PC29B_TIOB7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB7 }, // TIOB7 + { PIOD, PIO_PD7B_TIOA8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA8 }, // TIOA8 + { PIOD, PIO_PD8B_TIOB8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB8 }, // TIOB8 + + // 13 - AMBER LED + { PIOB, PIO_PB27B_TIOB0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHB0 }, // TIOB0 + + // 14/15 - USART3 (Serial3) + { PIOD, PIO_PD4B_TXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD3 + { PIOD, PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD3 + + // 16/17 - USART1 (Serial2) + { PIOA, PIO_PA13A_TXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD1 + { PIOA, PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD1 + + // 18/19 - USART0 (Serial1) + { PIOA, PIO_PA11A_TXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD0 + { PIOA, PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD0 + + // 20/21 - TWI1 + { PIOB, PIO_PB12A_TWD1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD1 - SDA0 + { PIOB, PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK1 - SCL0 + + // 22 + { PIOB, PIO_PB26, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 22 + { PIOA, PIO_PA14, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 23 + { PIOA, PIO_PA15, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 24 + { PIOD, PIO_PD0, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 25 + + // 26 + { PIOD, PIO_PD1, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 26 + { PIOD, PIO_PD2, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 27 + { PIOD, PIO_PD3, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 28 + { PIOD, PIO_PD6, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 29 + + // 30 + { PIOD, PIO_PD9, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 30 + { PIOA, PIO_PA7, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 31 + { PIOD, PIO_PD10, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 32 + { PIOC, PIO_PC1, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 33 + + // 34 + { PIOC, PIO_PC2, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 34 + { PIOC, PIO_PC3, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 35 +//{ PIOC, PIO_PC3B_PWMH0, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH0, NOT_ON_TIMER }, // PWMH0 PIN 35 + { PIOC, PIO_PC4, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 36 + { PIOC, PIO_PC5, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 37 +//{ PIOC, PIO_PC5B_PWMH1, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH1, NOT_ON_TIMER }, // PWMH1 PIN 37 + + // 38 + { PIOC, PIO_PC6, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 38 + { PIOC, PIO_PC7, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 39 +//{ PIOC, PIO_PC7B_PWMH2, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH2, NOT_ON_TIMER }, // PWMH2 PIN 39 + { PIOC, PIO_PC8, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 40 +//{ PIOC, PIO_PC8B_PWML3, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH3, NOT_ON_TIMER }, // PWML3 PIN 40 + { PIOC, PIO_PC9, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 41 + + // 42 + { PIOA, PIO_PA19, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 42 + { PIOA, PIO_PA20, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 43 + { PIOC, PIO_PC19, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 44 +//{ PIOC, PIO_PC19B_PWMH5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWMH5 PIN 44 + { PIOC, PIO_PC18, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 45 + + // 46 + { PIOC, PIO_PC17, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 46 + { PIOC, PIO_PC16, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 47 + { PIOC, PIO_PC15, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 48 + { PIOC, PIO_PC14, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 49 + + // 50 + { PIOC, PIO_PC13, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 50 + { PIOC, PIO_PC12, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 51 + { PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52 + { PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53 + + + // 54 .. 65 - Analog pins + // ---------------------- + { PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0 + { PIOA, PIO_PA24X1_AD6, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC1, ADC6, NOT_ON_PWM, NOT_ON_TIMER }, // AD1 + { PIOA, PIO_PA23X1_AD5, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC2, ADC5, NOT_ON_PWM, NOT_ON_TIMER }, // AD2 + { PIOA, PIO_PA22X1_AD4, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC3, ADC4, NOT_ON_PWM, NOT_ON_TIMER }, // AD3 + // 58 +//{ PIOA, PIO_PA6X1_AD3, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // AD4 + { PIOA, PIO_PA6A_TIOB2, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_TIMER|PIN_ATTR_DIGITAL), ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // TIOB2 + { PIOA, PIO_PA4X1_AD2, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC5, ADC2, NOT_ON_PWM, NOT_ON_TIMER }, // AD5 + { PIOA, PIO_PA3X1_AD1, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC6, ADC1, NOT_ON_PWM, TC0_CHB1 }, // AD6 + { PIOA, PIO_PA2X1_AD0, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC7, ADC0, NOT_ON_PWM, TC0_CHA1 }, // AD7 + // 62 + { PIOB, PIO_PB17X1_AD10, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC8, ADC10, NOT_ON_PWM, NOT_ON_TIMER }, // AD8 + { PIOB, PIO_PB18X1_AD11, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC9, ADC11, NOT_ON_PWM, NOT_ON_TIMER }, // AD9 + { PIOB, PIO_PB19X1_AD12, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC10, ADC12, NOT_ON_PWM, NOT_ON_TIMER }, // AD10 + { PIOB, PIO_PB20X1_AD13, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC11, ADC13, NOT_ON_PWM, NOT_ON_TIMER }, // AD11 + + // 66/67 - DAC0/DAC1 + { PIOB, PIO_PB15X1_DAC0, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC12, DA0, NOT_ON_PWM, NOT_ON_TIMER }, // DAC0 + { PIOB, PIO_PB16X1_DAC1, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC13, DA1, NOT_ON_PWM, NOT_ON_TIMER }, // DAC1 + + // 68/69 - CANRX0/CANTX0 + { PIOA, PIO_PA1A_CANRX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC14, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX + { PIOA, PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC15, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX + + // 70/71 - TWI0 + { PIOA, PIO_PA17A_TWD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD0 - SDA1 + { PIOA, PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK0 - SCL1 + + // 72/73 - LEDs + { PIOC, PIO_PC30, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER RXL + { PIOA, PIO_PA21, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER TXL + + // 74/75/76 - SPI + { PIOA, PIO_PA25A_SPI0_MISO,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MISO + { PIOA, PIO_PA26A_SPI0_MOSI,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MOSI + { PIOA, PIO_PA27A_SPI0_SPCK,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // SPCK + + // 77 - SPI CS0 + { PIOA, PIO_PA28A_SPI0_NPCS0,ID_PIOA,PIO_PERIPH_A,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS0 + + // 78 - SPI CS3 (unconnected) + { PIOB, PIO_PB23B_SPI0_NPCS3,ID_PIOB,PIO_PERIPH_B,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS3 + + // 79 .. 84 - "All pins" masks + + // 79 - TWI0 all pins + { PIOA, PIO_PA17A_TWD0|PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 80 - TWI1 all pins + { PIOB, PIO_PB12A_TWD1|PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 81 - UART (Serial) all pins + { PIOA, PIO_PA8A_URXD|PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 82 - USART0 (Serial1) all pins + { PIOA, PIO_PA11A_TXD0|PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 83 - USART1 (Serial2) all pins + { PIOA, PIO_PA13A_TXD1|PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 84 - USART3 (Serial3) all pins + { PIOD, PIO_PD4B_TXD3|PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + + // 85 - USB +//{ PIOB, PIO_PB11A_UOTGID|PIO_PB10A_UOTGVBOF, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF + // 85 - PB11 only + { PIOB, PIO_PB11A_UOTGID, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF + + // 86 - SPI CS2 + { PIOB, PIO_PB21B_SPI0_NPCS2, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS2 + + // 87 - SPI CS1 + { PIOA, PIO_PA29A_SPI0_NPCS1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS1 + + // 88/89 - CANRX1/CANTX1 (same physical pin for 66/53) + { PIOB, PIO_PB15A_CANRX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX1 + { PIOB, PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX1 + + // 90 .. 91 - "All CAN pins" masks + // 90 - CAN0 all pins + { PIOA, PIO_PA1A_CANRX0|PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 91 - CAN1 all pins + { PIOB, PIO_PB15A_CANRX1|PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + + // 92 - Extra AMBIT Pins + { PIOC, PIO_PC11, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 92 + { PIOB, PIO_PB2, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 93 + { PIOB, PIO_PB1, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 94 + { PIOB, PIO_PB0, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 95 + { PIOC, PIO_PC10, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 96 + { PIOB, PIO_PB24, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 97 + { PIOB, PIO_PB7, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 98 + { PIOB, PIO_PB6, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 99 + { PIOB, PIO_PB8, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 100 + { PIOB, PIO_PB5, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 101 + { PIOB, PIO_PB4, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 102 + { PIOB, PIO_PB3, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 103 + { PIOC, PIO_PC20, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 104 + { PIOB, PIO_PB22, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 105 + { PIOC, PIO_PC27, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 106 + { PIOB, PIO_PB10B_A18, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 107 + { PIOB, PIO_PB9, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 108 + { PIOA, PIO_PA5, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 109 + + // END + { NULL, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER } +} ; + + +uint8_t g_pinStatus[PINS_COUNT] = {0}; + +#ifdef __cplusplus +} +#endif + +/* + * UART objects + */ +RingBuffer rx_buffer1; +RingBuffer tx_buffer1; + +UARTClass Serial(UART, UART_IRQn, ID_UART, &rx_buffer1, &tx_buffer1); +void serialEvent() __attribute__((weak)); +void serialEvent() { } + +// IT handlers +void UART_Handler(void) +{ + Serial.IrqHandler(); +} + +// ---------------------------------------------------------------------------- +/* + * USART objects + */ +RingBuffer rx_buffer2; +RingBuffer rx_buffer3; +RingBuffer rx_buffer4; +RingBuffer tx_buffer2; +RingBuffer tx_buffer3; +RingBuffer tx_buffer4; + +USARTClass Serial1(USART0, USART0_IRQn, ID_USART0, &rx_buffer2, &tx_buffer2); +void serialEvent1() __attribute__((weak)); +void serialEvent1() { } +USARTClass Serial2(USART1, USART1_IRQn, ID_USART1, &rx_buffer3, &tx_buffer3); +void serialEvent2() __attribute__((weak)); +void serialEvent2() { } +USARTClass Serial3(USART3, USART3_IRQn, ID_USART3, &rx_buffer4, &tx_buffer4); +void serialEvent3() __attribute__((weak)); +void serialEvent3() { } + +// IT handlers +void USART0_Handler(void) +{ + Serial1.IrqHandler(); +} + +void USART1_Handler(void) +{ + Serial2.IrqHandler(); +} + +void USART3_Handler(void) +{ + Serial3.IrqHandler(); +} + +// ---------------------------------------------------------------------------- + +void serialEventRun(void) +{ + if (Serial.available()) serialEvent(); + if (Serial1.available()) serialEvent1(); + if (Serial2.available()) serialEvent2(); + if (Serial3.available()) serialEvent3(); +} + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +void __libc_init_array(void); + +void init( void ) +{ + SystemInit(); + + // Set Systick to 1ms interval, common to all SAM3 variants + if (SysTick_Config(SystemCoreClock / 1000)) + { + // Capture error + while (true); + } + + // Initialize C library + __libc_init_array(); + + // Disable pull-up on every pin + for (unsigned i = 0; i < PINS_COUNT; i++) + digitalWrite(i, LOW); + + // Enable parallel access on PIO output data registers + PIOA->PIO_OWER = 0xFFFFFFFF; + PIOB->PIO_OWER = 0xFFFFFFFF; + PIOC->PIO_OWER = 0xFFFFFFFF; + PIOD->PIO_OWER = 0xFFFFFFFF; + + // Set USB Full Speed for Archim + udd_low_speed_disable(); + udd_high_speed_disable(); + + // Initialize Serial port U(S)ART pins + PIO_Configure( + g_APinDescription[PINS_UART].pPort, + g_APinDescription[PINS_UART].ulPinType, + g_APinDescription[PINS_UART].ulPin, + g_APinDescription[PINS_UART].ulPinConfiguration); + digitalWrite(0, HIGH); // Enable pullup for RX0 + PIO_Configure( + g_APinDescription[PINS_USART0].pPort, + g_APinDescription[PINS_USART0].ulPinType, + g_APinDescription[PINS_USART0].ulPin, + g_APinDescription[PINS_USART0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART1].pPort, + g_APinDescription[PINS_USART1].ulPinType, + g_APinDescription[PINS_USART1].ulPin, + g_APinDescription[PINS_USART1].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART3].pPort, + g_APinDescription[PINS_USART3].ulPinType, + g_APinDescription[PINS_USART3].ulPin, + g_APinDescription[PINS_USART3].ulPinConfiguration); + + // Initialize USB pins + PIO_Configure( + g_APinDescription[PINS_USB].pPort, + g_APinDescription[PINS_USB].ulPinType, + g_APinDescription[PINS_USB].ulPin, + g_APinDescription[PINS_USB].ulPinConfiguration); + + // Initialize CAN pins + PIO_Configure( + g_APinDescription[PINS_CAN0].pPort, + g_APinDescription[PINS_CAN0].ulPinType, + g_APinDescription[PINS_CAN0].ulPin, + g_APinDescription[PINS_CAN0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_CAN1].pPort, + g_APinDescription[PINS_CAN1].ulPinType, + g_APinDescription[PINS_CAN1].ulPin, + g_APinDescription[PINS_CAN1].ulPinConfiguration); + + // Initialize Analog Controller + pmc_enable_periph_clk(ID_ADC); + adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST); + adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1); + adc_configure_trigger(ADC, ADC_TRIG_SW, 0); // Disable hardware trigger. + adc_disable_interrupt(ADC, 0xFFFFFFFF); // Disable all ADC interrupts. + adc_disable_all_channel(ADC); + + // Initialize analogOutput module + analogOutputInit(); +} + +#ifdef __cplusplus +} +#endif + diff --git a/buildroot/share/PlatformIO/variants/archim/variant.h b/buildroot/share/PlatformIO/variants/archim/variant.h new file mode 100644 index 0000000000..56f6414202 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/variant.h @@ -0,0 +1,284 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_DUE_X_ +#define _VARIANT_ARDUINO_DUE_X_ + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC 12000000 + +/** Master clock frequency */ +#define VARIANT_MCK 84000000 + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "Arduino.h" +#ifdef __cplusplus +#include "UARTClass.h" +#include "USARTClass.h" +#endif + +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +/** + * Libc porting layers + */ +#if defined ( __GNUC__ ) /* GCC CS3 */ +# include /** RedHat Newlib minimal stub */ +#endif + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// Number of pins defined in PinDescription array +#define PINS_COUNT (79u) +#define NUM_DIGITAL_PINS (66u) +#define NUM_ANALOG_INPUTS (12u) +#define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) + +#define digitalPinToPort(P) ( g_APinDescription[P].pPort ) +#define digitalPinToBitMask(P) ( g_APinDescription[P].ulPin ) +//#define analogInPinToBit(P) ( ) +#define portOutputRegister(port) ( &(port->PIO_ODSR) ) +#define portInputRegister(port) ( &(port->PIO_PDSR) ) +#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER ) + +/* + * portModeRegister(..) should return a register to set pin mode + * INPUT or OUTPUT by setting the corresponding bit to 0 or 1. + * Unfortunately on SAM architecture the PIO_OSR register is + * read-only and can be set only through the enable/disable registers + * pair PIO_OER/PIO_ODR. + */ +// #define portModeRegister(port) ( &(port->PIO_OSR) ) + +/* + * digitalPinToTimer(..) is AVR-specific and is not defined for SAM + * architecture. If you need to check if a pin supports PWM you must + * use digitalPinHasPWM(..). + * + * https://github.com/arduino/Arduino/issues/1833 + */ +// #define digitalPinToTimer(P) + +// Interrupts +#define digitalPinToInterrupt(p) ((p) < NUM_DIGITAL_PINS ? (p) : -1) + +// LEDs +#define PIN_LED_13 (13u) +#define PIN_LED_RXL (72u) +#define PIN_LED_TXL (73u) +#define PIN_LED PIN_LED_13 +#define PIN_LED2 PIN_LED_RXL +#define PIN_LED3 PIN_LED_TXL +#define LED_BUILTIN 13 + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 1 + +#define SPI_INTERFACE SPI0 +#define SPI_INTERFACE_ID ID_SPI0 +#define SPI_CHANNELS_NUM 4 +#define PIN_SPI_SS0 (77u) +#define PIN_SPI_SS1 (87u) +#define PIN_SPI_SS2 (86u) +#define PIN_SPI_SS3 (78u) +#define PIN_SPI_MOSI (75u) +#define PIN_SPI_MISO (74u) +#define PIN_SPI_SCK (76u) +#define BOARD_SPI_SS0 (77u) //(10u) +#define BOARD_SPI_SS1 (4u) +#define BOARD_SPI_SS2 (52u) +#define BOARD_SPI_SS3 PIN_SPI_SS3 +#define BOARD_SPI_DEFAULT_SS BOARD_SPI_SS3 + +#define BOARD_PIN_TO_SPI_PIN(x) \ + (x==BOARD_SPI_SS0 ? PIN_SPI_SS0 : \ + (x==BOARD_SPI_SS1 ? PIN_SPI_SS1 : \ + (x==BOARD_SPI_SS2 ? PIN_SPI_SS2 : PIN_SPI_SS3 ))) +#define BOARD_PIN_TO_SPI_CHANNEL(x) \ + (x==BOARD_SPI_SS0 ? 0 : \ + (x==BOARD_SPI_SS1 ? 1 : \ + (x==BOARD_SPI_SS2 ? 2 : 3))) + +static const uint8_t SS = BOARD_SPI_SS0; +static const uint8_t SS1 = BOARD_SPI_SS1; +static const uint8_t SS2 = BOARD_SPI_SS2; +static const uint8_t SS3 = BOARD_SPI_SS3; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 2 + +#define PIN_WIRE_SDA (20u) +#define PIN_WIRE_SCL (21u) +#define WIRE_INTERFACE TWI1 +#define WIRE_INTERFACE_ID ID_TWI1 +#define WIRE_ISR_HANDLER TWI1_Handler +#define WIRE_ISR_ID TWI1_IRQn + +#define PIN_WIRE1_SDA (70u) +#define PIN_WIRE1_SCL (71u) +#define WIRE1_INTERFACE TWI0 +#define WIRE1_INTERFACE_ID ID_TWI0 +#define WIRE1_ISR_HANDLER TWI0_Handler +#define WIRE1_ISR_ID TWI0_IRQn + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; +static const uint8_t SDA1 = PIN_WIRE1_SDA; +static const uint8_t SCL1 = PIN_WIRE1_SCL; + +/* + * UART/USART Interfaces + */ +// Serial +#define PINS_UART (81u) +// Serial1 +#define PINS_USART0 (82u) +// Serial2 +#define PINS_USART1 (83u) +// Serial3 +#define PINS_USART3 (84u) + +/* + * USB Interfaces + */ +#define PINS_USB (85u) + +/* + * Analog pins + */ +static const uint8_t A0 = 54; +static const uint8_t A1 = 55; +static const uint8_t A2 = 56; +static const uint8_t A3 = 57; +static const uint8_t A4 = 58; +static const uint8_t A5 = 59; +static const uint8_t A6 = 60; +static const uint8_t A7 = 61; +static const uint8_t A8 = 62; +static const uint8_t A9 = 63; +static const uint8_t A10 = 64; +static const uint8_t A11 = 65; +static const uint8_t DAC0 = 66; +static const uint8_t DAC1 = 67; +static const uint8_t CANRX = 68; +static const uint8_t CANTX = 69; +#define ADC_RESOLUTION 12 + +/* + * Complementary CAN pins + */ +static const uint8_t CAN1RX = 88; +static const uint8_t CAN1TX = 89; + +// CAN0 +#define PINS_CAN0 (90u) +// CAN1 +#define PINS_CAN1 (91u) + + +/* + * DACC + */ +#define DACC_INTERFACE DACC +#define DACC_INTERFACE_ID ID_DACC +#define DACC_RESOLUTION 12 +#define DACC_ISR_HANDLER DACC_Handler +#define DACC_ISR_ID DACC_IRQn + +/* + * PWM + */ +#define PWM_INTERFACE PWM +#define PWM_INTERFACE_ID ID_PWM +#define PWM_FREQUENCY 31000 +#define PWM_MAX_DUTY_CYCLE 255 +#define PWM_MIN_DUTY_CYCLE 0 +#define PWM_RESOLUTION 8 + +/* + * TC + */ +#define TC_INTERFACE TC0 +#define TC_INTERFACE_ID ID_TC0 +#define TC_FREQUENCY 100000 +#define TC_MAX_DUTY_CYCLE 255 +#define TC_MIN_DUTY_CYCLE 0 +#define TC_RESOLUTION 8 + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + +extern UARTClass Serial; +extern USARTClass Serial1; +extern USARTClass Serial2; +extern USARTClass Serial3; + +#endif + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_USBVIRTUAL SerialUSB +#define SERIAL_PORT_HARDWARE_OPEN Serial1 +#define SERIAL_PORT_HARDWARE_OPEN1 Serial2 +#define SERIAL_PORT_HARDWARE_OPEN2 Serial3 +#define SERIAL_PORT_HARDWARE Serial +#define SERIAL_PORT_HARDWARE1 Serial1 +#define SERIAL_PORT_HARDWARE2 Serial2 +#define SERIAL_PORT_HARDWARE3 Serial3 + +#endif /* _VARIANT_ARDUINO_DUE_X_ */ + diff --git a/platformio.ini b/platformio.ini index c426c5223b..1f2586e26b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -576,8 +576,10 @@ build_flags = ${common.build_flags} [common_DUE_archim] platform = atmelsam extends = env:DUE +board = archim build_flags = ${common.build_flags} -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON +board_build.variants_dir = buildroot/share/PlatformIO/variants/ extra_scripts = ${common.extra_scripts} Marlin/src/HAL/DUE/upload_extra_script.py From fb28e0cba9a96b8526a0c97c52f1512d66794b84 Mon Sep 17 00:00:00 2001 From: Cory Ory Date: Mon, 5 Oct 2020 01:51:21 +0100 Subject: [PATCH 0346/1370] Allow bypass for cold E movement (#19606) --- Marlin/src/lcd/menu/menu_motion.cpp | 77 ++++++++++++++++++----------- buildroot/tests/mega1280-tests | 10 +--- buildroot/tests/mega2560-tests | 17 +++++-- 3 files changed, 61 insertions(+), 43 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 4e356b3e0c..dff9895c6b 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -170,11 +170,6 @@ void _goto_manual_move(const float scale) { void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int8_t eindex=-1) { _manual_move_func_ptr = func; - #if ENABLED(PREVENT_COLD_EXTRUSION) - const bool too_cold = axis == E_AXIS && thermalManager.tooColdToExtrude(eindex >= 0 ? eindex : active_extruder); - #else - constexpr bool too_cold = false; - #endif START_MENU(); if (LCD_HEIGHT >= 4) { switch (axis) { @@ -187,35 +182,57 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int break; } } - if (too_cold) - BACK_ITEM(MSG_HOTEND_TOO_COLD); - else { - BACK_ITEM(MSG_MOVE_AXIS); - SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); }); - SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); - SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); - if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - // Determine digits needed right of decimal - constexpr uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - PGM_P const label = GET_TEXT(MSG_MOVE_Z_DIST); - char tmp[strlen_P(label) + 10 + 1], numstr[10]; - sprintf_P(tmp, label, dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); - #if DISABLED(HAS_GRAPHICAL_TFT) - extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); - lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); - #else - SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - #endif - } + BACK_ITEM(MSG_MOVE_AXIS); + SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); }); + SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); + SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); + if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { + // Determine digits needed right of decimal + constexpr uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + PGM_P const label = GET_TEXT(MSG_MOVE_Z_DIST); + char tmp[strlen_P(label) + 10 + 1], numstr[10]; + sprintf_P(tmp, label, dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + + #if DISABLED(HAS_GRAPHICAL_TFT) + extern const char NUL_STR[]; + SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); + lcd_put_u8str(tmp); + MENU_ITEM_ADDON_END(); + #else + SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + #endif } END_MENU(); } +#if E_MANUAL + + inline void _goto_menu_move_distance_e() { + ui.goto_screen([]{ _menu_move_distance(E_AXIS, []{ lcd_move_e(); }, -1); }); + } + + inline void _menu_move_distance_e_maybe() { + #if ENABLED(PREVENT_COLD_EXTRUSION) + const bool too_cold = thermalManager.tooColdToExtrude(active_extruder); + if (too_cold) { + ui.goto_screen([]{ + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_PROCEED), GET_TEXT(MSG_BACK), + _goto_menu_move_distance_e, ui.goto_previous_screen, + GET_TEXT(MSG_HOTEND_TOO_COLD), (const char *)nullptr, PSTR("!") + ); + }); + return; + } + #endif + _goto_menu_move_distance_e(); + } + +#endif // E_MANUAL + void menu_move() { START_MENU(); BACK_ITEM(MSG_MOTION); @@ -278,7 +295,7 @@ void menu_move() { #if E_MANUAL // The current extruder - SUBMENU(MSG_MOVE_E, []{ _menu_move_distance(E_AXIS, []{ lcd_move_e(); }, -1); }); + SUBMENU(MSG_MOVE_E, []{ _menu_move_distance_e_maybe(); }); #define SUBMENU_MOVE_E(N) SUBMENU_N(N, MSG_MOVE_EN, []{ _menu_move_distance(E_AXIS, []{ lcd_move_e(MenuItemBase::itemIndex); }, MenuItemBase::itemIndex); }); diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index 6bd9cda605..ce13d4a6e8 100644 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -52,16 +52,8 @@ exec_test $1 $2 "RAMPS | DELTA | RRD LCD | DELTA_AUTO_CALIBRATION | DELTA_CALIBR # Delta Config (generic) + ABL bilinear + BLTOUCH use_example_configs delta/generic opt_set LCD_LANGUAGE cz -opt_set X_DRIVER_TYPE L6470 -opt_set Y_DRIVER_TYPE L6470 -opt_set Z_DRIVER_TYPE L6470 -opt_add L6470_CHAIN_SCK_PIN 53 -opt_add L6470_CHAIN_MISO_PIN 49 -opt_add L6470_CHAIN_MOSI_PIN 40 -opt_add L6470_CHAIN_SS_PIN 42 -opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_CALIBRATION_MENU AUTO_BED_LEVELING_BILINEAR BLTOUCH -exec_test $1 $2 "DELTA | L6470 | RRD LCD | ABL Bilinear | BLTOUCH" +exec_test $1 $2 "DELTA | RRD LCD | ABL Bilinear | BLTOUCH" # clean up restore_configs diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index a3920b9468..4dd03984a5 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -256,13 +256,22 @@ exec_test $1 $2 "Full-featured CR-10S config" #exec_test $1 $2 "Stuff" # -# Delta Config (generic) + UBL + ALLEN_KEY + OLED_PANEL_TINYBOY2 + EEPROM_SETTINGS +# Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 # use_example_configs delta/generic +opt_enable RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS EEPROM_CHITCHAT \ + Z_PROBE_ALLEN_KEY AUTO_BED_LEVELING_UBL \ + OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU opt_set LCD_LANGUAGE ko_KR -opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 Z_PROBE_ALLEN_KEY EEPROM_SETTINGS EEPROM_CHITCHAT \ - OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY -exec_test $1 $2 "RAMPS | DELTA | OLED_PANEL_TINYBOY2 | UBL | Allen Key | EEPROM" +opt_set X_DRIVER_TYPE L6470 +opt_set Y_DRIVER_TYPE L6470 +opt_set Z_DRIVER_TYPE L6470 +opt_add L6470_CHAIN_SCK_PIN 53 +opt_add L6470_CHAIN_MISO_PIN 49 +opt_add L6470_CHAIN_MOSI_PIN 40 +opt_add L6470_CHAIN_SS_PIN 42 +opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" +exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." # # Delta Config (FLSUN AC because it's complex) From cc863ba378cfebfdf7237a6cd730b00faafa0f4c Mon Sep 17 00:00:00 2001 From: Mathew Winters Date: Mon, 5 Oct 2020 18:31:20 +1300 Subject: [PATCH 0347/1370] Z Probe Offset Wizard (#18866) --- Marlin/Configuration_adv.h | 8 ++ Marlin/src/lcd/language/language_en.h | 3 + Marlin/src/lcd/menu/menu.h | 4 + Marlin/src/lcd/menu/menu_bed_leveling.cpp | 4 + Marlin/src/lcd/menu/menu_probe_offset.cpp | 142 ++++++++++++++++++++++ buildroot/tests/mega2560-tests | 2 +- 6 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 Marlin/src/lcd/menu/menu_probe_offset.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 32a26a1e51..8b74663eb5 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1048,6 +1048,14 @@ #if HAS_LCD_MENU + // Add Probe Z Offset calibration to the Bed Leveling menu + #if HAS_BED_PROBE + //#define PROBE_OFFSET_WIZARD + #if ENABLED(PROBE_OFFSET_WIZARD) + #define PROBE_OFFSET_START -4.0 // Estimated nozzle-to-probe Z offset, plus a little extra + #endif + #endif + // Include a page of printer information in the LCD Main Menu //#define LCD_INFO_MENU #if ENABLED(LCD_INFO_MENU) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 94cd3ef583..e8188beccc 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -445,6 +445,7 @@ namespace Language_en { PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Probe X Offset"); PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Probe Y Offset"); PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Probe Z Offset"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Move Nozzle to Bed"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); @@ -653,6 +654,8 @@ namespace Language_en { #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("Reheat"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Reheating..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Probe Wizard"); } #if FAN_COUNT == 1 diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 5248662823..89970225ad 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -219,6 +219,10 @@ void _lcd_draw_homing(); void _lcd_zoffset_overlay_gfx(const float zvalue); #endif +#if ENABLED(PROBE_OFFSET_WIZARD) + void goto_probe_offset_wizard(); +#endif + #if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) void _lcd_toggle_bed_leveling(); #endif diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index e19b04ccb5..8bc4f92131 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -283,6 +283,10 @@ void menu_bed_leveling() { EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); #endif + #if ENABLED(PROBE_OFFSET_WIZARD) + SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); + #endif + #if ENABLED(LEVEL_BED_CORNERS) SUBMENU(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); #endif diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp new file mode 100644 index 0000000000..29c7d41129 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -0,0 +1,142 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// +// Calibrate Probe offset menu. +// + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(PROBE_OFFSET_WIZARD) + +#ifndef PROBE_OFFSET_START + #error "PROBE_OFFSET_WIZARD requires a PROBE_OFFSET_START with a negative value." +#else + static_assert(PROBE_OFFSET_START < 0, "PROBE_OFFSET_START must be < 0. Please update your configuration."); +#endif + +#include "menu_item.h" +#include "menu_addon.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/probe.h" + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +// Global storage +float z_offset_backup, calculated_z_offset; + +TERN_(HAS_LEVELING, bool leveling_was_active); +TERN_(HAS_SOFTWARE_ENDSTOPS, bool store_soft_endstops_enabled); + +void prepare_for_calibration() { + z_offset_backup = probe.offset.z; + + // Disable soft endstops for free Z movement + #if HAS_SOFTWARE_ENDSTOPS + store_soft_endstops_enabled = soft_endstops_enabled; + soft_endstops_enabled = false; + #endif + + // Disable leveling for raw planner motion + #if HAS_LEVELING + leveling_was_active = planner.leveling_active; + set_bed_leveling_enabled(false); + #endif +} + +void set_offset_and_go_back(const float &z) { + probe.offset.z = z; + TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = store_soft_endstops_enabled); + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); + ui.goto_previous_screen_no_defer(); +} + +void _goto_manual_move_z(const float scale) { + ui.manual_move.menu_scale = scale; + ui.goto_screen(lcd_move_z); +} + +void probe_offset_wizard_menu() { + START_MENU(); + calculated_z_offset = probe.offset.z + current_position.z; + + if (LCD_HEIGHT >= 4) + STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT); + + STATIC_ITEM_P(PSTR("Z="), SS_CENTER, ftostr42_52(current_position.z)); + STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_LEFT, ftostr42_52(calculated_z_offset)); + + SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); }); + SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move_z( 0.1f); }); + + if ((SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { + extern const char NUL_STR[]; + SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_CHARACTER_LCD)); + char tmp[20], numstr[10]; + // Determine digits needed right of decimal + const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + lcd_put_u8str(tmp); + MENU_ITEM_ADDON_END(); + } + + ACTION_ITEM(MSG_BUTTON_DONE, []{ + set_offset_and_go_back(calculated_z_offset); + do_z_clearance(20.0 + #ifdef Z_AFTER_HOMING + - 20.0 + Z_AFTER_HOMING + #endif + ); + }); + + ACTION_ITEM(MSG_BUTTON_CANCEL, []{ + set_offset_and_go_back(z_offset_backup); + }); + + END_MENU(); +} + +void goto_probe_offset_wizard() { + ui.defer_status_screen(); + + prepare_for_calibration(); + + probe.offset.z = PROBE_OFFSET_START; + + set_all_unhomed(); + queue.inject_P(G28_STR); + + ui.goto_screen([]{ + _lcd_draw_homing(); + if (all_axes_homed()) { + ui.goto_screen(probe_offset_wizard_menu); + ui.defer_status_screen(); + } + }); +} + +#endif // PROBE_OFFSET_WIZARD diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 4dd03984a5..d3fd5c0192 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -139,7 +139,7 @@ opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ BABYSTEPPING BABYSTEP_DISPLAY_TOTAL FILAMENT_LCD_DISPLAY \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER MENU_ADDAUTOSTART SDSUPPORT SDCARD_SORT_ALPHA \ ENDSTOP_NOISE_THRESHOLD FAN_SOFT_PWM \ - FIX_MOUNTED_PROBE AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE FILAMENT_WIDTH_SENSOR \ + FIX_MOUNTED_PROBE AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE FILAMENT_WIDTH_SENSOR PROBE_OFFSET_WIZARD \ Z_SAFE_HOMING SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER \ SD_ABORT_ON_ENDSTOP_HIT HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT ADVANCED_OK M114_DETAIL \ VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS EXTRA_FAN_SPEED FWRETRACT \ From 563bd0178903c22a9fa6b165179e31c9cd2a0d65 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 5 Oct 2020 01:07:41 -0500 Subject: [PATCH 0348/1370] Sync config to examples --- Marlin/Configuration.h | 7 ++++--- Marlin/Configuration_adv.h | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index e03887a9d7..ec8b162cd6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -486,12 +486,13 @@ //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM) //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) // Set/get with gcode: M301 E[extruder number, 0-2] + #if ENABLED(PID_PARAMS_PER_HOTEND) // Specify between 1 and HOTENDS values per array. // If fewer than EXTRUDER values are provided, the last element will be repeated. - #define DEFAULT_Kp_LIST { 22.20, 20.0 } - #define DEFAULT_Ki_LIST { 1.08, 1.0 } - #define DEFAULT_Kd_LIST { 114.00, 112.0 } + #define DEFAULT_Kp_LIST { 22.20, 22.20 } + #define DEFAULT_Ki_LIST { 1.08, 1.08 } + #define DEFAULT_Kd_LIST { 114.00, 114.00 } #else #define DEFAULT_Kp 22.20 #define DEFAULT_Ki 1.08 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8b74663eb5..e6bfde5c3b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -771,6 +771,7 @@ // //#define ASSISTED_TRAMMING #if ENABLED(ASSISTED_TRAMMING) + // Define positions for probing points, use the hotend as reference not the sensor. #define TRAMMING_POINT_XY { { 20, 20 }, { 200, 20 }, { 200, 200 }, { 20, 200 } } @@ -793,6 +794,7 @@ * M5: 50 = Clockwise, 51 = Counter-Clockwise */ #define TRAMMING_SCREW_THREAD 30 + #endif // @section motion From 6002dc634e56b50a47b272169ba009018de2f4f5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 5 Oct 2020 01:09:32 -0500 Subject: [PATCH 0349/1370] Trailing whitespace --- Marlin/src/HAL/STM32F1/HAL.cpp | 6 +++--- .../share/PlatformIO/variants/archim/build_gcc/debug.mk | 2 +- .../share/PlatformIO/variants/archim/build_gcc/release.mk | 2 +- .../variants/archim/debug_scripts/iar/arduino_due_sram.mac | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 5920334bb1..cd1efc1659 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -99,7 +99,7 @@ const uint8_t adc_pins[] = { #endif #if HAS_TEMP_ADC_PROBE TEMP_PROBE_PIN, - #endif + #endif #if HAS_HEATED_BED TEMP_BED_PIN, #endif @@ -156,7 +156,7 @@ enum TempPinIndex : char { #endif #if HAS_TEMP_ADC_PROBE TEMP_PROBE, - #endif + #endif #if HAS_HEATED_BED TEMP_BED, #endif @@ -349,7 +349,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { #endif #if HAS_TEMP_ADC_PROBE case TEMP_PROBE_PIN: pin_index = TEMP_PROBE; break; - #endif + #endif #if HAS_HEATED_BED case TEMP_BED_PIN: pin_index = TEMP_BED; break; #endif diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk index d0716744a7..a3cc2337a8 100644 --- a/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk @@ -8,7 +8,7 @@ # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk index 0d15157f4f..2659255bff 100644 --- a/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk @@ -8,7 +8,7 @@ # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac index ba86029d34..d97a4ab6bb 100644 --- a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac @@ -38,7 +38,7 @@ execUserPreload() __message "------------------------------ execUserPreload ---------------------------------"; __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset - + // perpheral reset RSTC_CR __writeMemory32(0xA5000004,0x400e1200,"Memory"); } From 61d500462cbdd309dd39a43e7c0249739ab60fac Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 6 Oct 2020 02:59:51 -0500 Subject: [PATCH 0350/1370] Improve retract / unretract labels --- Marlin/src/lcd/language/language_cz.h | 8 ++++---- Marlin/src/lcd/language/language_da.h | 8 ++++---- Marlin/src/lcd/language/language_de.h | 6 +++--- Marlin/src/lcd/language/language_el.h | 6 +++--- Marlin/src/lcd/language/language_el_gr.h | 6 +++--- Marlin/src/lcd/language/language_en.h | 10 +++++----- Marlin/src/lcd/language/language_fi.h | 6 +++--- Marlin/src/lcd/language/language_hu.h | 2 +- Marlin/src/lcd/language/language_it.h | 6 +++--- Marlin/src/lcd/language/language_jp_kana.h | 10 +++++----- Marlin/src/lcd/language/language_nl.h | 8 ++++---- Marlin/src/lcd/language/language_pt.h | 2 +- Marlin/src/lcd/language/language_ro.h | 10 +++++----- Marlin/src/lcd/language/language_sk.h | 8 ++++---- Marlin/src/lcd/language/language_tr.h | 6 +++--- Marlin/src/lcd/language/language_vi.h | 6 +++--- Marlin/src/lcd/language/language_zh_CN.h | 6 +++--- Marlin/src/lcd/language/language_zh_TW.h | 6 +++--- 18 files changed, 60 insertions(+), 60 deletions(-) diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 716c0a0929..9cbd7042d6 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -350,11 +350,11 @@ namespace Language_cz { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("VýmÄ›na Re.mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraktovat V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zvednuti Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Délka retrakce"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Délka zavedení"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("VýmÄ›na nástroje"); diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index 0e4fa75aa6..be9ad758ce 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -126,10 +126,10 @@ namespace Language_da { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Skift Re.mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Tilbagetræk V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Skift UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Skift Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Skift filament"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Skift filament *"); PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Skift SD kort"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 88b78abeb8..74e185680c 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -380,9 +380,9 @@ namespace Language_de { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Wechs. Einzug mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("V Einzug"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z-Sprung mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Wechs. UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Wechs. Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Autom. Einzug"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Einzugslänge"); diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index fea2bf5818..125119d5cc 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -158,9 +158,9 @@ namespace Language_el { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυÏσης μμ"); //SHORTEN PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("ΑνάσυÏση V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυÏση"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Αλλαγή νήματος *"); diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index 344618b137..3db6fccdf0 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -160,9 +160,9 @@ namespace Language_el_gr { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυÏσης μμ"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("ΑνάσυÏση V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυÏση"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Αλλαγή νήματος *"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index e8188beccc..b41515a734 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -384,13 +384,13 @@ namespace Language_en { PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPED. "); PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Swap Length"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Swap Extra"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purge Length"); diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index af7dd22af9..e8621377d9 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -116,9 +116,9 @@ namespace Language_fi { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Va. Vedä mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Vedä V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Va. UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Va. Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVeto."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrointi"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibroi X"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 02f2a9bde2..6e1b30c180 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -375,7 +375,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVisszah."); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás Távolság"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index a70463956a..a7ddb94820 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -385,9 +385,9 @@ namespace Language_it { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Scamb. Ritrai mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ritrai V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Salta mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRitrai"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lunghezza scambio"); diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index f1289123a4..32b12f50cb 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -160,12 +160,12 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_STOPPED = _UxGT("テイシシマシタ"); // "STOPPED. " PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("ヒキコミリョウ mm"); // "Retract mm" PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("ヒキコミリョウS mm"); // "Swap Re.mm" - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("ヒキコミソクド mm/s"); // "Retract V" + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("ヒキコミソクド mm/s"); // "Retract V" PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("ノズルタイヒ mm"); // "Hop mm" - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("ホショウリョウ mm"); // "UnRet mm" - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("ホショウリョウS mm"); // "S UnRet mm" - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ホショウソクド mm/s"); // "UnRet V" - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ジドウヒキコミ"); // "AutoRetr." + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("ホショウリョウ mm"); // "Unretr. mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("ホショウリョウS mm"); // "S Unretr. mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ホショウソクド mm/s"); // "Unretract V" + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ジドウヒキコミ"); // "Auto-Retract" PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("フィラメントコウカン"); // "Change filament" PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("メディアサイヨミコミ"); // "Init. SD card" PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("メディアコウカン"); // "Change SD card" diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index 7b6c16b3b3..c142c5c9bf 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -141,10 +141,10 @@ namespace Language_nl { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Ruil Retract mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract F"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ruil UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet F"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ruil Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretr. FR"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Verv. Filament"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Verv. Filament *"); PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Init. SD kaart"); diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 56426c0321..37da621624 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -138,7 +138,7 @@ namespace Language_pt { PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT(" DesRet mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Troca DesRet mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT(" DesRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT(" AutoRetr."); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT(" Auto-Retract"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Trocar filamento"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Trocar filamento *"); PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Inici. cartão SD"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 46c54f1b99..7b54f24abf 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -375,13 +375,13 @@ namespace Language_ro { PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPED. "); PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Swap Length"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Swap Extra"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purge Length"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index c9dc6b1a16..d0fdf5749c 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -376,11 +376,11 @@ namespace Language_sk { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Výmena Re.mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("RetraktovaÅ¥ V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zdvih Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Dĺžka výmeny"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("VymeniÅ¥ naviac"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Dĺžka vytlaÄenia"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 11fd3f21e8..f81f153789 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -358,9 +358,9 @@ namespace Language_tr { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Geri Çekme V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Atlama mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Oto. Geri Çekme"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("G.Çekme Boyu"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index fb60a5d821..f7cf606575 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -293,11 +293,11 @@ namespace Language_vi { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Rút Trao.mm"); // Swap Re.mm PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Rút V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Nhảy mm"); // hop - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Bá»Rút mm"); // UnRet mm - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Bá»Rút T mm"); // S UnRet mm + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Bá»Rút mm"); // Unretr. mm + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Bá»Rút T mm"); // S Unretr. mm PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Bá»Rút V"); // UnRet V PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Bá»Rút T V"); // S UnRet V - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("RútTá»±Äá»™ng"); // AutoRetr. + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("RútTá»±Äá»™ng"); // Auto-Retract PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Khoảng Cách Rút"); // Retract Distance PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Thay Äổi Công Cụ"); // Tool Change PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("ÄÆ°a Lên Z"); // Z Raise diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index a70e0876a8..3bebe12fda 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -373,13 +373,13 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_STOPPED = _UxGT("å·²åœæ­¢"); //"STOPPED. " PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("回抽长度mm"); //"Retract mm" retract_length, retract length (positive mm) PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("æ¢æ‰‹å›žæŠ½é•¿åº¦mm"); //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回抽速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回抽速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); //"Hop mm" retract_zraise, retract Z-lift PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("回抽æ¢å¤é•¿åº¦mm"); //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("æ¢æ‰‹å›žæŠ½æ¢å¤é•¿åº¦mm"); //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回抽æ¢å¤åŽè¿›æ–™é€ŸçŽ‡mm/s"); //"UnRet V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回抽æ¢å¤åŽè¿›æ–™é€ŸçŽ‡mm/s"); //"Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自动抽回"); //"AutoRetr." autoretract_enabled, + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自动抽回"); //"Auto-Retract" autoretract_enabled, PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("交æ¢é•¿åº¦"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("é¢å¤–的交æ¢"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("清洗长度"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 6b4bac37d1..7abf895d54 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -337,13 +337,13 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_STOPPED = _UxGT("å·²åœæ­¢"); //"STOPPED. " PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("回縮長度mm"); //"Retract mm" retract_length, retract length (positive mm) PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("æ›æ‰‹å›žæŠ½é•·åº¦mm"); //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回縮速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回縮速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); //"Hop mm" retract_zraise, retract Z-lift PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("回縮æ¢å¾©é•·åº¦mm"); //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("æ›æ‰‹å›žç¸®æ¢å¾©é•·åº¦mm"); //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回縮æ¢å¾©å¾Œé€²æ–™é€ŸçŽ‡mm/s"); //"UnRet V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回縮æ¢å¾©å¾Œé€²æ–™é€ŸçŽ‡mm/s"); //"Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自動回縮"); //"AutoRetr." autoretract_enabled, + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自動回縮"); //"Auto-Retract" autoretract_enabled, PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("交æ›é•·åº¦"); //"Swap Length" PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("清除長度"); //"Purge Length" PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("交æ›å·¥å…·"); //"Tool Change" From ebca2efb243df4b534e8e4bcaaf2a151702de42a Mon Sep 17 00:00:00 2001 From: signetica <66766598+signetica@users.noreply.github.com> Date: Tue, 6 Oct 2020 15:58:28 -0600 Subject: [PATCH 0351/1370] Fix Ender-3 V2 DWIN Stop SD Print (#19642) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 41 +++++++++---------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 85263a89ab..2808749737 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -181,7 +181,7 @@ uint8_t index_file = MROWS, index_leveling = MROWS, index_tune = MROWS; -bool dwin_abort_flag = false; +bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; @@ -1801,8 +1801,8 @@ void HMI_SDCardUpdate() { // TODO: Move card removed abort handling // to CardReader::manage_media. card.flag.abort_sd_printing = true; - wait_for_heatup = false; - dwin_abort_flag = true; + wait_for_heatup = wait_for_user = false; + dwin_abort_flag = true; // Reset feedrate, return to Home } } DWIN_UpdateLCD(); @@ -2097,7 +2097,7 @@ void HMI_Printing() { if (HMI_flag.done_confirm_flag) { if (encoder_diffState == ENCODER_DIFF_ENTER) { HMI_flag.done_confirm_flag = false; - dwin_abort_flag = true; + dwin_abort_flag = true; // Reset feedrate, return to Home } return; } @@ -2206,25 +2206,15 @@ void HMI_PauseOrStop() { } else if (select_print.now == 2) { // stop window if (HMI_flag.select_flag) { - wait_for_heatup = false; // Stop waiting for heater - - #if 0 - // TODO: In ExtUI or MarlinUI add a common stop event - // card.flag.abort_sd_printing = true; - #else - checkkey = Back_Main; - // Wait for planner moves to finish! - if (HMI_flag.home_flag) planner.synchronize(); - card.endFilePrint(); - #ifdef ACTION_ON_CANCEL - host_action_cancel(); - #endif - #ifdef EVENT_GCODE_SD_ABORT - Popup_Window_Home(true); - queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); - #endif - dwin_abort_flag = true; + checkkey = Back_Main; + if (HMI_flag.home_flag) planner.synchronize(); // Wait for planner moves to finish! + wait_for_heatup = wait_for_user = false; // Stop waiting for heating/user + card.flag.abort_sd_printing = true; // Let the main loop handle SD abort + dwin_abort_flag = true; // Reset feedrate, return to Home + #ifdef ACTION_ON_CANCEL + host_action_cancel(); #endif + Popup_Window_Home(true); } else Goto_PrintProcess(); // cancel stop @@ -3584,13 +3574,6 @@ void EachMomentUpdate() { dwin_abort_flag = false; HMI_ValueStruct.print_speed = feedrate_percentage = 100; dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); - - planner.finish_and_disable(); - - #if DISABLED(SD_ABORT_NO_COOLDOWN) - thermalManager.disable_all_heaters(); - #endif - select_page.set(0); Goto_MainMenu(); } From 22ef4fe26cf937087f997cd7ec001e625ee6ab8d Mon Sep 17 00:00:00 2001 From: ladismrkolj Date: Wed, 7 Oct 2020 01:36:01 +0200 Subject: [PATCH 0352/1370] Add Chamber servo vent, auto fan (#19519) --- Marlin/Configuration_adv.h | 45 +++++++-- Marlin/src/inc/Conditionals_LCD.h | 17 +--- Marlin/src/inc/Conditionals_adv.h | 45 +++++++++ Marlin/src/inc/SanityCheck.h | 32 ++++++- Marlin/src/module/temperature.cpp | 92 +++++++++++++++++-- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 1 + 6 files changed, 193 insertions(+), 39 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e6bfde5c3b..f1c7d1fc53 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -32,11 +32,10 @@ */ #define CONFIGURATION_ADV_H_VERSION 020007 -// @section temperature - //=========================================================================== //============================= Thermal Settings ============================ //=========================================================================== +// @section temperature /** * Thermocouple sensors are quite sensitive to noise. Any noise induced in @@ -125,9 +124,19 @@ #define HEATER_BED_INVERTING true #endif -/** - * Heated Chamber settings - */ +// +// Heated Bed Bang-Bang options +// +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS + #endif +#endif + +// +// Heated Chamber options +// #if TEMP_SENSOR_CHAMBER #define CHAMBER_MINTEMP 5 #define CHAMBER_MAXTEMP 60 @@ -135,12 +144,28 @@ //#define CHAMBER_LIMIT_SWITCHING //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin //#define HEATER_CHAMBER_INVERTING false -#endif -#if DISABLED(PIDTEMPBED) - #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control - #if ENABLED(BED_LIMIT_SWITCHING) - #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + //#define CHAMBER_FAN // Enable a fan on the chamber + #if ENABLED(CHAMBER_FAN) + #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve. + #if CHAMBER_FAN_MODE == 0 + #define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255) + #elif CHAMBER_FAN_MODE == 1 + #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target + #elif CHAMBER_FAN_MODE == 2 + #define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255) + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target + #endif + #endif + + //#define CHAMBER_VENT // Enable a servo-controlled vent on the chamber + #if ENABLED(CHAMBER_VENT) + #define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo + #define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber + #define LOW_EXCESS_HEAT_LIMIT 3 + #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 + #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 #endif #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index d2c939b9b4..210bf3e91b 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -603,10 +603,6 @@ #define DO_SWITCH_EXTRUDER 1 #endif -#ifdef SWITCHING_NOZZLE_E1_SERVO_NR - #define SWITCHING_NOZZLE_TWO_SERVOS 1 -#endif - /** * Default hotend offsets, if not defined */ @@ -657,14 +653,7 @@ #ifndef Z_PROBE_SERVO_NR #define Z_PROBE_SERVO_NR 0 #endif - #ifndef NUM_SERVOS - #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1) - #endif #undef DEACTIVATE_SERVOS_AFTER_MOVE - #if NUM_SERVOS == 1 - #undef SERVO_DELAY - #define SERVO_DELAY { 50 } - #endif // Always disable probe pin inverting for BLTouch #undef Z_MIN_PROBE_ENDSTOP_INVERTING @@ -675,14 +664,10 @@ #endif #endif -#ifndef NUM_SERVOS - #define NUM_SERVOS 0 -#endif - /** * Set a flag for a servo probe (or BLTouch) */ -#if defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0 +#ifdef Z_PROBE_SERVO_NR #define HAS_Z_SERVO_PROBE 1 #endif #if ANY(HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index d3f608e0a4..0952148d19 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -26,6 +26,51 @@ * Defines that depend on advanced configuration. */ +#ifdef SWITCHING_NOZZLE_E1_SERVO_NR + #define SWITCHING_NOZZLE_TWO_SERVOS 1 +#endif + +// Determine NUM_SERVOS if none was supplied +#ifndef NUM_SERVOS + #define NUM_SERVOS 0 + #if ANY(CHAMBER_VENT, HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) + #if NUM_SERVOS <= Z_PROBE_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= CHAMBER_VENT_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (CHAMBER_VENT_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_TOOLHEAD_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_TOOLHEAD_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_NOZZLE_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_NOZZLE_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_NOZZLE_E1_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_NOZZLE_E1_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_EXTRUDER_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_EXTRUDER_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_EXTRUDER_E23_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_EXTRUDER_E23_SERVO_NR + 1) + #endif + #endif +#endif + +// Convenience override for a BLTouch alone +#if ENABLED(BLTOUCH) && NUM_SERVOS == 1 + #undef SERVO_DELAY + #define SERVO_DELAY { 50 } +#endif + #if EXTRUDERS == 0 #define NO_VOLUMETRICS #undef TEMP_SENSOR_0 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5bd6ef7c78..c4dcfd54ae 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1249,8 +1249,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * NUM_SERVOS is required for a Z servo probe */ #if HAS_Z_SERVO_PROBE - #ifndef NUM_SERVOS - #error "You must set NUM_SERVOS for a Z servo probe (Z_PROBE_SERVO_NR)." + #if !NUM_SERVOS + #error "NUM_SERVOS is required for a Z servo probe (Z_PROBE_SERVO_NR)." + #elif Z_PROBE_SERVO_NR >= NUM_SERVOS + #error "Z_PROBE_SERVO_NR must be smaller than NUM_SERVOS." #elif Z_PROBE_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) #error "SERVO0_PIN must be defined for your servo or BLTOUCH probe." #elif Z_PROBE_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) @@ -1259,8 +1261,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "SERVO2_PIN must be defined for your servo or BLTOUCH probe." #elif Z_PROBE_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) #error "SERVO3_PIN must be defined for your servo or BLTOUCH probe." - #elif Z_PROBE_SERVO_NR >= NUM_SERVOS - #error "Z_PROBE_SERVO_NR must be smaller than NUM_SERVOS." #endif #endif @@ -1807,6 +1807,30 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN. Please add it to your configuration." #endif +#if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2)) + #error "CHAMBER_FAN_MODE must be between 0 and 2. Please update your Configuration_adv.h." +#endif + +#if ENABLED(CHAMBER_VENT) + #ifndef CHAMBER_VENT_SERVO_NR + #error "CHAMBER_VENT_SERVO_NR is required for CHAMBER SERVO. Update your Configuration_adv.h." + #elif !NUM_SERVOS + #error "NUM_SERVOS is required for a Heated Chamber vent servo (CHAMBER_VENT_SERVO_NR)." + #elif CHAMBER_VENT_SERVO_NR >= NUM_SERVOS + #error "CHAMBER_VENT_SERVO_NR must be smaller than NUM_SERVOS." + #elif HAS_Z_SERVO_PROBE && CHAMBER_VENT_SERVO_NR == Z_PROBE_SERVO_NR + #error "CHAMBER SERVO is already used by BLTOUCH. Please change." + #elif CHAMBER_VENT_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) + #error "SERVO0_PIN must be defined for your Heated Chamber vent servo." + #elif CHAMBER_VENT_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) + #error "SERVO1_PIN must be defined for your Heated Chamber vent servo." + #elif CHAMBER_VENT_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) + #error "SERVO2_PIN must be defined for your Heated Chamber vent servo." + #elif CHAMBER_VENT_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) + #error "SERVO3_PIN must be defined for your Heated Chamber vent servo." + #endif +#endif + #if TEMP_SENSOR_PROBE #if !PIN_EXISTS(TEMP_PROBE) #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN. Please add it to your configuration." diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index f589140895..004c2d1239 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -111,6 +111,9 @@ #include "../libs/buzzer.h" #endif +#if HAS_SERVOS + #include "./servo.h" +#endif #if HOTEND_USES_THERMISTOR #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) static const temp_entry_t* heater_ttbl_map[2] = { HEATER_0_TEMPTABLE, HEATER_1_TEMPTABLE }; @@ -271,6 +274,11 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_TEMP_CHAMBER chamber_info_t Temperature::temp_chamber; // = { 0 } #if HAS_HEATED_CHAMBER + int16_t fan_chamber_pwm; + bool flag_chamber_off; + bool flag_chamber_excess_heat = false; + millis_t next_cool_check_ms_2 = 0; + float old_temp = 9999; #ifdef CHAMBER_MINTEMP int16_t Temperature::mintemp_raw_CHAMBER = HEATER_CHAMBER_RAW_LO_TEMP; #endif @@ -1189,18 +1197,84 @@ void Temperature::manage_heater() { } #endif + #if EITHER(CHAMBER_FAN, CHAMBER_VENT) + if (temp_chamber.target > CHAMBER_MINTEMP) { + flag_chamber_off = false; + + #if ENABLED(CHAMBER_FAN) + #if CHAMBER_FAN_MODE == 0 + fan_chamber_pwm = CHAMBER_FAN_BASE + #elif CHAMBER_FAN_MODE == 1 + fan_chamber_pwm = temp_chamber.celsius > temp_chamber.target ? CHAMBER_FAN_BASE + ((temp_chamber.celsius - temp_chamber.target) * CHAMBER_FAN_FACTOR ) : 0; + #elif CHAMBER_FAN_MODE == 2 + fan_chamber_pwm = (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * ABS(temp_chamber.celsius - temp_chamber.target); + if (temp_chamber.soft_pwm_amount) + fan_chamber_pwm += (CHAMBER_FAN_FACTOR) * 2; + #endif + fan_chamber_pwm = _MIN(225, fan_chamber_pwm); + thermalManager.set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan + #endif + + #if ENABLED(CHAMBER_VENT) + #ifndef MIN_COOLING_SLOPE_TIME_CHAMBER_VENT + #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 + #endif + #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER_VENT + #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 + #endif + if( (temp_chamber.celsius - temp_chamber.target >= HIGH_EXCESS_HEAT_LIMIT) && !flag_chamber_excess_heat) { + // open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT + if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) { + if (old_temp - temp_chamber.celsius < float(MIN_COOLING_SLOPE_DEG_CHAMBER_VENT)) flag_chamber_excess_heat = true; //the bed is heating the chamber too much + next_cool_check_ms_2 = ms + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER_VENT; + old_temp = temp_chamber.celsius; + } + } + else { + next_cool_check_ms_2 = 0; + old_temp = 9999; + } + if (flag_chamber_excess_heat && (temp_chamber.celsius - temp_chamber.target <= -LOW_EXCESS_HEAT_LIMIT) ) { + flag_chamber_excess_heat = false; + } + #endif + } + else if (!flag_chamber_off) { + #if ENABLED(CHAMBER_FAN) + flag_chamber_off = true; + thermalManager.set_fan_speed(2, 0); + #endif + #if ENABLED(CHAMBER_VENT) + flag_chamber_excess_heat = false; + MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 90); + #endif + } + #endif + if (ELAPSED(ms, next_chamber_check_ms)) { next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { - #if ENABLED(CHAMBER_LIMIT_SWITCHING) - if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) - temp_chamber.soft_pwm_amount = 0; - else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS)) - temp_chamber.soft_pwm_amount = MAX_CHAMBER_POWER >> 1; - #else - temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? MAX_CHAMBER_POWER >> 1 : 0; - #endif + if (!flag_chamber_excess_heat){ + #if ENABLED(CHAMBER_LIMIT_SWITCHING) + if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) + temp_chamber.soft_pwm_amount = 0; + else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS)) + temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1; + #else + temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0; + #endif + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0); + #endif + } + else { + temp_chamber.soft_pwm_amount = 0; + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); + #endif + } } else { temp_chamber.soft_pwm_amount = 0; @@ -3365,7 +3439,7 @@ void Temperature::tick() { #define MIN_COOLING_SLOPE_DEG_CHAMBER 1.50 #endif #ifndef MIN_COOLING_SLOPE_TIME_CHAMBER - #define MIN_COOLING_SLOPE_TIME_CHAMBER 60 + #define MIN_COOLING_SLOPE_TIME_CHAMBER 120 #endif bool Temperature::wait_for_chamber(const bool no_wait_for_cooling/*=true*/) { diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 1cd7e9dd89..83fd987d9d 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -41,6 +41,7 @@ // Servos // #define SERVO0_PIN PA1 +#define SERVO1_PIN PC9 // // Trinamic Stallguard pins From b5da52007b666bf4a2b50f1c585851ea337c6120 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 6 Oct 2020 01:28:08 -0500 Subject: [PATCH 0353/1370] Update language fonts --- Marlin/src/lcd/dogm/fontdata/langdata_el.h | 4 ---- Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h | 5 ----- buildroot/share/fonts/README.md | 4 +--- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_el.h b/Marlin/src/lcd/dogm/fontdata/langdata_el.h index 284706a817..6d864c9c9a 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_el.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_el.h @@ -34,9 +34,6 @@ const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, 0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, 0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_7_169_169[30] U8G_FONT_SECTION("fontpage_7_169_169") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x50,0xd8}; const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xaf,0x00,0x08,0xfe,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, @@ -84,7 +81,6 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Î' FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' - FONTDATA_ITEM(7, 169, 169, fontpage_7_169_169), // 'Ω' -- 'Ω' FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε' FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ' diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h index af39ce5c48..9d8ee47fab 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h @@ -206,10 +206,6 @@ const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x89,0x00,0x4f,0xe0,0x59,0x00,0x09, 0x00,0x2f,0xc0,0x29,0x00,0xcf,0xc0,0x49,0x00,0x49,0x00,0x4f,0xe0}; -const u8g_fntpgm_uint8_t fontpage_163_201_201[45] U8G_FONT_SECTION("fontpage_163_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x4f,0xe0,0x40,0x00,0x07,0xc0,0x24, - 0x40,0x24,0x40,0x27,0xc0,0xc1,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; const u8g_fntpgm_uint8_t fontpage_163_250_251[73] U8G_FONT_SECTION("fontpage_163_250_251") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f, @@ -1516,7 +1512,6 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(163, 151, 151, fontpage_163_151_151), // '冗' -- '冗' FONTDATA_ITEM(163, 183, 183, fontpage_163_183_183), // '冷' -- '冷' FONTDATA_ITEM(163, 198, 198, fontpage_163_198_198), // '准' -- '准' - FONTDATA_ITEM(163, 201, 201, fontpage_163_201_201), // '凉' -- '凉' FONTDATA_ITEM(163, 250, 251, fontpage_163_250_251), // '出' -- '击' FONTDATA_ITEM(164, 134, 135, fontpage_164_134_135), // '分' -- '切' FONTDATA_ITEM(164, 155, 155, fontpage_164_155_155), // '创' -- '创' diff --git a/buildroot/share/fonts/README.md b/buildroot/share/fonts/README.md index cc09b52810..b80de8e26e 100644 --- a/buildroot/share/fonts/README.md +++ b/buildroot/share/fonts/README.md @@ -1,6 +1,5 @@ # Marlin fonts - ## Author and license The original author of the following font files is [A. Hardtung](https://github.com/AnHardt). @@ -18,6 +17,5 @@ https://creativecommons.org/publicdomain/zero/1.0/ Additional changes to the original font files distributed with Marlin are copyrighted under the terms of the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.txt) license. - ## Documentation -For detailed information about [adding new fonts](https://www.marlinfw.org/docs/development/fonts.html) to Marlin visit our documentation website. +For detailed information about adding new fonts to Marlin [see this article](https://marlinfw.org/docs/development/fonts.html). From c86e14c6ff80d363818f3b61b413b8d8cc49941d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 6 Oct 2020 19:17:18 -0500 Subject: [PATCH 0354/1370] Fix small font section directive, mixer warning --- Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h index 2aca88ca79..a116098d79 100644 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h @@ -33,7 +33,7 @@ Max Font ascent = 7 descent=-2 */ #include -const u8g_fntpgm_uint8_t u8g_font_6x9[2300] U8G_SECTION(".progmem.u8g_font_6x9") = { +const u8g_fntpgm_uint8_t u8g_font_6x9[2300] U8G_FONT_SECTION(".progmem.u8g_font_6x9") = { 0, 6, 9, 0, 254, 6, 1, 137, 2, 254, 32, 255, 254, 7, 254, 6, 254, 0, 0, 0, 6, 0, 7, 1, 6, 6, 6, 2, 0, 128, 128, 128, 128, 0, 128, 3, 3, 3, 6, 1, 3, 160, 160, 160, 5, 7, 7, 6, diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 82b6e768c6..987924201a 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -758,7 +758,7 @@ void MarlinUI::draw_status_screen() { // Two-component mix / gradient instead of XY - char mixer_messages[12]; + char mixer_messages[15]; PGM_P mix_label; #if ENABLED(GRADIENT_MIX) if (mixer.gradient.enabled) { From 45385e737c9d61cc0d510ddb477f59262215a860 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 6 Oct 2020 19:42:03 -0500 Subject: [PATCH 0355/1370] Chamber vent/fan followup --- Marlin/src/module/temperature.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 004c2d1239..08adfa8745 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1205,13 +1205,13 @@ void Temperature::manage_heater() { #if CHAMBER_FAN_MODE == 0 fan_chamber_pwm = CHAMBER_FAN_BASE #elif CHAMBER_FAN_MODE == 1 - fan_chamber_pwm = temp_chamber.celsius > temp_chamber.target ? CHAMBER_FAN_BASE + ((temp_chamber.celsius - temp_chamber.target) * CHAMBER_FAN_FACTOR ) : 0; + fan_chamber_pwm = (temp_chamber.celsius > temp_chamber.target) ? (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * (temp_chamber.celsius - temp_chamber.target) : 0; #elif CHAMBER_FAN_MODE == 2 fan_chamber_pwm = (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * ABS(temp_chamber.celsius - temp_chamber.target); if (temp_chamber.soft_pwm_amount) fan_chamber_pwm += (CHAMBER_FAN_FACTOR) * 2; #endif - fan_chamber_pwm = _MIN(225, fan_chamber_pwm); + NOMORE(fan_chamber_pwm, 225); thermalManager.set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan #endif @@ -1256,7 +1256,13 @@ void Temperature::manage_heater() { next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { - if (!flag_chamber_excess_heat){ + if (flag_chamber_excess_heat) { + temp_chamber.soft_pwm_amount = 0; + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); + #endif + } + else { #if ENABLED(CHAMBER_LIMIT_SWITCHING) if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) temp_chamber.soft_pwm_amount = 0; @@ -1269,12 +1275,6 @@ void Temperature::manage_heater() { if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0); #endif } - else { - temp_chamber.soft_pwm_amount = 0; - #if ENABLED(CHAMBER_VENT) - if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); - #endif - } } else { temp_chamber.soft_pwm_amount = 0; From 3e9c6c6297594c9bc738b9ef8a6bd98848529337 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 8 Oct 2020 07:00:08 +1300 Subject: [PATCH 0356/1370] =?UTF-8?q?Restore=20=C2=B0=20to=206x9=20small?= =?UTF-8?q?=20info=20font=20(#19645)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 2 +- .../lcd/dogm/fontdata/fontdata_6x9_marlin.h | 302 +- buildroot/share/fonts/marlin-6x9.bdf | 16606 ++++++++++++++++ 3 files changed, 16762 insertions(+), 148 deletions(-) create mode 100644 buildroot/share/fonts/marlin-6x9.bdf diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f1c7d1fc53..3d3e55b92e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1377,7 +1377,7 @@ // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. //#define USE_BIG_EDIT_FONT - // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // A smaller font may be used on the Info Screen. Costs 2434 bytes of PROGMEM. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. //#define USE_SMALL_INFOFONT diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h index a116098d79..7a354aa738 100644 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h @@ -25,7 +25,7 @@ Fontname: -Misc-Fixed-Medium-R-Normal--9-90-75-75-C-60-ISO10646-1 Copyright: Public domain font. Share and enjoy. Capital A Height: 6, '1' Height: 6 - Calculated Max Values w= 6 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 7 len= 9 + Calculated Max Values w= 6 h= 9 x= 5 y= 5 dx= 6 dy= 0 ascent= 7 len= 9 Font Bounding box w= 6 h= 9 x= 0 y=-2 Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 Pure Font ascent = 6 descent=-2 @@ -33,149 +33,157 @@ Max Font ascent = 7 descent=-2 */ #include -const u8g_fntpgm_uint8_t u8g_font_6x9[2300] U8G_FONT_SECTION(".progmem.u8g_font_6x9") = { - 0, 6, 9, 0, 254, 6, 1, 137, 2, 254, 32, 255, 254, 7, 254, 6, - 254, 0, 0, 0, 6, 0, 7, 1, 6, 6, 6, 2, 0, 128, 128, 128, - 128, 0, 128, 3, 3, 3, 6, 1, 3, 160, 160, 160, 5, 7, 7, 6, - 0, 255, 80, 80, 248, 80, 248, 80, 80, 5, 9, 9, 6, 0, 254, 32, - 112, 168, 160, 112, 40, 168, 112, 32, 6, 8, 8, 6, 0, 255, 64, 168, - 72, 16, 32, 72, 84, 8, 5, 7, 7, 6, 0, 255, 96, 144, 144, 96, - 152, 144, 104, 1, 3, 3, 6, 2, 3, 128, 128, 128, 2, 7, 7, 6, - 2, 255, 64, 128, 128, 128, 128, 128, 64, 2, 7, 7, 6, 2, 255, 128, - 64, 64, 64, 64, 64, 128, 5, 5, 5, 6, 0, 0, 136, 80, 248, 80, - 136, 5, 5, 5, 6, 0, 0, 32, 32, 248, 32, 32, 2, 4, 4, 6, - 2, 254, 192, 64, 64, 128, 5, 1, 1, 6, 0, 2, 248, 2, 2, 2, - 6, 2, 0, 192, 192, 4, 6, 6, 6, 1, 0, 16, 16, 32, 64, 128, - 128, 4, 6, 6, 6, 1, 0, 96, 144, 144, 144, 144, 96, 3, 6, 6, - 6, 1, 0, 64, 192, 64, 64, 64, 224, 4, 6, 6, 6, 1, 0, 96, - 144, 16, 32, 64, 240, 4, 6, 6, 6, 1, 0, 240, 32, 96, 16, 16, - 224, 5, 6, 6, 6, 0, 0, 16, 48, 80, 144, 248, 16, 4, 6, 6, - 6, 1, 0, 240, 128, 224, 16, 16, 224, 4, 6, 6, 6, 1, 0, 96, - 128, 224, 144, 144, 96, 4, 6, 6, 6, 1, 0, 240, 16, 16, 32, 64, - 64, 4, 6, 6, 6, 1, 0, 96, 144, 96, 144, 144, 96, 4, 6, 6, - 6, 1, 0, 96, 144, 144, 112, 16, 96, 2, 5, 5, 6, 2, 0, 192, - 192, 0, 192, 192, 2, 7, 7, 6, 2, 254, 192, 192, 0, 192, 64, 64, - 128, 5, 5, 5, 6, 0, 0, 24, 96, 128, 96, 24, 5, 3, 3, 6, - 0, 1, 248, 0, 248, 5, 5, 5, 6, 0, 0, 192, 48, 8, 48, 192, - 4, 7, 7, 6, 1, 0, 96, 144, 16, 96, 64, 0, 64, 5, 6, 6, - 6, 0, 0, 112, 144, 168, 176, 128, 112, 5, 6, 6, 6, 0, 0, 32, - 80, 136, 248, 136, 136, 5, 6, 6, 6, 0, 0, 240, 136, 240, 136, 136, - 240, 4, 6, 6, 6, 1, 0, 96, 144, 128, 128, 144, 96, 4, 6, 6, - 6, 1, 0, 224, 144, 144, 144, 144, 224, 4, 6, 6, 6, 1, 0, 240, - 128, 224, 128, 128, 240, 4, 6, 6, 6, 1, 0, 240, 128, 224, 128, 128, - 128, 4, 6, 6, 6, 1, 0, 96, 144, 128, 176, 144, 96, 4, 6, 6, - 6, 1, 0, 144, 144, 240, 144, 144, 144, 3, 6, 6, 6, 1, 0, 224, - 64, 64, 64, 64, 224, 5, 6, 6, 6, 0, 0, 56, 16, 16, 16, 144, - 96, 4, 6, 6, 6, 1, 0, 144, 160, 192, 160, 144, 144, 4, 6, 6, - 6, 1, 0, 128, 128, 128, 128, 128, 240, 5, 6, 6, 6, 0, 0, 136, - 216, 168, 168, 136, 136, 4, 6, 6, 6, 1, 0, 144, 208, 176, 144, 144, - 144, 5, 6, 6, 6, 0, 0, 112, 136, 136, 136, 136, 112, 4, 6, 6, - 6, 1, 0, 224, 144, 144, 224, 128, 128, 4, 7, 7, 6, 1, 255, 96, - 144, 144, 208, 176, 96, 16, 4, 6, 6, 6, 1, 0, 224, 144, 144, 224, - 144, 144, 4, 6, 6, 6, 1, 0, 96, 144, 64, 32, 144, 96, 5, 6, - 6, 6, 0, 0, 248, 32, 32, 32, 32, 32, 4, 6, 6, 6, 1, 0, - 144, 144, 144, 144, 144, 96, 4, 6, 6, 6, 1, 0, 144, 144, 144, 240, - 96, 96, 5, 6, 6, 6, 0, 0, 136, 136, 168, 168, 216, 136, 5, 6, - 6, 6, 0, 0, 136, 80, 32, 32, 80, 136, 5, 6, 6, 6, 0, 0, - 136, 136, 80, 32, 32, 32, 4, 6, 6, 6, 1, 0, 240, 16, 32, 64, - 128, 240, 3, 6, 6, 6, 1, 0, 224, 128, 128, 128, 128, 224, 4, 6, - 6, 6, 1, 0, 128, 128, 64, 32, 16, 16, 3, 6, 6, 6, 1, 0, - 224, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 3, 32, 80, 136, 5, - 1, 1, 6, 0, 254, 248, 2, 2, 2, 6, 2, 4, 128, 64, 4, 4, - 4, 6, 1, 0, 112, 144, 144, 112, 4, 6, 6, 6, 1, 0, 128, 128, - 224, 144, 144, 224, 4, 4, 4, 6, 1, 0, 112, 128, 128, 112, 4, 6, - 6, 6, 1, 0, 16, 16, 112, 144, 144, 112, 4, 4, 4, 6, 1, 0, - 96, 176, 192, 112, 4, 6, 6, 6, 1, 0, 32, 80, 64, 224, 64, 64, - 4, 6, 6, 6, 1, 254, 96, 144, 144, 112, 16, 96, 4, 6, 6, 6, - 1, 0, 128, 128, 224, 144, 144, 144, 3, 6, 6, 6, 1, 0, 64, 0, - 192, 64, 64, 224, 3, 8, 8, 6, 1, 254, 32, 0, 96, 32, 32, 32, - 160, 64, 4, 6, 6, 6, 1, 0, 128, 128, 160, 192, 160, 144, 3, 6, - 6, 6, 1, 0, 192, 64, 64, 64, 64, 224, 5, 4, 4, 6, 0, 0, - 208, 168, 168, 136, 4, 4, 4, 6, 1, 0, 224, 144, 144, 144, 4, 4, - 4, 6, 1, 0, 96, 144, 144, 96, 4, 6, 6, 6, 1, 254, 224, 144, - 144, 224, 128, 128, 4, 6, 6, 6, 1, 254, 112, 144, 144, 112, 16, 16, - 4, 4, 4, 6, 1, 0, 160, 208, 128, 128, 4, 4, 4, 6, 1, 0, - 112, 192, 48, 224, 4, 6, 6, 6, 1, 0, 64, 64, 224, 64, 80, 32, - 4, 4, 4, 6, 1, 0, 144, 144, 144, 112, 4, 4, 4, 6, 1, 0, - 144, 144, 96, 96, 5, 4, 4, 6, 0, 0, 136, 168, 168, 80, 4, 4, - 4, 6, 1, 0, 144, 96, 96, 144, 4, 6, 6, 6, 1, 254, 144, 144, - 144, 112, 144, 96, 4, 4, 4, 6, 1, 0, 240, 32, 64, 240, 3, 7, - 7, 6, 1, 0, 32, 64, 64, 128, 64, 64, 32, 1, 7, 7, 6, 2, - 255, 128, 128, 128, 128, 128, 128, 128, 3, 7, 7, 6, 1, 0, 128, 64, - 64, 32, 64, 64, 128, 4, 2, 2, 6, 1, 3, 80, 160, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, - 0, 6, 0, 7, 1, 6, 6, 6, 2, 0, 128, 0, 128, 128, 128, 128, - 4, 6, 6, 6, 1, 255, 32, 112, 160, 160, 112, 32, 5, 7, 7, 6, - 0, 255, 48, 72, 64, 240, 64, 64, 248, 5, 5, 5, 6, 0, 0, 168, - 80, 136, 80, 168, 5, 6, 6, 6, 0, 0, 136, 80, 248, 32, 248, 32, - 1, 7, 7, 6, 2, 255, 128, 128, 128, 0, 128, 128, 128, 4, 7, 7, - 6, 1, 255, 112, 128, 96, 144, 96, 16, 224, 3, 1, 1, 6, 1, 5, - 160, 6, 7, 7, 6, 0, 0, 120, 132, 148, 164, 148, 132, 120, 3, 5, - 5, 6, 1, 1, 96, 160, 96, 0, 224, 5, 5, 5, 6, 0, 0, 40, - 80, 160, 80, 40, 4, 3, 3, 6, 1, 0, 240, 16, 16, 4, 1, 1, - 6, 1, 2, 240, 6, 7, 7, 6, 0, 0, 120, 132, 180, 164, 164, 132, - 120, 4, 1, 1, 6, 1, 5, 240, 4, 3, 3, 6, 1, 2, 96, 144, - 96, 5, 7, 7, 6, 0, 255, 32, 32, 248, 32, 32, 0, 248, 3, 5, - 5, 6, 1, 1, 64, 160, 32, 64, 224, 3, 5, 5, 6, 1, 1, 192, - 32, 64, 32, 192, 2, 2, 2, 6, 2, 4, 64, 128, 4, 5, 5, 6, - 1, 255, 144, 144, 176, 208, 128, 5, 6, 6, 6, 0, 0, 120, 232, 232, - 104, 40, 40, 1, 1, 1, 6, 2, 2, 128, 2, 2, 2, 6, 2, 254, - 64, 128, 3, 5, 5, 6, 1, 1, 64, 192, 64, 64, 224, 3, 5, 5, - 6, 1, 1, 64, 160, 64, 0, 224, 5, 5, 5, 6, 0, 0, 160, 80, - 40, 80, 160, 5, 8, 8, 6, 0, 255, 64, 192, 64, 80, 112, 48, 120, - 16, 5, 8, 8, 6, 0, 255, 64, 192, 64, 80, 104, 8, 16, 56, 5, - 8, 8, 6, 0, 255, 192, 32, 64, 48, 240, 48, 120, 16, 4, 7, 7, - 6, 1, 0, 32, 0, 32, 96, 128, 144, 96, 5, 7, 7, 6, 0, 0, - 64, 32, 32, 80, 112, 136, 136, 5, 7, 7, 6, 0, 0, 16, 32, 32, - 80, 112, 136, 136, 5, 7, 7, 6, 0, 0, 32, 80, 32, 80, 112, 136, - 136, 5, 7, 7, 6, 0, 0, 40, 80, 32, 80, 112, 136, 136, 5, 7, - 7, 6, 0, 0, 80, 0, 32, 80, 112, 136, 136, 5, 7, 7, 6, 0, - 0, 32, 80, 32, 80, 112, 136, 136, 5, 6, 6, 6, 0, 0, 120, 160, - 240, 160, 160, 184, 4, 8, 8, 6, 1, 254, 96, 144, 128, 128, 144, 96, - 32, 64, 4, 7, 7, 6, 1, 0, 64, 32, 240, 128, 224, 128, 240, 4, - 7, 7, 6, 1, 0, 32, 64, 240, 128, 224, 128, 240, 4, 7, 7, 6, - 1, 0, 32, 80, 240, 128, 224, 128, 240, 4, 7, 7, 6, 1, 0, 80, - 0, 240, 128, 224, 128, 240, 3, 7, 7, 6, 1, 0, 128, 64, 224, 64, - 64, 64, 224, 3, 7, 7, 6, 1, 0, 32, 64, 224, 64, 64, 64, 224, - 3, 7, 7, 6, 1, 0, 64, 160, 224, 64, 64, 64, 224, 3, 7, 7, - 6, 1, 0, 160, 0, 224, 64, 64, 64, 224, 5, 6, 6, 6, 0, 0, - 112, 72, 232, 72, 72, 112, 4, 7, 7, 6, 1, 0, 80, 160, 144, 208, - 176, 144, 144, 4, 7, 7, 6, 1, 0, 64, 32, 96, 144, 144, 144, 96, - 4, 7, 7, 6, 1, 0, 32, 64, 96, 144, 144, 144, 96, 4, 7, 7, - 6, 1, 0, 32, 80, 96, 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, - 80, 160, 96, 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, 80, 0, 96, - 144, 144, 144, 96, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, 4, - 8, 8, 6, 1, 255, 16, 112, 176, 176, 208, 208, 224, 128, 4, 7, 7, - 6, 1, 0, 64, 32, 144, 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, - 32, 64, 144, 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, 32, 80, 144, - 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, 80, 0, 144, 144, 144, 144, - 96, 5, 7, 7, 6, 0, 0, 16, 32, 136, 80, 32, 32, 32, 4, 6, - 6, 6, 1, 0, 128, 224, 144, 144, 224, 128, 4, 6, 6, 6, 1, 0, - 96, 144, 160, 160, 144, 160, 4, 7, 7, 6, 1, 0, 64, 32, 0, 112, - 144, 144, 112, 4, 7, 7, 6, 1, 0, 32, 64, 0, 112, 144, 144, 112, - 4, 7, 7, 6, 1, 0, 32, 80, 0, 112, 144, 144, 112, 4, 7, 7, - 6, 1, 0, 80, 160, 0, 112, 144, 144, 112, 4, 6, 6, 6, 1, 0, - 80, 0, 112, 144, 144, 112, 4, 7, 7, 6, 1, 0, 32, 80, 32, 112, - 144, 144, 112, 5, 4, 4, 6, 0, 0, 112, 168, 176, 120, 4, 6, 6, - 6, 1, 254, 112, 128, 128, 112, 32, 64, 4, 7, 7, 6, 1, 0, 64, - 32, 0, 96, 176, 192, 112, 4, 7, 7, 6, 1, 0, 32, 64, 0, 96, - 176, 192, 112, 4, 7, 7, 6, 1, 0, 32, 80, 0, 96, 176, 192, 112, - 4, 6, 6, 6, 1, 0, 80, 0, 96, 176, 192, 112, 3, 7, 7, 6, - 1, 0, 128, 64, 0, 192, 64, 64, 224, 3, 7, 7, 6, 1, 0, 32, - 64, 0, 192, 64, 64, 224, 3, 7, 7, 6, 1, 0, 64, 160, 0, 192, - 64, 64, 224, 3, 6, 6, 6, 1, 0, 160, 0, 192, 64, 64, 224, 4, - 7, 7, 6, 1, 0, 48, 96, 16, 112, 144, 144, 96, 4, 7, 7, 6, - 1, 0, 80, 160, 0, 224, 144, 144, 144, 4, 7, 7, 6, 1, 0, 64, - 32, 0, 96, 144, 144, 96, 4, 7, 7, 6, 1, 0, 32, 64, 0, 96, - 144, 144, 96, 4, 7, 7, 6, 1, 0, 32, 80, 0, 96, 144, 144, 96, - 4, 7, 7, 6, 1, 0, 80, 160, 0, 96, 144, 144, 96, 4, 6, 6, - 6, 1, 0, 80, 0, 96, 144, 144, 96, 5, 5, 5, 6, 0, 0, 32, - 0, 248, 0, 32, 4, 4, 4, 6, 1, 0, 112, 176, 208, 224, 4, 7, - 7, 6, 1, 0, 64, 32, 0, 144, 144, 144, 112, 4, 7, 7, 6, 1, - 0, 32, 64, 0, 144, 144, 144, 112, 4, 7, 7, 6, 1, 0, 32, 80, - 0, 144, 144, 144, 112, 4, 6, 6, 6, 1, 0, 80, 0, 144, 144, 144, - 112, 4, 9, 9, 6, 1, 254, 32, 64, 0, 144, 144, 144, 112, 144, 96, - 4, 8, 8, 6, 1, 254, 128, 128, 224, 144, 144, 224, 128, 128, 4, 8, - 8, 6, 1, 254, 80, 0, 144, 144, 144, 112, 144, 96 -}; +const u8g_fntpgm_uint8_t u8g_font_6x9[2434] U8G_FONT_SECTION(".progmem.u8g_font_6x9") = { + 0x00,0x06,0x09,0x00,0xfe,0x06,0x02,0x0f,0x03,0x84,0x01,0xff,0xfe,0x07,0xfe,0x06, + 0xfe,0x05,0x07,0x07,0x00,0x00,0x00,0x40,0xf0,0xc8,0x88,0x98,0x78,0x10,0x05,0x07, + 0x07,0x00,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05,0x00,0x00, + 0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xf8,0x20, + 0x20,0x20,0xe0,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xa8,0xb8,0x88,0x70,0x20, + 0x06,0x05,0x05,0x00,0x00,0x00,0xb0,0xd8,0x6c,0xd8,0xb0,0x05,0x08,0x08,0x00,0x00, + 0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0xa8,0xf8,0x05,0x09,0x09,0x00,0x00,0xfe,0x20, + 0x50,0x50,0x50,0x50,0x88,0xa8,0x88,0x70,0x03,0x03,0x03,0x00,0x00,0x03,0x40,0xa0, + 0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x06,0x06, + 0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x03,0xa0, + 0xa0,0xa0,0x05,0x07,0x07,0x06,0x00,0xff,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x05, + 0x09,0x09,0x06,0x00,0xfe,0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x06,0x08, + 0x08,0x06,0x00,0xff,0x40,0xa8,0x48,0x10,0x20,0x48,0x54,0x08,0x05,0x07,0x07,0x06, + 0x00,0xff,0x60,0x90,0x90,0x60,0x98,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x03,0x80, + 0x80,0x80,0x02,0x07,0x07,0x06,0x02,0xff,0x40,0x80,0x80,0x80,0x80,0x80,0x40,0x02, + 0x07,0x07,0x06,0x02,0xff,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x05,0x05,0x05,0x06, + 0x00,0x00,0x88,0x50,0xf8,0x50,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x20,0x20,0xf8, + 0x20,0x20,0x02,0x04,0x04,0x06,0x02,0xfe,0xc0,0x40,0x40,0x80,0x05,0x01,0x01,0x06, + 0x00,0x02,0xf8,0x02,0x02,0x02,0x06,0x02,0x00,0xc0,0xc0,0x04,0x06,0x06,0x06,0x01, + 0x00,0x10,0x10,0x20,0x40,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x90, + 0x90,0x90,0x60,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0xe0,0x04, + 0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x10,0x20,0x40,0xf0,0x04,0x06,0x06,0x06,0x01, + 0x00,0xf0,0x20,0x60,0x10,0x10,0xe0,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0x30,0x50, + 0x90,0xf8,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xf0,0x80,0xe0,0x10,0x10,0xe0,0x04, + 0x06,0x06,0x06,0x01,0x00,0x60,0x80,0xe0,0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01, + 0x00,0xf0,0x10,0x10,0x20,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x60, + 0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x90,0x70,0x10,0x60,0x02, + 0x05,0x05,0x06,0x02,0x00,0xc0,0xc0,0x00,0xc0,0xc0,0x02,0x07,0x07,0x06,0x02,0xfe, + 0xc0,0xc0,0x00,0xc0,0x40,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x18,0x60,0x80, + 0x60,0x18,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x00,0xf8,0x05,0x05,0x05,0x06,0x00, + 0x00,0xc0,0x30,0x08,0x30,0xc0,0x04,0x07,0x07,0x06,0x01,0x00,0x60,0x90,0x10,0x60, + 0x40,0x00,0x40,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x90,0xa8,0xb0,0x80,0x70,0x05, + 0x06,0x06,0x06,0x00,0x00,0x20,0x50,0x88,0xf8,0x88,0x88,0x05,0x06,0x06,0x06,0x00, + 0x00,0xf0,0x88,0xf0,0x88,0x88,0xf0,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, + 0x80,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0xe0,0x90,0x90,0x90,0x90,0xe0,0x04, + 0x06,0x06,0x06,0x01,0x00,0xf0,0x80,0xe0,0x80,0x80,0xf0,0x04,0x06,0x06,0x06,0x01, + 0x00,0xf0,0x80,0xe0,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, + 0xb0,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0xf0,0x90,0x90,0x90,0x03, + 0x06,0x06,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0xe0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x38,0x10,0x10,0x10,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0xa0,0xc0, + 0xa0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x80,0x80,0x80,0xf0,0x05, + 0x06,0x06,0x06,0x00,0x00,0x88,0xd8,0xa8,0xa8,0x88,0x88,0x04,0x06,0x06,0x06,0x01, + 0x00,0x90,0xd0,0xb0,0x90,0x90,0x90,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x88,0x88, + 0x88,0x88,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0xe0,0x90,0x90,0xe0,0x80,0x80,0x04, + 0x07,0x07,0x06,0x01,0xff,0x60,0x90,0x90,0xd0,0xb0,0x60,0x10,0x04,0x06,0x06,0x06, + 0x01,0x00,0xe0,0x90,0x90,0xe0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90, + 0x40,0x20,0x90,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20, + 0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0x90,0x90,0x90,0x60,0x04,0x06,0x06,0x06, + 0x01,0x00,0x90,0x90,0x90,0xf0,0x60,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88, + 0xa8,0xa8,0xd8,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88, + 0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06, + 0x01,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x03,0x06,0x06,0x06,0x01,0x00,0xe0,0x80, + 0x80,0x80,0x80,0xe0,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x40,0x20,0x10,0x10, + 0x03,0x06,0x06,0x06,0x01,0x00,0xe0,0x20,0x20,0x20,0x20,0xe0,0x05,0x03,0x03,0x06, + 0x00,0x03,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00,0xfe,0xf8,0x02,0x02,0x02,0x06, + 0x02,0x04,0x80,0x40,0x04,0x04,0x04,0x06,0x01,0x00,0x70,0x90,0x90,0x70,0x04,0x06, + 0x06,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0x90,0xe0,0x04,0x04,0x04,0x06,0x01,0x00, + 0x70,0x80,0x80,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x10,0x10,0x70,0x90,0x90,0x70, + 0x04,0x04,0x04,0x06,0x01,0x00,0x60,0xb0,0xc0,0x70,0x04,0x06,0x06,0x06,0x01,0x00, + 0x20,0x50,0x40,0xe0,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0xfe,0x60,0x90,0x90,0x70, + 0x10,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0x03,0x06, + 0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0xfe, + 0x20,0x00,0x60,0x20,0x20,0x20,0xa0,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80, + 0xa0,0xc0,0xa0,0x90,0x03,0x06,0x06,0x06,0x01,0x00,0xc0,0x40,0x40,0x40,0x40,0xe0, + 0x05,0x04,0x04,0x06,0x00,0x00,0xd0,0xa8,0xa8,0x88,0x04,0x04,0x04,0x06,0x01,0x00, + 0xe0,0x90,0x90,0x90,0x04,0x04,0x04,0x06,0x01,0x00,0x60,0x90,0x90,0x60,0x04,0x06, + 0x06,0x06,0x01,0xfe,0xe0,0x90,0x90,0xe0,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xfe, + 0x70,0x90,0x90,0x70,0x10,0x10,0x04,0x04,0x04,0x06,0x01,0x00,0xa0,0xd0,0x80,0x80, + 0x04,0x04,0x04,0x06,0x01,0x00,0x70,0xc0,0x30,0xe0,0x04,0x06,0x06,0x06,0x01,0x00, + 0x40,0x40,0xe0,0x40,0x50,0x20,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x90,0x70, + 0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x60,0x60,0x05,0x04,0x04,0x06,0x00,0x00, + 0x88,0xa8,0xa8,0x50,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x60,0x60,0x90,0x04,0x06, + 0x06,0x06,0x01,0xfe,0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x04,0x04,0x06,0x01,0x00, + 0xf0,0x20,0x40,0xf0,0x03,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x40,0x80,0x40,0x40, + 0x20,0x01,0x07,0x07,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x07, + 0x07,0x06,0x01,0x00,0x80,0x40,0x40,0x20,0x40,0x40,0x80,0x04,0x02,0x02,0x06,0x01, + 0x03,0x50,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x06,0x06,0x06,0x02,0x00, + 0x80,0x00,0x80,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xff,0x20,0x70,0xa0,0xa0, + 0x70,0x20,0x05,0x07,0x07,0x06,0x00,0xff,0x30,0x48,0x40,0xf0,0x40,0x40,0xf8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xa8,0x50,0x88,0x50,0xa8,0x05,0x06,0x06,0x06,0x00,0x00, + 0x88,0x50,0xf8,0x20,0xf8,0x20,0x01,0x07,0x07,0x06,0x02,0xff,0x80,0x80,0x80,0x00, + 0x80,0x80,0x80,0x04,0x07,0x07,0x06,0x01,0xff,0x70,0x80,0x60,0x90,0x60,0x10,0xe0, + 0x03,0x01,0x01,0x06,0x01,0x05,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0x94, + 0xa4,0x94,0x84,0x78,0x03,0x05,0x05,0x06,0x01,0x01,0x60,0xa0,0x60,0x00,0xe0,0x05, + 0x05,0x05,0x06,0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x04,0x03,0x03,0x06,0x01,0x00, + 0xf0,0x10,0x10,0x04,0x01,0x01,0x06,0x01,0x02,0xf0,0x06,0x07,0x07,0x06,0x00,0x00, + 0x78,0x84,0xb4,0xa4,0xa4,0x84,0x78,0x04,0x01,0x01,0x06,0x01,0x05,0xf0,0x04,0x03, + 0x03,0x06,0x01,0x02,0x60,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x20,0xf8, + 0x20,0x20,0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xa0,0x20,0x40,0xe0,0x03, + 0x05,0x05,0x06,0x01,0x01,0xc0,0x20,0x40,0x20,0xc0,0x02,0x02,0x02,0x06,0x02,0x04, + 0x40,0x80,0x04,0x05,0x05,0x06,0x01,0xff,0x90,0x90,0xb0,0xd0,0x80,0x05,0x06,0x06, + 0x06,0x00,0x00,0x78,0xe8,0xe8,0x68,0x28,0x28,0x01,0x01,0x01,0x06,0x02,0x02,0x80, + 0x02,0x02,0x02,0x06,0x02,0xfe,0x40,0x80,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xc0, + 0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xa0,0x40,0x00,0xe0,0x05,0x05, + 0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x08,0x08,0x06,0x00,0xff,0x40, + 0xc0,0x40,0x50,0x70,0x30,0x78,0x10,0x05,0x08,0x08,0x06,0x00,0xff,0x40,0xc0,0x40, + 0x50,0x68,0x08,0x10,0x38,0x05,0x08,0x08,0x06,0x00,0xff,0xc0,0x20,0x40,0x30,0xf0, + 0x30,0x78,0x10,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x00,0x20,0x60,0x80,0x90,0x60, + 0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x20,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x10,0x20,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0x50,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x50,0x20, + 0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x20,0x50,0x70,0x88, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x50,0x20,0x50,0x70,0x88,0x88,0x05,0x06, + 0x06,0x06,0x00,0x00,0x78,0xa0,0xf0,0xa0,0xa0,0xb8,0x04,0x08,0x08,0x06,0x01,0xfe, + 0x60,0x90,0x80,0x80,0x90,0x60,0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20, + 0xf0,0x80,0xe0,0x80,0xf0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0xf0,0x80,0xe0, + 0x80,0xf0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0xf0,0x80,0xe0,0x80,0xf0,0x04, + 0x07,0x07,0x06,0x01,0x00,0x50,0x00,0xf0,0x80,0xe0,0x80,0xf0,0x03,0x07,0x07,0x06, + 0x01,0x00,0x80,0x40,0xe0,0x40,0x40,0x40,0xe0,0x03,0x07,0x07,0x06,0x01,0x00,0x20, + 0x40,0xe0,0x40,0x40,0x40,0xe0,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xa0,0xe0,0x40, + 0x40,0x40,0xe0,0x03,0x07,0x07,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40,0xe0, + 0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x48,0xe8,0x48,0x48,0x70,0x04,0x07,0x07,0x06, + 0x01,0x00,0x50,0xa0,0x90,0xd0,0xb0,0x90,0x90,0x04,0x07,0x07,0x06,0x01,0x00,0x40, + 0x20,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x60,0x90, + 0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0x60,0x90,0x90,0x90,0x60, + 0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xa0,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07, + 0x06,0x01,0x00,0x50,0x00,0x60,0x90,0x90,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0x50,0x20,0x50,0x88,0x04,0x08,0x08,0x06,0x01,0xff,0x10,0x70,0xb0,0xb0,0xd0, + 0xd0,0xe0,0x80,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x90,0x90,0x90,0x90,0x60, + 0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x90,0x90,0x90,0x90,0x60,0x04,0x07,0x07, + 0x06,0x01,0x00,0x20,0x50,0x90,0x90,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00, + 0x50,0x00,0x90,0x90,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x20,0x88, + 0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0xe0,0x90,0x90,0xe0,0x80, + 0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0xa0,0xa0,0x90,0xa0,0x04,0x07,0x07,0x06, + 0x01,0x00,0x40,0x20,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, + 0x40,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0x00,0x70, + 0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xa0,0x00,0x70,0x90,0x90,0x70, + 0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06, + 0x01,0x00,0x20,0x50,0x20,0x70,0x90,0x90,0x70,0x05,0x04,0x04,0x06,0x00,0x00,0x70, + 0xa8,0xb0,0x78,0x04,0x06,0x06,0x06,0x01,0xfe,0x70,0x80,0x80,0x70,0x20,0x40,0x04, + 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0xb0,0xc0,0x70,0x04,0x07,0x07,0x06, + 0x01,0x00,0x20,0x40,0x00,0x60,0xb0,0xc0,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, + 0x50,0x00,0x60,0xb0,0xc0,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0xb0, + 0xc0,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03, + 0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x07,0x07,0x06, + 0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0xe0,0x03,0x06,0x06,0x06,0x01,0x00,0xa0, + 0x00,0xc0,0x40,0x40,0xe0,0x04,0x07,0x07,0x06,0x01,0x00,0x30,0x60,0x10,0x70,0x90, + 0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xa0,0x00,0xe0,0x90,0x90,0x90,0x04, + 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06, + 0x01,0x00,0x20,0x40,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20, + 0x50,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xa0,0x00,0x60, + 0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0x90,0x90,0x60,0x05, + 0x05,0x05,0x06,0x00,0x00,0x20,0x00,0xf8,0x00,0x20,0x04,0x04,0x04,0x06,0x01,0x00, + 0x70,0xb0,0xd0,0xe0,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x90,0x90,0x90, + 0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0x90,0x90,0x90,0x70,0x04,0x07, + 0x07,0x06,0x01,0x00,0x20,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x06,0x06,0x06,0x01, + 0x00,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x09,0x09,0x06,0x01,0xfe,0x20,0x40,0x00, + 0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x08,0x08,0x06,0x01,0xfe,0x80,0x80,0xe0,0x90, + 0x90,0xe0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0xfe,0x50,0x00,0x90,0x90,0x90,0x70, + 0x90,0x60}; diff --git a/buildroot/share/fonts/marlin-6x9.bdf b/buildroot/share/fonts/marlin-6x9.bdf new file mode 100644 index 0000000000..0b26834710 --- /dev/null +++ b/buildroot/share/fonts/marlin-6x9.bdf @@ -0,0 +1,16606 @@ +STARTFONT 2.1 +FONT -Misc-Fixed-Medium-R-Normal--9-90-75-75-C-60-ISO10646-1 +SIZE 9 75 75 +FONTBOUNDINGBOX 6 9 0 -2 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +STARTPROPERTIES 24 +FONTNAME_REGISTRY "" +FOUNDRY "Misc" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 9 +POINT_SIZE 90 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +COPYRIGHT "Public domain font. Share and enjoy." +_XMBDFED_INFO "Edited with xmbdfed 4.5." +CAP_HEIGHT 6 +X_HEIGHT 4 +WEIGHT 10 +QUAD_WIDTH 6 +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 7 +ENDPROPERTIES +CHARS 1305 +STARTCHAR char0 +ENCODING 0 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +80 +10 +80 +10 +A0 +ENDCHAR +STARTCHAR uni0001 +ENCODING 1 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +C8 +88 +98 +78 +10 +ENDCHAR +STARTCHAR uni0002 +ENCODING 2 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 7 0 0 +BITMAP +C0 +F8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0003 +ENCODING 3 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni0004 +ENCODING 4 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 7 0 0 +BITMAP +20 +70 +F8 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni0005 +ENCODING 5 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +B8 +88 +70 +20 +ENDCHAR +STARTCHAR uni0006 +ENCODING 6 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 6 5 0 0 +BITMAP +B0 +D8 +6C +D8 +B0 +ENDCHAR +STARTCHAR uni0007 +ENCODING 7 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 8 0 -1 +BITMAP +F8 +A8 +88 +88 +88 +88 +A8 +F8 +ENDCHAR +STARTCHAR uni0008 +ENCODING 8 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 9 0 -2 +BITMAP +20 +50 +50 +50 +50 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0009 +ENCODING 9 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 3 3 0 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +F8 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +40 +A8 +48 +10 +20 +48 +54 +08 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +60 +98 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 2 3 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +40 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +80 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +C0 +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +20 +60 +10 +10 +E0 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +10 +10 +E0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +10 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +60 +90 +90 +60 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +C0 +00 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +60 +40 +00 +40 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +90 +A8 +B0 +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +80 +80 +90 +60 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +D0 +B0 +90 +90 +90 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +60 +90 +90 +D0 +B0 +60 +10 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +E0 +90 +90 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +40 +20 +90 +60 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +90 +F0 +60 +60 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 4 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +90 +90 +70 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +80 +80 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +70 +90 +90 +70 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +50 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +20 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +D0 +A8 +A8 +88 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +E0 +90 +90 +90 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +90 +90 +70 +10 +10 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +A0 +D0 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +40 +40 +E0 +40 +50 +20 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +90 +90 +70 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +90 +60 +60 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +60 +60 +90 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +40 +40 +80 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +40 +40 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +20 +70 +A0 +A0 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +30 +48 +40 +F0 +40 +40 +F8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +50 +88 +50 +A8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 2 -1 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +70 +80 +60 +90 +60 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 5 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +60 +A0 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 0 +BITMAP +F0 +10 +10 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 1 1 5 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 2 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 4 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 1 -1 +BITMAP +90 +90 +B0 +D0 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +E8 +E8 +68 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 2 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +C0 +40 +50 +70 +30 +78 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +C0 +40 +50 +68 +08 +10 +38 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C0 +20 +40 +30 +F0 +30 +78 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +20 +60 +80 +90 +60 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +50 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +80 +80 +90 +60 +20 +40 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +00 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +40 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +40 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +90 +D0 +B0 +90 +90 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +00 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +10 +70 +B0 +B0 +D0 +D0 +E0 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +00 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +A0 +A0 +90 +A0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +20 +70 +90 +90 +70 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +A8 +B0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +80 +80 +70 +20 +40 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +30 +60 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +B0 +D0 +E0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +20 +40 +00 +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +80 +80 +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +50 +00 +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +70 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +60 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +50 +88 +F8 +88 +88 +10 +08 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +90 +90 +70 +20 +10 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +70 +80 +80 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +70 +80 +80 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +00 +70 +80 +80 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +70 +80 +80 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +E0 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +50 +10 +70 +90 +90 +70 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +38 +70 +90 +90 +70 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +00 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +40 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +F0 +80 +E0 +80 +80 +F0 +40 +20 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +60 +B0 +C0 +70 +40 +20 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +70 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +20 +50 +00 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +70 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +90 +60 +00 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +70 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +20 +00 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +80 +B0 +90 +60 +20 +40 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +20 +40 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +90 +F0 +90 +90 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +A8 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +70 +50 +50 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +E0 +70 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +70 +20 +20 +20 +70 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +60 +20 +20 +70 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +70 +20 +20 +70 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +60 +20 +20 +70 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +E0 +40 +40 +40 +40 +E0 +40 +20 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +40 +00 +C0 +40 +40 +E0 +40 +20 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +B8 +88 +88 +88 +A8 +90 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +00 +98 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +28 +38 +10 +10 +90 +60 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +20 +50 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +90 +A0 +C0 +A0 +90 +90 +40 +80 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +80 +80 +A0 +C0 +A0 +90 +40 +80 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +B0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +80 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +20 +40 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +C0 +40 +40 +40 +40 +E0 +40 +80 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +40 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +A0 +80 +80 +F0 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +C0 +40 +50 +40 +40 +E0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +40 +60 +C0 +40 +78 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +C0 +40 +60 +C0 +40 +E0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +90 +D0 +B0 +90 +90 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +90 +D0 +B0 +90 +90 +90 +40 +80 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +E0 +90 +90 +90 +40 +80 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +90 +D0 +B0 +90 +90 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +40 +00 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +40 +B0 +28 +28 +28 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +90 +D0 +B0 +90 +90 +90 +10 +20 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +E0 +90 +90 +90 +10 +20 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +70 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +A0 +B0 +A0 +A0 +78 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +A8 +B0 +58 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +E0 +90 +E0 +A0 +90 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +A0 +D0 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +E0 +90 +90 +E0 +90 +90 +40 +80 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +A0 +D0 +80 +80 +40 +80 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +40 +E0 +90 +E0 +A0 +90 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +40 +00 +A0 +D0 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +40 +20 +90 +60 +20 +40 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +C0 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +40 +40 +E0 +40 +50 +20 +20 +40 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +40 +E0 +40 +50 +20 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +70 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +40 +40 +E0 +E0 +50 +20 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +90 +90 +90 +60 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +00 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +60 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +00 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +90 +90 +90 +90 +90 +60 +40 +20 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +90 +90 +90 +70 +40 +20 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +00 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +00 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +00 +88 +50 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +20 +50 +00 +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +F0 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +F0 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +00 +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +F0 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +50 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +10 +F0 +90 +60 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +20 +50 +40 +E0 +40 +40 +40 +80 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +64 +94 +98 +90 +90 +60 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 1 0 +BITMAP +68 +90 +90 +60 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +A8 +A8 +B0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 1 0 +BITMAP +A8 +B0 +A0 +60 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +F0 +40 +80 +F0 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +F0 +40 +F0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +70 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +50 +20 +00 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +40 +A0 +40 +A0 +E0 +A0 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +50 +70 +90 +90 +70 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +78 +A0 +F0 +A0 +B8 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +70 +A8 +B0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +70 +B0 +D0 +D0 +E0 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +70 +B0 +D0 +E0 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +40 +20 +90 +60 +20 +40 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +C0 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +40 +40 +E0 +40 +50 +20 +20 +40 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +D0 +30 +E0 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +E0 +30 +D0 +60 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 5 +BITMAP +E0 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 5 +BITMAP +90 +60 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 5 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 4 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 5 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +48 +90 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 1 5 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 5 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 5 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 6 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +A0 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 4 +BITMAP +C0 +20 +40 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 4 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 2 2 5 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +90 +48 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +A8 +70 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 5 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +C0 +00 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 2 2 5 +BITMAP +80 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +20 +A8 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B0 +48 +48 +78 +48 +48 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 2 +BITMAP +80 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B8 +20 +30 +20 +20 +38 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +A8 +28 +38 +28 +28 +28 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B8 +10 +10 +10 +10 +38 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B0 +48 +48 +48 +48 +30 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +A8 +28 +28 +10 +10 +10 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B0 +48 +48 +48 +30 +78 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +00 +20 +20 +20 +10 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +D0 +B0 +90 +90 +90 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +60 +00 +00 +F0 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +90 +90 +90 +90 +90 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +80 +00 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +00 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +90 +90 +70 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +80 +70 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +20 +40 +40 +30 +08 +30 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +80 +80 +A0 +40 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +A0 +C0 +B0 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +08 +68 +98 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +88 +50 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +40 +70 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +50 +50 +50 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +88 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +78 +90 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +40 +50 +20 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +90 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +88 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +A0 +00 +40 +40 +50 +20 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +00 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +90 +90 +F0 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +38 +D0 +50 +20 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +90 +A8 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D0 +28 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +00 +90 +A8 +40 +40 +40 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +88 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +20 +00 +88 +48 +70 +88 +08 +30 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +08 +70 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +F0 +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +88 +98 +A8 +C8 +08 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +40 +80 +F8 +08 +10 +20 +20 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +98 +A8 +A8 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +10 +30 +48 +18 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +A8 +A8 +A8 +A8 +78 +08 +F0 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +A8 +A8 +78 +08 +F0 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +48 +A8 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +50 +90 +70 +10 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +B0 +C8 +88 +08 +F0 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +48 +08 +F0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +08 +70 +80 +78 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +70 +80 +78 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +A8 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +50 +70 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +70 +80 +F0 +88 +70 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +70 +80 +D8 +70 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +20 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +30 +20 +F8 +A0 +20 +60 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +48 +70 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +88 +80 +78 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +E0 +80 +70 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +00 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +30 +28 +28 +28 +08 +10 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +E0 +80 +88 +70 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +40 +20 +90 +60 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +30 +28 +28 +28 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +30 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +80 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +30 +50 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +30 +08 +88 +70 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +B0 +D0 +90 +90 +90 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +90 +B0 +D0 +90 +90 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +80 +80 +90 +60 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +90 +90 +90 +90 +F8 +08 +10 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +F8 +08 +10 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +E8 +98 +98 +E8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +38 +08 +88 +70 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +90 +A8 +E8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +70 +90 +90 +70 +90 +90 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +90 +90 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +60 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +C0 +A0 +D0 +E0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +30 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +60 +90 +E0 +70 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +70 +70 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +50 +30 +E0 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +98 +A8 +C8 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +C8 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +A0 +E0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +38 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +D8 +A8 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +88 +80 +78 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +60 +60 +90 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +90 +90 +90 +F8 +08 +10 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +88 +78 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +A8 +A8 +A8 +F8 +08 +10 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +C0 +70 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +E8 +98 +E8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +E0 +50 +30 +E0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +90 +E8 +E8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +70 +90 +70 +90 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +60 +90 +E0 +70 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +A0 +00 +60 +90 +E0 +70 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +40 +E0 +40 +70 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +A0 +C0 +70 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +60 +B0 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A0 +F0 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +90 +A0 +E0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +C8 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +48 +30 +00 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +40 +E0 +70 +48 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +A8 +D8 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +90 +B0 +E0 +40 +40 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +80 +B0 +60 +40 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +10 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +78 +40 +E0 +40 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +A8 +70 +70 +A8 +04 +04 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +90 +A0 +C0 +A0 +90 +90 +08 +08 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +90 +A0 +E0 +90 +08 +08 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +F8 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +50 +F8 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +50 +20 +20 +50 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +90 +60 +60 +90 +08 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +10 +F0 +90 +60 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +E0 +30 +D0 +60 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +F0 +90 +60 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +00 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +90 +48 +B0 +88 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F0 +10 +10 +F8 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +80 +40 +60 +A0 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +10 +10 +10 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +08 +88 +88 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 4 2 0 +BITMAP +C0 +40 +40 +40 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +20 +10 +10 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +48 +48 +48 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +98 +A8 +88 +F8 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F8 +08 +10 +60 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +48 +48 +78 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +90 +A8 +48 +98 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +30 +10 +10 +F0 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +50 +50 +60 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +D8 +48 +50 +E0 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F8 +48 +48 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +48 +08 +F0 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +90 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +90 +48 +30 +F8 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F8 +08 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F0 +08 +08 +08 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +48 +48 +C8 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +D8 +48 +48 +48 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +D8 +48 +08 +08 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +48 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +E0 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +10 +10 +70 +90 +90 +70 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +F0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +20 +50 +E0 +40 +40 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +D8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +00 +D0 +A8 +A8 +88 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +E0 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +40 +00 +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +00 +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +40 +E0 +40 +50 +20 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +88 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +00 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +88 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +00 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +40 +20 +00 +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 2 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 1 2 2 +BITMAP +C0 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +40 +A8 +48 +10 +20 +68 +D4 +28 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +48 +48 +90 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +A0 +A0 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 5 +BITMAP +FC +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +00 +C0 +40 +E0 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +A0 +E0 +20 +20 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 1 1 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +A0 +A0 +E0 +20 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 -1 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 2 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +80 +E8 +B0 +A0 +A0 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +30 +48 +E0 +40 +E0 +40 +F8 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +50 +F8 +50 +60 +40 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +10 +38 +70 +90 +90 +70 +00 +F0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +40 +F0 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +50 +48 +48 +E8 +D0 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +40 +F8 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +10 +F8 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 9 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 6 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +68 +98 +38 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A0 +A0 +A8 +70 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +80 +40 +10 +28 +10 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +50 +50 +60 +40 +B0 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C8 +E8 +E8 +D8 +D8 +C8 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +90 +D0 +D0 +B8 +B4 +98 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +A8 +A8 +70 +18 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +A8 +A8 +B0 +A8 +A8 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +FC +5C +54 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +28 +50 +50 +A0 +F8 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +F8 +C0 +70 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +C0 +40 +50 +68 +10 +28 +10 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C0 +20 +40 +30 +E8 +10 +28 +10 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +E0 +80 +C0 +30 +E8 +10 +28 +10 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +E0 +20 +40 +50 +68 +10 +28 +10 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +48 +F8 +48 +20 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +70 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +90 +F8 +90 +20 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +78 +80 +78 +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +F0 +08 +F0 +20 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +78 +84 +78 +30 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +D8 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +F8 +88 +50 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +40 +A0 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +70 +10 +10 +F0 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +F0 +50 +70 +50 +50 +F0 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +98 +A8 +A8 +C8 +F0 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +F0 +80 +70 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +20 +70 +A0 +F0 +A0 +70 +20 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +F0 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +40 +E0 +50 +F0 +50 +E0 +40 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +50 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +40 +20 +20 +40 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +0C +08 +08 +08 +10 +D0 +30 +30 +10 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +50 +A0 +A0 +50 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +50 +20 +50 +90 +F8 +10 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +40 +60 +C0 +40 +40 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +58 +70 +D0 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +20 +50 +50 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +50 +50 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +28 +20 +70 +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 4 2 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +90 +00 +00 +90 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +00 +E0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +20 +00 +50 +A0 +00 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 1 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 1 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +50 +A0 +00 +F0 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +50 +A0 +00 +F0 +00 +F0 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +A8 +50 +A8 +10 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +10 +50 +A8 +70 +A8 +50 +40 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +10 +20 +00 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +18 +60 +80 +60 +98 +60 +18 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +C0 +30 +08 +30 +C8 +30 +C0 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +70 +80 +80 +70 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +E0 +10 +10 +E0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +70 +A0 +A0 +70 +20 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +40 +E0 +50 +50 +E0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +70 +80 +80 +70 +00 +F0 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +10 +10 +E0 +00 +F0 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +20 +70 +A0 +A0 +70 +20 +F0 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +E0 +50 +50 +E0 +40 +F0 +40 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +70 +80 +80 +70 +20 +F0 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +E0 +10 +10 +E0 +20 +F0 +40 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +E0 +80 +E0 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 2 +BITMAP +80 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 2 -1 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +A8 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +08 +00 +00 +20 +00 +00 +80 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +80 +00 +00 +20 +00 +00 +08 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 0 +BITMAP +F0 +80 +80 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 3 -2 +BITMAP +40 +A0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 4 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 0 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +A0 +E0 +A0 +00 +38 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +80 +80 +80 +C0 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +A0 +A0 +40 +40 +38 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +80 +C0 +80 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +60 +80 +60 +00 +30 +28 +30 +28 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +D0 +B0 +90 +20 +20 +20 +38 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 9 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 9 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 -2 +BITMAP +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 2 +BITMAP +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 3 -2 +BITMAP +80 +80 +80 +80 +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +10 +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +10 +10 +10 +10 +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +10 +10 +10 +10 +FC +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 8 3 -1 +BITMAP +80 +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 8 2 -1 +BITMAP +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 2 -2 +BITMAP +F0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +80 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +F8 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F8 +08 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 3 1 +BITMAP +80 +80 +80 +E0 +80 +E0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 2 2 +BITMAP +A0 +A0 +A0 +A0 +F0 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 2 1 +BITMAP +A0 +A0 +A0 +B0 +80 +F0 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 0 1 +BITMAP +10 +10 +10 +F0 +10 +F0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +28 +28 +E8 +08 +F8 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 3 -2 +BITMAP +80 +80 +80 +E0 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 2 -2 +BITMAP +A0 +A0 +A0 +A0 +B0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 2 -2 +BITMAP +A0 +A0 +A0 +B0 +80 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +F0 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +28 +28 +28 +28 +E8 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +28 +28 +28 +E8 +08 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +00 +FC +10 +10 +10 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +00 +EC +28 +28 +28 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +10 +10 +10 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +28 +28 +28 +28 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +28 +28 +28 +EC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +10 +10 +10 +FC +10 +FC +10 +10 +10 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +28 +28 +28 +28 +FC +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +28 +28 +28 +EC +00 +EC +28 +28 +28 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 -2 +BITMAP +20 +40 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +C0 +20 +10 +10 +10 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 2 +BITMAP +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +04 +04 +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +80 +80 +40 +20 +20 +10 +08 +08 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +84 +84 +48 +30 +30 +30 +48 +48 +84 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 9 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 9 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 9 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 9 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 0 3 +BITMAP +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 3 3 +BITMAP +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +1C +1C +1C +1C +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +78 +F8 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +78 +88 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +40 +40 +E0 +E0 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +40 +40 +A0 +E0 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +F0 +F8 +F0 +C0 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +C0 +F0 +C0 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +C0 +B0 +C0 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +E0 +F8 +E0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +E0 +98 +E0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +E0 +E0 +40 +40 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +E0 +A0 +40 +40 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +18 +78 +F8 +78 +18 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +30 +F0 +30 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +30 +D0 +30 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +F8 +38 +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +C8 +38 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +CC +84 +84 +CC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +CC +B4 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +78 +84 +CC +84 +B4 +CC +84 +78 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +78 +84 +CC +84 +CC +B4 +84 +78 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +78 +FC +B4 +FC +B4 +CC +FC +78 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +70 +88 +88 +70 +20 +F8 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +88 +70 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +F8 +20 +70 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +1C +0C +14 +70 +88 +88 +70 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +A8 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +20 +70 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +28 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +58 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +40 +40 +80 +80 +80 +40 +40 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +80 +80 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 1 5 +BITMAP +80 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 1 3 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 1 1 +BITMAP +80 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 1 1 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 1 1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 1 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 3 5 +BITMAP +80 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 5 +BITMAP +A0 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +20 +00 +80 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +A0 +00 +80 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 3 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +80 +00 +20 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +A0 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +80 +00 +A0 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +20 +00 +80 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +A0 +00 +80 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 3 3 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +A0 +00 +20 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +20 +00 +A0 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +A0 +00 +A0 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 3 1 +BITMAP +80 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +80 +00 +20 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 1 +BITMAP +A0 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +80 +00 +A0 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 3 1 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 3 1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +A0 +00 +20 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +20 +00 +A0 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +A0 +00 +A0 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 3 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 1 -1 +BITMAP +80 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 1 -1 +BITMAP +80 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 1 -1 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 1 -1 +BITMAP +80 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 1 -1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 1 -1 +BITMAP +80 +00 +00 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 1 -1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 1 -1 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +20 +00 +80 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +A0 +00 +80 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 3 -1 +BITMAP +80 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +80 +00 +20 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 3 -1 +BITMAP +80 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 3 -1 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 3 -1 +BITMAP +80 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 3 -1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +A0 +00 +20 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 3 -1 +BITMAP +80 +00 +00 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 3 -1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 3 -1 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 -1 +BITMAP +A0 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +80 +00 +A0 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +50 +40 +F0 +50 +50 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +30 +50 +50 +F0 +50 +50 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +D8 +A8 +E8 +D8 +D8 +F8 +D8 +70 +ENDCHAR +ENDFONT From fadee1b46b59364bede10aba99da0e0d3727f86d Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Wed, 7 Oct 2020 20:01:01 +0200 Subject: [PATCH 0357/1370] More accessible PROBE_OFFSET_WIZARD (#19647) --- Marlin/src/lcd/menu/menu_advanced.cpp | 5 +++++ Marlin/src/lcd/menu/menu_bed_leveling.cpp | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 5bca89141f..c0a72bbe6c 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -486,6 +486,11 @@ void menu_backlash(); EDIT_ITEM(float31sign, MSG_ZPROBE_YOFFSET, &probe.offset.y, -(Y_BED_SIZE), Y_BED_SIZE); #endif EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); + + #if ENABLED(PROBE_OFFSET_WIZARD) + SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); + #endif + END_MENU(); } #endif diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 8bc4f92131..e19b04ccb5 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -283,10 +283,6 @@ void menu_bed_leveling() { EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); #endif - #if ENABLED(PROBE_OFFSET_WIZARD) - SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); - #endif - #if ENABLED(LEVEL_BED_CORNERS) SUBMENU(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); #endif From cd839a251f5f283ca0e7c1a9fb155beb43d53965 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Thu, 8 Oct 2020 03:43:08 +0200 Subject: [PATCH 0358/1370] Update PROBE_OFFSET_WIZARD comment (#19652) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 3d3e55b92e..8cc71ceb86 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1075,7 +1075,7 @@ #if HAS_LCD_MENU - // Add Probe Z Offset calibration to the Bed Leveling menu + // Add Probe Z Offset calibration to the Z Probe Offsets menu #if HAS_BED_PROBE //#define PROBE_OFFSET_WIZARD #if ENABLED(PROBE_OFFSET_WIZARD) From e6de60d04ea3ee7c1cb29b8d6e698e9c763ed196 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 8 Oct 2020 20:30:31 +1300 Subject: [PATCH 0359/1370] Apply env:mega2560ext to relevant boards (#19624) --- Marlin/src/pins/pins.h | 8 ++++---- platformio.ini | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 3ec4e1a34b..4aff336d9c 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -148,7 +148,7 @@ #elif MB(AZTEEG_X3_PRO) #include "ramps/pins_AZTEEG_X3_PRO.h" // ATmega2560 env:mega2560 #elif MB(ULTIMAIN_2) - #include "ramps/pins_ULTIMAIN_2.h" // ATmega2560 env:mega2560 + #include "ramps/pins_ULTIMAIN_2.h" // ATmega2560 env:mega2560ext #elif MB(FORMBOT_RAPTOR) #include "ramps/pins_FORMBOT_RAPTOR.h" // ATmega2560 env:mega2560 #elif MB(FORMBOT_RAPTOR2) @@ -164,7 +164,7 @@ #elif MB(RL200) #include "ramps/pins_RL200.h" // ATmega2560 env:mega2560 #elif MB(BQ_ZUM_MEGA_3D) - #include "ramps/pins_BQ_ZUM_MEGA_3D.h" // ATmega2560 env:mega2560 + #include "ramps/pins_BQ_ZUM_MEGA_3D.h" // ATmega2560 env:mega2560ext #elif MB(MAKEBOARD_MINI) #include "ramps/pins_MAKEBOARD_MINI.h" // ATmega2560 env:mega2560 #elif MB(TRIGORILLA_13) @@ -232,7 +232,7 @@ #elif MB(CNCONTROLS_15) #include "mega/pins_CNCONTROLS_15.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(MIGHTYBOARD_REVE) - #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext #elif MB(CHEAPTRONIC) #include "mega/pins_CHEAPTRONIC.h" // ATmega2560 env:mega2560 #elif MB(CHEAPTRONIC_V2) @@ -260,7 +260,7 @@ #elif MB(GT2560_V3_A20) #include "mega/pins_GT2560_V3_A20.h" // ATmega2560 env:mega2560 #elif MB(EINSTART_S) - #include "mega/pins_EINSTART-S.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_EINSTART-S.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext #elif MB(WANHAO_ONEPLUS) #include "mega/pins_WANHAO_ONEPLUS.h" // ATmega2560 env:mega2560 #elif MB(OVERLORD) diff --git a/platformio.ini b/platformio.ini index 1f2586e26b..ac7d9804d8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -412,6 +412,10 @@ board = megaatmega2560 # # ATmega2560 with extended pins 70-85 defined +# BOARD_BQ_ZUM_MEGA_3D +# BOARD_ULTIMAIN_2 +# BOARD_MIGHTYBOARD_REVE +# BOARD_EINSTART_S # [env:mega2560ext] platform = atmelavr From 3516c3f936367b875b8e5829024769f5bbf10737 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 8 Oct 2020 15:17:19 -0500 Subject: [PATCH 0360/1370] Use 0xFF (not 'ff') for byte transfer --- Marlin/src/HAL/STM32F1/HAL_SPI.cpp | 4 ++-- Marlin/src/libs/W25Qxx.cpp | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp index 550a79deae..76b1c3e246 100644 --- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp @@ -110,7 +110,7 @@ void spiInit(uint8_t spiRate) { * @details */ uint8_t spiRec() { - uint8_t returnByte = SPI.transfer(ff); + uint8_t returnByte = SPI.transfer(0xFF); return returnByte; } @@ -154,7 +154,7 @@ void spiSendBlock(uint8_t token, const uint8_t* buf) { #if ENABLED(SPI_EEPROM) // Read single byte from specified SPI channel -uint8_t spiRec(uint32_t chan) { return SPI.transfer(ff); } +uint8_t spiRec(uint32_t chan) { return SPI.transfer(0xFF); } // Write single byte to specified SPI channel void spiSend(uint32_t chan, byte b) { SPI.send(b); } diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index 9abe45fbaf..03e002f66f 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -80,16 +80,14 @@ void W25QXXFlash::init(uint8_t spiRate) { * @brief Receive a single byte from the SPI port. * * @return Byte received - * - * @details */ uint8_t W25QXXFlash::spi_flash_Rec() { - uint8_t returnByte = SPI.transfer(ff); + const uint8_t returnByte = SPI.transfer(0xFF); return returnByte; } uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { - uint8_t returnByte = SPI.transfer(data); + const uint8_t returnByte = SPI.transfer(data); return returnByte; } From fde169d3ef05488dc64381ecc0305a58133cc611 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 8 Oct 2020 16:59:54 -0500 Subject: [PATCH 0361/1370] Permit touch calibration override --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 16 +++- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 38 ++++---- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 40 +++++---- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 58 ++++++------- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 20 +++-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 87 ++++++++----------- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 50 +++++------ 7 files changed, 151 insertions(+), 158 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 6f9f4bcf63..08ab5c1f4c 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -303,10 +303,18 @@ // Emulated DOGM have xpt calibration values independent of display resolution #if ENABLED(SPI_GRAPHICAL_TFT) - #define XPT2046_X_CALIBRATION -11245 - #define XPT2046_Y_CALIBRATION 8629 - #define XPT2046_X_OFFSET 685 - #define XPT2046_Y_OFFSET -285 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11245 + #endif + #ifdef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8629 + #endif + #ifdef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 685 + #endif + #ifdef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -285 + #endif #endif #elif IS_TFTGLCD_PANEL diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 10c615e524..5d81d1eca9 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -105,8 +105,10 @@ #define FIL_RUNOUT_PIN PA15 // SPI Flash -#define SPI_FLASH_SIZE 0x200000 // 2MB #define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x200000 // 2MB +#endif // SPI 2 #define W25QXX_CS_PIN PB12 @@ -146,38 +148,36 @@ #endif #if HAS_TFT_LVGL_UI - // LVGL - #define HAS_SPI_FLASH_FONT 1 #define HAS_GCODE_PREVIEW 1 #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 #define HAS_LANG_SELECT_SCREEN 1 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - - #define XPT2046_X_CALIBRATION -17181 - #define XPT2046_Y_CALIBRATION 11434 - #define XPT2046_X_OFFSET 501 - #define XPT2046_Y_OFFSET -9 - #elif ENABLED(TFT_480x320) - // Color UI - #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 - - #define XPT2046_X_CALIBRATION -17181 - #define XPT2046_Y_CALIBRATION 11434 - #define XPT2046_X_OFFSET 501 - #define XPT2046_Y_OFFSET -9 - #elif ENABLED(FSMC_GRAPHICAL_TFT) - // Emulated DOGM - #define GRAPHICAL_TFT_UPSCALE 3 +#endif + +#if EITHER(HAS_TFT_LVGL_UI, TFT_480x320) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17181 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11434 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 501 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -9 + #endif +#elif ENABLED(FSMC_GRAPHICAL_TFT) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12316 #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index f8f3225f3c..e6c9b33a5a 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -120,8 +120,10 @@ #endif // SPI Flash -#define SPI_FLASH_SIZE 0x200000 // 2MB #define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x200000 // 2MB +#endif // SPI 2 #define W25QXX_CS_PIN PB12 @@ -158,36 +160,37 @@ #endif -// LVGL Configs #if HAS_TFT_LVGL_UI - + // LVGL #define HAS_SPI_FLASH_FONT 1 #define HAS_GCODE_PREVIEW 1 #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 #define HAS_LANG_SELECT_SCREEN 1 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - - #define XPT2046_X_CALIBRATION -17181 - #define XPT2046_Y_CALIBRATION 11434 - #define XPT2046_X_OFFSET 501 - #define XPT2046_Y_OFFSET -9 - -// Color UI Configs #elif ENABLED(TFT_480x320) - + // Color UI #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 - - #define XPT2046_X_CALIBRATION -17181 - #define XPT2046_Y_CALIBRATION 11434 - #define XPT2046_X_OFFSET 501 - #define XPT2046_Y_OFFSET -9 - -// Emulated DOGM #elif ENABLED(FSMC_GRAPHICAL_TFT) + // Emulated DOGM #define GRAPHICAL_TFT_UPSCALE 3 +#endif +#if EITHER(HAS_TFT_LVGL_UI, TFT_480x320) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17181 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11434 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 501 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -9 + #endif +#elif ENABLED(FSMC_GRAPHICAL_TFT) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12316 #endif @@ -200,7 +203,6 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -20 #endif - #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index a530c89d2c..d9ba4e3c40 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -269,32 +269,8 @@ #endif -#if ENABLED(TFT_LVGL_UI_SPI) - - // LVGL - - #define XPT2046_X_CALIBRATION -17253 - #define XPT2046_Y_CALIBRATION 11579 - #define XPT2046_X_OFFSET 514 - #define XPT2046_Y_OFFSET -24 - -#elif ENABLED(SPI_GRAPHICAL_TFT) - +#if ENABLED(SPI_GRAPHICAL_TFT) // Emulated DOGM SPI - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11386 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8684 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 339 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -18 - #endif - #ifndef GRAPHICAL_TFT_UPSCALE #define GRAPHICAL_TFT_UPSCALE 3 #endif @@ -310,14 +286,36 @@ #define LCD_PINS_RS PC6 #elif ENABLED(TFT_480x320_SPI) + #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 +#endif + +#if EITHER(HAS_TFT_LVGL_UI, TFT_480x320_SPI) + #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17253 + #endif + #ifndef XPT2046_Y_CALIBRATION #define XPT2046_Y_CALIBRATION 11579 + #endif + #ifndef XPT2046_X_OFFSET #define XPT2046_X_OFFSET 514 + #endif + #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -24 - - #define TFT_DRIVER ST7796 - #define TFT_BUFFER_SIZE 14400 - + #endif +#elif ENABLED(SPI_GRAPHICAL_TFT) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11386 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8684 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 339 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -18 + #endif #endif #if HAS_WIRED_LCD && !HAS_SPI_TFT @@ -364,8 +362,8 @@ #endif // HAS_WIRED_LCD && !HAS_SPI_TFT #define HAS_SPI_FLASH 1 -#define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x1000000 // 16MB #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index b159ae3f4c..2b099b3e93 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -139,10 +139,20 @@ * If the screen stays white, disable 'LCD_RESET_PIN' * to let the bootloader init the screen. */ - #define XPT2046_X_CALIBRATION 12033 - #define XPT2046_Y_CALIBRATION -9047 - #define XPT2046_X_OFFSET -30 - #define XPT2046_Y_OFFSET 254 +#if ENABLED(TOUCH_SCREEN) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 12033 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -9047 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -30 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 254 + #endif +#endif #if ENABLED(FSMC_GRAPHICAL_TFT) @@ -191,8 +201,8 @@ #endif #define HAS_SPI_FLASH 1 -#define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x1000000 // 16MB #define W25QXX_CS_PIN PB12 // Flash chip-select #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index e705b7b570..35909ed430 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -195,25 +195,8 @@ #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 #endif -// LVGL Configs -#if ENABLED(TFT_LVGL_UI_FSMC) - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 17880 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -12234 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -45 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 349 - #endif - -// Emulated DOGM Configs -#elif ENABLED(FSMC_GRAPHICAL_TFT) - +#if ENABLED(FSMC_GRAPHICAL_TFT) + // Emulated DOGM #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h #define DOGLCD_SCK -1 @@ -233,19 +216,6 @@ #define TFT_PIXEL_OFFSET_Y 32 #endif - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 12149 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -8746 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -35 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 256 - #endif - #elif ENABLED(TFT_320x240) // TFT32/28 #define TFT_RESET_PIN PC6 #define TFT_BACKLIGHT_PIN PD13 @@ -256,19 +226,6 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12246 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 9453 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 360 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -22 - #endif - #define TOUCH_CS_PIN PA7 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK #define TOUCH_MISO_PIN PB14 // SPI2_MISO @@ -285,6 +242,12 @@ #define ILI9341_COLOR_RGB #elif ENABLED(TFT_480x320) + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 + #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV +#endif + +#if EITHER(TFT_LVGL_UI_FSMC, TFT_480x320) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION 17880 #endif @@ -295,17 +258,39 @@ #define XPT2046_X_OFFSET -45 #endif #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 349 + #define XPT2046_Y_OFFSET 349 + #endif +#elif ENABLED(FSMC_GRAPHICAL_TFT) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 12149 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -8746 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -35 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 256 + #endif +#elif ENABLED(TFT_320x240) // TFT32/28 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12246 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 9453 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 360 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -22 #endif - - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 - #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV #endif #define HAS_SPI_FLASH 1 -#define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x1000000 // 16MB #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 4e782649d3..b40c66496a 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -281,32 +281,8 @@ #endif -#if ENABLED(TFT_LVGL_UI_SPI) - - // LVGL - - #define XPT2046_X_CALIBRATION -17253 - #define XPT2046_Y_CALIBRATION 11579 - #define XPT2046_X_OFFSET 514 - #define XPT2046_Y_OFFSET -24 - -#elif ENABLED(SPI_GRAPHICAL_TFT) - +#if ENABLED(SPI_GRAPHICAL_TFT) // Emulated DOGM SPI - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11386 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8684 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 339 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -18 - #endif - #ifndef GRAPHICAL_TFT_UPSCALE #define GRAPHICAL_TFT_UPSCALE 3 #endif @@ -322,6 +298,11 @@ #define LCD_PINS_RS PC6 #elif ENABLED(TFT_480x320_SPI) + #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 +#endif + +#if EITHER(TFT_LVGL_UI_SPI, TFT_480x320_SPI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17253 #endif @@ -334,10 +315,19 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -24 #endif - - #define TFT_DRIVER ST7796 - #define TFT_BUFFER_SIZE 14400 - +#elif ENABLED(SPI_GRAPHICAL_TFT) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11386 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8684 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 339 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -18 + #endif #endif #if HAS_WIRED_LCD && !HAS_SPI_TFT @@ -393,8 +383,8 @@ #endif // HAS_WIRED_LCD && !HAS_SPI_TFT #define HAS_SPI_FLASH 1 -#define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x1000000 // 16MB #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 From 5441ee5a7a9882bff66d1ceeceaebb72b5100733 Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Fri, 9 Oct 2020 01:40:54 +0200 Subject: [PATCH 0362/1370] Fix and improve Makefile / CMake (#19640) --- Marlin/Makefile | 167 +++++++++++++++++++++------ buildroot/share/cmake/CMakeLists.txt | 8 +- 2 files changed, 133 insertions(+), 42 deletions(-) diff --git a/Marlin/Makefile b/Marlin/Makefile index 68dd05bdfb..91c8889c69 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -22,8 +22,10 @@ # (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file # changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*). # -# 3. Set the line containing "MCU" to match your board's processor. -# Older one's are atmega8 based, newer ones like Arduino Mini, Bluetooth +# 3. Set the line containing "MCU" to match your board's processor. Set +# "PROG_MCU" as the AVR part name corresponding to "MCU". You can use the +# following command to get a list of correspondences: `avrdude -c alf -p x` +# Older boards are atmega8 based, newer ones like Arduino Mini, Bluetooth # or Diecimila have the atmega168. If you're using a LilyPad Arduino, # change F_CPU to 8000000. If you are using Gen7 electronics, you # probably need to use 20000000. Either way, you must regenerate @@ -34,18 +36,18 @@ # 5. Type "make upload", reset your Arduino board, and press enter to # upload your program to the Arduino board. # -# Note that all settings at the top of this file can be overriden from +# Note that all settings at the top of this file can be overridden from # the command line with, for example, "make HARDWARE_MOTHERBOARD=71" # # To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use... # # make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \ -# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino +# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino # # To compile and upload simply add "upload" to the end of the line... # # make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \ -# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino upload +# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino upload # # If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or # start upload manually (using stk500) like so: @@ -57,7 +59,26 @@ # # This defines the board to compile for (see boards.h for your board's ID) -HARDWARE_MOTHERBOARD ?= 11 +HARDWARE_MOTHERBOARD ?= 1020 + +ifeq ($(OS),Windows_NT) + # Windows + ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino + ARDUINO_USER_DIR ?= ${HOME}/Arduino +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Linux) + # Linux + ARDUINO_INSTALL_DIR ?= /usr/share/arduino + ARDUINO_USER_DIR ?= ${HOME}/Arduino + endif + ifeq ($(UNAME_S),Darwin) + # Darwin (macOS) + ARDUINO_INSTALL_DIR ?= /Applications/Arduino.app/Contents/Java + ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino + AVR_TOOLS_PATH ?= /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/ + endif +endif # Arduino source install directory, and version number # On most linuxes this will be /usr/share/arduino @@ -67,32 +88,38 @@ ARDUINO_VERSION ?= 106 # The installed Libraries are in the User folder ARDUINO_USER_DIR ?= ${HOME}/Arduino -# You can optionally set a path to the avr-gcc tools. Requires a trailing slash. (ex: /usr/local/avr-gcc/bin) +# You can optionally set a path to the avr-gcc tools. +# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/ AVR_TOOLS_PATH ?= -#Programmer configuration +# Programmer configuration UPLOAD_RATE ?= 57600 AVRDUDE_PROGRAMMER ?= arduino -# on most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1 +# On most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1 UPLOAD_PORT ?= /dev/ttyUSB0 -#Directory used to build files in, contains all the build files, from object files to the final hex file -#on linux it is best to put an absolute path like /home/username/tmp . +# Directory used to build files in, contains all the build files, from object +# files to the final hex file on linux it is best to put an absolute path +# like /home/username/tmp . BUILD_DIR ?= applet # This defines whether Liquid_TWI2 support will be built LIQUID_TWI2 ?= 0 -# this defines if Wire is needed +# This defines if Wire is needed WIRE ?= 0 -# this defines if U8GLIB is needed (may require RELOC_WORKAROUND) -U8GLIB ?= 1 +# This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h) +# Disabling this (and SPEAKER) saves approximatively 350 bytes of memory. +TONE ?= 1 -# this defines whether to include the Trinamic TMCStepper library -TMC ?= 1 +# This defines if U8GLIB is needed (may require RELOC_WORKAROUND) +U8GLIB ?= 0 -# this defines whether to include the AdaFruit NeoPixel library +# This defines whether to include the Trinamic TMCStepper library +TMC ?= 0 + +# This defines whether to include the AdaFruit NeoPixel library NEOPIXEL ?= 0 ############ @@ -208,7 +235,8 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1119) else ifeq ($(HARDWARE_MOTHERBOARD),1120) # Ultimaker (Older electronics. Pre 1.5.4. This is rare) else ifeq ($(HARDWARE_MOTHERBOARD),1121) - MCU ?= atmega1280 + MCU ?= atmega1280 + PROG_MCU ?= m1280 # Azteeg X3 else ifeq ($(HARDWARE_MOTHERBOARD),1122) @@ -350,9 +378,11 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1320) # Minitronics v1.0/1.1 else ifeq ($(HARDWARE_MOTHERBOARD),1400) MCU ?= atmega1281 + PROG_MCU ?= m1281 # Silvergate v1.0 else ifeq ($(HARDWARE_MOTHERBOARD),1401) MCU ?= atmega1281 + PROG_MCU ?= m1281 # # Sanguinololu and Derivatives - ATmega644P, ATmega1284P @@ -362,46 +392,57 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1401) else ifeq ($(HARDWARE_MOTHERBOARD),1500) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega644p + PROG_MCU ?= m644p # Sanguinololu 1.2 and above else ifeq ($(HARDWARE_MOTHERBOARD),1501) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega644p + PROG_MCU ?= m644p # Melzi else ifeq ($(HARDWARE_MOTHERBOARD),1502) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega644p + PROG_MCU ?= m644p # Melzi V2.0 else ifeq ($(HARDWARE_MOTHERBOARD),1503) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p + PROG_MCU ?= m1284p # Melzi with ATmega1284 (MaKr3d version) else ifeq ($(HARDWARE_MOTHERBOARD),1504) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p + PROG_MCU ?= m1284p # Melzi Creality3D board (for CR-10 etc) else ifeq ($(HARDWARE_MOTHERBOARD),1505) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p + PROG_MCU ?= m1284p # Melzi Malyan M150 board else ifeq ($(HARDWARE_MOTHERBOARD),1506) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p + PROG_MCU ?= m1284p # Tronxy X5S else ifeq ($(HARDWARE_MOTHERBOARD),1507) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p + PROG_MCU ?= m1284p # STB V1.1 else ifeq ($(HARDWARE_MOTHERBOARD),1508) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p + PROG_MCU ?= m1284p # Azteeg X1 else ifeq ($(HARDWARE_MOTHERBOARD),1509) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p + PROG_MCU ?= m1284p # Anet 1.0 (Melzi clone) else ifeq ($(HARDWARE_MOTHERBOARD),1510) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p + PROG_MCU ?= m1284p # # Other ATmega644P, ATmega644, ATmega1284P @@ -411,50 +452,61 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1510) else ifeq ($(HARDWARE_MOTHERBOARD),1600) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega644p + PROG_MCU ?= m644p # Gen3+ else ifeq ($(HARDWARE_MOTHERBOARD),1601) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega644p + PROG_MCU ?= m644p # Gen6 else ifeq ($(HARDWARE_MOTHERBOARD),1602) HARDWARE_VARIANT ?= Gen6 MCU ?= atmega644p + PROG_MCU ?= m644p # Gen6 deluxe else ifeq ($(HARDWARE_MOTHERBOARD),1603) HARDWARE_VARIANT ?= Gen6 MCU ?= atmega644p + PROG_MCU ?= m644p # Gen7 custom (Alfons3 Version) else ifeq ($(HARDWARE_MOTHERBOARD),1604) HARDWARE_VARIANT ?= Gen7 MCU ?= atmega644 + PROG_MCU ?= m644 F_CPU ?= 20000000 # Gen7 v1.1, v1.2 else ifeq ($(HARDWARE_MOTHERBOARD),1605) HARDWARE_VARIANT ?= Gen7 MCU ?= atmega644p + PROG_MCU ?= m644p F_CPU ?= 20000000 # Gen7 v1.3 else ifeq ($(HARDWARE_MOTHERBOARD),1606) HARDWARE_VARIANT ?= Gen7 MCU ?= atmega644p + PROG_MCU ?= m644p F_CPU ?= 20000000 # Gen7 v1.4 else ifeq ($(HARDWARE_MOTHERBOARD),1607) HARDWARE_VARIANT ?= Gen7 MCU ?= atmega1284p + PROG_MCU ?= m1284p F_CPU ?= 20000000 # Alpha OMCA board else ifeq ($(HARDWARE_MOTHERBOARD),1608) HARDWARE_VARIANT ?= SanguinoA MCU ?= atmega644 + PROG_MCU ?= m644 # Final OMCA board else ifeq ($(HARDWARE_MOTHERBOARD),1609) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega644p + PROG_MCU ?= m644p # Sethi 3D_1 else ifeq ($(HARDWARE_MOTHERBOARD),1610) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega644p + PROG_MCU ?= m644p # # Teensyduino - AT90USB1286, AT90USB1286P @@ -464,51 +516,60 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1610) else ifeq ($(HARDWARE_MOTHERBOARD),1700) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 + PROG_MCU ?= usb1286 # Printrboard (AT90USB1286) else ifeq ($(HARDWARE_MOTHERBOARD),1701) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 + PROG_MCU ?= usb1286 # Printrboard Revision F (AT90USB1286) else ifeq ($(HARDWARE_MOTHERBOARD),1702) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 + PROG_MCU ?= usb1286 # Brainwave (AT90USB646) else ifeq ($(HARDWARE_MOTHERBOARD),1703) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb646 + PROG_MCU ?= usb646 # Brainwave Pro (AT90USB1286) else ifeq ($(HARDWARE_MOTHERBOARD),1704) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 + PROG_MCU ?= usb1286 # SAV Mk-I (AT90USB1286) else ifeq ($(HARDWARE_MOTHERBOARD),1705) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 + PROG_MCU ?= usb1286 # Teensy++2.0 (AT90USB1286) else ifeq ($(HARDWARE_MOTHERBOARD),1706) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 + PROG_MCU ?= usb1286 # 5DPrint D8 Driver Board else ifeq ($(HARDWARE_MOTHERBOARD),1707) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 + PROG_MCU ?= usb1286 # UltiMachine Archim1 (with DRV8825 drivers) else ifeq ($(HARDWARE_MOTHERBOARD),3023) HARDWARE_VARIANT ?= archim MCPU = cortex-m3 - F_CPU = 84000000L + F_CPU = 84000000 IS_MCU = 0 # UltiMachine Archim2 (with TMC2130 drivers) else ifeq ($(HARDWARE_MOTHERBOARD),3024) HARDWARE_VARIANT ?= archim MCPU = cortex-m3 - F_CPU = 84000000L + F_CPU = 84000000 IS_MCU = 0 endif # Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py # if you are setting this to something other than 16MHz +# Do not put the UL suffix, it's done later on. # Set to 16Mhz if not yet set. F_CPU ?= 16000000 @@ -518,7 +579,8 @@ IS_MCU ?= 1 ifeq ($(IS_MCU),1) # Set to arduino, ATmega2560 if not yet set. HARDWARE_VARIANT ?= arduino - MCU ?= atmega2560 + MCU ?= atmega2560 + PROG_MCU ?= m2560 TOOL_PREFIX = avr MCU_FLAGS = -mmcu=$(MCU) @@ -549,27 +611,36 @@ VPATH += $(BUILD_DIR) VPATH += $(HARDWARE_SRC) ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino)) -VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/LiquidCrystal/src -VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/SPI + # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI + # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src endif ifeq ($(IS_MCU),1) VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino + # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8) VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial + # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src endif VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src + ifeq ($(LIQUID_TWI2), 1) -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2 + WIRE = 1 + VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2 endif ifeq ($(WIRE), 1) -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility + # Old libraries (avr-core 1.6.21 / Arduino < 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility + # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src/utility endif ifeq ($(NEOPIXEL), 1) VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel @@ -641,13 +712,23 @@ ifeq ($(WIRE), 1) LIB_CXXSRC += Wire.cpp endif +ifeq ($(TONE), 1) + LIB_CXXSRC += Tone.cpp +endif + ifeq ($(U8GLIB), 1) LIB_CXXSRC += U8glib.cpp - LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c + LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c \ + u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c \ + u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c endif ifeq ($(TMC), 1) - LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp + LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \ + CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \ + DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \ + SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \ + TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp endif ifeq ($(RELOC_WORKAROUND), 1) @@ -689,17 +770,23 @@ REMOVE = rm -f MV = mv -f # Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU) ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION) +CDEFS = -DF_CPU=$(F_CPU)UL ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION) CXXDEFS = $(CDEFS) ifeq ($(HARDWARE_VARIANT), Teensy) - CDEFS += -DUSB_SERIAL + CDEFS += -DUSB_SERIAL LIB_SRC += usb.c pins_teensy.c LIB_CXXSRC += usb_api.cpp else ifeq ($(HARDWARE_VARIANT), archim) - CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"' - LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp PluggableUSB.cpp USBCore.cpp + CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ + CDEFS += -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON + CDEFS += '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"' + + LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp \ + UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp \ + PluggableUSB.cpp USBCore.cpp + LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c ifeq ($(U8GLIB), 1) @@ -725,16 +812,20 @@ CTUNING = -fsigned-char -funsigned-bitfields -fno-exceptions \ ifneq ($(HARDWARE_MOTHERBOARD),) CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD} endif + #CEXTRA = -Wa,-adhlns=$(<:.c=.lst) CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD) CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD) ASFLAGS := $(CDEFS) #ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + ifeq ($(HARDWARE_VARIANT), archim) LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align LD_SUFFIX = $(LDLIBS) - LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty -u _lseek -u _read -u _write -u _exit -u kill -u _getpid + + LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty + LDFLAGS += -u _lseek -u _read -u _write -u _exit -u kill -u _getpid else LD_PREFIX = -Wl,--gc-sections,--relax LDFLAGS = -lm @@ -750,7 +841,7 @@ else AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf endif AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \ - -p$(MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \ + -p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \ -b$(UPLOAD_RATE) # Since Marlin 2.0, the source files may be distributed into several @@ -851,7 +942,7 @@ extcoff: $(TARGET).elf .elf.eep: -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ # Create extended listing file from ELF output file. .elf.lss: @@ -865,7 +956,7 @@ extcoff: $(TARGET).elf $(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h $(Pecho) " CXX $@" - $P $(CC) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX) + $P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX) # Object files that were found in "src" will be stored in $(BUILD_DIR) # in directories that mirror the structure of "src" diff --git a/buildroot/share/cmake/CMakeLists.txt b/buildroot/share/cmake/CMakeLists.txt index 1308f8bf97..9d3f24f990 100644 --- a/buildroot/share/cmake/CMakeLists.txt +++ b/buildroot/share/cmake/CMakeLists.txt @@ -47,8 +47,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/marlin-cma # cmake .. -DARDUINO_SDK_PATH="/path/to/arduino-1.x.x" # #====================================================================# #set(ARDUINO_SDK_PATH ${CMAKE_CURRENT_LIST_DIR}/arduino-1.6.8) -#set(ARDUINO_SDK_PATH /home/tom/git/BigBox-Dual-Marlin/ArduinoAddons/Arduino_1.6.x) -#set(ARDUINO_SDK_PATH /home/tom/test/arduino-1.6.11) +#set(ARDUINO_SDK_PATH /Applications/Arduino.app/Contents/Java) +#set(ARDUINO_SDK_PATH $HOME/ArduinoAddons/Arduino_1.6.x) #====================================================================# # Set included cmake files # #====================================================================# @@ -96,8 +96,8 @@ setup_motherboard(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/../../../Marlin) # Include Marlin.ino to compile libs not included in *.cpp files # #====================================================================# -file(GLOB SOURCES "../../../src/*.cpp") -set(${PROJECT_NAME}_SRCS "${SOURCES};../../../src/Marlin.ino") +file(GLOB_RECURSE SOURCES "../../../Marlin/*.cpp") +set(${PROJECT_NAME}_SRCS "${SOURCES};../../../Marlin/Marlin.ino") #====================================================================# # Define the port for uploading code to the Arduino # From 92bbf3ba18053c3bab3a47e8f7b160207c265753 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Fri, 9 Oct 2020 09:51:25 +0200 Subject: [PATCH 0363/1370] Update Italian language (#19654) --- Marlin/src/lcd/language/language_it.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index a7ddb94820..38fffcb73b 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -365,6 +365,7 @@ namespace Language_it { PROGMEM Language_Str MSG_PAUSING = _UxGT("Messa in pausa..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausa stampa"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Riprendi stampa"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Host Avvio"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Arresta stampa"); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Stampa Oggetto"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancella Oggetto"); @@ -385,10 +386,10 @@ namespace Language_it { PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Scamb. Ritrai mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ritrai V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Salta mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Avanza mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. Avanza mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Avanza V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Scamb. Avanza V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRitrai"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lunghezza scambio"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra scambio"); @@ -396,7 +397,7 @@ namespace Language_it { PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambio utensile"); PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Risalita Z"); PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Velocità innesco"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Velocità retrazione"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Velocità ritrazione"); PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Parcheggia testa"); PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed"); PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Velocità ventola"); @@ -444,6 +445,7 @@ namespace Language_it { PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Offset X sonda"); PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Offset Y sonda"); PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z sonda"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Muovi ugel.su letto"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); @@ -648,4 +650,6 @@ namespace Language_it { PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Timeout riscaldatore"); PROGMEM Language_Str MSG_REHEAT = _UxGT("Riscalda"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Riscaldando..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Proc.guid.sonda Z"); } From 8143d7082988dce8a6a913fd509f67f2b670d4a4 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 9 Oct 2020 00:52:06 -0700 Subject: [PATCH 0364/1370] Fix touch ifndefs (#19661) --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 08ab5c1f4c..8cb06824b4 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -306,13 +306,13 @@ #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -11245 #endif - #ifdef XPT2046_Y_CALIBRATION + #ifndef XPT2046_Y_CALIBRATION #define XPT2046_Y_CALIBRATION 8629 #endif - #ifdef XPT2046_X_OFFSET + #ifndef XPT2046_X_OFFSET #define XPT2046_X_OFFSET 685 #endif - #ifdef XPT2046_Y_OFFSET + #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -285 #endif #endif From 0b13608badfc08783335cef44e89994bf22ef3fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E7=AB=8B=E6=9E=AB?= <49380822+FLYmaker@users.noreply.github.com> Date: Fri, 9 Oct 2020 19:09:27 +0800 Subject: [PATCH 0365/1370] Support for FLY MINI (#19185) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 172 ++++++++++++++++++ .../share/PlatformIO/ldscripts/fly_mini.ld | 14 ++ .../share/PlatformIO/scripts/fly_mini.py | 16 ++ .../variants/FLY_F407ZG/PeripheralPins.c | 2 +- platformio.ini | 13 ++ 7 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 Marlin/src/pins/stm32f1/pins_FLY_MINI.h create mode 100644 buildroot/share/PlatformIO/ldscripts/fly_mini.ld create mode 100644 buildroot/share/PlatformIO/scripts/fly_mini.py diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index beb348845d..8658c85785 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -320,6 +320,7 @@ #define BOARD_CREALITY_V4 4034 // Creality v4.x (STM32F103RE) #define BOARD_CREALITY_V427 4035 // Creality v4.2.7 (STM32F103RE) #define BOARD_TRIGORILLA_PRO 4036 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4037 // FLY MINI (STM32F103RCT6) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 4aff336d9c..82364cc54a 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -569,6 +569,8 @@ #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality #elif MB(TRIGORILLA_PRO) #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro +#elif MB(FLY_MINI) + #include "stm32f1/pins_FLY_MINI.h" // STM32F1 env:FLY_MINI // // ARM Cortex-M4F diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h new file mode 100644 index 0000000000..fba1d41a94 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -0,0 +1,172 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifndef __STM32F1__ + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "FLY_MINI" +#define BOARD_WEBSITE_URL "github.com/FLYmaker" +#define DISABLE_JTAG + +// +// Flash EEPROM Emulation +// +#define FLASH_EEPROM_EMULATION +#define EEPROM_PAGE_SIZE 0x800 // 2KB +#define EEPROM_START_ADDRESS (0x8000000 + 256 * 1024 - 2 * EEPROM_PAGE_SIZE) // 256K firmware space +#define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE + +// +// Servos +// +#define SERVO0_PIN PA8 + +// +// Limit Switches +// +#define X_MIN_PIN PC12 +#define X_MAX_PIN PC11 +#define Y_MIN_PIN PC10 +#define Y_MAX_PIN PA15 +#define Z_MIN_PIN PA14 +#define Z_MAX_PIN PA13 + +// +// Steppers +// +#define X_STEP_PIN PB1 +#define X_DIR_PIN PB2 +#define X_ENABLE_PIN PB10 +#ifndef X_CS_PIN + #define X_CS_PIN PB0 +#endif + +#define Y_STEP_PIN PA2 +#define Y_DIR_PIN PC4 +#define Y_ENABLE_PIN PC5 +#ifndef Y_CS_PIN + #define Y_CS_PIN PA7 +#endif + +#define Z_STEP_PIN PA3 +#define Z_DIR_PIN PA5 +#define Z_ENABLE_PIN PA6 +#ifndef Z_CS_PIN + #define Z_CS_PIN PA4 +#endif + +#define E0_STEP_PIN PA1 +#define E0_DIR_PIN PC3 +#define E0_ENABLE_PIN PA0 +#ifndef E0_CS_PIN + #define E0_CS_PIN PC2 +#endif + +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB15 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB14 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB13 + #endif +#endif + +#if HAS_TMC_UART + // + // Software serial + // + #define X_SERIAL_TX_PIN PB0 + #define X_SERIAL_RX_PIN PB0 + #define Y_SERIAL_TX_PIN PA7 + #define Y_SERIAL_RX_PIN PA7 + #define Z_SERIAL_TX_PIN PA4 + #define Z_SERIAL_RX_PIN PA4 + #define E0_SERIAL_TX_PIN PC2 + #define E0_SERIAL_RX_PIN PC2 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC6 +#define HEATER_BED_PIN PC7 +#ifndef FAN_PIN + #define FAN_PIN PC8 +#endif +#define FAN1_PIN PC9 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PC0 // Analog Input +#define TEMP_0_PIN PC1 // Analog Input + +// +// LCD Pins +// + +// +// LCD / Controller +// +#define ENABLE_SPI2 +#define SS_PIN PB12 +#define SCK_PIN PB13 +#define MISO_PIN PB14 +#define MOSI_PIN PB15 + +#define SDSS SS_PIN +#define SD_DETECT_PIN PB11 + +#define BEEPER_PIN PC14 + +#define LCD_PINS_RS PB8 +#define LCD_PINS_ENABLE PB9 +#define LCD_PINS_D4 PB7 +#define LCD_PINS_D5 PB6 +#define LCD_PINS_D6 PB5 +#define LCD_PINS_D7 PB4 + +#define BTN_EN1 PD2 +#define BTN_EN2 PB3 +#define BTN_ENC PC13 + +// +// Filament runout +// + +// +// ST7920 Delays +// +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(96) +#endif +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(48) +#endif +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(715) +#endif diff --git a/buildroot/share/PlatformIO/ldscripts/fly_mini.ld b/buildroot/share/PlatformIO/ldscripts/fly_mini.ld new file mode 100644 index 0000000000..2404e7cac9 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/fly_mini.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 + rom (rx) : ORIGIN = 0x08005000, LENGTH = 256K - 20K - 4K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/scripts/fly_mini.py b/buildroot/share/PlatformIO/scripts/fly_mini.py new file mode 100644 index 0000000000..34d132958d --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/fly_mini.py @@ -0,0 +1,16 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08005000 +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/fly_mini.ld") +for i, flag in enumerate(env["LINKFLAGS"]): + if "-Wl,-T" in flag: + env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script + elif flag == "-T": + env["LINKFLAGS"][i + 1] = custom_ld_script + diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c index bd2a47062c..f0f2c4b80c 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c @@ -144,7 +144,7 @@ WEAK const PinMap PinMap_PWM[] = { {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 diff --git a/platformio.ini b/platformio.ini index ac7d9804d8..cf4dfc932a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1125,6 +1125,19 @@ build_flags = ${common_stm32.build_flags} extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +# +# FLY MINI(stm32f103rct6) +# +[env:FLY_MINI] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/fly_mini.py +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 -DSS_TIMER=4 + # # FYSETC S6 (STM32F446VET6 ARM Cortex-M4) # From 2553a18f4012b653de6a06c2485284f8d6d899bc Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 9 Oct 2020 08:25:23 -0300 Subject: [PATCH 0366/1370] Support for Debug Codes - Dnnn (#19225) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/AVR/HAL.h | 2 + Marlin/src/HAL/DUE/HAL.h | 2 + Marlin/src/HAL/ESP32/HAL.h | 2 + Marlin/src/HAL/LINUX/HAL.h | 2 + Marlin/src/HAL/LPC1768/HAL.h | 2 + Marlin/src/HAL/SAMD51/HAL.h | 2 + Marlin/src/HAL/STM32/HAL.h | 2 + Marlin/src/HAL/STM32F1/HAL.h | 2 + Marlin/src/HAL/STM32_F4_F7/HAL.h | 2 + Marlin/src/HAL/TEENSY31_32/HAL.h | 2 + Marlin/src/HAL/TEENSY35_36/HAL.h | 2 + Marlin/src/core/macros.h | 1 + Marlin/src/feature/e_parser.h | 11 +- Marlin/src/gcode/control/T.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 4 + Marlin/src/gcode/gcode.h | 5 +- Marlin/src/gcode/gcode_d.cpp | 173 +++++++++++++++++++++++++++++++ Marlin/src/gcode/parser.cpp | 49 ++++----- Marlin/src/gcode/parser.h | 34 +++++- Marlin/src/lcd/ultralcd.cpp | 6 +- 20 files changed, 269 insertions(+), 38 deletions(-) create mode 100644 Marlin/src/gcode/gcode_d.cpp diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index b606d0c231..ce15ed29fb 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -120,6 +120,8 @@ void HAL_init(); inline void HAL_clear_reset_source() { MCUSR = 0; } inline uint8_t HAL_get_reset_source() { return MCUSR; } +inline void HAL_reboot() {} // reboot the board or restart the bootloader + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-function" extern "C" { diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index dbb84e2ac7..f0650e6df8 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -105,6 +105,8 @@ void sei(); // Enable interrupts void HAL_clear_reset_source(); // clear reset reason uint8_t HAL_get_reset_source(); // get reset reason +inline void HAL_reboot() {} // reboot the board or restart the bootloader + // // ADC // diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index aa3bcc775d..81a9a0e59d 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -96,6 +96,8 @@ void HAL_clear_reset_source(); // reset reason uint8_t HAL_get_reset_source(); +inline void HAL_reboot() {} // reboot the board or restart the bootloader + void _delay_ms(int delay); #pragma GCC diagnostic push diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index 778ba2db4d..2e545e03d6 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -101,6 +101,8 @@ uint16_t HAL_adc_get_result(); inline void HAL_clear_reset_source(void) {} inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } +inline void HAL_reboot() {} // reboot the board or restart the bootloader + /* ---------------- Delay in cycles */ FORCE_INLINE static void DELAY_CYCLES(uint64_t x) { Clock::delayCycles(x); diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 3118aed1b2..cb637e715d 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -200,6 +200,8 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, void HAL_clear_reset_source(void); uint8_t HAL_get_reset_source(void); +inline void HAL_reboot() {} // reboot the board or restart the bootloader + // Add strcmp_P if missing #ifndef strcmp_P #define strcmp_P(a, b) strcmp((a), (b)) diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index 7fd826a1b6..abc6c04a69 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -88,6 +88,8 @@ typedef int8_t pin_t; void HAL_clear_reset_source(); // clear reset reason uint8_t HAL_get_reset_source(); // get reset reason +inline void HAL_reboot() {} // reboot the board or restart the bootloader + // // ADC // diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 37919102ec..a1f7515d6b 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -134,6 +134,8 @@ void HAL_clear_reset_source(); // Reset reason uint8_t HAL_get_reset_source(); +inline void HAL_reboot() {} // reboot the board or restart the bootloader + void _delay_ms(const int delay); extern "C" char* _sbrk(int incr); diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 5c03593eb0..c10dea0eaf 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -185,6 +185,8 @@ void HAL_clear_reset_source(); // Reset reason uint8_t HAL_get_reset_source(); +inline void HAL_reboot() {} // reboot the board or restart the bootloader + void _delay_ms(const int delay); #pragma GCC diagnostic push diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.h b/Marlin/src/HAL/STM32_F4_F7/HAL.h index 88e48f0fa0..00a65de792 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.h +++ b/Marlin/src/HAL/STM32_F4_F7/HAL.h @@ -142,6 +142,8 @@ void HAL_clear_reset_source(); // Reset reason uint8_t HAL_get_reset_source(); +inline void HAL_reboot() {} // reboot the board or restart the bootloader + void _delay_ms(const int delay); /* diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index b434b9de76..5fc65680d3 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -93,6 +93,8 @@ void HAL_clear_reset_source(); // Get the reason for the reset uint8_t HAL_get_reset_source(); +inline void HAL_reboot() {} // reboot the board or restart the bootloader + FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } #pragma GCC diagnostic push diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index f454e7af51..30db40dfac 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -99,6 +99,8 @@ void HAL_clear_reset_source(); // Reset reason uint8_t HAL_get_reset_source(); +inline void HAL_reboot() {} // reboot the board or restart the bootloader + FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } #pragma GCC diagnostic push diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 5fc1081019..72644b195c 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -215,6 +215,7 @@ #define WITHIN(N,L,H) ((N) >= (L) && (N) <= (H)) #define NUMERIC(a) WITHIN(a, '0', '9') #define DECIMAL(a) (NUMERIC(a) || a == '.') +#define HEXCHR(a) (NUMERIC(a) ? (a) - '0' : WITHIN(a, 'a', 'f') ? ((a) - 'a' + 10) : WITHIN(a, 'A', 'F') ? ((a) - 'A' + 10) : -1) #define NUMERIC_SIGNED(a) (NUMERIC(a) || (a) == '-' || (a) == '+') #define DECIMAL_SIGNED(a) (DECIMAL(a) || (a) == '-' || (a) == '+') #define COUNT(a) (sizeof(a)/sizeof(*a)) diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index 8d11463ecd..085cbd4eab 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -88,10 +88,8 @@ public: case EP_N: switch (c) { - case '0': case '1': case '2': - case '3': case '4': case '5': - case '6': case '7': case '8': - case '9': case '-': case ' ': break; + case '0' ... '9': + case '-': case ' ': break; case 'M': state = EP_M; break; default: state = EP_IGNORE; } @@ -153,10 +151,7 @@ public: case EP_M876S: switch (c) { case ' ': break; - case '0': case '1': case '2': - case '3': case '4': case '5': - case '6': case '7': case '8': - case '9': + case '0' ... '9': state = EP_M876SN; M876_reason = (uint8_t)(c - '0'); break; diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 729f7f2223..d95e60ff8d 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -46,7 +46,7 @@ * Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load. * Tc Load to nozzle after filament was prepared by Tc and nozzle is already heated. */ -void GcodeSuite::T(const uint8_t tool_index) { +void GcodeSuite::T(const int8_t tool_index) { DEBUG_SECTION(log_T, "T", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("...(", tool_index, ")"); diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 1de54259be..3d70b7c85c 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -923,6 +923,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 'T': T(parser.codenum); break; // Tn: Tool Change + #if ENABLED(MARLIN_DEV_MODE) + case 'D': D(parser.codenum); break; // Dn: Debug codes + #endif + default: #if ENABLED(WIFI_CUSTOM_COMMAND) if (wifi_custom_command(parser.command_ptr)) break; diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 026083bcfc..f21b7f89b1 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -285,6 +285,7 @@ * M995 - Touch screen calibration for TFT display * M997 - Perform in-application firmware update * M999 - Restart after being stopped by error + * D... - Custom Development G-code. Add hooks to 'gcode_D.cpp' for developers to test features. (Requires MARLIN_DEV_MODE) * * "T" Codes * @@ -408,6 +409,8 @@ public: private: + TERN_(MARLIN_DEV_MODE, static void D(const int16_t dcode)); + static void G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move=false)); TERN_(ARC_SUPPORT, static void G2_G3(const bool clockwise)); @@ -882,7 +885,7 @@ private: TERN_(CONTROLLER_FAN_EDITABLE, static void M710()); - static void T(const uint8_t tool_index); + static void T(const int8_t tool_index); }; diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp new file mode 100644 index 0000000000..4bc3b6c6c3 --- /dev/null +++ b/Marlin/src/gcode/gcode_d.cpp @@ -0,0 +1,173 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(MARLIN_DEV_MODE) + + #include "gcode.h" + #include "../module/settings.h" + #include "../libs/hex_print.h" + #include "../HAL/shared/eeprom_if.h" + + /** + * Dn: G-code for development and testing + * + * See https://reprap.org/wiki/G-code#D:_Debug_codes + * + * Put whatever else you need here to test ongoing development. + */ + void GcodeSuite::D(const int16_t dcode) { + switch (dcode) { + + case -1: + for (;;); // forever + + case 0: + HAL_reboot(); + break; + + case 1: { + // Zero or pattern-fill the EEPROM data + #if ENABLED(EEPROM_SETTINGS) + persistentStore.access_start(); + size_t total = persistentStore.capacity(); + int pos = 0; + const uint8_t value = 0x0; + while(total--) { + persistentStore.write_data(pos, &value, 1); + } + persistentStore.access_finish(); + #else + settings.reset(); + settings.save(); + #endif + HAL_reboot(); + } break; + + case 2: { // D2 Read / Write SRAM + #define SRAM_SIZE 8192 + uint8_t *pointer = parser.hex_adr_val('A'); + uint16_t len = parser.ushortval('C', 1); + uintptr_t addr = (uintptr_t)pointer; + NOMORE(addr, (size_t)(SRAM_SIZE - 1)); + NOMORE(len, SRAM_SIZE - addr); + if (parser.seenval('X')) { + // Write the hex bytes after the X + uint16_t val = parser.hex_val('X'); + while (len--) { + *pointer = val; + pointer++; + } + } + else { + while (len--) print_hex_byte(*(pointer++)); + SERIAL_EOL(); + } + } break; + + case 3: { // D3 Read / Write EEPROM + uint8_t *pointer = parser.hex_adr_val('A'); + uint16_t len = parser.ushortval('C', 1); + uintptr_t addr = (uintptr_t)pointer; + #ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) + #endif + NOMORE(addr, (size_t)(MARLIN_EEPROM_SIZE - 1)); + NOMORE(len, MARLIN_EEPROM_SIZE - addr); + if (parser.seenval('X')) { + uint16_t val = parser.hex_val('X'); + #if ENABLED(EEPROM_SETTINGS) + persistentStore.access_start(); + while(len--) { + int pos = 0; + persistentStore.write_data(pos, (uint8_t *)&val, sizeof(val)); + } + SERIAL_EOL(); + persistentStore.access_finish(); + #else + SERIAL_ECHOLN("NO EEPROM"); + #endif + } + else { + while (len--) { + // Read bytes from EEPROM + #if ENABLED(EEPROM_SETTINGS) + persistentStore.access_start(); + uint8_t val; + while(len--) { + int pos = 0; + if (!persistentStore.read_data(pos, (uint8_t *)&val, sizeof(val))) { + print_hex_byte(val); + } + } + SERIAL_EOL(); + persistentStore.access_finish(); + #else + SERIAL_ECHOLN("NO EEPROM"); + #endif + } + SERIAL_EOL(); + } + } break; + + case 4: { // D4 Read / Write PIN + // const uint8_t pin = parser.byteval('P'); + // const bool is_out = parser.boolval('F'), + // val = parser.byteval('V', LOW); + if (parser.seenval('X')) { + // TODO: Write the hex bytes after the X + //while (len--) { + //} + } + else { + // while (len--) { + // TODO: Read bytes from EEPROM + // print_hex_byte(eeprom_read_byte(*(adr++)); + // } + SERIAL_EOL(); + } + } break; + + case 5: { // D4 Read / Write onboard Flash + #define FLASH_SIZE 1024 + uint8_t *pointer = parser.hex_adr_val('A'); + uint16_t len = parser.ushortval('C', 1); + uintptr_t addr = (uintptr_t)pointer; + NOMORE(addr, (size_t)(FLASH_SIZE - 1)); + NOMORE(len, FLASH_SIZE - addr); + if (parser.seenval('X')) { + // TODO: Write the hex bytes after the X + //while (len--) { + //} + } + else { + // while (len--) { + // TODO: Read bytes from EEPROM + // print_hex_byte(eeprom_read_byte(adr++)); + // } + SERIAL_EOL(); + } + } break; + } + } + +#endif diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index b3172e7f6b..9c5085b97e 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -147,22 +147,15 @@ void GCodeParser::parse(char *p) { starpos[1] = '\0'; } - #if ENABLED(GCODE_MOTION_MODES) - #if ENABLED(ARC_SUPPORT) - #define GTOP 3 - #else - #define GTOP 1 - #endif + #if ANY(MARLIN_DEV_MODE, SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SIGNED_CODENUM 1 #endif // Bail if the letter is not G, M, or T // (or a valid parameter for the current motion mode) switch (letter) { - case 'G': case 'M': case 'T': - #if ENABLED(CANCEL_OBJECTS) - case 'O': - #endif + case 'G': case 'M': case 'T': TERN_(MARLIN_DEV_MODE, case 'D':) // Skip spaces to get the numeric part while (*p == ' ') p++; @@ -178,22 +171,33 @@ void GCodeParser::parse(char *p) { #endif // Bail if there's no command code number - if (!NUMERIC(*p)) return; + if (!TERN(SIGNED_CODENUM, NUMERIC_SIGNED(*p), NUMERIC(*p))) return; // Save the command letter at this point // A '?' signifies an unknown command command_letter = letter; - // Get the code number - integer digits only - codenum = 0; - do { codenum *= 10, codenum += *p++ - '0'; } while (NUMERIC(*p)); + { + #if ENABLED(SIGNED_CODENUM) + int sign = 1; // Allow for a negative code like D-1 or T-1 + if (*p == '-') { sign = -1; ++p; } + #endif + + // Get the code number - integer digits only + codenum = 0; + + do { codenum = codenum * 10 + *p++ - '0'; } while (NUMERIC(*p)); + + // Apply the sign, if any + TERN_(SIGNED_CODENUM, codenum *= sign); + } // Allow for decimal point in command #if ENABLED(USE_GCODE_SUBCODES) if (*p == '.') { p++; while (NUMERIC(*p)) - subcode *= 10, subcode += *p++ - '0'; + subcode = subcode * 10 + *p++ - '0'; } #endif @@ -201,11 +205,8 @@ void GCodeParser::parse(char *p) { while (*p == ' ') p++; #if ENABLED(GCODE_MOTION_MODES) - if (letter == 'G' && (codenum <= GTOP || codenum == 5 - #if ENABLED(G38_PROBE_TARGET) - || codenum == 38 - #endif - ) + if (letter == 'G' + && (codenum <= TERN(ARC_SUPPORT, 3, 1) || codenum == 5 || TERN0(G38_PROBE_TARGET, codenum == 38)) ) { motion_mode_codenum = codenum; TERN_(USE_GCODE_SUBCODES, motion_mode_subcode = subcode); @@ -216,12 +217,12 @@ void GCodeParser::parse(char *p) { #if ENABLED(GCODE_MOTION_MODES) #if ENABLED(ARC_SUPPORT) - case 'I': case 'J': case 'R': + case 'I' ... 'J': case 'R': if (motion_mode_codenum != 2 && motion_mode_codenum != 3) return; #endif - case 'P': case 'Q': + case 'P' ... 'Q': if (motion_mode_codenum != 5) return; - case 'X': case 'Y': case 'Z': case 'E': case 'F': + case 'X' ... 'Z': case 'E' ... 'F': if (motion_mode_codenum < 0) return; command_letter = 'G'; codenum = motion_mode_codenum; @@ -247,7 +248,7 @@ void GCodeParser::parse(char *p) { #if ENABLED(EXPECTED_PRINTER_CHECK) case 16: #endif - case 23: case 28: case 30: case 33: case 117: case 118: case 928: + case 23: case 28: case 30: case 117 ... 118: case 928: string_arg = unescape_string(p); return; default: break; diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index eb614c33b4..42b85ca271 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -114,6 +114,11 @@ public: return valid_signless(p) || ((p[0] == '-' || p[0] == '+') && valid_signless(&p[1])); // [-+]?.?[0-9] } + FORCE_INLINE static bool valid_number(const char * const p) { + // TODO: With MARLIN_DEV_MODE allow HEX values starting with "x" + return valid_float(p); + } + #if ENABLED(FASTER_GCODE_PARSER) FORCE_INLINE static bool valid_int(const char * const p) { @@ -142,8 +147,12 @@ public: if (ind >= COUNT(param)) return false; // Only A-Z const bool b = TEST32(codebits, ind); if (b) { - char * const ptr = command_ptr + param[ind]; - value_ptr = param[ind] && valid_float(ptr) ? ptr : nullptr; + if (param[ind]) { + char * const ptr = command_ptr + param[ind]; + value_ptr = valid_number(ptr) ? ptr : nullptr; + } + else + value_ptr = nullptr; } return b; } @@ -198,7 +207,7 @@ public: static inline bool seen(const char c) { char *p = strgchr(command_args, c); const bool b = !!p; - if (b) value_ptr = valid_float(&p[1]) ? &p[1] : nullptr; + if (b) value_ptr = valid_number(&p[1]) ? &p[1] : nullptr; return b; } @@ -401,6 +410,25 @@ public: static inline float linearval(const char c, const float dval=0) { return seenval(c) ? value_linear_units() : dval; } static inline float celsiusval(const char c, const float dval=0) { return seenval(c) ? value_celsius() : dval; } + #if ENABLED(MARLIN_DEV_MODE) + + static inline uint8_t* hex_adr_val(const char c, uint8_t * const dval=nullptr) { + if (!seen(c) || *value_ptr != 'x') return dval; + uint8_t *out = nullptr; + for (char *vp = value_ptr + 1; HEXCHR(*vp) >= 0; vp++) + out = (uint8_t*)((uintptr_t(out) << 8) | HEXCHR(*vp)); + return out; + } + + static inline uint16_t hex_val(const char c, uint16_t const dval=0) { + if (!seen(c) || *value_ptr != 'x') return dval; + uint16_t out = 0; + for (char *vp = value_ptr + 1; HEXCHR(*vp) >= 0; vp++) + out = ((out) << 8) | HEXCHR(*vp); + return out; + } + + #endif }; extern GCodeParser parser; diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index de534e4023..92dd63389f 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -123,11 +123,15 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #include "lcdprint.h" #include "../sd/cardreader.h" -#include "../module/settings.h" + #include "../module/temperature.h" #include "../module/planner.h" #include "../module/motion.h" +#if HAS_LCD_MENU + #include "../module/settings.h" +#endif + #if ENABLED(AUTO_BED_LEVELING_UBL) #include "../feature/bedlevel/bedlevel.h" #endif From 3facf34f5f7dc14093e4948a7350cf4edcb9a20a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 9 Oct 2020 16:42:23 -0500 Subject: [PATCH 0367/1370] Optional `M42`/`M226`; Add more features filters (#19664) --- Marlin/Configuration_adv.h | 5 ++ Marlin/src/gcode/control/M226.cpp | 6 +++ Marlin/src/gcode/control/M42.cpp | 7 ++- Marlin/src/gcode/gcode.cpp | 9 +++- Marlin/src/gcode/gcode.h | 9 ++-- Marlin/src/inc/MarlinConfig.h | 32 ++++++++---- Marlin/src/inc/MarlinConfigPre.h | 14 ++++-- Marlin/src/pins/pins.h | 2 +- .../PlatformIO/scripts/common-dependencies.h | 47 +++-------------- .../PlatformIO/scripts/common-dependencies.py | 8 ++- platformio.ini | 50 ++++++++++++++----- 11 files changed, 111 insertions(+), 78 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8cc71ceb86..59a1813610 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3559,6 +3559,11 @@ // //#define M100_FREE_MEMORY_WATCHER +// +// M42 - Set pin states +// +//#define DIRECT_PIN_CONTROL + // // M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe // diff --git a/Marlin/src/gcode/control/M226.cpp b/Marlin/src/gcode/control/M226.cpp index 52e0e57a87..ad717e614d 100644 --- a/Marlin/src/gcode/control/M226.cpp +++ b/Marlin/src/gcode/control/M226.cpp @@ -20,6 +20,10 @@ * */ +#include "../../inc/MarlinConfig.h" + +#if ENABLED(DIRECT_PIN_CONTROL) + #include "../gcode.h" #include "../../MarlinCore.h" // for pin_is_protected and idle() #include "../../module/stepper.h" @@ -50,3 +54,5 @@ void GcodeSuite::M226() { } // pin_state -1 0 1 && pin > -1 } // parser.seen('P') } + +#endif // DIRECT_PIN_CONTROL diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp index c88113db49..c635c06ec6 100644 --- a/Marlin/src/gcode/control/M42.cpp +++ b/Marlin/src/gcode/control/M42.cpp @@ -20,9 +20,12 @@ * */ +#include "../../inc/MarlinConfig.h" + +#if ENABLED(DIRECT_PIN_CONTROL) + #include "../gcode.h" #include "../../MarlinCore.h" // for pin_is_protected -#include "../../inc/MarlinConfig.h" #if HAS_FAN #include "../../module/temperature.h" @@ -96,3 +99,5 @@ void GcodeSuite::M42() { extDigitalWrite(pin, pin_status); analogWrite(pin, pin_status); } + +#endif // DIRECT_PIN_CONTROL diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 3d70b7c85c..cbf62e0fcf 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -445,7 +445,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #endif // SDSUPPORT case 31: M31(); break; // M31: Report time since the start of SD print or last M109 - case 42: M42(); break; // M42: Change pin state + + #if ENABLED(DIRECT_PIN_CONTROL) + case 42: M42(); break; // M42: Change pin state + #endif #if ENABLED(PINS_DEBUGGING) case 43: M43(); break; // M43: Read pin state @@ -620,7 +623,9 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 221: M221(); break; // M221: Set Flow Percentage #endif - case 226: M226(); break; // M226: Wait until a pin reaches a state + #if ENABLED(DIRECT_PIN_CONTROL) + case 226: M226(); break; // M226: Wait until a pin reaches a state + #endif #if HAS_SERVOS case 280: M280(); break; // M280: Set servo position absolute diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index f21b7f89b1..73a3727813 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -109,7 +109,7 @@ * The '#' is necessary when calling from within sd files, as it stops buffer prereading * M33 - Get the longname version of a path. (Requires LONG_FILENAME_HOST_SUPPORT) * M34 - Set SD Card sorting options. (Requires SDCARD_SORT_ALPHA) - * M42 - Change pin status via gcode: M42 P S. LED pin assumed if P is omitted. + * M42 - Change pin status via gcode: M42 P S. LED pin assumed if P is omitted. (Requires DIRECT_PIN_CONTROL) * M43 - Display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins * M48 - Measure Z Probe repeatability: M48 P X Y V E L S. (Requires Z_MIN_PROBE_REPEATABILITY_TEST) * M73 - Set the progress percentage. (Requires LCD_SET_PROGRESS_MANUALLY) @@ -183,7 +183,7 @@ * M220 - Set Feedrate Percentage: "M220 S" (i.e., "FR" on the LCD) * Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires PRUSA_MMU2) * M221 - Set Flow Percentage: "M221 S" - * M226 - Wait until a pin is in a given state: "M226 P S" + * M226 - Wait until a pin is in a given state: "M226 P S" (Requires DIRECT_PIN_CONTROL) * M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE) * M250 - Set LCD contrast: "M250 C" (0-63). (Requires LCD support) * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS) @@ -544,8 +544,7 @@ private: #endif #endif - static void M42(); - + TERN_(DIRECT_PIN_CONTROL, static void M42()); TERN_(PINS_DEBUGGING, static void M43()); TERN_(Z_MIN_PROBE_REPEATABILITY_TEST, static void M48()); @@ -673,7 +672,7 @@ private: static void M221(); #endif - static void M226(); + TERN_(DIRECT_PIN_CONTROL, static void M226()); TERN_(PHOTO_GCODE, static void M240()); diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h index d1184cff5f..2eafa2b417 100644 --- a/Marlin/src/inc/MarlinConfig.h +++ b/Marlin/src/inc/MarlinConfig.h @@ -27,21 +27,31 @@ #include "MarlinConfigPre.h" -#include "../HAL/HAL.h" +#ifndef __MARLIN_DEPS__ + #include "../HAL/HAL.h" +#endif #include "../pins/pins.h" -#include HAL_PATH(../HAL, timers.h) -#include HAL_PATH(../HAL, spi_pins.h) + +#ifndef __MARLIN_DEPS__ + #include HAL_PATH(../HAL, timers.h) + #include HAL_PATH(../HAL, spi_pins.h) +#endif #include "Conditionals_post.h" -#include HAL_PATH(../HAL, inc/Conditionals_post.h) -#include "../core/types.h" // Ahead of sanity-checks +#ifndef __MARLIN_DEPS__ -#include "SanityCheck.h" -#include HAL_PATH(../HAL, inc/SanityCheck.h) + #include HAL_PATH(../HAL, inc/Conditionals_post.h) -// Include all core headers -#include "../core/language.h" -#include "../core/utility.h" -#include "../core/serial.h" + #include "../core/types.h" // Ahead of sanity-checks + + #include "SanityCheck.h" + #include HAL_PATH(../HAL, inc/SanityCheck.h) + + // Include all core headers + #include "../core/language.h" + #include "../core/utility.h" + #include "../core/serial.h" + +#endif diff --git a/Marlin/src/inc/MarlinConfigPre.h b/Marlin/src/inc/MarlinConfigPre.h index 1b15d49817..dfa0adba1b 100644 --- a/Marlin/src/inc/MarlinConfigPre.h +++ b/Marlin/src/inc/MarlinConfigPre.h @@ -30,7 +30,9 @@ // #include -#include "../HAL/platforms.h" +#ifndef __MARLIN_DEPS__ + #include "../HAL/platforms.h" +#endif #include "../core/boards.h" #include "../core/macros.h" @@ -45,10 +47,16 @@ #include "Version.h" #include "Conditionals_LCD.h" -#include HAL_PATH(../HAL, inc/Conditionals_LCD.h) + +#ifndef __MARLIN_DEPS__ + #include HAL_PATH(../HAL, inc/Conditionals_LCD.h) +#endif #include "../core/drivers.h" #include "../../Configuration_adv.h" #include "Conditionals_adv.h" -#include HAL_PATH(../HAL, inc/Conditionals_adv.h) + +#ifndef __MARLIN_DEPS__ + #include HAL_PATH(../HAL, inc/Conditionals_adv.h) +#endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 82364cc54a..a7888e54d4 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -52,7 +52,7 @@ #define HAS_FREE_AUX2_PINS !(BOTH(ULTRA_LCD, NEWPANEL) && ANY(PANEL_ONE, VIKI2, miniVIKI, MINIPANEL, REPRAPWORLD_KEYPAD)) // Test the target within the included pins file -#ifdef __MARLIN_PREBUILD__ +#ifdef __MARLIN_DEPS__ #define NOT_TARGET(V...) 0 #else #define NOT_TARGET(V...) NONE(V) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index 02a4502e3f..c96907bb3f 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -19,7 +19,6 @@ * along with this program. If not, see . * */ -#pragma once /** * The purpose of this file is just include Marlin Configuration files, @@ -27,44 +26,9 @@ * Used by common-dependencies.py */ -#include +#define NUM_SERIAL 1 // Normally provided by HAL/HAL.h -// Include platform headers -//#include "../../../../Marlin/src/HAL/platforms.h" - -#include "../../../../Marlin/src/core/boards.h" -#include "../../../../Marlin/src/core/macros.h" -#include "../../../../Marlin/Configuration.h" - -#include "../../../../Marlin/Version.h" - -#include "../../../../Marlin/src/inc/Conditionals_LCD.h" - -#ifdef HAL_PATH - #include HAL_PATH(../../../../Marlin/src/HAL, inc/Conditionals_LCD.h) -#endif - -#include "../../../../Marlin/src/core/drivers.h" -#include "../../../../Marlin/Configuration_adv.h" - -#include "../../../../Marlin/src/inc/Conditionals_adv.h" - -#ifdef HAL_PATH - #include HAL_PATH(../../../../Marlin/src/HAL, inc/Conditionals_adv.h) -#endif - -//#include "../../../../Marlin/src/pins/pins.h" - -#ifdef HAL_PATH - #include HAL_PATH(../../../../Marlin/src/HAL, timers.h) - #include HAL_PATH(../../../../Marlin/src/HAL, spi_pins.h) -#endif - -#include "../../../../Marlin/src/inc/Conditionals_post.h" - -#ifdef HAL_PATH - #include HAL_PATH(../../../../Marlin/src/HAL, inc/Conditionals_post.h) -#endif +#include "../../../../Marlin/src/inc/MarlinConfig.h" // // Conditionals only used for [features] @@ -89,6 +53,10 @@ #define HAS_EXTRUDERS #endif +#if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + #define HAS_SMART_EFF_MOD +#endif + #if HAS_LCD_MENU #if ENABLED(BACKLASH_GCODE) #define HAS_MENU_BACKLASH @@ -145,6 +113,3 @@ #define HAS_MENU_UBL #endif #endif - -// Include pins for the current board. Platform tests will be skipped. No HAL-defined pins. -#include "../../../../Marlin/src/pins/pins.h" diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 6005855156..4b4bba6258 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -39,6 +39,12 @@ def parse_pkg_uri(spec): FEATURE_CONFIG = {} def add_to_feat_cnf(feature, flines): + + try: + feat = FEATURE_CONFIG[feature] + except: + FEATURE_CONFIG[feature] = {} + feat = FEATURE_CONFIG[feature] atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') for dep in atoms: @@ -238,7 +244,7 @@ def load_marlin_features(): else: cmd += ['-D' + s] - cmd += ['-D__MARLIN_PREBUILD__ -w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] + cmd += ['-D__MARLIN_DEPS__ -w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] cmd = ' '.join(cmd) blab(cmd) define_list = subprocess.check_output(cmd, shell=True).splitlines() diff --git a/platformio.ini b/platformio.ini index cf4dfc932a..d4beca6519 100644 --- a/platformio.ini +++ b/platformio.ini @@ -27,6 +27,7 @@ include_dir = Marlin [common] default_src_filter = + - - + - - - - - + - - - - - - - - @@ -53,10 +54,13 @@ default_src_filter = + - - + - - - - - + - - - - - + - - + - + - - - - - - @@ -65,7 +69,7 @@ default_src_filter = + - - + - - - - - - - - + - - - - - - - @@ -80,6 +84,7 @@ default_src_filter = + - - + - - - + - - - - @@ -95,7 +100,7 @@ default_src_filter = + - - + - - - - - - + - - - - - - - @@ -106,7 +111,7 @@ default_src_filter = + - - + - - - - - + - - - - @@ -114,14 +119,19 @@ default_src_filter = + - - + - - - + - - - - - - - + - - + - - - + - + - - - - @@ -169,8 +179,10 @@ default_src_filter = + - - + - - - + - - - + - - - - - - @@ -214,9 +226,13 @@ HAS_WIRED_LCD = src_filter=+ HAS_MARLINUI_HD44780 = src_filter=+ HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 src_filter=+ +HAS_(FSMC|SPI)_TFT = src_filter=+ + +HAS_FSMC_TFT = src_filter=+ + +HAS_SPI_TFT = src_filter=+ + HAS_GRAPHICAL_TFT = src_filter=+ DWIN_CREALITY_LCD = src_filter=+ IS_TFTGLCD_PANEL = src_filter=+ +HAS_TOUCH_XPT2046 = src_filter=+ HAS_LCD_MENU = src_filter=+ HAS_GAMES = src_filter=+ MARLIN_BRICKOUT = src_filter=+ @@ -242,7 +258,7 @@ HAS_MENU_TEMPERATURE = src_filter=+ HAS_MENU_TMC = src_filter=+ HAS_MENU_TOUCH_SCREEN = src_filter=+ HAS_MENU_UBL = src_filter=+ -ANYCUBIC_LCD_CHIRON = src_filter=+ +ANYCUBIC_LCD_CHIRON = src_filter=+ + ANYCUBIC_LCD_I3MEGA = src_filter=+ + HAS_DGUS_LCD = src_filter=+ + TOUCH_UI_FTDI_EVE = src_filter=+ @@ -258,13 +274,15 @@ BARICUDA = src_filter=+ + + BLTOUCH = src_filter=+ CANCEL_OBJECTS = src_filter=+ + -CASE_LIGHT_ENABLE = src_filter=+ + +CASE_LIGHT_ENABLE = src_filter=+ + EXTERNAL_CLOSED_LOOP_CONTROLLER = src_filter=+ + USE_CONTROLLER_FAN = src_filter=+ DAC_STEPPER_CURRENT = src_filter=+ DIRECT_STEPPING = src_filter=+ + EMERGENCY_PARSER = src_filter=+ - I2C_POSITION_ENCODERS = src_filter=+ +IIC_BL24CXX_EEPROM = src_filter=+ +HAS_SPI_FLASH = src_filter=+ HAS_FANMUX = src_filter=+ FILAMENT_WIDTH_SENSOR = src_filter=+ + FWRETRACT = src_filter=+ + @@ -285,10 +303,10 @@ ADVANCED_PAUSE_FEATURE = src_filter=+ + HAS_POWER_MONITOR = src_filter=+ + POWER_LOSS_RECOVERY = src_filter=+ + -PROBE_TEMP_COMPENSATION = src_filter=+ + +PROBE_TEMP_COMPENSATION = src_filter=+ + HAS_FILAMENT_SENSOR = src_filter=+ + MK2_MULTIPLEXER = src_filter=+ -EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+ +EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+ + HAS_CUTTER = src_filter=+ + EXPERIMENTAL_I2CBUS = src_filter=+ + Z_STEPPER_AUTO_ALIGN = src_filter=+ + @@ -304,14 +322,19 @@ BACKLASH_GCODE = src_filter=+ IS_KINEMATIC = src_filter=+ HAS_EXTRA_ENDSTOPS = src_filter=+ SKEW_CORRECTION_GCODE = src_filter=+ -PINS_DEBUGGING = src_filter=- +DIRECT_PIN_CONTROL = src_filter=+ + +PINS_DEBUGGING = src_filter=+ NO_VOLUMETRICS = src_filter=- HAS_MULTI_EXTRUDER = src_filter=+ HAS_HOTEND_OFFSET = src_filter=+ EDITABLE_SERVO_ANGLES = src_filter=+ +PIDTEMP = src_filter=+ PREVENT_COLD_EXTRUSION = src_filter=+ +PIDTEMPBED = src_filter=+ HAS_USER_THERMISTORS = src_filter=+ SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ +BAUD_RATE_GCODE = src_filter=+ +HAS_SMART_EFF_MOD = src_filter=+ COOLANT_CONTROL = src_filter=+ HAS_SOFTWARE_ENDSTOPS = src_filter=+ HAS_DUPLICATION_MODE = src_filter=+ @@ -336,12 +359,13 @@ LCD_SET_PROGRESS_MANUALLY = src_filter=+ TOUCH_SCREEN_CALIBRATION = src_filter=+ ARC_SUPPORT = src_filter=+ GCODE_MOTION_MODES = src_filter=+ -BABYSTEPPING = src_filter=+ +BABYSTEPPING = src_filter=+ + Z_PROBE_SLED = src_filter=+ G38_PROBE_TARGET = src_filter=+ MAGNETIC_PARKING_EXTRUDER = src_filter=+ SDSUPPORT = src_filter=+ HAS_EXTRUDERS = src_filter=+ + +AUTO_REPORT_TEMPERATURES = src_filter=+ INCH_MODE_SUPPORT = src_filter=+ TEMPERATURE_UNITS_SUPPORT = src_filter=+ NEED_HEX_PRINT = src_filter=+ @@ -559,7 +583,7 @@ extends = env:at90usb1286_cdc [env:DUE] platform = atmelsam board = due -src_filter = ${common.default_src_filter} + +src_filter = ${common.default_src_filter} + + [env:DUE_USB] platform = atmelsam @@ -635,7 +659,7 @@ lib_ldf_mode = off lib_compat_mode = strict extra_scripts = ${common.extra_scripts} Marlin/src/HAL/LPC1768/upload_extra_script.py -src_filter = ${common.default_src_filter} + +src_filter = ${common.default_src_filter} + + lib_deps = ${common.lib_deps} Servo custom_marlin.USES_LIQUIDCRYSTAL = LiquidCrystal@1.0.0 @@ -674,7 +698,7 @@ build_flags = ${common.build_flags} -DUSBCON -DUSBD_USE_CDC -DTIM_IRQ_PRIO=13 build_unflags = -std=gnu++11 -src_filter = ${common.default_src_filter} + +src_filter = ${common.default_src_filter} + + # # HAL/STM32F1 Common Environment values From 7e09160ba3d129c9af6e399e1c3e4e92384cb8e7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 9 Oct 2020 16:50:17 -0500 Subject: [PATCH 0368/1370] Batch appercase hex values --- Marlin/Makefile | 2 +- Marlin/src/HAL/AVR/fast_pwm.cpp | 4 +- Marlin/src/HAL/DUE/HAL.h | 2 +- Marlin/src/HAL/DUE/eeprom_flash.cpp | 2 +- Marlin/src/HAL/DUE/usb/compiler.h | 126 +- Marlin/src/HAL/ESP32/HAL.h | 4 +- Marlin/src/HAL/SAMD51/QSPIFlash.cpp | 2 +- .../src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp | 58 +- Marlin/src/HAL/TEENSY31_32/HAL.h | 2 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 2 +- Marlin/src/HAL/TEENSY40_41/HAL.h | 2 +- Marlin/src/feature/dac/dac_mcp4728.h | 2 +- Marlin/src/feature/tmc_util.h | 2 +- Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp | 4 +- Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp | 4 +- .../lcd/dogm/fontdata/fontdata_6x9_marlin.h | 244 +- .../lcd/dogm/fontdata/fontdata_ISO10646_1.h | 424 +-- Marlin/src/lcd/dogm/fontdata/langdata_bg.h | 74 +- Marlin/src/lcd/dogm/fontdata/langdata_cz.h | 42 +- Marlin/src/lcd/dogm/fontdata/langdata_el.h | 92 +- Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h | 92 +- Marlin/src/lcd/dogm/fontdata/langdata_hr.h | 18 +- Marlin/src/lcd/dogm/fontdata/langdata_hu.h | 2 +- .../src/lcd/dogm/fontdata/langdata_jp_kana.h | 130 +- Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h | 582 ++-- Marlin/src/lcd/dogm/fontdata/langdata_pl.h | 32 +- Marlin/src/lcd/dogm/fontdata/langdata_ru.h | 86 +- Marlin/src/lcd/dogm/fontdata/langdata_sk.h | 42 +- Marlin/src/lcd/dogm/fontdata/langdata_test.h | 394 +-- Marlin/src/lcd/dogm/fontdata/langdata_tr.h | 18 +- Marlin/src/lcd/dogm/fontdata/langdata_uk.h | 96 +- Marlin/src/lcd/dogm/fontdata/langdata_vi.h | 168 +- Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h | 2180 +++++++-------- Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h | 1814 ++++++------- .../lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h | 2 +- .../ftdi_eve_lib/basic/commands.cpp | 4 +- .../ftdi_eve_lib/basic/registers_ft800.h | 2 +- .../ftdi_eve_lib/basic/registers_ft810.h | 2 +- .../ftdi_eve_lib/basic/resolutions.h | 10 +- .../unicode/western_char_set_bitmap_31.h | 2336 ++++++++--------- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 8 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 14 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 40 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 46 +- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 54 +- Marlin/src/lcd/lcdprint.h | 2 +- .../lcd/tft/fontdata/fontdata_ISO10646_1.cpp | 428 +-- Marlin/src/lcd/tft/images/back_32x32x4.cpp | 46 +- .../lcd/tft/images/background_320x30x16.cpp | 60 +- .../lcd/tft/images/bootscreen_195x59x16.cpp | 118 +- .../lcd/tft/images/bootscreen_228x255x2.cpp | 510 ++-- .../lcd/tft/images/bootscreen_228x255x4.cpp | 510 ++-- .../lcd/tft/images/bootscreen_320x240x16.cpp | 480 ++-- .../lcd/tft/images/bootscreen_480x320x16.cpp | 638 ++--- .../lcd/tft/images/btn_rounded_64x52x4.cpp | 92 +- Marlin/src/lcd/tft/images/cancel_64x64x4.cpp | 72 +- Marlin/src/lcd/tft/images/chamber_64x64x4.cpp | 152 +- Marlin/src/lcd/tft/images/confirm_64x64x4.cpp | 68 +- .../src/lcd/tft/images/decrease_64x64x4.cpp | 18 +- .../src/lcd/tft/images/directory_32x32x4.cpp | 42 +- Marlin/src/lcd/tft/images/down_32x32x4.cpp | 30 +- Marlin/src/lcd/tft/images/fan_64x64x4.cpp | 192 +- .../src/lcd/tft/images/fan_fast_64x64x4.cpp | 208 +- .../src/lcd/tft/images/fan_slow_64x64x4.cpp | 220 +- .../src/lcd/tft/images/feedrate_32x32x4.cpp | 56 +- .../src/lcd/tft/images/flowrate_32x32x4.cpp | 48 +- .../src/lcd/tft/images/heated_bed_64x64x4.cpp | 64 +- Marlin/src/lcd/tft/images/home_64x64x4.cpp | 102 +- Marlin/src/lcd/tft/images/hotend_64x64x4.cpp | 78 +- .../src/lcd/tft/images/increase_64x64x4.cpp | 68 +- Marlin/src/lcd/tft/images/left_32x32x4.cpp | 50 +- .../src/lcd/tft/images/leveling_32x32x4.cpp | 28 +- Marlin/src/lcd/tft/images/menu_64x64x4.cpp | 60 +- Marlin/src/lcd/tft/images/pause_64x64x4.cpp | 72 +- Marlin/src/lcd/tft/images/refresh_32x32x4.cpp | 44 +- Marlin/src/lcd/tft/images/right_32x32x4.cpp | 50 +- Marlin/src/lcd/tft/images/sd_64x64x4.cpp | 96 +- .../src/lcd/tft/images/settings_64x64x4.cpp | 96 +- Marlin/src/lcd/tft/images/slider_8x16x4.cpp | 32 +- Marlin/src/lcd/tft/images/up_32x32x4.cpp | 30 +- Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/UsbCore.h | 24 +- .../src/sd/usb_flashdrive/lib-uhs2/macros.h | 18 +- .../sd/usb_flashdrive/lib-uhs2/masstorage.cpp | 12 +- .../sd/usb_flashdrive/lib-uhs2/masstorage.h | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/max3421e.h | 26 +- .../src/sd/usb_flashdrive/lib-uhs2/printhex.h | 4 +- .../sd/usb_flashdrive/lib-uhs2/usbhost.cpp | 2 +- .../UHS_BULK_STORAGE_INLINE.h | 10 +- .../UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h | 2 +- .../lib-uhs3/UHS_host/UHS_UsbCore.h | 4 +- .../lib-uhs3/UHS_host/UHS_host_INLINE.h | 2 +- .../lib-uhs3/UHS_host/UHS_macros.h | 18 +- .../lib-uhs3/UHS_host/UHS_printhex.h | 4 +- .../lib-uhs3/UHS_host/UHS_usb_ch9.h | 12 +- .../UHS_host/USB_HOST_SHIELD/UHS_max3421e.h | 26 +- .../USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h | 12 +- .../usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h | 2 +- .../share/PlatformIO/scripts/chitu_crypt.py | 4 +- .../PlatformIO/variants/archim/variant.h | 56 +- 106 files changed, 7192 insertions(+), 7192 deletions(-) diff --git a/Marlin/Makefile b/Marlin/Makefile index 91c8889c69..49cb960b92 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -780,7 +780,7 @@ ifeq ($(HARDWARE_VARIANT), Teensy) else ifeq ($(HARDWARE_VARIANT), archim) CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ - CDEFS += -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON + CDEFS += -DUSB_VID=0x27B1 -DUSB_PID=0x0001 -DUSBCON CDEFS += '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"' LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp \ diff --git a/Marlin/src/HAL/AVR/fast_pwm.cpp b/Marlin/src/HAL/AVR/fast_pwm.cpp index 29866bccf9..238c1124ad 100644 --- a/Marlin/src/HAL/AVR/fast_pwm.cpp +++ b/Marlin/src/HAL/AVR/fast_pwm.cpp @@ -185,8 +185,8 @@ void set_pwm_frequency(const pin_t pin, int f_desired) { res_temp_phase_correct = rtf / 2; } - LIMIT(res_temp_fast, 1u, size); - LIMIT(res_temp_phase_correct, 1u, size); + LIMIT(res_temp_fast, 1U, size); + LIMIT(res_temp_phase_correct, 1U, size); // Calculate frequencies of test prescaler and resolution values const int f_temp_fast = (F_CPU) / (prescaler[i] * (1 + res_temp_fast)), f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct), diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index f0650e6df8..88ace59575 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -113,7 +113,7 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader extern uint16_t HAL_adc_result; // result of last ADC conversion #ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) + #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) #endif #define HAL_ANALOG_SELECT(ch) diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index 67f1f9e40f..6f38da0967 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -60,7 +60,7 @@ #define EEPROMSize 4096 #define PagesPerGroup 128 #define GroupCount 2 -#define PageSize 256u +#define PageSize 256U /* Flash storage */ typedef struct FLASH_SECTOR { diff --git a/Marlin/src/HAL/DUE/usb/compiler.h b/Marlin/src/HAL/DUE/usb/compiler.h index 879007fa2a..f89e554c45 100644 --- a/Marlin/src/HAL/DUE/usb/compiler.h +++ b/Marlin/src/HAL/DUE/usb/compiler.h @@ -609,37 +609,37 @@ typedef struct # define clz(u) ((u) ? __CLZ(u) : 32) #else # define clz(u) (((u) == 0) ? 32 : \ - ((u) & (1ul << 31)) ? 0 : \ - ((u) & (1ul << 30)) ? 1 : \ - ((u) & (1ul << 29)) ? 2 : \ - ((u) & (1ul << 28)) ? 3 : \ - ((u) & (1ul << 27)) ? 4 : \ - ((u) & (1ul << 26)) ? 5 : \ - ((u) & (1ul << 25)) ? 6 : \ - ((u) & (1ul << 24)) ? 7 : \ - ((u) & (1ul << 23)) ? 8 : \ - ((u) & (1ul << 22)) ? 9 : \ - ((u) & (1ul << 21)) ? 10 : \ - ((u) & (1ul << 20)) ? 11 : \ - ((u) & (1ul << 19)) ? 12 : \ - ((u) & (1ul << 18)) ? 13 : \ - ((u) & (1ul << 17)) ? 14 : \ - ((u) & (1ul << 16)) ? 15 : \ - ((u) & (1ul << 15)) ? 16 : \ - ((u) & (1ul << 14)) ? 17 : \ - ((u) & (1ul << 13)) ? 18 : \ - ((u) & (1ul << 12)) ? 19 : \ - ((u) & (1ul << 11)) ? 20 : \ - ((u) & (1ul << 10)) ? 21 : \ - ((u) & (1ul << 9)) ? 22 : \ - ((u) & (1ul << 8)) ? 23 : \ - ((u) & (1ul << 7)) ? 24 : \ - ((u) & (1ul << 6)) ? 25 : \ - ((u) & (1ul << 5)) ? 26 : \ - ((u) & (1ul << 4)) ? 27 : \ - ((u) & (1ul << 3)) ? 28 : \ - ((u) & (1ul << 2)) ? 29 : \ - ((u) & (1ul << 1)) ? 30 : \ + ((u) & (1UL << 31)) ? 0 : \ + ((u) & (1UL << 30)) ? 1 : \ + ((u) & (1UL << 29)) ? 2 : \ + ((u) & (1UL << 28)) ? 3 : \ + ((u) & (1UL << 27)) ? 4 : \ + ((u) & (1UL << 26)) ? 5 : \ + ((u) & (1UL << 25)) ? 6 : \ + ((u) & (1UL << 24)) ? 7 : \ + ((u) & (1UL << 23)) ? 8 : \ + ((u) & (1UL << 22)) ? 9 : \ + ((u) & (1UL << 21)) ? 10 : \ + ((u) & (1UL << 20)) ? 11 : \ + ((u) & (1UL << 19)) ? 12 : \ + ((u) & (1UL << 18)) ? 13 : \ + ((u) & (1UL << 17)) ? 14 : \ + ((u) & (1UL << 16)) ? 15 : \ + ((u) & (1UL << 15)) ? 16 : \ + ((u) & (1UL << 14)) ? 17 : \ + ((u) & (1UL << 13)) ? 18 : \ + ((u) & (1UL << 12)) ? 19 : \ + ((u) & (1UL << 11)) ? 20 : \ + ((u) & (1UL << 10)) ? 21 : \ + ((u) & (1UL << 9)) ? 22 : \ + ((u) & (1UL << 8)) ? 23 : \ + ((u) & (1UL << 7)) ? 24 : \ + ((u) & (1UL << 6)) ? 25 : \ + ((u) & (1UL << 5)) ? 26 : \ + ((u) & (1UL << 4)) ? 27 : \ + ((u) & (1UL << 3)) ? 28 : \ + ((u) & (1UL << 2)) ? 29 : \ + ((u) & (1UL << 1)) ? 30 : \ 31) #endif #endif @@ -654,38 +654,38 @@ typedef struct #if (defined __GNUC__) || (defined __CC_ARM) # define ctz(u) ((u) ? __builtin_ctz(u) : 32) #else -# define ctz(u) ((u) & (1ul << 0) ? 0 : \ - (u) & (1ul << 1) ? 1 : \ - (u) & (1ul << 2) ? 2 : \ - (u) & (1ul << 3) ? 3 : \ - (u) & (1ul << 4) ? 4 : \ - (u) & (1ul << 5) ? 5 : \ - (u) & (1ul << 6) ? 6 : \ - (u) & (1ul << 7) ? 7 : \ - (u) & (1ul << 8) ? 8 : \ - (u) & (1ul << 9) ? 9 : \ - (u) & (1ul << 10) ? 10 : \ - (u) & (1ul << 11) ? 11 : \ - (u) & (1ul << 12) ? 12 : \ - (u) & (1ul << 13) ? 13 : \ - (u) & (1ul << 14) ? 14 : \ - (u) & (1ul << 15) ? 15 : \ - (u) & (1ul << 16) ? 16 : \ - (u) & (1ul << 17) ? 17 : \ - (u) & (1ul << 18) ? 18 : \ - (u) & (1ul << 19) ? 19 : \ - (u) & (1ul << 20) ? 20 : \ - (u) & (1ul << 21) ? 21 : \ - (u) & (1ul << 22) ? 22 : \ - (u) & (1ul << 23) ? 23 : \ - (u) & (1ul << 24) ? 24 : \ - (u) & (1ul << 25) ? 25 : \ - (u) & (1ul << 26) ? 26 : \ - (u) & (1ul << 27) ? 27 : \ - (u) & (1ul << 28) ? 28 : \ - (u) & (1ul << 29) ? 29 : \ - (u) & (1ul << 30) ? 30 : \ - (u) & (1ul << 31) ? 31 : \ +# define ctz(u) ((u) & (1UL << 0) ? 0 : \ + (u) & (1UL << 1) ? 1 : \ + (u) & (1UL << 2) ? 2 : \ + (u) & (1UL << 3) ? 3 : \ + (u) & (1UL << 4) ? 4 : \ + (u) & (1UL << 5) ? 5 : \ + (u) & (1UL << 6) ? 6 : \ + (u) & (1UL << 7) ? 7 : \ + (u) & (1UL << 8) ? 8 : \ + (u) & (1UL << 9) ? 9 : \ + (u) & (1UL << 10) ? 10 : \ + (u) & (1UL << 11) ? 11 : \ + (u) & (1UL << 12) ? 12 : \ + (u) & (1UL << 13) ? 13 : \ + (u) & (1UL << 14) ? 14 : \ + (u) & (1UL << 15) ? 15 : \ + (u) & (1UL << 16) ? 16 : \ + (u) & (1UL << 17) ? 17 : \ + (u) & (1UL << 18) ? 18 : \ + (u) & (1UL << 19) ? 19 : \ + (u) & (1UL << 20) ? 20 : \ + (u) & (1UL << 21) ? 21 : \ + (u) & (1UL << 22) ? 22 : \ + (u) & (1UL << 23) ? 23 : \ + (u) & (1UL << 24) ? 24 : \ + (u) & (1UL << 25) ? 25 : \ + (u) & (1UL << 26) ? 26 : \ + (u) & (1UL << 27) ? 27 : \ + (u) & (1UL << 28) ? 28 : \ + (u) & (1UL << 29) ? 29 : \ + (u) & (1UL << 30) ? 30 : \ + (u) & (1UL << 31) ? 31 : \ 32) #endif #endif diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 81a9a0e59d..ebc16c9525 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -157,14 +157,14 @@ FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { if (stop >= start) { // no overflow, so only loop while in between start and stop: - // 0x00000000 -----------------start****stop-- 0xffffffff + // 0x00000000 -----------------start****stop-- 0xFFFFFFFF while (ccount >= start && ccount < stop) { __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); } } else { // stop did overflow, so only loop while outside of stop and start: - // 0x00000000 **stop-------------------start** 0xffffffff + // 0x00000000 **stop-------------------start** 0xFFFFFFFF while (ccount >= start || ccount < stop) { __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); } diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp index 161c04084f..307eb3fd45 100644 --- a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp +++ b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp @@ -26,7 +26,7 @@ #include "QSPIFlash.h" -#define INVALID_ADDR 0xffffffff +#define INVALID_ADDR 0xFFFFFFFF #define SECTOR_OF(a) (a & ~(SFLASH_SECTOR_SIZE - 1)) #define OFFSET_OF(a) (a & (SFLASH_SECTOR_SIZE - 1)) diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp index df3d40f159..e67808c3c4 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp @@ -45,8 +45,8 @@ #define DEFAULT_MICROSTEPPING_VALUE 32 //TMC26X register definitions -#define DRIVER_CONTROL_REGISTER 0x0ul -#define CHOPPER_CONFIG_REGISTER 0x80000ul +#define DRIVER_CONTROL_REGISTER 0x0UL +#define CHOPPER_CONFIG_REGISTER 0x80000UL #define COOL_STEP_REGISTER 0xA0000ul #define STALL_GUARD2_LOAD_MEASURE_REGISTER 0xC0000ul #define DRIVER_CONFIG_REGISTER 0xE0000ul @@ -55,58 +55,58 @@ //definitions for the driver control register #define MICROSTEPPING_PATTERN 0xFul -#define STEP_INTERPOLATION 0x200ul -#define DOUBLE_EDGE_STEP 0x100ul -#define VSENSE 0x40ul -#define READ_MICROSTEP_POSTION 0x0ul -#define READ_STALL_GUARD_READING 0x10ul -#define READ_STALL_GUARD_AND_COOL_STEP 0x20ul -#define READ_SELECTION_PATTERN 0x30ul +#define STEP_INTERPOLATION 0x200UL +#define DOUBLE_EDGE_STEP 0x100UL +#define VSENSE 0x40UL +#define READ_MICROSTEP_POSTION 0x0UL +#define READ_STALL_GUARD_READING 0x10UL +#define READ_STALL_GUARD_AND_COOL_STEP 0x20UL +#define READ_SELECTION_PATTERN 0x30UL //definitions for the chopper config register -#define CHOPPER_MODE_STANDARD 0x0ul -#define CHOPPER_MODE_T_OFF_FAST_DECAY 0x4000ul +#define CHOPPER_MODE_STANDARD 0x0UL +#define CHOPPER_MODE_T_OFF_FAST_DECAY 0x4000UL #define T_OFF_PATTERN 0xFul -#define RANDOM_TOFF_TIME 0x2000ul -#define BLANK_TIMING_PATTERN 0x18000ul +#define RANDOM_TOFF_TIME 0x2000UL +#define BLANK_TIMING_PATTERN 0x18000UL #define BLANK_TIMING_SHIFT 15 -#define HYSTERESIS_DECREMENT_PATTERN 0x1800ul +#define HYSTERESIS_DECREMENT_PATTERN 0x1800UL #define HYSTERESIS_DECREMENT_SHIFT 11 -#define HYSTERESIS_LOW_VALUE_PATTERN 0x780ul +#define HYSTERESIS_LOW_VALUE_PATTERN 0x780UL #define HYSTERESIS_LOW_SHIFT 7 -#define HYSTERESIS_START_VALUE_PATTERN 0x78ul +#define HYSTERESIS_START_VALUE_PATTERN 0x78UL #define HYSTERESIS_START_VALUE_SHIFT 4 #define T_OFF_TIMING_PATERN 0xFul //definitions for cool step register -#define MINIMUM_CURRENT_FOURTH 0x8000ul -#define CURRENT_DOWN_STEP_SPEED_PATTERN 0x6000ul +#define MINIMUM_CURRENT_FOURTH 0x8000UL +#define CURRENT_DOWN_STEP_SPEED_PATTERN 0x6000UL #define SE_MAX_PATTERN 0xF00ul -#define SE_CURRENT_STEP_WIDTH_PATTERN 0x60ul +#define SE_CURRENT_STEP_WIDTH_PATTERN 0x60UL #define SE_MIN_PATTERN 0xFul //definitions for StallGuard2 current register -#define STALL_GUARD_FILTER_ENABLED 0x10000ul +#define STALL_GUARD_FILTER_ENABLED 0x10000UL #define STALL_GUARD_TRESHHOLD_VALUE_PATTERN 0x17F00ul #define CURRENT_SCALING_PATTERN 0x1Ful #define STALL_GUARD_CONFIG_PATTERN 0x17F00ul #define STALL_GUARD_VALUE_PATTERN 0x7F00ul //definitions for the input from the TMC2660 -#define STATUS_STALL_GUARD_STATUS 0x1ul -#define STATUS_OVER_TEMPERATURE_SHUTDOWN 0x2ul -#define STATUS_OVER_TEMPERATURE_WARNING 0x4ul -#define STATUS_SHORT_TO_GROUND_A 0x8ul -#define STATUS_SHORT_TO_GROUND_B 0x10ul -#define STATUS_OPEN_LOAD_A 0x20ul -#define STATUS_OPEN_LOAD_B 0x40ul -#define STATUS_STAND_STILL 0x80ul +#define STATUS_STALL_GUARD_STATUS 0x1UL +#define STATUS_OVER_TEMPERATURE_SHUTDOWN 0x2UL +#define STATUS_OVER_TEMPERATURE_WARNING 0x4UL +#define STATUS_SHORT_TO_GROUND_A 0x8UL +#define STATUS_SHORT_TO_GROUND_B 0x10UL +#define STATUS_OPEN_LOAD_A 0x20UL +#define STATUS_OPEN_LOAD_B 0x40UL +#define STATUS_STAND_STILL 0x80UL #define READOUT_VALUE_PATTERN 0xFFC00ul #define CPU_32_BIT //default values -#define INITIAL_MICROSTEPPING 0x3ul //32th microstepping +#define INITIAL_MICROSTEPPING 0x3UL //32th microstepping SPIClass SPI_6(SPI6, SPI6_MOSI_PIN, SPI6_MISO_PIN, SPI6_SCK_PIN); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 5fc65680d3..8ab358e9e1 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -65,7 +65,7 @@ typedef int8_t pin_t; #ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) + #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) #endif #define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 30db40dfac..2b735d6224 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -68,7 +68,7 @@ typedef int8_t pin_t; #ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) + #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) #endif #define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); __disable_irq() diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 1aff6eed8e..75c10e9395 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -78,7 +78,7 @@ typedef int8_t pin_t; #ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) + #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) #endif #define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); __disable_irq() diff --git a/Marlin/src/feature/dac/dac_mcp4728.h b/Marlin/src/feature/dac/dac_mcp4728.h index 6cce77856a..fc69bd8ff4 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.h +++ b/Marlin/src/feature/dac/dac_mcp4728.h @@ -40,7 +40,7 @@ #endif #ifndef lowByte - #define lowByte(w) ((uint8_t) ((w) & 0xff)) + #define lowByte(w) ((uint8_t) ((w) & 0xFF)) #endif #ifndef highByte diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index d96939c916..b65a1254c6 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -38,7 +38,7 @@ #define CHOPPER_09STEP_24V { 3, -1, 5 } #if ENABLED(MONITOR_DRIVER_STATUS) && !defined(MONITOR_DRIVER_STATUS_INTERVAL_MS) - #define MONITOR_DRIVER_STATUS_INTERVAL_MS 500u + #define MONITOR_DRIVER_STATUS_INTERVAL_MS 500U #endif constexpr uint16_t _tmc_thrs(const uint16_t msteps, const uint32_t thrs, const uint32_t spmm) { diff --git a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp index 6cf660a6a9..51681a8009 100644 --- a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp @@ -461,8 +461,8 @@ static const TFTGLCD_charmap_t g_TFTGLCD_charmap_device[] PROGMEM = { #ifdef CONVERT_TO_EXT_ASCII {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) - {IV('²'), 0x0e, 0}, // 0x32 if no special symbol in panel font - {IV('³'), 0x0f, 0}, // 0x33 if no special symbol in panel font + {IV('²'), 0x0E, 0}, // 0x32 if no special symbol in panel font + {IV('³'), 0x0F, 0}, // 0x33 if no special symbol in panel font // translate to cp866 codepage //first ASCII symbols in panel font must be replaced with Marlin special symbols diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp index fd1b6858e8..a537d92081 100644 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp @@ -70,14 +70,14 @@ TFTGLCD lcd; #define ICON_BED B00010000 #define ICON_FAN B00100000 #define ICON_HOT B01000000 //when any T > 50deg -#define PIC_MASK 0x7f +#define PIC_MASK 0x7F //LEDs not used, for compatibility with Smoothieware #define LED_HOTEND_ON B00000001 #define LED_BED_ON B00000010 #define LED_FAN_ON B00000100 #define LED_HOT B00001000 -#define LED_MASK 0x0f +#define LED_MASK 0x0F #define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2) diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h index 7a354aa738..cd9cb3cdc9 100644 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h @@ -34,156 +34,156 @@ */ #include const u8g_fntpgm_uint8_t u8g_font_6x9[2434] U8G_FONT_SECTION(".progmem.u8g_font_6x9") = { - 0x00,0x06,0x09,0x00,0xfe,0x06,0x02,0x0f,0x03,0x84,0x01,0xff,0xfe,0x07,0xfe,0x06, - 0xfe,0x05,0x07,0x07,0x00,0x00,0x00,0x40,0xf0,0xc8,0x88,0x98,0x78,0x10,0x05,0x07, - 0x07,0x00,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05,0x00,0x00, - 0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xf8,0x20, - 0x20,0x20,0xe0,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xa8,0xb8,0x88,0x70,0x20, - 0x06,0x05,0x05,0x00,0x00,0x00,0xb0,0xd8,0x6c,0xd8,0xb0,0x05,0x08,0x08,0x00,0x00, - 0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0xa8,0xf8,0x05,0x09,0x09,0x00,0x00,0xfe,0x20, - 0x50,0x50,0x50,0x50,0x88,0xa8,0x88,0x70,0x03,0x03,0x03,0x00,0x00,0x03,0x40,0xa0, - 0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x06,0x06, - 0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x03,0xa0, - 0xa0,0xa0,0x05,0x07,0x07,0x06,0x00,0xff,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x05, - 0x09,0x09,0x06,0x00,0xfe,0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x06,0x08, - 0x08,0x06,0x00,0xff,0x40,0xa8,0x48,0x10,0x20,0x48,0x54,0x08,0x05,0x07,0x07,0x06, - 0x00,0xff,0x60,0x90,0x90,0x60,0x98,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x03,0x80, - 0x80,0x80,0x02,0x07,0x07,0x06,0x02,0xff,0x40,0x80,0x80,0x80,0x80,0x80,0x40,0x02, - 0x07,0x07,0x06,0x02,0xff,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x05,0x05,0x05,0x06, - 0x00,0x00,0x88,0x50,0xf8,0x50,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x20,0x20,0xf8, - 0x20,0x20,0x02,0x04,0x04,0x06,0x02,0xfe,0xc0,0x40,0x40,0x80,0x05,0x01,0x01,0x06, - 0x00,0x02,0xf8,0x02,0x02,0x02,0x06,0x02,0x00,0xc0,0xc0,0x04,0x06,0x06,0x06,0x01, + 0x00,0x06,0x09,0x00,0xFE,0x06,0x02,0x0F,0x03,0x84,0x01,0xFF,0xFE,0x07,0xFE,0x06, + 0xFE,0x05,0x07,0x07,0x00,0x00,0x00,0x40,0xF0,0xC8,0x88,0x98,0x78,0x10,0x05,0x07, + 0x07,0x00,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05,0x00,0x00, + 0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xF8,0x20, + 0x20,0x20,0xE0,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xA8,0xB8,0x88,0x70,0x20, + 0x06,0x05,0x05,0x00,0x00,0x00,0xB0,0xD8,0x6C,0xD8,0xB0,0x05,0x08,0x08,0x00,0x00, + 0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0xA8,0xF8,0x05,0x09,0x09,0x00,0x00,0xFE,0x20, + 0x50,0x50,0x50,0x50,0x88,0xA8,0x88,0x70,0x03,0x03,0x03,0x00,0x00,0x03,0x40,0xA0, + 0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x06,0x05,0xFF,0x01,0x06,0x06, + 0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x03,0xA0, + 0xA0,0xA0,0x05,0x07,0x07,0x06,0x00,0xFF,0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x05, + 0x09,0x09,0x06,0x00,0xFE,0x20,0x70,0xA8,0xA0,0x70,0x28,0xA8,0x70,0x20,0x06,0x08, + 0x08,0x06,0x00,0xFF,0x40,0xA8,0x48,0x10,0x20,0x48,0x54,0x08,0x05,0x07,0x07,0x06, + 0x00,0xFF,0x60,0x90,0x90,0x60,0x98,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x03,0x80, + 0x80,0x80,0x02,0x07,0x07,0x06,0x02,0xFF,0x40,0x80,0x80,0x80,0x80,0x80,0x40,0x02, + 0x07,0x07,0x06,0x02,0xFF,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x05,0x05,0x05,0x06, + 0x00,0x00,0x88,0x50,0xF8,0x50,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x20,0x20,0xF8, + 0x20,0x20,0x02,0x04,0x04,0x06,0x02,0xFE,0xC0,0x40,0x40,0x80,0x05,0x01,0x01,0x06, + 0x00,0x02,0xF8,0x02,0x02,0x02,0x06,0x02,0x00,0xC0,0xC0,0x04,0x06,0x06,0x06,0x01, 0x00,0x10,0x10,0x20,0x40,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x90, - 0x90,0x90,0x60,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0xe0,0x04, - 0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x10,0x20,0x40,0xf0,0x04,0x06,0x06,0x06,0x01, - 0x00,0xf0,0x20,0x60,0x10,0x10,0xe0,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0x30,0x50, - 0x90,0xf8,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xf0,0x80,0xe0,0x10,0x10,0xe0,0x04, - 0x06,0x06,0x06,0x01,0x00,0x60,0x80,0xe0,0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01, - 0x00,0xf0,0x10,0x10,0x20,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x60, + 0x90,0x90,0x60,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0xE0,0x04, + 0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x10,0x20,0x40,0xF0,0x04,0x06,0x06,0x06,0x01, + 0x00,0xF0,0x20,0x60,0x10,0x10,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0x30,0x50, + 0x90,0xF8,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xF0,0x80,0xE0,0x10,0x10,0xE0,0x04, + 0x06,0x06,0x06,0x01,0x00,0x60,0x80,0xE0,0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01, + 0x00,0xF0,0x10,0x10,0x20,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x60, 0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x90,0x70,0x10,0x60,0x02, - 0x05,0x05,0x06,0x02,0x00,0xc0,0xc0,0x00,0xc0,0xc0,0x02,0x07,0x07,0x06,0x02,0xfe, - 0xc0,0xc0,0x00,0xc0,0x40,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x18,0x60,0x80, - 0x60,0x18,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x00,0xf8,0x05,0x05,0x05,0x06,0x00, - 0x00,0xc0,0x30,0x08,0x30,0xc0,0x04,0x07,0x07,0x06,0x01,0x00,0x60,0x90,0x10,0x60, - 0x40,0x00,0x40,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x90,0xa8,0xb0,0x80,0x70,0x05, - 0x06,0x06,0x06,0x00,0x00,0x20,0x50,0x88,0xf8,0x88,0x88,0x05,0x06,0x06,0x06,0x00, - 0x00,0xf0,0x88,0xf0,0x88,0x88,0xf0,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, - 0x80,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0xe0,0x90,0x90,0x90,0x90,0xe0,0x04, - 0x06,0x06,0x06,0x01,0x00,0xf0,0x80,0xe0,0x80,0x80,0xf0,0x04,0x06,0x06,0x06,0x01, - 0x00,0xf0,0x80,0xe0,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, - 0xb0,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0xf0,0x90,0x90,0x90,0x03, - 0x06,0x06,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0xe0,0x05,0x06,0x06,0x06,0x00, - 0x00,0x38,0x10,0x10,0x10,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0xa0,0xc0, - 0xa0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x80,0x80,0x80,0xf0,0x05, - 0x06,0x06,0x06,0x00,0x00,0x88,0xd8,0xa8,0xa8,0x88,0x88,0x04,0x06,0x06,0x06,0x01, - 0x00,0x90,0xd0,0xb0,0x90,0x90,0x90,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x88,0x88, - 0x88,0x88,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0xe0,0x90,0x90,0xe0,0x80,0x80,0x04, - 0x07,0x07,0x06,0x01,0xff,0x60,0x90,0x90,0xd0,0xb0,0x60,0x10,0x04,0x06,0x06,0x06, - 0x01,0x00,0xe0,0x90,0x90,0xe0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90, - 0x40,0x20,0x90,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20, + 0x05,0x05,0x06,0x02,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x02,0x07,0x07,0x06,0x02,0xFE, + 0xC0,0xC0,0x00,0xC0,0x40,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x18,0x60,0x80, + 0x60,0x18,0x05,0x03,0x03,0x06,0x00,0x01,0xF8,0x00,0xF8,0x05,0x05,0x05,0x06,0x00, + 0x00,0xC0,0x30,0x08,0x30,0xC0,0x04,0x07,0x07,0x06,0x01,0x00,0x60,0x90,0x10,0x60, + 0x40,0x00,0x40,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x90,0xA8,0xB0,0x80,0x70,0x05, + 0x06,0x06,0x06,0x00,0x00,0x20,0x50,0x88,0xF8,0x88,0x88,0x05,0x06,0x06,0x06,0x00, + 0x00,0xF0,0x88,0xF0,0x88,0x88,0xF0,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, + 0x80,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x04, + 0x06,0x06,0x06,0x01,0x00,0xF0,0x80,0xE0,0x80,0x80,0xF0,0x04,0x06,0x06,0x06,0x01, + 0x00,0xF0,0x80,0xE0,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, + 0xB0,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0xF0,0x90,0x90,0x90,0x03, + 0x06,0x06,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0xE0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x38,0x10,0x10,0x10,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0xA0,0xC0, + 0xA0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x80,0x80,0x80,0xF0,0x05, + 0x06,0x06,0x06,0x00,0x00,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x04,0x06,0x06,0x06,0x01, + 0x00,0x90,0xD0,0xB0,0x90,0x90,0x90,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x88,0x88, + 0x88,0x88,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x90,0x90,0xE0,0x80,0x80,0x04, + 0x07,0x07,0x06,0x01,0xFF,0x60,0x90,0x90,0xD0,0xB0,0x60,0x10,0x04,0x06,0x06,0x06, + 0x01,0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90, + 0x40,0x20,0x90,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20, 0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0x90,0x90,0x90,0x60,0x04,0x06,0x06,0x06, - 0x01,0x00,0x90,0x90,0x90,0xf0,0x60,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88, - 0xa8,0xa8,0xd8,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88, + 0x01,0x00,0x90,0x90,0x90,0xF0,0x60,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88, + 0xA8,0xA8,0xD8,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88, 0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06, - 0x01,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x03,0x06,0x06,0x06,0x01,0x00,0xe0,0x80, - 0x80,0x80,0x80,0xe0,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x40,0x20,0x10,0x10, - 0x03,0x06,0x06,0x06,0x01,0x00,0xe0,0x20,0x20,0x20,0x20,0xe0,0x05,0x03,0x03,0x06, - 0x00,0x03,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00,0xfe,0xf8,0x02,0x02,0x02,0x06, + 0x01,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x03,0x06,0x06,0x06,0x01,0x00,0xE0,0x80, + 0x80,0x80,0x80,0xE0,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x40,0x20,0x10,0x10, + 0x03,0x06,0x06,0x06,0x01,0x00,0xE0,0x20,0x20,0x20,0x20,0xE0,0x05,0x03,0x03,0x06, + 0x00,0x03,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00,0xFE,0xF8,0x02,0x02,0x02,0x06, 0x02,0x04,0x80,0x40,0x04,0x04,0x04,0x06,0x01,0x00,0x70,0x90,0x90,0x70,0x04,0x06, - 0x06,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0x90,0xe0,0x04,0x04,0x04,0x06,0x01,0x00, + 0x06,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0x90,0xE0,0x04,0x04,0x04,0x06,0x01,0x00, 0x70,0x80,0x80,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x10,0x10,0x70,0x90,0x90,0x70, - 0x04,0x04,0x04,0x06,0x01,0x00,0x60,0xb0,0xc0,0x70,0x04,0x06,0x06,0x06,0x01,0x00, - 0x20,0x50,0x40,0xe0,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0xfe,0x60,0x90,0x90,0x70, - 0x10,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0x03,0x06, - 0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0xfe, - 0x20,0x00,0x60,0x20,0x20,0x20,0xa0,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80, - 0xa0,0xc0,0xa0,0x90,0x03,0x06,0x06,0x06,0x01,0x00,0xc0,0x40,0x40,0x40,0x40,0xe0, - 0x05,0x04,0x04,0x06,0x00,0x00,0xd0,0xa8,0xa8,0x88,0x04,0x04,0x04,0x06,0x01,0x00, - 0xe0,0x90,0x90,0x90,0x04,0x04,0x04,0x06,0x01,0x00,0x60,0x90,0x90,0x60,0x04,0x06, - 0x06,0x06,0x01,0xfe,0xe0,0x90,0x90,0xe0,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xfe, - 0x70,0x90,0x90,0x70,0x10,0x10,0x04,0x04,0x04,0x06,0x01,0x00,0xa0,0xd0,0x80,0x80, - 0x04,0x04,0x04,0x06,0x01,0x00,0x70,0xc0,0x30,0xe0,0x04,0x06,0x06,0x06,0x01,0x00, - 0x40,0x40,0xe0,0x40,0x50,0x20,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x90,0x70, + 0x04,0x04,0x04,0x06,0x01,0x00,0x60,0xB0,0xC0,0x70,0x04,0x06,0x06,0x06,0x01,0x00, + 0x20,0x50,0x40,0xE0,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0xFE,0x60,0x90,0x90,0x70, + 0x10,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x03,0x06, + 0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x08,0x08,0x06,0x01,0xFE, + 0x20,0x00,0x60,0x20,0x20,0x20,0xA0,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80, + 0xA0,0xC0,0xA0,0x90,0x03,0x06,0x06,0x06,0x01,0x00,0xC0,0x40,0x40,0x40,0x40,0xE0, + 0x05,0x04,0x04,0x06,0x00,0x00,0xD0,0xA8,0xA8,0x88,0x04,0x04,0x04,0x06,0x01,0x00, + 0xE0,0x90,0x90,0x90,0x04,0x04,0x04,0x06,0x01,0x00,0x60,0x90,0x90,0x60,0x04,0x06, + 0x06,0x06,0x01,0xFE,0xE0,0x90,0x90,0xE0,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xFE, + 0x70,0x90,0x90,0x70,0x10,0x10,0x04,0x04,0x04,0x06,0x01,0x00,0xA0,0xD0,0x80,0x80, + 0x04,0x04,0x04,0x06,0x01,0x00,0x70,0xC0,0x30,0xE0,0x04,0x06,0x06,0x06,0x01,0x00, + 0x40,0x40,0xE0,0x40,0x50,0x20,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x90,0x70, 0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x60,0x60,0x05,0x04,0x04,0x06,0x00,0x00, - 0x88,0xa8,0xa8,0x50,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x60,0x60,0x90,0x04,0x06, - 0x06,0x06,0x01,0xfe,0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x04,0x04,0x06,0x01,0x00, - 0xf0,0x20,0x40,0xf0,0x03,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x40,0x80,0x40,0x40, - 0x20,0x01,0x07,0x07,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x07, + 0x88,0xA8,0xA8,0x50,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x60,0x60,0x90,0x04,0x06, + 0x06,0x06,0x01,0xFE,0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x04,0x04,0x06,0x01,0x00, + 0xF0,0x20,0x40,0xF0,0x03,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x40,0x80,0x40,0x40, + 0x20,0x01,0x07,0x07,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x07, 0x07,0x06,0x01,0x00,0x80,0x40,0x40,0x20,0x40,0x40,0x80,0x04,0x02,0x02,0x06,0x01, - 0x03,0x50,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x06,0x06,0x06,0x02,0x00, - 0x80,0x00,0x80,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xff,0x20,0x70,0xa0,0xa0, - 0x70,0x20,0x05,0x07,0x07,0x06,0x00,0xff,0x30,0x48,0x40,0xf0,0x40,0x40,0xf8,0x05, - 0x05,0x05,0x06,0x00,0x00,0xa8,0x50,0x88,0x50,0xa8,0x05,0x06,0x06,0x06,0x00,0x00, - 0x88,0x50,0xf8,0x20,0xf8,0x20,0x01,0x07,0x07,0x06,0x02,0xff,0x80,0x80,0x80,0x00, - 0x80,0x80,0x80,0x04,0x07,0x07,0x06,0x01,0xff,0x70,0x80,0x60,0x90,0x60,0x10,0xe0, - 0x03,0x01,0x01,0x06,0x01,0x05,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0x94, - 0xa4,0x94,0x84,0x78,0x03,0x05,0x05,0x06,0x01,0x01,0x60,0xa0,0x60,0x00,0xe0,0x05, - 0x05,0x05,0x06,0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x04,0x03,0x03,0x06,0x01,0x00, - 0xf0,0x10,0x10,0x04,0x01,0x01,0x06,0x01,0x02,0xf0,0x06,0x07,0x07,0x06,0x00,0x00, - 0x78,0x84,0xb4,0xa4,0xa4,0x84,0x78,0x04,0x01,0x01,0x06,0x01,0x05,0xf0,0x04,0x03, - 0x03,0x06,0x01,0x02,0x60,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x20,0xf8, - 0x20,0x20,0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xa0,0x20,0x40,0xe0,0x03, - 0x05,0x05,0x06,0x01,0x01,0xc0,0x20,0x40,0x20,0xc0,0x02,0x02,0x02,0x06,0x02,0x04, - 0x40,0x80,0x04,0x05,0x05,0x06,0x01,0xff,0x90,0x90,0xb0,0xd0,0x80,0x05,0x06,0x06, - 0x06,0x00,0x00,0x78,0xe8,0xe8,0x68,0x28,0x28,0x01,0x01,0x01,0x06,0x02,0x02,0x80, - 0x02,0x02,0x02,0x06,0x02,0xfe,0x40,0x80,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xc0, - 0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xa0,0x40,0x00,0xe0,0x05,0x05, - 0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x08,0x08,0x06,0x00,0xff,0x40, - 0xc0,0x40,0x50,0x70,0x30,0x78,0x10,0x05,0x08,0x08,0x06,0x00,0xff,0x40,0xc0,0x40, - 0x50,0x68,0x08,0x10,0x38,0x05,0x08,0x08,0x06,0x00,0xff,0xc0,0x20,0x40,0x30,0xf0, + 0x03,0x50,0xA0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x06,0x05,0xFF,0x01,0x06,0x06,0x06,0x02,0x00, + 0x80,0x00,0x80,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xFF,0x20,0x70,0xA0,0xA0, + 0x70,0x20,0x05,0x07,0x07,0x06,0x00,0xFF,0x30,0x48,0x40,0xF0,0x40,0x40,0xF8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xA8,0x50,0x88,0x50,0xA8,0x05,0x06,0x06,0x06,0x00,0x00, + 0x88,0x50,0xF8,0x20,0xF8,0x20,0x01,0x07,0x07,0x06,0x02,0xFF,0x80,0x80,0x80,0x00, + 0x80,0x80,0x80,0x04,0x07,0x07,0x06,0x01,0xFF,0x70,0x80,0x60,0x90,0x60,0x10,0xE0, + 0x03,0x01,0x01,0x06,0x01,0x05,0xA0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0x94, + 0xA4,0x94,0x84,0x78,0x03,0x05,0x05,0x06,0x01,0x01,0x60,0xA0,0x60,0x00,0xE0,0x05, + 0x05,0x05,0x06,0x00,0x00,0x28,0x50,0xA0,0x50,0x28,0x04,0x03,0x03,0x06,0x01,0x00, + 0xF0,0x10,0x10,0x04,0x01,0x01,0x06,0x01,0x02,0xF0,0x06,0x07,0x07,0x06,0x00,0x00, + 0x78,0x84,0xB4,0xA4,0xA4,0x84,0x78,0x04,0x01,0x01,0x06,0x01,0x05,0xF0,0x04,0x03, + 0x03,0x06,0x01,0x02,0x60,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0xFF,0x20,0x20,0xF8, + 0x20,0x20,0x00,0xF8,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xA0,0x20,0x40,0xE0,0x03, + 0x05,0x05,0x06,0x01,0x01,0xC0,0x20,0x40,0x20,0xC0,0x02,0x02,0x02,0x06,0x02,0x04, + 0x40,0x80,0x04,0x05,0x05,0x06,0x01,0xFF,0x90,0x90,0xB0,0xD0,0x80,0x05,0x06,0x06, + 0x06,0x00,0x00,0x78,0xE8,0xE8,0x68,0x28,0x28,0x01,0x01,0x01,0x06,0x02,0x02,0x80, + 0x02,0x02,0x02,0x06,0x02,0xFE,0x40,0x80,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xC0, + 0x40,0x40,0xE0,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xA0,0x40,0x00,0xE0,0x05,0x05, + 0x05,0x06,0x00,0x00,0xA0,0x50,0x28,0x50,0xA0,0x05,0x08,0x08,0x06,0x00,0xFF,0x40, + 0xC0,0x40,0x50,0x70,0x30,0x78,0x10,0x05,0x08,0x08,0x06,0x00,0xFF,0x40,0xC0,0x40, + 0x50,0x68,0x08,0x10,0x38,0x05,0x08,0x08,0x06,0x00,0xFF,0xC0,0x20,0x40,0x30,0xF0, 0x30,0x78,0x10,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x00,0x20,0x60,0x80,0x90,0x60, 0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x20,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07, 0x06,0x00,0x00,0x10,0x20,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00, 0x20,0x50,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x50,0x20, 0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x20,0x50,0x70,0x88, 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x50,0x20,0x50,0x70,0x88,0x88,0x05,0x06, - 0x06,0x06,0x00,0x00,0x78,0xa0,0xf0,0xa0,0xa0,0xb8,0x04,0x08,0x08,0x06,0x01,0xfe, + 0x06,0x06,0x00,0x00,0x78,0xA0,0xF0,0xA0,0xA0,0xB8,0x04,0x08,0x08,0x06,0x01,0xFE, 0x60,0x90,0x80,0x80,0x90,0x60,0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20, - 0xf0,0x80,0xe0,0x80,0xf0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0xf0,0x80,0xe0, - 0x80,0xf0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0xf0,0x80,0xe0,0x80,0xf0,0x04, - 0x07,0x07,0x06,0x01,0x00,0x50,0x00,0xf0,0x80,0xe0,0x80,0xf0,0x03,0x07,0x07,0x06, - 0x01,0x00,0x80,0x40,0xe0,0x40,0x40,0x40,0xe0,0x03,0x07,0x07,0x06,0x01,0x00,0x20, - 0x40,0xe0,0x40,0x40,0x40,0xe0,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xa0,0xe0,0x40, - 0x40,0x40,0xe0,0x03,0x07,0x07,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40,0xe0, - 0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x48,0xe8,0x48,0x48,0x70,0x04,0x07,0x07,0x06, - 0x01,0x00,0x50,0xa0,0x90,0xd0,0xb0,0x90,0x90,0x04,0x07,0x07,0x06,0x01,0x00,0x40, + 0xF0,0x80,0xE0,0x80,0xF0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0xF0,0x80,0xE0, + 0x80,0xF0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0xF0,0x80,0xE0,0x80,0xF0,0x04, + 0x07,0x07,0x06,0x01,0x00,0x50,0x00,0xF0,0x80,0xE0,0x80,0xF0,0x03,0x07,0x07,0x06, + 0x01,0x00,0x80,0x40,0xE0,0x40,0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0x20, + 0x40,0xE0,0x40,0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xA0,0xE0,0x40, + 0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40,0x40,0x40,0xE0, + 0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x48,0xE8,0x48,0x48,0x70,0x04,0x07,0x07,0x06, + 0x01,0x00,0x50,0xA0,0x90,0xD0,0xB0,0x90,0x90,0x04,0x07,0x07,0x06,0x01,0x00,0x40, 0x20,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x60,0x90, 0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0x60,0x90,0x90,0x90,0x60, - 0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xa0,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07, + 0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07, 0x06,0x01,0x00,0x50,0x00,0x60,0x90,0x90,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00, - 0x88,0x50,0x20,0x50,0x88,0x04,0x08,0x08,0x06,0x01,0xff,0x10,0x70,0xb0,0xb0,0xd0, - 0xd0,0xe0,0x80,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x90,0x90,0x90,0x90,0x60, + 0x88,0x50,0x20,0x50,0x88,0x04,0x08,0x08,0x06,0x01,0xFF,0x10,0x70,0xB0,0xB0,0xD0, + 0xD0,0xE0,0x80,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x90,0x90,0x90,0x90,0x60, 0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x90,0x90,0x90,0x90,0x60,0x04,0x07,0x07, 0x06,0x01,0x00,0x20,0x50,0x90,0x90,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00, 0x50,0x00,0x90,0x90,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x20,0x88, - 0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0xe0,0x90,0x90,0xe0,0x80, - 0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0xa0,0xa0,0x90,0xa0,0x04,0x07,0x07,0x06, + 0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0xE0,0x90,0x90,0xE0,0x80, + 0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0xA0,0xA0,0x90,0xA0,0x04,0x07,0x07,0x06, 0x01,0x00,0x40,0x20,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, 0x40,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0x00,0x70, - 0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xa0,0x00,0x70,0x90,0x90,0x70, + 0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0x70,0x90,0x90,0x70, 0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06, 0x01,0x00,0x20,0x50,0x20,0x70,0x90,0x90,0x70,0x05,0x04,0x04,0x06,0x00,0x00,0x70, - 0xa8,0xb0,0x78,0x04,0x06,0x06,0x06,0x01,0xfe,0x70,0x80,0x80,0x70,0x20,0x40,0x04, - 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0xb0,0xc0,0x70,0x04,0x07,0x07,0x06, - 0x01,0x00,0x20,0x40,0x00,0x60,0xb0,0xc0,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, - 0x50,0x00,0x60,0xb0,0xc0,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0xb0, - 0xc0,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03, - 0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x07,0x07,0x06, - 0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0xe0,0x03,0x06,0x06,0x06,0x01,0x00,0xa0, - 0x00,0xc0,0x40,0x40,0xe0,0x04,0x07,0x07,0x06,0x01,0x00,0x30,0x60,0x10,0x70,0x90, - 0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xa0,0x00,0xe0,0x90,0x90,0x90,0x04, + 0xA8,0xB0,0x78,0x04,0x06,0x06,0x06,0x01,0xFE,0x70,0x80,0x80,0x70,0x20,0x40,0x04, + 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0xB0,0xC0,0x70,0x04,0x07,0x07,0x06, + 0x01,0x00,0x20,0x40,0x00,0x60,0xB0,0xC0,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, + 0x50,0x00,0x60,0xB0,0xC0,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0xB0, + 0xC0,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x80,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03, + 0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x07,0x07,0x06, + 0x01,0x00,0x40,0xA0,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06,0x06,0x01,0x00,0xA0, + 0x00,0xC0,0x40,0x40,0xE0,0x04,0x07,0x07,0x06,0x01,0x00,0x30,0x60,0x10,0x70,0x90, + 0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0xE0,0x90,0x90,0x90,0x04, 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06, 0x01,0x00,0x20,0x40,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20, - 0x50,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xa0,0x00,0x60, + 0x50,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0x60, 0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0x90,0x90,0x60,0x05, - 0x05,0x05,0x06,0x00,0x00,0x20,0x00,0xf8,0x00,0x20,0x04,0x04,0x04,0x06,0x01,0x00, - 0x70,0xb0,0xd0,0xe0,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x90,0x90,0x90, + 0x05,0x05,0x06,0x00,0x00,0x20,0x00,0xF8,0x00,0x20,0x04,0x04,0x04,0x06,0x01,0x00, + 0x70,0xB0,0xD0,0xE0,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x90,0x90,0x90, 0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0x90,0x90,0x90,0x70,0x04,0x07, 0x07,0x06,0x01,0x00,0x20,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x06,0x06,0x06,0x01, - 0x00,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x09,0x09,0x06,0x01,0xfe,0x20,0x40,0x00, - 0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x08,0x08,0x06,0x01,0xfe,0x80,0x80,0xe0,0x90, - 0x90,0xe0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0xfe,0x50,0x00,0x90,0x90,0x90,0x70, + 0x00,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x09,0x09,0x06,0x01,0xFE,0x20,0x40,0x00, + 0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x08,0x08,0x06,0x01,0xFE,0x80,0x80,0xE0,0x90, + 0x90,0xE0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0xFE,0x50,0x00,0x90,0x90,0x90,0x70, 0x90,0x60}; diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h index 276cae522a..b4b615da4d 100644 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h @@ -33,89 +33,89 @@ Max Font ascent = 8 descent=-2 */ const u8g_fntpgm_uint8_t ISO10646_1_5x7[1324] U8G_FONT_SECTION("ISO10646_1_5x7") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x25,0x03,0xbb,0x01,0x7f,0xfe,0x08,0xfe,0x08, - 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, - 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, - 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, - 0xb8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xd8,0x6c,0x36,0x6c,0xd8, - 0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8,0x05, - 0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70,0x03, - 0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, - 0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00, - 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00,0x00, - 0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0, - 0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20,0x40, - 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x01, - 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40, - 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40, - 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70,0x20, - 0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02,0x03, - 0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02,0x02, - 0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20, - 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70, - 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07, - 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50, - 0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x07,0x02,0x25,0x03,0xBB,0x01,0x7F,0xFE,0x08,0xFE,0x08, + 0xFE,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xF0,0xC8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xF8,0x20,0x20,0x20,0x20,0xE0,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA8, + 0xB8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xD8,0x6C,0x36,0x6C,0xD8, + 0x05,0x09,0x09,0x06,0x00,0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0xF8,0x05, + 0x0A,0x0A,0x06,0x00,0xFE,0x20,0x50,0x50,0x50,0x50,0x88,0xA8,0xA8,0x88,0x70,0x03, + 0x03,0x03,0x06,0x00,0x03,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00, + 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xA0,0xA0,0xA0,0x05,0x06,0x06,0x06,0x00,0x00, + 0x50,0xF8,0x50,0x50,0xF8,0x50,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA0, + 0x70,0x28,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xC8,0xC8,0x10,0x20,0x40, + 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68,0x01, + 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40, + 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40, + 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xA8,0x70,0x20, + 0x70,0xA8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xF8,0x20,0x20,0x02,0x03, + 0x03,0x06,0x01,0xFF,0xC0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xF8,0x02,0x02, + 0x02,0x06,0x01,0x00,0xC0,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20, + 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xA8,0xC8,0x88,0x70, + 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xF8,0x05,0x07,0x07,0x06,0x00,0x00, + 0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50, + 0x90,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0xF0,0x08,0x08,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xF0,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0,0xc0, - 0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05,0x06, - 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00,0xf8, + 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xC0,0xC0,0x00,0xC0,0xC0, + 0x02,0x06,0x06,0x06,0x01,0xFF,0xC0,0xC0,0x00,0xC0,0x40,0x80,0x03,0x05,0x05,0x06, + 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xF8,0x00,0xF8, 0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00, 0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88, - 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0,0x05, + 0xB8,0xA8,0xB8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0,0x05, 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, - 0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0, + 0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8, + 0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0, 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07,0x07, - 0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00, - 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0, - 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80, - 0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88, - 0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xa8, - 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,0x05, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x03,0x07,0x07, + 0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, + 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88, + 0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xA8, + 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x05, 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88, + 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88, 0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, - 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8,0x50, + 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8,0x50, 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,0x07, 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20, - 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00, - 0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88, - 0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07, + 0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20, + 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0xE0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00, + 0xFE,0xF8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88, + 0x88,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07, 0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xe0, - 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07,0x07, - 0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01,0xfe, + 0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xE0, + 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x88,0x88,0x78,0x08,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x03,0x07,0x07, + 0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x04,0x09,0x09,0x06,0x01,0xFE, 0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80, - 0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40,0x40, - 0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05,0x05, - 0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70, - 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, - 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05, - 0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78, - 0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x80,0x88,0x90,0xE0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xC0,0x40,0x40,0x40, + 0x40,0x40,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x05,0x05, + 0x05,0x06,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70, + 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, + 0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78, + 0x80,0x70,0x08,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, 0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,0x06, - 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xa8, - 0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07, - 0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40,0x80, - 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40,0x40, - 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff}; + 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xA8, + 0xA8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07, + 0x06,0x00,0xFE,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0xF8,0x10,0x20,0x40,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40,0x40,0x40,0x80, + 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40,0x40,0x20,0x40,0x40, + 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xA8,0x90,0xFF}; #else // extended (original) font (symbols 1 - 255) @@ -131,171 +131,171 @@ const u8g_fntpgm_uint8_t ISO10646_1_5x7[1324] U8G_FONT_SECTION("ISO10646_1_5x7") Max Font ascent =10 descent=-2 */ const u8g_fntpgm_uint8_t ISO10646_1_5x7[2647] U8G_FONT_SECTION("ISO10646_1_5x7") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x25,0x03,0xbb,0x01,0xff,0xfe,0x0a,0xfe,0x08, - 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, - 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, - 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, - 0xb8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xd8,0x6c,0x36,0x6c,0xd8, - 0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8,0x05, - 0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70,0x03, - 0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, - 0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00, - 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00,0x00, - 0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0, - 0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20,0x40, - 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x01, - 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40, - 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40, - 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70,0x20, - 0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02,0x03, - 0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02,0x02, - 0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20, - 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70, - 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07, - 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50, - 0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x07,0x02,0x25,0x03,0xBB,0x01,0xFF,0xFE,0x0A,0xFE,0x08, + 0xFE,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xF0,0xC8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xF8,0x20,0x20,0x20,0x20,0xE0,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA8, + 0xB8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xD8,0x6C,0x36,0x6C,0xD8, + 0x05,0x09,0x09,0x06,0x00,0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0xF8,0x05, + 0x0A,0x0A,0x06,0x00,0xFE,0x20,0x50,0x50,0x50,0x50,0x88,0xA8,0xA8,0x88,0x70,0x03, + 0x03,0x03,0x06,0x00,0x03,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00, + 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xA0,0xA0,0xA0,0x05,0x06,0x06,0x06,0x00,0x00, + 0x50,0xF8,0x50,0x50,0xF8,0x50,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA0, + 0x70,0x28,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xC8,0xC8,0x10,0x20,0x40, + 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68,0x01, + 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40, + 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40, + 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xA8,0x70,0x20, + 0x70,0xA8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xF8,0x20,0x20,0x02,0x03, + 0x03,0x06,0x01,0xFF,0xC0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xF8,0x02,0x02, + 0x02,0x06,0x01,0x00,0xC0,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20, + 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xA8,0xC8,0x88,0x70, + 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xF8,0x05,0x07,0x07,0x06,0x00,0x00, + 0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50, + 0x90,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0xF0,0x08,0x08,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xF0,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0,0xc0, - 0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05,0x06, - 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00,0xf8, + 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xC0,0xC0,0x00,0xC0,0xC0, + 0x02,0x06,0x06,0x06,0x01,0xFF,0xC0,0xC0,0x00,0xC0,0x40,0x80,0x03,0x05,0x05,0x06, + 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xF8,0x00,0xF8, 0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00, 0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88, - 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0,0x05, + 0xB8,0xA8,0xB8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0,0x05, 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, - 0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0, + 0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8, + 0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0, 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07,0x07, - 0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00, - 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0, - 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80, - 0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88, - 0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xa8, - 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,0x05, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x03,0x07,0x07, + 0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, + 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88, + 0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xA8, + 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x05, 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88, + 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88, 0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, - 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8,0x50, + 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8,0x50, 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,0x07, 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20, - 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00, - 0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88, - 0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07, + 0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20, + 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0xE0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00, + 0xFE,0xF8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88, + 0x88,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07, 0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xe0, - 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07,0x07, - 0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01,0xfe, + 0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xE0, + 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x88,0x88,0x78,0x08,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x03,0x07,0x07, + 0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x04,0x09,0x09,0x06,0x01,0xFE, 0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80, - 0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40,0x40, - 0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05,0x05, - 0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70, - 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, - 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05, - 0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78, - 0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x80,0x88,0x90,0xE0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xC0,0x40,0x40,0x40, + 0x40,0x40,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x05,0x05, + 0x05,0x06,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70, + 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, + 0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78, + 0x80,0x70,0x08,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, 0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,0x06, - 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xa8, - 0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07, - 0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40,0x80, - 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40,0x40, - 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x06, - 0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x05, - 0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05,0x06,0x00,0x00,0xa8, - 0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xf8,0x20,0xf8,0x20, + 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xA8, + 0xA8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07, + 0x06,0x00,0xFE,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0xF8,0x10,0x20,0x40,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40,0x40,0x40,0x80, + 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40,0x40,0x20,0x40,0x40, + 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xA8,0x90,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x06, + 0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x05, + 0x07,0x07,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA0,0xA8,0x70,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x30,0x48,0x40,0xE0,0x40,0x48,0xB0,0x05,0x05,0x05,0x06,0x00,0x00,0xA8, + 0x50,0x88,0x50,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xF8,0x20,0xF8,0x20, 0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04,0x08, - 0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0,0x03,0x01,0x01,0x06, - 0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,0xb4,0x84,0x78, - 0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05,0x05,0x05,0x06,0x00, - 0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x08,0x08,0x03, - 0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4, - 0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04,0x04,0x06,0x01,0x05, - 0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00, - 0xf8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xa0,0x20,0x40,0xe0,0x03,0x05,0x05,0x06, - 0x01,0x04,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40,0x80, - 0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x08,0x08, - 0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06,0x02, - 0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03,0x05,0x05,0x06,0x01, - 0x04,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x40,0x00, - 0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x0a,0x0a,0x06, - 0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10,0x05,0x0a,0x0a,0x06, - 0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38,0x05,0x0a,0x0a,0x06, - 0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10,0x05,0x07,0x07,0x06, - 0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, - 0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, - 0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, - 0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x68, - 0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x50, - 0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50, - 0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0xa0, - 0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x80,0x80, - 0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80,0xf0, - 0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00,0xe0,0x40,0x40,0x40, - 0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xe0,0x40,0x40,0x40, - 0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00,0xe0,0x40,0x40,0x40, - 0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40,0x40, - 0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8,0x48,0x48,0x70,0x05, - 0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05, - 0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xE0,0x03,0x01,0x01,0x06, + 0x01,0x07,0xA0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xB4,0xA4,0xB4,0x84,0x78, + 0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xA0,0x60,0x00,0xE0,0x05,0x05,0x05,0x06,0x00, + 0x00,0x28,0x50,0xA0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xF8,0x08,0x08,0x03, + 0x01,0x01,0x06,0x01,0x03,0xE0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xB4,0xA4, + 0xA4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xF8,0x04,0x04,0x04,0x06,0x01,0x05, + 0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00, + 0xF8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xA0,0x20,0x40,0xE0,0x03,0x05,0x05,0x06, + 0x01,0x04,0xC0,0x20,0x40,0x20,0xC0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40,0x80, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x08,0x08, + 0x06,0x00,0x00,0x78,0xE8,0xE8,0xE8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06,0x02, + 0x03,0xC0,0xC0,0x03,0x02,0x02,0x06,0x01,0xFE,0x20,0xC0,0x03,0x05,0x05,0x06,0x01, + 0x04,0x40,0xC0,0x40,0x40,0xE0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xA0,0x40,0x00, + 0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xA0,0x50,0x28,0x50,0xA0,0x05,0x0A,0x0A,0x06, + 0x00,0x00,0x40,0xC0,0x48,0x50,0x60,0x50,0xB0,0x50,0x78,0x10,0x05,0x0A,0x0A,0x06, + 0x00,0x00,0x40,0xC0,0x48,0x50,0x60,0x50,0xA8,0x08,0x10,0x38,0x05,0x0A,0x0A,0x06, + 0x00,0x00,0xC0,0x20,0x48,0x30,0xE0,0x50,0xB0,0x50,0x78,0x10,0x05,0x07,0x07,0x06, + 0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40, + 0x20,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10, + 0x20,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20, + 0x50,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x68, + 0xB0,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x50, + 0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50, + 0x20,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0xA0, + 0xA0,0xF0,0xA0,0xA0,0xB8,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x80,0x80,0x80, + 0x88,0x70,0x10,0x60,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0xF8,0x80,0x80, + 0xF0,0x80,0x80,0xF8,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0xF8,0x80,0x80, + 0xF0,0x80,0x80,0xF8,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50,0x00,0xF8,0x80,0x80, + 0xF0,0x80,0x80,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xF8,0x80,0x80,0xF0, + 0x80,0x80,0xF8,0x03,0x0A,0x0A,0x06,0x01,0x00,0x80,0x40,0x00,0xE0,0x40,0x40,0x40, + 0x40,0x40,0xE0,0x03,0x0A,0x0A,0x06,0x01,0x00,0x20,0x40,0x00,0xE0,0x40,0x40,0x40, + 0x40,0x40,0xE0,0x03,0x0A,0x0A,0x06,0x01,0x00,0x40,0xA0,0x00,0xE0,0x40,0x40,0x40, + 0x40,0x40,0xE0,0x03,0x09,0x09,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40,0x40,0x40,0x40, + 0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xE8,0x48,0x48,0x70,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0x68,0xB0,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, 0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x05, - 0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xff,0x08, - 0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20, - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20, - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50, + 0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xFF,0x08, + 0x70,0x98,0xA8,0xA8,0xA8,0xC8,0x70,0x80,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20, + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20, + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50, 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00, - 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00, - 0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xe0,0x90, - 0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xa0,0x90,0x88, - 0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05, + 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00, + 0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xE0,0x90, + 0x90,0x90,0xE0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xA0,0x90,0x88, + 0xB0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05, 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08, 0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00, - 0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x50, + 0x00,0x68,0xB0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x50, 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x70, - 0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xa0,0x78,0x05, - 0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08,0x06, - 0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00, - 0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50, - 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88, - 0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40,0x40, - 0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03, - 0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,0x07,0x07, - 0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09,0x09,0x06,0x00,0x00, + 0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xA0,0x78,0x05, + 0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08,0x06, + 0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00, + 0x10,0x20,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50, + 0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88, + 0xF0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xC0,0x40,0x40,0x40, + 0xE0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x03, + 0x08,0x08,0x06,0x01,0x00,0x40,0xA0,0x00,0xC0,0x40,0x40,0x40,0xE0,0x03,0x07,0x07, + 0x06,0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0x40,0xE0,0x05,0x09,0x09,0x06,0x00,0x00, 0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68, - 0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, + 0xB0,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, 0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88, 0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x70,0x05, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x70,0x05, 0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98,0xa8, - 0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x70, + 0x00,0x01,0x20,0x00,0xF8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98,0xA8, + 0xC8,0xF0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x70, 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x08, 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x10, - 0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x80, - 0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x50,0x00, + 0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x10, + 0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xFE,0x80, + 0x80,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xFE,0x50,0x00, 0x88,0x88,0x88,0x50,0x20,0x40,0x80}; #endif diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_bg.h b/Marlin/src/lcd/dogm/fontdata/langdata_bg.h index 5fd7931f23..c506f87933 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_bg.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_bg.h @@ -6,62 +6,62 @@ #include const u8g_fntpgm_uint8_t fontpage_8_144_149[96] U8G_FONT_SECTION("fontpage_8_144_149") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x95,0x00,0x07,0xff,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, - 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50, - 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x95,0x00,0x07,0xFF,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, + 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8 }; const u8g_fntpgm_uint8_t fontpage_8_151_152[43] U8G_FONT_SECTION("fontpage_8_151_152") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x98,0x00,0x07,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x98,0x00,0x07,0x00,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88}; + 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_8_154_164[160] U8G_FONT_SECTION("fontpage_8_154_164") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0xa4,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0xA4,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07, 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, - 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, + 0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, + 0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8, 0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, - 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20 + 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20 }; const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0xfe,0x00, - 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8,0x08,0x08 }; const u8g_fntpgm_uint8_t fontpage_8_175_195[260] U8G_FONT_SECTION("fontpage_8_175_195") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc3,0x00,0x08,0xfe,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xC3,0x00,0x08,0xFE,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, - 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, - 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, - 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05, + 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, + 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8, - 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05, - 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8, - 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, - 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, + 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, + 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88, + 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, 0x88,0x78,0x08,0x70}; const u8g_fntpgm_uint8_t fontpage_8_197_200[63] U8G_FONT_SECTION("fontpage_8_197_200") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc8,0x00,0x05,0xfe,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC8,0x00,0x05,0xFE,0x00, 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07,0x06, - 0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xf8}; + 0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xF8}; const u8g_fntpgm_uint8_t fontpage_8_202_202[28] U8G_FONT_SECTION("fontpage_8_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70}; const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xcf,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCF,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06, 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_cz.h b/Marlin/src/lcd/dogm/fontdata/langdata_cz.h index 998536fea1..754459d9af 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_cz.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_cz.h @@ -6,39 +6,39 @@ #include const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8d,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; const u8g_fntpgm_uint8_t fontpage_2_143_143[33] U8G_FONT_SECTION("fontpage_2_143_143") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0x00,0x00, - 0x00,0x06,0x0a,0x0a,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88, 0x78}; const u8g_fntpgm_uint8_t fontpage_2_154_155[47] U8G_FONT_SECTION("fontpage_2_154_155") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9b,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, - 0xf8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0xf0,0x80,0x70}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9B,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, + 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0xF0,0x80,0x70}; const u8g_fntpgm_uint8_t fontpage_2_200_200[31] U8G_FONT_SECTION("fontpage_2_200_200") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_2_216_217[47] U8G_FONT_SECTION("fontpage_2_216_217") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd9,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90, - 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x80,0x80,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD9,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x80,0x80,0x80}; const u8g_fntpgm_uint8_t fontpage_2_224_225[47] U8G_FONT_SECTION("fontpage_2_224_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe1,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE1,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; const u8g_fntpgm_uint8_t fontpage_2_229_229[33] U8G_FONT_SECTION("fontpage_2_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, 0x18}; const u8g_fntpgm_uint8_t fontpage_2_239_239[31] U8G_FONT_SECTION("fontpage_2_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x08,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x08,0x00,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x88,0x88,0x88,0x88,0x70}; const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfe,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x08,0x10,0x20,0x40,0x80, - 0xf8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFE,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80, + 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_el.h b/Marlin/src/lcd/dogm/fontdata/langdata_el.h index 6d864c9c9a..4b545f2284 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_el.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_el.h @@ -6,74 +6,74 @@ #include const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x80,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, - 0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x80,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, + 0xF8}; const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x9d,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, - 0x50,0x50,0x88,0x88,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80, - 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, - 0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0, - 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, - 0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x9D,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0x50,0x50,0x88,0x88,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80, + 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xE0, + 0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0, + 0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0xa1,0x00,0x07,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0xA1,0x00,0x07,0x00,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80}; + 0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80}; const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa7,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x40,0x20,0x10,0x20,0x40,0xf8,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA7,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x40,0x20,0x10,0x20,0x40,0xF8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, - 0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, + 0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, 0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xaf,0x00,0x08,0xfe,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAF,0x00,0x08,0xFE,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, - 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0a,0x0a, - 0x06,0x00,0xfe,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, - 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xa0,0x40}; + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0A,0x0A, + 0x06,0x00,0xFE,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, + 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xA0,0x40}; const u8g_fntpgm_uint8_t fontpage_7_177_181[80] U8G_FONT_SECTION("fontpage_7_177_181") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb5,0x00,0x07,0xfe,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB5,0x00,0x07,0xFE,0x00, 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, - 0x00,0xfe,0x60,0x90,0x90,0xb0,0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, - 0xfe,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, + 0x00,0xFE,0x60,0x90,0x90,0xB0,0x88,0x88,0xF0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, + 0xFE,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_7_183_199[226] U8G_FONT_SECTION("fontpage_7_183_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xc7,0x00,0x09,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x04,0x07, - 0x07,0x06,0x01,0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02, - 0x00,0x80,0x80,0x80,0xa0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xC7,0x00,0x09,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x04,0x07, + 0x07,0x06,0x01,0x00,0x60,0x90,0x90,0xF0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02, + 0x00,0x80,0x80,0x80,0xA0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0, 0x90,0x05,0x09,0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88, - 0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0xf8,0x20, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0xF8,0x20, 0x40,0x70,0x80,0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88, - 0x88,0x70,0x06,0x05,0x05,0x06,0x00,0x00,0xf8,0x50,0x50,0x54,0x48,0x05,0x07,0x07, - 0x06,0x00,0xfe,0x70,0x88,0x88,0xc8,0xb0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe, + 0x88,0x70,0x06,0x05,0x05,0x06,0x00,0x00,0xF8,0x50,0x50,0x54,0x48,0x05,0x07,0x07, + 0x06,0x00,0xFE,0x70,0x88,0x88,0xC8,0xB0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE, 0x70,0x88,0x80,0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88, - 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x28,0x10,0x05,0x05,0x05, - 0x06,0x00,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x10,0xa8, - 0xa8,0xa8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x50,0x20,0x50, + 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x28,0x10,0x05,0x05,0x05, + 0x06,0x00,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x10,0xA8, + 0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x50,0x20,0x50, 0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50}; const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xce,0x00,0x08,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCE,0x00,0x08,0x00,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, - 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xa8,0xa8,0x50}; + 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xA8,0xA8,0x50}; const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x01,0x00,0x00, - 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xa8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x01,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xA8}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h b/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h index 6d864c9c9a..4b545f2284 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h @@ -6,74 +6,74 @@ #include const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x80,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, - 0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x80,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, + 0xF8}; const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x9d,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, - 0x50,0x50,0x88,0x88,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80, - 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, - 0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0, - 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, - 0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x9D,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0x50,0x50,0x88,0x88,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80, + 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xE0, + 0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0, + 0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0xa1,0x00,0x07,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0xA1,0x00,0x07,0x00,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80}; + 0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80}; const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa7,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x40,0x20,0x10,0x20,0x40,0xf8,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA7,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x40,0x20,0x10,0x20,0x40,0xF8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, - 0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, + 0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, 0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xaf,0x00,0x08,0xfe,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAF,0x00,0x08,0xFE,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, - 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0a,0x0a, - 0x06,0x00,0xfe,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, - 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xa0,0x40}; + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0A,0x0A, + 0x06,0x00,0xFE,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, + 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xA0,0x40}; const u8g_fntpgm_uint8_t fontpage_7_177_181[80] U8G_FONT_SECTION("fontpage_7_177_181") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb5,0x00,0x07,0xfe,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB5,0x00,0x07,0xFE,0x00, 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, - 0x00,0xfe,0x60,0x90,0x90,0xb0,0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, - 0xfe,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, + 0x00,0xFE,0x60,0x90,0x90,0xB0,0x88,0x88,0xF0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, + 0xFE,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_7_183_199[226] U8G_FONT_SECTION("fontpage_7_183_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xc7,0x00,0x09,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x04,0x07, - 0x07,0x06,0x01,0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02, - 0x00,0x80,0x80,0x80,0xa0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xC7,0x00,0x09,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x04,0x07, + 0x07,0x06,0x01,0x00,0x60,0x90,0x90,0xF0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02, + 0x00,0x80,0x80,0x80,0xA0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0, 0x90,0x05,0x09,0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88, - 0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0xf8,0x20, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0xF8,0x20, 0x40,0x70,0x80,0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88, - 0x88,0x70,0x06,0x05,0x05,0x06,0x00,0x00,0xf8,0x50,0x50,0x54,0x48,0x05,0x07,0x07, - 0x06,0x00,0xfe,0x70,0x88,0x88,0xc8,0xb0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe, + 0x88,0x70,0x06,0x05,0x05,0x06,0x00,0x00,0xF8,0x50,0x50,0x54,0x48,0x05,0x07,0x07, + 0x06,0x00,0xFE,0x70,0x88,0x88,0xC8,0xB0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE, 0x70,0x88,0x80,0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88, - 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x28,0x10,0x05,0x05,0x05, - 0x06,0x00,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x10,0xa8, - 0xa8,0xa8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x50,0x20,0x50, + 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x28,0x10,0x05,0x05,0x05, + 0x06,0x00,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x10,0xA8, + 0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x50,0x20,0x50, 0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50}; const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xce,0x00,0x08,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCE,0x00,0x08,0x00,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, - 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xa8,0xa8,0x50}; + 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xA8,0xA8,0x50}; const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x01,0x00,0x00, - 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xa8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x01,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xA8}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_hr.h b/Marlin/src/lcd/dogm/fontdata/langdata_hr.h index 6337c9226a..cdb2cc7d1a 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_hr.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_hr.h @@ -6,21 +6,21 @@ #include const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8d,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; const u8g_fntpgm_uint8_t fontpage_2_145_145[31] U8G_FONT_SECTION("fontpage_2_145_145") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x08,0x00,0x00, - 0x00,0x06,0x08,0x08,0x06,0x00,0x00,0x08,0x1c,0x08,0x78,0x88,0x88,0x88,0x78}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x08,0x00,0x00, + 0x00,0x06,0x08,0x08,0x06,0x00,0x00,0x08,0x1C,0x08,0x78,0x88,0x88,0x88,0x78}; const u8g_fntpgm_uint8_t fontpage_2_225_225[31] U8G_FONT_SECTION("fontpage_2_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; const u8g_fntpgm_uint8_t fontpage_2_254_254[31] U8G_FONT_SECTION("fontpage_2_254_254") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_hu.h b/Marlin/src/lcd/dogm/fontdata/langdata_hu.h index 29060b252a..8c15a3890a 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_hu.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_hu.h @@ -6,7 +6,7 @@ #include const u8g_fntpgm_uint8_t fontpage_2_241_241[31] U8G_FONT_SECTION("fontpage_2_241_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x08,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x08,0x00,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x48,0x90,0x00,0x88,0x88,0x88,0x88,0x70}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h b/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h index 97d82c0293..01316d4c13 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h @@ -6,92 +6,92 @@ #include const u8g_fntpgm_uint8_t fontpage_97_161_164[65] U8G_FONT_SECTION("fontpage_97_161_164") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa4,0x00,0x07,0x00,0x00, - 0x00,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10,0x60,0x40,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0xf8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x10, - 0x20,0x60,0xa0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20,0x60,0xa0,0x20, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA4,0x00,0x07,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0x60,0x40,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0xF8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x10, + 0x20,0x60,0xA0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20,0x60,0xA0,0x20, 0x20}; const u8g_fntpgm_uint8_t fontpage_97_166_166[30] U8G_FONT_SECTION("fontpage_97_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xf8,0x88,0x88,0x08,0x10,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x88,0x88,0x08,0x10,0x60}; const u8g_fntpgm_uint8_t fontpage_97_168_168[29] U8G_FONT_SECTION("fontpage_97_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x06,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0xF8}; const u8g_fntpgm_uint8_t fontpage_97_170_187[268] U8G_FONT_SECTION("fontpage_97_170_187") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xbb,0x00,0x0d,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xf8,0x10,0x30,0x50,0x90,0x10,0x05,0x07, - 0x07,0x06,0x00,0x00,0x40,0xf8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00, - 0x00,0x28,0x08,0x40,0xf8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00, - 0x20,0xf8,0x20,0x20,0xf8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20, - 0xf8,0x20,0x20,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xBB,0x00,0x0D,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xF8,0x10,0x30,0x50,0x90,0x10,0x05,0x07, + 0x07,0x06,0x00,0x00,0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00, + 0x00,0x28,0x08,0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0xF8,0x20,0x20,0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20, + 0xF8,0x20,0x20,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0x88, 0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40,0x78,0x48,0x88,0x08, - 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0xf8,0x90,0x90,0x10,0x10,0x20,0x05, - 0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x80,0xf8,0x90,0x90,0x10,0x10,0x20,0x05,0x06, - 0x06,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0x08,0xf8,0x05,0x09,0x09,0x06,0x00,0x00, - 0x28,0x28,0x00,0xf8,0x08,0x08,0x08,0x08,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x50, - 0xf8,0x50,0x50,0x50,0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xf8, - 0x50,0x50,0x50,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xc0,0x08,0xc8,0x08,0x10, - 0xe0,0x07,0x0d,0x0d,0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xc0,0x08, - 0xc8,0x08,0x10,0xe0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10,0x10,0x20,0x50,0x88, + 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05, + 0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x06, + 0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x09,0x09,0x06,0x00,0x00, + 0x28,0x28,0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x50, + 0xF8,0x50,0x50,0x50,0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xF8, + 0x50,0x50,0x50,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0xC8,0x08,0x10, + 0xE0,0x07,0x0D,0x0D,0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xC0,0x08, + 0xC8,0x08,0x10,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10,0x10,0x20,0x50,0x88, 0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xf8,0x48,0x50,0x40,0x38}; + 0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x38}; const u8g_fntpgm_uint8_t fontpage_97_189_193[85] U8G_FONT_SECTION("fontpage_97_189_193") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xc1,0x00,0x09,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xC1,0x00,0x09,0x00,0x00, 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x05,0x09,0x09, 0x06,0x00,0x00,0x28,0x28,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x40,0x78,0x48,0xa8,0x18,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28, - 0x08,0x40,0x78,0x48,0xa8,0x18,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60, - 0x20,0xf8,0x20,0x20,0x40}; + 0x00,0x00,0x40,0x78,0x48,0xA8,0x18,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28, + 0x08,0x40,0x78,0x48,0xA8,0x18,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60, + 0x20,0xF8,0x20,0x20,0x40}; const u8g_fntpgm_uint8_t fontpage_97_195_211[241] U8G_FONT_SECTION("fontpage_97_195_211") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xd3,0x00,0x09,0x00,0x00, - 0x00,0x05,0x04,0x04,0x06,0x00,0x00,0xa8,0xa8,0x08,0x30,0x05,0x06,0x06,0x06,0x00, - 0x00,0xa8,0xa8,0xa8,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, - 0xa8,0xa8,0xa8,0x08,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xf8,0x20, - 0x20,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xf8,0x20,0x20, - 0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0xc0,0xa0,0x90,0x80,0x80,0x04, - 0x09,0x09,0x06,0x01,0x00,0x50,0x10,0x80,0x80,0xc0,0xa0,0x90,0x80,0x80,0x05,0x07, - 0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00, - 0x00,0x70,0x00,0x00,0x00,0x00,0xf8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28, - 0x10,0x28,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xa8,0x20, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xD3,0x00,0x09,0x00,0x00, + 0x00,0x05,0x04,0x04,0x06,0x00,0x00,0xA8,0xA8,0x08,0x30,0x05,0x06,0x06,0x06,0x00, + 0x00,0xA8,0xA8,0xA8,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, + 0xA8,0xA8,0xA8,0x08,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x20, + 0x20,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xF8,0x20,0x20, + 0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x04, + 0x09,0x09,0x06,0x01,0x00,0x50,0x10,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x05,0x07, + 0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00, + 0x00,0x70,0x00,0x00,0x00,0x00,0xF8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28, + 0x10,0x28,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xA8,0x20, 0x03,0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x06,0x06,0x06, 0x00,0x00,0x10,0x50,0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28, 0x00,0x10,0x50,0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00, - 0x10,0x50,0x50,0x48,0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xe0,0x80, - 0x80,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xe0,0x80,0x80, + 0x10,0x50,0x50,0x48,0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xE0,0x80, + 0x80,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xE0,0x80,0x80, 0x70}; const u8g_fntpgm_uint8_t fontpage_97_213_217[84] U8G_FONT_SECTION("fontpage_97_213_217") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd9,0x00,0x09,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09, - 0x06,0x00,0x00,0x28,0x28,0x00,0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06, - 0x00,0x00,0x18,0x18,0x00,0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00, - 0x01,0x60,0xa0,0x10,0x10,0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60, - 0xa0,0x10,0x10,0x08}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD9,0x00,0x09,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09, + 0x06,0x00,0x00,0x28,0x28,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06, + 0x00,0x00,0x18,0x18,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00, + 0x01,0x60,0xA0,0x10,0x10,0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60, + 0xA0,0x10,0x10,0x08}; const u8g_fntpgm_uint8_t fontpage_97_219_220[45] U8G_FONT_SECTION("fontpage_97_219_220") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdc,0x00,0x09,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xf8,0x20,0xa8,0xa8,0xa8,0x20,0x05,0x09, - 0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xf8,0x20,0xa8,0xa8,0xa8,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDC,0x00,0x09,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09, + 0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20}; const u8g_fntpgm_uint8_t fontpage_97_222_223[41] U8G_FONT_SECTION("fontpage_97_222_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xdf,0x00,0x06,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0x08,0x50,0x20,0x10,0x04,0x06,0x06, - 0x06,0x01,0x00,0xe0,0x00,0xe0,0x00,0xc0,0x30}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDF,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x50,0x20,0x10,0x04,0x06,0x06, + 0x06,0x01,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x30}; const u8g_fntpgm_uint8_t fontpage_97_225_237[174] U8G_FONT_SECTION("fontpage_97_225_237") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xed,0x00,0x07,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xc0,0x05,0x06,0x06, - 0x06,0x00,0x00,0xf0,0x40,0xf8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40, - 0xf8,0x48,0x50,0x40,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xf8,0x48,0x50,0x40, - 0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xf0,0x05,0x06,0x06,0x06, - 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0xf8,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10, - 0xf0,0x10,0xf0,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x08,0xf8,0x05, - 0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xf8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xED,0x00,0x07,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xC0,0x05,0x06,0x06, + 0x06,0x00,0x00,0xF0,0x40,0xF8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40, + 0xF8,0x48,0x50,0x40,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40, + 0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xF0,0x05,0x06,0x06,0x06, + 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10, + 0xF0,0x10,0xF0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06, 0x00,0x00,0x10,0x90,0x90,0x90,0x90,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20, - 0x20,0xa0,0xa0,0xa8,0xa8,0xb0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88, - 0xb0,0xc0,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0xf8}; + 0x20,0xA0,0xA0,0xA8,0xA8,0xB0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88, + 0xB0,0xC0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xF8}; const u8g_fntpgm_uint8_t fontpage_97_242_243[41] U8G_FONT_SECTION("fontpage_97_242_243") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf3,0x00,0x06,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x10,0x60,0x05,0x06,0x06, - 0x06,0x00,0x00,0xc0,0x08,0x08,0x08,0x10,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF3,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x10,0x60,0x05,0x06,0x06, + 0x06,0x00,0x00,0xC0,0x08,0x08,0x08,0x10,0xE0}; const u8g_fntpgm_uint8_t fontpage_97_252_252[25] U8G_FONT_SECTION("fontpage_97_252_252") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x05,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x05,0x00,0x00, 0x00,0x05,0x02,0x02,0x06,0x00,0x03,0x80,0x78}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h b/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h index e920b61631..6b48434a6f 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h @@ -6,434 +6,434 @@ #include const u8g_fntpgm_uint8_t fontpage_344_240_240[34] U8G_FONT_SECTION("fontpage_344_240_240") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x09,0x11,0x17,0x21,0x41,0x81,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x17,0x21,0x41,0x81,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_345_224_224[41] U8G_FONT_SECTION("fontpage_345_224_224") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x08, - 0x80,0x08,0x80,0x09,0x00,0x08,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x08, + 0x80,0x08,0x80,0x09,0x00,0x08,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_347_248_248[41] U8G_FONT_SECTION("fontpage_347_248_248") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00, - 0x80,0x01,0x00,0x01,0x00,0x01,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00, + 0x80,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_348_137_137[45] U8G_FONT_SECTION("fontpage_348_137_137") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x3f,0x00,0x00,0x80,0x00,0x80,0x01,0x00,0xff, - 0xc0,0x00,0x00,0x20,0x80,0x20,0x80,0x3f,0x00,0x20,0x80,0x3f,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x00,0x80,0x00,0x80,0x01,0x00,0xFF, + 0xC0,0x00,0x00,0x20,0x80,0x20,0x80,0x3F,0x00,0x20,0x80,0x3F,0x00}; const u8g_fntpgm_uint8_t fontpage_348_176_176[34] U8G_FONT_SECTION("fontpage_348_176_176") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x09,0x11,0x11,0x21,0x41,0x81,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x11,0x21,0x41,0x81,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_348_197_197[34] U8G_FONT_SECTION("fontpage_348_197_197") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x09,0x11,0x21,0xc1,0x1e,0x21,0x41, - 0x21,0x1e}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x21,0xC1,0x1E,0x21,0x41, + 0x21,0x1E}; const u8g_fntpgm_uint8_t fontpage_352_196_196[41] U8G_FONT_SECTION("fontpage_352_196_196") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x7f,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08, - 0x80,0x08,0x80,0x10,0x80,0x11,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x7F,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08, + 0x80,0x08,0x80,0x10,0x80,0x11,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_353_180_180[34] U8G_FONT_SECTION("fontpage_353_180_180") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x85,0x85,0x85,0x85,0x87,0x85,0x85,0xfd,0x05, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x85,0x85,0x85,0x85,0x87,0x85,0x85,0xFD,0x05, 0x05,0x05}; const u8g_fntpgm_uint8_t fontpage_354_248_248[41] U8G_FONT_SECTION("fontpage_354_248_248") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3f, - 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, + 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_356_132_132[43] U8G_FONT_SECTION("fontpage_356_132_132") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xff,0x00, - 0x00,0x0a,0x0a,0x14,0x0a,0x00,0xff,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3f, - 0x80,0x00,0x00,0xff,0xc0,0x04,0x00,0x04,0x00,0x04,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFF,0x00, + 0x00,0x0A,0x0A,0x14,0x0A,0x00,0xFF,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, + 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_356_244_244[43] U8G_FONT_SECTION("fontpage_356_244_244") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x09,0xff,0x00, - 0x00,0x0a,0x0a,0x14,0x0a,0x00,0xff,0x20,0x00,0x20,0x00,0x20,0x00,0x3f,0x80,0x00, - 0x00,0x00,0x00,0xff,0xc0,0x12,0x00,0x12,0x00,0x12,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFF,0x00, + 0x00,0x0A,0x0A,0x14,0x0A,0x00,0xFF,0x20,0x00,0x20,0x00,0x20,0x00,0x3F,0x80,0x00, + 0x00,0x00,0x00,0xFF,0xC0,0x12,0x00,0x12,0x00,0x12,0x00}; const u8g_fntpgm_uint8_t fontpage_357_200_200[34] U8G_FONT_SECTION("fontpage_357_200_200") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x7d,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x7D,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_357_228_228[45] U8G_FONT_SECTION("fontpage_357_228_228") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0xf9,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0x81, - 0x80,0x81,0x00,0x81,0x00,0xfd,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0x81, + 0x80,0x81,0x00,0x81,0x00,0xFD,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_357_249_249[45] U8G_FONT_SECTION("fontpage_357_249_249") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0xf9,0x00,0x81,0x00,0x81,0x00,0x81,0x80,0x81, - 0x00,0xfd,0x00,0x00,0x00,0x3e,0x00,0x41,0x00,0x41,0x00,0x3e,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0x81,0x00,0x81,0x80,0x81, + 0x00,0xFD,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x3E,0x00}; const u8g_fntpgm_uint8_t fontpage_359_196_196[41] U8G_FONT_SECTION("fontpage_359_196_196") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x3f, - 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, + 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_359_204_204[45] U8G_FONT_SECTION("fontpage_359_204_204") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x3f,0x00,0x20,0x00,0x3f,0x80,0x04,0x00,0xff, - 0xc0,0x00,0x00,0x3f,0x00,0x00,0x80,0x3f,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x00,0x3F,0x80,0x04,0x00,0xFF, + 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_359_217_217[45] U8G_FONT_SECTION("fontpage_359_217_217") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x3f,0x00,0x20,0x00,0x20,0x00,0x3f,0x80,0x04, - 0x00,0xff,0xc0,0x00,0x00,0x1f,0x00,0x20,0x80,0x20,0x80,0x1f,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x00,0x20,0x00,0x3F,0x80,0x04, + 0x00,0xFF,0xC0,0x00,0x00,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00}; const u8g_fntpgm_uint8_t fontpage_360_152_152[45] U8G_FONT_SECTION("fontpage_360_152_152") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x00,0xfe,0x7c,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7e, - 0x80,0x10,0x80,0x10,0x80,0xff,0x80,0x00,0x80,0x00,0x80,0x00,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7E, + 0x80,0x10,0x80,0x10,0x80,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x80}; const u8g_fntpgm_uint8_t fontpage_360_156_156[45] U8G_FONT_SECTION("fontpage_360_156_156") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x00,0xfe,0x7c,0x80,0x40,0x80,0x40,0x80,0x7c,0x80,0x10, - 0x80,0x10,0x80,0xff,0x80,0x00,0x80,0x20,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x7C,0x80,0x10, + 0x80,0x10,0x80,0xFF,0x80,0x00,0x80,0x20,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_360_168_168[34] U8G_FONT_SECTION("fontpage_360_168_168") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x81,0x81,0xf9,0x21,0xff,0x00,0x7f,0x41, - 0x41,0x7f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0xF9,0x21,0xFF,0x00,0x7F,0x41, + 0x41,0x7F}; const u8g_fntpgm_uint8_t fontpage_361_164_164[45] U8G_FONT_SECTION("fontpage_361_164_164") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x00,0xfe,0x7c,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7c, - 0x80,0x00,0x80,0xfe,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7C, + 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; const u8g_fntpgm_uint8_t fontpage_361_220_220[41] U8G_FONT_SECTION("fontpage_361_220_220") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x20, - 0x00,0x3f,0x80,0x00,0x00,0x00,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_362_148_148[34] U8G_FONT_SECTION("fontpage_362_148_148") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x81,0x81,0x81,0x81,0x81,0x81,0xfd,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0x81,0x81,0x81,0x81,0xFD,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_366_252_252[45] U8G_FONT_SECTION("fontpage_366_252_252") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0xf9,0x00,0x09,0x00,0x09,0x00,0xf9,0x00,0x81, - 0x80,0x81,0x00,0x81,0x00,0xfd,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x09,0x00,0xF9,0x00,0x81, + 0x80,0x81,0x00,0x81,0x00,0xFD,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_367_236_236[34] U8G_FONT_SECTION("fontpage_367_236_236") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xec,0xec,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf1,0x09,0x09,0xf1,0x87,0x81,0x81,0xf9,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xEC,0xEC,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF1,0x09,0x09,0xF1,0x87,0x81,0x81,0xF9,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_368_136_136[34] U8G_FONT_SECTION("fontpage_368_136_136") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf5,0x15,0x15,0xf5,0x8d,0x85,0x85,0xfd,0x05, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x15,0x15,0xF5,0x8D,0x85,0x85,0xFD,0x05, 0x05,0x05}; const u8g_fntpgm_uint8_t fontpage_368_165_165[34] U8G_FONT_SECTION("fontpage_368_165_165") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf1,0x17,0xf1,0x87,0x81,0xf9,0x00,0x7f,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF1,0x17,0xF1,0x87,0x81,0xF9,0x00,0x7F,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_368_220_220[41] U8G_FONT_SECTION("fontpage_368_220_220") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x00,0x80,0x3f,0x80,0x20,0x00,0x20, - 0x00,0x3f,0x80,0x04,0x00,0x04,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_369_204_204[41] U8G_FONT_SECTION("fontpage_369_204_204") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x00,0x80,0x3f,0x80,0x20,0x00,0x20, - 0x00,0x3f,0x80,0x12,0x00,0x12,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_370_244_244[41] U8G_FONT_SECTION("fontpage_370_244_244") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x00,0x80,0x3f,0x80,0x20,0x00,0x20, - 0x00,0x3f,0x80,0x00,0x00,0x00,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_371_172_172[34] U8G_FONT_SECTION("fontpage_371_172_172") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x09,0xf9,0x81,0x81,0x81,0xfd,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0xF9,0x81,0x81,0x81,0xFD,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_371_176_176[34] U8G_FONT_SECTION("fontpage_371_176_176") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x09,0xf9,0x81,0x81,0xfd,0x01,0x20, - 0x20,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0xF9,0x81,0x81,0xFD,0x01,0x20, + 0x20,0x3F}; const u8g_fntpgm_uint8_t fontpage_371_189_189[34] U8G_FONT_SECTION("fontpage_371_189_189") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0xf9,0x81,0x81,0xfd,0x00,0x41,0x3f, - 0x41,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0xF9,0x81,0x81,0xFD,0x00,0x41,0x3F, + 0x41,0x3F}; const u8g_fntpgm_uint8_t fontpage_371_193_193[34] U8G_FONT_SECTION("fontpage_371_193_193") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc1,0xc1,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0xf9,0x81,0x81,0xfd,0x01,0x3e,0x21, - 0x21,0x3e}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0xF9,0x81,0x81,0xFD,0x01,0x3E,0x21, + 0x21,0x3E}; const u8g_fntpgm_uint8_t fontpage_372_200_200[34] U8G_FONT_SECTION("fontpage_372_200_200") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x89,0x89,0x8f,0x89,0xf9,0x00,0x3f,0x41, - 0x41,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x8F,0x89,0xF9,0x00,0x3F,0x41, + 0x41,0x3F}; const u8g_fntpgm_uint8_t fontpage_372_212_212[34] U8G_FONT_SECTION("fontpage_372_212_212") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf5,0x95,0x95,0x9d,0x95,0x95,0x95,0xf5,0x05, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x95,0x95,0x9D,0x95,0x95,0x95,0xF5,0x05, 0x05,0x05}; const u8g_fntpgm_uint8_t fontpage_372_244_244[34] U8G_FONT_SECTION("fontpage_372_244_244") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x89,0x8f,0x89,0x8f,0xf9,0x01,0x21,0x20, - 0x20,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x8F,0x89,0x8F,0xF9,0x01,0x21,0x20, + 0x20,0x3F}; const u8g_fntpgm_uint8_t fontpage_373_168_168[41] U8G_FONT_SECTION("fontpage_373_168_168") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x3f, - 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x3F, + 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_373_187_187[45] U8G_FONT_SECTION("fontpage_373_187_187") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x3f,0x00,0x20,0x80,0x20,0x80,0x3f,0x00,0x04, - 0x00,0xff,0xc0,0x00,0x00,0x04,0x00,0x0c,0x00,0x1a,0x00,0x61,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x80,0x20,0x80,0x3F,0x00,0x04, + 0x00,0xFF,0xC0,0x00,0x00,0x04,0x00,0x0C,0x00,0x1A,0x00,0x61,0x80}; const u8g_fntpgm_uint8_t fontpage_375_248_248[34] U8G_FONT_SECTION("fontpage_375_248_248") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x89,0x89,0x89,0x89,0x89,0x89,0xf9,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x89,0x89,0x89,0x89,0xF9,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_376_128_128[34] U8G_FONT_SECTION("fontpage_376_128_128") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x89,0x89,0x89,0xf9,0x00,0x3f,0x01,0x3f, - 0x40,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x89,0xF9,0x00,0x3F,0x01,0x3F, + 0x40,0x3F}; const u8g_fntpgm_uint8_t fontpage_376_148_148[45] U8G_FONT_SECTION("fontpage_376_148_148") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0x89,0x00,0x89,0x00,0x89,0x00,0xf9,0x00,0x89, - 0x80,0x89,0x00,0x89,0x00,0xf9,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x89,0x00,0x89,0x00,0x89,0x00,0xF9,0x00,0x89, + 0x80,0x89,0x00,0x89,0x00,0xF9,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_377_132_132[34] U8G_FONT_SECTION("fontpage_377_132_132") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x89,0x89,0x89,0xff,0x89,0x89,0x89,0xf9,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x89,0x89,0x89,0xFF,0x89,0x89,0x89,0xF9,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_377_160_160[34] U8G_FONT_SECTION("fontpage_377_160_160") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x95,0x95,0x95,0xf5,0x9d,0x95,0x95,0xf5,0x05, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x95,0x95,0x95,0xF5,0x9D,0x95,0x95,0xF5,0x05, 0x05,0x05}; const u8g_fntpgm_uint8_t fontpage_377_168_168[34] U8G_FONT_SECTION("fontpage_377_168_168") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x95,0x95,0xfd,0x95,0xf5,0x00,0x3f,0x01,0x3f, - 0x40,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x95,0x95,0xFD,0x95,0xF5,0x00,0x3F,0x01,0x3F, + 0x40,0x3F}; const u8g_fntpgm_uint8_t fontpage_377_248_248[45] U8G_FONT_SECTION("fontpage_377_248_248") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x20,0x80,0x20,0x80,0x3f,0x00,0x20,0x80,0x3f, - 0x00,0x04,0x00,0xff,0xc0,0x00,0x00,0x20,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x20,0x80,0x20,0x80,0x3F,0x00,0x20,0x80,0x3F, + 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_380_196_196[34] U8G_FONT_SECTION("fontpage_380_196_196") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x89,0x89,0x89,0xf9,0x89,0x89,0x89,0xf9,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x89,0x89,0x89,0xF9,0x89,0x89,0x89,0xF9,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_385_172_172[45] U8G_FONT_SECTION("fontpage_385_172_172") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x61, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x61, 0x80,0x51,0x00,0x99,0x00,0x89,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_385_189_189[45] U8G_FONT_SECTION("fontpage_385_189_189") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0x21,0x00,0x21,0x00,0x21,0x00,0x51,0x80,0xd9, - 0x00,0x89,0x00,0x00,0x00,0x41,0x00,0x7e,0x00,0x41,0x00,0x7e,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x21,0x00,0x21,0x00,0x21,0x00,0x51,0x80,0xD9, + 0x00,0x89,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; const u8g_fntpgm_uint8_t fontpage_385_200_200[34] U8G_FONT_SECTION("fontpage_385_200_200") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x25,0x25,0x25,0x45,0x67,0x65,0x95,0x95,0x05, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x25,0x25,0x25,0x45,0x67,0x65,0x95,0x95,0x05, 0x05,0x05}; const u8g_fntpgm_uint8_t fontpage_386_164_164[34] U8G_FONT_SECTION("fontpage_386_164_164") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x21,0x21,0x27,0x51,0x89,0x00,0x3f,0x01,0x3f, - 0x40,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x27,0x51,0x89,0x00,0x3F,0x01,0x3F, + 0x40,0x3F}; const u8g_fntpgm_uint8_t fontpage_387_140_141[69] U8G_FONT_SECTION("fontpage_387_140_141") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x8c,0x8d,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x04,0x00,0x0c,0x00,0x0c,0x00,0x12,0x00,0x31, - 0x00,0x44,0x80,0x04,0x00,0x04,0x00,0xff,0xc0,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x04, - 0x00,0x0c,0x00,0x13,0x00,0x65,0x80,0x04,0x00,0xff,0xc0,0x00,0x00,0x3f,0x00,0x00, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x31, + 0x00,0x44,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x04, + 0x00,0x0C,0x00,0x13,0x00,0x65,0x80,0x04,0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x00, 0x80,0x00,0x80,0x00,0x80}; const u8g_fntpgm_uint8_t fontpage_389_164_164[41] U8G_FONT_SECTION("fontpage_389_164_164") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x04,0x00,0x0c,0x00,0x0c,0x00,0x12,0x00,0x31, - 0x00,0x40,0x80,0x00,0x00,0x00,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x31, + 0x00,0x40,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_389_172_172[45] U8G_FONT_SECTION("fontpage_389_172_172") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x04,0x00,0x1a,0x00,0x61,0x80,0x00,0x00,0xff, - 0xc0,0x00,0x00,0x3f,0x00,0x00,0x80,0x3f,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x04,0x00,0x1A,0x00,0x61,0x80,0x00,0x00,0xFF, + 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_389_220_221[51] U8G_FONT_SECTION("fontpage_389_220_221") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xdc,0xdd,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x21,0x21,0x21,0x21,0x21,0x51,0xc9,0x89,0x01, - 0x01,0x01,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x21,0x21,0x21,0x51,0xd9,0x89,0x00,0x7f, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDD,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x21,0x21,0x21,0x51,0xC9,0x89,0x01, + 0x01,0x01,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x21,0x51,0xD9,0x89,0x00,0x7F, 0x01,0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_395_180_180[34] U8G_FONT_SECTION("fontpage_395_180_180") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x89,0x89,0x8f,0x89,0x89,0x89,0x71,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x8F,0x89,0x89,0x89,0x71,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_395_198_198[45] U8G_FONT_SECTION("fontpage_395_198_198") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0x71,0x00,0x89,0x00,0x8f,0x00,0x89,0x00,0x89, - 0x00,0x71,0x00,0x00,0x00,0x4a,0x00,0x72,0x00,0x4d,0x00,0x74,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x89,0x00,0x8F,0x00,0x89,0x00,0x89, + 0x00,0x71,0x00,0x00,0x00,0x4A,0x00,0x72,0x00,0x4D,0x00,0x74,0x80}; const u8g_fntpgm_uint8_t fontpage_395_209_209[34] U8G_FONT_SECTION("fontpage_395_209_209") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x65,0x95,0x95,0x9d,0x95,0x65,0x00,0x7f,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x65,0x95,0x95,0x9D,0x95,0x65,0x00,0x7F,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_395_212_212[45] U8G_FONT_SECTION("fontpage_395_212_212") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0x65,0x00,0x95,0x00,0x95,0x00,0x9d,0x00,0x95, - 0x00,0x65,0x00,0x05,0x00,0x25,0x00,0x20,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x65,0x00,0x95,0x00,0x95,0x00,0x9D,0x00,0x95, + 0x00,0x65,0x00,0x05,0x00,0x25,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_395_244_244[34] U8G_FONT_SECTION("fontpage_395_244_244") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x8f,0x89,0x8f,0x71,0x00,0x3f,0x01,0x3f, - 0x40,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x8F,0x89,0x8F,0x71,0x00,0x3F,0x01,0x3F, + 0x40,0x3F}; const u8g_fntpgm_uint8_t fontpage_396_136_136[34] U8G_FONT_SECTION("fontpage_396_136_136") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x65,0x95,0x9d,0x95,0x95,0x9d,0x95,0x65,0x05, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x65,0x95,0x9D,0x95,0x95,0x9D,0x95,0x65,0x05, 0x05,0x05}; const u8g_fntpgm_uint8_t fontpage_396_164_164[41] U8G_FONT_SECTION("fontpage_396_164_164") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x1e,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x21, - 0x00,0x1e,0x00,0x04,0x00,0x04,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x21, + 0x00,0x1E,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_396_168_168[45] U8G_FONT_SECTION("fontpage_396_168_168") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x1f,0x00,0x20,0x80,0x20,0x80,0x1f,0x00,0x04, - 0x00,0x04,0x00,0xff,0xc0,0x00,0x00,0x20,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00,0x04, + 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_396_196_196[45] U8G_FONT_SECTION("fontpage_396_196_196") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x38,0x80,0x44,0x80,0x44,0x80,0x44,0x80,0x38, - 0xc0,0x10,0x80,0xfe,0x80,0x00,0x80,0x20,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x44,0x80,0x44,0x80,0x44,0x80,0x38, + 0xC0,0x10,0x80,0xFE,0x80,0x00,0x80,0x20,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_397_208_208[34] U8G_FONT_SECTION("fontpage_397_208_208") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x89,0x89,0x71,0x01,0xff,0x21,0x27,0x41, - 0x40,0x7f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x71,0x01,0xFF,0x21,0x27,0x41, + 0x40,0x7F}; const u8g_fntpgm_uint8_t fontpage_398_132_132[45] U8G_FONT_SECTION("fontpage_398_132_132") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x00,0xfe,0x38,0x80,0x44,0x80,0x42,0x80,0x44,0x80,0x38, - 0x80,0x00,0x80,0xfe,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x44,0x80,0x42,0x80,0x44,0x80,0x38, + 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; const u8g_fntpgm_uint8_t fontpage_398_188_188[41] U8G_FONT_SECTION("fontpage_398_188_188") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x1e,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x21, - 0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x21, + 0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_398_204_204[45] U8G_FONT_SECTION("fontpage_398_204_204") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x1e,0x00,0x21,0x00,0x21,0x00,0x1e,0x00,0x00, - 0x00,0xff,0xc0,0x00,0x00,0x3f,0x00,0x20,0x80,0x20,0x80,0x3f,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x21,0x00,0x21,0x00,0x1E,0x00,0x00, + 0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x20,0x80,0x20,0x80,0x3F,0x00}; const u8g_fntpgm_uint8_t fontpage_398_244_244[34] U8G_FONT_SECTION("fontpage_398_244_244") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x49,0x89,0x89,0x89,0x89,0x49,0x71,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x49,0x89,0x89,0x89,0x89,0x49,0x71,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_398_252_253[51] U8G_FONT_SECTION("fontpage_398_252_253") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xfc,0xfd,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x89,0x89,0x89,0x71,0x00,0x3f,0x01,0x3f, - 0x40,0x3f,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x89,0x89,0x89,0x71,0x00,0x77,0x11, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFC,0xFD,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x71,0x00,0x3F,0x01,0x3F, + 0x40,0x3F,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x71,0x00,0x77,0x11, 0x71,0x41,0x79}; const u8g_fntpgm_uint8_t fontpage_399_133_133[34] U8G_FONT_SECTION("fontpage_399_133_133") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x89,0x89,0x89,0x89,0x71,0x00,0x41,0x3f, - 0x41,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x89,0x71,0x00,0x41,0x3F, + 0x41,0x3F}; const u8g_fntpgm_uint8_t fontpage_399_144_145[73] U8G_FONT_SECTION("fontpage_399_144_145") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x90,0x91,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0xf9,0x00,0x09,0x00,0x11,0x00,0x11,0x00,0x21, - 0x80,0x71,0x00,0xc9,0x00,0x85,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x09,0x0b,0x16, - 0x0a,0x01,0xfe,0xf9,0x00,0x09,0x00,0x11,0x00,0x31,0x80,0x49,0x00,0x85,0x00,0x00, - 0x00,0x7e,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x90,0x91,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x11,0x00,0x21, + 0x80,0x71,0x00,0xC9,0x00,0x85,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x09,0x0B,0x16, + 0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x31,0x80,0x49,0x00,0x85,0x00,0x00, + 0x00,0x7E,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_399_152_152[45] U8G_FONT_SECTION("fontpage_399_152_152") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0xf9,0x00,0x11,0x00,0x11,0x80,0x79,0x00,0x85, - 0x00,0x00,0x00,0x7e,0x00,0x01,0x00,0x7e,0x00,0x40,0x00,0x7f,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x11,0x00,0x11,0x80,0x79,0x00,0x85, + 0x00,0x00,0x00,0x7E,0x00,0x01,0x00,0x7E,0x00,0x40,0x00,0x7F,0x00}; const u8g_fntpgm_uint8_t fontpage_399_165_165[45] U8G_FONT_SECTION("fontpage_399_165_165") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0xf9,0x00,0x09,0x00,0x11,0x00,0x31,0x80,0x79, - 0x00,0x85,0x00,0x00,0x00,0x3e,0x00,0x41,0x00,0x41,0x00,0x3e,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x31,0x80,0x79, + 0x00,0x85,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x3E,0x00}; const u8g_fntpgm_uint8_t fontpage_399_172_172[45] U8G_FONT_SECTION("fontpage_399_172_172") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x00,0xfe,0x7a,0x80,0x0a,0x80,0x0a,0x80,0x12,0x80,0x13, - 0x80,0x2a,0x80,0x6a,0x80,0xc6,0x80,0x02,0x80,0x02,0x80,0x02,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7A,0x80,0x0A,0x80,0x0A,0x80,0x12,0x80,0x13, + 0x80,0x2A,0x80,0x6A,0x80,0xC6,0x80,0x02,0x80,0x02,0x80,0x02,0x80}; const u8g_fntpgm_uint8_t fontpage_400_128_128[34] U8G_FONT_SECTION("fontpage_400_128_128") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x11,0x17,0x31,0x71,0xc9,0x85,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x11,0x17,0x31,0x71,0xC9,0x85,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_400_132_132[34] U8G_FONT_SECTION("fontpage_400_132_132") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x17,0x31,0x49,0x85,0x01,0x21,0x20, - 0x20,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x17,0x31,0x49,0x85,0x01,0x21,0x20, + 0x20,0x3F}; const u8g_fntpgm_uint8_t fontpage_400_149_149[34] U8G_FONT_SECTION("fontpage_400_149_149") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x17,0x31,0x49,0x85,0x00,0x3e,0x21, - 0x21,0x3e}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x17,0x31,0x49,0x85,0x00,0x3E,0x21, + 0x21,0x3E}; const u8g_fntpgm_uint8_t fontpage_400_156_156[45] U8G_FONT_SECTION("fontpage_400_156_156") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x00,0xfe,0x7a,0x80,0x0a,0x80,0x0a,0x80,0x16,0x80,0x12, - 0x80,0x2a,0x80,0x4a,0x80,0x86,0x80,0x02,0x80,0x02,0x80,0x02,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7A,0x80,0x0A,0x80,0x0A,0x80,0x16,0x80,0x12, + 0x80,0x2A,0x80,0x4A,0x80,0x86,0x80,0x02,0x80,0x02,0x80,0x02,0x80}; const u8g_fntpgm_uint8_t fontpage_401_253_253[45] U8G_FONT_SECTION("fontpage_401_253_253") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x3f,0x00,0x01,0x00,0x0e,0x00,0x71,0x80,0x00, - 0x00,0xff,0xc0,0x04,0x00,0x3f,0x00,0x00,0x80,0x00,0x80,0x00,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, + 0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x00,0x80,0x00,0x80}; const u8g_fntpgm_uint8_t fontpage_402_128_128[45] U8G_FONT_SECTION("fontpage_402_128_128") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x3f,0x00,0x01,0x00,0x0e,0x00,0x71,0x80,0x00, - 0x00,0xff,0xc0,0x04,0x00,0x24,0x00,0x24,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, + 0x00,0xFF,0xC0,0x04,0x00,0x24,0x00,0x24,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_402_145_145[45] U8G_FONT_SECTION("fontpage_402_145_145") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x3f,0x00,0x01,0x00,0x0e,0x00,0x71,0x80,0x00, - 0x00,0xff,0xc0,0x04,0x00,0x1f,0x00,0x20,0x80,0x20,0x80,0x1f,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, + 0x00,0xFF,0xC0,0x04,0x00,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00}; const u8g_fntpgm_uint8_t fontpage_403_144_144[45] U8G_FONT_SECTION("fontpage_403_144_144") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x3f,0x00,0x0e,0x00,0x71,0x80,0x00,0x00,0xff, - 0xc0,0x00,0x00,0x3f,0x00,0x00,0x80,0x3f,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x0E,0x00,0x71,0x80,0x00,0x00,0xFF, + 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_403_192_192[34] U8G_FONT_SECTION("fontpage_403_192_192") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x09,0x11,0x31,0x31,0xc9,0x85,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x31,0x31,0xC9,0x85,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_409_152_152[34] U8G_FONT_SECTION("fontpage_409_152_152") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x01,0xf9,0x11,0x17,0x31,0x49,0x85,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x11,0x17,0x31,0x49,0x85,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_410_136_136[41] U8G_FONT_SECTION("fontpage_410_136_136") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x1e,0x00,0x00,0x00,0x3f,0x00,0x02,0x00,0x0e, - 0x00,0x71,0x80,0x04,0x00,0x04,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x02,0x00,0x0E, + 0x00,0x71,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_411_149_149[45] U8G_FONT_SECTION("fontpage_411_149_149") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x1e,0x00,0x00,0x00,0x3f,0x00,0x0c,0x00,0x73, - 0x80,0x00,0x00,0xff,0xc0,0x04,0x00,0x3f,0x00,0x00,0x80,0x00,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x00,0x00,0x3F,0x00,0x0C,0x00,0x73, + 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x00,0x80}; const u8g_fntpgm_uint8_t fontpage_411_156_156[47] U8G_FONT_SECTION("fontpage_411_156_156") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x09,0xfd,0x00, - 0x00,0x0a,0x0c,0x18,0x0a,0x00,0xfd,0x1e,0x00,0x00,0x00,0x3f,0x00,0x1a,0x00,0x21, - 0x00,0xff,0xc0,0x04,0x00,0x3f,0x00,0x00,0x80,0x3f,0x00,0x20,0x00,0x3f,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFD,0x00, + 0x00,0x0A,0x0C,0x18,0x0A,0x00,0xFD,0x1E,0x00,0x00,0x00,0x3F,0x00,0x1A,0x00,0x21, + 0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_411_164_164[45] U8G_FONT_SECTION("fontpage_411_164_164") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x1e,0x00,0x00,0x00,0x3f,0x00,0x0c,0x00,0x73, - 0x80,0x00,0x00,0xff,0xc0,0x04,0x00,0x3f,0x00,0x20,0x80,0x3f,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x00,0x00,0x3F,0x00,0x0C,0x00,0x73, + 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x20,0x80,0x3F,0x00}; const u8g_fntpgm_uint8_t fontpage_411_232_232[45] U8G_FONT_SECTION("fontpage_411_232_232") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x00,0xfe,0x38,0x80,0x00,0x80,0x7c,0x80,0x18,0x80,0x66, - 0x80,0x00,0x80,0xfe,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x00,0x80,0x7C,0x80,0x18,0x80,0x66, + 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; const u8g_fntpgm_uint8_t fontpage_412_216_216[34] U8G_FONT_SECTION("fontpage_412_216_216") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x01,0xf9,0x09,0x11,0x31,0x49,0x85,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x09,0x11,0x31,0x49,0x85,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_412_232_232[34] U8G_FONT_SECTION("fontpage_412_232_232") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x01,0xf9,0x09,0x31,0xcd,0x00,0x3f,0x41, - 0x41,0x3f}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x09,0x31,0xCD,0x00,0x3F,0x41, + 0x41,0x3F}; const u8g_fntpgm_uint8_t fontpage_412_244_244[45] U8G_FONT_SECTION("fontpage_412_244_244") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0xf9,0x00,0x09,0x00,0x09,0x00,0xf1,0x00,0x11, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x09,0x00,0xF1,0x00,0x11, 0x80,0x21,0x00,0x41,0x00,0x81,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_414_156_156[34] U8G_FONT_SECTION("fontpage_414_156_156") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x09,0x0f,0xf1,0x11,0x2f,0x41,0x81,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x0F,0xF1,0x11,0x2F,0x41,0x81,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_417_209_209[45] U8G_FONT_SECTION("fontpage_417_209_209") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0xf9,0x00,0x81,0x00,0xf9,0x80,0x81,0x00,0x81, - 0x00,0xfd,0x00,0x00,0x00,0x41,0x00,0x7e,0x00,0x41,0x00,0x7e,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0xF9,0x80,0x81,0x00,0x81, + 0x00,0xFD,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; const u8g_fntpgm_uint8_t fontpage_418_176_176[34] U8G_FONT_SECTION("fontpage_418_176_176") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf9,0x81,0x81,0xf7,0x81,0x81,0x81,0xf9,0x01, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0xF7,0x81,0x81,0x81,0xF9,0x01, 0x01,0x01}; const u8g_fntpgm_uint8_t fontpage_418_204_204[34] U8G_FONT_SECTION("fontpage_418_204_204") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0xf5,0x85,0x85,0xed,0x85,0x85,0x85,0xfd,0x05, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x85,0x85,0xED,0x85,0x85,0x85,0xFD,0x05, 0x05,0x05}; const u8g_fntpgm_uint8_t fontpage_419_160_160[41] U8G_FONT_SECTION("fontpage_419_160_160") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x20,0x00,0x3f,0x00,0x20,0x00,0x20, - 0x00,0x3f,0x80,0x04,0x00,0x04,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_421_184_184[41] U8G_FONT_SECTION("fontpage_421_184_184") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xb8,0xb8,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x20,0x00,0x3f,0x00,0x20,0x00,0x20, - 0x00,0x3f,0x80,0x00,0x00,0x00,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB8,0xB8,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_423_156_156[45] U8G_FONT_SECTION("fontpage_423_156_156") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0xfa,0x80,0x4a,0x80,0x4e,0x80,0x4a,0x80,0x4a, - 0x80,0xfe,0x80,0x02,0x80,0x12,0x80,0x10,0x00,0x10,0x00,0x1f,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0xFA,0x80,0x4A,0x80,0x4E,0x80,0x4A,0x80,0x4A, + 0x80,0xFE,0x80,0x02,0x80,0x12,0x80,0x10,0x00,0x10,0x00,0x1F,0xC0}; const u8g_fntpgm_uint8_t fontpage_426_132_132[41] U8G_FONT_SECTION("fontpage_426_132_132") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0x00,0x00, - 0x00,0x0a,0x09,0x12,0x0a,0x00,0x00,0x3f,0x80,0x12,0x00,0x12,0x00,0x12,0x00,0x12, - 0x00,0x7f,0x80,0x00,0x00,0x00,0x00,0xff,0xc0}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x12,0x00,0x12, + 0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_426_216_216[45] U8G_FONT_SECTION("fontpage_426_216_216") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0x71,0x00,0x01,0x00,0xfd,0x00,0x01,0x00,0x71, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x01,0x00,0xFD,0x00,0x01,0x00,0x71, 0x80,0x89,0x00,0x89,0x00,0x89,0x00,0x71,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_426_233_233[45] U8G_FONT_SECTION("fontpage_426_233_233") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x09,0xfe,0x00, - 0x00,0x09,0x0b,0x16,0x0a,0x01,0xfe,0x71,0x00,0x01,0x00,0xfd,0x00,0x49,0x80,0x89, - 0x00,0x79,0x00,0x00,0x00,0x41,0x00,0x7e,0x00,0x41,0x00,0x7e,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x01,0x00,0xFD,0x00,0x49,0x80,0x89, + 0x00,0x79,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; const u8g_fntpgm_uint8_t fontpage_428_200_200[45] U8G_FONT_SECTION("fontpage_428_200_200") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x0e,0x00,0x00,0x00,0x7f,0x80,0x21,0x00,0x1e, - 0x00,0x04,0x00,0xff,0xc0,0x00,0x00,0x3f,0x00,0x20,0x80,0x3f,0x00}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x0E,0x00,0x00,0x00,0x7F,0x80,0x21,0x00,0x1E, + 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x20,0x80,0x3F,0x00}; const u8g_fntpgm_uint8_t fontpage_428_212_212[45] U8G_FONT_SECTION("fontpage_428_212_212") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x09,0xfe,0x00, - 0x00,0x0a,0x0b,0x16,0x0a,0x00,0xfe,0x38,0x80,0x00,0x80,0x7e,0x80,0x00,0x80,0x38, - 0x80,0x44,0xc0,0x3c,0x80,0x10,0x80,0xfe,0x80,0x00,0x80,0x00,0x80}; + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x00,0x80,0x7E,0x80,0x00,0x80,0x38, + 0x80,0x44,0xC0,0x3C,0x80,0x10,0x80,0xFE,0x80,0x00,0x80,0x00,0x80}; const u8g_fntpgm_uint8_t fontpage_431_136_136[34] U8G_FONT_SECTION("fontpage_431_136_136") = { - 0x00,0x0b,0x0d,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xfe,0x00, - 0x00,0x08,0x0b,0x0b,0x0a,0x01,0xfe,0x71,0x01,0xfd,0x01,0x71,0x49,0x89,0x49,0x71, + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xFD,0x01,0x71,0x49,0x89,0x49,0x71, 0x01,0x01}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_pl.h b/Marlin/src/lcd/dogm/fontdata/langdata_pl.h index 9a41b13a5a..926f075295 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_pl.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_pl.h @@ -6,28 +6,28 @@ #include const u8g_fntpgm_uint8_t fontpage_2_132_133[45] U8G_FONT_SECTION("fontpage_2_132_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x07,0xfe,0x00, - 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x10,0x08, - 0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x08,0x78,0x88,0x78,0x20,0x30}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x10,0x08, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x08,0x78,0x88,0x78,0x20,0x30}; const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; const u8g_fntpgm_uint8_t fontpage_2_153_153[30] U8G_FONT_SECTION("fontpage_2_153_153") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x05,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0xf0,0x80,0x70,0x20,0x30}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0xF0,0x80,0x70,0x20,0x30}; const u8g_fntpgm_uint8_t fontpage_2_193_196[73] U8G_FONT_SECTION("fontpage_2_193_196") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc4,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0x60,0xc0,0x40,0x40,0x78,0x03,0x07, - 0x07,0x06,0x01,0x00,0xc0,0x40,0x60,0xc0,0x40,0x40,0xe0,0x05,0x0a,0x0a,0x06,0x00, - 0x00,0x10,0x20,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x08,0x08,0x06,0x00, - 0x00,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC4,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0x60,0xC0,0x40,0x40,0x78,0x03,0x07, + 0x07,0x06,0x01,0x00,0xC0,0x40,0x60,0xC0,0x40,0x40,0xE0,0x05,0x0A,0x0A,0x06,0x00, + 0x00,0x10,0x20,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x08,0x08,0x06,0x00, + 0x00,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_2_218_219[47] U8G_FONT_SECTION("fontpage_2_218_219") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xda,0xdb,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDA,0xDB,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; const u8g_fntpgm_uint8_t fontpage_2_252_252[30] U8G_FONT_SECTION("fontpage_2_252_252") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ru.h b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h index 87e3d422a5..4edd6e74e3 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_ru.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h @@ -6,63 +6,63 @@ #include const u8g_fntpgm_uint8_t fontpage_8_144_168[348] U8G_FONT_SECTION("fontpage_8_144_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0xa8,0x00,0x0a,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, - 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50, - 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, - 0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x70,0xa8,0xa8,0x05,0x07,0x07, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0xA8,0x00,0x0A,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, + 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, + 0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0x05,0x07,0x07, 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88,0x70,0x00, - 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0, - 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, - 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88, - 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80, + 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00, + 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, + 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88, + 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80, 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, - 0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, - 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8, + 0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, + 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8, 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05, - 0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8}; + 0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8}; const u8g_fntpgm_uint8_t fontpage_8_171_173[56] U8G_FONT_SECTION("fontpage_8_171_173") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xad,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xc8,0xa8,0xa8,0xc8,0x04,0x07, - 0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAD,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xC8,0xA8,0xA8,0xC8,0x04,0x07, + 0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0,0x05,0x07,0x07,0x06,0x00, 0x00,0x70,0x88,0x08,0x78,0x08,0x88,0x70}; const u8g_fntpgm_uint8_t fontpage_8_175_207[400] U8G_FONT_SECTION("fontpage_8_175_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xcf,0x00,0x08,0xfe,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xCF,0x00,0x08,0xFE,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, - 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, - 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, - 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05, + 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, + 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8, - 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05, - 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8, - 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, - 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, + 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, + 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88, - 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8,0xa8,0xa8, + 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8,0xA8,0xA8, 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, - 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08,0x05,0x05, - 0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0xe0,0x04, - 0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70,0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00, - 0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90 + 0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, + 0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x88,0xC8,0xA8,0xC8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0xE0,0x04, + 0x05,0x05,0x06,0x01,0x00,0xE0,0x10,0x70,0x10,0xE0,0x05,0x05,0x05,0x06,0x00,0x00, + 0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90 }; const u8g_fntpgm_uint8_t fontpage_8_209_209[30] U8G_FONT_SECTION("fontpage_8_209_209") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xf0,0x80,0x70}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xF0,0x80,0x70}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h index 6bcafb64ed..d2e7ec2c56 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h @@ -6,35 +6,35 @@ #include const u8g_fntpgm_uint8_t fontpage_2_140_143[79] U8G_FONT_SECTION("fontpage_2_140_143") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8f,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8F,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70,0x05, - 0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x06, - 0x0a,0x0a,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78}; + 0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x06, + 0x0A,0x0A,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78}; const u8g_fntpgm_uint8_t fontpage_2_186_186[33] U8G_FONT_SECTION("fontpage_2_186_186") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0x00,0x00, - 0x00,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0x40,0x40, - 0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0x00,0x00, + 0x00,0x03,0x0A,0x0A,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40, + 0xE0}; const u8g_fntpgm_uint8_t fontpage_2_190_190[33] U8G_FONT_SECTION("fontpage_2_190_190") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0x00,0x00, - 0x00,0x03,0x0a,0x0a,0x06,0x01,0x00,0xa0,0x40,0x00,0xc0,0x40,0x40,0x40,0x40,0x40, - 0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0x00,0x00, + 0x00,0x03,0x0A,0x0A,0x06,0x01,0x00,0xA0,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40, + 0xE0}; const u8g_fntpgm_uint8_t fontpage_2_199_200[47] U8G_FONT_SECTION("fontpage_2_199_200") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc8,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88, - 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC8,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; const u8g_fntpgm_uint8_t fontpage_2_224_225[47] U8G_FONT_SECTION("fontpage_2_224_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe1,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE1,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; const u8g_fntpgm_uint8_t fontpage_2_229_229[33] U8G_FONT_SECTION("fontpage_2_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, 0x18}; const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfe,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x08,0x10,0x20,0x40,0x80, - 0xf8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFE,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80, + 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_test.h b/Marlin/src/lcd/dogm/fontdata/langdata_test.h index 85a3cf5553..c397d8b4b9 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_test.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_test.h @@ -6,222 +6,222 @@ #include const u8g_fntpgm_uint8_t fontpage_8_128_255[1677] U8G_FONT_SECTION("fontpage_8_128_255") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x0a,0xfe,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, - 0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, - 0x05,0x09,0x09,0x06,0x00,0xfe,0xe0,0x40,0x40,0x70,0x48,0x48,0x48,0x08,0x30,0x05, - 0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05, - 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0xf0,0x80,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, - 0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40, - 0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10, - 0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x60,0xa0,0xa0,0xb0,0xa8,0xa8,0xb0,0x05, - 0x07,0x07,0x06,0x00,0x00,0xa0,0xa0,0xa0,0xf0,0xa8,0xa8,0xb0,0x05,0x07,0x07,0x06, - 0x00,0x00,0xe0,0x40,0x40,0x70,0x48,0x48,0x48,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, - 0x20,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, - 0x20,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88, - 0x70,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x88, - 0x88,0x88,0x88,0x88,0x88,0xf8,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88, - 0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06, - 0x00,0xff,0x30,0x50,0x50,0x50,0x50,0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70, - 0x20,0x70,0xa8,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a, - 0x0a,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8, - 0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x00,0x0A,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, + 0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, + 0x05,0x09,0x09,0x06,0x00,0xFE,0xE0,0x40,0x40,0x70,0x48,0x48,0x48,0x08,0x30,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0xF0,0x80,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xE0, + 0x40,0x40,0x40,0x40,0x40,0xE0,0x03,0x09,0x09,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40, + 0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10, + 0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x60,0xA0,0xA0,0xB0,0xA8,0xA8,0xB0,0x05, + 0x07,0x07,0x06,0x00,0x00,0xA0,0xA0,0xA0,0xF0,0xA8,0xA8,0xB0,0x05,0x07,0x07,0x06, + 0x00,0x00,0xE0,0x40,0x40,0x70,0x48,0x48,0x48,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10, + 0x20,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40, + 0x20,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88, + 0x70,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x88, + 0x88,0x88,0x88,0x88,0x88,0xF8,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88, + 0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06, + 0x00,0xFF,0x30,0x50,0x50,0x50,0x50,0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00, + 0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70, + 0x20,0x70,0xA8,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A, + 0x0A,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8, + 0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88, 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20, 0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07, - 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe, - 0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88, - 0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, - 0xa8,0xa8,0xf8,0x05,0x09,0x09,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8, - 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xc0,0x40,0x40,0x70,0x48,0x48,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xc8,0xa8,0xa8,0xc8,0x04,0x07,0x07,0x06, - 0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x08,0x78,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0xa8,0xa8,0xe8, - 0xa8,0xa8,0x90,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE, + 0x90,0x90,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88, + 0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, + 0xA8,0xA8,0xF8,0x05,0x09,0x09,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8, + 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xC8,0xA8,0xA8,0xC8,0x04,0x07,0x07,0x06, + 0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x08,0x78,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0xA8,0xA8,0xE8, + 0xA8,0xA8,0x90,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88, 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88, - 0xf0,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06, - 0x06,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x70,0x88,0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8, + 0x00,0x70,0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88, + 0xF0,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06, + 0x06,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8, 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88, - 0x98,0xa8,0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05, + 0x00,0x88,0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88, + 0x98,0xA8,0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05, 0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x88,0xd8,0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88, + 0x88,0xD8,0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88, 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00, - 0x00,0xf8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88, - 0xf0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05, - 0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88, - 0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8, - 0xa8,0xa8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88, - 0x05,0x07,0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8, - 0xa8,0xa8,0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08, - 0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90, - 0xe0,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70,0x10,0xe0,0x05,0x05,0x05,0x06, - 0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70, - 0x50,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x09,0x09, - 0x06,0x00,0xfe,0x40,0xe0,0x40,0x70,0x48,0x48,0x48,0x08,0x10,0x05,0x08,0x08,0x06, - 0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80,0x80,0x80,0x04,0x05,0x05,0x06,0x01,0x00, - 0x70,0x80,0xe0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xf0, - 0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x06,0x06,0x06, - 0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0xe0,0x04,0x08,0x08,0x06,0x01,0xfe,0x10,0x00, - 0x30,0x10,0x10,0x10,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x60,0xa0,0xb0,0xa8, - 0xb0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0xa0,0xf0,0xa8,0xb0,0x05,0x07,0x07,0x06, - 0x00,0x00,0x40,0xe0,0x40,0x70,0x48,0x48,0x48,0x04,0x08,0x08,0x06,0x01,0x00,0x20, - 0x40,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, - 0x88,0x98,0xa8,0xc8,0x88,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x88,0x70,0x00,0x88,0x88, - 0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x88,0xf8, - 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x88,0x88,0xa8,0xa8,0xa8,0x50,0x05, - 0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00, - 0x40,0xf0,0x40,0x70,0x48,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xf0, - 0x40,0x70,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x98,0xa0,0xa0,0xf8,0xa0,0xa0, - 0x98,0x05,0x05,0x05,0x06,0x00,0x00,0x98,0xa0,0xf8,0xa0,0x98,0x05,0x07,0x07,0x06, - 0x00,0x00,0x20,0x50,0x50,0x88,0xf8,0xa8,0xa8,0x05,0x06,0x06,0x06,0x00,0x00,0x20, - 0x50,0x50,0x88,0xf8,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0x90,0xb8,0xf8,0xb8, - 0xb8,0xb8,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0x90,0xf8,0xb8,0xb8,0x05,0x08,0x08, - 0x06,0x00,0x00,0xf8,0x88,0x50,0x50,0x70,0xa8,0xa8,0xa8,0x05,0x06,0x06,0x06,0x00, - 0x00,0xf8,0x88,0x50,0x70,0xa8,0xa8,0x06,0x08,0x08,0x06,0x00,0x00,0xfc,0xc4,0xa8, - 0x90,0xf8,0xb8,0xb8,0xa8,0x06,0x06,0x06,0x06,0x00,0x00,0xfc,0xa8,0x90,0xf8,0xb8, - 0xa8,0x05,0x0c,0x0c,0x06,0x00,0xfe,0x50,0x20,0x00,0x70,0x88,0x08,0x30,0x08,0x08, - 0x70,0x80,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x50,0x20,0x00,0x70,0x88,0x30,0x08, - 0x70,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0x70,0x20,0x20,0x20, - 0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, - 0xf8,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20, - 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0xF8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88, + 0xF0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05, + 0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88, + 0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8, + 0xA8,0xA8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8, + 0xA8,0xA8,0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08, + 0x05,0x05,0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0xC8,0xA8,0xC8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90, + 0xE0,0x04,0x05,0x05,0x06,0x01,0x00,0xE0,0x10,0x70,0x10,0xE0,0x05,0x05,0x05,0x06, + 0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70, + 0x50,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF0,0x80,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x09,0x09, + 0x06,0x00,0xFE,0x40,0xE0,0x40,0x70,0x48,0x48,0x48,0x08,0x10,0x05,0x08,0x08,0x06, + 0x00,0x00,0x10,0x20,0x00,0xF8,0x80,0x80,0x80,0x80,0x04,0x05,0x05,0x06,0x01,0x00, + 0x70,0x80,0xE0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xF0, + 0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06,0x06, + 0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0xE0,0x04,0x08,0x08,0x06,0x01,0xFE,0x10,0x00, + 0x30,0x10,0x10,0x10,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x60,0xA0,0xB0,0xA8, + 0xB0,0x05,0x05,0x05,0x06,0x00,0x00,0xA0,0xA0,0xF0,0xA8,0xB0,0x05,0x07,0x07,0x06, + 0x00,0x00,0x40,0xE0,0x40,0x70,0x48,0x48,0x48,0x04,0x08,0x08,0x06,0x01,0x00,0x20, + 0x40,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, + 0x88,0x98,0xA8,0xC8,0x88,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x88,0x70,0x00,0x88,0x88, + 0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x88,0xF8, + 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x05, + 0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50,0x05,0x07,0x07,0x06,0x00,0x00, + 0x40,0xF0,0x40,0x70,0x48,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF0, + 0x40,0x70,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x98,0xA0,0xA0,0xF8,0xA0,0xA0, + 0x98,0x05,0x05,0x05,0x06,0x00,0x00,0x98,0xA0,0xF8,0xA0,0x98,0x05,0x07,0x07,0x06, + 0x00,0x00,0x20,0x50,0x50,0x88,0xF8,0xA8,0xA8,0x05,0x06,0x06,0x06,0x00,0x00,0x20, + 0x50,0x50,0x88,0xF8,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0x90,0xB8,0xF8,0xB8, + 0xB8,0xB8,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0x90,0xF8,0xB8,0xB8,0x05,0x08,0x08, + 0x06,0x00,0x00,0xF8,0x88,0x50,0x50,0x70,0xA8,0xA8,0xA8,0x05,0x06,0x06,0x06,0x00, + 0x00,0xF8,0x88,0x50,0x70,0xA8,0xA8,0x06,0x08,0x08,0x06,0x00,0x00,0xFC,0xC4,0xA8, + 0x90,0xF8,0xB8,0xB8,0xA8,0x06,0x06,0x06,0x06,0x00,0x00,0xFC,0xA8,0x90,0xF8,0xB8, + 0xA8,0x05,0x0C,0x0C,0x06,0x00,0xFE,0x50,0x20,0x00,0x70,0x88,0x08,0x30,0x08,0x08, + 0x70,0x80,0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x50,0x20,0x00,0x70,0x88,0x30,0x08, + 0x70,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x20, + 0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xF8,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20, + 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x0A,0x0A,0x06,0x00, 0x00,0x90,0x48,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20,0x05,0x08,0x08,0x06,0x00, - 0x00,0x90,0x48,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0x40, - 0xa0,0xa0,0xb8,0xb8,0xb8,0x58,0x08,0x10,0x05,0x07,0x07,0x06,0x00,0xfe,0x58,0xb8, - 0xb8,0xb8,0x58,0x08,0x10,0x05,0x0a,0x0a,0x06,0x00,0xff,0x20,0x70,0xa8,0x88,0x88, - 0x88,0x88,0xa8,0x70,0x20,0x05,0x08,0x08,0x06,0x00,0xff,0x20,0x70,0xa8,0x88,0x88, - 0xa8,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x70,0x00,0x20,0x20,0x88,0x88,0x88, - 0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0x20,0xa8,0x88,0xa8,0x50,0x05, - 0x0a,0x0a,0x06,0x00,0x00,0xf8,0xa8,0x00,0x50,0x88,0x88,0xa8,0xa8,0xa8,0x50,0x05, - 0x08,0x08,0x06,0x00,0x00,0xf8,0xa8,0x00,0x50,0x88,0xa8,0xa8,0x50}; + 0x00,0x90,0x48,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0x40, + 0xA0,0xA0,0xB8,0xB8,0xB8,0x58,0x08,0x10,0x05,0x07,0x07,0x06,0x00,0xFE,0x58,0xB8, + 0xB8,0xB8,0x58,0x08,0x10,0x05,0x0A,0x0A,0x06,0x00,0xFF,0x20,0x70,0xA8,0x88,0x88, + 0x88,0x88,0xA8,0x70,0x20,0x05,0x08,0x08,0x06,0x00,0xFF,0x20,0x70,0xA8,0x88,0x88, + 0xA8,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x70,0x00,0x20,0x20,0x88,0x88,0x88, + 0xA8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0x20,0xA8,0x88,0xA8,0x50,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0xF8,0xA8,0x00,0x50,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x05, + 0x08,0x08,0x06,0x00,0x00,0xF8,0xA8,0x00,0x50,0x88,0xA8,0xA8,0x50}; const u8g_fntpgm_uint8_t fontpage_97_129_191[911] U8G_FONT_SECTION("fontpage_97_129_191") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0xbf,0x00,0x0d,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x04,0x00,0x4e,0x00,0x55,0x00,0x64, - 0x80,0x48,0x40,0xa8,0x40,0x90,0x40,0x90,0x80,0x61,0x00,0x06,0x00,0x08,0x0b,0x0b, - 0x0c,0x01,0xff,0x20,0x10,0x70,0x1c,0x28,0xe2,0x39,0x21,0x21,0x12,0x0c,0x08,0x07, - 0x07,0x0c,0x02,0xff,0x28,0x2e,0xf5,0x21,0x16,0x10,0x10,0x0b,0x0b,0x16,0x0c,0x00, - 0xff,0x02,0x00,0x37,0x00,0x20,0x00,0x13,0xc0,0x9c,0x20,0x70,0x20,0x09,0xc0,0x08, - 0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x07,0x07,0x07,0x0c,0x03,0xff,0x10,0x9c,0xb2, - 0xd2,0x9c,0x10,0x20,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x82,0x00,0x47,0x80, - 0x4a,0x40,0x52,0x20,0x62,0x20,0x6a,0x40,0x47,0x80,0x42,0x00,0x04,0x00,0x08,0x00, - 0x07,0x07,0x07,0x0c,0x02,0xff,0x10,0x1c,0x10,0x10,0x78,0x96,0x60,0x09,0x0b,0x16, - 0x0c,0x01,0xff,0x10,0x00,0x08,0x00,0x09,0x80,0x0e,0x00,0x08,0x00,0x08,0x00,0x08, - 0x00,0x78,0x00,0x8e,0x00,0x89,0x80,0x70,0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20, - 0x18,0x40,0x80,0x80,0xbc,0xc2,0x82,0x02,0x0c,0x70,0x07,0x0b,0x0b,0x0c,0x02,0xff, - 0x88,0x54,0x52,0x62,0x62,0x42,0x42,0x04,0x04,0x08,0x10,0x08,0x0a,0x0a,0x0c,0x01, - 0xff,0x4e,0x34,0x08,0x10,0x3e,0x61,0x81,0x19,0x26,0x1c,0x0b,0x0b,0x16,0x0c,0x00, - 0xff,0x20,0x00,0x10,0x00,0x13,0x00,0x34,0x80,0xd8,0x80,0x10,0x80,0x10,0x80,0x30, - 0x80,0x50,0x80,0xb0,0x60,0x10,0x00,0x08,0x0a,0x0a,0x0c,0x01,0xff,0x4e,0x34,0x08, - 0x10,0x3e,0x61,0x81,0x01,0x06,0x18,0x08,0x07,0x07,0x0c,0x02,0xff,0x40,0x30,0xee, - 0x31,0x61,0xa2,0x24,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x10,0x00,0x10,0x00, - 0x9b,0x80,0x7c,0x40,0x10,0x20,0x10,0x20,0x30,0x20,0x50,0x40,0xb1,0x80,0x10,0x00, - 0x0a,0x0a,0x14,0x0c,0x01,0xff,0x4e,0x00,0x34,0x00,0x04,0x00,0x1f,0x00,0x28,0x80, - 0x48,0x40,0x90,0x40,0x96,0x40,0x69,0x80,0x47,0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff, - 0x20,0x00,0x1f,0x00,0x04,0x00,0x1f,0x00,0x20,0x80,0x4c,0x80,0x13,0x00,0x0c,0x00, - 0x00,0x00,0x59,0x80,0x86,0x40,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00, - 0x9e,0x00,0x70,0x00,0x21,0x80,0x72,0x00,0x8c,0x00,0x14,0x00,0x24,0x00,0x20,0x00, - 0x1f,0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0x10,0x00,0x08,0x00,0x08,0x00,0x10,0x00, - 0x10,0x00,0x38,0x00,0x24,0x00,0x44,0x40,0x44,0x80,0x83,0x00,0x0a,0x0b,0x16,0x0c, - 0x00,0xff,0x10,0x00,0x0c,0x80,0x00,0x40,0x1d,0x00,0xe2,0x80,0x02,0x00,0x02,0x00, - 0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0xff,0xff,0xff,0xff,0x04,0x03,0x03,0x06, - 0x00,0x05,0x20,0x90,0x40,0xff,0x04,0x03,0x03,0x06,0x00,0x05,0x20,0x90,0x40,0x03, - 0x03,0x03,0x06,0x00,0x05,0x40,0xa0,0x40,0xff,0xff,0xff,0x05,0x03,0x03,0x06,0x00, - 0x03,0xf8,0x00,0xf8,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10,0x60,0x40,0x80,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06, - 0x00,0x00,0x10,0x20,0x60,0xa0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20, - 0x60,0xa0,0x20,0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x20,0xf0,0x90,0x10,0x20,0x05, - 0x07,0x07,0x06,0x00,0x00,0x20,0xf8,0x88,0x88,0x08,0x10,0x60,0x03,0x04,0x04,0x06, - 0x00,0x00,0xe0,0x40,0x40,0xe0,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x20,0x20,0x20, - 0x20,0xf8,0x04,0x05,0x05,0x06,0x00,0x00,0x20,0xf0,0x20,0x60,0xa0,0x05,0x07,0x07, - 0x06,0x00,0x00,0x10,0xf8,0x10,0x30,0x50,0x90,0x10,0x05,0x07,0x07,0x06,0x00,0x00, - 0x40,0xf8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40, - 0xf8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xf8,0x20,0x20, - 0xf8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xf8,0x20,0x20,0xf8, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x81,0xBF,0x00,0x0D,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x04,0x00,0x4E,0x00,0x55,0x00,0x64, + 0x80,0x48,0x40,0xA8,0x40,0x90,0x40,0x90,0x80,0x61,0x00,0x06,0x00,0x08,0x0B,0x0B, + 0x0C,0x01,0xFF,0x20,0x10,0x70,0x1C,0x28,0xE2,0x39,0x21,0x21,0x12,0x0C,0x08,0x07, + 0x07,0x0C,0x02,0xFF,0x28,0x2E,0xF5,0x21,0x16,0x10,0x10,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x02,0x00,0x37,0x00,0x20,0x00,0x13,0xC0,0x9C,0x20,0x70,0x20,0x09,0xC0,0x08, + 0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x07,0x07,0x07,0x0C,0x03,0xFF,0x10,0x9C,0xB2, + 0xD2,0x9C,0x10,0x20,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x82,0x00,0x47,0x80, + 0x4A,0x40,0x52,0x20,0x62,0x20,0x6A,0x40,0x47,0x80,0x42,0x00,0x04,0x00,0x08,0x00, + 0x07,0x07,0x07,0x0C,0x02,0xFF,0x10,0x1C,0x10,0x10,0x78,0x96,0x60,0x09,0x0B,0x16, + 0x0C,0x01,0xFF,0x10,0x00,0x08,0x00,0x09,0x80,0x0E,0x00,0x08,0x00,0x08,0x00,0x08, + 0x00,0x78,0x00,0x8E,0x00,0x89,0x80,0x70,0x00,0x07,0x0B,0x0B,0x0C,0x02,0xFF,0x20, + 0x18,0x40,0x80,0x80,0xBC,0xC2,0x82,0x02,0x0C,0x70,0x07,0x0B,0x0B,0x0C,0x02,0xFF, + 0x88,0x54,0x52,0x62,0x62,0x42,0x42,0x04,0x04,0x08,0x10,0x08,0x0A,0x0A,0x0C,0x01, + 0xFF,0x4E,0x34,0x08,0x10,0x3E,0x61,0x81,0x19,0x26,0x1C,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x20,0x00,0x10,0x00,0x13,0x00,0x34,0x80,0xD8,0x80,0x10,0x80,0x10,0x80,0x30, + 0x80,0x50,0x80,0xB0,0x60,0x10,0x00,0x08,0x0A,0x0A,0x0C,0x01,0xFF,0x4E,0x34,0x08, + 0x10,0x3E,0x61,0x81,0x01,0x06,0x18,0x08,0x07,0x07,0x0C,0x02,0xFF,0x40,0x30,0xEE, + 0x31,0x61,0xA2,0x24,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x10,0x00,0x10,0x00, + 0x9B,0x80,0x7C,0x40,0x10,0x20,0x10,0x20,0x30,0x20,0x50,0x40,0xB1,0x80,0x10,0x00, + 0x0A,0x0A,0x14,0x0C,0x01,0xFF,0x4E,0x00,0x34,0x00,0x04,0x00,0x1F,0x00,0x28,0x80, + 0x48,0x40,0x90,0x40,0x96,0x40,0x69,0x80,0x47,0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF, + 0x20,0x00,0x1F,0x00,0x04,0x00,0x1F,0x00,0x20,0x80,0x4C,0x80,0x13,0x00,0x0C,0x00, + 0x00,0x00,0x59,0x80,0x86,0x40,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00, + 0x9E,0x00,0x70,0x00,0x21,0x80,0x72,0x00,0x8C,0x00,0x14,0x00,0x24,0x00,0x20,0x00, + 0x1F,0x00,0x0A,0x0A,0x14,0x0C,0x01,0xFF,0x10,0x00,0x08,0x00,0x08,0x00,0x10,0x00, + 0x10,0x00,0x38,0x00,0x24,0x00,0x44,0x40,0x44,0x80,0x83,0x00,0x0A,0x0B,0x16,0x0C, + 0x00,0xFF,0x10,0x00,0x0C,0x80,0x00,0x40,0x1D,0x00,0xE2,0x80,0x02,0x00,0x02,0x00, + 0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0xFF,0xFF,0xFF,0xFF,0x04,0x03,0x03,0x06, + 0x00,0x05,0x20,0x90,0x40,0xFF,0x04,0x03,0x03,0x06,0x00,0x05,0x20,0x90,0x40,0x03, + 0x03,0x03,0x06,0x00,0x05,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0x05,0x03,0x03,0x06,0x00, + 0x03,0xF8,0x00,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0x60,0x40,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06, + 0x00,0x00,0x10,0x20,0x60,0xA0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20, + 0x60,0xA0,0x20,0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x20,0xF0,0x90,0x10,0x20,0x05, + 0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x88,0x88,0x08,0x10,0x60,0x03,0x04,0x04,0x06, + 0x00,0x00,0xE0,0x40,0x40,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20, + 0x20,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0x20,0xF0,0x20,0x60,0xA0,0x05,0x07,0x07, + 0x06,0x00,0x00,0x10,0xF8,0x10,0x30,0x50,0x90,0x10,0x05,0x07,0x07,0x06,0x00,0x00, + 0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40, + 0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x20,0x20, + 0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x20,0x20,0xF8, 0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0x88,0x08,0x10,0x60,0x05, 0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40,0x78,0x48,0x88,0x08,0x10,0x60,0x05,0x07, - 0x07,0x06,0x00,0x00,0x80,0xf8,0x90,0x90,0x10,0x10,0x20,0x05,0x09,0x09,0x06,0x00, - 0x00,0x28,0x28,0x80,0xf8,0x90,0x90,0x10,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00, - 0xf8,0x08,0x08,0x08,0x08,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xf8, - 0x08,0x08,0x08,0x08,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0xf8,0x50,0x50,0x50, - 0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xf8,0x50,0x50,0x50,0x10, - 0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xc0,0x08,0xc8,0x08,0x10,0xe0,0x07,0x0d,0x0d, - 0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xc0,0x08,0xc8,0x08,0x10,0xe0, + 0x07,0x06,0x00,0x00,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x09,0x09,0x06,0x00, + 0x00,0x28,0x28,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00, + 0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xF8, + 0x08,0x08,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0xF8,0x50,0x50,0x50, + 0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xF8,0x50,0x50,0x50,0x10, + 0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0xC8,0x08,0x10,0xE0,0x07,0x0D,0x0D, + 0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xC0,0x08,0xC8,0x08,0x10,0xE0, 0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05,0x09,0x09,0x06, 0x00,0x00,0x28,0x28,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x40,0x40,0xf8,0x48,0x50,0x40,0x38,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08, - 0x40,0x40,0xf8,0x48,0x50,0x40,0x38,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x48,0x48, + 0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x38,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08, + 0x40,0x40,0xF8,0x48,0x50,0x40,0x38,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x48,0x48, 0x10,0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x88,0x48,0x48,0x10, - 0x10,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0xa8,0x18,0x10,0x60}; + 0x10,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0xA8,0x18,0x10,0x60}; const u8g_fntpgm_uint8_t fontpage_97_193_255[822] U8G_FONT_SECTION("fontpage_97_193_255") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xff,0x00,0x09,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60,0x20,0xf8,0x20,0x20,0x40,0x05,0x09, - 0x09,0x06,0x00,0x00,0x28,0x08,0x10,0x60,0x20,0xf8,0x20,0x20,0x40,0x05,0x04,0x04, - 0x06,0x00,0x00,0xa8,0xa8,0x08,0x30,0x05,0x06,0x06,0x06,0x00,0x00,0xa8,0xa8,0xa8, - 0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xa8,0xa8,0xa8,0x08, - 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xf8,0x20,0x20,0x20,0x40,0x05, - 0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xf8,0x20,0x20,0x20,0x40,0x04,0x07, - 0x07,0x06,0x01,0x00,0x80,0x80,0xc0,0xa0,0x90,0x80,0x80,0x04,0x09,0x09,0x06,0x01, - 0x00,0x50,0x10,0x80,0x80,0xc0,0xa0,0x90,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00, - 0x20,0x20,0xf8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0x00, - 0x00,0x00,0xf8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28,0x10,0x28,0xc0,0x05, - 0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xa8,0x20,0x03,0x06,0x06,0x06, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xFF,0x00,0x09,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60,0x20,0xF8,0x20,0x20,0x40,0x05,0x09, + 0x09,0x06,0x00,0x00,0x28,0x08,0x10,0x60,0x20,0xF8,0x20,0x20,0x40,0x05,0x04,0x04, + 0x06,0x00,0x00,0xA8,0xA8,0x08,0x30,0x05,0x06,0x06,0x06,0x00,0x00,0xA8,0xA8,0xA8, + 0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xA8,0xA8,0xA8,0x08, + 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x20,0x20,0x20,0x40,0x05, + 0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xF8,0x20,0x20,0x20,0x40,0x04,0x07, + 0x07,0x06,0x01,0x00,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x04,0x09,0x09,0x06,0x01, + 0x00,0x50,0x10,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0x20,0xF8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0x00, + 0x00,0x00,0xF8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28,0x10,0x28,0xC0,0x05, + 0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xA8,0x20,0x03,0x06,0x06,0x06, 0x01,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0x50, 0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x10,0x50,0x50, 0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00,0x10,0x50,0x50,0x48, - 0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xe0,0x80,0x80,0x70,0x05,0x09, - 0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xe0,0x80,0x80,0x70,0x05,0x09,0x09, - 0x06,0x00,0x00,0x18,0x18,0x00,0x80,0x90,0xe0,0x80,0x80,0x70,0x05,0x06,0x06,0x06, - 0x00,0x00,0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28, - 0x00,0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00, - 0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00,0x01,0x60,0xa0,0x10,0x10, - 0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60,0xa0,0x10,0x10,0x08,0x05, - 0x08,0x08,0x06,0x00,0x01,0x18,0x18,0x00,0x60,0xa0,0x10,0x10,0x08,0x05,0x07,0x07, - 0x06,0x00,0x00,0x20,0xf8,0x20,0xa8,0xa8,0xa8,0x20,0x05,0x09,0x09,0x06,0x00,0x00, - 0x28,0x08,0x20,0xf8,0x20,0xa8,0xa8,0xa8,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x18, - 0x18,0x20,0xf8,0x20,0xa8,0xa8,0xa8,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08, - 0x08,0x50,0x20,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xe0,0x00,0xe0,0x00,0xc0,0x30, - 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x20,0x40,0x48,0xf8,0x08,0x05,0x06,0x06, - 0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xc0,0x05,0x06,0x06,0x06,0x00,0x00,0xf0, - 0x40,0xf8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40,0xf8,0x48,0x50,0x40, - 0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xf8,0x48,0x50,0x40,0x40,0x04,0x05,0x05, - 0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xf0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10, - 0x10,0x10,0x10,0xf8,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10,0xf0,0x10,0xf0,0x05, - 0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x08,0xf8,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x00,0xf8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06,0x00,0x00,0x10,0x90, - 0x90,0x90,0x90,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xa0,0xa0,0xa8, - 0xa8,0xb0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88,0xb0,0xc0,0x05,0x06, - 0x06,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0xf8,0x04,0x05,0x05,0x06,0x00,0x00, - 0xf0,0x90,0x10,0x10,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x88,0x88,0x08,0x10, - 0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xf8,0x50,0x50,0xf8,0x10,0x10,0x05,0x06, - 0x06,0x06,0x00,0x00,0x70,0x10,0x20,0x20,0x20,0xf8,0x05,0x06,0x06,0x06,0x00,0x00, - 0xf8,0x08,0xf8,0x08,0x10,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xc0,0x08,0x08,0x08, - 0x10,0xe0,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xf8,0x88,0x88,0x08,0x10, - 0x60,0x04,0x05,0x05,0x06,0x00,0x00,0x40,0xf0,0x50,0x50,0xb0,0x04,0x05,0x05,0x06, - 0x00,0x00,0x80,0xf0,0xa0,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, - 0xf8,0x88,0x88,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x10,0xf8, - 0x50,0x50,0xf8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x70,0x10, - 0x20,0x20,0x20,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xf8,0x08,0xf8, - 0x08,0x10,0x60,0x02,0x02,0x02,0x06,0x02,0x03,0xc0,0xc0,0x05,0x02,0x02,0x06,0x00, + 0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x09, + 0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x09,0x09, + 0x06,0x00,0x00,0x18,0x18,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x06,0x06,0x06, + 0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28, + 0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00, + 0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00,0x01,0x60,0xA0,0x10,0x10, + 0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60,0xA0,0x10,0x10,0x08,0x05, + 0x08,0x08,0x06,0x00,0x01,0x18,0x18,0x00,0x60,0xA0,0x10,0x10,0x08,0x05,0x07,0x07, + 0x06,0x00,0x00,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09,0x09,0x06,0x00,0x00, + 0x28,0x08,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x18, + 0x18,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08, + 0x08,0x50,0x20,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x30, + 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x20,0x40,0x48,0xF8,0x08,0x05,0x06,0x06, + 0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xC0,0x05,0x06,0x06,0x06,0x00,0x00,0xF0, + 0x40,0xF8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40,0xF8,0x48,0x50,0x40, + 0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x40,0x04,0x05,0x05, + 0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xF0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10, + 0x10,0x10,0x10,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0xF0,0x10,0xF0,0x05, + 0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x00,0xF8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06,0x00,0x00,0x10,0x90, + 0x90,0x90,0x90,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xA0,0xA0,0xA8, + 0xA8,0xB0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88,0xB0,0xC0,0x05,0x06, + 0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xF8,0x04,0x05,0x05,0x06,0x00,0x00, + 0xF0,0x90,0x10,0x10,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x08,0x10, + 0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xF8,0x50,0x50,0xF8,0x10,0x10,0x05,0x06, + 0x06,0x06,0x00,0x00,0x70,0x10,0x20,0x20,0x20,0xF8,0x05,0x06,0x06,0x06,0x00,0x00, + 0xF8,0x08,0xF8,0x08,0x10,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0x08,0x08, + 0x10,0xE0,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x88,0x88,0x08,0x10, + 0x60,0x04,0x05,0x05,0x06,0x00,0x00,0x40,0xF0,0x50,0x50,0xB0,0x04,0x05,0x05,0x06, + 0x00,0x00,0x80,0xF0,0xA0,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, + 0xF8,0x88,0x88,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x10,0xF8, + 0x50,0x50,0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x70,0x10, + 0x20,0x20,0x20,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xF8,0x08,0xF8, + 0x08,0x10,0x60,0x02,0x02,0x02,0x06,0x02,0x03,0xC0,0xC0,0x05,0x02,0x02,0x06,0x00, 0x03,0x80,0x78,0x05,0x04,0x04,0x06,0x00,0x02,0x80,0x60,0x10,0x08,0x05,0x07,0x07, 0x06,0x00,0x02,0x28,0x28,0x00,0x80,0x60,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x00, - 0xf8,0x08,0x08,0x08,0x08,0x08}; + 0xF8,0x08,0x08,0x08,0x08,0x08}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_tr.h b/Marlin/src/lcd/dogm/fontdata/langdata_tr.h index 454fc7cc67..a4068e10d0 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_tr.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_tr.h @@ -6,18 +6,18 @@ #include const u8g_fntpgm_uint8_t fontpage_2_158_159[49] U8G_FONT_SECTION("fontpage_2_158_159") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9e,0x9f,0x00,0x0a,0xfe,0x00, - 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88,0x70,0x00,0x70,0x88,0x80,0x80,0x98,0x88, - 0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x78,0x08, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9E,0x9F,0x00,0x0A,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00,0x70,0x88,0x80,0x80,0x98,0x88, + 0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x78,0x08, 0x70}; const u8g_fntpgm_uint8_t fontpage_2_176_177[43] U8G_FONT_SECTION("fontpage_2_176_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb1,0x00,0x09,0x00,0x00, - 0x00,0x03,0x09,0x09,0x06,0x01,0x00,0x40,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0, - 0x03,0x05,0x05,0x06,0x01,0x00,0xc0,0x40,0x40,0x40,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB1,0x00,0x09,0x00,0x00, + 0x00,0x03,0x09,0x09,0x06,0x01,0x00,0x40,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0, + 0x03,0x05,0x05,0x06,0x01,0x00,0xC0,0x40,0x40,0x40,0xE0}; const u8g_fntpgm_uint8_t fontpage_2_222_223[45] U8G_FONT_SECTION("fontpage_2_222_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xdf,0x00,0x07,0xfe,0x00, - 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x10,0x60, - 0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x80,0x70,0x08,0xf0,0x10,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDF,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x10,0x60, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x80,0x70,0x08,0xF0,0x10,0x60}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h index e3800eb6bb..47ec93992f 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h @@ -6,71 +6,71 @@ #include const u8g_fntpgm_uint8_t fontpage_8_134_134[30] U8G_FONT_SECTION("fontpage_8_134_134") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00, - 0x00,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00, + 0x00,0x03,0x07,0x07,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0}; const u8g_fntpgm_uint8_t fontpage_8_144_169[363] U8G_FONT_SECTION("fontpage_8_144_169") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0xa9,0x00,0x0a,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, - 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50, - 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, - 0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x70,0xa8,0xa8,0x05,0x07,0x07, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0xA9,0x00,0x0A,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, + 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, + 0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0x05,0x07,0x07, 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88,0x70,0x00, - 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0, - 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, - 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88, - 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80, + 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00, + 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, + 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88, + 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80, 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, - 0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, - 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8, + 0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, + 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8, 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05, - 0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8,0x05,0x09,0x09,0x06, - 0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08}; + 0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x05,0x09,0x09,0x06, + 0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}; const u8g_fntpgm_uint8_t fontpage_8_172_172[30] U8G_FONT_SECTION("fontpage_8_172_172") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x07,0x00,0x00, - 0x00,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x07,0x00,0x00, + 0x00,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0}; const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc9,0x00,0x08,0xfe,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xC9,0x00,0x08,0xFE,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, - 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, - 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, - 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05, + 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, + 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8, - 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05, - 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8, - 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, - 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, + 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, + 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88, - 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8,0xa8,0xa8, + 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8,0xA8,0xA8, 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, - 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08}; + 0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, + 0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}; const u8g_fntpgm_uint8_t fontpage_8_204_204[28] U8G_FONT_SECTION("fontpage_8_204_204") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x05,0x00,0x00, - 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x05,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0xE0}; const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xcf,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCF,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06, 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; const u8g_fntpgm_uint8_t fontpage_8_212_212[28] U8G_FONT_SECTION("fontpage_8_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x05,0x00,0x00, - 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x80,0xe0,0x80,0x70}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x05,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x80,0xE0,0x80,0x70}; const u8g_fntpgm_uint8_t fontpage_8_214_215[41] U8G_FONT_SECTION("fontpage_8_214_215") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd7,0x00,0x06,0x00,0x00, - 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x06,0x06, - 0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD6,0xD7,0x00,0x06,0x00,0x00, + 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06, + 0x06,0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0xE0}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_vi.h b/Marlin/src/lcd/dogm/fontdata/langdata_vi.h index bebf3251c1..a8a0c5c121 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_vi.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_vi.h @@ -6,175 +6,175 @@ #include const u8g_fntpgm_uint8_t fontpage_2_131_131[31] U8G_FONT_SECTION("fontpage_2_131_131") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x08,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x08,0x00,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x78}; const u8g_fntpgm_uint8_t fontpage_2_144_145[44] U8G_FONT_SECTION("fontpage_2_144_145") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x91,0x00,0x08,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0xe8,0x48,0x48,0xf0,0x06,0x08, - 0x08,0x06,0x00,0x00,0x08,0x1c,0x08,0x78,0x88,0x88,0x88,0x78}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x91,0x00,0x08,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0xE8,0x48,0x48,0xF0,0x06,0x08, + 0x08,0x06,0x00,0x00,0x08,0x1C,0x08,0x78,0x88,0x88,0x88,0x78}; const u8g_fntpgm_uint8_t fontpage_2_169_169[31] U8G_FONT_SECTION("fontpage_2_169_169") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x08,0x00,0x00, - 0x00,0x04,0x08,0x08,0x06,0x00,0x00,0x50,0xa0,0x00,0x60,0x20,0x20,0x20,0x70}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x08,0x00,0x00, + 0x00,0x04,0x08,0x08,0x06,0x00,0x00,0x50,0xA0,0x00,0x60,0x20,0x20,0x20,0x70}; const u8g_fntpgm_uint8_t fontpage_3_161_161[30] U8G_FONT_SECTION("fontpage_3_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x07,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x07,0x00,0x00, 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x70,0x88,0x88,0x88,0x70}; const u8g_fntpgm_uint8_t fontpage_3_175_176[43] U8G_FONT_SECTION("fontpage_3_175_176") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xb0,0x00,0x08,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xB0,0x00,0x08,0x00,0x00, 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x08,0x98,0x90,0x90,0x90,0x90,0x90,0x60,0x05, - 0x06,0x06,0x06,0x00,0x00,0x08,0x98,0x90,0x90,0xb0,0x50}; + 0x06,0x06,0x06,0x00,0x00,0x08,0x98,0x90,0x90,0xB0,0x50}; const u8g_fntpgm_uint8_t fontpage_6_131_131[25] U8G_FONT_SECTION("fontpage_6_131_131") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x02,0x02,0x06,0x00,0x08,0x68,0xb0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x02,0x02,0x06,0x00,0x08,0x68,0xB0}; const u8g_fntpgm_uint8_t fontpage_6_137_137[26] U8G_FONT_SECTION("fontpage_6_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0x00,0x00, - 0x00,0x03,0x03,0x03,0x06,0x01,0x07,0xc0,0x20,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0x00,0x00, + 0x00,0x03,0x03,0x03,0x06,0x01,0x07,0xC0,0x20,0x40}; const u8g_fntpgm_uint8_t fontpage_6_163_163[24] U8G_FONT_SECTION("fontpage_6_163_163") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa3,0x00,0x00,0xfe,0x00, - 0x00,0x01,0x01,0x01,0x06,0x02,0xfe,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x00,0xFE,0x00, + 0x00,0x01,0x01,0x01,0x06,0x02,0xFE,0x80}; const u8g_fntpgm_uint8_t fontpage_6_192_193[33] U8G_FONT_SECTION("fontpage_6_192_193") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc1,0x00,0x0a,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC1,0x00,0x0A,0x00,0x00, 0x00,0x02,0x02,0x02,0x06,0x01,0x08,0x80,0x40,0x02,0x02,0x02,0x06,0x02,0x08,0x40, 0x80}; const u8g_fntpgm_uint8_t fontpage_61_161_161[30] U8G_FONT_SECTION("fontpage_61_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x05,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x07,0x00,0xfe,0x70,0x08,0x78,0x88,0x78,0x00,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x70,0x08,0x78,0x88,0x78,0x00,0x20}; const u8g_fntpgm_uint8_t fontpage_61_163_163[32] U8G_FONT_SECTION("fontpage_61_163_163") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa3,0x00,0x09,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x09,0x00,0x00, 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78 }; const u8g_fntpgm_uint8_t fontpage_61_165_165[33] U8G_FONT_SECTION("fontpage_61_165_165") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0x00,0x00, - 0x00,0x06,0x0a,0x0a,0x07,0x00,0x00,0x04,0x08,0x30,0x48,0x00,0x70,0x08,0x78,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x30,0x48,0x00,0x70,0x08,0x78,0x88, 0x78}; const u8g_fntpgm_uint8_t fontpage_61_167_167[33] U8G_FONT_SECTION("fontpage_61_167_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0x00,0x10,0x08,0x30,0x48,0x00,0x70,0x08,0x78,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x30,0x48,0x00,0x70,0x08,0x78,0x88, 0x78}; const u8g_fntpgm_uint8_t fontpage_61_169_169[34] U8G_FONT_SECTION("fontpage_61_169_169") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x0b,0x00,0x00, - 0x00,0x06,0x0b,0x0b,0x07,0x00,0x00,0x0c,0x04,0x08,0x30,0x48,0x00,0x70,0x08,0x78, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x0B,0x00,0x00, + 0x00,0x06,0x0B,0x0B,0x07,0x00,0x00,0x0C,0x04,0x08,0x30,0x48,0x00,0x70,0x08,0x78, 0x88,0x78}; const u8g_fntpgm_uint8_t fontpage_61_173_173[33] U8G_FONT_SECTION("fontpage_61_173_173") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x08,0xfe,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0xfe,0x30,0x48,0x00,0x70,0x08,0x78,0x88,0x78,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x30,0x48,0x00,0x70,0x08,0x78,0x88,0x78,0x00, 0x20}; const u8g_fntpgm_uint8_t fontpage_61_175_175[33] U8G_FONT_SECTION("fontpage_61_175_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0x00,0x08,0x10,0x48,0x30,0x00,0x70,0x08,0x78,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x08,0x10,0x48,0x30,0x00,0x70,0x08,0x78,0x88, 0x78}; const u8g_fntpgm_uint8_t fontpage_61_177_177[33] U8G_FONT_SECTION("fontpage_61_177_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0x00,0x40,0x20,0x48,0x30,0x00,0x70,0x08,0x78,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x40,0x20,0x48,0x30,0x00,0x70,0x08,0x78,0x88, 0x78}; const u8g_fntpgm_uint8_t fontpage_61_179_179[34] U8G_FONT_SECTION("fontpage_61_179_179") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb3,0xb3,0x00,0x0b,0x00,0x00, - 0x00,0x05,0x0b,0x0b,0x07,0x00,0x00,0x18,0x08,0x10,0x48,0x30,0x00,0x70,0x08,0x78, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB3,0xB3,0x00,0x0B,0x00,0x00, + 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x18,0x08,0x10,0x48,0x30,0x00,0x70,0x08,0x78, 0x88,0x78}; const u8g_fntpgm_uint8_t fontpage_61_181_181[34] U8G_FONT_SECTION("fontpage_61_181_181") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb5,0xb5,0x00,0x0b,0x00,0x00, - 0x00,0x06,0x0b,0x0b,0x07,0x00,0x00,0x14,0x28,0x00,0x48,0x30,0x00,0x70,0x08,0x78, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB5,0xB5,0x00,0x0B,0x00,0x00, + 0x00,0x06,0x0B,0x0B,0x07,0x00,0x00,0x14,0x28,0x00,0x48,0x30,0x00,0x70,0x08,0x78, 0x88,0x78}; const u8g_fntpgm_uint8_t fontpage_61_183_183[33] U8G_FONT_SECTION("fontpage_61_183_183") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x08,0xfe,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0xfe,0x48,0x30,0x00,0x70,0x08,0x78,0x88,0x78,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x48,0x30,0x00,0x70,0x08,0x78,0x88,0x78,0x00, 0x20}; const u8g_fntpgm_uint8_t fontpage_61_191_191[33] U8G_FONT_SECTION("fontpage_61_191_191") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x0a,0x00,0x00, - 0x00,0x06,0x0a,0x0a,0x07,0x00,0x00,0x04,0x08,0x20,0x50,0x00,0x70,0x88,0xf0,0x80, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x20,0x50,0x00,0x70,0x88,0xF0,0x80, 0x78}; const u8g_fntpgm_uint8_t fontpage_61_193_193[33] U8G_FONT_SECTION("fontpage_61_193_193") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc1,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0x00,0x10,0x08,0x20,0x50,0x00,0x70,0x88,0xf0,0x80, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x20,0x50,0x00,0x70,0x88,0xF0,0x80, 0x78}; const u8g_fntpgm_uint8_t fontpage_61_195_195[34] U8G_FONT_SECTION("fontpage_61_195_195") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0b,0x00,0x00, - 0x00,0x05,0x0b,0x0b,0x07,0x00,0x00,0x18,0x08,0x10,0x60,0x90,0x00,0x60,0x90,0xf0, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0B,0x00,0x00, + 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x18,0x08,0x10,0x60,0x90,0x00,0x60,0x90,0xF0, 0x80,0x70}; const u8g_fntpgm_uint8_t fontpage_61_199_199[33] U8G_FONT_SECTION("fontpage_61_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x08,0xfe,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0xfe,0x20,0x50,0x00,0x70,0x88,0xf0,0x80,0x78,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x20,0x50,0x00,0x70,0x88,0xF0,0x80,0x78,0x00, 0x20}; const u8g_fntpgm_uint8_t fontpage_61_201_201[32] U8G_FONT_SECTION("fontpage_61_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x09,0x00,0x00, - 0x00,0x03,0x09,0x09,0x07,0x02,0x00,0x60,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x09,0x00,0x00, + 0x00,0x03,0x09,0x09,0x07,0x02,0x00,0x60,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0 }; const u8g_fntpgm_uint8_t fontpage_61_203_203[32] U8G_FONT_SECTION("fontpage_61_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x07,0xfe,0x00, - 0x00,0x03,0x09,0x09,0x07,0x02,0xfe,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x00,0x40 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x07,0xFE,0x00, + 0x00,0x03,0x09,0x09,0x07,0x02,0xFE,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x00,0x40 }; const u8g_fntpgm_uint8_t fontpage_61_205_205[30] U8G_FONT_SECTION("fontpage_61_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x05,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x07,0x00,0xfe,0x70,0x88,0x88,0x88,0x70,0x00,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x70,0x88,0x88,0x88,0x70,0x00,0x20}; const u8g_fntpgm_uint8_t fontpage_61_207_207[32] U8G_FONT_SECTION("fontpage_61_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x09,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x09,0x00,0x00, 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_61_209_209[33] U8G_FONT_SECTION("fontpage_61_209_209") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0x00,0x00, - 0x00,0x06,0x0a,0x0a,0x07,0x00,0x00,0x04,0x08,0x20,0x50,0x00,0x70,0x88,0x88,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x20,0x50,0x00,0x70,0x88,0x88,0x88, 0x70}; const u8g_fntpgm_uint8_t fontpage_61_211_211[33] U8G_FONT_SECTION("fontpage_61_211_211") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0x00,0x10,0x08,0x20,0x50,0x00,0x70,0x88,0x88,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x20,0x50,0x00,0x70,0x88,0x88,0x88, 0x70}; const u8g_fntpgm_uint8_t fontpage_61_213_213[33] U8G_FONT_SECTION("fontpage_61_213_213") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0x00,0x18,0x08,0x30,0x50,0x00,0x70,0x88,0x88,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x18,0x08,0x30,0x50,0x00,0x70,0x88,0x88,0x88, 0x70}; const u8g_fntpgm_uint8_t fontpage_61_215_215[34] U8G_FONT_SECTION("fontpage_61_215_215") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0x00,0x0b,0x00,0x00, - 0x00,0x05,0x0b,0x0b,0x07,0x00,0x00,0x28,0x50,0x00,0x20,0x50,0x00,0x70,0x88,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD7,0xD7,0x00,0x0B,0x00,0x00, + 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x28,0x50,0x00,0x20,0x50,0x00,0x70,0x88,0x88, 0x88,0x70}; const u8g_fntpgm_uint8_t fontpage_61_217_217[33] U8G_FONT_SECTION("fontpage_61_217_217") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x08,0xfe,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0xfe,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x00, 0x20}; const u8g_fntpgm_uint8_t fontpage_61_219_219[32] U8G_FONT_SECTION("fontpage_61_219_219") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x09,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0x00,0x09,0x00,0x00, 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x20,0x40,0x10,0x08,0x70,0x88,0x88,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_61_221_221[32] U8G_FONT_SECTION("fontpage_61_221_221") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x09,0x00,0x00, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x09,0x00,0x00, 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x80,0x40,0x10,0x08,0x70,0x88,0x88,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_61_223_223[33] U8G_FONT_SECTION("fontpage_61_223_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0x00,0x60,0x20,0x40,0x10,0x08,0x70,0x88,0x88,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x60,0x20,0x40,0x10,0x08,0x70,0x88,0x88,0x88, 0x70}; const u8g_fntpgm_uint8_t fontpage_61_225_225[32] U8G_FONT_SECTION("fontpage_61_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x09,0x00,0x00, - 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x50,0xa0,0x10,0x08,0x70,0x88,0x88,0x88,0x70 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x09,0x00,0x00, + 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x50,0xA0,0x10,0x08,0x70,0x88,0x88,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_61_227_227[32] U8G_FONT_SECTION("fontpage_61_227_227") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe3,0xe3,0x00,0x07,0xfe,0x00, - 0x00,0x05,0x09,0x09,0x00,0x00,0xfe,0x10,0x08,0x70,0x88,0x88,0x88,0x70,0x00,0x20 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE3,0xE3,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x09,0x09,0x00,0x00,0xFE,0x10,0x08,0x70,0x88,0x88,0x88,0x70,0x00,0x20 }; const u8g_fntpgm_uint8_t fontpage_61_229_229[30] U8G_FONT_SECTION("fontpage_61_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x05,0xfe,0x00, - 0x00,0x05,0x07,0x07,0x07,0x00,0xfe,0x88,0x88,0x88,0x88,0x70,0x00,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x88,0x88,0x88,0x88,0x70,0x00,0x20}; const u8g_fntpgm_uint8_t fontpage_61_231_231[33] U8G_FONT_SECTION("fontpage_61_231_231") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0x00,0x00, - 0x00,0x05,0x0a,0x0a,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x88,0x88,0x88,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x88,0x88,0x88,0x88, 0x70}; const u8g_fntpgm_uint8_t fontpage_61_233_233[32] U8G_FONT_SECTION("fontpage_61_233_233") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x09,0x00,0x00, - 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x10,0x20,0x0c,0x04,0x88,0x88,0x88,0x88,0x70 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x09,0x00,0x00, + 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x10,0x20,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_61_235_235[32] U8G_FONT_SECTION("fontpage_61_235_235") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x09,0x00,0x00, - 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x40,0x20,0x0c,0x04,0x88,0x88,0x88,0x88,0x70 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x09,0x00,0x00, + 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x40,0x20,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_61_237_237[33] U8G_FONT_SECTION("fontpage_61_237_237") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0x00,0x00, - 0x00,0x06,0x0a,0x0a,0x07,0x00,0x00,0x30,0x10,0x20,0x0c,0x04,0x88,0x88,0x88,0x88, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x30,0x10,0x20,0x0C,0x04,0x88,0x88,0x88,0x88, 0x70}; const u8g_fntpgm_uint8_t fontpage_61_239_239[32] U8G_FONT_SECTION("fontpage_61_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x09,0x00,0x00, - 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x28,0x50,0x0c,0x04,0x88,0x88,0x88,0x88,0x70 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x09,0x00,0x00, + 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x28,0x50,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 }; const u8g_fntpgm_uint8_t fontpage_61_241_241[32] U8G_FONT_SECTION("fontpage_61_241_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x07,0xfe,0x00, - 0x00,0x06,0x09,0x09,0x07,0x00,0xfe,0x0c,0x04,0x88,0x88,0x88,0x88,0x70,0x00,0x20 + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x07,0xFE,0x00, + 0x00,0x06,0x09,0x09,0x07,0x00,0xFE,0x0C,0x04,0x88,0x88,0x88,0x88,0x70,0x00,0x20 }; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h index 9d8ee47fab..491d480a01 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h @@ -6,1461 +6,1461 @@ #include const u8g_fntpgm_uint8_t fontpage_64_157_157[26] U8G_FONT_SECTION("fontpage_64_157_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x07,0x00,0x00, - 0x00,0x05,0x03,0x03,0x06,0x00,0x04,0xd8,0x48,0x90}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x07,0x00,0x00, + 0x00,0x05,0x03,0x03,0x06,0x00,0x04,0xD8,0x48,0x90}; const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xF8}; const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, - 0x00,0x0b,0x02,0x04,0x0c,0x00,0x04,0x00,0x40,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, + 0x00,0x0B,0x02,0x04,0x0C,0x00,0x04,0x00,0x40,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x8b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, - 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x0b,0x0b,0x16,0x0c,0x00, - 0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x04,0x00,0x04, - 0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0xFF,0xE0,0x04, 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, 0x00}; const u8g_fntpgm_uint8_t fontpage_156_141_141[45] U8G_FONT_SECTION("fontpage_156_141_141") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x02,0x00,0x02,0x00,0x04,0x00,0x0d, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x02,0x00,0x02,0x00,0x04,0x00,0x0D, 0x00,0x14,0x80,0x24,0x40,0x44,0x20,0x84,0x00,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_156_147_147[45] U8G_FONT_SECTION("fontpage_156_147_147") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x3f,0xc0,0x04,0x00,0x04,0x00,0xff, - 0xe0,0x08,0x00,0x1f,0xc0,0x00,0x80,0x0d,0x00,0x02,0x00,0x01,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x3F,0xC0,0x04,0x00,0x04,0x00,0xFF, + 0xE0,0x08,0x00,0x1F,0xC0,0x00,0x80,0x0D,0x00,0x02,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_156_157_157[45] U8G_FONT_SECTION("fontpage_156_157_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x29,0x40,0x4a,0x40,0xf7, - 0x80,0x10,0x80,0x21,0x00,0x42,0x00,0xf7,0xc0,0x00,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x29,0x40,0x4A,0x40,0xF7, + 0x80,0x10,0x80,0x21,0x00,0x42,0x00,0xF7,0xC0,0x00,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_156_170_170[45] U8G_FONT_SECTION("fontpage_156_170_170") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x49, - 0x00,0x88,0xc0,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x49, + 0x00,0x88,0xC0,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0x88, - 0x80,0x88,0x80,0xff,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0x80,0x88,0x80,0x88, + 0x80,0x88,0x80,0xFF,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_156_186_187[73] U8G_FONT_SECTION("fontpage_156_186_187") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xbb,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x48,0x00,0x28,0x00,0x08,0x00,0xff,0x80,0x08, - 0x80,0x0c,0x80,0x12,0x80,0x12,0x80,0x20,0x80,0x44,0x80,0x83,0x00,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x7f, - 0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBB,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x48,0x00,0x28,0x00,0x08,0x00,0xFF,0x80,0x08, + 0x80,0x0C,0x80,0x12,0x80,0x12,0x80,0x20,0x80,0x44,0x80,0x83,0x00,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x7F, + 0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_156_201_201[45] U8G_FONT_SECTION("fontpage_156_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x80,0x24,0x80,0x24,0x80,0x21,0x00,0x11, - 0x00,0x12,0x00,0x0a,0x00,0x04,0x00,0x0a,0x00,0x31,0x80,0xc0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x80,0x24,0x80,0x24,0x80,0x21,0x00,0x11, + 0x00,0x12,0x00,0x0A,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60}; const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0x7f,0xc0,0x00,0x80,0x01, - 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0x7F,0xC0,0x00,0x80,0x01, + 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xE0}; const u8g_fntpgm_uint8_t fontpage_157_134_134[45] U8G_FONT_SECTION("fontpage_157_134_134") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0xff,0x80,0x01,0x00,0x02,0x00,0x0c,0x00,0x08, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x08, 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x28,0x00,0x10,0x00}; const u8g_fntpgm_uint8_t fontpage_157_140_140[39] U8G_FONT_SECTION("fontpage_157_140_140") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x08,0x00,0x00, - 0x00,0x0b,0x08,0x10,0x0c,0x00,0x00,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x08,0x00,0x00, + 0x00,0x0B,0x08,0x10,0x0C,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_157_142_142[45] U8G_FONT_SECTION("fontpage_157_142_142") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, - 0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1c,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8E,0x8E,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, + 0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1C,0x00}; const u8g_fntpgm_uint8_t fontpage_157_164_164[45] U8G_FONT_SECTION("fontpage_157_164_164") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20, - 0x80,0x51,0x40,0x11,0x00,0x0a,0x00,0x04,0x00,0x1b,0x00,0x60,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20, + 0x80,0x51,0x40,0x11,0x00,0x0A,0x00,0x04,0x00,0x1B,0x00,0x60,0xE0}; const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x11,0x00,0x1f,0x00,0x00, - 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x00,0x21,0x20,0xc0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x11,0x00,0x1F,0x00,0x00, + 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x00,0x21,0x20,0xC0,0xE0}; const u8g_fntpgm_uint8_t fontpage_157_206_206[45] U8G_FONT_SECTION("fontpage_157_206_206") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xce,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11, - 0x00,0x11,0x00,0x2a,0x80,0x2a,0x80,0x44,0x40,0x88,0x40,0x10,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11, + 0x00,0x11,0x00,0x2A,0x80,0x2A,0x80,0x44,0x40,0x88,0x40,0x10,0x20}; const u8g_fntpgm_uint8_t fontpage_157_228_229[73] U8G_FONT_SECTION("fontpage_157_228_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x0a,0x00,0x11,0x00,0x24, - 0x80,0xc2,0x60,0x3f,0x80,0x01,0x00,0x0a,0x00,0x04,0x00,0x02,0x00,0x0a,0x0b,0x16, - 0x0c,0x01,0xff,0x01,0x00,0x81,0x00,0x91,0x00,0x89,0x00,0x89,0x00,0x81,0x00,0x91, - 0x00,0xa1,0x00,0xc2,0x80,0x84,0x40,0x18,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE4,0xE5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x24, + 0x80,0xC2,0x60,0x3F,0x80,0x01,0x00,0x0A,0x00,0x04,0x00,0x02,0x00,0x0A,0x0B,0x16, + 0x0C,0x01,0xFF,0x01,0x00,0x81,0x00,0x91,0x00,0x89,0x00,0x89,0x00,0x81,0x00,0x91, + 0x00,0xA1,0x00,0xC2,0x80,0x84,0x40,0x18,0x40}; const u8g_fntpgm_uint8_t fontpage_157_246_246[45] U8G_FONT_SECTION("fontpage_157_246_246") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x15,0x00,0x25,0x00,0x2f,0xc0,0x71, - 0x00,0xa1,0x00,0x2f,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x15,0x00,0x25,0x00,0x2F,0xC0,0x71, + 0x00,0xA1,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, - 0x20,0xa7,0xc0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, + 0x20,0xA7,0xC0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xC0}; const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_145_145") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x21,0x00,0x3f,0xe0,0x61, - 0x00,0xa3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x21,0x00,0x3F,0xE0,0x61, + 0x00,0xA3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_158_160_160[45] U8G_FONT_SECTION("fontpage_158_160_160") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x27,0xe0,0x21,0x00,0x6f, - 0xe0,0xa2,0x00,0x27,0xe0,0x20,0x40,0x22,0x80,0x21,0x00,0x20,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x27,0xE0,0x21,0x00,0x6F, + 0xE0,0xA2,0x00,0x27,0xE0,0x20,0x40,0x22,0x80,0x21,0x00,0x20,0x80}; const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xce,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x20,0x00,0x2f,0xe0,0x60, - 0x00,0xa4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x10,0xc0,0x1f,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xaf,0xe0,0x29, - 0x00,0x29,0x20,0x2a,0xa0,0x2d,0x60,0x28,0xa0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x11,0x00,0x20,0x00,0x2F,0xE0,0x60, + 0x00,0xA4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2F,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x10,0xC0,0x1F,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xAF,0xE0,0x29, + 0x00,0x29,0x20,0x2A,0xA0,0x2D,0x60,0x28,0xA0}; const u8g_fntpgm_uint8_t fontpage_158_211_211[45] U8G_FONT_SECTION("fontpage_158_211_211") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x22,0x00,0x5f,0xc0,0x42,0x00,0xc7, - 0x00,0x4a,0x80,0x52,0x40,0x62,0x20,0x4f,0x80,0x42,0x00,0x42,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x22,0x00,0x5F,0xC0,0x42,0x00,0xC7, + 0x00,0x4A,0x80,0x52,0x40,0x62,0x20,0x4F,0x80,0x42,0x00,0x42,0x00}; const u8g_fntpgm_uint8_t fontpage_158_217_217[45] U8G_FONT_SECTION("fontpage_158_217_217") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, - 0x60,0x04,0x00,0x7f,0xc0,0x04,0x00,0x15,0x00,0x24,0x80,0x4c,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, + 0x60,0x04,0x00,0x7F,0xC0,0x04,0x00,0x15,0x00,0x24,0x80,0x4C,0x40}; const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x14,0x00,0x27,0xe0,0x2a,0x00,0x72, - 0x00,0xa3,0xc0,0x22,0x00,0x22,0x00,0x23,0xe0,0x22,0x00,0x22,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x00,0x14,0x00,0x27,0xE0,0x2A,0x00,0x72, + 0x00,0xA3,0xC0,0x22,0x00,0x22,0x00,0x23,0xE0,0x22,0x00,0x22,0x00}; const u8g_fntpgm_uint8_t fontpage_158_255_255[45] U8G_FONT_SECTION("fontpage_158_255_255") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x21,0x00,0x2f,0xe0,0x69, - 0x20,0xaf,0xe0,0x29,0x00,0x25,0x00,0x22,0x00,0x25,0x80,0x38,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x1F,0xE0,0x21,0x00,0x2F,0xE0,0x69, + 0x20,0xAF,0xE0,0x29,0x00,0x25,0x00,0x22,0x00,0x25,0x80,0x38,0x60}; const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x80,0x14,0x80,0x24,0x80,0x2f,0xe0,0x64, - 0x80,0xa4,0x80,0x3f,0xe0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x80,0x14,0x80,0x24,0x80,0x2F,0xE0,0x64, + 0x80,0xA4,0x80,0x3F,0xE0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; const u8g_fntpgm_uint8_t fontpage_159_181_181[45] U8G_FONT_SECTION("fontpage_159_181_181") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb5,0xb5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xc0,0x20,0x40,0x4f,0xc0,0x40,0x40,0xdf, - 0xe0,0x50,0x20,0x4f,0xc0,0x44,0x80,0x43,0x00,0x44,0x80,0x58,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB5,0xB5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xC0,0x20,0x40,0x4F,0xC0,0x40,0x40,0xDF, + 0xE0,0x50,0x20,0x4F,0xC0,0x44,0x80,0x43,0x00,0x44,0x80,0x58,0x60}; const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x14,0x40,0x24,0x40,0x27,0xc0,0x61, - 0x00,0xaf,0xe0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x14,0x40,0x24,0x40,0x27,0xC0,0x61, + 0x00,0xAF,0xE0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x2f,0xe0,0x20,0x00,0x67, - 0xc0,0xa0,0x00,0x27,0xc0,0x20,0x00,0x27,0xc0,0x24,0x40,0x27,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x11,0x00,0x2F,0xE0,0x20,0x00,0x67, + 0xC0,0xA0,0x00,0x27,0xC0,0x20,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0}; const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x22,0x00,0x27,0xc0,0x64, - 0x40,0xa7,0xc0,0x24,0x40,0x27,0x40,0x25,0xc0,0x24,0x40,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x1F,0xE0,0x22,0x00,0x27,0xC0,0x64, + 0x40,0xA7,0xC0,0x24,0x40,0x27,0x40,0x25,0xC0,0x24,0x40,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_160_190_190[45] U8G_FONT_SECTION("fontpage_160_190_190") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x13,0xe0,0x19,0x00,0x2b,0xe0,0x2e,0x20,0x6a, - 0xa0,0xaa,0xa0,0x2a,0xa0,0x2e,0xa0,0x2a,0xa0,0x21,0x40,0x26,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x13,0xE0,0x19,0x00,0x2B,0xE0,0x2E,0x20,0x6A, + 0xA0,0xAA,0xA0,0x2A,0xA0,0x2E,0xA0,0x2A,0xA0,0x21,0x40,0x26,0x20}; const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x28,0x20,0x2f,0xe0,0x68, - 0x00,0xaf,0xe0,0x2a,0xa0,0x2f,0xe0,0x2a,0xa0,0x3a,0xa0,0x28,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x28,0x20,0x2F,0xE0,0x68, + 0x00,0xAF,0xE0,0x2A,0xA0,0x2F,0xE0,0x2A,0xA0,0x3A,0xA0,0x28,0x60}; const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_220_220") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x20,0x00,0x4f,0xc0,0x48, - 0x40,0xdf,0xe0,0x50,0x20,0x4f,0xc0,0x41,0x00,0x41,0x00,0x47,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x3F,0xE0,0x20,0x00,0x4F,0xC0,0x48, + 0x40,0xDF,0xE0,0x50,0x20,0x4F,0xC0,0x41,0x00,0x41,0x00,0x47,0x00}; const u8g_fntpgm_uint8_t fontpage_161_168_168[45] U8G_FONT_SECTION("fontpage_161_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x61,0x20,0x57,0xc0,0x41,0x40,0x77,0xe0,0xd1, - 0x00,0x53,0xc0,0x56,0x40,0x53,0xc0,0x5a,0x40,0x52,0x40,0x43,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x61,0x20,0x57,0xC0,0x41,0x40,0x77,0xE0,0xD1, + 0x00,0x53,0xC0,0x56,0x40,0x53,0xC0,0x5A,0x40,0x52,0x40,0x43,0xC0}; const u8g_fntpgm_uint8_t fontpage_161_207_207[45] U8G_FONT_SECTION("fontpage_161_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x13,0xc0,0x14,0x80,0x2f,0xe0,0x35,0x20,0x67, - 0xe0,0xa2,0x20,0x2d,0x40,0x22,0x80,0x2d,0xc0,0x22,0xa0,0x2d,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x13,0xC0,0x14,0x80,0x2F,0xE0,0x35,0x20,0x67, + 0xE0,0xA2,0x20,0x2D,0x40,0x22,0x80,0x2D,0xC0,0x22,0xA0,0x2D,0x80}; const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0xff,0xc0,0x08,0x00,0x11,0x00,0x7f, - 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xc1,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0xFF,0xC0,0x08,0x00,0x11,0x00,0x7F, + 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xC1,0xC0}; const u8g_fntpgm_uint8_t fontpage_162_200_201[73] U8G_FONT_SECTION("fontpage_162_200_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x84, - 0x00,0xff,0xe0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x04,0x00,0xff,0xe0,0x12,0x00,0x12, - 0x00,0x12,0x20,0x12,0x20,0x22,0x20,0xc1,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x84, + 0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x24,0x80,0x04,0x00,0xFF,0xE0,0x12,0x00,0x12, + 0x00,0x12,0x20,0x12,0x20,0x22,0x20,0xC1,0xE0}; const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0a, - 0x00,0x0a,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0A, + 0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, - 0x60,0x04,0x00,0x04,0x00,0x1f,0x00,0x04,0x00,0x04,0x00,0x7f,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, + 0x60,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0}; const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_241_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, - 0x00,0x11,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; const u8g_fntpgm_uint8_t fontpage_162_243_243[45] U8G_FONT_SECTION("fontpage_162_243_243") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0x7f,0xc0,0x04,0x00,0x04, - 0x00,0xff,0xc0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x11,0x00,0x7F,0xC0,0x04,0x00,0x04, + 0x00,0xFF,0xC0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_247_247") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f, - 0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0,0x11,0x00,0xe0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F, + 0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0,0x11,0x00,0xE0,0xE0}; const u8g_fntpgm_uint8_t fontpage_163_151_151[43] U8G_FONT_SECTION("fontpage_163_151_151") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x09,0xff,0x00, - 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x11,0x00,0x11, - 0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x41,0x20,0x80,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x09,0xFF,0x00, + 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x11,0x00,0x11, + 0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x41,0x20,0x80,0xE0}; const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, - 0x60,0x41,0x00,0x4f,0xc0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, + 0x60,0x41,0x00,0x4F,0xC0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x89,0x00,0x4f,0xe0,0x59,0x00,0x09, - 0x00,0x2f,0xc0,0x29,0x00,0xcf,0xc0,0x49,0x00,0x49,0x00,0x4f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x89,0x00,0x4F,0xE0,0x59,0x00,0x09, + 0x00,0x2F,0xC0,0x29,0x00,0xCF,0xC0,0x49,0x00,0x49,0x00,0x4F,0xE0}; const u8g_fntpgm_uint8_t fontpage_163_250_251[73] U8G_FONT_SECTION("fontpage_163_250_251") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f, - 0xc0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xff,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, - 0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7F, + 0xC0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xFF,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04, + 0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0}; const u8g_fntpgm_uint8_t fontpage_164_134_135[73] U8G_FONT_SECTION("fontpage_164_134_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x87,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, - 0x40,0xbf,0xa0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xc3,0x00,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0x21,0x20,0x39,0x20,0xe1,0x20,0x21,0x20,0x29, - 0x20,0x32,0x20,0x22,0x20,0x04,0x20,0x08,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x87,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, + 0x40,0xBF,0xA0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xC3,0x00,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0x21,0x20,0x39,0x20,0xE1,0x20,0x21,0x20,0x29, + 0x20,0x32,0x20,0x22,0x20,0x04,0x20,0x08,0xC0}; const u8g_fntpgm_uint8_t fontpage_164_155_155[45] U8G_FONT_SECTION("fontpage_164_155_155") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x18,0x20,0x24,0xa0,0x42,0xa0,0xbc, - 0xa0,0x24,0xa0,0x24,0xa0,0x38,0xa0,0x22,0x20,0x22,0x20,0x1e,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x18,0x20,0x24,0xA0,0x42,0xA0,0xBC, + 0xA0,0x24,0xA0,0x24,0xA0,0x38,0xA0,0x22,0x20,0x22,0x20,0x1E,0x60}; const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_157_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x27,0xe0,0xf9,0x20,0x11,0x20,0x21, - 0x20,0x69,0x20,0xb1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x27,0xE0,0xF9,0x20,0x11,0x20,0x21, + 0x20,0x69,0x20,0xB1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xC0}; const u8g_fntpgm_uint8_t fontpage_164_171_171[45] U8G_FONT_SECTION("fontpage_164_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7c,0x20,0x44,0x20,0x44,0xa0,0x7c,0xa0,0x10, - 0xa0,0xfe,0xa0,0x12,0xa0,0x22,0xa0,0x22,0x20,0x42,0x20,0x8c,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7C,0x20,0x44,0x20,0x44,0xA0,0x7C,0xA0,0x10, + 0xA0,0xFE,0xA0,0x12,0xA0,0x22,0xA0,0x22,0x20,0x42,0x20,0x8C,0xE0}; const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfe,0x20,0x10,0x20,0x20,0xa0,0x44,0xa0,0xfe, - 0xa0,0x10,0xa0,0x7c,0xa0,0x10,0xa0,0x10,0x20,0x1e,0x20,0xe0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFE,0x20,0x10,0x20,0x20,0xA0,0x44,0xA0,0xFE, + 0xA0,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x10,0x20,0x1E,0x20,0xE0,0xE0}; const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x50,0xa0,0x7e,0xa0,0x90,0xa0,0xfe, - 0xa0,0x10,0xa0,0x7e,0xa0,0x52,0xa0,0x52,0x20,0x56,0x20,0x10,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x7e,0x20,0x42,0x20,0x7e,0xa0,0x48,0xa0,0x48,0xa0,0x7e,0xa0,0x6a, - 0xa0,0xaa,0xa0,0xaa,0xa0,0x2e,0x20,0x08,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x50,0xA0,0x7E,0xA0,0x90,0xA0,0xFE, + 0xA0,0x10,0xA0,0x7E,0xA0,0x52,0xA0,0x52,0x20,0x56,0x20,0x10,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x7E,0x20,0x42,0x20,0x7E,0xA0,0x48,0xA0,0x48,0xA0,0x7E,0xA0,0x6A, + 0xA0,0xAA,0xA0,0xAA,0xA0,0x2E,0x20,0x08,0xE0}; const u8g_fntpgm_uint8_t fontpage_164_242_242[45] U8G_FONT_SECTION("fontpage_164_242_242") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0xfe,0x20,0x92,0xa0,0x7c,0xa0,0x10, - 0xa0,0x7c,0xa0,0x10,0xa0,0xfe,0xa0,0x44,0x20,0x44,0x20,0x7c,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0xFE,0x20,0x92,0xA0,0x7C,0xA0,0x10, + 0xA0,0x7C,0xA0,0x10,0xA0,0xFE,0xA0,0x44,0x20,0x44,0x20,0x7C,0xE0}; const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x08,0x00,0xff,0x80,0x08, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0x08,0x00,0xFF,0x80,0x08, 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; const u8g_fntpgm_uint8_t fontpage_165_159_160[73] U8G_FONT_SECTION("fontpage_165_159_160") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0xa0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x01,0x00,0xf9,0x00,0x27,0xe0,0x21, - 0x20,0x21,0x20,0x21,0x20,0x3a,0x20,0xc2,0x20,0x04,0x20,0x18,0xc0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x20,0x00,0x20,0x00,0xfd,0xe0,0x25,0x20,0x25,0x20,0x25,0x20,0x25, - 0x20,0x25,0x20,0x45,0x20,0x55,0xe0,0x89,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0xA0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0x01,0x00,0xF9,0x00,0x27,0xE0,0x21, + 0x20,0x21,0x20,0x21,0x20,0x3A,0x20,0xC2,0x20,0x04,0x20,0x18,0xC0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x20,0x00,0x20,0x00,0xFD,0xE0,0x25,0x20,0x25,0x20,0x25,0x20,0x25, + 0x20,0x25,0x20,0x45,0x20,0x55,0xE0,0x89,0x20}; const u8g_fntpgm_uint8_t fontpage_165_168_168[45] U8G_FONT_SECTION("fontpage_165_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x79,0x00,0x01,0x00,0x03,0xe0,0xfd, - 0x20,0x21,0x20,0x21,0x20,0x49,0x20,0xfa,0x20,0x0a,0x20,0x04,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0x79,0x00,0x01,0x00,0x03,0xE0,0xFD, + 0x20,0x21,0x20,0x21,0x20,0x49,0x20,0xFA,0x20,0x0A,0x20,0x04,0xC0}; const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, - 0x00,0xa2,0x00,0x26,0x00,0x2a,0x00,0x22,0x20,0x22,0x20,0x21,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, + 0x00,0xA2,0x00,0x26,0x00,0x2A,0x00,0x22,0x20,0x22,0x20,0x21,0xE0}; const u8g_fntpgm_uint8_t fontpage_166_199_199[45] U8G_FONT_SECTION("fontpage_166_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x0d,0x00,0x71,0x00,0x11,0x00,0x11,0x00,0x11, - 0x00,0xff,0xc0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x0D,0x00,0x71,0x00,0x11,0x00,0x11,0x00,0x11, + 0x00,0xFF,0xC0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7f, - 0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7F, + 0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_166_207_207[45] U8G_FONT_SECTION("fontpage_166_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x42,0x00,0x4f,0x80,0xe2,0x80,0x42, - 0x80,0x4a,0xc0,0x52,0xa0,0x44,0x80,0x44,0x80,0x4a,0x80,0x51,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x42,0x00,0x4F,0x80,0xE2,0x80,0x42, + 0x80,0x4A,0xC0,0x52,0xA0,0x44,0x80,0x44,0x80,0x4A,0x80,0x51,0x00}; const u8g_fntpgm_uint8_t fontpage_166_213_213[45] U8G_FONT_SECTION("fontpage_166_213_213") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x0a,0x00,0x7f,0xc0,0x44,0x40,0x7f, - 0xc0,0x44,0x40,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x0A,0x00,0x7F,0xC0,0x44,0x40,0x7F, + 0xC0,0x44,0x40,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x0f,0x80,0x08,0x00,0x08,0x00,0xff, - 0xe0,0x08,0x00,0x0a,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x0F,0x80,0x08,0x00,0x08,0x00,0xFF, + 0xE0,0x08,0x00,0x0A,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_166_240_241[73] U8G_FONT_SECTION("fontpage_166_240_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf1,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0xe7,0xc0,0x84,0x40,0x84,0x40,0xf4, - 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xe5,0x80,0x84,0x00,0x04,0x00,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x21,0x00,0x7f,0xe0,0x20,0x00,0x2f,0x80,0x28, - 0x80,0x28,0x80,0x2b,0x20,0x48,0x20,0x87,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF1,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x10,0x00,0xE7,0xC0,0x84,0x40,0x84,0x40,0xF4, + 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xE5,0x80,0x84,0x00,0x04,0x00,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x10,0x00,0x1F,0x80,0x21,0x00,0x7F,0xE0,0x20,0x00,0x2F,0x80,0x28, + 0x80,0x28,0x80,0x2B,0x20,0x48,0x20,0x87,0xE0}; const u8g_fntpgm_uint8_t fontpage_166_244_244[45] U8G_FONT_SECTION("fontpage_166_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x11,0xe0,0x7d,0x20,0x11,0x20,0x11, - 0x20,0xff,0x20,0x11,0x20,0x21,0x20,0x4d,0x60,0x75,0x00,0x01,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x11,0xE0,0x7D,0x20,0x11,0x20,0x11, + 0x20,0xFF,0x20,0x11,0x20,0x21,0x20,0x4D,0x60,0x75,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7d,0xe0,0x91,0x20,0x11,0x20,0xff, - 0x20,0x11,0x20,0x5d,0x20,0x51,0x20,0x51,0xa0,0x5d,0x40,0xe1,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x7D,0xE0,0x91,0x20,0x11,0x20,0xFF, + 0x20,0x11,0x20,0x5D,0x20,0x51,0x20,0x51,0xA0,0x5D,0x40,0xE1,0x00}; const u8g_fntpgm_uint8_t fontpage_167_139_139[45] U8G_FONT_SECTION("fontpage_167_139_139") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x20,0x00,0x22,0x00,0x22,0x00,0x22, - 0x00,0x3f,0xc0,0x22,0x00,0x22,0x80,0x42,0x40,0x42,0x00,0xbf,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x20,0x00,0x22,0x00,0x22,0x00,0x22, + 0x00,0x3F,0xC0,0x22,0x00,0x22,0x80,0x42,0x40,0x42,0x00,0xBF,0xE0}; const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x00,0x2f,0xc0,0x28,0x40,0x2f, - 0xc0,0x28,0x40,0x2f,0xc0,0x22,0x00,0x2a,0x80,0x52,0x60,0xa6,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x22,0x00,0x2F,0xC0,0x28,0x40,0x2F, + 0xC0,0x28,0x40,0x2F,0xC0,0x22,0x00,0x2A,0x80,0x52,0x60,0xA6,0x20}; const u8g_fntpgm_uint8_t fontpage_167_204_205[71] U8G_FONT_SECTION("fontpage_167_204_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x0a,0x40,0x4a,0x40,0x2a,0x40,0x11, - 0x40,0x11,0x40,0x28,0x80,0x45,0x80,0x82,0x40,0x04,0x20,0x0b,0x0b,0x16,0x0c,0x00, - 0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x20,0x00,0x3f,0xc0,0x28,0x80,0x25,0x00,0x22, - 0x00,0x45,0x00,0x48,0x80,0xb0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0xFF,0xE0,0x0A,0x40,0x4A,0x40,0x2A,0x40,0x11, + 0x40,0x11,0x40,0x28,0x80,0x45,0x80,0x82,0x40,0x04,0x20,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x20,0x00,0x3F,0xC0,0x28,0x80,0x25,0x00,0x22, + 0x00,0x45,0x00,0x48,0x80,0xB0,0x60}; const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfc,0x00,0x4b,0xe0,0x4a,0x20,0x7a,0x20,0x49, - 0x40,0x79,0x40,0x48,0x80,0x4c,0x80,0xf9,0x40,0x0a,0x40,0x0c,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD6,0xD6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFC,0x00,0x4B,0xE0,0x4A,0x20,0x7A,0x20,0x49, + 0x40,0x79,0x40,0x48,0x80,0x4C,0x80,0xF9,0x40,0x0A,0x40,0x0C,0x20}; const u8g_fntpgm_uint8_t fontpage_167_216_216[45] U8G_FONT_SECTION("fontpage_167_216_216") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x12,0x00,0x52,0x80,0x92, - 0x40,0x00,0x00,0x7f,0x80,0x12,0x00,0x0c,0x00,0x12,0x00,0xe1,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x12,0x00,0x52,0x80,0x92, + 0x40,0x00,0x00,0x7F,0x80,0x12,0x00,0x0C,0x00,0x12,0x00,0xE1,0xC0}; const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xff, - 0x80,0x00,0x80,0x7f,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7f,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xFF, + 0x80,0x00,0x80,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00}; const u8g_fntpgm_uint8_t fontpage_168_131_131[45] U8G_FONT_SECTION("fontpage_168_131_131") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xf2,0x00,0x97,0xe0,0x98,0x00,0x97, - 0xc0,0x90,0x80,0x91,0x00,0xf2,0x00,0x94,0x20,0x04,0x20,0x03,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xF2,0x00,0x97,0xE0,0x98,0x00,0x97, + 0xC0,0x90,0x80,0x91,0x00,0xF2,0x00,0x94,0x20,0x04,0x20,0x03,0xE0}; const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, - 0x60,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x20,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, + 0x60,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80}; const u8g_fntpgm_uint8_t fontpage_168_141_142[73] U8G_FONT_SECTION("fontpage_168_141_142") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8e,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0xc0,0x10,0x80,0x29,0x00,0x46, - 0x00,0x04,0x00,0x1f,0xc0,0xf0,0x40,0x10,0x40,0x10,0x40,0x1f,0xc0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x3f,0xe0,0x20,0x00,0x20,0x00,0x2f, - 0xc0,0x28,0x40,0x48,0x40,0x4f,0xc0,0x88,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8E,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0xC0,0x10,0x80,0x29,0x00,0x46, + 0x00,0x04,0x00,0x1F,0xC0,0xF0,0x40,0x10,0x40,0x10,0x40,0x1F,0xC0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x2F, + 0xC0,0x28,0x40,0x48,0x40,0x4F,0xC0,0x88,0x40}; const u8g_fntpgm_uint8_t fontpage_168_145_145[45] U8G_FONT_SECTION("fontpage_168_145_145") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x10,0x00,0xff,0xc0,0x80,0x40,0x9e, - 0x40,0x92,0x40,0x92,0x40,0x9e,0x40,0x80,0x40,0x80,0x40,0x81,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x10,0x00,0xFF,0xC0,0x80,0x40,0x9E, + 0x40,0x92,0x40,0x92,0x40,0x9E,0x40,0x80,0x40,0x80,0x40,0x81,0xC0}; const u8g_fntpgm_uint8_t fontpage_168_166_166[45] U8G_FONT_SECTION("fontpage_168_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x0d,0x80,0x34,0x40,0xc4, - 0x20,0x04,0x00,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0,0x20,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x0D,0x80,0x34,0x40,0xC4, + 0x20,0x04,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40}; const u8g_fntpgm_uint8_t fontpage_168_175_175[45] U8G_FONT_SECTION("fontpage_168_175_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f, - 0xc0,0x20,0x00,0x3f,0xc0,0x30,0x40,0x50,0x40,0x5f,0xc0,0x90,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F, + 0xC0,0x20,0x00,0x3F,0xC0,0x30,0x40,0x50,0x40,0x5F,0xC0,0x90,0x40}; const u8g_fntpgm_uint8_t fontpage_168_202_202[45] U8G_FONT_SECTION("fontpage_168_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, - 0x00,0xff,0xe0,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04, + 0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_168_232_232[45] U8G_FONT_SECTION("fontpage_168_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x20,0x2f,0xa0,0x22,0x20,0x3f, - 0xe0,0x20,0x20,0x2f,0xa0,0x28,0xa0,0x4f,0xa0,0x40,0x20,0x80,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x22,0x20,0x2F,0xA0,0x22,0x20,0x3F, + 0xE0,0x20,0x20,0x2F,0xA0,0x28,0xA0,0x4F,0xA0,0x40,0x20,0x80,0x60}; const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0xee,0xe0,0x00, - 0x00,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7a,0x40,0x4a,0xc0,0x02,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0xEE,0xE0,0x00, + 0x00,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7A,0x40,0x4A,0xC0,0x02,0x00}; const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0c,0x00,0x70,0x00,0x11,0xe0,0xfd,0x20,0x11, - 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xe0,0x10,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0C,0x00,0x70,0x00,0x11,0xE0,0xFD,0x20,0x11, + 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xE0,0x10,0x00}; const u8g_fntpgm_uint8_t fontpage_169_205_205[45] U8G_FONT_SECTION("fontpage_169_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x02,0x00,0xef,0xe0,0xa8,0x20,0xab, - 0xa0,0xaa,0xa0,0xaa,0xa0,0xeb,0xa0,0x08,0x20,0x08,0x20,0x08,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0x02,0x00,0xEF,0xE0,0xA8,0x20,0xAB, + 0xA0,0xAA,0xA0,0xAA,0xA0,0xEB,0xA0,0x08,0x20,0x08,0x20,0x08,0x60}; const u8g_fntpgm_uint8_t fontpage_171_183_183[45] U8G_FONT_SECTION("fontpage_171_183_183") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, - 0x40,0xaf,0xe0,0xe8,0x20,0xa9,0x20,0x09,0x20,0x02,0x80,0x0c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xEF,0xE0,0xA5,0x40,0xAF,0xE0,0xA4, + 0x40,0xAF,0xE0,0xE8,0x20,0xA9,0x20,0x09,0x20,0x02,0x80,0x0C,0x60}; const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_180_180") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0xa0,0xeb,0xc0,0xaa,0xa0,0xbf,0xe0,0xa4, - 0x80,0xaf,0xe0,0xf9,0x20,0x0f,0xe0,0x09,0x20,0x0f,0xe0,0x11,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0xA0,0xEB,0xC0,0xAA,0xA0,0xBF,0xE0,0xA4, + 0x80,0xAF,0xE0,0xF9,0x20,0x0F,0xE0,0x09,0x20,0x0F,0xE0,0x11,0x20}; const u8g_fntpgm_uint8_t fontpage_172_232_232[45] U8G_FONT_SECTION("fontpage_172_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7b,0xc0,0x04, - 0x80,0xff,0xe0,0x11,0x00,0xfb,0xe0,0x4a,0x40,0x4a,0x40,0x7b,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x04, + 0x80,0xFF,0xE0,0x11,0x00,0xFB,0xE0,0x4A,0x40,0x4A,0x40,0x7B,0xC0}; const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, - 0x40,0xa7,0xc0,0xe4,0x40,0x07,0xc0,0x04,0x40,0x07,0xc0,0x0c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xEF,0xE0,0xA5,0x40,0xAF,0xE0,0xA4, + 0x40,0xA7,0xC0,0xE4,0x40,0x07,0xC0,0x04,0x40,0x07,0xC0,0x0C,0x60}; const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, - 0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0x80,0x40,0xff,0xc0,0x80,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x80,0x40,0x80,0x40,0x9E,0x40,0x92, + 0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0x80,0x40,0xFF,0xC0,0x80,0x40}; const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_224_224") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x84,0x20,0x84,0x20,0xbf,0xa0,0x84, - 0x20,0x84,0x20,0x8a,0x20,0x91,0x20,0xa0,0xa0,0x80,0x20,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x84,0x20,0x84,0x20,0xBF,0xA0,0x84, + 0x20,0x84,0x20,0x8A,0x20,0x91,0x20,0xA0,0xA0,0x80,0x20,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_173_250_250[45] U8G_FONT_SECTION("fontpage_173_250_250") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x88,0x40,0x88,0x40,0xff,0x40,0x88, - 0x40,0xbe,0x40,0xa2,0x40,0xa2,0x40,0xbe,0x40,0x80,0x40,0xff,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x88,0x40,0x88,0x40,0xFF,0x40,0x88, + 0x40,0xBE,0x40,0xA2,0x40,0xA2,0x40,0xBE,0x40,0x80,0x40,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_173_254_254[45] U8G_FONT_SECTION("fontpage_173_254_254") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x90,0x40,0x9f,0x40,0xb2,0x40,0xcc, - 0x40,0x92,0x40,0xe9,0xc0,0x84,0x40,0x88,0x40,0x84,0x40,0xff,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x90,0x40,0x9F,0x40,0xB2,0x40,0xCC, + 0x40,0x92,0x40,0xE9,0xC0,0x84,0x40,0x88,0x40,0x84,0x40,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0xc0,0x10,0x00,0x22, - 0x00,0x62,0x00,0xaf,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3f,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0xC0,0x10,0x00,0x22, + 0x00,0x62,0x00,0xAF,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3F,0xC0}; const u8g_fntpgm_uint8_t fontpage_174_207_207[45] U8G_FONT_SECTION("fontpage_174_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x2f,0xe0,0x20,0x80,0xf8,0x80,0x21, - 0x00,0x21,0x80,0x23,0x40,0x35,0x20,0xc9,0x20,0x01,0x00,0x01,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x2F,0xE0,0x20,0x80,0xF8,0x80,0x21, + 0x00,0x21,0x80,0x23,0x40,0x35,0x20,0xC9,0x20,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_174_215_215[45] U8G_FONT_SECTION("fontpage_174_215_215") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x27,0xc0,0xf9,0x40,0x21, - 0x40,0x21,0x40,0x2f,0xe0,0x31,0x00,0xc2,0x80,0x04,0x40,0x18,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD7,0xD7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x27,0xC0,0xF9,0x40,0x21, + 0x40,0x21,0x40,0x2F,0xE0,0x31,0x00,0xC2,0x80,0x04,0x40,0x18,0x20}; const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_139_139") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x40,0x29,0x40,0x29,0x40,0xff,0x40,0x29, - 0x40,0x28,0x40,0x4c,0xc0,0x04,0x00,0x3f,0x80,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7E,0x40,0x29,0x40,0x29,0x40,0xFF,0x40,0x29, + 0x40,0x28,0x40,0x4C,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_175_171_171[45] U8G_FONT_SECTION("fontpage_175_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xff,0x80,0x22,0x80,0x36,0xa0,0xe3, - 0xa0,0x2c,0xe0,0x64,0x00,0x04,0x00,0x3f,0xc0,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xFF,0x80,0x22,0x80,0x36,0xA0,0xE3, + 0xA0,0x2C,0xE0,0x64,0x00,0x04,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x21,0x00,0xf7,0xc0,0x24, - 0x40,0x27,0x40,0x25,0xc0,0x34,0x40,0xef,0xe0,0x02,0x80,0x0c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x21,0x00,0xF7,0xC0,0x24, + 0x40,0x27,0x40,0x25,0xC0,0x34,0x40,0xEF,0xE0,0x02,0x80,0x0C,0x60}; const u8g_fntpgm_uint8_t fontpage_177_243_243[45] U8G_FONT_SECTION("fontpage_177_243_243") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0xc0,0x00, - 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x20,0x21,0x20,0xc0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0xC0,0x00, + 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x20,0x21,0x20,0xC0,0xE0}; const u8g_fntpgm_uint8_t fontpage_178_135_135[45] U8G_FONT_SECTION("fontpage_178_135_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x31,0x00,0x4e,0x00,0x0b, - 0x00,0x30,0xe0,0xff,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0x80,0x31,0x00,0x4E,0x00,0x0B, + 0x00,0x30,0xE0,0xFF,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_178_141_141[45] U8G_FONT_SECTION("fontpage_178_141_141") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x3f,0xe0,0x60,0x80,0xbf,0x80,0x20, - 0x80,0x3f,0x80,0x10,0x00,0x3f,0x80,0xc9,0x00,0x06,0x00,0xf9,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x3F,0xE0,0x60,0x80,0xBF,0x80,0x20, + 0x80,0x3F,0x80,0x10,0x00,0x3F,0x80,0xC9,0x00,0x06,0x00,0xF9,0xE0}; const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x3d,0x00,0x25,0x00,0x45, - 0x80,0xa5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x3D,0x00,0x25,0x00,0x45, + 0x80,0xA5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x1f,0x00,0x21,0x00,0x52,0x00,0x0c, - 0x00,0x34,0x00,0xcf,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xf8,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x1F,0x00,0x21,0x00,0x52,0x00,0x0C, + 0x00,0x34,0x00,0xCF,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xF8,0x00}; const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_167_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, - 0x00,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04, + 0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xaa,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, - 0xe0,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x0a, - 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xc4,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xAA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, + 0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A, + 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xC4,0x60}; const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_177_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, - 0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; const u8g_fntpgm_uint8_t fontpage_178_180_180[45] U8G_FONT_SECTION("fontpage_178_180_180") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x0a,0x00,0x22,0x00,0x12,0x00,0x02, - 0x00,0xff,0xe0,0x02,0x00,0x05,0x00,0x08,0x80,0x10,0x40,0x60,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x0A,0x00,0x22,0x00,0x12,0x00,0x02, + 0x00,0xFF,0xE0,0x02,0x00,0x05,0x00,0x08,0x80,0x10,0x40,0x60,0x20}; const u8g_fntpgm_uint8_t fontpage_178_253_253[45] U8G_FONT_SECTION("fontpage_178_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x23,0xe0,0xf8,0x40,0x28,0x80,0x28, - 0x80,0x4f,0xe0,0x50,0x80,0x30,0x80,0x28,0x80,0x48,0x80,0x83,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x23,0xE0,0xF8,0x40,0x28,0x80,0x28, + 0x80,0x4F,0xE0,0x50,0x80,0x30,0x80,0x28,0x80,0x48,0x80,0x83,0x80}; const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x2a,0x20,0x2f, - 0xe0,0x48,0x00,0x53,0xe0,0x32,0x20,0x2a,0x20,0x4b,0xe0,0x82,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0xFA,0x40,0x2A,0x20,0x2F, + 0xE0,0x48,0x00,0x53,0xE0,0x32,0x20,0x2A,0x20,0x4B,0xE0,0x82,0x20}; const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_208_208") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, - 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0xc0,0x20, - 0x80,0x61,0x00,0xbf,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0xC0,0x20, + 0x80,0x61,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x88,0x40,0x08, - 0x00,0xff,0xe0,0x11,0x00,0x31,0x00,0x0e,0x00,0x09,0x80,0x70,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x88,0x40,0x08, + 0x00,0xFF,0xE0,0x11,0x00,0x31,0x00,0x0E,0x00,0x09,0x80,0x70,0x60}; const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x00, - 0x00,0x7f,0xe0,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x00, + 0x00,0x7F,0xE0,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xE0}; const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x80,0x40,0x3f, - 0xc0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x80,0x40,0x3F, + 0xC0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x90,0x40,0x3f,0x00,0x52, - 0x00,0x8c,0x00,0x33,0x00,0xff,0xc0,0x21,0x00,0x21,0x00,0x3f,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x90,0x40,0x3F,0x00,0x52, + 0x00,0x8C,0x00,0x33,0x00,0xFF,0xC0,0x21,0x00,0x21,0x00,0x3F,0x00}; const u8g_fntpgm_uint8_t fontpage_183_171_171[45] U8G_FONT_SECTION("fontpage_183_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x80,0x40,0x3f,0x00,0x21, - 0x00,0x3f,0x00,0x00,0x00,0x7f,0x80,0x40,0x80,0x7f,0x80,0x40,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x80,0x40,0x3F,0x00,0x21, + 0x00,0x3F,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x7F,0x80,0x40,0x80}; const u8g_fntpgm_uint8_t fontpage_183_249_249[45] U8G_FONT_SECTION("fontpage_183_249_249") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x00,0x80,0xf0,0x80,0x1f,0xe0,0x90,0x80,0x50, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x00,0x80,0xF0,0x80,0x1F,0xE0,0x90,0x80,0x50, 0x80,0x24,0x80,0x22,0x80,0x50,0x80,0x50,0x80,0x82,0x80,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_184_134_134[45] U8G_FONT_SECTION("fontpage_184_134_134") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x27,0xc0,0xa4,0x80,0x6b,0x00,0x22, - 0x80,0x24,0x80,0x6f,0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x27,0xC0,0xA4,0x80,0x6B,0x00,0x22, + 0x80,0x24,0x80,0x6F,0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_177_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xfd,0x40,0x01,0x20,0x7f,0xe0,0x4a, - 0x80,0x7a,0x80,0x12,0x80,0x5a,0xa0,0x56,0xa0,0x92,0xa0,0x34,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFD,0x40,0x01,0x20,0x7F,0xE0,0x4A, + 0x80,0x7A,0x80,0x12,0x80,0x5A,0xA0,0x56,0xA0,0x92,0xA0,0x34,0x60}; const u8g_fntpgm_uint8_t fontpage_184_207_207[45] U8G_FONT_SECTION("fontpage_184_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x20,0x20,0x3f,0xe0,0x28,0x40,0x24, - 0x80,0x3f,0xe0,0x24,0x80,0x3f,0xe0,0x24,0x80,0x48,0x80,0x90,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x20,0x20,0x3F,0xE0,0x28,0x40,0x24, + 0x80,0x3F,0xE0,0x24,0x80,0x3F,0xE0,0x24,0x80,0x48,0x80,0x90,0x80}; const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x09,0x00,0x00, - 0x00,0x0b,0x09,0x12,0x0c,0x00,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, - 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x09,0x00,0x00, + 0x00,0x0B,0x09,0x12,0x0C,0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_187_238_238[45] U8G_FONT_SECTION("fontpage_187_238_238") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x09,0x00,0xff,0xe0,0x04,0x00,0x7f, - 0xc0,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0x80,0x42,0x00,0xbf,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0x09,0x00,0xFF,0xE0,0x04,0x00,0x7F, + 0xC0,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0x80,0x42,0x00,0xBF,0xE0}; const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x09,0xff,0x00, - 0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0xff,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xff, - 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7f,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x09,0xFF,0x00, + 0x00,0x0A,0x0A,0x14,0x0C,0x01,0xFF,0xFF,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xFF, + 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7F,0xC0}; const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, - 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_188_246_246[45] U8G_FONT_SECTION("fontpage_188_246_246") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, - 0x00,0x11,0x00,0xff,0xe0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x42,0x00,0x42,0x00,0x7f, - 0xe0,0x42,0x00,0x47,0x00,0x4a,0x80,0x52,0x40,0xa2,0x20,0x82,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7F, + 0xE0,0x42,0x00,0x47,0x00,0x4A,0x80,0x52,0x40,0xA2,0x20,0x82,0x00}; const u8g_fntpgm_uint8_t fontpage_189_148_148[45] U8G_FONT_SECTION("fontpage_189_148_148") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x7f,0xe0,0x40,0x00,0x44, - 0x40,0x52,0x40,0x4a,0x40,0x48,0x80,0x40,0x80,0x81,0x00,0x9f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x7F,0xE0,0x40,0x00,0x44, + 0x40,0x52,0x40,0x4A,0x40,0x48,0x80,0x40,0x80,0x81,0x00,0x9F,0xE0}; const u8g_fntpgm_uint8_t fontpage_189_159_159[45] U8G_FONT_SECTION("fontpage_189_159_159") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x3f,0xe0,0x2a,0x80,0x2a,0x40,0x3f, - 0xe0,0x24,0x00,0x27,0xc0,0x2a,0x40,0x31,0x80,0x42,0x40,0x8c,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x3F,0xE0,0x2A,0x80,0x2A,0x40,0x3F, + 0xE0,0x24,0x00,0x27,0xC0,0x2A,0x40,0x31,0x80,0x42,0x40,0x8C,0x20}; const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x49,0x00,0x7f,0xc0,0x49, - 0x00,0x4f,0x00,0x40,0x00,0x5f,0x80,0x49,0x00,0x86,0x00,0xb9,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xC0,0x49, + 0x00,0x4F,0x00,0x40,0x00,0x5F,0x80,0x49,0x00,0x86,0x00,0xB9,0xC0}; const u8g_fntpgm_uint8_t fontpage_190_128_128[45] U8G_FONT_SECTION("fontpage_190_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x11,0x00,0x11,0x00,0x11,0x00,0x11, - 0x00,0xff,0xe0,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x11,0x00,0x11,0x00,0x11,0x00,0x11, + 0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; const u8g_fntpgm_uint8_t fontpage_190_131_131[45] U8G_FONT_SECTION("fontpage_190_131_131") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x08,0x00,0x10,0x80,0x3f, - 0xc0,0x11,0x00,0xff,0xe0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x08,0x00,0x10,0x80,0x3F, + 0xC0,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; const u8g_fntpgm_uint8_t fontpage_190_143_143[45] U8G_FONT_SECTION("fontpage_190_143_143") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x02,0x00,0xff,0xe0,0x02, - 0x00,0x7a,0x00,0x12,0x00,0x11,0x00,0x11,0x20,0x18,0xa0,0xe0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x80,0x02,0x40,0x02,0x00,0xFF,0xE0,0x02, + 0x00,0x7A,0x00,0x12,0x00,0x11,0x00,0x11,0x20,0x18,0xA0,0xE0,0x60}; const u8g_fntpgm_uint8_t fontpage_190_149_149[45] U8G_FONT_SECTION("fontpage_190_149_149") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xfc,0x40,0x04,0x40,0x04,0x40,0x7c,0x40,0x40, - 0x40,0xfc,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x28,0x40,0x10,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFC,0x40,0x04,0x40,0x04,0x40,0x7C,0x40,0x40, + 0x40,0xFC,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x28,0x40,0x10,0x40}; const u8g_fntpgm_uint8_t fontpage_190_185_185[45] U8G_FONT_SECTION("fontpage_190_185_185") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xe4,0x40,0x22,0x80,0x2f,0xe0,0xe9,0x20,0x8f, - 0xe0,0x89,0x20,0xef,0xe0,0x21,0x00,0x2f,0xe0,0xa1,0x00,0x41,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xE4,0x40,0x22,0x80,0x2F,0xE0,0xE9,0x20,0x8F, + 0xE0,0x89,0x20,0xEF,0xE0,0x21,0x00,0x2F,0xE0,0xA1,0x00,0x41,0x00}; const u8g_fntpgm_uint8_t fontpage_190_210_210[45] U8G_FONT_SECTION("fontpage_190_210_210") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0x17,0xc0,0x90,0x40,0x90,0x40,0x90, - 0x40,0x97,0xc0,0x90,0x40,0x90,0x40,0x20,0x40,0x4f,0xc0,0x80,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x10,0x00,0x17,0xC0,0x90,0x40,0x90,0x40,0x90, + 0x40,0x97,0xC0,0x90,0x40,0x90,0x40,0x20,0x40,0x4F,0xC0,0x80,0x40}; const u8g_fntpgm_uint8_t fontpage_191_132_133[73] U8G_FONT_SECTION("fontpage_191_132_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x20,0x80,0x49,0x00,0x92,0x80,0x24, - 0x40,0x68,0x20,0xa7,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x11,0x00,0x21,0x00,0x47,0xc0,0x91,0x00,0x1f,0xe0,0x20,0x80,0x6f, - 0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x20,0x80,0x49,0x00,0x92,0x80,0x24, + 0x40,0x68,0x20,0xA7,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x11,0x00,0x21,0x00,0x47,0xC0,0x91,0x00,0x1F,0xE0,0x20,0x80,0x6F, + 0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; const u8g_fntpgm_uint8_t fontpage_191_170_170[45] U8G_FONT_SECTION("fontpage_191_170_170") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xe0,0x28,0x80,0x4f,0xe0,0x98,0x80,0x2b, - 0xe0,0x6a,0x20,0xab,0xe0,0x2a,0x20,0x2b,0xe0,0x2a,0x20,0x33,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0xE0,0x28,0x80,0x4F,0xE0,0x98,0x80,0x2B, + 0xE0,0x6A,0x20,0xAB,0xE0,0x2A,0x20,0x2B,0xE0,0x2A,0x20,0x33,0xE0}; const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x6a,0x80,0xbe,0x80,0x01,0xe0,0x5d, - 0x40,0xc3,0x40,0x5d,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2A,0x80,0x6A,0x80,0xBE,0x80,0x01,0xE0,0x5D, + 0x40,0xC3,0x40,0x5D,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, - 0x40,0x50,0x20,0x50,0x20,0x50,0xa0,0x90,0x80,0x10,0x80,0x0f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, + 0x40,0x50,0x20,0x50,0x20,0x50,0xA0,0x90,0x80,0x10,0x80,0x0F,0x80}; const u8g_fntpgm_uint8_t fontpage_191_253_253[45] U8G_FONT_SECTION("fontpage_191_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x3f,0xc0,0x2a,0x40,0x4a,0x40,0x14, - 0x40,0x28,0x40,0x05,0x80,0x12,0x40,0x50,0xa0,0x50,0xa0,0x8f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x3F,0xC0,0x2A,0x40,0x4A,0x40,0x14, + 0x40,0x28,0x40,0x05,0x80,0x12,0x40,0x50,0xA0,0x50,0xA0,0x8F,0x80}; const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x00,0xb5,0x00,0xaf,0xe0,0xa9, - 0x00,0xb1,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x25,0x00,0xB5,0x00,0xAF,0xE0,0xA9, + 0x00,0xB1,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_192_187_187[45] U8G_FONT_SECTION("fontpage_192_187_187") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x0a,0x00,0x3f,0x80,0x20,0x80,0x20, - 0x80,0x3f,0x80,0x20,0x80,0x04,0x40,0x52,0xa0,0x50,0xa0,0x8f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x0A,0x00,0x3F,0x80,0x20,0x80,0x20, + 0x80,0x3F,0x80,0x20,0x80,0x04,0x40,0x52,0xA0,0x50,0xA0,0x8F,0x80}; const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_226_226") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0xb2,0x00,0xaa,0x80,0xa4, - 0x80,0xa5,0xa0,0x2a,0xc0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x2F,0xE0,0xB2,0x00,0xAA,0x80,0xA4, + 0x80,0xA5,0xA0,0x2A,0xC0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20, - 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x54,0x40,0x52,0xa0,0x8f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20, + 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x54,0x40,0x52,0xA0,0x8F,0x80}; const u8g_fntpgm_uint8_t fontpage_194_159_159[45] U8G_FONT_SECTION("fontpage_194_159_159") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x40,0x7f,0xe0,0x41,0x00,0x7f,0x40,0x5d, - 0x40,0x52,0x80,0x9d,0xa0,0x82,0x60,0x24,0x40,0xa2,0xa0,0x9f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x40,0x7F,0xE0,0x41,0x00,0x7F,0x40,0x5D, + 0x40,0x52,0x80,0x9D,0xA0,0x82,0x60,0x24,0x40,0xA2,0xA0,0x9F,0x80}; const u8g_fntpgm_uint8_t fontpage_196_143_144[73] U8G_FONT_SECTION("fontpage_196_143_144") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x90,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x7a,0x40,0x0a,0x00,0x4f,0xe0,0x2a, - 0x00,0x12,0x40,0x12,0x80,0x29,0x00,0x41,0x20,0x86,0xa0,0x00,0x60,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x7f,0xe0,0x42,0x00,0x42,0x00,0x7a,0x40,0x4a, - 0x40,0x4a,0x80,0x49,0x20,0x52,0xa0,0x84,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x90,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x80,0x7A,0x40,0x0A,0x00,0x4F,0xE0,0x2A, + 0x00,0x12,0x40,0x12,0x80,0x29,0x00,0x41,0x20,0x86,0xA0,0x00,0x60,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x02,0x80,0x02,0x40,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7A,0x40,0x4A, + 0x40,0x4A,0x80,0x49,0x20,0x52,0xA0,0x84,0x60}; const u8g_fntpgm_uint8_t fontpage_196_183_183[45] U8G_FONT_SECTION("fontpage_196_183_183") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x3f,0xc0,0x20,0x40,0x20, - 0x40,0x3f,0xc0,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x3F,0xC0,0x20,0x40,0x20, + 0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_192_192") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x60,0x63,0x80,0x42,0x00,0x7a,0x00,0x4b, - 0xe0,0x4a,0x40,0x7a,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x18,0x60,0x63,0x80,0x42,0x00,0x7A,0x00,0x4B, + 0xE0,0x4A,0x40,0x7A,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x7f,0xe0,0x40, - 0x00,0x7d,0xe0,0x44,0x20,0x54,0xa0,0x4c,0x60,0x54,0xa0,0xa9,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x7F,0xE0,0x40, + 0x00,0x7D,0xE0,0x44,0x20,0x54,0xA0,0x4C,0x60,0x54,0xA0,0xA9,0x60}; const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xc0,0x7c,0x00,0x04,0x00,0x7f,0xc0,0x04, - 0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x0c,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x03,0xC0,0x7C,0x00,0x04,0x00,0x7F,0xC0,0x04, + 0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00}; const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_211_211") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0xf8,0x80,0x20,0x80,0x28, - 0x80,0x30,0x80,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0xe3,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x28, + 0x80,0x30,0x80,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0xE3,0x80}; const u8g_fntpgm_uint8_t fontpage_196_231_231[45] U8G_FONT_SECTION("fontpage_196_231_231") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x22,0x00,0xff,0x80,0x22,0x80,0x2a, - 0x80,0x36,0x80,0x62,0x80,0xa7,0xa0,0x24,0xa0,0xa8,0xa0,0x50,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x22,0x00,0xFF,0x80,0x22,0x80,0x2A, + 0x80,0x36,0x80,0x62,0x80,0xA7,0xA0,0x24,0xA0,0xA8,0xA0,0x50,0x60}; const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_249_249") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x24,0x80,0xfc,0x80,0x24,0xa0,0x2f, - 0xc0,0x34,0x80,0x64,0x80,0xa4,0x80,0x25,0xa0,0x26,0xa0,0xe4,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x24,0x80,0xFC,0x80,0x24,0xA0,0x2F, + 0xC0,0x34,0x80,0x64,0x80,0xA4,0x80,0x25,0xA0,0x26,0xA0,0xE4,0x60}; const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0x22,0x40,0xf9,0x40,0x20,0x40,0x2a, - 0x40,0x31,0x40,0x60,0xe0,0xaf,0x40,0x20,0x40,0x20,0x40,0xe0,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x40,0x22,0x40,0xF9,0x40,0x20,0x40,0x2A, + 0x40,0x31,0x40,0x60,0xE0,0xAF,0x40,0x20,0x40,0x20,0x40,0xE0,0x40}; const u8g_fntpgm_uint8_t fontpage_197_165_165[45] U8G_FONT_SECTION("fontpage_197_165_165") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x24,0x40,0xfc,0x40,0x25,0x80,0x2c, - 0x00,0x37,0xe0,0x65,0x40,0xa5,0x40,0x24,0x80,0x25,0x40,0xe6,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x24,0x40,0xFC,0x40,0x25,0x80,0x2C, + 0x00,0x37,0xE0,0x65,0x40,0xA5,0x40,0x24,0x80,0x25,0x40,0xE6,0x20}; const u8g_fntpgm_uint8_t fontpage_197_172_172[45] U8G_FONT_SECTION("fontpage_197_172_172") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x27,0xa0,0x28, - 0x20,0x30,0x00,0x67,0xe0,0xa4,0x20,0x24,0x20,0x27,0xe0,0xe4,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0xFA,0x40,0x27,0xA0,0x28, + 0x20,0x30,0x00,0x67,0xE0,0xA4,0x20,0x24,0x20,0x27,0xE0,0xE4,0x20}; const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x20,0x80,0xf8,0x80,0x27,0xe0,0x2c, - 0xa0,0x34,0xa0,0x67,0xe0,0xa4,0xa0,0x24,0xa0,0x27,0xe0,0xe4,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x20,0x80,0xF8,0x80,0x27,0xE0,0x2C, + 0xA0,0x34,0xA0,0x67,0xE0,0xA4,0xA0,0x24,0xA0,0x27,0xE0,0xE4,0x20}; const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0xff,0xe0,0x22,0x00,0x2b, - 0xc0,0x32,0x40,0x65,0x40,0xa4,0x80,0x28,0x80,0x29,0x40,0xe6,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x22,0x40,0xFF,0xE0,0x22,0x00,0x2B, + 0xC0,0x32,0x40,0x65,0x40,0xA4,0x80,0x28,0x80,0x29,0x40,0xE6,0x20}; const u8g_fntpgm_uint8_t fontpage_197_233_233[45] U8G_FONT_SECTION("fontpage_197_233_233") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x22,0x40,0xf9,0x80,0x22,0x40,0x2c, - 0x20,0x31,0x00,0x67,0xc0,0xa1,0x00,0x2f,0xe0,0x21,0x00,0xe1,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x22,0x40,0xF9,0x80,0x22,0x40,0x2C, + 0x20,0x31,0x00,0x67,0xC0,0xA1,0x00,0x2F,0xE0,0x21,0x00,0xE1,0x00}; const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0xff,0xe0,0x25,0x20,0x29, - 0x00,0x37,0xe0,0x62,0x40,0xa6,0x40,0x21,0x80,0x22,0x80,0xec,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0xFF,0xE0,0x25,0x20,0x29, + 0x00,0x37,0xE0,0x62,0x40,0xA6,0x40,0x21,0x80,0x22,0x80,0xEC,0x60}; const u8g_fntpgm_uint8_t fontpage_198_161_161[45] U8G_FONT_SECTION("fontpage_198_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x20,0xfb,0x40,0x21,0x00,0x2f, - 0xe0,0x30,0x20,0x60,0x20,0xa7,0xe0,0x20,0x20,0x20,0x20,0xef,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x25,0x20,0xFB,0x40,0x21,0x00,0x2F, + 0xE0,0x30,0x20,0x60,0x20,0xA7,0xE0,0x20,0x20,0x20,0x20,0xEF,0xE0}; const u8g_fntpgm_uint8_t fontpage_198_164_164[45] U8G_FONT_SECTION("fontpage_198_164_164") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0xfa,0x40,0x21,0x80,0x2e, - 0x60,0x30,0x00,0x62,0x40,0xa2,0x40,0x22,0x40,0x24,0x40,0xe8,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0xFA,0x40,0x21,0x80,0x2E, + 0x60,0x30,0x00,0x62,0x40,0xA2,0x40,0x22,0x40,0x24,0x40,0xE8,0x40}; const u8g_fntpgm_uint8_t fontpage_198_223_223[45] U8G_FONT_SECTION("fontpage_198_223_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0x22,0x40,0xfb,0xc0,0x20,0x00,0x2f, - 0xe0,0x34,0x20,0x65,0x20,0xa5,0x20,0x25,0x20,0x22,0x80,0xec,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xC0,0x22,0x40,0xFB,0xC0,0x20,0x00,0x2F, + 0xE0,0x34,0x20,0x65,0x20,0xA5,0x20,0x25,0x20,0x22,0x80,0xEC,0x60}; const u8g_fntpgm_uint8_t fontpage_198_226_226[45] U8G_FONT_SECTION("fontpage_198_226_226") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xfc,0x80,0x27,0xc0,0x2d, - 0x40,0x35,0x40,0x6f,0xe0,0xa1,0x00,0x22,0x80,0x24,0x40,0xe8,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xFC,0x80,0x27,0xC0,0x2D, + 0x40,0x35,0x40,0x6F,0xE0,0xA1,0x00,0x22,0x80,0x24,0x40,0xE8,0x20}; const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0xe0,0xf9,0x00,0x27,0xc0,0x2c, - 0x40,0x37,0xc0,0x64,0x40,0xa7,0xc0,0x21,0x00,0x2f,0xe0,0xe1,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0xE0,0xF9,0x00,0x27,0xC0,0x2C, + 0x40,0x37,0xC0,0x64,0x40,0xA7,0xC0,0x21,0x00,0x2F,0xE0,0xE1,0x00}; const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x28,0x20,0xf2,0x80,0x24,0x40,0x29, - 0x20,0x31,0x00,0x6f,0xe0,0xa1,0x00,0x25,0x80,0x29,0x40,0xf1,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x28,0x20,0xF2,0x80,0x24,0x40,0x29, + 0x20,0x31,0x00,0x6F,0xE0,0xA1,0x00,0x25,0x80,0x29,0x40,0xF1,0x20}; const u8g_fntpgm_uint8_t fontpage_199_165_165[45] U8G_FONT_SECTION("fontpage_199_165_165") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf4,0x40,0x22,0x80,0x2f, - 0xe0,0x31,0x00,0x6f,0xe0,0xa2,0x40,0x26,0x80,0x21,0x40,0xee,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xF4,0x40,0x22,0x80,0x2F, + 0xE0,0x31,0x00,0x6F,0xE0,0xA2,0x40,0x26,0x80,0x21,0x40,0xEE,0x20}; const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf8,0x20,0x22,0x80,0x24, - 0x40,0x38,0x20,0x67,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0xef,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xF8,0x20,0x22,0x80,0x24, + 0x40,0x38,0x20,0x67,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0xEF,0xE0}; const u8g_fntpgm_uint8_t fontpage_199_208_208[45] U8G_FONT_SECTION("fontpage_199_208_208") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x24,0x40,0xff,0xc0,0x24,0x40,0x27, - 0xc0,0x30,0x00,0x6f,0xe0,0xa5,0x00,0x25,0xe0,0x2b,0x00,0xf1,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x24,0x40,0xFF,0xC0,0x24,0x40,0x27, + 0xC0,0x30,0x00,0x6F,0xE0,0xA5,0x00,0x25,0xE0,0x2B,0x00,0xF1,0xE0}; const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xf1,0x00,0x2f,0xe0,0x21, - 0x00,0x35,0x60,0x69,0x20,0xad,0x60,0x29,0x20,0x29,0x20,0xef,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0xC0,0x27,0x00,0xF1,0x00,0x2F,0xE0,0x21, + 0x00,0x35,0x60,0x69,0x20,0xAD,0x60,0x29,0x20,0x29,0x20,0xEF,0xE0}; const u8g_fntpgm_uint8_t fontpage_202_182_182[45] U8G_FONT_SECTION("fontpage_202_182_182") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x93,0xe0,0x94,0x40,0x9a, - 0x40,0x92,0x40,0xb2,0x80,0xd1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x93,0xE0,0x94,0x40,0x9A, + 0x40,0x92,0x40,0xB2,0x80,0xD1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_190_190") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x11,0x00,0xfd,0xe0,0x22,0x40,0x25, - 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4a,0x40,0x94,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x11,0x00,0xFD,0xE0,0x22,0x40,0x25, + 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4A,0x40,0x94,0x20}; const u8g_fntpgm_uint8_t fontpage_202_240_240[45] U8G_FONT_SECTION("fontpage_202_240_240") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x95,0x00,0x59,0x00,0xfd,0xe0,0x33,0x40,0x59, - 0x40,0x95,0x40,0xfd,0x40,0x29,0x40,0x68,0x80,0x11,0x40,0xee,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x95,0x00,0x59,0x00,0xFD,0xE0,0x33,0x40,0x59, + 0x40,0x95,0x40,0xFD,0x40,0x29,0x40,0x68,0x80,0x11,0x40,0xEE,0x20}; const u8g_fntpgm_uint8_t fontpage_202_242_242[45] U8G_FONT_SECTION("fontpage_202_242_242") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0xfe,0xe0,0x00,0x80,0x78,0x80,0x4b, - 0xe0,0x79,0x40,0x01,0x40,0xff,0x40,0xaa,0x80,0xbb,0x40,0x86,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0xFE,0xE0,0x00,0x80,0x78,0x80,0x4B, + 0xE0,0x79,0x40,0x01,0x40,0xFF,0x40,0xAA,0x80,0xBB,0x40,0x86,0x20}; const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x55,0x40,0x7c,0x80,0x39, - 0x40,0x56,0x20,0x7f,0xc0,0x04,0x00,0x27,0x80,0x24,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x55,0x40,0x7C,0x80,0x39, + 0x40,0x56,0x20,0x7F,0xC0,0x04,0x00,0x27,0x80,0x24,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_203_135_135[45] U8G_FONT_SECTION("fontpage_203_135_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x11,0x00,0x11, - 0x00,0x11,0x00,0x0a,0x00,0x0a,0x00,0x04,0x00,0x1b,0x00,0xe0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x11, + 0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x1B,0x00,0xE0,0xE0}; const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xac,0x80,0x72,0x80,0x20,0x80,0xfc, - 0x80,0x22,0x80,0x30,0xe0,0x6f,0x80,0xa0,0x80,0x20,0x80,0x20,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0xAC,0x80,0x72,0x80,0x20,0x80,0xFC, + 0x80,0x22,0x80,0x30,0xE0,0x6F,0x80,0xA0,0x80,0x20,0x80,0x20,0x80}; const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x40,0x29,0x40,0x44,0xc0,0xb8,0x40,0x12, - 0x40,0x7d,0x40,0x10,0x60,0x55,0xc0,0x52,0x40,0x92,0x40,0x30,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x40,0x29,0x40,0x44,0xC0,0xB8,0x40,0x12, + 0x40,0x7D,0x40,0x10,0x60,0x55,0xC0,0x52,0x40,0x92,0x40,0x30,0x40}; const u8g_fntpgm_uint8_t fontpage_203_173_173[45] U8G_FONT_SECTION("fontpage_203_173_173") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xd5,0x80,0xb9,0x00,0x91,0x00,0xfd, - 0xe0,0xb1,0x40,0xd9,0x40,0xd5,0x40,0x91,0x40,0xfa,0x40,0x04,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x60,0xD5,0x80,0xB9,0x00,0x91,0x00,0xFD, + 0xE0,0xB1,0x40,0xD9,0x40,0xD5,0x40,0x91,0x40,0xFA,0x40,0x04,0x40}; const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xfd,0x80,0x45,0x00,0x29,0x00,0xfd, - 0xe0,0x11,0x40,0xfd,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x60,0xFD,0x80,0x45,0x00,0x29,0x00,0xFD, + 0xE0,0x11,0x40,0xFD,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; const u8g_fntpgm_uint8_t fontpage_203_185_185[45] U8G_FONT_SECTION("fontpage_203_185_185") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x08,0x00,0x08, - 0x00,0x0f,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x08, + 0x00,0x0F,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; const u8g_fntpgm_uint8_t fontpage_203_224_224[45] U8G_FONT_SECTION("fontpage_203_224_224") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, - 0xe0,0x0a,0x00,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, + 0xE0,0x0A,0x00,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0}; const u8g_fntpgm_uint8_t fontpage_203_246_246[45] U8G_FONT_SECTION("fontpage_203_246_246") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x00,0x80,0xf0,0x80,0x9f,0xe0,0x90,0x80,0x94, - 0x80,0xf2,0x80,0x92,0x80,0x90,0x80,0x90,0x80,0xf0,0x80,0x03,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x00,0x80,0xF0,0x80,0x9F,0xE0,0x90,0x80,0x94, + 0x80,0xF2,0x80,0x92,0x80,0x90,0x80,0x90,0x80,0xF0,0x80,0x03,0x80}; const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_142_142") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xe0,0xf2,0x20,0x92,0x20,0x93,0xe0,0xf2, - 0x20,0x92,0x20,0x93,0xe0,0xf2,0x20,0x04,0x20,0x08,0xa0,0x30,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8E,0x8E,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x03,0xE0,0xF2,0x20,0x92,0x20,0x93,0xE0,0xF2, + 0x20,0x92,0x20,0x93,0xE0,0xF2,0x20,0x04,0x20,0x08,0xA0,0x30,0x40}; const u8g_fntpgm_uint8_t fontpage_204_175_175[45] U8G_FONT_SECTION("fontpage_204_175_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f, - 0x80,0x00,0x00,0xff,0xe0,0x24,0x00,0x27,0x80,0x54,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F, + 0x80,0x00,0x00,0xFF,0xE0,0x24,0x00,0x27,0x80,0x54,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_205_130_130[45] U8G_FONT_SECTION("fontpage_205_130_130") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0xfb,0x80,0x52,0x00,0xfb,0xe0,0x12, - 0x80,0xf4,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x40,0xFB,0x80,0x52,0x00,0xFB,0xE0,0x12, + 0x80,0xF4,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x00,0x55,0xe0,0x7d,0x40,0x55, - 0x40,0xff,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xE0,0xFF,0x00,0x55,0xE0,0x7D,0x40,0x55, + 0x40,0xFF,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40}; const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x02,0x00,0x3f,0xc0,0x22,0x40,0x3f, - 0xc0,0x22,0x40,0x3f,0xc0,0x0a,0x00,0x04,0x00,0x1b,0x00,0xe0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x02,0x00,0x3F,0xC0,0x22,0x40,0x3F, + 0xC0,0x22,0x40,0x3F,0xC0,0x0A,0x00,0x04,0x00,0x1B,0x00,0xE0,0xE0}; const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, - 0xe0,0x48,0x00,0x7f,0xc0,0x4a,0x40,0x79,0x80,0xc9,0x80,0x0e,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, + 0xE0,0x48,0x00,0x7F,0xC0,0x4A,0x40,0x79,0x80,0xC9,0x80,0x0E,0x60}; const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x1f,0x80,0x30, - 0x80,0x5f,0x80,0x90,0x80,0x1f,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x30, + 0x80,0x5F,0x80,0x90,0x80,0x1F,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; const u8g_fntpgm_uint8_t fontpage_206_159_159[45] U8G_FONT_SECTION("fontpage_206_159_159") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x49,0xe0,0xfd,0x20,0x49,0x20,0x79,0xe0,0x49, - 0x20,0x79,0x20,0x49,0xe0,0xfd,0x20,0x01,0x20,0x49,0x20,0x86,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x49,0xE0,0xFD,0x20,0x49,0x20,0x79,0xE0,0x49, + 0x20,0x79,0x20,0x49,0xE0,0xFD,0x20,0x01,0x20,0x49,0x20,0x86,0x60}; const u8g_fntpgm_uint8_t fontpage_206_186_186[45] U8G_FONT_SECTION("fontpage_206_186_186") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0x80,0x24,0x80,0xfc,0x80,0x24, - 0x80,0x74,0x80,0x6c,0x80,0xa4,0x80,0xa4,0x80,0x28,0xa0,0x30,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0x80,0x24,0x80,0xFC,0x80,0x24, + 0x80,0x74,0x80,0x6C,0x80,0xA4,0x80,0xA4,0x80,0x28,0xA0,0x30,0xE0}; const u8g_fntpgm_uint8_t fontpage_206_192_192[45] U8G_FONT_SECTION("fontpage_206_192_192") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x19,0x00,0x06,0x00,0x19,0x00,0x64, - 0xc0,0x04,0x00,0xff,0xe0,0x15,0x00,0x24,0x80,0xc4,0x60,0x0c,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x19,0x00,0x06,0x00,0x19,0x00,0x64, + 0xC0,0x04,0x00,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60,0x0C,0x00}; const u8g_fntpgm_uint8_t fontpage_206_223_223[45] U8G_FONT_SECTION("fontpage_206_223_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x24, - 0x80,0x24,0x80,0x3f,0x80,0x0e,0x00,0x15,0x00,0x24,0x80,0xc4,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x24, + 0x80,0x24,0x80,0x3F,0x80,0x0E,0x00,0x15,0x00,0x24,0x80,0xC4,0x60}; const u8g_fntpgm_uint8_t fontpage_206_225_225[45] U8G_FONT_SECTION("fontpage_206_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x29,0x00,0x46,0x00,0x0a, - 0x00,0x35,0x80,0xc4,0x60,0x3f,0x80,0x15,0x00,0x24,0x80,0xdc,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0x80,0x29,0x00,0x46,0x00,0x0A, + 0x00,0x35,0x80,0xC4,0x60,0x3F,0x80,0x15,0x00,0x24,0x80,0xDC,0x40}; const u8g_fntpgm_uint8_t fontpage_206_229_229[45] U8G_FONT_SECTION("fontpage_206_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x24,0x80,0x15,0x00,0xff, - 0xe0,0x04,0x00,0x0e,0x00,0x15,0x00,0x24,0x80,0xc4,0x60,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x24,0x80,0x15,0x00,0xFF, + 0xE0,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0xC4,0x60,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_255_255") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xfc,0x00,0x24,0x00,0x27, - 0xc0,0x74,0x40,0x6e,0x40,0xa5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0xC0,0x27,0x00,0xFC,0x00,0x24,0x00,0x27, + 0xC0,0x74,0x40,0x6E,0x40,0xA5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; const u8g_fntpgm_uint8_t fontpage_207_151_151[45] U8G_FONT_SECTION("fontpage_207_151_151") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, - 0x00,0x6b,0x80,0xa5,0x40,0xa9,0x20,0x21,0x00,0x21,0x00,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x71, + 0x00,0x6B,0x80,0xA5,0x40,0xA9,0x20,0x21,0x00,0x21,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, - 0x00,0x69,0x00,0xa7,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x71, + 0x00,0x69,0x00,0xA7,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0x2f,0xe0,0xf0,0x00,0x22, - 0x80,0x74,0x40,0x6a,0xa0,0xa2,0x80,0x21,0x00,0x22,0x80,0x2c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x21,0x00,0x2F,0xE0,0xF0,0x00,0x22, + 0x80,0x74,0x40,0x6A,0xA0,0xA2,0x80,0x21,0x00,0x22,0x80,0x2C,0x60}; const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x40,0x2a,0x80,0x21, - 0x00,0x72,0x80,0x6c,0x60,0xa7,0xc0,0x24,0x40,0x24,0x40,0x27,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xF4,0x40,0x2A,0x80,0x21, + 0x00,0x72,0x80,0x6C,0x60,0xA7,0xC0,0x24,0x40,0x24,0x40,0x27,0xC0}; const u8g_fntpgm_uint8_t fontpage_209_175_175[45] U8G_FONT_SECTION("fontpage_209_175_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x40,0x22,0x80,0x27,0xc0,0xf9,0x40,0x27, - 0xc0,0x75,0x00,0x6f,0xe0,0xa3,0x20,0x25,0x20,0x29,0xc0,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x40,0x22,0x80,0x27,0xC0,0xF9,0x40,0x27, + 0xC0,0x75,0x00,0x6F,0xE0,0xA3,0x20,0x25,0x20,0x29,0xC0,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_209_192_192[45] U8G_FONT_SECTION("fontpage_209_192_192") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x22,0x80,0xfc,0x40,0x28,0x20,0x27, - 0xc0,0x70,0x00,0x69,0x20,0xa4,0xa0,0x22,0x40,0x22,0x80,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x22,0x80,0xFC,0x40,0x28,0x20,0x27, + 0xC0,0x70,0x00,0x69,0x20,0xA4,0xA0,0x22,0x40,0x22,0x80,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xfa,0xa0,0x2f,0xe0,0x2a, - 0xa0,0x3f,0xe0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x27,0xc0,0x24,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x2F,0xE0,0xFA,0xA0,0x2F,0xE0,0x2A, + 0xA0,0x3F,0xE0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40}; const u8g_fntpgm_uint8_t fontpage_212_161_161[45] U8G_FONT_SECTION("fontpage_212_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xf2,0x80,0x27,0xc0,0x34, - 0x40,0x6f,0xc0,0x64,0x40,0xaf,0xe0,0x21,0x00,0x22,0x80,0x2c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x2F,0xE0,0xF2,0x80,0x27,0xC0,0x34, + 0x40,0x6F,0xC0,0x64,0x40,0xAF,0xE0,0x21,0x00,0x22,0x80,0x2C,0x60}; const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0x40,0x2a,0xa0,0xf4,0x40,0x27,0xc0,0x38, - 0x20,0x27,0xc0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x22,0x80,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0x40,0x2A,0xA0,0xF4,0x40,0x27,0xC0,0x38, + 0x20,0x27,0xC0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x22,0x80,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_214_226_227[71] U8G_FONT_SECTION("fontpage_214_226_227") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe3,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, - 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xff,0xc0,0x0b,0x0a,0x14, - 0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xc0,0x24,0x00,0x24, - 0x00,0x24,0x00,0x24,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE3,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, + 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xFF,0xC0,0x0B,0x0A,0x14, + 0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xC0,0x24,0x00,0x24, + 0x00,0x24,0x00,0x24,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x27,0xc0,0x24,0x00,0x24,0x00,0xff, - 0xe0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xf8,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x27,0xC0,0x24,0x00,0x24,0x00,0xFF, + 0xE0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xF8,0x00}; const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xf6, - 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xb4,0x40,0xc4,0x40,0x83,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xF6, + 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xB4,0x40,0xC4,0x40,0x83,0xC0}; const u8g_fntpgm_uint8_t fontpage_217_161_161[45] U8G_FONT_SECTION("fontpage_217_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0x24,0x80,0x84,0x80,0x48,0xe0,0x10, - 0x00,0x2f,0xc0,0x24,0x80,0x42,0x80,0xc3,0x00,0x44,0x80,0x58,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0x80,0x24,0x80,0x84,0x80,0x48,0xE0,0x10, + 0x00,0x2F,0xC0,0x24,0x80,0x42,0x80,0xC3,0x00,0x44,0x80,0x58,0x60}; const u8g_fntpgm_uint8_t fontpage_217_226_226[45] U8G_FONT_SECTION("fontpage_217_226_226") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x8f,0xe0,0x49,0x20,0x19, - 0x00,0x2f,0xc0,0x28,0x40,0xca,0x80,0x49,0x00,0x52,0x80,0x6c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x21,0x00,0x8F,0xE0,0x49,0x20,0x19, + 0x00,0x2F,0xC0,0x28,0x40,0xCA,0x80,0x49,0x00,0x52,0x80,0x6C,0x60}; const u8g_fntpgm_uint8_t fontpage_217_232_232[45] U8G_FONT_SECTION("fontpage_217_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x21,0x00,0x8f,0xe0,0x51,0x00,0x11, - 0x00,0x21,0x00,0x27,0xc0,0xc1,0x00,0x41,0x00,0x41,0x00,0x4f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x21,0x00,0x8F,0xE0,0x51,0x00,0x11, + 0x00,0x21,0x00,0x27,0xC0,0xC1,0x00,0x41,0x00,0x41,0x00,0x4F,0xE0}; const u8g_fntpgm_uint8_t fontpage_218_151_151[45] U8G_FONT_SECTION("fontpage_218_151_151") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x00,0x87,0xc0,0x49,0x00,0x21, - 0x00,0x3f,0xe0,0x42,0x80,0xc2,0x80,0x44,0xa0,0x48,0xa0,0x50,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x25,0x00,0x87,0xC0,0x49,0x00,0x21, + 0x00,0x3F,0xE0,0x42,0x80,0xC2,0x80,0x44,0xA0,0x48,0xA0,0x50,0xE0}; const u8g_fntpgm_uint8_t fontpage_218_187_187[45] U8G_FONT_SECTION("fontpage_218_187_187") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x81,0x00,0x5f,0xe0,0x11, - 0x00,0x21,0x00,0x27,0xc0,0xc4,0x40,0x44,0x40,0x47,0xc0,0x44,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x81,0x00,0x5F,0xE0,0x11, + 0x00,0x21,0x00,0x27,0xC0,0xC4,0x40,0x44,0x40,0x47,0xC0,0x44,0x40}; const u8g_fntpgm_uint8_t fontpage_218_193_193[45] U8G_FONT_SECTION("fontpage_218_193_193") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x5f,0xe0,0x04,0x00,0x88,0x80,0x5f, - 0xc0,0x20,0x40,0x2a,0x80,0xca,0x80,0x4a,0xa0,0x4a,0xa0,0x52,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x82,0x00,0x5F,0xE0,0x04,0x00,0x88,0x80,0x5F, + 0xC0,0x20,0x40,0x2A,0x80,0xCA,0x80,0x4A,0xA0,0x4A,0xA0,0x52,0x60}; const u8g_fntpgm_uint8_t fontpage_218_203_203[45] U8G_FONT_SECTION("fontpage_218_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xbe,0x20,0x62,0xa0,0x2a,0xa0,0xaa,0xa0,0x6a, - 0xa0,0x2a,0xa0,0x2a,0xa0,0xc8,0xa0,0x54,0x20,0x62,0x20,0x40,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xBE,0x20,0x62,0xA0,0x2A,0xA0,0xAA,0xA0,0x6A, + 0xA0,0x2A,0xA0,0x2A,0xA0,0xC8,0xA0,0x54,0x20,0x62,0x20,0x40,0xE0}; const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xe0,0x14, - 0x20,0x27,0xe0,0x24,0x20,0xc7,0xe0,0x44,0x20,0x44,0x20,0x44,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xE0,0x14, + 0x20,0x27,0xE0,0x24,0x20,0xC7,0xE0,0x44,0x20,0x44,0x20,0x44,0x60}; const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, - 0x40,0x29,0x20,0x25,0x40,0xc5,0x80,0x49,0x00,0x42,0x80,0x5c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, + 0x40,0x29,0x20,0x25,0x40,0xC5,0x80,0x49,0x00,0x42,0x80,0x5C,0x60}; const u8g_fntpgm_uint8_t fontpage_219_247_247[45] U8G_FONT_SECTION("fontpage_219_247_247") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xc0,0x28,0x40,0x0f,0xc0,0x88,0x40,0x5f, - 0xc0,0x29,0x20,0x29,0x40,0xcf,0x80,0x49,0x20,0x4b,0x20,0x4c,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xC0,0x28,0x40,0x0F,0xC0,0x88,0x40,0x5F, + 0xC0,0x29,0x20,0x29,0x40,0xCF,0x80,0x49,0x20,0x4B,0x20,0x4C,0xE0}; const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x01,0x00,0x97,0xc0,0x51, - 0x00,0x2f,0xe0,0x24,0x40,0xc7,0x40,0x45,0xc0,0x44,0x40,0x44,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x01,0x00,0x97,0xC0,0x51, + 0x00,0x2F,0xE0,0x24,0x40,0xC7,0x40,0x45,0xC0,0x44,0x40,0x44,0xC0}; const u8g_fntpgm_uint8_t fontpage_220_169_169[45] U8G_FONT_SECTION("fontpage_220_169_169") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x07,0xc0,0x94,0x40,0x57, - 0xc0,0x20,0x00,0x2f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x24,0x40,0x07,0xC0,0x94,0x40,0x57, + 0xC0,0x20,0x00,0x2F,0xE0,0xCA,0xA0,0x4A,0xA0,0x4A,0xA0,0x5F,0xE0}; const u8g_fntpgm_uint8_t fontpage_220_184_184[45] U8G_FONT_SECTION("fontpage_220_184_184") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb8,0xb8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x48,0x80,0x24,0xe0,0x1f,0x00,0x88,0xe0,0x5e, - 0x20,0x2a,0x40,0x2b,0xe0,0xca,0x40,0x4a,0x40,0x52,0x40,0x66,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB8,0xB8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x48,0x80,0x24,0xE0,0x1F,0x00,0x88,0xE0,0x5E, + 0x20,0x2A,0x40,0x2B,0xE0,0xCA,0x40,0x4A,0x40,0x52,0x40,0x66,0xC0}; const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x80,0x8b,0xe0,0x4a,0x20,0x1b, - 0xe0,0x2a,0x20,0x2b,0xe0,0xc8,0x80,0x4a,0xc0,0x54,0xa0,0x69,0xa0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x28,0x80,0x8B,0xE0,0x4A,0x20,0x1B, + 0xE0,0x2A,0x20,0x2B,0xE0,0xC8,0x80,0x4A,0xC0,0x54,0xA0,0x69,0xA0}; const u8g_fntpgm_uint8_t fontpage_221_162_162[45] U8G_FONT_SECTION("fontpage_221_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x40,0x22,0x80,0x0f,0xe0,0x82,0x80,0x44, - 0x40,0x28,0x20,0x3f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x40,0x22,0x80,0x0F,0xE0,0x82,0x80,0x44, + 0x40,0x28,0x20,0x3F,0xE0,0xCA,0xA0,0x4A,0xA0,0x4A,0xA0,0x5F,0xE0}; const u8g_fntpgm_uint8_t fontpage_221_209_209[45] U8G_FONT_SECTION("fontpage_221_209_209") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x07,0x40,0x85,0x40,0x5f, - 0xe0,0x34,0x60,0x27,0xc0,0xc4,0x40,0x47,0xc0,0x44,0x40,0x44,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x24,0x40,0x07,0x40,0x85,0x40,0x5F, + 0xE0,0x34,0x60,0x27,0xC0,0xC4,0x40,0x47,0xC0,0x44,0x40,0x44,0xC0}; const u8g_fntpgm_uint8_t fontpage_222_143_143[45] U8G_FONT_SECTION("fontpage_222_143_143") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x20,0x0f,0xe0,0x98,0x00,0x5f, - 0xe0,0x29,0x00,0x2f,0xe0,0xcd,0xa0,0x4b,0x60,0x5d,0xa0,0x49,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x28,0x20,0x0F,0xE0,0x98,0x00,0x5F, + 0xE0,0x29,0x00,0x2F,0xE0,0xCD,0xA0,0x4B,0x60,0x5D,0xA0,0x49,0x60}; const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53, - 0xa0,0x3e,0xa0,0x28,0xa0,0xdf,0xa0,0x4a,0x40,0x52,0xa0,0x65,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x80,0x3E,0x80,0x12,0xE0,0x9E,0xA0,0x53, + 0xA0,0x3E,0xA0,0x28,0xA0,0xDF,0xA0,0x4A,0x40,0x52,0xA0,0x65,0x20}; const u8g_fntpgm_uint8_t fontpage_224_239_239[45] U8G_FONT_SECTION("fontpage_224_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x17,0xe0,0x54,0x80,0x58,0x80,0x50, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x17,0xE0,0x54,0x80,0x58,0x80,0x50, 0x80,0x90,0x80,0x10,0x80,0x10,0x80,0x28,0x80,0x44,0x80,0x81,0x80}; const u8g_fntpgm_uint8_t fontpage_225_185_185[45] U8G_FONT_SECTION("fontpage_225_185_185") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x3f, - 0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x00,0x00,0x52,0x40,0x89,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x3F, + 0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x52,0x40,0x89,0x20}; const u8g_fntpgm_uint8_t fontpage_225_237_237[45] U8G_FONT_SECTION("fontpage_225_237_237") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xf7,0x80,0x22,0x80,0x32,0x80,0x66, - 0x80,0xa3,0x80,0x24,0xa0,0x68,0x60,0x00,0x00,0x52,0x40,0x89,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xF7,0x80,0x22,0x80,0x32,0x80,0x66, + 0x80,0xA3,0x80,0x24,0xA0,0x68,0x60,0x00,0x00,0x52,0x40,0x89,0x20}; const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x21,0x00,0x3f,0xe0,0x20, - 0x00,0x20,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20, + 0x00,0x20,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; const u8g_fntpgm_uint8_t fontpage_228_233_233[45] U8G_FONT_SECTION("fontpage_228_233_233") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xa2,0x00,0xa7,0xe0,0xfa,0xa0,0xa2, - 0xa0,0x32,0xa0,0x64,0xa0,0xa9,0x20,0x22,0x20,0x25,0x20,0x28,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xA2,0x00,0xA7,0xE0,0xFA,0xA0,0xA2, + 0xA0,0x32,0xA0,0x64,0xA0,0xA9,0x20,0x22,0x20,0x25,0x20,0x28,0xC0}; const u8g_fntpgm_uint8_t fontpage_228_249_249[45] U8G_FONT_SECTION("fontpage_228_249_249") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xa7,0xc0,0xf1,0x00,0xa1,0x00,0xaf, - 0xe0,0x30,0x80,0x6f,0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x23,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xA7,0xC0,0xF1,0x00,0xA1,0x00,0xAF, + 0xE0,0x30,0x80,0x6F,0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x23,0x80}; const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_135_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x88,0x40,0x52,0x80,0x0c, - 0x00,0x2a,0x80,0xdf,0x40,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x88,0x40,0x52,0x80,0x0C, + 0x00,0x2A,0x80,0xDF,0x40,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_231_175_175[45] U8G_FONT_SECTION("fontpage_231_175_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x21,0x00,0x23,0x00,0x73, - 0x80,0x25,0x40,0x25,0x20,0x39,0x20,0xc1,0x00,0x01,0x00,0x01,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF9,0x00,0x21,0x00,0x23,0x00,0x73, + 0x80,0x25,0x40,0x25,0x20,0x39,0x20,0xC1,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x44,0x40,0x7f,0xc0,0x44, - 0x40,0x44,0x40,0x7f,0xc0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44, + 0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xC0}; const u8g_fntpgm_uint8_t fontpage_234_181_181[45] U8G_FONT_SECTION("fontpage_234_181_181") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb5,0xb5,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0xff, - 0x80,0x88,0x80,0x88,0x80,0xff,0x80,0x08,0x40,0x08,0x40,0x07,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB5,0xB5,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0x80,0x88,0x80,0xFF, + 0x80,0x88,0x80,0x88,0x80,0xFF,0x80,0x08,0x40,0x08,0x40,0x07,0xC0}; const u8g_fntpgm_uint8_t fontpage_234_229_229[45] U8G_FONT_SECTION("fontpage_234_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xfb,0xc0,0xae,0x40,0xa9,0x80,0xfa, - 0x40,0xac,0x20,0xab,0xc0,0xaa,0x40,0xfa,0x40,0x8b,0xc0,0x02,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xFB,0xC0,0xAE,0x40,0xA9,0x80,0xFA, + 0x40,0xAC,0x20,0xAB,0xC0,0xAA,0x40,0xFA,0x40,0x8B,0xC0,0x02,0x40}; const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x08,0x0b,0x0b,0x0c,0x02,0xff,0x10,0x20,0xff,0x81,0x81,0xff,0x81,0x81,0x81, - 0xff,0x81}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x08,0x0B,0x0B,0x0C,0x02,0xFF,0x10,0x20,0xFF,0x81,0x81,0xFF,0x81,0x81,0x81, + 0xFF,0x81}; const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x22,0x00,0x42,0x00,0xf7,0xc0,0x98,0x40,0x90, - 0x40,0xf4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xf0,0x40,0x91,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x22,0x00,0x42,0x00,0xF7,0xC0,0x98,0x40,0x90, + 0x40,0xF4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xF0,0x40,0x91,0x80}; const u8g_fntpgm_uint8_t fontpage_237_209_209[45] U8G_FONT_SECTION("fontpage_237_209_209") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x4a,0x00,0x4b,0xe0,0x4a,0x00,0x4c, - 0x80,0x48,0x40,0x08,0x00,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x4A,0x00,0x4B,0xE0,0x4A,0x00,0x4C, + 0x80,0x48,0x40,0x08,0x00,0x7F,0xC0,0x4A,0x40,0x4A,0x40,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20, - 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x20,0x80,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20, + 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_238_129_129[45] U8G_FONT_SECTION("fontpage_238_129_129") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x14,0x80,0x25,0x60,0x46,0x20,0x1f, - 0x80,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x14,0x80,0x25,0x60,0x46,0x20,0x1F, + 0x80,0x30,0x80,0xDF,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80}; const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_160_160") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf4,0x20,0x97,0xe0,0xf4,0x80,0x94, - 0x80,0x97,0xe0,0xf4,0x80,0x94,0x80,0xf4,0xa0,0x96,0x60,0x04,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF4,0x20,0x97,0xE0,0xF4,0x80,0x94, + 0x80,0x97,0xE0,0xF4,0x80,0x94,0x80,0xF4,0xA0,0x96,0x60,0x04,0x20}; const u8g_fntpgm_uint8_t fontpage_240_238_238[45] U8G_FONT_SECTION("fontpage_240_238_238") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xf3,0xc0,0x24,0x80,0x4f,0xe0,0xf5, - 0x20,0x57,0xe0,0x55,0x20,0x57,0xe0,0x75,0x20,0x45,0x20,0x08,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xF3,0xC0,0x24,0x80,0x4F,0xE0,0xF5, + 0x20,0x57,0xE0,0x55,0x20,0x57,0xE0,0x75,0x20,0x45,0x20,0x08,0x60}; const u8g_fntpgm_uint8_t fontpage_243_187_187[45] U8G_FONT_SECTION("fontpage_243_187_187") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x2a,0x80,0x24,0x80,0x2a, - 0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x49,0x40,0x5f,0x40,0x40,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x2A,0x80,0x24,0x80,0x2A, + 0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x49,0x40,0x5F,0x40,0x40,0xC0}; const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xe3,0xe0,0x24,0x20,0xfa,0x40,0x21, - 0x80,0x36,0x80,0x29,0xe0,0x62,0x20,0xa5,0x40,0x20,0x80,0x27,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xE3,0xE0,0x24,0x20,0xFA,0x40,0x21, + 0x80,0x36,0x80,0x29,0xE0,0x62,0x20,0xA5,0x40,0x20,0x80,0x27,0x00}; const u8g_fntpgm_uint8_t fontpage_244_250_250[45] U8G_FONT_SECTION("fontpage_244_250_250") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x89,0x00,0x10, - 0x80,0x60,0x40,0x1f,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x7f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x89,0x00,0x10, + 0x80,0x60,0x40,0x1F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xE0}; const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x45,0x20,0xf7,0xe0,0x00,0x00,0xaf, - 0xe0,0xa1,0x00,0xaf,0xe0,0x4a,0xa0,0x6a,0xa0,0x8a,0xa0,0x08,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x81,0x00,0x45,0x20,0xF7,0xE0,0x00,0x00,0xAF, + 0xE0,0xA1,0x00,0xAF,0xE0,0x4A,0xA0,0x6A,0xA0,0x8A,0xA0,0x08,0x60}; const u8g_fntpgm_uint8_t fontpage_246_172_172[45] U8G_FONT_SECTION("fontpage_246_172_172") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x54,0x80,0xbf,0xc0,0x04, - 0x40,0x7f,0xc0,0x44,0x00,0x7f,0xe0,0x14,0x20,0x24,0xc0,0xc4,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x7B,0xE0,0x54,0x80,0xBF,0xC0,0x04, + 0x40,0x7F,0xC0,0x44,0x00,0x7F,0xE0,0x14,0x20,0x24,0xC0,0xC4,0x00}; const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x7f,0xc0,0x04, - 0x00,0xff,0xe0,0x01,0x00,0x7f,0xc0,0x11,0x00,0x09,0x00,0x03,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x7B,0xE0,0x94,0x80,0x7F,0xC0,0x04, + 0x00,0xFF,0xE0,0x01,0x00,0x7F,0xC0,0x11,0x00,0x09,0x00,0x03,0x00}; const u8g_fntpgm_uint8_t fontpage_247_128_128[45] U8G_FONT_SECTION("fontpage_247_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x27,0xc0,0x50, - 0x40,0x4f,0x40,0x49,0x40,0x4f,0x40,0x49,0x40,0x4f,0x40,0x40,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x7B,0xE0,0x94,0x80,0x27,0xC0,0x50, + 0x40,0x4F,0x40,0x49,0x40,0x4F,0x40,0x49,0x40,0x4F,0x40,0x40,0xC0}; const u8g_fntpgm_uint8_t fontpage_247_177_177[45] U8G_FONT_SECTION("fontpage_247_177_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x4a,0x80,0x94,0x40,0x7f, - 0xc0,0x12,0x40,0x3b,0xc0,0x56,0x40,0x93,0xc0,0x12,0x40,0x13,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x3D,0xE0,0x4A,0x80,0x94,0x40,0x7F, + 0xC0,0x12,0x40,0x3B,0xC0,0x56,0x40,0x93,0xC0,0x12,0x40,0x13,0xC0}; const u8g_fntpgm_uint8_t fontpage_248_251_251[45] U8G_FONT_SECTION("fontpage_248_251_251") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x15,0x00,0xff,0xe0,0x15,0x00,0x24, - 0x80,0x40,0x40,0x04,0x00,0xff,0xe0,0x0a,0x00,0x11,0x00,0xe0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x15,0x00,0xFF,0xE0,0x15,0x00,0x24, + 0x80,0x40,0x40,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x11,0x00,0xE0,0xE0}; const u8g_fntpgm_uint8_t fontpage_250_162_162[45] U8G_FONT_SECTION("fontpage_250_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x91, - 0x20,0x3e,0x00,0x08,0x80,0x7f,0xc0,0x04,0x40,0x24,0x80,0xcc,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x91, + 0x20,0x3E,0x00,0x08,0x80,0x7F,0xC0,0x04,0x40,0x24,0x80,0xCC,0x60}; const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x51,0x40,0x5d,0x80,0x51,0x20,0xfd, - 0xe0,0x08,0x80,0x3f,0x00,0x08,0x80,0x7f,0xc0,0x24,0x80,0xcc,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x51,0x40,0x5D,0x80,0x51,0x20,0xFD, + 0xE0,0x08,0x80,0x3F,0x00,0x08,0x80,0x7F,0xC0,0x24,0x80,0xCC,0x60}; const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xc0,0x41,0x00,0x51,0x00,0xe1, - 0x00,0x21,0x00,0x41,0x00,0xf1,0x00,0x01,0x00,0x31,0x00,0xcf,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xC0,0x41,0x00,0x51,0x00,0xE1, + 0x00,0x21,0x00,0x41,0x00,0xF1,0x00,0x01,0x00,0x31,0x00,0xCF,0xE0}; const u8g_fntpgm_uint8_t fontpage_253_167_167[45] U8G_FONT_SECTION("fontpage_253_167_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xc0,0x22,0x40,0x4a,0x40,0x52,0x80,0xe2, - 0xe0,0x22,0x20,0x42,0x20,0xf5,0x40,0x0c,0x80,0x35,0x40,0xca,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xC0,0x22,0x40,0x4A,0x40,0x52,0x80,0xE2, + 0xE0,0x22,0x20,0x42,0x20,0xF5,0x40,0x0C,0x80,0x35,0x40,0xCA,0x20}; const u8g_fntpgm_uint8_t fontpage_253_191_191[45] U8G_FONT_SECTION("fontpage_253_191_191") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0x43,0xc0,0x4e,0x00,0xe3, - 0xe0,0x2e,0x00,0x42,0x40,0xf2,0x80,0x09,0x20,0x32,0xa0,0xcc,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x22,0x40,0x43,0xC0,0x4E,0x00,0xE3, + 0xE0,0x2E,0x00,0x42,0x40,0xF2,0x80,0x09,0x20,0x32,0xA0,0xCC,0x60}; const u8g_fntpgm_uint8_t fontpage_253_198_198[45] U8G_FONT_SECTION("fontpage_253_198_198") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0x44,0xa0,0x54,0xa0,0xe4, - 0xa0,0x27,0xe0,0x44,0xa0,0xf4,0xa0,0x04,0xa0,0x37,0xe0,0xc4,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0x44,0xA0,0x54,0xA0,0xE4, + 0xA0,0x27,0xE0,0x44,0xA0,0xF4,0xA0,0x04,0xA0,0x37,0xE0,0xC4,0x20}; const u8g_fntpgm_uint8_t fontpage_253_200_200[45] U8G_FONT_SECTION("fontpage_253_200_200") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0x54,0x40,0xea,0x80,0x21, - 0x00,0x42,0x80,0xec,0x60,0x01,0x00,0x30,0xc0,0xc3,0x00,0x00,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0x54,0x40,0xEA,0x80,0x21, + 0x00,0x42,0x80,0xEC,0x60,0x01,0x00,0x30,0xC0,0xC3,0x00,0x00,0xC0}; const u8g_fntpgm_uint8_t fontpage_253_211_211[45] U8G_FONT_SECTION("fontpage_253_211_211") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x4f,0xe0,0x51,0x00,0xe7, - 0xc0,0x20,0x00,0x47,0xc0,0xf4,0x40,0x0c,0x40,0x37,0xc0,0xc4,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x4F,0xE0,0x51,0x00,0xE7, + 0xC0,0x20,0x00,0x47,0xC0,0xF4,0x40,0x0C,0x40,0x37,0xC0,0xC4,0x40}; const u8g_fntpgm_uint8_t fontpage_253_217_217[45] U8G_FONT_SECTION("fontpage_253_217_217") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x42,0x80,0x54,0x40,0xe8, - 0x20,0x27,0xc0,0x40,0x00,0xf7,0xc0,0x0c,0x40,0x34,0x40,0xc7,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x42,0x80,0x54,0x40,0xE8, + 0x20,0x27,0xC0,0x40,0x00,0xF7,0xC0,0x0C,0x40,0x34,0x40,0xC7,0xC0}; const u8g_fntpgm_uint8_t fontpage_253_223_223[45] U8G_FONT_SECTION("fontpage_253_223_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x42,0x00,0x54,0x40,0xef, - 0xe0,0x22,0xa0,0x42,0x80,0xf2,0x80,0x02,0xa0,0x34,0xa0,0xc8,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x42,0x00,0x54,0x40,0xEF, + 0xE0,0x22,0xA0,0x42,0x80,0xF2,0x80,0x02,0xA0,0x34,0xA0,0xC8,0xE0}; const u8g_fntpgm_uint8_t fontpage_253_231_231[45] U8G_FONT_SECTION("fontpage_253_231_231") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x26,0xa0,0x45,0xc0,0x54,0x80,0xe7, - 0xe0,0x24,0x80,0x45,0xc0,0xf6,0xa0,0x04,0x80,0x34,0x80,0xc7,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x26,0xA0,0x45,0xC0,0x54,0x80,0xE7, + 0xE0,0x24,0x80,0x45,0xC0,0xF6,0xA0,0x04,0x80,0x34,0x80,0xC7,0xE0}; const u8g_fntpgm_uint8_t fontpage_253_234_234[45] U8G_FONT_SECTION("fontpage_253_234_234") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xa0,0x49,0x40,0x57,0xe0,0xe1, - 0x00,0x23,0xe0,0x46,0x20,0xf3,0xe0,0x0a,0x20,0x33,0xe0,0xc2,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEA,0xEA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xA0,0x49,0x40,0x57,0xE0,0xE1, + 0x00,0x23,0xE0,0x46,0x20,0xF3,0xE0,0x0A,0x20,0x33,0xE0,0xC2,0x20}; const u8g_fntpgm_uint8_t fontpage_253_237_237[45] U8G_FONT_SECTION("fontpage_253_237_237") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xc0,0x41,0x00,0x57,0xe0,0xe4, - 0xa0,0x2a,0x80,0x44,0x80,0xef,0xe0,0x01,0x00,0x32,0xc0,0xcc,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xC0,0x41,0x00,0x57,0xE0,0xE4, + 0xA0,0x2A,0x80,0x44,0x80,0xEF,0xE0,0x01,0x00,0x32,0xC0,0xCC,0x20}; const u8g_fntpgm_uint8_t fontpage_253_255_255[45] U8G_FONT_SECTION("fontpage_253_255_255") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x20,0x40,0x43,0xc0,0xf0,0x40,0x2f, - 0xe0,0x41,0x20,0xf5,0x40,0x03,0x80,0x35,0x40,0xc9,0x20,0x03,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x20,0x40,0x43,0xC0,0xF0,0x40,0x2F, + 0xE0,0x41,0x20,0xF5,0x40,0x03,0x80,0x35,0x40,0xC9,0x20,0x03,0x00}; const u8g_fntpgm_uint8_t fontpage_254_150_150[45] U8G_FONT_SECTION("fontpage_254_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x48,0x20,0x5f,0xe0,0xe8, - 0x00,0x2f,0xe0,0x4a,0xa0,0xff,0xe0,0x0a,0xa0,0x3a,0xa0,0xc8,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x48,0x20,0x5F,0xE0,0xE8, + 0x00,0x2F,0xE0,0x4A,0xA0,0xFF,0xE0,0x0A,0xA0,0x3A,0xA0,0xC8,0x60}; const u8g_fntpgm_uint8_t fontpage_254_186_186[45] U8G_FONT_SECTION("fontpage_254_186_186") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x41,0x00,0x7b,0xc0,0xa1,0x40,0x21, - 0x40,0xff,0xe0,0x21,0x00,0xa9,0x00,0xaa,0x80,0xfa,0x40,0x04,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x41,0x00,0x7B,0xC0,0xA1,0x40,0x21, + 0x40,0xFF,0xE0,0x21,0x00,0xA9,0x00,0xAA,0x80,0xFA,0x40,0x04,0x20}; const u8g_fntpgm_uint8_t fontpage_254_209_209[45] U8G_FONT_SECTION("fontpage_254_209_209") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x91,0x40,0xd5,0x40,0xa2, - 0x40,0x92,0x40,0xad,0x40,0xc5,0x40,0x88,0x40,0x80,0x40,0x81,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x80,0x40,0x91,0x40,0xD5,0x40,0xA2, + 0x40,0x92,0x40,0xAD,0x40,0xC5,0x40,0x88,0x40,0x80,0x40,0x81,0xC0}; const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_238_238") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x4a,0x40,0x7f,0xc0,0x04,0x00,0xff, - 0xe0,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x4A,0x40,0x7F,0xC0,0x04,0x00,0xFF, + 0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_242_242") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x49,0x20,0x7f,0xe0,0x04,0x40,0x3f, - 0x80,0x05,0x00,0xff,0xe0,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x49,0x20,0x7F,0xE0,0x04,0x40,0x3F, + 0x80,0x05,0x00,0xFF,0xE0,0x30,0x80,0xDF,0x80,0x10,0x80,0x1F,0x80}; const u8g_fntpgm_uint8_t fontpage_256_133_133[45] U8G_FONT_SECTION("fontpage_256_133_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x3f,0x40,0x04,0x80,0x05,0x00,0xff, - 0xe0,0x08,0x00,0x3f,0x80,0xd0,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x3F,0x40,0x04,0x80,0x05,0x00,0xFF, + 0xE0,0x08,0x00,0x3F,0x80,0xD0,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80}; const u8g_fntpgm_uint8_t fontpage_256_234_234[45] U8G_FONT_SECTION("fontpage_256_234_234") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x40,0xfa,0x80,0x57,0xc0,0x54,0x40,0x74, - 0x40,0x57,0xc0,0x71,0x00,0x5a,0xa0,0xf6,0xa0,0x1a,0x40,0x11,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEA,0xEA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x40,0xFA,0x80,0x57,0xC0,0x54,0x40,0x74, + 0x40,0x57,0xC0,0x71,0x00,0x5A,0xA0,0xF6,0xA0,0x1A,0x40,0x11,0xC0}; const u8g_fntpgm_uint8_t fontpage_257_253_253[45] U8G_FONT_SECTION("fontpage_257_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x49,0x40,0xfd,0x80,0x01,0x20,0x7d, - 0xe0,0x44,0x00,0x7d,0x40,0x45,0x80,0x7d,0x20,0x45,0x20,0x4d,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x49,0x40,0xFD,0x80,0x01,0x20,0x7D, + 0xE0,0x44,0x00,0x7D,0x40,0x45,0x80,0x7D,0x20,0x45,0x20,0x4D,0xE0}; const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, - 0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82, - 0xfe,0x82}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEA,0xEA,0x00,0x0A,0xFF,0x00, + 0x00,0x07,0x0B,0x0B,0x0C,0x02,0xFF,0x20,0xFE,0x82,0x82,0xFE,0x82,0xFE,0x82,0x82, + 0xFE,0x82}; const u8g_fntpgm_uint8_t fontpage_259_243_243[45] U8G_FONT_SECTION("fontpage_259_243_243") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x08,0x00,0x11,0x00,0x20,0x80,0x7f, - 0xc0,0x04,0x00,0x04,0x00,0x3f,0x80,0x04,0x00,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x08,0x00,0x11,0x00,0x20,0x80,0x7F, + 0xC0,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_263_220_220[45] U8G_FONT_SECTION("fontpage_263_220_220") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x01,0xc0,0x7e, - 0x80,0x28,0x80,0x15,0x00,0xff,0xe0,0x15,0x00,0x24,0x80,0xc4,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x11,0x00,0x01,0xC0,0x7E, + 0x80,0x28,0x80,0x15,0x00,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60}; const u8g_fntpgm_uint8_t fontpage_265_221_221[45] U8G_FONT_SECTION("fontpage_265_221_221") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x52,0x00,0x53, - 0xc0,0x55,0x00,0x10,0x80,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x11,0x00,0x52,0x00,0x53, + 0xC0,0x55,0x00,0x10,0x80,0x7F,0xC0,0x4A,0x40,0x4A,0x40,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_269_199_199[45] U8G_FONT_SECTION("fontpage_269_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0x27,0xe0,0xfc,0x20,0xaa, - 0x00,0xaa,0x40,0xfb,0x80,0x22,0x00,0x2a,0x20,0x3a,0x20,0xc9,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0x27,0xE0,0xFC,0x20,0xAA, + 0x00,0xAA,0x40,0xFB,0x80,0x22,0x00,0x2A,0x20,0x3A,0x20,0xC9,0xE0}; const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x40,0x00,0x80,0x00,0x10,0x00,0x2f, - 0xe0,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x40,0x00,0x80,0x00,0x10,0x00,0x2F, + 0xE0,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x20,0x80,0xff,0xe0,0x14,0xa0,0x2c, - 0x80,0x77,0xe0,0xad,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x80,0x20,0x80,0xFF,0xE0,0x14,0xA0,0x2C, + 0x80,0x77,0xE0,0xAD,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x9f,0xe0,0x51,0x00,0x31,0x00,0xd7, - 0xc0,0x12,0x00,0xff,0xe0,0x0c,0x40,0x32,0x80,0xd1,0x00,0x18,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x9F,0xE0,0x51,0x00,0x31,0x00,0xD7, + 0xC0,0x12,0x00,0xFF,0xE0,0x0C,0x40,0x32,0x80,0xD1,0x00,0x18,0xE0}; const u8g_fntpgm_uint8_t fontpage_275_129_129[45] U8G_FONT_SECTION("fontpage_275_129_129") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x0a,0x00,0x7f,0xc0,0x4a,0x40,0x7f, - 0xc0,0x08,0x00,0xff,0xe0,0x11,0x00,0x3a,0x00,0x0f,0x00,0x70,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x0A,0x00,0x7F,0xC0,0x4A,0x40,0x7F, + 0xC0,0x08,0x00,0xFF,0xE0,0x11,0x00,0x3A,0x00,0x0F,0x00,0x70,0xC0}; const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x00,0x22,0x00,0x7f,0xc0,0xa4, - 0x40,0x3f,0xc0,0x24,0x40,0x3f,0xc0,0x24,0x40,0x45,0x40,0x80,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0x00,0x22,0x00,0x7F,0xC0,0xA4, + 0x40,0x3F,0xC0,0x24,0x40,0x3F,0xC0,0x24,0x40,0x45,0x40,0x80,0x80}; const u8g_fntpgm_uint8_t fontpage_279_161_161[45] U8G_FONT_SECTION("fontpage_279_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x01,0x00,0x0f,0xe0,0xe1, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x21,0x00,0x01,0x00,0x0F,0xE0,0xE1, 0x00,0x21,0x00,0x21,0x00,0x29,0x00,0x31,0x00,0x21,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_279_174_174[45] U8G_FONT_SECTION("fontpage_279_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x21,0x40,0x05,0x40,0x04,0x40,0xe4, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x21,0x40,0x05,0x40,0x04,0x40,0xE4, 0x40,0x22,0x80,0x22,0x80,0x29,0x00,0x32,0x80,0x24,0x40,0x08,0x20}; const u8g_fntpgm_uint8_t fontpage_279_190_190[45] U8G_FONT_SECTION("fontpage_279_190_190") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0x24,0x80,0x04,0x80,0x08,0xe0,0xe0, - 0x00,0x2f,0xc0,0x24,0x40,0x22,0x80,0x31,0x00,0x22,0x80,0x1c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0x80,0x24,0x80,0x04,0x80,0x08,0xE0,0xE0, + 0x00,0x2F,0xC0,0x24,0x40,0x22,0x80,0x31,0x00,0x22,0x80,0x1C,0x60}; const u8g_fntpgm_uint8_t fontpage_279_213_213[45] U8G_FONT_SECTION("fontpage_279_213_213") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x40,0x21,0x20,0x1f,0xe0,0x01,0x00,0xef, - 0x00,0x25,0x00,0x25,0x00,0x24,0xa0,0x26,0xa0,0x38,0x60,0x20,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x40,0x21,0x20,0x1F,0xE0,0x01,0x00,0xEF, + 0x00,0x25,0x00,0x25,0x00,0x24,0xA0,0x26,0xA0,0x38,0x60,0x20,0x20}; const u8g_fntpgm_uint8_t fontpage_279_239_239[45] U8G_FONT_SECTION("fontpage_279_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x04,0x40,0x07,0xc0,0xe0, - 0x00,0x27,0xc0,0x21,0x00,0x2f,0xe0,0x32,0x80,0x24,0x40,0x08,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x24,0x40,0x04,0x40,0x07,0xC0,0xE0, + 0x00,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x32,0x80,0x24,0x40,0x08,0x20}; const u8g_fntpgm_uint8_t fontpage_279_247_247[45] U8G_FONT_SECTION("fontpage_279_247_247") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x21,0x00,0x07,0xc0,0xe1, - 0x00,0x2f,0xe0,0x24,0x40,0x27,0xc0,0x24,0x40,0x37,0xc0,0x24,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x21,0x00,0x07,0xC0,0xE1, + 0x00,0x2F,0xE0,0x24,0x40,0x27,0xC0,0x24,0x40,0x37,0xC0,0x24,0x40}; const u8g_fntpgm_uint8_t fontpage_279_251_251[45] U8G_FONT_SECTION("fontpage_279_251_251") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x27,0xc0,0x01,0x00,0xef,0xe0,0x22, - 0xa0,0x25,0x80,0x22,0x80,0x2f,0xe0,0x31,0x80,0x22,0x40,0x0c,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x27,0xC0,0x01,0x00,0xEF,0xE0,0x22, + 0xA0,0x25,0x80,0x22,0x80,0x2F,0xE0,0x31,0x80,0x22,0x40,0x0C,0x20}; const u8g_fntpgm_uint8_t fontpage_280_131_131[45] U8G_FONT_SECTION("fontpage_280_131_131") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x29,0x20,0x0b,0xa0,0xe9,0x20,0x2f, - 0xe0,0x28,0x20,0x2b,0xa0,0x2a,0xa0,0x3b,0xa0,0x28,0x20,0x10,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x29,0x20,0x0B,0xA0,0xE9,0x20,0x2F, + 0xE0,0x28,0x20,0x2B,0xA0,0x2A,0xA0,0x3B,0xA0,0x28,0x20,0x10,0xE0}; const u8g_fntpgm_uint8_t fontpage_282_165_165[45] U8G_FONT_SECTION("fontpage_282_165_165") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x89,0x00,0xa9,0xe0,0xa9,0x40,0xab, - 0x40,0xad,0x40,0xa9,0x40,0x21,0x40,0x50,0x80,0x49,0x40,0x8a,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0x89,0x00,0xA9,0xE0,0xA9,0x40,0xAB, + 0x40,0xAD,0x40,0xA9,0x40,0x21,0x40,0x50,0x80,0x49,0x40,0x8A,0x20}; const u8g_fntpgm_uint8_t fontpage_282_170_170[45] U8G_FONT_SECTION("fontpage_282_170_170") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x35,0x80,0xdf,0x60,0x01, - 0x00,0x3f,0x80,0x24,0x80,0x24,0x80,0x2a,0x80,0x11,0x00,0x60,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x35,0x80,0xDF,0x60,0x01, + 0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x2A,0x80,0x11,0x00,0x60,0xC0}; const u8g_fntpgm_uint8_t fontpage_282_247_247[45] U8G_FONT_SECTION("fontpage_282_247_247") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x13,0xc0,0x7c,0x40,0x10,0x40,0xff, - 0xc0,0x12,0x00,0x52,0x20,0x5e,0x20,0x53,0xe0,0xb0,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x13,0xC0,0x7C,0x40,0x10,0x40,0xFF, + 0xC0,0x12,0x00,0x52,0x20,0x5E,0x20,0x53,0xE0,0xB0,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_283_133_133[45] U8G_FONT_SECTION("fontpage_283_133_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x11,0x40,0x7d,0x40,0x12,0xc0,0xfc, - 0x00,0x13,0xc0,0x5e,0x40,0x52,0x40,0x73,0xc0,0x98,0x00,0x87,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x11,0x40,0x7D,0x40,0x12,0xC0,0xFC, + 0x00,0x13,0xC0,0x5E,0x40,0x52,0x40,0x73,0xC0,0x98,0x00,0x87,0xE0}; const u8g_fntpgm_uint8_t fontpage_283_221_221[45] U8G_FONT_SECTION("fontpage_283_221_221") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xe0,0x4a,0x00,0x4a,0x00,0x7b,0xe0,0x12, - 0x20,0x52,0x20,0x5a,0x20,0x53,0xe0,0x52,0x00,0x5e,0x00,0xe3,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7B,0xE0,0x4A,0x00,0x4A,0x00,0x7B,0xE0,0x12, + 0x20,0x52,0x20,0x5A,0x20,0x53,0xE0,0x52,0x00,0x5E,0x00,0xE3,0xE0}; const u8g_fntpgm_uint8_t fontpage_286_236_236[45] U8G_FONT_SECTION("fontpage_286_236_236") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xec,0xec,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xf7,0xc0,0x41,0x00,0x6f,0xe0,0xa2, - 0x00,0xf7,0xc0,0x20,0x40,0x3a,0x80,0xe1,0x00,0x20,0x80,0x20,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEC,0xEC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xF7,0xC0,0x41,0x00,0x6F,0xE0,0xA2, + 0x00,0xF7,0xC0,0x20,0x40,0x3A,0x80,0xE1,0x00,0x20,0x80,0x20,0x80}; const u8g_fntpgm_uint8_t fontpage_286_239_239[45] U8G_FONT_SECTION("fontpage_286_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x42,0x00,0xfb,0xe0,0x42,0x20,0xa5, - 0x40,0xf9,0x00,0x21,0x00,0x3a,0x80,0xe2,0x80,0x24,0x40,0x28,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x42,0x00,0xFB,0xE0,0x42,0x20,0xA5, + 0x40,0xF9,0x00,0x21,0x00,0x3A,0x80,0xE2,0x80,0x24,0x40,0x28,0x20}; const u8g_fntpgm_uint8_t fontpage_286_244_244[45] U8G_FONT_SECTION("fontpage_286_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xf8,0x80,0x47,0xe0,0x64,0xa0,0xa4, - 0xa0,0xfc,0xa0,0x27,0xe0,0x3c,0xa0,0xe4,0xa0,0x27,0xe0,0x24,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0xF8,0x80,0x47,0xE0,0x64,0xA0,0xA4, + 0xA0,0xFC,0xA0,0x27,0xE0,0x3C,0xA0,0xE4,0xA0,0x27,0xE0,0x24,0x20}; const u8g_fntpgm_uint8_t fontpage_286_253_253[45] U8G_FONT_SECTION("fontpage_286_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x40,0x11,0x20,0xff,0xe0,0x21, - 0x00,0xfd,0x20,0x51,0x40,0x7c,0x80,0x10,0xa0,0xfd,0x60,0x12,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x7D,0x40,0x11,0x20,0xFF,0xE0,0x21, + 0x00,0xFD,0x20,0x51,0x40,0x7C,0x80,0x10,0xA0,0xFD,0x60,0x12,0x20}; const u8g_fntpgm_uint8_t fontpage_287_145_145[45] U8G_FONT_SECTION("fontpage_287_145_145") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0xfa,0x40,0x43,0xc0,0x60,0x00,0xa7, - 0xe0,0xfa,0x40,0x23,0x40,0x3a,0xc0,0xe2,0x60,0x2f,0xc0,0x20,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xC0,0xFA,0x40,0x43,0xC0,0x60,0x00,0xA7, + 0xE0,0xFA,0x40,0x23,0x40,0x3A,0xC0,0xE2,0x60,0x2F,0xC0,0x20,0x40}; const u8g_fntpgm_uint8_t fontpage_287_147_147[45] U8G_FONT_SECTION("fontpage_287_147_147") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x42,0x80,0xf4,0x40,0x4b,0xa0,0xa0, - 0x00,0xfe,0x20,0x2a,0xa0,0x3e,0xa0,0xea,0xa0,0x2e,0xa0,0x2a,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x42,0x80,0xF4,0x40,0x4B,0xA0,0xA0, + 0x00,0xFE,0x20,0x2A,0xA0,0x3E,0xA0,0xEA,0xA0,0x2E,0xA0,0x2A,0x60}; const u8g_fntpgm_uint8_t fontpage_287_185_185[45] U8G_FONT_SECTION("fontpage_287_185_185") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x2f,0xe0,0x01,0x20,0xe1, - 0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0xc0,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x21,0x00,0x2F,0xE0,0x01,0x20,0xE1, + 0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0xC0,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_287_193_193[45] U8G_FONT_SECTION("fontpage_287_193_193") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x21,0x00,0x01,0x00,0xef, - 0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x21,0x00,0x01,0x00,0xEF, + 0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_287_208_209[73] U8G_FONT_SECTION("fontpage_287_208_209") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x20,0x00,0x20,0x00,0x0f,0xe0,0xe2, - 0x00,0x22,0x80,0x24,0x40,0x2f,0xa0,0x24,0x20,0x50,0x00,0x8f,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x24,0x00,0x07,0xe0,0xe4,0x80,0x24,0x80,0x24, - 0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x20,0x00,0x20,0x00,0x0F,0xE0,0xE2, + 0x00,0x22,0x80,0x24,0x40,0x2F,0xA0,0x24,0x20,0x50,0x00,0x8F,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x24,0x00,0x07,0xE0,0xE4,0x80,0x24,0x80,0x24, + 0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xe0,0xe6, - 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xE0,0xE6, + 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_287_216_216[45] U8G_FONT_SECTION("fontpage_287_216_216") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x20,0x80,0x21,0x00,0x01,0x00,0xe3, - 0x40,0x25,0x20,0x29,0x20,0x21,0x00,0x21,0x00,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x20,0x80,0x21,0x00,0x01,0x00,0xE3, + 0x40,0x25,0x20,0x29,0x20,0x21,0x00,0x21,0x00,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_287_219_219[45] U8G_FONT_SECTION("fontpage_287_219_219") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x24,0x80,0x2f,0xc0,0x04,0x80,0xe4, - 0x80,0x3f,0xe0,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x80,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x80,0x24,0x80,0x2F,0xC0,0x04,0x80,0xE4, + 0x80,0x3F,0xE0,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x80,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_287_222_222[45] U8G_FONT_SECTION("fontpage_287_222_222") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x2f,0xe0,0x22,0x00,0x05,0x00,0xef, - 0xc0,0x21,0x00,0x2f,0xe0,0x21,0x00,0x21,0x00,0x51,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x2F,0xE0,0x22,0x00,0x05,0x00,0xEF, + 0xC0,0x21,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x51,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_287_247_247[45] U8G_FONT_SECTION("fontpage_287_247_247") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x29,0x20,0x25,0x40,0x01,0x00,0xef, - 0xe0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x29,0x20,0x25,0x40,0x01,0x00,0xEF, + 0xE0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x8f,0xc0,0x48,0x40,0x4f,0xc0,0x08,0x40,0xcf, - 0xc0,0x48,0x00,0x4b,0x40,0x48,0x80,0x4e,0x40,0xb0,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x8F,0xC0,0x48,0x40,0x4F,0xC0,0x08,0x40,0xCF, + 0xC0,0x48,0x00,0x4B,0x40,0x48,0x80,0x4E,0x40,0xB0,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_137_137[45] U8G_FONT_SECTION("fontpage_288_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x45,0x00,0x25,0x00,0x27,0xc0,0x09,0x00,0xef, - 0xe0,0x22,0x80,0x22,0xa0,0x24,0xa0,0x28,0x60,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x45,0x00,0x25,0x00,0x27,0xC0,0x09,0x00,0xEF, + 0xE0,0x22,0x80,0x22,0xA0,0x24,0xA0,0x28,0x60,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_159_159") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x3f,0xe0,0x21,0x00,0x0f,0xe0,0xe9, - 0x20,0x2f,0xe0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x3F,0xE0,0x21,0x00,0x0F,0xE0,0xE9, + 0x20,0x2F,0xE0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x20,0x45,0x20,0x29,0x40,0xff, - 0x80,0x01,0x40,0x7d,0x20,0x45,0x20,0x45,0xa0,0x7d,0x40,0x45,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xE0,0xFF,0x20,0x45,0x20,0x29,0x40,0xFF, + 0x80,0x01,0x40,0x7D,0x20,0x45,0x20,0x45,0xA0,0x7D,0x40,0x45,0x00}; const u8g_fntpgm_uint8_t fontpage_290_205_205[45] U8G_FONT_SECTION("fontpage_290_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x50,0x20,0x50,0x20,0xf8,0x20,0xab, - 0xe0,0xda,0x00,0x8a,0x00,0xfa,0x00,0x8a,0x20,0xfa,0x20,0x8b,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x50,0x20,0x50,0x20,0xF8,0x20,0xAB, + 0xE0,0xDA,0x00,0x8A,0x00,0xFA,0x00,0x8A,0x20,0xFA,0x20,0x8B,0xE0}; const u8g_fntpgm_uint8_t fontpage_291_202_202[45] U8G_FONT_SECTION("fontpage_291_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xc0,0xe2,0x80,0xa9,0x00,0x72,0x80,0xfd, - 0x60,0x31,0x00,0x6f,0xc0,0xa1,0x00,0xaf,0xe0,0x21,0x00,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0xC0,0xE2,0x80,0xA9,0x00,0x72,0x80,0xFD, + 0x60,0x31,0x00,0x6F,0xC0,0xA1,0x00,0xAF,0xE0,0x21,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x24,0x80,0x3f, - 0x80,0x24,0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x24,0x80,0x3F, + 0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, - 0xe0,0x24,0x80,0x3f,0x80,0x24,0x80,0x7f,0xc0,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, + 0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_297_136_136[45] U8G_FONT_SECTION("fontpage_297_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x40,0x80,0x78,0x80,0x80,0x80,0xfb, - 0xe0,0x20,0x80,0xf8,0x80,0x20,0x80,0x28,0x80,0x30,0x80,0x20,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x80,0x40,0x80,0x78,0x80,0x80,0x80,0xFB, + 0xE0,0x20,0x80,0xF8,0x80,0x20,0x80,0x28,0x80,0x30,0x80,0x20,0x80}; const u8g_fntpgm_uint8_t fontpage_297_174_174[45] U8G_FONT_SECTION("fontpage_297_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x47,0xc0,0x79,0x40,0x81,0x40,0xf9, - 0x40,0x27,0xc0,0xfa,0x40,0x22,0x40,0x2a,0x40,0x32,0x40,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x47,0xC0,0x79,0x40,0x81,0x40,0xF9, + 0x40,0x27,0xC0,0xFA,0x40,0x22,0x40,0x2A,0x40,0x32,0x40,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_298_153_153[45] U8G_FONT_SECTION("fontpage_298_153_153") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x80,0x4f,0xe0,0x72,0x80,0x82,0x80,0xef, - 0xe0,0x40,0x00,0xf7,0xc0,0x44,0x40,0x47,0xc0,0x54,0x40,0x67,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x80,0x4F,0xE0,0x72,0x80,0x82,0x80,0xEF, + 0xE0,0x40,0x00,0xF7,0xC0,0x44,0x40,0x47,0xC0,0x54,0x40,0x67,0xC0}; const u8g_fntpgm_uint8_t fontpage_298_220_220[45] U8G_FONT_SECTION("fontpage_298_220_220") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x4f,0xe0,0x72,0x80,0x8f,0xe0,0xf4, - 0x40,0x27,0xc0,0xf4,0x40,0x27,0xc0,0x2a,0x80,0x32,0xa0,0x2c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x4F,0xE0,0x72,0x80,0x8F,0xE0,0xF4, + 0x40,0x27,0xC0,0xF4,0x40,0x27,0xC0,0x2A,0x80,0x32,0xA0,0x2C,0x60}; const u8g_fntpgm_uint8_t fontpage_298_255_255[45] U8G_FONT_SECTION("fontpage_298_255_255") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x21,0x00,0x22,0x00,0x24,0x00,0x28,0x00,0x30, - 0x00,0xff,0xc0,0x28,0x00,0x24,0x00,0x22,0x00,0x29,0x00,0x30,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x21,0x00,0x22,0x00,0x24,0x00,0x28,0x00,0x30, + 0x00,0xFF,0xC0,0x28,0x00,0x24,0x00,0x22,0x00,0x29,0x00,0x30,0xC0}; const u8g_fntpgm_uint8_t fontpage_299_237_237[45] U8G_FONT_SECTION("fontpage_299_237_237") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xe0,0x20,0x20,0x82,0x20,0x82,0x20,0xbf, - 0xa0,0x86,0x20,0x8a,0x20,0x92,0x20,0xa2,0x20,0x86,0x20,0x80,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xE0,0x20,0x20,0x82,0x20,0x82,0x20,0xBF, + 0xA0,0x86,0x20,0x8A,0x20,0x92,0x20,0xA2,0x20,0x86,0x20,0x80,0xE0}; const u8g_fntpgm_uint8_t fontpage_299_242_242[45] U8G_FONT_SECTION("fontpage_299_242_242") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x20,0x20,0x84,0x20,0x84,0x20,0xbf, - 0xa0,0x84,0x20,0x8e,0x20,0x95,0x20,0xa4,0xa0,0x84,0x20,0x80,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x20,0x20,0x84,0x20,0x84,0x20,0xBF, + 0xA0,0x84,0x20,0x8E,0x20,0x95,0x20,0xA4,0xA0,0x84,0x20,0x80,0xE0}; const u8g_fntpgm_uint8_t fontpage_299_244_244[45] U8G_FONT_SECTION("fontpage_299_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x4f,0xc0,0x20,0x40,0x80,0x40,0x9e,0x40,0x92, - 0x40,0x9e,0x40,0x92,0x40,0x92,0x40,0x9e,0x40,0x80,0x40,0x81,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x4F,0xC0,0x20,0x40,0x80,0x40,0x9E,0x40,0x92, + 0x40,0x9E,0x40,0x92,0x40,0x92,0x40,0x9E,0x40,0x80,0x40,0x81,0xC0}; const u8g_fntpgm_uint8_t fontpage_300_136_136[45] U8G_FONT_SECTION("fontpage_300_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xe0,0x11,0x20,0x82,0xa0,0xbf,0xe0,0x82, - 0x20,0xba,0xa0,0xaa,0xa0,0xb9,0x20,0x81,0x20,0xba,0xa0,0x84,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xE0,0x11,0x20,0x82,0xA0,0xBF,0xE0,0x82, + 0x20,0xBA,0xA0,0xAA,0xA0,0xB9,0x20,0x81,0x20,0xBA,0xA0,0x84,0x60}; const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6, - 0x60,0x91,0x00,0x97,0xe0,0xd5,0x00,0xaf,0xe0,0x81,0x00,0x81,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF2,0x00,0x93,0xE0,0xA6,0x40,0xC1,0x80,0xA6, + 0x60,0x91,0x00,0x97,0xE0,0xD5,0x00,0xAF,0xE0,0x81,0x00,0x81,0x00}; const u8g_fntpgm_uint8_t fontpage_300_208_208[45] U8G_FONT_SECTION("fontpage_300_208_208") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf7,0xc0,0x94,0x40,0xa7,0xc0,0xc4,0x40,0xa7, - 0xc0,0x95,0x00,0x95,0x20,0xd5,0x40,0xa4,0x80,0x85,0x40,0x86,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF7,0xC0,0x94,0x40,0xA7,0xC0,0xC4,0x40,0xA7, + 0xC0,0x95,0x00,0x95,0x20,0xD5,0x40,0xA4,0x80,0x85,0x40,0x86,0x20}; const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1, - 0x00,0x9f,0xe0,0x91,0x00,0xe5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF1,0x00,0x92,0x80,0xA4,0x40,0xCB,0xA0,0xA1, + 0x00,0x9F,0xE0,0x91,0x00,0xE5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; const u8g_fntpgm_uint8_t fontpage_300_233_233[45] U8G_FONT_SECTION("fontpage_300_233_233") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xc8,0x20,0xa7, - 0xc0,0x90,0x00,0x9a,0x40,0xd5,0x40,0xa5,0x40,0x80,0x80,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF1,0x00,0x92,0x80,0xA4,0x40,0xC8,0x20,0xA7, + 0xC0,0x90,0x00,0x9A,0x40,0xD5,0x40,0xA5,0x40,0x80,0x80,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_301_246_246[45] U8G_FONT_SECTION("fontpage_301_246_246") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x95,0x20,0x0e, - 0x00,0x31,0x80,0xc4,0x60,0x3f,0x80,0x01,0x00,0x0e,0x00,0x03,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x95,0x20,0x0E, + 0x00,0x31,0x80,0xC4,0x60,0x3F,0x80,0x01,0x00,0x0E,0x00,0x03,0x00}; const u8g_fntpgm_uint8_t fontpage_302_128_128[45] U8G_FONT_SECTION("fontpage_302_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0xb5,0xa0,0x04, - 0x00,0xff,0xe0,0x08,0x00,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0x4a,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0xB5,0xA0,0x04, + 0x00,0xFF,0xE0,0x08,0x00,0x7F,0xC0,0x4A,0x40,0x4A,0x40,0x4A,0xC0}; const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, - 0x00,0xff,0xe0,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04, + 0x00,0xFF,0xE0,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80}; const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_222_222") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a, - 0x00,0x7b,0xc0,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x0A, + 0x00,0x7B,0xC0,0x0A,0x00,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x0A,0x00}; const u8g_fntpgm_uint8_t fontpage_302_224_224[45] U8G_FONT_SECTION("fontpage_302_224_224") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x3f,0xc0,0x44,0x00,0xff,0xe0,0x20, - 0x80,0x3f,0x80,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0xfb,0xe0,0x0a,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x3F,0xC0,0x44,0x00,0xFF,0xE0,0x20, + 0x80,0x3F,0x80,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0xFB,0xE0,0x0A,0x00}; const u8g_fntpgm_uint8_t fontpage_302_226_226[45] U8G_FONT_SECTION("fontpage_302_226_226") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x08,0x00,0x10,0x00,0xff,0xc0,0x92, - 0x40,0x9e,0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0xff,0xc0,0x80,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x08,0x00,0x10,0x00,0xFF,0xC0,0x92, + 0x40,0x9E,0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0xFF,0xC0,0x80,0x40}; const u8g_fntpgm_uint8_t fontpage_304_245_245[45] U8G_FONT_SECTION("fontpage_304_245_245") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20,0x80,0x24, - 0x80,0x24,0x80,0x24,0x80,0x26,0x80,0x09,0x00,0x10,0xc0,0x60,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF5,0xF5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20,0x80,0x24, + 0x80,0x24,0x80,0x24,0x80,0x26,0x80,0x09,0x00,0x10,0xC0,0x60,0x40}; const u8g_fntpgm_uint8_t fontpage_304_249_249[45] U8G_FONT_SECTION("fontpage_304_249_249") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x27,0xe0,0x24,0x20,0x25, - 0x20,0x25,0x20,0x25,0x20,0x3d,0x20,0xc1,0x80,0x02,0x40,0x0c,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF9,0x00,0x27,0xE0,0x24,0x20,0x25, + 0x20,0x25,0x20,0x25,0x20,0x3D,0x20,0xC1,0x80,0x02,0x40,0x0C,0x20}; const u8g_fntpgm_uint8_t fontpage_305_132_132[45] U8G_FONT_SECTION("fontpage_305_132_132") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x10,0x80,0x63,0xe0,0x22,0x20,0xfa, - 0xa0,0x2a,0xa0,0x22,0xa0,0x22,0xa0,0x22,0xa0,0x21,0x40,0x66,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x10,0x80,0x63,0xE0,0x22,0x20,0xFA, + 0xA0,0x2A,0xA0,0x22,0xA0,0x22,0xA0,0x22,0xA0,0x21,0x40,0x66,0x20}; const u8g_fntpgm_uint8_t fontpage_305_145_145[45] U8G_FONT_SECTION("fontpage_305_145_145") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x13,0xe0,0x50,0x80,0x5f,0xe0,0x52,0x20,0xfe, - 0xa0,0x12,0xa0,0x56,0xa0,0x5a,0xa0,0x92,0xa0,0x21,0x40,0xc6,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x13,0xE0,0x50,0x80,0x5F,0xE0,0x52,0x20,0xFE, + 0xA0,0x12,0xA0,0x56,0xA0,0x5A,0xA0,0x92,0xA0,0x21,0x40,0xC6,0x20}; const u8g_fntpgm_uint8_t fontpage_305_157_157[45] U8G_FONT_SECTION("fontpage_305_157_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xe0,0xfc,0x80,0x87,0xe0,0x7a,0x20,0xca, - 0xa0,0x32,0xa0,0x4a,0xa0,0xfe,0xa0,0x4a,0xa0,0x79,0x40,0x4e,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xE0,0xFC,0x80,0x87,0xE0,0x7A,0x20,0xCA, + 0xA0,0x32,0xA0,0x4A,0xA0,0xFE,0xA0,0x4A,0xA0,0x79,0x40,0x4E,0x20}; const u8g_fntpgm_uint8_t fontpage_305_206_206[45] U8G_FONT_SECTION("fontpage_305_206_206") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xce,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0x80,0x40,0x80,0x42,0x80,0x52,0x80,0x4c, - 0x80,0x44,0x80,0x4c,0x80,0x52,0x80,0x62,0xa0,0x80,0x60,0x80,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0x80,0x40,0x80,0x42,0x80,0x52,0x80,0x4C, + 0x80,0x44,0x80,0x4C,0x80,0x52,0x80,0x62,0xA0,0x80,0x60,0x80,0x20}; const u8g_fntpgm_uint8_t fontpage_306_241_241[45] U8G_FONT_SECTION("fontpage_306_241_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x00,0x47,0xc0,0x7c,0x40,0x97,0x40,0xad, - 0x40,0x25,0x40,0x27,0x40,0x24,0xc0,0x2c,0x20,0x34,0x20,0x23,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x00,0x47,0xC0,0x7C,0x40,0x97,0x40,0xAD, + 0x40,0x25,0x40,0x27,0x40,0x24,0xC0,0x2C,0x20,0x34,0x20,0x23,0xE0}; const u8g_fntpgm_uint8_t fontpage_308_236_236[45] U8G_FONT_SECTION("fontpage_308_236_236") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xec,0xec,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0x80,0x00,0x80,0x10,0x80,0x11,0x00,0x21, - 0x00,0x3f,0xe0,0x00,0x20,0x00,0x20,0xff,0x20,0x00,0x20,0x00,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEC,0xEC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0x80,0x00,0x80,0x10,0x80,0x11,0x00,0x21, + 0x00,0x3F,0xE0,0x00,0x20,0x00,0x20,0xFF,0x20,0x00,0x20,0x00,0xC0}; const u8g_fntpgm_uint8_t fontpage_308_241_241[45] U8G_FONT_SECTION("fontpage_308_241_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf3,0xe0,0x12,0x00,0x52,0x20,0x53,0x20,0x52, - 0xa0,0x7a,0x40,0x0a,0x40,0xea,0xa0,0x0b,0x20,0x0a,0x00,0x33,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF3,0xE0,0x12,0x00,0x52,0x20,0x53,0x20,0x52, + 0xA0,0x7A,0x40,0x0A,0x40,0xEA,0xA0,0x0B,0x20,0x0A,0x00,0x33,0xE0}; const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x1f,0x00,0x11, - 0x00,0x7f,0xc0,0x40,0x40,0x5f,0x40,0x51,0x40,0x5f,0x40,0x40,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x1F,0x00,0x11, + 0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0}; const u8g_fntpgm_uint8_t fontpage_317_196_196[45] U8G_FONT_SECTION("fontpage_317_196_196") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7f,0xc0,0x11,0x00,0xff,0xe0,0x04, - 0x00,0x3f,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80,0x60,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x04, + 0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x60,0xC0}; const u8g_fntpgm_uint8_t fontpage_317_222_222[45] U8G_FONT_SECTION("fontpage_317_222_222") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf8,0x80,0xa8,0x80,0xf8,0xe0,0xa8,0x80,0xf8, - 0x80,0x23,0xe0,0xfa,0x20,0x22,0x20,0xfa,0x20,0x52,0x20,0xab,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF8,0x80,0xA8,0x80,0xF8,0xE0,0xA8,0x80,0xF8, + 0x80,0x23,0xE0,0xFA,0x20,0x22,0x20,0xFA,0x20,0x52,0x20,0xAB,0xE0}; const u8g_fntpgm_uint8_t fontpage_318_208_208[45] U8G_FONT_SECTION("fontpage_318_208_208") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x10,0x80,0x09,0x00,0x06, - 0x00,0x19,0x80,0xe0,0x60,0x09,0x00,0x09,0x00,0x11,0x00,0x61,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x10,0x80,0x09,0x00,0x06, + 0x00,0x19,0x80,0xE0,0x60,0x09,0x00,0x09,0x00,0x11,0x00,0x61,0x00}; const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x08,0x00,0x00, - 0x00,0x02,0x07,0x07,0x0c,0x06,0x01,0xc0,0xc0,0x00,0x00,0x00,0xc0,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x08,0x00,0x00, + 0x00,0x02,0x07,0x07,0x0C,0x06,0x01,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h index 20f5acda52..8eee544ec8 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h @@ -6,1216 +6,1216 @@ #include const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xF8}; const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, - 0x00,0x0b,0x02,0x04,0x0c,0x00,0x04,0x00,0x40,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, + 0x00,0x0B,0x02,0x04,0x0C,0x00,0x04,0x00,0x40,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x8b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, - 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x0b,0x0b,0x16,0x0c,0x00, - 0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x04,0x00,0x04, - 0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0xFF,0xE0,0x04, 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, 0x00}; const u8g_fntpgm_uint8_t fontpage_156_141_141[45] U8G_FONT_SECTION("fontpage_156_141_141") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x02,0x00,0x02,0x00,0x04,0x00,0x0d, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x02,0x00,0x02,0x00,0x04,0x00,0x0D, 0x00,0x14,0x80,0x24,0x40,0x44,0x20,0x84,0x00,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_156_166_166[45] U8G_FONT_SECTION("fontpage_156_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0xff,0xe0,0x0a,0x00,0x4a, - 0x40,0x4a,0x40,0x2a,0x40,0x2a,0x80,0x0a,0x00,0x0a,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x4A, + 0x40,0x4A,0x40,0x2A,0x40,0x2A,0x80,0x0A,0x00,0x0A,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0x88, - 0x80,0x88,0x80,0xff,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0x80,0x88,0x80,0x88, + 0x80,0x88,0x80,0xFF,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_156_187_187[45] U8G_FONT_SECTION("fontpage_156_187_187") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04, - 0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04, + 0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0x7f,0xc0,0x00,0x80,0x01, - 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0x7F,0xC0,0x00,0x80,0x01, + 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xE0}; const u8g_fntpgm_uint8_t fontpage_157_164_164[45] U8G_FONT_SECTION("fontpage_157_164_164") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20, - 0x80,0x51,0x40,0x11,0x00,0x0a,0x00,0x04,0x00,0x1b,0x00,0x60,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20, + 0x80,0x51,0x40,0x11,0x00,0x0A,0x00,0x04,0x00,0x1B,0x00,0x60,0xE0}; const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x11,0x00,0x1f,0x00,0x00, - 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x00,0x21,0x20,0xc0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x11,0x00,0x1F,0x00,0x00, + 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x00,0x21,0x20,0xC0,0xE0}; const u8g_fntpgm_uint8_t fontpage_157_228_228[45] U8G_FONT_SECTION("fontpage_157_228_228") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x0a,0x00,0x11,0x00,0x24, - 0x80,0xc2,0x60,0x3f,0x80,0x01,0x00,0x0a,0x00,0x04,0x00,0x02,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x24, + 0x80,0xC2,0x60,0x3F,0x80,0x01,0x00,0x0A,0x00,0x04,0x00,0x02,0x00}; const u8g_fntpgm_uint8_t fontpage_157_246_246[45] U8G_FONT_SECTION("fontpage_157_246_246") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x15,0x00,0x25,0x00,0x2f,0xc0,0x71, - 0x00,0xa1,0x00,0x2f,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x15,0x00,0x25,0x00,0x2F,0xC0,0x71, + 0x00,0xA1,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, - 0x20,0xa7,0xc0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, + 0x20,0xA7,0xC0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xC0}; const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_145_145") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x21,0x00,0x3f,0xe0,0x61, - 0x00,0xa3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x21,0x00,0x3F,0xE0,0x61, + 0x00,0xA3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xce,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x20,0x00,0x2f,0xe0,0x60, - 0x00,0xa4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x10,0xc0,0x1f,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xaf,0xe0,0x29, - 0x00,0x29,0x20,0x2a,0xa0,0x2d,0x60,0x28,0xa0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x11,0x00,0x20,0x00,0x2F,0xE0,0x60, + 0x00,0xA4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2F,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x10,0xC0,0x1F,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xAF,0xE0,0x29, + 0x00,0x29,0x20,0x2A,0xA0,0x2D,0x60,0x28,0xA0}; const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x14,0x00,0x27,0xe0,0x2a,0x00,0x72, - 0x00,0xa3,0xc0,0x22,0x00,0x22,0x00,0x23,0xe0,0x22,0x00,0x22,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x00,0x14,0x00,0x27,0xE0,0x2A,0x00,0x72, + 0x00,0xA3,0xC0,0x22,0x00,0x22,0x00,0x23,0xE0,0x22,0x00,0x22,0x00}; const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x80,0x14,0x80,0x24,0x80,0x2f,0xe0,0x64, - 0x80,0xa4,0x80,0x3f,0xe0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x80,0x14,0x80,0x24,0x80,0x2F,0xE0,0x64, + 0x80,0xA4,0x80,0x3F,0xE0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x14,0x40,0x24,0x40,0x27,0xc0,0x61, - 0x00,0xaf,0xe0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x14,0x40,0x24,0x40,0x27,0xC0,0x61, + 0x00,0xAF,0xE0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x2f,0xe0,0x20,0x00,0x67, - 0xc0,0xa0,0x00,0x27,0xc0,0x20,0x00,0x27,0xc0,0x24,0x40,0x27,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x11,0x00,0x2F,0xE0,0x20,0x00,0x67, + 0xC0,0xA0,0x00,0x27,0xC0,0x20,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0}; const u8g_fntpgm_uint8_t fontpage_160_139_139[45] U8G_FONT_SECTION("fontpage_160_139_139") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x29,0x20,0x29,0x20,0x2f,0xe0,0x69, - 0x20,0xab,0xa0,0x2a,0xa0,0x2b,0xa0,0x28,0x20,0x2f,0xe0,0x28,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x29,0x20,0x29,0x20,0x2F,0xE0,0x69, + 0x20,0xAB,0xA0,0x2A,0xA0,0x2B,0xA0,0x28,0x20,0x2F,0xE0,0x28,0x20}; const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x22,0x00,0x27,0xc0,0x64, - 0x40,0xa7,0xc0,0x24,0x40,0x27,0x40,0x25,0xc0,0x24,0x40,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x1F,0xE0,0x22,0x00,0x27,0xC0,0x64, + 0x40,0xA7,0xC0,0x24,0x40,0x27,0x40,0x25,0xC0,0x24,0x40,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x28,0x20,0x2f,0xe0,0x68, - 0x00,0xaf,0xe0,0x2a,0xa0,0x2f,0xe0,0x2a,0xa0,0x3a,0xa0,0x28,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x28,0x20,0x2F,0xE0,0x68, + 0x00,0xAF,0xE0,0x2A,0xA0,0x2F,0xE0,0x2A,0xA0,0x3A,0xA0,0x28,0x60}; const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_220_220") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x20,0x00,0x4f,0xc0,0x48, - 0x40,0xdf,0xe0,0x50,0x20,0x4f,0xc0,0x41,0x00,0x41,0x00,0x47,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x3F,0xE0,0x20,0x00,0x4F,0xC0,0x48, + 0x40,0xDF,0xE0,0x50,0x20,0x4F,0xC0,0x41,0x00,0x41,0x00,0x47,0x00}; const u8g_fntpgm_uint8_t fontpage_160_245_245[45] U8G_FONT_SECTION("fontpage_160_245_245") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xe0,0x22,0x00,0x2f,0xc0,0x68, - 0x40,0xaf,0xc0,0x28,0x40,0x2f,0xc0,0x28,0x40,0x2f,0xc0,0x38,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF5,0xF5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xE0,0x22,0x00,0x2F,0xC0,0x68, + 0x40,0xAF,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x38,0x60}; const u8g_fntpgm_uint8_t fontpage_161_153_153[45] U8G_FONT_SECTION("fontpage_161_153_153") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x2f,0xc0,0x24,0x80,0x3f,0xe0,0x64, - 0x00,0xaf,0xe0,0x29,0x20,0x3f,0xe0,0x29,0x20,0x2f,0xe0,0x29,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x2F,0xC0,0x24,0x80,0x3F,0xE0,0x64, + 0x00,0xAF,0xE0,0x29,0x20,0x3F,0xE0,0x29,0x20,0x2F,0xE0,0x29,0x20}; const u8g_fntpgm_uint8_t fontpage_161_179_179[45] U8G_FONT_SECTION("fontpage_161_179_179") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb3,0xb3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x2a,0x40,0x2f,0xc0,0x6a, - 0x40,0xbf,0xc0,0x22,0x80,0x3f,0xe0,0x28,0x80,0x24,0x80,0x21,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB3,0xB3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x3F,0xE0,0x2A,0x40,0x2F,0xC0,0x6A, + 0x40,0xBF,0xC0,0x22,0x80,0x3F,0xE0,0x28,0x80,0x24,0x80,0x21,0x80}; const u8g_fntpgm_uint8_t fontpage_161_190_190[45] U8G_FONT_SECTION("fontpage_161_190_190") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x13,0xe0,0x10,0x80,0x2b,0xe0,0x2a,0x20,0x6f, - 0xe0,0xaa,0x20,0x2b,0xe0,0x2e,0x20,0x2b,0xe0,0x31,0x40,0x26,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x13,0xE0,0x10,0x80,0x2B,0xE0,0x2A,0x20,0x6F, + 0xE0,0xAA,0x20,0x2B,0xE0,0x2E,0x20,0x2B,0xE0,0x31,0x40,0x26,0x20}; const u8g_fntpgm_uint8_t fontpage_162_178_178[45] U8G_FONT_SECTION("fontpage_162_178_178") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x28,0x80,0x3d,0xe0,0x40,0xa0,0x5d,0xe0,0xc0, - 0x80,0x5d,0xe0,0x43,0x20,0x5d,0xe0,0x55,0x20,0x5d,0xe0,0x55,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x28,0x80,0x3D,0xE0,0x40,0xA0,0x5D,0xE0,0xC0, + 0x80,0x5D,0xE0,0x43,0x20,0x5D,0xE0,0x55,0x20,0x5D,0xE0,0x55,0x20}; const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0xff,0xc0,0x08,0x00,0x11,0x00,0x7f, - 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xc1,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0xFF,0xC0,0x08,0x00,0x11,0x00,0x7F, + 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xC1,0xC0}; const u8g_fntpgm_uint8_t fontpage_162_200_201[73] U8G_FONT_SECTION("fontpage_162_200_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x84, - 0x00,0xff,0xe0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x04,0x00,0xff,0xe0,0x12,0x00,0x12, - 0x00,0x12,0x20,0x12,0x20,0x22,0x20,0xc1,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x84, + 0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x24,0x80,0x04,0x00,0xFF,0xE0,0x12,0x00,0x12, + 0x00,0x12,0x20,0x12,0x20,0x22,0x20,0xC1,0xE0}; const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0a, - 0x00,0x0a,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0A, + 0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, - 0x60,0x04,0x00,0x04,0x00,0x1f,0x00,0x04,0x00,0x04,0x00,0x7f,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, + 0x60,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0}; const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_241_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, - 0x00,0x11,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_247_247") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f, - 0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0,0x11,0x00,0xe0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F, + 0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0,0x11,0x00,0xE0,0xE0}; const u8g_fntpgm_uint8_t fontpage_163_151_151[43] U8G_FONT_SECTION("fontpage_163_151_151") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x09,0xff,0x00, - 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x11,0x00,0x11, - 0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x41,0x20,0x80,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x09,0xFF,0x00, + 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x11,0x00,0x11, + 0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x41,0x20,0x80,0xE0}; const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, - 0x60,0x41,0x00,0x4f,0xc0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, + 0x60,0x41,0x00,0x4F,0xC0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x89,0x00,0x4f,0xe0,0x59,0x00,0x09, - 0x00,0x2f,0xc0,0x29,0x00,0xcf,0xc0,0x49,0x00,0x49,0x00,0x4f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x89,0x00,0x4F,0xE0,0x59,0x00,0x09, + 0x00,0x2F,0xC0,0x29,0x00,0xCF,0xC0,0x49,0x00,0x49,0x00,0x4F,0xE0}; const u8g_fntpgm_uint8_t fontpage_163_250_250[45] U8G_FONT_SECTION("fontpage_163_250_250") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f, - 0xc0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7F, + 0xC0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_164_134_134[45] U8G_FONT_SECTION("fontpage_164_134_134") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, - 0x40,0xbf,0xa0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xc3,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, + 0x40,0xBF,0xA0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xC3,0x00}; const u8g_fntpgm_uint8_t fontpage_164_151_151[45] U8G_FONT_SECTION("fontpage_164_151_151") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x20,0x10,0x20,0x11,0x20,0x3d,0x20,0x25, - 0x20,0x65,0x20,0x99,0x20,0x09,0x20,0x10,0x20,0x20,0x20,0xc0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7E,0x20,0x10,0x20,0x11,0x20,0x3D,0x20,0x25, + 0x20,0x65,0x20,0x99,0x20,0x09,0x20,0x10,0x20,0x20,0x20,0xC0,0xE0}; const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_157_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x27,0xe0,0xf9,0x20,0x11,0x20,0x21, - 0x20,0x69,0x20,0xb1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x27,0xE0,0xF9,0x20,0x11,0x20,0x21, + 0x20,0x69,0x20,0xB1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xC0}; const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfe,0x20,0x10,0x20,0x20,0xa0,0x44,0xa0,0xfe, - 0xa0,0x10,0xa0,0x7c,0xa0,0x10,0xa0,0x10,0x20,0x1e,0x20,0xe0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFE,0x20,0x10,0x20,0x20,0xA0,0x44,0xA0,0xFE, + 0xA0,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x10,0x20,0x1E,0x20,0xE0,0xE0}; const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x50,0xa0,0x7e,0xa0,0x90,0xa0,0xfe, - 0xa0,0x10,0xa0,0x7e,0xa0,0x52,0xa0,0x52,0x20,0x56,0x20,0x10,0xe0,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x7e,0x20,0x42,0x20,0x7e,0xa0,0x48,0xa0,0x48,0xa0,0x7e,0xa0,0x6a, - 0xa0,0xaa,0xa0,0xaa,0xa0,0x2e,0x20,0x08,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x50,0xA0,0x7E,0xA0,0x90,0xA0,0xFE, + 0xA0,0x10,0xA0,0x7E,0xA0,0x52,0xA0,0x52,0x20,0x56,0x20,0x10,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x7E,0x20,0x42,0x20,0x7E,0xA0,0x48,0xA0,0x48,0xA0,0x7E,0xA0,0x6A, + 0xA0,0xAA,0xA0,0xAA,0xA0,0x2E,0x20,0x08,0xE0}; const u8g_fntpgm_uint8_t fontpage_164_245_245[45] U8G_FONT_SECTION("fontpage_164_245_245") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x28,0x20,0x54,0xa0,0xfe,0xa0,0x44, - 0xa0,0x7c,0xa0,0x44,0xa0,0x7c,0xa0,0xc4,0x20,0x44,0x20,0x7c,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF5,0xF5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x28,0x20,0x54,0xA0,0xFE,0xA0,0x44, + 0xA0,0x7C,0xA0,0x44,0xA0,0x7C,0xA0,0xC4,0x20,0x44,0x20,0x7C,0xE0}; const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x08,0x00,0xff,0x80,0x08, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0x08,0x00,0xFF,0x80,0x08, 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; const u8g_fntpgm_uint8_t fontpage_165_160_160[45] U8G_FONT_SECTION("fontpage_165_160_160") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x20,0x00,0xfd,0xe0,0x25,0x20,0x25, - 0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0x20,0x55,0xe0,0x89,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x20,0x00,0xFD,0xE0,0x25,0x20,0x25, + 0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0x20,0x55,0xE0,0x89,0x20}; const u8g_fntpgm_uint8_t fontpage_165_213_213[45] U8G_FONT_SECTION("fontpage_165_213_213") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x78,0x80,0x10,0x80,0xfe,0x80,0x55,0xe0,0x7c, - 0xa0,0x54,0xa0,0x7c,0xa0,0x10,0xa0,0x7d,0x20,0x11,0x20,0xfe,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x78,0x80,0x10,0x80,0xFE,0x80,0x55,0xE0,0x7C, + 0xA0,0x54,0xA0,0x7C,0xA0,0x10,0xA0,0x7D,0x20,0x11,0x20,0xFE,0x60}; const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, - 0x00,0xa2,0x00,0x26,0x00,0x2a,0x00,0x22,0x20,0x22,0x20,0x21,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, + 0x00,0xA2,0x00,0x26,0x00,0x2A,0x00,0x22,0x20,0x22,0x20,0x21,0xE0}; const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7f, - 0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7F, + 0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_166_212_212[45] U8G_FONT_SECTION("fontpage_166_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x27,0xc0,0x22,0x40,0xfa,0x40,0x24, - 0x80,0x24,0x80,0x3f,0xe0,0x2a,0xa0,0x2a,0xa0,0x33,0x20,0x24,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x27,0xC0,0x22,0x40,0xFA,0x40,0x24, + 0x80,0x24,0x80,0x3F,0xE0,0x2A,0xA0,0x2A,0xA0,0x33,0x20,0x24,0x40}; const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x0f,0x80,0x08,0x00,0x08,0x00,0xff, - 0xe0,0x08,0x00,0x0a,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x0F,0x80,0x08,0x00,0x08,0x00,0xFF, + 0xE0,0x08,0x00,0x0A,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_166_240_240[45] U8G_FONT_SECTION("fontpage_166_240_240") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0xe7,0xc0,0x84,0x40,0x84,0x40,0xf4, - 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xe5,0x80,0x84,0x00,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x10,0x00,0xE7,0xC0,0x84,0x40,0x84,0x40,0xF4, + 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xE5,0x80,0x84,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7d,0xe0,0x91,0x20,0x11,0x20,0xff, - 0x20,0x11,0x20,0x5d,0x20,0x51,0x20,0x51,0xa0,0x5d,0x40,0xe1,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x7D,0xE0,0x91,0x20,0x11,0x20,0xFF, + 0x20,0x11,0x20,0x5D,0x20,0x51,0x20,0x51,0xA0,0x5D,0x40,0xE1,0x00}; const u8g_fntpgm_uint8_t fontpage_166_251_251[45] U8G_FONT_SECTION("fontpage_166_251_251") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x28,0x00,0x25,0xe0,0x53,0x20,0x99,0x20,0x25, - 0x20,0x43,0x20,0xbd,0x20,0x25,0xa0,0x25,0x40,0x3d,0x00,0x25,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x28,0x00,0x25,0xE0,0x53,0x20,0x99,0x20,0x25, + 0x20,0x43,0x20,0xBD,0x20,0x25,0xA0,0x25,0x40,0x3D,0x00,0x25,0x00}; const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x00,0x2f,0xc0,0x28,0x40,0x2f, - 0xc0,0x28,0x40,0x2f,0xc0,0x22,0x00,0x2a,0x80,0x52,0x60,0xa6,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x22,0x00,0x2F,0xC0,0x28,0x40,0x2F, + 0xC0,0x28,0x40,0x2F,0xC0,0x22,0x00,0x2A,0x80,0x52,0x60,0xA6,0x20}; const u8g_fntpgm_uint8_t fontpage_167_205_205[45] U8G_FONT_SECTION("fontpage_167_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x20,0x00,0x3f, - 0xc0,0x28,0x80,0x25,0x00,0x22,0x00,0x45,0x00,0x48,0x80,0xb0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x20,0x00,0x3F, + 0xC0,0x28,0x80,0x25,0x00,0x22,0x00,0x45,0x00,0x48,0x80,0xB0,0x60}; const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfc,0x00,0x4b,0xe0,0x4a,0x20,0x7a,0x20,0x49, - 0x40,0x79,0x40,0x48,0x80,0x4c,0x80,0xf9,0x40,0x0a,0x40,0x0c,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD6,0xD6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFC,0x00,0x4B,0xE0,0x4A,0x20,0x7A,0x20,0x49, + 0x40,0x79,0x40,0x48,0x80,0x4C,0x80,0xF9,0x40,0x0A,0x40,0x0C,0x20}; const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xff, - 0x80,0x00,0x80,0x7f,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7f,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xFF, + 0x80,0x00,0x80,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00}; const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, - 0x60,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x20,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, + 0x60,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80}; const u8g_fntpgm_uint8_t fontpage_168_166_166[45] U8G_FONT_SECTION("fontpage_168_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x0d,0x80,0x34,0x40,0xc4, - 0x20,0x04,0x00,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0,0x20,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x0D,0x80,0x34,0x40,0xC4, + 0x20,0x04,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40}; const u8g_fntpgm_uint8_t fontpage_168_202_202[45] U8G_FONT_SECTION("fontpage_168_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, - 0x00,0xff,0xe0,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04, + 0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80}; const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0xee,0xe0,0x00, - 0x00,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7a,0x40,0x4a,0xc0,0x02,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0xEE,0xE0,0x00, + 0x00,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7A,0x40,0x4A,0xC0,0x02,0x00}; const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0c,0x00,0x70,0x00,0x11,0xe0,0xfd,0x20,0x11, - 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xe0,0x10,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0C,0x00,0x70,0x00,0x11,0xE0,0xFD,0x20,0x11, + 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xE0,0x10,0x00}; const u8g_fntpgm_uint8_t fontpage_170_223_223[45] U8G_FONT_SECTION("fontpage_170_223_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x00,0x45,0xe0,0x7d,0x40,0x43, - 0x40,0x5d,0x40,0x55,0x40,0x54,0x80,0x94,0x80,0x9d,0x40,0x82,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x7D,0x00,0x45,0xE0,0x7D,0x40,0x43, + 0x40,0x5D,0x40,0x55,0x40,0x54,0x80,0x94,0x80,0x9D,0x40,0x82,0x20}; const u8g_fntpgm_uint8_t fontpage_171_174_174[45] U8G_FONT_SECTION("fontpage_171_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xf3,0xc0,0x92,0x40,0x92,0x40,0xff,0xc0,0x44, - 0x80,0x7f,0x80,0x44,0x80,0x7f,0x80,0x04,0x00,0xff,0xc0,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xF3,0xC0,0x92,0x40,0x92,0x40,0xFF,0xC0,0x44, + 0x80,0x7F,0x80,0x44,0x80,0x7F,0x80,0x04,0x00,0xFF,0xC0,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_180_180") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0xa0,0xeb,0xc0,0xaa,0xa0,0xbf,0xe0,0xa4, - 0x80,0xaf,0xe0,0xf9,0x20,0x0f,0xe0,0x09,0x20,0x0f,0xe0,0x11,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0xA0,0xEB,0xC0,0xAA,0xA0,0xBF,0xE0,0xA4, + 0x80,0xAF,0xE0,0xF9,0x20,0x0F,0xE0,0x09,0x20,0x0F,0xE0,0x11,0x20}; const u8g_fntpgm_uint8_t fontpage_172_232_232[45] U8G_FONT_SECTION("fontpage_172_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7b,0xc0,0x04, - 0x80,0xff,0xe0,0x11,0x00,0xfb,0xe0,0x4a,0x40,0x4a,0x40,0x7b,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x04, + 0x80,0xFF,0xE0,0x11,0x00,0xFB,0xE0,0x4A,0x40,0x4A,0x40,0x7B,0xC0}; const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, - 0x40,0xa7,0xc0,0xe4,0x40,0x07,0xc0,0x04,0x40,0x07,0xc0,0x0c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xEF,0xE0,0xA5,0x40,0xAF,0xE0,0xA4, + 0x40,0xA7,0xC0,0xE4,0x40,0x07,0xC0,0x04,0x40,0x07,0xC0,0x0C,0x60}; const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, - 0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0x80,0x40,0xff,0xc0,0x80,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x80,0x40,0x80,0x40,0x9E,0x40,0x92, + 0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0x80,0x40,0xFF,0xC0,0x80,0x40}; const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_224_224") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x84,0x20,0x84,0x20,0xbf,0xa0,0x84, - 0x20,0x84,0x20,0x8a,0x20,0x91,0x20,0xa0,0xa0,0x80,0x20,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x84,0x20,0x84,0x20,0xBF,0xA0,0x84, + 0x20,0x84,0x20,0x8A,0x20,0x91,0x20,0xA0,0xA0,0x80,0x20,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_173_250_250[45] U8G_FONT_SECTION("fontpage_173_250_250") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x88,0x40,0x88,0x40,0xff,0x40,0x88, - 0x40,0xbe,0x40,0xa2,0x40,0xa2,0x40,0xbe,0x40,0x80,0x40,0xff,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x88,0x40,0x88,0x40,0xFF,0x40,0x88, + 0x40,0xBE,0x40,0xA2,0x40,0xA2,0x40,0xBE,0x40,0x80,0x40,0xFF,0xC0}; const u8g_fntpgm_uint8_t fontpage_174_150_150[45] U8G_FONT_SECTION("fontpage_174_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x91,0x20,0x9f,0x20,0x84,0x20,0xff, - 0xe0,0xaa,0xa0,0xae,0xa0,0xa0,0xa0,0xbf,0xa0,0x80,0x20,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x91,0x20,0x9F,0x20,0x84,0x20,0xFF, + 0xE0,0xAA,0xA0,0xAE,0xA0,0xA0,0xA0,0xBF,0xA0,0x80,0x20,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0xc0,0x10,0x00,0x22, - 0x00,0x62,0x00,0xaf,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3f,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0xC0,0x10,0x00,0x22, + 0x00,0x62,0x00,0xAF,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3F,0xC0}; const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_139_139") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x40,0x29,0x40,0x29,0x40,0xff,0x40,0x29, - 0x40,0x28,0x40,0x4c,0xc0,0x04,0x00,0x3f,0x80,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7E,0x40,0x29,0x40,0x29,0x40,0xFF,0x40,0x29, + 0x40,0x28,0x40,0x4C,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_175_247_247[45] U8G_FONT_SECTION("fontpage_175_247_247") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xf9,0x00,0x27,0xc0,0xf9,0x40,0x55, - 0x40,0xfb,0x40,0x21,0x40,0xf9,0xc0,0x22,0x40,0x24,0x20,0x28,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xF9,0x00,0x27,0xC0,0xF9,0x40,0x55, + 0x40,0xFB,0x40,0x21,0x40,0xF9,0xC0,0x22,0x40,0x24,0x20,0x28,0x20}; const u8g_fntpgm_uint8_t fontpage_176_202_202[45] U8G_FONT_SECTION("fontpage_176_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0x29,0x20,0xff,0xe0,0x29, - 0x20,0x2f,0xe0,0x21,0x40,0x33,0xa0,0xe5,0xe0,0x09,0x20,0x10,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x2F,0xE0,0x29,0x20,0xFF,0xE0,0x29, + 0x20,0x2F,0xE0,0x21,0x40,0x33,0xA0,0xE5,0xE0,0x09,0x20,0x10,0xE0}; const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x21,0x00,0xf7,0xc0,0x24, - 0x40,0x27,0x40,0x25,0xc0,0x34,0x40,0xef,0xe0,0x02,0x80,0x0c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x21,0x00,0xF7,0xC0,0x24, + 0x40,0x27,0x40,0x25,0xC0,0x34,0x40,0xEF,0xE0,0x02,0x80,0x0C,0x60}; const u8g_fntpgm_uint8_t fontpage_177_138_138[45] U8G_FONT_SECTION("fontpage_177_138_138") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x23,0xc0,0xf9,0x40,0x51,0x40,0xfb, - 0x40,0x22,0xc0,0xfc,0x20,0x24,0x20,0x7f,0xc0,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0x23,0xC0,0xF9,0x40,0x51,0x40,0xFB, + 0x40,0x22,0xC0,0xFC,0x20,0x24,0x20,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x3d,0x00,0x25,0x00,0x45, - 0x80,0xa5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x3D,0x00,0x25,0x00,0x45, + 0x80,0xA5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x1f,0x00,0x21,0x00,0x52,0x00,0x0c, - 0x00,0x34,0x00,0xcf,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xf8,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x1F,0x00,0x21,0x00,0x52,0x00,0x0C, + 0x00,0x34,0x00,0xCF,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xF8,0x00}; const u8g_fntpgm_uint8_t fontpage_178_160_160[45] U8G_FONT_SECTION("fontpage_178_160_160") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x79,0xe0,0x8a,0x20,0x50,0x20,0x23, - 0xa0,0xfa,0xa0,0x2a,0xa0,0xcb,0xa0,0x28,0x20,0x11,0x20,0xe0,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x79,0xE0,0x8A,0x20,0x50,0x20,0x23, + 0xA0,0xFA,0xA0,0x2A,0xA0,0xCB,0xA0,0x28,0x20,0x11,0x20,0xE0,0xC0}; const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_167_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, - 0x00,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04, + 0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xaa,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, - 0xe0,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x0a, - 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xc4,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xAA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, + 0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A, + 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xC4,0x60}; const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_177_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, - 0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x2a,0x20,0x2f, - 0xe0,0x48,0x00,0x53,0xe0,0x32,0x20,0x2a,0x20,0x4b,0xe0,0x82,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0xFA,0x40,0x2A,0x20,0x2F, + 0xE0,0x48,0x00,0x53,0xE0,0x32,0x20,0x2A,0x20,0x4B,0xE0,0x82,0x20}; const u8g_fntpgm_uint8_t fontpage_181_146_146[45] U8G_FONT_SECTION("fontpage_181_146_146") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x40,0x2f,0xe0,0x24,0x40,0xf7,0xc0,0x54, - 0x40,0x57,0xc0,0x51,0x00,0x2f,0xe0,0x33,0x80,0x4d,0x40,0x89,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x40,0x2F,0xE0,0x24,0x40,0xF7,0xC0,0x54, + 0x40,0x57,0xC0,0x51,0x00,0x2F,0xE0,0x33,0x80,0x4D,0x40,0x89,0x20}; const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_208_208") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, - 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0xc0,0x20, - 0x80,0x61,0x00,0xbf,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0xC0,0x20, + 0x80,0x61,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x88,0x40,0x08, - 0x00,0xff,0xe0,0x11,0x00,0x31,0x00,0x0e,0x00,0x09,0x80,0x70,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x88,0x40,0x08, + 0x00,0xFF,0xE0,0x11,0x00,0x31,0x00,0x0E,0x00,0x09,0x80,0x70,0x60}; const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x00, - 0x00,0x7f,0xe0,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x00, + 0x00,0x7F,0xE0,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xE0}; const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x80,0x40,0x3f, - 0xc0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x80,0x40,0x3F, + 0xC0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x90,0x40,0x3f,0x00,0x52, - 0x00,0x8c,0x00,0x33,0x00,0xff,0xc0,0x21,0x00,0x21,0x00,0x3f,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x90,0x40,0x3F,0x00,0x52, + 0x00,0x8C,0x00,0x33,0x00,0xFF,0xC0,0x21,0x00,0x21,0x00,0x3F,0x00}; const u8g_fntpgm_uint8_t fontpage_183_185_185[45] U8G_FONT_SECTION("fontpage_183_185_185") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x91,0x20,0x24,0x80,0x4a, - 0x40,0x11,0x00,0x20,0x80,0xdf,0x60,0x11,0x00,0x11,0x00,0x1f,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x91,0x20,0x24,0x80,0x4A, + 0x40,0x11,0x00,0x20,0x80,0xDF,0x60,0x11,0x00,0x11,0x00,0x1F,0x00}; const u8g_fntpgm_uint8_t fontpage_184_141_141[45] U8G_FONT_SECTION("fontpage_184_141_141") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x28,0x40,0xaa,0x40,0x6c,0x40,0xff,0xe0,0x28, - 0x40,0x7d,0x40,0x10,0xc0,0x7c,0x40,0x10,0x40,0x1d,0x40,0xe0,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x28,0x40,0xAA,0x40,0x6C,0x40,0xFF,0xE0,0x28, + 0x40,0x7D,0x40,0x10,0xC0,0x7C,0x40,0x10,0x40,0x1D,0x40,0xE0,0x80}; const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_177_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xfd,0x40,0x01,0x20,0x7f,0xe0,0x4a, - 0x80,0x7a,0x80,0x12,0x80,0x5a,0xa0,0x56,0xa0,0x92,0xa0,0x34,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFD,0x40,0x01,0x20,0x7F,0xE0,0x4A, + 0x80,0x7A,0x80,0x12,0x80,0x5A,0xA0,0x56,0xA0,0x92,0xA0,0x34,0x60}; const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x09,0x00,0x00, - 0x00,0x0b,0x09,0x12,0x0c,0x00,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, - 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x09,0x00,0x00, + 0x00,0x0B,0x09,0x12,0x0C,0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_187_238_238[45] U8G_FONT_SECTION("fontpage_187_238_238") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x09,0x00,0xff,0xe0,0x04,0x00,0x7f, - 0xc0,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0x80,0x42,0x00,0xbf,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0x09,0x00,0xFF,0xE0,0x04,0x00,0x7F, + 0xC0,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0x80,0x42,0x00,0xBF,0xE0}; const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x09,0xff,0x00, - 0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0xff,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xff, - 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7f,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x09,0xFF,0x00, + 0x00,0x0A,0x0A,0x14,0x0C,0x01,0xFF,0xFF,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xFF, + 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7F,0xC0}; const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, - 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x42,0x00,0x42,0x00,0x7f, - 0xe0,0x42,0x00,0x47,0x00,0x4a,0x80,0x52,0x40,0xa2,0x20,0x82,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7F, + 0xE0,0x42,0x00,0x47,0x00,0x4A,0x80,0x52,0x40,0xA2,0x20,0x82,0x00}; const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_166_166") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x49,0x00,0x7f,0xc0,0x49, - 0x00,0x4f,0x00,0x40,0x00,0x5f,0x80,0x49,0x00,0x86,0x00,0xb9,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xC0,0x49, + 0x00,0x4F,0x00,0x40,0x00,0x5F,0x80,0x49,0x00,0x86,0x00,0xB9,0xC0}; const u8g_fntpgm_uint8_t fontpage_189_226_226[45] U8G_FONT_SECTION("fontpage_189_226_226") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x55,0x40,0x48,0xa0,0x7d, - 0xc0,0x45,0x20,0x5e,0x00,0x51,0xc0,0x5d,0x40,0x84,0x80,0x9b,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x55,0x40,0x48,0xA0,0x7D, + 0xC0,0x45,0x20,0x5E,0x00,0x51,0xC0,0x5D,0x40,0x84,0x80,0x9B,0x60}; const u8g_fntpgm_uint8_t fontpage_189_250_250[45] U8G_FONT_SECTION("fontpage_189_250_250") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xef,0xc0,0x22,0x40,0x5f,0xe0,0xe2, - 0x40,0x2f,0xc0,0xa2,0x00,0x6f,0xe0,0x22,0x00,0x52,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xEF,0xC0,0x22,0x40,0x5F,0xE0,0xE2, + 0x40,0x2F,0xC0,0xA2,0x00,0x6F,0xE0,0x22,0x00,0x52,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_190_149_149[45] U8G_FONT_SECTION("fontpage_190_149_149") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xfc,0x40,0x04,0x40,0x04,0x40,0x7c,0x40,0x40, - 0x40,0xfc,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x28,0x40,0x10,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFC,0x40,0x04,0x40,0x04,0x40,0x7C,0x40,0x40, + 0x40,0xFC,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x28,0x40,0x10,0x40}; const u8g_fntpgm_uint8_t fontpage_191_133_133[45] U8G_FONT_SECTION("fontpage_191_133_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x21,0x00,0x47,0xc0,0x91,0x00,0x1f, - 0xe0,0x20,0x80,0x6f,0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x21,0x00,0x47,0xC0,0x91,0x00,0x1F, + 0xE0,0x20,0x80,0x6F,0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; const u8g_fntpgm_uint8_t fontpage_191_140_140[45] U8G_FONT_SECTION("fontpage_191_140_140") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x24,0x80,0x47,0x00,0x92,0x40,0x2f, - 0xe0,0x64,0x20,0xa7,0xc0,0x2c,0x40,0x32,0x80,0x23,0x80,0x2c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x24,0x80,0x47,0x00,0x92,0x40,0x2F, + 0xE0,0x64,0x20,0xA7,0xC0,0x2C,0x40,0x32,0x80,0x23,0x80,0x2C,0x60}; const u8g_fntpgm_uint8_t fontpage_191_145_145[45] U8G_FONT_SECTION("fontpage_191_145_145") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xe0,0x25,0x40,0x45,0x40,0x9a,0x80,0x25, - 0x40,0x65,0x40,0xa0,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0xE0,0x25,0x40,0x45,0x40,0x9A,0x80,0x25, + 0x40,0x65,0x40,0xA0,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_191_158_158[45] U8G_FONT_SECTION("fontpage_191_158_158") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9e,0x9e,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x40,0x22,0x40,0x45,0xa0,0x99,0x20,0x20, - 0x00,0x65,0x00,0xa5,0x00,0x25,0xe0,0x25,0x00,0x2b,0x00,0x31,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9E,0x9E,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x40,0x22,0x40,0x45,0xA0,0x99,0x20,0x20, + 0x00,0x65,0x00,0xA5,0x00,0x25,0xE0,0x25,0x00,0x2B,0x00,0x31,0xE0}; const u8g_fntpgm_uint8_t fontpage_191_169_169[45] U8G_FONT_SECTION("fontpage_191_169_169") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x27,0xe0,0x4c,0x40,0x97,0xc0,0x24, - 0x40,0x67,0xc0,0xa4,0x00,0x27,0xc0,0x2c,0x80,0x33,0x00,0x2c,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x00,0x27,0xE0,0x4C,0x40,0x97,0xC0,0x24, + 0x40,0x67,0xC0,0xA4,0x00,0x27,0xC0,0x2C,0x80,0x33,0x00,0x2C,0xE0}; const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x6a,0x80,0xbe,0x80,0x01,0xe0,0x5d, - 0x40,0xc3,0x40,0x5d,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2A,0x80,0x6A,0x80,0xBE,0x80,0x01,0xE0,0x5D, + 0x40,0xC3,0x40,0x5D,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, - 0x40,0x50,0x20,0x50,0x20,0x50,0xa0,0x90,0x80,0x10,0x80,0x0f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, + 0x40,0x50,0x20,0x50,0x20,0x50,0xA0,0x90,0x80,0x10,0x80,0x0F,0x80}; const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x00,0xb5,0x00,0xaf,0xe0,0xa9, - 0x00,0xb1,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x25,0x00,0xB5,0x00,0xAF,0xE0,0xA9, + 0x00,0xB1,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_226_226") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0xb2,0x00,0xaa,0x80,0xa4, - 0x80,0xa5,0xa0,0x2a,0xc0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x2F,0xE0,0xB2,0x00,0xAA,0x80,0xA4, + 0x80,0xA5,0xA0,0x2A,0xC0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20, - 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x54,0x40,0x52,0xa0,0x8f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20, + 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x54,0x40,0x52,0xA0,0x8F,0x80}; const u8g_fntpgm_uint8_t fontpage_195_182_182[45] U8G_FONT_SECTION("fontpage_195_182_182") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0xb2,0x80,0xaf,0xe0,0xa4, - 0x40,0x27,0xc0,0x24,0x40,0x27,0xc0,0x25,0x40,0x2c,0xa0,0x33,0xa0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0xB2,0x80,0xAF,0xE0,0xA4, + 0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x25,0x40,0x2C,0xA0,0x33,0xA0}; const u8g_fntpgm_uint8_t fontpage_195_201_201[45] U8G_FONT_SECTION("fontpage_195_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x4a,0x80,0x57,0xe0,0x7c, - 0x80,0x57,0xc0,0x54,0x80,0x57,0xe0,0x4a,0x40,0xa8,0xa0,0x4f,0xa0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x7F,0xE0,0x4A,0x80,0x57,0xE0,0x7C, + 0x80,0x57,0xC0,0x54,0x80,0x57,0xE0,0x4A,0x40,0xA8,0xA0,0x4F,0xA0}; const u8g_fntpgm_uint8_t fontpage_196_144_144[45] U8G_FONT_SECTION("fontpage_196_144_144") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x7f,0xe0,0x42,0x00,0x42, - 0x00,0x7a,0x40,0x4a,0x40,0x4a,0x80,0x49,0x20,0x52,0xa0,0x84,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x80,0x02,0x40,0x7F,0xE0,0x42,0x00,0x42, + 0x00,0x7A,0x40,0x4A,0x40,0x4A,0x80,0x49,0x20,0x52,0xA0,0x84,0x60}; const u8g_fntpgm_uint8_t fontpage_196_182_182[45] U8G_FONT_SECTION("fontpage_196_182_182") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x3f,0xc0,0x20, - 0x40,0x20,0x40,0x3f,0xc0,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x3F,0xC0,0x20, + 0x40,0x20,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_192_192") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x60,0x63,0x80,0x42,0x00,0x7a,0x00,0x4b, - 0xe0,0x4a,0x40,0x7a,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x18,0x60,0x63,0x80,0x42,0x00,0x7A,0x00,0x4B, + 0xE0,0x4A,0x40,0x7A,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x7f,0xe0,0x40, - 0x00,0x7d,0xe0,0x44,0x20,0x54,0xa0,0x4c,0x60,0x54,0xa0,0xa9,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x7F,0xE0,0x40, + 0x00,0x7D,0xE0,0x44,0x20,0x54,0xA0,0x4C,0x60,0x54,0xA0,0xA9,0x60}; const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xc0,0x7c,0x00,0x04,0x00,0x7f,0xc0,0x04, - 0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x0c,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x03,0xC0,0x7C,0x00,0x04,0x00,0x7F,0xC0,0x04, + 0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00}; const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_211_211") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0xf8,0x80,0x20,0x80,0x28, - 0x80,0x30,0x80,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0xe3,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x28, + 0x80,0x30,0x80,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0xE3,0x80}; const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_249_249") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x24,0x80,0xfc,0x80,0x24,0xa0,0x2f, - 0xc0,0x34,0x80,0x64,0x80,0xa4,0x80,0x25,0xa0,0x26,0xa0,0xe4,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x24,0x80,0xFC,0x80,0x24,0xA0,0x2F, + 0xC0,0x34,0x80,0x64,0x80,0xA4,0x80,0x25,0xA0,0x26,0xA0,0xE4,0x60}; const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0x22,0x40,0xf9,0x40,0x20,0x40,0x2a, - 0x40,0x31,0x40,0x60,0xe0,0xaf,0x40,0x20,0x40,0x20,0x40,0xe0,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x40,0x22,0x40,0xF9,0x40,0x20,0x40,0x2A, + 0x40,0x31,0x40,0x60,0xE0,0xAF,0x40,0x20,0x40,0x20,0x40,0xE0,0x40}; const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x20,0x80,0xf8,0x80,0x27,0xe0,0x2c, - 0xa0,0x34,0xa0,0x67,0xe0,0xa4,0xa0,0x24,0xa0,0x27,0xe0,0xe4,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x20,0x80,0xF8,0x80,0x27,0xE0,0x2C, + 0xA0,0x34,0xA0,0x67,0xE0,0xA4,0xA0,0x24,0xA0,0x27,0xE0,0xE4,0x20}; const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0xff,0xe0,0x22,0x00,0x2b, - 0xc0,0x32,0x40,0x65,0x40,0xa4,0x80,0x28,0x80,0x29,0x40,0xe6,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x22,0x40,0xFF,0xE0,0x22,0x00,0x2B, + 0xC0,0x32,0x40,0x65,0x40,0xA4,0x80,0x28,0x80,0x29,0x40,0xE6,0x20}; const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0xff,0xe0,0x25,0x20,0x29, - 0x00,0x37,0xe0,0x62,0x40,0xa6,0x40,0x21,0x80,0x22,0x80,0xec,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0xFF,0xE0,0x25,0x20,0x29, + 0x00,0x37,0xE0,0x62,0x40,0xA6,0x40,0x21,0x80,0x22,0x80,0xEC,0x60}; const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0xe0,0xf9,0x00,0x27,0xc0,0x2c, - 0x40,0x37,0xc0,0x64,0x40,0xa7,0xc0,0x21,0x00,0x2f,0xe0,0xe1,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0xE0,0xF9,0x00,0x27,0xC0,0x2C, + 0x40,0x37,0xC0,0x64,0x40,0xA7,0xC0,0x21,0x00,0x2F,0xE0,0xE1,0x00}; const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x28,0x20,0xf2,0x80,0x24,0x40,0x29, - 0x20,0x31,0x00,0x6f,0xe0,0xa1,0x00,0x25,0x80,0x29,0x40,0xf1,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x28,0x20,0xF2,0x80,0x24,0x40,0x29, + 0x20,0x31,0x00,0x6F,0xE0,0xA1,0x00,0x25,0x80,0x29,0x40,0xF1,0x20}; const u8g_fntpgm_uint8_t fontpage_199_165_165[45] U8G_FONT_SECTION("fontpage_199_165_165") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf4,0x40,0x22,0x80,0x2f, - 0xe0,0x31,0x00,0x6f,0xe0,0xa2,0x40,0x26,0x80,0x21,0x40,0xee,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xF4,0x40,0x22,0x80,0x2F, + 0xE0,0x31,0x00,0x6F,0xE0,0xA2,0x40,0x26,0x80,0x21,0x40,0xEE,0x20}; const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf8,0x20,0x22,0x80,0x24, - 0x40,0x38,0x20,0x67,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0xef,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xF8,0x20,0x22,0x80,0x24, + 0x40,0x38,0x20,0x67,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0xEF,0xE0}; const u8g_fntpgm_uint8_t fontpage_199_208_208[45] U8G_FONT_SECTION("fontpage_199_208_208") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x24,0x40,0xff,0xc0,0x24,0x40,0x27, - 0xc0,0x30,0x00,0x6f,0xe0,0xa5,0x00,0x25,0xe0,0x2b,0x00,0xf1,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x24,0x40,0xFF,0xC0,0x24,0x40,0x27, + 0xC0,0x30,0x00,0x6F,0xE0,0xA5,0x00,0x25,0xE0,0x2B,0x00,0xF1,0xE0}; const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xf1,0x00,0x2f,0xe0,0x21, - 0x00,0x35,0x60,0x69,0x20,0xad,0x60,0x29,0x20,0x29,0x20,0xef,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0xC0,0x27,0x00,0xF1,0x00,0x2F,0xE0,0x21, + 0x00,0x35,0x60,0x69,0x20,0xAD,0x60,0x29,0x20,0x29,0x20,0xEF,0xE0}; const u8g_fntpgm_uint8_t fontpage_199_219_219[45] U8G_FONT_SECTION("fontpage_199_219_219") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x80,0x2f,0xe0,0x2a, - 0xa0,0x3a,0xa0,0x6c,0x60,0xa1,0x00,0x2f,0xe0,0x22,0x80,0xec,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xF4,0x80,0x2F,0xE0,0x2A, + 0xA0,0x3A,0xA0,0x6C,0x60,0xA1,0x00,0x2F,0xE0,0x22,0x80,0xEC,0x60}; const u8g_fntpgm_uint8_t fontpage_201_199_199[45] U8G_FONT_SECTION("fontpage_201_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x2a,0xa0,0xff,0xe0,0x21,0x00,0x2f, - 0xe0,0x32,0x80,0xe7,0xc0,0x21,0x00,0x2f,0xe0,0xa1,0x00,0x61,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x2A,0xA0,0xFF,0xE0,0x21,0x00,0x2F, + 0xE0,0x32,0x80,0xE7,0xC0,0x21,0x00,0x2F,0xE0,0xA1,0x00,0x61,0x00}; const u8g_fntpgm_uint8_t fontpage_201_202_203[73] U8G_FONT_SECTION("fontpage_201_202_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfd,0xc0,0xa9,0x40,0xf9,0x60,0xab,0xc0,0xfd, - 0x40,0xa9,0x80,0xab,0x60,0xfe,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x29,0x20,0x25,0x40,0xff,0xe0,0x2a,0xa0,0x2b,0x80,0x30,0x00,0xef, - 0xe0,0x29,0x20,0x2f,0xe0,0xa9,0x20,0x6f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFD,0xC0,0xA9,0x40,0xF9,0x60,0xAB,0xC0,0xFD, + 0x40,0xA9,0x80,0xAB,0x60,0xFE,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x29,0x20,0x25,0x40,0xFF,0xE0,0x2A,0xA0,0x2B,0x80,0x30,0x00,0xEF, + 0xE0,0x29,0x20,0x2F,0xE0,0xA9,0x20,0x6F,0xE0}; const u8g_fntpgm_uint8_t fontpage_201_224_224[45] U8G_FONT_SECTION("fontpage_201_224_224") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xfa,0xa0,0x25,0x40,0x2d, - 0x60,0x35,0x40,0xe4,0x40,0x27,0xc0,0x24,0x40,0xa7,0xc0,0x68,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xFA,0xA0,0x25,0x40,0x2D, + 0x60,0x35,0x40,0xE4,0x40,0x27,0xC0,0x24,0x40,0xA7,0xC0,0x68,0x40}; const u8g_fntpgm_uint8_t fontpage_202_182_182[45] U8G_FONT_SECTION("fontpage_202_182_182") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x93,0xe0,0x94,0x40,0x9a, - 0x40,0x92,0x40,0xb2,0x80,0xd1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x93,0xE0,0x94,0x40,0x9A, + 0x40,0x92,0x40,0xB2,0x80,0xD1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_190_190") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x11,0x00,0xfd,0xe0,0x22,0x40,0x25, - 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4a,0x40,0x94,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x11,0x00,0xFD,0xE0,0x22,0x40,0x25, + 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4A,0x40,0x94,0x20}; const u8g_fntpgm_uint8_t fontpage_202_215_215[45] U8G_FONT_SECTION("fontpage_202_215_215") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7d,0x00,0x45,0x00,0x7d,0xe0,0x47,0x40,0x7d, - 0x40,0x45,0x40,0x7d,0x40,0x45,0x40,0x28,0x80,0x45,0x40,0x86,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD7,0xD7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7D,0x00,0x45,0x00,0x7D,0xE0,0x47,0x40,0x7D, + 0x40,0x45,0x40,0x7D,0x40,0x45,0x40,0x28,0x80,0x45,0x40,0x86,0x20}; const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x55,0x40,0x7c,0x80,0x39, - 0x40,0x56,0x20,0x7f,0xc0,0x04,0x00,0x27,0x80,0x24,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x55,0x40,0x7C,0x80,0x39, + 0x40,0x56,0x20,0x7F,0xC0,0x04,0x00,0x27,0x80,0x24,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_202_248_248[45] U8G_FONT_SECTION("fontpage_202_248_248") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x00,0x55,0xe0,0xff,0x40,0x55, - 0x40,0xfd,0x40,0x95,0x40,0xff,0x40,0x28,0x80,0x19,0x40,0xe6,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x7D,0x00,0x55,0xE0,0xFF,0x40,0x55, + 0x40,0xFD,0x40,0x95,0x40,0xFF,0x40,0x28,0x80,0x19,0x40,0xE6,0x20}; const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xac,0x80,0x72,0x80,0x20,0x80,0xfc, - 0x80,0x22,0x80,0x30,0xe0,0x6f,0x80,0xa0,0x80,0x20,0x80,0x20,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0xAC,0x80,0x72,0x80,0x20,0x80,0xFC, + 0x80,0x22,0x80,0x30,0xE0,0x6F,0x80,0xA0,0x80,0x20,0x80,0x20,0x80}; const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x40,0x29,0x40,0x44,0xc0,0xb8,0x40,0x12, - 0x40,0x7d,0x40,0x10,0x60,0x55,0xc0,0x52,0x40,0x92,0x40,0x30,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x40,0x29,0x40,0x44,0xC0,0xB8,0x40,0x12, + 0x40,0x7D,0x40,0x10,0x60,0x55,0xC0,0x52,0x40,0x92,0x40,0x30,0x40}; const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xfd,0x80,0x45,0x00,0x29,0x00,0xfd, - 0xe0,0x11,0x40,0xfd,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x60,0xFD,0x80,0x45,0x00,0x29,0x00,0xFD, + 0xE0,0x11,0x40,0xFD,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; const u8g_fntpgm_uint8_t fontpage_203_183_183[45] U8G_FONT_SECTION("fontpage_203_183_183") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xaa,0x40,0xfd,0x80,0x95,0x00,0xab,0x00,0xff, - 0xe0,0xa9,0x40,0xab,0x40,0xfd,0x40,0x95,0x40,0xab,0x40,0xfe,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xAA,0x40,0xFD,0x80,0x95,0x00,0xAB,0x00,0xFF, + 0xE0,0xA9,0x40,0xAB,0x40,0xFD,0x40,0x95,0x40,0xAB,0x40,0xFE,0x40}; const u8g_fntpgm_uint8_t fontpage_203_188_188[45] U8G_FONT_SECTION("fontpage_203_188_188") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x10,0x80,0xfd,0x40,0x21,0x40,0x3a, - 0x20,0x2c,0x80,0x28,0x40,0x28,0x40,0x49,0x00,0x48,0x80,0x98,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x10,0x80,0xFD,0x40,0x21,0x40,0x3A, + 0x20,0x2C,0x80,0x28,0x40,0x28,0x40,0x49,0x00,0x48,0x80,0x98,0x40}; const u8g_fntpgm_uint8_t fontpage_204_135_135[45] U8G_FONT_SECTION("fontpage_204_135_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xc0,0x20,0x40,0x3f,0xc0,0x20,0x40,0x3f, - 0xc0,0x79,0x00,0x11,0x00,0xff,0xe0,0x11,0x00,0x21,0x00,0xc1,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x3F, + 0xC0,0x79,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0xC1,0x00}; const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_142_142") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xe0,0xf2,0x20,0x92,0x20,0x93,0xe0,0xf2, - 0x20,0x92,0x20,0x93,0xe0,0xf2,0x20,0x04,0x20,0x08,0xa0,0x30,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8E,0x8E,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x03,0xE0,0xF2,0x20,0x92,0x20,0x93,0xE0,0xF2, + 0x20,0x92,0x20,0x93,0xE0,0xF2,0x20,0x04,0x20,0x08,0xA0,0x30,0x40}; const u8g_fntpgm_uint8_t fontpage_204_175_175[45] U8G_FONT_SECTION("fontpage_204_175_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f, - 0x80,0x00,0x00,0xff,0xe0,0x24,0x00,0x27,0x80,0x54,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F, + 0x80,0x00,0x00,0xFF,0xE0,0x24,0x00,0x27,0x80,0x54,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_204_194_194[45] U8G_FONT_SECTION("fontpage_204_194_194") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc2,0xc2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xf7,0xc0,0x91,0x00,0x91,0x00,0xff, - 0xe0,0x90,0x80,0x9f,0xe0,0x94,0x80,0xf2,0x80,0x00,0x80,0x03,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC2,0xC2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xF7,0xC0,0x91,0x00,0x91,0x00,0xFF, + 0xE0,0x90,0x80,0x9F,0xE0,0x94,0x80,0xF2,0x80,0x00,0x80,0x03,0x80}; const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x00,0x55,0xe0,0x7d,0x40,0x55, - 0x40,0xff,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xE0,0xFF,0x00,0x55,0xE0,0x7D,0x40,0x55, + 0x40,0xFF,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40}; const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x02,0x00,0x3f,0xc0,0x22,0x40,0x3f, - 0xc0,0x22,0x40,0x3f,0xc0,0x0a,0x00,0x04,0x00,0x1b,0x00,0xe0,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x02,0x00,0x3F,0xC0,0x22,0x40,0x3F, + 0xC0,0x22,0x40,0x3F,0xC0,0x0A,0x00,0x04,0x00,0x1B,0x00,0xE0,0xE0}; const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, - 0xe0,0x48,0x00,0x7f,0xc0,0x4a,0x40,0x79,0x80,0xc9,0x80,0x0e,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, + 0xE0,0x48,0x00,0x7F,0xC0,0x4A,0x40,0x79,0x80,0xC9,0x80,0x0E,0x60}; const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x1f,0x80,0x30, - 0x80,0x5f,0x80,0x90,0x80,0x1f,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x30, + 0x80,0x5F,0x80,0x90,0x80,0x1F,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_255_255") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xfc,0x00,0x24,0x00,0x27, - 0xc0,0x74,0x40,0x6e,0x40,0xa5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0xC0,0x27,0x00,0xFC,0x00,0x24,0x00,0x27, + 0xC0,0x74,0x40,0x6E,0x40,0xA5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, - 0x00,0x69,0x00,0xa7,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x71, + 0x00,0x69,0x00,0xA7,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0x2f,0xe0,0xf0,0x00,0x22, - 0x80,0x74,0x40,0x6a,0xa0,0xa2,0x80,0x21,0x00,0x22,0x80,0x2c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x21,0x00,0x2F,0xE0,0xF0,0x00,0x22, + 0x80,0x74,0x40,0x6A,0xA0,0xA2,0x80,0x21,0x00,0x22,0x80,0x2C,0x60}; const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x40,0x2a,0x80,0x21, - 0x00,0x72,0x80,0x6c,0x60,0xa7,0xc0,0x24,0x40,0x24,0x40,0x27,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xF4,0x40,0x2A,0x80,0x21, + 0x00,0x72,0x80,0x6C,0x60,0xA7,0xC0,0x24,0x40,0x24,0x40,0x27,0xC0}; const u8g_fntpgm_uint8_t fontpage_209_157_157[45] U8G_FONT_SECTION("fontpage_209_157_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x27,0xe0,0x5a,0x40,0x51,0x80,0xde, - 0x60,0x51,0x00,0x5f,0xe0,0x51,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x27,0xE0,0x5A,0x40,0x51,0x80,0xDE, + 0x60,0x51,0x00,0x5F,0xE0,0x51,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; const u8g_fntpgm_uint8_t fontpage_209_196_196[45] U8G_FONT_SECTION("fontpage_209_196_196") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x20,0x80,0x7f,0xc0,0x24, - 0x80,0xff,0xe0,0x24,0x80,0xff,0xe0,0x15,0x00,0x24,0x80,0xc4,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x20,0x80,0x7F,0xC0,0x24, + 0x80,0xFF,0xE0,0x24,0x80,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60}; const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xfa,0xa0,0x2f,0xe0,0x2a, - 0xa0,0x3f,0xe0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x27,0xc0,0x24,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x2F,0xE0,0xFA,0xA0,0x2F,0xE0,0x2A, + 0xA0,0x3F,0xE0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40}; const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0x40,0x2a,0xa0,0xf4,0x40,0x27,0xc0,0x38, - 0x20,0x27,0xc0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x22,0x80,0x2f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0x40,0x2A,0xA0,0xF4,0x40,0x27,0xC0,0x38, + 0x20,0x27,0xC0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x22,0x80,0x2F,0xE0}; const u8g_fntpgm_uint8_t fontpage_212_223_223[45] U8G_FONT_SECTION("fontpage_212_223_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x25,0x40,0x29,0xa0,0xff,0x40,0x25,0x20,0x6f, - 0xe0,0x75,0x40,0xaf,0xe0,0xa5,0x40,0x26,0xa0,0x29,0x60,0x32,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x25,0x40,0x29,0xA0,0xFF,0x40,0x25,0x20,0x6F, + 0xE0,0x75,0x40,0xAF,0xE0,0xA5,0x40,0x26,0xA0,0x29,0x60,0x32,0x20}; const u8g_fntpgm_uint8_t fontpage_213_162_162[45] U8G_FONT_SECTION("fontpage_213_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x22,0x80,0xf4,0x40,0x2b,0xa0,0x60, - 0x00,0x7e,0xe0,0xaa,0xa0,0xae,0xe0,0x24,0x40,0x2a,0xc0,0x31,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x22,0x80,0xF4,0x40,0x2B,0xA0,0x60, + 0x00,0x7E,0xE0,0xAA,0xA0,0xAE,0xE0,0x24,0x40,0x2A,0xC0,0x31,0x20}; const u8g_fntpgm_uint8_t fontpage_214_226_227[71] U8G_FONT_SECTION("fontpage_214_226_227") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe3,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, - 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xff,0xc0,0x0b,0x0a,0x14, - 0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xc0,0x24,0x00,0x24, - 0x00,0x24,0x00,0x24,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE3,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, + 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xFF,0xC0,0x0B,0x0A,0x14, + 0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xC0,0x24,0x00,0x24, + 0x00,0x24,0x00,0x24,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_229_229") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x27,0xc0,0x24,0x00,0x24,0x00,0xff, - 0xe0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xf8,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x27,0xC0,0x24,0x00,0x24,0x00,0xFF, + 0xE0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xF8,0x00}; const u8g_fntpgm_uint8_t fontpage_214_248_248[45] U8G_FONT_SECTION("fontpage_214_248_248") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x43,0xc0,0xf0,0x40,0x93,0xc0,0xf8,0x40,0x8f, - 0xe0,0xfc,0xa0,0x20,0x80,0xbb,0xe0,0xa2,0xa0,0xba,0xe0,0xe0,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x43,0xC0,0xF0,0x40,0x93,0xC0,0xF8,0x40,0x8F, + 0xE0,0xFC,0xA0,0x20,0x80,0xBB,0xE0,0xA2,0xA0,0xBA,0xE0,0xE0,0x80}; const u8g_fntpgm_uint8_t fontpage_215_188_188[45] U8G_FONT_SECTION("fontpage_215_188_188") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xc0,0xfd,0x40,0x11,0x40,0xff,0x60,0x84, - 0x00,0x7b,0xe0,0x01,0x40,0x79,0x40,0x4a,0x80,0x4d,0x40,0x82,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xC0,0xFD,0x40,0x11,0x40,0xFF,0x60,0x84, + 0x00,0x7B,0xE0,0x01,0x40,0x79,0x40,0x4A,0x80,0x4D,0x40,0x82,0x20}; const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xf6, - 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xb4,0x40,0xc4,0x40,0x83,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xF6, + 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xB4,0x40,0xC4,0x40,0x83,0xC0}; const u8g_fntpgm_uint8_t fontpage_217_146_146[45] U8G_FONT_SECTION("fontpage_217_146_146") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x23,0xc0,0x84,0x40,0x59,0x40,0x10, - 0x80,0x27,0xc0,0x24,0x40,0xc2,0x80,0x41,0x00,0x46,0x80,0x58,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x23,0xC0,0x84,0x40,0x59,0x40,0x10, + 0x80,0x27,0xC0,0x24,0x40,0xC2,0x80,0x41,0x00,0x46,0x80,0x58,0x60}; const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xe0,0x14, - 0x20,0x27,0xe0,0x24,0x20,0xc7,0xe0,0x44,0x20,0x44,0x20,0x44,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xE0,0x14, + 0x20,0x27,0xE0,0x24,0x20,0xC7,0xE0,0x44,0x20,0x44,0x20,0x44,0x60}; const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_225_225") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, - 0x40,0x29,0x20,0x25,0x40,0xc5,0x80,0x49,0x00,0x42,0x80,0x5c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, + 0x40,0x29,0x20,0x25,0x40,0xC5,0x80,0x49,0x00,0x42,0x80,0x5C,0x60}; const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x01,0x00,0x97,0xc0,0x51, - 0x00,0x2f,0xe0,0x24,0x40,0xc7,0x40,0x45,0xc0,0x44,0x40,0x44,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x01,0x00,0x97,0xC0,0x51, + 0x00,0x2F,0xE0,0x24,0x40,0xC7,0x40,0x45,0xC0,0x44,0x40,0x44,0xC0}; const u8g_fntpgm_uint8_t fontpage_220_172_172[45] U8G_FONT_SECTION("fontpage_220_172_172") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4e,0x20,0x2a,0xa0,0x0a,0xa0,0x8e,0xa0,0x5a, - 0xa0,0x2e,0xa0,0x2a,0xa0,0xca,0xa0,0x4e,0x20,0x4a,0x20,0x51,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4E,0x20,0x2A,0xA0,0x0A,0xA0,0x8E,0xA0,0x5A, + 0xA0,0x2E,0xA0,0x2A,0xA0,0xCA,0xA0,0x4E,0x20,0x4A,0x20,0x51,0x60}; const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x80,0x8b,0xe0,0x4a,0x20,0x1b, - 0xe0,0x2a,0x20,0x2b,0xe0,0xc8,0x80,0x4a,0xc0,0x54,0xa0,0x69,0xa0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x28,0x80,0x8B,0xE0,0x4A,0x20,0x1B, + 0xE0,0x2A,0x20,0x2B,0xE0,0xC8,0x80,0x4A,0xC0,0x54,0xA0,0x69,0xA0}; const u8g_fntpgm_uint8_t fontpage_221_150_150[45] U8G_FONT_SECTION("fontpage_221_150_150") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x85,0x00,0x4f,0xe0,0x99,0x00,0x4f,0xc0,0x49, - 0x00,0xcf,0xc0,0x49,0x00,0x4f,0xe0,0x04,0x00,0xff,0xe0,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x85,0x00,0x4F,0xE0,0x99,0x00,0x4F,0xC0,0x49, + 0x00,0xCF,0xC0,0x49,0x00,0x4F,0xE0,0x04,0x00,0xFF,0xE0,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_221_171_171[45] U8G_FONT_SECTION("fontpage_221_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x25,0x40,0x06,0xc0,0x84,0x40,0x47, - 0xc0,0x20,0x00,0x2f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x25,0x40,0x06,0xC0,0x84,0x40,0x47, + 0xC0,0x20,0x00,0x2F,0xE0,0xCA,0xA0,0x4A,0xA0,0x4A,0xA0,0x5F,0xE0}; const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53, - 0xa0,0x3e,0xa0,0x28,0xa0,0xdf,0xa0,0x4a,0x40,0x52,0xa0,0x65,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x80,0x3E,0x80,0x12,0xE0,0x9E,0xA0,0x53, + 0xA0,0x3E,0xA0,0x28,0xA0,0xDF,0xA0,0x4A,0x40,0x52,0xA0,0x65,0x20}; const u8g_fntpgm_uint8_t fontpage_226_161_161[45] U8G_FONT_SECTION("fontpage_226_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7f,0xe0,0xaa,0x80,0x2a,0x80,0xff, - 0xe0,0x2a,0x80,0x2a,0x80,0xff,0xe0,0x12,0x40,0x49,0x20,0x89,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x7F,0xE0,0xAA,0x80,0x2A,0x80,0xFF, + 0xE0,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x12,0x40,0x49,0x20,0x89,0x20}; const u8g_fntpgm_uint8_t fontpage_227_177_177[45] U8G_FONT_SECTION("fontpage_227_177_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xf9,0x00,0x23,0xc0,0xfd,0x40,0x53, - 0x40,0xa9,0x40,0xfa,0xe0,0x22,0x20,0xfa,0x40,0x49,0x20,0x89,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xF9,0x00,0x23,0xC0,0xFD,0x40,0x53, + 0x40,0xA9,0x40,0xFA,0xE0,0x22,0x20,0xFA,0x40,0x49,0x20,0x89,0x20}; const u8g_fntpgm_uint8_t fontpage_227_200_200[45] U8G_FONT_SECTION("fontpage_227_200_200") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xa0,0x2b,0x40,0xac,0x80,0xb7,0xc0,0xa8, - 0x20,0x37,0xc0,0x24,0x40,0x27,0xc0,0x52,0x80,0x49,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xA0,0x2B,0x40,0xAC,0x80,0xB7,0xC0,0xA8, + 0x20,0x37,0xC0,0x24,0x40,0x27,0xC0,0x52,0x80,0x49,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x21,0x00,0x3f,0xe0,0x20, - 0x00,0x20,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20, + 0x00,0x20,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; const u8g_fntpgm_uint8_t fontpage_228_233_233[45] U8G_FONT_SECTION("fontpage_228_233_233") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xa2,0x00,0xa7,0xe0,0xfa,0xa0,0xa2, - 0xa0,0x32,0xa0,0x64,0xa0,0xa9,0x20,0x22,0x20,0x25,0x20,0x28,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xA2,0x00,0xA7,0xE0,0xFA,0xA0,0xA2, + 0xA0,0x32,0xA0,0x64,0xA0,0xA9,0x20,0x22,0x20,0x25,0x20,0x28,0xC0}; const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_135_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x88,0x40,0x52,0x80,0x0c, - 0x00,0x2a,0x80,0xdf,0x40,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x88,0x40,0x52,0x80,0x0C, + 0x00,0x2A,0x80,0xDF,0x40,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x44,0x40,0x7f,0xc0,0x44, - 0x40,0x44,0x40,0x7f,0xc0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44, + 0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xC0}; const u8g_fntpgm_uint8_t fontpage_234_204_204[45] U8G_FONT_SECTION("fontpage_234_204_204") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x7f,0xc0,0x44,0x40,0x7f, - 0xc0,0x0a,0x00,0x31,0x80,0xd1,0x60,0x11,0x00,0x21,0x00,0x41,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F, + 0xC0,0x0A,0x00,0x31,0x80,0xD1,0x60,0x11,0x00,0x21,0x00,0x41,0x00}; const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x08,0x0b,0x0b,0x0c,0x02,0xff,0x10,0x20,0xff,0x81,0x81,0xff,0x81,0x81,0x81, - 0xff,0x81}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x08,0x0B,0x0B,0x0C,0x02,0xFF,0x10,0x20,0xFF,0x81,0x81,0xFF,0x81,0x81,0x81, + 0xFF,0x81}; const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x22,0x00,0x42,0x00,0xf7,0xc0,0x98,0x40,0x90, - 0x40,0xf4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xf0,0x40,0x91,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x22,0x00,0x42,0x00,0xF7,0xC0,0x98,0x40,0x90, + 0x40,0xF4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xF0,0x40,0x91,0x80}; const u8g_fntpgm_uint8_t fontpage_237_227_227[45] U8G_FONT_SECTION("fontpage_237_227_227") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe3,0xe3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0xa1,0x00,0xf9,0xe0,0x8a,0x00,0xfa, - 0x80,0xa0,0x40,0xfc,0x00,0x00,0x00,0x7f,0xc0,0x4a,0x40,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE3,0xE3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0xA1,0x00,0xF9,0xE0,0x8A,0x00,0xFA, + 0x80,0xA0,0x40,0xFC,0x00,0x00,0x00,0x7F,0xC0,0x4A,0x40,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20, - 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x20,0x80,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20, + 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_160_160") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf4,0x20,0x97,0xe0,0xf4,0x80,0x94, - 0x80,0x97,0xe0,0xf4,0x80,0x94,0x80,0xf4,0xa0,0x96,0x60,0x04,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF4,0x20,0x97,0xE0,0xF4,0x80,0x94, + 0x80,0x97,0xE0,0xF4,0x80,0x94,0x80,0xF4,0xA0,0x96,0x60,0x04,0x20}; const u8g_fntpgm_uint8_t fontpage_240_141_141[45] U8G_FONT_SECTION("fontpage_240_141_141") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xfa,0x00,0x23,0xe0,0x24,0x20,0x79, - 0x40,0xc9,0x00,0x49,0x00,0x49,0x00,0x7a,0x80,0x4c,0x40,0x08,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xFA,0x00,0x23,0xE0,0x24,0x20,0x79, + 0x40,0xC9,0x00,0x49,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x08,0x20}; const u8g_fntpgm_uint8_t fontpage_241_186_186[45] U8G_FONT_SECTION("fontpage_241_186_186") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xff,0xe0,0x2a,0x20,0x22,0x80,0x77, - 0xe0,0xd4,0x80,0x5f,0xe0,0x54,0x80,0x77,0xe0,0x54,0x80,0x07,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xFF,0xE0,0x2A,0x20,0x22,0x80,0x77, + 0xE0,0xD4,0x80,0x5F,0xE0,0x54,0x80,0x77,0xE0,0x54,0x80,0x07,0xE0}; const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xe3,0xe0,0x24,0x20,0xfa,0x40,0x21, - 0x80,0x36,0x80,0x29,0xe0,0x62,0x20,0xa5,0x40,0x20,0x80,0x27,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xE3,0xE0,0x24,0x20,0xFA,0x40,0x21, + 0x80,0x36,0x80,0x29,0xE0,0x62,0x20,0xA5,0x40,0x20,0x80,0x27,0x00}; const u8g_fntpgm_uint8_t fontpage_244_205_205[45] U8G_FONT_SECTION("fontpage_244_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xef,0xe0,0x21,0x00,0xff,0xc0,0x21, - 0x00,0x2f,0xe0,0x34,0x40,0x6f,0xc0,0xa4,0x40,0x27,0xc0,0x2c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xEF,0xE0,0x21,0x00,0xFF,0xC0,0x21, + 0x00,0x2F,0xE0,0x34,0x40,0x6F,0xC0,0xA4,0x40,0x27,0xC0,0x2C,0x60}; const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x45,0x20,0xf7,0xe0,0x00,0x00,0xaf, - 0xe0,0xa1,0x00,0xaf,0xe0,0x4a,0xa0,0x6a,0xa0,0x8a,0xa0,0x08,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x81,0x00,0x45,0x20,0xF7,0xE0,0x00,0x00,0xAF, + 0xE0,0xA1,0x00,0xAF,0xE0,0x4A,0xA0,0x6A,0xA0,0x8A,0xA0,0x08,0x60}; const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x7f,0xc0,0x04, - 0x00,0xff,0xe0,0x01,0x00,0x7f,0xc0,0x11,0x00,0x09,0x00,0x03,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x7B,0xE0,0x94,0x80,0x7F,0xC0,0x04, + 0x00,0xFF,0xE0,0x01,0x00,0x7F,0xC0,0x11,0x00,0x09,0x00,0x03,0x00}; const u8g_fntpgm_uint8_t fontpage_247_161_161[45] U8G_FONT_SECTION("fontpage_247_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x52,0x80,0xff,0xe0,0x80, - 0x20,0x3f,0x80,0x20,0x80,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x3D,0xE0,0x52,0x80,0xFF,0xE0,0x80, + 0x20,0x3F,0x80,0x20,0x80,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0}; const u8g_fntpgm_uint8_t fontpage_247_177_177[45] U8G_FONT_SECTION("fontpage_247_177_177") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x4a,0x80,0x94,0x40,0x7f, - 0xc0,0x12,0x40,0x3b,0xc0,0x56,0x40,0x93,0xc0,0x12,0x40,0x13,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x3D,0xE0,0x4A,0x80,0x94,0x40,0x7F, + 0xC0,0x12,0x40,0x3B,0xC0,0x56,0x40,0x93,0xC0,0x12,0x40,0x13,0xC0}; const u8g_fntpgm_uint8_t fontpage_249_251_251[45] U8G_FONT_SECTION("fontpage_249_251_251") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, - 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x03,0x80,0xfc,0x00,0x11,0x00,0x7e,0x00,0x08, - 0x00,0x11,0x00,0xff,0x80,0x08,0x80,0x2a,0x00,0x49,0x00,0x98,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x03,0x80,0xFC,0x00,0x11,0x00,0x7E,0x00,0x08, + 0x00,0x11,0x00,0xFF,0x80,0x08,0x80,0x2A,0x00,0x49,0x00,0x98,0x80}; const u8g_fntpgm_uint8_t fontpage_250_133_133[45] U8G_FONT_SECTION("fontpage_250_133_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xc0,0x41,0x00,0xf1,0x00,0x21, - 0x00,0x51,0x00,0xe9,0x00,0x01,0x00,0x51,0x00,0xa9,0x00,0xaf,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xC0,0x41,0x00,0xF1,0x00,0x21, + 0x00,0x51,0x00,0xE9,0x00,0x01,0x00,0x51,0x00,0xA9,0x00,0xAF,0xE0}; const u8g_fntpgm_uint8_t fontpage_250_162_162[45] U8G_FONT_SECTION("fontpage_250_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x91, - 0x20,0x3e,0x00,0x08,0x80,0x7f,0xc0,0x04,0x40,0x24,0x80,0xcc,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x91, + 0x20,0x3E,0x00,0x08,0x80,0x7F,0xC0,0x04,0x40,0x24,0x80,0xCC,0x60}; const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x51,0x40,0x5d,0x80,0x51,0x20,0xfd, - 0xe0,0x08,0x80,0x3f,0x00,0x08,0x80,0x7f,0xc0,0x24,0x80,0xcc,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x51,0x40,0x5D,0x80,0x51,0x20,0xFD, + 0xE0,0x08,0x80,0x3F,0x00,0x08,0x80,0x7F,0xC0,0x24,0x80,0xCC,0x60}; const u8g_fntpgm_uint8_t fontpage_250_176_176[45] U8G_FONT_SECTION("fontpage_250_176_176") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0x55,0x20,0xf5,0x20,0x25, - 0x20,0x57,0xe0,0xed,0x20,0x05,0x20,0x55,0x20,0xaf,0xe0,0xac,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0x55,0x20,0xF5,0x20,0x25, + 0x20,0x57,0xE0,0xED,0x20,0x05,0x20,0x55,0x20,0xAF,0xE0,0xAC,0x20}; const u8g_fntpgm_uint8_t fontpage_250_194_194[45] U8G_FONT_SECTION("fontpage_250_194_194") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc2,0xc2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0x54,0x40,0xf2,0x80,0x21, - 0x00,0x52,0x80,0xec,0x60,0x01,0x00,0x50,0x80,0xab,0x00,0x80,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC2,0xC2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0x54,0x40,0xF2,0x80,0x21, + 0x00,0x52,0x80,0xEC,0x60,0x01,0x00,0x50,0x80,0xAB,0x00,0x80,0xC0}; const u8g_fntpgm_uint8_t fontpage_250_241_242[73] U8G_FONT_SECTION("fontpage_250_241_242") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0x57,0xe0,0xf1,0x00,0x22, - 0x40,0x57,0xa0,0xe8,0x00,0x02,0x80,0x52,0xa0,0xac,0xa0,0xa8,0x60,0x0b,0x0b,0x16, - 0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x52,0x40,0xf7,0x80,0x21,0x40,0x57,0xe0,0xe8, - 0x80,0x02,0xc0,0x54,0xa0,0xa8,0xa0,0xa9,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0x57,0xE0,0xF1,0x00,0x22, + 0x40,0x57,0xA0,0xE8,0x00,0x02,0x80,0x52,0xA0,0xAC,0xA0,0xA8,0x60,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x52,0x40,0xF7,0x80,0x21,0x40,0x57,0xE0,0xE8, + 0x80,0x02,0xC0,0x54,0xA0,0xA8,0xA0,0xA9,0x80}; const u8g_fntpgm_uint8_t fontpage_251_160_160[45] U8G_FONT_SECTION("fontpage_251_160_160") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0x22,0x40,0x57,0x80,0xf0,0x80,0x2f, - 0xe0,0x51,0x20,0xed,0x40,0x03,0x80,0x55,0x40,0xa9,0x20,0xaf,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xC0,0x22,0x40,0x57,0x80,0xF0,0x80,0x2F, + 0xE0,0x51,0x20,0xED,0x40,0x03,0x80,0x55,0x40,0xA9,0x20,0xAF,0x20}; const u8g_fntpgm_uint8_t fontpage_251_178_178[45] U8G_FONT_SECTION("fontpage_251_178_178") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xe0,0x24,0x20,0x55,0x60,0xf4,0xa0,0x27, - 0xe0,0x54,0xa0,0xef,0xe0,0x05,0x20,0x55,0xe0,0xac,0x20,0xac,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xE0,0x24,0x20,0x55,0x60,0xF4,0xA0,0x27, + 0xE0,0x54,0xA0,0xEF,0xE0,0x05,0x20,0x55,0xE0,0xAC,0x20,0xAC,0x60}; const u8g_fntpgm_uint8_t fontpage_251_210_210[45] U8G_FONT_SECTION("fontpage_251_210_210") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x20,0x27,0xa0,0x51,0x40,0xff,0xe0,0x21, - 0x00,0x53,0xe0,0xee,0x20,0x03,0xe0,0x52,0x20,0xab,0xe0,0xaa,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x20,0x27,0xA0,0x51,0x40,0xFF,0xE0,0x21, + 0x00,0x53,0xE0,0xEE,0x20,0x03,0xE0,0x52,0x20,0xAB,0xE0,0xAA,0x20}; const u8g_fntpgm_uint8_t fontpage_251_218_218[45] U8G_FONT_SECTION("fontpage_251_218_218") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xda,0xda,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xc0,0x54,0x40,0xf7,0xc0,0x24, - 0x40,0x57,0xc0,0xe9,0x20,0x07,0x40,0x53,0x80,0xad,0x40,0xab,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDA,0xDA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xC0,0x54,0x40,0xF7,0xC0,0x24, + 0x40,0x57,0xC0,0xE9,0x20,0x07,0x40,0x53,0x80,0xAD,0x40,0xAB,0x20}; const u8g_fntpgm_uint8_t fontpage_251_232_232[45] U8G_FONT_SECTION("fontpage_251_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x58,0x20,0xff,0xe0,0x28, - 0x00,0x5f,0xe0,0xea,0xa0,0x0f,0xe0,0x5a,0xa0,0xaa,0xa0,0xaa,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x58,0x20,0xFF,0xE0,0x28, + 0x00,0x5F,0xE0,0xEA,0xA0,0x0F,0xE0,0x5A,0xA0,0xAA,0xA0,0xAA,0x60}; const u8g_fntpgm_uint8_t fontpage_252_174_174[45] U8G_FONT_SECTION("fontpage_252_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0x44,0x20,0xfb,0xe0,0x24, - 0x80,0x5d,0xe0,0xf5,0x20,0x05,0xe0,0x55,0x20,0xad,0xe0,0xa5,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0x44,0x20,0xFB,0xE0,0x24, + 0x80,0x5D,0xE0,0xF5,0x20,0x05,0xE0,0x55,0x20,0xAD,0xE0,0xA5,0x20}; const u8g_fntpgm_uint8_t fontpage_252_189_189[45] U8G_FONT_SECTION("fontpage_252_189_189") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0x55,0x60,0xf6,0xa0,0x25, - 0x20,0x56,0xa0,0xef,0xe0,0x01,0x40,0x56,0xa0,0xaa,0x60,0xa9,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0x55,0x60,0xF6,0xA0,0x25, + 0x20,0x56,0xA0,0xEF,0xE0,0x01,0x40,0x56,0xA0,0xAA,0x60,0xA9,0xC0}; const u8g_fntpgm_uint8_t fontpage_252_252_252[45] U8G_FONT_SECTION("fontpage_252_252_252") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4a,0x40,0x4d,0xa0,0x8a,0x40,0xfd,0xa0,0x28, - 0x00,0x4f,0xe0,0xfa,0x40,0x0d,0xa0,0x5a,0x40,0xad,0xa0,0xaf,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4A,0x40,0x4D,0xA0,0x8A,0x40,0xFD,0xA0,0x28, + 0x00,0x4F,0xE0,0xFA,0x40,0x0D,0xA0,0x5A,0x40,0xAD,0xA0,0xAF,0xE0}; const u8g_fntpgm_uint8_t fontpage_253_140_140[45] U8G_FONT_SECTION("fontpage_253_140_140") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x4f,0xe0,0x91,0x00,0xef,0xe0,0x2a, - 0xa0,0x5f,0xe0,0xf4,0x40,0x07,0xc0,0x54,0x40,0xaf,0xc0,0xac,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x4F,0xE0,0x91,0x00,0xEF,0xE0,0x2A, + 0xA0,0x5F,0xE0,0xF4,0x40,0x07,0xC0,0x54,0x40,0xAF,0xC0,0xAC,0x60}; const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_162_162") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xc0,0x41,0x00,0x51,0x00,0xe1, - 0x00,0x21,0x00,0x41,0x00,0xf1,0x00,0x01,0x00,0x31,0x00,0xcf,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xC0,0x41,0x00,0x51,0x00,0xE1, + 0x00,0x21,0x00,0x41,0x00,0xF1,0x00,0x01,0x00,0x31,0x00,0xCF,0xE0}; const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_238_238") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x4a,0x40,0x7f,0xc0,0x04,0x00,0xff, - 0xe0,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x4A,0x40,0x7F,0xC0,0x04,0x00,0xFF, + 0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_242_242") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x49,0x20,0x7f,0xe0,0x04,0x40,0x3f, - 0x80,0x05,0x00,0xff,0xe0,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x49,0x20,0x7F,0xE0,0x04,0x40,0x3F, + 0x80,0x05,0x00,0xFF,0xE0,0x30,0x80,0xDF,0x80,0x10,0x80,0x1F,0x80}; const u8g_fntpgm_uint8_t fontpage_256_240_240[45] U8G_FONT_SECTION("fontpage_256_240_240") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x57,0xe0,0x56,0xa0,0x75,0x20,0x56, - 0xa0,0x77,0xe0,0x51,0x00,0x52,0xc0,0xfe,0x20,0x12,0x60,0x11,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0x57,0xE0,0x56,0xA0,0x75,0x20,0x56, + 0xA0,0x77,0xE0,0x51,0x00,0x52,0xC0,0xFE,0x20,0x12,0x60,0x11,0xC0}; const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, - 0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82, - 0xfe,0x82}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEA,0xEA,0x00,0x0A,0xFF,0x00, + 0x00,0x07,0x0B,0x0B,0x0C,0x02,0xFF,0x20,0xFE,0x82,0x82,0xFE,0x82,0xFE,0x82,0x82, + 0xFE,0x82}; const u8g_fntpgm_uint8_t fontpage_267_205_205[45] U8G_FONT_SECTION("fontpage_267_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x91,0x00,0xf9,0xe0,0x8a, - 0x80,0xfc,0x40,0x90,0x00,0xff,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x91,0x00,0xF9,0xE0,0x8A, + 0x80,0xFC,0x40,0x90,0x00,0xFF,0xC0,0x4A,0x40,0x4A,0x40,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x40,0x00,0x80,0x00,0x10,0x00,0x2f, - 0xe0,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x40,0x00,0x80,0x00,0x10,0x00,0x2F, + 0xE0,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; const u8g_fntpgm_uint8_t fontpage_272_232_232[45] U8G_FONT_SECTION("fontpage_272_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, - 0x00,0xff,0xe0,0x0a,0x40,0x12,0x80,0x31,0x00,0xd4,0x80,0x18,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04, + 0x00,0xFF,0xE0,0x0A,0x40,0x12,0x80,0x31,0x00,0xD4,0x80,0x18,0x60}; const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_171_171") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x20,0x80,0xff,0xe0,0x14,0xa0,0x2c, - 0x80,0x77,0xe0,0xad,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x80,0x20,0x80,0xFF,0xE0,0x14,0xA0,0x2C, + 0x80,0x77,0xE0,0xAD,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x9f,0xe0,0x51,0x00,0x31,0x00,0xd7, - 0xc0,0x12,0x00,0xff,0xe0,0x0c,0x40,0x32,0x80,0xd1,0x00,0x18,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x9F,0xE0,0x51,0x00,0x31,0x00,0xD7, + 0xC0,0x12,0x00,0xFF,0xE0,0x0C,0x40,0x32,0x80,0xD1,0x00,0x18,0xE0}; const u8g_fntpgm_uint8_t fontpage_273_221_221[45] U8G_FONT_SECTION("fontpage_273_221_221") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x51,0x00,0x7f,0xe0,0x11,0x00,0xf1,0x00,0x57, - 0xc0,0x84,0x00,0xff,0xe0,0x14,0x80,0x33,0x00,0xd5,0x80,0x18,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x51,0x00,0x7F,0xE0,0x11,0x00,0xF1,0x00,0x57, + 0xC0,0x84,0x00,0xFF,0xE0,0x14,0x80,0x33,0x00,0xD5,0x80,0x18,0x60}; const u8g_fntpgm_uint8_t fontpage_274_135_135[45] U8G_FONT_SECTION("fontpage_274_135_135") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x00,0x27,0xe0,0xf8,0x00,0x17,0xc0,0x2c, - 0x40,0x77,0xc0,0xac,0x40,0x27,0xc0,0x2c,0x40,0x33,0x80,0x2c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x00,0x27,0xE0,0xF8,0x00,0x17,0xC0,0x2C, + 0x40,0x77,0xC0,0xAC,0x40,0x27,0xC0,0x2C,0x40,0x33,0x80,0x2C,0x60}; const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x00,0x22,0x00,0x7f,0xc0,0xa4, - 0x40,0x3f,0xc0,0x24,0x40,0x3f,0xc0,0x24,0x40,0x45,0x40,0x80,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0x00,0x22,0x00,0x7F,0xC0,0xA4, + 0x40,0x3F,0xC0,0x24,0x40,0x3F,0xC0,0x24,0x40,0x45,0x40,0x80,0x80}; const u8g_fntpgm_uint8_t fontpage_276_136_136[45] U8G_FONT_SECTION("fontpage_276_136_136") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x10,0x80,0xfc,0x80,0x00,0x80,0x7f, - 0xe0,0x00,0x80,0x78,0x80,0x00,0x80,0x78,0x80,0x48,0x80,0x78,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x10,0x80,0xFC,0x80,0x00,0x80,0x7F, + 0xE0,0x00,0x80,0x78,0x80,0x00,0x80,0x78,0x80,0x48,0x80,0x78,0x80}; const u8g_fntpgm_uint8_t fontpage_276_138_138[45] U8G_FONT_SECTION("fontpage_276_138_138") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xc0,0xf2,0x40,0x02,0x40,0xf2,0x40,0x02, - 0x40,0xff,0xc0,0x02,0x40,0xf2,0x40,0x92,0x60,0xf2,0x60,0x92,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xC0,0xF2,0x40,0x02,0x40,0xF2,0x40,0x02, + 0x40,0xFF,0xC0,0x02,0x40,0xF2,0x40,0x92,0x60,0xF2,0x60,0x92,0x20}; const u8g_fntpgm_uint8_t fontpage_276_152_152[45] U8G_FONT_SECTION("fontpage_276_152_152") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0xf7,0xc0,0x00,0x40,0xf0,0x40,0x07, - 0xc0,0xf4,0x40,0x04,0x00,0xf4,0x00,0x94,0x20,0xf4,0x20,0x93,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0xF7,0xC0,0x00,0x40,0xF0,0x40,0x07, + 0xC0,0xF4,0x40,0x04,0x00,0xF4,0x00,0x94,0x20,0xF4,0x20,0x93,0xE0}; const u8g_fntpgm_uint8_t fontpage_276_173_173[45] U8G_FONT_SECTION("fontpage_276_173_173") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0xf4,0x80,0x04,0x80,0xf4,0xe0,0x08, - 0x00,0xf7,0xc0,0x04,0x40,0xf2,0x80,0x91,0x00,0xf2,0x80,0x9c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0x80,0xF4,0x80,0x04,0x80,0xF4,0xE0,0x08, + 0x00,0xF7,0xC0,0x04,0x40,0xF2,0x80,0x91,0x00,0xF2,0x80,0x9C,0x60}; const u8g_fntpgm_uint8_t fontpage_276_230_230[45] U8G_FONT_SECTION("fontpage_276_230_230") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe6,0xe6,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0xf0,0xa0,0x0f,0xe0,0xf0,0x80,0x07, - 0x80,0xf2,0x80,0x02,0x80,0xf2,0x80,0x93,0xa0,0xfc,0x60,0x90,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE6,0xE6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0xF0,0xA0,0x0F,0xE0,0xF0,0x80,0x07, + 0x80,0xF2,0x80,0x02,0x80,0xF2,0x80,0x93,0xA0,0xFC,0x60,0x90,0x20}; const u8g_fntpgm_uint8_t fontpage_277_141_141[45] U8G_FONT_SECTION("fontpage_277_141_141") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xe0,0xf9,0x20,0x05,0x20,0xf5,0x20,0x02, - 0xe0,0xf4,0x40,0x03,0x00,0xf2,0xa0,0x96,0x20,0xfa,0x40,0x91,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xE0,0xF9,0x20,0x05,0x20,0xF5,0x20,0x02, + 0xE0,0xF4,0x40,0x03,0x00,0xF2,0xA0,0x96,0x20,0xFA,0x40,0x91,0xC0}; const u8g_fntpgm_uint8_t fontpage_277_164_164[45] U8G_FONT_SECTION("fontpage_277_164_164") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0xf4,0x40,0x04,0x40,0xf7,0xc0,0x00, - 0x00,0xf7,0xc0,0x01,0x00,0xff,0xe0,0x92,0x80,0xf4,0x40,0x98,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0xF4,0x40,0x04,0x40,0xF7,0xC0,0x00, + 0x00,0xF7,0xC0,0x01,0x00,0xFF,0xE0,0x92,0x80,0xF4,0x40,0x98,0x20}; const u8g_fntpgm_uint8_t fontpage_277_191_191[45] U8G_FONT_SECTION("fontpage_277_191_191") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xe0,0xf4,0x20,0x05,0x20,0xf7,0xa0,0x05, - 0x20,0xf7,0xe0,0x04,0x20,0xf7,0xa0,0x96,0xa0,0xf7,0xa0,0x98,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xE0,0xF4,0x20,0x05,0x20,0xF7,0xA0,0x05, + 0x20,0xF7,0xE0,0x04,0x20,0xF7,0xA0,0x96,0xA0,0xF7,0xA0,0x98,0x60}; const u8g_fntpgm_uint8_t fontpage_277_203_203[45] U8G_FONT_SECTION("fontpage_277_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0xff,0xe0,0x01,0x00,0xf7,0xc0,0x01, - 0x00,0xff,0xe0,0x04,0x40,0xf7,0xc0,0x94,0x40,0xf7,0xc0,0x94,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0xFF,0xE0,0x01,0x00,0xF7,0xC0,0x01, + 0x00,0xFF,0xE0,0x04,0x40,0xF7,0xC0,0x94,0x40,0xF7,0xC0,0x94,0x40}; const u8g_fntpgm_uint8_t fontpage_278_240_240[45] U8G_FONT_SECTION("fontpage_278_240_240") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x40,0xff,0xe0,0x01,0x00,0xf7,0xc0,0x01, - 0x00,0xff,0xe0,0x04,0xa0,0xff,0xe0,0x94,0xa0,0xfe,0x40,0x95,0xa0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x40,0xFF,0xE0,0x01,0x00,0xF7,0xC0,0x01, + 0x00,0xFF,0xE0,0x04,0xA0,0xFF,0xE0,0x94,0xA0,0xFE,0x40,0x95,0xA0}; const u8g_fntpgm_uint8_t fontpage_279_128_128[45] U8G_FONT_SECTION("fontpage_279_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0xff,0xe0,0x01,0x00,0xff,0xe0,0x0a, - 0xa0,0xff,0xe0,0x04,0x40,0xf7,0xc0,0x94,0x40,0xf7,0xc0,0x9c,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0xFF,0xE0,0x01,0x00,0xFF,0xE0,0x0A, + 0xA0,0xFF,0xE0,0x04,0x40,0xF7,0xC0,0x94,0x40,0xF7,0xC0,0x9C,0x60}; const u8g_fntpgm_uint8_t fontpage_279_138_138[45] U8G_FONT_SECTION("fontpage_279_138_138") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x40,0xae,0xa0,0x40,0x40,0xae,0xa0,0xea, - 0xe0,0x5e,0x40,0xa0,0xa0,0x1f,0xc0,0x69,0x00,0x06,0x00,0x79,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x40,0xAE,0xA0,0x40,0x40,0xAE,0xA0,0xEA, + 0xE0,0x5E,0x40,0xA0,0xA0,0x1F,0xC0,0x69,0x00,0x06,0x00,0x79,0xE0}; const u8g_fntpgm_uint8_t fontpage_281_199_199[45] U8G_FONT_SECTION("fontpage_281_199_199") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x88,0x00,0x5f,0xc0,0x22,0x40,0xff,0x00,0x61, - 0xc0,0x3f,0x00,0x21,0x00,0x3f,0x00,0x21,0x00,0x3f,0x00,0xe1,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x88,0x00,0x5F,0xC0,0x22,0x40,0xFF,0x00,0x61, + 0xC0,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0xE1,0xC0}; const u8g_fntpgm_uint8_t fontpage_283_221_221[45] U8G_FONT_SECTION("fontpage_283_221_221") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xe0,0x4a,0x00,0x4a,0x00,0x7b,0xe0,0x12, - 0x20,0x52,0x20,0x5a,0x20,0x53,0xe0,0x52,0x00,0x5e,0x00,0xe3,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7B,0xE0,0x4A,0x00,0x4A,0x00,0x7B,0xE0,0x12, + 0x20,0x52,0x20,0x5A,0x20,0x53,0xE0,0x52,0x00,0x5E,0x00,0xE3,0xE0}; const u8g_fntpgm_uint8_t fontpage_285_202_202[45] U8G_FONT_SECTION("fontpage_285_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x24, - 0x80,0x3f,0x80,0x24,0x80,0x3f,0x80,0x04,0x00,0xff,0xe0,0x04,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x24, + 0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00}; const u8g_fntpgm_uint8_t fontpage_285_223_223[45] U8G_FONT_SECTION("fontpage_285_223_223") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xfa,0x00,0x23,0xe0,0xfd,0x20,0xa9, - 0x40,0xf9,0x00,0xa9,0x00,0xf9,0x80,0x22,0x80,0xfa,0x40,0x24,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xFA,0x00,0x23,0xE0,0xFD,0x20,0xA9, + 0x40,0xF9,0x00,0xA9,0x00,0xF9,0x80,0x22,0x80,0xFA,0x40,0x24,0x20}; const u8g_fntpgm_uint8_t fontpage_285_248_248[45] U8G_FONT_SECTION("fontpage_285_248_248") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xf8,0x80,0x23,0xe0,0xfa,0xa0,0xaa, - 0xa0,0xfa,0xa0,0xab,0xe0,0xfa,0xa0,0x22,0xa0,0xfb,0xe0,0x22,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0xF8,0x80,0x23,0xE0,0xFA,0xA0,0xAA, + 0xA0,0xFA,0xA0,0xAB,0xE0,0xFA,0xA0,0x22,0xA0,0xFB,0xE0,0x22,0x20}; const u8g_fntpgm_uint8_t fontpage_286_137_137[45] U8G_FONT_SECTION("fontpage_286_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x80,0x7d,0x40,0x11,0x00,0xff,0xe0,0x11, - 0x00,0xff,0x20,0x55,0x40,0x7c,0x80,0x54,0xa0,0xff,0x60,0x12,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x80,0x7D,0x40,0x11,0x00,0xFF,0xE0,0x11, + 0x00,0xFF,0x20,0x55,0x40,0x7C,0x80,0x54,0xA0,0xFF,0x60,0x12,0x20}; const u8g_fntpgm_uint8_t fontpage_286_175_175[45] U8G_FONT_SECTION("fontpage_286_175_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0xfa,0x40,0x23,0xc0,0xf8,0x00,0xaf, - 0xe0,0xfa,0x40,0xab,0xc0,0xfa,0x40,0x22,0xe0,0xff,0x40,0x20,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xC0,0xFA,0x40,0x23,0xC0,0xF8,0x00,0xAF, + 0xE0,0xFA,0x40,0xAB,0xC0,0xFA,0x40,0x22,0xE0,0xFF,0x40,0x20,0x40}; const u8g_fntpgm_uint8_t fontpage_286_184_184[45] U8G_FONT_SECTION("fontpage_286_184_184") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb8,0xb8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xfa,0x80,0x24,0x60,0xfb,0x80,0xae, - 0x20,0xfa,0xa0,0xae,0xa0,0xfa,0xa0,0x2e,0xa0,0xfa,0x20,0x2a,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB8,0xB8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xFA,0x80,0x24,0x60,0xFB,0x80,0xAE, + 0x20,0xFA,0xA0,0xAE,0xA0,0xFA,0xA0,0x2E,0xA0,0xFA,0x20,0x2A,0x60}; const u8g_fntpgm_uint8_t fontpage_286_201_201[45] U8G_FONT_SECTION("fontpage_286_201_201") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xff,0xe0,0x25,0x40,0xff,0xc0,0xad, - 0x40,0xff,0xc0,0xa9,0x60,0xff,0xe0,0x24,0x40,0xfa,0x40,0x20,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xFF,0xE0,0x25,0x40,0xFF,0xC0,0xAD, + 0x40,0xFF,0xC0,0xA9,0x60,0xFF,0xE0,0x24,0x40,0xFA,0x40,0x20,0xC0}; const u8g_fntpgm_uint8_t fontpage_287_209_209[45] U8G_FONT_SECTION("fontpage_287_209_209") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x24,0x00,0x07,0xe0,0xe4, - 0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x24,0x00,0x07,0xE0,0xE4, + 0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xe0,0xe6, - 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xE0,0xE6, + 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x8f,0xc0,0x48,0x40,0x4f,0xc0,0x08,0x40,0xcf, - 0xc0,0x48,0x00,0x4b,0x40,0x48,0x80,0x4e,0x40,0xb0,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x8F,0xC0,0x48,0x40,0x4F,0xC0,0x08,0x40,0xCF, + 0xC0,0x48,0x00,0x4B,0x40,0x48,0x80,0x4E,0x40,0xB0,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_159_159") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x3f,0xe0,0x21,0x00,0x0f,0xe0,0xe9, - 0x20,0x2f,0xe0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x3F,0xE0,0x21,0x00,0x0F,0xE0,0xE9, + 0x20,0x2F,0xE0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_163_163[45] U8G_FONT_SECTION("fontpage_288_163_163") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x25,0x40,0x07,0xc0,0xe5, - 0x40,0x27,0xc0,0x21,0x00,0x2f,0xe0,0x21,0x00,0x50,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x25,0x40,0x07,0xC0,0xE5, + 0x40,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x21,0x00,0x50,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_178_178[45] U8G_FONT_SECTION("fontpage_288_178_178") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x43,0x00,0x24,0x80,0x27,0xe0,0x0c,0x80,0xf7, - 0xe0,0x24,0x80,0x27,0xe0,0x24,0x80,0x27,0xe0,0x54,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x43,0x00,0x24,0x80,0x27,0xE0,0x0C,0x80,0xF7, + 0xE0,0x24,0x80,0x27,0xE0,0x24,0x80,0x27,0xE0,0x54,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_203_203[45] U8G_FONT_SECTION("fontpage_288_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x29,0x20,0x2f,0xe0,0x05,0x40,0xe7, - 0xc0,0x25,0x40,0x27,0xc0,0x21,0x00,0x2f,0xe0,0x51,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x29,0x20,0x2F,0xE0,0x05,0x40,0xE7, + 0xC0,0x25,0x40,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x51,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_212_212[45] U8G_FONT_SECTION("fontpage_288_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x27,0xc0,0x21,0x00,0x0f,0xe0,0xe2, - 0x80,0x2f,0xe0,0x21,0x00,0x2f,0xe0,0x21,0x00,0x51,0x00,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x27,0xC0,0x21,0x00,0x0F,0xE0,0xE2, + 0x80,0x2F,0xE0,0x21,0x00,0x2F,0xE0,0x21,0x00,0x51,0x00,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_288_248_248[45] U8G_FONT_SECTION("fontpage_288_248_248") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4e,0xe0,0x2a,0xa0,0x2e,0xe0,0x08,0x80,0xea, - 0xa0,0x2f,0xe0,0x22,0x80,0x2f,0xe0,0x22,0x40,0x54,0x20,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4E,0xE0,0x2A,0xA0,0x2E,0xE0,0x08,0x80,0xEA, + 0xA0,0x2F,0xE0,0x22,0x80,0x2F,0xE0,0x22,0x40,0x54,0x20,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_289_132_132[45] U8G_FONT_SECTION("fontpage_289_132_132") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x9f,0xc0,0x55,0x40,0x5f,0xc0,0x00,0x00,0xff, - 0xe0,0x28,0x80,0x2f,0xa0,0x27,0x40,0x2a,0x80,0x52,0x40,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x9F,0xC0,0x55,0x40,0x5F,0xC0,0x00,0x00,0xFF, + 0xE0,0x28,0x80,0x2F,0xA0,0x27,0x40,0x2A,0x80,0x52,0x40,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_289_138_138[45] U8G_FONT_SECTION("fontpage_289_138_138") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x2f,0xc0,0x28,0x40,0x1f,0xe0,0xf4, - 0xa0,0x29,0x40,0x3f,0xe0,0x22,0x00,0x27,0xc0,0x58,0xc0,0x8f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x2F,0xC0,0x28,0x40,0x1F,0xE0,0xF4, + 0xA0,0x29,0x40,0x3F,0xE0,0x22,0x00,0x27,0xC0,0x58,0xC0,0x8F,0xE0}; const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_232_232") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x20,0x45,0x20,0x29,0x40,0xff, - 0x80,0x01,0x40,0x7d,0x20,0x45,0x20,0x45,0xa0,0x7d,0x40,0x45,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xE0,0xFF,0x20,0x45,0x20,0x29,0x40,0xFF, + 0x80,0x01,0x40,0x7D,0x20,0x45,0x20,0x45,0xA0,0x7D,0x40,0x45,0x00}; const u8g_fntpgm_uint8_t fontpage_291_203_203[45] U8G_FONT_SECTION("fontpage_291_203_203") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x2a,0xa0,0xaf,0xe0,0x71,0x00,0xff, - 0xe0,0x22,0x80,0x77,0xe0,0x69,0x00,0xa7,0xe0,0xa1,0x00,0x21,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x2A,0xA0,0xAF,0xE0,0x71,0x00,0xFF, + 0xE0,0x22,0x80,0x77,0xE0,0x69,0x00,0xA7,0xE0,0xA1,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x24,0x80,0x3f, - 0x80,0x24,0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x24,0x80,0x3F, + 0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_207_207") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, - 0xe0,0x24,0x80,0x3f,0x80,0x24,0x80,0x7f,0xc0,0x04,0x00,0xff,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, + 0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; const u8g_fntpgm_uint8_t fontpage_291_221_221[45] U8G_FONT_SECTION("fontpage_291_221_221") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x50,0x80,0x88,0x80,0x78,0x80,0x27, - 0xe0,0xf8,0x80,0x20,0x80,0xa8,0x80,0x70,0x80,0x38,0x80,0xc0,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x50,0x80,0x88,0x80,0x78,0x80,0x27, + 0xE0,0xF8,0x80,0x20,0x80,0xA8,0x80,0x70,0x80,0x38,0x80,0xC0,0x80}; const u8g_fntpgm_uint8_t fontpage_292_149_149[45] U8G_FONT_SECTION("fontpage_292_149_149") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x31,0x40,0x49,0x40,0xf9,0x40,0x21, - 0x40,0xff,0xc0,0x22,0x40,0xaa,0x40,0x72,0x40,0x3a,0x40,0xc7,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x31,0x40,0x49,0x40,0xF9,0x40,0x21, + 0x40,0xFF,0xC0,0x22,0x40,0xAA,0x40,0x72,0x40,0x3A,0x40,0xC7,0xE0}; const u8g_fntpgm_uint8_t fontpage_294_175_175[45] U8G_FONT_SECTION("fontpage_294_175_175") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x40,0x57,0xe0,0x8a,0x40,0x7a,0x40,0x27, - 0xe0,0xf8,0x00,0x23,0xe0,0xaa,0x20,0x73,0xe0,0x3a,0x20,0xe3,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x40,0x57,0xE0,0x8A,0x40,0x7A,0x40,0x27, + 0xE0,0xF8,0x00,0x23,0xE0,0xAA,0x20,0x73,0xE0,0x3A,0x20,0xE3,0xE0}; const u8g_fntpgm_uint8_t fontpage_294_245_245[45] U8G_FONT_SECTION("fontpage_294_245_245") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2c,0x80,0x25,0xe0,0x54,0xa0,0xfb,0xe0,0x2c, - 0xa0,0xf7,0xe0,0x24,0x80,0xb7,0xe0,0x6c,0x80,0x34,0x80,0xcb,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF5,0xF5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2C,0x80,0x25,0xE0,0x54,0xA0,0xFB,0xE0,0x2C, + 0xA0,0xF7,0xE0,0x24,0x80,0xB7,0xE0,0x6C,0x80,0x34,0x80,0xCB,0xE0}; const u8g_fntpgm_uint8_t fontpage_298_247_247[45] U8G_FONT_SECTION("fontpage_298_247_247") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x3f,0x80,0x20,0x00,0x3f,0x00,0x20,0x00,0x3f, - 0x00,0x20,0x00,0xff,0xc0,0x24,0x80,0x23,0x00,0x29,0x00,0x30,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x3F, + 0x00,0x20,0x00,0xFF,0xC0,0x24,0x80,0x23,0x00,0x29,0x00,0x30,0xC0}; const u8g_fntpgm_uint8_t fontpage_299_137_137[45] U8G_FONT_SECTION("fontpage_299_137_137") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, - 0xe0,0x82,0x20,0xbf,0xa0,0x8a,0x20,0x92,0x20,0xa2,0x20,0x86,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, + 0xE0,0x82,0x20,0xBF,0xA0,0x8A,0x20,0x92,0x20,0xA2,0x20,0x86,0xE0}; const u8g_fntpgm_uint8_t fontpage_299_139_139[45] U8G_FONT_SECTION("fontpage_299_139_139") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, - 0xe0,0x80,0x20,0x9f,0x20,0x8a,0x20,0xbf,0xa0,0x8a,0x20,0x92,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, + 0xE0,0x80,0x20,0x9F,0x20,0x8A,0x20,0xBF,0xA0,0x8A,0x20,0x92,0xE0}; const u8g_fntpgm_uint8_t fontpage_299_147_147[45] U8G_FONT_SECTION("fontpage_299_147_147") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, - 0xe0,0x9f,0x20,0x91,0x20,0x9f,0x20,0x91,0x20,0x9f,0x20,0x80,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, + 0xE0,0x9F,0x20,0x91,0x20,0x9F,0x20,0x91,0x20,0x9F,0x20,0x80,0xE0}; const u8g_fntpgm_uint8_t fontpage_299_220_220[45] U8G_FONT_SECTION("fontpage_299_220_220") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xf5, - 0xe0,0xaa,0xa0,0xbb,0xa0,0xaa,0xa0,0xbb,0xa0,0x8a,0x20,0xb2,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xF5, + 0xE0,0xAA,0xA0,0xBB,0xA0,0xAA,0xA0,0xBB,0xA0,0x8A,0x20,0xB2,0x60}; const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6, - 0x60,0x91,0x00,0x97,0xe0,0xd5,0x00,0xaf,0xe0,0x81,0x00,0x81,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF2,0x00,0x93,0xE0,0xA6,0x40,0xC1,0x80,0xA6, + 0x60,0x91,0x00,0x97,0xE0,0xD5,0x00,0xAF,0xE0,0x81,0x00,0x81,0x00}; const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1, - 0x00,0x9f,0xe0,0x91,0x00,0xe5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF1,0x00,0x92,0x80,0xA4,0x40,0xCB,0xA0,0xA1, + 0x00,0x9F,0xE0,0x91,0x00,0xE5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; const u8g_fntpgm_uint8_t fontpage_301_142_142[45] U8G_FONT_SECTION("fontpage_301_142_142") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf8,0x80,0x98,0xa0,0xae,0xc0,0xc8,0xa0,0xae, - 0xe0,0x92,0x00,0x97,0xc0,0xf4,0x40,0xa7,0xc0,0x84,0x40,0x87,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8E,0x8E,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF8,0x80,0x98,0xA0,0xAE,0xC0,0xC8,0xA0,0xAE, + 0xE0,0x92,0x00,0x97,0xC0,0xF4,0x40,0xA7,0xC0,0x84,0x40,0x87,0xC0}; const u8g_fntpgm_uint8_t fontpage_301_217_217[45] U8G_FONT_SECTION("fontpage_301_217_217") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x3f,0xe0,0x6a,0x80,0xbf,0xc0,0x2a, - 0x80,0x3f,0xe0,0x00,0x00,0x3f,0xc0,0x08,0x80,0x07,0x00,0x78,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2A,0x80,0x3F,0xE0,0x6A,0x80,0xBF,0xC0,0x2A, + 0x80,0x3F,0xE0,0x00,0x00,0x3F,0xC0,0x08,0x80,0x07,0x00,0x78,0xE0}; const u8g_fntpgm_uint8_t fontpage_301_226_226[45] U8G_FONT_SECTION("fontpage_301_226_226") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x80,0xfd,0x40,0x55,0xe0,0x6f,0x40,0x55, - 0xe0,0x7d,0x40,0x21,0x40,0xfd,0xe0,0xad,0x40,0xb5,0x40,0x8d,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x80,0xFD,0x40,0x55,0xE0,0x6F,0x40,0x55, + 0xE0,0x7D,0x40,0x21,0x40,0xFD,0xE0,0xAD,0x40,0xB5,0x40,0x8D,0xE0}; const u8g_fntpgm_uint8_t fontpage_301_251_251[45] U8G_FONT_SECTION("fontpage_301_251_251") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0xa4,0xa0,0x7f, - 0xc0,0x44,0x40,0x7f,0xc0,0x44,0x40,0x7f,0xc0,0x04,0x20,0x07,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0xA4,0xA0,0x7F, + 0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x04,0x20,0x07,0xE0}; const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, - 0x00,0xff,0xe0,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04, + 0x00,0xFF,0xE0,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80}; const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_222_222") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a, - 0x00,0x7b,0xc0,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x0A, + 0x00,0x7B,0xC0,0x0A,0x00,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x0A,0x00}; const u8g_fntpgm_uint8_t fontpage_302_226_226[45] U8G_FONT_SECTION("fontpage_302_226_226") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, - 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x08,0x00,0x10,0x00,0xff,0xc0,0x92, - 0x40,0x9e,0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0xff,0xc0,0x80,0x40}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x08,0x00,0x10,0x00,0xFF,0xC0,0x92, + 0x40,0x9E,0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0xFF,0xC0,0x80,0x40}; const u8g_fntpgm_uint8_t fontpage_304_133_133[45] U8G_FONT_SECTION("fontpage_304_133_133") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x27,0xe0,0x24,0x20,0x27, - 0xe0,0x24,0x20,0x3f,0xe0,0xc4,0x20,0x07,0xe0,0x02,0x40,0x0c,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF9,0x00,0x27,0xE0,0x24,0x20,0x27, + 0xE0,0x24,0x20,0x3F,0xE0,0xC4,0x20,0x07,0xE0,0x02,0x40,0x0C,0x20}; const u8g_fntpgm_uint8_t fontpage_304_144_144[45] U8G_FONT_SECTION("fontpage_304_144_144") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x91,0x00,0x67,0xc0,0x24,0x40,0xff, - 0xc0,0x24,0x40,0x27,0xc0,0x24,0x40,0x27,0xc0,0x22,0x80,0xec,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x91,0x00,0x67,0xC0,0x24,0x40,0xFF, + 0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x22,0x80,0xEC,0x60}; const u8g_fntpgm_uint8_t fontpage_304_205_205[45] U8G_FONT_SECTION("fontpage_304_205_205") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xe0,0xfc,0x80,0xa7,0xe0,0x3a,0x20,0x4b, - 0xe0,0xb2,0x20,0x4b,0xe0,0xfe,0x20,0x4b,0xe0,0x79,0x40,0x4e,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xE0,0xFC,0x80,0xA7,0xE0,0x3A,0x20,0x4B, + 0xE0,0xB2,0x20,0x4B,0xE0,0xFE,0x20,0x4B,0xE0,0x79,0x40,0x4E,0x20}; const u8g_fntpgm_uint8_t fontpage_304_222_222[45] U8G_FONT_SECTION("fontpage_304_222_222") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xab,0xe0,0x70,0x80,0x23,0xe0,0xfa,0x20,0x73, - 0xe0,0xaa,0x20,0x23,0xe0,0xfa,0x20,0x23,0xe0,0x51,0x40,0x8e,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xAB,0xE0,0x70,0x80,0x23,0xE0,0xFA,0x20,0x73, + 0xE0,0xAA,0x20,0x23,0xE0,0xFA,0x20,0x23,0xE0,0x51,0x40,0x8E,0x20}; const u8g_fntpgm_uint8_t fontpage_305_168_168[45] U8G_FONT_SECTION("fontpage_305_168_168") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xc0,0x21,0x40,0x2e,0x40,0x24,0x40,0x3f, - 0x40,0x35,0x40,0x3f,0x40,0x25,0x40,0x27,0x60,0x5c,0xa0,0x88,0x20}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xC0,0x21,0x40,0x2E,0x40,0x24,0x40,0x3F, + 0x40,0x35,0x40,0x3F,0x40,0x25,0x40,0x27,0x60,0x5C,0xA0,0x88,0x20}; const u8g_fntpgm_uint8_t fontpage_305_253_253[45] U8G_FONT_SECTION("fontpage_305_253_253") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x52,0x00,0xab,0xe0,0xfc,0x20,0x8b, - 0xa0,0xfa,0xa0,0x8b,0xa0,0xfa,0x40,0x92,0x20,0xaa,0x20,0xc9,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x52,0x00,0xAB,0xE0,0xFC,0x20,0x8B, + 0xA0,0xFA,0xA0,0x8B,0xA0,0xFA,0x40,0x92,0x20,0xAA,0x20,0xC9,0xE0}; const u8g_fntpgm_uint8_t fontpage_306_152_152[45] U8G_FONT_SECTION("fontpage_306_152_152") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x52,0x80,0xac,0x40,0xf8,0x20,0x8f, - 0xc0,0xf9,0x00,0x8f,0xe0,0xf9,0x00,0x95,0x40,0xb9,0x20,0xcb,0x00}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x52,0x80,0xAC,0x40,0xF8,0x20,0x8F, + 0xC0,0xF9,0x00,0x8F,0xE0,0xF9,0x00,0x95,0x40,0xB9,0x20,0xCB,0x00}; const u8g_fntpgm_uint8_t fontpage_307_172_172[45] U8G_FONT_SECTION("fontpage_307_172_172") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xc0,0x24,0x00,0x3f,0x80,0x24,0x00,0x3f, - 0x80,0x24,0x00,0x3f,0xe0,0x00,0x20,0x55,0x20,0x4a,0xa0,0x8a,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xC0,0x24,0x00,0x3F,0x80,0x24,0x00,0x3F, + 0x80,0x24,0x00,0x3F,0xE0,0x00,0x20,0x55,0x20,0x4A,0xA0,0x8A,0xC0}; const u8g_fntpgm_uint8_t fontpage_308_197_197[45] U8G_FONT_SECTION("fontpage_308_197_197") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x54,0x00,0x7d,0xc0,0x55,0x40,0x7d, - 0xc0,0x54,0x00,0x7f,0xe0,0x5e,0xa0,0xaf,0xe0,0xac,0x00,0x17,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x54,0x00,0x7D,0xC0,0x55,0x40,0x7D, + 0xC0,0x54,0x00,0x7F,0xE0,0x5E,0xA0,0xAF,0xE0,0xAC,0x00,0x17,0xE0}; const u8g_fntpgm_uint8_t fontpage_309_212_212[45] U8G_FONT_SECTION("fontpage_309_212_212") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x79,0x40,0x6b,0xe0,0x5a,0xa0,0xff,0xe0,0x86, - 0xa0,0x7f,0xe0,0x4a,0x40,0x7b,0xc0,0x4a,0x40,0x79,0x80,0x4f,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x79,0x40,0x6B,0xE0,0x5A,0xA0,0xFF,0xE0,0x86, + 0xA0,0x7F,0xE0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x79,0x80,0x4F,0xE0}; const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x1f,0x00,0x11, - 0x00,0x7f,0xc0,0x40,0x40,0x5f,0x40,0x51,0x40,0x5f,0x40,0x40,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x1F,0x00,0x11, + 0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0}; const u8g_fntpgm_uint8_t fontpage_317_195_195[45] U8G_FONT_SECTION("fontpage_317_195_195") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x1f,0x00,0x00, - 0x00,0xff,0xe0,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80,0xc0,0x60}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x11,0x00,0x1F,0x00,0x00, + 0x00,0xFF,0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0xC0,0x60}; const u8g_fntpgm_uint8_t fontpage_317_222_222[45] U8G_FONT_SECTION("fontpage_317_222_222") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf8,0x80,0xa8,0x80,0xf8,0xe0,0xa8,0x80,0xf8, - 0x80,0x23,0xe0,0xfa,0x20,0x22,0x20,0xfa,0x20,0x52,0x20,0xab,0xe0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF8,0x80,0xA8,0x80,0xF8,0xE0,0xA8,0x80,0xF8, + 0x80,0x23,0xE0,0xFA,0x20,0x22,0x20,0xFA,0x20,0x52,0x20,0xAB,0xE0}; const u8g_fntpgm_uint8_t fontpage_318_202_202[45] U8G_FONT_SECTION("fontpage_318_202_202") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x0a,0x40,0xf5,0x80,0x55, - 0x40,0x95,0xa0,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0xc0,0x80}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x0A,0x40,0xF5,0x80,0x55, + 0x40,0x95,0xA0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xC0,0x80}; const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x08,0x00,0x00, - 0x00,0x02,0x07,0x07,0x0c,0x06,0x01,0xc0,0xc0,0x00,0x00,0x00,0xc0,0xc0}; + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x08,0x00,0x00, + 0x00,0x02,0x07,0x07,0x0C,0x06,0x01,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h index 85e76444d4..70be70eab7 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h @@ -86,5 +86,5 @@ void ST7920_SWSPI_SND_8BIT(uint8_t val); #define ST7920_NCS() { WRITE(ST7920_CS_PIN,0); } #define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); U8G_DELAY(); } #define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); U8G_DELAY(); } -#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4u)); U8G_DELAY(); } +#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4U)); U8G_DELAY(); } #define ST7920_WRITE_BYTES(p,l) { for (uint8_t i = l + 1; --i;) { ST7920_SWSPI_SND_8BIT(*p&0xF0); ST7920_SWSPI_SND_8BIT(*p<<4); p++; } U8G_DELAY(); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index a70268254f..bb95411e06 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -1060,11 +1060,11 @@ void CLCD::init() { delay(40); // FTDI/BRT recommendation: no SPI traffic during startup. EVE needs at the very least 45ms to start, so leave her alone for a little while. - /* read the device-id until it returns 0x7c or times out, should take less than 150ms */ + /* read the device-id until it returns 0x7C or times out, should take less than 150ms */ uint8_t counter; for (counter = 0; counter < 250; counter++) { uint8_t device_id = mem_read_8(REG::ID); // Read Device ID, Should Be 0x7C; - if (device_id == 0x7c) { + if (device_id == 0x7C) { #if ENABLED(TOUCH_UI_DEBUG) SERIAL_ECHO_MSG("FTDI chip initialized "); #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h index 11151a5741..4063bf2d5d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h @@ -63,7 +63,7 @@ namespace FTDI { static constexpr uint32_t RAM_REG = 0x102400; // Registers static constexpr uint32_t RAM_CMD = 0x108000; // Command Buffer - static constexpr uint32_t RAM_G_SIZE = 256*1024l; // 256k + static constexpr uint32_t RAM_G_SIZE = 256*1024L; // 256k }; struct ft800_registers { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h index 7e3165c266..448717b478 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h @@ -61,7 +61,7 @@ namespace FTDI { static constexpr uint32_t RAM_REG = 0x302000; // Registers static constexpr uint32_t RAM_CMD = 0x308000; // Command Buffer - static constexpr uint32_t RAM_G_SIZE = 1024*1024l; // 1024k + static constexpr uint32_t RAM_G_SIZE = 1024*1024L; // 1024k }; struct ft810_registers { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h index 2429e30e79..8d455907e9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h @@ -60,12 +60,12 @@ constexpr uint16_t Hoffset = 70; constexpr uint16_t Hcycle = 408; - constexpr uint32_t default_transform_a = 0x000054ad; - constexpr uint32_t default_transform_b = 0xffffff52; - constexpr uint32_t default_transform_c = 0xfff7f6e4; + constexpr uint32_t default_transform_a = 0x000054AD; + constexpr uint32_t default_transform_b = 0xFFFFFF52; + constexpr uint32_t default_transform_c = 0xFFF7F6E4; constexpr uint32_t default_transform_d = 0x00000065; - constexpr uint32_t default_transform_e = 0xffffbe3b; - constexpr uint32_t default_transform_f = 0x00f68e75; + constexpr uint32_t default_transform_e = 0xFFFFBE3B; + constexpr uint32_t default_transform_f = 0x00F68E75; } #elif defined(TOUCH_UI_480x272) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h index 37e03238e0..3426e1377d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h @@ -30,1286 +30,1286 @@ const unsigned char font[] PROGMEM = { /* 0 GRAVE */ - 0x76, 0x00, 0x01, 0x08, 0x01, 0xee, 0x01, 0xe5, 0x11, 0x00, 0x01, 0xaf, - 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, - 0x10, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xf9, 0x11, 0x00, 0x01, 0x2e, - 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf2, - 0x11, 0x00, 0x01, 0x5f, 0x01, 0xfd, 0x11, 0x00, 0x01, 0x06, 0x01, 0x99, - 0x01, 0x40, 0xff, 0x00, 0xff, 0x00, 0xa4, 0x00, + 0x76, 0x00, 0x01, 0x08, 0x01, 0xEE, 0x01, 0xE5, 0x11, 0x00, 0x01, 0xAF, + 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xD0, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF9, 0x11, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF2, + 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFD, 0x11, 0x00, 0x01, 0x06, 0x01, 0x99, + 0x01, 0x40, 0xFF, 0x00, 0xFF, 0x00, 0xA4, 0x00, /* 1 ACUTE */ - 0x7b, 0x00, 0x01, 0x9e, 0x01, 0xee, 0x01, 0x50, 0x0f, 0x00, 0x01, 0x05, - 0x01, 0xff, 0x01, 0xf8, 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x09, 0x01, 0xff, - 0x01, 0xd1, 0x10, 0x00, 0x01, 0x4f, 0x01, 0xfe, 0x01, 0x20, 0x0f, 0x00, - 0x01, 0x01, 0x01, 0xef, 0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xaa, - 0x01, 0x40, 0xff, 0x00, 0xff, 0x00, 0xa5, 0x00, + 0x7B, 0x00, 0x01, 0x9E, 0x01, 0xEE, 0x01, 0x50, 0x0F, 0x00, 0x01, 0x05, + 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x09, 0x01, 0xFF, + 0x01, 0xD1, 0x10, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, + 0x01, 0x01, 0x01, 0xEF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xAA, + 0x01, 0x40, 0xFF, 0x00, 0xFF, 0x00, 0xA5, 0x00, /* 2 CIRCUMFLEX */ - 0x79, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x07, 0x02, 0xff, - 0x01, 0x60, 0x0f, 0x00, 0x01, 0x2f, 0x02, 0xff, 0x01, 0xf2, 0x0f, 0x00, - 0x01, 0xcf, 0x01, 0xf6, 0x01, 0x6f, 0x01, 0xfb, 0x0e, 0x00, 0x01, 0x06, - 0x01, 0xff, 0x01, 0xa0, 0x01, 0x0a, 0x01, 0xff, 0x01, 0x60, 0x0d, 0x00, - 0x01, 0x1f, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xf1, - 0x0d, 0x00, 0x01, 0xbf, 0x01, 0xf3, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xfb, - 0x0c, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x50, 0x02, 0x00, 0x01, 0x05, - 0x01, 0x99, 0x01, 0x20, 0xff, 0x00, 0xff, 0x00, 0xa2, 0x00, + 0x79, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x07, 0x02, 0xFF, + 0x01, 0x60, 0x0F, 0x00, 0x01, 0x2F, 0x02, 0xFF, 0x01, 0xF2, 0x0F, 0x00, + 0x01, 0xCF, 0x01, 0xF6, 0x01, 0x6F, 0x01, 0xFB, 0x0E, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x60, 0x0D, 0x00, + 0x01, 0x1F, 0x01, 0xFD, 0x01, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF1, + 0x0D, 0x00, 0x01, 0xBF, 0x01, 0xF3, 0x02, 0x00, 0x01, 0x3F, 0x01, 0xFB, + 0x0C, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x50, 0x02, 0x00, 0x01, 0x05, + 0x01, 0x99, 0x01, 0x20, 0xFF, 0x00, 0xFF, 0x00, 0xA2, 0x00, /* 3 TILDE */ - 0x7c, 0x00, 0x01, 0x11, 0x0d, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xc3, - 0x02, 0x00, 0x01, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0xaf, 0x02, 0xff, - 0x01, 0x50, 0x01, 0x01, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x02, - 0x01, 0xff, 0x01, 0xd9, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x07, 0x01, 0xff, - 0x01, 0x40, 0x0b, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0x20, 0x01, 0x3e, - 0x02, 0xff, 0x01, 0xfd, 0x0c, 0x00, 0x01, 0x09, 0x01, 0xfe, 0x01, 0x00, - 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x07, - 0x01, 0xa8, 0x02, 0x00, 0x01, 0x06, 0x01, 0x98, 0x01, 0x20, 0xff, 0x00, - 0xff, 0x00, 0xb6, 0x00, + 0x7C, 0x00, 0x01, 0x11, 0x0D, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xC3, + 0x02, 0x00, 0x01, 0xFF, 0x01, 0x80, 0x0C, 0x00, 0x01, 0xAF, 0x02, 0xFF, + 0x01, 0x50, 0x01, 0x01, 0x01, 0xFF, 0x01, 0x60, 0x0B, 0x00, 0x01, 0x02, + 0x01, 0xFF, 0x01, 0xD9, 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0x40, 0x0B, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x3E, + 0x02, 0xFF, 0x01, 0xFD, 0x0C, 0x00, 0x01, 0x09, 0x01, 0xFE, 0x01, 0x00, + 0x01, 0x02, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, 0x01, 0x07, + 0x01, 0xA8, 0x02, 0x00, 0x01, 0x06, 0x01, 0x98, 0x01, 0x20, 0xFF, 0x00, + 0xFF, 0x00, 0xB6, 0x00, /* 4 DIAERESIS */ - 0x8a, 0x00, 0x02, 0x44, 0x02, 0x00, 0x02, 0x44, 0x0d, 0x00, 0x02, 0xff, - 0x01, 0x10, 0x01, 0x01, 0x02, 0xff, 0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, - 0x01, 0x01, 0x02, 0xff, 0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, 0x01, 0x01, - 0x02, 0xff, 0x0d, 0x00, 0x02, 0xcc, 0x01, 0x10, 0x01, 0x01, 0x02, 0xcc, - 0xff, 0x00, 0xff, 0x00, 0xc9, 0x00, + 0x8A, 0x00, 0x02, 0x44, 0x02, 0x00, 0x02, 0x44, 0x0D, 0x00, 0x02, 0xFF, + 0x01, 0x10, 0x01, 0x01, 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, + 0x01, 0x01, 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, 0x01, 0x01, + 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xCC, 0x01, 0x10, 0x01, 0x01, 0x02, 0xCC, + 0xFF, 0x00, 0xFF, 0x00, 0xC9, 0x00, /* 5 DOT_ABOVE / DEGREE_SIGN */ - 0x2d, 0x00, 0x01, 0x13, 0x01, 0x30, 0x10, 0x00, 0x01, 0x2b, 0x02, 0xff, - 0x01, 0xa1, 0x0e, 0x00, 0x01, 0x02, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfd, - 0x01, 0x10, 0x0d, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x94, 0x01, 0x5a, - 0x01, 0xff, 0x01, 0xb0, 0x0d, 0x00, 0x01, 0x4f, 0x01, 0xf7, 0x02, 0x00, - 0x01, 0x9f, 0x01, 0xf2, 0x0d, 0x00, 0x01, 0x8f, 0x01, 0xf0, 0x02, 0x00, - 0x01, 0x2f, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x8f, 0x01, 0xe0, 0x02, 0x00, - 0x01, 0x0f, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x7f, 0x01, 0xf2, 0x02, 0x00, - 0x01, 0x4f, 0x01, 0xf5, 0x0d, 0x00, 0x01, 0x2f, 0x01, 0xfc, 0x01, 0x10, - 0x01, 0x02, 0x01, 0xdf, 0x01, 0xf0, 0x0d, 0x00, 0x01, 0x08, 0x01, 0xff, - 0x01, 0xfb, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0e, 0x00, 0x01, 0x9f, - 0x02, 0xff, 0x01, 0xf8, 0x0f, 0x00, 0x01, 0x03, 0x01, 0x9c, 0x01, 0xc9, - 0x01, 0x30, 0xff, 0x00, 0xff, 0x00, 0xa4, 0x00, + 0x2D, 0x00, 0x01, 0x13, 0x01, 0x30, 0x10, 0x00, 0x01, 0x2B, 0x02, 0xFF, + 0x01, 0xA1, 0x0E, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xFD, + 0x01, 0x10, 0x0D, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x94, 0x01, 0x5A, + 0x01, 0xFF, 0x01, 0xB0, 0x0D, 0x00, 0x01, 0x4F, 0x01, 0xF7, 0x02, 0x00, + 0x01, 0x9F, 0x01, 0xF2, 0x0D, 0x00, 0x01, 0x8F, 0x01, 0xF0, 0x02, 0x00, + 0x01, 0x2F, 0x01, 0xF6, 0x0D, 0x00, 0x01, 0x8F, 0x01, 0xE0, 0x02, 0x00, + 0x01, 0x0F, 0x01, 0xF7, 0x0D, 0x00, 0x01, 0x7F, 0x01, 0xF2, 0x02, 0x00, + 0x01, 0x4F, 0x01, 0xF5, 0x0D, 0x00, 0x01, 0x2F, 0x01, 0xFC, 0x01, 0x10, + 0x01, 0x02, 0x01, 0xDF, 0x01, 0xF0, 0x0D, 0x00, 0x01, 0x08, 0x01, 0xFF, + 0x01, 0xFB, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x60, 0x0E, 0x00, 0x01, 0x9F, + 0x02, 0xFF, 0x01, 0xF8, 0x0F, 0x00, 0x01, 0x03, 0x01, 0x9C, 0x01, 0xC9, + 0x01, 0x30, 0xFF, 0x00, 0xFF, 0x00, 0xA4, 0x00, /* 6 CEDILLA */ - 0xff, 0x00, 0xff, 0x00, 0xee, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0x20, - 0x11, 0x00, 0x01, 0xcf, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x3f, 0x01, 0xf6, - 0x11, 0x00, 0x01, 0x0f, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x3f, 0x01, 0xfd, - 0x0e, 0x00, 0x01, 0x07, 0x01, 0xd9, 0x01, 0x89, 0x01, 0xff, 0x01, 0xfb, - 0x0e, 0x00, 0x01, 0x07, 0x03, 0xff, 0x01, 0xf3, 0x0e, 0x00, 0x01, 0x04, - 0x01, 0xbd, 0x01, 0xee, 0x01, 0xd9, 0x01, 0x20, 0x2f, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xEE, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0x20, + 0x11, 0x00, 0x01, 0xCF, 0x01, 0xC0, 0x11, 0x00, 0x01, 0x3F, 0x01, 0xF6, + 0x11, 0x00, 0x01, 0x0F, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x3F, 0x01, 0xFD, + 0x0E, 0x00, 0x01, 0x07, 0x01, 0xD9, 0x01, 0x89, 0x01, 0xFF, 0x01, 0xFB, + 0x0E, 0x00, 0x01, 0x07, 0x03, 0xFF, 0x01, 0xF3, 0x0E, 0x00, 0x01, 0x04, + 0x01, 0xBD, 0x01, 0xEE, 0x01, 0xD9, 0x01, 0x20, 0x2F, 0x00, /* 7 NO_DOT_I */ - 0xff, 0x00, 0x32, 0x00, 0x01, 0x01, 0x01, 0x99, 0x01, 0x96, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, - 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, - 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, - 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, - 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, - 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, - 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, - 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0xcd, 0x00, + 0xFF, 0x00, 0x32, 0x00, 0x01, 0x01, 0x01, 0x99, 0x01, 0x96, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0xCD, 0x00, #if ENABLED(TOUCH_UI_UTF8_GERMANIC) /* 8 SHARP_S */ - 0x8a, 0x00, 0x01, 0x35, 0x01, 0x66, 0x01, 0x52, 0x0e, 0x00, 0x01, 0x03, - 0x01, 0xaf, 0x03, 0xff, 0x01, 0xe7, 0x0d, 0x00, 0x01, 0x7f, 0x05, 0xff, - 0x01, 0xc1, 0x0b, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfc, 0x01, 0xaa, - 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x2f, 0x01, 0xff, - 0x01, 0xf9, 0x01, 0x10, 0x01, 0x00, 0x01, 0x02, 0x01, 0xcf, 0x01, 0xff, - 0x01, 0x70, 0x0a, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x03, 0x00, - 0x01, 0x0d, 0x01, 0xff, 0x01, 0xe0, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, - 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x01, 0x02, - 0x01, 0xff, 0x01, 0xfb, 0x04, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf7, - 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x03, - 0x01, 0x9e, 0x01, 0xff, 0x01, 0xf8, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf8, 0x02, 0x00, 0x01, 0x01, 0x01, 0xaf, 0x02, 0xff, 0x01, 0xd7, - 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x1d, - 0x01, 0xff, 0x01, 0xfc, 0x01, 0x50, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf8, 0x02, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, - 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, - 0x01, 0xfa, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, - 0x01, 0x05, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf8, 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, - 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, - 0x01, 0xf9, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, - 0x01, 0x02, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf8, 0x02, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, - 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x1d, 0x02, 0xff, - 0x01, 0xd3, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, - 0x01, 0x01, 0x01, 0xcf, 0x02, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfb, - 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x2b, - 0x02, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, - 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xdf, - 0x01, 0xff, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, - 0x01, 0xbf, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x08, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfd, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x02, 0x01, 0x84, - 0x03, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf8, 0x01, 0x02, 0x01, 0xff, 0x01, 0xec, 0x01, 0xa9, - 0x01, 0xac, 0x02, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf8, 0x01, 0x02, 0x05, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x08, 0x00, - 0x01, 0x03, 0x01, 0xee, 0x01, 0xe7, 0x01, 0x01, 0x01, 0xbf, 0x03, 0xff, - 0x01, 0xfe, 0x01, 0x80, 0x0e, 0x00, 0x01, 0x35, 0x01, 0x78, 0x01, 0x76, - 0x01, 0x30, 0xb4, 0x00, + 0x8A, 0x00, 0x01, 0x35, 0x01, 0x66, 0x01, 0x52, 0x0E, 0x00, 0x01, 0x03, + 0x01, 0xAF, 0x03, 0xFF, 0x01, 0xE7, 0x0D, 0x00, 0x01, 0x7F, 0x05, 0xFF, + 0x01, 0xC1, 0x0B, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFC, 0x01, 0xAA, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFC, 0x0B, 0x00, 0x01, 0x2F, 0x01, 0xFF, + 0x01, 0xF9, 0x01, 0x10, 0x01, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0x70, 0x0A, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x03, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xE0, 0x0A, 0x00, 0x01, 0xEF, 0x01, 0xFF, + 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, 0x01, 0x02, + 0x01, 0xFF, 0x01, 0xFB, 0x04, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF7, + 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF9, 0x03, 0x00, 0x01, 0x03, + 0x01, 0x9E, 0x01, 0xFF, 0x01, 0xF8, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x02, 0x00, 0x01, 0x01, 0x01, 0xAF, 0x02, 0xFF, 0x01, 0xD7, + 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x1D, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x02, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xFA, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, + 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x01, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, + 0x01, 0xF9, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, + 0x01, 0x02, 0x02, 0xFF, 0x01, 0x50, 0x0B, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x02, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xF8, 0x0B, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x1D, 0x02, 0xFF, + 0x01, 0xD3, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, + 0x01, 0x01, 0x01, 0xCF, 0x02, 0xFF, 0x01, 0x70, 0x09, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFB, + 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x2B, + 0x02, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, + 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xF6, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFD, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xFD, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x02, 0x01, 0x84, + 0x03, 0x00, 0x01, 0x2D, 0x01, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xA9, + 0x01, 0xAC, 0x02, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x01, 0x02, 0x05, 0xFF, 0x01, 0xFE, 0x01, 0x20, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xEE, 0x01, 0xE7, 0x01, 0x01, 0x01, 0xBF, 0x03, 0xFF, + 0x01, 0xFE, 0x01, 0x80, 0x0E, 0x00, 0x01, 0x35, 0x01, 0x78, 0x01, 0x76, + 0x01, 0x30, 0xB4, 0x00, #endif #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) /* 9 LRG_O_STROKE */ - 0x93, 0x00, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x47, 0x01, 0x9a, 0x01, 0xba, - 0x01, 0x95, 0x01, 0x10, 0x02, 0x00, 0x01, 0x07, 0x01, 0xf8, 0x08, 0x00, - 0x01, 0x02, 0x01, 0xaf, 0x04, 0xff, 0x01, 0xfc, 0x01, 0x50, 0x01, 0x00, - 0x01, 0x5f, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x8f, 0x06, 0xff, - 0x01, 0xfc, 0x01, 0x23, 0x01, 0xff, 0x01, 0xf6, 0x07, 0x00, 0x01, 0x1c, - 0x03, 0xff, 0x01, 0xca, 0x01, 0x9b, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xfe, - 0x01, 0xff, 0x01, 0x80, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xfd, - 0x01, 0x50, 0x02, 0x00, 0x01, 0x02, 0x01, 0x9f, 0x02, 0xff, 0x01, 0xfa, - 0x07, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x03, - 0x01, 0xef, 0x01, 0xff, 0x01, 0xf3, 0x07, 0x00, 0x01, 0x5f, 0x01, 0xff, - 0x01, 0xf9, 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xfc, 0x07, 0x00, - 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x06, 0x03, 0xff, - 0x01, 0x60, 0x05, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0x30, 0x05, 0x00, - 0x01, 0x4f, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, - 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x02, 0x01, 0xef, - 0x01, 0xf7, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x0f, - 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xa0, - 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x3f, 0x01, 0xff, - 0x01, 0xf2, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x01, 0x00, 0x01, 0x09, - 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, - 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xd1, 0x01, 0x00, 0x01, 0x06, - 0x01, 0xff, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xc0, - 0x04, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x20, 0x01, 0x00, 0x01, 0x03, - 0x02, 0xff, 0x05, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, - 0x01, 0x05, 0x01, 0xff, 0x01, 0xf4, 0x02, 0x00, 0x01, 0x02, 0x02, 0xff, - 0x01, 0x10, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x03, 0x00, - 0x01, 0x3f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0x01, 0x02, 0xff, - 0x01, 0x30, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x02, 0x00, - 0x01, 0x01, 0x01, 0xef, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x02, 0x02, 0xff, - 0x01, 0x20, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0, 0x02, 0x00, - 0x01, 0x0d, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x03, 0x02, 0xff, - 0x01, 0x10, 0x04, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, - 0x01, 0xbf, 0x01, 0xfd, 0x04, 0x00, 0x01, 0x04, 0x02, 0xff, 0x05, 0x00, - 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0x08, 0x01, 0xff, - 0x01, 0xe1, 0x04, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x05, 0x00, - 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff, - 0x01, 0x30, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, 0x05, 0x00, - 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5, - 0x05, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf7, 0x05, 0x00, 0x01, 0x09, - 0x01, 0xff, 0x01, 0xfc, 0x01, 0x2e, 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, - 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, 0x01, 0x03, 0x02, 0xff, - 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xb0, - 0x06, 0x00, 0x01, 0xcf, 0x02, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x06, - 0x02, 0xff, 0x01, 0x40, 0x06, 0x00, 0x01, 0x2f, 0x02, 0xff, 0x01, 0x20, - 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xfb, 0x07, 0x00, 0x01, 0x0b, - 0x02, 0xff, 0x01, 0xd2, 0x04, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0xe1, - 0x07, 0x00, 0x01, 0x5f, 0x03, 0xff, 0x01, 0x93, 0x02, 0x00, 0x01, 0x05, - 0x01, 0xcf, 0x02, 0xff, 0x01, 0x30, 0x06, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xfb, 0x03, 0xff, 0x01, 0xfd, 0x01, 0xde, 0x03, 0xff, 0x01, 0xe3, - 0x07, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0x80, 0x01, 0x4d, 0x06, 0xff, - 0x01, 0xfa, 0x01, 0x10, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xfb, 0x02, 0x00, - 0x01, 0x5c, 0x04, 0xff, 0x01, 0xe9, 0x01, 0x30, 0x08, 0x00, 0x01, 0x1c, - 0x01, 0xd0, 0x03, 0x00, 0x01, 0x04, 0x01, 0x67, 0x01, 0x86, 0x01, 0x53, - 0x0b, 0x00, 0x01, 0x10, 0xa8, 0x00, + 0x93, 0x00, 0x01, 0x40, 0x0A, 0x00, 0x01, 0x47, 0x01, 0x9A, 0x01, 0xBA, + 0x01, 0x95, 0x01, 0x10, 0x02, 0x00, 0x01, 0x07, 0x01, 0xF8, 0x08, 0x00, + 0x01, 0x02, 0x01, 0xAF, 0x04, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x01, 0x00, + 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x30, 0x07, 0x00, 0x01, 0x8F, 0x06, 0xFF, + 0x01, 0xFC, 0x01, 0x23, 0x01, 0xFF, 0x01, 0xF6, 0x07, 0x00, 0x01, 0x1C, + 0x03, 0xFF, 0x01, 0xCA, 0x01, 0x9B, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xFE, + 0x01, 0xFF, 0x01, 0x80, 0x07, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xFD, + 0x01, 0x50, 0x02, 0x00, 0x01, 0x02, 0x01, 0x9F, 0x02, 0xFF, 0x01, 0xFA, + 0x07, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0x90, 0x04, 0x00, 0x01, 0x03, + 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xF3, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, + 0x01, 0xF9, 0x06, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xFC, 0x07, 0x00, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xC0, 0x05, 0x00, 0x01, 0x06, 0x03, 0xFF, + 0x01, 0x60, 0x05, 0x00, 0x01, 0x04, 0x02, 0xFF, 0x01, 0x30, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xC0, 0x05, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x02, 0x01, 0xEF, + 0x01, 0xF7, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x0F, + 0x01, 0xFF, 0x01, 0xF6, 0x05, 0x00, 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xA0, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x3F, 0x01, 0xFF, + 0x01, 0xF2, 0x05, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x09, + 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xE0, + 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xC0, + 0x04, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x00, 0x01, 0x03, + 0x02, 0xFF, 0x05, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, + 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF4, 0x02, 0x00, 0x01, 0x02, 0x02, 0xFF, + 0x01, 0x10, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x03, 0x00, + 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0x01, 0x02, 0xFF, + 0x01, 0x30, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x02, 0x00, + 0x01, 0x01, 0x01, 0xEF, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x02, 0x02, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x02, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, 0x01, 0x03, 0x02, 0xFF, + 0x01, 0x10, 0x04, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xC0, 0x02, 0x00, + 0x01, 0xBF, 0x01, 0xFD, 0x04, 0x00, 0x01, 0x04, 0x02, 0xFF, 0x05, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, + 0x01, 0xE1, 0x04, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFE, 0x05, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, + 0x01, 0x30, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, + 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xF5, + 0x05, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF7, 0x05, 0x00, 0x01, 0x09, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, + 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, 0x01, 0x03, 0x02, 0xFF, + 0x01, 0xEF, 0x01, 0xFA, 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xB0, + 0x06, 0x00, 0x01, 0xCF, 0x02, 0xFF, 0x01, 0xC0, 0x05, 0x00, 0x01, 0x06, + 0x02, 0xFF, 0x01, 0x40, 0x06, 0x00, 0x01, 0x2F, 0x02, 0xFF, 0x01, 0x20, + 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x0B, + 0x02, 0xFF, 0x01, 0xD2, 0x04, 0x00, 0x01, 0x06, 0x02, 0xFF, 0x01, 0xE1, + 0x07, 0x00, 0x01, 0x5F, 0x03, 0xFF, 0x01, 0x93, 0x02, 0x00, 0x01, 0x05, + 0x01, 0xCF, 0x02, 0xFF, 0x01, 0x30, 0x06, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xFB, 0x03, 0xFF, 0x01, 0xFD, 0x01, 0xDE, 0x03, 0xFF, 0x01, 0xE3, + 0x07, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x4D, 0x06, 0xFF, + 0x01, 0xFA, 0x01, 0x10, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFB, 0x02, 0x00, + 0x01, 0x5C, 0x04, 0xFF, 0x01, 0xE9, 0x01, 0x30, 0x08, 0x00, 0x01, 0x1C, + 0x01, 0xD0, 0x03, 0x00, 0x01, 0x04, 0x01, 0x67, 0x01, 0x86, 0x01, 0x53, + 0x0B, 0x00, 0x01, 0x10, 0xA8, 0x00, /* 10 SML_O_STROKE */ - 0xff, 0x00, 0x15, 0x00, 0x01, 0x02, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x02, - 0x01, 0x32, 0x01, 0x10, 0x02, 0x00, 0x01, 0x1d, 0x01, 0xe3, 0x0a, 0x00, - 0x01, 0x01, 0x01, 0x7c, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x82, 0x01, 0x00, - 0x01, 0xcf, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0x6e, 0x05, 0xff, 0x01, 0x89, - 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x08, 0x07, 0xff, 0x01, 0xfc, - 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x50, 0x01, 0x00, - 0x01, 0x3a, 0x02, 0xff, 0x01, 0xf1, 0x09, 0x00, 0x01, 0x01, 0x02, 0xff, - 0x01, 0x90, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf5, 0x09, 0x00, - 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x01, 0x01, 0xdf, - 0x01, 0xff, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf3, - 0x03, 0x00, 0x01, 0x0b, 0x03, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x3f, - 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfa, 0x01, 0x8f, - 0x01, 0xff, 0x01, 0x80, 0x08, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x80, - 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x3f, 0x01, 0xff, - 0x01, 0xb0, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, - 0x01, 0x3f, 0x01, 0xfe, 0x01, 0x10, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe0, - 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x40, 0x01, 0x00, 0x01, 0x02, - 0x01, 0xef, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, - 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x01, 0x00, 0x01, 0x0d, - 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf0, - 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x01, 0x00, 0x01, 0xbf, - 0x01, 0xf8, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, - 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x01, 0x08, 0x01, 0xff, 0x01, 0xb0, - 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x7f, - 0x01, 0xff, 0x01, 0x60, 0x01, 0x5f, 0x01, 0xfd, 0x03, 0x00, 0x01, 0x3f, - 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa3, - 0x01, 0xff, 0x01, 0xe2, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x90, - 0x08, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x40, - 0x03, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x08, 0x00, 0x01, 0x0a, - 0x02, 0xff, 0x01, 0xf6, 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfe, - 0x09, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x2e, - 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf7, - 0x02, 0x00, 0x01, 0x05, 0x01, 0xef, 0x01, 0xff, 0x01, 0xd0, 0x09, 0x00, - 0x01, 0x04, 0x03, 0xff, 0x01, 0xfc, 0x01, 0xab, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xfe, 0x01, 0x20, 0x09, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xaf, - 0x05, 0xff, 0x01, 0xd2, 0x09, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xf5, - 0x01, 0x04, 0x01, 0xbf, 0x03, 0xff, 0x01, 0xd6, 0x0a, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0x70, 0x01, 0x00, 0x01, 0x01, 0x01, 0x46, 0x01, 0x76, - 0x01, 0x52, 0x0c, 0x00, 0x01, 0x28, 0xa9, 0x00, + 0xFF, 0x00, 0x15, 0x00, 0x01, 0x02, 0x01, 0x20, 0x0C, 0x00, 0x01, 0x02, + 0x01, 0x32, 0x01, 0x10, 0x02, 0x00, 0x01, 0x1D, 0x01, 0xE3, 0x0A, 0x00, + 0x01, 0x01, 0x01, 0x7C, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0x82, 0x01, 0x00, + 0x01, 0xCF, 0x01, 0xF7, 0x0A, 0x00, 0x01, 0x6E, 0x05, 0xFF, 0x01, 0x89, + 0x01, 0xFF, 0x01, 0xA0, 0x09, 0x00, 0x01, 0x08, 0x07, 0xFF, 0x01, 0xFC, + 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x01, 0x00, + 0x01, 0x3A, 0x02, 0xFF, 0x01, 0xF1, 0x09, 0x00, 0x01, 0x01, 0x02, 0xFF, + 0x01, 0x90, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xF5, 0x09, 0x00, + 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x01, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF3, + 0x03, 0x00, 0x01, 0x0B, 0x03, 0xFF, 0x01, 0x30, 0x08, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0xD0, 0x03, 0x00, 0x01, 0x9F, 0x01, 0xFA, 0x01, 0x8F, + 0x01, 0xFF, 0x01, 0x80, 0x08, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x80, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xC0, 0x01, 0x3F, 0x01, 0xFF, + 0x01, 0xB0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x50, 0x02, 0x00, + 0x01, 0x3F, 0x01, 0xFE, 0x01, 0x10, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xE0, + 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x40, 0x01, 0x00, 0x01, 0x02, + 0x01, 0xEF, 0x01, 0xF3, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, + 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0x0D, + 0x01, 0xFF, 0x01, 0x50, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF0, + 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0xBF, + 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, + 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x40, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, + 0x02, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x7F, + 0x01, 0xFF, 0x01, 0x60, 0x01, 0x5F, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0xC0, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA3, + 0x01, 0xFF, 0x01, 0xE2, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x90, + 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0xFF, 0x01, 0x40, + 0x03, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x0A, + 0x02, 0xFF, 0x01, 0xF6, 0x03, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFE, + 0x09, 0x00, 0x01, 0x02, 0x02, 0xFF, 0x01, 0xB0, 0x03, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xF8, 0x0A, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xF7, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xD0, 0x09, 0x00, + 0x01, 0x04, 0x03, 0xFF, 0x01, 0xFC, 0x01, 0xAB, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xFE, 0x01, 0x20, 0x09, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xAF, + 0x05, 0xFF, 0x01, 0xD2, 0x09, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF5, + 0x01, 0x04, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xD6, 0x0A, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0x70, 0x01, 0x00, 0x01, 0x01, 0x01, 0x46, 0x01, 0x76, + 0x01, 0x52, 0x0C, 0x00, 0x01, 0x28, 0xA9, 0x00, /* 11 LRG_AE */ - 0x9e, 0x00, 0x01, 0x14, 0x0b, 0x44, 0x01, 0x41, 0x06, 0x00, 0x01, 0x8f, - 0x0b, 0xff, 0x01, 0xf3, 0x06, 0x00, 0x01, 0xef, 0x0b, 0xff, 0x01, 0xf3, - 0x05, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xee, 0x09, 0xff, 0x01, 0xf3, - 0x05, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, 0x01, 0xdf, - 0x01, 0xff, 0x01, 0x63, 0x06, 0x33, 0x01, 0x30, 0x05, 0x00, 0x01, 0x3f, - 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, - 0x0c, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0xdf, - 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x10, - 0x01, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x07, - 0x01, 0xff, 0x01, 0xfa, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, - 0x0b, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf3, 0x02, 0x00, 0x01, 0xdf, - 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xd0, - 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0xbf, - 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, - 0x0a, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfe, 0x03, 0x00, 0x01, 0xdf, - 0x01, 0xff, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf9, - 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xed, 0x06, 0xdd, 0x01, 0x80, - 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0xdf, - 0x08, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xb0, - 0x03, 0x00, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0xcf, - 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa8, - 0x06, 0x88, 0x01, 0x50, 0x02, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfe, - 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x09, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, - 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf4, 0x04, 0x33, 0x01, 0xdf, - 0x01, 0xff, 0x01, 0x40, 0x09, 0x00, 0x01, 0x7f, 0x08, 0xff, 0x01, 0x40, - 0x09, 0x00, 0x01, 0xef, 0x08, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x05, - 0x09, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf7, - 0x05, 0x33, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x2f, - 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, - 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0xdf, - 0x01, 0xff, 0x01, 0x40, 0x08, 0x00, 0x02, 0xff, 0x01, 0x20, 0x05, 0x00, - 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x06, 0x01, 0xff, - 0x01, 0xfb, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa8, 0x06, 0x88, - 0x01, 0x85, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf4, 0x06, 0x00, 0x01, 0xdf, - 0x08, 0xff, 0x01, 0xf9, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe0, 0x06, 0x00, - 0x01, 0xdf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x8d, 0x01, 0xdd, 0x01, 0x60, - 0x06, 0x00, 0x01, 0xbd, 0x08, 0xdd, 0x01, 0xd8, 0xbe, 0x00, + 0x9E, 0x00, 0x01, 0x14, 0x0B, 0x44, 0x01, 0x41, 0x06, 0x00, 0x01, 0x8F, + 0x0B, 0xFF, 0x01, 0xF3, 0x06, 0x00, 0x01, 0xEF, 0x0B, 0xFF, 0x01, 0xF3, + 0x05, 0x00, 0x01, 0x05, 0x02, 0xFF, 0x01, 0xEE, 0x09, 0xFF, 0x01, 0xF3, + 0x05, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF5, 0x01, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x63, 0x06, 0x33, 0x01, 0x30, 0x05, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x0C, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x10, + 0x01, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x07, + 0x01, 0xFF, 0x01, 0xFA, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x0B, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF3, 0x02, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xD0, + 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0xBF, + 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x0A, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFE, 0x03, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x0A, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF9, + 0x03, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xED, 0x06, 0xDD, 0x01, 0x80, + 0x03, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x03, 0x00, 0x01, 0xDF, + 0x08, 0xFF, 0x01, 0xA0, 0x03, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xB0, + 0x03, 0x00, 0x01, 0xDF, 0x08, 0xFF, 0x01, 0xA0, 0x03, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x40, 0x03, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA8, + 0x06, 0x88, 0x01, 0x50, 0x02, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFE, + 0x04, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x09, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x09, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF4, 0x04, 0x33, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x09, 0x00, 0x01, 0x7F, 0x08, 0xFF, 0x01, 0x40, + 0x09, 0x00, 0x01, 0xEF, 0x08, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x05, + 0x09, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF7, + 0x05, 0x33, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0xE0, 0x05, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x80, 0x05, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x05, 0x00, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x07, 0x00, 0x01, 0x06, 0x01, 0xFF, + 0x01, 0xFB, 0x06, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA8, 0x06, 0x88, + 0x01, 0x85, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF4, 0x06, 0x00, 0x01, 0xDF, + 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xE0, 0x06, 0x00, + 0x01, 0xDF, 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x8D, 0x01, 0xDD, 0x01, 0x60, + 0x06, 0x00, 0x01, 0xBD, 0x08, 0xDD, 0x01, 0xD8, 0xBE, 0x00, /* 12 SML_AE */ - 0xff, 0x00, 0x22, 0x00, 0x01, 0x01, 0x01, 0x34, 0x01, 0x31, 0x06, 0x00, - 0x01, 0x12, 0x01, 0x42, 0x01, 0x10, 0x05, 0x00, 0x01, 0x02, 0x01, 0x7b, - 0x01, 0xef, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x60, 0x02, 0x00, 0x01, 0x03, - 0x01, 0x9e, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x81, 0x04, 0x00, 0x01, 0xbf, - 0x05, 0xff, 0x01, 0xfe, 0x01, 0x40, 0x01, 0x01, 0x01, 0x9f, 0x05, 0xff, - 0x01, 0x60, 0x03, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xee, 0x03, 0xff, - 0x01, 0xf5, 0x01, 0x1d, 0x03, 0xff, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf8, - 0x03, 0x00, 0x01, 0xdf, 0x01, 0xb6, 0x01, 0x30, 0x01, 0x00, 0x01, 0x01, - 0x01, 0x5d, 0x02, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe7, 0x01, 0x20, - 0x01, 0x00, 0x01, 0x29, 0x02, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x71, - 0x05, 0x00, 0x01, 0xaf, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x03, 0x00, - 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x0d, 0x02, 0xff, - 0x01, 0xd0, 0x04, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x08, 0x00, - 0x01, 0x06, 0x02, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0xef, 0x01, 0xfd, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x06, 0x00, 0x01, 0x9f, - 0x01, 0xff, 0x04, 0x00, 0x01, 0x02, 0x01, 0x45, 0x02, 0x66, 0x01, 0x67, - 0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x03, 0x00, - 0x01, 0x4a, 0x06, 0xff, 0x01, 0xfb, 0x03, 0x66, 0x01, 0x67, 0x02, 0x77, - 0x01, 0xaf, 0x01, 0xff, 0x02, 0x00, 0x01, 0x1b, 0x10, 0xff, 0x01, 0x00, - 0x01, 0x01, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xca, 0x01, 0x98, 0x01, 0x88, - 0x01, 0x89, 0x0a, 0xff, 0x01, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfd, - 0x01, 0x40, 0x03, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x77, - 0x01, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x70, - 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x7f, - 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, - 0x09, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0f, - 0x02, 0xff, 0x01, 0x50, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x60, - 0x04, 0x00, 0x01, 0x8f, 0x02, 0xff, 0x01, 0xe1, 0x08, 0x00, 0x01, 0x3f, - 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, - 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x05, 0x00, 0x01, 0x45, 0x01, 0x00, - 0x01, 0x0d, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, - 0x01, 0x9f, 0x01, 0xff, 0x01, 0xa2, 0x02, 0xff, 0x01, 0xe6, 0x01, 0x10, - 0x02, 0x00, 0x01, 0x02, 0x01, 0x8d, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, - 0x02, 0xff, 0x01, 0xfd, 0x01, 0xab, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xfc, - 0x01, 0x00, 0x01, 0x3f, 0x02, 0xff, 0x01, 0xfd, 0x01, 0xba, 0x01, 0xbc, - 0x02, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x7f, 0x05, 0xff, 0x01, 0xa0, - 0x01, 0x00, 0x01, 0x02, 0x01, 0xcf, 0x06, 0xff, 0x01, 0xf7, 0x02, 0x00, - 0x01, 0x03, 0x01, 0xbf, 0x03, 0xff, 0x01, 0xb4, 0x03, 0x00, 0x01, 0x05, - 0x01, 0xbf, 0x04, 0xff, 0x01, 0xb7, 0x01, 0x10, 0x03, 0x00, 0x01, 0x01, + 0xFF, 0x00, 0x22, 0x00, 0x01, 0x01, 0x01, 0x34, 0x01, 0x31, 0x06, 0x00, + 0x01, 0x12, 0x01, 0x42, 0x01, 0x10, 0x05, 0x00, 0x01, 0x02, 0x01, 0x7B, + 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x60, 0x02, 0x00, 0x01, 0x03, + 0x01, 0x9E, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0x81, 0x04, 0x00, 0x01, 0xBF, + 0x05, 0xFF, 0x01, 0xFE, 0x01, 0x40, 0x01, 0x01, 0x01, 0x9F, 0x05, 0xFF, + 0x01, 0x60, 0x03, 0x00, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xEE, 0x03, 0xFF, + 0x01, 0xF5, 0x01, 0x1D, 0x03, 0xFF, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xF8, + 0x03, 0x00, 0x01, 0xDF, 0x01, 0xB6, 0x01, 0x30, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x5D, 0x02, 0xFF, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xE7, 0x01, 0x20, + 0x01, 0x00, 0x01, 0x29, 0x02, 0xFF, 0x01, 0x50, 0x02, 0x00, 0x01, 0x71, + 0x05, 0x00, 0x01, 0xAF, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x10, 0x03, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x0D, 0x02, 0xFF, + 0x01, 0xD0, 0x04, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, 0x08, 0x00, + 0x01, 0x06, 0x02, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0xEF, 0x01, 0xFD, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x06, 0x00, 0x01, 0x9F, + 0x01, 0xFF, 0x04, 0x00, 0x01, 0x02, 0x01, 0x45, 0x02, 0x66, 0x01, 0x67, + 0x01, 0xFF, 0x01, 0xF9, 0x06, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x03, 0x00, + 0x01, 0x4A, 0x06, 0xFF, 0x01, 0xFB, 0x03, 0x66, 0x01, 0x67, 0x02, 0x77, + 0x01, 0xAF, 0x01, 0xFF, 0x02, 0x00, 0x01, 0x1B, 0x10, 0xFF, 0x01, 0x00, + 0x01, 0x01, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xCA, 0x01, 0x98, 0x01, 0x88, + 0x01, 0x89, 0x0A, 0xFF, 0x01, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFD, + 0x01, 0x40, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFA, 0x08, 0x77, + 0x01, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xD0, 0x04, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x70, + 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFA, 0x09, 0x00, 0x01, 0x7F, + 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFE, + 0x09, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0F, + 0x02, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x60, + 0x04, 0x00, 0x01, 0x8F, 0x02, 0xFF, 0x01, 0xE1, 0x08, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0xD0, 0x03, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x05, 0x00, 0x01, 0x45, 0x01, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xA2, 0x02, 0xFF, 0x01, 0xE6, 0x01, 0x10, + 0x02, 0x00, 0x01, 0x02, 0x01, 0x8D, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x05, + 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xAB, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xFC, + 0x01, 0x00, 0x01, 0x3F, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xBA, 0x01, 0xBC, + 0x02, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x7F, 0x05, 0xFF, 0x01, 0xA0, + 0x01, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x06, 0xFF, 0x01, 0xF7, 0x02, 0x00, + 0x01, 0x03, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xB4, 0x03, 0x00, 0x01, 0x05, + 0x01, 0xBF, 0x04, 0xFF, 0x01, 0xB7, 0x01, 0x10, 0x03, 0x00, 0x01, 0x01, 0x01, 0x46, 0x01, 0x76, 0x01, 0x41, 0x06, 0x00, 0x01, 0x35, 0x01, 0x67, - 0x01, 0x64, 0x01, 0x20, 0xad, 0x00, + 0x01, 0x64, 0x01, 0x20, 0xAD, 0x00, /* 13 LRG_ETH */ - 0x9a, 0x00, 0x01, 0x34, 0x03, 0x44, 0x01, 0x43, 0x01, 0x21, 0x0d, 0x00, - 0x01, 0xbf, 0x05, 0xff, 0x01, 0xfe, 0x01, 0xb8, 0x01, 0x40, 0x0a, 0x00, - 0x01, 0xbf, 0x07, 0xff, 0x01, 0xfe, 0x01, 0x81, 0x09, 0x00, 0x01, 0xbf, - 0x08, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, - 0x01, 0x61, 0x02, 0x11, 0x01, 0x23, 0x01, 0x58, 0x01, 0xcf, 0x02, 0xff, - 0x01, 0xf9, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, - 0x01, 0x02, 0x01, 0x9f, 0x02, 0xff, 0x01, 0x80, 0x07, 0x00, 0x01, 0xbf, - 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x04, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xf4, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, - 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfd, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, - 0x01, 0x50, 0x06, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x50, 0x06, 0x00, - 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xb0, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, - 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf0, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, - 0x01, 0x50, 0x07, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf3, 0x06, 0x00, - 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0f, 0x01, 0xff, - 0x01, 0xf5, 0x04, 0x00, 0x01, 0x23, 0x01, 0x33, 0x01, 0xcf, 0x01, 0xff, - 0x01, 0x73, 0x02, 0x33, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, - 0x01, 0xf6, 0x04, 0x00, 0x01, 0xcf, 0x06, 0xff, 0x01, 0xf2, 0x04, 0x00, - 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0xcf, 0x06, 0xff, - 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, - 0x01, 0x9b, 0x01, 0xbb, 0x01, 0xef, 0x01, 0xff, 0x01, 0xdb, 0x02, 0xbb, - 0x01, 0xb1, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, - 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0d, 0x01, 0xff, - 0x01, 0xf7, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, - 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf6, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, - 0x01, 0x50, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf4, 0x06, 0x00, - 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x5f, 0x01, 0xff, - 0x01, 0xf1, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, - 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, - 0x01, 0x50, 0x06, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x80, 0x06, 0x00, - 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0b, 0x02, 0xff, - 0x01, 0x20, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, - 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf9, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, - 0x01, 0x50, 0x05, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0xe1, 0x07, 0x00, - 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x29, 0x03, 0xff, - 0x01, 0x30, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xa7, 0x01, 0x77, - 0x01, 0x78, 0x01, 0x9a, 0x01, 0xbf, 0x03, 0xff, 0x01, 0xe3, 0x08, 0x00, - 0x01, 0xbf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x10, 0x08, 0x00, 0x01, 0xbf, - 0x07, 0xff, 0x01, 0xd8, 0x01, 0x10, 0x09, 0x00, 0x01, 0xad, 0x03, 0xdd, - 0x01, 0xdc, 0x01, 0xcb, 0x01, 0xa7, 0x01, 0x41, 0xc7, 0x00, + 0x9A, 0x00, 0x01, 0x34, 0x03, 0x44, 0x01, 0x43, 0x01, 0x21, 0x0D, 0x00, + 0x01, 0xBF, 0x05, 0xFF, 0x01, 0xFE, 0x01, 0xB8, 0x01, 0x40, 0x0A, 0x00, + 0x01, 0xBF, 0x07, 0xFF, 0x01, 0xFE, 0x01, 0x81, 0x09, 0x00, 0x01, 0xBF, + 0x08, 0xFF, 0x01, 0xFE, 0x01, 0x60, 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x61, 0x02, 0x11, 0x01, 0x23, 0x01, 0x58, 0x01, 0xCF, 0x02, 0xFF, + 0x01, 0xF9, 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x04, 0x00, + 0x01, 0x02, 0x01, 0x9F, 0x02, 0xFF, 0x01, 0x80, 0x07, 0x00, 0x01, 0xBF, + 0x01, 0xFF, 0x01, 0x50, 0x05, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xF4, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFD, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x06, 0x00, 0x01, 0x06, 0x02, 0xFF, 0x01, 0x50, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, + 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xF0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xF3, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0F, 0x01, 0xFF, + 0x01, 0xF5, 0x04, 0x00, 0x01, 0x23, 0x01, 0x33, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0x73, 0x02, 0x33, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0xF6, 0x04, 0x00, 0x01, 0xCF, 0x06, 0xFF, 0x01, 0xF2, 0x04, 0x00, + 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xCF, 0x06, 0xFF, + 0x01, 0xF2, 0x04, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF9, 0x04, 0x00, + 0x01, 0x9B, 0x01, 0xBB, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xDB, 0x02, 0xBB, + 0x01, 0xB1, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0xF7, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, + 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF6, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x07, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF4, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, + 0x01, 0xF1, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xD0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x06, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x80, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0B, 0x02, 0xFF, + 0x01, 0x20, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, + 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xF9, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x05, 0x00, 0x01, 0x0A, 0x02, 0xFF, 0x01, 0xE1, 0x07, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x04, 0x00, 0x01, 0x29, 0x03, 0xFF, + 0x01, 0x30, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xA7, 0x01, 0x77, + 0x01, 0x78, 0x01, 0x9A, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xE3, 0x08, 0x00, + 0x01, 0xBF, 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x10, 0x08, 0x00, 0x01, 0xBF, + 0x07, 0xFF, 0x01, 0xD8, 0x01, 0x10, 0x09, 0x00, 0x01, 0xAD, 0x03, 0xDD, + 0x01, 0xDC, 0x01, 0xCB, 0x01, 0xA7, 0x01, 0x41, 0xC7, 0x00, /* 14 SML_ETH */ - 0x88, 0x00, 0x01, 0x38, 0x01, 0x88, 0x01, 0x81, 0x10, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x5a, 0x01, 0x40, 0x0c, 0x00, - 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x04, 0x01, 0xaf, 0x01, 0xff, - 0x01, 0xa0, 0x0c, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xfc, 0x02, 0xff, - 0x01, 0xd8, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfd, - 0x01, 0x82, 0x0d, 0x00, 0x01, 0x5a, 0x03, 0xff, 0x01, 0xf4, 0x0d, 0x00, - 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x87, 0x02, 0xff, 0x01, 0x30, - 0x0c, 0x00, 0x01, 0x6f, 0x01, 0xe9, 0x01, 0x30, 0x01, 0x00, 0x01, 0x8f, - 0x01, 0xff, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x03, 0x03, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x23, 0x01, 0x44, - 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x9e, - 0x04, 0xff, 0x01, 0xf7, 0x0c, 0x00, 0x01, 0x7f, 0x06, 0xff, 0x01, 0x30, - 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xfe, 0x01, 0xcb, 0x01, 0xdf, - 0x02, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfb, - 0x01, 0x30, 0x02, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xf5, 0x09, 0x00, - 0x01, 0x02, 0x02, 0xff, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, - 0x01, 0xfd, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfa, 0x05, 0x00, - 0x01, 0xef, 0x01, 0xff, 0x01, 0x20, 0x08, 0x00, 0x01, 0x0f, 0x01, 0xff, - 0x01, 0xf1, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, - 0x01, 0xb0, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, - 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, - 0x01, 0x40, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, - 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x05, 0x00, 0x01, 0x0e, 0x01, 0xff, - 0x01, 0xf0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x05, 0x00, - 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, - 0x01, 0x40, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, - 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0x2f, 0x01, 0xff, - 0x01, 0xd0, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x05, 0x00, - 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0f, 0x01, 0xff, - 0x01, 0xf1, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x08, 0x00, - 0x01, 0x09, 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, - 0x01, 0xfe, 0x09, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x60, 0x03, 0x00, - 0x01, 0x3e, 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x7f, 0x01, 0xff, - 0x01, 0xf9, 0x01, 0x20, 0x01, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xb0, - 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xfd, 0x01, 0xbd, 0x02, 0xff, - 0x01, 0xfd, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x7f, 0x05, 0xff, 0x01, 0xb0, - 0x0c, 0x00, 0x01, 0x02, 0x01, 0xae, 0x03, 0xff, 0x01, 0xb4, 0x0f, 0x00, - 0x01, 0x35, 0x01, 0x65, 0x01, 0x40, 0xb6, 0x00, + 0x88, 0x00, 0x01, 0x38, 0x01, 0x88, 0x01, 0x81, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x5A, 0x01, 0x40, 0x0C, 0x00, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x04, 0x01, 0xAF, 0x01, 0xFF, + 0x01, 0xA0, 0x0C, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0xFC, 0x02, 0xFF, + 0x01, 0xD8, 0x01, 0x20, 0x0C, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFD, + 0x01, 0x82, 0x0D, 0x00, 0x01, 0x5A, 0x03, 0xFF, 0x01, 0xF4, 0x0D, 0x00, + 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x87, 0x02, 0xFF, 0x01, 0x30, + 0x0C, 0x00, 0x01, 0x6F, 0x01, 0xE9, 0x01, 0x30, 0x01, 0x00, 0x01, 0x8F, + 0x01, 0xFF, 0x01, 0xE2, 0x0C, 0x00, 0x01, 0x03, 0x03, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x23, 0x01, 0x44, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x02, 0x01, 0x9E, + 0x04, 0xFF, 0x01, 0xF7, 0x0C, 0x00, 0x01, 0x7F, 0x06, 0xFF, 0x01, 0x30, + 0x0A, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0xFE, 0x01, 0xCB, 0x01, 0xDF, + 0x02, 0xFF, 0x01, 0xD0, 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFB, + 0x01, 0x30, 0x02, 0x00, 0x01, 0x4E, 0x01, 0xFF, 0x01, 0xF5, 0x09, 0x00, + 0x01, 0x02, 0x02, 0xFF, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05, 0x01, 0xFF, + 0x01, 0xFD, 0x09, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, + 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x20, 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, + 0x01, 0xF1, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA0, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0xB0, 0x08, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, + 0x01, 0x40, 0x05, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x05, 0x00, 0x01, 0x0E, 0x01, 0xFF, + 0x01, 0xF0, 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x05, 0x00, + 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, + 0x01, 0x40, 0x05, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, + 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, 0x01, 0x2F, 0x01, 0xFF, + 0x01, 0xD0, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA0, 0x05, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, + 0x01, 0xF1, 0x05, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, + 0x01, 0x09, 0x01, 0xFF, 0x01, 0xF9, 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, + 0x01, 0xFE, 0x09, 0x00, 0x01, 0x02, 0x02, 0xFF, 0x01, 0x60, 0x03, 0x00, + 0x01, 0x3E, 0x01, 0xFF, 0x01, 0xF6, 0x0A, 0x00, 0x01, 0x7F, 0x01, 0xFF, + 0x01, 0xF9, 0x01, 0x20, 0x01, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xB0, + 0x0A, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xBD, 0x02, 0xFF, + 0x01, 0xFD, 0x01, 0x10, 0x0B, 0x00, 0x01, 0x7F, 0x05, 0xFF, 0x01, 0xB0, + 0x0C, 0x00, 0x01, 0x02, 0x01, 0xAE, 0x03, 0xFF, 0x01, 0xB4, 0x0F, 0x00, + 0x01, 0x35, 0x01, 0x65, 0x01, 0x40, 0xB6, 0x00, /* 15 LRG_THORN */ - 0x9a, 0x00, 0x02, 0x55, 0x11, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, - 0x05, 0xff, 0x01, 0xed, 0x01, 0xa7, 0x01, 0x10, 0x0b, 0x00, 0x07, 0xff, - 0x01, 0xfa, 0x01, 0x10, 0x0a, 0x00, 0x08, 0xff, 0x01, 0xe2, 0x0a, 0x00, - 0x02, 0xff, 0x01, 0x65, 0x01, 0x55, 0x01, 0x56, 0x01, 0x7a, 0x02, 0xff, - 0x01, 0xfe, 0x01, 0x10, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, - 0x01, 0x1b, 0x02, 0xff, 0x01, 0x80, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, - 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xf0, 0x09, 0x00, 0x02, 0xff, - 0x01, 0x20, 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, - 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, - 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, - 0x01, 0xf7, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0d, - 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, - 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, - 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x02, 0xff, - 0x01, 0x20, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xf0, 0x09, 0x00, - 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x1b, 0x02, 0xff, 0x01, 0x80, - 0x09, 0x00, 0x02, 0xff, 0x01, 0x65, 0x02, 0x55, 0x01, 0x7a, 0x02, 0xff, - 0x01, 0xfe, 0x01, 0x10, 0x09, 0x00, 0x08, 0xff, 0x01, 0xe2, 0x0a, 0x00, - 0x07, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x0a, 0x00, 0x05, 0xff, 0x01, 0xed, - 0x01, 0xa7, 0x01, 0x10, 0x0b, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xcc, 0x01, 0x10, 0xcc, 0x00, + 0x9A, 0x00, 0x02, 0x55, 0x11, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x05, 0xFF, 0x01, 0xED, 0x01, 0xA7, 0x01, 0x10, 0x0B, 0x00, 0x07, 0xFF, + 0x01, 0xFA, 0x01, 0x10, 0x0A, 0x00, 0x08, 0xFF, 0x01, 0xE2, 0x0A, 0x00, + 0x02, 0xFF, 0x01, 0x65, 0x01, 0x55, 0x01, 0x56, 0x01, 0x7A, 0x02, 0xFF, + 0x01, 0xFE, 0x01, 0x10, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, + 0x01, 0x1B, 0x02, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, + 0x04, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xF0, 0x09, 0x00, 0x02, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, + 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0xF7, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0D, + 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, + 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, + 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, 0x02, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xF0, 0x09, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x1B, 0x02, 0xFF, 0x01, 0x80, + 0x09, 0x00, 0x02, 0xFF, 0x01, 0x65, 0x02, 0x55, 0x01, 0x7A, 0x02, 0xFF, + 0x01, 0xFE, 0x01, 0x10, 0x09, 0x00, 0x08, 0xFF, 0x01, 0xE2, 0x0A, 0x00, + 0x07, 0xFF, 0x01, 0xFA, 0x01, 0x10, 0x0A, 0x00, 0x05, 0xFF, 0x01, 0xED, + 0x01, 0xA7, 0x01, 0x10, 0x0B, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xCC, 0x01, 0x10, 0xCC, 0x00, /* 16 SML_THORN */ 0x86, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x94, 0x10, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, - 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, - 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, - 0x02, 0x00, 0x01, 0x13, 0x01, 0x54, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf7, 0x01, 0x00, 0x01, 0x5c, 0x02, 0xff, 0x01, 0xfd, - 0x01, 0x70, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x0b, - 0x04, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf7, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xec, 0x01, 0xdf, 0x02, 0xff, - 0x01, 0xe1, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, - 0x01, 0xc3, 0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfc, 0x09, 0x00, - 0x01, 0x03, 0x02, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x02, 0x01, 0xef, - 0x01, 0xff, 0x01, 0x60, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xe0, - 0x04, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x03, - 0x02, 0xff, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, - 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, - 0x01, 0xf7, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, - 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf9, 0x06, 0x00, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x08, 0x00, - 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xff, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, - 0x01, 0xfe, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, - 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, - 0x05, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x03, - 0x02, 0xff, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, - 0x01, 0x03, 0x02, 0xff, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, - 0x01, 0xf3, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xd0, 0x04, 0x00, - 0x01, 0x5f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, - 0x01, 0xfa, 0x03, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xb3, - 0x02, 0x00, 0x01, 0x6e, 0x01, 0xff, 0x01, 0xfc, 0x09, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf7, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xec, 0x01, 0xcf, - 0x02, 0xff, 0x01, 0xe2, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, - 0x01, 0x0b, 0x04, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf7, 0x01, 0x00, 0x01, 0x6c, 0x02, 0xff, 0x01, 0xfe, - 0x01, 0x70, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, - 0x01, 0x23, 0x01, 0x54, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, - 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, - 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, - 0x01, 0xf7, 0x10, 0x00, 0x01, 0x01, 0x01, 0x66, 0x01, 0x63, 0x22, 0x00, + 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, + 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, + 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, + 0x02, 0x00, 0x01, 0x13, 0x01, 0x54, 0x01, 0x20, 0x0B, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x00, 0x01, 0x5C, 0x02, 0xFF, 0x01, 0xFD, + 0x01, 0x70, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x0B, + 0x04, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF7, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xDF, 0x02, 0xFF, + 0x01, 0xE1, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, + 0x01, 0xC3, 0x02, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFC, 0x09, 0x00, + 0x01, 0x03, 0x02, 0xFF, 0x01, 0xFA, 0x03, 0x00, 0x01, 0x02, 0x01, 0xEF, + 0x01, 0xFF, 0x01, 0x60, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0xE0, + 0x04, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x03, + 0x02, 0xFF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF3, + 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, + 0x01, 0xF7, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, 0x05, 0x00, + 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF9, 0x06, 0x00, 0x01, 0xFF, 0x01, 0xFD, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xFE, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xFF, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, + 0x01, 0xFE, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF9, 0x06, 0x00, + 0x01, 0xFF, 0x01, 0xFD, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, + 0x05, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x03, + 0x02, 0xFF, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF8, 0x08, 0x00, + 0x01, 0x03, 0x02, 0xFF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, + 0x01, 0xF3, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0xD0, 0x04, 0x00, + 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, + 0x01, 0xFA, 0x03, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x60, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, 0x01, 0xB3, + 0x02, 0x00, 0x01, 0x6E, 0x01, 0xFF, 0x01, 0xFC, 0x09, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xCF, + 0x02, 0xFF, 0x01, 0xE2, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, + 0x01, 0x0B, 0x04, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x00, 0x01, 0x6C, 0x02, 0xFF, 0x01, 0xFE, + 0x01, 0x70, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x02, 0x00, + 0x01, 0x23, 0x01, 0x54, 0x01, 0x20, 0x0B, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF7, 0x10, 0x00, 0x01, 0x01, 0x01, 0x66, 0x01, 0x63, 0x22, 0x00, #endif // TOUCH_UI_UTF8_SCANDINAVIAN #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) /* 17 LEFT_DBL_QUOTE */ - 0xff, 0x00, 0x4a, 0x00, 0x01, 0x30, 0x03, 0x00, 0x01, 0x02, 0x0d, 0x00, - 0x01, 0x08, 0x01, 0xa0, 0x02, 0x00, 0x01, 0x01, 0x01, 0xc6, 0x0d, 0x00, - 0x01, 0xaf, 0x01, 0xa0, 0x02, 0x00, 0x01, 0x1d, 0x01, 0xf6, 0x0c, 0x00, - 0x01, 0x1c, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, - 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x50, - 0x01, 0x00, 0x01, 0x3e, 0x01, 0xff, 0x01, 0xe2, 0x0b, 0x00, 0x01, 0x2e, - 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, - 0x01, 0x20, 0x0a, 0x00, 0x01, 0x04, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x30, - 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd1, 0x0b, 0x00, 0x01, 0x5f, - 0x01, 0xff, 0x01, 0xd2, 0x01, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, - 0x0b, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x01, 0x00, - 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x0b, 0x00, 0x01, 0x0c, 0x01, 0xff, - 0x01, 0xd0, 0x02, 0x00, 0x01, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x50, - 0x0c, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x1c, - 0x01, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, - 0x02, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x90, 0x0c, 0x00, 0x01, 0x6f, - 0x01, 0xff, 0x01, 0xd1, 0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, - 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x01, 0x00, - 0x01, 0x8f, 0x01, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x4f, 0x01, 0xff, - 0x01, 0xa0, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf6, 0x0c, 0x00, - 0x01, 0x02, 0x01, 0xef, 0x01, 0xa0, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xf6, - 0x0d, 0x00, 0x01, 0x1d, 0x01, 0xa0, 0x02, 0x00, 0x01, 0x04, 0x01, 0xe6, - 0x0d, 0x00, 0x01, 0x01, 0x01, 0x60, 0x03, 0x00, 0x01, 0x24, 0xff, 0x00, + 0xFF, 0x00, 0x4A, 0x00, 0x01, 0x30, 0x03, 0x00, 0x01, 0x02, 0x0D, 0x00, + 0x01, 0x08, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x01, 0x01, 0xC6, 0x0D, 0x00, + 0x01, 0xAF, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x1D, 0x01, 0xF6, 0x0C, 0x00, + 0x01, 0x1C, 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xEF, + 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x50, + 0x01, 0x00, 0x01, 0x3E, 0x01, 0xFF, 0x01, 0xE2, 0x0B, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xF4, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, + 0x01, 0x20, 0x0A, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFE, 0x01, 0x30, + 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xD1, 0x0B, 0x00, 0x01, 0x5F, + 0x01, 0xFF, 0x01, 0xD2, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFB, + 0x0B, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x01, 0x00, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x0C, 0x01, 0xFF, + 0x01, 0xD0, 0x02, 0x00, 0x01, 0xFF, 0x01, 0xFA, 0x0C, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x50, + 0x0C, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x1C, + 0x01, 0xFF, 0x01, 0xF6, 0x0C, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFB, + 0x02, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x90, 0x0C, 0x00, 0x01, 0x6F, + 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xFA, + 0x0C, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x01, 0x00, + 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0xA0, 0x01, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF6, 0x0C, 0x00, + 0x01, 0x02, 0x01, 0xEF, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x5F, 0x01, 0xF6, + 0x0D, 0x00, 0x01, 0x1D, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x04, 0x01, 0xE6, + 0x0D, 0x00, 0x01, 0x01, 0x01, 0x60, 0x03, 0x00, 0x01, 0x24, 0xFF, 0x00, /* 18 RIGHT_DBL_QUOTE */ - 0xff, 0x00, 0x46, 0x00, 0x01, 0x20, 0x03, 0x00, 0x01, 0x20, 0x0d, 0x00, - 0x01, 0x01, 0x01, 0xe3, 0x03, 0x00, 0x01, 0x5d, 0x01, 0x10, 0x0c, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xe2, - 0x0c, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x5f, - 0x01, 0xfe, 0x01, 0x30, 0x0c, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x80, - 0x01, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xfa, 0x01, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, - 0x01, 0x60, 0x0c, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, - 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf9, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, - 0x01, 0xfc, 0x01, 0x10, 0x01, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, - 0x0c, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xd1, 0x01, 0x00, 0x01, 0x08, - 0x01, 0xff, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, - 0x02, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x2d, - 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfe, - 0x01, 0x10, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0x40, - 0x01, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xd2, 0x0b, 0x00, 0x01, 0x4f, - 0x01, 0xff, 0x01, 0xe3, 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfc, - 0x01, 0x10, 0x0a, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, - 0x01, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0, 0x0b, 0x00, 0x01, 0x6f, - 0x01, 0xff, 0x01, 0xc1, 0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf9, - 0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x5f, - 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0x90, - 0x02, 0x00, 0x01, 0x5f, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xf8, - 0x03, 0x00, 0x01, 0x5f, 0x01, 0x40, 0x0c, 0x00, 0x01, 0x01, 0x01, 0x50, - 0x03, 0x00, 0x01, 0x43, 0xff, 0x00, 0x04, 0x00, + 0xFF, 0x00, 0x46, 0x00, 0x01, 0x20, 0x03, 0x00, 0x01, 0x20, 0x0D, 0x00, + 0x01, 0x01, 0x01, 0xE3, 0x03, 0x00, 0x01, 0x5D, 0x01, 0x10, 0x0C, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0x50, 0x02, 0x00, 0x01, 0x5F, 0x01, 0xE2, + 0x0C, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF6, 0x02, 0x00, 0x01, 0x5F, + 0x01, 0xFE, 0x01, 0x30, 0x0C, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x80, + 0x01, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xF5, 0x0C, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xFA, 0x01, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0x60, 0x0C, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF9, 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, + 0x01, 0xFC, 0x01, 0x10, 0x01, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, + 0x0C, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x08, + 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF5, + 0x02, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x10, 0x0B, 0x00, 0x01, 0x2D, + 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0x10, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x40, + 0x01, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD2, 0x0B, 0x00, 0x01, 0x4F, + 0x01, 0xFF, 0x01, 0xE3, 0x01, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFC, + 0x01, 0x10, 0x0A, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, + 0x01, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x6F, + 0x01, 0xFF, 0x01, 0xC1, 0x01, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF9, + 0x0B, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x5F, + 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0x90, + 0x02, 0x00, 0x01, 0x5F, 0x01, 0xF6, 0x0C, 0x00, 0x01, 0x01, 0x01, 0xF8, + 0x03, 0x00, 0x01, 0x5F, 0x01, 0x40, 0x0C, 0x00, 0x01, 0x01, 0x01, 0x50, + 0x03, 0x00, 0x01, 0x43, 0xFF, 0x00, 0x04, 0x00, /* 19 INV_EXCLAMATION */ - 0xff, 0x00, 0x34, 0x00, 0x01, 0xad, 0x01, 0xdd, 0x01, 0x40, 0x10, 0x00, - 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, - 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, - 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, 0x01, 0x44, - 0x01, 0x10, 0x49, 0x00, 0x01, 0x02, 0x01, 0x22, 0x11, 0x00, 0x01, 0x6f, - 0x01, 0xff, 0x11, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x11, 0x00, 0x01, 0x7f, - 0x01, 0xff, 0x01, 0x10, 0x10, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x20, - 0x10, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x30, 0x10, 0x00, 0x01, 0xaf, - 0x01, 0xff, 0x01, 0x30, 0x10, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x40, - 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, - 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, - 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, - 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, - 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, - 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, - 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, - 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, - 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, + 0xFF, 0x00, 0x34, 0x00, 0x01, 0xAD, 0x01, 0xDD, 0x01, 0x40, 0x10, 0x00, + 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, + 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, 0x01, 0x44, + 0x01, 0x10, 0x49, 0x00, 0x01, 0x02, 0x01, 0x22, 0x11, 0x00, 0x01, 0x6F, + 0x01, 0xFF, 0x11, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x11, 0x00, 0x01, 0x7F, + 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x20, + 0x10, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x30, 0x10, 0x00, 0x01, 0xAF, + 0x01, 0xFF, 0x01, 0x30, 0x10, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x40, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, 0x01, 0x44, 0x01, 0x10, 0x33, 0x00, /* 20 INV_QUESTION */ - 0xff, 0x00, 0x36, 0x00, 0x02, 0xdd, 0x11, 0x00, 0x02, 0xff, 0x11, 0x00, - 0x02, 0xff, 0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0xff, 0x11, 0x00, - 0x02, 0x44, 0x37, 0x00, 0x01, 0xbc, 0x01, 0xcb, 0x11, 0x00, 0x01, 0xef, - 0x01, 0xfe, 0x11, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x11, 0x00, 0x01, 0xef, - 0x01, 0xfe, 0x11, 0x00, 0x01, 0xff, 0x01, 0xfd, 0x10, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xfb, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf6, - 0x10, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x0f, 0x00, 0x01, 0x0a, - 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xf4, - 0x0f, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0x40, 0x0f, 0x00, 0x01, 0x7f, - 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0x40, - 0x0f, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf8, 0x10, 0x00, 0x01, 0x0f, - 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf0, - 0x10, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, - 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x05, 0x01, 0xd0, 0x0a, 0x00, - 0x01, 0x08, 0x02, 0xff, 0x01, 0x70, 0x02, 0x00, 0x01, 0x05, 0x01, 0xcf, - 0x01, 0xf0, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, - 0x01, 0x98, 0x01, 0x8b, 0x02, 0xff, 0x01, 0xf0, 0x0b, 0x00, 0x01, 0x3f, - 0x06, 0xff, 0x01, 0xc0, 0x0b, 0x00, 0x01, 0x02, 0x01, 0xcf, 0x04, 0xff, - 0x01, 0xc5, 0x0d, 0x00, 0x01, 0x03, 0x01, 0x8b, 0x01, 0xcc, 0x01, 0xb9, + 0xFF, 0x00, 0x36, 0x00, 0x02, 0xDD, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, + 0x02, 0xFF, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, + 0x02, 0x44, 0x37, 0x00, 0x01, 0xBC, 0x01, 0xCB, 0x11, 0x00, 0x01, 0xEF, + 0x01, 0xFE, 0x11, 0x00, 0x01, 0xEF, 0x01, 0xFE, 0x11, 0x00, 0x01, 0xEF, + 0x01, 0xFE, 0x11, 0x00, 0x01, 0xFF, 0x01, 0xFD, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xFB, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xD0, 0x0F, 0x00, 0x01, 0x0A, + 0x02, 0xFF, 0x01, 0x30, 0x0F, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xF4, + 0x0F, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0x40, 0x0F, 0x00, 0x01, 0x7F, + 0x01, 0xFF, 0x01, 0xF4, 0x0F, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0x40, + 0x0F, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x0F, + 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x05, 0x01, 0xD0, 0x0A, 0x00, + 0x01, 0x08, 0x02, 0xFF, 0x01, 0x70, 0x02, 0x00, 0x01, 0x05, 0x01, 0xCF, + 0x01, 0xF0, 0x0A, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0x98, 0x01, 0x8B, 0x02, 0xFF, 0x01, 0xF0, 0x0B, 0x00, 0x01, 0x3F, + 0x06, 0xFF, 0x01, 0xC0, 0x0B, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x04, 0xFF, + 0x01, 0xC5, 0x0D, 0x00, 0x01, 0x03, 0x01, 0x8B, 0x01, 0xCC, 0x01, 0xB9, 0x01, 0x62, 0x31, 0x00, #endif // TOUCH_UI_UTF8_PUNCTUATION #if ENABLED(TOUCH_UI_UTF8_CURRENCY) /* 21 CENT_SIGN */ - 0xb1, 0x00, 0x01, 0x01, 0x01, 0x32, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, - 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, - 0x11, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfc, - 0x11, 0x00, 0x01, 0x39, 0x01, 0xfd, 0x01, 0x42, 0x0e, 0x00, 0x01, 0x05, - 0x01, 0xbf, 0x03, 0xff, 0x01, 0xfb, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, - 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x4f, 0x02, 0xff, - 0x02, 0xfe, 0x01, 0xce, 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x02, - 0x02, 0xff, 0x01, 0xe6, 0x01, 0x05, 0x01, 0xfc, 0x01, 0x00, 0x01, 0x38, - 0x01, 0xe6, 0x0a, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, - 0x01, 0x05, 0x01, 0xfc, 0x02, 0x00, 0x01, 0x02, 0x0a, 0x00, 0x01, 0x5f, - 0x01, 0xff, 0x01, 0xe1, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0d, 0x00, - 0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfc, - 0x0d, 0x00, 0x02, 0xff, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, - 0x01, 0x04, 0x01, 0xff, 0x01, 0xfb, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, - 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x05, - 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, - 0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, - 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x06, - 0x01, 0xff, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, - 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, - 0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb, - 0x0d, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, - 0x01, 0xfb, 0x0d, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, - 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfe, - 0x01, 0x30, 0x01, 0x05, 0x01, 0xfb, 0x02, 0x00, 0x01, 0x33, 0x0a, 0x00, - 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x35, 0x01, 0xfb, - 0x01, 0x02, 0x01, 0x6c, 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x2d, 0x06, 0xff, - 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x01, 0x01, 0x9f, 0x05, 0xff, 0x01, 0xf5, - 0x0c, 0x00, 0x01, 0x02, 0x01, 0x8d, 0x03, 0xff, 0x01, 0xc7, 0x01, 0x20, - 0x0e, 0x00, 0x01, 0x06, 0x01, 0xfc, 0x01, 0x20, 0x10, 0x00, 0x01, 0x05, - 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, - 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, - 0x01, 0xfb, 0x57, 0x00, + 0xB1, 0x00, 0x01, 0x01, 0x01, 0x32, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, + 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, + 0x11, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFC, + 0x11, 0x00, 0x01, 0x39, 0x01, 0xFD, 0x01, 0x42, 0x0E, 0x00, 0x01, 0x05, + 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xFB, 0x01, 0x50, 0x0B, 0x00, 0x01, 0x03, + 0x01, 0xCF, 0x05, 0xFF, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x4F, 0x02, 0xFF, + 0x02, 0xFE, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xF6, 0x0A, 0x00, 0x01, 0x02, + 0x02, 0xFF, 0x01, 0xE6, 0x01, 0x05, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x38, + 0x01, 0xE6, 0x0A, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, + 0x01, 0x05, 0x01, 0xFC, 0x02, 0x00, 0x01, 0x02, 0x0A, 0x00, 0x01, 0x5F, + 0x01, 0xFF, 0x01, 0xE1, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0D, 0x00, + 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x60, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFC, + 0x0D, 0x00, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0C, 0x00, + 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFB, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, + 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x05, + 0x01, 0xFC, 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, 0x02, 0x00, + 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF6, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF9, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, + 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFB, + 0x0D, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, + 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x00, + 0x01, 0x05, 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0x30, 0x01, 0x05, 0x01, 0xFB, 0x02, 0x00, 0x01, 0x33, 0x0A, 0x00, + 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xF9, 0x01, 0x35, 0x01, 0xFB, + 0x01, 0x02, 0x01, 0x6C, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x2D, 0x06, 0xFF, + 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x01, 0x9F, 0x05, 0xFF, 0x01, 0xF5, + 0x0C, 0x00, 0x01, 0x02, 0x01, 0x8D, 0x03, 0xFF, 0x01, 0xC7, 0x01, 0x20, + 0x0E, 0x00, 0x01, 0x06, 0x01, 0xFC, 0x01, 0x20, 0x10, 0x00, 0x01, 0x05, + 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, + 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, + 0x01, 0xFB, 0x57, 0x00, /* 22 POUND_SIGN */ - 0x9e, 0x00, 0x01, 0x6b, 0x01, 0xdf, 0x01, 0xfd, 0x01, 0xc9, 0x01, 0x40, - 0x0d, 0x00, 0x01, 0x6e, 0x05, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x07, - 0x06, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfe, - 0x01, 0x85, 0x01, 0x34, 0x01, 0x7b, 0x01, 0xff, 0x01, 0x30, 0x0b, 0x00, - 0x01, 0xaf, 0x01, 0xff, 0x01, 0xc1, 0x03, 0x00, 0x01, 0x18, 0x01, 0x30, - 0x0a, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00, 0x01, 0x04, - 0x01, 0xff, 0x01, 0xfd, 0x10, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xfa, - 0x10, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf8, 0x10, 0x00, 0x01, 0x09, - 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, - 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, - 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x0e, 0x00, 0x01, 0x0a, - 0x07, 0xff, 0x01, 0xf4, 0x0a, 0x00, 0x01, 0x0a, 0x07, 0xff, 0x01, 0xf4, - 0x0a, 0x00, 0x01, 0x08, 0x01, 0xdd, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe, - 0x03, 0xdd, 0x01, 0xd4, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, - 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, - 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, - 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xf6, 0x0e, 0x00, 0x01, 0x4b, 0x01, 0xbb, 0x01, 0xbe, - 0x01, 0xff, 0x01, 0xfd, 0x05, 0xbb, 0x01, 0x70, 0x08, 0x00, 0x01, 0x6f, - 0x09, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x6f, 0x09, 0xff, 0x01, 0xa0, - 0x08, 0x00, 0x01, 0x4a, 0x09, 0xaa, 0x01, 0x60, 0xc5, 0x00, + 0x9E, 0x00, 0x01, 0x6B, 0x01, 0xDF, 0x01, 0xFD, 0x01, 0xC9, 0x01, 0x40, + 0x0D, 0x00, 0x01, 0x6E, 0x05, 0xFF, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x07, + 0x06, 0xFF, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0x85, 0x01, 0x34, 0x01, 0x7B, 0x01, 0xFF, 0x01, 0x30, 0x0B, 0x00, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xC1, 0x03, 0x00, 0x01, 0x18, 0x01, 0x30, + 0x0A, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x30, 0x0F, 0x00, 0x01, 0x04, + 0x01, 0xFF, 0x01, 0xFD, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xFA, + 0x10, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x09, + 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x0E, 0x00, 0x01, 0x0A, + 0x07, 0xFF, 0x01, 0xF4, 0x0A, 0x00, 0x01, 0x0A, 0x07, 0xFF, 0x01, 0xF4, + 0x0A, 0x00, 0x01, 0x08, 0x01, 0xDD, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFE, + 0x03, 0xDD, 0x01, 0xD4, 0x0C, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF6, 0x0E, 0x00, 0x01, 0x4B, 0x01, 0xBB, 0x01, 0xBE, + 0x01, 0xFF, 0x01, 0xFD, 0x05, 0xBB, 0x01, 0x70, 0x08, 0x00, 0x01, 0x6F, + 0x09, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x6F, 0x09, 0xFF, 0x01, 0xA0, + 0x08, 0x00, 0x01, 0x4A, 0x09, 0xAA, 0x01, 0x60, 0xC5, 0x00, /* 23 CURRENCY_SIGN */ - 0xff, 0x00, 0x0d, 0x00, 0x01, 0x30, 0x07, 0x00, 0x01, 0x01, 0x01, 0x40, - 0x08, 0x00, 0x01, 0x0b, 0x01, 0xf5, 0x07, 0x00, 0x01, 0x1d, 0x01, 0xf4, - 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x01, - 0x01, 0xdf, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x5f, 0x01, 0xff, - 0x01, 0xf4, 0x01, 0x00, 0x01, 0x6b, 0x01, 0xdd, 0x01, 0xc8, 0x01, 0x20, - 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x00, 0x01, 0x05, 0x02, 0xff, - 0x01, 0x8e, 0x03, 0xff, 0x01, 0xfa, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa0, - 0x09, 0x00, 0x01, 0x5f, 0x07, 0xff, 0x01, 0xfa, 0x0a, 0x00, 0x01, 0x05, - 0x02, 0xff, 0x01, 0xe9, 0x01, 0x55, 0x01, 0x7c, 0x02, 0xff, 0x01, 0xa0, - 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x02, 0x00, - 0x01, 0x6f, 0x01, 0xff, 0x01, 0xa0, 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, - 0x01, 0xc0, 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, - 0x01, 0x1f, 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xf7, - 0x0a, 0x00, 0x01, 0x4f, 0x01, 0xfd, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xfa, - 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xfc, - 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x7f, 0x01, 0xfb, - 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0xbf, - 0x01, 0xf8, 0x0a, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0x80, 0x03, 0x00, - 0x01, 0x03, 0x01, 0xff, 0x01, 0xf3, 0x0a, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf5, 0x03, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, - 0x01, 0x01, 0x02, 0xff, 0x01, 0x92, 0x01, 0x00, 0x01, 0x16, 0x01, 0xef, - 0x01, 0xff, 0x01, 0x60, 0x0a, 0x00, 0x01, 0x1d, 0x03, 0xff, 0x01, 0xfe, - 0x03, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x05, 0xff, - 0x01, 0xfe, 0x02, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x1d, 0x01, 0xff, - 0x01, 0xfa, 0x01, 0x06, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x81, - 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4, 0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, - 0x01, 0xa0, 0x01, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x20, 0x01, 0x00, - 0x01, 0x05, 0x02, 0xff, 0x01, 0x20, 0x07, 0x00, 0x01, 0x4f, 0x01, 0xfa, - 0x07, 0x00, 0x01, 0x4f, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x05, 0x01, 0xa0, - 0x07, 0x00, 0x01, 0x05, 0x01, 0x80, 0xeb, 0x00, + 0xFF, 0x00, 0x0D, 0x00, 0x01, 0x30, 0x07, 0x00, 0x01, 0x01, 0x01, 0x40, + 0x08, 0x00, 0x01, 0x0B, 0x01, 0xF5, 0x07, 0x00, 0x01, 0x1D, 0x01, 0xF4, + 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x01, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x30, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, + 0x01, 0xF4, 0x01, 0x00, 0x01, 0x6B, 0x01, 0xDD, 0x01, 0xC8, 0x01, 0x20, + 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xFA, 0x08, 0x00, 0x01, 0x05, 0x02, 0xFF, + 0x01, 0x8E, 0x03, 0xFF, 0x01, 0xFA, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA0, + 0x09, 0x00, 0x01, 0x5F, 0x07, 0xFF, 0x01, 0xFA, 0x0A, 0x00, 0x01, 0x05, + 0x02, 0xFF, 0x01, 0xE9, 0x01, 0x55, 0x01, 0x7C, 0x02, 0xFF, 0x01, 0xA0, + 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x10, 0x02, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xA0, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0xC0, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF2, 0x0A, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xF7, + 0x0A, 0x00, 0x01, 0x4F, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFA, + 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFC, + 0x0A, 0x00, 0x01, 0x5F, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x7F, 0x01, 0xFB, + 0x0A, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0xF8, 0x0A, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0x80, 0x03, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF3, 0x0A, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF5, 0x03, 0x00, 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xC0, 0x0A, 0x00, + 0x01, 0x01, 0x02, 0xFF, 0x01, 0x92, 0x01, 0x00, 0x01, 0x16, 0x01, 0xEF, + 0x01, 0xFF, 0x01, 0x60, 0x0A, 0x00, 0x01, 0x1D, 0x03, 0xFF, 0x01, 0xFE, + 0x03, 0xFF, 0x01, 0xF4, 0x09, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x05, 0xFF, + 0x01, 0xFE, 0x02, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x1D, 0x01, 0xFF, + 0x01, 0xFA, 0x01, 0x06, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x81, + 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xF4, 0x08, 0x00, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0xA0, 0x01, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x20, 0x01, 0x00, + 0x01, 0x05, 0x02, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFA, + 0x07, 0x00, 0x01, 0x4F, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x05, 0x01, 0xA0, + 0x07, 0x00, 0x01, 0x05, 0x01, 0x80, 0xEB, 0x00, /* 24 YEN_SIGN */ 0x98, 0x00, 0x01, 0x01, 0x01, 0x88, 0x01, 0x85, 0x07, 0x00, 0x01, 0x38, - 0x01, 0x88, 0x01, 0x40, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, - 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00, 0x01, 0x3f, - 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, - 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, 0x01, 0x0d, - 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfa, - 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x60, 0x09, 0x00, 0x01, 0xaf, - 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x0a, 0x00, - 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf5, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, - 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, - 0x01, 0xfd, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, - 0x01, 0x7f, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, - 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, - 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, - 0x01, 0xf7, 0x01, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xa0, 0x0a, 0x00, - 0x01, 0x2a, 0x02, 0xaa, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x01, 0xbf, - 0x01, 0xff, 0x01, 0xca, 0x01, 0xaa, 0x01, 0xa5, 0x08, 0x00, 0x01, 0x4f, - 0x04, 0xff, 0x01, 0x83, 0x04, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x3c, - 0x02, 0xcc, 0x01, 0xce, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xfc, - 0x02, 0xcc, 0x01, 0xc6, 0x0b, 0x00, 0x01, 0x03, 0x03, 0xff, 0x01, 0x70, - 0x0f, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xfe, 0x10, 0x00, 0x01, 0x2f, - 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x01, 0x03, 0x11, 0x01, 0x1e, - 0x01, 0xff, 0x01, 0xf3, 0x03, 0x11, 0x01, 0x10, 0x08, 0x00, 0x01, 0x4f, - 0x09, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x4f, 0x09, 0xff, 0x01, 0xf8, - 0x08, 0x00, 0x01, 0x27, 0x03, 0x77, 0x01, 0x7e, 0x01, 0xff, 0x01, 0xf8, - 0x03, 0x77, 0x01, 0x73, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, - 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, - 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, - 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, - 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, - 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x08, - 0x01, 0x99, 0x01, 0x91, 0xc9, 0x00, + 0x01, 0x88, 0x01, 0x40, 0x07, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x10, + 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0x90, 0x05, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF8, + 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, 0x01, 0x0D, + 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFA, + 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x60, 0x09, 0x00, 0x01, 0xAF, + 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0xEF, 0x01, 0xFD, 0x0A, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xC0, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF4, 0x03, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xC0, 0x0A, 0x00, 0x01, 0x01, 0x01, 0xEF, + 0x01, 0xFD, 0x03, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, + 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x50, 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, + 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF3, 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, + 0x01, 0xF7, 0x01, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xA0, 0x0A, 0x00, + 0x01, 0x2A, 0x02, 0xAA, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x10, 0x01, 0xBF, + 0x01, 0xFF, 0x01, 0xCA, 0x01, 0xAA, 0x01, 0xA5, 0x08, 0x00, 0x01, 0x4F, + 0x04, 0xFF, 0x01, 0x83, 0x04, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x3C, + 0x02, 0xCC, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, 0x01, 0xFC, + 0x02, 0xCC, 0x01, 0xC6, 0x0B, 0x00, 0x01, 0x03, 0x03, 0xFF, 0x01, 0x70, + 0x0F, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xFE, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0xF5, 0x0C, 0x00, 0x01, 0x01, 0x03, 0x11, 0x01, 0x1E, + 0x01, 0xFF, 0x01, 0xF3, 0x03, 0x11, 0x01, 0x10, 0x08, 0x00, 0x01, 0x4F, + 0x09, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x4F, 0x09, 0xFF, 0x01, 0xF8, + 0x08, 0x00, 0x01, 0x27, 0x03, 0x77, 0x01, 0x7E, 0x01, 0xFF, 0x01, 0xF8, + 0x03, 0x77, 0x01, 0x73, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, + 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, + 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, + 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x08, + 0x01, 0x99, 0x01, 0x91, 0xC9, 0x00, #endif // TOUCH_UI_UTF8_CURRENCY #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) /* 25 SUPERSCRIPT_ONE */ - 0x99, 0x00, 0x01, 0x01, 0x01, 0x36, 0x01, 0x9b, 0x01, 0xbb, 0x01, 0x20, - 0x0e, 0x00, 0x01, 0x3f, 0x03, 0xff, 0x01, 0x20, 0x0e, 0x00, 0x01, 0x3f, - 0x01, 0xfe, 0x01, 0xbe, 0x01, 0xff, 0x01, 0x20, 0x0e, 0x00, 0x01, 0x14, - 0x01, 0x10, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, - 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, - 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, - 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x11, 0x01, 0x1c, 0x01, 0xff, - 0x01, 0x31, 0x01, 0x11, 0x0d, 0x00, 0x01, 0x0d, 0x05, 0xff, 0x01, 0x40, - 0x0c, 0x00, 0x01, 0x0d, 0x05, 0xff, 0x01, 0x40, 0x0c, 0x00, 0x01, 0x01, - 0x05, 0x22, 0xff, 0x00, 0xc2, 0x00, + 0x99, 0x00, 0x01, 0x01, 0x01, 0x36, 0x01, 0x9B, 0x01, 0xBB, 0x01, 0x20, + 0x0E, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, 0x0E, 0x00, 0x01, 0x3F, + 0x01, 0xFE, 0x01, 0xBE, 0x01, 0xFF, 0x01, 0x20, 0x0E, 0x00, 0x01, 0x14, + 0x01, 0x10, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x11, 0x01, 0x1C, 0x01, 0xFF, + 0x01, 0x31, 0x01, 0x11, 0x0D, 0x00, 0x01, 0x0D, 0x05, 0xFF, 0x01, 0x40, + 0x0C, 0x00, 0x01, 0x0D, 0x05, 0xFF, 0x01, 0x40, 0x0C, 0x00, 0x01, 0x01, + 0x05, 0x22, 0xFF, 0x00, 0xC2, 0x00, /* 26 SUPERSCRIPT_TWO */ - 0x88, 0x00, 0x01, 0x01, 0x10, 0x00, 0x01, 0x16, 0x01, 0xae, 0x01, 0xff, - 0x01, 0xfd, 0x01, 0x92, 0x0e, 0x00, 0x05, 0xff, 0x01, 0x60, 0x0d, 0x00, - 0x01, 0xfe, 0x01, 0x84, 0x01, 0x22, 0x01, 0x5c, 0x01, 0xff, 0x01, 0xf3, - 0x0d, 0x00, 0x01, 0x50, 0x03, 0x00, 0x01, 0xcf, 0x01, 0xfa, 0x11, 0x00, - 0x01, 0x5f, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x5f, 0x01, 0xfb, 0x11, 0x00, - 0x01, 0xcf, 0x01, 0xf4, 0x10, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x6f, 0x01, 0xfe, 0x01, 0x10, 0x0f, 0x00, 0x01, 0x05, - 0x01, 0xff, 0x01, 0xe2, 0x10, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x30, - 0x0f, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xe3, 0x10, 0x00, 0x01, 0x6f, - 0x01, 0xfe, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xd1, - 0x10, 0x00, 0x01, 0xaf, 0x01, 0xfd, 0x01, 0x43, 0x03, 0x33, 0x0c, 0x00, - 0x01, 0x01, 0x06, 0xff, 0x0c, 0x00, 0x01, 0x01, 0x06, 0xff, 0x0d, 0x00, - 0x06, 0x22, 0xff, 0x00, 0xc2, 0x00, + 0x88, 0x00, 0x01, 0x01, 0x10, 0x00, 0x01, 0x16, 0x01, 0xAE, 0x01, 0xFF, + 0x01, 0xFD, 0x01, 0x92, 0x0E, 0x00, 0x05, 0xFF, 0x01, 0x60, 0x0D, 0x00, + 0x01, 0xFE, 0x01, 0x84, 0x01, 0x22, 0x01, 0x5C, 0x01, 0xFF, 0x01, 0xF3, + 0x0D, 0x00, 0x01, 0x50, 0x03, 0x00, 0x01, 0xCF, 0x01, 0xFA, 0x11, 0x00, + 0x01, 0x5F, 0x01, 0xFC, 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFB, 0x11, 0x00, + 0x01, 0xCF, 0x01, 0xF4, 0x10, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x6F, 0x01, 0xFE, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x05, + 0x01, 0xFF, 0x01, 0xE2, 0x10, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x30, + 0x0F, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xE3, 0x10, 0x00, 0x01, 0x6F, + 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xD1, + 0x10, 0x00, 0x01, 0xAF, 0x01, 0xFD, 0x01, 0x43, 0x03, 0x33, 0x0C, 0x00, + 0x01, 0x01, 0x06, 0xFF, 0x0C, 0x00, 0x01, 0x01, 0x06, 0xFF, 0x0D, 0x00, + 0x06, 0x22, 0xFF, 0x00, 0xC2, 0x00, /* 27 SUPERSCRIPT_THREE */ - 0x88, 0x00, 0x01, 0x01, 0x01, 0x10, 0x0f, 0x00, 0x01, 0x39, 0x01, 0xce, - 0x02, 0xff, 0x01, 0xb5, 0x0e, 0x00, 0x01, 0x7f, 0x04, 0xff, 0x01, 0xb0, - 0x0d, 0x00, 0x01, 0x6b, 0x01, 0x73, 0x01, 0x22, 0x01, 0x38, 0x01, 0xff, - 0x01, 0xf9, 0x11, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x11, 0x00, 0x01, 0x0f, - 0x01, 0xff, 0x11, 0x00, 0x01, 0x4f, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x27, - 0x01, 0xff, 0x01, 0xf3, 0x0e, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xfa, - 0x01, 0x20, 0x0e, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x40, - 0x0e, 0x00, 0x01, 0x01, 0x01, 0x23, 0x01, 0x49, 0x01, 0xff, 0x01, 0xf6, - 0x11, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x10, 0x10, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0x60, - 0x10, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0x40, 0x0c, 0x00, 0x01, 0xa4, - 0x02, 0x00, 0x01, 0x05, 0x01, 0xdf, 0x01, 0xfd, 0x0d, 0x00, 0x02, 0xff, - 0x01, 0xde, 0x02, 0xff, 0x01, 0xe3, 0x0d, 0x00, 0x01, 0xae, 0x03, 0xff, - 0x01, 0xe9, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x24, 0x01, 0x55, 0x01, 0x52, - 0xff, 0x00, 0xc4, 0x00, + 0x88, 0x00, 0x01, 0x01, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x39, 0x01, 0xCE, + 0x02, 0xFF, 0x01, 0xB5, 0x0E, 0x00, 0x01, 0x7F, 0x04, 0xFF, 0x01, 0xB0, + 0x0D, 0x00, 0x01, 0x6B, 0x01, 0x73, 0x01, 0x22, 0x01, 0x38, 0x01, 0xFF, + 0x01, 0xF9, 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x11, 0x00, 0x01, 0x0F, + 0x01, 0xFF, 0x11, 0x00, 0x01, 0x4F, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x27, + 0x01, 0xFF, 0x01, 0xF3, 0x0E, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xFA, + 0x01, 0x20, 0x0E, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x40, + 0x0E, 0x00, 0x01, 0x01, 0x01, 0x23, 0x01, 0x49, 0x01, 0xFF, 0x01, 0xF6, + 0x11, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x60, + 0x10, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x40, 0x0C, 0x00, 0x01, 0xA4, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xDF, 0x01, 0xFD, 0x0D, 0x00, 0x02, 0xFF, + 0x01, 0xDE, 0x02, 0xFF, 0x01, 0xE3, 0x0D, 0x00, 0x01, 0xAE, 0x03, 0xFF, + 0x01, 0xE9, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x24, 0x01, 0x55, 0x01, 0x52, + 0xFF, 0x00, 0xC4, 0x00, #endif // TOUCH_UI_UTF8_SUPERSCRIPTS #if ENABLED(TOUCH_UI_UTF8_ORDINALS) /* 28 MASCULINE_ORDINAL */ - 0x89, 0x00, 0x01, 0x01, 0x01, 0x10, 0x0f, 0x00, 0x01, 0x01, 0x01, 0x8d, - 0x02, 0xff, 0x01, 0xb4, 0x0e, 0x00, 0x01, 0x4f, 0x04, 0xff, 0x01, 0xa0, - 0x0c, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x63, 0x01, 0x48, - 0x01, 0xff, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xa0, - 0x02, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x6f, - 0x01, 0xfe, 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00, - 0x01, 0xbf, 0x01, 0xf7, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, - 0x01, 0xef, 0x01, 0xf3, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xf6, 0x0b, 0x00, - 0x01, 0xff, 0x01, 0xf1, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xf7, 0x0b, 0x00, - 0x01, 0xff, 0x01, 0xf1, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xf7, 0x0b, 0x00, - 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xf6, 0x0b, 0x00, - 0x01, 0xcf, 0x01, 0xf6, 0x04, 0x00, 0x01, 0xef, 0x01, 0xf4, 0x0b, 0x00, - 0x01, 0x8f, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf0, - 0x0b, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0x1d, - 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf8, - 0x01, 0x10, 0x01, 0x04, 0x01, 0xdf, 0x01, 0xfe, 0x01, 0x10, 0x0c, 0x00, - 0x01, 0xaf, 0x04, 0xff, 0x01, 0xe3, 0x0d, 0x00, 0x01, 0x05, 0x01, 0xdf, - 0x02, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x02, 0x01, 0x56, - 0x01, 0x64, 0x21, 0x00, 0x01, 0x16, 0x06, 0x66, 0x01, 0x40, 0x0b, 0x00, - 0x01, 0x3f, 0x06, 0xff, 0x01, 0xb0, 0x0b, 0x00, 0x01, 0x3f, 0x06, 0xff, - 0x01, 0xb0, 0x0b, 0x00, 0x01, 0x01, 0x06, 0x11, 0xff, 0x00, 0x75, 0x00, + 0x89, 0x00, 0x01, 0x01, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x01, 0x01, 0x8D, + 0x02, 0xFF, 0x01, 0xB4, 0x0E, 0x00, 0x01, 0x4F, 0x04, 0xFF, 0x01, 0xA0, + 0x0C, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x63, 0x01, 0x48, + 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xA0, + 0x02, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x0B, 0x00, 0x01, 0x6F, + 0x01, 0xFE, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xD0, 0x0B, 0x00, + 0x01, 0xBF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xFF, 0x01, 0xF2, 0x0B, 0x00, + 0x01, 0xEF, 0x01, 0xF3, 0x04, 0x00, 0x01, 0xCF, 0x01, 0xF6, 0x0B, 0x00, + 0x01, 0xFF, 0x01, 0xF1, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xF7, 0x0B, 0x00, + 0x01, 0xFF, 0x01, 0xF1, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xF7, 0x0B, 0x00, + 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xBF, 0x01, 0xF6, 0x0B, 0x00, + 0x01, 0xCF, 0x01, 0xF6, 0x04, 0x00, 0x01, 0xEF, 0x01, 0xF4, 0x0B, 0x00, + 0x01, 0x8F, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xF0, + 0x0B, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0x1D, + 0x01, 0xFF, 0x01, 0x90, 0x0B, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF8, + 0x01, 0x10, 0x01, 0x04, 0x01, 0xDF, 0x01, 0xFE, 0x01, 0x10, 0x0C, 0x00, + 0x01, 0xAF, 0x04, 0xFF, 0x01, 0xE3, 0x0D, 0x00, 0x01, 0x05, 0x01, 0xDF, + 0x02, 0xFF, 0x01, 0xFA, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x02, 0x01, 0x56, + 0x01, 0x64, 0x21, 0x00, 0x01, 0x16, 0x06, 0x66, 0x01, 0x40, 0x0B, 0x00, + 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x3F, 0x06, 0xFF, + 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x01, 0x06, 0x11, 0xFF, 0x00, 0x75, 0x00, /* 29 FEMININE_ORDINAL */ - 0x89, 0x00, 0x01, 0x12, 0x01, 0x10, 0x0f, 0x00, 0x01, 0x49, 0x01, 0xdf, - 0x02, 0xff, 0x01, 0xb4, 0x0d, 0x00, 0x01, 0x07, 0x05, 0xff, 0x01, 0xa0, - 0x0c, 0x00, 0x01, 0x07, 0x01, 0xfc, 0x01, 0x74, 0x01, 0x33, 0x01, 0x59, - 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0x03, 0x01, 0x20, 0x03, 0x00, - 0x01, 0x3f, 0x01, 0xff, 0x01, 0x10, 0x10, 0x00, 0x01, 0x09, 0x01, 0xff, - 0x01, 0x50, 0x0e, 0x00, 0x01, 0x01, 0x01, 0x11, 0x01, 0x16, 0x01, 0xff, - 0x01, 0x80, 0x0c, 0x00, 0x01, 0x05, 0x01, 0xae, 0x04, 0xff, 0x01, 0x90, - 0x0b, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff, 0x01, 0xa0, 0x0b, 0x00, - 0x01, 0x0d, 0x01, 0xff, 0x01, 0xe9, 0x01, 0x65, 0x01, 0x44, 0x01, 0x48, - 0x01, 0xff, 0x01, 0xa0, 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xfd, 0x01, 0x10, - 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xa0, 0x0b, 0x00, 0x01, 0x9f, - 0x01, 0xf6, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xa0, 0x0b, 0x00, - 0x01, 0xaf, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xa0, - 0x0b, 0x00, 0x01, 0x9f, 0x01, 0xfa, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xff, - 0x01, 0xa0, 0x0b, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa2, 0x01, 0x00, - 0x01, 0x3b, 0x02, 0xff, 0x01, 0xa0, 0x0b, 0x00, 0x01, 0x0a, 0x04, 0xff, - 0x01, 0xe7, 0x01, 0xff, 0x01, 0xa0, 0x0c, 0x00, 0x01, 0x8f, 0x02, 0xff, - 0x01, 0xf9, 0x01, 0x15, 0x01, 0xff, 0x01, 0xa0, 0x0d, 0x00, 0x01, 0x46, - 0x01, 0x64, 0x02, 0x00, 0x01, 0x11, 0x1f, 0x00, 0x01, 0x16, 0x06, 0x66, - 0x01, 0x40, 0x0b, 0x00, 0x01, 0x3f, 0x06, 0xff, 0x01, 0xb0, 0x0b, 0x00, - 0x01, 0x3f, 0x06, 0xff, 0x01, 0xb0, 0x0b, 0x00, 0x01, 0x01, 0x06, 0x11, - 0xff, 0x00, 0x75, 0x00, + 0x89, 0x00, 0x01, 0x12, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x49, 0x01, 0xDF, + 0x02, 0xFF, 0x01, 0xB4, 0x0D, 0x00, 0x01, 0x07, 0x05, 0xFF, 0x01, 0xA0, + 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFC, 0x01, 0x74, 0x01, 0x33, 0x01, 0x59, + 0x01, 0xFF, 0x01, 0xF8, 0x0C, 0x00, 0x01, 0x03, 0x01, 0x20, 0x03, 0x00, + 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x09, 0x01, 0xFF, + 0x01, 0x50, 0x0E, 0x00, 0x01, 0x01, 0x01, 0x11, 0x01, 0x16, 0x01, 0xFF, + 0x01, 0x80, 0x0C, 0x00, 0x01, 0x05, 0x01, 0xAE, 0x04, 0xFF, 0x01, 0x90, + 0x0B, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x05, 0xFF, 0x01, 0xA0, 0x0B, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xE9, 0x01, 0x65, 0x01, 0x44, 0x01, 0x48, + 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x5F, 0x01, 0xFD, 0x01, 0x10, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x9F, + 0x01, 0xF6, 0x03, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, + 0x01, 0xAF, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xA0, + 0x0B, 0x00, 0x01, 0x9F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xAF, 0x01, 0xFF, + 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA2, 0x01, 0x00, + 0x01, 0x3B, 0x02, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x0A, 0x04, 0xFF, + 0x01, 0xE7, 0x01, 0xFF, 0x01, 0xA0, 0x0C, 0x00, 0x01, 0x8F, 0x02, 0xFF, + 0x01, 0xF9, 0x01, 0x15, 0x01, 0xFF, 0x01, 0xA0, 0x0D, 0x00, 0x01, 0x46, + 0x01, 0x64, 0x02, 0x00, 0x01, 0x11, 0x1F, 0x00, 0x01, 0x16, 0x06, 0x66, + 0x01, 0x40, 0x0B, 0x00, 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, + 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x01, 0x06, 0x11, + 0xFF, 0x00, 0x75, 0x00, #endif // TOUCH_UI_UTF8_ORDINALS #if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) /* 30 COPYRIGHT_SIGN */ - 0xa0, 0x00, 0x01, 0x01, 0x01, 0x45, 0x01, 0x76, 0x01, 0x43, 0x0e, 0x00, - 0x01, 0x28, 0x01, 0xdf, 0x03, 0xff, 0x01, 0xe9, 0x01, 0x40, 0x0b, 0x00, - 0x01, 0x19, 0x02, 0xff, 0x01, 0xdb, 0x01, 0xab, 0x01, 0xce, 0x01, 0xff, - 0x01, 0xfb, 0x01, 0x30, 0x09, 0x00, 0x01, 0x03, 0x01, 0xef, 0x01, 0xfb, - 0x01, 0x50, 0x03, 0x00, 0x01, 0x38, 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00, - 0x01, 0x6f, 0x01, 0xfc, 0x01, 0x30, 0x05, 0x00, 0x01, 0x19, 0x01, 0xff, - 0x01, 0xa0, 0x07, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, - 0x01, 0x5f, 0x01, 0xfb, 0x07, 0x00, 0x01, 0x3f, 0x01, 0xf8, 0x03, 0x00, + 0xA0, 0x00, 0x01, 0x01, 0x01, 0x45, 0x01, 0x76, 0x01, 0x43, 0x0E, 0x00, + 0x01, 0x28, 0x01, 0xDF, 0x03, 0xFF, 0x01, 0xE9, 0x01, 0x40, 0x0B, 0x00, + 0x01, 0x19, 0x02, 0xFF, 0x01, 0xDB, 0x01, 0xAB, 0x01, 0xCE, 0x01, 0xFF, + 0x01, 0xFB, 0x01, 0x30, 0x09, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFB, + 0x01, 0x50, 0x03, 0x00, 0x01, 0x38, 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, + 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x19, 0x01, 0xFF, + 0x01, 0xA0, 0x07, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xA0, 0x07, 0x00, + 0x01, 0x5F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x46, 0x01, 0x88, 0x01, 0x65, 0x01, 0x10, 0x01, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0x80, 0x06, 0x00, 0x01, 0xef, 0x01, 0xa0, 0x01, 0x00, - 0x01, 0x01, 0x01, 0x9f, 0x03, 0xff, 0x01, 0xfc, 0x01, 0x60, 0x01, 0x00, - 0x01, 0x4f, 0x01, 0xf4, 0x05, 0x00, 0x01, 0x08, 0x01, 0xfd, 0x02, 0x00, - 0x01, 0x4e, 0x02, 0xff, 0x01, 0xed, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, - 0x01, 0x00, 0x01, 0x08, 0x01, 0xfd, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xf4, - 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x61, 0x01, 0x00, - 0x01, 0x01, 0x01, 0x4a, 0x01, 0xa0, 0x02, 0x00, 0x01, 0xef, 0x01, 0x60, - 0x04, 0x00, 0x01, 0x6f, 0x01, 0xc0, 0x01, 0x00, 0x01, 0x0e, 0x01, 0xff, - 0x01, 0xc1, 0x07, 0x00, 0x01, 0x7f, 0x01, 0xb0, 0x04, 0x00, 0x01, 0xbf, - 0x01, 0x60, 0x01, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00, - 0x01, 0x1f, 0x01, 0xf0, 0x04, 0x00, 0x01, 0xff, 0x01, 0x20, 0x01, 0x00, - 0x01, 0xdf, 0x01, 0xf9, 0x08, 0x00, 0x01, 0x0d, 0x01, 0xf4, 0x03, 0x00, - 0x01, 0x01, 0x01, 0xfe, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf4, - 0x08, 0x00, 0x01, 0x0a, 0x01, 0xf6, 0x03, 0x00, 0x01, 0x03, 0x01, 0xfd, - 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0x08, - 0x01, 0xf8, 0x03, 0x00, 0x01, 0x04, 0x01, 0xfc, 0x01, 0x00, 0x01, 0x03, - 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x07, 0x01, 0xf9, 0x03, 0x00, - 0x01, 0x03, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf1, - 0x08, 0x00, 0x01, 0x08, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x01, 0x01, 0xfe, - 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf3, 0x08, 0x00, 0x01, 0x09, - 0x01, 0xf7, 0x04, 0x00, 0x01, 0xff, 0x01, 0x10, 0x01, 0x00, 0x01, 0xdf, - 0x01, 0xf8, 0x08, 0x00, 0x01, 0x0c, 0x01, 0xf5, 0x04, 0x00, 0x01, 0xbf, - 0x01, 0x60, 0x01, 0x00, 0x01, 0x8f, 0x01, 0xfe, 0x01, 0x10, 0x07, 0x00, - 0x01, 0x1f, 0x01, 0xf1, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xb0, 0x01, 0x00, - 0x01, 0x1f, 0x01, 0xff, 0x01, 0xb0, 0x07, 0x00, 0x01, 0x6f, 0x01, 0xc0, - 0x04, 0x00, 0x01, 0x1f, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, - 0x01, 0xfd, 0x01, 0x50, 0x02, 0x00, 0x01, 0x29, 0x01, 0xa0, 0x02, 0x00, - 0x01, 0xef, 0x01, 0x60, 0x04, 0x00, 0x01, 0x08, 0x01, 0xfd, 0x02, 0x00, - 0x01, 0x6f, 0x02, 0xff, 0x01, 0xdb, 0x01, 0xce, 0x01, 0xff, 0x01, 0xb0, - 0x01, 0x00, 0x01, 0x07, 0x01, 0xfd, 0x05, 0x00, 0x01, 0x01, 0x01, 0xef, - 0x01, 0x90, 0x01, 0x00, 0x01, 0x02, 0x01, 0xbf, 0x03, 0xff, 0x01, 0xfe, - 0x01, 0x70, 0x01, 0x00, 0x01, 0x4f, 0x01, 0xf4, 0x06, 0x00, 0x01, 0x4f, - 0x01, 0xf7, 0x02, 0x00, 0x01, 0x01, 0x01, 0x58, 0x01, 0x9a, 0x01, 0x86, - 0x01, 0x30, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0x80, 0x06, 0x00, - 0x01, 0x06, 0x01, 0xff, 0x01, 0x90, 0x07, 0x00, 0x01, 0x4f, 0x01, 0xfb, - 0x08, 0x00, 0x01, 0x6f, 0x01, 0xfc, 0x01, 0x30, 0x05, 0x00, 0x01, 0x18, - 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x04, 0x01, 0xef, 0x01, 0xfa, - 0x01, 0x40, 0x03, 0x00, 0x01, 0x27, 0x01, 0xef, 0x01, 0xf8, 0x0a, 0x00, - 0x01, 0x19, 0x02, 0xff, 0x01, 0xca, 0x01, 0x9a, 0x01, 0xbe, 0x01, 0xff, - 0x01, 0xfc, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x29, 0x01, 0xdf, 0x03, 0xff, - 0x01, 0xfa, 0x01, 0x40, 0x0d, 0x00, 0x01, 0x02, 0x01, 0x46, 0x01, 0x76, - 0x01, 0x53, 0xc5, 0x00, + 0x01, 0xFF, 0x01, 0x80, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x9F, 0x03, 0xFF, 0x01, 0xFC, 0x01, 0x60, 0x01, 0x00, + 0x01, 0x4F, 0x01, 0xF4, 0x05, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, + 0x01, 0x4E, 0x02, 0xFF, 0x01, 0xED, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, + 0x01, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x1F, 0x01, 0xF4, + 0x01, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x61, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x4A, 0x01, 0xA0, 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, + 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, + 0x01, 0xC1, 0x07, 0x00, 0x01, 0x7F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0x60, 0x01, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, + 0x01, 0x1F, 0x01, 0xF0, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x00, + 0x01, 0xDF, 0x01, 0xF9, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xF4, 0x03, 0x00, + 0x01, 0x01, 0x01, 0xFE, 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF4, + 0x08, 0x00, 0x01, 0x0A, 0x01, 0xF6, 0x03, 0x00, 0x01, 0x03, 0x01, 0xFD, + 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF1, 0x08, 0x00, 0x01, 0x08, + 0x01, 0xF8, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, 0x01, 0x07, 0x01, 0xF9, 0x03, 0x00, + 0x01, 0x03, 0x01, 0xFD, 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF1, + 0x08, 0x00, 0x01, 0x08, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x01, 0x01, 0xFE, + 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF3, 0x08, 0x00, 0x01, 0x09, + 0x01, 0xF7, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x10, 0x01, 0x00, 0x01, 0xDF, + 0x01, 0xF8, 0x08, 0x00, 0x01, 0x0C, 0x01, 0xF5, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0x60, 0x01, 0x00, 0x01, 0x8F, 0x01, 0xFE, 0x01, 0x10, 0x07, 0x00, + 0x01, 0x1F, 0x01, 0xF1, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xB0, 0x01, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x6F, 0x01, 0xC0, + 0x04, 0x00, 0x01, 0x1F, 0x01, 0xF4, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, + 0x01, 0xFD, 0x01, 0x50, 0x02, 0x00, 0x01, 0x29, 0x01, 0xA0, 0x02, 0x00, + 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, + 0x01, 0x6F, 0x02, 0xFF, 0x01, 0xDB, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xB0, + 0x01, 0x00, 0x01, 0x07, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x01, 0x01, 0xEF, + 0x01, 0x90, 0x01, 0x00, 0x01, 0x02, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xFE, + 0x01, 0x70, 0x01, 0x00, 0x01, 0x4F, 0x01, 0xF4, 0x06, 0x00, 0x01, 0x4F, + 0x01, 0xF7, 0x02, 0x00, 0x01, 0x01, 0x01, 0x58, 0x01, 0x9A, 0x01, 0x86, + 0x01, 0x30, 0x01, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0x80, 0x06, 0x00, + 0x01, 0x06, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFB, + 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x18, + 0x01, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFA, + 0x01, 0x40, 0x03, 0x00, 0x01, 0x27, 0x01, 0xEF, 0x01, 0xF8, 0x0A, 0x00, + 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCA, 0x01, 0x9A, 0x01, 0xBE, 0x01, 0xFF, + 0x01, 0xFC, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x29, 0x01, 0xDF, 0x03, 0xFF, + 0x01, 0xFA, 0x01, 0x40, 0x0D, 0x00, 0x01, 0x02, 0x01, 0x46, 0x01, 0x76, + 0x01, 0x53, 0xC5, 0x00, /* 31 REGISTERED_SIGN */ - 0xa0, 0x00, 0x01, 0x02, 0x01, 0x46, 0x01, 0x76, 0x01, 0x53, 0x0e, 0x00, - 0x01, 0x28, 0x01, 0xdf, 0x03, 0xff, 0x01, 0xea, 0x01, 0x40, 0x0b, 0x00, - 0x01, 0x19, 0x02, 0xff, 0x01, 0xcb, 0x01, 0x9a, 0x01, 0xce, 0x01, 0xff, - 0x01, 0xfc, 0x01, 0x30, 0x09, 0x00, 0x01, 0x04, 0x01, 0xef, 0x01, 0xfa, - 0x01, 0x40, 0x03, 0x00, 0x01, 0x38, 0x01, 0xff, 0x01, 0xf8, 0x09, 0x00, - 0x01, 0x6f, 0x01, 0xfc, 0x01, 0x30, 0x05, 0x00, 0x01, 0x18, 0x01, 0xff, - 0x01, 0xa0, 0x07, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0x90, 0x07, 0x00, - 0x01, 0x4f, 0x01, 0xfb, 0x07, 0x00, 0x01, 0x3f, 0x01, 0xf7, 0x01, 0x00, - 0x01, 0x13, 0x02, 0x33, 0x01, 0x32, 0x03, 0x00, 0x01, 0x02, 0x01, 0xff, - 0x01, 0x80, 0x06, 0x00, 0x01, 0xef, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x7f, - 0x03, 0xff, 0x01, 0xfd, 0x01, 0x81, 0x02, 0x00, 0x01, 0x4f, 0x01, 0xf5, - 0x05, 0x00, 0x01, 0x08, 0x01, 0xfd, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff, - 0x01, 0xdd, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x01, 0x00, - 0x01, 0x08, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xf4, 0x02, 0x00, - 0x01, 0x7f, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x3c, 0x01, 0xff, 0x01, 0xd0, - 0x02, 0x00, 0x01, 0xef, 0x01, 0x60, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xc0, - 0x02, 0x00, 0x01, 0x7f, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, - 0x01, 0xf3, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xb0, 0x04, 0x00, 0x01, 0xbf, - 0x01, 0x60, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xfa, 0x03, 0x00, 0x01, 0xff, - 0x01, 0xf4, 0x02, 0x00, 0x01, 0x1f, 0x01, 0xf0, 0x04, 0x00, 0x01, 0xff, - 0x01, 0x10, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xfa, 0x03, 0x00, 0x01, 0xff, - 0x01, 0xf2, 0x02, 0x00, 0x01, 0x0c, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x01, - 0x01, 0xfe, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x08, - 0x01, 0xff, 0x01, 0xe0, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xf6, 0x03, 0x00, - 0x01, 0x03, 0x01, 0xfd, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xfd, 0x01, 0x88, - 0x01, 0x9a, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x30, 0x02, 0x00, 0x01, 0x08, - 0x01, 0xf8, 0x03, 0x00, 0x01, 0x04, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x7f, - 0x03, 0xff, 0x01, 0xfe, 0x01, 0x91, 0x03, 0x00, 0x01, 0x07, 0x01, 0xf9, - 0x03, 0x00, 0x01, 0x03, 0x01, 0xfd, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xfc, - 0x01, 0x78, 0x01, 0xdf, 0x01, 0xfd, 0x01, 0x20, 0x03, 0x00, 0x01, 0x08, - 0x01, 0xf8, 0x03, 0x00, 0x01, 0x01, 0x01, 0xfe, 0x03, 0x00, 0x01, 0x7f, - 0x01, 0xfa, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, - 0x01, 0x09, 0x01, 0xf6, 0x04, 0x00, 0x01, 0xff, 0x01, 0x10, 0x02, 0x00, - 0x01, 0x7f, 0x01, 0xfa, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xf8, 0x03, 0x00, - 0x01, 0x0c, 0x01, 0xf5, 0x04, 0x00, 0x01, 0xbf, 0x01, 0x60, 0x02, 0x00, - 0x01, 0x7f, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x30, - 0x02, 0x00, 0x01, 0x1f, 0x01, 0xf1, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xc0, - 0x02, 0x00, 0x01, 0x7f, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, - 0x01, 0xd0, 0x02, 0x00, 0x01, 0x6f, 0x01, 0xb0, 0x04, 0x00, 0x01, 0x1f, - 0x01, 0xf4, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x01, - 0x01, 0xef, 0x01, 0xf7, 0x02, 0x00, 0x01, 0xef, 0x01, 0x60, 0x04, 0x00, - 0x01, 0x08, 0x01, 0xfd, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xfa, 0x03, 0x00, - 0x01, 0x6f, 0x01, 0xff, 0x01, 0x20, 0x01, 0x08, 0x01, 0xfe, 0x06, 0x00, - 0x01, 0xef, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x5a, 0x01, 0xa6, 0x03, 0x00, - 0x01, 0x09, 0x01, 0xaa, 0x01, 0x60, 0x01, 0x4f, 0x01, 0xf4, 0x06, 0x00, - 0x01, 0x3f, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0x80, - 0x06, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0x90, 0x07, 0x00, 0x01, 0x4f, - 0x01, 0xfb, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xfc, 0x01, 0x30, 0x05, 0x00, - 0x01, 0x19, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x04, 0x01, 0xef, - 0x01, 0xfa, 0x01, 0x40, 0x03, 0x00, 0x01, 0x38, 0x01, 0xef, 0x01, 0xf8, - 0x0a, 0x00, 0x01, 0x19, 0x02, 0xff, 0x01, 0xcb, 0x01, 0x9a, 0x01, 0xce, - 0x01, 0xff, 0x01, 0xfc, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x28, 0x01, 0xdf, - 0x03, 0xff, 0x01, 0xea, 0x01, 0x40, 0x0d, 0x00, 0x01, 0x02, 0x01, 0x45, - 0x01, 0x76, 0x01, 0x43, 0xc5, 0x00, + 0xA0, 0x00, 0x01, 0x02, 0x01, 0x46, 0x01, 0x76, 0x01, 0x53, 0x0E, 0x00, + 0x01, 0x28, 0x01, 0xDF, 0x03, 0xFF, 0x01, 0xEA, 0x01, 0x40, 0x0B, 0x00, + 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCB, 0x01, 0x9A, 0x01, 0xCE, 0x01, 0xFF, + 0x01, 0xFC, 0x01, 0x30, 0x09, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFA, + 0x01, 0x40, 0x03, 0x00, 0x01, 0x38, 0x01, 0xFF, 0x01, 0xF8, 0x09, 0x00, + 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x18, 0x01, 0xFF, + 0x01, 0xA0, 0x07, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, + 0x01, 0x4F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xF7, 0x01, 0x00, + 0x01, 0x13, 0x02, 0x33, 0x01, 0x32, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0x80, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x7F, + 0x03, 0xFF, 0x01, 0xFD, 0x01, 0x81, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xF5, + 0x05, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFF, + 0x01, 0xDD, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x30, 0x01, 0x00, + 0x01, 0x08, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x1F, 0x01, 0xF4, 0x02, 0x00, + 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x3C, 0x01, 0xFF, 0x01, 0xD0, + 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, + 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0xF3, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0x60, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xFF, + 0x01, 0xF4, 0x02, 0x00, 0x01, 0x1F, 0x01, 0xF0, 0x04, 0x00, 0x01, 0xFF, + 0x01, 0x10, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xFF, + 0x01, 0xF2, 0x02, 0x00, 0x01, 0x0C, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x01, + 0x01, 0xFE, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x08, + 0x01, 0xFF, 0x01, 0xE0, 0x02, 0x00, 0x01, 0x0A, 0x01, 0xF6, 0x03, 0x00, + 0x01, 0x03, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFD, 0x01, 0x88, + 0x01, 0x9A, 0x01, 0xEF, 0x01, 0xFE, 0x01, 0x30, 0x02, 0x00, 0x01, 0x08, + 0x01, 0xF8, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x7F, + 0x03, 0xFF, 0x01, 0xFE, 0x01, 0x91, 0x03, 0x00, 0x01, 0x07, 0x01, 0xF9, + 0x03, 0x00, 0x01, 0x03, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFC, + 0x01, 0x78, 0x01, 0xDF, 0x01, 0xFD, 0x01, 0x20, 0x03, 0x00, 0x01, 0x08, + 0x01, 0xF8, 0x03, 0x00, 0x01, 0x01, 0x01, 0xFE, 0x03, 0x00, 0x01, 0x7F, + 0x01, 0xFA, 0x01, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xC0, 0x03, 0x00, + 0x01, 0x09, 0x01, 0xF6, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x10, 0x02, 0x00, + 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xF8, 0x03, 0x00, + 0x01, 0x0C, 0x01, 0xF5, 0x04, 0x00, 0x01, 0xBF, 0x01, 0x60, 0x02, 0x00, + 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x30, + 0x02, 0x00, 0x01, 0x1F, 0x01, 0xF1, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, + 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x09, 0x01, 0xFF, + 0x01, 0xD0, 0x02, 0x00, 0x01, 0x6F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0x1F, + 0x01, 0xF4, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x01, + 0x01, 0xEF, 0x01, 0xF7, 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, + 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x08, 0x01, 0xFE, 0x06, 0x00, + 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x5A, 0x01, 0xA6, 0x03, 0x00, + 0x01, 0x09, 0x01, 0xAA, 0x01, 0x60, 0x01, 0x4F, 0x01, 0xF4, 0x06, 0x00, + 0x01, 0x3F, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0x80, + 0x06, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, 0x01, 0x4F, + 0x01, 0xFB, 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, + 0x01, 0x19, 0x01, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x04, 0x01, 0xEF, + 0x01, 0xFA, 0x01, 0x40, 0x03, 0x00, 0x01, 0x38, 0x01, 0xEF, 0x01, 0xF8, + 0x0A, 0x00, 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCB, 0x01, 0x9A, 0x01, 0xCE, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x28, 0x01, 0xDF, + 0x03, 0xFF, 0x01, 0xEA, 0x01, 0x40, 0x0D, 0x00, 0x01, 0x02, 0x01, 0x45, + 0x01, 0x76, 0x01, 0x43, 0xC5, 0x00, #endif // TOUCH_UI_UTF8_COPYRIGHT #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) /* 32 PLUS_MINUS_SIGN */ - 0xeb, 0x00, 0x01, 0x02, 0x01, 0x77, 0x01, 0x70, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xff, 0x01, 0xf0, 0x0b, 0x00, 0x01, 0x6a, 0x04, 0xaa, 0x01, 0xac, - 0x01, 0xff, 0x01, 0xfa, 0x05, 0xaa, 0x01, 0x20, 0x05, 0x00, 0x01, 0x9f, - 0x0c, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9f, 0x0c, 0xff, 0x01, 0x40, - 0x05, 0x00, 0x01, 0x7c, 0x04, 0xcc, 0x01, 0xcd, 0x01, 0xff, 0x01, 0xfc, - 0x05, 0xcc, 0x01, 0x30, 0x0a, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf0, - 0x10, 0x00, 0x01, 0x03, 0x01, 0x99, 0x01, 0x90, 0x44, 0x00, 0x01, 0x9f, - 0x0c, 0xff, 0x01, 0x30, 0x05, 0x00, 0x01, 0x9f, 0x0c, 0xff, 0x01, 0x40, - 0x05, 0x00, 0x01, 0x9f, 0x0c, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x47, - 0x0c, 0x77, 0x01, 0x10, 0xc1, 0x00, + 0xEB, 0x00, 0x01, 0x02, 0x01, 0x77, 0x01, 0x70, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x0B, 0x00, 0x01, 0x6A, 0x04, 0xAA, 0x01, 0xAC, + 0x01, 0xFF, 0x01, 0xFA, 0x05, 0xAA, 0x01, 0x20, 0x05, 0x00, 0x01, 0x9F, + 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, + 0x05, 0x00, 0x01, 0x7C, 0x04, 0xCC, 0x01, 0xCD, 0x01, 0xFF, 0x01, 0xFC, + 0x05, 0xCC, 0x01, 0x30, 0x0A, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x03, 0x01, 0x99, 0x01, 0x90, 0x44, 0x00, 0x01, 0x9F, + 0x0C, 0xFF, 0x01, 0x30, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, + 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x47, + 0x0C, 0x77, 0x01, 0x10, 0xC1, 0x00, /* 33 MULTIPLICATION_SIGN */ - 0xff, 0x00, 0x0e, 0x00, 0x01, 0x09, 0x01, 0xb0, 0x07, 0x00, 0x01, 0x03, - 0x01, 0xe4, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xfb, 0x07, 0x00, 0x01, 0x3e, - 0x01, 0xff, 0x01, 0x40, 0x06, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xb0, 0x05, 0x00, 0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0xa0, - 0x07, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x3e, - 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xb0, 0x03, 0x00, 0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, - 0x09, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfb, 0x03, 0x00, 0x01, 0x3e, - 0x01, 0xff, 0x01, 0xfb, 0x0a, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xb0, 0x01, 0x00, 0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, - 0x0b, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x3e, - 0x01, 0xff, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xb3, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x0d, 0x00, 0x01, 0x3e, - 0x03, 0xff, 0x01, 0xfb, 0x0e, 0x00, 0x01, 0x03, 0x01, 0xef, 0x02, 0xff, - 0x01, 0xb0, 0x0f, 0x00, 0x01, 0x5f, 0x02, 0xff, 0x01, 0x10, 0x0e, 0x00, - 0x01, 0x03, 0x01, 0xef, 0x02, 0xff, 0x01, 0xb0, 0x0e, 0x00, 0x01, 0x3e, - 0x03, 0xff, 0x01, 0xfb, 0x0d, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xb3, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x2e, - 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfb, - 0x0b, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, - 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x0a, 0x00, 0x01, 0x2e, - 0x01, 0xff, 0x01, 0xfb, 0x03, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfb, - 0x09, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, - 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x2e, - 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfb, - 0x07, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x05, 0x00, - 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x8f, - 0x01, 0xfb, 0x07, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, - 0x01, 0x09, 0x01, 0xb0, 0x07, 0x00, 0x01, 0x02, 0x01, 0xe4, 0xe9, 0x00, + 0xFF, 0x00, 0x0E, 0x00, 0x01, 0x09, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x03, + 0x01, 0xE4, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3E, + 0x01, 0xFF, 0x01, 0x40, 0x06, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB0, 0x05, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xA0, + 0x07, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x3E, + 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB0, 0x03, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, + 0x09, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x03, 0x00, 0x01, 0x3E, + 0x01, 0xFF, 0x01, 0xFB, 0x0A, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB0, 0x01, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, + 0x0B, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x3E, + 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB3, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0D, 0x00, 0x01, 0x3E, + 0x03, 0xFF, 0x01, 0xFB, 0x0E, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x02, 0xFF, + 0x01, 0xB0, 0x0F, 0x00, 0x01, 0x5F, 0x02, 0xFF, 0x01, 0x10, 0x0E, 0x00, + 0x01, 0x03, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xB0, 0x0E, 0x00, 0x01, 0x3E, + 0x03, 0xFF, 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB3, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, + 0x0B, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x00, + 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0A, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xFB, 0x03, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, + 0x09, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, + 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, + 0x07, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x05, 0x00, + 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xA0, 0x07, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x07, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0x40, 0x07, 0x00, + 0x01, 0x09, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x02, 0x01, 0xE4, 0xE9, 0x00, /* 34 DIVISION_SIGN */ - 0xff, 0x00, 0x25, 0x00, 0x01, 0x17, 0x01, 0x77, 0x01, 0x76, 0x10, 0x00, - 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, - 0x01, 0xfc, 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfc, 0x10, 0x00, - 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x17, 0x01, 0x77, - 0x01, 0x76, 0x31, 0x00, 0x01, 0x24, 0x0c, 0x44, 0x01, 0x10, 0x05, 0x00, - 0x01, 0x9f, 0x0c, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9f, 0x0c, 0xff, - 0x01, 0x40, 0x05, 0x00, 0x01, 0x9f, 0x0c, 0xff, 0x01, 0x40, 0x05, 0x00, - 0x01, 0x12, 0x0c, 0x22, 0x31, 0x00, 0x01, 0x18, 0x01, 0x88, 0x01, 0x87, - 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x2f, - 0x01, 0xff, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfc, - 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x16, - 0x01, 0x66, 0x01, 0x65, 0xff, 0x00, 0x01, 0x00, + 0xFF, 0x00, 0x25, 0x00, 0x01, 0x17, 0x01, 0x77, 0x01, 0x76, 0x10, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, + 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x17, 0x01, 0x77, + 0x01, 0x76, 0x31, 0x00, 0x01, 0x24, 0x0C, 0x44, 0x01, 0x10, 0x05, 0x00, + 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, + 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, + 0x01, 0x12, 0x0C, 0x22, 0x31, 0x00, 0x01, 0x18, 0x01, 0x88, 0x01, 0x87, + 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, + 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x16, + 0x01, 0x66, 0x01, 0x65, 0xFF, 0x00, 0x01, 0x00, #endif // TOUCH_UI_UTF8_MATHEMATICS #if ENABLED(TOUCH_UI_UTF8_FRACTIONS) /* 35 FRACTION_QUARTER */ 0x92, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x40, 0x04, 0x00, 0x01, 0x04, - 0x01, 0x79, 0x01, 0xce, 0x01, 0xee, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x3f, 0x03, 0xff, 0x01, 0x20, - 0x07, 0x00, 0x01, 0x3f, 0x01, 0xfe, 0x01, 0x10, 0x04, 0x00, 0x01, 0x3f, - 0x01, 0xdb, 0x01, 0x8d, 0x01, 0xff, 0x01, 0x20, 0x07, 0x00, 0x01, 0xdf, - 0x01, 0xf5, 0x05, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff, - 0x01, 0x20, 0x06, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, - 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x06, 0x00, 0x01, 0x1f, 0x01, 0xff, - 0x01, 0x20, 0x07, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x06, 0x00, - 0x01, 0xaf, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, - 0x05, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xe1, 0x08, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x20, 0x05, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, - 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x05, 0x00, 0x01, 0x7f, - 0x01, 0xfc, 0x09, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x04, 0x00, - 0x01, 0x01, 0x01, 0xff, 0x01, 0xf2, 0x09, 0x00, 0x01, 0x0b, 0x01, 0xff, - 0x01, 0x20, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, - 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x4f, 0x01, 0xfe, - 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0xdf, - 0x01, 0xf5, 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0x37, 0x01, 0x77, - 0x02, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x5d, 0x01, 0xff, 0x01, 0x75, - 0x01, 0x55, 0x01, 0x10, 0x01, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x20, - 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x02, 0x00, 0x01, 0x0d, - 0x05, 0xff, 0x01, 0x40, 0x01, 0x00, 0x01, 0xaf, 0x01, 0xf8, 0x04, 0x00, - 0x01, 0x0c, 0x02, 0xff, 0x02, 0x00, 0x01, 0x0c, 0x05, 0xee, 0x01, 0x40, - 0x01, 0x04, 0x01, 0xff, 0x01, 0xe0, 0x04, 0x00, 0x01, 0x8f, 0x01, 0xbe, - 0x01, 0xff, 0x09, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, 0x03, 0x00, - 0x01, 0x04, 0x01, 0xfe, 0x01, 0x1e, 0x01, 0xff, 0x09, 0x00, 0x01, 0x7f, - 0x01, 0xfc, 0x04, 0x00, 0x01, 0x1e, 0x01, 0xf4, 0x01, 0x0e, 0x01, 0xff, - 0x08, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xbf, - 0x01, 0x80, 0x01, 0x0e, 0x01, 0xff, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, - 0x01, 0x80, 0x03, 0x00, 0x01, 0x08, 0x01, 0xfc, 0x01, 0x00, 0x01, 0x0e, - 0x01, 0xff, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xfe, 0x04, 0x00, 0x01, 0x4f, - 0x01, 0xe1, 0x01, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x08, 0x00, 0x01, 0xdf, - 0x01, 0xf5, 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0x40, 0x01, 0x00, - 0x01, 0x0e, 0x01, 0xff, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xb0, - 0x03, 0x00, 0x01, 0x0b, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x0e, 0x01, 0xff, - 0x07, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x3f, - 0x01, 0xf8, 0x02, 0x88, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x88, 0x06, 0x00, - 0x01, 0xbf, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x4f, 0x06, 0xff, 0x05, 0x00, - 0x01, 0x04, 0x01, 0xff, 0x01, 0xe0, 0x04, 0x00, 0x01, 0x2a, 0x03, 0xaa, - 0x01, 0xaf, 0x01, 0xff, 0x01, 0xaa, 0x05, 0x00, 0x01, 0x0d, 0x01, 0xff, - 0x01, 0x50, 0x08, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x06, 0x00, 0x01, 0x8f, - 0x01, 0xfb, 0x09, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x05, 0x00, 0x01, 0x02, - 0x01, 0xff, 0x01, 0xf2, 0x09, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x05, 0x00, - 0x01, 0x0b, 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x05, 0x01, 0x66, - 0xbf, 0x00, + 0x01, 0x79, 0x01, 0xCE, 0x01, 0xEE, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0x90, 0x04, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, + 0x07, 0x00, 0x01, 0x3F, 0x01, 0xFE, 0x01, 0x10, 0x04, 0x00, 0x01, 0x3F, + 0x01, 0xDB, 0x01, 0x8D, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0xDF, + 0x01, 0xF5, 0x05, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x20, 0x06, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0x1F, 0x01, 0xFF, + 0x01, 0x20, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, + 0x01, 0xAF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x05, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE1, 0x08, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, + 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x7F, + 0x01, 0xFC, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFE, + 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0xDF, + 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, 0x04, 0x00, 0x01, 0x37, 0x01, 0x77, + 0x02, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x5D, 0x01, 0xFF, 0x01, 0x75, + 0x01, 0x55, 0x01, 0x10, 0x01, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x20, + 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x02, 0x00, 0x01, 0x0D, + 0x05, 0xFF, 0x01, 0x40, 0x01, 0x00, 0x01, 0xAF, 0x01, 0xF8, 0x04, 0x00, + 0x01, 0x0C, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x0C, 0x05, 0xEE, 0x01, 0x40, + 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, 0x04, 0x00, 0x01, 0x8F, 0x01, 0xBE, + 0x01, 0xFF, 0x09, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x03, 0x00, + 0x01, 0x04, 0x01, 0xFE, 0x01, 0x1E, 0x01, 0xFF, 0x09, 0x00, 0x01, 0x7F, + 0x01, 0xFC, 0x04, 0x00, 0x01, 0x1E, 0x01, 0xF4, 0x01, 0x0E, 0x01, 0xFF, + 0x08, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0x80, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x80, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x04, 0x00, 0x01, 0x4F, + 0x01, 0xE1, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0xDF, + 0x01, 0xF5, 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0x40, 0x01, 0x00, + 0x01, 0x0E, 0x01, 0xFF, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, + 0x03, 0x00, 0x01, 0x0B, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0E, 0x01, 0xFF, + 0x07, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x3F, + 0x01, 0xF8, 0x02, 0x88, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x88, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x4F, 0x06, 0xFF, 0x05, 0x00, + 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, 0x04, 0x00, 0x01, 0x2A, 0x03, 0xAA, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xAA, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0x50, 0x08, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x06, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x01, 0x05, 0x01, 0x66, + 0xBF, 0x00, /* 36 FRACTION_HALF */ 0x92, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x40, 0x04, 0x00, 0x01, 0x04, - 0x01, 0x7a, 0x01, 0xce, 0x01, 0xee, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x3f, 0x03, 0xff, 0x01, 0x20, - 0x07, 0x00, 0x01, 0x4f, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x3f, 0x01, 0xda, - 0x01, 0x7d, 0x01, 0xff, 0x01, 0x20, 0x07, 0x00, 0x01, 0xdf, 0x01, 0xf5, - 0x07, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x06, 0x00, 0x01, 0x07, - 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, - 0x06, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x20, 0x06, 0x00, 0x01, 0xaf, 0x01, 0xf8, 0x08, 0x00, - 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x05, 0x00, 0x01, 0x04, 0x01, 0xff, - 0x01, 0xe0, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x05, 0x00, - 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, - 0x01, 0x20, 0x05, 0x00, 0x01, 0x7f, 0x01, 0xfc, 0x09, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf2, - 0x09, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x20, - 0x04, 0x00, 0x01, 0x4f, 0x01, 0xfe, 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, - 0x01, 0x20, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xb0, - 0x01, 0x00, 0x01, 0x04, 0x01, 0x8a, 0x01, 0xcc, 0x01, 0xa7, 0x01, 0x10, - 0x02, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x5d, 0x01, 0xff, 0x01, 0x75, - 0x01, 0x55, 0x01, 0x10, 0x01, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x20, - 0x01, 0x06, 0x04, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x0d, 0x05, 0xff, - 0x01, 0x40, 0x01, 0x00, 0x01, 0xbf, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x08, - 0x01, 0xff, 0x01, 0xa7, 0x01, 0x68, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x70, - 0x01, 0x00, 0x01, 0x0b, 0x05, 0xdd, 0x01, 0x40, 0x01, 0x04, 0x01, 0xff, - 0x01, 0xe0, 0x01, 0x00, 0x01, 0x05, 0x01, 0x60, 0x02, 0x00, 0x01, 0x08, - 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, - 0x06, 0x00, 0x01, 0xef, 0x01, 0xf4, 0x08, 0x00, 0x01, 0x7f, 0x01, 0xfb, - 0x07, 0x00, 0x01, 0xcf, 0x01, 0xf3, 0x07, 0x00, 0x01, 0x02, 0x01, 0xff, - 0x01, 0xf2, 0x06, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xe0, 0x07, 0x00, - 0x01, 0x0b, 0x01, 0xff, 0x01, 0x80, 0x06, 0x00, 0x01, 0x0d, 0x01, 0xff, - 0x01, 0x50, 0x07, 0x00, 0x01, 0x4f, 0x01, 0xfe, 0x07, 0x00, 0x01, 0xaf, - 0x01, 0xfa, 0x08, 0x00, 0x01, 0xdf, 0x01, 0xf5, 0x06, 0x00, 0x01, 0x09, - 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xb0, - 0x06, 0x00, 0x01, 0x8f, 0x01, 0xfd, 0x01, 0x10, 0x07, 0x00, 0x01, 0x2f, - 0x01, 0xff, 0x01, 0x20, 0x05, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xc1, - 0x08, 0x00, 0x01, 0xbf, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xaf, 0x01, 0xfb, - 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, - 0x04, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xf9, 0x09, 0x00, 0x01, 0x8f, - 0x01, 0xfb, 0x05, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x03, 0xee, - 0x01, 0xe6, 0x04, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, - 0x01, 0x0a, 0x05, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xee, - 0x01, 0x70, 0x05, 0x00, 0x01, 0x04, 0x05, 0x66, 0x01, 0x62, 0xbe, 0x00, + 0x01, 0x7A, 0x01, 0xCE, 0x01, 0xEE, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0x80, 0x04, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, + 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x3F, 0x01, 0xDA, + 0x01, 0x7D, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0xDF, 0x01, 0xF5, + 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0x07, + 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x06, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0xAF, 0x01, 0xF8, 0x08, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x04, 0x01, 0xFF, + 0x01, 0xE0, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x20, 0x05, 0x00, 0x01, 0x7F, 0x01, 0xFC, 0x09, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, + 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, + 0x01, 0x00, 0x01, 0x04, 0x01, 0x8A, 0x01, 0xCC, 0x01, 0xA7, 0x01, 0x10, + 0x02, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x5D, 0x01, 0xFF, 0x01, 0x75, + 0x01, 0x55, 0x01, 0x10, 0x01, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, + 0x01, 0x06, 0x04, 0xFF, 0x01, 0xF7, 0x02, 0x00, 0x01, 0x0D, 0x05, 0xFF, + 0x01, 0x40, 0x01, 0x00, 0x01, 0xBF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x08, + 0x01, 0xFF, 0x01, 0xA7, 0x01, 0x68, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x70, + 0x01, 0x00, 0x01, 0x0B, 0x05, 0xDD, 0x01, 0x40, 0x01, 0x04, 0x01, 0xFF, + 0x01, 0xE0, 0x01, 0x00, 0x01, 0x05, 0x01, 0x60, 0x02, 0x00, 0x01, 0x08, + 0x01, 0xFF, 0x01, 0xF1, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, + 0x06, 0x00, 0x01, 0xEF, 0x01, 0xF4, 0x08, 0x00, 0x01, 0x7F, 0x01, 0xFB, + 0x07, 0x00, 0x01, 0xCF, 0x01, 0xF3, 0x07, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0xF2, 0x06, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xE0, 0x07, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x06, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0x50, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x07, 0x00, 0x01, 0xAF, + 0x01, 0xFA, 0x08, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x06, 0x00, 0x01, 0x09, + 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, + 0x06, 0x00, 0x01, 0x8F, 0x01, 0xFD, 0x01, 0x10, 0x07, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xC1, + 0x08, 0x00, 0x01, 0xBF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xAF, 0x01, 0xFB, + 0x08, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xE0, 0x05, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, + 0x04, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xF9, 0x09, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x05, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFE, 0x03, 0xEE, + 0x01, 0xE6, 0x04, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, + 0x01, 0x0A, 0x05, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xEE, + 0x01, 0x70, 0x05, 0x00, 0x01, 0x04, 0x05, 0x66, 0x01, 0x62, 0xBE, 0x00, /* 37 FRACTION_THREE_FOURTHS */ 0x87, 0x00, 0x01, 0x02, 0x01, 0x34, 0x01, 0x42, 0x08, 0x00, 0x01, 0x01, - 0x01, 0x55, 0x01, 0x50, 0x04, 0x00, 0x01, 0x4c, 0x03, 0xff, 0x01, 0xe9, - 0x01, 0x10, 0x06, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, - 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfe, 0x02, 0xff, 0x01, 0xe2, 0x06, 0x00, - 0x01, 0x4f, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x47, 0x01, 0x30, 0x01, 0x00, - 0x01, 0x05, 0x01, 0xef, 0x01, 0xfb, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xf5, - 0x09, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x05, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xb0, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x05, 0x00, 0x01, 0x2f, - 0x01, 0xff, 0x01, 0x20, 0x09, 0x00, 0x01, 0x6f, 0x01, 0xfb, 0x05, 0x00, - 0x01, 0xbf, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x03, 0x01, 0x44, 0x01, 0x5a, - 0x01, 0xff, 0x01, 0xd1, 0x04, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xe0, - 0x07, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xe7, 0x05, 0x00, 0x01, 0x0d, - 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0b, 0x01, 0xef, 0x01, 0xff, - 0x01, 0xfe, 0x01, 0x70, 0x04, 0x00, 0x01, 0x7f, 0x01, 0xfb, 0x0a, 0x00, - 0x01, 0x16, 0x01, 0xdf, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x02, 0x01, 0xff, - 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0x20, 0x02, 0x00, - 0x01, 0x0b, 0x01, 0xff, 0x01, 0x80, 0x0b, 0x00, 0x01, 0x0a, 0x01, 0xff, - 0x01, 0x60, 0x02, 0x00, 0x01, 0x4f, 0x01, 0xfe, 0x0c, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xf5, 0x0c, 0x00, - 0x01, 0x2f, 0x01, 0xff, 0x01, 0x30, 0x01, 0x00, 0x01, 0x08, 0x01, 0xff, - 0x01, 0xb0, 0x04, 0x00, 0x01, 0x47, 0x01, 0x77, 0x02, 0x00, 0x01, 0xd7, - 0x01, 0x42, 0x01, 0x01, 0x01, 0x38, 0x01, 0xef, 0x01, 0xfc, 0x02, 0x00, - 0x01, 0x2f, 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x02, 0x02, 0xff, - 0x02, 0x00, 0x05, 0xff, 0x01, 0xc1, 0x02, 0x00, 0x01, 0xbf, 0x01, 0xf8, - 0x04, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x02, 0x00, 0x01, 0x7b, 0x01, 0xef, - 0x02, 0xff, 0x01, 0xb6, 0x02, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xe0, - 0x04, 0x00, 0x01, 0x9f, 0x01, 0xbe, 0x01, 0xff, 0x04, 0x00, 0x01, 0x22, - 0x01, 0x10, 0x03, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, 0x03, 0x00, - 0x01, 0x04, 0x01, 0xfe, 0x01, 0x1e, 0x01, 0xff, 0x09, 0x00, 0x01, 0x8f, - 0x01, 0xfb, 0x04, 0x00, 0x01, 0x1e, 0x01, 0xf3, 0x01, 0x0e, 0x01, 0xff, - 0x08, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xcf, - 0x01, 0x70, 0x01, 0x0e, 0x01, 0xff, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, - 0x01, 0x80, 0x03, 0x00, 0x01, 0x08, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x0e, - 0x01, 0xff, 0x08, 0x00, 0x01, 0x5f, 0x01, 0xfe, 0x04, 0x00, 0x01, 0x4f, - 0x01, 0xe1, 0x01, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x08, 0x00, 0x01, 0xdf, - 0x01, 0xf4, 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0x40, 0x01, 0x00, - 0x01, 0x0e, 0x01, 0xff, 0x07, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xb0, - 0x03, 0x00, 0x01, 0x0b, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x0e, 0x01, 0xff, - 0x07, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x3f, - 0x01, 0xf9, 0x02, 0x99, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x99, 0x06, 0x00, - 0x01, 0xbf, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x4f, 0x06, 0xff, 0x05, 0x00, - 0x01, 0x05, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x29, 0x03, 0x99, - 0x01, 0x9f, 0x01, 0xff, 0x01, 0x99, 0x05, 0x00, 0x01, 0x0d, 0x01, 0xff, - 0x01, 0x40, 0x08, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x06, 0x00, 0x01, 0x8f, - 0x01, 0xfb, 0x09, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x05, 0x00, 0x01, 0x02, - 0x01, 0xff, 0x01, 0xf2, 0x09, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x05, 0x00, - 0x01, 0x0a, 0x01, 0xee, 0x01, 0x70, 0x09, 0x00, 0x01, 0x04, 0x01, 0x55, - 0xbf, 0x00, + 0x01, 0x55, 0x01, 0x50, 0x04, 0x00, 0x01, 0x4C, 0x03, 0xFF, 0x01, 0xE9, + 0x01, 0x10, 0x06, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x80, 0x04, 0x00, + 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xFE, 0x02, 0xFF, 0x01, 0xE2, 0x06, 0x00, + 0x01, 0x4F, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x47, 0x01, 0x30, 0x01, 0x00, + 0x01, 0x05, 0x01, 0xEF, 0x01, 0xFB, 0x06, 0x00, 0x01, 0xDF, 0x01, 0xF5, + 0x09, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xB0, 0x09, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x20, 0x09, 0x00, 0x01, 0x6F, 0x01, 0xFB, 0x05, 0x00, + 0x01, 0xBF, 0x01, 0xF8, 0x07, 0x00, 0x01, 0x03, 0x01, 0x44, 0x01, 0x5A, + 0x01, 0xFF, 0x01, 0xD1, 0x04, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, + 0x07, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xE7, 0x05, 0x00, 0x01, 0x0D, + 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xFE, 0x01, 0x70, 0x04, 0x00, 0x01, 0x7F, 0x01, 0xFB, 0x0A, 0x00, + 0x01, 0x16, 0x01, 0xDF, 0x01, 0xF9, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0xF2, 0x0B, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x20, 0x02, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x0B, 0x00, 0x01, 0x0A, 0x01, 0xFF, + 0x01, 0x60, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x0C, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x0C, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, + 0x01, 0xB0, 0x04, 0x00, 0x01, 0x47, 0x01, 0x77, 0x02, 0x00, 0x01, 0xD7, + 0x01, 0x42, 0x01, 0x01, 0x01, 0x38, 0x01, 0xEF, 0x01, 0xFC, 0x02, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x02, 0x02, 0xFF, + 0x02, 0x00, 0x05, 0xFF, 0x01, 0xC1, 0x02, 0x00, 0x01, 0xBF, 0x01, 0xF8, + 0x04, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x7B, 0x01, 0xEF, + 0x02, 0xFF, 0x01, 0xB6, 0x02, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, + 0x04, 0x00, 0x01, 0x9F, 0x01, 0xBE, 0x01, 0xFF, 0x04, 0x00, 0x01, 0x22, + 0x01, 0x10, 0x03, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x03, 0x00, + 0x01, 0x04, 0x01, 0xFE, 0x01, 0x1E, 0x01, 0xFF, 0x09, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x04, 0x00, 0x01, 0x1E, 0x01, 0xF3, 0x01, 0x0E, 0x01, 0xFF, + 0x08, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xCF, + 0x01, 0x70, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x80, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x08, 0x00, 0x01, 0x5F, 0x01, 0xFE, 0x04, 0x00, 0x01, 0x4F, + 0x01, 0xE1, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0xDF, + 0x01, 0xF4, 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0x40, 0x01, 0x00, + 0x01, 0x0E, 0x01, 0xFF, 0x07, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, + 0x03, 0x00, 0x01, 0x0B, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0E, 0x01, 0xFF, + 0x07, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x3F, + 0x01, 0xF9, 0x02, 0x99, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x99, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x4F, 0x06, 0xFF, 0x05, 0x00, + 0x01, 0x05, 0x01, 0xFF, 0x01, 0xD0, 0x04, 0x00, 0x01, 0x29, 0x03, 0x99, + 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x99, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0x40, 0x08, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x06, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, + 0x01, 0x0A, 0x01, 0xEE, 0x01, 0x70, 0x09, 0x00, 0x01, 0x04, 0x01, 0x55, + 0xBF, 0x00, #endif // TOUCH_UI_UTF8_FRACTIONS #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) /* 38 MICRON_SIGN */ - 0xff, 0x00, 0x1f, 0x00, 0x01, 0x02, 0x01, 0x44, 0x01, 0x40, 0x05, 0x00, - 0x01, 0x14, 0x01, 0x44, 0x01, 0x10, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, - 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, - 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, - 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, - 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf4, 0x05, 0x00, - 0x01, 0x6f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf6, 0x05, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xfa, 0x05, 0x00, 0x01, 0xef, 0x01, 0xff, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, - 0x01, 0x07, 0x02, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x02, 0xff, - 0x01, 0xd2, 0x03, 0x00, 0x01, 0x6f, 0x02, 0xff, 0x01, 0xa0, 0x08, 0x00, - 0x01, 0x07, 0x03, 0xff, 0x01, 0xa6, 0x01, 0x55, 0x01, 0x8d, 0x03, 0xff, - 0x01, 0xf9, 0x01, 0xa4, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, - 0x05, 0xff, 0x01, 0x5d, 0x02, 0xff, 0x01, 0xf4, 0x07, 0x00, 0x01, 0x07, - 0x01, 0xff, 0x01, 0xf3, 0x01, 0x5f, 0x03, 0xff, 0x01, 0xf5, 0x01, 0x06, - 0x02, 0xff, 0x01, 0xf4, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, - 0x01, 0x01, 0x01, 0x7c, 0x01, 0xdd, 0x01, 0xc7, 0x01, 0x10, 0x01, 0x00, - 0x01, 0x6c, 0x01, 0xdb, 0x01, 0x50, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x10, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x10, 0x00, - 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xff, - 0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xee, 0x01, 0xe3, 0x35, 0x00, + 0xFF, 0x00, 0x1F, 0x00, 0x01, 0x02, 0x01, 0x44, 0x01, 0x40, 0x05, 0x00, + 0x01, 0x14, 0x01, 0x44, 0x01, 0x10, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF4, 0x05, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF6, 0x05, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, + 0x01, 0x07, 0x02, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x02, 0xFF, + 0x01, 0xD2, 0x03, 0x00, 0x01, 0x6F, 0x02, 0xFF, 0x01, 0xA0, 0x08, 0x00, + 0x01, 0x07, 0x03, 0xFF, 0x01, 0xA6, 0x01, 0x55, 0x01, 0x8D, 0x03, 0xFF, + 0x01, 0xF9, 0x01, 0xA4, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, + 0x05, 0xFF, 0x01, 0x5D, 0x02, 0xFF, 0x01, 0xF4, 0x07, 0x00, 0x01, 0x07, + 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x5F, 0x03, 0xFF, 0x01, 0xF5, 0x01, 0x06, + 0x02, 0xFF, 0x01, 0xF4, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, + 0x01, 0x01, 0x01, 0x7C, 0x01, 0xDD, 0x01, 0xC7, 0x01, 0x10, 0x01, 0x00, + 0x01, 0x6C, 0x01, 0xDB, 0x01, 0x50, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xEE, 0x01, 0xE3, 0x35, 0x00, /* 39 PILCROW_SIGN */ - 0x9c, 0x00, 0x01, 0x16, 0x01, 0x9b, 0x04, 0xcc, 0x01, 0xca, 0x0b, 0x00, - 0x01, 0x19, 0x06, 0xff, 0x01, 0xfd, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xef, - 0x03, 0xff, 0x01, 0xfb, 0x01, 0xaa, 0x01, 0xaf, 0x01, 0xfd, 0x0a, 0x00, - 0x01, 0x2e, 0x04, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, - 0x0a, 0x00, 0x01, 0xbf, 0x04, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, - 0x01, 0xfd, 0x09, 0x00, 0x01, 0x03, 0x05, 0xff, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x08, 0x05, 0xff, 0x01, 0xf2, - 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x0b, 0x05, 0xff, - 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x0c, - 0x05, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, 0x09, 0x00, - 0x01, 0x0b, 0x05, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, - 0x09, 0x00, 0x01, 0x0a, 0x05, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, - 0x01, 0xfd, 0x09, 0x00, 0x01, 0x06, 0x05, 0xff, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0a, 0x00, 0x01, 0xef, 0x04, 0xff, 0x01, 0xf2, - 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, 0x0a, 0x00, 0x01, 0x6f, 0x04, 0xff, - 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, 0x0a, 0x00, 0x01, 0x08, - 0x04, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, 0x0b, 0x00, - 0x01, 0x5e, 0x03, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xfd, - 0x0c, 0x00, 0x01, 0x6b, 0x02, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, - 0x01, 0xfd, 0x0d, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0xbf, 0x01, 0xf2, 0x01, 0x00, - 0x01, 0x0f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0x34, 0x01, 0x40, 0x01, 0x00, - 0x01, 0x04, 0x01, 0x43, 0x7a, 0x00, + 0x9C, 0x00, 0x01, 0x16, 0x01, 0x9B, 0x04, 0xCC, 0x01, 0xCA, 0x0B, 0x00, + 0x01, 0x19, 0x06, 0xFF, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xEF, + 0x03, 0xFF, 0x01, 0xFB, 0x01, 0xAA, 0x01, 0xAF, 0x01, 0xFD, 0x0A, 0x00, + 0x01, 0x2E, 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, + 0x0A, 0x00, 0x01, 0xBF, 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, + 0x01, 0xFD, 0x09, 0x00, 0x01, 0x03, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x08, 0x05, 0xFF, 0x01, 0xF2, + 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0B, 0x05, 0xFF, + 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0C, + 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, + 0x01, 0x0B, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, + 0x09, 0x00, 0x01, 0x0A, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, + 0x01, 0xFD, 0x09, 0x00, 0x01, 0x06, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0xEF, 0x04, 0xFF, 0x01, 0xF2, + 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x6F, 0x04, 0xFF, + 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x08, + 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0B, 0x00, + 0x01, 0x5E, 0x03, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, + 0x0C, 0x00, 0x01, 0x6B, 0x02, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, + 0x01, 0xFD, 0x0D, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0x34, 0x01, 0x40, 0x01, 0x00, + 0x01, 0x04, 0x01, 0x43, 0x7A, 0x00, /* 40 BROKEN_BAR */ - 0xad, 0x00, 0x01, 0x07, 0x01, 0x99, 0x01, 0x60, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x08, 0x01, 0xbb, 0x01, 0x70, 0x6f, 0x00, 0x01, 0x0b, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, - 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0x04, + 0xAD, 0x00, 0x01, 0x07, 0x01, 0x99, 0x01, 0x60, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x08, 0x01, 0xBB, 0x01, 0x70, 0x6F, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x30, 0x47, 0x00, /* 41 SECTION_SIGN */ - 0x89, 0x00, 0x01, 0x35, 0x01, 0x64, 0x01, 0x31, 0x0e, 0x00, 0x01, 0x01, - 0x01, 0x9e, 0x03, 0xff, 0x01, 0xd9, 0x01, 0x30, 0x0c, 0x00, 0x01, 0x2e, - 0x05, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfb, - 0x01, 0x98, 0x01, 0xae, 0x01, 0xff, 0x01, 0xb0, 0x0b, 0x00, 0x01, 0x07, - 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x02, 0x00, 0x01, 0x39, 0x01, 0xa0, - 0x0b, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0c, - 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x10, 0x00, - 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe4, 0x10, 0x00, 0x01, 0x1d, 0x02, 0xff, - 0x01, 0xa1, 0x0f, 0x00, 0x01, 0x4e, 0x03, 0xff, 0x01, 0x70, 0x0d, 0x00, - 0x01, 0x06, 0x01, 0xff, 0x01, 0xf9, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfd, - 0x01, 0x30, 0x0c, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x60, 0x01, 0x07, - 0x02, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0xbf, 0x01, 0xf9, 0x02, 0x00, - 0x01, 0x19, 0x02, 0xff, 0x01, 0xc0, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf3, - 0x03, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xfb, 0x0a, 0x00, 0x01, 0x01, - 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, - 0x01, 0x40, 0x09, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, - 0x01, 0x2f, 0x01, 0xff, 0x01, 0x90, 0x0a, 0x00, 0x01, 0xdf, 0x01, 0xff, - 0x01, 0x20, 0x03, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xb0, 0x0a, 0x00, - 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x08, 0x01, 0xff, - 0x01, 0xa0, 0x0a, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0x91, 0x02, 0x00, - 0x01, 0x0c, 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0x8f, 0x01, 0xff, - 0x01, 0xfe, 0x01, 0x60, 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x10, - 0x0b, 0x00, 0x01, 0x03, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x46, - 0x01, 0xff, 0x01, 0xf5, 0x0d, 0x00, 0x01, 0x07, 0x04, 0xff, 0x01, 0x50, - 0x0e, 0x00, 0x01, 0x2a, 0x02, 0xff, 0x01, 0xf5, 0x10, 0x00, 0x01, 0x4e, - 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x01, 0x01, 0xcf, - 0x01, 0xff, 0x01, 0xc0, 0x10, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xf3, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x05, - 0x01, 0xff, 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x01, 0x04, 0x00, 0x01, 0x0a, - 0x01, 0xff, 0x01, 0xf3, 0x0b, 0x00, 0x01, 0x08, 0x01, 0xe8, 0x01, 0x20, - 0x01, 0x00, 0x01, 0x01, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xe0, 0x0b, 0x00, - 0x01, 0x08, 0x01, 0xff, 0x01, 0xfe, 0x01, 0xcb, 0x01, 0xdf, 0x02, 0xff, - 0x01, 0x40, 0x0b, 0x00, 0x01, 0x08, 0x05, 0xff, 0x01, 0xf5, 0x0d, 0x00, - 0x01, 0x49, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xe8, 0x01, 0x20, 0x0f, 0x00, - 0x01, 0x12, 0x01, 0x21, 0x7f, 0x00, + 0x89, 0x00, 0x01, 0x35, 0x01, 0x64, 0x01, 0x31, 0x0E, 0x00, 0x01, 0x01, + 0x01, 0x9E, 0x03, 0xFF, 0x01, 0xD9, 0x01, 0x30, 0x0C, 0x00, 0x01, 0x2E, + 0x05, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFB, + 0x01, 0x98, 0x01, 0xAE, 0x01, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x07, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x02, 0x00, 0x01, 0x39, 0x01, 0xA0, + 0x0B, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF3, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x10, 0x00, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xE4, 0x10, 0x00, 0x01, 0x1D, 0x02, 0xFF, + 0x01, 0xA1, 0x0F, 0x00, 0x01, 0x4E, 0x03, 0xFF, 0x01, 0x70, 0x0D, 0x00, + 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF9, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFD, + 0x01, 0x30, 0x0C, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x01, 0x07, + 0x02, 0xFF, 0x01, 0xF8, 0x0C, 0x00, 0x01, 0xBF, 0x01, 0xF9, 0x02, 0x00, + 0x01, 0x19, 0x02, 0xFF, 0x01, 0xC0, 0x0B, 0x00, 0x01, 0xFF, 0x01, 0xF3, + 0x03, 0x00, 0x01, 0x4E, 0x01, 0xFF, 0x01, 0xFB, 0x0A, 0x00, 0x01, 0x01, + 0x01, 0xFF, 0x01, 0xF2, 0x03, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xFF, + 0x01, 0x40, 0x09, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x90, 0x0A, 0x00, 0x01, 0xDF, 0x01, 0xFF, + 0x01, 0x20, 0x03, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xB0, 0x0A, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFF, + 0x01, 0xA0, 0x0A, 0x00, 0x01, 0x0A, 0x02, 0xFF, 0x01, 0x91, 0x02, 0x00, + 0x01, 0x0C, 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, 0x01, 0x8F, 0x01, 0xFF, + 0x01, 0xFE, 0x01, 0x60, 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x10, + 0x0B, 0x00, 0x01, 0x03, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x46, + 0x01, 0xFF, 0x01, 0xF5, 0x0D, 0x00, 0x01, 0x07, 0x04, 0xFF, 0x01, 0x50, + 0x0E, 0x00, 0x01, 0x2A, 0x02, 0xFF, 0x01, 0xF5, 0x10, 0x00, 0x01, 0x4E, + 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x01, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0xC0, 0x10, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0xF3, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x05, + 0x01, 0xFF, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x04, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF3, 0x0B, 0x00, 0x01, 0x08, 0x01, 0xE8, 0x01, 0x20, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xE0, 0x0B, 0x00, + 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0xCB, 0x01, 0xDF, 0x02, 0xFF, + 0x01, 0x40, 0x0B, 0x00, 0x01, 0x08, 0x05, 0xFF, 0x01, 0xF5, 0x0D, 0x00, + 0x01, 0x49, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xE8, 0x01, 0x20, 0x0F, 0x00, + 0x01, 0x12, 0x01, 0x21, 0x7F, 0x00, /* 42 NOT_SIGN */ - 0xff, 0x00, 0x7f, 0x00, 0x01, 0x12, 0x0c, 0x22, 0x06, 0x00, 0x01, 0x9f, - 0x0c, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9f, 0x0c, 0xff, 0x01, 0x40, - 0x05, 0x00, 0x01, 0x9f, 0x0c, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x24, - 0x0a, 0x44, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2f, - 0x01, 0xff, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x40, - 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2f, - 0x01, 0xff, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x40, - 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2f, - 0x01, 0xff, 0x01, 0x40, 0x10, 0x00, 0x01, 0x17, 0x01, 0x77, 0x01, 0x10, - 0xff, 0x00, 0x34, 0x00 + 0xFF, 0x00, 0x7F, 0x00, 0x01, 0x12, 0x0C, 0x22, 0x06, 0x00, 0x01, 0x9F, + 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, + 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x24, + 0x0A, 0x44, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, + 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, + 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x17, 0x01, 0x77, 0x01, 0x10, + 0xFF, 0x00, 0x34, 0x00 #endif // TOUCH_UI_UTF8_SYMBOLS }; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index f126ffe1dd..902472b884 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -236,14 +236,14 @@ void lv_draw_keyboard() { lv_style_copy(&rel_style, &lv_style_btn_rel); rel_style.body.radius = 0; rel_style.body.border.width = 1; - rel_style.body.main_color = lv_color_make(0xa9, 0x62, 0x1d); - rel_style.body.grad_color = lv_color_make(0xa7, 0x59, 0x0e); + rel_style.body.main_color = lv_color_make(0xA9, 0x62, 0x1D); + rel_style.body.grad_color = lv_color_make(0xA7, 0x59, 0x0E); lv_style_copy(&pr_style, &lv_style_btn_pr); pr_style.body.radius = 0; pr_style.body.border.width = 1; pr_style.body.main_color = lv_color_make(0x72, 0x42, 0x15); - pr_style.body.grad_color = lv_color_make(0x6a, 0x3a, 0x0c); + pr_style.body.grad_color = lv_color_make(0x6A, 0x3A, 0x0C); /*Create a keyboard and apply the styles*/ lv_obj_t *kb = lv_kb_create(scr, NULL); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index add0f0394b..6d7b68af42 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -479,9 +479,9 @@ int ascii2dec_test(char *ascii) { if (*(ascii) >= '0' && *(ascii) <= '9') result = *(ascii) - '0'; else if (*(ascii) >= 'a' && *(ascii) <= 'f') - result = *(ascii) - 'a' + 0x0a; + result = *(ascii) - 'a' + 0x0A; else if (*(ascii) >= 'A' && *(ascii) <= 'F') - result = *(ascii) - 'A' + 0x0a; + result = *(ascii) - 'A' + 0x0A; else return 0; @@ -525,7 +525,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { p_index = (uint16_t *)(&public_buf[i]); //Color = (*p_index >> 8); - //*p_index = Color | ((*p_index & 0xff) << 8); + //*p_index = Color | ((*p_index & 0xFF) << 8); i += 2; if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; } @@ -533,7 +533,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { for (i = 0; i < 200;) { p_index = (uint16_t *)(&public_buf[i]); //Color = (*p_index >> 8); - //*p_index = Color | ((*p_index & 0xff) << 8); + //*p_index = Color | ((*p_index & 0xFF) << 8); i += 2; if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // 0x18C3; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 922f6a2dc7..458620801b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -378,7 +378,7 @@ void tft_style_init() { style_sel_text.text.letter_space = 0; style_sel_text.text.line_space = -5; lv_style_copy(&style_line, &lv_style_plain); - style_line.line.color = LV_COLOR_MAKE(0x49, 0x54, 0xff); + style_line.line.color = LV_COLOR_MAKE(0x49, 0x54, 0xFF); style_line.line.width = 1; style_line.line.rounded = 1; @@ -703,12 +703,12 @@ char *creat_title_text() { card.closefile(); /* - if (gCurFileState.file_open_flag != 0xaa) { + if (gCurFileState.file_open_flag != 0xAA) { reset_file_info(); res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); if (res == FR_OK) { f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xaa; + gCurFileState.file_open_flag = 0xAA; //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); srcfp = file; mksReprint.mks_printer_state = MKS_WORKING; @@ -803,7 +803,7 @@ char *creat_title_text() { p_index = (uint16_t *)(&bmp_public_buf[i]); Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xff) << 8); + *p_index = Color | ((*p_index & 0xFF) << 8); i += 2; if (*p_index == 0x0000) *p_index = 0xC318; } @@ -835,12 +835,12 @@ char *creat_title_text() { card.closefile(); /* - if (gCurFileState.file_open_flag != 0xaa) { + if (gCurFileState.file_open_flag != 0xAA) { reset_file_info(); res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); if (res == FR_OK) { f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xaa; + gCurFileState.file_open_flag = 0xAA; //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); srcfp = file; mksReprint.mks_printer_state = MKS_WORKING; @@ -1650,7 +1650,7 @@ void print_time_count() { void LV_TASK_HANDLER() { //lv_tick_inc(1); lv_task_handler(); - if (mks_test_flag == 0x1e) mks_hardware_test(); + if (mks_test_flag == 0x1E) mks_hardware_test(); #if HAS_GCODE_PREVIEW disp_pre_gcode(2, 36); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index ddc9ea6271..51782688c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -92,7 +92,7 @@ #define TICK_CYCLE 1 -#define PARA_SEL_ICON_TEXT_COLOR LV_COLOR_MAKE(0x4a, 0x52, 0xff); +#define PARA_SEL_ICON_TEXT_COLOR LV_COLOR_MAKE(0x4A, 0x52, 0xFF); #define TFT35 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index 743863d1f7..eeb6bae706 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -662,7 +662,7 @@ const char *MKSTestPath = "MKS_TEST"; void mks_test_get() { SdFile dir, root = card.getroot(); if (dir.open(&root, MKSTestPath, O_RDONLY)) - mks_test_flag = 0x1e; + mks_test_flag = 0x1E; } #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index e629915309..d6f5fbf8b5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -543,7 +543,7 @@ void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { PIC_MSG PIC; W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1); - if (Pic_cnt == 0xff) + if (Pic_cnt == 0xFF) Pic_cnt = 0; for (i = 0; i < Pic_cnt; i++) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 5d5227c2a4..ea75915df3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -76,7 +76,7 @@ #define PIC_DATA_ADDR 0x003000 // // TFT35 - #define DEFAULT_VIEW_ADDR_TFT35 0x1ea070 + #define DEFAULT_VIEW_ADDR_TFT35 0x1EA070 #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) #define PIC_DATA_ADDR_TFT35 0x003000 // (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index c2ff2c4362..49b44799a6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -198,10 +198,10 @@ void SysTick_Callback() { LCD_WriteReg(0x0046, xEnd); } else if (DeviceCode == 0x9488) { - s_h = (StartX >> 8) & 0x00ff; - s_l = StartX & 0x00ff; - e_h = ((StartX + width - 1) >> 8) & 0x00ff; - e_l = (StartX + width - 1) & 0x00ff; + s_h = (StartX >> 8) & 0x00FF; + s_l = StartX & 0x00FF; + e_h = ((StartX + width - 1) >> 8) & 0x00FF; + e_l = (StartX + width - 1) & 0x00FF; LCD_IO_WriteReg(0x002A); LCD_IO_WriteData(s_h); @@ -209,10 +209,10 @@ void SysTick_Callback() { LCD_IO_WriteData(e_h); LCD_IO_WriteData(e_l); - s_h = (StartY >> 8) & 0x00ff; - s_l = StartY & 0x00ff; - e_h = ((StartY + heigh - 1) >> 8) & 0x00ff; - e_l = (StartY + heigh - 1) & 0x00ff; + s_h = (StartY >> 8) & 0x00FF; + s_l = StartY & 0x00FF; + e_h = ((StartY + heigh - 1) >> 8) & 0x00FF; + e_l = (StartY + heigh - 1) & 0x00FF; LCD_IO_WriteReg(0x002B); LCD_IO_WriteData(s_h); @@ -275,18 +275,18 @@ void SysTick_Callback() { //while(index --) LCD_IO_WriteData(Color); } else if (DeviceCode == 0x5761) { - LCD_IO_WriteReg(0x002a); + LCD_IO_WriteReg(0x002A); LCD_IO_WriteData(0); LCD_IO_WriteData(0); LCD_IO_WriteData(HDP >> 8); - LCD_IO_WriteData(HDP & 0x00ff); - LCD_IO_WriteReg(0x002b); + LCD_IO_WriteData(HDP & 0x00FF); + LCD_IO_WriteReg(0x002B); LCD_IO_WriteData(0); LCD_IO_WriteData(0); LCD_IO_WriteData(VDP >> 8); - LCD_IO_WriteData(VDP & 0x00ff); - LCD_IO_WriteReg(0x002c); - LCD_IO_WriteReg(0x002c); + LCD_IO_WriteData(VDP & 0x00FF); + LCD_IO_WriteReg(0x002C); + LCD_IO_WriteReg(0x002C); for (count = 0; count < (HDP + 1) * (VDP + 1); count++) LCD_IO_WriteData(Color); } @@ -323,19 +323,19 @@ void SysTick_Callback() { LCD_IO_WriteReg(0x00E0); LCD_IO_WriteData(0x0000); LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x000f); + LCD_IO_WriteData(0x000F); LCD_IO_WriteData(0x000D); LCD_IO_WriteData(0x001B); LCD_IO_WriteData(0x000A); - LCD_IO_WriteData(0x003c); + LCD_IO_WriteData(0x003C); LCD_IO_WriteData(0x0078); LCD_IO_WriteData(0x004A); LCD_IO_WriteData(0x0007); LCD_IO_WriteData(0x000E); LCD_IO_WriteData(0x0009); LCD_IO_WriteData(0x001B); - LCD_IO_WriteData(0x001e); - LCD_IO_WriteData(0x000f); + LCD_IO_WriteData(0x001E); + LCD_IO_WriteData(0x000F); LCD_IO_WriteReg(0x00E1); LCD_IO_WriteData(0x0000); @@ -348,11 +348,11 @@ void SysTick_Callback() { LCD_IO_WriteData(0x0047); LCD_IO_WriteData(0x0047); LCD_IO_WriteData(0x0006); - LCD_IO_WriteData(0x000a); + LCD_IO_WriteData(0x000A); LCD_IO_WriteData(0x0007); LCD_IO_WriteData(0x0030); LCD_IO_WriteData(0x0037); - LCD_IO_WriteData(0x000f); + LCD_IO_WriteData(0x000F); LCD_IO_WriteReg(0x00C0); LCD_IO_WriteData(0x0010); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 5c025f13f9..f5d954792e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -125,7 +125,7 @@ uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { return (curTick - lastTick) * TICK_CYCLE; } else { - return (0xffffffff - lastTick + curTick) * TICK_CYCLE; + return (0xFFFFFFFF - lastTick + curTick) * TICK_CYCLE; } } @@ -334,8 +334,8 @@ void wifi_ret_ack() {} char buf_to_wifi[256]; int index_to_wifi = 0; int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { - char wifi_ret_head = 0xa5; - char wifi_ret_tail = 0xfc; + char wifi_ret_head = 0xA5; + char wifi_ret_tail = 0xFC; if (type == WIFI_PARA_SET) { int data_offset = 4; @@ -356,8 +356,8 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { buf_to_wifi[0] = wifi_ret_head; buf_to_wifi[1] = type; - buf_to_wifi[2] = index_to_wifi & 0xff; - buf_to_wifi[3] = (index_to_wifi >> 8) & 0xff; + buf_to_wifi[2] = index_to_wifi & 0xFF; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); @@ -392,8 +392,8 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { buf_to_wifi[0] = wifi_ret_head; buf_to_wifi[1] = type; - buf_to_wifi[2] = index_to_wifi & 0xff; - buf_to_wifi[3] = (index_to_wifi >> 8) & 0xff; + buf_to_wifi[2] = index_to_wifi & 0xFF; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; buf_to_wifi[4 + index_to_wifi] = wifi_ret_tail; raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); @@ -426,22 +426,22 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { index_to_wifi = 0; if (gCfgItems.cloud_enable == true) - buf_to_wifi[data_offset] = 0x0a; + buf_to_wifi[data_offset] = 0x0A; else buf_to_wifi[data_offset] = 0x05; buf_to_wifi[data_offset + 1] = urlLen; strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.cloud_hostUrl, urlLen); - buf_to_wifi[data_offset + urlLen + 2] = uiCfg.cloud_port & 0xff; - buf_to_wifi[data_offset + urlLen + 3] = (uiCfg.cloud_port >> 8) & 0xff; + buf_to_wifi[data_offset + urlLen + 2] = uiCfg.cloud_port & 0xFF; + buf_to_wifi[data_offset + urlLen + 3] = (uiCfg.cloud_port >> 8) & 0xFF; buf_to_wifi[data_offset + urlLen + 4] = wifi_ret_tail; index_to_wifi = urlLen + 4; buf_to_wifi[0] = wifi_ret_head; buf_to_wifi[1] = type; - buf_to_wifi[2] = index_to_wifi & 0xff; - buf_to_wifi[3] = (index_to_wifi >> 8) & 0xff; + buf_to_wifi[2] = index_to_wifi & 0xFF; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); @@ -526,8 +526,8 @@ int write_to_file(char *buf, int len) { return 0; } -#define ESP_PROTOC_HEAD (uint8_t)0xa5 -#define ESP_PROTOC_TAIL (uint8_t)0xfc +#define ESP_PROTOC_HEAD (uint8_t)0xA5 +#define ESP_PROTOC_TAIL (uint8_t)0xFC #define ESP_TYPE_NET (uint8_t)0x0 #define ESP_TYPE_GCODE (uint8_t)0x1 @@ -1282,22 +1282,22 @@ void utf8_2_unicode(uint8_t *source,uint8_t Len) { else if (char_byte_num == 0XC0 || char_byte_num == 0XD0) { //--2byte - u16_h = (((uint16_t)source[i] <<8) & 0x1f00) >> 2; - u16_l = ((uint16_t)source[i+1] & 0x003f); + u16_h = (((uint16_t)source[i] <<8) & 0x1F00) >> 2; + u16_l = ((uint16_t)source[i+1] & 0x003F); u16_value = (u16_h | u16_l); - FileName_unicode[char_i] = (uint8_t)((u16_value & 0xff00) >> 8); - FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00ff); + FileName_unicode[char_i] = (uint8_t)((u16_value & 0xFF00) >> 8); + FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00FF); i += 2; char_i += 2; } else if (char_byte_num == 0XE0) { //--3byte - u16_h = (((uint16_t)source[i] <<8 ) & 0x0f00) << 4; - u16_m = (((uint16_t)source[i+1] << 8) & 0x3f00) >> 2; - u16_l = ((uint16_t)source[i+2] & 0x003f); + u16_h = (((uint16_t)source[i] <<8 ) & 0x0F00) << 4; + u16_m = (((uint16_t)source[i+1] << 8) & 0x3F00) >> 2; + u16_l = ((uint16_t)source[i+2] & 0x003F); u16_value = (u16_h | u16_m | u16_l); - FileName_unicode[char_i] = (uint8_t)((u16_value & 0xff00) >> 8); - FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00ff); + FileName_unicode[char_i] = (uint8_t)((u16_value & 0xFF00) >> 8); + FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00FF); i += 3; char_i += 2; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 132838c8a9..77bcb767b7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -55,24 +55,24 @@ const uint8_t ESP_MEM_END = 0x06; const uint8_t ESP_MEM_DATA = 0x07; const uint8_t ESP_SYNC = 0x08; const uint8_t ESP_WRITE_REG = 0x09; -const uint8_t ESP_READ_REG = 0x0a; +const uint8_t ESP_READ_REG = 0x0A; // MAC address storage locations -const uint32_t ESP_OTP_MAC0 = 0x3ff00050; -const uint32_t ESP_OTP_MAC1 = 0x3ff00054; -const uint32_t ESP_OTP_MAC2 = 0x3ff00058; -const uint32_t ESP_OTP_MAC3 = 0x3ff0005c; +const uint32_t ESP_OTP_MAC0 = 0x3FF00050; +const uint32_t ESP_OTP_MAC1 = 0x3FF00054; +const uint32_t ESP_OTP_MAC2 = 0x3FF00058; +const uint32_t ESP_OTP_MAC3 = 0x3FF0005C; const size_t EspFlashBlockSize = 0x0400; // 1K byte blocks -const uint8_t ESP_IMAGE_MAGIC = 0xe9; -const uint8_t ESP_CHECKSUM_MAGIC = 0xef; +const uint8_t ESP_IMAGE_MAGIC = 0xE9; +const uint8_t ESP_CHECKSUM_MAGIC = 0xEF; const uint32_t ESP_ERASE_CHIP_ADDR = 0x40004984; // &SPIEraseChip -const uint32_t ESP_SEND_PACKET_ADDR = 0x40003c80; // &send_packet -const uint32_t ESP_SPI_READ_ADDR = 0x40004b1c; // &SPIRead +const uint32_t ESP_SEND_PACKET_ADDR = 0x40003C80; // &send_packet +const uint32_t ESP_SPI_READ_ADDR = 0x40004B1C; // &SPIRead const uint32_t ESP_UNKNOWN_ADDR = 0x40001121; // not used -const uint32_t ESP_USER_DATA_RAM_ADDR = 0x3ffe8000; // &user data ram +const uint32_t ESP_USER_DATA_RAM_ADDR = 0x3FFE8000; // &user data ram const uint32_t ESP_IRAM_ADDR = 0x40100000; // instruction RAM const uint32_t ESP_FLASH_ADDR = 0x40200000; // address of start of Flash //const uint32_t ESP_FLASH_READ_STUB_BEGIN = IRAM_ADDR + 0x18; @@ -190,7 +190,7 @@ void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { byteCnt = 4; } do { - buf[ofst++] = (uint8_t)(val & 0xff); + buf[ofst++] = (uint8_t)(val & 0xFF); val >>= 8; } while (--byteCnt); } @@ -201,7 +201,7 @@ void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { // 2 - an escaped byte was read successfully // 1 - a non-escaped byte was read successfully // 0 - no data was available -// -1 - the value 0xc0 was encountered (shouldn't happen) +// -1 - the value 0xC0 was encountered (shouldn't happen) // -2 - a SLIP escape byte was found but the following byte wasn't available // -3 - a SLIP escape byte was followed by an invalid byte int ReadByte(uint8_t *data, signed char slipDecode) { @@ -215,13 +215,13 @@ int ReadByte(uint8_t *data, signed char slipDecode) { return(1); } - if (*data == 0xc0) { + if (*data == 0xC0) { // this shouldn't happen return(-1); } // if not the SLIP escape, we're done - if (*data != 0xdb) { + if (*data != 0xDB) { return(1); } @@ -232,13 +232,13 @@ int ReadByte(uint8_t *data, signed char slipDecode) { // process the escaped byte *data = uploadPort_read(); - if (*data == 0xdc) { - *data = 0xc0; + if (*data == 0xDC) { + *data = 0xC0; return(2); } - if (*data == 0xdd) { - *data = 0xdb; + if (*data == 0xDD) { + *data = 0xDB; return(2); } // invalid @@ -325,7 +325,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t switch(state) { case begin: // expecting frame start c = uploadPort_read(); - if (c != (uint8_t)0xc0) { + if (c != (uint8_t)0xC0) { break; } state = header; @@ -334,7 +334,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t break; case end: // expecting frame end c = uploadPort_read(); - if (c != (uint8_t)0xc0) { + if (c != (uint8_t)0xC0) { return slipFrame; } state = done; @@ -428,24 +428,24 @@ void _writePacket(const uint8_t *data, size_t len) { } // Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. -// A SLIP packet begins and ends with 0xc0. The data encapsulated has the bytes -// 0xc0 and 0xdb replaced by the two-byte sequences {0xdb, 0xdc} and {0xdb, 0xdd} respectively. +// A SLIP packet begins and ends with 0xC0. The data encapsulated has the bytes +// 0xC0 and 0xDB replaced by the two-byte sequences {0xDB, 0xDC} and {0xDB, 0xDD} respectively. void writePacket(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { - WriteByteRaw(0xc0); // send the packet start character + WriteByteRaw(0xC0); // send the packet start character _writePacket(hdr, hdrLen); // send the header _writePacket(data, dataLen); // send the data block - WriteByteRaw(0xc0); // send the packet end character + WriteByteRaw(0xC0); // send the packet end character } // Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. // This is like writePacket except that it does a fast block write for both the header and the main data with no SLIP encoding. Used to send sync commands. void writePacketRaw(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { - WriteByteRaw(0xc0); // send the packet start character + WriteByteRaw(0xC0); // send the packet start character _writePacketRaw(hdr, hdrLen); // send the header _writePacketRaw(data, dataLen); // send the data block in raw mode - WriteByteRaw(0xc0); // send the packet end character + WriteByteRaw(0xC0); // send the packet end character } // Send a command to the attached device together with the supplied data, if any. @@ -585,7 +585,7 @@ EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { if (cnt != blkSize) { if (f_tell(&esp_upload.uploadFile) == esp_upload.fileSize) { // partial last block, fill the remainder - memset(blkBuf + dataOfst + cnt, 0xff, blkSize - cnt); + memset(blkBuf + dataOfst + cnt, 0xFF, blkSize - cnt); } else { return fileRead; diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 14df5309d7..cf34a7ade9 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -101,7 +101,7 @@ #define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) #define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr) -#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) +#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) int lcd_glyph_height(); diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp index 1694986091..ade8bf23b8 100644 --- a/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp +++ b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp @@ -40,89 +40,89 @@ Max Font ascent = 8 descent=-2 */ extern const uint8_t ISO10646_1_5x7[1325] = { - 0x00,0x0c,0x0d,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0x7f,0xfe,0x0a,0xfe,0x08, - 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, - 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, - 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, - 0xb8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a, - 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8, - 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70, - 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, - 0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, - 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00, - 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8, - 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20, - 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68, - 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20, - 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40, - 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70, - 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02, - 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02, - 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, - 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88, - 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, - 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, - 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x0C,0x0D,0x00,0xFE,0x07,0x02,0x26,0x03,0xBC,0x01,0x7F,0xFE,0x0A,0xFE,0x08, + 0xFE,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xF0,0xC8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xF8,0x20,0x20,0x20,0x20,0xE0,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA8, + 0xB8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xE0,0x8C,0xEA,0x8C,0x8A, + 0x0A,0x05,0x09,0x09,0x06,0x00,0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0xF8, + 0x05,0x0A,0x0A,0x06,0x00,0xFE,0x20,0x50,0x50,0x50,0x50,0x88,0xA8,0xA8,0x88,0x70, + 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, + 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xA0,0xA0,0xA0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x50,0xF8,0x50,0x50,0xF8,0x50,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8, + 0xA0,0x70,0x28,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xC8,0xC8,0x10,0x20, + 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68, + 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x20, + 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40, + 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xA8,0x70, + 0x20,0x70,0xA8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xF8,0x20,0x20,0x02, + 0x03,0x03,0x06,0x01,0xFF,0xC0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xF8,0x02, + 0x02,0x02,0x06,0x01,0x00,0xC0,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, + 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xA8,0xC8,0x88, + 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xF8,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, + 0x50,0x90,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0xF0,0x08,0x08, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xF0,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0, - 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05, - 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00, - 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, + 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xC0,0xC0,0x00,0xC0, + 0xC0,0x02,0x06,0x06,0x06,0x01,0xFF,0xC0,0xC0,0x00,0xC0,0x40,0x80,0x03,0x05,0x05, + 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xF8,0x00, + 0xF8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8, - 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0, + 0x88,0xB8,0xA8,0xB8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8, + 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0, 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x06,0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x05,0x07,0x07,0x06,0x00,0x00, + 0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80, + 0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00, 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, - 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, - 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0, - 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, - 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88, + 0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, + 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF0, + 0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, + 0xA8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88, 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, + 0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, - 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8, + 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8, 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, - 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, - 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0, - 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, + 0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, + 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0xE0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, + 0x00,0xFE,0xF8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0, + 0x88,0x88,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, - 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01, - 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, - 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05, - 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0, - 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, - 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, + 0x00,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, + 0xE0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x04,0x09,0x09,0x06,0x01, + 0xFE,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0x88,0x90,0xE0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xC0,0x40,0x40, + 0x40,0x40,0x40,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, + 0x05,0x05,0x06,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x78,0x80,0x70,0x08,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20, 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, - 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, - 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40, - 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40, - 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff + 0xA8,0xA8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, + 0x00,0xF8,0x10,0x20,0x40,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40,0x40,0x40, + 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40,0x40,0x20,0x40, + 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xA8,0x90,0xFF }; #else // !STM32_NOT_EXTENDED_ISO10646_1_5X7 @@ -141,171 +141,171 @@ extern const uint8_t ISO10646_1_5x7[1325] = { Max Font ascent =10 descent=-2 */ extern const uint8_t ISO10646_1_5x7[2648] = { - 0x00,0x0c,0x0d,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0xff,0xfe,0x0a,0xfe,0x08, - 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, - 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, - 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, - 0xb8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a, - 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8, - 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70, - 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, - 0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, - 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00, - 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8, - 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20, - 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68, - 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20, - 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40, - 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70, - 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02, - 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02, - 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, - 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88, - 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, - 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, - 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x0C,0x0D,0x00,0xFE,0x07,0x02,0x26,0x03,0xBC,0x01,0xFF,0xFE,0x0A,0xFE,0x08, + 0xFE,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xF0,0xC8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xF8,0x20,0x20,0x20,0x20,0xE0,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA8, + 0xB8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xE0,0x8C,0xEA,0x8C,0x8A, + 0x0A,0x05,0x09,0x09,0x06,0x00,0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0xF8, + 0x05,0x0A,0x0A,0x06,0x00,0xFE,0x20,0x50,0x50,0x50,0x50,0x88,0xA8,0xA8,0x88,0x70, + 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, + 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xA0,0xA0,0xA0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x50,0xF8,0x50,0x50,0xF8,0x50,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8, + 0xA0,0x70,0x28,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xC8,0xC8,0x10,0x20, + 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68, + 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x20, + 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40, + 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xA8,0x70, + 0x20,0x70,0xA8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xF8,0x20,0x20,0x02, + 0x03,0x03,0x06,0x01,0xFF,0xC0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xF8,0x02, + 0x02,0x02,0x06,0x01,0x00,0xC0,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, + 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xA8,0xC8,0x88, + 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xF8,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, + 0x50,0x90,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0xF0,0x08,0x08, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xF0,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0, - 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05, - 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00, - 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, + 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xC0,0xC0,0x00,0xC0, + 0xC0,0x02,0x06,0x06,0x06,0x01,0xFF,0xC0,0xC0,0x00,0xC0,0x40,0x80,0x03,0x05,0x05, + 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xF8,0x00, + 0xF8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8, - 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0, + 0x88,0xB8,0xA8,0xB8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8, + 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0, 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00, - 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x06,0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x05,0x07,0x07,0x06,0x00,0x00, + 0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80, + 0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00, 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, - 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, - 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0, - 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, - 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88, + 0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, + 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF0, + 0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, + 0xA8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88, 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, + 0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, - 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8, + 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8, 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, - 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, - 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0, - 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, + 0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, + 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0xE0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, + 0x00,0xFE,0xF8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0, + 0x88,0x88,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, - 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01, - 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, - 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05, - 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0, - 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, - 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, + 0x00,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, + 0xE0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x04,0x09,0x09,0x06,0x01, + 0xFE,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0x88,0x90,0xE0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xC0,0x40,0x40, + 0x40,0x40,0x40,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, + 0x05,0x05,0x06,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x78,0x80,0x70,0x08,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20, 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, - 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, - 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40, - 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40, - 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, - 0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80, - 0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20,0x05,0x07,0x07, - 0x06,0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05,0x06,0x00,0x00, - 0xa8,0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xf8,0x20,0xf8, + 0xA8,0xA8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, + 0x00,0xF8,0x10,0x20,0x40,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40,0x40,0x40, + 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40,0x40,0x20,0x40, + 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xA8,0x90,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80, + 0x05,0x07,0x07,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA0,0xA8,0x70,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x30,0x48,0x40,0xE0,0x40,0x48,0xB0,0x05,0x05,0x05,0x06,0x00,0x00, + 0xA8,0x50,0x88,0x50,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xF8,0x20,0xF8, 0x20,0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04, - 0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0,0x03,0x01,0x01, - 0x06,0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,0xb4,0x84, - 0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05,0x05,0x05,0x06, - 0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x08,0x08, - 0x03,0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4, - 0xa4,0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04,0x04,0x06,0x01, - 0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, - 0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xa0,0x20,0x40,0xe0,0x03,0x05,0x05, - 0x06,0x01,0x04,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40, - 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x08, - 0x08,0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06, - 0x02,0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03,0x05,0x05,0x06, - 0x01,0x04,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x40, - 0x00,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x0a,0x0a, - 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10,0x05,0x0a,0x0a, - 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38,0x05,0x0a,0x0a, - 0x06,0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10,0x05,0x07,0x07, - 0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00, - 0x40,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, - 0x10,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, - 0x20,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, - 0x68,0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00, - 0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, - 0x50,0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78, - 0xa0,0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x80, - 0x80,0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80, - 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80, - 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0xf8,0x80, - 0x80,0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80, - 0xf0,0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00,0xe0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xe0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00,0xe0,0x40,0x40, - 0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40, - 0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8,0x48,0x48,0x70, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xE0,0x03,0x01,0x01, + 0x06,0x01,0x07,0xA0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xB4,0xA4,0xB4,0x84, + 0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xA0,0x60,0x00,0xE0,0x05,0x05,0x05,0x06, + 0x00,0x00,0x28,0x50,0xA0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xF8,0x08,0x08, + 0x03,0x01,0x01,0x06,0x01,0x03,0xE0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xB4, + 0xA4,0xA4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xF8,0x04,0x04,0x04,0x06,0x01, + 0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20, + 0x00,0xF8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xA0,0x20,0x40,0xE0,0x03,0x05,0x05, + 0x06,0x01,0x04,0xC0,0x20,0x40,0x20,0xC0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40, + 0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x08, + 0x08,0x06,0x00,0x00,0x78,0xE8,0xE8,0xE8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06, + 0x02,0x03,0xC0,0xC0,0x03,0x02,0x02,0x06,0x01,0xFE,0x20,0xC0,0x03,0x05,0x05,0x06, + 0x01,0x04,0x40,0xC0,0x40,0x40,0xE0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xA0,0x40, + 0x00,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xA0,0x50,0x28,0x50,0xA0,0x05,0x0A,0x0A, + 0x06,0x00,0x00,0x40,0xC0,0x48,0x50,0x60,0x50,0xB0,0x50,0x78,0x10,0x05,0x0A,0x0A, + 0x06,0x00,0x00,0x40,0xC0,0x48,0x50,0x60,0x50,0xA8,0x08,0x10,0x38,0x05,0x0A,0x0A, + 0x06,0x00,0x00,0xC0,0x20,0x48,0x30,0xE0,0x50,0xB0,0x50,0x78,0x10,0x05,0x07,0x07, + 0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00, + 0x40,0x20,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00, + 0x10,0x20,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00, + 0x20,0x50,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00, + 0x68,0xB0,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00, + 0x50,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20, + 0x50,0x20,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78, + 0xA0,0xA0,0xF0,0xA0,0xA0,0xB8,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x80,0x80, + 0x80,0x88,0x70,0x10,0x60,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0xF8,0x80, + 0x80,0xF0,0x80,0x80,0xF8,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0xF8,0x80, + 0x80,0xF0,0x80,0x80,0xF8,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50,0x00,0xF8,0x80, + 0x80,0xF0,0x80,0x80,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xF8,0x80,0x80, + 0xF0,0x80,0x80,0xF8,0x03,0x0A,0x0A,0x06,0x01,0x00,0x80,0x40,0x00,0xE0,0x40,0x40, + 0x40,0x40,0x40,0xE0,0x03,0x0A,0x0A,0x06,0x01,0x00,0x20,0x40,0x00,0xE0,0x40,0x40, + 0x40,0x40,0x40,0xE0,0x03,0x0A,0x0A,0x06,0x01,0x00,0x40,0xA0,0x00,0xE0,0x40,0x40, + 0x40,0x40,0x40,0xE0,0x03,0x09,0x09,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40,0x40,0x40, + 0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xE8,0x48,0x48,0x70, + 0x05,0x0A,0x0A,0x06,0x00,0x00,0x68,0xB0,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88, + 0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0A,0x0A,0x06,0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, 0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xff, - 0x08,0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, - 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, - 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, + 0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xFF, + 0x08,0x70,0x98,0xA8,0xA8,0xA8,0xC8,0x70,0x80,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40, + 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10, + 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20, 0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50, - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20, - 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xe0, - 0x90,0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xa0,0x90, - 0x88,0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78, + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xE0, + 0x90,0x90,0x90,0xE0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xA0,0x90, + 0x88,0xB0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78, 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08, 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06, - 0x00,0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x00,0x00,0x68,0xB0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, 0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20, - 0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xa0,0x78, - 0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08, - 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00, - 0x00,0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20, - 0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70, - 0x88,0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40, - 0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0, - 0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,0x07, - 0x07,0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09,0x09,0x06,0x00, + 0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xA0,0x78, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08, + 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x08,0x08,0x06,0x00, + 0x00,0x10,0x20,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20, + 0x50,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70, + 0x88,0xF0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xC0,0x40,0x40, + 0x40,0xE0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0, + 0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xA0,0x00,0xC0,0x40,0x40,0x40,0xE0,0x03,0x07, + 0x07,0x06,0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0x40,0xE0,0x05,0x09,0x09,0x06,0x00, 0x00,0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00, - 0x68,0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20, + 0x68,0xB0,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20, 0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70, 0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88, - 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x70, + 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x70, 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98, - 0xa8,0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88, + 0x06,0x00,0x01,0x20,0x00,0xF8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98, + 0xA8,0xC8,0xF0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88, 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05, 0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe, - 0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xfe, - 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x50, + 0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE, + 0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xFE, + 0x80,0x80,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xFE,0x50, 0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80 }; diff --git a/Marlin/src/lcd/tft/images/back_32x32x4.cpp b/Marlin/src/lcd/tft/images/back_32x32x4.cpp index 8f5809d5dc..84a6e3aba6 100644 --- a/Marlin/src/lcd/tft/images/back_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/back_32x32x4.cpp @@ -30,29 +30,29 @@ extern const uint8_t back_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x6f, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x76, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x6e, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x76, 0xef, 0xff, 0xe5, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x6e, 0xff, 0xff, 0xd5, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x76, 0xff, 0xff, 0xff, 0xfe, 0xb8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x85, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, - 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x66, 0x88, 0x88, 0x88, - 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x56, 0x78, 0x88, 0x88, - 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x67, 0x88, 0x88, - 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x56, 0x78, 0x88, - 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0x68, 0x88, - 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, - 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xfc, 0xde, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, - 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xd5, 0x67, 0x77, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0x56, 0x78, - 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xe5, 0x78, 0x87, 0x77, 0x77, 0xae, 0xff, 0xff, 0x95, 0x68, - 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xf5, 0x58, - 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xf8, 0x57, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xe6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xfc, 0x56, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xd7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0x66, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0x97, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x6F, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xFF, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x6E, 0xFF, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x76, 0xEF, 0xFF, 0xE5, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x6E, 0xFF, 0xFF, 0xD5, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x76, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x85, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x76, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, + 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x66, 0x88, 0x88, 0x88, + 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x56, 0x78, 0x88, 0x88, + 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x67, 0x88, 0x88, + 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x56, 0x78, 0x88, + 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x68, 0x88, + 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0x88, + 0x88, 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, + 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xD5, 0x67, 0x77, 0x8A, 0xDF, 0xFF, 0xFF, 0xFF, 0x56, 0x78, + 0x88, 0x88, 0x88, 0x77, 0xEF, 0xFF, 0xE5, 0x78, 0x87, 0x77, 0x77, 0xAE, 0xFF, 0xFF, 0x95, 0x68, + 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xF5, 0x58, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xEF, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0xDF, 0xF8, 0x57, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x7F, 0xE6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFC, 0x56, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xD7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0x66, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7D, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/background_320x30x16.cpp b/Marlin/src/lcd/tft/images/background_320x30x16.cpp index f6eca2d6dd..49c4a84a0c 100644 --- a/Marlin/src/lcd/tft/images/background_320x30x16.cpp +++ b/Marlin/src/lcd/tft/images/background_320x30x16.cpp @@ -25,36 +25,36 @@ #if HAS_GRAPHICAL_TFT extern const uint16_t background_320x30x16[9600] = { - 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x20f3, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x20f3, 0x20f2, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, - 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2dfd, 0x2dfd, 0x2dfe, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x1ddd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, - 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2dde, 0x2d5d, 0x2d1c, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x251d, 0x2d1d, 0x2cfc, 0x253c, 0x25bd, 0x25bd, 0x2cfd, 0x24fd, 0x2d1d, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x255d, 0x25fd, 0x251c, 0x24fd, 0x24dd, 0x24fc, 0x24fd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x253d, 0x25bd, 0x253d, 0x24dc, 0x24dc, 0x24dc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, - 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2bbc, 0x25bd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x247c, 0x259c, 0x2b1c, 0x2b1c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x1cfd, 0x253c, 0x233c, 0x22fc, 0x231b, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fb, 0x22dc, 0x22db, 0x22dc, 0x235b, 0x1d5c, 0x1d1c, 0x231c, 0x22fb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, - 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x259d, 0x241c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1d9c, 0x247c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bdc, 0x23fc, 0x1d7d, 0x1cdc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9b, 0x1bbc, 0x1b9b, 0x1bbb, 0x1b9c, 0x1bfb, 0x1d5c, 0x1d3c, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, - 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bbb, 0x23bc, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bdb, 0x1bbb, 0x1c7c, 0x1cfc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1d1c, 0x1c9c, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9b, 0x1c3c, 0x1d5c, 0x1c3b, 0x1b9c, 0x1b9b, 0x1b9b, 0x139b, 0x1b9b, 0x139b, 0x13bb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x1b9b, 0x139b, 0x139b, 0x137b, 0x139b, 0x1b7b, 0x151c, 0x153c, 0x1bbb, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, - 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19db, 0x19da, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x1a3b, 0x153c, 0x1a1b, 0x19da, 0x19db, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19da, 0x1afb, 0x14fb, 0x1a3b, 0x19da, 0x11da, 0x19db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19ba, 0x11da, 0x137b, 0x14db, 0x127a, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11bb, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11db, 0x13fb, 0x14bb, 0x12ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, - 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x133b, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x14db, 0x13bb, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133b, 0x135a, 0x135b, 0x147b, 0x143a, 0x133b, 0x0b5b, 0x135a, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x0b3a, 0x133b, 0x133b, 0x0c5b, 0x0cdb, 0x137a, 0x0b3a, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x133b, 0x133b, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x131a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0bfa, 0x14bb, 0x0bdb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, - 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b7a, 0x0c7b, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c1a, 0x0c5b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0c5a, 0x0c3a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x031a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0af9, 0x0afa, 0x0b5a, 0x0c7b, 0x0c1a, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, - 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0979, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0979, 0x0179, 0x0c3b, 0x09b9, 0x0179, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0959, 0x0199, 0x043a, 0x0a79, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0959, 0x0958, 0x0179, 0x0959, 0x01f9, 0x041a, 0x033a, 0x0958, 0x0159, 0x0178, 0x0159, 0x0979, 0x0958, 0x0179, 0x0979, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0179, 0x0159, 0x0158, 0x0959, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0159, 0x0159, 0x0958, 0x0218, 0x0bda, 0x037a, 0x01b9, 0x0159, 0x0158, 0x0158, 0x0178, 0x0138, 0x0158, 0x0158, 0x0158, - 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0159, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0319, 0x02d9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01f9, 0x03f9, 0x01d9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0178, 0x0399, 0x0339, 0x0178, 0x0158, 0x0158, 0x0158, 0x0938, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0178, 0x02b9, 0x03d9, 0x0278, 0x0138, 0x0157, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, - 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x01b8, 0x03b9, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0278, 0x0359, 0x0158, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0157, 0x02f8, 0x0359, 0x0157, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0136, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x01d7, 0x0379, 0x0318, 0x0177, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, - 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x03b8, 0x0338, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0399, 0x0358, 0x0318, 0x02f8, 0x02f8, 0x02f7, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, - 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x01b7, 0x01b6, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0257, 0x02f7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x01b6, 0x0318, 0x0277, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0217, 0x0358, 0x0237, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0197, 0x01b6, 0x02d7, 0x0337, 0x01f7, 0x0196, 0x0196, - 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d6, 0x00f5, 0x00f6, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f6, 0x00d5, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00d6, 0x00d6, 0x00f5, 0x00f6, 0x00f6, 0x00f6, 0x00d5, 0x00d5, 0x0156, 0x0337, 0x0155, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, - 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d5, 0x0255, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x02b5, 0x00f4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x0134, 0x02b5, 0x01d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x0134, 0x0255, 0x0275, - 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0153, 0x0253, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0092, 0x01d3, 0x0213, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0112, 0x0253, 0x01d3, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x0172, - 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x0090, 0x00b0, 0x0252, 0x00f1, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0212, 0x0171, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0191, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0252, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d1, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0232, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0130, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0232, 0x00f0, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x01f1, 0x0130, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0070, 0x01b1, 0x01f1, 0x0090, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0151, 0x0212, 0x00f0, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0130, 0x01d2, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x01f2, 0x0170, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x0130, 0x0252, 0x0110, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x00af, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x00af, 0x0212, 0x010f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x00cf, 0x0232, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0191, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x008f, 0x006e, 0x006f, 0x008f, 0x0110, 0x0212, 0x00cf, 0x006f, 0x006e, 0x006e, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x00cf, 0x01f1, 0x0191, 0x006e, 0x008e, 0x006f, 0x006f, 0x006e, 0x006e, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x00cf, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x0170, 0x01f1, 0x00ae, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x01f1, 0x01d1, 0x008e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x01f1, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0190, 0x01d1, 0x00af, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x008e, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x0191, 0x0212, 0x00af, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x0232, 0x008e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x004e, 0x00cf, 0x0212, 0x00af, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x010f, 0x0212, 0x00ef, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x0191, 0x0130, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01d1, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006d, 0x00ef, 0x0212, 0x010f, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004e, 0x006e, 0x006d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x010f, 0x01d1, 0x006e, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x01b1, 0x0170, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x00ae, 0x01f1, 0x0150, 0x004d, 0x004d, 0x004d, 0x004e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d + 0x10F2, 0x18D2, 0x18D2, 0x10D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x20F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2112, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F2, 0x20F3, 0x20F2, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x28F3, 0x2113, 0x20F3, 0x2113, 0x28F3, 0x20F3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x20F3, 0x28F3, 0x2113, 0x20F3, 0x2113, 0x28F3, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F2, 0x20F3, 0x20F2, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2112, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x20F2, 0x18F3, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, + 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x259C, 0x1DBC, 0x1D9D, 0x259D, 0x1D9C, 0x259C, 0x259C, 0x259C, 0x259C, 0x259C, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x1DDD, 0x25DD, 0x25DD, 0x25DD, 0x25BD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x25FD, 0x2DFE, 0x2DFD, 0x2DFD, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3E, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3E, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2DFD, 0x2DFD, 0x2DFE, 0x25FD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25BD, 0x25DD, 0x25DD, 0x25DD, 0x1DDD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, + 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7B, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x249C, 0x1C9C, 0x1D9D, 0x1D7C, 0x1CFC, 0x1C9C, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24DC, 0x24DC, 0x24DC, 0x253D, 0x25BD, 0x253D, 0x24DD, 0x24BC, 0x24BC, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24FD, 0x24DC, 0x24DC, 0x24FD, 0x24FD, 0x24FC, 0x24DD, 0x24FD, 0x251C, 0x25FD, 0x255D, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FC, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x251D, 0x24FD, 0x24FD, 0x251D, 0x2D1D, 0x24FD, 0x2CFD, 0x25BD, 0x25BD, 0x253C, 0x2CFC, 0x2D1D, 0x251D, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1C, 0x2D5D, 0x2DDE, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2E1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2DDE, 0x2D5D, 0x2D1C, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x251D, 0x2D1D, 0x2CFC, 0x253C, 0x25BD, 0x25BD, 0x2CFD, 0x24FD, 0x2D1D, 0x251D, 0x24FD, 0x24FD, 0x251D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FC, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x255D, 0x25FD, 0x251C, 0x24FD, 0x24DD, 0x24FC, 0x24FD, 0x24FD, 0x24DC, 0x24DC, 0x24FD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24BC, 0x24BC, 0x24DD, 0x253D, 0x25BD, 0x253D, 0x24DC, 0x24DC, 0x24DC, 0x1CBC, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, + 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1B3B, 0x1CFC, 0x157C, 0x1C1C, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x22FB, 0x231C, 0x1D1C, 0x1D5C, 0x235B, 0x22DC, 0x22DB, 0x22DC, 0x22FB, 0x22FC, 0x22DC, 0x22DC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FB, 0x22FB, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231B, 0x22FC, 0x233C, 0x253C, 0x1CFD, 0x22FC, 0x22FC, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x2AFC, 0x2AFC, 0x231C, 0x2B1C, 0x2B1C, 0x259C, 0x247C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x25BD, 0x2BBC, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x25DD, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2BBC, 0x25BD, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x247C, 0x259C, 0x2B1C, 0x2B1C, 0x231C, 0x2AFC, 0x2AFC, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FC, 0x22FC, 0x1CFD, 0x253C, 0x233C, 0x22FC, 0x231B, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FB, 0x22FB, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22DC, 0x22DC, 0x22FC, 0x22FB, 0x22DC, 0x22DB, 0x22DC, 0x235B, 0x1D5C, 0x1D1C, 0x231C, 0x22FB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, + 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x137B, 0x1B5B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x139B, 0x1BBB, 0x14FB, 0x153C, 0x13FB, 0x1B7B, 0x139B, 0x1B7B, 0x1B7C, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, 0x139C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1D3C, 0x1D5C, 0x1BFB, 0x1B9C, 0x1BBB, 0x1B9B, 0x1BBC, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1CDC, 0x1D7D, 0x23FC, 0x1BDC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x1BBC, 0x1BBC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x247C, 0x1D9C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x241C, 0x259D, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x259D, 0x241C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1D9C, 0x247C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1BBC, 0x1BBC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BDC, 0x23FC, 0x1D7D, 0x1CDC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1B9B, 0x1BBC, 0x1B9B, 0x1BBB, 0x1B9C, 0x1BFB, 0x1D5C, 0x1D3C, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x139C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, + 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x137B, 0x135A, 0x135A, 0x137B, 0x135A, 0x135B, 0x139B, 0x14BB, 0x14FB, 0x13FB, 0x137B, 0x137B, 0x135B, 0x137B, 0x137A, 0x137A, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1BBB, 0x153C, 0x151C, 0x1B7B, 0x139B, 0x137B, 0x139B, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x13BB, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1C3B, 0x1D5C, 0x1C3C, 0x1B9B, 0x1BBB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1C9C, 0x1D1C, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BDB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1CFC, 0x1C7C, 0x1BBB, 0x1BDB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BDC, 0x23BC, 0x1BBB, 0x1D7C, 0x1BBB, 0x1BBB, 0x23BC, 0x1BDC, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BDB, 0x1BBB, 0x1C7C, 0x1CFC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BDB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1D1C, 0x1C9C, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BBB, 0x1B9B, 0x1C3C, 0x1D5C, 0x1C3B, 0x1B9C, 0x1B9B, 0x1B9B, 0x139B, 0x1B9B, 0x139B, 0x13BB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x1B9B, 0x1B9B, 0x139B, 0x1B9B, 0x139B, 0x139B, 0x137B, 0x139B, 0x1B7B, 0x151C, 0x153C, 0x1BBB, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x137B, + 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11BA, 0x11BA, 0x11B9, 0x09B9, 0x11BA, 0x1199, 0x11BA, 0x11BA, 0x1199, 0x11DA, 0x0B3A, 0x0C9B, 0x0BFB, 0x127A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x12BA, 0x14BB, 0x13FB, 0x11DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BB, 0x11BA, 0x11DA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x127A, 0x14DB, 0x137B, 0x11DA, 0x19BA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x19DB, 0x11DA, 0x19DA, 0x1A3B, 0x14FB, 0x1AFB, 0x19DA, 0x11DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x1A1B, 0x153C, 0x1A3B, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x153B, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x1A3B, 0x153C, 0x1A1B, 0x19DA, 0x19DB, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x11DB, 0x19DA, 0x1AFB, 0x14FB, 0x1A3B, 0x19DA, 0x11DA, 0x19DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19BA, 0x11DA, 0x137B, 0x14DB, 0x127A, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11DA, 0x11BA, 0x11BB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DB, 0x13FB, 0x14BB, 0x12BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, + 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0C3A, 0x0C9A, 0x0BDA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDB, 0x14BB, 0x0BFA, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x131A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133B, 0x133B, 0x133A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x0B3A, 0x137A, 0x0CDB, 0x0C5B, 0x133B, 0x133B, 0x0B3A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x135B, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x135A, 0x0B5B, 0x133B, 0x143A, 0x147B, 0x135B, 0x135A, 0x133B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x13BB, 0x14DB, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x14FB, 0x135A, 0x133B, 0x135B, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x14DB, 0x13BB, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x133B, 0x135A, 0x135B, 0x147B, 0x143A, 0x133B, 0x0B5B, 0x135A, 0x133B, 0x133B, 0x135B, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x0B3A, 0x133B, 0x133B, 0x0C5B, 0x0CDB, 0x137A, 0x0B3A, 0x133A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x133B, 0x133B, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B3A, 0x131A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0BFA, 0x14BB, 0x0BDB, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, + 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02F9, 0x02D9, 0x02DA, 0x0ADA, 0x0AFA, 0x0BFA, 0x0C5B, 0x0BFA, 0x0AD9, 0x02FA, 0x02F9, 0x02F9, 0x0AF9, 0x02F9, 0x0AF9, 0x02D9, 0x02F9, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0C1A, 0x0C7B, 0x0B5A, 0x0AFA, 0x0AF9, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x031A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0C3A, 0x0C5A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0C5B, 0x0C1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0C7B, 0x0B7A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0CBB, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B7A, 0x0C7B, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0C1A, 0x0C5B, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0C5A, 0x0C3A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x031A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AF9, 0x0AFA, 0x0B5A, 0x0C7B, 0x0C1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03B9, 0x03DA, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01B9, 0x037A, 0x0BDA, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033A, 0x041A, 0x01F9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0A79, 0x043A, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09B9, 0x0C3B, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0C7A, 0x0979, 0x0179, 0x0979, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0979, 0x0179, 0x0C3B, 0x09B9, 0x0179, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0959, 0x0199, 0x043A, 0x0A79, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0959, 0x0958, 0x0179, 0x0959, 0x01F9, 0x041A, 0x033A, 0x0958, 0x0159, 0x0178, 0x0159, 0x0979, 0x0958, 0x0179, 0x0979, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0179, 0x0159, 0x0158, 0x0959, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0159, 0x0159, 0x0958, 0x0218, 0x0BDA, 0x037A, 0x01B9, 0x0159, 0x0158, 0x0158, 0x0178, 0x0138, 0x0158, 0x0158, 0x0158, + 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01D8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03D9, 0x02B9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01D9, 0x03F9, 0x01F9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02D9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041A, 0x0959, 0x0159, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0319, 0x02D9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01F9, 0x03F9, 0x01D9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0178, 0x0399, 0x0339, 0x0178, 0x0158, 0x0158, 0x0158, 0x0938, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0178, 0x02B9, 0x03D9, 0x0278, 0x0138, 0x0157, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01D7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01D7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02F8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03B9, 0x01B8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03F9, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x01B8, 0x03B9, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0278, 0x0359, 0x0158, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0157, 0x02F8, 0x0359, 0x0157, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0136, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x01D7, 0x0379, 0x0318, 0x0177, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, + 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02F7, 0x0358, 0x0378, 0x02F7, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D7, 0x02F8, 0x02F8, 0x0398, 0x0378, 0x02F8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0398, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F7, 0x02F8, 0x02F8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03B8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03B8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x03B8, 0x0338, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x02F8, 0x0318, 0x0399, 0x0358, 0x0318, 0x02F8, 0x02F8, 0x02F7, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0398, 0x0378, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D8, 0x02F8, 0x0378, 0x0398, 0x02F8, 0x02F8, 0x02D7, 0x02F8, 0x02F8, + 0x0176, 0x01B6, 0x02F8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01F7, 0x0337, 0x02D7, 0x01B6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01B6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x02F7, 0x0257, 0x0197, 0x01B6, 0x01B7, 0x01B6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x01B6, 0x01B7, 0x0378, 0x01B7, 0x01B7, 0x01B6, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x01B7, 0x01B6, 0x0197, 0x0257, 0x02F7, 0x01B6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x01B6, 0x0318, 0x0277, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0217, 0x0358, 0x0237, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0197, 0x01B6, 0x02D7, 0x0337, 0x01F7, 0x0196, 0x0196, + 0x0236, 0x0317, 0x0256, 0x00F4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x01F6, 0x0317, 0x01F6, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x01B6, 0x0337, 0x01B6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x0155, 0x0337, 0x0156, 0x00D5, 0x00D5, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00D6, 0x00D6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00D5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x0115, 0x0338, 0x0115, 0x00F6, 0x00F5, 0x00F6, 0x00F5, 0x00D6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F6, 0x00D5, 0x00F5, 0x0357, 0x00F5, 0x00F5, 0x00D5, 0x00F6, 0x00D5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D6, 0x00F5, 0x00F6, 0x00F5, 0x00F6, 0x0115, 0x0338, 0x0115, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00F6, 0x00D5, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00D6, 0x00D6, 0x00F5, 0x00F6, 0x00F6, 0x00F6, 0x00D5, 0x00D5, 0x0156, 0x0337, 0x0155, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x01B6, 0x0337, 0x01B6, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x01F6, 0x0317, 0x01F6, 0x00F5, + 0x01F4, 0x0113, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00D3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00D3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00D3, 0x00B3, 0x00D3, 0x00D3, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x01D4, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00F4, 0x02B5, 0x01B5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01B5, 0x0255, 0x00D5, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x02F6, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D5, 0x0255, 0x01B5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01B5, 0x02B5, 0x00F4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x0134, 0x02B5, 0x01D4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D3, 0x00D3, 0x00B3, 0x00D3, 0x0134, 0x0255, 0x0275, + 0x00B1, 0x0091, 0x0091, 0x0091, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x00D2, 0x01B2, 0x0273, 0x0172, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x01D3, 0x0253, 0x0112, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0213, 0x01D3, 0x0092, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0253, 0x0153, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0294, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0153, 0x0253, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0092, 0x01D3, 0x0213, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0112, 0x0253, 0x01D3, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x0172, + 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01D1, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01D2, 0x01F2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0171, 0x0212, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00F1, 0x0252, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0272, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x0090, 0x00B0, 0x0252, 0x00F1, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0212, 0x0171, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F2, 0x01D2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F2, 0x01D1, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01B1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0191, 0x01B1, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00D0, 0x0252, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01D1, 0x01F2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x00D0, 0x0212, 0x01D2, 0x00D0, 0x0090, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x00F0, 0x0232, 0x01B1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0232, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00D0, 0x0232, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0130, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x01B1, 0x0232, 0x00F0, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, + 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0171, 0x0232, 0x0151, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x00F0, 0x0212, 0x0151, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x01F1, 0x01B1, 0x0070, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0130, 0x01F1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x01F1, 0x0130, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0070, 0x01B1, 0x01F1, 0x0090, 0x0070, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0151, 0x0212, 0x00F0, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0070, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, + 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0070, 0x008F, 0x006F, 0x008F, 0x0110, 0x0232, 0x01B1, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0110, 0x0252, 0x0130, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0170, 0x01F2, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x01D2, 0x0130, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0130, 0x01D2, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x01F2, 0x0170, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x0130, 0x0252, 0x0110, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, + 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x01B1, 0x0232, 0x010F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0232, 0x00CF, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x010F, 0x0212, 0x00AF, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x00AF, 0x0212, 0x00AF, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x0252, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00AF, 0x0212, 0x00AF, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x00AF, 0x0212, 0x010F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x00CF, 0x0232, 0x0150, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0110, 0x0212, 0x01B1, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x008F, 0x006E, 0x006E, 0x006F, 0x006F, 0x008E, 0x006E, 0x0191, 0x01F1, 0x00CF, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006E, 0x006E, 0x006F, 0x00CF, 0x0212, 0x0110, 0x008F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0191, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0232, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0191, 0x0150, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006F, 0x008F, 0x006E, 0x006F, 0x008F, 0x0110, 0x0212, 0x00CF, 0x006F, 0x006E, 0x006E, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006F, 0x006F, 0x00CF, 0x01F1, 0x0191, 0x006E, 0x008E, 0x006F, 0x006F, 0x006E, 0x006E, 0x008F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x008E, 0x01D1, 0x01F1, 0x008F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x01F1, 0x0170, 0x006F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0211, 0x00CF, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008F, 0x00CF, 0x0211, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006F, 0x0170, 0x01F1, 0x00AE, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x008F, 0x01F1, 0x01D1, 0x008E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0130, 0x0212, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01D1, 0x0190, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01F1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0211, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0211, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x01F1, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0190, 0x01D1, 0x00AF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x01F2, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x0212, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x008E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x008E, 0x0212, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x0191, 0x0212, 0x00AF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x004D, 0x0130, 0x01F2, 0x0150, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x00EF, 0x0212, 0x010F, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x00AF, 0x0212, 0x00CF, 0x004E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x008E, 0x0232, 0x008E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x008E, 0x0232, 0x008E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x004E, 0x00CF, 0x0212, 0x00AF, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x010F, 0x0212, 0x00EF, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006D, 0x004D, 0x004D, 0x004E, 0x004D, 0x004D, 0x006D, 0x006D, 0x008E, 0x01B1, 0x01D1, 0x00CE, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006E, 0x004D, 0x006E, 0x006E, 0x004E, 0x006D, 0x010F, 0x0212, 0x00EF, 0x006D, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x004D, 0x006E, 0x01D1, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0130, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0232, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x0191, 0x0130, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x01D1, 0x006E, 0x004D, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006D, 0x00EF, 0x0212, 0x010F, 0x006D, 0x004E, 0x006E, 0x006E, 0x004D, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, + 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x0150, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004E, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x00AE, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x0170, 0x01B1, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x006E, 0x01D1, 0x010F, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004E, 0x0212, 0x004D, 0x004E, 0x006E, 0x006D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x010F, 0x01D1, 0x006E, 0x004E, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x01B1, 0x0170, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x00AE, 0x01F1, 0x0150, 0x004D, 0x004D, 0x004D, 0x004E, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp index 454e964028..2545f845a8 100644 --- a/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp +++ b/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp @@ -25,65 +25,65 @@ #if HAS_GRAPHICAL_TFT extern const uint16_t marlin_logo_195x59x16[11505] = { - 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, - 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, - 0x18ad, 0x20ab, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, - 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, - 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, - 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, - 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, - 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xc53a, 0xc67c, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, - 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xbe3b, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, - 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xbe3b, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, - 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, - 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, - 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, - 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, - 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, - 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, - 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, - 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, - 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, - 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, - 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, - 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, - 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, - 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, - 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, - 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, - 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, - 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, - 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, - 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, - 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, - 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, - 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, - 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, - 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, - 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, - 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, - 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, - 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, - 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, - 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, - 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, - 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, - 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, - 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xec6f, 0xa8f1, 0xa8f1, 0xa8f1, - 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xec8e, 0xa911, 0xa911, 0xa911, - 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe42e, 0xa111, 0xa911, 0xa911, - 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc2b0, 0xa111, 0xa111, 0x80f0, - 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe2d, 0xa112, 0xa111, 0xa111, 0x60ef, - 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xcbcf, 0xa111, 0xa111, 0xa111, 0x28cd, - 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0xa171, 0xa111, 0x9911, 0x8110, 0x18ad, - 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe2d, 0xaa31, 0x9931, 0x9931, 0x9931, 0x38ce, 0x20ac, - 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfe8c, 0xfe8c, 0xf62d, 0xb270, 0x9931, 0x9931, 0x9912, 0x60ef, 0x20ac, 0x20ad, - 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe8c, 0xf5cd, 0xaa31, 0x9911, 0x9931, 0x9931, 0x8110, 0x28ad, 0x20ac, 0x18ac, - 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xcbcf, 0xa171, 0x9931, 0x9931, 0x9931, 0x9111, 0x28ad, 0x18ac, 0x20ac, 0x20ac, - 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x8111, 0x28cd, 0x20ac, 0x18ac, 0x18ac, 0x18ac, - 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9911, 0x610f, 0x28cc, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, - 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7910, 0x40ce, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, - 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9932, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x7910, 0x58cf, 0x30cc, 0x18ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac + 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0x7A32, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, + 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, + 0x18AD, 0x20AB, 0x18AD, 0x18AD, 0x18AD, 0x20EE, 0x8252, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, + 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD4F8, 0xD65C, 0xD6DD, 0xD6FD, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, + 0x18AD, 0x20AD, 0x18AE, 0x28EE, 0xCB55, 0xD375, 0xD395, 0xD395, 0xD3D6, 0xD5DB, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, + 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD477, 0xD77E, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, + 0x18AD, 0x18CD, 0x8252, 0xD395, 0xD395, 0xD396, 0xD4B8, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, + 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD457, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCF3E, 0xC67C, 0xC53A, 0xACB8, 0xACB8, 0xACB8, 0xACB8, 0xACB8, 0xACB8, 0xC53A, 0xC67C, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD65B, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0xD395, + 0x20AE, 0xA2D3, 0xD395, 0xD395, 0xD3D6, 0xD75E, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFDF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7DF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCFFF, 0xD7DF, 0xACD8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xBE3B, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD65C, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, + 0x310E, 0xD395, 0xD375, 0xD375, 0xD5BA, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5B, 0xBE3C, 0xB57A, 0xACB8, 0xBDBB, 0xC63C, 0xBE3B, 0xC71E, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5C, 0xB5DB, 0xACB8, 0xAC98, 0xBD5A, 0xBE3C, 0xC61C, 0xC69D, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xACB9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA111, 0xBE3B, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCF5E, 0xBE5C, 0xBE5C, 0xC63C, 0xC61C, 0xCEFD, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFFF, 0xCFDF, 0xD63B, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD395, + 0x79F1, 0xD355, 0xD355, 0xD355, 0xCF7E, 0xC7DF, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xCFBF, 0xBEFD, 0xACB8, 0x8A52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA192, 0xAB96, 0xBE7D, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xCFDF, 0xCFBF, 0xC75E, 0xAD19, 0x92B4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xA111, 0x9931, 0xA111, 0x9911, 0xAB36, 0xBD5A, 0xC75E, 0xCFDF, 0xC7BF, 0xC7BF, 0xCFDF, 0xC7DF, 0xC7BF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xC7BF, 0xCFBF, 0xC7DF, 0xA4B8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xBE3B, 0xCFBF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xB5DA, 0x8A12, 0x8971, 0x9931, 0x9931, 0xA111, 0x9931, 0xAB35, 0xC75E, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFBF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCE1B, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, + 0xA293, 0xD335, 0xD335, 0xCC98, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC75E, 0xA4B8, 0x8191, 0x9151, 0x9911, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xAB35, 0xBEFE, 0xC7BF, 0xC7BE, 0xC7BF, 0xB5DB, 0x89F1, 0x8971, 0x9931, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA132, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA172, 0xBD3A, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BE, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xAC98, 0x8191, 0x9151, 0x9931, 0xA111, 0xA131, 0xA111, 0xA131, 0xA111, 0x9931, 0xBE1B, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xBEFD, 0x89F2, 0x8991, 0x9931, 0xA112, 0xA131, 0xA111, 0xA111, 0xA111, 0xAB97, 0xC7BF, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC6DD, 0xD375, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, + 0xD315, 0xD315, 0xD314, 0xC5FB, 0xC79F, 0xC79E, 0xC7BF, 0xC7BF, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xBF9E, 0xBFBF, 0xBFBE, 0xB67C, 0x8A53, 0x8971, 0xA131, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA172, 0xB539, 0xBF9F, 0x9BF6, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xAB15, 0xBF3D, 0xC79F, 0xC7BE, 0xC79F, 0xC79F, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79F, 0xC79E, 0xC79F, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xA4B8, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xBDFB, 0xC79F, 0xC79E, 0xC7BE, 0xC79F, 0xACF9, 0x8191, 0x9171, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA131, 0xA111, 0xBF3E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xC7BF, 0xC79E, 0xC79E, 0xC79E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xBF9E, 0xC79F, 0xC79E, 0xBFBE, 0xC79E, 0xC6BD, 0xD355, 0xD2F5, 0xD315, 0xCB14, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD315, 0xD315, 0xD314, + 0xD2F4, 0xCAF4, 0xD2F4, 0xC65C, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF7F, 0xB67C, 0x8A12, 0x8971, 0xA111, 0xA111, 0xA911, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA912, 0xA911, 0xA1F3, 0x8191, 0x9931, 0xA111, 0xA111, 0xA912, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA112, 0xA911, 0xAA54, 0xBF1D, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xB79E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xB5FB, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA911, 0xB5FB, 0xBF7E, 0xBF9E, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBEBD, 0xD335, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F5, 0xCAF4, + 0xD2D4, 0xD2D4, 0xD2D4, 0xBE5C, 0xB77E, 0xB79E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xB77E, 0xB79E, 0xBF7E, 0xAE7B, 0x89F2, 0x8971, 0xA111, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA912, 0xA911, 0xA911, 0xA111, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA111, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA912, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xAA34, 0xB71E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7F, 0xB77E, 0x9C97, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xB5DB, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xA478, 0x8191, 0x9951, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xB5DB, 0xB77F, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xBE9D, 0xCB75, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D5, + 0xD2B4, 0xD2B4, 0xD2B4, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB71D, 0x8A53, 0x8191, 0xA111, 0xA8F1, 0xB0F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F2, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB2F5, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C78, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C77, 0x8191, 0x9151, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB71D, 0xCB96, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCA94, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, + 0xD294, 0xD294, 0xCA94, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0x9416, 0x8991, 0x9951, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xACF9, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF7E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5D, 0xB75E, 0xAF5E, 0xAF5E, 0x9C77, 0x8191, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xB75E, 0xB75E, 0xB75E, 0xB75E, 0x9C78, 0x8991, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB5BB, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF1D, 0xCB75, 0xCA93, 0xD294, 0xCA74, 0xCA94, 0xCA74, 0xD274, 0xCA74, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA93, 0xCA94, 0xD293, 0xCA74, + 0xD274, 0xD274, 0xCA53, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF5D, 0xAF3D, 0xAF3E, 0xA69C, 0x8191, 0x8191, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0D1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xAA13, 0xB418, 0xA438, 0x9AB4, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xAA74, 0xAC78, 0xACF9, 0x9B35, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F2, 0xB0D1, 0xB0F1, 0xA9B3, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0x9C77, 0x8191, 0x9931, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xAF3E, 0xAF3E, 0xAF5D, 0xAF3E, 0x9477, 0x8191, 0x9951, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xADBA, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAEFD, 0xCB56, 0xCA53, 0xCA74, 0xD253, 0xD274, 0xD274, 0xD273, 0xCA73, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD254, 0xCA74, 0xCA54, 0xCA54, 0xCA74, + 0xCA53, 0xCA53, 0xCA53, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0x9457, 0x8191, 0x9931, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB1B3, 0xAD9A, 0xAF3D, 0xAF3D, 0xA73D, 0xA73D, 0x9DDA, 0x89D1, 0x9951, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB213, 0xAD9B, 0xA73E, 0xA73D, 0xAF3E, 0xAF3E, 0x9DDA, 0x81F2, 0x9171, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D2, 0xB0F1, 0xAD39, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3E, 0xAF1E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xAF3E, 0xA73E, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xA73E, 0x9478, 0x8191, 0x9931, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xAD9A, 0xA73E, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xAF3D, 0xAF3D, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xAEDD, 0xC376, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xD253, 0xCA53, 0xCA53, + 0xCA13, 0xCA33, 0xCA13, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0x8A53, 0x8191, 0xA8F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB213, 0xA6BD, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0x9E1B, 0x81F1, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB1F3, 0xA6BD, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0x9E1B, 0x89F2, 0x8991, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB336, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71E, 0xA71D, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA73E, 0xA71D, 0xA73E, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA73E, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0x9477, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA59A, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71E, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71E, 0xA71D, 0xA73D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xBBF7, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA14, 0xD233, 0xCA33, + 0xCA13, 0xCA13, 0xCA13, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x8191, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9EFD, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB932, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1E, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E1B, 0x9457, 0x92D4, 0xA1F3, 0xA911, 0xB0F1, 0xB0F1, 0xA911, 0xB274, 0xB254, 0xB254, 0xABF7, 0xA5DB, 0xA6FD, 0xA6FD, 0xA71D, 0xA71D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E7C, 0x9498, 0x8B14, 0x9A13, 0xA131, 0xA912, 0xB0F1, 0xA8F1, 0xB255, 0xB274, 0xB254, 0xAB97, 0xAD1A, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9457, 0x8191, 0xA131, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA57A, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9E7C, 0x9DBA, 0xA59A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA69C, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E5C, 0x94B8, 0x8AF4, 0x9A13, 0xA131, 0xA8F1, 0xB0F1, 0xB0F1, 0xB932, 0xB274, 0xB254, 0xB336, 0xACB9, 0xA63C, 0x9F1D, 0xBBF7, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, + 0xC9D3, 0xC9D3, 0xC9D3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x959A, 0x8191, 0x9151, 0xC0B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB2B5, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8252, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB1F3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9F1D, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8A93, 0x8191, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xA63C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x94F8, 0x8A53, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8B1, 0xC0B1, 0xC0D1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB992, 0xACB9, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E5C, 0x8B96, 0x8991, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB932, 0xABF7, 0x9E9C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E9C, 0x8B96, 0x8971, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB335, 0xA63C, 0xBBD7, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, + 0xC9B3, 0xC9B3, 0xC9B3, 0x9EDD, 0x96FD, 0x9EDD, 0x96FD, 0x9EFC, 0x96FD, 0x96FD, 0x9599, 0x8991, 0x9171, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xABD7, 0x9EFC, 0x96FD, 0x96FD, 0x96DD, 0x96FD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x9EFD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xAB76, 0x9EDD, 0x9EFD, 0x9EFD, 0x9EDD, 0x9EDD, 0x96DD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x8C37, 0x8191, 0xA131, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xA55A, 0x96FD, 0x9EDD, 0x9EFD, 0x96FD, 0x963B, 0x8AF4, 0x8991, 0xA911, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xB992, 0xA55A, 0x9EDD, 0x9EFC, 0x96FD, 0x9EDD, 0x96FD, 0x9EFD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x94F9, 0x81F1, 0x9171, 0xB8D2, 0xC0B1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB992, 0x9DBB, 0x96FD, 0x9EDD, 0x96FD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x9EDD, 0x96FD, 0x96FD, 0x9EFD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x96FD, 0x9EFD, 0x96FD, 0x9EFD, 0x9EFD, 0x96FD, 0x9EFD, 0x96FD, 0x9539, 0x81F1, 0x9171, 0xB0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB911, 0xACFA, 0xB458, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B3, + 0xC993, 0xC993, 0xC992, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8D79, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x95DA, 0x89F2, 0x8971, 0xB8D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0x9931, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DC, 0x96DD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8CD8, 0x8191, 0x9951, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xAC79, 0xACF9, 0xC992, 0xC993, 0xC9B2, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0xC992, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, + 0xC972, 0xC972, 0xC972, 0x8EBC, 0x8EBD, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8D7A, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D39, 0x8EBD, 0x8EDD, 0x8DBA, 0x81F2, 0x9171, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B2, 0xC8B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xA437, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBD, 0x8EBD, 0x8CD8, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0xA4D9, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0x9D3A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8CD8, 0x8191, 0x9951, 0xC8B1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC8B1, 0xC8D1, 0xA478, 0xA4D9, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, + 0xC952, 0xC952, 0xC952, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D59, 0x8191, 0x9171, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xABD7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA931, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC0F2, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8437, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D3A, 0x8EBC, 0x8E1B, 0x81F2, 0x8971, 0xB912, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC112, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F1, 0xA498, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8DBA, 0x8991, 0x8991, 0xC0F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC8F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC132, 0x8E5C, 0x8C17, 0x8191, 0xA931, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C17, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8DBA, 0x81F2, 0x8991, 0xC111, 0xC8F1, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8D2, 0xC8F1, 0xC8F2, 0xC0F1, 0xC0F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC152, 0x95FB, 0xA4B8, 0xC152, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, + 0xC932, 0xC932, 0xC932, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D79, 0x8191, 0x9171, 0xC132, 0xC131, 0xC912, 0xC912, 0xC132, 0xC911, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC911, 0xC912, 0xC912, 0xC112, 0xC912, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8AD4, 0x8191, 0xB152, 0xC912, 0xC131, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC912, 0xC912, 0xC911, 0xC112, 0xC932, 0xC912, 0xC912, 0xC932, 0xC911, 0xC912, 0xC912, 0xC932, 0xC131, 0x9DBA, 0x8EBC, 0x96BC, 0x8EBC, 0x8EDC, 0x96BB, 0x8EBC, 0x8EDC, 0x82D4, 0x8191, 0xB932, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC131, 0xC912, 0xC132, 0xC131, 0xC912, 0xC912, 0xC911, 0xC911, 0xC131, 0xC912, 0xC912, 0xB356, 0x8C36, 0x8191, 0xA151, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC112, 0x9D59, 0x8EBC, 0x96BC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8EBC, 0x82F4, 0x8991, 0xB151, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC131, 0xC932, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC912, 0xC911, 0xC932, 0xC932, 0xC112, 0xC911, 0xC132, 0xC912, 0xC912, 0xC932, 0xB336, 0x96BC, 0xA4F9, 0xC192, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, + 0xC912, 0xC912, 0xC912, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9EDB, 0x9578, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xB417, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA518, 0x9EDB, 0x96DB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x94D8, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC253, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xBAB5, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9599, 0x8191, 0x91B1, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B5, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC972, 0xC1B2, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x8C36, 0x8991, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9598, 0x8191, 0x9191, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC172, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA61A, 0x9EDC, 0xA5DA, 0xC172, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0xC111, 0xC912, 0xC912, 0xC912, + 0xC8F1, 0xC8F1, 0xC8F2, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6DA, 0xA6FA, 0x9D98, 0x8191, 0x9191, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC992, 0xB436, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD99, 0x8A32, 0x8991, 0xC192, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC973, 0xC992, 0xC992, 0xC992, 0xBC36, 0xA69A, 0xA6FA, 0xA6FA, 0xA69A, 0x9395, 0x8991, 0xB992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0xAD98, 0xA6DB, 0xA6DA, 0xA6FA, 0xA6FB, 0xA6FA, 0x9395, 0x8191, 0xB192, 0xC992, 0xC992, 0xC992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC972, 0xC233, 0xAD98, 0xA6FA, 0xA6FB, 0xA639, 0x8A93, 0x9992, 0xC192, 0xC972, 0xC992, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0x9A93, 0x8191, 0xA992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6DA, 0x8B95, 0x8191, 0xB192, 0xC972, 0xC992, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC294, 0xADF9, 0xA6FA, 0xA6DA, 0xA69A, 0x9334, 0x9191, 0xB992, 0xC992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xB497, 0xAEFB, 0xAEFB, 0xB5D9, 0xC952, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, + 0xC0D1, 0xC0D1, 0xC8D2, 0xB71A, 0xB71A, 0xB71A, 0xAEFA, 0xB71A, 0xAF1A, 0xAEFA, 0xA598, 0x8191, 0x9191, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9D3, 0xBC76, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0x9C55, 0x8191, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xC9D3, 0xB5B8, 0xB71A, 0xAF1A, 0xB71A, 0xB6FA, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB6FA, 0xAF1A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xA3B5, 0x8191, 0x9992, 0xC9B2, 0xC9B3, 0xC9D2, 0xC9B2, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xCA13, 0xBDB8, 0xAEFA, 0xAF1A, 0xB71A, 0xB6FA, 0xAEFA, 0xAF19, 0xA4F7, 0x8991, 0xB1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9B3, 0xC9B3, 0xC314, 0xAF1A, 0xAF1A, 0xAEF9, 0xAF1A, 0xAF1A, 0x89F1, 0x8191, 0xC1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B2, 0xC9D3, 0xC9B3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xAEFA, 0xB71A, 0xB6B9, 0x8A93, 0x8991, 0xC1D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B2, 0xA992, 0x8191, 0xA9B2, 0xC9D3, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B2, 0xC9B2, 0xC9B3, 0xB5B8, 0xAF1A, 0xAEFA, 0xAF1A, 0xB71A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xB5B8, 0xB6FA, 0xAF1A, 0xAF1A, 0xB6FA, 0x89F2, 0x8191, 0xC1B2, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xB71A, 0xB6FA, 0xB71A, 0x92F3, 0x89B1, 0xC1B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9D3, 0xC315, 0xB71A, 0xB71A, 0xB71A, 0xBDD9, 0xC132, 0xC0D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, + 0xC0B1, 0xC8B1, 0xC0B1, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA4B5, 0x8191, 0xA1B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0xC496, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF39, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0x99F2, 0x8991, 0xB1D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC577, 0xBF19, 0xBF39, 0xBF39, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9BF5, 0x8191, 0xB1D2, 0xC9F3, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF19, 0xBF19, 0xB6B9, 0x8191, 0x8991, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9D3, 0xC9F3, 0xC9F3, 0xBED8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xAD57, 0x8191, 0x99B2, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x8191, 0xA9B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9C75, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xB6B8, 0x8191, 0x8191, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xADB7, 0x8191, 0x91B1, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC71A, 0xBF1A, 0xC73A, 0xBF3A, 0xC659, 0xC9D3, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, + 0xC0B1, 0xC0B1, 0xC0B1, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8991, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA34, 0xCA13, 0xCA33, 0xCA33, 0xCCB6, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA455, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0x91B1, 0x8191, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA13, 0xC455, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0x8A52, 0x8991, 0xC213, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCD56, 0xC738, 0xC738, 0xC739, 0xB5D7, 0x8191, 0x91B1, 0xCA13, 0xCA13, 0xCA13, 0xD233, 0xCA33, 0xCA33, 0xCA33, 0xCB55, 0xCF38, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0x8191, 0x8191, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xD233, 0xCA13, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCDF7, 0xC738, 0xC738, 0xC738, 0xC739, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xB5D6, 0x8191, 0x99B2, 0xCA33, 0xCA33, 0xD213, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCB74, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0x8AB2, 0x8191, 0xBA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA13, 0xCF39, 0xC739, 0xC759, 0xCF3A, 0xCF39, 0xCED9, 0xC9F3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, + 0xC0B1, 0xC0B1, 0xC0B1, 0xCF57, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA54, 0xCCD6, 0xCF58, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF58, 0xAC75, 0x8191, 0xA9F2, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCE17, 0xCF57, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0x99D2, 0x89B1, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xD6B7, 0xD758, 0xCF58, 0xCF57, 0xCF58, 0xD758, 0xD757, 0xD758, 0xD757, 0xD758, 0xCF58, 0xB535, 0x8191, 0xA1D2, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCA73, 0xCA53, 0xCA53, 0xCC95, 0xD758, 0xD758, 0xCF58, 0xBDD6, 0x8191, 0x99D2, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD254, 0xCA54, 0xD435, 0xD758, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF57, 0xD738, 0xCF58, 0x9AF3, 0x8991, 0xC213, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA54, 0xCA73, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xD253, 0xCA54, 0xD253, 0xCA53, 0xCA54, 0xCE17, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xD617, 0xD758, 0xCF58, 0xCF58, 0xBDD6, 0x8191, 0x91B2, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xD253, 0xD253, 0xCCD6, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF57, 0xD757, 0xCF58, 0xD758, 0x9AF3, 0x8191, 0xBA33, 0xCA54, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xD758, 0xD758, 0xDF59, 0xD779, 0xD759, 0xD759, 0xD6F9, 0xC1F2, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, + 0xC0B1, 0xC0B1, 0xC0B1, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0x99D2, 0x91D2, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xD3D4, 0xDF77, 0xDF77, 0xDF77, 0xDF76, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0x8191, 0x8992, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xCA94, 0xD3D5, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xCA94, 0xCA94, 0xD273, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xD515, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xD294, 0xCA94, 0x8191, 0xAA12, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA93, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xE779, 0xDF19, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, + 0xB8D1, 0xB8D1, 0xC0D1, 0xE776, 0xE796, 0xE797, 0xE797, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2D4, 0xD2B4, 0xD2B4, 0xDD35, 0xE776, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xB474, 0x8191, 0xAA33, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2D4, 0xE656, 0xEF96, 0xE776, 0xE797, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0x99D2, 0x99F2, 0xCAB4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD3F5, 0xE777, 0xE797, 0xEF97, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xE777, 0xEF97, 0x8191, 0x8191, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD3D5, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xCAD4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xDD35, 0xE777, 0xEF76, 0xE796, 0xE797, 0xE797, 0xE776, 0xE796, 0xE776, 0xC534, 0xB494, 0xCC15, 0xD3F5, 0xDBF4, 0xDBF4, 0xDBF5, 0xD3F5, 0xD3F4, 0xCB34, 0x8191, 0xAA32, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xE656, 0xE776, 0xE796, 0xE796, 0xE776, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xDE56, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2D4, 0xCAD4, 0xCAD4, 0xDD15, 0xE796, 0xE796, 0xE776, 0xE796, 0xEF96, 0xE796, 0xE796, 0xE796, 0x9B13, 0x8191, 0xBA73, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xE797, 0xEF97, 0xEF77, 0xEF97, 0xEF78, 0xEF98, 0xEF98, 0xEF98, 0xC992, 0xB8D1, 0xC0D1, 0xC0B1, + 0xB8D1, 0xB8D1, 0xB8D1, 0xF796, 0xF7B6, 0xF796, 0xF795, 0xF795, 0xF796, 0xEFB6, 0xBC93, 0x8191, 0xAA52, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2F4, 0xDD55, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xEFB6, 0xBC93, 0x8191, 0xAA53, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xE675, 0xF796, 0xF795, 0xF796, 0xF796, 0xF796, 0xF7B6, 0xF7B5, 0xF7B5, 0xEF96, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0x99F2, 0x99F2, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2F4, 0xD2F4, 0xDC75, 0xF795, 0xF795, 0xF795, 0xF796, 0xF7B5, 0xF796, 0xF796, 0xF796, 0xF796, 0xEFB6, 0xF7B5, 0xF796, 0x8191, 0x8991, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xDC15, 0xF796, 0xF796, 0xF796, 0xD615, 0x8191, 0x99F2, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xE535, 0xF7B6, 0xF7B5, 0xF796, 0xEFB6, 0xF796, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xF795, 0xF796, 0xF796, 0xF795, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xBC93, 0x8191, 0xAA53, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF796, 0xF7B5, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF7B5, 0xF795, 0xD634, 0x8191, 0x99F2, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2D4, 0xE555, 0xF796, 0xF7B5, 0xF7B6, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xA311, 0x8191, 0xBA94, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xF796, 0xF796, 0xF797, 0xF797, 0xF797, 0xF7B7, 0xF798, 0xF798, 0xD273, 0xB8D1, 0xB8D1, 0xB8D1, + 0xB8D1, 0xB8D1, 0xB8D1, 0xFF94, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD315, 0xD335, 0xD335, 0xD335, 0xD334, 0xD315, 0xD335, 0xE575, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xF675, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB5, 0xFF95, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0x99F2, 0x99F2, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD315, 0xD335, 0xDC54, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0x8191, 0x8191, 0xD334, 0xD315, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xDC34, 0xFFB4, 0xFFB5, 0xFFB5, 0xDE34, 0x8191, 0x99F2, 0xD314, 0xD335, 0xD315, 0xD334, 0xD334, 0xD335, 0xD335, 0xE574, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xC4B3, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xEDF5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0xF694, 0xFFB5, 0xFFB5, 0xFFB5, 0xDE14, 0x8191, 0x99F2, 0xD335, 0xD335, 0xD314, 0xD334, 0xD314, 0xD334, 0xD315, 0xE555, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xA332, 0x8191, 0xBAB4, 0xD335, 0xD335, 0xD335, 0xD315, 0xD334, 0xD335, 0xD335, 0xFFB5, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB7, 0xFFB8, 0xDBD4, 0xB8D2, 0xB8D1, 0xB8D1, + 0xB8D1, 0xB8D1, 0xB8D1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xC3F0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xF590, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x9A12, 0x91F2, 0xD355, 0xD354, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDBD4, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0x8191, 0x8191, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDC13, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x99F2, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xC3CF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xE4D1, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xC3D0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xF590, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x9A12, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD2, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE2F, 0xA2B0, 0x8191, 0xC2F4, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xFE2F, 0xFE50, 0xFE50, 0xFE50, 0xFE51, 0xFE51, 0xFE52, 0xFE52, 0xE3D2, 0xB8D2, 0xB8D1, 0xB8D1, + 0xB8D1, 0xB0D1, 0xB0D2, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xC30F, 0x81B1, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD396, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0x9A12, 0x8191, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xDBD3, 0xFC8D, 0xFC6D, 0xFC6D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC8D, 0xFC6D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD375, 0xD395, 0xD376, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFC8E, 0xFC8F, 0xFC8F, 0xFC8F, 0xFCB0, 0xFCB0, 0xFCB1, 0xFCB1, 0xF3B2, 0xB8D1, 0xB0F1, 0xB8D1, + 0xB0F1, 0xB0F1, 0xB0D1, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9A12, 0x8191, 0xC334, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFC8E, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFC8D, 0xFC8D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB2F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB6F, 0x8191, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFC8E, 0xFC8F, 0xFCAF, 0xFCAF, 0xFCB0, 0xFCB0, 0xFCB0, 0xFCB2, 0xF451, 0xB0D1, 0xB0D1, 0xB0D1, + 0xB0F1, 0xB0F1, 0xB0D1, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xCB4E, 0x8191, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xBB11, 0x8191, 0xAA73, 0xD396, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFCAE, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFCAD, 0xFCCD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD3, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCAD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA94, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xFCAD, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFCCE, 0xFCCF, 0xFCCF, 0xFCEF, 0xFCD0, 0xFCF0, 0xFCF1, 0xFCF1, 0xFCF2, 0xB0F1, 0xB0F1, 0xB0F2, + 0xB0F1, 0xA8F1, 0xB0F1, 0xFD0D, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFD0D, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC6F, 0x91D1, 0x89D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xDBB4, 0xEC70, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFCED, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBF3, 0xFCED, 0xFCED, 0xFCED, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xEC6E, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xF4AF, 0xFD0D, 0xFCED, 0xFD0D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD0E, 0xFD0F, 0xFD0F, 0xFD0F, 0xFD10, 0xFD10, 0xFD31, 0xFD31, 0xFD32, 0xB0F1, 0xB0F1, 0xB0F1, + 0xB0F1, 0xA8F1, 0xB0F1, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xE44E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xC34F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xE431, 0xEC71, 0xEC71, 0xDBF0, 0xE450, 0xF4CF, 0xFD0E, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xF4AF, 0xF4CF, 0xF4AF, 0xDC10, 0x9A12, 0xAA73, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2C, 0xFD2C, 0x9211, 0x8191, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFCEE, 0xFD2D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC10, 0xE44E, 0xDC2E, 0xE44E, 0xB2F0, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD2E, 0xFD2F, 0xFD2F, 0xFD4F, 0xFD50, 0xFD50, 0xFD51, 0xFD51, 0xFD71, 0xA8F1, 0xB0F1, 0xB0F2, + 0xA8F1, 0xA8F1, 0xA8F2, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xE46E, 0x8191, 0x9212, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD2D, 0x9211, 0x89B2, 0xCB75, 0xD396, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xBB2F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD6E, 0xFD6F, 0xFD6F, 0xFD8F, 0xFD90, 0xFD90, 0xFD91, 0xFD91, 0xFD92, 0xA8F1, 0xA8F1, 0xA8F1, + 0xA8F1, 0xA8F1, 0xA8F1, 0xEC6F, 0xFD8D, 0xFDAD, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xE48E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFDAD, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFD8D, 0xE4AE, 0x8991, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xE491, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFDAD, 0xF52D, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFD8D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFDAF, 0xFDAF, 0xFDAD, 0xFDAD, 0xFDAD, 0xFD8D, 0xFDAD, 0xFD8D, 0xEC6F, 0xA8F1, 0xA8F1, 0xA8F1, + 0xA911, 0xA911, 0xA911, 0xEC8E, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xE4CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDED, 0xFDCD, 0xD44F, 0x8191, 0xB2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0x8991, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xBB6F, 0x8191, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDED, 0xFDED, 0xFDED, 0xFDED, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFDEE, 0xFDEF, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xFDED, 0xEC8E, 0xA911, 0xA911, 0xA911, + 0xA911, 0xA911, 0xA111, 0xE42E, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xE4EE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xD44F, 0x8191, 0xBAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xECD1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xF5AD, 0x9A70, 0x89B1, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0E, 0xFE0D, 0xFE0E, 0xFE0E, 0xFE0E, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE0F, 0xFE0F, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xE42E, 0xA111, 0xA911, 0xA911, + 0x80F0, 0xA111, 0xA111, 0xC2B0, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x89D1, 0xA253, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xF60E, 0x9A70, 0x91F2, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF2, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE4E, 0xFE4F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC2B0, 0xA111, 0xA111, 0x80F0, + 0x60EF, 0xA111, 0xA111, 0xA112, 0xFE2D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xE54E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xF5CF, 0xFE6D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE6D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5CE, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6C, 0xFE8D, 0xF62D, 0xC40F, 0x9A12, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE8D, 0xFE6D, 0xFE2D, 0xBBCF, 0x89B1, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE8F, 0xFE8F, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE2D, 0xA112, 0xA111, 0xA111, 0x60EF, + 0x28CD, 0xA111, 0xA111, 0xA111, 0xCBCF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xF5ED, 0x89D1, 0x91D2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xED11, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xC42F, 0x81B1, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFECC, 0xFEAD, 0xC42F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF64D, 0xD4CE, 0xBBD0, 0xC3B2, 0xC314, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xED31, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xEE0D, 0xCC6F, 0xBB51, 0xBAD4, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xC334, 0x8191, 0xB294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFEAE, 0xFECE, 0xFEAD, 0xFEAE, 0xFEAD, 0xFECE, 0xFEAE, 0xFEAE, 0xA2F0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC34, 0xFEAF, 0xFED0, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xCBCF, 0xA111, 0xA111, 0xA111, 0x28CD, + 0x18AD, 0x8110, 0x9911, 0xA111, 0xA171, 0xF5ED, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE6D, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5CF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE4E, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EE, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE8D, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xF64D, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE6E, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF60E, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF64E, 0xFEAC, 0xFEAD, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE6D, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5CF, 0xFEAD, 0xF62E, 0xF5EF, 0xF5D0, 0xF5EF, 0xF5CF, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xFE4F, 0xFECE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAF, 0xF610, 0xF5D0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF610, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xF5ED, 0xA171, 0xA111, 0x9911, 0x8110, 0x18AD, + 0x20AC, 0x38CE, 0x9931, 0x9931, 0x9931, 0xAA31, 0xFE2D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFEAC, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFEAC, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8E, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAF, 0xFEAE, 0xFEAE, 0xFEAF, 0xFE8E, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFE8F, 0xFEB0, 0xFEAF, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE2D, 0xAA31, 0x9931, 0x9931, 0x9931, 0x38CE, 0x20AC, + 0x20AD, 0x20AC, 0x60EF, 0x9912, 0x9931, 0x9931, 0xB270, 0xF62D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE6D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFEB0, 0xFE8C, 0xFE8C, 0xF62D, 0xB270, 0x9931, 0x9931, 0x9912, 0x60EF, 0x20AC, 0x20AD, + 0x18AC, 0x20AC, 0x28AD, 0x8110, 0x9931, 0x9931, 0x9911, 0xAA31, 0xF5CD, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE6E, 0xFE8D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE90, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFE8C, 0xF5CD, 0xAA31, 0x9911, 0x9931, 0x9931, 0x8110, 0x28AD, 0x20AC, 0x18AC, + 0x20AC, 0x20AC, 0x18AC, 0x28AD, 0x9111, 0x9931, 0x9931, 0x9931, 0xA171, 0xCBCF, 0xF60D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE70, 0xFE70, 0xFE6F, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE90, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xE471, 0xCBCF, 0xA171, 0x9931, 0x9931, 0x9931, 0x9111, 0x28AD, 0x18AC, 0x20AC, 0x20AC, + 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x28CD, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xBAB0, 0xDC6F, 0xE50F, 0xE50E, 0xFE4E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6F, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xF612, 0xE531, 0xE512, 0xD472, 0xB271, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x8111, 0x28CD, 0x20AC, 0x18AC, 0x18AC, 0x18AC, + 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x28CC, 0x610F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9911, 0x610F, 0x28CC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, + 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x40CE, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7910, 0x40CE, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, + 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x30CC, 0x58CF, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9932, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x7910, 0x58CF, 0x30CC, 0x18AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp b/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp index 452f472469..0899407153 100644 --- a/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp +++ b/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp @@ -25,261 +25,261 @@ #if HAS_GRAPHICAL_TFT extern const uint8_t marlin_logo_228x255x2[14535] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x90, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x02, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x2f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x01, 0xff, 0xff, 0xf9, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0xff, 0xff, 0x80, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xf8, 0x00, 0x6f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xaa, 0x50, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x07, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xf9, 0xbd, 0x00, 0xbf, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xbf, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x46, 0xff, 0xff, 0xd0, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x2f, 0xff, 0xf8, 0x06, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0x1f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xc2, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf0, 0x2f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xfc, 0x07, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x55, 0x55, 0x56, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x40, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0xff, 0xff, 0xfd, 0xbf, 0xc0, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6f, 0xff, 0xff, 0xdf, 0xe0, 0x0b, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xf7, 0xf8, 0x02, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfd, 0xfd, 0x00, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x7f, 0x00, 0x1f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdf, 0x80, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf7, 0xd0, 0x01, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0xf0, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xed, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xbf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x87, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf9, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0x40, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x2f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0b, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0xaa, 0xa9, 0x55, 0x55, 0x40, 0x55, 0x56, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xd0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5a, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x90, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0xbf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x07, 0xff, 0xfd, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x01, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xe0, 0x2f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xfe, 0x0b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0xbf, 0xff, 0xd0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xd0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x2f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x02, 0xf8, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x80, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x40, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xd0, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x40, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x05, 0xab, 0xff, 0xe4, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfd, 0x6b, 0xff, 0xff, 0xe4, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x02, 0xff, 0xff, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe0, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xbf, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xbf, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xd0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfd, 0x00, 0x06, 0xff, 0xff, 0xaa, 0xa5, 0x40, 0x00, 0x05, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfc, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xd0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xd0, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfd, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6a, 0x81, 0x6a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xd1, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x69, 0x55, 0x00, 0x00, 0x02, 0xff, 0x80, 0x03, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xd0, 0xbf, 0xf8, 0x00, 0x00, 0x16, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, 0x01, 0xff, 0xc0, 0x02, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0b, 0xff, 0xc0, 0x3f, 0xfc, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xff, 0xd0, 0x02, 0xf4, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xfe, 0x40, 0x0f, 0xff, 0x80, 0x3f, 0xfd, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xf4, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xbe, 0x90, 0x00, 0x2f, 0xff, 0x80, 0x7f, 0xfd, 0x0a, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0xf8, 0x00, 0x00, 0x0b, 0xff, 0xf4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x78, 0x00, 0x00, 0x0b, 0xff, 0xf4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3c, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfd, 0x02, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x3c, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xfc, 0x00, 0x2c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x6f, 0xff, 0xfc, 0x07, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfd, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, - 0x00, 0x00, 0x05, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xfe, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, - 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x08, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, - 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, - 0x00, 0x7f, 0xfe, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x6a, 0xaa, 0xaa, 0xab, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x55, 0x55, 0x5a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, - 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, - 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf0, 0x00, - 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, - 0x2f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, - 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, - 0xbf, 0x00, 0x00, 0x00, 0x00, 0x06, 0xaa, 0x90, 0x00, 0x00, 0x01, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, - 0xfe, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xfe, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, - 0xfc, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, - 0xfc, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x0b, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x05, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, - 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xc0, 0x00, 0x01, 0xff, 0xe4, 0x00, - 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xed, 0x00, - 0xfc, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xdf, 0x00, - 0xfc, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xea, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xdf, 0x80, - 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x01, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xc0, - 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xd0, 0x00, 0x07, 0xff, 0xff, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xd0, - 0xfc, 0x00, 0x00, 0xbf, 0xff, 0x40, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xf0, - 0xfc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x2f, 0xff, 0xc0, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x06, 0xaa, 0xa0, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xbf, 0xf0, - 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xf8, 0x02, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xbf, 0x54, - 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x7f, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x3f, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x3e, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xf8, 0x00, 0x7f, 0xe0, 0x00, 0x01, 0xfe, 0x3e, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xf8, 0x00, 0x2f, 0xf0, 0x00, 0x01, 0xfe, 0x7d, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x3f, 0xff, 0xfe, 0x40, 0x7f, 0xff, 0xfd, 0x00, 0x00, 0xbf, 0xff, 0xf4, 0x07, 0xff, 0xff, 0x82, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xfe, 0x01, 0xbf, 0xff, 0xf0, 0x03, 0xff, 0xf8, 0x00, 0x2f, 0xf0, 0x00, 0x01, 0xfd, 0x7d, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x7f, 0xff, 0xf4, 0x00, 0x0b, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0xbf, 0xff, 0xc2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xf4, 0x00, 0xbf, 0xf8, 0x00, 0x2f, 0xf4, 0x00, 0x01, 0xfc, 0x7c, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xbf, 0xff, 0xc0, 0x00, 0x02, 0xff, 0xff, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xc2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x0b, 0xff, 0xf8, 0x00, 0x3f, 0xf8, 0x00, 0x1f, 0xf8, 0x00, 0x01, 0xfc, 0x3c, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbf, 0xff, 0x40, 0x01, 0xff, 0xfd, 0x00, 0x00, 0x1f, 0xff, 0xd2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x0f, 0xf8, 0x00, 0x07, 0xfc, 0x00, 0x02, 0xfc, 0x3e, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe1, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xd2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xf8, 0x00, 0x02, 0xfc, 0x00, 0x02, 0xf8, 0x1f, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0xfe, 0x00, 0x02, 0xf4, 0x0b, 0x80, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x7f, 0x00, 0x03, 0xf4, 0x03, 0xc0, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0xe0, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x0b, 0xc0, 0x03, 0xf0, 0x00, 0x34, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x02, 0xe0, 0x03, 0xe0, 0x00, 0x0c, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x74, 0x07, 0xd0, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x08, 0x07, 0xc0, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xff, 0xff, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc0, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xbf, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfd, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x80, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x7f, 0xff, 0xfd, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x40, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x40, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xfa, 0xa8, 0x1f, 0xff, 0xea, 0xab, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x0b, 0xff, 0xf5, 0x55, 0xbf, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x02, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0xfd, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x01, 0xbf, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xf0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfe, 0x00, 0x00, 0x6a, 0xa9, 0x00, 0x00, 0x00, 0x2a, 0xaa, 0x40, 0x00, 0x00, 0x0a, 0xaa, 0x90, 0x00, 0x00, 0x06, 0xaa, 0xa8, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0x46, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x02, 0xaa, 0xa0, 0x00, 0x0b, 0xf2, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xbf, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xd3, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc7, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x47, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0b, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x07, 0xd0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xbf, 0xfa, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x56, 0xff, 0xe0, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x1f, 0x40, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab, 0xff, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0xa5, 0x55, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfa, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xd0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xea, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfd, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x03, 0xff, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x02, 0xff, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x01, 0xff, 0xd0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xbf, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xbf, 0xf8, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x3f, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf4, 0x0f, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x0f, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x0b, 0xff, 0xd0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x0b, 0xff, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcb, 0xff, 0xf0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xd7, 0xff, 0xf0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xf7, 0xff, 0xf4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xd0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFE, 0x90, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x2F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x01, 0xFF, 0xFF, 0xF9, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0x80, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xF8, 0x00, 0x6F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xAA, 0x50, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x1F, 0xFF, 0xFF, 0xF9, 0xBD, 0x00, 0xBF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0xBF, 0xFF, 0xFF, 0x00, 0x0B, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x46, 0xFF, 0xFF, 0xD0, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x2F, 0xFF, 0xF8, 0x06, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0xFF, 0xFC, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x2F, 0xFF, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xFF, 0xC2, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xF0, 0x2F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFC, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x55, 0x55, 0x56, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0xFF, 0x40, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xBF, 0xFF, 0xFF, 0xFD, 0xBF, 0xC0, 0x2F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6F, 0xFF, 0xFF, 0xDF, 0xE0, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xF7, 0xF8, 0x02, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFD, 0xFD, 0x00, 0xBF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0x7F, 0x00, 0x1F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xDF, 0x80, 0x07, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF7, 0xD0, 0x01, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFD, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7C, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xED, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xBF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x87, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xF9, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0x40, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x2F, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xBF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0B, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0xAA, 0xA9, 0x55, 0x55, 0x40, 0x55, 0x56, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xD0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xF0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5A, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x90, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xF4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x7F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0B, 0xFF, 0xFC, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0xBF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x07, 0xFF, 0xFD, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xBF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xBF, 0xFF, 0xFF, 0xE0, 0x2F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xBF, 0xFF, 0xFE, 0x0B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xBF, 0xFF, 0xD0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x2F, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x02, 0xF8, 0x00, 0x00, 0x2F, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x40, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0B, 0xFF, 0xFC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xD0, 0x00, 0x00, 0x00, 0x2F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xD0, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x02, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFD, 0x00, 0x05, 0xAB, 0xFF, 0xE4, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x40, 0x00, 0x02, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFD, 0x6B, 0xFF, 0xFF, 0xE4, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x02, 0xFF, 0xFF, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x00, 0x2F, 0xC0, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x2F, 0xC0, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xBF, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xD0, 0x00, 0x00, 0xBF, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x0B, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0xD0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFD, 0x00, 0x06, 0xFF, 0xFF, 0xAA, 0xA5, 0x40, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFC, 0x00, 0x0B, 0xE0, 0x00, 0x00, 0x3F, 0xFF, 0xD0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xD0, 0x00, 0x2B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x0B, 0xE0, 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFD, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x6A, 0x81, 0x6A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x2F, 0xFF, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xFF, 0xD1, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x69, 0x55, 0x00, 0x00, 0x02, 0xFF, 0x80, 0x03, 0xF0, 0x00, 0x00, 0x2F, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xD0, 0xBF, 0xF8, 0x00, 0x00, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xA4, 0x01, 0xFF, 0xC0, 0x02, 0xF0, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x0B, 0xFF, 0xC0, 0x3F, 0xFC, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0xFF, 0xD0, 0x02, 0xF4, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFE, 0x40, 0x0F, 0xFF, 0x80, 0x3F, 0xFD, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x01, 0xF4, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBE, 0x90, 0x00, 0x2F, 0xFF, 0x80, 0x7F, 0xFD, 0x0A, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0xBF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x16, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0xF8, 0x00, 0x00, 0x0B, 0xFF, 0xF4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x78, 0x00, 0x00, 0x0B, 0xFF, 0xF4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3C, 0x00, 0x00, 0x07, 0xFF, 0xF4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFD, 0x02, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFC, 0x00, 0x3C, 0x00, 0x00, 0x07, 0xFF, 0xF4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFC, 0x02, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFC, 0x00, 0x2C, 0x00, 0x00, 0x03, 0xFF, 0xF4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x6F, 0xFF, 0xFC, 0x07, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFD, 0x00, 0x1C, 0x00, 0x00, 0x03, 0xFF, 0xF4, 0x00, + 0x00, 0x00, 0x05, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBF, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x03, 0xFF, 0xF4, 0x00, + 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x03, 0xFF, 0xF4, 0x00, + 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x02, 0xFF, 0xF4, 0x00, + 0x00, 0x7F, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA, 0xA5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x6A, 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFA, 0x55, 0x55, 0x55, 0x55, 0x5A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF4, 0x00, + 0x01, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF4, 0x00, + 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF0, 0x00, + 0x0F, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, + 0x2F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, + 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, + 0xBF, 0x00, 0x00, 0x00, 0x00, 0x06, 0xAA, 0x90, 0x00, 0x00, 0x01, 0xAA, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, + 0xFE, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xFE, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x02, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, + 0xFC, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, + 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x05, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, + 0xFC, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xBF, 0xC0, 0x00, 0x01, 0xFF, 0xE4, 0x00, + 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xED, 0x00, + 0xFC, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xBF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xDF, 0x00, + 0xFC, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xEA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xBF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xDF, 0x80, + 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x2F, 0xFF, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x01, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xEF, 0xC0, + 0xFC, 0x00, 0x00, 0x7F, 0xFF, 0xD0, 0x00, 0x07, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xEF, 0xD0, + 0xFC, 0x00, 0x00, 0xBF, 0xFF, 0x40, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xEF, 0xF0, + 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x2F, 0xFF, 0xC0, 0x00, 0x00, 0x6F, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x06, 0xAA, 0xA0, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xF9, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xBF, 0xF0, + 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xD0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFE, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xD0, 0x7F, 0xFF, 0xFF, 0xF8, 0x02, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xBF, 0x54, + 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xD0, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xF4, 0x1F, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xD0, 0x00, 0x01, 0xFF, 0x7F, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xD0, 0x00, 0x01, 0xFF, 0x3F, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xD0, 0x00, 0x01, 0xFF, 0x3E, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xFE, 0x3E, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x00, 0x2F, 0xF0, 0x00, 0x01, 0xFE, 0x7D, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x40, 0x7F, 0xFF, 0xFD, 0x00, 0x00, 0xBF, 0xFF, 0xF4, 0x07, 0xFF, 0xFF, 0x82, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xFE, 0x01, 0xBF, 0xFF, 0xF0, 0x03, 0xFF, 0xF8, 0x00, 0x2F, 0xF0, 0x00, 0x01, 0xFD, 0x7D, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x7F, 0xFF, 0xF4, 0x00, 0x0B, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0xBF, 0xFF, 0xC2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x2F, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xF4, 0x00, 0xBF, 0xF8, 0x00, 0x2F, 0xF4, 0x00, 0x01, 0xFC, 0x7C, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0xBF, 0xFF, 0xC0, 0x00, 0x02, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xC2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x0B, 0xFF, 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0xFC, 0x3C, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0xBF, 0xFF, 0x40, 0x01, 0xFF, 0xFD, 0x00, 0x00, 0x1F, 0xFF, 0xD2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x02, 0xFC, 0x3E, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE1, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xD2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x40, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x02, 0xFC, 0x00, 0x02, 0xF8, 0x1F, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x40, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x02, 0xF4, 0x0B, 0x80, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x03, 0xF4, 0x03, 0xC0, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xE0, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0B, 0xC0, 0x03, 0xF0, 0x00, 0x34, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x02, 0xE0, 0x03, 0xE0, 0x00, 0x0C, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x74, 0x07, 0xD0, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x08, 0x07, 0xC0, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xC0, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0xBF, 0xFF, 0xE0, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFD, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x80, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x7F, 0xFF, 0xFD, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x40, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x40, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xFA, 0xA8, 0x1F, 0xFF, 0xEA, 0xAB, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE9, 0x0B, 0xFF, 0xF5, 0x55, 0xBF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x02, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xFD, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x01, 0xBF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x6A, 0xA9, 0x00, 0x00, 0x00, 0x2A, 0xAA, 0x40, 0x00, 0x00, 0x0A, 0xAA, 0x90, 0x00, 0x00, 0x06, 0xAA, 0xA8, 0x0A, 0xAA, 0xAA, 0xAA, 0xAA, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6A, 0x46, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x02, 0xAA, 0xA0, 0x00, 0x0B, 0xF2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xD3, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC7, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0B, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x07, 0xD0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x02, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF8, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0xBF, 0xFA, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x56, 0xFF, 0xE0, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x0B, 0x80, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAB, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xA5, 0x55, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFA, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xD0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEA, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFD, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x02, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x01, 0xFF, 0xD0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xBF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xBF, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xF0, 0x00, 0x7F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFE, 0x00, 0x3F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x40, 0x2F, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF4, 0x0F, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x0B, 0xFF, 0xD0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0x0B, 0xFF, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xCB, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xD7, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xF7, 0xFF, 0xF4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xD0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00 }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp b/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp index c84653f8a5..3ed61a1b20 100644 --- a/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp +++ b/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp @@ -25,261 +25,261 @@ #if HAS_GRAPHICAL_TFT extern const uint8_t marlin_logo_228x255x4[29070] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xd8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xdf, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x84, 0x32, 0x10, 0x00, 0x46, 0x89, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x28, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x10, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x38, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x22, 0x11, 0x11, 0x12, 0x35, 0x57, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x4b, 0xef, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xef, 0xff, 0xff, 0xff, 0xed, 0xba, 0x98, 0x64, 0x00, 0x05, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xc5, 0x00, 0x01, 0x6c, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x30, 0x37, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x9f, 0xe7, 0x10, 0x01, 0x8d, 0xff, 0xfd, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x23, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x10, 0x01, 0x8e, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x60, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x0e, 0xff, 0xff, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x39, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x7b, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x88, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x19, 0xff, 0xff, 0xfe, 0x37, 0xdf, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x3c, 0xff, 0xff, 0xe3, 0x08, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x7f, 0xff, 0xfe, 0x30, 0x3a, 0xff, 0xf8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xdf, 0xff, 0xe3, 0x00, 0x7f, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x76, 0x54, 0x44, 0x44, 0x55, 0x66, 0x68, 0x89, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2a, 0xff, 0xff, 0x50, 0x03, 0xdf, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x58, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xe0, 0x00, 0x1b, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0xff, 0xf9, 0x00, 0x00, 0x8f, 0xff, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x6e, 0xff, 0x80, 0x00, 0x08, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xf6, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0x5c, 0xff, 0x20, 0x00, 0x04, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xff, 0xf4, 0xdf, 0xb0, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xfe, 0x4f, 0xf7, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xeb, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xe6, 0xff, 0x30, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xfd, 0x6f, 0xd0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xca, 0xf5, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9a, 0xce, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2f, 0x80, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0x89, 0x91, 0x7f, 0xe7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf2, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xef, 0xfe, 0xb7, 0x18, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8e, 0xff, 0xea, 0x51, 0x01, 0x8b, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x40, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8e, 0xff, 0xe8, 0x20, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xcf, 0xff, 0xfa, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xdf, 0xff, 0xfd, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8c, 0xff, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x47, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xa0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x68, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x8b, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0xdb, 0xaa, 0x98, 0x88, 0x87, 0x66, 0x55, 0x54, 0x44, 0x43, 0x33, 0x44, 0x55, 0x67, 0x78, 0x89, 0xbc, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xd8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x89, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x56, 0x88, 0x9b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x35, 0x68, 0x8b, 0xbd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x56, 0x78, 0x9b, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x68, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x08, 0xff, 0xff, 0xf9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x8f, 0xfe, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x38, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xb1, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xfd, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8f, 0xff, 0xf7, 0x00, 0x00, 0x13, 0x57, 0x8a, 0xbc, 0xde, 0xff, 0xeb, 0x50, 0x6d, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xc4, 0x58, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xca, 0x63, 0x00, 0x00, 0x00, 0x8f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x08, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xff, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0xdf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x90, 0x00, 0x00, 0x00, 0xbf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x01, 0x7b, 0xce, 0xee, 0xee, 0xdd, 0xba, 0x98, 0x88, 0x65, 0x43, 0x32, 0x21, 0x12, 0x33, 0x57, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x8f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xe7, 0x10, 0x00, 0x00, 0x2a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x8f, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xe7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x8b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x78, 0x88, 0x82, 0x04, 0x78, 0x98, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0x20, 0x00, 0x00, 0x4f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xfb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x09, 0xff, 0xff, 0xf7, 0x07, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x35, 0x77, 0x78, 0x87, 0x65, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0d, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xfe, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x4f, 0xff, 0xff, 0xf5, 0x00, 0x8f, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x78, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x98, 0x52, 0x00, 0x06, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x08, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xef, 0xff, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x71, 0x00, 0xaf, 0xff, 0xff, 0xe1, 0x00, 0x2f, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x37, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x65, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x08, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xf9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, 0x00, 0x02, 0xef, 0xff, 0xff, 0xb0, 0x00, 0x3f, 0xff, 0xff, 0xf5, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x05, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x89, 0xbc, 0xca, 0x84, 0x10, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xf4, 0x01, 0x89, 0xab, 0xbc, 0xde, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0x40, 0x00, 0x9f, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x35, 0x68, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0xdf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0xdf, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x6f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfa, 0x00, 0x03, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x58, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x1f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xf6, 0x00, 0x08, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x0b, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x08, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x23, 0x55, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x5f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xdd, 0xdd, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xdd, 0xcc, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfb, 0xa9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa8, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x06, 0xef, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x6e, 0xff, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, - 0x03, 0xef, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x0b, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x5f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0xaf, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x9b, 0xba, 0x85, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x89, 0xba, 0xa9, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x48, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xae, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, - 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, - 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x01, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x01, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, - 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x02, 0x8d, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf9, 0x50, 0x00, 0x00, - 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x04, 0xce, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf8, 0xd6, 0x00, 0x00, - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x8e, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf7, 0xfe, 0x20, 0x00, - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf7, 0xff, 0x80, 0x00, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x31, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x35, 0x55, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf8, 0xff, 0xe0, 0x00, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x05, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfa, 0xff, 0xf6, 0x00, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x35, 0x44, 0x20, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x9f, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xda, 0xff, 0xfd, 0x00, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xfd, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0xef, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xc8, 0x20, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x68, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4a, 0xef, 0xff, 0xff, 0xff, 0xa6, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x5f, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xad, 0xff, 0xff, 0x20, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x09, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0x8d, 0xff, 0x47, 0x60, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x5f, 0xfe, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x01, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x3f, 0xfc, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0xef, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xfe, 0x3f, 0xf9, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x5f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xfb, 0x3f, 0xf8, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x0a, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf8, 0x4f, 0xf5, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x43, 0x23, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x73, 0x32, 0x7d, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x33, 0x35, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x08, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf5, 0x4f, 0xf4, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0xbf, 0xff, 0xff, 0x90, 0x00, 0x00, 0x09, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf2, 0x4f, 0xf2, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xf2, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x0c, 0xff, 0xff, 0x90, 0x00, 0x00, 0x07, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x1f, 0xf3, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf4, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x01, 0xdf, 0xff, 0x90, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x08, 0xff, 0xc0, 0x0d, 0xf8, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf7, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x90, 0x04, 0xfe, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x08, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xf9, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x60, 0x00, 0x9f, 0x80, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x09, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfe, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x50, 0x00, 0x0c, 0xe2, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0a, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0x10, 0x00, 0x01, 0xda, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf2, 0x00, 0x00, 0x2f, 0xfc, 0x00, 0x00, 0x00, 0x3e, 0x50, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfb, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xd2, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x08, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x50, 0x00, 0x5f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x11, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x06, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x7f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xd0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xba, 0xa9, 0x80, 0x06, 0xff, 0xff, 0xff, 0xf9, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xf9, 0x84, 0x10, 0x9f, 0xff, 0xff, 0xfe, 0x66, 0x66, 0x66, 0xaf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xf0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xf1, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xf1, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x30, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x69, 0xaa, 0xaa, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xaa, 0xaa, 0xaa, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x89, 0x9a, 0xaa, 0x90, 0x03, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x78, 0xaa, 0x60, 0x6a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xaa, 0xaa, 0xa8, 0x30, 0x00, 0x00, 0x00, 0xbf, 0xfc, 0x08, 0xef, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf6, 0x3f, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1f, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xd1, 0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x07, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0x60, 0x6f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xbf, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xf8, 0x00, 0x6f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0x90, 0x00, 0x6f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9f, 0xff, 0xfd, 0x88, 0x64, 0x44, 0x33, 0x22, 0x22, 0x21, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, 0x12, 0x22, 0x22, 0x33, 0x45, 0x56, 0x79, 0xef, 0xff, 0xf8, 0x10, 0x00, 0x6f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x00, 0x00, 0x7f, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x8f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x38, 0xbd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, 0x00, 0x00, 0x00, 0x04, 0xef, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x78, 0x88, 0x89, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xec, 0xca, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x9a, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb9, 0x86, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x56, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xff, 0xff, 0xff, 0xff, 0xca, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xfb, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8c, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xd8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xb4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xfe, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xe9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xea, 0x98, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0x90, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xe0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf2, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xf8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x08, 0xff, 0xff, 0xfe, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x05, 0xff, 0xff, 0xff, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x03, 0xff, 0xff, 0xff, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x60, 0x01, 0xff, 0xff, 0xff, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0xdf, 0xff, 0xff, 0xf2, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xfa, 0x00, 0xbf, 0xff, 0xff, 0xf7, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8f, 0xff, 0xff, 0xfa, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xfe, 0x6f, 0xff, 0xff, 0xff, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xfb, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf6, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xf5, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf2, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xfe, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfe, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfa, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xf4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8C, 0xEF, 0xFF, 0xFF, 0xFF, 0xD8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDF, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x84, 0x32, 0x10, 0x00, 0x46, 0x89, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x28, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x10, 0x00, 0x00, 0x18, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x00, 0x04, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x10, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x00, 0x00, 0x38, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x22, 0x11, 0x11, 0x12, 0x35, 0x57, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x00, 0x00, 0x4B, 0xEF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, 0xBA, 0x98, 0x64, 0x00, 0x05, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDF, 0xFF, 0xFF, 0xC5, 0x00, 0x01, 0x6C, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x97, 0x30, 0x37, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x9F, 0xE7, 0x10, 0x01, 0x8D, 0xFF, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x23, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x10, 0x01, 0x8E, 0xFF, 0xFF, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x60, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x0E, 0xFF, 0xFF, 0xF8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x7B, 0xFE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x07, 0xFF, 0xFF, 0xFF, 0xF3, 0x88, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x19, 0xFF, 0xFF, 0xFE, 0x37, 0xDF, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3C, 0xFF, 0xFF, 0xE3, 0x08, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7F, 0xFF, 0xFE, 0x30, 0x3A, 0xFF, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xDF, 0xFF, 0xE3, 0x00, 0x7F, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x76, 0x54, 0x44, 0x44, 0x55, 0x66, 0x68, 0x89, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x2A, 0xFF, 0xFF, 0x50, 0x03, 0xDF, 0xFF, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x58, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x8F, 0xFF, 0xE0, 0x00, 0x1B, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFF, 0xF9, 0x00, 0x00, 0x8F, 0xFF, 0xFC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9F, 0xFF, 0xFF, 0xFF, 0xFE, 0x6E, 0xFF, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xF7, 0xCF, 0xF6, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xFF, 0xFF, 0xFF, 0x5C, 0xFF, 0x20, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0xFF, 0xF4, 0xDF, 0xB0, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0xFE, 0x4F, 0xF7, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xEB, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFF, 0xE6, 0xFF, 0x30, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xC8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFD, 0x6F, 0xD0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xCA, 0xF5, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9A, 0xCE, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xEF, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2F, 0x80, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0x89, 0x91, 0x7F, 0xE7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF2, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6B, 0xEF, 0xFE, 0xB7, 0x18, 0xFB, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCA, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8E, 0xFF, 0xEA, 0x51, 0x01, 0x8B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x40, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8E, 0xFF, 0xE8, 0x20, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xCF, 0xFF, 0xFA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xDF, 0xFF, 0xFD, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8C, 0xFF, 0xFF, 0xFF, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x50, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x47, 0x9C, 0xEF, 0xFF, 0xFF, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x68, 0x9C, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x8B, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFE, 0xDB, 0xAA, 0x98, 0x88, 0x87, 0x66, 0x55, 0x54, 0x44, 0x43, 0x33, 0x44, 0x55, 0x67, 0x78, 0x89, 0xBC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x89, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x56, 0x88, 0x9B, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x35, 0x68, 0x8B, 0xBD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x56, 0x78, 0x9B, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x68, 0x9B, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x20, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x20, 0x08, 0xFF, 0xFF, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x8F, 0xFE, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8E, 0xB1, 0x00, 0x00, 0x07, 0xEF, 0xFF, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8E, 0xF8, 0x10, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xFF, 0xFF, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xDF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8F, 0xFF, 0xF7, 0x00, 0x00, 0x13, 0x57, 0x8A, 0xBC, 0xDE, 0xFF, 0xEB, 0x50, 0x6D, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xC4, 0x58, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xCA, 0x63, 0x00, 0x00, 0x00, 0x8F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAF, 0xFF, 0xFF, 0xFF, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xDF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0xBF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xD7, 0x10, 0x00, 0x01, 0x7B, 0xCE, 0xEE, 0xEE, 0xDD, 0xBA, 0x98, 0x88, 0x65, 0x43, 0x32, 0x21, 0x12, 0x33, 0x57, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x8F, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xE7, 0x10, 0x00, 0x00, 0x2A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x8F, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xE7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x8B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x78, 0x88, 0x82, 0x04, 0x78, 0x98, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x4F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x09, 0xFF, 0xFF, 0xF7, 0x07, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x35, 0x77, 0x78, 0x87, 0x65, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x0D, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFE, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x30, 0x4F, 0xFF, 0xFF, 0xF5, 0x00, 0x8F, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x78, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x98, 0x52, 0x00, 0x06, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x08, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x71, 0x00, 0xAF, 0xFF, 0xFF, 0xE1, 0x00, 0x2F, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x37, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x65, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x08, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x71, 0x00, 0x02, 0xEF, 0xFF, 0xFF, 0xB0, 0x00, 0x3F, 0xFF, 0xFF, 0xF5, 0x00, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x05, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x89, 0xBC, 0xCA, 0x84, 0x10, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xFF, 0xF4, 0x01, 0x89, 0xAB, 0xBC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x9F, 0xFF, 0xFF, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x35, 0x68, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0xDF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFA, 0x00, 0x03, 0xFF, 0xFF, 0xFE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x58, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x1F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xF6, 0x00, 0x08, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x0B, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x08, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x23, 0x55, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x5F, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x05, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xFB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xA8, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, + 0x00, 0x06, 0xEF, 0xFF, 0xE8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, + 0x00, 0x6E, 0xFF, 0xFB, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, + 0x03, 0xEF, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, + 0x0B, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, + 0x5F, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, + 0xAF, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x9B, 0xBA, 0x85, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x89, 0xBA, 0xA9, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x48, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x20, 0x00, 0x00, 0x00, 0x18, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, + 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x07, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, + 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x01, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x01, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, + 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x02, 0x8D, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF9, 0x50, 0x00, 0x00, + 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x04, 0xCE, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF8, 0xD6, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8E, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF7, 0xFE, 0x20, 0x00, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF7, 0xFF, 0x80, 0x00, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x00, 0x00, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x31, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x35, 0x55, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEF, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF8, 0xFF, 0xE0, 0x00, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x70, 0x00, 0x00, 0x00, 0x03, 0xEF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x05, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFA, 0xFF, 0xF6, 0x00, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x35, 0x44, 0x20, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x9F, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xDA, 0xFF, 0xFD, 0x00, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0xEF, 0xFF, 0xFF, 0xFF, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xCF, 0xFF, 0xFF, 0xFF, 0xC8, 0x20, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x68, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4A, 0xEF, 0xFF, 0xFF, 0xFF, 0xA6, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x5F, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xAD, 0xFF, 0xFF, 0x20, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x09, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x8D, 0xFF, 0x47, 0x60, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x05, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0x5F, 0xFE, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x01, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0x3F, 0xFC, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x03, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0xEF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFE, 0x3F, 0xF9, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x5F, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFB, 0x3F, 0xF8, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x0A, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xF8, 0x4F, 0xF5, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x43, 0x23, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x32, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x33, 0x35, 0x8F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xF5, 0x4F, 0xF4, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x40, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFD, 0x20, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF2, 0x4F, 0xF2, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFA, 0x10, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xF2, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x1F, 0xF3, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF4, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xC0, 0x0D, 0xF8, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF7, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0x90, 0x04, 0xFE, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x08, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xF9, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x60, 0x00, 0x9F, 0x80, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x09, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFE, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x50, 0x00, 0x0C, 0xE2, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x0A, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0x10, 0x00, 0x01, 0xDA, 0x00, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xF2, 0x00, 0x00, 0x2F, 0xFC, 0x00, 0x00, 0x00, 0x3E, 0x50, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFB, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x03, 0xD2, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x08, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x50, 0x00, 0x5F, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x11, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x06, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x7F, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFE, 0x50, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0xA9, 0x80, 0x06, 0xFF, 0xFF, 0xFF, 0xF9, 0x88, 0x88, 0x8C, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0xF9, 0x84, 0x10, 0x9F, 0xFF, 0xFF, 0xFE, 0x66, 0x66, 0x66, 0xAF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x03, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0xFF, 0xFF, 0x70, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0x30, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAA, 0xAA, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xAA, 0xAA, 0xAA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x89, 0x9A, 0xAA, 0x90, 0x03, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x78, 0xAA, 0x60, 0x6A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xAA, 0xAA, 0xA8, 0x30, 0x00, 0x00, 0x00, 0xBF, 0xFC, 0x08, 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF6, 0x3F, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xD1, 0x4F, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0x60, 0x6F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xBF, 0xFF, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, 0xF8, 0x00, 0x6F, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0A, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0x90, 0x00, 0x6F, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9F, 0xFF, 0xFD, 0x88, 0x64, 0x44, 0x33, 0x22, 0x22, 0x21, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, 0x12, 0x22, 0x22, 0x33, 0x45, 0x56, 0x79, 0xEF, 0xFF, 0xF8, 0x10, 0x00, 0x6F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x50, 0x00, 0x00, 0x7F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x82, 0x00, 0x00, 0x00, 0x8F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xBD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x71, 0x00, 0x00, 0x00, 0x04, 0xEF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x78, 0x88, 0x89, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xBB, 0xBC, 0xDF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEC, 0xCA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x9A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB9, 0x86, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x56, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xFF, 0xFF, 0xFB, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8C, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xD8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFE, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFE, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xE9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xEA, 0x98, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xA7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF2, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xF8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x08, 0xFF, 0xFF, 0xFE, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x01, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0xDF, 0xFF, 0xFF, 0xF2, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0xBF, 0xFF, 0xFF, 0xF7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x8F, 0xFF, 0xFF, 0xFA, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xC0, 0x8F, 0xFF, 0xFF, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xF5, 0x5F, 0xFF, 0xFF, 0xFF, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFE, 0x6F, 0xFF, 0xFF, 0xFF, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0xFB, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xF6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xF5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xF2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFE, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xF9, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFA, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00 }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp index 199433a802..cad6f1fef1 100644 --- a/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp +++ b/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp @@ -25,246 +25,246 @@ #if HAS_GRAPHICAL_TFT extern const uint16_t marlin_logo_320x240x16[76800] = { - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x28ee, 0x8252, 0xcb54, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x394f, 0xb313, 0xd395, 0x7211, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x496f, 0xcb55, 0xd395, 0xbb54, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00fa, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x61d0, 0xd395, 0xd395, 0xd395, 0x69f1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x61d0, 0xd395, 0xd395, 0xd396, 0xd375, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ce, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10f2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8252, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x5190, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x412f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0355, 0x190f, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f4, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x496f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x11d1, 0x03b7, 0x0a93, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x28ee, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9ab3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x00f9, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x10af, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x7a31, 0xd395, 0xd395, 0xd375, 0xdb95, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11d1, 0x03b8, 0x03b7, 0x03b8, 0x0a94, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x00f9, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xd395, 0xb313, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x190e, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0xa2d3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xa2d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a94, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x61d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0397, 0x03b8, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x59d0, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x011a, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x61b1, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8a92, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x188d, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0xaad3, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03d7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0x7231, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x08d3, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x20ae, 0x8a92, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x7a31, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x28ee, 0xc374, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xa2d3, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ce, 0x194f, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x61d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x69f1, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x02f5, 0x03b7, 0x03b8, 0x0356, 0x114f, 0x18ad, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x9ab3, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x190f, 0x0377, 0x0397, 0x03b8, 0x0398, 0x0397, 0x0b77, 0x18ce, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0bb7, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x4970, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x1253, 0x0b78, 0x0b98, 0x0b78, 0x0b98, 0x0b98, 0x1378, 0x11f2, 0x18ad, 0x18ad, 0x0b98, 0x0b78, 0x0b78, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0b98, 0x1378, 0x0b78, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x4970, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0x8252, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1ab5, 0x1b78, 0x1b58, 0x1358, 0x1b78, 0x1378, 0x1358, 0x1a13, 0x18ae, 0x18ae, 0x1358, 0x1358, 0x1378, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1358, 0x1358, 0x1358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd395, 0xc354, 0x5990, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1a54, 0x1b38, 0x1b38, 0x2338, 0x1b38, 0x1b58, 0x2338, 0x21d2, 0x18ad, 0x18ad, 0x2338, 0x2338, 0x2358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x2339, 0x2358, 0x2338, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xa2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x2150, 0x2b18, 0x2b39, 0x2b18, 0x2b19, 0x2b19, 0x2af8, 0x18ce, 0x18ad, 0x18ad, 0x2b19, 0x2b18, 0x2b19, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x2192, 0x2b19, 0x2b19, 0x2b18, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xbb34, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2192, 0x2b19, 0x3319, 0x32f9, 0x2a15, 0x18ef, 0x20ad, 0x18ad, 0x18ad, 0x32f9, 0x3319, 0x32f9, 0x18ad, 0x18ad, 0x18ad, 0x2191, 0x3319, 0x2af9, 0x3319, 0x2af9, 0x2a97, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, - 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x3ad9, 0x3ad9, 0x3ad9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x3af9, 0x3ad9, 0x3ad9, 0x18ad, 0x20ad, 0x3215, 0x3ad9, 0x3af9, 0x3ada, 0x3ad9, 0x3277, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x4950, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xaab3, 0x20ce, 0x18ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x03b7, 0x0397, - 0x18ad, 0x18ad, 0x08f5, 0x0139, 0x011a, 0x0117, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x42d9, 0x42b9, 0x42b9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x42b9, 0x42b9, 0x42ba, 0x18ae, 0x31f5, 0x42da, 0x42d9, 0x42b9, 0x42d9, 0x3a77, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x5991, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xd355, 0x9252, 0x30ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, - 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x4ab9, 0x4a9a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4aba, 0x4aba, 0x4a9a, 0x4257, 0x4a99, 0x4a9a, 0x4a9a, 0x4aba, 0x4237, 0x20ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x69f1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xcb14, 0x4130, 0x20af, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x42b9, 0x4a99, 0x42b9, 0x42ba, 0x18ad, 0x18ad, - 0x18ad, 0x18af, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x527a, 0x527a, 0x527a, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x527a, 0x527a, 0x529a, 0x527a, 0x527a, 0x527a, 0x527a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18d2, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x8253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0x7a11, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x621a, 0x6a3b, 0x6a3b, - 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x20ae, 0x08f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x5a5b, 0x5a5a, 0x5a7a, 0x2910, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x5a5a, 0x5a7b, 0x5a5a, 0x5a5a, 0x5a5a, 0x5a5a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x091a, 0x18f2, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x8232, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xa293, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x89bc, 0x89bc, 0x91bc, 0x89bc, 0x899c, - 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x623a, 0x623b, 0x625a, 0x621a, 0x2910, 0x18cd, 0x18ad, 0x18ad, 0x623b, 0x623a, 0x625a, 0x623b, 0x623b, 0x51f8, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x0917, 0x18d2, 0x18d2, 0x0918, 0x091a, 0x0918, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30d0, 0x30f0, 0x30f0, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0x9253, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0xa93d, - 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x59d8, 0x6a1b, 0x6a1b, 0x6a1b, 0x6a1b, 0x4133, 0x18ad, 0x18ad, 0x6a3b, 0x6a1b, 0x6a1b, 0x6a1b, 0x51b6, 0x20cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d3, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18d1, 0x20ce, 0x20ce, 0x18d1, 0x093a, 0x093a, 0x28ef, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x9273, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0xd335, 0xd334, 0xd334, 0xd314, 0xd315, 0xaa93, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ce, 0x61b8, 0x721b, 0x71fb, 0x721b, 0x721b, 0x4133, 0x20ad, 0x71fb, 0x721b, 0x71fb, 0x4174, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x011a, 0x18d1, 0x20ae, 0x20ce, 0x20f1, 0x093a, 0x093a, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0xaaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ae, 0x20ad, 0x20ad, 0x20ae, 0x30ee, 0x6150, 0x81b1, 0xa1f2, 0xc233, 0xca53, 0xca54, 0xca53, 0xc233, 0xa1f2, 0x8191, 0x512f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ce, 0x69b9, 0x81fb, 0x79db, 0x79dc, 0x81fc, 0x5976, 0x79db, 0x79dc, 0x81dc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0918, 0x0119, 0x0917, 0x18d0, 0x20d0, 0x0917, 0x093a, 0x1138, 0x28cf, 0x30cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0xaad4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd315, 0xd314, 0x69b2, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x410f, 0x6990, 0x99f2, 0xc253, 0xca74, 0xd274, 0xca74, 0xd253, 0xca53, 0xca53, 0xca53, 0xd233, 0xd253, 0xca53, 0xd233, 0xca33, 0xc213, 0x8991, 0x410f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x7199, 0x89db, 0x89bc, 0x81bc, 0x89bc, 0x89bc, 0x89bc, 0x89bc, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d2, 0x0119, 0x0119, 0x093a, 0x093a, 0x093a, 0x093a, 0x20f2, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xcad4, 0x5971, 0x30f0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x38ef, 0x79b1, 0xba53, 0xca94, 0xca94, 0xca74, 0xd273, 0xd273, 0xca73, 0xca54, 0xca53, 0xca54, 0xca53, 0xca33, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xd213, 0xca13, 0xca13, 0xa1b2, 0x490f, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x7979, 0x919c, 0x919c, 0x91bc, 0x919c, 0x899c, 0x89bc, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x18f2, 0x0919, 0x091a, 0x091a, 0x0919, 0x20f3, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x4112, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd314, 0xd2f5, 0xd2f4, 0xd2f4, 0x4930, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x4130, 0x89f1, 0xd294, 0xd294, 0xca93, 0xca74, 0xd274, 0xca74, 0xca74, 0xca53, 0xca73, 0xd253, 0xd254, 0xca53, 0xca53, 0xca54, 0xc274, 0x9b36, 0x83b8, 0x6419, 0x6c39, 0x6439, 0x6c1a, 0x8b57, 0xb295, 0xca13, 0x9191, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x28ae, 0x8159, 0x917c, 0x997c, 0x997c, 0x999c, 0x999c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20d0, 0x20d1, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd2f4, 0xd2f4, 0xd315, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d5, 0x79d2, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28ef, 0x28f0, 0x28cf, 0x5150, 0xaa32, 0xd293, 0xd294, 0xd294, 0xca93, 0xca74, 0xca74, 0xca74, 0xca74, 0xd274, 0xd254, 0xca53, 0xca54, 0xb2d5, 0x83b8, 0x44fc, 0x1dbe, 0x063f, 0x0cdb, 0x0b76, 0x1377, 0x1377, 0x0b76, 0x1356, 0x0b76, 0x0b77, 0x23f8, 0x6991, 0x510f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x8939, 0xa17c, 0xa17c, 0xa15d, 0xa15d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8a54, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0x5951, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x4130, 0x91f2, 0xd294, 0xd294, 0xca94, 0xca74, 0xca94, 0xca94, 0xca74, 0xd274, 0xd274, 0xd274, 0xd253, 0xb2d5, 0x7419, 0x257d, 0x063f, 0x061f, 0x057d, 0x12b5, 0x190f, 0x18ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x913a, 0xa93d, 0xa95d, 0xa95c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xcab4, 0x5172, 0x3911, 0x38f1, 0x38f0, 0x30f0, 0x81d2, 0xc294, 0xd294, 0xd293, 0xd294, 0xd294, 0xca93, 0xca93, 0xd274, 0xd274, 0xca73, 0xd274, 0x83d8, 0x353d, 0x061f, 0x063f, 0x063f, 0x063f, 0x4c5a, 0x4970, 0x20ae, 0x20ae, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xb11d, 0xb11d, 0xb11d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6b36, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xcad4, 0xcab4, 0x5972, 0x3911, 0x5151, 0xb253, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xd274, 0xc294, 0x645a, 0x1dbe, 0x063f, 0x063f, 0x063f, 0x1dbe, 0x6459, 0xc274, 0x99d2, 0x28ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0xb8fe, 0xb8fd, 0xb8fe, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253b, 0x465c, 0x6d7b, 0x6d9a, 0x6d9a, 0x6d7a, 0x84f9, 0x9c78, 0x9c77, 0x9c78, 0x9c78, 0x9c57, 0x9c78, 0x9c58, 0x9c58, 0xbbb6, 0xd334, 0xd315, 0xd334, 0xd315, 0xd314, 0xd315, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xcad4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2d4, 0x91f3, 0x5972, 0xca74, 0xd2b4, 0xd2b4, 0xd294, 0xca94, 0xd294, 0xd294, 0xca94, 0xca74, 0xc2b4, 0x6c5a, 0x0dff, 0x063f, 0x063f, 0x063f, 0x353d, 0x83b8, 0xca53, 0xca33, 0x89b1, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0xc0de, 0xc0fe, 0xc0dd, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00fa, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x38f1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4d1a, 0x6d9a, 0x94b9, 0x9c98, 0x9c77, 0x9c78, 0x9c78, 0x9c78, 0x94b8, 0x6d7a, 0x6d7a, 0x6d7b, 0x367c, 0x367d, 0x1efe, 0x077f, 0x075f, 0x1ede, 0x363d, 0x6d3a, 0x9c17, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xcad4, 0xd2b3, 0xcab4, 0xc294, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca74, 0xca74, 0xca74, 0x7bd8, 0x0dff, 0x063f, 0x061f, 0x063f, 0x4cbb, 0x9b57, 0xd233, 0xca33, 0xca53, 0x6150, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8be, 0xc8de, 0xc8be, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xa2b5, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xbb96, 0xa437, 0x74f9, 0x4dbc, 0x2e7e, 0x0edf, 0x559b, 0x8498, 0xc335, 0xd2f4, 0xd2d4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2b5, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xbab4, 0xbaf6, 0xca94, 0xd294, 0xca94, 0xd273, 0x9b76, 0x1dbe, 0x061f, 0x063f, 0x0ddf, 0x643a, 0xb2d5, 0xca54, 0xd253, 0xca53, 0xc294, 0x59b1, 0x28ce, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x40b0, 0xa09a, 0xd0be, 0xd09e, 0xd0be, 0xb89c, 0x78b5, 0x28ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd335, 0xd315, 0xd314, 0xd315, 0xd2f5, 0xd2f5, 0xd2f4, 0x9bf7, 0x6d1a, 0x2e3d, 0x45bc, 0x9418, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xc2d4, 0x4cdb, 0x7bd8, 0x9b57, 0x44fc, 0x063f, 0x063f, 0x1dbe, 0x83d8, 0xc294, 0xca53, 0xca54, 0xca33, 0xca53, 0xb2b5, 0x33b8, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188e, 0x20cd, 0x10d1, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x40b0, 0xd07d, 0xd87e, 0xd89f, 0xd89f, 0xe07f, 0xd89e, 0xd89f, 0xb87b, 0x28ae, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xbb14, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd314, 0xd335, 0xd315, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xc335, 0x8478, 0x4d7b, 0x4d5b, 0xab96, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xca94, 0xcab4, 0xd294, 0xd294, 0xd273, 0xc2b4, 0x5c9a, 0x061f, 0x061f, 0x063f, 0x7419, 0xd273, 0xd273, 0xca53, 0xca53, 0xd233, 0xca53, 0xaaf6, 0x153c, 0x2951, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x10b0, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb07a, 0xe85f, 0xe85f, 0xe07f, 0xe85f, 0xe87f, 0xe07f, 0xe85f, 0xe07f, 0x9898, 0x20ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd315, 0xcb34, 0xd315, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xd2d4, 0xbb55, 0x7499, 0x35dc, 0x8439, 0xc2f4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xca93, 0xd294, 0xd274, 0xca74, 0x9b76, 0x061f, 0x061f, 0x83d8, 0xc295, 0xca53, 0xca53, 0xca53, 0xca53, 0x7bb8, 0x063f, 0x2a34, 0x30f0, 0x30f0, 0x30ef, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x38b0, 0xf05f, 0xe83f, 0xf03f, 0xf05f, 0xf05f, 0xf03f, 0xf03f, 0xf03f, 0xf05f, 0xe83f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xbb35, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xcad4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2d4, 0xcab4, 0xd2b4, 0xcab4, 0xcab4, 0x8bf8, 0x3d5c, 0x6499, 0xc2d4, 0xd294, 0xd294, 0xca74, 0xca74, 0xd274, 0xca74, 0xca74, 0x54bb, 0x5c9a, 0x353d, 0x1dbe, 0x4cbb, 0x9377, 0x9b36, 0x44fc, 0x061f, 0x1bf9, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f4, 0x10f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x5092, 0xf83f, 0xf83f, 0xf03f, 0xf83f, 0xf83f, 0xf83f, 0xf83f, 0xf81f, 0xf03f, 0xf83f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69b3, 0xc355, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd2f5, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0x9b97, 0x453c, 0x6c59, 0xc2b4, 0xca74, 0xd274, 0xd273, 0xca73, 0xd273, 0xc294, 0x6c39, 0xc294, 0xca53, 0x8b98, 0x4cbb, 0x0dff, 0x063f, 0x0d7e, 0x3972, 0x3911, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x5092, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0x9b77, 0x44dc, 0x73f9, 0xca73, 0xca74, 0xd254, 0xca73, 0xca53, 0xc294, 0x351c, 0x6c3a, 0xc294, 0xd253, 0xca34, 0x83b8, 0x5a55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4090, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x28af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69d3, 0xc355, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xcb55, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcad4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xcab4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0xd274, 0xca74, 0x8b78, 0x447c, 0xa316, 0xd253, 0xd253, 0xca54, 0xca53, 0xc294, 0x257d, 0x0ddf, 0x83b8, 0xd233, 0xca33, 0xca33, 0xba13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x30d0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x00f9, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0xd03c, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xd03c, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xaad4, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd2b4, 0xca94, 0xca94, 0xd294, 0xca74, 0xca73, 0xca74, 0xd274, 0xc295, 0x6bb9, 0x6b99, 0xca54, 0xca53, 0xd254, 0xca33, 0xc294, 0x24fd, 0x063f, 0x351d, 0xb295, 0xca13, 0xca13, 0xca13, 0xb9f3, 0x7992, 0x4111, 0x4112, 0x38f1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x4090, 0xf03f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x6073, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xcb55, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd314, 0xd335, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca74, 0xca74, 0xca74, 0xca73, 0xca73, 0xca53, 0xca53, 0xca74, 0xaab6, 0x5b7a, 0xba74, 0xca53, 0xca33, 0xca33, 0xc254, 0x4bfb, 0x059f, 0x0d7f, 0x8b57, 0xc9f3, 0xca13, 0xc9f3, 0xc9f3, 0xa9b3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4091, 0xe01d, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x7074, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ae, 0x18cd, 0x20ae, 0x20cd, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xb2f4, 0xd395, 0xdb95, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0x84f9, 0x467d, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x1f1e, 0x367d, 0x367c, 0x4ddb, 0x653a, 0x8498, 0x9bf7, 0xc2f5, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca73, 0xd253, 0xd254, 0xca74, 0xca53, 0xca53, 0xca53, 0xd253, 0x72d9, 0xaa76, 0xca33, 0xd233, 0xca13, 0xca33, 0x1c7e, 0x059f, 0x05ff, 0x5c7a, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10b0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x7074, 0x9077, 0x8856, 0x8876, 0x388f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x3911, 0x4111, 0x4132, 0x6193, 0xc355, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x271d, 0x07ff, 0x07ff, 0x07bf, 0x079f, 0x079f, 0x077f, 0x079f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x079f, 0x1efe, 0x461c, 0x6d1a, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca73, 0xd274, 0xca74, 0xca53, 0xd254, 0xca54, 0xd253, 0xca53, 0xca33, 0xa275, 0x9a76, 0xca33, 0xca13, 0xca33, 0x9ad6, 0x04ff, 0x05bf, 0x063f, 0x357c, 0xc254, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ae, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x0117, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xcb55, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xcb55, 0xd334, 0xcb55, 0xac17, 0x0fbf, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x365c, 0x74b9, 0xb315, 0xca73, 0xca54, 0xca54, 0xca53, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xb235, 0xaa16, 0xca33, 0xca13, 0xca13, 0x7b37, 0x055f, 0x05ff, 0x067f, 0x25dd, 0xa2f5, 0xd1d3, 0xc9f3, 0xc9d3, 0xc9d2, 0xc9d3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ce, 0x20ad, 0x10f4, 0x011a, 0x0119, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61b3, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0x8cb8, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06df, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x071f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x071f, 0x2dfd, 0x7419, 0xb2b5, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0xd233, 0xca14, 0xa215, 0xca13, 0xca13, 0xc9f3, 0x8338, 0x05bf, 0x063f, 0x06bf, 0x0e9f, 0xaad5, 0xc9d3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b2, 0xb1b2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18cf, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x20ae, 0x18d0, 0x0119, 0x0119, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3111, 0x38f1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xc395, 0x5dfa, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06bf, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x06ff, 0x06bf, 0x065f, 0x05bf, 0x443c, 0x8af7, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca13, 0x99b6, 0xc9f3, 0xca13, 0xc9f3, 0x4c3b, 0x061f, 0x069f, 0x06ff, 0x0ebe, 0xa2d5, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9b2, 0xc1b3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x20ae, 0x20ad, 0x18ce, 0x0119, 0x0119, 0x10d3, 0x20ce, 0x20ae, 0x10f4, 0x0119, 0x011a, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067f, 0x067f, 0x067f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x065f, 0x065f, 0x067f, 0x067f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x065f, 0x05ff, 0x053f, 0x049f, 0x1bbe, 0x8298, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0xd1f3, 0x99b6, 0xc9f3, 0xc9f3, 0xb254, 0x0d9f, 0x067f, 0x06df, 0x06ff, 0x0ebf, 0xa2d5, 0xc9d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011a, 0x10f5, 0x20ce, 0x20cf, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xac37, 0x6d9a, 0x2efe, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x075f, 0x073f, 0x071f, 0x06df, 0x06bf, 0x069f, 0x067f, 0x065f, 0x065f, 0x063f, 0x063f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x063f, 0x063f, 0x063f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x067f, 0x063f, 0x05df, 0x055f, 0x04bf, 0x043f, 0x037f, 0x1abe, 0x7a18, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc1f4, 0x7178, 0xc9f2, 0xd1f3, 0x8338, 0x061f, 0x06bf, 0x06ff, 0x071f, 0x0edf, 0xa2d5, 0xc9b3, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x18ce, 0x0918, 0x011a, 0x011a, 0x0919, 0x011a, 0x0917, 0x20cf, 0x28ae, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xa2b4, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xc3b6, 0x8519, 0x4e3c, 0x0f9f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x06ff, 0x06bf, 0x069f, 0x067f, 0x065f, 0x063f, 0x061f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05df, 0x057f, 0x04ff, 0x047f, 0x03df, 0x031f, 0x025f, 0x19de, 0x79b8, 0xc9f3, 0xca13, 0xc9f3, 0xb9d3, 0xa1b5, 0xc9d3, 0xc9f3, 0x4c5b, 0x065f, 0x06df, 0x071f, 0x071f, 0x0edf, 0xa2b5, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc993, 0xc992, 0xb172, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x10f3, 0x10f3, 0x10d2, 0x20ae, 0x18ae, 0x20ae, 0x18ce, 0x20ce, 0x20ce, 0x20ce, 0x18f2, 0x10f4, 0x1114, 0x18f3, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xc3b5, 0x7d59, 0x36bd, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x071f, 0x06de, 0x069e, 0x067e, 0x065e, 0x063f, 0x063f, 0x061e, 0x05ff, 0x05df, 0x05bf, 0x05bf, 0x059f, 0x059f, 0x059f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x059f, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05bf, 0x057f, 0x04ff, 0x049f, 0x03ff, 0x037f, 0x02bf, 0x021f, 0x017f, 0x213d, 0x9996, 0xc9f3, 0xc9f3, 0xb9d4, 0x99b6, 0xc9d3, 0xc213, 0x0dbf, 0x069f, 0x06ff, 0x071f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xa972, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20af, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xaab5, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0x94d8, 0x467c, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x06de, 0x06be, 0x067e, 0x067e, 0x065e, 0x063e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059f, 0x057f, 0x057f, 0x055f, 0x055f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x055f, 0x055f, 0x055f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x055f, 0x04ff, 0x04bf, 0x041f, 0x039f, 0x031f, 0x025f, 0x01bf, 0x013f, 0x00bf, 0x40fb, 0xb1b5, 0xc9d2, 0xb1d5, 0xb1d4, 0xc9b3, 0x6399, 0x061f, 0x06df, 0x071f, 0x073f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc972, 0xc972, 0xc992, 0xc972, 0xb152, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20cd, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30d0, 0x28f0, 0x3110, 0x30f0, 0x30f0, 0x30f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4a16, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0x8539, 0x1f5e, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x07bf, 0x075f, 0x06be, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059e, 0x057e, 0x055f, 0x053f, 0x053f, 0x051f, 0x051f, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x053f, 0x053f, 0x051f, 0x04df, 0x04bf, 0x043f, 0x03df, 0x035f, 0x02bf, 0x021f, 0x017f, 0x00ff, 0x009f, 0x087f, 0x7119, 0xc9d3, 0xb1d4, 0xb9d3, 0xc9b3, 0x1cfe, 0x065f, 0x06ff, 0x071f, 0x073f, 0x073f, 0x1ebe, 0xb9f3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc973, 0xc952, 0xb152, 0x4111, 0x3910, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20cd, 0x20ce, 0x20ae, 0x20ae, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4a15, 0x3439, 0x16bd, 0x8519, 0xd395, 0xd395, 0xd395, 0x94d8, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x071e, 0x069d, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fd, 0x05dd, 0x05bd, 0x059d, 0x059e, 0x057e, 0x055e, 0x053e, 0x051e, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x049f, 0x049f, 0x049f, 0x049f, 0x049f, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x04bf, 0x04df, 0x04df, 0x04df, 0x04bf, 0x049f, 0x043f, 0x03df, 0x035f, 0x02ff, 0x025f, 0x01bf, 0x013f, 0x00df, 0x007f, 0x005f, 0x185e, 0x8957, 0x61b9, 0xc9d3, 0x9a96, 0x059f, 0x067f, 0x06ff, 0x071f, 0x073f, 0x075f, 0x267d, 0xb9d3, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xb152, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cf, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x00f6, 0x18ce, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f1, 0x38f1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69b4, 0x6336, 0x6cd9, 0x4e5b, 0x07df, 0x8539, 0xd395, 0xd395, 0xbc17, 0x3e9c, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x06bd, 0x069c, 0x069c, 0x067c, 0x065c, 0x065c, 0x063c, 0x061c, 0x05fc, 0x05dc, 0x05bc, 0x05bd, 0x059d, 0x057d, 0x055d, 0x053e, 0x051e, 0x04fe, 0x04de, 0x04be, 0x04bf, 0x049f, 0x047f, 0x047f, 0x047f, 0x045f, 0x045f, 0x045f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x049f, 0x047f, 0x045f, 0x041f, 0x03df, 0x037f, 0x031f, 0x029f, 0x021f, 0x017f, 0x011f, 0x00bf, 0x005f, 0x001f, 0x001f, 0x00ff, 0x89b7, 0xc9b3, 0x447b, 0x065f, 0x06bf, 0x071f, 0x073f, 0x073f, 0x075f, 0x3d9b, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xa132, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20cd, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x40f1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61b3, 0x9274, 0xb2f5, 0xc355, 0xd395, 0xd395, 0xd395, 0xbc16, 0x469d, 0x8539, 0xd376, 0xd375, 0x6dba, 0x0f9f, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x077f, 0x06bc, 0x06bb, 0x069b, 0x067b, 0x065b, 0x063b, 0x063b, 0x061b, 0x05fb, 0x05db, 0x05bb, 0x059c, 0x059c, 0x057c, 0x055c, 0x053d, 0x051d, 0x04fd, 0x04dd, 0x04be, 0x049e, 0x047f, 0x047f, 0x045f, 0x043f, 0x043f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x041f, 0x03ff, 0x03bf, 0x037f, 0x033f, 0x02bf, 0x023f, 0x01df, 0x015f, 0x00df, 0x009f, 0x005f, 0x001f, 0x005f, 0x097f, 0xb9b3, 0xb214, 0x0dbf, 0x06ff, 0x075f, 0x073f, 0x073f, 0x075f, 0x077f, 0x6479, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x9132, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x3110, 0x38f0, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xc335, 0xd395, 0xd395, 0xd395, 0xd395, 0xac57, 0x7d7a, 0x469c, 0x0f9f, 0xa4b8, 0xd395, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x075d, 0x06bb, 0x06bb, 0x069a, 0x067a, 0x065a, 0x065a, 0x063a, 0x061a, 0x05fa, 0x05da, 0x05db, 0x05bb, 0x059b, 0x057b, 0x055b, 0x053c, 0x053c, 0x051c, 0x04fc, 0x04dd, 0x04bd, 0x047e, 0x047e, 0x045e, 0x043f, 0x041f, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03bf, 0x035f, 0x031f, 0x02df, 0x027f, 0x01ff, 0x019f, 0x011f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x009f, 0x39db, 0xc992, 0x6399, 0x069f, 0x079f, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x079f, 0x9af6, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x7112, 0x3110, 0x30f0, 0x30ef, 0x28f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d3, 0x10d2, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xcb75, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x1f7e, 0x07ff, 0x07ff, 0x36dd, 0xbc17, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x071b, 0x06da, 0x06ba, 0x06ba, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05f9, 0x05da, 0x05ba, 0x059a, 0x057a, 0x055a, 0x055b, 0x053b, 0x051b, 0x04fc, 0x04dc, 0x04bc, 0x049d, 0x047d, 0x045d, 0x043e, 0x041e, 0x03fe, 0x03df, 0x03df, 0x03bf, 0x03bf, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x037f, 0x035f, 0x031f, 0x02df, 0x027f, 0x023f, 0x01bf, 0x015f, 0x00ff, 0x009f, 0x005f, 0x001f, 0x003f, 0x011f, 0x99b6, 0xb9d3, 0x0d9f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f7e, 0xb9b3, 0xc952, 0xc952, 0xc952, 0xc952, 0xc931, 0xc932, 0xc132, 0x6111, 0x38f0, 0x30f0, 0x28f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xa2b4, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x0fbf, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x1f7e, 0x07df, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x06f9, 0x06f9, 0x06d9, 0x06b8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05f8, 0x05d8, 0x05b8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051a, 0x04fa, 0x04db, 0x04bb, 0x049c, 0x047c, 0x045d, 0x043d, 0x041e, 0x03fe, 0x03de, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02bf, 0x027f, 0x023f, 0x01ff, 0x019f, 0x013f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x005f, 0x197e, 0xb993, 0x6379, 0x063f, 0x073f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dfb, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc932, 0xc912, 0xb912, 0x4111, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x08f6, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79f3, 0xb2f4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x94f9, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x079d, 0x0719, 0x06f8, 0x06f8, 0x06d7, 0x06b7, 0x06b7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05f7, 0x05d7, 0x05b7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04f9, 0x04da, 0x04bb, 0x049b, 0x047c, 0x043c, 0x041d, 0x041d, 0x03fe, 0x03de, 0x03be, 0x039e, 0x037f, 0x035f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x027f, 0x023f, 0x01ff, 0x019f, 0x015f, 0x00ff, 0x009f, 0x005f, 0x003f, 0x001f, 0x00bf, 0x59ba, 0xb9b3, 0x0d3f, 0x06bf, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7438, 0xc952, 0xc132, 0xc932, 0xc932, 0xc932, 0xc911, 0xc912, 0xa111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x08f5, 0x011a, 0x0119, 0x00fa, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x5151, 0x79f3, 0xa2b4, 0xcb75, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x469c, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0xc335, 0x45d7, 0x0738, 0x0717, 0x06f6, 0x06f6, 0x06d6, 0x06b5, 0x06b5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05f5, 0x05f5, 0x05d6, 0x05b6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04f9, 0x04d9, 0x049a, 0x047b, 0x045b, 0x043c, 0x041c, 0x03dd, 0x03dd, 0x03be, 0x039e, 0x037e, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x021f, 0x01ff, 0x01bf, 0x017f, 0x011f, 0x00df, 0x009f, 0x003f, 0x001f, 0x003f, 0x013f, 0xb174, 0x6339, 0x05ff, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb992, 0xc932, 0xc932, 0xc931, 0xc912, 0xc912, 0xc912, 0xc911, 0x8111, 0x30f0, 0x30f0, 0x28ef, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20d0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08f5, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x59b2, 0x7a13, 0x9a94, 0xbb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xac77, 0x2f1e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bc, 0x0759, 0xabb5, 0xc314, 0x1e97, 0x0736, 0x0716, 0x0715, 0x06f4, 0x06f4, 0x06f3, 0x06d3, 0x06b3, 0x06b2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05f4, 0x05d4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04f8, 0x04b9, 0x0499, 0x045a, 0x043b, 0x041b, 0x03fc, 0x03dd, 0x03bd, 0x039d, 0x037e, 0x035e, 0x033e, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x021f, 0x01df, 0x019f, 0x017f, 0x013f, 0x00ff, 0x009f, 0x007f, 0x003f, 0x001f, 0x007f, 0x399b, 0xb993, 0x055f, 0x067f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x45db, 0xc132, 0xc932, 0xc912, 0xc132, 0xc912, 0xc912, 0xc911, 0xc912, 0x5111, 0x38f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x10d3, 0x10f4, 0x18d0, 0x18ad, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ce, 0x20ce, 0x28ae, 0x20ce, 0x28ee, 0x5171, 0x69d2, 0x8232, 0xaaf4, 0xc334, 0xd375, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x757a, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bd, 0x079b, 0x077a, 0x0779, 0x74d6, 0xd2d4, 0x9bf5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06f0, 0x06f0, 0x06d0, 0x06af, 0x06af, 0x066f, 0x0650, 0x0631, 0x0611, 0x05d2, 0x0594, 0x0554, 0x0515, 0x04f7, 0x04b8, 0x0478, 0x0459, 0x043a, 0x03fb, 0x03bc, 0x03bc, 0x039d, 0x037d, 0x035e, 0x033e, 0x031f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x027f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x013f, 0x011f, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x00df, 0xa175, 0x33bc, 0x05df, 0x06ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x92d5, 0xc911, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc112, 0xc912, 0xa8f1, 0x3110, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x390f, 0x4970, 0x59b0, 0x7a32, 0x9293, 0xaad3, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x9cb8, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07dd, 0x07bc, 0x079b, 0x079a, 0x079a, 0x0779, 0x55b7, 0xd2b4, 0xd2b4, 0x4db5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074f, 0x074e, 0x074d, 0x074d, 0x074c, 0x072b, 0x072b, 0x072a, 0x070a, 0x06ea, 0x06ac, 0x064d, 0x05d0, 0x0573, 0x04f5, 0x04b6, 0x0478, 0x0438, 0x041a, 0x03fb, 0x03bc, 0x039c, 0x037c, 0x033d, 0x033d, 0x031e, 0x02fe, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x009f, 0x005f, 0x003f, 0x001f, 0x003f, 0x213d, 0x1b1e, 0x051f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f3d, 0xc912, 0xc912, 0xc112, 0xc112, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0x80f1, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xc374, 0xa2d3, 0xaad3, 0x7a31, 0x7a31, 0x7a11, 0x7231, 0x5190, 0x496f, 0x496f, 0x4970, 0x496f, 0x494f, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x494f, 0x496f, 0x496f, 0x69f1, 0x7a31, 0x7a31, 0x9272, 0xa2d3, 0xaaf3, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd395, 0xac57, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x079a, 0x079a, 0x0799, 0x26b8, 0xcad4, 0xd2b4, 0xc314, 0x0f35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078f, 0x078e, 0x078e, 0x078d, 0x078c, 0x07aa, 0x07a9, 0x07a9, 0x07a8, 0x07c7, 0x07c5, 0x07c4, 0x07e4, 0x07a4, 0x0727, 0x068a, 0x05af, 0x0496, 0x0438, 0x03f9, 0x03ba, 0x039b, 0x035c, 0x035d, 0x031d, 0x031d, 0x02fe, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x007f, 0x023f, 0x041f, 0x05bf, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6498, 0xc911, 0xc912, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8d1, 0x50f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0117, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x8539, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x07ba, 0x07ba, 0x07b9, 0xd2b4, 0xd2b4, 0xd2b4, 0x6535, 0x07b5, 0x07b5, 0x07b4, 0x07b3, 0x07b2, 0x07b1, 0x07b0, 0x07af, 0x07ce, 0x07cd, 0x07cc, 0x07cb, 0x07ca, 0x07ca, 0x07c9, 0x07e8, 0x07e7, 0x07e6, 0x07e5, 0x07e5, 0x07e3, 0x07e3, 0x07e2, 0x07e1, 0x0726, 0x060c, 0x04b4, 0x03b9, 0x037b, 0x035c, 0x033d, 0x031d, 0x02de, 0x02df, 0x02be, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x015f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x007f, 0x003f, 0x001f, 0x001f, 0x011f, 0x02ff, 0x04df, 0x063f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb972, 0xc8f2, 0xc8f2, 0xc0f1, 0xc8f2, 0xc0f2, 0xc0f1, 0xc8d1, 0xa0f1, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x412f, 0x8a72, 0xc334, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xac57, 0x469c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x467c, 0x8519, 0x8519, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07de, 0x07de, 0x07dd, 0x07dc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x07da, 0x9bf5, 0xd2b4, 0xd2b4, 0xc2f4, 0x0f77, 0x07d6, 0x07d5, 0x07d4, 0x07d4, 0x07d3, 0x07d2, 0x07d1, 0x07d0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07ec, 0x07ea, 0x07e9, 0x07e9, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e4, 0x07e4, 0x07e3, 0x07e3, 0x07e2, 0x0785, 0x060c, 0x04d3, 0x035b, 0x031c, 0x02de, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x001f, 0x001f, 0x003f, 0x01df, 0x03bf, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d7a, 0xc111, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0d1, 0xc8d1, 0x68f1, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x414f, 0x61d1, 0x8251, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xbc16, 0x8539, 0x469c, 0x17bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8518, 0xd355, 0xd355, 0xd335, 0xd335, 0x84f8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07fe, 0x07dd, 0x07dd, 0x07bc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x8c56, 0xcab4, 0xcab4, 0xd294, 0x4df7, 0x07d7, 0x07d7, 0x07d6, 0x07f5, 0x07d5, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07e9, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e5, 0x07e5, 0x07e4, 0x07a6, 0x060e, 0x03f8, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x003f, 0x001f, 0x001f, 0x00bf, 0x029f, 0x049f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1d3, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0f1, 0xc8d1, 0xb8d1, 0x40f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0x496f, 0x5990, 0x7a12, 0x7a32, 0x9272, 0xa2d3, 0xa2d3, 0xc375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xac77, 0x757a, 0x36fd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4e3c, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd334, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07dd, 0x07dd, 0x07dc, 0x07fc, 0x07dc, 0x07db, 0x6d38, 0xcab4, 0xd294, 0xd294, 0xab95, 0x07d8, 0x07d8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ec, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07e9, 0x07e9, 0x07e8, 0x07e8, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e8, 0x07c8, 0x06eb, 0x0514, 0x033c, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0x015f, 0x037f, 0x057f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5a, 0xc8f1, 0xc8d1, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x78d1, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x496f, 0x496f, 0x4970, 0x7a12, 0x7a31, 0x8252, 0xaad3, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcbd6, 0x94f8, 0x565b, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb3f6, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd334, 0x1f7e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07dd, 0x07fd, 0x07fd, 0x07fd, 0x07dd, 0x07dc, 0x6d38, 0xcab4, 0xd294, 0xca94, 0xd294, 0x1f39, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ed, 0x07ec, 0x07eb, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07ca, 0x07ab, 0x076c, 0x070d, 0x05b2, 0x039b, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60d9, 0x0a3f, 0x047f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9d3, 0xc0d1, 0xc8d1, 0xc0f1, 0xc8b1, 0xc0d1, 0xc8b1, 0xc0b1, 0xb8b1, 0x48f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x4970, 0x5990, 0x7a31, 0x7231, 0x7a31, 0x7a31, 0x9ab3, 0xaad4, 0xa2d4, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0x94f8, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd315, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x6d58, 0xd294, 0xd293, 0xca94, 0xd274, 0x4df8, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f1, 0x07f0, 0x07f0, 0x07f0, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ed, 0x07cd, 0x078e, 0x076e, 0x0710, 0x06b1, 0x0574, 0x037b, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x013f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x88d6, 0x6159, 0x031f, 0x053f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5b, 0xc0d1, 0xc8d1, 0xc8d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b1, 0x90d1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ce, 0x18ad, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x290f, 0x5170, 0x5170, 0x69f1, 0x7a32, 0x8232, 0xaaf3, 0xaaf4, 0xcb75, 0xd395, 0xd396, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xc3b6, 0x8539, 0x1f7f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0x659a, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x6d39, 0xd294, 0xca94, 0xd274, 0xca74, 0x7c96, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f4, 0x07f4, 0x07f3, 0x07f3, 0x07f3, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f1, 0x07f1, 0x07f1, 0x07f1, 0x07f0, 0x07f1, 0x07d0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02dd, 0x01bf, 0x019f, 0x017f, 0x015f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x00bf, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60b8, 0xb8f3, 0x09bf, 0x041f, 0x061f, 0x073f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1b3, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x48f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x5172, 0x61b2, 0x8a54, 0x9a94, 0xb335, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0x9c97, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xac17, 0xd335, 0xd314, 0xd335, 0xd314, 0xd315, 0xd315, 0xd2f4, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6d59, 0xd274, 0xca94, 0xd274, 0xca74, 0xb334, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f4, 0x07f4, 0x07f4, 0x07d3, 0x07b3, 0x0793, 0x0753, 0x0714, 0x06b5, 0x5516, 0x0538, 0x037c, 0x01ff, 0x017f, 0x015f, 0x013f, 0x011f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x6099, 0xc911, 0x491a, 0x02df, 0x051f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6459, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x90d1, 0x30f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69d3, 0x9274, 0xb2f5, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xa478, 0x36dd, 0x07ff, 0x07ff, 0x563c, 0xd335, 0xd334, 0xd315, 0xd315, 0xd2f4, 0xcb15, 0xbb96, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8498, 0xca94, 0xca94, 0xd274, 0xca74, 0xca74, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07d6, 0x07b6, 0x0796, 0x0756, 0x0716, 0xa456, 0xbbd6, 0x3479, 0x02fd, 0x023f, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x003f, 0x78b7, 0xc111, 0xa114, 0x01ff, 0x041f, 0x05ff, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xc0b1, 0xc0d2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x48f1, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x20cd, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71f4, 0x9a75, 0xb2f5, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0x9c78, 0x36dd, 0x07ff, 0x9c57, 0xd335, 0xd315, 0xd334, 0xd314, 0xc355, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bf7, 0xca94, 0xd274, 0xca73, 0xca74, 0xd253, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f8, 0x07d8, 0x07b8, 0x0797, 0x0758, 0x0ef8, 0xbbf6, 0xd395, 0x6b99, 0x025f, 0x021f, 0x01bf, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x98d5, 0xc8f2, 0xc911, 0x195e, 0x033f, 0x053f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b76, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x88d1, 0x30f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8a16, 0xaad5, 0xcb55, 0xd375, 0xd355, 0xd354, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0x84f9, 0x0fbf, 0x5ddb, 0xa457, 0x9c58, 0x84d8, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca74, 0xca74, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07da, 0x07da, 0x07ba, 0x079a, 0x0779, 0x2e99, 0xc3d6, 0xd395, 0x8339, 0x0a3e, 0x01df, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0x90d5, 0xc912, 0xc0f1, 0x7117, 0x027f, 0x049f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x269d, 0xc891, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8b1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ce, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ef, 0x28cf, 0x28ef, 0x28d0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8b14, 0x4ad3, 0x7a94, 0xab14, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd314, 0xd335, 0xc355, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc2d4, 0xca74, 0xca74, 0xd274, 0xca74, 0xd253, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07db, 0x07bb, 0x07bb, 0x077b, 0x2eba, 0xc3d6, 0xd395, 0xb337, 0x09df, 0x01bf, 0x017f, 0x013f, 0x011f, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x7896, 0xc0f1, 0xc8f1, 0xa8f3, 0x01df, 0x03df, 0x05bf, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0x68f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9a75, 0xcb55, 0xcb75, 0x5bb4, 0x3b34, 0x42b3, 0x4a33, 0x6253, 0x9ab4, 0xd335, 0xd335, 0xd315, 0xd334, 0xd314, 0xd315, 0xd314, 0xd314, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f5e, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xca53, 0x369d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07dd, 0x07dd, 0x07bd, 0x079c, 0x561a, 0xd395, 0xd395, 0xab37, 0x099f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x003f, 0x003f, 0x305c, 0xc0f1, 0xc8f1, 0xc8d1, 0x215d, 0x033f, 0x051f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5cd9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x98d1, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x011a, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xcb55, 0xd375, 0xbb95, 0x5474, 0x3c34, 0x3bb4, 0x4333, 0x42b3, 0x4a13, 0x49f3, 0x5a32, 0x9ab4, 0xd334, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0x84d8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4ddb, 0xd274, 0xca74, 0xca73, 0xd274, 0xca54, 0xca54, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07de, 0x079d, 0x6d99, 0xd395, 0xd395, 0xab17, 0x097f, 0x011f, 0x011f, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0xc8f1, 0xc8f1, 0xc8d1, 0x5119, 0x02df, 0x04ff, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x4910, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xcb55, 0xd375, 0xd375, 0xb3d5, 0x3d55, 0x3515, 0x3495, 0x3c14, 0x3b94, 0x3b13, 0x4293, 0x4212, 0x49f3, 0x49f3, 0x5a13, 0x9ab4, 0xd314, 0xd315, 0xcb15, 0xd2f4, 0xd2f5, 0xd2f4, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8c37, 0xca74, 0xd273, 0xd253, 0xca54, 0xca53, 0xd253, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07df, 0x07df, 0x94d8, 0xd396, 0xd395, 0x8299, 0x00ff, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0xc8d1, 0xc0f1, 0xc0d1, 0xa0d4, 0x027f, 0x04bf, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8315, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x70f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0117, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xb2f4, 0xd375, 0xd375, 0xd375, 0x9435, 0x3d55, 0x2d55, 0x2d75, 0x3515, 0x3c94, 0x3414, 0x3b94, 0x4313, 0x4293, 0x4a13, 0x41f3, 0x49f2, 0x4a13, 0x5a33, 0xa2b4, 0xd314, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2f4, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x179f, 0xd274, 0xca53, 0xca73, 0xca53, 0xca53, 0xca53, 0xd253, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xbc16, 0xd395, 0xd395, 0x725a, 0x00bf, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x90b5, 0xc8d1, 0xc8d1, 0xc0d1, 0x123e, 0x047f, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x90d1, 0x38f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x38f0, 0x30f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xcb55, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3bf4, 0x3b73, 0x42f4, 0x4273, 0x4a13, 0x4213, 0x49f2, 0x49f3, 0x49f3, 0x6a33, 0xbad4, 0xd2f5, 0xd2f4, 0xd2d4, 0xc335, 0x177e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xca54, 0xd273, 0xca54, 0xca53, 0xca53, 0xca53, 0x9bb6, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x077e, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x36dd, 0xd395, 0xd395, 0xd395, 0x51bc, 0x009f, 0x009f, 0x007f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x7077, 0xc0d2, 0xc8d1, 0xc0d1, 0x49fa, 0x049f, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4952, 0xaab4, 0xd375, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x2d75, 0x2d75, 0x3555, 0x54d5, 0x6475, 0x83b5, 0x8b74, 0x9b34, 0xab14, 0xaad4, 0xb2d4, 0xaad4, 0xaab4, 0xaab4, 0xb2b4, 0x6b15, 0x8a94, 0xc2d4, 0xd2f4, 0xd2d4, 0x84b8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb315, 0xd274, 0xca53, 0xca54, 0xca53, 0xca53, 0xd253, 0x653a, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x071f, 0x071e, 0x071e, 0x073e, 0x079f, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7d7a, 0xd395, 0xd395, 0xc375, 0x28fe, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x005f, 0x003f, 0x003f, 0x183e, 0xc0d1, 0xc0d1, 0xc0d2, 0x7996, 0x04bf, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x58f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0117, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x5972, 0xcb55, 0xd375, 0xd375, 0xd375, 0xd375, 0xabd5, 0x4515, 0x54f5, 0x7c75, 0x8c35, 0xabd5, 0xcb55, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xc355, 0x9c37, 0x659a, 0x467c, 0x0fbf, 0x07ff, 0x07ff, 0x269d, 0x9c17, 0xd2d4, 0x9c17, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xd274, 0xca53, 0xca54, 0xca53, 0xca33, 0xca33, 0xca33, 0x26dd, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071e, 0x071e, 0x06fe, 0x06fe, 0x06ff, 0x06de, 0x06de, 0x06be, 0x06be, 0x06de, 0x073e, 0x079f, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x079f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0xc3f6, 0xd395, 0xd395, 0xaaf7, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x001f, 0x001f, 0xa094, 0xc0d1, 0xc8b1, 0xa8f3, 0x04bf, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x73d8, 0xb8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x10cf, 0x0119, 0x00f9, 0x0117, 0x18ce, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x71f2, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xcb14, 0xd334, 0xd334, 0xac16, 0x753a, 0x467d, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x369c, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26fd, 0xc2b4, 0xca53, 0xca53, 0xca53, 0xd253, 0xca33, 0xca33, 0xa356, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06fe, 0x06fe, 0x06de, 0x06be, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x06be, 0x073e, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07df, 0x6dda, 0xd395, 0xd376, 0xd375, 0x79fa, 0x003f, 0x003f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x8896, 0xc0b1, 0xc0b1, 0xc8b1, 0x0c9f, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0x98d1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x9a93, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd355, 0xd335, 0xd335, 0xc375, 0x84f9, 0x4e3c, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xab75, 0xca54, 0xd253, 0xca53, 0xca33, 0xca33, 0xd233, 0xca33, 0x4dbb, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06de, 0x06de, 0x06de, 0x06be, 0x06be, 0x069e, 0x067e, 0x067e, 0x067e, 0x065e, 0x063e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05fd, 0x067d, 0x06de, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x071e, 0x073f, 0x073f, 0x073f, 0x073e, 0x075f, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x0fbf, 0xc3d6, 0xd375, 0xd375, 0xd355, 0x30fd, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x6058, 0xc0b1, 0xc0b1, 0xc0b1, 0x33fc, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0b1, 0xb8d1, 0xb8d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x3910, 0xaaf4, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x7539, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2efd, 0xb315, 0xca53, 0xca54, 0xca33, 0xca53, 0xca34, 0xca34, 0xca33, 0xa335, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06de, 0x06bf, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05bd, 0x05be, 0x059d, 0x055e, 0x055e, 0x05be, 0x05fe, 0x061d, 0x067e, 0x06be, 0x06fe, 0x06fe, 0x071f, 0x071e, 0x073f, 0x073f, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x8539, 0xd375, 0xd355, 0xd355, 0xbaf6, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x403b, 0xc8b1, 0xc0b1, 0xc0b1, 0x6318, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9b3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x4910, 0x3910, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x10d3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30cf, 0x3910, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xcb96, 0x8518, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbe, 0x653a, 0xca54, 0xca53, 0xd253, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x2e9d, 0x077f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06fe, 0x06df, 0x06de, 0x06bf, 0x06be, 0x06bf, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05be, 0x05be, 0x059e, 0x057e, 0x053e, 0x051e, 0x04fe, 0x04be, 0x049e, 0x041e, 0x03dd, 0x04de, 0x065e, 0x06be, 0x06de, 0x06de, 0x06fe, 0x071f, 0x073e, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x36dd, 0xd355, 0xd355, 0xd355, 0xd335, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0xb8b2, 0xc091, 0xc0b1, 0x7a96, 0x06bf, 0x079f, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x82f5, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0x60f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x08f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x28cf, 0x28ef, 0x3910, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x5d9a, 0xb315, 0xd254, 0xca53, 0xd254, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xca33, 0x64d9, 0x077f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06be, 0x069f, 0x069f, 0x067e, 0x065e, 0x065e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x055e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043d, 0x03de, 0x03be, 0x039e, 0x037e, 0x03fe, 0x05fe, 0x069e, 0x069e, 0x06be, 0x06fe, 0x071e, 0x073f, 0x075f, 0x079f, 0x079f, 0x07df, 0x07df, 0x07df, 0x07ff, 0xbbf6, 0xd355, 0xd335, 0xd335, 0xc2f5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x9095, 0xc8b1, 0xc8b1, 0x91f5, 0x067f, 0x06ff, 0x073f, 0x075f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x80f2, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x08f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x3110, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0x9c77, 0x563b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f7e, 0x65db, 0x7cf9, 0x9c57, 0x9c57, 0x9c57, 0x9c57, 0x9c37, 0x9c37, 0x9c37, 0x9c37, 0x7539, 0x6d7a, 0x6579, 0x5dbb, 0x36bd, 0x36bd, 0x36bc, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x36bd, 0x5d9a, 0x8c37, 0xd274, 0xd273, 0xd254, 0xca53, 0xd254, 0xd253, 0xca33, 0xd233, 0xca34, 0xca13, 0xca33, 0x8418, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x069e, 0x069f, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x05be, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04be, 0x045e, 0x03fe, 0x03be, 0x039e, 0x037e, 0x037e, 0x035e, 0x033e, 0x035e, 0x061d, 0x067e, 0x067e, 0x069e, 0x06be, 0x06fe, 0x073f, 0x075f, 0x077f, 0x079f, 0x07df, 0x07df, 0x07ff, 0x7d59, 0xd335, 0xd335, 0xd335, 0xd314, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x60d8, 0xc0b1, 0xc0b1, 0xb8f2, 0x05df, 0x061f, 0x065f, 0x06df, 0x073f, 0x077f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x90d1, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0x9c77, 0x3edd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x659a, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca74, 0xca74, 0xca73, 0xca73, 0xd274, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xab15, 0x0edf, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067e, 0x067f, 0x067e, 0x065e, 0x063f, 0x061e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043e, 0x03be, 0x039e, 0x039e, 0x035e, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x037e, 0x05fe, 0x065e, 0x067e, 0x069e, 0x06de, 0x06fe, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x271d, 0xd335, 0xd314, 0xd315, 0xd315, 0xc2d5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x009f, 0x60d8, 0xc0b1, 0xc0b2, 0xc0b1, 0x04bf, 0x053f, 0x05bf, 0x067f, 0x06df, 0x075f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0x98d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ce, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xac37, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x0ebd, 0x1d7b, 0x1c99, 0x32f5, 0x3a75, 0x6193, 0x69b3, 0x79f4, 0x8a14, 0xb294, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xd274, 0xca53, 0xca54, 0xca54, 0xca53, 0xd253, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x8b97, 0x35fd, 0x5d7b, 0x6d3a, 0x6d3a, 0x5d5b, 0x35fd, 0x06bf, 0x0e7e, 0x457c, 0x6c99, 0x6479, 0x6459, 0x4cba, 0x0e1e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04de, 0x047e, 0x03de, 0x03be, 0x037e, 0x037f, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x02fe, 0x02fe, 0x02de, 0x03fe, 0x05be, 0x063e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073e, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0xbbb6, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0x697a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x48fa, 0xc0b1, 0xc0b1, 0xc0b1, 0x331c, 0x047f, 0x053f, 0x05ff, 0x069f, 0x073f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9a14, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ae, 0x18cf, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f4, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x9273, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xc3b6, 0x5dfb, 0x07ff, 0x0e3b, 0x1c98, 0x2ad5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79d3, 0x9a54, 0xc294, 0xd2f4, 0xd2d5, 0xcad4, 0xd2d4, 0xd2b4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xca73, 0xd253, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x99d4, 0x6358, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd375, 0x06bf, 0x5cfa, 0xd2b4, 0xca94, 0xca33, 0xca13, 0xc9d3, 0xb9d3, 0x4c5a, 0x061e, 0x061e, 0x05de, 0x05de, 0x05be, 0x059e, 0x059e, 0x057e, 0x053e, 0x051e, 0x051d, 0x04de, 0x04be, 0x043e, 0x03be, 0x03be, 0x037f, 0x0b7e, 0x337c, 0x333c, 0x335c, 0x333c, 0x333c, 0x331c, 0x331c, 0x32fc, 0x32fc, 0x32dc, 0x2b7c, 0x05de, 0x061e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07df, 0x84f9, 0xd314, 0xcb14, 0xcaf4, 0xd2d5, 0xb275, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x08df, 0xb8d2, 0xc0b1, 0xc0b1, 0x3a7b, 0x03ff, 0x04df, 0x05bf, 0x067f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b77, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x20cf, 0x0918, 0x013a, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0139, 0x00f9, 0x10d2, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x9c78, 0x261b, 0x1b96, 0x3171, 0x30f0, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81f3, 0xaa73, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xca53, 0xca53, 0xca53, 0xd233, 0xca33, 0xca33, 0xd233, 0xc234, 0x7994, 0x5975, 0xb315, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xc375, 0x067f, 0x067f, 0x6c79, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc912, 0x34bb, 0x05fe, 0x05de, 0x05be, 0x059e, 0x055e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x249d, 0x347b, 0x6bfa, 0x7b99, 0x9b98, 0xab97, 0xdb95, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xbbd6, 0x9c37, 0x8499, 0x6d1a, 0x363c, 0x1edd, 0x079f, 0x07bf, 0x07df, 0x4e1b, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0x40fc, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x78d7, 0xc0b1, 0xc0b1, 0x61d8, 0x03bf, 0x049f, 0x057f, 0x065f, 0x071f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x10f3, 0x013a, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011a, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x5170, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0x6519, 0x22b3, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79b3, 0xa233, 0xd2b4, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xca94, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xd253, 0xca54, 0xca54, 0xca33, 0xd233, 0xca34, 0xca33, 0xca33, 0xa1d3, 0x5954, 0x5954, 0x79f5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd335, 0x8c18, 0x067f, 0x065f, 0x063f, 0xa2d5, 0xc9d3, 0xc972, 0xc952, 0xc111, 0xc8d1, 0x8a55, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x34dc, 0x6c5a, 0xa3f7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xbbb6, 0x84d9, 0x4e1b, 0x465c, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0x81d8, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x6098, 0xc0b1, 0xc0d1, 0x59b8, 0x035f, 0x045f, 0x055f, 0x063f, 0x06ff, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x58f1, 0x3911, 0x30f0, 0x3110, 0x30cf, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x08f6, 0x013a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ce, 0x20ae, 0x28ee, 0xcb55, 0xd375, 0xd375, 0xd375, 0xbb14, 0x34f9, 0x2930, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91f2, 0xc254, 0xca93, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xca73, 0xd273, 0xca73, 0xd254, 0xca53, 0xca53, 0xca54, 0xca33, 0xca34, 0xa1f3, 0x6973, 0x4953, 0x5134, 0x5154, 0xaaf5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd335, 0xd314, 0x5cda, 0x065f, 0x063f, 0x063f, 0xb254, 0xc972, 0xc952, 0xc112, 0xc8d1, 0xc0b1, 0xc0b1, 0x05be, 0x059e, 0x2d1c, 0x9438, 0xcbb6, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xca94, 0x087f, 0x003f, 0x001f, 0x001f, 0x001f, 0x385b, 0xc0b1, 0xc0b1, 0x9135, 0x031f, 0x043f, 0x053f, 0x063f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb8d1, 0x5911, 0x3911, 0x38f0, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x0917, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x011a, 0x00f9, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18cd, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x20ce, 0x8252, 0xd375, 0xd375, 0xd375, 0x9a93, 0x30ef, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81d2, 0xaa13, 0xba33, 0xca54, 0xca74, 0xca53, 0xca54, 0xca53, 0xca53, 0xb213, 0xa1f3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xd395, 0xd395, 0xd396, 0xd375, 0xd334, 0xd2f5, 0xd2b4, 0x2d9d, 0x063f, 0x063f, 0x061f, 0xc993, 0xc952, 0xc911, 0xc8f1, 0xc0b1, 0xc0b1, 0xb8d1, 0x059e, 0x057e, 0xabf7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd335, 0xcb15, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0x411c, 0x003f, 0x003f, 0x001f, 0x001f, 0x203c, 0xc0b1, 0xc0b1, 0x9135, 0x02ff, 0x041f, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa1b3, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x68f1, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x10f3, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x412f, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ce, 0x28cf, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3110, 0x38f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x38f1, 0x38f0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8a34, 0xd395, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xb2f6, 0x065f, 0x061f, 0x061f, 0x34dc, 0xc952, 0xc912, 0xc8d2, 0xc0b1, 0xc0d1, 0xb8d1, 0x89b4, 0x2bba, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71d4, 0x69f4, 0x71d3, 0x69d4, 0x71d3, 0x7a14, 0x8a75, 0x9274, 0x9254, 0x9254, 0x9a95, 0xb315, 0xbb14, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xcb14, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xcab4, 0xca94, 0xca94, 0x81b8, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0xa8b3, 0xc0b1, 0xb0d2, 0x02df, 0x03ff, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f2, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20cf, 0x0918, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20cd, 0x9272, 0xd375, 0xc334, 0x61d1, 0x20cf, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x30f0, 0x3110, 0x3110, 0x30f0, 0x3110, 0x38f0, 0x30f0, 0x38f0, 0x3111, 0x38f0, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xb2f5, 0xd395, 0xd375, 0xd355, 0xd2f4, 0xd2b4, 0xd274, 0x83b8, 0x063f, 0x061f, 0x061e, 0x6398, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61b3, 0x7a34, 0x9a95, 0xb2f5, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd274, 0xca74, 0xc254, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x5878, 0xb8d1, 0xc0b1, 0x02bf, 0x03bf, 0x04ff, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6478, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20cf, 0x0917, 0x011a, 0x011a, 0x0119, 0x08f4, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20cd, 0x18ce, 0x20ae, 0x390f, 0xd375, 0xcb35, 0x414f, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x30ef, 0x3110, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f1, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3910, 0x3911, 0x38f1, 0x3911, 0x3912, 0x4952, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xd2b4, 0xd274, 0xca33, 0x4c9a, 0x05ff, 0x061f, 0x05ff, 0xa1f4, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa0f1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xa274, 0xc315, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca74, 0xca74, 0xca74, 0xca54, 0x20fd, 0x009f, 0x007f, 0x005f, 0x003f, 0x105d, 0xc0b1, 0xc0d1, 0x029f, 0x03bf, 0x04df, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x61d0, 0xbb14, 0x412f, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28cf, 0x28f0, 0x30d0, 0x28ef, 0x28cf, 0x30cf, 0x30f0, 0x30d0, 0x30d0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x61b2, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xca74, 0xd233, 0xca13, 0x1d9d, 0x05ff, 0x05ff, 0x1d3d, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8a14, 0xaa74, 0xcaf4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xca94, 0xca73, 0xd274, 0xd253, 0xd254, 0x597a, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x005f, 0xa8b3, 0xc0b1, 0x31fc, 0x039f, 0x04df, 0x05df, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x390f, 0x28ce, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x71f2, 0xd335, 0xd2f4, 0xd2b4, 0xca74, 0xd233, 0xca13, 0xa295, 0x05ff, 0x05ff, 0x05ff, 0x5399, 0xc0d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9a34, 0xc2b4, 0xd2b5, 0xd2b3, 0xcab4, 0xd294, 0xd294, 0xca93, 0xd274, 0xd274, 0xca53, 0xca54, 0xca53, 0x81d8, 0x00df, 0x00df, 0x00df, 0x00bf, 0x00bf, 0x68b7, 0xb8d1, 0x31dc, 0x033f, 0x049f, 0x05df, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26bd, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d2, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x011a, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x8213, 0xd2f5, 0xcad4, 0xd274, 0xca53, 0xc9f3, 0xc9d2, 0x7398, 0x05ff, 0x05ff, 0x05df, 0xa953, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x98f2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f0, 0x38f0, 0x38f0, 0x38f0, 0x3911, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xca94, 0xd294, 0xca94, 0xd274, 0xca74, 0xd274, 0xca53, 0xca54, 0xca53, 0xca34, 0x99f6, 0x011f, 0x011f, 0x00ff, 0x00ff, 0x00ff, 0x38db, 0xc0b1, 0x28fc, 0x02df, 0x047f, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd335, 0xd2b4, 0xca94, 0xca33, 0xd1f3, 0xc9d3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc932, 0xc0d1, 0xc0b1, 0xb8d1, 0xb0d2, 0xb9f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x015f, 0x013f, 0x013f, 0x013f, 0x011f, 0x093f, 0xc0b1, 0x311c, 0x01bf, 0x03ff, 0x059f, 0x069f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2f4, 0xca74, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc111, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xca53, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x097f, 0x017f, 0x015f, 0x017f, 0x015f, 0x015f, 0x88f5, 0x293c, 0x013f, 0x02df, 0x053e, 0x067f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9234, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x10d0, 0x0118, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2b4, 0xd233, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0xb8d1, 0xc253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x31bc, 0x01bf, 0x019f, 0x019f, 0x019f, 0x019f, 0x5139, 0x315c, 0x017f, 0x01bf, 0x045e, 0x063e, 0x077f, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xcb15, 0xca13, 0xc9d3, 0xc992, 0xc932, 0xc911, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc397, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xc9f3, 0x31fc, 0x01df, 0x01df, 0x01df, 0x01df, 0x01df, 0x01bf, 0x01df, 0x01bf, 0x01bf, 0x02df, 0x05fd, 0x073e, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8ab5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb0f1, 0xba95, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9f3, 0x31fd, 0x021f, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01df, 0x01ff, 0x051d, 0x071d, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6bf7, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc9d3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb152, 0xd79e, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x323c, 0x023f, 0x023f, 0x021f, 0x023f, 0x023f, 0x021f, 0x021f, 0x021f, 0x021f, 0x021f, 0x037e, 0x06dc, 0x07fd, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0x7911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc972, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xd63c, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x325c, 0x027f, 0x025f, 0x025f, 0x025f, 0x023f, 0x025f, 0x025f, 0x023f, 0x023f, 0x023f, 0x029f, 0x067c, 0x07fc, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d1, 0x70f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xc951, 0xc912, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xbb97, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, 0xc9b3, 0x327c, 0x029f, 0x029f, 0x029f, 0x029f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x025f, 0x027f, 0x05bc, 0x07db, 0x07fc, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x58f1, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x011a, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ae, 0x18d0, 0x0118, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa8f1, 0xa972, 0xd77e, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc193, 0x0a7f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x027f, 0x029f, 0x027f, 0x04dd, 0x07bb, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0x5911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xa911, 0xbc78, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, 0x089f, 0x011f, 0x031f, 0x02ff, 0x02ff, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x03fd, 0x079a, 0x07fa, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x2e5c, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb8d1, 0x5912, 0x3911, 0x38f1, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x007f, 0x009e, 0x023f, 0x033f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02df, 0x039e, 0x075a, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0x009f, 0x009f, 0x013f, 0x033f, 0x037f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x033f, 0x06f9, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb0f1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0d1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x3110, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, 0x007f, 0x007f, 0x00ff, 0x027f, 0x039f, 0x039f, 0x037f, 0x231d, 0x5259, 0x5a3a, 0x033f, 0x033f, 0x031f, 0x031f, 0x0699, 0x07f8, 0x07fa, 0x07fd, 0x07ff, 0x07ff, 0x363c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4112, 0x38f1, 0x3911, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x0915, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, 0x007f, 0x007f, 0x00bf, 0x021f, 0x2abd, 0x7a36, 0xb953, 0xc112, 0xc911, 0xc912, 0x0b3f, 0x035f, 0x035f, 0x033f, 0x05fa, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa0f1, 0x68f1, 0x4111, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, 0x007f, 0x007f, 0x30bb, 0x9955, 0xc931, 0xc932, 0xc932, 0xc912, 0xc0f2, 0xc8f2, 0x32fc, 0x037f, 0x037f, 0x037f, 0x059b, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d2, 0xb0d1, 0xb0f1, 0x98f1, 0xb0f1, 0x88f1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0x087e, 0x70f8, 0xc952, 0xc932, 0xc912, 0xc932, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0x331c, 0x03bf, 0x039f, 0x039f, 0x051b, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa0f1, 0xb0f1, 0xb0d1, 0x50f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, 0x9915, 0xc932, 0xc932, 0xc932, 0xc912, 0xc111, 0xc8f2, 0xc0f2, 0xc8d1, 0xc8d1, 0x333c, 0x03ff, 0x03df, 0x03bf, 0x04dc, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f1, 0xc8d1, 0xc8d1, 0xc8d1, 0x335c, 0x041f, 0x03ff, 0x03ff, 0x047d, 0x0795, 0x07f6, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0x40f0, 0x28cf, 0x28ef, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, 0x309c, 0x005f, 0x58b9, 0xc912, 0xc111, 0xc8f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x337c, 0x045f, 0x041f, 0x041f, 0x045e, 0x0775, 0x07f5, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0x80f1, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, 0x003f, 0x003f, 0x005f, 0x78d7, 0xc0f2, 0xc8f1, 0xc0d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x4b1a, 0x047f, 0x045f, 0x043f, 0x045f, 0x0735, 0x07f4, 0x07f9, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa0f1, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0x003f, 0x003f, 0x005f, 0x58b9, 0xc0f1, 0xc0d1, 0xc8d1, 0xc8b2, 0xc0b1, 0xc0b1, 0x62b8, 0x04bf, 0x047f, 0x047f, 0x045f, 0x0715, 0x07f4, 0x07f9, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa8f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0x58f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0x001f, 0x003f, 0x003f, 0x00df, 0x88f6, 0xc8d1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0x62d9, 0x04ff, 0x04bf, 0x049f, 0x047f, 0x06b6, 0x07f3, 0x07f8, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0x98f2, 0xb0f1, 0xb0f1, 0xb0f1, 0x78f0, 0x90f1, 0x80d1, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, 0x001f, 0x003f, 0x003f, 0x00bf, 0x311c, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x6278, 0x053f, 0x04ff, 0x04bf, 0x049f, 0x0696, 0x07f2, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x8912, 0xb0f1, 0xb0f1, 0xb0d1, 0x48f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0x003f, 0x003f, 0x003f, 0x00bf, 0x011f, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x79d6, 0x051f, 0x051f, 0x04ff, 0x04bf, 0x0638, 0x07f1, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0f1, 0x80f2, 0xb0f1, 0xb0f1, 0xb0f2, 0x3110, 0x30f0, 0x28cf, 0x28ef, 0x20ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0x003f, 0x003f, 0x001f, 0x009f, 0x00df, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9174, 0x049f, 0x057f, 0x051f, 0x04ff, 0x0619, 0x07f1, 0x07f6, 0x07fc, 0x07ff, 0x35bb, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x6912, 0xb0f1, 0xb0f1, 0x98f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00fa, 0x011a, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x68b7, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa8f3, 0x041f, 0x057f, 0x053f, 0x051f, 0x05f9, 0x07f0, 0x07f6, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x5912, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0x001f, 0x001f, 0x001f, 0x007f, 0x00bf, 0x009f, 0x90b5, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x0b9e, 0x053f, 0x057f, 0x053f, 0x05da, 0x07ef, 0x07f5, 0x07fb, 0x07ff, 0x5478, 0xb0d1, 0xb0f1, 0xb0f1, 0x9111, 0x5912, 0xa8f1, 0xb0f1, 0x70f1, 0x30f0, 0x28ef, 0x20ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x6098, 0xc0b1, 0xb8b1, 0xc0b1, 0xc0b1, 0x2afc, 0x04ff, 0x05bf, 0x055f, 0x05fb, 0x07cf, 0x07f4, 0x07fc, 0x07ff, 0x5c79, 0xb0f1, 0xb0f1, 0xb0f1, 0x8112, 0x5912, 0xb0f1, 0xb0f1, 0x68f1, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x005f, 0x7897, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0x6238, 0x04df, 0x05bf, 0x059f, 0x05fa, 0x07ce, 0x07f4, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x7112, 0x5912, 0xb0f1, 0xa8f1, 0x5110, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x28cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x007f, 0x6878, 0xb8b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x9954, 0x047f, 0x05bf, 0x05bf, 0x061a, 0x07ce, 0x07f2, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x6112, 0x5912, 0xa8f1, 0xa8f1, 0x60f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x003f, 0x001f, 0x7076, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x0bff, 0x05df, 0x05bf, 0x0639, 0x07cd, 0x07f2, 0x07fc, 0x07ff, 0x63f7, 0xb0f1, 0xb0f1, 0xb0f1, 0x4132, 0x4111, 0xa0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x001f, 0x001f, 0x9894, 0xb8d1, 0xb8d1, 0xb8d1, 0x42da, 0x059f, 0x05ff, 0x0678, 0x07cc, 0x07f1, 0x07fc, 0x07ff, 0x82b5, 0xa8f1, 0xb0f1, 0x98f2, 0x4132, 0x3912, 0x70f1, 0xa8f1, 0xa8f1, 0x50f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x183e, 0xb0d2, 0xb8d1, 0xb8d1, 0x9974, 0x059f, 0x061f, 0x0698, 0x07cc, 0x07f0, 0x07fc, 0x07ff, 0x82b5, 0xb0f1, 0xb0f1, 0x88f1, 0x4132, 0x4111, 0x3910, 0x98f1, 0xa8f2, 0x88f1, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x385b, 0xb8d1, 0xb8d1, 0xb8d1, 0x2c3c, 0x061f, 0x06b7, 0x07cb, 0x07f0, 0x07fb, 0x07ff, 0xb0f1, 0xb0f1, 0xa8f1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xa0f1, 0xa8f1, 0x48ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x7096, 0xb8d1, 0xb8d1, 0x8a35, 0x063f, 0x06d6, 0x07ea, 0x07f1, 0x07fc, 0x07ff, 0xa8f1, 0xa8f1, 0xa8f1, 0x6132, 0x4132, 0x4111, 0x38f1, 0x3110, 0x48f0, 0xa8f1, 0x98f1, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x98b4, 0xb8d1, 0xb8d1, 0x3c9b, 0x06f5, 0x07e9, 0x07f1, 0x07fd, 0x26bd, 0xb0f1, 0xb0f2, 0xb0f1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30f0, 0x60f0, 0xa911, 0x70f0, 0x20ce, 0x20cf, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x083f, 0x70f7, 0xb8d1, 0xa952, 0x0e94, 0x07c9, 0x07f2, 0x07fd, 0x2e3c, 0xa8f1, 0xa8f1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x58f0, 0xa8f1, 0x40cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x00f9, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x003f, 0x00df, 0x59f8, 0xb8d1, 0x8291, 0x07c9, 0x07f2, 0x07fe, 0x455a, 0xb0f1, 0xa8f1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x50cf, 0x48ef, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x031f, 0x2d3b, 0x99b2, 0x454b, 0x07f3, 0x07fe, 0x5498, 0xb0f1, 0xa8f1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x003f, 0x005f, 0x025f, 0x06fd, 0x0770, 0x0f88, 0x07f4, 0x07ff, 0x5478, 0xa8f1, 0xa8f1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x021f, 0x06fc, 0x078d, 0x07e7, 0x07f6, 0x07ff, 0x82b5, 0xa8f1, 0xa111, 0x4932, 0x4132, 0x4111, 0x38f1, 0x38f0, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x005f, 0x021f, 0x073b, 0x07ac, 0x07e7, 0x07f7, 0x07ff, 0x82b5, 0xa8f1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x10cf, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x023f, 0x073b, 0x07ab, 0x07e8, 0x07f9, 0x07ff, 0xa152, 0xa8f1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x005f, 0x007f, 0x009f, 0x023f, 0x0779, 0x07aa, 0x07e8, 0x07fb, 0x07ff, 0xa8f1, 0xa8f1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x0116, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdb0, 0xfdb0, 0xfdb1, 0xfdd1, 0xe4b2, 0xa911, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x02bf, 0x0778, 0x07c8, 0x07e9, 0x07fd, 0x173e, 0xa8f1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfdef, 0xfdf0, 0xfdf0, 0xfdf0, 0xfdf1, 0xfdf1, 0xecb1, 0xa0f1, 0xa911, 0xa911, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x005f, 0x007f, 0x009f, 0x009f, 0x041f, 0x0797, 0x07c7, 0x07eb, 0x07fe, 0x2e5c, 0xa8f1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0f, 0xfe30, 0xfe30, 0xfe30, 0xfe31, 0xfe31, 0xdc32, 0xa111, 0xa911, 0xa111, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x043f, 0x0794, 0x07e6, 0x07ec, 0x07fe, 0x35db, 0xa911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ac, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x00f8, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe50, 0xfe71, 0xfe51, 0xba52, 0xa111, 0xa111, 0x78d5, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x043f, 0x07b3, 0x07c5, 0x07ee, 0x07ff, 0x5478, 0x6ad6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f8, 0x18cf, 0x18ac, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe90, 0xfe91, 0xe471, 0xa111, 0xa112, 0xa111, 0x60d5, 0x001f, 0x283c, 0x7097, 0x405a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x00df, 0x045f, 0x07d2, 0x07e4, 0x07ef, 0x07ff, 0x2e3c, 0x2d1a, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x00f6, 0x0118, 0x00f7, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfeaf, 0xfed0, 0xfeb0, 0xfed1, 0xe491, 0xa911, 0xa111, 0x9931, 0xa111, 0x58d6, 0x88b5, 0xb8d1, 0xb8d1, 0x5059, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x00df, 0x047f, 0x07d2, 0x07e3, 0x07f1, 0x07ff, 0x07ff, 0x2cba, 0x4933, 0x4132, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f6, 0x0118, 0x0118, 0x18cf, 0x20ad, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x20ad, 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfed0, 0xfeb0, 0xfeb1, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x6933, 0xb0f1, 0xb0d1, 0xb0d1, 0x283c, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x011f, 0x047f, 0x07d1, 0x07e3, 0x07f3, 0x07ff, 0x07ff, 0x3b77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30ef, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cd, 0x18ac, 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfeb0, 0xfe90, 0xe471, 0xb8d2, 0xa111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xb0f1, 0xb0d1, 0xb0d2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x00df, 0x011f, 0x011f, 0x049f, 0x07f0, 0x07e2, 0x07f4, 0x07ff, 0x07ff, 0x3af6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ee, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, - 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfeb0, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xb0f1, 0xb0d1, 0x90b4, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x049f, 0x07f1, 0x07e2, 0x07f6, 0x07ff, 0x0f9f, 0x4a35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, - 0x18ce, 0x18ac, 0x20cc, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x18cc, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xe471, 0xb0d1, 0xa111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xb0d1, 0xb0d1, 0x7896, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x00bf, 0x011f, 0x011f, 0x013f, 0x017f, 0x04bf, 0x07f2, 0x07e2, 0x07f5, 0x07ff, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xa8f1, 0xa111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xb0d1, 0xb0d1, 0x5878, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00ff, 0x013f, 0x013f, 0x017f, 0x019f, 0x033f, 0x07f3, 0x07e2, 0x07f3, 0x07ff, 0xa8f1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x18cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xb0f1, 0xb0f1, 0x285c, 0x003f, 0x005f, 0x007f, 0x00bf, 0x00ff, 0x013f, 0x015f, 0x017f, 0x019f, 0x01bf, 0x02ff, 0x07f4, 0x07e3, 0x07f1, 0x2e5c, 0xa911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, - 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xb0f1, 0xb0d1, 0x087f, 0x009f, 0x00bf, 0x00df, 0x011f, 0x015f, 0x019f, 0x019f, 0x019f, 0x01df, 0x01df, 0x01ff, 0x07f7, 0x07e3, 0x07ef, 0x5498, 0xa8f1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xb0f1, 0x98f3, 0x00df, 0x00ff, 0x011f, 0x013f, 0x017f, 0x01bf, 0x01bf, 0x01df, 0x01df, 0x01ff, 0x01ff, 0x021f, 0x06d9, 0x07e5, 0x07ec, 0x7355, 0xa8f1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390f, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xa111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xa8f1, 0xb0f1, 0x80f5, 0x013f, 0x017f, 0x019f, 0x01bf, 0x01df, 0x01ff, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x023f, 0x057d, 0x07e8, 0x07e9, 0x82d5, 0xa0f1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38f0, 0x38ef, 0x30ef, 0x30ee, 0x28ce, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ad, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ce, 0x28ee, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ee, 0x38ef, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xa932, 0xa131, 0xb131, 0xc912, 0xc911, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0x5158, 0x01bf, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x021f, 0x023f, 0x025f, 0x025f, 0x025f, 0x025f, 0x041f, 0x07ed, 0x07e4, 0x7ab4, 0xa911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20cc, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ad, 0x28ce, 0x30ce, 0x30ce, 0x30ee, 0x8151, 0xb192, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d2, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x39bb, 0x021f, 0x023f, 0x025f, 0x027f, 0x027f, 0x025f, 0x025f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x029f, 0x07f3, 0x07e2, 0x9972, 0xa911, 0xa112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18cc, 0x18ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x18ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30cd, 0x28ee, 0x30ee, 0x490e, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f2, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d2, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0x123e, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x02df, 0x06b9, 0x07e3, 0xa111, 0xa911, 0xa111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390f, 0x38ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x18ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30ed, 0x692f, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc8f1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x9933, 0x02df, 0x02df, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02ff, 0x051e, 0x07e8, 0xa912, 0xa111, 0xa111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410f, 0x390f, 0x38ee, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x28ac, 0x20cc, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cd, 0x28ed, 0x28cd, 0x30cd, 0x9191, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc932, 0xc912, 0xc112, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8d1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88b4, 0x88b5, 0x88b5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x69d6, 0x033f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02ff, 0x035f, 0x03ff, 0x07f0, 0x8a4f, 0xa111, 0xa111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410f, 0x390f, 0x30ee, 0x30ee, 0x30cd, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cc, 0x20ac, 0x28cc, 0x28cc, 0x28cc, 0x20cc, 0x28cc, 0x28cc, 0x28cd, 0x40ee, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0x90d5, 0x88d6, 0x6098, 0x5879, 0x303c, 0x305c, 0x081e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x291c, 0x411a, 0x6118, 0x8915, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0x429a, 0x039f, 0x039f, 0x035f, 0x035f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x031f, 0x031f, 0x031f, 0x037f, 0x03ff, 0x06d7, 0x7acf, 0xa111, 0xa111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410f, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cc, 0x490e, 0xc1d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc952, 0x98f5, 0x60b8, 0x407b, 0x183e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x011f, 0x013f, 0x017f, 0x019f, 0x01df, 0x021f, 0x21fd, 0x49d9, 0x7996, 0xa112, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x139e, 0x03df, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x033f, 0x033f, 0x035f, 0x03bf, 0x041f, 0x05de, 0x7ad1, 0xa111, 0xa111, 0xa111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x692f, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc992, 0xc9b2, 0xc972, 0xb973, 0x80f7, 0x387b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01bf, 0x01ff, 0x023f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x2adc, 0x5a58, 0x8994, 0xa8f1, 0xa8f1, 0x81d4, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x039f, 0x037f, 0x035f, 0x037f, 0x039f, 0x03ff, 0x047f, 0x04ff, 0x6375, 0xa112, 0xa111, 0xa111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390f, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x692e, 0xc9f3, 0xc9d2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc993, 0x80f7, 0x389b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x083c, 0x085b, 0x105b, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187a, 0x105b, 0x085d, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x01bf, 0x01ff, 0x021f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03df, 0x041f, 0x043f, 0x0c3f, 0x2bbc, 0x0c3f, 0x045f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03bf, 0x039f, 0x037f, 0x039f, 0x03df, 0x043f, 0x04bf, 0x053f, 0x5398, 0xa111, 0xa111, 0xa111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cb, 0x614e, 0xd1f3, 0xc9f3, 0xc9d3, 0xc9b2, 0xc9b3, 0xb173, 0x60d9, 0x081e, 0x003d, 0x083b, 0x1878, 0x1877, 0x28d2, 0x28d2, 0x40ee, 0x38ee, 0x390f, 0x390f, 0x390f, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4130, 0x38f3, 0x28b6, 0x189a, 0x003e, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x027f, 0x029f, 0x02ff, 0x033f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x047f, 0x04bf, 0x04df, 0x04df, 0x04bf, 0x04bf, 0x047f, 0x047f, 0x043f, 0x043f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03df, 0x043f, 0x047f, 0x04df, 0x057f, 0x3c1a, 0xa111, 0xa111, 0xa111, 0xa111, 0x5931, 0x4910, 0x4110, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x20cb, 0x28ab, 0x692e, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xb1b2, 0x58f3, 0x1895, 0x28b2, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x492f, 0x4930, 0x4910, 0x38f3, 0x20b8, 0x087d, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x019f, 0x01df, 0x021f, 0x025f, 0x02bf, 0x02df, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x04ff, 0x051f, 0x051f, 0x053f, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x047f, 0x047f, 0x045f, 0x045f, 0x043f, 0x041f, 0x03ff, 0x03df, 0x03ff, 0x043f, 0x045f, 0x04bf, 0x053f, 0x05bf, 0x2cdc, 0xa112, 0xa111, 0xa111, 0xa111, 0x7131, 0x4930, 0x4130, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28cb, 0x28cb, 0x612e, 0xc9f3, 0xc9d3, 0xc9d3, 0xb992, 0x692e, 0x28cc, 0x28ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x390e, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x38ee, 0x40ee, 0x40ee, 0x390f, 0x390e, 0x410e, 0x40ef, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4910, 0x4910, 0x4930, 0x4113, 0x28f8, 0x08fe, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x029f, 0x02bf, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x051f, 0x053f, 0x057f, 0x059f, 0x057f, 0x055f, 0x053f, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x049f, 0x047f, 0x045f, 0x043f, 0x041f, 0x041f, 0x043f, 0x045f, 0x04bf, 0x04ff, 0x055f, 0x05df, 0x0e1f, 0xa111, 0xa111, 0xa111, 0xa112, 0x8931, 0x4930, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x20cb, 0x612e, 0xd1f3, 0xc9f3, 0xc1b2, 0x612e, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197a, 0x01de, 0x021f, 0x027f, 0x02bf, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03ff, 0x045f, 0x049f, 0x04df, 0x051f, 0x057f, 0x059f, 0x05df, 0x05df, 0x05df, 0x05bf, 0x059f, 0x055f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04bf, 0x047f, 0x045f, 0x043f, 0x043f, 0x047f, 0x04bf, 0x04ff, 0x053f, 0x05bf, 0x061f, 0x069f, 0x9972, 0xa111, 0xa111, 0xa111, 0xa111, 0x5130, 0x4910, 0x410f, 0x390f, 0x390e, 0x38ed, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x510d, 0xd1f3, 0xc9d2, 0x816f, 0x30cc, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31b6, 0x0a9d, 0x02ff, 0x035f, 0x039f, 0x03ff, 0x043f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x05bf, 0x05df, 0x061f, 0x063f, 0x063f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x047f, 0x047f, 0x047f, 0x049f, 0x04df, 0x053f, 0x057f, 0x05ff, 0x065f, 0x06df, 0x7a95, 0xa111, 0xa111, 0xa111, 0xa111, 0x6911, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x40ec, 0xc1d2, 0xc1b3, 0x490d, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39d5, 0x131c, 0x041f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x059f, 0x05df, 0x061f, 0x067f, 0x069f, 0x069f, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x051f, 0x057f, 0x05bf, 0x063f, 0x069f, 0x071f, 0x5438, 0xa111, 0xa111, 0xa111, 0xa111, 0x8111, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x30cb, 0xa992, 0xa9b1, 0x30cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3a15, 0x237b, 0x053f, 0x059f, 0x5358, 0x349b, 0x0e1f, 0x06bf, 0x06ff, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x057f, 0x055f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04ff, 0x051f, 0x055f, 0x059f, 0x05ff, 0x065f, 0x06df, 0x073f, 0x359b, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x4930, 0x4910, 0x412f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x692f, 0x816f, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28cb, 0x28cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49d4, 0x243a, 0xa132, 0xa8f1, 0xa8f1, 0xa8f1, 0x8295, 0x8295, 0x5418, 0x351b, 0x06df, 0x069f, 0x067f, 0x065f, 0x063f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x051f, 0x053f, 0x057f, 0x059f, 0x05df, 0x063f, 0x069f, 0x06ff, 0x077f, 0x0f5f, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0x6911, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ee, 0x38ed, 0x38ed, 0x390e, 0x390e, 0x390e, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa172, 0x4c39, 0x2d5c, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x059f, 0x057f, 0x055f, 0x055f, 0x055f, 0x057f, 0x059f, 0x05df, 0x061f, 0x067f, 0x06df, 0x073f, 0x079f, 0x07df, 0x8254, 0xa111, 0xa131, 0xa111, 0x9911, 0x8131, 0x4910, 0x410f, 0x410e, 0x38ee, 0x38ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xa111, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa111, 0xa911, 0xa0f1, 0x9972, 0x4419, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05df, 0x061f, 0x065f, 0x06bf, 0x06ff, 0x075f, 0x07bf, 0x07ff, 0x5498, 0xa131, 0xa111, 0xa111, 0xa111, 0x9911, 0x4930, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x28cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x490f, 0x412f, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa111, 0x7a55, 0x34bb, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x063f, 0x065f, 0x069f, 0x06df, 0x071f, 0x077f, 0x07bf, 0x07ff, 0x2e3c, 0x9911, 0xa111, 0xa111, 0x9931, 0x9931, 0x6910, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x62f6, 0x347b, 0x061f, 0x061f, 0x063f, 0x063f, 0x065f, 0x067f, 0x06bf, 0x071f, 0x073f, 0x079f, 0x07df, 0x07ff, 0x07ff, 0xa111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x349b, 0x065f, 0x067f, 0x069f, 0x06bf, 0x06ff, 0x073f, 0x077f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0xa111, 0x9911, 0xa111, 0x9931, 0x9931, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa911, 0xa112, 0xa111, 0xa911, 0xa111, 0xa112, 0xa0f1, 0xa111, 0xa111, 0xa111, 0x7a75, 0x15fd, 0x06bf, 0x06ff, 0x071f, 0x075f, 0x079f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410f, 0x390e, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x40ee, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x5931, 0x90f1, 0xa911, 0xa912, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0x9972, 0x353b, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x8111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa112, 0xa111, 0xa111, 0x4499, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9931, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490f, 0x410f, 0x38ee, 0x30ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x28ab, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x310e, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x7131, 0xa111, 0xa111, 0xa112, 0xa111, 0xa0f1, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa131, 0x6397, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390f, 0x38ee, 0x38ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x38ee, 0x30ed, 0x38ed, 0x390e, 0x38ee, 0x410e, 0x410f, 0x410f, 0x4930, 0x4930, 0x6931, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x6397, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x5c14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410f, 0x390e, 0x390e, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x30ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0x9931, 0x5498, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x35f5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510f, 0x390e, 0x390e, 0x38ed, 0x30ed, 0x30cc, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x28cb, 0x20cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xa111, 0xa111, 0xa111, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa111, 0xa111, 0x3d7a, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28ab, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28cb, 0x20ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x9192, 0x1ebd, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x7a71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20ab, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ac, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cc, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x28ce, 0x28ce, 0x28ce, 0x28ee, 0x28ce, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ef, 0x390f, 0x390f, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xa111, 0xa111, 0xa111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07ff, 0x07ff, 0x07fd, 0x07f6, 0x5c32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390f, 0x30ef, 0x30ef, 0x30ee, 0x30ce, 0x28cd, 0x28ee, 0x28ed, 0x28cd, 0x20cd, 0x20ac, 0x20cd, 0x20cd, 0x20ad, 0x20cd, 0x20ad, 0x20cc, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, - 0x18d2, 0x10f2, 0x18d2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x20f2, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xa111, 0xa111, 0x9931, 0x9911, 0xa111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5c38, 0x07ff, 0x07fd, 0x07f6, 0x44f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x1912, 0x18f2, 0x20f3, 0x18f2, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, - 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28f3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xa111, 0xa112, 0xa111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2e5c, 0x07fc, 0x07f6, 0x2e53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20f3, 0x2112, 0x20f3, 0x20d3, 0x1912, 0x18f2, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, - 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x365e, 0x2e5d, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3d, 0x363d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x361d, 0x361d, 0x361d, 0x361d, 0x361d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1e, 0x461e, 0x461d, 0x4dfe, 0x4dfd, 0x4e3e, 0x4dfe, 0x55dd, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7a74, 0x07fb, 0x07f6, 0x07f6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4cfb, 0x3dfe, 0x35dd, 0x35dd, 0x2ddd, 0x2ddd, 0x2ddd, 0x2ddd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25dc, 0x25bd, 0x25bd, 0x25bd, 0x1dbd, 0x25bc, 0x1dbd, 0x1dbd, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, - 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2ddd, 0x2d5d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2dbd, 0x2dbd, 0x2cfd, 0x2d1d, 0x251c, 0x251c, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3d1d, 0x451d, 0x451d, 0x451d, 0x4d1d, 0x4d1d, 0x553d, 0x91b3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa112, 0x9931, 0x9931, 0x5496, 0x07f7, 0x07f7, 0x8a13, 0xa111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34dd, 0x34dd, 0x2cdd, 0x2cdc, 0x2cdd, 0x2cbc, 0x24dc, 0x24bc, 0x24bc, 0x253c, 0x25bd, 0x253c, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, - 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b7c, 0x259d, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x245d, 0x259c, 0x22fc, 0x2afc, 0x231c, 0x2afc, 0x22fc, 0x231c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2afc, 0x2b1c, 0x2b1c, 0x2b1c, 0x331c, 0x331c, 0x331c, 0x331c, 0x331c, 0x3b1c, 0x3b3d, 0x3b3d, 0x3b3d, 0x433c, 0x433d, 0x4b3d, 0x435d, 0x5a9a, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07f9, 0x72d4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331c, 0x32fc, 0x2afb, 0x2afc, 0x2afb, 0x22fb, 0x22dc, 0x22dc, 0x22fb, 0x22db, 0x22db, 0x235c, 0x1d5c, 0x1d1d, 0x231b, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, - 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x243c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x259c, 0x247c, 0x23bc, 0x23bc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23bc, 0x23bc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x33dc, 0x33dc, 0x33dc, 0x33dc, 0x3bdc, 0x3bfc, 0x3bfc, 0x3bdc, 0x43fc, 0x43fd, 0x6b18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6b53, 0x07fa, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbb, 0x23bb, 0x23bb, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bdb, 0x1d5c, 0x1d1c, 0x1b9b, 0x1b9b, 0x139b, 0x139c, 0x1b9b, 0x1b7b, 0x1b7b, 0x139b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b9b, 0x139b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, - 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1b9c, 0x1bdc, 0x1bbb, 0x1c5b, 0x1cfb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1d3c, 0x1cbc, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9c, 0x1b9c, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9c, 0x1b9b, 0x1bbb, 0x239b, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbc, 0x33bc, 0x33bc, 0x33dc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4c98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4b19, 0x23bc, 0x239b, 0x239b, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x14bb, 0x151b, 0x13db, 0x137b, 0x137a, 0x137b, 0x137b, 0x137a, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, - 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19da, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19db, 0x19da, 0x19db, 0x19fb, 0x153c, 0x123a, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x11db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x19db, 0x19ba, 0x11da, 0x11ba, 0x1abb, 0x14fb, 0x1a5b, 0x19ba, 0x19ba, 0x11da, 0x11da, 0x19db, 0x19db, 0x19da, 0x19db, 0x19ba, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x21db, 0x21db, 0x21db, 0x21fb, 0x21fb, 0x29fb, 0x29fb, 0x29fb, 0x29fb, 0x31fb, 0x321b, 0x31fb, 0x321b, 0x41fa, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72d4, 0x4c98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21db, 0x21da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11d9, 0x137a, 0x149b, 0x131a, 0x11ba, 0x119a, 0x11b9, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, - 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133a, 0x135b, 0x135a, 0x135b, 0x135b, 0x149b, 0x13fb, 0x133a, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x133a, 0x135a, 0x133a, 0x143b, 0x147b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133a, 0x135b, 0x133b, 0x133b, 0x1b3b, 0x1b5b, 0x1b5b, 0x1b3b, 0x1b5b, 0x235b, 0x235b, 0x235b, 0x235b, 0x2b5b, 0x2b5b, 0x2b7b, 0x2b7b, 0x335b, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72d5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71b4, 0x1b3b, 0x1b3b, 0x133a, 0x133b, 0x133a, 0x131a, 0x131a, 0x131a, 0x131a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0afa, 0x0b1a, 0x0afa, 0x0bda, 0x0cbb, 0x0bda, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, - 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b7a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bda, 0x0c7b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x131a, 0x131a, 0x131a, 0x131a, 0x131a, 0x1b1a, 0x1b3a, 0x1b3a, 0x1b3a, 0x1b3a, 0x233a, 0x233a, 0x233b, 0x2b3b, 0x2b5b, 0x3ad9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1b1a, 0x131a, 0x131a, 0x12fa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x035a, 0x045a, 0x0c3a, 0x0afa, 0x02da, 0x0afa, 0x0af9, 0x02f9, 0x0afa, 0x0afa, 0x0afa, 0x02d9, 0x02d9, - 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0bfa, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0bda, 0x02d9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199a, 0x1999, 0x2199, 0x219a, 0x21ba, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01d8, 0x0399, 0x0399, 0x01d9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, - 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02b9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01d8, 0x03f9, 0x01f8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03f9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, - 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03f9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03b9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01b7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, - 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0af8, 0x0af8, 0x0af8, 0x0af8, 0x0b18, 0x0b18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1b18, 0x2af8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0af8, 0x0af8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x0378, 0x0378, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d8, - 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01f7, 0x0358, 0x0196, 0x0196, 0x01b6, 0x0196, 0x01b6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02f7, 0x02f7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01b6, 0x01b6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09b7, 0x0997, 0x09b7, 0x09b7, 0x09b7, 0x11b7, 0x11b7, 0x11d7, 0x11b7, 0x11b7, 0x11b7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09b6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02b7, 0x0337, 0x0216, 0x0196, 0x0196, - 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f5, 0x00d5, 0x00d5, 0x00d6, 0x00d6, 0x00d5, 0x00f5, 0x02f7, 0x0176, 0x00f5, 0x00d5, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x0116, 0x02f7, 0x01d6, 0x00d6, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x08f6, 0x08f6, 0x08f6, 0x08f6, 0x0916, 0x0916, 0x10f6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08f5, 0x08f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x01d6, 0x02f7, 0x0236, 0x0114, - 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01f5, 0x0235, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x0154, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x08d4, 0x08d4, 0x08d4, 0x08f4, 0x08f4, 0x08f4, 0x08f5, 0x10f4, 0x10d5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00d3, 0x00d3, 0x0214, 0x0295, - 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x0293, 0x00d2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0172, 0x0253, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x08b2, 0x08b2, 0x08b2, 0x08d2, 0x08b2, 0x08d2, 0x08d3, 0x10d3, 0x40f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00d2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0131, - 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x0171, 0x0091, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x01d1, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f1, 0x0171, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00b0, 0x00b0, 0x00b1, 0x08b1, 0x08b0, 0x08b1, 0x08b1, 0x50f1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, - 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00f0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f0, 0x0232, 0x00f1, 0x00b0, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0890, 0x08b0, 0x0891, 0x10b0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0191, 0x01b1, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x006f, 0x008f, 0x0131, 0x0232, 0x00d0, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60f1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006f, 0x0090, 0x006f, 0x008f, 0x008f, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00cf, 0x0232, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x0191, 0x0212, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x18af, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9931, 0xa111, 0x29d2, 0x01b1, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x01d1, 0x0130, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x01f1, 0x01b1, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28d0, 0x01f2, 0x01d1, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0110, 0x01f1, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x0110, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x48d0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008e, 0x008f, 0x01b1, 0x01f2, 0x00af, 0x006f, 0x006e, 0x008f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x108f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006e, 0x006f, 0x006e, 0x0190, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0170, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01f1, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x68f0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0211, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01b1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x38b0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x010f, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x01d1, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x008e, 0x01f1, 0x012f, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x086e, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0211, 0x0190, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004d, 0x004d, 0x004e, 0x010f, 0x01d1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x00ce, 0x0212, 0x00ce, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x70f0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x008e, 0x01d1, 0x0190, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006e, 0x01f1, 0x008e, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x010f, 0x01f1, 0x006d, 0x006d, 0x004d, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004e, 0x006d, 0x006d, 0x004d, 0x40cf, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70f0, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0191, 0x01b1, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x28EE, 0x8252, 0xCB54, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x394F, 0xB313, 0xD395, 0x7211, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18CD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x496F, 0xCB55, 0xD395, 0xBB54, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x208D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00FA, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x61D0, 0xD395, 0xD395, 0xD395, 0x69F1, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x61D0, 0xD395, 0xD395, 0xD396, 0xD375, 0x310E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x011A, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18CE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x392F, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10F2, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x8252, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x5190, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AF, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18EE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F9, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10F2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x08D5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x8252, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x412F, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0355, 0x190F, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F4, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0x496F, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x11D1, 0x03B7, 0x0A93, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x28EE, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9AB3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x00F9, 0x00F9, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x10AF, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x208D, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0356, 0x03B7, 0x03B7, 0x190F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x7A31, 0xD395, 0xD395, 0xD375, 0xDB95, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x11D1, 0x03B8, 0x03B7, 0x03B8, 0x0A94, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x00F9, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x08F5, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0xD395, 0xD395, 0xB313, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0356, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x190E, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0xA2D3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xA2D3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x11D1, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0A94, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAAD3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0356, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x190F, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x61D0, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0397, 0x03B8, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x59D0, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x011A, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D1, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAAD3, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x61B1, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x8A92, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x188D, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x03B8, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0xAAD3, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0x310E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x10D1, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03D7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B8, 0x0397, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0x7231, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x10D3, 0x08D3, 0x10D2, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x20AE, 0x8A92, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x7A31, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x28EE, 0xC374, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xA2D3, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CE, 0x194F, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B8, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x61D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0x69F1, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1930, 0x02F5, 0x03B7, 0x03B8, 0x0356, 0x114F, 0x18AD, 0x18AD, 0x18AD, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x03B7, 0x03B8, 0x03B7, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F4, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x9AB3, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0x412F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x190F, 0x0377, 0x0397, 0x03B8, 0x0398, 0x0397, 0x0B77, 0x18CE, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B8, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x0BB7, 0x0398, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0xC355, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x4970, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x1253, 0x0B78, 0x0B98, 0x0B78, 0x0B98, 0x0B98, 0x1378, 0x11F2, 0x18AD, 0x18AD, 0x0B98, 0x0B78, 0x0B78, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0B98, 0x1378, 0x0B78, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x4970, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0x8252, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x1AB5, 0x1B78, 0x1B58, 0x1358, 0x1B78, 0x1378, 0x1358, 0x1A13, 0x18AE, 0x18AE, 0x1358, 0x1358, 0x1378, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x1358, 0x1358, 0x1358, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x7A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD395, 0xC354, 0x5990, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1A54, 0x1B38, 0x1B38, 0x2338, 0x1B38, 0x1B58, 0x2338, 0x21D2, 0x18AD, 0x18AD, 0x2338, 0x2338, 0x2358, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1930, 0x2339, 0x2358, 0x2338, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0xA2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0x4970, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x2150, 0x2B18, 0x2B39, 0x2B18, 0x2B19, 0x2B19, 0x2AF8, 0x18CE, 0x18AD, 0x18AD, 0x2B19, 0x2B18, 0x2B19, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x2192, 0x2B19, 0x2B19, 0x2B18, 0x2338, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0xBB34, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x4970, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x2192, 0x2B19, 0x3319, 0x32F9, 0x2A15, 0x18EF, 0x20AD, 0x18AD, 0x18AD, 0x32F9, 0x3319, 0x32F9, 0x18AD, 0x18AD, 0x18AD, 0x2191, 0x3319, 0x2AF9, 0x3319, 0x2AF9, 0x2A97, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x20CF, 0x28CF, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x71D1, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20CD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, + 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x3AD9, 0x3AD9, 0x3AD9, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x3AF9, 0x3AD9, 0x3AD9, 0x18AD, 0x20AD, 0x3215, 0x3AD9, 0x3AF9, 0x3ADA, 0x3AD9, 0x3277, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x20CD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x4950, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD374, 0xD375, 0xD355, 0xD355, 0xAAB3, 0x20CE, 0x18CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0398, 0x0398, 0x0398, 0x0398, 0x03B7, 0x0397, + 0x18AD, 0x18AD, 0x08F5, 0x0139, 0x011A, 0x0117, 0x00F7, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x42D9, 0x42B9, 0x42B9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x42B9, 0x42B9, 0x42BA, 0x18AE, 0x31F5, 0x42DA, 0x42D9, 0x42B9, 0x42D9, 0x3A77, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x5991, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD374, 0xD375, 0xD355, 0xD355, 0xD355, 0x9252, 0x30EF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, + 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x10F3, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4A99, 0x4AB9, 0x4A9A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4ABA, 0x4ABA, 0x4A9A, 0x4257, 0x4A99, 0x4A9A, 0x4A9A, 0x4ABA, 0x4237, 0x20CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x0119, 0x0119, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x69F1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xCB14, 0x4130, 0x20AF, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x42B9, 0x4A99, 0x42B9, 0x42BA, 0x18AD, 0x18AD, + 0x18AD, 0x18AF, 0x011A, 0x00F9, 0x10D0, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x527A, 0x527A, 0x527A, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x527A, 0x527A, 0x529A, 0x527A, 0x527A, 0x527A, 0x527A, 0x4A18, 0x20CE, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18D2, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x8253, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xD355, 0x7A11, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x6A3B, 0x6A3B, 0x6A3B, 0x621A, 0x6A3B, 0x6A3B, + 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x20AE, 0x08F3, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x5A5B, 0x5A5A, 0x5A7A, 0x2910, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x5A5A, 0x5A7B, 0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A, 0x4A18, 0x20CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x091A, 0x18F2, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x8232, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xA293, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x89BC, 0x89BC, 0x89BC, 0x91BC, 0x89BC, 0x899C, + 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x623A, 0x623B, 0x625A, 0x621A, 0x2910, 0x18CD, 0x18AD, 0x18AD, 0x623B, 0x623A, 0x625A, 0x623B, 0x623B, 0x51F8, 0x20CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0119, 0x0917, 0x18D2, 0x18D2, 0x0918, 0x091A, 0x0918, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30D0, 0x30F0, 0x30F0, 0x8252, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD335, 0x9253, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA93D, 0xA93D, 0xA93D, 0xB13D, 0xA93D, 0xA93D, + 0x18AD, 0x20AD, 0x18AE, 0x0117, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x59D8, 0x6A1B, 0x6A1B, 0x6A1B, 0x6A1B, 0x4133, 0x18AD, 0x18AD, 0x6A3B, 0x6A1B, 0x6A1B, 0x6A1B, 0x51B6, 0x20CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10D3, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18D1, 0x20CE, 0x20CE, 0x18D1, 0x093A, 0x093A, 0x28EF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x9273, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD334, 0xD335, 0xD334, 0xD334, 0xD314, 0xD315, 0xAA93, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20CE, 0x61B8, 0x721B, 0x71FB, 0x721B, 0x721B, 0x4133, 0x20AD, 0x71FB, 0x721B, 0x71FB, 0x4174, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0119, 0x011A, 0x18D1, 0x20AE, 0x20CE, 0x20F1, 0x093A, 0x093A, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0xAAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AE, 0x20AD, 0x20AD, 0x20AE, 0x30EE, 0x6150, 0x81B1, 0xA1F2, 0xC233, 0xCA53, 0xCA54, 0xCA53, 0xC233, 0xA1F2, 0x8191, 0x512F, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x20CE, 0x69B9, 0x81FB, 0x79DB, 0x79DC, 0x81FC, 0x5976, 0x79DB, 0x79DC, 0x81DC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0918, 0x0119, 0x0917, 0x18D0, 0x20D0, 0x0917, 0x093A, 0x1138, 0x28CF, 0x30CF, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x3911, 0xAAD4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD315, 0xD315, 0xD314, 0x69B2, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x410F, 0x6990, 0x99F2, 0xC253, 0xCA74, 0xD274, 0xCA74, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xD253, 0xCA53, 0xD233, 0xCA33, 0xC213, 0x8991, 0x410F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0917, 0x0119, 0x0119, 0x10CF, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AE, 0x7199, 0x89DB, 0x89BC, 0x81BC, 0x89BC, 0x89BC, 0x89BC, 0x89BC, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D2, 0x0119, 0x0119, 0x093A, 0x093A, 0x093A, 0x093A, 0x20F2, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x3111, 0x3911, 0x3911, 0xB2F5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD314, 0xD314, 0xD2F4, 0xD2F5, 0xCAD4, 0x5971, 0x30F0, 0x30D0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x38EF, 0x79B1, 0xBA53, 0xCA94, 0xCA94, 0xCA74, 0xD273, 0xD273, 0xCA73, 0xCA54, 0xCA53, 0xCA54, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xCA13, 0xCA13, 0xA1B2, 0x490F, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CE, 0x7979, 0x919C, 0x919C, 0x91BC, 0x919C, 0x899C, 0x89BC, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x18F2, 0x0919, 0x091A, 0x091A, 0x0919, 0x20F3, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x4112, 0xB2F5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD314, 0xD2F5, 0xD2F4, 0xD2F4, 0x4930, 0x30F0, 0x30EF, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x4130, 0x89F1, 0xD294, 0xD294, 0xCA93, 0xCA74, 0xD274, 0xCA74, 0xCA74, 0xCA53, 0xCA73, 0xD253, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xC274, 0x9B36, 0x83B8, 0x6419, 0x6C39, 0x6439, 0x6C1A, 0x8B57, 0xB295, 0xCA13, 0x9191, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x28AE, 0x8159, 0x917C, 0x997C, 0x997C, 0x999C, 0x999C, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20D0, 0x20D1, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD314, 0xD2F4, 0xD2F4, 0xD315, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2D5, 0x79D2, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x30D0, 0x28EF, 0x28F0, 0x28CF, 0x5150, 0xAA32, 0xD293, 0xD294, 0xD294, 0xCA93, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0xD274, 0xD254, 0xCA53, 0xCA54, 0xB2D5, 0x83B8, 0x44FC, 0x1DBE, 0x063F, 0x0CDB, 0x0B76, 0x1377, 0x1377, 0x0B76, 0x1356, 0x0B76, 0x0B77, 0x23F8, 0x6991, 0x510F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x8939, 0xA17C, 0xA17C, 0xA15D, 0xA15D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8A54, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2D4, 0xCAD4, 0x5951, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x4130, 0x91F2, 0xD294, 0xD294, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA74, 0xD274, 0xD274, 0xD274, 0xD253, 0xB2D5, 0x7419, 0x257D, 0x063F, 0x061F, 0x057D, 0x12B5, 0x190F, 0x18CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CE, 0x913A, 0xA93D, 0xA95D, 0xA95C, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xCAB4, 0x5172, 0x3911, 0x38F1, 0x38F0, 0x30F0, 0x81D2, 0xC294, 0xD294, 0xD293, 0xD294, 0xD294, 0xCA93, 0xCA93, 0xD274, 0xD274, 0xCA73, 0xD274, 0x83D8, 0x353D, 0x061F, 0x063F, 0x063F, 0x063F, 0x4C5A, 0x4970, 0x20AE, 0x20AE, 0x20AD, 0x18CD, 0x20AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xB11D, 0xB11D, 0xB11D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6B36, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D5, 0xD2D4, 0xCAD4, 0xCAB4, 0x5972, 0x3911, 0x5151, 0xB253, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xD274, 0xC294, 0x645A, 0x1DBE, 0x063F, 0x063F, 0x063F, 0x1DBE, 0x6459, 0xC274, 0x99D2, 0x28CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18CE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0xB8FE, 0xB8FD, 0xB8FE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253B, 0x465C, 0x6D7B, 0x6D9A, 0x6D9A, 0x6D7A, 0x84F9, 0x9C78, 0x9C77, 0x9C78, 0x9C78, 0x9C57, 0x9C78, 0x9C58, 0x9C58, 0xBBB6, 0xD334, 0xD315, 0xD334, 0xD315, 0xD314, 0xD315, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2D4, 0x91F3, 0x5972, 0xCA74, 0xD2B4, 0xD2B4, 0xD294, 0xCA94, 0xD294, 0xD294, 0xCA94, 0xCA74, 0xC2B4, 0x6C5A, 0x0DFF, 0x063F, 0x063F, 0x063F, 0x353D, 0x83B8, 0xCA53, 0xCA33, 0x89B1, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0xC0DE, 0xC0FE, 0xC0DD, 0x18AE, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x00FA, 0x08F4, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x38F1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4D1A, 0x6D9A, 0x94B9, 0x9C98, 0x9C77, 0x9C78, 0x9C78, 0x9C78, 0x94B8, 0x6D7A, 0x6D7A, 0x6D7B, 0x367C, 0x367D, 0x1EFE, 0x077F, 0x075F, 0x1EDE, 0x363D, 0x6D3A, 0x9C17, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2B4, 0xCAD4, 0xD2B3, 0xCAB4, 0xC294, 0xCAB4, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0x7BD8, 0x0DFF, 0x063F, 0x061F, 0x063F, 0x4CBB, 0x9B57, 0xD233, 0xCA33, 0xCA53, 0x6150, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0917, 0x0119, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC8BE, 0xC8DE, 0xC8BE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xA2B5, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD334, 0xD335, 0xD335, 0xD335, 0xD335, 0xBB96, 0xA437, 0x74F9, 0x4DBC, 0x2E7E, 0x0EDF, 0x559B, 0x8498, 0xC335, 0xD2F4, 0xD2D4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2B5, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xBAB4, 0xBAF6, 0xCA94, 0xD294, 0xCA94, 0xD273, 0x9B76, 0x1DBE, 0x061F, 0x063F, 0x0DDF, 0x643A, 0xB2D5, 0xCA54, 0xD253, 0xCA53, 0xC294, 0x59B1, 0x28CE, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x40B0, 0xA09A, 0xD0BE, 0xD09E, 0xD0BE, 0xB89C, 0x78B5, 0x28AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xBB15, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD335, 0xD315, 0xD314, 0xD315, 0xD2F5, 0xD2F5, 0xD2F4, 0x9BF7, 0x6D1A, 0x2E3D, 0x45BC, 0x9418, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xC2D4, 0x4CDB, 0x7BD8, 0x9B57, 0x44FC, 0x063F, 0x063F, 0x1DBE, 0x83D8, 0xC294, 0xCA53, 0xCA54, 0xCA33, 0xCA53, 0xB2B5, 0x33B8, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188E, 0x20CD, 0x10D1, 0x0119, 0x011A, 0x10D1, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x40B0, 0xD07D, 0xD87E, 0xD89F, 0xD89F, 0xE07F, 0xD89E, 0xD89F, 0xB87B, 0x28AE, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xBB14, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD314, 0xD335, 0xD315, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xC335, 0x8478, 0x4D7B, 0x4D5B, 0xAB96, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCA94, 0xCAB4, 0xD294, 0xD294, 0xD273, 0xC2B4, 0x5C9A, 0x061F, 0x061F, 0x063F, 0x7419, 0xD273, 0xD273, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xAAF6, 0x153C, 0x2951, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x10B0, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x208D, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB07A, 0xE85F, 0xE85F, 0xE07F, 0xE85F, 0xE87F, 0xE07F, 0xE85F, 0xE07F, 0x9898, 0x20AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xBB15, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD354, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD315, 0xCB34, 0xD315, 0xD314, 0xD314, 0xD315, 0xD314, 0xD2F4, 0xD2F5, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D5, 0xD2D4, 0xD2D4, 0xBB55, 0x7499, 0x35DC, 0x8439, 0xC2F4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xCA93, 0xD294, 0xD274, 0xCA74, 0x9B76, 0x061F, 0x061F, 0x83D8, 0xC295, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0x7BB8, 0x063F, 0x2A34, 0x30F0, 0x30F0, 0x30EF, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x38B0, 0xF05F, 0xE83F, 0xF03F, 0xF05F, 0xF05F, 0xF03F, 0xF03F, 0xF03F, 0xF05F, 0xE83F, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xBB35, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xCB35, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xCAD4, 0xD2F4, 0xCAD4, 0xD2D4, 0xD2D4, 0xCAB4, 0xD2B4, 0xCAB4, 0xCAB4, 0x8BF8, 0x3D5C, 0x6499, 0xC2D4, 0xD294, 0xD294, 0xCA74, 0xCA74, 0xD274, 0xCA74, 0xCA74, 0x54BB, 0x5C9A, 0x353D, 0x1DBE, 0x4CBB, 0x9377, 0x9B36, 0x44FC, 0x061F, 0x1BF9, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F4, 0x10F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x5092, 0xF83F, 0xF83F, 0xF03F, 0xF83F, 0xF83F, 0xF83F, 0xF83F, 0xF81F, 0xF03F, 0xF83F, 0x5092, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69B3, 0xC355, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD335, 0xD335, 0xD314, 0xD314, 0xD314, 0xD2F5, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0x9B97, 0x453C, 0x6C59, 0xC2B4, 0xCA74, 0xD274, 0xD273, 0xCA73, 0xD273, 0xC294, 0x6C39, 0xC294, 0xCA53, 0x8B98, 0x4CBB, 0x0DFF, 0x063F, 0x0D7E, 0x3972, 0x3911, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x5092, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x5092, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA94, 0x9B77, 0x44DC, 0x73F9, 0xCA73, 0xCA74, 0xD254, 0xCA73, 0xCA53, 0xC294, 0x351C, 0x6C3A, 0xC294, 0xD253, 0xCA34, 0x83B8, 0x5A55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4090, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x28AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69D3, 0xC355, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xCB55, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAD4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA94, 0xD274, 0xCA74, 0x8B78, 0x447C, 0xA316, 0xD253, 0xD253, 0xCA54, 0xCA53, 0xC294, 0x257D, 0x0DDF, 0x83B8, 0xD233, 0xCA33, 0xCA33, 0xBA13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x30D0, 0x30D0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x00F9, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x00F9, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x011A, 0x0119, 0x011A, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0xD03C, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xD03C, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xAAD4, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD294, 0xD2B4, 0xCA94, 0xCA94, 0xD294, 0xCA74, 0xCA73, 0xCA74, 0xD274, 0xC295, 0x6BB9, 0x6B99, 0xCA54, 0xCA53, 0xD254, 0xCA33, 0xC294, 0x24FD, 0x063F, 0x351D, 0xB295, 0xCA13, 0xCA13, 0xCA13, 0xB9F3, 0x7992, 0x4111, 0x4112, 0x38F1, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CF, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x0118, 0x00F9, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00FA, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x4090, 0xF03F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x6073, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20CD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xCB55, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD314, 0xD335, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xCA73, 0xCA53, 0xCA53, 0xCA74, 0xAAB6, 0x5B7A, 0xBA74, 0xCA53, 0xCA33, 0xCA33, 0xC254, 0x4BFB, 0x059F, 0x0D7F, 0x8B57, 0xC9F3, 0xCA13, 0xC9F3, 0xC9F3, 0xA9B3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0118, 0x10CF, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4091, 0xE01D, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x7074, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x10D2, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AE, 0x18CD, 0x20AE, 0x20CD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xB2F4, 0xD395, 0xDB95, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD334, 0x84F9, 0x467D, 0x1F5E, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x079F, 0x1F1E, 0x367D, 0x367C, 0x4DDB, 0x653A, 0x8498, 0x9BF7, 0xC2F5, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA73, 0xD253, 0xD254, 0xCA74, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0x72D9, 0xAA76, 0xCA33, 0xD233, 0xCA13, 0xCA33, 0x1C7E, 0x059F, 0x05FF, 0x5C7A, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10B0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x7074, 0x9077, 0x8856, 0x8876, 0x388F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18CD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x3111, 0x38F1, 0x3911, 0x4111, 0x4132, 0x6193, 0xC355, 0xD396, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xB3D6, 0x271D, 0x07FF, 0x07FF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x079F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x075F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x079F, 0x079F, 0x1EFE, 0x461C, 0x6D1A, 0x9BD6, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xD274, 0xCA74, 0xCA53, 0xD254, 0xCA54, 0xD253, 0xCA53, 0xCA33, 0xA275, 0x9A76, 0xCA33, 0xCA13, 0xCA33, 0x9AD6, 0x04FF, 0x05BF, 0x063F, 0x357C, 0xC254, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F8, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F9, 0x08F5, 0x18AE, 0x20AD, 0x18AD, 0x08F4, 0x0119, 0x011A, 0x00F7, 0x0117, 0x0119, 0x011A, 0x08F5, 0x20AE, 0x20AE, 0x20AD, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xCB55, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xCB55, 0xD334, 0xCB55, 0xAC17, 0x0FBF, 0x07FF, 0x07FF, 0x07BF, 0x07BF, 0x077F, 0x075F, 0x075F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x075F, 0x075F, 0x077F, 0x077F, 0x079F, 0x07BF, 0x365C, 0x74B9, 0xB315, 0xCA73, 0xCA54, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xD233, 0xCA33, 0xB235, 0xAA16, 0xCA33, 0xCA13, 0xCA13, 0x7B37, 0x055F, 0x05FF, 0x067F, 0x25DD, 0xA2F5, 0xD1D3, 0xC9F3, 0xC9D3, 0xC9D2, 0xC9D3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x0119, 0x00F9, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D3, 0x18CE, 0x20AD, 0x10F4, 0x011A, 0x0119, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61B3, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0x8CB8, 0x0FBF, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06DF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x071F, 0x071F, 0x071F, 0x073F, 0x073F, 0x073F, 0x073F, 0x075F, 0x075F, 0x071F, 0x2DFD, 0x7419, 0xB2B5, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xD233, 0xCA14, 0xA215, 0xCA13, 0xCA13, 0xC9F3, 0x8338, 0x05BF, 0x063F, 0x06BF, 0x0E9F, 0xAAD5, 0xC9D3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B2, 0xB1B2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18CF, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x20AE, 0x18D0, 0x0119, 0x0119, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3111, 0x38F1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD354, 0xD355, 0xD355, 0xC395, 0x5DFA, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06DF, 0x06BF, 0x06BF, 0x069F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x06BF, 0x06DF, 0x06DF, 0x06FF, 0x06FF, 0x06FF, 0x071F, 0x071F, 0x06FF, 0x06BF, 0x065F, 0x05BF, 0x443C, 0x8AF7, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA13, 0x99B6, 0xC9F3, 0xCA13, 0xC9F3, 0x4C3B, 0x061F, 0x069F, 0x06FF, 0x0EBE, 0xA2D5, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9B2, 0xC1B3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30F0, 0x28F0, 0x30D0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x20AE, 0x20AD, 0x18CE, 0x0119, 0x0119, 0x10D3, 0x20CE, 0x20AE, 0x10F4, 0x0119, 0x011A, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xBB35, 0xD395, 0xD396, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xBBD6, 0x5DFB, 0x0FBF, 0x07FF, 0x07DF, 0x07BF, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06DF, 0x06BF, 0x069F, 0x069F, 0x067F, 0x067F, 0x067F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x067F, 0x065F, 0x065F, 0x067F, 0x067F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x06DF, 0x06BF, 0x069F, 0x065F, 0x05FF, 0x053F, 0x049F, 0x1BBE, 0x8298, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xD1F3, 0x99B6, 0xC9F3, 0xC9F3, 0xB254, 0x0D9F, 0x067F, 0x06DF, 0x06FF, 0x0EBF, 0xA2D5, 0xC9D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011A, 0x10F5, 0x20CE, 0x20CF, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xBB35, 0xD395, 0xD396, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xAC37, 0x6D9A, 0x2EFE, 0x07FF, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x075F, 0x073F, 0x071F, 0x06DF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x065F, 0x063F, 0x063F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x05FF, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x063F, 0x063F, 0x063F, 0x065F, 0x065F, 0x065F, 0x065F, 0x067F, 0x067F, 0x063F, 0x05DF, 0x055F, 0x04BF, 0x043F, 0x037F, 0x1ABE, 0x7A18, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC1F4, 0x7178, 0xC9F2, 0xD1F3, 0x8338, 0x061F, 0x06BF, 0x06FF, 0x071F, 0x0EDF, 0xA2D5, 0xC9B3, 0xC9B3, 0xC9B2, 0xC992, 0xC992, 0xC993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x20AD, 0x20AE, 0x20AE, 0x18CE, 0x0918, 0x011A, 0x011A, 0x0919, 0x011A, 0x0917, 0x20CF, 0x28AE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xA2B4, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xC3B6, 0x8519, 0x4E3C, 0x0F9F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x06FF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x063F, 0x061F, 0x061F, 0x05FF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05FF, 0x05FF, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x05DF, 0x057F, 0x04FF, 0x047F, 0x03DF, 0x031F, 0x025F, 0x19DE, 0x79B8, 0xC9F3, 0xCA13, 0xC9F3, 0xB9D3, 0xA1B5, 0xC9D3, 0xC9F3, 0x4C5B, 0x065F, 0x06DF, 0x071F, 0x071F, 0x0EDF, 0xA2B5, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC993, 0xC992, 0xB172, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30EF, 0x28EF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x10F3, 0x10F3, 0x10D2, 0x20AE, 0x18AE, 0x20AE, 0x18CE, 0x20CE, 0x20CE, 0x20CE, 0x18F2, 0x10F4, 0x1114, 0x18F3, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xA2B5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xC3B5, 0x7D59, 0x36BD, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x071F, 0x06DE, 0x069E, 0x067E, 0x065E, 0x063F, 0x063F, 0x061E, 0x05FF, 0x05DF, 0x05BF, 0x05BF, 0x059F, 0x059F, 0x059F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x059F, 0x059F, 0x059F, 0x05BF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x057F, 0x04FF, 0x049F, 0x03FF, 0x037F, 0x02BF, 0x021F, 0x017F, 0x213D, 0x9996, 0xC9F3, 0xC9F3, 0xB9D4, 0x99B6, 0xC9D3, 0xC213, 0x0DBF, 0x069F, 0x06FF, 0x071F, 0x073F, 0x0EFF, 0xA2B5, 0xC992, 0xC992, 0xC992, 0xC992, 0xC972, 0xC972, 0xA972, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AE, 0x18CE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AF, 0x20CE, 0x28CE, 0x28CF, 0x28EF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xAAB5, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0x94D8, 0x467C, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x06DE, 0x06BE, 0x067E, 0x067E, 0x065E, 0x063E, 0x061E, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x059F, 0x057F, 0x057F, 0x055F, 0x055F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x055F, 0x055F, 0x055F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x055F, 0x04FF, 0x04BF, 0x041F, 0x039F, 0x031F, 0x025F, 0x01BF, 0x013F, 0x00BF, 0x40FB, 0xB1B5, 0xC9D2, 0xB1D5, 0xB1D4, 0xC9B3, 0x6399, 0x061F, 0x06DF, 0x071F, 0x073F, 0x073F, 0x0EFF, 0xA2B5, 0xC992, 0xC992, 0xC972, 0xC972, 0xC992, 0xC972, 0xB152, 0x4111, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CF, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30D0, 0x28F0, 0x3110, 0x30F0, 0x30F0, 0x30F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4A16, 0xA2B5, 0xD395, 0xD395, 0xD395, 0xD375, 0x8539, 0x1F5E, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x07BF, 0x075F, 0x06BE, 0x069D, 0x067D, 0x065D, 0x063D, 0x063D, 0x061D, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055F, 0x053F, 0x053F, 0x051F, 0x051F, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x051F, 0x051F, 0x051F, 0x051F, 0x051F, 0x051F, 0x053F, 0x053F, 0x051F, 0x04DF, 0x04BF, 0x043F, 0x03DF, 0x035F, 0x02BF, 0x021F, 0x017F, 0x00FF, 0x009F, 0x087F, 0x7119, 0xC9D3, 0xB1D4, 0xB9D3, 0xC9B3, 0x1CFE, 0x065F, 0x06FF, 0x071F, 0x073F, 0x073F, 0x1EBE, 0xB9F3, 0xC993, 0xC972, 0xC992, 0xC972, 0xC973, 0xC952, 0xB152, 0x4111, 0x3910, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20CD, 0x20CE, 0x20AE, 0x20AE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4A15, 0x3439, 0x16BD, 0x8519, 0xD395, 0xD395, 0xD395, 0x94D8, 0x1F5E, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x071E, 0x069D, 0x069D, 0x067D, 0x065D, 0x063D, 0x063D, 0x061D, 0x05FD, 0x05DD, 0x05BD, 0x059D, 0x059E, 0x057E, 0x055E, 0x053E, 0x051E, 0x04FF, 0x04FF, 0x04DF, 0x04BF, 0x04BF, 0x04BF, 0x049F, 0x049F, 0x049F, 0x049F, 0x049F, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04DF, 0x04BF, 0x04DF, 0x04DF, 0x04DF, 0x04BF, 0x049F, 0x043F, 0x03DF, 0x035F, 0x02FF, 0x025F, 0x01BF, 0x013F, 0x00DF, 0x007F, 0x005F, 0x185E, 0x8957, 0x61B9, 0xC9D3, 0x9A96, 0x059F, 0x067F, 0x06FF, 0x071F, 0x073F, 0x075F, 0x267D, 0xB9D3, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC952, 0xB152, 0x4111, 0x38F1, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18CF, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x00F6, 0x18CE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x38F1, 0x38F1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69B4, 0x6336, 0x6CD9, 0x4E5B, 0x07DF, 0x8539, 0xD395, 0xD395, 0xBC17, 0x3E9C, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07DF, 0x06BD, 0x069C, 0x069C, 0x067C, 0x065C, 0x065C, 0x063C, 0x061C, 0x05FC, 0x05DC, 0x05BC, 0x05BD, 0x059D, 0x057D, 0x055D, 0x053E, 0x051E, 0x04FE, 0x04DE, 0x04BE, 0x04BF, 0x049F, 0x047F, 0x047F, 0x047F, 0x045F, 0x045F, 0x045F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x049F, 0x047F, 0x045F, 0x041F, 0x03DF, 0x037F, 0x031F, 0x029F, 0x021F, 0x017F, 0x011F, 0x00BF, 0x005F, 0x001F, 0x001F, 0x00FF, 0x89B7, 0xC9B3, 0x447B, 0x065F, 0x06BF, 0x071F, 0x073F, 0x073F, 0x075F, 0x3D9B, 0xC972, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xA132, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x20CD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x011A, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3931, 0x40F1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61B3, 0x9274, 0xB2F5, 0xC355, 0xD395, 0xD395, 0xD395, 0xBC16, 0x469D, 0x8539, 0xD376, 0xD375, 0x6DBA, 0x0F9F, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x077F, 0x06BC, 0x06BB, 0x069B, 0x067B, 0x065B, 0x063B, 0x063B, 0x061B, 0x05FB, 0x05DB, 0x05BB, 0x059C, 0x059C, 0x057C, 0x055C, 0x053D, 0x051D, 0x04FD, 0x04DD, 0x04BE, 0x049E, 0x047F, 0x047F, 0x045F, 0x043F, 0x043F, 0x041F, 0x041F, 0x041F, 0x041F, 0x041F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x041F, 0x03FF, 0x03BF, 0x037F, 0x033F, 0x02BF, 0x023F, 0x01DF, 0x015F, 0x00DF, 0x009F, 0x005F, 0x001F, 0x005F, 0x097F, 0xB9B3, 0xB214, 0x0DBF, 0x06FF, 0x075F, 0x073F, 0x073F, 0x075F, 0x077F, 0x6479, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC932, 0x9132, 0x3911, 0x3111, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F4, 0x20CD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x28F0, 0x30F0, 0x3110, 0x38F0, 0x38F1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xC335, 0xD395, 0xD395, 0xD395, 0xD395, 0xAC57, 0x7D7A, 0x469C, 0x0F9F, 0xA4B8, 0xD395, 0x8539, 0x1F5E, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x075D, 0x06BB, 0x06BB, 0x069A, 0x067A, 0x065A, 0x065A, 0x063A, 0x061A, 0x05FA, 0x05DA, 0x05DB, 0x05BB, 0x059B, 0x057B, 0x055B, 0x053C, 0x053C, 0x051C, 0x04FC, 0x04DD, 0x04BD, 0x047E, 0x047E, 0x045E, 0x043F, 0x041F, 0x03FF, 0x03FF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03BF, 0x035F, 0x031F, 0x02DF, 0x027F, 0x01FF, 0x019F, 0x011F, 0x00BF, 0x007F, 0x003F, 0x001F, 0x009F, 0x39DB, 0xC992, 0x6399, 0x069F, 0x079F, 0x07FF, 0x07DF, 0x07BF, 0x077F, 0x079F, 0x9AF6, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC932, 0x7112, 0x3110, 0x30F0, 0x30EF, 0x28F0, 0x28EF, 0x28CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20AE, 0x18CF, 0x00F9, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08D3, 0x10D2, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xCB75, 0xD395, 0xD395, 0xD395, 0xC3D6, 0x6DBA, 0x1F7E, 0x07FF, 0x07FF, 0x36DD, 0xBC17, 0x8539, 0x1F5E, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x071B, 0x06DA, 0x06BA, 0x06BA, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05F9, 0x05DA, 0x05BA, 0x059A, 0x057A, 0x055A, 0x055B, 0x053B, 0x051B, 0x04FC, 0x04DC, 0x04BC, 0x049D, 0x047D, 0x045D, 0x043E, 0x041E, 0x03FE, 0x03DF, 0x03DF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x037F, 0x035F, 0x031F, 0x02DF, 0x027F, 0x023F, 0x01BF, 0x015F, 0x00FF, 0x009F, 0x005F, 0x001F, 0x003F, 0x011F, 0x99B6, 0xB9D3, 0x0D9F, 0x06DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F7E, 0xB9B3, 0xC952, 0xC952, 0xC952, 0xC952, 0xC931, 0xC932, 0xC132, 0x6111, 0x38F0, 0x30F0, 0x28F0, 0x30EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18CE, 0x08F5, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xA2B4, 0xD395, 0xD375, 0xD395, 0xD395, 0xC3D6, 0x6DBA, 0x0FBF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x1F7E, 0x07DF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x06F9, 0x06F9, 0x06D9, 0x06B8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05F8, 0x05D8, 0x05B8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051A, 0x04FA, 0x04DB, 0x04BB, 0x049C, 0x047C, 0x045D, 0x043D, 0x041E, 0x03FE, 0x03DE, 0x03BF, 0x039F, 0x039F, 0x037F, 0x037F, 0x037F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02BF, 0x027F, 0x023F, 0x01FF, 0x019F, 0x013F, 0x00BF, 0x007F, 0x003F, 0x001F, 0x005F, 0x197E, 0xB993, 0x6379, 0x063F, 0x073F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x3DFB, 0xC952, 0xC952, 0xC932, 0xC932, 0xC932, 0xC932, 0xC912, 0xB912, 0x4111, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x08F6, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79F3, 0xB2F4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x94F9, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x079D, 0x0719, 0x06F8, 0x06F8, 0x06D7, 0x06B7, 0x06B7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05F7, 0x05D7, 0x05B7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04F9, 0x04DA, 0x04BB, 0x049B, 0x047C, 0x043C, 0x041D, 0x041D, 0x03FE, 0x03DE, 0x03BE, 0x039E, 0x037F, 0x035F, 0x035F, 0x033F, 0x031F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02DF, 0x02BF, 0x029F, 0x027F, 0x023F, 0x01FF, 0x019F, 0x015F, 0x00FF, 0x009F, 0x005F, 0x003F, 0x001F, 0x00BF, 0x59BA, 0xB9B3, 0x0D3F, 0x06BF, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7438, 0xC952, 0xC132, 0xC932, 0xC932, 0xC932, 0xC911, 0xC912, 0xA111, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x08F5, 0x011A, 0x0119, 0x00FA, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x5151, 0x79F3, 0xA2B4, 0xCB75, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xC3D6, 0x469C, 0x07FF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0xC335, 0x45D7, 0x0738, 0x0717, 0x06F6, 0x06F6, 0x06D6, 0x06B5, 0x06B5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05F5, 0x05F5, 0x05D6, 0x05B6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04F9, 0x04D9, 0x049A, 0x047B, 0x045B, 0x043C, 0x041C, 0x03DD, 0x03DD, 0x03BE, 0x039E, 0x037E, 0x035F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x027F, 0x025F, 0x021F, 0x01FF, 0x01BF, 0x017F, 0x011F, 0x00DF, 0x009F, 0x003F, 0x001F, 0x003F, 0x013F, 0xB174, 0x6339, 0x05FF, 0x071F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xB992, 0xC932, 0xC932, 0xC931, 0xC912, 0xC912, 0xC912, 0xC911, 0x8111, 0x30F0, 0x30F0, 0x28EF, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20D0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08F5, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F9, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x59B2, 0x7A13, 0x9A94, 0xBB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xAC77, 0x2F1E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BC, 0x0759, 0xABB5, 0xC314, 0x1E97, 0x0736, 0x0716, 0x0715, 0x06F4, 0x06F4, 0x06F3, 0x06D3, 0x06B3, 0x06B2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05F4, 0x05D4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04F8, 0x04B9, 0x0499, 0x045A, 0x043B, 0x041B, 0x03FC, 0x03DD, 0x03BD, 0x039D, 0x037E, 0x035E, 0x033E, 0x033F, 0x031F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x029F, 0x027F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x021F, 0x01DF, 0x019F, 0x017F, 0x013F, 0x00FF, 0x009F, 0x007F, 0x003F, 0x001F, 0x007F, 0x399B, 0xB993, 0x055F, 0x067F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x45DB, 0xC132, 0xC932, 0xC912, 0xC132, 0xC912, 0xC912, 0xC911, 0xC912, 0x5111, 0x38F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18CE, 0x10D3, 0x10F4, 0x18D0, 0x18AD, 0x18AE, 0x20CD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F9, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x20CD, 0x20AE, 0x20AD, 0x20AE, 0x18CE, 0x20AE, 0x20CE, 0x20CE, 0x28AE, 0x20CE, 0x28EE, 0x5171, 0x69D2, 0x8232, 0xAAF4, 0xC334, 0xD375, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x757A, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BD, 0x079B, 0x077A, 0x0779, 0x74D6, 0xD2D4, 0x9BF5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06F0, 0x06F0, 0x06D0, 0x06AF, 0x06AF, 0x066F, 0x0650, 0x0631, 0x0611, 0x05D2, 0x0594, 0x0554, 0x0515, 0x04F7, 0x04B8, 0x0478, 0x0459, 0x043A, 0x03FB, 0x03BC, 0x03BC, 0x039D, 0x037D, 0x035E, 0x033E, 0x031F, 0x031F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x027F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x013F, 0x011F, 0x00BF, 0x007F, 0x005F, 0x001F, 0x001F, 0x00DF, 0xA175, 0x33BC, 0x05DF, 0x06FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x92D5, 0xC911, 0xC132, 0xC912, 0xC912, 0xC8F2, 0xC112, 0xC912, 0xA8F1, 0x3110, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x10CF, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x390F, 0x4970, 0x59B0, 0x7A32, 0x9293, 0xAAD3, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0x9CB8, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DE, 0x07DD, 0x07BC, 0x079B, 0x079A, 0x079A, 0x0779, 0x55B7, 0xD2B4, 0xD2B4, 0x4DB5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074F, 0x074E, 0x074D, 0x074D, 0x074C, 0x072B, 0x072B, 0x072A, 0x070A, 0x06EA, 0x06AC, 0x064D, 0x05D0, 0x0573, 0x04F5, 0x04B6, 0x0478, 0x0438, 0x041A, 0x03FB, 0x03BC, 0x039C, 0x037C, 0x033D, 0x033D, 0x031E, 0x02FE, 0x02FF, 0x02DF, 0x02BF, 0x029F, 0x029F, 0x027F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x009F, 0x005F, 0x003F, 0x001F, 0x003F, 0x213D, 0x1B1E, 0x051F, 0x065F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F3D, 0xC912, 0xC912, 0xC112, 0xC112, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0x80F1, 0x30F0, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F7, 0x00F9, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x392F, 0xD395, 0xC374, 0xA2D3, 0xAAD3, 0x7A31, 0x7A31, 0x7A11, 0x7231, 0x5190, 0x496F, 0x496F, 0x4970, 0x496F, 0x494F, 0x412F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4970, 0x494F, 0x496F, 0x496F, 0x69F1, 0x7A31, 0x7A31, 0x9272, 0xA2D3, 0xAAF3, 0xC355, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD375, 0xD395, 0xAC57, 0x565C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DE, 0x07BD, 0x07BC, 0x07BC, 0x07BB, 0x079A, 0x079A, 0x0799, 0x26B8, 0xCAD4, 0xD2B4, 0xC314, 0x0F35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078F, 0x078E, 0x078E, 0x078D, 0x078C, 0x07AA, 0x07A9, 0x07A9, 0x07A8, 0x07C7, 0x07C5, 0x07C4, 0x07E4, 0x07A4, 0x0727, 0x068A, 0x05AF, 0x0496, 0x0438, 0x03F9, 0x03BA, 0x039B, 0x035C, 0x035D, 0x031D, 0x031D, 0x02FE, 0x02DF, 0x02BF, 0x02BF, 0x029F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x00FF, 0x00DF, 0x00BF, 0x007F, 0x005F, 0x001F, 0x001F, 0x007F, 0x023F, 0x041F, 0x05BF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6498, 0xC911, 0xC912, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8D1, 0x50F1, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0117, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC3D6, 0x8539, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DE, 0x07BD, 0x07BD, 0x07BC, 0x07BC, 0x07BB, 0x07BA, 0x07BA, 0x07B9, 0xD2B4, 0xD2B4, 0xD2B4, 0x6535, 0x07B5, 0x07B5, 0x07B4, 0x07B3, 0x07B2, 0x07B1, 0x07B0, 0x07AF, 0x07CE, 0x07CD, 0x07CC, 0x07CB, 0x07CA, 0x07CA, 0x07C9, 0x07E8, 0x07E7, 0x07E6, 0x07E5, 0x07E5, 0x07E3, 0x07E3, 0x07E2, 0x07E1, 0x0726, 0x060C, 0x04B4, 0x03B9, 0x037B, 0x035C, 0x033D, 0x031D, 0x02DE, 0x02DF, 0x02BE, 0x029F, 0x029F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x019F, 0x019F, 0x015F, 0x015F, 0x013F, 0x00FF, 0x00DF, 0x00BF, 0x007F, 0x007F, 0x003F, 0x001F, 0x001F, 0x011F, 0x02FF, 0x04DF, 0x063F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xB972, 0xC8F2, 0xC8F2, 0xC0F1, 0xC8F2, 0xC0F2, 0xC0F1, 0xC8D1, 0xA0F1, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x412F, 0x8A72, 0xC334, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xAC57, 0x469C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x467C, 0x8519, 0x8519, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DE, 0x07DE, 0x07DE, 0x07DD, 0x07DC, 0x07DC, 0x07DB, 0x07DB, 0x07DA, 0x07DA, 0x9BF5, 0xD2B4, 0xD2B4, 0xC2F4, 0x0F77, 0x07D6, 0x07D5, 0x07D4, 0x07D4, 0x07D3, 0x07D2, 0x07D1, 0x07D0, 0x07EF, 0x07EE, 0x07ED, 0x07EC, 0x07EC, 0x07EA, 0x07E9, 0x07E9, 0x07E7, 0x07E6, 0x07E6, 0x07E5, 0x07E5, 0x07E4, 0x07E4, 0x07E3, 0x07E3, 0x07E2, 0x0785, 0x060C, 0x04D3, 0x035B, 0x031C, 0x02DE, 0x02DE, 0x02BE, 0x029F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x001F, 0x001F, 0x003F, 0x01DF, 0x03BF, 0x059F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D7A, 0xC111, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0D1, 0xC8D1, 0x68F1, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x414F, 0x61D1, 0x8251, 0xA2D3, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xBC16, 0x8539, 0x469C, 0x17BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8518, 0xD355, 0xD355, 0xD335, 0xD335, 0x84F8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DE, 0x07FE, 0x07DD, 0x07DD, 0x07BC, 0x07DC, 0x07DB, 0x07DB, 0x07DA, 0x8C56, 0xCAB4, 0xCAB4, 0xD294, 0x4DF7, 0x07D7, 0x07D7, 0x07D6, 0x07F5, 0x07D5, 0x07F3, 0x07F3, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EE, 0x07ED, 0x07EC, 0x07EB, 0x07EB, 0x07EA, 0x07E9, 0x07E8, 0x07E8, 0x07E7, 0x07E7, 0x07E6, 0x07E6, 0x07E5, 0x07E5, 0x07E5, 0x07E5, 0x07E4, 0x07A6, 0x060E, 0x03F8, 0x02DE, 0x02BE, 0x029F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x003F, 0x001F, 0x001F, 0x00BF, 0x029F, 0x049F, 0x063F, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB1D3, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8D1, 0xC8D1, 0xC0F1, 0xC8D1, 0xB8D1, 0x40F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0x496F, 0x5990, 0x7A12, 0x7A32, 0x9272, 0xA2D3, 0xA2D3, 0xC375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAC77, 0x757A, 0x36FD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4E3C, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD334, 0x7539, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07DD, 0x07DD, 0x07DD, 0x07DC, 0x07FC, 0x07DC, 0x07DB, 0x6D38, 0xCAB4, 0xD294, 0xD294, 0xAB95, 0x07D8, 0x07D8, 0x07F7, 0x07F7, 0x07F6, 0x07F5, 0x07F5, 0x07F4, 0x07F3, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EE, 0x07ED, 0x07ED, 0x07EC, 0x07EC, 0x07EB, 0x07EA, 0x07EA, 0x07EA, 0x07E9, 0x07E9, 0x07E8, 0x07E8, 0x07E8, 0x07E8, 0x07E7, 0x07E7, 0x07E8, 0x07C8, 0x06EB, 0x0514, 0x033C, 0x027F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x005F, 0x005F, 0x003F, 0x001F, 0x001F, 0x015F, 0x037F, 0x057F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D5A, 0xC8F1, 0xC8D1, 0xC0F1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0xC8B1, 0x78D1, 0x3110, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x496F, 0x496F, 0x4970, 0x7A12, 0x7A31, 0x8252, 0xAAD3, 0xA2D3, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCBD6, 0x94F8, 0x565B, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB3F6, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD334, 0x1F7E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DE, 0x07DD, 0x07FD, 0x07FD, 0x07FD, 0x07DD, 0x07DC, 0x6D38, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0x1F39, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F6, 0x07F5, 0x07F4, 0x07F3, 0x07F2, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EF, 0x07EE, 0x07EE, 0x07ED, 0x07ED, 0x07EC, 0x07ED, 0x07EC, 0x07EB, 0x07EC, 0x07EB, 0x07EB, 0x07EA, 0x07EA, 0x07EA, 0x07CA, 0x07AB, 0x076C, 0x070D, 0x05B2, 0x039B, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00DF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x001F, 0x60D9, 0x0A3F, 0x047F, 0x063F, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA9D3, 0xC0D1, 0xC8D1, 0xC0F1, 0xC8B1, 0xC0D1, 0xC8B1, 0xC0B1, 0xB8B1, 0x48F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18CD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4970, 0x4970, 0x5990, 0x7A31, 0x7231, 0x7A31, 0x7A31, 0x9AB3, 0xAAD4, 0xA2D4, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0x94F8, 0x565C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD315, 0x5DDB, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x6D58, 0xD294, 0xD293, 0xCA94, 0xD274, 0x4DF8, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F8, 0x07F7, 0x07F6, 0x07F6, 0x07F5, 0x07F5, 0x07F4, 0x07F3, 0x07F3, 0x07F2, 0x07F1, 0x07F1, 0x07F0, 0x07F0, 0x07F0, 0x07EF, 0x07EF, 0x07EF, 0x07EF, 0x07EF, 0x07EE, 0x07EE, 0x07EE, 0x07EE, 0x07EE, 0x07ED, 0x07CD, 0x078E, 0x076E, 0x0710, 0x06B1, 0x0574, 0x037B, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x017F, 0x013F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x001F, 0x88D6, 0x6159, 0x031F, 0x053F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D5B, 0xC0D1, 0xC8D1, 0xC8D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B1, 0x90D1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CF, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x011A, 0x10D1, 0x18AD, 0x18AD, 0x10D1, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x10CF, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18CE, 0x18AD, 0x20AE, 0x20AD, 0x20CE, 0x20CE, 0x290F, 0x5170, 0x5170, 0x69F1, 0x7A32, 0x8232, 0xAAF3, 0xAAF4, 0xCB75, 0xD395, 0xD396, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xC3B6, 0x8539, 0x1F7F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD315, 0xD314, 0xD314, 0x659A, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x6D39, 0xD294, 0xCA94, 0xD274, 0xCA74, 0x7C96, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F6, 0x07F6, 0x07F5, 0x07F4, 0x07F4, 0x07F3, 0x07F3, 0x07F3, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F1, 0x07F1, 0x07F1, 0x07F1, 0x07F0, 0x07F1, 0x07D0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02DD, 0x01BF, 0x019F, 0x017F, 0x015F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x00BF, 0x007F, 0x005F, 0x005F, 0x003F, 0x003F, 0x001F, 0x60B8, 0xB8F3, 0x09BF, 0x041F, 0x061F, 0x073F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB1B3, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0x48F1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x00F9, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x00F7, 0x011A, 0x011A, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x5172, 0x61B2, 0x8A54, 0x9A94, 0xB335, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0x9C97, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xAC17, 0xD335, 0xD314, 0xD335, 0xD314, 0xD315, 0xD315, 0xD2F4, 0x467C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6D59, 0xD274, 0xCA94, 0xD274, 0xCA74, 0xB334, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FB, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F6, 0x07F6, 0x07F6, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F4, 0x07F4, 0x07F4, 0x07D3, 0x07B3, 0x0793, 0x0753, 0x0714, 0x06B5, 0x5516, 0x0538, 0x037C, 0x01FF, 0x017F, 0x015F, 0x013F, 0x011F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x6099, 0xC911, 0x491A, 0x02DF, 0x051F, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6459, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x90D1, 0x30F1, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69D3, 0x9274, 0xB2F5, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xA478, 0x36DD, 0x07FF, 0x07FF, 0x563C, 0xD335, 0xD334, 0xD315, 0xD315, 0xD2F4, 0xCB15, 0xBB96, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8498, 0xCA94, 0xCA94, 0xD274, 0xCA74, 0xCA74, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F6, 0x07F6, 0x07D6, 0x07B6, 0x0796, 0x0756, 0x0716, 0xA456, 0xBBD6, 0x3479, 0x02FD, 0x023F, 0x019F, 0x015F, 0x011F, 0x00FF, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x003F, 0x78B7, 0xC111, 0xA114, 0x01FF, 0x041F, 0x05FF, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xC0B1, 0xC0D2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x48F1, 0x30F0, 0x30EF, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18CE, 0x08F7, 0x0119, 0x00F8, 0x10CF, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x20CD, 0x20CD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71F4, 0x9A75, 0xB2F5, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0x9C78, 0x36DD, 0x07FF, 0x9C57, 0xD335, 0xD315, 0xD334, 0xD314, 0xC355, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9BF7, 0xCA94, 0xD274, 0xCA73, 0xCA74, 0xD253, 0x2EFD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F9, 0x07F8, 0x07D8, 0x07B8, 0x0797, 0x0758, 0x0EF8, 0xBBF6, 0xD395, 0x6B99, 0x025F, 0x021F, 0x01BF, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x98D5, 0xC8F2, 0xC911, 0x195E, 0x033F, 0x053F, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7B76, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0x88D1, 0x30F1, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00FA, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8A16, 0xAAD5, 0xCB55, 0xD375, 0xD355, 0xD354, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xCB35, 0x84F9, 0x0FBF, 0x5DDB, 0xA457, 0x9C58, 0x84D8, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9BD6, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FC, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07DA, 0x07DA, 0x07BA, 0x079A, 0x0779, 0x2E99, 0xC3D6, 0xD395, 0x8339, 0x0A3E, 0x01DF, 0x019F, 0x015F, 0x011F, 0x00FF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x007F, 0x003F, 0x003F, 0x003F, 0x90D5, 0xC912, 0xC0F1, 0x7117, 0x027F, 0x049F, 0x065F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x269D, 0xC891, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8B1, 0x3110, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18CE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28EF, 0x28CF, 0x28EF, 0x28D0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8B14, 0x4AD3, 0x7A94, 0xAB14, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD315, 0xD314, 0xD335, 0xC355, 0x467C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xC2D4, 0xCA74, 0xCA74, 0xD274, 0xCA74, 0xD253, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07DB, 0x07BB, 0x07BB, 0x077B, 0x2EBA, 0xC3D6, 0xD395, 0xB337, 0x09DF, 0x01BF, 0x017F, 0x013F, 0x011F, 0x00DF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x003F, 0x7896, 0xC0F1, 0xC8F1, 0xA8F3, 0x01DF, 0x03DF, 0x05BF, 0x071F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA214, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0x68F1, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20EF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9A75, 0xCB55, 0xCB75, 0x5BB4, 0x3B34, 0x42B3, 0x4A33, 0x6253, 0x9AB4, 0xD335, 0xD335, 0xD315, 0xD334, 0xD314, 0xD315, 0xD314, 0xD314, 0x5DDB, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F5E, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xCA53, 0x369D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07DD, 0x07DD, 0x07BD, 0x079C, 0x561A, 0xD395, 0xD395, 0xAB37, 0x099F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x005F, 0x003F, 0x003F, 0x305C, 0xC0F1, 0xC8F1, 0xC8D1, 0x215D, 0x033F, 0x051F, 0x06DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5CD9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x98D1, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F8, 0x011A, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xCB55, 0xD375, 0xBB95, 0x5474, 0x3C34, 0x3BB4, 0x4333, 0x42B3, 0x4A13, 0x49F3, 0x5A32, 0x9AB4, 0xD334, 0xD335, 0xD314, 0xD314, 0xD315, 0xD314, 0xD2F4, 0x84D8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4DDB, 0xD274, 0xCA74, 0xCA73, 0xD274, 0xCA54, 0xCA54, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07DD, 0x07DE, 0x079D, 0x6D99, 0xD395, 0xD395, 0xAB17, 0x097F, 0x011F, 0x011F, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x003F, 0x003F, 0x003F, 0xC8F1, 0xC8F1, 0xC8D1, 0x5119, 0x02DF, 0x04FF, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F1E, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x4910, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xCB55, 0xD375, 0xD375, 0xB3D5, 0x3D55, 0x3515, 0x3495, 0x3C14, 0x3B94, 0x3B13, 0x4293, 0x4212, 0x49F3, 0x49F3, 0x5A13, 0x9AB4, 0xD314, 0xD315, 0xCB15, 0xD2F4, 0xD2F5, 0xD2F4, 0x7539, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8C37, 0xCA74, 0xD273, 0xD253, 0xCA54, 0xCA53, 0xD253, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DF, 0x07DF, 0x94D8, 0xD396, 0xD395, 0x8299, 0x00FF, 0x00FF, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0xC8D1, 0xC0F1, 0xC0D1, 0xA0D4, 0x027F, 0x04BF, 0x069F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8315, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x70F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0117, 0x18AE, 0x20CD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xB2F4, 0xD375, 0xD375, 0xD375, 0x9435, 0x3D55, 0x2D55, 0x2D75, 0x3515, 0x3C94, 0x3414, 0x3B94, 0x4313, 0x4293, 0x4A13, 0x41F3, 0x49F2, 0x4A13, 0x5A33, 0xA2B4, 0xD314, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2F4, 0x4E1B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x179F, 0xD274, 0xCA53, 0xCA73, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9E, 0xBC16, 0xD395, 0xD395, 0x725A, 0x00BF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x90B5, 0xC8D1, 0xC8D1, 0xC0D1, 0x123E, 0x047F, 0x067F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0x90D1, 0x38F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F9, 0x00F9, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x38F0, 0x30F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xCB55, 0xD375, 0xD375, 0xD355, 0x9435, 0x3575, 0x3575, 0x2D75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3BF4, 0x3B73, 0x42F4, 0x4273, 0x4A13, 0x4213, 0x49F2, 0x49F3, 0x49F3, 0x6A33, 0xBAD4, 0xD2F5, 0xD2F4, 0xD2D4, 0xC335, 0x177E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5D9A, 0xCA54, 0xD273, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0x9BB6, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x077F, 0x077E, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x36DD, 0xD395, 0xD395, 0xD395, 0x51BC, 0x009F, 0x009F, 0x007F, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x7077, 0xC0D2, 0xC8D1, 0xC0D1, 0x49FA, 0x049F, 0x069F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F1E, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0x3910, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18CE, 0x08F7, 0x0119, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4952, 0xAAB4, 0xD375, 0xD375, 0xD375, 0xD355, 0x9435, 0x3575, 0x3575, 0x2D75, 0x2D75, 0x2D75, 0x3555, 0x54D5, 0x6475, 0x83B5, 0x8B74, 0x9B34, 0xAB14, 0xAAD4, 0xB2D4, 0xAAD4, 0xAAB4, 0xAAB4, 0xB2B4, 0x6B15, 0x8A94, 0xC2D4, 0xD2F4, 0xD2D4, 0x84B8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB315, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0x653A, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x075F, 0x075F, 0x073F, 0x073F, 0x071F, 0x071E, 0x071E, 0x073E, 0x079F, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7D7A, 0xD395, 0xD395, 0xC375, 0x28FE, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x005F, 0x003F, 0x003F, 0x183E, 0xC0D1, 0xC0D1, 0xC0D2, 0x7996, 0x04BF, 0x067F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA214, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0x58F1, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AD, 0x18CD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0117, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x5972, 0xCB55, 0xD375, 0xD375, 0xD375, 0xD375, 0xABD5, 0x4515, 0x54F5, 0x7C75, 0x8C35, 0xABD5, 0xCB55, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xC355, 0x9C37, 0x659A, 0x467C, 0x0FBF, 0x07FF, 0x07FF, 0x269D, 0x9C17, 0xD2D4, 0x9C17, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5D9A, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0x26DD, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x071E, 0x071E, 0x06FE, 0x06FE, 0x06FF, 0x06DE, 0x06DE, 0x06BE, 0x06BE, 0x06DE, 0x073E, 0x079F, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x079F, 0x077F, 0x079F, 0x079F, 0x077F, 0x079F, 0x079F, 0x079F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0xC3F6, 0xD395, 0xD395, 0xAAF7, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x001F, 0x001F, 0xA094, 0xC0D1, 0xC8B1, 0xA8F3, 0x04BF, 0x069F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x73D8, 0xB8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0x78F1, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x10CF, 0x0119, 0x00F9, 0x0117, 0x18CE, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x71F2, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xD355, 0xD335, 0xD335, 0xCB14, 0xD334, 0xD334, 0xAC16, 0x753A, 0x467D, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x369C, 0x4E1B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x26FD, 0xC2B4, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA33, 0xCA33, 0xA356, 0x07FF, 0x07FF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x071F, 0x071F, 0x06FF, 0x06FE, 0x06FE, 0x06DE, 0x06BE, 0x06BE, 0x069E, 0x069E, 0x069E, 0x067E, 0x067E, 0x065E, 0x065E, 0x06BE, 0x073E, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x077F, 0x077F, 0x077F, 0x077F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07DF, 0x6DDA, 0xD395, 0xD376, 0xD375, 0x79FA, 0x003F, 0x003F, 0x001F, 0x003F, 0x001F, 0x001F, 0x001F, 0x001F, 0x8896, 0xC0B1, 0xC0B1, 0xC8B1, 0x0C9F, 0x069F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x3DBB, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0x98D1, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x9A93, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD355, 0xD335, 0xD335, 0xC375, 0x84F9, 0x4E3C, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xAB75, 0xCA54, 0xD253, 0xCA53, 0xCA33, 0xCA33, 0xD233, 0xCA33, 0x4DBB, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x075F, 0x073F, 0x071F, 0x071F, 0x06FF, 0x06DE, 0x06DE, 0x06DE, 0x06BE, 0x06BE, 0x069E, 0x067E, 0x067E, 0x067E, 0x065E, 0x063E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05FD, 0x067D, 0x06DE, 0x06FE, 0x06FE, 0x06FE, 0x06FE, 0x071E, 0x073F, 0x073F, 0x073F, 0x073E, 0x075F, 0x077F, 0x079F, 0x079F, 0x07BF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x0FBF, 0xC3D6, 0xD375, 0xD375, 0xD355, 0x30FD, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x001F, 0x6058, 0xC0B1, 0xC0B1, 0xC0B1, 0x33FC, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9E, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xC0B1, 0xB8D1, 0xB8D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x3910, 0xAAF4, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xB3D6, 0x7539, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x2EFD, 0xB315, 0xCA53, 0xCA54, 0xCA33, 0xCA53, 0xCA34, 0xCA34, 0xCA33, 0xA335, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DE, 0x06BF, 0x06BE, 0x069E, 0x069E, 0x069E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05BD, 0x05BE, 0x059D, 0x055E, 0x055E, 0x05BE, 0x05FE, 0x061D, 0x067E, 0x06BE, 0x06FE, 0x06FE, 0x071F, 0x071E, 0x073F, 0x073F, 0x075F, 0x077F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x8539, 0xD375, 0xD355, 0xD355, 0xBAF6, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x403B, 0xC8B1, 0xC0B1, 0xC0B1, 0x6318, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA9B3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8D1, 0x4910, 0x3910, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x10D3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x011A, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x30CF, 0x3910, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD354, 0xD355, 0xD355, 0xCB96, 0x8518, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBE, 0x653A, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x2E9D, 0x077F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FE, 0x06DF, 0x06DE, 0x06BF, 0x06BE, 0x06BF, 0x069E, 0x067E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05BE, 0x05BE, 0x059E, 0x057E, 0x053E, 0x051E, 0x04FE, 0x04BE, 0x049E, 0x041E, 0x03DD, 0x04DE, 0x065E, 0x06BE, 0x06DE, 0x06DE, 0x06FE, 0x071F, 0x073E, 0x077F, 0x079F, 0x079F, 0x07BF, 0x07DF, 0x07DF, 0x07FF, 0x36DD, 0xD355, 0xD355, 0xD355, 0xD335, 0x699A, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0xB8B2, 0xC091, 0xC0B1, 0x7A96, 0x06BF, 0x079F, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x82F5, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0x60F1, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x08F7, 0x18CE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CF, 0x28CF, 0x28EF, 0x3910, 0xB314, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xBBD6, 0x5DFB, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0x5D9A, 0xB315, 0xD254, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA33, 0xD233, 0xCA33, 0xCA33, 0x64D9, 0x077F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06BF, 0x06BE, 0x069F, 0x069F, 0x067E, 0x065E, 0x065E, 0x063E, 0x063E, 0x061E, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x055E, 0x055E, 0x051E, 0x04FE, 0x04DE, 0x049E, 0x043D, 0x03DE, 0x03BE, 0x039E, 0x037E, 0x03FE, 0x05FE, 0x069E, 0x069E, 0x06BE, 0x06FE, 0x071E, 0x073F, 0x075F, 0x079F, 0x079F, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0xBBF6, 0xD355, 0xD335, 0xD335, 0xC2F5, 0x083F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x9095, 0xC8B1, 0xC8B1, 0x91F5, 0x067F, 0x06FF, 0x073F, 0x075F, 0x077F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0x80F2, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20CD, 0x20AE, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x08F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x3110, 0xB314, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0x9C77, 0x563B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F7E, 0x65DB, 0x7CF9, 0x9C57, 0x9C57, 0x9C57, 0x9C57, 0x9C37, 0x9C37, 0x9C37, 0x9C37, 0x7539, 0x6D7A, 0x6579, 0x5DBB, 0x36BD, 0x36BD, 0x36BC, 0x2EFD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0x36BD, 0x5D9A, 0x8C37, 0xD274, 0xD273, 0xD254, 0xCA53, 0xD254, 0xD253, 0xCA33, 0xD233, 0xCA34, 0xCA13, 0xCA33, 0x8418, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06BF, 0x06BF, 0x069E, 0x069F, 0x067E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x05BE, 0x057E, 0x055E, 0x051E, 0x051E, 0x04FE, 0x04BE, 0x045E, 0x03FE, 0x03BE, 0x039E, 0x037E, 0x037E, 0x035E, 0x033E, 0x035E, 0x061D, 0x067E, 0x067E, 0x069E, 0x06BE, 0x06FE, 0x073F, 0x075F, 0x077F, 0x079F, 0x07DF, 0x07DF, 0x07FF, 0x7D59, 0xD335, 0xD335, 0xD335, 0xD314, 0x699A, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x60D8, 0xC0B1, 0xC0B1, 0xB8F2, 0x05DF, 0x061F, 0x065F, 0x06DF, 0x073F, 0x077F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x363C, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0x90D1, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CE, 0x30EF, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0x9C77, 0x3EDD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x659A, 0xD315, 0xD314, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2F4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA73, 0xCA73, 0xD274, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xAB15, 0x0EDF, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06BF, 0x06BF, 0x06DF, 0x06BF, 0x069F, 0x069F, 0x067E, 0x067F, 0x067E, 0x065E, 0x063F, 0x061E, 0x061E, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x055E, 0x053E, 0x051E, 0x04FE, 0x04DE, 0x049E, 0x043E, 0x03BE, 0x039E, 0x039E, 0x035E, 0x035E, 0x033E, 0x033E, 0x031E, 0x02FE, 0x037E, 0x05FE, 0x065E, 0x067E, 0x069E, 0x06DE, 0x06FE, 0x075F, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0x271D, 0xD335, 0xD314, 0xD315, 0xD315, 0xC2D5, 0x083F, 0x001F, 0x001F, 0x001F, 0x001F, 0x009F, 0x60D8, 0xC0B1, 0xC0B2, 0xC0B1, 0x04BF, 0x053F, 0x05BF, 0x067F, 0x06DF, 0x075F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0x98D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18CE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CE, 0x30EF, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xAC37, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x0EBD, 0x1D7B, 0x1C99, 0x32F5, 0x3A75, 0x6193, 0x69B3, 0x79F4, 0x8A14, 0xB294, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xD274, 0xCA53, 0xCA54, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x8B97, 0x35FD, 0x5D7B, 0x6D3A, 0x6D3A, 0x5D5B, 0x35FD, 0x06BF, 0x0E7E, 0x457C, 0x6C99, 0x6479, 0x6459, 0x4CBA, 0x0E1E, 0x063E, 0x063E, 0x061E, 0x05FE, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055E, 0x051E, 0x051E, 0x04FE, 0x04DE, 0x047E, 0x03DE, 0x03BE, 0x037E, 0x037F, 0x035E, 0x033E, 0x033E, 0x031E, 0x02FE, 0x02FE, 0x02FE, 0x02DE, 0x03FE, 0x05BE, 0x063E, 0x065E, 0x069E, 0x06DE, 0x071F, 0x073E, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0xBBB6, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0x697A, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x48FA, 0xC0B1, 0xC0B1, 0xC0B1, 0x331C, 0x047F, 0x053F, 0x05FF, 0x069F, 0x073F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9A14, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20AE, 0x18CF, 0x08F6, 0x011A, 0x0119, 0x0119, 0x08F4, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x9273, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xC3B6, 0x5DFB, 0x07FF, 0x0E3B, 0x1C98, 0x2AD5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79D3, 0x9A54, 0xC294, 0xD2F4, 0xD2D5, 0xCAD4, 0xD2D4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x99D4, 0x6358, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD375, 0x06BF, 0x5CFA, 0xD2B4, 0xCA94, 0xCA33, 0xCA13, 0xC9D3, 0xB9D3, 0x4C5A, 0x061E, 0x061E, 0x05DE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x057E, 0x053E, 0x051E, 0x051D, 0x04DE, 0x04BE, 0x043E, 0x03BE, 0x03BE, 0x037F, 0x0B7E, 0x337C, 0x333C, 0x335C, 0x333C, 0x333C, 0x331C, 0x331C, 0x32FC, 0x32FC, 0x32DC, 0x2B7C, 0x05DE, 0x061E, 0x065E, 0x069E, 0x06DE, 0x071F, 0x073F, 0x077F, 0x07BF, 0x07DF, 0x07DF, 0x84F9, 0xD314, 0xCB14, 0xCAF4, 0xD2D5, 0xB275, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x08DF, 0xB8D2, 0xC0B1, 0xC0B1, 0x3A7B, 0x03FF, 0x04DF, 0x05BF, 0x067F, 0x071F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7B77, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x4111, 0x38F1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20AE, 0x20CF, 0x0918, 0x013A, 0x011A, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0139, 0x00F9, 0x10D2, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x7A32, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x9C78, 0x261B, 0x1B96, 0x3171, 0x30F0, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81F3, 0xAA73, 0xCAD4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xD274, 0xCA54, 0xD274, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA33, 0xCA33, 0xD233, 0xC234, 0x7994, 0x5975, 0xB315, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xC375, 0x067F, 0x067F, 0x6C79, 0xCA33, 0xCA13, 0xC9D3, 0xC992, 0xC952, 0xC912, 0x34BB, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x055E, 0x055E, 0x053E, 0x051E, 0x04FE, 0x249D, 0x347B, 0x6BFA, 0x7B99, 0x9B98, 0xAB97, 0xDB95, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0xD395, 0xBBD6, 0x9C37, 0x8499, 0x6D1A, 0x363C, 0x1EDD, 0x079F, 0x07BF, 0x07DF, 0x4E1B, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0x40FC, 0x001F, 0x001F, 0x001F, 0x003F, 0x009F, 0x78D7, 0xC0B1, 0xC0B1, 0x61D8, 0x03BF, 0x049F, 0x057F, 0x065F, 0x071F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xB8D1, 0xB8B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x4111, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CF, 0x20AE, 0x10F3, 0x013A, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011A, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x5170, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0x6519, 0x22B3, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79B3, 0xA233, 0xD2B4, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xCA54, 0xD274, 0xD253, 0xCA54, 0xCA54, 0xCA33, 0xD233, 0xCA34, 0xCA33, 0xCA33, 0xA1D3, 0x5954, 0x5954, 0x79F5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD335, 0x8C18, 0x067F, 0x065F, 0x063F, 0xA2D5, 0xC9D3, 0xC972, 0xC952, 0xC111, 0xC8D1, 0x8A55, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055E, 0x34DC, 0x6C5A, 0xA3F7, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xBBB6, 0x84D9, 0x4E1B, 0x465C, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0x81D8, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x6098, 0xC0B1, 0xC0D1, 0x59B8, 0x035F, 0x045F, 0x055F, 0x063F, 0x06FF, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x363C, 0xC0D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x58F1, 0x3911, 0x30F0, 0x3110, 0x30CF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x08F6, 0x013A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F8, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20CE, 0x20AE, 0x28EE, 0xCB55, 0xD375, 0xD375, 0xD375, 0xBB14, 0x34F9, 0x2930, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91F2, 0xC254, 0xCA93, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xCA73, 0xD273, 0xCA73, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xCA33, 0xCA34, 0xA1F3, 0x6973, 0x4953, 0x5134, 0x5154, 0xAAF5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD335, 0xD314, 0x5CDA, 0x065F, 0x063F, 0x063F, 0xB254, 0xC972, 0xC952, 0xC112, 0xC8D1, 0xC0B1, 0xC0B1, 0x05BE, 0x059E, 0x2D1C, 0x9438, 0xCBB6, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCA94, 0x087F, 0x003F, 0x001F, 0x001F, 0x001F, 0x385B, 0xC0B1, 0xC0B1, 0x9135, 0x031F, 0x043F, 0x053F, 0x063F, 0x071F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB8D1, 0x5911, 0x3911, 0x38F0, 0x30F0, 0x30CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x0917, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0118, 0x011A, 0x00F9, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18CD, 0x20AE, 0x18AD, 0x20AE, 0x20CE, 0x20CE, 0x8252, 0xD375, 0xD375, 0xD375, 0x9A93, 0x30EF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81D2, 0xAA13, 0xBA33, 0xCA54, 0xCA74, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xB213, 0xA1F3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xD395, 0xD395, 0xD396, 0xD375, 0xD334, 0xD2F5, 0xD2B4, 0x2D9D, 0x063F, 0x063F, 0x061F, 0xC993, 0xC952, 0xC911, 0xC8F1, 0xC0B1, 0xC0B1, 0xB8D1, 0x059E, 0x057E, 0xABF7, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD315, 0xD335, 0xCB15, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0x411C, 0x003F, 0x003F, 0x001F, 0x001F, 0x203C, 0xC0B1, 0xC0B1, 0x9135, 0x02FF, 0x041F, 0x051F, 0x061F, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA1B3, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x68F1, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x10F3, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20CE, 0x412F, 0xD375, 0xD375, 0xD375, 0x71D1, 0x20CE, 0x28CF, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3110, 0x38F0, 0x30F0, 0x3111, 0x3111, 0x38F1, 0x38F1, 0x38F0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8A34, 0xD395, 0xD395, 0xD375, 0xD335, 0xD2F4, 0xCAD4, 0xB2F6, 0x065F, 0x061F, 0x061F, 0x34DC, 0xC952, 0xC912, 0xC8D2, 0xC0B1, 0xC0D1, 0xB8D1, 0x89B4, 0x2BBA, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71D4, 0x69F4, 0x71D3, 0x69D4, 0x71D3, 0x7A14, 0x8A75, 0x9274, 0x9254, 0x9254, 0x9A95, 0xB315, 0xBB14, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD315, 0xD2F4, 0xCB14, 0xD2F4, 0xD2F4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2B4, 0xCAB4, 0xCA94, 0xCA94, 0x81B8, 0x005F, 0x005F, 0x003F, 0x001F, 0x001F, 0xA8B3, 0xC0B1, 0xB0D2, 0x02DF, 0x03FF, 0x051F, 0x061F, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8A95, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F2, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CF, 0x0918, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x20CD, 0x20AE, 0x20CD, 0x9272, 0xD375, 0xC334, 0x61D1, 0x20CF, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x30F0, 0x3110, 0x3110, 0x30F0, 0x3110, 0x38F0, 0x30F0, 0x38F0, 0x3111, 0x38F0, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xB2F5, 0xD395, 0xD375, 0xD355, 0xD2F4, 0xD2B4, 0xD274, 0x83B8, 0x063F, 0x061F, 0x061E, 0x6398, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8B1, 0xB8D1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61B3, 0x7A34, 0x9A95, 0xB2F5, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD274, 0xCA74, 0xC254, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x5878, 0xB8D1, 0xC0B1, 0x02BF, 0x03BF, 0x04FF, 0x05FF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6478, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CF, 0x0917, 0x011A, 0x011A, 0x0119, 0x08F4, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20CD, 0x18CE, 0x20AE, 0x390F, 0xD375, 0xCB35, 0x414F, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30F0, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x30F0, 0x30EF, 0x3110, 0x30F0, 0x30D0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F1, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3910, 0x3911, 0x38F1, 0x3911, 0x3912, 0x4952, 0xD395, 0xD375, 0xD335, 0xD2F4, 0xD2B4, 0xD274, 0xCA33, 0x4C9A, 0x05FF, 0x061F, 0x05FF, 0xA1F4, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA0F1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xA274, 0xC315, 0xD335, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xCA54, 0x20FD, 0x009F, 0x007F, 0x005F, 0x003F, 0x105D, 0xC0B1, 0xC0D1, 0x029F, 0x03BF, 0x04DF, 0x05FF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CF, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x61D0, 0xBB14, 0x412F, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x28CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28CF, 0x28F0, 0x30D0, 0x28EF, 0x28CF, 0x30CF, 0x30F0, 0x30D0, 0x30D0, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x30D0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x61B2, 0xD375, 0xD335, 0xD2F4, 0xCAD4, 0xCA74, 0xD233, 0xCA13, 0x1D9D, 0x05FF, 0x05FF, 0x1D3D, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8A14, 0xAA74, 0xCAF4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD294, 0xCA94, 0xCA73, 0xD274, 0xD253, 0xD254, 0x597A, 0x00BF, 0x00BF, 0x009F, 0x009F, 0x005F, 0xA8B3, 0xC0B1, 0x31FC, 0x039F, 0x04DF, 0x05DF, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x2E3C, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18CE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AF, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x390F, 0x28CE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x71F2, 0xD335, 0xD2F4, 0xD2B4, 0xCA74, 0xD233, 0xCA13, 0xA295, 0x05FF, 0x05FF, 0x05FF, 0x5399, 0xC0D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9A34, 0xC2B4, 0xD2B5, 0xD2B3, 0xCAB4, 0xD294, 0xD294, 0xCA93, 0xD274, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0x81D8, 0x00DF, 0x00DF, 0x00DF, 0x00BF, 0x00BF, 0x68B7, 0xB8D1, 0x31DC, 0x033F, 0x049F, 0x05DF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x26BD, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D2, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F1, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x011A, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x28F0, 0x30F0, 0x30F0, 0x38F0, 0x8213, 0xD2F5, 0xCAD4, 0xD274, 0xCA53, 0xC9F3, 0xC9D2, 0x7398, 0x05FF, 0x05FF, 0x05DF, 0xA953, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x98F2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F0, 0x38F0, 0x38F0, 0x38F0, 0x3911, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xCA94, 0xD294, 0xCA94, 0xD274, 0xCA74, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA34, 0x99F6, 0x011F, 0x011F, 0x00FF, 0x00FF, 0x00FF, 0x38DB, 0xC0B1, 0x28FC, 0x02DF, 0x047F, 0x059F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18CD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0x7A32, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD335, 0xD2B4, 0xCA94, 0xCA33, 0xD1F3, 0xC9D3, 0xC993, 0xC972, 0xC992, 0xC972, 0xC932, 0xC0D1, 0xC0B1, 0xB8D1, 0xB0D2, 0xB9F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x015F, 0x013F, 0x013F, 0x013F, 0x011F, 0x093F, 0xC0B1, 0x311C, 0x01BF, 0x03FF, 0x059F, 0x069F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD2F4, 0xCA74, 0xCA33, 0xCA13, 0xC9D3, 0xC992, 0xC952, 0xC111, 0xC0D1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xCA53, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x097F, 0x017F, 0x015F, 0x017F, 0x015F, 0x015F, 0x88F5, 0x293C, 0x013F, 0x02DF, 0x053E, 0x067F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9234, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x10D0, 0x0118, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20EE, 0x8252, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD2B4, 0xD233, 0xCA13, 0xC9B3, 0xC992, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8B1, 0xB8D1, 0xB8D1, 0xC253, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x31BC, 0x01BF, 0x019F, 0x019F, 0x019F, 0x019F, 0x5139, 0x315C, 0x017F, 0x01BF, 0x045E, 0x063E, 0x077F, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8A95, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x10D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD4F8, 0xD65C, 0xD6DD, 0xD6FD, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xCB15, 0xCA13, 0xC9D3, 0xC992, 0xC932, 0xC911, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC397, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xC9F3, 0x31FC, 0x01DF, 0x01DF, 0x01DF, 0x01DF, 0x01DF, 0x01BF, 0x01DF, 0x01BF, 0x01BF, 0x02DF, 0x05FD, 0x073E, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8AB5, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x10D0, 0x00F8, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x28EE, 0xCB55, 0xD375, 0xD395, 0xD395, 0xD3D6, 0xD5DB, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xCA13, 0xC9B3, 0xC992, 0xC952, 0xC912, 0xC0D1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB0F1, 0xBA95, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9F3, 0x31FD, 0x021F, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01DF, 0x01FF, 0x051D, 0x071D, 0x07FD, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6BF7, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD477, 0xD77E, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xC9D3, 0xC992, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB152, 0xD79E, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9D3, 0x323C, 0x023F, 0x023F, 0x021F, 0x023F, 0x023F, 0x021F, 0x021F, 0x021F, 0x021F, 0x021F, 0x037E, 0x06DC, 0x07FD, 0x07FD, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0F1, 0x7911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x011A, 0x00F9, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x8252, 0xD395, 0xD395, 0xD396, 0xD4B8, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xC972, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xD63C, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9D3, 0x325C, 0x027F, 0x025F, 0x025F, 0x025F, 0x023F, 0x025F, 0x025F, 0x023F, 0x023F, 0x023F, 0x029F, 0x067C, 0x07FC, 0x07FC, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB8D1, 0x70F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD457, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCF3E, 0xC67C, 0xC53A, 0xC951, 0xC912, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0F1, 0xBB97, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD65B, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0xD395, 0xC9B3, 0x327C, 0x029F, 0x029F, 0x029F, 0x029F, 0x027F, 0x027F, 0x027F, 0x027F, 0x027F, 0x025F, 0x027F, 0x05BC, 0x07DB, 0x07FC, 0x07FD, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x58F1, 0x3911, 0x3111, 0x30F0, 0x28F0, 0x28F0, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x011A, 0x0119, 0x0119, 0x011A, 0x0117, 0x18CE, 0x18AE, 0x18D0, 0x0118, 0x00F9, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xA2D3, 0xD395, 0xD395, 0xD3D6, 0xD75E, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFDF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7DF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCFFF, 0xD7DF, 0xACD8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA8F1, 0xA972, 0xD77E, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD65C, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC193, 0x0A7F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x029F, 0x027F, 0x029F, 0x027F, 0x04DD, 0x07BB, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x07FF, 0x3DBB, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0x5911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F9, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0xD395, 0xD375, 0xD375, 0xD5BA, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5B, 0xBE3C, 0xB57A, 0xACB8, 0xBDBB, 0xC63C, 0xBE3B, 0xC71E, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5C, 0xB5DB, 0xACB8, 0xAC98, 0xBD5A, 0xBE3C, 0xC61C, 0xC69D, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xACB9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA111, 0xA911, 0xBC78, 0xCFDF, 0xCFDF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCF5E, 0xBE5C, 0xBE5C, 0xC63C, 0xC61C, 0xCEFD, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFFF, 0xCFDF, 0xD63B, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD395, 0x089F, 0x011F, 0x031F, 0x02FF, 0x02FF, 0x02DF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x03FD, 0x079A, 0x07FA, 0x07FC, 0x07FE, 0x07FF, 0x07FF, 0x2E5C, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB8D1, 0x5912, 0x3911, 0x38F1, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x0118, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x79F1, 0xD355, 0xD355, 0xD355, 0xCF7E, 0xC7DF, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xCFBF, 0xBEFD, 0xACB8, 0x8A52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA192, 0xAB96, 0xBE7D, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xCFDF, 0xCFBF, 0xC75E, 0xAD19, 0x92B4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xA111, 0x9931, 0xA111, 0x9911, 0xAB36, 0xBD5A, 0xC75E, 0xCFDF, 0xC7BF, 0xC7BF, 0xCFDF, 0xC7DF, 0xC7BF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xC7BF, 0xCFBF, 0xC7DF, 0xA4B8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xBE3B, 0xCFBF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xB5DA, 0x8A12, 0x8971, 0x9931, 0x9931, 0xA111, 0x9931, 0xAB35, 0xC75E, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFBF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCE1B, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x007F, 0x009E, 0x023F, 0x033F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x031F, 0x02FF, 0x02DF, 0x02DF, 0x02DF, 0x039E, 0x075A, 0x07F9, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x2E3C, 0xB8D2, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xA293, 0xD335, 0xD335, 0xCC98, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC75E, 0xA4B8, 0x8191, 0x9151, 0x9911, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xAB35, 0xBEFE, 0xC7BF, 0xC7BE, 0xC7BF, 0xB5DB, 0x89F1, 0x8971, 0x9931, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA132, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA172, 0xBD3A, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BE, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xAC98, 0x8191, 0x9151, 0x9931, 0xA111, 0xA131, 0xA111, 0xA131, 0xA111, 0x9931, 0xBE1B, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xBEFD, 0x89F2, 0x8991, 0x9931, 0xA112, 0xA131, 0xA111, 0xA111, 0xA111, 0xAB97, 0xC7BF, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC6DD, 0xD375, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0x009F, 0x009F, 0x013F, 0x033F, 0x037F, 0x035F, 0x033F, 0x031F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x02FF, 0x033F, 0x06F9, 0x07F9, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x2E3C, 0xB8D2, 0xB0F1, 0xB8D1, 0xB0D1, 0xB0F1, 0xB0D1, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x3110, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xD315, 0xD315, 0xD314, 0xC5FB, 0xC79F, 0xC79E, 0xC7BF, 0xC7BF, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xBF9E, 0xBFBF, 0xBFBE, 0xB67C, 0x8A53, 0x8971, 0xA131, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA172, 0xB539, 0xBF9F, 0x9BF6, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xAB15, 0xBF3D, 0xC79F, 0xC7BE, 0xC79F, 0xC79F, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79F, 0xC79E, 0xC79F, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xA4B8, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xBDFB, 0xC79F, 0xC79E, 0xC7BE, 0xC79F, 0xACF9, 0x8191, 0x9171, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA131, 0xA111, 0xBF3E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xC7BF, 0xC79E, 0xC79E, 0xC79E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xBF9E, 0xC79F, 0xC79E, 0xBFBE, 0xC79E, 0xC6BD, 0xD355, 0xD2F5, 0xD315, 0xCB14, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD315, 0xD315, 0xD314, 0x007F, 0x007F, 0x00FF, 0x027F, 0x039F, 0x039F, 0x037F, 0x231D, 0x5259, 0x5A3A, 0x033F, 0x033F, 0x031F, 0x031F, 0x0699, 0x07F8, 0x07FA, 0x07FD, 0x07FF, 0x07FF, 0x363C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0x4112, 0x38F1, 0x3911, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x0915, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2F4, 0xCAF4, 0xD2F4, 0xC65C, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF7F, 0xB67C, 0x8A12, 0x8971, 0xA111, 0xA111, 0xA911, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA912, 0xA911, 0xA1F3, 0x8191, 0x9931, 0xA111, 0xA111, 0xA912, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA112, 0xA911, 0xAA54, 0xBF1D, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xB79E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xB5FB, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA911, 0xB5FB, 0xBF7E, 0xBF9E, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBEBD, 0xD335, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F5, 0xCAF4, 0x007F, 0x007F, 0x00BF, 0x021F, 0x2ABD, 0x7A36, 0xB953, 0xC112, 0xC911, 0xC912, 0x0B3F, 0x035F, 0x035F, 0x033F, 0x05FA, 0x07F7, 0x07F9, 0x07FC, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0D1, 0xA0F1, 0x68F1, 0x4111, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2D4, 0xD2D4, 0xD2D4, 0xBE5C, 0xB77E, 0xB79E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xB77E, 0xB79E, 0xBF7E, 0xAE7B, 0x89F2, 0x8971, 0xA111, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA912, 0xA911, 0xA911, 0xA111, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA111, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA912, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xAA34, 0xB71E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7F, 0xB77E, 0x9C97, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xB5DB, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xA478, 0x8191, 0x9951, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xB5DB, 0xB77F, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xBE9D, 0xCB75, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D5, 0x007F, 0x007F, 0x30BB, 0x9955, 0xC931, 0xC932, 0xC932, 0xC912, 0xC0F2, 0xC8F2, 0x32FC, 0x037F, 0x037F, 0x037F, 0x059B, 0x07F7, 0x07F9, 0x07FC, 0x07FE, 0x07FF, 0x2E3C, 0xB8D1, 0xB0D1, 0xB0D2, 0xB0D1, 0xB0F1, 0x98F1, 0xB0F1, 0x88F1, 0x3110, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2B4, 0xD2B4, 0xD2B4, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB71D, 0x8A53, 0x8191, 0xA111, 0xA8F1, 0xB0F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F2, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB2F5, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C78, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C77, 0x8191, 0x9151, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB71D, 0xCB96, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCA94, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0x087E, 0x70F8, 0xC952, 0xC932, 0xC912, 0xC932, 0xC111, 0xC8F1, 0xC8F1, 0xC8D1, 0x331C, 0x03BF, 0x039F, 0x039F, 0x051B, 0x07D6, 0x07F7, 0x07FB, 0x07FE, 0x07FF, 0x2E3C, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xA0F1, 0xB0F1, 0xB0D1, 0x50F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD294, 0xD294, 0xCA94, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0x9416, 0x8991, 0x9951, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xACF9, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF7E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5D, 0xB75E, 0xAF5E, 0xAF5E, 0x9C77, 0x8191, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xB75E, 0xB75E, 0xB75E, 0xB75E, 0x9C78, 0x8991, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB5BB, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF1D, 0xCB75, 0xCA93, 0xD294, 0xCA74, 0xCA94, 0xCA74, 0xD274, 0xCA74, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA93, 0xCA94, 0xD293, 0xCA74, 0x9915, 0xC932, 0xC932, 0xC932, 0xC912, 0xC111, 0xC8F2, 0xC0F2, 0xC8D1, 0xC8D1, 0x333C, 0x03FF, 0x03DF, 0x03BF, 0x04DC, 0x07D6, 0x07F7, 0x07FB, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0x90F1, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD274, 0xD274, 0xCA53, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF5D, 0xAF3D, 0xAF3E, 0xA69C, 0x8191, 0x8191, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0D1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xAA13, 0xB418, 0xA438, 0x9AB4, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xAA74, 0xAC78, 0xACF9, 0x9B35, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F2, 0xB0D1, 0xB0F1, 0xA9B3, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0x9C77, 0x8191, 0x9931, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xAF3E, 0xAF3E, 0xAF5D, 0xAF3E, 0x9477, 0x8191, 0x9951, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xADBA, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAEFD, 0xCB56, 0xCA53, 0xCA74, 0xD253, 0xD274, 0xD274, 0xD273, 0xCA73, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD254, 0xCA74, 0xCA54, 0xCA54, 0xCA74, 0xC932, 0xC932, 0xC932, 0xC912, 0xC912, 0xC912, 0xC0F1, 0xC8D1, 0xC8D1, 0xC8D1, 0x335C, 0x041F, 0x03FF, 0x03FF, 0x047D, 0x0795, 0x07F6, 0x07FA, 0x07FE, 0x07FF, 0x2E3C, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0D1, 0xB0F1, 0x40F0, 0x28CF, 0x28EF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA53, 0xCA53, 0xCA53, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0x9457, 0x8191, 0x9931, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB1B3, 0xAD9A, 0xAF3D, 0xAF3D, 0xA73D, 0xA73D, 0x9DDA, 0x89D1, 0x9951, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB213, 0xAD9B, 0xA73E, 0xA73D, 0xAF3E, 0xAF3E, 0x9DDA, 0x81F2, 0x9171, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D2, 0xB0F1, 0xAD39, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3E, 0xAF1E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xAF3E, 0xA73E, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xA73E, 0x9478, 0x8191, 0x9931, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xAD9A, 0xA73E, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xAF3D, 0xAF3D, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xAEDD, 0xC376, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0x309C, 0x005F, 0x58B9, 0xC912, 0xC111, 0xC8F1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0x337C, 0x045F, 0x041F, 0x041F, 0x045E, 0x0775, 0x07F5, 0x07FA, 0x07FE, 0x07FF, 0x2E3C, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0x80F1, 0x28EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA13, 0xCA33, 0xCA13, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0x8A53, 0x8191, 0xA8F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB213, 0xA6BD, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0x9E1B, 0x81F1, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB1F3, 0xA6BD, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0x9E1B, 0x89F2, 0x8991, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB336, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71E, 0xA71D, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA73E, 0xA71D, 0xA73E, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA73E, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0x9477, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA59A, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71E, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71E, 0xA71D, 0xA73D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xBBF7, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA14, 0xD233, 0xCA33, 0x003F, 0x003F, 0x005F, 0x78D7, 0xC0F2, 0xC8F1, 0xC0D1, 0xC0D1, 0xC0D1, 0xC8B1, 0x4B1A, 0x047F, 0x045F, 0x043F, 0x045F, 0x0735, 0x07F4, 0x07F9, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xA8F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xA0F1, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA13, 0xCA13, 0xCA13, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x8191, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9EFD, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB932, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1E, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E1B, 0x9457, 0x92D4, 0xA1F3, 0xA911, 0xB0F1, 0xB0F1, 0xA911, 0xB274, 0xB254, 0xB254, 0xABF7, 0xA5DB, 0xA6FD, 0xA6FD, 0xA71D, 0xA71D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E7C, 0x9498, 0x8B14, 0x9A13, 0xA131, 0xA912, 0xB0F1, 0xA8F1, 0xB255, 0xB274, 0xB254, 0xAB97, 0xAD1A, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9457, 0x8191, 0xA131, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA57A, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9E7C, 0x9DBA, 0xA59A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA69C, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E5C, 0x94B8, 0x8AF4, 0x9A13, 0xA131, 0xA8F1, 0xB0F1, 0xB0F1, 0xB932, 0xB274, 0xB254, 0xB336, 0xACB9, 0xA63C, 0x9F1D, 0xBBF7, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0x003F, 0x003F, 0x005F, 0x58B9, 0xC0F1, 0xC0D1, 0xC8D1, 0xC8B2, 0xC0B1, 0xC0B1, 0x62B8, 0x04BF, 0x047F, 0x047F, 0x045F, 0x0715, 0x07F4, 0x07F9, 0x07FD, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xA8F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0x58F0, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC9D3, 0xC9D3, 0xC9D3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x959A, 0x8191, 0x9151, 0xC0B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB2B5, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8252, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB1F3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9F1D, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8A93, 0x8191, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xA63C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x94F8, 0x8A53, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8B1, 0xC0B1, 0xC0D1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB992, 0xACB9, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E5C, 0x8B96, 0x8991, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB932, 0xABF7, 0x9E9C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E9C, 0x8B96, 0x8971, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB335, 0xA63C, 0xBBD7, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0x001F, 0x003F, 0x003F, 0x00DF, 0x88F6, 0xC8D1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0x62D9, 0x04FF, 0x04BF, 0x049F, 0x047F, 0x06B6, 0x07F3, 0x07F8, 0x07FD, 0x07FF, 0x2E3C, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0x98F2, 0xB0F1, 0xB0F1, 0xB0F1, 0x78F0, 0x90F1, 0x80D1, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0xC9B3, 0xC9B3, 0xC9B3, 0x9EDD, 0x96FD, 0x9EDD, 0x96FD, 0x9EFC, 0x96FD, 0x96FD, 0x9599, 0x8991, 0x9171, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xABD7, 0x9EFC, 0x96FD, 0x96FD, 0x96DD, 0x96FD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x9EFD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xAB76, 0x9EDD, 0x9EFD, 0x9EFD, 0x9EDD, 0x9EDD, 0x96DD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x8C37, 0x8191, 0xA131, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xA55A, 0x96FD, 0x9EDD, 0x9EFD, 0x96FD, 0x963B, 0x8AF4, 0x8991, 0xA911, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xB992, 0xA55A, 0x9EDD, 0x9EFC, 0x96FD, 0x9EDD, 0x96FD, 0x9EFD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x94F9, 0x81F1, 0x9171, 0xB8D2, 0xC0B1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB992, 0x9DBB, 0x96FD, 0x9EDD, 0x96FD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x9EDD, 0x96FD, 0x96FD, 0x9EFD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x96FD, 0x9EFD, 0x96FD, 0x9EFD, 0x9EFD, 0x96FD, 0x9EFD, 0x96FD, 0x9539, 0x81F1, 0x9171, 0xB0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB911, 0xACFA, 0xB458, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B3, 0x001F, 0x003F, 0x003F, 0x00BF, 0x311C, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x6278, 0x053F, 0x04FF, 0x04BF, 0x049F, 0x0696, 0x07F2, 0x07F7, 0x07FC, 0x07FF, 0x2E3C, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x8912, 0xB0F1, 0xB0F1, 0xB0D1, 0x48F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC993, 0xC993, 0xC992, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8D79, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x95DA, 0x89F2, 0x8971, 0xB8D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0x9931, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DC, 0x96DD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8CD8, 0x8191, 0x9951, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xAC79, 0xACF9, 0xC992, 0xC993, 0xC9B2, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0xC992, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0x003F, 0x003F, 0x003F, 0x00BF, 0x011F, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x79D6, 0x051F, 0x051F, 0x04FF, 0x04BF, 0x0638, 0x07F1, 0x07F7, 0x07FC, 0x07FF, 0x2E3C, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0F1, 0x80F2, 0xB0F1, 0xB0F1, 0xB0F2, 0x3110, 0x30F0, 0x28CF, 0x28EF, 0x20CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x10D2, 0x08F3, 0x10F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC972, 0xC972, 0xC972, 0x8EBC, 0x8EBD, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8D7A, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D39, 0x8EBD, 0x8EDD, 0x8DBA, 0x81F2, 0x9171, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B2, 0xC8B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xA437, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBD, 0x8EBD, 0x8CD8, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0xA4D9, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0x9D3A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8CD8, 0x8191, 0x9951, 0xC8B1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC8B1, 0xC8D1, 0xA478, 0xA4D9, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0x003F, 0x003F, 0x001F, 0x009F, 0x00DF, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9174, 0x049F, 0x057F, 0x051F, 0x04FF, 0x0619, 0x07F1, 0x07F6, 0x07FC, 0x07FF, 0x35BB, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x6912, 0xB0F1, 0xB0F1, 0x98F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28EF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00FA, 0x011A, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC952, 0xC952, 0xC952, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D59, 0x8191, 0x9171, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xABD7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA931, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC0F2, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8437, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D3A, 0x8EBC, 0x8E1B, 0x81F2, 0x8971, 0xB912, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC112, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F1, 0xA498, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8DBA, 0x8991, 0x8991, 0xC0F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC8F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC132, 0x8E5C, 0x8C17, 0x8191, 0xA931, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C17, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8DBA, 0x81F2, 0x8991, 0xC111, 0xC8F1, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8D2, 0xC8F1, 0xC8F2, 0xC0F1, 0xC0F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC152, 0x95FB, 0xA4B8, 0xC152, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0x001F, 0x001F, 0x001F, 0x007F, 0x00DF, 0x68B7, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA8F3, 0x041F, 0x057F, 0x053F, 0x051F, 0x05F9, 0x07F0, 0x07F6, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x5912, 0xB0F1, 0xB0F1, 0x90F1, 0x30F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC932, 0xC932, 0xC932, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D79, 0x8191, 0x9171, 0xC132, 0xC131, 0xC912, 0xC912, 0xC132, 0xC911, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC911, 0xC912, 0xC912, 0xC112, 0xC912, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8AD4, 0x8191, 0xB152, 0xC912, 0xC131, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC912, 0xC912, 0xC911, 0xC112, 0xC932, 0xC912, 0xC912, 0xC932, 0xC911, 0xC912, 0xC912, 0xC932, 0xC131, 0x9DBA, 0x8EBC, 0x96BC, 0x8EBC, 0x8EDC, 0x96BB, 0x8EBC, 0x8EDC, 0x82D4, 0x8191, 0xB932, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC131, 0xC912, 0xC132, 0xC131, 0xC912, 0xC912, 0xC911, 0xC911, 0xC131, 0xC912, 0xC912, 0xB356, 0x8C36, 0x8191, 0xA151, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC112, 0x9D59, 0x8EBC, 0x96BC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8EBC, 0x82F4, 0x8991, 0xB151, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC131, 0xC932, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC912, 0xC911, 0xC932, 0xC932, 0xC112, 0xC911, 0xC132, 0xC912, 0xC912, 0xC932, 0xB336, 0x96BC, 0xA4F9, 0xC192, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0x001F, 0x001F, 0x001F, 0x007F, 0x00BF, 0x009F, 0x90B5, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x0B9E, 0x053F, 0x057F, 0x053F, 0x05DA, 0x07EF, 0x07F5, 0x07FB, 0x07FF, 0x5478, 0xB0D1, 0xB0F1, 0xB0F1, 0x9111, 0x5912, 0xA8F1, 0xB0F1, 0x70F1, 0x30F0, 0x28EF, 0x20EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC912, 0xC912, 0xC912, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9EDB, 0x9578, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xB417, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA518, 0x9EDB, 0x96DB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x94D8, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC253, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xBAB5, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9599, 0x8191, 0x91B1, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B5, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC972, 0xC1B2, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x8C36, 0x8991, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9598, 0x8191, 0x9191, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC172, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA61A, 0x9EDC, 0xA5DA, 0xC172, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0xC111, 0xC912, 0xC912, 0xC912, 0x001F, 0x001F, 0x001F, 0x005F, 0x007F, 0x007F, 0x6098, 0xC0B1, 0xB8B1, 0xC0B1, 0xC0B1, 0x2AFC, 0x04FF, 0x05BF, 0x055F, 0x05FB, 0x07CF, 0x07F4, 0x07FC, 0x07FF, 0x5C79, 0xB0F1, 0xB0F1, 0xB0F1, 0x8112, 0x5912, 0xB0F1, 0xB0F1, 0x68F1, 0x30F0, 0x30EF, 0x30CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC8F1, 0xC8F1, 0xC8F2, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6DA, 0xA6FA, 0x9D98, 0x8191, 0x9191, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC992, 0xB436, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD99, 0x8A32, 0x8991, 0xC192, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC973, 0xC992, 0xC992, 0xC992, 0xBC36, 0xA69A, 0xA6FA, 0xA6FA, 0xA69A, 0x9395, 0x8991, 0xB992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0xAD98, 0xA6DB, 0xA6DA, 0xA6FA, 0xA6FB, 0xA6FA, 0x9395, 0x8191, 0xB192, 0xC992, 0xC992, 0xC992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC972, 0xC233, 0xAD98, 0xA6FA, 0xA6FB, 0xA639, 0x8A93, 0x9992, 0xC192, 0xC972, 0xC992, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0x9A93, 0x8191, 0xA992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6DA, 0x8B95, 0x8191, 0xB192, 0xC972, 0xC992, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC294, 0xADF9, 0xA6FA, 0xA6DA, 0xA69A, 0x9334, 0x9191, 0xB992, 0xC992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xB497, 0xAEFB, 0xAEFB, 0xB5D9, 0xC952, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x005F, 0x7897, 0xC0B1, 0xC0D1, 0xC0B1, 0xB8D1, 0x6238, 0x04DF, 0x05BF, 0x059F, 0x05FA, 0x07CE, 0x07F4, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0F1, 0xB0F1, 0x7112, 0x5912, 0xB0F1, 0xA8F1, 0x5110, 0x30F0, 0x30CF, 0x28CF, 0x28CF, 0x28CF, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0xC0D1, 0xC0D1, 0xC8D2, 0xB71A, 0xB71A, 0xB71A, 0xAEFA, 0xB71A, 0xAF1A, 0xAEFA, 0xA598, 0x8191, 0x9191, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9D3, 0xBC76, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0x9C55, 0x8191, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xC9D3, 0xB5B8, 0xB71A, 0xAF1A, 0xB71A, 0xB6FA, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB6FA, 0xAF1A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xA3B5, 0x8191, 0x9992, 0xC9B2, 0xC9B3, 0xC9D2, 0xC9B2, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xCA13, 0xBDB8, 0xAEFA, 0xAF1A, 0xB71A, 0xB6FA, 0xAEFA, 0xAF19, 0xA4F7, 0x8991, 0xB1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9B3, 0xC9B3, 0xC314, 0xAF1A, 0xAF1A, 0xAEF9, 0xAF1A, 0xAF1A, 0x89F1, 0x8191, 0xC1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B2, 0xC9D3, 0xC9B3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xAEFA, 0xB71A, 0xB6B9, 0x8A93, 0x8991, 0xC1D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B2, 0xA992, 0x8191, 0xA9B2, 0xC9D3, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B2, 0xC9B2, 0xC9B3, 0xB5B8, 0xAF1A, 0xAEFA, 0xAF1A, 0xB71A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xB5B8, 0xB6FA, 0xAF1A, 0xAF1A, 0xB6FA, 0x89F2, 0x8191, 0xC1B2, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xB71A, 0xB6FA, 0xB71A, 0x92F3, 0x89B1, 0xC1B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9D3, 0xC315, 0xB71A, 0xB71A, 0xB71A, 0xBDD9, 0xC132, 0xC0D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x007F, 0x6878, 0xB8B1, 0xC0B1, 0xC0D1, 0xB8D1, 0x9954, 0x047F, 0x05BF, 0x05BF, 0x061A, 0x07CE, 0x07F2, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0F1, 0xB0F1, 0x6112, 0x5912, 0xA8F1, 0xA8F1, 0x60F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xC0B1, 0xC8B1, 0xC0B1, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA4B5, 0x8191, 0xA1B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0xC496, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF39, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0x99F2, 0x8991, 0xB1D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC577, 0xBF19, 0xBF39, 0xBF39, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9BF5, 0x8191, 0xB1D2, 0xC9F3, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF19, 0xBF19, 0xB6B9, 0x8191, 0x8991, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9D3, 0xC9F3, 0xC9F3, 0xBED8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xAD57, 0x8191, 0x99B2, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x8191, 0xA9B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9C75, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xB6B8, 0x8191, 0x8191, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xADB7, 0x8191, 0x91B1, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC71A, 0xBF1A, 0xC73A, 0xBF3A, 0xC659, 0xC9D3, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x003F, 0x001F, 0x7076, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x0BFF, 0x05DF, 0x05BF, 0x0639, 0x07CD, 0x07F2, 0x07FC, 0x07FF, 0x63F7, 0xB0F1, 0xB0F1, 0xB0F1, 0x4132, 0x4111, 0xA0F1, 0xB0F1, 0x90F1, 0x30F0, 0x28EF, 0x28CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xC0B1, 0xC0B1, 0xC0B1, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8991, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA34, 0xCA13, 0xCA33, 0xCA33, 0xCCB6, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA455, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0x91B1, 0x8191, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA13, 0xC455, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0x8A52, 0x8991, 0xC213, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCD56, 0xC738, 0xC738, 0xC739, 0xB5D7, 0x8191, 0x91B1, 0xCA13, 0xCA13, 0xCA13, 0xD233, 0xCA33, 0xCA33, 0xCA33, 0xCB55, 0xCF38, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0x8191, 0x8191, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xD233, 0xCA13, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCDF7, 0xC738, 0xC738, 0xC738, 0xC739, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xB5D6, 0x8191, 0x99B2, 0xCA33, 0xCA33, 0xD213, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCB74, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0x8AB2, 0x8191, 0xBA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA13, 0xCF39, 0xC739, 0xC759, 0xCF3A, 0xCF39, 0xCED9, 0xC9F3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x001F, 0x001F, 0x9894, 0xB8D1, 0xB8D1, 0xB8D1, 0x42DA, 0x059F, 0x05FF, 0x0678, 0x07CC, 0x07F1, 0x07FC, 0x07FF, 0x82B5, 0xA8F1, 0xB0F1, 0x98F2, 0x4132, 0x3912, 0x70F1, 0xA8F1, 0xA8F1, 0x50F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC0B1, 0xC0B1, 0xC0B1, 0xCF57, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA54, 0xCCD6, 0xCF58, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF58, 0xAC75, 0x8191, 0xA9F2, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCE17, 0xCF57, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0x99D2, 0x89B1, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xD6B7, 0xD758, 0xCF58, 0xCF57, 0xCF58, 0xD758, 0xD757, 0xD758, 0xD757, 0xD758, 0xCF58, 0xB535, 0x8191, 0xA1D2, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCA73, 0xCA53, 0xCA53, 0xCC95, 0xD758, 0xD758, 0xCF58, 0xBDD6, 0x8191, 0x99D2, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD254, 0xCA54, 0xD435, 0xD758, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF57, 0xD738, 0xCF58, 0x9AF3, 0x8991, 0xC213, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA54, 0xCA73, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xD253, 0xCA54, 0xD253, 0xCA53, 0xCA54, 0xCE17, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xD617, 0xD758, 0xCF58, 0xCF58, 0xBDD6, 0x8191, 0x91B2, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xD253, 0xD253, 0xCCD6, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF57, 0xD757, 0xCF58, 0xD758, 0x9AF3, 0x8191, 0xBA33, 0xCA54, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xD758, 0xD758, 0xDF59, 0xD779, 0xD759, 0xD759, 0xD6F9, 0xC1F2, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x001F, 0x001F, 0x001F, 0x183E, 0xB0D2, 0xB8D1, 0xB8D1, 0x9974, 0x059F, 0x061F, 0x0698, 0x07CC, 0x07F0, 0x07FC, 0x07FF, 0x82B5, 0xB0F1, 0xB0F1, 0x88F1, 0x4132, 0x4111, 0x3910, 0x98F1, 0xA8F2, 0x88F1, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC0B1, 0xC0B1, 0xC0B1, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0x99D2, 0x91D2, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xD3D4, 0xDF77, 0xDF77, 0xDF77, 0xDF76, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0x8191, 0x8992, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xCA94, 0xD3D5, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xCA94, 0xCA94, 0xD273, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xD515, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xD294, 0xCA94, 0x8191, 0xAA12, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA93, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xE779, 0xDF19, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x385B, 0xB8D1, 0xB8D1, 0xB8D1, 0x2C3C, 0x061F, 0x06B7, 0x07CB, 0x07F0, 0x07FB, 0x07FF, 0xB0F1, 0xB0F1, 0xA8F1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xA0F1, 0xA8F1, 0x48EF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xC0D1, 0xE776, 0xE796, 0xE797, 0xE797, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2D4, 0xD2B4, 0xD2B4, 0xDD35, 0xE776, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xB474, 0x8191, 0xAA33, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2D4, 0xE656, 0xEF96, 0xE776, 0xE797, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0x99D2, 0x99F2, 0xCAB4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD3F5, 0xE777, 0xE797, 0xEF97, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xE777, 0xEF97, 0x8191, 0x8191, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD3D5, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xCAD4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xDD35, 0xE777, 0xEF76, 0xE796, 0xE797, 0xE797, 0xE776, 0xE796, 0xE776, 0xC534, 0xB494, 0xCC15, 0xD3F5, 0xDBF4, 0xDBF4, 0xDBF5, 0xD3F5, 0xD3F4, 0xCB34, 0x8191, 0xAA32, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xE656, 0xE776, 0xE796, 0xE796, 0xE776, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xDE56, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2D4, 0xCAD4, 0xCAD4, 0xDD15, 0xE796, 0xE796, 0xE776, 0xE796, 0xEF96, 0xE796, 0xE796, 0xE796, 0x9B13, 0x8191, 0xBA73, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xE797, 0xEF97, 0xEF77, 0xEF97, 0xEF78, 0xEF98, 0xEF98, 0xEF98, 0xC992, 0xB8D1, 0xC0D1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x7096, 0xB8D1, 0xB8D1, 0x8A35, 0x063F, 0x06D6, 0x07EA, 0x07F1, 0x07FC, 0x07FF, 0xA8F1, 0xA8F1, 0xA8F1, 0x6132, 0x4132, 0x4111, 0x38F1, 0x3110, 0x48F0, 0xA8F1, 0x98F1, 0x30CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xF796, 0xF7B6, 0xF796, 0xF795, 0xF795, 0xF796, 0xEFB6, 0xBC93, 0x8191, 0xAA52, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2F4, 0xDD55, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xEFB6, 0xBC93, 0x8191, 0xAA53, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xE675, 0xF796, 0xF795, 0xF796, 0xF796, 0xF796, 0xF7B6, 0xF7B5, 0xF7B5, 0xEF96, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0x99F2, 0x99F2, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2F4, 0xD2F4, 0xDC75, 0xF795, 0xF795, 0xF795, 0xF796, 0xF7B5, 0xF796, 0xF796, 0xF796, 0xF796, 0xEFB6, 0xF7B5, 0xF796, 0x8191, 0x8991, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xDC15, 0xF796, 0xF796, 0xF796, 0xD615, 0x8191, 0x99F2, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xE535, 0xF7B6, 0xF7B5, 0xF796, 0xEFB6, 0xF796, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xF795, 0xF796, 0xF796, 0xF795, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xBC93, 0x8191, 0xAA53, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF796, 0xF7B5, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF7B5, 0xF795, 0xD634, 0x8191, 0x99F2, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2D4, 0xE555, 0xF796, 0xF7B5, 0xF7B6, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xA311, 0x8191, 0xBA94, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xF796, 0xF796, 0xF797, 0xF797, 0xF797, 0xF7B7, 0xF798, 0xF798, 0xD273, 0xB8D1, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x98B4, 0xB8D1, 0xB8D1, 0x3C9B, 0x06F5, 0x07E9, 0x07F1, 0x07FD, 0x26BD, 0xB0F1, 0xB0F2, 0xB0F1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30F0, 0x60F0, 0xA911, 0x70F0, 0x20CE, 0x20CF, 0x20AE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xFF94, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD315, 0xD335, 0xD335, 0xD335, 0xD334, 0xD315, 0xD335, 0xE575, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xF675, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB5, 0xFF95, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0x99F2, 0x99F2, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD315, 0xD335, 0xDC54, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0x8191, 0x8191, 0xD334, 0xD315, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xDC34, 0xFFB4, 0xFFB5, 0xFFB5, 0xDE34, 0x8191, 0x99F2, 0xD314, 0xD335, 0xD315, 0xD334, 0xD334, 0xD335, 0xD335, 0xE574, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xC4B3, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xEDF5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0xF694, 0xFFB5, 0xFFB5, 0xFFB5, 0xDE14, 0x8191, 0x99F2, 0xD335, 0xD335, 0xD314, 0xD334, 0xD314, 0xD334, 0xD315, 0xE555, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xA332, 0x8191, 0xBAB4, 0xD335, 0xD335, 0xD335, 0xD315, 0xD334, 0xD335, 0xD335, 0xFFB5, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB7, 0xFFB8, 0xDBD4, 0xB8D2, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x083F, 0x70F7, 0xB8D1, 0xA952, 0x0E94, 0x07C9, 0x07F2, 0x07FD, 0x2E3C, 0xA8F1, 0xA8F1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30EF, 0x58F0, 0xA8F1, 0x40CF, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x00F9, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xC3F0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xF590, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x9A12, 0x91F2, 0xD355, 0xD354, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDBD4, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0x8191, 0x8191, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDC13, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x99F2, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xC3CF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xE4D1, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xC3D0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xF590, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x9A12, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD2, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE2F, 0xA2B0, 0x8191, 0xC2F4, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xFE2F, 0xFE50, 0xFE50, 0xFE50, 0xFE51, 0xFE51, 0xFE52, 0xFE52, 0xE3D2, 0xB8D2, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x003F, 0x00DF, 0x59F8, 0xB8D1, 0x8291, 0x07C9, 0x07F2, 0x07FE, 0x455A, 0xB0F1, 0xA8F1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x50CF, 0x48EF, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xB8D1, 0xB0D1, 0xB0D2, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xC30F, 0x81B1, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD396, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0x9A12, 0x8191, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xDBD3, 0xFC8D, 0xFC6D, 0xFC6D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC8D, 0xFC6D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD375, 0xD395, 0xD376, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFC8E, 0xFC8F, 0xFC8F, 0xFC8F, 0xFCB0, 0xFCB0, 0xFCB1, 0xFCB1, 0xF3B2, 0xB8D1, 0xB0F1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x031F, 0x2D3B, 0x99B2, 0x454B, 0x07F3, 0x07FE, 0x5498, 0xB0F1, 0xA8F1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30F0, 0x30EF, 0x30CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xB0F1, 0xB0D1, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9A12, 0x8191, 0xC334, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFC8E, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFC8D, 0xFC8D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB2F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB6F, 0x8191, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFC8E, 0xFC8F, 0xFCAF, 0xFCAF, 0xFCB0, 0xFCB0, 0xFCB0, 0xFCB2, 0xF451, 0xB0D1, 0xB0D1, 0xB0D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x003F, 0x005F, 0x025F, 0x06FD, 0x0770, 0x0F88, 0x07F4, 0x07FF, 0x5478, 0xA8F1, 0xA8F1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xB0F1, 0xB0D1, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xCB4E, 0x8191, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xBB11, 0x8191, 0xAA73, 0xD396, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFCAE, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFCAD, 0xFCCD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD3, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCAD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA94, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xFCAD, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFCCE, 0xFCCF, 0xFCCF, 0xFCEF, 0xFCD0, 0xFCF0, 0xFCF1, 0xFCF1, 0xFCF2, 0xB0F1, 0xB0F1, 0xB0F2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x007F, 0x021F, 0x06FC, 0x078D, 0x07E7, 0x07F6, 0x07FF, 0x82B5, 0xA8F1, 0xA111, 0x4932, 0x4132, 0x4111, 0x38F1, 0x38F0, 0x30F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xA8F1, 0xB0F1, 0xFD0D, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFD0D, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC6F, 0x91D1, 0x89D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xDBB4, 0xEC70, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFCED, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBF3, 0xFCED, 0xFCED, 0xFCED, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xEC6E, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xF4AF, 0xFD0D, 0xFCED, 0xFD0D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD0E, 0xFD0F, 0xFD0F, 0xFD0F, 0xFD10, 0xFD10, 0xFD31, 0xFD31, 0xFD32, 0xB0F1, 0xB0F1, 0xB0F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x005F, 0x021F, 0x073B, 0x07AC, 0x07E7, 0x07F7, 0x07FF, 0x82B5, 0xA8F1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x10CF, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xA8F1, 0xB0F1, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xE44E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xC34F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xE431, 0xEC71, 0xEC71, 0xDBF0, 0xE450, 0xF4CF, 0xFD0E, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xF4AF, 0xF4CF, 0xF4AF, 0xDC10, 0x9A12, 0xAA73, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2C, 0xFD2C, 0x9211, 0x8191, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFCEE, 0xFD2D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC10, 0xE44E, 0xDC2E, 0xE44E, 0xB2F0, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD2E, 0xFD2F, 0xFD2F, 0xFD4F, 0xFD50, 0xFD50, 0xFD51, 0xFD51, 0xFD71, 0xA8F1, 0xB0F1, 0xB0F2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x007F, 0x023F, 0x073B, 0x07AB, 0x07E8, 0x07F9, 0x07FF, 0xA152, 0xA8F1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA8F1, 0xA8F1, 0xA8F2, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xE46E, 0x8191, 0x9212, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD2D, 0x9211, 0x89B2, 0xCB75, 0xD396, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xBB2F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD6E, 0xFD6F, 0xFD6F, 0xFD8F, 0xFD90, 0xFD90, 0xFD91, 0xFD91, 0xFD92, 0xA8F1, 0xA8F1, 0xA8F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x005F, 0x007F, 0x009F, 0x023F, 0x0779, 0x07AA, 0x07E8, 0x07FB, 0x07FF, 0xA8F1, 0xA8F1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x0116, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xA8F1, 0xA8F1, 0xA8F1, 0xEC6F, 0xFD8D, 0xFDAD, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xE48E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFDAD, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFD8D, 0xE4AE, 0x8991, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xE491, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFDAD, 0xF52D, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFD8D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFDAF, 0xFDAF, 0xFDAF, 0xFDAF, 0xFDB0, 0xFDB0, 0xFDB1, 0xFDD1, 0xE4B2, 0xA911, 0xA8F1, 0xA8F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x007F, 0x009F, 0x02BF, 0x0778, 0x07C8, 0x07E9, 0x07FD, 0x173E, 0xA8F1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA911, 0xA911, 0xA911, 0xEC8E, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xE4CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDED, 0xFDCD, 0xD44F, 0x8191, 0xB2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0x8991, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xBB6F, 0x8191, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDED, 0xFDED, 0xFDED, 0xFDED, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFDEE, 0xFDEF, 0xFDEF, 0xFDF0, 0xFDF0, 0xFDF0, 0xFDF1, 0xFDF1, 0xECB1, 0xA0F1, 0xA911, 0xA911, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x005F, 0x005F, 0x007F, 0x009F, 0x009F, 0x041F, 0x0797, 0x07C7, 0x07EB, 0x07FE, 0x2E5C, 0xA8F1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0118, 0x0117, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA911, 0xA911, 0xA111, 0xE42E, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xE4EE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xD44F, 0x8191, 0xBAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xECD1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xF5AD, 0x9A70, 0x89B1, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0E, 0xFE0D, 0xFE0E, 0xFE0E, 0xFE0E, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE0F, 0xFE0F, 0xFE0F, 0xFE30, 0xFE30, 0xFE30, 0xFE31, 0xFE31, 0xDC32, 0xA111, 0xA911, 0xA111, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x005F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x043F, 0x0794, 0x07E6, 0x07EC, 0x07FE, 0x35DB, 0xA911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AC, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x00F8, 0x18CF, 0x20AD, 0x18AD, 0x20AD, 0x18AC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x80F0, 0xA111, 0xA111, 0xC2B0, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x89D1, 0xA253, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xF60E, 0x9A70, 0x91F2, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF2, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE4E, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE50, 0xFE71, 0xFE51, 0xBA52, 0xA111, 0xA111, 0x78D5, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x00BF, 0x043F, 0x07B3, 0x07C5, 0x07EE, 0x07FF, 0x5478, 0x6AD6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x00F6, 0x0118, 0x00F8, 0x18CF, 0x18AC, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x60EF, 0xA111, 0xA111, 0xA112, 0xFE2D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xE54E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xF5CF, 0xFE6D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE6D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5CE, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6C, 0xFE8D, 0xF62D, 0xC40F, 0x9A12, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE8D, 0xFE6D, 0xFE2D, 0xBBCF, 0x89B1, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFE90, 0xFE91, 0xE471, 0xA111, 0xA112, 0xA111, 0x60D5, 0x001F, 0x283C, 0x7097, 0x405A, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x009F, 0x00BF, 0x00BF, 0x00DF, 0x045F, 0x07D2, 0x07E4, 0x07EF, 0x07FF, 0x2E3C, 0x2D1A, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x00F6, 0x0118, 0x00F7, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x28CD, 0xA111, 0xA111, 0xA111, 0xCBCF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xF5ED, 0x89D1, 0x91D2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xED11, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xC42F, 0x81B1, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFECC, 0xFEAD, 0xC42F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF64D, 0xD4CE, 0xBBD0, 0xC3B2, 0xC314, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xED31, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xEE0D, 0xCC6F, 0xBB51, 0xBAD4, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xC334, 0x8191, 0xB294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFEAE, 0xFECE, 0xFEAD, 0xFEAE, 0xFEAD, 0xFECE, 0xFEAE, 0xFEAE, 0xA2F0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC34, 0xFEAF, 0xFED0, 0xFEAF, 0xFED0, 0xFEB0, 0xFED1, 0xE491, 0xA911, 0xA111, 0x9931, 0xA111, 0x58D6, 0x88B5, 0xB8D1, 0xB8D1, 0x5059, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x009F, 0x00BF, 0x00FF, 0x00DF, 0x047F, 0x07D2, 0x07E3, 0x07F1, 0x07FF, 0x07FF, 0x2CBA, 0x4933, 0x4132, 0x4131, 0x4111, 0x38F0, 0x38F0, 0x30F0, 0x30EF, 0x28EF, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F6, 0x0118, 0x0118, 0x18CF, 0x20AD, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x20AD, 0x18AD, 0x8110, 0x9911, 0xA111, 0xA171, 0xF5ED, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE6D, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5CF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE4E, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EE, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE8D, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xF64D, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE6E, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF60E, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF64E, 0xFEAC, 0xFEAD, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE6D, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5CF, 0xFEAD, 0xF62E, 0xF5EF, 0xF5D0, 0xF5EF, 0xF5CF, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xFE4F, 0xFECE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAF, 0xF610, 0xF5D0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF610, 0xFEAF, 0xFEAF, 0xFEAF, 0xFED0, 0xFEB0, 0xFEB1, 0xE471, 0xB8D1, 0xA111, 0x9931, 0x9931, 0x9912, 0x6933, 0xB0F1, 0xB0D1, 0xB0D1, 0x283C, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x00BF, 0x00DF, 0x00FF, 0x011F, 0x047F, 0x07D1, 0x07E3, 0x07F3, 0x07FF, 0x07FF, 0x3B77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38F0, 0x38F0, 0x30EF, 0x30EF, 0x28EF, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0118, 0x0117, 0x18CF, 0x18AD, 0x18AC, 0x18AC, 0x18AD, 0x18AC, 0x20AD, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18CD, 0x18AC, 0x20AC, 0x38CE, 0x9931, 0x9931, 0x9931, 0xAA31, 0xFE2D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFEAC, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFEAC, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8E, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAF, 0xFEAE, 0xFEAE, 0xFEAF, 0xFE8E, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFE8F, 0xFEB0, 0xFEAF, 0xFEB0, 0xFE90, 0xE471, 0xB8D2, 0xA111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xB0F1, 0xB0D1, 0xB0D2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x00DF, 0x00DF, 0x011F, 0x011F, 0x049F, 0x07F0, 0x07E2, 0x07F4, 0x07FF, 0x07FF, 0x3AF6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28EE, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x18AC, 0x20AC, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, + 0x0117, 0x18CF, 0x20AC, 0x20AC, 0x20AD, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AD, 0x20AC, 0x60EF, 0x9912, 0x9931, 0x9931, 0xB270, 0xF62D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE6D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFEB0, 0xFEB0, 0xE471, 0xB8D1, 0xA111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xB0F1, 0xB0D1, 0x90B4, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x049F, 0x07F1, 0x07E2, 0x07F6, 0x07FF, 0x0F9F, 0x4A35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CE, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, + 0x18CE, 0x18AC, 0x20CC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AD, 0x18CC, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x28AD, 0x8110, 0x9931, 0x9931, 0x9911, 0xAA31, 0xF5CD, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE6E, 0xFE8D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE90, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xE471, 0xB0D1, 0xA111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xB0D1, 0xB0D1, 0x7896, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x00BF, 0x011F, 0x011F, 0x013F, 0x017F, 0x04BF, 0x07F2, 0x07E2, 0x07F5, 0x07FF, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30EF, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AD, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x28AD, 0x9111, 0x9931, 0x9931, 0x9931, 0xA171, 0xCBCF, 0xF60D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE70, 0xFE70, 0xFE6F, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE90, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xE471, 0xA8F1, 0xA111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xB0D1, 0xB0D1, 0x5878, 0x001F, 0x001F, 0x003F, 0x007F, 0x009F, 0x00FF, 0x013F, 0x013F, 0x017F, 0x019F, 0x033F, 0x07F3, 0x07E2, 0x07F3, 0x07FF, 0xA8F1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x18CC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x28CD, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xBAB0, 0xDC6F, 0xE50F, 0xE50E, 0xFE4E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6F, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xF612, 0xE531, 0xE512, 0xD472, 0xB271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xB0F1, 0xB0F1, 0x285C, 0x003F, 0x005F, 0x007F, 0x00BF, 0x00FF, 0x013F, 0x015F, 0x017F, 0x019F, 0x01BF, 0x02FF, 0x07F4, 0x07E3, 0x07F1, 0x2E5C, 0xA911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AC, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, + 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x28CC, 0x610F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xB0F1, 0xB0D1, 0x087F, 0x009F, 0x00BF, 0x00DF, 0x011F, 0x015F, 0x019F, 0x019F, 0x019F, 0x01DF, 0x01DF, 0x01FF, 0x07F7, 0x07E3, 0x07EF, 0x5498, 0xA8F1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30EF, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x40CE, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xA111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xB0F1, 0x98F3, 0x00DF, 0x00FF, 0x011F, 0x013F, 0x017F, 0x01BF, 0x01BF, 0x01DF, 0x01DF, 0x01FF, 0x01FF, 0x021F, 0x06D9, 0x07E5, 0x07EC, 0x7355, 0xA8F1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390F, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x28CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x30CC, 0x58CF, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xA111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xA8F1, 0xB0F1, 0x80F5, 0x013F, 0x017F, 0x019F, 0x01BF, 0x01DF, 0x01FF, 0x01DF, 0x01FF, 0x021F, 0x023F, 0x023F, 0x023F, 0x057D, 0x07E8, 0x07E9, 0x82D5, 0xA0F1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38F0, 0x38EF, 0x30EF, 0x30EE, 0x28CE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20AD, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CE, 0x28EE, 0x28EE, 0x30EE, 0x30EF, 0x30EF, 0x30EE, 0x38EF, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xA932, 0xA131, 0xB131, 0xC912, 0xC911, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0x5158, 0x01BF, 0x01DF, 0x01FF, 0x021F, 0x023F, 0x023F, 0x021F, 0x023F, 0x025F, 0x025F, 0x025F, 0x025F, 0x041F, 0x07ED, 0x07E4, 0x7AB4, 0xA911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38EF, 0x30EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20CC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AB, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28AD, 0x28CE, 0x30CE, 0x30CE, 0x30EE, 0x8151, 0xB192, 0xC9B3, 0xC9B2, 0xC992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC932, 0xC912, 0xC912, 0xC111, 0xC8F1, 0xC8F1, 0xC8D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D2, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0x39BB, 0x021F, 0x023F, 0x025F, 0x027F, 0x027F, 0x025F, 0x025F, 0x027F, 0x027F, 0x027F, 0x027F, 0x027F, 0x029F, 0x07F3, 0x07E2, 0x9972, 0xA911, 0xA112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38EF, 0x30EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18CC, 0x18AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x18AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CC, 0x20CC, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x30CD, 0x28EE, 0x30EE, 0x490E, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC932, 0xC932, 0xC912, 0xC912, 0xC912, 0xC0F2, 0xC8D1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB8D2, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0x123E, 0x029F, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x029F, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x02DF, 0x06B9, 0x07E3, 0xA111, 0xA911, 0xA111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390F, 0x38EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x18AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x30ED, 0x692F, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC132, 0xC912, 0xC912, 0xC8F2, 0xC8F1, 0xC8D1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0x9933, 0x02DF, 0x02DF, 0x02FF, 0x02FF, 0x02DF, 0x02BF, 0x02DF, 0x02DF, 0x02DF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02FF, 0x051E, 0x07E8, 0xA912, 0xA111, 0xA111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410F, 0x390F, 0x38EE, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x28AC, 0x20CC, 0x28CC, 0x28CC, 0x28CC, 0x28CD, 0x28CD, 0x28ED, 0x28CD, 0x30CD, 0x9191, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC912, 0xC932, 0xC912, 0xC112, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8D1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88B4, 0x88B5, 0x88B5, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0x69D6, 0x033F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02DF, 0x02FF, 0x035F, 0x03FF, 0x07F0, 0x8A4F, 0xA111, 0xA111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410F, 0x390F, 0x30EE, 0x30EE, 0x30CD, 0x30CD, 0x28CD, 0x28CD, 0x28CC, 0x28CC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CC, 0x20AC, 0x28CC, 0x28CC, 0x28CC, 0x20CC, 0x28CC, 0x28CC, 0x28CD, 0x40EE, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC932, 0xC932, 0x90D5, 0x88D6, 0x6098, 0x5879, 0x303C, 0x305C, 0x081E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00BF, 0x00DF, 0x291C, 0x411A, 0x6118, 0x8915, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0x429A, 0x039F, 0x039F, 0x035F, 0x035F, 0x033F, 0x033F, 0x033F, 0x033F, 0x033F, 0x033F, 0x031F, 0x031F, 0x031F, 0x037F, 0x03FF, 0x06D7, 0x7ACF, 0xA111, 0xA111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410F, 0x40EF, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x28CD, 0x28CD, 0x28CC, 0x28CC, 0x20CC, 0x20CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x28CC, 0x28CC, 0x28CC, 0x28CD, 0x28CC, 0x490E, 0xC1D3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC952, 0x98F5, 0x60B8, 0x407B, 0x183E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x00FF, 0x011F, 0x013F, 0x017F, 0x019F, 0x01DF, 0x021F, 0x21FD, 0x49D9, 0x7996, 0xA112, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0x139E, 0x03DF, 0x03BF, 0x039F, 0x039F, 0x037F, 0x037F, 0x037F, 0x037F, 0x035F, 0x035F, 0x033F, 0x033F, 0x035F, 0x03BF, 0x041F, 0x05DE, 0x7AD1, 0xA111, 0xA111, 0xA111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40EF, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x692F, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC992, 0xC9B2, 0xC972, 0xB973, 0x80F7, 0x387B, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00BF, 0x00DF, 0x00FF, 0x013F, 0x015F, 0x019F, 0x01BF, 0x01FF, 0x023F, 0x025F, 0x029F, 0x02DF, 0x02FF, 0x033F, 0x2ADC, 0x5A58, 0x8994, 0xA8F1, 0xA8F1, 0x81D4, 0x041F, 0x041F, 0x03FF, 0x03DF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x037F, 0x035F, 0x037F, 0x039F, 0x03FF, 0x047F, 0x04FF, 0x6375, 0xA112, 0xA111, 0xA111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390F, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28AC, 0x28CC, 0x28CC, 0x28CC, 0x692E, 0xC9F3, 0xC9D2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC993, 0x80F7, 0x389B, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x083C, 0x085B, 0x105B, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187A, 0x105B, 0x085D, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x017F, 0x01BF, 0x01FF, 0x021F, 0x025F, 0x029F, 0x02DF, 0x02FF, 0x033F, 0x037F, 0x03BF, 0x03DF, 0x041F, 0x043F, 0x0C3F, 0x2BBC, 0x0C3F, 0x045F, 0x043F, 0x041F, 0x041F, 0x03FF, 0x03FF, 0x03FF, 0x03DF, 0x03DF, 0x03BF, 0x039F, 0x037F, 0x039F, 0x03DF, 0x043F, 0x04BF, 0x053F, 0x5398, 0xA111, 0xA111, 0xA111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30CD, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CB, 0x28CB, 0x28CC, 0x28CB, 0x614E, 0xD1F3, 0xC9F3, 0xC9D3, 0xC9B2, 0xC9B3, 0xB173, 0x60D9, 0x081E, 0x003D, 0x083B, 0x1878, 0x1877, 0x28D2, 0x28D2, 0x40EE, 0x38EE, 0x390F, 0x390F, 0x390F, 0x410E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x4910, 0x4130, 0x38F3, 0x28B6, 0x189A, 0x003E, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x00BF, 0x00DF, 0x00FF, 0x013F, 0x015F, 0x019F, 0x01DF, 0x021F, 0x023F, 0x027F, 0x029F, 0x02FF, 0x033F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x047F, 0x04BF, 0x04DF, 0x04DF, 0x04BF, 0x04BF, 0x047F, 0x047F, 0x043F, 0x043F, 0x043F, 0x041F, 0x041F, 0x03FF, 0x03DF, 0x03BF, 0x03BF, 0x03DF, 0x043F, 0x047F, 0x04DF, 0x057F, 0x3C1A, 0xA111, 0xA111, 0xA111, 0xA111, 0x5931, 0x4910, 0x4110, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CB, 0x20CB, 0x28AB, 0x692E, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9B3, 0xB1B2, 0x58F3, 0x1895, 0x28B2, 0x30ED, 0x38ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x390E, 0x390E, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390E, 0x410F, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x492F, 0x4930, 0x4910, 0x38F3, 0x20B8, 0x087D, 0x007F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x017F, 0x019F, 0x01DF, 0x021F, 0x025F, 0x02BF, 0x02DF, 0x031F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x049F, 0x04DF, 0x04FF, 0x051F, 0x051F, 0x053F, 0x04FF, 0x04DF, 0x04BF, 0x049F, 0x047F, 0x047F, 0x045F, 0x045F, 0x043F, 0x041F, 0x03FF, 0x03DF, 0x03FF, 0x043F, 0x045F, 0x04BF, 0x053F, 0x05BF, 0x2CDC, 0xA112, 0xA111, 0xA111, 0xA111, 0x7131, 0x4930, 0x4130, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28CB, 0x28CB, 0x612E, 0xC9F3, 0xC9D3, 0xC9D3, 0xB992, 0x692E, 0x28CC, 0x28EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x30ED, 0x38ED, 0x38ED, 0x390E, 0x38EE, 0x38EE, 0x38EE, 0x390F, 0x38EE, 0x40EE, 0x40EE, 0x390F, 0x390E, 0x410E, 0x40EF, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4910, 0x4910, 0x4930, 0x4113, 0x28F8, 0x08FE, 0x013F, 0x015F, 0x019F, 0x01DF, 0x021F, 0x023F, 0x029F, 0x02BF, 0x031F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x049F, 0x04DF, 0x051F, 0x053F, 0x057F, 0x059F, 0x057F, 0x055F, 0x053F, 0x04FF, 0x04FF, 0x04DF, 0x04BF, 0x049F, 0x049F, 0x047F, 0x045F, 0x043F, 0x041F, 0x041F, 0x043F, 0x045F, 0x04BF, 0x04FF, 0x055F, 0x05DF, 0x0E1F, 0xA111, 0xA111, 0xA111, 0xA112, 0x8931, 0x4930, 0x4130, 0x410F, 0x410E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x20CB, 0x612E, 0xD1F3, 0xC9F3, 0xC1B2, 0x612E, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197A, 0x01DE, 0x021F, 0x027F, 0x02BF, 0x02FF, 0x033F, 0x037F, 0x03BF, 0x03FF, 0x045F, 0x049F, 0x04DF, 0x051F, 0x057F, 0x059F, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x059F, 0x055F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04DF, 0x04BF, 0x047F, 0x045F, 0x043F, 0x043F, 0x047F, 0x04BF, 0x04FF, 0x053F, 0x05BF, 0x061F, 0x069F, 0x9972, 0xA111, 0xA111, 0xA111, 0xA111, 0x5130, 0x4910, 0x410F, 0x390F, 0x390E, 0x38ED, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x510D, 0xD1F3, 0xC9D2, 0x816F, 0x30CC, 0x28AC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31B6, 0x0A9D, 0x02FF, 0x035F, 0x039F, 0x03FF, 0x043F, 0x047F, 0x04BF, 0x051F, 0x055F, 0x05BF, 0x05DF, 0x061F, 0x063F, 0x063F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04BF, 0x047F, 0x047F, 0x047F, 0x049F, 0x04DF, 0x053F, 0x057F, 0x05FF, 0x065F, 0x06DF, 0x7A95, 0xA111, 0xA111, 0xA111, 0xA111, 0x6911, 0x4930, 0x410F, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x40EC, 0xC1D2, 0xC1B3, 0x490D, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39D5, 0x131C, 0x041F, 0x047F, 0x04BF, 0x051F, 0x055F, 0x059F, 0x05DF, 0x061F, 0x067F, 0x069F, 0x069F, 0x067F, 0x065F, 0x061F, 0x05FF, 0x05FF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04BF, 0x04BF, 0x04BF, 0x04DF, 0x051F, 0x057F, 0x05BF, 0x063F, 0x069F, 0x071F, 0x5438, 0xA111, 0xA111, 0xA111, 0xA111, 0x8111, 0x4930, 0x410F, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x30CB, 0xA992, 0xA9B1, 0x30CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CC, 0x30EC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3A15, 0x237B, 0x053F, 0x059F, 0x5358, 0x349B, 0x0E1F, 0x06BF, 0x06FF, 0x06FF, 0x06DF, 0x06BF, 0x069F, 0x065F, 0x063F, 0x061F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x051F, 0x04FF, 0x04DF, 0x04DF, 0x04FF, 0x051F, 0x055F, 0x059F, 0x05FF, 0x065F, 0x06DF, 0x073F, 0x359B, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x4930, 0x4910, 0x412F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x692F, 0x816F, 0x20AB, 0x20CB, 0x20AB, 0x28CB, 0x28CB, 0x28CB, 0x28AB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49D4, 0x243A, 0xA132, 0xA8F1, 0xA8F1, 0xA8F1, 0x8295, 0x8295, 0x5418, 0x351B, 0x06DF, 0x069F, 0x067F, 0x065F, 0x063F, 0x05FF, 0x05FF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x051F, 0x053F, 0x057F, 0x059F, 0x05DF, 0x063F, 0x069F, 0x06FF, 0x077F, 0x0F5F, 0xA111, 0xA111, 0xA111, 0xA111, 0x9931, 0x6911, 0x4930, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20CB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x28CB, 0x28AB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30EE, 0x38ED, 0x38ED, 0x390E, 0x390E, 0x390E, 0x410E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA172, 0x4C39, 0x2D5C, 0x069F, 0x065F, 0x063F, 0x061F, 0x05FF, 0x05DF, 0x059F, 0x057F, 0x055F, 0x055F, 0x055F, 0x057F, 0x059F, 0x05DF, 0x061F, 0x067F, 0x06DF, 0x073F, 0x079F, 0x07DF, 0x8254, 0xA111, 0xA131, 0xA111, 0x9911, 0x8131, 0x4910, 0x410F, 0x410E, 0x38EE, 0x38ED, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30EC, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xA111, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA111, 0xA911, 0xA0F1, 0x9972, 0x4419, 0x067F, 0x065F, 0x061F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x059F, 0x05BF, 0x05BF, 0x05DF, 0x061F, 0x065F, 0x06BF, 0x06FF, 0x075F, 0x07BF, 0x07FF, 0x5498, 0xA131, 0xA111, 0xA111, 0xA111, 0x9911, 0x4930, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x28CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30EC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390F, 0x410F, 0x410F, 0x490F, 0x412F, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA111, 0x7A55, 0x34BB, 0x065F, 0x061F, 0x05FF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05FF, 0x063F, 0x065F, 0x069F, 0x06DF, 0x071F, 0x077F, 0x07BF, 0x07FF, 0x2E3C, 0x9911, 0xA111, 0xA111, 0x9931, 0x9931, 0x6910, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xA111, 0xA111, 0xA111, 0x91B3, 0x62F6, 0x347B, 0x061F, 0x061F, 0x063F, 0x063F, 0x065F, 0x067F, 0x06BF, 0x071F, 0x073F, 0x079F, 0x07DF, 0x07FF, 0x07FF, 0xA111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410F, 0x410E, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x91B3, 0x349B, 0x065F, 0x067F, 0x069F, 0x06BF, 0x06FF, 0x073F, 0x077F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x7AD4, 0xA111, 0x9911, 0xA111, 0x9931, 0x9931, 0x4930, 0x410F, 0x390E, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA911, 0xA112, 0xA111, 0xA911, 0xA111, 0xA112, 0xA0F1, 0xA111, 0xA111, 0xA111, 0x7A75, 0x15FD, 0x06BF, 0x06FF, 0x071F, 0x075F, 0x079F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410F, 0x390E, 0x390E, 0x38EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x20AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x40EE, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x5931, 0x90F1, 0xA911, 0xA912, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0x9972, 0x353B, 0x071F, 0x073F, 0x077F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x2E3C, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x412F, 0x4130, 0x4930, 0x4930, 0x8111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA112, 0xA111, 0xA111, 0x4499, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9931, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490F, 0x410F, 0x38EE, 0x30EE, 0x38ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x28AB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x310E, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x7131, 0xA111, 0xA111, 0xA112, 0xA111, 0xA0F1, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA131, 0x6397, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7AD4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390F, 0x38EE, 0x38EE, 0x38ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30EC, 0x30ED, 0x38EE, 0x30ED, 0x38ED, 0x390E, 0x38EE, 0x410E, 0x410F, 0x410F, 0x4930, 0x4930, 0x6931, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0x9931, 0x9911, 0x6397, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x5C14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410F, 0x390E, 0x390E, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x30EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x9931, 0xA111, 0x9931, 0x5498, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x35F5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510F, 0x390E, 0x390E, 0x38ED, 0x30ED, 0x30CC, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x28CB, 0x20CB, 0x28AB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x390E, 0x410F, 0x410F, 0x412F, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xA111, 0xA111, 0xA111, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA111, 0xA111, 0xA111, 0x3D7A, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07F6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390E, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28AB, 0x28AB, 0x20AB, 0x20AB, 0x20CA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x18AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28CB, 0x20AB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xA111, 0xA111, 0xA111, 0x9931, 0xA111, 0xA111, 0xA112, 0x9931, 0x9911, 0x9192, 0x1EBD, 0x07FF, 0x07FF, 0x07FE, 0x07F6, 0x7A71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410E, 0x38EE, 0x30ED, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20AB, 0x28AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AC, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CC, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x28CE, 0x28CE, 0x28CE, 0x28EE, 0x28CE, 0x28EE, 0x30EE, 0x30EF, 0x30EF, 0x30EF, 0x390F, 0x390F, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xA111, 0xA111, 0xA111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07FF, 0x07FF, 0x07FD, 0x07F6, 0x5C32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390F, 0x30EF, 0x30EF, 0x30EE, 0x30CE, 0x28CD, 0x28EE, 0x28ED, 0x28CD, 0x20CD, 0x20AC, 0x20CD, 0x20CD, 0x20AD, 0x20CD, 0x20AD, 0x20CC, 0x20CC, 0x20AD, 0x20CC, 0x20AC, 0x20CC, 0x20CC, 0x20AC, 0x20AC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, + 0x18D2, 0x10F2, 0x18D2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F2, 0x20F2, 0x18F2, 0x18F2, 0x20F2, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F2, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x28F3, 0x28F3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28F3, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xA111, 0xA111, 0x9931, 0x9911, 0xA111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5C38, 0x07FF, 0x07FD, 0x07F6, 0x44F2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x1912, 0x18F2, 0x20F3, 0x18F2, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, + 0x10F2, 0x18D2, 0x18D2, 0x10D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x20F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2112, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F2, 0x20F3, 0x20F2, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x28F3, 0x2113, 0x20F3, 0x2113, 0x28F3, 0x20F3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28F3, 0x28F3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28F3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xA111, 0xA112, 0xA111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2E5C, 0x07FC, 0x07F6, 0x2E53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20F3, 0x2112, 0x20F3, 0x20D3, 0x1912, 0x18F2, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x20F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, + 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x259C, 0x1DBC, 0x1D9D, 0x259D, 0x1D9C, 0x259C, 0x259C, 0x259C, 0x259C, 0x259C, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x1DDD, 0x25DD, 0x25DD, 0x25DD, 0x25BD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x25FD, 0x2DFE, 0x2DFD, 0x2DFD, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3E, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x365E, 0x365E, 0x2E5D, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3D, 0x363D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x361D, 0x361D, 0x361D, 0x361D, 0x361D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1E, 0x461E, 0x461D, 0x4DFE, 0x4DFD, 0x4E3E, 0x4DFE, 0x55DD, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7A74, 0x07FB, 0x07F6, 0x07F6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4CFB, 0x3DFE, 0x35DD, 0x35DD, 0x2DDD, 0x2DDD, 0x2DDD, 0x2DDD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25DC, 0x25BD, 0x25BD, 0x25BD, 0x1DBD, 0x25BC, 0x1DBD, 0x1DBD, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, + 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7B, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x249C, 0x1C9C, 0x1D9D, 0x1D7C, 0x1CFC, 0x1C9C, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24DC, 0x24DC, 0x24DC, 0x253D, 0x25BD, 0x253D, 0x24DD, 0x24BC, 0x24BC, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24FD, 0x24DC, 0x24DC, 0x24FD, 0x24FD, 0x24FC, 0x24DD, 0x24FD, 0x251C, 0x25FD, 0x255D, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FC, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x251D, 0x24FD, 0x24FD, 0x251D, 0x2D1D, 0x24FD, 0x2CFD, 0x25BD, 0x25BD, 0x253C, 0x2CFC, 0x2D1D, 0x251D, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1C, 0x2D5D, 0x2DDE, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2E1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2DDD, 0x2D5D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2DBD, 0x2DBD, 0x2CFD, 0x2D1D, 0x251C, 0x251C, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x34FD, 0x34FD, 0x34FD, 0x34FD, 0x34FD, 0x3CFD, 0x3CFD, 0x3CFD, 0x3CFD, 0x3D1D, 0x451D, 0x451D, 0x451D, 0x4D1D, 0x4D1D, 0x553D, 0x91B3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA112, 0x9931, 0x9931, 0x5496, 0x07F7, 0x07F7, 0x8A13, 0xA111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34DD, 0x34DD, 0x2CDD, 0x2CDC, 0x2CDD, 0x2CBC, 0x24DC, 0x24BC, 0x24BC, 0x253C, 0x25BD, 0x253C, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, + 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1B3B, 0x1CFC, 0x157C, 0x1C1C, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x22FB, 0x231C, 0x1D1C, 0x1D5C, 0x235B, 0x22DC, 0x22DB, 0x22DC, 0x22FB, 0x22FC, 0x22DC, 0x22DC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FB, 0x22FB, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231B, 0x22FC, 0x233C, 0x253C, 0x1CFD, 0x22FC, 0x22FC, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x2AFC, 0x2AFC, 0x231C, 0x2B1C, 0x2B1C, 0x259C, 0x247C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x25BD, 0x2BBC, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x25DD, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B7C, 0x259D, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x245D, 0x259C, 0x22FC, 0x2AFC, 0x231C, 0x2AFC, 0x22FC, 0x231C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2AFC, 0x2B1C, 0x2B1C, 0x2B1C, 0x331C, 0x331C, 0x331C, 0x331C, 0x331C, 0x3B1C, 0x3B3D, 0x3B3D, 0x3B3D, 0x433C, 0x433D, 0x4B3D, 0x435D, 0x5A9A, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07F9, 0x72D4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331C, 0x32FC, 0x2AFB, 0x2AFC, 0x2AFB, 0x22FB, 0x22DC, 0x22DC, 0x22FB, 0x22DB, 0x22DB, 0x235C, 0x1D5C, 0x1D1D, 0x231B, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, + 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x137B, 0x1B5B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x139B, 0x1BBB, 0x14FB, 0x153C, 0x13FB, 0x1B7B, 0x139B, 0x1B7B, 0x1B7C, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, 0x139C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1D3C, 0x1D5C, 0x1BFB, 0x1B9C, 0x1BBB, 0x1B9B, 0x1BBC, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1CDC, 0x1D7D, 0x23FC, 0x1BDC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x1BBC, 0x1BBC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x247C, 0x1D9C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x241C, 0x259D, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x243C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x259C, 0x247C, 0x23BC, 0x23BC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23BC, 0x23BC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x2BDC, 0x2BDC, 0x2BDC, 0x2BDC, 0x2BDC, 0x33DC, 0x33DC, 0x33DC, 0x33DC, 0x3BDC, 0x3BFC, 0x3BFC, 0x3BDC, 0x43FC, 0x43FD, 0x6B18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6B53, 0x07FA, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2BBC, 0x2BBC, 0x2BBC, 0x2BBB, 0x23BB, 0x23BB, 0x239B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BDB, 0x1D5C, 0x1D1C, 0x1B9B, 0x1B9B, 0x139B, 0x139C, 0x1B9B, 0x1B7B, 0x1B7B, 0x139B, 0x1B9B, 0x1B9B, 0x1B7B, 0x1B9B, 0x139B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, + 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x137B, 0x135A, 0x135A, 0x137B, 0x135A, 0x135B, 0x139B, 0x14BB, 0x14FB, 0x13FB, 0x137B, 0x137B, 0x135B, 0x137B, 0x137A, 0x137A, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1BBB, 0x153C, 0x151C, 0x1B7B, 0x139B, 0x137B, 0x139B, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x13BB, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1C3B, 0x1D5C, 0x1C3C, 0x1B9B, 0x1BBB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1C9C, 0x1D1C, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BDB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1CFC, 0x1C7C, 0x1BBB, 0x1BDB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BDC, 0x23BC, 0x1BBB, 0x1D7C, 0x1BBB, 0x1BDC, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1B9C, 0x1BDC, 0x1BBB, 0x1C5B, 0x1CFB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1D3C, 0x1CBC, 0x1BBB, 0x1BBB, 0x1B9B, 0x1B9C, 0x1B9C, 0x1B9B, 0x1B9B, 0x1BBB, 0x1B9C, 0x1B9B, 0x1BBB, 0x239B, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x2BBC, 0x2BBC, 0x2BBC, 0x2BBC, 0x33BC, 0x33BC, 0x33DC, 0x3BDC, 0x3BDC, 0x3BDC, 0x3BDC, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4C98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4B19, 0x23BC, 0x239B, 0x239B, 0x239B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x14BB, 0x151B, 0x13DB, 0x137B, 0x137A, 0x137B, 0x137B, 0x137A, 0x137B, 0x137B, 0x137B, 0x135B, 0x137B, 0x135B, 0x135B, 0x135B, 0x137B, + 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11BA, 0x11BA, 0x11B9, 0x09B9, 0x11BA, 0x1199, 0x11BA, 0x11BA, 0x1199, 0x11DA, 0x0B3A, 0x0C9B, 0x0BFB, 0x127A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x12BA, 0x14BB, 0x13FB, 0x11DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BB, 0x11BA, 0x11DA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x127A, 0x14DB, 0x137B, 0x11DA, 0x19BA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x19DB, 0x11DA, 0x19DA, 0x1A3B, 0x14FB, 0x1AFB, 0x19DA, 0x11DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x1A1B, 0x153C, 0x1A3B, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x153B, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x11DB, 0x19DB, 0x19DA, 0x19DB, 0x19FB, 0x153C, 0x123A, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x11DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x19DB, 0x19BA, 0x11DA, 0x11BA, 0x1ABB, 0x14FB, 0x1A5B, 0x19BA, 0x19BA, 0x11DA, 0x11DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19BA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x21DB, 0x21DB, 0x21DB, 0x21FB, 0x21FB, 0x29FB, 0x29FB, 0x29FB, 0x29FB, 0x31FB, 0x321B, 0x31FB, 0x321B, 0x41FA, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72D4, 0x4C98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21DB, 0x21DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11D9, 0x137A, 0x149B, 0x131A, 0x11BA, 0x119A, 0x11B9, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, + 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0C3A, 0x0C9A, 0x0BDA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDB, 0x14BB, 0x0BFA, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x131A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133B, 0x133B, 0x133A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x0B3A, 0x137A, 0x0CDB, 0x0C5B, 0x133B, 0x133B, 0x0B3A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x135B, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x135A, 0x0B5B, 0x133B, 0x143A, 0x147B, 0x135B, 0x135A, 0x133B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x13BB, 0x14DB, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x14FB, 0x135A, 0x135B, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x133A, 0x135B, 0x135A, 0x135B, 0x135B, 0x149B, 0x13FB, 0x133A, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133A, 0x133B, 0x133A, 0x135A, 0x133A, 0x143B, 0x147B, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133A, 0x133A, 0x133B, 0x133A, 0x133A, 0x133A, 0x135B, 0x133B, 0x133B, 0x1B3B, 0x1B5B, 0x1B5B, 0x1B3B, 0x1B5B, 0x235B, 0x235B, 0x235B, 0x235B, 0x2B5B, 0x2B5B, 0x2B7B, 0x2B7B, 0x335B, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72D5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71B4, 0x1B3B, 0x1B3B, 0x133A, 0x133B, 0x133A, 0x131A, 0x131A, 0x131A, 0x131A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0BDA, 0x0CBB, 0x0BDA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, + 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02F9, 0x02D9, 0x02DA, 0x0ADA, 0x0AFA, 0x0BFA, 0x0C5B, 0x0BFA, 0x0AD9, 0x02FA, 0x02F9, 0x02F9, 0x0AF9, 0x02F9, 0x0AF9, 0x02D9, 0x02F9, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0C1A, 0x0C7B, 0x0B5A, 0x0AFA, 0x0AF9, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x031A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0C3A, 0x0C5A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0C5B, 0x0C1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0C7B, 0x0B7A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0CBB, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B7A, 0x0CBB, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDA, 0x0C7B, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x131A, 0x131A, 0x131A, 0x131A, 0x131A, 0x1B1A, 0x1B3A, 0x1B3A, 0x1B3A, 0x1B3A, 0x233A, 0x233A, 0x233B, 0x2B3B, 0x2B5B, 0x3AD9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1B1A, 0x131A, 0x131A, 0x12FA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x02FA, 0x0AFA, 0x035A, 0x045A, 0x0C3A, 0x0AFA, 0x02DA, 0x0AFA, 0x0AF9, 0x02F9, 0x0AFA, 0x0AFA, 0x0AFA, 0x02D9, 0x02D9, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03B9, 0x03DA, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01B9, 0x037A, 0x0BDA, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033A, 0x041A, 0x01F9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0A79, 0x043A, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09B9, 0x0C3B, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0C7A, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0BFA, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0BDA, 0x02D9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199A, 0x1999, 0x2199, 0x219A, 0x21BA, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01D8, 0x0399, 0x0399, 0x01D9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, + 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01D8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03D9, 0x02B9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01D9, 0x03F9, 0x01F9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02D9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041A, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02B9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01D8, 0x03F9, 0x01F8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03F9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01D7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01D7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02F8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03B9, 0x01B8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03F9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03F9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03B9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01B7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02F7, 0x0358, 0x0378, 0x02F7, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D7, 0x02F8, 0x02F8, 0x0398, 0x0378, 0x02F8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0398, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F7, 0x02F8, 0x02F8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03B8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03B8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0378, 0x0338, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0338, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0AF8, 0x0AF8, 0x0AF8, 0x0AF8, 0x0B18, 0x0B18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1B18, 0x2AF8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0AF8, 0x0AF8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D8, 0x02D8, 0x0378, 0x0378, 0x02D7, 0x02D8, 0x02D7, 0x02D7, 0x02D8, + 0x0176, 0x01B6, 0x02F8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01F7, 0x0337, 0x02D7, 0x01B6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01B6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x02F7, 0x0257, 0x0197, 0x01B6, 0x01B7, 0x01B6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x01B6, 0x01B7, 0x0378, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x01F7, 0x0358, 0x0196, 0x0196, 0x01B6, 0x0196, 0x01B6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02F7, 0x02F7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01B6, 0x01B6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09B7, 0x0997, 0x09B7, 0x09B7, 0x09B7, 0x11B7, 0x11B7, 0x11D7, 0x11B7, 0x11B7, 0x11B7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09B6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02B7, 0x0337, 0x0216, 0x0196, 0x0196, + 0x0236, 0x0317, 0x0256, 0x00F4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x01F6, 0x0317, 0x01F6, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x01B6, 0x0337, 0x01B6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x0155, 0x0337, 0x0156, 0x00D5, 0x00D5, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00D6, 0x00D6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00D5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x0115, 0x0338, 0x0115, 0x00F6, 0x00F5, 0x00F6, 0x00F5, 0x00D6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F6, 0x00D5, 0x00F5, 0x0357, 0x00F5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00F5, 0x00D5, 0x00D5, 0x00D6, 0x00D6, 0x00D5, 0x00F5, 0x02F7, 0x0176, 0x00F5, 0x00D5, 0x00F5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x0116, 0x02F7, 0x01D6, 0x00D6, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x08F6, 0x08F6, 0x08F6, 0x08F6, 0x0916, 0x0916, 0x10F6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08F5, 0x08F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x01D6, 0x02F7, 0x0236, 0x0114, + 0x01F4, 0x0113, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00D3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00D3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00D3, 0x00B3, 0x00D3, 0x00D3, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x01D4, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00F4, 0x02B5, 0x01B5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01B5, 0x0255, 0x00D5, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x02F6, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01F5, 0x0235, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x0154, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x08D4, 0x08D4, 0x08D4, 0x08F4, 0x08F4, 0x08F4, 0x08F5, 0x10F4, 0x10D5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00D4, 0x00D4, 0x00D4, 0x00D3, 0x00D3, 0x00D3, 0x00D3, 0x00D3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B3, 0x00D3, 0x00D3, 0x0214, 0x0295, + 0x00B1, 0x0091, 0x0091, 0x0091, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x00D2, 0x01B2, 0x0273, 0x0172, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x01D3, 0x0253, 0x0112, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0213, 0x01D3, 0x0092, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0253, 0x0153, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0294, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00F2, 0x0293, 0x00D2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x0172, 0x0253, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x08B2, 0x08B2, 0x08B2, 0x08D2, 0x08B2, 0x08D2, 0x08D3, 0x10D3, 0x40F2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00D2, 0x00B2, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0131, + 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01D1, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01D2, 0x01F2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0171, 0x0212, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00F1, 0x0252, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0272, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01D1, 0x0171, 0x0091, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01D1, 0x01D1, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F2, 0x01D1, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01B1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F1, 0x0171, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00B0, 0x00B0, 0x00B1, 0x08B1, 0x08B0, 0x08B1, 0x08B1, 0x50F1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, + 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x00D0, 0x0212, 0x01D2, 0x00D0, 0x0090, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x00F0, 0x0232, 0x01B1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0232, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00F0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00F0, 0x0232, 0x00F1, 0x00B0, 0x008F, 0x008F, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0890, 0x08B0, 0x0891, 0x10B0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, + 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0171, 0x0232, 0x0151, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x00F0, 0x0212, 0x0151, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x01F1, 0x01B1, 0x0070, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0130, 0x01F1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0191, 0x01B1, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x008F, 0x0090, 0x006F, 0x008F, 0x0131, 0x0232, 0x00D0, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60F1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006F, 0x0090, 0x006F, 0x008F, 0x008F, 0x0070, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, + 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0070, 0x008F, 0x006F, 0x008F, 0x0110, 0x0232, 0x01B1, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0110, 0x0252, 0x0130, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0170, 0x01F2, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x01D2, 0x0130, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x00CF, 0x0232, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x0191, 0x0212, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x18AF, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xA111, 0x9931, 0xA111, 0x29D2, 0x01B1, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, + 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x01B1, 0x0232, 0x010F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0232, 0x00CF, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x010F, 0x0212, 0x00AF, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x00AF, 0x0212, 0x00AF, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x0252, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x01D1, 0x0130, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x01F1, 0x01B1, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28D0, 0x01F2, 0x01D1, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0110, 0x0212, 0x01B1, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x008F, 0x006E, 0x006E, 0x006F, 0x006F, 0x008E, 0x006E, 0x0191, 0x01F1, 0x00CF, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006E, 0x006E, 0x006F, 0x00CF, 0x0212, 0x0110, 0x008F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0191, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0232, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0110, 0x01F1, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00AF, 0x0212, 0x0110, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x48D0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008E, 0x008F, 0x01B1, 0x01F2, 0x00AF, 0x006F, 0x006E, 0x008F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x008E, 0x01D1, 0x01F1, 0x008F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x01F1, 0x0170, 0x006F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0211, 0x00CF, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008F, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x108F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006E, 0x006F, 0x006E, 0x0190, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0130, 0x0212, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01D1, 0x0190, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01F1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0211, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0170, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x01F1, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x68F0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x01F2, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x0212, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x008E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0211, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01B1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x38B0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x010F, 0x0212, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x004D, 0x0130, 0x01F2, 0x0150, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x00EF, 0x0212, 0x010F, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x00AF, 0x0212, 0x00CF, 0x004E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x008E, 0x0232, 0x008E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x01D1, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x008E, 0x01F1, 0x012F, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x086E, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004E, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x0211, 0x0190, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006D, 0x004D, 0x004D, 0x004E, 0x004D, 0x004D, 0x006D, 0x006D, 0x008E, 0x01B1, 0x01D1, 0x00CE, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006E, 0x004D, 0x006E, 0x006E, 0x004E, 0x006D, 0x010F, 0x0212, 0x00EF, 0x006D, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x004D, 0x006E, 0x01D1, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0130, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0232, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004D, 0x004D, 0x004E, 0x010F, 0x01D1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x004E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x00CE, 0x0212, 0x00CE, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004D, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x70F0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006E, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x008E, 0x01D1, 0x0190, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, + 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x0150, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004E, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x00AE, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x0170, 0x01B1, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x006E, 0x01D1, 0x010F, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004E, 0x0212, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006E, 0x01F1, 0x008E, 0x006D, 0x006E, 0x004D, 0x004D, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x010F, 0x01F1, 0x006D, 0x006D, 0x004D, 0x006E, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004E, 0x006D, 0x006D, 0x004D, 0x40CF, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70F0, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x004D, 0x004D, 0x006D, 0x0191, 0x01B1, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp index cff7c0b0a7..b90228af03 100644 --- a/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp +++ b/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp @@ -25,325 +25,325 @@ #if HAS_GRAPHICAL_TFT extern const uint16_t marlin_logo_480x320x16[153600] = { - 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x10ae, 0x00f8, 0x00f9, 0x00d6, 0x18ad, 0x188c, 0x188c, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x188d, 0x188d, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ac, 0x18ac, 0x188d, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x18ac, 0x18ac, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x18ab, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, - 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x10ae, 0x00f7, 0x00f9, 0x00f6, 0x188d, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x188d, 0x18ac, 0x18ac, 0x188d, 0x188d, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, - 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x10af, 0x00f8, 0x00f8, 0x00f7, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188d, 0x18ac, 0x18ad, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, - 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x10af, 0x00f7, 0x00f8, 0x00f6, 0x18ad, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, - 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x10af, 0x00f8, 0x00f9, 0x00d6, 0x18ad, 0x18ad, 0x188c, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, - 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x188d, 0x18ac, 0x18ad, 0x18af, 0x00f8, 0x00f9, 0x00f6, 0x18ae, 0x188d, 0x18ac, 0x188d, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x10d3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, - 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x188c, 0x18ac, 0x188d, 0x10af, 0x00f8, 0x0119, 0x00d7, 0x18ae, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, - 0x188b, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, - 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, - 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x08b2, 0x08d2, - 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x00f8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08f6, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f8, 0x00f8, - 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0117, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x00f9, 0x00f9, - 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x0119, 0x00f6, 0x10f2, 0x10d1, 0x10d0, 0x10d1, 0x10d3, 0x08f6, 0x00f9, 0x00f9, 0x0119, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f8, 0x00f8, - 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18d0, 0x0118, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f9, 0x00f9, - 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18cd, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x00f9, 0x00f8, - 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08d5, 0x011a, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x00f9, 0x00f8, - 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0118, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x00f9, 0x00f9, - 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f9, 0x0119, 0x011a, 0x0119, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x188c, 0x00f9, 0x00f9, - 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0118, 0x0119, 0x0119, 0x0118, 0x10d1, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f3, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x011a, 0x0119, 0x08f3, 0x10d1, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f7, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x10d0, 0x10f4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x0117, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f9, 0x00f9, - 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x08f5, 0x0139, 0x00fa, 0x011a, 0x0119, 0x08f5, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x08f4, 0x20ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08d4, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x00f7, 0x011a, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x00f9, 0x00f9, - 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0118, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x0118, 0x0119, 0x08f7, 0x10d1, 0x10d1, 0x00f7, 0x0119, 0x0118, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x00f6, 0x011a, 0x08f3, 0x18ae, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08d4, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x00f7, 0x011a, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00f9, - 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d1, 0x18cd, 0x18ad, 0x10d1, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f4, 0x011a, 0x011a, 0x10f1, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d0, 0x18ae, 0x08d5, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f7, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x10d0, 0x10f4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x0117, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10f2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, - 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x10b1, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, - 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0118, 0x0119, 0x00f7, 0x10d1, 0x10d1, 0x00f7, 0x0119, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, - 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10f1, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10f1, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08d5, 0x011a, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, - 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x10d1, 0x00f8, 0x0119, 0x0119, 0x00f8, 0x10d1, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0118, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d3, 0x10d3, - 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x0119, 0x00f6, 0x10f2, 0x10d1, 0x10d0, 0x10d1, 0x10d3, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d2, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x011a, 0x08f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x013a, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cf, 0x0119, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08f5, 0x10d1, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x10d2, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x08d5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x011a, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d0, 0x10d3, 0x08f4, 0x08f3, 0x08f3, 0x10f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x10d3, 0x10d3, 0x08f3, 0x08f3, 0x08d4, 0x10d3, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cf, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18cd, 0x10f3, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, - 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d1, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ae, 0x18ae, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f4, - 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18cd, 0x18af, 0x0119, 0x011a, 0x00f9, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, - 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, - 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x10d2, - 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x00f9, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x00f9, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x08d3, 0x18ad, 0x18ad, 0x08d3, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d3, 0x18ad, - 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10b0, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0139, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x20ce, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0139, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, - 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0116, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x10d1, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, - 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00fa, 0x18d1, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10f3, 0x08d3, 0x10d2, 0x0117, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0116, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18af, 0x00f8, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x00f9, 0x18ad, 0x18ae, 0x208d, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18af, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18cd, 0x20ad, 0x18ae, 0x18ae, 0x00f7, - 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x08f6, 0x0119, 0x0119, 0x011a, 0x0119, 0x0116, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cf, 0x00f9, 0x011a, 0x08f5, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x00f8, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, - 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18cf, - 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x18d0, 0x18ad, - 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ae, - 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00fa, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, - 0x08f7, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x10f3, 0x08f3, 0x10d3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x10f2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f3, 0x0119, 0x0119, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x310e, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18d0, - 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x28ee, 0x8252, 0xcb54, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, - 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x394f, 0xb313, 0xd395, 0x7211, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x496f, 0xcb55, 0xd395, 0xbb54, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x00f7, - 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00fa, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x61d0, 0xd395, 0xd395, 0xd395, 0x69f1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x011a, 0x00f7, 0x18ae, - 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x61d0, 0xd395, 0xd395, 0xd396, 0xd375, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, - 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, - 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10f2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8252, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, - 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x08f7, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x5190, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x412f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x10f3, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0355, 0x190f, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f4, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x496f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x011a, 0x0117, 0x0117, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18b0, 0x0119, 0x00f9, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x11d1, 0x03b7, 0x0a93, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x28ee, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9ab3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x00f9, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x10af, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x10d0, 0x0118, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x10f2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x7a31, 0xd395, 0xd395, 0xd375, 0xdb95, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f4, 0x10d2, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x00fa, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11d1, 0x03b8, 0x03b7, 0x03b8, 0x0a94, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x00f9, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xd395, 0xb313, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x190e, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0xa2d3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xa2d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a94, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x61d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ce, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0397, 0x03b8, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x59d0, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x011a, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x011a, 0x10d2, 0x18cd, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x61b1, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8a92, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x188d, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0xaad3, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03d7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0x7231, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x08d3, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x20ae, 0x8a92, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x7a31, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x28ee, 0xc374, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xa2d3, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ce, 0x194f, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x61d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x69f1, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x011a, 0x00f9, 0x08f7, 0x18ce, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x02f5, 0x03b7, 0x03b8, 0x0356, 0x114f, 0x18ad, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x9ab3, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x0a32, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0356, 0x18ad, 0x18ad, 0x0a32, 0x03b7, 0x03b8, 0x03b8, 0x03b8, 0x0376, 0x18ee, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x00f9, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x190f, 0x0377, 0x0397, 0x03b8, 0x0398, 0x0397, 0x0b77, 0x18ce, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0bb7, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x4970, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ee, 0x0377, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a33, 0x190e, 0x0397, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x11d1, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11b0, 0x0a93, 0x0356, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x1253, 0x0b78, 0x0b98, 0x0b78, 0x0b98, 0x0b98, 0x1378, 0x11f2, 0x18ad, 0x18ad, 0x0b98, 0x0b78, 0x0b78, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0b98, 0x1378, 0x0b78, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x4970, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0x8252, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x0377, 0x0ad4, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x02f5, 0x18ae, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x192f, 0x03b7, 0x03b7, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1ab5, 0x1b78, 0x1b58, 0x1358, 0x1b78, 0x1378, 0x1358, 0x1a13, 0x18ae, 0x18ae, 0x1358, 0x1358, 0x1378, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1358, 0x1358, 0x1358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd395, 0xc354, 0x5990, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0356, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x194f, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f8, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f9, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1a54, 0x1b38, 0x1b38, 0x2338, 0x1b38, 0x1b58, 0x2338, 0x21d2, 0x18ad, 0x18ad, 0x2338, 0x2338, 0x2358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x2339, 0x2358, 0x2338, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xa2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x1170, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x0a53, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0396, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x2150, 0x2b18, 0x2b39, 0x2b18, 0x2b19, 0x2b19, 0x2af8, 0x18ce, 0x18ad, 0x18ad, 0x2b19, 0x2b18, 0x2b19, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x2192, 0x2b19, 0x2b19, 0x2b18, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xbb34, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0af5, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0377, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x11b0, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x0117, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x10cf, 0x0118, 0x0119, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2192, 0x2b19, 0x3319, 0x32f9, 0x2a15, 0x18ef, 0x20ad, 0x18ad, 0x18ad, 0x32f9, 0x3319, 0x32f9, 0x18ad, 0x18ad, 0x18ad, 0x2191, 0x3319, 0x2af9, 0x3319, 0x2af9, 0x2a97, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x190f, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x11d1, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x18d0, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x3ad9, 0x3ad9, 0x3ad9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x3af9, 0x3ad9, 0x3ad9, 0x18ad, 0x20ad, 0x3215, 0x3ad9, 0x3af9, 0x3ada, 0x3ad9, 0x3277, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x4950, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xaab3, 0x20ce, 0x18ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x03b7, 0x0397, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0ad5, 0x0397, 0x0398, 0x03b8, 0x0398, 0x03b8, 0x18ee, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0398, 0x0398, 0x03b8, 0x0398, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x0398, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0139, 0x011a, 0x0117, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x42d9, 0x42b9, 0x42b9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x42b9, 0x42b9, 0x42ba, 0x18ae, 0x31f5, 0x42da, 0x42d9, 0x42b9, 0x42d9, 0x3a77, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x5991, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xd355, 0x9252, 0x30ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, 0x2338, 0x2338, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x2150, 0x2318, 0x2338, 0x2338, 0x2318, 0x2318, 0x2338, 0x21f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2339, 0x2318, 0x2318, 0x2339, 0x2338, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2338, 0x2338, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x00f7, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x4ab9, 0x4a9a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4aba, 0x4aba, 0x4a9a, 0x4257, 0x4a99, 0x4a9a, 0x4a9a, 0x4aba, 0x4237, 0x20ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x69f1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xcb14, 0x4130, 0x20af, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x42b9, 0x4a99, 0x42b9, 0x42ba, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4257, 0x4aba, 0x4a9a, 0x4a99, 0x42b9, 0x4a9a, 0x42b9, 0x4a9a, 0x20ef, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a9a, 0x42b9, 0x42b9, 0x4aba, 0x4ab9, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x42b9, 0x4aba, 0x4a99, 0x4a99, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x527a, 0x527a, 0x527a, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x527a, 0x527a, 0x529a, 0x527a, 0x527a, 0x527a, 0x527a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18d2, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x8253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0x7a11, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x621a, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x6a3b, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x3932, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x59d7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a1b, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x011a, 0x00f7, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x20ae, 0x08f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x5a5b, 0x5a5a, 0x5a7a, 0x2910, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x5a5a, 0x5a7b, 0x5a5a, 0x5a5a, 0x5a5a, 0x5a5a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x091a, 0x18f2, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x8232, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xa293, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x89bc, 0x89bc, 0x91bc, 0x89bc, 0x899c, 0x89bc, 0x89bc, 0x89bb, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x899b, 0x89bc, 0x89bc, 0x89bc, 0x799a, 0x7179, 0x89bb, 0x899c, 0x89bc, 0x89bc, 0x38f1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x899c, 0x899c, 0x89bc, 0x89bc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x89bc, 0x899c, 0x89bc, 0x899c, 0x89bc, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0117, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x623a, 0x623b, 0x625a, 0x621a, 0x2910, 0x18cd, 0x18ad, 0x18ad, 0x623b, 0x623a, 0x625a, 0x623b, 0x623b, 0x51f8, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x0917, 0x18d2, 0x18d2, 0x0918, 0x091a, 0x0918, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30d0, 0x30f0, 0x30f0, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0x9253, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xb11d, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x60f5, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0x60f5, 0x40d1, 0xb11d, 0xb13d, 0xa93d, 0xa93d, 0x991b, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xa93d, 0xa93d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x00f7, 0x00f7, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x59d8, 0x6a1b, 0x6a1b, 0x6a1b, 0x6a1b, 0x4133, 0x18ad, 0x18ad, 0x6a3b, 0x6a1b, 0x6a1b, 0x6a1b, 0x51b6, 0x20cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d3, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18d1, 0x20ce, 0x20ce, 0x18d1, 0x093a, 0x093a, 0x28ef, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x9273, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0xd335, 0xd334, 0xd334, 0xd314, 0xd315, 0xaa93, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd09e, 0xd0be, 0xd0be, 0x18ad, 0x18ad, 0x18ad, 0x30b0, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x20ae, 0x18ad, 0xb8bc, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x68b5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ce, 0x61b8, 0x721b, 0x71fb, 0x721b, 0x721b, 0x4133, 0x20ad, 0x71fb, 0x721b, 0x71fb, 0x4174, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x011a, 0x18d1, 0x20ae, 0x20ce, 0x20f1, 0x093a, 0x093a, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0xaaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ae, 0x20ad, 0x20ad, 0x20ae, 0x30ee, 0x6150, 0x81b1, 0xa1f2, 0xc233, 0xca53, 0xca54, 0xca53, 0xc233, 0xa1f2, 0x8191, 0x512f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0x18ad, 0x20ad, 0x18ad, 0xb079, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xa058, 0x18ad, 0x18ad, 0x7095, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xe83e, 0x28ae, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf01f, 0xf03f, 0xf03f, 0xf03f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d0, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ce, 0x69b9, 0x81fb, 0x79db, 0x79dc, 0x81fc, 0x5976, 0x79db, 0x79dc, 0x81dc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0918, 0x0119, 0x0917, 0x18d0, 0x20d0, 0x0917, 0x093a, 0x1138, 0x28cf, 0x30cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0xaad4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd315, 0xd314, 0x69b2, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x410f, 0x6990, 0x99f2, 0xc253, 0xca74, 0xd274, 0xca74, 0xd253, 0xca53, 0xca53, 0xca53, 0xd233, 0xd253, 0xca53, 0xd233, 0xca33, 0xc213, 0x8991, 0x410f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0119, 0x011a, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x7199, 0x89db, 0x89bc, 0x81bc, 0x89bc, 0x89bc, 0x89bc, 0x89bc, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d2, 0x0119, 0x0119, 0x093a, 0x093a, 0x093a, 0x093a, 0x20f2, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xcad4, 0x5971, 0x30f0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x38ef, 0x79b1, 0xba53, 0xca94, 0xca94, 0xca74, 0xd273, 0xd273, 0xca73, 0xca54, 0xca53, 0xca54, 0xca53, 0xca33, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xd213, 0xca13, 0xca13, 0xa1b2, 0x490f, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x7979, 0x919c, 0x919c, 0x91bc, 0x919c, 0x899c, 0x89bc, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x18f2, 0x0919, 0x091a, 0x091a, 0x0919, 0x20f3, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x4112, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd314, 0xd2f5, 0xd2f4, 0xd2f4, 0x4930, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x4130, 0x89f1, 0xd294, 0xd294, 0xca93, 0xca74, 0xd274, 0xca74, 0xca74, 0xca53, 0xca73, 0xd253, 0xd254, 0xca53, 0xca53, 0xca54, 0xc274, 0x9b36, 0x83b8, 0x6419, 0x6c39, 0x6439, 0x6c1a, 0x8b57, 0xb295, 0xca13, 0x9191, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cf, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x28ae, 0x8159, 0x917c, 0x997c, 0x997c, 0x999c, 0x999c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20d0, 0x20d1, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd2f4, 0xd2f4, 0xd315, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d5, 0x79d2, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28ef, 0x28f0, 0x28cf, 0x5150, 0xaa32, 0xd293, 0xd294, 0xd294, 0xca93, 0xca74, 0xca74, 0xca74, 0xca74, 0xd274, 0xd254, 0xca53, 0xca54, 0xb2d5, 0x83b8, 0x44fc, 0x1dbe, 0x063f, 0x0cdb, 0x0b76, 0x1377, 0x1377, 0x0b76, 0x1356, 0x0b76, 0x0b77, 0x23f8, 0x6991, 0x510f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x8939, 0xa17c, 0xa17c, 0xa15d, 0xa15d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8a54, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0x5951, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x4130, 0x91f2, 0xd294, 0xd294, 0xca94, 0xca74, 0xca94, 0xca94, 0xca74, 0xd274, 0xd274, 0xd274, 0xd253, 0xb2d5, 0x7419, 0x257d, 0x063f, 0x061f, 0x057d, 0x12b5, 0x190f, 0x18ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x913a, 0xa93d, 0xa95d, 0xa95c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xcab4, 0x5172, 0x3911, 0x38f1, 0x38f0, 0x30f0, 0x81d2, 0xc294, 0xd294, 0xd293, 0xd294, 0xd294, 0xca93, 0xca93, 0xd274, 0xd274, 0xca73, 0xd274, 0x83d8, 0x353d, 0x061f, 0x063f, 0x063f, 0x063f, 0x4c5a, 0x4970, 0x20ae, 0x20ae, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xb11d, 0xb11d, 0xb11d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6b36, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xcad4, 0xcab4, 0x5972, 0x3911, 0x5151, 0xb253, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xd274, 0xc294, 0x645a, 0x1dbe, 0x063f, 0x063f, 0x063f, 0x1dbe, 0x6459, 0xc274, 0x99d2, 0x28ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0xb8fe, 0xb8fd, 0xb8fe, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253b, 0x465c, 0x6d7b, 0x6d9a, 0x6d9a, 0x6d7a, 0x84f9, 0x9c78, 0x9c77, 0x9c78, 0x9c78, 0x9c57, 0x9c78, 0x9c58, 0x9c58, 0xbbb6, 0xd334, 0xd315, 0xd334, 0xd315, 0xd314, 0xd315, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xcad4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2d4, 0x91f3, 0x5972, 0xca74, 0xd2b4, 0xd2b4, 0xd294, 0xca94, 0xd294, 0xd294, 0xca94, 0xca74, 0xc2b4, 0x6c5a, 0x0dff, 0x063f, 0x063f, 0x063f, 0x353d, 0x83b8, 0xca53, 0xca33, 0x89b1, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0xc0de, 0xc0fe, 0xc0dd, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00fa, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x38f1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4d1a, 0x6d9a, 0x94b9, 0x9c98, 0x9c77, 0x9c78, 0x9c78, 0x9c78, 0x94b8, 0x6d7a, 0x6d7a, 0x6d7b, 0x367c, 0x367d, 0x1efe, 0x077f, 0x075f, 0x1ede, 0x363d, 0x6d3a, 0x9c17, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xcad4, 0xd2b3, 0xcab4, 0xc294, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca74, 0xca74, 0xca74, 0x7bd8, 0x0dff, 0x063f, 0x061f, 0x063f, 0x4cbb, 0x9b57, 0xd233, 0xca33, 0xca53, 0x6150, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x20ae, 0x10d2, 0x10d3, 0x08f3, 0x08f3, 0x18d0, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x08f3, 0x18d0, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d1, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d1, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x08f3, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8be, 0xc8de, 0xc8be, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xa2b5, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xbb96, 0xa437, 0x74f9, 0x4dbc, 0x2e7e, 0x0edf, 0x559b, 0x8498, 0xc335, 0xd2f4, 0xd2d4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2b5, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xbab4, 0xbaf6, 0xca94, 0xd294, 0xca94, 0xd273, 0x9b76, 0x1dbe, 0x061f, 0x063f, 0x0ddf, 0x643a, 0xb2d5, 0xca54, 0xd253, 0xca53, 0xc294, 0x59b1, 0x28ce, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x0116, 0x00f9, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d3, 0x011a, 0x0119, 0x00f9, 0x00f6, 0x18ad, 0x08f6, 0x011a, 0x011a, 0x0119, 0x10d3, 0x18cd, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f7, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18cd, 0x00f7, 0x011a, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d1, 0x18ce, 0x00f7, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x40b0, 0xa09a, 0xd0be, 0xd09e, 0xd0be, 0xb89c, 0x78b5, 0x28ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd335, 0xd315, 0xd314, 0xd315, 0xd2f5, 0xd2f5, 0xd2f4, 0x9bf7, 0x6d1a, 0x2e3d, 0x45bc, 0x9418, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xc2d4, 0x4cdb, 0x7bd8, 0x9b57, 0x44fc, 0x063f, 0x063f, 0x1dbe, 0x83d8, 0xc294, 0xca53, 0xca54, 0xca33, 0xca53, 0xb2b5, 0x33b8, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188e, 0x20cd, 0x10d1, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x011a, 0x0119, 0x00f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x00f7, 0x0119, 0x0139, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0139, 0x0119, 0x08f7, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f7, 0x011a, 0x0119, 0x011a, 0x10d3, 0x20ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x08f7, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ae, 0x18ae, 0x18cf, 0x00f8, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x10d0, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x40b0, 0xd07d, 0xd87e, 0xd89f, 0xd89f, 0xe07f, 0xd89e, 0xd89f, 0xb87b, 0x28ae, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xbb14, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd314, 0xd335, 0xd315, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xc335, 0x8478, 0x4d7b, 0x4d5b, 0xab96, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xca94, 0xcab4, 0xd294, 0xd294, 0xd273, 0xc2b4, 0x5c9a, 0x061f, 0x061f, 0x063f, 0x7419, 0xd273, 0xd273, 0xca53, 0xca53, 0xd233, 0xca53, 0xaaf6, 0x153c, 0x2951, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x011a, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x20ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x10b0, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb07a, 0xe85f, 0xe85f, 0xe07f, 0xe85f, 0xe87f, 0xe07f, 0xe85f, 0xe07f, 0x9898, 0x20ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd315, 0xcb34, 0xd315, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xd2d4, 0xbb55, 0x7499, 0x35dc, 0x8439, 0xc2f4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xca93, 0xd294, 0xd274, 0xca74, 0x9b76, 0x061f, 0x061f, 0x83d8, 0xc295, 0xca53, 0xca53, 0xca53, 0xca53, 0x7bb8, 0x063f, 0x2a34, 0x30f0, 0x30f0, 0x30ef, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x00f6, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x38b0, 0xf05f, 0xe83f, 0xf03f, 0xf05f, 0xf05f, 0xf03f, 0xf03f, 0xf03f, 0xf05f, 0xe83f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xbb35, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xcad4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2d4, 0xcab4, 0xd2b4, 0xcab4, 0xcab4, 0x8bf8, 0x3d5c, 0x6499, 0xc2d4, 0xd294, 0xd294, 0xca74, 0xca74, 0xd274, 0xca74, 0xca74, 0x54bb, 0x5c9a, 0x353d, 0x1dbe, 0x4cbb, 0x9377, 0x9b36, 0x44fc, 0x061f, 0x1bf9, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x011a, 0x10d3, 0x18ad, 0x08f6, 0x0119, 0x00f9, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x10d3, 0x0119, 0x011a, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x20ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d0, 0x011a, 0x011a, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x00f9, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f4, 0x10f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x5092, 0xf83f, 0xf83f, 0xf03f, 0xf83f, 0xf83f, 0xf83f, 0xf83f, 0xf81f, 0xf03f, 0xf83f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69b3, 0xc355, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd2f5, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0x9b97, 0x453c, 0x6c59, 0xc2b4, 0xca74, 0xd274, 0xd273, 0xca73, 0xd273, 0xc294, 0x6c39, 0xc294, 0xca53, 0x8b98, 0x4cbb, 0x0dff, 0x063f, 0x0d7e, 0x3972, 0x3911, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x011a, 0x00f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x00f9, 0x011a, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x00f6, 0x00f9, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x011a, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x5092, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0x9b77, 0x44dc, 0x73f9, 0xca73, 0xca74, 0xd254, 0xca73, 0xca53, 0xc294, 0x351c, 0x6c3a, 0xc294, 0xd253, 0xca34, 0x83b8, 0x5a55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00fa, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x011a, 0x08f7, 0x18ad, 0x0116, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4090, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x28af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69d3, 0xc355, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xcb55, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcad4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xcab4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0xd274, 0xca74, 0x8b78, 0x447c, 0xa316, 0xd253, 0xd253, 0xca54, 0xca53, 0xc294, 0x257d, 0x0ddf, 0x83b8, 0xd233, 0xca33, 0xca33, 0xba13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x30d0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0116, 0x20ad, 0x08f6, 0x011a, 0x00f9, 0x0119, 0x10f3, 0x18ad, 0x0116, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x10d4, 0x011a, 0x011a, 0x0119, 0x08f6, 0x20ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x00f9, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0xd03c, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xd03c, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xaad4, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd2b4, 0xca94, 0xca94, 0xd294, 0xca74, 0xca73, 0xca74, 0xd274, 0xc295, 0x6bb9, 0x6b99, 0xca54, 0xca53, 0xd254, 0xca33, 0xc294, 0x24fd, 0x063f, 0x351d, 0xb295, 0xca13, 0xca13, 0xca13, 0xb9f3, 0x7992, 0x4111, 0x4112, 0x38f1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x00f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x10d2, 0x10f3, 0x08f3, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x4090, 0xf03f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x6073, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xcb55, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd314, 0xd335, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca74, 0xca74, 0xca74, 0xca73, 0xca73, 0xca53, 0xca53, 0xca74, 0xaab6, 0x5b7a, 0xba74, 0xca53, 0xca33, 0xca33, 0xc254, 0x4bfb, 0x059f, 0x0d7f, 0x8b57, 0xc9f3, 0xca13, 0xc9f3, 0xc9f3, 0xa9b3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x10d3, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x18d1, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x10b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10b0, 0x10d3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x10d0, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x08f3, 0x10d0, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x10d2, 0x10d4, 0x08f3, 0x08f3, 0x18d1, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x18d1, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4091, 0xe01d, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x7074, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ae, 0x18cd, 0x20ae, 0x20cd, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xb2f4, 0xd395, 0xdb95, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0x84f9, 0x467d, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x1f1e, 0x367d, 0x367c, 0x4ddb, 0x653a, 0x8498, 0x9bf7, 0xc2f5, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca73, 0xd253, 0xd254, 0xca74, 0xca53, 0xca53, 0xca53, 0xd253, 0x72d9, 0xaa76, 0xca33, 0xd233, 0xca13, 0xca33, 0x1c7e, 0x059f, 0x05ff, 0x5c7a, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18cd, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10b0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x7074, 0x9077, 0x8856, 0x8876, 0x388f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x3911, 0x4111, 0x4132, 0x6193, 0xc355, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x271d, 0x07ff, 0x07ff, 0x07bf, 0x079f, 0x079f, 0x077f, 0x079f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x079f, 0x1efe, 0x461c, 0x6d1a, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca73, 0xd274, 0xca74, 0xca53, 0xd254, 0xca54, 0xd253, 0xca53, 0xca33, 0xa275, 0x9a76, 0xca33, 0xca13, 0xca33, 0x9ad6, 0x04ff, 0x05bf, 0x063f, 0x357c, 0xc254, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ae, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x0117, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xcb55, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xcb55, 0xd334, 0xcb55, 0xac17, 0x0fbf, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x365c, 0x74b9, 0xb315, 0xca73, 0xca54, 0xca54, 0xca53, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xb235, 0xaa16, 0xca33, 0xca13, 0xca13, 0x7b37, 0x055f, 0x05ff, 0x067f, 0x25dd, 0xa2f5, 0xd1d3, 0xc9f3, 0xc9d3, 0xc9d2, 0xc9d3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ce, 0x20ad, 0x10f4, 0x011a, 0x0119, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61b3, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0x8cb8, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06df, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x071f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x071f, 0x2dfd, 0x7419, 0xb2b5, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0xd233, 0xca14, 0xa215, 0xca13, 0xca13, 0xc9f3, 0x8338, 0x05bf, 0x063f, 0x06bf, 0x0e9f, 0xaad5, 0xc9d3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b2, 0xb1b2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18cf, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x20ae, 0x18d0, 0x0119, 0x0119, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3111, 0x38f1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xc395, 0x5dfa, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06bf, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x06ff, 0x06bf, 0x065f, 0x05bf, 0x443c, 0x8af7, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca13, 0x99b6, 0xc9f3, 0xca13, 0xc9f3, 0x4c3b, 0x061f, 0x069f, 0x06ff, 0x0ebe, 0xa2d5, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9b2, 0xc1b3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x20ae, 0x20ad, 0x18ce, 0x0119, 0x0119, 0x10d3, 0x20ce, 0x20ae, 0x10f4, 0x0119, 0x011a, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067f, 0x067f, 0x067f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x065f, 0x065f, 0x067f, 0x067f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x065f, 0x05ff, 0x053f, 0x049f, 0x1bbe, 0x8298, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0xd1f3, 0x99b6, 0xc9f3, 0xc9f3, 0xb254, 0x0d9f, 0x067f, 0x06df, 0x06ff, 0x0ebf, 0xa2d5, 0xc9d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011a, 0x10f5, 0x20ce, 0x20cf, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xac37, 0x6d9a, 0x2efe, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x075f, 0x073f, 0x071f, 0x06df, 0x06bf, 0x069f, 0x067f, 0x065f, 0x065f, 0x063f, 0x063f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x063f, 0x063f, 0x063f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x067f, 0x063f, 0x05df, 0x055f, 0x04bf, 0x043f, 0x037f, 0x1abe, 0x7a18, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc1f4, 0x7178, 0xc9f2, 0xd1f3, 0x8338, 0x061f, 0x06bf, 0x06ff, 0x071f, 0x0edf, 0xa2d5, 0xc9b3, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x18ce, 0x0918, 0x011a, 0x011a, 0x0919, 0x011a, 0x0917, 0x20cf, 0x28ae, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xa2b4, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xc3b6, 0x8519, 0x4e3c, 0x0f9f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x06ff, 0x06bf, 0x069f, 0x067f, 0x065f, 0x063f, 0x061f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05df, 0x057f, 0x04ff, 0x047f, 0x03df, 0x031f, 0x025f, 0x19de, 0x79b8, 0xc9f3, 0xca13, 0xc9f3, 0xb9d3, 0xa1b5, 0xc9d3, 0xc9f3, 0x4c5b, 0x065f, 0x06df, 0x071f, 0x071f, 0x0edf, 0xa2b5, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc993, 0xc992, 0xb172, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x10f3, 0x10f3, 0x10d2, 0x20ae, 0x18ae, 0x20ae, 0x18ce, 0x20ce, 0x20ce, 0x20ce, 0x18f2, 0x10f4, 0x1114, 0x18f3, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xc3b5, 0x7d59, 0x36bd, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x071f, 0x06de, 0x069e, 0x067e, 0x065e, 0x063f, 0x063f, 0x061e, 0x05ff, 0x05df, 0x05bf, 0x05bf, 0x059f, 0x059f, 0x059f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x059f, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05bf, 0x057f, 0x04ff, 0x049f, 0x03ff, 0x037f, 0x02bf, 0x021f, 0x017f, 0x213d, 0x9996, 0xc9f3, 0xc9f3, 0xb9d4, 0x99b6, 0xc9d3, 0xc213, 0x0dbf, 0x069f, 0x06ff, 0x071f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xa972, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20af, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xaab5, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0x94d8, 0x467c, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x06de, 0x06be, 0x067e, 0x067e, 0x065e, 0x063e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059f, 0x057f, 0x057f, 0x055f, 0x055f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x055f, 0x055f, 0x055f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x055f, 0x04ff, 0x04bf, 0x041f, 0x039f, 0x031f, 0x025f, 0x01bf, 0x013f, 0x00bf, 0x40fb, 0xb1b5, 0xc9d2, 0xb1d5, 0xb1d4, 0xc9b3, 0x6399, 0x061f, 0x06df, 0x071f, 0x073f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc972, 0xc972, 0xc992, 0xc972, 0xb152, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20cd, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30d0, 0x28f0, 0x3110, 0x30f0, 0x30f0, 0x30f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4a16, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0x8539, 0x1f5e, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x07bf, 0x075f, 0x06be, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059e, 0x057e, 0x055f, 0x053f, 0x053f, 0x051f, 0x051f, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x053f, 0x053f, 0x051f, 0x04df, 0x04bf, 0x043f, 0x03df, 0x035f, 0x02bf, 0x021f, 0x017f, 0x00ff, 0x009f, 0x087f, 0x7119, 0xc9d3, 0xb1d4, 0xb9d3, 0xc9b3, 0x1cfe, 0x065f, 0x06ff, 0x071f, 0x073f, 0x073f, 0x1ebe, 0xb9f3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc973, 0xc952, 0xb152, 0x4111, 0x3910, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20cd, 0x20ce, 0x20ae, 0x20ae, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4a15, 0x3439, 0x16bd, 0x8519, 0xd395, 0xd395, 0xd395, 0x94d8, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x071e, 0x069d, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fd, 0x05dd, 0x05bd, 0x059d, 0x059e, 0x057e, 0x055e, 0x053e, 0x051e, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x049f, 0x049f, 0x049f, 0x049f, 0x049f, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x04bf, 0x04df, 0x04df, 0x04df, 0x04bf, 0x049f, 0x043f, 0x03df, 0x035f, 0x02ff, 0x025f, 0x01bf, 0x013f, 0x00df, 0x007f, 0x005f, 0x185e, 0x8957, 0x61b9, 0xc9d3, 0x9a96, 0x059f, 0x067f, 0x06ff, 0x071f, 0x073f, 0x075f, 0x267d, 0xb9d3, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xb152, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cf, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x00f6, 0x18ce, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f1, 0x38f1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69b4, 0x6336, 0x6cd9, 0x4e5b, 0x07df, 0x8539, 0xd395, 0xd395, 0xbc17, 0x3e9c, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x06bd, 0x069c, 0x069c, 0x067c, 0x065c, 0x065c, 0x063c, 0x061c, 0x05fc, 0x05dc, 0x05bc, 0x05bd, 0x059d, 0x057d, 0x055d, 0x053e, 0x051e, 0x04fe, 0x04de, 0x04be, 0x04bf, 0x049f, 0x047f, 0x047f, 0x047f, 0x045f, 0x045f, 0x045f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x049f, 0x047f, 0x045f, 0x041f, 0x03df, 0x037f, 0x031f, 0x029f, 0x021f, 0x017f, 0x011f, 0x00bf, 0x005f, 0x001f, 0x001f, 0x00ff, 0x89b7, 0xc9b3, 0x447b, 0x065f, 0x06bf, 0x071f, 0x073f, 0x073f, 0x075f, 0x3d9b, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xa132, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20cd, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x40f1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61b3, 0x9274, 0xb2f5, 0xc355, 0xd395, 0xd395, 0xd395, 0xbc16, 0x469d, 0x8539, 0xd376, 0xd375, 0x6dba, 0x0f9f, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x077f, 0x06bc, 0x06bb, 0x069b, 0x067b, 0x065b, 0x063b, 0x063b, 0x061b, 0x05fb, 0x05db, 0x05bb, 0x059c, 0x059c, 0x057c, 0x055c, 0x053d, 0x051d, 0x04fd, 0x04dd, 0x04be, 0x049e, 0x047f, 0x047f, 0x045f, 0x043f, 0x043f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x041f, 0x03ff, 0x03bf, 0x037f, 0x033f, 0x02bf, 0x023f, 0x01df, 0x015f, 0x00df, 0x009f, 0x005f, 0x001f, 0x005f, 0x097f, 0xb9b3, 0xb214, 0x0dbf, 0x06ff, 0x075f, 0x073f, 0x073f, 0x075f, 0x077f, 0x6479, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x9132, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x3110, 0x38f0, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xc335, 0xd395, 0xd395, 0xd395, 0xd395, 0xac57, 0x7d7a, 0x469c, 0x0f9f, 0xa4b8, 0xd395, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x075d, 0x06bb, 0x06bb, 0x069a, 0x067a, 0x065a, 0x065a, 0x063a, 0x061a, 0x05fa, 0x05da, 0x05db, 0x05bb, 0x059b, 0x057b, 0x055b, 0x053c, 0x053c, 0x051c, 0x04fc, 0x04dd, 0x04bd, 0x047e, 0x047e, 0x045e, 0x043f, 0x041f, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03bf, 0x035f, 0x031f, 0x02df, 0x027f, 0x01ff, 0x019f, 0x011f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x009f, 0x39db, 0xc992, 0x6399, 0x069f, 0x079f, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x079f, 0x9af6, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x7112, 0x3110, 0x30f0, 0x30ef, 0x28f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d3, 0x10d2, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xcb75, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x1f7e, 0x07ff, 0x07ff, 0x36dd, 0xbc17, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x071b, 0x06da, 0x06ba, 0x06ba, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05f9, 0x05da, 0x05ba, 0x059a, 0x057a, 0x055a, 0x055b, 0x053b, 0x051b, 0x04fc, 0x04dc, 0x04bc, 0x049d, 0x047d, 0x045d, 0x043e, 0x041e, 0x03fe, 0x03df, 0x03df, 0x03bf, 0x03bf, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x037f, 0x035f, 0x031f, 0x02df, 0x027f, 0x023f, 0x01bf, 0x015f, 0x00ff, 0x009f, 0x005f, 0x001f, 0x003f, 0x011f, 0x99b6, 0xb9d3, 0x0d9f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f7e, 0xb9b3, 0xc952, 0xc952, 0xc952, 0xc952, 0xc931, 0xc932, 0xc132, 0x6111, 0x38f0, 0x30f0, 0x28f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xa2b4, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x0fbf, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x1f7e, 0x07df, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x06f9, 0x06f9, 0x06d9, 0x06b8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05f8, 0x05d8, 0x05b8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051a, 0x04fa, 0x04db, 0x04bb, 0x049c, 0x047c, 0x045d, 0x043d, 0x041e, 0x03fe, 0x03de, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02bf, 0x027f, 0x023f, 0x01ff, 0x019f, 0x013f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x005f, 0x197e, 0xb993, 0x6379, 0x063f, 0x073f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dfb, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc932, 0xc912, 0xb912, 0x4111, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x08f6, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79f3, 0xb2f4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x94f9, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x079d, 0x0719, 0x06f8, 0x06f8, 0x06d7, 0x06b7, 0x06b7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05f7, 0x05d7, 0x05b7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04f9, 0x04da, 0x04bb, 0x049b, 0x047c, 0x043c, 0x041d, 0x041d, 0x03fe, 0x03de, 0x03be, 0x039e, 0x037f, 0x035f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x027f, 0x023f, 0x01ff, 0x019f, 0x015f, 0x00ff, 0x009f, 0x005f, 0x003f, 0x001f, 0x00bf, 0x59ba, 0xb9b3, 0x0d3f, 0x06bf, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7438, 0xc952, 0xc132, 0xc932, 0xc932, 0xc932, 0xc911, 0xc912, 0xa111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x08f5, 0x011a, 0x0119, 0x00fa, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x5151, 0x79f3, 0xa2b4, 0xcb75, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x469c, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0xc335, 0x45d7, 0x0738, 0x0717, 0x06f6, 0x06f6, 0x06d6, 0x06b5, 0x06b5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05f5, 0x05f5, 0x05d6, 0x05b6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04f9, 0x04d9, 0x049a, 0x047b, 0x045b, 0x043c, 0x041c, 0x03dd, 0x03dd, 0x03be, 0x039e, 0x037e, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x021f, 0x01ff, 0x01bf, 0x017f, 0x011f, 0x00df, 0x009f, 0x003f, 0x001f, 0x003f, 0x013f, 0xb174, 0x6339, 0x05ff, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb992, 0xc932, 0xc932, 0xc931, 0xc912, 0xc912, 0xc912, 0xc911, 0x8111, 0x30f0, 0x30f0, 0x28ef, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20d0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08f5, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x59b2, 0x7a13, 0x9a94, 0xbb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xac77, 0x2f1e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bc, 0x0759, 0xabb5, 0xc314, 0x1e97, 0x0736, 0x0716, 0x0715, 0x06f4, 0x06f4, 0x06f3, 0x06d3, 0x06b3, 0x06b2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05f4, 0x05d4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04f8, 0x04b9, 0x0499, 0x045a, 0x043b, 0x041b, 0x03fc, 0x03dd, 0x03bd, 0x039d, 0x037e, 0x035e, 0x033e, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x021f, 0x01df, 0x019f, 0x017f, 0x013f, 0x00ff, 0x009f, 0x007f, 0x003f, 0x001f, 0x007f, 0x399b, 0xb993, 0x055f, 0x067f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x45db, 0xc132, 0xc932, 0xc912, 0xc132, 0xc912, 0xc912, 0xc911, 0xc912, 0x5111, 0x38f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x10d3, 0x10f4, 0x18d0, 0x18ad, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ce, 0x20ce, 0x28ae, 0x20ce, 0x28ee, 0x5171, 0x69d2, 0x8232, 0xaaf4, 0xc334, 0xd375, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x757a, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bd, 0x079b, 0x077a, 0x0779, 0x74d6, 0xd2d4, 0x9bf5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06f0, 0x06f0, 0x06d0, 0x06af, 0x06af, 0x066f, 0x0650, 0x0631, 0x0611, 0x05d2, 0x0594, 0x0554, 0x0515, 0x04f7, 0x04b8, 0x0478, 0x0459, 0x043a, 0x03fb, 0x03bc, 0x03bc, 0x039d, 0x037d, 0x035e, 0x033e, 0x031f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x027f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x013f, 0x011f, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x00df, 0xa175, 0x33bc, 0x05df, 0x06ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x92d5, 0xc911, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc112, 0xc912, 0xa8f1, 0x3110, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x390f, 0x4970, 0x59b0, 0x7a32, 0x9293, 0xaad3, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x9cb8, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07dd, 0x07bc, 0x079b, 0x079a, 0x079a, 0x0779, 0x55b7, 0xd2b4, 0xd2b4, 0x4db5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074f, 0x074e, 0x074d, 0x074d, 0x074c, 0x072b, 0x072b, 0x072a, 0x070a, 0x06ea, 0x06ac, 0x064d, 0x05d0, 0x0573, 0x04f5, 0x04b6, 0x0478, 0x0438, 0x041a, 0x03fb, 0x03bc, 0x039c, 0x037c, 0x033d, 0x033d, 0x031e, 0x02fe, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x009f, 0x005f, 0x003f, 0x001f, 0x003f, 0x213d, 0x1b1e, 0x051f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f3d, 0xc912, 0xc912, 0xc112, 0xc112, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0x80f1, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xc374, 0xa2d3, 0xaad3, 0x7a31, 0x7a31, 0x7a11, 0x7231, 0x5190, 0x496f, 0x496f, 0x4970, 0x496f, 0x494f, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x494f, 0x496f, 0x496f, 0x69f1, 0x7a31, 0x7a31, 0x9272, 0xa2d3, 0xaaf3, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd395, 0xac57, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x079a, 0x079a, 0x0799, 0x26b8, 0xcad4, 0xd2b4, 0xc314, 0x0f35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078f, 0x078e, 0x078e, 0x078d, 0x078c, 0x07aa, 0x07a9, 0x07a9, 0x07a8, 0x07c7, 0x07c5, 0x07c4, 0x07e4, 0x07a4, 0x0727, 0x068a, 0x05af, 0x0496, 0x0438, 0x03f9, 0x03ba, 0x039b, 0x035c, 0x035d, 0x031d, 0x031d, 0x02fe, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x007f, 0x023f, 0x041f, 0x05bf, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6498, 0xc911, 0xc912, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8d1, 0x50f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0117, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x8539, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x07ba, 0x07ba, 0x07b9, 0xd2b4, 0xd2b4, 0xd2b4, 0x6535, 0x07b5, 0x07b5, 0x07b4, 0x07b3, 0x07b2, 0x07b1, 0x07b0, 0x07af, 0x07ce, 0x07cd, 0x07cc, 0x07cb, 0x07ca, 0x07ca, 0x07c9, 0x07e8, 0x07e7, 0x07e6, 0x07e5, 0x07e5, 0x07e3, 0x07e3, 0x07e2, 0x07e1, 0x0726, 0x060c, 0x04b4, 0x03b9, 0x037b, 0x035c, 0x033d, 0x031d, 0x02de, 0x02df, 0x02be, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x015f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x007f, 0x003f, 0x001f, 0x001f, 0x011f, 0x02ff, 0x04df, 0x063f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb972, 0xc8f2, 0xc8f2, 0xc0f1, 0xc8f2, 0xc0f2, 0xc0f1, 0xc8d1, 0xa0f1, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x412f, 0x8a72, 0xc334, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xac57, 0x469c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x467c, 0x8519, 0x8519, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07de, 0x07de, 0x07dd, 0x07dc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x07da, 0x9bf5, 0xd2b4, 0xd2b4, 0xc2f4, 0x0f77, 0x07d6, 0x07d5, 0x07d4, 0x07d4, 0x07d3, 0x07d2, 0x07d1, 0x07d0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07ec, 0x07ea, 0x07e9, 0x07e9, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e4, 0x07e4, 0x07e3, 0x07e3, 0x07e2, 0x0785, 0x060c, 0x04d3, 0x035b, 0x031c, 0x02de, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x001f, 0x001f, 0x003f, 0x01df, 0x03bf, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d7a, 0xc111, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0d1, 0xc8d1, 0x68f1, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x414f, 0x61d1, 0x8251, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xbc16, 0x8539, 0x469c, 0x17bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8518, 0xd355, 0xd355, 0xd335, 0xd335, 0x84f8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07fe, 0x07dd, 0x07dd, 0x07bc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x8c56, 0xcab4, 0xcab4, 0xd294, 0x4df7, 0x07d7, 0x07d7, 0x07d6, 0x07f5, 0x07d5, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07e9, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e5, 0x07e5, 0x07e4, 0x07a6, 0x060e, 0x03f8, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x003f, 0x001f, 0x001f, 0x00bf, 0x029f, 0x049f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1d3, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0f1, 0xc8d1, 0xb8d1, 0x40f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0x496f, 0x5990, 0x7a12, 0x7a32, 0x9272, 0xa2d3, 0xa2d3, 0xc375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xac77, 0x757a, 0x36fd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4e3c, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd334, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07dd, 0x07dd, 0x07dc, 0x07fc, 0x07dc, 0x07db, 0x6d38, 0xcab4, 0xd294, 0xd294, 0xab95, 0x07d8, 0x07d8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ec, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07e9, 0x07e9, 0x07e8, 0x07e8, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e8, 0x07c8, 0x06eb, 0x0514, 0x033c, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0x015f, 0x037f, 0x057f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5a, 0xc8f1, 0xc8d1, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x78d1, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x496f, 0x496f, 0x4970, 0x7a12, 0x7a31, 0x8252, 0xaad3, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcbd6, 0x94f8, 0x565b, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb3f6, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd334, 0x1f7e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07dd, 0x07fd, 0x07fd, 0x07fd, 0x07dd, 0x07dc, 0x6d38, 0xcab4, 0xd294, 0xca94, 0xd294, 0x1f39, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ed, 0x07ec, 0x07eb, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07ca, 0x07ab, 0x076c, 0x070d, 0x05b2, 0x039b, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60d9, 0x0a3f, 0x047f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9d3, 0xc0d1, 0xc8d1, 0xc0f1, 0xc8b1, 0xc0d1, 0xc8b1, 0xc0b1, 0xb8b1, 0x48f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x4970, 0x5990, 0x7a31, 0x7231, 0x7a31, 0x7a31, 0x9ab3, 0xaad4, 0xa2d4, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0x94f8, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd315, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x6d58, 0xd294, 0xd293, 0xca94, 0xd274, 0x4df8, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f1, 0x07f0, 0x07f0, 0x07f0, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ed, 0x07cd, 0x078e, 0x076e, 0x0710, 0x06b1, 0x0574, 0x037b, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x013f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x88d6, 0x6159, 0x031f, 0x053f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5b, 0xc0d1, 0xc8d1, 0xc8d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b1, 0x90d1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ce, 0x18ad, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x290f, 0x5170, 0x5170, 0x69f1, 0x7a32, 0x8232, 0xaaf3, 0xaaf4, 0xcb75, 0xd395, 0xd396, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xc3b6, 0x8539, 0x1f7f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0x659a, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x6d39, 0xd294, 0xca94, 0xd274, 0xca74, 0x7c96, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f4, 0x07f4, 0x07f3, 0x07f3, 0x07f3, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f1, 0x07f1, 0x07f1, 0x07f1, 0x07f0, 0x07f1, 0x07d0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02dd, 0x01bf, 0x019f, 0x017f, 0x015f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x00bf, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60b8, 0xb8f3, 0x09bf, 0x041f, 0x061f, 0x073f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1b3, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x48f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x5172, 0x61b2, 0x8a54, 0x9a94, 0xb335, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0x9c97, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xac17, 0xd335, 0xd314, 0xd335, 0xd314, 0xd315, 0xd315, 0xd2f4, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6d59, 0xd274, 0xca94, 0xd274, 0xca74, 0xb334, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f4, 0x07f4, 0x07f4, 0x07d3, 0x07b3, 0x0793, 0x0753, 0x0714, 0x06b5, 0x5516, 0x0538, 0x037c, 0x01ff, 0x017f, 0x015f, 0x013f, 0x011f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x6099, 0xc911, 0x491a, 0x02df, 0x051f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6459, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x90d1, 0x30f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69d3, 0x9274, 0xb2f5, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xa478, 0x36dd, 0x07ff, 0x07ff, 0x563c, 0xd335, 0xd334, 0xd315, 0xd315, 0xd2f4, 0xcb15, 0xbb96, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8498, 0xca94, 0xca94, 0xd274, 0xca74, 0xca74, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07d6, 0x07b6, 0x0796, 0x0756, 0x0716, 0xa456, 0xbbd6, 0x3479, 0x02fd, 0x023f, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x003f, 0x78b7, 0xc111, 0xa114, 0x01ff, 0x041f, 0x05ff, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xc0b1, 0xc0d2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x48f1, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x20cd, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71f4, 0x9a75, 0xb2f5, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0x9c78, 0x36dd, 0x07ff, 0x9c57, 0xd335, 0xd315, 0xd334, 0xd314, 0xc355, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bf7, 0xca94, 0xd274, 0xca73, 0xca74, 0xd253, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f8, 0x07d8, 0x07b8, 0x0797, 0x0758, 0x0ef8, 0xbbf6, 0xd395, 0x6b99, 0x025f, 0x021f, 0x01bf, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x98d5, 0xc8f2, 0xc911, 0x195e, 0x033f, 0x053f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b76, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x88d1, 0x30f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10d2, 0x00f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08d5, 0x10d0, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8a16, 0xaad5, 0xcb55, 0xd375, 0xd355, 0xd354, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0x84f9, 0x0fbf, 0x5ddb, 0xa457, 0x9c58, 0x84d8, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca74, 0xca74, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07da, 0x07da, 0x07ba, 0x079a, 0x0779, 0x2e99, 0xc3d6, 0xd395, 0x8339, 0x0a3e, 0x01df, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0x90d5, 0xc912, 0xc0f1, 0x7117, 0x027f, 0x049f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x269d, 0xc891, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8b1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x20ad, 0x10d1, 0x00f8, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18af, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ce, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ef, 0x28cf, 0x28ef, 0x28d0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8b14, 0x4ad3, 0x7a94, 0xab14, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd314, 0xd335, 0xc355, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc2d4, 0xca74, 0xca74, 0xd274, 0xca74, 0xd253, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07db, 0x07bb, 0x07bb, 0x077b, 0x2eba, 0xc3d6, 0xd395, 0xb337, 0x09df, 0x01bf, 0x017f, 0x013f, 0x011f, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x7896, 0xc0f1, 0xc8f1, 0xa8f3, 0x01df, 0x03df, 0x05bf, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0x68f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0139, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x0119, 0x08f6, 0x10d2, 0x10d0, 0x18cf, 0x18d0, 0x10d3, 0x0118, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9a75, 0xcb55, 0xcb75, 0x5bb4, 0x3b34, 0x42b3, 0x4a33, 0x6253, 0x9ab4, 0xd335, 0xd335, 0xd315, 0xd334, 0xd314, 0xd315, 0xd314, 0xd314, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f5e, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xca53, 0x369d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07dd, 0x07dd, 0x07bd, 0x079c, 0x561a, 0xd395, 0xd395, 0xab37, 0x099f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x003f, 0x003f, 0x305c, 0xc0f1, 0xc8f1, 0xc8d1, 0x215d, 0x033f, 0x051f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5cd9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x98d1, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0117, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x08f3, 0x0118, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x011a, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xcb55, 0xd375, 0xbb95, 0x5474, 0x3c34, 0x3bb4, 0x4333, 0x42b3, 0x4a13, 0x49f3, 0x5a32, 0x9ab4, 0xd334, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0x84d8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4ddb, 0xd274, 0xca74, 0xca73, 0xd274, 0xca54, 0xca54, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07de, 0x079d, 0x6d99, 0xd395, 0xd395, 0xab17, 0x097f, 0x011f, 0x011f, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0xc8f1, 0xc8f1, 0xc8d1, 0x5119, 0x02df, 0x04ff, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x4910, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18d0, 0x00f8, 0x0119, 0x00f8, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xcb55, 0xd375, 0xd375, 0xb3d5, 0x3d55, 0x3515, 0x3495, 0x3c14, 0x3b94, 0x3b13, 0x4293, 0x4212, 0x49f3, 0x49f3, 0x5a13, 0x9ab4, 0xd314, 0xd315, 0xcb15, 0xd2f4, 0xd2f5, 0xd2f4, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8c37, 0xca74, 0xd273, 0xd253, 0xca54, 0xca53, 0xd253, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07df, 0x07df, 0x94d8, 0xd396, 0xd395, 0x8299, 0x00ff, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0xc8d1, 0xc0f1, 0xc0d1, 0xa0d4, 0x027f, 0x04bf, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8315, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x70f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0117, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x10d3, 0x08f3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x0117, 0x0119, 0x0119, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0117, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xb2f4, 0xd375, 0xd375, 0xd375, 0x9435, 0x3d55, 0x2d55, 0x2d75, 0x3515, 0x3c94, 0x3414, 0x3b94, 0x4313, 0x4293, 0x4a13, 0x41f3, 0x49f2, 0x4a13, 0x5a33, 0xa2b4, 0xd314, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2f4, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x179f, 0xd274, 0xca53, 0xca73, 0xca53, 0xca53, 0xca53, 0xd253, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xbc16, 0xd395, 0xd395, 0x725a, 0x00bf, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x90b5, 0xc8d1, 0xc8d1, 0xc0d1, 0x123e, 0x047f, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x90d1, 0x38f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x08f6, 0x011a, 0x0119, 0x0118, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x38f0, 0x30f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xcb55, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3bf4, 0x3b73, 0x42f4, 0x4273, 0x4a13, 0x4213, 0x49f2, 0x49f3, 0x49f3, 0x6a33, 0xbad4, 0xd2f5, 0xd2f4, 0xd2d4, 0xc335, 0x177e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xca54, 0xd273, 0xca54, 0xca53, 0xca53, 0xca53, 0x9bb6, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x077e, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x36dd, 0xd395, 0xd395, 0xd395, 0x51bc, 0x009f, 0x009f, 0x007f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x7077, 0xc0d2, 0xc8d1, 0xc0d1, 0x49fa, 0x049f, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x08f5, 0x20ad, 0x18cd, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4952, 0xaab4, 0xd375, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x2d75, 0x2d75, 0x3555, 0x54d5, 0x6475, 0x83b5, 0x8b74, 0x9b34, 0xab14, 0xaad4, 0xb2d4, 0xaad4, 0xaab4, 0xaab4, 0xb2b4, 0x6b15, 0x8a94, 0xc2d4, 0xd2f4, 0xd2d4, 0x84b8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb315, 0xd274, 0xca53, 0xca54, 0xca53, 0xca53, 0xd253, 0x653a, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x071f, 0x071e, 0x071e, 0x073e, 0x079f, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7d7a, 0xd395, 0xd395, 0xc375, 0x28fe, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x005f, 0x003f, 0x003f, 0x183e, 0xc0d1, 0xc0d1, 0xc0d2, 0x7996, 0x04bf, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x58f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18af, 0x0119, 0x0119, 0x08f6, 0x20ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0118, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0139, 0x0119, 0x10f3, 0x18d0, 0x08f5, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ae, 0x18cd, 0x0119, 0x011a, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0117, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x5972, 0xcb55, 0xd375, 0xd375, 0xd375, 0xd375, 0xabd5, 0x4515, 0x54f5, 0x7c75, 0x8c35, 0xabd5, 0xcb55, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xc355, 0x9c37, 0x659a, 0x467c, 0x0fbf, 0x07ff, 0x07ff, 0x269d, 0x9c17, 0xd2d4, 0x9c17, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xd274, 0xca53, 0xca54, 0xca53, 0xca33, 0xca33, 0xca33, 0x26dd, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071e, 0x071e, 0x06fe, 0x06fe, 0x06ff, 0x06de, 0x06de, 0x06be, 0x06be, 0x06de, 0x073e, 0x079f, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x079f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0xc3f6, 0xd395, 0xd395, 0xaaf7, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x001f, 0x001f, 0xa094, 0xc0d1, 0xc8b1, 0xa8f3, 0x04bf, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x73d8, 0xb8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18cf, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x00f6, 0x0119, 0x08f3, 0x18ad, 0x20ad, 0x20ad, 0x00f6, 0x00f9, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x10d3, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x10cf, 0x0119, 0x00f9, 0x0117, 0x18ce, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x71f2, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xcb14, 0xd334, 0xd334, 0xac16, 0x753a, 0x467d, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x369c, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26fd, 0xc2b4, 0xca53, 0xca53, 0xca53, 0xd253, 0xca33, 0xca33, 0xa356, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06fe, 0x06fe, 0x06de, 0x06be, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x06be, 0x073e, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07df, 0x6dda, 0xd395, 0xd376, 0xd375, 0x79fa, 0x003f, 0x003f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x8896, 0xc0b1, 0xc0b1, 0xc8b1, 0x0c9f, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0x98d1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x08f3, 0x20ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f3, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x9a93, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd355, 0xd335, 0xd335, 0xc375, 0x84f9, 0x4e3c, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xab75, 0xca54, 0xd253, 0xca53, 0xca33, 0xca33, 0xd233, 0xca33, 0x4dbb, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06de, 0x06de, 0x06de, 0x06be, 0x06be, 0x069e, 0x067e, 0x067e, 0x067e, 0x065e, 0x063e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05fd, 0x067d, 0x06de, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x071e, 0x073f, 0x073f, 0x073f, 0x073e, 0x075f, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x0fbf, 0xc3d6, 0xd375, 0xd375, 0xd355, 0x30fd, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x6058, 0xc0b1, 0xc0b1, 0xc0b1, 0x33fc, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0b1, 0xb8d1, 0xb8d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f6, 0x0119, 0x08d5, 0x18cd, 0x18ae, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d3, 0x10d0, 0x08f4, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x3910, 0xaaf4, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x7539, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2efd, 0xb315, 0xca53, 0xca54, 0xca33, 0xca53, 0xca34, 0xca34, 0xca33, 0xa335, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06de, 0x06bf, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05bd, 0x05be, 0x059d, 0x055e, 0x055e, 0x05be, 0x05fe, 0x061d, 0x067e, 0x06be, 0x06fe, 0x06fe, 0x071f, 0x071e, 0x073f, 0x073f, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x8539, 0xd375, 0xd355, 0xd355, 0xbaf6, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x403b, 0xc8b1, 0xc0b1, 0xc0b1, 0x6318, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9b3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x4910, 0x3910, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x10d3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f3, 0x011a, 0x0118, 0x18ad, 0x18cd, 0x18ad, 0x18ce, 0x00f8, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20cd, 0x18ad, 0x10d0, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30cf, 0x3910, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xcb96, 0x8518, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbe, 0x653a, 0xca54, 0xca53, 0xd253, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x2e9d, 0x077f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06fe, 0x06df, 0x06de, 0x06bf, 0x06be, 0x06bf, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05be, 0x05be, 0x059e, 0x057e, 0x053e, 0x051e, 0x04fe, 0x04be, 0x049e, 0x041e, 0x03dd, 0x04de, 0x065e, 0x06be, 0x06de, 0x06de, 0x06fe, 0x071f, 0x073e, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x36dd, 0xd355, 0xd355, 0xd355, 0xd335, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0xb8b2, 0xc091, 0xc0b1, 0x7a96, 0x06bf, 0x079f, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x82f5, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0x60f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x20cd, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18af, 0x08f6, 0x0119, 0x0119, 0x00f9, 0x08f4, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x00f8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x08f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x28cf, 0x28ef, 0x3910, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x5d9a, 0xb315, 0xd254, 0xca53, 0xd254, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xca33, 0x64d9, 0x077f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06be, 0x069f, 0x069f, 0x067e, 0x065e, 0x065e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x055e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043d, 0x03de, 0x03be, 0x039e, 0x037e, 0x03fe, 0x05fe, 0x069e, 0x069e, 0x06be, 0x06fe, 0x071e, 0x073f, 0x075f, 0x079f, 0x079f, 0x07df, 0x07df, 0x07df, 0x07ff, 0xbbf6, 0xd355, 0xd335, 0xd335, 0xc2f5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x9095, 0xc8b1, 0xc8b1, 0x91f5, 0x067f, 0x06ff, 0x073f, 0x075f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x80f2, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x00f6, 0x011a, 0x0117, 0x18ce, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x08f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x3110, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0x9c77, 0x563b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f7e, 0x65db, 0x7cf9, 0x9c57, 0x9c57, 0x9c57, 0x9c57, 0x9c37, 0x9c37, 0x9c37, 0x9c37, 0x7539, 0x6d7a, 0x6579, 0x5dbb, 0x36bd, 0x36bd, 0x36bc, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x36bd, 0x5d9a, 0x8c37, 0xd274, 0xd273, 0xd254, 0xca53, 0xd254, 0xd253, 0xca33, 0xd233, 0xca34, 0xca13, 0xca33, 0x8418, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x069e, 0x069f, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x05be, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04be, 0x045e, 0x03fe, 0x03be, 0x039e, 0x037e, 0x037e, 0x035e, 0x033e, 0x035e, 0x061d, 0x067e, 0x067e, 0x069e, 0x06be, 0x06fe, 0x073f, 0x075f, 0x077f, 0x079f, 0x07df, 0x07df, 0x07ff, 0x7d59, 0xd335, 0xd335, 0xd335, 0xd314, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x60d8, 0xc0b1, 0xc0b1, 0xb8f2, 0x05df, 0x061f, 0x065f, 0x06df, 0x073f, 0x077f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x90d1, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f8, 0x011a, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0x9c77, 0x3edd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x659a, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca74, 0xca74, 0xca73, 0xca73, 0xd274, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xab15, 0x0edf, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067e, 0x067f, 0x067e, 0x065e, 0x063f, 0x061e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043e, 0x03be, 0x039e, 0x039e, 0x035e, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x037e, 0x05fe, 0x065e, 0x067e, 0x069e, 0x06de, 0x06fe, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x271d, 0xd335, 0xd314, 0xd315, 0xd315, 0xc2d5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x009f, 0x60d8, 0xc0b1, 0xc0b2, 0xc0b1, 0x04bf, 0x053f, 0x05bf, 0x067f, 0x06df, 0x075f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0x98d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ce, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x08f7, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x0118, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xac37, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x0ebd, 0x1d7b, 0x1c99, 0x32f5, 0x3a75, 0x6193, 0x69b3, 0x79f4, 0x8a14, 0xb294, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xd274, 0xca53, 0xca54, 0xca54, 0xca53, 0xd253, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x8b97, 0x35fd, 0x5d7b, 0x6d3a, 0x6d3a, 0x5d5b, 0x35fd, 0x06bf, 0x0e7e, 0x457c, 0x6c99, 0x6479, 0x6459, 0x4cba, 0x0e1e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04de, 0x047e, 0x03de, 0x03be, 0x037e, 0x037f, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x02fe, 0x02fe, 0x02de, 0x03fe, 0x05be, 0x063e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073e, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0xbbb6, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0x697a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x48fa, 0xc0b1, 0xc0b1, 0xc0b1, 0x331c, 0x047f, 0x053f, 0x05ff, 0x069f, 0x073f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9a14, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ae, 0x18cf, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f4, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x0119, 0x08f6, 0x10d2, 0x10d0, 0x18d0, 0x18d1, 0x10d2, 0x00f8, 0x0119, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x9273, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xc3b6, 0x5dfb, 0x07ff, 0x0e3b, 0x1c98, 0x2ad5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79d3, 0x9a54, 0xc294, 0xd2f4, 0xd2d5, 0xcad4, 0xd2d4, 0xd2b4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xca73, 0xd253, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x99d4, 0x6358, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd375, 0x06bf, 0x5cfa, 0xd2b4, 0xca94, 0xca33, 0xca13, 0xc9d3, 0xb9d3, 0x4c5a, 0x061e, 0x061e, 0x05de, 0x05de, 0x05be, 0x059e, 0x059e, 0x057e, 0x053e, 0x051e, 0x051d, 0x04de, 0x04be, 0x043e, 0x03be, 0x03be, 0x037f, 0x0b7e, 0x337c, 0x333c, 0x335c, 0x333c, 0x333c, 0x331c, 0x331c, 0x32fc, 0x32fc, 0x32dc, 0x2b7c, 0x05de, 0x061e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07df, 0x84f9, 0xd314, 0xcb14, 0xcaf4, 0xd2d5, 0xb275, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x08df, 0xb8d2, 0xc0b1, 0xc0b1, 0x3a7b, 0x03ff, 0x04df, 0x05bf, 0x067f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b77, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x20cf, 0x0918, 0x013a, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x08f6, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0139, 0x00f9, 0x10d2, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x9c78, 0x261b, 0x1b96, 0x3171, 0x30f0, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81f3, 0xaa73, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xca53, 0xca53, 0xca53, 0xd233, 0xca33, 0xca33, 0xd233, 0xc234, 0x7994, 0x5975, 0xb315, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xc375, 0x067f, 0x067f, 0x6c79, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc912, 0x34bb, 0x05fe, 0x05de, 0x05be, 0x059e, 0x055e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x249d, 0x347b, 0x6bfa, 0x7b99, 0x9b98, 0xab97, 0xdb95, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xbbd6, 0x9c37, 0x8499, 0x6d1a, 0x363c, 0x1edd, 0x079f, 0x07bf, 0x07df, 0x4e1b, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0x40fc, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x78d7, 0xc0b1, 0xc0b1, 0x61d8, 0x03bf, 0x049f, 0x057f, 0x065f, 0x071f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x10f3, 0x013a, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011a, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x10d2, 0x08f3, 0x08f4, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x10f2, 0x00f7, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x10d0, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x5170, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0x6519, 0x22b3, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79b3, 0xa233, 0xd2b4, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xca94, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xd253, 0xca54, 0xca54, 0xca33, 0xd233, 0xca34, 0xca33, 0xca33, 0xa1d3, 0x5954, 0x5954, 0x79f5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd335, 0x8c18, 0x067f, 0x065f, 0x063f, 0xa2d5, 0xc9d3, 0xc972, 0xc952, 0xc111, 0xc8d1, 0x8a55, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x34dc, 0x6c5a, 0xa3f7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xbbb6, 0x84d9, 0x4e1b, 0x465c, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0x81d8, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x6098, 0xc0b1, 0xc0d1, 0x59b8, 0x035f, 0x045f, 0x055f, 0x063f, 0x06ff, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x58f1, 0x3911, 0x30f0, 0x3110, 0x30cf, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x08f6, 0x013a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x08f8, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x00f8, 0x08f8, 0x0118, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00fa, 0x00f8, 0x08f7, 0x08f7, 0x18b0, 0x18ad, 0x18ae, 0x08f4, 0x0119, 0x08f8, 0x08f8, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x10d4, 0x10d0, 0x18ad, 0x20ad, 0x08f8, 0x10d3, 0x18ad, 0x18ad, 0x10f4, 0x10d1, 0x18ad, 0x18ad, 0x08f8, 0x00f7, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ce, 0x20ae, 0x28ee, 0xcb55, 0xd375, 0xd375, 0xd375, 0xbb14, 0x34f9, 0x2930, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91f2, 0xc254, 0xca93, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xca73, 0xd273, 0xca73, 0xd254, 0xca53, 0xca53, 0xca54, 0xca33, 0xca34, 0xa1f3, 0x6973, 0x4953, 0x5134, 0x5154, 0xaaf5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd335, 0xd314, 0x5cda, 0x065f, 0x063f, 0x063f, 0xb254, 0xc972, 0xc952, 0xc112, 0xc8d1, 0xc0b1, 0xc0b1, 0x05be, 0x059e, 0x2d1c, 0x9438, 0xcbb6, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xca94, 0x087f, 0x003f, 0x001f, 0x001f, 0x001f, 0x385b, 0xc0b1, 0xc0b1, 0x9135, 0x031f, 0x043f, 0x053f, 0x063f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb8d1, 0x5911, 0x3911, 0x38f0, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x0917, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x08f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ce, 0x0118, 0x0119, 0x011a, 0x00f7, 0x08f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x10d1, 0x10d0, 0x18ad, 0x08d5, 0x10d1, 0x18ad, 0x20ae, 0x00f7, 0x18ad, 0x18ae, 0x18ad, 0x08f7, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x18ae, 0x18ad, 0x18ae, 0x0118, 0x18ae, 0x18ad, 0x08f4, 0x18d0, 0x18ad, 0x18ad, 0x10d1, 0x10d5, 0x18ae, 0x18ad, 0x08f5, 0x10d1, 0x20ad, 0x18ad, 0x00f8, 0x08f7, 0x18af, 0x18ad, 0x08d4, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x20ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x011a, 0x00f9, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18cd, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x20ce, 0x8252, 0xd375, 0xd375, 0xd375, 0x9a93, 0x30ef, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81d2, 0xaa13, 0xba33, 0xca54, 0xca74, 0xca53, 0xca54, 0xca53, 0xca53, 0xb213, 0xa1f3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xd395, 0xd395, 0xd396, 0xd375, 0xd334, 0xd2f5, 0xd2b4, 0x2d9d, 0x063f, 0x063f, 0x061f, 0xc993, 0xc952, 0xc911, 0xc8f1, 0xc0b1, 0xc0b1, 0xb8d1, 0x059e, 0x057e, 0xabf7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd335, 0xcb15, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0x411c, 0x003f, 0x003f, 0x001f, 0x001f, 0x203c, 0xc0b1, 0xc0b1, 0x9135, 0x02ff, 0x041f, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa1b3, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x68f1, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x10f3, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10f4, 0x08f7, 0x18ad, 0x18ae, 0x18ad, 0x08f8, 0x20ae, 0x18ad, 0x18ad, 0x10d1, 0x10f4, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x18ad, 0x18ad, 0x10d1, 0x08f6, 0x18ad, 0x20ad, 0x08f4, 0x10d3, 0x18d1, 0x18d1, 0x08f5, 0x18d2, 0x18ad, 0x20ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x08f7, 0x18af, 0x08f7, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x208e, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x0119, 0x011a, 0x011a, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x412f, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ce, 0x28cf, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3110, 0x38f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x38f1, 0x38f0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8a34, 0xd395, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xb2f6, 0x065f, 0x061f, 0x061f, 0x34dc, 0xc952, 0xc912, 0xc8d2, 0xc0b1, 0xc0d1, 0xb8d1, 0x89b4, 0x2bba, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71d4, 0x69f4, 0x71d3, 0x69d4, 0x71d3, 0x7a14, 0x8a75, 0x9274, 0x9254, 0x9254, 0x9a95, 0xb315, 0xbb14, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xcb14, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xcab4, 0xca94, 0xca94, 0x81b8, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0xa8b3, 0xc0b1, 0xb0d2, 0x02df, 0x03ff, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f2, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20cf, 0x0918, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x10d0, 0x00fa, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f7, 0x18d1, 0x18ad, 0x20ad, 0x08f8, 0x18ad, 0x18ad, 0x18ad, 0x18d1, 0x08d4, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ae, 0x00fa, 0x08f8, 0x00f7, 0x08f6, 0x18ae, 0x18ad, 0x18ad, 0x08f4, 0x08f6, 0x08d4, 0x08f6, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ae, 0x18ae, 0x08f8, 0x18ad, 0x08f3, 0x10d3, 0x10d5, 0x10d0, 0x18ad, 0x18ad, 0x20ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20cd, 0x9272, 0xd375, 0xc334, 0x61d1, 0x20cf, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x30f0, 0x3110, 0x3110, 0x30f0, 0x3110, 0x38f0, 0x30f0, 0x38f0, 0x3111, 0x38f0, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xb2f5, 0xd395, 0xd375, 0xd355, 0xd2f4, 0xd2b4, 0xd274, 0x83b8, 0x063f, 0x061f, 0x061e, 0x6398, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61b3, 0x7a34, 0x9a95, 0xb2f5, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd274, 0xca74, 0xc254, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x5878, 0xb8d1, 0xc0b1, 0x02bf, 0x03bf, 0x04ff, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6478, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20cf, 0x0917, 0x011a, 0x011a, 0x0119, 0x08f4, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x10d1, 0x18cf, 0x18ad, 0x10d1, 0x10f4, 0x18ad, 0x18ad, 0x08f7, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x18d1, 0x18ad, 0x18ad, 0x08f6, 0x18cf, 0x18ae, 0x20ae, 0x10d4, 0x18d1, 0x18ad, 0x20ae, 0x00f8, 0x18ad, 0x18ad, 0x08f7, 0x08f6, 0x18b1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20cd, 0x18ce, 0x20ae, 0x390f, 0xd375, 0xcb35, 0x414f, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x30ef, 0x3110, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f1, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3910, 0x3911, 0x38f1, 0x3911, 0x3912, 0x4952, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xd2b4, 0xd274, 0xca33, 0x4c9a, 0x05ff, 0x061f, 0x05ff, 0xa1f4, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa0f1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xa274, 0xc315, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca74, 0xca74, 0xca74, 0xca54, 0x20fd, 0x009f, 0x007f, 0x005f, 0x003f, 0x105d, 0xc0b1, 0xc0d1, 0x029f, 0x03bf, 0x04df, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x011a, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x10f4, 0x00f8, 0x18af, 0x18ad, 0x18ad, 0x08f7, 0x08f4, 0x10d5, 0x00f7, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f8, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18cd, 0x10d1, 0x10d3, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x08f8, 0x18ae, 0x18ad, 0x18af, 0x00fa, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x10d2, 0x011a, 0x0119, 0x00fa, 0x0119, 0x011a, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x61d0, 0xbb14, 0x412f, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28cf, 0x28f0, 0x30d0, 0x28ef, 0x28cf, 0x30cf, 0x30f0, 0x30d0, 0x30d0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x61b2, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xca74, 0xd233, 0xca13, 0x1d9d, 0x05ff, 0x05ff, 0x1d3d, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8a14, 0xaa74, 0xcaf4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xca94, 0xca73, 0xd274, 0xd253, 0xd254, 0x597a, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x005f, 0xa8b3, 0xc0b1, 0x31fc, 0x039f, 0x04df, 0x05df, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18b1, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x10d0, 0x10d1, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x18ae, 0x18ad, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x188d, 0x18ad, 0x18ae, 0x10d0, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x390f, 0x28ce, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x71f2, 0xd335, 0xd2f4, 0xd2b4, 0xca74, 0xd233, 0xca13, 0xa295, 0x05ff, 0x05ff, 0x05ff, 0x5399, 0xc0d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9a34, 0xc2b4, 0xd2b5, 0xd2b3, 0xcab4, 0xd294, 0xd294, 0xca93, 0xd274, 0xd274, 0xca53, 0xca54, 0xca53, 0x81d8, 0x00df, 0x00df, 0x00df, 0x00bf, 0x00bf, 0x68b7, 0xb8d1, 0x31dc, 0x033f, 0x049f, 0x05df, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26bd, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d2, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f7, 0x011a, 0x0119, 0x0118, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x011a, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x8213, 0xd2f5, 0xcad4, 0xd274, 0xca53, 0xc9f3, 0xc9d2, 0x7398, 0x05ff, 0x05ff, 0x05df, 0xa953, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x98f2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f0, 0x38f0, 0x38f0, 0x38f0, 0x3911, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xca94, 0xd294, 0xca94, 0xd274, 0xca74, 0xd274, 0xca53, 0xca54, 0xca53, 0xca34, 0x99f6, 0x011f, 0x011f, 0x00ff, 0x00ff, 0x00ff, 0x38db, 0xc0b1, 0x28fc, 0x02df, 0x047f, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x00f9, 0x011a, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd335, 0xd2b4, 0xca94, 0xca33, 0xd1f3, 0xc9d3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc932, 0xc0d1, 0xc0b1, 0xb8d1, 0xb0d2, 0xb9f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x015f, 0x013f, 0x013f, 0x013f, 0x011f, 0x093f, 0xc0b1, 0x311c, 0x01bf, 0x03ff, 0x059f, 0x069f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2f4, 0xca74, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc111, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xca53, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x097f, 0x017f, 0x015f, 0x017f, 0x015f, 0x015f, 0x88f5, 0x293c, 0x013f, 0x02df, 0x053e, 0x067f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9234, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18af, 0x18cd, 0x18ae, 0x10d0, 0x0118, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2b4, 0xd233, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0xb8d1, 0xc253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x31bc, 0x01bf, 0x019f, 0x019f, 0x019f, 0x019f, 0x5139, 0x315c, 0x017f, 0x01bf, 0x045e, 0x063e, 0x077f, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f7, 0x18ad, 0x20ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xcb15, 0xca13, 0xc9d3, 0xc992, 0xc932, 0xc911, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc397, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xc9f3, 0x31fc, 0x01df, 0x01df, 0x01df, 0x01df, 0x01df, 0x01bf, 0x01df, 0x01bf, 0x01bf, 0x02df, 0x05fd, 0x073e, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8ab5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08d5, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18b0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb0f1, 0xba95, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9f3, 0x31fd, 0x021f, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01df, 0x01ff, 0x051d, 0x071d, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6bf7, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f8, 0x18b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc9d3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb152, 0xd79e, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x323c, 0x023f, 0x023f, 0x021f, 0x023f, 0x023f, 0x021f, 0x021f, 0x021f, 0x021f, 0x021f, 0x037e, 0x06dc, 0x07fd, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0x7911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc972, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xd63c, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x325c, 0x027f, 0x025f, 0x025f, 0x025f, 0x023f, 0x025f, 0x025f, 0x023f, 0x023f, 0x023f, 0x029f, 0x067c, 0x07fc, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d1, 0x70f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x011a, 0x0118, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xc951, 0xc912, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xbb97, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, 0xc9b3, 0x327c, 0x029f, 0x029f, 0x029f, 0x029f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x025f, 0x027f, 0x05bc, 0x07db, 0x07fc, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x58f1, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ae, 0x18d0, 0x0118, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa8f1, 0xa972, 0xd77e, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc193, 0x0a7f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x027f, 0x029f, 0x027f, 0x04dd, 0x07bb, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0x5911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xa911, 0xbc78, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, 0x089f, 0x011f, 0x031f, 0x02ff, 0x02ff, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x03fd, 0x079a, 0x07fa, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x2e5c, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb8d1, 0x5912, 0x3911, 0x38f1, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d0, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x007f, 0x009e, 0x023f, 0x033f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02df, 0x039e, 0x075a, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x08f5, 0x00f9, 0x00fa, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0x009f, 0x009f, 0x013f, 0x033f, 0x037f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x033f, 0x06f9, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb0f1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0d1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x3110, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x10f2, 0x10d3, 0x08d3, 0x08f3, 0x10f3, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x08f5, 0x0119, 0x00f9, 0x011a, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, 0x007f, 0x007f, 0x00ff, 0x027f, 0x039f, 0x039f, 0x037f, 0x231d, 0x5259, 0x5a3a, 0x033f, 0x033f, 0x031f, 0x031f, 0x0699, 0x07f8, 0x07fa, 0x07fd, 0x07ff, 0x07ff, 0x363c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4112, 0x38f1, 0x3911, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f7, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0118, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0915, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x0915, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, 0x007f, 0x007f, 0x00bf, 0x021f, 0x2abd, 0x7a36, 0xb953, 0xc112, 0xc911, 0xc912, 0x0b3f, 0x035f, 0x035f, 0x033f, 0x05fa, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa0f1, 0x68f1, 0x4111, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0118, 0x08f7, 0x08f6, 0x00f7, 0x0118, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0118, 0x0119, 0x08f6, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, 0x007f, 0x007f, 0x30bb, 0x9955, 0xc931, 0xc932, 0xc932, 0xc912, 0xc0f2, 0xc8f2, 0x32fc, 0x037f, 0x037f, 0x037f, 0x059b, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d2, 0xb0d1, 0xb0f1, 0x98f1, 0xb0f1, 0x88f1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x00f7, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x00f7, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0x087e, 0x70f8, 0xc952, 0xc932, 0xc912, 0xc932, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0x331c, 0x03bf, 0x039f, 0x039f, 0x051b, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa0f1, 0xb0f1, 0xb0d1, 0x50f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0116, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x00fa, 0x0119, 0x08f6, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, 0x9915, 0xc932, 0xc932, 0xc932, 0xc912, 0xc111, 0xc8f2, 0xc0f2, 0xc8d1, 0xc8d1, 0x333c, 0x03ff, 0x03df, 0x03bf, 0x04dc, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d3, 0x0119, 0x0119, 0x10d1, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f1, 0xc8d1, 0xc8d1, 0xc8d1, 0x335c, 0x041f, 0x03ff, 0x03ff, 0x047d, 0x0795, 0x07f6, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0x40f0, 0x28cf, 0x28ef, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x00f8, 0x011a, 0x08f6, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x08d3, 0x08f3, 0x08f3, 0x18af, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x0118, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, 0x309c, 0x005f, 0x58b9, 0xc912, 0xc111, 0xc8f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x337c, 0x045f, 0x041f, 0x041f, 0x045e, 0x0775, 0x07f5, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0x80f1, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x011a, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, 0x003f, 0x003f, 0x005f, 0x78d7, 0xc0f2, 0xc8f1, 0xc0d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x4b1a, 0x047f, 0x045f, 0x043f, 0x045f, 0x0735, 0x07f4, 0x07f9, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa0f1, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d1, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d3, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x00f9, 0x08f6, 0x0119, 0x0119, 0x0119, 0x18af, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0x003f, 0x003f, 0x005f, 0x58b9, 0xc0f1, 0xc0d1, 0xc8d1, 0xc8b2, 0xc0b1, 0xc0b1, 0x62b8, 0x04bf, 0x047f, 0x047f, 0x045f, 0x0715, 0x07f4, 0x07f9, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa8f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0x58f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x20ad, 0x20cd, 0x18ae, 0x08f3, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d4, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0x001f, 0x003f, 0x003f, 0x00df, 0x88f6, 0xc8d1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0x62d9, 0x04ff, 0x04bf, 0x049f, 0x047f, 0x06b6, 0x07f3, 0x07f8, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0x98f2, 0xb0f1, 0xb0f1, 0xb0f1, 0x78f0, 0x90f1, 0x80d1, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x08f7, 0x0119, 0x011a, 0x08f4, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18cd, 0x08f3, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f5, 0x18cd, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f6, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, 0x001f, 0x003f, 0x003f, 0x00bf, 0x311c, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x6278, 0x053f, 0x04ff, 0x04bf, 0x049f, 0x0696, 0x07f2, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x8912, 0xb0f1, 0xb0f1, 0xb0d1, 0x48f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x208d, 0x08f3, 0x0119, 0x00f9, 0x18ae, 0x18ae, 0x18ce, 0x00f9, 0x0119, 0x08f3, 0x18ad, 0x20ae, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18cf, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0x003f, 0x003f, 0x003f, 0x00bf, 0x011f, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x79d6, 0x051f, 0x051f, 0x04ff, 0x04bf, 0x0638, 0x07f1, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0f1, 0x80f2, 0xb0f1, 0xb0f1, 0xb0f2, 0x3110, 0x30f0, 0x28cf, 0x28ef, 0x20ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x0119, 0x0119, 0x0118, 0x08f5, 0x00f8, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ce, 0x0117, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0x003f, 0x003f, 0x001f, 0x009f, 0x00df, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9174, 0x049f, 0x057f, 0x051f, 0x04ff, 0x0619, 0x07f1, 0x07f6, 0x07fc, 0x07ff, 0x35bb, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x6912, 0xb0f1, 0xb0f1, 0x98f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d3, 0x20ad, 0x18ad, 0x10d3, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x011a, 0x011a, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x18b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x00f9, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x0117, 0x00f7, 0x00f9, 0x0119, 0x08f5, 0x20ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00fa, 0x011a, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x68b7, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa8f3, 0x041f, 0x057f, 0x053f, 0x051f, 0x05f9, 0x07f0, 0x07f6, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x5912, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x00f8, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0117, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x08f3, 0x00f6, 0x08f3, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x0117, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18cd, 0x20ae, 0x10d3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0x001f, 0x001f, 0x001f, 0x007f, 0x00bf, 0x009f, 0x90b5, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x0b9e, 0x053f, 0x057f, 0x053f, 0x05da, 0x07ef, 0x07f5, 0x07fb, 0x07ff, 0x5478, 0xb0d1, 0xb0f1, 0xb0f1, 0x9111, 0x5912, 0xa8f1, 0xb0f1, 0x70f1, 0x30f0, 0x28ef, 0x20ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x08f7, 0x18ae, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x20ae, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x6098, 0xc0b1, 0xb8b1, 0xc0b1, 0xc0b1, 0x2afc, 0x04ff, 0x05bf, 0x055f, 0x05fb, 0x07cf, 0x07f4, 0x07fc, 0x07ff, 0x5c79, 0xb0f1, 0xb0f1, 0xb0f1, 0x8112, 0x5912, 0xb0f1, 0xb0f1, 0x68f1, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x10d3, 0x0119, 0x0119, 0x08d6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x20ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x005f, 0x7897, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0x6238, 0x04df, 0x05bf, 0x059f, 0x05fa, 0x07ce, 0x07f4, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x7112, 0x5912, 0xb0f1, 0xa8f1, 0x5110, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x28cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x08f6, 0x18d0, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f6, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x007f, 0x6878, 0xb8b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x9954, 0x047f, 0x05bf, 0x05bf, 0x061a, 0x07ce, 0x07f2, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x6112, 0x5912, 0xa8f1, 0xa8f1, 0x60f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0118, 0x00f6, 0x10d3, 0x08f6, 0x0118, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18b0, 0x00f8, 0x0139, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f8, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x003f, 0x001f, 0x7076, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x0bff, 0x05df, 0x05bf, 0x0639, 0x07cd, 0x07f2, 0x07fc, 0x07ff, 0x63f7, 0xb0f1, 0xb0f1, 0xb0f1, 0x4132, 0x4111, 0xa0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x001f, 0x001f, 0x9894, 0xb8d1, 0xb8d1, 0xb8d1, 0x42da, 0x059f, 0x05ff, 0x0678, 0x07cc, 0x07f1, 0x07fc, 0x07ff, 0x82b5, 0xa8f1, 0xb0f1, 0x98f2, 0x4132, 0x3912, 0x70f1, 0xa8f1, 0xa8f1, 0x50f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x10d4, 0x08f5, 0x08f6, 0x08f4, 0x08d3, 0x10cf, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x183e, 0xb0d2, 0xb8d1, 0xb8d1, 0x9974, 0x059f, 0x061f, 0x0698, 0x07cc, 0x07f0, 0x07fc, 0x07ff, 0x82b5, 0xb0f1, 0xb0f1, 0x88f1, 0x4132, 0x4111, 0x3910, 0x98f1, 0xa8f2, 0x88f1, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x385b, 0xb8d1, 0xb8d1, 0xb8d1, 0x2c3c, 0x061f, 0x06b7, 0x07cb, 0x07f0, 0x07fb, 0x07ff, 0xb0f1, 0xb0f1, 0xa8f1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xa0f1, 0xa8f1, 0x48ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x7096, 0xb8d1, 0xb8d1, 0x8a35, 0x063f, 0x06d6, 0x07ea, 0x07f1, 0x07fc, 0x07ff, 0xa8f1, 0xa8f1, 0xa8f1, 0x6132, 0x4132, 0x4111, 0x38f1, 0x3110, 0x48f0, 0xa8f1, 0x98f1, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x98b4, 0xb8d1, 0xb8d1, 0x3c9b, 0x06f5, 0x07e9, 0x07f1, 0x07fd, 0x26bd, 0xb0f1, 0xb0f2, 0xb0f1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30f0, 0x60f0, 0xa911, 0x70f0, 0x20ce, 0x20cf, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x083f, 0x70f7, 0xb8d1, 0xa952, 0x0e94, 0x07c9, 0x07f2, 0x07fd, 0x2e3c, 0xa8f1, 0xa8f1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x58f0, 0xa8f1, 0x40cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18b0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x00f9, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x003f, 0x00df, 0x59f8, 0xb8d1, 0x8291, 0x07c9, 0x07f2, 0x07fe, 0x455a, 0xb0f1, 0xa8f1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x50cf, 0x48ef, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x00f8, 0x0139, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x031f, 0x2d3b, 0x99b2, 0x454b, 0x07f3, 0x07fe, 0x5498, 0xb0f1, 0xa8f1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18cd, 0x10d1, 0x08f3, 0x08d3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x003f, 0x005f, 0x025f, 0x06fd, 0x0770, 0x0f88, 0x07f4, 0x07ff, 0x5478, 0xa8f1, 0xa8f1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x021f, 0x06fc, 0x078d, 0x07e7, 0x07f6, 0x07ff, 0x82b5, 0xa8f1, 0xa111, 0x4932, 0x4132, 0x4111, 0x38f1, 0x38f0, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x005f, 0x021f, 0x073b, 0x07ac, 0x07e7, 0x07f7, 0x07ff, 0x82b5, 0xa8f1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10f3, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x208d, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x10cf, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x023f, 0x073b, 0x07ab, 0x07e8, 0x07f9, 0x07ff, 0xa152, 0xa8f1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x20ad, 0x18ad, 0x20cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x005f, 0x007f, 0x009f, 0x023f, 0x0779, 0x07aa, 0x07e8, 0x07fb, 0x07ff, 0xa8f1, 0xa8f1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10d3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x0116, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdb0, 0xfdb0, 0xfdb1, 0xfdd1, 0xe4b2, 0xa911, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x02bf, 0x0778, 0x07c8, 0x07e9, 0x07fd, 0x173e, 0xa8f1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x08f4, 0x0119, 0x0119, 0x00f7, 0x08f6, 0x0119, 0x0119, 0x08f4, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfdef, 0xfdf0, 0xfdf0, 0xfdf0, 0xfdf1, 0xfdf1, 0xecb1, 0xa0f1, 0xa911, 0xa911, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x005f, 0x007f, 0x009f, 0x009f, 0x041f, 0x0797, 0x07c7, 0x07eb, 0x07fe, 0x2e5c, 0xa8f1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0118, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0f, 0xfe30, 0xfe30, 0xfe30, 0xfe31, 0xfe31, 0xdc32, 0xa111, 0xa911, 0xa111, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x043f, 0x0794, 0x07e6, 0x07ec, 0x07fe, 0x35db, 0xa911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x10d1, 0x10d3, 0x10f2, 0x10d1, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x00f8, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe50, 0xfe71, 0xfe51, 0xba52, 0xa111, 0xa111, 0x78d5, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x043f, 0x07b3, 0x07c5, 0x07ee, 0x07ff, 0x5478, 0x6ad6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f8, 0x18cf, 0x18ac, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe90, 0xfe91, 0xe471, 0xa111, 0xa112, 0xa111, 0x60d5, 0x001f, 0x283c, 0x7097, 0x405a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x00df, 0x045f, 0x07d2, 0x07e4, 0x07ef, 0x07ff, 0x2e3c, 0x2d1a, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x0119, 0x0118, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cc, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x18ae, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f7, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfeaf, 0xfed0, 0xfeb0, 0xfed1, 0xe491, 0xa911, 0xa111, 0x9931, 0xa111, 0x58d6, 0x88b5, 0xb8d1, 0xb8d1, 0x5059, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x00df, 0x047f, 0x07d2, 0x07e3, 0x07f1, 0x07ff, 0x07ff, 0x2cba, 0x4933, 0x4132, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x00f6, 0x18ad, 0x18ad, 0x18ac, 0x20ac, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ac, 0x18ad, 0x00f6, 0x0118, 0x0118, 0x18cf, 0x20ad, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x20ad, 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfed0, 0xfeb0, 0xfeb1, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x6933, 0xb0f1, 0xb0d1, 0xb0d1, 0x283c, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x011f, 0x047f, 0x07d1, 0x07e3, 0x07f3, 0x07ff, 0x07ff, 0x3b77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30ef, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x20ad, 0x0118, 0x0118, 0x20ad, 0x20ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x20ac, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, - 0x0118, 0x00f6, 0x18cd, 0x18ac, 0x18ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cc, 0x20ac, 0x18ad, 0x00f6, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cd, 0x18ac, 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfeb0, 0xfe90, 0xe471, 0xb8d2, 0xa111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xb0f1, 0xb0d1, 0xb0d2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x00df, 0x011f, 0x011f, 0x049f, 0x07f0, 0x07e2, 0x07f4, 0x07ff, 0x07ff, 0x3af6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ee, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x20ad, 0x18ad, 0x0118, 0x0118, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, - 0x00f8, 0x0118, 0x00f5, 0x18ad, 0x20ac, 0x18ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x18cd, 0x0116, 0x0118, 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfeb0, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xb0f1, 0xb0d1, 0x90b4, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x049f, 0x07f1, 0x07e2, 0x07f6, 0x07ff, 0x0f9f, 0x4a35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ad, 0x20ad, 0x0118, 0x0118, 0x18ce, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, - 0x18ce, 0x0117, 0x0118, 0x0115, 0x18ad, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ad, 0x00f6, 0x0118, 0x0117, 0x18ce, 0x18ac, 0x20cc, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x18cc, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xe471, 0xb0d1, 0xa111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xb0d1, 0xb0d1, 0x7896, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x00bf, 0x011f, 0x011f, 0x013f, 0x017f, 0x04bf, 0x07f2, 0x07e2, 0x07f5, 0x07ff, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x00f5, 0x0117, 0x00f7, 0x18ce, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20ac, 0x18ae, 0x0117, 0x0118, 0x08f5, 0x18ad, 0x18ac, 0x18cd, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x08f3, 0x0118, 0x0117, 0x18ce, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xa8f1, 0xa111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xb0d1, 0xb0d1, 0x5878, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00ff, 0x013f, 0x013f, 0x017f, 0x019f, 0x033f, 0x07f3, 0x07e2, 0x07f3, 0x07ff, 0xa8f1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ad, 0x20ac, 0x18ac, 0x18ad, 0x00f5, 0x0118, 0x0117, 0x18ce, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x18ac, 0x20ac, 0x18ce, 0x08f5, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0117, 0x00f7, 0x18ce, 0x20ac, 0x18cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xb0f1, 0xb0f1, 0x285c, 0x003f, 0x005f, 0x007f, 0x00bf, 0x00ff, 0x013f, 0x015f, 0x017f, 0x019f, 0x01bf, 0x02ff, 0x07f4, 0x07e3, 0x07f1, 0x2e5c, 0xa911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x18ad, 0x0115, 0x0118, 0x00f7, 0x18ae, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x10d0, 0x10d2, 0x08d2, 0x18ae, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, - 0x18ac, 0x20ac, 0x20ac, 0x18cd, 0x0116, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x18ce, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xb0f1, 0xb0d1, 0x087f, 0x009f, 0x00bf, 0x00df, 0x011f, 0x015f, 0x019f, 0x019f, 0x019f, 0x01df, 0x01df, 0x01ff, 0x07f7, 0x07e3, 0x07ef, 0x5498, 0xa8f1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x0117, 0x0117, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ad, 0x0115, 0x0117, 0x00f7, 0x18ae, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ad, 0x00f5, 0x0117, 0x0118, 0x0117, 0x0117, 0x08f3, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20cc, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, - 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xb0f1, 0x98f3, 0x00df, 0x00ff, 0x011f, 0x013f, 0x017f, 0x01bf, 0x01bf, 0x01df, 0x01df, 0x01ff, 0x01ff, 0x021f, 0x06d9, 0x07e5, 0x07ec, 0x7355, 0xa8f1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390f, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x0117, 0x00f7, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x00f5, 0x0117, 0x0116, 0x18cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x00f5, 0x0117, 0x0118, 0x08f5, 0x0116, 0x0117, 0x0117, 0x10f2, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ab, 0x20ac, 0x20ac, - 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xa111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xa8f1, 0xb0f1, 0x80f5, 0x013f, 0x017f, 0x019f, 0x01bf, 0x01df, 0x01ff, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x023f, 0x057d, 0x07e8, 0x07e9, 0x82d5, 0xa0f1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38f0, 0x38ef, 0x30ef, 0x30ee, 0x28ce, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x00f7, 0x0117, 0x10d0, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18cd, 0x00f5, 0x0117, 0x08f5, 0x18ad, 0x20ac, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ad, 0x0117, 0x0117, 0x10d0, 0x20ac, 0x20ac, 0x08f3, 0x0117, 0x0115, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20cc, - 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ad, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ce, 0x28ee, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ee, 0x38ef, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xa932, 0xa131, 0xb131, 0xc912, 0xc911, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0x5158, 0x01bf, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x021f, 0x023f, 0x025f, 0x025f, 0x025f, 0x025f, 0x041f, 0x07ed, 0x07e4, 0x7ab4, 0xa911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x10d0, 0x0117, 0x00f7, 0x10d0, 0x20ac, 0x20cc, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x00f5, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x20ac, 0x20ac, 0x20ac, 0x10ef, 0x0117, 0x0117, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, - 0x20ac, 0x18ac, 0x18ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ad, 0x28ce, 0x30ce, 0x30ce, 0x30ee, 0x8151, 0xb192, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d2, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x39bb, 0x021f, 0x023f, 0x025f, 0x027f, 0x027f, 0x025f, 0x025f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x029f, 0x07f3, 0x07e2, 0x9972, 0xa911, 0xa112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x08f2, 0x0117, 0x0116, 0x10d0, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ad, 0x00f4, 0x00f7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x10d1, 0x00f7, 0x0115, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, - 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18cc, 0x18ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x18ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30cd, 0x28ee, 0x30ee, 0x490e, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f2, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d2, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0x123e, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x02df, 0x06b9, 0x07e3, 0xa111, 0xa911, 0xa111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390f, 0x38ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x08d3, 0x0116, 0x0117, 0x10cf, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x18ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x00f4, 0x0117, 0x0116, 0x08f2, 0x08f2, 0x0117, 0x0116, 0x08f2, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, - 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x18ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30ed, 0x692f, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc8f1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x9933, 0x02df, 0x02df, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02ff, 0x051e, 0x07e8, 0xa912, 0xa111, 0xa111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410f, 0x390f, 0x38ee, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0117, 0x10d0, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x18cb, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x18ae, 0x0115, 0x0117, 0x0116, 0x0116, 0x0116, 0x00f4, 0x18cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x28ac, 0x20cc, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cd, 0x28ed, 0x28cd, 0x30cd, 0x9191, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc932, 0xc912, 0xc112, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8d1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88b4, 0x88b5, 0x88b5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x69d6, 0x033f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02ff, 0x035f, 0x03ff, 0x07f0, 0x8a4f, 0xa111, 0xa111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410f, 0x390f, 0x30ee, 0x30ee, 0x30cd, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0116, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20cc, 0x08d1, 0x08f3, 0x08f3, 0x10d0, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cc, 0x20ac, 0x28cc, 0x28cc, 0x28cc, 0x20cc, 0x28cc, 0x28cc, 0x28cd, 0x40ee, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0x90d5, 0x88d6, 0x6098, 0x5879, 0x303c, 0x305c, 0x081e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x291c, 0x411a, 0x6118, 0x8915, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0x429a, 0x039f, 0x039f, 0x035f, 0x035f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x031f, 0x031f, 0x031f, 0x037f, 0x03ff, 0x06d7, 0x7acf, 0xa111, 0xa111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410f, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0116, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x20ab, 0x20ab, 0x20ab, 0x20ab, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cc, 0x490e, 0xc1d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc952, 0x98f5, 0x60b8, 0x407b, 0x183e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x011f, 0x013f, 0x017f, 0x019f, 0x01df, 0x021f, 0x21fd, 0x49d9, 0x7996, 0xa112, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x139e, 0x03df, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x033f, 0x033f, 0x035f, 0x03bf, 0x041f, 0x05de, 0x7ad1, 0xa111, 0xa111, 0xa111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x18ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x692f, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc992, 0xc9b2, 0xc972, 0xb973, 0x80f7, 0x387b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01bf, 0x01ff, 0x023f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x2adc, 0x5a58, 0x8994, 0xa8f1, 0xa8f1, 0x81d4, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x039f, 0x037f, 0x035f, 0x037f, 0x039f, 0x03ff, 0x047f, 0x04ff, 0x6375, 0xa112, 0xa111, 0xa111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390f, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x692e, 0xc9f3, 0xc9d2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc993, 0x80f7, 0x389b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x083c, 0x085b, 0x105b, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187a, 0x105b, 0x085d, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x01bf, 0x01ff, 0x021f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03df, 0x041f, 0x043f, 0x0c3f, 0x2bbc, 0x0c3f, 0x045f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03bf, 0x039f, 0x037f, 0x039f, 0x03df, 0x043f, 0x04bf, 0x053f, 0x5398, 0xa111, 0xa111, 0xa111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x08f1, 0x0115, 0x0115, 0x10ce, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x1378, 0x1378, 0x1358, 0x1358, 0x1378, 0x1378, 0x1358, 0x1378, 0x1358, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cb, 0x614e, 0xd1f3, 0xc9f3, 0xc9d3, 0xc9b2, 0xc9b3, 0xb173, 0x60d9, 0x081e, 0x003d, 0x083b, 0x1878, 0x1877, 0x28d2, 0x28d2, 0x40ee, 0x38ee, 0x390f, 0x390f, 0x390f, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4130, 0x38f3, 0x28b6, 0x189a, 0x003e, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x027f, 0x029f, 0x02ff, 0x033f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x047f, 0x04bf, 0x04df, 0x04df, 0x04bf, 0x04bf, 0x047f, 0x047f, 0x043f, 0x043f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03df, 0x043f, 0x047f, 0x04df, 0x057f, 0x3c1a, 0xa111, 0xa111, 0xa111, 0xa111, 0x5931, 0x4910, 0x4110, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x3af9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3af9, 0x3af9, 0x3af9, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x20cb, 0x28ab, 0x692e, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xb1b2, 0x58f3, 0x1895, 0x28b2, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x492f, 0x4930, 0x4910, 0x38f3, 0x20b8, 0x087d, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x019f, 0x01df, 0x021f, 0x025f, 0x02bf, 0x02df, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x04ff, 0x051f, 0x051f, 0x053f, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x047f, 0x047f, 0x045f, 0x045f, 0x043f, 0x041f, 0x03ff, 0x03df, 0x03ff, 0x043f, 0x045f, 0x04bf, 0x053f, 0x05bf, 0x2cdc, 0xa112, 0xa111, 0xa111, 0xa111, 0x7131, 0x4930, 0x4130, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0114, 0x10ce, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x625a, 0x625b, 0x5a5a, 0x5a5a, 0x625b, 0x20ca, 0x20aa, 0x20aa, 0x20aa, - 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28cb, 0x28cb, 0x612e, 0xc9f3, 0xc9d3, 0xc9d3, 0xb992, 0x692e, 0x28cc, 0x28ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x390e, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x38ee, 0x40ee, 0x40ee, 0x390f, 0x390e, 0x410e, 0x40ef, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4910, 0x4910, 0x4930, 0x4113, 0x28f8, 0x08fe, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x029f, 0x02bf, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x051f, 0x053f, 0x057f, 0x059f, 0x057f, 0x055f, 0x053f, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x049f, 0x047f, 0x045f, 0x043f, 0x041f, 0x041f, 0x043f, 0x045f, 0x04bf, 0x04ff, 0x055f, 0x05df, 0x0e1f, 0xa111, 0xa111, 0xa111, 0xa112, 0x8931, 0x4930, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x0114, 0x10cf, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20cb, 0x10cf, 0x10ef, 0x10ef, 0x18ce, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x81db, 0x81dc, 0x81db, 0x81db, 0x81bc, 0x81bb, 0x81bc, 0x81dc, 0x81dc, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x20cb, 0x612e, 0xd1f3, 0xc9f3, 0xc1b2, 0x612e, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197a, 0x01de, 0x021f, 0x027f, 0x02bf, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03ff, 0x045f, 0x049f, 0x04df, 0x051f, 0x057f, 0x059f, 0x05df, 0x05df, 0x05df, 0x05bf, 0x059f, 0x055f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04bf, 0x047f, 0x045f, 0x043f, 0x043f, 0x047f, 0x04bf, 0x04ff, 0x053f, 0x05bf, 0x061f, 0x069f, 0x9972, 0xa111, 0xa111, 0xa111, 0xa111, 0x5130, 0x4910, 0x410f, 0x390f, 0x390e, 0x38ed, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x00f4, 0x18cc, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18cc, 0x00f3, 0x0115, 0x0114, 0x0115, 0x00f4, 0x00f2, 0x20cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0xa93d, 0xa93d, 0xa95c, 0xa93d, 0xa95c, 0xa95d, 0xa93c, 0xa95d, 0xa93d, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x510d, 0xd1f3, 0xc9d2, 0x816f, 0x30cc, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31b6, 0x0a9d, 0x02ff, 0x035f, 0x039f, 0x03ff, 0x043f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x05bf, 0x05df, 0x061f, 0x063f, 0x063f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x047f, 0x047f, 0x047f, 0x049f, 0x04df, 0x053f, 0x057f, 0x05ff, 0x065f, 0x06df, 0x7a95, 0xa111, 0xa111, 0xa111, 0xa111, 0x6911, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x08f1, 0x0114, 0x0114, 0x18cd, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x08f2, 0x0115, 0x0114, 0x0115, 0x0114, 0x0115, 0x0114, 0x10ef, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0xc8be, 0xd0be, 0xc8be, 0xc8be, 0xd0be, 0xc8be, 0xd0be, 0xd0be, 0xc8be, - 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x40ec, 0xc1d2, 0xc1b3, 0x490d, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39d5, 0x131c, 0x041f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x059f, 0x05df, 0x061f, 0x067f, 0x069f, 0x069f, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x051f, 0x057f, 0x05bf, 0x063f, 0x069f, 0x071f, 0x5438, 0xa111, 0xa111, 0xa111, 0xa111, 0x8111, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x00f4, 0x18cc, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x18cc, 0x00f5, 0x0115, 0x00f4, 0x0115, 0x0115, 0x0114, 0x0115, 0x00f4, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, - 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x30cb, 0xa992, 0xa9b1, 0x30cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3a15, 0x237b, 0x053f, 0x059f, 0x5358, 0x349b, 0x0e1f, 0x06bf, 0x06ff, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x057f, 0x055f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04ff, 0x051f, 0x055f, 0x059f, 0x05ff, 0x065f, 0x06df, 0x073f, 0x359b, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x4930, 0x4910, 0x412f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x00f3, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x0115, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ca, - 0x790f, 0x68ee, 0x50ed, 0x38cc, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x692f, 0x816f, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28cb, 0x28cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49d4, 0x243a, 0xa132, 0xa8f1, 0xa8f1, 0xa8f1, 0x8295, 0x8295, 0x5418, 0x351b, 0x06df, 0x069f, 0x067f, 0x065f, 0x063f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x051f, 0x053f, 0x057f, 0x059f, 0x05df, 0x063f, 0x069f, 0x06ff, 0x077f, 0x0f5f, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0x6911, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x18cb, 0x00f2, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x00f5, 0x0114, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, - 0x8130, 0x8930, 0x8930, 0x8910, 0x8930, 0x790f, 0x690e, 0x48cd, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ee, 0x38ed, 0x38ed, 0x390e, 0x390e, 0x390e, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa172, 0x4c39, 0x2d5c, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x059f, 0x057f, 0x055f, 0x055f, 0x055f, 0x057f, 0x059f, 0x05df, 0x061f, 0x067f, 0x06df, 0x073f, 0x079f, 0x07df, 0x8254, 0xa111, 0xa131, 0xa111, 0x9911, 0x8131, 0x4910, 0x410f, 0x410e, 0x38ee, 0x38ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x08f2, 0x00f5, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x10f0, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, - 0x8930, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8910, 0x8130, 0x710f, 0x60ee, 0x48ed, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xa111, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa111, 0xa911, 0xa0f1, 0x9972, 0x4419, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05df, 0x061f, 0x065f, 0x06bf, 0x06ff, 0x075f, 0x07bf, 0x07ff, 0x5498, 0xa131, 0xa111, 0xa111, 0xa111, 0x9911, 0x4930, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20cc, 0x00f3, 0x00f4, 0x0114, 0x0114, 0x0114, 0x08f2, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, - 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x58ed, 0x48cc, 0x30cb, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x28cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x490f, 0x412f, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa111, 0x7a55, 0x34bb, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x063f, 0x065f, 0x069f, 0x06df, 0x071f, 0x077f, 0x07bf, 0x07ff, 0x2e3c, 0x9911, 0xa111, 0xa111, 0x9931, 0x9931, 0x6910, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20cb, 0x10cf, 0x10d0, 0x10ef, 0x10ce, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, - 0x8910, 0x8910, 0x8910, 0x810f, 0x890f, 0x890f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x690f, 0x58ee, 0x40cd, 0x30cc, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x62f6, 0x347b, 0x061f, 0x061f, 0x063f, 0x063f, 0x065f, 0x067f, 0x06bf, 0x071f, 0x073f, 0x079f, 0x07df, 0x07ff, 0x07ff, 0xa111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x810f, 0x810f, 0x810f, 0x890f, 0x8910, 0x8910, 0x8110, 0x8110, 0x8110, 0x8110, 0x8910, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x810f, 0x710f, 0x50ed, 0x40cc, 0x28ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x349b, 0x065f, 0x067f, 0x069f, 0x06bf, 0x06ff, 0x073f, 0x077f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0xa111, 0x9911, 0xa111, 0x9931, 0x9931, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x8910, 0x8910, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x810f, 0x710f, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa911, 0xa112, 0xa111, 0xa911, 0xa111, 0xa112, 0xa0f1, 0xa111, 0xa111, 0xa111, 0x7a75, 0x15fd, 0x06bf, 0x06ff, 0x071f, 0x075f, 0x079f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410f, 0x390e, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x790f, 0x690e, 0x50ed, 0x38cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x40ee, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x5931, 0x90f1, 0xa911, 0xa912, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0x9972, 0x353b, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8130, 0x8930, 0x8930, 0x790f, 0x690e, 0x50ed, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x8111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa112, 0xa111, 0xa111, 0x4499, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9931, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490f, 0x410f, 0x38ee, 0x30ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x90ef, 0x88ef, 0x80ef, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x60ee, 0x48ed, 0x38ec, 0x20aa, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x28ab, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x310e, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x7131, 0xa111, 0xa111, 0xa112, 0xa111, 0xa0f1, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa131, 0x6397, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390f, 0x38ee, 0x38ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x990f, 0x990f, 0x910f, 0x910f, 0x890f, 0x88ef, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x710f, 0x58ee, 0x48ed, 0x30cb, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x38ee, 0x30ed, 0x38ed, 0x390e, 0x38ee, 0x410e, 0x410f, 0x410f, 0x4930, 0x4930, 0x6931, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x6397, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x5c14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410f, 0x390e, 0x390e, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x910f, 0x98ef, 0x910f, 0x910f, 0x98ef, 0x990f, 0x910f, 0x890f, 0x88ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x8110, 0x8910, 0x8910, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x58ed, 0x40ed, 0x30cb, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x30ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0x9931, 0x5498, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x35f5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510f, 0x390e, 0x390e, 0x38ed, 0x30ed, 0x30cc, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x890f, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x890f, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x890f, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x68ef, 0x50ed, 0x40cc, 0x28cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x28cb, 0x20cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xa111, 0xa111, 0xa111, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa111, 0xa111, 0x3d7a, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28ab, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x18aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x78ee, 0x78ee, 0x80ee, 0x80ee, 0x80ee, 0x78ee, 0x80ee, 0x80ee, 0x80ef, 0x80ef, 0x80ef, 0x80ee, 0x80ef, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x8910, 0x8110, 0x8130, 0x8910, 0x810f, 0x8110, 0x810f, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x8110, 0x690f, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28cb, 0x20ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x9192, 0x1ebd, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x7a71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20ab, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x208a, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, - 0x78ee, 0x78ee, 0x78ee, 0x78ee, 0x80ee, 0x78ee, 0x78ee, 0x80ee, 0x80ee, 0x80ef, 0x80ef, 0x80ee, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810e, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x8110, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x890f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8130, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8910, 0x8910, 0x8130, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8130, 0x8930, 0x710f, 0x690e, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20cb, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ac, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cc, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x28ce, 0x28ce, 0x28ce, 0x28ee, 0x28ce, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ef, 0x390f, 0x390f, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xa111, 0xa111, 0xa111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07ff, 0x07ff, 0x07fd, 0x07f6, 0x5c32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390f, 0x30ef, 0x30ef, 0x30ee, 0x30ce, 0x28cd, 0x28ee, 0x28ed, 0x28cd, 0x20cd, 0x20ac, 0x20cd, 0x20cd, 0x20ad, 0x20cd, 0x20ad, 0x20cc, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cd, 0x20ad, 0x18cc, 0x20cc, 0x20ac, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x18cc, 0x18cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ab, 0x18ab, 0x18ab, 0x18ac, 0x18ac, 0x18ac, 0x18ab, - 0x78d0, 0x78d0, 0x78d0, 0x78f0, 0x78f0, 0x78f1, 0x78f0, 0x78f0, 0x78f0, 0x78f1, 0x78f1, 0x80f0, 0x78f1, 0x78f0, 0x80f1, 0x80d1, 0x80f1, 0x80f1, 0x80f1, 0x80f1, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8111, 0x8111, 0x8111, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8911, 0x8110, 0x8110, 0x8111, 0x8110, 0x8911, 0x8911, 0x8911, 0x8111, 0x8911, 0x8911, 0x8910, 0x8911, 0x8911, 0x8911, 0x8911, 0x8111, 0x8131, 0x8131, 0x8931, 0x8911, 0x8911, 0x8911, 0x8911, 0x8931, 0x8911, 0x8131, 0x8131, 0x8931, 0x8130, 0x8131, 0x8911, 0x8931, 0x7931, 0x6111, 0x4911, 0x30d2, 0x18f2, 0x10f2, 0x18d2, 0x18d2, 0x10f2, 0x18d2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x20f2, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xa111, 0xa111, 0x9931, 0x9911, 0xa111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5c38, 0x07ff, 0x07fd, 0x07f6, 0x44f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x1912, 0x18f2, 0x20f3, 0x18f2, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x10d2, 0x10d2, 0x10d2, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10b1, 0x10b1, 0x10b1, 0x10b1, 0x10d0, 0x10b0, 0x10d0, 0x10b0, 0x10b0, 0x10d0, 0x10b0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, - 0x0051, 0x0071, 0x0071, 0x0071, 0x0071, 0x0051, 0x0071, 0x0070, 0x0870, 0x0870, 0x0071, 0x0071, 0x0091, 0x0870, 0x0071, 0x0091, 0x0071, 0x0871, 0x0871, 0x0891, 0x0871, 0x0871, 0x0871, 0x0871, 0x0891, 0x0891, 0x0891, 0x0891, 0x0871, 0x0871, 0x0871, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0891, 0x0891, 0x0891, 0x0892, 0x0891, 0x0891, 0x08b1, 0x08b1, 0x08b1, 0x08b2, 0x10b2, 0x08b1, 0x08b2, 0x08b1, 0x08b2, 0x08b2, 0x08b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x08b2, 0x10b2, 0x10b2, 0x08b2, 0x08b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10d2, 0x10d2, 0x10d2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x18d2, 0x18d2, 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28f3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xa111, 0xa112, 0xa111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2e5c, 0x07fc, 0x07f6, 0x2e53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20f3, 0x2112, 0x20f3, 0x20d3, 0x1912, 0x18f2, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x10f2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d1, 0x10d1, 0x10d2, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x08b0, 0x10b0, 0x10b0, 0x08b0, 0x08b0, 0x10b0, 0x10d0, 0x08d0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, - 0x0cdc, 0x0cdc, 0x0cdb, 0x0cdc, 0x0cfb, 0x0cdc, 0x14dc, 0x14fc, 0x0cdc, 0x14fc, 0x14dc, 0x0cfc, 0x0cfc, 0x14fc, 0x0cfc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x153c, 0x153c, 0x153c, 0x153c, 0x151c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x155c, 0x153c, 0x153c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x155c, 0x155c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x157c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x365e, 0x2e5d, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3d, 0x363d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x361d, 0x361d, 0x361d, 0x361d, 0x361d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1e, 0x461e, 0x461d, 0x4dfe, 0x4dfd, 0x4e3e, 0x4dfe, 0x55dd, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7a74, 0x07fb, 0x07f6, 0x07f6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4cfb, 0x3dfe, 0x35dd, 0x35dd, 0x2ddd, 0x2ddd, 0x2ddd, 0x2ddd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25dc, 0x25bd, 0x25bd, 0x25bd, 0x1dbd, 0x25bc, 0x1dbd, 0x1dbd, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9c, 0x1d9c, 0x1dbc, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9c, 0x1d9d, 0x1d9c, 0x1d7c, 0x1d7c, 0x1d7d, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x157c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x155c, 0x155c, 0x1d5c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151b, 0x151b, 0x151b, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, - 0x0bfb, 0x0bfb, 0x0bfb, 0x0bfb, 0x0bfb, 0x0c1b, 0x0c1b, 0x0c1b, 0x0c1b, 0x141b, 0x141b, 0x145b, 0x14dc, 0x0cdb, 0x14bc, 0x143b, 0x141b, 0x0c1b, 0x0c1b, 0x141c, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143c, 0x143b, 0x145b, 0x151c, 0x0d1b, 0x151c, 0x145b, 0x143b, 0x145c, 0x143b, 0x145c, 0x1c5b, 0x143b, 0x145c, 0x145c, 0x145c, 0x145c, 0x145c, 0x145b, 0x145c, 0x145b, 0x145b, 0x1c5c, 0x145c, 0x147c, 0x147c, 0x147c, 0x145c, 0x1c7c, 0x1c5c, 0x147c, 0x147c, 0x1c7c, 0x1cdc, 0x1d5c, 0x155c, 0x1cbc, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2ddd, 0x2d5d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2dbd, 0x2dbd, 0x2cfd, 0x2d1d, 0x251c, 0x251c, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3d1d, 0x451d, 0x451d, 0x451d, 0x4d1d, 0x4d1d, 0x553d, 0x91b3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa112, 0x9931, 0x9931, 0x5496, 0x07f7, 0x07f7, 0x8a13, 0xa111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34dd, 0x34dd, 0x2cdd, 0x2cdc, 0x2cdd, 0x2cbc, 0x24dc, 0x24bc, 0x24bc, 0x253c, 0x25bd, 0x253c, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c7c, 0x1c9c, 0x1cdc, 0x1d7c, 0x1d5c, 0x1c9c, 0x1c9c, 0x1c7b, 0x1c7c, 0x1c9c, 0x1c7b, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c7c, 0x1c9c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x147c, 0x147c, 0x147c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c5c, 0x1c9c, 0x153c, 0x155c, 0x14bc, 0x145b, 0x145b, 0x1c5c, 0x147b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145c, 0x145c, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x151c, 0x14fb, 0x14fc, 0x145b, 0x143b, 0x143b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, - 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5a, 0x0a7a, 0x0a5a, 0x0afa, 0x0c1b, 0x0cbb, 0x0c9b, 0x0b9b, 0x0a9a, 0x125a, 0x0a7a, 0x0a7a, 0x0a7a, 0x0a7a, 0x127a, 0x127a, 0x0a7a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x129a, 0x129a, 0x129a, 0x133b, 0x145b, 0x0d1c, 0x149c, 0x131b, 0x129b, 0x129b, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129b, 0x129a, 0x129b, 0x129b, 0x129b, 0x129b, 0x129b, 0x129b, 0x129a, 0x129b, 0x1abb, 0x129b, 0x131b, 0x147c, 0x153b, 0x145c, 0x12fb, 0x1abb, 0x12ba, 0x1abb, 0x1abb, 0x12bb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b7c, 0x259d, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x245d, 0x259c, 0x22fc, 0x2afc, 0x231c, 0x2afc, 0x22fc, 0x231c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2afc, 0x2b1c, 0x2b1c, 0x2b1c, 0x331c, 0x331c, 0x331c, 0x331c, 0x331c, 0x3b1c, 0x3b3d, 0x3b3d, 0x3b3d, 0x433c, 0x433d, 0x4b3d, 0x435d, 0x5a9a, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07f9, 0x72d4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331c, 0x32fc, 0x2afb, 0x2afc, 0x2afb, 0x22fb, 0x22dc, 0x22dc, 0x22fb, 0x22db, 0x22db, 0x235c, 0x1d5c, 0x1d1d, 0x231b, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1bfc, 0x1d5c, 0x14dc, 0x1b3b, 0x1abb, 0x1adb, 0x1abb, 0x1abb, 0x12db, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x129b, 0x12bb, 0x129a, 0x12ba, 0x129a, 0x12db, 0x143b, 0x151b, 0x14bb, 0x1afb, 0x12ba, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x127a, 0x127a, 0x127a, 0x131b, 0x147c, 0x14db, 0x145b, 0x131a, 0x127a, 0x127a, 0x127a, 0x127a, - 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b5a, 0x0c1b, 0x0c9b, 0x0c9b, 0x0bba, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3b, 0x0b3a, 0x0b3a, 0x0b3b, 0x133b, 0x0b3b, 0x0b3b, 0x0b3b, 0x133a, 0x0b3a, 0x0c3b, 0x14dc, 0x14bc, 0x13fb, 0x0b3a, 0x133b, 0x133b, 0x133b, 0x135b, 0x0b5b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x135b, 0x0b5a, 0x135b, 0x135b, 0x135b, 0x135b, 0x0b5b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x13fb, 0x151c, 0x14fc, 0x13db, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x243c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x259c, 0x247c, 0x23bc, 0x23bc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23bc, 0x23bc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x33dc, 0x33dc, 0x33dc, 0x33dc, 0x3bdc, 0x3bfc, 0x3bfc, 0x3bdc, 0x43fc, 0x43fd, 0x6b18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6b53, 0x07fa, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbb, 0x23bb, 0x23bb, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bdb, 0x1d5c, 0x1d1c, 0x1b9b, 0x1b9b, 0x139b, 0x139c, 0x1b9b, 0x1b7b, 0x1b7b, 0x139b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b9b, 0x139b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b9b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x151c, 0x151c, 0x13db, 0x137b, 0x137b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x13da, 0x14fb, 0x0cfb, 0x141b, 0x133a, 0x135b, 0x133b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x0b5b, 0x133b, 0x133a, 0x0b3a, 0x133a, 0x133a, 0x0b3b, 0x0b3b, 0x0b3b, 0x0b3a, 0x133a, 0x0b1a, 0x0b3b, 0x0b3a, 0x0bda, 0x14bb, 0x0cbb, 0x0c1b, 0x0b3a, 0x0b3b, 0x0b3a, - 0x0bdb, 0x0c7b, 0x0c7b, 0x0c1a, 0x0b3a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c1b, 0x0cbb, 0x0c9b, 0x0bbb, 0x0b5a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x0b3a, 0x133b, 0x0b3a, 0x133a, 0x0b3a, 0x133a, 0x0b3a, 0x135a, 0x133a, 0x133b, 0x133a, 0x133b, 0x0b3a, 0x0c7b, 0x0cfb, 0x147b, 0x137b, 0x0b5b, 0x0b5b, 0x135a, 0x135a, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1b9c, 0x1bdc, 0x1bbb, 0x1c5b, 0x1cfb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1d3c, 0x1cbc, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9c, 0x1b9c, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9c, 0x1b9b, 0x1bbb, 0x239b, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbc, 0x33bc, 0x33bc, 0x33dc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4c98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4b19, 0x23bc, 0x239b, 0x239b, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x14bb, 0x151b, 0x13db, 0x137b, 0x137a, 0x137b, 0x137b, 0x137a, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x135a, 0x13bb, 0x14db, 0x14bb, 0x137b, 0x135a, 0x135b, 0x0b5a, 0x135b, 0x135b, 0x135a, 0x0b5a, 0x135a, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x0b5a, 0x0b5a, 0x135a, 0x133a, 0x135a, 0x133a, 0x0b3a, 0x133b, 0x133a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0c5b, 0x0cbb, 0x0c5b, 0x0b7a, 0x0b3a, 0x0b3b, 0x0b1a, 0x133b, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b9a, 0x0c9b, 0x0c9b, - 0x0bda, 0x02f9, 0x01f9, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0178, 0x0178, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0178, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a1a, 0x0b1a, 0x0c3a, 0x0c1b, 0x0ada, 0x09f9, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x09f9, 0x0b1a, 0x0c7b, 0x0c1b, 0x0aba, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19da, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19db, 0x19da, 0x19db, 0x19fb, 0x153c, 0x123a, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x11db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x19db, 0x19ba, 0x11da, 0x11ba, 0x1abb, 0x14fb, 0x1a5b, 0x19ba, 0x19ba, 0x11da, 0x11da, 0x19db, 0x19db, 0x19da, 0x19db, 0x19ba, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x21db, 0x21db, 0x21db, 0x21fb, 0x21fb, 0x29fb, 0x29fb, 0x29fb, 0x29fb, 0x31fb, 0x321b, 0x31fb, 0x321b, 0x41fa, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72d4, 0x4c98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21db, 0x21da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11d9, 0x137a, 0x149b, 0x131a, 0x11ba, 0x119a, 0x11b9, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x0999, 0x1199, 0x1199, 0x1199, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x0999, 0x09b9, 0x0999, 0x0a1a, 0x0bfb, 0x0c9b, 0x131a, 0x09da, 0x119a, 0x0999, 0x0999, 0x0999, 0x1199, 0x099a, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0aba, 0x0bda, 0x0c5b, 0x0b3a, 0x09f9, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0979, 0x0979, 0x0979, 0x0999, 0x0979, 0x0999, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0178, 0x0199, 0x0179, 0x0979, 0x0999, 0x02b9, - 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02d9, 0x02d9, 0x02b9, 0x0ab9, 0x0ad9, 0x02d9, 0x0ad9, 0x0ab9, 0x0ab9, 0x03ba, 0x043a, 0x043a, 0x0359, 0x02d9, 0x0ad9, 0x02d9, 0x0ad9, 0x02d9, 0x02d9, 0x0ad9, 0x0ad9, 0x0ad9, 0x02d9, 0x0ad9, 0x02d9, 0x02d9, 0x0ada, 0x0afa, 0x02fa, 0x02fa, 0x02d9, 0x02fa, 0x0ada, 0x0afa, 0x02fa, 0x0afa, 0x0afa, 0x0ad9, 0x0afa, 0x0ada, 0x0afa, 0x0b5a, 0x0c5b, 0x047a, 0x0bba, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133a, 0x135b, 0x135a, 0x135b, 0x135b, 0x149b, 0x13fb, 0x133a, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x133a, 0x135a, 0x133a, 0x143b, 0x147b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133a, 0x135b, 0x133b, 0x133b, 0x1b3b, 0x1b5b, 0x1b5b, 0x1b3b, 0x1b5b, 0x235b, 0x235b, 0x235b, 0x235b, 0x2b5b, 0x2b5b, 0x2b7b, 0x2b7b, 0x335b, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72d5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71b4, 0x1b3b, 0x1b3b, 0x133a, 0x133b, 0x133a, 0x131a, 0x131a, 0x131a, 0x131a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0afa, 0x0b1a, 0x0afa, 0x0bda, 0x0cbb, 0x0bda, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0bba, 0x049b, 0x0c3a, 0x0b3a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x0ada, 0x0ada, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02da, 0x0ada, 0x0ada, 0x0ada, 0x02d9, 0x02d9, 0x02da, 0x02fa, 0x02d9, 0x0ad9, 0x0ad9, 0x0b5a, 0x045a, 0x045a, 0x033a, 0x0ad9, 0x02d9, 0x02d9, 0x02da, 0x0ada, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ab9, 0x0ab9, 0x02d9, 0x02d9, 0x0ab9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ab9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x0ab9, - 0x0299, 0x0299, 0x0298, 0x0298, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02b8, 0x02b9, 0x0299, 0x02b8, 0x039a, 0x041a, 0x03fa, 0x0339, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x03ba, 0x043a, 0x03fa, 0x02f9, 0x02d9, 0x02d9, 0x0ab9, 0x0ab9, 0x02d9, 0x02b9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ad9, 0x0ad9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b7a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bda, 0x0c7b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x131a, 0x131a, 0x131a, 0x131a, 0x131a, 0x1b1a, 0x1b3a, 0x1b3a, 0x1b3a, 0x1b3a, 0x233a, 0x233a, 0x233b, 0x2b3b, 0x2b5b, 0x3ad9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1b1a, 0x131a, 0x131a, 0x12fa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x035a, 0x045a, 0x0c3a, 0x0afa, 0x02da, 0x0afa, 0x0af9, 0x02f9, 0x0afa, 0x0afa, 0x0afa, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ad9, 0x02d9, 0x02da, 0x0ad9, 0x0ad9, 0x02ba, 0x02d9, 0x039a, 0x043a, 0x03da, 0x02d9, 0x0ab9, 0x02d9, 0x0ab9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x03fa, 0x041a, 0x03b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02b8, 0x02b8, - 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0198, 0x02b8, 0x0399, 0x0359, 0x0258, 0x0198, 0x0137, 0x0137, 0x0117, 0x0158, 0x0137, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0158, 0x0259, 0x0399, 0x0399, 0x0258, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0158, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0bfa, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0bda, 0x02d9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199a, 0x1999, 0x2199, 0x219a, 0x21ba, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01d8, 0x0399, 0x0399, 0x01d9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0157, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0218, 0x0379, 0x03b9, 0x0258, 0x0158, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0137, 0x0238, 0x0359, 0x0399, 0x0298, 0x0178, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, - 0x0116, 0x0116, 0x0116, 0x00f7, 0x00f6, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0238, 0x0318, 0x0379, 0x0297, 0x0197, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0177, 0x02d8, 0x0399, 0x0318, 0x01d7, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02b9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01d8, 0x03f9, 0x01f8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03f9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0138, 0x0117, 0x0137, 0x0238, 0x0379, 0x0379, 0x0238, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0136, 0x0117, 0x0117, 0x0117, 0x0136, 0x0137, 0x01b7, 0x02b8, 0x0399, 0x02b8, 0x0197, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x0116, 0x00f6, 0x0116, 0x01b7, 0x02b7, 0x0378, 0x02b7, 0x01d6, 0x0116, 0x00f7, 0x00f6, 0x0116, 0x00f6, 0x0116, 0x0116, 0x00f6, 0x00f6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0136, 0x0197, 0x02f8, 0x0378, 0x0297, 0x0177, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0116, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03f9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03b9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01b7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x00f7, 0x0217, 0x0339, 0x02f8, 0x0197, 0x0136, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0156, 0x0237, 0x0358, 0x02d8, 0x01f7, 0x0116, 0x00f6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x00f6, 0x00f6, 0x0116, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x0116, - 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x02b7, 0x0297, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x0318, 0x0357, 0x0338, 0x02d7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b8, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b8, 0x02b8, 0x02b7, 0x0317, 0x0358, 0x0338, 0x02f7, 0x02d7, 0x02b7, 0x02b7, 0x02b7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0af8, 0x0af8, 0x0af8, 0x0af8, 0x0b18, 0x0b18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1b18, 0x2af8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0af8, 0x0af8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x0378, 0x0378, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02b7, 0x02d7, 0x02d7, 0x02d7, 0x02b7, 0x02b7, 0x02f7, 0x0358, 0x0358, 0x02f7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02d7, 0x0338, 0x0357, 0x02f7, 0x0297, 0x0297, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x0297, 0x0297, 0x0297, 0x02b7, 0x0297, 0x0297, 0x02b7, 0x0297, - 0x0175, 0x0155, 0x0155, 0x0156, 0x0175, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x01b6, 0x0257, 0x02f7, 0x02d7, 0x0216, 0x0176, 0x0155, 0x0175, 0x0156, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0176, 0x0155, 0x0176, 0x0176, 0x0176, 0x0175, 0x0176, 0x0175, 0x0156, 0x0176, 0x0176, 0x0176, 0x0155, 0x01b6, 0x0296, 0x0337, 0x0296, 0x01d6, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0196, 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01f7, 0x0358, 0x0196, 0x0196, 0x01b6, 0x0196, 0x01b6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02f7, 0x02f7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01b6, 0x01b6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09b7, 0x0997, 0x09b7, 0x09b7, 0x09b7, 0x11b7, 0x11b7, 0x11d7, 0x11b7, 0x11b7, 0x11b7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09b6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02b7, 0x0337, 0x0216, 0x0196, 0x0196, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0196, 0x0195, 0x0216, 0x02f7, 0x0317, 0x0216, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0175, 0x0176, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0175, 0x0155, 0x0196, 0x0256, 0x0317, 0x02b7, 0x01b6, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0155, 0x0155, 0x0175, 0x0155, 0x0155, 0x0155, - 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b4, 0x00d3, 0x00d3, 0x00b4, 0x00d4, 0x0174, 0x0235, 0x02d6, 0x0235, 0x0174, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x0135, 0x0235, 0x02d6, 0x0236, 0x0134, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d4, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x0115, 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f5, 0x00d5, 0x00d5, 0x00d6, 0x00d6, 0x00d5, 0x00f5, 0x02f7, 0x0176, 0x00f5, 0x00d5, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x0116, 0x02f7, 0x01d6, 0x00d6, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x08f6, 0x08f6, 0x08f6, 0x08f6, 0x0916, 0x0916, 0x10f6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08f5, 0x08f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x01d6, 0x02f7, 0x0236, 0x0114, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00f4, 0x01d5, 0x02d6, 0x0236, 0x0114, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x0114, 0x01f5, 0x02b5, 0x0235, 0x0154, 0x00d3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, - 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x01d3, 0x0253, 0x0234, 0x0173, 0x00d2, 0x0092, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b2, 0x0153, 0x0234, 0x0274, 0x01b3, 0x00f3, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x01b4, 0x02b5, 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01f5, 0x0235, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x0154, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x08d4, 0x08d4, 0x08d4, 0x08f4, 0x08f4, 0x08f4, 0x08f5, 0x10f4, 0x10d5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00d3, 0x00d3, 0x0214, 0x0295, 0x0153, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00d2, 0x01b3, 0x0274, 0x01d3, 0x00f2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0092, 0x00b2, 0x00b1, 0x0172, 0x0253, 0x0233, 0x0152, 0x00b1, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, - 0x0090, 0x0090, 0x0090, 0x00b0, 0x0151, 0x0212, 0x0232, 0x0191, 0x00f0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0090, 0x0091, 0x00b1, 0x0171, 0x0232, 0x0213, 0x0151, 0x0090, 0x00b0, 0x0090, 0x0091, 0x00b1, 0x00b0, 0x0090, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x00d1, 0x0172, 0x0253, 0x01b2, 0x00d1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x0293, 0x00d2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0172, 0x0253, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x08b2, 0x08b2, 0x08b2, 0x08d2, 0x08b2, 0x08d2, 0x08d3, 0x10d3, 0x40f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00d2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0131, 0x0252, 0x01f2, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00b1, 0x0091, 0x0091, 0x00b0, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0090, 0x00b0, 0x0091, 0x00b0, 0x01b2, 0x0252, 0x01b1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x01d1, 0x0232, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x008f, 0x0130, 0x01b1, 0x0232, 0x01b1, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0191, 0x0232, 0x01d1, 0x00f0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0171, 0x0232, 0x01d1, 0x00f1, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x0171, 0x0091, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x01d1, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01b1, 0x0252, 0x0131, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01b1, 0x0232, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0252, 0x01b1, 0x0110, 0x0090, 0x0090, 0x0090, - 0x0212, 0x01f1, 0x0150, 0x00af, 0x008f, 0x008f, 0x006f, 0x0090, 0x0090, 0x0070, 0x006f, 0x006f, 0x008f, 0x008f, 0x0070, 0x0070, 0x006f, 0x008f, 0x006f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x006f, 0x008f, 0x008f, 0x008f, 0x0130, 0x01d1, 0x0212, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x0151, 0x0211, 0x01d1, 0x00f0, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f1, 0x0171, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00b0, 0x00b0, 0x00b1, 0x08b1, 0x08b0, 0x08b1, 0x08b1, 0x50f1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f1, 0x0211, 0x01d2, 0x00d0, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x00b0, 0x01b1, 0x0232, 0x0151, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x008f, 0x00b0, 0x0151, 0x0211, 0x0212, 0x0130, 0x00af, - 0x00cf, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00af, 0x0130, 0x01f2, 0x0212, 0x0131, 0x00af, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x0090, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0130, 0x0212, 0x01f2, 0x00f0, 0x0070, 0x008f, 0x006f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00f0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f0, 0x0232, 0x00f1, 0x00b0, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0890, 0x08b0, 0x0891, 0x10b0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0191, 0x0212, 0x0150, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x006f, 0x008f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x00d0, 0x01d2, 0x0212, 0x0150, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x0110, 0x01d1, 0x0212, - 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x00af, 0x0171, 0x0212, 0x01d1, 0x0110, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x0110, 0x01f2, 0x0212, 0x0130, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0191, 0x01b1, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x006f, 0x008f, 0x0131, 0x0232, 0x00d0, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60f1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006f, 0x0090, 0x006f, 0x008f, 0x008f, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x01f2, 0x01d1, 0x00cf, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x00f0, 0x01b2, 0x0232, 0x0150, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00f0, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x00ef, 0x01b1, 0x0212, 0x0191, 0x00d0, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x00ef, 0x01d1, 0x01f1, 0x0130, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00cf, 0x0232, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x0191, 0x0212, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x18af, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9931, 0xa111, 0x29d2, 0x01b1, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0150, 0x0232, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00f0, 0x01d1, 0x01f1, 0x0130, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006e, 0x008f, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x0130, 0x01d1, 0x0212, 0x0150, 0x00af, 0x006e, 0x006e, 0x008e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x006f, 0x00cf, 0x01b1, 0x0212, 0x0130, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x01d1, 0x0130, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x01f1, 0x01b1, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28d0, 0x01f2, 0x01d1, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x00cf, 0x01f1, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006f, 0x006e, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x00f0, 0x01d1, 0x01f1, 0x0110, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0150, 0x0212, 0x01d1, 0x0110, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0212, 0x0150, 0x008f, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0110, 0x01f1, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x0110, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x48d0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008e, 0x008f, 0x01b1, 0x01f2, 0x00af, 0x006f, 0x006e, 0x008f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x0232, 0x0150, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x0110, 0x01f1, 0x01f1, 0x0110, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0190, 0x0212, 0x0190, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0170, 0x0212, 0x0150, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x108f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006e, 0x006f, 0x006e, 0x0190, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01b1, 0x01f2, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x01f1, 0x01b1, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x00ef, 0x01b1, 0x01f1, 0x0150, 0x008f, 0x006e, 0x006e, 0x004e, 0x004e, 0x004e, 0x004e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0170, 0x0212, 0x0171, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0170, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01f1, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x68f0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x0130, 0x01f2, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x01d1, 0x01b1, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, - 0x006e, 0x006d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x0130, 0x01d1, 0x01d1, 0x010f, 0x006e, 0x006d, 0x006d, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006d, 0x006e, 0x006e, 0x0170, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0211, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01b1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x38b0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x010f, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01d1, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006d, 0x004d, 0x008e, 0x0150, 0x01f1, 0x01b1, 0x00cf, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006d, - 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x008e, 0x0170, 0x01f1, 0x01b1, 0x00ef, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x012f, 0x01f1, 0x0170, 0x008e, 0x006d, 0x006d, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x01d1, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x008e, 0x01f1, 0x012f, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x086e, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0211, 0x0190, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004d, 0x00ef, 0x01f2, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x012f, 0x01f1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x004d, 0x006d, 0x006d, - 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x00ce, 0x0190, 0x0211, 0x0170, 0x008e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x0150, 0x01f1, 0x01b1, 0x00ce, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004d, 0x004d, 0x004e, 0x010f, 0x01d1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x00ce, 0x0212, 0x00ce, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x70f0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x008e, 0x01d1, 0x0190, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x0171, 0x01f2, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008e, 0x012f, 0x01f1, 0x0170, 0x008e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x00ef, 0x01d1, 0x01d1, 0x012f, 0x008d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x00ef, 0x01f1, 0x01b0, 0x00ce, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006e, 0x01f1, 0x008e, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x010f, 0x01f1, 0x006d, 0x006d, 0x004d, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004e, 0x006d, 0x006d, 0x004d, 0x40cf, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70f0, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0191, 0x01b1, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x00ee, 0x01f1, 0x0190, 0x008e, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0150, 0x0212, 0x0170, 0x008e, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x0211, 0x0211, 0x0212, 0x01f2, 0x0212, 0x01f2, 0x01f1, 0x0211, 0x0211, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0211, 0x0211, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0232, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x11f1, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x5991, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0212, 0x0211, 0x0212, 0x0212, 0x01f2, 0x0212, 0x0211, 0x01f1, 0x0211, 0x0211, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, - 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x00ae, 0x0170, 0x01f1, 0x0170, 0x00ce, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x00ef, 0x01d1, 0x01d1, 0x00ee, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x012f, 0x0212, 0x012f, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x01b1, 0x01d1, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x00ae, 0x0212, 0x00ae, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x0150, 0x014f, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x0212, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x00ae, 0x01f1, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01b1, 0x0150, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x88f0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9911, 0x9931, 0x40af, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010f, 0x0212, 0x00ae, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004c, 0x006d, 0x00ce, 0x01d1, 0x0190, 0x008e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0170, 0x01f1, 0x012f, 0x006d, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004c, 0x004c, 0x004c, 0x00ee, 0x0190, 0x01d1, 0x012f, 0x008d, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x00ae, 0x0190, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x00ae, 0x01b1, 0x01b1, 0x008d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x008d, 0x01b1, 0x0170, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x01d1, 0x010f, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01f1, 0x008e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x0212, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01d1, 0x00ee, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008d, 0x01f1, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x50cf, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa111, 0x186e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x00ef, 0x01f1, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x006d, 0x0150, 0x01f1, 0x010f, 0x004d, 0x004c, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x008e, 0x0190, 0x01d1, 0x012f, 0x006d, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x006d, 0x010f, 0x01b1, 0x01d1, 0x00ee, 0x006d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x0190, 0x01d1, 0x00ee, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x01f1, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x008e, 0x01f1, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x006d, 0x0170, 0x0190, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010f, 0x01d1, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x0212, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010e, 0x01b0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01f1, 0x00ad, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x308e, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9111, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01f1, 0x012f, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008d, 0x01b0, 0x01b1, 0x008d, 0x004d, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00cd, 0x0191, 0x01d1, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x01d1, 0x0170, 0x00ae, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0190, 0x01d1, 0x010f, 0x006d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01d1, 0x0190, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ee, 0x01f1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x01b0, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0170, 0x010f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x0212, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006d, 0x01f1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006c, 0x004c, 0x012f, 0x01b0, 0x006d, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x084d, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x68f0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01b0, 0x016f, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x0211, 0x010f, 0x004d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x0190, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x006c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0150, 0x01f1, 0x012f, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x006d, 0x014f, 0x01d1, 0x010f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x00ee, 0x01d1, 0x00ce, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01f1, 0x008e, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0211, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0212, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0170, 0x0170, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x80f0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x388e, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006d, 0x01b0, 0x01b1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008e, 0x01b0, 0x01b0, 0x00ad, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01b0, 0x01b1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x004c, 0x004c, 0x002c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002c, 0x002c, 0x002c, 0x002c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x002c, 0x004c, 0x008d, 0x0150, 0x01d1, 0x012f, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01b0, 0x0190, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x01f1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010f, 0x016f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006c, 0x01d1, 0x010e, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x50cf, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x084c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x014f, 0x01b1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010e, 0x01d1, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x00ce, 0x01b1, 0x01b1, 0x00ee, 0x004c, 0x002c, 0x004c, - 0x004b, 0x002b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004c, 0x002c, 0x004c, 0x004c, 0x012f, 0x01f1, 0x014f, 0x006c, 0x004b, 0x004c, 0x002c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x014f, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x01b0, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0190, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01b1, 0x00ce, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01b1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01f1, 0x00ae, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x388e, 0x9931, 0x9931, 0x9931, 0x9931, 0x68d0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x012e, 0x01d1, 0x008d, 0x004c, 0x004c, 0x004b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x004c, 0x008c, 0x0170, 0x01b1, 0x00ad, 0x004c, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002c, 0x00ee, 0x01b1, 0x0190, 0x00ad, 0x002b, - 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004c, 0x004c, 0x004b, 0x002b, 0x004c, 0x004b, 0x004b, 0x004b, 0x006c, 0x010e, 0x01d1, 0x014f, 0x006c, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x002c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x00cd, 0x01b1, 0x0170, 0x008c, 0x004b, 0x002c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x004b, 0x004b, 0x004c, 0x0190, 0x0190, 0x004c, 0x004b, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x012f, 0x0190, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01d1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f2, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010e, 0x0170, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ce, 0x01d1, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x002c, 0x002c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x104c, 0xa111, 0x9931, 0x9931, 0x9931, 0x288d, 0x004b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004c, 0x002b, 0x004b, 0x00ee, 0x01f2, 0x00cd, 0x004b, 0x004c, 0x002b, 0x004c, 0x004c, 0x002b, 0x004b, 0x002b, 0x002b, 0x002c, 0x004b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004c, 0x002b, 0x00ee, 0x01d1, 0x012f, 0x004c, 0x002b, 0x004c, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x002b, 0x004c, 0x00ee, 0x01b1, 0x0170, - 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004c, 0x010e, 0x01b1, 0x0170, 0x008c, 0x002b, 0x004b, 0x002b, 0x004b, 0x002c, 0x002c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x006c, 0x0170, 0x01d1, 0x00cd, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x008d, 0x0190, 0x014f, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004b, 0x002b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x00cd, 0x01d1, 0x008c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x014f, 0x012e, 0x002c, 0x004b, 0x004c, 0x004b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x01f1, 0x006c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x002c, 0x004c, 0x004c, 0x002b, 0x004c, 0x014f, 0x01b0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x002b, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x9931, 0x9931, 0x9931, 0x8910, 0x002c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x002b, 0x004c, 0x002b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004b, 0x00ac, 0x01d1, 0x010f, 0x004b, 0x002c, 0x004c, 0x002c, 0x004c, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x004b, 0x002b, 0x004c, 0x002b, 0x006c, 0x014f, 0x01d1, 0x00cd, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004c, 0x010e, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00ed, 0x01b1, 0x0170, 0x008d, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x00ad, 0x01d1, 0x016f, 0x004c, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x008d, 0x01d1, 0x012f, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004c, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x006c, 0x01d1, 0x00cd, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x002b, 0x004c, 0x004b, 0x004c, 0x004b, 0x004c, 0x01d1, 0x006c, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x01f1, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x014f, 0x010e, 0x004b, 0x004b, 0x002c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004c, 0x004b, 0x004b, 0x0190, 0x012f, 0x004b, 0x004c, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004c, 0x004b, 0x004b, 0x002b, 0x70f0, 0x9931, 0x9931, 0x48ae, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x008c, 0x01b1, 0x014f, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00cd, 0x01d1, 0x0150, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, - 0x002a, 0x002a, 0x004a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x004a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00cd, 0x01b0, 0x0170, 0x00ac, 0x002a, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x016f, 0x01d1, 0x00ad, 0x002b, 0x002a, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x00ce, 0x01d1, 0x00cd, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x0190, 0x012f, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x00ee, 0x0190, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x01f2, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x00ad, 0x01b1, 0x002b, 0x002c, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x006c, 0x01d1, 0x00ce, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x60cf, 0x9931, 0x9931, 0x104c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x0190, 0x0190, 0x004c, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x01b1, 0x00ad, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x004b, 0x004b, 0x002b, 0x002b, 0x004a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00cd, 0x0190, 0x01b0, 0x00cd, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x002a, 0x004a, 0x002a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002a, 0x004b, 0x00cd, 0x01d1, 0x012f, 0x004b, 0x004b, 0x002a, 0x004b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x00ce, 0x01d1, 0x00ad, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x0190, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x0190, 0x00cd, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x01d1, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x01b0, 0x00ad, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x00ad, 0x01d1, 0x008c, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x48ae, 0x9931, 0x68f0, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x0190, 0x006c, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x004b, 0x004b, 0x002a, 0x002b, 0x004b, 0x002b, 0x002b, 0x002a, 0x002b, 0x004a, 0x00ac, 0x0190, 0x0170, 0x006c, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x008c, 0x0170, 0x0190, 0x00cd, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x006b, 0x016f, 0x0190, 0x008c, 0x002a, 0x004a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x012f, 0x01b1, 0x006c, 0x004b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x002b, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x00cd, 0x01b1, 0x004b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x006c, 0x01d1, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x01d1, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x010e, 0x014f, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x010e, 0x0190, 0x004b, 0x002a, 0x002b, 0x002a, 0x002b, 0x002b, 0x002a, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x308d, 0x9911, 0x206c, 0x004b, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002a, 0x004b, 0x004a, 0x004b, 0x004a, 0x002a, 0x002b, 0x002b, 0x004b, 0x002a, 0x002a, 0x002a, 0x002b, 0x010e, 0x01b1, 0x008c, 0x002a, 0x004a, 0x002b, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004b, 0x010e, 0x01b0, 0x00ed, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x0029, 0x008b, 0x016f, 0x01b0, 0x00cd, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ed, 0x01b1, 0x010e, 0x004a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004b, 0x014f, 0x016f, 0x004b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002a, 0x008b, 0x01b1, 0x008c, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002b, 0x002a, 0x002a, 0x012e, 0x012f, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d2, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x004b, 0x01d1, 0x006b, 0x002a, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x014f, 0x014f, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x186b, 0x88f1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00cd, 0x01b1, 0x00cd, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x00ac, 0x0190, 0x016f, 0x006b, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, - 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008b, 0x014f, 0x0190, 0x00ed, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x006a, 0x014f, 0x0190, 0x00ab, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x004a, 0x0170, 0x016f, 0x004a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x0170, 0x00ed, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0190, 0x008c, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x012f, 0x010e, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x004b, 0x0190, 0x00ed, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x286b, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ac, 0x01b1, 0x00ed, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x00ee, 0x01b1, 0x010d, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0049, 0x012e, 0x0190, 0x00ed, 0x004a, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00cc, 0x01b0, 0x010e, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006b, 0x0190, 0x012e, 0x0049, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x012e, 0x016f, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ac, 0x0190, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x0029, 0x00ac, 0x0190, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x008b, 0x01b1, 0x008b, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006b, 0x01b0, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008b, 0x0170, 0x014f, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x010d, 0x01b1, 0x00ed, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x006a, 0x014f, 0x016f, 0x008b, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006a, 0x01b0, 0x00ed, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x00cd, 0x01b0, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x014f, 0x00cd, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01d1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x0190, 0x00ab, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004a, 0x0029, 0x0029, 0x00cc, 0x01b1, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x016f, 0x012e, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0009, 0x00ed, 0x01b1, 0x00ed, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x010e, 0x0191, 0x010e, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x01b1, 0x00ec, 0x0008, 0x0028, 0x0028, 0x0029, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x00ab, 0x01b1, 0x00ac, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x006a, 0x01b1, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004a, 0x01b1, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01b1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00ed, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x012e, 0x016f, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0029, 0x0049, 0x012e, 0x016f, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x006a, 0x014f, 0x0170, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ed, 0x0190, 0x010e, 0x004a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0029, 0x006a, 0x016f, 0x014f, 0x006a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x0190, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x00cc, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01b1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x004a, 0x01b1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x016f, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x0029, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x010d, 0x0190, 0x006a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x0190, 0x00ed, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0049, 0x00ed, 0x0190, 0x012f, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ec, 0x01b0, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x012e, 0x012e, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x016f, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012e, 0x00ec, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00ab, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00cc, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0049, 0x014e, 0x0170, 0x008b, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00cc, 0x0190, 0x014f, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008a, 0x014f, 0x012f, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012e, 0x014f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x016f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x008b, 0x018f, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00ab, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ac, 0x0190, 0x00ac, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ac, 0x0190, 0x012e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00cb, 0x0170, 0x014f, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0009, 0x0028, 0x0049, 0x00ed, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x014f, 0x014f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0170, 0x008a, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x014f, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x010d, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x00ac, 0x0170, 0x0170, 0x008b, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x008a, 0x016f, 0x014e, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x006a, 0x0170, 0x010e, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00cd, 0x010d, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012f, 0x012e, 0x0008, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014f, 0x010e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ab, 0x0190, 0x010e, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x008a, 0x016f, 0x016f, 0x00ac, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x010d, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014f, 0x010d, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00cb, 0x016f, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x01b1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0170, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x014f, 0x014f, 0x0049, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x010d, 0x01b0, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x008b, 0x014f, 0x0170, 0x00ab, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x008b, 0x0170, 0x014e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ab, 0x0191, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ec, 0x016f, 0x0049, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012e, 0x00cc, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x012e, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0191, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x010e, 0x0170, 0x006a, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008a, 0x0170, 0x014f, 0x004a, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x012f, 0x0190, 0x00ec, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x0190, 0x006a, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0190, 0x008a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x01b1, 0x0049, 0x0008, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ab, 0x0170, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ac, 0x0190, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00ec, 0x0190, 0x008b, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0048, 0x00ed, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x00ec, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0008, 0x00ab, 0x0190, 0x012e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x0170, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0069, 0x0190, 0x008b, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x010e, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010d, 0x014f, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0008, 0x00cb, 0x0191, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x006b, 0x014f, 0x014e, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012f, 0x014f, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014f, 0x00ed, 0x0029, 0x0028, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0170, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x00ed, 0x010e, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014f, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x0191, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x10AE, 0x00F8, 0x00F9, 0x00D6, 0x18AD, 0x188C, 0x188C, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188D, 0x188D, 0x188D, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AC, 0x18AC, 0x188D, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188D, 0x18AC, 0x18AC, 0x00F9, 0x00F9, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x18AB, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, + 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x10AE, 0x00F7, 0x00F9, 0x00F6, 0x188D, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x188D, 0x18AC, 0x18AC, 0x188D, 0x188D, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x00F9, 0x00F9, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, + 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x10AF, 0x00F8, 0x00F8, 0x00F7, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188D, 0x18AC, 0x18AD, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x00F9, 0x00F9, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, + 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x10AF, 0x00F7, 0x00F8, 0x00F6, 0x18AD, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, + 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x10AF, 0x00F8, 0x00F9, 0x00D6, 0x18AD, 0x18AD, 0x188C, 0x18AC, 0x18AD, 0x18AC, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208D, 0x18AD, 0x18AD, 0x208D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, + 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x188D, 0x18AC, 0x18AD, 0x18AF, 0x00F8, 0x00F9, 0x00F6, 0x18AE, 0x188D, 0x18AC, 0x188D, 0x18AC, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x10D3, 0x10D3, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, + 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x188C, 0x18AC, 0x188D, 0x10AF, 0x00F8, 0x0119, 0x00D7, 0x18AE, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, + 0x188B, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, + 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x188C, + 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x00F9, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AF, 0x011A, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x08B2, 0x08D2, + 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F9, 0x0119, 0x00F8, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08F6, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08D3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x00F8, 0x00F8, + 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18B0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0117, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x00F9, 0x00F9, + 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x011A, 0x0119, 0x00F6, 0x10F2, 0x10D1, 0x10D0, 0x10D1, 0x10D3, 0x08F6, 0x00F9, 0x00F9, 0x0119, 0x10D2, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x00F8, 0x00F8, + 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18D0, 0x0118, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x00F9, 0x00F9, + 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18CD, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x00F9, 0x00F8, + 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08D5, 0x011A, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x011A, 0x10D2, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188D, 0x00F9, 0x00F8, + 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0118, 0x10D1, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x188C, 0x00F9, 0x00F9, + 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x00F9, 0x0119, 0x011A, 0x0119, 0x08F4, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18CD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x188C, 0x00F9, 0x00F9, + 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0118, 0x0119, 0x0119, 0x0118, 0x10D1, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F3, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F3, 0x011A, 0x0119, 0x08F3, 0x10D1, 0x00F7, 0x0119, 0x00F9, 0x18AF, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F7, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F3, 0x10D0, 0x10F4, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x0117, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x00F9, 0x00F9, + 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x08F5, 0x0139, 0x00FA, 0x011A, 0x0119, 0x08F5, 0x18AF, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x011A, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x08F4, 0x20AD, 0x18AE, 0x18AE, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08D4, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x00F7, 0x011A, 0x10D3, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x00F9, 0x00F9, + 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0118, 0x18CF, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x0118, 0x0119, 0x08F7, 0x10D1, 0x10D1, 0x00F7, 0x0119, 0x0118, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x00F6, 0x011A, 0x08F3, 0x18AE, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08D4, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x00F7, 0x011A, 0x10D3, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x011A, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x00F9, + 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D1, 0x18CD, 0x18AD, 0x10D1, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08F4, 0x011A, 0x011A, 0x10F1, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D0, 0x18AE, 0x08D5, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F7, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F3, 0x10D0, 0x10F4, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x0117, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x10F2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, + 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x10B1, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AE, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, + 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x0118, 0x0119, 0x00F7, 0x10D1, 0x10D1, 0x00F7, 0x0119, 0x00F8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F8, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, + 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10F1, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10F1, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08D5, 0x011A, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, + 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x10D1, 0x00F8, 0x0119, 0x0119, 0x00F8, 0x10D1, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x18CD, 0x18AD, 0x20AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0118, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D3, 0x10D3, + 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18CD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x0119, 0x10D1, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x011A, 0x0119, 0x00F6, 0x10F2, 0x10D1, 0x10D0, 0x10D1, 0x10D3, 0x08F6, 0x011A, 0x0119, 0x0119, 0x10D2, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10CF, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x0119, 0x011A, 0x08F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x013A, 0x00F8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18B0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CF, 0x0119, 0x00F9, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08F5, 0x10D1, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x00F9, 0x011A, 0x10D2, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x10D0, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x08D5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10F3, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x011A, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D0, 0x10D3, 0x08F4, 0x08F3, 0x08F3, 0x10F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x10D3, 0x10D3, 0x08F3, 0x08F3, 0x08D4, 0x10D3, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CF, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x011A, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18CD, 0x10F3, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, + 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D1, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x00F9, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18CD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AE, 0x18AE, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x08F4, + 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F7, 0x18AE, 0x18CD, 0x18AF, 0x0119, 0x011A, 0x00F9, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, + 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0118, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x00F9, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, + 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x011A, 0x10D0, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x011A, 0x10D2, + 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F9, 0x00F9, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x00F9, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x08D3, 0x18AD, 0x18AD, 0x08D3, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D3, 0x18AD, + 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x10B0, 0x0119, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0139, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x20CE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0139, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, + 0x18AE, 0x18AD, 0x18AD, 0x08D5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0116, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x10D1, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, + 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00FA, 0x18D1, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x10F3, 0x08D3, 0x10D2, 0x0117, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x08F5, 0x18CE, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0116, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AF, 0x00F8, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x011A, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08D5, 0x0119, 0x00F9, 0x18AD, 0x18AE, 0x208D, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x00F7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AF, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18CD, 0x20AD, 0x18AE, 0x18AE, 0x00F7, + 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x08F6, 0x0119, 0x0119, 0x011A, 0x0119, 0x0116, 0x18CF, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CF, 0x00F9, 0x011A, 0x08F5, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x011A, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18D0, 0x0118, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x00F8, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F9, + 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x18CF, + 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x18D0, 0x18AD, + 0x011A, 0x0119, 0x08F5, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x20AE, + 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00FA, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, + 0x08F7, 0x00F9, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x08F3, 0x08F3, 0x10F3, 0x08F3, 0x10D3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x10F2, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08F3, 0x0119, 0x0119, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x310E, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x10F2, 0x0119, 0x0119, 0x10D2, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00FA, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18D0, + 0x18AE, 0x0117, 0x00F9, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x28EE, 0x8252, 0xCB54, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, + 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x394F, 0xB313, 0xD395, 0x7211, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18CD, 0x18CD, 0x20AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18CD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x496F, 0xCB55, 0xD395, 0xBB54, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x011A, 0x00F7, + 0x188D, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x208D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00FA, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x61D0, 0xD395, 0xD395, 0xD395, 0x69F1, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20CD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18D0, 0x00F9, 0x011A, 0x00F7, 0x18AE, + 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x61D0, 0xD395, 0xD395, 0xD396, 0xD375, 0x310E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x011A, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, + 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x392F, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, + 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10F2, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x8252, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, + 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x08F7, 0x00F9, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x5190, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18EE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F9, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10F2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x08D5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x8252, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x412F, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x10F3, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0118, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0355, 0x190F, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F4, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0x496F, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x011A, 0x0117, 0x0117, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18B0, 0x0119, 0x00F9, 0x0119, 0x011A, 0x10D1, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x11D1, 0x03B7, 0x0A93, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x28EE, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9AB3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x00F9, 0x00F9, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x10AF, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x10D0, 0x0118, 0x011A, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x10F2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x208D, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0356, 0x03B7, 0x03B7, 0x190F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x7A31, 0xD395, 0xD395, 0xD375, 0xDB95, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F4, 0x10D2, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18CD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x0117, 0x00FA, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x11D1, 0x03B8, 0x03B7, 0x03B8, 0x0A94, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x00F9, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x08F5, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0xD395, 0xD395, 0xB313, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x011A, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18CD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0356, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x190E, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0xA2D3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xA2D3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x11D1, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0A94, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAAD3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0356, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x190F, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x61D0, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0397, 0x03B8, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x59D0, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x011A, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AE, 0x00F7, 0x011A, 0x011A, 0x011A, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D1, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAAD3, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x011A, 0x10D2, 0x18CD, 0x18AE, 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x61B1, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x8A92, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x188D, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x03B8, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0xAAD3, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0x310E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x10D1, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03D7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B8, 0x0397, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0x7231, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x10D3, 0x08D3, 0x10D2, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x20AE, 0x8A92, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x7A31, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x28EE, 0xC374, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xA2D3, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CE, 0x194F, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B8, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x61D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0x69F1, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x011A, 0x011A, 0x00F9, 0x08F7, 0x18CE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x10CF, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1930, 0x02F5, 0x03B7, 0x03B8, 0x0356, 0x114F, 0x18AD, 0x18AD, 0x18AD, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x03B7, 0x03B8, 0x03B7, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F4, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x9AB3, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0x412F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x0A32, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0356, 0x18AD, 0x18AD, 0x0A32, 0x03B7, 0x03B8, 0x03B8, 0x03B8, 0x0376, 0x18EE, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x00F9, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x190F, 0x0377, 0x0397, 0x03B8, 0x0398, 0x0397, 0x0B77, 0x18CE, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B8, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x0BB7, 0x0398, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0xC355, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x4970, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18EE, 0x0377, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0A33, 0x190E, 0x0397, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x11D1, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x11B0, 0x0A93, 0x0356, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x1253, 0x0B78, 0x0B98, 0x0B78, 0x0B98, 0x0B98, 0x1378, 0x11F2, 0x18AD, 0x18AD, 0x0B98, 0x0B78, 0x0B78, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0B98, 0x1378, 0x0B78, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x4970, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0x8252, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x11D1, 0x03B8, 0x03B7, 0x03B7, 0x03B8, 0x0377, 0x0AD4, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x02F5, 0x18AE, 0x18AD, 0x03B7, 0x03B8, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x192F, 0x03B7, 0x03B7, 0x03B8, 0x03B8, 0x03B7, 0x03B7, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x1AB5, 0x1B78, 0x1B58, 0x1358, 0x1B78, 0x1378, 0x1358, 0x1A13, 0x18AE, 0x18AE, 0x1358, 0x1358, 0x1378, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x1358, 0x1358, 0x1358, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x7A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD395, 0xC354, 0x5990, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0356, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x194F, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F8, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10CF, 0x0119, 0x011A, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x00F9, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1A54, 0x1B38, 0x1B38, 0x2338, 0x1B38, 0x1B58, 0x2338, 0x21D2, 0x18AD, 0x18AD, 0x2338, 0x2338, 0x2358, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1930, 0x2339, 0x2358, 0x2338, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0xA2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0x4970, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x1170, 0x03B8, 0x03B8, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x0A53, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x0396, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x2150, 0x2B18, 0x2B39, 0x2B18, 0x2B19, 0x2B19, 0x2AF8, 0x18CE, 0x18AD, 0x18AD, 0x2B19, 0x2B18, 0x2B19, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x2192, 0x2B19, 0x2B19, 0x2B18, 0x2338, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0xBB34, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x4970, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0AF5, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0377, 0x18EE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B8, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x11B0, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x0117, 0x011A, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x10CF, 0x0118, 0x0119, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x2192, 0x2B19, 0x3319, 0x32F9, 0x2A15, 0x18EF, 0x20AD, 0x18AD, 0x18AD, 0x32F9, 0x3319, 0x32F9, 0x18AD, 0x18AD, 0x18AD, 0x2191, 0x3319, 0x2AF9, 0x3319, 0x2AF9, 0x2A97, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x20CF, 0x28CF, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x71D1, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20CD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x190F, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x11D1, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x18D0, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x3AD9, 0x3AD9, 0x3AD9, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x3AF9, 0x3AD9, 0x3AD9, 0x18AD, 0x20AD, 0x3215, 0x3AD9, 0x3AF9, 0x3ADA, 0x3AD9, 0x3277, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x20CD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x4950, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD374, 0xD375, 0xD355, 0xD355, 0xAAB3, 0x20CE, 0x18CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0398, 0x0398, 0x0398, 0x0398, 0x03B7, 0x0397, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0AD5, 0x0397, 0x0398, 0x03B8, 0x0398, 0x03B8, 0x18EE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0398, 0x0398, 0x03B8, 0x0398, 0x0398, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0398, 0x0398, 0x0398, 0x0398, 0x0398, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0139, 0x011A, 0x0117, 0x00F7, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x42D9, 0x42B9, 0x42B9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x42B9, 0x42B9, 0x42BA, 0x18AE, 0x31F5, 0x42DA, 0x42D9, 0x42B9, 0x42D9, 0x3A77, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x5991, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD374, 0xD375, 0xD355, 0xD355, 0xD355, 0x9252, 0x30EF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, 0x2338, 0x2338, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x2150, 0x2318, 0x2338, 0x2338, 0x2318, 0x2318, 0x2338, 0x21F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x2339, 0x2318, 0x2318, 0x2339, 0x2338, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x2338, 0x2338, 0x2338, 0x2338, 0x2338, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x00F7, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x10F3, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4A99, 0x4AB9, 0x4A9A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4ABA, 0x4ABA, 0x4A9A, 0x4257, 0x4A99, 0x4A9A, 0x4A9A, 0x4ABA, 0x4237, 0x20CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x0119, 0x0119, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x69F1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xCB14, 0x4130, 0x20AF, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x42B9, 0x4A99, 0x42B9, 0x42BA, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4257, 0x4ABA, 0x4A9A, 0x4A99, 0x42B9, 0x4A9A, 0x42B9, 0x4A9A, 0x20EF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4A9A, 0x42B9, 0x42B9, 0x4ABA, 0x4AB9, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4A99, 0x42B9, 0x4ABA, 0x4A99, 0x4A99, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x011A, 0x00F9, 0x10D0, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x527A, 0x527A, 0x527A, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x527A, 0x527A, 0x529A, 0x527A, 0x527A, 0x527A, 0x527A, 0x4A18, 0x20CE, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18D2, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x8253, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xD355, 0x7A11, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x6A3B, 0x6A3B, 0x6A3B, 0x621A, 0x6A3B, 0x6A3B, 0x6A1B, 0x6A3B, 0x6A3B, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x3932, 0x6A3B, 0x6A3B, 0x6A1B, 0x6A3B, 0x6A3B, 0x6A3B, 0x6A3B, 0x6A3B, 0x59D7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x6A3B, 0x6A3B, 0x6A3B, 0x6A3B, 0x6A3B, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x6A1B, 0x6A3B, 0x6A3B, 0x6A1B, 0x6A3B, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x10F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x011A, 0x00F7, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AE, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x20AE, 0x08F3, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x5A5B, 0x5A5A, 0x5A7A, 0x2910, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x5A5A, 0x5A7B, 0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A, 0x4A18, 0x20CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x091A, 0x18F2, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x8232, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xA293, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x89BC, 0x89BC, 0x89BC, 0x91BC, 0x89BC, 0x899C, 0x89BC, 0x89BC, 0x89BB, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x899B, 0x89BC, 0x89BC, 0x89BC, 0x799A, 0x7179, 0x89BB, 0x899C, 0x89BC, 0x89BC, 0x38F1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x89BC, 0x899C, 0x899C, 0x89BC, 0x89BC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x89BC, 0x899C, 0x89BC, 0x899C, 0x89BC, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0117, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x623A, 0x623B, 0x625A, 0x621A, 0x2910, 0x18CD, 0x18AD, 0x18AD, 0x623B, 0x623A, 0x625A, 0x623B, 0x623B, 0x51F8, 0x20CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0119, 0x0917, 0x18D2, 0x18D2, 0x0918, 0x091A, 0x0918, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30D0, 0x30F0, 0x30F0, 0x8252, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD335, 0x9253, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA93D, 0xA93D, 0xA93D, 0xB13D, 0xA93D, 0xA93D, 0xA93D, 0xB13D, 0xB11D, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x60F5, 0xA93D, 0xA93D, 0xB13D, 0xA93D, 0x60F5, 0x40D1, 0xB11D, 0xB13D, 0xA93D, 0xA93D, 0x991B, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA93D, 0xA93D, 0xA93D, 0xA93D, 0xA93D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA93D, 0xA93D, 0xA93D, 0xB13D, 0xA93D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x00F7, 0x00F7, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0117, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x59D8, 0x6A1B, 0x6A1B, 0x6A1B, 0x6A1B, 0x4133, 0x18AD, 0x18AD, 0x6A3B, 0x6A1B, 0x6A1B, 0x6A1B, 0x51B6, 0x20CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10D3, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18D1, 0x20CE, 0x20CE, 0x18D1, 0x093A, 0x093A, 0x28EF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x9273, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD334, 0xD335, 0xD334, 0xD334, 0xD314, 0xD315, 0xAA93, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD09E, 0xD0BE, 0xD0BE, 0x18AD, 0x18AD, 0x18AD, 0x30B0, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0x20AE, 0x18AD, 0xB8BC, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0x68B5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0118, 0x011A, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20CE, 0x61B8, 0x721B, 0x71FB, 0x721B, 0x721B, 0x4133, 0x20AD, 0x71FB, 0x721B, 0x71FB, 0x4174, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0119, 0x011A, 0x18D1, 0x20AE, 0x20CE, 0x20F1, 0x093A, 0x093A, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0xAAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AE, 0x20AD, 0x20AD, 0x20AE, 0x30EE, 0x6150, 0x81B1, 0xA1F2, 0xC233, 0xCA53, 0xCA54, 0xCA53, 0xC233, 0xA1F2, 0x8191, 0x512F, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0x18AD, 0x20AD, 0x18AD, 0xB079, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xA058, 0x18AD, 0x18AD, 0x7095, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xE83E, 0x28AE, 0x20AD, 0x18AD, 0x18AD, 0xF03F, 0xF01F, 0xF03F, 0xF03F, 0xF03F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F9, 0x0119, 0x18D0, 0x18AD, 0x18AE, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x00F9, 0x0119, 0x0119, 0x10D0, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x20CE, 0x69B9, 0x81FB, 0x79DB, 0x79DC, 0x81FC, 0x5976, 0x79DB, 0x79DC, 0x81DC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0918, 0x0119, 0x0917, 0x18D0, 0x20D0, 0x0917, 0x093A, 0x1138, 0x28CF, 0x30CF, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x3911, 0xAAD4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD315, 0xD315, 0xD314, 0x69B2, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x410F, 0x6990, 0x99F2, 0xC253, 0xCA74, 0xD274, 0xCA74, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xD253, 0xCA53, 0xD233, 0xCA33, 0xC213, 0x8991, 0x410F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x00F9, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0917, 0x0119, 0x0119, 0x10CF, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AE, 0x7199, 0x89DB, 0x89BC, 0x81BC, 0x89BC, 0x89BC, 0x89BC, 0x89BC, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D2, 0x0119, 0x0119, 0x093A, 0x093A, 0x093A, 0x093A, 0x20F2, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x3111, 0x3911, 0x3911, 0xB2F5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD314, 0xD314, 0xD2F4, 0xD2F5, 0xCAD4, 0x5971, 0x30F0, 0x30D0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x38EF, 0x79B1, 0xBA53, 0xCA94, 0xCA94, 0xCA74, 0xD273, 0xD273, 0xCA73, 0xCA54, 0xCA53, 0xCA54, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xCA13, 0xCA13, 0xA1B2, 0x490F, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CE, 0x7979, 0x919C, 0x919C, 0x91BC, 0x919C, 0x899C, 0x89BC, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x18F2, 0x0919, 0x091A, 0x091A, 0x0919, 0x20F3, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x4112, 0xB2F5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD314, 0xD2F5, 0xD2F4, 0xD2F4, 0x4930, 0x30F0, 0x30EF, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x4130, 0x89F1, 0xD294, 0xD294, 0xCA93, 0xCA74, 0xD274, 0xCA74, 0xCA74, 0xCA53, 0xCA73, 0xD253, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xC274, 0x9B36, 0x83B8, 0x6419, 0x6C39, 0x6439, 0x6C1A, 0x8B57, 0xB295, 0xCA13, 0x9191, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CF, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x28AE, 0x8159, 0x917C, 0x997C, 0x997C, 0x999C, 0x999C, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20D0, 0x20D1, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD314, 0xD2F4, 0xD2F4, 0xD315, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2D5, 0x79D2, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x30D0, 0x28EF, 0x28F0, 0x28CF, 0x5150, 0xAA32, 0xD293, 0xD294, 0xD294, 0xCA93, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0xD274, 0xD254, 0xCA53, 0xCA54, 0xB2D5, 0x83B8, 0x44FC, 0x1DBE, 0x063F, 0x0CDB, 0x0B76, 0x1377, 0x1377, 0x0B76, 0x1356, 0x0B76, 0x0B77, 0x23F8, 0x6991, 0x510F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x8939, 0xA17C, 0xA17C, 0xA15D, 0xA15D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8A54, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2D4, 0xCAD4, 0x5951, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x4130, 0x91F2, 0xD294, 0xD294, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA74, 0xD274, 0xD274, 0xD274, 0xD253, 0xB2D5, 0x7419, 0x257D, 0x063F, 0x061F, 0x057D, 0x12B5, 0x190F, 0x18CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CE, 0x913A, 0xA93D, 0xA95D, 0xA95C, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xCAB4, 0x5172, 0x3911, 0x38F1, 0x38F0, 0x30F0, 0x81D2, 0xC294, 0xD294, 0xD293, 0xD294, 0xD294, 0xCA93, 0xCA93, 0xD274, 0xD274, 0xCA73, 0xD274, 0x83D8, 0x353D, 0x061F, 0x063F, 0x063F, 0x063F, 0x4C5A, 0x4970, 0x20AE, 0x20AE, 0x20AD, 0x18CD, 0x20AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xB11D, 0xB11D, 0xB11D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6B36, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D5, 0xD2D4, 0xCAD4, 0xCAB4, 0x5972, 0x3911, 0x5151, 0xB253, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xD274, 0xC294, 0x645A, 0x1DBE, 0x063F, 0x063F, 0x063F, 0x1DBE, 0x6459, 0xC274, 0x99D2, 0x28CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18CE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0xB8FE, 0xB8FD, 0xB8FE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253B, 0x465C, 0x6D7B, 0x6D9A, 0x6D9A, 0x6D7A, 0x84F9, 0x9C78, 0x9C77, 0x9C78, 0x9C78, 0x9C57, 0x9C78, 0x9C58, 0x9C58, 0xBBB6, 0xD334, 0xD315, 0xD334, 0xD315, 0xD314, 0xD315, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2D4, 0x91F3, 0x5972, 0xCA74, 0xD2B4, 0xD2B4, 0xD294, 0xCA94, 0xD294, 0xD294, 0xCA94, 0xCA74, 0xC2B4, 0x6C5A, 0x0DFF, 0x063F, 0x063F, 0x063F, 0x353D, 0x83B8, 0xCA53, 0xCA33, 0x89B1, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x00F9, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0xC0DE, 0xC0FE, 0xC0DD, 0x18AE, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x00FA, 0x08F4, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x38F1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4D1A, 0x6D9A, 0x94B9, 0x9C98, 0x9C77, 0x9C78, 0x9C78, 0x9C78, 0x94B8, 0x6D7A, 0x6D7A, 0x6D7B, 0x367C, 0x367D, 0x1EFE, 0x077F, 0x075F, 0x1EDE, 0x363D, 0x6D3A, 0x9C17, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2B4, 0xCAD4, 0xD2B3, 0xCAB4, 0xC294, 0xCAB4, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0x7BD8, 0x0DFF, 0x063F, 0x061F, 0x063F, 0x4CBB, 0x9B57, 0xD233, 0xCA33, 0xCA53, 0x6150, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x08F3, 0x08F3, 0x08F3, 0x10D2, 0x20AE, 0x10D2, 0x10D3, 0x08F3, 0x08F3, 0x18D0, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x08F3, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x08F3, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x08F3, 0x18D0, 0x18AE, 0x10D2, 0x08F3, 0x08F3, 0x08F3, 0x10D1, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x08F3, 0x10D1, 0x18AD, 0x10D2, 0x08F3, 0x10F3, 0x08F3, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0917, 0x0119, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC8BE, 0xC8DE, 0xC8BE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xA2B5, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD334, 0xD335, 0xD335, 0xD335, 0xD335, 0xBB96, 0xA437, 0x74F9, 0x4DBC, 0x2E7E, 0x0EDF, 0x559B, 0x8498, 0xC335, 0xD2F4, 0xD2D4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2B5, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xBAB4, 0xBAF6, 0xCA94, 0xD294, 0xCA94, 0xD273, 0x9B76, 0x1DBE, 0x061F, 0x063F, 0x0DDF, 0x643A, 0xB2D5, 0xCA54, 0xD253, 0xCA53, 0xC294, 0x59B1, 0x28CE, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x0116, 0x00F9, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D3, 0x011A, 0x0119, 0x00F9, 0x00F6, 0x18AD, 0x08F6, 0x011A, 0x011A, 0x0119, 0x10D3, 0x18CD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x0119, 0x08F7, 0x18AE, 0x00F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18CD, 0x00F7, 0x011A, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x10D2, 0x08F3, 0x08F3, 0x10D1, 0x18CE, 0x00F7, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x40B0, 0xA09A, 0xD0BE, 0xD09E, 0xD0BE, 0xB89C, 0x78B5, 0x28AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xBB15, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD335, 0xD315, 0xD314, 0xD315, 0xD2F5, 0xD2F5, 0xD2F4, 0x9BF7, 0x6D1A, 0x2E3D, 0x45BC, 0x9418, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xC2D4, 0x4CDB, 0x7BD8, 0x9B57, 0x44FC, 0x063F, 0x063F, 0x1DBE, 0x83D8, 0xC294, 0xCA53, 0xCA54, 0xCA33, 0xCA53, 0xB2B5, 0x33B8, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188E, 0x20CD, 0x10D1, 0x0119, 0x011A, 0x10D1, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x011A, 0x0119, 0x00F6, 0x18AD, 0x08F6, 0x011A, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x00F7, 0x0119, 0x0139, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0139, 0x0119, 0x08F7, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x08F7, 0x011A, 0x0119, 0x011A, 0x10D3, 0x20AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x08F6, 0x011A, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x08F7, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AE, 0x18AE, 0x18CF, 0x00F8, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F9, 0x10D0, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x40B0, 0xD07D, 0xD87E, 0xD89F, 0xD89F, 0xE07F, 0xD89E, 0xD89F, 0xB87B, 0x28AE, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xBB14, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD314, 0xD335, 0xD315, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xC335, 0x8478, 0x4D7B, 0x4D5B, 0xAB96, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCA94, 0xCAB4, 0xD294, 0xD294, 0xD273, 0xC2B4, 0x5C9A, 0x061F, 0x061F, 0x063F, 0x7419, 0xD273, 0xD273, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xAAF6, 0x153C, 0x2951, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D3, 0x011A, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x08F3, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x08F6, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x011A, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0118, 0x10CF, 0x20AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x10B0, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x208D, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB07A, 0xE85F, 0xE85F, 0xE07F, 0xE85F, 0xE87F, 0xE07F, 0xE85F, 0xE07F, 0x9898, 0x20AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xBB15, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD354, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD315, 0xCB34, 0xD315, 0xD314, 0xD314, 0xD315, 0xD314, 0xD2F4, 0xD2F5, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D5, 0xD2D4, 0xD2D4, 0xBB55, 0x7499, 0x35DC, 0x8439, 0xC2F4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xCA93, 0xD294, 0xD274, 0xCA74, 0x9B76, 0x061F, 0x061F, 0x83D8, 0xC295, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0x7BB8, 0x063F, 0x2A34, 0x30F0, 0x30F0, 0x30EF, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x08F7, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x0119, 0x00F6, 0x18AD, 0x00F6, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x00F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x011A, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0118, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x38B0, 0xF05F, 0xE83F, 0xF03F, 0xF05F, 0xF05F, 0xF03F, 0xF03F, 0xF03F, 0xF05F, 0xE83F, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xBB35, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xCB35, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xCAD4, 0xD2F4, 0xCAD4, 0xD2D4, 0xD2D4, 0xCAB4, 0xD2B4, 0xCAB4, 0xCAB4, 0x8BF8, 0x3D5C, 0x6499, 0xC2D4, 0xD294, 0xD294, 0xCA74, 0xCA74, 0xD274, 0xCA74, 0xCA74, 0x54BB, 0x5C9A, 0x353D, 0x1DBE, 0x4CBB, 0x9377, 0x9B36, 0x44FC, 0x061F, 0x1BF9, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AD, 0x08F7, 0x0119, 0x011A, 0x011A, 0x10D3, 0x18AD, 0x08F6, 0x0119, 0x00F9, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F9, 0x0119, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AE, 0x00F6, 0x0119, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x10D3, 0x0119, 0x011A, 0x011A, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x20AD, 0x08F6, 0x011A, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D0, 0x011A, 0x011A, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x00F9, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F4, 0x10F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x5092, 0xF83F, 0xF83F, 0xF03F, 0xF83F, 0xF83F, 0xF83F, 0xF83F, 0xF81F, 0xF03F, 0xF83F, 0x5092, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69B3, 0xC355, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD335, 0xD335, 0xD314, 0xD314, 0xD314, 0xD2F5, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0x9B97, 0x453C, 0x6C59, 0xC2B4, 0xCA74, 0xD274, 0xD273, 0xCA73, 0xD273, 0xC294, 0x6C39, 0xC294, 0xCA53, 0x8B98, 0x4CBB, 0x0DFF, 0x063F, 0x0D7E, 0x3972, 0x3911, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x011A, 0x00F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x00F6, 0x011A, 0x0119, 0x0119, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D3, 0x0119, 0x0119, 0x011A, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x00F6, 0x0119, 0x00F9, 0x011A, 0x08F3, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AD, 0x00F6, 0x00F9, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x00F6, 0x0119, 0x011A, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x5092, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x5092, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA94, 0x9B77, 0x44DC, 0x73F9, 0xCA73, 0xCA74, 0xD254, 0xCA73, 0xCA53, 0xC294, 0x351C, 0x6C3A, 0xC294, 0xD253, 0xCA34, 0x83B8, 0x5A55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x00FA, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AE, 0x08F6, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x08F3, 0x0119, 0x0119, 0x011A, 0x08F7, 0x18AD, 0x0116, 0x011A, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x00F9, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4090, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x28AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69D3, 0xC355, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xCB55, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAD4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA94, 0xD274, 0xCA74, 0x8B78, 0x447C, 0xA316, 0xD253, 0xD253, 0xCA54, 0xCA53, 0xC294, 0x257D, 0x0DDF, 0x83B8, 0xD233, 0xCA33, 0xCA33, 0xBA13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x30D0, 0x30D0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x00F9, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x0116, 0x20AD, 0x08F6, 0x011A, 0x00F9, 0x0119, 0x10F3, 0x18AD, 0x0116, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x10D4, 0x011A, 0x011A, 0x0119, 0x08F6, 0x20AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x08F7, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F7, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F4, 0x20CD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x00F9, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x011A, 0x0119, 0x011A, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0xD03C, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xD03C, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xAAD4, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD294, 0xD2B4, 0xCA94, 0xCA94, 0xD294, 0xCA74, 0xCA73, 0xCA74, 0xD274, 0xC295, 0x6BB9, 0x6B99, 0xCA54, 0xCA53, 0xD254, 0xCA33, 0xC294, 0x24FD, 0x063F, 0x351D, 0xB295, 0xCA13, 0xCA13, 0xCA13, 0xB9F3, 0x7992, 0x4111, 0x4112, 0x38F1, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CF, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x00F9, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x00F6, 0x011A, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x0119, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D3, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AD, 0x00F7, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AE, 0x00F6, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x011A, 0x08F6, 0x18AD, 0x08F6, 0x011A, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x08F6, 0x011A, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x10D2, 0x10F3, 0x08F3, 0x10D1, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x0118, 0x00F9, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00FA, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x4090, 0xF03F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x6073, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20CD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xCB55, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD314, 0xD335, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xCA73, 0xCA53, 0xCA53, 0xCA74, 0xAAB6, 0x5B7A, 0xBA74, 0xCA53, 0xCA33, 0xCA33, 0xC254, 0x4BFB, 0x059F, 0x0D7F, 0x8B57, 0xC9F3, 0xCA13, 0xC9F3, 0xC9F3, 0xA9B3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x10D3, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x08F3, 0x18D1, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D3, 0x10B0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10B0, 0x10D3, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D3, 0x10D0, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x08F3, 0x10D0, 0x18AD, 0x10D0, 0x08F3, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x10D2, 0x10D4, 0x08F3, 0x08F3, 0x18D1, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D3, 0x18D1, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0118, 0x10CF, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4091, 0xE01D, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x7074, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x10D2, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AE, 0x18CD, 0x20AE, 0x20CD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xB2F4, 0xD395, 0xDB95, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD334, 0x84F9, 0x467D, 0x1F5E, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x079F, 0x1F1E, 0x367D, 0x367C, 0x4DDB, 0x653A, 0x8498, 0x9BF7, 0xC2F5, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA73, 0xD253, 0xD254, 0xCA74, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0x72D9, 0xAA76, 0xCA33, 0xD233, 0xCA13, 0xCA33, 0x1C7E, 0x059F, 0x05FF, 0x5C7A, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208D, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AD, 0x18CD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10B0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x7074, 0x9077, 0x8856, 0x8876, 0x388F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18CD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x3111, 0x38F1, 0x3911, 0x4111, 0x4132, 0x6193, 0xC355, 0xD396, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xB3D6, 0x271D, 0x07FF, 0x07FF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x079F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x075F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x079F, 0x079F, 0x1EFE, 0x461C, 0x6D1A, 0x9BD6, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xD274, 0xCA74, 0xCA53, 0xD254, 0xCA54, 0xD253, 0xCA53, 0xCA33, 0xA275, 0x9A76, 0xCA33, 0xCA13, 0xCA33, 0x9AD6, 0x04FF, 0x05BF, 0x063F, 0x357C, 0xC254, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F8, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F9, 0x08F5, 0x18AE, 0x20AD, 0x18AD, 0x08F4, 0x0119, 0x011A, 0x00F7, 0x0117, 0x0119, 0x011A, 0x08F5, 0x20AE, 0x20AE, 0x20AD, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xCB55, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xCB55, 0xD334, 0xCB55, 0xAC17, 0x0FBF, 0x07FF, 0x07FF, 0x07BF, 0x07BF, 0x077F, 0x075F, 0x075F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x075F, 0x075F, 0x077F, 0x077F, 0x079F, 0x07BF, 0x365C, 0x74B9, 0xB315, 0xCA73, 0xCA54, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xD233, 0xCA33, 0xB235, 0xAA16, 0xCA33, 0xCA13, 0xCA13, 0x7B37, 0x055F, 0x05FF, 0x067F, 0x25DD, 0xA2F5, 0xD1D3, 0xC9F3, 0xC9D3, 0xC9D2, 0xC9D3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x0119, 0x00F9, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D3, 0x18CE, 0x20AD, 0x10F4, 0x011A, 0x0119, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61B3, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0x8CB8, 0x0FBF, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06DF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x071F, 0x071F, 0x071F, 0x073F, 0x073F, 0x073F, 0x073F, 0x075F, 0x075F, 0x071F, 0x2DFD, 0x7419, 0xB2B5, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xD233, 0xCA14, 0xA215, 0xCA13, 0xCA13, 0xC9F3, 0x8338, 0x05BF, 0x063F, 0x06BF, 0x0E9F, 0xAAD5, 0xC9D3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B2, 0xB1B2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18CF, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x20AE, 0x18D0, 0x0119, 0x0119, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3111, 0x38F1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD354, 0xD355, 0xD355, 0xC395, 0x5DFA, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06DF, 0x06BF, 0x06BF, 0x069F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x06BF, 0x06DF, 0x06DF, 0x06FF, 0x06FF, 0x06FF, 0x071F, 0x071F, 0x06FF, 0x06BF, 0x065F, 0x05BF, 0x443C, 0x8AF7, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA13, 0x99B6, 0xC9F3, 0xCA13, 0xC9F3, 0x4C3B, 0x061F, 0x069F, 0x06FF, 0x0EBE, 0xA2D5, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9B2, 0xC1B3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30F0, 0x28F0, 0x30D0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x20AE, 0x20AD, 0x18CE, 0x0119, 0x0119, 0x10D3, 0x20CE, 0x20AE, 0x10F4, 0x0119, 0x011A, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xBB35, 0xD395, 0xD396, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xBBD6, 0x5DFB, 0x0FBF, 0x07FF, 0x07DF, 0x07BF, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06DF, 0x06BF, 0x069F, 0x069F, 0x067F, 0x067F, 0x067F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x067F, 0x065F, 0x065F, 0x067F, 0x067F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x06DF, 0x06BF, 0x069F, 0x065F, 0x05FF, 0x053F, 0x049F, 0x1BBE, 0x8298, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xD1F3, 0x99B6, 0xC9F3, 0xC9F3, 0xB254, 0x0D9F, 0x067F, 0x06DF, 0x06FF, 0x0EBF, 0xA2D5, 0xC9D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011A, 0x10F5, 0x20CE, 0x20CF, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xBB35, 0xD395, 0xD396, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xAC37, 0x6D9A, 0x2EFE, 0x07FF, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x075F, 0x073F, 0x071F, 0x06DF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x065F, 0x063F, 0x063F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x05FF, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x063F, 0x063F, 0x063F, 0x065F, 0x065F, 0x065F, 0x065F, 0x067F, 0x067F, 0x063F, 0x05DF, 0x055F, 0x04BF, 0x043F, 0x037F, 0x1ABE, 0x7A18, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC1F4, 0x7178, 0xC9F2, 0xD1F3, 0x8338, 0x061F, 0x06BF, 0x06FF, 0x071F, 0x0EDF, 0xA2D5, 0xC9B3, 0xC9B3, 0xC9B2, 0xC992, 0xC992, 0xC993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x20AD, 0x20AE, 0x20AE, 0x18CE, 0x0918, 0x011A, 0x011A, 0x0919, 0x011A, 0x0917, 0x20CF, 0x28AE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xA2B4, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xC3B6, 0x8519, 0x4E3C, 0x0F9F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x06FF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x063F, 0x061F, 0x061F, 0x05FF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05FF, 0x05FF, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x05DF, 0x057F, 0x04FF, 0x047F, 0x03DF, 0x031F, 0x025F, 0x19DE, 0x79B8, 0xC9F3, 0xCA13, 0xC9F3, 0xB9D3, 0xA1B5, 0xC9D3, 0xC9F3, 0x4C5B, 0x065F, 0x06DF, 0x071F, 0x071F, 0x0EDF, 0xA2B5, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC993, 0xC992, 0xB172, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30EF, 0x28EF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x10F3, 0x10F3, 0x10D2, 0x20AE, 0x18AE, 0x20AE, 0x18CE, 0x20CE, 0x20CE, 0x20CE, 0x18F2, 0x10F4, 0x1114, 0x18F3, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xA2B5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xC3B5, 0x7D59, 0x36BD, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x071F, 0x06DE, 0x069E, 0x067E, 0x065E, 0x063F, 0x063F, 0x061E, 0x05FF, 0x05DF, 0x05BF, 0x05BF, 0x059F, 0x059F, 0x059F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x059F, 0x059F, 0x059F, 0x05BF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x057F, 0x04FF, 0x049F, 0x03FF, 0x037F, 0x02BF, 0x021F, 0x017F, 0x213D, 0x9996, 0xC9F3, 0xC9F3, 0xB9D4, 0x99B6, 0xC9D3, 0xC213, 0x0DBF, 0x069F, 0x06FF, 0x071F, 0x073F, 0x0EFF, 0xA2B5, 0xC992, 0xC992, 0xC992, 0xC992, 0xC972, 0xC972, 0xA972, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AE, 0x18CE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AF, 0x20CE, 0x28CE, 0x28CF, 0x28EF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xAAB5, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0x94D8, 0x467C, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x06DE, 0x06BE, 0x067E, 0x067E, 0x065E, 0x063E, 0x061E, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x059F, 0x057F, 0x057F, 0x055F, 0x055F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x055F, 0x055F, 0x055F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x055F, 0x04FF, 0x04BF, 0x041F, 0x039F, 0x031F, 0x025F, 0x01BF, 0x013F, 0x00BF, 0x40FB, 0xB1B5, 0xC9D2, 0xB1D5, 0xB1D4, 0xC9B3, 0x6399, 0x061F, 0x06DF, 0x071F, 0x073F, 0x073F, 0x0EFF, 0xA2B5, 0xC992, 0xC992, 0xC972, 0xC972, 0xC992, 0xC972, 0xB152, 0x4111, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CF, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30D0, 0x28F0, 0x3110, 0x30F0, 0x30F0, 0x30F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4A16, 0xA2B5, 0xD395, 0xD395, 0xD395, 0xD375, 0x8539, 0x1F5E, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x07BF, 0x075F, 0x06BE, 0x069D, 0x067D, 0x065D, 0x063D, 0x063D, 0x061D, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055F, 0x053F, 0x053F, 0x051F, 0x051F, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x051F, 0x051F, 0x051F, 0x051F, 0x051F, 0x051F, 0x053F, 0x053F, 0x051F, 0x04DF, 0x04BF, 0x043F, 0x03DF, 0x035F, 0x02BF, 0x021F, 0x017F, 0x00FF, 0x009F, 0x087F, 0x7119, 0xC9D3, 0xB1D4, 0xB9D3, 0xC9B3, 0x1CFE, 0x065F, 0x06FF, 0x071F, 0x073F, 0x073F, 0x1EBE, 0xB9F3, 0xC993, 0xC972, 0xC992, 0xC972, 0xC973, 0xC952, 0xB152, 0x4111, 0x3910, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20CD, 0x20CE, 0x20AE, 0x20AE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4A15, 0x3439, 0x16BD, 0x8519, 0xD395, 0xD395, 0xD395, 0x94D8, 0x1F5E, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x071E, 0x069D, 0x069D, 0x067D, 0x065D, 0x063D, 0x063D, 0x061D, 0x05FD, 0x05DD, 0x05BD, 0x059D, 0x059E, 0x057E, 0x055E, 0x053E, 0x051E, 0x04FF, 0x04FF, 0x04DF, 0x04BF, 0x04BF, 0x04BF, 0x049F, 0x049F, 0x049F, 0x049F, 0x049F, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04DF, 0x04BF, 0x04DF, 0x04DF, 0x04DF, 0x04BF, 0x049F, 0x043F, 0x03DF, 0x035F, 0x02FF, 0x025F, 0x01BF, 0x013F, 0x00DF, 0x007F, 0x005F, 0x185E, 0x8957, 0x61B9, 0xC9D3, 0x9A96, 0x059F, 0x067F, 0x06FF, 0x071F, 0x073F, 0x075F, 0x267D, 0xB9D3, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC952, 0xB152, 0x4111, 0x38F1, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18CF, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x00F6, 0x18CE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x38F1, 0x38F1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69B4, 0x6336, 0x6CD9, 0x4E5B, 0x07DF, 0x8539, 0xD395, 0xD395, 0xBC17, 0x3E9C, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07DF, 0x06BD, 0x069C, 0x069C, 0x067C, 0x065C, 0x065C, 0x063C, 0x061C, 0x05FC, 0x05DC, 0x05BC, 0x05BD, 0x059D, 0x057D, 0x055D, 0x053E, 0x051E, 0x04FE, 0x04DE, 0x04BE, 0x04BF, 0x049F, 0x047F, 0x047F, 0x047F, 0x045F, 0x045F, 0x045F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x049F, 0x047F, 0x045F, 0x041F, 0x03DF, 0x037F, 0x031F, 0x029F, 0x021F, 0x017F, 0x011F, 0x00BF, 0x005F, 0x001F, 0x001F, 0x00FF, 0x89B7, 0xC9B3, 0x447B, 0x065F, 0x06BF, 0x071F, 0x073F, 0x073F, 0x075F, 0x3D9B, 0xC972, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xA132, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x20CD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x011A, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3931, 0x40F1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61B3, 0x9274, 0xB2F5, 0xC355, 0xD395, 0xD395, 0xD395, 0xBC16, 0x469D, 0x8539, 0xD376, 0xD375, 0x6DBA, 0x0F9F, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x077F, 0x06BC, 0x06BB, 0x069B, 0x067B, 0x065B, 0x063B, 0x063B, 0x061B, 0x05FB, 0x05DB, 0x05BB, 0x059C, 0x059C, 0x057C, 0x055C, 0x053D, 0x051D, 0x04FD, 0x04DD, 0x04BE, 0x049E, 0x047F, 0x047F, 0x045F, 0x043F, 0x043F, 0x041F, 0x041F, 0x041F, 0x041F, 0x041F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x041F, 0x03FF, 0x03BF, 0x037F, 0x033F, 0x02BF, 0x023F, 0x01DF, 0x015F, 0x00DF, 0x009F, 0x005F, 0x001F, 0x005F, 0x097F, 0xB9B3, 0xB214, 0x0DBF, 0x06FF, 0x075F, 0x073F, 0x073F, 0x075F, 0x077F, 0x6479, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC932, 0x9132, 0x3911, 0x3111, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F4, 0x20CD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x28F0, 0x30F0, 0x3110, 0x38F0, 0x38F1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xC335, 0xD395, 0xD395, 0xD395, 0xD395, 0xAC57, 0x7D7A, 0x469C, 0x0F9F, 0xA4B8, 0xD395, 0x8539, 0x1F5E, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x075D, 0x06BB, 0x06BB, 0x069A, 0x067A, 0x065A, 0x065A, 0x063A, 0x061A, 0x05FA, 0x05DA, 0x05DB, 0x05BB, 0x059B, 0x057B, 0x055B, 0x053C, 0x053C, 0x051C, 0x04FC, 0x04DD, 0x04BD, 0x047E, 0x047E, 0x045E, 0x043F, 0x041F, 0x03FF, 0x03FF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03BF, 0x035F, 0x031F, 0x02DF, 0x027F, 0x01FF, 0x019F, 0x011F, 0x00BF, 0x007F, 0x003F, 0x001F, 0x009F, 0x39DB, 0xC992, 0x6399, 0x069F, 0x079F, 0x07FF, 0x07DF, 0x07BF, 0x077F, 0x079F, 0x9AF6, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC932, 0x7112, 0x3110, 0x30F0, 0x30EF, 0x28F0, 0x28EF, 0x28CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20AE, 0x18CF, 0x00F9, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08D3, 0x10D2, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xCB75, 0xD395, 0xD395, 0xD395, 0xC3D6, 0x6DBA, 0x1F7E, 0x07FF, 0x07FF, 0x36DD, 0xBC17, 0x8539, 0x1F5E, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x071B, 0x06DA, 0x06BA, 0x06BA, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05F9, 0x05DA, 0x05BA, 0x059A, 0x057A, 0x055A, 0x055B, 0x053B, 0x051B, 0x04FC, 0x04DC, 0x04BC, 0x049D, 0x047D, 0x045D, 0x043E, 0x041E, 0x03FE, 0x03DF, 0x03DF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x037F, 0x035F, 0x031F, 0x02DF, 0x027F, 0x023F, 0x01BF, 0x015F, 0x00FF, 0x009F, 0x005F, 0x001F, 0x003F, 0x011F, 0x99B6, 0xB9D3, 0x0D9F, 0x06DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F7E, 0xB9B3, 0xC952, 0xC952, 0xC952, 0xC952, 0xC931, 0xC932, 0xC132, 0x6111, 0x38F0, 0x30F0, 0x28F0, 0x30EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18CE, 0x08F5, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xA2B4, 0xD395, 0xD375, 0xD395, 0xD395, 0xC3D6, 0x6DBA, 0x0FBF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x1F7E, 0x07DF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x06F9, 0x06F9, 0x06D9, 0x06B8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05F8, 0x05D8, 0x05B8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051A, 0x04FA, 0x04DB, 0x04BB, 0x049C, 0x047C, 0x045D, 0x043D, 0x041E, 0x03FE, 0x03DE, 0x03BF, 0x039F, 0x039F, 0x037F, 0x037F, 0x037F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02BF, 0x027F, 0x023F, 0x01FF, 0x019F, 0x013F, 0x00BF, 0x007F, 0x003F, 0x001F, 0x005F, 0x197E, 0xB993, 0x6379, 0x063F, 0x073F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x3DFB, 0xC952, 0xC952, 0xC932, 0xC932, 0xC932, 0xC932, 0xC912, 0xB912, 0x4111, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x08F6, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x20AE, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79F3, 0xB2F4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x94F9, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x079D, 0x0719, 0x06F8, 0x06F8, 0x06D7, 0x06B7, 0x06B7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05F7, 0x05D7, 0x05B7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04F9, 0x04DA, 0x04BB, 0x049B, 0x047C, 0x043C, 0x041D, 0x041D, 0x03FE, 0x03DE, 0x03BE, 0x039E, 0x037F, 0x035F, 0x035F, 0x033F, 0x031F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02DF, 0x02BF, 0x029F, 0x027F, 0x023F, 0x01FF, 0x019F, 0x015F, 0x00FF, 0x009F, 0x005F, 0x003F, 0x001F, 0x00BF, 0x59BA, 0xB9B3, 0x0D3F, 0x06BF, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7438, 0xC952, 0xC132, 0xC932, 0xC932, 0xC932, 0xC911, 0xC912, 0xA111, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x08F5, 0x011A, 0x0119, 0x00FA, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x5151, 0x79F3, 0xA2B4, 0xCB75, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xC3D6, 0x469C, 0x07FF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0xC335, 0x45D7, 0x0738, 0x0717, 0x06F6, 0x06F6, 0x06D6, 0x06B5, 0x06B5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05F5, 0x05F5, 0x05D6, 0x05B6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04F9, 0x04D9, 0x049A, 0x047B, 0x045B, 0x043C, 0x041C, 0x03DD, 0x03DD, 0x03BE, 0x039E, 0x037E, 0x035F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x027F, 0x025F, 0x021F, 0x01FF, 0x01BF, 0x017F, 0x011F, 0x00DF, 0x009F, 0x003F, 0x001F, 0x003F, 0x013F, 0xB174, 0x6339, 0x05FF, 0x071F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xB992, 0xC932, 0xC932, 0xC931, 0xC912, 0xC912, 0xC912, 0xC911, 0x8111, 0x30F0, 0x30F0, 0x28EF, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20D0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08F5, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F9, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x59B2, 0x7A13, 0x9A94, 0xBB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xAC77, 0x2F1E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BC, 0x0759, 0xABB5, 0xC314, 0x1E97, 0x0736, 0x0716, 0x0715, 0x06F4, 0x06F4, 0x06F3, 0x06D3, 0x06B3, 0x06B2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05F4, 0x05D4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04F8, 0x04B9, 0x0499, 0x045A, 0x043B, 0x041B, 0x03FC, 0x03DD, 0x03BD, 0x039D, 0x037E, 0x035E, 0x033E, 0x033F, 0x031F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x029F, 0x027F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x021F, 0x01DF, 0x019F, 0x017F, 0x013F, 0x00FF, 0x009F, 0x007F, 0x003F, 0x001F, 0x007F, 0x399B, 0xB993, 0x055F, 0x067F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x45DB, 0xC132, 0xC932, 0xC912, 0xC132, 0xC912, 0xC912, 0xC911, 0xC912, 0x5111, 0x38F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18CE, 0x10D3, 0x10F4, 0x18D0, 0x18AD, 0x18AE, 0x20CD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x20CD, 0x20AE, 0x20AD, 0x20AE, 0x18CE, 0x20AE, 0x20CE, 0x20CE, 0x28AE, 0x20CE, 0x28EE, 0x5171, 0x69D2, 0x8232, 0xAAF4, 0xC334, 0xD375, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x757A, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BD, 0x079B, 0x077A, 0x0779, 0x74D6, 0xD2D4, 0x9BF5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06F0, 0x06F0, 0x06D0, 0x06AF, 0x06AF, 0x066F, 0x0650, 0x0631, 0x0611, 0x05D2, 0x0594, 0x0554, 0x0515, 0x04F7, 0x04B8, 0x0478, 0x0459, 0x043A, 0x03FB, 0x03BC, 0x03BC, 0x039D, 0x037D, 0x035E, 0x033E, 0x031F, 0x031F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x027F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x013F, 0x011F, 0x00BF, 0x007F, 0x005F, 0x001F, 0x001F, 0x00DF, 0xA175, 0x33BC, 0x05DF, 0x06FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x92D5, 0xC911, 0xC132, 0xC912, 0xC912, 0xC8F2, 0xC112, 0xC912, 0xA8F1, 0x3110, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x10CF, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x390F, 0x4970, 0x59B0, 0x7A32, 0x9293, 0xAAD3, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0x9CB8, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DE, 0x07DD, 0x07BC, 0x079B, 0x079A, 0x079A, 0x0779, 0x55B7, 0xD2B4, 0xD2B4, 0x4DB5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074F, 0x074E, 0x074D, 0x074D, 0x074C, 0x072B, 0x072B, 0x072A, 0x070A, 0x06EA, 0x06AC, 0x064D, 0x05D0, 0x0573, 0x04F5, 0x04B6, 0x0478, 0x0438, 0x041A, 0x03FB, 0x03BC, 0x039C, 0x037C, 0x033D, 0x033D, 0x031E, 0x02FE, 0x02FF, 0x02DF, 0x02BF, 0x029F, 0x029F, 0x027F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x009F, 0x005F, 0x003F, 0x001F, 0x003F, 0x213D, 0x1B1E, 0x051F, 0x065F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F3D, 0xC912, 0xC912, 0xC112, 0xC112, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0x80F1, 0x30F0, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x00F9, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x392F, 0xD395, 0xC374, 0xA2D3, 0xAAD3, 0x7A31, 0x7A31, 0x7A11, 0x7231, 0x5190, 0x496F, 0x496F, 0x4970, 0x496F, 0x494F, 0x412F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4970, 0x494F, 0x496F, 0x496F, 0x69F1, 0x7A31, 0x7A31, 0x9272, 0xA2D3, 0xAAF3, 0xC355, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD375, 0xD395, 0xAC57, 0x565C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DE, 0x07BD, 0x07BC, 0x07BC, 0x07BB, 0x079A, 0x079A, 0x0799, 0x26B8, 0xCAD4, 0xD2B4, 0xC314, 0x0F35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078F, 0x078E, 0x078E, 0x078D, 0x078C, 0x07AA, 0x07A9, 0x07A9, 0x07A8, 0x07C7, 0x07C5, 0x07C4, 0x07E4, 0x07A4, 0x0727, 0x068A, 0x05AF, 0x0496, 0x0438, 0x03F9, 0x03BA, 0x039B, 0x035C, 0x035D, 0x031D, 0x031D, 0x02FE, 0x02DF, 0x02BF, 0x02BF, 0x029F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x00FF, 0x00DF, 0x00BF, 0x007F, 0x005F, 0x001F, 0x001F, 0x007F, 0x023F, 0x041F, 0x05BF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6498, 0xC911, 0xC912, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8D1, 0x50F1, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0117, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC3D6, 0x8539, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DE, 0x07BD, 0x07BD, 0x07BC, 0x07BC, 0x07BB, 0x07BA, 0x07BA, 0x07B9, 0xD2B4, 0xD2B4, 0xD2B4, 0x6535, 0x07B5, 0x07B5, 0x07B4, 0x07B3, 0x07B2, 0x07B1, 0x07B0, 0x07AF, 0x07CE, 0x07CD, 0x07CC, 0x07CB, 0x07CA, 0x07CA, 0x07C9, 0x07E8, 0x07E7, 0x07E6, 0x07E5, 0x07E5, 0x07E3, 0x07E3, 0x07E2, 0x07E1, 0x0726, 0x060C, 0x04B4, 0x03B9, 0x037B, 0x035C, 0x033D, 0x031D, 0x02DE, 0x02DF, 0x02BE, 0x029F, 0x029F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x019F, 0x019F, 0x015F, 0x015F, 0x013F, 0x00FF, 0x00DF, 0x00BF, 0x007F, 0x007F, 0x003F, 0x001F, 0x001F, 0x011F, 0x02FF, 0x04DF, 0x063F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xB972, 0xC8F2, 0xC8F2, 0xC0F1, 0xC8F2, 0xC0F2, 0xC0F1, 0xC8D1, 0xA0F1, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x10CF, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x412F, 0x8A72, 0xC334, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xAC57, 0x469C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x467C, 0x8519, 0x8519, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DE, 0x07DE, 0x07DE, 0x07DD, 0x07DC, 0x07DC, 0x07DB, 0x07DB, 0x07DA, 0x07DA, 0x9BF5, 0xD2B4, 0xD2B4, 0xC2F4, 0x0F77, 0x07D6, 0x07D5, 0x07D4, 0x07D4, 0x07D3, 0x07D2, 0x07D1, 0x07D0, 0x07EF, 0x07EE, 0x07ED, 0x07EC, 0x07EC, 0x07EA, 0x07E9, 0x07E9, 0x07E7, 0x07E6, 0x07E6, 0x07E5, 0x07E5, 0x07E4, 0x07E4, 0x07E3, 0x07E3, 0x07E2, 0x0785, 0x060C, 0x04D3, 0x035B, 0x031C, 0x02DE, 0x02DE, 0x02BE, 0x029F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x001F, 0x001F, 0x003F, 0x01DF, 0x03BF, 0x059F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D7A, 0xC111, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0D1, 0xC8D1, 0x68F1, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x414F, 0x61D1, 0x8251, 0xA2D3, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xBC16, 0x8539, 0x469C, 0x17BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8518, 0xD355, 0xD355, 0xD335, 0xD335, 0x84F8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DE, 0x07FE, 0x07DD, 0x07DD, 0x07BC, 0x07DC, 0x07DB, 0x07DB, 0x07DA, 0x8C56, 0xCAB4, 0xCAB4, 0xD294, 0x4DF7, 0x07D7, 0x07D7, 0x07D6, 0x07F5, 0x07D5, 0x07F3, 0x07F3, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EE, 0x07ED, 0x07EC, 0x07EB, 0x07EB, 0x07EA, 0x07E9, 0x07E8, 0x07E8, 0x07E7, 0x07E7, 0x07E6, 0x07E6, 0x07E5, 0x07E5, 0x07E5, 0x07E5, 0x07E4, 0x07A6, 0x060E, 0x03F8, 0x02DE, 0x02BE, 0x029F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x003F, 0x001F, 0x001F, 0x00BF, 0x029F, 0x049F, 0x063F, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB1D3, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8D1, 0xC8D1, 0xC0F1, 0xC8D1, 0xB8D1, 0x40F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0x496F, 0x5990, 0x7A12, 0x7A32, 0x9272, 0xA2D3, 0xA2D3, 0xC375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAC77, 0x757A, 0x36FD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4E3C, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD334, 0x7539, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07DD, 0x07DD, 0x07DD, 0x07DC, 0x07FC, 0x07DC, 0x07DB, 0x6D38, 0xCAB4, 0xD294, 0xD294, 0xAB95, 0x07D8, 0x07D8, 0x07F7, 0x07F7, 0x07F6, 0x07F5, 0x07F5, 0x07F4, 0x07F3, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EE, 0x07ED, 0x07ED, 0x07EC, 0x07EC, 0x07EB, 0x07EA, 0x07EA, 0x07EA, 0x07E9, 0x07E9, 0x07E8, 0x07E8, 0x07E8, 0x07E8, 0x07E7, 0x07E7, 0x07E8, 0x07C8, 0x06EB, 0x0514, 0x033C, 0x027F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x005F, 0x005F, 0x003F, 0x001F, 0x001F, 0x015F, 0x037F, 0x057F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D5A, 0xC8F1, 0xC8D1, 0xC0F1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0xC8B1, 0x78D1, 0x3110, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x496F, 0x496F, 0x4970, 0x7A12, 0x7A31, 0x8252, 0xAAD3, 0xA2D3, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCBD6, 0x94F8, 0x565B, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB3F6, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD334, 0x1F7E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DE, 0x07DD, 0x07FD, 0x07FD, 0x07FD, 0x07DD, 0x07DC, 0x6D38, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0x1F39, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F6, 0x07F5, 0x07F4, 0x07F3, 0x07F2, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EF, 0x07EE, 0x07EE, 0x07ED, 0x07ED, 0x07EC, 0x07ED, 0x07EC, 0x07EB, 0x07EC, 0x07EB, 0x07EB, 0x07EA, 0x07EA, 0x07EA, 0x07CA, 0x07AB, 0x076C, 0x070D, 0x05B2, 0x039B, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00DF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x001F, 0x60D9, 0x0A3F, 0x047F, 0x063F, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA9D3, 0xC0D1, 0xC8D1, 0xC0F1, 0xC8B1, 0xC0D1, 0xC8B1, 0xC0B1, 0xB8B1, 0x48F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18CD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4970, 0x4970, 0x5990, 0x7A31, 0x7231, 0x7A31, 0x7A31, 0x9AB3, 0xAAD4, 0xA2D4, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0x94F8, 0x565C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD315, 0x5DDB, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x6D58, 0xD294, 0xD293, 0xCA94, 0xD274, 0x4DF8, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F8, 0x07F7, 0x07F6, 0x07F6, 0x07F5, 0x07F5, 0x07F4, 0x07F3, 0x07F3, 0x07F2, 0x07F1, 0x07F1, 0x07F0, 0x07F0, 0x07F0, 0x07EF, 0x07EF, 0x07EF, 0x07EF, 0x07EF, 0x07EE, 0x07EE, 0x07EE, 0x07EE, 0x07EE, 0x07ED, 0x07CD, 0x078E, 0x076E, 0x0710, 0x06B1, 0x0574, 0x037B, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x017F, 0x013F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x001F, 0x88D6, 0x6159, 0x031F, 0x053F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D5B, 0xC0D1, 0xC8D1, 0xC8D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B1, 0x90D1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CF, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x011A, 0x10D1, 0x18AD, 0x18AD, 0x10D1, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x10CF, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18CE, 0x18AD, 0x20AE, 0x20AD, 0x20CE, 0x20CE, 0x290F, 0x5170, 0x5170, 0x69F1, 0x7A32, 0x8232, 0xAAF3, 0xAAF4, 0xCB75, 0xD395, 0xD396, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xC3B6, 0x8539, 0x1F7F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD315, 0xD314, 0xD314, 0x659A, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x6D39, 0xD294, 0xCA94, 0xD274, 0xCA74, 0x7C96, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F6, 0x07F6, 0x07F5, 0x07F4, 0x07F4, 0x07F3, 0x07F3, 0x07F3, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F1, 0x07F1, 0x07F1, 0x07F1, 0x07F0, 0x07F1, 0x07D0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02DD, 0x01BF, 0x019F, 0x017F, 0x015F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x00BF, 0x007F, 0x005F, 0x005F, 0x003F, 0x003F, 0x001F, 0x60B8, 0xB8F3, 0x09BF, 0x041F, 0x061F, 0x073F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB1B3, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0x48F1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F9, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x00F9, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x00F7, 0x011A, 0x011A, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x5172, 0x61B2, 0x8A54, 0x9A94, 0xB335, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0x9C97, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xAC17, 0xD335, 0xD314, 0xD335, 0xD314, 0xD315, 0xD315, 0xD2F4, 0x467C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6D59, 0xD274, 0xCA94, 0xD274, 0xCA74, 0xB334, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FB, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F6, 0x07F6, 0x07F6, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F4, 0x07F4, 0x07F4, 0x07D3, 0x07B3, 0x0793, 0x0753, 0x0714, 0x06B5, 0x5516, 0x0538, 0x037C, 0x01FF, 0x017F, 0x015F, 0x013F, 0x011F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x6099, 0xC911, 0x491A, 0x02DF, 0x051F, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6459, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x90D1, 0x30F1, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69D3, 0x9274, 0xB2F5, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xA478, 0x36DD, 0x07FF, 0x07FF, 0x563C, 0xD335, 0xD334, 0xD315, 0xD315, 0xD2F4, 0xCB15, 0xBB96, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8498, 0xCA94, 0xCA94, 0xD274, 0xCA74, 0xCA74, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F6, 0x07F6, 0x07D6, 0x07B6, 0x0796, 0x0756, 0x0716, 0xA456, 0xBBD6, 0x3479, 0x02FD, 0x023F, 0x019F, 0x015F, 0x011F, 0x00FF, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x003F, 0x78B7, 0xC111, 0xA114, 0x01FF, 0x041F, 0x05FF, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xC0B1, 0xC0D2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x48F1, 0x30F0, 0x30EF, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18CE, 0x08F7, 0x0119, 0x00F8, 0x10CF, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x20CD, 0x20CD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71F4, 0x9A75, 0xB2F5, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0x9C78, 0x36DD, 0x07FF, 0x9C57, 0xD335, 0xD315, 0xD334, 0xD314, 0xC355, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9BF7, 0xCA94, 0xD274, 0xCA73, 0xCA74, 0xD253, 0x2EFD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F9, 0x07F8, 0x07D8, 0x07B8, 0x0797, 0x0758, 0x0EF8, 0xBBF6, 0xD395, 0x6B99, 0x025F, 0x021F, 0x01BF, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x98D5, 0xC8F2, 0xC911, 0x195E, 0x033F, 0x053F, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7B76, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0x88D1, 0x30F1, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x10D2, 0x00F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08D5, 0x10D0, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00FA, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8A16, 0xAAD5, 0xCB55, 0xD375, 0xD355, 0xD354, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xCB35, 0x84F9, 0x0FBF, 0x5DDB, 0xA457, 0x9C58, 0x84D8, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9BD6, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FC, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07DA, 0x07DA, 0x07BA, 0x079A, 0x0779, 0x2E99, 0xC3D6, 0xD395, 0x8339, 0x0A3E, 0x01DF, 0x019F, 0x015F, 0x011F, 0x00FF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x007F, 0x003F, 0x003F, 0x003F, 0x90D5, 0xC912, 0xC0F1, 0x7117, 0x027F, 0x049F, 0x065F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x269D, 0xC891, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8B1, 0x3110, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x011A, 0x00F9, 0x10D0, 0x18AD, 0x20AD, 0x20AD, 0x10D1, 0x00F8, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x10D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18CE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28EF, 0x28CF, 0x28EF, 0x28D0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8B14, 0x4AD3, 0x7A94, 0xAB14, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD315, 0xD314, 0xD335, 0xC355, 0x467C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xC2D4, 0xCA74, 0xCA74, 0xD274, 0xCA74, 0xD253, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07DB, 0x07BB, 0x07BB, 0x077B, 0x2EBA, 0xC3D6, 0xD395, 0xB337, 0x09DF, 0x01BF, 0x017F, 0x013F, 0x011F, 0x00DF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x003F, 0x7896, 0xC0F1, 0xC8F1, 0xA8F3, 0x01DF, 0x03DF, 0x05BF, 0x071F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA214, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0x68F1, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0139, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x20AD, 0x18AD, 0x08F4, 0x0119, 0x011A, 0x0119, 0x08F6, 0x10D2, 0x10D0, 0x18CF, 0x18D0, 0x10D3, 0x0118, 0x0119, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20EF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9A75, 0xCB55, 0xCB75, 0x5BB4, 0x3B34, 0x42B3, 0x4A33, 0x6253, 0x9AB4, 0xD335, 0xD335, 0xD315, 0xD334, 0xD314, 0xD315, 0xD314, 0xD314, 0x5DDB, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F5E, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xCA53, 0x369D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07DD, 0x07DD, 0x07BD, 0x079C, 0x561A, 0xD395, 0xD395, 0xAB37, 0x099F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x005F, 0x003F, 0x003F, 0x305C, 0xC0F1, 0xC8F1, 0xC8D1, 0x215D, 0x033F, 0x051F, 0x06DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5CD9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x98D1, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0117, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x08F3, 0x0118, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F8, 0x011A, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xCB55, 0xD375, 0xBB95, 0x5474, 0x3C34, 0x3BB4, 0x4333, 0x42B3, 0x4A13, 0x49F3, 0x5A32, 0x9AB4, 0xD334, 0xD335, 0xD314, 0xD314, 0xD315, 0xD314, 0xD2F4, 0x84D8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4DDB, 0xD274, 0xCA74, 0xCA73, 0xD274, 0xCA54, 0xCA54, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07DD, 0x07DE, 0x079D, 0x6D99, 0xD395, 0xD395, 0xAB17, 0x097F, 0x011F, 0x011F, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x003F, 0x003F, 0x003F, 0xC8F1, 0xC8F1, 0xC8D1, 0x5119, 0x02DF, 0x04FF, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F1E, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x4910, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x20AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18D0, 0x00F8, 0x0119, 0x00F8, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xCB55, 0xD375, 0xD375, 0xB3D5, 0x3D55, 0x3515, 0x3495, 0x3C14, 0x3B94, 0x3B13, 0x4293, 0x4212, 0x49F3, 0x49F3, 0x5A13, 0x9AB4, 0xD314, 0xD315, 0xCB15, 0xD2F4, 0xD2F5, 0xD2F4, 0x7539, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8C37, 0xCA74, 0xD273, 0xD253, 0xCA54, 0xCA53, 0xD253, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DF, 0x07DF, 0x94D8, 0xD396, 0xD395, 0x8299, 0x00FF, 0x00FF, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0xC8D1, 0xC0F1, 0xC0D1, 0xA0D4, 0x027F, 0x04BF, 0x069F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8315, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x70F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0117, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x10D3, 0x08F3, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x0117, 0x0119, 0x0119, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x0118, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0117, 0x18AE, 0x20CD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xB2F4, 0xD375, 0xD375, 0xD375, 0x9435, 0x3D55, 0x2D55, 0x2D75, 0x3515, 0x3C94, 0x3414, 0x3B94, 0x4313, 0x4293, 0x4A13, 0x41F3, 0x49F2, 0x4A13, 0x5A33, 0xA2B4, 0xD314, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2F4, 0x4E1B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x179F, 0xD274, 0xCA53, 0xCA73, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9E, 0xBC16, 0xD395, 0xD395, 0x725A, 0x00BF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x90B5, 0xC8D1, 0xC8D1, 0xC0D1, 0x123E, 0x047F, 0x067F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0x90D1, 0x38F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x08F6, 0x011A, 0x0119, 0x0118, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0118, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F9, 0x00F9, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x38F0, 0x30F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xCB55, 0xD375, 0xD375, 0xD355, 0x9435, 0x3575, 0x3575, 0x2D75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3BF4, 0x3B73, 0x42F4, 0x4273, 0x4A13, 0x4213, 0x49F2, 0x49F3, 0x49F3, 0x6A33, 0xBAD4, 0xD2F5, 0xD2F4, 0xD2D4, 0xC335, 0x177E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5D9A, 0xCA54, 0xD273, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0x9BB6, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x077F, 0x077E, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x36DD, 0xD395, 0xD395, 0xD395, 0x51BC, 0x009F, 0x009F, 0x007F, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x7077, 0xC0D2, 0xC8D1, 0xC0D1, 0x49FA, 0x049F, 0x069F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F1E, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0x3910, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x0118, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x08F5, 0x20AD, 0x18CD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x10F3, 0x10D2, 0x20AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18CE, 0x08F7, 0x0119, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4952, 0xAAB4, 0xD375, 0xD375, 0xD375, 0xD355, 0x9435, 0x3575, 0x3575, 0x2D75, 0x2D75, 0x2D75, 0x3555, 0x54D5, 0x6475, 0x83B5, 0x8B74, 0x9B34, 0xAB14, 0xAAD4, 0xB2D4, 0xAAD4, 0xAAB4, 0xAAB4, 0xB2B4, 0x6B15, 0x8A94, 0xC2D4, 0xD2F4, 0xD2D4, 0x84B8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB315, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0x653A, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x075F, 0x075F, 0x073F, 0x073F, 0x071F, 0x071E, 0x071E, 0x073E, 0x079F, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7D7A, 0xD395, 0xD395, 0xC375, 0x28FE, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x005F, 0x003F, 0x003F, 0x183E, 0xC0D1, 0xC0D1, 0xC0D2, 0x7996, 0x04BF, 0x067F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA214, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0x58F1, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AF, 0x0119, 0x0119, 0x08F6, 0x20AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0118, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F7, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0139, 0x0119, 0x10F3, 0x18D0, 0x08F5, 0x0119, 0x0119, 0x18D0, 0x18AE, 0x18AE, 0x18CD, 0x0119, 0x011A, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AD, 0x18CD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0117, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x5972, 0xCB55, 0xD375, 0xD375, 0xD375, 0xD375, 0xABD5, 0x4515, 0x54F5, 0x7C75, 0x8C35, 0xABD5, 0xCB55, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xC355, 0x9C37, 0x659A, 0x467C, 0x0FBF, 0x07FF, 0x07FF, 0x269D, 0x9C17, 0xD2D4, 0x9C17, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5D9A, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0x26DD, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x071E, 0x071E, 0x06FE, 0x06FE, 0x06FF, 0x06DE, 0x06DE, 0x06BE, 0x06BE, 0x06DE, 0x073E, 0x079F, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x079F, 0x077F, 0x079F, 0x079F, 0x077F, 0x079F, 0x079F, 0x079F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0xC3F6, 0xD395, 0xD395, 0xAAF7, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x001F, 0x001F, 0xA094, 0xC0D1, 0xC8B1, 0xA8F3, 0x04BF, 0x069F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x73D8, 0xB8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0x78F1, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18CF, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x00F6, 0x0119, 0x08F3, 0x18AD, 0x20AD, 0x20AD, 0x00F6, 0x00F9, 0x08D4, 0x18AD, 0x18AD, 0x18AD, 0x00F8, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x00F6, 0x0119, 0x10D3, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x10CF, 0x0119, 0x00F9, 0x0117, 0x18CE, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x71F2, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xD355, 0xD335, 0xD335, 0xCB14, 0xD334, 0xD334, 0xAC16, 0x753A, 0x467D, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x369C, 0x4E1B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x26FD, 0xC2B4, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA33, 0xCA33, 0xA356, 0x07FF, 0x07FF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x071F, 0x071F, 0x06FF, 0x06FE, 0x06FE, 0x06DE, 0x06BE, 0x06BE, 0x069E, 0x069E, 0x069E, 0x067E, 0x067E, 0x065E, 0x065E, 0x06BE, 0x073E, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x077F, 0x077F, 0x077F, 0x077F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07DF, 0x6DDA, 0xD395, 0xD376, 0xD375, 0x79FA, 0x003F, 0x003F, 0x001F, 0x003F, 0x001F, 0x001F, 0x001F, 0x001F, 0x8896, 0xC0B1, 0xC0B1, 0xC8B1, 0x0C9F, 0x069F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x3DBB, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0x98D1, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x00F6, 0x011A, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x011A, 0x08F3, 0x20AD, 0x18AD, 0x18AD, 0x08F7, 0x0119, 0x08F3, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x9A93, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD355, 0xD335, 0xD335, 0xC375, 0x84F9, 0x4E3C, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xAB75, 0xCA54, 0xD253, 0xCA53, 0xCA33, 0xCA33, 0xD233, 0xCA33, 0x4DBB, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x075F, 0x073F, 0x071F, 0x071F, 0x06FF, 0x06DE, 0x06DE, 0x06DE, 0x06BE, 0x06BE, 0x069E, 0x067E, 0x067E, 0x067E, 0x065E, 0x063E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05FD, 0x067D, 0x06DE, 0x06FE, 0x06FE, 0x06FE, 0x06FE, 0x071E, 0x073F, 0x073F, 0x073F, 0x073E, 0x075F, 0x077F, 0x079F, 0x079F, 0x07BF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x0FBF, 0xC3D6, 0xD375, 0xD375, 0xD355, 0x30FD, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x001F, 0x6058, 0xC0B1, 0xC0B1, 0xC0B1, 0x33FC, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9E, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xC0B1, 0xB8D1, 0xB8D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F6, 0x0119, 0x08D5, 0x18CD, 0x18AE, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x10D3, 0x10D0, 0x08F4, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x3910, 0xAAF4, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xB3D6, 0x7539, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x2EFD, 0xB315, 0xCA53, 0xCA54, 0xCA33, 0xCA53, 0xCA34, 0xCA34, 0xCA33, 0xA335, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DE, 0x06BF, 0x06BE, 0x069E, 0x069E, 0x069E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05BD, 0x05BE, 0x059D, 0x055E, 0x055E, 0x05BE, 0x05FE, 0x061D, 0x067E, 0x06BE, 0x06FE, 0x06FE, 0x071F, 0x071E, 0x073F, 0x073F, 0x075F, 0x077F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x8539, 0xD375, 0xD355, 0xD355, 0xBAF6, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x403B, 0xC8B1, 0xC0B1, 0xC0B1, 0x6318, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA9B3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8D1, 0x4910, 0x3910, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x10D3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F3, 0x011A, 0x0118, 0x18AD, 0x18CD, 0x18AD, 0x18CE, 0x00F8, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x20CD, 0x18AD, 0x10D0, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x011A, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x30CF, 0x3910, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD354, 0xD355, 0xD355, 0xCB96, 0x8518, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBE, 0x653A, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x2E9D, 0x077F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FE, 0x06DF, 0x06DE, 0x06BF, 0x06BE, 0x06BF, 0x069E, 0x067E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05BE, 0x05BE, 0x059E, 0x057E, 0x053E, 0x051E, 0x04FE, 0x04BE, 0x049E, 0x041E, 0x03DD, 0x04DE, 0x065E, 0x06BE, 0x06DE, 0x06DE, 0x06FE, 0x071F, 0x073E, 0x077F, 0x079F, 0x079F, 0x07BF, 0x07DF, 0x07DF, 0x07FF, 0x36DD, 0xD355, 0xD355, 0xD355, 0xD335, 0x699A, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0xB8B2, 0xC091, 0xC0B1, 0x7A96, 0x06BF, 0x079F, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x82F5, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0x60F1, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x20CD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AF, 0x08F6, 0x0119, 0x0119, 0x00F9, 0x08F4, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x00F8, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x08F7, 0x18CE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CF, 0x28CF, 0x28EF, 0x3910, 0xB314, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xBBD6, 0x5DFB, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0x5D9A, 0xB315, 0xD254, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA33, 0xD233, 0xCA33, 0xCA33, 0x64D9, 0x077F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06BF, 0x06BE, 0x069F, 0x069F, 0x067E, 0x065E, 0x065E, 0x063E, 0x063E, 0x061E, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x055E, 0x055E, 0x051E, 0x04FE, 0x04DE, 0x049E, 0x043D, 0x03DE, 0x03BE, 0x039E, 0x037E, 0x03FE, 0x05FE, 0x069E, 0x069E, 0x06BE, 0x06FE, 0x071E, 0x073F, 0x075F, 0x079F, 0x079F, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0xBBF6, 0xD355, 0xD335, 0xD335, 0xC2F5, 0x083F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x9095, 0xC8B1, 0xC8B1, 0x91F5, 0x067F, 0x06FF, 0x073F, 0x075F, 0x077F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0x80F2, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20CD, 0x20AE, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AE, 0x0117, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x00F6, 0x011A, 0x0117, 0x18CE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18D0, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x08F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x3110, 0xB314, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0x9C77, 0x563B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F7E, 0x65DB, 0x7CF9, 0x9C57, 0x9C57, 0x9C57, 0x9C57, 0x9C37, 0x9C37, 0x9C37, 0x9C37, 0x7539, 0x6D7A, 0x6579, 0x5DBB, 0x36BD, 0x36BD, 0x36BC, 0x2EFD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0x36BD, 0x5D9A, 0x8C37, 0xD274, 0xD273, 0xD254, 0xCA53, 0xD254, 0xD253, 0xCA33, 0xD233, 0xCA34, 0xCA13, 0xCA33, 0x8418, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06BF, 0x06BF, 0x069E, 0x069F, 0x067E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x05BE, 0x057E, 0x055E, 0x051E, 0x051E, 0x04FE, 0x04BE, 0x045E, 0x03FE, 0x03BE, 0x039E, 0x037E, 0x037E, 0x035E, 0x033E, 0x035E, 0x061D, 0x067E, 0x067E, 0x069E, 0x06BE, 0x06FE, 0x073F, 0x075F, 0x077F, 0x079F, 0x07DF, 0x07DF, 0x07FF, 0x7D59, 0xD335, 0xD335, 0xD335, 0xD314, 0x699A, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x60D8, 0xC0B1, 0xC0B1, 0xB8F2, 0x05DF, 0x061F, 0x065F, 0x06DF, 0x073F, 0x077F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x363C, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0x90D1, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F8, 0x011A, 0x00F8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CE, 0x30EF, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0x9C77, 0x3EDD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x659A, 0xD315, 0xD314, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2F4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA73, 0xCA73, 0xD274, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xAB15, 0x0EDF, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06BF, 0x06BF, 0x06DF, 0x06BF, 0x069F, 0x069F, 0x067E, 0x067F, 0x067E, 0x065E, 0x063F, 0x061E, 0x061E, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x055E, 0x053E, 0x051E, 0x04FE, 0x04DE, 0x049E, 0x043E, 0x03BE, 0x039E, 0x039E, 0x035E, 0x035E, 0x033E, 0x033E, 0x031E, 0x02FE, 0x037E, 0x05FE, 0x065E, 0x067E, 0x069E, 0x06DE, 0x06FE, 0x075F, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0x271D, 0xD335, 0xD314, 0xD315, 0xD315, 0xC2D5, 0x083F, 0x001F, 0x001F, 0x001F, 0x001F, 0x009F, 0x60D8, 0xC0B1, 0xC0B2, 0xC0B1, 0x04BF, 0x053F, 0x05BF, 0x067F, 0x06DF, 0x075F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0x98D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18CE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x08F7, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D2, 0x0118, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CE, 0x30EF, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xAC37, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x0EBD, 0x1D7B, 0x1C99, 0x32F5, 0x3A75, 0x6193, 0x69B3, 0x79F4, 0x8A14, 0xB294, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xD274, 0xCA53, 0xCA54, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x8B97, 0x35FD, 0x5D7B, 0x6D3A, 0x6D3A, 0x5D5B, 0x35FD, 0x06BF, 0x0E7E, 0x457C, 0x6C99, 0x6479, 0x6459, 0x4CBA, 0x0E1E, 0x063E, 0x063E, 0x061E, 0x05FE, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055E, 0x051E, 0x051E, 0x04FE, 0x04DE, 0x047E, 0x03DE, 0x03BE, 0x037E, 0x037F, 0x035E, 0x033E, 0x033E, 0x031E, 0x02FE, 0x02FE, 0x02FE, 0x02DE, 0x03FE, 0x05BE, 0x063E, 0x065E, 0x069E, 0x06DE, 0x071F, 0x073E, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0xBBB6, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0x697A, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x48FA, 0xC0B1, 0xC0B1, 0xC0B1, 0x331C, 0x047F, 0x053F, 0x05FF, 0x069F, 0x073F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9A14, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20AE, 0x18CF, 0x08F6, 0x011A, 0x0119, 0x0119, 0x08F4, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x0119, 0x08F6, 0x10D2, 0x10D0, 0x18D0, 0x18D1, 0x10D2, 0x00F8, 0x0119, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x9273, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xC3B6, 0x5DFB, 0x07FF, 0x0E3B, 0x1C98, 0x2AD5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79D3, 0x9A54, 0xC294, 0xD2F4, 0xD2D5, 0xCAD4, 0xD2D4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x99D4, 0x6358, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD375, 0x06BF, 0x5CFA, 0xD2B4, 0xCA94, 0xCA33, 0xCA13, 0xC9D3, 0xB9D3, 0x4C5A, 0x061E, 0x061E, 0x05DE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x057E, 0x053E, 0x051E, 0x051D, 0x04DE, 0x04BE, 0x043E, 0x03BE, 0x03BE, 0x037F, 0x0B7E, 0x337C, 0x333C, 0x335C, 0x333C, 0x333C, 0x331C, 0x331C, 0x32FC, 0x32FC, 0x32DC, 0x2B7C, 0x05DE, 0x061E, 0x065E, 0x069E, 0x06DE, 0x071F, 0x073F, 0x077F, 0x07BF, 0x07DF, 0x07DF, 0x84F9, 0xD314, 0xCB14, 0xCAF4, 0xD2D5, 0xB275, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x08DF, 0xB8D2, 0xC0B1, 0xC0B1, 0x3A7B, 0x03FF, 0x04DF, 0x05BF, 0x067F, 0x071F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7B77, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x4111, 0x38F1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20AE, 0x20CF, 0x0918, 0x013A, 0x011A, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0118, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x08F6, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0139, 0x00F9, 0x10D2, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x7A32, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x9C78, 0x261B, 0x1B96, 0x3171, 0x30F0, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81F3, 0xAA73, 0xCAD4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xD274, 0xCA54, 0xD274, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA33, 0xCA33, 0xD233, 0xC234, 0x7994, 0x5975, 0xB315, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xC375, 0x067F, 0x067F, 0x6C79, 0xCA33, 0xCA13, 0xC9D3, 0xC992, 0xC952, 0xC912, 0x34BB, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x055E, 0x055E, 0x053E, 0x051E, 0x04FE, 0x249D, 0x347B, 0x6BFA, 0x7B99, 0x9B98, 0xAB97, 0xDB95, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0xD395, 0xBBD6, 0x9C37, 0x8499, 0x6D1A, 0x363C, 0x1EDD, 0x079F, 0x07BF, 0x07DF, 0x4E1B, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0x40FC, 0x001F, 0x001F, 0x001F, 0x003F, 0x009F, 0x78D7, 0xC0B1, 0xC0B1, 0x61D8, 0x03BF, 0x049F, 0x057F, 0x065F, 0x071F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xB8D1, 0xB8B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x4111, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CF, 0x20AE, 0x10F3, 0x013A, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011A, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18CE, 0x10D2, 0x08F3, 0x08F4, 0x10D1, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x10F2, 0x00F7, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F5, 0x10D0, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x5170, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0x6519, 0x22B3, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79B3, 0xA233, 0xD2B4, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xCA54, 0xD274, 0xD253, 0xCA54, 0xCA54, 0xCA33, 0xD233, 0xCA34, 0xCA33, 0xCA33, 0xA1D3, 0x5954, 0x5954, 0x79F5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD335, 0x8C18, 0x067F, 0x065F, 0x063F, 0xA2D5, 0xC9D3, 0xC972, 0xC952, 0xC111, 0xC8D1, 0x8A55, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055E, 0x34DC, 0x6C5A, 0xA3F7, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xBBB6, 0x84D9, 0x4E1B, 0x465C, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0x81D8, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x6098, 0xC0B1, 0xC0D1, 0x59B8, 0x035F, 0x045F, 0x055F, 0x063F, 0x06FF, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x363C, 0xC0D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x58F1, 0x3911, 0x30F0, 0x3110, 0x30CF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x08F6, 0x013A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F9, 0x08F8, 0x0118, 0x18AD, 0x18AD, 0x18AD, 0x00F8, 0x00F8, 0x08F8, 0x0118, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00FA, 0x00F8, 0x08F7, 0x08F7, 0x18B0, 0x18AD, 0x18AE, 0x08F4, 0x0119, 0x08F8, 0x08F8, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x10D4, 0x10D0, 0x18AD, 0x20AD, 0x08F8, 0x10D3, 0x18AD, 0x18AD, 0x10F4, 0x10D1, 0x18AD, 0x18AD, 0x08F8, 0x00F7, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F8, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20CE, 0x20AE, 0x28EE, 0xCB55, 0xD375, 0xD375, 0xD375, 0xBB14, 0x34F9, 0x2930, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91F2, 0xC254, 0xCA93, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xCA73, 0xD273, 0xCA73, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xCA33, 0xCA34, 0xA1F3, 0x6973, 0x4953, 0x5134, 0x5154, 0xAAF5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD335, 0xD314, 0x5CDA, 0x065F, 0x063F, 0x063F, 0xB254, 0xC972, 0xC952, 0xC112, 0xC8D1, 0xC0B1, 0xC0B1, 0x05BE, 0x059E, 0x2D1C, 0x9438, 0xCBB6, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCA94, 0x087F, 0x003F, 0x001F, 0x001F, 0x001F, 0x385B, 0xC0B1, 0xC0B1, 0x9135, 0x031F, 0x043F, 0x053F, 0x063F, 0x071F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB8D1, 0x5911, 0x3911, 0x38F0, 0x30F0, 0x30CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x0917, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x011A, 0x08F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18CE, 0x0118, 0x0119, 0x011A, 0x00F7, 0x08F7, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x10D1, 0x10D0, 0x18AD, 0x08D5, 0x10D1, 0x18AD, 0x20AE, 0x00F7, 0x18AD, 0x18AE, 0x18AD, 0x08F7, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F8, 0x18AE, 0x18AD, 0x18AE, 0x0118, 0x18AE, 0x18AD, 0x08F4, 0x18D0, 0x18AD, 0x18AD, 0x10D1, 0x10D5, 0x18AE, 0x18AD, 0x08F5, 0x10D1, 0x20AD, 0x18AD, 0x00F8, 0x08F7, 0x18AF, 0x18AD, 0x08D4, 0x10D1, 0x18AD, 0x18AE, 0x18AD, 0x20AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0118, 0x011A, 0x00F9, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18CD, 0x20AE, 0x18AD, 0x20AE, 0x20CE, 0x20CE, 0x8252, 0xD375, 0xD375, 0xD375, 0x9A93, 0x30EF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81D2, 0xAA13, 0xBA33, 0xCA54, 0xCA74, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xB213, 0xA1F3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xD395, 0xD395, 0xD396, 0xD375, 0xD334, 0xD2F5, 0xD2B4, 0x2D9D, 0x063F, 0x063F, 0x061F, 0xC993, 0xC952, 0xC911, 0xC8F1, 0xC0B1, 0xC0B1, 0xB8D1, 0x059E, 0x057E, 0xABF7, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD315, 0xD335, 0xCB15, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0x411C, 0x003F, 0x003F, 0x001F, 0x001F, 0x203C, 0xC0B1, 0xC0B1, 0x9135, 0x02FF, 0x041F, 0x051F, 0x061F, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA1B3, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x68F1, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x10F3, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10F4, 0x08F7, 0x18AD, 0x18AE, 0x18AD, 0x08F8, 0x20AE, 0x18AD, 0x18AD, 0x10D1, 0x10F4, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F7, 0x18AD, 0x18AD, 0x10D1, 0x08F6, 0x18AD, 0x20AD, 0x08F4, 0x10D3, 0x18D1, 0x18D1, 0x08F5, 0x18D2, 0x18AD, 0x20AD, 0x08F4, 0x10D1, 0x18AD, 0x18AD, 0x08F7, 0x18AF, 0x08F7, 0x18AD, 0x08F4, 0x10D1, 0x18AD, 0x18AD, 0x208E, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x0119, 0x011A, 0x011A, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20CE, 0x412F, 0xD375, 0xD375, 0xD375, 0x71D1, 0x20CE, 0x28CF, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3110, 0x38F0, 0x30F0, 0x3111, 0x3111, 0x38F1, 0x38F1, 0x38F0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8A34, 0xD395, 0xD395, 0xD375, 0xD335, 0xD2F4, 0xCAD4, 0xB2F6, 0x065F, 0x061F, 0x061F, 0x34DC, 0xC952, 0xC912, 0xC8D2, 0xC0B1, 0xC0D1, 0xB8D1, 0x89B4, 0x2BBA, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71D4, 0x69F4, 0x71D3, 0x69D4, 0x71D3, 0x7A14, 0x8A75, 0x9274, 0x9254, 0x9254, 0x9A95, 0xB315, 0xBB14, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD315, 0xD2F4, 0xCB14, 0xD2F4, 0xD2F4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2B4, 0xCAB4, 0xCA94, 0xCA94, 0x81B8, 0x005F, 0x005F, 0x003F, 0x001F, 0x001F, 0xA8B3, 0xC0B1, 0xB0D2, 0x02DF, 0x03FF, 0x051F, 0x061F, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8A95, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F2, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CF, 0x0918, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x10D0, 0x00FA, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x08F7, 0x18D1, 0x18AD, 0x20AD, 0x08F8, 0x18AD, 0x18AD, 0x18AD, 0x18D1, 0x08D4, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AE, 0x00FA, 0x08F8, 0x00F7, 0x08F6, 0x18AE, 0x18AD, 0x18AD, 0x08F4, 0x08F6, 0x08D4, 0x08F6, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x10D1, 0x18AE, 0x18AE, 0x08F8, 0x18AD, 0x08F3, 0x10D3, 0x10D5, 0x10D0, 0x18AD, 0x18AD, 0x20AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x20CD, 0x20AE, 0x20CD, 0x9272, 0xD375, 0xC334, 0x61D1, 0x20CF, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x30F0, 0x3110, 0x3110, 0x30F0, 0x3110, 0x38F0, 0x30F0, 0x38F0, 0x3111, 0x38F0, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xB2F5, 0xD395, 0xD375, 0xD355, 0xD2F4, 0xD2B4, 0xD274, 0x83B8, 0x063F, 0x061F, 0x061E, 0x6398, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8B1, 0xB8D1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61B3, 0x7A34, 0x9A95, 0xB2F5, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD274, 0xCA74, 0xC254, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x5878, 0xB8D1, 0xC0B1, 0x02BF, 0x03BF, 0x04FF, 0x05FF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6478, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CF, 0x0917, 0x011A, 0x011A, 0x0119, 0x08F4, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x10F3, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18CE, 0x10D1, 0x18CF, 0x18AD, 0x10D1, 0x10F4, 0x18AD, 0x18AD, 0x08F7, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F8, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x18D1, 0x18AD, 0x18AD, 0x08F6, 0x18CF, 0x18AE, 0x20AE, 0x10D4, 0x18D1, 0x18AD, 0x20AE, 0x00F8, 0x18AD, 0x18AD, 0x08F7, 0x08F6, 0x18B1, 0x18AE, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20CD, 0x18CE, 0x20AE, 0x390F, 0xD375, 0xCB35, 0x414F, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30F0, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x30F0, 0x30EF, 0x3110, 0x30F0, 0x30D0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F1, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3910, 0x3911, 0x38F1, 0x3911, 0x3912, 0x4952, 0xD395, 0xD375, 0xD335, 0xD2F4, 0xD2B4, 0xD274, 0xCA33, 0x4C9A, 0x05FF, 0x061F, 0x05FF, 0xA1F4, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA0F1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xA274, 0xC315, 0xD335, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xCA54, 0x20FD, 0x009F, 0x007F, 0x005F, 0x003F, 0x105D, 0xC0B1, 0xC0D1, 0x029F, 0x03BF, 0x04DF, 0x05FF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CF, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x00F9, 0x0117, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x011A, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AF, 0x0117, 0x10F4, 0x00F8, 0x18AF, 0x18AD, 0x18AD, 0x08F7, 0x08F4, 0x10D5, 0x00F7, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F8, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x10D1, 0x18AD, 0x18CD, 0x10D1, 0x10D3, 0x18AD, 0x18AD, 0x08F4, 0x10D1, 0x18AD, 0x18AD, 0x08F8, 0x18AE, 0x18AD, 0x18AF, 0x00FA, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x10D2, 0x011A, 0x0119, 0x00FA, 0x0119, 0x011A, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x61D0, 0xBB14, 0x412F, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x28CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28CF, 0x28F0, 0x30D0, 0x28EF, 0x28CF, 0x30CF, 0x30F0, 0x30D0, 0x30D0, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x30D0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x61B2, 0xD375, 0xD335, 0xD2F4, 0xCAD4, 0xCA74, 0xD233, 0xCA13, 0x1D9D, 0x05FF, 0x05FF, 0x1D3D, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8A14, 0xAA74, 0xCAF4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD294, 0xCA94, 0xCA73, 0xD274, 0xD253, 0xD254, 0x597A, 0x00BF, 0x00BF, 0x009F, 0x009F, 0x005F, 0xA8B3, 0xC0B1, 0x31FC, 0x039F, 0x04DF, 0x05DF, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x2E3C, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18CE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18B1, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x10D0, 0x10D1, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x18AE, 0x18AD, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x188D, 0x18AD, 0x18AE, 0x10D0, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x00F9, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AF, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x390F, 0x28CE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x71F2, 0xD335, 0xD2F4, 0xD2B4, 0xCA74, 0xD233, 0xCA13, 0xA295, 0x05FF, 0x05FF, 0x05FF, 0x5399, 0xC0D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9A34, 0xC2B4, 0xD2B5, 0xD2B3, 0xCAB4, 0xD294, 0xD294, 0xCA93, 0xD274, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0x81D8, 0x00DF, 0x00DF, 0x00DF, 0x00BF, 0x00BF, 0x68B7, 0xB8D1, 0x31DC, 0x033F, 0x049F, 0x05DF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x26BD, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D2, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F1, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F7, 0x011A, 0x0119, 0x0118, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x011A, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x28F0, 0x30F0, 0x30F0, 0x38F0, 0x8213, 0xD2F5, 0xCAD4, 0xD274, 0xCA53, 0xC9F3, 0xC9D2, 0x7398, 0x05FF, 0x05FF, 0x05DF, 0xA953, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x98F2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F0, 0x38F0, 0x38F0, 0x38F0, 0x3911, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xCA94, 0xD294, 0xCA94, 0xD274, 0xCA74, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA34, 0x99F6, 0x011F, 0x011F, 0x00FF, 0x00FF, 0x00FF, 0x38DB, 0xC0B1, 0x28FC, 0x02DF, 0x047F, 0x059F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x011A, 0x00F9, 0x011A, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0117, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0x7A32, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD335, 0xD2B4, 0xCA94, 0xCA33, 0xD1F3, 0xC9D3, 0xC993, 0xC972, 0xC992, 0xC972, 0xC932, 0xC0D1, 0xC0B1, 0xB8D1, 0xB0D2, 0xB9F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x015F, 0x013F, 0x013F, 0x013F, 0x011F, 0x093F, 0xC0B1, 0x311C, 0x01BF, 0x03FF, 0x059F, 0x069F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD2F4, 0xCA74, 0xCA33, 0xCA13, 0xC9D3, 0xC992, 0xC952, 0xC111, 0xC0D1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xCA53, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x097F, 0x017F, 0x015F, 0x017F, 0x015F, 0x015F, 0x88F5, 0x293C, 0x013F, 0x02DF, 0x053E, 0x067F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9234, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AF, 0x18CD, 0x18AE, 0x10D0, 0x0118, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20EE, 0x8252, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD2B4, 0xD233, 0xCA13, 0xC9B3, 0xC992, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8B1, 0xB8D1, 0xB8D1, 0xC253, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x31BC, 0x01BF, 0x019F, 0x019F, 0x019F, 0x019F, 0x5139, 0x315C, 0x017F, 0x01BF, 0x045E, 0x063E, 0x077F, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8A95, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F9, 0x08F7, 0x18AD, 0x20AD, 0x10D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD4F8, 0xD65C, 0xD6DD, 0xD6FD, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xCB15, 0xCA13, 0xC9D3, 0xC992, 0xC932, 0xC911, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC397, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xC9F3, 0x31FC, 0x01DF, 0x01DF, 0x01DF, 0x01DF, 0x01DF, 0x01BF, 0x01DF, 0x01BF, 0x01BF, 0x02DF, 0x05FD, 0x073E, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8AB5, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08D5, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18B0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x10D0, 0x00F8, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x28EE, 0xCB55, 0xD375, 0xD395, 0xD395, 0xD3D6, 0xD5DB, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xCA13, 0xC9B3, 0xC992, 0xC952, 0xC912, 0xC0D1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB0F1, 0xBA95, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9F3, 0x31FD, 0x021F, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01DF, 0x01FF, 0x051D, 0x071D, 0x07FD, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6BF7, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F7, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F8, 0x18B0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD477, 0xD77E, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xC9D3, 0xC992, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB152, 0xD79E, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9D3, 0x323C, 0x023F, 0x023F, 0x021F, 0x023F, 0x023F, 0x021F, 0x021F, 0x021F, 0x021F, 0x021F, 0x037E, 0x06DC, 0x07FD, 0x07FD, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0F1, 0x7911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F9, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x8252, 0xD395, 0xD395, 0xD396, 0xD4B8, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xC972, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xD63C, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9D3, 0x325C, 0x027F, 0x025F, 0x025F, 0x025F, 0x023F, 0x025F, 0x025F, 0x023F, 0x023F, 0x023F, 0x029F, 0x067C, 0x07FC, 0x07FC, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB8D1, 0x70F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x011A, 0x0118, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD457, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCF3E, 0xC67C, 0xC53A, 0xC951, 0xC912, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0F1, 0xBB97, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD65B, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0xD395, 0xC9B3, 0x327C, 0x029F, 0x029F, 0x029F, 0x029F, 0x027F, 0x027F, 0x027F, 0x027F, 0x027F, 0x025F, 0x027F, 0x05BC, 0x07DB, 0x07FC, 0x07FD, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x58F1, 0x3911, 0x3111, 0x30F0, 0x28F0, 0x28F0, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0117, 0x18CE, 0x18AE, 0x18D0, 0x0118, 0x00F9, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xA2D3, 0xD395, 0xD395, 0xD3D6, 0xD75E, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFDF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7DF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCFFF, 0xD7DF, 0xACD8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA8F1, 0xA972, 0xD77E, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD65C, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC193, 0x0A7F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x029F, 0x027F, 0x029F, 0x027F, 0x04DD, 0x07BB, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x07FF, 0x3DBB, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0x5911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x00F8, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0xD395, 0xD375, 0xD375, 0xD5BA, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5B, 0xBE3C, 0xB57A, 0xACB8, 0xBDBB, 0xC63C, 0xBE3B, 0xC71E, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5C, 0xB5DB, 0xACB8, 0xAC98, 0xBD5A, 0xBE3C, 0xC61C, 0xC69D, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xACB9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA111, 0xA911, 0xBC78, 0xCFDF, 0xCFDF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCF5E, 0xBE5C, 0xBE5C, 0xC63C, 0xC61C, 0xCEFD, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFFF, 0xCFDF, 0xD63B, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD395, 0x089F, 0x011F, 0x031F, 0x02FF, 0x02FF, 0x02DF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x03FD, 0x079A, 0x07FA, 0x07FC, 0x07FE, 0x07FF, 0x07FF, 0x2E5C, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB8D1, 0x5912, 0x3911, 0x38F1, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D0, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x0118, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x79F1, 0xD355, 0xD355, 0xD355, 0xCF7E, 0xC7DF, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xCFBF, 0xBEFD, 0xACB8, 0x8A52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA192, 0xAB96, 0xBE7D, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xCFDF, 0xCFBF, 0xC75E, 0xAD19, 0x92B4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xA111, 0x9931, 0xA111, 0x9911, 0xAB36, 0xBD5A, 0xC75E, 0xCFDF, 0xC7BF, 0xC7BF, 0xCFDF, 0xC7DF, 0xC7BF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xC7BF, 0xCFBF, 0xC7DF, 0xA4B8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xBE3B, 0xCFBF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xB5DA, 0x8A12, 0x8971, 0x9931, 0x9931, 0xA111, 0x9931, 0xAB35, 0xC75E, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFBF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCE1B, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x007F, 0x009E, 0x023F, 0x033F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x031F, 0x02FF, 0x02DF, 0x02DF, 0x02DF, 0x039E, 0x075A, 0x07F9, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x2E3C, 0xB8D2, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x08F5, 0x00F9, 0x00FA, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xA293, 0xD335, 0xD335, 0xCC98, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC75E, 0xA4B8, 0x8191, 0x9151, 0x9911, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xAB35, 0xBEFE, 0xC7BF, 0xC7BE, 0xC7BF, 0xB5DB, 0x89F1, 0x8971, 0x9931, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA132, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA172, 0xBD3A, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BE, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xAC98, 0x8191, 0x9151, 0x9931, 0xA111, 0xA131, 0xA111, 0xA131, 0xA111, 0x9931, 0xBE1B, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xBEFD, 0x89F2, 0x8991, 0x9931, 0xA112, 0xA131, 0xA111, 0xA111, 0xA111, 0xAB97, 0xC7BF, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC6DD, 0xD375, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0x009F, 0x009F, 0x013F, 0x033F, 0x037F, 0x035F, 0x033F, 0x031F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x02FF, 0x033F, 0x06F9, 0x07F9, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x2E3C, 0xB8D2, 0xB0F1, 0xB8D1, 0xB0D1, 0xB0F1, 0xB0D1, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x3110, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18B0, 0x10F2, 0x10D3, 0x08D3, 0x08F3, 0x10F3, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x08F5, 0x0119, 0x00F9, 0x011A, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x0119, 0x00F9, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xD315, 0xD315, 0xD314, 0xC5FB, 0xC79F, 0xC79E, 0xC7BF, 0xC7BF, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xBF9E, 0xBFBF, 0xBFBE, 0xB67C, 0x8A53, 0x8971, 0xA131, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA172, 0xB539, 0xBF9F, 0x9BF6, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xAB15, 0xBF3D, 0xC79F, 0xC7BE, 0xC79F, 0xC79F, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79F, 0xC79E, 0xC79F, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xA4B8, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xBDFB, 0xC79F, 0xC79E, 0xC7BE, 0xC79F, 0xACF9, 0x8191, 0x9171, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA131, 0xA111, 0xBF3E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xC7BF, 0xC79E, 0xC79E, 0xC79E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xBF9E, 0xC79F, 0xC79E, 0xBFBE, 0xC79E, 0xC6BD, 0xD355, 0xD2F5, 0xD315, 0xCB14, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD315, 0xD315, 0xD314, 0x007F, 0x007F, 0x00FF, 0x027F, 0x039F, 0x039F, 0x037F, 0x231D, 0x5259, 0x5A3A, 0x033F, 0x033F, 0x031F, 0x031F, 0x0699, 0x07F8, 0x07FA, 0x07FD, 0x07FF, 0x07FF, 0x363C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0x4112, 0x38F1, 0x3911, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x08F7, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x10D1, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10F2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0118, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0915, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x0915, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2F4, 0xCAF4, 0xD2F4, 0xC65C, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF7F, 0xB67C, 0x8A12, 0x8971, 0xA111, 0xA111, 0xA911, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA912, 0xA911, 0xA1F3, 0x8191, 0x9931, 0xA111, 0xA111, 0xA912, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA112, 0xA911, 0xAA54, 0xBF1D, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xB79E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xB5FB, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA911, 0xB5FB, 0xBF7E, 0xBF9E, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBEBD, 0xD335, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F5, 0xCAF4, 0x007F, 0x007F, 0x00BF, 0x021F, 0x2ABD, 0x7A36, 0xB953, 0xC112, 0xC911, 0xC912, 0x0B3F, 0x035F, 0x035F, 0x033F, 0x05FA, 0x07F7, 0x07F9, 0x07FC, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0D1, 0xA0F1, 0x68F1, 0x4111, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0118, 0x08F7, 0x08F6, 0x00F7, 0x0118, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0118, 0x0119, 0x08F6, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2D4, 0xD2D4, 0xD2D4, 0xBE5C, 0xB77E, 0xB79E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xB77E, 0xB79E, 0xBF7E, 0xAE7B, 0x89F2, 0x8971, 0xA111, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA912, 0xA911, 0xA911, 0xA111, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA111, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA912, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xAA34, 0xB71E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7F, 0xB77E, 0x9C97, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xB5DB, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xA478, 0x8191, 0x9951, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xB5DB, 0xB77F, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xBE9D, 0xCB75, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D5, 0x007F, 0x007F, 0x30BB, 0x9955, 0xC931, 0xC932, 0xC932, 0xC912, 0xC0F2, 0xC8F2, 0x32FC, 0x037F, 0x037F, 0x037F, 0x059B, 0x07F7, 0x07F9, 0x07FC, 0x07FE, 0x07FF, 0x2E3C, 0xB8D1, 0xB0D1, 0xB0D2, 0xB0D1, 0xB0F1, 0x98F1, 0xB0F1, 0x88F1, 0x3110, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x00F7, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x00F7, 0x011A, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2B4, 0xD2B4, 0xD2B4, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB71D, 0x8A53, 0x8191, 0xA111, 0xA8F1, 0xB0F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F2, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB2F5, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C78, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C77, 0x8191, 0x9151, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB71D, 0xCB96, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCA94, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0x087E, 0x70F8, 0xC952, 0xC932, 0xC912, 0xC932, 0xC111, 0xC8F1, 0xC8F1, 0xC8D1, 0x331C, 0x03BF, 0x039F, 0x039F, 0x051B, 0x07D6, 0x07F7, 0x07FB, 0x07FE, 0x07FF, 0x2E3C, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xA0F1, 0xB0F1, 0xB0D1, 0x50F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0116, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D3, 0x00FA, 0x0119, 0x08F6, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD294, 0xD294, 0xCA94, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0x9416, 0x8991, 0x9951, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xACF9, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF7E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5D, 0xB75E, 0xAF5E, 0xAF5E, 0x9C77, 0x8191, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xB75E, 0xB75E, 0xB75E, 0xB75E, 0x9C78, 0x8991, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB5BB, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF1D, 0xCB75, 0xCA93, 0xD294, 0xCA74, 0xCA94, 0xCA74, 0xD274, 0xCA74, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA93, 0xCA94, 0xD293, 0xCA74, 0x9915, 0xC932, 0xC932, 0xC932, 0xC912, 0xC111, 0xC8F2, 0xC0F2, 0xC8D1, 0xC8D1, 0x333C, 0x03FF, 0x03DF, 0x03BF, 0x04DC, 0x07D6, 0x07F7, 0x07FB, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0x90F1, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D3, 0x0119, 0x0119, 0x10D1, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD274, 0xD274, 0xCA53, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF5D, 0xAF3D, 0xAF3E, 0xA69C, 0x8191, 0x8191, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0D1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xAA13, 0xB418, 0xA438, 0x9AB4, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xAA74, 0xAC78, 0xACF9, 0x9B35, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F2, 0xB0D1, 0xB0F1, 0xA9B3, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0x9C77, 0x8191, 0x9931, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xAF3E, 0xAF3E, 0xAF5D, 0xAF3E, 0x9477, 0x8191, 0x9951, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xADBA, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAEFD, 0xCB56, 0xCA53, 0xCA74, 0xD253, 0xD274, 0xD274, 0xD273, 0xCA73, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD254, 0xCA74, 0xCA54, 0xCA54, 0xCA74, 0xC932, 0xC932, 0xC932, 0xC912, 0xC912, 0xC912, 0xC0F1, 0xC8D1, 0xC8D1, 0xC8D1, 0x335C, 0x041F, 0x03FF, 0x03FF, 0x047D, 0x0795, 0x07F6, 0x07FA, 0x07FE, 0x07FF, 0x2E3C, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0D1, 0xB0F1, 0x40F0, 0x28CF, 0x28EF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x00F8, 0x011A, 0x08F6, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x08D3, 0x08F3, 0x08F3, 0x18AF, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x00F6, 0x0119, 0x0118, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA53, 0xCA53, 0xCA53, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0x9457, 0x8191, 0x9931, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB1B3, 0xAD9A, 0xAF3D, 0xAF3D, 0xA73D, 0xA73D, 0x9DDA, 0x89D1, 0x9951, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB213, 0xAD9B, 0xA73E, 0xA73D, 0xAF3E, 0xAF3E, 0x9DDA, 0x81F2, 0x9171, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D2, 0xB0F1, 0xAD39, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3E, 0xAF1E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xAF3E, 0xA73E, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xA73E, 0x9478, 0x8191, 0x9931, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xAD9A, 0xA73E, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xAF3D, 0xAF3D, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xAEDD, 0xC376, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0x309C, 0x005F, 0x58B9, 0xC912, 0xC111, 0xC8F1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0x337C, 0x045F, 0x041F, 0x041F, 0x045E, 0x0775, 0x07F5, 0x07FA, 0x07FE, 0x07FF, 0x2E3C, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0x80F1, 0x28EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x011A, 0x011A, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA13, 0xCA33, 0xCA13, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0x8A53, 0x8191, 0xA8F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB213, 0xA6BD, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0x9E1B, 0x81F1, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB1F3, 0xA6BD, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0x9E1B, 0x89F2, 0x8991, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB336, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71E, 0xA71D, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA73E, 0xA71D, 0xA73E, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA73E, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0x9477, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA59A, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71E, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71E, 0xA71D, 0xA73D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xBBF7, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA14, 0xD233, 0xCA33, 0x003F, 0x003F, 0x005F, 0x78D7, 0xC0F2, 0xC8F1, 0xC0D1, 0xC0D1, 0xC0D1, 0xC8B1, 0x4B1A, 0x047F, 0x045F, 0x043F, 0x045F, 0x0735, 0x07F4, 0x07F9, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xA8F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xA0F1, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D1, 0x08F3, 0x10F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10D3, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x18AD, 0x18AF, 0x011A, 0x0119, 0x00F9, 0x08F6, 0x0119, 0x0119, 0x0119, 0x18AF, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA13, 0xCA13, 0xCA13, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x8191, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9EFD, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB932, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1E, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E1B, 0x9457, 0x92D4, 0xA1F3, 0xA911, 0xB0F1, 0xB0F1, 0xA911, 0xB274, 0xB254, 0xB254, 0xABF7, 0xA5DB, 0xA6FD, 0xA6FD, 0xA71D, 0xA71D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E7C, 0x9498, 0x8B14, 0x9A13, 0xA131, 0xA912, 0xB0F1, 0xA8F1, 0xB255, 0xB274, 0xB254, 0xAB97, 0xAD1A, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9457, 0x8191, 0xA131, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA57A, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9E7C, 0x9DBA, 0xA59A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA69C, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E5C, 0x94B8, 0x8AF4, 0x9A13, 0xA131, 0xA8F1, 0xB0F1, 0xB0F1, 0xB932, 0xB274, 0xB254, 0xB336, 0xACB9, 0xA63C, 0x9F1D, 0xBBF7, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0x003F, 0x003F, 0x005F, 0x58B9, 0xC0F1, 0xC0D1, 0xC8D1, 0xC8B2, 0xC0B1, 0xC0B1, 0x62B8, 0x04BF, 0x047F, 0x047F, 0x045F, 0x0715, 0x07F4, 0x07F9, 0x07FD, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xA8F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0x58F0, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F6, 0x20AD, 0x20CD, 0x18AE, 0x08F3, 0x0119, 0x00F9, 0x18AE, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10D4, 0x18AD, 0x18AD, 0x18AD, 0x00F6, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC9D3, 0xC9D3, 0xC9D3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x959A, 0x8191, 0x9151, 0xC0B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB2B5, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8252, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB1F3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9F1D, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8A93, 0x8191, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xA63C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x94F8, 0x8A53, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8B1, 0xC0B1, 0xC0D1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB992, 0xACB9, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E5C, 0x8B96, 0x8991, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB932, 0xABF7, 0x9E9C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E9C, 0x8B96, 0x8971, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB335, 0xA63C, 0xBBD7, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0x001F, 0x003F, 0x003F, 0x00DF, 0x88F6, 0xC8D1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0x62D9, 0x04FF, 0x04BF, 0x049F, 0x047F, 0x06B6, 0x07F3, 0x07F8, 0x07FD, 0x07FF, 0x2E3C, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0x98F2, 0xB0F1, 0xB0F1, 0xB0F1, 0x78F0, 0x90F1, 0x80D1, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x08F7, 0x0119, 0x011A, 0x08F4, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x00F6, 0x18AD, 0x18AD, 0x18CD, 0x08F3, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x08F7, 0x0119, 0x08F5, 0x18CD, 0x18AD, 0x18AD, 0x08F6, 0x011A, 0x08F6, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0xC9B3, 0xC9B3, 0xC9B3, 0x9EDD, 0x96FD, 0x9EDD, 0x96FD, 0x9EFC, 0x96FD, 0x96FD, 0x9599, 0x8991, 0x9171, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xABD7, 0x9EFC, 0x96FD, 0x96FD, 0x96DD, 0x96FD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x9EFD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xAB76, 0x9EDD, 0x9EFD, 0x9EFD, 0x9EDD, 0x9EDD, 0x96DD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x8C37, 0x8191, 0xA131, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xA55A, 0x96FD, 0x9EDD, 0x9EFD, 0x96FD, 0x963B, 0x8AF4, 0x8991, 0xA911, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xB992, 0xA55A, 0x9EDD, 0x9EFC, 0x96FD, 0x9EDD, 0x96FD, 0x9EFD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x94F9, 0x81F1, 0x9171, 0xB8D2, 0xC0B1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB992, 0x9DBB, 0x96FD, 0x9EDD, 0x96FD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x9EDD, 0x96FD, 0x96FD, 0x9EFD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x96FD, 0x9EFD, 0x96FD, 0x9EFD, 0x9EFD, 0x96FD, 0x9EFD, 0x96FD, 0x9539, 0x81F1, 0x9171, 0xB0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB911, 0xACFA, 0xB458, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B3, 0x001F, 0x003F, 0x003F, 0x00BF, 0x311C, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x6278, 0x053F, 0x04FF, 0x04BF, 0x049F, 0x0696, 0x07F2, 0x07F7, 0x07FC, 0x07FF, 0x2E3C, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x8912, 0xB0F1, 0xB0F1, 0xB0D1, 0x48F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F6, 0x18AD, 0x18AD, 0x208D, 0x08F3, 0x0119, 0x00F9, 0x18AE, 0x18AE, 0x18CE, 0x00F9, 0x0119, 0x08F3, 0x18AD, 0x20AE, 0x18AD, 0x08F6, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18CF, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC993, 0xC993, 0xC992, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8D79, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x95DA, 0x89F2, 0x8971, 0xB8D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0x9931, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DC, 0x96DD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8CD8, 0x8191, 0x9951, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xAC79, 0xACF9, 0xC992, 0xC993, 0xC9B2, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0xC992, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0x003F, 0x003F, 0x003F, 0x00BF, 0x011F, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x79D6, 0x051F, 0x051F, 0x04FF, 0x04BF, 0x0638, 0x07F1, 0x07F7, 0x07FC, 0x07FF, 0x2E3C, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0F1, 0x80F2, 0xB0F1, 0xB0F1, 0xB0F2, 0x3110, 0x30F0, 0x28CF, 0x28EF, 0x20CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18D1, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0118, 0x18AE, 0x18AD, 0x18AD, 0x18CE, 0x0119, 0x0119, 0x0118, 0x08F5, 0x00F8, 0x0119, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x00F8, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CE, 0x0117, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x10D2, 0x08F3, 0x10F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC972, 0xC972, 0xC972, 0x8EBC, 0x8EBD, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8D7A, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D39, 0x8EBD, 0x8EDD, 0x8DBA, 0x81F2, 0x9171, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B2, 0xC8B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xA437, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBD, 0x8EBD, 0x8CD8, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0xA4D9, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0x9D3A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8CD8, 0x8191, 0x9951, 0xC8B1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC8B1, 0xC8D1, 0xA478, 0xA4D9, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0x003F, 0x003F, 0x001F, 0x009F, 0x00DF, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9174, 0x049F, 0x057F, 0x051F, 0x04FF, 0x0619, 0x07F1, 0x07F6, 0x07FC, 0x07FF, 0x35BB, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x6912, 0xB0F1, 0xB0F1, 0x98F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28EF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x10D3, 0x20AD, 0x18AD, 0x10D3, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x011A, 0x011A, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x18B0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x00F9, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x0119, 0x0117, 0x00F7, 0x00F9, 0x0119, 0x08F5, 0x20AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00FA, 0x011A, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC952, 0xC952, 0xC952, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D59, 0x8191, 0x9171, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xABD7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA931, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC0F2, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8437, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D3A, 0x8EBC, 0x8E1B, 0x81F2, 0x8971, 0xB912, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC112, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F1, 0xA498, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8DBA, 0x8991, 0x8991, 0xC0F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC8F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC132, 0x8E5C, 0x8C17, 0x8191, 0xA931, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C17, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8DBA, 0x81F2, 0x8991, 0xC111, 0xC8F1, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8D2, 0xC8F1, 0xC8F2, 0xC0F1, 0xC0F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC152, 0x95FB, 0xA4B8, 0xC152, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0x001F, 0x001F, 0x001F, 0x007F, 0x00DF, 0x68B7, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA8F3, 0x041F, 0x057F, 0x053F, 0x051F, 0x05F9, 0x07F0, 0x07F6, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x5912, 0xB0F1, 0xB0F1, 0x90F1, 0x30F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x011A, 0x00F7, 0x00F8, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x0117, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x08F3, 0x00F6, 0x08F3, 0x18AF, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x0117, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18CD, 0x20AE, 0x10D3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC932, 0xC932, 0xC932, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D79, 0x8191, 0x9171, 0xC132, 0xC131, 0xC912, 0xC912, 0xC132, 0xC911, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC911, 0xC912, 0xC912, 0xC112, 0xC912, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8AD4, 0x8191, 0xB152, 0xC912, 0xC131, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC912, 0xC912, 0xC911, 0xC112, 0xC932, 0xC912, 0xC912, 0xC932, 0xC911, 0xC912, 0xC912, 0xC932, 0xC131, 0x9DBA, 0x8EBC, 0x96BC, 0x8EBC, 0x8EDC, 0x96BB, 0x8EBC, 0x8EDC, 0x82D4, 0x8191, 0xB932, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC131, 0xC912, 0xC132, 0xC131, 0xC912, 0xC912, 0xC911, 0xC911, 0xC131, 0xC912, 0xC912, 0xB356, 0x8C36, 0x8191, 0xA151, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC112, 0x9D59, 0x8EBC, 0x96BC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8EBC, 0x82F4, 0x8991, 0xB151, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC131, 0xC932, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC912, 0xC911, 0xC932, 0xC932, 0xC112, 0xC911, 0xC132, 0xC912, 0xC912, 0xC932, 0xB336, 0x96BC, 0xA4F9, 0xC192, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0x001F, 0x001F, 0x001F, 0x007F, 0x00BF, 0x009F, 0x90B5, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x0B9E, 0x053F, 0x057F, 0x053F, 0x05DA, 0x07EF, 0x07F5, 0x07FB, 0x07FF, 0x5478, 0xB0D1, 0xB0F1, 0xB0F1, 0x9111, 0x5912, 0xA8F1, 0xB0F1, 0x70F1, 0x30F0, 0x28EF, 0x20EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F8, 0x0119, 0x08F7, 0x18AE, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D0, 0x20AE, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC912, 0xC912, 0xC912, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9EDB, 0x9578, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xB417, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA518, 0x9EDB, 0x96DB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x94D8, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC253, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xBAB5, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9599, 0x8191, 0x91B1, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B5, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC972, 0xC1B2, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x8C36, 0x8991, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9598, 0x8191, 0x9191, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC172, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA61A, 0x9EDC, 0xA5DA, 0xC172, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0xC111, 0xC912, 0xC912, 0xC912, 0x001F, 0x001F, 0x001F, 0x005F, 0x007F, 0x007F, 0x6098, 0xC0B1, 0xB8B1, 0xC0B1, 0xC0B1, 0x2AFC, 0x04FF, 0x05BF, 0x055F, 0x05FB, 0x07CF, 0x07F4, 0x07FC, 0x07FF, 0x5C79, 0xB0F1, 0xB0F1, 0xB0F1, 0x8112, 0x5912, 0xB0F1, 0xB0F1, 0x68F1, 0x30F0, 0x30EF, 0x30CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x10D3, 0x0119, 0x0119, 0x08D6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x20AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC8F1, 0xC8F1, 0xC8F2, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6DA, 0xA6FA, 0x9D98, 0x8191, 0x9191, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC992, 0xB436, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD99, 0x8A32, 0x8991, 0xC192, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC973, 0xC992, 0xC992, 0xC992, 0xBC36, 0xA69A, 0xA6FA, 0xA6FA, 0xA69A, 0x9395, 0x8991, 0xB992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0xAD98, 0xA6DB, 0xA6DA, 0xA6FA, 0xA6FB, 0xA6FA, 0x9395, 0x8191, 0xB192, 0xC992, 0xC992, 0xC992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC972, 0xC233, 0xAD98, 0xA6FA, 0xA6FB, 0xA639, 0x8A93, 0x9992, 0xC192, 0xC972, 0xC992, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0x9A93, 0x8191, 0xA992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6DA, 0x8B95, 0x8191, 0xB192, 0xC972, 0xC992, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC294, 0xADF9, 0xA6FA, 0xA6DA, 0xA69A, 0x9334, 0x9191, 0xB992, 0xC992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xB497, 0xAEFB, 0xAEFB, 0xB5D9, 0xC952, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x005F, 0x7897, 0xC0B1, 0xC0D1, 0xC0B1, 0xB8D1, 0x6238, 0x04DF, 0x05BF, 0x059F, 0x05FA, 0x07CE, 0x07F4, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0F1, 0xB0F1, 0x7112, 0x5912, 0xB0F1, 0xA8F1, 0x5110, 0x30F0, 0x30CF, 0x28CF, 0x28CF, 0x28CF, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x08F6, 0x18D0, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x08F6, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x00F7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0xC0D1, 0xC0D1, 0xC8D2, 0xB71A, 0xB71A, 0xB71A, 0xAEFA, 0xB71A, 0xAF1A, 0xAEFA, 0xA598, 0x8191, 0x9191, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9D3, 0xBC76, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0x9C55, 0x8191, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xC9D3, 0xB5B8, 0xB71A, 0xAF1A, 0xB71A, 0xB6FA, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB6FA, 0xAF1A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xA3B5, 0x8191, 0x9992, 0xC9B2, 0xC9B3, 0xC9D2, 0xC9B2, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xCA13, 0xBDB8, 0xAEFA, 0xAF1A, 0xB71A, 0xB6FA, 0xAEFA, 0xAF19, 0xA4F7, 0x8991, 0xB1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9B3, 0xC9B3, 0xC314, 0xAF1A, 0xAF1A, 0xAEF9, 0xAF1A, 0xAF1A, 0x89F1, 0x8191, 0xC1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B2, 0xC9D3, 0xC9B3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xAEFA, 0xB71A, 0xB6B9, 0x8A93, 0x8991, 0xC1D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B2, 0xA992, 0x8191, 0xA9B2, 0xC9D3, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B2, 0xC9B2, 0xC9B3, 0xB5B8, 0xAF1A, 0xAEFA, 0xAF1A, 0xB71A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xB5B8, 0xB6FA, 0xAF1A, 0xAF1A, 0xB6FA, 0x89F2, 0x8191, 0xC1B2, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xB71A, 0xB6FA, 0xB71A, 0x92F3, 0x89B1, 0xC1B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9D3, 0xC315, 0xB71A, 0xB71A, 0xB71A, 0xBDD9, 0xC132, 0xC0D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x007F, 0x6878, 0xB8B1, 0xC0B1, 0xC0D1, 0xB8D1, 0x9954, 0x047F, 0x05BF, 0x05BF, 0x061A, 0x07CE, 0x07F2, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0F1, 0xB0F1, 0x6112, 0x5912, 0xA8F1, 0xA8F1, 0x60F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0118, 0x00F6, 0x10D3, 0x08F6, 0x0118, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208D, 0x18B0, 0x00F8, 0x0139, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F8, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xC0B1, 0xC8B1, 0xC0B1, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA4B5, 0x8191, 0xA1B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0xC496, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF39, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0x99F2, 0x8991, 0xB1D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC577, 0xBF19, 0xBF39, 0xBF39, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9BF5, 0x8191, 0xB1D2, 0xC9F3, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF19, 0xBF19, 0xB6B9, 0x8191, 0x8991, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9D3, 0xC9F3, 0xC9F3, 0xBED8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xAD57, 0x8191, 0x99B2, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x8191, 0xA9B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9C75, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xB6B8, 0x8191, 0x8191, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xADB7, 0x8191, 0x91B1, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC71A, 0xBF1A, 0xC73A, 0xBF3A, 0xC659, 0xC9D3, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x003F, 0x001F, 0x7076, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x0BFF, 0x05DF, 0x05BF, 0x0639, 0x07CD, 0x07F2, 0x07FC, 0x07FF, 0x63F7, 0xB0F1, 0xB0F1, 0xB0F1, 0x4132, 0x4111, 0xA0F1, 0xB0F1, 0x90F1, 0x30F0, 0x28EF, 0x28CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F8, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xC0B1, 0xC0B1, 0xC0B1, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8991, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA34, 0xCA13, 0xCA33, 0xCA33, 0xCCB6, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA455, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0x91B1, 0x8191, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA13, 0xC455, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0x8A52, 0x8991, 0xC213, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCD56, 0xC738, 0xC738, 0xC739, 0xB5D7, 0x8191, 0x91B1, 0xCA13, 0xCA13, 0xCA13, 0xD233, 0xCA33, 0xCA33, 0xCA33, 0xCB55, 0xCF38, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0x8191, 0x8191, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xD233, 0xCA13, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCDF7, 0xC738, 0xC738, 0xC738, 0xC739, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xB5D6, 0x8191, 0x99B2, 0xCA33, 0xCA33, 0xD213, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCB74, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0x8AB2, 0x8191, 0xBA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA13, 0xCF39, 0xC739, 0xC759, 0xCF3A, 0xCF39, 0xCED9, 0xC9F3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x001F, 0x001F, 0x9894, 0xB8D1, 0xB8D1, 0xB8D1, 0x42DA, 0x059F, 0x05FF, 0x0678, 0x07CC, 0x07F1, 0x07FC, 0x07FF, 0x82B5, 0xA8F1, 0xB0F1, 0x98F2, 0x4132, 0x3912, 0x70F1, 0xA8F1, 0xA8F1, 0x50F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x10D4, 0x08F5, 0x08F6, 0x08F4, 0x08D3, 0x10CF, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC0B1, 0xC0B1, 0xC0B1, 0xCF57, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA54, 0xCCD6, 0xCF58, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF58, 0xAC75, 0x8191, 0xA9F2, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCE17, 0xCF57, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0x99D2, 0x89B1, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xD6B7, 0xD758, 0xCF58, 0xCF57, 0xCF58, 0xD758, 0xD757, 0xD758, 0xD757, 0xD758, 0xCF58, 0xB535, 0x8191, 0xA1D2, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCA73, 0xCA53, 0xCA53, 0xCC95, 0xD758, 0xD758, 0xCF58, 0xBDD6, 0x8191, 0x99D2, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD254, 0xCA54, 0xD435, 0xD758, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF57, 0xD738, 0xCF58, 0x9AF3, 0x8991, 0xC213, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA54, 0xCA73, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xD253, 0xCA54, 0xD253, 0xCA53, 0xCA54, 0xCE17, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xD617, 0xD758, 0xCF58, 0xCF58, 0xBDD6, 0x8191, 0x91B2, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xD253, 0xD253, 0xCCD6, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF57, 0xD757, 0xCF58, 0xD758, 0x9AF3, 0x8191, 0xBA33, 0xCA54, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xD758, 0xD758, 0xDF59, 0xD779, 0xD759, 0xD759, 0xD6F9, 0xC1F2, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x001F, 0x001F, 0x001F, 0x183E, 0xB0D2, 0xB8D1, 0xB8D1, 0x9974, 0x059F, 0x061F, 0x0698, 0x07CC, 0x07F0, 0x07FC, 0x07FF, 0x82B5, 0xB0F1, 0xB0F1, 0x88F1, 0x4132, 0x4111, 0x3910, 0x98F1, 0xA8F2, 0x88F1, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC0B1, 0xC0B1, 0xC0B1, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0x99D2, 0x91D2, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xD3D4, 0xDF77, 0xDF77, 0xDF77, 0xDF76, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0x8191, 0x8992, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xCA94, 0xD3D5, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xCA94, 0xCA94, 0xD273, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xD515, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xD294, 0xCA94, 0x8191, 0xAA12, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA93, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xE779, 0xDF19, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x385B, 0xB8D1, 0xB8D1, 0xB8D1, 0x2C3C, 0x061F, 0x06B7, 0x07CB, 0x07F0, 0x07FB, 0x07FF, 0xB0F1, 0xB0F1, 0xA8F1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xA0F1, 0xA8F1, 0x48EF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xC0D1, 0xE776, 0xE796, 0xE797, 0xE797, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2D4, 0xD2B4, 0xD2B4, 0xDD35, 0xE776, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xB474, 0x8191, 0xAA33, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2D4, 0xE656, 0xEF96, 0xE776, 0xE797, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0x99D2, 0x99F2, 0xCAB4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD3F5, 0xE777, 0xE797, 0xEF97, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xE777, 0xEF97, 0x8191, 0x8191, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD3D5, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xCAD4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xDD35, 0xE777, 0xEF76, 0xE796, 0xE797, 0xE797, 0xE776, 0xE796, 0xE776, 0xC534, 0xB494, 0xCC15, 0xD3F5, 0xDBF4, 0xDBF4, 0xDBF5, 0xD3F5, 0xD3F4, 0xCB34, 0x8191, 0xAA32, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xE656, 0xE776, 0xE796, 0xE796, 0xE776, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xDE56, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2D4, 0xCAD4, 0xCAD4, 0xDD15, 0xE796, 0xE796, 0xE776, 0xE796, 0xEF96, 0xE796, 0xE796, 0xE796, 0x9B13, 0x8191, 0xBA73, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xE797, 0xEF97, 0xEF77, 0xEF97, 0xEF78, 0xEF98, 0xEF98, 0xEF98, 0xC992, 0xB8D1, 0xC0D1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x7096, 0xB8D1, 0xB8D1, 0x8A35, 0x063F, 0x06D6, 0x07EA, 0x07F1, 0x07FC, 0x07FF, 0xA8F1, 0xA8F1, 0xA8F1, 0x6132, 0x4132, 0x4111, 0x38F1, 0x3110, 0x48F0, 0xA8F1, 0x98F1, 0x30CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xF796, 0xF7B6, 0xF796, 0xF795, 0xF795, 0xF796, 0xEFB6, 0xBC93, 0x8191, 0xAA52, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2F4, 0xDD55, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xEFB6, 0xBC93, 0x8191, 0xAA53, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xE675, 0xF796, 0xF795, 0xF796, 0xF796, 0xF796, 0xF7B6, 0xF7B5, 0xF7B5, 0xEF96, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0x99F2, 0x99F2, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2F4, 0xD2F4, 0xDC75, 0xF795, 0xF795, 0xF795, 0xF796, 0xF7B5, 0xF796, 0xF796, 0xF796, 0xF796, 0xEFB6, 0xF7B5, 0xF796, 0x8191, 0x8991, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xDC15, 0xF796, 0xF796, 0xF796, 0xD615, 0x8191, 0x99F2, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xE535, 0xF7B6, 0xF7B5, 0xF796, 0xEFB6, 0xF796, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xF795, 0xF796, 0xF796, 0xF795, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xBC93, 0x8191, 0xAA53, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF796, 0xF7B5, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF7B5, 0xF795, 0xD634, 0x8191, 0x99F2, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2D4, 0xE555, 0xF796, 0xF7B5, 0xF7B6, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xA311, 0x8191, 0xBA94, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xF796, 0xF796, 0xF797, 0xF797, 0xF797, 0xF7B7, 0xF798, 0xF798, 0xD273, 0xB8D1, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x98B4, 0xB8D1, 0xB8D1, 0x3C9B, 0x06F5, 0x07E9, 0x07F1, 0x07FD, 0x26BD, 0xB0F1, 0xB0F2, 0xB0F1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30F0, 0x60F0, 0xA911, 0x70F0, 0x20CE, 0x20CF, 0x20AE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xFF94, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD315, 0xD335, 0xD335, 0xD335, 0xD334, 0xD315, 0xD335, 0xE575, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xF675, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB5, 0xFF95, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0x99F2, 0x99F2, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD315, 0xD335, 0xDC54, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0x8191, 0x8191, 0xD334, 0xD315, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xDC34, 0xFFB4, 0xFFB5, 0xFFB5, 0xDE34, 0x8191, 0x99F2, 0xD314, 0xD335, 0xD315, 0xD334, 0xD334, 0xD335, 0xD335, 0xE574, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xC4B3, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xEDF5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0xF694, 0xFFB5, 0xFFB5, 0xFFB5, 0xDE14, 0x8191, 0x99F2, 0xD335, 0xD335, 0xD314, 0xD334, 0xD314, 0xD334, 0xD315, 0xE555, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xA332, 0x8191, 0xBAB4, 0xD335, 0xD335, 0xD335, 0xD315, 0xD334, 0xD335, 0xD335, 0xFFB5, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB7, 0xFFB8, 0xDBD4, 0xB8D2, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x083F, 0x70F7, 0xB8D1, 0xA952, 0x0E94, 0x07C9, 0x07F2, 0x07FD, 0x2E3C, 0xA8F1, 0xA8F1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30EF, 0x58F0, 0xA8F1, 0x40CF, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18B0, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18CF, 0x00F8, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x00F9, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xC3F0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xF590, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x9A12, 0x91F2, 0xD355, 0xD354, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDBD4, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0x8191, 0x8191, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDC13, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x99F2, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xC3CF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xE4D1, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xC3D0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xF590, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x9A12, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD2, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE2F, 0xA2B0, 0x8191, 0xC2F4, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xFE2F, 0xFE50, 0xFE50, 0xFE50, 0xFE51, 0xFE51, 0xFE52, 0xFE52, 0xE3D2, 0xB8D2, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x003F, 0x00DF, 0x59F8, 0xB8D1, 0x8291, 0x07C9, 0x07F2, 0x07FE, 0x455A, 0xB0F1, 0xA8F1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x50CF, 0x48EF, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AF, 0x00F8, 0x0139, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xB8D1, 0xB0D1, 0xB0D2, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xC30F, 0x81B1, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD396, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0x9A12, 0x8191, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xDBD3, 0xFC8D, 0xFC6D, 0xFC6D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC8D, 0xFC6D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD375, 0xD395, 0xD376, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFC8E, 0xFC8F, 0xFC8F, 0xFC8F, 0xFCB0, 0xFCB0, 0xFCB1, 0xFCB1, 0xF3B2, 0xB8D1, 0xB0F1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x031F, 0x2D3B, 0x99B2, 0x454B, 0x07F3, 0x07FE, 0x5498, 0xB0F1, 0xA8F1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30F0, 0x30EF, 0x30CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18CD, 0x10D1, 0x08F3, 0x08D3, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xB0F1, 0xB0D1, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9A12, 0x8191, 0xC334, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFC8E, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFC8D, 0xFC8D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB2F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB6F, 0x8191, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFC8E, 0xFC8F, 0xFCAF, 0xFCAF, 0xFCB0, 0xFCB0, 0xFCB0, 0xFCB2, 0xF451, 0xB0D1, 0xB0D1, 0xB0D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x003F, 0x005F, 0x025F, 0x06FD, 0x0770, 0x0F88, 0x07F4, 0x07FF, 0x5478, 0xA8F1, 0xA8F1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x00F6, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xB0F1, 0xB0D1, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xCB4E, 0x8191, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xBB11, 0x8191, 0xAA73, 0xD396, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFCAE, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFCAD, 0xFCCD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD3, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCAD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA94, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xFCAD, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFCCE, 0xFCCF, 0xFCCF, 0xFCEF, 0xFCD0, 0xFCF0, 0xFCF1, 0xFCF1, 0xFCF2, 0xB0F1, 0xB0F1, 0xB0F2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x007F, 0x021F, 0x06FC, 0x078D, 0x07E7, 0x07F6, 0x07FF, 0x82B5, 0xA8F1, 0xA111, 0x4932, 0x4132, 0x4111, 0x38F1, 0x38F0, 0x30F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xA8F1, 0xB0F1, 0xFD0D, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFD0D, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC6F, 0x91D1, 0x89D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xDBB4, 0xEC70, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFCED, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBF3, 0xFCED, 0xFCED, 0xFCED, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xEC6E, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xF4AF, 0xFD0D, 0xFCED, 0xFD0D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD0E, 0xFD0F, 0xFD0F, 0xFD0F, 0xFD10, 0xFD10, 0xFD31, 0xFD31, 0xFD32, 0xB0F1, 0xB0F1, 0xB0F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x005F, 0x021F, 0x073B, 0x07AC, 0x07E7, 0x07F7, 0x07FF, 0x82B5, 0xA8F1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10F3, 0x18AD, 0x18AD, 0x10F3, 0x0119, 0x0119, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x208D, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x10CF, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xA8F1, 0xB0F1, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xE44E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xC34F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xE431, 0xEC71, 0xEC71, 0xDBF0, 0xE450, 0xF4CF, 0xFD0E, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xF4AF, 0xF4CF, 0xF4AF, 0xDC10, 0x9A12, 0xAA73, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2C, 0xFD2C, 0x9211, 0x8191, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFCEE, 0xFD2D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC10, 0xE44E, 0xDC2E, 0xE44E, 0xB2F0, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD2E, 0xFD2F, 0xFD2F, 0xFD4F, 0xFD50, 0xFD50, 0xFD51, 0xFD51, 0xFD71, 0xA8F1, 0xB0F1, 0xB0F2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x007F, 0x023F, 0x073B, 0x07AB, 0x07E8, 0x07F9, 0x07FF, 0xA152, 0xA8F1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AD, 0x20AD, 0x18AD, 0x20CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AC, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA8F1, 0xA8F1, 0xA8F2, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xE46E, 0x8191, 0x9212, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD2D, 0x9211, 0x89B2, 0xCB75, 0xD396, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xBB2F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD6E, 0xFD6F, 0xFD6F, 0xFD8F, 0xFD90, 0xFD90, 0xFD91, 0xFD91, 0xFD92, 0xA8F1, 0xA8F1, 0xA8F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x005F, 0x007F, 0x009F, 0x023F, 0x0779, 0x07AA, 0x07E8, 0x07FB, 0x07FF, 0xA8F1, 0xA8F1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AC, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x10D3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x0116, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xA8F1, 0xA8F1, 0xA8F1, 0xEC6F, 0xFD8D, 0xFDAD, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xE48E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFDAD, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFD8D, 0xE4AE, 0x8991, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xE491, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFDAD, 0xF52D, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFD8D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFDAF, 0xFDAF, 0xFDAF, 0xFDAF, 0xFDB0, 0xFDB0, 0xFDB1, 0xFDD1, 0xE4B2, 0xA911, 0xA8F1, 0xA8F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x007F, 0x009F, 0x02BF, 0x0778, 0x07C8, 0x07E9, 0x07FD, 0x173E, 0xA8F1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x08F4, 0x0119, 0x0119, 0x00F7, 0x08F6, 0x0119, 0x0119, 0x08F4, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA911, 0xA911, 0xA911, 0xEC8E, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xE4CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDED, 0xFDCD, 0xD44F, 0x8191, 0xB2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0x8991, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xBB6F, 0x8191, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDED, 0xFDED, 0xFDED, 0xFDED, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFDEE, 0xFDEF, 0xFDEF, 0xFDF0, 0xFDF0, 0xFDF0, 0xFDF1, 0xFDF1, 0xECB1, 0xA0F1, 0xA911, 0xA911, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x005F, 0x005F, 0x007F, 0x009F, 0x009F, 0x041F, 0x0797, 0x07C7, 0x07EB, 0x07FE, 0x2E5C, 0xA8F1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0118, 0x0118, 0x0119, 0x0119, 0x00F6, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AC, 0x18AD, 0x18AC, 0x20AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0118, 0x0117, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA911, 0xA911, 0xA111, 0xE42E, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xE4EE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xD44F, 0x8191, 0xBAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xECD1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xF5AD, 0x9A70, 0x89B1, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0E, 0xFE0D, 0xFE0E, 0xFE0E, 0xFE0E, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE0F, 0xFE0F, 0xFE0F, 0xFE30, 0xFE30, 0xFE30, 0xFE31, 0xFE31, 0xDC32, 0xA111, 0xA911, 0xA111, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x005F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x043F, 0x0794, 0x07E6, 0x07EC, 0x07FE, 0x35DB, 0xA911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x10D1, 0x10D3, 0x10F2, 0x10D1, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x20AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x00F8, 0x18CF, 0x20AD, 0x18AD, 0x20AD, 0x18AC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x80F0, 0xA111, 0xA111, 0xC2B0, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x89D1, 0xA253, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xF60E, 0x9A70, 0x91F2, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF2, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE4E, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE50, 0xFE71, 0xFE51, 0xBA52, 0xA111, 0xA111, 0x78D5, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x00BF, 0x043F, 0x07B3, 0x07C5, 0x07EE, 0x07FF, 0x5478, 0x6AD6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0118, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AC, 0x18AD, 0x20AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x00F6, 0x0118, 0x00F8, 0x18CF, 0x18AC, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x60EF, 0xA111, 0xA111, 0xA112, 0xFE2D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xE54E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xF5CF, 0xFE6D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE6D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5CE, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6C, 0xFE8D, 0xF62D, 0xC40F, 0x9A12, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE8D, 0xFE6D, 0xFE2D, 0xBBCF, 0x89B1, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFE90, 0xFE91, 0xE471, 0xA111, 0xA112, 0xA111, 0x60D5, 0x001F, 0x283C, 0x7097, 0x405A, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x009F, 0x00BF, 0x00BF, 0x00DF, 0x045F, 0x07D2, 0x07E4, 0x07EF, 0x07FF, 0x2E3C, 0x2D1A, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0118, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x0119, 0x0118, 0x18AD, 0x18AC, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x18AE, 0x18AD, 0x20AD, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x20AD, 0x18AD, 0x20AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F6, 0x0118, 0x00F7, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x28CD, 0xA111, 0xA111, 0xA111, 0xCBCF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xF5ED, 0x89D1, 0x91D2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xED11, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xC42F, 0x81B1, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFECC, 0xFEAD, 0xC42F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF64D, 0xD4CE, 0xBBD0, 0xC3B2, 0xC314, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xED31, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xEE0D, 0xCC6F, 0xBB51, 0xBAD4, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xC334, 0x8191, 0xB294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFEAE, 0xFECE, 0xFEAD, 0xFEAE, 0xFEAD, 0xFECE, 0xFEAE, 0xFEAE, 0xA2F0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC34, 0xFEAF, 0xFED0, 0xFEAF, 0xFED0, 0xFEB0, 0xFED1, 0xE491, 0xA911, 0xA111, 0x9931, 0xA111, 0x58D6, 0x88B5, 0xB8D1, 0xB8D1, 0x5059, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x009F, 0x00BF, 0x00FF, 0x00DF, 0x047F, 0x07D2, 0x07E3, 0x07F1, 0x07FF, 0x07FF, 0x2CBA, 0x4933, 0x4132, 0x4131, 0x4111, 0x38F0, 0x38F0, 0x30F0, 0x30EF, 0x28EF, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0118, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x0118, 0x0118, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x20AD, 0x20AD, 0x18AC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x00F6, 0x18AD, 0x18AD, 0x18AC, 0x20AC, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AD, 0x18AC, 0x20AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x18AC, 0x18AD, 0x00F6, 0x0118, 0x0118, 0x18CF, 0x20AD, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x20AD, 0x18AD, 0x8110, 0x9911, 0xA111, 0xA171, 0xF5ED, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE6D, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5CF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE4E, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EE, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE8D, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xF64D, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE6E, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF60E, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF64E, 0xFEAC, 0xFEAD, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE6D, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5CF, 0xFEAD, 0xF62E, 0xF5EF, 0xF5D0, 0xF5EF, 0xF5CF, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xFE4F, 0xFECE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAF, 0xF610, 0xF5D0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF610, 0xFEAF, 0xFEAF, 0xFEAF, 0xFED0, 0xFEB0, 0xFEB1, 0xE471, 0xB8D1, 0xA111, 0x9931, 0x9931, 0x9912, 0x6933, 0xB0F1, 0xB0D1, 0xB0D1, 0x283C, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x00BF, 0x00DF, 0x00FF, 0x011F, 0x047F, 0x07D1, 0x07E3, 0x07F3, 0x07FF, 0x07FF, 0x3B77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38F0, 0x38F0, 0x30EF, 0x30EF, 0x28EF, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AC, 0x18AD, 0x0118, 0x0118, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x20AD, 0x0118, 0x0118, 0x20AD, 0x20AC, 0x20AC, 0x18AD, 0x18AD, 0x18AC, 0x20AC, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, + 0x0118, 0x00F6, 0x18CD, 0x18AC, 0x18AD, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18CC, 0x20AC, 0x18AD, 0x00F6, 0x0118, 0x0117, 0x18CF, 0x18AD, 0x18AC, 0x18AC, 0x18AD, 0x18AC, 0x20AD, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18CD, 0x18AC, 0x20AC, 0x38CE, 0x9931, 0x9931, 0x9931, 0xAA31, 0xFE2D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFEAC, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFEAC, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8E, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAF, 0xFEAE, 0xFEAE, 0xFEAF, 0xFE8E, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFE8F, 0xFEB0, 0xFEAF, 0xFEB0, 0xFE90, 0xE471, 0xB8D2, 0xA111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xB0F1, 0xB0D1, 0xB0D2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x00DF, 0x00DF, 0x011F, 0x011F, 0x049F, 0x07F0, 0x07E2, 0x07F4, 0x07FF, 0x07FF, 0x3AF6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28EE, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x18AC, 0x20AC, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x20AD, 0x18AD, 0x0118, 0x0118, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, + 0x00F8, 0x0118, 0x00F5, 0x18AD, 0x20AC, 0x18AD, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AD, 0x18CD, 0x0116, 0x0118, 0x0117, 0x18CF, 0x20AC, 0x20AC, 0x20AD, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AD, 0x20AC, 0x60EF, 0x9912, 0x9931, 0x9931, 0xB270, 0xF62D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE6D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFEB0, 0xFEB0, 0xE471, 0xB8D1, 0xA111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xB0F1, 0xB0D1, 0x90B4, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x049F, 0x07F1, 0x07E2, 0x07F6, 0x07FF, 0x0F9F, 0x4A35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CE, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AD, 0x20AD, 0x0118, 0x0118, 0x18CE, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AD, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, + 0x18CE, 0x0117, 0x0118, 0x0115, 0x18AD, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AD, 0x00F6, 0x0118, 0x0117, 0x18CE, 0x18AC, 0x20CC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AD, 0x18CC, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x28AD, 0x8110, 0x9931, 0x9931, 0x9911, 0xAA31, 0xF5CD, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE6E, 0xFE8D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE90, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xE471, 0xB0D1, 0xA111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xB0D1, 0xB0D1, 0x7896, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x00BF, 0x011F, 0x011F, 0x013F, 0x017F, 0x04BF, 0x07F2, 0x07E2, 0x07F5, 0x07FF, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30EF, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AD, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x00F5, 0x0117, 0x00F7, 0x18CE, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20AC, 0x18AE, 0x0117, 0x0118, 0x08F5, 0x18AD, 0x18AC, 0x18CD, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x08F3, 0x0118, 0x0117, 0x18CE, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x28AD, 0x9111, 0x9931, 0x9931, 0x9931, 0xA171, 0xCBCF, 0xF60D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE70, 0xFE70, 0xFE6F, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE90, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xE471, 0xA8F1, 0xA111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xB0D1, 0xB0D1, 0x5878, 0x001F, 0x001F, 0x003F, 0x007F, 0x009F, 0x00FF, 0x013F, 0x013F, 0x017F, 0x019F, 0x033F, 0x07F3, 0x07E2, 0x07F3, 0x07FF, 0xA8F1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AD, 0x20AC, 0x18AC, 0x18AD, 0x00F5, 0x0118, 0x0117, 0x18CE, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x18AC, 0x20AC, 0x18CE, 0x08F5, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0117, 0x00F7, 0x18CE, 0x20AC, 0x18CC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x28CD, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xBAB0, 0xDC6F, 0xE50F, 0xE50E, 0xFE4E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6F, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xF612, 0xE531, 0xE512, 0xD472, 0xB271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xB0F1, 0xB0F1, 0x285C, 0x003F, 0x005F, 0x007F, 0x00BF, 0x00FF, 0x013F, 0x015F, 0x017F, 0x019F, 0x01BF, 0x02FF, 0x07F4, 0x07E3, 0x07F1, 0x2E5C, 0xA911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AC, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18CC, 0x20AC, 0x18AD, 0x0115, 0x0118, 0x00F7, 0x18AE, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x10D0, 0x10D2, 0x08D2, 0x18AE, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, + 0x18AC, 0x20AC, 0x20AC, 0x18CD, 0x0116, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x18CE, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x28CC, 0x610F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xB0F1, 0xB0D1, 0x087F, 0x009F, 0x00BF, 0x00DF, 0x011F, 0x015F, 0x019F, 0x019F, 0x019F, 0x01DF, 0x01DF, 0x01FF, 0x07F7, 0x07E3, 0x07EF, 0x5498, 0xA8F1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30EF, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x0117, 0x0117, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AD, 0x0115, 0x0117, 0x00F7, 0x18AE, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AD, 0x00F5, 0x0117, 0x0118, 0x0117, 0x0117, 0x08F3, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20CC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, + 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x40CE, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xA111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xB0F1, 0x98F3, 0x00DF, 0x00FF, 0x011F, 0x013F, 0x017F, 0x01BF, 0x01BF, 0x01DF, 0x01DF, 0x01FF, 0x01FF, 0x021F, 0x06D9, 0x07E5, 0x07EC, 0x7355, 0xA8F1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390F, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x28CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x0117, 0x00F7, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AD, 0x00F5, 0x0117, 0x0116, 0x18CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x00F5, 0x0117, 0x0118, 0x08F5, 0x0116, 0x0117, 0x0117, 0x10F2, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AB, 0x20AC, 0x20AC, + 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x30CC, 0x58CF, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xA111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xA8F1, 0xB0F1, 0x80F5, 0x013F, 0x017F, 0x019F, 0x01BF, 0x01DF, 0x01FF, 0x01DF, 0x01FF, 0x021F, 0x023F, 0x023F, 0x023F, 0x057D, 0x07E8, 0x07E9, 0x82D5, 0xA0F1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38F0, 0x38EF, 0x30EF, 0x30EE, 0x28CE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x00F7, 0x0117, 0x10D0, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18CD, 0x00F5, 0x0117, 0x08F5, 0x18AD, 0x20AC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AD, 0x0117, 0x0117, 0x10D0, 0x20AC, 0x20AC, 0x08F3, 0x0117, 0x0115, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, + 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20AD, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CE, 0x28EE, 0x28EE, 0x30EE, 0x30EF, 0x30EF, 0x30EE, 0x38EF, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xA932, 0xA131, 0xB131, 0xC912, 0xC911, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0x5158, 0x01BF, 0x01DF, 0x01FF, 0x021F, 0x023F, 0x023F, 0x021F, 0x023F, 0x025F, 0x025F, 0x025F, 0x025F, 0x041F, 0x07ED, 0x07E4, 0x7AB4, 0xA911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38EF, 0x30EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x10D0, 0x0117, 0x00F7, 0x10D0, 0x20AC, 0x20CC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x00F5, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x20AC, 0x20AC, 0x20AC, 0x10EF, 0x0117, 0x0117, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, + 0x20AC, 0x18AC, 0x18AC, 0x18CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AB, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28AD, 0x28CE, 0x30CE, 0x30CE, 0x30EE, 0x8151, 0xB192, 0xC9B3, 0xC9B2, 0xC992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC932, 0xC912, 0xC912, 0xC111, 0xC8F1, 0xC8F1, 0xC8D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D2, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0x39BB, 0x021F, 0x023F, 0x025F, 0x027F, 0x027F, 0x025F, 0x025F, 0x027F, 0x027F, 0x027F, 0x027F, 0x027F, 0x029F, 0x07F3, 0x07E2, 0x9972, 0xA911, 0xA112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38EF, 0x30EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x08F2, 0x0117, 0x0116, 0x10D0, 0x20AC, 0x20AB, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AD, 0x00F4, 0x00F7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x18CF, 0x20AC, 0x20AC, 0x10D1, 0x00F7, 0x0115, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, + 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18CC, 0x18AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x18AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CC, 0x20CC, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x30CD, 0x28EE, 0x30EE, 0x490E, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC932, 0xC932, 0xC912, 0xC912, 0xC912, 0xC0F2, 0xC8D1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB8D2, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0x123E, 0x029F, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x029F, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x02DF, 0x06B9, 0x07E3, 0xA111, 0xA911, 0xA111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390F, 0x38EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x08D3, 0x0116, 0x0117, 0x10CF, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x18AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x00F4, 0x0117, 0x0116, 0x08F2, 0x08F2, 0x0117, 0x0116, 0x08F2, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, + 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x18AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x30ED, 0x692F, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC132, 0xC912, 0xC912, 0xC8F2, 0xC8F1, 0xC8D1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0x9933, 0x02DF, 0x02DF, 0x02FF, 0x02FF, 0x02DF, 0x02BF, 0x02DF, 0x02DF, 0x02DF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02FF, 0x051E, 0x07E8, 0xA912, 0xA111, 0xA111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410F, 0x390F, 0x38EE, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x08F2, 0x0116, 0x0117, 0x10D0, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x18CB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x20AB, 0x18AE, 0x0115, 0x0117, 0x0116, 0x0116, 0x0116, 0x00F4, 0x18CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B8, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x28AC, 0x20CC, 0x28CC, 0x28CC, 0x28CC, 0x28CD, 0x28CD, 0x28ED, 0x28CD, 0x30CD, 0x9191, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC912, 0xC932, 0xC912, 0xC112, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8D1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88B4, 0x88B5, 0x88B5, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0x69D6, 0x033F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02DF, 0x02FF, 0x035F, 0x03FF, 0x07F0, 0x8A4F, 0xA111, 0xA111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410F, 0x390F, 0x30EE, 0x30EE, 0x30CD, 0x30CD, 0x28CD, 0x28CD, 0x28CC, 0x28CC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x08F2, 0x0116, 0x0116, 0x10CF, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20CC, 0x08D1, 0x08F3, 0x08F3, 0x10D0, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CC, 0x20AC, 0x28CC, 0x28CC, 0x28CC, 0x20CC, 0x28CC, 0x28CC, 0x28CD, 0x40EE, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC932, 0xC932, 0x90D5, 0x88D6, 0x6098, 0x5879, 0x303C, 0x305C, 0x081E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00BF, 0x00DF, 0x291C, 0x411A, 0x6118, 0x8915, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0x429A, 0x039F, 0x039F, 0x035F, 0x035F, 0x033F, 0x033F, 0x033F, 0x033F, 0x033F, 0x033F, 0x031F, 0x031F, 0x031F, 0x037F, 0x03FF, 0x06D7, 0x7ACF, 0xA111, 0xA111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410F, 0x40EF, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x28CD, 0x28CD, 0x28CC, 0x28CC, 0x20CC, 0x20CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x08F2, 0x0116, 0x0116, 0x10CF, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x20AB, 0x20AB, 0x20AB, 0x20AB, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x28CC, 0x28CC, 0x28CC, 0x28CD, 0x28CC, 0x490E, 0xC1D3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC952, 0x98F5, 0x60B8, 0x407B, 0x183E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x00FF, 0x011F, 0x013F, 0x017F, 0x019F, 0x01DF, 0x021F, 0x21FD, 0x49D9, 0x7996, 0xA112, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0x139E, 0x03DF, 0x03BF, 0x039F, 0x039F, 0x037F, 0x037F, 0x037F, 0x037F, 0x035F, 0x035F, 0x033F, 0x033F, 0x035F, 0x03BF, 0x041F, 0x05DE, 0x7AD1, 0xA111, 0xA111, 0xA111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40EF, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x08F2, 0x0115, 0x0115, 0x10CF, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x18AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x692F, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC992, 0xC9B2, 0xC972, 0xB973, 0x80F7, 0x387B, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00BF, 0x00DF, 0x00FF, 0x013F, 0x015F, 0x019F, 0x01BF, 0x01FF, 0x023F, 0x025F, 0x029F, 0x02DF, 0x02FF, 0x033F, 0x2ADC, 0x5A58, 0x8994, 0xA8F1, 0xA8F1, 0x81D4, 0x041F, 0x041F, 0x03FF, 0x03DF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x037F, 0x035F, 0x037F, 0x039F, 0x03FF, 0x047F, 0x04FF, 0x6375, 0xA112, 0xA111, 0xA111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390F, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x08F1, 0x0115, 0x0115, 0x10CF, 0x20AB, 0x20AB, 0x20AB, 0x20CA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28AC, 0x28CC, 0x28CC, 0x28CC, 0x692E, 0xC9F3, 0xC9D2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC993, 0x80F7, 0x389B, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x083C, 0x085B, 0x105B, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187A, 0x105B, 0x085D, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x017F, 0x01BF, 0x01FF, 0x021F, 0x025F, 0x029F, 0x02DF, 0x02FF, 0x033F, 0x037F, 0x03BF, 0x03DF, 0x041F, 0x043F, 0x0C3F, 0x2BBC, 0x0C3F, 0x045F, 0x043F, 0x041F, 0x041F, 0x03FF, 0x03FF, 0x03FF, 0x03DF, 0x03DF, 0x03BF, 0x039F, 0x037F, 0x039F, 0x03DF, 0x043F, 0x04BF, 0x053F, 0x5398, 0xA111, 0xA111, 0xA111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30CD, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x08F1, 0x0115, 0x0115, 0x10CE, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x1378, 0x1378, 0x1358, 0x1358, 0x1378, 0x1378, 0x1358, 0x1378, 0x1358, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CB, 0x28CB, 0x28CC, 0x28CB, 0x614E, 0xD1F3, 0xC9F3, 0xC9D3, 0xC9B2, 0xC9B3, 0xB173, 0x60D9, 0x081E, 0x003D, 0x083B, 0x1878, 0x1877, 0x28D2, 0x28D2, 0x40EE, 0x38EE, 0x390F, 0x390F, 0x390F, 0x410E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x4910, 0x4130, 0x38F3, 0x28B6, 0x189A, 0x003E, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x00BF, 0x00DF, 0x00FF, 0x013F, 0x015F, 0x019F, 0x01DF, 0x021F, 0x023F, 0x027F, 0x029F, 0x02FF, 0x033F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x047F, 0x04BF, 0x04DF, 0x04DF, 0x04BF, 0x04BF, 0x047F, 0x047F, 0x043F, 0x043F, 0x043F, 0x041F, 0x041F, 0x03FF, 0x03DF, 0x03BF, 0x03BF, 0x03DF, 0x043F, 0x047F, 0x04DF, 0x057F, 0x3C1A, 0xA111, 0xA111, 0xA111, 0xA111, 0x5931, 0x4910, 0x4110, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x08F1, 0x0115, 0x0115, 0x10CF, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x3AF9, 0x3AD9, 0x3AD9, 0x3AD9, 0x3AD9, 0x3AD9, 0x3AF9, 0x3AF9, 0x3AF9, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CB, 0x20CB, 0x28AB, 0x692E, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9B3, 0xB1B2, 0x58F3, 0x1895, 0x28B2, 0x30ED, 0x38ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x390E, 0x390E, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390E, 0x410F, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x492F, 0x4930, 0x4910, 0x38F3, 0x20B8, 0x087D, 0x007F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x017F, 0x019F, 0x01DF, 0x021F, 0x025F, 0x02BF, 0x02DF, 0x031F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x049F, 0x04DF, 0x04FF, 0x051F, 0x051F, 0x053F, 0x04FF, 0x04DF, 0x04BF, 0x049F, 0x047F, 0x047F, 0x045F, 0x045F, 0x043F, 0x041F, 0x03FF, 0x03DF, 0x03FF, 0x043F, 0x045F, 0x04BF, 0x053F, 0x05BF, 0x2CDC, 0xA112, 0xA111, 0xA111, 0xA111, 0x7131, 0x4930, 0x4130, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x08F1, 0x0115, 0x0114, 0x10CE, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x625A, 0x625B, 0x5A5A, 0x5A5A, 0x625B, 0x20CA, 0x20AA, 0x20AA, 0x20AA, + 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28CB, 0x28CB, 0x612E, 0xC9F3, 0xC9D3, 0xC9D3, 0xB992, 0x692E, 0x28CC, 0x28EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x30ED, 0x38ED, 0x38ED, 0x390E, 0x38EE, 0x38EE, 0x38EE, 0x390F, 0x38EE, 0x40EE, 0x40EE, 0x390F, 0x390E, 0x410E, 0x40EF, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4910, 0x4910, 0x4930, 0x4113, 0x28F8, 0x08FE, 0x013F, 0x015F, 0x019F, 0x01DF, 0x021F, 0x023F, 0x029F, 0x02BF, 0x031F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x049F, 0x04DF, 0x051F, 0x053F, 0x057F, 0x059F, 0x057F, 0x055F, 0x053F, 0x04FF, 0x04FF, 0x04DF, 0x04BF, 0x049F, 0x049F, 0x047F, 0x045F, 0x043F, 0x041F, 0x041F, 0x043F, 0x045F, 0x04BF, 0x04FF, 0x055F, 0x05DF, 0x0E1F, 0xA111, 0xA111, 0xA111, 0xA112, 0x8931, 0x4930, 0x4130, 0x410F, 0x410E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x08F1, 0x0115, 0x0114, 0x10CF, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20CB, 0x10CF, 0x10EF, 0x10EF, 0x18CE, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x81DB, 0x81DC, 0x81DB, 0x81DB, 0x81BC, 0x81BB, 0x81BC, 0x81DC, 0x81DC, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x20CB, 0x612E, 0xD1F3, 0xC9F3, 0xC1B2, 0x612E, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197A, 0x01DE, 0x021F, 0x027F, 0x02BF, 0x02FF, 0x033F, 0x037F, 0x03BF, 0x03FF, 0x045F, 0x049F, 0x04DF, 0x051F, 0x057F, 0x059F, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x059F, 0x055F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04DF, 0x04BF, 0x047F, 0x045F, 0x043F, 0x043F, 0x047F, 0x04BF, 0x04FF, 0x053F, 0x05BF, 0x061F, 0x069F, 0x9972, 0xA111, 0xA111, 0xA111, 0xA111, 0x5130, 0x4910, 0x410F, 0x390F, 0x390E, 0x38ED, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x08F1, 0x0115, 0x00F4, 0x18CC, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x18CC, 0x00F3, 0x0115, 0x0114, 0x0115, 0x00F4, 0x00F2, 0x20CB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0xA93D, 0xA93D, 0xA95C, 0xA93D, 0xA95C, 0xA95D, 0xA93C, 0xA95D, 0xA93D, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x510D, 0xD1F3, 0xC9D2, 0x816F, 0x30CC, 0x28AC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31B6, 0x0A9D, 0x02FF, 0x035F, 0x039F, 0x03FF, 0x043F, 0x047F, 0x04BF, 0x051F, 0x055F, 0x05BF, 0x05DF, 0x061F, 0x063F, 0x063F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04BF, 0x047F, 0x047F, 0x047F, 0x049F, 0x04DF, 0x053F, 0x057F, 0x05FF, 0x065F, 0x06DF, 0x7A95, 0xA111, 0xA111, 0xA111, 0xA111, 0x6911, 0x4930, 0x410F, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x08F1, 0x0114, 0x0114, 0x18CD, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x08F2, 0x0115, 0x0114, 0x0115, 0x0114, 0x0115, 0x0114, 0x10EF, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20CB, 0x20AB, 0xC8BE, 0xD0BE, 0xC8BE, 0xC8BE, 0xD0BE, 0xC8BE, 0xD0BE, 0xD0BE, 0xC8BE, + 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x40EC, 0xC1D2, 0xC1B3, 0x490D, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39D5, 0x131C, 0x041F, 0x047F, 0x04BF, 0x051F, 0x055F, 0x059F, 0x05DF, 0x061F, 0x067F, 0x069F, 0x069F, 0x067F, 0x065F, 0x061F, 0x05FF, 0x05FF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04BF, 0x04BF, 0x04BF, 0x04DF, 0x051F, 0x057F, 0x05BF, 0x063F, 0x069F, 0x071F, 0x5438, 0xA111, 0xA111, 0xA111, 0xA111, 0x8111, 0x4930, 0x410F, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x08F1, 0x0115, 0x00F4, 0x18CC, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x18CC, 0x00F5, 0x0115, 0x00F4, 0x0115, 0x0115, 0x0114, 0x0115, 0x00F4, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, + 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x30CB, 0xA992, 0xA9B1, 0x30CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CC, 0x30EC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3A15, 0x237B, 0x053F, 0x059F, 0x5358, 0x349B, 0x0E1F, 0x06BF, 0x06FF, 0x06FF, 0x06DF, 0x06BF, 0x069F, 0x065F, 0x063F, 0x061F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x051F, 0x04FF, 0x04DF, 0x04DF, 0x04FF, 0x051F, 0x055F, 0x059F, 0x05FF, 0x065F, 0x06DF, 0x073F, 0x359B, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x4930, 0x4910, 0x412F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x00F3, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x0115, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20CA, + 0x790F, 0x68EE, 0x50ED, 0x38CC, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x692F, 0x816F, 0x20AB, 0x20CB, 0x20AB, 0x28CB, 0x28CB, 0x28CB, 0x28AB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49D4, 0x243A, 0xA132, 0xA8F1, 0xA8F1, 0xA8F1, 0x8295, 0x8295, 0x5418, 0x351B, 0x06DF, 0x069F, 0x067F, 0x065F, 0x063F, 0x05FF, 0x05FF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x051F, 0x053F, 0x057F, 0x059F, 0x05DF, 0x063F, 0x069F, 0x06FF, 0x077F, 0x0F5F, 0xA111, 0xA111, 0xA111, 0xA111, 0x9931, 0x6911, 0x4930, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x18CB, 0x00F2, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x00F5, 0x0114, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, + 0x8130, 0x8930, 0x8930, 0x8910, 0x8930, 0x790F, 0x690E, 0x48CD, 0x38CC, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20CB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x28CB, 0x28AB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30EE, 0x38ED, 0x38ED, 0x390E, 0x390E, 0x390E, 0x410E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA172, 0x4C39, 0x2D5C, 0x069F, 0x065F, 0x063F, 0x061F, 0x05FF, 0x05DF, 0x059F, 0x057F, 0x055F, 0x055F, 0x055F, 0x057F, 0x059F, 0x05DF, 0x061F, 0x067F, 0x06DF, 0x073F, 0x079F, 0x07DF, 0x8254, 0xA111, 0xA131, 0xA111, 0x9911, 0x8131, 0x4910, 0x410F, 0x410E, 0x38EE, 0x38ED, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x08F2, 0x00F5, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x10F0, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, + 0x8930, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8910, 0x8130, 0x710F, 0x60EE, 0x48ED, 0x38CC, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30EC, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xA111, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA111, 0xA911, 0xA0F1, 0x9972, 0x4419, 0x067F, 0x065F, 0x061F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x059F, 0x05BF, 0x05BF, 0x05DF, 0x061F, 0x065F, 0x06BF, 0x06FF, 0x075F, 0x07BF, 0x07FF, 0x5498, 0xA131, 0xA111, 0xA111, 0xA111, 0x9911, 0x4930, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AB, 0x20CC, 0x00F3, 0x00F4, 0x0114, 0x0114, 0x0114, 0x08F2, 0x20CB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, + 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710F, 0x58ED, 0x48CC, 0x30CB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x28CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30EC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390F, 0x410F, 0x410F, 0x490F, 0x412F, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA111, 0x7A55, 0x34BB, 0x065F, 0x061F, 0x05FF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05FF, 0x063F, 0x065F, 0x069F, 0x06DF, 0x071F, 0x077F, 0x07BF, 0x07FF, 0x2E3C, 0x9911, 0xA111, 0xA111, 0x9931, 0x9931, 0x6910, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20CB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20CB, 0x10CF, 0x10D0, 0x10EF, 0x10CE, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, + 0x8910, 0x8910, 0x8910, 0x810F, 0x890F, 0x890F, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x690F, 0x58EE, 0x40CD, 0x30CC, 0x20AB, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xA111, 0xA111, 0xA111, 0x91B3, 0x62F6, 0x347B, 0x061F, 0x061F, 0x063F, 0x063F, 0x065F, 0x067F, 0x06BF, 0x071F, 0x073F, 0x079F, 0x07DF, 0x07FF, 0x07FF, 0xA111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410F, 0x410E, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x810F, 0x810F, 0x810F, 0x890F, 0x8910, 0x8910, 0x8110, 0x8110, 0x8110, 0x8110, 0x8910, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x810F, 0x710F, 0x50ED, 0x40CC, 0x28AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x91B3, 0x349B, 0x065F, 0x067F, 0x069F, 0x06BF, 0x06FF, 0x073F, 0x077F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x7AD4, 0xA111, 0x9911, 0xA111, 0x9931, 0x9931, 0x4930, 0x410F, 0x390E, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x8910, 0x8910, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x810F, 0x710F, 0x50ED, 0x38CC, 0x28AB, 0x20AB, 0x20AB, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA911, 0xA112, 0xA111, 0xA911, 0xA111, 0xA112, 0xA0F1, 0xA111, 0xA111, 0xA111, 0x7A75, 0x15FD, 0x06BF, 0x06FF, 0x071F, 0x075F, 0x079F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410F, 0x390E, 0x390E, 0x38EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x790F, 0x690E, 0x50ED, 0x38CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x20AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x40EE, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x5931, 0x90F1, 0xA911, 0xA912, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0x9972, 0x353B, 0x071F, 0x073F, 0x077F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x2E3C, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x810F, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8130, 0x8930, 0x8930, 0x790F, 0x690E, 0x50ED, 0x38CC, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x412F, 0x4130, 0x4930, 0x4930, 0x8111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA112, 0xA111, 0xA111, 0x4499, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9931, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490F, 0x410F, 0x38EE, 0x30EE, 0x38ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x90EF, 0x88EF, 0x80EF, 0x810F, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x810F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x810F, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710F, 0x60EE, 0x48ED, 0x38EC, 0x20AA, 0x20AA, 0x20CB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x28AB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x310E, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x7131, 0xA111, 0xA111, 0xA112, 0xA111, 0xA0F1, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA131, 0x6397, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7AD4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390F, 0x38EE, 0x38EE, 0x38ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x990F, 0x990F, 0x910F, 0x910F, 0x890F, 0x88EF, 0x810F, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x710F, 0x58EE, 0x48ED, 0x30CB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30EC, 0x30ED, 0x38EE, 0x30ED, 0x38ED, 0x390E, 0x38EE, 0x410E, 0x410F, 0x410F, 0x4930, 0x4930, 0x6931, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0x9931, 0x9911, 0x6397, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x5C14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410F, 0x390E, 0x390E, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x910F, 0x98EF, 0x910F, 0x910F, 0x98EF, 0x990F, 0x910F, 0x890F, 0x88EF, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x810F, 0x810F, 0x8110, 0x8910, 0x8910, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710F, 0x58ED, 0x40ED, 0x30CB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x30EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x9931, 0xA111, 0x9931, 0x5498, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x35F5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510F, 0x390E, 0x390E, 0x38ED, 0x30ED, 0x30CC, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x890F, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x890F, 0x810F, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x810F, 0x810F, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x890F, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x68EF, 0x50ED, 0x40CC, 0x28CB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x28CB, 0x20CB, 0x28AB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x390E, 0x410F, 0x410F, 0x412F, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xA111, 0xA111, 0xA111, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA111, 0xA111, 0xA111, 0x3D7A, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07F6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390E, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28AB, 0x28AB, 0x20AB, 0x20AB, 0x20CA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x18AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x78EE, 0x78EE, 0x80EE, 0x80EE, 0x80EE, 0x78EE, 0x80EE, 0x80EE, 0x80EF, 0x80EF, 0x80EF, 0x80EE, 0x80EF, 0x810F, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x8910, 0x8110, 0x8130, 0x8910, 0x810F, 0x8110, 0x810F, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x8110, 0x690F, 0x50ED, 0x38CC, 0x28AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20CB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x18AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28CB, 0x20AB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xA111, 0xA111, 0xA111, 0x9931, 0xA111, 0xA111, 0xA112, 0x9931, 0x9911, 0x9192, 0x1EBD, 0x07FF, 0x07FF, 0x07FE, 0x07F6, 0x7A71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410E, 0x38EE, 0x30ED, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20AB, 0x28AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20CA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x208A, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, + 0x78EE, 0x78EE, 0x78EE, 0x78EE, 0x80EE, 0x78EE, 0x78EE, 0x80EE, 0x80EE, 0x80EF, 0x80EF, 0x80EE, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x810E, 0x810F, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x8110, 0x810F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x890F, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8130, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8910, 0x8910, 0x8130, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8130, 0x8930, 0x710F, 0x690E, 0x50ED, 0x38CC, 0x28AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20CB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AC, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CC, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x28CE, 0x28CE, 0x28CE, 0x28EE, 0x28CE, 0x28EE, 0x30EE, 0x30EF, 0x30EF, 0x30EF, 0x390F, 0x390F, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xA111, 0xA111, 0xA111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07FF, 0x07FF, 0x07FD, 0x07F6, 0x5C32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390F, 0x30EF, 0x30EF, 0x30EE, 0x30CE, 0x28CD, 0x28EE, 0x28ED, 0x28CD, 0x20CD, 0x20AC, 0x20CD, 0x20CD, 0x20AD, 0x20CD, 0x20AD, 0x20CC, 0x20CC, 0x20AD, 0x20CC, 0x20AC, 0x20CC, 0x20CC, 0x20AC, 0x20AC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CD, 0x20AD, 0x18CC, 0x20CC, 0x20AC, 0x20CC, 0x20AD, 0x20CC, 0x20AC, 0x20AC, 0x20CC, 0x18CC, 0x18CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AB, 0x18AB, 0x18AB, 0x18AC, 0x18AC, 0x18AC, 0x18AB, + 0x78D0, 0x78D0, 0x78D0, 0x78F0, 0x78F0, 0x78F1, 0x78F0, 0x78F0, 0x78F0, 0x78F1, 0x78F1, 0x80F0, 0x78F1, 0x78F0, 0x80F1, 0x80D1, 0x80F1, 0x80F1, 0x80F1, 0x80F1, 0x80F0, 0x80F0, 0x80F0, 0x80F0, 0x80F0, 0x80F0, 0x80F0, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8111, 0x8111, 0x8111, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8911, 0x8110, 0x8110, 0x8111, 0x8110, 0x8911, 0x8911, 0x8911, 0x8111, 0x8911, 0x8911, 0x8910, 0x8911, 0x8911, 0x8911, 0x8911, 0x8111, 0x8131, 0x8131, 0x8931, 0x8911, 0x8911, 0x8911, 0x8911, 0x8931, 0x8911, 0x8131, 0x8131, 0x8931, 0x8130, 0x8131, 0x8911, 0x8931, 0x7931, 0x6111, 0x4911, 0x30D2, 0x18F2, 0x10F2, 0x18D2, 0x18D2, 0x10F2, 0x18D2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F2, 0x20F2, 0x18F2, 0x18F2, 0x20F2, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F2, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x28F3, 0x28F3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28F3, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xA111, 0xA111, 0x9931, 0x9911, 0xA111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5C38, 0x07FF, 0x07FD, 0x07F6, 0x44F2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x1912, 0x18F2, 0x20F3, 0x18F2, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18D2, 0x10F2, 0x18F2, 0x18D2, 0x10F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x10F2, 0x10F2, 0x18F2, 0x18F2, 0x10F2, 0x10F2, 0x10F2, 0x10D2, 0x10D2, 0x10D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x10D2, 0x10D2, 0x10D2, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10B1, 0x10B1, 0x10B1, 0x10B1, 0x10D0, 0x10B0, 0x10D0, 0x10B0, 0x10B0, 0x10D0, 0x10B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, + 0x0051, 0x0071, 0x0071, 0x0071, 0x0071, 0x0051, 0x0071, 0x0070, 0x0870, 0x0870, 0x0071, 0x0071, 0x0091, 0x0870, 0x0071, 0x0091, 0x0071, 0x0871, 0x0871, 0x0891, 0x0871, 0x0871, 0x0871, 0x0871, 0x0891, 0x0891, 0x0891, 0x0891, 0x0871, 0x0871, 0x0871, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0891, 0x0891, 0x0891, 0x0892, 0x0891, 0x0891, 0x08B1, 0x08B1, 0x08B1, 0x08B2, 0x10B2, 0x08B1, 0x08B2, 0x08B1, 0x08B2, 0x08B2, 0x08B2, 0x10B2, 0x10B2, 0x10B2, 0x10B2, 0x10B2, 0x08B2, 0x10B2, 0x10B2, 0x08B2, 0x08B2, 0x10B2, 0x10B2, 0x10B2, 0x10B2, 0x10B2, 0x10D2, 0x10D2, 0x10D2, 0x10F2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x18D2, 0x18D2, 0x10F2, 0x18D2, 0x18D2, 0x10D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x20F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2112, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F2, 0x20F3, 0x20F2, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x28F3, 0x2113, 0x20F3, 0x2113, 0x28F3, 0x20F3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28F3, 0x28F3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28F3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xA111, 0xA112, 0xA111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2E5C, 0x07FC, 0x07F6, 0x2E53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20F3, 0x2112, 0x20F3, 0x20D3, 0x1912, 0x18F2, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x20F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x10F2, 0x10F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x10F2, 0x18F2, 0x18D2, 0x10F2, 0x18F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10D2, 0x10D2, 0x10F2, 0x10F2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D1, 0x10D1, 0x10D2, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x08B0, 0x10B0, 0x10B0, 0x08B0, 0x08B0, 0x10B0, 0x10D0, 0x08D0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, + 0x0CDC, 0x0CDC, 0x0CDB, 0x0CDC, 0x0CFB, 0x0CDC, 0x14DC, 0x14FC, 0x0CDC, 0x14FC, 0x14DC, 0x0CFC, 0x0CFC, 0x14FC, 0x0CFC, 0x14FC, 0x14FC, 0x14FC, 0x14FC, 0x14FC, 0x14FC, 0x14FC, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x153C, 0x153C, 0x153C, 0x153C, 0x151C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x155C, 0x153C, 0x153C, 0x1D5C, 0x1D5C, 0x1D5C, 0x155C, 0x155C, 0x155C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x155C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x157C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x259C, 0x1DBC, 0x1D9D, 0x259D, 0x1D9C, 0x259C, 0x259C, 0x259C, 0x259C, 0x259C, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x1DDD, 0x25DD, 0x25DD, 0x25DD, 0x25BD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x25FD, 0x2DFE, 0x2DFD, 0x2DFD, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3E, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x365E, 0x365E, 0x2E5D, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3D, 0x363D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x361D, 0x361D, 0x361D, 0x361D, 0x361D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1E, 0x461E, 0x461D, 0x4DFE, 0x4DFD, 0x4E3E, 0x4DFE, 0x55DD, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7A74, 0x07FB, 0x07F6, 0x07F6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4CFB, 0x3DFE, 0x35DD, 0x35DD, 0x2DDD, 0x2DDD, 0x2DDD, 0x2DDD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25DC, 0x25BD, 0x25BD, 0x25BD, 0x1DBD, 0x25BC, 0x1DBD, 0x1DBD, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9C, 0x1D9C, 0x1DBC, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9D, 0x1D9C, 0x1D9D, 0x1D9C, 0x1D7C, 0x1D7C, 0x1D7D, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x157C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x155C, 0x155C, 0x155C, 0x1D5C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151B, 0x151B, 0x151B, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, + 0x0BFB, 0x0BFB, 0x0BFB, 0x0BFB, 0x0BFB, 0x0C1B, 0x0C1B, 0x0C1B, 0x0C1B, 0x141B, 0x141B, 0x145B, 0x14DC, 0x0CDB, 0x14BC, 0x143B, 0x141B, 0x0C1B, 0x0C1B, 0x141C, 0x141B, 0x141B, 0x141B, 0x141B, 0x141B, 0x141B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143C, 0x143B, 0x145B, 0x151C, 0x0D1B, 0x151C, 0x145B, 0x143B, 0x145C, 0x143B, 0x145C, 0x1C5B, 0x143B, 0x145C, 0x145C, 0x145C, 0x145C, 0x145C, 0x145B, 0x145C, 0x145B, 0x145B, 0x1C5C, 0x145C, 0x147C, 0x147C, 0x147C, 0x145C, 0x1C7C, 0x1C5C, 0x147C, 0x147C, 0x1C7C, 0x1CDC, 0x1D5C, 0x155C, 0x1CBC, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7B, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x249C, 0x1C9C, 0x1D9D, 0x1D7C, 0x1CFC, 0x1C9C, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24DC, 0x24DC, 0x24DC, 0x253D, 0x25BD, 0x253D, 0x24DD, 0x24BC, 0x24BC, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24FD, 0x24DC, 0x24DC, 0x24FD, 0x24FD, 0x24FC, 0x24DD, 0x24FD, 0x251C, 0x25FD, 0x255D, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FC, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x251D, 0x24FD, 0x24FD, 0x251D, 0x2D1D, 0x24FD, 0x2CFD, 0x25BD, 0x25BD, 0x253C, 0x2CFC, 0x2D1D, 0x251D, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1C, 0x2D5D, 0x2DDE, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2E1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2DDD, 0x2D5D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2DBD, 0x2DBD, 0x2CFD, 0x2D1D, 0x251C, 0x251C, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x34FD, 0x34FD, 0x34FD, 0x34FD, 0x34FD, 0x3CFD, 0x3CFD, 0x3CFD, 0x3CFD, 0x3D1D, 0x451D, 0x451D, 0x451D, 0x4D1D, 0x4D1D, 0x553D, 0x91B3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA112, 0x9931, 0x9931, 0x5496, 0x07F7, 0x07F7, 0x8A13, 0xA111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34DD, 0x34DD, 0x2CDD, 0x2CDC, 0x2CDD, 0x2CBC, 0x24DC, 0x24BC, 0x24BC, 0x253C, 0x25BD, 0x253C, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C7C, 0x1C9C, 0x1CDC, 0x1D7C, 0x1D5C, 0x1C9C, 0x1C9C, 0x1C7B, 0x1C7C, 0x1C9C, 0x1C7B, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C7C, 0x1C9C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x147C, 0x147C, 0x147C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C5C, 0x1C9C, 0x153C, 0x155C, 0x14BC, 0x145B, 0x145B, 0x1C5C, 0x147B, 0x145B, 0x145B, 0x145B, 0x145B, 0x145B, 0x145B, 0x145B, 0x145C, 0x145C, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x151C, 0x14FB, 0x14FC, 0x145B, 0x143B, 0x143B, 0x141B, 0x141B, 0x141B, 0x141B, 0x141B, 0x141B, + 0x0A5A, 0x0A5A, 0x0A5A, 0x0A5A, 0x0A7A, 0x0A5A, 0x0AFA, 0x0C1B, 0x0CBB, 0x0C9B, 0x0B9B, 0x0A9A, 0x125A, 0x0A7A, 0x0A7A, 0x0A7A, 0x0A7A, 0x127A, 0x127A, 0x0A7A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x129A, 0x129A, 0x129A, 0x133B, 0x145B, 0x0D1C, 0x149C, 0x131B, 0x129B, 0x129B, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129B, 0x129A, 0x129B, 0x129B, 0x129B, 0x129B, 0x129B, 0x129B, 0x129A, 0x129B, 0x1ABB, 0x129B, 0x131B, 0x147C, 0x153B, 0x145C, 0x12FB, 0x1ABB, 0x12BA, 0x1ABB, 0x1ABB, 0x12BB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1B3B, 0x1CFC, 0x157C, 0x1C1C, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x22FB, 0x231C, 0x1D1C, 0x1D5C, 0x235B, 0x22DC, 0x22DB, 0x22DC, 0x22FB, 0x22FC, 0x22DC, 0x22DC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FB, 0x22FB, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231B, 0x22FC, 0x233C, 0x253C, 0x1CFD, 0x22FC, 0x22FC, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x2AFC, 0x2AFC, 0x231C, 0x2B1C, 0x2B1C, 0x259C, 0x247C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x25BD, 0x2BBC, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x25DD, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B7C, 0x259D, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x245D, 0x259C, 0x22FC, 0x2AFC, 0x231C, 0x2AFC, 0x22FC, 0x231C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2AFC, 0x2B1C, 0x2B1C, 0x2B1C, 0x331C, 0x331C, 0x331C, 0x331C, 0x331C, 0x3B1C, 0x3B3D, 0x3B3D, 0x3B3D, 0x433C, 0x433D, 0x4B3D, 0x435D, 0x5A9A, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07F9, 0x72D4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331C, 0x32FC, 0x2AFB, 0x2AFC, 0x2AFB, 0x22FB, 0x22DC, 0x22DC, 0x22FB, 0x22DB, 0x22DB, 0x235C, 0x1D5C, 0x1D1D, 0x231B, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1BFC, 0x1D5C, 0x14DC, 0x1B3B, 0x1ABB, 0x1ADB, 0x1ABB, 0x1ABB, 0x12DB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x129B, 0x12BB, 0x129A, 0x12BA, 0x129A, 0x12DB, 0x143B, 0x151B, 0x14BB, 0x1AFB, 0x12BA, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x127A, 0x127A, 0x127A, 0x131B, 0x147C, 0x14DB, 0x145B, 0x131A, 0x127A, 0x127A, 0x127A, 0x127A, + 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B5A, 0x0C1B, 0x0C9B, 0x0C9B, 0x0BBA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3B, 0x0B3A, 0x0B3A, 0x0B3B, 0x133B, 0x0B3B, 0x0B3B, 0x0B3B, 0x133A, 0x0B3A, 0x0C3B, 0x14DC, 0x14BC, 0x13FB, 0x0B3A, 0x133B, 0x133B, 0x133B, 0x135B, 0x0B5B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x135B, 0x0B5A, 0x135B, 0x135B, 0x135B, 0x135B, 0x0B5B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x13FB, 0x151C, 0x14FC, 0x13DB, 0x135B, 0x137B, 0x137B, 0x137B, 0x137B, 0x135B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x137B, 0x1B5B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x139B, 0x1BBB, 0x14FB, 0x153C, 0x13FB, 0x1B7B, 0x139B, 0x1B7B, 0x1B7C, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, 0x139C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1D3C, 0x1D5C, 0x1BFB, 0x1B9C, 0x1BBB, 0x1B9B, 0x1BBC, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1CDC, 0x1D7D, 0x23FC, 0x1BDC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x1BBC, 0x1BBC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x247C, 0x1D9C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x241C, 0x259D, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x243C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x259C, 0x247C, 0x23BC, 0x23BC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23BC, 0x23BC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x2BDC, 0x2BDC, 0x2BDC, 0x2BDC, 0x2BDC, 0x33DC, 0x33DC, 0x33DC, 0x33DC, 0x3BDC, 0x3BFC, 0x3BFC, 0x3BDC, 0x43FC, 0x43FD, 0x6B18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6B53, 0x07FA, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2BBC, 0x2BBC, 0x2BBC, 0x2BBB, 0x23BB, 0x23BB, 0x239B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BDB, 0x1D5C, 0x1D1C, 0x1B9B, 0x1B9B, 0x139B, 0x139C, 0x1B9B, 0x1B7B, 0x1B7B, 0x139B, 0x1B9B, 0x1B9B, 0x1B7B, 0x1B9B, 0x139B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B9B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x139B, 0x1BBB, 0x151C, 0x151C, 0x13DB, 0x137B, 0x137B, 0x135B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x135B, 0x135B, 0x135B, 0x137B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x13DA, 0x14FB, 0x0CFB, 0x141B, 0x133A, 0x135B, 0x133B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133A, 0x133B, 0x0B5B, 0x133B, 0x133A, 0x0B3A, 0x133A, 0x133A, 0x0B3B, 0x0B3B, 0x0B3B, 0x0B3A, 0x133A, 0x0B1A, 0x0B3B, 0x0B3A, 0x0BDA, 0x14BB, 0x0CBB, 0x0C1B, 0x0B3A, 0x0B3B, 0x0B3A, + 0x0BDB, 0x0C7B, 0x0C7B, 0x0C1A, 0x0B3A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0C1B, 0x0CBB, 0x0C9B, 0x0BBB, 0x0B5A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x133A, 0x133A, 0x0B3A, 0x133B, 0x0B3A, 0x133A, 0x0B3A, 0x133A, 0x0B3A, 0x135A, 0x133A, 0x133B, 0x133A, 0x133B, 0x0B3A, 0x0C7B, 0x0CFB, 0x147B, 0x137B, 0x0B5B, 0x0B5B, 0x135A, 0x135A, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x137B, 0x135A, 0x135A, 0x137B, 0x135A, 0x135B, 0x139B, 0x14BB, 0x14FB, 0x13FB, 0x137B, 0x137B, 0x135B, 0x137B, 0x137A, 0x137A, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1BBB, 0x153C, 0x151C, 0x1B7B, 0x139B, 0x137B, 0x139B, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x13BB, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1C3B, 0x1D5C, 0x1C3C, 0x1B9B, 0x1BBB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1C9C, 0x1D1C, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BDB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1CFC, 0x1C7C, 0x1BBB, 0x1BDB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BDC, 0x23BC, 0x1BBB, 0x1D7C, 0x1BBB, 0x1BDC, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1B9C, 0x1BDC, 0x1BBB, 0x1C5B, 0x1CFB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1D3C, 0x1CBC, 0x1BBB, 0x1BBB, 0x1B9B, 0x1B9C, 0x1B9C, 0x1B9B, 0x1B9B, 0x1BBB, 0x1B9C, 0x1B9B, 0x1BBB, 0x239B, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x2BBC, 0x2BBC, 0x2BBC, 0x2BBC, 0x33BC, 0x33BC, 0x33DC, 0x3BDC, 0x3BDC, 0x3BDC, 0x3BDC, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4C98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4B19, 0x23BC, 0x239B, 0x239B, 0x239B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x14BB, 0x151B, 0x13DB, 0x137B, 0x137A, 0x137B, 0x137B, 0x137A, 0x137B, 0x137B, 0x137B, 0x135B, 0x137B, 0x135B, 0x135B, 0x135B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x135A, 0x13BB, 0x14DB, 0x14BB, 0x137B, 0x135A, 0x135B, 0x0B5A, 0x135B, 0x135B, 0x135A, 0x0B5A, 0x135A, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x0B5A, 0x0B5A, 0x135A, 0x133A, 0x135A, 0x133A, 0x0B3A, 0x133B, 0x133A, 0x0B3A, 0x133B, 0x133B, 0x133A, 0x0B3A, 0x0B3A, 0x0C5B, 0x0CBB, 0x0C5B, 0x0B7A, 0x0B3A, 0x0B3B, 0x0B1A, 0x133B, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B9A, 0x0C9B, 0x0C9B, + 0x0BDA, 0x02F9, 0x01F9, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0178, 0x0178, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0178, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0A1A, 0x0B1A, 0x0C3A, 0x0C1B, 0x0ADA, 0x09F9, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x09F9, 0x0B1A, 0x0C7B, 0x0C1B, 0x0ABA, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11BA, 0x11BA, 0x11B9, 0x09B9, 0x11BA, 0x1199, 0x11BA, 0x11BA, 0x1199, 0x11DA, 0x0B3A, 0x0C9B, 0x0BFB, 0x127A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x12BA, 0x14BB, 0x13FB, 0x11DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BB, 0x11BA, 0x11DA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x127A, 0x14DB, 0x137B, 0x11DA, 0x19BA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x19DB, 0x11DA, 0x19DA, 0x1A3B, 0x14FB, 0x1AFB, 0x19DA, 0x11DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x1A1B, 0x153C, 0x1A3B, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x153B, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x11DB, 0x19DB, 0x19DA, 0x19DB, 0x19FB, 0x153C, 0x123A, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x11DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x19DB, 0x19BA, 0x11DA, 0x11BA, 0x1ABB, 0x14FB, 0x1A5B, 0x19BA, 0x19BA, 0x11DA, 0x11DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19BA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x21DB, 0x21DB, 0x21DB, 0x21FB, 0x21FB, 0x29FB, 0x29FB, 0x29FB, 0x29FB, 0x31FB, 0x321B, 0x31FB, 0x321B, 0x41FA, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72D4, 0x4C98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21DB, 0x21DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11D9, 0x137A, 0x149B, 0x131A, 0x11BA, 0x119A, 0x11B9, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x0999, 0x1199, 0x1199, 0x1199, 0x1199, 0x11BA, 0x11BA, 0x1199, 0x0999, 0x09B9, 0x0999, 0x0A1A, 0x0BFB, 0x0C9B, 0x131A, 0x09DA, 0x119A, 0x0999, 0x0999, 0x0999, 0x1199, 0x099A, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0ABA, 0x0BDA, 0x0C5B, 0x0B3A, 0x09F9, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0979, 0x0979, 0x0979, 0x0999, 0x0979, 0x0999, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0178, 0x0199, 0x0179, 0x0979, 0x0999, 0x02B9, + 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x0AB9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x0AB9, 0x02B9, 0x02B9, 0x02D9, 0x02D9, 0x02B9, 0x0AB9, 0x0AD9, 0x02D9, 0x0AD9, 0x0AB9, 0x0AB9, 0x03BA, 0x043A, 0x043A, 0x0359, 0x02D9, 0x0AD9, 0x02D9, 0x0AD9, 0x02D9, 0x02D9, 0x0AD9, 0x0AD9, 0x0AD9, 0x02D9, 0x0AD9, 0x02D9, 0x02D9, 0x0ADA, 0x0AFA, 0x02FA, 0x02FA, 0x02D9, 0x02FA, 0x0ADA, 0x0AFA, 0x02FA, 0x0AFA, 0x0AFA, 0x0AD9, 0x0AFA, 0x0ADA, 0x0AFA, 0x0B5A, 0x0C5B, 0x047A, 0x0BBA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0C3A, 0x0C9A, 0x0BDA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDB, 0x14BB, 0x0BFA, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x131A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133B, 0x133B, 0x133A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x0B3A, 0x137A, 0x0CDB, 0x0C5B, 0x133B, 0x133B, 0x0B3A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x135B, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x135A, 0x0B5B, 0x133B, 0x143A, 0x147B, 0x135B, 0x135A, 0x133B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x13BB, 0x14DB, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x14FB, 0x135A, 0x135B, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x133A, 0x135B, 0x135A, 0x135B, 0x135B, 0x149B, 0x13FB, 0x133A, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133A, 0x133B, 0x133A, 0x135A, 0x133A, 0x143B, 0x147B, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133A, 0x133A, 0x133B, 0x133A, 0x133A, 0x133A, 0x135B, 0x133B, 0x133B, 0x1B3B, 0x1B5B, 0x1B5B, 0x1B3B, 0x1B5B, 0x235B, 0x235B, 0x235B, 0x235B, 0x2B5B, 0x2B5B, 0x2B7B, 0x2B7B, 0x335B, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72D5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71B4, 0x1B3B, 0x1B3B, 0x133A, 0x133B, 0x133A, 0x131A, 0x131A, 0x131A, 0x131A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0BDA, 0x0CBB, 0x0BDA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0BBA, 0x049B, 0x0C3A, 0x0B3A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x02FA, 0x0AFA, 0x0ADA, 0x0ADA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x02DA, 0x0ADA, 0x0ADA, 0x0ADA, 0x02D9, 0x02D9, 0x02DA, 0x02FA, 0x02D9, 0x0AD9, 0x0AD9, 0x0B5A, 0x045A, 0x045A, 0x033A, 0x0AD9, 0x02D9, 0x02D9, 0x02DA, 0x0ADA, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x0AB9, 0x0AB9, 0x02D9, 0x02D9, 0x0AB9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x0AB9, 0x02B9, 0x02D9, 0x02B9, 0x02D9, 0x0AB9, + 0x0299, 0x0299, 0x0298, 0x0298, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02B8, 0x02B9, 0x0299, 0x02B8, 0x039A, 0x041A, 0x03FA, 0x0339, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02D9, 0x02B9, 0x02B9, 0x02D9, 0x02B9, 0x02D9, 0x03BA, 0x043A, 0x03FA, 0x02F9, 0x02D9, 0x02D9, 0x0AB9, 0x0AB9, 0x02D9, 0x02B9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x0AD9, 0x0AD9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02F9, 0x02D9, 0x02DA, 0x0ADA, 0x0AFA, 0x0BFA, 0x0C5B, 0x0BFA, 0x0AD9, 0x02FA, 0x02F9, 0x02F9, 0x0AF9, 0x02F9, 0x0AF9, 0x02D9, 0x02F9, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0C1A, 0x0C7B, 0x0B5A, 0x0AFA, 0x0AF9, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x031A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0C3A, 0x0C5A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0C5B, 0x0C1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0C7B, 0x0B7A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0CBB, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B7A, 0x0CBB, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDA, 0x0C7B, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x131A, 0x131A, 0x131A, 0x131A, 0x131A, 0x1B1A, 0x1B3A, 0x1B3A, 0x1B3A, 0x1B3A, 0x233A, 0x233A, 0x233B, 0x2B3B, 0x2B5B, 0x3AD9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1B1A, 0x131A, 0x131A, 0x12FA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x02FA, 0x0AFA, 0x035A, 0x045A, 0x0C3A, 0x0AFA, 0x02DA, 0x0AFA, 0x0AF9, 0x02F9, 0x0AFA, 0x0AFA, 0x0AFA, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x0AD9, 0x02D9, 0x02DA, 0x0AD9, 0x0AD9, 0x02BA, 0x02D9, 0x039A, 0x043A, 0x03DA, 0x02D9, 0x0AB9, 0x02D9, 0x0AB9, 0x02B9, 0x02D9, 0x02B9, 0x02B9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02B9, 0x0AB9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02D9, 0x02B9, 0x02D9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02D9, 0x03FA, 0x041A, 0x03B9, 0x02B9, 0x02B9, 0x0299, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x0299, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x0299, 0x02B9, 0x02B9, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02B8, 0x02B8, + 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0198, 0x02B8, 0x0399, 0x0359, 0x0258, 0x0198, 0x0137, 0x0137, 0x0117, 0x0158, 0x0137, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0158, 0x0259, 0x0399, 0x0399, 0x0258, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0158, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03B9, 0x03DA, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01B9, 0x037A, 0x0BDA, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033A, 0x041A, 0x01F9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0A79, 0x043A, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09B9, 0x0C3B, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0C7A, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0BFA, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0BDA, 0x02D9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199A, 0x1999, 0x2199, 0x219A, 0x21BA, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01D8, 0x0399, 0x0399, 0x01D9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0157, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0218, 0x0379, 0x03B9, 0x0258, 0x0158, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0137, 0x0238, 0x0359, 0x0399, 0x0298, 0x0178, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, + 0x0116, 0x0116, 0x0116, 0x00F7, 0x00F6, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0238, 0x0318, 0x0379, 0x0297, 0x0197, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0177, 0x02D8, 0x0399, 0x0318, 0x01D7, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01D8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03D9, 0x02B9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01D9, 0x03F9, 0x01F9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02D9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041A, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02B9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01D8, 0x03F9, 0x01F8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03F9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0138, 0x0117, 0x0137, 0x0238, 0x0379, 0x0379, 0x0238, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0136, 0x0117, 0x0117, 0x0117, 0x0136, 0x0137, 0x01B7, 0x02B8, 0x0399, 0x02B8, 0x0197, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x0116, 0x00F6, 0x0116, 0x01B7, 0x02B7, 0x0378, 0x02B7, 0x01D6, 0x0116, 0x00F7, 0x00F6, 0x0116, 0x00F6, 0x0116, 0x0116, 0x00F6, 0x00F6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0136, 0x0197, 0x02F8, 0x0378, 0x0297, 0x0177, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0116, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01D7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01D7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02F8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03B9, 0x01B8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03F9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03F9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03B9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01B7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x00F7, 0x0217, 0x0339, 0x02F8, 0x0197, 0x0136, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0156, 0x0237, 0x0358, 0x02D8, 0x01F7, 0x0116, 0x00F6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x00F6, 0x00F6, 0x0116, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x0116, + 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x02B7, 0x0297, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x0318, 0x0357, 0x0338, 0x02D7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B8, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B8, 0x02B8, 0x02B7, 0x0317, 0x0358, 0x0338, 0x02F7, 0x02D7, 0x02B7, 0x02B7, 0x02B7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D7, 0x02D8, 0x02D7, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02F7, 0x0358, 0x0378, 0x02F7, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D7, 0x02F8, 0x02F8, 0x0398, 0x0378, 0x02F8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0398, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F7, 0x02F8, 0x02F8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03B8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03B8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0378, 0x0338, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0338, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0AF8, 0x0AF8, 0x0AF8, 0x0AF8, 0x0B18, 0x0B18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1B18, 0x2AF8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0AF8, 0x0AF8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D8, 0x02D8, 0x0378, 0x0378, 0x02D7, 0x02D8, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02B7, 0x02D7, 0x02D7, 0x02D7, 0x02B7, 0x02B7, 0x02F7, 0x0358, 0x0358, 0x02F7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02D7, 0x0338, 0x0357, 0x02F7, 0x0297, 0x0297, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x0297, 0x0297, 0x0297, 0x02B7, 0x0297, 0x0297, 0x02B7, 0x0297, + 0x0175, 0x0155, 0x0155, 0x0156, 0x0175, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x01B6, 0x0257, 0x02F7, 0x02D7, 0x0216, 0x0176, 0x0155, 0x0175, 0x0156, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0176, 0x0155, 0x0176, 0x0176, 0x0176, 0x0175, 0x0176, 0x0175, 0x0156, 0x0176, 0x0176, 0x0176, 0x0155, 0x01B6, 0x0296, 0x0337, 0x0296, 0x01D6, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0196, 0x0176, 0x01B6, 0x02F8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01F7, 0x0337, 0x02D7, 0x01B6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01B6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x02F7, 0x0257, 0x0197, 0x01B6, 0x01B7, 0x01B6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x01B6, 0x01B7, 0x0378, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x01F7, 0x0358, 0x0196, 0x0196, 0x01B6, 0x0196, 0x01B6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02F7, 0x02F7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01B6, 0x01B6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09B7, 0x0997, 0x09B7, 0x09B7, 0x09B7, 0x11B7, 0x11B7, 0x11D7, 0x11B7, 0x11B7, 0x11B7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09B6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02B7, 0x0337, 0x0216, 0x0196, 0x0196, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0196, 0x0195, 0x0216, 0x02F7, 0x0317, 0x0216, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0175, 0x0176, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0175, 0x0155, 0x0196, 0x0256, 0x0317, 0x02B7, 0x01B6, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0155, 0x0155, 0x0175, 0x0155, 0x0155, 0x0155, + 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B4, 0x00D3, 0x00D3, 0x00B4, 0x00D4, 0x0174, 0x0235, 0x02D6, 0x0235, 0x0174, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x0135, 0x0235, 0x02D6, 0x0236, 0x0134, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D4, 0x00D4, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x0115, 0x0236, 0x0317, 0x0256, 0x00F4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x01F6, 0x0317, 0x01F6, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x01B6, 0x0337, 0x01B6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x0155, 0x0337, 0x0156, 0x00D5, 0x00D5, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00D6, 0x00D6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00D5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x0115, 0x0338, 0x0115, 0x00F6, 0x00F5, 0x00F6, 0x00F5, 0x00D6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F6, 0x00D5, 0x00F5, 0x0357, 0x00F5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00F5, 0x00D5, 0x00D5, 0x00D6, 0x00D6, 0x00D5, 0x00F5, 0x02F7, 0x0176, 0x00F5, 0x00D5, 0x00F5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x0116, 0x02F7, 0x01D6, 0x00D6, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x08F6, 0x08F6, 0x08F6, 0x08F6, 0x0916, 0x0916, 0x10F6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08F5, 0x08F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x01D6, 0x02F7, 0x0236, 0x0114, 0x00D5, 0x00D5, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x00D4, 0x00D5, 0x00D4, 0x00D5, 0x00D5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00F4, 0x01D5, 0x02D6, 0x0236, 0x0114, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D3, 0x0114, 0x01F5, 0x02B5, 0x0235, 0x0154, 0x00D3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, + 0x00B1, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00F2, 0x01D3, 0x0253, 0x0234, 0x0173, 0x00D2, 0x0092, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0092, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B3, 0x00B2, 0x0153, 0x0234, 0x0274, 0x01B3, 0x00F3, 0x00B2, 0x00B2, 0x00B3, 0x00B3, 0x00B2, 0x00B3, 0x00B3, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x01B4, 0x02B5, 0x01F4, 0x0113, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00D3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00D3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00D3, 0x00B3, 0x00D3, 0x00D3, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x01D4, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00F4, 0x02B5, 0x01B5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01B5, 0x0255, 0x00D5, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x02F6, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01F5, 0x0235, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x0154, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x08D4, 0x08D4, 0x08D4, 0x08F4, 0x08F4, 0x08F4, 0x08F5, 0x10F4, 0x10D5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00D4, 0x00D4, 0x00D4, 0x00D3, 0x00D3, 0x00D3, 0x00D3, 0x00D3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B3, 0x00D3, 0x00D3, 0x0214, 0x0295, 0x0153, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B2, 0x00B2, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00D2, 0x01B3, 0x0274, 0x01D3, 0x00F2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x0092, 0x00B2, 0x00B1, 0x0172, 0x0253, 0x0233, 0x0152, 0x00B1, 0x0091, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x00B1, + 0x0090, 0x0090, 0x0090, 0x00B0, 0x0151, 0x0212, 0x0232, 0x0191, 0x00F0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0090, 0x0091, 0x00B1, 0x0171, 0x0232, 0x0213, 0x0151, 0x0090, 0x00B0, 0x0090, 0x0091, 0x00B1, 0x00B0, 0x0090, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x0091, 0x00D1, 0x0172, 0x0253, 0x01B2, 0x00D1, 0x00B1, 0x0091, 0x0091, 0x0091, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x00D2, 0x01B2, 0x0273, 0x0172, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x01D3, 0x0253, 0x0112, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0213, 0x01D3, 0x0092, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0253, 0x0153, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0294, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00F2, 0x0293, 0x00D2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x0172, 0x0253, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x08B2, 0x08B2, 0x08B2, 0x08D2, 0x08B2, 0x08D2, 0x08D3, 0x10D3, 0x40F2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00D2, 0x00B2, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0131, 0x0252, 0x01F2, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x00B1, 0x0091, 0x0091, 0x00B0, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x00B1, 0x0090, 0x00B0, 0x0091, 0x00B0, 0x01B2, 0x0252, 0x01B1, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x01D1, 0x0232, 0x0191, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x008F, 0x0130, 0x01B1, 0x0232, 0x01B1, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00D0, 0x0191, 0x0232, 0x01D1, 0x00F0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0171, 0x0232, 0x01D1, 0x00F1, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01D1, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01D2, 0x01F2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0171, 0x0212, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00F1, 0x0252, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0272, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01D1, 0x0171, 0x0091, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01D1, 0x01D1, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01B1, 0x0252, 0x0131, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01B1, 0x0232, 0x0191, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0191, 0x0252, 0x01B1, 0x0110, 0x0090, 0x0090, 0x0090, + 0x0212, 0x01F1, 0x0150, 0x00AF, 0x008F, 0x008F, 0x006F, 0x0090, 0x0090, 0x0070, 0x006F, 0x006F, 0x008F, 0x008F, 0x0070, 0x0070, 0x006F, 0x008F, 0x006F, 0x008F, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x006F, 0x008F, 0x008F, 0x008F, 0x0130, 0x01D1, 0x0212, 0x0191, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x008F, 0x0090, 0x0151, 0x0211, 0x01D1, 0x00F0, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F2, 0x01D1, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01B1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F1, 0x0171, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00B0, 0x00B0, 0x00B1, 0x08B1, 0x08B0, 0x08B1, 0x08B1, 0x50F1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x00F1, 0x0211, 0x01D2, 0x00D0, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x0090, 0x00B0, 0x01B1, 0x0232, 0x0151, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x0090, 0x008F, 0x00B0, 0x0151, 0x0211, 0x0212, 0x0130, 0x00AF, + 0x00CF, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x00AF, 0x0130, 0x01F2, 0x0212, 0x0131, 0x00AF, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x0090, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0130, 0x0212, 0x01F2, 0x00F0, 0x0070, 0x008F, 0x006F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x00D0, 0x0212, 0x01D2, 0x00D0, 0x0090, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x00F0, 0x0232, 0x01B1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0232, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00F0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00F0, 0x0232, 0x00F1, 0x00B0, 0x008F, 0x008F, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0890, 0x08B0, 0x0891, 0x10B0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0191, 0x0212, 0x0150, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x006F, 0x008F, 0x006F, 0x0070, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x00D0, 0x01D2, 0x0212, 0x0150, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x0110, 0x01D1, 0x0212, + 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x00AF, 0x0171, 0x0212, 0x01D1, 0x0110, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x0110, 0x01F2, 0x0212, 0x0130, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0171, 0x0232, 0x0151, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x00F0, 0x0212, 0x0151, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x01F1, 0x01B1, 0x0070, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0130, 0x01F1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0191, 0x01B1, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x008F, 0x0090, 0x006F, 0x008F, 0x0131, 0x0232, 0x00D0, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60F1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006F, 0x0090, 0x006F, 0x008F, 0x008F, 0x0070, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0110, 0x01F2, 0x01D1, 0x00CF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x006F, 0x00F0, 0x01B2, 0x0232, 0x0150, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00F0, + 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006E, 0x00EF, 0x01B1, 0x0212, 0x0191, 0x00D0, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x00EF, 0x01D1, 0x01F1, 0x0130, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0070, 0x008F, 0x006F, 0x008F, 0x0110, 0x0232, 0x01B1, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0110, 0x0252, 0x0130, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0170, 0x01F2, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x01D2, 0x0130, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x00CF, 0x0232, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x0191, 0x0212, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x18AF, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xA111, 0x9931, 0xA111, 0x29D2, 0x01B1, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x0150, 0x0232, 0x0150, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x00F0, 0x01D1, 0x01F1, 0x0130, 0x008F, 0x006F, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006E, 0x008F, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x0130, 0x01D1, 0x0212, 0x0150, 0x00AF, 0x006E, 0x006E, 0x008E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006F, 0x006F, 0x00CF, 0x01B1, 0x0212, 0x0130, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x01B1, 0x0232, 0x010F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0232, 0x00CF, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x010F, 0x0212, 0x00AF, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x00AF, 0x0212, 0x00AF, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x0252, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x01D1, 0x0130, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x01F1, 0x01B1, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28D0, 0x01F2, 0x01D1, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x00CF, 0x01F1, 0x01F1, 0x00CF, 0x006F, 0x006F, 0x006F, 0x006E, 0x006E, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006F, 0x00F0, 0x01D1, 0x01F1, 0x0110, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0150, 0x0212, 0x01D1, 0x0110, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01D1, 0x0212, 0x0150, 0x008F, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0110, 0x0212, 0x01B1, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x008F, 0x006E, 0x006E, 0x006F, 0x006F, 0x008E, 0x006E, 0x0191, 0x01F1, 0x00CF, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006E, 0x006E, 0x006F, 0x00CF, 0x0212, 0x0110, 0x008F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0191, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0232, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0110, 0x01F1, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00AF, 0x0212, 0x0110, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x48D0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008E, 0x008F, 0x01B1, 0x01F2, 0x00AF, 0x006F, 0x006E, 0x008F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x0232, 0x0150, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x0110, 0x01F1, 0x01F1, 0x0110, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x0190, 0x0212, 0x0190, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x0170, 0x0212, 0x0150, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x008E, 0x01D1, 0x01F1, 0x008F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x01F1, 0x0170, 0x006F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0211, 0x00CF, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008F, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x108F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006E, 0x006F, 0x006E, 0x0190, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01B1, 0x01F2, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x01F1, 0x01B1, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, + 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x00EF, 0x01B1, 0x01F1, 0x0150, 0x008F, 0x006E, 0x006E, 0x004E, 0x004E, 0x004E, 0x004E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0170, 0x0212, 0x0171, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0130, 0x0212, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01D1, 0x0190, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01F1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0211, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0170, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x01F1, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x68F0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x0130, 0x01F2, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x01D1, 0x01B1, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, + 0x006E, 0x006D, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x0130, 0x01D1, 0x01D1, 0x010F, 0x006E, 0x006D, 0x006D, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006D, 0x006E, 0x006E, 0x0170, 0x0212, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x01F2, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x0212, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x008E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0211, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01B1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x38B0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x010F, 0x0212, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x01D1, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006D, 0x004D, 0x008E, 0x0150, 0x01F1, 0x01B1, 0x00CF, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x006E, 0x006D, + 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x008E, 0x0170, 0x01F1, 0x01B1, 0x00EF, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x012F, 0x01F1, 0x0170, 0x008E, 0x006D, 0x006D, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x004D, 0x004D, 0x006D, 0x006E, 0x006E, 0x004E, 0x004D, 0x006E, 0x006E, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x004D, 0x0130, 0x01F2, 0x0150, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x00EF, 0x0212, 0x010F, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x00AF, 0x0212, 0x00CF, 0x004E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x008E, 0x0232, 0x008E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x01D1, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x008E, 0x01F1, 0x012F, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x086E, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004E, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x0211, 0x0190, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004D, 0x00EF, 0x01F2, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x004D, 0x006E, 0x006E, 0x006D, 0x004E, 0x006E, 0x012F, 0x01F1, 0x0190, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x004D, 0x006D, 0x006D, + 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x00CE, 0x0190, 0x0211, 0x0170, 0x008E, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004E, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x0150, 0x01F1, 0x01B1, 0x00CE, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006D, 0x004D, 0x004D, 0x004E, 0x004D, 0x004D, 0x006D, 0x006D, 0x008E, 0x01B1, 0x01D1, 0x00CE, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006E, 0x004D, 0x006E, 0x006E, 0x004E, 0x006D, 0x010F, 0x0212, 0x00EF, 0x006D, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x004D, 0x006E, 0x01D1, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0130, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0232, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004D, 0x004D, 0x004E, 0x010F, 0x01D1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x004E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x00CE, 0x0212, 0x00CE, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004D, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x70F0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006E, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x008E, 0x01D1, 0x0190, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x0171, 0x01F2, 0x00EF, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x008E, 0x012F, 0x01F1, 0x0170, 0x008E, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, + 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x00EF, 0x01D1, 0x01D1, 0x012F, 0x008D, 0x004D, 0x006D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x00EF, 0x01F1, 0x01B0, 0x00CE, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x0150, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004E, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x00AE, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x0170, 0x01B1, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x006E, 0x01D1, 0x010F, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004E, 0x0212, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006E, 0x01F1, 0x008E, 0x006D, 0x006E, 0x004D, 0x004D, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x010F, 0x01F1, 0x006D, 0x006D, 0x004D, 0x006E, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004E, 0x006D, 0x006D, 0x004D, 0x40CF, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70F0, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x004D, 0x004D, 0x006D, 0x0191, 0x01B1, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x00EE, 0x01F1, 0x0190, 0x008E, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x004D, 0x004D, 0x006D, 0x0150, 0x0212, 0x0170, 0x008E, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, + 0x0211, 0x0211, 0x0212, 0x01F2, 0x0212, 0x01F2, 0x01F1, 0x0211, 0x0211, 0x01F1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01F1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01F1, 0x0211, 0x0211, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x01F1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0232, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x11F1, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x5991, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01F1, 0x0212, 0x0211, 0x0212, 0x0212, 0x01F2, 0x0212, 0x0211, 0x01F1, 0x0211, 0x0211, 0x01F1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, + 0x004D, 0x004D, 0x004C, 0x004C, 0x004D, 0x00AE, 0x0170, 0x01F1, 0x0170, 0x00CE, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x00EF, 0x01D1, 0x01D1, 0x00EE, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x012F, 0x0212, 0x012F, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x01B1, 0x01D1, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x00AE, 0x0212, 0x00AE, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x0150, 0x014F, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x0212, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x00AE, 0x01F1, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x01B1, 0x0150, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x88F0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9911, 0x9931, 0x40AF, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x010F, 0x0212, 0x00AE, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004C, 0x006D, 0x00CE, 0x01D1, 0x0190, 0x008E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x0170, 0x01F1, 0x012F, 0x006D, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, + 0x004C, 0x004C, 0x004C, 0x00EE, 0x0190, 0x01D1, 0x012F, 0x008D, 0x004C, 0x004C, 0x004C, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x00AE, 0x0190, 0x01D1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x00AE, 0x01B1, 0x01B1, 0x008D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x008D, 0x01B1, 0x0170, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x01D1, 0x010F, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x01F1, 0x008E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x0212, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x01D1, 0x00EE, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x008D, 0x01F1, 0x00EF, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x50CF, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA111, 0x186E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x00EF, 0x01F1, 0x00EF, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004D, 0x006D, 0x0150, 0x01F1, 0x010F, 0x004D, 0x004C, 0x004C, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x008E, 0x0190, 0x01D1, 0x012F, 0x006D, 0x004C, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, + 0x006D, 0x010F, 0x01B1, 0x01D1, 0x00EE, 0x006D, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x00AE, 0x0190, 0x01D1, 0x00EE, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x012F, 0x01F1, 0x012F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004C, 0x004C, 0x004C, 0x008E, 0x01F1, 0x014F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x006D, 0x0170, 0x0190, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x010F, 0x01D1, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x0212, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x010E, 0x01B0, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AE, 0x01F1, 0x00AD, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x308E, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9111, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x01F1, 0x012F, 0x006D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x008D, 0x01B0, 0x01B1, 0x008D, 0x004D, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00CD, 0x0191, 0x01D1, 0x012F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, + 0x01D1, 0x0170, 0x00AE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x0190, 0x01D1, 0x010F, 0x006D, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AE, 0x01D1, 0x0190, 0x008D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00EE, 0x01F1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x012F, 0x01B0, 0x006D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0170, 0x010F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004C, 0x004C, 0x004C, 0x0212, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x006D, 0x01F1, 0x008D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x006C, 0x004C, 0x012F, 0x01B0, 0x006D, 0x004C, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x084D, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x68F0, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x01B0, 0x016F, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x012F, 0x0211, 0x010F, 0x004D, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x0190, 0x01D1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, + 0x006C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x002C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x0150, 0x01F1, 0x012F, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x006D, 0x014F, 0x01D1, 0x010F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x00EE, 0x01D1, 0x00CE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AE, 0x01F1, 0x008E, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x0211, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0212, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0150, 0x012F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0170, 0x0170, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x80F0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x388E, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x006D, 0x01B0, 0x01B1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008E, 0x01B0, 0x01B0, 0x00AD, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x01B0, 0x01B1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, + 0x004C, 0x004C, 0x002C, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002C, 0x002C, 0x002C, 0x002C, 0x002B, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x002C, 0x004C, 0x008D, 0x0150, 0x01D1, 0x012F, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x01B0, 0x0190, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0150, 0x01F1, 0x008D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x01D1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x010F, 0x016F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01F1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x01F1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x006C, 0x01D1, 0x010E, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x50CF, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x084C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x014F, 0x01B1, 0x008D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x010E, 0x01D1, 0x014F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x00CE, 0x01B1, 0x01B1, 0x00EE, 0x004C, 0x002C, 0x004C, + 0x004B, 0x002B, 0x004C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004C, 0x004B, 0x004C, 0x004C, 0x004C, 0x002B, 0x004C, 0x004B, 0x004B, 0x002B, 0x002B, 0x004C, 0x002C, 0x004C, 0x004C, 0x012F, 0x01F1, 0x014F, 0x006C, 0x004B, 0x004C, 0x002C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x002C, 0x002C, 0x002C, 0x002C, 0x002C, 0x002C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x014F, 0x01D1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0150, 0x01B0, 0x006D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0190, 0x014F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01B1, 0x00CE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01F1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01B1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x01F1, 0x00AE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x388E, 0x9931, 0x9931, 0x9931, 0x9931, 0x68D0, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x012E, 0x01D1, 0x008D, 0x004C, 0x004C, 0x004B, 0x004C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x002C, 0x004C, 0x008C, 0x0170, 0x01B1, 0x00AD, 0x004C, 0x004C, 0x002B, 0x002B, 0x004C, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002C, 0x00EE, 0x01B1, 0x0190, 0x00AD, 0x002B, + 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004C, 0x004C, 0x004B, 0x002B, 0x004C, 0x004B, 0x004B, 0x004B, 0x006C, 0x010E, 0x01D1, 0x014F, 0x006C, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x002C, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x00CD, 0x01B1, 0x0170, 0x008C, 0x004B, 0x002C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x002C, 0x004B, 0x004B, 0x004C, 0x0190, 0x0190, 0x004C, 0x004B, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x012F, 0x0190, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x01D1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01F2, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x010E, 0x0170, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00CE, 0x01D1, 0x004C, 0x004C, 0x004C, 0x002B, 0x004C, 0x004C, 0x004C, 0x002C, 0x002C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x104C, 0xA111, 0x9931, 0x9931, 0x9931, 0x288D, 0x004B, 0x004C, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x002B, 0x004B, 0x004C, 0x002B, 0x004B, 0x00EE, 0x01F2, 0x00CD, 0x004B, 0x004C, 0x002B, 0x004C, 0x004C, 0x002B, 0x004B, 0x002B, 0x002B, 0x002C, 0x004B, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004C, 0x002B, 0x00EE, 0x01D1, 0x012F, 0x004C, 0x002B, 0x004C, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004C, 0x002B, 0x004C, 0x00EE, 0x01B1, 0x0170, + 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x004C, 0x010E, 0x01B1, 0x0170, 0x008C, 0x002B, 0x004B, 0x002B, 0x004B, 0x002C, 0x002C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x006C, 0x0170, 0x01D1, 0x00CD, 0x004B, 0x004B, 0x004C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004C, 0x004B, 0x004B, 0x008D, 0x0190, 0x014F, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x004B, 0x002B, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x002B, 0x00CD, 0x01D1, 0x008C, 0x004C, 0x004C, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x002B, 0x004B, 0x004B, 0x004B, 0x002B, 0x014F, 0x012E, 0x002C, 0x004B, 0x004C, 0x004B, 0x004C, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01F1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x004C, 0x01F1, 0x006C, 0x002B, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x002C, 0x004C, 0x004C, 0x002B, 0x004C, 0x014F, 0x01B0, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004B, 0x004C, 0x004B, 0x004B, 0x002B, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x9931, 0x9931, 0x9931, 0x8910, 0x002C, 0x004B, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x002B, 0x004C, 0x002B, 0x004C, 0x002B, 0x002B, 0x004C, 0x004C, 0x004B, 0x00AC, 0x01D1, 0x010F, 0x004B, 0x002C, 0x004C, 0x002C, 0x004C, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x004C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004C, 0x004B, 0x002B, 0x004C, 0x002B, 0x006C, 0x014F, 0x01D1, 0x00CD, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x002B, 0x004B, 0x002B, 0x004C, 0x010E, + 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x00ED, 0x01B1, 0x0170, 0x008D, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x00AD, 0x01D1, 0x016F, 0x004C, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x002B, 0x008D, 0x01D1, 0x012F, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004C, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x006C, 0x01D1, 0x00CD, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004C, 0x002B, 0x004C, 0x004B, 0x004C, 0x004B, 0x004C, 0x01D1, 0x006C, 0x004C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x01F1, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x014F, 0x010E, 0x004B, 0x004B, 0x002C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004C, 0x004B, 0x004B, 0x0190, 0x012F, 0x004B, 0x004C, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004C, 0x004B, 0x004B, 0x002B, 0x70F0, 0x9931, 0x9931, 0x48AE, 0x004B, 0x004B, 0x004C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x008C, 0x01B1, 0x014F, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x00CD, 0x01D1, 0x0150, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, + 0x002A, 0x002A, 0x004A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002A, 0x004A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x00CD, 0x01B0, 0x0170, 0x00AC, 0x002A, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x004B, 0x016F, 0x01D1, 0x00AD, 0x002B, 0x002A, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x00CE, 0x01D1, 0x00CD, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x0190, 0x012F, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x00EE, 0x0190, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x01F2, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x00AD, 0x01B1, 0x002B, 0x002C, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x002B, 0x006C, 0x01D1, 0x00CE, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x60CF, 0x9931, 0x9931, 0x104C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x0190, 0x0190, 0x004C, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x014F, 0x01B1, 0x00AD, 0x002B, 0x002B, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002A, 0x004B, 0x004B, 0x002B, 0x002B, 0x004A, 0x002A, + 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00CD, 0x0190, 0x01B0, 0x00CD, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x004A, 0x002A, 0x004A, 0x002A, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002A, 0x004B, 0x00CD, 0x01D1, 0x012F, 0x004B, 0x004B, 0x002A, 0x004B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x00CE, 0x01D1, 0x00AD, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x014F, 0x0190, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x0190, 0x00CD, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x01D1, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x01B0, 0x00AD, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x00AD, 0x01D1, 0x008C, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x48AE, 0x9931, 0x68F0, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x014F, 0x0190, 0x006C, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004A, 0x004B, 0x004B, 0x002A, 0x002B, 0x004B, 0x002B, 0x002B, 0x002A, 0x002B, 0x004A, 0x00AC, 0x0190, 0x0170, 0x006C, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, + 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x008C, 0x0170, 0x0190, 0x00CD, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x006B, 0x016F, 0x0190, 0x008C, 0x002A, 0x004A, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x012F, 0x01B1, 0x006C, 0x004B, 0x002B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002B, 0x002B, 0x002A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x00CD, 0x01B1, 0x004B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x006C, 0x01D1, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x01D1, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x010E, 0x014F, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x010E, 0x0190, 0x004B, 0x002A, 0x002B, 0x002A, 0x002B, 0x002B, 0x002A, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x308D, 0x9911, 0x206C, 0x004B, 0x002B, 0x002B, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002A, 0x004B, 0x004A, 0x004B, 0x004A, 0x002A, 0x002B, 0x002B, 0x004B, 0x002A, 0x002A, 0x002A, 0x002B, 0x010E, 0x01B1, 0x008C, 0x002A, 0x004A, 0x002B, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x004B, 0x010E, 0x01B0, 0x00ED, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x0029, 0x008B, 0x016F, 0x01B0, 0x00CD, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00ED, 0x01B1, 0x010E, 0x004A, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x004B, 0x014F, 0x016F, 0x004B, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x002A, 0x008B, 0x01B1, 0x008C, 0x002B, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x002B, 0x002A, 0x002A, 0x012E, 0x012F, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x01D2, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x004B, 0x01D1, 0x006B, 0x002A, 0x002B, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x014F, 0x014F, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x186B, 0x88F1, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00CD, 0x01B1, 0x00CD, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x00AC, 0x0190, 0x016F, 0x006B, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008B, 0x014F, 0x0190, 0x00ED, 0x004A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x006A, 0x014F, 0x0190, 0x00AB, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x004A, 0x0170, 0x016F, 0x004A, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x004A, 0x0170, 0x00ED, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0190, 0x008C, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x01D1, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x012F, 0x010E, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x004B, 0x0190, 0x00ED, 0x002A, 0x002A, 0x002A, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x286B, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00AC, 0x01B1, 0x00ED, 0x0029, 0x002A, 0x0029, 0x0029, 0x002A, 0x002A, 0x0029, 0x002A, 0x0029, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x00EE, 0x01B1, 0x010D, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0049, 0x012E, 0x0190, 0x00ED, 0x004A, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00CC, 0x01B0, 0x010E, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006B, 0x0190, 0x012E, 0x0049, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x0029, 0x0029, 0x012E, 0x016F, 0x002A, 0x0029, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00AC, 0x0190, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x01D1, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x0029, 0x00AC, 0x0190, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x008B, 0x01B1, 0x008B, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006B, 0x01B0, 0x012E, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008B, 0x0170, 0x014F, 0x006A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x010D, 0x01B1, 0x00ED, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x006A, 0x014F, 0x016F, 0x008B, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006A, 0x01B0, 0x00ED, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x00CD, 0x01B0, 0x004A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x014F, 0x00CD, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01D1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x002A, 0x0190, 0x00AB, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004A, 0x0029, 0x0029, 0x00CC, 0x01B1, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x016F, 0x012E, 0x004A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0009, 0x00ED, 0x01B1, 0x00ED, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x010E, 0x0191, 0x010E, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x01B1, 0x00EC, 0x0008, 0x0028, 0x0028, 0x0029, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x00AB, 0x01B1, 0x00AC, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x006A, 0x01B1, 0x006A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004A, 0x01B1, 0x006A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01B1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00ED, 0x012E, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x012E, 0x016F, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0029, 0x0049, 0x012E, 0x016F, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x006A, 0x014F, 0x0170, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ED, 0x0190, 0x010E, 0x004A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0029, 0x006A, 0x016F, 0x014F, 0x006A, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00CC, 0x0190, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x00CC, 0x012E, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01B1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x004A, 0x01B1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x016F, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x0029, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x010D, 0x0190, 0x006A, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00CC, 0x0190, 0x00ED, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0049, 0x00ED, 0x0190, 0x012F, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x00EC, 0x01B0, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010E, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x012E, 0x012E, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x016F, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012E, 0x00EC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00AB, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00CC, 0x0190, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0049, 0x014E, 0x0170, 0x008B, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00CC, 0x0190, 0x014F, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008A, 0x014F, 0x012F, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012E, 0x014F, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00CC, 0x016F, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x008B, 0x018F, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00AB, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00AC, 0x0190, 0x00AC, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00AC, 0x0190, 0x012E, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00CB, 0x0170, 0x014F, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0009, 0x0028, 0x0049, 0x00ED, 0x0190, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x014F, 0x014F, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010E, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0170, 0x008A, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x014F, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x010D, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012E, 0x0190, 0x00AB, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x00AC, 0x0170, 0x0170, 0x008B, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x008A, 0x016F, 0x014E, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x006A, 0x0170, 0x010E, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x0190, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00CD, 0x010D, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012F, 0x012E, 0x0008, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014F, 0x010E, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00AB, 0x0190, 0x010E, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x008A, 0x016F, 0x016F, 0x00AC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x010D, 0x0190, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014F, 0x010D, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00CB, 0x016F, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x01B1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0170, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x014F, 0x014F, 0x0049, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x010D, 0x01B0, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x008B, 0x014F, 0x0170, 0x00AB, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x008B, 0x0170, 0x014E, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00AB, 0x0191, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00EC, 0x016F, 0x0049, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012E, 0x00CC, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x012E, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0191, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x010E, 0x0170, 0x006A, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008A, 0x0170, 0x014F, 0x004A, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x012F, 0x0190, 0x00EC, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012E, 0x0190, 0x00AB, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x0190, 0x006A, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00AA, 0x0190, 0x008A, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x01B1, 0x0049, 0x0008, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00AB, 0x0170, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00AC, 0x0190, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00EC, 0x0190, 0x008B, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0048, 0x00ED, 0x0190, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x00EC, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0008, 0x00AB, 0x0190, 0x012E, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010E, 0x0170, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0069, 0x0190, 0x008B, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x010E, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010D, 0x014F, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0008, 0x00CB, 0x0191, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x006B, 0x014F, 0x014E, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012E, 0x0190, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012F, 0x014F, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014F, 0x00ED, 0x0029, 0x0028, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0170, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x00ED, 0x010E, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014F, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x0191, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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 }; diff --git a/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp b/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp index 69a045d85a..4768f7e5fc 100644 --- a/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp +++ b/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp @@ -27,52 +27,52 @@ extern const uint8_t btn_rounded_64x52x4[1664] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, - 0x88, 0x88, 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x87, 0x77, 0x78, - 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x66, 0x78, - 0x88, 0x8d, 0xff, 0xb8, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x7b, 0xff, 0xc6, 0x67, - 0x87, 0xbf, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, 0xf9, 0x56, - 0x87, 0xef, 0x84, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x58, 0xfd, 0x46, - 0x87, 0xff, 0x54, 0x44, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xff, 0x45, - 0x87, 0xff, 0x44, 0x45, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xff, 0x45, - 0x87, 0xff, 0x44, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44, - 0x87, 0xef, 0x84, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xfe, 0x44, - 0x87, 0xaf, 0xf6, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xf9, 0x44, - 0x87, 0x7d, 0xff, 0xb8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9c, 0xff, 0xd4, 0x45, - 0x87, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x45, - 0x87, 0x76, 0x56, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x64, 0x44, 0x46, + 0x88, 0x88, 0x79, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x87, 0x77, 0x78, + 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x66, 0x78, + 0x88, 0x8D, 0xFF, 0xB8, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x7B, 0xFF, 0xC6, 0x67, + 0x87, 0xBF, 0xF7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6F, 0xF9, 0x56, + 0x87, 0xEF, 0x84, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFD, 0x46, + 0x87, 0xFF, 0x54, 0x44, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xFF, 0x45, + 0x87, 0xFF, 0x44, 0x45, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xFF, 0x45, + 0x87, 0xFF, 0x44, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, + 0x87, 0xEF, 0x84, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFE, 0x44, + 0x87, 0xAF, 0xF6, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xF9, 0x44, + 0x87, 0x7D, 0xFF, 0xB8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9C, 0xFF, 0xD4, 0x45, + 0x87, 0x76, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x54, 0x45, + 0x87, 0x76, 0x56, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x64, 0x44, 0x46, 0x87, 0x77, 0x65, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x56, 0x88, 0x77, 0x76, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x67, 0x88, 0x77, 0x77, 0x66, 0x65, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x66, 0x78, diff --git a/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp b/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp index 502b592d8e..a315e2df1c 100644 --- a/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp @@ -40,42 +40,42 @@ extern const uint8_t cancel_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdd, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xba, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x77, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xfd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xdd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xa9, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x68, 0x77, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDD, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xBA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x77, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x66, 0x67, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFD, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xD7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xD7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xDD, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xA9, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x68, 0x77, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp b/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp index 8ec4350fe6..23722f616d 100644 --- a/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp @@ -37,44 +37,44 @@ extern const uint8_t chamber_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8F, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, @@ -104,44 +104,44 @@ extern const uint8_t chamber_heated_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0x9b, 0x97, 0x88, 0x88, 0x87, 0x8b, 0xa8, 0x78, 0x88, 0x87, 0x8b, 0xb8, 0x78, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xf9, 0x78, 0x88, 0x78, 0xdf, 0xfb, 0x78, 0x88, 0x77, 0xcf, 0xfc, 0x87, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x7a, 0xff, 0xfd, 0x77, 0x88, 0x79, 0xff, 0xff, 0x87, 0x88, 0x78, 0xdf, 0xff, 0x97, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xff, 0x86, 0x88, 0x78, 0xdf, 0xff, 0xb6, 0x88, 0x77, 0xcf, 0xff, 0xc6, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xb6, 0x78, 0x87, 0x9f, 0xff, 0xd6, 0x78, 0x87, 0x8e, 0xff, 0xf7, 0x68, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x7d, 0xff, 0xe5, 0x67, 0x87, 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x79, 0xff, 0xfa, 0x57, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xe6, 0x57, 0x87, 0x8c, 0xff, 0xf7, 0x57, 0x88, 0x7a, 0xff, 0xfa, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xd5, 0x57, 0x87, 0x8e, 0xff, 0xe6, 0x57, 0x88, 0x7c, 0xff, 0xf8, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xa5, 0x57, 0x87, 0xaf, 0xff, 0xd5, 0x57, 0x87, 0x9f, 0xff, 0xe6, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xff, 0x75, 0x57, 0x78, 0xef, 0xff, 0xa5, 0x57, 0x87, 0xcf, 0xff, 0xb5, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x7c, 0xff, 0xfb, 0x55, 0x67, 0x7b, 0xff, 0xfe, 0x65, 0x57, 0x79, 0xff, 0xff, 0x85, 0x57, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x9f, 0xff, 0xf7, 0x55, 0x67, 0x8e, 0xff, 0xf8, 0x55, 0x67, 0x7d, 0xff, 0xfb, 0x55, 0x67, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x55, 0x77, 0x9f, 0xff, 0xd6, 0x55, 0x77, 0x8f, 0xff, 0xe7, 0x55, 0x68, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x77, 0xdf, 0xff, 0x75, 0x56, 0x87, 0xbf, 0xff, 0xa5, 0x56, 0x77, 0xaf, 0xff, 0xb5, 0x55, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x78, 0xef, 0xfd, 0x65, 0x67, 0x77, 0xcf, 0xff, 0x85, 0x57, 0x87, 0xbf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x78, 0xef, 0xfd, 0x55, 0x68, 0x77, 0xcf, 0xff, 0x75, 0x68, 0x87, 0xbf, 0xff, 0x95, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x78, 0xdf, 0xff, 0x65, 0x78, 0x77, 0xbf, 0xff, 0x95, 0x68, 0x87, 0xaf, 0xff, 0xb5, 0x68, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x9f, 0xff, 0xf8, 0x68, 0x87, 0x8e, 0xff, 0xf9, 0x68, 0x87, 0x7c, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x7b, 0xff, 0xfa, 0x58, 0x88, 0x7b, 0xff, 0xfc, 0x57, 0x88, 0x78, 0xff, 0xfe, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0xdf, 0xd7, 0x57, 0x88, 0x87, 0xbf, 0xf8, 0x56, 0x88, 0x87, 0xaf, 0xfa, 0x56, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8F, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x77, 0x9B, 0x97, 0x88, 0x88, 0x87, 0x8B, 0xA8, 0x78, 0x88, 0x87, 0x8B, 0xB8, 0x78, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x79, 0xFF, 0xF9, 0x78, 0x88, 0x78, 0xDF, 0xFB, 0x78, 0x88, 0x77, 0xCF, 0xFC, 0x87, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x7A, 0xFF, 0xFD, 0x77, 0x88, 0x79, 0xFF, 0xFF, 0x87, 0x88, 0x78, 0xDF, 0xFF, 0x97, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0x86, 0x88, 0x78, 0xDF, 0xFF, 0xB6, 0x88, 0x77, 0xCF, 0xFF, 0xC6, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xB6, 0x78, 0x87, 0x9F, 0xFF, 0xD6, 0x78, 0x87, 0x8E, 0xFF, 0xF7, 0x68, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x7D, 0xFF, 0xE5, 0x67, 0x87, 0x7B, 0xFF, 0xF7, 0x57, 0x88, 0x79, 0xFF, 0xFA, 0x57, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xE6, 0x57, 0x87, 0x8C, 0xFF, 0xF7, 0x57, 0x88, 0x7A, 0xFF, 0xFA, 0x56, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xD5, 0x57, 0x87, 0x8E, 0xFF, 0xE6, 0x57, 0x88, 0x7C, 0xFF, 0xF8, 0x56, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xA5, 0x57, 0x87, 0xAF, 0xFF, 0xD5, 0x57, 0x87, 0x9F, 0xFF, 0xE6, 0x56, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0x75, 0x57, 0x78, 0xEF, 0xFF, 0xA5, 0x57, 0x87, 0xCF, 0xFF, 0xB5, 0x56, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x87, 0x7C, 0xFF, 0xFB, 0x55, 0x67, 0x7B, 0xFF, 0xFE, 0x65, 0x57, 0x79, 0xFF, 0xFF, 0x85, 0x57, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x87, 0x9F, 0xFF, 0xF7, 0x55, 0x67, 0x8E, 0xFF, 0xF8, 0x55, 0x67, 0x7D, 0xFF, 0xFB, 0x55, 0x67, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x87, 0xCF, 0xFF, 0xB5, 0x55, 0x77, 0x9F, 0xFF, 0xD6, 0x55, 0x77, 0x8F, 0xFF, 0xE7, 0x55, 0x68, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x77, 0xDF, 0xFF, 0x75, 0x56, 0x87, 0xBF, 0xFF, 0xA5, 0x56, 0x77, 0xAF, 0xFF, 0xB5, 0x55, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x78, 0xEF, 0xFD, 0x65, 0x67, 0x77, 0xCF, 0xFF, 0x85, 0x57, 0x87, 0xBF, 0xFF, 0x95, 0x56, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x78, 0xEF, 0xFD, 0x55, 0x68, 0x77, 0xCF, 0xFF, 0x75, 0x68, 0x87, 0xBF, 0xFF, 0x95, 0x67, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x78, 0xDF, 0xFF, 0x65, 0x78, 0x77, 0xBF, 0xFF, 0x95, 0x68, 0x87, 0xAF, 0xFF, 0xB5, 0x68, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x87, 0x9F, 0xFF, 0xF8, 0x68, 0x87, 0x8E, 0xFF, 0xF9, 0x68, 0x87, 0x7C, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x7B, 0xFF, 0xFA, 0x58, 0x88, 0x7B, 0xFF, 0xFC, 0x57, 0x88, 0x78, 0xFF, 0xFE, 0x67, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x77, 0xDF, 0xD7, 0x57, 0x88, 0x87, 0xBF, 0xF8, 0x56, 0x88, 0x87, 0xAF, 0xFA, 0x56, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp b/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp index 1ecb09834c..ff623ed349 100644 --- a/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp @@ -40,40 +40,40 @@ extern const uint8_t confirm_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x76, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFC, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xC7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x55, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xBF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x75, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp b/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp index 3514433c8e..b586700986 100644 --- a/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp @@ -53,15 +53,15 @@ extern const uint8_t decrease_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x94, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/directory_32x32x4.cpp b/Marlin/src/lcd/tft/images/directory_32x32x4.cpp index 0297f03fb3..5fa55c8468 100644 --- a/Marlin/src/lcd/tft/images/directory_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/directory_32x32x4.cpp @@ -30,28 +30,28 @@ extern const uint8_t directory_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, - 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, + 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x68, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x68, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/down_32x32x4.cpp b/Marlin/src/lcd/tft/images/down_32x32x4.cpp index b71c0e5e7c..eabf6f97fe 100644 --- a/Marlin/src/lcd/tft/images/down_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/down_32x32x4.cpp @@ -34,21 +34,21 @@ extern const uint8_t down_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x98, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x8f, 0xb4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xfa, 0x48, 0x88, 0x88, - 0x88, 0x78, 0xff, 0xfa, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0x84, 0x88, 0x88, - 0x88, 0x7f, 0xff, 0xff, 0xa3, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfa, 0x47, 0x88, - 0x88, 0x7a, 0xff, 0xff, 0xfa, 0x38, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xff, 0xff, 0xc5, 0x35, 0x88, - 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa3, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfc, 0x43, 0x46, 0x88, - 0x88, 0x87, 0x79, 0xff, 0xff, 0xfa, 0x47, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc4, 0x34, 0x78, 0x88, - 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa4, 0x78, 0x79, 0xff, 0xff, 0xfc, 0x43, 0x47, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xf9, 0x47, 0x9f, 0xff, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0x96, 0xff, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x44, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xc3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xac, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8F, 0xB4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xFA, 0x48, 0x88, 0x88, + 0x88, 0x78, 0xFF, 0xFA, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0x84, 0x88, 0x88, + 0x88, 0x7F, 0xFF, 0xFF, 0xA3, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xFF, 0xFF, 0xFA, 0x47, 0x88, + 0x88, 0x7A, 0xFF, 0xFF, 0xFA, 0x38, 0x88, 0x88, 0x88, 0x77, 0x8F, 0xFF, 0xFF, 0xC5, 0x35, 0x88, + 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xA3, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFC, 0x43, 0x46, 0x88, + 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFA, 0x47, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xC4, 0x34, 0x78, 0x88, + 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xA4, 0x78, 0x79, 0xFF, 0xFF, 0xFC, 0x43, 0x47, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xF9, 0x47, 0x9F, 0xFF, 0xFF, 0xC3, 0x34, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0x96, 0xFF, 0xFF, 0xFC, 0x33, 0x47, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x44, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xFD, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFF, 0xC3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFC, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xC3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAC, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x86, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/fan_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_64x64x4.cpp index 02801ddbc7..1a154a6ea4 100644 --- a/Marlin/src/lcd/tft/images/fan_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/fan_64x64x4.cpp @@ -30,54 +30,54 @@ extern const uint8_t fan0_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x9a, 0xcc, 0xcb, 0xba, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xed, 0xb9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x64, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x74, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x64, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xef, 0xff, 0xff, 0x84, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xfe, 0xa7, 0x67, 0xbf, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xc6, 0x44, 0x44, 0x48, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8a, 0x64, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x87, 0x54, 0x6a, 0xcb, 0x86, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9a, 0xbb, 0xbb, 0xba, 0x98, 0x87, 0x77, 0x87, 0x46, 0xef, 0xff, 0xfa, 0x76, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xad, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xa9, 0x87, 0x7c, 0xff, 0xff, 0xfd, 0x77, 0xac, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x9f, 0xff, 0xff, 0xff, 0x75, 0x9f, 0xea, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x8f, 0xff, 0xff, 0xff, 0x74, 0x8e, 0xff, 0xda, 0x98, 0x87, 0x78, 0x89, 0xab, 0xcd, 0xda, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x7c, 0xff, 0xff, 0xfc, 0x54, 0x8f, 0xff, 0xff, 0xee, 0xdc, 0xdd, 0xee, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x78, 0xcf, 0xff, 0xd6, 0x44, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x77, 0x58, 0xa9, 0x54, 0x45, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x64, 0x44, 0x44, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x86, 0x54, 0x59, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x54, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x76, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x66, 0x78, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x44, 0x44, 0x57, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x45, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x64, 0x44, 0x45, 0x68, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x44, 0x45, 0x67, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x47, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x45, 0x57, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x64, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x46, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x44, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x74, 0x45, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x44, 0x46, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x68, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x45, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x9f, 0xff, 0xff, 0xf7, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xd5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x57, 0xdf, 0xff, 0xff, 0xd8, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x8d, 0xff, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xcc, 0xc9, 0x64, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x9A, 0xCC, 0xCB, 0xBA, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, 0xB9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9B, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x64, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x45, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x74, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x64, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x84, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFE, 0xA7, 0x67, 0xBF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xC6, 0x44, 0x44, 0x48, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8A, 0x64, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x87, 0x54, 0x6A, 0xCB, 0x86, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9A, 0xBB, 0xBB, 0xBA, 0x98, 0x87, 0x77, 0x87, 0x46, 0xEF, 0xFF, 0xFA, 0x76, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0xA9, 0x87, 0x7C, 0xFF, 0xFF, 0xFD, 0x77, 0xAC, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0x75, 0x9F, 0xEA, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x8F, 0xFF, 0xFF, 0xFF, 0x74, 0x8E, 0xFF, 0xDA, 0x98, 0x87, 0x78, 0x89, 0xAB, 0xCD, 0xDA, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x54, 0x7C, 0xFF, 0xFF, 0xFC, 0x54, 0x8F, 0xFF, 0xFF, 0xEE, 0xDC, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x74, 0x78, 0xCF, 0xFF, 0xD6, 0x44, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x77, 0x58, 0xA9, 0x54, 0x45, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x64, 0x44, 0x44, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x74, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x86, 0x54, 0x59, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x54, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x76, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x44, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x66, 0x78, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x45, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x44, 0x44, 0x57, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x45, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x64, 0x44, 0x45, 0x68, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x44, 0x45, 0x67, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x47, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x45, 0x57, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x64, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x44, 0x46, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x74, 0x45, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x44, 0x46, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x8F, 0xFF, 0xFF, 0xFF, 0xFD, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xFF, 0xFF, 0xFF, 0xFB, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x54, 0x45, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x9F, 0xFF, 0xFF, 0xF7, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xFF, 0xFF, 0xD5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x57, 0xDF, 0xFF, 0xFF, 0xD8, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x8D, 0xFF, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xCC, 0xC9, 0x64, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x76, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x55, 0x54, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x44, 0x44, 0x45, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, @@ -103,54 +103,54 @@ extern const uint8_t fan1_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x44, 0x44, 0x46, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x55, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x46, 0x75, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x69, 0xcc, 0xc9, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8f, 0xfd, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x48, 0xdf, 0xff, 0xff, 0xd7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xdf, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x45, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x47, 0xff, 0xff, 0xff, 0x95, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x4b, 0xff, 0xff, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x5d, 0xff, 0xff, 0xff, 0xff, 0x85, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x44, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x44, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x64, 0x45, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x64, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x86, 0x44, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x54, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x87, 0x55, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x87, 0x65, 0x44, 0x46, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x44, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x65, 0x44, 0x44, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x46, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x54, 0x44, 0x48, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x76, 0x67, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x64, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x78, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x64, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x54, 0x56, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x64, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x44, 0x44, 0x67, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x64, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x44, 0x59, 0xa8, 0x57, 0x75, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x46, 0xdf, 0xff, 0xc8, 0x74, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xfe, 0xed, 0xdc, 0xde, 0xef, 0xff, 0xff, 0x84, 0x5c, 0xff, 0xff, 0xfc, 0x74, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8a, 0xdd, 0xcb, 0xa9, 0x88, 0x77, 0x88, 0x9a, 0xdf, 0xfe, 0x84, 0x7f, 0xff, 0xff, 0xff, 0x86, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8a, 0xef, 0x95, 0x7f, 0xff, 0xff, 0xff, 0x97, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8c, 0xa7, 0x7d, 0xff, 0xff, 0xfc, 0x77, 0x89, 0xab, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x86, 0x7a, 0xff, 0xff, 0xe6, 0x47, 0x87, 0x77, 0x88, 0x9a, 0xbb, 0xbb, 0xba, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x56, 0x8b, 0xca, 0x64, 0x57, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6a, 0x87, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x98, 0x44, 0x44, 0x46, 0xcc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x49, 0xff, 0xb7, 0x67, 0xae, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x8f, 0xff, 0xff, 0xef, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x45, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xbd, 0xef, 0xff, 0xff, 0xff, 0xec, 0xb9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x9a, 0xbb, 0xcc, 0xca, 0x98, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x69, 0xCC, 0xC9, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8F, 0xFD, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x48, 0xDF, 0xFF, 0xFF, 0xD7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xDF, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x45, 0xAF, 0xFF, 0xFF, 0xFF, 0xFE, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x47, 0xFF, 0xFF, 0xFF, 0x95, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x4B, 0xFF, 0xFF, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x44, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x44, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x64, 0x45, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x64, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x86, 0x44, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x54, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x87, 0x55, 0x44, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x44, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x87, 0x65, 0x44, 0x46, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x44, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x65, 0x44, 0x44, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x46, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x54, 0x44, 0x48, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x88, 0x76, 0x67, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x76, 0x78, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x54, 0x56, 0x8A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x54, 0x44, 0x44, 0x67, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x44, 0x59, 0xA8, 0x57, 0x75, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x46, 0xDF, 0xFF, 0xC8, 0x74, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFE, 0xED, 0xDC, 0xDE, 0xEF, 0xFF, 0xFF, 0x84, 0x5C, 0xFF, 0xFF, 0xFC, 0x74, 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8A, 0xDD, 0xCB, 0xA9, 0x88, 0x77, 0x88, 0x9A, 0xDF, 0xFE, 0x84, 0x7F, 0xFF, 0xFF, 0xFF, 0x86, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8A, 0xEF, 0x95, 0x7F, 0xFF, 0xFF, 0xFF, 0x97, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8C, 0xA7, 0x7D, 0xFF, 0xFF, 0xFC, 0x77, 0x89, 0xAB, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xA8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x86, 0x7A, 0xFF, 0xFF, 0xE6, 0x47, 0x87, 0x77, 0x88, 0x9A, 0xBB, 0xBB, 0xBA, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x56, 0x8B, 0xCA, 0x64, 0x57, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6A, 0x87, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x98, 0x44, 0x44, 0x46, 0xCC, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x49, 0xFF, 0xB7, 0x67, 0xAE, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x8F, 0xFF, 0xFF, 0xEF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x45, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xBD, 0xEF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x9A, 0xBB, 0xCC, 0xCA, 0x98, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp index a315f8bf8f..4586954ccf 100644 --- a/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp @@ -31,58 +31,58 @@ extern const uint8_t fan_fast0_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x89, 0x98, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x8a, 0xbd, 0xef, 0xfe, 0xec, 0xba, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xac, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x79, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9c, 0xed, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xde, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xbd, 0xed, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xdd, 0xdd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xac, 0xdd, 0xdd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x68, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x68, 0x88, 0x78, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xca, 0xac, 0xdd, 0xdd, 0xdd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x68, 0x87, 0x8a, 0xba, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xba, 0xaa, 0xbc, 0xdd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x78, 0x78, 0xac, 0xbb, 0x97, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xaa, 0xaa, 0xaa, 0xbc, 0xdd, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x56, 0x78, 0x8a, 0xcb, 0xaa, 0xa8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8b, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x57, 0x87, 0x9c, 0xba, 0xaa, 0xb9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9b, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdd, 0xdd, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x55, 0x67, 0x79, 0xbb, 0xba, 0xaa, 0xaa, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9c, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x55, 0x77, 0x9b, 0xcb, 0xaa, 0xaa, 0xaa, 0x96, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x89, 0xaa, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x55, 0x56, 0x79, 0xbc, 0xba, 0xaa, 0xaa, 0xaa, 0xa6, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xcd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x55, 0x68, 0xab, 0xcb, 0xaa, 0xaa, 0xaa, 0xab, 0xb8, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x56, 0x78, 0x9a, 0xaa, 0xaa, 0xbd, 0xce, 0xff, 0xfd, 0xde, 0xff, 0xfc, 0x65, 0x56, 0x9b, 0xcb, 0xba, 0xaa, 0xaa, 0xab, 0xcd, 0xdb, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x65, 0x55, 0x55, 0x57, 0x9a, 0xaa, 0xac, 0xde, 0xfb, 0x86, 0x67, 0x8c, 0xe8, 0x77, 0x8a, 0xcc, 0xba, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0x86, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x65, 0x55, 0x58, 0xaa, 0xab, 0xdd, 0x95, 0x55, 0x55, 0x56, 0x68, 0xaa, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0xdd, 0x95, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x76, 0x55, 0x7a, 0xab, 0xc8, 0x55, 0x57, 0x87, 0x55, 0x56, 0xac, 0xaa, 0xaa, 0xaa, 0xab, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb5, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x76, 0x56, 0xab, 0x95, 0x55, 0xae, 0xff, 0xb7, 0x65, 0x7c, 0xdc, 0xcb, 0xcc, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcd, 0xee, 0xee, 0xed, 0xcb, 0x96, 0x89, 0x65, 0x5a, 0xff, 0xff, 0xfc, 0x77, 0x9c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x79, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x65, 0x6e, 0xff, 0xff, 0xfe, 0x77, 0x9e, 0xec, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xcc, 0xcd, 0xc6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0x8f, 0xff, 0xff, 0xff, 0x75, 0x9f, 0xff, 0xdd, 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x65, 0x8e, 0xff, 0xff, 0xfe, 0x65, 0x8f, 0xff, 0xff, 0xee, 0xdd, 0xdd, 0xee, 0xef, 0xff, 0xff, 0xd6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x7a, 0xff, 0xff, 0xfa, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x77, 0x9d, 0xfd, 0xa5, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x66, 0x66, 0x55, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x75, 0x55, 0x56, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa8, 0x66, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x65, 0x67, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xcb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x67, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xcb, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x55, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xcd, 0xdb, 0xa9, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xdd, 0xba, 0xa8, 0x55, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdc, 0xaa, 0xa7, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdb, 0xaa, 0xa7, 0x56, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xca, 0xaa, 0xa7, 0x56, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x55, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xca, 0xaa, 0xa7, 0x56, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x55, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xba, 0xaa, 0xa8, 0x56, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x56, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xba, 0xaa, 0xb9, 0x56, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xa9, 0x56, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0xef, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0x76, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0x85, 0x78, 0x87, 0x6b, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0xdf, 0xff, 0xec, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa6, 0x68, 0x88, 0x76, 0xae, 0xff, 0xfe, 0xa6, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x6b, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa7, 0x68, 0x88, 0x86, 0x56, 0x89, 0x86, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8b, 0xdd, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa9, 0x57, 0x88, 0x88, 0x65, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x8b, 0xdd, 0xdd, 0xdd, 0xaa, 0xaa, 0xaa, 0xaa, 0x66, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x56, 0x8b, 0xdd, 0xdc, 0xaa, 0xaa, 0xaa, 0xba, 0x65, 0x78, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x79, 0x99, 0x99, 0xaa, 0xaa, 0x97, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x8A, 0xBD, 0xEF, 0xFE, 0xEC, 0xBA, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xAC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x79, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9C, 0xED, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xDE, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xBD, 0xED, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xDD, 0xDD, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAC, 0xDD, 0xDD, 0xDD, 0xDD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x68, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xCB, 0xCD, 0xDD, 0xDD, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x68, 0x88, 0x78, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCA, 0xAC, 0xDD, 0xDD, 0xDD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x55, 0x68, 0x87, 0x8A, 0xBA, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xAC, 0xBA, 0xAA, 0xBC, 0xDD, 0xDD, 0xDD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x55, 0x78, 0x78, 0xAC, 0xBB, 0x97, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xDD, 0xDC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x56, 0x78, 0x8A, 0xCB, 0xAA, 0xA8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCA, 0xAA, 0xAA, 0xAA, 0xAA, 0xCD, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x57, 0x87, 0x9C, 0xBA, 0xAA, 0xB9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9B, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xDD, 0xDD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x55, 0x67, 0x79, 0xBB, 0xBA, 0xAA, 0xAA, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9C, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x55, 0x77, 0x9B, 0xCB, 0xAA, 0xAA, 0xAA, 0x96, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x89, 0xAA, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x55, 0x56, 0x79, 0xBC, 0xBA, 0xAA, 0xAA, 0xAA, 0xA6, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xCD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x55, 0x68, 0xAB, 0xCB, 0xAA, 0xAA, 0xAA, 0xAB, 0xB8, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xAA, 0xAA, 0xBD, 0xCE, 0xFF, 0xFD, 0xDE, 0xFF, 0xFC, 0x65, 0x56, 0x9B, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCD, 0xDB, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x65, 0x55, 0x55, 0x57, 0x9A, 0xAA, 0xAC, 0xDE, 0xFB, 0x86, 0x67, 0x8C, 0xE8, 0x77, 0x8A, 0xCC, 0xBA, 0xAA, 0xAA, 0xAA, 0xCD, 0xDD, 0xDD, 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x65, 0x55, 0x58, 0xAA, 0xAB, 0xDD, 0x95, 0x55, 0x55, 0x56, 0x68, 0xAA, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xCD, 0xDD, 0xDD, 0xDD, 0x95, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x76, 0x55, 0x7A, 0xAB, 0xC8, 0x55, 0x57, 0x87, 0x55, 0x56, 0xAC, 0xAA, 0xAA, 0xAA, 0xAB, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xB5, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x76, 0x56, 0xAB, 0x95, 0x55, 0xAE, 0xFF, 0xB7, 0x65, 0x7C, 0xDC, 0xCB, 0xCC, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xC6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xCD, 0xEE, 0xEE, 0xED, 0xCB, 0x96, 0x89, 0x65, 0x5A, 0xFF, 0xFF, 0xFC, 0x77, 0x9C, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xC6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0x65, 0x6E, 0xFF, 0xFF, 0xFE, 0x77, 0x9E, 0xEC, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0xCC, 0xCD, 0xC6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x8F, 0xFF, 0xFF, 0xFF, 0x75, 0x9F, 0xFF, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xC6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x65, 0x8E, 0xFF, 0xFF, 0xFE, 0x65, 0x8F, 0xFF, 0xFF, 0xEE, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0xD6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x7A, 0xFF, 0xFF, 0xFA, 0x55, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x77, 0x9D, 0xFD, 0xA5, 0x55, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x66, 0x66, 0x55, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x97, 0x75, 0x55, 0x56, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xA8, 0x66, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x65, 0x67, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x67, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xCB, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x55, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xCD, 0xDB, 0xA9, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x55, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCC, 0xDD, 0xBA, 0xA8, 0x55, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xDD, 0xDC, 0xAA, 0xA7, 0x55, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDB, 0xAA, 0xA7, 0x56, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDD, 0xCA, 0xAA, 0xA7, 0x56, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x55, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xDD, 0xCA, 0xAA, 0xA7, 0x56, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x55, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xDD, 0xDD, 0xBA, 0xAA, 0xA8, 0x56, 0x87, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDD, 0xBA, 0xAA, 0xB9, 0x56, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x55, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xDD, 0xDD, 0xBA, 0xAA, 0xA9, 0x56, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0xEF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0x76, 0x88, 0x76, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7E, 0xFF, 0xFF, 0xFD, 0xCD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0x85, 0x78, 0x87, 0x6B, 0xFF, 0xFF, 0xFF, 0xFD, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0xDF, 0xFF, 0xEC, 0xDD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0xA6, 0x68, 0x88, 0x76, 0xAE, 0xFF, 0xFE, 0xA6, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x6B, 0xFF, 0xDC, 0xDD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0xA7, 0x68, 0x88, 0x86, 0x56, 0x89, 0x86, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8B, 0xDD, 0xDD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0xA9, 0x57, 0x88, 0x88, 0x65, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x8B, 0xDD, 0xDD, 0xDD, 0xAA, 0xAA, 0xAA, 0xAA, 0x66, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x56, 0x8B, 0xDD, 0xDC, 0xAA, 0xAA, 0xAA, 0xBA, 0x65, 0x78, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x79, 0x99, 0x99, 0xAA, 0xAA, 0x97, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x56, 0x66, 0x66, 0x65, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, @@ -99,58 +99,58 @@ extern const uint8_t fan_fast1_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x66, 0x66, 0x66, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x57, 0x9a, 0xaa, 0xa9, 0x99, 0x99, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x75, 0x6a, 0xba, 0xaa, 0xaa, 0xac, 0xdd, 0xdb, 0x86, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x67, 0x88, 0x88, 0x86, 0x6a, 0xaa, 0xaa, 0xaa, 0xad, 0xdd, 0xdd, 0xdb, 0x85, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x87, 0x59, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdd, 0xdb, 0x85, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x89, 0x86, 0x56, 0x88, 0x88, 0x67, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdc, 0xdf, 0xfb, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0xae, 0xff, 0xfe, 0xa6, 0x78, 0x88, 0x66, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdc, 0xef, 0xff, 0xd7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x7d, 0xff, 0xff, 0xff, 0xfb, 0x67, 0x88, 0x75, 0x8a, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x58, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x86, 0x7a, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x86, 0x59, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x86, 0x59, 0xba, 0xaa, 0xbd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x55, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x86, 0x58, 0xaa, 0xaa, 0xbd, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x55, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x76, 0x57, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x65, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x57, 0xaa, 0xaa, 0xcd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x65, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0x57, 0xaa, 0xab, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x55, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x57, 0xaa, 0xac, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x58, 0xaa, 0xbd, 0xdc, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x59, 0xab, 0xdd, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x65, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x7b, 0xcd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x65, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x65, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x86, 0x68, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, 0x55, 0x55, 0x77, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x55, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x55, 0x56, 0x66, 0x67, 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x55, 0xad, 0xfd, 0x97, 0x75, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x5a, 0xff, 0xff, 0xfa, 0x75, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xee, 0xed, 0xdd, 0xde, 0xef, 0xff, 0xff, 0x85, 0x6e, 0xff, 0xff, 0xfe, 0x85, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdc, 0xcc, 0xcc, 0xcc, 0xcd, 0xdf, 0xff, 0x95, 0x7f, 0xff, 0xff, 0xff, 0x85, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xcd, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcc, 0xee, 0x97, 0x7e, 0xff, 0xff, 0xfe, 0x65, 0x6b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x97, 0x7c, 0xff, 0xff, 0xfa, 0x55, 0x69, 0x86, 0x9b, 0xcd, 0xee, 0xee, 0xed, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcc, 0xcb, 0xcc, 0xdc, 0x75, 0x67, 0xbf, 0xfe, 0xa5, 0x55, 0x9b, 0xa6, 0x56, 0x78, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x65, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcb, 0xaa, 0xaa, 0xaa, 0xac, 0xa6, 0x55, 0x57, 0x87, 0x55, 0x58, 0xcb, 0xaa, 0x75, 0x56, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x9d, 0xdd, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xab, 0xbb, 0xba, 0xa8, 0x66, 0x55, 0x55, 0x55, 0x9d, 0xdb, 0xaa, 0xa8, 0x55, 0x55, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x8d, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xaa, 0xbc, 0xca, 0x87, 0x78, 0xec, 0x87, 0x66, 0x8b, 0xfe, 0xdc, 0xaa, 0xaa, 0x97, 0x55, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x6b, 0xdd, 0xcb, 0xaa, 0xaa, 0xaa, 0xbb, 0xcb, 0x96, 0x55, 0x6c, 0xff, 0xfe, 0xdd, 0xff, 0xfe, 0xcd, 0xba, 0xaa, 0xaa, 0x98, 0x76, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x68, 0xbb, 0xaa, 0xaa, 0xaa, 0xab, 0xcb, 0xa8, 0x65, 0x55, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x87, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x66, 0xaa, 0xaa, 0xaa, 0xaa, 0xbc, 0xb9, 0x76, 0x55, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdb, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xaa, 0xa9, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x76, 0x9a, 0xaa, 0xaa, 0xab, 0xcb, 0x97, 0x75, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbc, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7a, 0xaa, 0xaa, 0xbb, 0xb9, 0x77, 0x65, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xdd, 0xdb, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x69, 0xba, 0xaa, 0xbc, 0x97, 0x87, 0x55, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xcb, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xaa, 0xab, 0xca, 0x88, 0x76, 0x55, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xdc, 0xba, 0xaa, 0xaa, 0xab, 0xc9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xbc, 0xa8, 0x78, 0x75, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xdc, 0xba, 0xaa, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xba, 0x87, 0x88, 0x65, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xaa, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x78, 0x88, 0x65, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xcb, 0xc9, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x65, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xed, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xde, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xec, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x8a, 0xbc, 0xee, 0xff, 0xed, 0xba, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x57, 0x9A, 0xAA, 0xA9, 0x99, 0x99, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x75, 0x6A, 0xBA, 0xAA, 0xAA, 0xAC, 0xDD, 0xDB, 0x86, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x67, 0x88, 0x88, 0x86, 0x6A, 0xAA, 0xAA, 0xAA, 0xAD, 0xDD, 0xDD, 0xDB, 0x85, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x87, 0x59, 0xAA, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xDD, 0xDB, 0x85, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x89, 0x86, 0x56, 0x88, 0x88, 0x67, 0xAA, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xDC, 0xDF, 0xFB, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0xAE, 0xFF, 0xFE, 0xA6, 0x78, 0x88, 0x66, 0xAA, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xDC, 0xEF, 0xFF, 0xD7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x7D, 0xFF, 0xFF, 0xFF, 0xFB, 0x67, 0x88, 0x75, 0x8A, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xCD, 0xFF, 0xFF, 0xFE, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x58, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x86, 0x7A, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xE7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x86, 0x59, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x86, 0x59, 0xBA, 0xAA, 0xBD, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x55, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x86, 0x58, 0xAA, 0xAA, 0xBD, 0xDD, 0xDC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x76, 0x57, 0xAA, 0xAA, 0xCD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x65, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x57, 0xAA, 0xAA, 0xCD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x65, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x57, 0xAA, 0xAB, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x55, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x57, 0xAA, 0xAC, 0xDD, 0xDC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x55, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x58, 0xAA, 0xBD, 0xDC, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x56, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x59, 0xAB, 0xDD, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x65, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x7B, 0xCD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x65, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBB, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x65, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x86, 0x68, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x55, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x96, 0x55, 0x55, 0x77, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x55, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x55, 0x56, 0x66, 0x67, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x55, 0xAD, 0xFD, 0x97, 0x75, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x5A, 0xFF, 0xFF, 0xFA, 0x75, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xDF, 0xFF, 0xFF, 0xEE, 0xED, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0x85, 0x6E, 0xFF, 0xFF, 0xFE, 0x85, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xCD, 0xDD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0x95, 0x7F, 0xFF, 0xFF, 0xFF, 0x85, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xCD, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xEE, 0x97, 0x7E, 0xFF, 0xFF, 0xFE, 0x65, 0x6B, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0x97, 0x7C, 0xFF, 0xFF, 0xFA, 0x55, 0x69, 0x86, 0x9B, 0xCD, 0xEE, 0xEE, 0xED, 0xCA, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xCB, 0xCC, 0xDC, 0x75, 0x67, 0xBF, 0xFE, 0xA5, 0x55, 0x9B, 0xA6, 0x56, 0x78, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x65, 0xBD, 0xDD, 0xDD, 0xDD, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, 0xAC, 0xA6, 0x55, 0x57, 0x87, 0x55, 0x58, 0xCB, 0xAA, 0x75, 0x56, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x9D, 0xDD, 0xDD, 0xDD, 0xCA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBA, 0xA8, 0x66, 0x55, 0x55, 0x55, 0x9D, 0xDB, 0xAA, 0xA8, 0x55, 0x55, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x8D, 0xDD, 0xDD, 0xCA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCA, 0x87, 0x78, 0xEC, 0x87, 0x66, 0x8B, 0xFE, 0xDC, 0xAA, 0xAA, 0x97, 0x55, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x6B, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCB, 0x96, 0x55, 0x6C, 0xFF, 0xFE, 0xDD, 0xFF, 0xFE, 0xCD, 0xBA, 0xAA, 0xAA, 0x98, 0x76, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x68, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCB, 0xA8, 0x65, 0x55, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xCA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x87, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x66, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xB9, 0x76, 0x55, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xAA, 0xA9, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x76, 0x9A, 0xAA, 0xAA, 0xAB, 0xCB, 0x97, 0x75, 0x55, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDD, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7A, 0xAA, 0xAA, 0xBB, 0xB9, 0x77, 0x65, 0x57, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xDD, 0xDB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x69, 0xBA, 0xAA, 0xBC, 0x97, 0x87, 0x55, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDD, 0xCA, 0xAA, 0xAA, 0xAA, 0xAA, 0xCB, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xAA, 0xAB, 0xCA, 0x88, 0x76, 0x55, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xDD, 0xDD, 0xDC, 0xBA, 0xAA, 0xAA, 0xAB, 0xC9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9B, 0xBC, 0xA8, 0x78, 0x75, 0x56, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xDD, 0xDD, 0xDC, 0xBA, 0xAA, 0xBC, 0xA8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xBA, 0x87, 0x88, 0x65, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDD, 0xDD, 0xDD, 0xDC, 0xAA, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x78, 0x88, 0x65, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDD, 0xDD, 0xDD, 0xCB, 0xC9, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x65, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xDD, 0xDD, 0xDD, 0xDC, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDD, 0xDD, 0xDA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xDD, 0xED, 0xB8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDE, 0xDA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xEC, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9C, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xA9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x8A, 0xBC, 0xEE, 0xFF, 0xED, 0xBA, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x99, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp index baf0651881..7bbd149ae7 100644 --- a/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp @@ -29,61 +29,61 @@ extern const uint8_t fan_slow0_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9a, 0xbb, 0xbb, 0xaa, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xcb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xbc, 0xbb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcb, 0xbb, 0xbb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9b, 0xcb, 0xbb, 0xbb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xac, 0xcb, 0xbb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbc, 0xbb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbc, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9b, 0xcb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xbc, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xcb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xa8, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xbe, 0xff, 0xca, 0xab, 0xce, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xcc, 0xca, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcf, 0xd9, 0x77, 0x77, 0x79, 0xc8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9b, 0xcc, 0xbb, 0xcb, 0x87, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xcc, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9b, 0xcc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x79, 0xb8, 0x77, 0x8a, 0xcb, 0x97, 0x77, 0x8a, 0xa9, 0x88, 0x88, 0x89, 0xab, 0xcc, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x99, 0xaa, 0x99, 0x98, 0x87, 0x77, 0x79, 0x97, 0x78, 0xdf, 0xff, 0xea, 0x77, 0x8a, 0xcb, 0xbb, 0xbb, 0xbb, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7a, 0xce, 0xff, 0xff, 0xff, 0xee, 0xdc, 0xa9, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xfe, 0x97, 0x8c, 0xcb, 0xbc, 0xcc, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xb7, 0x7c, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, - 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xc7, 0x7b, 0xff, 0xec, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcd, 0xcc, 0x97, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xa7, 0x7b, 0xff, 0xff, 0xed, 0xdc, 0xcc, 0xcd, 0xde, 0xff, 0xff, 0xfe, 0x97, 0x88, - 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x7b, 0xff, 0xff, 0xfd, 0x87, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, - 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0xbe, 0xff, 0xc8, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, - 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x77, 0x79, 0x99, 0x87, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, - 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x77, 0x77, 0x77, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x88, - 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x97, 0x78, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, - 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0x98, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, - 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xa8, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xbb, 0xca, 0x87, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, - 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbc, 0xa8, 0x78, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0x87, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xca, 0x78, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbc, 0xb8, 0x78, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbc, 0x97, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xbc, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, 0x87, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xae, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9d, 0xff, 0xff, 0xfd, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xdf, 0xfd, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xcb, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcc, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x8a, 0xbc, 0xcb, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbb, 0xb9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9A, 0xBB, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xAB, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xAC, 0xCB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xBC, 0xBB, 0xBB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xCB, 0xBB, 0xBB, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xBB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8A, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9B, 0xCB, 0xBB, 0xBB, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xAC, 0xCB, 0xBB, 0xBB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xBC, 0xBB, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8A, 0xBC, 0xBB, 0xBB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9B, 0xCB, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xBC, 0xBB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9B, 0xCB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xCB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xAC, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xAB, 0xA8, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9B, 0xBE, 0xFF, 0xCA, 0xAB, 0xCE, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xAB, 0xCC, 0xCA, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCF, 0xD9, 0x77, 0x77, 0x79, 0xC8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9B, 0xCC, 0xBB, 0xCB, 0x87, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8A, 0xCC, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9B, 0xCC, 0xBB, 0xBB, 0xCB, 0x87, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x79, 0xB8, 0x77, 0x8A, 0xCB, 0x97, 0x77, 0x8A, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x87, 0x77, 0x79, 0x97, 0x78, 0xDF, 0xFF, 0xEA, 0x77, 0x8A, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7A, 0xCE, 0xFF, 0xFF, 0xFF, 0xEE, 0xDC, 0xA9, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFE, 0x97, 0x8C, 0xCB, 0xBC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xB7, 0x7C, 0xFD, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0x97, 0x88, + 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xC7, 0x7B, 0xFF, 0xEC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xCC, 0x97, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x8E, 0xFF, 0xFF, 0xFF, 0xA7, 0x7B, 0xFF, 0xFF, 0xED, 0xDC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFE, 0x97, 0x88, + 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x7B, 0xFF, 0xFF, 0xFD, 0x87, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, + 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0xBE, 0xFF, 0xC8, 0x77, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, + 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x77, 0x79, 0x99, 0x87, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, + 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x77, 0x77, 0x77, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x97, 0x88, + 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x97, 0x78, 0x7B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, + 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x98, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x88, + 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xA8, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBB, 0xCA, 0x87, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, + 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBB, 0xBC, 0xA8, 0x78, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBB, 0x87, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xCA, 0x78, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xBC, 0xB8, 0x78, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBC, 0xA8, 0x78, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xBB, 0xBC, 0x97, 0x88, 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 0xBC, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xBB, 0xBB, 0x87, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xEF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xDB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xEF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAE, 0xFF, 0xFF, 0xCB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9D, 0xFF, 0xFF, 0xFD, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xDF, 0xFD, 0xBB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xAC, 0xCB, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xCC, 0xBB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8A, 0xBC, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x8A, 0xBC, 0xCB, 0xCA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8A, 0xBB, 0xB9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, @@ -98,61 +98,61 @@ extern const uint8_t fan_slow1_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xbb, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcb, 0xcc, 0xba, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbc, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9b, 0xcc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbd, 0xff, 0xd9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9d, 0xff, 0xff, 0xfd, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xcf, 0xff, 0xfe, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x78, 0xac, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x78, 0xbc, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x7a, 0xcb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x87, 0x8b, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x78, 0xac, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, - 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x77, 0x8a, 0xcb, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, - 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0xac, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, - 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x9a, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, - 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x78, 0x77, 0x9b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, - 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x77, 0x77, 0x77, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, - 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x77, 0x89, 0x99, 0x77, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, - 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x78, 0xcf, 0xfe, 0xb8, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, - 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0x8d, 0xff, 0xff, 0xfb, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, - 0x88, 0x87, 0x9e, 0xff, 0xff, 0xfe, 0xdd, 0xcc, 0xcc, 0xdd, 0xef, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xff, 0xfe, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x88, 0x88, - 0x88, 0x87, 0x9c, 0xcd, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xef, 0xfb, 0x77, 0xcf, 0xff, 0xff, 0xff, 0x97, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, - 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xfc, 0x77, 0xbf, 0xff, 0xff, 0xff, 0x97, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xcc, 0xcc, 0xbb, 0xcc, 0x87, 0x9e, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x89, 0xac, 0xde, 0xef, 0xff, 0xff, 0xfe, 0xca, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcb, 0xbb, 0xbb, 0xbb, 0xca, 0x87, 0x7a, 0xef, 0xff, 0xd8, 0x77, 0x99, 0x77, 0x77, 0x88, 0x99, 0x9a, 0xa9, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbc, 0xcb, 0xa9, 0x88, 0x88, 0x89, 0xaa, 0x87, 0x77, 0x9b, 0xca, 0x87, 0x78, 0xb9, 0x78, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xcb, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x77, 0x77, 0x77, 0x77, 0x8c, 0xca, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x8b, 0xcb, 0xbc, 0xcb, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xc9, 0x77, 0x77, 0x79, 0xdf, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x7a, 0xcc, 0xcb, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xfe, 0xcb, 0xaa, 0xcf, 0xfe, 0xbb, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x78, 0xab, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xc9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xcb, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbc, 0xb9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xcb, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbc, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbc, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0xcc, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xcb, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbc, 0xca, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbc, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xcc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9a, 0xab, 0xbb, 0xba, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xBB, 0xBA, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xCB, 0xCC, 0xBA, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBC, 0xBA, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xBC, 0xCA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9B, 0xCC, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xBD, 0xFF, 0xD9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9D, 0xFF, 0xFF, 0xFD, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xCF, 0xFF, 0xFE, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xDF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xBB, 0xBB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x97, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x78, 0xAC, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x88, 0x88, 0x78, 0xBC, 0xBB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x7A, 0xCB, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x87, 0x8B, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x78, 0xAC, 0xBB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x77, 0x8A, 0xCB, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, + 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0xAC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, + 0x88, 0x88, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x9A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, + 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x78, 0x77, 0x9B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, + 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x87, 0x77, 0x77, 0x77, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, + 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x77, 0x89, 0x99, 0x77, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, + 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x78, 0xCF, 0xFE, 0xB8, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, + 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x77, 0x8D, 0xFF, 0xFF, 0xFB, 0x77, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, + 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFE, 0xDD, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFB, 0x77, 0xAF, 0xFF, 0xFF, 0xFE, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x88, 0x88, + 0x88, 0x87, 0x9C, 0xCD, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xEF, 0xFB, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0x97, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, + 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBD, 0xFC, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0x97, 0x7B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xBB, 0xCC, 0x87, 0x9E, 0xFF, 0xFF, 0xFC, 0x87, 0x88, 0x89, 0xAC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFE, 0xCA, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCA, 0x87, 0x7A, 0xEF, 0xFF, 0xD8, 0x77, 0x99, 0x77, 0x77, 0x88, 0x99, 0x9A, 0xA9, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBB, 0xBC, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAA, 0x87, 0x77, 0x9B, 0xCA, 0x87, 0x78, 0xB9, 0x78, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBC, 0xCB, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x77, 0x77, 0x77, 0x77, 0x8C, 0xCA, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8B, 0xCB, 0xBC, 0xCB, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xC9, 0x77, 0x77, 0x79, 0xDF, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x7A, 0xCC, 0xCB, 0xA8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFE, 0xCB, 0xAA, 0xCF, 0xFE, 0xBB, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xAB, 0xA8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBC, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xC9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xCB, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBB, 0xBC, 0xB9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xCB, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xBB, 0xBC, 0xBA, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBB, 0xBC, 0xB9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xBB, 0xCC, 0xA8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xBB, 0xBB, 0xCB, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCA, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xBB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xBB, 0xBB, 0xCA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xBC, 0xB8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xCC, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xB9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xC9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9B, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0xA8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9A, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 diff --git a/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp b/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp index 3515b38275..52f9124fdb 100644 --- a/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp @@ -26,34 +26,34 @@ extern const uint8_t feedrate_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x78, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x8a, 0xcd, 0xa8, 0xcc, 0xb9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x9c, 0xef, 0xff, 0xa8, 0xff, 0xff, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x8b, 0xef, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0xd9, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xec, 0x76, 0xbd, 0xef, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x8d, 0xff, 0xff, 0xc9, 0x65, 0x55, 0x65, 0x6a, 0xef, 0xfb, 0x67, 0x87, 0x88, 0x88, - 0x88, 0x77, 0xcf, 0xff, 0xe9, 0x55, 0x55, 0x55, 0x65, 0x55, 0x6b, 0xb5, 0x7d, 0xb7, 0x78, 0x88, - 0x87, 0x7a, 0xff, 0xfe, 0x85, 0x55, 0x56, 0x67, 0x77, 0x66, 0x55, 0x57, 0xdf, 0xf8, 0x78, 0x88, - 0x87, 0x8e, 0xff, 0xf8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x87, 0x76, 0x58, 0xff, 0xfc, 0x67, 0x88, - 0x77, 0xbf, 0xff, 0xa5, 0x55, 0x67, 0x88, 0x88, 0x87, 0x78, 0xb9, 0x66, 0xbf, 0xff, 0x86, 0x88, - 0x78, 0xdf, 0xfd, 0x65, 0x56, 0x78, 0x88, 0x87, 0x77, 0xae, 0xd8, 0x77, 0x7e, 0xff, 0xb5, 0x78, - 0x79, 0xff, 0xfa, 0x55, 0x67, 0x88, 0x88, 0x77, 0x9c, 0xff, 0x86, 0x56, 0x7b, 0xff, 0xe6, 0x68, - 0x7a, 0xff, 0xf7, 0x55, 0x78, 0x88, 0x87, 0x8b, 0xff, 0xfb, 0x55, 0x67, 0x79, 0xff, 0xf8, 0x68, - 0x7b, 0xff, 0xe6, 0x56, 0x78, 0x88, 0x78, 0xdf, 0xff, 0xe7, 0x55, 0x78, 0x79, 0xee, 0xe8, 0x57, - 0x7c, 0xff, 0xd6, 0x57, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xa5, 0x56, 0x78, 0x78, 0x77, 0x76, 0x57, - 0x7c, 0xff, 0xd6, 0x57, 0x88, 0x87, 0x7c, 0xff, 0xfd, 0x65, 0x57, 0x88, 0x78, 0x98, 0x86, 0x57, - 0x7b, 0xff, 0xd6, 0x57, 0x88, 0x88, 0x79, 0xef, 0xe8, 0x55, 0x67, 0x88, 0x79, 0xff, 0xf9, 0x67, - 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x88, 0x87, 0x78, 0x75, 0x55, 0x78, 0x88, 0x7a, 0xff, 0xf8, 0x67, - 0x79, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x65, 0x55, 0x56, 0x88, 0x87, 0x7c, 0xff, 0xd6, 0x56, - 0x78, 0xef, 0xfd, 0x57, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x87, 0x8f, 0xff, 0xb5, 0x57, - 0x77, 0xbf, 0xff, 0x96, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x77, 0xcf, 0xff, 0x85, 0x67, - 0x87, 0x8e, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xfc, 0x55, 0x67, - 0x88, 0x7a, 0xff, 0xfd, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9e, 0xff, 0xf7, 0x55, 0x68, - 0x88, 0x77, 0xbf, 0xff, 0xea, 0x77, 0x77, 0x88, 0x87, 0x77, 0x7a, 0xff, 0xff, 0x95, 0x56, 0x78, - 0x88, 0x87, 0x6c, 0xff, 0xff, 0xc9, 0x87, 0x77, 0x77, 0x89, 0xdf, 0xff, 0xfb, 0x55, 0x56, 0x88, - 0x88, 0x88, 0x76, 0xcf, 0xff, 0xff, 0xdc, 0xbb, 0xbc, 0xef, 0xff, 0xff, 0xa5, 0x55, 0x67, 0x88, - 0x88, 0x88, 0x86, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x55, 0x55, 0x78, 0x88, - 0x88, 0x88, 0x87, 0x65, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xda, 0x65, 0x55, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x55, 0x79, 0xbd, 0xde, 0xdc, 0xb9, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x8A, 0xCD, 0xA8, 0xCC, 0xB9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x9C, 0xEF, 0xFF, 0xA8, 0xFF, 0xFF, 0xDA, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8B, 0xEF, 0xFF, 0xFF, 0x97, 0xFF, 0xFF, 0xFF, 0xD9, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xEC, 0x76, 0xBD, 0xEF, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xC9, 0x65, 0x55, 0x65, 0x6A, 0xEF, 0xFB, 0x67, 0x87, 0x88, 0x88, + 0x88, 0x77, 0xCF, 0xFF, 0xE9, 0x55, 0x55, 0x55, 0x65, 0x55, 0x6B, 0xB5, 0x7D, 0xB7, 0x78, 0x88, + 0x87, 0x7A, 0xFF, 0xFE, 0x85, 0x55, 0x56, 0x67, 0x77, 0x66, 0x55, 0x57, 0xDF, 0xF8, 0x78, 0x88, + 0x87, 0x8E, 0xFF, 0xF8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x87, 0x76, 0x58, 0xFF, 0xFC, 0x67, 0x88, + 0x77, 0xBF, 0xFF, 0xA5, 0x55, 0x67, 0x88, 0x88, 0x87, 0x78, 0xB9, 0x66, 0xBF, 0xFF, 0x86, 0x88, + 0x78, 0xDF, 0xFD, 0x65, 0x56, 0x78, 0x88, 0x87, 0x77, 0xAE, 0xD8, 0x77, 0x7E, 0xFF, 0xB5, 0x78, + 0x79, 0xFF, 0xFA, 0x55, 0x67, 0x88, 0x88, 0x77, 0x9C, 0xFF, 0x86, 0x56, 0x7B, 0xFF, 0xE6, 0x68, + 0x7A, 0xFF, 0xF7, 0x55, 0x78, 0x88, 0x87, 0x8B, 0xFF, 0xFB, 0x55, 0x67, 0x79, 0xFF, 0xF8, 0x68, + 0x7B, 0xFF, 0xE6, 0x56, 0x78, 0x88, 0x78, 0xDF, 0xFF, 0xE7, 0x55, 0x78, 0x79, 0xEE, 0xE8, 0x57, + 0x7C, 0xFF, 0xD6, 0x57, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xA5, 0x56, 0x78, 0x78, 0x77, 0x76, 0x57, + 0x7C, 0xFF, 0xD6, 0x57, 0x88, 0x87, 0x7C, 0xFF, 0xFD, 0x65, 0x57, 0x88, 0x78, 0x98, 0x86, 0x57, + 0x7B, 0xFF, 0xD6, 0x57, 0x88, 0x88, 0x79, 0xEF, 0xE8, 0x55, 0x67, 0x88, 0x79, 0xFF, 0xF9, 0x67, + 0x7B, 0xFF, 0xF7, 0x57, 0x88, 0x88, 0x87, 0x78, 0x75, 0x55, 0x78, 0x88, 0x7A, 0xFF, 0xF8, 0x67, + 0x79, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x65, 0x55, 0x56, 0x88, 0x87, 0x7C, 0xFF, 0xD6, 0x56, + 0x78, 0xEF, 0xFD, 0x57, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x87, 0x8F, 0xFF, 0xB5, 0x57, + 0x77, 0xBF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x77, 0xCF, 0xFF, 0x85, 0x67, + 0x87, 0x8E, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFC, 0x55, 0x67, + 0x88, 0x7A, 0xFF, 0xFD, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9E, 0xFF, 0xF7, 0x55, 0x68, + 0x88, 0x77, 0xBF, 0xFF, 0xEA, 0x77, 0x77, 0x88, 0x87, 0x77, 0x7A, 0xFF, 0xFF, 0x95, 0x56, 0x78, + 0x88, 0x87, 0x6C, 0xFF, 0xFF, 0xC9, 0x87, 0x77, 0x77, 0x89, 0xDF, 0xFF, 0xFB, 0x55, 0x56, 0x88, + 0x88, 0x88, 0x76, 0xCF, 0xFF, 0xFF, 0xDC, 0xBB, 0xBC, 0xEF, 0xFF, 0xFF, 0xA5, 0x55, 0x67, 0x88, + 0x88, 0x88, 0x86, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x55, 0x55, 0x78, 0x88, + 0x88, 0x88, 0x87, 0x65, 0x7B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x65, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x55, 0x79, 0xBD, 0xDE, 0xDC, 0xB9, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0x66, 0x66, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88 diff --git a/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp b/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp index d3c7fd187a..2259472f79 100644 --- a/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp @@ -29,30 +29,30 @@ extern const uint8_t flowrate_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0x78, 0xce, 0xeb, 0x77, 0x77, 0x87, 0x7c, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x89, 0x77, 0xef, 0xfd, 0x67, 0xa8, 0x77, 0x7e, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x78, 0xdf, 0xba, 0xff, 0xfe, 0x8b, 0xfd, 0x87, 0x7d, 0xfa, 0x56, 0x87, 0x77, 0x88, 0x88, - 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x7d, 0xfa, 0x56, 0x77, 0x87, 0x77, 0x88, - 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x7d, 0xfa, 0x56, 0x9c, 0xdc, 0x97, 0x78, - 0x87, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x6d, 0xfa, 0x59, 0xff, 0xff, 0xfb, 0x77, - 0x88, 0x89, 0xef, 0xff, 0xa7, 0x7b, 0xff, 0xfd, 0x76, 0x5d, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0x97, - 0x7a, 0xdf, 0xff, 0xfa, 0x55, 0x55, 0xcf, 0xff, 0xec, 0x9c, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xc6, - 0x7c, 0xff, 0xff, 0xf7, 0x55, 0x55, 0x8f, 0xff, 0xff, 0xac, 0xf9, 0xbf, 0xfd, 0x6c, 0xff, 0xe5, - 0x7c, 0xff, 0xff, 0xf7, 0x56, 0x77, 0xaf, 0xff, 0xff, 0x9b, 0xf9, 0xbf, 0xfe, 0x8d, 0xff, 0xe5, - 0x7a, 0xde, 0xff, 0xfb, 0x56, 0x77, 0xdf, 0xff, 0xed, 0x8c, 0xf9, 0x8f, 0xff, 0xff, 0xff, 0xb5, - 0x87, 0x67, 0xef, 0xff, 0xa8, 0x9c, 0xff, 0xfd, 0x76, 0x5d, 0xf9, 0x6d, 0xff, 0xff, 0xfe, 0x75, - 0x88, 0x66, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x5c, 0xfa, 0x57, 0xdf, 0xff, 0xd8, 0x55, - 0x87, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x6d, 0xfa, 0x55, 0x68, 0xa9, 0x65, 0x55, - 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x7d, 0xfa, 0x56, 0x65, 0x55, 0x55, 0x56, - 0x88, 0x78, 0xdf, 0xa8, 0xff, 0xfe, 0x8a, 0xfc, 0x65, 0x6d, 0xfa, 0x56, 0x77, 0x65, 0x56, 0x67, - 0x88, 0x87, 0x78, 0x55, 0xef, 0xfd, 0x55, 0x86, 0x55, 0x5d, 0xfa, 0x56, 0x88, 0x77, 0x77, 0x88, - 0x88, 0x88, 0x65, 0x55, 0xbe, 0xea, 0x55, 0x55, 0x55, 0x6b, 0xd8, 0x56, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0x66, 0x76, 0x65, 0x56, 0x76, 0x68, 0xa9, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x77, 0x76, 0x55, 0x56, 0x87, 0x7b, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x78, 0xef, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x87, 0xaf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0xfd, 0x65, 0x56, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xf8, 0x55, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x78, 0xCE, 0xEB, 0x77, 0x77, 0x87, 0x7C, 0xEA, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x89, 0x77, 0xEF, 0xFD, 0x67, 0xA8, 0x77, 0x7E, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x78, 0xDF, 0xBA, 0xFF, 0xFE, 0x8B, 0xFD, 0x87, 0x7D, 0xFA, 0x56, 0x87, 0x77, 0x88, 0x88, + 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x7D, 0xFA, 0x56, 0x77, 0x87, 0x77, 0x88, + 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x7D, 0xFA, 0x56, 0x9C, 0xDC, 0x97, 0x78, + 0x87, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x6D, 0xFA, 0x59, 0xFF, 0xFF, 0xFB, 0x77, + 0x88, 0x89, 0xEF, 0xFF, 0xA7, 0x7B, 0xFF, 0xFD, 0x76, 0x5D, 0xF9, 0x7F, 0xFF, 0xFF, 0xFF, 0x97, + 0x7A, 0xDF, 0xFF, 0xFA, 0x55, 0x55, 0xCF, 0xFF, 0xEC, 0x9C, 0xF9, 0x9F, 0xFF, 0xFF, 0xFF, 0xC6, + 0x7C, 0xFF, 0xFF, 0xF7, 0x55, 0x55, 0x8F, 0xFF, 0xFF, 0xAC, 0xF9, 0xBF, 0xFD, 0x6C, 0xFF, 0xE5, + 0x7C, 0xFF, 0xFF, 0xF7, 0x56, 0x77, 0xAF, 0xFF, 0xFF, 0x9B, 0xF9, 0xBF, 0xFE, 0x8D, 0xFF, 0xE5, + 0x7A, 0xDE, 0xFF, 0xFB, 0x56, 0x77, 0xDF, 0xFF, 0xED, 0x8C, 0xF9, 0x8F, 0xFF, 0xFF, 0xFF, 0xB5, + 0x87, 0x67, 0xEF, 0xFF, 0xA8, 0x9C, 0xFF, 0xFD, 0x76, 0x5D, 0xF9, 0x6D, 0xFF, 0xFF, 0xFE, 0x75, + 0x88, 0x66, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x5C, 0xFA, 0x57, 0xDF, 0xFF, 0xD8, 0x55, + 0x87, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x6D, 0xFA, 0x55, 0x68, 0xA9, 0x65, 0x55, + 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x7D, 0xFA, 0x56, 0x65, 0x55, 0x55, 0x56, + 0x88, 0x78, 0xDF, 0xA8, 0xFF, 0xFE, 0x8A, 0xFC, 0x65, 0x6D, 0xFA, 0x56, 0x77, 0x65, 0x56, 0x67, + 0x88, 0x87, 0x78, 0x55, 0xEF, 0xFD, 0x55, 0x86, 0x55, 0x5D, 0xFA, 0x56, 0x88, 0x77, 0x77, 0x88, + 0x88, 0x88, 0x65, 0x55, 0xBE, 0xEA, 0x55, 0x55, 0x55, 0x6B, 0xD8, 0x56, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x66, 0x76, 0x65, 0x56, 0x76, 0x68, 0xA9, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x77, 0x76, 0x55, 0x56, 0x87, 0x7B, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x78, 0xEF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x87, 0xAF, 0xFF, 0x95, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7D, 0xFD, 0x65, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xF8, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x96, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp b/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp index 6bc96968da..5382ff7558 100644 --- a/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp @@ -70,11 +70,11 @@ extern const uint8_t bed_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, @@ -111,37 +111,37 @@ extern const uint8_t bed_heated_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9b, 0x97, 0x88, 0x88, 0x87, 0x8b, 0xa8, 0x78, 0x88, 0x87, 0x8b, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xf9, 0x78, 0x88, 0x78, 0xdf, 0xfb, 0x78, 0x88, 0x77, 0xcf, 0xfc, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xfd, 0x77, 0x88, 0x79, 0xff, 0xff, 0x87, 0x88, 0x78, 0xdf, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0x86, 0x88, 0x78, 0xdf, 0xff, 0xb6, 0x88, 0x77, 0xcf, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xb6, 0x78, 0x87, 0x9f, 0xff, 0xd6, 0x78, 0x87, 0x8e, 0xff, 0xf7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0xff, 0xe6, 0x68, 0x87, 0x7d, 0xff, 0xe7, 0x68, 0x88, 0x7a, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xff, 0xe5, 0x67, 0x87, 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x79, 0xff, 0xfa, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xe6, 0x57, 0x87, 0x8c, 0xff, 0xf7, 0x57, 0x88, 0x7a, 0xff, 0xfa, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xd5, 0x57, 0x87, 0x8e, 0xff, 0xe6, 0x57, 0x88, 0x7c, 0xff, 0xf8, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xa5, 0x57, 0x87, 0xaf, 0xff, 0xd5, 0x57, 0x87, 0x9f, 0xff, 0xe6, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0x75, 0x57, 0x78, 0xef, 0xff, 0xa5, 0x57, 0x87, 0xcf, 0xff, 0xb5, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xfb, 0x55, 0x67, 0x7b, 0xff, 0xfe, 0x65, 0x57, 0x79, 0xff, 0xff, 0x85, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xf7, 0x55, 0x67, 0x8e, 0xff, 0xf8, 0x55, 0x67, 0x7d, 0xff, 0xfb, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x55, 0x77, 0x9f, 0xff, 0xd6, 0x55, 0x77, 0x8f, 0xff, 0xe7, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0x75, 0x56, 0x87, 0xbf, 0xff, 0xa5, 0x56, 0x77, 0xaf, 0xff, 0xb5, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xfd, 0x65, 0x67, 0x77, 0xcf, 0xff, 0x85, 0x57, 0x87, 0xbf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xfd, 0x55, 0x68, 0x77, 0xcf, 0xff, 0x75, 0x68, 0x87, 0xbf, 0xff, 0x95, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0x65, 0x78, 0x77, 0xbf, 0xff, 0x95, 0x68, 0x87, 0xaf, 0xff, 0xb5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x78, 0x87, 0xaf, 0xff, 0xd6, 0x68, 0x87, 0x9f, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xf8, 0x68, 0x87, 0x8e, 0xff, 0xf9, 0x68, 0x87, 0x7c, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xfa, 0x58, 0x88, 0x7b, 0xff, 0xfc, 0x57, 0x88, 0x78, 0xff, 0xfe, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xd7, 0x57, 0x88, 0x87, 0xbf, 0xf8, 0x56, 0x88, 0x87, 0xaf, 0xfa, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9B, 0x97, 0x88, 0x88, 0x87, 0x8B, 0xA8, 0x78, 0x88, 0x87, 0x8B, 0xB8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xF9, 0x78, 0x88, 0x78, 0xDF, 0xFB, 0x78, 0x88, 0x77, 0xCF, 0xFC, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFD, 0x77, 0x88, 0x79, 0xFF, 0xFF, 0x87, 0x88, 0x78, 0xDF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0x86, 0x88, 0x78, 0xDF, 0xFF, 0xB6, 0x88, 0x77, 0xCF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xB6, 0x78, 0x87, 0x9F, 0xFF, 0xD6, 0x78, 0x87, 0x8E, 0xFF, 0xF7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7D, 0xFF, 0xE6, 0x68, 0x87, 0x7D, 0xFF, 0xE7, 0x68, 0x88, 0x7A, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7D, 0xFF, 0xE5, 0x67, 0x87, 0x7B, 0xFF, 0xF7, 0x57, 0x88, 0x79, 0xFF, 0xFA, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xE6, 0x57, 0x87, 0x8C, 0xFF, 0xF7, 0x57, 0x88, 0x7A, 0xFF, 0xFA, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xD5, 0x57, 0x87, 0x8E, 0xFF, 0xE6, 0x57, 0x88, 0x7C, 0xFF, 0xF8, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xA5, 0x57, 0x87, 0xAF, 0xFF, 0xD5, 0x57, 0x87, 0x9F, 0xFF, 0xE6, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0x75, 0x57, 0x78, 0xEF, 0xFF, 0xA5, 0x57, 0x87, 0xCF, 0xFF, 0xB5, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFB, 0x55, 0x67, 0x7B, 0xFF, 0xFE, 0x65, 0x57, 0x79, 0xFF, 0xFF, 0x85, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xF7, 0x55, 0x67, 0x8E, 0xFF, 0xF8, 0x55, 0x67, 0x7D, 0xFF, 0xFB, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xB5, 0x55, 0x77, 0x9F, 0xFF, 0xD6, 0x55, 0x77, 0x8F, 0xFF, 0xE7, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xDF, 0xFF, 0x75, 0x56, 0x87, 0xBF, 0xFF, 0xA5, 0x56, 0x77, 0xAF, 0xFF, 0xB5, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFD, 0x65, 0x67, 0x77, 0xCF, 0xFF, 0x85, 0x57, 0x87, 0xBF, 0xFF, 0x95, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFD, 0x55, 0x68, 0x77, 0xCF, 0xFF, 0x75, 0x68, 0x87, 0xBF, 0xFF, 0x95, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0x65, 0x78, 0x77, 0xBF, 0xFF, 0x95, 0x68, 0x87, 0xAF, 0xFF, 0xB5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xB5, 0x78, 0x87, 0xAF, 0xFF, 0xD6, 0x68, 0x87, 0x9F, 0xFF, 0xE7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xF8, 0x68, 0x87, 0x8E, 0xFF, 0xF9, 0x68, 0x87, 0x7C, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFA, 0x58, 0x88, 0x7B, 0xFF, 0xFC, 0x57, 0x88, 0x78, 0xFF, 0xFE, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xDF, 0xD7, 0x57, 0x88, 0x87, 0xBF, 0xF8, 0x56, 0x88, 0x87, 0xAF, 0xFA, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/home_64x64x4.cpp b/Marlin/src/lcd/tft/images/home_64x64x4.cpp index 107c76e54e..27384c99c0 100644 --- a/Marlin/src/lcd/tft/images/home_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/home_64x64x4.cpp @@ -31,57 +31,57 @@ extern const uint8_t home_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9d, 0xff, 0xea, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x40, 0xbf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf6, 0x54, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x57, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, - 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, - 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xb, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, - 0x87, 0x7f, 0xff, 0xff, 0xff, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0xfb, 0x68, 0x88, - 0x87, 0x7f, 0xff, 0xff, 0xf7, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xfd, 0x67, 0x88, - 0x87, 0x3d, 0xff, 0xff, 0x75, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x30, 0xbf, 0xff, 0xfa, 0x68, 0x88, - 0x88, 0x44, 0xce, 0xd7, 0x58, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x74, 0x19, 0xee, 0xa6, 0x88, 0x88, - 0x88, 0x73, 0x24, 0x56, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x52, 0x35, 0x68, 0x88, 0x88, - 0x88, 0x87, 0x66, 0x78, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x87, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x44, 0x44, 0x44, 0x12, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x72, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x4c, 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0x97, 0x88, 0x88, 0x88, 0x84, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9D, 0xFF, 0xEA, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xEB, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x40, 0xBF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF6, 0x54, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x57, 0xFF, 0x80, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xBF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, + 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, + 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, + 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xBF, 0xFF, 0xFF, 0xFB, 0x68, 0x88, + 0x87, 0x7F, 0xFF, 0xFF, 0xF7, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xB, 0xFF, 0xFF, 0xFD, 0x67, 0x88, + 0x87, 0x3D, 0xFF, 0xFF, 0x75, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x30, 0xBF, 0xFF, 0xFA, 0x68, 0x88, + 0x88, 0x44, 0xCE, 0xD7, 0x58, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x74, 0x19, 0xEE, 0xA6, 0x88, 0x88, + 0x88, 0x73, 0x24, 0x56, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x52, 0x35, 0x68, 0x88, 0x88, + 0x88, 0x87, 0x66, 0x78, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x87, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x55, 0x55, 0x55, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x44, 0x44, 0x44, 0x12, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x88, 0x88, 0x88, 0x72, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x4C, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x84, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x32, 0x44, 0x44, 0x44, 0x44, 0x33, 0x57, 0x88, 0x88, 0x88, 0x88, 0x86, 0x43, 0x34, 0x44, 0x44, 0x44, 0x34, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp b/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp index 7dbf5f0ab1..7b068aa7e4 100644 --- a/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp @@ -36,45 +36,45 @@ extern const uint8_t hotend_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xaa, 0xaa, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x9a, 0xaa, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x77, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x55, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x65, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x55, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x58, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x85, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x95, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xcf, 0xff, 0xff, 0xff, 0xd7, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x5a, 0xff, 0xff, 0xfb, 0x65, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8d, 0xfe, 0xa5, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xAA, 0xAA, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x9A, 0xAA, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x77, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x55, 0x57, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x65, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x75, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x65, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x55, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x58, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x85, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x95, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xCF, 0xFF, 0xFF, 0xFF, 0xD7, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x5A, 0xFF, 0xFF, 0xFB, 0x65, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8D, 0xFE, 0xA5, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x87, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/increase_64x64x4.cpp b/Marlin/src/lcd/tft/images/increase_64x64x4.cpp index c6f34d1aff..710fe8e78e 100644 --- a/Marlin/src/lcd/tft/images/increase_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/increase_64x64x4.cpp @@ -40,40 +40,40 @@ extern const uint8_t increase_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xee, 0xee, 0xee, 0xee, 0xa6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xEE, 0xEE, 0xEE, 0xEE, 0xA6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/left_32x32x4.cpp b/Marlin/src/lcd/tft/images/left_32x32x4.cpp index a855f0c197..486518d508 100644 --- a/Marlin/src/lcd/tft/images/left_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/left_32x32x4.cpp @@ -28,31 +28,31 @@ extern const uint8_t left_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfb, 0x46, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfb, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xb3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xfb, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfa, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xf6, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x76, 0xbf, 0xff, 0xff, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x3b, 0xff, 0xff, 0xf8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x73, 0xcf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x3c, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xcf, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3b, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xbf, 0xff, 0xff, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xbf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xcf, 0x93, 0x34, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFB, 0x46, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xA3, 0x34, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFB, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xB3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFB, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xA3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFA, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xA3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFA, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xF6, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x76, 0xBF, 0xFF, 0xFF, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x3B, 0xFF, 0xFF, 0xF8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x73, 0xCF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x3C, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xCF, 0xFF, 0xFF, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3B, 0xFF, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xBF, 0xFF, 0xFF, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4B, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xBF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4B, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xCF, 0x93, 0x34, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4B, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0x34, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp b/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp index f0bb73e935..3243d7f27f 100644 --- a/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp @@ -33,22 +33,22 @@ extern const uint8_t leveling_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0x99, 0x99, 0x99, 0x99, 0x87, 0x78, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x88, 0x87, 0x7b, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x88, 0x87, 0x8f, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x88, 0x77, 0xef, 0xf5, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x88, 0x7a, 0xff, 0xfc, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x7a, 0x88, 0x88, 0x58, 0x88, 0x88, - 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0x87, 0x45, 0x55, 0x57, 0x88, 0x88, - 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x85, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x56, 0x7c, 0xff, 0xfe, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x55, 0xef, 0xff, 0xff, 0xf9, 0x45, 0x57, 0x86, 0xff, 0xf5, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x4c, 0xff, 0xff, 0x74, 0x57, 0x88, 0x87, 0x8f, 0xa4, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x84, 0x9f, 0xd5, 0x45, 0x78, 0x88, 0x88, 0x7c, 0x55, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x88, 0x87, 0x7B, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x88, 0x87, 0x8F, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x88, 0x77, 0xEF, 0xF5, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x88, 0x7A, 0xFF, 0xFC, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x7A, 0x88, 0x88, 0x58, 0x88, 0x88, + 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x87, 0x45, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x85, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x56, 0x7C, 0xFF, 0xFE, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x55, 0xEF, 0xFF, 0xFF, 0xF9, 0x45, 0x57, 0x86, 0xFF, 0xF5, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x4C, 0xFF, 0xFF, 0x74, 0x57, 0x88, 0x87, 0x8F, 0xA4, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x9F, 0xD5, 0x45, 0x78, 0x88, 0x88, 0x7C, 0x55, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x65, 0x55, 0x68, 0x87, 0x77, 0x77, 0x86, 0x57, 0x87, 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x56, 0x77, 0x77, 0x77, 0x77, 0x77, 0x67, 0x77, 0x77, 0x77, - 0x7b, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xb7, - 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, - 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, + 0x7B, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xB7, + 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, + 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x78, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x66, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/menu_64x64x4.cpp b/Marlin/src/lcd/tft/images/menu_64x64x4.cpp index 89cd56b8dc..bbbe66ab1b 100644 --- a/Marlin/src/lcd/tft/images/menu_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/menu_64x64x4.cpp @@ -33,52 +33,52 @@ extern const uint8_t menu_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/pause_64x64x4.cpp b/Marlin/src/lcd/tft/images/pause_64x64x4.cpp index b88651c106..3079b22a17 100644 --- a/Marlin/src/lcd/tft/images/pause_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/pause_64x64x4.cpp @@ -39,42 +39,42 @@ extern const uint8_t pause_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x67, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x67, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp b/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp index 48ca294ca1..f8548d2837 100644 --- a/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp @@ -30,28 +30,28 @@ extern const uint8_t refresh_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0x57, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0x9a, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xce, 0xff, 0xfd, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x6a, 0xff, 0x55, 0x5c, 0xff, 0xd7, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xa7, 0x78, 0x86, 0x9f, 0x57, 0x75, 0x8f, 0xfb, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xfc, 0x78, 0x88, 0x69, 0x67, 0x88, 0x69, 0xff, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7c, 0xff, 0x58, 0x88, 0x87, 0x58, 0x88, 0x86, 0xff, 0xa7, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7e, 0xfa, 0x58, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xe5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7f, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xf5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7f, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xf5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7e, 0xfa, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xe5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7c, 0xff, 0x68, 0x88, 0x87, 0x78, 0x88, 0x77, 0xff, 0xa5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xff, 0xa7, 0x88, 0x78, 0xb7, 0x88, 0x77, 0xbf, 0x66, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xbf, 0xf9, 0x77, 0x77, 0xfb, 0x78, 0x88, 0x68, 0x57, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x6d, 0xff, 0xd8, 0x77, 0xff, 0xb7, 0x78, 0x87, 0x68, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x85, 0xcf, 0xff, 0xfd, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x57, 0xef, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x89, 0xff, 0xf8, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0xff, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xf7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0x57, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0x9A, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFE, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xCE, 0xFF, 0xFD, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x6A, 0xFF, 0x55, 0x5C, 0xFF, 0xD7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xA7, 0x78, 0x86, 0x9F, 0x57, 0x75, 0x8F, 0xFB, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xFC, 0x78, 0x88, 0x69, 0x67, 0x88, 0x69, 0xFF, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7C, 0xFF, 0x58, 0x88, 0x87, 0x58, 0x88, 0x86, 0xFF, 0xA7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7E, 0xFA, 0x58, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xE5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7F, 0xF8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xF5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7F, 0xF8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xF5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7E, 0xFA, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xCF, 0xE5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7C, 0xFF, 0x68, 0x88, 0x87, 0x78, 0x88, 0x77, 0xFF, 0xA5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xFF, 0xA7, 0x88, 0x78, 0xB7, 0x88, 0x77, 0xBF, 0x66, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xBF, 0xF9, 0x77, 0x77, 0xFB, 0x78, 0x88, 0x68, 0x57, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x6D, 0xFF, 0xD8, 0x77, 0xFF, 0xB7, 0x78, 0x87, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x85, 0xCF, 0xFF, 0xFD, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x57, 0xEF, 0xFF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x89, 0xFF, 0xF8, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0xFF, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xF7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/right_32x32x4.cpp b/Marlin/src/lcd/tft/images/right_32x32x4.cpp index 6ca5867e98..ab9c36eae0 100644 --- a/Marlin/src/lcd/tft/images/right_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/right_32x32x4.cpp @@ -28,31 +28,31 @@ extern const uint8_t right_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x84, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x3a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x4a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x9f, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x49, 0xff, 0xff, 0xfa, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc4, 0x36, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfc, 0x33, 0x46, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfd, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xd3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xfc, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xff, 0xff, 0xc3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xc4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8a, 0xff, 0xfc, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x84, 0x8f, 0xc4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x4a, 0x53, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x8F, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0xAF, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x3A, 0xFF, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xAF, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3A, 0xFF, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xAF, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x4A, 0xFF, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x9F, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x49, 0xFF, 0xFF, 0xFA, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xC4, 0x36, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFC, 0x33, 0x46, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xC3, 0x34, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFD, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xD3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xFF, 0xFF, 0xFC, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x8F, 0xFF, 0xFF, 0xC3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xFF, 0xFF, 0xFC, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xC4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8A, 0xFF, 0xFC, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x8F, 0xC4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x4A, 0x53, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/sd_64x64x4.cpp b/Marlin/src/lcd/tft/images/sd_64x64x4.cpp index 6991ff68c9..3f786f46ca 100644 --- a/Marlin/src/lcd/tft/images/sd_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/sd_64x64x4.cpp @@ -32,54 +32,54 @@ extern const uint8_t sd_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xfe, 0xdf, 0xff, 0xfd, 0xef, 0xff, 0xde, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xbf, 0xfa, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x59, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x3a, 0xff, 0xa3, 0x9f, 0xfb, 0x48, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x3a, 0xff, 0xa3, 0xaf, 0xfb, 0x39, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0xcf, 0xfa, 0x5b, 0xff, 0xb5, 0xbf, 0xfc, 0x5a, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xFF, 0xFE, 0xDF, 0xFF, 0xFD, 0xEF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0xBF, 0xFA, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x59, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xBF, 0xF9, 0x3A, 0xFF, 0xA3, 0x9F, 0xFB, 0x48, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xBF, 0xF9, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x49, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xCF, 0xF9, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x49, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xCF, 0xF9, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x49, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xCF, 0xF9, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x49, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xBF, 0xF9, 0x3A, 0xFF, 0xA3, 0xAF, 0xFB, 0x39, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xCF, 0xFA, 0x5B, 0xFF, 0xB5, 0xBF, 0xFC, 0x5A, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/settings_64x64x4.cpp b/Marlin/src/lcd/tft/images/settings_64x64x4.cpp index 7a9c84fdff..093e7ff61e 100644 --- a/Marlin/src/lcd/tft/images/settings_64x64x4.cpp +++ b/Marlin/src/lcd/tft/images/settings_64x64x4.cpp @@ -32,54 +32,54 @@ extern const uint8_t settings_64x64x4[2048] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xad, 0xdd, 0xdd, 0xd9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x77, 0xef, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x87, 0x78, 0x79, 0xff, 0xff, 0xff, 0xfd, 0x67, 0x87, 0x78, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xeb, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0x75, 0x78, 0xce, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xea, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xbf, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x98, 0x8a, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xfb, 0x65, 0x55, 0x55, 0x57, 0xdf, 0xff, 0xff, 0xff, 0xb5, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x6c, 0xff, 0xff, 0xff, 0x95, 0x56, 0x66, 0x66, 0x65, 0x5b, 0xff, 0xff, 0xff, 0x95, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0xaf, 0xff, 0xff, 0xfa, 0x56, 0x66, 0x67, 0x77, 0x77, 0x65, 0xdf, 0xff, 0xff, 0xd7, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xce, 0xff, 0xff, 0xff, 0xd5, 0x56, 0x67, 0x88, 0x88, 0x88, 0x86, 0x7f, 0xff, 0xff, 0xff, 0xdb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x75, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x79, 0xcf, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xfc, 0x96, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x55, 0x55, 0x58, 0xdf, 0xfd, 0x77, 0x78, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xa5, 0x56, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9c, 0xdd, 0xdb, 0x96, 0x55, 0x5b, 0xff, 0xd8, 0x77, 0x77, 0x77, 0x77, 0xaf, 0xff, 0xff, 0xff, 0x95, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xad, 0xff, 0xff, 0xff, 0xfe, 0xb7, 0x55, 0xbf, 0xfe, 0xb9, 0x77, 0x78, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x86, 0x6d, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xb7, 0x56, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x86, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xc6, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xfe, 0x75, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xfc, 0x59, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x66, 0x68, 0xbd, 0xff, 0xff, 0xa5, 0x7b, 0xff, 0xe7, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xfd, 0x66, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x66, 0x55, 0x56, 0x8a, 0xee, 0x65, 0x55, 0x7a, 0x75, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0x75, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x97, 0x55, 0x55, 0x66, 0x66, 0x66, 0x55, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfe, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xca, 0x76, 0x55, 0x56, 0x78, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0x97, 0x9d, 0xff, 0xd5, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x97, 0x66, 0x77, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7b, 0xfd, 0xa7, 0x9a, 0x68, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xc9, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x89, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x55, 0x57, 0x9b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x6a, 0xdf, 0xff, 0xfe, 0xb8, 0x55, 0x66, 0x65, 0x55, 0x69, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x67, 0x77, 0x76, 0x55, 0x66, 0x67, 0x76, 0x66, 0x55, 0x56, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x66, 0x66, 0x78, 0x88, 0x87, 0x76, 0x65, 0x55, 0x68, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x76, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x55, 0x55, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x65, 0x55, 0x67, 0x9c, 0xef, 0xff, 0xb5, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x55, 0x55, 0x79, 0xb9, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAD, 0xDD, 0xDD, 0xD9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x87, 0x78, 0x79, 0xFF, 0xFF, 0xFF, 0xFD, 0x67, 0x87, 0x78, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xEB, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x78, 0xCE, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xEA, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xBF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x98, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFB, 0x65, 0x55, 0x55, 0x57, 0xDF, 0xFF, 0xFF, 0xFF, 0xB5, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x6C, 0xFF, 0xFF, 0xFF, 0x95, 0x56, 0x66, 0x66, 0x65, 0x5B, 0xFF, 0xFF, 0xFF, 0x95, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0xAF, 0xFF, 0xFF, 0xFA, 0x56, 0x66, 0x67, 0x77, 0x77, 0x65, 0xDF, 0xFF, 0xFF, 0xD7, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xCE, 0xFF, 0xFF, 0xFF, 0xD5, 0x56, 0x67, 0x88, 0x88, 0x88, 0x86, 0x7F, 0xFF, 0xFF, 0xFF, 0xDB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFE, 0x75, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFD, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xEF, 0xFF, 0xFF, 0xFF, 0xA5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFE, 0xA5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x79, 0xCF, 0xFF, 0xE7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xFC, 0x96, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x55, 0x55, 0x58, 0xDF, 0xFD, 0x77, 0x78, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFF, 0xA5, 0x56, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9C, 0xDD, 0xDB, 0x96, 0x55, 0x5B, 0xFF, 0xD8, 0x77, 0x77, 0x77, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0x95, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAD, 0xFF, 0xFF, 0xFF, 0xFE, 0xB7, 0x55, 0xBF, 0xFE, 0xB9, 0x77, 0x78, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x86, 0x6D, 0xFF, 0xFF, 0xED, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xB7, 0x56, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xC6, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x8C, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xEF, 0xFF, 0xFE, 0x75, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFC, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x66, 0x68, 0xBD, 0xFF, 0xFF, 0xA5, 0x7B, 0xFF, 0xE7, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFD, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x66, 0x55, 0x56, 0x8A, 0xEE, 0x65, 0x55, 0x7A, 0x75, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0x75, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x97, 0x55, 0x55, 0x66, 0x66, 0x66, 0x55, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xFF, 0xFF, 0xFE, 0x65, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCA, 0x76, 0x55, 0x56, 0x78, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0x97, 0x9D, 0xFF, 0xD5, 0x6B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x97, 0x66, 0x77, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7B, 0xFD, 0xA7, 0x9A, 0x68, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xC9, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB8, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x89, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x55, 0x57, 0x9B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x6A, 0xDF, 0xFF, 0xFE, 0xB8, 0x55, 0x66, 0x65, 0x55, 0x69, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x67, 0x77, 0x76, 0x55, 0x66, 0x67, 0x76, 0x66, 0x55, 0x56, 0x7B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x66, 0x66, 0x78, 0x88, 0x87, 0x76, 0x65, 0x55, 0x68, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x76, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x55, 0x55, 0x8A, 0xDF, 0xFF, 0xFF, 0xFF, 0xF8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x65, 0x55, 0x67, 0x9C, 0xEF, 0xFF, 0xB5, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x55, 0x55, 0x79, 0xB9, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x55, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/tft/images/slider_8x16x4.cpp b/Marlin/src/lcd/tft/images/slider_8x16x4.cpp index 9fb8c42c28..2839cd9806 100644 --- a/Marlin/src/lcd/tft/images/slider_8x16x4.cpp +++ b/Marlin/src/lcd/tft/images/slider_8x16x4.cpp @@ -25,22 +25,22 @@ #if HAS_GRAPHICAL_TFT extern const uint8_t slider_8x16x4[64] = { - 0x88, 0xff, 0xff, 0x88, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xf8, - 0x88, 0xff, 0xff, 0x88, + 0x88, 0xFF, 0xFF, 0x88, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x8F, 0xFF, 0xFF, 0xF8, + 0x88, 0xFF, 0xFF, 0x88, }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/up_32x32x4.cpp b/Marlin/src/lcd/tft/images/up_32x32x4.cpp index 59bae8aef0..b36a028cc9 100644 --- a/Marlin/src/lcd/tft/images/up_32x32x4.cpp +++ b/Marlin/src/lcd/tft/images/up_32x32x4.cpp @@ -32,21 +32,21 @@ extern const uint8_t up_32x32x4[512] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xad, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xb3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfb, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xc3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa6, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x6f, 0xff, 0xff, 0xb4, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x78, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x47, 0x87, 0x8f, 0xff, 0xff, 0xb4, 0x78, 0x88, 0x88, - 0x88, 0x77, 0xaf, 0xff, 0xff, 0xb3, 0x44, 0x78, 0x87, 0x78, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, - 0x88, 0x7a, 0xff, 0xff, 0xfb, 0x34, 0x47, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xc4, 0x78, 0x88, - 0x88, 0x7f, 0xff, 0xff, 0xb3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x77, 0xff, 0xff, 0xfb, 0x37, 0x88, - 0x88, 0x78, 0xff, 0xfa, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0x93, 0x34, 0x88, - 0x88, 0x77, 0x7f, 0xb3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xf9, 0x34, 0x47, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAD, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xB3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFB, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFF, 0xC3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xFC, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xA6, 0xFF, 0xFF, 0xFB, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFA, 0x33, 0x6F, 0xFF, 0xFF, 0xB4, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xA3, 0x34, 0x78, 0xFF, 0xFF, 0xFB, 0x47, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFA, 0x33, 0x47, 0x87, 0x8F, 0xFF, 0xFF, 0xB4, 0x78, 0x88, 0x88, + 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xB3, 0x44, 0x78, 0x87, 0x78, 0xFF, 0xFF, 0xFB, 0x47, 0x88, 0x88, + 0x88, 0x7A, 0xFF, 0xFF, 0xFB, 0x34, 0x47, 0x88, 0x88, 0x87, 0x7F, 0xFF, 0xFF, 0xC4, 0x78, 0x88, + 0x88, 0x7F, 0xFF, 0xFF, 0xB3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x77, 0xFF, 0xFF, 0xFB, 0x37, 0x88, + 0x88, 0x78, 0xFF, 0xFA, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0x93, 0x34, 0x88, + 0x88, 0x77, 0x7F, 0xB3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xF9, 0x34, 0x47, 0x88, 0x88, 0x87, 0x78, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x84, 0x34, 0x88, 0x88, 0x88, 0x88, 0x87, 0x64, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 92dd63389f..58e6d9473b 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -41,7 +41,7 @@ MarlinUI ui; #include "fontutils.h" #include "../sd/cardreader.h" #if EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) - #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) + #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index fba1d41a94..55a809efab 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -138,7 +138,7 @@ #define MISO_PIN PB14 #define MOSI_PIN PB15 -#define SDSS SS_PIN +#define SDSS SS_PIN #define SD_DETECT_PIN PB11 #define BEEPER_PIN PC14 diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h index 838b927678..d94958dd54 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h @@ -78,16 +78,16 @@ typedef MAX3421e MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega #define USB_CLASS_PRINTER 0x07 // Printer #define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage #define USB_CLASS_HUB 0x09 // Hub -#define USB_CLASS_CDC_DATA 0x0a // CDC-Data -#define USB_CLASS_SMART_CARD 0x0b // Smart-Card -#define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security -#define USB_CLASS_VIDEO 0x0e // Video -#define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare -#define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device -#define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller -#define USB_CLASS_MISC 0xef // Miscellaneous -#define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific -#define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific +#define USB_CLASS_CDC_DATA 0x0A // CDC-Data +#define USB_CLASS_SMART_CARD 0x0B // Smart-Card +#define USB_CLASS_CONTENT_SECURITY 0x0D // Content Security +#define USB_CLASS_VIDEO 0x0E // Video +#define USB_CLASS_PERSONAL_HEALTH 0x0F // Personal Healthcare +#define USB_CLASS_DIAGNOSTIC_DEVICE 0xDC // Diagnostic Device +#define USB_CLASS_WIRELESS_CTRL 0xE0 // Wireless Controller +#define USB_CLASS_MISC 0xEF // Miscellaneous +#define USB_CLASS_APP_SPECIFIC 0xFE // Application Specific +#define USB_CLASS_VENDOR_SPECIFIC 0xFF // Vendor Specific // Additional Error Codes #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1 @@ -117,7 +117,7 @@ typedef MAX3421e MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega #define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms /* USB state machine states */ -#define USB_STATE_MASK 0xf0 +#define USB_STATE_MASK 0xF0 #define USB_STATE_DETACHED 0x10 #define USB_DETACHED_SUBSTATE_INITIALIZE 0x11 @@ -132,7 +132,7 @@ typedef MAX3421e MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega #define USB_STATE_ADDRESSING 0x70 #define USB_STATE_CONFIGURING 0x80 #define USB_STATE_RUNNING 0x90 -#define USB_STATE_ERROR 0xa0 +#define USB_STATE_ERROR 0xA0 class USBDeviceConfig { public: diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h index 40e3e02a2f..8cb5b6bf37 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h @@ -52,16 +52,16 @@ #define BGRAB7(__usi__) (((uint8_t *)&(__usi__))[7]) #else // Note: The cast alone to uint8_t is actually enough. -// GCC throws out the "& 0xff", and the size is no different. +// GCC throws out the "& 0xFF", and the size is no different. // Some compilers need it. -#define BGRAB0(__usi__) ((uint8_t)((__usi__) & 0xff )) -#define BGRAB1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xff)) -#define BGRAB2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xff)) -#define BGRAB3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xff)) -#define BGRAB4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xff)) -#define BGRAB5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xff)) -#define BGRAB6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xff)) -#define BGRAB7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xff)) +#define BGRAB0(__usi__) ((uint8_t)((__usi__) & 0xFF )) +#define BGRAB1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xFF)) +#define BGRAB2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xFF)) +#define BGRAB3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xFF)) +#define BGRAB4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xFF)) +#define BGRAB5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xFF)) +#define BGRAB6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xFF)) +#define BGRAB7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xFF)) #endif #define BOVER1(__usi__) ((uint16_t)(__usi__) << 8) #define BOVER2(__usi__) ((uint32_t)(__usi__) << 16) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp index d707a41a27..a84a683204 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp @@ -439,7 +439,7 @@ uint8_t BulkOnly::Init(uint8_t parent __attribute__((unused)), uint8_t port __at printf(" standards.\r\n"); #endif - uint8_t tries = 0xf0; + uint8_t tries = 0xF0; while ((rcode = TestUnitReady(lun))) { if (rcode == 0x08) break; // break on no media, this is OK to do. // try to lock media and spin up @@ -765,7 +765,7 @@ uint8_t BulkOnly::Page3F(uint8_t lun) { #ifdef SKIP_WRITE_PROTECT return 0; #endif - uint8_t rc = ModeSense6(lun, 0, 0x3f, 0, 192, buf); + uint8_t rc = ModeSense6(lun, 0, 0x3F, 0, 192, buf); if (!rc) { WriteOk[lun] = ((buf[2] & 0x80) == 0); Notify(PSTR("Mode Sense: "), 0x80); @@ -1203,10 +1203,10 @@ uint8_t BulkOnly::Read(uint8_t lun __attribute__((unused)), uint32_t addr __attr cbw.CBWCB[0] = SCSI_CMD_READ_10; cbw.CBWCB[8] = blocks; - cbw.CBWCB[2] = ((addr >> 24) & 0xff); - cbw.CBWCB[3] = ((addr >> 16) & 0xff); - cbw.CBWCB[4] = ((addr >> 8) & 0xff); - cbw.CBWCB[5] = (addr & 0xff); + cbw.CBWCB[2] = ((addr >> 24) & 0xFF); + cbw.CBWCB[3] = ((addr >> 16) & 0xFF); + cbw.CBWCB[4] = ((addr >> 8) & 0xFF); + cbw.CBWCB[5] = (addr & 0xFF); return HandleSCSIError(Transaction(&cbw, bsize, prs, 1)); #else diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h index e6cece7ffd..25df006e51 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h @@ -214,7 +214,7 @@ struct CDB6 { public: CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control) : - Opcode(_Opcode), LBAMSB(BGRAB2(LBA) & 0x1f), LUN(_LUN), LBAHB(BGRAB1(LBA)), LBALB(BGRAB0(LBA)), + Opcode(_Opcode), LBAMSB(BGRAB2(LBA) & 0x1F), LUN(_LUN), LBAHB(BGRAB1(LBA)), LBALB(BGRAB0(LBA)), AllocationLength(_AllocationLength), Control(_Control) { } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h index 6451981fb7..6cad39d0df 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h @@ -86,7 +86,7 @@ #define rREVISION 0x90 //18<<3 -#define rIOPINS1 0xa0 //20<<3 +#define rIOPINS1 0xA0 //20<<3 /* IOPINS1 Bits */ #define bmGPOUT0 0x01 @@ -98,7 +98,7 @@ #define bmGPIN2 0x40 #define bmGPIN3 0x80 -#define rIOPINS2 0xa8 //21<<3 +#define rIOPINS2 0xA8 //21<<3 /* IOPINS2 Bits */ #define bmGPOUT4 0x01 #define bmGPOUT5 0x02 @@ -109,7 +109,7 @@ #define bmGPIN6 0x40 #define bmGPIN7 0x80 -#define rGPINIRQ 0xb0 //22<<3 +#define rGPINIRQ 0xB0 //22<<3 /* GPINIRQ Bits */ #define bmGPINIRQ0 0x01 #define bmGPINIRQ1 0x02 @@ -120,7 +120,7 @@ #define bmGPINIRQ6 0x40 #define bmGPINIRQ7 0x80 -#define rGPINIEN 0xb8 //23<<3 +#define rGPINIEN 0xB8 //23<<3 /* GPINIEN Bits */ #define bmGPINIEN0 0x01 #define bmGPINIEN1 0x02 @@ -131,7 +131,7 @@ #define bmGPINIEN6 0x40 #define bmGPINIEN7 0x80 -#define rGPINPOL 0xc0 //24<<3 +#define rGPINPOL 0xC0 //24<<3 /* GPINPOL Bits */ #define bmGPINPOL0 0x01 #define bmGPINPOL1 0x02 @@ -142,7 +142,7 @@ #define bmGPINPOL6 0x40 #define bmGPINPOL7 0x80 -#define rHIRQ 0xc8 //25<<3 +#define rHIRQ 0xC8 //25<<3 /* HIRQ Bits */ #define bmBUSEVENTIRQ 0x01 // indicates BUS Reset Done or BUS Resume #define bmRWUIRQ 0x02 @@ -153,7 +153,7 @@ #define bmFRAMEIRQ 0x40 #define bmHXFRDNIRQ 0x80 -#define rHIEN 0xd0 //26<<3 +#define rHIEN 0xD0 //26<<3 /* HIEN Bits */ #define bmBUSEVENTIE 0x01 @@ -165,7 +165,7 @@ #define bmFRAMEIE 0x40 #define bmHXFRDNIE 0x80 -#define rMODE 0xd8 //27<<3 +#define rMODE 0xD8 //27<<3 /* MODE Bits */ #define bmHOST 0x01 @@ -177,9 +177,9 @@ #define bmDMPULLDN 0x40 #define bmDPPULLDN 0x80 -#define rPERADDR 0xe0 //28<<3 +#define rPERADDR 0xE0 //28<<3 -#define rHCTL 0xe8 //29<<3 +#define rHCTL 0xE8 //29<<3 /* HCTL Bits */ #define bmBUSRST 0x01 #define bmFRMRST 0x02 @@ -190,7 +190,7 @@ #define bmSNDTOG0 0x40 #define bmSNDTOG1 0x80 -#define rHXFR 0xf0 //30<<3 +#define rHXFR 0xF0 //30<<3 #undef tokSETUP #undef tokIN @@ -210,7 +210,7 @@ #define tokISOIN 0x40 // HS=0, ISO=1, OUTNIN=0, SETUP=0 #define tokISOOUT 0x60 // HS=0, ISO=1, OUTNIN=1, SETUP=0 -#define rHRSL 0xf8 //31<<3 +#define rHRSL 0xF8 //31<<3 /* HRSL Bits */ #define bmRCVTOGRD 0x10 @@ -218,7 +218,7 @@ #define bmKSTATUS 0x40 #define bmJSTATUS 0x80 #define bmSE0 0x00 //SE0 - disconnect state -#define bmSE1 0xc0 //SE1 - illegal state +#define bmSE1 0xC0 //SE1 - illegal state /* Host error result codes, the 4 LSB's in the HRSL register */ #define hrSUCCESS 0x00 diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h index 1e369fde2c..319cd9c4c8 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h @@ -34,7 +34,7 @@ template void PrintHex(T val, int lvl) { int num_nibbles = sizeof (T) * 2; do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f); + char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); if (v > 57) v += 7; E_Notifyc(v, lvl); } while (--num_nibbles); @@ -50,7 +50,7 @@ template void SerialPrintHex(T val) { int num_nibbles = sizeof (T) * 2; do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f); + char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); if (v > 57) v += 7; USB_HOST_SERIAL.print(v); } while (--num_nibbles); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp index eb58f37d2f..6d2182cb8b 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp @@ -90,7 +90,7 @@ uint8_t* MAX3421e::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { // GPIN pins are in high nybbles of IOPINS1, IOPINS2 uint8_t MAX3421e::gpioRd() { - return (regRd(rIOPINS2) & 0xf0) | // pins 4-7, clean lower nybble + return (regRd(rIOPINS2) & 0xF0) | // pins 4-7, clean lower nybble (regRd(rIOPINS1) >> 4); // shift low bits and OR with upper from previous operation. } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h index 15ed427697..37ba681c5c 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h @@ -453,9 +453,9 @@ uint8_t UHS_NI UHS_Bulk_Storage::Start() { for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { if(!UHS_SLEEP_MS(3)) goto FailUnPlug; #ifndef USB_NO_TEST_UNIT_READY - uint8_t tries = 0xf0; + uint8_t tries = 0xF0; while((rcode = TestUnitReady(lun))) { - BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xf0, rcode); + BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xF0, rcode); if(rcode == 0x08) break; // break on no media, this is OK to do. if(rcode == UHS_BULK_ERR_DEVICE_DISCONNECTED) goto FailUnPlug; if(rcode == UHS_BULK_ERR_INVALID_CSW) goto Fail; @@ -475,7 +475,7 @@ uint8_t UHS_NI UHS_Bulk_Storage::Start() { if(!UHS_SLEEP_MS(3)) goto FailUnPlug; if(MediaCTL(lun, 1) == UHS_BULK_ERR_DEVICE_DISCONNECTED) goto FailUnPlug; // I actually have a USB stick that needs this! } - BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xf0, rcode); + BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xF0, rcode); if(!rcode) { if(!UHS_SLEEP_MS(3)) goto FailUnPlug; BS_HOST_DEBUG("CheckLUN...\r\n"); @@ -579,7 +579,7 @@ bool UHS_NI UHS_Bulk_Storage::CheckLUN(uint8_t lun) { CurrentCapacity[lun] = UHS_BYTES_TO_UINT32(capacity.data[0], capacity.data[1], capacity.data[2], capacity.data[3]) + 1; if(CurrentCapacity[lun] == /*0xffffffffLU */ 0x01LU || CurrentCapacity[lun] == 0x00LU) { - // Buggy firmware will report 0xffffffff or 0 for no media + // Buggy firmware will report 0xFFFFFFFF or 0 for no media #ifdef DEBUG_USB_HOST if(CurrentCapacity[lun]) ErrorMessage (PSTR(">>>>>>>>>>>>>>>>BUGGY FIRMWARE. CAPACITY FAIL ON LUN"), lun); @@ -756,7 +756,7 @@ uint8_t UHS_NI UHS_Bulk_Storage::Page3F(uint8_t lun) { buf[i] = 0x00; } WriteOk[lun] = true; - uint8_t rc = ModeSense6(lun, 0, 0x3f, 0, 192, buf); + uint8_t rc = ModeSense6(lun, 0, 0x3F, 0, 192, buf); if(!rc) { WriteOk[lun] = ((buf[2] & 0x80) == 0); #ifdef DEBUG_USB_HOST diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h index f127b4ed53..bead520bf2 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h @@ -146,7 +146,7 @@ struct SCSI_CDB6 { public: SCSI_CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control) : - Opcode(_Opcode), LBAMSB(UHS_UINT8_BYTE2(LBA) & 0x1f), LUN(_LUN), LBAHB(UHS_UINT8_BYTE1(LBA)), LBALB(UHS_UINT8_BYTE0(LBA)), + Opcode(_Opcode), LBAMSB(UHS_UINT8_BYTE2(LBA) & 0x1F), LUN(_LUN), LBAHB(UHS_UINT8_BYTE1(LBA)), LBALB(UHS_UINT8_BYTE0(LBA)), AllocationLength(_AllocationLength), Control(_Control) { } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h index 73640d5c6f..1591f3b74b 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h @@ -189,8 +189,8 @@ e-mail : support@circuitsathome.com #define UHS_USB_HOST_STATE_INITIALIZE 0x10U // Looks like "I"nit // Host SE result codes. -// Common SE results are stored in the low nybble, all interface drivers understand these plus 0x1f. -// Extended SE results are 0x10-0x1e. SE code only understands these internal to the hardware. +// Common SE results are stored in the low nybble, all interface drivers understand these plus 0x1F. +// Extended SE results are 0x10-0x1E. SE code only understands these internal to the hardware. // Values > 0x1F are driver or other internal error conditions. // Return these result codes from your host controller driver to match the error condition // ALL Non-zero values are errors. diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index 7843013b04..9c7b5001c0 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -1005,7 +1005,7 @@ uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbyt rcode = ctrlReqRead(pep, &left, &read, nbytes, dataptr); #if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - HOST_DEBUG("RESULT: 0x%2.2x 0x%2.2x 0x%2.2x 0x%8.8lx%8.8lx\r\n", rcode, addr, read, (uint32_t)((Request>>32)&0xfffffffflu), (uint32_t)(Request&0xfffffffflu)); + HOST_DEBUG("RESULT: 0x%2.2x 0x%2.2x 0x%2.2x 0x%8.8lx%8.8lx\r\n", rcode, addr, read, (uint32_t)((Request>>32)&0xFFFFFFFFLU), (uint32_t)(Request&0xFFFFFFFFLU)); // Should only be used for GET_DESCRIPTOR USB_DESCRIPTOR_DEVICE constexpr uint32_t req_match = ((uint32_t)USB_DESCRIPTOR_DEVICE << 24) | ((uint32_t)USB_REQUEST_GET_DESCRIPTOR << 8); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h index 05c76d3998..c5458208d2 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h @@ -343,16 +343,16 @@ e-mail : support@circuitsathome.com #define UHS_UINT8_BYTE7(__usi__) (((uint8_t *)&(__usi__))[7]) #else // Note: The cast alone to uint8_t is actually enough. -// GCC throws out the "& 0xff", and the size is no different. +// GCC throws out the "& 0xFF", and the size is no different. // Some compilers need it. -#define UHS_UINT8_BYTE0(__usi__) ((uint8_t)((__usi__) & 0xff )) -#define UHS_UINT8_BYTE1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xff)) -#define UHS_UINT8_BYTE2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xff)) -#define UHS_UINT8_BYTE3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xff)) -#define UHS_UINT8_BYTE4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xff)) -#define UHS_UINT8_BYTE5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xff)) -#define UHS_UINT8_BYTE6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xff)) -#define UHS_UINT8_BYTE7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xff)) +#define UHS_UINT8_BYTE0(__usi__) ((uint8_t)((__usi__) & 0xFF )) +#define UHS_UINT8_BYTE1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xFF)) +#define UHS_UINT8_BYTE2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xFF)) +#define UHS_UINT8_BYTE3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xFF)) +#define UHS_UINT8_BYTE4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xFF)) +#define UHS_UINT8_BYTE5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xFF)) +#define UHS_UINT8_BYTE6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xFF)) +#define UHS_UINT8_BYTE7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xFF)) #endif #define UHS_UINT16_SET_BYTE1(__usi__) ((uint16_t)(__usi__) << 8) #define UHS_UINT32_SET_BYTE1(__usi__) ((uint32_t)(__usi__) << 8) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h index 94015fba72..bfa052b8f7 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h @@ -36,7 +36,7 @@ void PrintHex(T val, int lvl) { int num_nibbles = sizeof (T) * 2; do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f); + char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); if(v > 57) v += 7; E_Notifyc(v, lvl); } while(--num_nibbles); @@ -56,7 +56,7 @@ void SerialPrintHex(T val) { int num_nibbles = sizeof (T) * 2; do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f); + char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); if(v > 57) v += 7; USB_HOST_SERIAL.print(v); } while(--num_nibbles); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h index a9ed2e71a5..6486482d96 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h @@ -108,12 +108,12 @@ e-mail : support@circuitsathome.com #define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration. #define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power. #define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor. -#define USB_DESCRIPTOR_DEBUG 0x0a -#define USB_DESCRIPTOR_INTERFACE_ASSOCIATION 0x0b -#define USB_DESCRIPTOR_SECURITY 0x0c -#define USB_DESCRIPTOR_KEY 0x0d -#define USB_DESCRIPTOR_ENCRYPTION_TYPE 0x0e -#define USB_DESCRIPTOR_BOS 0x0f +#define USB_DESCRIPTOR_DEBUG 0x0A +#define USB_DESCRIPTOR_INTERFACE_ASSOCIATION 0x0B +#define USB_DESCRIPTOR_SECURITY 0x0C +#define USB_DESCRIPTOR_KEY 0x0D +#define USB_DESCRIPTOR_ENCRYPTION_TYPE 0x0E +#define USB_DESCRIPTOR_BOS 0x0F #define USB_DESCRIPTOR_DEVICE_CAPABILITY 0x10 #define USB_DESCRIPTOR_WIRELESS_ENDPOINT_COMP 0x11 #define USB_DESCRIPTOR_WIRE_ADAPTER 0x21 diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h index 8719293e73..8ecafd4ad8 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h @@ -90,7 +90,7 @@ e-mail : support@circuitsathome.com #define rREVISION 0x90 //18<<3 // (IOPINS1) -#define rIOPINS1 0xa0 //20<<3 +#define rIOPINS1 0xA0 //20<<3 #define bmGPOUT0 0x01 // #define bmGPOUT1 0x02 // #define bmGPOUT2 0x04 // @@ -101,7 +101,7 @@ e-mail : support@circuitsathome.com #define bmGPIN3 0x80 // // (IOPINS2) -#define rIOPINS2 0xa8 //21<<3 +#define rIOPINS2 0xA8 //21<<3 #define bmGPOUT4 0x01 // #define bmGPOUT5 0x02 // #define bmGPOUT6 0x04 // @@ -112,7 +112,7 @@ e-mail : support@circuitsathome.com #define bmGPIN7 0x80 // // (GPINIRQ) -#define rGPINIRQ 0xb0 //22<<3 +#define rGPINIRQ 0xB0 //22<<3 #define bmGPINIRQ0 0x01 // #define bmGPINIRQ1 0x02 // #define bmGPINIRQ2 0x04 // @@ -123,7 +123,7 @@ e-mail : support@circuitsathome.com #define bmGPINIRQ7 0x80 // // (GPINIEN) -#define rGPINIEN 0xb8 //23<<3 +#define rGPINIEN 0xB8 //23<<3 #define bmGPINIEN0 0x01 // #define bmGPINIEN1 0x02 // #define bmGPINIEN2 0x04 // @@ -134,7 +134,7 @@ e-mail : support@circuitsathome.com #define bmGPINIEN7 0x80 // // (GPINPOL) -#define rGPINPOL 0xc0 //24<<3 +#define rGPINPOL 0xC0 //24<<3 #define bmGPINPOL0 0x01 // #define bmGPINPOL1 0x02 // #define bmGPINPOL2 0x04 // @@ -151,7 +151,7 @@ e-mail : support@circuitsathome.com // The CPU should never directly clear the SNDBAVIRQ bit. // Host Interrupt Request Status (HIRQ) -#define rHIRQ 0xc8 // Host Interrupt Request Register +#define rHIRQ 0xC8 // Host Interrupt Request Register #define bmBUSEVENTIRQ 0x01 // BUS Reset Done or BUS Resume Interrupt Request #define bmRWUIRQ 0x02 // Remote Wakeup Interrupt Request #define bmRCVDAVIRQ 0x04 // Receive FIFO Data Available Interrupt Request @@ -165,7 +165,7 @@ e-mail : support@circuitsathome.com #define ICLRALLBITS (bmBUSEVENTIRQ | bmRWUIRQ | bmRCVDAVIRQ | bmSUSDNIRQ | bmCONDETIRQ | bmFRAMEIRQ | bmHXFRDNIRQ) // Host Interrupt Request Control (HIEN) -#define rHIEN 0xd0 // +#define rHIEN 0xD0 // #define bmBUSEVENTIE bmBUSEVENTIRQ // BUS Reset Done or BUS Resume Interrupt Request Enable #define bmRWUIE bmRWUIRQ // Remote Wakeup Interrupt Request Enable #define bmRCVDAVIE bmRCVDAVIRQ // Receive FIFO Data Available Interrupt Request Enable @@ -176,7 +176,7 @@ e-mail : support@circuitsathome.com #define bmHXFRDNIE bmHXFRDNIRQ // Host Transfer Done Interrupt Request Enable // (MODE)) -#define rMODE 0xd8 //27<<3 +#define rMODE 0xD8 //27<<3 #define bmHOST 0x01 // #define bmLOWSPEED 0x02 // #define bmHUBPRE 0x04 // @@ -186,10 +186,10 @@ e-mail : support@circuitsathome.com #define bmDMPULLDN 0x40 // #define bmDPPULLDN 0x80 // -#define rPERADDR 0xe0 //28<<3 +#define rPERADDR 0xE0 //28<<3 // (HCTL) -#define rHCTL 0xe8 //29<<3 +#define rHCTL 0xE8 //29<<3 #define bmBUSRST 0x01 // #define bmFRMRST 0x02 // #define bmSAMPLEBUS 0x04 // @@ -200,7 +200,7 @@ e-mail : support@circuitsathome.com #define bmSNDTOG1 0x80 // // Host transfer (HXFR) -#define rHXFR 0xf0 //30<<3 +#define rHXFR 0xF0 //30<<3 /* Host transfer token values for writing the HXFR register (R30) */ /* OR this bit field with the endpoint number in bits 3:0 */ #define MAX3421E_tokSETUP 0x10 // HS=0, ISO=0, OUTNIN=0, SETUP=1 @@ -212,13 +212,13 @@ e-mail : support@circuitsathome.com #define MAX3421E_tokISOOUT 0x60 // HS=0, ISO=1, OUTNIN=1, SETUP=0 // (HRSL) -#define rHRSL 0xf8 //31<<3 +#define rHRSL 0xF8 //31<<3 #define bmRCVTOGRD 0x10 // #define bmSNDTOGRD 0x20 // #define bmKSTATUS 0x40 // #define bmJSTATUS 0x80 // #define bmSE0 0x00 //SE0 - disconnect state -#define bmSE1 0xc0 //SE1 - illegal state +#define bmSE1 0xC0 //SE1 - illegal state #define MODE_FS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmSOFKAENAB) #define MODE_LS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmLOWSPEED|bmSOFKAENAB) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h index 3166ae4b05..f7dd315a04 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h @@ -136,7 +136,7 @@ uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* dat uint8_t UHS_NI MAX3421E_HOST::gpioRd() { uint8_t gpin = 0; gpin = regRd(rIOPINS2); //pins 4-7 - gpin &= 0xf0; //clean lower nibble + gpin &= 0xF0; //clean lower nibble gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation. return ( gpin); } @@ -504,7 +504,7 @@ uint8_t UHS_NI MAX3421E_HOST::InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, ui /* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */ if((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) { //MAX_HOST_DEBUG(PSTR(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n")); - rcode = 0xf0; //receive error + rcode = 0xF0; //receive error break; } pktsize = regRd(rRCVBC); //number of received bytes @@ -576,7 +576,7 @@ uint8_t UHS_NI MAX3421E_HOST::OutTransfer(UHS_EpInfo *pep, uint16_t nak_limit, u regWr(rHXFR, (MAX3421E_tokOUT | pep->epAddr)); //dispatch packet while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ - rcode = (regRd(rHRSL) & 0x0f); + rcode = (regRd(rHRSL) & 0x0F); while(rcode && ((long)(millis() - timeout) < 0L)) { switch(rcode) { @@ -606,7 +606,7 @@ uint8_t UHS_NI MAX3421E_HOST::OutTransfer(UHS_EpInfo *pep, uint16_t nak_limit, u regWr(rHXFR, (MAX3421E_tokOUT | pep->epAddr)); //dispatch packet while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ - rcode = (regRd(rHRSL) & 0x0f); + rcode = (regRd(rHRSL) & 0x0F); SYSTEM_OR_SPECIAL_YIELD(); }//while( rcode && .... bytes_left -= bytes_tosend; @@ -631,7 +631,7 @@ breakout: /* If nak_limit == 0, do not count NAKs, exit after timeout */ /* If bus timeout, re-sends up to USB_RETRY_LIMIT times */ -/* return codes 0x00-0x0f are HRSLT( 0x00 being success ), 0xff means timeout */ +/* return codes 0x00-0x0F are HRSLT( 0x00 being success ), 0xFF means timeout */ uint8_t UHS_NI MAX3421E_HOST::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) { unsigned long timeout = millis() + UHS_HOST_TRANSFER_MAX_MS; uint8_t tmpdata; @@ -654,7 +654,7 @@ uint8_t UHS_NI MAX3421E_HOST::dispatchPkt(uint8_t token, uint8_t ep, uint16_t na }//while ( millis() < timeout - rcode = (regRd(rHRSL) & 0x0f); //analyze transfer result + rcode = (regRd(rHRSL) & 0x0F); //analyze transfer result switch(rcode) { case UHS_HOST_ERROR_NAK: diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h index 0fdb3ee3db..07f4ae054d 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h @@ -75,7 +75,7 @@ extern "C" #define NVIC_NUM_INTERRUPTS ((int)PERIPH_COUNT_IRQn) #endif #define VECTORTABLE_SIZE (NVIC_NUM_INTERRUPTS+16) -#define VECTORTABLE_ALIGNMENT (0x100ul) +#define VECTORTABLE_ALIGNMENT (0x100UL) #define NVIC_GET_ACTIVE(n) NVIC_GetActive((IRQn_Type)n) #define NVIC_GET_PENDING(n) NVIC_GetPendingIRQ((IRQn_Type)n) #define NVIC_SET_PENDING(n) NVIC_SetPendingIRQ((IRQn_Type)n) diff --git a/buildroot/share/PlatformIO/scripts/chitu_crypt.py b/buildroot/share/PlatformIO/scripts/chitu_crypt.py index 26e5612e3c..aa675878e7 100644 --- a/buildroot/share/PlatformIO/scripts/chitu_crypt.py +++ b/buildroot/share/PlatformIO/scripts/chitu_crypt.py @@ -32,7 +32,7 @@ def xor_block(r0, r1, block_number, block_size, file_key): key_length = 0x18 # This is an initial seed - xor_seed = 0x4bad + xor_seed = 0x4BAD # This is the block counter block_number = xor_seed * block_number @@ -77,7 +77,7 @@ def encrypt_file(input, output_file, file_length): uid_value = uuid.uuid4() file_key = int(uid_value.hex[0:8], 16) - xor_crc = 0xef3d4323; + xor_crc = 0xEF3D4323; # the input file is exepcted to be in chunks of 0x800 # so round the size diff --git a/buildroot/share/PlatformIO/variants/archim/variant.h b/buildroot/share/PlatformIO/variants/archim/variant.h index 56f6414202..179a137353 100644 --- a/buildroot/share/PlatformIO/variants/archim/variant.h +++ b/buildroot/share/PlatformIO/variants/archim/variant.h @@ -55,10 +55,10 @@ extern "C"{ *----------------------------------------------------------------------------*/ // Number of pins defined in PinDescription array -#define PINS_COUNT (79u) -#define NUM_DIGITAL_PINS (66u) -#define NUM_ANALOG_INPUTS (12u) -#define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) +#define PINS_COUNT (79U) +#define NUM_DIGITAL_PINS (66U) +#define NUM_ANALOG_INPUTS (12U) +#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) #define digitalPinToPort(P) ( g_APinDescription[P].pPort ) #define digitalPinToBitMask(P) ( g_APinDescription[P].ulPin ) @@ -89,9 +89,9 @@ extern "C"{ #define digitalPinToInterrupt(p) ((p) < NUM_DIGITAL_PINS ? (p) : -1) // LEDs -#define PIN_LED_13 (13u) -#define PIN_LED_RXL (72u) -#define PIN_LED_TXL (73u) +#define PIN_LED_13 (13U) +#define PIN_LED_RXL (72U) +#define PIN_LED_TXL (73U) #define PIN_LED PIN_LED_13 #define PIN_LED2 PIN_LED_RXL #define PIN_LED3 PIN_LED_TXL @@ -105,16 +105,16 @@ extern "C"{ #define SPI_INTERFACE SPI0 #define SPI_INTERFACE_ID ID_SPI0 #define SPI_CHANNELS_NUM 4 -#define PIN_SPI_SS0 (77u) -#define PIN_SPI_SS1 (87u) -#define PIN_SPI_SS2 (86u) -#define PIN_SPI_SS3 (78u) -#define PIN_SPI_MOSI (75u) -#define PIN_SPI_MISO (74u) -#define PIN_SPI_SCK (76u) -#define BOARD_SPI_SS0 (77u) //(10u) -#define BOARD_SPI_SS1 (4u) -#define BOARD_SPI_SS2 (52u) +#define PIN_SPI_SS0 (77U) +#define PIN_SPI_SS1 (87U) +#define PIN_SPI_SS2 (86U) +#define PIN_SPI_SS3 (78U) +#define PIN_SPI_MOSI (75U) +#define PIN_SPI_MISO (74U) +#define PIN_SPI_SCK (76U) +#define BOARD_SPI_SS0 (77U) //(10U) +#define BOARD_SPI_SS1 (4U) +#define BOARD_SPI_SS2 (52U) #define BOARD_SPI_SS3 PIN_SPI_SS3 #define BOARD_SPI_DEFAULT_SS BOARD_SPI_SS3 @@ -140,15 +140,15 @@ static const uint8_t SCK = PIN_SPI_SCK; */ #define WIRE_INTERFACES_COUNT 2 -#define PIN_WIRE_SDA (20u) -#define PIN_WIRE_SCL (21u) +#define PIN_WIRE_SDA (20U) +#define PIN_WIRE_SCL (21U) #define WIRE_INTERFACE TWI1 #define WIRE_INTERFACE_ID ID_TWI1 #define WIRE_ISR_HANDLER TWI1_Handler #define WIRE_ISR_ID TWI1_IRQn -#define PIN_WIRE1_SDA (70u) -#define PIN_WIRE1_SCL (71u) +#define PIN_WIRE1_SDA (70U) +#define PIN_WIRE1_SCL (71U) #define WIRE1_INTERFACE TWI0 #define WIRE1_INTERFACE_ID ID_TWI0 #define WIRE1_ISR_HANDLER TWI0_Handler @@ -163,18 +163,18 @@ static const uint8_t SCL1 = PIN_WIRE1_SCL; * UART/USART Interfaces */ // Serial -#define PINS_UART (81u) +#define PINS_UART (81U) // Serial1 -#define PINS_USART0 (82u) +#define PINS_USART0 (82U) // Serial2 -#define PINS_USART1 (83u) +#define PINS_USART1 (83U) // Serial3 -#define PINS_USART3 (84u) +#define PINS_USART3 (84U) /* * USB Interfaces */ -#define PINS_USB (85u) +#define PINS_USB (85U) /* * Analog pins @@ -204,9 +204,9 @@ static const uint8_t CAN1RX = 88; static const uint8_t CAN1TX = 89; // CAN0 -#define PINS_CAN0 (90u) +#define PINS_CAN0 (90U) // CAN1 -#define PINS_CAN1 (91u) +#define PINS_CAN1 (91U) /* From 50de8bd6fb926636f41376d31f58e6bb2c9ab553 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 10 Oct 2020 01:35:41 -0300 Subject: [PATCH 0369/1370] Keep HAL tasks running during PID Autotune (#19671) --- Marlin/src/module/temperature.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 08adfa8745..f8ff972f80 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -637,6 +637,11 @@ volatile bool Temperature::raw_temps_ready = false; goto EXIT_M303; } + + // Run HAL idle tasks + TERN_(HAL_IDLETASK, HAL_idletask()); + + // Run UI update TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); } wait_for_heatup = false; From cbed6f4241bfcc2532c7fb109d945c4425632f45 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 10 Oct 2020 22:39:12 +1300 Subject: [PATCH 0370/1370] HAS_CHARACTER_LCD => HAS_MARLINUI_HD44780 (#19673) --- Marlin/src/lcd/menu/menu_probe_offset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 29c7d41129..87957e6207 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -94,7 +94,7 @@ void probe_offset_wizard_menu() { if ((SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { extern const char NUL_STR[]; SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_CHARACTER_LCD)); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); char tmp[20], numstr[10]; // Determine digits needed right of decimal const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : From 72f9fdc05f4b5e49e3b56fde8a7fc65f6e3bf50b Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Sat, 10 Oct 2020 13:01:46 +0300 Subject: [PATCH 0371/1370] Fixes for TFTGLCD Panel, FastIO (#19614) --- Marlin/src/HAL/STM32/fastio.h | 18 +- Marlin/src/core/language.h | 2 +- Marlin/src/core/utility.h | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp | 223 +++++++----------- Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h | 1 + Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 16 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 2 +- Marlin/src/pins/stm32f0/pins_MALYAN_M300.h | 3 + Marlin/src/pins/stm32f1/pins_MORPHEUS.h | 1 + 12 files changed, 112 insertions(+), 162 deletions(-) diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h index d90b2fbeb0..7d02062b53 100644 --- a/Marlin/src/HAL/STM32/fastio.h +++ b/Marlin/src/HAL/STM32/fastio.h @@ -51,19 +51,19 @@ void FastIO_init(); // Must be called before using fast io macros #if defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32F3xx) || defined(STM32L0xx) || defined(STM32L4xx) #define _WRITE(IO, V) do { \ - if (V) FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO])) ; \ - else FastIOPortMap[STM_PORT(digitalPin[IO])]->BRR = _BV32(STM_PIN(digitalPin[IO])) ; \ + if (V) FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(digitalPinToPinName(IO) & 0x1F) ; \ + else FastIOPortMap[STM_PORT(digitalPin[IO])]->BRR = _BV32(digitalPinToPinName(IO) & 0x1F) ; \ }while(0) #else - #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO]) + ((V) ? 0 : 16))) + #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(digitalPinToPinName(IO) + ((V) ? 0 : 16))) #endif -#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPin[IO])]->IDR, _BV32(STM_PIN(digitalPin[IO])))) -#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPin[IO])]->ODR ^= _BV32(STM_PIN(digitalPin[IO]))) +#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPin[IO])]->IDR, _BV32(digitalPinToPinName(IO) & 0x1F))) +#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPin[IO])]->ODR ^= _BV32(digitalPinToPinName(IO) & 0x1F)) #define _GET_MODE(IO) #define _SET_MODE(IO,M) pinMode(IO, M) -#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) //!< Output Push Pull Mode & GPIO_NOPULL #define _SET_OUTPUT_OD(IO) pinMode(IO, OUTPUT_OPEN_DRAIN) #define WRITE(IO,V) _WRITE(IO,V) @@ -73,9 +73,9 @@ void FastIO_init(); // Must be called before using fast io macros #define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) #define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0) -#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ -#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ -#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_INPUT(IO) _SET_MODE(IO, INPUT) //!< Input Floating Mode +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) //!< Input with Pull-up activation +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) //!< Input with Pull-down activation #define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) #define SET_PWM(IO) _SET_MODE(IO, PWM) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index a644ab2fc8..60d9aa6b72 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -303,7 +303,7 @@ #define LCD_STR_C STR_C #define LCD_STR_E STR_E -#if HAS_MARLINUI_HD44780 +#if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) // Custom characters defined in the first 8 characters of the LCD #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string! diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index 0481ffc02a..645a4be807 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -71,7 +71,7 @@ public: inline void restore() { ref_ = val_; } }; -#define REMEMBER(N,X,V...) restorer restorer_##N(X, ##V) +#define REMEMBER(N,X,V...) restorer<__typeof__(X)> restorer_##N(X, ##V) #define RESTORE(N) restorer_##N.restore() // Converts from an uint8_t in the range of 0-255 to an uint8_t diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 210bf3e91b..42d82dcc10 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -226,9 +226,9 @@ #define LCD_PROGRESS_BAR #endif #if ENABLED(TFTGLCD_PANEL_I2C) - #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD for I2C and SPI buses (LiquidTWI2 not required) #define LCD_I2C_ADDRESS 0x27 // Must be equal to panel's I2C slave addres #endif + #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD, used for both I2C and SPI buses (LiquidTWI2 not required) #define STD_ENCODER_PULSES_PER_STEP 2 #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 #define LCD_WIDTH 20 // 20 or 24 chars in line diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 80c42955e9..f832137f5b 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2457,7 +2457,7 @@ /** * Buzzer/Speaker */ -#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER, IS_TFTGLCD_PANEL) +#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) #define HAS_BUZZER 1 #if PIN_EXISTS(BEEPER) #define USE_BEEPER 1 diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp index a537d92081..b5789091dc 100644 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp @@ -32,7 +32,7 @@ * and supports color output. */ -#if NONE(__AVR__, MCU_LPC1768, __STM32F1__, STM32F4xx) +#if NONE(__AVR__, TARGET_LPC1768, __STM32F1__, STM32F4xx) #warning "Selected platform not yet tested. Please contribute your good pin mappings." #endif @@ -72,16 +72,17 @@ TFTGLCD lcd; #define ICON_HOT B01000000 //when any T > 50deg #define PIC_MASK 0x7F -//LEDs not used, for compatibility with Smoothieware +// LEDs not used, for compatibility with Smoothieware #define LED_HOTEND_ON B00000001 #define LED_BED_ON B00000010 #define LED_FAN_ON B00000100 #define LED_HOT B00001000 #define LED_MASK 0x0F -#define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2) +#define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2) +#define MIDDLE_Y ((LCD_HEIGHT - 1) / 2) -//markers for change line color +// Markers for change line colors #define COLOR_EDIT '#' #define COLOR_ERROR '!' @@ -114,7 +115,8 @@ enum Commands { // based on Smoothieware commands GET_LCD_ROW = 0xE0, // for detect panel GET_LCD_COL, // reserved for compatibility with Smoothieware, not used LCD_PUT, // write one line to LCD - INIT_SCREEN = 0xFE, // clear panel buffer + CLR_SCREEN, + INIT_SCREEN = 0xFE // clear panel buffer }; static unsigned char framebuffer[FBSIZE]; @@ -123,28 +125,62 @@ static uint8_t cour_line; static uint8_t picBits, ledBits, hotBits; static uint8_t PanelDetected = 0; +// Different platforms use different SPI methods +#if ANY(__AVR__, TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + #define SPI_SEND_ONE(V) SPI.transfer(V); + #define SPI_SEND_TWO(V) SPI.transfer16(V); +#elif defined(STM32F4xx) + #define SPI_SEND_ONE(V) SPI.transfer(V, SPI_CONTINUE); + #define SPI_SEND_TWO(V) SPI.transfer16(V, SPI_CONTINUE); +#elif defined(ARDUINO_ARCH_ESP32) + #define SPI_SEND_ONE(V) SPI.write(V); + #define SPI_SEND_TWO(V) SPI.write16(V); +#endif + +#if ANY(__AVR__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L); +#elif defined(STM32F4xx) + #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L, SPI_CONTINUE); +#elif ANY(TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_ESP32) + #define SPI_SEND_SOME(V,L,Z) do{ for (uint16_t i = 0; i < L; i++) SPI_SEND_ONE(V[(Z)+i]); }while(0) +#endif + // Constructor TFTGLCD::TFTGLCD() {} -//clearing local buffer +// Clear local buffer void TFTGLCD::clear_buffer() { memset(&framebuffer[0], ' ', FBSIZE - 2); framebuffer[FBSIZE - 1] = framebuffer[FBSIZE - 2] = 0; picBits = ledBits = 0; } -//set new text cursor position +// Clear panel's screen +void TFTGLCD::clr_screen() { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(CLR_SCREEN); + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address + Wire.write(CLR_SCREEN); + Wire.endTransmission(); //transmit data + #endif +} + +// Set new text cursor position void TFTGLCD::setCursor(uint8_t col, uint8_t row) { fb = &framebuffer[0] + col + row * LCD_WIDTH; cour_line = row; } -//send char to buffer +// Send char to buffer void TFTGLCD::write(char c) { *fb++ = c; } -//send text line to buffer +// Send text line to buffer void TFTGLCD::print(const char *line) { while (*line) *fb++ = *line++; } @@ -154,27 +190,9 @@ void TFTGLCD::print_line() { if (!PanelDetected) return; #if ENABLED(TFTGLCD_PANEL_SPI) WRITE(TFTGLCD_CS, LOW); - #ifdef __AVR__ - SPI.transfer(LCD_PUT); - SPI.transfer(cour_line); - SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); - #elif EITHER(MCU_LPC1768, __STM32F1__) - SPI.transfer(LCD_PUT); - SPI.transfer(cour_line); - for (uint16_t i = 0; i < LCD_WIDTH; i++) SPI.transfer(framebuffer[cour_line * LCD_WIDTH + i]); - #elif defined(STM32F4xx) - SPI.transfer(LCD_PUT, SPI_CONTINUE); - SPI.transfer(cour_line, SPI_CONTINUE); - SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(LCD_PUT); - SPI.transfer(cour_line); - SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(LCD_PUT); - SPI.write(cour_line); - for (uint16_t i = 0; i < LCD_WIDTH; i++) SPI.write(framebuffer[cour_line * LCD_WIDTH + i]); - #endif + SPI_SEND_ONE(LCD_PUT); + SPI_SEND_ONE(cour_line); + SPI_SEND_SOME(framebuffer, LCD_WIDTH, cour_line * LCD_WIDTH); WRITE(TFTGLCD_CS, HIGH); #else Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address @@ -193,22 +211,8 @@ void TFTGLCD::print_screen(){ #if ENABLED(TFTGLCD_PANEL_SPI) // Send all framebuffer to panel WRITE(TFTGLCD_CS, LOW); - #ifdef __AVR__ - SPI.transfer(LCD_WRITE); - SPI.transfer(&framebuffer[0], FBSIZE); - #elif EITHER(MCU_LPC1768, __STM32F1__) - SPI.transfer(LCD_WRITE); - for (uint16_t i = 0; i < FBSIZE; i++) SPI.transfer(framebuffer[i]); - #elif defined(STM32F4xx) - SPI.transfer(LCD_WRITE, SPI_CONTINUE); - SPI.transfer(&framebuffer[0], FBSIZE, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(LCD_WRITE); - SPI.transfer(&framebuffer[0], FBSIZE); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(LCD_WRITE); - for (uint16_t i = 0; i < FBSIZE; i++) SPI.write(framebuffer[i]); - #endif + SPI_SEND_ONE(LCD_WRITE); + SPI_SEND_SOME(framebuffer, FBSIZE, 0); WRITE(TFTGLCD_CS, HIGH); #else uint8_t r; @@ -235,19 +239,8 @@ void TFTGLCD::setContrast(uint16_t contrast) { if (!PanelDetected) return; #if ENABLED(TFTGLCD_PANEL_SPI) WRITE(TFTGLCD_CS, LOW); - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(CONTRAST); - SPI.transfer((uint8_t)contrast); - #elif defined(STM32F4xx) - SPI.transfer(CONTRAST, SPI_CONTINUE); - SPI.transfer((uint8_t)contrast, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(CONTRAST); - SPI.transfer((uint8_t)contrast); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(CONTRAST); - SPI.write((uint8_t)contrast); - #endif + SPI_SEND_ONE(CONTRAST); + SPI_SEND_ONE((uint8_t)contrast); WRITE(TFTGLCD_CS, HIGH); #else Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); @@ -257,37 +250,24 @@ void TFTGLCD::setContrast(uint16_t contrast) { #endif } -//reading buttons and encoder states extern volatile int8_t encoderDiff; +// Read buttons and encoder states uint8_t MarlinUI::read_slow_buttons(void) { if (!PanelDetected) return 0; #if ENABLED(TFTGLCD_PANEL_SPI) uint8_t b = 0; WRITE(TFTGLCD_CS, LOW); - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(READ_ENCODER); - WRITE(TFTGLCD_CS, LOW); //for delay - encoderDiff += SPI.transfer(READ_BUTTONS); - WRITE(TFTGLCD_CS, LOW); //for delay - b = SPI.transfer(GET_SPI_DATA); - #elif defined(STM32F4xx) - SPI.transfer(READ_ENCODER, SPI_CONTINUE); - encoderDiff += SPI.transfer(READ_BUTTONS, SPI_CONTINUE); - b = SPI.transfer(GET_SPI_DATA, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(READ_ENCODER); - WRITE(TFTGLCD_CS, LOW); //for delay ???? - encoderDiff += SPI.transfer(READ_BUTTONS); - WRITE(TFTGLCD_CS, LOW); //for delay ???? - b = SPI.transfer(GET_SPI_DATA); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.transfer(READ_ENCODER); - WRITE(TFTGLCD_CS, LOW); //for delay ???? - encoderDiff += SPI.transfer(READ_BUTTONS); - WRITE(TFTGLCD_CS, LOW); //for delay ???? - b = SPI.transfer(GET_SPI_DATA); + SPI_SEND_ONE(READ_ENCODER); + #ifndef STM32F4xx + WRITE(TFTGLCD_CS, LOW); // for delay #endif + encoderDiff += SPI_SEND_ONE(READ_BUTTONS); + #ifndef STM32F4xx + WRITE(TFTGLCD_CS, LOW); // for delay + WRITE(TFTGLCD_CS, LOW); + #endif + b = SPI_SEND_ONE(GET_SPI_DATA); WRITE(TFTGLCD_CS, HIGH); return b; #else @@ -298,7 +278,7 @@ uint8_t MarlinUI::read_slow_buttons(void) { Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1); #elif defined(__STM32F1__) Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2); - #elif EITHER(STM32F4xx, MCU_LPC1768) + #elif EITHER(STM32F4xx, TARGET_LPC1768) Wire.requestFrom(LCD_I2C_ADDRESS, 2); #endif encoderDiff += Wire.read(); @@ -306,28 +286,14 @@ uint8_t MarlinUI::read_slow_buttons(void) { #endif } -// duration in ms, freq in Hz +// Duration in ms, freq in Hz void MarlinUI::buzz(const long duration, const uint16_t freq) { if (!PanelDetected) return; #if ENABLED(TFTGLCD_PANEL_SPI) WRITE(TFTGLCD_CS, LOW); - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(BUZZER); - SPI.transfer16((uint16_t)duration); - SPI.transfer16(freq); - #elif defined(STM32F4xx) - SPI.transfer(BUZZER, SPI_CONTINUE); - SPI.transfer16((uint16_t)duration, SPI_CONTINUE); - SPI.transfer16(freq, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(BUZZER); - SPI.transfer16((uint16_t)duration); - SPI.transfer16(freq); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(BUZZER); - SPI.write16((uint16_t)duration); - SPI.write16(freq); - #endif + SPI_SEND_ONE(BUZZER); + SPI_SEND_TWO((uint16_t)duration); + SPI_SEND_TWO(freq); WRITE(TFTGLCD_CS, HIGH); #else Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); @@ -346,24 +312,14 @@ void MarlinUI::init_lcd() { t = 0; #if ENABLED(TFTGLCD_PANEL_SPI) // SPI speed must be less 10MHz - OUT_WRITE(TFTGLCD_CS, HIGH); + _SET_OUTPUT(TFTGLCD_CS); + WRITE(TFTGLCD_CS, HIGH); spiInit(TERN(__STM32F1__, SPI_QUARTER_SPEED, SPI_FULL_SPEED)); WRITE(TFTGLCD_CS, LOW); - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(GET_LCD_ROW); - t = SPI.transfer(GET_SPI_DATA); - #elif defined(STM32F4xx) - SPI.transfer(GET_LCD_ROW, SPI_CONTINUE); - t = SPI.transfer(GET_SPI_DATA, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(GET_LCD_ROW); - t = SPI.transfer(GET_SPI_DATA); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(GET_LCD_ROW); - t = SPI.transfer(GET_SPI_DATA); - #endif + SPI_SEND_ONE(GET_LCD_ROW); + t = SPI_SEND_ONE(GET_SPI_DATA); #else - #ifdef MCU_LPC1768 + #ifdef TARGET_LPC1768 Wire.begin(); //init twi/I2C #else Wire.begin((uint8_t)LCD_I2C_ADDRESS); //init twi/I2C @@ -373,7 +329,7 @@ void MarlinUI::init_lcd() { Wire.endTransmission(); // send buffer #ifdef __AVR__ Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 1, 0, 0, 1); - #elif ANY(__STM32F1__, STM32F4xx, MCU_LPC1768) + #elif ANY(__STM32F1__, STM32F4xx, TARGET_LPC1768) Wire.requestFrom(LCD_I2C_ADDRESS, 1); #endif t = (uint8_t)Wire.read(); @@ -382,20 +338,8 @@ void MarlinUI::init_lcd() { if (t == LCD_HEIGHT) { PanelDetected = 1; #if ENABLED(TFTGLCD_PANEL_SPI) - PanelDetected = 1; - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(INIT_SCREEN); - SPI.transfer(Marlin); - #elif defined(STM32F4xx) - SPI.transfer(INIT_SCREEN, SPI_CONTINUE); - SPI.transfer(Marlin, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(INIT_SCREEN); - SPI.transfer(Marlin); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(INIT_SCREEN); - SPI.write(Marlin); - #endif + SPI_SEND_ONE(INIT_SCREEN); + SPI_SEND_ONE(Marlin); WRITE(TFTGLCD_CS, HIGH); #else Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); @@ -415,8 +359,8 @@ bool MarlinUI::detected() { void MarlinUI::clear_lcd() { if (!PanelDetected) return; + lcd.clr_screen(); lcd.clear_buffer(); - lcd.print_screen(); } int16_t MarlinUI::contrast; // Initialized by settings.load() @@ -583,10 +527,10 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *p lcd.write('%'); lcd.write(percent); } else { // For progress bar test - lcd.setCursor(LCD_WIDTH / 2 - 2, LCD_HEIGHT / 2 - 2); + lcd.setCursor(LCD_WIDTH / 2 - 2, MIDDLE_Y); lcd.print(i16tostr3rj(percent)); lcd.write('%'); lcd.print_line(); - lcd.setCursor(0, LCD_HEIGHT / 2 - 1); + lcd.setCursor(0, MIDDLE_Y + 1); lcd.write('%'); lcd.write(percent); lcd.print_line(); } @@ -912,16 +856,17 @@ void MarlinUI::draw_status_screen() { } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace + // This line moves to the last line of the screen for UBL plot screen on the panel side void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { if (!PanelDetected) return; ui.encoder_direction_normal(); - lcd.setCursor(0, LCD_HEIGHT - 1); //last line is free most time + lcd.setCursor(0, MIDDLE_Y); lcd.write(COLOR_EDIT); lcd_put_u8str_P(pstr); if (value != nullptr) { lcd.write(':'); - lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), LCD_HEIGHT - 1); // Right-justified, padded by spaces - lcd.write(' '); // Overwrite char if value gets shorter + lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), MIDDLE_Y); // Right-justified, padded by spaces + lcd.write(' '); // Overwrite char if value gets shorter lcd.print(value); lcd.write(' '); lcd.print_line(); @@ -932,10 +877,10 @@ void MarlinUI::draw_status_screen() { void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) { if (!PanelDetected) return; ui.draw_select_screen_prompt(pref, string, suff); - lcd.setCursor(0, LCD_HEIGHT - 1); + lcd.setCursor(0, MIDDLE_Y); lcd.write(COLOR_EDIT); lcd.write(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd.write(yesno ? ' ' : ']'); - lcd.setCursor(LCD_WIDTH - utf8_strlen_P(yes) - 3, LCD_HEIGHT - 1); + lcd.setCursor(LCD_WIDTH - utf8_strlen_P(yes) - 3, MIDDLE_Y); lcd.write(yesno ? '[' : ' '); lcd_put_u8str_P(yes); lcd.write(yesno ? ']' : ' '); lcd.print_line(); } diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h index 9f54730c3c..eedcc4afa0 100644 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h @@ -45,6 +45,7 @@ class TFTGLCD { public: TFTGLCD(); void clear_buffer(); + void clr_screen(); void setCursor(uint8_t col, uint8_t row); void write(char c); void print(const char *line); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index c0a72bbe6c..68a10245e9 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -490,7 +490,7 @@ void menu_backlash(); #if ENABLED(PROBE_OFFSET_WIZARD) SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); #endif - + END_MENU(); } #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 8cb06824b4..5bb32a420a 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -223,14 +223,14 @@ #endif /** - * _____ _____ - * NC | · · | GND 5V | · · | GND - * RESET | · · | 1.31(SD_DETECT) (LCD_D7) 1.23 | · · | 1.22 (LCD_D6) - * (MOSI)0.18 | · · | 3.25(BTN_EN2) (LCD_D5) 1.21 | · · | 1.20 (LCD_D4) - * (SD_SS)0.16 | · · | 3.26(BTN_EN1) (LCD_RS) 1.19 | · · | 1.18 (LCD_EN) - * (SCK)0.15 | · · | 0.17(MISO) (BTN_ENC) 0.28 | · · | 1.30 (BEEPER) - * ----- ----- - * EXP2 EXP1 + * _____ _____ + * NC | · · | GND 5V | · · | GND + * RESET | · · | 1.31 (SD_DETECT) (LCD_D7) 1.23 | · · | 1.22 (LCD_D6) + * (MOSI) 0.18 | · · | 3.25 (BTN_EN2) (LCD_D5) 1.21 | · · | 1.20 (LCD_D4) + * (SD_SS) 0.16 | · · | 3.26 (BTN_EN1) (LCD_RS) 1.19 | · · | 1.18 (LCD_EN) + * (SCK) 0.15 | · · | 0.17 (MISO) (BTN_ENC) 0.28 | · · | 1.30 (BEEPER) + * ----- ----- + * EXP2 EXP1 */ #if HAS_WIRED_LCD #if ENABLED(ANET_FULL_GRAPHICS_LCD) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index fd902afda4..820c35a01c 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -92,7 +92,7 @@ // // LCD / Controller // -#if HAS_WIRED_LCD +#if HAS_WIRED_LCD && DISABLED(LCD_USE_I2C_BUZZER) #define BEEPER_PIN P1_30 // (37) not 5V tolerant #endif diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h index dfa413b63f..a0e035a916 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h @@ -33,6 +33,9 @@ // #if NO_EEPROM_SELECTED #define FLASH_EEPROM_EMULATION + #ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x800U // 2KB + #endif #endif // diff --git a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h index 28262eaa82..ccc92b7527 100644 --- a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h +++ b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h @@ -89,3 +89,4 @@ // #define LED_PIN PC13 #define SDSS PA3 +#define TFTGLCD_CS PA4 From 2adac87c45ad3a096758e0348444c778e673e0c2 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 10 Oct 2020 13:47:28 -0300 Subject: [PATCH 0372/1370] Restore correct STM32 port-bits code (#19678) --- Marlin/src/HAL/STM32/fastio.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h index 7d02062b53..f000d68cf0 100644 --- a/Marlin/src/HAL/STM32/fastio.h +++ b/Marlin/src/HAL/STM32/fastio.h @@ -51,15 +51,15 @@ void FastIO_init(); // Must be called before using fast io macros #if defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32F3xx) || defined(STM32L0xx) || defined(STM32L4xx) #define _WRITE(IO, V) do { \ - if (V) FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(digitalPinToPinName(IO) & 0x1F) ; \ - else FastIOPortMap[STM_PORT(digitalPin[IO])]->BRR = _BV32(digitalPinToPinName(IO) & 0x1F) ; \ + if (V) FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO])) ; \ + else FastIOPortMap[STM_PORT(digitalPin[IO])]->BRR = _BV32(STM_PIN(digitalPin[IO])) ; \ }while(0) #else - #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(digitalPinToPinName(IO) + ((V) ? 0 : 16))) + #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO]) + ((V) ? 0 : 16))) #endif -#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPin[IO])]->IDR, _BV32(digitalPinToPinName(IO) & 0x1F))) -#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPin[IO])]->ODR ^= _BV32(digitalPinToPinName(IO) & 0x1F)) +#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPin[IO])]->IDR, _BV32(STM_PIN(digitalPin[IO])))) +#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPin[IO])]->ODR ^= _BV32(STM_PIN(digitalPin[IO]))) #define _GET_MODE(IO) #define _SET_MODE(IO,M) pinMode(IO, M) From 2e01eb91890a21bc631fa045afedcf4c2ba5a2a7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 10 Oct 2020 12:07:00 -0500 Subject: [PATCH 0373/1370] Save PLR on resume from pause (#19676) Co-Authored-By: shahab <32130261+SHBnik@users.noreply.github.com> --- Marlin/src/feature/pause.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index a36ff50756..0ab6594021 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -61,6 +61,10 @@ #include "../libs/buzzer.h" #endif +#if ENABLED(POWER_LOSS_RECOVERY) + #include "powerloss.h" +#endif + #include "../libs/nozzle.h" #include "pause.h" @@ -640,6 +644,9 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Set extruder to saved position planner.set_e_position_mm((destination.e = current_position.e = resume_position.e)); + // Write PLR now to update the z axis value + TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); #ifdef ACTION_ON_RESUMED From a30e8baf3e4b4780d2e94a8663f85bb163eb7cf7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 11 Oct 2020 14:58:35 -0500 Subject: [PATCH 0374/1370] Digipots refactor / cleanup (#19690) --- Marlin/src/HAL/DUE/fastio/G2_PWM.cpp | 2 +- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 2 +- Marlin/src/MarlinCore.cpp | 12 ++-- Marlin/src/feature/dac/dac_mcp4728.cpp | 50 ++++++++-------- Marlin/src/feature/dac/dac_mcp4728.h | 25 ++++---- Marlin/src/feature/dac/stepper_dac.cpp | 57 +++++++++--------- Marlin/src/feature/dac/stepper_dac.h | 19 +++--- Marlin/src/feature/digipot/digipot.h | 12 +++- .../src/feature/digipot/digipot_mcp4018.cpp | 12 ++-- .../src/feature/digipot/digipot_mcp4451.cpp | 8 ++- .../src/gcode/feature/digipot/M907-M910.cpp | 52 ++++++++-------- Marlin/src/gcode/gcode.cpp | 6 +- Marlin/src/gcode/gcode.h | 12 ++-- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 8 +-- Marlin/src/module/settings.cpp | 59 ++++++++++++++----- Marlin/src/module/stepper.cpp | 55 ++++++++--------- Marlin/src/module/stepper.h | 22 ++++--- Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h | 2 +- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 2 +- platformio.ini | 4 +- 23 files changed, 240 insertions(+), 187 deletions(-) diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp index 1682faea66..d9fbabce21 100644 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp @@ -154,7 +154,7 @@ void Stepper::digipot_init() { NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals) } -void Stepper::digipot_current(const uint8_t driver, const int16_t current) { +void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index fd82e2884a..f5051d32a1 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -191,7 +191,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o // // Flag any i2c pin conflicts // -#if ANY(HAS_I2C_DIGIPOT, DAC_STEPPER_CURRENT, EXPERIMENTAL_I2CBUS, I2C_POSITION_ENCODERS, PCA9632, I2C_EEPROM) +#if ANY(HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC, EXPERIMENTAL_I2CBUS, I2C_POSITION_ENCODERS, PCA9632, I2C_EEPROM) #define USEDI2CDEV_M 1 // /Wire.cpp #if USEDI2CDEV_M == 0 // P0_27 [D57] (AUX-1) .......... P0_28 [D58] (AUX-1) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 672858d05a..3a20cf3ee3 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -97,7 +97,7 @@ #include "feature/closedloop.h" #endif -#if HAS_I2C_DIGIPOT +#if HAS_MOTOR_CURRENT_I2C #include "feature/digipot/digipot.h" #endif @@ -125,7 +125,7 @@ #include "module/servo.h" #endif -#if ENABLED(DAC_STEPPER_CURRENT) +#if ENABLED(HAS_MOTOR_CURRENT_DAC) #include "feature/dac/stepper_dac.h" #endif @@ -1137,12 +1137,12 @@ void setup() { SETUP_RUN(enableStepperDrivers()); #endif - #if HAS_I2C_DIGIPOT - SETUP_RUN(digipot_i2c_init()); + #if HAS_MOTOR_CURRENT_I2C + SETUP_RUN(digipot_i2c.init()); #endif - #if ENABLED(DAC_STEPPER_CURRENT) - SETUP_RUN(dac_init()); + #if ENABLED(HAS_MOTOR_CURRENT_DAC) + SETUP_RUN(stepper_dac.init()); #endif #if EITHER(Z_PROBE_SLED, SOLENOID_PROBE) && HAS_SOLENOID_1 diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index 55f10a49ef..81c465cf29 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -32,16 +32,18 @@ #include "../../inc/MarlinConfig.h" -#if ENABLED(DAC_STEPPER_CURRENT) +#if ENABLED(HAS_MOTOR_CURRENT_DAC) #include "dac_mcp4728.h" -xyze_uint_t mcp4728_values; +MCP4728 mcp4728; + +xyze_uint_t dac_values; /** * Begin I2C, get current values (input register and eeprom) of mcp4728 */ -void mcp4728_init() { +void MCP4728::init() { Wire.begin(); Wire.requestFrom(I2C_ADDRESS(DAC_DEV_ADDRESS), uint8_t(24)); while (Wire.available()) { @@ -50,7 +52,7 @@ void mcp4728_init() { loByte = Wire.read(); if (!(deviceID & 0x08)) - mcp4728_values[(deviceID & 0x30) >> 4] = word((hiByte & 0x0F), loByte); + dac_values[(deviceID & 0x30) >> 4] = word((hiByte & 0x0F), loByte); } } @@ -58,9 +60,9 @@ void mcp4728_init() { * Write input resister value to specified channel using fastwrite method. * Channel : 0-3, Values : 0-4095 */ -uint8_t mcp4728_analogWrite(const uint8_t channel, const uint16_t value) { - mcp4728_values[channel] = value; - return mcp4728_fastWrite(); +uint8_t MCP4728::analogWrite(const uint8_t channel, const uint16_t value) { + dac_values[channel] = value; + return fastWrite(); } /** @@ -68,12 +70,12 @@ uint8_t mcp4728_analogWrite(const uint8_t channel, const uint16_t value) { * This will update both input register and EEPROM value * This will also write current Vref, PowerDown, Gain settings to EEPROM */ -uint8_t mcp4728_eepromWrite() { +uint8_t MCP4728::eepromWrite() { Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); Wire.write(SEQWRITE); LOOP_XYZE(i) { - Wire.write(DAC_STEPPER_VREF << 7 | DAC_STEPPER_GAIN << 4 | highByte(mcp4728_values[i])); - Wire.write(lowByte(mcp4728_values[i])); + Wire.write(DAC_STEPPER_VREF << 7 | DAC_STEPPER_GAIN << 4 | highByte(dac_values[i])); + Wire.write(lowByte(dac_values[i])); } return Wire.endTransmission(); } @@ -81,7 +83,7 @@ uint8_t mcp4728_eepromWrite() { /** * Write Voltage reference setting to all input regiters */ -uint8_t mcp4728_setVref_all(const uint8_t value) { +uint8_t MCP4728::setVref_all(const uint8_t value) { Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); Wire.write(VREFWRITE | (value ? 0x0F : 0x00)); return Wire.endTransmission(); @@ -89,7 +91,7 @@ uint8_t mcp4728_setVref_all(const uint8_t value) { /** * Write Gain setting to all input regiters */ -uint8_t mcp4728_setGain_all(const uint8_t value) { +uint8_t MCP4728::setGain_all(const uint8_t value) { Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); Wire.write(GAINWRITE | (value ? 0x0F : 0x00)); return Wire.endTransmission(); @@ -98,16 +100,16 @@ uint8_t mcp4728_setGain_all(const uint8_t value) { /** * Return Input Register value */ -uint16_t mcp4728_getValue(const uint8_t channel) { return mcp4728_values[channel]; } +uint16_t MCP4728::getValue(const uint8_t channel) { return dac_values[channel]; } #if 0 /** * Steph: Might be useful in the future * Return Vout */ -uint16_t mcp4728_getVout(const uint8_t channel) { +uint16_t MCP4728::getVout(const uint8_t channel) { const uint32_t vref = 2048, - vOut = (vref * mcp4728_values[channel] * (_DAC_STEPPER_GAIN + 1)) / 4096; + vOut = (vref * dac_values[channel] * (_DAC_STEPPER_GAIN + 1)) / 4096; return _MIN(vOut, defaultVDD); } #endif @@ -115,15 +117,15 @@ uint16_t mcp4728_getVout(const uint8_t channel) { /** * Returns DAC values as a 0-100 percentage of drive strength */ -uint8_t mcp4728_getDrvPct(const uint8_t channel) { return uint8_t(100.0 * mcp4728_values[channel] / (DAC_STEPPER_MAX) + 0.5); } +uint8_t MCP4728::getDrvPct(const uint8_t channel) { return uint8_t(100.0 * dac_values[channel] / (DAC_STEPPER_MAX) + 0.5); } /** * Receives all Drive strengths as 0-100 percent values, updates * DAC Values array and calls fastwrite to update the DAC. */ -void mcp4728_setDrvPct(xyze_uint8_t &pct) { - mcp4728_values *= 0.01 * pct * (DAC_STEPPER_MAX); - mcp4728_fastWrite(); +void MCP4728::setDrvPct(xyze_uint8_t &pct) { + dac_values *= 0.01 * pct * (DAC_STEPPER_MAX); + fastWrite(); } /** @@ -131,11 +133,11 @@ void mcp4728_setDrvPct(xyze_uint8_t &pct) { * DAC Input and PowerDown bits update. * No EEPROM update */ -uint8_t mcp4728_fastWrite() { +uint8_t MCP4728::fastWrite() { Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); LOOP_XYZE(i) { - Wire.write(highByte(mcp4728_values[i])); - Wire.write(lowByte(mcp4728_values[i])); + Wire.write(highByte(dac_values[i])); + Wire.write(lowByte(dac_values[i])); } return Wire.endTransmission(); } @@ -143,10 +145,10 @@ uint8_t mcp4728_fastWrite() { /** * Common function for simple general commands */ -uint8_t mcp4728_simpleCommand(const byte simpleCommand) { +uint8_t MCP4728::simpleCommand(const byte simpleCommand) { Wire.beginTransmission(I2C_ADDRESS(GENERALCALL)); Wire.write(simpleCommand); return Wire.endTransmission(); } -#endif // DAC_STEPPER_CURRENT +#endif // HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/feature/dac/dac_mcp4728.h b/Marlin/src/feature/dac/dac_mcp4728.h index fc69bd8ff4..571716d483 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.h +++ b/Marlin/src/feature/dac/dac_mcp4728.h @@ -65,13 +65,18 @@ // DAC_OR_ADDRESS defined in pins_BOARD.h file #define DAC_DEV_ADDRESS (BASE_ADDR | DAC_OR_ADDRESS) -void mcp4728_init(); -uint8_t mcp4728_analogWrite(const uint8_t channel, const uint16_t value); -uint8_t mcp4728_eepromWrite(); -uint8_t mcp4728_setVref_all(const uint8_t value); -uint8_t mcp4728_setGain_all(const uint8_t value); -uint16_t mcp4728_getValue(const uint8_t channel); -uint8_t mcp4728_fastWrite(); -uint8_t mcp4728_simpleCommand(const byte simpleCommand); -uint8_t mcp4728_getDrvPct(const uint8_t channel); -void mcp4728_setDrvPct(xyze_uint8_t &pct); +class MCP4728 { +public: + static void init(); + static uint8_t analogWrite(const uint8_t channel, const uint16_t value); + static uint8_t eepromWrite(); + static uint8_t setVref_all(const uint8_t value); + static uint8_t setGain_all(const uint8_t value); + static uint16_t getValue(const uint8_t channel); + static uint8_t fastWrite(); + static uint8_t simpleCommand(const byte simpleCommand); + static uint8_t getDrvPct(const uint8_t channel); + static void setDrvPct(xyze_uint8_t &pct); +}; + +extern MCP4728 mcp4728; diff --git a/Marlin/src/feature/dac/stepper_dac.cpp b/Marlin/src/feature/dac/stepper_dac.cpp index 6b140a0025..5f10b4ccfb 100644 --- a/Marlin/src/feature/dac/stepper_dac.cpp +++ b/Marlin/src/feature/dac/stepper_dac.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfig.h" -#if ENABLED(DAC_STEPPER_CURRENT) +#if ENABLED(HAS_MOTOR_CURRENT_DAC) #include "stepper_dac.h" #include "../../MarlinCore.h" // for SP_X_LBL... @@ -35,56 +35,53 @@ bool dac_present = false; constexpr xyze_uint8_t dac_order = DAC_STEPPER_ORDER; xyze_uint8_t dac_channel_pct = DAC_MOTOR_CURRENT_DEFAULT; -int dac_init() { +StepperDAC stepper_dac; + +int StepperDAC::init() { #if PIN_EXISTS(DAC_DISABLE) OUT_WRITE(DAC_DISABLE_PIN, LOW); // set pin low to enable DAC #endif - mcp4728_init(); + mcp4728.init(); - if (mcp4728_simpleCommand(RESET)) return -1; + if (mcp4728.simpleCommand(RESET)) return -1; dac_present = true; - mcp4728_setVref_all(DAC_STEPPER_VREF); - mcp4728_setGain_all(DAC_STEPPER_GAIN); + mcp4728.setVref_all(DAC_STEPPER_VREF); + mcp4728.setGain_all(DAC_STEPPER_GAIN); - if (mcp4728_getDrvPct(0) < 1 || mcp4728_getDrvPct(1) < 1 || mcp4728_getDrvPct(2) < 1 || mcp4728_getDrvPct(3) < 1 ) { - mcp4728_setDrvPct(dac_channel_pct); - mcp4728_eepromWrite(); + if (mcp4728.getDrvPct(0) < 1 || mcp4728.getDrvPct(1) < 1 || mcp4728.getDrvPct(2) < 1 || mcp4728.getDrvPct(3) < 1 ) { + mcp4728.setDrvPct(dac_channel_pct); + mcp4728.eepromWrite(); } return 0; } -void dac_current_percent(uint8_t channel, float val) { - if (!dac_present) return; - - NOMORE(val, 100); - - mcp4728_analogWrite(dac_order[channel], val * 0.01 * (DAC_STEPPER_MAX)); - mcp4728_simpleCommand(UPDATE); -} - -void dac_current_raw(uint8_t channel, uint16_t val) { +void StepperDAC::set_current_value(const uint8_t channel, uint16_t val) { if (!dac_present) return; NOMORE(val, uint16_t(DAC_STEPPER_MAX)); - mcp4728_analogWrite(dac_order[channel], val); - mcp4728_simpleCommand(UPDATE); + mcp4728.analogWrite(dac_order[channel], val); + mcp4728.simpleCommand(UPDATE); } -static float dac_perc(int8_t n) { return 100.0 * mcp4728_getValue(dac_order[n]) * RECIPROCAL(DAC_STEPPER_MAX); } -static float dac_amps(int8_t n) { return mcp4728_getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE); } +void StepperDAC::set_current_percent(const uint8_t channel, float val) { + set_current_value(channel, _MIN(val, 100.0f) * (DAC_STEPPER_MAX) / 100.0f); +} -uint8_t dac_current_get_percent(const AxisEnum axis) { return mcp4728_getDrvPct(dac_order[axis]); } -void dac_current_set_percents(xyze_uint8_t &pct) { +static float dac_perc(int8_t n) { return 100.0 * mcp4728.getValue(dac_order[n]) * RECIPROCAL(DAC_STEPPER_MAX); } +static float dac_amps(int8_t n) { return mcp4728.getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE); } + +uint8_t StepperDAC::get_current_percent(const AxisEnum axis) { return mcp4728.getDrvPct(dac_order[axis]); } +void StepperDAC::set_current_percents(xyze_uint8_t &pct) { LOOP_XYZE(i) dac_channel_pct[i] = pct[dac_order[i]]; - mcp4728_setDrvPct(dac_channel_pct); + mcp4728.setDrvPct(dac_channel_pct); } -void dac_print_values() { +void StepperDAC::print_values() { if (!dac_present) return; SERIAL_ECHO_MSG("Stepper current values in % (Amps):"); SERIAL_ECHO_START(); @@ -94,9 +91,9 @@ void dac_print_values() { SERIAL_ECHOLNPAIR_P(SP_E_LBL, dac_perc(E_AXIS), PSTR(" ("), dac_amps(E_AXIS), PSTR(")")); } -void dac_commit_eeprom() { +void StepperDAC::commit_eeprom() { if (!dac_present) return; - mcp4728_eepromWrite(); + mcp4728.eepromWrite(); } -#endif // DAC_STEPPER_CURRENT +#endif // HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/feature/dac/stepper_dac.h b/Marlin/src/feature/dac/stepper_dac.h index 0543b6275e..6836335e98 100644 --- a/Marlin/src/feature/dac/stepper_dac.h +++ b/Marlin/src/feature/dac/stepper_dac.h @@ -27,10 +27,15 @@ #include "dac_mcp4728.h" -int dac_init(); -void dac_current_percent(uint8_t channel, float val); -void dac_current_raw(uint8_t channel, uint16_t val); -void dac_print_values(); -void dac_commit_eeprom(); -uint8_t dac_current_get_percent(AxisEnum axis); -void dac_current_set_percents(xyze_uint8_t &pct); +class StepperDAC { +public: + static int init(); + static void set_current_percent(const uint8_t channel, float val); + static void set_current_value(const uint8_t channel, uint16_t val); + static void print_values(); + static void commit_eeprom(); + static uint8_t get_current_percent(AxisEnum axis); + static void set_current_percents(xyze_uint8_t &pct); +}; + +extern StepperDAC stepper_dac; diff --git a/Marlin/src/feature/digipot/digipot.h b/Marlin/src/feature/digipot/digipot.h index d59f8b930a..c53f8093dd 100644 --- a/Marlin/src/feature/digipot/digipot.h +++ b/Marlin/src/feature/digipot/digipot.h @@ -21,5 +21,13 @@ */ #pragma once -void digipot_i2c_set_current(const uint8_t channel, const float current); -void digipot_i2c_init(); +// +// Header for MCP4018 and MCP4451 current control i2c devices +// +class DigipotI2C { +public: + static void init(); + static void set_current(const uint8_t channel, const float current); +}; + +DigipotI2C digipot_i2c; diff --git a/Marlin/src/feature/digipot/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp index 35c513a32c..6260185fc3 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4018.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp @@ -24,6 +24,8 @@ #if ENABLED(DIGIPOT_MCP4018) +#include "digipot.h" + #include #include // https://github.com/stawel/SlowSoftI2CMaster @@ -68,7 +70,7 @@ static SlowSoftI2CMaster pots[DIGIPOT_I2C_NUM_CHANNELS] = { #endif }; -static void i2c_send(const uint8_t channel, const byte v) { +static void digipot_i2c_send(const uint8_t channel, const byte v) { if (WITHIN(channel, 0, DIGIPOT_I2C_NUM_CHANNELS - 1)) { pots[channel].i2c_start(((DIGIPOT_I2C_ADDRESS_A) << 1) | I2C_WRITE); pots[channel].i2c_write(v); @@ -77,12 +79,12 @@ static void i2c_send(const uint8_t channel, const byte v) { } // This is for the MCP4018 I2C based digipot -void digipot_i2c_set_current(const uint8_t channel, const float current) { +void DigipotI2C::set_current(const uint8_t channel, const float current) { const float ival = _MIN(_MAX(current, 0), float(DIGIPOT_MCP4018_MAX_VALUE)); - i2c_send(channel, current_to_wiper(ival)); + digipot_i2c_send(channel, current_to_wiper(ival)); } -void digipot_i2c_init() { +void DigipotI2C::init() { LOOP_L_N(i, DIGIPOT_I2C_NUM_CHANNELS) pots[i].i2c_init(); // Init currents according to Configuration_adv.h @@ -94,7 +96,7 @@ void digipot_i2c_init() { #endif ; LOOP_L_N(i, COUNT(digipot_motor_current)) - digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i])); + set_current(i, pgm_read_float(&digipot_motor_current[i])); } #endif // DIGIPOT_MCP4018 diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index 0c8ff04a0b..7e6ace49a0 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -24,6 +24,8 @@ #if ENABLED(DIGIPOT_MCP4451) +#include "digipot.h" + #include #include @@ -61,7 +63,7 @@ static void digipot_i2c_send(const byte addr, const byte a, const byte b) { } // This is for the MCP4451 I2C based digipot -void digipot_i2c_set_current(const uint8_t channel, const float current) { +void DigipotI2C::set_current(const uint8_t channel, const float current) { // These addresses are specific to Azteeg X3 Pro, can be set to others. // In this case first digipot is at address A0=0, A1=0, second one is at A0=0, A1=1 const byte addr = channel < 4 ? DIGIPOT_I2C_ADDRESS_A : DIGIPOT_I2C_ADDRESS_B; // channel 0-3 vs 4-7 @@ -75,7 +77,7 @@ void digipot_i2c_set_current(const uint8_t channel, const float current) { digipot_i2c_send(addr, addresses[channel & 0x3], current_to_wiper(_MIN(float(_MAX(current, 0)), DIGIPOT_I2C_MAX_CURRENT))); } -void digipot_i2c_init() { +void DigipotI2C::init() { #if MB(MKS_SBASE) configure_i2c(16); // Set clock_option to 16 ensure I2C is initialized at 400kHz #else @@ -90,7 +92,7 @@ void digipot_i2c_init() { #endif ; LOOP_L_N(i, COUNT(digipot_motor_current)) - digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i])); + set_current(i, pgm_read_float(&digipot_motor_current[i])); } #endif // DIGIPOT_MCP4451 diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index 54599a0451..e463666207 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -22,19 +22,19 @@ #include "../../../inc/MarlinConfig.h" -#if ANY(HAS_DIGIPOTSS, HAS_MOTOR_CURRENT_PWM, HAS_I2C_DIGIPOT, DAC_STEPPER_CURRENT) +#if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) #include "../../gcode.h" -#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM +#if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM #include "../../../module/stepper.h" #endif -#if HAS_I2C_DIGIPOT +#if HAS_MOTOR_CURRENT_I2C #include "../../../feature/digipot/digipot.h" #endif -#if ENABLED(DAC_STEPPER_CURRENT) +#if ENABLED(HAS_MOTOR_CURRENT_DAC) #include "../../../feature/dac/stepper_dac.h" #endif @@ -42,61 +42,61 @@ * M907: Set digital trimpot motor current using axis codes X, Y, Z, E, B, S */ void GcodeSuite::M907() { - #if HAS_DIGIPOTSS + #if HAS_MOTOR_CURRENT_SPI - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.digipot_current(i, parser.value_int()); - if (parser.seenval('B')) stepper.digipot_current(4, parser.value_int()); - if (parser.seenval('S')) LOOP_LE_N(i, 4) stepper.digipot_current(i, parser.value_int()); + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.set_digipot_current(i, parser.value_int()); + if (parser.seenval('B')) stepper.set_digipot_current(4, parser.value_int()); + if (parser.seenval('S')) LOOP_LE_N(i, 4) stepper.set_digipot_current(i, parser.value_int()); #elif HAS_MOTOR_CURRENT_PWM #if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY) - if (parser.seenval('X') || parser.seenval('Y')) stepper.digipot_current(0, parser.value_int()); + if (parser.seenval('X') || parser.seenval('Y')) stepper.set_digipot_current(0, parser.value_int()); #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - if (parser.seenval('Z')) stepper.digipot_current(1, parser.value_int()); + if (parser.seenval('Z')) stepper.set_digipot_current(1, parser.value_int()); #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - if (parser.seenval('E')) stepper.digipot_current(2, parser.value_int()); + if (parser.seenval('E')) stepper.set_digipot_current(2, parser.value_int()); #endif #endif - #if HAS_I2C_DIGIPOT + #if HAS_MOTOR_CURRENT_I2C // this one uses actual amps in floating point - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) digipot_i2c_set_current(i, parser.value_float()); + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) digipot_i2c.set_current(i, parser.value_float()); // Additional extruders use B,C,D for channels 4,5,6. // TODO: Change these parameters because 'E' is used. B? for (uint8_t i = E_AXIS + 1; i < DIGIPOT_I2C_NUM_CHANNELS; i++) - if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c_set_current(i, parser.value_float()); + if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c.set_current(i, parser.value_float()); #endif - #if ENABLED(DAC_STEPPER_CURRENT) + #if ENABLED(HAS_MOTOR_CURRENT_DAC) if (parser.seenval('S')) { const float dac_percent = parser.value_float(); - LOOP_LE_N(i, 4) dac_current_percent(i, dac_percent); + LOOP_LE_N(i, 4) stepper_dac.set_current_percent(i, dac_percent); } - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) dac_current_percent(i, parser.value_float()); + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper_dac.set_current_percent(i, parser.value_float()); #endif } -#if EITHER(HAS_DIGIPOTSS, DAC_STEPPER_CURRENT) +#if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) /** * M908: Control digital trimpot directly (M908 P S) */ void GcodeSuite::M908() { - TERN_(HAS_DIGIPOTSS, stepper.digitalPotWrite(parser.intval('P'), parser.intval('S'))); - TERN_(DAC_STEPPER_CURRENT, dac_current_raw(parser.byteval('P', -1), parser.ushortval('S', 0))); + TERN_(HAS_MOTOR_CURRENT_SPI, stepper.set_digipot_value_spi(parser.intval('P'), parser.intval('S'))); + TERN_(HAS_MOTOR_CURRENT_DAC, stepper_dac.set_current_value(parser.byteval('P', -1), parser.ushortval('S', 0))); } -#endif // HAS_DIGIPOTSS || DAC_STEPPER_CURRENT + #if ENABLED(HAS_MOTOR_CURRENT_DAC) -#if ENABLED(DAC_STEPPER_CURRENT) + void GcodeSuite::M909() { stepper_dac.print_values(); } + void GcodeSuite::M910() { stepper_dac.commit_eeprom(); } - void GcodeSuite::M909() { dac_print_values(); } - void GcodeSuite::M910() { dac_commit_eeprom(); } + #endif // HAS_MOTOR_CURRENT_DAC -#endif // DAC_STEPPER_CURRENT +#endif // HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_DAC -#endif // HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM || HAS_I2C_DIGIPOT || DAC_STEPPER_CURRENT +#endif // HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM || HAS_MOTOR_CURRENT_I2C || HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index cbf62e0fcf..1d4e8f9d4d 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -823,11 +823,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 900: M900(); break; // M900: Set advance K factor. #endif - #if ANY(HAS_DIGIPOTSS, HAS_MOTOR_CURRENT_PWM, HAS_I2C_DIGIPOT, DAC_STEPPER_CURRENT) + #if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) case 907: M907(); break; // M907: Set digital trimpot motor current using axis codes. - #if EITHER(HAS_DIGIPOTSS, DAC_STEPPER_CURRENT) + #if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) case 908: M908(); break; // M908: Control digital trimpot directly. - #if ENABLED(DAC_STEPPER_CURRENT) + #if ENABLED(HAS_MOTOR_CURRENT_DAC) case 909: M909(); break; // M909: Print digipot/DAC current value case 910: M910(); break; // M910: Commit digipot/DAC value to external EEPROM #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 73a3727813..683642bec6 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -258,9 +258,9 @@ * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) - * M908 - Control digital trimpot directly. (Requires DAC_STEPPER_CURRENT or DIGIPOTSS_PIN) - * M909 - Print digipot/DAC current value. (Requires DAC_STEPPER_CURRENT) - * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires DAC_STEPPER_CURRENT) + * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN) + * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC) + * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires HAS_MOTOR_CURRENT_DAC) * M911 - Report stepper driver overtemperature pre-warn condition. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) @@ -847,11 +847,11 @@ private: static void M918(); #endif - #if ANY(HAS_DIGIPOTSS, HAS_MOTOR_CURRENT_PWM, HAS_I2C_DIGIPOT, DAC_STEPPER_CURRENT) + #if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) static void M907(); - #if EITHER(HAS_DIGIPOTSS, DAC_STEPPER_CURRENT) + #if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) static void M908(); - #if ENABLED(DAC_STEPPER_CURRENT) + #if ENABLED(HAS_MOTOR_CURRENT_DAC) static void M909(); static void M910(); #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 0952148d19..255470bca6 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -175,7 +175,7 @@ #endif #if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) - #define HAS_I2C_DIGIPOT 1 + #define HAS_MOTOR_CURRENT_I2C 1 #endif // Multiple Z steppers diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index f832137f5b..798bf009c6 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1976,7 +1976,7 @@ #define HAS_STEPPER_RESET 1 #endif #if PIN_EXISTS(DIGIPOTSS) - #define HAS_DIGIPOTSS 1 + #define HAS_MOTOR_CURRENT_SPI 1 #endif #if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_E) #define HAS_MOTOR_CURRENT_PWM 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c4dcfd54ae..6e97a349f6 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2667,7 +2667,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Digipot requirement */ -#if HAS_I2C_DIGIPOT +#if HAS_MOTOR_CURRENT_I2C #if BOTH(DIGIPOT_MCP4018, DIGIPOT_MCP4451) #error "Enable only one of DIGIPOT_MCP4018 or DIGIPOT_MCP4451." #elif !MB(MKS_SBASE) \ diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 68a10245e9..642d9d84d9 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -58,16 +58,16 @@ void menu_tmc(); void menu_backlash(); -#if ENABLED(DAC_STEPPER_CURRENT) +#if ENABLED(HAS_MOTOR_CURRENT_DAC) #include "../../feature/dac/stepper_dac.h" void menu_dac() { static xyze_uint8_t driverPercent; - LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i); + LOOP_XYZE(i) driverPercent[i] = stepper_dac.get_current_percent((AxisEnum)i); START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); - #define EDIT_DAC_PERCENT(A) EDIT_ITEM(uint8, MSG_DAC_PERCENT_##A, &driverPercent[_AXIS(A)], 0, 100, []{ dac_current_set_percents(driverPercent); }) + #define EDIT_DAC_PERCENT(A) EDIT_ITEM(uint8, MSG_DAC_PERCENT_##A, &driverPercent[_AXIS(A)], 0, 100, []{ stepper_dac.set_current_percents(driverPercent); }) EDIT_DAC_PERCENT(X); EDIT_DAC_PERCENT(Y); EDIT_DAC_PERCENT(Z); @@ -568,7 +568,7 @@ void menu_advanced_settings() { SUBMENU(MSG_BACKLASH, menu_backlash); #endif - #if ENABLED(DAC_STEPPER_CURRENT) + #if ENABLED(HAS_MOTOR_CURRENT_DAC) SUBMENU(MSG_DRIVE_STRENGTH, menu_dac); #endif #if HAS_MOTOR_CURRENT_PWM diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 3ccd8ffd91..33e5c351ab 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -36,7 +36,7 @@ */ // Change EEPROM version if the structure changes -#define EEPROM_VERSION "V81" +#define EEPROM_VERSION "V82" #define EEPROM_OFFSET 100 // Check the integrity of data offsets. @@ -365,7 +365,10 @@ typedef struct SettingsDataStruct { // // HAS_MOTOR_CURRENT_PWM // - uint32_t motor_current_setting[3]; // M907 X Z E + #ifndef MOTOR_CURRENT_COUNT + #define MOTOR_CURRENT_COUNT 3 + #endif + uint32_t motor_current_setting[MOTOR_CURRENT_COUNT]; // M907 X Z E // // CNC_COORDINATE_SYSTEMS @@ -1277,10 +1280,10 @@ void MarlinSettings::postprocess() { { _FIELD_TEST(motor_current_setting); - #if HAS_MOTOR_CURRENT_PWM + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM EEPROM_WRITE(stepper.motor_current_setting); #else - const uint32_t no_current[3] = { 0 }; + const uint32_t no_current[MOTOR_CURRENT_COUNT] = { 0 }; EEPROM_WRITE(no_current); #endif } @@ -2110,10 +2113,16 @@ void MarlinSettings::postprocess() { // Motor Current PWM // { - uint32_t motor_current_setting[3]; _FIELD_TEST(motor_current_setting); + uint32_t motor_current_setting[MOTOR_CURRENT_COUNT] + #if HAS_MOTOR_CURRENT_SPI + = DIGIPOT_MOTOR_CURRENT + #endif + ; + DEBUG_ECHOLNPGM("DIGIPOTS Loading"); EEPROM_READ(motor_current_setting); - #if HAS_MOTOR_CURRENT_PWM + DEBUG_ECHOLNPGM("DIGIPOTS Loaded"); + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM if (!validating) COPY(stepper.motor_current_setting, motor_current_setting); #endif @@ -2791,9 +2800,20 @@ void MarlinSettings::reset() { // #if HAS_MOTOR_CURRENT_PWM - constexpr uint32_t tmp_motor_current_setting[3] = PWM_MOTOR_CURRENT; - LOOP_L_N(q, 3) - stepper.digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); + constexpr uint32_t tmp_motor_current_setting[MOTOR_CURRENT_COUNT] = PWM_MOTOR_CURRENT; + LOOP_L_N(q, MOTOR_CURRENT_COUNT) + stepper.set_digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); + #endif + + // + // DIGIPOTS + // + #if HAS_MOTOR_CURRENT_SPI + static constexpr uint32_t tmp_motor_current_setting[] = DIGIPOT_MOTOR_CURRENT; + DEBUG_ECHOLNPGM("Writing Digipot"); + LOOP_L_N(q, COUNT(tmp_motor_current_setting)) + stepper.set_digipot_current(q, tmp_motor_current_setting[q]); + DEBUG_ECHOLNPGM("Digipot Written"); #endif // @@ -3695,14 +3715,23 @@ void MarlinSettings::reset() { #endif #endif - #if HAS_MOTOR_CURRENT_PWM + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM CONFIG_ECHO_HEADING("Stepper motor currents:"); CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M907 X"), stepper.motor_current_setting[0] - , SP_Z_STR, stepper.motor_current_setting[1] - , SP_E_STR, stepper.motor_current_setting[2] - ); + #if HAS_MOTOR_CURRENT_PWM + SERIAL_ECHOLNPAIR_P( + PSTR(" M907 X"), stepper.motor_current_setting[0] + , SP_Z_STR, stepper.motor_current_setting[1] + , SP_E_STR, stepper.motor_current_setting[2] + ); + #elif HAS_MOTOR_CURRENT_SPI + SERIAL_ECHOPGM(" M907"); + LOOP_L_N(q, MOTOR_CURRENT_COUNT) { + SERIAL_CHAR(' '); + SERIAL_CHAR(axis_codes[q]); + SERIAL_ECHO(stepper.motor_current_setting[q]); + } + #endif #endif /** diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 56a75d1b48..8a5de4b608 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -83,10 +83,6 @@ Stepper stepper; // Singleton #define BABYSTEPPING_EXTRA_DIR_WAIT -#if HAS_MOTOR_CURRENT_PWM - bool Stepper::initialized; // = false -#endif - #ifdef __AVR__ #include "speed_lookuptable.h" #endif @@ -110,7 +106,7 @@ Stepper stepper; // Singleton #include "../feature/dac/dac_dac084s085.h" #endif -#if HAS_DIGIPOTSS +#if HAS_MOTOR_CURRENT_SPI #include #endif @@ -142,8 +138,12 @@ Stepper stepper; // Singleton bool Stepper::separate_multi_axis = false; #endif -#if HAS_MOTOR_CURRENT_PWM - uint32_t Stepper::motor_current_setting[3]; // Initialized by settings.load() +#if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + bool Stepper::initialized; // = false + uint32_t Stepper::motor_current_setting[MOTOR_CURRENT_COUNT]; // Initialized by settings.load() + #if HAS_MOTOR_CURRENT_SPI + constexpr uint32_t Stepper::digipot_count[]; + #endif #endif // private: @@ -2590,8 +2590,8 @@ void Stepper::init() { set_directions(); - #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM - TERN_(HAS_MOTOR_CURRENT_PWM, initialized = true); + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + initialized = true; digipot_init(); #endif } @@ -2930,10 +2930,10 @@ void Stepper::report_positions() { * Software-controlled Stepper Motor Current */ -#if HAS_DIGIPOTSS +#if HAS_MOTOR_CURRENT_SPI // From Arduino DigitalPotControl example - void Stepper::digitalPotWrite(const int16_t address, const int16_t value) { + void Stepper::set_digipot_value_spi(const int16_t address, const int16_t value) { WRITE(DIGIPOTSS_PIN, LOW); // Take the SS pin low to select the chip SPI.transfer(address); // Send the address and value via SPI SPI.transfer(value); @@ -2941,7 +2941,7 @@ void Stepper::report_positions() { //delay(10); } -#endif // HAS_DIGIPOTSS +#endif // HAS_MOTOR_CURRENT_SPI #if HAS_MOTOR_CURRENT_PWM @@ -2958,7 +2958,7 @@ void Stepper::report_positions() { #if ANY_PIN(MOTOR_CURRENT_PWM_E, MOTOR_CURRENT_PWM_E0, MOTOR_CURRENT_PWM_E1) case 2: #endif - digipot_current(i, motor_current_setting[i]); + set_digipot_current(i, motor_current_setting[i]); default: break; } } @@ -2968,22 +2968,23 @@ void Stepper::report_positions() { #if !MB(PRINTRBOARD_G2) - #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM - void Stepper::digipot_current(const uint8_t driver, const int16_t current) { + void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { + if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1)) + motor_current_setting[driver] = current; // update motor_current_setting - #if HAS_DIGIPOTSS + if (!initialized) return; + + #if HAS_MOTOR_CURRENT_SPI + + //SERIAL_ECHOLNPAIR("Digipotss current ", current); const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; - digitalPotWrite(digipot_ch[driver], current); + set_digipot_value_spi(digipot_ch[driver], current); #elif HAS_MOTOR_CURRENT_PWM - if (!initialized) return; - - if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1)) - motor_current_setting[driver] = current; // update motor_current_setting - #define _WRITE_CURRENT_PWM(P) analogWrite(pin_t(MOTOR_CURRENT_PWM_## P ##_PIN), 255L * current / (MOTOR_CURRENT_PWM_RANGE)) switch (driver) { case 0: @@ -3019,17 +3020,13 @@ void Stepper::report_positions() { void Stepper::digipot_init() { - #if HAS_DIGIPOTSS - - static const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; + #if HAS_MOTOR_CURRENT_SPI SPI.begin(); SET_OUTPUT(DIGIPOTSS_PIN); - LOOP_L_N(i, COUNT(digipot_motor_current)) { - //digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); - digipot_current(i, digipot_motor_current[i]); - } + LOOP_L_N(i, COUNT(motor_current_setting)) + set_digipot_current(i, motor_current_setting[i]); #elif HAS_MOTOR_CURRENT_PWM diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index da38192d8e..572c3f3f9b 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -245,12 +245,18 @@ class Stepper { static bool separate_multi_axis; #endif - #if HAS_MOTOR_CURRENT_PWM - #ifndef PWM_MOTOR_CURRENT - #define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + #if HAS_MOTOR_CURRENT_PWM + #ifndef PWM_MOTOR_CURRENT + #define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT + #endif + #define MOTOR_CURRENT_COUNT 3 + #elif HAS_MOTOR_CURRENT_SPI + static constexpr uint32_t digipot_count[] = DIGIPOT_MOTOR_CURRENT; + #define MOTOR_CURRENT_COUNT COUNT(Stepper::digipot_count) #endif - static uint32_t motor_current_setting[3]; static bool initialized; + static uint32_t motor_current_setting[MOTOR_CURRENT_COUNT]; // Initialized by settings.load() #endif // Last-moved extruder, as set when the last movement was fetched from planner @@ -457,9 +463,9 @@ class Stepper { // Triggered position of an axis in steps static int32_t triggered_position(const AxisEnum axis); - #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM - static void digitalPotWrite(const int16_t address, const int16_t value); - static void digipot_current(const uint8_t driver, const int16_t current); + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + static void set_digipot_value_spi(const int16_t address, const int16_t value); + static void set_digipot_current(const uint8_t driver, const int16_t current); #endif #if HAS_MICROSTEPS @@ -582,7 +588,7 @@ class Stepper { static int32_t _eval_bezier_curve(const uint32_t curr_step); #endif - #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM static void digipot_init(); #endif diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h index 406cbec816..1428de31a2 100644 --- a/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h +++ b/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h @@ -34,7 +34,7 @@ // // I2C based DAC like on the Printrboard REVF -#define DAC_STEPPER_CURRENT +#define HAS_MOTOR_CURRENT_DAC // Channels available for DAC, For Rigidboard there are 4 #define DAC_STEPPER_ORDER { 0, 1, 2, 3 } diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index 6ffd35dff2..4809cc8d86 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -143,7 +143,7 @@ #endif // NO_EXTRUDRBOARD // Enable control of stepper motor currents with the I2C based MCP4728 DAC used on Printrboard REVF -#define DAC_STEPPER_CURRENT +#define HAS_MOTOR_CURRENT_DAC // Set default drive strength percents if not already defined - X, Y, Z, E axis #ifndef DAC_MOTOR_CURRENT_DEFAULT diff --git a/platformio.ini b/platformio.ini index d4beca6519..9d3fafd69e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -211,7 +211,7 @@ HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 src_filter=+ + + + + HAS_STEALTHCHOP = src_filter=+ SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -HAS_I2C_DIGIPOT = SlowSoftI2CMaster +HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster src_filter=+ HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip src_filter=+ @@ -277,7 +277,7 @@ CANCEL_OBJECTS = src_filter=+ + + EXTERNAL_CLOSED_LOOP_CONTROLLER = src_filter=+ + USE_CONTROLLER_FAN = src_filter=+ -DAC_STEPPER_CURRENT = src_filter=+ +HAS_MOTOR_CURRENT_DAC = src_filter=+ DIRECT_STEPPING = src_filter=+ + EMERGENCY_PARSER = src_filter=+ - I2C_POSITION_ENCODERS = src_filter=+ From 2c7b5fe1f29c4ded109cdece6e6290b61d429df4 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 11 Oct 2020 16:13:01 -0700 Subject: [PATCH 0375/1370] Fix at90usb1286 build (#19687) * Skip check for USBCON during dependency detection * Ignore incompatible Teensy_ADC library, which requires Teensy >= 3 * Add IS_AT90USB Co-authored-by: Scott Lahteine --- Marlin/src/HAL/AVR/HAL.h | 4 ++-- Marlin/src/HAL/AVR/MarlinSerial.cpp | 6 +++--- Marlin/src/HAL/AVR/MarlinSerial.h | 2 +- Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp | 3 +-- Marlin/src/gcode/control/M111.cpp | 4 ++-- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/inc/Conditionals_adv.h | 8 ++++---- Marlin/src/inc/SanityCheck.h | 6 +++--- Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 2 +- platformio.ini | 1 + 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index ce15ed29fb..6e0afa8f10 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -25,7 +25,7 @@ #include "watchdog.h" #include "math.h" -#ifdef USBCON +#ifdef IS_AT90USB #include #else #define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion @@ -81,7 +81,7 @@ typedef int8_t pin_t; //extern uint8_t MCUSR; // Serial ports -#ifdef USBCON +#ifdef IS_AT90USB #define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial) #else #if !WITHIN(SERIAL_PORT, -1, 3) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 63599efd41..8feac32aa7 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -38,7 +38,7 @@ #include "../../inc/MarlinConfig.h" -#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) +#if !IS_AT90USB && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) #include "MarlinSerial.h" #include "../../MarlinCore.h" @@ -792,10 +792,10 @@ MarlinSerial> customizedSerial1; #endif -#endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) +#endif // !IS_AT90USB && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) // For AT90USB targets use the UART for BT interfacing -#if defined(USBCON) && ENABLED(BLUETOOTH) +#if BOTH(IS_AT90USB, BLUETOOTH) HardwareSerial bluetoothSerial; #endif diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 8a0423d143..3850e2a47e 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -327,6 +327,6 @@ #endif // Use the UART for Bluetooth in AT90USB configurations -#if defined(USBCON) && ENABLED(BLUETOOTH) +#if BOTH(IS_AT90USB, BLUETOOTH) extern HardwareSerial bluetoothSerial; #endif diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp index f88fa88507..60596054e8 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp @@ -22,7 +22,6 @@ #if BOTH(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) -#include "../HAL.h" #include #undef SPI_SPEED @@ -161,5 +160,5 @@ uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, return 1; } -#endif // HAS_MARLINUI_U8GLIB +#endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI #endif // STM32F1 diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp index e31c3e2fb7..cc871bf38b 100644 --- a/Marlin/src/gcode/control/M111.cpp +++ b/Marlin/src/gcode/control/M111.cpp @@ -55,7 +55,7 @@ void GcodeSuite::M111() { } else { SERIAL_ECHOPGM(STR_DEBUG_OFF); - #if !defined(__AVR__) || !defined(USBCON) + #if !IS_AT90USB #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) SERIAL_ECHOPAIR("\nBuffer Overruns: ", MYSERIAL0.buffer_overruns()); #endif @@ -71,7 +71,7 @@ void GcodeSuite::M111() { #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) SERIAL_ECHOPAIR("\nMax RX Queue Size: ", MYSERIAL0.rxMaxEnqueued()); #endif - #endif // !defined(__AVR__) || !defined(USBCON) + #endif // !IS_AT90USB } SERIAL_EOL(); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index b9169d90e1..a02d2c0160 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -624,7 +624,7 @@ void GCodeQueue::advance() { card.closefile(); SERIAL_ECHOLNPGM(STR_FILE_SAVED); - #if !defined(__AVR__) || !defined(USBCON) + #if !IS_AT90USB #if ENABLED(SERIAL_STATS_DROPPED_RX) SERIAL_ECHOLNPAIR("Dropped bytes: ", MYSERIAL0.dropped()); #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 255470bca6..bab05e5ff6 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -208,7 +208,10 @@ #define NEEDS_HARDWARE_PWM 1 #endif -#if !defined(__AVR__) || !defined(USBCON) +#if defined(__AVR__) && defined(USBCON) + #define IS_AT90USB 1 + #undef SERIAL_XON_XOFF // Not supported on USB-native devices +#else // Define constants and variables for buffering serial data. // Use only 0 or powers of 2 greater than 1 // : [0, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...] @@ -220,9 +223,6 @@ #ifndef TX_BUFFER_SIZE #define TX_BUFFER_SIZE 32 #endif -#else - // SERIAL_XON_XOFF not supported on USB-native devices - #undef SERIAL_XON_XOFF #endif #if ENABLED(HOST_ACTION_COMMANDS) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6e97a349f6..25188906c7 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -582,7 +582,7 @@ /** * Serial */ -#if !(defined(__AVR__) && defined(USBCON)) +#if !IS_AT90USB #if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." #elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE)) @@ -2104,9 +2104,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif /** - * emergency-command parser + * Emergency Command Parser */ -#if ENABLED(EMERGENCY_PARSER) && defined(__AVR__) && defined(USBCON) +#if BOTH(IS_AT90USB, EMERGENCY_PARSER) #error "EMERGENCY_PARSER does not work on boards with AT90USB processors (USBCON)." #endif diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index 4809cc8d86..d4f9fc7641 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -67,7 +67,7 @@ #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif -#ifndef USBCON +#if !defined(__MARLIN_DEPS__) && !defined(USBCON) #error "USBCON should be defined by the platform for this board." #endif diff --git a/platformio.ini b/platformio.ini index 9d3fafd69e..d2c7cfafbe 100644 --- a/platformio.ini +++ b/platformio.ini @@ -557,6 +557,7 @@ build_unflags = -g -ggdb platform = teensy extends = common_avr8 board = at90usb1286 +lib_ignore = ${env:common_avr8.lib_ignore} Teensy_ADC # # AT90USB1286 boards using DFU bootloader From 8b4f82cd078e267843b1ac80a3293f6d63adb19d Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 11 Oct 2020 17:06:57 -0700 Subject: [PATCH 0376/1370] Fix various errors, warnings in example config builds (#19686) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/bedlevel/G26.cpp | 8 +- Marlin/src/gcode/motion/M290.cpp | 2 +- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 2 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 18 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 52 ++--- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 186 ++++++++---------- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 3 +- Marlin/src/module/thermistor/thermistor_666.h | 3 +- Marlin/src/pins/sensitive_pins.h | 29 ++- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 1 + 11 files changed, 141 insertions(+), 165 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index c66d4a7d49..661128b04e 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -511,11 +511,9 @@ void GcodeSuite::G26() { g26_keep_heaters_on = parser.boolval('K'); // Accept 'I' if temperature presets are defined - const uint8_t preset_index = (0 - #if PREHEAT_COUNT - + (parser.seenval('I') ? _MIN(parser.value_byte(), PREHEAT_COUNT - 1) + 1 : 0) - #endif - ); + #if PREHEAT_COUNT + const uint8_t preset_index = parser.seenval('I') ? _MIN(parser.value_byte(), PREHEAT_COUNT - 1) + 1 : 0; + #endif #if HAS_HEATED_BED diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index 7158525ed9..18cc161fce 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -127,7 +127,7 @@ void GcodeSuite::M290() { #else PSTR("Babystep Z") #endif - , babystep.axis_total[BS_AXIS_IND(Z_AXIS)] + , babystep.axis_total[BS_TOTAL_IND(Z_AXIS)] ); } #endif diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 70802f905e..c6ad566cff 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -1341,7 +1341,7 @@ #undef STATUS_LOGO_WIDTH #endif - #if (HAS_MULTI_HOTEND && STATUS_LOGO_WIDTH && BED_OR_CHAMBER_OR_FAN) || (HOTENDS >= 3 && !BED_OR_CHAMBER_OR_FAN) + #if !defined(STATUS_HEATERS_X) && ((HAS_MULTI_HOTEND && STATUS_LOGO_WIDTH && BED_OR_CHAMBER_OR_FAN) || (HOTENDS >= 3 && !BED_OR_CHAMBER_OR_FAN)) #define _STATUS_HEATERS_X(H,S,N) ((LCD_PIXEL_WIDTH - (H * (S + N)) - (_EXTRA_WIDTH) + (STATUS_LOGO_WIDTH)) / 2) #if STATUS_HOTEND1_WIDTH #if HOTENDS > 2 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index a81b5b851b..c6369db413 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -46,7 +46,8 @@ extern lv_group_t * g; static lv_obj_t * scr; -static lv_obj_t *labelExt1, * labelExt2, * labelFan, * labelZpos, * labelTime; +static lv_obj_t *labelExt1, * labelFan, * labelZpos, * labelTime; +TERN_(HAS_MULTI_EXTRUDER, static lv_obj_t *labelExt2;) static lv_obj_t *labelPause, * labelStop, * labelOperat; static lv_obj_t * bar1, *bar1ValueText; static lv_obj_t * buttonPause, *buttonOperat, *buttonStop; @@ -137,9 +138,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } void lv_draw_printing(void) { - lv_obj_t *buttonExt1, *buttonExt2, *buttonFanstate, *buttonZpos, *buttonTime; - TERN_(HAS_HEATED_BED, lv_obj_t * buttonBedstate); - disp_state_stack._disp_index = 0; ZERO(disp_state_stack._disp_state); disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINTING_UI; @@ -162,16 +160,16 @@ void lv_draw_printing(void) { lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonExt1 = lv_img_create(scr, NULL); + lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); #if HAS_MULTI_EXTRUDER - buttonExt2 = lv_img_create(scr, NULL); + lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); #endif #if HAS_HEATED_BED - buttonBedstate = lv_img_create(scr, NULL); + lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); #endif - buttonFanstate = lv_img_create(scr, NULL); - buttonTime = lv_img_create(scr, NULL); - buttonZpos = lv_img_create(scr, NULL); + lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); + lv_obj_t *buttonTime = lv_img_create(scr, NULL); + lv_obj_t *buttonZpos = lv_img_create(scr, NULL); buttonPause = lv_imgbtn_create(scr, NULL); buttonStop = lv_imgbtn_create(scr, NULL); buttonOperat = lv_imgbtn_create(scr, NULL); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 49b44799a6..3f8110feb4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -799,39 +799,39 @@ void lv_encoder_pin_init() { //static const int8_t encoderDirection = 1; //static int16_t enc_Direction; void lv_update_encoder() { - static uint8_t buttons; static uint32_t encoder_time1; uint32_t tmpTime, diffTime = 0; tmpTime = millis(); diffTime = getTickDiff(tmpTime, encoder_time1); if (diffTime > 50) { - #if ANY_BUTTON(EN1, EN2, ENC, BACK) - - uint8_t newbutton = 0; - - #if BUTTON_EXISTS(EN1) - if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; - #endif - #if BUTTON_EXISTS(EN2) - if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; - #endif - #if BUTTON_EXISTS(ENC) - if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; - #endif - #if BUTTON_EXISTS(BACK) - if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; - #endif - - #else - - constexpr uint8_t newbutton = 0; - - #endif - - buttons = newbutton; - #if HAS_ENCODER_WHEEL + + #if ANY_BUTTON(EN1, EN2, ENC, BACK) + + uint8_t newbutton = 0; + + #if BUTTON_EXISTS(EN1) + if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; + #endif + #if BUTTON_EXISTS(EN2) + if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; + #endif + #if BUTTON_EXISTS(ENC) + if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; + #endif + #if BUTTON_EXISTS(BACK) + if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; + #endif + + #else + + constexpr uint8_t newbutton = 0; + + #endif + + + static uint8_t buttons = newbutton; static uint8_t lastEncoderBits; #define encrot0 0 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 77bcb767b7..087a3b2110 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -110,24 +110,17 @@ const char *resultMessages[] = { // 230400b always manages to connect. static const uint32_t uploadBaudRates[] = { 460800, 230400, 115200, 74880 }; - - signed char IsReady() { return esp_upload.state == upload_idle; } - - - - void uploadPort_write(const uint8_t *buf, size_t len) { #if 0 int i; - for(i = 0; i < len; i++) { - while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); - - USART_SendData(USART1, *(buf + i)); + for (i = 0; i < len; i++) { + while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { /* nada */ } + USART_SendData(USART1, *(buf + i)); } #endif } @@ -138,28 +131,22 @@ char uploadPort_read() { return retChar; else return 0; - } int uploadPort_available() { return usartFifoAvailable(&WifiRxFifo); } - void uploadPort_begin() { esp_port_begin(1); } void uploadPort_close() { - //WIFI_COM.end(); //WIFI_COM.begin(115200, true); - esp_port_begin(0); - } - void flushInput() { while (uploadPort_available() != 0) { (void)uploadPort_read(); @@ -304,7 +291,6 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t *bodyLen = 0; - while (state != done) { uint8_t c; EspUploadResult stat; @@ -322,73 +308,73 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t } // sufficient bytes have been received for the current state, process them - switch(state) { - case begin: // expecting frame start - c = uploadPort_read(); - if (c != (uint8_t)0xC0) { - break; - } - state = header; - needBytes = 2; - - break; - case end: // expecting frame end - c = uploadPort_read(); - if (c != (uint8_t)0xC0) { - return slipFrame; - } - state = done; - - break; - - case header: // reading an 8-byte header - case body: // reading the response body - { - int rslt; - // retrieve a byte with SLIP decoding - rslt = ReadByte(&c, 1); - if (rslt != 1 && rslt != 2) { - // some error occurred - stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; - return stat; + switch (state) { + case begin: // expecting frame start + c = uploadPort_read(); + if (c != (uint8_t)0xC0) { + break; } - else if (state == header) { - //store the header byte - hdr[hdrIdx++] = c; - if (hdrIdx >= headerLength) { - // get the body length, prepare a buffer for it - *bodyLen = (uint16_t)getData(2, hdr, 2); + state = header; + needBytes = 2; - // extract the value, if requested - if (valp != 0) { - *valp = getData(4, hdr, 4); - } + break; + case end: // expecting frame end + c = uploadPort_read(); + if (c != (uint8_t)0xC0) { + return slipFrame; + } + state = done; - if (*bodyLen != 0) { - state = body; + break; + + case header: // reading an 8-byte header + case body: // reading the response body + { + int rslt; + // retrieve a byte with SLIP decoding + rslt = ReadByte(&c, 1); + if (rslt != 1 && rslt != 2) { + // some error occurred + stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; + return stat; + } + else if (state == header) { + //store the header byte + hdr[hdrIdx++] = c; + if (hdrIdx >= headerLength) { + // get the body length, prepare a buffer for it + *bodyLen = (uint16_t)getData(2, hdr, 2); + + // extract the value, if requested + if (valp != 0) { + *valp = getData(4, hdr, 4); + } + + if (*bodyLen != 0) { + state = body; + } + else { + needBytes = 1; + state = end; + } } - else { + } + else { + // Store the response body byte, check for completion + if (bodyIdx < ARRAY_SIZE(respBuf)) { + respBuf[bodyIdx] = c; + } + ++bodyIdx; + if (bodyIdx >= *bodyLen) { needBytes = 1; state = end; } } } - else { - // Store the response body byte, check for completion - if (bodyIdx < ARRAY_SIZE(respBuf)) { - respBuf[bodyIdx] = c; - } - ++bodyIdx; - if (bodyIdx >= *bodyLen) { - needBytes = 1; - state = end; - } - } - } - break; + break; - default: // this shouldn't happen - return slipState; + default: // this shouldn't happen + return slipState; } } @@ -397,7 +383,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t opRet = (uint8_t)getData(1, hdr, 1); // Sync packets often provoke a response with a zero opcode instead of ESP_SYNC if (resp != 0x01 || opRet != op) { -//debug//printf("resp %02x %02x\n", resp, opRet); + //printf("resp %02x %02x\n", resp, opRet); //debug return respHeader; } @@ -432,20 +418,19 @@ void _writePacket(const uint8_t *data, size_t len) { // 0xC0 and 0xDB replaced by the two-byte sequences {0xDB, 0xDC} and {0xDB, 0xDD} respectively. void writePacket(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { - - WriteByteRaw(0xC0); // send the packet start character + WriteByteRaw(0xC0); // send the packet start character _writePacket(hdr, hdrLen); // send the header - _writePacket(data, dataLen); // send the data block - WriteByteRaw(0xC0); // send the packet end character + _writePacket(data, dataLen); // send the data block + WriteByteRaw(0xC0); // send the packet end character } // Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. // This is like writePacket except that it does a fast block write for both the header and the main data with no SLIP encoding. Used to send sync commands. void writePacketRaw(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { - WriteByteRaw(0xC0); // send the packet start character - _writePacketRaw(hdr, hdrLen); // send the header + WriteByteRaw(0xC0); // send the packet start character + _writePacketRaw(hdr, hdrLen); // send the header _writePacketRaw(data, dataLen); // send the data block in raw mode - WriteByteRaw(0xC0); // send the packet end character + WriteByteRaw(0xC0); // send the packet end character } // Send a command to the attached device together with the supplied data, if any. @@ -460,12 +445,10 @@ void sendCommand(uint8_t op, uint32_t checkVal, const uint8_t *data, size_t data // send the packet //flushInput(); - if (op == ESP_SYNC) { + if (op == ESP_SYNC) writePacketRaw(hdr, sizeof(hdr), data, dataLen); - } - else { + else writePacket(hdr, sizeof(hdr), data, dataLen); - } } // Send a command to the attached device together with the supplied data, if any, and get the response @@ -476,9 +459,8 @@ EspUploadResult doCommand(uint8_t op, const uint8_t *data, size_t dataLen, uint3 sendCommand(op, checkVal, data, dataLen); stat = readPacket(op, valp, &bodyLen, msTimeout); - if (stat == success && bodyLen != 2) { + if (stat == success && bodyLen != 2) stat = badReply; - } return stat; } @@ -611,6 +593,8 @@ EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { //printf("Upload %d\%\n", ftell(&esp_upload.uploadFile) * 100 / esp_upload.fileSize); return stat; + #else + return success; #endif } @@ -625,15 +609,14 @@ void upload_spin() { esp_upload.uploadResult = connected; esp_upload.state = done; } - else{ + else { // Reset the serial port at the new baud rate. Also reset the ESP8266. - // const uint32_t baud = uploadBaudRates[esp_upload.connectAttemptNumber/esp_upload.retriesPerBaudRate]; + // const uint32_t baud = uploadBaudRates[esp_upload.connectAttemptNumber/esp_upload.retriesPerBaudRate]; if (esp_upload.connectAttemptNumber % esp_upload.retriesPerBaudRate == 0) { } - // uploadPort.begin(baud); - // uploadPort_close(); - + //uploadPort.begin(baud); + //uploadPort_close(); uploadPort_begin(); @@ -654,7 +637,7 @@ void upload_spin() { esp_upload.lastAttemptTime = getWifiTick(); if (res == success) { // Successful connection -// //MessageF(" success on attempt %d\n", (connectAttemptNumber % retriesPerBaudRate) + 1); + //MessageF(" success on attempt %d\n", (connectAttemptNumber % retriesPerBaudRate) + 1); //printf("connect success\n"); esp_upload.state = erasing; } @@ -675,14 +658,13 @@ void upload_spin() { const uint32_t sectorSize = 4096; const uint32_t numSectors = (esp_upload.fileSize + sectorSize - 1)/sectorSize; const uint32_t startSector = esp_upload.uploadAddress/sectorSize; - uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); - if (numSectors < headSectors) { - headSectors = numSectors; - } - eraseSize = (numSectors < 2 * headSectors) - ? (numSectors + 1) / 2 * sectorSize - : (numSectors - headSectors) * sectorSize; + uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); + NOMORE(headSectors, numSectors); + + eraseSize = (numSectors < 2 * headSectors) + ? (numSectors + 1) / 2 * sectorSize + : (numSectors - headSectors) * sectorSize; //MessageF("Erasing %u bytes...\n", fileSize); esp_upload.uploadResult = flashBegin(esp_upload.uploadAddress, eraseSize); @@ -755,7 +737,7 @@ void SendUpdateFile(const char *file, uint32_t address) { if (res != FR_OK) return; - esp_upload.fileSize = f_size(&esp_upload.uploadFile); + esp_upload.fileSize = f_size(&esp_upload.uploadFile); if (esp_upload.fileSize == 0) { f_close(&esp_upload.uploadFile); return; diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index 705ec41611..4efcb7c8ed 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -118,7 +118,7 @@ void lcd_delta_settings() { } void menu_delta_calibrate() { - const bool all_homed = all_axes_homed(); + TERN_(DELTA_CALIBRATION_MENU, const bool all_homed = all_axes_homed()); // Acquire ahead of loop START_MENU(); BACK_ITEM(MSG_MAIN); diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 2cd300958f..f0f5c21bec 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -188,11 +188,10 @@ void _lcd_ubl_edit_mesh() { */ void _lcd_ubl_validate_custom_mesh() { char ubl_lcd_gcode[24]; - const int16_t temp = TERN(HAS_HEATED_BED, custom_bed_temp, 0); sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26 C P H%" PRIi16 TERN_(HAS_HEATED_BED, " B%" PRIi16)) , custom_hotend_temp #if HAS_HEATED_BED - , temp + , custom_bed_temp #endif ); queue.inject(ubl_lcd_gcode); diff --git a/Marlin/src/module/thermistor/thermistor_666.h b/Marlin/src/module/thermistor/thermistor_666.h index 86493988e0..490dbd5f3e 100644 --- a/Marlin/src/module/thermistor/thermistor_666.h +++ b/Marlin/src/module/thermistor/thermistor_666.h @@ -33,8 +33,7 @@ * B: 0.00031362 * C: -2.03978e-07 */ -#define NUMTEMPS 61 -const short temptable_666[NUMTEMPS][2] PROGMEM = { +const temp_entry_t temptable_666[] PROGMEM = { { OV( 1), 794 }, { OV( 18), 288 }, { OV( 35), 234 }, diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h index 169f74b437..d7eb187245 100644 --- a/Marlin/src/pins/sensitive_pins.h +++ b/Marlin/src/pins/sensitive_pins.h @@ -608,12 +608,6 @@ #define _Z_PROBE #endif -#if TEMP_SENSOR_BED && PIN_EXISTS(HEATER_BED) - #define _HEATER_BED HEATER_BED_PIN, -#else - #define _HEATER_BED -#endif - #if PIN_EXISTS(FAN) #define _FAN0 FAN_PIN, #else @@ -660,21 +654,26 @@ #define _FANC #endif -#if PIN_EXISTS(HEATER_BED) && PIN_EXISTS(TEMP_BED) +#if TEMP_SENSOR_BED && PINS_EXIST(TEMP_BED, HEATER_BED) #define _BED_PINS HEATER_BED_PIN, analogInputToDigitalPin(TEMP_BED_PIN), #else #define _BED_PINS #endif -#if PIN_EXISTS(TEMP_CHAMBER) - #define __CHAMBER_PINS CHAMBER_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_CHAMBER_PIN), +#if TEMP_SENSOR_CHAMBER && PIN_EXISTS(TEMP_CHAMBER) + #define _CHAMBER_TEMP analogInputToDigitalPin(TEMP_CHAMBER_PIN), #else - #define __CHAMBER_PINS + #define _CHAMBER_TEMP #endif -#if PIN_EXISTS(HEATER_CHAMBER) - #define _CHAMBER_PINS __CHAMBER_PINS HEATER_CHAMBER_PIN, +#if TEMP_SENSOR_CHAMBER && PINS_EXIST(TEMP_CHAMBER, HEATER_CHAMBER) + #define _CHAMBER_HEATER HEATER_CHAMBER_PIN, #else - #define _CHAMBER_PINS + #define _CHAMBER_HEATER +#endif +#if TEMP_SENSOR_CHAMBER && PINS_EXIST(TEMP_CHAMBER, CHAMBER_AUTO_FAN) + #define _CHAMBER_FAN CHAMBER_AUTO_FAN_PIN, +#else + #define _CHAMBER_FAN #endif #ifndef HAL_SENSITIVE_PINS @@ -685,6 +684,6 @@ _X_PINS _Y_PINS _Z_PINS _X2_PINS _Y2_PINS _Z2_PINS _Z3_PINS _Z4_PINS _Z_PROBE \ _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS _E6_PINS _E7_PINS \ _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS _H6_PINS _H7_PINS \ - _PS_ON _HEATER_BED _FAN0 _FAN1 _FAN2 _FAN3 _FAN4 _FAN5 _FAN6 _FAN7 _FANC \ - _BED_PINS _CHAMBER_PINS HAL_SENSITIVE_PINS \ + _PS_ON _FAN0 _FAN1 _FAN2 _FAN3 _FAN4 _FAN5 _FAN6 _FAN7 _FANC \ + _BED_PINS _CHAMBER_TEMP _CHAMBER_HEATER _CHAMBER_FAN HAL_SENSITIVE_PINS \ } diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 12c40b31b3..32203f52ea 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -200,6 +200,7 @@ #elif SD_CONNECTION_IS(ONBOARD) #define SDIO_SUPPORT #define SD_DETECT_PIN PD12 + #define ONBOARD_SD_CS_PIN PC11 #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." #endif From 67e0e6d5adfcfd4835b9b93c8147730ee32b18f4 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 11 Oct 2020 17:23:23 -0700 Subject: [PATCH 0377/1370] Fix I2C_ADDRESS sign warning (#19685) --- Marlin/src/HAL/HAL.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index 8b6a978d21..5eca2f7eac 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -34,7 +34,7 @@ #define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) #ifndef I2C_ADDRESS - #define I2C_ADDRESS(A) (A) + #define I2C_ADDRESS(A) uint8_t(A) #endif // Needed for AVR sprintf_P PROGMEM extension From 2dafba1ad29b6caae1dd25f95d82c1e54951327c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 11 Oct 2020 21:26:16 -0300 Subject: [PATCH 0378/1370] Implement wait_for_user for Color UI (#19694) --- Marlin/src/gcode/config/M43.cpp | 9 ++++++++- Marlin/src/lcd/tft/touch.cpp | 12 ++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index 1e7374542c..1e780ca05a 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -46,6 +46,10 @@ #include "../../lcd/extui/ui_api.h" #endif +#if HAS_RESUME_CONTINUE + #include "../../lcd/ultralcd.h" +#endif + #ifndef GET_PIN_MAP_PIN_M43 #define GET_PIN_MAP_PIN_M43(Q) GET_PIN_MAP_PIN(Q) #endif @@ -362,7 +366,10 @@ void GcodeSuite::M43() { } } - if (TERN0(HAS_RESUME_CONTINUE, !wait_for_user)) break; + #if HAS_RESUME_CONTINUE + ui.update(); + if (!wait_for_user) break; + #endif safe_delay(200); } diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index d19cc4bf1d..80c65f074a 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -50,6 +50,9 @@ touch_calibration_t Touch::calibration; calibrationState Touch::calibration_state = CALIBRATION_NONE; touch_calibration_point_t Touch::calibration_points[4]; #endif +#if HAS_RESUME_CONTINUE + extern bool wait_for_user; +#endif void Touch::init() { calibration_reset(); @@ -80,6 +83,15 @@ void Touch::idle() { now = millis(); if (get_point(&_x, &_y)) { + #if HAS_RESUME_CONTINUE + // UI is waiting for a click anywhere? + if (wait_for_user) { + touch_control_type = CLICK; + ui.lcd_clicked = true; + return; + } + #endif + #if LCD_TIMEOUT_TO_STATUS ui.return_to_status_ms = now + LCD_TIMEOUT_TO_STATUS; #endif From c1729330c56b27cbdcc904d4faf88dfe80fc60ce Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 11 Oct 2020 21:31:21 -0300 Subject: [PATCH 0379/1370] Option to prevent (extra) Watchdog init on STM32 (#19693) --- Marlin/src/HAL/STM32/watchdog.cpp | 6 +++++- Marlin/src/HAL/STM32F1/watchdog.cpp | 4 +++- Marlin/src/pins/stm32f1/pins_MALYAN_M200.h | 3 +++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Marlin/src/HAL/STM32/watchdog.cpp b/Marlin/src/HAL/STM32/watchdog.cpp index 37e5638b05..cc18553149 100644 --- a/Marlin/src/HAL/STM32/watchdog.cpp +++ b/Marlin/src/HAL/STM32/watchdog.cpp @@ -30,7 +30,11 @@ #include "watchdog.h" #include - void watchdog_init() { IWatchdog.begin(4000000); } // 4 sec timeout + void watchdog_init() { + #if DISABLED(DISABLE_WATCHDOG_INIT) + IWatchdog.begin(4000000); // 4 sec timeout + #endif + } void HAL_watchdog_refresh() { IWatchdog.reload(); diff --git a/Marlin/src/HAL/STM32F1/watchdog.cpp b/Marlin/src/HAL/STM32F1/watchdog.cpp index 4123bc3ef0..ca91a6fe43 100644 --- a/Marlin/src/HAL/STM32F1/watchdog.cpp +++ b/Marlin/src/HAL/STM32F1/watchdog.cpp @@ -52,7 +52,9 @@ void watchdogSetup() { * @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0) */ void watchdog_init() { - //iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); + #if DISABLED(DISABLE_WATCHDOG_INIT) + iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); + #endif } #endif // USE_WATCHDOG diff --git a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h index d3c26c497d..95e7e92174 100644 --- a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h +++ b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h @@ -33,6 +33,9 @@ #define BOARD_INFO_NAME "Malyan M200" #endif +// Prevents hanging from an extra watchdog init +#define DISABLE_WATCHDOG_INIT + // Assume Flash EEPROM #if NO_EEPROM_SELECTED #define FLASH_EEPROM_EMULATION From 7ab74d22c4cb00a6f8f578efa88184b04dfdb401 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 11 Oct 2020 17:42:50 -0700 Subject: [PATCH 0380/1370] Fix motion compile w/out probe-oriented settings (#19684) --- Marlin/src/module/motion.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index b904309018..da1cb173e5 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -510,7 +510,7 @@ void do_z_clearance(const float &zclear, const bool z_known/*=true*/, const bool const bool rel = raise_on_unknown && !z_known; float zdest = zclear + (rel ? current_position.z : 0.0f); if (!lower_allowed) NOLESS(zdest, current_position.z); - do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), MMM_TO_MMS(TERN(HAS_BED_PROBE, Z_PROBE_SPEED_FAST, HOMING_FEEDRATE_Z))); } // @@ -1126,8 +1126,9 @@ bool homing_needed_error(uint8_t axis_bits/*=0x07*/) { * Homing bump feedrate (mm/s) */ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { - if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) - return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); + #endif static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); if (hbd < 1) { @@ -1588,7 +1589,7 @@ void homeaxis(const AxisEnum axis) { // When homing Z with probe respect probe clearance const bool use_probe_bump = TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && home_bump_mm(Z_AXIS)); const float bump = axis_home_dir * ( - use_probe_bump ? _MAX(Z_CLEARANCE_BETWEEN_PROBES, home_bump_mm(Z_AXIS)) : home_bump_mm(axis) + use_probe_bump ? _MAX(TERN0(HOMING_Z_WITH_PROBE, Z_CLEARANCE_BETWEEN_PROBES), home_bump_mm(Z_AXIS)) : home_bump_mm(axis) ); // If a second homing move is configured... From 5047979340534dd7c1c95c25d2144828608ee682 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Mon, 12 Oct 2020 04:30:18 +0200 Subject: [PATCH 0381/1370] Add REPORT_TRAMMING_MM option (#19682) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 8 +++----- Marlin/src/gcode/bedlevel/G35.cpp | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 59a1813610..0d14f67cb2 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -806,11 +806,9 @@ #define TRAMMING_POINT_NAME_3 "Back-Right" #define TRAMMING_POINT_NAME_4 "Back-Left" - // Enable to restore leveling setup after operation - #define RESTORE_LEVELING_AFTER_G35 - - // Add a menu item for Assisted Tramming - //#define ASSISTED_TRAMMING_MENU_ITEM + #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation + //#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first + //#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item for Assisted Tramming /** * Screw thread: diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index bd7f4f0411..0ede4e79c6 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -160,6 +160,7 @@ void GcodeSuite::G35() { " ", (screw_thread & 1) == (adjust > 0) ? "CCW" : "CW", " by ", abs(full_turns), " turns"); if (minutes) SERIAL_ECHOPAIR(" and ", abs(minutes), " minutes"); + if (ENABLED(REPORT_TRAMMING_MM)) SERIAL_ECHOPAIR(" (", -diff, "mm)"); SERIAL_EOL(); } } From d2863466ace64b8bfde1d5eadf9e24e312b0d31e Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sun, 11 Oct 2020 22:34:27 -0400 Subject: [PATCH 0382/1370] G34 Mechanical Gantry Calibration (like Prusa M915) (#18972) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 19 +++ Marlin/src/gcode/calibrate/G34.cpp | 153 ++++++++++++++++++++++++ Marlin/src/gcode/calibrate/G34_M422.cpp | 98 ++++++++++----- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 5 +- Marlin/src/inc/SanityCheck.h | 17 ++- Marlin/src/lcd/language/language_en.h | 3 + Marlin/src/lcd/menu/menu_motion.cpp | 2 +- buildroot/tests/LPC1769-tests | 2 +- platformio.ini | 2 + 10 files changed, 269 insertions(+), 34 deletions(-) create mode 100644 Marlin/src/gcode/calibrate/G34.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0d14f67cb2..db54716cde 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3376,6 +3376,25 @@ //#define JOYSTICK_DEBUG #endif +/** + * Mechanical Gantry Calibration + * Modern replacement for the Prusa TMC_Z_CALIBRATION. + * Adds capability to work with any adjustable current drivers. + * Implemented as G34 because M915 is deprecated. + */ +//#define MECHANICAL_GANTRY_CALIBRATION +#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) + #define GANTRY_CALIBRATION_CURRENT 600 // Default calibration current in ma + #define GANTRY_CALIBRATION_EXTRA_HEIGHT 15 // Extra distance in mm past Z_###_POS to move + #define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move + //#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction + + //#define GANTRY_CALIBRATION_SAFE_POSITION { X_CENTER, Y_CENTER } // Safe position for nozzle + //#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM + //#define GANTRY_CALIBRATION_COMMANDS_PRE "" + #define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position +#endif + /** * MAX7219 Debug Matrix * diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp new file mode 100644 index 0000000000..eb1d32f909 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -0,0 +1,153 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/endstops.h" + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../core/debug_out.h" + +void GcodeSuite::G34() { + + if (homing_needed()) return; + + TEMPORARY_SOFT_ENDSTOP_STATE(false); + TEMPORARY_BED_LEVELING_STATE(false); + TemporaryGlobalEndstopsState unlock_z(false); + + #ifdef GANTRY_CALIBRATION_COMMANDS_PRE + gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_PRE)); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Sub Commands Processed"); + #endif + + #ifdef GANTRY_CALIBRATION_SAFE_POSITION + // Move XY to safe position + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Parking XY"); + const xy_pos_t safe_pos = GANTRY_CALIBRATION_SAFE_POSITION; + do_blocking_move_to(safe_pos, MMM_TO_MMS(GANTRY_CALIBRATION_XY_PARK_FEEDRATE)); + #endif + + const float move_distance = parser.intval('Z', GANTRY_CALIBRATION_EXTRA_HEIGHT), + zbase = ENABLED(GANTRY_CALIBRATION_TO_MIN) ? Z_MIN_POS : Z_MAX_POS, + zpounce = zbase - move_distance, zgrind = zbase + move_distance; + + // Move Z to pounce position + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting Z Pounce"); + do_blocking_move_to_z(zpounce, MMM_TO_MMS(HOMING_FEEDRATE_Z)); + + // Store current motor settings, then apply reduced value + + #define _REDUCE_CURRENT ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_DAC, HAS_MOTOR_CURRENT_I2C, HAS_TRINAMIC_CONFIG) + #if _REDUCE_CURRENT + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Reducing Current"); + #endif + + #if HAS_MOTOR_CURRENT_SPI + const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); + const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; + stepper.set_digipot_current(Z_AXIS, target_current); + #elif HAS_MOTOR_CURRENT_PWM + const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); + const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; + stepper.set_digipot_current(1, target_current); + #elif HAS_MOTOR_CURRENT_DAC + const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT); + const float previous_current = dac_amps(Z_AXIS, target_current); + stepper_dac.set_current_value(Z_AXIS, target_current); + #elif ENABLED(HAS_MOTOR_CURRENT_I2C) + const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); + previous_current = dac_amps(Z_AXIS); + digipot_i2c.set_current(Z_AXIS, target_current) + #elif HAS_TRINAMIC_CONFIG + const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); + static uint16_t previous_current_arr[NUM_Z_STEPPER_DRIVERS]; + #if AXIS_IS_TMC(Z) + previous_current_arr[0] = stepperZ.getMilliamps(); + stepperZ.rms_current(target_current); + #endif + #if AXIS_IS_TMC(Z2) + previous_current_arr[1] = stepperZ2.getMilliamps(); + stepperZ2.rms_current(target_current); + #endif + #if AXIS_IS_TMC(Z3) + previous_current_arr[2] = stepperZ3.getMilliamps(); + stepperZ3.rms_current(target_current); + #endif + #if AXIS_IS_TMC(Z4) + previous_current_arr[3] = stepperZ4.getMilliamps(); + stepperZ4.rms_current(target_current); + #endif + #endif + + // Do Final Z move to adjust + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Final Z Move"); + do_blocking_move_to_z(zgrind, MMM_TO_MMS(GANTRY_CALIBRATION_FEEDRATE)); + + // Back off end plate, back to normal motion range + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Z Backoff"); + do_blocking_move_to_z(zpounce, MMM_TO_MMS(GANTRY_CALIBRATION_FEEDRATE)); + + #if _REDUCE_CURRENT + // Reset current to original values + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore Current"); + #endif + + #if HAS_MOTOR_CURRENT_SPI + stepper.set_digipot_current(Z_AXIS, previous_current); + #elif HAS_MOTOR_CURRENT_PWM + stepper.set_digipot_current(1, previous_current); + #elif HAS_MOTOR_CURRENT_DAC + stepper_dac.set_current_value(Z_AXIS, previous_current); + #elif ENABLED(HAS_MOTOR_CURRENT_I2C) + digipot_i2c.set_current(Z_AXIS, previous_current) + #elif HAS_TRINAMIC_CONFIG + #if AXIS_IS_TMC(Z) + stepperZ.rms_current(previous_current_arr[0]); + #endif + #if AXIS_IS_TMC(Z2) + stepperZ2.rms_current(previous_current_arr[1]); + #endif + #if AXIS_IS_TMC(Z3) + stepperZ3.rms_current(previous_current_arr[2]); + #endif + #if AXIS_IS_TMC(Z4) + stepperZ4.rms_current(previous_current_arr[3]); + #endif + #endif + + #ifdef GANTRY_CALIBRATION_COMMANDS_POST + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Running Post Commands"); + gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_POST)); + #endif +} + +#endif // MECHANICAL_GANTRY_CALIBRATION diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 1fd0754ec7..24292477f9 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -20,28 +20,29 @@ * */ -#include "../../inc/MarlinConfig.h" +#include "../../inc/MarlinConfigPre.h" #if ENABLED(Z_STEPPER_AUTO_ALIGN) #include "../../feature/z_stepper_align.h" #include "../gcode.h" -#include "../../module/planner.h" -#include "../../module/stepper.h" #include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/planner.h" #include "../../module/probe.h" - -#if HAS_MULTI_HOTEND - #include "../../module/tool_change.h" -#endif +#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM #if HAS_LEVELING #include "../../feature/bedlevel/bedlevel.h" #endif +#if HAS_MULTI_HOTEND + #include "../../module/tool_change.h" +#endif + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - #include "../../libs/least_squares_fit.h" + #include "../../libs/least_squares_fit.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) @@ -117,7 +118,7 @@ void GcodeSuite::G34() { // In BLTOUCH HS mode, the probe travels in a deployed state. // Users of G34 might have a badly misaligned bed, so raise Z by the // length of the deployed pin (BLTOUCH stroke < 7mm) - #define Z_BASIC_CLEARANCE Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE) + #define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE)) // Compute a worst-case clearance height to probe from. After the first // iteration this will be re-calculated based on the actual bed position @@ -154,21 +155,29 @@ void GcodeSuite::G34() { z_maxdiff = 0.0f, amplification = z_auto_align_amplification; - // These are needed after the for-loop - uint8_t iteration; - bool err_break = false; - float z_measured_min; - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) bool adjustment_reverse = false; #endif - // 'iteration' is declared above and is also used after the for-loop. - // *not* the same as LOOP_L_N(iteration, z_auto_align_iterations) - for (iteration = 0; iteration < z_auto_align_iterations; ++iteration) { + #if HAS_DISPLAY + PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION); + const uint8_t iter_str_len = strlen_P(msg_iteration); + #endif + + // Final z and iteration values will be used after breaking the loop + float z_measured_min; + uint8_t iteration = 0; + bool err_break = false; // To break out of nested loops + while (iteration < z_auto_align_iterations) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions."); - SERIAL_ECHOLNPAIR("\nITERATION: ", int(iteration + 1)); + const int iter = iteration + 1; + SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter); + #if HAS_DISPLAY + char str[iter_str_len + 2 + 1]; + sprintf_P(str, msg_iteration, iter); + ui.set_status(str); + #endif // Initialize minimum value z_measured_min = 100000.0f; @@ -190,7 +199,8 @@ void GcodeSuite::G34() { // current_position.z has been manually altered in the "dirty trick" above. const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false); if (isnan(z_probed_height)) { - SERIAL_ECHOLNPGM("Probing failed."); + SERIAL_ECHOLNPGM("Probing failed"); + LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); err_break = true; break; } @@ -249,8 +259,39 @@ void GcodeSuite::G34() { , " Z3-Z1=", ABS(z_measured[2] - z_measured[0]) #endif ); + #if HAS_DISPLAY + char fstr1[10]; + #if NUM_Z_STEPPER_DRIVERS == 2 + char msg[6 + (6 + 5) * 1 + 1]; + #else + char msg[6 + (6 + 5) * 3 + 1], fstr2[10], fstr3[10]; + #endif + sprintf_P(msg, + PSTR("Diffs Z1-Z2=%s" + #if NUM_Z_STEPPER_DRIVERS == 3 + " Z2-Z3=%s" + " Z3-Z1=%s" + #endif + ), dtostrf(ABS(z_measured[0] - z_measured[1]), 1, 3, fstr1) + #if NUM_Z_STEPPER_DRIVERS == 3 + , dtostrf(ABS(z_measured[1] - z_measured[2]), 1, 3, fstr2) + , dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3) + #endif + ); + ui.set_status(msg); + #endif + + auto decreasing_accuracy = [](const float &v1, const float &v2){ + if (v1 < v2 * 0.7f) { + SERIAL_ECHOLNPGM("Decreasing Accuracy Detected."); + LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY); + return true; + } + return false; + }; #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Check if the applied corrections go in the correct direction. // Calculate the sum of the absolute deviations from the mean of the probe measurements. // Compare to the last iteration to ensure it's getting better. @@ -266,11 +307,8 @@ void GcodeSuite::G34() { z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean); // If it's getting worse, stop and throw an error - if (last_z_align_level_indicator < z_align_level_indicator * 0.7f) { - SERIAL_ECHOLNPGM("Decreasing accuracy detected."); - err_break = true; - break; - } + err_break = decreasing_accuracy(last_z_align_level_indicator, z_align_level_indicator); + if (err_break) break; last_z_align_level_indicator = z_align_level_indicator; #endif @@ -290,8 +328,7 @@ void GcodeSuite::G34() { if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification; // Check for less accuracy compared to last move - if (last_z_align_move[zstepper] < z_align_abs * 0.7f) { - SERIAL_ECHOLNPGM("Decreasing accuracy detected."); + if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]); if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs); adjustment_reverse = !adjustment_reverse; @@ -329,9 +366,14 @@ void GcodeSuite::G34() { if (err_break) break; - if (success_break) { SERIAL_ECHOLNPGM("Target accuracy achieved."); break; } + if (success_break) { + SERIAL_ECHOLNPGM("Target accuracy achieved."); + LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED); + break; + } - } // for (iteration) + iteration++; + } // while (iteration < z_auto_align_iterations) if (err_break) SERIAL_ECHOLNPGM("G34 aborted."); diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 1d4e8f9d4d..f2bd81e670 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -327,7 +327,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 33: G33(); break; // G33: Delta Auto-Calibration #endif - #if ENABLED(Z_STEPPER_AUTO_ALIGN) + #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) case 34: G34(); break; // G34: Z Stepper automatic alignment using probe #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 683642bec6..3d745eff89 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -465,11 +465,12 @@ private: TERN_(DELTA_AUTO_CALIBRATION, static void G33()); - #if ENABLED(Z_STEPPER_AUTO_ALIGN) + #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) static void G34(); - static void M422(); #endif + TERN_(Z_STEPPER_AUTO_ALIGN, static void M422()); + TERN_(ASSISTED_TRAMMING, static void G35()); TERN_(G38_PROBE_TARGET, static void G38(const int8_t subcode)); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 25188906c7..c3708c2676 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -422,7 +422,7 @@ #elif defined(CHAMBER_HEATER_PIN) #error "CHAMBER_HEATER_PIN is now HEATER_CHAMBER_PIN. Please update your configuration and/or pins." #elif defined(TMC_Z_CALIBRATION) - #error "TMC_Z_CALIBRATION has been deprecated in favor of Z_STEPPER_AUTO_ALIGN. Please update your configuration." + #error "TMC_Z_CALIBRATION has been deprecated in favor of MECHANICAL_GANTRY_CALIBRATION. Please update your configuration." #elif defined(Z_MIN_PROBE_ENDSTOP) #error "Z_MIN_PROBE_ENDSTOP is no longer required. Please remove it from Configuration.h." #elif defined(DUAL_NOZZLE_DUPLICATION_MODE) @@ -2788,6 +2788,21 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif +#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) + #if NONE(HAS_MOTOR_CURRENT_DAC, HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC, HAS_TRINAMIC_CONFIG, HAS_MOTOR_CURRENT_PWM) + #error "It is highly recommended to have adjustable current drivers to prevent damage. Disable this line to continue anyway." + #elif !defined(GANTRY_CALIBRATION_CURRENT) + #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_CURRENT to be set." + #elif !defined(GANTRY_CALIBRATION_EXTRA_HEIGHT) + #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_EXTRA_HEIGHT to be set." + #elif !defined(GANTRY_CALIBRATION_FEEDRATE) + #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_FEEDRATE to be set." + #endif + #if defined(GANTRY_CALIBRATION_SAFE_POSITION) && !defined(GANTRY_CALIBRATION_XY_PARK_FEEDRATE) + #error "GANTRY_CALIBRATION_SAFE_POSITION Requires GANTRY_CALIBRATION_XY_PARK_FEEDRATE to be set." + #endif +#endif + #if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS) #error "PRINTCOUNTER requires EEPROM_SETTINGS. Please update your Configuration." #endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index b41515a734..e8b4769cc2 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -67,6 +67,9 @@ namespace Language_en { PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align"); PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Iteration: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Accuracy Decreasing!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Accuracy Achieved"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Homing XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click to Begin"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Next Point"); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index dff9895c6b..676ba46ea7 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -358,7 +358,7 @@ void menu_motion() { // // Auto Z-Align // - #if ENABLED(Z_STEPPER_AUTO_ALIGN) + #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) GCODES_ITEM(MSG_AUTO_Z_ALIGN, PSTR("G34")); #endif diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index a7a6456d02..4314b0d5ff 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -61,7 +61,7 @@ opt_set MOTHERBOARD BOARD_COHESION3D_REMIX opt_set X_DRIVER_TYPE TMC2130 opt_set Y_DRIVER_TYPE TMC2130 opt_set Z_DRIVER_TYPE TMC2130 -opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT \ +opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT MECHANICAL_GANTRY_CALIBRATION \ TMC_USE_SW_SPI MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z HYBRID_THRESHOLD \ SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \ EXPERIMENTAL_I2CBUS diff --git a/platformio.ini b/platformio.ini index d2c7cfafbe..4c974e5a87 100644 --- a/platformio.ini +++ b/platformio.ini @@ -110,6 +110,7 @@ default_src_filter = + - - + - - - + - - - - @@ -309,6 +310,7 @@ MK2_MULTIPLEXER = src_filter=+ EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+ + HAS_CUTTER = src_filter=+ + EXPERIMENTAL_I2CBUS = src_filter=+ + +MECHANICAL_GANTRY_CAL.+ = src_filter=+ Z_STEPPER_AUTO_ALIGN = src_filter=+ + G26_MESH_VALIDATION = src_filter=+ ASSISTED_TRAMMING = src_filter=+ From fdcd28a0ec923a609f16cd0221db2821cd39dae6 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 11 Oct 2020 22:40:39 -0700 Subject: [PATCH 0383/1370] Allow MAX31865 resistance values configuration (#19695) --- Marlin/Configuration.h | 6 ++++++ Marlin/src/inc/SanityCheck.h | 4 ++++ Marlin/src/module/temperature.cpp | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ec8b162cd6..59f2be18c6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -432,6 +432,12 @@ #define DUMMY_THERMISTOR_998_VALUE 25 #define DUMMY_THERMISTOR_999_VALUE 100 +// Resistor values when using a MAX31865 (sensor -5) +// Sensor value is typically 100 (PT100) or 1000 (PT1000) +// Calibration value is typically 430 ohm for AdaFruit PT100 modules and 4300 ohm for AdaFruit PT1000 modules. +//#define MAX31865_SENSOR_OHMS 100 +//#define MAX31865_CALIBRATION_OHMS 430 + // Use temp sensor 1 as a redundant sensor with sensor 0. If the readings // from the two sensors differ too much the print will be aborted. //#define TEMP_SENSOR_1_AS_REDUNDANT diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c3708c2676..59a74411ef 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1845,6 +1845,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT." #endif +#if ENABLED(MAX6675_IS_MAX31865) && (!defined(MAX31865_SENSOR_OHMS) || !defined(MAX31865_CALIBRATION_OHMS)) + #error "MAX31865_SENSOR_OHMS and MAX31865_CALIBRATION_OHMS must be set in Configuration.h when using a MAX31865 temperature sensor." +#endif + /** * Test Heater, Temp Sensor, and Extruder Pins */ diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index f8ff972f80..9ecbb7c766 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1461,7 +1461,7 @@ void Temperature::manage_heater() { #elif ENABLED(HEATER_0_USES_MAX6675) return ( #if ENABLED(MAX6675_IS_MAX31865) - max31865.temperature(100, 400) // 100 ohms = PT100 resistance. 400 ohms = calibration resistor + max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS) #else raw * 0.25 #endif @@ -2236,7 +2236,7 @@ void Temperature::disable_all_heaters() { next_max6675_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; #if ENABLED(MAX6675_IS_MAX31865) - max6675_temp = int(max31865.temperature(100, 400)); // 100 ohms = PT100 resistance. 400 ohms = calibration resistor + max6675_temp = int(max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS)); #endif // From f163f1940d32414545928f82bb9112738ffcfe06 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 12 Oct 2020 00:59:30 -0500 Subject: [PATCH 0384/1370] Fix screen click reading too often (#19696) Co-authored-by: andreibobirica <39415547+andreibobirica@users.noreply.github.com> --- Marlin/src/lcd/ultralcd.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 58e6d9473b..7003d13fdd 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -1553,12 +1553,15 @@ void MarlinUI::update() { // - On edit screens, touch Up Half for -, Bottom Half to + // void MarlinUI::screen_click(const uint8_t row, const uint8_t col, const uint8_t, const uint8_t) { + const millis_t now = millis(); + if (PENDING(now, next_button_update_ms)) return; + next_button_update_ms = now + repeat_delay; // Assume the repeat delay const int8_t xdir = col < (LCD_WIDTH ) / 2 ? -1 : 1, ydir = row < (LCD_HEIGHT) / 2 ? -1 : 1; if (on_edit_screen) encoderDiff = epps * ydir; else if (screen_items > 0) { - // Last 3 cols act as a scroll :-) + // Last 5 cols act as a scroll :-) if (col > (LCD_WIDTH) - 5) // 2 * LCD_HEIGHT to scroll to bottom of next page. (LCD_HEIGHT would only go 1 item down.) encoderDiff = epps * (encoderLine - encoderTopLine + 2 * (LCD_HEIGHT)) * ydir; From 9b1ed45b3e02f7cecec53a2d0ba317e9add6308d Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 12 Oct 2020 18:38:07 -0300 Subject: [PATCH 0385/1370] TFT Refactoring (#19192) * split tft folder in two: tft for color ui; tft_io for shared tft code * after the files got moved, now the code was moved to the right place * classic ui using TFT IO init lcd codes * feature to compile tft_io when enabled * compiling fix * lvgl spi tft working with tft io init codes * there is no need for separeted fsmc and spi class in lvgl anymore, as tft io handle everything * remove debug * base for TFT rotation and mirroring API, and ILI9488 support * ST7796S rotate and mirror support * ST7789V rotate and mirror support * ST7735 rotate and mirror support * ILI9341 rotate and mirror support * ILI9328 rotate and mirror support * R61505 rotate and mirror support * MKS TFT definitions * more configs for mks tfts * update config * naming typo * to configure the user interface * ANYCUBIC_TFT35 * tft configs * support for SSD1963 * tft display types * updated conditionals lcd; first board fully working with the new code - all 3 ui! * compatiblity * changed name * move classic ui file name * rename TURN -> ROTATE * GRAPHICAL_TFT_ROTATE_180 deprecated * first fsmc board fully working - chitu v5 * mks robin nano v1.2 + tft 35 ok! * right pin name * anycubic tft tested in a TRIGORILLA_PRO * chitu v6 * nano 32 tft orientation * mks tft43 * mks tft43 rotation * fixed LONGER LK tft setup * GRAPHICAL_TFT_UPSCALE defined by the display type * better offsets defaults * Update Configuration.h * Update tft_fsmc.cpp * Update Conditionals_LCD.h * Tweak comments * update nano tests * Revert "update nano tests" This reverts commit a071ebbfad30e28855a4a5695ec8a726542a1a65. * default tft * outdated comments * to not break non-vscode builds * upscale tft 35 * support tft 180 rotation for color ui * Each TFT Driver is responsible for its default color mode. * use auto detect in mks displays, because some of them could be shipped with diferent drivers * extra s * unused code * wrong -1 * missing mirror options * Smaller regex pattern * Comment updates * Clean up old defines * Apply pins formatting * GRAPHICAL_TFT_ROTATE_180 => TFT_ROTATE_180 * MKS_ROBIN_TFT_V1_1R * merge fix * correct resolution * auto is default, dont need be there, and it will allow the user to configure it even for named displays * to not use rotation with MKS_ROBIN_TFT_V1_1R * i like () in macros * avoid sleepy commits * default for st7789 is rgb * nano follow up * to allow ili9328 rotation * default is rgb * boards merge follow up * to match bootloader orientation * HAS_TOUCH_XPT2046 is not hal specific anymore * lets not forget LPC * 180 rotation for ili9328 and R61505 * Clean up whitespace Co-authored-by: Scott Lahteine Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 74 ++-- Marlin/Configuration_adv.h | 3 +- Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h | 7 - Marlin/src/HAL/LPC1768/tft/tft_spi.h | 2 +- Marlin/src/HAL/STM32/tft/tft_fsmc.h | 2 +- Marlin/src/HAL/STM32/tft/tft_spi.h | 2 +- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 7 - Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 13 - Marlin/src/HAL/STM32F1/tft/tft_fsmc.h | 2 +- Marlin/src/HAL/STM32F1/tft/tft_spi.h | 2 +- Marlin/src/core/macros.h | 6 + Marlin/src/inc/Conditionals_LCD.h | 176 +++++++- Marlin/src/inc/SanityCheck.h | 4 +- ...pp => u8g_dev_tft_upscale_from_128x64.cpp} | 347 +--------------- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 146 ++----- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h | 18 +- .../extui/lib/mks_ui/draw_error_message.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 63 +-- .../extui/lib/mks_ui/mks_hardware_test.cpp | 12 +- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 60 --- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h | 30 -- .../lib/mks_ui/tft_lvgl_configuration.cpp | 385 +----------------- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 2 +- Marlin/src/lcd/scaled_tft.h | 9 +- Marlin/src/lcd/tft/tft.cpp | 159 +------- Marlin/src/lcd/tft/tft.h | 26 +- Marlin/src/lcd/tft/tft_io.h | 30 -- Marlin/src/lcd/tft/touch.cpp | 4 + Marlin/src/lcd/{tft => tft_io}/ili9328.h | 29 +- Marlin/src/lcd/{tft => tft_io}/ili9341.h | 18 +- Marlin/src/lcd/{tft => tft_io}/ili9488.h | 18 +- Marlin/src/lcd/{tft => tft_io}/r65105.h | 29 +- Marlin/src/lcd/tft_io/ssd1963.h | 131 ++++++ Marlin/src/lcd/{tft => tft_io}/st7735.h | 16 +- Marlin/src/lcd/{tft => tft_io}/st7789v.h | 16 +- Marlin/src/lcd/{tft => tft_io}/st7796s.h | 16 +- Marlin/src/lcd/tft_io/tft_io.cpp | 226 ++++++++++ Marlin/src/lcd/tft_io/tft_io.h | 124 ++++++ Marlin/src/lcd/touch/touch_buttons.cpp | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 31 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 2 +- .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 2 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 18 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 22 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 2 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 11 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 1 + Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 65 +-- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 18 +- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 50 ++- Marlin/src/pins/teensy4/pins_T41U5XBB.h | 6 +- Marlin/src/pins/teensy4/pins_TEENSY41.h | 10 +- platformio.ini | 6 +- 56 files changed, 1000 insertions(+), 1476 deletions(-) rename Marlin/src/lcd/dogm/{u8g_dev_tft_320x240_upscale_from_128x64.cpp => u8g_dev_tft_upscale_from_128x64.cpp} (60%) delete mode 100644 Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp delete mode 100644 Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h delete mode 100644 Marlin/src/lcd/tft/tft_io.h rename Marlin/src/lcd/{tft => tft_io}/ili9328.h (87%) rename Marlin/src/lcd/{tft => tft_io}/ili9341.h (94%) rename Marlin/src/lcd/{tft => tft_io}/ili9488.h (93%) rename Marlin/src/lcd/{tft => tft_io}/r65105.h (87%) create mode 100644 Marlin/src/lcd/tft_io/ssd1963.h rename Marlin/src/lcd/{tft => tft_io}/st7735.h (92%) rename Marlin/src/lcd/{tft => tft_io}/st7789v.h (93%) rename Marlin/src/lcd/{tft => tft_io}/st7796s.h (93%) create mode 100644 Marlin/src/lcd/tft_io/tft_io.cpp create mode 100644 Marlin/src/lcd/tft_io/tft_io.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 59f2be18c6..8f37f1e799 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2205,43 +2205,47 @@ //=============================== Graphical TFTs ============================== //============================================================================= -// -// TFT display with optional touch screen -// Color Marlin UI with standard menu system -// -//#define TFT_320x240 -//#define TFT_320x240_SPI -//#define TFT_480x320 -//#define TFT_480x320_SPI +/** + * TFT Type - Select your Display type + * + * Available options are: + * MKS_TS35_V2_0, + * MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, + * MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R + * TFT_TRONXY_X5SA, ANYCUBIC_TFT35, LONGER_LK_TFT28 + * TFT_GENERIC + * + * For TFT_GENERIC, you need to configure these 3 options: + * Driver: TFT_DRIVER + * Current Drivers are: AUTO, ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488 + * Resolution: TFT_WIDTH and TFT_HEIGHT + * Interface: TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI + */ +//#define TFT_GENERIC -// -// Skip autodetect and force specific TFT driver -// Mandatory for SPI screens with no MISO line -// Available drivers are: ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488 -// -//#define TFT_DRIVER AUTO +/** + * TFT UI - User Interface Selection. Enable one of the following options: + * + * TFT_CLASSIC_UI - Emulated DOGM - 128x64 Upscaled + * TFT_COLOR_UI - Marlin Default Menus, Touch Friendly, using full TFT capabilities + * TFT_LVGL_UI - A Modern UI using LVGL + * + * For LVGL_UI also copy the 'assets' folder from the build directory to the + * root of your SD card, together with the compiled firmware. + */ +//#define TFT_CLASSIC_UI +//#define TFT_COLOR_UI +//#define TFT_LVGL_UI -// -// SPI display (MKS Robin Nano V2.0, MKS Gen L V2.0) -// Upscaled 128x64 Marlin UI -// -//#define SPI_GRAPHICAL_TFT - -// -// FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) -// Upscaled 128x64 Marlin UI -// -//#define FSMC_GRAPHICAL_TFT - -// -// TFT LVGL UI -// -// Using default MKS icons and fonts from: https://git.io/JJvzK -// Just copy the 'assets' folder from the build directory to the -// root of your SD card, together with the compiled firmware. -// -//#define TFT_LVGL_UI_FSMC // Robin nano v1.2 uses FSMC -//#define TFT_LVGL_UI_SPI // Robin nano v2.0 uses SPI +/** + * TFT Rotation. Set to one of the following values: + * + * TFT_ROTATE_90, TFT_ROTATE_90_MIRROR_X, TFT_ROTATE_90_MIRROR_Y, + * TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y, + * TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y, + * TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION + */ +//#define TFT_ROTATION TFT_NO_ROTATION //============================================================================= //============================ Other Controllers ============================ diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index db54716cde..bcacddd20d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1560,10 +1560,9 @@ #endif // -// FSMC / SPI Graphical TFT +// Classic UI Options // #if TFT_SCALED_DOGLCD - //#define GRAPHICAL_TFT_ROTATE_180 //#define TFT_MARLINUI_COLOR 0xFFFF // White //#define TFT_MARLINBG_COLOR 0x0000 // Black //#define TFT_DISABLED_COLOR 0x0003 // Almost black diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h index b9bc0bf82e..32ef908d63 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h @@ -24,10 +24,3 @@ #if HAS_FSMC_TFT #error "Sorry! FSMC TFT displays are not current available for HAL/LPC1768." #endif - -// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT - #undef TOUCH_SCREEN - #undef TOUCH_SCREEN_CALIBRATION - #define HAS_TOUCH_XPT2046 1 -#endif diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.h b/Marlin/src/HAL/LPC1768/tft/tft_spi.h index 8d3e3127bb..4753fdbae9 100644 --- a/Marlin/src/HAL/LPC1768/tft/tft_spi.h +++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.h @@ -36,7 +36,7 @@ #define DATASIZE_8BIT SSP_DATABIT_8 #define DATASIZE_16BIT SSP_DATABIT_16 -#define TFT_IO TFT_SPI +#define TFT_IO_DRIVER TFT_SPI #define DMA_MINC_ENABLE 1 #define DMA_MINC_DISABLE 0 diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h index 8500fee113..cbec7613ef 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h @@ -38,7 +38,7 @@ #define DATASIZE_8BIT SPI_DATASIZE_8BIT #define DATASIZE_16BIT SPI_DATASIZE_16BIT -#define TFT_IO TFT_FSMC +#define TFT_IO_DRIVER TFT_FSMC #ifdef STM32F1xx #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.h b/Marlin/src/HAL/STM32/tft/tft_spi.h index 1eed45a709..d477b58c00 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.h +++ b/Marlin/src/HAL/STM32/tft/tft_spi.h @@ -38,7 +38,7 @@ #define DATASIZE_8BIT SPI_DATASIZE_8BIT #define DATASIZE_16BIT SPI_DATASIZE_16BIT -#define TFT_IO TFT_SPI +#define TFT_IO_DRIVER TFT_SPI class TFT_SPI { private: diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index 25110d7c80..f52e6fec2b 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -25,10 +25,3 @@ //#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE." #undef SD_CHECK_AND_RETRY #endif - -// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT - #undef TOUCH_SCREEN - #undef TOUCH_SCREEN_CALIBRATION - #define HAS_TOUCH_XPT2046 1 -#endif diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp index 008301d9bc..5b52fb416f 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -89,25 +89,12 @@ void TFT_FSMC::Init() { uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN; uint32_t controllerAddress; - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); - #endif - #if ENABLED(LCD_USE_DMA_FSMC) dma_init(FSMC_DMA_DEV); dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); #endif - #if PIN_EXISTS(TFT_RESET) - OUT_WRITE(TFT_RESET_PIN, HIGH); - delay(100); - #endif - - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - #endif - struct fsmc_nor_psram_reg_map* fsmcPsramRegion; if (fsmcInit) return; diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h index 6fcfea8a11..11eb1ffa84 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h @@ -32,7 +32,7 @@ #define DATASIZE_8BIT DMA_SIZE_8BITS #define DATASIZE_16BIT DMA_SIZE_16BITS -#define TFT_IO TFT_FSMC +#define TFT_IO_DRIVER TFT_FSMC typedef struct { __IO uint16_t REG; diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.h b/Marlin/src/HAL/STM32F1/tft/tft_spi.h index bb26fc21b6..da9a8e0c22 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.h @@ -34,7 +34,7 @@ #define DATASIZE_8BIT DATA_SIZE_8BIT #define DATASIZE_16BIT DATA_SIZE_16BIT -#define TFT_IO TFT_SPI +#define TFT_IO_DRIVER TFT_SPI #define DMA_MINC_ENABLE 1 #define DMA_MINC_DISABLE 0 diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 72644b195c..21bb32c4cf 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -452,6 +452,12 @@ #define HAS_ARGS(V...) _BOOL(FIRST(_END_OF_ARGUMENTS_ V)()) #define _END_OF_ARGUMENTS_() 0 + +// Simple Inline IF Macros, friendly to use in other macro definitions +#define IF(O, A, B) ((O) ? (A) : (B)) +#define IF_0(O, A) IF(O, A, 0) +#define IF_1(O, A) IF(O, A, 1) + // // REPEAT core macros. Recurse N times with ascending I. // diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 42d82dcc10..56ce2ca5ed 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -311,13 +311,40 @@ #define IS_ULTIPANEL #endif +// Compatibility +#if ENABLED(FSMC_GRAPHICAL_TFT) + #define TFT_CLASSIC_UI + #define TFT_INTERFACE_FSMC + #define TFT_GENERIC +#elif ENABLED(SPI_GRAPHICAL_TFT) + #define TFT_CLASSIC_UI + #define TFT_INTERFACE_SPI + #define TFT_GENERIC +#elif EITHER(TFT_320x240, TFT_480x320) + #define TFT_COLOR_UI + #define TFT_INTERFACE_FSMC + #define TFT_GENERIC +#elif EITHER(TFT_320x240_SPI, TFT_480x320_SPI) + #define TFT_COLOR_UI + #define TFT_INTERFACE_SPI + #define TFT_GENERIC +#elif ENABLED(TFT_LVGL_UI_FSMC) + #define TFT_LVGL_UI + #define TFT_INTERFACE_FSMC + #define TFT_GENERIC +#elif ENABLED(TFT_LVGL_UI_SPI) + #define TFT_LVGL_UI + #define TFT_INTERFACE_SPI + #define TFT_GENERIC +#endif + // FSMC/SPI TFT Panels (LVGL) -#if EITHER(TFT_LVGL_UI_SPI, TFT_LVGL_UI_FSMC) +#if ENABLED(TFT_LVGL_UI) #define HAS_TFT_LVGL_UI 1 #endif // FSMC/SPI TFT Panels -#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) +#if ENABLED(TFT_CLASSIC_UI) #define TFT_SCALED_DOGLCD 1 #endif @@ -325,32 +352,16 @@ #define DOGLCD #define IS_ULTIPANEL #define DELAYED_BACKLIGHT_INIT -#elif ENABLED(TFT_LVGL_UI_SPI) +#elif ENABLED(TFT_LVGL_UI) #define DELAYED_BACKLIGHT_INIT #endif -// FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h -#if ANY(TFT_320x240, TFT_480x320, TFT_LVGL_UI_FSMC, FSMC_GRAPHICAL_TFT) - #define HAS_FSMC_TFT 1 -#elif ANY(TFT_320x240_SPI, TFT_480x320_SPI, TFT_LVGL_UI_SPI, SPI_GRAPHICAL_TFT) - #define HAS_SPI_TFT 1 -#endif - // Color UI -#if ANY(TFT_320x240, TFT_480x320, TFT_320x240_SPI, TFT_480x320_SPI) +#if ENABLED(TFT_COLOR_UI) #define HAS_GRAPHICAL_TFT 1 #define IS_ULTIPANEL #endif -// Fewer lines with touch buttons on-screen -#if EITHER(TFT_320x240, TFT_320x240_SPI) - #define HAS_UI_320x240 1 - #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) -#elif EITHER(TFT_480x320, TFT_480x320_SPI) - #define HAS_UI_480x320 1 - #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) -#endif - /** * I2C Panels */ @@ -810,3 +821,128 @@ #ifndef EXTRUDE_MINTEMP #define EXTRUDE_MINTEMP 170 #endif + +/** + * TFT Displays + * + * Configure parameters for TFT displays: + * - TFT_DEFAULT_ORIENTATION + * - TFT_DRIVER + * - TFT_WIDTH + * - TFT_HEIGHT + * - TFT_INTERFACE_(SPI|FSMC) + * - TFT_COLOR + * - GRAPHICAL_TFT_UPSCALE + */ +#if ENABLED(MKS_TS35_V2_0) + // Most common: ST7796 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_INTERFACE_SPI + #define GRAPHICAL_TFT_UPSCALE 3 +#elif ENABLED(MKS_ROBIN_TFT24) + // Most common: ST7789 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(MKS_ROBIN_TFT28) + // Most common: ST7789 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(MKS_ROBIN_TFT32) + // Most common: ST7789 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(MKS_ROBIN_TFT35) + // Most common: ILI9488 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 3 +#elif ENABLED(MKS_ROBIN_TFT43) + #define TFT_DEFAULT_ORIENTATION 0 + #define TFT_DRIVER SSD1963 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 272 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(MKS_ROBIN_TFT_V1_1R) + // ILI9328 or R61505 + #define TFT_DEFAULT_ORIENTATION (TFT_INVERT_X | TFT_INVERT_Y | TFT_EXCHANGE_XY) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) + #define TFT_DRIVER ILI9488 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 3 +#elif ENABLED(LONGER_LK_TFT28) + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(TFT_GENERIC) + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) +#endif + +// FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h +#if ENABLED(TFT_INTERFACE_FSMC) + #define HAS_FSMC_TFT 1 + #if ENABLED(TFT_CLASSIC_UI) + #define FSMC_GRAPHICAL_TFT + #elif ENABLED(TFT_LVGL_UI) + #define TFT_LVGL_UI_FSMC + #endif +#elif ENABLED(TFT_INTERFACE_SPI) + #define HAS_SPI_TFT 1 + #if ENABLED(TFT_CLASSIC_UI) + #define SPI_GRAPHICAL_TFT + #elif ENABLED(TFT_LVGL_UI) + #define TFT_LVGL_UI_SPI + #endif +#endif + +#if ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 240 + #if ENABLED(TFT_INTERFACE_SPI) + #define TFT_320x240_SPI + #elif ENABLED(TFT_INTERFACE_FSMC) + #define TFT_320x240 + #endif +#elif ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 320 + #if ENABLED(TFT_INTERFACE_SPI) + #define TFT_480x320_SPI + #elif ENABLED(TFT_INTERFACE_FSMC) + #define TFT_480x320 + #endif +#endif + +// Fewer lines with touch buttons on-screen +#if EITHER(TFT_320x240, TFT_320x240_SPI) + #define HAS_UI_320x240 1 + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) +#elif EITHER(TFT_480x320, TFT_480x320_SPI) + #define HAS_UI_480x320 1 + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) +#endif + +// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT + #undef TOUCH_SCREEN + #undef TOUCH_SCREEN_CALIBRATION + #define HAS_TOUCH_XPT2046 1 +#endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 59a74411ef..7acb5e70c9 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -447,8 +447,6 @@ #error "POWER_SUPPLY is now obsolete. Please remove it from Configuration.h." #elif defined(MKS_ROBIN_TFT) #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. Please update your configuration." -#elif defined(TFT_LVGL_UI) - #error "TFT_LVGL_UI is now TFT_LVGL_UI_FSMC. Please update your configuration." #elif defined(SDPOWER) #error "SDPOWER is now SDPOWER_PIN. Please update your configuration and/or pins." #elif defined(STRING_SPLASH_LINE1) || defined(STRING_SPLASH_LINE2) @@ -535,6 +533,8 @@ #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." #elif defined(EVENT_GCODE_SD_STOP) #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT. Please update your Configuration.h." +#elif defined(GRAPHICAL_TFT_ROTATE_180) + #error "GRAPHICAL_TFT_ROTATE_180 is now TFT_ROTATION set to TFT_ROTATE_180. Please update your Configuration.h." #elif defined(FIL_RUNOUT_INVERTING) #if FIL_RUNOUT_INVERTING #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update your Configuration.h." diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp similarity index 60% rename from Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp rename to Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 0f53e45a27..d18b617987 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -66,12 +66,7 @@ #define HAS_LCD_IO 1 #endif -#if ENABLED(SPI_GRAPHICAL_TFT) - #include HAL_PATH(../../HAL, tft/tft_spi.h) -#elif ENABLED(FSMC_GRAPHICAL_TFT) - #include HAL_PATH(../../HAL, tft/tft_fsmc.h) -#endif - +#include "../tft_io/tft_io.h" TFT_IO tftio; #define WIDTH LCD_PIXEL_WIDTH @@ -132,299 +127,10 @@ TFT_IO tftio; #define TFT_BTOKMENU_COLOR COLOR_RED #endif -static uint32_t lcd_id = 0; - -#define ST7789V_CASET 0x2A /* Column address register */ -#define ST7789V_RASET 0x2B /* Row address register */ -#define ST7789V_WRITE_RAM 0x2C /* Write data to GRAM */ - - -/* Mind the mess: with landscape screen orientation 'Horizontal' is Y and 'Vertical' is X */ -#define ILI9328_HASET 0x20 /* Horizontal GRAM address register (0-255) */ -#define ILI9328_VASET 0x21 /* Vertical GRAM address register (0-511)*/ -#define ILI9328_WRITE_RAM 0x22 /* Write data to GRAM */ - -#define ILI9328_HASTART 0x50 /* Horizontal address start position (0-255) */ -#define ILI9328_HAEND 0x51 /* Horizontal address end position (0-255) */ -#define ILI9328_VASTART 0x52 /* Vertical address start position (0-511) */ -#define ILI9328_VAEND 0x53 /* Vertical address end position (0-511) */ - -static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #if HAS_LCD_IO - tftio.DataTransferBegin(DATASIZE_8BIT); - #define IO_REG_DATA(R,D) do { tftio.WriteReg(R); tftio.WriteData(D); }while(0) - #else - #define IO_REG_DATA(R,D) do { u8g_WriteByte(u8g, dev, R); u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&D); }while(0) - #endif - - #if NONE(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) - u8g_SetAddress(u8g, dev, 0); - #endif - - IO_REG_DATA(ILI9328_HASTART, Ymin); - IO_REG_DATA(ILI9328_HAEND, Ymax); - IO_REG_DATA(ILI9328_VASTART, Xmin); - IO_REG_DATA(ILI9328_VAEND, Xmax); - - IO_REG_DATA(ILI9328_HASET, Ymin); - IO_REG_DATA(ILI9328_VASET, Xmin); - - #if HAS_LCD_IO - tftio.WriteReg(ILI9328_WRITE_RAM); - tftio.DataTransferEnd(); - #else - u8g_WriteByte(u8g, dev, ILI9328_WRITE_RAM); - u8g_SetAddress(u8g, dev, 1); - #endif +static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { + tftio.set_window(Xmin, Ymin, Xmax, Ymax); } -static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #if HAS_LCD_IO - tftio.DataTransferBegin(DATASIZE_8BIT); - tftio.WriteReg(ST7789V_CASET); - tftio.WriteData((Xmin >> 8) & 0xFF); - tftio.WriteData(Xmin & 0xFF); - tftio.WriteData((Xmax >> 8) & 0xFF); - tftio.WriteData(Xmax & 0xFF); - - tftio.WriteReg(ST7789V_RASET); - tftio.WriteData((Ymin >> 8) & 0xFF); - tftio.WriteData(Ymin & 0xFF); - tftio.WriteData((Ymax >> 8) & 0xFF); - tftio.WriteData(Ymax & 0xFF); - - tftio.WriteReg(ST7789V_WRITE_RAM); - tftio.DataTransferEnd(); - #else - u8g_SetAddress(u8g, dev, 0); u8g_WriteByte(u8g, dev, ST7789V_CASET); u8g_SetAddress(u8g, dev, 1); - u8g_WriteByte(u8g, dev, (Xmin >> 8) & 0xFF); - u8g_WriteByte(u8g, dev, Xmin & 0xFF); - u8g_WriteByte(u8g, dev, (Xmax >> 8) & 0xFF); - u8g_WriteByte(u8g, dev, Xmax & 0xFF); - - u8g_SetAddress(u8g, dev, 0); u8g_WriteByte(u8g, dev, ST7789V_RASET); u8g_SetAddress(u8g, dev, 1); - u8g_WriteByte(u8g, dev, (Ymin >> 8) & 0xFF); - u8g_WriteByte(u8g, dev, Ymin & 0xFF); - u8g_WriteByte(u8g, dev, (Ymax >> 8) & 0xFF); - u8g_WriteByte(u8g, dev, Ymax & 0xFF); - - u8g_SetAddress(u8g, dev, 0); u8g_WriteByte(u8g, dev, ST7789V_WRITE_RAM); u8g_SetAddress(u8g, dev, 1); - #endif -} - -static void setWindow_none(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) {} -void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) = setWindow_none; - -#define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x -#define ESC_DELAY(x) 0xFFFF, 0x8000 | (x & 0x7FFF) -#define ESC_END 0xFFFF, 0x7FFF -#define ESC_FFFF 0xFFFF, 0xFFFF - -#if HAS_LCD_IO - void writeEscSequence(const uint16_t *sequence) { - uint16_t data; - for (;;) { - data = *sequence++; - if (data != 0xFFFF) { - tftio.WriteData(data); - continue; - } - data = *sequence++; - if (data == 0x7FFF) return; - if (data == 0xFFFF) { - tftio.WriteData(data); - } else if (data & 0x8000) { - delay(data & 0x7FFF); - } else if ((data & 0xFF00) == 0) { - tftio.WriteReg(data); - } - } - } - #define WRITE_ESC_SEQUENCE(V) writeEscSequence(V) - #define WRITE_ESC_SEQUENCE16(V) writeEscSequence(V) -#else - void writeEscSequence8(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { - uint16_t data; - u8g_SetAddress(u8g, dev, 1); - for (;;) { - data = *sequence++; - if (data != 0xFFFF) { - u8g_WriteByte(u8g, dev, data & 0xFF); - continue; - } - data = *sequence++; - if (data == 0x7FFF) return; - if (data == 0xFFFF) { - u8g_WriteByte(u8g, dev, data & 0xFF); - } else if (data & 0x8000) { - delay(data & 0x7FFF); - } else if ((data & 0xFF00) == 0) { - u8g_SetAddress(u8g, dev, 0); - u8g_WriteByte(u8g, dev, data & 0xFF); - u8g_SetAddress(u8g, dev, 1); - } - } - } - - #define WRITE_ESC_SEQUENCE(V) writeEscSequence8(u8g, dev, V) - - void writeEscSequence16(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { - uint16_t data; - u8g_SetAddress(u8g, dev, 0); - for (;;) { - data = *sequence++; - if (data != 0xFFFF) { - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&data); - continue; - } - data = *sequence++; - if (data == 0x7FFF) return; - if (data == 0xFFFF) { - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&data); - } else if (data & 0x8000) { - delay(data & 0x7FFF); - } else if ((data & 0xFF00) == 0) { - u8g_WriteByte(u8g, dev, data & 0xFF); - } - } - u8g_SetAddress(u8g, dev, 1); - } - - #define WRITE_ESC_SEQUENCE16(V) writeEscSequence16(u8g, dev, V) -#endif - -static const uint16_t st7789v_init[] = { - ESC_REG(0x0010), ESC_DELAY(10), - ESC_REG(0x0001), ESC_DELAY(200), - ESC_REG(0x0011), ESC_DELAY(120), - ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x0060, 0x00A0), - ESC_REG(0x003A), 0x0055, - ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F, - ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF, - ESC_REG(0x00B2), 0x000C, 0x000C, 0x0000, 0x0033, 0x0033, - ESC_REG(0x00B7), 0x0035, - ESC_REG(0x00BB), 0x001F, - ESC_REG(0x00C0), 0x002C, - ESC_REG(0x00C2), 0x0001, 0x00C3, - ESC_REG(0x00C4), 0x0020, - ESC_REG(0x00C6), 0x000F, - ESC_REG(0x00D0), 0x00A4, 0x00A1, - ESC_REG(0x0029), - ESC_REG(0x0011), - ESC_END -}; - -static const uint16_t ili9328_init[] = { - ESC_REG(0x0001), 0x0100, - ESC_REG(0x0002), 0x0400, - ESC_REG(0x0003), 0x1038, - ESC_REG(0x0004), 0x0000, - ESC_REG(0x0008), 0x0202, - ESC_REG(0x0009), 0x0000, - ESC_REG(0x000A), 0x0000, - ESC_REG(0x000C), 0x0000, - ESC_REG(0x000D), 0x0000, - ESC_REG(0x000F), 0x0000, - ESC_REG(0x0010), 0x0000, - ESC_REG(0x0011), 0x0007, - ESC_REG(0x0012), 0x0000, - ESC_REG(0x0013), 0x0000, - ESC_REG(0x0007), 0x0001, - ESC_DELAY(200), - ESC_REG(0x0010), 0x1690, - ESC_REG(0x0011), 0x0227, - ESC_DELAY(50), - ESC_REG(0x0012), 0x008C, - ESC_DELAY(50), - ESC_REG(0x0013), 0x1500, - ESC_REG(0x0029), 0x0004, - ESC_REG(0x002B), 0x000D, - ESC_DELAY(50), - ESC_REG(0x0050), 0x0000, - ESC_REG(0x0051), 0x00EF, - ESC_REG(0x0052), 0x0000, - ESC_REG(0x0053), 0x013F, - ESC_REG(0x0020), 0x0000, - ESC_REG(0x0021), 0x0000, - ESC_REG(0x0060), 0x2700, - ESC_REG(0x0061), 0x0001, - ESC_REG(0x006A), 0x0000, - ESC_REG(0x0080), 0x0000, - ESC_REG(0x0081), 0x0000, - ESC_REG(0x0082), 0x0000, - ESC_REG(0x0083), 0x0000, - ESC_REG(0x0084), 0x0000, - ESC_REG(0x0085), 0x0000, - ESC_REG(0x0090), 0x0010, - ESC_REG(0x0092), 0x0600, - ESC_REG(0x0007), 0x0133, - ESC_REG(0x0022), - ESC_END -}; - -static const uint16_t ili9341_init[] = { - ESC_REG(0x0010), ESC_DELAY(10), - ESC_REG(0x0001), ESC_DELAY(200), - ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x0028, 0x00E8), - ESC_REG(0x003A), 0x0055, - ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F, - ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF, - ESC_REG(0x00C5), 0x003E, 0x0028, - ESC_REG(0x00C7), 0x0086, - ESC_REG(0x00B1), 0x0000, 0x0018, - ESC_REG(0x00C0), 0x0023, - ESC_REG(0x00C1), 0x0010, - ESC_REG(0x0029), - ESC_REG(0x0011), - ESC_DELAY(100), - ESC_END -}; - -static const uint16_t ili9488_init[] = { - ESC_REG(0x00E0), 0x0000, 0x0007, 0x000F, 0x000D, 0x001B, 0x000A, 0x003C, 0x0078, 0x004A, 0x0007, 0x000E, 0x0009, 0x001B, 0x001E, 0x000F, - ESC_REG(0x00E1), 0x0000, 0x0022, 0x0024, 0x0006, 0x0012, 0x0007, 0x0036, 0x0047, 0x0047, 0x0006, 0x000A, 0x0007, 0x0030, 0x0037, 0x000F, - ESC_REG(0x00C0), 0x0010, 0x0010, - ESC_REG(0x00C1), 0x0041, - ESC_REG(0x00C5), 0x0000, 0x0022, 0x0080, - ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00A8, 0x0068), - ESC_REG(0x003A), 0x0055, - ESC_REG(0x00B0), 0x0000, - ESC_REG(0x00B1), 0x00B0, 0x0011, - ESC_REG(0x00B4), 0x0002, - ESC_REG(0x00B6), 0x0002, 0x0042, - ESC_REG(0x00B7), 0x00C6, - ESC_REG(0x00E9), 0x0000, - ESC_REG(0x00F0), 0x00A9, 0x0051, 0x002C, 0x0082, - ESC_REG(0x0029), - ESC_REG(0x0011), - ESC_DELAY(100), - ESC_END -}; - -static const uint16_t st7796_init[] = { - ESC_REG(0x0010), ESC_DELAY(120), - ESC_REG(0x0001), ESC_DELAY(120), - ESC_REG(0x0011), ESC_DELAY(120), - ESC_REG(0x00F0), 0x00C3, - ESC_REG(0x00F0), 0x0096, - ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028), - ESC_REG(0x003A), 0x0055, - ESC_REG(0x00B4), 0x0001, - ESC_REG(0x00B7), 0x00C6, - ESC_REG(0x00E8), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, - ESC_REG(0x00C1), 0x0006, - ESC_REG(0x00C2), 0x00A7, - ESC_REG(0x00C5), 0x0018, - ESC_REG(0x00E0), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0015, 0x002F, 0x0054, 0x0042, 0x003C, 0x0017, 0x0014, 0x0018, 0x001B, - ESC_REG(0x00E1), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0003, 0x002D, 0x0043, 0x0042, 0x003B, 0x0016, 0x0014, 0x0017, 0x001B, - ESC_REG(0x00F0), 0x003C, - ESC_REG(0x00F0), 0x0069, ESC_DELAY(120), - ESC_REG(0x0029), - ESC_REG(0x0011), - ESC_DELAY(100), - ESC_END -}; - #if HAS_TOUCH_XPT2046 static const uint8_t buttonD[] = { @@ -640,43 +346,9 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u switch (msg) { case U8G_DEV_MSG_INIT: - dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); - tftio.DataTransferBegin(DATASIZE_8BIT); - switch (lcd_id & 0xFFFF) { - case 0x8552: // ST7789V - WRITE_ESC_SEQUENCE(st7789v_init); - setWindow = setWindow_st7789v; - break; - case 0x9328: // ILI9328 - WRITE_ESC_SEQUENCE16(ili9328_init); - setWindow = setWindow_ili9328; - break; - case 0x9341: // ILI9341 - WRITE_ESC_SEQUENCE(ili9341_init); - setWindow = setWindow_st7789v; - break; - case 0x8066: // Anycubic / TronXY TFTs (480x320) - WRITE_ESC_SEQUENCE(ili9488_init); - setWindow = setWindow_st7789v; - break; - case 0x7796: - WRITE_ESC_SEQUENCE(st7796_init); - setWindow = setWindow_st7789v; - break; - case 0x9488: - WRITE_ESC_SEQUENCE(ili9488_init); - setWindow = setWindow_st7789v; - case 0x0404: // No connected display on FSMC - lcd_id = 0; - return 0; - case 0xFFFF: // No connected display on SPI - lcd_id = 0; - return 0; - default: - setWindow = (lcd_id & 0xFF000000) ? setWindow_st7789v : setWindow_ili9328; - break; - } - tftio.DataTransferEnd(); + dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, NULL); + tftio.Init(); + tftio.InitTFT(); if (preinit) { preinit = false; @@ -771,14 +443,7 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_INIT: u8g_SetPIOutput(u8g, U8G_PI_RESET); - u8g_Delay(50); - - tftio.Init(); - - if (arg_ptr) { - *((uint32_t *)arg_ptr) = tftio.GetID(); - } isCommand = 0; break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index 351d033d01..394ce48075 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -22,7 +22,7 @@ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI_SPI) +#if HAS_TFT_LVGL_UI #include "SPI_TFT.h" #include "pic_manager.h" @@ -32,6 +32,8 @@ #include +#include "draw_ui.h" + TFT SPI_TFT; // use SPI1 for the spi tft. @@ -39,142 +41,48 @@ void TFT::spi_init(uint8_t spiRate) { tftio.Init(); } -void TFT::LCD_WR_REG(uint8_t cmd) { - tftio.WriteReg(cmd); -} - -void TFT::LCD_WR_DATA(uint8_t data) { - tftio.WriteData(data); -} - void TFT::SetPoint(uint16_t x, uint16_t y, uint16_t point) { if ((x > 480) || (y > 320)) return; - SetWindows(x, y, 1, 1); + setWindow(x, y, 1, 1); tftio.WriteMultiple(point, (uint16_t)1); } -void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { - tftio.DataTransferBegin(DATASIZE_8BIT); - - LCD_WR_REG(0x2A); - LCD_WR_DATA(x >> 8); - LCD_WR_DATA(x); - LCD_WR_DATA((x + with - 1) >> 8); - LCD_WR_DATA((x + with - 1)); - - LCD_WR_REG(0x2B); - LCD_WR_DATA(y >> 8); - LCD_WR_DATA(y); - LCD_WR_DATA((y + height - 1) >> 8); - LCD_WR_DATA(y + height - 1); - - LCD_WR_REG(0X2C); - - tftio.DataTransferEnd(); +void TFT::setWindow(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { + tftio.set_window(x, y, (x + with - 1), (y + height - 1)); } void TFT::LCD_init() { - TFT_BLK_L; - TFT_RST_H; - delay(150); - TFT_RST_L; - delay(150); - TFT_RST_H; - - tftio.DataTransferBegin(DATASIZE_8BIT); - - delay(120); - LCD_WR_REG(0x11); - delay(120); - - LCD_WR_REG(0xF0); - LCD_WR_DATA(0xC3); - LCD_WR_REG(0xF0); - LCD_WR_DATA(0x96); - - LCD_WR_REG(0x36); - LCD_WR_DATA(0x28 + TERN0(GRAPHICAL_TFT_ROTATE_180, 0x80)); - LCD_WR_REG(0x3A); - LCD_WR_DATA(0x55); - - LCD_WR_REG(0xB4); - LCD_WR_DATA(0x01); - LCD_WR_REG(0xB7); - LCD_WR_DATA(0xC6); - LCD_WR_REG(0xE8); - LCD_WR_DATA(0x40); - LCD_WR_DATA(0x8A); - LCD_WR_DATA(0x00); - LCD_WR_DATA(0x00); - LCD_WR_DATA(0x29); - LCD_WR_DATA(0x19); - LCD_WR_DATA(0xA5); - LCD_WR_DATA(0x33); - LCD_WR_REG(0xC1); - LCD_WR_DATA(0x06); - LCD_WR_REG(0xC2); - LCD_WR_DATA(0xA7); - LCD_WR_REG(0xC5); - LCD_WR_DATA(0x18); - LCD_WR_REG(0xE0); // Positive Voltage Gamma Control - LCD_WR_DATA(0xF0); - LCD_WR_DATA(0x09); - LCD_WR_DATA(0x0B); - LCD_WR_DATA(0x06); - LCD_WR_DATA(0x04); - LCD_WR_DATA(0x15); - LCD_WR_DATA(0x2F); - LCD_WR_DATA(0x54); - LCD_WR_DATA(0x42); - LCD_WR_DATA(0x3C); - LCD_WR_DATA(0x17); - LCD_WR_DATA(0x14); - LCD_WR_DATA(0x18); - LCD_WR_DATA(0x1B); - LCD_WR_REG(0xE1); // Negative Voltage Gamma Control - LCD_WR_DATA(0xF0); - LCD_WR_DATA(0x09); - LCD_WR_DATA(0x0B); - LCD_WR_DATA(0x06); - LCD_WR_DATA(0x04); - LCD_WR_DATA(0x03); - LCD_WR_DATA(0x2D); - LCD_WR_DATA(0x43); - LCD_WR_DATA(0x42); - LCD_WR_DATA(0x3B); - LCD_WR_DATA(0x16); - LCD_WR_DATA(0x14); - LCD_WR_DATA(0x17); - LCD_WR_DATA(0x1B); - LCD_WR_REG(0xF0); - LCD_WR_DATA(0x3C); - LCD_WR_REG(0xF0); - LCD_WR_DATA(0x69); - delay(120); // Delay 120ms - LCD_WR_REG(0x29); // Display ON - - tftio.DataTransferEnd(); - - LCD_clear(0x0000); // + tftio.InitTFT(); + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, LOW); + #endif + delay(100); + LCD_clear(0x0000); LCD_Draw_Logo(); - TFT_BLK_H; - delay(2000); + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif + #if HAS_LOGO_IN_FLASH + delay(2000); + #endif } void TFT::LCD_clear(uint16_t color) { - SetWindows(0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); + setWindow(0, 0, (TFT_WIDTH), (TFT_HEIGHT)); tftio.WriteMultiple(color, (uint32_t)(TFT_WIDTH) * (TFT_HEIGHT)); } extern unsigned char bmp_public_buf[17 * 1024]; void TFT::LCD_Draw_Logo() { - SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); - for (uint16_t i = 0; i < (TFT_HEIGHT); i ++) { - Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); - tftio.WriteSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); - } + #if HAS_LOGO_IN_FLASH + setWindow(0, 0, TFT_WIDTH, TFT_HEIGHT); + for (uint16_t i = 0; i < (TFT_HEIGHT); i ++) { + Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); + tftio.WriteSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); + } + #endif } -#endif // HAS_TFT_LVGL_UI_SPI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h index e40039fe86..696bc16974 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -23,29 +23,21 @@ #include "../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI_SPI) - #include HAL_PATH(../../HAL, tft/tft_spi.h) -#elif ENABLED(TFT_LVGL_UI_FSMC) - #include HAL_PATH(../../HAL, tft/tft_fsmc.h) -#endif +#if HAS_TFT_LVGL_UI -#define TFT_RST_H OUT_WRITE(TFT_RESET_PIN, HIGH) -#define TFT_RST_L OUT_WRITE(TFT_RESET_PIN, LOW) - -#define TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) -#define TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) +#include "../../../tft_io/tft_io.h" class TFT { public: TFT_IO tftio; void spi_init(uint8_t spiRate); - void LCD_WR_REG(uint8_t cmd); - void LCD_WR_DATA(uint8_t data); void SetPoint(uint16_t x, uint16_t y, uint16_t point); - void SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height); + void setWindow(uint16_t x, uint16_t y, uint16_t with, uint16_t height); void LCD_init(); void LCD_clear(uint16_t color); void LCD_Draw_Logo(); }; extern TFT SPI_TFT; + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index 1bcdccda41..c21ee3612c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -23,9 +23,7 @@ #if HAS_TFT_LVGL_UI -#if ENABLED(TFT_LVGL_UI_SPI) - #include "SPI_TFT.h" -#endif +#include "SPI_TFT.h" #include "lv_conf.h" #include "draw_ui.h" @@ -77,7 +75,7 @@ void lv_draw_error_message(PGM_P const msg) { lv_task_handler(); #endif - TERN(TFT_LVGL_UI_SPI, SPI_TFT.LCD_clear, LCD_Clear)(0x0000); + SPI_TFT.LCD_clear(0x0000); if (msg) disp_string((TFT_WIDTH - strlen(msg) * 16) / 2, 100, msg, 0xFFFF, 0x0000); disp_string((TFT_WIDTH - strlen("PRINTER HALTED") * 16) / 2, 140, "PRINTER HALTED", 0xFFFF, 0x0000); disp_string((TFT_WIDTH - strlen("Please Reset") * 16) / 2, 180, "Please Reset", 0xFFFF, 0x0000); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 458620801b..d600b09a5f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -23,9 +23,7 @@ #if HAS_TFT_LVGL_UI -#if ENABLED(TFT_LVGL_UI_SPI) - #include "SPI_TFT.h" -#endif +#include "SPI_TFT.h" #include "tft_lvgl_configuration.h" @@ -165,7 +163,7 @@ void gCfgItems_init() { W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[4], OTHERS_COMMAND_ADDR_4, 100); } - const byte rot = TERN0(GRAPHICAL_TFT_ROTATE_180, 0xEE); + const byte rot = (TFT_ROTATION & TFT_ROTATE_180) ? 0xEE : 0x00; if (gCfgItems.disp_rotation_180 != rot) { gCfgItems.disp_rotation_180 = rot; update_spi_flash(); @@ -655,12 +653,7 @@ char *creat_title_text() { } card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); - #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); - #else - LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); - LCD_WriteRAM_Prepare(); - #endif + SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); j = i = 0; @@ -673,20 +666,11 @@ char *creat_title_text() { } if (j >= 400) break; } - #if ENABLED(TFT_LVGL_UI_SPI) - for (i = 0; i < 400; i += 2) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; - } - SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); - #else - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color; - LCD_IO_WriteData(*p_index); - i += 2; - } - #endif + for (i = 0; i < 400; i += 2) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; + } + SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); #if HAS_BAK_VIEW_IN_FLASH W25QXX.init(SPI_QUARTER_SPEED); if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); @@ -768,7 +752,7 @@ char *creat_title_text() { card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); + SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); #else LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); LCD_WriteRAM_Prepare(); @@ -901,34 +885,9 @@ char *creat_title_text() { default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k #endif - #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 - SPI_TFT.tftio.WriteSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20); - #else - int x_off = 0; - uint16_t temp_p; - int i = 0; - uint16_t *p_index; - LCD_setWindowArea(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 + SPI_TFT.setWindow(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 + SPI_TFT.tftio.WriteSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20); - LCD_WriteRAM_Prepare(); - - for (int _y = y_off * 20; _y < (y_off + 1) * 20; _y++) { - for (x_off = 0; x_off < 200; x_off++) { - if (sel == 1) { - temp_p = (uint16_t)(bmp_public_buf[i] | bmp_public_buf[i + 1] << 8); - p_index = &temp_p; - } - else { - p_index = (uint16_t *)(&bmp_public_buf[i]); - } - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color; - LCD_IO_WriteData(*p_index); - i += 2; - } - if (i >= 8000) break; - } - #endif // TFT_LVGL_UI_SPI y_off++; } W25QXX.init(SPI_QUARTER_SPEED); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index eeb6bae706..bc329aa82b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -23,9 +23,7 @@ #if HAS_TFT_LVGL_UI -#if ENABLED(TFT_LVGL_UI_SPI) - #include "SPI_TFT.h" -#endif +#include "SPI_TFT.h" #include "tft_lvgl_configuration.h" #include "draw_ready_print.h" @@ -626,10 +624,8 @@ static const uint16_t ASCII_Table_16x24[] PROGMEM = { void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint16_t bkColor) { for (uint16_t i = 0; i < 24; i++) { const uint16_t tmp_char = pgm_read_word(&ASCII_Table_16x24[((c - 0x20) * 24) + i]); - for (uint16_t j = 0; j < 16; j++) { - TERN(TFT_LVGL_UI_SPI, SPI_TFT.SetPoint, tft_set_point) - (x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor); - } + for (uint16_t j = 0; j < 16; j++) + SPI_TFT.SetPoint(x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor); } } @@ -643,7 +639,7 @@ void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor //static lv_obj_t * scr_test; void disp_assets_update() { - TERN(TFT_LVGL_UI_SPI,, LCD_Clear(0x0000)); + SPI_TFT.LCD_clear(0x0000); disp_string(100, 140, "Assets Updating...", 0xFFFF, 0x0000); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp deleted file mode 100644 index 62967b9d80..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../../inc/MarlinConfig.h" - -#if ENABLED(TFT_LVGL_UI_FSMC) - -#include HAL_PATH(../../HAL, tft/tft_fsmc.h) -TFT_IO tftio; - -void LCD_IO_Init(uint8_t cs, uint8_t rs); -void LCD_IO_WriteData(uint16_t RegValue); -void LCD_IO_WriteReg(uint16_t Reg); -#ifdef LCD_USE_DMA_FSMC - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); -#endif - -void LCD_IO_Init(uint8_t cs, uint8_t rs) { - tftio.Init(); -} - -void LCD_IO_WriteData(uint16_t RegValue) { - tftio.WriteData(RegValue); -} - -void LCD_IO_WriteReg(uint16_t Reg) { - tftio.WriteReg(Reg); -} - -#ifdef LCD_USE_DMA_FSMC - void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { - tftio.WriteMultiple(color, count); - } - - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { - tftio.WriteSequence(data, length); - } -#endif // LCD_USE_DMA_FSMC - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h deleted file mode 100644 index b2e19d66f8..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 3f8110feb4..ecd4eb482a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -29,9 +29,7 @@ #if HAS_TFT_LVGL_UI -#if ENABLED(TFT_LVGL_UI_SPI) - #include "SPI_TFT.h" -#endif +#include "SPI_TFT.h" #include "tft_lvgl_configuration.h" #include "draw_ready_print.h" @@ -74,24 +72,6 @@ lv_group_t* g; uint16_t DeviceCode = 0x9488; extern uint8_t sel_id; -#define SetCs -#define ClrCs - -#define HDP 799 // Horizontal Display Period -#define HT 1000 // Horizontal Total -#define HPS 51 // LLINE Pulse Start Position -#define LPS 3 // Horizontal Display Period Start Position -#define HPW 8 // LLINE Pulse Width - -#define VDP 479 // Vertical Display Period -#define VT 530 // Vertical Total -#define VPS 24 // LFRAME Pulse Start Position -#define FPS 23 // Vertical Display Period Start Positio -#define VPW 3 // LFRAME Pulse Width - -#define MAX_HZ_POSX HDP+1 -#define MAX_HZ_POSY VDP+1 - extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg; uint8_t bmp_public_buf[17 * 1024]; @@ -125,317 +105,7 @@ void SysTick_Callback() { } } -#if DISABLED(TFT_LVGL_UI_SPI) - - extern void LCD_IO_Init(uint8_t cs, uint8_t rs); - extern void LCD_IO_WriteData(uint16_t RegValue); - extern void LCD_IO_WriteReg(uint16_t Reg); - - extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); - void tft_set_cursor(uint16_t x, uint16_t y) { - LCD_IO_WriteReg(0x002A); - LCD_IO_WriteData(x >> 8); - LCD_IO_WriteData(x & 0x00FF); - LCD_IO_WriteData(x >> 8); - LCD_IO_WriteData(x & 0x00FF); - //ILI9488_WriteData(0x01); - //ILI9488_WriteData(0xDF); - LCD_IO_WriteReg(0x002B); - LCD_IO_WriteData(y >> 8); - LCD_IO_WriteData(y & 0x00FF); - LCD_IO_WriteData(y >> 8); - LCD_IO_WriteData(y & 0x00FF); - //ILI9488_WriteData(0x01); - //ILI9488_WriteData(0x3F); - } - - void LCD_WriteRAM_Prepare(void) { - #if 0 - switch (DeviceCode) { - case 0x9325: case 0x9328: case 0x8989: { - ClrCs - LCD->LCD_REG = R34; - SetCs - } break; - default: LCD_WrtReg(0x002C); - } - #else - LCD_IO_WriteReg(0x002C); - #endif - } - - void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { - //if (DeviceCode == 0x9488) { - if (x > (TFT_WIDTH) || y > (TFT_HEIGHT)) return; - //} - tft_set_cursor(x, y); - - LCD_WriteRAM_Prepare(); - //LCD_WriteRAM(point); - LCD_IO_WriteData(point); - } - - void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) { - /* Write 16-bit Index, then Write Reg */ - ClrCs - LCD_IO_WriteReg(LCD_Reg); - /* Write 16-bit Reg */ - LCD_IO_WriteData(LCD_RegValue); - SetCs - } - - void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh) { - uint16_t s_h, s_l, e_h, e_l; - uint16_t xEnd, yEnd; - xEnd = StartX + width; - yEnd = StartY + heigh - 1; - if (DeviceCode == 0x8989) { - /*LCD_WriteReg(0x0044, (StartX & 0xFF) | (xEnd << 8)); - LCD_WriteReg(0x0045, StartY); - LCD_WriteReg(0x0046, yEnd);*/ - LCD_WriteReg(0x0044, (StartY & 0xFF) | (yEnd << 8)); - LCD_WriteReg(0x0045, StartX); - LCD_WriteReg(0x0046, xEnd); - } - else if (DeviceCode == 0x9488) { - s_h = (StartX >> 8) & 0x00FF; - s_l = StartX & 0x00FF; - e_h = ((StartX + width - 1) >> 8) & 0x00FF; - e_l = (StartX + width - 1) & 0x00FF; - - LCD_IO_WriteReg(0x002A); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - - s_h = (StartY >> 8) & 0x00FF; - s_l = StartY & 0x00FF; - e_h = ((StartY + heigh - 1) >> 8) & 0x00FF; - e_l = (StartY + heigh - 1) & 0x00FF; - - LCD_IO_WriteReg(0x002B); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - } - else if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x1505)) { - /* LCD_WriteReg(0x0050, StartX); - LCD_WriteReg(0x0052, StartY); - LCD_WriteReg(0x0051, xEnd); - LCD_WriteReg(0x0053, yEnd);*/ - LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit - LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit - LCD_WriteReg(0x0052, (TFT_HEIGHT) - xEnd); - LCD_WriteReg(0x0053, (TFT_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit - - } - else { - s_h = (StartX >> 8) & 0xFF; - s_l = StartX & 0xFF; - e_h = ((StartX + width - 1) >> 8) & 0xFF; - e_l = (StartX + width - 1) & 0xFF; - - LCD_IO_WriteReg(0x2A); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - - s_h = (StartY >> 8) & 0xFF; - s_l = StartY & 0xFF; - e_h = ((StartY + heigh - 1) >> 8) & 0xFF; - e_l = (StartY + heigh - 1) & 0xFF; - - LCD_IO_WriteReg(0x2B); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - } - } - - void LCD_Clear(uint16_t Color) { - uint32_t index = 0; - unsigned int count; - - if (DeviceCode == 0x9488) { - tft_set_cursor(0, 0); - LCD_setWindowArea(0, 0, TFT_WIDTH, TFT_HEIGHT); - LCD_WriteRAM_Prepare(); - #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); - #else - //index = (TFT_HEIGHT) / 2 * (TFT_WIDTH); - for (index = 0; index < (TFT_HEIGHT) * (TFT_WIDTH); index++) - LCD_IO_WriteData(Color); - #endif - //LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); - //while(index --) LCD_IO_WriteData(Color); - } - else if (DeviceCode == 0x5761) { - LCD_IO_WriteReg(0x002A); - LCD_IO_WriteData(0); - LCD_IO_WriteData(0); - LCD_IO_WriteData(HDP >> 8); - LCD_IO_WriteData(HDP & 0x00FF); - LCD_IO_WriteReg(0x002B); - LCD_IO_WriteData(0); - LCD_IO_WriteData(0); - LCD_IO_WriteData(VDP >> 8); - LCD_IO_WriteData(VDP & 0x00FF); - LCD_IO_WriteReg(0x002C); - LCD_IO_WriteReg(0x002C); - for (count = 0; count < (HDP + 1) * (VDP + 1); count++) - LCD_IO_WriteData(Color); - } - else { - tft_set_cursor(0, 0); - LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ - for (index = 0; index < 76800; index++) - LCD_IO_WriteData(Color); - } - } - - #include HAL_PATH(../../HAL, tft/tft_fsmc.h) - extern TFT_IO tftio; - void fsmc_tft_init() { - uint16_t i; - - TERN_(HAS_LCD_CONTRAST, refresh_contrast()); - - #ifdef LCD_USE_DMA_FSMC - dma_init(FSMC_DMA_DEV); - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); - #endif - - LCD_IO_Init(FSMC_CS_PIN, FSMC_RS_PIN); - - _delay_ms(5); - - DeviceCode = tftio.GetID() & 0xFFFF; - // Chitu and others - if (DeviceCode == 0x8066) DeviceCode = 0x9488; - - if (DeviceCode == 0x9488) { - LCD_IO_WriteReg(0x00E0); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x000F); - LCD_IO_WriteData(0x000D); - LCD_IO_WriteData(0x001B); - LCD_IO_WriteData(0x000A); - LCD_IO_WriteData(0x003C); - LCD_IO_WriteData(0x0078); - LCD_IO_WriteData(0x004A); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x000E); - LCD_IO_WriteData(0x0009); - LCD_IO_WriteData(0x001B); - LCD_IO_WriteData(0x001E); - LCD_IO_WriteData(0x000F); - - LCD_IO_WriteReg(0x00E1); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0022); - LCD_IO_WriteData(0x0024); - LCD_IO_WriteData(0x0006); - LCD_IO_WriteData(0x0012); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x0036); - LCD_IO_WriteData(0x0047); - LCD_IO_WriteData(0x0047); - LCD_IO_WriteData(0x0006); - LCD_IO_WriteData(0x000A); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x0030); - LCD_IO_WriteData(0x0037); - LCD_IO_WriteData(0x000F); - - LCD_IO_WriteReg(0x00C0); - LCD_IO_WriteData(0x0010); - LCD_IO_WriteData(0x0010); - - LCD_IO_WriteReg(0x00C1); - LCD_IO_WriteData(0x0041); - - LCD_IO_WriteReg(0x00C5); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0022); - LCD_IO_WriteData(0x0080); - - LCD_IO_WriteReg(0x0036); - LCD_IO_WriteData(TERN(GRAPHICAL_TFT_ROTATE_180, 0xE8, 0x0068)); - - LCD_IO_WriteReg(0x003A); //Interface Mode Control - LCD_IO_WriteData(0x0055); - - LCD_IO_WriteReg(0x00B0); //Interface Mode Control - LCD_IO_WriteData(0x0000); - LCD_IO_WriteReg(0x00B1); //Frame rate 70HZ - LCD_IO_WriteData(0x00B0); - LCD_IO_WriteData(0x0011); - LCD_IO_WriteReg(0x00B4); - LCD_IO_WriteData(0x0002); - LCD_IO_WriteReg(0x00B6); //RGB/MCU Interface Control - LCD_IO_WriteData(0x0002); - LCD_IO_WriteData(0x0042); - - LCD_IO_WriteReg(0x00B7); - LCD_IO_WriteData(0x00C6); - - //WriteComm(0xBE); - //WriteData(0x00); - //WriteData(0x04); - - LCD_IO_WriteReg(0x00E9); - LCD_IO_WriteData(0x0000); - - LCD_IO_WriteReg(0x00F7); - LCD_IO_WriteData(0x00A9); - LCD_IO_WriteData(0x0051); - LCD_IO_WriteData(0x002C); - LCD_IO_WriteData(0x0082); - - LCD_IO_WriteReg(0x0011); - for (i = 0; i < 65535; i++) { /* do nothing */ } - LCD_IO_WriteReg(0x0029); - - LCD_setWindowArea(0, 0, TFT_WIDTH, TFT_HEIGHT); - - OUT_WRITE(LCD_BACKLIGHT_PIN, LOW); - LCD_Clear(0x0000); - - TERN_(HAS_LOGO_IN_FLASH, lcd_draw_logo()); - - OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); - delay(2000); - } - } - - extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); - - void lcd_draw_logo() { - LCD_setWindowArea(0, 0, TFT_WIDTH, TFT_HEIGHT); - LCD_WriteRAM_Prepare(); - - for (uint16_t i = 0; i < (TFT_HEIGHT); i ++) { - Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); - #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); - #else - int index = 0;,x_off = 0; - for (x_off = 0; x_off < TFT_WIDTH; x_off++) { - LCD_IO_WriteData((uint16_t)bmp_public_buf[index]); - index += 2; - } - #endif - } - } - -#endif // !TFT_LVGL_UI_SPI +extern uint8_t bmp_public_buf[17 * 1024]; void tft_lvgl_init() { @@ -448,12 +118,8 @@ void tft_lvgl_init() { disp_language_init(); //init tft first! - #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.spi_init(SPI_FULL_SPEED); - SPI_TFT.LCD_init(); - #else - fsmc_tft_init(); - #endif + SPI_TFT.spi_init(SPI_FULL_SPEED); + SPI_TFT.LCD_init(); //spi_flash_read_test(); #if ENABLED(SDSUPPORT) @@ -548,41 +214,18 @@ void tft_lvgl_init() { } void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { - #if ENABLED(TFT_LVGL_UI_SPI) - uint16_t i, width, height; + uint16_t i, width, height; - width = area->x2 - area->x1 + 1; - height = area->y2 - area->y1 + 1; + width = area->x2 - area->x1 + 1; + height = area->y2 - area->y1 + 1; - SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height); - for (i = 0; i < height; i++) { - SPI_TFT.tftio.WriteSequence((uint16_t*)(color_p + width * i), width); - } - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ + SPI_TFT.setWindow((uint16_t)area->x1, (uint16_t)area->y1, width, height); + for (i = 0; i < height; i++) { + SPI_TFT.tftio.WriteSequence((uint16_t*)(color_p + width * i), width); + } + lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ - W25QXX.init(SPI_QUARTER_SPEED); - - #else // !TFT_LVGL_UI_SPI - - #if 1 - uint16_t i, width, height; - //uint16_t clr_temp; - width = area->x2 - area->x1 + 1; - height = area->y2 - area->y1 + 1; - LCD_setWindowArea((uint16_t)area->x1, (uint16_t)area->y1, width, height); - LCD_WriteRAM_Prepare(); - for (i = 0; i < width * height - 2; i++) { - //clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) - //| ((uint16_t)color_p->ch.green << 5) - //| ((uint16_t)color_p->ch.blue)); - LCD_IO_WriteData(color_p->full); - color_p++; - } - - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ - #endif - - #endif // !TFT_LVGL_UI_SPI + W25QXX.init(SPI_QUARTER_SPEED); } #define TICK_CYCLE 1 @@ -599,7 +242,7 @@ static bool get_point(int16_t *x, int16_t *y) { *y = int16_t((int32_t(*y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; } - #if ENABLED(GRAPHICAL_TFT_ROTATE_180) + #if (TFT_ROTATION & TFT_ROTATE_180) *x = int16_t((TFT_WIDTH) - (int)(*x)); *y = int16_t((TFT_HEIGHT) - (int)(*y)); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index 7e24f948fd..727ab33aea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -32,7 +32,7 @@ #include -//#define GRAPHICAL_TFT_ROTATE_180 +//#define TFT_ROTATION TFT_ROTATE_180 #define USE_WIFI_FUNCTION 0 extern void tft_lvgl_init(); diff --git a/Marlin/src/lcd/scaled_tft.h b/Marlin/src/lcd/scaled_tft.h index be846f70a9..2c05e5f26d 100644 --- a/Marlin/src/lcd/scaled_tft.h +++ b/Marlin/src/lcd/scaled_tft.h @@ -43,8 +43,13 @@ #endif #ifndef TFT_PIXEL_OFFSET_X - #define TFT_PIXEL_OFFSET_X 48 + #if GRAPHICAL_TFT_UPSCALE == 2 + #define TFT_PIXEL_OFFSET_X 32 + #else + #define TFT_PIXEL_OFFSET_X 48 + #endif #endif #ifndef TFT_PIXEL_OFFSET_Y - #define TFT_PIXEL_OFFSET_Y 48 + // 32 is better for both 320x240 and 480x320 + #define TFT_PIXEL_OFFSET_Y 32 #endif diff --git a/Marlin/src/lcd/tft/tft.cpp b/Marlin/src/lcd/tft/tft.cpp index 81fe6788e7..fa3c2c241f 100644 --- a/Marlin/src/lcd/tft/tft.cpp +++ b/Marlin/src/lcd/tft/tft.cpp @@ -25,173 +25,16 @@ #if HAS_GRAPHICAL_TFT #include "tft.h" -#include "st7735.h" -#include "st7789v.h" -#include "st7796s.h" -#include "r65105.h" -#include "ili9328.h" -#include "ili9341.h" -#include "ili9488.h" //#define DEBUG_GRAPHICAL_TFT #define DEBUG_OUT ENABLED(DEBUG_GRAPHICAL_TFT) #include "../../core/debug_out.h" uint16_t TFT::buffer[]; -uint32_t TFT::lcd_id = 0xFFFFFFFF; void TFT::init() { - if (lcd_id != 0xFFFFFFFF) return; - io.Init(); - - #if TFT_DRIVER != AUTO - lcd_id = TFT_DRIVER; - #endif - - #if TFT_DRIVER == ST7735 - write_esc_sequence(st7735_init); - #elif TFT_DRIVER == ST7789 - write_esc_sequence(st7789v_init); - #elif TFT_DRIVER == ST7796 - write_esc_sequence(st7796s_init); - #elif TFT_DRIVER == R61505 - write_esc_sequence(r61505_init); - #elif TFT_DRIVER == ILI9328 - write_esc_sequence(ili9328_init); - #elif TFT_DRIVER == ILI9341 - write_esc_sequence(ili9341_init); - #elif TFT_DRIVER == ILI9488 - write_esc_sequence(ili9488_init); - #elif TFT_DRIVER == LERDGE_ST7796 - lcd_id = ST7796; - write_esc_sequence(lerdge_st7796s_init); - - #elif TFT_DRIVER == AUTO // autodetect - - lcd_id = io.GetID() & 0xFFFF; - - switch (lcd_id) { - case ST7796: // ST7796S 480x320 - DEBUG_ECHO_MSG(" ST7796S"); - write_esc_sequence(st7796s_init); - break; - case ST7789: // ST7789V 320x240 - DEBUG_ECHO_MSG(" ST7789V"); - write_esc_sequence(st7789v_init); - break; - case ST7735: // ST7735 160x128 - DEBUG_ECHO_MSG(" ST7735"); - write_esc_sequence(st7735_init); - break; - case R61505: // R61505U 320x240 - DEBUG_ECHO_MSG(" R61505U"); - write_esc_sequence(r61505_init); - break; - case ILI9328: // ILI9328 320x240 - DEBUG_ECHO_MSG(" ILI9328"); - write_esc_sequence(ili9328_init); - break; - case ILI9341: // ILI9341 320x240 - DEBUG_ECHO_MSG(" ILI9341"); - write_esc_sequence(ili9341_init); - break; - case ILI9488: // ILI9488 480x320 - DEBUG_ECHO_MSG(" ILI9488"); - write_esc_sequence(ili9488_init); - break; - default: - lcd_id = 0; - } - #else - #error Unsupported TFT driver - #endif -} - -void TFT::set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #ifdef OFFSET_X - Xmin += OFFSET_X; Xmax += OFFSET_X; - #endif - #ifdef OFFSET_Y - Ymin += OFFSET_Y; Ymax += OFFSET_Y; - #endif - - switch (lcd_id) { - case ST7735: // ST7735 160x128 - case ST7789: // ST7789V 320x240 - case ST7796: // ST7796 480x320 - case ILI9341: // ILI9341 320x240 - case ILI9488: // ILI9488 480x320 - io.DataTransferBegin(DATASIZE_8BIT); - - // CASET: Column Address Set - io.WriteReg(ILI9341_CASET); - io.WriteData((Xmin >> 8) & 0xFF); - io.WriteData(Xmin & 0xFF); - io.WriteData((Xmax >> 8) & 0xFF); - io.WriteData(Xmax & 0xFF); - - // RASET: Row Address Set - io.WriteReg(ILI9341_PASET); - io.WriteData((Ymin >> 8) & 0xFF); - io.WriteData(Ymin & 0xFF); - io.WriteData((Ymax >> 8) & 0xFF); - io.WriteData(Ymax & 0xFF); - - // RAMWR: Memory Write - io.WriteReg(ILI9341_RAMWR); - break; - case R61505: // R61505U 320x240 - case ILI9328: // ILI9328 320x240 - io.DataTransferBegin(DATASIZE_16BIT); - - // Mind the mess: with landscape screen orientation 'Horizontal' is Y and 'Vertical' is X - io.WriteReg(ILI9328_HASTART); - io.WriteData(Ymin); - io.WriteReg(ILI9328_HAEND); - io.WriteData(Ymax); - io.WriteReg(ILI9328_VASTART); - io.WriteData(Xmin); - io.WriteReg(ILI9328_VAEND); - io.WriteData(Xmax); - - io.WriteReg(ILI9328_HASET); - io.WriteData(Ymin); - io.WriteReg(ILI9328_VASET); - io.WriteData(Xmin); - - io.WriteReg(ILI9328_RAMWR); - break; - default: - break; - } - - io.DataTransferEnd(); -} - -void TFT::write_esc_sequence(const uint16_t *Sequence) { - uint16_t dataWidth, data; - - dataWidth = *Sequence++; - io.DataTransferBegin(dataWidth); - - for (;;) { - data = *Sequence++; - if (data != 0xFFFF) { - io.WriteData(data); - continue; - } - data = *Sequence++; - if (data == 0x7FFF) return; - if (data == 0xFFFF) - io.WriteData(0xFFFF); - else if (data & 0x8000) - delay(data & 0x7FFF); - else if ((data & 0xFF00) == 0) - io.WriteReg(data); - } - - io.DataTransferEnd(); + io.InitTFT(); } TFT tft; diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h index 6d429109c8..ed3d5e35c1 100644 --- a/Marlin/src/lcd/tft/tft.h +++ b/Marlin/src/lcd/tft/tft.h @@ -26,7 +26,7 @@ #include "tft_color.h" #include "tft_string.h" #include "tft_image.h" -#include "tft_io.h" +#include "../tft_io/tft_io.h" #include "../../inc/MarlinConfig.h" @@ -40,20 +40,6 @@ #error "Unsupported display resolution!" #endif -#define ST7735 0x89F0 -#define ST7789 0x8552 -#define ST7796 0x7796 -#define R61505 0x1505 -#define ILI9328 0x9328 -#define ILI9341 0x9341 -#define ILI9488 0x9488 -#define LERDGE_ST7796 0xFFFE -#define AUTO 0xFFFF - -#ifndef TFT_DRIVER - #define TFT_DRIVER AUTO -#endif - #ifndef TFT_BUFFER_SIZE #ifdef STM32F103xB #define TFT_BUFFER_SIZE 1024 @@ -71,14 +57,8 @@ #error "TFT_BUFFER_SIZE can not exceed 65535" #endif -#define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x -#define ESC_DELAY(x) 0xFFFF, 0x8000 | (x & 0x7FFF) -#define ESC_END 0xFFFF, 0x7FFF -#define ESC_FFFF 0xFFFF, 0xFFFF - class TFT { private: - static uint32_t lcd_id; static TFT_String string; static TFT_IO io; @@ -91,13 +71,11 @@ class TFT { static inline void set_font(const uint8_t *Font) { string.set_font(Font); } static inline void add_glyphs(const uint8_t *Font) { string.add_glyphs(Font); } - static void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax); - static void write_esc_sequence(const uint16_t *Sequence); - static inline bool is_busy() { return io.isBusy(); } static inline void abort() { io.Abort(); } static inline void write_multiple(uint16_t Data, uint16_t Count) { io.WriteMultiple(Data, Count); } static inline void write_sequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); } + static inline void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { io.set_window(Xmin, Ymin, Xmax, Ymax); } static inline void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.fill(x, y, width, height, color); } static inline void canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { queue.canvas(x, y, width, height); } diff --git a/Marlin/src/lcd/tft/tft_io.h b/Marlin/src/lcd/tft/tft_io.h deleted file mode 100644 index bffe92b0ff..0000000000 --- a/Marlin/src/lcd/tft/tft_io.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfig.h" - -#if HAS_SPI_TFT - #include HAL_PATH(../../HAL, tft/tft_spi.h) -#elif HAS_FSMC_TFT - #include HAL_PATH(../../HAL, tft/tft_fsmc.h) -#endif diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 80c65f074a..2124a42e28 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -295,6 +295,10 @@ bool Touch::get_point(int16_t *x, int16_t *y) { if (is_touched && calibration.orientation != TOUCH_ORIENTATION_NONE) { *x = int16_t((int32_t(*x) * calibration.x) >> 16) + calibration.offset_x; *y = int16_t((int32_t(*y) * calibration.y) >> 16) + calibration.offset_y; + #if (TFT_ROTATION & TFT_ROTATE_180) + *x = TFT_WIDTH - *x; + *y = TFT_HEIGHT - *y; + #endif } return is_touched; } diff --git a/Marlin/src/lcd/tft/ili9328.h b/Marlin/src/lcd/tft_io/ili9328.h similarity index 87% rename from Marlin/src/lcd/tft/ili9328.h rename to Marlin/src/lcd/tft_io/ili9328.h index 85edfa7bee..818dd05b34 100644 --- a/Marlin/src/lcd/tft/ili9328.h +++ b/Marlin/src/lcd/tft_io/ili9328.h @@ -21,7 +21,7 @@ */ #pragma once -#include "tft.h" +#include "tft_io.h" #include "../../inc/MarlinConfig.h" @@ -40,8 +40,29 @@ #define ILI9328_ETMOD_AM 0x0008 // 0 - Horizontal / 1 - Vertical // MKS Robin TFT v1.1 - 320x240 ; Cable on the left side -#define ILI9328_DRVCTL_DATA ILI9328_DRVCTL_SS -#define ILI9328_ETMOD_DATA ILI9328_ETMOD_BGR | ILI9328_ETMOD_ID1 | ILI9328_ETMOD_ID0 | ILI9328_ETMOD_AM + +#if TFT_ROTATION == TFT_ROTATE_180 + #define ILI9328_DRVCTL_DATA 0x0000 + #define ILI9328_GATE_SCANCTL1_DATA 0xA700 +#else + #define ILI9328_DRVCTL_DATA ILI9328_DRVCTL_SS + #define ILI9328_GATE_SCANCTL1_DATA 0x2700 +#endif + +// #define ILI9328_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9328_ETMOD_AM) | \ +// IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9328_ETMOD_ID1) | \ +// IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9328_ETMOD_ID0) + +#define ILI9328_ETMOD_ORIENTATION (ILI9328_ETMOD_AM | ILI9328_ETMOD_ID1 | ILI9328_ETMOD_ID0) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define ILI9328_ETMOD_COLOR ILI9328_ETMOD_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define ILI9328_ETMOD_COLOR ILI9328_ETMOD_RGB +#endif + +#define ILI9328_ETMOD_DATA (ILI9328_ETMOD_ORIENTATION) | (ILI9328_ETMOD_COLOR) + #define ILI9328_RDDID 0x00 // ID code - 0x9328 #define ILI9328_DRVCTL 0x01 // Driver Output Control @@ -134,7 +155,7 @@ static const uint16_t ili9328_init[] = { ESC_REG(ILI9328_PWCTRL7), 0x0004, ESC_REG(ILI9328_FRMCTR), 0x000D, ESC_DELAY(50), - ESC_REG(ILI9328_GATE_SCANCTL1), 0x2700, + ESC_REG(ILI9328_GATE_SCANCTL1), ILI9328_GATE_SCANCTL1_DATA, ESC_REG(ILI9328_GATE_SCANCTL2), 0x0001, ESC_REG(ILI9328_GATE_SCANCTL3), 0x0000, ESC_REG(ILI9328_PLTPOS1), 0x0000, diff --git a/Marlin/src/lcd/tft/ili9341.h b/Marlin/src/lcd/tft_io/ili9341.h similarity index 94% rename from Marlin/src/lcd/tft/ili9341.h rename to Marlin/src/lcd/tft_io/ili9341.h index d4a493412f..dda326df6d 100644 --- a/Marlin/src/lcd/tft/ili9341.h +++ b/Marlin/src/lcd/tft_io/ili9341.h @@ -21,7 +21,7 @@ */ #pragma once -#include "tft.h" +#include "tft_io.h" #include "../../inc/MarlinConfig.h" @@ -38,13 +38,17 @@ #define ILI9341_ORIENTATION_LEFT ILI9341_MADCTL_MY | ILI9341_MADCTL_MX | ILI9341_MADCTL_MV // 320x240 ; Cable on the left side #define ILI9341_ORIENTATION_DOWN ILI9341_MADCTL_MX // 240x320 ; Cable on the upper side -#ifndef ILI9341_COLOR_RGB - #define ILI9341_COLOR_BGR +#define ILI9341_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9341_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9341_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9341_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define ILI9341_COLOR ILI9341_MADCTL_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define ILI9341_COLOR ILI9341_MADCTL_RGB #endif -#ifndef ILI9341_ORIENTATION - #define ILI9341_ORIENTATION ILI9341_ORIENTATION_LEFT -#endif -#define ILI9341_MADCTL_DATA (ILI9341_ORIENTATION | TERN(ILI9341_COLOR_BGR, ILI9341_MADCTL_BGR, ILI9341_MADCTL_RGB)) + +#define ILI9341_MADCTL_DATA (ILI9341_ORIENTATION) | (ILI9341_COLOR) #define ILI9341_NOP 0x00 // No Operation #define ILI9341_SWRESET 0x01 // Software Reset diff --git a/Marlin/src/lcd/tft/ili9488.h b/Marlin/src/lcd/tft_io/ili9488.h similarity index 93% rename from Marlin/src/lcd/tft/ili9488.h rename to Marlin/src/lcd/tft_io/ili9488.h index 19fdc78e0a..e71c0d16d7 100644 --- a/Marlin/src/lcd/tft/ili9488.h +++ b/Marlin/src/lcd/tft_io/ili9488.h @@ -21,7 +21,7 @@ */ #pragma once -#include "tft.h" +#include "tft_io.h" #include "../../inc/MarlinConfig.h" @@ -38,13 +38,17 @@ #define ILI9488_ORIENTATION_LEFT ILI9488_MADCTL_MY | ILI9488_MADCTL_MX | ILI9488_MADCTL_MV // 480x320 ; Cable on the left side #define ILI9488_ORIENTATION_DOWN ILI9488_MADCTL_MX // 320x480 ; Cable on the upper side -#ifndef ILI9488_COLOR_RGB - #define ILI9488_COLOR_BGR +#define ILI9488_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9488_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9488_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9488_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define ILI9488_COLOR ILI9488_MADCTL_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define ILI9488_COLOR ILI9488_MADCTL_RGB #endif -#ifndef ILI9488_ORIENTATION - #define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT -#endif -#define ILI9488_MADCTL_DATA (ILI9488_ORIENTATION | TERN(ILI9488_COLOR_BGR, ILI9488_MADCTL_BGR, ILI9488_MADCTL_RGB)) + +#define ILI9488_MADCTL_DATA (ILI9488_ORIENTATION) | (ILI9488_COLOR) #define ILI9488_NOP 0x00 // No Operation #define ILI9488_SWRESET 0x01 // Software Reset diff --git a/Marlin/src/lcd/tft/r65105.h b/Marlin/src/lcd/tft_io/r65105.h similarity index 87% rename from Marlin/src/lcd/tft/r65105.h rename to Marlin/src/lcd/tft_io/r65105.h index 8d073f5d0d..a813c3260b 100644 --- a/Marlin/src/lcd/tft/r65105.h +++ b/Marlin/src/lcd/tft_io/r65105.h @@ -21,7 +21,7 @@ */ #pragma once -#include "tft.h" +#include "tft_io.h" #include "../../inc/MarlinConfig.h" @@ -42,9 +42,28 @@ #define R61505_DRVCTRL_GS 0x8000 // Gate Scan direction // MKS Robin TFT v1.1 - 320x240 ; Cable on the left side -#define R61505_DRVCTL_DATA R61505_DRVCTL_SS -#define R61505_ETMOD_DATA R61505_ETMOD_BGR | R61505_ETMOD_ID1 | R61505_ETMOD_ID0 | R61505_ETMOD_AM -#define R61505_DRVCTRL_GSDIR R61505_DRVCTRL_GS + +#if TFT_ROTATION == TFT_ROTATE_180 + #define R61505_DRVCTL_DATA 0x0000 + #define R61505_DRVCTRL_DATA (0x2700 | R61505_DRVCTRL_GS) +#else + #define R61505_DRVCTL_DATA R61505_DRVCTL_SS + #define R61505_DRVCTRL_DATA 0x2700 +#endif + +// #define R61505_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, R61505_ETMOD_AM) | \ +// IF_0((TFT_ORIENTATION) & TFT_INVERT_X, R61505_ETMOD_ID0) | \ +// IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, R61505_ETMOD_ID1) + +#define R61505_ETMOD_ORIENTATION (R61505_ETMOD_AM | R61505_ETMOD_ID0 | R61505_ETMOD_ID1) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define R61505_ETMOD_COLOR R61505_ETMOD_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define R61505_ETMOD_COLOR R61505_ETMOD_RGB +#endif + +#define R61505_ETMOD_DATA (R61505_ETMOD_ORIENTATION) | (R61505_ETMOD_COLOR) #define R61505_RDDID 0x00 // ID code - 0x1505 @@ -141,7 +160,7 @@ static const uint16_t r61505_init[] = { ESC_REG(R61505_GAMCTRL9), 0x0700, ESC_REG(R61505_GAMCTRLA), 0x0A1F, - ESC_REG(R61505_DRVCTRL), R61505_DRVCTRL_GSDIR | 0x2700, + ESC_REG(R61505_DRVCTRL), R61505_DRVCTRL_DATA, ESC_REG(R61505_BASE_IMAGE_CTRL), 0x0001, ESC_REG(R61505_VSCROLL_CTRL), 0x0000, diff --git a/Marlin/src/lcd/tft_io/ssd1963.h b/Marlin/src/lcd/tft_io/ssd1963.h new file mode 100644 index 0000000000..4953a96233 --- /dev/null +++ b/Marlin/src/lcd/tft_io/ssd1963.h @@ -0,0 +1,131 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft_io.h" + +#include "../../inc/MarlinConfig.h" + +#define SSD1963_MADCTL_MY 0x80 // Row Address Order +#define SSD1963_MADCTL_MX 0x40 // Column Address Order +#define SSD1963_MADCTL_MV 0x20 // Row/Column Exchange +#define SSD1963_MADCTL_MH 0x10 // Horizontal Refresh Order +#define SSD1963_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define SSD1963_MADCTL_RGB 0x00 +#define SSD1963_MADCTL_ML 0x04 // Vertical Refresh Order +#define SSD1963_MADCTL_FH 0x02 // Flip Horizontal +#define SSD1963_MADCTL_FV 0x01 // Flip Vertical + +#define SSD1963_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, SSD1963_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, SSD1963_MADCTL_FH) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, SSD1963_MADCTL_FV) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define SSD1963_COLOR SSD1963_MADCTL_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define SSD1963_COLOR SSD1963_MADCTL_RGB +#endif + +#define SSD1963_MADCTL_DATA (SSD1963_ORIENTATION) | (SSD1963_COLOR) + +#define SSD1963_NOP 0x00 // No Operation +#define SSD1963_SWRESET 0x01 // Software reset +#define SSD1963_RDDPM 0x0A // Read Display Power Mode +#define SSD1963_RDDMADCTL 0x0B // Read Display MADCTL +#define SSD1963_RDDCOLMOD 0x0C // Read Display Pixel Format +#define SSD1963_RDDIM 0x0D // Read Display Image Mode +#define SSD1963_RDDSM 0x0E // Read Display Signal Mode +#define SSD1963_SLPIN 0x10 // Sleep In +#define SSD1963_SLPOUT 0x11 // Sleep Out +#define SSD1963_PTLON 0x12 // Partial Display Mode On +#define SSD1963_NORON 0x13 // Normal Display Mode On +#define SSD1963_INVOFF 0x20 // Display Inversion Off +#define SSD1963_INVON 0x21 // Display Inversion On +#define SSD1963_GAMSET 0x26 // Gamma Set +#define SSD1963_DISPOFF 0x28 // Display Off +#define SSD1963_DISPON 0x29 // Display On +#define SSD1963_CASET 0x2A // Column Address Set +#define SSD1963_RASET 0x2B // Row Address Set +#define SSD1963_RAMWR 0x2C // Memory Write +#define SSD1963_RAMRD 0x2E // Memory Read +#define SSD1963_PTLAR 0x30 // Partial Area +#define SSD1963_VSCRDEF 0x33 // Vertical Scrolling Definition +#define SSD1963_TEOFF 0x34 // Tearing Effect Line OFF +#define SSD1963_TEON 0x35 // Tearing Effect Line ON +#define SSD1963_MADCTL 0x36 // Memory Data Access Control +#define SSD1963_VSCSAD 0x37 // Vertical Scroll Start Address of RAM +#define SSD1963_IDMOFF 0x38 // Idle Mode Off +#define SSD1963_IDMON 0x39 // Idle Mode On +#define SSD1963_WRMEMC 0x3C // Write Memory Continue +#define SSD1963_RDMEMC 0x3E // Read Memory Continue +#define SSD1963_STE 0x44 // Set Tear Scanline +#define SSD1963_GSCAN 0x45 // Get Scanline +#define SSD1963_WRDISBV 0x51 // Write Display Brightness +#define SSD1963_RDDISBV 0x52 // Read Display Brightness +#define SSD1963_WRCTRLD 0x53 // Write CTRL Display +#define SSD1963_RDCTRLD 0x54 // Read CTRL Value Display +#define SSD1963_WRCACE 0x55 // Write Content Adaptive Brightness Control and Color Enhancement +#define SSD1963_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define SSD1963_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define SSD1963_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define SSD1963_RDABCSDR 0x68 // Read Automatic Brightness Control Self-Diagnostic Result +#define SSD1963_RDDDB 0xA1 // Read Device Descriptor Block +#define SSD1963_SLCDMODE 0xB0 // Set the LCD panel mode and resolution +#define SSD1963_SHSYNC 0xB4 // Set HSYNC +#define SSD1963_GHSYNC 0xB5 // Get HSYNC +#define SSD1963_SVSYNC 0xB6 // Set VSYNC +#define SSD1963_GVSYNC 0xB7 // Get VSYNC +#define SSD1963_SGPIOCFG 0xB8 // Set GPIO Conf +#define SSD1963_SGPIOV 0xBA // Set GPIO Value +#define SSD1963_SPWMCFG 0xBE // Set PWM Conf +#define SSD1963_GPWMCFG 0xBF // Get PWM Conf +#define SSD1963_SDBCCFG 0xD0 // Set Dynamic Back Light Config +#define SSD1963_GDBCCFG 0xD1 // Get Dynamic Back Light Config +#define SSD1963_PLLON 0xE0 // PLL Enable +#define SSD1963_PLLMN 0xE2 // Set PLL Multiplier +#define SSD1963_SLSHIFT 0xE6 // Set the LSHIFT (pixel clock) frequency +#define SSD1963_COLMOD 0xF0 // Interface Pixel Format + +static const uint16_t ssd1963_init[] = { + DATASIZE_8BIT, + ESC_REG(SSD1963_PLLMN), 0x0023, 0x0002, 0x0054, + ESC_REG(SSD1963_PLLON), 0x0001, ESC_DELAY(10), + ESC_REG(SSD1963_PLLON), 0x0003, ESC_DELAY(10), + ESC_REG(SSD1963_SWRESET), ESC_DELAY(100), + + ESC_REG(SSD1963_SLSHIFT), 0x0001, 0x001F, 0x00FF, + ESC_REG(SSD1963_SLCDMODE), 0x0020, 0x0000, 0x0001, 0x00DF, 0x0001, 0x000F, 0x0000, + ESC_REG(SSD1963_SHSYNC), 0x0002, 0x0013, 0x0000, 0x0008, 0x002B, 0x0000, 0x0002, 0x0000, + ESC_REG(SSD1963_SVSYNC), 0x0001, 0x0020, 0x0000, 0x0004, 0x000C, 0x0000, 0x0002, + ESC_REG(SSD1963_SGPIOV), 0x000F, + ESC_REG(SSD1963_SGPIOCFG), 0x0007, 0x0001, + + ESC_REG(SSD1963_MADCTL), SSD1963_MADCTL_DATA, + ESC_REG(SSD1963_COLMOD), 0x0003, ESC_DELAY(1),//RBG 565 + + ESC_REG(SSD1963_NORON), + ESC_REG(SSD1963_DISPON), + + ESC_REG(SSD1963_SPWMCFG), 0x0006, 0x00f0, 0x0001, 0x00f0, 0x0000, 0x0000, + ESC_REG(SSD1963_SDBCCFG), 0x000D, + ESC_END +}; diff --git a/Marlin/src/lcd/tft/st7735.h b/Marlin/src/lcd/tft_io/st7735.h similarity index 92% rename from Marlin/src/lcd/tft/st7735.h rename to Marlin/src/lcd/tft_io/st7735.h index 62f93d5044..1b0d23b6c4 100644 --- a/Marlin/src/lcd/tft/st7735.h +++ b/Marlin/src/lcd/tft_io/st7735.h @@ -21,7 +21,7 @@ */ #pragma once -#include "tft.h" +#include "tft_io.h" #include "../../inc/MarlinConfig.h" @@ -38,9 +38,17 @@ #define ST7735_ORIENTATION_LEFT ST7735_MADCTL_MV | ST7735_MADCTL_MX // 160x128 ; Cable on the left side #define ST7735_ORIENTATION_DOWN ST7735_MADCTL_MX | ST7735_MADCTL_MY // 128x160 ; Cable on the lower side -//#define ST7735_COLOR_BGR -#define ST7735_ORIENTATION ST7735_ORIENTATION_DOWN -#define ST7735_MADCTL_DATA (ST7735_ORIENTATION | TERN(ST7735_COLOR_BGR, ST7735_MADCTL_BGR, ST7735_MADCTL_RGB)) +#define ST7735_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7735_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7735_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7735_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_RGB + #define ST7735_COLOR ST7735_MADCTL_RGB +#elif TFT_COLOR == TFT_COLOR_BGR + #define ST7735_COLOR ST7735_MADCTL_BGR +#endif + +#define ST7735_MADCTL_DATA (ST7735_ORIENTATION) | (ST7735_COLOR) #define ST7735_NOP 0x00 // No Operation #define ST7735_SWRESET 0x01 // Software reset diff --git a/Marlin/src/lcd/tft/st7789v.h b/Marlin/src/lcd/tft_io/st7789v.h similarity index 93% rename from Marlin/src/lcd/tft/st7789v.h rename to Marlin/src/lcd/tft_io/st7789v.h index 67da67966d..d0cf969c66 100644 --- a/Marlin/src/lcd/tft/st7789v.h +++ b/Marlin/src/lcd/tft_io/st7789v.h @@ -21,7 +21,7 @@ */ #pragma once -#include "tft.h" +#include "tft_io.h" #include "../../inc/MarlinConfig.h" @@ -38,11 +38,17 @@ #define ST7789V_ORIENTATION_LEFT ST7789V_MADCTL_MY | ST7789V_MADCTL_MV // 320x240 ; Cable on the left side #define ST7789V_ORIENTATION_DOWN 0 // 240x320 ; Cable on the lower side -//#define ST7789V_COLOR_BGR -#ifndef ST7789V_ORIENTATION - #define ST7789V_ORIENTATION ST7789V_ORIENTATION_LEFT +#define ST7789V_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7789V_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7789V_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7789V_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_RGB + #define ST7789V_COLOR ST7789V_MADCTL_RGB +#elif TFT_COLOR == TFT_COLOR_BGR + #define ST7789V_COLOR ST7789V_MADCTL_BGR #endif -#define ST7789V_MADCTL_DATA (ST7789V_ORIENTATION | TERN(ST7789V_COLOR_BGR, ST7789V_MADCTL_BGR, ST7789V_MADCTL_RGB)) + +#define ST7789V_MADCTL_DATA (ST7789V_ORIENTATION) | (ST7789V_COLOR) #define ST7789V_NOP 0x00 // No Operation #define ST7789V_SWRESET 0x01 // Software reset diff --git a/Marlin/src/lcd/tft/st7796s.h b/Marlin/src/lcd/tft_io/st7796s.h similarity index 93% rename from Marlin/src/lcd/tft/st7796s.h rename to Marlin/src/lcd/tft_io/st7796s.h index 10452293de..8653a49ca2 100644 --- a/Marlin/src/lcd/tft/st7796s.h +++ b/Marlin/src/lcd/tft_io/st7796s.h @@ -21,7 +21,7 @@ */ #pragma once -#include "tft.h" +#include "tft_io.h" #include "../../inc/MarlinConfig.h" @@ -33,9 +33,17 @@ #define ST7796S_MADCTL_RGB 0x00 #define ST7796S_MADCTL_MH 0x04 // Horizontal Refresh Order -#define ST7796S_COLOR_BGR -#define ST7796S_ORIENTATION ST7796S_MADCTL_MV -#define ST7796S_MADCTL_DATA (ST7796S_ORIENTATION | TERN(ST7796S_COLOR_BGR, ST7796S_MADCTL_BGR, ST7796S_MADCTL_RGB)) +#define ST7796S_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7796S_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7796S_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7796S_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define ST7796S_COLOR ST7796S_MADCTL_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define ST7796S_COLOR ST7796S_MADCTL_RGB +#endif + +#define ST7796S_MADCTL_DATA (ST7796S_ORIENTATION) | (ST7796S_COLOR) #define ST7796S_NOP 0x00 // No Operation #define ST7796S_SWRESET 0x01 // Software reset diff --git a/Marlin/src/lcd/tft_io/tft_io.cpp b/Marlin/src/lcd/tft_io/tft_io.cpp new file mode 100644 index 0000000000..cd535458a1 --- /dev/null +++ b/Marlin/src/lcd/tft_io/tft_io.cpp @@ -0,0 +1,226 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "tft_io.h" + +#if HAS_SPI_TFT || HAS_FSMC_TFT + +#include "st7735.h" +#include "st7789v.h" +#include "st7796s.h" +#include "r65105.h" +#include "ili9328.h" +#include "ili9341.h" +#include "ili9488.h" +#include "ssd1963.h" + +#define DEBUG_OUT ENABLED(DEBUG_GRAPHICAL_TFT) +#include "../../core/debug_out.h" + +TFT_IO_DRIVER TFT_IO::io; +uint32_t TFT_IO::lcd_id = 0xFFFFFFFF; + +void TFT_IO::InitTFT() { +if (lcd_id != 0xFFFFFFFF) return; + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, LOW); + #endif + + #if PIN_EXISTS(TFT_RESET) + OUT_WRITE(TFT_RESET_PIN, HIGH); + delay(10); + OUT_WRITE(TFT_RESET_PIN, LOW); + delay(10); + OUT_WRITE(TFT_RESET_PIN, HIGH); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); + #endif + + // io.Init(); + delay(100); + + #if TFT_DRIVER != AUTO + lcd_id = TFT_DRIVER; + #endif + + #if TFT_DRIVER == ST7735 + write_esc_sequence(st7735_init); + #elif TFT_DRIVER == SSD1963 + write_esc_sequence(ssd1963_init); + #elif TFT_DRIVER == ST7789 + write_esc_sequence(st7789v_init); + #elif TFT_DRIVER == ST7796 + write_esc_sequence(st7796s_init); + #elif TFT_DRIVER == R61505 + write_esc_sequence(r61505_init); + #elif TFT_DRIVER == ILI9328 + write_esc_sequence(ili9328_init); + #elif TFT_DRIVER == ILI9341 + write_esc_sequence(ili9341_init); + #elif TFT_DRIVER == ILI9488 + write_esc_sequence(ili9488_init); + #elif TFT_DRIVER == LERDGE_ST7796 + lcd_id = ST7796; + write_esc_sequence(lerdge_st7796s_init); + + #elif TFT_DRIVER == AUTO // autodetect + + lcd_id = io.GetID() & 0xFFFF; + + switch (lcd_id) { + case ST7796: // ST7796S 480x320 + DEBUG_ECHO_MSG(" ST7796S"); + write_esc_sequence(st7796s_init); + break; + case ST7789: // ST7789V 320x240 + DEBUG_ECHO_MSG(" ST7789V"); + write_esc_sequence(st7789v_init); + break; + case SSD1963: // SSD1963 + DEBUG_ECHO_MSG(" SSD1963"); + write_esc_sequence(ssd1963_init); + break; + case ST7735: // ST7735 160x128 + DEBUG_ECHO_MSG(" ST7735"); + write_esc_sequence(st7735_init); + break; + case R61505: // R61505U 320x240 + DEBUG_ECHO_MSG(" R61505U"); + write_esc_sequence(r61505_init); + break; + case ILI9328: // ILI9328 320x240 + DEBUG_ECHO_MSG(" ILI9328"); + write_esc_sequence(ili9328_init); + break; + case ILI9341: // ILI9341 320x240 + DEBUG_ECHO_MSG(" ILI9341"); + write_esc_sequence(ili9341_init); + break; + case ILI9488: // ILI9488 480x320 + case ILI9488_ID1: // 0x8066 ILI9488 480x320 + DEBUG_ECHO_MSG(" ILI9488"); + write_esc_sequence(ili9488_init); + break; + default: + lcd_id = 0; + } + #else + #error Unsupported TFT driver + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif +} + +void TFT_IO::set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { + #ifdef OFFSET_X + Xmin += OFFSET_X; Xmax += OFFSET_X; + #endif + #ifdef OFFSET_Y + Ymin += OFFSET_Y; Ymax += OFFSET_Y; + #endif + + switch (lcd_id) { + case ST7735: // ST7735 160x128 + case ST7789: // ST7789V 320x240 + case ST7796: // ST7796 480x320 + case ILI9341: // ILI9341 320x240 + case ILI9488: // ILI9488 480x320 + case SSD1963: // SSD1963 + case ILI9488_ID1: // 0x8066 ILI9488 480x320 + io.DataTransferBegin(DATASIZE_8BIT); + + // CASET: Column Address Set + io.WriteReg(ILI9341_CASET); + io.WriteData((Xmin >> 8) & 0xFF); + io.WriteData(Xmin & 0xFF); + io.WriteData((Xmax >> 8) & 0xFF); + io.WriteData(Xmax & 0xFF); + + // RASET: Row Address Set + io.WriteReg(ILI9341_PASET); + io.WriteData((Ymin >> 8) & 0xFF); + io.WriteData(Ymin & 0xFF); + io.WriteData((Ymax >> 8) & 0xFF); + io.WriteData(Ymax & 0xFF); + + // RAMWR: Memory Write + io.WriteReg(ILI9341_RAMWR); + break; + case R61505: // R61505U 320x240 + case ILI9328: // ILI9328 320x240 + io.DataTransferBegin(DATASIZE_16BIT); + + // Mind the mess: with landscape screen orientation 'Horizontal' is Y and 'Vertical' is X + io.WriteReg(ILI9328_HASTART); + io.WriteData(Ymin); + io.WriteReg(ILI9328_HAEND); + io.WriteData(Ymax); + io.WriteReg(ILI9328_VASTART); + io.WriteData(Xmin); + io.WriteReg(ILI9328_VAEND); + io.WriteData(Xmax); + + io.WriteReg(ILI9328_HASET); + io.WriteData(Ymin); + io.WriteReg(ILI9328_VASET); + io.WriteData(Xmin); + + io.WriteReg(ILI9328_RAMWR); + break; + default: + break; + } + + io.DataTransferEnd(); +} + +void TFT_IO::write_esc_sequence(const uint16_t *Sequence) { + uint16_t dataWidth, data; + + dataWidth = *Sequence++; + io.DataTransferBegin(dataWidth); + + for (;;) { + data = *Sequence++; + if (data != 0xFFFF) { + io.WriteData(data); + continue; + } + data = *Sequence++; + if (data == 0x7FFF) return; + if (data == 0xFFFF) + io.WriteData(0xFFFF); + else if (data & 0x8000) + delay(data & 0x7FFF); + else if ((data & 0xFF00) == 0) + io.WriteReg(data); + } + + io.DataTransferEnd(); +} + +#endif // HAS_SPI_TFT || HAS_FSMC_TFT diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h new file mode 100644 index 0000000000..63d6936ac0 --- /dev/null +++ b/Marlin/src/lcd/tft_io/tft_io.h @@ -0,0 +1,124 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT || HAS_FSMC_TFT + +#if HAS_SPI_TFT + #include HAL_PATH(../../HAL, tft/tft_spi.h) +#elif HAS_FSMC_TFT + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) +#else + #error "TFT IO only supports SPI or FSMC interface" +#endif + +#define TFT_EXCHANGE_XY (1UL << 1) +#define TFT_INVERT_X (1UL << 2) +#define TFT_INVERT_Y (1UL << 3) + +#define TFT_NO_ROTATION (0x00) +#define TFT_ROTATE_90 (TFT_EXCHANGE_XY | TFT_INVERT_X) +#define TFT_ROTATE_180 (TFT_INVERT_X | TFT_INVERT_Y) +#define TFT_ROTATE_270 (TFT_EXCHANGE_XY | TFT_INVERT_Y) + +#define TFT_MIRROR_X (TFT_INVERT_Y) +#define TFT_MIRROR_Y (TFT_INVERT_X) + +#define TFT_ROTATE_90_MIRROR_X (TFT_ROTATE_90 ^ TFT_INVERT_Y) +#define TFT_ROTATE_90_MIRROR_Y (TFT_ROTATE_90 ^ TFT_INVERT_X) + +#define TFT_ROTATE_180_MIRROR_X (TFT_ROTATE_180 ^ TFT_INVERT_Y) +#define TFT_ROTATE_180_MIRROR_Y (TFT_ROTATE_180 ^ TFT_INVERT_X) + +#define TFT_ROTATE_270_MIRROR_X (TFT_ROTATE_270 ^ TFT_INVERT_Y) +#define TFT_ROTATE_270_MIRROR_Y (TFT_ROTATE_270 ^ TFT_INVERT_X) + +// TFT_ROTATION is user configurable +#ifndef TFT_ROTATION + #define TFT_ROTATION TFT_NO_ROTATION +#endif + + +// TFT_ORIENTATION is the "sum" of TFT_DEFAULT_ORIENTATION plus user TFT_ROTATION +#define TFT_ORIENTATION ((TFT_DEFAULT_ORIENTATION) ^ (TFT_ROTATION)) + +#define TFT_COLOR_RGB (1UL << 3) +#define TFT_COLOR_BGR (1UL << 4) + +// Each TFT Driver is responsible for its default color mode. +// #ifndef TFT_COLOR +// #define TFT_COLOR TFT_COLOR_RGB +// #endif + +#define SSD1963 0x5761 +#define ST7735 0x89F0 +#define ST7789 0x8552 +#define ST7796 0x7796 +#define R61505 0x1505 +#define ILI9328 0x9328 +#define ILI9341 0x9341 +#define ILI9488 0x9488 +#define ILI9488_ID1 0x8066 //Some ILI9488 have 0x8066 in the 0x04 +#define LERDGE_ST7796 0xFFFE +#define AUTO 0xFFFF + +#ifndef TFT_DRIVER + #define TFT_DRIVER AUTO +#endif + +#define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x +#define ESC_DELAY(x) 0xFFFF, 0x8000 | (x & 0x7FFF) +#define ESC_END 0xFFFF, 0x7FFF +#define ESC_FFFF 0xFFFF, 0xFFFF + +class TFT_IO { +public: + static TFT_IO_DRIVER io; + + static void InitTFT(); + static void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax); + static void write_esc_sequence(const uint16_t *Sequence); + + // Deletaged methods + inline static void Init() { io.Init(); }; + inline static bool isBusy() { return io.isBusy(); }; + inline static void Abort() { io.Abort(); }; + inline static uint32_t GetID() { return io.GetID(); }; + + inline static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) { io.DataTransferBegin(DataWidth); } + inline static void DataTransferEnd() { io.DataTransferEnd(); }; + // inline static void DataTransferAbort() { io.DataTransferAbort(); }; + + inline static void WriteData(uint16_t Data) { io.WriteData(Data); }; + inline static void WriteReg(uint16_t Reg) { io.WriteReg(Reg); }; + + inline static void WriteSequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); }; + // static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + inline static void WriteMultiple(uint16_t Color, uint32_t Count) { io.WriteMultiple(Color, Count); }; + +protected: + static uint32_t lcd_id; +}; + +#endif // HAS_SPI_TFT || HAS_FSMC_TFT diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp index c97018c379..7d25c0df7e 100644 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -82,7 +82,7 @@ uint8_t TouchButtons::read_buttons() { x = uint16_t((uint32_t(x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; y = uint16_t((uint32_t(y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; - #if ENABLED(GRAPHICAL_TFT_ROTATE_180) + #if (TFT_ROTATION & TFT_ROTATE_180) x = TOUCH_SENSOR_WIDTH - x; y = TOUCH_SENSOR_HEIGHT - y; #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 5bb32a420a..4686e984b0 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -296,25 +296,44 @@ #ifndef GRAPHICAL_TFT_UPSCALE #define GRAPHICAL_TFT_UPSCALE 3 #endif + // SPI 1 + #define SCK_PIN P0_15 + #define MISO_PIN P0_17 + #define MOSI_PIN P0_18 // Disable any LCD related PINs config #define LCD_PINS_ENABLE -1 #define LCD_PINS_RS -1 - // Emulated DOGM have xpt calibration values independent of display resolution - #if ENABLED(SPI_GRAPHICAL_TFT) + // XPT2046 Touch Screen calibration + #if ENABLED(TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11245 + #define XPT2046_X_CALIBRATION -11245 #endif #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8629 + #define XPT2046_Y_CALIBRATION 8629 #endif #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 685 + #define XPT2046_X_OFFSET 685 #endif #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -285 + #define XPT2046_Y_OFFSET -285 #endif + #elif ENABLED(TFT_480x320_SPI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17232 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11196 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 1047 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -358 + #endif + + #define TFT_BUFFER_SIZE 2400 #endif #elif IS_TFTGLCD_PANEL diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 196503c822..6c6a9ea306 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -220,7 +220,7 @@ #if IS_TFTGLCD_PANEL #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_25 // EXP2.3 + #define TFTGLCD_CS P3_25 // EXP2.3 #endif #if SD_CONNECTION_IS(LCD) diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index c602af1c30..294e7527a8 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -371,7 +371,7 @@ #endif #if ANY(VIKI2, miniVIKI) - // #define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_180 #define DOGLCD_CS P0_16 // (16) #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 76c54c3bba..6d6d7557f5 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -161,7 +161,7 @@ // #define TEMP_0_PIN P0_24 #define TEMP_1_PIN P0_23 -//#define TEMP_2_PIN P1_30 // Onboard thermistor +//#define TEMP_2_PIN P1_30 // Onboard thermistor #define TEMP_BED_PIN P0_25 // diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index cbbe8a9416..62660935f5 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -39,7 +39,7 @@ //#define SDCARD_EEPROM_EMULATION //#define I2C_EEPROM // AT24C32 #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -190,7 +190,7 @@ #define E1_SERIAL_RX_PIN P1_17 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // HAS_TMC_UART // diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 5d81d1eca9..b02d414089 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -129,8 +129,6 @@ #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - #define LCD_RESET_PIN PF11 - #define LCD_BACKLIGHT_PIN PD13 #define TFT_RESET_PIN PF11 #define TFT_BACKLIGHT_PIN PD13 @@ -140,14 +138,9 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 - #define TFT_PIXEL_OFFSET_X 48 - #define TFT_PIXEL_OFFSET_Y 32 - #endif -#if HAS_TFT_LVGL_UI +#if ENABLED(TFT_LVGL_UI) // LVGL #define HAS_SPI_FLASH_FONT 1 #define HAS_GCODE_PREVIEW 1 @@ -155,16 +148,17 @@ #define HAS_LANG_SELECT_SCREEN 1 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 -#elif ENABLED(TFT_480x320) +#elif ENABLED(TFT_COLOR_UI) // Color UI #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 -#elif ENABLED(FSMC_GRAPHICAL_TFT) +#elif ENABLED(TFT_CLASSIC_UI) // Emulated DOGM #define GRAPHICAL_TFT_UPSCALE 3 #endif -#if EITHER(HAS_TFT_LVGL_UI, TFT_480x320) +// XPT2046 Touch Screen calibration +#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17181 #endif @@ -177,7 +171,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -9 #endif -#elif ENABLED(FSMC_GRAPHICAL_TFT) +#elif ENABLED(TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12316 #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index e6c9b33a5a..cafd50dcf2 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -135,15 +135,15 @@ // TronXY TFT Support // -// Shared FSMC Configs #if HAS_FSMC_TFT + + // Shared FSMC + #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - #define LCD_RESET_PIN PF11 - #define LCD_BACKLIGHT_PIN PD13 #define TFT_RESET_PIN PF11 #define TFT_BACKLIGHT_PIN PD13 @@ -153,14 +153,9 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 - #define TFT_PIXEL_OFFSET_X 48 - #define TFT_PIXEL_OFFSET_Y 32 - #endif -#if HAS_TFT_LVGL_UI +#if ENABLED(TFT_LVGL_UI) // LVGL #define HAS_SPI_FLASH_FONT 1 #define HAS_GCODE_PREVIEW 1 @@ -168,16 +163,17 @@ #define HAS_LANG_SELECT_SCREEN 1 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 -#elif ENABLED(TFT_480x320) +#elif ENABLED(TFT_COLOR_UI) // Color UI #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 -#elif ENABLED(FSMC_GRAPHICAL_TFT) +#elif ENABLED(TFT_CLASSIC_UI) // Emulated DOGM #define GRAPHICAL_TFT_UPSCALE 3 #endif -#if EITHER(HAS_TFT_LVGL_UI, TFT_480x320) +// XPT2046 Touch Screen calibration +#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17181 #endif @@ -190,7 +186,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -9 #endif -#elif ENABLED(FSMC_GRAPHICAL_TFT) +#elif ENABLED(TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12316 #endif diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index 64948039ba..3c277233d7 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -39,7 +39,7 @@ #define STM32_XL_DENSITY #endif -// #define MCU_STM32F103ZE // not yet required +//#define MCU_STM32F103ZE // not yet required // Enable EEPROM Emulation for this board, so that we don't overwrite factory data //#define I2C_EEPROM // AT24C64 diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 47d7118b53..af81bbebe2 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -118,7 +118,6 @@ * because Marlin uses the reset as a failsafe to revive a glitchy LCD. */ -#define LCD_RESET_PIN PC4 // pin 33 #define TFT_RESET_PIN PC4 // pin 33 #define TFT_BACKLIGHT_PIN PD12 // pin 59 #define FSMC_CS_PIN PD7 // pin 88 = FSMC_NE1 @@ -131,13 +130,11 @@ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 -#define GRAPHICAL_TFT_UPSCALE 2 -#define TFT_WIDTH 320 -#define TFT_HEIGHT 240 -#define TFT_PIXEL_OFFSET_X 32 -#define TFT_PIXEL_OFFSET_Y 32 +// Longer/Alfawise TFT +#define LONGER_LK_TFT28 -//#define TFT_DRIVER ILI9341 +// Buffer for Color UI +#define TFT_BUFFER_SIZE 3200 /** * Note: Alfawise U20/U30 boards DON'T use SPI2, as the hardware designer diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 26a0c9260e..8831d6804b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -143,8 +143,8 @@ #define LCD_BACKLIGHT_PIN PG11 #define FSMC_CS_PIN PG12 // NE4 #define FSMC_RS_PIN PF0 // A0 - #define TFT_CS_PIN FSMC_CS_PIN - #define TFT_RS_PIN FSMC_RS_PIN + #define TFT_CS_PIN FSMC_CS_PIN + #define TFT_RS_PIN FSMC_RS_PIN #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_DMA_DEV DMA2 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index d9ba4e3c40..94a28953cc 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -290,6 +290,7 @@ #define TFT_BUFFER_SIZE 14400 #endif +// XPT2046 Touch Screen calibration #if EITHER(HAS_TFT_LVGL_UI, TFT_480x320_SPI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17253 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 35909ed430..16d6d2ffc4 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -171,6 +171,9 @@ // Shared FSMC Configs #if HAS_FSMC_TFT + #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h + #define DOGLCD_SCK -1 + #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -179,9 +182,6 @@ #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - #define LCD_RESET_PIN PC6 // FSMC_RST - #define LCD_BACKLIGHT_PIN PD13 - #define TFT_RESET_PIN PC6 // FSMC_RST #define TFT_BACKLIGHT_PIN PD13 @@ -193,60 +193,11 @@ #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 + + #define TFT_BUFFER_SIZE 14400 #endif -#if ENABLED(FSMC_GRAPHICAL_TFT) - // Emulated DOGM - #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h - #define DOGLCD_SCK -1 - - #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 - #endif - #ifndef TFT_WIDTH - #define TFT_WIDTH 480 - #endif - #ifndef TFT_PIXEL_OFFSET_X - #define TFT_PIXEL_OFFSET_X 48 - #endif - #ifndef TFT_HEIGHT - #define TFT_HEIGHT 320 - #endif - #ifndef TFT_PIXEL_OFFSET_Y - #define TFT_PIXEL_OFFSET_Y 32 - #endif - -#elif ENABLED(TFT_320x240) // TFT32/28 - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - - #define TFT_DRIVER ILI9341 - #define TFT_BUFFER_SIZE 14400 - - // YV for normal screen mounting - //#define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV - // XV for 180° rotated screen mounting - #define ILI9341_ORIENTATION ILI9341_MADCTL_MX | ILI9341_MADCTL_MV - - #define ILI9341_COLOR_RGB - -#elif ENABLED(TFT_480x320) - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 - #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV -#endif - +// XPT2046 Touch Screen calibration #if EITHER(TFT_LVGL_UI_FSMC, TFT_480x320) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION 17880 @@ -260,7 +211,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET 349 #endif -#elif ENABLED(FSMC_GRAPHICAL_TFT) +#elif ENABLED(TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION 12149 #endif @@ -273,7 +224,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET 256 #endif -#elif ENABLED(TFT_320x240) // TFT32/28 +#elif ENABLED(TFT_320x240) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12246 #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index b40c66496a..846fe80a08 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -269,19 +269,11 @@ #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - #ifndef TFT_WIDTH - #define TFT_WIDTH 480 - #endif - #ifndef TFT_HEIGHT - #define TFT_HEIGHT 320 - #endif - - #define LCD_READ_ID 0xD3 #define LCD_USE_DMA_SPI #endif -#if ENABLED(SPI_GRAPHICAL_TFT) +#if ENABLED(TFT_CLASSIC_UI) // Emulated DOGM SPI #ifndef GRAPHICAL_TFT_UPSCALE #define GRAPHICAL_TFT_UPSCALE 3 @@ -297,12 +289,12 @@ #define LCD_PINS_ENABLE PD13 #define LCD_PINS_RS PC6 -#elif ENABLED(TFT_480x320_SPI) - #define TFT_DRIVER ST7796 +#elif ENABLED(TFT_COLOR_UI) #define TFT_BUFFER_SIZE 14400 #endif -#if EITHER(TFT_LVGL_UI_SPI, TFT_480x320_SPI) +// XPT2046 Touch Screen calibration +#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17253 #endif @@ -315,7 +307,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -24 #endif -#elif ENABLED(SPI_GRAPHICAL_TFT) +#elif ENABLED(TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -11386 #endif diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 4745641ea9..bfd1f2abdc 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -120,14 +120,50 @@ * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu * because Marlin uses the reset as a failsafe to revive a glitchy LCD. */ -#define LCD_RESET_PIN PF11 -#define LCD_BACKLIGHT_PIN PD13 -#define FSMC_CS_PIN PD7 // NE4 -#define FSMC_RS_PIN PD11 // A0 +#if HAS_FSMC_TFT + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 + #define FSMC_CS_PIN PD7 // NE4 + #define FSMC_RS_PIN PD11 // A0 -#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT -#define FSMC_DMA_DEV DMA2 -#define FSMC_DMA_CHANNEL DMA_CH5 + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define ANYCUBIC_TFT35 +#else + #define LCD_RESET_PIN PF11 + #define LCD_BACKLIGHT_PIN PD13 +#endif + +// XPT2046 Touch Screen calibration +#if ENABLED(TFT_COLOR_UI) || ENABLED(TFT_LVGL_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17181 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11434 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 501 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -9 + #endif +#elif ENABLED(TFT_CLASSIC_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif +#endif #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB7 // SPI2_NSS diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h index 830637bebd..5f62bb05a6 100644 --- a/Marlin/src/pins/teensy4/pins_T41U5XBB.h +++ b/Marlin/src/pins/teensy4/pins_T41U5XBB.h @@ -85,17 +85,17 @@ #define X_STEP_PIN 2 #define X_DIR_PIN 3 #define X_ENABLE_PIN 10 -//#define X_CS_PIN 30 +//#define X_CS_PIN 30 #define Y_STEP_PIN 4 #define Y_DIR_PIN 5 #define Y_ENABLE_PIN 40 -//#define Y_CS_PIN 31 +//#define Y_CS_PIN 31 #define Z_STEP_PIN 6 #define Z_DIR_PIN 7 #define Z_ENABLE_PIN 39 -//#define Z_CS_PIN 32 +//#define Z_CS_PIN 32 #define E0_STEP_PIN 8 #define E0_DIR_PIN 9 diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h index 31c6fda5c9..21a1ff675f 100644 --- a/Marlin/src/pins/teensy4/pins_TEENSY41.h +++ b/Marlin/src/pins/teensy4/pins_TEENSY41.h @@ -81,17 +81,17 @@ #define X_STEP_PIN 0 #define X_DIR_PIN 1 #define X_ENABLE_PIN 6 -//#define X_CS_PIN 30 +//#define X_CS_PIN 30 #define Y_STEP_PIN 2 #define Y_DIR_PIN 3 #define Y_ENABLE_PIN 7 -//#define Y_CS_PIN 31 +//#define Y_CS_PIN 31 #define Z_STEP_PIN 4 #define Z_DIR_PIN 5 #define Z_ENABLE_PIN 8 -//#define Z_CS_PIN 32 +//#define Z_CS_PIN 32 #define E0_STEP_PIN 9 #define E0_DIR_PIN 10 @@ -123,8 +123,8 @@ // #define LED_PIN 13 #define SOL0_PIN 28 -//#define PS_ON_PIN 1 -//#define FILWIDTH_PIN 6 // A6 +//#define PS_ON_PIN 1 +//#define FILWIDTH_PIN 6 // A6 #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD diff --git a/platformio.ini b/platformio.ini index 4c974e5a87..9c9460d1a3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,7 +26,7 @@ include_dir = Marlin # [common] default_src_filter = + - - + - - - - - - + - - - - - - - - - - - - @@ -227,7 +227,7 @@ HAS_WIRED_LCD = src_filter=+ HAS_MARLINUI_HD44780 = src_filter=+ HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 src_filter=+ -HAS_(FSMC|SPI)_TFT = src_filter=+ + +HAS_(FSMC|SPI)_TFT = src_filter=+ + + HAS_FSMC_TFT = src_filter=+ + HAS_SPI_TFT = src_filter=+ + HAS_GRAPHICAL_TFT = src_filter=+ @@ -909,8 +909,6 @@ build_flags = ${common_stm32f1.build_flags} # # MKS Robin Nano (STM32F103VET6) -# v1.2 - Emulated Graphical 128x64 (DOGM) UI and LVGL UI -# v2.0 - LVGL UI # [env:mks_robin_nano35] platform = ${common_stm32f1.platform} From 48a24202efb1a4105a937624eb03d1c3d4ae70a4 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 12 Oct 2020 14:39:31 -0700 Subject: [PATCH 0386/1370] Add D100 Watchdog Test (#19697) --- Marlin/src/gcode/gcode_d.cpp | 82 ++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 4bc3b6c6c3..1f38a85b91 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -25,8 +25,10 @@ #include "gcode.h" #include "../module/settings.h" + #include "../module/temperature.h" #include "../libs/hex_print.h" #include "../HAL/shared/eeprom_if.h" + #include "../HAL/shared/Delay.h" /** * Dn: G-code for development and testing @@ -84,40 +86,23 @@ } } break; - case 3: { // D3 Read / Write EEPROM - uint8_t *pointer = parser.hex_adr_val('A'); - uint16_t len = parser.ushortval('C', 1); - uintptr_t addr = (uintptr_t)pointer; - #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) - #endif - NOMORE(addr, (size_t)(MARLIN_EEPROM_SIZE - 1)); - NOMORE(len, MARLIN_EEPROM_SIZE - addr); - if (parser.seenval('X')) { - uint16_t val = parser.hex_val('X'); - #if ENABLED(EEPROM_SETTINGS) - persistentStore.access_start(); - while(len--) { - int pos = 0; - persistentStore.write_data(pos, (uint8_t *)&val, sizeof(val)); - } - SERIAL_EOL(); - persistentStore.access_finish(); - #else - SERIAL_ECHOLN("NO EEPROM"); + #if ENABLED(EEPROM_SETTINGS) + case 3: { // D3 Read / Write EEPROM + uint8_t *pointer = parser.hex_adr_val('A'); + uint16_t len = parser.ushortval('C', 1); + uintptr_t addr = (uintptr_t)pointer; + #ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) #endif - } - else { - while (len--) { - // Read bytes from EEPROM + NOMORE(addr, (size_t)(MARLIN_EEPROM_SIZE - 1)); + NOMORE(len, MARLIN_EEPROM_SIZE - addr); + if (parser.seenval('X')) { + uint16_t val = parser.hex_val('X'); #if ENABLED(EEPROM_SETTINGS) persistentStore.access_start(); - uint8_t val; while(len--) { int pos = 0; - if (!persistentStore.read_data(pos, (uint8_t *)&val, sizeof(val))) { - print_hex_byte(val); - } + persistentStore.write_data(pos, (uint8_t *)&val, sizeof(val)); } SERIAL_EOL(); persistentStore.access_finish(); @@ -125,9 +110,28 @@ SERIAL_ECHOLN("NO EEPROM"); #endif } - SERIAL_EOL(); - } - } break; + else { + while (len--) { + // Read bytes from EEPROM + #if ENABLED(EEPROM_SETTINGS) + persistentStore.access_start(); + uint8_t val; + while(len--) { + int pos = 0; + if (!persistentStore.read_data(pos, (uint8_t *)&val, sizeof(val))) { + print_hex_byte(val); + } + } + SERIAL_EOL(); + persistentStore.access_finish(); + #else + SERIAL_ECHOLN("NO EEPROM"); + #endif + } + SERIAL_EOL(); + } + } break; + #endif case 4: { // D4 Read / Write PIN // const uint8_t pin = parser.byteval('P'); @@ -167,6 +171,20 @@ SERIAL_EOL(); } } break; + + case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) + SERIAL_ECHOLN("Disabling heaters and attempting to trigger Watchdog"); + SERIAL_ECHOLN("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")"); + thermalManager.disable_all_heaters(); + delay(1000); // Allow time to print + DISABLE_ISRS(); + // Use a low-level delay that does not rely on interrupts to function + // Do not spin forever, to avoid thermal risks if heaters are enabled and + // watchdog does not work. + DELAY_US(10000000); + ENABLE_ISRS(); + SERIAL_ECHOLN("FAILURE: Watchdog did not trigger board reset."); + } } } From ea65e10dc7bf3ba5a6bd966bcebf3238eaec7ca1 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 12 Oct 2020 14:48:04 -0700 Subject: [PATCH 0387/1370] Add loose soft endstop state, apply to UBL fine-tune (#19681) Co-authored-by: Scott Lahteine --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 4 ++ Marlin/src/gcode/bedlevel/abl/G29.cpp | 16 +++--- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 16 ++---- Marlin/src/gcode/calibrate/G28.cpp | 5 +- Marlin/src/gcode/calibrate/G34.cpp | 4 +- Marlin/src/gcode/calibrate/G425.cpp | 9 ++-- Marlin/src/gcode/control/M211.cpp | 4 +- Marlin/src/gcode/feature/clean/G12.cpp | 4 +- Marlin/src/lcd/extui/ui_api.cpp | 28 ++-------- Marlin/src/lcd/menu/menu_motion.cpp | 27 ++-------- Marlin/src/lcd/menu/menu_probe_offset.cpp | 8 +-- Marlin/src/lcd/tft/ui_480x320.cpp | 24 ++------- Marlin/src/libs/nozzle.cpp | 2 +- Marlin/src/module/motion.cpp | 21 ++++---- Marlin/src/module/motion.h | 59 ++++++++++++++++----- Marlin/src/module/tool_change.cpp | 8 +-- 16 files changed, 106 insertions(+), 133 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index dc91b7d6b1..e41af9f3cd 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -1009,6 +1009,8 @@ lcd_mesh_edit_setup(new_z); + SET_SOFT_ENDSTOP_LOOSE(true); + do { idle(); new_z = lcd_mesh_edit(); @@ -1016,6 +1018,8 @@ SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } while (!ui.button_pressed()); + SET_SOFT_ENDSTOP_LOOSE(false); + if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index e9b6e0e3a6..f7de6c8cee 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -201,10 +201,6 @@ G29_TYPE GcodeSuite::G29() { ABL_VAR int abl_probe_index; #endif - #if BOTH(HAS_SOFTWARE_ENDSTOPS, PROBE_MANUALLY) - ABL_VAR bool saved_soft_endstops_state = true; - #endif - #if ABL_GRID #if ENABLED(PROBE_MANUALLY) @@ -461,7 +457,7 @@ G29_TYPE GcodeSuite::G29() { // Abort current G29 procedure, go back to idle state if (seenA && g29_in_progress) { SERIAL_ECHOLNPGM("Manual G29 aborted"); - TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state); + SET_SOFT_ENDSTOP_LOOSE(false); set_bed_leveling_enabled(abl_should_enable); g29_in_progress = false; TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); @@ -482,7 +478,7 @@ G29_TYPE GcodeSuite::G29() { if (abl_probe_index == 0) { // For the initial G29 S2 save software endstop state - TERN_(HAS_SOFTWARE_ENDSTOPS, saved_soft_endstops_state = soft_endstops_enabled); + SET_SOFT_ENDSTOP_LOOSE(true); // Move close to the bed before the first point do_blocking_move_to_z(0); } @@ -552,14 +548,14 @@ G29_TYPE GcodeSuite::G29() { _manual_goto_xy(probePos); // Can be used here too! // Disable software endstops to allow manual adjustment // If G29 is not completed, they will not be re-enabled - TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = false); + SET_SOFT_ENDSTOP_LOOSE(true); G29_RETURN(false); } else { // Leveling done! Fall through to G29 finishing code below SERIAL_ECHOLNPGM("Grid probing done."); // Re-enable software endstops, if needed - TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state); + SET_SOFT_ENDSTOP_LOOSE(false); } #elif ENABLED(AUTO_BED_LEVELING_3POINT) @@ -570,7 +566,7 @@ G29_TYPE GcodeSuite::G29() { _manual_goto_xy(probePos); // Disable software endstops to allow manual adjustment // If G29 is not completed, they will not be re-enabled - TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = false); + SET_SOFT_ENDSTOP_LOOSE(true); G29_RETURN(false); } else { @@ -578,7 +574,7 @@ G29_TYPE GcodeSuite::G29() { SERIAL_ECHOLNPGM("3-point probing done."); // Re-enable software endstops, if needed - TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state); + SET_SOFT_ENDSTOP_LOOSE(false); if (!dryrun) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 5da99386ad..d94c16052b 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -61,7 +61,6 @@ inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM(" void GcodeSuite::G29() { static int mbl_probe_index = -1; - TERN_(HAS_SOFTWARE_ENDSTOPS, static bool saved_soft_endstops_state); MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport); if (!WITHIN(state, 0, 5)) { @@ -98,26 +97,19 @@ void GcodeSuite::G29() { } // For each G29 S2... if (mbl_probe_index == 0) { - #if HAS_SOFTWARE_ENDSTOPS - // For the initial G29 S2 save software endstop state - saved_soft_endstops_state = soft_endstops_enabled; - #endif // Move close to the bed before the first point do_blocking_move_to_z(0); } else { // Save Z for the previous mesh position mbl.set_zigzag_z(mbl_probe_index - 1, current_position.z); - TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state); + SET_SOFT_ENDSTOP_LOOSE(false); } // If there's another point to sample, move there with optional lift. if (mbl_probe_index < GRID_MAX_POINTS) { - #if HAS_SOFTWARE_ENDSTOPS - // Disable software endstops to allow manual adjustment - // If G29 is not completed, they will not be re-enabled - soft_endstops_enabled = false; - #endif - + // Disable software endstops to allow manual adjustment + // If G29 is left hanging without completion they won't be re-enabled! + SET_SOFT_ENDSTOP_LOOSE(true); mbl.zigzag(mbl_probe_index++, ix, iy); _manual_goto_xy({ mbl.index_to_xpos[ix], mbl.index_to_ypos[iy] }); } diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 7bc40b2127..3420956803 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -222,8 +222,9 @@ void GcodeSuite::G28() { return; } - // Wait for planner moves to finish! - planner.synchronize(); + planner.synchronize(); // Wait for planner moves to finish! + + SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state // Disable the leveling matrix before homing #if HAS_LEVELING diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index eb1d32f909..fd876d3fe9 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -40,7 +40,7 @@ void GcodeSuite::G34() { if (homing_needed()) return; - TEMPORARY_SOFT_ENDSTOP_STATE(false); + SET_SOFT_ENDSTOP_LOOSE(true); TEMPORARY_BED_LEVELING_STATE(false); TemporaryGlobalEndstopsState unlock_z(false); @@ -148,6 +148,8 @@ void GcodeSuite::G34() { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Running Post Commands"); gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_POST)); #endif + + SET_SOFT_ENDSTOP_LOOSE(false); } #endif // MECHANICAL_GANTRY_CALIBRATION diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index 746cb10876..8968f78999 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -581,13 +581,12 @@ void GcodeSuite::G425() { GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_PRE)); #endif - TEMPORARY_SOFT_ENDSTOP_STATE(false); - TEMPORARY_BED_LEVELING_STATE(false); - if (homing_needed_error()) return; - measurements_t m; + TEMPORARY_BED_LEVELING_STATE(false); + SET_SOFT_ENDSTOP_LOOSE(true); + measurements_t m; float uncertainty = parser.seenval('U') ? parser.value_float() : CALIBRATION_MEASUREMENT_UNCERTAIN; if (parser.seen('B')) @@ -612,6 +611,8 @@ void GcodeSuite::G425() { else calibrate_all(); + SET_SOFT_ENDSTOP_LOOSE(false); + #ifdef CALIBRATION_SCRIPT_POST GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_POST)); #endif diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp index ffad722f3f..2049f1eb69 100644 --- a/Marlin/src/gcode/control/M211.cpp +++ b/Marlin/src/gcode/control/M211.cpp @@ -37,8 +37,8 @@ void GcodeSuite::M211() { l_soft_max = soft_endstop.max.asLogical(); SERIAL_ECHO_START(); SERIAL_ECHOPGM(STR_SOFT_ENDSTOPS); - if (parser.seen('S')) soft_endstops_enabled = parser.value_bool(); - serialprint_onoff(soft_endstops_enabled); + if (parser.seen('S')) soft_endstop._enabled = parser.value_bool(); + serialprint_onoff(soft_endstop._enabled); print_xyz(l_soft_min, PSTR(STR_SOFT_MIN), PSTR(" ")); print_xyz(l_soft_max, PSTR(STR_SOFT_MAX)); } diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp index f91db39703..216db5bae3 100644 --- a/Marlin/src/gcode/feature/clean/G12.cpp +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -70,9 +70,11 @@ void GcodeSuite::G12() { TEMPORARY_BED_LEVELING_STATE(!TEST(cleans, Z_AXIS) && planner.leveling_active); #endif - TEMPORARY_SOFT_ENDSTOP_STATE(parser.boolval('E')); + SET_SOFT_ENDSTOP_LOOSE(!parser.boolval('E')); nozzle.clean(pattern, strokes, radius, objects, cleans); + + SET_SOFT_ENDSTOP_LOOSE(false); } #endif // NOZZLE_CLEAN_FEATURE diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 0acfc9c025..30cf696f3e 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -305,27 +305,9 @@ namespace ExtUI { } void setAxisPosition_mm(const float position, const axis_t axis, const feedRate_t feedrate/*=0*/) { - // Start with no limits to movement - float min = current_position[axis] - 1000, - max = current_position[axis] + 1000; - - // Limit to software endstops, if enabled - #if HAS_SOFTWARE_ENDSTOPS - if (soft_endstops_enabled) switch (axis) { - case X_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_X, min = soft_endstop.min.x); - TERN_(MAX_SOFTWARE_ENDSTOP_X, max = soft_endstop.max.x); - break; - case Y_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_Y, min = soft_endstop.min.y); - TERN_(MAX_SOFTWARE_ENDSTOP_Y, max = soft_endstop.max.y); - break; - case Z_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_Z, min = soft_endstop.min.z); - TERN_(MAX_SOFTWARE_ENDSTOP_Z, max = soft_endstop.max.z); - default: break; - } - #endif // HAS_SOFTWARE_ENDSTOPS + // Get motion limit from software endstops, if any + float min, max; + soft_endstop.get_manual_axis_limits((AxisEnum)axis, min, max); // Delta limits XY based on the current offset from center // This assumes the center is 0,0 @@ -389,8 +371,8 @@ namespace ExtUI { } #if HAS_SOFTWARE_ENDSTOPS - bool getSoftEndstopState() { return soft_endstops_enabled; } - void setSoftEndstopState(const bool value) { soft_endstops_enabled = value; } + bool getSoftEndstopState() { return soft_endstop._enabled; } + void setSoftEndstopState(const bool value) { soft_endstop._enabled = value; } #endif #if HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 676ba46ea7..2972920f34 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -57,28 +57,9 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { if (ui.use_click()) return ui.goto_previous_screen_no_defer(); if (ui.encoderPosition && !ui.manual_move.processing) { - - // Start with no limits to movement - float min = current_position[axis] - 1000, - max = current_position[axis] + 1000; - - // Limit to software endstops, if enabled - #if HAS_SOFTWARE_ENDSTOPS - if (soft_endstops_enabled) switch (axis) { - case X_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_X, min = soft_endstop.min.x); - TERN_(MAX_SOFTWARE_ENDSTOP_X, max = soft_endstop.max.x); - break; - case Y_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_Y, min = soft_endstop.min.y); - TERN_(MAX_SOFTWARE_ENDSTOP_Y, max = soft_endstop.max.y); - break; - case Z_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_Z, min = soft_endstop.min.z); - TERN_(MAX_SOFTWARE_ENDSTOP_Z, max = soft_endstop.max.z); - default: break; - } - #endif // HAS_SOFTWARE_ENDSTOPS + // Get motion limit from software endstops, if any + float min, max; + soft_endstop.get_manual_axis_limits(axis, min, max); // Delta limits XY based on the current offset from center // This assumes the center is 0,0 @@ -238,7 +219,7 @@ void menu_move() { BACK_ITEM(MSG_MOTION); #if BOTH(HAS_SOFTWARE_ENDSTOPS, SOFT_ENDSTOPS_MENU_ITEM) - EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstops_enabled); + EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstop._enabled); #endif if (NONE(IS_KINEMATIC, NO_MOTION_BEFORE_HOMING) || all_axes_homed()) { diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 87957e6207..6b7830b853 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -48,16 +48,12 @@ float z_offset_backup, calculated_z_offset; TERN_(HAS_LEVELING, bool leveling_was_active); -TERN_(HAS_SOFTWARE_ENDSTOPS, bool store_soft_endstops_enabled); void prepare_for_calibration() { z_offset_backup = probe.offset.z; // Disable soft endstops for free Z movement - #if HAS_SOFTWARE_ENDSTOPS - store_soft_endstops_enabled = soft_endstops_enabled; - soft_endstops_enabled = false; - #endif + SET_SOFT_ENDSTOP_LOOSE(true); // Disable leveling for raw planner motion #if HAS_LEVELING @@ -68,7 +64,7 @@ void prepare_for_calibration() { void set_offset_and_go_back(const float &z) { probe.offset.z = z; - TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = store_soft_endstops_enabled); + SET_SOFT_ENDSTOP_LOOSE(false); TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); ui.goto_previous_screen_no_defer(); } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 549cbc4d9b..3dab9418f5 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -813,27 +813,9 @@ static void moveAxis(AxisEnum axis, const int8_t direction) { } if (!ui.manual_move.processing) { - // Start with no limits to movement - float min = current_position[axis] - 1000, - max = current_position[axis] + 1000; - - // Limit to software endstops, if enabled - #if HAS_SOFTWARE_ENDSTOPS - if (soft_endstops_enabled) switch (axis) { - case X_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_X, min = soft_endstop.min.x); - TERN_(MAX_SOFTWARE_ENDSTOP_X, max = soft_endstop.max.x); - break; - case Y_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_Y, min = soft_endstop.min.y); - TERN_(MAX_SOFTWARE_ENDSTOP_Y, max = soft_endstop.max.y); - break; - case Z_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_Z, min = soft_endstop.min.z); - TERN_(MAX_SOFTWARE_ENDSTOP_Z, max = soft_endstop.max.z); - default: break; - } - #endif // HAS_SOFTWARE_ENDSTOPS + // Get motion limit from software endstops, if any + float min, max; + soft_endstop.get_manual_axis_limits(axis, min, max); // Delta limits XY based on the current offset from center // This assumes the center is 0,0 diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index f93e552481..10021005e5 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -161,7 +161,7 @@ Nozzle nozzle; LIMIT( end[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \ }while(0) - if (soft_endstops_enabled) { + if (soft_endstop.enabled()) { LIMIT_AXIS(x); LIMIT_AXIS(y); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index da1cb173e5..92712b0c22 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -534,12 +534,11 @@ void restore_feedrate_and_scaling() { #if HAS_SOFTWARE_ENDSTOPS - bool soft_endstops_enabled = true; - // Software Endstops are based on the configured limits. - axis_limits_t soft_endstop = { + soft_endstops_t soft_endstop = { { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, - { X_MAX_POS, Y_MAX_POS, Z_MAX_POS } + { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }, + { true, false } }; /** @@ -624,9 +623,9 @@ void restore_feedrate_and_scaling() { #endif - if (DEBUGGING(LEVELING)) - SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]); -} + if (DEBUGGING(LEVELING)) + SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]); + } /** * Constrain the given coordinates to the software endstops. @@ -636,7 +635,7 @@ void restore_feedrate_and_scaling() { */ void apply_motion_limits(xyz_pos_t &target) { - if (!soft_endstops_enabled) return; + if (!soft_endstop._enabled) return; #if IS_KINEMATIC @@ -688,7 +687,11 @@ void restore_feedrate_and_scaling() { } } -#endif // HAS_SOFTWARE_ENDSTOPS +#else // !HAS_SOFTWARE_ENDSTOPS + + soft_endstops_t soft_endstop; + +#endif // !HAS_SOFTWARE_ENDSTOPS #if !UBL_SEGMENTED diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 2b108b0531..338eb387cf 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -148,26 +148,61 @@ inline float home_bump_mm(const AxisEnum axis) { constexpr xyz_pos_t hotend_offset[1] = { { 0 } }; #endif -typedef struct { xyz_pos_t min, max; } axis_limits_t; #if HAS_SOFTWARE_ENDSTOPS - extern bool soft_endstops_enabled; - extern axis_limits_t soft_endstop; + + typedef struct { + xyz_pos_t min, max; + struct { + bool _enabled:1; + bool _loose:1; + }; + bool enabled() { return _enabled && !_loose; } + void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) { + amin = -100000; amax = 100000; // "No limits" + #if HAS_SOFTWARE_ENDSTOPS + if (enabled()) switch (axis) { + case X_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_X, amin = min.x); + TERN_(MAX_SOFTWARE_ENDSTOP_X, amax = max.x); + break; + case Y_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_Y, amin = min.y); + TERN_(MAX_SOFTWARE_ENDSTOP_Y, amax = max.y); + break; + case Z_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_Z, amin = min.z); + TERN_(MAX_SOFTWARE_ENDSTOP_Z, amax = max.z); + default: break; + } + #endif + } + } soft_endstops_t; + + extern soft_endstops_t soft_endstop; void apply_motion_limits(xyz_pos_t &target); void update_software_endstops(const AxisEnum axis #if HAS_HOTEND_OFFSET , const uint8_t old_tool_index=0, const uint8_t new_tool_index=0 #endif ); - #define TEMPORARY_SOFT_ENDSTOP_STATE(enable) REMEMBER(tes, soft_endstops_enabled, enable); -#else - constexpr bool soft_endstops_enabled = false; - //constexpr axis_limits_t soft_endstop = { - // { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, - // { X_MAX_POS, Y_MAX_POS, Z_MAX_POS } }; - #define apply_motion_limits(V) NOOP + #define SET_SOFT_ENDSTOP_LOOSE(loose) (soft_endstop._loose = loose) + +#else // !HAS_SOFTWARE_ENDSTOPS + + typedef struct { + bool enabled() { return false; } + void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) { + // No limits + amin = current_position[axis] - 1000; + amax = current_position[axis] + 1000; + } + } soft_endstops_t; + extern soft_endstops_t soft_endstop; + #define apply_motion_limits(V) NOOP #define update_software_endstops(...) NOOP - #define TEMPORARY_SOFT_ENDSTOP_STATE(...) NOOP -#endif + #define SET_SOFT_ENDSTOP_LOOSE() NOOP + +#endif // !HAS_SOFTWARE_ENDSTOPS void report_real_position(); void report_current_position(); diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 0f823cfbd0..4ab818f41d 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1017,14 +1017,10 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { // Raise by a configured distance to avoid workpiece, except with // SWITCHING_NOZZLE_TWO_SERVOS, as both nozzles will lift instead. if (!no_move) { - #if HAS_SOFTWARE_ENDSTOPS - const float maxz = _MIN(soft_endstop.max.z, Z_MAX_POS); - #else - constexpr float maxz = Z_MAX_POS; - #endif + const float newz = current_position.z + _MAX(-diff.z, 0.0); // Check if Z has space to compensate at least z_offset, and if not, just abort now - const float newz = current_position.z + _MAX(-diff.z, 0.0); + const float maxz = _MIN(TERN(HAS_SOFTWARE_ENDSTOPS, soft_endstop.max.z, Z_MAX_POS), Z_MAX_POS); if (newz > maxz) return; current_position.z = _MIN(newz + toolchange_settings.z_raise, maxz); From bd221944384941c13c851e81a4160871b719f39a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Mon, 12 Oct 2020 14:52:56 -0700 Subject: [PATCH 0388/1370] Sanity-check mutually-exclusive G34 features (#19706) --- Marlin/src/inc/SanityCheck.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 7acb5e70c9..2cffde0907 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2807,6 +2807,10 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif +#if BOTH(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) + #error "You cannot use Z_STEPPER_AUTO_ALIGN and MECHANICAL_GANTRY_CALIBRATION at the same time." +#endif + #if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS) #error "PRINTCOUNTER requires EEPROM_SETTINGS. Please update your Configuration." #endif From 14fe7ee414c672530b36420182539abfd53c7839 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 12 Oct 2020 20:01:03 -0300 Subject: [PATCH 0389/1370] Fix UTF8 handling for Color UI (#19708) --- Marlin/src/lcd/tft/tft_string.cpp | 11 +++++++++++ Marlin/src/lcd/tft/tft_string.h | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index 7e66c3d29c..663ed97c36 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -116,6 +116,17 @@ void TFT_String::add(uint8_t *string, int8_t index, uint8_t *itemString) { eol(); } +void TFT_String::add(uint8_t *string) { + wchar_t wchar; + while (*string) { + string = get_utf8_value_cb(string, read_byte, &wchar); + if (wchar > 255) wchar |= 0x0080; + uint8_t ch = uint8_t(wchar & 0x00FF); + add_character(ch); + } + eol(); +} + void TFT_String::add_character(uint8_t character) { if (length < MAX_STRING_LENGTH) { data[length] = character; diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h index d83d3af702..924d6de430 100644 --- a/Marlin/src/lcd/tft/tft_string.h +++ b/Marlin/src/lcd/tft/tft_string.h @@ -85,7 +85,7 @@ class TFT_String { static void set(); static void add(uint8_t character) { add_character(character); eol(); } - static void add(uint8_t *string) { while (*string) { add_character(*string++); } eol(); } + static void add(uint8_t *string); static void add(uint8_t *string, int8_t index, uint8_t *itemString = NULL); static void set(uint8_t *string) { set(); add(string); }; static void set(uint8_t *string, int8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; From 1ef1ea0b3ecd8cdf1fffc2ce6db9eb1777e2c4d2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 12 Oct 2020 17:48:50 -0500 Subject: [PATCH 0390/1370] Move @section temperature --- Marlin/Configuration.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 8f37f1e799..db266b524b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -346,11 +346,10 @@ #endif #endif -// @section temperature - //=========================================================================== //============================= Thermal Settings ============================ //=========================================================================== +// @section temperature /** * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table From 252fd66b7696e93879d943e3419144972902e8c1 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 13 Oct 2020 13:58:50 -0300 Subject: [PATCH 0391/1370] TFT followup fixes (#19710) --- .../src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp | 3 ++- Marlin/src/lcd/tft/touch.cpp | 4 ---- Marlin/src/lcd/tft_io/ili9328.h | 8 +++++--- Marlin/src/lcd/tft_io/r65105.h | 8 +++++--- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index ecd4eb482a..ccb6a8e4dc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -474,7 +474,8 @@ void lv_encoder_pin_init() { #endif - static uint8_t buttons = newbutton; + static uint8_t buttons = 0; + buttons = newbutton; static uint8_t lastEncoderBits; #define encrot0 0 diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 2124a42e28..80c65f074a 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -295,10 +295,6 @@ bool Touch::get_point(int16_t *x, int16_t *y) { if (is_touched && calibration.orientation != TOUCH_ORIENTATION_NONE) { *x = int16_t((int32_t(*x) * calibration.x) >> 16) + calibration.offset_x; *y = int16_t((int32_t(*y) * calibration.y) >> 16) + calibration.offset_y; - #if (TFT_ROTATION & TFT_ROTATE_180) - *x = TFT_WIDTH - *x; - *y = TFT_HEIGHT - *y; - #endif } return is_touched; } diff --git a/Marlin/src/lcd/tft_io/ili9328.h b/Marlin/src/lcd/tft_io/ili9328.h index 818dd05b34..b50517adfe 100644 --- a/Marlin/src/lcd/tft_io/ili9328.h +++ b/Marlin/src/lcd/tft_io/ili9328.h @@ -49,9 +49,11 @@ #define ILI9328_GATE_SCANCTL1_DATA 0x2700 #endif -// #define ILI9328_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9328_ETMOD_AM) | \ -// IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9328_ETMOD_ID1) | \ -// IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9328_ETMOD_ID0) +/* +#define ILI9328_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9328_ETMOD_AM) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9328_ETMOD_ID1) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9328_ETMOD_ID0) +*/ #define ILI9328_ETMOD_ORIENTATION (ILI9328_ETMOD_AM | ILI9328_ETMOD_ID1 | ILI9328_ETMOD_ID0) diff --git a/Marlin/src/lcd/tft_io/r65105.h b/Marlin/src/lcd/tft_io/r65105.h index a813c3260b..8be2afe442 100644 --- a/Marlin/src/lcd/tft_io/r65105.h +++ b/Marlin/src/lcd/tft_io/r65105.h @@ -51,9 +51,11 @@ #define R61505_DRVCTRL_DATA 0x2700 #endif -// #define R61505_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, R61505_ETMOD_AM) | \ -// IF_0((TFT_ORIENTATION) & TFT_INVERT_X, R61505_ETMOD_ID0) | \ -// IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, R61505_ETMOD_ID1) +/* +#define R61505_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, R61505_ETMOD_AM) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, R61505_ETMOD_ID0) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, R61505_ETMOD_ID1) +*/ #define R61505_ETMOD_ORIENTATION (R61505_ETMOD_AM | R61505_ETMOD_ID0 | R61505_ETMOD_ID1) From 647981ef4467910671169e2489bd3fafd76b05c8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 13 Oct 2020 14:54:56 -0500 Subject: [PATCH 0392/1370] Simple bool in soft_endstops_t --- Marlin/src/module/motion.cpp | 4 ++-- Marlin/src/module/motion.h | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 92712b0c22..5b3fab10b1 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -536,9 +536,9 @@ void restore_feedrate_and_scaling() { // Software Endstops are based on the configured limits. soft_endstops_t soft_endstop = { + true, false, { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, - { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }, - { true, false } + { X_MAX_POS, Y_MAX_POS, Z_MAX_POS } }; /** diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 338eb387cf..550168e8a8 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -151,12 +151,10 @@ inline float home_bump_mm(const AxisEnum axis) { #if HAS_SOFTWARE_ENDSTOPS typedef struct { - xyz_pos_t min, max; - struct { - bool _enabled:1; - bool _loose:1; - }; + bool _enabled, _loose; bool enabled() { return _enabled && !_loose; } + + xyz_pos_t min, max; void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) { amin = -100000; amax = 100000; // "No limits" #if HAS_SOFTWARE_ENDSTOPS From 33b2f0700e47eaaed5eab23fa06c86a42d2184c8 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 13 Oct 2020 16:03:09 -0700 Subject: [PATCH 0393/1370] Add NUCLEO-F767ZI dev board (#19373) Co-authored-by: Lorenzo Delana --- .../src/HAL/shared/backtrace/unwmemaccess.cpp | 2 +- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h | 201 ++++++++++++++++++ platformio.ini | 11 + 5 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index 4b085f90ce..c93494d485 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -85,7 +85,7 @@ #define START_FLASH_ADDR 0x08000000 #define END_FLASH_ADDR 0x08100000 -#elif MB(REMRAM_V1) +#elif MB(REMRAM_V1, NUCLEO_F767ZI) // For STM32F765VI in RemRam v1 // SRAM (0x20000000 - 0x20080000) (512kb) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 8658c85785..da7d15ec33 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -363,6 +363,7 @@ #define BOARD_REMRAM_V1 5001 // RemRam v1 #define BOARD_TEENSY41 5002 // Teensy 4.1 #define BOARD_T41U5XBB 5003 // T41U5XBB Teensy 4.1 breakout board +#define BOARD_NUCLEO_F767ZI 5004 // ST NUCLEO-F767ZI Dev Board // // Espressif ESP32 WiFi diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index a7888e54d4..c5dbd20876 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -634,6 +634,8 @@ #include "stm32f7/pins_THE_BORG.h" // STM32F7 env:STM32F7 #elif MB(REMRAM_V1) #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:STM32F7 +#elif MB(NUCLEO_F767ZI) + #include "stm32f7/pins_NUCLEO_F767ZI.h" // STM32F7 env:NUCLEO_F767ZI #elif MB(TEENSY41) #include "teensy4/pins_TEENSY41.h" // Teensy-4.x env:teensy41 #elif MB(T41U5XBB) diff --git a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h new file mode 100644 index 0000000000..5e3d5f4ab5 --- /dev/null +++ b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h @@ -0,0 +1,201 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifndef STM32F767xx + #error "Oops! Select an STM32F767 environment" +#endif + +#define BOARD_INFO_NAME "NUCLEO-F767ZI" +#define DEFAULT_MACHINE_NAME "Prototype Board" + +#if NO_EEPROM_SELECTED + #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + // Not yet supported on F7 hardware + // #define FLASH_EEPROM_LEVELING +#endif + +/** + * Timer assignments + * + * TIM1 - + * TIM2 - Hardware PWM (Fan/Heater Pins) + * TIM3 - Hardware PWM (Servo Pins) + * TIM4 - STEP_TIMER (Marlin) + * TIM5 - + * TIM6 - TIMER_TONE (variant.h) + * TIM7 - TIMER_SERVO (variant.h) + * TIM9 - TIMER_SERIAL (platformio.ini) + * TIM10 - For some reason trips Watchdog when used for SW Serial + * TIM11 - + * TIM12 - + * TIM13 - + * TIM14 - TEMP_TIMER (Marlin) + * + */ +#define STEP_TIMER 4 +#define TEMP_TIMER 14 + + +/** + * These pin assignments are arbitrary and intending for testing purposes. + * Assignments may not be ideal, and not every assignment has been tested. + * Proceed at your own risk. + * _CN7_ + * (X_STEP) PC6 | · · | PB8 (X_EN) + * (X_DIR) PB15 | · · | PB9 (X_CS) + * (LCD_D4) PB13 | · · | AVDD + * _CN8_ PB12 | · · | GND + * NC | · · | PC8 (HEATER_0) PA15 | · · | PA5 (SCLK) + * IOREF | · · | PC9 (BEEPER) PC7 | · · | PA6 (MISO) + * RESET | · · | PC10 (SERVO1_PIN) PB5 | · · | PA7 (MOSI) + * +3.3V | · · | PC11 (HEATER_BED) PB3 | · · | PD14 (SD_DETECT) + * +5V | · · | PC12 (SDSS) PA4 | · · | PD15 (LCD_ENABLE) + * GND | · · | PD2 (SERVO0_PIN) PB4 | · · | PF12 (LCD_RS) + * GND | · · | PG2  ̄ ̄ ̄ + * VIN | · · | PG3 +_*  ̄ ̄ ̄ _CN10 + * AVDD | · · | PF13 (BTN_EN1) + * _CN9_ AGND | · · | PE9 (BTN_EN2) + * (TEMP_0) PA3 | · · | PD7 GND | · · | PE11 (BTN_ENC) + * (TEMP_BED) PC0 | · · | PD6 PB1 | · · | PF14 + * PC3 | · · | PD5 PC2 | · · | PE13 + * PF3 | · · | PD4 PF4 | · · | PF15 + * PF5 | · · | PD3 (E_STEP) PB6 | · · | PG14 (E_EN) + * PF10 | · · | GND (E_DIR) PB2 | · · | PG9 (E_CS) + * NC | · · | PE2 GND | · · | PE8 + * PA7 | · · | PE4 PD13 | · · | PE7 + * PF2 | · · | PE5 PD12 | · · | GND + * (Y_STEP) PF1 | · · | PE6 (Y_EN) (Z_STEP) PD11 | · · | PE10 (Z_EN) + * (Y_DIR) PF0 | · · | PE3 (Y_CS) (Z_DIR) PE2 | · · | PE12 (Z_CS) + * GND | · · | PF8 GND | · · | PE14 + * (Z_MAX) PD0 | · · | PF7 (X_MIN) PA0 | · · | PE15 + * (Z_MIN) PD1 | · · | PF9 (X_MAX) PB0 | · · | PB10 (FAN) + * (Y_MAX) PG0 | · · | PG1 (Y_MIN) PE0 | · · | PB11 (FAN1) + *  ̄ ̄ ̄  ̄ ̄ ̄ ̄ + */ + +#define X_MIN_PIN PF7 +#define X_MAX_PIN PF9 +#define Y_MIN_PIN PG1 +#define Y_MAX_PIN PG0 +#define Z_MIN_PIN PD1 +#define Z_MAX_PIN PD0 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PB15 +#define X_ENABLE_PIN PB8 +#define X_CS_PIN PB9 + +#define Y_STEP_PIN PF1 +#define Y_DIR_PIN PF0 +#define Y_ENABLE_PIN PE6 +#define Y_CS_PIN PE3 + +#define Z_STEP_PIN PD11 +#define Z_DIR_PIN PE2 +#define Z_ENABLE_PIN PE10 +#define Z_CS_PIN PE12 + +#define E0_STEP_PIN PB6 +#define E0_DIR_PIN PB2 +#define E0_ENABLE_PIN PG14 +#define E0_CS_PIN PG9 + +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN PB9 + #define X_SERIAL_RX_PIN PB9 + + #define Y_SERIAL_TX_PIN PE3 + #define Y_SERIAL_RX_PIN PE3 + + #define Z_SERIAL_TX_PIN PE12 + #define Z_SERIAL_RX_PIN PE12 + + #define E_SERIAL_TX_PIN PG9 + #define E_SERIAL_RX_PIN PG9 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA3 +#define TEMP_BED_PIN PC0 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA15 // PWM Capable, TIM2_CH1 +#define HEATER_BED_PIN PB3 // PWM Capable, TIM2_CH2 + +#ifndef FAN_PIN + #define FAN_PIN PB10 // PWM Capable, TIM2_CH3 +#endif +#define FAN1_PIN PB11 // PWM Capable, TIM2_CH4 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN FAN1_PIN +#endif + +// +// Servos +// +#define SERVO0_PIN PB4 // PWM Capable, TIM3_CH1 +#define SERVO1_PIN PB5 // PWM Capable, TIM3_CH2 + +// SPI for external SD Card (Not entirely sure this will work) +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 +#define SS_PIN PA4 +#define SDSS PA4 + +#define LED_PIN LED_BLUE + +// +// LCD / Controller +// +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BEEPER_PIN PC7 // LCD_BEEPER + #define BTN_ENC PE11 // BTN_ENC + #define SD_DETECT_PIN PD14 + #define LCD_PINS_RS PF12 // LCD_RS + #define LCD_PINS_ENABLE PD15 // LCD_EN + #define LCD_PINS_D4 PB13 // LCD_D4 + // #define LCD_PINS_D5 + // #define LCD_PINS_D6 + // #define LCD_PINS_D7 + #define BTN_EN1 PF13 // BTN_EN1 + #define BTN_EN2 PE9 // BTN_EN2 + + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #define BOARD_ST7920_DELAY_2 DELAY_NS(63) + #define BOARD_ST7920_DELAY_3 DELAY_NS(780) +#endif diff --git a/platformio.ini b/platformio.ini index 9c9460d1a3..bb5cc243e5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -856,6 +856,17 @@ board = remram_v1 build_flags = ${common.build_flags} -DUSE_STM32GENERIC -DSTM32GENERIC -DSTM32F7 -DMENU_USB_SERIAL -DMENU_SERIAL=SerialUSB -DHAL_IWDG_MODULE_ENABLED src_filter = ${common.default_src_filter} + - +# +# ST NUCLEO-F767ZI Development Board +# This environment is for testing purposes prior to control boards +# being readily available based on STM32F7 MCUs +# +[env:NUCLEO_F767ZI] +platform = ${common_stm32.platform} +extends = common_stm32 +board = nucleo_f767zi +build_flags = ${common_stm32.build_flags} -DTIMER_SERIAL=TIM9 + # # ARMED (STM32) # From 7825fc63a0b098f9d5a80b3ee5014549b4ce1c88 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 13 Oct 2020 20:12:34 -0300 Subject: [PATCH 0394/1370] Watchdog Refresh for LVGL Asset Load (#19724) --- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp | 17 +++++++++++++++-- .../extui/lib/mks_ui/tft_lvgl_configuration.cpp | 3 +++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index d6f5fbf8b5..07ac563802 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -266,19 +266,24 @@ void spiFlashErase_PIC() { W25QXX.init(SPI_QUARTER_SPEED); //erase 0x001000 -64K for (pic_sectorcnt = 0; pic_sectorcnt < (64 - 4) / 4; pic_sectorcnt++) { + watchdog_refresh(); W25QXX.SPI_FLASH_SectorErase(PICINFOADDR + pic_sectorcnt * 4 * 1024); } //erase 64K -- 6M - for (pic_sectorcnt = 0; pic_sectorcnt < (PIC_SIZE_xM * 1024 / 64 - 1); pic_sectorcnt++) + for (pic_sectorcnt = 0; pic_sectorcnt < (PIC_SIZE_xM * 1024 / 64 - 1); pic_sectorcnt++) { + watchdog_refresh(); W25QXX.SPI_FLASH_BlockErase((pic_sectorcnt + 1) * 64 * 1024); + } } #if HAS_SPI_FLASH_FONT void spiFlashErase_FONT() { volatile uint32_t Font_sectorcnt = 0; W25QXX.init(SPI_QUARTER_SPEED); - for (Font_sectorcnt = 0; Font_sectorcnt < 32-1; Font_sectorcnt++) + for (Font_sectorcnt = 0; Font_sectorcnt < 32-1; Font_sectorcnt++) { + watchdog_refresh(); W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024); + } } #endif @@ -410,6 +415,7 @@ uint8_t public_buf[512]; return; } + watchdog_refresh(); disp_assets_update_progress(fn); W25QXX.init(SPI_QUARTER_SPEED); @@ -422,18 +428,21 @@ uint8_t public_buf[512]; totalSizeLoaded += pfileSize; if (assetType == ASSET_TYPE_LOGO) { do { + watchdog_refresh(); pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_TITLE_LOGO) { do { + watchdog_refresh(); pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_G_PREVIEW) { do { + watchdog_refresh(); pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); default_view_Write(public_buf, pbr); } while (pbr >= BMP_WRITE_BUF_LEN); @@ -443,6 +452,7 @@ uint8_t public_buf[512]; SPIFlash.beginWrite(Pic_Write_Addr); #if HAS_SPI_FLASH_COMPRESSION do { + watchdog_refresh(); pbr = file.read(public_buf, SPI_FLASH_PageSize); TERN_(MARLIN_DEV_MODE, totalSizes += pbr); SPIFlash.writeData(public_buf, SPI_FLASH_PageSize); @@ -463,6 +473,7 @@ uint8_t public_buf[512]; else if (assetType == ASSET_TYPE_FONT) { Pic_Write_Addr = UNIGBK_FLASH_ADDR; do { + watchdog_refresh(); pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); Pic_Write_Addr += pbr; @@ -482,9 +493,11 @@ uint8_t public_buf[512]; disp_assets_update(); disp_assets_update_progress("Erasing pics..."); + watchdog_refresh(); spiFlashErase_PIC(); #if HAS_SPI_FLASH_FONT disp_assets_update_progress("Erasing fonts..."); + watchdog_refresh(); spiFlashErase_FONT(); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index ccb6a8e4dc..c0cd14d70d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -123,8 +123,11 @@ void tft_lvgl_init() { //spi_flash_read_test(); #if ENABLED(SDSUPPORT) + watchdog_refresh(); UpdateAssets(); #endif + + watchdog_refresh(); mks_test_get(); touch.Init(); From 70dc2ee9bb87bf0c4703afe45dac0a5a84a186d7 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 13 Oct 2020 16:13:25 -0700 Subject: [PATCH 0395/1370] If needed, home before G34 (#19713) --- Marlin/src/gcode/calibrate/G34.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index fd876d3fe9..0ca4490eb6 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -38,7 +38,8 @@ void GcodeSuite::G34() { - if (homing_needed()) return; + // Home before the alignment procedure + if (!all_axes_known()) home_all_axes(); SET_SOFT_ENDSTOP_LOOSE(true); TEMPORARY_BED_LEVELING_STATE(false); From 2004080c9d32a3fa07c5814179a3ed3de9492942 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 14 Oct 2020 11:43:36 -0700 Subject: [PATCH 0396/1370] Fix mega2560ext environment (#19730) --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index bb5cc243e5..0abb4ac388 100644 --- a/platformio.ini +++ b/platformio.ini @@ -445,7 +445,7 @@ board = megaatmega2560 # [env:mega2560ext] platform = atmelavr -extends = mega2560 +extends = env:mega2560 board = megaatmega2560 board_build.variant = megaextendedpins extra_scripts = ${common.extra_scripts} From 3e4d9aa9bbf863bccbfb3c498ef0e9b81d9412c4 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 14 Oct 2020 11:44:03 -0700 Subject: [PATCH 0397/1370] Fix digipot compilation (#19731) --- Marlin/src/feature/digipot/digipot.h | 2 +- Marlin/src/feature/digipot/digipot_mcp4018.cpp | 2 ++ Marlin/src/feature/digipot/digipot_mcp4451.cpp | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/digipot/digipot.h b/Marlin/src/feature/digipot/digipot.h index c53f8093dd..3fbd1f3662 100644 --- a/Marlin/src/feature/digipot/digipot.h +++ b/Marlin/src/feature/digipot/digipot.h @@ -30,4 +30,4 @@ public: static void set_current(const uint8_t channel, const float current); }; -DigipotI2C digipot_i2c; +extern DigipotI2C digipot_i2c; diff --git a/Marlin/src/feature/digipot/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp index 6260185fc3..4b90cc4ead 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4018.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp @@ -99,4 +99,6 @@ void DigipotI2C::init() { set_current(i, pgm_read_float(&digipot_motor_current[i])); } +DigipotI2C digipot_i2c; + #endif // DIGIPOT_MCP4018 diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index 7e6ace49a0..1b4cf43923 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -95,4 +95,6 @@ void DigipotI2C::init() { set_current(i, pgm_read_float(&digipot_motor_current[i])); } +DigipotI2C digipot_i2c; + #endif // DIGIPOT_MCP4451 From 6a5799fc7d3b2b596dc3a171d821d4c2f80726ec Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 14 Oct 2020 11:48:46 -0700 Subject: [PATCH 0398/1370] Revert at90usb1286 conditional (#19733) --- Marlin/src/HAL/AVR/HAL.h | 4 ++-- Marlin/src/HAL/AVR/MarlinSerial.cpp | 6 +++--- Marlin/src/HAL/AVR/MarlinSerial.h | 2 +- Marlin/src/gcode/control/M111.cpp | 4 ++-- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/inc/Conditionals_adv.h | 8 ++++---- Marlin/src/inc/SanityCheck.h | 6 +++--- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 6e0afa8f10..ce15ed29fb 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -25,7 +25,7 @@ #include "watchdog.h" #include "math.h" -#ifdef IS_AT90USB +#ifdef USBCON #include #else #define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion @@ -81,7 +81,7 @@ typedef int8_t pin_t; //extern uint8_t MCUSR; // Serial ports -#ifdef IS_AT90USB +#ifdef USBCON #define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial) #else #if !WITHIN(SERIAL_PORT, -1, 3) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 8feac32aa7..63599efd41 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -38,7 +38,7 @@ #include "../../inc/MarlinConfig.h" -#if !IS_AT90USB && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) +#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) #include "MarlinSerial.h" #include "../../MarlinCore.h" @@ -792,10 +792,10 @@ MarlinSerial> customizedSerial1; #endif -#endif // !IS_AT90USB && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) +#endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) // For AT90USB targets use the UART for BT interfacing -#if BOTH(IS_AT90USB, BLUETOOTH) +#if defined(USBCON) && ENABLED(BLUETOOTH) HardwareSerial bluetoothSerial; #endif diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 3850e2a47e..8a0423d143 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -327,6 +327,6 @@ #endif // Use the UART for Bluetooth in AT90USB configurations -#if BOTH(IS_AT90USB, BLUETOOTH) +#if defined(USBCON) && ENABLED(BLUETOOTH) extern HardwareSerial bluetoothSerial; #endif diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp index cc871bf38b..38cb065322 100644 --- a/Marlin/src/gcode/control/M111.cpp +++ b/Marlin/src/gcode/control/M111.cpp @@ -55,7 +55,7 @@ void GcodeSuite::M111() { } else { SERIAL_ECHOPGM(STR_DEBUG_OFF); - #if !IS_AT90USB + #if !defined(__AVR__) || !defined(USBCON) #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) SERIAL_ECHOPAIR("\nBuffer Overruns: ", MYSERIAL0.buffer_overruns()); #endif @@ -71,7 +71,7 @@ void GcodeSuite::M111() { #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) SERIAL_ECHOPAIR("\nMax RX Queue Size: ", MYSERIAL0.rxMaxEnqueued()); #endif - #endif // !IS_AT90USB + #endif // !__AVR__ || !USBCON } SERIAL_EOL(); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index a02d2c0160..b9169d90e1 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -624,7 +624,7 @@ void GCodeQueue::advance() { card.closefile(); SERIAL_ECHOLNPGM(STR_FILE_SAVED); - #if !IS_AT90USB + #if !defined(__AVR__) || !defined(USBCON) #if ENABLED(SERIAL_STATS_DROPPED_RX) SERIAL_ECHOLNPAIR("Dropped bytes: ", MYSERIAL0.dropped()); #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index bab05e5ff6..255470bca6 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -208,10 +208,7 @@ #define NEEDS_HARDWARE_PWM 1 #endif -#if defined(__AVR__) && defined(USBCON) - #define IS_AT90USB 1 - #undef SERIAL_XON_XOFF // Not supported on USB-native devices -#else +#if !defined(__AVR__) || !defined(USBCON) // Define constants and variables for buffering serial data. // Use only 0 or powers of 2 greater than 1 // : [0, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...] @@ -223,6 +220,9 @@ #ifndef TX_BUFFER_SIZE #define TX_BUFFER_SIZE 32 #endif +#else + // SERIAL_XON_XOFF not supported on USB-native devices + #undef SERIAL_XON_XOFF #endif #if ENABLED(HOST_ACTION_COMMANDS) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2cffde0907..e4f278b22b 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -582,7 +582,7 @@ /** * Serial */ -#if !IS_AT90USB +#if !(defined(__AVR__) && defined(USBCON)) #if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." #elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE)) @@ -2108,9 +2108,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif /** - * Emergency Command Parser + * emergency-command parser */ -#if BOTH(IS_AT90USB, EMERGENCY_PARSER) +#if ENABLED(EMERGENCY_PARSER) && defined(__AVR__) && defined(USBCON) #error "EMERGENCY_PARSER does not work on boards with AT90USB processors (USBCON)." #endif From d81abf1d5048957d96441a371488f1af30bfabb4 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 14 Oct 2020 11:50:03 -0700 Subject: [PATCH 0399/1370] Fix SET_SOFT_ENDSTOP_LOOSE w/out soft endstops (#19734) --- Marlin/src/module/motion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 550168e8a8..85b70c057a 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -198,7 +198,7 @@ inline float home_bump_mm(const AxisEnum axis) { extern soft_endstops_t soft_endstop; #define apply_motion_limits(V) NOOP #define update_software_endstops(...) NOOP - #define SET_SOFT_ENDSTOP_LOOSE() NOOP + #define SET_SOFT_ENDSTOP_LOOSE(V) NOOP #endif // !HAS_SOFTWARE_ENDSTOPS From 7905aa64fa8845e8af2208d20b8075d3a579e2f6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 15 Oct 2020 03:00:27 -0500 Subject: [PATCH 0400/1370] TFT Presets, Generic options, Sanity checks (#19723) --- Marlin/Configuration.h | 91 ++++++- Marlin/Configuration_adv.h | 6 +- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 2 +- Marlin/src/HAL/STM32F1/HAL.cpp | 6 +- Marlin/src/core/macros.h | 4 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 2 +- Marlin/src/inc/Conditionals_LCD.h | 256 ++++++++---------- Marlin/src/inc/Conditionals_adv.h | 4 +- Marlin/src/inc/Conditionals_post.h | 4 +- Marlin/src/inc/SanityCheck.h | 199 +++++++------- Marlin/src/inc/Version.h | 2 +- Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp | 2 +- Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 2 +- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 4 +- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 2 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 4 +- Marlin/src/lcd/scaled_tft.h | 4 +- Marlin/src/lcd/ultralcd.cpp | 8 +- Marlin/src/lcd/ultralcd.h | 11 +- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 2 +- Marlin/src/pins/linux/pins_RAMPS_LINUX.h | 14 +- Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 4 +- Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 4 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 5 +- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 8 +- Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h | 4 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 6 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 2 +- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 2 +- Marlin/src/pins/mega/pins_CHEAPTRONICv2.h | 2 +- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 6 +- Marlin/src/pins/mega/pins_GT2560_V3.h | 2 +- Marlin/src/pins/mega/pins_GT2560_V3_A20.h | 2 +- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 4 +- Marlin/src/pins/mega/pins_MEGATRONICS.h | 4 +- Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 2 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 2 +- Marlin/src/pins/mega/pins_OVERLORD.h | 2 +- Marlin/src/pins/pins.h | 4 +- Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 4 +- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 4 +- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 4 +- Marlin/src/pins/rambo/pins_RAMBO.h | 6 +- Marlin/src/pins/ramps/pins_3DRAG.h | 6 +- Marlin/src/pins/ramps/pins_FELIX2.h | 4 +- Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h | 2 +- .../src/pins/ramps/pins_FORMBOT_TREX2PLUS.h | 2 +- Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h | 2 +- Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 2 +- Marlin/src/pins/ramps/pins_K8600.h | 2 +- Marlin/src/pins/ramps/pins_K8800.h | 2 +- Marlin/src/pins/ramps/pins_ORTUR_4.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS.h | 19 +- Marlin/src/pins/ramps/pins_RAMPS_PLUS.h | 2 +- Marlin/src/pins/ramps/pins_RIGIDBOARD.h | 2 +- Marlin/src/pins/ramps/pins_RUMBA.h | 2 +- Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h | 4 +- Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 4 +- Marlin/src/pins/ramps/pins_TT_OSCAR.h | 16 +- Marlin/src/pins/ramps/pins_ULTIMAKER.h | 6 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 8 +- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 4 +- Marlin/src/pins/sam/pins_ARCHIM1.h | 4 +- Marlin/src/pins/sam/pins_ARCHIM2.h | 14 +- Marlin/src/pins/sam/pins_DUE3DOM.h | 2 +- Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 2 +- Marlin/src/pins/sam/pins_RADDS.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_DUO.h | 8 +- Marlin/src/pins/sam/pins_RAMPS_FD_V1.h | 4 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 8 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 8 +- Marlin/src/pins/samd/pins_RAMPS_144.h | 16 +- Marlin/src/pins/sanguino/pins_ANET_10.h | 4 +- .../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 8 +- Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 2 +- .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 12 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 3 - Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 3 - Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 2 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 13 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 19 +- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 2 +- .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 75 ++--- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 15 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 4 +- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 12 +- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 12 +- Marlin/src/pins/stm32f4/pins_BEAST.h | 12 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 2 +- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 2 +- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 2 +- Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h | 12 +- Marlin/src/pins/teensy2/pins_PRINTRBOARD.h | 4 +- Marlin/src/pins/teensy2/pins_TEENSY2.h | 2 +- Marlin/src/pins/teensy2/pins_TEENSYLU.h | 4 +- Marlin/src/pins/teensy3/pins_TEENSY35_36.h | 4 +- buildroot/tests/STM32F103VE_longer-tests | 2 - buildroot/tests/mks_robin-tests | 4 +- buildroot/tests/mks_robin_nano35-tests | 41 ++- buildroot/tests/mks_robin_pro-tests | 4 +- 116 files changed, 593 insertions(+), 599 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index db266b524b..1f6b0db946 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -35,7 +35,7 @@ * * Advanced settings can be found in Configuration_adv.h */ -#define CONFIGURATION_H_VERSION 020007 +#define CONFIGURATION_H_VERSION 020008 //=========================================================================== //============================= Getting Started ============================= @@ -2205,22 +2205,83 @@ //============================================================================= /** - * TFT Type - Select your Display type - * - * Available options are: - * MKS_TS35_V2_0, - * MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, - * MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R - * TFT_TRONXY_X5SA, ANYCUBIC_TFT35, LONGER_LK_TFT28 - * TFT_GENERIC - * - * For TFT_GENERIC, you need to configure these 3 options: - * Driver: TFT_DRIVER - * Current Drivers are: AUTO, ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488 - * Resolution: TFT_WIDTH and TFT_HEIGHT - * Interface: TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI + * Specific TFT Model Presets. Enable one of the following options + * or enable TFT_GENERIC and set sub-options. */ + +// +// 480x320, 3.5", SPI Display From MKS +// Normally used in MKS Robin Nano V2 +// +//#define MKS_TS35_V2_0 + +// +// 320x240, 2.4", FSMC Display From MKS +// Normally used in MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT24 + +// +// 320x240, 2.8", FSMC Display From MKS +// Normally used in MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT28 + +// +// 320x240, 3.2", FSMC Display From MKS +// Normally used in MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT32 + +// +// 480x320, 3.5", FSMC Display From MKS +// Normally used in MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT35 + +// +// 480x272, 4.3", FSMC Display From MKS +// +//#define MKS_ROBIN_TFT43 + +// +// 320x240, 3.2", FSMC Display From MKS +// Normally used in MKS Robin +// +//#define MKS_ROBIN_TFT_V1_1R + +// +// 480x320, 3.5", FSMC Stock Display from TronxXY +// +//#define TFT_TRONXY_X5SA + +// +// 480x320, 3.5", FSMC Stock Display from AnyCubic +// +//#define ANYCUBIC_TFT35 + +// +// 320x240, 2.8", FSMC Stock Display from Longer/Alfawise +// +//#define LONGER_LK_TFT28 + +// +// Generic TFT with detailed options +// //#define TFT_GENERIC +#if ENABLED(TFT_GENERIC) + // :[ 'AUTO', 'ST7735', 'ST7789', 'ST7796', 'R61505', 'ILI9328', 'ILI9341', 'ILI9488' ] + #define TFT_DRIVER AUTO + + // Interface. Enable one of the following options: + //#define TFT_INTERFACE_FSMC + //#define TFT_INTERFACE_SPI + + // TFT Resolution. Enable one of the following options: + //#define TFT_RES_320x240 + //#define TFT_RES_480x272 + //#define TFT_RES_480x320 +#endif /** * TFT UI - User Interface Selection. Enable one of the following options: diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index bcacddd20d..714bcb288f 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -30,7 +30,7 @@ * * Basic settings can be found in Configuration.h */ -#define CONFIGURATION_ADV_H_VERSION 020007 +#define CONFIGURATION_ADV_H_VERSION 020008 //=========================================================================== //============================= Thermal Settings ============================ @@ -1048,10 +1048,10 @@ // @section lcd -#if EITHER(ULTIPANEL, EXTENSIBLE_UI) +#if EITHER(IS_ULTIPANEL, EXTENSIBLE_UI) #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen #endif diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index f5051d32a1..8b7d27742d 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -72,7 +72,7 @@ static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are in //#endif #if MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF) - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) + #if IS_RRD_FG_SC && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 requires TMC_USE_SW_SPI." #endif #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index cd1efc1659..6733aead6d 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -130,7 +130,7 @@ const uint8_t adc_pins[] = { #if ENABLED(FILAMENT_WIDTH_SENSOR) FILWIDTH_PIN, #endif - #if ENABLED(ADC_KEYPAD) + #if HAS_ADC_BUTTONS ADC_KEYPAD_PIN, #endif #if HAS_JOY_ADC_X @@ -187,7 +187,7 @@ enum TempPinIndex : char { #if ENABLED(FILAMENT_WIDTH_SENSOR) FILWIDTH, #endif - #if ENABLED(ADC_KEYPAD) + #if HAS_ADC_BUTTONS ADC_KEY, #endif #if HAS_JOY_ADC_X @@ -389,7 +389,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { #if ENABLED(FILAMENT_WIDTH_SENSOR) case FILWIDTH_PIN: pin_index = FILWIDTH; break; #endif - #if ENABLED(ADC_KEYPAD) + #if HAS_ADC_BUTTONS case ADC_KEYPAD_PIN: pin_index = ADC_KEY; break; #endif #if ENABLED(POWER_MONITOR_CURRENT) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 21bb32c4cf..7948e8ce87 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -170,7 +170,7 @@ #define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) #define __DO_N(W,C,N,V...) _DO_##N(W,C,V) #define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) -#define DO(W,C,V...) _DO_N(W,C,NUM_ARGS(V),V) +#define DO(W,C,V...) (_DO_N(W,C,NUM_ARGS(V),V)) // Macros to support option testing #define _CAT(a,V...) a##V @@ -186,6 +186,7 @@ #define _DIS_1(O) NOT(_ENA_1(O)) #define ENABLED(V...) DO(ENA,&&,V) #define DISABLED(V...) DO(DIS,&&,V) +#define COUNT_ENABLED(V...) DO(ENA,+,V) #define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1' #define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0' @@ -200,6 +201,7 @@ #define ALL(V...) ENABLED(V) #define BOTH(V1,V2) ALL(V1,V2) #define EITHER(V1,V2) ANY(V1,V2) +#define MANY(V...) (COUNT_ENABLED(V) > 1) // Macros to support pins/buttons exist testing #define PIN_EXISTS(PN) (defined(PN##_PIN) && PN##_PIN >= 0) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 9ac9de1806..22ca1f69ec 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -59,7 +59,7 @@ class unified_bed_leveling { static int g29_grid_size; #endif - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL static void move_z_with_encoder(const float &multiplier); static float measure_point_with_encoder(); static float measure_business_card_thickness(float in_height); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 56ce2ca5ed..4eeb0e8a44 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -46,7 +46,7 @@ * * DOGLCD : Run a Graphical LCD through U8GLib (with MarlinUI) * IS_ULTIPANEL : Define LCD_PINS_D5/6/7 for direct-connected "Ultipanel" LCDs - * IS_ULTRA_LCD : Ultra LCD, not necessarily Ultipanel. Used most often with NEWPANEL. + * IS_ULTRA_LCD : Ultra LCD, not necessarily Ultipanel. * IS_RRD_SC : Common RRD Smart Controller digital interface pins * IS_RRD_FG_SC : Common RRD Full Graphical Smart Controller digital interface pins * U8GLIB_ST7920 : Most common DOGM display SPI interface, supporting a "lightweight" display mode. @@ -63,22 +63,21 @@ #elif ENABLED(CARTESIO_UI) #define DOGLCD - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #elif EITHER(DWIN_MARLINUI_PORTRAIT, DWIN_MARLINUI_LANDSCAPE) #define IS_DWIN_MARLINUI 1 - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #elif ENABLED(ZONESTAR_LCD) - #define ADC_KEYPAD - #define IS_RRW_KEYPAD + #define HAS_ADC_BUTTONS 1 #define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 #define ADC_KEY_NUM 8 - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 - // This helps to implement ADC_KEYPAD menus + // This helps to implement HAS_ADC_BUTTONS menus #define REVERSE_MENU_DIRECTION #define ENCODER_PULSES_PER_STEP 1 #define ENCODER_STEPS_PER_MENU_ITEM 1 @@ -86,29 +85,25 @@ #elif ENABLED(ZONESTAR_12864LCD) #define DOGLCD - #define IS_RRD_SC + #define IS_RRD_SC 1 #define U8GLIB_ST7920 #elif ENABLED(ZONESTAR_12864OLED) - #define IS_RRD_SC + #define IS_RRD_SC 1 #define U8GLIB_SH1106 #elif ENABLED(ZONESTAR_12864OLED_SSD1306) - #define IS_RRD_SC + #define IS_RRD_SC 1 #define IS_U8GLIB_SSD1306 #elif ENABLED(RADDS_DISPLAY) - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #define ENCODER_PULSES_PER_STEP 2 -#elif EITHER(ANET_FULL_GRAPHICS_LCD, BQ_LCD_SMART_CONTROLLER) - - #define IS_RRD_FG_SC - #elif ANY(miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864) #define DOGLCD - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #if ENABLED(miniVIKI) #define U8GLIB_ST7565_64128N @@ -123,40 +118,33 @@ #elif ENABLED(OLED_PANEL_TINYBOY2) #define IS_U8GLIB_SSD1306 - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #elif ENABLED(RA_CONTROL_PANEL) #define LCD_I2C_TYPE_PCA8574 #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define DOGLCD #define U8GLIB_ST7920 - #define IS_ULTIPANEL - -#elif ENABLED(CR10_STOCKDISPLAY) - - #define IS_RRD_FG_SC - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #define IS_ULTIPANEL 1 #elif ENABLED(MKS_12864OLED) - #define IS_RRD_SC + #define IS_RRD_SC 1 #define U8GLIB_SH1106 #elif ENABLED(MKS_12864OLED_SSD1306) - #define IS_RRD_SC + #define IS_RRD_SC 1 #define IS_U8GLIB_SSD1306 #elif ENABLED(FYSETC_242_OLED_12864) - #define IS_RRD_SC + #define IS_RRD_SC 1 #define U8GLIB_SH1106 #define LED_CONTROL_MENU @@ -179,7 +167,7 @@ #define FYSETC_MINI_12864 #define DOGLCD - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #define LED_COLORS_REDUCE_GREEN #if ENABLED(PSU_CONTROL) && EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1) #define LED_BACKLIGHT_TIMEOUT 10000 @@ -205,7 +193,7 @@ #elif ENABLED(ULTI_CONTROLLER) - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #define U8GLIB_SSD1309 #define LCD_RESET_PIN LCD_PINS_D6 // This controller need a reset pin #define ENCODER_PULSES_PER_STEP 2 @@ -213,14 +201,14 @@ #elif ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) - #define IS_RRD_SC + #define IS_RRD_SC 1 #define LCD_WIDTH 16 #define LCD_HEIGHT 2 #elif EITHER(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) #define IS_TFTGLCD_PANEL 1 - #define IS_ULTIPANEL // Note that IS_ULTIPANEL leads to HAS_WIRED_LCD + #define IS_ULTIPANEL 1 // Note that IS_ULTIPANEL leads to HAS_WIRED_LCD #if ENABLED(SDSUPPORT) && DISABLED(LCD_PROGRESS_BAR) #define LCD_PROGRESS_BAR @@ -239,14 +227,35 @@ #define CONVERT_TO_EXT_ASCII // Use extended 128-255 symbols from ASCII table. // At this time present conversion only for cyrillic - bg, ru and uk languages. // First 7 ASCII symbols in panel font must be replaced with Marlin's special symbols. + +#elif ENABLED(CR10_STOCKDISPLAY) + + #define IS_RRD_FG_SC 1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + +#elif ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD, BQ_LCD_SMART_CONTROLLER) + + #define IS_RRD_FG_SC 1 + +#elif ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + // RepRapDiscount LCD or Graphical LCD with rotary click encoder + #define IS_RRD_SC 1 + #endif -#if ENABLED(IS_RRD_FG_SC) - #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +// ST7920-based graphical displays +#if ANY(IS_RRD_FG_SC, LCD_FOR_MELZI, SILVER_GATE_GLCD_CONTROLLER) + #define DOGLCD + #define U8GLIB_ST7920 + #define IS_RRD_SC 1 #endif +// ST7565 / 64128N graphical displays #if EITHER(MAKRPANEL, MINIPANEL) - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #define DOGLCD #if ENABLED(MAKRPANEL) #define U8GLIB_ST7565_64128N @@ -258,7 +267,7 @@ #endif #if ENABLED(OVERLORD_OLED) - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #define U8GLIB_SH1106 /** * PCA9632 for buzzer and LEDs via i2c @@ -278,64 +287,44 @@ // 128x64 I2C OLED LCDs - SSD1306/SSD1309/SH1106 #if ANY(U8GLIB_SSD1306, U8GLIB_SSD1309, U8GLIB_SH1106) #define HAS_U8GLIB_I2C_OLED 1 -#endif -#if HAS_U8GLIB_I2C_OLED - #define IS_ULTRA_LCD + #define IS_ULTRA_LCD 1 #define DOGLCD #endif -// ST7920-based graphical displays -#if ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, LCD_FOR_MELZI, SILVER_GATE_GLCD_CONTROLLER) - #define DOGLCD - #define U8GLIB_ST7920 - #define IS_RRD_SC -#endif - -// RepRapDiscount LCD or Graphical LCD with rotary click encoder -#if ENABLED(IS_RRD_SC) - #define REPRAP_DISCOUNT_SMART_CONTROLLER -#endif - /** * SPI Ultipanels */ // Basic Ultipanel-like displays -#if ANY(ULTIMAKERCONTROLLER, REPRAP_DISCOUNT_SMART_CONTROLLER, G3D_PANEL, RIGIDBOT_PANEL, PANEL_ONE, U8GLIB_SH1106) - #define IS_ULTIPANEL +#if ANY(ULTIMAKERCONTROLLER, IS_RRD_SC, G3D_PANEL, RIGIDBOT_PANEL, PANEL_ONE, U8GLIB_SH1106) + #define IS_ULTIPANEL 1 #endif // Einstart OLED has Cardinal nav via pins defined in pins_EINSTART-S.h #if ENABLED(U8GLIB_SH1106_EINSTART) #define DOGLCD - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #endif -// Compatibility -#if ENABLED(FSMC_GRAPHICAL_TFT) +// TFT Compatibility +#if ANY(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT, TFT_320x240, TFT_480x320, TFT_320x240_SPI, TFT_480x320_SPI, TFT_LVGL_UI_FSMC, TFT_LVGL_UI_SPI) + #define IS_LEGACY_TFT 1 + #define TFT_GENERIC + #warning "Don't forget to update your TFT settings in Configuration.h." +#endif + +#if ANY(FSMC_GRAPHICAL_TFT, TFT_320x240, TFT_480x320, TFT_LVGL_UI_FSMC) + #define TFT_INTERFACE_FSMC +#elif ANY(SPI_GRAPHICAL_TFT, TFT_320x240_SPI, TFT_480x320_SPI, TFT_LVGL_UI_SPI) + #define TFT_INTERFACE_SPI +#endif + +#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) #define TFT_CLASSIC_UI - #define TFT_INTERFACE_FSMC - #define TFT_GENERIC -#elif ENABLED(SPI_GRAPHICAL_TFT) - #define TFT_CLASSIC_UI - #define TFT_INTERFACE_SPI - #define TFT_GENERIC -#elif EITHER(TFT_320x240, TFT_480x320) +#elif ANY(TFT_320x240, TFT_480x320, TFT_320x240_SPI, TFT_480x320_SPI) #define TFT_COLOR_UI - #define TFT_INTERFACE_FSMC - #define TFT_GENERIC -#elif EITHER(TFT_320x240_SPI, TFT_480x320_SPI) - #define TFT_COLOR_UI - #define TFT_INTERFACE_SPI - #define TFT_GENERIC -#elif ENABLED(TFT_LVGL_UI_FSMC) +#elif EITHER(TFT_LVGL_UI_FSMC, TFT_LVGL_UI_SPI) #define TFT_LVGL_UI - #define TFT_INTERFACE_FSMC - #define TFT_GENERIC -#elif ENABLED(TFT_LVGL_UI_SPI) - #define TFT_LVGL_UI - #define TFT_INTERFACE_SPI - #define TFT_GENERIC #endif // FSMC/SPI TFT Panels (LVGL) @@ -350,7 +339,7 @@ #if TFT_SCALED_DOGLCD #define DOGLCD - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #define DELAYED_BACKLIGHT_INIT #elif ENABLED(TFT_LVGL_UI) #define DELAYED_BACKLIGHT_INIT @@ -359,7 +348,7 @@ // Color UI #if ENABLED(TFT_COLOR_UI) #define HAS_GRAPHICAL_TFT 1 - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #endif /** @@ -383,7 +372,7 @@ #define LCD_I2C_TYPE_MCP23017 #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (optional) - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #elif ENABLED(LCD_I2C_VIKI) @@ -398,7 +387,7 @@ #define LCD_I2C_TYPE_MCP23017 #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (requires LiquidTWI2 v1.2.3 or later) - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #define ENCODER_FEEDRATE_DEADZONE 4 @@ -410,7 +399,7 @@ #define STD_ENCODER_PULSES_PER_STEP 2 #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 -#elif ANY(REPRAP_DISCOUNT_SMART_CONTROLLER, miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864, OLED_PANEL_TINYBOY2, BQ_LCD_SMART_CONTROLLER, LCD_I2C_PANELOLU2) +#elif ANY(IS_RRD_SC, miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864, OLED_PANEL_TINYBOY2, BQ_LCD_SMART_CONTROLLER, LCD_I2C_PANELOLU2) #define STD_ENCODER_PULSES_PER_STEP 4 #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 @@ -443,30 +432,24 @@ // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection #if ENABLED(FF_INTERFACEBOARD) #define SR_LCD_3W_NL // Non latching 3 wire shift register - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 #elif ENABLED(SAV_3DLCD) #define SR_LCD_2W_NL // Non latching 2 wire shift register - #define IS_ULTIPANEL + #define IS_ULTIPANEL 1 +#elif ENABLED(ULTIPANEL) + #define IS_ULTIPANEL 1 #endif -#if ENABLED(IS_ULTIPANEL) - #define ULTIPANEL -#endif -#if ENABLED(ULTIPANEL) - #define IS_ULTRA_LCD - #define NEWPANEL -#endif -#if ENABLED(IS_ULTRA_LCD) - #define ULTRA_LCD +#if EITHER(IS_ULTIPANEL, ULTRA_LCD) + #define IS_ULTRA_LCD 1 #endif -#if ENABLED(IS_RRW_KEYPAD) - #define REPRAPWORLD_KEYPAD +#if EITHER(IS_ULTIPANEL, REPRAPWORLD_KEYPAD) + #define IS_NEWPANEL 1 #endif -// Keypad needs a move step -#if ENABLED(REPRAPWORLD_KEYPAD) - #define NEWPANEL +#if EITHER(ZONESTAR_LCD, REPRAPWORLD_KEYPAD) + #define IS_RRW_KEYPAD 1 #ifndef REPRAPWORLD_KEYPAD_MOVE_STEP #define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 #endif @@ -479,16 +462,16 @@ // Extensible UI serial touch screens. (See src/lcd/extui) #if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - #define IS_EXTUI + #define IS_EXTUI 1 #define EXTENSIBLE_UI #endif // Aliases for LCD features -#if EITHER(ULTRA_LCD, EXTENSIBLE_UI) +#if EITHER(IS_ULTRA_LCD, EXTENSIBLE_UI) #define HAS_DISPLAY 1 #endif -#if ENABLED(ULTRA_LCD) +#if IS_ULTRA_LCD #define HAS_WIRED_LCD 1 #if ENABLED(DOGLCD) #define HAS_MARLINUI_U8GLIB 1 @@ -499,12 +482,9 @@ #endif #endif -#if ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS) +#if IS_ULTIPANEL && DISABLED(NO_LCD_MENUS) #define HAS_LCD_MENU 1 #endif -#if ENABLED(ADC_KEYPAD) - #define HAS_ADC_BUTTONS 1 -#endif #if HAS_MARLINUI_U8GLIB #ifndef LCD_PIXEL_WIDTH @@ -837,83 +817,85 @@ #if ENABLED(MKS_TS35_V2_0) // Most common: ST7796 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 + #define TFT_RES_480x320 #define TFT_INTERFACE_SPI - #define GRAPHICAL_TFT_UPSCALE 3 #elif ENABLED(MKS_ROBIN_TFT24) // Most common: ST7789 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 + #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 #elif ENABLED(MKS_ROBIN_TFT28) // Most common: ST7789 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 + #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 #elif ENABLED(MKS_ROBIN_TFT32) // Most common: ST7789 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 + #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 #elif ENABLED(MKS_ROBIN_TFT35) // Most common: ILI9488 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 + #define TFT_RES_480x320 #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 3 #elif ENABLED(MKS_ROBIN_TFT43) #define TFT_DEFAULT_ORIENTATION 0 #define TFT_DRIVER SSD1963 - #define TFT_WIDTH 480 - #define TFT_HEIGHT 272 + #define TFT_RES_480x272 #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 #elif ENABLED(MKS_ROBIN_TFT_V1_1R) // ILI9328 or R61505 - #define TFT_DEFAULT_ORIENTATION (TFT_INVERT_X | TFT_INVERT_Y | TFT_EXCHANGE_XY) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) + #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 #elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_DRIVER ILI9488 - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 + #define TFT_RES_480x320 #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 3 #elif ENABLED(LONGER_LK_TFT28) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 + #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 #elif ENABLED(TFT_GENERIC) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) + #if NONE(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320) + #define TFT_RES_320x240 + #endif + #if NONE(TFT_INTERFACE_FSMC, TFT_INTERFACE_SPI) + #define TFT_INTERFACE_SPI + #endif +#endif + +#if ENABLED(TFT_RES_320x240) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(TFT_RES_480x272) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 272 + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(TFT_RES_480x320) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define GRAPHICAL_TFT_UPSCALE 3 #endif // FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h #if ENABLED(TFT_INTERFACE_FSMC) #define HAS_FSMC_TFT 1 #if ENABLED(TFT_CLASSIC_UI) - #define FSMC_GRAPHICAL_TFT + #define HAS_FSMC_GRAPHICAL_TFT 1 #elif ENABLED(TFT_LVGL_UI) - #define TFT_LVGL_UI_FSMC + #define HAS_TFT_LVGL_UI_FSMC 1 #endif #elif ENABLED(TFT_INTERFACE_SPI) #define HAS_SPI_TFT 1 #if ENABLED(TFT_CLASSIC_UI) - #define SPI_GRAPHICAL_TFT + #define HAS_SPI_GRAPHICAL_TFT 1 #elif ENABLED(TFT_LVGL_UI) - #define TFT_LVGL_UI_SPI + #define HAS_TFT_LVGL_UI_SPI 1 #endif #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 255470bca6..78c014865c 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -148,7 +148,7 @@ #if ANY(MARLIN_BRICKOUT, MARLIN_INVADERS, MARLIN_SNAKE, MARLIN_MAZE) #define HAS_GAMES 1 - #if (1 < ENABLED(MARLIN_BRICKOUT) + ENABLED(MARLIN_INVADERS) + ENABLED(MARLIN_SNAKE) + ENABLED(MARLIN_MAZE)) + #if MANY(MARLIN_BRICKOUT, MARLIN_INVADERS, MARLIN_SNAKE, MARLIN_MAZE) #define HAS_GAME_MENU 1 #endif #endif @@ -163,7 +163,7 @@ #if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) #define HAS_SOFTWARE_ENDSTOPS 1 #endif -#if ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER, HAS_ADC_BUTTONS, DWIN_CREALITY_LCD) +#if ANY(EXTENSIBLE_UI, IS_NEWPANEL, EMERGENCY_PARSER, HAS_ADC_BUTTONS, DWIN_CREALITY_LCD) #define HAS_RESUME_CONTINUE 1 #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 798bf009c6..581b36932a 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -383,7 +383,7 @@ #endif -#if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) +#if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) #define NO_LCD_REINIT 1 // Suppress LCD re-initialization #endif @@ -2578,7 +2578,7 @@ // Force SDCARD_SORT_ALPHA to be enabled for Graphical LCD on LPC1768 // on boards where SD card and LCD display share the same SPI bus // because of a bug in the shared SPI implementation. (See #8122) -#if defined(TARGET_LPC1768) && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && (SCK_PIN == LCD_PINS_D4) +#if defined(TARGET_LPC1768) && IS_RRD_FG_SC && (SCK_PIN == LCD_PINS_D4) #define SDCARD_SORT_ALPHA // Keep one directory level in RAM. Changing directory levels // may still glitch the screen, but LCD updates clean it up. #undef SDSORT_LIMIT diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e4f278b22b..9aea18c2d7 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -702,8 +702,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif PROGRESS_MSG_EXPIRE < 0 #error "PROGRESS_MSG_EXPIRE must be greater than or equal to 0." #endif -#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_MARLINUI_U8GLIB, HAS_GRAPHICAL_TFT, HAS_MARLINUI_HD44780, EXTENSIBLE_UI) - #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Character LCD, Graphical LCD, TFT, or EXTENSIBLE_UI." +#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) + #if NONE(HAS_MARLINUI_U8GLIB, HAS_GRAPHICAL_TFT, HAS_MARLINUI_HD44780, EXTENSIBLE_UI) + #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Character LCD, Graphical LCD, TFT, or EXTENSIBLE_UI." + #endif #endif #if !HAS_LCD_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE) @@ -843,7 +845,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "ADVANCED_PAUSE_FEATURE requires FILAMENT_UNLOAD_PURGE_FEEDRATE. Please add it to Configuration_adv.h." #elif ENABLED(EXTRUDER_RUNOUT_PREVENT) #error "EXTRUDER_RUNOUT_PREVENT is incompatible with ADVANCED_PAUSE_FEATURE." - #elif ENABLED(PARK_HEAD_ON_PAUSE) && NONE(SDSUPPORT, NEWPANEL, EMERGENCY_PARSER) + #elif ENABLED(PARK_HEAD_ON_PAUSE) && NONE(SDSUPPORT, IS_NEWPANEL, EMERGENCY_PARSER) #error "PARK_HEAD_ON_PAUSE requires SDSUPPORT, EMERGENCY_PARSER, or an LCD controller." #elif ENABLED(HOME_BEFORE_FILAMENT_CHANGE) && DISABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) #error "HOME_BEFORE_FILAMENT_CHANGE requires PAUSE_PARK_NO_STEPPER_TIMEOUT." @@ -1026,15 +1028,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Special tool-changing options */ -#if 1 < 0 \ - + ENABLED(SINGLENOZZLE) \ - + ENABLED(DUAL_X_CARRIAGE) \ - + ENABLED(PARKING_EXTRUDER) \ - + ENABLED(MAGNETIC_PARKING_EXTRUDER) \ - + ENABLED(SWITCHING_TOOLHEAD) \ - + ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) \ - + ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) - #error "Please select only one of SINGLENOZZLE, DUAL_X_CARRIAGE, PARKING_EXTRUDER, SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, or ELECTROMAGNETIC_SWITCHING_TOOLHEAD." +#if MANY(SINGLENOZZLE, DUAL_X_CARRIAGE, PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER, SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #error "Please select only one of SINGLENOZZLE, DUAL_X_CARRIAGE, PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER, SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, or ELECTROMAGNETIC_SWITCHING_TOOLHEAD." #endif /** @@ -1161,16 +1156,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Allow only one kinematic type to be defined */ -#if 1 < 0 \ - + ENABLED(DELTA) \ - + ENABLED(MORGAN_SCARA) \ - + ENABLED(COREXY) \ - + ENABLED(COREXZ) \ - + ENABLED(COREYZ) \ - + ENABLED(COREYX) \ - + ENABLED(COREZX) \ - + ENABLED(COREZY) \ - + ENABLED(MARKFORGED_XY) +#if MANY(DELTA, MORGAN_SCARA, COREXY, COREXZ, COREYZ, COREYX, COREZX, COREZY, MARKFORGED_XY) #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." #endif @@ -1210,18 +1196,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * Allow only one probe option to be defined */ #if 1 < 0 \ - + ENABLED(PROBE_MANUALLY) \ - + ENABLED(FIX_MOUNTED_PROBE) \ - + ENABLED(NOZZLE_AS_PROBE) \ - + (HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH)) \ - + ENABLED(BLTOUCH) && DISABLED(CREALITY_TOUCH) \ - + ENABLED(CREALITY_TOUCH) \ - + ENABLED(TOUCH_MI_PROBE) \ - + ENABLED(SOLENOID_PROBE) \ - + ENABLED(Z_PROBE_ALLEN_KEY) \ - + ENABLED(Z_PROBE_SLED) \ - + ENABLED(RACK_AND_PINION_PROBE) \ - + ENABLED(SENSORLESS_PROBING) + + (DISABLED(BLTOUCH) && HAS_Z_SERVO_PROBE) \ + + (ENABLED(BLTOUCH) && DISABLED(CREALITY_TOUCH)) \ + + COUNT_ENABLED(PROBE_MANUALLY, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, CREALITY_TOUCH, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, RACK_AND_PINION_PROBE, SENSORLESS_PROBING) #error "Please enable only one probe option: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo." #endif @@ -1391,12 +1368,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Allow only one bed leveling option to be defined */ -#if 1 < 0 \ - + ENABLED(AUTO_BED_LEVELING_LINEAR) \ - + ENABLED(AUTO_BED_LEVELING_3POINT) \ - + ENABLED(AUTO_BED_LEVELING_BILINEAR) \ - + ENABLED(AUTO_BED_LEVELING_UBL) \ - + ENABLED(MESH_BED_LEVELING) +#if MANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL, MESH_BED_LEVELING) #error "Select only one of: MESH_BED_LEVELING, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_BILINEAR or AUTO_BED_LEVELING_UBL." #endif @@ -1558,8 +1530,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * ULTIPANEL encoder */ -#if ENABLED(ULTIPANEL) && NONE(NEWPANEL, SR_LCD_2W_NL) && !defined(SHIFT_CLK) - #error "ULTIPANEL requires some kind of encoder." +#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !defined(SHIFT_CLK) + #error "ULTIPANEL controllers require some kind of encoder." #endif #if ENCODER_PULSES_PER_STEP < 0 @@ -2237,89 +2209,100 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Make sure only one display is enabled */ #if 1 < 0 \ - + (ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && DISABLED(IS_RRD_SC)) \ - + (ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && DISABLED(IS_RRD_FG_SC)) \ - + (ENABLED(ULTRA_LCD) && DISABLED(IS_ULTRA_LCD)) \ + + ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) \ + + ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) \ + + ENABLED(ULTIPANEL) \ + + ENABLED(ULTRA_LCD) \ + (ENABLED(U8GLIB_SSD1306) && DISABLED(IS_U8GLIB_SSD1306)) \ + (ENABLED(MINIPANEL) && NONE(MKS_MINI_12864, ENDER2_STOCKDISPLAY)) \ + (ENABLED(MKS_MINI_12864) && DISABLED(MKS_LCD12864)) \ + (ENABLED(EXTENSIBLE_UI) && DISABLED(IS_EXTUI)) \ - + (ENABLED(ULTIPANEL) && DISABLED(IS_ULTIPANEL)) \ - + ENABLED(RADDS_DISPLAY) \ - + ENABLED(ULTIMAKERCONTROLLER) \ - + ENABLED(PANEL_ONE) \ - + ENABLED(G3D_PANEL) \ - + ENABLED(RIGIDBOT_PANEL) \ - + ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) \ - + ENABLED(ZONESTAR_LCD) \ - + ENABLED(RA_CONTROL_PANEL) \ - + ENABLED(LCD_SAINSMART_I2C_1602) \ - + ENABLED(LCD_SAINSMART_I2C_2004) \ - + ENABLED(LCM1602) \ - + ENABLED(LCD_I2C_PANELOLU2) \ - + ENABLED(LCD_I2C_VIKI) \ - + ENABLED(SAV_3DLCD) \ - + ENABLED(FF_INTERFACEBOARD) \ - + ENABLED(REPRAPWORLD_GRAPHICAL_LCD) \ - + ENABLED(VIKI2) \ - + ENABLED(miniVIKI) \ - + ENABLED(MAKRPANEL) \ - + ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ - + ENABLED(BQ_LCD_SMART_CONTROLLER) \ - + ENABLED(CARTESIO_UI) \ - + ENABLED(LCD_FOR_MELZI) \ - + ENABLED(ULTI_CONTROLLER) \ - + ENABLED(MKS_LCD12864) \ - + ENABLED(ENDER2_STOCKDISPLAY) \ - + ENABLED(FYSETC_MINI_12864_X_X) \ - + ENABLED(FYSETC_MINI_12864_1_2) \ - + ENABLED(FYSETC_MINI_12864_2_0) \ - + ENABLED(FYSETC_MINI_12864_2_1) \ - + ENABLED(FYSETC_GENERIC_12864_1_1) \ - + ENABLED(CR10_STOCKDISPLAY) \ - + ENABLED(DWIN_CREALITY_LCD) \ + + (DISABLED(IS_LEGACY_TFT) && ENABLED(TFT_GENERIC)) \ + + (ENABLED(IS_LEGACY_TFT) && COUNT_ENABLED(TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI)) \ + + COUNT_ENABLED(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, ANYCUBIC_TFT35) \ + + COUNT_ENABLED(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) \ + + COUNT_ENABLED(ENDER2_STOCKDISPLAY, CR10_STOCKDISPLAY, DWIN_CREALITY_LCD) \ + + COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) \ + + COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \ + + COUNT_ENABLED(MKS_12864OLED, MKS_12864OLED_SSD1306) \ + + COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R) \ + + COUNT_ENABLED(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) \ + + COUNT_ENABLED(VIKI2, miniVIKI) \ + + COUNT_ENABLED(ZONESTAR_12864LCD, ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) \ + ENABLED(ANET_FULL_GRAPHICS_LCD) \ + ENABLED(AZSMZ_12864) \ - + ENABLED(SILVER_GATE_GLCD_CONTROLLER) \ - + ENABLED(SAV_3DGLCD) \ - + ENABLED(OLED_PANEL_TINYBOY2) \ - + ENABLED(MKS_12864OLED) \ - + ENABLED(MKS_12864OLED_SSD1306) \ - + ENABLED(ZONESTAR_12864LCD) \ - + ENABLED(ZONESTAR_12864OLED) \ - + ENABLED(ZONESTAR_12864OLED_SSD1306) \ - + ENABLED(U8GLIB_SH1106_EINSTART) \ - + ENABLED(OVERLORD_OLED) \ + + ENABLED(BQ_LCD_SMART_CONTROLLER) \ + + ENABLED(CARTESIO_UI) \ + + ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + + ENABLED(FF_INTERFACEBOARD) \ + ENABLED(FYSETC_242_OLED_12864) \ - + ENABLED(DGUS_LCD_UI_ORIGIN) \ - + ENABLED(DGUS_LCD_UI_FYSETC) \ - + ENABLED(DGUS_LCD_UI_HIPRECY) \ + + ENABLED(G3D_PANEL) \ + + ENABLED(LCD_FOR_MELZI) \ + + ENABLED(LCD_I2C_PANELOLU2) \ + + ENABLED(LCD_I2C_VIKI) \ + + ENABLED(LCM1602) \ + + ENABLED(LONGER_LK_TFT28) \ + + ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) \ + + ENABLED(MAKRPANEL) \ + ENABLED(MALYAN_LCD) \ + + ENABLED(MKS_LCD12864) \ + + ENABLED(OLED_PANEL_TINYBOY2) \ + + ENABLED(OVERLORD_OLED) \ + + ENABLED(PANEL_ONE) \ + + ENABLED(RA_CONTROL_PANEL) \ + + ENABLED(RADDS_DISPLAY) \ + + ENABLED(REPRAPWORLD_GRAPHICAL_LCD) \ + + ENABLED(RIGIDBOT_PANEL) \ + + ENABLED(SAV_3DGLCD) \ + + ENABLED(SAV_3DLCD) \ + + ENABLED(SILVER_GATE_GLCD_CONTROLLER) \ + + ENABLED(TFT_TRONXY_X5SA) \ + ENABLED(TOUCH_UI_FTDI_EVE) \ - + ENABLED(TFT_320x240) \ - + ENABLED(TFT_320x240_SPI) \ - + ENABLED(FSMC_GRAPHICAL_TFT) \ - + ENABLED(TFT_LVGL_UI_FSMC) \ - + ENABLED(TFT_LVGL_UI_SPI) \ - + ENABLED(ANYCUBIC_LCD_I3MEGA) \ - + ENABLED(ANYCUBIC_LCD_CHIRON) \ - + ENABLED(TFTGLCD_PANEL_SPI) \ - + ENABLED(TFTGLCD_PANEL_I2C) + + ENABLED(U8GLIB_SH1106_EINSTART) \ + + ENABLED(ULTI_CONTROLLER) \ + + ENABLED(ULTIMAKERCONTROLLER) \ + + ENABLED(ZONESTAR_LCD) #error "Please select only one LCD controller option." #endif -#undef IS_RRD_SC -#undef IS_RRD_FG_SC -#undef IS_ULTRA_LCD #undef IS_U8GLIB_SSD1306 -#undef IS_RRW_KEYPAD #undef IS_EXTUI -#undef IS_ULTIPANEL +#undef IS_LEGACY_TFT -#if 1 < ENABLED(LCD_SCREEN_ROT_0) + ENABLED(LCD_SCREEN_ROT_90) + ENABLED(LCD_SCREEN_ROT_180) + ENABLED(LCD_SCREEN_ROT_270) +#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28) + #if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI) + #error "TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI is required for your TFT. Please enable one." + #elif 1 < ENABLED(TFT_COLOR_UI) + ENABLED(TFT_CLASSIC_UI) + ENABLED(TFT_LVGL_UI) + #error "Please select only one of TFT_COLOR_UI, TFT_CLASSIC_UI, or TFT_LVGL_UI." + #endif +#elif ANY(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI) + #error "TFT_(COLOR|CLASSIC|LVGL)_UI requires a TFT display to be enabled." +#endif + +#if ENABLED(TFT_GENERIC) && NONE(TFT_INTERFACE_FSMC, TFT_INTERFACE_SPI) + #error "TFT_GENERIC requires either TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI interface." +#endif + +#if BOTH(TFT_INTERFACE_FSMC, TFT_INTERFACE_SPI) + #error "Please enable only one of TFT_INTERFACE_SPI or TFT_INTERFACE_SPI." +#endif + +#if MANY(LCD_SCREEN_ROT_0, LCD_SCREEN_ROT_90, LCD_SCREEN_ROT_180, LCD_SCREEN_ROT_270) #error "Please enable only one LCD_SCREEN_ROT_* option: 0, 90, 180, or 270." #endif +#if MANY(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320) + #error "Please select only one of TFT_RES_480x320, TFT_RES_480x320, or TFT_RES_480x272." +#endif + +#if HAS_TFT_LVGL_UI && DISABLED(TFT_RES_480x320) + #error "(FMSC|SPI)TFT_LVGL_UI requires TFT_RES_480x320." +#endif + +#if defined(GRAPHICAL_TFT_UPSCALE) && !WITHIN(GRAPHICAL_TFT_UPSCALE, 2, 3) + #error "GRAPHICAL_TFT_UPSCALE must be set to 2 or 3." +#endif + /** * Serial displays require a dedicated serial port */ @@ -2756,7 +2739,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "BLOCK_BUFFER_SIZE must be a power of 2." #endif -#if ENABLED(LED_CONTROL_MENU) && DISABLED(ULTIPANEL) +#if ENABLED(LED_CONTROL_MENU) && !IS_ULTIPANEL #error "LED_CONTROL_MENU requires an LCD controller." #endif diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 7b6a13bc56..0cea923f6a 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -52,7 +52,7 @@ * to alert users to major changes. */ -#define MARLIN_HEX_VERSION 020007 +#define MARLIN_HEX_VERSION 020008 #ifndef REQUIRED_CONFIGURATION_H_VERSION #define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION #endif diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp index b5789091dc..4aa6bcd485 100644 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp @@ -28,7 +28,7 @@ * ultralcd_TFTGLCD.cpp * * Implementation of the LCD display routines for a TFT GLCD displays with external controller. - * This display looks as a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER but has good text font + * This display looks like a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER but has good text font * and supports color output. */ diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index da7d4f6f1e..535502f2e1 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -112,7 +112,7 @@ #ifndef U8G_COM_SSD_I2C_HAL #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn #endif -#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) +#if HAS_FSMC_GRAPHICAL_TFT || HAS_SPI_GRAPHICAL_TFT uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); #define U8G_COM_HAL_TFT_FN u8g_com_hal_tft_fn #else diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index d18b617987..fa9e006744 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -55,7 +55,7 @@ #include "../../inc/MarlinConfig.h" -#if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT)) +#if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || HAS_SPI_GRAPHICAL_TFT) #include "HAL_LCD_com_defines.h" #include "ultralcd_DOGM.h" @@ -477,4 +477,4 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_TFT_FN); -#endif // HAS_MARLINUI_U8GLIB && FSMC_CS +#endif // HAS_MARLINUI_U8GLIB && (FSMC_CS_PIN || HAS_SPI_GRAPHICAL_TFT) diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 228cee6848..b0db727f09 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -189,7 +189,7 @@ // Unspecified 320x240 TFT pre-initialized by built-in bootloader #define U8G_CLASS U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 - #if ENABLED(FSMC_GRAPHICAL_TFT) + #if HAS_FSMC_GRAPHICAL_TFT #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN #else #define U8G_PARAM -1, -1 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 6d7b68af42..e84bb395e0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -520,7 +520,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { j = 0; ignore_start = false; } - #if ENABLED(TFT_LVGL_UI_SPI) + #if HAS_TFT_LVGL_UI_SPI for (i = 0; i < 200;) { p_index = (uint16_t *)(&public_buf[i]); @@ -529,7 +529,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { i += 2; if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; } - #else + #else // !HAS_TFT_LVGL_UI_SPI for (i = 0; i < 200;) { p_index = (uint16_t *)(&public_buf[i]); //Color = (*p_index >> 8); @@ -537,7 +537,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { i += 2; if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // 0x18C3; } - #endif // TFT_LVGL_UI_SPI + #endif // !HAS_TFT_LVGL_UI_SPI memcpy(data_buf, public_buf, 200); #endif // SDSUPPORT } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index d600b09a5f..519fae2f39 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -751,7 +751,7 @@ char *creat_title_text() { card.openFileRead(cur_name); card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); - #if ENABLED(TFT_LVGL_UI_SPI) + #if HAS_TFT_LVGL_UI_SPI SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); #else LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); @@ -782,7 +782,7 @@ char *creat_title_text() { //#endif } - #if ENABLED(TFT_LVGL_UI_SPI) + #if HAS_TFT_LVGL_UI_SPI for (i = 0; i < 400;) { p_index = (uint16_t *)(&bmp_public_buf[i]); diff --git a/Marlin/src/lcd/scaled_tft.h b/Marlin/src/lcd/scaled_tft.h index 2c05e5f26d..54bf6f8d13 100644 --- a/Marlin/src/lcd/scaled_tft.h +++ b/Marlin/src/lcd/scaled_tft.h @@ -49,7 +49,7 @@ #define TFT_PIXEL_OFFSET_X 48 #endif #endif + #ifndef TFT_PIXEL_OFFSET_Y - // 32 is better for both 320x240 and 480x320 - #define TFT_PIXEL_OFFSET_Y 32 + #define TFT_PIXEL_OFFSET_Y 32 // 32 is best for both 320x240 and 480x320 #endif diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 7003d13fdd..da9c3e2456 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -400,7 +400,7 @@ bool MarlinUI::get_blink() { ///////////// Keypad Handling ////////////// //////////////////////////////////////////// -#if BOTH(REPRAPWORLD_KEYPAD, HAS_ENCODER_ACTION) +#if IS_RRW_KEYPAD && HAS_ENCODER_ACTION volatile uint8_t MarlinUI::keypad_buttons; @@ -432,7 +432,7 @@ bool MarlinUI::get_blink() { #if HAS_ENCODER_ACTION refresh(LCDVIEW_REDRAW_NOW); #if HAS_LCD_MENU - if (encoderDirection == -(ENCODERBASE)) { // ADC_KEYPAD forces REVERSE_MENU_DIRECTION, so this indicates menu navigation + if (encoderDirection == -(ENCODERBASE)) { // HAS_ADC_BUTTONS forces REVERSE_MENU_DIRECTION, so this indicates menu navigation if (RRK(EN_KEYPAD_UP)) encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; else if (RRK(EN_KEYPAD_DOWN)) encoderPosition -= ENCODER_STEPS_PER_MENU_ITEM; else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } @@ -497,12 +497,12 @@ bool MarlinUI::get_blink() { return true; } - #endif // !ADC_KEYPAD + #endif // !HAS_ADC_BUTTONS return false; } -#endif // REPRAPWORLD_KEYPAD +#endif // IS_RRW_KEYPAD && HAS_ENCODER_ACTION /** * Status Screen diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index c7ef41596d..bf9e47e0c8 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -34,13 +34,13 @@ #if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY) #define HAS_ENCODER_ACTION 1 #endif -#if ((!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL +#if ((!HAS_ADC_BUTTONS && IS_NEWPANEL) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL #define HAS_ENCODER_WHEEL 1 #endif #if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT) #define HAS_DIGITAL_BUTTONS 1 #endif -#if !HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_WIRED_LCD && DISABLED(NEWPANEL))) +#if !HAS_ADC_BUTTONS && (IS_RRW_KEYPAD || (HAS_WIRED_LCD && !IS_NEWPANEL)) #define HAS_SHIFT_ENCODER 1 #endif @@ -106,8 +106,7 @@ #endif // HAS_WIRED_LCD -// REPRAPWORLD_KEYPAD (and ADC_KEYPAD) -#if ENABLED(REPRAPWORLD_KEYPAD) +#if IS_RRW_KEYPAD #define BTN_OFFSET 0 // Bit offset into buttons for shift register values #define BLEN_KEYPAD_F3 0 @@ -136,7 +135,7 @@ #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE) #endif -#endif +#endif // IS_RRW_KEYPAD #if HAS_DIGITAL_BUTTONS @@ -633,7 +632,7 @@ public: #if HAS_ENCODER_ACTION static volatile uint8_t buttons; - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD static volatile uint8_t keypad_buttons; static bool handle_keypad(); #endif diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index 95f761f26a..d22a82d7a4 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -134,7 +134,7 @@ #define BEEPER_PIN 151 - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #elif IS_RRD_FG_SC #define BEEPER_PIN 151 diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h index 002d2ebd9c..ce2ee2579a 100644 --- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h +++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h @@ -400,7 +400,7 @@ #define LCD_PINS_ENABLE 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) + #elif BOTH(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS 40 #define LCD_PINS_ENABLE 42 @@ -417,7 +417,7 @@ #define LCD_PINS_ENABLE 29 #define LCD_PINS_D4 25 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 37 #endif @@ -450,13 +450,13 @@ #define LCD_PINS_D7 29 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 33 #endif #endif - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL // Buttons attached to a shift register // Not wired yet //#define SHIFT_CLK 38 @@ -470,7 +470,7 @@ // // LCD Display input pins // - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) @@ -607,7 +607,7 @@ #define BEEPER_PIN 33 // Buttons are directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD #define SHIFT_OUT 40 #define SHIFT_CLK 44 #define SHIFT_LD 42 @@ -630,6 +630,6 @@ #endif #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h index df182049f9..8c1c124d90 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -138,8 +138,8 @@ #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 - #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER) - #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU B300 v1.0" + #if BOTH(HAS_MARLINUI_HD44780, IS_RRD_SC) + #error "REPRAP_DISCOUNT_SMART_CONTROLLER displays aren't supported by the BIQU B300 v1.0" #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index bcff04eb85..d92d5e578f 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -109,8 +109,8 @@ #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 - #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER) - #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU BQ111-A4" + #if BOTH(HAS_MARLINUI_HD44780, IS_RRD_SC) + #error "REPRAP_DISCOUNT_SMART_CONTROLLER displays aren't supported by the BIQU BQ111-A4" #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index 31373fedff..51e48fc8e9 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -348,7 +348,7 @@ #define LCD_BACKLIGHT_PIN -1 #endif - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 EXPA1_05_PIN #define LCD_PINS_D6 EXPA1_04_PIN #define LCD_PINS_D7 EXPA1_03_PIN diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 4686e984b0..f2afc23bc2 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -293,9 +293,6 @@ #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 - #endif // SPI 1 #define SCK_PIN P0_15 #define MISO_PIN P0_17 @@ -398,7 +395,7 @@ #define FORCE_SOFT_SPI #endif - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 P1_21 #define LCD_PINS_D6 P1_22 #define LCD_PINS_D7 P1_23 diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 5132081a55..3562619f5c 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -125,7 +125,7 @@ // // LCD // -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +#if IS_RRD_SC #define BEEPER_PIN P0_19 #define BTN_EN1 P1_23 #define BTN_EN2 P1_24 diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 6c6a9ea306..2430958895 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -147,7 +147,7 @@ // // Ethernet pins // -#ifndef ULTIPANEL +#if !IS_ULTIPANEL #define ENET_MDIO P1_17 // J12-4 #define ENET_RX_ER P1_14 // J12-6 #define ENET_RXD1 P1_10 // J12-8 diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index d269ecbdc9..0a8f3a6da8 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -319,7 +319,7 @@ #define DOGLCD_A0 P1_00 #endif - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 P0_17 #define LCD_PINS_D6 P1_00 #define LCD_PINS_D7 P1_22 diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 294e7527a8..674bd6b0ff 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -357,8 +357,8 @@ #define LCD_PINS_RS P0_16 // (16) J3-7 & AUX-4 #define LCD_SDSS P1_23 // (53) J3-5 & AUX-3 - #if ENABLED(NEWPANEL) - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_NEWPANEL + #if IS_RRW_KEYPAD #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 #define SHIFT_LD P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) @@ -416,7 +416,7 @@ #define LCD_BACKLIGHT_PIN P0_16 //(16) J3-7 & AUX-4 - only used on DOGLCD controllers #define LCD_PINS_ENABLE P0_18 // (51) (MOSI) J3-10 & AUX-3 #define LCD_PINS_D4 P0_15 // (52) (SCK) J3-9 & AUX-3 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 @@ -436,7 +436,7 @@ // // Ethernet pins // -#if DISABLED(ULTIPANEL) +#if !IS_ULTIPANEL #define ENET_MDIO P1_17 // (71) J12-4 #define ENET_RX_ER P1_14 // (73) J12-6 #define ENET_RXD1 P1_10 // (75) J12-8 diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h index f9b9db918d..4e3b2ef425 100644 --- a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h +++ b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h @@ -96,7 +96,7 @@ // Display // -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) +#if IS_RRD_FG_SC #define LCD_PINS_RS P0_16 #define LCD_PINS_ENABLE P0_18 #define LCD_PINS_D4 P0_15 @@ -110,4 +110,4 @@ #define BTN_ENC P1_30 #define SD_DETECT_PIN -1 -#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +#endif // IS_RRD_FG_SC diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index 6331d6aa7c..ad792447ea 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -144,11 +144,11 @@ #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 #define SHIFT_LD P1_31 // (49) not 5V tolerant J3-1 & AUX-3 - #elif DISABLED(NEWPANEL) + #elif !IS_NEWPANEL //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 @@ -166,7 +166,7 @@ #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes #else - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 62660935f5..e18f938dc4 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -325,7 +325,7 @@ #define DOGLCD_A0 P1_00 #endif - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 P0_17 #define LCD_PINS_D6 P1_00 #define LCD_PINS_D7 P1_22 diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index f2811b14ab..3c47a70101 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -138,7 +138,7 @@ * http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg * http://smoothieware.org/panel */ - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #if IS_RRD_FG_SC // EXP1 Pins #define BEEPER_PIN P1_31 // EXP1 Pin 1 #define BTN_ENC P1_30 // EXP1 Pin 2 diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h index 3a84f4395f..af9f683c7d 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h @@ -129,7 +129,7 @@ #define SD_DETECT_PIN 49 #endif -#if ENABLED(NEWPANEL) +#if IS_NEWPANEL #define BTN_EN1 11 #define BTN_EN2 12 #define BTN_ENC 43 diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index 2fe9a43ba1..f481db2b96 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -109,7 +109,7 @@ #define BEEPER_PIN 18 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #if ENABLED(MKS_MINI_12864) #define DOGLCD_A0 5 @@ -130,7 +130,7 @@ #define BTN_ENC 19 #define SD_DETECT_PIN 38 - #else // !NEWPANEL + #else // !IS_NEWPANEL #define SHIFT_CLK 38 #define SHIFT_LD 42 @@ -146,6 +146,6 @@ #define SD_DETECT_PIN -1 - #endif // !NEWPANEL + #endif // !IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index d71a195419..606debd1b0 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -172,7 +172,7 @@ #define LCD_PINS_D7 36 #endif -#if ENABLED(NEWPANEL) +#if IS_NEWPANEL #ifndef BTN_EN1 #define BTN_EN1 42 #endif diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h index e1956488c6..20cccf148f 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h @@ -32,7 +32,7 @@ #define SPEAKER // The speaker can produce tones -#if ENABLED(NEWPANEL) +#if IS_NEWPANEL #define BTN_EN1 16 #define BTN_EN2 17 #define BTN_ENC 19 diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index e30a65b90e..fa2027fb78 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -127,7 +127,7 @@ #define BEEPER_PIN 18 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define LCD_PINS_RS 20 // LCD_CS #define LCD_PINS_ENABLE 15 // LCD_SDA @@ -168,6 +168,6 @@ #define LCD_PINS_D6 20 #define LCD_PINS_D7 19 - #endif // !NEWPANEL + #endif // !IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index 1c37b21ab7..f813366a14 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -108,7 +108,7 @@ // #define BEEPER_PIN 33 -#if BOTH(ULTRA_LCD, NEWPANEL) +#if IS_ULTRA_LCD && IS_NEWPANEL #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 17 @@ -124,7 +124,7 @@ #define SD_DETECT_PIN -1 // RAMPS doesn't use this -#endif // ULTRA_LCD && NEWPANEL +#endif // IS_ULTRA_LCD && IS_NEWPANEL // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index ff7cf15714..67ec24ed6f 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -139,7 +139,7 @@ #define LCD_PINS_D6 32 #define LCD_PINS_D7 33 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL // Buttons are directly attached using keypad #define BTN_EN1 61 #define BTN_EN2 59 diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index 963911ec5d..d074db8b25 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -214,7 +214,7 @@ // #if HAS_WIRED_LCD - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #if IS_RRD_FG_SC #define LCD_PINS_RS 33 // C4: LCD-STROBE #define LCD_PINS_ENABLE 72 // J2: LEFT diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h index 045c1bc0fa..18bb1f27bf 100644 --- a/Marlin/src/pins/mega/pins_OVERLORD.h +++ b/Marlin/src/pins/mega/pins_OVERLORD.h @@ -132,7 +132,7 @@ #endif #endif -#if ENABLED(NEWPANEL) +#if IS_NEWPANEL #define BTN_ENC 16 // Enter Pin #define BTN_UP 19 // Button UP Pin #define BTN_DWN 17 // Button DOWN Pin diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index c5dbd20876..bd85c44899 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -49,7 +49,9 @@ #define IS_RAMPS_SF #endif -#define HAS_FREE_AUX2_PINS !(BOTH(ULTRA_LCD, NEWPANEL) && ANY(PANEL_ONE, VIKI2, miniVIKI, MINIPANEL, REPRAPWORLD_KEYPAD)) +#if !(BOTH(IS_ULTRA_LCD, IS_NEWPANEL) && ANY(PANEL_ONE, VIKI2, miniVIKI, MINIPANEL, REPRAPWORLD_KEYPAD)) + #define HAS_FREE_AUX2_PINS 1 +#endif // Test the target within the included pins file #ifdef __MARLIN_DEPS__ diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 2ea15c97d3..c2cc24943a 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -164,7 +164,7 @@ #define KILL_PIN 32 - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL + #if IS_ULTIPANEL || TOUCH_UI_ULTIPANEL #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS 85 @@ -187,5 +187,5 @@ #define BEEPER_PIN 84 // AUX-4 #define SD_DETECT_PIN 15 - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL + #endif // IS_ULTIPANEL || TOUCH_UI_ULTIPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index 4a1bf70b6e..7e53246181 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -170,7 +170,7 @@ #define KILL_PIN 32 - #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) + #if ANY(IS_ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS 85 @@ -194,6 +194,6 @@ #define SD_DETECT_PIN 15 - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE + #endif // IS_ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE #endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index 6314bc07b8..8b034820cf 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -147,7 +147,7 @@ #define KILL_PIN 32 #endif - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL + #if IS_ULTIPANEL || TOUCH_UI_ULTIPANEL #if MB(MINIRAMBO_10A) @@ -187,6 +187,6 @@ #endif // !MINIRAMBO_10A - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL + #endif // IS_ULTIPANEL || TOUCH_UI_ULTIPANEL #endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 735852b2ff..0254edea26 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -187,7 +187,7 @@ #define KILL_PIN 80 - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL + #if IS_ULTIPANEL || TOUCH_UI_ULTIPANEL #define LCD_PINS_RS 70 #define LCD_PINS_ENABLE 71 @@ -228,7 +228,7 @@ #endif // !VIKI2 && !miniVIKI - #else // !NEWPANEL - old style panel with shift register + #else // !IS_NEWPANEL - old style panel with shift register // No Beeper added #define BEEPER_PIN 33 @@ -247,6 +247,6 @@ #define LCD_PINS_D6 27 #define LCD_PINS_D7 29 - #endif // !NEWPANEL + #endif // !IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h index f0057e1fc9..b7f0517aac 100644 --- a/Marlin/src/pins/ramps/pins_3DRAG.h +++ b/Marlin/src/pins/ramps/pins_3DRAG.h @@ -78,7 +78,7 @@ // // LCD / Controller // -#if BOTH(ULTRA_LCD, NEWPANEL) +#if IS_ULTRA_LCD && IS_NEWPANEL #undef BEEPER_PIN #undef LCD_PINS_RS @@ -106,7 +106,7 @@ #define BEEPER_PIN 33 -#endif // ULTRA_LCD && NEWPANEL +#endif // IS_ULTRA_LCD && IS_NEWPANEL /** * M3/M4/M5 - Spindle/Laser Control @@ -157,7 +157,7 @@ #define SPINDLE_LASER_PWM_PIN 46 // Hardware PWM #define SPINDLE_LASER_ENA_PIN 62 // Pullup! #define SPINDLE_DIR_PIN 48 - #elif !BOTH(ULTRA_LCD, NEWPANEL) // use expansion header if no LCD in use + #elif !BOTH(IS_ULTRA_LCD, IS_NEWPANEL) // use expansion header if no LCD in use #define SPINDLE_LASER_ENA_PIN 16 // Pullup or pulldown! #define SPINDLE_DIR_PIN 17 #endif diff --git a/Marlin/src/pins/ramps/pins_FELIX2.h b/Marlin/src/pins/ramps/pins_FELIX2.h index 6cc6997adc..e572d3f286 100644 --- a/Marlin/src/pins/ramps/pins_FELIX2.h +++ b/Marlin/src/pins/ramps/pins_FELIX2.h @@ -49,11 +49,11 @@ // // LCD / Controller // -#if BOTH(ULTRA_LCD, NEWPANEL) +#if IS_ULTRA_LCD && IS_NEWPANEL #define SD_DETECT_PIN 6 -#endif // NEWPANEL && ULTRA_LCD +#endif // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h index 0877d168d6..5b724787e9 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h @@ -181,7 +181,7 @@ // // Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER // -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +#if IS_RRD_SC #define BEEPER_PIN 37 #define BTN_EN1 31 #define BTN_EN2 33 diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h index 75a219c177..81b6ea16d7 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h @@ -175,7 +175,7 @@ // // Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER // -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +#if IS_RRD_SC #ifndef BEEPER_PIN #define BEEPER_PIN 37 #endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h index 0470fc47e9..a97b0d2d12 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h @@ -155,7 +155,7 @@ // // Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER // -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +#if IS_RRD_SC #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 17 #define LCD_PINS_D4 23 diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index 3fa3cc9e8c..9e4ee10096 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -277,7 +277,7 @@ #endif - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define BTN_EN1 31 #define BTN_EN2 33 #define BTN_ENC 35 diff --git a/Marlin/src/pins/ramps/pins_K8600.h b/Marlin/src/pins/ramps/pins_K8600.h index 0de0192752..60bb18204a 100644 --- a/Marlin/src/pins/ramps/pins_K8600.h +++ b/Marlin/src/pins/ramps/pins_K8600.h @@ -96,7 +96,7 @@ // // LCD / Controller // -#if BOTH(ULTRA_LCD, NEWPANEL) +#if IS_ULTRA_LCD && IS_NEWPANEL #undef BEEPER_PIN #undef LCD_PINS_RS diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h index 7e8c245a41..5388c9621d 100644 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -113,7 +113,7 @@ #define LCD_CONTRAST_MAX 100 #define DEFAULT_LCD_CONTRAST 30 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define BTN_EN1 17 #define BTN_EN2 16 #define BTN_ENC 23 diff --git a/Marlin/src/pins/ramps/pins_ORTUR_4.h b/Marlin/src/pins/ramps/pins_ORTUR_4.h index cef01bf62a..e79973e06f 100644 --- a/Marlin/src/pins/ramps/pins_ORTUR_4.h +++ b/Marlin/src/pins/ramps/pins_ORTUR_4.h @@ -91,7 +91,7 @@ // // LCD / Controller // -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) +#if IS_RRD_FG_SC #undef BEEPER_PIN #define BEEPER_PIN 35 diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index de56d2b59d..c8578f2fa1 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -441,7 +441,7 @@ #define LCD_PINS_ENABLE 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) + #elif BOTH(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS 40 #define LCD_PINS_ENABLE 42 @@ -462,7 +462,7 @@ #define LCD_PINS_ENABLE 29 #define LCD_PINS_D4 25 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 37 #endif @@ -481,10 +481,10 @@ #define LCD_PINS_DC 25 // Set as output on init #define LCD_PINS_RS 27 // Pull low for 1s to init // DOGM SPI LCD Support + #define DOGLCD_A0 LCD_PINS_DC #define DOGLCD_CS 16 #define DOGLCD_MOSI 17 #define DOGLCD_SCK 23 - #define DOGLCD_A0 LCD_PINS_DC #else #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 17 @@ -495,13 +495,13 @@ #define LCD_PINS_D7 29 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 33 #endif #endif - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL // Buttons attached to a shift register // Not wired yet //#define SHIFT_CLK 38 @@ -515,9 +515,9 @@ // // LCD Display input pins // - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN 37 @@ -685,6 +685,7 @@ #elif ENABLED(AZSMZ_12864) // Pins only defined for RAMPS_SMART currently + #error "No pins defined for RAMPS with AZSMZ_12864." #elif IS_TFTGLCD_PANEL @@ -712,11 +713,11 @@ #endif #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD -#if ENABLED(REPRAPWORLD_KEYPAD) && DISABLED(ADC_KEYPAD) +#if IS_RRW_KEYPAD && !HAS_ADC_BUTTONS #define SHIFT_OUT 40 #define SHIFT_CLK 44 #define SHIFT_LD 42 diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h index 9908d9494f..23b1dfa346 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -73,7 +73,7 @@ #undef E0_CS_PIN #undef E1_CS_PIN -#if ENABLED(ULTRA_LCD) && NONE(REPRAPWORLD_GRAPHICAL_LCD, CR10_STOCKDISPLAY) && !BOTH(NEWPANEL, PANEL_ONE) +#if IS_ULTRA_LCD && NONE(REPRAPWORLD_GRAPHICAL_LCD, CR10_STOCKDISPLAY) && !BOTH(IS_NEWPANEL, PANEL_ONE) #if DISABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) #undef LCD_PINS_RS #define LCD_PINS_RS 42 // 3DYMY boards pin 16 -> 42 diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h index c43d786aa2..345c51d5de 100644 --- a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h +++ b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h @@ -124,7 +124,7 @@ #undef SD_DETECT_PIN #define SD_DETECT_PIN 22 -#elif ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +#elif IS_RRD_SC #undef SD_DETECT_PIN #define SD_DETECT_PIN 22 diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h index 5be2896e18..4af49d9164 100644 --- a/Marlin/src/pins/ramps/pins_RUMBA.h +++ b/Marlin/src/pins/ramps/pins_RUMBA.h @@ -227,7 +227,7 @@ #define SD_DETECT_PIN 49 #endif -#if ENABLED(NEWPANEL) +#if IS_NEWPANEL #define BTN_EN1 11 #define BTN_EN2 12 #define BTN_ENC 43 diff --git a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h index e7a59a69df..84e7e31126 100644 --- a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h +++ b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h @@ -163,7 +163,7 @@ // LCD / Controller // -//#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +//#if IS_RRD_SC #define LCD_PINS_RS -1 #define LCD_PINS_ENABLE -1 @@ -182,4 +182,4 @@ #define BEEPER_PIN -1 //#endif -//#endif // REPRAP_DISCOUNT_SMART_CONTROLLER +//#endif // IS_RRD_SC diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index 1c2cb60957..54d91cee6a 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -131,13 +131,13 @@ #if 0 && HAS_WIRED_LCD // LCD Display output pins - #if BOTH(NEWPANEL, PANEL_ONE) + #if BOTH(IS_NEWPANEL, PANEL_ONE) #undef LCD_PINS_D6 #define LCD_PINS_D6 57 #endif // LCD Display input pins - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #if ANY(VIKI2, miniVIKI) #undef DOGLCD_A0 #define DOGLCD_A0 23 diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index 1568288e69..725d36466c 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -282,7 +282,7 @@ #define LCD_PINS_ENABLE 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) + #elif BOTH(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS 40 #define LCD_PINS_ENABLE 42 @@ -309,7 +309,7 @@ #define LCD_PINS_ENABLE 29 #define LCD_PINS_D4 25 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 37 #endif @@ -333,13 +333,13 @@ #define LCD_PINS_D7 29 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 33 #endif #endif - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL // Buttons attached to a shift register // Not wired yet //#define SHIFT_CLK 38 @@ -353,9 +353,9 @@ // // LCD Display input pins // - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN 37 @@ -486,7 +486,7 @@ #define BEEPER_PIN 33 // Buttons are directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD #define SHIFT_OUT 40 #define SHIFT_CLK 44 #define SHIFT_LD 42 @@ -510,6 +510,6 @@ #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index 597a37bdbc..116301f4d4 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -123,7 +123,7 @@ #define BEEPER_PIN 18 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define LCD_PINS_RS 20 #define LCD_PINS_ENABLE 17 @@ -139,7 +139,7 @@ #define SD_DETECT_PIN 38 - #else // !NEWPANEL - Old style panel with shift register + #else // !IS_NEWPANEL - Old style panel with shift register // Buttons attached to a shift register #define SHIFT_CLK 38 @@ -156,7 +156,7 @@ #define SD_DETECT_PIN -1 - #endif // !NEWPANEL + #endif // !IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index c5bbd02bf5..9b17384aaf 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -174,11 +174,11 @@ #define LCD_PINS_D6 32 #define LCD_PINS_D7 30 -#elif BOTH(BOARD_REV_1_5, ULTRA_LCD) +#elif BOTH(BOARD_REV_1_5, IS_ULTRA_LCD) #define BEEPER_PIN 18 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define LCD_PINS_RS 20 #define LCD_PINS_ENABLE 17 @@ -194,7 +194,7 @@ #define SD_DETECT_PIN 38 - #else // !NEWPANEL - Old style panel with shift register + #else // !IS_NEWPANEL - Old style panel with shift register // Buttons attached to a shift register #define SHIFT_CLK 38 @@ -209,7 +209,7 @@ #define LCD_PINS_D6 20 #define LCD_PINS_D7 19 - #endif // !NEWPANEL + #endif // !IS_NEWPANEL #endif diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index 8d6906117d..b01d1aafdf 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -143,7 +143,7 @@ // // LCD / Controller // -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) +#if IS_RRD_FG_SC #define LCD_PINS_RS 18 #define LCD_PINS_ENABLE 15 #define LCD_PINS_D4 19 @@ -152,7 +152,7 @@ #define UI_VOLTAGE_LEVEL 1 #endif -#if ENABLED(NEWPANEL) +#if IS_NEWPANEL #define BTN_EN1 14 #define BTN_EN2 16 #define BTN_ENC 17 diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h index 6e3768c663..347afe9ebd 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM1.h +++ b/Marlin/src/pins/sam/pins_ARCHIM1.h @@ -192,10 +192,10 @@ #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL // Buttons on AUX-2 #define BTN_EN1 60 // D60 PA3_TIOB1 #define BTN_EN2 13 // D13 PB27_TIOB0 #define BTN_ENC 16 // D16 PA13_TXD1 - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h index 5a3fe0e4d5..5923ea0f8f 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM2.h +++ b/Marlin/src/pins/sam/pins_ARCHIM2.h @@ -247,11 +247,11 @@ #define LCD_PINS_D7 34 // D34 PC2_PWML0 #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 - - #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) - // Buttons on AUX-2 - #define BTN_EN1 60 // D60 PA3_TIOB1 - #define BTN_EN2 13 // D13 PB27_TIOB0 - #define BTN_ENC 16 // D16 PA13_TXD1 // the click - #endif +#endif + +#if ANY(IS_ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) + // Buttons on AUX-2 + #define BTN_EN1 60 // D60 PA3_TIOB1 + #define BTN_EN2 13 // D13 PB27_TIOB0 + #define BTN_ENC 16 // D16 PA13_TXD1 // the click #endif diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index cd4033aa6f..a5c22ff3f2 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -122,7 +122,7 @@ #define LCD_PINS_D6 46 #define LCD_PINS_D7 47 - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN 41 diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 5f9ad48a08..b3e76199dc 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -114,7 +114,7 @@ #define LCD_PINS_D6 46 #define LCD_PINS_D7 47 - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN 41 diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index 60fe351237..cd895365d0 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -248,7 +248,7 @@ #define SDSS 10 #define SD_DETECT_PIN 14 - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #elif IS_RRD_FG_SC // The REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER requires // an adapter such as https://www.thingiverse.com/thing:1740725 diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h index bfc3968ffa..44e2695a53 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -78,7 +78,7 @@ // #if HAS_WIRED_LCD - #if BOTH(NEWPANEL, PANEL_ONE) + #if BOTH(IS_NEWPANEL, PANEL_ONE) #undef LCD_PINS_D4 #define LCD_PINS_D4 68 @@ -89,7 +89,7 @@ #define LCD_PINS_D7 67 #endif - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) @@ -115,7 +115,7 @@ #else - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD #undef BTN_EN1 #define BTN_EN1 67 // encoder @@ -127,6 +127,6 @@ #endif #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h index ee525eefaa..a0dbddf567 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -148,7 +148,7 @@ #define BTN_ENC 35 #define SD_DETECT_PIN 49 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 17 #endif @@ -178,7 +178,7 @@ #define NEOPIXEL_PIN 25 #endif - #elif ENABLED(NEWPANEL) + #elif IS_NEWPANEL #define LCD_PINS_D4 23 #define LCD_PINS_D5 25 diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index b9e61fb27c..49378541a9 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -202,7 +202,7 @@ // #if HAS_WIRED_LCD - #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #if ANY(RADDS_DISPLAY, IS_RRD_SC, IS_RRD_FG_SC) #define BEEPER_PIN 62 #define LCD_PINS_D4 48 #define LCD_PINS_D5 50 @@ -211,12 +211,12 @@ #define SD_DETECT_PIN 51 #endif - #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER) + #if EITHER(RADDS_DISPLAY, IS_RRD_SC) #define LCD_PINS_RS 63 #define LCD_PINS_ENABLE 64 - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #elif IS_RRD_FG_SC #define LCD_PINS_RS 52 #define LCD_PINS_ENABLE 53 @@ -265,7 +265,7 @@ #endif // SPARK_FULL_GRAPHICS - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define BTN_EN1 44 #define BTN_EN2 42 #define BTN_ENC 40 diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index dc0c127995..1cc2eee6b0 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -188,7 +188,7 @@ // #if HAS_WIRED_LCD - #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #if ANY(RADDS_DISPLAY, IS_RRD_SC, IS_RRD_FG_SC) #define BEEPER_PIN 62 #define LCD_PINS_D4 48 #define LCD_PINS_D5 50 @@ -197,12 +197,12 @@ #define SD_DETECT_PIN 51 #endif - #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER) + #if EITHER(RADDS_DISPLAY, IS_RRD_SC) #define LCD_PINS_RS 63 #define LCD_PINS_ENABLE 64 - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #elif IS_RRD_FG_SC #define LCD_PINS_RS 52 #define LCD_PINS_ENABLE 53 @@ -247,7 +247,7 @@ #endif - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define BTN_EN1 44 #define BTN_EN2 42 #define BTN_ENC 40 diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index 6076be07e9..1948acf897 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -299,7 +299,7 @@ //#define LCD_PINS_ENABLE 51 // SID (MOSI) //#define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) + #elif BOTH(IS_NEWPANEL, PANEL_ONE) // TO TEST //#define LCD_PINS_RS 40 @@ -318,7 +318,7 @@ //#define LCD_PINS_ENABLE 29 //#define LCD_PINS_D4 25 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL // TO TEST //#define BEEPER_PIN 37 #endif @@ -354,13 +354,13 @@ #define LCD_PINS_D7 29 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 33 #endif #endif - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL // Buttons attached to a shift register // Not wired yet //#define SHIFT_CLK 38 @@ -374,9 +374,9 @@ // // LCD Display input pins // - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN 37 @@ -565,7 +565,7 @@ //#define BEEPER_PIN 33 // Buttons are directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD // TO TEST //#define SHIFT_OUT 40 //#define SHIFT_CLK 44 @@ -592,7 +592,7 @@ #endif #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index 74692a21a3..d48db36287 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -151,7 +151,7 @@ #if HAS_WIRED_LCD #define LCD_SDSS 28 - #if ENABLED(ADC_KEYPAD) + #if HAS_ADC_BUTTONS #define SERVO0_PIN 27 // free for BLTouch/3D-Touch #define LCD_PINS_RS 28 #define LCD_PINS_ENABLE 29 @@ -160,7 +160,7 @@ #define LCD_PINS_D6 16 #define LCD_PINS_D7 17 #define ADC_KEYPAD_PIN 1 - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #elif IS_RRD_FG_SC // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index 438d49d615..69b351e3fc 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -136,7 +136,7 @@ #define LCD_BACKLIGHT_PIN 17 // LCD backlight LED #endif -#if NONE(SPINDLE_FEATURE, LASER_FEATURE) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(ULTRA_LCD, NEWPANEL)// try to use IO Header +#if NONE(SPINDLE_FEATURE, LASER_FEATURE) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(IS_ULTRA_LCD, IS_NEWPANEL) // try to use IO Header #define CASE_LIGHT_PIN 4 // Hardware PWM - see if IO Header is available #endif @@ -185,7 +185,7 @@ // with M42 instead of BEEPER_PIN. #define BEEPER_PIN 27 - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #if IS_RRD_FG_SC #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(0) #endif @@ -283,7 +283,7 @@ #endif - #if ENABLED(NEWPANEL) && !defined(BTN_EN1) + #if IS_NEWPANEL && !defined(BTN_EN1) #define BTN_EN1 11 #define BTN_EN2 10 #endif @@ -294,7 +294,7 @@ // M3/M4/M5 - Spindle/Laser Control // #if HAS_CUTTER - #if !MB(AZTEEG_X1) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(ULTRA_LCD, NEWPANEL)// try to use IO Header + #if !MB(AZTEEG_X1) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(IS_ULTRA_LCD, IS_NEWPANEL) // try to use IO Header #define SPINDLE_LASER_ENA_PIN 10 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index 838ffe38aa..4257b2c40e 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -225,7 +225,7 @@ // // All the above are also RRDSC with rotary encoder // -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +#if IS_RRD_SC #define BTN_EN1 2 #define BTN_EN2 12 #define BTN_ENC 29 diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index 47fff4467c..ce43e677e2 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -175,7 +175,7 @@ #else // !FYSETC_MINI_12864 #define LCD_PINS_D4 PC13 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PB7 #define LCD_PINS_D6 PC15 #define LCD_PINS_D7 PC14 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index 3a872db025..1d8f4f684b 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -126,7 +126,7 @@ #define LCD_PINS_RS PD1 // 49 // CS chip select /SS chip slave select #define LCD_PINS_ENABLE PD3 // 51 // SID (MOSI) #define LCD_PINS_D4 PD4 // 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) + #elif BOTH(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 #define LCD_PINS_D4 PB12 @@ -140,7 +140,7 @@ #define LCD_PINS_D5 PB13 #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN PC1 // 33 // Buttons attached to a shift register // Not wired yet @@ -151,9 +151,9 @@ #endif #endif - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN PC5 @@ -254,7 +254,7 @@ #define BEEPER_PIN PC1 // 33 // Buttons directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD #define BTN_EN1 PE0 // 64 #define BTN_EN2 PD11 // 59 #define BTN_ENC PD15 // 63 @@ -279,6 +279,6 @@ #endif #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index b02d414089..33ec27ddba 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -152,9 +152,6 @@ // Color UI #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 -#elif ENABLED(TFT_CLASSIC_UI) - // Emulated DOGM - #define GRAPHICAL_TFT_UPSCALE 3 #endif // XPT2046 Touch Screen calibration diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index cafd50dcf2..990d33b759 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -167,9 +167,6 @@ // Color UI #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 -#elif ENABLED(TFT_CLASSIC_UI) - // Emulated DOGM - #define GRAPHICAL_TFT_UPSCALE 3 #endif // XPT2046 Touch Screen calibration diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index ebe5964d05..d2c587beb8 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -162,7 +162,7 @@ // not connected to a pin #define SD_DETECT_PIN PC3 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL // The encoder and click button #define BTN_EN1 PC10 #define BTN_EN2 PC11 diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index de5ea45d44..deca1a0546 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -153,7 +153,7 @@ //#define LCD_CONTRAST_INIT 190 - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL #define BTN_EN1 PC10 #define BTN_EN2 PC11 #define BTN_ENC PC12 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index ca25c45a7b..00c5721384 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -137,7 +137,7 @@ // #if HAS_WIRED_LCD - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC // // LCD display on J2 FFC40 // Geeetech's LCD2004A Control Panel is very much like @@ -172,7 +172,7 @@ #endif // HAS_WIRED_LCD -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +#if IS_RRD_SC // // Geeetech's LCD2004A Control Panel is very much like // RepRapDiscount Smart Controller, but adds an FFC40 connector diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 02fd3bcae7..b10748e57f 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -137,7 +137,7 @@ // #if HAS_WIRED_LCD - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC // // LCD display on J2 FFC40 // Geeetech's LCD2004A Control Panel is very much like diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index ca25c45a7b..00c5721384 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -137,7 +137,7 @@ // #if HAS_WIRED_LCD - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC // // LCD display on J2 FFC40 // Geeetech's LCD2004A Control Panel is very much like @@ -172,7 +172,7 @@ #endif // HAS_WIRED_LCD -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) +#if IS_RRD_SC // // Geeetech's LCD2004A Control Panel is very much like // RepRapDiscount Smart Controller, but adds an FFC40 connector diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index fc18263fdd..b913530f67 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -137,7 +137,7 @@ // #if HAS_WIRED_LCD - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC // // LCD display on J2 FFC40 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 8831d6804b..63c0da476d 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -126,6 +126,11 @@ #endif #define LED_PIN PB2 +#if HAS_FSMC_TFT || HAS_GRAPHICAL_TFT + #define TFT_CS_PIN PG12 // NE4 + #define TFT_RS_PIN PF0 // A0 +#endif + #if HAS_FSMC_TFT /** * Note: MKS Robin TFT screens use various TFT controllers @@ -141,10 +146,8 @@ */ //#define LCD_RESET_PIN PF6 #define LCD_BACKLIGHT_PIN PG11 - #define FSMC_CS_PIN PG12 // NE4 - #define FSMC_RS_PIN PF0 // A0 - #define TFT_CS_PIN FSMC_CS_PIN - #define TFT_RS_PIN FSMC_RS_PIN + #define FSMC_CS_PIN TFT_CS_PIN + #define FSMC_RS_PIN TFT_RS_PIN #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_DMA_DEV DMA2 @@ -152,8 +155,6 @@ #elif HAS_GRAPHICAL_TFT #define TFT_RESET_PIN PF6 #define TFT_BACKLIGHT_PIN PG11 - #define TFT_CS_PIN PG12 // NE4 - #define TFT_RS_PIN PF0 // A0 #endif #if NEED_TOUCH_PINS diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 94a28953cc..4998c92dc5 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -269,22 +269,13 @@ #endif -#if ENABLED(SPI_GRAPHICAL_TFT) +#if HAS_SPI_GRAPHICAL_TFT // Emulated DOGM SPI - #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 - #endif - #ifndef TFT_PIXEL_OFFSET_Y - #define TFT_PIXEL_OFFSET_Y 32 - #endif - + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 #define BTN_ENC PE13 #define BTN_EN1 PE8 #define BTN_EN2 PE11 - - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - #elif ENABLED(TFT_480x320_SPI) #define TFT_DRIVER ST7796 #define TFT_BUFFER_SIZE 14400 @@ -304,7 +295,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -24 #endif -#elif ENABLED(SPI_GRAPHICAL_TFT) +#elif HAS_SPI_GRAPHICAL_TFT #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -11386 #endif @@ -342,7 +333,7 @@ #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PE15 #define LCD_PINS_D6 PD11 #define LCD_PINS_D7 PD10 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 015e29bdbe..af2908545b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -154,7 +154,7 @@ #else #define LCD_PINS_D4 PA6 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PA7 #define LCD_PINS_D6 PC4 #define LCD_PINS_D7 PC5 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index aa1ccedb35..ffd21917dd 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -103,7 +103,7 @@ #else // !MKS_MINI_12864 #define LCD_PINS_D4 PC1 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 -1 #define LCD_PINS_D6 -1 #define LCD_PINS_D7 -1 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index d5318b8e87..493efc5c7b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -124,7 +124,7 @@ #else // !MKS_MINI_12864 #define LCD_PINS_D4 PA6 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PA7 #define LCD_PINS_D6 PC4 #define LCD_PINS_D7 PC5 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 2b099b3e93..14f9c3b626 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -139,6 +139,35 @@ * If the screen stays white, disable 'LCD_RESET_PIN' * to let the bootloader init the screen. */ +#if EITHER(HAS_FSMC_GRAPHICAL_TFT, TFT_320x240) + #define FSMC_CS_PIN PD7 // NE4 + #define FSMC_RS_PIN PD11 // A0 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define LCD_RESET_PIN PC6 // FSMC_RST + #define LCD_BACKLIGHT_PIN PD13 +#endif + +#if BOTH(NEED_TOUCH_PINS, HAS_FSMC_GRAPHICAL_TFT) || ENABLED(TFT_320x240) + #define TOUCH_CS_PIN PC2 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI +#endif + +#if ENABLED(TFT_320x240) // TFT32/28 + #define TFT_DRIVER ILI9341 + #define TFT_BUFFER_SIZE 14400 + #define ILI9341_COLOR_RGB + // YV for normal screen mounting + #define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV + // XV for 180° rotated screen mounting + //#define ILI9341_ORIENTATION ILI9341_MADCTL_MX | ILI9341_MADCTL_MV +#endif + #if ENABLED(TOUCH_SCREEN) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION 12033 @@ -154,52 +183,6 @@ #endif #endif -#if ENABLED(FSMC_GRAPHICAL_TFT) - - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define LCD_RESET_PIN PC6 // FSMC_RST - #define LCD_BACKLIGHT_PIN PD13 - - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PC2 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - #endif - -#elif ENABLED(TFT_320x240) //TFT32/28 - - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define TOUCH_CS_PIN PC2 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - - #define TFT_DRIVER ILI9341 - #define TFT_BUFFER_SIZE 14400 - - // YV for normal screen mounting - #define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV - // XV for 180° rotated screen mounting - //#define ILI9341_ORIENTATION ILI9341_MADCTL_MX | ILI9341_MADCTL_MV - - #define ILI9341_COLOR_RGB -#endif - #define HAS_SPI_FLASH 1 #if HAS_SPI_FLASH #define SPI_FLASH_SIZE 0x1000000 // 16MB diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 16d6d2ffc4..86dab41121 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -198,7 +198,7 @@ #endif // XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI_FSMC, TFT_480x320) +#if EITHER(HAS_TFT_LVGL_UI_FSMC, TFT_480x320) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION 17880 #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 846fe80a08..b1e49f4d9f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -275,20 +275,11 @@ #if ENABLED(TFT_CLASSIC_UI) // Emulated DOGM SPI - #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 - #endif - #ifndef TFT_PIXEL_OFFSET_Y - #define TFT_PIXEL_OFFSET_Y 32 - #endif - + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 #define BTN_ENC PE13 #define BTN_EN1 PE8 #define BTN_EN2 PE11 - - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - #elif ENABLED(TFT_COLOR_UI) #define TFT_BUFFER_SIZE 14400 #endif @@ -354,7 +345,7 @@ #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PE15 #define LCD_PINS_D6 PD11 #define LCD_PINS_D7 PD10 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 32203f52ea..db6bc93205 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -210,7 +210,7 @@ * If the screen stays white, disable 'LCD_RESET_PIN' * to let the bootloader init the screen. */ -#if ENABLED(FSMC_GRAPHICAL_TFT) +#if HAS_FSMC_GRAPHICAL_TFT #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -254,7 +254,7 @@ #else // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY #define LCD_PINS_D4 PF14 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PF15 #define LCD_PINS_D6 PF12 #define LCD_PINS_D7 PF13 diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index cf2ba2c5fa..1b9a62fe9e 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -103,7 +103,7 @@ #define LCD_PINS_RS 49 // CS chip select /SS chip slave select #define LCD_PINS_ENABLE 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) + #elif BOTH(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 #define LCD_PINS_D4 PB12 @@ -117,7 +117,7 @@ #define LCD_PINS_D5 PB13 #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet @@ -128,9 +128,9 @@ #endif #endif - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN 37 @@ -231,7 +231,7 @@ #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD #define BTN_EN1 64 #define BTN_EN2 59 #define BTN_ENC 63 @@ -256,6 +256,6 @@ #endif #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index e74698f89e..3ebc4bca57 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -118,7 +118,7 @@ #define LCD_PINS_RS 49 // CS chip select /SS chip slave select #define LCD_PINS_ENABLE 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) + #elif BOTH(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 #define LCD_PINS_D4 PB12 @@ -132,7 +132,7 @@ #define LCD_PINS_D5 PB13 #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet @@ -151,9 +151,9 @@ #define TOUCH_MISO_PIN PB15 #define TOUCH_INT_PIN PC6 // (PenIRQ coming from ADS7843) - #elif ENABLED(NEWPANEL) + #elif IS_NEWPANEL - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN 37 @@ -255,7 +255,7 @@ #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD #define BTN_EN1 64 #define BTN_EN2 59 #define BTN_ENC 63 @@ -280,6 +280,6 @@ #endif #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h index 268b7b59cd..279d0b9ec7 100644 --- a/Marlin/src/pins/stm32f4/pins_BEAST.h +++ b/Marlin/src/pins/stm32f4/pins_BEAST.h @@ -126,7 +126,7 @@ #define LCD_PINS_RS 49 // CS chip select /SS chip slave select #define LCD_PINS_ENABLE 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) + #elif BOTH(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 #define LCD_PINS_D4 PB12 @@ -140,7 +140,7 @@ #define LCD_PINS_D5 PB13 #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 - #if DISABLED(NEWPANEL) + #if !IS_NEWPANEL #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet @@ -151,9 +151,9 @@ #endif #endif - #if ENABLED(NEWPANEL) + #if IS_NEWPANEL - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #if IS_RRD_SC #define BEEPER_PIN 37 @@ -255,7 +255,7 @@ #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) + #if IS_RRW_KEYPAD #define BTN_EN1 64 #define BTN_EN2 59 #define BTN_ENC 63 @@ -280,6 +280,6 @@ #endif #endif - #endif // NEWPANEL + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index c37f6cce04..6f9c3d3095 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -228,7 +228,7 @@ #define LCD_PINS_ENABLE PE9 #define LCD_PINS_D4 PE10 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PE11 #define LCD_PINS_D6 PE12 #define LCD_PINS_D7 PE13 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index dc8ce9f2d1..eaf90da1ae 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -385,7 +385,7 @@ #endif #endif // !FYSETC_MINI_12864 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PG7 #define LCD_PINS_D6 PG6 #define LCD_PINS_D7 PG5 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 83fd987d9d..995fcb9585 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -350,7 +350,7 @@ #endif #endif // !FYSETC_MINI_12864 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PG3 #define LCD_PINS_D6 PG6 #define LCD_PINS_D7 PG7 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 151f6c3bc0..8638e9a4cf 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -252,7 +252,7 @@ #endif #endif // !FYSETC_MINI_12864 - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PC12 #define LCD_PINS_D6 PD0 #define LCD_PINS_D7 PD1 diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index d52bb11d12..9a6a16516c 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -161,7 +161,7 @@ #define DOGLCD_A0 PE14 #endif - #if ENABLED(ULTIPANEL) + #if IS_ULTIPANEL #define LCD_PINS_D5 PE13 #define LCD_PINS_D6 PE14 #define LCD_PINS_D7 PE15 diff --git a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h index 5e3d5f4ab5..7d95521eb6 100644 --- a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h +++ b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h @@ -41,7 +41,7 @@ /** * Timer assignments - * + * * TIM1 - * TIM2 - Hardware PWM (Fan/Heater Pins) * TIM3 - Hardware PWM (Servo Pins) @@ -55,7 +55,7 @@ * TIM12 - * TIM13 - * TIM14 - TEMP_TIMER (Marlin) - * + * */ #define STEP_TIMER 4 #define TEMP_TIMER 14 @@ -66,7 +66,7 @@ * Assignments may not be ideal, and not every assignment has been tested. * Proceed at your own risk. * _CN7_ - * (X_STEP) PC6 | · · | PB8 (X_EN) + * (X_STEP) PC6 | · · | PB8 (X_EN) * (X_DIR) PB15 | · · | PB9 (X_CS) * (LCD_D4) PB13 | · · | AVDD * _CN8_ PB12 | · · | GND @@ -77,7 +77,7 @@ * +5V | · · | PC12 (SDSS) PA4 | · · | PD15 (LCD_ENABLE) * GND | · · | PD2 (SERVO0_PIN) PB4 | · · | PF12 (LCD_RS) * GND | · · | PG2  ̄ ̄ ̄ - * VIN | · · | PG3 + * VIN | · · | PG3 _*  ̄ ̄ ̄ _CN10 * AVDD | · · | PF13 (BTN_EN1) * _CN9_ AGND | · · | PE9 (BTN_EN2) @@ -140,7 +140,7 @@ _*  ̄ ̄ ̄ _CN10 #define Z_SERIAL_RX_PIN PE12 #define E_SERIAL_TX_PIN PG9 - #define E_SERIAL_RX_PIN PG9 + #define E_SERIAL_RX_PIN PG9 #endif // @@ -182,7 +182,7 @@ _*  ̄ ̄ ̄ _CN10 // // LCD / Controller // -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) +#if IS_RRD_FG_SC #define BEEPER_PIN PC7 // LCD_BEEPER #define BTN_ENC PE11 // BTN_ENC #define SD_DETECT_PIN PD14 diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index ffecc03b4a..2401c976f1 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -124,7 +124,7 @@ // // LCD / Controller // -#if BOTH(ULTRA_LCD, NEWPANEL) +#if IS_ULTRA_LCD && IS_NEWPANEL #define LCD_PINS_RS 9 // E1 JP11-11 #define LCD_PINS_ENABLE 8 // E0 JP11-10 @@ -166,4 +166,4 @@ #endif -#endif // ULTRA_LCD && NEWPANEL +#endif // IS_ULTRA_LCD && IS_NEWPANEL diff --git a/Marlin/src/pins/teensy2/pins_TEENSY2.h b/Marlin/src/pins/teensy2/pins_TEENSY2.h index 4efd83d9bc..d43e39b09a 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSY2.h +++ b/Marlin/src/pins/teensy2/pins_TEENSY2.h @@ -168,7 +168,7 @@ // // LCD / Controller // -#if ENABLED(ULTIPANEL) +#if IS_ULTIPANEL #define LCD_PINS_RS 8 // E0 #define LCD_PINS_ENABLE 9 // E1 #define LCD_PINS_D4 10 // C0 diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index 9de119b62b..54cee137ad 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -141,7 +141,7 @@ // // LCD / Controller // -#if BOTH(ULTRA_LCD, NEWPANEL) +#if IS_ULTRA_LCD && IS_NEWPANEL #define BEEPER_PIN -1 @@ -154,7 +154,7 @@ #define SD_DETECT_PIN -1 -#endif // ULTRA_LCD && NEWPANEL +#endif // IS_ULTRA_LCD && IS_NEWPANEL // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h index 2e09c8a425..b8a0ffe2c8 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h @@ -139,13 +139,13 @@ #define LCD_PINS_D7 45 #endif -#if ENABLED(NEWPANEL) +#if IS_NEWPANEL #define BTN_EN1 46 #define BTN_EN2 47 #define BTN_ENC 48 #endif -#if ENABLED(REPRAPWORLD_KEYPAD) +#if IS_RRW_KEYPAD #define SHIFT_OUT 40 #define SHIFT_CLK 44 #define SHIFT_LD 42 diff --git a/buildroot/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer-tests index 85b22c1284..8eb9e4cd1b 100755 --- a/buildroot/tests/STM32F103VE_longer-tests +++ b/buildroot/tests/STM32F103VE_longer-tests @@ -7,8 +7,6 @@ set -e use_example_configs Alfawise/U20 -opt_set MOTHERBOARD BOARD_LONGER3D_LK -opt_set SERIAL_PORT 1 opt_enable BAUD_RATE_GCODE exec_test $1 $2 "Full-featured U20 config" diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests index d635062205..4246231070 100644 --- a/buildroot/tests/mks_robin-tests +++ b/buildroot/tests/mks_robin-tests @@ -8,9 +8,7 @@ set -e use_example_configs Mks/Robin -opt_disable TFT_320x240 -opt_enable FSMC_GRAPHICAL_TFT -exec_test $1 $2 "MKS Robin base configuration" +exec_test $1 $2 "MKS Robin config (FSMC Color UI)" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index 92c97be756..ce98f563b9 100644 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -7,39 +7,50 @@ # exit on first failure set -e +# +# MKS Robin nano v1.2 Emulated DOGM FSMC +# use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -opt_disable TFT_320x240 -opt_enable TOUCH_SCREEN -opt_enable FSMC_GRAPHICAL_TFT exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" +# +# MKS Robin v2 nano LVGL SPI +# (Robin v2 nano has no FSMC interface) +# use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 -opt_disable TFT_320x240 -opt_enable TOUCH_SCREEN -opt_enable SPI_GRAPHICAL_TFT +opt_disable TFT_INTERFACE_FSMC +opt_enable TFT_INTERFACE_SPI exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" +# +# MKS Robin nano v1.2 LVGL FSMC +# use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -opt_disable TFT_320x240 -opt_disable TOUCH_SCREEN -opt_enable TFT_LVGL_UI_FSMC +opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 +opt_enable TFT_LVGL_UI TFT_RES_480x320 exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" +# +# MKS Robin v2 nano LVGL SPI +# (Robin v2 nano has no FSMC interface) +# use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 -opt_disable TFT_320x240 -opt_disable TOUCH_SCREEN -opt_enable TFT_LVGL_UI_SPI +opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 +opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" +# +# MKS Robin v2 nano New Color UI 480x320 SPI +# (Robin v2 nano has no FSMC interface) +# use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 -opt_disable TFT_320x240 -opt_enable TOUCH_SCREEN -opt_enable TFT_480x320_SPI +opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 +opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" # cleanup diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests index 7ae4670fed..50ec7b0dd1 100644 --- a/buildroot/tests/mks_robin_pro-tests +++ b/buildroot/tests/mks_robin_pro-tests @@ -13,7 +13,7 @@ opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 opt_set TEMP_SENSOR_BED 1 opt_disable THERMAL_PROTECTION_HOTENDS -exec_test $1 $2 "MKS Robin Pro with TMC Drivers, hotend thermal protection disabled" +exec_test $1 $2 "MKS Robin Pro, TMC Drivers, no thermal protection" # cleanup -#restore_configs +restore_configs From 8ae8e1e4558237f9721e2ef82571dbed76b82747 Mon Sep 17 00:00:00 2001 From: Peter Hall <33176108+IamPete1@users.noreply.github.com> Date: Thu, 15 Oct 2020 19:18:43 +0100 Subject: [PATCH 0401/1370] Default LASER_POWER_INLINE to OFF (#19727) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 714bcb288f..c3ba3f7e22 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2958,7 +2958,7 @@ * This allows the laser to keep in perfect sync with the planner and removes * the powerup/down delay since lasers require negligible time. */ - #define LASER_POWER_INLINE + //#define LASER_POWER_INLINE #if ENABLED(LASER_POWER_INLINE) /** From 57dc1a06490bfe84f39a85f34e90f7f50b3a77cc Mon Sep 17 00:00:00 2001 From: rlojek Date: Thu, 15 Oct 2020 20:44:57 +0200 Subject: [PATCH 0402/1370] Fix ADVANCED_PAUSE && !PREVENT_COLD_EXTRUSION (#19740) --- Marlin/src/feature/pause.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 0ab6594021..ffc04af91f 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -132,8 +132,10 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P DEBUG_SECTION(est, "ensure_safe_temperature", true); DEBUG_ECHOLNPAIR("... wait:", int(wait), " mode:", int(mode)); - if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder); + #if ENABLED(PREVENT_COLD_EXTRUSION) + if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder); + #endif #if HAS_LCD_MENU lcd_pause_show_message(PAUSE_MESSAGE_HEATING, mode); From 02b668baf58e6ebf488cf453aaffcef1a87cd773 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 15 Oct 2020 16:15:11 -0300 Subject: [PATCH 0403/1370] Update Probe Offset Wizard for Color UI (#19742) --- Marlin/src/lcd/menu/menu_probe_offset.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 6b7830b853..4623b8f492 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -88,16 +88,20 @@ void probe_offset_wizard_menu() { SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move_z( 0.1f); }); if ((SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); - char tmp[20], numstr[10]; - // Determine digits needed right of decimal - const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + char tmp[20], numstr[10]; + // Determine digits needed right of decimal + const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + #if DISABLED(HAS_GRAPHICAL_TFT) + extern const char NUL_STR[]; + SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); + MENU_ITEM_ADDON_END(); + #else + SUBMENU_P(tmp, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); + #endif } ACTION_ITEM(MSG_BUTTON_DONE, []{ From 13720ce6b2acb8da0922f84207f08aa3e035b11c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 15 Oct 2020 20:38:27 -0300 Subject: [PATCH 0404/1370] Fix TOUCH_SCREEN + TFT_LVGL_UI compile (#19754) --- Marlin/src/inc/Conditionals_LCD.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 4eeb0e8a44..cbc75cfb6d 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -926,5 +926,7 @@ #if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT #undef TOUCH_SCREEN #undef TOUCH_SCREEN_CALIBRATION - #define HAS_TOUCH_XPT2046 1 + #if !HAS_TFT_LVGL_UI + #define HAS_TOUCH_XPT2046 1 + #endif #endif From 1fa19e1fc27b9ee6a6556903cd9bd134915a9b48 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 16 Oct 2020 04:03:45 -0300 Subject: [PATCH 0405/1370] Sanity check unsupported EP (#19745) --- Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index 9d5026fbab..a0381ea8c8 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -51,3 +51,10 @@ #if ENABLED(NEOPIXEL_LED) #error "NEOPIXEL_LED (Adafruit NeoPixel) is not supported for HAL/STM32F1. Comment out this line to proceed at your own risk!" #endif + +// Emergency Parser needs at least one serial with HardwareSerial or USBComposite. +// The USBSerial maple don't allow any hook to implement EMERGENCY_PARSER. +// And copy all USBSerial code to marlin space to support EMERGENCY_PARSER, when we have another options, don't worth it. +#if ENABLED(EMERGENCY_PARSER) && !defined(USE_USB_COMPOSITE) && ((SERIAL_PORT == -1 && !defined(SERIAL_PORT_2)) || (SERIAL_PORT_2 == -1 && !defined(SERIAL_PORT))) + #error "EMERGENCY_PARSER is only supported by HardwareSerial or USBComposite in HAL/STM32F1." +#endif From 386e643179f5b7533ef027a6f27ba257401ee144 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 16 Oct 2020 00:04:55 -0700 Subject: [PATCH 0406/1370] Fix NUCLEO_F767ZI build, add tests (#19746) --- .github/workflows/test-builds.yml | 1 + Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h | 2 +- buildroot/tests/NUCLEO_F767ZI-tests | 21 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 buildroot/tests/NUCLEO_F767ZI-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index b228783799..f7ba348cc0 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -81,6 +81,7 @@ jobs: - STM32F103RET6_creality - LERDGEX - mks_robin_nano35 + - NUCLEO_F767ZI # Put lengthy tests last diff --git a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h index 7d95521eb6..0a00e03612 100644 --- a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h +++ b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef STM32F767xx +#if NOT_TARGET(STM32F767xx) #error "Oops! Select an STM32F767 environment" #endif diff --git a/buildroot/tests/NUCLEO_F767ZI-tests b/buildroot/tests/NUCLEO_F767ZI-tests new file mode 100644 index 0000000000..05125a4539 --- /dev/null +++ b/buildroot/tests/NUCLEO_F767ZI-tests @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# +# Build tests for NUCLEO_F767ZI +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_NUCLEO_F767ZI +opt_set SERIAL_PORT -1 +opt_enable BLTOUCH Z_SAFE_HOMING SPEAKER +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2208 +exec_test $1 $2 "Mixed timer usage" + +# clean up +restore_configs From 473abe8eb4ea4231a8476e022421d891fee4377d Mon Sep 17 00:00:00 2001 From: Andreas Setterlind Date: Fri, 16 Oct 2020 09:06:05 +0200 Subject: [PATCH 0407/1370] Add ESP32 160MHz to README (#19748) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 27becb9db6..f3c2afa874 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level board|processor|speed|flash|sram|logic|fpu ----|---------|-----|-----|----|-----|--- - [ESP32](https://www.espressif.com/en/products/hardware/esp32/overview)|Tensilica Xtensa LX6|240MHz|---|---|3.3V|--- + [ESP32](https://www.espressif.com/en/products/hardware/esp32/overview)|Tensilica Xtensa LX6|160-240MHz variants|---|---|3.3V|--- #### LPC1768 / LPC1769 From dea995e19f980e624ce06f184a0be505615a99ed Mon Sep 17 00:00:00 2001 From: mks-viva <1224833100@qq.com> Date: Fri, 16 Oct 2020 15:16:09 +0800 Subject: [PATCH 0408/1370] Update MKS SGen-L V2 RGB LED pins (#19762) --- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 22 +++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index e18f938dc4..1a558075b6 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -227,9 +227,25 @@ // Misc. Functions // #define LED_PIN P1_18 // Used as a status indicator -#define LED2_PIN P1_19 -#define LED3_PIN P1_20 -#define LED4_PIN P1_21 + +// +// RGB LED +// +#if ENABLED(RGB_LED) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN P1_19 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN P1_20 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN P1_21 + #endif +#else + #define LED2_PIN P1_19 // Initialized by HAL/LPC1768/main.cpp + #define LED3_PIN P1_20 + #define LED4_PIN P1_21 +#endif /** * _____ _____ From d5340675aecb28eea03e491e1ccd19a8b3a9a05b Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 16 Oct 2020 14:04:51 -0700 Subject: [PATCH 0409/1370] Fix SAMD Serial name macro (#19765) --- Marlin/src/HAL/SAMD51/HAL.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index abc6c04a69..7cb3635bd7 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -35,7 +35,8 @@ // MYSERIAL0 required before MarlinSerial includes! - #define _MSERIAL(X) Serial##X + #define __MSERIAL(X) Serial##X + #define _MSERIAL(X) __MSERIAL(X) #define MSERIAL(X) _MSERIAL(INCREMENT(X)) #if SERIAL_PORT == -1 From 2ecc3bb5608cf7e9e4e58ccd469a7ecff442a572 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 16 Oct 2020 18:11:00 -0300 Subject: [PATCH 0410/1370] Handle M410 in the main task (#19752) --- Marlin/src/feature/e_parser.cpp | 1 + Marlin/src/feature/e_parser.h | 3 ++- Marlin/src/module/temperature.cpp | 10 ++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/e_parser.cpp b/Marlin/src/feature/e_parser.cpp index a4c2d0dac9..d98afcfee7 100644 --- a/Marlin/src/feature/e_parser.cpp +++ b/Marlin/src/feature/e_parser.cpp @@ -32,6 +32,7 @@ // Static data members bool EmergencyParser::killed_by_M112, // = false + EmergencyParser::quickstop_by_M410, EmergencyParser::enabled; #if ENABLED(HOST_PROMPT_SUPPORT) diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index 085cbd4eab..0bb0253149 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -63,6 +63,7 @@ public: }; static bool killed_by_M112; + static bool quickstop_by_M410; #if ENABLED(HOST_PROMPT_SUPPORT) static uint8_t M876_reason; @@ -168,7 +169,7 @@ public: if (enabled) switch (state) { case EP_M108: wait_for_user = wait_for_heatup = false; break; case EP_M112: killed_by_M112 = true; break; - case EP_M410: quickstop_stepper(); break; + case EP_M410: quickstop_by_M410 = true; break; #if ENABLED(HOST_PROMPT_SUPPORT) case EP_M876SN: host_response_handler(M876_reason); break; #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 9ecbb7c766..4b352e738e 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1032,8 +1032,14 @@ void Temperature::manage_heater() { if (!inited) return watchdog_refresh(); #endif - if (TERN0(EMERGENCY_PARSER, emergency_parser.killed_by_M112)) - kill(M112_KILL_STR, nullptr, true); + #if ENABLED(EMERGENCY_PARSER) + if (emergency_parser.killed_by_M112) kill(M112_KILL_STR, nullptr, true); + + if (emergency_parser.quickstop_by_M410) { + emergency_parser.quickstop_by_M410 = false; // quickstop_stepper may call idle so clear this now! + quickstop_stepper(); + } + #endif if (!raw_temps_ready) return; From 060b2f49894c0759a98b4ff99f8fb1c7cc779396 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 16 Oct 2020 18:19:48 -0300 Subject: [PATCH 0411/1370] Fix Color UI external_control, wait_for_release (#19771) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/tft/touch.cpp | 21 ++++++++++++--------- Marlin/src/lcd/tft/touch.h | 8 +++++++- Marlin/src/lcd/ultralcd.cpp | 4 ---- Marlin/src/module/probe.cpp | 2 +- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 80c65f074a..3ecf481ed1 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -40,7 +40,7 @@ int16_t Touch::x, Touch::y; touch_control_t Touch::controls[]; touch_control_t *Touch::current_control; uint16_t Touch::controls_count; -millis_t Touch::now = 0; +millis_t Touch::last_touch_ms = 0; millis_t Touch::time_to_hold; millis_t Touch::repeat_delay; millis_t Touch::touch_time; @@ -79,8 +79,10 @@ void Touch::idle() { if (!enabled) return; - if (now == millis()) return; - now = millis(); + // Return if Touch::idle is called within the same millisecond + const millis_t now = millis(); + if (last_touch_ms == now) return; + last_touch_ms = now; if (get_point(&_x, &_y)) { #if HAS_RESUME_CONTINUE @@ -88,24 +90,25 @@ void Touch::idle() { if (wait_for_user) { touch_control_type = CLICK; ui.lcd_clicked = true; + if (ui.external_control) wait_for_user = false; return; } #endif #if LCD_TIMEOUT_TO_STATUS - ui.return_to_status_ms = now + LCD_TIMEOUT_TO_STATUS; + ui.return_to_status_ms = last_touch_ms + LCD_TIMEOUT_TO_STATUS; #endif if (touch_time) { #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_control_type == NONE && ELAPSED(now, touch_time + TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) + if (touch_control_type == NONE && ELAPSED(last_touch_ms, touch_time + TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) ui.goto_screen(touch_screen_calibration); #endif return; } - if (time_to_hold == 0) time_to_hold = now + MINIMUM_HOLD_TIME; - if (PENDING(now, time_to_hold)) return; + if (time_to_hold == 0) time_to_hold = last_touch_ms + MINIMUM_HOLD_TIME; + if (PENDING(last_touch_ms, time_to_hold)) return; if (x != 0 && y != 0) { if (current_control) { @@ -131,7 +134,7 @@ void Touch::idle() { } if (current_control == NULL) - touch_time = now; + touch_time = last_touch_ms; } x = _x; y = _y; @@ -284,7 +287,7 @@ void Touch::hold(touch_control_t *control, millis_t delay) { current_control = control; if (delay) { repeat_delay = delay > MIN_REPEAT_DELAY ? delay : MIN_REPEAT_DELAY; - time_to_hold = now + repeat_delay; + time_to_hold = last_touch_ms + repeat_delay; } ui.refresh(); } diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h index 7d8f222918..b2c7a21ba1 100644 --- a/Marlin/src/lcd/tft/touch.h +++ b/Marlin/src/lcd/tft/touch.h @@ -164,7 +164,13 @@ class Touch { static void reset() { controls_count = 0; touch_time = -1; current_control = NULL; } static void clear() { controls_count = 0; } static void idle(); - static bool is_clicked() { return touch_control_type == CLICK; } + static bool is_clicked() { + if (touch_control_type == CLICK) { + touch_control_type = NONE; + return true; + } + return false; + } static void disable() { enabled = false; } static void enable() { enabled = true; } diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index da9c3e2456..25f5afc71d 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -1478,10 +1478,6 @@ void MarlinUI::update() { set_status_P(msg, -1); } - #if ENABLED(SDSUPPORT) - extern bool wait_for_user, wait_for_heatup; - #endif - void MarlinUI::abort_print() { #if ENABLED(SDSUPPORT) wait_for_heatup = wait_for_user = false; diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index defc22b1fe..27ceb989c0 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -38,7 +38,7 @@ #include "../gcode/gcode.h" #include "../lcd/ultralcd.h" -#include "../MarlinCore.h" // for stop(), disable_e_steppers, wait_for_user +#include "../MarlinCore.h" // for stop(), disable_e_steppers #if HAS_LEVELING #include "../feature/bedlevel/bedlevel.h" From 19498040efffc92bb16e5ebfffed496542416801 Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Sat, 17 Oct 2020 00:21:21 +0300 Subject: [PATCH 0412/1370] Fix HAL/STM32 FastIO for analog pins (#19735) --- Marlin/src/HAL/STM32/fastio.h | 10 +++++----- Marlin/src/HAL/STM32/pinsDebug_STM32duino.h | 10 ++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h index f000d68cf0..ea28b8f3bf 100644 --- a/Marlin/src/HAL/STM32/fastio.h +++ b/Marlin/src/HAL/STM32/fastio.h @@ -51,15 +51,15 @@ void FastIO_init(); // Must be called before using fast io macros #if defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32F3xx) || defined(STM32L0xx) || defined(STM32L4xx) #define _WRITE(IO, V) do { \ - if (V) FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO])) ; \ - else FastIOPortMap[STM_PORT(digitalPin[IO])]->BRR = _BV32(STM_PIN(digitalPin[IO])) ; \ + if (V) FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BSRR = _BV32(STM_PIN(digitalPinToPinName(IO))) ; \ + else FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BRR = _BV32(STM_PIN(digitalPinToPinName(IO))) ; \ }while(0) #else - #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO]) + ((V) ? 0 : 16))) + #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BSRR = _BV32(STM_PIN(digitalPinToPinName(IO)) + ((V) ? 0 : 16))) #endif -#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPin[IO])]->IDR, _BV32(STM_PIN(digitalPin[IO])))) -#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPin[IO])]->ODR ^= _BV32(STM_PIN(digitalPin[IO]))) +#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->IDR, _BV32(STM_PIN(digitalPinToPinName(IO))))) +#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->ODR ^= _BV32(STM_PIN(digitalPinToPinName(IO)))) #define _GET_MODE(IO) #define _SET_MODE(IO,M) pinMode(IO, M) diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h b/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h index 09f2bb54e6..71480153a7 100644 --- a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h +++ b/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h @@ -51,8 +51,8 @@ * It contains: * - name of the signal * - the Ard_num assigned by the pins_YOUR_BOARD.h file using the platform defines. - * EXAMPLE: "#define KILL_PIN PB1" results in Ard_num of 57. 57 is then used as an - * index into digitalPin[] to get the Port_pin number + * EXAMPLE: "#define KILL_PIN PB1" results in Ard_num of 57. 57 is then used as the + * argument to digitalPinToPinName(IO) to get the Port_pin number * - if it is a digital or analog signal. PWMs are considered digital here. * * pin_xref is a structure generated by this header file. It is generated by the @@ -68,8 +68,6 @@ * signal. The Arduino pin number is listed by the M43 I command. */ -extern const PinName digitalPin[]; // provided by the platform - //////////////////////////////////////////////////////// // // make a list of the Arduino pin numbers in the Port/Pin order @@ -137,7 +135,7 @@ const XrefInfo pin_xref[] PROGMEM = { uint8_t get_pin_mode(const pin_t Ard_num) { uint32_t mode_all = 0; - const PinName dp = digitalPin[Ard_num]; + const PinName dp = digitalPinToPinName(Ard_num); switch (PORT_ALPHA(dp)) { case 'A' : mode_all = GPIOA->MODER; break; case 'B' : mode_all = GPIOB->MODER; break; @@ -218,7 +216,7 @@ bool pwm_status(const pin_t Ard_num) { void pwm_details(const pin_t Ard_num) { if (pwm_status(Ard_num)) { uint32_t alt_all = 0; - const PinName dp = digitalPin[Ard_num]; + const PinName dp = digitalPinToPinName(Ard_num); pin_t pin_number = uint8_t(PIN_NUM(dp)); const bool over_7 = pin_number >= 8; const uint8_t ind = over_7 ? 1 : 0; From 3becc3ad6396b6683500cfa349bd88a2e6558ad1 Mon Sep 17 00:00:00 2001 From: nb-rapidia <43864438+nb-rapidia@users.noreply.github.com> Date: Fri, 16 Oct 2020 14:59:55 -0700 Subject: [PATCH 0413/1370] Fix IDEX layer shift and DIR states (#19756) Co-authored-by: Scott Lahteine --- Marlin/src/feature/pause.cpp | 21 ++---- Marlin/src/feature/pause.h | 7 +- Marlin/src/feature/runout.h | 2 +- Marlin/src/gcode/bedlevel/G35.cpp | 5 +- Marlin/src/gcode/calibrate/G28.cpp | 28 ++++---- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/gcode/control/M605.cpp | 15 ++-- Marlin/src/gcode/feature/pause/M600.cpp | 4 +- Marlin/src/gcode/temp/M104_M109.cpp | 4 +- Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 4 +- Marlin/src/module/motion.cpp | 93 +++++++++++++++---------- Marlin/src/module/motion.h | 13 ++-- Marlin/src/module/stepper.cpp | 37 ++++------ Marlin/src/module/stepper.h | 8 ++- Marlin/src/module/tool_change.cpp | 41 +++++++---- 15 files changed, 152 insertions(+), 132 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index ffc04af91f..dbf27ad8b8 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -223,8 +223,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l #if ENABLED(DUAL_X_CARRIAGE) const int8_t saved_ext = active_extruder; const bool saved_ext_dup_mode = extruder_duplication_enabled; - active_extruder = DXC_ext; - extruder_duplication_enabled = false; + set_duplication_enabled(false, DXC_ext); #endif // Slow Load filament @@ -245,9 +244,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l } #if ENABLED(DUAL_X_CARRIAGE) // Tie the two extruders movement back together. - active_extruder = saved_ext; - extruder_duplication_enabled = saved_ext_dup_mode; - stepper.set_directions(); + set_duplication_enabled(saved_ext_dup_mode, saved_ext); #endif #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) @@ -439,17 +436,14 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float #if ENABLED(DUAL_X_CARRIAGE) const int8_t saved_ext = active_extruder; const bool saved_ext_dup_mode = extruder_duplication_enabled; - active_extruder = DXC_ext; - extruder_duplication_enabled = false; + set_duplication_enabled(false, DXC_ext); #endif if (unload_length) // Unload the filament unload_filament(unload_length, show_lcd, PAUSE_MODE_CHANGE_FILAMENT); #if ENABLED(DUAL_X_CARRIAGE) - active_extruder = saved_ext; - extruder_duplication_enabled = saved_ext_dup_mode; - stepper.set_directions(); + set_duplication_enabled(saved_ext_dup_mode, saved_ext); #endif return true; @@ -495,8 +489,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep #if ENABLED(DUAL_X_CARRIAGE) const int8_t saved_ext = active_extruder; const bool saved_ext_dup_mode = extruder_duplication_enabled; - active_extruder = DXC_ext; - extruder_duplication_enabled = false; + set_duplication_enabled(false, DXC_ext); #endif // Wait for filament insert by user and press button @@ -550,9 +543,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep idle_no_sleep(); } #if ENABLED(DUAL_X_CARRIAGE) - active_extruder = saved_ext; - extruder_duplication_enabled = saved_ext_dup_mode; - stepper.set_directions(); + set_duplication_enabled(saved_ext_dup_mode, saved_ext); #endif } diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 016b0ce3f7..c69ed73546 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -89,10 +89,11 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float void wait_for_confirmation(const bool is_reload=false, const int8_t max_beep_count=0 DXC_PARAMS); -void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0, int16_t targetTemp=0 DXC_PARAMS); +void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, + const int8_t max_beep_count=0, int16_t targetTemp=0 DXC_PARAMS); -bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, - const bool pause_for_user=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); +bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, + const bool show_lcd=false, const bool pause_for_user=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); bool unload_filament(const float &unload_length, const bool show_lcd=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index a7f8366849..a5abf057d1 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -237,7 +237,7 @@ class FilamentSensorBase { #if NUM_RUNOUT_SENSORS == 1 UNUSED(extruder); #else - if ( !TERN0(DUAL_X_CARRIAGE, dxc_is_duplicating()) + if ( !TERN0(DUAL_X_CARRIAGE, idex_is_duplicating()) && !TERN0(MULTI_NOZZLE_DUPLICATION, extruder_duplication_enabled) ) return TEST(runout_states, extruder); // A specific extruder ran out #endif diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 0ede4e79c6..f6ae2db2c7 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -110,9 +110,8 @@ void GcodeSuite::G35() { tool_change(0, true); #endif - #if HAS_DUPLICATION_MODE - extruder_duplication_enabled = false; - #endif + // Disable duplication mode on homing + TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false)); // Home all before this procedure home_all_axes(); diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 3420956803..bccbb9bd16 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -134,8 +134,8 @@ if (DEBUGGING(LEVELING)) DEBUG_POS("home_z_safely", destination); - // This causes the carriage on Dual X to unpark - TERN_(DUAL_X_CARRIAGE, active_extruder_parked = false); + // Free the active extruder for movement + TERN_(DUAL_X_CARRIAGE, idex_set_parked(false)); TERN_(SENSORLESS_HOMING, safe_delay(500)); // Short delay needed to settle @@ -282,7 +282,7 @@ void GcodeSuite::G28() { tool_change(0, true); #endif - TERN_(HAS_DUPLICATION_MODE, extruder_duplication_enabled = false); + TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false)); remember_feedrate_scaling_off(); @@ -342,16 +342,14 @@ void GcodeSuite::G28() { homeaxis(X_AXIS); // Remember this extruder's position for later tool change - inactive_extruder_x_pos = current_position.x; + inactive_extruder_x = current_position.x; // Home the 1st (left) extruder active_extruder = 0; homeaxis(X_AXIS); - // Consider the active extruder to be parked - raised_parked_position = current_position; - delayed_move_time = 0; - active_extruder_parked = true; + // Consider the active extruder to be in its "parked" position + idex_set_parked(); #else @@ -392,7 +390,7 @@ void GcodeSuite::G28() { */ #if ENABLED(DUAL_X_CARRIAGE) - if (dxc_is_duplicating()) { + if (idex_is_duplicating()) { TERN_(IMPROVE_HOMING_RELIABILITY, slow_homing = begin_slow_homing()); @@ -401,19 +399,17 @@ void GcodeSuite::G28() { homeaxis(X_AXIS); // Remember this extruder's position for later tool change - inactive_extruder_x_pos = current_position.x; + inactive_extruder_x = current_position.x; // Home the 1st (left) extruder active_extruder = 0; homeaxis(X_AXIS); // Consider the active extruder to be parked - raised_parked_position = current_position; - delayed_move_time = 0; - active_extruder_parked = true; - extruder_duplication_enabled = IDEX_saved_duplication_state; - dual_x_carriage_mode = IDEX_saved_mode; - stepper.set_directions(); + idex_set_parked(); + + dual_x_carriage_mode = IDEX_saved_mode; + set_duplication_enabled(IDEX_saved_duplication_state); TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); } diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 24292477f9..3dc63b0655 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -113,7 +113,7 @@ void GcodeSuite::G34() { tool_change(0, true); #endif - TERN_(HAS_DUPLICATION_MODE, extruder_duplication_enabled = false); + TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false)); // In BLTOUCH HS mode, the probe travels in a deployed state. // Users of G34 might have a badly misaligned bed, so raise Z by the diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 5dc36428b5..b1e54b25e7 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -68,7 +68,7 @@ const DualXMode previous_mode = dual_x_carriage_mode; dual_x_carriage_mode = (DualXMode)parser.value_byte(); - mirrored_duplication_mode = false; + idex_set_mirrored_mode(false); if (dual_x_carriage_mode == DXC_MIRRORED_MODE) { if (previous_mode != DXC_DUPLICATION_MODE) { @@ -77,8 +77,7 @@ dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; return; } - mirrored_duplication_mode = true; - stepper.set_directions(); + idex_set_mirrored_mode(true); float x_jog = current_position.x - .1; for (uint8_t i = 2; --i;) { planner.buffer_line(x_jog, current_position.y, current_position.z, current_position.e, feedrate_mm_s, 0); @@ -102,10 +101,8 @@ dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; break; } - active_extruder_parked = false; - extruder_duplication_enabled = false; - stepper.set_directions(); - delayed_move_time = 0; + idex_set_parked(false); + set_duplication_enabled(false); } else if (!parser.seen('W')) // if no S or W parameter, the DXC mode gets reset to the user's default dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; @@ -125,7 +122,7 @@ if (!active_extruder_parked) DEBUG_ECHOPGM(" NOT "); DEBUG_ECHOPGM(" parked."); DEBUG_ECHOPAIR("\nactive_extruder_x_pos: ", current_position.x); - DEBUG_ECHOPAIR("\ninactive_extruder_x_pos: ", inactive_extruder_x_pos); + DEBUG_ECHOPAIR("\ninactive_extruder_x: ", inactive_extruder_x); DEBUG_ECHOPAIR("\nextruder_duplication_enabled: ", int(extruder_duplication_enabled)); DEBUG_ECHOPAIR("\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset); DEBUG_ECHOPAIR("\nduplicate_extruder_temp_offset: ", duplicate_extruder_temp_offset); @@ -166,7 +163,7 @@ if (parser.seenval('P')) duplication_e_mask = parser.value_int(); // Set the mask directly else if (parser.seenval('E')) duplication_e_mask = pow(2, parser.value_int() + 1) - 1; // Set the mask by E index ena = (2 == parser.intval('S', extruder_duplication_enabled ? 2 : 0)); - extruder_duplication_enabled = ena && (duplication_e_mask >= 3); + set_duplication_enabled(ena && (duplication_e_mask >= 3)); } SERIAL_ECHO_START(); SERIAL_ECHOPGM(STR_DUPLICATION_MODE); diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 7c9be54b29..5f3573ef83 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -87,7 +87,7 @@ void GcodeSuite::M600() { if (!parser.seen('T')) { // If no tool index is specified, M600 was (probably) sent in response to filament runout. // In this case, for duplicating modes set DXC_ext to the extruder that ran out. #if HAS_FILAMENT_SENSOR && NUM_RUNOUT_SENSORS > 1 - if (dxc_is_duplicating()) + if (idex_is_duplicating()) DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_STATE) ? 1 : 0; #else DXC_ext = active_extruder; @@ -108,7 +108,7 @@ void GcodeSuite::M600() { #if HAS_MULTI_EXTRUDER // Change toolhead if specified const uint8_t active_extruder_before_filament_change = active_extruder; - if (active_extruder != target_extruder && TERN1(DUAL_X_CARRIAGE, !dxc_is_duplicating())) + if (active_extruder != target_extruder && TERN1(DUAL_X_CARRIAGE, !idex_is_duplicating())) tool_change(target_extruder, false); #endif diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index a289983b92..4402728de3 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -94,7 +94,7 @@ void GcodeSuite::M104() { thermalManager.setTargetHotend(temp, target_extruder); #if ENABLED(DUAL_X_CARRIAGE) - if (dxc_is_duplicating() && target_extruder == 0) + if (idex_is_duplicating() && target_extruder == 0) thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); #endif @@ -172,7 +172,7 @@ void GcodeSuite::M109() { thermalManager.setTargetHotend(temp, target_extruder); #if ENABLED(DUAL_X_CARRIAGE) - if (dxc_is_duplicating() && target_extruder == 0) + if (idex_is_duplicating() && target_extruder == 0) thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); #endif diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index dd85473e98..8914bc560e 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -62,11 +62,11 @@ const uint8_t L64XX_Marlin::index_to_dir[MAX_L64XX] = { INVERT_X_DIR, INVERT_Y_DIR, INVERT_Z_DIR , (INVERT_X_DIR) // X2 #if ENABLED(X_DUAL_STEPPER_DRIVERS) - ^ (INVERT_X2_VS_X_DIR) + ^ ENABLED(INVERT_X2_VS_X_DIR) #endif , (INVERT_Y_DIR) // Y2 #if ENABLED(Y_DUAL_STEPPER_DRIVERS) - ^ (INVERT_Y2_VS_Y_DIR) + ^ ENABLED(INVERT_Y2_VS_Y_DIR) #endif , INVERT_Z_DIR, INVERT_Z_DIR, INVERT_Z_DIR // Z2,Z3,Z4 diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 5b3fab10b1..75a7944c3f 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -569,7 +569,7 @@ void restore_feedrate_and_scaling() { soft_endstop.min.x = X2_MIN_POS; soft_endstop.max.x = dual_max_x; } - else if (dxc_is_duplicating()) { + else if (idex_is_duplicating()) { // In Duplication Mode, T0 can move as far left as X1_MIN_POS // but not so far to the right that T1 would move past the end soft_endstop.min.x = X1_MIN_POS; @@ -932,8 +932,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { #endif // !UBL_SEGMENTED #if HAS_DUPLICATION_MODE - bool extruder_duplication_enabled, - mirrored_duplication_mode; + bool extruder_duplication_enabled; #if ENABLED(MULTI_NOZZLE_DUPLICATION) uint8_t duplication_e_mask; // = 0 #endif @@ -942,12 +941,13 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { #if ENABLED(DUAL_X_CARRIAGE) DualXMode dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; - float inactive_extruder_x_pos = X2_MAX_POS, // used in mode 0 & 1 - duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // used in mode 2 - xyz_pos_t raised_parked_position; // used in mode 1 - bool active_extruder_parked = false; // used in mode 1 & 2 - millis_t delayed_move_time = 0; // used in mode 1 - int16_t duplicate_extruder_temp_offset = 0; // used in mode 2 + float inactive_extruder_x = X2_MAX_POS, // Used in mode 0 & 1 + duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // Used in mode 2 + xyz_pos_t raised_parked_position; // Used in mode 1 + bool active_extruder_parked = false; // Used in mode 1 & 2 + millis_t delayed_move_time = 0; // Used in mode 1 + int16_t duplicate_extruder_temp_offset = 0; // Used in mode 2 + bool idex_mirrored_mode = false; // Used in mode 3 float x_home_pos(const uint8_t extruder) { if (extruder == 0) @@ -962,6 +962,23 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { return hotend_offset[1].x > 0 ? hotend_offset[1].x : X2_HOME_POS; } + void idex_set_mirrored_mode(const bool mirr) { + idex_mirrored_mode = mirr; + stepper.set_directions(); + } + + void set_duplication_enabled(const bool dupe, const int8_t tool_index/*=-1*/) { + extruder_duplication_enabled = dupe; + if (tool_index >= 0) active_extruder = tool_index; + stepper.set_directions(); + } + + void idex_set_parked(const bool park/*=true*/) { + delayed_move_time = 0; + active_extruder_parked = park; + if (park) raised_parked_position = current_position; // Remember current raised toolhead position for use by unpark + } + /** * Prepare a linear move in a dual X axis setup * @@ -970,9 +987,10 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { inline bool dual_x_carriage_unpark() { if (active_extruder_parked) { switch (dual_x_carriage_mode) { - case DXC_FULL_CONTROL_MODE: - break; - case DXC_AUTO_PARK_MODE: + + case DXC_FULL_CONTROL_MODE: break; + + case DXC_AUTO_PARK_MODE: { if (current_position.e == destination.e) { // This is a travel move (with no extrusion) // Skip it, but keep track of the current position @@ -984,23 +1002,27 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { return true; } } - // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower + // + // Un-park the active extruder + // + const feedRate_t fr_zfast = planner.settings.max_feedrate_mm_s[Z_AXIS]; + #define CURPOS current_position + #define RAISED raised_parked_position + // 1. Move to the raised parked XYZ. Presumably the tool is already at XY. + if (planner.buffer_line(RAISED.x, RAISED.y, RAISED.z, CURPOS.e, fr_zfast, active_extruder)) { + // 2. Move to the current native XY and raised Z. Presumably this is a null move. + if (planner.buffer_line(CURPOS.x, CURPOS.y, RAISED.z, CURPOS.e, PLANNER_XY_FEEDRATE(), active_extruder)) { + // 3. Lower Z back down + line_to_current_position(fr_zfast); + } + } + planner.synchronize(); // paranoia + stepper.set_directions(); - #define CUR_X current_position.x - #define CUR_Y current_position.y - #define CUR_Z current_position.z - #define CUR_E current_position.e - #define RAISED_X raised_parked_position.x - #define RAISED_Y raised_parked_position.y - #define RAISED_Z raised_parked_position.z + idex_set_parked(false); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("idex_set_parked(false)"); + } break; - if ( planner.buffer_line(RAISED_X, RAISED_Y, RAISED_Z, CUR_E, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder)) - if (planner.buffer_line( CUR_X, CUR_Y, RAISED_Z, CUR_E, PLANNER_XY_FEEDRATE(), active_extruder)) - line_to_current_position(planner.settings.max_feedrate_mm_s[Z_AXIS]); - delayed_move_time = 0; - active_extruder_parked = false; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Clear active_extruder_parked"); - break; case DXC_MIRRORED_MODE: case DXC_DUPLICATION_MODE: if (active_extruder == 0) { @@ -1008,22 +1030,23 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) new_pos.x += duplicate_extruder_x_offset; else - new_pos.x = inactive_extruder_x_pos; - // move duplicate extruder into correct duplication position. - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Set planner X", inactive_extruder_x_pos, " ... Line to X", new_pos.x); - planner.set_position_mm(inactive_extruder_x_pos, current_position.y, current_position.z, current_position.e); + new_pos.x = inactive_extruder_x; + // Move duplicate extruder into correct duplication position. + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Set planner X", inactive_extruder_x, " ... Line to X", new_pos.x); + planner.set_position_mm(inactive_extruder_x, current_position.y, current_position.z, current_position.e); if (!planner.buffer_line(new_pos, planner.settings.max_feedrate_mm_s[X_AXIS], 1)) break; + planner.synchronize(); sync_plan_position(); - extruder_duplication_enabled = true; - active_extruder_parked = false; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Set extruder_duplication_enabled\nClear active_extruder_parked"); + + set_duplication_enabled(true); + idex_set_parked(false); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("set_duplication_enabled(true)\nidex_set_parked(false)"); } else if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Active extruder not 0"); break; } } - stepper.set_directions(); return false; } diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 85b70c057a..5a8a8e0045 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -384,8 +384,7 @@ bool homing_needed_error(uint8_t axis_bits=0x07); * Duplication mode */ #if HAS_DUPLICATION_MODE - extern bool extruder_duplication_enabled, // Used in Dual X mode 2 - mirrored_duplication_mode; // Used in Dual X mode 3 + extern bool extruder_duplication_enabled; // Used in Dual X mode 2 #if ENABLED(MULTI_NOZZLE_DUPLICATION) extern uint8_t duplication_e_mask; #endif @@ -404,23 +403,29 @@ bool homing_needed_error(uint8_t axis_bits=0x07); }; extern DualXMode dual_x_carriage_mode; - extern float inactive_extruder_x_pos, // Used in mode 0 & 1 + extern float inactive_extruder_x, // Used in mode 0 & 1 duplicate_extruder_x_offset; // Used in mode 2 & 3 extern xyz_pos_t raised_parked_position; // Used in mode 1 extern bool active_extruder_parked; // Used in mode 1, 2 & 3 extern millis_t delayed_move_time; // Used in mode 1 extern int16_t duplicate_extruder_temp_offset; // Used in mode 2 & 3 + extern bool idex_mirrored_mode; // Used in mode 3 - FORCE_INLINE bool dxc_is_duplicating() { return dual_x_carriage_mode >= DXC_DUPLICATION_MODE; } + FORCE_INLINE bool idex_is_duplicating() { return dual_x_carriage_mode >= DXC_DUPLICATION_MODE; } float x_home_pos(const uint8_t extruder); FORCE_INLINE int x_home_dir(const uint8_t extruder) { return extruder ? X2_HOME_DIR : X_HOME_DIR; } + void set_duplication_enabled(const bool dupe, const int8_t tool_index=-1); + void idex_set_mirrored_mode(const bool mirr); + void idex_set_parked(const bool park=true); + #else #if ENABLED(MULTI_NOZZLE_DUPLICATION) enum DualXMode : char { DXC_DUPLICATION_MODE = 2 }; + FORCE_INLINE void set_duplication_enabled(const bool dupe) { extruder_duplication_enabled = dupe; } #endif FORCE_INLINE int x_home_dir(const uint8_t) { return home_dir(X_AXIS); } diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 8a5de4b608..2201577717 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -348,7 +348,7 @@ xyze_int8_t Stepper::count_direction{0}; } #if ENABLED(X_DUAL_STEPPER_DRIVERS) - #define X_APPLY_DIR(v,Q) do{ X_DIR_WRITE(v); X2_DIR_WRITE((v) != INVERT_X2_VS_X_DIR); }while(0) + #define X_APPLY_DIR(v,Q) do{ X_DIR_WRITE(v); X2_DIR_WRITE((v) ^ ENABLED(INVERT_X2_VS_X_DIR)); }while(0) #if ENABLED(X_DUAL_ENDSTOPS) #define X_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(X,v) #else @@ -356,7 +356,7 @@ xyze_int8_t Stepper::count_direction{0}; #endif #elif ENABLED(DUAL_X_CARRIAGE) #define X_APPLY_DIR(v,ALWAYS) do{ \ - if (extruder_duplication_enabled || ALWAYS) { X_DIR_WRITE(v); X2_DIR_WRITE(mirrored_duplication_mode ? !(v) : v); } \ + if (extruder_duplication_enabled || ALWAYS) { X_DIR_WRITE(v); X2_DIR_WRITE((v) ^ idex_mirrored_mode); } \ else if (last_moved_extruder) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ }while(0) #define X_APPLY_STEP(v,ALWAYS) do{ \ @@ -369,7 +369,7 @@ xyze_int8_t Stepper::count_direction{0}; #endif #if ENABLED(Y_DUAL_STEPPER_DRIVERS) - #define Y_APPLY_DIR(v,Q) do{ Y_DIR_WRITE(v); Y2_DIR_WRITE((v) != INVERT_Y2_VS_Y_DIR); }while(0) + #define Y_APPLY_DIR(v,Q) do{ Y_DIR_WRITE(v); Y2_DIR_WRITE((v) ^ ENABLED(INVERT_Y2_VS_Y_DIR)); }while(0) #if ENABLED(Y_DUAL_ENDSTOPS) #define Y_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Y,v) #else @@ -1605,10 +1605,9 @@ void Stepper::pulse_phase_isr() { PAGE_SEGMENT_UPDATE(Z, high >> 4); PAGE_SEGMENT_UPDATE(E, high & 0xF); - if (dm != last_direction_bits) { - last_direction_bits = dm; - set_directions(); - } + if (dm != last_direction_bits) + set_directions(dm); + } break; default: break; @@ -2131,9 +2130,7 @@ uint32_t Stepper::block_phase_isr() { MIXER_STEPPER_SETUP(); #endif - #if HAS_MULTI_EXTRUDER - stepper_extruder = current_block->extruder; - #endif + TERN_(HAS_MULTI_EXTRUDER, stepper_extruder = current_block->extruder); // Initialize the trapezoid generator from the current block. #if ENABLED(LIN_ADVANCE) @@ -2151,17 +2148,14 @@ uint32_t Stepper::block_phase_isr() { else LA_isr_rate = LA_ADV_NEVER; #endif - if ( ENABLED(HAS_L64XX) // Always set direction for L64xx (Also enables the chips) + if ( ENABLED(HAS_L64XX) // Always set direction for L64xx (Also enables the chips) + || ENABLED(DUAL_X_CARRIAGE) // TODO: Find out why this fixes "jittery" small circles || current_block->direction_bits != last_direction_bits || TERN(MIXING_EXTRUDER, false, stepper_extruder != last_moved_extruder) ) { - last_direction_bits = current_block->direction_bits; - #if HAS_MULTI_EXTRUDER - last_moved_extruder = stepper_extruder; - #endif - + TERN_(HAS_MULTI_EXTRUDER, last_moved_extruder = stepper_extruder); TERN_(HAS_L64XX, L64XX_OK_to_power_up = true); - set_directions(); + set_directions(current_block->direction_bits); } #if ENABLED(LASER_POWER_INLINE) @@ -2583,12 +2577,9 @@ void Stepper::init() { #endif // Init direction bits for first moves - last_direction_bits = 0 - | (INVERT_X_DIR ? _BV(X_AXIS) : 0) - | (INVERT_Y_DIR ? _BV(Y_AXIS) : 0) - | (INVERT_Z_DIR ? _BV(Z_AXIS) : 0); - - set_directions(); + set_directions((INVERT_X_DIR ? _BV(X_AXIS) : 0) + | (INVERT_Y_DIR ? _BV(Y_AXIS) : 0) + | (INVERT_Z_DIR ? _BV(Z_AXIS) : 0)); #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM initialized = true; diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 572c3f3f9b..639a1b2650 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -514,9 +514,15 @@ class Stepper { static void refresh_motor_power(); #endif - // Set direction bits for all steppers + // Update direction states for all steppers static void set_directions(); + // Set direction bits and update all stepper DIR states + static void set_directions(const uint8_t bits) { + last_direction_bits = bits; + set_directions(); + } + private: // Set the current position in steps diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 4ab818f41d..968e654aa3 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -61,6 +61,10 @@ #include "../gcode/gcode.h" #endif +#if ENABLED(DUAL_X_CARRIAGE) + #include "stepper.h" +#endif + #if ANY(SWITCHING_EXTRUDER, SWITCHING_NOZZLE, SWITCHING_TOOLHEAD) #include "servo.h" #endif @@ -701,6 +705,13 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #if ENABLED(DUAL_X_CARRIAGE) + /** + * @brief Dual X Tool Change + * @details Change tools, with extra behavior based on current mode + * + * @param new_tool Tool index to activate + * @param no_move Flag indicating no moves should take place + */ inline void dualx_tool_change(const uint8_t new_tool, bool &no_move) { DEBUG_ECHOPGM("Dual X Carriage Mode "); @@ -711,17 +722,16 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a case DXC_MIRRORED_MODE: DEBUG_ECHOLNPGM("MIRRORED"); break; } + // Get the home position of the currently-active tool const float xhome = x_home_pos(active_extruder); - if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE - && IsRunning() && !no_move - && (delayed_move_time || current_position.x != xhome) + + if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE // If Auto-Park mode is enabled + && IsRunning() && !no_move // ...and movement is permitted + && (delayed_move_time || current_position.x != xhome) // ...and delayed_move_time is set OR not "already parked"... ) { - DEBUG_ECHOLNPAIR("MoveX to ", xhome); - - // Park old head current_position.x = xhome; - line_to_current_position(planner.settings.max_feedrate_mm_s[X_AXIS]); + line_to_current_position(planner.settings.max_feedrate_mm_s[X_AXIS]); // Park the current head planner.synchronize(); } @@ -736,20 +746,21 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a switch (dual_x_carriage_mode) { case DXC_FULL_CONTROL_MODE: // New current position is the position of the activated extruder - current_position.x = inactive_extruder_x_pos; + current_position.x = inactive_extruder_x; // Save the inactive extruder's position (from the old current_position) - inactive_extruder_x_pos = destination.x; + inactive_extruder_x = destination.x; + DEBUG_ECHOLNPAIR("DXC Full Control curr.x=", current_position.x, " dest.x=", destination.x); break; case DXC_AUTO_PARK_MODE: - // record current raised toolhead position for use by unpark - raised_parked_position = current_position; - active_extruder_parked = true; - delayed_move_time = 0; + idex_set_parked(); break; default: break; } + // Ensure X axis DIR pertains to the correct carriage + stepper.set_directions(); + DEBUG_ECHOLNPAIR("Active extruder parked: ", active_extruder_parked ? "yes" : "no"); DEBUG_POS("New extruder (parked)", current_position); } @@ -875,7 +886,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { planner.synchronize(); #if ENABLED(DUAL_X_CARRIAGE) // Only T0 allowed if the Printer is in DXC_DUPLICATION_MODE or DXC_MIRRORED_MODE - if (new_tool != 0 && dxc_is_duplicating()) + if (new_tool != 0 && idex_is_duplicating()) return invalid_extruder_error(new_tool); #endif @@ -1151,7 +1162,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { } #endif - TERN_(DUAL_X_CARRIAGE, active_extruder_parked = false); + TERN_(DUAL_X_CARRIAGE, idex_set_parked(false)); } #if ENABLED(SWITCHING_NOZZLE) From cedc5d340f852a6ebe1cea17cc75731567410052 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 16 Oct 2020 15:04:10 -0700 Subject: [PATCH 0414/1370] LCD conditionals followup (#19766) --- Marlin/src/inc/Conditionals_post.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 581b36932a..3587d82cda 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2614,14 +2614,14 @@ #if HAS_MARLINUI_U8GLIB #define LCD_WIDTH 21 #else - #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) + #define LCD_WIDTH TERN(IS_ULTIPANEL, 20, 16) #endif #endif #ifndef LCD_HEIGHT #if HAS_MARLINUI_U8GLIB #define LCD_HEIGHT 5 #else - #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) + #define LCD_HEIGHT TERN(IS_ULTIPANEL, 4, 2) #endif #endif #endif From 34c16bb3959e6cbd16649ea56a9b001bce91a457 Mon Sep 17 00:00:00 2001 From: arminth Date: Sat, 17 Oct 2020 00:07:34 +0200 Subject: [PATCH 0415/1370] Provide FYSETC F6 13 LCD pins for HD44780 (#19769) --- Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index 9e4ee10096..80eb3f1534 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -261,7 +261,7 @@ #define NEOPIXEL_PIN 25 #endif - #elif HAS_MARLINUI_U8GLIB + #elif HAS_MARLINUI_U8GLIB || HAS_MARLINUI_HD44780 #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 17 From fff5649b6a4efaf54faac3f3f0cc1f0ee2922a83 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Oct 2020 19:54:59 -0500 Subject: [PATCH 0416/1370] touch_ms followup --- Marlin/src/lcd/tft/touch.cpp | 8 ++++---- Marlin/src/lcd/tft/touch.h | 5 +---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 3ecf481ed1..e3cd26a392 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -40,10 +40,10 @@ int16_t Touch::x, Touch::y; touch_control_t Touch::controls[]; touch_control_t *Touch::current_control; uint16_t Touch::controls_count; -millis_t Touch::last_touch_ms = 0; -millis_t Touch::time_to_hold; -millis_t Touch::repeat_delay; -millis_t Touch::touch_time; +millis_t Touch::last_touch_ms = 0, + Touch::time_to_hold, + Touch::repeat_delay, + Touch::touch_time; TouchControlType Touch::touch_control_type = NONE; touch_calibration_t Touch::calibration; #if ENABLED(TOUCH_SCREEN_CALIBRATION) diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h index b2c7a21ba1..17aa5bdd97 100644 --- a/Marlin/src/lcd/tft/touch.h +++ b/Marlin/src/lcd/tft/touch.h @@ -140,10 +140,7 @@ class Touch { static touch_control_t *current_control; static uint16_t controls_count; - static millis_t now; - static millis_t time_to_hold; - static millis_t repeat_delay; - static millis_t touch_time; + static millis_t last_touch_ms, time_to_hold, repeat_delay, touch_time; static TouchControlType touch_control_type; static inline bool get_point(int16_t *x, int16_t *y); From 141f6825ced85578cfba2dace1e14c938c2bc0e0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Oct 2020 19:36:25 -0500 Subject: [PATCH 0417/1370] Rename ultralcd => marlinui --- Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp | 2 +- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/feature/bedlevel/bedlevel.cpp | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/feature/cancel_object.cpp | 2 +- Marlin/src/feature/hotend_idle.cpp | 2 +- Marlin/src/feature/mmu2/mmu2.cpp | 2 +- Marlin/src/feature/password/password.h | 2 +- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/feature/power_monitor.cpp | 2 +- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/feature/tmc_util.h | 2 +- Marlin/src/gcode/bedlevel/G26.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 2 +- Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/gcode/calibrate/G33.cpp | 2 +- Marlin/src/gcode/calibrate/G425.cpp | 2 +- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 2 +- Marlin/src/gcode/calibrate/M48.cpp | 2 +- Marlin/src/gcode/config/M43.cpp | 2 +- Marlin/src/gcode/control/M17_M18_M84.cpp | 2 +- Marlin/src/gcode/control/M80_M81.cpp | 2 +- Marlin/src/gcode/control/M999.cpp | 2 +- Marlin/src/gcode/feature/pause/M125.cpp | 2 +- Marlin/src/gcode/feature/pause/M600.cpp | 2 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 2 +- Marlin/src/gcode/feature/powerloss/M1000.cpp | 2 +- Marlin/src/gcode/feature/powerloss/M413.cpp | 2 +- Marlin/src/gcode/geometry/M206_M428.cpp | 2 +- Marlin/src/gcode/lcd/M0_M1.cpp | 2 +- Marlin/src/gcode/lcd/M117.cpp | 2 +- Marlin/src/gcode/lcd/M145.cpp | 2 +- Marlin/src/gcode/lcd/M250.cpp | 2 +- Marlin/src/gcode/lcd/M300.cpp | 2 +- Marlin/src/gcode/lcd/M73.cpp | 2 +- Marlin/src/gcode/motion/G4.cpp | 2 +- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/gcode/sd/M1001.cpp | 2 +- Marlin/src/gcode/sd/M23.cpp | 2 +- Marlin/src/gcode/sd/M24_M25.cpp | 2 +- Marlin/src/gcode/stats/M31.cpp | 2 +- Marlin/src/gcode/stats/M75-M78.cpp | 2 +- Marlin/src/gcode/temp/M104_M109.cpp | 2 +- Marlin/src/gcode/temp/M106_M107.cpp | 2 +- Marlin/src/gcode/temp/M140_M190.cpp | 2 +- Marlin/src/gcode/temp/M141_M191.cpp | 2 +- Marlin/src/gcode/temp/M303.cpp | 2 +- Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp | 4 ++-- .../{ultralcd_HD44780.cpp => marlinui_HD44780.cpp} | 6 +++--- .../HD44780/{ultralcd_HD44780.h => marlinui_HD44780.h} | 0 Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp | 4 ++-- .../{ultralcd_TFTGLCD.cpp => marlinui_TFTGLCD.cpp} | 6 +++--- .../TFTGLCD/{ultralcd_TFTGLCD.h => marlinui_TFTGLCD.h} | 0 Marlin/src/lcd/dogm/dogm_Statusscreen.h | 2 +- Marlin/src/lcd/dogm/lcdprint_u8g.cpp | 4 ++-- .../src/lcd/dogm/{ultralcd_DOGM.cpp => marlinui_DOGM.cpp} | 6 +++--- Marlin/src/lcd/dogm/{ultralcd_DOGM.h => marlinui_DOGM.h} | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 4 ++-- Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp | 2 +- Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp | 2 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp | 2 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 8 +++----- Marlin/src/lcd/fontutils.cpp | 2 +- Marlin/src/lcd/{ultralcd.cpp => marlinui.cpp} | 4 ++-- Marlin/src/lcd/{ultralcd.h => marlinui.h} | 0 Marlin/src/lcd/menu/game/game.h | 4 ++-- Marlin/src/lcd/menu/menu.h | 2 +- Marlin/src/lcd/menu/menu_item.h | 2 +- Marlin/src/lcd/menu/menu_touch_screen.cpp | 2 +- Marlin/src/lcd/menu/menu_tune.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 2 +- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- Marlin/src/lcd/touch/touch_buttons.cpp | 2 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/endstops.cpp | 2 +- Marlin/src/module/motion.cpp | 4 ++-- Marlin/src/module/planner.cpp | 2 +- Marlin/src/module/probe.cpp | 2 +- Marlin/src/module/settings.cpp | 2 +- Marlin/src/module/stepper.cpp | 2 +- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/module/tool_change.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 2 +- Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 2 +- 93 files changed, 105 insertions(+), 107 deletions(-) rename Marlin/src/lcd/HD44780/{ultralcd_HD44780.cpp => marlinui_HD44780.cpp} (99%) rename Marlin/src/lcd/HD44780/{ultralcd_HD44780.h => marlinui_HD44780.h} (100%) rename Marlin/src/lcd/TFTGLCD/{ultralcd_TFTGLCD.cpp => marlinui_TFTGLCD.cpp} (99%) rename Marlin/src/lcd/TFTGLCD/{ultralcd_TFTGLCD.h => marlinui_TFTGLCD.h} (100%) rename Marlin/src/lcd/dogm/{ultralcd_DOGM.cpp => marlinui_DOGM.cpp} (99%) rename Marlin/src/lcd/dogm/{ultralcd_DOGM.h => marlinui_DOGM.h} (99%) rename Marlin/src/lcd/{ultralcd.cpp => marlinui.cpp} (99%) rename Marlin/src/lcd/{ultralcd.h => marlinui.h} (100%) diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp index 47060d6a5b..7df180cbaa 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp @@ -145,7 +145,7 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va } #if ENABLED(LIGHTWEIGHT_UI) - #include "../../../lcd/ultralcd.h" + #include "../../../lcd/marlinui.h" #include "../../shared/HAL_ST7920.h" #define ST7920_CS_PIN LCD_PINS_RS diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 3a20cf3ee3..786a847fa6 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -59,7 +59,7 @@ #include "sd/cardreader.h" -#include "lcd/ultralcd.h" +#include "lcd/marlinui.h" #if HAS_TOUCH_XPT2046 #include "lcd/touch/touch_buttons.h" #endif diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 3e9225b7f9..0e0b87e890 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -36,7 +36,7 @@ #endif #if ENABLED(LCD_BED_LEVELING) - #include "../../lcd/ultralcd.h" + #include "../../lcd/marlinui.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index e41af9f3cd..ea2e62dd51 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -30,7 +30,7 @@ #include "../../../HAL/shared/eeprom_api.h" #include "../../../libs/hex_print.h" #include "../../../module/settings.h" - #include "../../../lcd/ultralcd.h" + #include "../../../lcd/marlinui.h" #include "../../../module/stepper.h" #include "../../../module/planner.h" #include "../../../module/motion.h" diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index 16f876f136..853e765b66 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -25,7 +25,7 @@ #include "cancel_object.h" #include "../gcode/gcode.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" CancelObject cancelable; diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp index 9d5594c2f1..7f8f20a047 100644 --- a/Marlin/src/feature/hotend_idle.cpp +++ b/Marlin/src/feature/hotend_idle.cpp @@ -34,7 +34,7 @@ #include "../module/temperature.h" #include "../module/motion.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" extern HotendIdleProtection hotend_idle; diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index 3d635369e4..c5cf485850 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -30,7 +30,7 @@ MMU2 mmu2; #include "../../gcode/gcode.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../libs/buzzer.h" #include "../../libs/nozzle.h" #include "../../module/temperature.h" diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h index 3ed584b29d..3c223b6a82 100644 --- a/Marlin/src/feature/password/password.h +++ b/Marlin/src/feature/password/password.h @@ -21,7 +21,7 @@ */ #pragma once -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" class Password { public: diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index dbf27ad8b8..6f970d1a4c 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -55,7 +55,7 @@ #include "../lcd/extui/ui_api.h" #endif -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #if HAS_BUZZER #include "../libs/buzzer.h" diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp index af31d156fc..e1e7324fb6 100644 --- a/Marlin/src/feature/power_monitor.cpp +++ b/Marlin/src/feature/power_monitor.cpp @@ -26,7 +26,7 @@ #include "power_monitor.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #include "../lcd/lcdprint.h" #include "../libs/numtostr.h" diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index e4bc605bb5..874bcff46d 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -45,7 +45,7 @@ uint32_t PrintJobRecovery::cmd_sdpos, // = 0 #endif #include "../sd/cardreader.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #include "../gcode/queue.h" #include "../gcode/gcode.h" #include "../module/motion.h" diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index b65a1254c6..187cfda483 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -22,7 +22,7 @@ #pragma once #include "../inc/MarlinConfig.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #if HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 661128b04e..6123fbf6c8 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -111,7 +111,7 @@ #include "../../module/motion.h" #include "../../module/tool_change.h" #include "../../module/temperature.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #define EXTRUSION_MULTIPLIER 1.0 #define PRIME_LENGTH 10.0 diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index f7de6c8cee..fcdab742cf 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -42,7 +42,7 @@ #endif #if HAS_DISPLAY - #include "../../../lcd/ultralcd.h" + #include "../../../lcd/marlinui.h" #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index d94c16052b..d5cc8a4fcb 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -34,7 +34,7 @@ #include "../../queue.h" #include "../../../libs/buzzer.h" -#include "../../../lcd/ultralcd.h" +#include "../../../lcd/marlinui.h" #include "../../../module/motion.h" #include "../../../module/stepper.h" diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index bccbb9bd16..06b9fee257 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -45,7 +45,7 @@ #include "../../feature/bltouch.h" #endif -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #if ENABLED(DWIN_CREALITY_LCD) #include "../../lcd/dwin/e3v2/dwin.h" #endif diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 53af04d528..77cc45771c 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -29,7 +29,7 @@ #include "../../module/motion.h" #include "../../module/stepper.h" #include "../../module/endstops.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #if HAS_BED_PROBE #include "../../module/probe.h" diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index 8968f78999..6517e6b4bd 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -30,7 +30,7 @@ #include "../../feature/backlash.h" #endif -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../module/motion.h" #include "../../module/planner.h" #include "../../module/tool_change.h" diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 89393b4582..38f17869fb 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -37,7 +37,7 @@ #include "../../module/probe.h" #include "../../feature/probe_temp_comp.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../MarlinCore.h" // for wait_for_heatup and idle() #if ENABLED(PRINTJOB_TIMER_AUTOSTART) diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 8640dfa391..e70815ad54 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -27,7 +27,7 @@ #include "../gcode.h" #include "../../module/motion.h" #include "../../module/probe.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../feature/bedlevel/bedlevel.h" diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index 1e780ca05a..005fdf0f31 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -47,7 +47,7 @@ #endif #if HAS_RESUME_CONTINUE - #include "../../lcd/ultralcd.h" + #include "../../lcd/marlinui.h" #endif #ifndef GET_PIN_MAP_PIN_M43 diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp index 499feef715..b35b465331 100644 --- a/Marlin/src/gcode/control/M17_M18_M84.cpp +++ b/Marlin/src/gcode/control/M17_M18_M84.cpp @@ -22,7 +22,7 @@ #include "../gcode.h" #include "../../MarlinCore.h" // for stepper_inactive_time, disable_e_steppers -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../module/stepper.h" #if ENABLED(AUTO_BED_LEVELING_UBL) diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 6302bb5c67..a8f7f7c10b 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -25,7 +25,7 @@ #include "../../module/temperature.h" #include "../../module/planner.h" // for planner.finish_and_disable #include "../../module/printcounter.h" // for print_job_timer.stop -#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM_P +#include "../../lcd/marlinui.h" // for LCD_MESSAGEPGM_P #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp index 3bd908cad6..7487b4cf6e 100644 --- a/Marlin/src/gcode/control/M999.cpp +++ b/Marlin/src/gcode/control/M999.cpp @@ -22,7 +22,7 @@ #include "../gcode.h" -#include "../../lcd/ultralcd.h" // for lcd_reset_alert_level +#include "../../lcd/marlinui.h" // for lcd_reset_alert_level #include "../../MarlinCore.h" // for marlin_state #include "../queue.h" // for flush_and_request_resend diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index db78e870d7..ed9a393310 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -32,7 +32,7 @@ #include "../../../module/printcounter.h" #if HAS_LCD_MENU - #include "../../../lcd/ultralcd.h" + #include "../../../lcd/marlinui.h" #endif #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 5f3573ef83..0af68333ca 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -34,7 +34,7 @@ #endif #if HAS_LCD_MENU - #include "../../../lcd/ultralcd.h" + #include "../../../lcd/marlinui.h" #endif #if ENABLED(MMU2_MENUS) diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index c1f7223142..a193d83d40 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -35,7 +35,7 @@ #endif #if HAS_LCD_MENU - #include "../../../lcd/ultralcd.h" + #include "../../../lcd/marlinui.h" #endif #if ENABLED(PRUSA_MMU2) diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index e9477dd2fb..14c92531fa 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -27,7 +27,7 @@ #include "../../gcode.h" #include "../../../feature/powerloss.h" #include "../../../module/motion.h" -#include "../../../lcd/ultralcd.h" +#include "../../../lcd/marlinui.h" #if ENABLED(EXTENSIBLE_UI) #include "../../../lcd/extui/ui_api.h" #endif diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp index 3538ccaa6e..64573e5dff 100644 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ b/Marlin/src/gcode/feature/powerloss/M413.cpp @@ -27,7 +27,7 @@ #include "../../gcode.h" #include "../../../feature/powerloss.h" #include "../../../module/motion.h" -#include "../../../lcd/ultralcd.h" +#include "../../../lcd/marlinui.h" /** * M413: Enable / Disable power-loss recovery diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index a477a1a526..70cb1e19e5 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -26,7 +26,7 @@ #include "../gcode.h" #include "../../module/motion.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../libs/buzzer.h" /** diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp index 1d18b70602..414c4ce023 100644 --- a/Marlin/src/gcode/lcd/M0_M1.cpp +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -32,7 +32,7 @@ #include "../../MarlinCore.h" // for wait_for_user_response() #if HAS_LCD_MENU - #include "../../lcd/ultralcd.h" + #include "../../lcd/marlinui.h" #elif ENABLED(EXTENSIBLE_UI) #include "../../lcd/extui/ui_api.h" #endif diff --git a/Marlin/src/gcode/lcd/M117.cpp b/Marlin/src/gcode/lcd/M117.cpp index 8459135f30..59305d94c5 100644 --- a/Marlin/src/gcode/lcd/M117.cpp +++ b/Marlin/src/gcode/lcd/M117.cpp @@ -21,7 +21,7 @@ */ #include "../gcode.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" /** * M117: Set LCD Status Message diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index abd4dcc743..84a7e75aa4 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -25,7 +25,7 @@ #if PREHEAT_COUNT #include "../gcode.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" /** * M145: Set the heatup state for a material in the LCD menu diff --git a/Marlin/src/gcode/lcd/M250.cpp b/Marlin/src/gcode/lcd/M250.cpp index f42daaeac4..f553044d31 100644 --- a/Marlin/src/gcode/lcd/M250.cpp +++ b/Marlin/src/gcode/lcd/M250.cpp @@ -25,7 +25,7 @@ #if HAS_LCD_CONTRAST #include "../gcode.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" /** * M250: Read and optionally set the LCD contrast diff --git a/Marlin/src/gcode/lcd/M300.cpp b/Marlin/src/gcode/lcd/M300.cpp index 56d9ee5d73..5250774955 100644 --- a/Marlin/src/gcode/lcd/M300.cpp +++ b/Marlin/src/gcode/lcd/M300.cpp @@ -26,7 +26,7 @@ #include "../gcode.h" -#include "../../lcd/ultralcd.h" // i2c-based BUZZ +#include "../../lcd/marlinui.h" // i2c-based BUZZ #include "../../libs/buzzer.h" // Buzzer, if possible /** diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp index 7a5454419d..5b135bdff8 100644 --- a/Marlin/src/gcode/lcd/M73.cpp +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -25,7 +25,7 @@ #if ENABLED(LCD_SET_PROGRESS_MANUALLY) #include "../gcode.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../sd/cardreader.h" /** diff --git a/Marlin/src/gcode/motion/G4.cpp b/Marlin/src/gcode/motion/G4.cpp index 3a37fe5b2c..724ed7f1ca 100644 --- a/Marlin/src/gcode/motion/G4.cpp +++ b/Marlin/src/gcode/motion/G4.cpp @@ -22,7 +22,7 @@ #include "../gcode.h" #include "../../module/stepper.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" /** * G4: Dwell S or P diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index b9169d90e1..4de5056fb2 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -29,7 +29,7 @@ GCodeQueue queue; #include "gcode.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #include "../sd/cardreader.h" #include "../module/planner.h" #include "../module/temperature.h" diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index b28429f631..4a461170bc 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -32,7 +32,7 @@ #endif #if EITHER(LCD_SET_PROGRESS_MANUALLY, SD_REPRINT_LAST_SELECTED_FILE) - #include "../../lcd/ultralcd.h" + #include "../../lcd/marlinui.h" #endif #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/gcode/sd/M23.cpp b/Marlin/src/gcode/sd/M23.cpp index b88f66b591..51bc824130 100644 --- a/Marlin/src/gcode/sd/M23.cpp +++ b/Marlin/src/gcode/sd/M23.cpp @@ -26,7 +26,7 @@ #include "../gcode.h" #include "../../sd/cardreader.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" /** * M23: Open a file diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp index bdb37f605c..611ba17c55 100644 --- a/Marlin/src/gcode/sd/M24_M25.cpp +++ b/Marlin/src/gcode/sd/M24_M25.cpp @@ -27,7 +27,7 @@ #include "../gcode.h" #include "../../sd/cardreader.h" #include "../../module/printcounter.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #if ENABLED(PARK_HEAD_ON_PAUSE) #include "../../feature/pause.h" diff --git a/Marlin/src/gcode/stats/M31.cpp b/Marlin/src/gcode/stats/M31.cpp index b39108bb90..c0e7d2a7ae 100644 --- a/Marlin/src/gcode/stats/M31.cpp +++ b/Marlin/src/gcode/stats/M31.cpp @@ -24,7 +24,7 @@ #include "../../core/serial.h" #include "../../module/printcounter.h" #include "../../libs/duration_t.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" /** * M31: Get the time since the start of SD Print (or last M109) diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp index 908e6e5a31..568d9b0e27 100644 --- a/Marlin/src/gcode/stats/M75-M78.cpp +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -22,7 +22,7 @@ #include "../gcode.h" #include "../../module/printcounter.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../MarlinCore.h" // for startOrResumeJob diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index 4402728de3..d2b466e2fb 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -34,7 +34,7 @@ #include "../../module/temperature.h" #include "../../module/motion.h" #include "../../module/planner.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../MarlinCore.h" // for startOrResumeJob, etc. diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index 17ff8c3c8f..9c70f1ebc7 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -29,7 +29,7 @@ #include "../../module/temperature.h" #if PREHEAT_COUNT - #include "../../lcd/ultralcd.h" + #include "../../lcd/marlinui.h" #endif #if ENABLED(SINGLENOZZLE) diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index 9438b9e0c2..ac8228085e 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -33,7 +33,7 @@ #include "../gcode.h" #include "../../module/temperature.h" #include "../../module/motion.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #if ENABLED(PRINTJOB_TIMER_AUTOSTART) #include "../../module/printcounter.h" diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp index 41a79825aa..fc80c5f4cb 100644 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ b/Marlin/src/gcode/temp/M141_M191.cpp @@ -34,7 +34,7 @@ #include "../../module/temperature.h" #include "../../module/motion.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #if ENABLED(PRINTJOB_TIMER_AUTOSTART) #include "../../module/printcounter.h" diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index ccce09b4f1..c1bf9efd7f 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -25,7 +25,7 @@ #if HAS_PID_HEATING #include "../gcode.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" #include "../../module/temperature.h" #if ENABLED(EXTENSIBLE_UI) diff --git a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp index aa3c3c04a1..8aca19b0cd 100644 --- a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp +++ b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp @@ -16,10 +16,10 @@ #if HAS_MARLINUI_HD44780 -#include "../ultralcd.h" +#include "../marlinui.h" #include "../../MarlinCore.h" -#include "ultralcd_HD44780.h" +#include "marlinui_HD44780.h" #include diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp similarity index 99% rename from Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp rename to Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index e6cc227465..3c7993e375 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -25,14 +25,14 @@ #if HAS_MARLINUI_HD44780 /** - * ultralcd_HD44780.cpp + * marlinui_HD44780.cpp * * LCD display implementations for Hitachi HD44780. * These are the most common LCD character displays. */ -#include "ultralcd_HD44780.h" -#include "../ultralcd.h" +#include "marlinui_HD44780.h" +#include "../marlinui.h" #include "../../libs/numtostr.h" #include "../../sd/cardreader.h" diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.h b/Marlin/src/lcd/HD44780/marlinui_HD44780.h similarity index 100% rename from Marlin/src/lcd/HD44780/ultralcd_HD44780.h rename to Marlin/src/lcd/HD44780/marlinui_HD44780.h diff --git a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp index 51681a8009..dddab1f259 100644 --- a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp @@ -37,11 +37,11 @@ #if IS_TFTGLCD_PANEL -#include "../ultralcd.h" +#include "../marlinui.h" #include "../../MarlinCore.h" #include "../../libs/numtostr.h" -#include "ultralcd_TFTGLCD.h" +#include "marlinui_TFTGLCD.h" #include diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp similarity index 99% rename from Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp rename to Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 4aa6bcd485..83ebe111ae 100644 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -25,7 +25,7 @@ #if IS_TFTGLCD_PANEL /** - * ultralcd_TFTGLCD.cpp + * marlinui_TFTGLCD.cpp * * Implementation of the LCD display routines for a TFT GLCD displays with external controller. * This display looks like a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER but has good text font @@ -42,8 +42,8 @@ #include #endif -#include "ultralcd_TFTGLCD.h" -#include "../ultralcd.h" +#include "marlinui_TFTGLCD.h" +#include "../marlinui.h" #include "../../libs/numtostr.h" #include "../../sd/cardreader.h" diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h similarity index 100% rename from Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h rename to Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index c6ad566cff..e76b7da598 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -29,7 +29,7 @@ */ #include "../../inc/MarlinConfig.h" -#include "ultralcd_DOGM.h" +#include "marlinui_DOGM.h" #define BW(N) ((N + 7) / 8) diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp index a6bdb373dd..a85dc9f979 100644 --- a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp +++ b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp @@ -11,9 +11,9 @@ #if HAS_MARLINUI_U8GLIB -#include "ultralcd_DOGM.h" +#include "marlinui_DOGM.h" -#include "../ultralcd.h" +#include "../marlinui.h" #include "../../MarlinCore.h" #include "../fontutils.h" diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp similarity index 99% rename from Marlin/src/lcd/dogm/ultralcd_DOGM.cpp rename to Marlin/src/lcd/dogm/marlinui_DOGM.cpp index c48abac810..53a20476e9 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -21,7 +21,7 @@ */ /** - * lcd/dogm/ultralcd_DOGM.h + * lcd/dogm/marlinui_DOGM.h * * Implementation of the LCD display routines for a DOGM128 graphic display. * by STB for ErikZalm/Marlin. Common LCD 128x64 pixel graphic displays. @@ -39,7 +39,7 @@ #if HAS_MARLINUI_U8GLIB -#include "ultralcd_DOGM.h" +#include "marlinui_DOGM.h" #include "u8g_fontutf8.h" #if ENABLED(SHOW_BOOTSCREEN) @@ -49,7 +49,7 @@ #include "../lcdprint.h" #include "../fontutils.h" #include "../../libs/numtostr.h" -#include "../ultralcd.h" +#include "../marlinui.h" #include "../../sd/cardreader.h" #include "../../module/temperature.h" diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h similarity index 99% rename from Marlin/src/lcd/dogm/ultralcd_DOGM.h rename to Marlin/src/lcd/dogm/marlinui_DOGM.h index b0db727f09..29a1b7d3cf 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -22,7 +22,7 @@ #pragma once /** - * lcd/dogm/ultralcd_DOGM.h + * lcd/dogm/marlinui_DOGM.h */ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 987924201a..d07474d810 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -30,8 +30,8 @@ #if HAS_MARLINUI_U8GLIB && DISABLED(LIGHTWEIGHT_UI) #include "dogm_Statusscreen.h" -#include "ultralcd_DOGM.h" -#include "../ultralcd.h" +#include "marlinui_DOGM.h" +#include "../marlinui.h" #include "../lcdprint.h" #include "../../libs/numtostr.h" diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index 806f370db3..c06080f601 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -46,7 +46,7 @@ #include "status_screen_lite_ST7920.h" -#include "../ultralcd.h" +#include "../marlinui.h" #include "../fontutils.h" #include "../lcdprint.h" #include "../../libs/duration_t.h" diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index fa9e006744..2599b1ad22 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -58,7 +58,7 @@ #if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || HAS_SPI_GRAPHICAL_TFT) #include "HAL_LCD_com_defines.h" -#include "ultralcd_DOGM.h" +#include "marlinui_DOGM.h" #include diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 2808749737..45704d5724 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -47,7 +47,7 @@ #include #include "../../fontutils.h" -#include "../../ultralcd.h" +#include "../../marlinui.h" #include "../../../sd/cardreader.h" diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp index 3beed892e3..e2f2fd9346 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp @@ -35,7 +35,7 @@ #include "../../../../../module/planner.h" #include "../../../ui_api.h" -#include "../../../../ultralcd.h" +#include "../../../../marlinui.h" #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) uint16_t distanceToMove = 10; diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp index 82c06d7a4a..ed26cac3c5 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp @@ -35,7 +35,7 @@ #include "../../../../../module/planner.h" #include "../../../ui_api.h" -#include "../../../../ultralcd.h" +#include "../../../../marlinui.h" #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) uint16_t distanceToMove = 10; diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index f9d4351e02..46e542a959 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -34,7 +34,7 @@ #include "../../../../../module/motion.h" #include "../../../../../module/planner.h" -#include "../../../../ultralcd.h" +#include "../../../../marlinui.h" #include "../../../ui_api.h" #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index c6369db413..0b49bf4ab7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -41,7 +41,7 @@ #include "../../../../feature/powerloss.h" #endif #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - #include "../../../ultralcd.h" + #include "../../../marlinui.h" #endif extern lv_group_t * g; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index c0cd14d70d..f74ed3c798 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -44,7 +44,7 @@ #include "../../../../inc/MarlinConfig.h" #include HAL_PATH(../../HAL, tft/xpt2046.h) -#include "../../../ultralcd.h" +#include "../../../marlinui.h" XPT2046 touch; #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index f5d954792e..e4fb4ece03 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -33,7 +33,7 @@ #include "../../../../module/temperature.h" #include "../../../../gcode/queue.h" #include "../../../../gcode/gcode.h" -#include "../../../../lcd/ultralcd.h" +#include "../../../../lcd/marlinui.h" #include "../../../../sd/cardreader.h" #include "../../../../module/planner.h" #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index 79a5fb961a..5505a0dff7 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -49,7 +49,7 @@ #include "ui_api.h" -#include "../ultralcd.h" +#include "../marlinui.h" #include "../../sd/cardreader.h" #include "../../module/temperature.h" #include "../../module/stepper.h" diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 30cf696f3e..8151828a08 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -45,7 +45,7 @@ #if ENABLED(EXTENSIBLE_UI) -#include "../ultralcd.h" +#include "../marlinui.h" #include "../../gcode/queue.h" #include "../../module/motion.h" #include "../../module/planner.h" @@ -1053,11 +1053,9 @@ namespace ExtUI { } // namespace ExtUI -// At the moment, we piggy-back off the ultralcd calls, but this could be cleaned up in the future +// At the moment we hook into MarlinUI methods, but this could be cleaned up in the future -void MarlinUI::init() { - ExtUI::onStartup(); -} +void MarlinUI::init() { ExtUI::onStartup(); } void MarlinUI::update() { ExtUI::onIdle(); } diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp index 5bf07e1bd4..22b54c72de 100644 --- a/Marlin/src/lcd/fontutils.cpp +++ b/Marlin/src/lcd/fontutils.cpp @@ -10,7 +10,7 @@ #include "../inc/MarlinConfig.h" #if HAS_WIRED_LCD - #include "ultralcd.h" + #include "marlinui.h" #include "../MarlinCore.h" #endif diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/marlinui.cpp similarity index 99% rename from Marlin/src/lcd/ultralcd.cpp rename to Marlin/src/lcd/marlinui.cpp index 25f5afc71d..487678eccf 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -31,7 +31,7 @@ #endif // All displays share the MarlinUI class -#include "ultralcd.h" +#include "marlinui.h" MarlinUI ui; #if HAS_DISPLAY @@ -117,7 +117,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if HAS_WIRED_LCD #if HAS_MARLINUI_U8GLIB - #include "dogm/ultralcd_DOGM.h" + #include "dogm/marlinui_DOGM.h" #endif #include "lcdprint.h" diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/marlinui.h similarity index 100% rename from Marlin/src/lcd/ultralcd.h rename to Marlin/src/lcd/marlinui.h diff --git a/Marlin/src/lcd/menu/game/game.h b/Marlin/src/lcd/menu/game/game.h index e788f29805..cba79e4f28 100644 --- a/Marlin/src/lcd/menu/game/game.h +++ b/Marlin/src/lcd/menu/game/game.h @@ -22,9 +22,9 @@ #pragma once #include "../../../inc/MarlinConfigPre.h" -#include "../../dogm/ultralcd_DOGM.h" +#include "../../dogm/marlinui_DOGM.h" #include "../../lcdprint.h" -#include "../../ultralcd.h" +#include "../../marlinui.h" //#define MUTE_GAMES diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 89970225ad..4dd66637f1 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -21,7 +21,7 @@ */ #pragma once -#include "../ultralcd.h" +#include "../marlinui.h" #include "../../libs/numtostr.h" #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index bd3af0cec6..3ebe38235d 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -22,7 +22,7 @@ #pragma once #include "menu.h" -#include "../ultralcd.h" +#include "../marlinui.h" #include "../../gcode/queue.h" // for inject_P #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp index 96eae2298e..ea610e0886 100644 --- a/Marlin/src/lcd/menu/menu_touch_screen.cpp +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -25,7 +25,7 @@ #if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) #include "menu_item.h" -#include "../ultralcd.h" +#include "../marlinui.h" void touch_screen_calibration() { diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 6bf5c3a15d..041786794e 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -47,7 +47,7 @@ #include "../../feature/babystep.h" #include "../lcdprint.h" #if HAS_MARLINUI_U8GLIB - #include "../dogm/ultralcd_DOGM.h" + #include "../dogm/marlinui_DOGM.h" #endif void _lcd_babystep(const AxisEnum axis, PGM_P const msg) { diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index e3cd26a392..6dcddc5d56 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -23,7 +23,7 @@ #include "touch.h" -#include "../ultralcd.h" // for ui methods +#include "../marlinui.h" // for ui methods #include "../menu/menu_item.h" // for touch_screen_calibration #include "../../module/temperature.h" diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index de8498c5ff..339c26cca2 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -26,7 +26,7 @@ #include "ui_320x240.h" -#include "../ultralcd.h" +#include "../marlinui.h" #include "../menu/menu.h" #include "../../libs/numtostr.h" diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 3dab9418f5..b67e041349 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -26,7 +26,7 @@ #include "ui_480x320.h" -#include "../ultralcd.h" +#include "../marlinui.h" #include "../menu/menu.h" #include "../../libs/numtostr.h" diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp index 7d25c0df7e..eeb22aae6e 100644 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -27,7 +27,7 @@ #include HAL_PATH(../../HAL, tft/xpt2046.h) XPT2046 touchIO; -#include "../../lcd/ultralcd.h" // For EN_C bit mask +#include "../../lcd/marlinui.h" // For EN_C bit mask /** * Draw and Touch processing diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index df6cae6e0a..93238a69e3 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -34,7 +34,7 @@ // For homing: #include "planner.h" #include "endstops.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #include "../MarlinCore.h" #if HAS_BED_PROBE diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 712182a0ea..928c9ad8b9 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -30,7 +30,7 @@ #include "../MarlinCore.h" #include "../sd/cardreader.h" #include "temperature.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) #include HAL_PATH(../HAL, endstop_interrupts.h) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 75a7944c3f..03c8ddc462 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -36,7 +36,7 @@ #if IS_SCARA #include "../libs/buzzer.h" - #include "../lcd/ultralcd.h" + #include "../lcd/marlinui.h" #endif #if HAS_BED_PROBE @@ -52,7 +52,7 @@ #endif #if HAS_DISPLAY - #include "../lcd/ultralcd.h" + #include "../lcd/marlinui.h" #endif #if HAS_FILAMENT_SENSOR diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 4ad7c4ccf0..74535df1f9 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -66,7 +66,7 @@ #include "stepper.h" #include "motion.h" #include "temperature.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #include "../gcode/parser.h" #include "../MarlinCore.h" diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 27ceb989c0..d008720389 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -36,7 +36,7 @@ #include "endstops.h" #include "../gcode/gcode.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #include "../MarlinCore.h" // for stop(), disable_e_steppers diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 33e5c351ab..eac2af38c3 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -54,7 +54,7 @@ #include "../lcd/dwin/e3v2/dwin.h" #endif -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #include "../libs/vector_3.h" // for matrix_3x3 #include "../gcode/gcode.h" #include "../MarlinCore.h" diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 2201577717..7b3e13eff4 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -92,7 +92,7 @@ Stepper stepper; // Singleton #include "motion.h" #include "temperature.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #include "../gcode/queue.h" #include "../sd/cardreader.h" #include "../MarlinCore.h" diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 4b352e738e..3468a4c1c5 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -34,7 +34,7 @@ #include "planner.h" #include "../HAL/shared/Delay.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #if ENABLED(DWIN_CREALITY_LCD) #include "../lcd/dwin/e3v2/dwin.h" diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 968e654aa3..2c1a1a6017 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -94,7 +94,7 @@ #endif #if HAS_LCD_MENU - #include "../lcd/ultralcd.h" + #include "../lcd/marlinui.h" #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index e154ea9f31..b809b2c10f 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -29,7 +29,7 @@ #include "cardreader.h" #include "../MarlinCore.h" -#include "../lcd/ultralcd.h" +#include "../lcd/marlinui.h" #if ENABLED(DWIN_CREALITY_LCD) #include "../lcd/dwin/e3v2/dwin.h" diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index a097df5105..539d316542 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -94,7 +94,7 @@ static_assert(USB_INTR_PIN != -1, "USB_INTR_PIN must be defined"); #include "Sd2Card_FlashDrive.h" -#include "../../lcd/ultralcd.h" +#include "../../lcd/marlinui.h" static enum { UNINITIALIZED, From 52c090dfbe92514fc2a48951583d50da59b819a4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 16 Oct 2020 22:05:45 -0300 Subject: [PATCH 0418/1370] Fix starting fan with bad material preset index (#19773) --- Marlin/src/lcd/menu/menu_temperature.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 0c70cd7e18..edf6685d7c 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -44,24 +44,17 @@ // void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb) { + UNUSED(e); UNUSED(indh); UNUSED(indb); #if HAS_HOTEND if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) setTargetHotend(_MIN(thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, ui.material_preset[indh].hotend_temp), e); - #else - UNUSED(e); UNUSED(indh); #endif #if HAS_HEATED_BED if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); - #else - UNUSED(indb); #endif #if HAS_FAN - set_fan_speed(( - #if FAN_COUNT > 1 - active_extruder < FAN_COUNT ? active_extruder : - #endif - 0), ui.material_preset[indh].fan_speed - ); + if (indh >= 0) + set_fan_speed(active_extruder < (FAN_COUNT) ? active_extruder : 0, ui.material_preset[indh].fan_speed); #endif ui.return_to_status(); } @@ -93,7 +86,9 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #endif - void do_preheat_end_m() { _preheat_end(editable.int8, 0); } + void do_preheat_end_m() { + _preheat_end(editable.int8, 0); + } #if HAS_MULTI_HOTEND || HAS_HEATED_BED From a44aae268ac3cc184596f3fd031455128cb6688c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Oct 2020 20:38:23 -0500 Subject: [PATCH 0419/1370] Starting fan followup --- Marlin/src/lcd/menu/menu_temperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index edf6685d7c..28ea54efba 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -31,7 +31,7 @@ #include "menu_item.h" #include "../../module/temperature.h" -#if FAN_COUNT > 1 || ENABLED(SINGLENOZZLE) +#if HAS_FAN || ENABLED(SINGLENOZZLE) #include "../../module/motion.h" #endif From 332adafa238e9065afa3077fce0952a4cd3b1a76 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Oct 2020 20:48:52 -0500 Subject: [PATCH 0420/1370] MarlinUI followup --- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp | 2 +- Marlin/src/lcd/language/language_de.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 3dc63b0655..5e1ec5b961 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -31,7 +31,7 @@ #include "../../module/stepper.h" #include "../../module/planner.h" #include "../../module/probe.h" -#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM +#include "../../lcd/marlinui.h" // for LCD_MESSAGEPGM #if HAS_LEVELING #include "../../feature/bedlevel/bedlevel.h" diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp index 740436d93c..c745f971dc 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp @@ -201,7 +201,7 @@ u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_f #if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS) // Also use this device for HAL version of rrd class. This results in the same device being used - // for the ST7920 for HAL systems no matter what is selected in ultralcd_impl_DOGM.h. + // for the ST7920 for HAL systems no matter what is selected in marlinui_DOGM.h. u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; #endif diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 74e185680c..f8d891576e 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -70,7 +70,7 @@ namespace Language_de { PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Ausblendhöhe"); PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Setze Homeversatz"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Homeversatz aktiv"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Setze Nullpunkte"); //"G92 X0 Y0 Z0" commented out in ultralcd.cpp + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Setze Nullpunkte"); //"G92 X0 Y0 Z0" commented out in marlinui.cpp #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" Vorwärmen"); PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" Vorwärmen ~"); From 25bb249ac6896b91df3b69e40134b37a607189d1 Mon Sep 17 00:00:00 2001 From: Curtis Jenkins Date: Sat, 17 Oct 2020 16:05:50 -0400 Subject: [PATCH 0421/1370] Fix Smoothieboard digipots i2c pin (#19784) --- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 3c47a70101..4e10d8d1da 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -169,7 +169,7 @@ * Set from 0 - 127 with stop bit. * (Ex. 3F << 1 | 1) */ -#define DIGIPOTS_I2C_SCL P0_0 +#define DIGIPOTS_I2C_SCL P0_00 #define DIGIPOTS_I2C_SDA_X P0_04 #define DIGIPOTS_I2C_SDA_Y P0_10 #define DIGIPOTS_I2C_SDA_Z P0_19 From 32ca42ead33cd628d0962dd95f406738218eff5d Mon Sep 17 00:00:00 2001 From: Sten Uusvali <31988255+nuevocampo@users.noreply.github.com> Date: Sat, 17 Oct 2020 14:11:22 -0700 Subject: [PATCH 0422/1370] Fix M503 output for M907 motor current (#19777) Co-authored-by: Scott Lahteine --- Marlin/src/module/settings.cpp | 22 +++++++++++++-------- Marlin/src/module/stepper.cpp | 2 +- Marlin/src/pins/rambo/pins_RAMBO.h | 2 +- Marlin/src/pins/rambo/pins_SCOOVO_X9H.h | 2 +- Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h | 2 +- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index eac2af38c3..f5a954f5de 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3719,19 +3719,25 @@ void MarlinSettings::reset() { CONFIG_ECHO_HEADING("Stepper motor currents:"); CONFIG_ECHO_START(); #if HAS_MOTOR_CURRENT_PWM - SERIAL_ECHOLNPAIR_P( - PSTR(" M907 X"), stepper.motor_current_setting[0] - , SP_Z_STR, stepper.motor_current_setting[1] - , SP_E_STR, stepper.motor_current_setting[2] + SERIAL_ECHOLNPAIR_P( // PWM-based has 3 values: + PSTR(" M907 X"), stepper.motor_current_setting[0] // X and Y + , SP_Z_STR, stepper.motor_current_setting[1] // Z + , SP_E_STR, stepper.motor_current_setting[2] // E ); #elif HAS_MOTOR_CURRENT_SPI - SERIAL_ECHOPGM(" M907"); - LOOP_L_N(q, MOTOR_CURRENT_COUNT) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[q]); + SERIAL_ECHOPGM(" M907"); // SPI-based has 5 values: + LOOP_XYZE(q) { // X Y Z E (map to X Y Z E0 by default) + SERIAL_CHAR(' ', axis_codes[q]); SERIAL_ECHO(stepper.motor_current_setting[q]); } + SERIAL_CHAR(' ', 'B'); // B (maps to E1 by default) + SERIAL_ECHOLN(stepper.motor_current_setting[4]); #endif + #elif HAS_MOTOR_CURRENT_I2C // i2c-based has any number of values + // Values sent over i2c are not stored. + // Indexes map directly to drivers, not axes. + #elif HAS_MOTOR_CURRENT_DAC // DAC-based has 4 values, for X Y Z E + // Values sent over i2c are not stored. Uses indirect mapping. #endif /** diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 7b3e13eff4..0a83a90ba2 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2962,7 +2962,7 @@ void Stepper::report_positions() { #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { - if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1)) + if (WITHIN(driver, 0, MOTOR_CURRENT_COUNT - 1)) motor_current_setting[driver] = current; // update motor_current_setting if (!initialized) return; diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 0254edea26..62e7565c14 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -112,7 +112,7 @@ #define E1_MS2_PIN 64 #define DIGIPOTSS_PIN 38 -#define DIGIPOT_CHANNELS { 4,5,3,0,1 } // X Y Z E0 E1 digipot channels to stepper driver mapping +#define DIGIPOT_CHANNELS { 4, 5, 3, 0, 1 } // X Y Z E0 E1 digipot channels to stepper driver mapping #ifndef DIGIPOT_MOTOR_CURRENT #define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) #endif diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h index 4af38e1de3..5680b00df6 100644 --- a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h +++ b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h @@ -92,7 +92,7 @@ #define E1_MS2_PIN 64 #define DIGIPOTSS_PIN 38 -#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping +#define DIGIPOT_CHANNELS { 4, 5, 3, 0, 1 } // X Y Z E0 E1 digipot channels to stepper driver mapping // // Temperature Sensors diff --git a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h index 967fec7b47..f120e9c44f 100644 --- a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h +++ b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h @@ -85,7 +85,7 @@ // Steppers // #define DIGIPOTSS_PIN 22 -#define DIGIPOT_CHANNELS { 4, 5, 3, 0, 1 } +#define DIGIPOT_CHANNELS { 4, 5, 3, 0, 1 } // // Temperature Sensors From 9124f1d7c8c586bc05286c153b849df2ac3b66fb Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Sun, 18 Oct 2020 04:35:19 +0100 Subject: [PATCH 0423/1370] Distinct Chopper Timing settings (#19781) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 20 ++++- Marlin/src/module/stepper/trinamic.cpp | 68 ++++++++--------- Marlin/src/module/stepper/trinamic.h | 100 ++++++++++++++++++++----- 3 files changed, 135 insertions(+), 53 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index c3ba3f7e22..d6f31658cd 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2471,10 +2471,26 @@ * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V) * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 * - * Define you own with + * Define your own with: * { , , hysteresis_start[1..8] } */ - #define CHOPPER_TIMING CHOPPER_DEFAULT_12V + #define CHOPPER_TIMING CHOPPER_DEFAULT_12V // All axes (override below) + //#define CHOPPER_TIMING_X CHOPPER_DEFAULT_12V // For X Axes (override below) + //#define CHOPPER_TIMING_X2 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_Y CHOPPER_DEFAULT_12V // For Y Axes (override below) + //#define CHOPPER_TIMING_Y2 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_Z CHOPPER_DEFAULT_12V // For Z Axes (override below) + //#define CHOPPER_TIMING_Z2 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_Z3 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_Z4 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E CHOPPER_DEFAULT_12V // For Extruders (override below) + //#define CHOPPER_TIMING_E1 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E2 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E3 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E4 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E5 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E6 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E7 CHOPPER_DEFAULT_12V /** * Monitor Trinamic drivers diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index d5a861d71b..ad11046f62 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -36,7 +36,7 @@ #include enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; -#define TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX]) +#define TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX], chopper_timing_##ST) // IC = TMC model number // ST = Stepper object letter @@ -131,15 +131,15 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2130) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { st.begin(); CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); st.CHOPCONF(chopconf.sr); @@ -166,15 +166,15 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2160) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { st.begin(); CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); st.CHOPCONF(chopconf.sr); @@ -484,7 +484,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2208) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { TMC2208_n::GCONF_t gconf{0}; gconf.pdn_disable = true; // Use UART gconf.mstep_reg_select = true; // Select microsteps with UART @@ -495,10 +495,10 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; TMC2208_n::CHOPCONF_t chopconf{0}; chopconf.tbl = 0b01; // blank_time = 24 - chopconf.toff = chopper_timing.toff; + chopconf.toff = chop_init.toff; chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); st.CHOPCONF(chopconf.sr); @@ -526,7 +526,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2209) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { TMC2208_n::GCONF_t gconf{0}; gconf.pdn_disable = true; // Use UART gconf.mstep_reg_select = true; // Select microsteps with UART @@ -537,10 +537,10 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; TMC2208_n::CHOPCONF_t chopconf{0}; chopconf.tbl = 0b01; // blank_time = 24 - chopconf.toff = chopper_timing.toff; + chopconf.toff = chop_init.toff; chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); st.CHOPCONF(chopconf.sr); @@ -568,14 +568,14 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2660) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool, const chopper_timing_t &chop_init) { st.begin(); TMC2660_n::CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; st.CHOPCONF(chopconf.sr); st.sdoff(0); @@ -590,15 +590,15 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC5130) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { st.begin(); CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); st.CHOPCONF(chopconf.sr); @@ -625,15 +625,15 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC5160) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { st.begin(); CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); st.CHOPCONF(chopconf.sr); diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h index 9cc3404cd2..7ae2a276db 100644 --- a/Marlin/src/module/stepper/trinamic.h +++ b/Marlin/src/module/stepper/trinamic.h @@ -76,7 +76,18 @@ typedef struct { uint8_t hstrt; } chopper_timing_t; -static constexpr chopper_timing_t chopper_timing = CHOPPER_TIMING; +#ifndef CHOPPER_TIMING_X + #define CHOPPER_TIMING_X CHOPPER_TIMING +#endif +#ifndef CHOPPER_TIMING_Y + #define CHOPPER_TIMING_Y CHOPPER_TIMING +#endif +#ifndef CHOPPER_TIMING_Z + #define CHOPPER_TIMING_Z CHOPPER_TIMING +#endif +#ifndef CHOPPER_TIMING_E + #define CHOPPER_TIMING_E CHOPPER_TIMING +#endif #if HAS_TMC220x void tmc_serial_begin(); @@ -90,9 +101,10 @@ void reset_trinamic_drivers(); // X Stepper #if AXIS_IS_TMC(X) extern TMC_CLASS(X, X) stepperX; + static constexpr chopper_timing_t chopper_timing_X = CHOPPER_TIMING_X; #if ENABLED(SOFTWARE_DRIVER_ENABLE) #define X_ENABLE_INIT() NOOP - #define X_ENABLE_WRITE(STATE) stepperX.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0) + #define X_ENABLE_WRITE(STATE) stepperX.toff((STATE)==X_ENABLE_ON ? chopper_timing_X.toff : 0) #define X_ENABLE_READ() stepperX.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(X) @@ -103,9 +115,10 @@ void reset_trinamic_drivers(); // Y Stepper #if AXIS_IS_TMC(Y) extern TMC_CLASS(Y, Y) stepperY; + static constexpr chopper_timing_t chopper_timing_Y = CHOPPER_TIMING_Y; #if ENABLED(SOFTWARE_DRIVER_ENABLE) #define Y_ENABLE_INIT() NOOP - #define Y_ENABLE_WRITE(STATE) stepperY.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0) + #define Y_ENABLE_WRITE(STATE) stepperY.toff((STATE)==Y_ENABLE_ON ? chopper_timing_Y.toff : 0) #define Y_ENABLE_READ() stepperY.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(Y) @@ -116,9 +129,10 @@ void reset_trinamic_drivers(); // Z Stepper #if AXIS_IS_TMC(Z) extern TMC_CLASS(Z, Z) stepperZ; + static constexpr chopper_timing_t chopper_timing_Z = CHOPPER_TIMING_Z; #if ENABLED(SOFTWARE_DRIVER_ENABLE) #define Z_ENABLE_INIT() NOOP - #define Z_ENABLE_WRITE(STATE) stepperZ.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) + #define Z_ENABLE_WRITE(STATE) stepperZ.toff((STATE)==Z_ENABLE_ON ? chopper_timing_Z.toff : 0) #define Z_ENABLE_READ() stepperZ.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(Z) @@ -129,9 +143,13 @@ void reset_trinamic_drivers(); // X2 Stepper #if HAS_X2_ENABLE && AXIS_IS_TMC(X2) extern TMC_CLASS(X2, X) stepperX2; + #ifndef CHOPPER_TIMING_X2 + #define CHOPPER_TIMING_X2 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_X2 = CHOPPER_TIMING_X2; #if ENABLED(SOFTWARE_DRIVER_ENABLE) #define X2_ENABLE_INIT() NOOP - #define X2_ENABLE_WRITE(STATE) stepperX2.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0) + #define X2_ENABLE_WRITE(STATE) stepperX2.toff((STATE)==X_ENABLE_ON ? chopper_timing_X2.toff : 0) #define X2_ENABLE_READ() stepperX2.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(X2) @@ -142,9 +160,13 @@ void reset_trinamic_drivers(); // Y2 Stepper #if HAS_Y2_ENABLE && AXIS_IS_TMC(Y2) extern TMC_CLASS(Y2, Y) stepperY2; + #ifndef CHOPPER_TIMING_Y2 + #define CHOPPER_TIMING_Y2 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_Y2 = CHOPPER_TIMING_Y2; #if ENABLED(SOFTWARE_DRIVER_ENABLE) #define Y2_ENABLE_INIT() NOOP - #define Y2_ENABLE_WRITE(STATE) stepperY2.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0) + #define Y2_ENABLE_WRITE(STATE) stepperY2.toff((STATE)==Y_ENABLE_ON ? chopper_timing_Y2.toff : 0) #define Y2_ENABLE_READ() stepperY2.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(Y2) @@ -155,9 +177,13 @@ void reset_trinamic_drivers(); // Z2 Stepper #if HAS_Z2_ENABLE && AXIS_IS_TMC(Z2) extern TMC_CLASS(Z2, Z) stepperZ2; + #ifndef CHOPPER_TIMING_Z2 + #define CHOPPER_TIMING_Z2 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_Z2 = CHOPPER_TIMING_Z2; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2) #define Z2_ENABLE_INIT() NOOP - #define Z2_ENABLE_WRITE(STATE) stepperZ2.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) + #define Z2_ENABLE_WRITE(STATE) stepperZ2.toff((STATE)==Z_ENABLE_ON ? chopper_timing_Z2.toff : 0) #define Z2_ENABLE_READ() stepperZ2.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(Z2) @@ -168,9 +194,13 @@ void reset_trinamic_drivers(); // Z3 Stepper #if HAS_Z3_ENABLE && AXIS_IS_TMC(Z3) extern TMC_CLASS(Z3, Z) stepperZ3; + #ifndef CHOPPER_TIMING_Z3 + #define CHOPPER_TIMING_Z3 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_Z3 = CHOPPER_TIMING_Z3; #if ENABLED(SOFTWARE_DRIVER_ENABLE) #define Z3_ENABLE_INIT() NOOP - #define Z3_ENABLE_WRITE(STATE) stepperZ3.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) + #define Z3_ENABLE_WRITE(STATE) stepperZ3.toff((STATE)==Z_ENABLE_ON ? chopper_timing_Z3.toff : 0) #define Z3_ENABLE_READ() stepperZ3.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(Z3) @@ -181,9 +211,13 @@ void reset_trinamic_drivers(); // Z4 Stepper #if HAS_Z4_ENABLE && AXIS_IS_TMC(Z4) extern TMC_CLASS(Z4, Z) stepperZ4; + #ifndef CHOPPER_TIMING_Z4 + #define CHOPPER_TIMING_Z4 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_Z4 = CHOPPER_TIMING_Z4; #if ENABLED(SOFTWARE_DRIVER_ENABLE) #define Z4_ENABLE_INIT() NOOP - #define Z4_ENABLE_WRITE(STATE) stepperZ4.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) + #define Z4_ENABLE_WRITE(STATE) stepperZ4.toff((STATE)==Z_ENABLE_ON ? chopper_timing_Z4.toff : 0) #define Z4_ENABLE_READ() stepperZ4.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(Z4) @@ -194,9 +228,13 @@ void reset_trinamic_drivers(); // E0 Stepper #if AXIS_IS_TMC(E0) extern TMC_CLASS_E(0) stepperE0; + #ifndef CHOPPER_TIMING_E0 + #define CHOPPER_TIMING_E0 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_E0 = CHOPPER_TIMING_E0; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0) #define E0_ENABLE_INIT() NOOP - #define E0_ENABLE_WRITE(STATE) stepperE0.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E0_ENABLE_WRITE(STATE) stepperE0.toff((STATE)==E_ENABLE_ON ? chopper_timing_E0.toff : 0) #define E0_ENABLE_READ() stepperE0.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(E0) @@ -207,9 +245,13 @@ void reset_trinamic_drivers(); // E1 Stepper #if AXIS_IS_TMC(E1) extern TMC_CLASS_E(1) stepperE1; + #ifndef CHOPPER_TIMING_E1 + #define CHOPPER_TIMING_E1 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_E1 = CHOPPER_TIMING_E1; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1) #define E1_ENABLE_INIT() NOOP - #define E1_ENABLE_WRITE(STATE) stepperE1.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E1_ENABLE_WRITE(STATE) stepperE1.toff((STATE)==E_ENABLE_ON ? chopper_timing_E1.toff : 0) #define E1_ENABLE_READ() stepperE1.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(E1) @@ -220,9 +262,13 @@ void reset_trinamic_drivers(); // E2 Stepper #if AXIS_IS_TMC(E2) extern TMC_CLASS_E(2) stepperE2; + #ifndef CHOPPER_TIMING_E2 + #define CHOPPER_TIMING_E2 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_E2 = CHOPPER_TIMING_E2; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2) #define E2_ENABLE_INIT() NOOP - #define E2_ENABLE_WRITE(STATE) stepperE2.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E2_ENABLE_WRITE(STATE) stepperE2.toff((STATE)==E_ENABLE_ON ? chopper_timing_E2.toff : 0) #define E2_ENABLE_READ() stepperE2.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(E2) @@ -233,9 +279,13 @@ void reset_trinamic_drivers(); // E3 Stepper #if AXIS_IS_TMC(E3) extern TMC_CLASS_E(3) stepperE3; + #ifndef CHOPPER_TIMING_E3 + #define CHOPPER_TIMING_E3 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_E3 = CHOPPER_TIMING_E3; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3) #define E3_ENABLE_INIT() NOOP - #define E3_ENABLE_WRITE(STATE) stepperE3.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E3_ENABLE_WRITE(STATE) stepperE3.toff((STATE)==E_ENABLE_ON ? chopper_timing_E3.toff : 0) #define E3_ENABLE_READ() stepperE3.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(E3) @@ -246,9 +296,13 @@ void reset_trinamic_drivers(); // E4 Stepper #if AXIS_IS_TMC(E4) extern TMC_CLASS_E(4) stepperE4; + #ifndef CHOPPER_TIMING_E4 + #define CHOPPER_TIMING_E4 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_E4 = CHOPPER_TIMING_E4; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4) #define E4_ENABLE_INIT() NOOP - #define E4_ENABLE_WRITE(STATE) stepperE4.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E4_ENABLE_WRITE(STATE) stepperE4.toff((STATE)==E_ENABLE_ON ? chopper_timing_E4.toff : 0) #define E4_ENABLE_READ() stepperE4.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(E4) @@ -259,9 +313,13 @@ void reset_trinamic_drivers(); // E5 Stepper #if AXIS_IS_TMC(E5) extern TMC_CLASS_E(5) stepperE5; + #ifndef CHOPPER_TIMING_E5 + #define CHOPPER_TIMING_E5 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_E5 = CHOPPER_TIMING_E5; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5) #define E5_ENABLE_INIT() NOOP - #define E5_ENABLE_WRITE(STATE) stepperE5.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E5_ENABLE_WRITE(STATE) stepperE5.toff((STATE)==E_ENABLE_ON ? chopper_timing_E5.toff : 0) #define E5_ENABLE_READ() stepperE5.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(E5) @@ -272,9 +330,13 @@ void reset_trinamic_drivers(); // E6 Stepper #if AXIS_IS_TMC(E6) extern TMC_CLASS_E(6) stepperE6; + #ifndef CHOPPER_TIMING_E6 + #define CHOPPER_TIMING_E6 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_E6 = CHOPPER_TIMING_E6; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E6) #define E6_ENABLE_INIT() NOOP - #define E6_ENABLE_WRITE(STATE) stepperE6.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E6_ENABLE_WRITE(STATE) stepperE6.toff((STATE)==E_ENABLE_ON ? chopper_timing_E6.toff : 0) #define E6_ENABLE_READ() stepperE6.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(E6) @@ -285,9 +347,13 @@ void reset_trinamic_drivers(); // E7 Stepper #if AXIS_IS_TMC(E7) extern TMC_CLASS_E(7) stepperE7; + #ifndef CHOPPER_TIMING_E7 + #define CHOPPER_TIMING_E7 CHOPPER_TIMING_E + #endif + static constexpr chopper_timing_t chopper_timing_E7 = CHOPPER_TIMING_E7; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E7) #define E7_ENABLE_INIT() NOOP - #define E7_ENABLE_WRITE(STATE) stepperE7.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E7_ENABLE_WRITE(STATE) stepperE7.toff((STATE)==E_ENABLE_ON ? chopper_timing_E7.toff : 0) #define E7_ENABLE_READ() stepperE7.isEnabled() #endif #if AXIS_HAS_SQUARE_WAVE(E7) From 4343a96fac83e5fb259e09cf42cb757522e20fa0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 18 Oct 2020 00:20:25 -0500 Subject: [PATCH 0424/1370] ABM Teensy 3.6 build --- Marlin/src/pins/pins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index bd85c44899..8792cd3dfa 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -581,7 +581,7 @@ #elif MB(TEENSY31_32) #include "teensy3/pins_TEENSY31_32.h" // TEENSY31_32 env:teensy31 #elif MB(TEENSY35_36) - #include "teensy3/pins_TEENSY35_36.h" // TEENSY35_36 env:teensy35 + #include "teensy3/pins_TEENSY35_36.h" // TEENSY35_36 env:teensy35 env:teensy36 // // STM32 ARM Cortex-M4F From af956bbb32d2aa149cd13adde8ff64250f3365ae Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sun, 18 Oct 2020 16:53:12 -0400 Subject: [PATCH 0425/1370] Apply home offsets to probing, Z Safe Homing (#19423) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 26 +++++-------- Marlin/src/gcode/calibrate/G28.cpp | 10 ++++- Marlin/src/gcode/geometry/M206_M428.cpp | 12 +++++- Marlin/src/module/motion.h | 4 -- Marlin/src/module/probe.h | 52 +++++++++---------------- 5 files changed, 47 insertions(+), 57 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index fcdab742cf..f387dd9bd8 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -361,32 +361,24 @@ G29_TYPE GcodeSuite::G29() { if (parser.seen('H')) { const int16_t size = (int16_t)parser.value_linear_units(); - probe_position_lf.set( - _MAX(X_CENTER - size / 2, x_min), - _MAX(Y_CENTER - size / 2, y_min) - ); - probe_position_rb.set( - _MIN(probe_position_lf.x + size, x_max), - _MIN(probe_position_lf.y + size, y_max) - ); + probe_position_lf.set(_MAX((X_CENTER) - size / 2, x_min), _MAX((Y_CENTER) - size / 2, y_min)); + probe_position_rb.set(_MIN(probe_position_lf.x + size, x_max), _MIN(probe_position_lf.y + size, y_max)); } else { - probe_position_lf.set( - parser.seenval('L') ? RAW_X_POSITION(parser.value_linear_units()) : x_min, - parser.seenval('F') ? RAW_Y_POSITION(parser.value_linear_units()) : y_min - ); - probe_position_rb.set( - parser.seenval('R') ? RAW_X_POSITION(parser.value_linear_units()) : x_max, - parser.seenval('B') ? RAW_Y_POSITION(parser.value_linear_units()) : y_max - ); + probe_position_lf.set(parser.linearval('L', x_min), parser.linearval('F', y_min)); + probe_position_rb.set(parser.linearval('R', x_max), parser.linearval('B', y_max)); } if (!probe.good_bounds(probe_position_lf, probe_position_rb)) { + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOLNPAIR("G29 L", probe_position_lf.x, " R", probe_position_rb.x, + " F", probe_position_lf.y, " B", probe_position_rb.y); + } SERIAL_ECHOLNPGM("? (L,R,F,B) out of bounds."); G29_RETURN(false); } - // probe at the points of a lattice grid + // Probe at the points of a lattice grid gridSpacing.set((probe_position_rb.x - probe_position_lf.x) / (abl_grid_points.x - 1), (probe_position_rb.y - probe_position_lf.y) / (abl_grid_points.y - 1)); diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 06b9fee257..a91dd82a2a 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -126,7 +126,15 @@ * Move the Z probe (or just the nozzle) to the safe homing point * (Z is already at the right height) */ - destination.set(safe_homing_xy, current_position.z); + constexpr xy_float_t safe_homing_xy = { Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT }; + #if HAS_HOME_OFFSET + xy_float_t okay_homing_xy = safe_homing_xy; + okay_homing_xy -= home_offset; + #else + constexpr xy_float_t okay_homing_xy = safe_homing_xy; + #endif + + destination.set(okay_homing_xy, current_position.z); TERN_(HOMING_Z_WITH_PROBE, destination -= probe.offset_xy); diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index 70cb1e19e5..efb89fbcf2 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -28,6 +28,13 @@ #include "../../module/motion.h" #include "../../lcd/marlinui.h" #include "../../libs/buzzer.h" +#include "../../MarlinCore.h" + +extern const char SP_Y_STR[], SP_Z_STR[]; + +void m206_report() { + SERIAL_ECHOLNPAIR_P(PSTR("M206 X"), home_offset.x, SP_Y_STR, home_offset.y, SP_Z_STR, home_offset.z); +} /** * M206: Set Additional Homing Offset (X Y Z). SCARA aliases T=X, P=Y @@ -46,7 +53,10 @@ void GcodeSuite::M206() { if (parser.seen('P')) set_home_offset(B_AXIS, parser.value_float()); // Psi #endif - report_current_position(); + if (!parser.seen("XYZ")) + m206_report(); + else + report_current_position(); } /** diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 5a8a8e0045..abc59f92b8 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -78,10 +78,6 @@ extern xyz_pos_t cartes; #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() #endif -#if ENABLED(Z_SAFE_HOMING) - constexpr xy_float_t safe_homing_xy = { Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT }; -#endif - /** * Feed rates are often configured with mm/m * but the planner and stepper like mm/s units. diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index f0f56ec191..98e6aff1b5 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -133,53 +133,37 @@ public: #if HAS_BED_PROBE || HAS_LEVELING #if IS_KINEMATIC static constexpr float printable_radius = ( - #if ENABLED(DELTA) - DELTA_PRINTABLE_RADIUS - #elif IS_SCARA - SCARA_PRINTABLE_RADIUS - #endif + TERN_(DELTA, DELTA_PRINTABLE_RADIUS) + TERN_(IS_SCARA, SCARA_PRINTABLE_RADIUS) ); - static inline float probe_radius() { return printable_radius - _MAX(PROBING_MARGIN, HYPOT(offset_xy.x, offset_xy.y)); } #endif static inline float min_x() { - return ( - #if IS_KINEMATIC - (X_CENTER) - probe_radius() - #else - _MAX((X_MIN_BED) + (PROBING_MARGIN_LEFT), (X_MIN_POS) + offset_xy.x) - #endif - ); + return TERN(IS_KINEMATIC, + (X_CENTER) - probe_radius(), + _MAX((X_MIN_BED) + (PROBING_MARGIN_LEFT), (X_MIN_POS) + offset_xy.x) + ) - TERN0(NOZZLE_AS_PROBE, home_offset.x); } static inline float max_x() { - return ( - #if IS_KINEMATIC - (X_CENTER) + probe_radius() - #else - _MIN((X_MAX_BED) - (PROBING_MARGIN_RIGHT), (X_MAX_POS) + offset_xy.x) - #endif - ); + return TERN(IS_KINEMATIC, + (X_CENTER) + probe_radius(), + _MIN((X_MAX_BED) - (PROBING_MARGIN_RIGHT), (X_MAX_POS) + offset_xy.x) + ) - TERN0(NOZZLE_AS_PROBE, home_offset.x); } static inline float min_y() { - return ( - #if IS_KINEMATIC - (Y_CENTER) - probe_radius() - #else - _MAX((Y_MIN_BED) + (PROBING_MARGIN_FRONT), (Y_MIN_POS) + offset_xy.y) - #endif - ); + return TERN(IS_KINEMATIC, + (Y_CENTER) - probe_radius(), + _MAX((Y_MIN_BED) + (PROBING_MARGIN_FRONT), (Y_MIN_POS) + offset_xy.y) + ) - TERN0(NOZZLE_AS_PROBE, home_offset.y); } static inline float max_y() { - return ( - #if IS_KINEMATIC - (Y_CENTER) + probe_radius() - #else - _MIN((Y_MAX_BED) - (PROBING_MARGIN_BACK), (Y_MAX_POS) + offset_xy.y) - #endif - ); + return TERN(IS_KINEMATIC, + (Y_CENTER) + probe_radius(), + _MIN((Y_MAX_BED) - (PROBING_MARGIN_BACK), (Y_MAX_POS) + offset_xy.y) + ) - TERN0(NOZZLE_AS_PROBE, home_offset.y); } #if NEEDS_THREE_PROBE_POINTS From e00745c548b0e82ec72c788fce83b97532af1864 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 19 Oct 2020 00:37:32 -0500 Subject: [PATCH 0426/1370] Document M125 P --- Marlin/src/gcode/feature/pause/M125.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index ed9a393310..b1d76e83ae 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -49,10 +49,13 @@ * position and waits, resuming with a button click or M108. * Without PARK_HEAD_ON_PAUSE the M125 command does nothing. * - * L = override retract length - * X = override X - * Y = override Y - * Z = override Z raise + * L = Override retract Length + * X = Override park position X + * Y = Override park position Y + * Z = Override Z raise + * + * With an LCD menu: + * P = Always show a prompt and await a response */ void GcodeSuite::M125() { // Initial retract before move to filament change position @@ -75,7 +78,8 @@ void GcodeSuite::M125() { TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); - const bool show_lcd = TERN0(HAS_LCD_MENU, parser.seenval('P')); + // If possible, show an LCD prompt with the 'P' flag + const bool show_lcd = TERN0(HAS_LCD_MENU, parser.boolval('P')); if (pause_print(retract, park_point, 0, show_lcd)) { TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); From cf0a817db1c881c44e644e140211a5fb55b591c3 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 19 Oct 2020 21:16:02 +1300 Subject: [PATCH 0427/1370] Ensure A4988 for unspecified driver type (#19798) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 8 +-- Marlin/src/inc/Conditionals_LCD.h | 113 +++++++++++++++++++++++++----- Marlin/src/inc/SanityCheck.h | 54 ++++++++++++++ buildroot/tests/teensy35-tests | 3 +- buildroot/tests/teensy41-tests | 3 +- 5 files changed, 156 insertions(+), 25 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1f6b0db946..60f8368517 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -678,15 +678,15 @@ * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] */ -//#define X_DRIVER_TYPE A4988 -//#define Y_DRIVER_TYPE A4988 -//#define Z_DRIVER_TYPE A4988 +#define X_DRIVER_TYPE A4988 +#define Y_DRIVER_TYPE A4988 +#define Z_DRIVER_TYPE A4988 //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 //#define Z3_DRIVER_TYPE A4988 //#define Z4_DRIVER_TYPE A4988 -//#define E0_DRIVER_TYPE A4988 +#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index cbc75cfb6d..f909112507 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -755,19 +755,7 @@ #define GRID_LOOP(A,B) LOOP_L_N(A, GRID_MAX_POINTS_X) LOOP_L_N(B, GRID_MAX_POINTS_Y) #endif -#ifndef INVERT_X_DIR - #define INVERT_X_DIR false -#endif -#ifndef INVERT_Y_DIR - #define INVERT_Y_DIR false -#endif -#ifndef INVERT_Z_DIR - #define INVERT_Z_DIR false -#endif -#ifndef INVERT_E_DIR - #define INVERT_E_DIR false -#endif - +// Slim menu optimizations #if ENABLED(SLIM_LCD_MENUS) #define BOOT_MARLIN_LOGO_SMALL #endif @@ -786,14 +774,105 @@ #define HAS_CLASSIC_E_JERK 1 #endif -#ifndef SPI_SPEED - #define SPI_SPEED SPI_FULL_SPEED -#endif - #if SERIAL_PORT == -1 || SERIAL_PORT_2 == -1 #define HAS_USB_SERIAL 1 #endif +// Fallback Stepper Driver types +#ifndef X_DRIVER_TYPE + #define X_DRIVER_TYPE A4988 +#endif +#ifndef Y_DRIVER_TYPE + #define Y_DRIVER_TYPE A4988 +#endif +#ifndef Z_DRIVER_TYPE + #define Z_DRIVER_TYPE A4988 +#endif +#if NONE(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) + #undef X2_DRIVER_TYPE +#elif !defined(X2_DRIVER_TYPE) + #define X2_DRIVER_TYPE A4988 +#endif +#if DISABLED(Y_DUAL_STEPPER_DRIVERS) + #undef Y2_DRIVER_TYPE +#elif !defined(Y2_DRIVER_TYPE) + #define Y2_DRIVER_TYPE A4988 +#endif +#if NUM_Z_STEPPER_DRIVERS < 2 + #undef Z2_DRIVER_TYPE +#elif !defined(Z2_DRIVER_TYPE) + #define Z2_DRIVER_TYPE A4988 +#endif +#if NUM_Z_STEPPER_DRIVERS < 3 + #undef Z3_DRIVER_TYPE +#elif !defined(Z3_DRIVER_TYPE) + #define Z3_DRIVER_TYPE A4988 +#endif +#if NUM_Z_STEPPER_DRIVERS < 4 + #undef Z4_DRIVER_TYPE +#elif !defined(Z4_DRIVER_TYPE) + #define Z4_DRIVER_TYPE A4988 +#endif +#if E_STEPPERS < 1 + #undef E0_DRIVER_TYPE +#elif !defined(E0_DRIVER_TYPE) + #define E0_DRIVER_TYPE A4988 +#endif +#if E_STEPPERS < 2 + #undef E1_DRIVER_TYPE +#elif !defined(E1_DRIVER_TYPE) + #define E1_DRIVER_TYPE A4988 +#endif +#if E_STEPPERS < 3 + #undef E2_DRIVER_TYPE +#elif !defined(E2_DRIVER_TYPE) + #define E2_DRIVER_TYPE A4988 +#endif +#if E_STEPPERS < 4 + #undef E3_DRIVER_TYPE +#elif !defined(E3_DRIVER_TYPE) + #define E3_DRIVER_TYPE A4988 +#endif +#if E_STEPPERS < 5 + #undef E4_DRIVER_TYPE +#elif !defined(E4_DRIVER_TYPE) + #define E4_DRIVER_TYPE A4988 +#endif +#if E_STEPPERS < 6 + #undef E5_DRIVER_TYPE +#elif !defined(E5_DRIVER_TYPE) + #define E5_DRIVER_TYPE A4988 +#endif +#if E_STEPPERS < 7 + #undef E6_DRIVER_TYPE +#elif !defined(E6_DRIVER_TYPE) + #define E6_DRIVER_TYPE A4988 +#endif +#if E_STEPPERS < 8 + #undef E7_DRIVER_TYPE +#elif !defined(E7_DRIVER_TYPE) + #define E7_DRIVER_TYPE A4988 +#endif + +// Fallback axis inverting +#ifndef INVERT_X_DIR + #define INVERT_X_DIR false +#endif +#ifndef INVERT_Y_DIR + #define INVERT_Y_DIR false +#endif +#ifndef INVERT_Z_DIR + #define INVERT_Z_DIR false +#endif +#ifndef INVERT_E_DIR + #define INVERT_E_DIR false +#endif + +// Fallback SPI Speed +#ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED +#endif + /** * This setting is also used by M109 when trying to calculate * a ballpark safe margin to prevent wait-forever situation. diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9aea18c2d7..657e055241 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3179,5 +3179,59 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif +/** + * Sanity check for valid stepper driver types + */ +#define _BAD_DRIVER(A) (defined(A##_DRIVER_TYPE) && !_DRIVER_ID(A##_DRIVER_TYPE)) +#if _BAD_DRIVER(X) + #error "X_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(Y) + #error "Y_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(Z) + #error "Z_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(X2) + #error "X2_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(Y2) + #error "Y2_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(Z2) + #error "Z2_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(Z3) + #error "Z3_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(Z4) + #error "Z4_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(E0) + #error "E0_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(E1) + #error "E1_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(E2) + #error "E2_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(E3) + #error "E3_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(E4) + #error "E4_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(E5) + #error "E5_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(E6) + #error "E6_DRIVER_TYPE is not recognized." +#endif +#if _BAD_DRIVER(E7) + #error "E7_DRIVER_TYPE is not recognized." +#endif +#undef _BAD_DRIVER + // Misc. Cleanup #undef _TEST_PWM diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests index c729f212a4..20a0c19726 100755 --- a/buildroot/tests/teensy35-tests +++ b/buildroot/tests/teensy35-tests @@ -112,11 +112,10 @@ exec_test $1 $2 "Teensy 3.5/3.6 COREXZ" # restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable Z_MULTI_ENDSTOPS opt_set NUM_Z_STEPPER_DRIVERS 2 +opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG pins_set ramps/RAMPS X_MAX_PIN -1 opt_add Z2_MAX_PIN 2 -opt_enable USE_XMAX_PLUG exec_test $1 $2 "Dual Z with Dual Z endstops" # Clean up diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests index 8d32d131e9..415d551f55 100644 --- a/buildroot/tests/teensy41-tests +++ b/buildroot/tests/teensy41-tests @@ -113,11 +113,10 @@ exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" # restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable Z_MULTI_ENDSTOPS +opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG opt_set NUM_Z_STEPPER_DRIVERS 2 pins_set ramps/RAMPS X_MAX_PIN -1 opt_add Z2_MAX_PIN 2 -opt_enable USE_XMAX_PLUG exec_test $1 $2 "Dual Z with Dual Z endstops" # Clean up From ff9a27ee9fc862d8592f9bec86cbe7deccc21515 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 19 Oct 2020 04:24:57 -0500 Subject: [PATCH 0428/1370] Use PGM serial strings --- Marlin/src/feature/runout.cpp | 15 +++------ Marlin/src/gcode/gcode.cpp | 4 +-- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 4 +-- Marlin/src/module/tool_change.cpp | 31 ++++++------------- Marlin/src/module/tool_change.h | 2 ++ 6 files changed, 22 insertions(+), 36 deletions(-) diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 71f31f2145..50e18e52ef 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -40,8 +40,9 @@ bool FilamentMonitorBase::enabled = true, #endif #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - //#define DEBUG_TOOLCHANGE_MIGRATION_FEATURE #include "../module/tool_change.h" + #define DEBUG_OUT ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + #include "../core/debug_out.h" #endif #if HAS_FILAMENT_RUNOUT_DISTANCE @@ -74,15 +75,11 @@ void event_filament_runout() { #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) if (migration.in_progress) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration Already In Progress"); - #endif + DEBUG_ECHOLNPGM("Migration Already In Progress"); return; // Action already in progress. Purge triggered repeated runout. } if (migration.automode) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration Starting"); - #endif + DEBUG_ECHOLNPGM("Migration Starting"); if (extruder_migration()) return; } #endif @@ -109,9 +106,7 @@ void event_filament_runout() { if (run_runout_script && ( strstr(FILAMENT_RUNOUT_SCRIPT, "M600") || strstr(FILAMENT_RUNOUT_SCRIPT, "M125") - #if ENABLED(ADVANCED_PAUSE_FEATURE) - || strstr(FILAMENT_RUNOUT_SCRIPT, "M25") - #endif + || TERN0(ADVANCED_PAUSE_FEATURE, strstr(FILAMENT_RUNOUT_SCRIPT, "M25")) ) ) { host_action_paused(false); diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index f2bd81e670..852d389b13 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -754,8 +754,8 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 511: M511(); break; // M511: Unlock Printer #endif #if ENABLED(PASSWORD_CHANGE_GCODE) - case 512: M512(); break; - #endif // M512: Set/Change/Remove Password + case 512: M512(); break; // M512: Set/Change/Remove Password + #endif #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 5e492573e7..109d82b2a2 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -294,7 +294,7 @@ namespace Anycubic { void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { if (str != nullptr) { #if ACDEBUG(AC_SOME) - SERIAL_ECHO("> "); + SERIAL_ECHOPGM("> "); #endif SendtoTFT(str); #if ACDEBUG(AC_SOME) diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 6dcddc5d56..3e0945b227 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -189,12 +189,12 @@ void Touch::touch(touch_control_t *control) { } if (calibration_state == CALIBRATION_SUCCESS) { - SERIAL_ECHOLN("Touch screen calibration completed"); + SERIAL_ECHOLNPGM("Touch screen calibration completed"); SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_X ", calibration.x); SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_Y ", calibration.y); SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x); SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y); - SERIAL_ECHO("TOUCH_ORIENTATION "); if (calibration.orientation == TOUCH_LANDSCAPE) SERIAL_ECHOLN("TOUCH_LANDSCAPE"); else SERIAL_ECHOLN("TOUCH_PORTRAIT"); + SERIAL_ECHOPGM("TOUCH_ORIENTATION "); if (calibration.orientation == TOUCH_LANDSCAPE) SERIAL_ECHOLNPGM("TOUCH_LANDSCAPE"); else SERIAL_ECHOLNPGM("TOUCH_PORTRAIT"); } break; default: break; diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 2c1a1a6017..1cdafe019d 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1209,25 +1209,22 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + #define DEBUG_OUT ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + #include "../core/debug_out.h" + bool extruder_migration() { #if ENABLED(PREVENT_COLD_EXTRUSION) if (thermalManager.targetTooColdToExtrude(active_extruder)) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration Source Too Cold"); - #endif + DEBUG_ECHOLNPGM("Migration Source Too Cold"); return false; } #endif // No auto-migration or specified target? if (!migration.target && active_extruder >= migration.last) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHO_MSG("No Migration Target"); - SERIAL_ECHO_MSG("Target: ", migration.target, - " Last: ", migration.last, - " Active: ", active_extruder); - #endif + DEBUG_ECHO_MSG("No Migration Target"); + DEBUG_ECHO_MSG("Target: ", migration.target, " Last: ", migration.last, " Active: ", active_extruder); migration.automode = false; return false; } @@ -1237,9 +1234,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { uint8_t migration_extruder = active_extruder; if (migration.target) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration using fixed target"); - #endif + DEBUG_ECHOLNPGM("Migration using fixed target"); // Specified target ok? const int16_t t = migration.target - 1; if (t != active_extruder) migration_extruder = t; @@ -1248,16 +1243,12 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { migration_extruder++; if (migration_extruder == active_extruder) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration source matches active"); - #endif + DEBUG_ECHOLNPGM("Migration source matches active"); return false; } // Migration begins - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Beginning migration"); - #endif + DEBUG_ECHOLNPGM("Beginning migration"); migration.in_progress = true; // Prevent runout script planner.synchronize(); @@ -1303,9 +1294,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { planner.synchronize(); planner.set_e_position_mm(current_position.e); // New extruder primed and ready - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration Complete"); - #endif + DEBUG_ECHOLNPGM("Migration Complete"); return true; } diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 38347191d3..0b22f8b6f1 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -24,6 +24,8 @@ #include "../inc/MarlinConfigPre.h" #include "../core/types.h" +//#define DEBUG_TOOLCHANGE_MIGRATION_FEATURE + #if HAS_MULTI_EXTRUDER typedef struct { From a90b90e98d49447417fe51419a9518de0c582bf2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 19 Oct 2020 00:25:51 -0500 Subject: [PATCH 0429/1370] Tweak a host prompt call --- Marlin/src/feature/host_actions.cpp | 12 ++++++++++-- Marlin/src/feature/host_actions.h | 1 + Marlin/src/feature/pause.cpp | 7 ++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index 3012639220..a8b2b51dfc 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -113,12 +113,20 @@ void host_action(PGM_P const pstr, const bool eol) { void host_action_prompt_button(PGM_P const pstr) { host_action_prompt_plus(PSTR("button"), pstr); } void host_action_prompt_end() { host_action_prompt(PSTR("end")); } void host_action_prompt_show() { host_action_prompt(PSTR("show")); } - void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) { - host_action_prompt_begin(reason, pstr); + + void _host_prompt_show(PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) { if (btn1) host_action_prompt_button(btn1); if (btn2) host_action_prompt_button(btn2); host_action_prompt_show(); } + void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) { + host_action_prompt_begin(reason, pstr); + _host_prompt_show(btn1, btn2); + } + void host_prompt_do(const PromptReason reason, PGM_P const pstr, const char extra_char, PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) { + host_action_prompt_begin(reason, pstr, extra_char); + _host_prompt_show(btn1, btn2); + } void filament_load_host_prompt() { const bool disable_to_continue = TERN0(HAS_FILAMENT_SENSOR, runout.filament_ran_out); diff --git a/Marlin/src/feature/host_actions.h b/Marlin/src/feature/host_actions.h index 09eeed23e2..065b59d755 100644 --- a/Marlin/src/feature/host_actions.h +++ b/Marlin/src/feature/host_actions.h @@ -71,6 +71,7 @@ void host_action(PGM_P const pstr, const bool eol=true); void host_action_prompt_end(); void host_action_prompt_show(); void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr); + void host_prompt_do(const PromptReason reason, PGM_P const pstr, const char extra_char, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr); inline void host_prompt_open(const PromptReason reason, PGM_P const pstr, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr) { if (host_prompt_reason == PROMPT_NOT_DEFINED) host_prompt_do(reason, pstr, btn1, btn2); } diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 6f970d1a4c..0a3609b3a1 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -199,17 +199,18 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l first_impatient_beep(max_beep_count); KEEPALIVE_STATE(PAUSED_FOR_USER); + #if ENABLED(HOST_PROMPT_SUPPORT) const char tool = '0' #if NUM_RUNOUT_SENSORS > 1 + active_extruder #endif ; - host_action_prompt_begin(PROMPT_USER_CONTINUE, PSTR("Load Filament T"), tool); - host_action_prompt_button(CONTINUE_STR); - host_action_prompt_show(); + host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Load Filament T"), tool, CONTINUE_STR); #endif + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Load Filament"))); + while (wait_for_user) { impatient_beep(max_beep_count); idle_no_sleep(); From 53a4b8fa335fd8e827dc65a4e347a2d356bdf60c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 19 Oct 2020 20:38:24 -0500 Subject: [PATCH 0430/1370] Misc. cleanup, serial strings --- Marlin/src/HAL/TEENSY40_41/HAL.h | 2 +- Marlin/src/gcode/gcode_d.cpp | 12 ++++++------ Marlin/src/gcode/host/M118.cpp | 6 +++--- Marlin/src/gcode/parser.cpp | 4 ---- Marlin/src/module/settings.cpp | 2 +- Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 3 --- buildroot/tests/teensy41-tests | 2 +- 7 files changed, 12 insertions(+), 19 deletions(-) diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 75c10e9395..e5bc0d5038 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -69,7 +69,7 @@ #elif WITHIN(SERIAL_PORT_2, 0, 8) #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else - #error "SERIAL_PORT_2 must be from -1 to 8. Please update your configuration." + #error "SERIAL_PORT_2 must be from -2 to 8. Please update your configuration." #endif #endif diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 1f38a85b91..99968b625a 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -107,7 +107,7 @@ SERIAL_EOL(); persistentStore.access_finish(); #else - SERIAL_ECHOLN("NO EEPROM"); + SERIAL_ECHOLNPGM("NO EEPROM"); #endif } else { @@ -125,13 +125,13 @@ SERIAL_EOL(); persistentStore.access_finish(); #else - SERIAL_ECHOLN("NO EEPROM"); + SERIAL_ECHOLNPGM("NO EEPROM"); #endif } SERIAL_EOL(); } } break; - #endif + #endif case 4: { // D4 Read / Write PIN // const uint8_t pin = parser.byteval('P'); @@ -173,8 +173,8 @@ } break; case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) - SERIAL_ECHOLN("Disabling heaters and attempting to trigger Watchdog"); - SERIAL_ECHOLN("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")"); + SERIAL_ECHOLNPGM("Disabling heaters and attempting to trigger Watchdog"); + SERIAL_ECHOLNPGM("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")"); thermalManager.disable_all_heaters(); delay(1000); // Allow time to print DISABLE_ISRS(); @@ -183,7 +183,7 @@ // watchdog does not work. DELAY_US(10000000); ENABLE_ISRS(); - SERIAL_ECHOLN("FAILURE: Watchdog did not trigger board reset."); + SERIAL_ECHOLNPGM("FAILURE: Watchdog did not trigger board reset."); } } } diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 3be2902541..06576bb75e 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -57,9 +57,9 @@ void GcodeSuite::M118() { if (WITHIN(port, 0, NUM_SERIAL)) serial_port_index = ( port == 0 ? SERIAL_BOTH - : port == 1 ? SERIAL_PORT - #ifdef SERIAL_PORT_2 - : port == 2 ? SERIAL_PORT_2 + : port == 1 ? 0 + #if HAS_MULTI_SERIAL + : port == 2 ? 1 #endif : SERIAL_PORT ); diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 9c5085b97e..bba64dbbc4 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -28,10 +28,6 @@ #include "../MarlinCore.h" -#if HAS_MULTI_SERIAL - #include "queue.h" -#endif - // Must be declared for allocation and to satisfy the linker // Zero values need no initialization. diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index f5a954f5de..e65ace2e01 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2296,7 +2296,7 @@ void MarlinSettings::postprocess() { #if ENABLED(EEPROM_CHITCHAT) && DISABLED(DISABLE_M503) // Report the EEPROM settings - if (!validating && (DISABLED(EEPROM_BOOT_SILENT) || IsRunning())) report(); + if (!validating && TERN1(EEPROM_BOOT_SILENT, IsRunning())) report(); #endif EEPROM_FINISH(); diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index 3c277233d7..0dd8fb69a5 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -49,9 +49,6 @@ //#define MARLIN_EEPROM_SIZE 0x1000UL // 4KB //#define MARLIN_EEPROM_SIZE (EEPROM_START_ADDRESS + (EEPROM_PAGE_SIZE) * 2UL) -//#define EEPROM_CHITCHAT -//#define DEBUG_EEPROM_READWRITE - // // Limit Switches // diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests index 415d551f55..ab4d87d1af 100644 --- a/buildroot/tests/teensy41-tests +++ b/buildroot/tests/teensy41-tests @@ -57,7 +57,7 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" # exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" # -# Test MAGNETIC_PARKING_EXTRUDER with LCD +# Test MAGNETIC_PARKING_EXTRUDER with no LCD # restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 From c6f17ac01e222bd0dc9869921fde543a9edc110f Mon Sep 17 00:00:00 2001 From: bilsef Date: Tue, 20 Oct 2020 12:35:29 -0700 Subject: [PATCH 0431/1370] Teensy 4.1 Ethernet support (#19801) --- Marlin/Configuration.h | 3 +- Marlin/Configuration_adv.h | 7 + Marlin/src/HAL/TEENSY40_41/HAL.h | 2 + Marlin/src/MarlinCore.cpp | 13 +- Marlin/src/core/serial.h | 9 +- Marlin/src/feature/ethernet.cpp | 175 ++++++++++++++++++ Marlin/src/feature/ethernet.h | 39 ++++ .../src/gcode/feature/network/M552-M554.cpp | 125 +++++++++++++ Marlin/src/gcode/gcode.cpp | 6 + Marlin/src/gcode/gcode.h | 9 + Marlin/src/gcode/queue.cpp | 21 ++- Marlin/src/inc/Conditionals_LCD.h | 3 + Marlin/src/module/settings.cpp | 67 ++++++- buildroot/tests/teensy41-tests | 5 +- platformio.ini | 5 + 15 files changed, 478 insertions(+), 11 deletions(-) create mode 100644 Marlin/src/feature/ethernet.cpp create mode 100644 Marlin/src/feature/ethernet.h create mode 100644 Marlin/src/gcode/feature/network/M552-M554.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 60f8368517..b5dfb43fa2 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -107,7 +107,8 @@ /** * Select a secondary serial port on the board to use for communication with the host. - * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + * Currently Ethernet (-2) is only supported on Teensy 4.1 boards. + * :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7] */ //#define SERIAL_PORT_2 -1 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d6f31658cd..fc77345b9b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3456,6 +3456,13 @@ // Default behavior is limited to Z axis only. #endif +/** + * Ethernet. Use M552 to enable and set the IP address. + */ +#if HAS_ETHERNET + #define MAC_ADDRESS { 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D } // A MAC address unique to your network +#endif + /** * WiFi Support (Espressif ESP32 WiFi) */ diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index e5bc0d5038..1e0043342d 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -66,6 +66,8 @@ #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 #define MYSERIAL1 usbSerial + #elif SERIAL_PORT_2 == -2 + #define MYSERIAL1 ethernet.telnetClient #elif WITHIN(SERIAL_PORT_2, 0, 8) #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 786a847fa6..e395bdccb8 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -77,6 +77,10 @@ #include "lcd/dwin/e3v2/rotary_encoder.h" #endif +#if HAS_ETHERNET + #include "feature/ethernet.h" +#endif + #if ENABLED(IIC_BL24CXX_EEPROM) #include "libs/BL24CXX.h" #endif @@ -713,6 +717,9 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { HAL_idletask(); #endif + // Check network connection + TERN_(HAS_ETHERNET, ethernet.check()); + // Handle Power-Loss Recovery #if ENABLED(POWER_LOSS_RECOVERY) && PIN_EXISTS(POWER_LOSS) if (printJobOngoing()) recovery.outage(); @@ -968,7 +975,7 @@ void setup() { MYSERIAL0.begin(BAUDRATE); uint32_t serial_connect_timeout = millis() + 1000UL; while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - #if HAS_MULTI_SERIAL + #if HAS_MULTI_SERIAL && !HAS_ETHERNET MYSERIAL1.begin(BAUDRATE); serial_connect_timeout = millis() + 1000UL; while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } @@ -1090,6 +1097,10 @@ void setup() { SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults) // This also updates variables in the planner, elsewhere + #if HAS_ETHERNET + SETUP_RUN(ethernet.init()); + #endif + #if HAS_TOUCH_XPT2046 SETUP_RUN(touch.init()); #endif diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index fc830736a5..c3baaf9ada 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -23,6 +23,10 @@ #include "../inc/MarlinConfig.h" +#if HAS_ETHERNET + #include "../feature/ethernet.h" +#endif + /** * Define debug bit-masks */ @@ -56,8 +60,9 @@ extern uint8_t marlin_debug_flags; #define SERIAL_OUT(WHAT, V...) (void)CAT(MYSERIAL,SERIAL_CATCHALL).WHAT(V) #else #define SERIAL_OUT(WHAT, V...) do{ \ - if (!serial_port_index || serial_port_index == SERIAL_BOTH) (void)MYSERIAL0.WHAT(V); \ - if ( serial_port_index) (void)MYSERIAL1.WHAT(V); \ + const bool port2_open = TERN1(HAS_ETHERNET, ethernet.have_telnet_client); \ + if ( serial_port_index == 0 || serial_port_index == SERIAL_BOTH) (void)MYSERIAL0.WHAT(V); \ + if ((serial_port_index == 1 || serial_port_index == SERIAL_BOTH) && port2_open) (void)MYSERIAL1.WHAT(V); \ }while(0) #endif diff --git a/Marlin/src/feature/ethernet.cpp b/Marlin/src/feature/ethernet.cpp new file mode 100644 index 0000000000..ff3ba76b89 --- /dev/null +++ b/Marlin/src/feature/ethernet.cpp @@ -0,0 +1,175 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../inc/MarlinConfigPre.h" + +#if HAS_ETHERNET + +#include "ethernet.h" +#include "../core/serial.h" + +#define DEBUG_OUT ENABLED(DEBUG_ETHERNET) +#include "../core/debug_out.h" + +bool MarlinEthernet::hardware_enabled, // = false + MarlinEthernet::have_telnet_client; // = false + +IPAddress MarlinEthernet::ip, + MarlinEthernet::myDns, + MarlinEthernet::gateway, + MarlinEthernet::subnet; + +EthernetClient MarlinEthernet::telnetClient; // connected client + +MarlinEthernet ethernet; + +EthernetServer server(23); // telnet server + +enum linkStates { UNLINKED, LINKING, LINKED, CONNECTING, CONNECTED, NO_HARDWARE } linkState; + +#ifdef __IMXRT1062__ + + static void teensyMAC(uint8_t * const mac) { + const uint32_t m1 = HW_OCOTP_MAC1, m2 = HW_OCOTP_MAC0; + mac[0] = m1 >> 8; + mac[1] = m1 >> 0; + mac[2] = m2 >> 24; + mac[3] = m2 >> 16; + mac[4] = m2 >> 8; + mac[5] = m2 >> 0; + } + +#else + + byte mac[] = MAC_ADDRESS; + +#endif + +void ethernet_cable_error() { SERIAL_ERROR_MSG("Ethernet cable is not connected."); } + +void MarlinEthernet::init() { + if (!hardware_enabled) return; + + SERIAL_ECHO_MSG("Starting network..."); + + // Init the Ethernet device + #ifdef __IMXRT1062__ + uint8_t mac[6]; + teensyMAC(mac); + #endif + + if (!ip) { + Ethernet.begin(mac); // use DHCP + } + else { + if (!gateway) { + gateway = ip; + gateway[3] = 1; + myDns = gateway; + subnet = IPAddress(255,255,255,0); + } + if (!myDns) myDns = gateway; + if (!subnet) subnet = IPAddress(255,255,255,0); + Ethernet.begin(mac, ip, myDns, gateway, subnet); + } + + // Check for Ethernet hardware present + if (Ethernet.hardwareStatus() == EthernetNoHardware) { + SERIAL_ERROR_MSG("No Ethernet hardware found."); + linkState = NO_HARDWARE; + return; + } + + linkState = UNLINKED; + + if (Ethernet.linkStatus() == LinkOFF) + ethernet_cable_error(); +} + +void MarlinEthernet::check() { + if (!hardware_enabled) return; + + switch (linkState) { + case NO_HARDWARE: + break; + + case UNLINKED: + if (Ethernet.linkStatus() == LinkOFF) break; + + SERIAL_ECHOLNPGM("Ethernet cable connected"); + server.begin(); + linkState = LINKING; + break; + + case LINKING: + if (!Ethernet.localIP()) break; + + SERIAL_ECHOPGM("Successfully started telnet server with IP "); + MYSERIAL0.println(Ethernet.localIP()); + + linkState = LINKED; + break; + + case LINKED: + if (Ethernet.linkStatus() == LinkOFF) { + ethernet_cable_error(); + linkState = UNLINKED; + break; + } + telnetClient = server.accept(); + if (telnetClient) linkState = CONNECTING; + break; + + case CONNECTING: + telnetClient.println("Marlin " SHORT_BUILD_VERSION); + #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) + telnetClient.println( + " Last Updated: " STRING_DISTRIBUTION_DATE + " | Author: " STRING_CONFIG_H_AUTHOR + ); + #endif + telnetClient.println("Compiled: " __DATE__); + + SERIAL_ECHOLNPGM("Client connected"); + have_telnet_client = true; + linkState = CONNECTED; + break; + + case CONNECTED: + if (telnetClient && !telnetClient.connected()) { + SERIAL_ECHOLNPGM("Client disconnected"); + telnetClient.stop(); + have_telnet_client = false; + linkState = LINKED; + } + if (Ethernet.linkStatus() == LinkOFF) { + ethernet_cable_error(); + if (telnetClient) telnetClient.stop(); + linkState = UNLINKED; + } + break; + + default: break; + } +} + +#endif // HAS_ETHERNET diff --git a/Marlin/src/feature/ethernet.h b/Marlin/src/feature/ethernet.h new file mode 100644 index 0000000000..70a58efce7 --- /dev/null +++ b/Marlin/src/feature/ethernet.h @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __IMXRT1062__ + #include +#endif + +// Teensy 4.1 uses internal MAC Address + +class MarlinEthernet { + public: + static bool hardware_enabled, have_telnet_client; + static IPAddress ip, myDns, gateway, subnet; + static EthernetClient telnetClient; + static void init(); + static void check(); +}; + +extern MarlinEthernet ethernet; diff --git a/Marlin/src/gcode/feature/network/M552-M554.cpp b/Marlin/src/gcode/feature/network/M552-M554.cpp new file mode 100644 index 0000000000..d88c38cb5a --- /dev/null +++ b/Marlin/src/gcode/feature/network/M552-M554.cpp @@ -0,0 +1,125 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_ETHERNET + +#include "../../../feature/ethernet.h" +#include "../../../core/serial.h" +#include "../../gcode.h" + +void say_ethernet() { SERIAL_ECHOPGM(" Ethernet "); } + +void ETH0_report() { + say_ethernet(); + SERIAL_ECHO_TERNARY(ethernet.hardware_enabled, "port ", "en", "dis", "abled.\n"); + if (ethernet.hardware_enabled) { + say_ethernet(); + SERIAL_ECHO_TERNARY(ethernet.have_telnet_client, "client ", "en", "dis", "abled.\n"); + } + else + SERIAL_ECHOLNPGM("Send 'M552 S1' to enable."); +} + +void MAC_report() { + uint8_t mac[6]; + if (ethernet.hardware_enabled) { + Ethernet.MACAddress(mac); + SERIAL_ECHOPGM(" MAC: "); + LOOP_L_N(i, 6) { + SERIAL_PRINTF("%02X", mac[i]); + if (i < 5) SERIAL_CHAR(':'); + } + } + SERIAL_EOL(); +} + +// Display current values when the link is active, +// otherwise show the stored values +void ip_report(const uint16_t cmd, PGM_P const post, const IPAddress &ipo) { + SERIAL_CHAR('M'); SERIAL_ECHO(cmd); SERIAL_CHAR(' '); + LOOP_L_N(i, 4) { + SERIAL_ECHO(ipo[i]); + if (i < 3) SERIAL_CHAR('.'); + } + SERIAL_ECHOPGM(" ; "); + SERIAL_ECHOPGM_P(post); + SERIAL_EOL(); +} +void M552_report() { + ip_report(552, PSTR("ip address"), Ethernet.linkStatus() == LinkON ? Ethernet.localIP() : ethernet.ip); +} +void M553_report() { + ip_report(553, PSTR("subnet mask"), Ethernet.linkStatus() == LinkON ? Ethernet.subnetMask() : ethernet.subnet); +} +void M554_report() { + ip_report(554, PSTR("gateway"), Ethernet.linkStatus() == LinkON ? Ethernet.gatewayIP() : ethernet.gateway); +} + +/** + * M552: Set IP address, enable/disable network interface + * + * S0 : disable networking + * S1 : enable networking + * S-1 : reset network interface + * + * Pnnn : Set IP address, 0.0.0.0 means acquire an IP address using DHCP + */ +void GcodeSuite::M552() { + const bool seenP = parser.seenval('P'); + if (seenP) ethernet.ip.fromString(parser.value_string()); + + const bool seenS = parser.seenval('S'); + if (seenS) { + switch (parser.value_int()) { + case -1: + if (ethernet.telnetClient) ethernet.telnetClient.stop(); + ethernet.init(); + break; + case 0: ethernet.hardware_enabled = false; break; + case 1: ethernet.hardware_enabled = true; break; + default: break; + } + } + const bool nopar = !seenS && !seenP; + if (nopar || seenS) ETH0_report(); + if (nopar || seenP) M552_report(); +} + +/** + * M553 Pnnn - Set netmask + */ +void GcodeSuite::M553() { + if (parser.seenval('P')) ethernet.subnet.fromString(parser.value_string()); + M553_report(); +} + +/** + * M554 Pnnn - Set Gateway + */ +void GcodeSuite::M554() { + if (parser.seenval('P')) ethernet.gateway.fromString(parser.value_string()); + M554_report(); +} + +#endif // HAS_ETHERNET diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 852d389b13..e2c70ad3ae 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -766,6 +766,12 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 540: M540(); break; // M540: Set abort on endstop hit for SD printing #endif + #if HAS_ETHERNET + case 552: M552(); break; // M552: Set IP address + case 553: M553(); break; // M553: Set gateway + case 554: M554(); break; // M554: Set netmask + #endif + #if ENABLED(BAUD_RATE_GCODE) case 575: M575(); break; // M575: Set serial baudrate #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 3d745eff89..34df51e517 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -230,6 +230,9 @@ * M512 - Set/Change/Remove Password * M524 - Abort the current SD print job started with M24. (Requires SDSUPPORT) * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires SD_ABORT_ON_ENDSTOP_HIT) + * M552 - Get or set IP address. Enable/disable network interface. (Requires enabled Ethernet port) + * M553 - Get or set IP netmask. (Requires enabled Ethernet port) + * M554 - Get or set IP gateway. (Requires enabled Ethernet port) * M569 - Enable stealthChop on an axis. (Requires at least one _DRIVER_TYPE to be TMC2130/2160/2208/2209/5130/5160) * M600 - Pause for filament change: "M600 X Y Z E L". (Requires ADVANCED_PAUSE_FEATURE) * M603 - Configure filament change: "M603 T U L". (Requires ADVANCED_PAUSE_FEATURE) @@ -778,6 +781,12 @@ private: TERN_(SD_ABORT_ON_ENDSTOP_HIT, static void M540()); + #if HAS_ETHERNET + static void M552(); + static void M553(); + static void M554(); + #endif + TERN_(BAUD_RATE_GCODE, static void M575()); #if ENABLED(ADVANCED_PAUSE_FEATURE) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 4de5056fb2..6139e3e2b8 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -39,6 +39,10 @@ GCodeQueue queue; #include "../feature/leds/printer_event_leds.h" #endif +#if HAS_ETHERNET + #include "../feature/ethernet.h" +#endif + #if ENABLED(BINARY_FILE_TRANSFER) #include "../feature/binary_stream.h" #endif @@ -312,15 +316,24 @@ void GCodeQueue::flush_and_request_resend() { } inline bool serial_data_available() { - return MYSERIAL0.available() || TERN0(HAS_MULTI_SERIAL, MYSERIAL1.available()); + byte data_available = 0; + if (MYSERIAL0.available()) data_available++; + #ifdef SERIAL_PORT_2 + const bool port2_open = TERN1(HAS_ETHERNET, ethernet.have_telnet_client); + if (port2_open && MYSERIAL1.available()) data_available++; + #endif + return data_available > 0; } inline int read_serial(const uint8_t index) { switch (index) { case 0: return MYSERIAL0.read(); - #if HAS_MULTI_SERIAL - case 1: return MYSERIAL1.read(); - #endif + case 1: { + #if HAS_MULTI_SERIAL + const bool port2_open = TERN1(HAS_ETHERNET, ethernet.have_telnet_client); + if (port2_open) return MYSERIAL1.read(); + #endif + } default: return -1; } } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index f909112507..d4cae0b64c 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -777,6 +777,9 @@ #if SERIAL_PORT == -1 || SERIAL_PORT_2 == -1 #define HAS_USB_SERIAL 1 #endif +#if SERIAL_PORT_2 == -2 + #define HAS_ETHERNET 1 +#endif // Fallback Stepper Driver types #ifndef X_DRIVER_TYPE diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index e65ace2e01..9ed78efd63 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -150,8 +150,20 @@ #include "../lcd/tft/touch.h" #endif +#if HAS_ETHERNET + #include "../feature/ethernet.h" +#endif + #pragma pack(push, 1) // No padding between variables +#if HAS_ETHERNET + void ETH0_report(); + void MAC_report(); + void M552_report(); + void M553_report(); + void M554_report(); +#endif + typedef struct { uint16_t X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_stepper_current_t; typedef struct { uint32_t X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_hybrid_threshold_t; typedef struct { int16_t X, Y, Z, X2, Y2, Z2, Z3, Z4; } tmc_sgt_t; @@ -431,6 +443,15 @@ typedef struct SettingsDataStruct { touch_calibration_t touch_calibration; #endif + // Ethernet settings + #if HAS_ETHERNET + bool ethernet_hardware_enabled; // M552 S + uint32_t ethernet_ip, // M552 P + ethernet_dns, + ethernet_gateway, // M553 P + ethernet_subnet; // M554 P + #endif + } SettingsData; //static_assert(sizeof(SettingsData) <= MARLIN_EEPROM_SIZE, "EEPROM too small to contain SettingsData!"); @@ -1384,7 +1405,26 @@ void MarlinSettings::postprocess() { #endif // - // Validate CRC and Data Size + // Ethernet network info + // + #if HAS_ETHERNET + { + _FIELD_TEST(ethernet_hardware_enabled); + const bool ethernet_hardware_enabled = ethernet.hardware_enabled; + const uint32_t ethernet_ip = ethernet.ip, + ethernet_dns = ethernet.myDns, + ethernet_gateway = ethernet.gateway, + ethernet_subnet = ethernet.subnet; + EEPROM_WRITE(ethernet_hardware_enabled); + EEPROM_WRITE(ethernet_ip); + EEPROM_WRITE(ethernet_dns); + EEPROM_WRITE(ethernet_gateway); + EEPROM_WRITE(ethernet_subnet); + } + #endif + + // + // Report final CRC and Data Size // if (!eeprom_error) { const uint16_t eeprom_size = eeprom_index - (EEPROM_OFFSET), @@ -2241,6 +2281,22 @@ void MarlinSettings::postprocess() { EEPROM_READ(touch.calibration); #endif + // + // Ethernet network info + // + #if HAS_ETHERNET + _FIELD_TEST(ethernet_hardware_enabled); + uint32_t ethernet_ip, ethernet_dns, ethernet_gateway, ethernet_subnet; + EEPROM_READ(ethernet.hardware_enabled); + EEPROM_READ(ethernet_ip); ethernet.ip = ethernet_ip; + EEPROM_READ(ethernet_dns); ethernet.myDns = ethernet_dns; + EEPROM_READ(ethernet_gateway); ethernet.gateway = ethernet_gateway; + EEPROM_READ(ethernet_subnet); ethernet.subnet = ethernet_subnet; + #endif + + // + // Validate Final Size and CRC + // eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); if (eeprom_error) { DEBUG_ECHO_START(); @@ -3784,6 +3840,15 @@ void MarlinSettings::reset() { #endif ); #endif + + #if HAS_ETHERNET + CONFIG_ECHO_HEADING("Ethernet:"); + if (!forReplay) { CONFIG_ECHO_START(); ETH0_report(); } + CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); MAC_report(); + CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); M552_report(); + CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); M553_report(); + CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); M554_report(); + #endif } #endif // !DISABLE_M503 diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests index ab4d87d1af..628b295a7f 100644 --- a/buildroot/tests/teensy41-tests +++ b/buildroot/tests/teensy41-tests @@ -63,8 +63,9 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 1 -opt_enable MAGNETIC_PARKING_EXTRUDER -exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" +opt_set SERIAL_PORT_2 -2 +opt_enable EEPROM_SETTINGS MAGNETIC_PARKING_EXTRUDER +exec_test $1 $2 "Ethernet, EEPROM, Magnetic Parking Extruder, No LCD" # # Mixing Extruder diff --git a/platformio.ini b/platformio.ini index 0abb4ac388..9d5f6c5ab8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -284,6 +284,7 @@ EMERGENCY_PARSER = src_filter=+ - IIC_BL24CXX_EEPROM = src_filter=+ HAS_SPI_FLASH = src_filter=+ +HAS_ETHERNET = src_filter=+ HAS_FANMUX = src_filter=+ FILAMENT_WIDTH_SENSOR = src_filter=+ + FWRETRACT = src_filter=+ + @@ -1321,6 +1322,7 @@ platform = espressif32@1.11.2 board = esp32dev build_flags = ${common.build_flags} -DCORE_DEBUG_LEVEL=0 src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet upload_speed = 115200 #upload_port = marlinesp.local #board_build.flash_mode = qio @@ -1332,6 +1334,7 @@ upload_speed = 115200 platform = teensy board = teensy31 src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet # # Teensy 3.5 / 3.6 (ARM Cortex-M4) @@ -1340,11 +1343,13 @@ src_filter = ${common.default_src_filter} + platform = teensy board = teensy35 src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet [env:teensy36] platform = teensy board = teensy36 src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet # # Teensy 4.0 / 4.1 (ARM Cortex-M7) From b1b8161447b0bc835fc563fab64faacef1e90965 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 21 Oct 2020 09:01:46 +1300 Subject: [PATCH 0432/1370] Handle dependent Stepper Driver defaults later (#19820) Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_LCD.h | 52 +++++++++++++------------------ Marlin/src/inc/Conditionals_adv.h | 27 +++++++++++++--- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index d4cae0b64c..b22c608658 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -781,77 +781,67 @@ #define HAS_ETHERNET 1 #endif -// Fallback Stepper Driver types +// Fallback Stepper Driver types that don't depend on Configuration_adv.h #ifndef X_DRIVER_TYPE - #define X_DRIVER_TYPE A4988 + #define X_DRIVER_TYPE A4988 #endif -#ifndef Y_DRIVER_TYPE - #define Y_DRIVER_TYPE A4988 -#endif -#ifndef Z_DRIVER_TYPE - #define Z_DRIVER_TYPE A4988 -#endif -#if NONE(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) - #undef X2_DRIVER_TYPE -#elif !defined(X2_DRIVER_TYPE) +#ifndef X2_DRIVER_TYPE #define X2_DRIVER_TYPE A4988 #endif -#if DISABLED(Y_DUAL_STEPPER_DRIVERS) - #undef Y2_DRIVER_TYPE -#elif !defined(Y2_DRIVER_TYPE) +#ifndef Y_DRIVER_TYPE + #define Y_DRIVER_TYPE A4988 +#endif +#ifndef Y2_DRIVER_TYPE #define Y2_DRIVER_TYPE A4988 #endif -#if NUM_Z_STEPPER_DRIVERS < 2 - #undef Z2_DRIVER_TYPE -#elif !defined(Z2_DRIVER_TYPE) +#ifndef Z_DRIVER_TYPE + #define Z_DRIVER_TYPE A4988 +#endif +#ifndef Z2_DRIVER_TYPE #define Z2_DRIVER_TYPE A4988 #endif -#if NUM_Z_STEPPER_DRIVERS < 3 - #undef Z3_DRIVER_TYPE -#elif !defined(Z3_DRIVER_TYPE) +#ifndef Z3_DRIVER_TYPE #define Z3_DRIVER_TYPE A4988 #endif -#if NUM_Z_STEPPER_DRIVERS < 4 - #undef Z4_DRIVER_TYPE -#elif !defined(Z4_DRIVER_TYPE) +#ifndef Z4_DRIVER_TYPE #define Z4_DRIVER_TYPE A4988 #endif -#if E_STEPPERS < 1 +#if E_STEPPERS <= 0 #undef E0_DRIVER_TYPE #elif !defined(E0_DRIVER_TYPE) #define E0_DRIVER_TYPE A4988 #endif -#if E_STEPPERS < 2 +#if E_STEPPERS <= 1 #undef E1_DRIVER_TYPE #elif !defined(E1_DRIVER_TYPE) #define E1_DRIVER_TYPE A4988 #endif -#if E_STEPPERS < 3 +#if E_STEPPERS <= 2 #undef E2_DRIVER_TYPE #elif !defined(E2_DRIVER_TYPE) #define E2_DRIVER_TYPE A4988 #endif -#if E_STEPPERS < 4 +#if E_STEPPERS <= 3 #undef E3_DRIVER_TYPE #elif !defined(E3_DRIVER_TYPE) #define E3_DRIVER_TYPE A4988 #endif -#if E_STEPPERS < 5 +#if E_STEPPERS <= 4 #undef E4_DRIVER_TYPE #elif !defined(E4_DRIVER_TYPE) #define E4_DRIVER_TYPE A4988 #endif -#if E_STEPPERS < 6 +#if E_STEPPERS <= 5 #undef E5_DRIVER_TYPE #elif !defined(E5_DRIVER_TYPE) #define E5_DRIVER_TYPE A4988 #endif -#if E_STEPPERS < 7 +#if E_STEPPERS <= 6 #undef E6_DRIVER_TYPE #elif !defined(E6_DRIVER_TYPE) #define E6_DRIVER_TYPE A4988 #endif -#if E_STEPPERS < 8 +#if E_STEPPERS <= 7 #undef E7_DRIVER_TYPE #elif !defined(E7_DRIVER_TYPE) #define E7_DRIVER_TYPE A4988 diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 78c014865c..05935be549 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -178,16 +178,35 @@ #define HAS_MOTOR_CURRENT_I2C 1 #endif +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + #undef Z_STEPPER_ALIGN_AMP + #endif + #ifndef Z_STEPPER_ALIGN_AMP + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif +#endif + // Multiple Z steppers #ifndef NUM_Z_STEPPER_DRIVERS #define NUM_Z_STEPPER_DRIVERS 1 #endif -#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - #undef Z_STEPPER_ALIGN_AMP +// Fallback Stepper Driver types that depend on Configuration_adv.h +#if NONE(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) + #undef X2_DRIVER_TYPE #endif -#ifndef Z_STEPPER_ALIGN_AMP - #define Z_STEPPER_ALIGN_AMP 1.0 +#if DISABLED(Y_DUAL_STEPPER_DRIVERS) + #undef Y2_DRIVER_TYPE +#endif +#if NUM_Z_STEPPER_DRIVERS < 2 + #undef Z2_DRIVER_TYPE +#endif +#if NUM_Z_STEPPER_DRIVERS < 3 + #undef Z3_DRIVER_TYPE +#endif +#if NUM_Z_STEPPER_DRIVERS < 4 + #undef Z4_DRIVER_TYPE #endif // From 9f85a159550bd5da92b03db2eee38dfa28cd0e4b Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Tue, 20 Oct 2020 22:06:06 +0200 Subject: [PATCH 0433/1370] Longer3D: LONGER_LK_TFT28 now set by config (#19817) --- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index af81bbebe2..c685570707 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -106,18 +106,6 @@ //#undef Z_MAX_PIN // Uncomment if using ZMAX connector (PE5) #endif -/** - * Note: Alfawise screens use various TFT controllers. Supported screens - * are based on the ILI9341, ILI9328 and ST7798V. Define init sequences for - * other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp - * - * If the screen stays white, disable 'LCD_RESET_PIN' to let the bootloader - * init the screen. - * - * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu - * because Marlin uses the reset as a failsafe to revive a glitchy LCD. - */ - #define TFT_RESET_PIN PC4 // pin 33 #define TFT_BACKLIGHT_PIN PD12 // pin 59 #define FSMC_CS_PIN PD7 // pin 88 = FSMC_NE1 @@ -130,9 +118,6 @@ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 -// Longer/Alfawise TFT -#define LONGER_LK_TFT28 - // Buffer for Color UI #define TFT_BUFFER_SIZE 3200 From 35d75c354e99c99d8c9877f958d932667214edb1 Mon Sep 17 00:00:00 2001 From: uwedamm <46942357+uwedamm@users.noreply.github.com> Date: Wed, 21 Oct 2020 03:26:07 +0200 Subject: [PATCH 0434/1370] Fix G2/G3 P E and Z motion (#19797) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/bedlevel/G26.cpp | 4 ++-- Marlin/src/gcode/motion/G2_G3.cpp | 39 ++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 6123fbf6c8..1c0d8cba8e 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -136,7 +136,7 @@ #define G26_ERR true #if ENABLED(ARC_SUPPORT) - void plan_arc(const xyze_pos_t &cart, const ab_float_t &offset, const uint8_t clockwise); + void plan_arc(const xyze_pos_t&, const ab_float_t&, const bool, const uint8_t); #endif constexpr float g26_e_axis_feedrate = 0.025; @@ -783,7 +783,7 @@ void GcodeSuite::G26() { const feedRate_t old_feedrate = feedrate_mm_s; feedrate_mm_s = PLANNER_XY_FEEDRATE() * 0.1f; - plan_arc(endpoint, arc_offset, false); // Draw a counter-clockwise arc + plan_arc(endpoint, arc_offset, false, 0); // Draw a counter-clockwise arc feedrate_mm_s = old_feedrate; destination = current_position; diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 61d9f1d3a6..c713877a0e 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -52,7 +52,8 @@ void plan_arc( const xyze_pos_t &cart, // Destination position const ab_float_t &offset, // Center of rotation relative to current_position - const uint8_t clockwise // Clockwise? + const bool clockwise, // Clockwise? + const uint8_t circles // Take the scenic route ) { #if ENABLED(CNC_WORKSPACE_PLANES) AxisEnum p_axis, q_axis, l_axis; @@ -74,9 +75,7 @@ void plan_arc( center_Q = current_position[q_axis] - rvec.b, rt_X = cart[p_axis] - center_P, rt_Y = cart[q_axis] - center_Q, - start_L = current_position[l_axis], - linear_travel = cart[l_axis] - start_L, - extruder_travel = cart.e - current_position.e; + start_L = current_position[l_axis]; // CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required. float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y); @@ -90,13 +89,32 @@ void plan_arc( if (clockwise) angular_travel -= RADIANS(360); // Make a circle if the angular rotation is 0 and the target is current position - if (angular_travel == 0 && current_position[p_axis] == cart[p_axis] && current_position[q_axis] == cart[q_axis]) { + if (NEAR_ZERO(angular_travel) && NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis])) { angular_travel = RADIANS(360); #ifdef MIN_ARC_SEGMENTS min_segments = MIN_ARC_SEGMENTS; #endif } + float linear_travel = cart[l_axis] - start_L, + extruder_travel = cart.e - current_position.e; + + // If circling around... + if (ENABLED(ARC_P_CIRCLES) && circles) { + const float total_angular = angular_travel + circles * RADIANS(360), // Total rotation with all circles and remainder + part_per_circle = RADIANS(360) / total_angular, // Each circle's part of the total + l_per_circle = linear_travel * part_per_circle, // L movement per circle + e_per_circle = extruder_travel * part_per_circle; // E movement per circle + xyze_pos_t temp_position = current_position; // for plan_arc to compare to current_position + for (uint16_t n = circles; n--;) { + temp_position.e += e_per_circle; // Destination E axis + temp_position[l_axis] += l_per_circle; // Destination L axis + plan_arc(temp_position, offset, clockwise, 0); // Plan a single whole circle + } + linear_travel = cart[l_axis] - current_position[l_axis]; + extruder_travel = cart.e - current_position.e; + } + const float flat_mm = radius * angular_travel, mm_of_travel = linear_travel ? HYPOT(flat_mm, linear_travel) : ABS(flat_mm); if (mm_of_travel < 0.001f) return; @@ -150,7 +168,7 @@ void plan_arc( linear_per_segment = linear_travel / segments, extruder_per_segment = extruder_travel / segments, sq_theta_per_segment = sq(theta_per_segment), - sin_T = theta_per_segment - sq_theta_per_segment*theta_per_segment/6, + sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6, cos_T = 1 - 0.5f * sq_theta_per_segment; // Small angle approximation // Initialize the linear axis @@ -320,16 +338,15 @@ void GcodeSuite::G2_G3(const bool clockwise) { #if ENABLED(ARC_P_CIRCLES) // P indicates number of circles to do - int8_t circles_to_do = parser.byteval('P'); + const int8_t circles_to_do = parser.byteval('P'); if (!WITHIN(circles_to_do, 0, 100)) SERIAL_ERROR_MSG(STR_ERR_ARC_ARGS); - - while (circles_to_do--) - plan_arc(current_position, arc_offset, clockwise); + #else + constexpr uint8_t circles_to_do = 0; #endif // Send the arc to the planner - plan_arc(destination, arc_offset, clockwise); + plan_arc(destination, arc_offset, clockwise, circles_to_do); reset_stepper_timeout(); } else From e32bdf6a93b37ce1ec913ada29b38506e3d2ca8b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 20 Oct 2020 22:36:22 -0500 Subject: [PATCH 0435/1370] ESP32: i2s_init requires I2S_STEPPER_STREAM --- Marlin/src/HAL/ESP32/HAL.cpp | 2 +- Marlin/src/gcode/feature/password/M510-M512.cpp | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 10 ++++------ Marlin/src/pins/esp32/pins_MRR_ESPE.h | 4 +--- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index 1e00df5177..ead448d78d 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -86,7 +86,7 @@ volatile int numPWMUsed = 0, #endif -void HAL_init() { i2s_init(); } +void HAL_init() { TERN_(I2S_STEPPER_STREAM, i2s_init()); } void HAL_init_board() { diff --git a/Marlin/src/gcode/feature/password/M510-M512.cpp b/Marlin/src/gcode/feature/password/M510-M512.cpp index 79f1da065b..eeb9b1df22 100644 --- a/Marlin/src/gcode/feature/password/M510-M512.cpp +++ b/Marlin/src/gcode/feature/password/M510-M512.cpp @@ -58,7 +58,7 @@ void GcodeSuite::M510() { if (password.is_set && parser.ulongval('P') != password.value) { SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); return; - } + } if (parser.seenval('S')) { password.value_entry = parser.ulongval('S'); diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index 0457b0afca..52837df741 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -42,12 +42,10 @@ // // Disable I2S stepper stream // -#ifdef I2S_STEPPER_STREAM - #undef I2S_STEPPER_STREAM -#endif -#define I2S_WS -1 -#define I2S_BCK -1 -#define I2S_DATA -1 +#undef I2S_STEPPER_STREAM +#undef I2S_WS +#undef I2S_BCK +#undef I2S_DATA // // Limit Switches diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index d22a82d7a4..0c489dd7b4 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -52,12 +52,10 @@ // #undef I2S_STEPPER_STREAM #define I2S_STEPPER_STREAM - -#undef LIN_ADVANCE // Currently, I2S stream does not work with linear advance - #define I2S_WS 26 #define I2S_BCK 25 #define I2S_DATA 27 +#undef LIN_ADVANCE // Currently, I2S stream does not work with linear advance // // Steppers From 29849607931589c5cc9e0541563e72c333a3cc52 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 21 Oct 2020 12:45:27 -0500 Subject: [PATCH 0436/1370] General cleanup, mostly MKS UI (#19825) --- .gitignore | 1 - Marlin/src/inc/Conditionals_LCD.h | 10 +- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 7 +- .../lib/mks_ui/draw_acceleration_settings.cpp | 6 +- .../lib/mks_ui/draw_advance_settings.cpp | 6 +- .../draw_auto_level_offset_settings.cpp | 7 +- .../extui/lib/mks_ui/draw_baby_stepping.cpp | 10 +- .../extui/lib/mks_ui/draw_change_speed.cpp | 11 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 12 +- .../extui/lib/mks_ui/draw_eeprom_settings.cpp | 6 +- .../lib/mks_ui/draw_encoder_settings.cpp | 48 +- .../extui/lib/mks_ui/draw_error_message.cpp | 10 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 14 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 10 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 11 +- .../lib/mks_ui/draw_filament_settings.cpp | 7 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 9 +- .../draw_homing_sensitivity_settings.cpp | 13 +- .../extui/lib/mks_ui/draw_jerk_settings.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 5 +- .../lcd/extui/lib/mks_ui/draw_language.cpp | 6 +- .../extui/lib/mks_ui/draw_level_settings.cpp | 6 +- .../extui/lib/mks_ui/draw_machine_para.cpp | 6 +- .../lib/mks_ui/draw_machine_settings.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 9 +- .../mks_ui/draw_manual_level_pos_settings.cpp | 6 +- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 6 +- .../extui/lib/mks_ui/draw_motor_settings.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 11 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 14 +- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 25 +- .../extui/lib/mks_ui/draw_pause_message.cpp | 4 +- .../extui/lib/mks_ui/draw_pause_position.cpp | 6 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 14 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 9 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 30 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 8 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 12 +- .../extui/lib/mks_ui/draw_step_settings.cpp | 6 +- .../lib/mks_ui/draw_tmc_current_settings.cpp | 7 +- .../mks_ui/draw_tmc_step_mode_settings.cpp | 9 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 58 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 8 +- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 9 +- .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 7 +- .../extui/lib/mks_ui/draw_wifi_settings.cpp | 54 +- .../lcd/extui/lib/mks_ui/draw_wifi_tips.cpp | 7 +- .../src/lcd/extui/lib/mks_ui/irq_overrid.cpp | 3 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 4 +- .../extui/lib/mks_ui/printer_operation.cpp | 28 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 63 +- .../src/lcd/extui/lib/mks_ui/wifiSerial.cpp | 6 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 698 ++++++++---------- Marlin/src/pins/esp32/pins_E4D.h | 30 +- Marlin/src/pins/pins.h | 1 + platformio.ini | 2 - 57 files changed, 616 insertions(+), 783 deletions(-) diff --git a/.gitignore b/.gitignore index c163d339df..1ac1abbe15 100755 --- a/.gitignore +++ b/.gitignore @@ -77,7 +77,6 @@ tags *.out *.app - # # C # diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index b22c608658..6f632aa569 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -341,7 +341,7 @@ #define DOGLCD #define IS_ULTIPANEL 1 #define DELAYED_BACKLIGHT_INIT -#elif ENABLED(TFT_LVGL_UI) +#elif HAS_TFT_LVGL_UI #define DELAYED_BACKLIGHT_INIT #endif @@ -957,16 +957,16 @@ // FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h #if ENABLED(TFT_INTERFACE_FSMC) #define HAS_FSMC_TFT 1 - #if ENABLED(TFT_CLASSIC_UI) + #if TFT_SCALED_DOGLCD #define HAS_FSMC_GRAPHICAL_TFT 1 - #elif ENABLED(TFT_LVGL_UI) + #elif HAS_TFT_LVGL_UI #define HAS_TFT_LVGL_UI_FSMC 1 #endif #elif ENABLED(TFT_INTERFACE_SPI) #define HAS_SPI_TFT 1 - #if ENABLED(TFT_CLASSIC_UI) + #if TFT_SCALED_DOGLCD #define HAS_SPI_GRAPHICAL_TFT 1 - #elif ENABLED(TFT_LVGL_UI) + #elif HAS_TFT_LVGL_UI #define HAS_TFT_LVGL_UI_SPI 1 #endif #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index 34b7427860..68d1993b6f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -23,15 +23,14 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -94,7 +93,7 @@ void lv_draw_about(void) { // Create a label on the image button label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index a30c99dba0..e362e5bff1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -23,11 +23,11 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -383,7 +383,7 @@ void lv_draw_acceleration_settings(void) { //lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); //lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { lv_label_set_text(labelTurnPage, machine_menu.next); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp index 5b1b241716..f81fe6c728 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -23,10 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -302,7 +302,7 @@ void lv_draw_advance_settings(void) { lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp index bb6b45aebe..be2015ed9e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -23,12 +23,11 @@ #if BOTH(HAS_TFT_LVGL_UI, HAS_BED_PROBE) -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" #include "../../../../module/probe.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -172,7 +171,7 @@ void lv_draw_auto_level_offset_settings(void) { } #endif - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); lv_label_set_text(labelXValue, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp index 70564c036c..6891060274 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -23,12 +23,12 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../gcode/queue.h" #include "../../../../gcode/gcode.h" +#include "../../../../inc/MarlinConfig.h" #if HAS_BED_PROBE #include "../../../../module/probe.h" @@ -52,7 +52,7 @@ static float babystep_dist=0.01; static uint8_t has_adjust_z = 0; static void event_handler(lv_obj_t * obj, lv_event_t event) { - char baby_buf[30]={0}; + char baby_buf[30] = { 0 }; switch (obj->mks_obj_id) { case ID_BABY_STEP_X_P: if (event == LV_EVENT_CLICKED) { @@ -259,7 +259,7 @@ void lv_draw_baby_stepping(void) { labelV = lv_label_create(buttonV, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelXI, move_menu.x_add); lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -318,7 +318,7 @@ void disp_baby_step_dist() { lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_1.bin"); lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_1.bin"); } - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if ((int)(100 * babystep_dist) == 1) { lv_label_set_text(labelV, move_menu.step_001mm); lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index c60000afae..f9399b8a45 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -23,16 +23,15 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -239,7 +238,7 @@ void lv_draw_change_speed(void) { labelStep = lv_label_create(buttonStep, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelAdd, speed_menu.add); lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -281,7 +280,7 @@ void disp_speed_step() { lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_percent.bin"); lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_percent.bin"); } - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.stepPrintSpeed == 1) { lv_label_set_text(labelStep, speed_menu.step_1percent); lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -337,7 +336,7 @@ void disp_speed_type() { lv_obj_refresh_ext_draw_pad(buttonExt); lv_obj_refresh_ext_draw_pad(buttonMov); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelMov, speed_menu.move); lv_obj_align(labelMov, buttonMov, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index c848323010..489d8466ce 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -28,20 +28,20 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" #include "../../../../sd/cardreader.h" #include "../../../../gcode/queue.h" #include "../../../../module/temperature.h" #include "../../../../module/planner.h" #include "../../../../gcode/gcode.h" +#include "../../../../inc/MarlinConfig.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -50,7 +50,6 @@ #if ENABLED(PARK_HEAD_ON_PAUSE) #include "../../../../feature/pause.h" #endif -#include "../../../../gcode/gcode.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -58,8 +57,7 @@ static lv_obj_t * tempText1; static lv_obj_t * filament_bar; extern uint8_t sel_id; -extern uint8_t once_flag; -extern uint8_t gcode_preview_over; +extern bool once_flag, gcode_preview_over; extern int upload_result ; extern uint32_t upload_time; extern uint32_t upload_size; @@ -82,7 +80,7 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { lv_draw_printing(); #if ENABLED(SDSUPPORT) - if (gcode_preview_over != 1) { + if (!gcode_preview_over) { char *cur_name; cur_name = strrchr(list_file.file_name[sel_id], '/'); @@ -109,7 +107,7 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { #if ENABLED(POWER_LOSS_RECOVERY) recovery.prepare(); #endif - once_flag = 0; + once_flag = false; } } #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp index ca7d2d1e31..08fdb007fc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp @@ -23,10 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -191,7 +191,7 @@ void lv_draw_eeprom_settings(void) { lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp index 0ad2bb5f1d..1476fe0a74 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp @@ -23,15 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" -#include "../../../../module/stepper/indirection.h" -#include "../../../../feature/tmc_util.h" -#include "../../../../gcode/gcode.h" -#include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" #if BUTTONS_EXIST(EN1, EN2) @@ -59,20 +54,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.encoder_enable) { - gCfgItems.encoder_enable = false; - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - lv_label_set_text(labelEncoderState, machine_menu.disable); - update_spi_flash(); - } - else { - gCfgItems.encoder_enable = true; - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelEncoderState, machine_menu.enable); - update_spi_flash(); - } + gCfgItems.encoder_enable ^= true; + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); + lv_label_set_text(labelEncoderState, machine_menu.enable); + update_spi_flash(); } break; } @@ -110,14 +96,8 @@ void lv_draw_encoder_settings(void) { buttonEncoderState = lv_imgbtn_create(scr, NULL); lv_obj_set_pos(buttonEncoderState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - if (gCfgItems.encoder_enable) { - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); lv_obj_set_event_cb_mks(buttonEncoderState, event_handler, ID_ENCODER_STATE, NULL, 0); @@ -140,14 +120,8 @@ void lv_draw_encoder_settings(void) { lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.encoder_enable) { - lv_label_set_text(labelEncoderState, machine_menu.enable); - lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); - } - else { - lv_label_set_text(labelEncoderState, machine_menu.disable); - lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); - } + lv_label_set_text(labelEncoderState, gCfgItems.encoder_enable ? machine_menu.enable : machine_menu.disable); + lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index c21ee3612c..2a20fe39f4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -23,18 +23,18 @@ #if HAS_TFT_LVGL_UI -#include "SPI_TFT.h" - -#include "lv_conf.h" #include "draw_ui.h" +#include + #include "tft_lvgl_configuration.h" -#include "mks_hardware_test.h" //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" +#include "SPI_TFT.h" +#include "mks_hardware_test.h" +#include "../../../../inc/MarlinConfig.h" static lv_obj_t * scr; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 543202067f..4bd320b640 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -23,16 +23,16 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" #include "../../../../gcode/queue.h" +#include "../../../../inc/MarlinConfig.h" static lv_obj_t * scr; extern lv_group_t* g; @@ -235,7 +235,7 @@ void lv_draw_extrusion(void) { labelSpeed = lv_label_create(buttonSpeed, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelAdd, extrude_menu.in); lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -274,7 +274,7 @@ void disp_ext_type() { if (uiCfg.curSprayerChoose == 1) { lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelType, extrude_menu.ext2); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -282,7 +282,7 @@ void disp_ext_type() { else { lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelType, extrude_menu.ext1); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -303,7 +303,7 @@ void disp_ext_speed() { lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_normal.bin"); } - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.extruSpeed == 20) { lv_label_set_text(labelSpeed, extrude_menu.high); lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -377,7 +377,7 @@ void disp_ext_step() { lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_mm.bin"); } - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.extruStep == 1) { lv_label_set_text(labelStep, extrude_menu.step_1mm); lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index 8cdc14964f..5d7bb335dc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -23,17 +23,17 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" -#include "lv_conf.h" +#include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../../Configuration.h" -#include "draw_ui.h" + #include "../../../../module/temperature.h" #include "../../../../gcode/queue.h" #include "../../../../gcode/gcode.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -209,7 +209,7 @@ void lv_draw_fan(void) { lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelAdd, fan_menu.add); lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 83f9e53677..4c9060c6a2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -23,15 +23,14 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" -#include "../../../../gcode/queue.h" #include "../../../../gcode/gcode.h" #include "../../../../module/motion.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -197,7 +196,7 @@ void lv_draw_filament_change(void) { labelType = lv_label_create(buttoType, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelIn, filament_menu.in); lv_obj_align(labelIn, buttonIn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -228,7 +227,7 @@ void disp_filament_type() { if (uiCfg.curSprayerChoose == 1) { lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext2); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -236,7 +235,7 @@ void disp_filament_type() { else { lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext1); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index 06ab35f3f0..377c44edb7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -23,11 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -279,7 +278,7 @@ void lv_draw_filament_settings(void) { if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 22e05f0e00..c7264f2765 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -23,16 +23,17 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" #include "draw_ready_print.h" #include "draw_set.h" -#include "lv_conf.h" +#include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" + #include "../../../../gcode/queue.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -206,7 +207,7 @@ void lv_draw_home(void) { lv_obj_t *labelOffXY = lv_label_create(buttonOffXY, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelHomeAll, home_menu.home_all); lv_obj_align(labelHomeAll, buttonHomeAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp index d22eeb157e..d819aa01f6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp @@ -19,18 +19,15 @@ * along with this program. If not, see . * */ -#include "../../../../inc/MarlinConfigPre.h" +#include "../../../../inc/MarlinConfig.h" -#if HAS_TFT_LVGL_UI +#if HAS_TFT_LVGL_UI && USE_SENSORLESS -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../module/planner.h" #include "../../../../module/probe.h" - -#if USE_SENSORLESS #include "../../../../module/stepper/indirection.h" #include "../../../../feature/tmc_util.h" @@ -222,7 +219,7 @@ void lv_draw_homing_sensitivity_settings(void) { if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); lv_label_set_text(labelXValue, public_buf_l); @@ -257,6 +254,4 @@ void lv_clear_homing_sensitivity_settings() { lv_obj_del(scr); } -#endif // USE_SENSORLESS - #endif // HAS_TFT_LVGL_UI && USE_SENSORLESS diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp index 8c359233e6..65649b793e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -23,11 +23,11 @@ #if BOTH(HAS_TFT_LVGL_UI, HAS_CLASSIC_JERK) -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -201,7 +201,7 @@ void lv_draw_jerk_settings(void) { } #endif - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); lv_label_set_text(labelXValue, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 902472b884..35ad439c6e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -23,11 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../../Configuration.h" -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 3e4ad06477..4cd2cab72f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -23,14 +23,14 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" #include //static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; @@ -352,7 +352,7 @@ void lv_draw_language(void) { disp_language(gCfgItems.language, SELECTED); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_CN, language_menu.chinese_s); lv_obj_align(label_CN, buttonCN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index 0e0283d32a..2f4fe327fd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -23,10 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -234,7 +234,7 @@ void lv_draw_level_settings(void) { lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp index 9f03793c24..b79e84e8cb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -23,10 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -252,7 +252,7 @@ void lv_draw_machine_para(void) { lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, -2); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp index 0cf5bbaf7f..930d2639bb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -23,10 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -218,7 +218,7 @@ void lv_draw_machine_settings(void) { lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 3d68019b35..f1040ba214 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -23,14 +23,15 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" -#include "lv_conf.h" +#include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" + #include "../../../../gcode/queue.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -253,7 +254,7 @@ void lv_draw_manualLevel(void) { lv_obj_t *label_Point5 = lv_label_create(buttonPoint5, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Point1, leveling_menu.position1); lv_obj_align(label_Point1, buttonPoint1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp index 9b7200b5a9..c27718b31d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -23,11 +23,11 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -384,7 +384,7 @@ void lv_draw_manual_level_pos_settings(void) { if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index e82124f705..6b43b8257b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -23,11 +23,11 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -284,7 +284,7 @@ void lv_draw_max_feedrate_settings(void) { if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { lv_label_set_text(labelTurnPage, machine_menu.next); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp index f6568df143..1766abf061 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -23,10 +23,10 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -310,7 +310,7 @@ void lv_draw_motor_settings(void) { if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index a6c0c0551a..8e8302d707 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -23,14 +23,15 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" -#include "lv_conf.h" +#include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" + #include "../../../../gcode/queue.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -268,7 +269,7 @@ void lv_draw_move_motor(void) { labelV = lv_label_create(buttonV, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelXI, move_menu.x_add); lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -321,7 +322,7 @@ void disp_move_dist() { lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move10.bin"); lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move10.bin"); } - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if ((int)(10 * uiCfg.move_dist) == 1) { lv_label_set_text(labelV, move_menu.step_01mm); lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 4842776304..585c2fa75e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -23,25 +23,23 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" +#include "draw_ui.h" +#include //#include "../../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../../lvgl/src/lv_objx/lv_img.h" //#include "../../lvgl/src/lv_core/lv_disp.h" //#include "../../lvgl/src/lv_core/lv_refr.h" -//#include "../../MarlinCore.h" -#include "draw_ui.h" -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" +#include "../../../../gcode/gcode.h" #include "../../../../gcode/queue.h" +#include "../../../../module/planner.h" +#include "../../../../module/temperature.h" +#include "../../../../inc/MarlinConfig.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif -#include "../../../../gcode/gcode.h" -#include "../../../../module/planner.h" - #if HAS_TRINAMIC_CONFIG #include "../../../../module/stepper/indirection.h" #include "../../../../feature/tmc_util.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index 4a4a0ee130..6ee5ac88c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -23,17 +23,17 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" #include "../../../../module/motion.h" #include "../../../../sd/cardreader.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -135,24 +135,21 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.finish_power_off == 1) { - gCfgItems.finish_power_off = 0; + if (gCfgItems.finish_power_off) { + gCfgItems.finish_power_off = false; lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); lv_label_set_text(label_PowerOff, printing_more_menu.manual); - lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_obj_refresh_ext_draw_pad(label_PowerOff); - update_spi_flash(); } else { - gCfgItems.finish_power_off = 1; + gCfgItems.finish_power_off = true; lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); - lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_obj_refresh_ext_draw_pad(label_PowerOff); - update_spi_flash(); } + lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_refresh_ext_draw_pad(label_PowerOff); + update_spi_flash(); } break; case ID_O_BABY_STEP: @@ -229,7 +226,7 @@ void lv_draw_operation(void) { lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - if (gCfgItems.finish_power_off == 1) { + if (gCfgItems.finish_power_off) { lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); } @@ -362,7 +359,7 @@ void lv_draw_operation(void) { } label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelPreHeat, operation_menu.temp); lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -372,7 +369,7 @@ void lv_draw_operation(void) { lv_label_set_text(label_Fan, operation_menu.fan); lv_obj_align(label_Fan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - if (gCfgItems.finish_power_off == 1) + if (gCfgItems.finish_power_off) lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); else lv_label_set_text(label_PowerOff, printing_more_menu.manual); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp index f7dd2060b8..ec6129446a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp @@ -24,14 +24,14 @@ #if BOTH(HAS_TFT_LVGL_UI, ADVANCED_PAUSE_FEATURE) #include "draw_ui.h" -#include "lv_conf.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" #include "../../../../feature/pause.h" +#include "../../../../inc/MarlinConfig.h" void lv_draw_pause_message(const PauseMessage msg) { switch (msg) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index 9b99971f4f..d1c3a4a795 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -23,11 +23,11 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -163,7 +163,7 @@ void lv_draw_pause_position(void) { lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); lv_label_set_text(labelXValue, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index f58a47b341..b08c9bd947 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -23,15 +23,15 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" +#include "../../../../inc/MarlinConfig.h" static lv_obj_t * scr; extern lv_group_t* g; @@ -275,7 +275,7 @@ void lv_draw_preHeat(void) { lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelAdd, preheat_menu.add); lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -312,7 +312,7 @@ void disp_temp_type() { if (uiCfg.curSprayerChoose == 1) { lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext2); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -320,7 +320,7 @@ void disp_temp_type() { else { lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext1); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -330,7 +330,7 @@ void disp_temp_type() { else { lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_bed.bin"); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_bed.bin"); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.hotbed); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -375,7 +375,7 @@ void disp_step_heat() { lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_degree.bin"); } - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.stepHeat == 1) { lv_label_set_text(labelStep, preheat_menu.step_1c); lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index e84bb395e0..d92943a37c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -23,14 +23,15 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" -#include "lv_conf.h" +#include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" + #include "../../../../sd/cardreader.h" +#include "../../../../inc/MarlinConfig.h" static lv_obj_t * scr; extern lv_group_t* g; @@ -270,7 +271,7 @@ void lv_draw_print_file(void) { //lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); /* - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelPageUp, tool_menu.preheat); lv_obj_align(labelPageUp, buttonPageUp, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 0b49bf4ab7..6481061800 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -23,23 +23,25 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" +#include "../../../../MarlinCore.h" // for marlin_state #include "../../../../module/temperature.h" #include "../../../../module/motion.h" #include "../../../../sd/cardreader.h" #include "../../../../gcode/queue.h" #include "../../../../gcode/gcode.h" +#include "../../../../inc/MarlinConfig.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif + #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) #include "../../../marlinui.h" #endif @@ -60,11 +62,9 @@ static lv_obj_t * buttonPause, *buttonOperat, *buttonStop; #define ID_STOP 2 #define ID_OPTION 3 -uint8_t once_flag = 0; +bool once_flag; // = false +extern bool flash_preview_begin, default_preview_flg, gcode_preview_over; extern uint32_t To_pre_view; -extern uint8_t flash_preview_begin; -extern uint8_t default_preview_flg; -extern uint8_t gcode_preview_over; static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { @@ -73,7 +73,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - if (gcode_preview_over != 1) { + if (!gcode_preview_over) { if (uiCfg.print_state == WORKING) { // #if ENABLED(PARK_HEAD_ON_PAUSE) // queue.inject_P(PSTR("M25 P\nM24")); @@ -117,7 +117,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - if (gcode_preview_over != 1) { + if (!gcode_preview_over) { lv_clear_printing(); lv_draw_dialog(DIALOG_TYPE_STOP); } @@ -128,7 +128,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - if (gcode_preview_over != 1) { + if (!gcode_preview_over) { lv_clear_printing(); lv_draw_operation(); } @@ -290,7 +290,7 @@ void lv_draw_printing(void) { labelStop = lv_label_create(buttonStop, NULL); labelOperat = lv_label_create(buttonOperat, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelPause, uiCfg.print_state == WORKING ? printing_menu.pause : printing_menu.resume); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 20, 0); @@ -378,7 +378,7 @@ void setProBarRate() { int rate; volatile long long rate_tmp_r; - if (gCfgItems.from_flash_pic != 1) { + if (!gCfgItems.from_flash_pic) { #if ENABLED(SDSUPPORT) rate_tmp_r = (long long)card.getIndex() * 100; #endif @@ -405,15 +405,15 @@ void setProBarRate() { if (once_flag == 0) { stop_print_time(); - flash_preview_begin = 0; - default_preview_flg = 0; + flash_preview_begin = false; + default_preview_flg = false; lv_clear_printing(); lv_draw_dialog(DIALOG_TYPE_FINISH_PRINT); - once_flag = 1; + once_flag = true; #if HAS_SUICIDE - if (gCfgItems.finish_power_off == 1) { + if (gCfgItems.finish_power_off) { gcode.process_subcommands_now_P(PSTR("M1001")); queue.inject_P(PSTR("M81")); marlin_state = MF_RUNNING; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 54ffdca64a..276e8fb551 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -25,7 +25,7 @@ #include "draw_ready_print.h" #include "draw_tool.h" -#include "lv_conf.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" @@ -36,8 +36,8 @@ #include -#include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" +#include "../../../../inc/MarlinConfig.h" #include @@ -186,7 +186,7 @@ void lv_draw_ready_print(void) { //lv_obj_t *label_print = lv_label_create(buttonPrint, NULL); //lv_obj_t *label_set = lv_label_create(buttonSet, NULL); lv_obj_t *label_tool = lv_label_create(buttonTool, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { //lv_label_set_text(label_print, main_menu.print); //lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); @@ -279,7 +279,7 @@ void lv_draw_ready_print(void) { lv_obj_t *label_print = lv_label_create(buttonPrint, NULL); lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_print, main_menu.print); lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index 6c10713d8a..d23fe40182 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -23,18 +23,20 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" #include "draw_ready_print.h" #include "draw_set.h" -#include "lv_conf.h" +#include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" -#include "../../../../gcode/queue.h" + #include "pic_manager.h" +#include "../../../../gcode/queue.h" +#include "../../../../inc/MarlinConfig.h" + static lv_obj_t * scr; extern lv_group_t* g; @@ -331,7 +333,7 @@ void lv_draw_set(void) { #endif lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_EepromSet, set_menu.eepromSet); lv_obj_align(label_EepromSet, buttonEepromSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index baad23f9ae..ff45fba461 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -23,11 +23,11 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -278,7 +278,7 @@ void lv_draw_step_settings(void) { if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { lv_label_set_text(labelTurnPage, machine_menu.next); lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index 10aa7badff..b19048f1c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -23,13 +23,12 @@ #if BOTH(HAS_TFT_LVGL_UI, HAS_TRINAMIC_CONFIG) -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" #include "../../../../module/stepper/indirection.h" #include "../../../../feature/tmc_util.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -310,7 +309,7 @@ void lv_draw_tmc_current_settings(void) { lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { //#if AXIS_IS_TMC(E1) lv_label_set_text(labelTurnPage, machine_menu.next); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 3e014a781c..04087f632e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -23,15 +23,13 @@ #if BOTH(HAS_TFT_LVGL_UI, HAS_STEALTHCHOP) -#include "lv_conf.h" #include "draw_ui.h" +#include -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" #include "../../../../module/stepper/indirection.h" #include "../../../../feature/tmc_util.h" #include "../../../../gcode/gcode.h" -#include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -232,7 +230,6 @@ void lv_draw_tmc_step_mode_settings(void) { lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL; //#endif - labelXState = NULL; buttonXState = NULL; labelYState = NULL; @@ -493,7 +490,7 @@ void lv_draw_tmc_step_mode_settings(void) { lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { lv_label_set_text(labelXText, machine_menu.X_StepMode); lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 3681b1b2d6..b6ef6e64da 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -23,16 +23,16 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" #include "draw_ui.h" +#include //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" //#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../MarlinCore.h" #include "../../../../gcode/queue.h" #include "../../../../module/temperature.h" +#include "../../../../inc/MarlinConfig.h" extern lv_group_t * g; static lv_obj_t * scr; @@ -236,7 +236,7 @@ void lv_draw_tool(void) { //lv_obj_t *label_More = lv_label_create(buttonMore, NULL); lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { + if (gCfgItems.multiple_language) { lv_label_set_text(labelPreHeat, tool_menu.preheat); lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 519fae2f39..1f21136668 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -34,10 +34,11 @@ #include -#include "../../../../MarlinCore.h" +#include "../../../../MarlinCore.h" // for marlin_state #include "../../../../sd/cardreader.h" #include "../../../../module/motion.h" #include "../../../../module/planner.h" +#include "../../../../inc/MarlinConfig.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -57,15 +58,13 @@ num_key_value_state value; keyboard_value_state keyboard_value; uint32_t To_pre_view; -uint8_t gcode_preview_over; -uint8_t flash_preview_begin; -uint8_t default_preview_flg; +bool gcode_preview_over, flash_preview_begin, default_preview_flg; uint32_t size = 809; uint16_t row; uint8_t temperature_change_frequency; uint8_t printing_rate_update_flag; -extern uint8_t once_flag; +extern bool once_flag; extern uint8_t sel_id; extern uint8_t public_buf[512]; extern uint8_t bmp_public_buf[17 * 1024]; @@ -116,10 +115,10 @@ void gCfgItems_init() { gCfgItems.language = LANG_PORTUGUESE; #endif gCfgItems.leveling_mode = 0; - gCfgItems.from_flash_pic = 0; + gCfgItems.from_flash_pic = false; gCfgItems.curFilesize = 0; - gCfgItems.finish_power_off = 0; - gCfgItems.pause_reprint = 0; + gCfgItems.finish_power_off = false; + gCfgItems.pause_reprint = false; gCfgItems.pausePosX = -1; gCfgItems.pausePosY = -1; gCfgItems.pausePosZ = 5; @@ -407,7 +406,6 @@ void tft_style_init() { lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF); lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF); lv_bar_style_indic.body.border.color = lv_color_hex3(0xADF); - } #define MAX_TITLE_LEN 28 @@ -609,14 +607,14 @@ char *creat_title_text() { pre_read_cnt = (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); To_pre_view = pre_read_cnt; - gcode_preview_over = 1; - gCfgItems.from_flash_pic = 1; + gcode_preview_over = true; + gCfgItems.from_flash_pic = true; update_spi_flash(); } else { - gcode_preview_over = 0; - default_preview_flg = 1; - gCfgItems.from_flash_pic = 0; + gcode_preview_over = false; + default_preview_flg = true; + gCfgItems.from_flash_pic = false; update_spi_flash(); } card.closefile(); @@ -681,8 +679,8 @@ char *creat_title_text() { size = 809; row = 0; - gcode_preview_over = 0; - //flash_preview_begin = 1; + gcode_preview_over = false; + //flash_preview_begin = true; card.closefile(); @@ -696,7 +694,7 @@ char *creat_title_text() { //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); srcfp = file; mksReprint.mks_printer_state = MKS_WORKING; - once_flag = 0; + once_flag = false; } } */ @@ -727,7 +725,7 @@ char *creat_title_text() { #endif card.startFileprint(); TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = 0; + once_flag = false; } return; } @@ -813,8 +811,8 @@ char *creat_title_text() { size = 809; row = 0; - gcode_preview_over = 0; - //flash_preview_begin = 1; + gcode_preview_over = false; + //flash_preview_begin = true; card.closefile(); @@ -828,7 +826,7 @@ char *creat_title_text() { //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); srcfp = file; mksReprint.mks_printer_state = MKS_WORKING; - once_flag = 0; + once_flag = false; } } */ @@ -859,7 +857,7 @@ char *creat_title_text() { #endif card.startFileprint(); TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = 0; + once_flag = false; } return; } @@ -894,17 +892,17 @@ char *creat_title_text() { } void disp_pre_gcode(int xpos_pixel, int ypos_pixel) { - if (gcode_preview_over == 1) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel); + if (gcode_preview_over) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel); #if HAS_BAK_VIEW_IN_FLASH - if (flash_preview_begin == 1) { - flash_preview_begin = 0; + if (flash_preview_begin) { + flash_preview_begin = false; Draw_default_preview(xpos_pixel, ypos_pixel, 1); } #endif #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH - if (default_preview_flg == 1) { + if (default_preview_flg) { Draw_default_preview(xpos_pixel, ypos_pixel, 0); - default_preview_flg = 0; + default_preview_flg = false; } #endif } @@ -971,7 +969,7 @@ void GUI_RefreshPage() { } if (printing_rate_update_flag || marlin_state == MF_SD_COMPLETE) { printing_rate_update_flag = 0; - if (gcode_preview_over == 0) setProBarRate(); + if (!gcode_preview_over) setProBarRate(); } break; @@ -1359,8 +1357,8 @@ void draw_return_ui() { lv_draw_print_file(); break; case PRINTING_UI: - if (gCfgItems.from_flash_pic == 1) flash_preview_begin = 1; - else default_preview_flg = 1; + if (gCfgItems.from_flash_pic) flash_preview_begin = true; + else default_preview_flg = true; lv_draw_printing(); break; case MOVE_MOTOR_UI: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 51782688c0..00faedac4e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -174,12 +174,12 @@ extern char public_buf_l[30]; typedef struct { uint32_t spi_flash_flag; uint8_t disp_rotation_180; - uint8_t multiple_language; + bool multiple_language; uint8_t language; uint8_t leveling_mode; - uint8_t from_flash_pic; - uint8_t finish_power_off; - uint8_t pause_reprint; + bool from_flash_pic; + bool finish_power_off; + bool pause_reprint; uint8_t wifi_mode_sel; uint8_t fileSysType; uint8_t wifi_type; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index 9cf4555b25..ce158ef7fb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -23,13 +23,12 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" -#include "draw_ui.h" +#include +#include "tft_lvgl_configuration.h" #if ENABLED(USE_WIFI_FUNCTION) -#include "../../../../../Configuration.h" -#include "../../../../module/temperature.h" +#include "draw_ui.h" extern lv_group_t * g; static lv_obj_t *scr, *wifi_name_text, *wifi_key_text, *wifi_state_text, *wifi_ip_text; @@ -135,7 +134,7 @@ void lv_draw_wifi(void) { label_Reconnect = lv_label_create(buttonReconnect, NULL); } - if (gCfgItems.multiple_language !=0) { + if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp index 14fd63f852..2680194868 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -23,13 +23,12 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" -#include "draw_ui.h" +#include +#include "tft_lvgl_configuration.h" #if ENABLED(USE_WIFI_FUNCTION) -#include "../../../../../Configuration.h" -#include "../../../../module/temperature.h" +#include "draw_ui.h" #define NAME_BTN_X 330 #define NAME_BTN_Y 48 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp index 86733470dd..81a5f5c3be 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp @@ -23,13 +23,12 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" -#include "draw_ui.h" +#include +#include "tft_lvgl_configuration.h" #if ENABLED(USE_WIFI_FUNCTION) -#include "../../../../../Configuration.h" -#include "../../../../module/planner.h" +#include "draw_ui.h" extern lv_group_t * g; static lv_obj_t *scr, *labelModelValue = NULL, *buttonModelValue = NULL, *labelCloudValue = NULL; @@ -48,8 +47,8 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - lv_clear_wifi_settings(); - draw_return_ui(); + lv_clear_wifi_settings(); + draw_return_ui(); } break; case ID_WIFI_MODEL: @@ -57,18 +56,18 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.wifi_mode_sel == AP_MODEL) { - gCfgItems.wifi_mode_sel = STA_MODEL; - lv_label_set_text(labelModelValue, WIFI_STA_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); - update_spi_flash(); - } - else{ - gCfgItems.wifi_mode_sel = AP_MODEL; - lv_label_set_text(labelModelValue, WIFI_AP_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); - update_spi_flash(); - } + if (gCfgItems.wifi_mode_sel == AP_MODEL) { + gCfgItems.wifi_mode_sel = STA_MODEL; + lv_label_set_text(labelModelValue, WIFI_STA_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + update_spi_flash(); + } + else { + gCfgItems.wifi_mode_sel = AP_MODEL; + lv_label_set_text(labelModelValue, WIFI_AP_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + update_spi_flash(); + } } break; case ID_WIFI_NAME: @@ -76,9 +75,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - keyboard_value=wifiName; - lv_clear_wifi_settings(); - lv_draw_keyboard(); + keyboard_value = wifiName; + lv_clear_wifi_settings(); + lv_draw_keyboard(); } break; case ID_WIFI_PASSWORD: @@ -87,8 +86,8 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { keyboard_value=wifiPassWord; - lv_clear_wifi_settings(); - lv_draw_keyboard(); + lv_clear_wifi_settings(); + lv_draw_keyboard(); } break; case ID_WIFI_CLOUD: @@ -115,8 +114,8 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - lv_clear_wifi_settings(); - lv_draw_dialog(DIALOG_WIFI_CONFIG_TIPS); + lv_clear_wifi_settings(); + lv_draw_dialog(DIALOG_WIFI_CONFIG_TIPS); } break; } @@ -211,7 +210,7 @@ void lv_draw_wifi_settings(void) { lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); } - lv_obj_set_event_cb_mks(buttonCloudValue, event_handler,ID_WIFI_CLOUD, NULL,0); + lv_obj_set_event_cb_mks(buttonCloudValue, event_handler,ID_WIFI_CLOUD, NULL,0); lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_REL, &tft_style_label_rel); lv_btn_set_layout(buttonCloudValue, LV_LAYOUT_OFF); @@ -240,7 +239,7 @@ void lv_draw_wifi_settings(void) { lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language !=0) { + if (gCfgItems.multiple_language) { if (gCfgItems.wifi_mode_sel == AP_MODEL) { lv_label_set_text(labelModelValue, WIFI_AP_TEXT); lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); @@ -295,5 +294,4 @@ void lv_clear_wifi_settings() { } #endif // USE_WIFI_FUNCTION - #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp index 50fa0aaf99..059656bbb5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp @@ -23,13 +23,12 @@ #if HAS_TFT_LVGL_UI -#include "lv_conf.h" -#include "draw_ui.h" +#include +#include "tft_lvgl_configuration.h" #if ENABLED(USE_WIFI_FUNCTION) -#include "../../../../../Configuration.h" -#include "../../../../module/temperature.h" +#include "draw_ui.h" static lv_obj_t * scr; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp index cf64571292..b9c7ccd9e6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp @@ -23,10 +23,11 @@ #if HAS_TFT_LVGL_UI -#include "draw_ui.h" +#include "tft_lvgl_configuration.h" #if ENABLED(USE_WIFI_FUNCTION) +#include "draw_ui.h" #include "wifiSerial.h" #include diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 07ac563802..70c48f5c8e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -206,11 +206,11 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_return.bin", #if ENABLED(USE_WIFI_FUNCTION) - //wifi screen + // wifi screen "bmp_wifi.bin", #endif - //babystep screen + // babystep screen "bmp_baby_move0_01.bin", "bmp_baby_move0_05.bin", "bmp_baby_move0_1.bin" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 2b6f5f89f6..e6c30b30f8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -23,24 +23,22 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" - -#include "lv_conf.h" #include "draw_ui.h" +#include + +#include "../../../../gcode/gcode.h" #include "../../../../module/temperature.h" +#include "../../../../module/planner.h" #include "../../../../module/motion.h" #include "../../../../sd/cardreader.h" -#include "../../../../gcode/queue.h" +#include "../../../../inc/MarlinConfig.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif -#include "../../../../gcode/gcode.h" -#include "../../../../module/planner.h" - extern uint32_t To_pre_view; -extern uint8_t flash_preview_begin, default_preview_flg, gcode_preview_over; +extern bool flash_preview_begin, default_preview_flg, gcode_preview_over; void printer_state_polling() { if (uiCfg.print_state == PAUSING) { @@ -76,7 +74,7 @@ void printer_state_polling() { // #if ENABLED(POWER_LOSS_RECOVERY) // if (recovery.enabled) recovery.save(true); // #endif - gCfgItems.pause_reprint = 1; + gCfgItems.pause_reprint = true; update_spi_flash(); } #endif @@ -105,7 +103,7 @@ void printer_state_polling() { uiCfg.print_state = WORKING; start_print_time(); - gCfgItems.pause_reprint = 0; + gCfgItems.pause_reprint = false; update_spi_flash(); } } @@ -137,7 +135,7 @@ void printer_state_polling() { ); gcode.process_subcommands_now(public_buf_m); - if ((gCfgItems.pause_reprint) == 1 && (gCfgItems.pausePosZ != (float)-1)) { + if (gCfgItems.pause_reprint && gCfgItems.pausePosZ != -1.0f) { gcode.process_subcommands_now_P(PSTR("G91")); ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); @@ -148,7 +146,7 @@ void printer_state_polling() { uiCfg.print_state = WORKING; start_print_time(); - gCfgItems.pause_reprint = 0; + gCfgItems.pause_reprint = false; update_spi_flash(); } #endif @@ -240,10 +238,10 @@ void filament_check() { stop_print_time(); uiCfg.print_state = PAUSING; - if (gCfgItems.from_flash_pic == 1) - flash_preview_begin = 1; + if (gCfgItems.from_flash_pic) + flash_preview_begin = true; else - default_preview_flg = 1; + default_preview_flg = true; lv_draw_printing(); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index f74ed3c798..6143037c2b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -72,7 +72,7 @@ lv_group_t* g; uint16_t DeviceCode = 0x9488; extern uint8_t sel_id; -extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg; +extern bool flash_preview_begin, default_preview_flg, gcode_preview_over; uint8_t bmp_public_buf[17 * 1024]; @@ -80,9 +80,8 @@ void SysTick_Callback() { lv_tick_inc(1); print_time_count(); #if ENABLED(USE_WIFI_FUNCTION) - if (tips_disp.timer == TIPS_TIMER_START) { + if (tips_disp.timer == TIPS_TIMER_START) tips_disp.timer_count++; - } #endif if (uiCfg.filament_loading_time_flg == 1) { uiCfg.filament_loading_time_cnt++; @@ -193,10 +192,10 @@ void tft_lvgl_init() { #if ENABLED(POWER_LOSS_RECOVERY) recovery.load(); if (recovery.valid()) { - if (gCfgItems.from_flash_pic == 1) - flash_preview_begin = 1; + if (gCfgItems.from_flash_pic) + flash_preview_begin = true; else - default_preview_flg = 1; + default_preview_flg = true; uiCfg.print_state = REPRINTING; @@ -408,36 +407,32 @@ lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { } void lv_encoder_pin_init() { - #if 1 // HAS_DIGITAL_BUTTONS + #if BUTTON_EXISTS(EN1) + SET_INPUT_PULLUP(BTN_EN1); + #endif + #if BUTTON_EXISTS(EN2) + SET_INPUT_PULLUP(BTN_EN2); + #endif + #if BUTTON_EXISTS(ENC) + SET_INPUT_PULLUP(BTN_ENC); + #endif - #if BUTTON_EXISTS(EN1) - SET_INPUT_PULLUP(BTN_EN1); - #endif - #if BUTTON_EXISTS(EN2) - SET_INPUT_PULLUP(BTN_EN2); - #endif - #if BUTTON_EXISTS(ENC) - SET_INPUT_PULLUP(BTN_ENC); - #endif + #if BUTTON_EXISTS(BACK) + SET_INPUT_PULLUP(BTN_BACK); + #endif - #if BUTTON_EXISTS(BACK) - SET_INPUT_PULLUP(BTN_BACK); - #endif - - #if BUTTON_EXISTS(UP) - SET_INPUT(BTN_UP); - #endif - #if BUTTON_EXISTS(DWN) - SET_INPUT(BTN_DWN); - #endif - #if BUTTON_EXISTS(LFT) - SET_INPUT(BTN_LFT); - #endif - #if BUTTON_EXISTS(RT) - SET_INPUT(BTN_RT); - #endif - - #endif // HAS_DIGITAL_BUTTONS + #if BUTTON_EXISTS(UP) + SET_INPUT(BTN_UP); + #endif + #if BUTTON_EXISTS(DWN) + SET_INPUT(BTN_DWN); + #endif + #if BUTTON_EXISTS(LFT) + SET_INPUT(BTN_LFT); + #endif + #if BUTTON_EXISTS(RT) + SET_INPUT(BTN_RT); + #endif } #if 1 // HAS_ENCODER_ACTION diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp index 01c86ad7cb..6e15deffae 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp @@ -23,11 +23,13 @@ #if HAS_TFT_LVGL_UI -#include "draw_ui.h" -#include "wifiSerial.h" +#include "tft_lvgl_configuration.h" #if ENABLED(USE_WIFI_FUNCTION) +#include "draw_ui.h" +#include "wifiSerial.h" + #include #include #include diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index e4fb4ece03..bfc23f238c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -66,14 +66,13 @@ int cfg_cloud_flag = 0; extern PRINT_TIME print_time; -char wifi_firm_ver[20] = {0}; +char wifi_firm_ver[20] = { 0 }; WIFI_GCODE_BUFFER espGcodeFifo; extern uint8_t pause_resum; uint8_t wifi_connect_flg = 0; extern volatile uint8_t get_temp_flag; - #define WIFI_MODE 2 #define WIFI_AP_MODE 3 @@ -96,7 +95,7 @@ extern uint32_t wifi_loop_cycle; volatile TRANSFER_STATE esp_state; uint8_t left_to_send = 0; -uint8_t left_to_save[96] = {0}; +uint8_t left_to_save[96] = { 0 }; volatile WIFI_DMA_RCV_FIFO wifiDmaRcvFifo; @@ -109,53 +108,44 @@ extern WIFI_PARA wifiPara; extern IP_PARA ipPara; extern CLOUD_PARA cloud_para; -extern uint8_t once_flag; -extern uint8_t flash_preview_begin; -extern uint8_t default_preview_flg; -extern uint8_t gcode_preview_over; +extern bool once_flag, flash_preview_begin, default_preview_flg, gcode_preview_over; extern uint8_t bmp_public_buf[17 * 1024]; -uint32_t getWifiTick() { +uint32_t getWifiTick() { return millis(); } -uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { - if (lastTick <= curTick) { +uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { + if (lastTick <= curTick) return (curTick - lastTick) * TICK_CYCLE; - } - else { + else return (0xFFFFFFFF - lastTick + curTick) * TICK_CYCLE; - } } void wifi_delay(int n) { uint32_t begin = getWifiTick(); uint32_t end = begin; - - while (getWifiTickDiff(begin, end) < (uint32_t)n) { + while (getWifiTickDiff(begin, end) < (uint32_t)n) end = getWifiTick(); - } } void wifi_reset() { uint32_t start, now; start = getWifiTick(); now = start; - WIFI_RESET(); - while (getWifiTickDiff(start, now) < 500) { + WIFI_RESET(); + while (getWifiTickDiff(start, now) < 500) now = getWifiTick(); - } - WIFI_SET(); + WIFI_SET(); } void mount_file_sys(uint8_t disk_type) { if (disk_type == FILE_SYS_SD) { - card.mount(); + TERN_(SDSUPPORT, card.mount()); } else if (disk_type == FILE_SYS_USB) { - } } @@ -201,7 +191,6 @@ static void dma_init() { memset(wifiDmaRcvFifo.bufferAddr[0], 0, 1024 * TRANS_RCV_FIFO_BLOCK_NUM); wifiDmaRcvFifo.read_cur = 0; wifiDmaRcvFifo.write_cur = 0; - } static void wifi_deInit() { @@ -300,7 +289,7 @@ void esp_port_begin(uint8_t interrupt) { WIFISERIAL.begin(WIFI_BAUDRATE); uint32_t serial_connect_timeout = millis() + 1000UL; while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - //for(uint8_t i=0;i<100;i++)WIFISERIAL.write(0x33); + //for (uint8_t i=0;i<100;i++)WIFISERIAL.write(0x33); #endif } else { @@ -310,7 +299,7 @@ void esp_port_begin(uint8_t interrupt) { WIFISERIAL.begin(WIFI_UPLOAD_BAUDRATE); uint32_t serial_connect_timeout = millis() + 1000UL; while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - //for(uint16_t i=0;i<65535;i++);//WIFISERIAL.write(0x33); + //for (uint16_t i=0;i<65535;i++);//WIFISERIAL.write(0x33); #endif dma_init(); } @@ -318,16 +307,14 @@ void esp_port_begin(uint8_t interrupt) { #if ENABLED(USE_WIFI_FUNCTION) -int raw_send_to_wifi(char *buf, int len) { - if (buf == 0 || len <= 0) return 0; + int raw_send_to_wifi(char *buf, int len) { + if (buf == 0 || len <= 0) return 0; + for (int i = 0; i < len; i++) + WIFISERIAL.write(*(buf + i)); + return len; + } - for (int i = 0; i < len; i++) - WIFISERIAL.write(*(buf + i)); - - return len; -} - -#endif // USE_WIFI_FUNCTION +#endif void wifi_ret_ack() {} @@ -342,7 +329,7 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { int apLen = strlen((const char *)uiCfg.wifi_name); int keyLen = strlen((const char *)uiCfg.wifi_key); - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); index_to_wifi = 0; buf_to_wifi[data_offset] = gCfgItems.wifi_mode_sel; @@ -361,18 +348,17 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); index_to_wifi = 0; - } else if (type == WIFI_TRANS_INF) { if (len > (int)(sizeof(buf_to_wifi) - index_to_wifi - 5)) { - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); index_to_wifi = 0; return 0; } - if (len > 0) { + if (len > 0) { memcpy(&buf_to_wifi[4 + index_to_wifi], buf, len); index_to_wifi += len; @@ -380,12 +366,12 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { return 0; if (buf_to_wifi[index_to_wifi + 3] == '\n') { - //mask "wait" "busy" "X:" + // mask "wait" "busy" "X:" if (((buf_to_wifi[4] == 'w') && (buf_to_wifi[5] == 'a') && (buf_to_wifi[6] == 'i') && (buf_to_wifi[7] == 't') ) || ((buf_to_wifi[4] == 'b') && (buf_to_wifi[5] == 'u') && (buf_to_wifi[6] == 's') && (buf_to_wifi[7] == 'y') ) || ((buf_to_wifi[4] == 'X') && (buf_to_wifi[5] == ':') ) - ) { - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ) { + ZERO(buf_to_wifi); index_to_wifi = 0; return 0; } @@ -398,13 +384,13 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - } + ZERO(buf_to_wifi); + index_to_wifi = 0; + } } } else if (type == WIFI_EXCEP_INF) { - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); buf_to_wifi[0] = wifi_ret_head; buf_to_wifi[1] = type; @@ -415,25 +401,21 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { raw_send_to_wifi(buf_to_wifi, 6); - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); index_to_wifi = 0; } else if (type == WIFI_CLOUD_CFG) { int data_offset = 4; int urlLen = strlen((const char *)uiCfg.cloud_hostUrl); - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); index_to_wifi = 0; - if (gCfgItems.cloud_enable == true) - buf_to_wifi[data_offset] = 0x0A; - else - buf_to_wifi[data_offset] = 0x05; - + buf_to_wifi[data_offset] = gCfgItems.cloud_enable ? 0x0A : 0x05; buf_to_wifi[data_offset + 1] = urlLen; strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.cloud_hostUrl, urlLen); - buf_to_wifi[data_offset + urlLen + 2] = uiCfg.cloud_port & 0xFF; - buf_to_wifi[data_offset + urlLen + 3] = (uiCfg.cloud_port >> 8) & 0xFF; + buf_to_wifi[data_offset + urlLen + 2] = uiCfg.cloud_port & 0xFF; + buf_to_wifi[data_offset + urlLen + 3] = (uiCfg.cloud_port >> 8) & 0xFF; buf_to_wifi[data_offset + urlLen + 4] = wifi_ret_tail; index_to_wifi = urlLen + 4; @@ -445,11 +427,11 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); index_to_wifi = 0; } else if (type == WIFI_CLOUD_UNBIND) { - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); buf_to_wifi[0] = wifi_ret_head; buf_to_wifi[1] = type; @@ -459,7 +441,7 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { raw_send_to_wifi(buf_to_wifi, 5); - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + ZERO(buf_to_wifi); index_to_wifi = 0; } } @@ -467,22 +449,16 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { int send_to_wifi(char *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } -void set_cur_file_sys(int fileType) { - gCfgItems.fileSysType = fileType; -} +void set_cur_file_sys(int fileType) { gCfgItems.fileSysType = fileType; } void get_file_list(char *path) { - if ( path == 0) { - return; - } + if (!path) return; if (gCfgItems.fileSysType == FILE_SYS_SD) { - #if ENABLED(SDSUPPORT) - card.mount(); - #endif + TERN_(SDSUPPORT, card.mount()); } else if (gCfgItems.fileSysType == FILE_SYS_USB) { - //udisk + // udisk } Explore_Disk(path, 0); } @@ -502,24 +478,19 @@ FILE_WRITER file_writer; int32_t lastFragment = 0; -char lastBinaryCmd[50] = {0}; +char lastBinaryCmd[50] = { 0 }; int total_write = 0; -char binary_head[2] = {0, 0}; +char binary_head[2] = { 0, 0 }; unsigned char binary_data_len = 0; int write_to_file(char *buf, int len) { - int i; - int res; - - for (i = 0; i < len; i++) { + for (int i = 0; i < len; i++) { file_writer.write_buf[file_writer.write_index++] = buf[i]; if (file_writer.write_index >= 512) { - res = card.write(file_writer.write_buf, file_writer.write_index); - if (res == -1) { - return -1; - } - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + int res = card.write(file_writer.write_buf, file_writer.write_index); + if (res == -1) return -1; + ZERO(file_writer.write_buf); file_writer.write_index = 0; } } @@ -536,7 +507,7 @@ int write_to_file(char *buf, int len) { #define ESP_TYPE_WIFI_LIST (uint8_t)0x4 -uint8_t esp_msg_buf[UART_RX_BUFFER_SIZE] = {0}; +uint8_t esp_msg_buf[UART_RX_BUFFER_SIZE] = { 0 }; uint16_t esp_msg_index = 0; typedef struct { @@ -564,93 +535,71 @@ static int cut_msg_head(uint8_t *msg, uint16_t msgLen, uint16_t cutLen) { return msgLen - cutLen; } +uint8_t Explore_Disk(char* path , uint8_t recu_level) { + char tmp[200]; + char Fstream[200]; -uint8_t Explore_Disk (char* path , uint8_t recu_level) { - char tmp[200]; - char Fstream[200]; - - if (path == 0)return 0; + if (!path) return 0; const uint8_t fileCnt = card.get_num_Files(); for (uint8_t i = 0; i < fileCnt; i++) { - const uint16_t nr = - #if ENABLED(SDCARD_RATHERRECENTFIRST) && DISABLED(SDCARD_SORT_ALPHA) - fileCnt - 1 - - #endif - i; + card.getfilename_sorted(SD_ORDER(i, fileCnt)); - #if ENABLED(SDCARD_SORT_ALPHA) - card.getfilename_sorted(nr); - #else - card.getfilename_sorted(nr); - #endif - memset(tmp, 0, sizeof(tmp)); - //if (card.longFilename[0] == 0) - strcpy(tmp, card.filename); - //else - //strcpy(tmp, card.longFilename); + //if (card.longFilename[0] == 0) + strcpy(tmp, card.filename); + //else + // strcpy(tmp, card.longFilename); - memset(Fstream, 0, sizeof(Fstream)); - strcpy(Fstream, tmp); + ZERO(Fstream); + strcpy(Fstream, tmp); - if (card.flag.filenameIsDir && (recu_level <= 10)) { - strcat(Fstream, ".DIR\r\n"); - send_to_wifi(Fstream, strlen(Fstream)); - } - else { - strcat(Fstream, "\r\n"); - send_to_wifi(Fstream, strlen(Fstream)); - } + if (card.flag.filenameIsDir && recu_level <= 10) + strcat(Fstream, ".DIR"); + + strcat(Fstream, "\r\n"); + send_to_wifi(Fstream, strlen(Fstream)); } return fileCnt; } static void wifi_gcode_exec(uint8_t *cmd_line) { - int8_t tempBuf[100] = {0}; + int8_t tempBuf[100] = { 0 }; uint8_t *tmpStr = 0; int cmd_value; volatile int print_rate; - if ((strstr((char *)&cmd_line[0], "\n") != 0) && ((strstr((char *)&cmd_line[0], "G") != 0) || (strstr((char *)&cmd_line[0], "M") != 0) || (strstr((char *)&cmd_line[0], "T") != 0) )) { + if (strchr((char *)cmd_line, '\n') && (strchr((char *)cmd_line, 'G') || strchr((char *)cmd_line, 'M') || strchr((char *)cmd_line, 'T'))) { + tmpStr = (uint8_t *)strchr((char *)cmd_line, '\n'); + if (tmpStr) *tmpStr = '\0'; - tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "\n"); + tmpStr = (uint8_t *)strchr((char *)cmd_line, '\r'); + if (tmpStr) *tmpStr = '\0'; + + tmpStr = (uint8_t *)strchr((char *)cmd_line, '*'); + if (tmpStr) *tmpStr = '\0'; + + tmpStr = (uint8_t *)strchr((char *)cmd_line, 'M'); if (tmpStr) { - *tmpStr = '\0'; - } - tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "\r"); - if (tmpStr) { - *tmpStr = '\0'; - } - tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "*"); - if (tmpStr) { - *tmpStr = '\0'; - } - tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "M"); - if ( tmpStr) { cmd_value = atoi((char *)(tmpStr + 1)); - tmpStr = (uint8_t *)strstr((char *)tmpStr, " "); + tmpStr = (uint8_t *)strchr((char *)tmpStr, ' '); switch (cmd_value) { - case 20: //print sd / udisk file + case 20: // M20: Print SD / µdisk file if (uiCfg.print_state == IDLE) { int index = 0; if (tmpStr == 0) { gCfgItems.fileSysType = FILE_SYS_SD; send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); - get_file_list((char *)"0:/"); - send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); break; } - while (tmpStr[index] == ' ') - index++; + while (tmpStr[index] == ' ') index++; if (gCfgItems.wifi_type == ESP_WIFI) { char *path = (char *)tempBuf; @@ -658,13 +607,11 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if (strlen((char *)&tmpStr[index]) < 80) { send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); - if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { + if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) gCfgItems.fileSysType = FILE_SYS_SD; - - } - else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { + else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) gCfgItems.fileSysType = FILE_SYS_USB; - } + strcpy((char *)path, (char *)&tmpStr[index]); get_file_list(path); send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); @@ -683,49 +630,37 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { /*select the file*/ if (uiCfg.print_state == IDLE) { int index = 0; - while (tmpStr[index] == ' ') - index++; + while (tmpStr[index] == ' ') index++; if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { if (strlen((char *)&tmpStr[index]) < 80) { - memset(list_file.file_name[sel_id], 0, sizeof(list_file.file_name[sel_id])); + ZERO(list_file.file_name[sel_id]); if (gCfgItems.wifi_type == ESP_WIFI) { - if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { + if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) gCfgItems.fileSysType = FILE_SYS_SD; - - } - else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { + else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) gCfgItems.fileSysType = FILE_SYS_USB; - } - else { - if (tmpStr[index] != '/') - strcat((char *)list_file.file_name[0], "/"); - } + else if (tmpStr[index] != '/') + strcat((char *)list_file.file_name[0], "/"); strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); } - else { + else strcpy(list_file.file_name[sel_id], (char *)&tmpStr[index]); - } char *cur_name=strrchr(list_file.file_name[sel_id],'/'); card.openFileRead(cur_name); - if (card.isFileOpen()) { + if (card.isFileOpen()) send_to_wifi((char *)"File selected\r\n", strlen("File selected\r\n")); - - } else { send_to_wifi((char *)"file.open failed\r\n", strlen("file.open failed\r\n")); strcpy(list_file.file_name[sel_id], "notValid"); } send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - } - - } } break; @@ -740,60 +675,57 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { uiCfg.print_state = WORKING; lv_draw_printing(); - if (gcode_preview_over != 1) { - #if ENABLED(SDSUPPORT) - char *cur_name; - cur_name=strrchr(list_file.file_name[sel_id],'/'); + #if ENABLED(SDSUPPORT) + if (!gcode_preview_over) { + char *cur_name = strrchr(list_file.file_name[sel_id], '/'); - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0]= planner.flow_percentage[0]*0.01; - if (EXTRUDERS==2) { - planner.flow_percentage[1] = 100; - planner.e_factor[1]= planner.flow_percentage[1]*0.01; - } - card.startFileprint(); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.prepare(); - #endif - once_flag = 0; - } - #endif + card.endFilePrint(); - } + SdFile file; + SdFile *curDir; + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_READ)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + update_spi_flash(); + } + card.openFileRead(cur_name); + if (card.isFileOpen()) { + //saved_feedrate_percentage = feedrate_percentage; + feedrate_percentage = 100; + planner.flow_percentage[0] = 100; + planner.e_factor[0] = planner.flow_percentage[0] * 0.01f; + #if EXTRUDERS == 2 + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01f; + #endif + card.startFileprint(); + TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); + once_flag = false; + } + } + #endif } else if (uiCfg.print_state == PAUSED) { uiCfg.print_state = RESUMING; clear_cur_ui(); start_print_time(); - if (gCfgItems.from_flash_pic==1) - flash_preview_begin = 1; + if (gCfgItems.from_flash_pic) + flash_preview_begin = true; else - default_preview_flg = 1; - lv_draw_printing(); + default_preview_flg = true; + lv_draw_printing(); } else if (uiCfg.print_state == REPRINTING) { uiCfg.print_state = REPRINTED; clear_cur_ui(); start_print_time(); - if (gCfgItems.from_flash_pic==1) - flash_preview_begin = 1; + if (gCfgItems.from_flash_pic) + flash_preview_begin = true; else - default_preview_flg = 1; + default_preview_flg = true; lv_draw_printing(); } } @@ -808,13 +740,13 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { clear_cur_ui(); #if ENABLED(SDSUPPORT) - card.pauseSDPrint(); - uiCfg.print_state = PAUSING; - #endif - if (gCfgItems.from_flash_pic==1) - flash_preview_begin = 1; + card.pauseSDPrint(); + uiCfg.print_state = PAUSING; + #endif + if (gCfgItems.from_flash_pic) + flash_preview_begin = true; else - default_preview_flg = 1; + default_preview_flg = true; lv_draw_printing(); send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); } @@ -826,9 +758,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { stop_print_time(); clear_cur_ui(); - #if ENABLED(SDSUPPORT) - uiCfg.print_state = IDLE; - card.flag.abort_sd_printing = true; + #if ENABLED(SDSUPPORT) + uiCfg.print_state = IDLE; + card.flag.abort_sd_printing = true; #endif lv_draw_ready_print(); @@ -841,15 +773,10 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { /*report print rate*/ if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)|| (uiCfg.print_state == REPRINTING)) { print_rate = uiCfg.totalSend; - - memset((char *)tempBuf, 0, sizeof(tempBuf)); - + ZERO(tempBuf); sprintf((char *)tempBuf, "M27 %d\r\n", print_rate); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - } - break; case 28: @@ -857,112 +784,105 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if (uiCfg.print_state == IDLE) { int index = 0; - while (tmpStr[index] == ' ') - index++; + while (tmpStr[index] == ' ') index++; if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); if (gCfgItems.fileSysType == FILE_SYS_SD) { - memset(tempBuf, 0, sizeof(tempBuf)); + ZERO(tempBuf); sprintf((char *)tempBuf, "%s", file_writer.saveFileName); } else if (gCfgItems.fileSysType == FILE_SYS_USB) { - memset(tempBuf, 0, sizeof(tempBuf)); + ZERO(tempBuf); sprintf((char *)tempBuf, "%s", (char *)file_writer.saveFileName); } mount_file_sys(gCfgItems.fileSysType); #if ENABLED(SDSUPPORT) - char *cur_name=strrchr(list_file.file_name[sel_id],'/'); - card.openFileWrite(cur_name); - if (card.isFileOpen()) { - memset(file_writer.saveFileName, 0, sizeof(file_writer.saveFileName)); - strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); - memset(tempBuf, 0, sizeof(tempBuf)); - sprintf((char *)tempBuf, "Writing to file: %s\r\n", (char *)file_writer.saveFileName); - wifi_ret_ack(); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - - total_write = 0; - wifi_link_state = WIFI_WAIT_TRANS_START; - - } - else{ - wifi_link_state = WIFI_CONNECTED; - clear_cur_ui(); - lv_draw_dialog(DIALOG_TRANSFER_NO_DEVICE); - } + char *cur_name = strrchr(list_file.file_name[sel_id], '/'); + card.openFileWrite(cur_name); + if (card.isFileOpen()) { + ZERO(file_writer.saveFileName); + strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); + ZERO(tempBuf); + sprintf((char *)tempBuf, "Writing to file: %s\r\n", (char *)file_writer.saveFileName); + wifi_ret_ack(); + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + total_write = 0; + wifi_link_state = WIFI_WAIT_TRANS_START; + } + else { + wifi_link_state = WIFI_CONNECTED; + clear_cur_ui(); + lv_draw_dialog(DIALOG_TRANSFER_NO_DEVICE); + } #endif - } - } break; case 105: case 991: - memset(tempBuf, 0, sizeof(tempBuf)); + ZERO(tempBuf); if (cmd_value == 105) { send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); sprintf((char *)tempBuf,"T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n", - (float)thermalManager.temp_hotend[0].celsius,(float)thermalManager.temp_hotend[0].target, + (float)thermalManager.temp_hotend[0].celsius, (float)thermalManager.temp_hotend[0].target, #if HAS_HEATED_BED - (float)thermalManager.temp_bed.celsius,(float)thermalManager.temp_bed.target, + (float)thermalManager.temp_bed.celsius, (float)thermalManager.temp_bed.target, #else - (float)0,(float)0, + 0.0f, 0.0f, #endif - (float)thermalManager.temp_hotend[0].celsius,(float)thermalManager.temp_hotend[0].target, + (float)thermalManager.temp_hotend[0].celsius, (float)thermalManager.temp_hotend[0].target, #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER - (float)thermalManager.temp_hotend[1].celsius,(float)thermalManager.temp_hotend[1].target + (float)thermalManager.temp_hotend[1].celsius, (float)thermalManager.temp_hotend[1].target #else - (float)0,(float)0 + 0.0f, 0.0f #endif ); } else { sprintf((char *)tempBuf,"T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n", - (int)thermalManager.temp_hotend[0].celsius,(int)thermalManager.temp_hotend[0].target, + (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, #if HAS_HEATED_BED - (int)thermalManager.temp_bed.celsius,(int)thermalManager.temp_bed.target, + (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target, #else - 0,0, - #endif - (int)thermalManager.temp_hotend[0].celsius,(int)thermalManager.temp_hotend[0].target, - #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER - (int)thermalManager.temp_hotend[1].celsius,(int)thermalManager.temp_hotend[1].target - #else - 0,0 + 0, 0, #endif + (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, + #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target + #else + 0, 0 + #endif ); } send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - queue.enqueue_one_P(PSTR("M105")); - break; + case 992: if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { - memset(tempBuf,0,sizeof(tempBuf)); + ZERO(tempBuf); sprintf((char *)tempBuf, "M992 %d%d:%d%d:%d%d\r\n", print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); wifi_ret_ack(); send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); } - break; + case 994: if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { - memset(tempBuf,0,sizeof(tempBuf)); - if (strlen((char *)list_file.file_name[sel_id]) > (100-1)) { - return; - } + ZERO(tempBuf); + if (strlen((char *)list_file.file_name[sel_id]) > (100 - 1)) return; sprintf((char *)tempBuf, "M994 %s;%d\n", list_file.file_name[sel_id],(int)gCfgItems.curFilesize); wifi_ret_ack(); send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); } break; + case 997: if (uiCfg.print_state == IDLE) { wifi_ret_ack(); @@ -985,18 +905,17 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { case 998: if (uiCfg.print_state == IDLE) { - if (atoi((char *)tmpStr) == 0) { + int v = atoi((char *)tmpStr); + if (v == 0) set_cur_file_sys(0); - } - else if (atoi((char *)tmpStr) == 1) { + else if (v == 1) set_cur_file_sys(1); - } wifi_ret_ack(); } break; case 115: - memset(tempBuf,0,sizeof(tempBuf)); + ZERO(tempBuf); send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); send_to_wifi((char *)"FIRMWARE_NAME:Robin_nano\r\n", strlen("FIRMWARE_NAME:Robin_nano\r\n")); break; @@ -1004,55 +923,50 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { default: strcat((char *)cmd_line, "\n"); - uint32_t left; + if (espGcodeFifo.wait_tick > 5) { + uint32_t left; + if (espGcodeFifo.r > espGcodeFifo.w) + left = espGcodeFifo.r - espGcodeFifo.w - 1; + else + left = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; - if (espGcodeFifo.wait_tick> 5) { - - if (espGcodeFifo.r > espGcodeFifo.w) - left = espGcodeFifo.r - espGcodeFifo.w - 1; - else - left = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; - if (left >= strlen((const char *)cmd_line)) { - uint32_t index = 0; - while (index < strlen((const char *)cmd_line)) { - espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; - espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; - index++; - } + if (left >= strlen((const char *)cmd_line)) { + uint32_t index = 0; + while (index < strlen((const char *)cmd_line)) { + espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; + espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; + index++; + } if (left - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); else need_ok_later = true; - - } - - } + } + } break; - } } - else{ + else { strcat((char *)cmd_line, "\n"); - uint32_t left_g; - if (espGcodeFifo.wait_tick > 5) { - - if (espGcodeFifo.r > espGcodeFifo.w) - left_g = espGcodeFifo.r - espGcodeFifo.w - 1; + if (espGcodeFifo.wait_tick > 5) { + uint32_t left_g; + if (espGcodeFifo.r > espGcodeFifo.w) + left_g = espGcodeFifo.r - espGcodeFifo.w - 1; else left_g = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; + if (left_g >= strlen((const char *)cmd_line)) { uint32_t index = 0; while (index < strlen((const char *)cmd_line)) { espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; - espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; + espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; index++; } - if (left_g - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - else - need_ok_later = true; - + if (left_g - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + else + need_ok_later = true; } } } @@ -1066,12 +980,7 @@ static int32_t charAtArray(const uint8_t *_array, uint32_t _arrayLen, uint8_t _c } void get_wifi_list_command_send() { - char buf[6] = {0}; - buf[0] = 0xA5; - buf[1] = 0x07; - buf[2] = 0x00; - buf[3] = 0x00; - buf[4] = 0xFC; + char buf[] = { 0xA5, 0x07, 0x00, 0x00, 0xFC }; raw_send_to_wifi(buf, 5); } @@ -1079,60 +988,57 @@ static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { int wifiNameLen, wifiKeyLen, hostLen, id_len, ver_len; if (msgLen <= 0) return; - //ip + + // ip sprintf(ipPara.ip_addr, "%d.%d.%d.%d", msg[0], msg[1], msg[2], msg[3]); - //port - //connect state - if (msg[6] == 0x0A) - wifi_link_state = WIFI_CONNECTED; - else if (msg[6] == 0x0E) - wifi_link_state = WIFI_EXCEPTION; - else - wifi_link_state = WIFI_NOT_CONFIG; + // port + // connect state + switch (msg[6]) { + case 0x0A: wifi_link_state = WIFI_CONNECTED; break; + case 0x0E: wifi_link_state = WIFI_EXCEPTION; break; + default: wifi_link_state = WIFI_NOT_CONFIG; break; + } - //mode + // mode wifiPara.mode = msg[7]; - - //wifi name + // wifi name wifiNameLen = msg[8]; wifiKeyLen = msg[9 + wifiNameLen]; if (wifiNameLen < 32) { - memset(wifiPara.ap_name, 0, sizeof(wifiPara.ap_name)); + ZERO(wifiPara.ap_name); memcpy(wifiPara.ap_name, &msg[9], wifiNameLen); - memset(&wifi_list.wifiConnectedName,0,sizeof(wifi_list.wifiConnectedName)); - memcpy(&wifi_list.wifiConnectedName,&msg[9],wifiNameLen); + memset(&wifi_list.wifiConnectedName, 0, sizeof(wifi_list.wifiConnectedName)); + memcpy(&wifi_list.wifiConnectedName, &msg[9], wifiNameLen); - //wifi key + // wifi key if (wifiKeyLen < 64) { - memset(wifiPara.keyCode, 0, sizeof(wifiPara.keyCode)); + ZERO(wifiPara.keyCode); memcpy(wifiPara.keyCode, &msg[10 + wifiNameLen], wifiKeyLen); } } - cloud_para.state =msg[10 + wifiNameLen + wifiKeyLen]; hostLen = msg[11 + wifiNameLen + wifiKeyLen]; if (cloud_para.state) { if (hostLen < 96) { - memset(cloud_para.hostUrl, 0, sizeof(cloud_para.hostUrl)); + ZERO(cloud_para.hostUrl); memcpy(cloud_para.hostUrl, &msg[12 + wifiNameLen + wifiKeyLen], hostLen); } cloud_para.port = msg[12 + wifiNameLen + wifiKeyLen + hostLen] + (msg[13 + wifiNameLen + wifiKeyLen + hostLen] << 8); - } // id id_len = msg[14 + wifiNameLen + wifiKeyLen + hostLen]; if (id_len == 20) { - memset(cloud_para.id, 0, sizeof(cloud_para.id)); + ZERO(cloud_para.id); memcpy(cloud_para.id, (const char *)&msg[15 + wifiNameLen + wifiKeyLen + hostLen], id_len); } ver_len = msg[15 + wifiNameLen + wifiKeyLen + hostLen + id_len]; if (ver_len < 20) { - memset(wifi_firm_ver, 0, sizeof(wifi_firm_ver)); + ZERO(wifi_firm_ver); memcpy(wifi_firm_ver, (const char *)&msg[16 + wifiNameLen + wifiKeyLen + hostLen + id_len], ver_len); } @@ -1155,35 +1061,29 @@ static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { } static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { - int wifiNameLen,wifiMsgIdex=1; - int8_t wifi_name_is_same=0; - int8_t i,j; - int8_t wifi_name_num=0; - uint8_t *str=0; + int wifiNameLen,wifiMsgIdex = 1; + int8_t wifi_name_is_same = 0; + int8_t i, j; + int8_t wifi_name_num = 0; + uint8_t *str = 0; int8_t valid_name_num; - if (msgLen <= 0) - return; - if (disp_state == KEY_BOARD_UI) - return; + if (msgLen <= 0) return; + if (disp_state == KEY_BOARD_UI) return; wifi_list.getNameNum = msg[0]; if (wifi_list.getNameNum < 20) { uiCfg.command_send = 1; - - memset(wifi_list.wifiName,0,sizeof(wifi_list.wifiName)); - + ZERO(wifi_list.wifiName); wifi_name_num = wifi_list.getNameNum; - - valid_name_num=0; - str = wifi_list.wifiName[valid_name_num]; + valid_name_num = 0; + str = wifi_list.wifiName[0]; if (wifi_list.getNameNum > 0) wifi_list.currentWifipage = 1; - for (i = 0; i 0x80) { wifi_name_is_same = 1; //break; @@ -1211,65 +1110,50 @@ static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { //i--; continue; } - if (i < WIFI_TOTAL_NUMBER-1) { + if (i < WIFI_TOTAL_NUMBER - 1) str = wifi_list.wifiName[++valid_name_num]; - } } - wifiMsgIdex += wifiNameLen; - wifi_list.RSSI[i] = msg[wifiMsgIdex]; - wifiMsgIdex += 1; + wifiMsgIdex += wifiNameLen; + wifi_list.RSSI[i] = msg[wifiMsgIdex++]; } wifi_list.getNameNum = wifi_name_num; - if (wifi_list.getNameNum % NUMBER_OF_PAGE == 0) { - wifi_list.getPage = wifi_list.getNameNum/NUMBER_OF_PAGE; - } - else { - wifi_list.getPage = wifi_list.getNameNum/NUMBER_OF_PAGE + 1; - } + wifi_list.getPage = wifi_list.getNameNum / NUMBER_OF_PAGE + ((wifi_list.getNameNum % NUMBER_OF_PAGE) != 0); wifi_list.nameIndex = 0; - if (disp_state == WIFI_LIST_UI) - disp_wifi_list(); + + if (disp_state == WIFI_LIST_UI) disp_wifi_list(); } } static void gcode_msg_handle(uint8_t * msg, uint16_t msgLen) { - uint8_t gcodeBuf[100] = {0}; - char *index_s; - char *index_e; + uint8_t gcodeBuf[100] = { 0 }; + char *index_s, *index_e; - if (msgLen <= 0) - return; + if (msgLen <= 0) return; index_s = (char *)msg; - index_e = (char *)strstr((char *)msg, "\n"); + index_e = (char *)strchr((char *)msg, '\n'); if (*msg == 'N') { - index_s = (char *)strstr((char *)msg, " "); - while ((*index_s) == ' ') { - index_s++; - } + index_s = (char *)strchr((char *)msg, ' '); + while (*index_s == ' ') index_s++; } while ((index_e != 0) && ((int)index_s < (int)index_e)) { if ((int)(index_e - index_s) < (int)sizeof(gcodeBuf)) { - memset(gcodeBuf, 0, sizeof(gcodeBuf)); - + ZERO(gcodeBuf); memcpy(gcodeBuf, index_s, index_e - index_s + 1); - wifi_gcode_exec(gcodeBuf); } - while ((*index_e == '\r') || (*index_e == '\n')) - index_e++; - + while ((*index_e == '\r') || (*index_e == '\n')) index_e++; index_s = index_e; - index_e = (char *)strstr(index_s, "\n"); + index_e = (char *)strchr(index_s, '\n'); } } void utf8_2_unicode(uint8_t *source,uint8_t Len) { - uint8_t i=0,char_i=0,char_byte_num=0; - uint16_t u16_h,u16_m,u16_l,u16_value; + uint8_t i = 0, char_i = 0, char_byte_num = 0; + uint16_t u16_h, u16_m, u16_l, u16_value; uint8_t FileName_unicode[30]; - memset(FileName_unicode, 0, sizeof(FileName_unicode)); + ZERO(FileName_unicode); while (1) { char_byte_num = source[i] & 0xF0; @@ -1282,8 +1166,8 @@ void utf8_2_unicode(uint8_t *source,uint8_t Len) { else if (char_byte_num == 0XC0 || char_byte_num == 0XD0) { //--2byte - u16_h = (((uint16_t)source[i] <<8) & 0x1F00) >> 2; - u16_l = ((uint16_t)source[i+1] & 0x003F); + u16_h = (((uint16_t)source[i] << 8) & 0x1F00) >> 2; + u16_l = ((uint16_t)source[i + 1] & 0x003F); u16_value = (u16_h | u16_l); FileName_unicode[char_i] = (uint8_t)((u16_value & 0xFF00) >> 8); FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00FF); @@ -1292,9 +1176,9 @@ void utf8_2_unicode(uint8_t *source,uint8_t Len) { } else if (char_byte_num == 0XE0) { //--3byte - u16_h = (((uint16_t)source[i] <<8 ) & 0x0F00) << 4; - u16_m = (((uint16_t)source[i+1] << 8) & 0x3F00) >> 2; - u16_l = ((uint16_t)source[i+2] & 0x003F); + u16_h = (((uint16_t)source[i] << 8) & 0x0F00) << 4; + u16_m = (((uint16_t)source[i + 1] << 8) & 0x3F00) >> 2; + u16_l = ((uint16_t)source[i + 2] & 0x003F); u16_value = (u16_h | u16_m | u16_l); FileName_unicode[char_i] = (uint8_t)((u16_value & 0xFF00) >> 8); FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00FF); @@ -1309,9 +1193,9 @@ void utf8_2_unicode(uint8_t *source,uint8_t Len) { else { break; } - if (i >= Len || i >= 255)break; + if (i >= Len || i >= 255) break; } - memcpy(source, FileName_unicode, sizeof(FileName_unicode)); + COPY(source, FileName_unicode); } char saveFilePath[50]; @@ -1343,18 +1227,18 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { if (msgLen != fileNameLen + 5) return; file_writer.fileLen = *((uint32_t *)(msg + 1)); - memset(file_writer.saveFileName, 0, sizeof(file_writer.saveFileName)); + ZERO(file_writer.saveFileName); memcpy(file_writer.saveFileName, msg + 5, fileNameLen); utf8_2_unicode(file_writer.saveFileName,fileNameLen); - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + ZERO(file_writer.write_buf); if (strlen((const char *)file_writer.saveFileName) > sizeof(saveFilePath)) return; - memset(saveFilePath, 0, sizeof(saveFilePath)); + ZERO(saveFilePath); if (gCfgItems.fileSysType == FILE_SYS_SD) { //sprintf((char *)saveFilePath, "/%s", file_writer.saveFileName); @@ -1392,7 +1276,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { sprintf((char *)saveFilePath, "/%s", dosName); ZERO(list_file.long_name[sel_id]); - memcpy(list_file.long_name[sel_id],dosName,sizeof(dosName)); + memcpy(list_file.long_name[sel_id], dosName, sizeof(dosName)); char *cur_name=strrchr((const char *)saveFilePath,'/'); @@ -1412,7 +1296,8 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); return; } - #endif + + #endif // SDSUPPORT wifi_link_state = WIFI_TRANS_FILE; @@ -1432,14 +1317,14 @@ static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { uint32_t frag = *((uint32_t *)msg); if ((frag & FRAG_MASK) != (uint32_t)(lastFragment + 1)) { - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + ZERO(file_writer.write_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; } else { if (write_to_file((char *)msg + 4, msgLen - 4) < 0) { - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + ZERO(file_writer.write_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; @@ -1450,13 +1335,13 @@ static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { if ((frag & (~FRAG_MASK))) { int res = card.write(file_writer.write_buf, file_writer.write_index); if (res == -1) { - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + ZERO(file_writer.write_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; return; } - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + ZERO(file_writer.write_buf); file_writer.write_index = 0; file_writer.tick_end = getWifiTick(); upload_time = getWifiTickDiff(file_writer.tick_begin, file_writer.tick_end) / 1000; @@ -1493,7 +1378,7 @@ void esp_data_parser(char *cmdRxBuf, int len) { if (tail_pos == -1) { if (esp_msg_index >= sizeof(esp_msg_buf)) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + ZERO(esp_msg_buf); esp_msg_index = 0; } return; @@ -1503,7 +1388,7 @@ void esp_data_parser(char *cmdRxBuf, int len) { head_pos = charAtArray((uint8_t const *)&cmdRxBuf[len - leftLen], leftLen, ESP_PROTOC_HEAD); if (head_pos == -1) return; - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + ZERO(esp_msg_buf); memcpy(esp_msg_buf, &cmdRxBuf[len - leftLen + head_pos], leftLen - head_pos); esp_msg_index = leftLen - head_pos; @@ -1513,7 +1398,7 @@ void esp_data_parser(char *cmdRxBuf, int len) { tail_pos = charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL); if (tail_pos == -1) { if (esp_msg_index >= sizeof(esp_msg_buf)) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + ZERO(esp_msg_buf); esp_msg_index = 0; } return; @@ -1521,10 +1406,13 @@ void esp_data_parser(char *cmdRxBuf, int len) { } esp_frame.type = esp_msg_buf[1]; - if ((esp_frame.type != ESP_TYPE_NET) && (esp_frame.type != ESP_TYPE_GCODE) - && (esp_frame.type != ESP_TYPE_FILE_FIRST) && (esp_frame.type != ESP_TYPE_FILE_FRAGMENT) - &&(esp_frame.type != ESP_TYPE_WIFI_LIST)) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + if ( esp_frame.type != ESP_TYPE_NET + && esp_frame.type != ESP_TYPE_GCODE + && esp_frame.type != ESP_TYPE_FILE_FIRST + && esp_frame.type != ESP_TYPE_FILE_FRAGMENT + && esp_frame.type != ESP_TYPE_WIFI_LIST + ) { + ZERO(esp_msg_buf); esp_msg_index = 0; return; } @@ -1532,14 +1420,14 @@ void esp_data_parser(char *cmdRxBuf, int len) { esp_frame.dataLen = esp_msg_buf[2] + (esp_msg_buf[3] << 8); if ((int)(4 + esp_frame.dataLen) > (int)(sizeof(esp_msg_buf))) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + ZERO(esp_msg_buf); esp_msg_index = 0; return; } if (esp_msg_buf[4 + esp_frame.dataLen] != ESP_PROTOC_TAIL) { if (esp_msg_index >= sizeof(esp_msg_buf)) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + ZERO(esp_msg_buf); esp_msg_index = 0; } return; @@ -1568,7 +1456,7 @@ void esp_data_parser(char *cmdRxBuf, int len) { esp_msg_index = cut_msg_head(esp_msg_buf, esp_msg_index, esp_frame.dataLen + 5); if (esp_msg_index > 0) { if (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) == -1) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + ZERO(esp_msg_buf); esp_msg_index = 0; return; } @@ -1626,7 +1514,7 @@ void stopEspTransfer() { void wifi_rcv_handle() { int32_t len = 0; - uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = {0}; + uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = { 0 }; int8_t getDataF = 0; if (wifi_link_state == WIFI_TRANS_FILE) { @@ -1717,7 +1605,7 @@ void wifi_rcv_handle() { } void wifi_looping() { - do { wifi_rcv_handle(); } while (wifi_link_state == WIFI_TRANS_FILE); + do { wifi_rcv_handle(); } while (wifi_link_state == WIFI_TRANS_FILE); } void mks_esp_wifi_init() { diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index 7b5595444c..ebb8e1af7d 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -42,30 +42,30 @@ // // Limit Switches // -#define X_MIN_PIN 34 -#define Y_MIN_PIN 35 -#define Z_MIN_PIN 16 // 15 +#define X_STOP_PIN 34 +#define Y_STOP_PIN 35 +#define Z_STOP_PIN 16 // // Steppers // -#define X_STEP_PIN 12 // 34//27 -#define X_DIR_PIN 13 // 35//26 -#define X_ENABLE_PIN 17 // 0//17//25 // used free pin +#define X_STEP_PIN 12 +#define X_DIR_PIN 13 +#define X_ENABLE_PIN 17 //#define X_CS_PIN 0 -#define Y_STEP_PIN 32 // 33 -#define Y_DIR_PIN 33 // 32 +#define Y_STEP_PIN 32 +#define Y_DIR_PIN 33 #define Y_ENABLE_PIN X_ENABLE_PIN //#define Y_CS_PIN 13 -#define Z_STEP_PIN 25 // 14 -#define Z_DIR_PIN 26 // 12 +#define Z_STEP_PIN 25 +#define Z_DIR_PIN 26 #define Z_ENABLE_PIN X_ENABLE_PIN //#define Z_CS_PIN 5 // SS_PIN -#define E0_STEP_PIN 27 // 16 -#define E0_DIR_PIN 14 // 17 +#define E0_STEP_PIN 27 +#define E0_DIR_PIN 14 #define E0_ENABLE_PIN X_ENABLE_PIN //#define E0_CS_PIN 21 @@ -78,9 +78,9 @@ // // Heaters / Fans // -#define HEATER_0_PIN 2 // 4//2//(D8) -#define FAN_PIN 0 // 2//15//13 (D9) -#define HEATER_BED_PIN 15 // 15//0 //(D10) +#define HEATER_0_PIN 2 +#define FAN_PIN 0 +#define HEATER_BED_PIN 15 // SPI #define SDSS 5 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 8792cd3dfa..5259b147fb 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -666,6 +666,7 @@ // // Custom board (with custom PIO env) // + #elif MB(CUSTOM) #include "pins_custom.h" // env:custom diff --git a/platformio.ini b/platformio.ini index 9d5f6c5ab8..8416b93a27 100644 --- a/platformio.ini +++ b/platformio.ini @@ -977,7 +977,6 @@ extends = env:mks_robin extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_pro.py - # # TRIGORILLA PRO (STM32F103ZET6) # @@ -1026,7 +1025,6 @@ board = genericSTM32F103RC extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_lite.py - # # MKS ROBIN LITE3 (STM32F103RCT6) # From 52bc509fcf40ffaa7a5dc0c1bc465c81dc3cb56d Mon Sep 17 00:00:00 2001 From: TheMichalcinOfficial <73078661+TheMichalcinOfficial@users.noreply.github.com> Date: Wed, 21 Oct 2020 20:44:55 +0200 Subject: [PATCH 0437/1370] Support for Ramps-S v1.2 (#19815) --- Marlin/src/core/boards.h | 3 + Marlin/src/pins/pins.h | 6 + Marlin/src/pins/ramps/pins_RAMPS.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_S_12.h | 275 ++++++++++++++++++++++++ 4 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 Marlin/src/pins/ramps/pins_RAMPS_S_12.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index da7d15ec33..605f2e74a4 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -109,6 +109,9 @@ #define BOARD_COPYMASTER_3D 1153 // Copymaster 3D #define BOARD_ORTUR_4 1154 // Ortur 4 #define BOARD_TENLOG_D3_HERO 1155 // Tenlog D3 Hero IDEX printer +#define BOARD_RAMPS_S_12_EEFB 1156 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed) +#define BOARD_RAMPS_S_12_EEEB 1157 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed) +#define BOARD_RAMPS_S_12_EFFB 1158 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed) // // RAMBo and derivatives diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 5259b147fb..1e2da66228 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -207,6 +207,12 @@ #include "ramps/pins_TENLOG_D3_HERO.h" // ATmega2560 env:mega2560 #elif MB(MKS_GEN_L_V21) #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560 +#elif MB(RAMPS_S_12_EEFB) + #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 +#elif MB(RAMPS_S_12_EEEB) + #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 +#elif MB(RAMPS_S_12_EFFB) + #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 // // RAMBo and derivatives diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index c8578f2fa1..69a80d6b27 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -52,7 +52,7 @@ #endif #if NOT_TARGET(IS_RAMPS_SMART, IS_RAMPS_DUO, IS_RAMPS4DUE, TARGET_LPC1768, __AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' (or other appropriate target) in 'Tools > Board.'" #endif // Custom flags and defines for the build diff --git a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h new file mode 100644 index 0000000000..1e063c269d --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h @@ -0,0 +1,275 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Arduino Mega with RAMPS-S v1.2 by Sakul.cz pin assignments + * Written by Michal Rábek + * + * Applies to the following boards: + * + * BOARD_RAMPS_S_12_EEFB Ramps S 1.2 (Hotend0, Hotend1, Fan, Bed) + * BOARD_RAMPS_S_12_EEEB Ramps S 1.2 (Hotend0, Hotend1, Hotend2, Bed) + * BOARD_RAMPS_S_12_EFFB Ramps S 1.2 (Hotend, Fan0, Fan1, Bed) + * + * Other pins_MYBOARD.h files may override these defaults + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "RAMPS S 1.2" +#endif + +// +// Servos +// +#ifndef SERVO0_PIN + #define SERVO0_PIN 10 +#endif +#ifndef SERVO1_PIN + #define SERVO1_PIN 11 +#endif +#ifndef SERVO2_PIN + #define SERVO2_PIN 12 +#endif +#ifndef SERVO3_PIN + #define SERVO3_PIN 44 +#endif + +// +// Limit Switches +// +#ifndef X_STOP_PIN + #ifndef X_MIN_PIN + #define X_MIN_PIN 37 + #endif + #ifndef X_MAX_PIN + #define X_MAX_PIN 36 + #endif +#endif +#ifndef Y_STOP_PIN + #ifndef Y_MIN_PIN + #define Y_MIN_PIN 35 + #endif + #ifndef Y_MAX_PIN + #define Y_MAX_PIN 34 + #endif +#endif +#ifndef Z_STOP_PIN + #ifndef Z_MIN_PIN + #define Z_MIN_PIN 33 + #endif + #ifndef Z_MAX_PIN + #define Z_MAX_PIN 32 + #endif +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 5 +#endif + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 44 // RAMPS_S S3 on the servos connector +#endif + +// +// Steppers +// +#define X_STEP_PIN 17 +#define X_DIR_PIN 16 +#define X_ENABLE_PIN 48 + +#define Y_STEP_PIN 54 +#define Y_DIR_PIN 47 +#define Y_ENABLE_PIN 55 + +#ifndef Z_STEP_PIN + #define Z_STEP_PIN 57 +#endif +#define Z_DIR_PIN 56 +#define Z_ENABLE_PIN 62 + +#define E0_STEP_PIN 23 +#define E0_DIR_PIN 22 +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 25 +#define E1_ENABLE_PIN 27 + +#define E2_STEP_PIN 29 +#define E2_DIR_PIN 28 +#define E2_ENABLE_PIN 39 + +// +// Temperature Sensors +// +#ifndef TEMP_0_PIN + #define TEMP_0_PIN 15 // Analog Input +#endif +#ifndef TEMP_1_PIN + #define TEMP_1_PIN 14 // Analog Input +#endif +#ifndef TEMP_2_PIN + #define TEMP_2_PIN 13 // Analog Input +#endif +#ifndef TEMP_3_PIN + #define TEMP_3_PIN 12 // Analog Input +#endif +#ifndef TEMP_BED_PIN + #define TEMP_BED_PIN 11 // Analog Input +#endif + +// +// Heaters / Fans +// +#ifndef MOSFET_D_PIN + #define MOSFET_D_PIN -1 +#endif +#ifndef RAMPS_S_HE_0 + #define RAMPS_S_HE_0 2 +#endif +#ifndef RAMPS_S_HE_1 + #define RAMPS_S_HE_1 3 +#endif +#ifndef RAMPS_S_HE_2 + #define RAMPS_S_HE_2 6 +#endif + +#define HEATER_BED_PIN 9 + +#define HEATER_0_PIN RAMPS_S_HE_0 + +#if MB(RAMPS_S_12_EEFB) // Hotend0, Hotend1, Fan, Bed + #define HEATER_1_PIN RAMPS_S_HE_1 + #define FAN_PIN RAMPS_S_HE_2 +#elif MB(RAMPS_S_12_EEEB) // Hotend0, Hotend1, Hotend2, Bed + #define HEATER_1_PIN RAMPS_S_HE_1 + #define HEATER_2_PIN RAMPS_S_HE_2 +#elif MB(RAMPS_S_12_EFFB) // Hotend, Fan0, Fan1, Bed + #define FAN_PIN RAMPS_S_HE_1 + #define FAN1_PIN RAMPS_S_HE_2 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +#ifndef KILL_PIN + #define KILL_PIN 46 +#endif + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 60 // Analog Input on EXTEND +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 // RAMPS_S S2 on the servos connector +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) + #if NUM_SERVOS <= 1 // Prefer the servo connector + #define CASE_LIGHT_PIN 12 // Hardware PWM (RAMPS_S S1 on the servos connector) + #elif HAS_FREE_AUX2_PINS + #define CASE_LIGHT_PIN 44 // Hardware PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER && !defined(SPINDLE_LASER_ENA_PIN) + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_DIR_PIN 5 +#endif + +// +// TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI 51 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO 50 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK 53 + #endif +#endif + +// +// Průša i3 MK2 Multiplexer Support +// +#ifndef E_MUX0_PIN + #define E_MUX0_PIN 29 // E2_STEP_PIN +#endif +#ifndef E_MUX1_PIN + #define E_MUX1_PIN 28 // E2_DIR_PIN +#endif +#ifndef E_MUX2_PIN + #define E_MUX2_PIN 39 // E2_ENABLE_PIN +#endif + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +// +// LCD Display output pins +// +#if HAS_WIRED_LCD + #define BEEPER_PIN 45 + #define LCD_PINS_RS 19 + #define LCD_PINS_ENABLE 49 + #define LCD_PINS_D4 18 + #define LCD_PINS_D5 30 + #define LCD_PINS_D6 41 + #define LCD_PINS_D7 31 + #ifndef SD_DETECT_PIN + #define SD_DETECT_PIN 38 + #endif +#endif + +// +// LCD Display input pins +// +#if IS_NEWPANEL + #define BTN_EN1 40 + #define BTN_EN2 42 + #define BTN_ENC 43 +#endif From f27b61cb0ff55335469ce100d234d6528c159af2 Mon Sep 17 00:00:00 2001 From: Mauro Date: Wed, 21 Oct 2020 20:51:14 +0200 Subject: [PATCH 0438/1370] Fresh Web GUI (based on bootstrap.js) (#19812) --- data/www/bootstrap.min.css | 6 + data/www/bootstrap.min.js | 6 + data/www/bootstrap4-toggle.min.js | 10 + data/www/chart.lineargauge.js | 234 ++++++++ data/www/chart.min.js | 7 + data/www/filesaver.min.js | 1 + data/www/index-ie.html | 22 + data/www/index.html | 766 +++++++++++++++++++++++++- data/www/jquery-3.5.1.slim.min.js | 2 + data/www/jquery.browser.min.js | 10 + data/www/marlin-logo-dark.png | Bin 0 -> 881 bytes data/www/marlin-logo.png | Bin 2349 -> 0 bytes data/www/marlin.css | 166 ------ data/www/marlin.js | 24 - data/www/marlinui.eot | Bin 0 -> 9456 bytes data/www/marlinui.svg | 56 ++ data/www/marlinui.ttf | Bin 0 -> 9288 bytes data/www/marlinui.woff | Bin 0 -> 6632 bytes data/www/moment.min.js | 7 + data/www/webmarlin-class.js | 426 +++++++++++++++ data/www/webmarlin-font.css | 169 ++++++ data/www/webmarlin.css | 45 ++ data/www/webmarlin.js | 872 ++++++++++++++++++++++++++++++ 23 files changed, 2612 insertions(+), 217 deletions(-) create mode 100644 data/www/bootstrap.min.css create mode 100644 data/www/bootstrap.min.js create mode 100644 data/www/bootstrap4-toggle.min.js create mode 100644 data/www/chart.lineargauge.js create mode 100644 data/www/chart.min.js create mode 100644 data/www/filesaver.min.js create mode 100644 data/www/index-ie.html create mode 100644 data/www/jquery-3.5.1.slim.min.js create mode 100644 data/www/jquery.browser.min.js create mode 100644 data/www/marlin-logo-dark.png delete mode 100644 data/www/marlin-logo.png delete mode 100644 data/www/marlin.css delete mode 100644 data/www/marlin.js create mode 100644 data/www/marlinui.eot create mode 100644 data/www/marlinui.svg create mode 100644 data/www/marlinui.ttf create mode 100644 data/www/marlinui.woff create mode 100644 data/www/moment.min.js create mode 100644 data/www/webmarlin-class.js create mode 100644 data/www/webmarlin-font.css create mode 100644 data/www/webmarlin.css create mode 100644 data/www/webmarlin.js diff --git a/data/www/bootstrap.min.css b/data/www/bootstrap.min.css new file mode 100644 index 0000000000..387b56b2cc --- /dev/null +++ b/data/www/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.5.0 (https://getbootstrap.com/) + * Copyright 2011-2020 The Bootstrap Authors + * Copyright 2011-2020 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item{display:-ms-flexbox;display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} diff --git a/data/www/bootstrap.min.js b/data/www/bootstrap.min.js new file mode 100644 index 0000000000..c3fb738094 --- /dev/null +++ b/data/www/bootstrap.min.js @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.5.0 (https://getbootstrap.com/) + * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,(function(t,e,n){"use strict";function i(t,e){for(var n=0;n=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};c.jQueryDetection(),e.fn.emulateTransitionEnd=l,e.event.special[c.TRANSITION_END]={bindType:"transitionend",delegateType:"transitionend",handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var h="alert",u=e.fn[h],d=function(){function t(t){this._element=t}var n=t.prototype;return n.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},n.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},n._getRootElement=function(t){var n=c.getSelectorFromElement(t),i=!1;return n&&(i=document.querySelector(n)),i||(i=e(t).closest(".alert")[0]),i},n._triggerCloseEvent=function(t){var n=e.Event("close.bs.alert");return e(t).trigger(n),n},n._removeElement=function(t){var n=this;if(e(t).removeClass("show"),e(t).hasClass("fade")){var i=c.getTransitionDurationFromElement(t);e(t).one(c.TRANSITION_END,(function(e){return n._destroyElement(t,e)})).emulateTransitionEnd(i)}else this._destroyElement(t)},n._destroyElement=function(t){e(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.alert");o||(o=new t(this),i.data("bs.alert",o)),"close"===n&&o[n](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',d._handleDismiss(new d)),e.fn[h]=d._jQueryInterface,e.fn[h].Constructor=d,e.fn[h].noConflict=function(){return e.fn[h]=u,d._jQueryInterface};var f=e.fn.button,g=function(){function t(t){this._element=t}var n=t.prototype;return n.toggle=function(){var t=!0,n=!0,i=e(this._element).closest('[data-toggle="buttons"]')[0];if(i){var o=this._element.querySelector('input:not([type="hidden"])');if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains("active"))t=!1;else{var s=i.querySelector(".active");s&&e(s).removeClass("active")}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains("active")),e(o).trigger("change")),o.focus(),n=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(n&&this._element.setAttribute("aria-pressed",!this._element.classList.contains("active")),t&&e(this._element).toggleClass("active"))},n.dispose=function(){e.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.button");i||(i=new t(this),e(this).data("bs.button",i)),"toggle"===n&&i[n]()}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=t.target,i=n;if(e(n).hasClass("btn")||(n=e(n).closest(".btn")[0]),!n||n.hasAttribute("disabled")||n.classList.contains("disabled"))t.preventDefault();else{var o=n.querySelector('input:not([type="hidden"])');if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return void t.preventDefault();"LABEL"===i.tagName&&o&&"checkbox"===o.type&&t.preventDefault(),g._jQueryInterface.call(e(n),"toggle")}})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=e(t.target).closest(".btn")[0];e(n).toggleClass("focus",/^focus(in)?$/.test(t.type))})),e(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var n=t.prototype;return n.next=function(){this._isSliding||this._slide("next")},n.nextWhenVisible=function(){!document.hidden&&e(this._element).is(":visible")&&"hidden"!==e(this._element).css("visibility")&&this.next()},n.prev=function(){this._isSliding||this._slide("prev")},n.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(c.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},n.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},n.to=function(t){var n=this;this._activeElement=this._element.querySelector(".active.carousel-item");var i=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)e(this._element).one("slid.bs.carousel",(function(){return n.to(t)}));else{if(i===t)return this.pause(),void this.cycle();var o=t>i?"next":"prev";this._slide(o,this._items[t])}},n.dispose=function(){e(this._element).off(p),e.removeData(this._element,"bs.carousel"),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},n._getConfig=function(t){return t=a(a({},v),t),c.typeCheckConfig(m,t,b),t},n._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},n._addEventListeners=function(){var t=this;this._config.keyboard&&e(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&e(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},n._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var n=function(e){t._pointerEvent&&y[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},i=function(e){t._pointerEvent&&y[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};e(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(e(this._element).on("pointerdown.bs.carousel",(function(t){return n(t)})),e(this._element).on("pointerup.bs.carousel",(function(t){return i(t)})),this._element.classList.add("pointer-event")):(e(this._element).on("touchstart.bs.carousel",(function(t){return n(t)})),e(this._element).on("touchmove.bs.carousel",(function(e){return function(e){e.originalEvent.touches&&e.originalEvent.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),e(this._element).on("touchend.bs.carousel",(function(t){return i(t)})))}},n._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},n._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},n._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),s=this._items.length-1;if((i&&0===o||n&&o===s)&&!this._config.wrap)return e;var r=(o+("prev"===t?-1:1))%this._items.length;return-1===r?this._items[this._items.length-1]:this._items[r]},n._triggerSlideEvent=function(t,n){var i=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(".active.carousel-item")),s=e.Event("slide.bs.carousel",{relatedTarget:t,direction:n,from:o,to:i});return e(this._element).trigger(s),s},n._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var n=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));e(n).removeClass("active");var i=this._indicatorsElement.children[this._getItemIndex(t)];i&&e(i).addClass("active")}},n._slide=function(t,n){var i,o,s,r=this,a=this._element.querySelector(".active.carousel-item"),l=this._getItemIndex(a),h=n||a&&this._getItemByDirection(t,a),u=this._getItemIndex(h),d=Boolean(this._interval);if("next"===t?(i="carousel-item-left",o="carousel-item-next",s="left"):(i="carousel-item-right",o="carousel-item-prev",s="right"),h&&e(h).hasClass("active"))this._isSliding=!1;else if(!this._triggerSlideEvent(h,s).isDefaultPrevented()&&a&&h){this._isSliding=!0,d&&this.pause(),this._setActiveIndicatorElement(h);var f=e.Event("slid.bs.carousel",{relatedTarget:h,direction:s,from:l,to:u});if(e(this._element).hasClass("slide")){e(h).addClass(o),c.reflow(h),e(a).addClass(i),e(h).addClass(i);var g=parseInt(h.getAttribute("data-interval"),10);g?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=g):this._config.interval=this._config.defaultInterval||this._config.interval;var m=c.getTransitionDurationFromElement(a);e(a).one(c.TRANSITION_END,(function(){e(h).removeClass(i+" "+o).addClass("active"),e(a).removeClass("active "+o+" "+i),r._isSliding=!1,setTimeout((function(){return e(r._element).trigger(f)}),0)})).emulateTransitionEnd(m)}else e(a).removeClass("active"),e(h).addClass("active"),this._isSliding=!1,e(this._element).trigger(f);d&&this.cycle()}},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.carousel"),o=a(a({},v),e(this).data());"object"==typeof n&&(o=a(a({},o),n));var s="string"==typeof n?n:o.slide;if(i||(i=new t(this,o),e(this).data("bs.carousel",i)),"number"==typeof n)i.to(n);else if("string"==typeof s){if("undefined"==typeof i[s])throw new TypeError('No method named "'+s+'"');i[s]()}else o.interval&&o.ride&&(i.pause(),i.cycle())}))},t._dataApiClickHandler=function(n){var i=c.getSelectorFromElement(this);if(i){var o=e(i)[0];if(o&&e(o).hasClass("carousel")){var s=a(a({},e(o).data()),e(this).data()),r=this.getAttribute("data-slide-to");r&&(s.interval=!1),t._jQueryInterface.call(e(o),s),r&&e(o).data("bs.carousel").to(r),n.preventDefault()}}},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return v}}]),t}();e(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",E._dataApiClickHandler),e(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),n=0,i=t.length;n0&&(this._selector=r,this._triggerArray.push(s))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var n=t.prototype;return n.toggle=function(){e(this._element).hasClass("show")?this.hide():this.show()},n.show=function(){var n,i,o=this;if(!this._isTransitioning&&!e(this._element).hasClass("show")&&(this._parent&&0===(n=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains("collapse")}))).length&&(n=null),!(n&&(i=e(n).not(this._selector).data("bs.collapse"))&&i._isTransitioning))){var s=e.Event("show.bs.collapse");if(e(this._element).trigger(s),!s.isDefaultPrevented()){n&&(t._jQueryInterface.call(e(n).not(this._selector),"hide"),i||e(n).data("bs.collapse",null));var r=this._getDimension();e(this._element).removeClass("collapse").addClass("collapsing"),this._element.style[r]=0,this._triggerArray.length&&e(this._triggerArray).removeClass("collapsed").attr("aria-expanded",!0),this.setTransitioning(!0);var a="scroll"+(r[0].toUpperCase()+r.slice(1)),l=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,(function(){e(o._element).removeClass("collapsing").addClass("collapse show"),o._element.style[r]="",o.setTransitioning(!1),e(o._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(l),this._element.style[r]=this._element[a]+"px"}}},n.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass("show")){var n=e.Event("hide.bs.collapse");if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",c.reflow(this._element),e(this._element).addClass("collapsing").removeClass("collapse show");var o=this._triggerArray.length;if(o>0)for(var s=0;s0},i._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=a(a({},e.offsets),t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},i._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),a(a({},t),this._config.popperConfig)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.dropdown");if(i||(i=new t(this,"object"==typeof n?n:null),e(this).data("bs.dropdown",i)),"string"==typeof n){if("undefined"==typeof i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},t._clearMenus=function(n){if(!n||3!==n.which&&("keyup"!==n.type||9===n.which))for(var i=[].slice.call(document.querySelectorAll('[data-toggle="dropdown"]')),o=0,s=i.length;o0&&r--,40===n.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},n._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},n._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:F,popperConfig:null},Y={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},$=function(){function t(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var i=t.prototype;return i.enable=function(){this._isEnabled=!0},i.disable=function(){this._isEnabled=!1},i.toggleEnabled=function(){this._isEnabled=!this._isEnabled},i.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},i.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},i.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var i=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(i);var o=c.findShadowRoot(this.element),s=e.contains(null!==o?o:this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),a=c.getUID(this.constructor.NAME);r.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&e(r).addClass("fade");var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var u=this._getContainer();e(r).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(r).appendTo(u),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,this._getPopperConfig(h)),e(r).addClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().on("mouseover",null,e.noop);var d=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),"out"===n&&t._leave(null,t)};if(e(this.tip).hasClass("fade")){var f=c.getTransitionDurationFromElement(this.tip);e(this.tip).one(c.TRANSITION_END,d).emulateTransitionEnd(f)}else d()}},i.hide=function(t){var n=this,i=this.getTipElement(),o=e.Event(this.constructor.Event.HIDE),s=function(){"show"!==n._hoverState&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};if(e(this.element).trigger(o),!o.isDefaultPrevented()){if(e(i).removeClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().off("mouseover",null,e.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,e(this.tip).hasClass("fade")){var r=c.getTransitionDurationFromElement(i);e(i).one(c.TRANSITION_END,s).emulateTransitionEnd(r)}else s();this._hoverState=""}},i.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},i.isWithContent=function(){return Boolean(this.getTitle())},i.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},i.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},i.setContent=function(){var t=this.getTipElement();this.setElementContent(e(t.querySelectorAll(".tooltip-inner")),this.getTitle()),e(t).removeClass("fade show")},i.setElementContent=function(t,n){"object"!=typeof n||!n.nodeType&&!n.jquery?this.config.html?(this.config.sanitize&&(n=H(n,this.config.whiteList,this.config.sanitizeFn)),t.html(n)):t.text(n):this.config.html?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text())},i.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},i._getPopperConfig=function(t){var e=this;return a(a({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),this.config.popperConfig)},i._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=a(a({},e.offsets),t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},i._getContainer=function(){return!1===this.config.container?document.body:c.isElement(this.config.container)?e(this.config.container):e(document).find(this.config.container)},i._getAttachment=function(t){return K[t.toUpperCase()]},i._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==n){var i="hover"===n?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o="hover"===n?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},e(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=a(a({},this.config),{},{trigger:"manual",selector:""}):this._fixTitle()},i._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},i._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e(n.getTipElement()).hasClass("show")||"show"===n._hoverState?n._hoverState="show":(clearTimeout(n._timeout),n._hoverState="show",n.config.delay&&n.config.delay.show?n._timeout=setTimeout((function(){"show"===n._hoverState&&n.show()}),n.config.delay.show):n.show())},i._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState="out",n.config.delay&&n.config.delay.hide?n._timeout=setTimeout((function(){"out"===n._hoverState&&n.hide()}),n.config.delay.hide):n.hide())},i._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},i._getConfig=function(t){var n=e(this.element).data();return Object.keys(n).forEach((function(t){-1!==V.indexOf(t)&&delete n[t]})),"number"==typeof(t=a(a(a({},this.constructor.Default),n),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),c.typeCheckConfig(U,t,this.constructor.DefaultType),t.sanitize&&(t.template=H(t.template,t.whiteList,t.sanitizeFn)),t},i._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},i._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(W);null!==n&&n.length&&t.removeClass(n.join(""))},i._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},i._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.tooltip"),o="object"==typeof n&&n;if((i||!/dispose|hide/.test(n))&&(i||(i=new t(this,o),e(this).data("bs.tooltip",i)),"string"==typeof n)){if("undefined"==typeof i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return X}},{key:"NAME",get:function(){return U}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return Y}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return z}}]),t}();e.fn[U]=$._jQueryInterface,e.fn[U].Constructor=$,e.fn[U].noConflict=function(){return e.fn[U]=M,$._jQueryInterface};var J="popover",G=e.fn[J],Z=new RegExp("(^|\\s)bs-popover\\S+","g"),tt=a(a({},$.Default),{},{placement:"right",trigger:"click",content:"",template:''}),et=a(a({},$.DefaultType),{},{content:"(string|element|function)"}),nt={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},it=function(t){var n,i;function s(){return t.apply(this,arguments)||this}i=t,(n=s).prototype=Object.create(i.prototype),n.prototype.constructor=n,n.__proto__=i;var r=s.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},r.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},r.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(t.find(".popover-body"),n),t.removeClass("fade show")},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(Z);null!==n&&n.length>0&&t.removeClass(n.join(""))},s._jQueryInterface=function(t){return this.each((function(){var n=e(this).data("bs.popover"),i="object"==typeof t?t:null;if((n||!/dispose|hide/.test(t))&&(n||(n=new s(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},o(s,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return tt}},{key:"NAME",get:function(){return J}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return nt}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return et}}]),s}($);e.fn[J]=it._jQueryInterface,e.fn[J].Constructor=it,e.fn[J].noConflict=function(){return e.fn[J]=G,it._jQueryInterface};var ot="scrollspy",st=e.fn[ot],rt={offset:10,method:"auto",target:""},at={offset:"number",method:"string",target:"(string|element)"},lt=function(){function t(t,n){var i=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(n),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return i._process(t)})),this.refresh(),this._process()}var n=t.prototype;return n.refresh=function(){var t=this,n=this._scrollElement===this._scrollElement.window?"offset":"position",i="auto"===this._config.method?n:this._config.method,o="position"===i?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var n,s=c.getSelectorFromElement(t);if(s&&(n=document.querySelector(s)),n){var r=n.getBoundingClientRect();if(r.width||r.height)return[e(n)[i]().top+o,s]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},n.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},n._getConfig=function(t){if("string"!=typeof(t=a(a({},rt),"object"==typeof t&&t?t:{})).target&&c.isElement(t.target)){var n=e(t.target).attr("id");n||(n=c.getUID(ot),e(t.target).attr("id",n)),t.target="#"+n}return c.typeCheckConfig(ot,t,at),t},n._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},n._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},n._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},n._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active":".active";i=(i=e.makeArray(e(o).find(r)))[i.length-1]}var a=e.Event("hide.bs.tab",{relatedTarget:this._element}),l=e.Event("show.bs.tab",{relatedTarget:i});if(i&&e(i).trigger(a),e(this._element).trigger(l),!l.isDefaultPrevented()&&!a.isDefaultPrevented()){s&&(n=document.querySelector(s)),this._activate(this._element,o);var h=function(){var n=e.Event("hidden.bs.tab",{relatedTarget:t._element}),o=e.Event("shown.bs.tab",{relatedTarget:i});e(i).trigger(n),e(t._element).trigger(o)};n?this._activate(n,n.parentNode,h):h()}}},n.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},n._activate=function(t,n,i){var o=this,s=(!n||"UL"!==n.nodeName&&"OL"!==n.nodeName?e(n).children(".active"):e(n).find("> li > .active"))[0],r=i&&s&&e(s).hasClass("fade"),a=function(){return o._transitionComplete(t,s,i)};if(s&&r){var l=c.getTransitionDurationFromElement(s);e(s).removeClass("show").one(c.TRANSITION_END,a).emulateTransitionEnd(l)}else a()},n._transitionComplete=function(t,n,i){if(n){e(n).removeClass("active");var o=e(n.parentNode).find("> .dropdown-menu .active")[0];o&&e(o).removeClass("active"),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),c.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&e(t.parentNode).hasClass("dropdown-menu")){var s=e(t).closest(".dropdown")[0];if(s){var r=[].slice.call(s.querySelectorAll(".dropdown-toggle"));e(r).addClass("active")}t.setAttribute("aria-expanded",!0)}i&&i()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.tab");if(o||(o=new t(this),i.data("bs.tab",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new TypeError('No method named "'+n+'"');o[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ht._jQueryInterface.call(e(this),"show")})),e.fn.tab=ht._jQueryInterface,e.fn.tab.Constructor=ht,e.fn.tab.noConflict=function(){return e.fn.tab=ct,ht._jQueryInterface};var ut=e.fn.toast,dt={animation:"boolean",autohide:"boolean",delay:"number"},ft={animation:!0,autohide:!0,delay:500},gt=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var n=t.prototype;return n.show=function(){var t=this,n=e.Event("show.bs.toast");if(e(this._element).trigger(n),!n.isDefaultPrevented()){this._config.animation&&this._element.classList.add("fade");var i=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),e(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),c.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var o=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,i).emulateTransitionEnd(o)}else i()}},n.hide=function(){if(this._element.classList.contains("show")){var t=e.Event("hide.bs.toast");e(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},n.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains("show")&&this._element.classList.remove("show"),e(this._element).off("click.dismiss.bs.toast"),e.removeData(this._element,"bs.toast"),this._element=null,this._config=null},n._getConfig=function(t){return t=a(a(a({},ft),e(this._element).data()),"object"==typeof t&&t?t:{}),c.typeCheckConfig("toast",t,this.constructor.DefaultType),t},n._setListeners=function(){var t=this;e(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},n._close=function(){var t=this,n=function(){t._element.classList.add("hide"),e(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var i=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,n).emulateTransitionEnd(i)}else n()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.toast");if(o||(o=new t(this,"object"==typeof n&&n),i.data("bs.toast",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new TypeError('No method named "'+n+'"');o[n](this)}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"DefaultType",get:function(){return dt}},{key:"Default",get:function(){return ft}}]),t}();e.fn.toast=gt._jQueryInterface,e.fn.toast.Constructor=gt,e.fn.toast.noConflict=function(){return e.fn.toast=ut,gt._jQueryInterface},t.Alert=d,t.Button=g,t.Carousel=E,t.Collapse=D,t.Dropdown=j,t.Modal=R,t.Popover=it,t.Scrollspy=lt,t.Tab=ht,t.Toast=gt,t.Tooltip=$,t.Util=c,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/data/www/bootstrap4-toggle.min.js b/data/www/bootstrap4-toggle.min.js new file mode 100644 index 0000000000..8e67abcdeb --- /dev/null +++ b/data/www/bootstrap4-toggle.min.js @@ -0,0 +1,10 @@ +/*\ +|*| ======================================================================== +|*| Bootstrap Toggle: bootstrap4-toggle.js v3.6.1 +|*| https://gitbrent.github.io/bootstrap4-toggle/ +|*| ======================================================================== +|*| Copyright 2018-2019 Brent Ely +|*| Licensed under MIT +|*| ======================================================================== +\*/ +!function(a){"use strict";function l(t,e){this.$element=a(t),this.options=a.extend({},this.defaults(),e),this.render()}l.VERSION="3.6.0",l.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"light",size:"normal",style:"",width:null,height:null},l.prototype.defaults=function(){return{on:this.$element.attr("data-on")||l.DEFAULTS.on,off:this.$element.attr("data-off")||l.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||l.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||l.DEFAULTS.offstyle,size:this.$element.attr("data-size")||l.DEFAULTS.size,style:this.$element.attr("data-style")||l.DEFAULTS.style,width:this.$element.attr("data-width")||l.DEFAULTS.width,height:this.$element.attr("data-height")||l.DEFAULTS.height}},l.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var t="large"===this.options.size||"lg"===this.options.size?"btn-lg":"small"===this.options.size||"sm"===this.options.size?"btn-sm":"mini"===this.options.size||"xs"===this.options.size?"btn-xs":"",e=a('
').append(e,s,o),l=a('
').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(t).addClass(this.options.style);this.$element.wrap(l),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:e,$toggleOff:s,$toggleGroup:i}),this.$toggle.append(i);var n=this.options.width||Math.max(e.outerWidth(),s.outerWidth())+o.outerWidth()/2,h=this.options.height||Math.max(e.outerHeight(),s.outerHeight());e.addClass("toggle-on"),s.addClass("toggle-off"),this.$toggle.css({width:n,height:h}),this.options.height&&(e.css("line-height",e.height()+"px"),s.css("line-height",s.height()+"px")),this.update(!0),this.trigger(!0)},l.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},l.prototype.on=function(t){if(this.$element.prop("disabled"))return!1;this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),t||this.trigger()},l.prototype.off=function(t){if(this.$element.prop("disabled"))return!1;this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),t||this.trigger()},l.prototype.enable=function(){this.$toggle.removeClass("disabled"),this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},l.prototype.disable=function(){this.$toggle.addClass("disabled"),this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},l.prototype.update=function(t){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(t):this.off(t)},l.prototype.trigger=function(t){this.$element.off("change.bs.toggle"),t||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},l.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var t=a.fn.bootstrapToggle;a.fn.bootstrapToggle=function(o){var i=Array.prototype.slice.call(arguments,1)[0];return this.each(function(){var t=a(this),e=t.data("bs.toggle"),s="object"==typeof o&&o;e||t.data("bs.toggle",e=new l(this,s)),"string"==typeof o&&e[o]&&"boolean"==typeof i?e[o](i):"string"==typeof o&&e[o]&&e[o]()})},a.fn.bootstrapToggle.Constructor=l,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=t,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(t){a(this).find("input[type=checkbox]").bootstrapToggle("toggle"),t.preventDefault()})}(jQuery); diff --git a/data/www/chart.lineargauge.js b/data/www/chart.lineargauge.js new file mode 100644 index 0000000000..fbc06177ac --- /dev/null +++ b/data/www/chart.lineargauge.js @@ -0,0 +1,234 @@ +(function(Chart) { + var helpers = Chart.helpers; + var plugins = Chart.plugins; + Chart.defaults.global.animation.duration = 1000; + + Chart.defaults._set('linearGauge', { + scale: { + type: 'linearGauge', + horizontal: false, + range: { + startValue: -100, + endValue: 500 + }, + responsive: true, + font: { + fontName: 'Arial', + fontSize: 12 + }, + axisWidth: 6, + ticks: { + majorTicks: { + interval: 100, + height: 1, + } + }, + scaleLabel: { + display: true, + interval: 100, + units: '', + customValues: [], + offset: -10, + color: '#777b80' + } + }, + padding: { + top: 0, + bottom: 0, + left: 0, + right: 0 + }, + tooltips: { + callbacks: { + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + label += Math.round(data.datasets[tooltipItem.datasetIndex].data[0] * 100) / 100; + return label; + } + } + }, + legend: { + display: true, + labels: { + fontColor: 'rgb(0, 0, 0)' + }, + position: 'bottom' + } + }); + + Chart.controllers.linearGauge = Chart.DatasetController.extend({ + + dataElementType: Chart.elements.Gaugerect, + + initialize: function() { + var me = this; + var meta; + + Chart.DatasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + + }, + + linkScales: helpers.noop, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + me.datashifts = 0; + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, me.datashifts); + me.datashifts += 10; + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + var custom = rectangle.custom || {}; + var rectangleOptions = chart.options.elements.rectangle; + var gaugeOptions = chart.options.elements.gaugerect; + rectangle._Scale = me.getScaleForId(chart.options.scale.id || 'gaugescale'); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle.rangeColorImage = null; + + // Init element model + rectangle._model = { + datasetLabel: dataset.label, + label: chart.data.labels[index], + borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped, + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, gaugeOptions.backgroundColor), + borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth) + }; + + // Set empty view as start point for animation + if(typeof rectangle._view === 'undefined') rectangle._view = {}; + + me.updateElementGeometry(rectangle, index, reset); + + }, + + updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var start = rectangle._view; + var dataset = me.getDataset().data; + var dopt = me.getDataset(); + var chart = me.chart; + var datasets = chart.data.datasets; + var gaugeOptions = chart.options.elements.gaugerect; + var vscale = me.getScaleForId(chart.options.scale.id || 'gaugescale'); + //var base = vscale.getBasePixel(); + var base = vscale.getBase(); + var horizontal = rectangle._Scale.isHorizontal(); + //var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index, horizontal); + + model.horizontal = horizontal; + model.base = base; + model.head = vpixels.head; + model.x = horizontal ? vpixels.base : vpixels.offset; + model.y = horizontal ? (vpixels.offset - (dopt.width || gaugeOptions.width)) : vpixels.head; + model.height = horizontal ? (dopt.width || gaugeOptions.width) : (vpixels.base - vpixels.head); + model.width = horizontal ? (vpixels.head - vpixels.base) : (dopt.width || gaugeOptions.width); + model.value = vscale.getRightValue(datasets[me.index].data[index]); + + model.scaleValue = 0; + if (horizontal) { + model.scaleValue = vscale.width / (vscale.options.range.endValue - vscale.options.range.startValue); + } else { + model.scaleValue = vscale.height / (vscale.options.range.endValue - vscale.options.range.startValue); + } + + if(typeof start.x === 'undefined' && typeof start.y === 'undefined'){ + if(horizontal){ + start.x = vpixels.base; + start.width = 0; + } else { + start.y = vpixels.base; + start.height = 0; + } + } + + }, + + calculateBarValuePixels: function(datasetIndex, index, horizontal) { + var me = this; + var chart = me.chart; + var scale = me.getScaleForId(chart.options.scale.id || 'gaugescale'); + var datasets = chart.data.datasets; + var dopt = datasets[datasetIndex]; + var value = scale.getRightValue(datasets[datasetIndex].data[index]); + var stacked = scale.options.stacked; + var start = 0; + var i, imeta, ivalue, base, head, size, offset; + + base = scale.scalePoint(start); + head = scale.scalePoint(start + value); + size = (head - base) / 2; + offset = horizontal ? scale.yCenter - dopt.offset : scale.xCenter + dopt.offset; + + return { + size: size, + base: base, + head: head, + center: head + size / 2, + offset: offset + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(dataset.data[i])) { + rects[i].draw(); + } + } + + helpers.canvas.unclipArea(chart.ctx); + }, + + setHoverStyle: function(rectangle) { + var dataset = this.chart.data.datasets[rectangle._datasetIndex]; + var index = rectangle._index; + var custom = rectangle.custom || {}; + var model = rectangle._model; + + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(rectangle) { + var dataset = this.chart.data.datasets[rectangle._datasetIndex]; + var index = rectangle._index; + var custom = rectangle.custom || {}; + var model = rectangle._model; + var rectangleElementOptions = this.chart.options.elements.gaugerect; + + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth); + } + + }); +}).call(this, Chart); diff --git a/data/www/chart.min.js b/data/www/chart.min.js new file mode 100644 index 0000000000..7c16b0d128 --- /dev/null +++ b/data/www/chart.min.js @@ -0,0 +1,7 @@ +/*! + * Chart.js v2.9.3 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],(function(t){return e(function(){try{return t("moment")}catch(t){}}())})):(t=t||self).Chart=e(t.moment)}(this,(function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},n=function(t,e){return t(e={exports:{}},e.exports),e.exports}((function(t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[e[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=n[t];if(i)return i;var a,r,o,s=1/0;for(var l in e)if(e.hasOwnProperty(l)){var u=e[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));n.rgb,n.hsl,n.hsv,n.hwb,n.cmyk,n.xyz,n.lab,n.lch,n.hex,n.keyword,n.ansi16,n.ansi256,n.hcg,n.apple,n.gray;function i(t){var e=function(){for(var t={},e=Object.keys(n),i=e.length,a=0;a1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var s=o,l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},u={getRgba:d,getHsla:h,getRgb:function(t){var e=d(t);return e&&e.slice(0,3)},getHsl:function(t){var e=h(t);return e&&e.slice(0,3)},getHwb:c,getAlpha:function(t){var e=d(t);if(e)return e[3];if(e=h(t))return e[3];if(e=c(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+v(t[0])+v(t[1])+v(t[2])+(e>=0&&e<1?v(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return f(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:f,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:g,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return b[t.slice(0,3)]}};function d(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=t,i=void 0===e?.5:e,a=2*i-1,r=this.alpha()-n.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*n.red(),o*this.green()+s*n.green(),o*this.blue()+s*n.blue()).alpha(this.alpha()*i+n.alpha()*(1-i))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new y,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},y.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i=0;a--)e.call(n,t[a],a);else for(a=0;a=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-S.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*S.easeInBounce(2*t):.5*S.easeOutBounce(2*t-1)+.5}},C={effects:S};M.easingEffects=S;var P=Math.PI,A=P/180,D=2*P,T=P/2,I=P/4,F=2*P/3,L={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),se.left-1e-6&&t.xe.top-1e-6&&t.y0&&this.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r=n?(V.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},J=V.options.resolve,Q=["push","pop","shift","splice","unshift"];function tt(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(Q.forEach((function(e){delete t[e]})),delete t._chartjs)}}var et=function(t,e){this.initialize(t,e)};V.extend(et.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.chart,n=e.scales,i=this.getDataset(),a=e.options.scales;null!==t.xAxisID&&t.xAxisID in n&&!i.xAxisID||(t.xAxisID=i.xAxisID||a.xAxes[0].id),null!==t.yAxisID&&t.yAxisID in n&&!i.yAxisID||(t.yAxisID=i.yAxisID||a.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&tt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,n=this.getMeta(),i=this.getDataset().data||[],a=n.data;for(t=0,e=i.length;tn&&this.insertElements(n,i-n)},insertElements:function(t,e){for(var n=0;na?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function rt(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+it,at(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=it,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+it,n.startAngle,!0),a=0;as;)a-=it;for(;a=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/it)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+it,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;tt.x&&(e=vt(e,"left","right")):t.basen?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function xt(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&mt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}z._set("global",{elements:{rectangle:{backgroundColor:gt,borderColor:gt,borderSkipped:"bottom",borderWidth:0}}});var yt=X.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=mt(t),n=e.right-e.left,i=e.bottom-e.top,a=bt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return xt(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return pt(n)?xt(n,t,null):xt(n,null,e)},inXRange:function(t){return xt(this._view,t,null)},inYRange:function(t){return xt(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return pt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return pt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),_t={},kt=ot,wt=ut,Mt=ft,St=yt;_t.Arc=kt,_t.Line=wt,_t.Point=Mt,_t.Rectangle=St;var Ct=V._deprecated,Pt=V.valueOrDefault;function At(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=V.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return V.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}z._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),z._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var Dt=nt.extend({dataElementType:_t.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;nt.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Ct("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Ct("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Ct("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Ct("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Ct("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,n=i.length;e=0&&p.min>=0?p.min:p.max,y=void 0===p.start?p.end:p.max>=0&&p.min>=0?p.max-p.min:p.min-p.max,_=g.length;if(v||void 0===v&&void 0!==b)for(i=0;i<_&&(a=g[i]).index!==t;++i)a.stack===b&&(r=void 0===(u=h._parseValue(f[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(p.min<0&&r<0||p.max>=0&&r>0)&&(x+=r));return o=h.getPixelForValue(x),l=(s=h.getPixelForValue(x+y))-o,void 0!==m&&Math.abs(l)=0&&!c||y<0&&c?o-m:o+m),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t=Ot?-Rt:b<-Ot?Rt:0)+m,y=Math.cos(b),_=Math.sin(b),k=Math.cos(x),w=Math.sin(x),M=b<=0&&x>=0||x>=Rt,S=b<=zt&&x>=zt||x>=Rt+zt,C=b<=-zt&&x>=-zt||x>=Ot+zt,P=b===-Ot||x>=Ot?-1:Math.min(y,y*p,k,k*p),A=C?-1:Math.min(_,_*p,w,w*p),D=M?1:Math.max(y,y*p,k,k*p),T=S?1:Math.max(_,_*p,w,w*p);u=(D-P)/2,d=(T-A)/2,h=-(D+P)/2,c=-(T+A)/2}for(i=0,a=g.length;i0&&!isNaN(t)?Rt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=V.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Lt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Lt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Lt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n0&&Vt(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return ie(t,e,{intersect:!1})},point:function(t,e){return te(t,Jt(e,t))},nearest:function(t,e,n){var i=Jt(e,t);n.axis=n.axis||"xy";var a=ne(n.axis);return ee(t,i,n.intersect,a)},x:function(t,e,n){var i=Jt(e,t),a=[],r=!1;return Qt(t,(function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=Jt(e,t),a=[],r=!1;return Qt(t,(function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a}}},re=V.extend;function oe(t,e){return V.where(t,(function(t){return t.pos===e}))}function se(t,e){return t.sort((function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight}))}function le(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function ue(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-le(o,t,"left","right"),a=e.outerHeight-le(o,t,"top","bottom"),i!==t.w||a!==t.h)return t.w=i,t.h=a,n.horizontal?i!==t.w:a!==t.h}function de(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach((function(t){i[t]=Math.max(e[t],n[t])})),i}return i(t?["left","right"]:["top","bottom"])}function he(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;idiv{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&fe.default||fe,me="$chartjs",ve="chartjs-size-monitor",be="chartjs-render-monitor",xe="chartjs-render-animation",ye=["animationstart","webkitAnimationStart"],_e={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function ke(t,e){var n=V.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var we=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Me(t,e,n){t.addEventListener(e,n,we)}function Se(t,e,n){t.removeEventListener(e,n,we)}function Ce(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Pe(t){var e=document.createElement("div");return e.className=t||"",e}function Ae(t,e,n){var i,a,r,o,s=t[me]||(t[me]={}),l=s.resizer=function(t){var e=Pe(ve),n=Pe(ve+"-expand"),i=Pe(ve+"-shrink");n.appendChild(Pe()),i.appendChild(Pe()),e.appendChild(n),e.appendChild(i),e._reset=function(){n.scrollLeft=1e6,n.scrollTop=1e6,i.scrollLeft=1e6,i.scrollTop=1e6};var a=function(){e._reset(),t()};return Me(n,"scroll",a.bind(n,"expand")),Me(i,"scroll",a.bind(i,"shrink")),e}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(Ce("resize",n)),i&&i.clientWidth0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index-1?t.split("\n"):t}function We(t){var e=z.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:Re(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:Re(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:Re(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:Re(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:Re(t.titleFontStyle,e.defaultFontStyle),titleFontSize:Re(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:Re(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:Re(t.footerFontStyle,e.defaultFontStyle),footerFontSize:Re(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ve(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function He(t){return Be([],Ee(t))}var je=X.extend({initialize:function(){this._model=We(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Be(o,Ee(i)),o=Be(o,Ee(a)),o=Be(o,Ee(r))},getBeforeBody:function(){return He(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return V.each(t,(function(t){var r={before:[],lines:[],after:[]};Be(r.before,Ee(i.beforeLabel.call(n,t,e))),Be(r.lines,i.label.call(n,t,e)),Be(r.after,Ee(i.afterLabel.call(n,t,e))),a.push(r)})),a},getAfterBody:function(){return He(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Be(r,Ee(n)),r=Be(r,Ee(i)),r=Be(r,Ee(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=We(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var _=[],k=[];y=Ne[c.position].call(h,p,h._eventPosition);var w=[];for(e=0,n=p.length;ei.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,x,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.yl.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+p)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+p-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+m)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=ze(e.rtl,e.x,e.width);for(t.x=Ve(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=V.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,V.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),V.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!V.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),qe=Ne,Ue=je;Ue.positioners=qe;var Ye=V.valueOrDefault;function Ge(){return V.merge({},[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?V.merge(e[t][a],[Oe.getScaleDefaults(r),o]):V.merge(e[t][a],o)}else V._merger(t,e,n,i)}})}function Xe(){return V.merge({},[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||{},r=n[t];"scales"===t?e[t]=Ge(a,r):"scale"===t?e[t]=V.merge(a,[Oe.getScaleDefaults(r.type),r]):V._merger(t,e,n,i)}})}function Ke(t){var e=t.options;V.each(t.scales,(function(e){ge.removeBox(t,e)})),e=Xe(z.global,z[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Ze(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(V.findIndex(t,a)>=0);return i}function $e(t){return"top"===t||"bottom"===t}function Je(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}z._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var Qe=function(t,e){return this.construct(t,e),this};V.extend(Qe.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Xe(z.global,z[t.type],t.options||{}),t}(e);var i=Fe.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=V.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,Qe.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Le.notify(t,"beforeInit"),V.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Le.notify(t,"afterInit"),t},clear:function(){return V.canvas.clear(this),this},stop:function(){return $.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(V.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:V.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",V.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Le.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;V.each(e.xAxes,(function(t,n){t.id||(t.id=Ze(e.xAxes,"x-axis-",n))})),V.each(e.yAxes,(function(t,n){t.id||(t.id=Ze(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),V.each(i,(function(e){var i=e.options,r=i.id,o=Ye(i.type,e.dtype);$e(i.position)!==$e(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Oe.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),V.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Oe.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t=0;--n)this.drawDataset(e[n],t);Le.notify(this,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Le.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Le.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,n={tooltip:e,easingValue:t};!1!==Le.notify(this,"beforeTooltipDraw",[n])&&(e.draw(),Le.notify(this,"afterTooltipDraw",[n]))},getElementAtEvent:function(t){return ae.modes.single(this,t)},getElementsAtEvent:function(t){return ae.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return ae.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=ae.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return ae.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var n=e._meta[this.id];return n||(n=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e.order||0,index:t}),n},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=V.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=V.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(V.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},on=V.isArray,sn=V.isNullOrUndef,ln=V.valueOrDefault,un=V.valueAtIndexOrDefault;function dn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=rl+1e-6)))return o}function hn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,p,m,v=n.length,b=[],x=[],y=[];for(a=0;ae){for(n=0;n=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-cn(l.gridLines)-u.padding-fn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=V.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){V.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){V.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=cn(o)+fn(r)),u?s&&(e.height=cn(o)+fn(r)):e.height=t.maxHeight,a.display&&s){var d=pn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,p=h.highest,m=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,x=V.toRadians(t.labelRotation),y=Math.cos(x),_=Math.sin(x),k=_*g.width+y*(p.height-(b?p.offset:0))+(b?0:m);e.height=Math.min(t.maxHeight,e.height+k+v);var w,M,S=t.getPixelForTick(0)-t.left,C=t.right-t.getPixelForTick(t.getTicks().length-1);b?(w=l?y*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):y*f.width+_*f.offset):(w=c.width/2,M=f.width/2),t.paddingLeft=Math.max((w-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-C)*t.width/(t.width-C),0)+3}else{var P=a.mirror?0:g.width+v+m;e.width=Math.min(t.maxWidth,e.width+P),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){V.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(sn(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map((function(t){return t.value})),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;nn-1?null:this.getPixelForDecimal(t*i+(e?i/2:0))},getPixelForDecimal:function(t){return this._reversePixels&&(t=1-t),this._startPixel+t*this._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,n,i,a,r=this.options.ticks,o=this._length,s=r.maxTicksLimit||o/this._tickSize()+1,l=r.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;es)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;iu)return r;return Math.max(u,1)}(l,t,0,s),u>0){for(e=0,n=u-1;e1?(h-d)/(u-1):null,vn(t,i,V.isNullOrUndef(a)?0:d-a,d),vn(t,i,h,V.isNullOrUndef(a)?t.length:h+a),mn(t)}return vn(t,i),mn(t)},_tickSize:function(){var t=this.options.ticks,e=V.toRadians(this.labelRotation),n=Math.abs(Math.cos(e)),i=Math.abs(Math.sin(e)),a=this._getLabelSizes(),r=t.autoSkipPadding||0,o=a?a.widest.width+r:0,s=a?a.highest.height+r:0;return this.isHorizontal()?s*n>o*i?o/n:s/i:s*i=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this._getLabels(),e=this.minIndex,n=this.maxIndex;this.ticks=0===e&&n===t.length-1?t:t.slice(e,n+1)},getLabelForIndex:function(t,e){var n=this.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===this.id?this.getRightValue(n.data.datasets[e].data[t]):this._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;xn.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return yn(e)||yn(n)||(t=o.chart.data.datasets[n].data[e]),yn(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=V.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange);return Math.min(Math.max(e,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),kn={position:"bottom"};_n._defaults=kn;var wn=V.noop,Mn=V.isNullOrUndef;var Sn=xn.extend({getRightValue:function(t){return"string"==typeof t?+t:xn.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=V.sign(t.min),i=V.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,n=e.stepSize,i=e.maxTicksLimit;return n?t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1:(t=this._computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:wn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:V.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=V.niceNum((g-f)/u/l)*l;if(p<1e-14&&Mn(d)&&Mn(h))return[f,g];(r=Math.ceil(g/p)-Math.floor(f/p))>u&&(p=V.niceNum(r*p/u/l)*l),s||Mn(c)?n=Math.pow(10,V._decimalPlaces(p)):(n=Math.pow(10,c),p=Math.ceil(p*n)/n),i=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!Mn(d)&&V.almostWhole(d/p,p/1e3)&&(i=d),!Mn(h)&&V.almostWhole(h/p,p/1e3)&&(a=h)),r=(a-i)/p,r=V.almostEquals(r,Math.round(r),p/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Mn(d)?i:d);for(var m=1;me.length-1?null:this.getPixelForValue(e[t])}}),Tn=Cn;Dn._defaults=Tn;var In=V.valueOrDefault,Fn=V.math.log10;var Ln={position:"left",ticks:{callback:rn.formatters.logarithmic}};function On(t,e){return V.isFinite(t)&&t>=0?t:e}var Rn=xn.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t0){var e=V.min(t),n=V.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}}))}else for(t=0;t0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(Fn(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:On(e.min),max:On(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=In(t.min,Math.pow(10,Math.floor(Fn(e.min)))),o=Math.floor(Fn(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(Fn(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(Fn(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10===++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(ne.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(Fn(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;xn.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=In(t.options.ticks.fontSize,z.global.defaultFontSize)/t._length),t._startValue=Fn(e),t._valueOffset=n,t._valueRange=(Fn(t.max)-Fn(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(Fn(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),zn=Ln;Rn._defaults=zn;var Nn=V.valueOrDefault,Bn=V.valueAtIndexOrDefault,En=V.options.resolve,Wn={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:rn.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Vn(t){var e=t.ticks;return e.display&&t.display?Nn(e.fontSize,z.global.defaultFontSize)+2*e.backdropPaddingY:0}function Hn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:ta?{start:e-n,end:e}:{start:e,end:e+n}}function jn(t){return 0===t||180===t?"center":t<180?"left":"right"}function qn(t,e,n,i){var a,r,o=n.y+i/2;if(V.isArray(e))for(a=0,r=e.length;a270||t<90)&&(n.y-=e.h)}function Yn(t){return V.isNumber(t)?t:0}var Gn=Sn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Vn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;V.each(e.data.datasets,(function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);V.each(a.data,(function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))}))}})),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Vn(this.options))},convertTicksToLabels:function(){var t=this;Sn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map((function(){var e=V.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""}))},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,n,i,a=V.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;er.r&&(r.r=f.end,o.r=h),g.startr.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Yn(a),r=Yn(r),o=Yn(o),s=Yn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(V.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this.min,n=this.max;return this.getPointPositionForValue(t||0,this.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=Nn(s.lineWidth,o.lineWidth),u=Nn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Vn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=V.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=Bn(i.fontColor,s,z.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=V.toDegrees(h);e.textAlign=jn(c),Un(c,t._pointLabelSizes[s],u),qn(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&V.each(i.ticks,(function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=Bn(e.color,i-1),u=Bn(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=V.options._parseFont(n),s=Nn(n.fontColor,z.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",V.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:V.noop}),Xn=Wn;Gn._defaults=Xn;var Kn=V._deprecated,Zn=V.options.resolve,$n=V.valueOrDefault,Jn=Number.MIN_SAFE_INTEGER||-9007199254740991,Qn=Number.MAX_SAFE_INTEGER||9007199254740991,ti={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ei=Object.keys(ti);function ni(t,e){return t-e}function ii(t){return V.valueOrDefault(t.time.min,t.ticks.min)}function ai(t){return V.valueOrDefault(t.time.max,t.ticks.max)}function ri(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function oi(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),V.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),V.isFinite(o)||(o=n.parse(o))),o)}function si(t,e){if(V.isNullOrUndef(e))return null;var n=t.options.time,i=oi(t,t.getRightValue(e));return null===i?i:(n.round&&(i=+t._adapter.startOf(i,n.round)),i)}function li(t,e,n,i){var a,r,o,s=ei.length;for(a=ei.indexOf(t);a=0&&(e[r].major=!0);return e}(t,r,o,n):r}var di=xn.extend({initialize:function(){this.mergeTicksOptions(),xn.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new an._date(e.adapters.date);return Kn("time scale",n.format,"time.format","time.parser"),Kn("time scale",n.min,"time.min","ticks.min"),Kn("time scale",n.max,"time.max","ticks.max"),V.mergeIf(n.displayFormats,i.formats()),xn.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),xn.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=Qn,f=Jn,g=[],p=[],m=[],v=s._getLabels();for(t=0,n=v.length;t1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?li(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ei.length-1;r>=ei.indexOf(n);r--)if(o=ei[r],ti[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ei[n?ei.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ei.indexOf(t)+1,n=ei.length;ee&&s=0&&t0?s:1}}),hi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};di._defaults=hi;var ci={category:_n,linear:Dn,logarithmic:Rn,radialLinear:Gn,time:di},fi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};an._date.override("function"==typeof t?{_id:"moment",formats:function(){return fi},parse:function(e,n){return"string"==typeof e&&"string"==typeof n?e=t(e,n):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,n){return t(e).format(n)},add:function(e,n,i){return t(e).add(n,i).valueOf()},diff:function(e,n,i){return t(e).diff(t(n),i)},startOf:function(e,n,i){return e=t(e),"isoWeek"===n?e.isoWeekday(i).valueOf():e.startOf(n).valueOf()},endOf:function(e,n){return t(e).endOf(n).valueOf()},_create:function(e){return t(e)}}:{}),z._set("global",{plugins:{filler:{propagate:!0}}});var gi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function mi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a0;--r)V.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function _i(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,p=i.spanGaps,m=[],v=[],b=0,x=0;for(t.beginPath(),o=0,s=g;o=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||z.global.defaultColor,o&&s&&r.length&&(V.canvas.clipArea(u,t.chartArea),_i(u,r,o,a,s,i._loop),V.canvas.unclipArea(u)))}},wi=V.rtl.getRtlAdapter,Mi=V.noop,Si=V.valueOrDefault;function Ci(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}z._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;el.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding})),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],p=n.padding,m=0,v=0;V.each(t.legendItems,(function(t,e){var i=Ci(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(p+=m+n.padding,f.push(m),g.push(v),m=0,v=0),m=Math.max(m,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}})),p+=m,f.push(m),g.push(v),l.width+=p}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Mi,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=z.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=wi(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Si(n.fontColor,i.defaultFontColor),g=V.options._parseFont(n),p=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var m=Ci(n,p),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},x=t.isHorizontal();d=x?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},V.rtl.overrideTextDirection(t.ctx,e.textDirection);var y=p+n.padding;V.each(t.legendItems,(function(e,i){var f=c.measureText(e.text).width,g=m+p/2+f,_=d.x,k=d.y;h.setWidth(t.minSize.width),x?i>0&&_+g+n.padding>t.left+t.minSize.width&&(k=d.y+=y,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&k+y>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,k=d.y=t.top+b(o,s[d.line]));var w=h.x(_);!function(t,e,i){if(!(isNaN(m)||m<=0)){c.save();var o=Si(i.lineWidth,r.borderWidth);if(c.fillStyle=Si(i.fillStyle,a),c.lineCap=Si(i.lineCap,r.borderCapStyle),c.lineDashOffset=Si(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Si(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Si(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Si(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=m*Math.SQRT2/2,l=h.xPlus(t,m/2),u=e+p/2;V.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,m),e,m,p),0!==o&&c.strokeRect(h.leftForLtr(t,m),e,m,p);c.restore()}}(w,k,e),v[i].left=h.leftForLtr(w,v[i].width),v[i].top=k,function(t,e,n,i){var a=p/2,r=h.xPlus(t,m+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(w,k,e,f),x?d.x+=g+n.padding:d.y+=y})),V.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Ai(t,e){var n=new Pi({ctx:t.ctx,options:e,chart:t});ge.configure(t,n,e),ge.addBox(t,n),t.legend=n}var Di={id:"legend",_element:Pi,beforeInit:function(t){var e=t.options.legend;e&&Ai(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(V.mergeIf(e,z.global.legend),n?(ge.configure(t,n,e),n.options=e):Ai(t,e)):n&&(ge.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ti=V.noop;z._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Ii=X.extend({initialize:function(t){V.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ti,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ti,beforeSetDimensions:Ti,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ti,beforeBuildLabels:Ti,buildLabels:Ti,afterBuildLabels:Ti,beforeFit:Ti,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(V.isArray(n.text)?n.text.length:1)*V.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ti,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=V.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=V.valueOrDefault(n.fontColor,z.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(V.isArray(g))for(var p=0,m=0;m=0;i--){var a=t[i];if(e(a))return a}},V.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},V.almostEquals=function(t,e,n){return Math.abs(t-e)=t},V.max=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.max(t,e)}),Number.NEGATIVE_INFINITY)},V.min=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.min(t,e)}),Number.POSITIVE_INFINITY)},V.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},V.toRadians=function(t){return t*(Math.PI/180)},V.toDegrees=function(t){return t*(180/Math.PI)},V._decimalPlaces=function(t){if(V.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},V.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},V.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},V.aliasPixel=function(t){return t%2==0?0:.5},V._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},V.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},V.EPSILON=Number.EPSILON||1e-14,V.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map((function(t){return{model:t._model,deltaK:0,mK:0}})),h=d.length;for(e=0;e0?d[e-1]:null,(a=e0?d[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},V.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},V.niceNum=function(t,e){var n=Math.floor(V.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},V.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},V.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(V.getStyle(r,"padding-left")),u=parseFloat(V.getStyle(r,"padding-top")),d=parseFloat(V.getStyle(r,"padding-right")),h=parseFloat(V.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},V.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},V.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},V._calculatePadding=function(t,e,n){return(e=V.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},V._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},V.getMaximumWidth=function(t){var e=V._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-V._calculatePadding(e,"padding-left",n)-V._calculatePadding(e,"padding-right",n),a=V.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},V.getMaximumHeight=function(t){var e=V._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-V._calculatePadding(e,"padding-top",n)-V._calculatePadding(e,"padding-bottom",n),a=V.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},V.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},V.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},V.fontString=function(t,e,n){return e+" "+t+"px "+n},V.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;on.length){for(o=0;oi&&(i=r),i},V.numberOfLabelLines=function(t){var e=1;return V.each(t,(function(t){V.isArray(t)&&t.length>e&&(e=t.length)})),e},V.color=k?function(t){return t instanceof CanvasGradient&&(t=z.global.defaultColor),k(t)}:function(t){return console.error("Color.js not found!"),t},V.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:V.color(t).saturate(.5).darken(.1).rgbString()}}(),tn._adapters=an,tn.Animation=Z,tn.animationService=$,tn.controllers=$t,tn.DatasetController=nt,tn.defaults=z,tn.Element=X,tn.elements=_t,tn.Interaction=ae,tn.layouts=ge,tn.platform=Fe,tn.plugins=Le,tn.Scale=xn,tn.scaleService=Oe,tn.Ticks=rn,tn.Tooltip=Ue,tn.helpers.each(ci,(function(t,e){tn.scaleService.registerScaleType(e,t,t._defaults)})),Li)Li.hasOwnProperty(Ni)&&tn.plugins.register(Li[Ni]);tn.platform.initialize();var Bi=tn;return"undefined"!=typeof window&&(window.Chart=tn),tn.Chart=tn,tn.Legend=Li.legend._element,tn.Title=Li.title._element,tn.pluginService=tn.plugins,tn.PluginBase=tn.Element.extend({}),tn.canvasHelpers=tn.helpers.canvas,tn.layoutService=tn.layouts,tn.LinearScaleBase=Sn,tn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(t){tn[t]=function(e,n){return new tn(e,tn.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}})),Bi})); diff --git a/data/www/filesaver.min.js b/data/www/filesaver.min.js new file mode 100644 index 0000000000..1f18dbdfd2 --- /dev/null +++ b/data/www/filesaver.min.js @@ -0,0 +1 @@ +(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)}); \ No newline at end of file diff --git a/data/www/index-ie.html b/data/www/index-ie.html new file mode 100644 index 0000000000..9860bfa5fe --- /dev/null +++ b/data/www/index-ie.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + Marlin WebUI + + + +
+

Sorry, but MS Internet Explorer browser is not supported by this web application.
Please upgrade to Edge or use another browser

+


+

Marlin WebUI

+
+ + diff --git a/data/www/index.html b/data/www/index.html index d3291de8de..54bcc13d73 100644 --- a/data/www/index.html +++ b/data/www/index.html @@ -1,37 +1,749 @@ - - + + - - Marlin - - - - + + + + + + + + + + Marlin WebUI + + + + + + + -
- - - -
-
-
    + + + + + + + + -
    -
    - - + +
    +
    +
    + + +
    + Marlin WebUI by atbox.tech + + MarlinLogo +
    + + +
    +
    + Disconnected
    - -
    -
    - - -
    -
    - #controls + +
    + + +
    + +
    +
    +
    +
    +
    Printer status
    +
    +
    + Printing status
    Idle
    +
    +
    + Printing timer +
    Remain: 0:45:12
    +
    Estimated: 1:12:34
    +
    Elapsed: 0:00:00
    +
    +
    + Printing progress: +
    10%
    +
    1 of 123456
    +
    +
    +
    +
    +
    +
    Temperatures
    +
    +
    + Auto temperature detection +
    + + +
    +
    + + + + + + + + + +
    +
    +
    Sensor
    +
    + + + +
    Hotend (extruder) sensor
    Bed sensor
    +
    +
    +
    +
    +
    Detected
    +
    + + + +
    -
    -
    +
    +
    +
    +
    +
    Set
    +
    + + + +
    -
    -
    +
    +
    +
    +
    +
    Unit
    +
    + + + +
    -
    -
    +
    +
    +
    +
    +
    Chart display
    +
    + + + + + + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    Hotend fan speed
    +
    + + + + + +
    + + + + + + + + + + + + + +
    Current fan speed
    -
    Set fan speed
    -
    + + + + + + + + + + + + + + +
    OFF10%20%30%40%50%60%70%80%90%FULL
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    + +
    +
    Home positioning
    +
    + + + + + + + + + + + + + + + + + + + +
    All axisX axisY axisZ axis
    +
    +
    + +
    +
    Movements
    +
    +
    +
    + + +
    + + +
    +
    +
    + Move on X axis + + +
    +
    + Move on Y axis + + +
    +
    + Move on Z axis + + +
    +
    +
    +
    + +
    +
    Steppers locking
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + Lock/Unlock all steppers (X, Y, Z, E) + + +
    X stepperY stepperZ stepperE stepper
    + +
    +
    +
    +
    +
    +
    + +
    +
    Filament
    +
    +
    +
    + +
    +
    + + +
    + +
    +
    +
    +
    +
    Upload...
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + + + +
    +
    +
    Filename (DOS8 Format)
    +
    -
    +
    +
    +
    +
    File size
    +
    -
    +
    +
    +
    +
    GCode Lines
    +
    -
    +
    +
    +
    +
    File processing
    + + + + + +
    +
     
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    SD Content management
    +
    +
    + +
    + + +
    +
    +
    +
    +
    Selected file:
    + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    Files:
    0
    +
    Folders:
    0
    + SD File list +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    +
    + GCode checksum value: +   +
    +
    + +
    +
    + +
    +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/www/jquery-3.5.1.slim.min.js b/data/www/jquery-3.5.1.slim.min.js new file mode 100644 index 0000000000..36b4e1a137 --- /dev/null +++ b/data/www/jquery-3.5.1.slim.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(g,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,v=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),m={},b=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},w=g.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function C(e,t,n){var r,i,o=(n=n||w).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function T(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",E=function(e,t){return new E.fn.init(e,t)};function d(e){var t=!!e&&"length"in e&&e.length,n=T(e);return!b(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+R+")"+R+"*"),U=new RegExp(R+"|>"),V=new RegExp(W),X=new RegExp("^"+B+"$"),Q={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),TAG:new RegExp("^("+B+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+I+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,G=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+R+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){C()},ae=xe(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{O.apply(t=P.call(d.childNodes),d.childNodes),t[d.childNodes.length].nodeType}catch(e){O={apply:t.length?function(e,t){q.apply(e,P.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(C(e),e=e||T,E)){if(11!==d&&(u=Z.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return O.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&p.getElementsByClassName&&e.getElementsByClassName)return O.apply(n,e.getElementsByClassName(i)),n}if(p.qsa&&!k[t+" "]&&(!v||!v.test(t))&&(1!==d||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===d&&(U.test(t)||_.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&p.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=A)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+be(l[o]);c=l.join(",")}try{return O.apply(n,f.querySelectorAll(c)),n}catch(e){k(t,!0)}finally{s===A&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[A]=!0,e}function ce(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)x.attrHandle[n[r]]=t}function de(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in p=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},C=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:d;return r!=T&&9===r.nodeType&&r.documentElement&&(a=(T=r).documentElement,E=!i(T),d!=T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),p.scope=ce(function(e){return a.appendChild(e).appendChild(T.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),p.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=ce(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=J.test(T.getElementsByClassName),p.getById=ce(function(e){return a.appendChild(e).id=A,!T.getElementsByName||!T.getElementsByName(A).length}),p.getById?(x.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=p.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},x.find.CLASS=p.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(p.qsa=J.test(T.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+R+"*(?:value|"+I+")"),e.querySelectorAll("[id~="+A+"-]").length||v.push("~="),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+R+"*name"+R+"*="+R+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+A+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+R+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(p.matchesSelector=J.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){p.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",W)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=J.test(a.compareDocumentPosition),y=t||J.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e==T||e.ownerDocument==d&&y(d,e)?-1:t==T||t.ownerDocument==d&&y(d,t)?1:u?H(u,e)-H(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==T?-1:t==T?1:i?-1:o?1:u?H(u,e)-H(u,t):0;if(i===o)return de(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?de(a[r],s[r]):a[r]==d?-1:s[r]==d?1:0}),T},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(C(e),p.matchesSelector&&E&&!k[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){k(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&V.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return b(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||L,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:j.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:w,!0)),k.test(r[1])&&E.isPlainObject(t))for(r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=w.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this)}).prototype=E.fn,L=E(w);var q=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;le=w.createDocumentFragment().appendChild(w.createElement("div")),(ce=w.createElement("input")).setAttribute("type","radio"),ce.setAttribute("checked","checked"),ce.setAttribute("name","t"),le.appendChild(ce),m.checkClone=le.cloneNode(!0).cloneNode(!0).lastChild.checked,le.innerHTML="",m.noCloneChecked=!!le.cloneNode(!0).lastChild.defaultValue,le.innerHTML="",m.option=!!le.lastChild;var he={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ge(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&S(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|&#?\w+;/;function me(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function Le(e,t){return S(e,"table")&&S(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n
      ",2===ft.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(m.createHTMLDocument?((r=(t=w.implementation.createHTMLDocument("")).createElement("base")).href=w.location.href,t.head.appendChild(r)):t=w),o=!n&&[],(i=k.exec(e))?[t.createElement(i[1])]:(i=me([e],t,o),o&&o.length&&E(o).remove(),E.merge([],i.childNodes)));var r,i,o},E.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=E.css(e,"position"),c=E(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=E.css(e,"top"),u=E.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),b(t)&&(t=t.call(e,n,E.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===E.css(e,"position"))e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=Fe(m.pixelPosition,function(e,t){if(t)return t=We(e,n),Ie.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0=0&&/(rv)(?::| )([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[],c=/(ipad)/.exec(a)||/(ipod)/.exec(a)||/(windows phone)/.exec(a)||/(iphone)/.exec(a)||/(kindle)/.exec(a)||/(silk)/.exec(a)||/(android)/.exec(a)||/(win)/.exec(a)||/(mac)/.exec(a)||/(linux)/.exec(a)||/(cros)/.exec(a)||/(playbook)/.exec(a)||/(bb)/.exec(a)||/(blackberry)/.exec(a)||[],d={},e={browser:b[5]||b[3]||b[1]||"",version:b[2]||b[4]||"0",versionNumber:b[4]||b[2]||"0",platform:c[0]||""};if(e.browser&&(d[e.browser]=!0,d.version=e.version,d.versionNumber=parseInt(e.versionNumber,10)),e.platform&&(d[e.platform]=!0),(d.android||d.bb||d.blackberry||d.ipad||d.iphone||d.ipod||d.kindle||d.playbook||d.silk||d["windows phone"])&&(d.mobile=!0),(d.cros||d.mac||d.linux||d.win)&&(d.desktop=!0),(d.chrome||d.opr||d.safari)&&(d.webkit=!0),d.rv||d.iemobile){var f="msie";e.browser=f,d[f]=!0}if(d.edge){delete d.edge;var g="msedge";e.browser=g,d[g]=!0}if(d.safari&&d.blackberry){var h="blackberry";e.browser=h,d[h]=!0}if(d.safari&&d.playbook){var i="playbook";e.browser=i,d[i]=!0}if(d.bb){var j="blackberry";e.browser=j,d[j]=!0}if(d.opr){var k="opera";e.browser=k,d[k]=!0}if(d.safari&&d.android){var l="android";e.browser=l,d[l]=!0}if(d.safari&&d.kindle){var m="kindle";e.browser=m,d[m]=!0}if(d.safari&&d.silk){var n="silk";e.browser=n,d[n]=!0}return d.name=e.browser,d.platform=e.platform,d}return window.jQBrowser=b(window.navigator.userAgent),window.jQBrowser.uaMatch=b,a&&(a.browser=window.jQBrowser),window.jQBrowser}); \ No newline at end of file diff --git a/data/www/marlin-logo-dark.png b/data/www/marlin-logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f5e9e3375529761b07d0f02c461269e39ec8a6 GIT binary patch literal 881 zcmeAS@N?(olHy`uVBq!ia0vp^DL|~q!VDzuMhfo$Qq09po*^6@9Je3(KLBzK0(?ST z|C0#(*6(lt>J=yn@(X4VR5Er6O)Kx1xoY>ByYK#&O=T1X%5fHWL>2>W69!>M+qCB6 zKtY)j*NBqf{Irtt#G+IN$CUh}R0X%pqSW&IqU>S?=U}rJdp7kjFfdK=ba4!^=$(4i zH$&J_gyF$-wOnDx88$AGcX(Vs-3hJ6aOr~-r;@spFMZKJY+AZ@0#^|qSeEmsRwyvi~C3qQ{{FP)R^@@>EG$u{p`m8Scy<$S9Rk4yeJ zwzTr<+c?EeWtB7gTW7X;GQCth{?Xh)eH~NI{IhYUNB2GFPF8zqS>Cj(Uh%iai%Y6A z4^3uZ{NwfYrE5W8>akRzxg|S=-W*odnx7@Pl*KzFY;Ma(ZhlYCBRh`>eSIP}f6x5| z9QN|P8h>wa@TBW}U zrjNo^n)WknyAbhX=MJ7ejZX~cn`XCbBq|rq%bXr3R#$WKtB=+s!(R*Mo^+Gm>5|Hj zAu8w=wbA*zdzK1^>}!GcFwVB8ULQ==3+FYP9&uJRKKXa{g;$210Y`dIyIks8W2T^L zE>+IYy|yYNWD=jwait$Av(q@bb^f{DGBM%0EVXV$=-VqFj~lFea`BYV2El{frb|z* zd^Y1y*UwoIkvU6r<`|0^ZfAXQ_4K3_I*An?-8P=@ll+UCPR-lHcA@r_+n1V2Nk02b ztJlAO5Ej&6?3sTw)8f`AJGH|fzu1>~OU?^f=n2s4dUHx3vIVCg!0NqZOp#T5? literal 0 HcmV?d00001 diff --git a/data/www/marlin-logo.png b/data/www/marlin-logo.png deleted file mode 100644 index d0ce790141c7ff77bead81d5ba6777692102a242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2349 zcmV+|3DWk7P)9M000McNliru;szBG0~IEXf)W4#2)ao` zK~#9!?VNjz9aSC2KQnvpKD*08L8RN(x^z(x5EaE#t)cPJpr(jV6a^KDKzyWHwJHXD zRURgSQN#z0FMPls619qoU<(p0iMS|Ki;xBcyDhW}`|9rAx&ATVYflbmX3oscmR@py z$t2y`Ij`UI`}_UQHsHxr0geaG2UY_MfQY$MRdYYxDA3u$lI9A_-kkaGMZg9L_Ito4 z;1MkvNYJxD%^EwccWG4DH#64QW~X{d^HhPefUnHgMvn*XmSDSR(NjTfz*;FySq}h9 zB;1QyJbucl0(@MavJ?SVfu8{1Zt?b@p(?Omp>NItelhT0puNS{gNi!jQK#l2;5Oi5 z;CH|+EuQ9bqf3D23YabidVw*y)-tFDY?Yu+kyRI>d$iHKU|Al!t(y1N3myoPWXy#=glzz0&kUkH55TH{s+U;+3j z@DHVR6U3dVMu+MNfx8=l6Ah+k(Oabyk1DP;x@FT6^23_*Ss51mC*b+k+@DmQJR)VC zkQYm$6;dYie6!lixc2yKc}r6{zou`UAS=y9pXwNJVFtslwrZ#~X=EB`xZGOfPU{ez zz)vN_EMO4<{|3(X5bkGzT^@7RfPbm1nUAIIgS(KOnMXW11T23<0`t?sJveSnJ!7dtF50W1v;-Z-0djv zW#Zd5SlNcF-f$N1vqlV#O19v70inBo-zlKgZM{ENDVb}IO-i|JSN&4s=c@8klePo* zC+zJ8M@ltBd2PX?9G>Jl$9H1_a{H|J-3jxa4Mce@n0d0`$l>M}%UVpjQ^H81N#HvP z#fAoTIpW1Mee(9;E7$t%@jKvv=uC}*vdVgV|3TnO!dSpcil%7W|m1N9JLBfX}GD>+3-R>s`&W_>e|5A$J>H_ZQ$# z#UsuhFc&=^0!~BGHxk#1&0OzH9qKxjBqtOXXA~P<+TSPT=w|x+A^lwp{XE#GRi{kbJ$i zM`MZ>8;UT08*%&eTAticY1flC-gjs4w#yS_4FJ0;0tIIf-?*^pUgDnVLQTGpxZ$2g zo8=xVhIQ`DK%}=DOll);+&^r6cfaD=CdI9ziR-XkV&s%!VvYFktY$nJS^@q}a@Quy zTMZL8I)0=uuv7+fpN!{9?XT`>jk{Ak+TG$oyUzD0$+t~j4QvU3R}%LkmpYgdD6VuE z8a_^Xcc@Ea0?$%lV@$Wfgqqfw&Bz}+*xx&D+{(l=T`_4Uqnecmxi-Aqn11fe=^Y}0 zu%x)!Z7A0i?pAC?NPbO&Q9mcX5zwNi2YrM1>eT;3-yrd=`%kxc)AY1n*kGCMieI3Z zyOGvk_%|bU3dh_-+$Rofh#e5O=q^)X;2Pqa0lV?*lGIx~o>vMI0O|noMTc`$6#5kV z|9;FlsH#fO`M_)N`(JiK#q!`FW=_RJQOm9glu5G&2yXmmIE~ij7J1%nHZc7k4;42@ T+d1LH00000NkvXXu0mjf*M?Xq diff --git a/data/www/marlin.css b/data/www/marlin.css deleted file mode 100644 index b29ec2e24c..0000000000 --- a/data/www/marlin.css +++ /dev/null @@ -1,166 +0,0 @@ -/* CSS reset */ - -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; - font-family: Impact, Charcoal, sans-serif; - } -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; - } -body { line-height: 1; } -ol, ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, -q:before, q:after { content: ''; content: none; } -table { - border-collapse: collapse; - border-spacing: 0; - } - -/* Custom */ - -/* Tabs */ -* { box-sizing: border-box; } -body { - display: flex; - justify-content: center; - padding: 0px; - background: #1e1e1e; - color: #efefef; - } -h1 { - margin: 0; - font-size: 2em; - } -.tabs { - display: flex; - width: 100%; - flex-wrap: wrap; - background: #e5e5e5; - } -.input { - position: absolute; - opacity: 0; - } -.label { - width: 100%; - padding: 18px 28px; - background: #e5e5e5; - cursor: pointer; - font-weight: bold; - font-size: 18px; - color: #7f7f7f; - transition: background 0.1s, color 0.1s; - border-style: solid; - border-width: 0 0 4px 0; - border-color: #acacac; - } -.label:hover { - background: #d8d8d8; - } -.label:active { - background: #ccc; - } -.input:focus + .label { - z-index: 1; - } -.input:checked + .label { - background: #1e1e1e; - color: #efefef; - border-width: 4px 0 0 0; - border-color: #65a57d; - } -.panel { - display: none; - width: 100%; - padding: 20px 30px 30px; - background: #1e1e1e; - color: #e5e5e5; - } -.panel .panel-content { - width: 100%; - max-width: 800px; - } - -@media (min-width: 600px) { - .label { width: auto; } - .panel { order: 99; } -} - -.input:checked + .label + .panel { display: block; } - -#logo { - width: 130px; - height: 58px; - margin-right: 20px; - background: url(marlin-logo.png) no-repeat center center; - } - -input[type="text"], textarea { - background-color: #2c2c2c; - border: solid 2px #314b3b; - color: #e5e5e5; - outline: none; - } - -input[type="text"]:focus, textarea:focus { - border-color: #4d7a5e; - } - -ul#serial-output { - width: 100%; - height: 300px; - overflow-y: scroll; - background-color: #2c2c2c; - border: solid 2px #314b3b; - } - -ul#serial-output li { - padding: 4px; - font-family: "Lucida Console", Monaco, monospace; - font-size: 0.8em; - } - -ul#serial-output li:nth-child(odd) { - background-color: #3c3c3c; - } - -div.form-wrapper { - display: flex; - width: 100%; - margin: 6px 0; - } - -div.form-wrapper input { - font-size: 1.2em; - padding: 4px 6px; - } - -div.form-wrapper input[type="text"] { - flex: 1 1 auto; - } - -div.form-wrapper input[type="submit"], -div.form-wrapper button { - border: solid 2px #314b3b; - background-color: #4d7a5e; - color: #e5e5e5; - } diff --git a/data/www/marlin.js b/data/www/marlin.js deleted file mode 100644 index 0a95045aff..0000000000 --- a/data/www/marlin.js +++ /dev/null @@ -1,24 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - const ws = new WebSocket(`ws://${location.host}/ws`); - - ws.onmessage = (e) => { - if (typeof e.data === 'string') { - let node = document.createElement('li'); - let text = document.createTextNode(e.data); - node.appendChild(text); - document.getElementById('serial-output').appendChild(node); - } - }; - - document.getElementById('serial-command-form').addEventListener('submit', (e) => { - e.preventDefault(); - - let value = document.getElementById('serial-command').value.trim(); - - if (!value) return; - - ws.send(`${value}\n`); - - document.getElementById('serial-command').value = ''; - }); -}); diff --git a/data/www/marlinui.eot b/data/www/marlinui.eot new file mode 100644 index 0000000000000000000000000000000000000000..7e25d5cab37932d4e808e87e2b9b33df7524003c GIT binary patch literal 9456 zcmd5?dvIJ=c|YHMzxMsOtJQl~yDM4N!+LG}h%M|`MkXO{64E4218ZqzDM%|tlC2Oz z5h12Y$O8;RTry0VPCOLaN$E@r4AWB6>CiDL(@t=Q%s9=sP?*k?x-dg1g+cD`J9pPo z6hrBMy}S3`^Zd?tzW4cdf7B(!+i{an1Ye5KZCOCe$B0X}9+R)2Q9c{>nXf-Hv8B0Q zjEV(O5zAs;%!!&fg{Kf$hJ|WWLZnP|m74$D+T!+{t`o$o|-e^9WdC`zq z7pgcmF>%*zPw)E7FNNsZiPn}Qw;Y}jJ)(@dhkD!XcMc5Qe);~t#-w{tzk6z-vea|% zz~5naEogh`WMyUP+BHBDT^jnWlk@MJ`TW?!-w{Fs0?j{}tyZS}6Tkm9^u30AY!(gL zfTCk=67{axh1G}MU#Oo){fnqSIKMbmd7=LgpA|y=d(@{FDi1G-N5zNGe-r8*waP+u zxuwOG)n_03Nl1v!KL<{?$-QBJ6VH5o=G~EfZwNQw#pT@29OestU;8;m z8nWH0vkIV?U%2`e5%fz)+|sx-*|JOgt_Zlw!%4P{*N2cI=wm_`7TroSXggAWzag5$ z;|#wc4{~OG62Fek9G({A;%(v)x^nFb;~+2K#8?4Pl%*QLC}4X0WGtl8Os>KQoK9}zey%;;EQqo z->#O{w)T!(zN=6yb@%M(?cdoqIIwk&s_915v~0)qIz!<|ES^ZF(tf5X3k3duUB_Tz zCg>%4RZ*0k%H7Ies)Op|TE8}{y{P?-c18E}oAhb@V}>yH84nwOYevmKF~4T*v>vdY zvR=2x>?iCC_7$hixx;zP&ARLE&%9^7S3~a%eKPcOa62m|=?C-`@L{(Qg;dfsdTBJD z%I8YOo0YPkDsw|_fJ`HgXK{4o0F4c`)96TfY%dM@=~nX7sU)2@bZg=0f~^@Zo*$2? zDrw3$zM<%<8dKD7IT`1$s%m4Js_s|6|CFg4wVI)uPtg-kP$H!&=g%u@O3`)tW6Roe zlcuPuqMaHcT?c+of!(Je1R+S5pdqZqn3Rg;kufy~T=F^7FiT_QvEiWz8N)+m-@pLc zpJ_>^n=|1MbsZf_w_BEx&N|_tfuZK^RG01fg=k;jKt>TQsitHy9Lo6J8{+t5t#-)t zcch!{e4?{G)tAm-edrQhrpu7q55TC6l!{m{>8FPd5MzQR&9t9JDWDHtl3u0aXsK8- z4Iql*NO?c;w>UsdRs!vSc^O?OG3M>4;Ufu}^3#5K43uTMnqlH^x}8Z)ld1H+bc!FJ zQ%D~%^@OLYRx+(?YPS{FG_uEaMYZBqw`!>cM^VU8RaY_f5uH%cMs+h1izAT9;n94lbF{OJcS3T% zvq8k+PEcj^H*BNAm%db^u8r5eys&UqH_VML)6nsz*MfIYHw}8tFm>HDHoEw&TlAWx z>$R?0VWF^b^(bT)k{i4}I%#punv@fs4qis^!d?ivH4fdHg=G`apX=(w{0_Lzn)5H0 zOwYWe>w~&!Yv;~swuvG&q2-ckSo(lrJpa654Cofqhu|4@(r4(u1DGr#5W!8&WYFm( zojZ4q0a~Vh$uKT4V1WF>x#t<+AOIVt#XSQiM*;+2vy(pBfVl|`;t4U8Ac5x@z>%{h zY)12vLApfTGR)`CVHd#l5*DrR{dVkqjqxl5x)D6DTM)VTH*FdK!vOI3mMxp#HjHlr zYk&lv4PAs(kO?JW>yu>jR4N{zlIf?V?ga`45<~x_8KaRvvm)e|VK}(L6J;-bqFU{- zJlC<-T|>8fP_uQzUAG+9l{E;5a-&{_MW@P>wXMT#ck5uCZq!FQydpe1U8Sq=f~~N; zzXdA6wy-fv!MebVjg!8l+SXdZ?J6hQ)30!fIQDW3y1*hbSj za12BgyO`8LT?jlLg{Zf2Kh)H59x+4V*wI)xWIp0J);*3lS(olf&#~7rcKtX5U~aSA z2W9No(2pE!NNKE8WQz|E(65vrbEe@-Zn3Gx2RjJ_j%_|HJ-Wd==wtoC zY&}3ppIKFR3xF;6NSAwh51N`9apQ42YTAb3yCFO5M%<=-O{D1x`B5w6`i5bfQ9B+9 zyQ-yYV3B2M4s@DrFATH-`fG}gpeAg1ngJhdAMEXEZ5tYVba1GxmBf)fds2#~>NmG| zq#3$nd+|gj*VNLk7^-cWCc$yLhSJ{Bl*_~uuI=guoJvw7GV~Cv39k}-RSUyCSVx5@ zYDYCqQ&M~O9NEw7@PeSJg1A-CQ}Eq!M2CXfAf!eP`af149bp|zsgPjMwOB&H0oqB) zr$e2^W2?uCovGh;qKER?Y&4b~$tL32Y@XD_{_Z`;j_v8*pZH!j>TKMWZR%=G`_|X~ z%FLwOx|*`E5g)`#kHLo^>ZP=)N(;c|!A!C(IKaL)aI-L+JM5-)y;oLA0kN79&eGsD2W;s=qz1?J_`W` zLstXy$$EGeZseK(oAh;9$#uHfV-JH88h|Du`!bysmw9d%+jI65z?0n@=E^zJ69L3O z1hX(1(GkzZnE*a>5xz!9BarW8`D#RJY$4f6DnccF;{~v@rm8ito~k;j)XX8-xQ=jZ z8s1o~VpICKiem!dlo6*z@D6Yb>4uMC+QqI@Fb3i+Y?~^Bym9@RH!ma?2fBcZ^9$@= zfG_Wr)ohDH=eQCoLsuo1z?emnv1Nc@z;zt!3rW-id_e`+Q>FtfVGKl&_HZ;7@Ex3H zxC?TFTPMqX(+X2(>sna9jxPimbhs0>z}GUy`4k&o>3jpX&Xj=^Gv_7uq~m1jBWi&p zG{R;~VZ2hqyidjmC�jg|K-+h9i?;>?B7eT?;U}mUdMC_1$Fr-^OnP2Y%orNyo9j z65bLwaP=)alQg`(2RhCOZo_v=mCj>78?U{21Jt!yXMW)f3%Nbc>u#Z|6y9wV?0gHY zeiiIZYHYz~6IZOH@Tr-eqcez0c0sZOj=tq|lOFw59rTKO#YXVmSD zhh3(}MAOKk#}kz>9eKK(Oi&SUp~pc-^Q2 zc%6}pZpY*X=#gDt82h-63=oqD2D=K7X1wkNvpy%~11YL{&;(oU2l`bUMLc!=!zUd` zHGCm@r7!G9pv!TZ3}{f2)*kK=&XGTC@%g>!4(s#Nv?mtvBe7U?!c%o!F)U5hG{e@S zVKbJ}V^Kd9k1ine>FG^H5wpWT8IfpfrZtj4;N~O}P5wT=DS=7^4hoTrp(MhQWV*dA z-(M`IefphDB<9324?c~M$kKC#-b722o6EROzT>51(P+G>x4Y=4HN}BTRY`Ti(L|;> z+uWQ<#9dtQo6XG~Z94ZVn$}gywdWG)a478;aZUx@#>F~apmmgBrxBg%rP%ldG+bEc zi*qXqax{W2g0>0qcF3YM9$QQy=%^+onXVHn57Gr6ru60qWE~EI5IpH3FxprTj?u*L z$*}8%A|X5KSZ0E~7GlKlW&vkIYMAZtvzltW3?i%M zHx1*PCXW9~x1lN~y=W@jqrQwdLw_0J=*tK}td}*=jAP3VoUg9X1^CSraz}zXb4Dtb zOv7)EVZEYWE|qtIkkym0|dAsP=QuE^#N zz>SL}{g8erWAibvry<3-u?Hvq!tSVGz$Jna>KJZS+Nj0jP*}|};&D35;i){oG1HL$q?eFyY~-4PXl3j9RR$~# z`@1DLKs1ENQ95x1Gn%rohKHseSMi1T(31$gp0dA-Y6ZxXrCM*LP^1yUS9 z-gr?0rTZJu0yt5gznP!%8Dogx2tvPnE<${mgcK&BYr{i{Sa5oTR&Z3A{}9B%hHG z40FZ;NR1U_T*%(21fT^43c&TK#`bRgVy(RnxY?S zzLt*0UT~w1-Rrs`Z!)$`e|B($U*KaXBN(J^17!zV@K$iFjUYy{t&GF0JYXP420;&8 zv~0MUlesbq3T*48_}-h2?I@Mn3cMX8n)o1CN;PF#i=7>5%~gyt_+ZvMx_9hpH19@p zeD7||?P-;BUs2w%YXD(Rflq@-Q89f=30UKJr`=>I+IJgmrACV?XT(}~Mqn>g_~mP~ zAtsRZ6O=EqsVI+)lt#H!M0z7kzRYmTLnQXa76f?d>f;)b}CArwr#&Z4X~Jd!bIi^C{yW%($-7?(}%6-G0W-J{bn=?rl!r~sMP77j*ruqUKtNEeUrh91i#H7^=+6hj*tJeRw#6Bw(vN#ob5vTy-=V@L$i*` zETYV$pKavOkxIuZ1v!v?n-K4!H|Sf~DSo<>XSIg4=fpI2#;J`GybIED%FT_;gft~- zdc(TUO(o+Sue(Ty-Rq=Nampdbb^P^gb2fgj5|3uzmFfC;rt8P1I~TScO|@)$&huO3r~RFBjPZyK{7CcI3U*wPiq?NW&L3viP@ntZ2R!g zC`3QV;{ekkHXyJf*YzmJS_RdjcR=F3d`I35x$Xg+ROE%@O#QkqX)c-gCd1~t-)%no zrrN)+RqlL|BP*(8UZgah?!p;oW%NoY~LA|Ww7vHbe%lzx` z>u>!##6o3xey(;3r_OEvinybC^3;3s!-S=`TvLxu?OYt|F8&J zcR`iQxQFlqHQ!=lv9>y~xO}qOG1NcUv8SW4Fp9hS%6&tFoXy-0OEgB|pA$F!i^kp6 z<(0X`TF0*bUq4;SxnzcX1bo@73(ix3zR0^GVW%M%W{^o1+2oK*9))1ABNU|=#VJ8a zO2Oj7&QTL(shL`+6$ZPVI;fL!;LCqfp1P2!EK-TOsfTt@FYTm0ZFX^?s?F7A7S*Z6 zllp39<-IH3)NJ+i@?x!TdU36Gy)s{&Sq(LMmgi2+t~!m{sU@efyu7%!(pQ;ZHBK$f zFIJ}26P22Aa&C3@)CqTWwz|B4bylm(+KI*aRcmE&d9|;yGG)ucbaiDaGQU_m*(ag& z@k(3kj7D@zzg#@DrQy_)5v*_3(Ky{G%tk7;lk-*Vs^^B$9}Z)$FNYQ8$1 ztUf$7Us0e!xzuP#?sX7#1z zx!S6^T%B32uFPsn^QTT~YjZPm=F0rsG{nlCS)9kaZ*i$w3r#If^Ul_4Oz%K$2>;l? kK?@cBeJ_ohYbu1D5WNMK6)!nL{L_CN{t8#N{*UH=0F{sOWdHyG literal 0 HcmV?d00001 diff --git a/data/www/marlinui.svg b/data/www/marlinui.svg new file mode 100644 index 0000000000..aa582fab2d --- /dev/null +++ b/data/www/marlinui.svg @@ -0,0 +1,56 @@ + + + +Generated by Fontastic.me + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/www/marlinui.ttf b/data/www/marlinui.ttf new file mode 100644 index 0000000000000000000000000000000000000000..878b47fff9da8b744f02a54dec0acb6f0fa373f4 GIT binary patch literal 9288 zcmd5?dvIJ=c|YHMKlgF>aaXJNJ|)X~Skh`^*|8NnmXRUEO+uQ)X<#j_ECp$$=wXEr ziU=`HLP)?c#3jR&>BK{!os`bBz%VU!I~_VEW!eeukQt{L7YfsvQn$bfDH~WRLN58|E zGQ?QxkLRkD8UN((-iEQ)@r=!(Lm8A*tc|0cn_FCa)c(2r1+>3}_QMNH)0Gzoe*Zbf zRYJh(D(fE((2lCPyE@o13e{N%yMlCp*#)LGncGkf< z0XM_4EQdV`tjKyGU%OZz8^D}?HpB)2UjfxL7GXMIo6KT1b67WIG{nLz3e00H&Jrxi ze3k+&)2tQSXj?=C;W>G4{BWHAw@+JpM`u?io68r9J-xg726p!k4Q^i}E28D!KK;Zw^=Q#T~P14Ksnj}fPrF*46mxtshl>uc=c}e+e<%;U4x2QAf z$2F$y*B;gWMvv%!q<`JmZ9HT=W4vLGnNOJ)%qv!hb(i&oowhgapE}PuuetAZKjr=m zluffK`T>0veAvraJ`vZoJ}PAs*-Wu;t5o(AW!{k)BwfqmT_}wnq_N>nDvg%M_R+AP zY$rdNh|_sZH5QL8nu_+)`H843lOlcN8q|E6iJpPWqp)X75F^^SvU;=a3NichOrmNq*y4Aj>#F| zlFjIvUK}frjSPoL8yPP98Ya+zR9igRnhLp;J2sr`Gz=}7wnD>$!>v7uoay-aNPque zN@8t^mUukmru?2dJMl!j>FWNjWXs)8b$2HElPT;EU82i$8FKpp7`4%20sF=MbscKoz0H;ct z(jm*4kfbUSxvCPDoQNSyYOo^Y#AAx4I9_7sikwSWA-Rg`%ApWez)CPS1v`5gRznB9 zJJ|?33Yi=!WsBXV?lQ`l;C^?Lh$G#gO6k|^qx_e@T%%n5^{*^0o>euyp3^lICA}V$ zL0i}8bxl`QU90DKsT%aUp{li9Ex(wrUp)rdh2#dsN2d(lGN#0WXM;iu3Y>+YTNBW& zIaoFZ{kg6_oZkW0x#s-yCEd|4sp^obo65O!im9VYE$F$VYlb?gX)nB>X@jc4=|k`g zyXmv^-vLZ6A`rnX&E%kyaXNSI90zFV>LpFP!~p~37tg)G0S*DMrW<@@Q0I{V!Po4j zk2Ya$L4$ZgOa(~bc?NLAY5|+0c}XKxAZ}>-3+HeO;Ccz0HqL%0&c4C%%m=y=ysujj zarPSy4S*p4cyim3^>1t1w}CZ40?(!{LMljyl5p!2=jN$cI7mg^PYT@&6bvMW{s}Wi zqk(3H$uGlj@CIKfM(LB)YOmqgma%DTs@aQ{scQD7VcE85K{%wFjY?c}s(i7seY$CH zpRCf&#z=)%glDI#bQNB(9hUbuKqc4~Zp;#}E-+(b<-pePCT}I;TDChAoNXV$IN%iM z9)SiFKmx7=f)KY-HUnyK8%>+QF%VIlVoC*dA@F$RBToH6sHtT=rn{l&v1rKEAG0ju zKFgVENcWUunVXoqd4dDr+~#s0)Nx`>J$k~9MC=oe0dr&9co|9vtrgsbw4(_A(LA3j^9Pm%?BQdnk+`?B0v1*9wDOZEeX!s{Xy# zdIomA4f1$88gEVSE<9A&ooMLODd6&kWNAng1Ka1_`GL(Lsa@GXrN$BG4R@!#{p8HQp(r@8HgftEmjMN$#egfvId;DgOWeZB1+ z!$Xe`4R^E?J32m|kQ7wHju*NUziCAdXVd9OG(DP*dFgbPA49@1n*8hV6?RC-9$>VKvaXeR%ljbv5-H;f^I zB<0CA5sVV6QJ&7yMd&kQU@&wwFrQox&%%vdV_=iI2`jltw>sRzpoR{hiO9Z8XW3=G zHplHb_Y}aByEm*AYlJ5Ph`$e3VKJg3z7}@^_{=5v8YYZDwwudWGg9Lgk~>L>$)wg_ z1UqZ8Tm$Q=s*+5tJS3Y?5pK=E8_QK3N}Z5#O(5JdJX!+p05_j(`WQ~T=yeK4LA=Es zOGS`3p?>Vfjl||a7jSWZf!z!6uH)F)NT43z z3o5{#ayq~gMnME&4@=R2@8C3tyC@F0eX%$;J^>uBX*UZqQ*9Cws6Hx62CRm^K=Gr$sR~{z|ptdZjz;6 zHbBqIVXi96%Uu1#vU~;s@fmq%Ct}_+^3!6%BabvjG3$){up)tBA;fmFj6VpRCT0R*}{P7?tQYQoyXJ;FKiFSq!-+;WGF z^+_6!hW&6f8kuxtRh2YDkrhQVl}JdBCe&!ePk50V+h== zSggh0@3+Lz2*W`ka?zw%C>&3Ac4P+%g``ivl?q3#XzJl-5fT|{Cf^rpYq2vayT!Mh zWHb`-TKakleo~PvxKx>BD-?;PTGOqqshDTu1HakY+SQ@*QAts9#Y|@=mJGQ`zkqux z=r+MN=>lz{20M-DR4qm)E}-MWCjaokG1u1VISibP*WUH-l?5@p39;J8sxDBbK4ZC>=}0;!a412e%`p9o^a8>dE5c z!8gG8?(%aX*KtifWVvp*HSai1Bd|CLrqaK9Vhs(1rSD$cwqO>BeI9Pfkp9 zz2`kwHo+h-RKI{OmnPiU717-VxE_ns59x;@HXj3fni35|&hHQYwkW+c%7d745oRBn zDv}XCQ~;+N`9)>&hbBvWE@Bb|M}1e{e%-1Z#Kg2}cudH2TgG&W~(nUSvC?$ieaK zO=+|MpQqt&)3_cK%Rx_qN221wAjgEliSPtxi9v{PI?8KsiC~00hKJy647?sde zF59+j8Fu}cZCJ8xUzRP)v#bp);H$tadFjKlrpX_cc%9sO&GVqJilKQPo#o-FxW93x zA^%A)Bj4D}H3iYi_WP>{Seo{CTX2AA2$7?3;s|CGslI`iBA<})2l1h&5xAY;NeH>V zftM!J)BHRqq9%a3XyDR({Io7()a{5&C5_Vd9rbNMRhh zHZmNG2De9O1&=C||N13WZRdBxkL*X3p|-2)DI^L0YbaB{ni(3(ke3VvK<^Hm-ZRJtQG0Zssm{p3X(S9=@xL{2ac4f@Ia5nF|r}HuDz^EfN84?J7SrAw(UAo(H;7;i%0l*ehuXa2C3UX*?|_k z6&!0bh!Jcn<1#BQ7|4-9&;u7OI&S63ToDBYw)K*?@0R1cip7pRKMoR2{32LPw4~Y# z-Caq=mb5bXpf?73c8xc?_oCa|w-;-B+r`>frMK@HM3|H3w?U++IDLvSSYxl-Y|$j; zyUo60vqu&yqHTOdU@v6&$Z(5GB+kVx2=W%f zuyEJi0nr764^k3I>;qzPklTb!3|3;csEqJ+N%{$yX)8J4Tb7kJQ~utB(`$7~zK=M~ z>Guz(d|x%wCYh$<*fx4@_kG`WrT*0(H?D?L=Alqe=#fw;)tRs?K=S*26SLE1B0`@r zO@AN>uvnc6s|lxPwO>jd@*Uf8b_4KXfaY^8h4Z}Mr<8vvW!qAx)$1ho`YAL0bO^9} zLaA^9vjDB%2Q4~=z|>AUC>3>>2axM}hmJmBb8+E+ z{HG6CR+nW?er?i3X-)0B%Y4Tzw$*J~Ju|(g*=?P(N|xQ;-QMNcCHmYwmWkOD6PRpT z?--Luu-Y`TSp(glHcP-KZdq{o_ysMXebJG+xhZ#j`Il_9Mnx7iRy zFl9vaV~p^~HyKxN(&uwnc%GhVXw+1oQm211F+pE`bt1_0O$7xpUg|;WThm{fnD|L8 zpU-Xe@OkJtn?w3NpQkBJF^-8WqR6D5ZRXICO2;mFF_HT=#@=`c4Sup-y>D8sc1szq;y#5>uptnJ$NLEKct z2iKX#=YhDstm7{p(%=1V{ka=j|H6elb2=J5opD{;xxSkE`2swlIA4UNH#E5waM-6| zWci2itE|_kOZe5LuThtA&i6O!3g-Mtqpl*4`)Z@Eq5nTY8B$F2aB~{eCH%JA+NjI0 zGb4?CWl-Y>@Yio&2#PUMreJ3l^@9m$h ztgiLXF0E`-R%Vph`IV~PXc#!g;(V>L;Bd0_PtUJRFH~pZ)kminDvOmhaK3+SWnS!K zpmPqjDyJe~u0FC}S*eC+E7R4JOH0i*pf6O_wUx^1oVvU+Ut7~xs-%H}*Eg4cth~5Ir UibBj_|M>4mzRDZh|BvQ>0EiCYI{*Lx literal 0 HcmV?d00001 diff --git a/data/www/marlinui.woff b/data/www/marlinui.woff new file mode 100644 index 0000000000000000000000000000000000000000..8fa04f9efaa32db1546257cdd0b24bc4fda6befd GIT binary patch literal 6632 zcmZX3WmFVU*Y(g{1JVr=0+Q05g2W)DOYdy^dJayAPfj&+!@1L5oit3XF{ttfwBY+d|N=J`h2mnCSf8y#- z0P8N8Pgpx!LI42t@F(8*RI4L>;0my}wX}IU<34HJPY|WD%2Kd@5}!1YCrvmS)TsV9TjyM>|9EQU;h)er~UJJDd z2nYx^xC_AnY#2b?*B)Ay5HQ51!YbhG5iN|7JehX5J+7UGBKR{IVC9kEKa2R}!V(0v z2Lvc0`&t}|&{+njB8Gt0X-u>%f6LWQ3&duzoQQ^7;<@`T`Z+7%i{ySJ=0jlON9@Dc*c%EPD8Ew!&rB(Cw z&gmu6{!scNvJ*$&>{`%Qo_n@j#C1x{^?v-T+cGlEb<7db^KrP2QlBt+a`vaKIAMCO z;;HuK|+i?>F&B8%p5w>j;PL|Kj-klaA@>BX7w5drAH#Y7o z8T|D2sFs5OlQ}ZP|J|`RVg6YtfKY{B1=Gn>xq$_rask0$3V)T0P*?%7-EH>u=C-7C zcLQi$CqX`&EO|4Rl2Bw>=91RSm8G_7l&Rda)jEXwR-FDj56YT%Da}RT@r2}0Jx=uE zGav$`XGD2|GL~1ny%7`1XiBP@5Xku%9&Su@R&sP4VjsaI@TU3Jsud+R$mxRr_uN=ZP;9&mOQ(iEBdYnU%Li7;(L`_m#TPLr6{?eRn&}Lg>6<_a{Fw+Q~#c!Fu42 z8=deIcmbv?!%a0D0XIS?!S1CLr#-+U#I!==2I2E!zr@ZbF(tldKAVN-pk*v+z%n~S zmfox?!V>P#FPVR6d+EZy1D=%*SBg9bQNGgR1L<6cCql3C5AdPkU2M(+umJ{{ye~?d zG89%Ys!R;HO`r+e1RuNLdOp7YdqT~e7s*G-!nf7@@j<4~TQ zVs0gQ--Kk$tpn4OP~;4GoUDJpm{25NCWus1pdeb@$; z$gcSp*B02@1*x5a)PnY>QH==?ZQIUC<_kVH74sH=z0v->LQ=4(wD=4*?~6 z^4bGx6toPPgo93Fa92pY`n?`sLtEObp~CN_8b|K^zM+WxrFEo>j0K6p!ggRJ|qt&i)EZG`~puZF$9e#{|F7 zY@AsBP)r z6E2%*EPCmBcRFF6W3d8Uakm*4Yd3FiJq=T0x}RukB!TTIJ$kMFo4+)FJiB~6BRgVS zU&*(9$bP?gj$qJPIa3qcak-z*lj}Y-VuJY_c|!vxQ9WW#)vLS1)G9=N(2lO|Nx!a! zP{FIKsdrP#N;4{YqJr++?Ypn)he|^^L|?56cuv4M?n3^S$CX(U{d{L6@?OQlkE|=l zzJ|NAW=w#^@&W|vZ(<#9Du!eAlLS6I%NCQ!8xUYOmp9M3mY~fadl!nPZ||NuXQRd9 z6w(p7Qr`vbu(&=cHoy|MF2S}mj=))7VVbA6qe$GJsr3A$vk@-jQo=B2Io^+%KTPgj zYWi~7KspAZ!iDHg5#6SS-7`dG!98wEV@i**7H7++Z`A$lMY6SmH8rLsBTyY(2V=H@ zZh(<<=6SkPhEuvjCgn6-vxYZ@Lv_Xp#Q1P=p17hwSDd`BlM)XU*dgXn25dEta~syA zxcy@BPut$b$u)Z%=Y;u9P84@0|D;uA7;!*>y$sb>-VEZxwdXcyRHH)CDQzP% z-g9#hH350t(2w2~Z#KTLCTs4n5z4Y^R@6?1lM28C-b(1c-W7fgR`Fqy`4*BEooDkq zH2j3<#{`xu@JsjTwB$z{EklZM(}Z0K7S5Q5YWIIKQc{AlVxc0BUOg`G50g{A(@FGr zyG&*OR4hrWzdSn=QPSg^m@dEYRfAr1$K?OQ83E`FV0*(`(mv@4I1`DJ1#Wm4y9=41 zBt{#EMz{*8{0)RR?s3;h+@xjd1iL_msGGz(SSNI#LU7`3t;EJt*s&!;e0S*i9Vw3K(DT6!r53T8~72T2@`tBN>$bEQ_wC{ji$0K|XOoCQJW1-dl z1mExzWw8Bl!5QMJ{o&X(L6wK@%Avmkv<^M-_f)^q*Nojb5ws zqw(K{pZl-47&|p^q(2XZ_Qg(oX?a-};|#Yt;d}YMCZ7Pdhb_>z*fVD8x_ri=`nwRjsX?p8(!|R@_6+Ol zDwv?0z&B|ycCKY;DAp+W>p#{B6S(G~S7GjH!#@pyG?*V*;#K z&nm>n;@zyX#CK+Pd^qsMbloVJMmT?mrHuZ9{ym5(3ZTAbJMAwJKF4w)Z4z9|OgWc)E}~TIs)4gW&zFtz6%oSJd5G9OMTa60qrCjAtU458H`JH50Bv!g z#7bs7KT(zj<_PJ9?k#9$%!WuosQh`C=osk3>#d!rPULTr#>6NksiY=}csUV0jb%z! z5&8)nil4$5oY>5ZR3b)ff<5{-5RBa{#>w$EIgz9yDh(vaL{Nvlih(}O19Q=U*sXmP zaelOB1h!bD4H)qg9xCihQ0KhZZ$n*G8A>Knk`|}9hN^fUKl^&sT5E2LS9Wq)QGqx1 zc}FNGY5v5dKBv2$&ys{~m2W8*CDxfc_226+kgEzv!L5!XXHl1H z@~*o9QuLcX5UpxbX9c*esKi@@Zc_n?No$o$rL-eWEzlASQ5_oY%dkeXx*^}8`5 zBqD@UkLnET-o_VAc9-)UD}4X9<2&*@a$(0F4>m0|Mz~!;UJ$3{F6=|BW1?5;SZU0s z9TK$mSbQyS|F**JQ;ZclXp)+7uei}in$b22t@3-F$75I$^KWJOfKSEpU#B;zR_Gkk zzUw`s`-FXj7Qk%PQUDg`MebmvJqGe?@dQ3+|3Q7Mf_v3zf3Co<&C?Jx6{WSE!<^%q>@{w4k)t0fvTBi+ zI(#!SdoNjKenI?1VmPWn>weeF4A07p{cK7nv5Bubh)V-?=CkyTBr=#WVv>1AWmM7jg8Unsg6Na8`nZAYA`S5u%@SyR7 zKdpJ26b7P`6w9Ww(=*wH*|^Ti19CX9`&lJ-%!tU=WIg)-vTUW!f6n&51d+ZO?8H{E zDvV9%xpgoilHk0V86j$90hrY~;8f~XH#f4s8rSg%_hx|eHjU17M# z2sf6cGOeFkp9GHYD+UEKW^^g_nGm$o-V@T&xR$qjShpCEw;ZuO zs%~$zb+#-YP17lr7?&c>Hz-XzTWJ`jR&(sZGdp#pCt}l=-Ytw&71;qKP-^p^U0;pr zRFIr2m1Q?E__a6vVx0o@X@u=w)(7m#ry5MkxZt{*TD%?8Of-dcw!q>$#uE`p`TCGd zqnpx8U2u=V?~ae*e^IZ_SD8Bc>>z3UA7Zl<$22zFa<`fnH6wK_4?mrpUlM;$d zIWkbCxB4%$V$a=JIQl=U?MBlh2JQrG$jA&af|ac-2o#q9!6jszB3~`E`X25R34U0W z>c2R{Y7DRb>h$bW#k+~N}#gAOHl;%%jI@c4bIY=q_O z6#CFeDHDy1nTQgG_H9){4OS;ks>z{dq^D$_MuQvikcS|5q_8+ag`&Rt+Xys;%ILtk zu+JhC`pIJ&co-F9lScU!sBilF)qifW(8~>1ei3>zTnkXpU!M_^1a4A-E|MZz@s+;C ztSvIu(A6iESQq&{nn0EHmliD9F8??uOrX^f`ZNwnV=@L)5d%?_d?7Ecpi_67%{sYu z%Zq#oaPJnW=$L# zqw2Hg?|5Gg4=;pg4m~IgQw~q2DRXL&YgYuuaI!qOkCOQR*3Ge9lp|ry!sO-`{CE>g zDyM0h6zry@i54_e{fLXb;m?QTziDd@R8~m!*@;+RRNJ2s zcP>|;V+H#l-#S4K!W8ICs!DUPTY}Qf`b$lb^(r`-d+*bZafVOE5troggU}I%c_5d% zo9jwrdLE3wy1Z??b+w3y+{Nf4o6h?AurVr??o(I~ec%VE{kAd&FM@d=)VdlK_LGxV zE!p)x*+rf{+UZ&dBXf--Q&vr&r+sJ@7_OaO7{F8RHYiDtLZY`+0dPJE=--uvR7q%;uT6kp*Lczx(MY zNu=jeeH5P|xm8hY4*BXL^?qt=1*Vnz=mp(mWRE-&z3Cc(I_|ZBgvYB7l6tZvw___ zW5x!lwD05PI=Vw1<%t5x~qmqIAf#r-t@4`$Vr)`-YfhHh*HGS6jVMb)5(E zj>HMeu*?o)=)ax&(Jf~IK<7>?rjhkd^c$Z^Hv@)+WDKEyOKxfUP*=~uD3T)lEY=VZ zR~zkM+i|o2<^tQ@u!jiAUmGIo7cs*FJ6|>S=9A&S8bRn)@*F7>z!j|bMOl6U6JOHU z5JWh}q||i8EiY@GG`*G`Wn7H(wrP>62N2S1_4i~Qf-G#Y$Y~$xWLkB#8wCKKpp47N zu`-K+;-s`vz1(V#x6^Gt2J((&`>t;L-q+90NmQ^PYw{&-?2Sr5rQhbU@P~c=^xiNh zXs$zUc%7?9XXnAe1;ndC{2jHxz)khd>n;2B>0ZRu#X3ue10-w5_(FzBuSzv=iPuqe zcV}nE=~mxiE_;OPOs{fC;k(-fj0AtptEr>5?7NG#1~A_--0xrE#gM=RfV63&*2_)T?XRT^IE9kbKM&m2LILk2M^JVIL+G#*Jqgv5C-0 zx^&zibWI`pkJ2g+V##jOvb*kOJI?{1JgwZB)MHMwU#&XFu|+l0rdXH#_2+iic!eH< z>)kF&VlC`DzuRxEkI#Fihv<)t@j9c7WlHHvRt!_j)?E9s%%(8YqI~>cW)5?6Wz;gF|W9ZB9cPvP-H@FDceTjw4)$13YRpScK|J#ytn2iho7fS^qH}HDViL|*L z;xYQarNM#07)fxcYH)~At(woJ$ zi=x3B^nRUGT{(xL&Qb|^<0puVM8cvNVd$7ad(jnKRT=S;C*vo0}RiCeC_<%09?j78O z#2WkjEoDIWgOuHw$;r`mn7=5_SE-MKKPH0)for(c in hd)d=hd[c],e=b[d],m(e)||(a[d]=e);return a}function o(b){n(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),id===!1&&(id=!0,a.updateOffset(this),id=!1)}function p(a){return a instanceof o||null!=a&&null!=a._isAMomentObject}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=q(b)),c}function s(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&r(a[d])!==r(b[d]))&&g++;return g+f}function t(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function u(b,c){var d=!0;return g(function(){return null!=a.deprecationHandler&&a.deprecationHandler(null,b),d&&(t(b+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),d=!1),c.apply(this,arguments)},c)}function v(b,c){null!=a.deprecationHandler&&a.deprecationHandler(b,c),jd[b]||(t(c),jd[b]=!0)}function w(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function x(a){return"[object Object]"===Object.prototype.toString.call(a)}function y(a){var b,c;for(c in a)b=a[c],w(b)?this[c]=b:this["_"+c]=b;this._config=a,this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function z(a,b){var c,d=g({},a);for(c in b)f(b,c)&&(x(a[c])&&x(b[c])?(d[c]={},g(d[c],a[c]),g(d[c],b[c])):null!=b[c]?d[c]=b[c]:delete d[c]);return d}function A(a){null!=a&&this.set(a)}function B(a){return a?a.toLowerCase().replace("_","-"):a}function C(a){for(var b,c,d,e,f=0;f0;){if(d=D(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&s(e,c,!0)>=b-1)break;b--}f++}return null}function D(a){var b=null;if(!nd[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=ld._abbr,require("./locale/"+a),E(b)}catch(c){}return nd[a]}function E(a,b){var c;return a&&(c=m(b)?H(a):F(a,b),c&&(ld=c)),ld._abbr}function F(a,b){return null!==b?(b.abbr=a,null!=nd[a]?(v("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale"),b=z(nd[a]._config,b)):null!=b.parentLocale&&(null!=nd[b.parentLocale]?b=z(nd[b.parentLocale]._config,b):v("parentLocaleUndefined","specified parentLocale is not defined yet")),nd[a]=new A(b),E(a),nd[a]):(delete nd[a],null)}function G(a,b){if(null!=b){var c;null!=nd[a]&&(b=z(nd[a]._config,b)),c=new A(b),c.parentLocale=nd[a],nd[a]=c,E(a)}else null!=nd[a]&&(null!=nd[a].parentLocale?nd[a]=nd[a].parentLocale:null!=nd[a]&&delete nd[a]);return nd[a]}function H(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return ld;if(!c(a)){if(b=D(a))return b;a=[a]}return C(a)}function I(){return kd(nd)}function J(a,b){var c=a.toLowerCase();od[c]=od[c+"s"]=od[b]=a}function K(a){return"string"==typeof a?od[a]||od[a.toLowerCase()]:void 0}function L(a){var b,c,d={};for(c in a)f(a,c)&&(b=K(c),b&&(d[b]=a[c]));return d}function M(b,c){return function(d){return null!=d?(O(this,b,d),a.updateOffset(this,c),this):N(this,b)}}function N(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function O(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}function P(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else if(a=K(a),w(this[a]))return this[a](b);return this}function Q(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function R(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(sd[a]=e),b&&(sd[b[0]]=function(){return Q(e.apply(this,arguments),b[1],b[2])}),c&&(sd[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function S(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function T(a){var b,c,d=a.match(pd);for(b=0,c=d.length;c>b;b++)sd[d[b]]?d[b]=sd[d[b]]:d[b]=S(d[b]);return function(b){var e,f="";for(e=0;c>e;e++)f+=d[e]instanceof Function?d[e].call(b,a):d[e];return f}}function U(a,b){return a.isValid()?(b=V(b,a.localeData()),rd[b]=rd[b]||T(b),rd[b](a)):a.localeData().invalidDate()}function V(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(qd.lastIndex=0;d>=0&&qd.test(a);)a=a.replace(qd,c),qd.lastIndex=0,d-=1;return a}function W(a,b,c){Kd[a]=w(b)?b:function(a,d){return a&&c?c:b}}function X(a,b){return f(Kd,a)?Kd[a](b._strict,b._locale):new RegExp(Y(a))}function Y(a){return Z(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function Z(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function $(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=r(a)}),c=0;cd;++d)f=h([2e3,d]),this._shortMonthsParse[d]=this.monthsShort(f,"").toLocaleLowerCase(),this._longMonthsParse[d]=this.months(f,"").toLocaleLowerCase();return c?"MMM"===b?(e=md.call(this._shortMonthsParse,g),-1!==e?e:null):(e=md.call(this._longMonthsParse,g),-1!==e?e:null):"MMM"===b?(e=md.call(this._shortMonthsParse,g),-1!==e?e:(e=md.call(this._longMonthsParse,g),-1!==e?e:null)):(e=md.call(this._longMonthsParse,g),-1!==e?e:(e=md.call(this._shortMonthsParse,g),-1!==e?e:null))}function fa(a,b,c){var d,e,f;if(this._monthsParseExact)return ea.call(this,a,b,c);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=h([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function ga(a,b){var c;if(!a.isValid())return a;if("string"==typeof b)if(/^\d+$/.test(b))b=r(b);else if(b=a.localeData().monthsParse(b),"number"!=typeof b)return a;return c=Math.min(a.date(),ba(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ha(b){return null!=b?(ga(this,b),a.updateOffset(this,!0),this):N(this,"Month")}function ia(){return ba(this.year(),this.month())}function ja(a){return this._monthsParseExact?(f(this,"_monthsRegex")||la.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex}function ka(a){return this._monthsParseExact?(f(this,"_monthsRegex")||la.call(this),a?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex}function la(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;12>b;b++)c=h([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(d.sort(a),e.sort(a),f.sort(a),b=0;12>b;b++)d[b]=Z(d[b]),e[b]=Z(e[b]),f[b]=Z(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")","i")}function ma(a){var b,c=a._a;return c&&-2===j(a).overflow&&(b=c[Nd]<0||c[Nd]>11?Nd:c[Od]<1||c[Od]>ba(c[Md],c[Nd])?Od:c[Pd]<0||c[Pd]>24||24===c[Pd]&&(0!==c[Qd]||0!==c[Rd]||0!==c[Sd])?Pd:c[Qd]<0||c[Qd]>59?Qd:c[Rd]<0||c[Rd]>59?Rd:c[Sd]<0||c[Sd]>999?Sd:-1,j(a)._overflowDayOfYear&&(Md>b||b>Od)&&(b=Od),j(a)._overflowWeeks&&-1===b&&(b=Td),j(a)._overflowWeekday&&-1===b&&(b=Ud),j(a).overflow=b),a}function na(a){var b,c,d,e,f,g,h=a._i,i=$d.exec(h)||_d.exec(h);if(i){for(j(a).iso=!0,b=0,c=be.length;c>b;b++)if(be[b][1].exec(i[1])){e=be[b][0],d=be[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=ce.length;c>b;b++)if(ce[b][1].exec(i[3])){f=(i[2]||" ")+ce[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!ae.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),Ca(a)}else a._isValid=!1}function oa(b){var c=de.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(na(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}function pa(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 100>a&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function qa(a){var b=new Date(Date.UTC.apply(null,arguments));return 100>a&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function ra(a){return sa(a)?366:365}function sa(a){return a%4===0&&a%100!==0||a%400===0}function ta(){return sa(this.year())}function ua(a,b,c){var d=7+b-c,e=(7+qa(a,0,d).getUTCDay()-b)%7;return-e+d-1}function va(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ua(a,d,e),j=1+7*(b-1)+h+i;return 0>=j?(f=a-1,g=ra(f)+j):j>ra(a)?(f=a+1,g=j-ra(a)):(f=a,g=j),{year:f,dayOfYear:g}}function wa(a,b,c){var d,e,f=ua(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return 1>g?(e=a.year()-1,d=g+xa(e,b,c)):g>xa(a.year(),b,c)?(d=g-xa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function xa(a,b,c){var d=ua(a,b,c),e=ua(a+1,b,c);return(ra(a)-d+e)/7}function ya(a,b,c){return null!=a?a:null!=b?b:c}function za(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function Aa(a){var b,c,d,e,f=[];if(!a._d){for(d=za(a),a._w&&null==a._a[Od]&&null==a._a[Nd]&&Ba(a),a._dayOfYear&&(e=ya(a._a[Md],d[Md]),a._dayOfYear>ra(e)&&(j(a)._overflowDayOfYear=!0),c=qa(e,0,a._dayOfYear),a._a[Nd]=c.getUTCMonth(),a._a[Od]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[Pd]&&0===a._a[Qd]&&0===a._a[Rd]&&0===a._a[Sd]&&(a._nextDay=!0,a._a[Pd]=0),a._d=(a._useUTC?qa:pa).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Pd]=24)}}function Ba(a){var b,c,d,e,f,g,h,i;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=ya(b.GG,a._a[Md],wa(Ka(),1,4).year),d=ya(b.W,1),e=ya(b.E,1),(1>e||e>7)&&(i=!0)):(f=a._locale._week.dow,g=a._locale._week.doy,c=ya(b.gg,a._a[Md],wa(Ka(),f,g).year),d=ya(b.w,1),null!=b.d?(e=b.d,(0>e||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f),1>d||d>xa(c,f,g)?j(a)._overflowWeeks=!0:null!=i?j(a)._overflowWeekday=!0:(h=va(c,d,e,f,g),a._a[Md]=h.year,a._dayOfYear=h.dayOfYear)}function Ca(b){if(b._f===a.ISO_8601)return void na(b);b._a=[],j(b).empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,k=0;for(e=V(b._f,b._locale).match(pd)||[],c=0;c0&&j(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),k+=d.length),sd[f]?(d?j(b).empty=!1:j(b).unusedTokens.push(f),aa(f,d,b)):b._strict&&!d&&j(b).unusedTokens.push(f);j(b).charsLeftOver=i-k,h.length>0&&j(b).unusedInput.push(h),j(b).bigHour===!0&&b._a[Pd]<=12&&b._a[Pd]>0&&(j(b).bigHour=void 0),j(b).parsedDateParts=b._a.slice(0),j(b).meridiem=b._meridiem,b._a[Pd]=Da(b._locale,b._a[Pd],b._meridiem),Aa(b),ma(b)}function Da(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function Ea(a){var b,c,d,e,f;if(0===a._f.length)return j(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;ef)&&(d=f,c=b));g(a,c||b)}function Fa(a){if(!a._d){var b=L(a._i);a._a=e([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),Aa(a)}}function Ga(a){var b=new o(ma(Ha(a)));return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function Ha(a){var b=a._i,e=a._f;return a._locale=a._locale||H(a._l),null===b||void 0===e&&""===b?l({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),p(b)?new o(ma(b)):(c(e)?Ea(a):e?Ca(a):d(b)?a._d=b:Ia(a),k(a)||(a._d=null),a))}function Ia(b){var f=b._i;void 0===f?b._d=new Date(a.now()):d(f)?b._d=new Date(f.valueOf()):"string"==typeof f?oa(b):c(f)?(b._a=e(f.slice(0),function(a){return parseInt(a,10)}),Aa(b)):"object"==typeof f?Fa(b):"number"==typeof f?b._d=new Date(f):a.createFromInputFallback(b)}function Ja(a,b,c,d,e){var f={};return"boolean"==typeof c&&(d=c,c=void 0),f._isAMomentObject=!0,f._useUTC=f._isUTC=e,f._l=c,f._i=a,f._f=b,f._strict=d,Ga(f)}function Ka(a,b,c,d){return Ja(a,b,c,d,!1)}function La(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return Ka();for(d=b[0],e=1;ea&&(a=-a,c="-"),c+Q(~~(a/60),2)+b+Q(~~a%60,2)})}function Ra(a,b){var c=(b||"").match(a)||[],d=c[c.length-1]||[],e=(d+"").match(ie)||["-",0,0],f=+(60*e[1])+r(e[2]);return"+"===e[0]?f:-f}function Sa(b,c){var e,f;return c._isUTC?(e=c.clone(),f=(p(b)||d(b)?b.valueOf():Ka(b).valueOf())-e.valueOf(),e._d.setTime(e._d.valueOf()+f),a.updateOffset(e,!1),e):Ka(b).local()}function Ta(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Ua(b,c){var d,e=this._offset||0;return this.isValid()?null!=b?("string"==typeof b?b=Ra(Hd,b):Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Ta(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?jb(this,db(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Ta(this):null!=b?this:NaN}function Va(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Wa(a){return this.utcOffset(0,a)}function Xa(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Ta(this),"m")),this}function Ya(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Ra(Gd,this._i)),this}function Za(a){return this.isValid()?(a=a?Ka(a).utcOffset():0,(this.utcOffset()-a)%60===0):!1}function $a(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function _a(){if(!m(this._isDSTShifted))return this._isDSTShifted;var a={};if(n(a,this),a=Ha(a),a._a){var b=a._isUTC?h(a._a):Ka(a._a);this._isDSTShifted=this.isValid()&&s(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function ab(){return this.isValid()?!this._isUTC:!1}function bb(){return this.isValid()?this._isUTC:!1}function cb(){return this.isValid()?this._isUTC&&0===this._offset:!1}function db(a,b){var c,d,e,g=a,h=null;return Pa(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(g={},b?g[b]=a:g.milliseconds=a):(h=je.exec(a))?(c="-"===h[1]?-1:1,g={y:0,d:r(h[Od])*c,h:r(h[Pd])*c,m:r(h[Qd])*c,s:r(h[Rd])*c,ms:r(h[Sd])*c}):(h=ke.exec(a))?(c="-"===h[1]?-1:1,g={y:eb(h[2],c),M:eb(h[3],c),w:eb(h[4],c),d:eb(h[5],c),h:eb(h[6],c),m:eb(h[7],c),s:eb(h[8],c)}):null==g?g={}:"object"==typeof g&&("from"in g||"to"in g)&&(e=gb(Ka(g.from),Ka(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new Oa(g),Pa(a)&&f(a,"_locale")&&(d._locale=a._locale),d}function eb(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function fb(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function gb(a,b){var c;return a.isValid()&&b.isValid()?(b=Sa(b,a),a.isBefore(b)?c=fb(a,b):(c=fb(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function hb(a){return 0>a?-1*Math.round(-1*a):Math.round(a)}function ib(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(v(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=db(c,d),jb(this,e,a),this}}function jb(b,c,d,e){var f=c._milliseconds,g=hb(c._days),h=hb(c._months);b.isValid()&&(e=null==e?!0:e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&O(b,"Date",N(b,"Date")+g*d),h&&ga(b,N(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function kb(a,b){var c=a||Ka(),d=Sa(c,this).startOf("day"),e=this.diff(d,"days",!0),f=-6>e?"sameElse":-1>e?"lastWeek":0>e?"lastDay":1>e?"sameDay":2>e?"nextDay":7>e?"nextWeek":"sameElse",g=b&&(w(b[f])?b[f]():b[f]);return this.format(g||this.localeData().calendar(f,this,Ka(c)))}function lb(){return new o(this)}function mb(a,b){var c=p(a)?a:Ka(a);return this.isValid()&&c.isValid()?(b=K(m(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)||0}function ub(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function vb(){var a=this.clone().utc();return 0f&&(b=f),Vb.call(this,a,b,c,d,e))}function Vb(a,b,c,d,e){var f=va(a,b,c,d,e),g=qa(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Wb(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Xb(a){return wa(a,this._week.dow,this._week.doy).week}function Yb(){return this._week.dow}function Zb(){return this._week.doy}function $b(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function _b(a){var b=wa(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function ac(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function bc(a,b){return c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]}function cc(a){return this._weekdaysShort[a.day()]}function dc(a){return this._weekdaysMin[a.day()]}function ec(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;7>d;++d)f=h([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=md.call(this._weekdaysParse,g),-1!==e?e:null):"ddd"===b?(e=md.call(this._shortWeekdaysParse,g),-1!==e?e:null):(e=md.call(this._minWeekdaysParse,g),-1!==e?e:null):"dddd"===b?(e=md.call(this._weekdaysParse,g),-1!==e?e:(e=md.call(this._shortWeekdaysParse,g),-1!==e?e:(e=md.call(this._minWeekdaysParse,g),-1!==e?e:null))):"ddd"===b?(e=md.call(this._shortWeekdaysParse,g),-1!==e?e:(e=md.call(this._weekdaysParse,g),-1!==e?e:(e=md.call(this._minWeekdaysParse,g),-1!==e?e:null))):(e=md.call(this._minWeekdaysParse,g),-1!==e?e:(e=md.call(this._weekdaysParse,g),-1!==e?e:(e=md.call(this._shortWeekdaysParse,g),-1!==e?e:null)))}function fc(a,b,c){var d,e,f;if(this._weekdaysParseExact)return ec.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;7>d;d++){if(e=h([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function gc(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=ac(a,this.localeData()),this.add(a-b,"d")):b}function hc(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function ic(a){return this.isValid()?null==a?this.day()||7:this.day(this.day()%7?a:a-7):null!=a?this:NaN}function jc(a){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||mc.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex}function kc(a){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||mc.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex}function lc(a){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||mc.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex}function mc(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],i=[],j=[],k=[];for(b=0;7>b;b++)c=h([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),i.push(e),j.push(f),k.push(d),k.push(e),k.push(f);for(g.sort(a),i.sort(a),j.sort(a),k.sort(a),b=0;7>b;b++)i[b]=Z(i[b]),j[b]=Z(j[b]),k[b]=Z(k[b]);this._weekdaysRegex=new RegExp("^("+k.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}function nc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function oc(){return this.hours()%12||12}function pc(){return this.hours()||24}function qc(a,b){R(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function rc(a,b){return b._meridiemParse}function sc(a){return"p"===(a+"").toLowerCase().charAt(0)}function tc(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function uc(a,b){b[Sd]=r(1e3*("0."+a))}function vc(){return this._isUTC?"UTC":""}function wc(){return this._isUTC?"Coordinated Universal Time":""}function xc(a){return Ka(1e3*a)}function yc(){return Ka.apply(null,arguments).parseZone()}function zc(a,b,c){var d=this._calendar[a];return w(d)?d.call(b,c):d}function Ac(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function Bc(){return this._invalidDate}function Cc(a){return this._ordinal.replace("%d",a)}function Dc(a){return a}function Ec(a,b,c,d){var e=this._relativeTime[c];return w(e)?e(a,b,c,d):e.replace(/%d/i,a)}function Fc(a,b){var c=this._relativeTime[a>0?"future":"past"];return w(c)?c(b):c.replace(/%s/i,b)}function Gc(a,b,c,d){var e=H(),f=h().set(d,b);return e[c](f,a)}function Hc(a,b,c){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return Gc(a,b,c,"month");var d,e=[];for(d=0;12>d;d++)e[d]=Gc(a,d,c,"month");return e}function Ic(a,b,c,d){"boolean"==typeof a?("number"==typeof b&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,"number"==typeof b&&(c=b,b=void 0),b=b||"");var e=H(),f=a?e._week.dow:0;if(null!=c)return Gc(b,(c+f)%7,d,"day");var g,h=[];for(g=0;7>g;g++)h[g]=Gc(b,(g+f)%7,d,"day");return h}function Jc(a,b){return Hc(a,b,"months")}function Kc(a,b){return Hc(a,b,"monthsShort")}function Lc(a,b,c){return Ic(a,b,c,"weekdays")}function Mc(a,b,c){return Ic(a,b,c,"weekdaysShort")}function Nc(a,b,c){return Ic(a,b,c,"weekdaysMin")}function Oc(){var a=this._data;return this._milliseconds=Le(this._milliseconds),this._days=Le(this._days),this._months=Le(this._months),a.milliseconds=Le(a.milliseconds),a.seconds=Le(a.seconds),a.minutes=Le(a.minutes),a.hours=Le(a.hours),a.months=Le(a.months),a.years=Le(a.years),this}function Pc(a,b,c,d){var e=db(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function Qc(a,b){return Pc(this,a,b,1)}function Rc(a,b){return Pc(this,a,b,-1)}function Sc(a){return 0>a?Math.floor(a):Math.ceil(a)}function Tc(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||0>=f&&0>=g&&0>=h||(f+=864e5*Sc(Vc(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=q(f/1e3),i.seconds=a%60,b=q(a/60),i.minutes=b%60,c=q(b/60),i.hours=c%24,g+=q(c/24),e=q(Uc(g)),h+=e,g-=Sc(Vc(e)),d=q(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function Uc(a){return 4800*a/146097}function Vc(a){return 146097*a/4800}function Wc(a){var b,c,d=this._milliseconds;if(a=K(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+Uc(b),"month"===a?c:c/12;switch(b=this._days+Math.round(Vc(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}function Xc(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*r(this._months/12)}function Yc(a){return function(){return this.as(a)}}function Zc(a){ +return a=K(a),this[a+"s"]()}function $c(a){return function(){return this._data[a]}}function _c(){return q(this.days()/7)}function ad(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function bd(a,b,c){var d=db(a).abs(),e=_e(d.as("s")),f=_e(d.as("m")),g=_e(d.as("h")),h=_e(d.as("d")),i=_e(d.as("M")),j=_e(d.as("y")),k=e=f&&["m"]||f=g&&["h"]||g=h&&["d"]||h=i&&["M"]||i=j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,ad.apply(null,k)}function cd(a,b){return void 0===af[a]?!1:void 0===b?af[a]:(af[a]=b,!0)}function dd(a){var b=this.localeData(),c=bd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function ed(){var a,b,c,d=bf(this._milliseconds)/1e3,e=bf(this._days),f=bf(this._months);a=q(d/60),b=q(a/60),d%=60,a%=60,c=q(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(0>m?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var fd,gd;gd=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;c>d;d++)if(d in b&&a.call(this,b[d],d,b))return!0;return!1};var hd=a.momentProperties=[],id=!1,jd={};a.suppressDeprecationWarnings=!1,a.deprecationHandler=null;var kd;kd=Object.keys?Object.keys:function(a){var b,c=[];for(b in a)f(a,b)&&c.push(b);return c};var ld,md,nd={},od={},pd=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,qd=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,rd={},sd={},td=/\d/,ud=/\d\d/,vd=/\d{3}/,wd=/\d{4}/,xd=/[+-]?\d{6}/,yd=/\d\d?/,zd=/\d\d\d\d?/,Ad=/\d\d\d\d\d\d?/,Bd=/\d{1,3}/,Cd=/\d{1,4}/,Dd=/[+-]?\d{1,6}/,Ed=/\d+/,Fd=/[+-]?\d+/,Gd=/Z|[+-]\d\d:?\d\d/gi,Hd=/Z|[+-]\d\d(?::?\d\d)?/gi,Id=/[+-]?\d+(\.\d{1,3})?/,Jd=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Kd={},Ld={},Md=0,Nd=1,Od=2,Pd=3,Qd=4,Rd=5,Sd=6,Td=7,Ud=8;md=Array.prototype.indexOf?Array.prototype.indexOf:function(a){var b;for(b=0;b=a?""+a:"+"+a}),R(0,["YY",2],0,function(){return this.year()%100}),R(0,["YYYY",4],0,"year"),R(0,["YYYYY",5],0,"year"),R(0,["YYYYYY",6,!0],0,"year"),J("year","y"),W("Y",Fd),W("YY",yd,ud),W("YYYY",Cd,wd),W("YYYYY",Dd,xd),W("YYYYYY",Dd,xd),$(["YYYYY","YYYYYY"],Md),$("YYYY",function(b,c){c[Md]=2===b.length?a.parseTwoDigitYear(b):r(b)}),$("YY",function(b,c){c[Md]=a.parseTwoDigitYear(b)}),$("Y",function(a,b){b[Md]=parseInt(a,10)}),a.parseTwoDigitYear=function(a){return r(a)+(r(a)>68?1900:2e3)};var ee=M("FullYear",!0);a.ISO_8601=function(){};var fe=u("moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var a=Ka.apply(null,arguments);return this.isValid()&&a.isValid()?this>a?this:a:l()}),ge=u("moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var a=Ka.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:l()}),he=function(){return Date.now?Date.now():+new Date};Qa("Z",":"),Qa("ZZ",""),W("Z",Hd),W("ZZ",Hd),$(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Ra(Hd,a)});var ie=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var je=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,ke=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;db.fn=Oa.prototype;var le=ib(1,"add"),me=ib(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ne=u("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});R(0,["gg",2],0,function(){return this.weekYear()%100}),R(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Pb("gggg","weekYear"),Pb("ggggg","weekYear"),Pb("GGGG","isoWeekYear"),Pb("GGGGG","isoWeekYear"),J("weekYear","gg"),J("isoWeekYear","GG"),W("G",Fd),W("g",Fd),W("GG",yd,ud),W("gg",yd,ud),W("GGGG",Cd,wd),W("gggg",Cd,wd),W("GGGGG",Dd,xd),W("ggggg",Dd,xd),_(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=r(a)}),_(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),R("Q",0,"Qo","quarter"),J("quarter","Q"),W("Q",td),$("Q",function(a,b){b[Nd]=3*(r(a)-1)}),R("w",["ww",2],"wo","week"),R("W",["WW",2],"Wo","isoWeek"),J("week","w"),J("isoWeek","W"),W("w",yd),W("ww",yd,ud),W("W",yd),W("WW",yd,ud),_(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=r(a)});var oe={dow:0,doy:6};R("D",["DD",2],"Do","date"),J("date","D"),W("D",yd),W("DD",yd,ud),W("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),$(["D","DD"],Od),$("Do",function(a,b){b[Od]=r(a.match(yd)[0],10)});var pe=M("Date",!0);R("d",0,"do","day"),R("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),R("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),R("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),R("e",0,0,"weekday"),R("E",0,0,"isoWeekday"),J("day","d"),J("weekday","e"),J("isoWeekday","E"),W("d",yd),W("e",yd),W("E",yd),W("dd",function(a,b){return b.weekdaysMinRegex(a)}),W("ddd",function(a,b){return b.weekdaysShortRegex(a)}),W("dddd",function(a,b){return b.weekdaysRegex(a)}),_(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:j(c).invalidWeekday=a}),_(["d","e","E"],function(a,b,c,d){b[d]=r(a)});var qe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),re="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),se="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),te=Jd,ue=Jd,ve=Jd;R("DDD",["DDDD",3],"DDDo","dayOfYear"),J("dayOfYear","DDD"),W("DDD",Bd),W("DDDD",vd),$(["DDD","DDDD"],function(a,b,c){c._dayOfYear=r(a)}),R("H",["HH",2],0,"hour"),R("h",["hh",2],0,oc),R("k",["kk",2],0,pc),R("hmm",0,0,function(){return""+oc.apply(this)+Q(this.minutes(),2)}),R("hmmss",0,0,function(){return""+oc.apply(this)+Q(this.minutes(),2)+Q(this.seconds(),2)}),R("Hmm",0,0,function(){return""+this.hours()+Q(this.minutes(),2)}),R("Hmmss",0,0,function(){return""+this.hours()+Q(this.minutes(),2)+Q(this.seconds(),2)}),qc("a",!0),qc("A",!1),J("hour","h"),W("a",rc),W("A",rc),W("H",yd),W("h",yd),W("HH",yd,ud),W("hh",yd,ud),W("hmm",zd),W("hmmss",Ad),W("Hmm",zd),W("Hmmss",Ad),$(["H","HH"],Pd),$(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),$(["h","hh"],function(a,b,c){b[Pd]=r(a),j(c).bigHour=!0}),$("hmm",function(a,b,c){var d=a.length-2;b[Pd]=r(a.substr(0,d)),b[Qd]=r(a.substr(d)),j(c).bigHour=!0}),$("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[Pd]=r(a.substr(0,d)),b[Qd]=r(a.substr(d,2)),b[Rd]=r(a.substr(e)),j(c).bigHour=!0}),$("Hmm",function(a,b,c){var d=a.length-2;b[Pd]=r(a.substr(0,d)),b[Qd]=r(a.substr(d))}),$("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[Pd]=r(a.substr(0,d)),b[Qd]=r(a.substr(d,2)),b[Rd]=r(a.substr(e))});var we=/[ap]\.?m?\.?/i,xe=M("Hours",!0);R("m",["mm",2],0,"minute"),J("minute","m"),W("m",yd),W("mm",yd,ud),$(["m","mm"],Qd);var ye=M("Minutes",!1);R("s",["ss",2],0,"second"),J("second","s"),W("s",yd),W("ss",yd,ud),$(["s","ss"],Rd);var ze=M("Seconds",!1);R("S",0,0,function(){return~~(this.millisecond()/100)}),R(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),R(0,["SSS",3],0,"millisecond"),R(0,["SSSS",4],0,function(){return 10*this.millisecond()}),R(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),R(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),R(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),R(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),R(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),J("millisecond","ms"),W("S",Bd,td),W("SS",Bd,ud),W("SSS",Bd,vd);var Ae;for(Ae="SSSS";Ae.length<=9;Ae+="S")W(Ae,Ed);for(Ae="S";Ae.length<=9;Ae+="S")$(Ae,uc);var Be=M("Milliseconds",!1);R("z",0,0,"zoneAbbr"),R("zz",0,0,"zoneName");var Ce=o.prototype;Ce.add=le,Ce.calendar=kb,Ce.clone=lb,Ce.diff=sb,Ce.endOf=Eb,Ce.format=wb,Ce.from=xb,Ce.fromNow=yb,Ce.to=zb,Ce.toNow=Ab,Ce.get=P,Ce.invalidAt=Nb,Ce.isAfter=mb,Ce.isBefore=nb,Ce.isBetween=ob,Ce.isSame=pb,Ce.isSameOrAfter=qb,Ce.isSameOrBefore=rb,Ce.isValid=Lb,Ce.lang=ne,Ce.locale=Bb,Ce.localeData=Cb,Ce.max=ge,Ce.min=fe,Ce.parsingFlags=Mb,Ce.set=P,Ce.startOf=Db,Ce.subtract=me,Ce.toArray=Ib,Ce.toObject=Jb,Ce.toDate=Hb,Ce.toISOString=vb,Ce.toJSON=Kb,Ce.toString=ub,Ce.unix=Gb,Ce.valueOf=Fb,Ce.creationData=Ob,Ce.year=ee,Ce.isLeapYear=ta,Ce.weekYear=Qb,Ce.isoWeekYear=Rb,Ce.quarter=Ce.quarters=Wb,Ce.month=ha,Ce.daysInMonth=ia,Ce.week=Ce.weeks=$b,Ce.isoWeek=Ce.isoWeeks=_b,Ce.weeksInYear=Tb,Ce.isoWeeksInYear=Sb,Ce.date=pe,Ce.day=Ce.days=gc,Ce.weekday=hc,Ce.isoWeekday=ic,Ce.dayOfYear=nc,Ce.hour=Ce.hours=xe,Ce.minute=Ce.minutes=ye,Ce.second=Ce.seconds=ze,Ce.millisecond=Ce.milliseconds=Be,Ce.utcOffset=Ua,Ce.utc=Wa,Ce.local=Xa,Ce.parseZone=Ya,Ce.hasAlignedHourOffset=Za,Ce.isDST=$a,Ce.isDSTShifted=_a,Ce.isLocal=ab,Ce.isUtcOffset=bb,Ce.isUtc=cb,Ce.isUTC=cb,Ce.zoneAbbr=vc,Ce.zoneName=wc,Ce.dates=u("dates accessor is deprecated. Use date instead.",pe),Ce.months=u("months accessor is deprecated. Use month instead",ha),Ce.years=u("years accessor is deprecated. Use year instead",ee),Ce.zone=u("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Va);var De=Ce,Ee={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Fe={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Ge="Invalid date",He="%d",Ie=/\d{1,2}/,Je={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Ke=A.prototype;Ke._calendar=Ee,Ke.calendar=zc,Ke._longDateFormat=Fe,Ke.longDateFormat=Ac,Ke._invalidDate=Ge,Ke.invalidDate=Bc,Ke._ordinal=He,Ke.ordinal=Cc,Ke._ordinalParse=Ie,Ke.preparse=Dc,Ke.postformat=Dc,Ke._relativeTime=Je,Ke.relativeTime=Ec,Ke.pastFuture=Fc,Ke.set=y,Ke.months=ca,Ke._months=Wd,Ke.monthsShort=da,Ke._monthsShort=Xd,Ke.monthsParse=fa,Ke._monthsRegex=Zd,Ke.monthsRegex=ka,Ke._monthsShortRegex=Yd,Ke.monthsShortRegex=ja,Ke.week=Xb,Ke._week=oe,Ke.firstDayOfYear=Zb,Ke.firstDayOfWeek=Yb,Ke.weekdays=bc,Ke._weekdays=qe,Ke.weekdaysMin=dc,Ke._weekdaysMin=se,Ke.weekdaysShort=cc,Ke._weekdaysShort=re,Ke.weekdaysParse=fc,Ke._weekdaysRegex=te,Ke.weekdaysRegex=jc,Ke._weekdaysShortRegex=ue,Ke.weekdaysShortRegex=kc,Ke._weekdaysMinRegex=ve,Ke.weekdaysMinRegex=lc,Ke.isPM=sc,Ke._meridiemParse=we,Ke.meridiem=tc,E("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===r(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=u("moment.lang is deprecated. Use moment.locale instead.",E),a.langData=u("moment.langData is deprecated. Use moment.localeData instead.",H);var Le=Math.abs,Me=Yc("ms"),Ne=Yc("s"),Oe=Yc("m"),Pe=Yc("h"),Qe=Yc("d"),Re=Yc("w"),Se=Yc("M"),Te=Yc("y"),Ue=$c("milliseconds"),Ve=$c("seconds"),We=$c("minutes"),Xe=$c("hours"),Ye=$c("days"),Ze=$c("months"),$e=$c("years"),_e=Math.round,af={s:45,m:45,h:22,d:26,M:11},bf=Math.abs,cf=Oa.prototype;cf.abs=Oc,cf.add=Qc,cf.subtract=Rc,cf.as=Wc,cf.asMilliseconds=Me,cf.asSeconds=Ne,cf.asMinutes=Oe,cf.asHours=Pe,cf.asDays=Qe,cf.asWeeks=Re,cf.asMonths=Se,cf.asYears=Te,cf.valueOf=Xc,cf._bubble=Tc,cf.get=Zc,cf.milliseconds=Ue,cf.seconds=Ve,cf.minutes=We,cf.hours=Xe,cf.days=Ye,cf.weeks=_c,cf.months=Ze,cf.years=$e,cf.humanize=dd,cf.toISOString=ed,cf.toString=ed,cf.toJSON=ed,cf.locale=Bb,cf.localeData=Cb,cf.toIsoString=u("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ed),cf.lang=ne,R("X",0,0,"unix"),R("x",0,0,"valueOf"),W("x",Fd),W("X",Id),$("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),$("x",function(a,b,c){c._d=new Date(r(a))}),a.version="2.13.0",b(Ka),a.fn=De,a.min=Ma,a.max=Na,a.now=he,a.utc=h,a.unix=xc,a.months=Jc,a.isDate=d,a.locale=E,a.invalid=l,a.duration=db,a.isMoment=p,a.weekdays=Lc,a.parseZone=yc,a.localeData=H,a.isDuration=Pa,a.monthsShort=Kc,a.weekdaysMin=Nc,a.defineLocale=F,a.updateLocale=G,a.locales=I,a.weekdaysShort=Mc,a.normalizeUnits=K,a.relativeTimeThreshold=cd,a.prototype=De;var df=a;return df}); \ No newline at end of file diff --git a/data/www/webmarlin-class.js b/data/www/webmarlin-class.js new file mode 100644 index 0000000000..393fd88eef --- /dev/null +++ b/data/www/webmarlin-class.js @@ -0,0 +1,426 @@ +var wmEnums = { + Panels : { STATUS:0, CONTROLS:1, FILES:2, CONSOLE:3 }, + ConsoleDirection : { APPEND:0, PREPEND:1 }, + ConsoleLevels : { ERROR:0, SUCCESS:1, INFO:2, MONITOR:3, WARNING:4}, + WSMsgDirection : { SENT:0, RECEIVED:1 }, + WsMsgSymbols : { SENT:{LETTER:"S",ICON:null}, RECEIVED:{LETTER:"R",ICON:null} }, + WSSatuses : { CONNECTING:0, OPEN:1, CLOSING:2, CLOSED:3 }, + LogLevels : { INFO:0, WARNING:1, ERROR:2, DEBUG:3, VERBOSE:4}, + TempUnits : { CELSIUS: {LABEL:"Celsius",VALUE:0,GP:"C"}, FAHRENHEIT:{LABEL:"Fahrenheit",VALUE:1,GP:"F"}, KELVIN:{LABEL:"Kelvin",VALUE:2,GP:"K"} } +}; + +var wmSettings = { + AppName: "Marlin WebUI", + AppRelease: "January, 1 2020", + AppVersion: "1.1", + AutoConnect: false, + ConsoleDirection: wmEnums.ConsoleDirection.PREPEND, + DefaultPanel: wmEnums.Panels.CONTROLS, + LogLevel: wmEnums.LogLevels.VERBOSE, + SymbolMode: 'letter', + SymbolSend: wmEnums.WsMsgSymbols.SENT.LETTER, + SymbolReceive: wmEnums.WsMsgSymbols.RECEIVED.LETTER, + AutoTempInterval: 1, + TempUnit: wmEnums.TempUnits.CELSIUS +}; + +class wmLogItem { + constructor(text, mdir, mrs, gcmd=null, bgclass=null, ficon=null) { + this.DateTime = wmTools.GetDateTime(); + this.Text = text; + this.Direction = mdir; + this.RsType = mrs; + this.GCode = gcmd; + this.BgClass = bgclass === null ? 'console-list-items-info': bgclass; + this.FontIcon = ficon === null ? wmIcons.InfoCircle : ficon; + this.SdFile = null; + } + SetValues(text=null, mdir=null, mrs=null, gcmd=null, bgclass=null, ficon=null) { + if(text !== null) { this.Text = text; }; + if(mdir !== null) { this.Direction = mdir; }; + if(mrs !== null) { this.RsType = mrs; }; + if(gcmd !== null) { this.GCode = gcmd; }; + if(bgclass !== null) { this.BgClass = bgclass; }; + if(ficon !== null) { this.FontIcon = ficon; }; + } + ToJson() { return JSON.stringify(this); } + ToCsv() { return wmTools.StringFormatCsv(this); } + ToString() { return wmTools.Stringfy(this); } + ToLoglist(){ + switch (this.RsType) { + case wmEnums.ConsoleLevels.INFO: + this.BgClass = "console-list-items-info"; + this.FontIcon = wmIcons.InfoCircle; + break; + case wmEnums.ConsoleLevels.SUCCESS: + this.BgClass = "console-list-items-success"; + this.FontIcon = wmIcons.CheckSquare; + break; + case wmEnums.ConsoleLevels.ERROR: + this.BgClass = "console-list-items-error"; + this.FontIcon = wmIcons.Triangle; + break; + case wmEnums.ConsoleLevels.MONITOR: + this.BgClass = "console-list-items-terminal"; + this.FontIcon = wmIcons.Terminal; + break; + case wmEnums.ConsoleLevels.WARNING: + this.BgClass = "console-list-items-warning"; + this.FontIcon = wmIcons.Triangle; + break; + } + let strout = '
    • '; + strout += ''+this.FontIcon.ToHtml()+""; + strout += ''+this.DateTime+''; + strout += ''; + strout += this.Direction === wmEnums.WSMsgDirection.SENT ? wmSettings.SymbolSend : wmSettings.SymbolReceive; + strout += '' + this.Text + '
    • '; + return strout; + } + ToSdFileList() { + if(this.SdFile !== "Begin file list" && this.SdFile !== "End file list") { + let a = this.SdFile.split(" "); + let strout = ''; + strout += ''+a[0]+'
      '+wmTools.FileSizeFormat(a[1])+'
      '; + strout += '
      '; + return strout; + } + } + static ParseWsMessage(msg) { + let li = new wmLogItem(); + li.Direction = wmEnums.WSMsgDirection.RECEIVED; + li.RsType = wmEnums.ConsoleLevels.SUCCESS; + if (msg === "ok") { + jsLog.Debug("WSMessage match: ok => " + msg); + li.Text = "Acknowledge: "+msg; + } + else if (msg === "Not SD printing") { + jsLog.Debug("WSMessage match: " + msg); + li.Text = "Ack: "+msg; + WmControls.SetPrinterStatusInfo(false, msg); + } + else if (msg.substring(0, 5) === "echo:") { + if (msg.substring(5, 21) === "busy: processing") { + jsLog.Debug("WSMessage match: echo:busy: processing: => " + msg); + li.Text = msg.substring(5, msg.length); + li.RsType = wmEnums.ConsoleLevels.WARNING; + } + else if (msg.substring(5, 21) === "Unknown command:") { + jsLog.Debug("WSMessage match: echo:Unknown command: => " + msg); + li.Text = msg.substring(5, msg.length); + li.RsType = wmEnums.ConsoleLevels.WARNING; + } + else if (msg.substring(5,20) === "Now fresh file:") { + jsLog.Debug("WSMessage match: echo:Now fresh file: => " + msg); + li.Text = "SD: "+msg.substring(5, msg.length); + } + else if (msg==="File selected") { + jsLog.Debug("WSMessage match: echo:File selected: => " + msg); + li.Text = "SD: "+msg.substring(5, msg.length); + } + } + else if (msg.substring(0, 6) === "Error:") { + jsLog.Debug("WSMessage match: error => " + msg); + li.Text = msg.substring(6, msg.length); + li.RsType = wmEnums.ConsoleLevels.ERROR; + } + else if (msg.substring(0, 12) === "File opened:" || msg === "File selected") { + jsLog.Debug("WSMessage match: File opened/selected => " + msg); + li.Text = "SD: "+msg; + } + else if (msg.includes("open failed, File:")) { + jsLog.Error("WSMessage match: open file error => " + msg); + li.Text = "SD Error: "+msg; + li.RsType = wmEnums.ConsoleLevels.ERROR; + } + else if (msg.toLowerCase().includes(".gco") || msg.toLowerCase().includes(".gcode") || msg.toLowerCase().includes(".g") || msg==="Begin file list" || msg==="End file list") { + if(msg.substring(0,16)==="Writing to file:") { WmUpload.ReadyToWrite = true; } + li.Text = "SD: "+msg; + li.SdFile = msg; + } + //else if() { + //} + else { + let rgx_rtemp_eb = /^T:\d{1,3}\.\d{1,2}\s+\/\d{1,3}\.\d{1,2}\s+B:\d{1,3}\.\d{1,2}\s+\/\d{1,3}\.\d{1,2}/; + let rgx_rtemp_e = /^T:\d{1,3}\.\d{1,2}\s+\/\d{1,3}\.\d{1,2}/; + + if(rgx_rtemp_eb.test(msg) || rgx_rtemp_e.test(msg)){ + jsLog.Verbose("Extruder temperatore report: "+msg); + msg = msg.replace(/\//g,""); + let tarr = msg.split(/\s/); + WmCharts.SetTempReport(tarr); + li.Text = "Temp report: "+msg; + } + else { li.Text = msg; } + } + jsLog.Verbose(li.ToString()); + return li; + } +} + +class wmGCommandItem { + constructor(g,p,v,d,s=null) { + this.GCode = g; + this.GParams = p; + this.Values = v; + this.Description = d; + this.Supported = s===null ? true : s; + } + ToJson() { return JSON.stringify(this); } + ToString() { return wmTools.Stringfy(this); } + static CalcChecksum(gc) { + let cs = 0; + gc = gc.toUpperCase().replace(/\s/g, ''); + for(let i=0; gc[i]!=='*' && gc[i]!==null && i "+cs); + return cs; + } + static GetCommandItemByCode(gc) { + jsLog.Verbose("GetCommandItemByCode: Find preset for: "+gc); + let sgc = gc.split(/\s/); + jsLog.Verbose("GetCommandItemByCode: Command to find: "+sgc[0]); + for (let [k, v] of Object.entries(wmGCommands)) { + if(v.GCode.indexOf(sgc[0]) > -1) { return v; } + } + return null; + } +} + +class wmFontIcon { + constructor(ico, mc = null) { + this.ico = ico; + this.mClass = mc !== null ? " "+mc : ""; + } + ToString() { return wmTools.Stringfy(this); } + ToHtml() { return ""; } + AddClass(acl) { return ""; } +} + +class wmTools { + static Stringfy(obj) { + if(obj !== null && obj !== "undefined") { + let rt = ""; + for (let [k, v] of Object.entries(obj)) { rt += `${k}=${v};`; } + return rt; + } else { + return obj; + } + } + static StringFormat() { + var args = Array.prototype.slice.call(arguments, 1); + return arguments[0].replace(/\{(\d+)\}/g, function (match, index) { return args[index]; }); + } + static StringFormatJson(str) { + return JSON.stringify(str); + } + static StringFormatCsv(obj) { + let rt = ""; + for (let [k, v] of Object.entries(obj)) { rt += `${v},`; } + return rt; + } + static StringRemoveSpecials(str) { + var spc = [".","~","{","}"]; + for (var i=0; i0) { + var i = Math.floor( Math.log(size) / Math.log(1000) ); + return ( size / Math.pow(1000, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i]; + } else { + return size+" B"; + } + } + static EscapeHtml(unsafe) { + unsafe = unsafe.replace(/&/g, "&"); + unsafe = unsafe.replace(//g, ">"); + unsafe = unsafe.replace(/"/g, """); + unsafe = unsafe.replace(/'/g, "'"); + return unsafe; + } + static GetDateTime() { + var dt = new Date(); + var hr = dt.getHours() < 10 ? "0" + dt.getHours() : dt.getHours(); + var mn = dt.getMinutes() < 10 ? "0" + dt.getMinutes() : dt.getMinutes(); + var sc = dt.getSeconds() < 10 ? "0" + dt.getSeconds() : dt.getSeconds(); + return hr + ":" + mn + ":" + sc; + } + static GetBrowser() { + return $.browser.name+" v"+$.browser.versionNumber+" on "+$.browser.platform; + } + static GetScreenSize() { + let bwsize = "Viewport="+$(window).width()+"x"+$(window).height(); + bwsize += " Document="+$(document).width()+"x"+$(document).height(); + bwsize += " Screen="+window.screen.width+"x"+window.screen.height; + return bwsize; + } + static GetNumPercent(p,n) { + return (p / 100) * n; + } + static GetPercentage(p,n) { + return (p * 100) / n; + } + static FormatNumber(v,d) { + v = parseFloat(v); + return v.toFixed(d).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1.'); + } + static CelsiusToFahrenheit(n) { + return n * 9 / 5 + 32; + } + static CelsiusToKelvin(n) { + return n+273.15; + } +} + +class wmCookie { + static Read(cname) { + let decCookie = decodeURIComponent(document.cookie); + let carr = decCookie.split(';'); + for (let i=0; i "+r); + return r; + } + } + return null; + } + static Write(cvalue, cname=null) { + let d = new Date(); + d.setTime(d.getTime() + (365 * 24 * 60 * 60 * 1000)); + let expires = "expires=" + d.toGMTString(); + let cn = cname === null ? "E4dWUI" : cname; + let cv = cn+ "=" + escape(cvalue) + "; " + expires + ";path=/; SameSite=None; Secure;"; + document.cookie = cv; + jsLog.Verbose("Add/Update cookie => "+cv); + } + static CheckBrowser() { + wmCookie.Write('1','check_browser_cookie'); + return (document.cookie.indexOf('check_browser_cookie') !== -1) ? true : false; + } + static Check() { + jsLog.Verbose("Checking for browser supported cookie"); + if(wmCookie.CheckBrowser()===true) { + jsLog.Debug("Cookies supported. Looking for custom settings"); + var cStr = wmCookie.Read("E4dWUI"); + if(cStr === null){ + jsLog.Verbose("No settings cookie found. Define defaults"); + wmCookie.Write(JSON.stringify(wmSettings)); + } else { + jsLog.Debug("Settings cookie found. Loading customized settings"); + var cv = JSON.parse(cStr); + wmSettings.AutoConnect = cv.AutoConnect; + wmSettings.DefaultPanel = cv.DefaultPanel; + wmSettings.ConsoleDirection = cv.ConsoleDirection; + wmSettings.LogLevel = cv.LogLevel; + wmSettings.SymbolMode = cv.SymbolMode, + jsLog.Verbose("Customized cookie stored settings loaded"); + jsLog.Verbose(wmTools.Stringfy(wmSettings)); + } + } else { + jsLog.Warning("Cookies are not supported by the browser. Use default settings"); + } + } +} + +class jsLog { + static Info(logmsg) { + if(wmSettings.LogLevel >= wmEnums.LogLevels.INFO) { console.log("[INFO ] "+logmsg); } + } + static Warning(logmsg) { + if(wmSettings.LogLevel >= wmEnums.LogLevels.WARNING) { console.log("[WARN ] "+logmsg); } + } + static Error(logmsg) { + if(wmSettings.LogLevel >= wmEnums.LogLevels.ERROR) { console.log("[ERROR ] "+logmsg); } + } + static Debug(logmsg) { + if(wmSettings.LogLevel >= wmEnums.LogLevels.DEBUG) { console.log("[DEBUG ] "+logmsg); } + } + static Verbose(logmsg) { + if(wmSettings.LogLevel >= wmEnums.LogLevels.VERBOSE) { console.log("[VERBOSE] "+logmsg); } + } +} + +var wmGCommands = { + CustomCmd : new wmGCommandItem('',null,null,'Custom command'), + MoveFw : new wmGCommandItem('G1','Y{0}',10,'Move forward on Y axis'), + MoveBw : new wmGCommandItem('G1','Y-{0}',10,'Move backward on Y axis'), + MoveSx : new wmGCommandItem('G1','X{0}',10,'Move left on X axis'), + MoveDx : new wmGCommandItem('G1','X-{0}',10,'Move right on X axis'), + MoveUp : new wmGCommandItem('G1','Z{0}',10,'Move up on Z axis'), + MoveDw : new wmGCommandItem('G1','Z-{0}',10,'Move down on Z axis'), + FillRetrive : new wmGCommandItem('G10',null,null,'Retract filament'), + FillExtrude : new wmGCommandItem('GYYYY',null,null,'Extrude filament'), + MoveHome : new wmGCommandItem('G28',null,null,'Go home on all axis'), + MoveHomeX : new wmGCommandItem('G28','X',null,'Go home on X axis'), + MoveHomeY : new wmGCommandItem('G28','Y',null,'Go home on Y axis'), + MoveHomeZ : new wmGCommandItem('G28','Z',null,'Go home on Z axis'), + StepEnable : new wmGCommandItem('M17','{0}','E X Y Z','Enable stepper'), + StepEnableAll : new wmGCommandItem('M17',null,null,'Enable all steppers'), + StepDisable : new wmGCommandItem('M18','{0}','E X Y Z','Disable stepper'), + StepDisableAll: new wmGCommandItem('M18',null,null,'Disable all steppers'), + SdGetList : new wmGCommandItem('M20',null,null,'Get SD card content'), + SdInit : new wmGCommandItem('M21',null,null,'Init SD card'), + SdRelease : new wmGCommandItem('M22',null,null,'Release SD card'), + SdFileSel : new wmGCommandItem('M23','{0}','','Select an SD file'), + SdFilePrint : new wmGCommandItem('M24','{0}','','Start an SD print'), + SdPrintStatus : new wmGCommandItem('M27',null,null,'SD print status'), + SdPrintReport : new wmGCommandItem('M27','S{0}',5,'SD print status report'), + SdFileStart : new wmGCommandItem('M28','{0}','','Start SD write'), + SdFileStop : new wmGCommandItem('M29',null,null,'Stop SD write'), + SdFileDel : new wmGCommandItem('M30','{0}','','Delete an SD file'), + PrintTime : new wmGCommandItem('M31',null,null,'Print time'), + FanOn : new wmGCommandItem('M106','S{0}',128,'Set fan on with speed'), + FanOff : new wmGCommandItem('M107',null,null,'Set fan off'), + GetPosition : new wmGCommandItem('M114',null,null,'Get Current Position'), + FWInfo : new wmGCommandItem('M115',null,null,'Get firmware info',false), + SetTempUnit : new wmGCommandItem('M149','{0}','C','Set temperature units'), + SetTempOff : new wmGCommandItem('M155','S0','','Turn off temperature status'), + SetTempOn : new wmGCommandItem('M155','S{0}',1,'Get temp status (1 sec default)'), + GetSetting : new wmGCommandItem('M503',null,null,'Get settings report') +}; + +var wmIcons = { + Wifi: new wmFontIcon('wifi'), + Plug: new wmFontIcon('plug'), + Ban: new wmFontIcon('ban'), + Bolt: new wmFontIcon('bolt'), + Info: new wmFontIcon('info'), + InfoCircle: new wmFontIcon('info-circled'), + Triangle: new wmFontIcon('exclamation-triangle'), + CheckSquare: new wmFontIcon('check-square'), + Terminal: new wmFontIcon('terminal'), + Exchange: new wmFontIcon('exchange'), + ChevronUp: new wmFontIcon('chevron-up'), + ChevronDown: new wmFontIcon('chevron-down'), + ChevronLeft: new wmFontIcon('chevron-left'), + ChevronRight: new wmFontIcon('chevron-right'), + LongArrowUp: new wmFontIcon('long-arrow-up'), + LongArrowDown: new wmFontIcon('long-arrow-down'), + LongArrowLeft: new wmFontIcon('long-arrow-left'), + LongArrowRight: new wmFontIcon('long-arrow-right') +}; + +var wmColors = { + Black : 'rgb(0, 0, 0)', + Blue : 'rgb(54, 162, 235)', + Green : 'rgb(0, 255, 0)', + GreenSuc: 'rgb(92, 184, 92)', + GreenTur: 'rgb(75, 192, 192)', + Grey : 'rgb(201, 203, 207)', + Yellow : 'rgb(255, 205, 86)', + Orange : 'rgb(255, 159, 64)', + Purple : 'rgb(153, 102, 255)', + Red : 'rgb(255, 0, 0)', + RedCoral: 'rgb(255, 99, 132)' +}; +// Define default setting onject +jsLog.Verbose("JS Classes initializzation completed"); +jsLog.Debug("Default settings loaded: "+wmTools.Stringfy(wmSettings)); +wmCookie.Check(); diff --git a/data/www/webmarlin-font.css b/data/www/webmarlin-font.css new file mode 100644 index 0000000000..ca4c7d976a --- /dev/null +++ b/data/www/webmarlin-font.css @@ -0,0 +1,169 @@ +@charset "UTF-8"; +@font-face { + font-family: "marlinui"; + src:url("marlinui.eot"); + src:url("marlinui.eot?#iefix") format("embedded-opentype"), url("marlinui.woff") format("woff"), url("marlinui.ttf") format("truetype"), url("marlinui.svg#marlinui") format("svg"); + font-weight: normal; + font-style: normal; +} +[data-icon]:before { + font-family: "marlinui" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +[class^="icon-"]:before, [class*=" icon-"]:before { + font-family: "marlinui" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon-home:before { + content: "\61"; +} +.icon-info:before { + content: "\62"; +} +.icon-cog:before { + content: "\63"; +} +.icon-tasks:before { + content: "\64"; +} +.icon-chevron-down:before { + content: "\66"; +} +.icon-chevron-left:before { + content: "\67"; +} +.icon-chevron-right:before { + content: "\68"; +} +.icon-chevron-up:before { + content: "\69"; +} +.icon-arrows-alt:before { + content: "\6a"; +} +.icon-upload:before { + content: "\6b"; +} +.icon-ban:before { + content: "\6d"; +} +.icon-github:before { + content: "\6e"; +} +.icon-thermometer:before { + content: "\6f"; +} +.icon-bolt:before { + content: "\65"; +} +.icon-sort-asc:before { + content: "\70"; +} +.icon-sort-desc:before { + content: "\71"; +} +.icon-long-arrow-left:before { + content: "\72"; +} +.icon-long-arrow-down:before { + content: "\73"; +} +.icon-long-arrow-right:before { + content: "\74"; +} +.icon-long-arrow-up:before { + content: "\75"; +} +.icon-arrows:before { + content: "\76"; +} +.icon-arrows-v:before { + content: "\77"; +} +.icon-arrows-h:before { + content: "\78"; +} +.icon-angle-double-up:before { + content: "\79"; +} +.icon-angle-double-down:before { + content: "\7a"; +} +.icon-tencent-weibo:before { + content: "\41"; +} +.icon-playback-fast-forward:before { + content: "\42"; +} +.icon-fire:before { + content: "\43"; +} +.icon-forward:before { + content: "\44"; +} +.icon-terminal:before { + content: "\45"; +} +.icon-info-circled:before { + content: "\6c"; +} +.icon-exclamation-triangle:before { + content: "\46"; +} +.icon-exchange:before { + content: "\47"; +} +.icon-plus:before { + content: "\48"; +} +.icon-minus:before { + content: "\49"; +} +.icon-check-square:before { + content: "\4a"; +} +.icon-facebook-square:before { + content: "\4b"; +} +.icon-file:before { + content: "\4c"; +} +.icon-trash:before { + content: "\4d"; +} +.icon-print:before { + content: "\4e"; +} +.icon-refresh:before { + content: "\4f"; +} +.icon-plug:before { + content: "\51"; +} +.icon-wifi:before { + content: "\52"; +} +.icon-sliders:before { + content: "\50"; +} +.icon-folder-open:before { + content: "\54"; +} +.icon-code-download:before { + content: "\53"; +} \ No newline at end of file diff --git a/data/www/webmarlin.css b/data/www/webmarlin.css new file mode 100644 index 0000000000..aa1eea9a98 --- /dev/null +++ b/data/www/webmarlin.css @@ -0,0 +1,45 @@ +/* +Bootstrap Toggle: bootstrap4-toggle.css v3.6.1 +https://gitbrent.github.io/bootstrap4-toggle/ +*/ +.btn-group-xs>.btn,.btn-xs{padding:.35rem .4rem .25rem .4rem;font-size:.875rem;line-height:.5;border-radius:.2rem}.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-1.25rem;margin-right:.35rem}.toggle{position:relative;overflow:hidden}.toggle.btn.btn-light,.toggle.btn.btn-outline-light{border-color:rgba(0,0,0,.15)}.toggle input[type=checkbox]{display:none}.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none}.toggle-group label,.toggle-group span{cursor:pointer}.toggle.off .toggle-group{left:-100%}.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0;box-shadow:none}.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px;background-color:#fff}.toggle.btn-outline-primary .toggle-handle{background-color:var(--primary);border-color:var(--primary)}.toggle.btn-outline-secondary .toggle-handle{background-color:var(--secondary);border-color:var(--secondary)}.toggle.btn-outline-success .toggle-handle{background-color:var(--success);border-color:var(--success)}.toggle.btn-outline-danger .toggle-handle{background-color:var(--danger);border-color:var(--danger)}.toggle.btn-outline-warning .toggle-handle{background-color:var(--warning);border-color:var(--warning)}.toggle.btn-outline-info .toggle-handle{background-color:var(--info);border-color:var(--info)}.toggle.btn-outline-light .toggle-handle{background-color:var(--light);border-color:var(--light)}.toggle.btn-outline-dark .toggle-handle{background-color:var(--dark);border-color:var(--dark)}.toggle[class*=btn-outline]:hover .toggle-handle{background-color:var(--light);opacity:.5}.toggle.btn{min-width:3.7rem;min-height:2.15rem}.toggle-on.btn{padding-right:1.5rem}.toggle-off.btn{padding-left:1.5rem}.toggle.btn-lg{min-width:5rem;min-height:2.815rem}.toggle-on.btn-lg{padding-right:2rem}.toggle-off.btn-lg{padding-left:2rem}.toggle-handle.btn-lg{width:2.5rem}.toggle.btn-sm{min-width:3.125rem;min-height:1.938rem}.toggle-on.btn-sm{padding-right:1rem}.toggle-off.btn-sm{padding-left:1rem}.toggle.btn-xs{min-width:2.19rem;min-height:1.375rem}.toggle-on.btn-xs{padding-right:.8rem}.toggle-off.btn-xs{padding-left:.8rem} + +/* +E4d@box Marlin WUI +*/ +html, body { height: 100%; margin: 0; } + +@media all and (min-width: 500px) { + #main-panel{ text-align: center; } + #accordion-panels { width: 500px; height:100%; display: block; margin-left: auto; margin-right: auto;} + .modal-popup { width:400px; } +} + +.console-listbox { height: 450px; } +@media all and (max-height: 400px) { .console-listbox { height: 245px; } } +@media all and (min-height:401px) and (max-height: 500px) { .console-listbox { height: 280px; } } +@media all and (min-height:501px) and (max-height: 600px) { .console-listbox { height: 350px; } } +@media all and (min-height:601px) and (max-height: 700px) { .console-listbox { height: 350px; } } +@media all and (min-height:701px) and (max-height: 800px) { .console-listbox { height: 400px; } } +@media all and (min-height:801px) and (max-height: 900px) { .console-listbox { height: 445px; } } +@media all and (min-height:901px) and (max-height: 1000px) { .console-listbox { height: 480px; } } +@keyframes tgle { 0% { opacity: 0; } 49.99% { opacity: 0; } 50% { opacity: 1; } 99.99% { opacity: 1; } 100% { opacity: 0; } } +@keyframes blink-info { 0% { background-color: #17a2b8; } 50% { opacity: #f8f9fa; } 75% { opacity: #17a2b8; } 100% { opacity: #f8f9fa; } } + +.blink { animation-duration: 500ms; animation-name: tgle; animation-iteration-count: infinite; } +.bg-info-blink { animation-duration: 500ms; animation-name: blink-info; animation-iteration-count: infinite;} +.modal-popup { width:calc(100%-100px); } +.field-labels { font-size: 10pt; font-weight: bold; } +.field-description { font-size: 10pt; font-style: italic; } +.action-description { font-size: 10pt; } +.console-listbox { overflow-y: scroll; overflow-x: hidden; } +.console-list-items-success { background-color: lightgreen; } +.console-list-items-info { background-color: lightsteelblue; } +.console-list-items-error { background-color: lightcoral; } +.console-list-items-terminal { background-color: lightgray; } +.console-list-items-warning { background-color: orange; } +.console-list-items { font-size: 9pt; padding-left: 4px; padding-right: 4px; padding-top: 0px; padding-bottom: 4px; } +.collapse-panel { overflow-y: scroll; overflow-x: hidden; } +.card-header-title { font-size: 10pt; font-weight: bold; } +.card-header-description { font-size: 8pt; } +.badge-description { font-size: 9pt; } diff --git a/data/www/webmarlin.js b/data/www/webmarlin.js new file mode 100644 index 0000000000..943f7b9c08 --- /dev/null +++ b/data/www/webmarlin.js @@ -0,0 +1,872 @@ +var wmLogBuffer = new Array(); +var wmSdListCounter = { + FILES:0, + FOLDERS:0, + Reset: function() { + wmSdListCounter.FILES = 0; + wmSdListCounter.FOLDERS = 0; + $('#list-sd-content').empty(); + $('#div-sdlist-file-count').text(wmSdListCounter.FILES); + $('#div-sdlist-folder-count').text(wmSdListCounter.FOLDERS); + } +}; + +var WmButtonGroups = { + FileManagement: ["#btn-get-sdcontent","#btn-set-sdinit","#btn-set-sdrelease","#file-upload","#btn-file-upload"], + FileActions: ["#btn-set-sdprint","#btn-set-sddelete"], + FileProcess: ["#btn-file-proc","#btn-file-proc-cancel"], + TempStatus: ["#set-auto-temp","#auto-temp-interval","#chart-show-extruder","#chart-show-bed"], + FanSpeed: ["#fan-speed-range"], + MoveHome: ["#btn-move-home-all","#btn-move-home-x","#btn-move-home-y","#btn-move-home-z"], + Move: ["#btn-move-xl","#btn-move-xr","#btn-move-yf","#btn-move-yb","#btn-move-zu","#btn-move-zd"], + StepperAll: ["#set-stepper-all","#set-stepper-x","#set-stepper-y","#set-stepper-z","#set-stepper-e"], + Stepper: ["#set-stepper-x","#set-stepper-y","#set-stepper-z","#set-stepper-e"], + + All: function() { + let all = []; + all = all.concat( + WmButtonGroups.FileManagement, + WmButtonGroups.FileActions, + WmButtonGroups.FileProcess, + WmButtonGroups.TempStatus, + WmButtonGroups.FanSpeed, + WmButtonGroups.MoveHome, + WmButtonGroups.Move, + WmButtonGroups.StepperAll + ); + return all; + } +}; + +var wmWebSoket = { + WSObject: null, + Connect: function() { + WsUrl=`ws://${location.host}/ws`; + try { + if(wmWebSoket.WSObject === null) { + jsLog.Debug("WebSocket: Trying connecting to " + WsUrl); + wmWebSoket.WSObject = new WebSocket(WsUrl); + wmWebSoket.SetWsStatusBar(wmWebSoket.WSObject.readyState); + wmWebSoket.WSObject.onopen = function () { + jsLog.Info("WebSocket: Successfully connected to " + WsUrl); + wmWebSoket.SetWsStatusBar(wmWebSoket.WSObject.readyState); + WmControls.Enable(WmButtonGroups.All()); + wmWebSoket.Send(wmGCommands.SdPrintStatus); + }; + wmWebSoket.WSObject.onclose = function () { + jsLog.Info("WebSocket: Disconnected from "+WsUrl); + wmWebSoket.SetWsStatusBar(null); + wmWebSoket.WSObject = null; + WmControls.Disable(WmButtonGroups.All()); + }; + wmWebSoket.WSObject.onerror = function () { + jsLog.Error("WebSocket: Connection error"); + WmConsole.Trace(new wmLogItem("WebSoket connection error", wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.ERROR)); + }; + wmWebSoket.WSObject.onmessage = function (event) { + jsLog.Info("WebSocket: Message received: "+event.data); + wmWebSoket.OnMessage(event.data.trim()); + }; + } + } + catch (exception) { + jsLog.Error("WebSocket: Exception: "+exception); + wmWebSoket.SetWsStatusBar(wmWebSoket.WSObject.readyState); + WmConsole.Trace(new wmLogItem("WebSocket: Connection exception", wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.ERROR)); + } + }, + Disconnect: function() { + try { + if(wmWebSoket.WSObject !== null && wmWebSoket.WSObject.readyState === wmEnums.WSSatuses.OPEN) { + jsLog.Debug("WebSocket: Disconnecting from "+WsUrl); + WmConsole.Trace(new wmLogItem("WebSoket disconnecting...", wmEnums.WSMsgDirection.SENT, wmEnums.ConsoleLevels.INFO)); + wmWebSoket.WSObject.close(); + wmWebSoket.WSObject = null; + } + } + catch (exception) { + jsLog.Error("WebSocket: Exception: "+exception); + wmWebSoket.SetWsStatusBar(wmWebSoket.WSObject.readyState); + WmConsole.Trace(new wmLogItem("WebSoket connection exception", wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.ERROR)); + } + }, + Send: function(gCmd) { + if(wmWebSoket.WSObject !== null && wmWebSoket.WSObject.readyState === wmEnums.WSSatuses.OPEN) { + let strcmd = gCmd.GCode; + if (gCmd.GParams === null) { jsLog.Verbose('WebSocket: Send: Command with no params detected'); } + else { + jsLog.Verbose('WebSocket: Send: Arguments detected:'+gCmd.GParams); + gCmd.GParams = wmTools.StringFormat(gCmd.GParams, gCmd.Value); + strcmd = strcmd +" "+gCmd.GParams; + } + jsLog.Debug('WebSocket: Send commandstring: '+strcmd); + WmConsole.Trace(new wmLogItem("GCmd: " + strcmd + " " + gCmd.Description, wmEnums.WSMsgDirection.SENT, wmEnums.ConsoleLevels.SUCCESS)); + try { wmWebSoket.WSObject.send(strcmd + '\n'); } + catch (exception) { + jsLog.Error('WebSocket: Exception:' + exception); + WmConsole.Trace(new wmLogItem("WebSoket: Command exception: "+exception, wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.ERROR)); + } + } else { $('#modal-connect').modal('show'); } + }, + OnMessage: function(mdt) { + if(mdt === "") { jsLog.Debug("WSMessage match: Empty message (skipped)"); } + else { + let litem = wmLogItem.ParseWsMessage(mdt); + WmConsole.Trace(litem); + if(litem.SdFile !== null) { WmConsole.TraceSdFile(litem); } + } + }, + SetWsStatusBar: function(rs) { + let cli = new wmLogItem(); + let ctrls = { div:$('#div-conn-statusmsg'), ico:$('#div-conn-statusico'), btn:$('#btn-connect-status'), bar:$('#div-conn-statusbar') }; + switch (rs) { + case wmEnums.WSSatuses.CONNECTING: + cli.SetValues("Connecting to "+WsUrl, wmEnums.WSMsgDirection.SENT, wmEnums.ConsoleLevels.INFO); + ctrls.ico.html(""+wmIcons.Exchange.AddClass('')+""); + ctrls.div.html("Connecting..."); + ctrls.btn.html(""); + ctrls.bar.removeClass('bg-success bg-warning bg-danger text-light text-dark').addClass("bg-warning text-dark"); + break; + case wmEnums.WSSatuses.OPEN: + cli.SetValues("Connected to "+WsUrl, wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.SUCCESS); + ctrls.ico.html(wmIcons.Wifi.AddClass('')); + ctrls.div.html("Connected"); + ctrls.btn.html(wmIcons.Ban.ToHtml()); + ctrls.bar.removeClass('bg-success bg-warning bg-danger text-light text-dark').addClass("bg-success text-light"); + break; + case wmEnums.WSSatuses.CLOSED: + cli.SetValues("Disconnected from "+WsUrl, wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.ERROR); + ctrls.ico.html(wmIcons.Plug.AddClass('')); + ctrls.div.html("Disconnected"); + ctrls.btn.html(wmIcons.Bolt.ToHtml()); + ctrls.bar.removeClass('bg-success bg-warning bg-danger text-light text-dark').addClass("bg-danger text-light"); + break; + case wmEnums.WSSatuses.CLOSING: + cli.SetValues("Disconnecting from "+WsUrl, wmEnums.WSMsgDirection.SENT, wmEnums.ConsoleLevels.WARNING); + ctrls.ico.html(""+wmIcons.Wifi.AddClass('')+""); + ctrls.div.html("Disconnecting..."); + ctrls.btn.html(""); + ctrls.bar.removeClass('bg-success bg-warning bg-danger text-light text-dark').addClass("bg-warning text-dark"); + break; + default: + cli.SetValues("Disconnected from "+WsUrl, wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.ERROR); + ctrls.ico.html(wmIcons.Plug.AddClass('')); + ctrls.div.html("Disconnected"); + ctrls.btn.html(wmIcons.Bolt.ToHtml()); + ctrls.bar.removeClass('bg-success bg-warning bg-danger text-light text-dark').addClass("bg-danger text-light"); + break; + } + WmConsole.Trace(cli); + } +}; + +var WmUpload = { + Reader: null, + FileName: null, + FileSize: null, + FileContent: null, + ReadyToWrite: false, + Cancelled: false, + Load: function() { + let [fn,fe] = $("#file-upload-label").text().toUpperCase().split("."); + WmUpload.FileName = fn.substring(0,7)+".GCO"; + let input = $('#file-upload').get(0); + if (input.files.length) { + let tfile = input.files[0]; + WmUpload.Reader = new FileReader(); + WmUpload.Reader.onloadstart = function() { + jsLog.Debug("File uploading starting"); + $('#div-upload-fname').html(WmUpload.FileName); + if(!$('#upload-process-collapse').hasClass("show")){ $('#upload-process-collapse').collapse('show'); } + }; + WmUpload.Reader.onload = function(e) { + jsLog.Debug("File uploading completed"); + WmUpload.FileSize = e.loaded; + WmUpload.FileContent = e.target.result.split("\n"); + WmUpload.Cancelled = false; + $('#div-upload-fsize').html(wmTools.FileSizeFormat(WmUpload.FileSize)); + $('#div-upload-fproc').html(wmTools.FormatNumber(WmUpload.FileContent.length,0)); + WmControls.Enable(WmButtonGroups.FileProcess); + WmUpload.FileProgress(0,"Ready to process..."); + + }; + WmUpload.Reader.onloadend = function(e) { + jsLog.Debug("File uploading finished"); + jsLog.Debug("___________________onloadend"); + }; + WmUpload.Reader.readAsText(tfile); + return true; + } else { + WmControls.ShowModalAlert('Please select the upload file before continuing'); + WmControls.Enable(WmButtonGroups.FileManagement,WmButtonGroups.FileActions); + return false; + } + }, + Cancel: function() { + jsLog.Debug("File uploading aborted"); + WmUpload.Reader = null; + WmUpload.FileName = null; + WmUpload.FileSize = null; + WmUpload.Cancelled = true; + WmControls.Disable(WmButtonGroups.FileProcess); + WmControls.Enable(WmButtonGroups.FileManagement,WmButtonGroups.FileActions); + $('#div-upload-fsize').html("-"); + $('#div-upload-fproc').html("-"); + $('#div-upload-fname').html("-"); + WmUpload.FileProgress(0," "); + if($('#upload-process-collapse').hasClass("show")){ $('#upload-process-collapse').collapse('hide'); } + }, + FileProcess: function() { + WmControls.Disable([$("#btn-file-proc")]); + let fl = WmUpload.FileContent.length; + jsLog.Debug("Start process GCode lines ("+WmUpload.FileSize+" total)"); + WmUpload.FileProgress(0,"Start analyzing uploaded GCode..."); + wmGCommands.SdFileStart.GParams = WmUpload.FileName; + wmWebSoket.Send(wmGCommands.SdFileStart); + var i = 0; + var n = 1; + (function pgline() { + if(WmUpload.Cancelled){ + wmWebSoket.Send(wmGCommands.SdFileStop); + return; + } + else if(!WmUpload.ReadyToWrite){ + jsLog.Debug("WmUpload.FileProcess: Waiting ready to write..."); + WmUpload.FileProgress(0,"Waiting ready to write..."); + setTimeout(pgline, 500); + } + else { + let p = wmTools.GetPercentage(i+1,fl); + WmUpload.FileProgress(p,"Analyzing line "+(i+1)+" of "+fl); + let gitem = { line:WmUpload.FileContent[i], process:false, cksum:0 }; + + if(gitem.line.trim()==="" || gitem.line.match(/^ *$/)) { jsLog.Verbose("GLine: "+i+": "+gitem.line+" => Empty line (skip)"); } + else if(gitem.line.substring(0,1)===";") { jsLog.Verbose("GLine: "+i+": "+gitem.line+" => Comment line (skip)"); } + else if(gitem.line.indexOf(";") > -1) { gitem.line = gitem.line.substring(0,gitem.line.indexOf(";")); gitem.process=true; } + else { gitem.process = true; } + + if(gitem.process) { + gitem.line = "N"+n+" "+gitem.line.trim(); + gitem.line = gitem.line+"*"+wmGCommandItem.CalcChecksum(gitem.line); + jsLog.Verbose("GLINE TO SEND: "+gitem.line); + wmGCommands.CustomCmd.GCode = gitem.line; + wmWebSoket.Send(wmGCommands.CustomCmd); + n++; + } + i++; + if (i < fl) { setTimeout(pgline, 10); } + else { + WmUpload.FileProgress(100,"GCode Analysis completed!"); + WmUpload.ReadyToWrite = false; + wmWebSoket.Send(wmGCommands.SdFileStop); + WmUpload.FileCompleted(); + } + } + })(); + }, + FileProgress: function(p,m) { + p = wmTools.FormatNumber(p,0); + $('#upload-progressbar').text(p+"%"); + $('#upload-progressbar').css('width',p+'%').attr('aria-valuenow', p); + $('#upload-progress-text').html(m); + if(p===100) { $('#upload-progressbar').removeClass("progress-bar-animated"); } + }, + FileCompleted: function() { + WmControls.Disable(WmButtonGroups.FileProcess); + WmButtons.GetSdContentList(); + }, +}; + +var WmButtons = { + ConsoleListClear: function() { WmConsole.Clear(); }, + ConsoleListExport: function() { WmConsole.Export(); }, + DeleteSdConfirm: function() { + $('#div-sdfile-delete-badge').html($('#txt-sdfile-selected').val()); + }, + DeleteSdSelected: function() { + jsLog.Debug("DeleteSdSelected: Delete file:"+$("#txt-sdfile-selected").val()); + WmControls.Disable(WmButtonGroups.FileActions); + $('#div-sdfile-delete-rs').collapse('show'); + wmGCommands.SdFileDel.GParams = $("#txt-sdfile-selected").val(); + wmWebSoket.Send(wmGCommands.SdFileDel); + setTimeout(function(){ + $('#modal-sdfile-delete').modal('hide'); + $('#div-sdfile-delete-rs').collapse('hide'); + WmButtons.GetSdContentList(); + }, 2000); + }, + GCommandSetPreset: function(gc) { + jsLog.Debug("Set preset GCommand ("+gc+")"); + $('#text-gcommand').val(gc); + $('#modal-presets').modal('hide'); + WmAutostart.SetGCommandChecksum(); + }, + GetSdContentList: function() { + wmSdListCounter.Reset(); + $('#txt-sdfile-selected').val(''); + WmControls.Disable(WmButtonGroups.FileManagement); + wmWebSoket.Send(wmGCommands.SdGetList); + }, + PrintSdConfirm: function() { + $('#div-sdfile-print-badge').html($('#txt-sdfile-selected').val()); + }, + PrintSdSelected: function() { + jsLog.Debug("PrintSdSelected: Print file:"+$("#txt-sdfile-selected").val()); + WmControls.Disable(WmButtonGroups.FileActions); + $('#div-sdfile-print-rs').collapse('show'); + wmGCommands.SdFilePrint.GParams = $("#txt-sdfile-selected").val(); + wmWebSoket.Send(wmGCommands.SdFilePrint); + setTimeout(function(){ + $('#modal-sdfile-print').modal('hide'); + $('#div-sdfile-print-rs').collapse('hide'); + WmAutostart.SetShownPanel(wmEnums.Panels.STATUS); + }, 2000); + }, + SaveSettings: function() { + jsLog.Verbose("Button 'btn-save-settings' clicked"); + WmControls.Disable(['#btn-save-settings','#btn-close-settings']); + wmSettings.AutoConnect = document.getElementById('set-auto-connect').checked; + wmSettings.DefaultPanel = parseInt($('#set-default-panel').val()); + wmSettings.LogLevel = parseInt($('#set-log-level').val()); + wmSettings.SymbolMode = $('#set-log-symbol').val(); + wmSettings.AutoTempInterval = $('#set-default-autotemp').val(); + if($('#set-default-tempunit').val()===0) { wmSettings.TempUnit = wmEnums.TempUnits.CELSIUS; } + else if($('#set-default-tempunit').val()===1) { wmSettings.TempUnit = wmEnums.TempUnits.FAHRENHEIT; } + else if( $('#set-default-tempunit').val()===2) { wmSettings.TempUnit = wmEnums.TempUnits.KELVIN; } + + if(wmSettings.SymbolMode==='letter') { + wmSettings.SymbolSend = wmEnums.WsMsgSymbols.SENT.LETTER; + wmSettings.SymbolReceive = wmEnums.WsMsgSymbols.RECEIVED.LETTER; + } else { + wmSettings.SymbolSend = $('#div-log-symbol-icon-sample-s').html(); + wmSettings.SymbolReceive = $('#div-log-symbol-icon-sample-r').html(); + } + if(document.getElementById('set-trace-mode-append').checked) { + wmSettings.ConsoleDirection = wmEnums.ConsoleDirection.APPEND; + } else { + wmSettings.ConsoleDirection = wmEnums.ConsoleDirection.PREPEND; + } + wmCookie.Write(wmTools.StringFormatJson(wmSettings)); + $('#div-save-setting-rs').collapse('show'); + setTimeout(function(){ + $('#modal-settings').modal('hide'); + $('#div-save-setting-rs').collapse('hide'); + WmControls.Enable(['#btn-save-settings','#btn-close-settings']); + }, 2000); + }, + SdInit: function() { + wmWebSoket.Send(wmGCommands.SdInit); + }, + SdRelease: function() { + wmWebSoket.Send(wmGCommands.SdRelease); + }, + SendGcommand: function() { + if(wmWebSoket.WSObject !== null && wmWebSoket.WSObject.readyState === wmEnums.WSSatuses.OPEN) { + WmControls.Disable(["#btn-gcommand"]); + let gcmd = $('#text-gcommand'); + if (gcmd.val() === "") { + gcmd.removeClass('border-dark').addClass('border-danger'); + jsLog.Warning("Empty custom command string detected"); + gcmd.focus(); + } else { + gcmd.removeClass('border-danger').addClass('border-dark'); + let gc = wmGCommandItem.GetCommandItemByCode(gcmd.val().trim().toUpperCase()); + if(gc === null) { + wmGCommands.CustomCmd.GCode = gcmd.val().trim().toUpperCase(); + jsLog.Debug("Sending custom command: " + wmGCommands.CustomCmd.GCode); + wmWebSoket.Send(wmGCommands.CustomCmd); + } else { + if(gc.Supported) { + wmGCommands.CustomCmd.GCode = gcmd.val().trim().toUpperCase(); + jsLog.Debug("Sending custom command: " + wmGCommands.CustomCmd.GCode); + wmWebSoket.Send(wmGCommands.CustomCmd); + } else { + jsLog.Warning("Unsupported command: " + wmGCommands.CustomCmd.GCode); + WmConsole.Trace(new wmLogItem("GCmd: " + gcmd.val() + " Unsupported command", wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.ERROR)); + } + } + gcmd.val(''); + $('#checksum-gcommand-value').html(' '); + WmControls.Enable(["#btn-gcommand"]); + } + } else { $('#modal-connect').modal('show'); } + }, + SetPositionHome: function(b) { + if(b.id==="btn-move-home-all"){ wmWebSoket.Send(wmGCommands.MoveHome); } + else if (b.id==="btn-move-home-x"){ wmWebSoket.Send(wmGCommands.MoveHomeX); } + else if (b.id==="btn-move-home-y"){ wmWebSoket.Send(wmGCommands.MoveHomeY);} + else if (b.id==="btn-move-home-z"){ wmWebSoket.Send(wmGCommands.MoveHomeZ);} + }, + SetSdSelected: function(sdi) { + jsLog.Debug("SetSdSelected: Selected file:"+$(sdi).attr("data-sdfile")); + $('#txt-sdfile-selected').val($(sdi).attr("data-sdfile")); + let lip = document.getElementById("list-sd-content").getElementsByTagName("a"); + for (let i=0; i 0) { + for(let i=0; i 0) { + for(let i=0; i"+fsv+""); + $('#div-fan-speed-set').html(rv+"%"+fsv+""); + if(rv===0) { wmWebSoket.Send(wmGCommands.FanOff); } + else { + wmGCommands.FanOn.GParams = "S"+fsv; + wmWebSoket.Send(wmGCommands.FanOn); + } + WmChartsData.FanSpeed.DataUpdate(rv); + }, + ResetSdFileCounters() { + $('#list-sd-content').empty(); + $('#div-sdlist-file-count').text(0); + $('#div-sdlist-folder-count').text(0); + }, + UpdateTemperatures: function(dt){ + $('#div-temp-extruder-detect').text(dt.ExtruderTemp); + $('#div-temp-extruder-set').text(dt.ExtruderSet); + $('#div-temp-extruder-unit').text(wmSettings.TempUnit.LABEL); + if(dt.BedTemp !== null) { + $('#div-temp-bed-detect').text(dt.BedTemp); + $('#div-temp-bed-set').text(dt.BedSet); + $('#div-temp-bed-unit').text(wmSettings.TempUnit.LABEL); + } + }, + SetPrinterStatusInfo: function(s, m) { + if(!s) { + $('#div-pstatus-sdprint').removeClass("badge-danger").addClass("badge-info"); + $('#div-pstatus-sdprint').html("Ready to print"); + $('#div-pstatus-timer').collapse('hide'); + $('#div-pstatus-progress').collapse('hide'); + } else { + $('#div-pstatus-sdprint').removeClass("badge-danger badge-info").addClass("badge-success"); + $('#div-pstatus-sdprint').html("Printing in progress"); + $('#div-pstatus-timer').collapse('show'); + $('#div-pstatus-progress').collapse('show'); + } + }, + SetSteppers: function(o) { + if(o.id==="set-stepper-all") { + WmControls.SetCheckStatus(WmButtonGroups.Stepper,o.checked); + if(o.checked) { wmWebSoket.Send(wmGCommands.StepEnableAll); } else { wmWebSoket.Send(wmGCommands.StepDisableAll); } + } else { + if(o.id==="set-stepper-x") { wmGCommands.StepEnable.GParams = "X"; } + else if(o.id==="set-stepper-y") { wmGCommands.StepEnable.GParams = "Y"; } + else if(o.id==="set-stepper-z") { wmGCommands.StepEnable.GParams = "Z"; } + else if(o.id==="set-stepper-e") { wmGCommands.StepEnable.GParams = "E"; } + if(o.checked) { wmWebSoket.Send(wmGCommands.StepEnable); } else { wmWebSoket.Send(wmGCommands.StepDisable); } + } + }, +}; + +var WmChartsData = { + Temperatures: { + TimeFormat: 'HH:mm:ss', + Speed: 1000, + Scale: 1, + Extruder: { + Label: "Extruder", + BorderColor: wmColors.RedCoral, + BgColor: wmColors.RedCoral, + Data:[] + }, + Bed: { + Label: "Bed", + BorderColor: wmColors.Blue, + BgColor: wmColors.Blue, + Data:[] + }, + AddEmpty: function(arr, n) { + for(var i = 0; i < n; i++) { + let xd = moment().subtract((n - i) * WmChartsData.Temperatures.Speed, 'milliseconds').toDate(); + arr.push({ x: xd, y: null }); + } + }, + DataUpdate(di) { + let dt = new Date(); + WmChartsData.Temperatures.Extruder.Data.push({ x: dt, y: di.ExtruderTemp }); + WmChartsData.Temperatures.Extruder.Data.shift(); + if(di.BedTemp !== null) { + WmChartsData.Temperatures.Bed.Data.push({ x: dt, y: di.BedTemp }); + WmChartsData.Temperatures.Bed.Data.shift(); + } + requestAnimationFrame(WmCharts.Advance); + } + }, + FanSpeed: { + Values: { + Label: ["Fan speed",""], + BgColor: [wmColors.GreenSuc, wmColors.Grey], + Data: [0,100] + }, + DataUpdate(di) { + WmChartsData.FanSpeed.Values.Data[0] = di; + WmChartsData.FanSpeed.Values.Data[1] = 100 - di; + if(di < 30) { WmChartsData.FanSpeed.Values.BgColor[0] = wmColors.GreenSuc; } + else if(di < 60) { WmChartsData.FanSpeed.Values.BgColor[0] = wmColors.Yellow; } + else if(di < 80) { WmChartsData.FanSpeed.Values.BgColor[0] = wmColors.Orange; } + else { WmChartsData.FanSpeed.Values.BgColor[0] = wmColors.Red; } + requestAnimationFrame(function() { WmCharts.FanSpeed.CanvasItem.update()}); + } + } +}; + +var WmCharts = { + Temperatures: { + CanvasItem: null, + Config: { + type: 'line', + data: { + datasets: [{ + label: WmChartsData.Temperatures.Extruder.Label, + data: WmChartsData.Temperatures.Extruder.Data, + backgroundColor: WmChartsData.Temperatures.Extruder.BgColor, + borderColor: WmChartsData.Temperatures.Extruder.BorderColor, + borderWidth: 2, + fill: false, + pointRadius: 1.5 + },{ + label: WmChartsData.Temperatures.Bed.Label, + data: WmChartsData.Temperatures.Bed.Data, + backgroundColor: WmChartsData.Temperatures.Bed.BgColor, + borderColor: WmChartsData.Temperatures.Bed.BorderColor, + borderWidth: 2, + fill: false, + pointRadius: 1.5 + }] + }, + options: { + responsive: true, + animation: { duration: WmChartsData.Temperatures.Speed * 1.5, easing:'linear' }, + scales: { + xAxes: [{ type:'time', time:{ displayFormats: { second: 'HH:mm:ss'} }, scaleLabel: { display: false } }], + yAxes: [{ ticks: { min: 0} }] + } + } + }, + DisplayAxis: function(ck) { + if(ck.id==="chart-show-extruder") { + WmCharts.Temperatures.CanvasItem.getDatasetMeta(0).hidden = ck.checked===true ? false : true; + $('#chart-show-extruder-label').text(ck.checked===true ? "Show" : "Hide"); + } + else if(ck.id==="chart-show-bed") { + WmCharts.Temperatures.CanvasItem.getDatasetMeta(1).hidden = ck.checked===true ? false : true; + $('#chart-show-bed-label').text(ck.checked===true ? "Show" : "Hide"); + } + if(!$('#set-auto-temp').prop('checked')){ WmCharts.Temperatures.CanvasItem.update(); } + } + }, + FanSpeed: { + CanvasItem: null, + Config: { + type: 'doughnut', + data: { + datasets: [{ + data: WmChartsData.FanSpeed.Values.Data, + backgroundColor: WmChartsData.FanSpeed.Values.BgColor, + }], + labels: WmChartsData.FanSpeed.Values.Label + }, + options: { + responsive: true, + circumference: Math.PI, + rotation: -Math.PI, + legend: { display: false }, + tooltips: { enabled: false }, + title: { display: false }, + animation: { + animateScale: true, + animateRotate: true, + onComplete: function () { + var ctx = this.chart.ctx; + ctx.font = "14pt Verdana"; + ctx.textAlign = 'center'; + ctx.textBaseline = 'bottom'; + ctx.fillStyle = wmColors.Black; + let ds = this.data.datasets; + let model = ds[0]._meta[Object.keys(ds[0]._meta)[0]].data[0]._model; + let xp = wmTools.FormatNumber(model.x,0), yp = wmTools.FormatNumber(model.y,0); + jsLog.Debug("Drawing speed gauge percentage label position (x,y): "+xp+","+yp); + ctx.fillText(WmChartsData.FanSpeed.Values.Data[0]+'%', xp, yp); + } + } + } + } + }, + Init: function() { + WmChartsData.Temperatures.AddEmpty(WmChartsData.Temperatures.Extruder.Data, 20); + WmChartsData.Temperatures.AddEmpty(WmChartsData.Temperatures.Bed.Data, 20); + WmCharts.Temperatures.CanvasItem = new Chart(document.getElementById('chart-temps'), WmCharts.Temperatures.Config); + WmCharts.FanSpeed.CanvasItem = new Chart(document.getElementById('chart-fanspeed'), WmCharts.FanSpeed.Config); + }, + Advance: function() { + if (WmChartsData.Temperatures.Extruder.Data[0] !== null && WmChartsData.Temperatures.Extruder.Scale < 4) { WmCharts.Temperatures.CanvasItem.update(); } + WmCharts.Temperatures.CanvasItem.update(); + }, + SetTempReport: function(tr) { + let temps = { + ExtruderTemp: tr[0].replace(/T:/,""), + ExtruderSet: tr[1], + BedTemp: tr[2]==="undefined" ? null : tr[2].replace(/B:/,""), + BedSet: tr[3]==="undefined" ? null : tr[3] + }; + WmChartsData.Temperatures.DataUpdate(temps); + WmControls.UpdateTemperatures(temps); + } +}; + +var WmConsole = { + Clear: function() { + jsLog.Debug("Clearing console message list..."); + $('#gcommand-console-list').empty(); + wmLogBuffer.length = 0; + WmConsole.Trace(new wmLogItem("Console list cleared by user", wmEnums.WSMsgDirection.RECEIVED, wmEnums.ConsoleLevels.SUCCESS)); + }, + Export: function() { + jsLog.Debug("Exporting console message list..."); + var fdt = new Array(); + // DA FINIRE LA PRIMA RIGA NOMI CAMPI + for(i=0; i-1) { wmSdListCounter.FOLDERS++; } + } + $('#list-sd-content').append(litem.ToSdFileList()); + $('#div-sdlist-file-count').text(wmSdListCounter.FILES); + $('#div-sdlist-folder-count').text(wmSdListCounter.FOLDERS); + if(litem.SdFile === "End file list") { WmControls.Enable(WmButtonGroups.FileManagement); } + } +}; + +var WmAutostart = { + SetDefaultPanel: function() { + jsLog.Verbose("Set default shown panel ("+wmSettings.DefaultPanel+")"); + if (wmSettings.DefaultPanel == wmEnums.Panels.STATUS) { $('#accordion-panel-status-body').addClass("show"); } + else if (wmSettings.DefaultPanel === wmEnums.Panels.CONTROLS) { $('#accordion-panel-controls-body').addClass("show"); } + else if (wmSettings.DefaultPanel === wmEnums.Panels.TEMP) { $('#accordion-panel-temp-body').addClass("show"); } + else if (wmSettings.DefaultPanel === wmEnums.Panels.FILES) { $('#accordion-panel-file-body').addClass("show"); } + else if (wmSettings.DefaultPanel === wmEnums.Panels.CONSOLE) { $('#accordion-panel-console-body').addClass("show"); } + }, + SetShownPanel: function(p) { + jsLog.Verbose("Set shown panel ("+p+")"); + if (p === wmEnums.Panels.STATUS) { $('#accordion-panel-status-body').removeClass("hide").addClass("show"); } else { $('#accordion-panel-status-body').removeClass("show").addClass("hide"); } + if (p === wmEnums.Panels.CONTROLS) { $('#accordion-panel-controls-body').removeClass("hide").addClass("show"); } else { $('#accordion-panel-controls-body').removeClass("show").addClass("hide"); } + if (p === wmEnums.Panels.TEMP) { $('#accordion-panel-temp-body').removeClass("hide").addClass("show"); } else { $('#accordion-panel-temp-body').removeClass("show").addClass("hide"); } + if (p === wmEnums.Panels.FILES) { $('#accordion-panel-file-body').removeClass("hide").addClass("show"); } else { $('#accordion-panel-file-body').removeClass("show").addClass("hide"); } + if (p === wmEnums.Panels.CONSOLE) { $('#accordion-panel-console-body').removeClass("hide").addClass("show"); } else { $('#accordion-panel-console-body').removeClass("show").addClass("hide"); } + }, + SetGCommandChecksum: function() { + cs = wmGCommandItem.CalcChecksum($('#text-gcommand').val()); + $('#checksum-gcommand-value').text(cs); + jsLog.Debug("Set GCommand checksum ("+cs+")"); + }, + SetGCommandPresetList: function() { + jsLog.Verbose("Fill GCommand preset list"); + let lip = document.getElementById("list-presets").getElementsByTagName("li"); + let i=0; + if(lip.length === 1) { + Object.keys(wmGCommands).forEach(key => { + if(wmGCommands[key].GCode != "" && wmGCommands[key].Supported) { + let gp = wmGCommands[key].GParams !== null ? wmTools.StringFormat(wmGCommands[key].GParams,wmGCommands[key].Values) : ''; + var lib = ""; + $('#list-presets').append(lib); + i++; + } + }); + } + jsLog.Verbose("Fill GCommand preset list completed ("+i+" items)"); + }, + SetWmSettingsControls: function() { + jsLog.Verbose("Set settings controls fields"); + $('#set-default-panel').val(wmSettings.DefaultPanel); + $('#set-auto-connect').bootstrapToggle(wmSettings.AutoConnect==true ? "on" : "off"); + $('#set-default-autotemp').val(wmSettings.AutoTempInterval); + $('#set-default-tempunit').val(wmSettings.TempUnit.VALUE); + $('#set-log-level').val(wmSettings.LogLevel); + if(wmSettings.ConsoleDirection===wmEnums.ConsoleDirection.APPEND) { + $('#set-trace-mode-prepend').prop('checked',false); + $('#set-trace-mode-append').prop('checked',true); + } else { + $('#set-trace-mode-append').prop('checked',false); + $('#set-trace-mode-prepend').prop('checked',true); + } + $('#set-log-symbol').val(wmSettings.SymbolMode); + if(wmSettings.SymbolMode==='letter') { $('#div-log-symbol-icon').collapse('hide'); } + else { $('#div-log-symbol-icon').collapse('show'); SetConsoleSymbolIcon(); } + }, + SetAutotempDefault: function() { + $('#auto-temp-interval').val(wmSettings.AutoTempInterval); + } +}; + +$(document).ready(function () { + $('.accordion-always-open').on('show.bs.collapse', function () { $(this).data('isShowing', true); }); + $('.accordion-always-open').on('hide.bs.collapse', function (event) { + if (!$(this).data('isShowing')) { event.preventDefault(); } + $(this).data('isShowing', false); + }); + jsLog.Debug("Browser in use: "+wmTools.GetBrowser()); + jsLog.Debug("Browser sizes: "+wmTools.GetScreenSize()); + + // AutoStar Actions + WmAutostart.SetWmSettingsControls(); + WmAutostart.SetDefaultPanel(); + WmAutostart.SetGCommandPresetList(); + WmAutostart.SetAutotempDefault(); + + // EVENTS: Buttons + $('#btn-clear-console').click(function() { WmButtons.ConsoleListClear(); }); + $('#btn-export-console').click(function() { WmButtons.ConsoleListExport(); }); + $('#btn-file-proc').click(function(){ WmUpload.FileProcess(); }); + $('#btn-file-proc-cancel').click(function() { WmUpload.Cancel(); }); + $('#btn-file-upload').click(function(){ WmButtons.UploadSdFile(); }); + $('#btn-gcommand').click(function() { WmButtons.SendGcommand(); }); + $('#btn-get-sdcontent').click(function() { WmButtons.GetSdContentList(); }); + $('#btn-move-home-all').click(function() { WmButtons.SetPositionHome(this); }); + $('#btn-move-home-x').click(function() { WmButtons.SetPositionHome(this); }); + $('#btn-move-home-y').click(function() { WmButtons.SetPositionHome(this); }); + $('#btn-move-home-z').click(function() { WmButtons.SetPositionHome(this); }); + $('#btn-save-settings').click(function() { WmButtons.SaveSettings(); }); + $('#btn-sdfile-delete-modal').click(function() { WmButtons.DeleteSdSelected(); }); + $('#btn-sdfile-print-modal').click(function() { WmButtons.PrintSdSelected(); }); + $('#btn-set-sdinit').click(function() { WmButtons.SdInit(); }); + $('#btn-set-sdrelease').click(function() { WmButtons.SdRelease(); }); + $('#btn-wsconnect').click(function() { WmButtons.WsConnect(); }); + $('#btn-wsconnect-modal').click(function() { WmButtons.WsConnect(); }); + + // EVENTS: Inputs fields + $('#text-gcommand').keyup(function() { WmAutostart.SetGCommandChecksum(); }); + $('#text-gcommand').change(function() { WmAutostart.SetGCommandChecksum(); }); + $('#set-log-symbol').change(function() { WmConsole.SetMessageSymbol(); }); + $('#set-log-symbol-icon').change(function() { WmConsole.SetSymbolIcon(); }); + $('#file-upload').change( function() { WmControls.SetUpload(); }); + $('#set-auto-temp').change( function() { WmControls.SetAutoTemp(); }); + $('#auto-temp-interval').change( function() { WmControls.SetAutoTemp();} ); + $('#chart-show-extruder').change( function() { WmCharts.Temperatures.DisplayAxis(this); }); + $('#chart-show-bed').change( function() { WmCharts.Temperatures.DisplayAxis(this); }); + $('#fan-speed-range').on("change", function() { WmControls.SetFanSpeed(this.value); }); + $('#set-stepper-all').change( function() { WmControls.SetSteppers(this); }); + $('#set-stepper-e').change( function() { WmControls.SetSteppers(this); }); + $('#set-stepper-x').change( function() { WmControls.SetSteppers(this); }); + $('#set-stepper-y').change( function() { WmControls.SetSteppers(this); }); + $('#set-stepper-z').change( function() { WmControls.SetSteppers(this); }); + + // Autorun onload + WmConsole.Trace(new wmLogItem("Ready", wmEnums.WSMsgDirection.SENT, wmEnums.ConsoleLevels.SUCCESS)); + if(wmSettings.AutoConnect===true) { wmWebSoket.Connect(); } + window.onload = function() { + WmCharts.Init(); + WmCharts.Advance(); + }; + + WmControls.Enable(WmButtonGroups.All()); +}); From 01b9badb518059d82d3474857c7dda5e41814a03 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 21 Oct 2020 12:14:19 -0700 Subject: [PATCH 0439/1370] BigTreeTech SKR Mini MZ V1 (#19818) --- Marlin/src/core/boards.h | 27 ++++++++++--------- Marlin/src/pins/pins.h | 2 ++ .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h | 4 ++- .../pins/stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h | 26 ++++++++++++++++++ 4 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 605f2e74a4..1854e42ec2 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -311,19 +311,20 @@ #define BOARD_BTT_SKR_MINI_E3_V1_0 4022 // BigTreeTech SKR Mini E3 (STM32F103RC) #define BOARD_BTT_SKR_MINI_E3_V1_2 4023 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) #define BOARD_BTT_SKR_MINI_E3_V2_0 4024 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) -#define BOARD_BTT_SKR_E3_DIP 4025 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) -#define BOARD_JGAURORA_A5S_A1 4026 // JGAurora A5S A1 (STM32F103ZET6) -#define BOARD_FYSETC_AIO_II 4027 // FYSETC AIO_II -#define BOARD_FYSETC_CHEETAH 4028 // FYSETC Cheetah -#define BOARD_FYSETC_CHEETAH_V12 4029 // FYSETC Cheetah V1.2 -#define BOARD_LONGER3D_LK 4030 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 -#define BOARD_CCROBOT_MEEB_3DP 4031 // ccrobot-online.com MEEB_3DP (STM32F103RC) -#define BOARD_CHITU3D_V5 4032 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CHITU3D_V6 4033 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CREALITY_V4 4034 // Creality v4.x (STM32F103RE) -#define BOARD_CREALITY_V427 4035 // Creality v4.2.7 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4036 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4037 // FLY MINI (STM32F103RCT6) +#define BOARD_BTT_SKR_MINI_MZ_V1_0 4025 // BigTreeTech SKR Mini MZ V1.0 (STM32F103RC) +#define BOARD_BTT_SKR_E3_DIP 4026 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) +#define BOARD_JGAURORA_A5S_A1 4027 // JGAurora A5S A1 (STM32F103ZET6) +#define BOARD_FYSETC_AIO_II 4028 // FYSETC AIO_II +#define BOARD_FYSETC_CHEETAH 4029 // FYSETC Cheetah +#define BOARD_FYSETC_CHEETAH_V12 4030 // FYSETC Cheetah V1.2 +#define BOARD_LONGER3D_LK 4031 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 +#define BOARD_CCROBOT_MEEB_3DP 4032 // ccrobot-online.com MEEB_3DP (STM32F103RC) +#define BOARD_CHITU3D_V5 4033 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CHITU3D_V6 4034 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CREALITY_V4 4035 // Creality v4.x (STM32F103RE) +#define BOARD_CREALITY_V427 4036 // Creality v4.2.7 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4037 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4038 // FLY MINI (STM32F103RCT6) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 1e2da66228..f43214f7be 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -553,6 +553,8 @@ #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB #elif MB(BTT_SKR_MINI_E3_V2_0) #include "stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB +#elif MB(BTT_SKR_MINI_MZ_V1_0) + #include "stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB #elif MB(BTT_SKR_E3_DIP) #include "stm32f1/pins_BTT_SKR_E3_DIP.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB #elif MB(JGAURORA_A5S_A1) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h index 0a0d857db3..8ed30bffb7 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h @@ -32,7 +32,9 @@ #include "pins_BTT_SKR_MINI_E3_common.h" -#define BOARD_INFO_NAME "BTT SKR Mini E3 V2.0" +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "BTT SKR Mini E3 V2.0" +#endif // Release PA13/PA14 (led, usb control) from SWD pins #define DISABLE_DEBUG diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h new file mode 100644 index 0000000000..96420cf322 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define BOARD_INFO_NAME "BTT SKR Mini MZ V1.0" + +#include "pins_BTT_SKR_MINI_E3_V2_0.h" From 99ce660aed96e371172c452381727080d877c866 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 21 Oct 2020 15:03:11 -0500 Subject: [PATCH 0440/1370] Add power-on/off G-code options (#19837) Co-authored-by: Chris --- Marlin/Configuration.h | 3 +++ Marlin/src/feature/power.cpp | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index b5dfb43fa2..5ec41c596b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -335,6 +335,9 @@ //#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80 //#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power + //#define PSU_POWERUP_GCODE "M355 S1" // G-code to run after power-on (e.g., case light on) + //#define PSU_POWEROFF_GCODE "M355 S0" // G-code to run before power-off (e.g., case light off) + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin #if ENABLED(AUTO_POWER_CONTROL) #define AUTO_POWER_FANS // Turn on PSU if fans need power diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 5be554e5e4..9427f684e7 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -33,6 +33,10 @@ #include "../module/stepper/indirection.h" #include "../MarlinCore.h" +#if defined(PSU_POWERUP_GCODE) || defined(PSU_POWEROFF_GCODE) + #include "../gcode/gcode.h" +#endif + #if BOTH(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) #include "controllerfan.h" #endif @@ -107,11 +111,19 @@ void Power::power_on() { safe_delay(PSU_POWERUP_DELAY); restore_stepper_drivers(); TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); + #ifdef PSU_POWERUP_GCODE + GcodeSuite::process_subcommands_now_P(PSTR(PSU_POWERUP_GCODE)); + #endif } } void Power::power_off() { - if (powersupply_on) PSU_PIN_OFF(); + if (powersupply_on) { + #ifdef PSU_POWEROFF_GCODE + GcodeSuite::process_subcommands_now_P(PSTR(PSU_POWEROFF_GCODE)); + #endif + PSU_PIN_OFF(); + } } #endif // AUTO_POWER_CONTROL From 32433fae61a25cf7f1d652429d46bcd574ba6efd Mon Sep 17 00:00:00 2001 From: Foxies Date: Thu, 22 Oct 2020 02:00:57 +0200 Subject: [PATCH 0441/1370] FLSUN Delta QQS-Pro pins (#19793) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 366 ++++++++++++++++++ .../share/PlatformIO/scripts/add_nanolib.py | 2 + platformio.ini | 15 + 5 files changed, 386 insertions(+) create mode 100644 Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h create mode 100644 buildroot/share/PlatformIO/scripts/add_nanolib.py diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 1854e42ec2..e115903342 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -325,6 +325,7 @@ #define BOARD_CREALITY_V427 4036 // Creality v4.2.7 (STM32F103RE) #define BOARD_TRIGORILLA_PRO 4037 // Trigorilla Pro (STM32F103ZET6) #define BOARD_FLY_MINI 4038 // FLY MINI (STM32F103RCT6) +#define BOARD_FLSUN_HISPEED 4039 // FLSUN HiSpeedV1 (STM32F103VET6) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index f43214f7be..3a380def74 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -581,6 +581,8 @@ #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro #elif MB(FLY_MINI) #include "stm32f1/pins_FLY_MINI.h" // STM32F1 env:FLY_MINI +#elif MB(FLSUN_HISPEED) + #include "stm32f1/pins_FLSUN_HISPEED.h" // STM32F1 env:flsun_hispeed // // ARM Cortex-M4F diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h new file mode 100644 index 0000000000..7f3ab03654 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -0,0 +1,366 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * FLSUN HiSpeed V1 (STM32F103VET6) board pin assignments + * FLSun Hispeed (clone MKS_Robin_miniV2) board. + * + * MKS Robin Mini USB uses UART3 (PB10-TX, PB11-RX) + * #define SERIAL_PORT_2 3 + */ + +#if NOT_TARGET(__STM32F1__, STM32F1xx) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "FLSUN HiSpeedV1 supports 1 hotend / E-stepper. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "FLSun HiSpeedV1" +#define BOARD_WEBSITE_URL "github.com/Foxies-CSTL" + +// +// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role +// +#define DISABLE_DEBUG + +// +// EEPROM +// +#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) + #define FLASH_EEPROM_EMULATION + #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB +#endif + +// SPI +// Note: FLSun Hispeed (clone MKS_Robin_miniV2) board is using SPI2 interface. +// +#define ENABLE_SPI2 + +// SPI Flash +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB + +#if HAS_SPI_FLASH + // SPI 2 + #define W25QXX_CS_PIN PB12 // SPI2_NSS / Flash chip-select + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif + +// +// Servos +// +//#define SERVO0_PIN PA8 // use IO0 to enable BLTOUCH support/remove Mks_Wifi + +// +// Limit Switches +// +#define X_STOP_PIN PA15 // -X +#define Y_STOP_PIN PA12 // -Y +#define Z_MIN_PIN PA11 // -Z +#define Z_MAX_PIN PC4 // +Z + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN MT_DET_1_PIN +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PE4 // X_EN +#define X_STEP_PIN PE3 // X_STEP +#define X_DIR_PIN PE2 // X_DIR + +#define Y_ENABLE_PIN PE1 // Y_EN +#define Y_STEP_PIN PE0 // Y_STEP +#define Y_DIR_PIN PB9 // Y_DIR + +#define Z_ENABLE_PIN PB8 // Z_EN +#define Z_STEP_PIN PB5 // Z_STEP +#define Z_DIR_PIN PB4 // Z_DIR + +#define E0_ENABLE_PIN PB3 // E0_EN +#define E0_STEP_PIN PD6 // E0_STEP +#define E0_DIR_PIN PD3 // E0_DIR + +// +// Drivers +// +#if HAS_TMC220x + + #if ENABLED(HARDWARE_SERIAL) /* TMC2209 */ + #define X_SLAVE_ADDRESS 3 // | | : + #define Y_SLAVE_ADDRESS 2 // : | : + #define Z_SLAVE_ADDRESS 1 // | : : + //#define E0_SLAVE_ADDRESS 0 // : : : + + #define X_SERIAL_TX_PIN PA9 // TXD1 + #define X_SERIAL_RX_PIN PA9 // TXD1 + + #define Y_SERIAL_TX_PIN PA9 // TXD1 + #define Y_SERIAL_RX_PIN PA9 // TXD1 + + #define Z_SERIAL_TX_PIN PA9 // TXD1 + #define Z_SERIAL_RX_PIN PA9 // TXD1 + + #elif ENABLED(SOFTWARE_SERIAL) /* TMC220x */ + /** + * TMC2208 stepper UART-configurable by PDN_UART pin + * Software serial + */ + #define X_SLAVE_ADDRESS 0 + #define Y_SLAVE_ADDRESS 0 + #define Z_SLAVE_ADDRESS 0 + + #define X_SERIAL_TX_PIN PA10 // RXD1 + #define X_SERIAL_RX_PIN PA10 // RXD1 + + #define Y_SERIAL_TX_PIN PA9 // TXD1 + #define Y_SERIAL_RX_PIN PA9 // TXD1 + + #define Z_SERIAL_TX_PIN PC7 // IO1 + #define Z_SERIAL_RX_PIN PC7 // IO1 + + #endif + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#else + + // Motor current PWM pins + #define MOTOR_CURRENT_PWM_XY_PIN PA6 // VREF2/3 CONTROL XY + #define MOTOR_CURRENT_PWM_Z_PIN PA7 // VREF4 CONTROL Z + #define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp + #ifndef DEFAULT_PWM_MOTOR_CURRENT + #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } + #endif + + /** + * src: MKS Robin_Mini V2 + * __ESP(M1)__ -J1- + * GND| 15 | | 08 |+3v3 (22)=>RXD1(PA10) // + * | 16 | | 07 |MOSI (21)=>TXD1(PA9) // active low, probably OK to leave floating + * IO2| 17 | | 06 |MISO (19)=>IO1(PC7) // Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) + * IO0| 18 | | 05 |CLK (18)=>IO0(PA8) // must be high (ESP3D software configures this with a pullup so OK to leave as floating) + * IO1| 19 | | 03 |EN (03)=>WIFI_EN() // Must be high for module to run + * | nc | | nc | (01)=>WIFI_CTRL(PA5) + * RX| 21 | | nc | + * TX| 22 | | 01 |RST + *  ̄ ̄ AE ̄ ̄ + * + */ + #ifdef ESP_WIFI + #define WIFI_IO0_PIN PA8 // PC13 MKS ESP WIFI IO0 PIN + #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN + #define WIFI_RESET_PIN PA5 // MKS ESP WIFI RESET PIN + #endif +#endif + +// +// EXTRUDER +// +#if AXIS_DRIVER_TYPE(E0,TMC2208)||AXIS_DRIVER_TYPE(E0,TMC2209) + #define E0_SLAVE_ADDRESS 0 + + #define E0_SERIAL_TX_PIN PA8 // IO0 + #define E0_SERIAL_RX_PIN PA8 // IO0 + #define TMC_BAUD_RATE 19200 +#else + // Motor current PWM pins + #define MOTOR_CURRENT_PWM_E_PIN PB0 // VREF1 CONTROL E + #define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp + #ifndef DEFAULT_PWM_MOTOR_CURRENT + #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } + #endif +#endif + +// +// Temperature Sensors(THM) +// +#define TEMP_0_PIN PC1 // TEMP_E0 +#define TEMP_BED_PIN PC0 // TEMP_BED + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC3 // HEATER_E0 +#define HEATER_BED_PIN PA0 // HEATER_BED-WKUP + +#define FAN_PIN PB1 // E_FAN +//#define CONTROLLER_FAN_PIN PD6 // BOARD FAN + +// +// Misc. Functions +// +//#define POWER_LOSS_PIN PA1 // PW_SO +#if ENABLED(BACKUP_POWER_SUPPLY) + #define POWER_LOSS_PIN PA2 // PW_DET (UPS) MKSPWC +#endif + +// +// Power Supply Control +// +#if ENABLED(PSU_CONTROL) + #define KILL_PIN PA2 // PW_DET + #define KILL_PIN_INVERTING true // + //#define PS_ON_PIN PA3 // PW_CN /PW_OFF +#endif + +#define MT_DET_1_PIN PA4 // MT_DET +#define MT_DET_2_PIN PE6 // FALA_CRTL +#define MT_DET_PIN_INVERTING false + +// +// LED / NEOPixel +// +//#define LED_PIN PB2 // BOOT1 + +#if ENABLED(NEOPIXEL_LED) + #define LED_PWM PA8 + #ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN LED_PWM // USED WIFI IO0/IO1/TX/RX PIN + #endif +#endif + +//Others test. +//#define SERVO0_PIN PA5 // WIFI CRTL +//#define GPIO_CLEAR PA8 // IO0 +//#define GPIO_SET PA5 + +// +// SD Card +// +#define SDIO_SUPPORT +#define SDIO_CLOCK 4500000 // 4.5 MHz /* 18 MHz (18000000) or 4.5MHz (450000) */ +//#define SDIO_CLOCK 18000000 // 18 MHz (18000000) +#if ENABLED(SDIO_SUPPORT) + #define SCK_PIN PB13 // SPI2 + #define MISO_PIN PB14 // SPI2 + #define MOSI_PIN PB15 // SPI2 + #define SD_DETECT_PIN PD12 // SD_CD +#endif + +// +// LCD / Controller +// +#ifndef BEEPER_PIN + #define BEEPER_PIN PC5 +#endif + +/** + * Note: MKS Robin TFT screens use various TFT controllers + * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) + * ILI9488 is not supported + * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp + * + * If the screen stays white, disable 'LCD_RESET_PIN' + * to let the bootloader init the screen. + * + * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu + * because Marlin uses the reset as a failsafe to revive a glitchy LCD. + */ + +// MKS Robin TFT v2.0 with ILI9341 +// Read display identification information (0xD3 on ILI9341) +//#define XPT2046_X_CALIBRATION 12013 +//#define XPT2046_Y_CALIBRATION -8711 +//#define XPT2046_X_OFFSET -32 +//#define XPT2046_Y_OFFSET 256 + +// MKS Robin TFT v1.1 with ILI9328 +//#define XPT2046_X_CALIBRATION -11792 +//#define XPT2046_Y_CALIBRATION 8947 +//#define XPT2046_X_OFFSET 342 +//#define XPT2046_Y_OFFSET -19 + +// MKS Robin TFT v1.1 with R61505 +//#define XPT2046_X_CALIBRATION 12489 +//#define XPT2046_Y_CALIBRATION 9210 +//#define XPT2046_X_OFFSET -52 +//#define XPT2046_Y_OFFSET -17 + +// QQS-Pro uses MKS Robin TFT v2.0 + +// Shared FSMC Configs +#if HAS_FSMC_TFT + #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h + #define DOGLCD_SCK -1 + + #define FSMC_CS_PIN PD7 // NE4 + #define FSMC_RS_PIN PD11 // A0 + + #define TFT_RESET_PIN PC6 // FSMC_RST + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 +#endif + +// XPT2046 Touch Screen calibration +#if EITHER(TFT_LVGL_UI_FSMC, TFT_COLOR_UI) + #define TFT_BUFFER_SIZE 14400 + + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 12218 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -8814 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -35 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 256 + #endif + +#elif ENABLED(TFT_CLASSIC_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 12149 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -8746 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -35 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 256 + #endif + + #define TFT_MARLINUI_COLOR 0xFFFF // White + #define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow + #define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan +#endif + +#if NEED_TOUCH_PINS + #define TOUCH_CS_PIN PC2 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI +#endif diff --git a/buildroot/share/PlatformIO/scripts/add_nanolib.py b/buildroot/share/PlatformIO/scripts/add_nanolib.py new file mode 100644 index 0000000000..102b4b9bb0 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/add_nanolib.py @@ -0,0 +1,2 @@ +Import("env") +env.Append(LINKFLAGS=["--specs=nano.specs"]) diff --git a/platformio.ini b/platformio.ini index 8416b93a27..326dca172f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1133,6 +1133,21 @@ debug_tool = jlink upload_protocol = jlink monitor_speed = 115200 +# +# FLSUN QQ (STM32F103VET6) +# +[env:flsun_hispeed] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_mini.py + buildroot/share/PlatformIO/scripts/add_nanolib.py +build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 +lib_deps = SoftwareSerialM + #Adafruit NeoPixel=https://github.com/Foxies-CSTL/Robin-NeoPixel-Lib/archive/master.zip + # # STM32F401VE # 'STEVAL-3DP001V1' STM32F401VE board - https://www.st.com/en/evaluation-tools/steval-3dp001v1.html From 2becb5ebf706a3143f6e108ed3aa22d868e282d0 Mon Sep 17 00:00:00 2001 From: ManuelMcLure Date: Thu, 22 Oct 2020 04:27:33 -0700 Subject: [PATCH 0442/1370] Configure TMC interpolation per driver (#19828) --- Marlin/Configuration_adv.h | 27 +++++++++++++-- Marlin/src/feature/tmc_util.cpp | 13 ++++++- Marlin/src/inc/Conditionals_post.h | 48 ++++++++++++++++++++++++++ Marlin/src/module/stepper/trinamic.cpp | 30 ++++++++-------- 4 files changed, 99 insertions(+), 19 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fc77345b9b..31661a582e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2261,14 +2261,20 @@ #if HAS_TRINAMIC_CONFIG #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current - #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + /** + * Interpolate microsteps to 256 + * Override for each driver with _INTERPOLATE settings below + */ + #define INTERPOLATE true #if AXIS_IS_TMC(X) #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing - #define X_MICROSTEPS 16 // 0..256 + #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... + #define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ... + //#define X_INTERPOLATE true // Enable to override 'INTERPOLATE' for the X axis #endif #if AXIS_IS_TMC(X2) @@ -2277,6 +2283,7 @@ #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 #define X2_CHAIN_POS -1 + //#define X2_INTERPOLATE true #endif #if AXIS_IS_TMC(Y) @@ -2285,6 +2292,7 @@ #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 #define Y_CHAIN_POS -1 + //#define Y_INTERPOLATE true #endif #if AXIS_IS_TMC(Y2) @@ -2293,6 +2301,7 @@ #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 #define Y2_CHAIN_POS -1 + //#define Y2_INTERPOLATE true #endif #if AXIS_IS_TMC(Z) @@ -2301,6 +2310,7 @@ #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 #define Z_CHAIN_POS -1 + //#define Z_INTERPOLATE true #endif #if AXIS_IS_TMC(Z2) @@ -2309,6 +2319,7 @@ #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 #define Z2_CHAIN_POS -1 + //#define Z2_INTERPOLATE true #endif #if AXIS_IS_TMC(Z3) @@ -2317,6 +2328,7 @@ #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 #define Z3_CHAIN_POS -1 + //#define Z3_INTERPOLATE true #endif #if AXIS_IS_TMC(Z4) @@ -2325,6 +2337,7 @@ #define Z4_MICROSTEPS 16 #define Z4_RSENSE 0.11 #define Z4_CHAIN_POS -1 + //#define Z4_INTERPOLATE true #endif #if AXIS_IS_TMC(E0) @@ -2332,6 +2345,7 @@ #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 #define E0_CHAIN_POS -1 + //#define E0_INTERPOLATE true #endif #if AXIS_IS_TMC(E1) @@ -2339,6 +2353,7 @@ #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 #define E1_CHAIN_POS -1 + //#define E1_INTERPOLATE true #endif #if AXIS_IS_TMC(E2) @@ -2346,6 +2361,7 @@ #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 #define E2_CHAIN_POS -1 + //#define E2_INTERPOLATE true #endif #if AXIS_IS_TMC(E3) @@ -2353,6 +2369,7 @@ #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 #define E3_CHAIN_POS -1 + //#define E3_INTERPOLATE true #endif #if AXIS_IS_TMC(E4) @@ -2360,6 +2377,7 @@ #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 #define E4_CHAIN_POS -1 + //#define E4_INTERPOLATE true #endif #if AXIS_IS_TMC(E5) @@ -2367,6 +2385,7 @@ #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 #define E5_CHAIN_POS -1 + //#define E5_INTERPOLATE true #endif #if AXIS_IS_TMC(E6) @@ -2374,6 +2393,7 @@ #define E6_MICROSTEPS 16 #define E6_RSENSE 0.11 #define E6_CHAIN_POS -1 + //#define E6_INTERPOLATE true #endif #if AXIS_IS_TMC(E7) @@ -2381,6 +2401,7 @@ #define E7_MICROSTEPS 16 #define E7_RSENSE 0.11 #define E7_CHAIN_POS -1 + //#define E7_INTERPOLATE true #endif /** diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 781253079e..d27177326b 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -497,7 +497,8 @@ TMC_HEND, TMC_HSTRT, TMC_SGT, - TMC_MSCNT + TMC_MSCNT, + TMC_INTERPOLATE }; enum TMC_drv_status_enum : char { TMC_DRV_CODES, @@ -553,6 +554,7 @@ case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break; + case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break; default: break; } } @@ -588,6 +590,7 @@ SERIAL_ECHOPGM("/256"); } break; + case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break; default: break; } } @@ -603,6 +606,7 @@ case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break; case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break; case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break; + case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break; default: break; } } @@ -644,6 +648,12 @@ #if HAS_DRIVER(TMC2660) static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { } + static void _tmc_status(TMC2660Stepper &st, const TMC_debug_enum i) { + switch (i) { + case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break; + default: break; + } + } #endif template @@ -902,6 +912,7 @@ #endif TMC_REPORT("stealthChop", TMC_STEALTHCHOP); TMC_REPORT("msteps\t", TMC_MICROSTEPS); + TMC_REPORT("interp\t", TMC_INTERPOLATE); TMC_REPORT("tstep\t", TMC_TSTEP); TMC_REPORT("PWM thresh.", TMC_TPWMTHRS); TMC_REPORT("[mm/s]\t", TMC_TPWMTHRS_MMS); diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 3587d82cda..bb717ba097 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1608,6 +1608,54 @@ #define Y_SPI_SENSORLESS Y_SENSORLESS #define Z_SPI_SENSORLESS Z_SENSORLESS #endif + #ifndef X_INTERPOLATE + #define X_INTERPOLATE INTERPOLATE + #endif + #ifndef X2_INTERPOLATE + #define X2_INTERPOLATE INTERPOLATE + #endif + #ifndef Y_INTERPOLATE + #define Y_INTERPOLATE INTERPOLATE + #endif + #ifndef Y2_INTERPOLATE + #define Y2_INTERPOLATE INTERPOLATE + #endif + #ifndef Z_INTERPOLATE + #define Z_INTERPOLATE INTERPOLATE + #endif + #ifndef Z2_INTERPOLATE + #define Z2_INTERPOLATE INTERPOLATE + #endif + #ifndef Z3_INTERPOLATE + #define Z3_INTERPOLATE INTERPOLATE + #endif + #ifndef Z4_INTERPOLATE + #define Z4_INTERPOLATE INTERPOLATE + #endif + #ifndef E0_INTERPOLATE + #define E0_INTERPOLATE INTERPOLATE + #endif + #ifndef E1_INTERPOLATE + #define E1_INTERPOLATE INTERPOLATE + #endif + #ifndef E2_INTERPOLATE + #define E2_INTERPOLATE INTERPOLATE + #endif + #ifndef E3_INTERPOLATE + #define E3_INTERPOLATE INTERPOLATE + #endif + #ifndef E4_INTERPOLATE + #define E4_INTERPOLATE INTERPOLATE + #endif + #ifndef E5_INTERPOLATE + #define E5_INTERPOLATE INTERPOLATE + #endif + #ifndef E6_INTERPOLATE + #define E6_INTERPOLATE INTERPOLATE + #endif + #ifndef E7_INTERPOLATE + #define E7_INTERPOLATE INTERPOLATE + #endif #endif #if (HAS_E_DRIVER(TMC2660) \ diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index ad11046f62..c33581d132 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -36,7 +36,7 @@ #include enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; -#define TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX], chopper_timing_##ST) +#define TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX], chopper_timing_##ST, ST##_INTERPOLATE) // IC = TMC model number // ST = Stepper object letter @@ -131,13 +131,13 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2130) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate) { st.begin(); CHOPCONF_t chopconf{0}; chopconf.tbl = 0b01; chopconf.toff = chop_init.toff; - chopconf.intpol = INTERPOLATE; + chopconf.intpol = interpolate; chopconf.hend = chop_init.hend + 3; chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); @@ -166,13 +166,13 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2160) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate) { st.begin(); CHOPCONF_t chopconf{0}; chopconf.tbl = 0b01; chopconf.toff = chop_init.toff; - chopconf.intpol = INTERPOLATE; + chopconf.intpol = interpolate; chopconf.hend = chop_init.hend + 3; chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); @@ -484,7 +484,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2208) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate) { TMC2208_n::GCONF_t gconf{0}; gconf.pdn_disable = true; // Use UART gconf.mstep_reg_select = true; // Select microsteps with UART @@ -496,7 +496,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; TMC2208_n::CHOPCONF_t chopconf{0}; chopconf.tbl = 0b01; // blank_time = 24 chopconf.toff = chop_init.toff; - chopconf.intpol = INTERPOLATE; + chopconf.intpol = interpolate; chopconf.hend = chop_init.hend + 3; chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); @@ -526,7 +526,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2209) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate) { TMC2208_n::GCONF_t gconf{0}; gconf.pdn_disable = true; // Use UART gconf.mstep_reg_select = true; // Select microsteps with UART @@ -538,7 +538,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; TMC2208_n::CHOPCONF_t chopconf{0}; chopconf.tbl = 0b01; // blank_time = 24 chopconf.toff = chop_init.toff; - chopconf.intpol = INTERPOLATE; + chopconf.intpol = interpolate; chopconf.hend = chop_init.hend + 3; chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); @@ -568,7 +568,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC2660) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool, const chopper_timing_t &chop_init) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool, const chopper_timing_t &chop_init, const bool interpolate) { st.begin(); TMC2660_n::CHOPCONF_t chopconf{0}; @@ -582,7 +582,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; st.rms_current(mA); st.microsteps(microsteps); TERN_(SQUARE_WAVE_STEPPING, st.dedge(true)); - st.intpol(INTERPOLATE); + st.intpol(interpolate); st.diss2g(true); // Disable short to ground protection. Too many false readings? TERN_(TMC_DEBUG, st.rdsel(0b01)); } @@ -590,13 +590,13 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC5130) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate) { st.begin(); CHOPCONF_t chopconf{0}; chopconf.tbl = 0b01; chopconf.toff = chop_init.toff; - chopconf.intpol = INTERPOLATE; + chopconf.intpol = interpolate; chopconf.hend = chop_init.hend + 3; chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); @@ -625,13 +625,13 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; #if HAS_DRIVER(TMC5160) template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init) { + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate) { st.begin(); CHOPCONF_t chopconf{0}; chopconf.tbl = 0b01; chopconf.toff = chop_init.toff; - chopconf.intpol = INTERPOLATE; + chopconf.intpol = interpolate; chopconf.hend = chop_init.hend + 3; chopconf.hstrt = chop_init.hstrt - 1; TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); From 994cda3b6b3334869c27f0e98198cce5b6ef32e6 Mon Sep 17 00:00:00 2001 From: George Fu Date: Thu, 22 Oct 2020 19:29:29 +0800 Subject: [PATCH 0443/1370] Fix TMC serial port for FYSETC AIO_II (#19842) --- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index d2c587beb8..bab6182e4f 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -93,10 +93,10 @@ // // Hardware serial with switch // - #define X_HARDWARE_SERIAL MSerial1 - #define Y_HARDWARE_SERIAL MSerial1 - #define Z_HARDWARE_SERIAL MSerial1 - #define E0_HARDWARE_SERIAL MSerial1 + #define X_HARDWARE_SERIAL MSerial2 + #define Y_HARDWARE_SERIAL MSerial2 + #define Z_HARDWARE_SERIAL MSerial2 + #define E0_HARDWARE_SERIAL MSerial2 // The 4xTMC2209 module doesn't have a serial multiplexer and // needs to set *_SLAVE_ADDRESS in Configuration_adv.h for X,Y,Z,E0 @@ -106,6 +106,9 @@ #define SERIAL_MUL_PIN2 PB12 #endif + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 + #endif // From 1b510007362531915713cfd5c792f360d1d1e412 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 22 Oct 2020 20:22:17 -0500 Subject: [PATCH 0444/1370] Slim down MKS UI code (#19843) --- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 37 +- .../lib/mks_ui/draw_acceleration_settings.cpp | 169 ++------ .../lib/mks_ui/draw_advance_settings.cpp | 126 ++---- .../draw_auto_level_offset_settings.cpp | 62 +-- .../extui/lib/mks_ui/draw_baby_stepping.cpp | 141 ++----- .../extui/lib/mks_ui/draw_change_speed.cpp | 109 ++---- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 105 +++-- .../extui/lib/mks_ui/draw_eeprom_settings.cpp | 49 +-- .../lib/mks_ui/draw_encoder_settings.cpp | 38 +- .../extui/lib/mks_ui/draw_error_message.cpp | 12 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 138 ++----- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 83 +--- .../extui/lib/mks_ui/draw_filament_change.cpp | 74 +--- .../lib/mks_ui/draw_filament_settings.cpp | 115 ++---- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 93 +---- .../draw_homing_sensitivity_settings.cpp | 80 +--- .../extui/lib/mks_ui/draw_jerk_settings.cpp | 81 +--- .../lcd/extui/lib/mks_ui/draw_language.cpp | 131 ++----- .../extui/lib/mks_ui/draw_level_settings.cpp | 57 +-- .../extui/lib/mks_ui/draw_machine_para.cpp | 77 +--- .../lib/mks_ui/draw_machine_settings.cpp | 56 +-- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 81 +--- .../mks_ui/draw_manual_level_pos_settings.cpp | 143 ++----- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 100 ++--- .../extui/lib/mks_ui/draw_motor_settings.cpp | 83 +--- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 122 ++---- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 37 +- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 196 ++-------- .../extui/lib/mks_ui/draw_pause_position.cpp | 65 +--- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 107 ++--- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 83 +--- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 151 +++---- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 98 ++--- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 134 +------ .../extui/lib/mks_ui/draw_step_settings.cpp | 104 ++--- .../lib/mks_ui/draw_tmc_current_settings.cpp | 96 ++--- .../mks_ui/draw_tmc_step_mode_settings.cpp | 367 +++++------------- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 96 +---- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 99 +++++ Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 42 ++ Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 75 ++-- .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 66 +--- .../extui/lib/mks_ui/draw_wifi_settings.cpp | 133 ++----- .../lcd/extui/lib/mks_ui/draw_wifi_tips.cpp | 17 +- 44 files changed, 1166 insertions(+), 3162 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index 68d1993b6f..48a2cb1362 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -53,7 +53,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } void lv_draw_about(void) { - lv_obj_t *buttonBack, *label_Back; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ABOUT_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = ABOUT_UI; @@ -66,51 +65,31 @@ void lv_draw_about(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonBack = lv_imgbtn_create(scr, NULL); - - #if 1 - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_A_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_A_RETURN); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - // Create a label on the image button - label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } - //fw_version = lv_label_create(scr, NULL); - //lv_obj_set_style(fw_version, &tft_style_label_rel); - //lv_label_set_text(fw_version, SHORT_BUILD_VERSION); + //fw_version = lv_label_create(scr, SHORT_BUILD_VERSION); //lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60); - fw_type = lv_label_create(scr, NULL); - lv_obj_set_style(fw_type, &tft_style_label_rel); - lv_label_set_text(fw_type, "Firmware: Marlin " SHORT_BUILD_VERSION); + fw_type = lv_label_create(scr, "Firmware: Marlin " SHORT_BUILD_VERSION); lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20); - board = lv_label_create(scr, NULL); - lv_obj_set_style(board, &tft_style_label_rel); - lv_label_set_text(board, "Board: " BOARD_INFO_NAME); + board = lv_label_create(scr, "Board: " BOARD_INFO_NAME); lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, -60); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index e362e5bff1..95bba3b549 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -161,14 +161,14 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_acceleration_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelPrintText = NULL, *buttonPrintValue = NULL, *labelPrintValue = NULL; - lv_obj_t *labelRetraText = NULL, *buttonRetraValue = NULL, *labelRetraValue = NULL; - lv_obj_t *labelTravelText = NULL, *buttonTravelValue = NULL, *labelTravelValue = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t *buttonPrintValue = NULL, *labelPrintValue = NULL; + lv_obj_t *buttonRetraValue = NULL, *labelRetraValue = NULL; + lv_obj_t *buttonTravelValue = NULL, *labelTravelValue = NULL; + lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *buttonE1Value = NULL, *labelE1Value = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ACCELERATION_UI) { disp_state_stack._disp_index++; @@ -182,83 +182,45 @@ void lv_draw_acceleration_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.AccelerationConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.AccelerationConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - labelPrintText = lv_label_create(scr, NULL); - lv_obj_set_style(labelPrintText, &tft_style_label_rel); - lv_obj_set_pos(labelPrintText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelPrintText, machine_menu.PrintAcceleration); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.PrintAcceleration); - buttonPrintValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonPrintValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonPrintValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonPrintValue, event_handler, ID_ACCE_PRINT, NULL, 0); - lv_btn_set_style(buttonPrintValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonPrintValue, LV_BTN_STYLE_PR, &style_para_value); - labelPrintValue = lv_label_create(buttonPrintValue, NULL); + buttonPrintValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_PRINT); + labelPrintValue = lv_label_create_empty(buttonPrintValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelRetraText = lv_label_create(scr, NULL); - lv_obj_set_style(labelRetraText, &tft_style_label_rel); - lv_obj_set_pos(labelRetraText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelRetraText, machine_menu.RetractAcceleration); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.RetractAcceleration); - buttonRetraValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonRetraValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonRetraValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonRetraValue, event_handler, ID_ACCE_RETRA, NULL, 0); - lv_btn_set_style(buttonRetraValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonRetraValue, LV_BTN_STYLE_PR, &style_para_value); - labelRetraValue = lv_label_create(buttonRetraValue, NULL); + buttonRetraValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_RETRA); + labelRetraValue = lv_label_create_empty(buttonRetraValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelTravelText = lv_label_create(scr, NULL); - lv_obj_set_style(labelTravelText, &tft_style_label_rel); - lv_obj_set_pos(labelTravelText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelTravelText, machine_menu.TravelAcceleration); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.TravelAcceleration); - buttonTravelValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonTravelValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonTravelValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonTravelValue, event_handler, ID_ACCE_TRAVEL, NULL, 0); - lv_btn_set_style(buttonTravelValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonTravelValue, LV_BTN_STYLE_PR, &style_para_value); - labelTravelValue = lv_label_create(buttonTravelValue, NULL); + buttonTravelValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_TRAVEL); + labelTravelValue = lv_label_create_empty(buttonTravelValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelXText, machine_menu.X_Acceleration); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.X_Acceleration); - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_ACCE_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); + buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_X); + labelXValue = lv_label_create_empty(buttonXValue); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + buttonTurnPage = lv_btn_create_back(scr, event_handler, ID_ACCE_DOWN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -271,81 +233,43 @@ void lv_draw_acceleration_settings(void) { #endif } else { - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelYText, machine_menu.Y_Acceleration); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.Y_Acceleration); - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); + buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_Y); + labelYValue = lv_label_create_empty(buttonYValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Acceleration); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Z_Acceleration); - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_ACCE_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); + buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_Z); + labelZValue = lv_label_create_empty(buttonZValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelE0Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE0Text, &tft_style_label_rel); - lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelE0Text, machine_menu.E0_Acceleration); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.E0_Acceleration); - buttonE0Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_ACCE_E0, NULL, 0); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); - labelE0Value = lv_label_create(buttonE0Value, NULL); + buttonE0Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_E0); + labelE0Value = lv_label_create_empty(buttonE0Value); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - labelE1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE1Text, &tft_style_label_rel); - lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelE1Text, machine_menu.E1_Acceleration); - - buttonE1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_ACCE_E1, NULL, 0); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); - labelE1Value = lv_label_create(buttonE1Value, NULL); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E1_Acceleration); + buttonE1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_E1); + labelE1Value = lv_label_create_empty(buttonE1Value); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_UP, NULL, 0); - //lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - //lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - //lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + buttonTurnPage = lv_btn_create_back(scr, event_handler, ID_ACCE_UP); + //lv_imgbtn_set_src_both(buttonTurnPage, "F:/bmp_back70x40.bin"); + //lv_imgbtn_use_label_style(buttonTurnPage); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -360,22 +284,15 @@ void lv_draw_acceleration_settings(void) { //lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); //lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); - //labelTurnPage = lv_label_create(buttonTurnPage, NULL); + //labelTurnPage = lv_label_create_empty(buttonTurnPage); lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); + labelTurnPage = lv_label_create_empty(buttonTurnPage); - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ACCE_RETURN, NULL, 0); - //lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - //lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - //lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_ACCE_RETURN); + //lv_imgbtn_set_src_both(buttonBack, "F:/bmp_back70x40.bin"); + //lv_imgbtn_use_label_style(buttonBack); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp index f81fe6c728..99de179a9c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -133,14 +133,14 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_advance_settings(void) { lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonPausePos, *labelPausePos, *buttonPausePosNarrow; - lv_obj_t *buttonFilamentSettings, *labelFilamentSettings, *buttonFilamentSettingsNarrow; + lv_obj_t *buttonPausePos, *labelPausePos; + lv_obj_t *buttonFilamentSettings, *labelFilamentSettings; lv_obj_t * line1,* line2; #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_t *buttonWifiSet,*labelWifiSet,*buttonWifiSetNarrow; + lv_obj_t *buttonWifiSet, *labelWifiSet, *buttonWifiSetNarrow; #endif #if HAS_ROTARY_ENCODER - lv_obj_t *buttonEcoder,*labelEcoder,*buttonEcoderNarrow; + lv_obj_t *buttonEncoder, *labelEncoder, *buttonEncoderNarrow; #endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ADVANCED_UI) { @@ -155,10 +155,7 @@ void lv_draw_advance_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.AdvancedConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.AdvancedConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -167,22 +164,14 @@ void lv_draw_advance_settings(void) { lv_obj_set_size(buttonPausePos, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonPausePos, event_handler, ID_PAUSE_POS, NULL, 0); - lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_use_label_style(buttonPausePos); lv_btn_set_layout(buttonPausePos, LV_LAYOUT_OFF); - labelPausePos = lv_label_create(buttonPausePos, NULL); + labelPausePos = lv_label_create_empty(buttonPausePos); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPausePos); #endif - buttonPausePosNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonPausePosNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonPausePosNarrow, event_handler, ID_PAUSE_POS_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonPausePosNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPausePosNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonPausePosNarrow, LV_LAYOUT_OFF); + (void)lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_PAUSE_POS_ARROW); line1 = lv_line_create(lv_scr_act(), NULL); lv_ex_line(line1, line_points[0]); @@ -191,22 +180,14 @@ void lv_draw_advance_settings(void) { lv_obj_set_pos(buttonFilamentSettings, PARA_UI_POS_X, PARA_UI_POS_Y*2); lv_obj_set_size(buttonFilamentSettings, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); lv_obj_set_event_cb_mks(buttonFilamentSettings, event_handler, ID_FILAMENT_SETTINGS, NULL, 0); - lv_btn_set_style(buttonFilamentSettings, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonFilamentSettings, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_use_label_style(buttonFilamentSettings); lv_btn_set_layout(buttonFilamentSettings, LV_LAYOUT_OFF); - labelFilamentSettings = lv_label_create(buttonFilamentSettings, NULL); + labelFilamentSettings = lv_label_create_empty(buttonFilamentSettings); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonFilamentSettings); #endif - buttonFilamentSettingsNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonFilamentSettingsNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y*2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonFilamentSettingsNarrow, event_handler, ID_FILAMENT_SETTINGS_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonFilamentSettingsNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonFilamentSettingsNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonFilamentSettingsNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFilamentSettingsNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonFilamentSettingsNarrow, LV_LAYOUT_OFF); + (void)lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y*2 + PARA_UI_ARROW_V, event_handler, ID_FILAMENT_SETTINGS_ARROW); line2 = lv_line_create(lv_scr_act(), NULL); lv_ex_line(line2, line_points[1]); @@ -216,91 +197,58 @@ void lv_draw_advance_settings(void) { buttonWifiSet = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonWifiSet, PARA_UI_POS_X,PARA_UI_POS_Y*3); lv_obj_set_size(buttonWifiSet, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonWifiSet, event_handler,ID_WIFI_PARA,NULL,0); - lv_btn_set_style(buttonWifiSet, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonWifiSet, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_obj_set_event_cb_mks(buttonWifiSet, event_handler,ID_WIFI_PARA,NULL, 0); + lv_btn_use_label_style(buttonWifiSet); lv_btn_set_layout(buttonWifiSet, LV_LAYOUT_OFF); - labelWifiSet = lv_label_create(buttonWifiSet, NULL); + labelWifiSet = lv_label_create_empty(buttonWifiSet); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonWifiSet); #endif - buttonWifiSetNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonWifiSetNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*3+PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonWifiSetNarrow, event_handler,ID_WIFI_PARA_ARROW, NULL,0); - lv_imgbtn_set_src(buttonWifiSetNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonWifiSetNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonWifiSetNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonWifiSetNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonWifiSetNarrow, LV_LAYOUT_OFF); + buttonWifiSetNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_WIFI_PARA_ARROW); lv_obj_t * line3 = lv_line_create(scr, NULL); lv_ex_line(line3,line_points[2]); #if HAS_ROTARY_ENCODER - buttonEcoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonEcoder, PARA_UI_POS_X,PARA_UI_POS_Y*4); - lv_obj_set_size(buttonEcoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonEcoder, event_handler,ID_ENCODER_SETTINGS,NULL,0); - lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_PR, &tft_style_label_pre); - lv_btn_set_layout(buttonEcoder, LV_LAYOUT_OFF); - labelEcoder = lv_label_create(buttonEcoder, NULL); + buttonEncoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonEncoder, PARA_UI_POS_X,PARA_UI_POS_Y*4); + lv_obj_set_size(buttonEncoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonEncoder, event_handler,ID_ENCODER_SETTINGS,NULL, 0); + lv_btn_use_label_style(buttonEncoder); + lv_btn_set_layout(buttonEncoder, LV_LAYOUT_OFF); + labelEncoder = lv_label_create_empty(buttonEncoder); - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEcoder); + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEncoder); - buttonEcoderNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonEcoderNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*4+PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonEcoderNarrow, event_handler,ID_ENCODER_SETTINGS_ARROW, NULL,0); - lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonEcoderNarrow, LV_LAYOUT_OFF); + buttonEncoderNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 4 + PARA_UI_ARROW_V, event_handler, ID_ENCODER_SETTINGS_ARROW); lv_obj_t * line4 = lv_line_create(scr, NULL); lv_ex_line(line4,line_points[3]); #endif #elif HAS_ROTARY_ENCODER - buttonEcoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonEcoder, PARA_UI_POS_X,PARA_UI_POS_Y*3); - lv_obj_set_size(buttonEcoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonEcoder, event_handler,ID_ENCODER_SETTINGS,NULL,0); - lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_PR, &tft_style_label_pre); - lv_btn_set_layout(buttonEcoder, LV_LAYOUT_OFF); - labelEcoder = lv_label_create(buttonEcoder, NULL); + buttonEncoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonEncoder, PARA_UI_POS_X,PARA_UI_POS_Y*3); + lv_obj_set_size(buttonEncoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonEncoder, event_handler,ID_ENCODER_SETTINGS,NULL, 0); + lv_btn_use_label_style(buttonEncoder); + lv_btn_set_layout(buttonEncoder, LV_LAYOUT_OFF); + labelEncoder = lv_label_create_empty(buttonEncoder); - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEcoder); + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEncoder); - buttonEcoderNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonEcoderNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*3+PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonEcoderNarrow, event_handler,ID_ENCODER_SETTINGS_ARROW, NULL,0); - lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonEcoderNarrow, LV_LAYOUT_OFF); + buttonEncoderNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_ENCODER_SETTINGS_ARROW); lv_obj_t * line3 = lv_line_create(scr, NULL); lv_ex_line(line3,line_points[2]); #endif - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ADVANCE_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_ADVANCE_RETURN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); @@ -317,8 +265,8 @@ void lv_draw_advance_settings(void) { lv_obj_align(labelWifiSet, buttonWifiSet, LV_ALIGN_IN_LEFT_MID,0, 0); #endif #if HAS_ROTARY_ENCODER - lv_label_set_text(labelEcoder, machine_menu.EncoderSettings); - lv_obj_align(labelEcoder, buttonEcoder, LV_ALIGN_IN_LEFT_MID,0, 0); + lv_label_set_text(labelEncoder, machine_menu.EncoderSettings); + lv_obj_align(labelEncoder, buttonEncoder, LV_ALIGN_IN_LEFT_MID,0, 0); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp index be2015ed9e..87632a27c9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -83,9 +83,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_auto_level_offset_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NOZZLE_PROBE_OFFSET_UI) { disp_state_stack._disp_index++; @@ -99,68 +99,36 @@ void lv_draw_auto_level_offset_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.OffsetConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.OffsetConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.Xoffset); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.Xoffset); - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_OFFSET_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); + buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_OFFSET_X); + labelXValue = lv_label_create_empty(buttonXValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Yoffset); + lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Yoffset); - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_OFFSET_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); + buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_OFFSET_Y); + labelYValue = lv_label_create_empty(buttonYValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Zoffset); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Zoffset); - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_OFFSET_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); + buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_OFFSET_Z); + labelZValue = lv_label_create_empty(buttonZValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_OFFSET_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_OFFSET_RETURN); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp index 6891060274..adf69719cd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -30,6 +30,10 @@ #include "../../../../gcode/gcode.h" #include "../../../../inc/MarlinConfig.h" +#if ENABLED(EEPROM_SETTINGS) + #include "../../../../module/settings.h" +#endif + #if HAS_BED_PROBE #include "../../../../module/probe.h" #endif @@ -59,7 +63,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); sprintf_P(baby_buf, PSTR("M290 X%.3f"),babystep_dist); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; @@ -70,7 +73,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); sprintf_P(baby_buf, PSTR("M290 X%.3f"),((float)0 - babystep_dist)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; @@ -81,7 +83,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); sprintf_P(baby_buf, PSTR("M290 Y%.3f"), babystep_dist); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; @@ -92,7 +93,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); sprintf_P(baby_buf, PSTR("M290 Y%.3f"),((float)0 - babystep_dist)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; @@ -103,7 +103,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; @@ -114,7 +113,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); sprintf_P(baby_buf, PSTR("M290 Z%.3f"),((float)0 - babystep_dist)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; @@ -141,7 +139,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (has_adjust_z == 1) { - gcode.process_subcommands_now_P(PSTR("M500")); + TERN_(EEPROM_SETTINGS, (void)settings.save()); has_adjust_z = 0; } clear_cur_ui(); @@ -152,8 +150,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } void lv_draw_baby_stepping(void) { - lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD, *buttonZI, *buttonZD, *buttonBack; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != BABY_STEP_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = BABY_STEP_UI; @@ -166,98 +162,29 @@ void lv_draw_baby_stepping(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonXI = lv_imgbtn_create(scr, NULL); - buttonXD = lv_imgbtn_create(scr, NULL); - buttonYI = lv_imgbtn_create(scr, NULL); - buttonYD = lv_imgbtn_create(scr, NULL); - buttonZI = lv_imgbtn_create(scr, NULL); - buttonZD = lv_imgbtn_create(scr, NULL); - buttonV = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_BABY_STEP_X_P, NULL, 0); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin"); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin"); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_BABY_STEP_X_N, NULL, 0); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin"); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin"); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_BABY_STEP_Y_P, NULL, 0); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin"); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin"); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_BABY_STEP_Y_N, NULL, 0); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin"); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin"); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_BABY_STEP_Z_P, NULL, 0); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin"); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin"); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_BABY_STEP_Z_N, NULL, 0); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin"); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin"); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_BABY_STEP_DIST, NULL, 0); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_BABY_STEP_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif // if 1 - lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonV, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonYD, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_t *buttonXI = lv_imgbtn_create(scr, "F:/bmp_xAdd.bin", INTERVAL_V, titleHeight, event_handler, ID_BABY_STEP_X_P); + lv_obj_t *buttonXD = lv_imgbtn_create(scr, "F:/bmp_xDec.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_X_N); + lv_obj_t *buttonYI = lv_imgbtn_create(scr, "F:/bmp_yAdd.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_BABY_STEP_Y_P); + lv_obj_t *buttonYD = lv_imgbtn_create(scr, "F:/bmp_yDec.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_Y_N); + lv_obj_t *buttonZI = lv_imgbtn_create(scr, "F:/bmp_zAdd.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_BABY_STEP_Z_P); + lv_obj_t *buttonZD = lv_imgbtn_create(scr, "F:/bmp_zDec.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_Z_N); + buttonV = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_BABY_STEP_DIST); + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonV, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelXI = lv_label_create(buttonXI, NULL); - lv_obj_t *labelXD = lv_label_create(buttonXD, NULL); - lv_obj_t *labelYI = lv_label_create(buttonYI, NULL); - lv_obj_t *labelYD = lv_label_create(buttonYD, NULL); - lv_obj_t *labelZI = lv_label_create(buttonZI, NULL); - lv_obj_t *labelZD = lv_label_create(buttonZD, NULL); - labelV = lv_label_create(buttonV, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelXI = lv_label_create_empty(buttonXI); + lv_obj_t *labelXD = lv_label_create_empty(buttonXD); + lv_obj_t *labelYI = lv_label_create_empty(buttonYI); + lv_obj_t *labelYD = lv_label_create_empty(buttonYD); + lv_obj_t *labelZI = lv_label_create_empty(buttonZI); + lv_obj_t *labelZD = lv_label_create_empty(buttonZD); + labelV = lv_label_create_empty(buttonV); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelXI, move_menu.x_add); @@ -297,27 +224,19 @@ void lv_draw_baby_stepping(void) { disp_baby_step_dist(); - zOffsetText = lv_label_create(scr, NULL); - lv_obj_set_style(zOffsetText, &tft_style_label_rel); - lv_obj_set_pos(zOffsetText, 290, TITLE_YPOS); + zOffsetText = lv_label_create(scr, 290, TITLE_YPOS, NULL); disp_z_offset_value(); } void disp_baby_step_dist() { // char buf[30] = {0}; + if ((int)(100 * babystep_dist) == 1) + lv_imgbtn_set_src_both(buttonV, "F:/bmp_baby_move0_01.bin"); + else if ((int)(100 * babystep_dist) == 5) + lv_imgbtn_set_src_both(buttonV, "F:/bmp_baby_move0_05.bin"); + else if ((int)(100 * babystep_dist) == 10) + lv_imgbtn_set_src_both(buttonV, "F:/bmp_baby_move0_1.bin"); - if ((int)(100 * babystep_dist) == 1) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_01.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_01.bin"); - } - else if ((int)(100 * babystep_dist) == 5) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_05.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_05.bin"); - } - else if ((int)(100 * babystep_dist) == 10) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_1.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_1.bin"); - } if (gCfgItems.multiple_language) { if ((int)(100 * babystep_dist) == 1) { lv_label_set_text(labelV, move_menu.step_001mm); @@ -336,8 +255,6 @@ void disp_baby_step_dist() { void disp_z_offset_value() { char buf[20]; - - ZERO(buf); sprintf_P(buf, PSTR("offset Z: %.3f"), (double)TERN(HAS_BED_PROBE, probe.offset.z, 0)); lv_label_set_text(zOffsetText, buf); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index f9399b8a45..848b625559 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -168,75 +168,25 @@ void lv_draw_change_speed(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - // Create an Image button - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttonMov = lv_imgbtn_create(scr, NULL); - buttonExt = lv_imgbtn_create(scr, NULL); - buttonStep = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_C_ADD, NULL, 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_C_DEC, NULL, 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, NULL, 0); - lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, NULL, 0); - lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, NULL, 0); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_C_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonMov, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonExt, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonStep, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonAdd = lv_imgbtn_create(scr, "F:/bmp_Add.bin", INTERVAL_V, titleHeight, event_handler, ID_C_ADD); + buttonDec = lv_imgbtn_create(scr, "F:/bmp_Dec.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_C_DEC); + buttonMov = lv_imgbtn_create(scr, NULL, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_MOVE); + buttonExt = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_EXT); + buttonStep = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_STEP); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMov, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonExt, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); - labelMov = lv_label_create(buttonMov, NULL); - labelExt = lv_label_create(buttonExt, NULL); - labelStep = lv_label_create(buttonStep, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelAdd = lv_label_create_empty(buttonAdd); + lv_obj_t *labelDec = lv_label_create_empty(buttonDec); + labelMov = lv_label_create_empty(buttonMov); + labelExt = lv_label_create_empty(buttonExt); + labelStep = lv_label_create_empty(buttonStep); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelAdd, speed_menu.add); @@ -262,24 +212,19 @@ void lv_draw_change_speed(void) { disp_speed_type(); disp_speed_step(); - printSpeedText = lv_label_create(scr, NULL); + printSpeedText = lv_label_create_empty(scr); lv_obj_set_style(printSpeedText, &tft_style_label_rel); disp_print_speed(); } void disp_speed_step() { - if (uiCfg.stepPrintSpeed == 1) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_percent.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_percent.bin"); - } - else if (uiCfg.stepPrintSpeed == 5) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_percent.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_percent.bin"); - } - else if (uiCfg.stepPrintSpeed == 10) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_percent.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_percent.bin"); - } + if (uiCfg.stepPrintSpeed == 1) + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step1_percent.bin"); + else if (uiCfg.stepPrintSpeed == 5) + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step5_percent.bin"); + else if (uiCfg.stepPrintSpeed == 10) + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step10_percent.bin"); + if (gCfgItems.multiple_language) { if (uiCfg.stepPrintSpeed == 1) { lv_label_set_text(labelStep, speed_menu.step_1percent); @@ -320,17 +265,13 @@ void disp_print_speed() { void disp_speed_type() { switch (speedType) { case 1: - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, "F:/bmp_mov_changeSpeed.bin"); - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, "F:/bmp_mov_changeSpeed.bin"); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, "F:/bmp_extruct_sel.bin"); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, "F:/bmp_extruct_sel.bin"); + lv_imgbtn_set_src_both(buttonMov, "F:/bmp_mov_changeSpeed.bin"); + lv_imgbtn_set_src_both(buttonExt, "F:/bmp_extruct_sel.bin"); break; default: - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, "F:/bmp_mov_sel.bin"); - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, "F:/bmp_mov_sel.bin"); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, "F:/bmp_speed_extruct.bin"); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, "F:/bmp_speed_extruct.bin"); + lv_imgbtn_set_src_both(buttonMov, "F:/bmp_mov_sel.bin"); + lv_imgbtn_set_src_both(buttonExt, "F:/bmp_speed_extruct.bin"); break; } lv_obj_refresh_ext_draw_pad(buttonExt); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 489d8466ce..07e0665ce4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -43,6 +43,10 @@ #include "../../../../gcode/gcode.h" #include "../../../../inc/MarlinConfig.h" +#if ENABLED(EEPROM_SETTINGS) + #include "../../../../module/settings.h" +#endif + #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif @@ -155,17 +159,17 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { } #endif else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) { - gcode.process_subcommands_now_P(PSTR("M500")); + TERN_(EEPROM_SETTINGS, (void)settings.save()); clear_cur_ui(); draw_return_ui(); } else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) { - gcode.process_subcommands_now_P(PSTR("M501")); + TERN_(EEPROM_SETTINGS, (void)settings.load()); clear_cur_ui(); draw_return_ui(); } else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { - gcode.process_subcommands_now_P(PSTR("M502")); + TERN_(EEPROM_SETTINGS, (void)settings.reset()); clear_cur_ui(); draw_return_ui(); } @@ -199,7 +203,7 @@ static void btn_cancel_event_cb(lv_obj_t * btn, lv_event_t event) { pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; #endif } - else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) + else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) @@ -244,19 +248,14 @@ void lv_draw_dialog(uint8_t type) { scr = lv_obj_create(NULL, NULL); - lv_obj_set_style(scr, &tft_style_scr); lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - static lv_style_t style_btn_rel; // A variable to store the released style lv_style_copy(&style_btn_rel, &lv_style_plain); // Initialize from a built-in style style_btn_rel.body.border.color = lv_color_hex3(0x269); @@ -278,17 +277,21 @@ void lv_draw_dialog(uint8_t type) { style_btn_pr.text.color = lv_color_hex3(0xBCD); style_btn_pr.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - lv_obj_t *labelDialog = lv_label_create(scr, NULL); - lv_obj_set_style(labelDialog, &tft_style_label_rel); + // Set button styles for Released and Pressed + auto lv_btn_use_button_style = [&](lv_obj_t *btn) { + lv_btn_set_style(btn, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btn, LV_BTN_STYLE_PR, &style_btn_pr); + }; + + lv_obj_t *labelDialog = lv_label_create_empty(scr); if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { btnOk = lv_btn_create(scr, NULL); // Add a button the current screen lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position lv_obj_set_size(btnOk, 100, 50); // Set its size lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_btn_use_button_style(btnOk); + lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text } else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING @@ -299,9 +302,8 @@ void lv_draw_dialog(uint8_t type) { lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position lv_obj_set_size(btnOk, 100, 50); // Set its size lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_btn_use_button_style(btnOk); + lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text } else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING @@ -319,9 +321,8 @@ void lv_draw_dialog(uint8_t type) { lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); lv_obj_set_size(btnCancel, 100, 50); lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_btn_use_button_style(btnCancel); + lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { @@ -329,9 +330,8 @@ void lv_draw_dialog(uint8_t type) { lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); lv_obj_set_size(btnCancel, 100, 50); lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_btn_use_button_style(btnCancel); + lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } #if ENABLED(USE_WIFI_FUNCTION) @@ -341,9 +341,8 @@ void lv_draw_dialog(uint8_t type) { lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); lv_obj_set_size(btnCancel, 100, 50); lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_btn_use_button_style(btnCancel); + lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } else if (upload_result == 3) { @@ -351,9 +350,8 @@ void lv_draw_dialog(uint8_t type) { lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); lv_obj_set_size(btnOk, 100, 50); lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); + lv_btn_use_button_style(btnOk); + lv_obj_t *labelOk = lv_label_create_empty(btnOk); lv_label_set_text(labelOk, print_file_dialog_menu.confirm); } } @@ -365,25 +363,22 @@ void lv_draw_dialog(uint8_t type) { lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); lv_obj_set_size(btnCancel, 100, 50); lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_btn_use_button_style(btnCancel); + lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); - tempText1 = lv_label_create(scr, NULL); - lv_obj_set_style(tempText1, &tft_style_label_rel); + tempText1 = lv_label_create_empty(scr); filament_sprayer_temp(); } else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED ) { btnOk = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); lv_obj_set_size(btnOk, 100, 50); lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); + lv_btn_use_button_style(btnOk); + lv_obj_t *labelOk = lv_label_create_empty(btnOk); lv_label_set_text(labelOk, print_file_dialog_menu.confirm); } else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING @@ -393,9 +388,8 @@ void lv_draw_dialog(uint8_t type) { lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); lv_obj_set_size(btnCancel, 100, 50); lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_btn_use_button_style(btnCancel); + lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); filament_bar = lv_bar_create(scr, NULL); @@ -410,17 +404,15 @@ void lv_draw_dialog(uint8_t type) { lv_obj_set_pos(btnOk, BTN_OK_X, BTN_OK_Y); // Set its position lv_obj_set_size(btnOk, 100, 50); // Set its size lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_btn_use_button_style(btnOk); + lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen lv_obj_set_pos(btnCancel, BTN_CANCEL_X, BTN_CANCEL_Y); // Set its position lv_obj_set_size(btnCancel, 100, 50); // Set its size lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); // Add a label to the button + lv_btn_use_button_style(btnCancel); + lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); // Add a label to the button if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text @@ -435,10 +427,7 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelDialog, print_file_dialog_menu.print_file); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - lv_obj_t *labelFile = lv_label_create(scr, NULL); - lv_obj_set_style(labelFile, &tft_style_label_rel); - - lv_label_set_text(labelFile, list_file.long_name[sel_id]); + lv_obj_t *labelFile = lv_label_create(scr, list_file.long_name[sel_id]); lv_obj_align(labelFile, NULL, LV_ALIGN_CENTER, 0, -60); } else if (uiCfg.dialogType == DIALOG_TYPE_STOP) { @@ -558,7 +547,6 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelDialog, buf); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } } #endif //USE_WIFI_FUNCTION @@ -634,10 +622,8 @@ void filament_dialog_handle() { planner.synchronize(); uiCfg.filament_loading_time_flg = 1; uiCfg.filament_loading_time_cnt = 0; - ZERO(public_buf_m); - sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_load_length,gCfgItems.filamentchange_load_speed); - queue.inject_P(PSTR(public_buf_m)); - //gcode.process_subcommands_now_P(PSTR(public_buf_m)); + sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E%d F%d\nG90"), uiCfg.curSprayerChoose, gCfgItems.filamentchange_load_length, gCfgItems.filamentchange_load_speed); + queue.inject(public_buf_m); } if (uiCfg.filament_heat_completed_unload == 1) { uiCfg.filament_heat_completed_unload = 0; @@ -646,9 +632,8 @@ void filament_dialog_handle() { planner.synchronize(); uiCfg.filament_unloading_time_flg = 1; uiCfg.filament_unloading_time_cnt = 0; - ZERO(public_buf_m); - sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E-%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_unload_length,gCfgItems.filamentchange_unload_speed); - queue.inject_P(PSTR(public_buf_m)); + sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E-%d F%d\nG90"), uiCfg.curSprayerChoose, gCfgItems.filamentchange_unload_length, gCfgItems.filamentchange_unload_speed); + queue.inject(public_buf_m); } if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp index 08fdb007fc..59e04e7402 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp @@ -111,9 +111,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_eeprom_settings(void) { lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonStore,*labelStore,*buttonStoreNarrow; + lv_obj_t *buttonStore, *labelStore; //lv_obj_t *buttonRead,*labelRead,*buttonReadNarrow; - lv_obj_t *buttonRevert, *labelRevert, *buttonRevertNarrow; + lv_obj_t *buttonRevert, *labelRevert; lv_obj_t * line1, * line2; //* line3; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EEPROM_SETTINGS_UI) { disp_state_stack._disp_index++; @@ -127,10 +127,7 @@ void lv_draw_eeprom_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -139,19 +136,11 @@ void lv_draw_eeprom_settings(void) { lv_obj_set_size(buttonRevert, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonRevert, event_handler, ID_EEPROM_REVERT, NULL, 0); - lv_btn_set_style(buttonRevert, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonRevert, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_use_label_style(buttonRevert); lv_btn_set_layout(buttonRevert, LV_LAYOUT_OFF); - labelRevert = lv_label_create(buttonRevert, NULL); /*Add a label to the button*/ + labelRevert = lv_label_create_empty(buttonRevert); /*Add a label to the button*/ - buttonRevertNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonRevertNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonRevertNarrow, event_handler, ID_EEPROM_REVERT_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonRevertNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonRevertNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonRevertNarrow, LV_LAYOUT_OFF); + (void)lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_EEPROM_REVERT_ARROW); //line3 = lv_line_create(scr, NULL); //lv_ex_line(line3,line_points[2]); @@ -163,33 +152,17 @@ void lv_draw_eeprom_settings(void) { lv_obj_set_size(buttonStore, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonStore, event_handler, ID_EEPROM_STORE, NULL, 0); - lv_btn_set_style(buttonStore, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonStore, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_use_label_style(buttonStore); lv_btn_set_layout(buttonStore, LV_LAYOUT_OFF); - labelStore = lv_label_create(buttonStore, NULL); /*Add a label to the button*/ + labelStore = lv_label_create_empty(buttonStore); /*Add a label to the button*/ - buttonStoreNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonStoreNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStoreNarrow, event_handler, ID_EEPROM_STORE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonStoreNarrow, LV_LAYOUT_OFF); + (void)lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_EEPROM_STORE_ARROW); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_EEPROM_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_EEPROM_RETURN); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp index 1476fe0a74..096e72878a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp @@ -55,8 +55,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { gCfgItems.encoder_enable ^= true; - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); + lv_imgbtn_set_src_both(buttonEncoderState, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); lv_label_set_text(labelEncoderState, machine_menu.enable); update_spi_flash(); } @@ -82,43 +81,20 @@ void lv_draw_encoder_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.EncoderConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.EncoderConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - labelEncoderTips = lv_label_create(scr, NULL); - lv_obj_set_style(labelEncoderTips, &tft_style_label_rel); - lv_obj_set_pos(labelEncoderTips, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelEncoderTips, machine_menu.EncoderConfText); + labelEncoderTips = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.EncoderConfText); - buttonEncoderState = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonEncoderState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); - - lv_obj_set_event_cb_mks(buttonEncoderState, event_handler, ID_ENCODER_STATE, NULL, 0); - - lv_imgbtn_set_style(buttonEncoderState, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEncoderState, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonEncoderState, LV_LAYOUT_OFF); - labelEncoderState = lv_label_create(buttonEncoderState, NULL); + buttonEncoderState = lv_imgbtn_create(scr, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V, event_handler, ID_ENCODER_STATE); + labelEncoderState = lv_label_create_empty(buttonEncoderState); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ENCODER_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_ENCODER_RETURN); + label_Back = lv_label_create_empty(buttonBack); lv_label_set_text(labelEncoderState, gCfgItems.encoder_enable ? machine_menu.enable : machine_menu.disable); lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index 2a20fe39f4..435b91e1d8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -56,20 +56,14 @@ void lv_draw_error_message(PGM_P const msg) { lv_refr_now(lv_refr_get_disp_refreshing()); if (msg) { - message = lv_label_create(scr, NULL); - lv_obj_set_style(message, &tft_style_label_rel); - lv_label_set_text(message, msg); + message = lv_label_create(scr, msg); lv_obj_align(message, NULL, LV_ALIGN_CENTER, 0, -50); } - kill_message = lv_label_create(scr, NULL); - lv_obj_set_style(kill_message, &tft_style_label_rel); - lv_label_set_text(kill_message, "PRINTER HALTED"); + kill_message = lv_label_create(scr, "PRINTER HALTED"); lv_obj_align(kill_message, NULL, LV_ALIGN_CENTER, 0, -10); - reset_tips = lv_label_create(scr, NULL); - lv_obj_set_style(reset_tips, &tft_style_label_rel); - lv_label_set_text(reset_tips, "Please Reset"); + reset_tips = lv_label_create(scr, "Please Reset"); lv_obj_align(reset_tips, NULL, LV_ALIGN_CENTER, 0, 30); lv_task_handler(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 4bd320b640..6402040898 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -34,14 +34,14 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" -static lv_obj_t * scr; -extern lv_group_t* g; -static lv_obj_t * buttoType, *buttonStep, *buttonSpeed; +static lv_obj_t *scr; +extern lv_group_t *g; +static lv_obj_t *buttonType, *buttonStep, *buttonSpeed; static lv_obj_t *labelType; static lv_obj_t *labelStep; static lv_obj_t *labelSpeed; -static lv_obj_t * tempText; -static lv_obj_t * ExtruText; +static lv_obj_t *tempText; +static lv_obj_t *ExtruText; #define ID_E_ADD 1 #define ID_E_DEC 2 @@ -165,75 +165,27 @@ void lv_draw_extrusion(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttoType = lv_imgbtn_create(scr, NULL); - buttonStep = lv_imgbtn_create(scr, NULL); - buttonSpeed = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_E_ADD, NULL, 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_in.bin"); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_in.bin"); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonAdd = lv_imgbtn_create(scr, "F:/bmp_in.bin", INTERVAL_V, titleHeight, event_handler, ID_E_ADD); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_E_DEC, NULL, 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_out.bin"); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_out.bin"); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, NULL, 0); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, NULL, 0); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, NULL, 0); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_E_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonDec = lv_imgbtn_create(scr, "F:/bmp_out.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_E_DEC); + buttonType = lv_imgbtn_create(scr, NULL, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_TYPE); + buttonStep = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_STEP); + buttonSpeed = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_SPEED); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); - lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); - labelType = lv_label_create(buttoType, NULL); - labelStep = lv_label_create(buttonStep, NULL); - labelSpeed = lv_label_create(buttonSpeed, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelAdd = lv_label_create_empty(buttonAdd); + lv_obj_t *labelDec = lv_label_create_empty(buttonDec); + labelType = lv_label_create_empty(buttonType); + labelStep = lv_label_create_empty(buttonStep); + labelSpeed = lv_label_create_empty(buttonSpeed); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelAdd, extrude_menu.in); @@ -250,7 +202,7 @@ void lv_draw_extrusion(void) { if (gCfgItems.encoder_enable) { lv_group_add_obj(g, buttonAdd); lv_group_add_obj(g, buttonDec); - lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonType); lv_group_add_obj(g, buttonStep); lv_group_add_obj(g, buttonSpeed); lv_group_add_obj(g, buttonBack); @@ -261,47 +213,39 @@ void lv_draw_extrusion(void) { disp_ext_step(); disp_ext_speed(); - tempText = lv_label_create(scr, NULL); + tempText = lv_label_create_empty(scr); lv_obj_set_style(tempText, &tft_style_label_rel); disp_hotend_temp(); - ExtruText = lv_label_create(scr, NULL); + ExtruText = lv_label_create_empty(scr); lv_obj_set_style(ExtruText, &tft_style_label_rel); disp_extru_amount(); } void disp_ext_type() { if (uiCfg.curSprayerChoose == 1) { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, extrude_menu.ext2); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(labelType, buttonType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } else { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru1.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, extrude_menu.ext1); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(labelType, buttonType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } } void disp_ext_speed() { - if (uiCfg.extruSpeed == 20) { - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_high.bin"); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_high.bin"); - } - else if (uiCfg.extruSpeed == 1) { - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_slow.bin"); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_slow.bin"); - } - else { - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_normal.bin"); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_normal.bin"); - } + if (uiCfg.extruSpeed == 20) + lv_imgbtn_set_src_both(buttonSpeed, "F:/bmp_speed_high.bin"); + else if (uiCfg.extruSpeed == 1) + lv_imgbtn_set_src_both(buttonSpeed, "F:/bmp_speed_slow.bin"); + else + lv_imgbtn_set_src_both(buttonSpeed, "F:/bmp_speed_normal.bin"); if (gCfgItems.multiple_language) { if (uiCfg.extruSpeed == 20) { @@ -323,7 +267,7 @@ void disp_hotend_temp() { char buf[20] = {0}; public_buf_l[0] = '\0'; strcat(public_buf_l, extrude_menu.temper_text); - sprintf(buf, extrude_menu.temp_value, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + sprintf(buf, extrude_menu.temp_value, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); strcat(public_buf_l, buf); lv_label_set_text(tempText, public_buf_l); lv_obj_align(tempText, NULL, LV_ALIGN_CENTER, 0, -50); @@ -364,18 +308,12 @@ void disp_extru_amount() { } void disp_ext_step() { - if (uiCfg.extruStep == 1) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_mm.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_mm.bin"); - } - else if (uiCfg.extruStep == 5) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_mm.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_mm.bin"); - } - else if (uiCfg.extruStep == 10) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_mm.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_mm.bin"); - } + if (uiCfg.extruStep == 1) + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step1_mm.bin"); + else if (uiCfg.extruStep == 5) + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step5_mm.bin"); + else if (uiCfg.extruStep == 10) + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step10_mm.bin"); if (gCfgItems.multiple_language) { if (uiCfg.extruStep == 1) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index 5d7bb335dc..6024d58203 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -132,82 +132,27 @@ void lv_draw_fan(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttonHigh = lv_imgbtn_create(scr, NULL); - buttonMid = lv_imgbtn_create(scr, NULL); - buttonOff = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_F_ADD, NULL, 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonAdd = lv_imgbtn_create(scr, "F:/bmp_Add.bin", INTERVAL_V, titleHeight, event_handler, ID_F_ADD); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_F_DEC, NULL, 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHigh, event_handler,ID_F_HIGH, NULL,0); - lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_REL, "F:/bmp_speed255.bin"); - lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_PR, "F:/bmp_speed255.bin"); - lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMid, event_handler,ID_F_MID, NULL,0); - lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_REL, "F:/bmp_speed127.bin"); - lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_PR, "F:/bmp_speed127.bin"); - lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOff, event_handler,ID_F_OFF, NULL,0); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, "F:/bmp_speed0.bin"); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, "F:/bmp_speed0.bin"); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_F_RETURN, NULL,0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif - - lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonHigh, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonMid, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonDec = lv_imgbtn_create(scr, "F:/bmp_Dec.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_F_DEC); + buttonHigh = lv_imgbtn_create(scr, "F:/bmp_speed255.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_HIGH); + buttonMid = lv_imgbtn_create(scr, "F:/bmp_speed127.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_MID); + buttonOff = lv_imgbtn_create(scr, "F:/bmp_speed0.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_OFF); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHigh, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMid, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); - lv_obj_t *labelHigh = lv_label_create(buttonHigh, NULL); - lv_obj_t *labelMid = lv_label_create(buttonMid, NULL); - lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelAdd = lv_label_create_empty(buttonAdd); + lv_obj_t *labelDec = lv_label_create_empty(buttonDec); + lv_obj_t *labelHigh = lv_label_create_empty(buttonHigh); + lv_obj_t *labelMid = lv_label_create_empty(buttonMid); + lv_obj_t *labelOff = lv_label_create_empty(buttonOff); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelAdd, fan_menu.add); @@ -239,7 +184,7 @@ void lv_draw_fan(void) { } #endif - fanText = lv_label_create(scr, NULL); + fanText = lv_label_create_empty(scr); lv_obj_set_style(fanText, &tft_style_label_rel); disp_fan_value(); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 4c9060c6a2..be6defda18 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -32,11 +32,11 @@ #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *buttoType; +extern lv_group_t *g; +static lv_obj_t *scr; +static lv_obj_t *buttonType; static lv_obj_t *labelType; -static lv_obj_t * tempText1; +static lv_obj_t *tempText1; #define ID_FILAMNT_IN 1 #define ID_FILAMNT_OUT 2 @@ -144,57 +144,23 @@ void lv_draw_filament_change(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonIn = lv_imgbtn_create(scr, NULL); - buttonOut = lv_imgbtn_create(scr, NULL); - buttoType = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonIn, event_handler, ID_FILAMNT_IN, NULL, 0); - lv_imgbtn_set_src(buttonIn, LV_BTN_STATE_REL, "F:/bmp_in.bin"); - lv_imgbtn_set_src(buttonIn, LV_BTN_STATE_PR, "F:/bmp_in.bin"); - lv_imgbtn_set_style(buttonIn, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonIn, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonIn = lv_imgbtn_create(scr, "F:/bmp_in.bin", INTERVAL_V, titleHeight, event_handler, ID_FILAMNT_IN); lv_obj_clear_protect(buttonIn, LV_PROTECT_FOLLOW); - lv_obj_set_event_cb_mks(buttonOut, event_handler, ID_FILAMNT_OUT, NULL, 0); - lv_imgbtn_set_src(buttonOut, LV_BTN_STATE_REL, "F:/bmp_out.bin"); - lv_imgbtn_set_src(buttonOut, LV_BTN_STATE_PR, "F:/bmp_out.bin"); - lv_imgbtn_set_style(buttonOut, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOut, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_FILAMNT_TYPE, NULL, 0); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FILAMNT_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonIn, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonOut, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonOut = lv_imgbtn_create(scr, "F:/bmp_out.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_FILAMNT_OUT); + buttonType = lv_imgbtn_create(scr, NULL, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_TYPE); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonIn, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOut, LV_LAYOUT_OFF); - lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelIn = lv_label_create(buttonIn, NULL); - lv_obj_t *labelOut = lv_label_create(buttonOut, NULL); - labelType = lv_label_create(buttoType, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelIn = lv_label_create_empty(buttonIn); + lv_obj_t *labelOut = lv_label_create_empty(buttonOut); + labelType = lv_label_create_empty(buttonType); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelIn, filament_menu.in); @@ -211,33 +177,31 @@ void lv_draw_filament_change(void) { if (gCfgItems.encoder_enable) { lv_group_add_obj(g, buttonIn); lv_group_add_obj(g, buttonOut); - lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonType); lv_group_add_obj(g, buttonBack); } #endif disp_filament_type(); - tempText1 = lv_label_create(scr, NULL); + tempText1 = lv_label_create_empty(scr); lv_obj_set_style(tempText1, &tft_style_label_rel); disp_filament_temp(); } void disp_filament_type() { if (uiCfg.curSprayerChoose == 1) { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext2); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(labelType, buttonType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } else { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru1.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext1); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(labelType, buttonType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index 377c44edb7..2a096eafac 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -127,12 +127,12 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_filament_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelInLengthText = NULL, *buttonInLengthValue = NULL, *labelInLengthValue = NULL; - lv_obj_t *labelInSpeedText = NULL, *buttonInSpeedValue = NULL, *labelInSpeedValue = NULL; - lv_obj_t *labelOutLengthText = NULL, *buttonOutLengthValue = NULL, *labelOutLengthValue = NULL; - lv_obj_t *labelOutSpeedText = NULL, *buttonOutSpeedValue = NULL, *labelOutSpeedValue = NULL; - lv_obj_t *labelTemperText = NULL, *buttonTemperValue = NULL, *labelTemperValue = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + lv_obj_t *buttonInLengthValue = NULL, *labelInLengthValue = NULL; + lv_obj_t *buttonInSpeedValue = NULL, *labelInSpeedValue = NULL; + lv_obj_t *buttonOutLengthValue = NULL, *labelOutLengthValue = NULL; + lv_obj_t *buttonOutSpeedValue = NULL, *labelOutSpeedValue = NULL; + lv_obj_t *buttonTemperValue = NULL, *labelTemperValue = NULL; + lv_obj_t *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENT_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENT_SETTINGS_UI; @@ -145,82 +145,44 @@ void lv_draw_filament_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.FilamentConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.FilamentConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - labelInLengthText = lv_label_create(scr, NULL); - lv_obj_set_style(labelInLengthText, &tft_style_label_rel); - lv_obj_set_pos(labelInLengthText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelInLengthText, machine_menu.InLength); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.InLength); - buttonInLengthValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonInLengthValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonInLengthValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonInLengthValue, event_handler, ID_FILAMENT_SET_IN_LENGTH, NULL, 0); - lv_btn_set_style(buttonInLengthValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonInLengthValue, LV_BTN_STYLE_PR, &style_para_value); - labelInLengthValue = lv_label_create(buttonInLengthValue, NULL); + buttonInLengthValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_IN_LENGTH); + labelInLengthValue = lv_label_create_empty(buttonInLengthValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelInSpeedText = lv_label_create(scr, NULL); - lv_obj_set_style(labelInSpeedText, &tft_style_label_rel); - lv_obj_set_pos(labelInSpeedText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelInSpeedText, machine_menu.InSpeed); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.InSpeed); - buttonInSpeedValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonInSpeedValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonInSpeedValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonInSpeedValue, event_handler, ID_FILAMENT_SET_IN_SPEED, NULL, 0); - lv_btn_set_style(buttonInSpeedValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonInSpeedValue, LV_BTN_STYLE_PR, &style_para_value); - labelInSpeedValue = lv_label_create(buttonInSpeedValue, NULL); + buttonInSpeedValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_IN_SPEED); + labelInSpeedValue = lv_label_create_empty(buttonInSpeedValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelOutLengthText = lv_label_create(scr, NULL); - lv_obj_set_style(labelOutLengthText, &tft_style_label_rel); - lv_obj_set_pos(labelOutLengthText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 6); - lv_label_set_text(labelOutLengthText, machine_menu.OutLength); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 6, machine_menu.OutLength); - buttonOutLengthValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonOutLengthValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonOutLengthValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonOutLengthValue, event_handler, ID_FILAMENT_SET_OUT_LENGTH, NULL, 0); - lv_btn_set_style(buttonOutLengthValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonOutLengthValue, LV_BTN_STYLE_PR, &style_para_value); - labelOutLengthValue = lv_label_create(buttonOutLengthValue, NULL); + buttonOutLengthValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_OUT_LENGTH); + labelOutLengthValue = lv_label_create_empty(buttonOutLengthValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - labelOutSpeedText = lv_label_create(scr, NULL); - lv_obj_set_style(labelOutSpeedText, &tft_style_label_rel); - lv_obj_set_pos(labelOutSpeedText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelOutSpeedText, machine_menu.OutSpeed); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.OutSpeed); - buttonOutSpeedValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonOutSpeedValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonOutSpeedValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonOutSpeedValue, event_handler, ID_FILAMENT_SET_OUT_SPEED, NULL, 0); - lv_btn_set_style(buttonOutSpeedValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonOutSpeedValue, LV_BTN_STYLE_PR, &style_para_value); - labelOutSpeedValue = lv_label_create(buttonOutSpeedValue, NULL); + buttonOutSpeedValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_OUT_SPEED); + labelOutSpeedValue = lv_label_create_empty(buttonOutSpeedValue); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FILAMENT_SET_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + buttonTurnPage = lv_btn_create_back(scr, event_handler, ID_FILAMENT_SET_DOWN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -233,26 +195,15 @@ void lv_draw_filament_settings(void) { #endif } else { - labelTemperText = lv_label_create(scr, NULL); - lv_obj_set_style(labelTemperText, &tft_style_label_rel); - lv_obj_set_pos(labelTemperText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelTemperText, machine_menu.FilamentTemperature); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.FilamentTemperature); - buttonTemperValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonTemperValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonTemperValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonTemperValue, event_handler, ID_FILAMENT_SET_TEMP, NULL, 0); - lv_btn_set_style(buttonTemperValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonTemperValue, LV_BTN_STYLE_PR, &style_para_value); - labelTemperValue = lv_label_create(buttonTemperValue, NULL); + buttonTemperValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_TEMP); + labelTemperValue = lv_label_create_empty(buttonTemperValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FILAMENT_SET_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + buttonTurnPage = lv_btn_create_back(scr, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_UP); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -262,17 +213,10 @@ void lv_draw_filament_settings(void) { #endif } - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); + labelTurnPage = lv_label_create_empty(buttonTurnPage); - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FILAMENT_SET_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_RETURN); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); @@ -280,22 +224,18 @@ void lv_draw_filament_settings(void) { if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); lv_label_set_text(labelInLengthValue, public_buf_l); lv_obj_align(labelInLengthValue, buttonInLengthValue, LV_ALIGN_CENTER, 0, 0); - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_speed); lv_label_set_text(labelInSpeedValue, public_buf_l); lv_obj_align(labelInSpeedValue, buttonInSpeedValue, LV_ALIGN_CENTER, 0, 0); - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_length); lv_label_set_text(labelOutLengthValue, public_buf_l); lv_obj_align(labelOutLengthValue, buttonOutLengthValue, LV_ALIGN_CENTER, 0, 0); - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_speed); lv_label_set_text(labelOutSpeedValue, public_buf_l); lv_obj_align(labelOutSpeedValue, buttonOutSpeedValue, LV_ALIGN_CENTER, 0, 0); @@ -304,7 +244,6 @@ void lv_draw_filament_settings(void) { lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); } else { - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temper); lv_label_set_text(labelTemperValue, public_buf_l); lv_obj_align(labelTemperValue, buttonTemperValue, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index c7264f2765..4e22c134ac 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -120,92 +120,29 @@ void lv_draw_home(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons //buttonWifi = lv_imgbtn_create(scr, NULL); - buttonHomeAll = lv_imgbtn_create(scr, NULL); - buttonHomeX = lv_imgbtn_create(scr, NULL); //buttonContinue = lv_imgbtn_create(scr, NULL); - buttonHomeY = lv_imgbtn_create(scr, NULL); - buttonHomeZ = lv_imgbtn_create(scr, NULL); - buttonOffAll = lv_imgbtn_create(scr, NULL); - buttonOffXY = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - #if 1 - lv_obj_set_event_cb_mks(buttonHomeAll, event_handler,ID_H_ALL, NULL,0); - lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_REL, "F:/bmp_zeroAll.bin"); - lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_PR, "F:/bmp_zeroAll.bin"); - lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHomeX, event_handler, ID_H_X, NULL, 0); - lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_REL, "F:/bmp_zeroX.bin"); - lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_PR, "F:/bmp_zeroX.bin"); - lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHomeY, event_handler, ID_H_Y, NULL, 0); - lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_REL, "F:/bmp_zeroY.bin"); - lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_PR, "F:/bmp_zeroY.bin"); - lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHomeZ, event_handler, ID_H_Z, NULL, 0); - lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_REL, "F:/bmp_zeroZ.bin"); - lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_PR, "F:/bmp_zeroZ.bin"); - lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOffAll, event_handler,ID_H_OFF_ALL, NULL,0); - lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); - lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); - lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOffXY, event_handler,ID_H_OFF_XY, NULL,0); - lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); - lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); - lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_H_RETURN, NULL,0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonHomeAll, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonHomeX, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonHomeY, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonHomeZ, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonOffAll, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonOffXY, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonHomeAll = lv_imgbtn_create(scr, "F:/bmp_zeroAll.bin", INTERVAL_V, titleHeight, event_handler, ID_H_ALL); + buttonHomeX = lv_imgbtn_create(scr, "F:/bmp_zeroX.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_H_X); + buttonHomeY = lv_imgbtn_create(scr, "F:/bmp_zeroY.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_H_Y); + buttonHomeZ = lv_imgbtn_create(scr, "F:/bmp_zeroZ.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_H_Z); + buttonOffAll = lv_imgbtn_create(scr, "F:/bmp_function1.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_ALL); + buttonOffXY = lv_imgbtn_create(scr, "F:/bmp_function1.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_XY); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonHomeAll, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHomeX, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHomeY, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHomeZ, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOffAll, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOffXY, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelHomeAll = lv_label_create(buttonHomeAll, NULL); - lv_obj_t *labelHomeX = lv_label_create(buttonHomeX, NULL); - lv_obj_t *labelHomeY = lv_label_create(buttonHomeY, NULL); - lv_obj_t *labelHomeZ = lv_label_create(buttonHomeZ, NULL); - lv_obj_t *labelOffAll = lv_label_create(buttonOffAll, NULL); - lv_obj_t *labelOffXY = lv_label_create(buttonOffXY, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelHomeAll = lv_label_create_empty(buttonHomeAll); + lv_obj_t *labelHomeX = lv_label_create_empty(buttonHomeX); + lv_obj_t *labelHomeY = lv_label_create_empty(buttonHomeY); + lv_obj_t *labelHomeZ = lv_label_create_empty(buttonHomeZ); + lv_obj_t *labelOffAll = lv_label_create_empty(buttonOffAll); + lv_obj_t *labelOffXY = lv_label_create_empty(buttonOffXY); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelHomeAll, home_menu.home_all); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp index d819aa01f6..67025f92c5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp @@ -98,13 +98,13 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_homing_sensitivity_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; #if Z2_SENSORLESS - lv_obj_t *labelZ2Text = NULL, *buttonZ2Value = NULL, *labelZ2Value = NULL; - lv_obj_t * line4 = NULL; + lv_obj_t *buttonZ2Value = NULL, *labelZ2Value = NULL; + lv_obj_t *line4 = NULL; #endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != HOMING_SENSITIVITY_UI) { disp_state_stack._disp_index++; @@ -118,25 +118,14 @@ void lv_draw_homing_sensitivity_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.HomingSensitivityConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.HomingSensitivityConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.X_Sensitivity); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.X_Sensitivity); - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_SENSITIVITY_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); + buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_X); + labelXValue = lv_label_create_empty(buttonXValue); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXValue); @@ -145,18 +134,10 @@ void lv_draw_homing_sensitivity_settings(void) { line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Y_Sensitivity); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Y_Sensitivity); - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_SENSITIVITY_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); + buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_Y); + labelYValue = lv_label_create_empty(buttonYValue); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYValue); @@ -165,18 +146,10 @@ void lv_draw_homing_sensitivity_settings(void) { line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Sensitivity); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Z_Sensitivity); - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_SENSITIVITY_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); + buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_Z); + labelZValue = lv_label_create_empty(buttonZValue); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable == true) lv_group_add_obj(g, buttonZValue); @@ -186,18 +159,10 @@ void lv_draw_homing_sensitivity_settings(void) { lv_ex_line(line3, line_points[2]); #if Z2_SENSORLESS - labelZ2Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelZ2Text, &tft_style_label_rel); - lv_obj_set_pos(labelZ2Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelZ2Text, machine_menu.Z2_Sensitivity); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.Z2_Sensitivity); - buttonZ2Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZ2Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonZ2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZ2Value, event_handler, ID_SENSITIVITY_Z2, NULL, 0); - lv_btn_set_style(buttonZ2Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZ2Value, LV_BTN_STYLE_PR, &style_para_value); - labelZ2Value = lv_label_create(buttonZ2Value, NULL); + buttonZ2Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_Z2); + labelZ2Value = lv_label_create_empty(buttonZ2Value); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZ2Value); @@ -207,13 +172,8 @@ void lv_draw_homing_sensitivity_settings(void) { lv_ex_line(line4, line_points[3]); #endif - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_SENSITIVITY_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_RETURN); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp index 65649b793e..45d94020e2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -94,11 +94,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_jerk_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelEText = NULL, *buttonEValue = NULL, *labelEValue = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonEValue = NULL, *labelEValue = NULL; + lv_obj_t *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != JERK_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = JERK_UI; @@ -111,85 +111,44 @@ void lv_draw_jerk_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.JerkConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.JerkConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.X_Jerk); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.X_Jerk); - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_JERK_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); + buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_JERK_X); + labelXValue = lv_label_create_empty(buttonXValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Y_Jerk); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Y_Jerk); - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_JERK_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); + buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_JERK_Y); + labelYValue = lv_label_create_empty(buttonYValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Jerk); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Z_Jerk); - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_JERK_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); + buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_JERK_Z); + labelZValue = lv_label_create_empty(buttonZValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - labelEText = lv_label_create(scr, NULL); - lv_obj_set_style(labelEText, &tft_style_label_rel); - lv_obj_set_pos(labelEText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelEText, machine_menu.E_Jerk); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E_Jerk); - buttonEValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonEValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonEValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonEValue, event_handler, ID_JERK_E, NULL, 0); - lv_btn_set_style(buttonEValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonEValue, LV_BTN_STYLE_PR, &style_para_value); - labelEValue = lv_label_create(buttonEValue, NULL); + buttonEValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_JERK_E); + labelEValue = lv_label_create_empty(buttonEValue); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_JERK_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_JERK_RETURN); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable == true) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 4cd2cab72f..b5c2da09aa 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -62,8 +62,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, "F:/bmp_simplified_cn_sel.bin"); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, "F:/bmp_simplified_cn_sel.bin"); + lv_imgbtn_set_src_both(buttonCN, "F:/bmp_simplified_cn_sel.bin"); lv_obj_refresh_ext_draw_pad(buttonCN); gCfgItems.language = LANG_SIMPLE_CHINESE; update_spi_flash(); @@ -76,8 +75,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, "F:/bmp_traditional_cn_sel.bin"); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, "F:/bmp_traditional_cn_sel.bin"); + lv_imgbtn_set_src_both(buttonT_CN, "F:/bmp_traditional_cn_sel.bin"); lv_obj_refresh_ext_draw_pad(buttonT_CN); gCfgItems.language = LANG_COMPLEX_CHINESE; update_spi_flash(); @@ -90,8 +88,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, "F:/bmp_english_sel.bin"); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, "F:/bmp_english_sel.bin"); + lv_imgbtn_set_src_both(buttonEN, "F:/bmp_english_sel.bin"); lv_obj_refresh_ext_draw_pad(buttonEN); gCfgItems.language = LANG_ENGLISH; update_spi_flash(); @@ -104,8 +101,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, "F:/bmp_russian_sel.bin"); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, "F:/bmp_russian_sel.bin"); + lv_imgbtn_set_src_both(buttonRU, "F:/bmp_russian_sel.bin"); lv_obj_refresh_ext_draw_pad(buttonRU); gCfgItems.language = LANG_RUSSIAN; update_spi_flash(); @@ -118,8 +114,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, "F:/bmp_spanish_sel.bin"); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, "F:/bmp_spanish_sel.bin"); + lv_imgbtn_set_src_both(buttonES, "F:/bmp_spanish_sel.bin"); lv_obj_refresh_ext_draw_pad(buttonES); gCfgItems.language = LANG_SPANISH; update_spi_flash(); @@ -132,8 +127,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, "F:/bmp_french_sel.bin"); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, "F:/bmp_french_sel.bin"); + lv_imgbtn_set_src_both(buttonFR, "F:/bmp_french_sel.bin"); lv_obj_refresh_ext_draw_pad(buttonFR); gCfgItems.language = LANG_FRENCH; update_spi_flash(); @@ -146,8 +140,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, "F:/bmp_italy_sel.bin"); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, "F:/bmp_italy_sel.bin"); + lv_imgbtn_set_src_both(buttonIT, "F:/bmp_italy_sel.bin"); lv_obj_refresh_ext_draw_pad(buttonIT); gCfgItems.language = LANG_ITALY; update_spi_flash(); @@ -159,7 +152,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - buttonCN = NULL; buttonT_CN = NULL; buttonEN = NULL; @@ -231,8 +223,7 @@ static void disp_language(uint8_t language, uint8_t state) { strcat_P(public_buf_l, PSTR(".bin")); lv_obj_set_event_cb_mks(obj, event_handler, id, NULL, 0); - lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, public_buf_l); - lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, public_buf_l); + lv_imgbtn_set_src_both(obj, public_buf_l); if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj); } @@ -253,102 +244,30 @@ void lv_draw_language(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonCN = lv_imgbtn_create(scr, NULL); - buttonT_CN = lv_imgbtn_create(scr, NULL); - buttonEN = lv_imgbtn_create(scr, NULL); - buttonRU = lv_imgbtn_create(scr, NULL); - buttonES = lv_imgbtn_create(scr, NULL); - buttonFR = lv_imgbtn_create(scr, NULL); - buttonIT = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, NULL, 0); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, "F:/bmp_simplified_cn.bin"); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, "F:/bmp_simplified_cn.bin"); - lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonCN = lv_imgbtn_create(scr, "F:/bmp_simplified_cn.bin", INTERVAL_V, titleHeight, event_handler, ID_CN); lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, NULL, 0); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, "F:/bmp_traditional_cn.bin"); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, "F:/bmp_traditional_cn.bin"); - lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, NULL, 0); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, "F:/bmp_english.bin"); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, "F:/bmp_english.bin"); - lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, NULL, 0); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, "F:/bmp_russian.bin"); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, "F:/bmp_russian.bin"); - lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, NULL, 0); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, "F:/bmp_spanish.bin"); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, "F:/bmp_spanish.bin"); - lv_imgbtn_set_style(buttonES, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonES, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, NULL, 0); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, "F:/bmp_french.bin"); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, "F:/bmp_french.bin"); - lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_IT, NULL, 0); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, "F:/bmp_italy.bin"); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, "F:/bmp_italy.bin"); - lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_L_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif // if 1 - - lv_obj_set_pos(buttonCN, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonT_CN, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonEN, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonRU, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonES, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonFR, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonIT, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonT_CN = lv_imgbtn_create(scr, "F:/bmp_traditional_cn.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_CN); + buttonEN = lv_imgbtn_create(scr, "F:/bmp_english.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_EN); + buttonRU = lv_imgbtn_create(scr, "F:/bmp_russian.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_RU); + buttonES = lv_imgbtn_create(scr, "F:/bmp_spanish.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_ES); + buttonFR = lv_imgbtn_create(scr, "F:/bmp_french.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FR); + buttonIT = lv_imgbtn_create(scr, "F:/bmp_italy.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_IT); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_L_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonCN, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonT_CN, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonEN, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonRU, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonES, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFR, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonIT, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *label_CN = lv_label_create(buttonCN, NULL); - lv_obj_t *label_T_CN = lv_label_create(buttonT_CN, NULL); - lv_obj_t *label_EN = lv_label_create(buttonEN, NULL); - lv_obj_t *label_RU = lv_label_create(buttonRU, NULL); - lv_obj_t *label_ES = lv_label_create(buttonES, NULL); - lv_obj_t *label_FR = lv_label_create(buttonFR, NULL); - lv_obj_t *label_IT = lv_label_create(buttonIT, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *label_CN = lv_label_create_empty(buttonCN); + lv_obj_t *label_T_CN = lv_label_create_empty(buttonT_CN); + lv_obj_t *label_EN = lv_label_create_empty(buttonEN); + lv_obj_t *label_RU = lv_label_create_empty(buttonRU); + lv_obj_t *label_ES = lv_label_create_empty(buttonES); + lv_obj_t *label_FR = lv_label_create_empty(buttonFR); + lv_obj_t *label_IT = lv_label_create_empty(buttonIT); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); disp_language(gCfgItems.language, SELECTED); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index 2f4fe327fd..d742f79e59 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -133,10 +133,7 @@ void lv_draw_level_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.LevelingParaConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.LevelingParaConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -145,22 +142,15 @@ void lv_draw_level_settings(void) { lv_obj_set_pos(buttonPosition, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonPosition, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ lv_obj_set_event_cb_mks(buttonPosition, event_handler, ID_LEVEL_POSITION, NULL, 0); - lv_btn_set_style(buttonPosition, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonPosition, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_use_label_style(buttonPosition); lv_btn_set_layout(buttonPosition, LV_LAYOUT_OFF); - labelPosition = lv_label_create(buttonPosition, NULL); /*Add a label to the button*/ + labelPosition = lv_label_create_empty(buttonPosition); /*Add a label to the button*/ #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPosition); #endif - buttonPositionNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonPositionNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonPositionNarrow, event_handler, ID_LEVEL_POSITION_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonPositionNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonPositionNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonPositionNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPositionNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonPositionNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_LEVEL_POSITION_ARROW); lv_btn_set_layout(buttonPositionNarrow, LV_LAYOUT_OFF); line1 = lv_line_create(scr, NULL); @@ -170,22 +160,15 @@ void lv_draw_level_settings(void) { lv_obj_set_pos(buttonCommand, PARA_UI_POS_X, PARA_UI_POS_Y * 2); lv_obj_set_size(buttonCommand, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); lv_obj_set_event_cb_mks(buttonCommand, event_handler, ID_LEVEL_COMMAND, NULL, 0); - lv_btn_set_style(buttonCommand, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonCommand, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_use_label_style(buttonCommand); lv_btn_set_layout(buttonCommand, LV_LAYOUT_OFF); - labelCommand = lv_label_create(buttonCommand, NULL); + labelCommand = lv_label_create_empty(buttonCommand); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonCommand); #endif - buttonCommandNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonCommandNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonCommandNarrow, event_handler, ID_LEVEL_COMMAND_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonCommandNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonCommandNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonCommandNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonCommandNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonCommandNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_LEVEL_COMMAND_ARROW); lv_btn_set_layout(buttonCommandNarrow, LV_LAYOUT_OFF); line2 = lv_line_create(scr, NULL); @@ -193,26 +176,15 @@ void lv_draw_level_settings(void) { #if HAS_BED_PROBE - buttonZoffset = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZoffset, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonZoffset, event_handler, ID_LEVEL_ZOFFSET, NULL, 0); - lv_btn_set_style(buttonZoffset, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZoffset, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + buttonZoffset = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3, PARA_UI_SIZE_X, PARA_UI_SIZE_Y, event_handler, ID_LEVEL_ZOFFSET); lv_btn_set_layout(buttonZoffset, LV_LAYOUT_OFF); - labelZoffset = lv_label_create(buttonZoffset, NULL); /*Add a label to the button*/ + labelZoffset = lv_label_create_empty(buttonZoffset); /*Add a label to the button*/ #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZoffset); #endif - buttonZoffsetNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonZoffsetNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonZoffsetNarrow, event_handler, ID_LEVEL_ZOFFSET_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonZoffsetNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonZoffsetNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonZoffsetNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZoffsetNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonZoffsetNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_LEVEL_ZOFFSET_ARROW); lv_btn_set_layout(buttonZoffsetNarrow, LV_LAYOUT_OFF); line3 = lv_line_create(scr, NULL); @@ -220,19 +192,14 @@ void lv_draw_level_settings(void) { #endif // HAS_BED_PROBE - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_LEVEL_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", event_handler, ID_LEVEL_RETURN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp index b79e84e8cb..2309822e86 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -146,10 +146,7 @@ void lv_draw_machine_para(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -158,19 +155,11 @@ void lv_draw_machine_para(void) { lv_obj_set_size(buttonMachine, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonMachine, event_handler, ID_PARA_MACHINE, NULL, 0); - lv_btn_set_style(buttonMachine, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonMachine, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_use_label_style(buttonMachine); lv_btn_set_layout(buttonMachine, LV_LAYOUT_OFF); - labelMachine = lv_label_create(buttonMachine, NULL); /*Add a label to the button*/ + labelMachine = lv_label_create_empty(buttonMachine); /*Add a label to the button*/ - buttonMachineNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonMachineNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMachineNarrow, event_handler, ID_PARA_MACHINE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonMachineNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMachineNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonMachineNarrow, LV_LAYOUT_OFF); + buttonMachineNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_PARA_MACHINE_ARROW); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); @@ -180,41 +169,21 @@ void lv_draw_machine_para(void) { lv_obj_set_size(buttonMotor, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonMotor, event_handler, ID_PARA_MOTOR, NULL, 0); - lv_btn_set_style(buttonMotor, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonMotor, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_use_label_style(buttonMotor); lv_btn_set_layout(buttonMotor, LV_LAYOUT_OFF); - labelMotor = lv_label_create(buttonMotor, NULL); /*Add a label to the button*/ + labelMotor = lv_label_create_empty(buttonMotor); /*Add a label to the button*/ - buttonMotorNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonMotorNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMotorNarrow, event_handler, ID_PARA_MOTOR_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonMotorNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMotorNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonMotorNarrow, LV_LAYOUT_OFF); + buttonMotorNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_PARA_MOTOR_ARROW); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonLevel = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonLevel, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonLevel, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + buttonLevel = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3, PARA_UI_SIZE_X, PARA_UI_SIZE_Y, event_handler, ID_PARA_LEVEL); //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_PARA_LEVEL, NULL, 0); - lv_btn_set_style(buttonLevel, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonLevel, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); - labelLevel = lv_label_create(buttonLevel, NULL); /*Add a label to the button*/ + labelLevel = lv_label_create_empty(buttonLevel); /*Add a label to the button*/ - buttonLevelNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonLevelNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonLevelNarrow, event_handler, ID_PARA_LEVEL_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonLevelNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonLevelNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonLevelNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonLevelNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonLevelNarrow, LV_LAYOUT_OFF); + buttonLevelNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_PARA_LEVEL_ARROW); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); @@ -224,33 +193,18 @@ void lv_draw_machine_para(void) { lv_obj_set_size(buttonAdvance, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonAdvance, event_handler, ID_PARA_ADVANCE, NULL, 0); - lv_btn_set_style(buttonAdvance, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonAdvance, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_use_label_style(buttonAdvance); lv_btn_set_layout(buttonAdvance, LV_LAYOUT_OFF); - labelAdvance = lv_label_create(buttonAdvance, NULL); /*Add a label to the button*/ + labelAdvance = lv_label_create_empty(buttonAdvance); /*Add a label to the button*/ - buttonAdvanceNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonAdvanceNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 4 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonAdvanceNarrow, event_handler, ID_PARA_ADVANCE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonAdvanceNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdvanceNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonAdvanceNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 4 + PARA_UI_ARROW_V, event_handler, ID_PARA_ADVANCE_ARROW); lv_btn_set_layout(buttonAdvanceNarrow, LV_LAYOUT_OFF); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PARA_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_PARA_RETURN); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); @@ -277,7 +231,6 @@ void lv_draw_machine_para(void) { lv_group_add_obj(g, buttonBack); } #endif - } void lv_clear_machine_para() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp index 930d2639bb..ae83b7efbc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -132,10 +132,7 @@ void lv_draw_machine_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.MachineConfigTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MachineConfigTitle); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -144,19 +141,11 @@ void lv_draw_machine_settings(void) { lv_obj_set_size(buttonAcceleration, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonAcceleration, event_handler, ID_MACHINE_ACCELERATION, NULL, 0); - lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style - lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style + lv_btn_use_label_style(buttonAcceleration); lv_btn_set_layout(buttonAcceleration, LV_LAYOUT_OFF); - labelAcceleration = lv_label_create(buttonAcceleration, NULL); // Add a label to the button + labelAcceleration = lv_label_create_empty(buttonAcceleration); // Add a label to the button - buttonAccelerationNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonAccelerationNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonAccelerationNarrow, event_handler, ID_MACHINE_ACCELERATION_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonAccelerationNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAccelerationNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonAccelerationNarrow, LV_LAYOUT_OFF); + buttonAccelerationNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_MACHINE_ACCELERATION_ARROW); line1 = lv_line_create(lv_scr_act(), NULL); lv_ex_line(line1, line_points[0]); @@ -166,19 +155,11 @@ void lv_draw_machine_settings(void) { lv_obj_set_size(buttonMaxFeedrate, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonMaxFeedrate, event_handler, ID_MACHINE_FEEDRATE, NULL, 0); - lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style - lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style + lv_btn_use_label_style(buttonMaxFeedrate); lv_btn_set_layout(buttonMaxFeedrate, LV_LAYOUT_OFF); - labelMaxFeedrate = lv_label_create(buttonMaxFeedrate, NULL); // Add a label to the button + labelMaxFeedrate = lv_label_create_empty(buttonMaxFeedrate); // Add a label to the button - buttonMaxFeedrateNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonMaxFeedrateNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMaxFeedrateNarrow, event_handler, ID_MACHINE_FEEDRATE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonMaxFeedrateNarrow, LV_LAYOUT_OFF); + buttonMaxFeedrateNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_MACHINE_FEEDRATE_ARROW); line2 = lv_line_create(lv_scr_act(), NULL); lv_ex_line(line2, line_points[1]); @@ -189,34 +170,21 @@ void lv_draw_machine_settings(void) { lv_obj_set_size(buttonJerk, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonJerk, event_handler, ID_MACHINE_JERK, NULL, 0); - lv_btn_set_style(buttonJerk, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style - lv_btn_set_style(buttonJerk, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style + lv_btn_use_label_style(buttonJerk); lv_btn_set_layout(buttonJerk, LV_LAYOUT_OFF); - labelJerk = lv_label_create(buttonJerk, NULL); // Add a label to the button + labelJerk = lv_label_create_empty(buttonJerk); // Add a label to the button - buttonJerkNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonJerkNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonJerkNarrow, event_handler, ID_MACHINE_JERK_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonJerkNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonJerkNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonJerkNarrow, LV_LAYOUT_OFF); + buttonJerkNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_MACHINE_JERK_ARROW); line3 = lv_line_create(lv_scr_act(), NULL); lv_ex_line(line3, line_points[2]); #endif - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MACHINE_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", event_handler, ID_MACHINE_RETURN); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index f1040ba214..8c0575d343 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -178,81 +178,26 @@ void lv_draw_manualLevel(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonPoint1 = lv_imgbtn_create(scr, NULL); - buttonPoint2 = lv_imgbtn_create(scr, NULL); - buttonPoint3 = lv_imgbtn_create(scr, NULL); - buttonPoint4 = lv_imgbtn_create(scr, NULL); - buttonPoint5 = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPoint1, event_handler, ID_M_POINT1, NULL, 0); - lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_REL, "F:/bmp_leveling1.bin"); - lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_PR, "F:/bmp_leveling1.bin"); - lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonPoint1 = lv_imgbtn_create(scr, "F:/bmp_leveling1.bin", INTERVAL_V, titleHeight, event_handler, ID_M_POINT1); lv_obj_clear_protect(buttonPoint1, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonPoint2, event_handler, ID_M_POINT2, NULL, 0); - lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_REL, "F:/bmp_leveling2.bin"); - lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_PR, "F:/bmp_leveling2.bin"); - lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonPoint3, event_handler, ID_M_POINT3, NULL, 0); - lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_REL, "F:/bmp_leveling3.bin"); - lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_PR, "F:/bmp_leveling3.bin"); - lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonPoint4, event_handler, ID_M_POINT4, NULL, 0); - lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_REL, "F:/bmp_leveling4.bin"); - lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_PR, "F:/bmp_leveling4.bin"); - lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonPoint5, event_handler, ID_M_POINT5, NULL, 0); - lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_REL, "F:/bmp_leveling5.bin"); - lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_PR, "F:/bmp_leveling5.bin"); - lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonPoint1, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonPoint2, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonPoint3, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonPoint4, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonPoint5, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonPoint2 = lv_imgbtn_create(scr, "F:/bmp_leveling2.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_M_POINT2); + buttonPoint3 = lv_imgbtn_create(scr, "F:/bmp_leveling3.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_POINT3); + buttonPoint4 = lv_imgbtn_create(scr, "F:/bmp_leveling4.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_POINT4); + buttonPoint5 = lv_imgbtn_create(scr, "F:/bmp_leveling5.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_POINT5); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_MANUAL_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonPoint1, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPoint2, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPoint3, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPoint4, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPoint5, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *label_Point1 = lv_label_create(buttonPoint1, NULL); - lv_obj_t *label_Point2 = lv_label_create(buttonPoint2, NULL); - lv_obj_t *label_Point3 = lv_label_create(buttonPoint3, NULL); - lv_obj_t *label_Point4 = lv_label_create(buttonPoint4, NULL); - lv_obj_t *label_Point5 = lv_label_create(buttonPoint5, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *label_Point1 = lv_label_create_empty(buttonPoint1); + lv_obj_t *label_Point2 = lv_label_create_empty(buttonPoint2); + lv_obj_t *label_Point3 = lv_label_create_empty(buttonPoint3); + lv_obj_t *label_Point4 = lv_label_create_empty(buttonPoint4); + lv_obj_t *label_Point5 = lv_label_create_empty(buttonPoint5); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(label_Point1, leveling_menu.position1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp index c27718b31d..3f51bc1a74 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -183,15 +183,15 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_manual_level_pos_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelPoint1Text = NULL, *buttonX1Value = NULL, *labelX1Value = NULL; + lv_obj_t *buttonX1Value = NULL, *labelX1Value = NULL; lv_obj_t *buttonY1Value = NULL, *labelY1Value = NULL; - lv_obj_t *labelPoint2Text = NULL, *buttonX2Value = NULL, *labelX2Value = NULL; + lv_obj_t *buttonX2Value = NULL, *labelX2Value = NULL; lv_obj_t *buttonY2Value = NULL, *labelY2Value = NULL; - lv_obj_t *labelPoint3Text = NULL, *buttonX3Value = NULL, *labelX3Value = NULL; + lv_obj_t *buttonX3Value = NULL, *labelX3Value = NULL; lv_obj_t *buttonY3Value = NULL, *labelY3Value = NULL; - lv_obj_t *labelPoint4Text = NULL, *buttonX4Value = NULL, *labelX4Value = NULL; + lv_obj_t *buttonX4Value = NULL, *labelX4Value = NULL; lv_obj_t *buttonY4Value = NULL, *labelY4Value = NULL; - lv_obj_t *labelPoint5Text = NULL, *buttonX5Value = NULL, *labelX5Value = NULL; + lv_obj_t *buttonX5Value = NULL, *labelX5Value = NULL; lv_obj_t *buttonY5Value = NULL, *labelY5Value = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MANUAL_LEVELING_POSIGION_UI) { @@ -206,114 +206,58 @@ void lv_draw_manual_level_pos_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.LevelingParaConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.LevelingParaConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - labelPoint1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint1Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelPoint1Text, leveling_menu.position1); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, leveling_menu.position1); - buttonX1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX1Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX1Value, event_handler, ID_MANUAL_POS_X1, NULL, 0); - lv_btn_set_style(buttonX1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX1Value, LV_BTN_STYLE_PR, &style_para_value); - labelX1Value = lv_label_create(buttonX1Value, NULL); + buttonX1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X1); + labelX1Value = lv_label_create_empty(buttonX1Value); - buttonY1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY1Value, event_handler, ID_MANUAL_POS_Y1, NULL, 0); - lv_btn_set_style(buttonY1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY1Value, LV_BTN_STYLE_PR, &style_para_value); - labelY1Value = lv_label_create(buttonY1Value, NULL); + buttonY1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y1); + labelY1Value = lv_label_create_empty(buttonY1Value); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelPoint2Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint2Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint2Text, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelPoint2Text, leveling_menu.position2); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, leveling_menu.position2); - buttonX2Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX2Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX2Value, event_handler, ID_MANUAL_POS_X2, NULL, 0); - lv_btn_set_style(buttonX2Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX2Value, LV_BTN_STYLE_PR, &style_para_value); - labelX2Value = lv_label_create(buttonX2Value, NULL); + buttonX2Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X2); + labelX2Value = lv_label_create_empty(buttonX2Value); - buttonY2Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY2Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY2Value, event_handler, ID_MANUAL_POS_Y2, NULL, 0); - lv_btn_set_style(buttonY2Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY2Value, LV_BTN_STYLE_PR, &style_para_value); - labelY2Value = lv_label_create(buttonY2Value, NULL); + buttonY2Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y2); + labelY2Value = lv_label_create_empty(buttonY2Value); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelPoint3Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint3Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint3Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelPoint3Text, leveling_menu.position3); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, leveling_menu.position3); - buttonX3Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX3Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX3Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX3Value, event_handler, ID_MANUAL_POS_X3, NULL, 0); - lv_btn_set_style(buttonX3Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX3Value, LV_BTN_STYLE_PR, &style_para_value); - labelX3Value = lv_label_create(buttonX3Value, NULL); + buttonX3Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X3); + labelX3Value = lv_label_create_empty(buttonX3Value); - buttonY3Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY3Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY3Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY3Value, event_handler, ID_MANUAL_POS_Y3, NULL, 0); - lv_btn_set_style(buttonY3Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY3Value, LV_BTN_STYLE_PR, &style_para_value); - labelY3Value = lv_label_create(buttonY3Value, NULL); + buttonY3Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y3); + labelY3Value = lv_label_create_empty(buttonY3Value); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - labelPoint4Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint4Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint4Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelPoint4Text, leveling_menu.position4); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, leveling_menu.position4); - buttonX4Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX4Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX4Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX4Value, event_handler, ID_MANUAL_POS_X4, NULL, 0); - lv_btn_set_style(buttonX4Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX4Value, LV_BTN_STYLE_PR, &style_para_value); - labelX4Value = lv_label_create(buttonX4Value, NULL); + buttonX4Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X4); + labelX4Value = lv_label_create_empty(buttonX4Value); - buttonY4Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY4Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY4Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY4Value, event_handler, ID_MANUAL_POS_Y4, NULL, 0); - lv_btn_set_style(buttonY4Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY4Value, LV_BTN_STYLE_PR, &style_para_value); - labelY4Value = lv_label_create(buttonY4Value, NULL); + buttonY4Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y4); + labelY4Value = lv_label_create_empty(buttonY4Value); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); buttonTurnPage = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonTurnPage, &style_para_back); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -330,34 +274,20 @@ void lv_draw_manual_level_pos_settings(void) { #endif } else { - labelPoint5Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint5Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint5Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelPoint5Text, leveling_menu.position5); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, leveling_menu.position5); - buttonX5Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX5Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX5Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX5Value, event_handler, ID_MANUAL_POS_X5, NULL, 0); - lv_btn_set_style(buttonX5Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX5Value, LV_BTN_STYLE_PR, &style_para_value); - labelX5Value = lv_label_create(buttonX5Value, NULL); + buttonX5Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X5); + labelX5Value = lv_label_create_empty(buttonX5Value); - buttonY5Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY5Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY5Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY5Value, event_handler, ID_MANUAL_POS_Y5, NULL, 0); - lv_btn_set_style(buttonY5Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY5Value, LV_BTN_STYLE_PR, &style_para_value); - labelY5Value = lv_label_create(buttonY5Value, NULL); + buttonY5Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y5); + labelY5Value = lv_label_create_empty(buttonY5Value); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); buttonTurnPage = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonTurnPage, &style_para_back); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -370,15 +300,14 @@ void lv_draw_manual_level_pos_settings(void) { lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); + labelTurnPage = lv_label_create_empty(buttonTurnPage); buttonBack = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_POS_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonBack, &style_para_back); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index 6b43b8257b..ff01ceaa6e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -128,12 +128,12 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_max_feedrate_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MAXFEEDRATE_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MAXFEEDRATE_UI; @@ -146,86 +146,50 @@ void lv_draw_max_feedrate_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.MaxFeedRateConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MaxFeedRateConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.XMaxFeedRate); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.XMaxFeedRate); - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_FEED_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_X); lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); - labelXValue = lv_label_create(buttonXValue, NULL); + labelXValue = lv_label_create_empty(buttonXValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.YMaxFeedRate); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.YMaxFeedRate); - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_FEED_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_Y); lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); - labelYValue = lv_label_create(buttonYValue, NULL); + labelYValue = lv_label_create_empty(buttonYValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.ZMaxFeedRate); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.ZMaxFeedRate); - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_FEED_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_Z); lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); - labelZValue = lv_label_create(buttonZValue, NULL); + labelZValue = lv_label_create_empty(buttonZValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - labelE0Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE0Text, &tft_style_label_rel); - lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelE0Text, machine_menu.E0MaxFeedRate); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E0MaxFeedRate); - buttonE0Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_FEED_E0, NULL, 0); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); + buttonE0Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_E0); lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); - labelE0Value = lv_label_create(buttonE0Value, NULL); + labelE0Value = lv_label_create_empty(buttonE0Value); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); buttonTurnPage = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonTurnPage, &style_para_back); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -238,19 +202,11 @@ void lv_draw_max_feedrate_settings(void) { #endif } else { - labelE1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE1Text, &tft_style_label_rel); - lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelE1Text, machine_menu.E1MaxFeedRate); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.E1MaxFeedRate); - buttonE1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_FEED_E1, NULL, 0); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); + buttonE1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_E1); lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); - labelE1Value = lv_label_create(buttonE1Value, NULL); + labelE1Value = lv_label_create_empty(buttonE1Value); line1 = lv_line_create(scr, NULL); @@ -258,8 +214,7 @@ void lv_draw_max_feedrate_settings(void) { buttonTurnPage = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonTurnPage, &style_para_back); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -271,15 +226,14 @@ void lv_draw_max_feedrate_settings(void) { lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); + labelTurnPage = lv_label_create_empty(buttonTurnPage); buttonBack = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FEED_RETURN, NULL, 0); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - label_Back = lv_label_create(buttonBack, NULL); + lv_btn_set_style_both(buttonBack, &style_para_back); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp index 1766abf061..c54318a1b2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -169,10 +169,7 @@ void lv_draw_motor_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.MotorConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MotorConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -181,50 +178,29 @@ void lv_draw_motor_settings(void) { lv_obj_set_size(buttonSteps, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonSteps, event_handler, ID_MOTOR_STEPS, NULL, 0); - lv_btn_set_style(buttonSteps, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonSteps, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_use_label_style(buttonSteps); lv_btn_set_layout(buttonSteps, LV_LAYOUT_OFF); - labelSteps = lv_label_create(buttonSteps, NULL); /*Add a label to the button*/ + labelSteps = lv_label_create_empty(buttonSteps); /*Add a label to the button*/ #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSteps); #endif - buttonStepsNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonStepsNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStepsNarrow, event_handler, ID_MOTOR_STEPS_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonStepsNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStepsNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonStepsNarrow, LV_LAYOUT_OFF); + buttonStepsNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_MOTOR_STEPS_ARROW); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); #if USE_SENSORLESS - buttonSensitivity = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonSensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonSensitivity, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + buttonSensitivity = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2, PARA_UI_SIZE_X, PARA_UI_SIZE_Y, event_handler, ID_HOME_SENSE); //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonSensitivity, event_handler, ID_HOME_SENSE, NULL, 0); - lv_btn_set_style(buttonSensitivity, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonSensitivity, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonSensitivity, LV_LAYOUT_OFF); - labelSensitivity = lv_label_create(buttonSensitivity, NULL); /*Add a label to the button*/ + labelSensitivity = lv_label_create_empty(buttonSensitivity); /*Add a label to the button*/ #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSensitivity); #endif - buttonSensitivityNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonSensitivityNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonSensitivityNarrow, event_handler, ID_HOME_SENSE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonSensitivityNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonSensitivityNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonSensitivityNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSensitivityNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonSensitivityNarrow, LV_LAYOUT_OFF); + buttonSensitivityNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_HOME_SENSE_ARROW); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); @@ -237,22 +213,15 @@ void lv_draw_motor_settings(void) { lv_obj_set_size(buttonTMCcurrent, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonTMCcurrent, event_handler, ID_MOTOR_TMC_CURRENT, NULL, 0); - lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_use_label_style(buttonTMCcurrent); lv_btn_set_layout(buttonTMCcurrent, LV_LAYOUT_OFF); - labelTMCcurrent = lv_label_create(buttonTMCcurrent, NULL); /*Add a label to the button*/ + labelTMCcurrent = lv_label_create_empty(buttonTMCcurrent); /*Add a label to the button*/ #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTMCcurrent); #endif - buttonTMCcurrentNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonTMCcurrentNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2) + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonTMCcurrentNarrow, event_handler, ID_MOTOR_TMC_CURRENT_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonTMCcurrentNarrow, LV_LAYOUT_OFF); + buttonTMCcurrentNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2) + PARA_UI_ARROW_V, event_handler, ID_MOTOR_TMC_CURRENT_ARROW); + #if USE_SENSORLESS line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); @@ -262,27 +231,14 @@ void lv_draw_motor_settings(void) { #endif #if HAS_STEALTHCHOP - buttonStepMode = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonStepMode, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3)); - lv_obj_set_size(buttonStepMode, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonStepMode, event_handler, ID_MOTOR_STEP_MODE, NULL, 0); - lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonStepMode, LV_LAYOUT_OFF); - labelStepMode = lv_label_create(buttonStepMode, NULL); /*Add a label to the button*/ + buttonStepMode = lv_btn_create(scr, NULL, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3), PARA_UI_SIZE_X, PARA_UI_SIZE_Y, event_handler, ID_MOTOR_STEP_MODE); + labelStepMode = lv_label_create_empty(buttonStepMode); /*Add a label to the button*/ #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonStepMode); #endif - buttonStepModeNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonStepModeNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3) + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStepModeNarrow, event_handler, ID_MOTOR_STEP_MODE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonStepModeNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStepModeNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonStepModeNarrow, LV_LAYOUT_OFF); + buttonStepModeNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3) + PARA_UI_ARROW_V, event_handler, ID_MOTOR_STEP_MODE_ARROW); #if USE_SENSORLESS line4 = lv_line_create(scr, NULL); @@ -296,15 +252,8 @@ void lv_draw_motor_settings(void) { #endif // HAS_TRINAMIC_CONFIG - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MOTOR_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_MOTOR_RETURN); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 8e8302d707..3dde4ad5a0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -174,100 +174,33 @@ void lv_draw_move_motor(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonXI = lv_imgbtn_create(scr, NULL); - buttonXD = lv_imgbtn_create(scr, NULL); - buttonYI = lv_imgbtn_create(scr, NULL); - buttonYD = lv_imgbtn_create(scr, NULL); - buttonZI = lv_imgbtn_create(scr, NULL); - buttonZD = lv_imgbtn_create(scr, NULL); - buttonV = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_M_X_P, NULL, 0); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin"); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin"); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonXI = lv_imgbtn_create(scr, "F:/bmp_xAdd.bin", INTERVAL_V, titleHeight, event_handler, ID_M_X_P); lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW); + buttonXD = lv_imgbtn_create(scr, "F:/bmp_xDec.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_X_N); + buttonYI = lv_imgbtn_create(scr, "F:/bmp_yAdd.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_M_Y_P); + buttonYD = lv_imgbtn_create(scr, "F:/bmp_yDec.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Y_N); + buttonZI = lv_imgbtn_create(scr, "F:/bmp_zAdd.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_Z_P); + buttonZD = lv_imgbtn_create(scr, "F:/bmp_zDec.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Z_N); - #if 1 - lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_M_X_N, NULL, 0); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin"); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin"); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonV = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_STEP); + //lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); - lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_M_Y_P, NULL, 0); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin"); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin"); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_M_Y_N, NULL, 0); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin"); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin"); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_M_Z_P, NULL, 0); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin"); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin"); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_M_Z_N, NULL, 0); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin"); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin"); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel); - - //lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, NULL, 0); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_M_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif // if 1 - - lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonV, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonYD, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonV, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelXI = lv_label_create(buttonXI, NULL); - lv_obj_t *labelXD = lv_label_create(buttonXD, NULL); - lv_obj_t *labelYI = lv_label_create(buttonYI, NULL); - lv_obj_t *labelYD = lv_label_create(buttonYD, NULL); - lv_obj_t *labelZI = lv_label_create(buttonZI, NULL); - lv_obj_t *labelZD = lv_label_create(buttonZD, NULL); - labelV = lv_label_create(buttonV, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelXI = lv_label_create_empty(buttonXI); + lv_obj_t *labelXD = lv_label_create_empty(buttonXD); + lv_obj_t *labelYI = lv_label_create_empty(buttonYI); + lv_obj_t *labelYD = lv_label_create_empty(buttonYD); + lv_obj_t *labelZI = lv_label_create_empty(buttonZI); + lv_obj_t *labelZD = lv_label_create_empty(buttonZD); + labelV = lv_label_create_empty(buttonV); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelXI, move_menu.x_add); @@ -310,18 +243,13 @@ void lv_draw_move_motor(void) { void disp_move_dist() { // char buf[30] = {0}; - if ((int)(10 * uiCfg.move_dist) == 1) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move0_1.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move0_1.bin"); - } - else if ((int)(10 * uiCfg.move_dist) == 10) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move1.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move1.bin"); - } - else if ((int)(10 * uiCfg.move_dist) == 100) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move10.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move10.bin"); - } + if ((int)(10 * uiCfg.move_dist) == 1) + lv_imgbtn_set_src_both(buttonV, "F:/bmp_step_move0_1.bin"); + else if ((int)(10 * uiCfg.move_dist) == 10) + lv_imgbtn_set_src_both(buttonV, "F:/bmp_step_move1.bin"); + else if ((int)(10 * uiCfg.move_dist) == 100) + lv_imgbtn_set_src_both(buttonV, "F:/bmp_step_move10.bin"); + if (gCfgItems.multiple_language) { if ((int)(10 * uiCfg.move_dist) == 1) { lv_label_set_text(labelV, move_menu.step_01mm); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 585c2fa75e..01d6e9a2d5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -765,10 +765,7 @@ void lv_draw_number_key(void) { lv_scr_load(scr); lv_obj_clean(scr); - //lv_obj_t * title = lv_label_create(scr, NULL); - //lv_obj_set_style(title, &tft_style_label_rel); - //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - //lv_label_set_text(title, creat_title_text()); + //(void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -779,7 +776,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(buttonValue, LV_BTN_STYLE_REL, &style_num_text); /*Set the button's released style*/ lv_btn_set_style(buttonValue, LV_BTN_STYLE_PR, &style_num_text); /*Set the button's pressed style*/ //lv_btn_set_layout(buttonValue, LV_LAYOUT_OFF); - labelValue = lv_label_create(buttonValue, NULL); /*Add a label to the button*/ + labelValue = lv_label_create_empty(buttonValue); /*Add a label to the button*/ NumberKey_1 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(NumberKey_1, 92, 90); /*Set its position*/ @@ -788,7 +785,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_1, LV_LAYOUT_OFF); - labelKey_1 = lv_label_create(NumberKey_1, NULL); /*Add a label to the button*/ + labelKey_1 = lv_label_create_empty(NumberKey_1); /*Add a label to the button*/ lv_label_set_text(labelKey_1, machine_menu.key_1); lv_obj_align(labelKey_1, NumberKey_1, LV_ALIGN_CENTER, 0, 0); @@ -799,7 +796,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_2, LV_LAYOUT_OFF); - labelKey_2 = lv_label_create(NumberKey_2, NULL); /*Add a label to the button*/ + labelKey_2 = lv_label_create_empty(NumberKey_2); /*Add a label to the button*/ lv_label_set_text(labelKey_2, machine_menu.key_2); lv_obj_align(labelKey_2, NumberKey_2, LV_ALIGN_CENTER, 0, 0); @@ -810,7 +807,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_3, LV_LAYOUT_OFF); - labelKey_3 = lv_label_create(NumberKey_3, NULL); /*Add a label to the button*/ + labelKey_3 = lv_label_create_empty(NumberKey_3); /*Add a label to the button*/ lv_label_set_text(labelKey_3, machine_menu.key_3); lv_obj_align(labelKey_3, NumberKey_3, LV_ALIGN_CENTER, 0, 0); @@ -821,7 +818,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_4, LV_LAYOUT_OFF); - labelKey_4 = lv_label_create(NumberKey_4, NULL); /*Add a label to the button*/ + labelKey_4 = lv_label_create_empty(NumberKey_4); /*Add a label to the button*/ lv_label_set_text(labelKey_4, machine_menu.key_4); lv_obj_align(labelKey_4, NumberKey_4, LV_ALIGN_CENTER, 0, 0); @@ -832,7 +829,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_5, LV_LAYOUT_OFF); - labelKey_5 = lv_label_create(NumberKey_5, NULL); /*Add a label to the button*/ + labelKey_5 = lv_label_create_empty(NumberKey_5); /*Add a label to the button*/ lv_label_set_text(labelKey_5, machine_menu.key_5); lv_obj_align(labelKey_5, NumberKey_5, LV_ALIGN_CENTER, 0, 0); @@ -843,7 +840,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_6, LV_LAYOUT_OFF); - labelKey_6 = lv_label_create(NumberKey_6, NULL); /*Add a label to the button*/ + labelKey_6 = lv_label_create_empty(NumberKey_6); /*Add a label to the button*/ lv_label_set_text(labelKey_6, machine_menu.key_6); lv_obj_align(labelKey_6, NumberKey_6, LV_ALIGN_CENTER, 0, 0); @@ -854,7 +851,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_7, LV_LAYOUT_OFF); - labelKey_7 = lv_label_create(NumberKey_7, NULL); /*Add a label to the button*/ + labelKey_7 = lv_label_create_empty(NumberKey_7); /*Add a label to the button*/ lv_label_set_text(labelKey_7, machine_menu.key_7); lv_obj_align(labelKey_7, NumberKey_7, LV_ALIGN_CENTER, 0, 0); @@ -865,7 +862,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_8, LV_LAYOUT_OFF); - labelKey_8 = lv_label_create(NumberKey_8, NULL); /*Add a label to the button*/ + labelKey_8 = lv_label_create_empty(NumberKey_8); /*Add a label to the button*/ lv_label_set_text(labelKey_8, machine_menu.key_8); lv_obj_align(labelKey_8, NumberKey_8, LV_ALIGN_CENTER, 0, 0); @@ -876,7 +873,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_9, LV_LAYOUT_OFF); - labelKey_9 = lv_label_create(NumberKey_9, NULL); /*Add a label to the button*/ + labelKey_9 = lv_label_create_empty(NumberKey_9); /*Add a label to the button*/ lv_label_set_text(labelKey_9, machine_menu.key_9); lv_obj_align(labelKey_9, NumberKey_9, LV_ALIGN_CENTER, 0, 0); @@ -887,7 +884,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(NumberKey_0, LV_LAYOUT_OFF); - labelKey_0 = lv_label_create(NumberKey_0, NULL); /*Add a label to the button*/ + labelKey_0 = lv_label_create_empty(NumberKey_0); /*Add a label to the button*/ lv_label_set_text(labelKey_0, machine_menu.key_0); lv_obj_align(labelKey_0, NumberKey_0, LV_ALIGN_CENTER, 0, 0); @@ -898,7 +895,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(KeyBack, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(KeyBack, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(KeyBack, LV_LAYOUT_OFF); - labelKeyBack = lv_label_create(KeyBack, NULL); /*Add a label to the button*/ + labelKeyBack = lv_label_create_empty(KeyBack); /*Add a label to the button*/ lv_label_set_text(labelKeyBack, machine_menu.key_back); lv_obj_align(labelKeyBack, KeyBack, LV_ALIGN_CENTER, 0, 0); @@ -909,7 +906,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(KeyReset, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(KeyReset, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(KeyReset, LV_LAYOUT_OFF); - labelKeyReset = lv_label_create(KeyReset, NULL); /*Add a label to the button*/ + labelKeyReset = lv_label_create_empty(KeyReset); /*Add a label to the button*/ lv_label_set_text(labelKeyReset, machine_menu.key_reset); lv_obj_align(labelKeyReset, KeyReset, LV_ALIGN_CENTER, 0, 0); @@ -920,7 +917,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(KeyConfirm, LV_LAYOUT_OFF); - labelKeyConfirm = lv_label_create(KeyConfirm, NULL); /*Add a label to the button*/ + labelKeyConfirm = lv_label_create_empty(KeyConfirm); /*Add a label to the button*/ lv_label_set_text(labelKeyConfirm, machine_menu.key_confirm); lv_obj_align(labelKeyConfirm, KeyConfirm, LV_ALIGN_CENTER, 0, 0); @@ -931,7 +928,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(KeyPoint, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(KeyPoint, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(KeyPoint, LV_LAYOUT_OFF); - labelKeyPoint = lv_label_create(KeyPoint, NULL); /*Add a label to the button*/ + labelKeyPoint = lv_label_create_empty(KeyPoint); /*Add a label to the button*/ lv_label_set_text(labelKeyPoint, machine_menu.key_point); lv_obj_align(labelKeyPoint, KeyPoint, LV_ALIGN_CENTER, 0, 0); @@ -942,7 +939,7 @@ void lv_draw_number_key(void) { lv_btn_set_style(Minus, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ lv_btn_set_style(Minus, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ //lv_btn_set_layout(Minus, LV_LAYOUT_OFF); - labelMinus = lv_label_create(Minus, NULL); /*Add a label to the button*/ + labelMinus = lv_label_create_empty(Minus); /*Add a label to the button*/ lv_label_set_text(labelMinus, machine_menu.negative); lv_obj_align(labelMinus, Minus, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index 6ee5ac88c0..dc8bb57149 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -137,14 +137,12 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (gCfgItems.finish_power_off) { gCfgItems.finish_power_off = false; - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); + lv_imgbtn_set_src_both(buttonPowerOff, "F:/bmp_manual_off.bin"); lv_label_set_text(label_PowerOff, printing_more_menu.manual); } else { gCfgItems.finish_power_off = true; - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); + lv_imgbtn_set_src_both(buttonPowerOff, "F:/bmp_auto_off.bin"); lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); } lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -185,179 +183,71 @@ void lv_draw_operation(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonPreHeat = lv_imgbtn_create(scr, NULL); - buttonFilament = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, NULL); - buttonPowerOff = lv_imgbtn_create(scr, NULL); + buttonPreHeat = lv_imgbtn_create(scr, "F:/bmp_temp.bin", INTERVAL_V, titleHeight, event_handler, ID_O_PRE_HEAT); + buttonFilament = lv_imgbtn_create(scr, "F:/bmp_filamentchange.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_O_FILAMENT); + buttonFan = lv_imgbtn_create(scr, "F:/bmp_fan.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_O_FAN); + buttonPowerOff = lv_imgbtn_create(scr, gCfgItems.finish_power_off ? "F:/bmp_auto_off.bin" : "F:/bmp_manual_off.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_O_POWER_OFF); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPreHeat); + lv_group_add_obj(g, buttonFilament); + lv_group_add_obj(g, buttonFan); + lv_group_add_obj(g, buttonPowerOff); + } + #endif + if (uiCfg.print_state != WORKING) { - buttonExtrusion = lv_imgbtn_create(scr, NULL); - buttonMove = lv_imgbtn_create(scr, NULL); - } - else { - buttonSpeed = lv_imgbtn_create(scr, NULL); - buttonBabyStep = lv_imgbtn_create(scr, NULL); - } - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_O_PRE_HEAT, NULL, 0); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, "F:/bmp_temp.bin"); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, "F:/bmp_temp.bin"); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonFilament, event_handler, ID_O_FILAMENT, NULL, 0); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, "F:/bmp_filamentchange.bin"); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, "F:/bmp_filamentchange.bin"); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_O_FAN, NULL, 0); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, "F:/bmp_fan.bin"); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, "F:/bmp_fan.bin"); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - - if (gCfgItems.finish_power_off) { - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); - } - else { - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); - } - lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, NULL, 0); - lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_REL, &tft_style_label_rel); - + buttonExtrusion = lv_imgbtn_create(scr, "F:/bmp_extrude_opr.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_EXTRUCT); + buttonMove = lv_imgbtn_create(scr, "F:/bmp_move_opr.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_MOV); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPreHeat); - lv_group_add_obj(g, buttonFilament); - lv_group_add_obj(g, buttonFan); - lv_group_add_obj(g, buttonPowerOff); + lv_group_add_obj(g, buttonExtrusion); + lv_group_add_obj(g, buttonMove); } #endif + } + else { + buttonSpeed = lv_imgbtn_create(scr, "F:/bmp_speed.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_SPEED); + buttonBabyStep = lv_imgbtn_create(scr, "F:/bmp_mov.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_BABY_STEP); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonSpeed); + lv_group_add_obj(g, buttonBabyStep); + } + #endif + } - if (uiCfg.print_state != WORKING) { - lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_O_EXTRUCT, NULL, 0); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, "F:/bmp_extrude_opr.bin"); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, "F:/bmp_extrude_opr.bin"); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_O_MOV, NULL, 0); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, "F:/bmp_move_opr.bin"); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, "F:/bmp_move_opr.bin"); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonExtrusion); - lv_group_add_obj(g, buttonMove); - } - #endif - } - else { - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_O_SPEED, NULL, 0); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed.bin"); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed.bin"); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBabyStep, event_handler, ID_O_BABY_STEP, NULL, 0); - lv_imgbtn_set_src(buttonBabyStep, LV_BTN_STATE_REL, "F:/bmp_mov.bin"); - lv_imgbtn_set_src(buttonBabyStep, LV_BTN_STATE_PR, "F:/bmp_mov.bin"); - lv_imgbtn_set_style(buttonBabyStep, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBabyStep, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonSpeed); - lv_group_add_obj(g, buttonBabyStep); - } - #endif - } - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_O_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif // if 1 + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_RETURN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonFilament, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonFan, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonPowerOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - - if (uiCfg.print_state != WORKING) { - /* - lv_obj_set_pos(buttonFilament,INTERVAL_V,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - } else { - */ - lv_obj_set_pos(buttonExtrusion, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonMove, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - } - else { - lv_obj_set_pos(buttonSpeed, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBabyStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - } - - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - // Create labels on the image buttons - lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPowerOff, LV_LAYOUT_OFF); + labelPreHeat = lv_label_create_empty(buttonPreHeat); + label_Filament = lv_label_create_empty(buttonFilament); + label_Fan = lv_label_create_empty(buttonFan); + label_PowerOff = lv_label_create_empty(buttonPowerOff); if (uiCfg.print_state != WORKING) { /* - lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); + label_Filament = lv_label_create_empty(buttonFilament); } else { */ - lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); + labelExtrusion = lv_label_create_empty(buttonExtrusion); + label_Move = lv_label_create_empty(buttonMove); } else { - lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBabyStep, LV_LAYOUT_OFF); + label_Speed = lv_label_create_empty(buttonSpeed); + label_BabyStep = lv_label_create_empty(buttonBabyStep); } - - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - labelPreHeat = lv_label_create(buttonPreHeat, NULL); - label_Filament = lv_label_create(buttonFilament, NULL); - label_Fan = lv_label_create(buttonFan, NULL); - label_PowerOff = lv_label_create(buttonPowerOff, NULL); - - if (uiCfg.print_state != WORKING) { - /* - label_Filament = lv_label_create(buttonFilament, NULL); - } else { - */ - labelExtrusion = lv_label_create(buttonExtrusion, NULL); - label_Move = lv_label_create(buttonMove, NULL); - } - else { - label_Speed = lv_label_create(buttonSpeed, NULL); - label_BabyStep = lv_label_create(buttonBabyStep, NULL); - } - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelPreHeat, operation_menu.temp); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index d1c3a4a795..c7d2de2e1b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -83,9 +83,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_pause_position(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PAUSE_POS_UI) { @@ -100,81 +100,46 @@ void lv_draw_pause_position(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.PausePosText); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.PausePosText); lv_refr_now(lv_refr_get_disp_refreshing()); - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.xPos); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.xPos); - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_PAUSE_X, NULL, 0); - labelXValue = lv_label_create(buttonXValue, NULL); + buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_PAUSE_X); + labelXValue = lv_label_create_empty(buttonXValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.yPos); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.yPos); - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_PAUSE_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); + buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_PAUSE_Y); + labelYValue = lv_label_create_empty(buttonYValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.zPos); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.zPos); - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_PAUSE_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); + buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_PAUSE_Z); + labelZValue = lv_label_create_empty(buttonZValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PAUSE_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_PAUSE_RETURN); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); lv_label_set_text(labelXValue, public_buf_l); lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosY); lv_label_set_text(labelYValue, public_buf_l); lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosZ); lv_label_set_text(labelZValue, public_buf_l); lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index b08c9bd947..966d85b6de 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -35,7 +35,7 @@ static lv_obj_t * scr; extern lv_group_t* g; -static lv_obj_t *buttoType, *buttonStep; +static lv_obj_t *buttonType, *buttonStep; static lv_obj_t *labelType; static lv_obj_t *labelStep; static lv_obj_t * tempText1; @@ -203,77 +203,26 @@ void lv_draw_preHeat(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttoType = lv_imgbtn_create(scr, NULL); - buttonStep = lv_imgbtn_create(scr, NULL); - buttonOff = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_P_ADD, NULL, 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonAdd = lv_imgbtn_create(scr, "F:/bmp_Add.bin", INTERVAL_V, titleHeight, event_handler, ID_P_ADD); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_P_DEC, NULL, 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, NULL, 0); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, NULL, 0); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_P_OFF, NULL, 0); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, "F:/bmp_speed0.bin"); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, "F:/bmp_speed0.bin"); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonDec = lv_imgbtn_create(scr, "F:/bmp_Dec.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_P_DEC); + buttonType = lv_imgbtn_create(scr, NULL, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_TYPE); + buttonStep = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_STEP); + buttonOff = lv_imgbtn_create(scr, "F:/bmp_speed0.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_OFF); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); - lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); - labelType = lv_label_create(buttoType, NULL); - labelStep = lv_label_create(buttonStep, NULL); - lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelAdd = lv_label_create_empty(buttonAdd); + lv_obj_t *labelDec = lv_label_create_empty(buttonDec); + labelType = lv_label_create_empty(buttonType); + labelStep = lv_label_create_empty(buttonStep); + lv_obj_t *labelOff = lv_label_create_empty(buttonOff); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelAdd, preheat_menu.add); @@ -292,7 +241,7 @@ void lv_draw_preHeat(void) { if (gCfgItems.encoder_enable) { lv_group_add_obj(g, buttonAdd); lv_group_add_obj(g, buttonDec); - lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonType); lv_group_add_obj(g, buttonStep); lv_group_add_obj(g, buttonOff); lv_group_add_obj(g, buttonBack); @@ -302,7 +251,7 @@ void lv_draw_preHeat(void) { disp_temp_type(); disp_step_heat(); - tempText1 = lv_label_create(scr, NULL); + tempText1 = lv_label_create_empty(scr); lv_obj_set_style(tempText1, &tft_style_label_rel); disp_desire_temp(); } @@ -310,29 +259,26 @@ void lv_draw_preHeat(void) { void disp_temp_type() { if (uiCfg.curTempType == 0) { if (uiCfg.curSprayerChoose == 1) { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext2); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(labelType, buttonType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } else { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru1.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext1); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(labelType, buttonType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } } else { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_bed.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_bed.bin"); + lv_imgbtn_set_src_both(buttonType, "F:/bmp_bed.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.hotbed); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(labelType, buttonType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } } @@ -363,16 +309,13 @@ void disp_desire_temp() { void disp_step_heat() { if (uiCfg.stepHeat == 1) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_degree.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_degree.bin"); + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step1_degree.bin"); } else if (uiCfg.stepHeat == 5) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_degree.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_degree.bin"); + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step5_degree.bin"); } else if (uiCfg.stepHeat == 10) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_degree.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_degree.bin"); + lv_imgbtn_set_src_both(buttonStep, "F:/bmp_step10_degree.bin"); } if (gCfgItems.multiple_language) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index d92943a37c..8db84c5159 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -266,9 +266,9 @@ void lv_draw_print_file(void) { #endif disp_gcode_icon(file_count); - //lv_obj_t *labelPageUp = lv_label_create(buttonPageUp, NULL); - //lv_obj_t *labelPageDown = lv_label_create(buttonPageDown, NULL); - //lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + //lv_obj_t *labelPageUp = lv_label_create_empty(buttonPageUp); + //lv_obj_t *labelPageDown = lv_label_create_empty(buttonPageDown); + //lv_obj_t *label_Back = lv_label_create_empty(buttonBack); /* if (gCfgItems.multiple_language) { @@ -295,47 +295,16 @@ void disp_gcode_icon(uint8_t file_num) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonPageUp = lv_imgbtn_create(scr, NULL); - buttonPageDown = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPageUp, event_handler, ID_P_UP, NULL, 0); - lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_REL, "F:/bmp_pageUp.bin"); - lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_PR, "F:/bmp_pageUp.bin"); - lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonPageDown, event_handler, ID_P_DOWN, NULL, 0); - lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_REL, "F:/bmp_pageDown.bin"); - lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_PR, "F:/bmp_pageDown.bin"); - lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonPageUp, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonPageDown, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H); - lv_obj_set_pos(buttonBack, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL * 2 + INTERVAL_H * 2); + buttonPageUp = lv_imgbtn_create(scr, "F:/bmp_pageUp.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_P_UP); + buttonPageDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H, event_handler, ID_P_DOWN); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL * 2 + INTERVAL_H * 2, event_handler, ID_P_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonPageUp, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPageDown, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - for (i = 0; i < FILE_BTN_CNT; i++) { /* if (seq) { @@ -352,8 +321,7 @@ void disp_gcode_icon(uint8_t file_num) { #ifdef TFT35 buttonGcode[i] = lv_imgbtn_create(scr, NULL); - lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_REL, &tft_style_label_rel); + lv_imgbtn_use_label_style(buttonGcode[i]); lv_obj_clear_protect(buttonGcode[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonGcode[i], LV_LAYOUT_OFF); @@ -362,16 +330,13 @@ void disp_gcode_icon(uint8_t file_num) { if (list_file.IsFolder[i] == 1) { lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, "F:/bmp_dir.bin"); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, "F:/bmp_dir.bin"); + lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_dir.bin"); if (i < 3) lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); else lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight); - labelPageUp[i] = lv_label_create(buttonGcode[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); - lv_label_set_text(labelPageUp[i], public_buf_m); + labelPageUp[i] = lv_label_create(buttonGcode[i], public_buf_m); lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5); } else { @@ -385,20 +350,16 @@ void disp_gcode_icon(uint8_t file_num) { char *temp = strstr(test_public_buf_l,".GCO"); if (temp) { strcpy(temp,".bin"); } lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, test_public_buf_l); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, test_public_buf_l); + lv_imgbtn_set_src_both(buttonGcode[i], test_public_buf_l); if (i < 3) { lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET); buttonText[i] = lv_btn_create(scr, NULL); //lv_obj_set_event_cb(buttonText[i], event_handler); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_label_pre); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_set_style(buttonText[i], &tft_style_label_pre); - //lv_obj_set_style(buttonText[i], &tft_style_label_rel); + lv_btn_use_label_style(buttonText[i]); lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); - //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0); + //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL, 0); lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); lv_obj_set_size(buttonText[i], 100, 40); } @@ -407,33 +368,25 @@ void disp_gcode_icon(uint8_t file_num) { buttonText[i] = lv_btn_create(scr, NULL); //lv_obj_set_event_cb(buttonText[i], event_handler); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_label_pre); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); - - //lv_imgbtn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_use_label_style(buttonText[i]); lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); - //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0); + //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL, 0); lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); lv_obj_set_size(buttonText[i], 100, 40); } - labelPageUp[i] = lv_label_create(buttonText[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); - lv_label_set_text(labelPageUp[i], public_buf_m); + labelPageUp[i] = lv_label_create(buttonText[i], public_buf_m); lv_obj_align(labelPageUp[i], buttonText[i], LV_ALIGN_IN_BOTTOM_MID, 0, 0); } else { lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, "F:/bmp_file.bin"); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, "F:/bmp_file.bin"); + lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_file.bin"); if (i < 3) lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); else lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight); - labelPageUp[i] = lv_label_create(buttonGcode[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); - lv_label_set_text(labelPageUp[i], public_buf_m); + labelPageUp[i] = lv_label_create(buttonGcode[i], public_buf_m); lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5); } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 6481061800..312ce69d0c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -46,13 +46,14 @@ #include "../../../marlinui.h" #endif -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *labelExt1, * labelFan, * labelZpos, * labelTime; -TERN_(HAS_MULTI_EXTRUDER, static lv_obj_t *labelExt2;) -static lv_obj_t *labelPause, * labelStop, * labelOperat; -static lv_obj_t * bar1, *bar1ValueText; -static lv_obj_t * buttonPause, *buttonOperat, *buttonStop; +extern lv_group_t *g; +static lv_obj_t *scr; +static lv_obj_t *labelExt1, *labelFan, *labelZpos, *labelTime; +static lv_obj_t *labelPause, *labelStop, *labelOperat; +static lv_obj_t *bar1, *bar1ValueText; +static lv_obj_t *buttonPause, *buttonOperat, *buttonStop; + +TERN_(HAS_MULTI_EXTRUDER, static lv_obj_t *labelExt2); #if HAS_HEATED_BED static lv_obj_t* labelBed; @@ -83,23 +84,20 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { stop_print_time(); uiCfg.print_state = PAUSING; #endif - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_resume.bin"); - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_resume.bin"); + lv_imgbtn_set_src_both(buttonPause, "F:/bmp_resume.bin"); lv_label_set_text(labelPause, printing_menu.resume); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); } else if (uiCfg.print_state == PAUSED) { uiCfg.print_state = RESUMING; - lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); - lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); + lv_imgbtn_set_src_both(obj, "F:/bmp_pause.bin"); lv_label_set_text(labelPause, printing_menu.pause); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); } #if ENABLED(POWER_LOSS_RECOVERY) else if (uiCfg.print_state == REPRINTING) { uiCfg.print_state = REPRINTED; - lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); - lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); + lv_imgbtn_set_src_both(obj, "F:/bmp_pause.bin"); lv_label_set_text(labelPause, printing_menu.pause); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); // recovery.resume(); @@ -152,69 +150,42 @@ void lv_draw_printing(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); + lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); + lv_obj_set_pos(buttonExt1, 205, 136); + #if HAS_MULTI_EXTRUDER lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); + lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); + lv_obj_set_pos(buttonExt2, 350, 136); #endif + #if HAS_HEATED_BED lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); + lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); + lv_obj_set_pos(buttonBedstate, 205, 186); #endif + lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); - lv_obj_t *buttonTime = lv_img_create(scr, NULL); - lv_obj_t *buttonZpos = lv_img_create(scr, NULL); - buttonPause = lv_imgbtn_create(scr, NULL); - buttonStop = lv_imgbtn_create(scr, NULL); - buttonOperat = lv_imgbtn_create(scr, NULL); + lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); + lv_obj_set_pos(buttonFanstate, 350, 186); - lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); - #if 1 - #if HAS_MULTI_EXTRUDER - lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); - #endif - #if HAS_HEATED_BED - lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); - #endif + lv_obj_t *buttonTime = lv_img_create(scr, NULL); + lv_img_set_src(buttonTime, "F:/bmp_time_state.bin"); + lv_obj_set_pos(buttonTime, 205, 86); - lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); + lv_obj_t *buttonZpos = lv_img_create(scr, NULL); + lv_img_set_src(buttonZpos, "F:/bmp_zpos_state.bin"); + lv_obj_set_pos(buttonZpos, 350, 86); - lv_img_set_src(buttonTime, "F:/bmp_time_state.bin"); - - lv_img_set_src(buttonZpos, "F:/bmp_zpos_state.bin"); - - if (uiCfg.print_state == WORKING) { - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); - } - else { - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_resume.bin"); - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_resume.bin"); - } - - lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, NULL, 0); - lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonStop, event_handler, ID_STOP, NULL, 0); - lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_REL, "F:/bmp_stop.bin"); - lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_PR, "F:/bmp_stop.bin"); - lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOperat, event_handler, ID_OPTION, NULL, 0); - lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_REL, "F:/bmp_operate.bin"); - lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_PR, "F:/bmp_operate.bin"); - lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif // if 1 + buttonPause = lv_imgbtn_create(scr, uiCfg.print_state == WORKING ? "F:/bmp_pause.bin" : "F:/bmp_resume.bin", 5, 240, event_handler, ID_PAUSE); + buttonStop = lv_imgbtn_create(scr, "F:/bmp_stop.bin", 165, 240, event_handler, ID_STOP); + buttonOperat = lv_imgbtn_create(scr, "F:/bmp_operate.bin", 325, 240, event_handler, ID_OPTION); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -224,71 +195,37 @@ void lv_draw_printing(void) { } #endif - lv_obj_set_pos(buttonExt1, 205, 136); - - #if HAS_MULTI_EXTRUDER - lv_obj_set_pos(buttonExt2, 350, 136); - #endif - - #if HAS_HEATED_BED - lv_obj_set_pos(buttonBedstate, 205, 186); - #endif - - lv_obj_set_pos(buttonFanstate, 350, 186); - lv_obj_set_pos(buttonTime, 205, 86); - lv_obj_set_pos(buttonZpos, 350, 86); - lv_obj_set_pos(buttonPause, 5, 240); - lv_obj_set_pos(buttonStop, 165, 240); - lv_obj_set_pos(buttonOperat, 325, 240); - // Create labels on the image buttons //lv_btn_set_layout(buttonExt1, LV_LAYOUT_OFF); //#if HAS_MULTI_EXTRUDER - //lv_btn_set_layout(buttonExt2, LV_LAYOUT_OFF); + // lv_btn_set_layout(buttonExt2, LV_LAYOUT_OFF); //#endif //#if HAS_HEATED_BED - //lv_btn_set_layout(buttonBedstate, LV_LAYOUT_OFF); + // lv_btn_set_layout(buttonBedstate, LV_LAYOUT_OFF); //#endif //lv_btn_set_layout(buttonFanstate, LV_LAYOUT_OFF); //lv_btn_set_layout(buttonTime, LV_LAYOUT_OFF); //lv_btn_set_layout(buttonZpos, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPause, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonStop, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOperat, LV_LAYOUT_OFF); - labelExt1 = lv_label_create(scr, NULL); - lv_obj_set_style(labelExt1, &tft_style_label_rel); - lv_obj_set_pos(labelExt1, 250, 146); + labelExt1 = lv_label_create(scr, 250, 146, NULL); #if HAS_MULTI_EXTRUDER - labelExt2 = lv_label_create(scr, NULL); - lv_obj_set_style(labelExt2, &tft_style_label_rel); - lv_obj_set_pos(labelExt2, 395, 146); + labelExt2 = lv_label_create(scr, 395, 146, NULL); #endif #if HAS_HEATED_BED - labelBed = lv_label_create(scr, NULL); - lv_obj_set_style(labelBed, &tft_style_label_rel); - lv_obj_set_pos(labelBed, 250, 196); + labelBed = lv_label_create(scr, 250, 196, NULL); #endif - labelFan = lv_label_create(scr, NULL); - lv_obj_set_style(labelFan, &tft_style_label_rel); - lv_obj_set_pos(labelFan, 395, 196); + labelFan = lv_label_create(scr, 395, 196, NULL); + labelTime = lv_label_create(scr, 250, 96, NULL); + labelZpos = lv_label_create(scr, 395, 96, NULL); - labelTime = lv_label_create(scr, NULL); - lv_obj_set_style(labelTime, &tft_style_label_rel); - lv_obj_set_pos(labelTime, 250, 96); - - labelZpos = lv_label_create(scr, NULL); - lv_obj_set_style(labelZpos, &tft_style_label_rel); - lv_obj_set_pos(labelZpos, 395, 96); - - labelPause = lv_label_create(buttonPause, NULL); - labelStop = lv_label_create(buttonStop, NULL); - labelOperat = lv_label_create(buttonOperat, NULL); + labelPause = lv_label_create_empty(buttonPause); + labelStop = lv_label_create_empty(buttonStop); + labelOperat = lv_label_create_empty(buttonOperat); if (gCfgItems.multiple_language) { lv_label_set_text(labelPause, uiCfg.print_state == WORKING ? printing_menu.pause : printing_menu.resume); @@ -307,7 +244,7 @@ void lv_draw_printing(void) { lv_bar_set_style(bar1, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); lv_bar_set_anim_time(bar1, 1000); lv_bar_set_value(bar1, 0, LV_ANIM_ON); - bar1ValueText = lv_label_create(bar1, NULL); + bar1ValueText = lv_label_create_empty(bar1); lv_label_set_text(bar1ValueText,"0%"); lv_obj_align(bar1ValueText, bar1, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 276e8fb551..765570ca3b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -41,7 +41,7 @@ #include -//static lv_obj_t *buttonPrint,*buttonTool,*buttonSet; +//static lv_obj_t *buttonPrint, *buttonTool, *buttonSet; extern lv_group_t* g; static lv_obj_t * scr; #if ENABLED(MKS_TEST) @@ -112,8 +112,8 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - //lv_obj_t *label_tool2 = lv_label_create(scr, NULL); - //lv_obj_set_pos(label_tool,20,50); + //lv_obj_t *label_tool2 = lv_label_create_empty(scr); + //lv_obj_set_pos(label_tool, 20, 50); ZERO(buf); sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.temp_hotend[0].celsius); lv_label_set_text(e1, buf); @@ -148,82 +148,71 @@ void lv_draw_ready_print(void) { lv_obj_set_style(scr, &tft_style_scr); lv_scr_load(scr); lv_obj_clean(scr); - //lv_obj_set_hidden(scr,true); + //lv_obj_set_hidden(scr, true); lv_refr_now(lv_refr_get_disp_refreshing()); if (mks_test_flag == 0x1E) { - //lv_obj_t * title = lv_label_create(scr, NULL); - //lv_obj_set_style(title, &tft_style_label_rel); - //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - //lv_label_set_text(title, creat_title_text()); + //(void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); // Create image buttons //buttonPrint = lv_imgbtn_create(scr, NULL); - buttonTool = lv_imgbtn_create(scr, NULL); - //buttonSet = lv_imgbtn_create(scr, NULL); - - #if 1 - lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, NULL, 0); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, "F:/bmp_tool.bin"); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, "F:/bmp_tool.bin"); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif + buttonTool = lv_imgbtn_create(scr, "F:/bmp_tool.bin", event_handler, ID_TOOL); lv_obj_set_pos(buttonTool, 360, 180); - //lv_obj_set_pos(buttonSet,180,90); - //lv_obj_set_pos(buttonPrint,340,90); - //lv_obj_set_pos(buttonTool,SIMPLE_FIRST_PAGE_GRAP+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - //lv_obj_set_pos(buttonSet,BTN_X_PIXEL+SIMPLE_FIRST_PAGE_GRAP*2+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - //lv_obj_set_pos(buttonPrint,BTN_X_PIXEL*2+SIMPLE_FIRST_PAGE_GRAP*3+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); + //buttonSet = lv_imgbtn_create(scr, NULL); + //lv_obj_set_pos(buttonSet, 180, 90); + //lv_obj_set_pos(buttonPrint, 340, 90); + + //lv_obj_set_pos(buttonTool, SIMPLE_FIRST_PAGE_GRAP+1, (TFT_HEIGHT-BTN_Y_PIXEL)/2+2); + //lv_obj_set_pos(buttonSet, BTN_X_PIXEL+SIMPLE_FIRST_PAGE_GRAP*2+1, (TFT_HEIGHT-BTN_Y_PIXEL)/2+2); + //lv_obj_set_pos(buttonPrint, BTN_X_PIXEL*2+SIMPLE_FIRST_PAGE_GRAP*3+1, (TFT_HEIGHT-BTN_Y_PIXEL)/2+2); // Create labels on the image buttons //lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); //lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); - //lv_obj_t *label_print = lv_label_create(buttonPrint, NULL); - //lv_obj_t *label_set = lv_label_create(buttonSet, NULL); - lv_obj_t *label_tool = lv_label_create(buttonTool, NULL); + //lv_obj_t *label_print = lv_label_create_empty(buttonPrint); + //lv_obj_t *label_set = lv_label_create_empty(buttonSet); + lv_obj_t *label_tool = lv_label_create_empty(buttonTool); if (gCfgItems.multiple_language) { //lv_label_set_text(label_print, main_menu.print); - //lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + //lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); //lv_label_set_text(label_set, main_menu.set); - //lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + //lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - //lv_label_set_style(label_tool,LV_BTN_STATE_PR,&tft_style_label_pre); - //lv_label_set_style(label_tool,LV_BTN_STATE_REL,&tft_style_label_rel); + //lv_label_set_style(label_tool, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_label_set_style(label_tool, LV_BTN_STATE_REL, &tft_style_label_rel); lv_label_set_text(label_tool, main_menu.tool); lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } #if 1 - e1 = lv_label_create(scr, NULL); + e1 = lv_label_create_empty(scr); lv_obj_set_pos(e1, 20, 20); sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[0].celsius); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND - e2 = lv_label_create(scr, NULL); + e2 = lv_label_create_empty(scr); lv_obj_set_pos(e2, 20, 45); sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[1].celsius); lv_label_set_text(e2, buf); #endif - //e3 = lv_label_create(scr, NULL); - //lv_obj_set_pos(e3,20,70); + //e3 = lv_label_create_empty(scr); + //lv_obj_set_pos(e3, 20, 70); //sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[2].celsius); //lv_label_set_text(e3, buf); #if HAS_HEATED_BED - bed = lv_label_create(scr, NULL); + bed = lv_label_create_empty(scr); lv_obj_set_pos(bed, 20, 95); sprintf_P(buf, PSTR("bed: %d"), (int)thermalManager.temp_bed.celsius); lv_label_set_text(bed, buf); #endif - limit_info = lv_label_create(scr, NULL); + limit_info = lv_label_create_empty(scr); lv_style_copy(&limit_style, &lv_style_scr); limit_style.body.main_color.full = 0X0000; @@ -234,7 +223,7 @@ void lv_draw_ready_print(void) { lv_obj_set_pos(limit_info, 20, 120); lv_label_set_text(limit_info, " "); - det_info = lv_label_create(scr, NULL); + det_info = lv_label_create_empty(scr); lv_style_copy(&det_style, &lv_style_scr); det_style.body.main_color.full = 0X0000; @@ -249,35 +238,14 @@ void lv_draw_ready_print(void) { } else { // Create an Image button - buttonTool = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonTool, 20, 90); - lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, NULL, 0); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, "F:/bmp_tool.bin"); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, "F:/bmp_tool.bin"); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_t *label_tool = lv_label_create(buttonTool, NULL); - lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); + buttonTool = lv_imgbtn_create(scr, "F:/bmp_tool.bin", 20, 90, event_handler, ID_TOOL); + lv_obj_t *label_tool = lv_label_create_empty(buttonTool); - buttonSet = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonSet, 180, 90); - lv_obj_set_event_cb_mks(buttonSet, event_handler, ID_SET, NULL, 0); - lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, "F:/bmp_set.bin"); - lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, "F:/bmp_set.bin"); - lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_t *label_set = lv_label_create(buttonSet, NULL); - lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); + buttonSet = lv_imgbtn_create(scr, "F:/bmp_set.bin", 180, 90, event_handler, ID_SET); + lv_obj_t *label_set = lv_label_create_empty(buttonSet); - buttonPrint = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonPrint, 340, 90); - lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, NULL, 0); - lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, "F:/bmp_printing.bin"); - lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, "F:/bmp_printing.bin"); - lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_t *label_print = lv_label_create(buttonPrint, NULL); - lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); + buttonPrint = lv_imgbtn_create(scr, "F:/bmp_printing.bin", 340, 90, event_handler, ID_PRINT); + lv_obj_t *label_print = lv_label_create_empty(buttonPrint); if (gCfgItems.multiple_language) { lv_label_set_text(label_print, main_menu.print); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index d23fe40182..e4896866cf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -194,89 +194,25 @@ void lv_draw_set(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonEepromSet = lv_imgbtn_create(scr, NULL); - //buttonWifi = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, NULL); - buttonAbout = lv_imgbtn_create(scr, NULL); - //buttonContinue = lv_imgbtn_create(scr, NULL); - buMotorOff = lv_imgbtn_create(scr, NULL); - buttonMachinePara = lv_imgbtn_create(scr, NULL); + buttonEepromSet = lv_imgbtn_create(scr, "F:/bmp_eeprom_settings.bin", INTERVAL_V, titleHeight, event_handler, ID_S_EEPROM_SET); + //buttonWifi = lv_imgbtn_create(scr, NULL); + buttonFan = lv_imgbtn_create(scr, "F:/bmp_fan.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_S_FAN); + buttonAbout = lv_imgbtn_create(scr, "F:/bmp_about.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_S_ABOUT); + //buttonContinue = lv_imgbtn_create(scr, NULL); + buMotorOff = lv_imgbtn_create(scr, ENABLED(HAS_SUICIDE) ? "F:/bmp_manual_off.bin" : "F:/bmp_function1.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_S_MOTOR_OFF); + buttonMachinePara = lv_imgbtn_create(scr, "F:/bmp_machine_para.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_MACHINE_PARA); #if HAS_LANG_SELECT_SCREEN - buttonLanguage = lv_imgbtn_create(scr, NULL); + buttonLanguage = lv_imgbtn_create(scr, "F:/bmp_language.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_LANGUAGE); #endif #if ENABLED(USE_WIFI_FUNCTION) - buttonWifi = lv_imgbtn_create(scr, NULL); + buttonWifi = lv_imgbtn_create(scr, "F:/bmp_wifi.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_WIFI); #endif - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonEepromSet, event_handler, ID_S_EEPROM_SET, NULL, 0); - lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_REL, "F:/bmp_eeprom_settings.bin"); - lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_PR, "F:/bmp_eeprom_settings.bin"); - lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_S_FAN, NULL, 0); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, "F:/bmp_fan.bin"); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, "F:/bmp_fan.bin"); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonAbout, event_handler, ID_S_ABOUT, NULL, 0); - lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_REL, "F:/bmp_about.bin"); - lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_PR, "F:/bmp_about.bin"); - lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, NULL, 0); - - #if HAS_SUICIDE - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); - #else - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); - #endif - lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMachinePara, event_handler, ID_S_MACHINE_PARA, NULL, 0); - lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_REL, "F:/bmp_machine_para.bin"); - lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_PR, "F:/bmp_machine_para.bin"); - lv_imgbtn_set_style(buttonMachinePara, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMachinePara, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_LANG_SELECT_SCREEN - lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, NULL, 0); - lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, "F:/bmp_language.bin"); - lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, "F:/bmp_language.bin"); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,NULL,0); - lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, "F:/bmp_wifi.bin"); - lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, "F:/bmp_wifi.bin"); - lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN,NULL , 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif // if 1 + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_RETURN); /*lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); lv_obj_set_pos(buttonFan,BTN_X_PIXEL+INTERVAL_V*2,titleHeight); @@ -287,51 +223,23 @@ void lv_draw_set(void) { lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ //lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); - lv_obj_set_pos(buttonEepromSet, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonFan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonAbout, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); - lv_obj_set_pos(buMotorOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - - lv_obj_set_pos(buttonMachinePara, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - #if HAS_LANG_SELECT_SCREEN - lv_obj_set_pos(buttonLanguage, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - #endif - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_set_pos(buttonWifi,BTN_X_PIXEL*2+INTERVAL_V*3,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - #endif - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /// Create labels on the buttons - //lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonEepromSet, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonAbout, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonContinue, LV_LAYOUT_OFF); - lv_btn_set_layout(buMotorOff, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMachinePara, LV_LAYOUT_OFF); + //lv_obj_t *labelWifi= lv_label_create_empty(buttonWifi); + lv_obj_t *label_EepromSet = lv_label_create_empty(buttonEepromSet); + lv_obj_t *labelFan = lv_label_create_empty(buttonFan); + lv_obj_t *label_About = lv_label_create_empty(buttonAbout); + //lv_obj_t *label_Continue = lv_label_create_empty(buttonContinue); + lv_obj_t *label_MotorOff = lv_label_create_empty(buMotorOff); + lv_obj_t *label_MachinePara = lv_label_create_empty(buttonMachinePara); #if HAS_LANG_SELECT_SCREEN - lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF); + lv_obj_t *label_Language = lv_label_create_empty(buttonLanguage); #endif #if ENABLED(USE_WIFI_FUNCTION) - lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); + lv_obj_t *label_Wifi = lv_label_create_empty(buttonWifi); #endif - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - //lv_obj_t *labelWifi= lv_label_create(buttonWifi, NULL); - lv_obj_t *label_EepromSet = lv_label_create(buttonEepromSet, NULL); - lv_obj_t *labelFan = lv_label_create(buttonFan, NULL); - lv_obj_t *label_About = lv_label_create(buttonAbout, NULL); - //lv_obj_t *label_Continue = lv_label_create(buttonContinue, NULL); - lv_obj_t *label_MotorOff = lv_label_create(buMotorOff, NULL); - lv_obj_t *label_MachinePara = lv_label_create(buttonMachinePara, NULL); - #if HAS_LANG_SELECT_SCREEN - lv_obj_t *label_Language = lv_label_create(buttonLanguage, NULL); - #endif - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_t *label_Wifi = lv_label_create(buttonWifi, NULL); - #endif - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index ff45fba461..9f09389146 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -128,12 +128,12 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_step_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != STEPS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = STEPS_UI; @@ -146,82 +146,44 @@ void lv_draw_step_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.StepsConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.StepsConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.X_Steps); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.X_Steps); - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_STEP_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); + buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_X); + labelXValue = lv_label_create_empty(buttonXValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Y_Steps); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Y_Steps); - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_STEP_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); + buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_Y); + labelYValue = lv_label_create_empty(buttonYValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Steps); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Z_Steps); - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_STEP_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); + buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_Z); + labelZValue = lv_label_create_empty(buttonZValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - labelE0Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE0Text, &tft_style_label_rel); - lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelE0Text, machine_menu.E0_Steps); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E0_Steps); - buttonE0Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_STEP_E0, NULL, 0); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); - labelE0Value = lv_label_create(buttonE0Value, NULL); + buttonE0Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_E0); + labelE0Value = lv_label_create_empty(buttonE0Value); line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + buttonTurnPage = lv_btn_create(scr, event_handler, ID_STEP_DOWN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -234,26 +196,15 @@ void lv_draw_step_settings(void) { #endif } else { - labelE1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE1Text, &tft_style_label_rel); - lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelE1Text, machine_menu.E1_Steps); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.E1_Steps); - buttonE1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_STEP_E1, NULL, 0); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); - labelE1Value = lv_label_create(buttonE1Value, NULL); + buttonE1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_E1); + labelE1Value = lv_label_create_empty(buttonE1Value); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + buttonTurnPage = lv_btn_create(scr, event_handler, ID_STEP_UP); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -265,15 +216,14 @@ void lv_draw_step_settings(void) { lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); + labelTurnPage = lv_label_create_empty(buttonTurnPage); buttonBack = lv_btn_create(scr, NULL); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonBack, &style_para_back); lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_STEP_RETURN, NULL, 0); - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index b19048f1c0..a05cc257a8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -143,10 +143,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_tmc_current_settings(void) { lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonE0Value = NULL, *labelE0Value = NULL; lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; //#if AXIS_IS_TMC(E1) @@ -167,74 +167,39 @@ void lv_draw_tmc_current_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.TmcCurrentConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.TmcCurrentConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.X_Current); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.X_Current); - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_TMC_CURRENT_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); + buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_X); + labelXValue = lv_label_create_empty(buttonXValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Y_Current); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Y_Current); - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_TMC_CURRENT_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); + buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_Y); + labelYValue = lv_label_create_empty(buttonYValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Current); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Z_Current); - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_TMC_CURRENT_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); + buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_Z); + labelZValue = lv_label_create_empty(buttonZValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - labelE0Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE0Text, &tft_style_label_rel); - lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelE0Text, machine_menu.E0_Current); + (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E0_Current); - buttonE0Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_TMC_CURRENT_E0, NULL, 0); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); - labelE0Value = lv_label_create(buttonE0Value, NULL); + buttonE0Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_E0); + labelE0Value = lv_label_create_empty(buttonE0Value); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -251,8 +216,7 @@ void lv_draw_tmc_current_settings(void) { //#if AXIS_IS_TMC(E1) buttonTurnPage = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonTurnPage, &style_para_back); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); @@ -261,26 +225,17 @@ void lv_draw_tmc_current_settings(void) { } else { //#if AXIS_IS_TMC(E1) - labelE1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE1Text, &tft_style_label_rel); - lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelE1Text, machine_menu.E1_Current); + labelE1Text = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.E1_Current); - buttonE1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_TMC_CURRENT_E1, NULL, 0); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); - labelE1Value = lv_label_create(buttonE1Value, NULL); + buttonE1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_E1); + labelE1Value = lv_label_create_empty(buttonE1Value); line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); buttonTurnPage = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonTurnPage, &style_para_back); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -293,13 +248,12 @@ void lv_draw_tmc_current_settings(void) { //#if AXIS_IS_TMC(E1) lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); + labelTurnPage = lv_label_create_empty(buttonTurnPage); //#endif buttonBack = lv_btn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_CURRENT_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_btn_set_style_both(buttonBack, &style_para_back); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); @@ -307,7 +261,7 @@ void lv_draw_tmc_current_settings(void) { lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 04087f632e..8be03297f5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -28,9 +28,12 @@ #include "../../../../module/stepper/indirection.h" #include "../../../../feature/tmc_util.h" -#include "../../../../gcode/gcode.h" #include "../../../../inc/MarlinConfig.h" +#if ENABLED(EEPROM_SETTINGS) + #include "../../../../module/settings.h" +#endif + extern lv_group_t * g; static lv_obj_t * scr; @@ -69,24 +72,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - if (stepperX.stored.stealthChop_enabled) { - stepperX.stored.stealthChop_enabled = false; - stepperX.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - lv_label_set_text(labelXState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - // gcode.process_subcommands_now_P(PSTR("M500")); + if (stepperX.toggle_stepping_mode()) { + lv_imgbtn_set_src_both(buttonXState, "F:/bmp_enable.bin"); + lv_label_set_text(labelXState, machine_menu.enable); } else { - stepperX.stored.stealthChop_enabled = true; - stepperX.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelXState, machine_menu.enable); - // gcode.process_subcommands_now_P(PSTR("M500")); + lv_imgbtn_set_src_both(buttonXState, "F:/bmp_disable.bin"); + lv_label_set_text(labelXState, machine_menu.disable); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } - gcode.process_subcommands_now_P(PSTR("M500")); + TERN_(EEPROM_SETTINGS, (void)settings.save()); } break; #endif // if AXIS_HAS_STEALTHCHOP(X) @@ -97,22 +92,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - if (stepperY.stored.stealthChop_enabled) { - stepperY.stored.stealthChop_enabled = false; - stepperY.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + if (stepperY.toggle_stepping_mode()) { + lv_imgbtn_set_src_both(buttonYState, "F:/bmp_enable.bin"); + lv_label_set_text(labelYState, machine_menu.enable); + } + else { + lv_imgbtn_set_src_both(buttonYState, "F:/bmp_disable.bin"); lv_label_set_text(labelYState, machine_menu.disable); //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } - else { - stepperY.stored.stealthChop_enabled = true; - stepperY.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelYState, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); + TERN_(EEPROM_SETTINGS, (void)settings.save()); } break; #endif // if AXIS_HAS_STEALTHCHOP(Y) @@ -123,22 +112,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - if (stepperZ.stored.stealthChop_enabled) { - stepperZ.stored.stealthChop_enabled = false; - stepperZ.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + if (stepperZ.toggle_stepping_mode()) { + lv_imgbtn_set_src_both(buttonZState, "F:/bmp_enable.bin"); + lv_label_set_text(labelZState, machine_menu.enable); + } + else { + lv_imgbtn_set_src_both(buttonZState, "F:/bmp_disable.bin"); lv_label_set_text(labelZState, machine_menu.disable); //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } - else { - stepperZ.stored.stealthChop_enabled = true; - stepperZ.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelZState, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); + TERN_(EEPROM_SETTINGS, (void)settings.save()); } break; #endif // if AXIS_HAS_STEALTHCHOP(Z) @@ -149,22 +132,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - if (stepperE0.stored.stealthChop_enabled) { - stepperE0.stored.stealthChop_enabled = false; - stepperE0.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + if (stepperE0.toggle_stepping_mode()) { + lv_imgbtn_set_src_both(buttonE0State, "F:/bmp_enable.bin"); + lv_label_set_text(labelE0State, machine_menu.enable); + } + else { + lv_imgbtn_set_src_both(buttonE0State, "F:/bmp_disable.bin"); lv_label_set_text(labelE0State, machine_menu.disable); //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } - else { - stepperE0.stored.stealthChop_enabled = true; - stepperE0.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelE0State, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); + TERN_(EEPROM_SETTINGS, (void)settings.save()); } break; #endif // if AXIS_HAS_STEALTHCHOP(E0) @@ -175,22 +152,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - if (stepperE1.stored.stealthChop_enabled) { - stepperE1.stored.stealthChop_enabled = false; - stepperE1.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + if (stepperE1.toggle_stepping_mode()) { + lv_imgbtn_set_src_both(buttonE1State, "F:/bmp_enable.bin"); + lv_label_set_text(labelE1State, machine_menu.enable); + } + else { + lv_imgbtn_set_src_both(buttonE1State, "F:/bmp_disable.bin"); lv_label_set_text(labelE1State, machine_menu.disable); //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } - else { - stepperE1.stored.stealthChop_enabled = true; - stepperE1.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelE1State, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); + TERN_(EEPROM_SETTINGS, (void)settings.save()); } break; #endif // if AXIS_HAS_STEALTHCHOP(E1) @@ -255,44 +226,33 @@ void lv_draw_tmc_step_mode_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.TmcStepModeConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.TmcStepModeConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); + bool stealth_X = false, stealth_Y = false, stealth_Z = false, stealth_E0 = false, stealth_E1 = false; + #if AXIS_HAS_STEALTHCHOP(X) + stealth_X = stepperX.get_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + stealth_Y = stepperY.get_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + stealth_Z = stepperZ.get_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + stealth_E0 = stepperE0.get_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + stealth_E1 = stepperE1.get_stealthChop_status(); + #endif + if (uiCfg.para_ui_page != 1) { - buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonXText, event_handler); - lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); - labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + buttonXText = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); + labelXText = lv_label_create_empty(buttonXText); /*Add a label to the button*/ - buttonXState = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonXState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(X) - if (stepperX.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, NULL, 0); - - lv_imgbtn_set_style(buttonXState, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXState, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonXState, LV_LAYOUT_OFF); - labelXState = lv_label_create(buttonXState, NULL); + buttonXState = lv_imgbtn_create(scr, stealth_X ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_X); + labelXState = lv_label_create_empty(buttonXState); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXState); #endif @@ -300,36 +260,11 @@ void lv_draw_tmc_step_mode_settings(void) { line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonYText, event_handler); - lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); - labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + buttonYText = lv_btn_create(scr, NULL, PARA_UI_POS_X, PARA_UI_POS_Y * 2, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); + labelYText = lv_label_create_empty(buttonYText); /*Add a label to the button*/ - buttonYState = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonYState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(Y) - if (stepperY.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, NULL, 0); - - lv_imgbtn_set_style(buttonYState, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYState, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonYState, LV_LAYOUT_OFF); - labelYState = lv_label_create(buttonYState, NULL); + buttonYState = lv_imgbtn_create(scr, stealth_Y ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_Y); + labelYState = lv_label_create_empty(buttonYState); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYState); #endif @@ -337,35 +272,11 @@ void lv_draw_tmc_step_mode_settings(void) { line2 = lv_line_create(scr, NULL); lv_ex_line(line2, line_points[1]); - buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonZText, event_handler); - lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); - labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + buttonZText = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); + labelZText = lv_label_create_empty(buttonZText); /*Add a label to the button*/ - buttonZState = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonZState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(Z) - if (stepperZ.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, NULL, 0); - lv_imgbtn_set_style(buttonZState, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZState, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonZState, LV_LAYOUT_OFF); - labelZState = lv_label_create(buttonZState, NULL); + buttonZState = lv_imgbtn_create(scr, stealth_Z ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_Z); + labelZState = lv_label_create_empty(buttonZState); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZState); #endif @@ -373,52 +284,20 @@ void lv_draw_tmc_step_mode_settings(void) { line3 = lv_line_create(scr, NULL); lv_ex_line(line3, line_points[2]); - buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE0Text, event_handler); - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); - labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + buttonE0Text = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); + labelE0Text = lv_label_create_empty(buttonE0Text); /*Add a label to the button*/ - buttonE0State = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonE0State, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(E0) - if (stepperE0.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - - lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, NULL, 0); - - lv_imgbtn_set_style(buttonE0State, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonE0State, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonE0State, LV_LAYOUT_OFF); - labelE0State = lv_label_create(buttonE0State, NULL); + buttonE0State = lv_imgbtn_create(scr, stealth_E0 ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_E0); + labelE0State = lv_label_create_empty(buttonE0State); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE0State); #endif - line4 = lv_line_create(scr, NULL); lv_ex_line(line4, line_points[3]); //#if AXIS_HAS_STEALTHCHOP(E1) - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_DOWN, NULL, 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonTurnPage = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", event_handler, ID_TMC_MODE_DOWN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); #endif @@ -426,35 +305,11 @@ void lv_draw_tmc_step_mode_settings(void) { } else { //#if AXIS_HAS_STEALTHCHOP(E1) - buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE1Text, event_handler); - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); - labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + buttonE1Text = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); + labelE1Text = lv_label_create_empty(buttonE1Text); /*Add a label to the button*/ - buttonE1State = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonE1State, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(E1) - if (stepperE1.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, NULL, 0); - lv_imgbtn_set_style(buttonE1State, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonE1State, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonE1State, LV_LAYOUT_OFF); - labelE1State = lv_label_create(buttonE1State, NULL); + buttonE1State = lv_imgbtn_create(scr, stealth_E1 ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_E1); + labelE1State = lv_label_create_empty(buttonE1State); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE1State); #endif @@ -462,33 +317,20 @@ void lv_draw_tmc_step_mode_settings(void) { line1 = lv_line_create(scr, NULL); lv_ex_line(line1, line_points[0]); - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_UP, NULL, 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonTurnPage = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", event_handler, ID_TMC_MODE_UP); //#endif } //#if AXIS_HAS_STEALTHCHOP(E1) lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); + labelTurnPage = lv_label_create_empty(buttonTurnPage); //#endif - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_MODE_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_TMC_MODE_RETURN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { if (uiCfg.para_ui_page != 1) { @@ -504,44 +346,16 @@ void lv_draw_tmc_step_mode_settings(void) { lv_label_set_text(labelE0Text, machine_menu.E0_StepMode); lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if AXIS_HAS_STEALTHCHOP(X) - if (stepperX.get_stealthChop_status()) - lv_label_set_text(labelXState, machine_menu.enable); - else - lv_label_set_text(labelXState, machine_menu.disable); - #else - lv_label_set_text(labelXState, machine_menu.disable); - #endif + lv_label_set_text(labelXState, stealth_X ? machine_menu.enable : machine_menu.disable); lv_obj_align(labelXState, buttonXState, LV_ALIGN_CENTER, 0, 0); - #if AXIS_HAS_STEALTHCHOP(Y) - if (stepperY.get_stealthChop_status()) - lv_label_set_text(labelYState, machine_menu.enable); - else - lv_label_set_text(labelYState, machine_menu.disable); - #else - lv_label_set_text(labelYState, machine_menu.disable); - #endif + lv_label_set_text(labelYState, stealth_Y ? machine_menu.enable : machine_menu.disable); lv_obj_align(labelYState, buttonYState, LV_ALIGN_CENTER, 0, 0); - #if AXIS_HAS_STEALTHCHOP(Z) - if (stepperZ.get_stealthChop_status()) - lv_label_set_text(labelZState, machine_menu.enable); - else - lv_label_set_text(labelZState, machine_menu.disable); - #else - lv_label_set_text(labelZState, machine_menu.disable); - #endif + lv_label_set_text(labelZState, stealth_Z ? machine_menu.enable : machine_menu.disable); lv_obj_align(labelZState, buttonZState, LV_ALIGN_CENTER, 0, 0); - #if AXIS_HAS_STEALTHCHOP(E0) - if (stepperE0.get_stealthChop_status()) - lv_label_set_text(labelE0State, machine_menu.enable); - else - lv_label_set_text(labelE0State, machine_menu.disable); - #else - lv_label_set_text(labelE0State, machine_menu.disable); - #endif + lv_label_set_text(labelE0State, stealth_E0 ? machine_menu.enable : machine_menu.disable); lv_obj_align(labelE0State, buttonE0State, LV_ALIGN_CENTER, 0, 0); //#if AXIS_HAS_STEALTHCHOP(E1) @@ -553,14 +367,7 @@ void lv_draw_tmc_step_mode_settings(void) { //#if AXIS_HAS_STEALTHCHOP(E1) lv_label_set_text(labelE1Text, machine_menu.E1_StepMode); lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if AXIS_HAS_STEALTHCHOP(E1) - if (stepperE1.get_stealthChop_status()) - lv_label_set_text(labelE1State, machine_menu.enable); - else - lv_label_set_text(labelE1State, machine_menu.disable); - #else - lv_label_set_text(labelE1State, machine_menu.disable); - #endif + lv_label_set_text(labelE1State, stealth_E1 ? machine_menu.enable : machine_menu.disable); lv_obj_align(labelE1State, buttonE1State, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(labelTurnPage, machine_menu.previous); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index b6ef6e64da..8f31072978 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -149,92 +149,30 @@ void lv_draw_tool(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonPreHeat = lv_imgbtn_create(scr, NULL); - buttonExtrusion = lv_imgbtn_create(scr, NULL); - buttonMove = lv_imgbtn_create(scr, NULL); - buttonHome = lv_imgbtn_create(scr, NULL); - buttonLevel = lv_imgbtn_create(scr, NULL); - buttonFilament = lv_imgbtn_create(scr, NULL); - //buttonMore = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_T_PRE_HEAT, NULL, 0); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, "F:/bmp_preHeat.bin"); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, "F:/bmp_preHeat.bin"); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_T_EXTRUCT, NULL, 0); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, "F:/bmp_extruct.bin"); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, "F:/bmp_extruct.bin"); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_T_MOV, NULL, 0); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, "F:/bmp_mov.bin"); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, "F:/bmp_mov.bin"); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHome, event_handler, ID_T_HOME, NULL, 0); - lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_REL, "F:/bmp_zero.bin"); - lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_PR, "F:/bmp_zero.bin"); - lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_T_LEVELING, NULL, 0); - lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_REL, "F:/bmp_leveling.bin"); - lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_PR, "F:/bmp_leveling.bin"); - lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,NULL,0); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, "F:/bmp_filamentchange.bin"); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, "F:/bmp_filamentchange.bin"); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_T_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonExtrusion, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonMove, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonHome, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonLevel, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); + buttonPreHeat = lv_imgbtn_create(scr, "F:/bmp_preHeat.bin", INTERVAL_V, titleHeight, event_handler, ID_T_PRE_HEAT); + buttonExtrusion = lv_imgbtn_create(scr, "F:/bmp_extruct.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_EXTRUCT); + buttonMove = lv_imgbtn_create(scr, "F:/bmp_mov.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_T_MOV); + buttonHome = lv_imgbtn_create(scr, "F:/bmp_zero.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_T_HOME); + buttonLevel = lv_imgbtn_create(scr, "F:/bmp_leveling.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_LEVELING); + buttonFilament = lv_imgbtn_create(scr, "F:/bmp_filamentchange.bin",BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight, event_handler,ID_T_FILAMENT); + //buttonMore = lv_imgbtn_createx(scr, NULL); //lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN); // Create labels on the image buttons - lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHome, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonMore, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelPreHeat = lv_label_create(buttonPreHeat, NULL); - lv_obj_t *labelExtrusion = lv_label_create(buttonExtrusion, NULL); - lv_obj_t *label_Move = lv_label_create(buttonMove, NULL); - lv_obj_t *label_Home = lv_label_create(buttonHome, NULL); - lv_obj_t *label_Level = lv_label_create(buttonLevel, NULL); - lv_obj_t *label_Filament = lv_label_create(buttonFilament, NULL); - //lv_obj_t *label_More = lv_label_create(buttonMore, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + lv_obj_t *labelPreHeat = lv_label_create_empty(buttonPreHeat); + lv_obj_t *labelExtrusion = lv_label_create_empty(buttonExtrusion); + lv_obj_t *label_Move = lv_label_create_empty(buttonMove); + lv_obj_t *label_Home = lv_label_create_empty(buttonHome); + lv_obj_t *label_Level = lv_label_create_empty(buttonLevel); + lv_obj_t *label_Filament = lv_label_create_empty(buttonFilament); + //lv_obj_t *label_More = lv_label_create_empty(buttonMore); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { lv_label_set_text(labelPreHeat, tool_menu.preheat); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 1f21136668..ef23305285 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -1577,6 +1577,105 @@ void draw_return_ui() { } } +// Set the same image for both Released and Pressed +void lv_imgbtn_set_src_both(lv_obj_t *imgbtn, const void *src) { + lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_REL, src); + lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PR, src); +} + +// Use label style for the image button +void lv_imgbtn_use_label_style(lv_obj_t *imgbtn) { + lv_imgbtn_set_style(imgbtn, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_imgbtn_set_style(imgbtn, LV_BTN_STATE_PR, &tft_style_label_pre); +} + +// Use label style for the image button +void lv_btn_use_label_style(lv_obj_t *btn) { + lv_btn_set_style(btn, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(btn, LV_BTN_STYLE_PR, &tft_style_label_pre); +} + +// Use a single style for both Released and Pressed +void lv_btn_set_style_both(lv_obj_t *btn, lv_style_t *style) { + lv_btn_set_style(btn, LV_BTN_STYLE_REL, style); + lv_btn_set_style(btn, LV_BTN_STYLE_PR, style); +} + +// Create an empty label +lv_obj_t* lv_label_create_empty(lv_obj_t *par) { + return lv_label_create(par, (lv_obj_t*)NULL); +} + +// Create a label with style and text +lv_obj_t* lv_label_create(lv_obj_t *par, const char *text) { + lv_obj_t *label = lv_label_create_empty(par); + if (text) lv_label_set_text(label, text); + return label; +} + +// Create a label with style, position, and text +lv_obj_t* lv_label_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, const char *text) { + lv_obj_t *label = lv_label_create(par, text); + lv_obj_set_pos(label, x, y); + return label; +} + +// Create a button with callback, ID, and Style. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id, lv_style_t *style) { + lv_obj_t *btn = lv_btn_create(par, NULL); + if (id) + lv_obj_set_event_cb_mks(btn, cb, id, NULL, 0); + else + lv_obj_set_event_cb(btn, cb); + lv_btn_set_style_both(btn, style); + return btn; +} + +// Create a button with callback and ID. Style set to style_para_value. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id) { + return lv_btn_create(par, cb, id, &style_para_value); +} + +// Create a button with position, size, callback, and ID. Style set to style_para_value. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id) { + lv_obj_t *btn = lv_btn_create(par, cb, id); + lv_obj_set_pos(btn, x, y); + lv_obj_set_size(btn, w, h); + return btn; +} + +// Create a button with callback and ID. Style set to style_para_back. +lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_event_cb_t cb, const int id) { + return lv_btn_create(par, cb, id, &style_para_back); +} +// Create a button with position, size, callback, and ID. Style set to style_para_back. +lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id) { + lv_obj_t *btn = lv_btn_create_back(par, cb, id); + lv_obj_set_pos(btn, x, y); + lv_obj_set_size(btn, w, h); + return btn; +} + +// Create an image button with image, callback, and ID. Use label style. +lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, const int id) { + lv_obj_t *btn = lv_imgbtn_create(par, NULL); + if (img) lv_imgbtn_set_src_both(btn, img); + if (id) + lv_obj_set_event_cb_mks(btn, cb, id, NULL, 0); + else + lv_obj_set_event_cb(btn, cb); + lv_imgbtn_use_label_style(btn); + lv_btn_set_layout(btn, LV_LAYOUT_OFF); + return btn; +} + +// Create an image button with image, position, callback, and ID. Use label style. +lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id) { + lv_obj_t *btn = lv_imgbtn_create(par, img, cb, id); + lv_obj_set_pos(btn, x, y); + return btn; +} + #if ENABLED(SDSUPPORT) void sd_detection() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 00faedac4e..5ad0bd87b5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -164,6 +164,48 @@ #endif // ifdef TFT35 +// Set the same image for both Released and Pressed +void lv_imgbtn_set_src_both(lv_obj_t *imgbtn, const void *src); + +// Set label styles for Released and Pressed +void lv_imgbtn_use_label_style(lv_obj_t *imgbtn); + +// Set label styles for Released and Pressed +void lv_btn_use_label_style(lv_obj_t *btn); + +// Set the same style for both Released and Pressed +void lv_btn_set_style_both(lv_obj_t *btn, lv_style_t *style); + +// Create an empty label +lv_obj_t* lv_label_create_empty(lv_obj_t *par); + +// Create a label with style and text +lv_obj_t* lv_label_create(lv_obj_t *par, const char *text); + +// Create a label with style, position, and text +lv_obj_t* lv_label_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, const char *text); + +// Create a button with callback, ID, and Style. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id, lv_style_t *style); + +// Create a button with callback and ID. Style set to style_para_value. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id); + +// Create a button with position, size, callback, and ID. Style set to style_para_value. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id); + +// Create a button with callback and ID. Style set to style_para_back. +lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_event_cb_t cb, const int id); + +// Create a button with position, size, callback, and ID. Style set to style_para_back. +lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id); + +// Create an image button with image, callback, and ID. Use label style. +lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, const int id); + +// Create an image button with image, position, callback, and ID. Use label style. +lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id); + #ifdef __cplusplus extern "C" { /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index ce158ef7fb..78cf35fd07 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -70,9 +70,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } void lv_draw_wifi(void) { - lv_obj_t *buttonBack=NULL,*label_Back=NULL; - lv_obj_t *buttonCloud=NULL,*label_Cloud=NULL; - lv_obj_t *buttonReconnect=NULL,*label_Reconnect=NULL; + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *buttonCloud = NULL, *label_Cloud = NULL; + lv_obj_t *buttonReconnect = NULL, *label_Reconnect=NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_UI; @@ -85,78 +85,63 @@ void lv_draw_wifi(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonBack = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + if (gCfgItems.wifi_mode_sel == STA_MODEL) { //buttonCloud = lv_imgbtn_create(scr, NULL); buttonReconnect = lv_imgbtn_create(scr, NULL); } - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_W_RETURN, NULL,0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - if (gCfgItems.wifi_mode_sel == STA_MODEL) { - lv_obj_set_event_cb_mks(buttonReconnect, event_handler,ID_W_RECONNECT, NULL,0); - lv_imgbtn_set_src(buttonReconnect, LV_BTN_STATE_REL, "F:/bmp_wifi.bin"); - lv_imgbtn_set_src(buttonReconnect, LV_BTN_STATE_PR, "F:/bmp_wifi.bin"); - lv_imgbtn_set_style(buttonReconnect, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonReconnect, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_event_cb_mks(buttonReconnect, event_handler,ID_W_RECONNECT, NULL, 0); + lv_imgbtn_set_src_both(buttonReconnect, "F:/bmp_wifi.bin"); + lv_imgbtn_use_label_style(buttonReconnect); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonReconnect); #endif - lv_obj_set_pos(buttonReconnect,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_obj_set_pos(buttonReconnect, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_btn_set_layout(buttonReconnect, LV_LAYOUT_OFF); } - label_Back = lv_label_create(buttonBack, NULL); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.wifi_mode_sel == STA_MODEL) { - //label_Cloud = lv_label_create(buttonCloud, NULL); - label_Reconnect = lv_label_create(buttonReconnect, NULL); + //label_Cloud = lv_label_create_empty(buttonCloud); + label_Reconnect = lv_label_create_empty(buttonReconnect); } if (gCfgItems.multiple_language) { lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); if (gCfgItems.wifi_mode_sel == STA_MODEL) { //lv_label_set_text(label_Cloud, common_menu.text_back); - //lv_obj_align(label_Cloud, buttonCloud, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + //lv_obj_align(label_Cloud, buttonCloud, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(label_Reconnect, wifi_menu.reconnect); - lv_obj_align(label_Reconnect, buttonReconnect, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + lv_obj_align(label_Reconnect, buttonReconnect, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } - wifi_ip_text = lv_label_create(scr, NULL); + wifi_ip_text = lv_label_create_empty(scr); lv_obj_set_style(wifi_ip_text, &tft_style_label_rel); - - wifi_name_text = lv_label_create(scr, NULL); + wifi_name_text = lv_label_create_empty(scr); lv_obj_set_style(wifi_name_text, &tft_style_label_rel); - - wifi_key_text = lv_label_create(scr, NULL); + wifi_key_text = lv_label_create_empty(scr); lv_obj_set_style(wifi_key_text, &tft_style_label_rel); - - wifi_state_text = lv_label_create(scr, NULL); + wifi_state_text = lv_label_create_empty(scr); lv_obj_set_style(wifi_state_text, &tft_style_label_rel); disp_wifi_state(); @@ -167,20 +152,20 @@ void disp_wifi_state() { strcpy(public_buf_m,wifi_menu.ip); strcat(public_buf_m,ipPara.ip_addr); lv_label_set_text(wifi_ip_text, public_buf_m); - lv_obj_align(wifi_ip_text, NULL, LV_ALIGN_CENTER,0, -100); + lv_obj_align(wifi_ip_text, NULL, LV_ALIGN_CENTER, 0, -100); memset(public_buf_m, 0, sizeof(public_buf_m)); strcpy(public_buf_m,wifi_menu.wifi); strcat(public_buf_m,wifiPara.ap_name); lv_label_set_text(wifi_name_text, public_buf_m); - lv_obj_align(wifi_name_text, NULL, LV_ALIGN_CENTER,0, -70); + lv_obj_align(wifi_name_text, NULL, LV_ALIGN_CENTER, 0, -70); if (wifiPara.mode == AP_MODEL) { memset(public_buf_m, 0, sizeof(public_buf_m)); strcpy(public_buf_m,wifi_menu.key); strcat(public_buf_m,wifiPara.keyCode); lv_label_set_text(wifi_key_text, public_buf_m); - lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER,0, -40); + lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER, 0, -40); memset(public_buf_m, 0, sizeof(public_buf_m)); strcpy(public_buf_m,wifi_menu.state_ap); @@ -191,7 +176,7 @@ void disp_wifi_state() { else strcat(public_buf_m,wifi_menu.exception); lv_label_set_text(wifi_state_text, public_buf_m); - lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER,0, -10); + lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER, 0, -10); } else { ZERO(public_buf_m); @@ -203,10 +188,10 @@ void disp_wifi_state() { else strcat(public_buf_m, wifi_menu.exception); lv_label_set_text(wifi_state_text, public_buf_m); - lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER,0, -40); + lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER, 0, -40); lv_label_set_text(wifi_key_text, ""); - lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER,0, -10); + lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER, 0, -10); } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp index 2680194868..b52dbc5e59 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -42,8 +42,8 @@ list_menu_def list_menu; extern lv_group_t * g; static lv_obj_t * scr; static lv_obj_t *buttonWifiN[NUMBER_OF_PAGE]; -static lv_obj_t *lableWifiText[NUMBER_OF_PAGE]; -static lv_obj_t *lablePageText; +static lv_obj_t *labelWifiText[NUMBER_OF_PAGE]; +static lv_obj_t *labelPageText; #define ID_WL_RETURN 11 #define ID_WL_DOWN 12 @@ -116,43 +116,21 @@ void lv_draw_wifi_list(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - buttonDown = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonDown, event_handler,ID_WL_DOWN,NULL,0); - lv_imgbtn_set_src(buttonDown, LV_BTN_STATE_REL, "F:/bmp_pageDown.bin"); - lv_imgbtn_set_src(buttonDown, LV_BTN_STATE_PR, "F:/bmp_pageDown.bin"); - lv_imgbtn_set_style(buttonDown, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDown, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_WL_RETURN,NULL,0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonDown,OTHER_BTN_XPIEL*3+INTERVAL_V*4,titleHeight+OTHER_BTN_YPIEL+INTERVAL_H); - lv_obj_set_pos(buttonBack,OTHER_BTN_XPIEL*3+INTERVAL_V*4,titleHeight+OTHER_BTN_YPIEL*2+INTERVAL_H*2); - - lv_btn_set_layout(buttonDown, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + buttonDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H, event_handler, ID_WL_DOWN); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + (OTHER_BTN_YPIEL + INTERVAL_H) * 2, event_handler, ID_WL_RETURN); for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { buttonWifiN[i] = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonWifiN[i], 0,NAME_BTN_Y*i+10+titleHeight); /*Set its position*/ - lv_obj_set_size(buttonWifiN[i], NAME_BTN_X,NAME_BTN_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonWifiN[i], event_handler,(i+1),NULL,0); - lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_obj_set_pos(buttonWifiN[i], 0, NAME_BTN_Y*i+10+titleHeight); /*Set its position*/ + lv_obj_set_size(buttonWifiN[i], NAME_BTN_X, NAME_BTN_Y); /*Set its size*/ + lv_obj_set_event_cb_mks(buttonWifiN[i], event_handler, (i+1), NULL, 0); + lv_btn_use_label_style(buttonWifiN[i]); lv_btn_set_layout(buttonWifiN[i], LV_LAYOUT_OFF); - lableWifiText[i] = lv_label_create(buttonWifiN[i], NULL); + labelWifiText[i] = lv_label_create_empty(buttonWifiN[i]); #if HAS_ROTARY_ENCODER uint8_t j = 0; if (gCfgItems.encoder_enable) { @@ -162,8 +140,8 @@ void lv_draw_wifi_list(void) { #endif } - lablePageText = lv_label_create(scr, NULL); - lv_obj_set_style(lablePageText, &tft_style_label_rel); + labelPageText = lv_label_create_empty(scr); + lv_obj_set_style(labelPageText, &tft_style_label_rel); wifi_list.nameIndex = 0; wifi_list.currentWifipage = 1; @@ -187,27 +165,23 @@ void disp_wifi_list(void) { uint8_t i, j; sprintf((char *)tmpStr, list_menu.file_pages, wifi_list.currentWifipage, wifi_list.getPage); - lv_label_set_text(lablePageText, (const char *)tmpStr); - lv_obj_align(lablePageText, NULL, LV_ALIGN_CENTER, 50, -100); + lv_label_set_text(labelPageText, (const char *)tmpStr); + lv_obj_align(labelPageText, NULL, LV_ALIGN_CENTER, 50, -100); for (i = 0; i < NUMBER_OF_PAGE; i++) { memset(tmpStr, 0, sizeof(tmpStr)); j = wifi_list.nameIndex + i; if (j >= wifi_list.getNameNum) { - lv_label_set_text(lableWifiText[i], (const char *)tmpStr); - lv_obj_align(lableWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); + lv_label_set_text(labelWifiText[i], (const char *)tmpStr); + lv_obj_align(labelWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); } else { - lv_label_set_text(lableWifiText[i], (char const *)wifi_list.wifiName[j]); - lv_obj_align(lableWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); + lv_label_set_text(labelWifiText[i], (char const *)wifi_list.wifiName[j]); + lv_obj_align(labelWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); - if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[j]) == 0) { - lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &style_sel_text); - } - else { - lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &tft_style_label_rel); - } + const bool btext = (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[j]) == 0); + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, btext ? &style_sel_text : &tft_style_label_rel); } } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp index 81a5f5c3be..0902135835 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp @@ -59,13 +59,13 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { if (gCfgItems.wifi_mode_sel == AP_MODEL) { gCfgItems.wifi_mode_sel = STA_MODEL; lv_label_set_text(labelModelValue, WIFI_STA_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); update_spi_flash(); } else { gCfgItems.wifi_mode_sel = AP_MODEL; lv_label_set_text(labelModelValue, WIFI_AP_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); update_spi_flash(); } } @@ -85,7 +85,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - keyboard_value=wifiPassWord; + keyboard_value = wifiPassWord; lv_clear_wifi_settings(); lv_draw_keyboard(); } @@ -95,19 +95,18 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.cloud_enable) { - gCfgItems.cloud_enable = false; - lv_obj_set_event_cb_mks(obj, event_handler,ID_WIFI_CLOUD,"bmp_disable.bin",0); - lv_label_set_text(labelCloudValue, machine_menu.disable); + if (gCfgItems.cloud_enable) { + gCfgItems.cloud_enable = false; + lv_obj_set_event_cb_mks(obj, event_handler, ID_WIFI_CLOUD, "bmp_disable.bin", 0); + lv_label_set_text(labelCloudValue, machine_menu.disable); + } + else { + gCfgItems.cloud_enable = true; + lv_obj_set_event_cb_mks(obj, event_handler, ID_WIFI_CLOUD, "bmp_enable.bin", 0); + lv_label_set_text(labelCloudValue, machine_menu.enable); + } update_spi_flash(); } - else { - gCfgItems.cloud_enable = true; - lv_obj_set_event_cb_mks(obj, event_handler,ID_WIFI_CLOUD,"bmp_enable.bin",0); - lv_label_set_text(labelCloudValue, machine_menu.enable); - update_spi_flash(); - } - } break; case ID_WIFI_CONFIG: if (event == LV_EVENT_CLICKED) { @@ -140,113 +139,61 @@ void lv_draw_wifi_settings(void) { lv_scr_load(scr); lv_obj_clean(scr); - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - lv_label_set_text(title, machine_menu.WifiConfTitle); + (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.WifiConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - labelModelText = lv_label_create(scr, NULL); - lv_obj_set_style(labelModelText, &tft_style_label_rel); - lv_obj_set_pos(labelModelText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelModelText, machine_menu.wifiMode); + labelModelText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.wifiMode); buttonModelValue = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonModelValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y+PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonModelValue, event_handler,ID_WIFI_MODEL, NULL,0); - lv_imgbtn_set_src(buttonModelValue, LV_BTN_STATE_REL, "F:/bmp_blank_sel.bin"); - lv_imgbtn_set_src(buttonModelValue, LV_BTN_STATE_PR, "F:/bmp_blank_sel.bin"); - lv_imgbtn_set_style(buttonModelValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonModelValue, LV_BTN_STATE_REL, &style_para_value_pre); + lv_imgbtn_set_src_both(buttonModelValue, "F:/bmp_blank_sel.bin"); + lv_obj_set_pos(buttonModelValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonModelValue, event_handler, ID_WIFI_MODEL, NULL, 0); + lv_btn_set_style_both(buttonModelValue, &style_para_value_pre); lv_btn_set_layout(buttonModelValue, LV_LAYOUT_OFF); - labelModelValue = lv_label_create(buttonModelValue, NULL); + labelModelValue = lv_label_create_empty(buttonModelValue); line1 = lv_line_create(scr, NULL); lv_ex_line(line1,line_points[0]); - labelNameText = lv_label_create(scr, NULL); - lv_obj_set_style(labelNameText, &tft_style_label_rel); - lv_obj_set_pos(labelNameText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + labelNameText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, NULL); - buttonNameValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonNameValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y*2+PARA_UI_VALUE_V); - lv_obj_set_size(buttonNameValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonNameValue, event_handler,ID_WIFI_NAME, NULL,0); - lv_btn_set_style(buttonNameValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonNameValue, LV_BTN_STYLE_PR, &style_para_value); - labelNameValue = lv_label_create(buttonNameValue, NULL); + buttonNameValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_WIFI_NAME); + labelNameValue = lv_label_create_empty(buttonNameValue); line2 = lv_line_create(scr, NULL); lv_ex_line(line2,line_points[1]); - labelPassWordText = lv_label_create(scr, NULL); - lv_obj_set_style(labelPassWordText, &tft_style_label_rel); - lv_obj_set_pos(labelPassWordText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + labelPassWordText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, NULL); - buttonPassWordValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonPassWordValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y*3+PARA_UI_VALUE_V); - lv_obj_set_size(buttonPassWordValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonPassWordValue, event_handler,ID_WIFI_PASSWORD, NULL,0); - lv_btn_set_style(buttonPassWordValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonPassWordValue, LV_BTN_STYLE_PR, &style_para_value); - labelPassWordValue = lv_label_create(buttonPassWordValue, NULL); + buttonPassWordValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_WIFI_PASSWORD); + labelPassWordValue = lv_label_create_empty(buttonPassWordValue); line3 = lv_line_create(scr, NULL); lv_ex_line(line3,line_points[2]); - labelCloudText = lv_label_create(scr, NULL); - lv_obj_set_style(labelCloudText, &tft_style_label_rel); - lv_obj_set_pos(labelCloudText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelCloudText, machine_menu.wifiCloud); + labelCloudText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.wifiCloud); - buttonCloudValue = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonCloudValue,PARA_UI_STATE_POS_X,PARA_UI_POS_Y*4+PARA_UI_STATE_V); - if (gCfgItems.cloud_enable) { - lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - lv_obj_set_event_cb_mks(buttonCloudValue, event_handler,ID_WIFI_CLOUD, NULL,0); - lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonCloudValue, LV_LAYOUT_OFF); - labelCloudValue = lv_label_create(buttonCloudValue, NULL); + buttonCloudValue = lv_imgbtn_create(scr, gCfgItems.cloud_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V, event_handler, ID_WIFI_CLOUD); + labelCloudValue = lv_label_create_empty(buttonCloudValue); line4 = lv_line_create(scr, NULL); lv_ex_line(line4,line_points[3]); - buttonConfig = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonConfig, event_handler,ID_WIFI_CONFIG, NULL,0); - lv_imgbtn_set_src(buttonConfig, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonConfig, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonConfig, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonConfig, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonConfig, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_btn_set_layout(buttonConfig, LV_LAYOUT_OFF); - labelConfig = lv_label_create(buttonConfig, NULL); + buttonConfig = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_WIFI_CONFIG); + labelConfig = lv_label_create_empty(buttonConfig); - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_WIFI_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); + buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_WIFI_RETURN); + label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { if (gCfgItems.wifi_mode_sel == AP_MODEL) { lv_label_set_text(labelModelValue, WIFI_AP_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); } else { lv_label_set_text(labelModelValue, WIFI_STA_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); } memset(public_buf_m,0,sizeof(public_buf_m)); strcat(public_buf_m,machine_menu.wifiName); @@ -254,7 +201,7 @@ void lv_draw_wifi_settings(void) { lv_label_set_text(labelNameText,public_buf_m); lv_label_set_text(labelNameValue,machine_menu.wifiEdit); - lv_obj_align(labelNameValue, buttonNameValue, LV_ALIGN_CENTER,0, 0); + lv_obj_align(labelNameValue, buttonNameValue, LV_ALIGN_CENTER, 0, 0); memset(public_buf_m,0,sizeof(public_buf_m)); strcat(public_buf_m,machine_menu.wifiPassWord); @@ -262,16 +209,16 @@ void lv_draw_wifi_settings(void) { lv_label_set_text(labelPassWordText,public_buf_m); lv_label_set_text(labelPassWordValue,machine_menu.wifiEdit); - lv_obj_align(labelPassWordValue, buttonPassWordValue, LV_ALIGN_CENTER,0, 0); + lv_obj_align(labelPassWordValue, buttonPassWordValue, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(labelCloudValue, gCfgItems.cloud_enable ? machine_menu.enable : machine_menu.disable); - lv_obj_align(labelCloudValue, buttonCloudValue, LV_ALIGN_CENTER,0, 0); + lv_obj_align(labelCloudValue, buttonCloudValue, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(labelConfig,machine_menu.wifiConfig); - lv_obj_align(labelConfig, buttonConfig, LV_ALIGN_CENTER,0, 0); + lv_obj_align(labelConfig, buttonConfig, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER,0, 0); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); } #if HAS_ROTARY_ENCODER diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp index 059656bbb5..86ac5dffac 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp @@ -52,28 +52,23 @@ void lv_draw_wifi_tips(void) { lv_obj_clean(scr); lv_refr_now(lv_refr_get_disp_refreshing()); - text_tips = lv_label_create(scr, NULL); - lv_obj_set_style(text_tips, &tft_style_label_rel); - - wifi_name = lv_label_create(scr, NULL); - lv_obj_set_style(wifi_name, &tft_style_label_rel); + wifi_name = lv_label_create(scr, (const char *)wifi_list.wifiName[wifi_list.nameIndex]); + lv_obj_align(wifi_name, NULL, LV_ALIGN_CENTER, 0, -20); + text_tips = lv_label_create_empty(scr); if (wifi_tips_type == TIPS_TYPE_JOINING) { lv_label_set_text(text_tips, tips_menu.joining); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER, 0, -60); } else if (wifi_tips_type == TIPS_TYPE_TAILED_JOIN) { lv_label_set_text(text_tips, tips_menu.failedJoin); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER, 0, -60); } else if (wifi_tips_type == TIPS_TYPE_WIFI_CONECTED) { lv_label_set_text(text_tips, tips_menu.wifiConected); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER, 0, -60); } - lv_label_set_text(wifi_name, (const char *)wifi_list.wifiName[wifi_list.nameIndex]); - lv_obj_align(wifi_name, NULL, LV_ALIGN_CENTER,0, -20); - tips_disp.timer = TIPS_TIMER_START; tips_disp.timer_count = 0; } From 6601ca7a22f1f34365d5811be1d6649b3805e265 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Fri, 23 Oct 2020 03:46:48 +0200 Subject: [PATCH 0445/1370] Fix Chopper Timing extra axis defaults (#19850) --- Marlin/src/module/stepper/trinamic.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h index 7ae2a276db..9f7445e4fd 100644 --- a/Marlin/src/module/stepper/trinamic.h +++ b/Marlin/src/module/stepper/trinamic.h @@ -144,7 +144,7 @@ void reset_trinamic_drivers(); #if HAS_X2_ENABLE && AXIS_IS_TMC(X2) extern TMC_CLASS(X2, X) stepperX2; #ifndef CHOPPER_TIMING_X2 - #define CHOPPER_TIMING_X2 CHOPPER_TIMING_E + #define CHOPPER_TIMING_X2 CHOPPER_TIMING_X #endif static constexpr chopper_timing_t chopper_timing_X2 = CHOPPER_TIMING_X2; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -161,7 +161,7 @@ void reset_trinamic_drivers(); #if HAS_Y2_ENABLE && AXIS_IS_TMC(Y2) extern TMC_CLASS(Y2, Y) stepperY2; #ifndef CHOPPER_TIMING_Y2 - #define CHOPPER_TIMING_Y2 CHOPPER_TIMING_E + #define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y #endif static constexpr chopper_timing_t chopper_timing_Y2 = CHOPPER_TIMING_Y2; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -178,7 +178,7 @@ void reset_trinamic_drivers(); #if HAS_Z2_ENABLE && AXIS_IS_TMC(Z2) extern TMC_CLASS(Z2, Z) stepperZ2; #ifndef CHOPPER_TIMING_Z2 - #define CHOPPER_TIMING_Z2 CHOPPER_TIMING_E + #define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z #endif static constexpr chopper_timing_t chopper_timing_Z2 = CHOPPER_TIMING_Z2; #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2) @@ -195,7 +195,7 @@ void reset_trinamic_drivers(); #if HAS_Z3_ENABLE && AXIS_IS_TMC(Z3) extern TMC_CLASS(Z3, Z) stepperZ3; #ifndef CHOPPER_TIMING_Z3 - #define CHOPPER_TIMING_Z3 CHOPPER_TIMING_E + #define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z #endif static constexpr chopper_timing_t chopper_timing_Z3 = CHOPPER_TIMING_Z3; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -212,7 +212,7 @@ void reset_trinamic_drivers(); #if HAS_Z4_ENABLE && AXIS_IS_TMC(Z4) extern TMC_CLASS(Z4, Z) stepperZ4; #ifndef CHOPPER_TIMING_Z4 - #define CHOPPER_TIMING_Z4 CHOPPER_TIMING_E + #define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z #endif static constexpr chopper_timing_t chopper_timing_Z4 = CHOPPER_TIMING_Z4; #if ENABLED(SOFTWARE_DRIVER_ENABLE) From b1b2ecba6cca8275f7c813582e7da6d67a02a7ba Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 22 Oct 2020 20:54:11 -0500 Subject: [PATCH 0446/1370] Shorten a method name --- Marlin/src/feature/tmc_util.h | 12 ++-- Marlin/src/gcode/feature/trinamic/M569.cpp | 2 +- .../mks_ui/draw_tmc_step_mode_settings.cpp | 10 +-- Marlin/src/module/settings.cpp | 64 +++++++++---------- 4 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 187cfda483..abde342307 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -104,8 +104,8 @@ class TMCMarlin : public TMC, public TMCStorage { #if HAS_STEALTHCHOP inline void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); } - inline bool get_stealthChop_status() { return this->en_pwm_mode(); } - inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } + inline bool get_stealthChop() { return this->en_pwm_mode(); } + inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } #endif #if ENABLED(HYBRID_THRESHOLD) @@ -171,8 +171,8 @@ class TMCMarlin : public TMC220 #if HAS_STEALTHCHOP inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } - inline bool get_stealthChop_status() { return !this->en_spreadCycle(); } - inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } + inline bool get_stealthChop() { return !this->en_spreadCycle(); } + inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } #endif #if ENABLED(HYBRID_THRESHOLD) @@ -217,8 +217,8 @@ class TMCMarlin : public TMC220 #if HAS_STEALTHCHOP inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } - inline bool get_stealthChop_status() { return !this->en_spreadCycle(); } - inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } + inline bool get_stealthChop() { return !this->en_spreadCycle(); } + inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } #endif #if ENABLED(HYBRID_THRESHOLD) diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp index e72d03e767..6b379f1190 100644 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -32,7 +32,7 @@ template void tmc_say_stealth_status(TMC &st) { st.printLabel(); SERIAL_ECHOPGM(" driver mode:\t"); - serialprintPGM(st.get_stealthChop_status() ? PSTR("stealthChop") : PSTR("spreadCycle")); + serialprintPGM(st.get_stealthChop() ? PSTR("stealthChop") : PSTR("spreadCycle")); SERIAL_EOL(); } template diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 8be03297f5..2140af0793 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -232,19 +232,19 @@ void lv_draw_tmc_step_mode_settings(void) { bool stealth_X = false, stealth_Y = false, stealth_Z = false, stealth_E0 = false, stealth_E1 = false; #if AXIS_HAS_STEALTHCHOP(X) - stealth_X = stepperX.get_stealthChop_status(); + stealth_X = stepperX.get_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(Y) - stealth_Y = stepperY.get_stealthChop_status(); + stealth_Y = stepperY.get_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(Z) - stealth_Z = stepperZ.get_stealthChop_status(); + stealth_Z = stepperZ.get_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(E0) - stealth_E0 = stepperE0.get_stealthChop_status(); + stealth_E0 = stepperE0.get_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(E1) - stealth_E1 = stepperE1.get_stealthChop_status(); + stealth_E1 = stepperE1.get_stealthChop(); #endif if (uiCfg.para_ui_page != 1) { diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 9ed78efd63..972d375848 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1214,60 +1214,60 @@ void MarlinSettings::postprocess() { #if HAS_STEALTHCHOP #if AXIS_HAS_STEALTHCHOP(X) - tmc_stealth_enabled.X = stepperX.get_stored_stealthChop_status(); + tmc_stealth_enabled.X = stepperX.get_stored_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(Y) - tmc_stealth_enabled.Y = stepperY.get_stored_stealthChop_status(); + tmc_stealth_enabled.Y = stepperY.get_stored_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(Z) - tmc_stealth_enabled.Z = stepperZ.get_stored_stealthChop_status(); + tmc_stealth_enabled.Z = stepperZ.get_stored_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(X2) - tmc_stealth_enabled.X2 = stepperX2.get_stored_stealthChop_status(); + tmc_stealth_enabled.X2 = stepperX2.get_stored_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(Y2) - tmc_stealth_enabled.Y2 = stepperY2.get_stored_stealthChop_status(); + tmc_stealth_enabled.Y2 = stepperY2.get_stored_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(Z2) - tmc_stealth_enabled.Z2 = stepperZ2.get_stored_stealthChop_status(); + tmc_stealth_enabled.Z2 = stepperZ2.get_stored_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(Z3) - tmc_stealth_enabled.Z3 = stepperZ3.get_stored_stealthChop_status(); + tmc_stealth_enabled.Z3 = stepperZ3.get_stored_stealthChop(); #endif #if AXIS_HAS_STEALTHCHOP(Z4) - tmc_stealth_enabled.Z4 = stepperZ4.get_stored_stealthChop_status(); + tmc_stealth_enabled.Z4 = stepperZ4.get_stored_stealthChop(); #endif #if MAX_EXTRUDERS #if AXIS_HAS_STEALTHCHOP(E0) - tmc_stealth_enabled.E0 = stepperE0.get_stored_stealthChop_status(); + tmc_stealth_enabled.E0 = stepperE0.get_stored_stealthChop(); #endif #if MAX_EXTRUDERS > 1 #if AXIS_HAS_STEALTHCHOP(E1) - tmc_stealth_enabled.E1 = stepperE1.get_stored_stealthChop_status(); + tmc_stealth_enabled.E1 = stepperE1.get_stored_stealthChop(); #endif #if MAX_EXTRUDERS > 2 #if AXIS_HAS_STEALTHCHOP(E2) - tmc_stealth_enabled.E2 = stepperE2.get_stored_stealthChop_status(); + tmc_stealth_enabled.E2 = stepperE2.get_stored_stealthChop(); #endif #if MAX_EXTRUDERS > 3 #if AXIS_HAS_STEALTHCHOP(E3) - tmc_stealth_enabled.E3 = stepperE3.get_stored_stealthChop_status(); + tmc_stealth_enabled.E3 = stepperE3.get_stored_stealthChop(); #endif #if MAX_EXTRUDERS > 4 #if AXIS_HAS_STEALTHCHOP(E4) - tmc_stealth_enabled.E4 = stepperE4.get_stored_stealthChop_status(); + tmc_stealth_enabled.E4 = stepperE4.get_stored_stealthChop(); #endif #if MAX_EXTRUDERS > 5 #if AXIS_HAS_STEALTHCHOP(E5) - tmc_stealth_enabled.E5 = stepperE5.get_stored_stealthChop_status(); + tmc_stealth_enabled.E5 = stepperE5.get_stored_stealthChop(); #endif #if MAX_EXTRUDERS > 6 #if AXIS_HAS_STEALTHCHOP(E6) - tmc_stealth_enabled.E6 = stepperE6.get_stored_stealthChop_status(); + tmc_stealth_enabled.E6 = stepperE6.get_stored_stealthChop(); #endif #if MAX_EXTRUDERS > 7 #if AXIS_HAS_STEALTHCHOP(E7) - tmc_stealth_enabled.E7 = stepperE7.get_stored_stealthChop_status(); + tmc_stealth_enabled.E7 = stepperE7.get_stored_stealthChop(); #endif #endif // MAX_EXTRUDERS > 7 #endif // MAX_EXTRUDERS > 6 @@ -3671,17 +3671,17 @@ void MarlinSettings::reset() { #if HAS_STEALTHCHOP CONFIG_ECHO_HEADING("Driver stepping mode:"); #if AXIS_HAS_STEALTHCHOP(X) - const bool chop_x = stepperX.get_stored_stealthChop_status(); + const bool chop_x = stepperX.get_stored_stealthChop(); #else constexpr bool chop_x = false; #endif #if AXIS_HAS_STEALTHCHOP(Y) - const bool chop_y = stepperY.get_stored_stealthChop_status(); + const bool chop_y = stepperY.get_stored_stealthChop(); #else constexpr bool chop_y = false; #endif #if AXIS_HAS_STEALTHCHOP(Z) - const bool chop_z = stepperZ.get_stored_stealthChop_status(); + const bool chop_z = stepperZ.get_stored_stealthChop(); #else constexpr bool chop_z = false; #endif @@ -3695,17 +3695,17 @@ void MarlinSettings::reset() { } #if AXIS_HAS_STEALTHCHOP(X2) - const bool chop_x2 = stepperX2.get_stored_stealthChop_status(); + const bool chop_x2 = stepperX2.get_stored_stealthChop(); #else constexpr bool chop_x2 = false; #endif #if AXIS_HAS_STEALTHCHOP(Y2) - const bool chop_y2 = stepperY2.get_stored_stealthChop_status(); + const bool chop_y2 = stepperY2.get_stored_stealthChop(); #else constexpr bool chop_y2 = false; #endif #if AXIS_HAS_STEALTHCHOP(Z2) - const bool chop_z2 = stepperZ2.get_stored_stealthChop_status(); + const bool chop_z2 = stepperZ2.get_stored_stealthChop(); #else constexpr bool chop_z2 = false; #endif @@ -3719,36 +3719,36 @@ void MarlinSettings::reset() { } #if AXIS_HAS_STEALTHCHOP(Z3) - if (stepperZ3.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("I2 Z"), true); } + if (stepperZ3.get_stored_stealthChop()) { say_M569(forReplay, PSTR("I2 Z"), true); } #endif #if AXIS_HAS_STEALTHCHOP(Z4) - if (stepperZ4.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("I3 Z"), true); } + if (stepperZ4.get_stored_stealthChop()) { say_M569(forReplay, PSTR("I3 Z"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E0) - if (stepperE0.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T0 E"), true); } + if (stepperE0.get_stored_stealthChop()) { say_M569(forReplay, PSTR("T0 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E1) - if (stepperE1.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T1 E"), true); } + if (stepperE1.get_stored_stealthChop()) { say_M569(forReplay, PSTR("T1 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E2) - if (stepperE2.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T2 E"), true); } + if (stepperE2.get_stored_stealthChop()) { say_M569(forReplay, PSTR("T2 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E3) - if (stepperE3.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T3 E"), true); } + if (stepperE3.get_stored_stealthChop()) { say_M569(forReplay, PSTR("T3 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E4) - if (stepperE4.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T4 E"), true); } + if (stepperE4.get_stored_stealthChop()) { say_M569(forReplay, PSTR("T4 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E5) - if (stepperE5.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T5 E"), true); } + if (stepperE5.get_stored_stealthChop()) { say_M569(forReplay, PSTR("T5 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E6) - if (stepperE6.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T6 E"), true); } + if (stepperE6.get_stored_stealthChop()) { say_M569(forReplay, PSTR("T6 E"), true); } #endif #if AXIS_HAS_STEALTHCHOP(E7) - if (stepperE7.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T7 E"), true); } + if (stepperE7.get_stored_stealthChop()) { say_M569(forReplay, PSTR("T7 E"), true); } #endif #endif // HAS_STEALTHCHOP From f9b04af650be066d981bc09f3511552760d65c67 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 22 Oct 2020 22:31:48 -0500 Subject: [PATCH 0447/1370] Case light brightness cleanup (#19856) Co-authored-by: Chris --- Marlin/src/feature/caselight.cpp | 37 ++++++++++++--------- Marlin/src/feature/caselight.h | 8 ++++- Marlin/src/gcode/feature/caselight/M355.cpp | 19 +++++++---- Marlin/src/gcode/host/M115.cpp | 6 +++- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/lcd/menu/menu_led.cpp | 2 +- Marlin/src/module/settings.cpp | 15 ++++----- 7 files changed, 56 insertions(+), 33 deletions(-) diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index 8a128bb12d..0eba102a04 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -28,7 +28,14 @@ CaseLight caselight; -uint8_t CaseLight::brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; +#if CASELIGHT_USES_BRIGHTNESS && !defined(CASE_LIGHT_DEFAULT_BRIGHTNESS) + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 0 // For use on PWM pin as non-PWM just sets a default +#endif + +#if CASELIGHT_USES_BRIGHTNESS + uint8_t CaseLight::brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; +#endif + bool CaseLight::on = CASE_LIGHT_DEFAULT_ON; #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) @@ -46,21 +53,21 @@ bool CaseLight::on = CASE_LIGHT_DEFAULT_ON; #endif void CaseLight::update(const bool sflag) { - /** - * The brightness_sav (and sflag) is needed because ARM chips ignore - * a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that are directly - * controlled by the PWM module. In order to turn them off the brightness - * level needs to be set to OFF. Since we can't use the PWM register to - * save the last brightness level we need a variable to save it. - */ - static uint8_t brightness_sav; // Save brightness info for restore on "M355 S1" + #if CASELIGHT_USES_BRIGHTNESS + /** + * The brightness_sav (and sflag) is needed because ARM chips ignore + * a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that are directly + * controlled by the PWM module. In order to turn them off the brightness + * level needs to be set to OFF. Since we can't use the PWM register to + * save the last brightness level we need a variable to save it. + */ + static uint8_t brightness_sav; // Save brightness info for restore on "M355 S1" - if (on || !sflag) - brightness_sav = brightness; // Save brightness except for M355 S0 - if (sflag && on) - brightness = brightness_sav; // Restore last brightness for M355 S1 + if (on || !sflag) + brightness_sav = brightness; // Save brightness except for M355 S0 + if (sflag && on) + brightness = brightness_sav; // Restore last brightness for M355 S1 - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) || DISABLED(CASE_LIGHT_NO_BRIGHTNESS) const uint8_t i = on ? brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; #endif @@ -73,7 +80,7 @@ void CaseLight::update(const bool sflag) { #else // !CASE_LIGHT_USE_NEOPIXEL - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + #if CASELIGHT_USES_BRIGHTNESS if (PWM_PIN(CASE_LIGHT_PIN)) analogWrite(pin_t(CASE_LIGHT_PIN), ( #if CASE_LIGHT_MAX_PWM == 255 diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index 9d1e76da26..2198c85f2a 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -27,9 +27,15 @@ #include "leds/leds.h" #endif +#if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) || ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASELIGHT_USES_BRIGHTNESS 1 +#endif + class CaseLight { public: - static uint8_t brightness; + #if CASELIGHT_USES_BRIGHTNESS + static uint8_t brightness; + #endif static bool on; static void update(const bool sflag); diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index bb6b57f666..12ae5cff1d 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -41,10 +41,12 @@ */ void GcodeSuite::M355() { bool didset = false; - if (parser.seenval('P')) { - didset = true; - caselight.brightness = parser.value_byte(); - } + #if CASELIGHT_USES_BRIGHTNESS + if (parser.seenval('P')) { + didset = true; + caselight.brightness = parser.value_byte(); + } + #endif const bool sflag = parser.seenval('S'); if (sflag) { didset = true; @@ -58,8 +60,13 @@ void GcodeSuite::M355() { if (!caselight.on) SERIAL_ECHOLNPGM(STR_OFF); else { - if (!PWM_PIN(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM(STR_ON); - else SERIAL_ECHOLN(int(caselight.brightness)); + #if CASELIGHT_USES_BRIGHTNESS + if (PWM_PIN(CASE_LIGHT_PIN)) { + SERIAL_ECHOLN(int(caselight.brightness)); + return; + } + #endif + SERIAL_ECHOLNPGM(STR_ON); } } diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 53c5163bba..529b1dd6d0 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -27,6 +27,10 @@ #include "../../module/motion.h" #endif +#if ENABLED(CASE_LIGHT_ENABLE) + #include "../../feature/caselight.h" +#endif + #if ENABLED(EXTENDED_CAPABILITIES_REPORT) static void cap_line(PGM_P const name, bool ena=false) { SERIAL_ECHOPGM("Cap:"); @@ -102,7 +106,7 @@ void GcodeSuite::M115() { // TOGGLE_LIGHTS (M355) cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(CASE_LIGHT_ENABLE)); - cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, PWM_PIN(CASE_LIGHT_PIN))); + cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN))))); // EMERGENCY_PARSER (M108, M112, M410, M876) cap_line(PSTR("EMERGENCY_PARSER"), ENABLED(EMERGENCY_PARSER)); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 8151828a08..33b5d5458e 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -610,7 +610,7 @@ namespace ExtUI { caselight.update_enabled(); } - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + #if CASELIGHT_USES_BRIGHTNESS float getCaseLightBrightness_percent() { return ui8_to_percent(caselight.brightness); } void setCaseLightBrightness_percent(const float value) { caselight.brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 386a4d799a..d9540592d0 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -105,7 +105,7 @@ #if ENABLED(CASE_LIGHT_MENU) #include "../../feature/caselight.h" - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + #if CASELIGHT_USES_BRIGHTNESS void menu_case_light() { START_MENU(); BACK_ITEM(MSG_CONFIGURATION); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 972d375848..d01486a80d 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -137,9 +137,8 @@ void M710_report(const bool forReplay); #endif -#if ENABLED(CASE_LIGHT_ENABLE) && DISABLED(CASE_LIGHT_NO_BRIGHTNESS) +#if ENABLED(CASE_LIGHT_ENABLE) #include "../feature/caselight.h" - #define HAS_CASE_LIGHT_BRIGHTNESS 1 #endif #if ENABLED(PASSWORD_FEATURE) @@ -422,9 +421,9 @@ typedef struct SettingsDataStruct { #endif // - // HAS_CASE_LIGHT_BRIGHTNESS + // CASELIGHT_USES_BRIGHTNESS // - #if HAS_CASE_LIGHT_BRIGHTNESS + #if CASELIGHT_USES_BRIGHTNESS uint8_t caselight_brightness; // M355 P #endif @@ -503,7 +502,7 @@ void MarlinSettings::postprocess() { TERN_(HAS_LINEAR_E_JERK, planner.recalculate_max_e_jerk()); - TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.update_brightness()); + TERN_(CASELIGHT_USES_BRIGHTNESS, caselight.update_brightness()); // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm // and init stepper.count[], planner.position[] with current_position @@ -1385,7 +1384,7 @@ void MarlinSettings::postprocess() { // // Case Light Brightness // - #if HAS_CASE_LIGHT_BRIGHTNESS + #if CASELIGHT_USES_BRIGHTNESS EEPROM_WRITE(caselight.brightness); #endif @@ -2259,7 +2258,7 @@ void MarlinSettings::postprocess() { // // Case Light Brightness // - #if HAS_CASE_LIGHT_BRIGHTNESS + #if CASELIGHT_USES_BRIGHTNESS _FIELD_TEST(caselight_brightness); EEPROM_READ(caselight.brightness); #endif @@ -2597,7 +2596,7 @@ void MarlinSettings::reset() { // // Case Light Brightness // - TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); + TERN_(CASELIGHT_USES_BRIGHTNESS, caselight.brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); // // TOUCH_SCREEN_CALIBRATION From 2fed3982d6a0babd43efe5083a55439e06878c14 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Oct 2020 14:52:59 -0500 Subject: [PATCH 0448/1370] Pins post-process header (#19860) --- Marlin/src/HAL/ESP32/timers.h | 6 - Marlin/src/pins/pins.h | 853 +--------------------------- Marlin/src/pins/pins_postprocess.h | 877 +++++++++++++++++++++++++++++ 3 files changed, 881 insertions(+), 855 deletions(-) create mode 100644 Marlin/src/pins/pins_postprocess.h diff --git a/Marlin/src/HAL/ESP32/timers.h b/Marlin/src/HAL/ESP32/timers.h index d722670f33..7d35186b1c 100644 --- a/Marlin/src/HAL/ESP32/timers.h +++ b/Marlin/src/HAL/ESP32/timers.h @@ -24,15 +24,9 @@ #include #include -// Includes needed to get I2S_STEPPER_STREAM. Note that pins.h -// is included in case this header is being included early. -#include "../../inc/MarlinConfig.h" -#include "../../pins/pins.h" - // ------------------------ // Defines // ------------------------ -// #define FORCE_INLINE __attribute__((always_inline)) inline typedef uint64_t hal_timer_t; diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 3a380def74..9ea35371a4 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -21,9 +21,9 @@ */ #pragma once -#include "../core/boards.h" - /** + * File: pins/pins.h + * * Include pins definitions * * Pins numbering schemes: @@ -783,852 +783,7 @@ #endif -// Define certain undefined pins -#ifndef X_MS1_PIN - #define X_MS1_PIN -1 -#endif -#ifndef X_MS2_PIN - #define X_MS2_PIN -1 -#endif -#ifndef X_MS3_PIN - #define X_MS3_PIN -1 -#endif -#ifndef Y_MS1_PIN - #define Y_MS1_PIN -1 -#endif -#ifndef Y_MS2_PIN - #define Y_MS2_PIN -1 -#endif -#ifndef Y_MS3_PIN - #define Y_MS3_PIN -1 -#endif -#ifndef Z_MS1_PIN - #define Z_MS1_PIN -1 -#endif -#ifndef Z_MS2_PIN - #define Z_MS2_PIN -1 -#endif -#ifndef Z_MS3_PIN - #define Z_MS3_PIN -1 -#endif -#ifndef E0_MS1_PIN - #define E0_MS1_PIN -1 -#endif -#ifndef E0_MS2_PIN - #define E0_MS2_PIN -1 -#endif -#ifndef E0_MS3_PIN - #define E0_MS3_PIN -1 -#endif -#ifndef E1_MS1_PIN - #define E1_MS1_PIN -1 -#endif -#ifndef E1_MS2_PIN - #define E1_MS2_PIN -1 -#endif -#ifndef E1_MS3_PIN - #define E1_MS3_PIN -1 -#endif -#ifndef E2_MS1_PIN - #define E2_MS1_PIN -1 -#endif -#ifndef E2_MS2_PIN - #define E2_MS2_PIN -1 -#endif -#ifndef E2_MS3_PIN - #define E2_MS3_PIN -1 -#endif -#ifndef E3_MS1_PIN - #define E3_MS1_PIN -1 -#endif -#ifndef E3_MS2_PIN - #define E3_MS2_PIN -1 -#endif -#ifndef E3_MS3_PIN - #define E3_MS3_PIN -1 -#endif -#ifndef E4_MS1_PIN - #define E4_MS1_PIN -1 -#endif -#ifndef E4_MS2_PIN - #define E4_MS2_PIN -1 -#endif -#ifndef E4_MS3_PIN - #define E4_MS3_PIN -1 -#endif -#ifndef E5_MS1_PIN - #define E5_MS1_PIN -1 -#endif -#ifndef E5_MS2_PIN - #define E5_MS2_PIN -1 -#endif -#ifndef E5_MS3_PIN - #define E5_MS3_PIN -1 -#endif -#ifndef E6_MS1_PIN - #define E6_MS1_PIN -1 -#endif -#ifndef E6_MS2_PIN - #define E6_MS2_PIN -1 -#endif -#ifndef E6_MS3_PIN - #define E6_MS3_PIN -1 -#endif -#ifndef E7_MS1_PIN - #define E7_MS1_PIN -1 -#endif -#ifndef E7_MS2_PIN - #define E7_MS2_PIN -1 -#endif -#ifndef E7_MS3_PIN - #define E7_MS3_PIN -1 -#endif - -#ifndef E0_STEP_PIN - #define E0_STEP_PIN -1 -#endif -#ifndef E0_DIR_PIN - #define E0_DIR_PIN -1 -#endif -#ifndef E0_ENABLE_PIN - #define E0_ENABLE_PIN -1 -#endif -#ifndef E1_STEP_PIN - #define E1_STEP_PIN -1 -#endif -#ifndef E1_DIR_PIN - #define E1_DIR_PIN -1 -#endif -#ifndef E1_ENABLE_PIN - #define E1_ENABLE_PIN -1 -#endif -#ifndef E2_STEP_PIN - #define E2_STEP_PIN -1 -#endif -#ifndef E2_DIR_PIN - #define E2_DIR_PIN -1 -#endif -#ifndef E2_ENABLE_PIN - #define E2_ENABLE_PIN -1 -#endif -#ifndef E3_STEP_PIN - #define E3_STEP_PIN -1 -#endif -#ifndef E3_DIR_PIN - #define E3_DIR_PIN -1 -#endif -#ifndef E3_ENABLE_PIN - #define E3_ENABLE_PIN -1 -#endif -#ifndef E4_STEP_PIN - #define E4_STEP_PIN -1 -#endif -#ifndef E4_DIR_PIN - #define E4_DIR_PIN -1 -#endif -#ifndef E4_ENABLE_PIN - #define E4_ENABLE_PIN -1 -#endif -#ifndef E5_STEP_PIN - #define E5_STEP_PIN -1 -#endif -#ifndef E5_DIR_PIN - #define E5_DIR_PIN -1 -#endif -#ifndef E5_ENABLE_PIN - #define E5_ENABLE_PIN -1 -#endif -#ifndef E6_STEP_PIN - #define E6_STEP_PIN -1 -#endif -#ifndef E6_DIR_PIN - #define E6_DIR_PIN -1 -#endif -#ifndef E6_ENABLE_PIN - #define E6_ENABLE_PIN -1 -#endif -#ifndef E7_STEP_PIN - #define E7_STEP_PIN -1 -#endif -#ifndef E7_DIR_PIN - #define E7_DIR_PIN -1 -#endif -#ifndef E7_ENABLE_PIN - #define E7_ENABLE_PIN -1 -#endif - // -// Destroy unused CS pins +// Post-process pins according to configured settings // -#if !AXIS_HAS_SPI(X) - #undef X_CS_PIN -#endif -#if !AXIS_HAS_SPI(Y) - #undef Y_CS_PIN -#endif -#if !AXIS_HAS_SPI(Z) - #undef Z_CS_PIN -#endif -#if E_STEPPERS && !AXIS_HAS_SPI(E0) - #undef E0_CS_PIN -#endif -#if E_STEPPERS > 1 && !AXIS_HAS_SPI(E1) - #undef E1_CS_PIN -#endif -#if E_STEPPERS > 2 && !AXIS_HAS_SPI(E2) - #undef E2_CS_PIN -#endif -#if E_STEPPERS > 3 && !AXIS_HAS_SPI(E3) - #undef E3_CS_PIN -#endif -#if E_STEPPERS > 4 && !AXIS_HAS_SPI(E4) - #undef E4_CS_PIN -#endif -#if E_STEPPERS > 5 && !AXIS_HAS_SPI(E5) - #undef E5_CS_PIN -#endif -#if E_STEPPERS > 6 && !AXIS_HAS_SPI(E6) - #undef E6_CS_PIN -#endif -#if E_STEPPERS > 7 && !AXIS_HAS_SPI(E7) - #undef E7_CS_PIN -#endif - -#ifndef X_CS_PIN - #define X_CS_PIN -1 -#endif -#ifndef Y_CS_PIN - #define Y_CS_PIN -1 -#endif -#ifndef Z_CS_PIN - #define Z_CS_PIN -1 -#endif -#ifndef E0_CS_PIN - #define E0_CS_PIN -1 -#endif -#ifndef E1_CS_PIN - #define E1_CS_PIN -1 -#endif -#ifndef E2_CS_PIN - #define E2_CS_PIN -1 -#endif -#ifndef E3_CS_PIN - #define E3_CS_PIN -1 -#endif -#ifndef E4_CS_PIN - #define E4_CS_PIN -1 -#endif -#ifndef E5_CS_PIN - #define E5_CS_PIN -1 -#endif -#ifndef E6_CS_PIN - #define E6_CS_PIN -1 -#endif -#ifndef E7_CS_PIN - #define E7_CS_PIN -1 -#endif - -#ifndef FAN_PIN - #define FAN_PIN -1 -#endif -#define FAN0_PIN FAN_PIN -#ifndef FAN1_PIN - #define FAN1_PIN -1 -#endif -#ifndef FAN2_PIN - #define FAN2_PIN -1 -#endif -#ifndef CONTROLLER_FAN_PIN - #define CONTROLLER_FAN_PIN -1 -#endif - -#ifndef FANMUX0_PIN - #define FANMUX0_PIN -1 -#endif -#ifndef FANMUX1_PIN - #define FANMUX1_PIN -1 -#endif -#ifndef FANMUX2_PIN - #define FANMUX2_PIN -1 -#endif - -#ifndef HEATER_0_PIN - #define HEATER_0_PIN -1 -#endif -#ifndef HEATER_1_PIN - #define HEATER_1_PIN -1 -#endif -#ifndef HEATER_2_PIN - #define HEATER_2_PIN -1 -#endif -#ifndef HEATER_3_PIN - #define HEATER_3_PIN -1 -#endif -#ifndef HEATER_4_PIN - #define HEATER_4_PIN -1 -#endif -#ifndef HEATER_5_PIN - #define HEATER_5_PIN -1 -#endif -#ifndef HEATER_6_PIN - #define HEATER_6_PIN -1 -#endif -#ifndef HEATER_7_PIN - #define HEATER_7_PIN -1 -#endif -#ifndef HEATER_BED_PIN - #define HEATER_BED_PIN -1 -#endif - -#ifndef TEMP_0_PIN - #define TEMP_0_PIN -1 -#endif -#ifndef TEMP_1_PIN - #define TEMP_1_PIN -1 -#endif -#ifndef TEMP_2_PIN - #define TEMP_2_PIN -1 -#endif -#ifndef TEMP_3_PIN - #define TEMP_3_PIN -1 -#endif -#ifndef TEMP_4_PIN - #define TEMP_4_PIN -1 -#endif -#ifndef TEMP_5_PIN - #define TEMP_5_PIN -1 -#endif -#ifndef TEMP_6_PIN - #define TEMP_6_PIN -1 -#endif -#ifndef TEMP_7_PIN - #define TEMP_7_PIN -1 -#endif -#ifndef TEMP_BED_PIN - #define TEMP_BED_PIN -1 -#endif - -#ifndef SD_DETECT_PIN - #define SD_DETECT_PIN -1 -#endif -#ifndef SDPOWER_PIN - #define SDPOWER_PIN -1 -#endif -#ifndef SDSS - #define SDSS -1 -#endif -#ifndef LED_PIN - #define LED_PIN -1 -#endif -#if DISABLED(PSU_CONTROL) || !defined(PS_ON_PIN) - #undef PS_ON_PIN - #define PS_ON_PIN -1 -#endif -#ifndef KILL_PIN - #define KILL_PIN -1 -#endif -#ifndef SUICIDE_PIN - #define SUICIDE_PIN -1 -#endif -#ifndef SUICIDE_PIN_INVERTING - #define SUICIDE_PIN_INVERTING false -#endif - -#ifndef NUM_SERVO_PLUGS - #define NUM_SERVO_PLUGS 4 -#endif - -// -// Assign endstop pins for boards with only 3 connectors -// -#ifdef X_STOP_PIN - #if X_HOME_DIR < 0 - #define X_MIN_PIN X_STOP_PIN - #ifndef X_MAX_PIN - #define X_MAX_PIN -1 - #endif - #else - #define X_MAX_PIN X_STOP_PIN - #ifndef X_MIN_PIN - #define X_MIN_PIN -1 - #endif - #endif -#elif X_HOME_DIR < 0 - #define X_STOP_PIN X_MIN_PIN -#else - #define X_STOP_PIN X_MAX_PIN -#endif - -#ifdef Y_STOP_PIN - #if Y_HOME_DIR < 0 - #define Y_MIN_PIN Y_STOP_PIN - #ifndef Y_MAX_PIN - #define Y_MAX_PIN -1 - #endif - #else - #define Y_MAX_PIN Y_STOP_PIN - #ifndef Y_MIN_PIN - #define Y_MIN_PIN -1 - #endif - #endif -#elif Y_HOME_DIR < 0 - #define Y_STOP_PIN Y_MIN_PIN -#else - #define Y_STOP_PIN Y_MAX_PIN -#endif - -#ifdef Z_STOP_PIN - #if Z_HOME_DIR < 0 - #define Z_MIN_PIN Z_STOP_PIN - #ifndef Z_MAX_PIN - #define Z_MAX_PIN -1 - #endif - #else - #define Z_MAX_PIN Z_STOP_PIN - #ifndef Z_MIN_PIN - #define Z_MIN_PIN -1 - #endif - #endif -#elif Z_HOME_DIR < 0 - #define Z_STOP_PIN Z_MIN_PIN -#else - #define Z_STOP_PIN Z_MAX_PIN -#endif - -// -// Disable unused endstop / probe pins -// -#if !HAS_CUSTOM_PROBE_PIN - #undef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN -1 -#endif - -#if DISABLED(USE_XMAX_PLUG) - #undef X_MAX_PIN - #define X_MAX_PIN -1 -#endif - -#if DISABLED(USE_YMAX_PLUG) - #undef Y_MAX_PIN - #define Y_MAX_PIN -1 -#endif - -#if DISABLED(USE_ZMAX_PLUG) - #undef Z_MAX_PIN - #define Z_MAX_PIN -1 -#endif - -#if DISABLED(USE_XMIN_PLUG) - #undef X_MIN_PIN - #define X_MIN_PIN -1 -#endif - -#if DISABLED(USE_YMIN_PLUG) - #undef Y_MIN_PIN - #define Y_MIN_PIN -1 -#endif - -#if DISABLED(USE_ZMIN_PLUG) - #undef Z_MIN_PIN - #define Z_MIN_PIN -1 -#endif - -#if HAS_FILAMENT_SENSOR - #define FIL_RUNOUT1_PIN FIL_RUNOUT_PIN -#else - #undef FIL_RUNOUT_PIN - #undef FIL_RUNOUT1_PIN -#endif - -#ifndef LCD_PINS_D4 - #define LCD_PINS_D4 -1 -#endif - -#if HAS_MARLINUI_HD44780 || TOUCH_UI_ULTIPANEL - #ifndef LCD_PINS_D5 - #define LCD_PINS_D5 -1 - #endif - #ifndef LCD_PINS_D6 - #define LCD_PINS_D6 -1 - #endif - #ifndef LCD_PINS_D7 - #define LCD_PINS_D7 -1 - #endif -#endif - -/** - * Auto-Assignment for Dual X, Dual Y, Multi-Z Steppers - * - * By default X2 is assigned to the next open E plug - * on the board, then in order, Y2, Z2, Z3. These can be - * overridden in Configuration.h or Configuration_adv.h. - */ - -#define __PEXI(p,q) PIN_EXISTS(E##p##_##q) -#define _PEXI(p,q) __PEXI(p,q) -#define __EPIN(p,q) E##p##_##q##_PIN -#define _EPIN(p,q) __EPIN(p,q) -#define DIAG_REMAPPED(p,q) (PIN_EXISTS(q) && _EPIN(p##_E_INDEX, DIAG) == q##_PIN) - -// The X2 axis, if any, should be the next open extruder port -#define X2_E_INDEX E_STEPPERS - -#if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) - #ifndef X2_STEP_PIN - #define X2_STEP_PIN _EPIN(X2_E_INDEX, STEP) - #define X2_DIR_PIN _EPIN(X2_E_INDEX, DIR) - #define X2_ENABLE_PIN _EPIN(X2_E_INDEX, ENABLE) - #if X2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(X2_STEP) - #error "No E stepper plug left for X2!" - #endif - #endif - #ifndef X2_MS1_PIN - #define X2_MS1_PIN _EPIN(X2_E_INDEX, MS1) - #endif - #ifndef X2_MS2_PIN - #define X2_MS2_PIN _EPIN(X2_E_INDEX, MS2) - #endif - #ifndef X2_MS3_PIN - #define X2_MS3_PIN _EPIN(X2_E_INDEX, MS3) - #endif - #if AXIS_HAS_SPI(X2) && !defined(X2_CS_PIN) - #define X2_CS_PIN _EPIN(X2_E_INDEX, CS) - #endif - #if AXIS_HAS_UART(X2) - #ifndef X2_SERIAL_TX_PIN - #define X2_SERIAL_TX_PIN _EPIN(X2_E_INDEX, SERIAL_TX) - #endif - #ifndef X2_SERIAL_RX_PIN - #define X2_SERIAL_RX_PIN _EPIN(X2_E_INDEX, SERIAL_RX) - #endif - #endif - - // - // Auto-assign pins for stallGuard sensorless homing - // - #if defined(X2_STALL_SENSITIVITY) && ENABLED(X_DUAL_ENDSTOPS) && _PEXI(X2_E_INDEX, DIAG) - #define X2_DIAG_PIN _EPIN(X2_E_INDEX, DIAG) - #if DIAG_REMAPPED(X2, X_MIN) // If already remapped in the pins file... - #define X2_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(X2, Y_MIN) - #define X2_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(X2, Z_MIN) - #define X2_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(X2, X_MAX) - #define X2_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(X2, Y_MAX) - #define X2_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(X2, Z_MAX) - #define X2_USE_ENDSTOP _ZMAX_ - #else // Otherwise use the driver DIAG_PIN directly - #define _X2_USE_ENDSTOP(P) _E##P##_DIAG_ - #define X2_USE_ENDSTOP _X2_USE_ENDSTOP(X2_E_INDEX) - #endif - #undef X2_DIAG_PIN - #endif - - #define Y2_E_INDEX INCREMENT(X2_E_INDEX) -#else - #define Y2_E_INDEX X2_E_INDEX -#endif - -#ifndef X2_CS_PIN - #define X2_CS_PIN -1 -#endif -#ifndef X2_MS1_PIN - #define X2_MS1_PIN -1 -#endif -#ifndef X2_MS2_PIN - #define X2_MS2_PIN -1 -#endif -#ifndef X2_MS3_PIN - #define X2_MS3_PIN -1 -#endif - -// The Y2 axis, if any, should be the next open extruder port -#if ENABLED(Y_DUAL_STEPPER_DRIVERS) - #ifndef Y2_STEP_PIN - #define Y2_STEP_PIN _EPIN(Y2_E_INDEX, STEP) - #define Y2_DIR_PIN _EPIN(Y2_E_INDEX, DIR) - #define Y2_ENABLE_PIN _EPIN(Y2_E_INDEX, ENABLE) - #if Y2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Y2_STEP) - #error "No E stepper plug left for Y2!" - #endif - #endif - #ifndef Y2_MS1_PIN - #define Y2_MS1_PIN _EPIN(Y2_E_INDEX, MS1) - #endif - #ifndef Y2_MS2_PIN - #define Y2_MS2_PIN _EPIN(Y2_E_INDEX, MS2) - #endif - #ifndef Y2_MS3_PIN - #define Y2_MS3_PIN _EPIN(Y2_E_INDEX, MS3) - #endif - #if AXIS_HAS_SPI(Y2) && !defined(Y2_CS_PIN) - #define Y2_CS_PIN _EPIN(Y2_E_INDEX, CS) - #endif - #if AXIS_HAS_UART(Y2) - #ifndef Y2_SERIAL_TX_PIN - #define Y2_SERIAL_TX_PIN _EPIN(Y2_E_INDEX, SERIAL_TX) - #endif - #ifndef Y2_SERIAL_RX_PIN - #define Y2_SERIAL_RX_PIN _EPIN(Y2_E_INDEX, SERIAL_RX) - #endif - #endif - #if defined(Y2_STALL_SENSITIVITY) && ENABLED(Y_DUAL_ENDSTOPS) && _PEXI(Y2_E_INDEX, DIAG) - #define Y2_DIAG_PIN _EPIN(Y2_E_INDEX, DIAG) - #if DIAG_REMAPPED(Y2, X_MIN) - #define Y2_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(Y2, Y_MIN) - #define Y2_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(Y2, Z_MIN) - #define Y2_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(Y2, X_MAX) - #define Y2_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(Y2, Y_MAX) - #define Y2_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(Y2, Z_MAX) - #define Y2_USE_ENDSTOP _ZMAX_ - #else - #define _Y2_USE_ENDSTOP(P) _E##P##_DIAG_ - #define Y2_USE_ENDSTOP _Y2_USE_ENDSTOP(Y2_E_INDEX) - #endif - #undef Y2_DIAG_PIN - #endif - #define Z2_E_INDEX INCREMENT(Y2_E_INDEX) -#else - #define Z2_E_INDEX Y2_E_INDEX -#endif - -#ifndef Y2_CS_PIN - #define Y2_CS_PIN -1 -#endif -#ifndef Y2_MS1_PIN - #define Y2_MS1_PIN -1 -#endif -#ifndef Y2_MS2_PIN - #define Y2_MS2_PIN -1 -#endif -#ifndef Y2_MS3_PIN - #define Y2_MS3_PIN -1 -#endif - -// The Z2 axis, if any, should be the next open extruder port -#if NUM_Z_STEPPER_DRIVERS >= 2 - #ifndef Z2_STEP_PIN - #define Z2_STEP_PIN _EPIN(Z2_E_INDEX, STEP) - #define Z2_DIR_PIN _EPIN(Z2_E_INDEX, DIR) - #define Z2_ENABLE_PIN _EPIN(Z2_E_INDEX, ENABLE) - #if Z2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z2_STEP) - #error "No E stepper plug left for Z2!" - #endif - #endif - #ifndef Z2_MS1_PIN - #define Z2_MS1_PIN _EPIN(Z2_E_INDEX, MS1) - #endif - #ifndef Z2_MS2_PIN - #define Z2_MS2_PIN _EPIN(Z2_E_INDEX, MS2) - #endif - #ifndef Z2_MS3_PIN - #define Z2_MS3_PIN _EPIN(Z2_E_INDEX, MS3) - #endif - #if AXIS_HAS_SPI(Z2) && !defined(Z2_CS_PIN) - #define Z2_CS_PIN _EPIN(Z2_E_INDEX, CS) - #endif - #if AXIS_HAS_UART(Z2) - #ifndef Z2_SERIAL_TX_PIN - #define Z2_SERIAL_TX_PIN _EPIN(Z2_E_INDEX, SERIAL_TX) - #endif - #ifndef Z2_SERIAL_RX_PIN - #define Z2_SERIAL_RX_PIN _EPIN(Z2_E_INDEX, SERIAL_RX) - #endif - #endif - #if defined(Z2_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 2 && _PEXI(Z2_E_INDEX, DIAG) - #define Z2_DIAG_PIN _EPIN(Z2_E_INDEX, DIAG) - #if DIAG_REMAPPED(Z2, X_MIN) - #define Z2_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(Z2, Y_MIN) - #define Z2_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(Z2, Z_MIN) - #define Z2_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(Z2, X_MAX) - #define Z2_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(Z2, Y_MAX) - #define Z2_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(Z2, Z_MAX) - #define Z2_USE_ENDSTOP _ZMAX_ - #else - #define _Z2_USE_ENDSTOP(P) _E##P##_DIAG_ - #define Z2_USE_ENDSTOP _Z2_USE_ENDSTOP(Z2_E_INDEX) - #endif - #undef Z2_DIAG_PIN - #endif - #define Z3_E_INDEX INCREMENT(Z2_E_INDEX) -#else - #define Z3_E_INDEX Z2_E_INDEX -#endif - -#ifndef Z2_CS_PIN - #define Z2_CS_PIN -1 -#endif -#ifndef Z2_MS1_PIN - #define Z2_MS1_PIN -1 -#endif -#ifndef Z2_MS2_PIN - #define Z2_MS2_PIN -1 -#endif -#ifndef Z2_MS3_PIN - #define Z2_MS3_PIN -1 -#endif - -#if NUM_Z_STEPPER_DRIVERS >= 3 - #ifndef Z3_STEP_PIN - #define Z3_STEP_PIN _EPIN(Z3_E_INDEX, STEP) - #define Z3_DIR_PIN _EPIN(Z3_E_INDEX, DIR) - #define Z3_ENABLE_PIN _EPIN(Z3_E_INDEX, ENABLE) - #if Z3_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z3_STEP) - #error "No E stepper plug left for Z3!" - #endif - #endif - #if AXIS_HAS_SPI(Z3) - #ifndef Z3_CS_PIN - #define Z3_CS_PIN _EPIN(Z3_E_INDEX, CS) - #endif - #endif - #ifndef Z3_MS1_PIN - #define Z3_MS1_PIN _EPIN(Z3_E_INDEX, MS1) - #endif - #ifndef Z3_MS2_PIN - #define Z3_MS2_PIN _EPIN(Z3_E_INDEX, MS2) - #endif - #ifndef Z3_MS3_PIN - #define Z3_MS3_PIN _EPIN(Z3_E_INDEX, MS3) - #endif - #if AXIS_HAS_UART(Z3) - #ifndef Z3_SERIAL_TX_PIN - #define Z3_SERIAL_TX_PIN _EPIN(Z3_E_INDEX, SERIAL_TX) - #endif - #ifndef Z3_SERIAL_RX_PIN - #define Z3_SERIAL_RX_PIN _EPIN(Z3_E_INDEX, SERIAL_RX) - #endif - #endif - #if defined(Z3_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 && _PEXI(Z3_E_INDEX, DIAG) - #define Z3_DIAG_PIN _EPIN(Z3_E_INDEX, DIAG) - #if DIAG_REMAPPED(Z3, X_MIN) - #define Z3_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(Z3, Y_MIN) - #define Z3_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(Z3, Z_MIN) - #define Z3_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(Z3, X_MAX) - #define Z3_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(Z3, Y_MAX) - #define Z3_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(Z3, Z_MAX) - #define Z3_USE_ENDSTOP _ZMAX_ - #else - #define _Z3_USE_ENDSTOP(P) _E##P##_DIAG_ - #define Z3_USE_ENDSTOP _Z3_USE_ENDSTOP(Z3_E_INDEX) - #endif - #undef Z3_DIAG_PIN - #endif - #define Z4_E_INDEX INCREMENT(Z3_E_INDEX) -#endif - -#ifndef Z3_CS_PIN - #define Z3_CS_PIN -1 -#endif -#ifndef Z3_MS1_PIN - #define Z3_MS1_PIN -1 -#endif -#ifndef Z3_MS2_PIN - #define Z3_MS2_PIN -1 -#endif -#ifndef Z3_MS3_PIN - #define Z3_MS3_PIN -1 -#endif - -#if NUM_Z_STEPPER_DRIVERS >= 4 - #ifndef Z4_STEP_PIN - #define Z4_STEP_PIN _EPIN(Z4_E_INDEX, STEP) - #define Z4_DIR_PIN _EPIN(Z4_E_INDEX, DIR) - #define Z4_ENABLE_PIN _EPIN(Z4_E_INDEX, ENABLE) - #if Z4_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z4_STEP) - #error "No E stepper plug left for Z4!" - #endif - #endif - #if AXIS_HAS_SPI(Z4) - #ifndef Z4_CS_PIN - #define Z4_CS_PIN _EPIN(Z4_E_INDEX, CS) - #endif - #endif - #ifndef Z4_MS1_PIN - #define Z4_MS1_PIN _EPIN(Z4_E_INDEX, MS1) - #endif - #ifndef Z4_MS2_PIN - #define Z4_MS2_PIN _EPIN(Z4_E_INDEX, MS2) - #endif - #ifndef Z4_MS3_PIN - #define Z4_MS3_PIN _EPIN(Z4_E_INDEX, MS3) - #endif - #if AXIS_HAS_UART(Z4) - #ifndef Z4_SERIAL_TX_PIN - #define Z4_SERIAL_TX_PIN _EPIN(Z4_E_INDEX, SERIAL_TX) - #endif - #ifndef Z4_SERIAL_RX_PIN - #define Z4_SERIAL_RX_PIN _EPIN(Z4_E_INDEX, SERIAL_RX) - #endif - #endif - #if defined(Z4_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 && _PEXI(Z4_E_INDEX, DIAG) - #define Z4_DIAG_PIN _EPIN(Z4_E_INDEX, DIAG) - #if DIAG_REMAPPED(Z4, X_MIN) - #define Z4_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(Z4, Y_MIN) - #define Z4_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(Z4, Z_MIN) - #define Z4_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(Z4, X_MAX) - #define Z4_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(Z4, Y_MAX) - #define Z4_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(Z4, Z_MAX) - #define Z4_USE_ENDSTOP _ZMAX_ - #else - #define _Z4_USE_ENDSTOP(P) _E##P##_DIAG_ - #define Z4_USE_ENDSTOP _Z4_USE_ENDSTOP(Z4_E_INDEX) - #endif - #undef Z4_DIAG_PIN - #endif -#endif - -#ifndef Z4_CS_PIN - #define Z4_CS_PIN -1 -#endif -#ifndef Z4_MS1_PIN - #define Z4_MS1_PIN -1 -#endif -#ifndef Z4_MS2_PIN - #define Z4_MS2_PIN -1 -#endif -#ifndef Z4_MS3_PIN - #define Z4_MS3_PIN -1 -#endif - -#if HAS_MARLINUI_U8GLIB - #if !defined(ST7920_DELAY_1) && defined(BOARD_ST7920_DELAY_1) - #define ST7920_DELAY_1 BOARD_ST7920_DELAY_1 - #endif - #if !defined(ST7920_DELAY_2) && defined(BOARD_ST7920_DELAY_2) - #define ST7920_DELAY_2 BOARD_ST7920_DELAY_2 - #endif - #if !defined(ST7920_DELAY_3) && defined(BOARD_ST7920_DELAY_3) - #define ST7920_DELAY_3 BOARD_ST7920_DELAY_3 - #endif -#else - #undef ST7920_DELAY_1 - #undef ST7920_DELAY_2 - #undef ST7920_DELAY_3 -#endif - -#undef HAS_FREE_AUX2_PINS -#undef DIAG_REMAPPED +#include "pins_postprocess.h" diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h new file mode 100644 index 0000000000..fdf9f095cb --- /dev/null +++ b/Marlin/src/pins/pins_postprocess.h @@ -0,0 +1,877 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// File: pins/pins_postprocess.h +// Post-process pins according to configured settings +// + +// Define certain undefined pins +#ifndef X_MS1_PIN + #define X_MS1_PIN -1 +#endif +#ifndef X_MS2_PIN + #define X_MS2_PIN -1 +#endif +#ifndef X_MS3_PIN + #define X_MS3_PIN -1 +#endif +#ifndef Y_MS1_PIN + #define Y_MS1_PIN -1 +#endif +#ifndef Y_MS2_PIN + #define Y_MS2_PIN -1 +#endif +#ifndef Y_MS3_PIN + #define Y_MS3_PIN -1 +#endif +#ifndef Z_MS1_PIN + #define Z_MS1_PIN -1 +#endif +#ifndef Z_MS2_PIN + #define Z_MS2_PIN -1 +#endif +#ifndef Z_MS3_PIN + #define Z_MS3_PIN -1 +#endif +#ifndef E0_MS1_PIN + #define E0_MS1_PIN -1 +#endif +#ifndef E0_MS2_PIN + #define E0_MS2_PIN -1 +#endif +#ifndef E0_MS3_PIN + #define E0_MS3_PIN -1 +#endif +#ifndef E1_MS1_PIN + #define E1_MS1_PIN -1 +#endif +#ifndef E1_MS2_PIN + #define E1_MS2_PIN -1 +#endif +#ifndef E1_MS3_PIN + #define E1_MS3_PIN -1 +#endif +#ifndef E2_MS1_PIN + #define E2_MS1_PIN -1 +#endif +#ifndef E2_MS2_PIN + #define E2_MS2_PIN -1 +#endif +#ifndef E2_MS3_PIN + #define E2_MS3_PIN -1 +#endif +#ifndef E3_MS1_PIN + #define E3_MS1_PIN -1 +#endif +#ifndef E3_MS2_PIN + #define E3_MS2_PIN -1 +#endif +#ifndef E3_MS3_PIN + #define E3_MS3_PIN -1 +#endif +#ifndef E4_MS1_PIN + #define E4_MS1_PIN -1 +#endif +#ifndef E4_MS2_PIN + #define E4_MS2_PIN -1 +#endif +#ifndef E4_MS3_PIN + #define E4_MS3_PIN -1 +#endif +#ifndef E5_MS1_PIN + #define E5_MS1_PIN -1 +#endif +#ifndef E5_MS2_PIN + #define E5_MS2_PIN -1 +#endif +#ifndef E5_MS3_PIN + #define E5_MS3_PIN -1 +#endif +#ifndef E6_MS1_PIN + #define E6_MS1_PIN -1 +#endif +#ifndef E6_MS2_PIN + #define E6_MS2_PIN -1 +#endif +#ifndef E6_MS3_PIN + #define E6_MS3_PIN -1 +#endif +#ifndef E7_MS1_PIN + #define E7_MS1_PIN -1 +#endif +#ifndef E7_MS2_PIN + #define E7_MS2_PIN -1 +#endif +#ifndef E7_MS3_PIN + #define E7_MS3_PIN -1 +#endif + +#ifndef E0_STEP_PIN + #define E0_STEP_PIN -1 +#endif +#ifndef E0_DIR_PIN + #define E0_DIR_PIN -1 +#endif +#ifndef E0_ENABLE_PIN + #define E0_ENABLE_PIN -1 +#endif +#ifndef E1_STEP_PIN + #define E1_STEP_PIN -1 +#endif +#ifndef E1_DIR_PIN + #define E1_DIR_PIN -1 +#endif +#ifndef E1_ENABLE_PIN + #define E1_ENABLE_PIN -1 +#endif +#ifndef E2_STEP_PIN + #define E2_STEP_PIN -1 +#endif +#ifndef E2_DIR_PIN + #define E2_DIR_PIN -1 +#endif +#ifndef E2_ENABLE_PIN + #define E2_ENABLE_PIN -1 +#endif +#ifndef E3_STEP_PIN + #define E3_STEP_PIN -1 +#endif +#ifndef E3_DIR_PIN + #define E3_DIR_PIN -1 +#endif +#ifndef E3_ENABLE_PIN + #define E3_ENABLE_PIN -1 +#endif +#ifndef E4_STEP_PIN + #define E4_STEP_PIN -1 +#endif +#ifndef E4_DIR_PIN + #define E4_DIR_PIN -1 +#endif +#ifndef E4_ENABLE_PIN + #define E4_ENABLE_PIN -1 +#endif +#ifndef E5_STEP_PIN + #define E5_STEP_PIN -1 +#endif +#ifndef E5_DIR_PIN + #define E5_DIR_PIN -1 +#endif +#ifndef E5_ENABLE_PIN + #define E5_ENABLE_PIN -1 +#endif +#ifndef E6_STEP_PIN + #define E6_STEP_PIN -1 +#endif +#ifndef E6_DIR_PIN + #define E6_DIR_PIN -1 +#endif +#ifndef E6_ENABLE_PIN + #define E6_ENABLE_PIN -1 +#endif +#ifndef E7_STEP_PIN + #define E7_STEP_PIN -1 +#endif +#ifndef E7_DIR_PIN + #define E7_DIR_PIN -1 +#endif +#ifndef E7_ENABLE_PIN + #define E7_ENABLE_PIN -1 +#endif + +// +// Destroy unused CS pins +// +#if !AXIS_HAS_SPI(X) + #undef X_CS_PIN +#endif +#if !AXIS_HAS_SPI(Y) + #undef Y_CS_PIN +#endif +#if !AXIS_HAS_SPI(Z) + #undef Z_CS_PIN +#endif +#if E_STEPPERS && !AXIS_HAS_SPI(E0) + #undef E0_CS_PIN +#endif +#if E_STEPPERS > 1 && !AXIS_HAS_SPI(E1) + #undef E1_CS_PIN +#endif +#if E_STEPPERS > 2 && !AXIS_HAS_SPI(E2) + #undef E2_CS_PIN +#endif +#if E_STEPPERS > 3 && !AXIS_HAS_SPI(E3) + #undef E3_CS_PIN +#endif +#if E_STEPPERS > 4 && !AXIS_HAS_SPI(E4) + #undef E4_CS_PIN +#endif +#if E_STEPPERS > 5 && !AXIS_HAS_SPI(E5) + #undef E5_CS_PIN +#endif +#if E_STEPPERS > 6 && !AXIS_HAS_SPI(E6) + #undef E6_CS_PIN +#endif +#if E_STEPPERS > 7 && !AXIS_HAS_SPI(E7) + #undef E7_CS_PIN +#endif + +#ifndef X_CS_PIN + #define X_CS_PIN -1 +#endif +#ifndef Y_CS_PIN + #define Y_CS_PIN -1 +#endif +#ifndef Z_CS_PIN + #define Z_CS_PIN -1 +#endif +#ifndef E0_CS_PIN + #define E0_CS_PIN -1 +#endif +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif +#ifndef E2_CS_PIN + #define E2_CS_PIN -1 +#endif +#ifndef E3_CS_PIN + #define E3_CS_PIN -1 +#endif +#ifndef E4_CS_PIN + #define E4_CS_PIN -1 +#endif +#ifndef E5_CS_PIN + #define E5_CS_PIN -1 +#endif +#ifndef E6_CS_PIN + #define E6_CS_PIN -1 +#endif +#ifndef E7_CS_PIN + #define E7_CS_PIN -1 +#endif + +#ifndef FAN_PIN + #define FAN_PIN -1 +#endif +#define FAN0_PIN FAN_PIN +#ifndef FAN1_PIN + #define FAN1_PIN -1 +#endif +#ifndef FAN2_PIN + #define FAN2_PIN -1 +#endif +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN -1 +#endif + +#ifndef FANMUX0_PIN + #define FANMUX0_PIN -1 +#endif +#ifndef FANMUX1_PIN + #define FANMUX1_PIN -1 +#endif +#ifndef FANMUX2_PIN + #define FANMUX2_PIN -1 +#endif + +#ifndef HEATER_0_PIN + #define HEATER_0_PIN -1 +#endif +#ifndef HEATER_1_PIN + #define HEATER_1_PIN -1 +#endif +#ifndef HEATER_2_PIN + #define HEATER_2_PIN -1 +#endif +#ifndef HEATER_3_PIN + #define HEATER_3_PIN -1 +#endif +#ifndef HEATER_4_PIN + #define HEATER_4_PIN -1 +#endif +#ifndef HEATER_5_PIN + #define HEATER_5_PIN -1 +#endif +#ifndef HEATER_6_PIN + #define HEATER_6_PIN -1 +#endif +#ifndef HEATER_7_PIN + #define HEATER_7_PIN -1 +#endif +#ifndef HEATER_BED_PIN + #define HEATER_BED_PIN -1 +#endif + +#ifndef TEMP_0_PIN + #define TEMP_0_PIN -1 +#endif +#ifndef TEMP_1_PIN + #define TEMP_1_PIN -1 +#endif +#ifndef TEMP_2_PIN + #define TEMP_2_PIN -1 +#endif +#ifndef TEMP_3_PIN + #define TEMP_3_PIN -1 +#endif +#ifndef TEMP_4_PIN + #define TEMP_4_PIN -1 +#endif +#ifndef TEMP_5_PIN + #define TEMP_5_PIN -1 +#endif +#ifndef TEMP_6_PIN + #define TEMP_6_PIN -1 +#endif +#ifndef TEMP_7_PIN + #define TEMP_7_PIN -1 +#endif +#ifndef TEMP_BED_PIN + #define TEMP_BED_PIN -1 +#endif + +#ifndef SD_DETECT_PIN + #define SD_DETECT_PIN -1 +#endif +#ifndef SDPOWER_PIN + #define SDPOWER_PIN -1 +#endif +#ifndef SDSS + #define SDSS -1 +#endif +#ifndef LED_PIN + #define LED_PIN -1 +#endif +#if DISABLED(PSU_CONTROL) || !defined(PS_ON_PIN) + #undef PS_ON_PIN + #define PS_ON_PIN -1 +#endif +#ifndef KILL_PIN + #define KILL_PIN -1 +#endif +#ifndef SUICIDE_PIN + #define SUICIDE_PIN -1 +#endif +#ifndef SUICIDE_PIN_INVERTING + #define SUICIDE_PIN_INVERTING false +#endif + +#ifndef NUM_SERVO_PLUGS + #define NUM_SERVO_PLUGS 4 +#endif + +// +// Assign endstop pins for boards with only 3 connectors +// +#ifdef X_STOP_PIN + #if X_HOME_DIR < 0 + #define X_MIN_PIN X_STOP_PIN + #ifndef X_MAX_PIN + #define X_MAX_PIN -1 + #endif + #else + #define X_MAX_PIN X_STOP_PIN + #ifndef X_MIN_PIN + #define X_MIN_PIN -1 + #endif + #endif +#elif X_HOME_DIR < 0 + #define X_STOP_PIN X_MIN_PIN +#else + #define X_STOP_PIN X_MAX_PIN +#endif + +#ifdef Y_STOP_PIN + #if Y_HOME_DIR < 0 + #define Y_MIN_PIN Y_STOP_PIN + #ifndef Y_MAX_PIN + #define Y_MAX_PIN -1 + #endif + #else + #define Y_MAX_PIN Y_STOP_PIN + #ifndef Y_MIN_PIN + #define Y_MIN_PIN -1 + #endif + #endif +#elif Y_HOME_DIR < 0 + #define Y_STOP_PIN Y_MIN_PIN +#else + #define Y_STOP_PIN Y_MAX_PIN +#endif + +#ifdef Z_STOP_PIN + #if Z_HOME_DIR < 0 + #define Z_MIN_PIN Z_STOP_PIN + #ifndef Z_MAX_PIN + #define Z_MAX_PIN -1 + #endif + #else + #define Z_MAX_PIN Z_STOP_PIN + #ifndef Z_MIN_PIN + #define Z_MIN_PIN -1 + #endif + #endif +#elif Z_HOME_DIR < 0 + #define Z_STOP_PIN Z_MIN_PIN +#else + #define Z_STOP_PIN Z_MAX_PIN +#endif + +// +// Disable unused endstop / probe pins +// +#if !HAS_CUSTOM_PROBE_PIN + #undef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN -1 +#endif + +#if DISABLED(USE_XMAX_PLUG) + #undef X_MAX_PIN + #define X_MAX_PIN -1 +#endif + +#if DISABLED(USE_YMAX_PLUG) + #undef Y_MAX_PIN + #define Y_MAX_PIN -1 +#endif + +#if DISABLED(USE_ZMAX_PLUG) + #undef Z_MAX_PIN + #define Z_MAX_PIN -1 +#endif + +#if DISABLED(USE_XMIN_PLUG) + #undef X_MIN_PIN + #define X_MIN_PIN -1 +#endif + +#if DISABLED(USE_YMIN_PLUG) + #undef Y_MIN_PIN + #define Y_MIN_PIN -1 +#endif + +#if DISABLED(USE_ZMIN_PLUG) + #undef Z_MIN_PIN + #define Z_MIN_PIN -1 +#endif + +#if HAS_FILAMENT_SENSOR + #define FIL_RUNOUT1_PIN FIL_RUNOUT_PIN +#else + #undef FIL_RUNOUT_PIN + #undef FIL_RUNOUT1_PIN +#endif + +#ifndef LCD_PINS_D4 + #define LCD_PINS_D4 -1 +#endif + +#if HAS_MARLINUI_HD44780 || TOUCH_UI_ULTIPANEL + #ifndef LCD_PINS_D5 + #define LCD_PINS_D5 -1 + #endif + #ifndef LCD_PINS_D6 + #define LCD_PINS_D6 -1 + #endif + #ifndef LCD_PINS_D7 + #define LCD_PINS_D7 -1 + #endif +#endif + +/** + * Auto-Assignment for Dual X, Dual Y, Multi-Z Steppers + * + * By default X2 is assigned to the next open E plug + * on the board, then in order, Y2, Z2, Z3. These can be + * overridden in Configuration.h or Configuration_adv.h. + */ + +#define __PEXI(p,q) PIN_EXISTS(E##p##_##q) +#define _PEXI(p,q) __PEXI(p,q) +#define __EPIN(p,q) E##p##_##q##_PIN +#define _EPIN(p,q) __EPIN(p,q) +#define DIAG_REMAPPED(p,q) (PIN_EXISTS(q) && _EPIN(p##_E_INDEX, DIAG) == q##_PIN) + +// The X2 axis, if any, should be the next open extruder port +#define X2_E_INDEX E_STEPPERS + +#if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) + #ifndef X2_STEP_PIN + #define X2_STEP_PIN _EPIN(X2_E_INDEX, STEP) + #define X2_DIR_PIN _EPIN(X2_E_INDEX, DIR) + #define X2_ENABLE_PIN _EPIN(X2_E_INDEX, ENABLE) + #if X2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(X2_STEP) + #error "No E stepper plug left for X2!" + #endif + #endif + #ifndef X2_MS1_PIN + #define X2_MS1_PIN _EPIN(X2_E_INDEX, MS1) + #endif + #ifndef X2_MS2_PIN + #define X2_MS2_PIN _EPIN(X2_E_INDEX, MS2) + #endif + #ifndef X2_MS3_PIN + #define X2_MS3_PIN _EPIN(X2_E_INDEX, MS3) + #endif + #if AXIS_HAS_SPI(X2) && !defined(X2_CS_PIN) + #define X2_CS_PIN _EPIN(X2_E_INDEX, CS) + #endif + #if AXIS_HAS_UART(X2) + #ifndef X2_SERIAL_TX_PIN + #define X2_SERIAL_TX_PIN _EPIN(X2_E_INDEX, SERIAL_TX) + #endif + #ifndef X2_SERIAL_RX_PIN + #define X2_SERIAL_RX_PIN _EPIN(X2_E_INDEX, SERIAL_RX) + #endif + #endif + + // + // Auto-assign pins for stallGuard sensorless homing + // + #if defined(X2_STALL_SENSITIVITY) && ENABLED(X_DUAL_ENDSTOPS) && _PEXI(X2_E_INDEX, DIAG) + #define X2_DIAG_PIN _EPIN(X2_E_INDEX, DIAG) + #if DIAG_REMAPPED(X2, X_MIN) // If already remapped in the pins file... + #define X2_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(X2, Y_MIN) + #define X2_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(X2, Z_MIN) + #define X2_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(X2, X_MAX) + #define X2_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(X2, Y_MAX) + #define X2_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(X2, Z_MAX) + #define X2_USE_ENDSTOP _ZMAX_ + #else // Otherwise use the driver DIAG_PIN directly + #define _X2_USE_ENDSTOP(P) _E##P##_DIAG_ + #define X2_USE_ENDSTOP _X2_USE_ENDSTOP(X2_E_INDEX) + #endif + #undef X2_DIAG_PIN + #endif + + #define Y2_E_INDEX INCREMENT(X2_E_INDEX) +#else + #define Y2_E_INDEX X2_E_INDEX +#endif + +#ifndef X2_CS_PIN + #define X2_CS_PIN -1 +#endif +#ifndef X2_MS1_PIN + #define X2_MS1_PIN -1 +#endif +#ifndef X2_MS2_PIN + #define X2_MS2_PIN -1 +#endif +#ifndef X2_MS3_PIN + #define X2_MS3_PIN -1 +#endif + +// The Y2 axis, if any, should be the next open extruder port +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #ifndef Y2_STEP_PIN + #define Y2_STEP_PIN _EPIN(Y2_E_INDEX, STEP) + #define Y2_DIR_PIN _EPIN(Y2_E_INDEX, DIR) + #define Y2_ENABLE_PIN _EPIN(Y2_E_INDEX, ENABLE) + #if Y2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Y2_STEP) + #error "No E stepper plug left for Y2!" + #endif + #endif + #ifndef Y2_MS1_PIN + #define Y2_MS1_PIN _EPIN(Y2_E_INDEX, MS1) + #endif + #ifndef Y2_MS2_PIN + #define Y2_MS2_PIN _EPIN(Y2_E_INDEX, MS2) + #endif + #ifndef Y2_MS3_PIN + #define Y2_MS3_PIN _EPIN(Y2_E_INDEX, MS3) + #endif + #if AXIS_HAS_SPI(Y2) && !defined(Y2_CS_PIN) + #define Y2_CS_PIN _EPIN(Y2_E_INDEX, CS) + #endif + #if AXIS_HAS_UART(Y2) + #ifndef Y2_SERIAL_TX_PIN + #define Y2_SERIAL_TX_PIN _EPIN(Y2_E_INDEX, SERIAL_TX) + #endif + #ifndef Y2_SERIAL_RX_PIN + #define Y2_SERIAL_RX_PIN _EPIN(Y2_E_INDEX, SERIAL_RX) + #endif + #endif + #if defined(Y2_STALL_SENSITIVITY) && ENABLED(Y_DUAL_ENDSTOPS) && _PEXI(Y2_E_INDEX, DIAG) + #define Y2_DIAG_PIN _EPIN(Y2_E_INDEX, DIAG) + #if DIAG_REMAPPED(Y2, X_MIN) + #define Y2_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(Y2, Y_MIN) + #define Y2_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(Y2, Z_MIN) + #define Y2_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(Y2, X_MAX) + #define Y2_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(Y2, Y_MAX) + #define Y2_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(Y2, Z_MAX) + #define Y2_USE_ENDSTOP _ZMAX_ + #else + #define _Y2_USE_ENDSTOP(P) _E##P##_DIAG_ + #define Y2_USE_ENDSTOP _Y2_USE_ENDSTOP(Y2_E_INDEX) + #endif + #undef Y2_DIAG_PIN + #endif + #define Z2_E_INDEX INCREMENT(Y2_E_INDEX) +#else + #define Z2_E_INDEX Y2_E_INDEX +#endif + +#ifndef Y2_CS_PIN + #define Y2_CS_PIN -1 +#endif +#ifndef Y2_MS1_PIN + #define Y2_MS1_PIN -1 +#endif +#ifndef Y2_MS2_PIN + #define Y2_MS2_PIN -1 +#endif +#ifndef Y2_MS3_PIN + #define Y2_MS3_PIN -1 +#endif + +// The Z2 axis, if any, should be the next open extruder port +#if NUM_Z_STEPPER_DRIVERS >= 2 + #ifndef Z2_STEP_PIN + #define Z2_STEP_PIN _EPIN(Z2_E_INDEX, STEP) + #define Z2_DIR_PIN _EPIN(Z2_E_INDEX, DIR) + #define Z2_ENABLE_PIN _EPIN(Z2_E_INDEX, ENABLE) + #if Z2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z2_STEP) + #error "No E stepper plug left for Z2!" + #endif + #endif + #ifndef Z2_MS1_PIN + #define Z2_MS1_PIN _EPIN(Z2_E_INDEX, MS1) + #endif + #ifndef Z2_MS2_PIN + #define Z2_MS2_PIN _EPIN(Z2_E_INDEX, MS2) + #endif + #ifndef Z2_MS3_PIN + #define Z2_MS3_PIN _EPIN(Z2_E_INDEX, MS3) + #endif + #if AXIS_HAS_SPI(Z2) && !defined(Z2_CS_PIN) + #define Z2_CS_PIN _EPIN(Z2_E_INDEX, CS) + #endif + #if AXIS_HAS_UART(Z2) + #ifndef Z2_SERIAL_TX_PIN + #define Z2_SERIAL_TX_PIN _EPIN(Z2_E_INDEX, SERIAL_TX) + #endif + #ifndef Z2_SERIAL_RX_PIN + #define Z2_SERIAL_RX_PIN _EPIN(Z2_E_INDEX, SERIAL_RX) + #endif + #endif + #if defined(Z2_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 2 && _PEXI(Z2_E_INDEX, DIAG) + #define Z2_DIAG_PIN _EPIN(Z2_E_INDEX, DIAG) + #if DIAG_REMAPPED(Z2, X_MIN) + #define Z2_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(Z2, Y_MIN) + #define Z2_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(Z2, Z_MIN) + #define Z2_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(Z2, X_MAX) + #define Z2_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(Z2, Y_MAX) + #define Z2_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(Z2, Z_MAX) + #define Z2_USE_ENDSTOP _ZMAX_ + #else + #define _Z2_USE_ENDSTOP(P) _E##P##_DIAG_ + #define Z2_USE_ENDSTOP _Z2_USE_ENDSTOP(Z2_E_INDEX) + #endif + #undef Z2_DIAG_PIN + #endif + #define Z3_E_INDEX INCREMENT(Z2_E_INDEX) +#else + #define Z3_E_INDEX Z2_E_INDEX +#endif + +#ifndef Z2_CS_PIN + #define Z2_CS_PIN -1 +#endif +#ifndef Z2_MS1_PIN + #define Z2_MS1_PIN -1 +#endif +#ifndef Z2_MS2_PIN + #define Z2_MS2_PIN -1 +#endif +#ifndef Z2_MS3_PIN + #define Z2_MS3_PIN -1 +#endif + +#if NUM_Z_STEPPER_DRIVERS >= 3 + #ifndef Z3_STEP_PIN + #define Z3_STEP_PIN _EPIN(Z3_E_INDEX, STEP) + #define Z3_DIR_PIN _EPIN(Z3_E_INDEX, DIR) + #define Z3_ENABLE_PIN _EPIN(Z3_E_INDEX, ENABLE) + #if Z3_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z3_STEP) + #error "No E stepper plug left for Z3!" + #endif + #endif + #if AXIS_HAS_SPI(Z3) + #ifndef Z3_CS_PIN + #define Z3_CS_PIN _EPIN(Z3_E_INDEX, CS) + #endif + #endif + #ifndef Z3_MS1_PIN + #define Z3_MS1_PIN _EPIN(Z3_E_INDEX, MS1) + #endif + #ifndef Z3_MS2_PIN + #define Z3_MS2_PIN _EPIN(Z3_E_INDEX, MS2) + #endif + #ifndef Z3_MS3_PIN + #define Z3_MS3_PIN _EPIN(Z3_E_INDEX, MS3) + #endif + #if AXIS_HAS_UART(Z3) + #ifndef Z3_SERIAL_TX_PIN + #define Z3_SERIAL_TX_PIN _EPIN(Z3_E_INDEX, SERIAL_TX) + #endif + #ifndef Z3_SERIAL_RX_PIN + #define Z3_SERIAL_RX_PIN _EPIN(Z3_E_INDEX, SERIAL_RX) + #endif + #endif + #if defined(Z3_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 && _PEXI(Z3_E_INDEX, DIAG) + #define Z3_DIAG_PIN _EPIN(Z3_E_INDEX, DIAG) + #if DIAG_REMAPPED(Z3, X_MIN) + #define Z3_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(Z3, Y_MIN) + #define Z3_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(Z3, Z_MIN) + #define Z3_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(Z3, X_MAX) + #define Z3_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(Z3, Y_MAX) + #define Z3_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(Z3, Z_MAX) + #define Z3_USE_ENDSTOP _ZMAX_ + #else + #define _Z3_USE_ENDSTOP(P) _E##P##_DIAG_ + #define Z3_USE_ENDSTOP _Z3_USE_ENDSTOP(Z3_E_INDEX) + #endif + #undef Z3_DIAG_PIN + #endif + #define Z4_E_INDEX INCREMENT(Z3_E_INDEX) +#endif + +#ifndef Z3_CS_PIN + #define Z3_CS_PIN -1 +#endif +#ifndef Z3_MS1_PIN + #define Z3_MS1_PIN -1 +#endif +#ifndef Z3_MS2_PIN + #define Z3_MS2_PIN -1 +#endif +#ifndef Z3_MS3_PIN + #define Z3_MS3_PIN -1 +#endif + +#if NUM_Z_STEPPER_DRIVERS >= 4 + #ifndef Z4_STEP_PIN + #define Z4_STEP_PIN _EPIN(Z4_E_INDEX, STEP) + #define Z4_DIR_PIN _EPIN(Z4_E_INDEX, DIR) + #define Z4_ENABLE_PIN _EPIN(Z4_E_INDEX, ENABLE) + #if Z4_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z4_STEP) + #error "No E stepper plug left for Z4!" + #endif + #endif + #if AXIS_HAS_SPI(Z4) + #ifndef Z4_CS_PIN + #define Z4_CS_PIN _EPIN(Z4_E_INDEX, CS) + #endif + #endif + #ifndef Z4_MS1_PIN + #define Z4_MS1_PIN _EPIN(Z4_E_INDEX, MS1) + #endif + #ifndef Z4_MS2_PIN + #define Z4_MS2_PIN _EPIN(Z4_E_INDEX, MS2) + #endif + #ifndef Z4_MS3_PIN + #define Z4_MS3_PIN _EPIN(Z4_E_INDEX, MS3) + #endif + #if AXIS_HAS_UART(Z4) + #ifndef Z4_SERIAL_TX_PIN + #define Z4_SERIAL_TX_PIN _EPIN(Z4_E_INDEX, SERIAL_TX) + #endif + #ifndef Z4_SERIAL_RX_PIN + #define Z4_SERIAL_RX_PIN _EPIN(Z4_E_INDEX, SERIAL_RX) + #endif + #endif + #if defined(Z4_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 && _PEXI(Z4_E_INDEX, DIAG) + #define Z4_DIAG_PIN _EPIN(Z4_E_INDEX, DIAG) + #if DIAG_REMAPPED(Z4, X_MIN) + #define Z4_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(Z4, Y_MIN) + #define Z4_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(Z4, Z_MIN) + #define Z4_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(Z4, X_MAX) + #define Z4_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(Z4, Y_MAX) + #define Z4_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(Z4, Z_MAX) + #define Z4_USE_ENDSTOP _ZMAX_ + #else + #define _Z4_USE_ENDSTOP(P) _E##P##_DIAG_ + #define Z4_USE_ENDSTOP _Z4_USE_ENDSTOP(Z4_E_INDEX) + #endif + #undef Z4_DIAG_PIN + #endif +#endif + +#ifndef Z4_CS_PIN + #define Z4_CS_PIN -1 +#endif +#ifndef Z4_MS1_PIN + #define Z4_MS1_PIN -1 +#endif +#ifndef Z4_MS2_PIN + #define Z4_MS2_PIN -1 +#endif +#ifndef Z4_MS3_PIN + #define Z4_MS3_PIN -1 +#endif + +#if HAS_MARLINUI_U8GLIB + #if !defined(ST7920_DELAY_1) && defined(BOARD_ST7920_DELAY_1) + #define ST7920_DELAY_1 BOARD_ST7920_DELAY_1 + #endif + #if !defined(ST7920_DELAY_2) && defined(BOARD_ST7920_DELAY_2) + #define ST7920_DELAY_2 BOARD_ST7920_DELAY_2 + #endif + #if !defined(ST7920_DELAY_3) && defined(BOARD_ST7920_DELAY_3) + #define ST7920_DELAY_3 BOARD_ST7920_DELAY_3 + #endif +#else + #undef ST7920_DELAY_1 + #undef ST7920_DELAY_2 + #undef ST7920_DELAY_3 +#endif + +#undef HAS_FREE_AUX2_PINS +#undef DIAG_REMAPPED From d3ee5d7dfe14ebea6041073724f08f679d827a75 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Oct 2020 19:25:22 -0500 Subject: [PATCH 0449/1370] Fix warning in gcode_D --- Marlin/src/HAL/LINUX/HAL.h | 2 +- Marlin/src/HAL/shared/Delay.h | 4 ++-- Marlin/src/gcode/gcode_d.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index 2e545e03d6..1c8dbfd4dc 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -23,7 +23,7 @@ #define CPU_32_BIT -#define F_CPU 100000000 +#define F_CPU 100000000UL #define SystemCoreClock F_CPU #include #include diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h index d98e960848..a48f3f79cf 100644 --- a/Marlin/src/HAL/shared/Delay.h +++ b/Marlin/src/HAL/shared/Delay.h @@ -155,7 +155,7 @@ #endif // Delay in nanoseconds -#define DELAY_NS(x) DELAY_CYCLES( (x) * (F_CPU / 1000000UL) / 1000UL ) +#define DELAY_NS(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL) / 1000UL) // Delay in microseconds -#define DELAY_US(x) DELAY_CYCLES( (x) * (F_CPU / 1000000UL) ) +#define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL)) diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 99968b625a..2fd03144c5 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -181,7 +181,7 @@ // Use a low-level delay that does not rely on interrupts to function // Do not spin forever, to avoid thermal risks if heaters are enabled and // watchdog does not work. - DELAY_US(10000000); + for (int i = 10000; i--;) DELAY_US(1000UL); ENABLE_ISRS(); SERIAL_ECHOLNPGM("FAILURE: Watchdog did not trigger board reset."); } From c3e8b462844f88118b8d0582844b8c8636ceb51c Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 23 Oct 2020 21:29:58 -0700 Subject: [PATCH 0450/1370] Fix Chitu V5/V6 FAN2 pins (#19874) --- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 33ec27ddba..6d87e6b14f 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -94,7 +94,7 @@ // #define CONTROLLER_FAN_PIN PD6 // BOARD FAN #define FAN_PIN PG13 // FAN -#define FAN_PIN_2 PG14 +#define FAN2_PIN PG14 // // Misc diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 990d33b759..bdce235841 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -103,7 +103,7 @@ // #define CONTROLLER_FAN_PIN PD6 // BOARD FAN #define FAN_PIN PG13 // FAN -#define FAN_PIN_2 PG14 +#define FAN2_PIN PG14 // // Misc From 35597ae3367d65671b2ae6d544a1158da62593af Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 24 Oct 2020 01:37:45 -0300 Subject: [PATCH 0451/1370] More MKS UI cleanup, optimization (#19869) Co-authored-by: Scott Lahteine --- Marlin/src/feature/tmc_util.h | 24 +- .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 3 +- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 32 +- .../lib/mks_ui/draw_acceleration_settings.cpp | 343 +++-------- .../lib/mks_ui/draw_advance_settings.cpp | 233 +------ .../draw_auto_level_offset_settings.cpp | 129 +--- .../extui/lib/mks_ui/draw_baby_stepping.cpp | 196 ++---- .../extui/lib/mks_ui/draw_change_speed.cpp | 254 +++----- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 582 +++++++----------- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 77 +-- .../extui/lib/mks_ui/draw_eeprom_settings.cpp | 155 +---- .../lib/mks_ui/draw_encoder_settings.cpp | 74 +-- .../extui/lib/mks_ui/draw_error_message.cpp | 16 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 234 +++---- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 144 ++--- .../extui/lib/mks_ui/draw_filament_change.cpp | 168 ++--- .../lib/mks_ui/draw_filament_settings.cpp | 235 ++----- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 140 +---- .../draw_homing_sensitivity_settings.cpp | 175 ++---- .../extui/lib/mks_ui/draw_jerk_settings.cpp | 160 ++--- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 36 +- .../lcd/extui/lib/mks_ui/draw_language.cpp | 249 +++----- .../extui/lib/mks_ui/draw_level_settings.cpp | 183 +----- .../extui/lib/mks_ui/draw_machine_para.cpp | 203 +----- .../lib/mks_ui/draw_machine_settings.cpp | 181 +----- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 216 ++----- .../mks_ui/draw_manual_level_pos_settings.cpp | 373 +++-------- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 258 ++------ .../extui/lib/mks_ui/draw_motor_settings.cpp | 256 ++------ .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 215 ++----- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 467 +++++--------- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 172 ++---- .../extui/lib/mks_ui/draw_pause_position.cpp | 128 +--- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 263 +++----- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 247 +++----- .../lcd/extui/lib/mks_ui/draw_print_file.h | 4 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 140 ++--- .../src/lcd/extui/lib/mks_ui/draw_printing.h | 18 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 88 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 217 ++----- .../extui/lib/mks_ui/draw_step_settings.cpp | 247 ++------ .../lib/mks_ui/draw_tmc_current_settings.cpp | 322 +++------- .../mks_ui/draw_tmc_step_mode_settings.cpp | 332 ++-------- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 184 ++---- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 254 ++++++-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 124 ++-- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 113 ++-- .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 97 ++- .../extui/lib/mks_ui/draw_wifi_settings.cpp | 214 +++---- .../lcd/extui/lib/mks_ui/draw_wifi_tips.cpp | 18 +- .../lcd/extui/lib/mks_ui/gb2312_puhui16.cpp | 6 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 2 +- .../extui/lib/mks_ui/printer_operation.cpp | 7 - .../lib/mks_ui/tft_lvgl_configuration.cpp | 30 +- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 4 +- buildroot/tests/mks_robin_nano35-tests | 12 + 56 files changed, 2688 insertions(+), 6566 deletions(-) diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index abde342307..b21b89f68b 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -103,9 +103,11 @@ class TMCMarlin : public TMC, public TMCStorage { inline uint16_t get_microstep_counter() { return TMC::MSCNT(); } #if HAS_STEALTHCHOP - inline void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); } - inline bool get_stealthChop() { return this->en_pwm_mode(); } - inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } + inline bool get_stealthChop() { return this->en_pwm_mode(); } + inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } + inline void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); } + inline void set_stealthChop(const bool stch) { this->stored.stealthChop_enabled = stch; refresh_stepping_mode(); } + inline bool toggle_stepping_mode() { set_stealthChop(!this->stored.stealthChop_enabled); return get_stealthChop(); } #endif #if ENABLED(HYBRID_THRESHOLD) @@ -170,9 +172,11 @@ class TMCMarlin : public TMC220 inline uint16_t get_microstep_counter() { return TMC2208Stepper::MSCNT(); } #if HAS_STEALTHCHOP - inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } - inline bool get_stealthChop() { return !this->en_spreadCycle(); } - inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } + inline bool get_stealthChop() { return !this->en_spreadCycle(); } + inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } + inline void refresh_stepping_mode() { this->en_spreadCycle(!this->stored.stealthChop_enabled); } + inline void set_stealthChop(const bool stch) { this->stored.stealthChop_enabled = stch; refresh_stepping_mode(); } + inline bool toggle_stepping_mode() { set_stealthChop(!this->stored.stealthChop_enabled); return get_stealthChop(); } #endif #if ENABLED(HYBRID_THRESHOLD) @@ -216,9 +220,11 @@ class TMCMarlin : public TMC220 inline uint16_t get_microstep_counter() { return TMC2209Stepper::MSCNT(); } #if HAS_STEALTHCHOP - inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } - inline bool get_stealthChop() { return !this->en_spreadCycle(); } - inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } + inline bool get_stealthChop() { return !this->en_spreadCycle(); } + inline bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; } + inline void refresh_stepping_mode() { this->en_spreadCycle(!this->stored.stealthChop_enabled); } + inline void set_stealthChop(const bool stch) { this->stored.stealthChop_enabled = stch; refresh_stepping_mode(); } + inline bool toggle_stepping_mode() { set_stealthChop(!this->stored.stealthChop_enabled); return get_stealthChop(); } #endif #if ENABLED(HYBRID_THRESHOLD) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index 3f57124451..e028b3e6ec 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -183,10 +183,9 @@ void SPIFlashStorage::loadPage(uint8_t* buffer) { // Test env // char fname[256]; - // memset(buffer, 0, SPI_FLASH_PageSize); // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); // FILE *fp = fopen(fname, "rb"); - // if (fp != NULL) { + // if (fp != nullptr) { // fread(buffer, 1, SPI_FLASH_PageSize, fp); // fclose(fp); // } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index 48a2cb1362..b5e59692fd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -32,22 +32,18 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t * fw_type, *board; //*fw_version; +extern lv_group_t *g; +static lv_obj_t *scr; +static lv_obj_t *fw_type, *board; //*fw_version; -#define ID_A_RETURN 1 +enum { ID_A_RETURN = 1 }; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_A_RETURN: - if (event == LV_EVENT_CLICKED) { - // do nothing - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } + clear_cur_ui(); + draw_return_ui(); break; } } @@ -59,11 +55,7 @@ void lv_draw_about(void) { } disp_state = ABOUT_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); @@ -84,13 +76,13 @@ void lv_draw_about(void) { } //fw_version = lv_label_create(scr, SHORT_BUILD_VERSION); - //lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60); + //lv_obj_align(fw_version, nullptr, LV_ALIGN_CENTER, 0, -60); fw_type = lv_label_create(scr, "Firmware: Marlin " SHORT_BUILD_VERSION); - lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(fw_type, nullptr, LV_ALIGN_CENTER, 0, -20); board = lv_label_create(scr, "Board: " BOARD_INFO_NAME); - lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, -60); + lv_obj_align(board, nullptr, LV_ALIGN_CENTER, 0, -60); } void lv_clear_about() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index 95bba3b549..9b86929bca 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -29,331 +29,128 @@ #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_ACCE_RETURN 1 -#define ID_ACCE_PRINT 2 -#define ID_ACCE_RETRA 3 -#define ID_ACCE_TRAVEL 4 -#define ID_ACCE_X 5 -#define ID_ACCE_Y 6 -#define ID_ACCE_Z 7 -#define ID_ACCE_E0 8 -#define ID_ACCE_E1 9 -#define ID_ACCE_UP 10 -#define ID_ACCE_DOWN 11 +enum { + ID_ACCE_RETURN = 1, + ID_ACCE_PRINT, + ID_ACCE_RETRA, + ID_ACCE_TRAVEL, + ID_ACCE_X, + ID_ACCE_Y, + ID_ACCE_Z, + ID_ACCE_E0, + ID_ACCE_E1, + ID_ACCE_UP, + ID_ACCE_DOWN +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_ACCE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_acceleration_settings(); - draw_return_ui(); - } + uiCfg.para_ui_page = 0; + lv_clear_acceleration_settings(); + draw_return_ui(); break; case ID_ACCE_PRINT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = PrintAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } + value = PrintAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); break; case ID_ACCE_RETRA: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = RetractAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } + value = RetractAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); break; case ID_ACCE_TRAVEL: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = TravelAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } + value = TravelAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); break; case ID_ACCE_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = XAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } + value = XAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); break; case ID_ACCE_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = YAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } + value = YAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); break; case ID_ACCE_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = ZAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } + value = ZAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); break; case ID_ACCE_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E0Acceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } + value = E0Acceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); break; case ID_ACCE_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E1Acceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } + value = E1Acceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); break; case ID_ACCE_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_acceleration_settings(); - lv_draw_acceleration_settings(); - } + uiCfg.para_ui_page = 0; + lv_clear_acceleration_settings(); + lv_draw_acceleration_settings(); break; case ID_ACCE_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_acceleration_settings(); - lv_draw_acceleration_settings(); - } + uiCfg.para_ui_page = 1; + lv_clear_acceleration_settings(); + lv_draw_acceleration_settings(); break; } } void lv_draw_acceleration_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonPrintValue = NULL, *labelPrintValue = NULL; - lv_obj_t *buttonRetraValue = NULL, *labelRetraValue = NULL; - lv_obj_t *buttonTravelValue = NULL, *labelTravelValue = NULL; - lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *buttonE1Value = NULL, *labelE1Value = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ACCELERATION_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = ACCELERATION_UI; } disp_state = ACCELERATION_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.AccelerationConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.acceleration); + lv_screen_menu_item_1_edit(scr, machine_menu.PrintAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ACCE_PRINT, 0, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.PrintAcceleration); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.retract_acceleration); + lv_screen_menu_item_1_edit(scr, machine_menu.RetractAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_ACCE_RETRA, 1, public_buf_l); - buttonPrintValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_PRINT); - labelPrintValue = lv_label_create_empty(buttonPrintValue); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.travel_acceleration); + lv_screen_menu_item_1_edit(scr, machine_menu.TravelAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_ACCE_TRAVEL, 2, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.X_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_ACCE_X, 3, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.RetractAcceleration); - - buttonRetraValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_RETRA); - labelRetraValue = lv_label_create_empty(buttonRetraValue); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.TravelAcceleration); - - buttonTravelValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_TRAVEL); - labelTravelValue = lv_label_create_empty(buttonTravelValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.X_Acceleration); - - buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_X); - labelXValue = lv_label_create_empty(buttonXValue); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create_back(scr, event_handler, ID_ACCE_DOWN); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPrintValue); - lv_group_add_obj(g, buttonRetraValue); - lv_group_add_obj(g, buttonTravelValue); - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_ACCE_DOWN, true); } else { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.Y_Acceleration); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.Y_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ACCE_Y, 0, public_buf_l); - buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_Y); - labelYValue = lv_label_create_empty(buttonYValue); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.Z_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_ACCE_Z, 1, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.E0_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_ACCE_E0, 2, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Z_Acceleration); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); + lv_screen_menu_item_1_edit(scr, machine_menu.E1_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_ACCE_E1, 3, public_buf_l); - buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_Z); - labelZValue = lv_label_create_empty(buttonZValue); - - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.E0_Acceleration); - - buttonE0Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_E0); - labelE0Value = lv_label_create_empty(buttonE0Value); - - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E1_Acceleration); - - buttonE1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_ACCE_E1); - labelE1Value = lv_label_create_empty(buttonE1Value); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create_back(scr, event_handler, ID_ACCE_UP); - //lv_imgbtn_set_src_both(buttonTurnPage, "F:/bmp_back70x40.bin"); - //lv_imgbtn_use_label_style(buttonTurnPage); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonE0Value); - lv_group_add_obj(g, buttonE1Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_ACCE_UP, true); } - //lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - //lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); - //labelTurnPage = lv_label_create_empty(buttonTurnPage); - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create_empty(buttonTurnPage); - - buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_ACCE_RETURN); - //lv_imgbtn_set_src_both(buttonBack, "F:/bmp_back70x40.bin"); - //lv_imgbtn_use_label_style(buttonBack); - label_Back = lv_label_create_empty(buttonBack); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - //lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - //lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - if (gCfgItems.multiple_language) { - if (uiCfg.para_ui_page != 1) { - - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.acceleration); - lv_label_set_text(labelPrintValue, public_buf_l); - lv_obj_align(labelPrintValue, buttonPrintValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.retract_acceleration); - lv_label_set_text(labelRetraValue, public_buf_l); - lv_obj_align(labelRetraValue, buttonRetraValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.travel_acceleration); - lv_label_set_text(labelTravelValue, public_buf_l); - lv_obj_align(labelTravelValue, buttonTravelValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - } - else { - - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); - lv_label_set_text(labelE1Value, public_buf_l); - lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_ACCE_RETURN, true); } void lv_clear_acceleration_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp index 99de179a9c..5c3b067682 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -28,248 +28,71 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_ADVANCE_RETURN 1 -#define ID_PAUSE_POS 2 -#define ID_PAUSE_POS_ARROW 3 -#define ID_WIFI_PARA 4 -#define ID_WIFI_PARA_ARROW 5 -#define ID_FILAMENT_SETTINGS 6 -#define ID_FILAMENT_SETTINGS_ARROW 7 -#define ID_ENCODER_SETTINGS 8 -#define ID_ENCODER_SETTINGS_ARROW 9 +enum { + ID_ADVANCE_RETURN = 1, + ID_PAUSE_POS, + ID_WIFI_PARA, + ID_FILAMENT_SETTINGS, + ID_ENCODER_SETTINGS +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_ADVANCE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - draw_return_ui(); - } + lv_clear_advance_settings(); + draw_return_ui(); break; case ID_PAUSE_POS: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_pause_position(); - } - break; - case ID_PAUSE_POS_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_pause_position(); - } + lv_clear_advance_settings(); + lv_draw_pause_position(); break; case ID_FILAMENT_SETTINGS: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_filament_settings(); - } - break; - case ID_FILAMENT_SETTINGS_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_filament_settings(); - } + lv_clear_advance_settings(); + lv_draw_filament_settings(); break; #if ENABLED(USE_WIFI_FUNCTION) case ID_WIFI_PARA: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_wifi_settings(); - } - break; - case ID_WIFI_PARA_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_wifi_settings(); - } + lv_clear_advance_settings(); + lv_draw_wifi_settings(); break; #endif #if HAS_ROTARY_ENCODER case ID_ENCODER_SETTINGS: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_encoder_settings(); - } - break; - case ID_ENCODER_SETTINGS_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_encoder_settings(); - } + lv_clear_advance_settings(); + lv_draw_encoder_settings(); break; #endif } } void lv_draw_advance_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonPausePos, *labelPausePos; - lv_obj_t *buttonFilamentSettings, *labelFilamentSettings; - lv_obj_t * line1,* line2; - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_t *buttonWifiSet, *labelWifiSet, *buttonWifiSetNarrow; - #endif - #if HAS_ROTARY_ENCODER - lv_obj_t *buttonEncoder, *labelEncoder, *buttonEncoderNarrow; - #endif - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ADVANCED_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = ADVANCED_UI; } disp_state = ADVANCED_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.AdvancedConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - buttonPausePos = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonPausePos, PARA_UI_POS_X, PARA_UI_POS_Y); - lv_obj_set_size(buttonPausePos, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonPausePos, event_handler, ID_PAUSE_POS, NULL, 0); - lv_btn_use_label_style(buttonPausePos); - lv_btn_set_layout(buttonPausePos, LV_LAYOUT_OFF); - labelPausePos = lv_label_create_empty(buttonPausePos); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPausePos); - #endif - - (void)lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_PAUSE_POS_ARROW); - - line1 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line1, line_points[0]); - - buttonFilamentSettings = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonFilamentSettings, PARA_UI_POS_X, PARA_UI_POS_Y*2); - lv_obj_set_size(buttonFilamentSettings, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonFilamentSettings, event_handler, ID_FILAMENT_SETTINGS, NULL, 0); - lv_btn_use_label_style(buttonFilamentSettings); - lv_btn_set_layout(buttonFilamentSettings, LV_LAYOUT_OFF); - labelFilamentSettings = lv_label_create_empty(buttonFilamentSettings); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonFilamentSettings); - #endif - - (void)lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y*2 + PARA_UI_ARROW_V, event_handler, ID_FILAMENT_SETTINGS_ARROW); - - line2 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line2, line_points[1]); - + int index = 0; + lv_screen_menu_item(scr, machine_menu.PausePosition, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_POS, index++); + lv_screen_menu_item(scr, machine_menu.FilamentConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FILAMENT_SETTINGS, index++); #if ENABLED(USE_WIFI_FUNCTION) - - buttonWifiSet = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonWifiSet, PARA_UI_POS_X,PARA_UI_POS_Y*3); - lv_obj_set_size(buttonWifiSet, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonWifiSet, event_handler,ID_WIFI_PARA,NULL, 0); - lv_btn_use_label_style(buttonWifiSet); - lv_btn_set_layout(buttonWifiSet, LV_LAYOUT_OFF); - labelWifiSet = lv_label_create_empty(buttonWifiSet); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonWifiSet); - #endif - - buttonWifiSetNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_WIFI_PARA_ARROW); - - lv_obj_t * line3 = lv_line_create(scr, NULL); - lv_ex_line(line3,line_points[2]); - - #if HAS_ROTARY_ENCODER - buttonEncoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonEncoder, PARA_UI_POS_X,PARA_UI_POS_Y*4); - lv_obj_set_size(buttonEncoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonEncoder, event_handler,ID_ENCODER_SETTINGS,NULL, 0); - lv_btn_use_label_style(buttonEncoder); - lv_btn_set_layout(buttonEncoder, LV_LAYOUT_OFF); - labelEncoder = lv_label_create_empty(buttonEncoder); - - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEncoder); - - buttonEncoderNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 4 + PARA_UI_ARROW_V, event_handler, ID_ENCODER_SETTINGS_ARROW); - - lv_obj_t * line4 = lv_line_create(scr, NULL); - lv_ex_line(line4,line_points[3]); - #endif - - #elif HAS_ROTARY_ENCODER - buttonEncoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonEncoder, PARA_UI_POS_X,PARA_UI_POS_Y*3); - lv_obj_set_size(buttonEncoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonEncoder, event_handler,ID_ENCODER_SETTINGS,NULL, 0); - lv_btn_use_label_style(buttonEncoder); - lv_btn_set_layout(buttonEncoder, LV_LAYOUT_OFF); - labelEncoder = lv_label_create_empty(buttonEncoder); - - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEncoder); - - buttonEncoderNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_ENCODER_SETTINGS_ARROW); - - lv_obj_t * line3 = lv_line_create(scr, NULL); - lv_ex_line(line3,line_points[2]); + lv_screen_menu_item(scr, machine_menu.WifiSettings, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_WIFI_PARA, index++); #endif - - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_ADVANCE_RETURN); #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + lv_screen_menu_item(scr, machine_menu.EncoderSettings, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_ENCODER_SETTINGS, index); + index++; #endif - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelPausePos, machine_menu.PausePosition); - lv_obj_align(labelPausePos, buttonPausePos, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelFilamentSettings, machine_menu.FilamentConf); - lv_obj_align(labelFilamentSettings, buttonFilamentSettings, LV_ALIGN_IN_LEFT_MID, 0, 0); - - #if ENABLED(USE_WIFI_FUNCTION) - lv_label_set_text(labelWifiSet, machine_menu.WifiSettings); - lv_obj_align(labelWifiSet, buttonWifiSet, LV_ALIGN_IN_LEFT_MID,0, 0); - #endif - #if HAS_ROTARY_ENCODER - lv_label_set_text(labelEncoder, machine_menu.EncoderSettings); - lv_obj_align(labelEncoder, buttonEncoder, LV_ALIGN_IN_LEFT_MID,0, 0); - #endif - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_ADVANCE_RETURN, true); } void lv_clear_advance_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp index 87632a27c9..8e40956c0f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -29,135 +29,64 @@ #include "../../../../module/probe.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_OFFSET_RETURN 1 -#define ID_OFFSET_X 2 -#define ID_OFFSET_Y 3 -#define ID_OFFSET_Z 4 +enum { + ID_OFFSET_RETURN = 1, + ID_OFFSET_X, + ID_OFFSET_Y, + ID_OFFSET_Z +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_OFFSET_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_auto_level_offset_settings(); - draw_return_ui(); - } + lv_clear_auto_level_offset_settings(); + draw_return_ui(); break; case ID_OFFSET_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = x_offset; - lv_clear_auto_level_offset_settings(); - lv_draw_number_key(); - } + value = x_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); break; case ID_OFFSET_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = y_offset; - lv_clear_auto_level_offset_settings(); - lv_draw_number_key(); - } + value = y_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); break; case ID_OFFSET_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = z_offset; - lv_clear_auto_level_offset_settings(); - lv_draw_number_key(); - } + value = z_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); break; } } void lv_draw_auto_level_offset_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NOZZLE_PROBE_OFFSET_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = NOZZLE_PROBE_OFFSET_UI; } disp_state = NOZZLE_PROBE_OFFSET_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.OffsetConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.Xoffset); + sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); + lv_screen_menu_item_1_edit(scr, machine_menu.Xoffset, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_OFFSET_X, 0, public_buf_l); - buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_OFFSET_X); - labelXValue = lv_label_create_empty(buttonXValue); + sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.y, 0)); + lv_screen_menu_item_1_edit(scr, machine_menu.Yoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_OFFSET_Y, 1, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%.1f"), probe.offset.z); + lv_screen_menu_item_1_edit(scr, machine_menu.Zoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_OFFSET_Z, 2, public_buf_l); - lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Yoffset); - - buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_OFFSET_Y); - labelYValue = lv_label_create_empty(buttonYValue); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Zoffset); - - buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_OFFSET_Z); - labelZValue = lv_label_create_empty(buttonZValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_OFFSET_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonBack); - } - #endif - - if (gCfgItems.multiple_language) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.y, 0)); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), probe.offset.z); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_OFFSET_RETURN, true); } void lv_clear_auto_level_offset_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp index adf69719cd..b0a004ed9e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -38,113 +38,75 @@ #include "../../../../module/probe.h" #endif -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -static lv_obj_t *labelV, *buttonV, * zOffsetText; +static lv_obj_t *labelV, *buttonV, *zOffsetText; -#define ID_BABY_STEP_X_P 1 -#define ID_BABY_STEP_X_N 2 -#define ID_BABY_STEP_Y_P 3 -#define ID_BABY_STEP_Y_N 4 -#define ID_BABY_STEP_Z_P 5 -#define ID_BABY_STEP_Z_N 6 -#define ID_BABY_STEP_DIST 7 -#define ID_BABY_STEP_RETURN 8 +enum { + ID_BABY_STEP_X_P = 1, + ID_BABY_STEP_X_N, + ID_BABY_STEP_Y_P, + ID_BABY_STEP_Y_N, + ID_BABY_STEP_Z_P, + ID_BABY_STEP_Z_N, + ID_BABY_STEP_DIST, + ID_BABY_STEP_RETURN +}; static float babystep_dist=0.01; static uint8_t has_adjust_z = 0; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; char baby_buf[30] = { 0 }; switch (obj->mks_obj_id) { case ID_BABY_STEP_X_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - sprintf_P(baby_buf, PSTR("M290 X%.3f"),babystep_dist); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } + sprintf_P(baby_buf, PSTR("M290 X%.3f"), babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; break; case ID_BABY_STEP_X_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - sprintf_P(baby_buf, PSTR("M290 X%.3f"),((float)0 - babystep_dist)); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } + sprintf_P(baby_buf, PSTR("M290 X%.3f"), -babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; break; case ID_BABY_STEP_Y_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - sprintf_P(baby_buf, PSTR("M290 Y%.3f"), babystep_dist); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } + sprintf_P(baby_buf, PSTR("M290 Y%.3f"), babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; break; case ID_BABY_STEP_Y_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - sprintf_P(baby_buf, PSTR("M290 Y%.3f"),((float)0 - babystep_dist)); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } + sprintf_P(baby_buf, PSTR("M290 Y%.3f"), -babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; break; case ID_BABY_STEP_Z_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } + sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; break; case ID_BABY_STEP_Z_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - sprintf_P(baby_buf, PSTR("M290 Z%.3f"),((float)0 - babystep_dist)); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } + sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; break; case ID_BABY_STEP_DIST: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (abs((int)(100 * babystep_dist)) == 1) - babystep_dist = 0.05; - else if (abs((int)(100 * babystep_dist)) == 5) - babystep_dist = 0.1; - else - babystep_dist = 0.01; - disp_baby_step_dist(); - } - + if (abs((int)(100 * babystep_dist)) == 1) + babystep_dist = 0.05; + else if (abs((int)(100 * babystep_dist)) == 5) + babystep_dist = 0.1; + else + babystep_dist = 0.01; + disp_baby_step_dist(); break; case ID_BABY_STEP_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (has_adjust_z == 1) { - TERN_(EEPROM_SETTINGS, (void)settings.save()); - has_adjust_z = 0; - } - clear_cur_ui(); - draw_return_ui(); + if (has_adjust_z == 1) { + TERN_(EEPROM_SETTINGS, (void)settings.save()); + has_adjust_z = 0; } + clear_cur_ui(); + draw_return_ui(); break; } } @@ -156,75 +118,31 @@ void lv_draw_baby_stepping(void) { } disp_state = BABY_STEP_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - // Create an Image button - lv_obj_t *buttonXI = lv_imgbtn_create(scr, "F:/bmp_xAdd.bin", INTERVAL_V, titleHeight, event_handler, ID_BABY_STEP_X_P); - lv_obj_t *buttonXD = lv_imgbtn_create(scr, "F:/bmp_xDec.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_X_N); - lv_obj_t *buttonYI = lv_imgbtn_create(scr, "F:/bmp_yAdd.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_BABY_STEP_Y_P); - lv_obj_t *buttonYD = lv_imgbtn_create(scr, "F:/bmp_yDec.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_Y_N); - lv_obj_t *buttonZI = lv_imgbtn_create(scr, "F:/bmp_zAdd.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_BABY_STEP_Z_P); - lv_obj_t *buttonZD = lv_imgbtn_create(scr, "F:/bmp_zDec.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_Z_N); - buttonV = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_BABY_STEP_DIST); - lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_RETURN); - - // Create labels on the image buttons - lv_obj_t *labelXI = lv_label_create_empty(buttonXI); - lv_obj_t *labelXD = lv_label_create_empty(buttonXD); - lv_obj_t *labelYI = lv_label_create_empty(buttonYI); - lv_obj_t *labelYD = lv_label_create_empty(buttonYD); - lv_obj_t *labelZI = lv_label_create_empty(buttonZI); - lv_obj_t *labelZD = lv_label_create_empty(buttonZD); + lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_V, titleHeight, event_handler, ID_BABY_STEP_X_P); + lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_X_N); + lv_big_button_create(scr, "F:/bmp_yAdd.bin", move_menu.y_add, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_BABY_STEP_Y_P); + lv_big_button_create(scr, "F:/bmp_yDec.bin", move_menu.y_dec, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_Y_N); + lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_BABY_STEP_Z_P); + lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_Z_N); + buttonV = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_BABY_STEP_DIST); labelV = lv_label_create_empty(buttonV); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(labelXI, move_menu.x_add); - lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelXD, move_menu.x_dec); - lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelYI, move_menu.y_add); - lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelYD, move_menu.y_dec); - lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelZI, move_menu.z_add); - lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelZD, move_menu.z_dec); - lv_obj_align(labelZD, buttonZD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXI); - lv_group_add_obj(g, buttonXD); - lv_group_add_obj(g, buttonYI); - lv_group_add_obj(g, buttonYD); - lv_group_add_obj(g, buttonZI); - lv_group_add_obj(g, buttonZD); lv_group_add_obj(g, buttonV); - lv_group_add_obj(g, buttonBack); } #endif + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_RETURN); + disp_baby_step_dist(); - zOffsetText = lv_label_create(scr, 290, TITLE_YPOS, NULL); + zOffsetText = lv_label_create(scr, 290, TITLE_YPOS, nullptr); disp_z_offset_value(); } @@ -255,7 +173,7 @@ void disp_baby_step_dist() { void disp_z_offset_value() { char buf[20]; - sprintf_P(buf, PSTR("offset Z: %.3f"), (double)TERN(HAS_BED_PROBE, probe.offset.z, 0)); + sprintf_P(buf, PSTR("offset Z: %.3f"), (float)TERN(HAS_BED_PROBE, probe.offset.z, 0)); lv_label_set_text(zOffsetText, buf); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index 848b625559..05158b181c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -33,179 +33,136 @@ #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; static lv_obj_t *labelStep, *buttonStep, *buttonMov, *buttonExt; static lv_obj_t *labelMov, *labelExt; -static lv_obj_t * printSpeedText; +static lv_obj_t *printSpeedText; -#define ID_C_ADD 1 -#define ID_C_DEC 2 -#define ID_C_MOVE 3 -#define ID_C_EXT 4 -#define ID_C_STEP 5 -#define ID_C_RETURN 6 +enum { + ID_C_ADD = 1, + ID_C_DEC, + ID_C_MOVE, + ID_C_EXT, + ID_C_STEP, + ID_C_RETURN +}; -static uint8_t speedType; +static bool editingFlowrate; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_C_ADD: - if (event == LV_EVENT_CLICKED) { - // nothing to do + if (!editingFlowrate) { + if (feedrate_percentage < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed) + feedrate_percentage += uiCfg.stepPrintSpeed; + else + feedrate_percentage = MAX_EXT_SPEED_PERCENT; } - else if (event == LV_EVENT_RELEASED) { - if (speedType == 0) { - if (feedrate_percentage < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed) - feedrate_percentage += uiCfg.stepPrintSpeed; - else - feedrate_percentage = MAX_EXT_SPEED_PERCENT; - } - else if (speedType == 1) { - if (planner.flow_percentage[0] < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed) - planner.flow_percentage[0] += uiCfg.stepPrintSpeed; - else - planner.flow_percentage[0] = MAX_EXT_SPEED_PERCENT; - //planner.e_factor[0]= planner.flow_percentage[0]*0.01; - //planner.flow_percentage[1] = planner.flow_percentage[0]; - //planner.e_factor[1]= planner.flow_percentage[1]*0.01; - planner.refresh_e_factor(0); - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = planner.flow_percentage[0]; - planner.refresh_e_factor(1); - #endif - } - disp_print_speed(); + else { + if (planner.flow_percentage[0] < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed) + planner.flow_percentage[0] += uiCfg.stepPrintSpeed; + else + planner.flow_percentage[0] = MAX_EXT_SPEED_PERCENT; + //planner.e_factor[0]= planner.flow_percentage[0]*0.01; + //planner.flow_percentage[1] = planner.flow_percentage[0]; + //planner.e_factor[1]= planner.flow_percentage[1]*0.01; + planner.refresh_e_factor(0); + #if HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = planner.flow_percentage[0]; + planner.refresh_e_factor(1); + #endif } + disp_print_speed(); break; case ID_C_DEC: - if (event == LV_EVENT_CLICKED) { - // nothing to do + if (!editingFlowrate) { + if (feedrate_percentage > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed) + feedrate_percentage -= uiCfg.stepPrintSpeed; + else + feedrate_percentage = MIN_EXT_SPEED_PERCENT; } - else if (event == LV_EVENT_RELEASED) { - if (speedType == 0) { - if (feedrate_percentage > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed) - feedrate_percentage -= uiCfg.stepPrintSpeed; - else - feedrate_percentage = MIN_EXT_SPEED_PERCENT; - } - else if (speedType == 1) { - if (planner.flow_percentage[0] > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed) - planner.flow_percentage[0] -= uiCfg.stepPrintSpeed; - else - planner.flow_percentage[0] = MIN_EXT_SPEED_PERCENT; - //planner.e_factor[0]= planner.flow_percentage[0] * 0.01; - //planner.flow_percentage[1] = planner.flow_percentage[0]; - //planner.e_factor[1]= planner.flow_percentage[1] * 0.01; - planner.refresh_e_factor(0); - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = planner.flow_percentage[0]; - planner.refresh_e_factor(1); - #endif - } - disp_print_speed(); + else { + if (planner.flow_percentage[0] > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed) + planner.flow_percentage[0] -= uiCfg.stepPrintSpeed; + else + planner.flow_percentage[0] = MIN_EXT_SPEED_PERCENT; + //planner.e_factor[0]= planner.flow_percentage[0] * 0.01; + //planner.flow_percentage[1] = planner.flow_percentage[0]; + //planner.e_factor[1]= planner.flow_percentage[1] * 0.01; + planner.refresh_e_factor(0); + #if HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = planner.flow_percentage[0]; + planner.refresh_e_factor(1); + #endif } + disp_print_speed(); break; case ID_C_MOVE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - speedType = 0; - disp_speed_type(); - disp_print_speed(); - } + editingFlowrate = false; + disp_speed_type(); + disp_print_speed(); break; case ID_C_EXT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - speedType = 1; - disp_speed_type(); - disp_print_speed(); - } + editingFlowrate = true; + disp_speed_type(); + disp_print_speed(); break; case ID_C_STEP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.stepPrintSpeed == 1) - uiCfg.stepPrintSpeed = 5; - else if (uiCfg.stepPrintSpeed == 5) - uiCfg.stepPrintSpeed = 10; - else - uiCfg.stepPrintSpeed = 1; - disp_speed_step(); - } + if (uiCfg.stepPrintSpeed == 1) + uiCfg.stepPrintSpeed = 5; + else if (uiCfg.stepPrintSpeed == 5) + uiCfg.stepPrintSpeed = 10; + else + uiCfg.stepPrintSpeed = 1; + disp_speed_step(); break; case ID_C_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } + clear_cur_ui(); + draw_return_ui(); break; } } void lv_draw_change_speed(void) { - lv_obj_t *buttonAdd, *buttonDec; - lv_obj_t *buttonBack; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != CHANGE_SPEED_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = CHANGE_SPEED_UI; } disp_state = CHANGE_SPEED_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonAdd = lv_imgbtn_create(scr, "F:/bmp_Add.bin", INTERVAL_V, titleHeight, event_handler, ID_C_ADD); - buttonDec = lv_imgbtn_create(scr, "F:/bmp_Dec.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_C_DEC); - buttonMov = lv_imgbtn_create(scr, NULL, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_MOVE); - buttonExt = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_EXT); - buttonStep = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_STEP); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_RETURN); - - // Create labels on the image buttons - lv_obj_t *labelAdd = lv_label_create_empty(buttonAdd); - lv_obj_t *labelDec = lv_label_create_empty(buttonDec); - labelMov = lv_label_create_empty(buttonMov); - labelExt = lv_label_create_empty(buttonExt); - labelStep = lv_label_create_empty(buttonStep); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(labelAdd, speed_menu.add); - lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelDec, speed_menu.dec); - lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } + lv_big_button_create(scr, "F:/bmp_Add.bin", speed_menu.add, INTERVAL_V, titleHeight, event_handler, ID_C_ADD); + lv_big_button_create(scr, "F:/bmp_Dec.bin", speed_menu.dec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_C_DEC); + buttonMov = lv_imgbtn_create(scr, nullptr, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_MOVE); + buttonExt = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_EXT); + buttonStep = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_STEP); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonMov); + lv_group_add_obj(g, buttonExt); + lv_group_add_obj(g, buttonStep); + } + #endif + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_RETURN); + + // Create labels on the image buttons + labelMov = lv_label_create_empty(buttonMov); + labelExt = lv_label_create_empty(buttonExt); + labelStep = lv_label_create_empty(buttonStep); + #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAdd); - lv_group_add_obj(g, buttonDec); lv_group_add_obj(g, buttonMov); lv_group_add_obj(g, buttonExt); lv_group_add_obj(g, buttonStep); - lv_group_add_obj(g, buttonBack); } #endif @@ -246,34 +203,27 @@ void disp_print_speed() { public_buf_l[0] = '\0'; - if (speedType == 0) { // move - strcat(public_buf_l, speed_menu.move_speed); - strcat_P(public_buf_l, PSTR(": ")); - sprintf_P(buf, PSTR("%d%%"), feedrate_percentage); - strcat(public_buf_l, buf); + int16_t val; + const char *lbl; + if (editingFlowrate) { + lbl = speed_menu.extrude_speed; + val = planner.flow_percentage[0]; } - else if (speedType == 1) { // e1 - strcat(public_buf_l, speed_menu.extrude_speed); - strcat_P(public_buf_l, PSTR(": ")); - sprintf_P(buf, PSTR("%d%%"), planner.flow_percentage[0]); - strcat(public_buf_l, buf); + else { + lbl = speed_menu.move_speed; + val = feedrate_percentage; } + strcpy(public_buf_l, lbl); + strcat_P(public_buf_l, PSTR(": ")); + sprintf_P(buf, PSTR("%d%%"), val); + strcat(public_buf_l, buf); lv_label_set_text(printSpeedText, public_buf_l); - lv_obj_align(printSpeedText, NULL, LV_ALIGN_CENTER, 0, -65); + lv_obj_align(printSpeedText, nullptr, LV_ALIGN_CENTER, 0, -65); } void disp_speed_type() { - switch (speedType) { - case 1: - lv_imgbtn_set_src_both(buttonMov, "F:/bmp_mov_changeSpeed.bin"); - lv_imgbtn_set_src_both(buttonExt, "F:/bmp_extruct_sel.bin"); - break; - - default: - lv_imgbtn_set_src_both(buttonMov, "F:/bmp_mov_sel.bin"); - lv_imgbtn_set_src_both(buttonExt, "F:/bmp_speed_extruct.bin"); - break; - } + lv_imgbtn_set_src_both(buttonMov, editingFlowrate ? "F:/bmp_mov_changeSpeed.bin" : "F:/bmp_mov_sel.bin"); + lv_imgbtn_set_src_both(buttonExt, editingFlowrate ? "F:/bmp_extruct_sel.bin" : "F:/bmp_speed_extruct.bin"); lv_obj_refresh_ext_draw_pad(buttonExt); lv_obj_refresh_ext_draw_pad(buttonMov); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 07e0665ce4..a18964919a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -55,189 +55,162 @@ #include "../../../../feature/pause.h" #endif -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t * tempText1; -static lv_obj_t * filament_bar; +extern lv_group_t *g; +static lv_obj_t *scr, *tempText1, *filament_bar; extern uint8_t sel_id; extern bool once_flag, gcode_preview_over; -extern int upload_result ; +extern int upload_result; extern uint32_t upload_time; extern uint32_t upload_size; -extern uint8_t temperature_change_frequency; +extern bool temps_update_flag; -static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) { - #if HAS_GCODE_PREVIEW - preview_gcode_prehandle(list_file.file_name[sel_id]); - #endif - reset_print_time(); - start_print_time(); +static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + if (DIALOG_IS(TYPE_PRINT_FILE)) { + #if HAS_GCODE_PREVIEW + preview_gcode_prehandle(list_file.file_name[sel_id]); + #endif + reset_print_time(); + start_print_time(); - uiCfg.print_state = WORKING; - lv_clear_dialog(); - lv_draw_printing(); + uiCfg.print_state = WORKING; + lv_clear_dialog(); + lv_draw_printing(); - #if ENABLED(SDSUPPORT) - if (!gcode_preview_over) { - char *cur_name; - cur_name = strrchr(list_file.file_name[sel_id], '/'); + #if ENABLED(SDSUPPORT) + if (!gcode_preview_over) { + char *cur_name; + cur_name = strrchr(list_file.file_name[sel_id], '/'); - SdFile file, *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01f; - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01f; - #endif - card.startFileprint(); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.prepare(); - #endif - once_flag = false; - } + SdFile file, *curDir; + card.endFilePrint(); + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_READ)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + update_spi_flash(); + } + card.openFileRead(cur_name); + if (card.isFileOpen()) { + feedrate_percentage = 100; + //saved_feedrate_percentage = feedrate_percentage; + planner.flow_percentage[0] = 100; + planner.e_factor[0] = planner.flow_percentage[0] * 0.01f; + #if HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01f; + #endif + card.startFileprint(); + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.prepare(); + #endif + once_flag = false; } - #endif - } - else if (uiCfg.dialogType == DIALOG_TYPE_STOP) { - wait_for_heatup = false; - stop_print_time(); - lv_clear_dialog(); - lv_draw_ready_print(); - - #if ENABLED(SDSUPPORT) - //card.endFilePrint(); - //wait_for_heatup = false; - uiCfg.print_state = IDLE; - card.flag.abort_sd_printing = true; - //queue.clear(); - //quickstop_stepper(); - //print_job_timer.stop(); - //thermalManager.disable_all_heaters(); - - //#if ENABLED(POWER_LOSS_RECOVERY) - // recovery.purge(); - //#endif - //queue.enqueue_now_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0")); - //queue.inject_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0\nM84\nM107")); - #endif - } - else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) { - clear_cur_ui(); - lv_draw_ready_print(); - } - #if ENABLED(ADVANCED_PAUSE_FEATURE) - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT - ) { - wait_for_user = false; - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { - pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { - clear_cur_ui(); - draw_return_ui(); } #endif - else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) { - TERN_(EEPROM_SETTINGS, (void)settings.save()); - clear_cur_ui(); - draw_return_ui(); - } - else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) { - TERN_(EEPROM_SETTINGS, (void)settings.load()); - clear_cur_ui(); - draw_return_ui(); - } - else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { - TERN_(EEPROM_SETTINGS, (void)settings.reset()); - clear_cur_ui(); - draw_return_ui(); - } - else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) { - uiCfg.configWifi = 1; - clear_cur_ui(); - draw_return_ui(); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) { - uiCfg.filament_heat_completed_load = 1; - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) { - uiCfg.filament_heat_completed_unload = 1; - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED - ) { + } + else if (DIALOG_IS(TYPE_STOP)) { + wait_for_heatup = false; + stop_print_time(); + lv_clear_dialog(); + lv_draw_ready_print(); + + #if ENABLED(SDSUPPORT) + //card.endFilePrint(); + //wait_for_heatup = false; + uiCfg.print_state = IDLE; + card.flag.abort_sd_printing = true; + //queue.clear(); + //quickstop_stepper(); + //print_job_timer.stop(); + //thermalManager.disable_all_heaters(); + + //#if ENABLED(POWER_LOSS_RECOVERY) + // recovery.purge(); + //#endif + //queue.enqueue_now_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0")); + //queue.inject_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0\nM84\nM107")); + #endif + } + else if (DIALOG_IS(TYPE_FINISH_PRINT)) { + clear_cur_ui(); + lv_draw_ready_print(); + } + #if ENABLED(ADVANCED_PAUSE_FEATURE) + else if (DIALOG_IS(PAUSE_MESSAGE_WAITING, PAUSE_MESSAGE_INSERT, PAUSE_MESSAGE_HEAT)) + wait_for_user = false; + else if (DIALOG_IS(PAUSE_MESSAGE_OPTION)) + pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; + else if (DIALOG_IS(PAUSE_MESSAGE_RESUME)) { clear_cur_ui(); draw_return_ui(); } + #endif + else if (DIALOG_IS(STORE_EEPROM_TIPS)) { + TERN_(EEPROM_SETTINGS, (void)settings.save()); + clear_cur_ui(); + draw_return_ui(); + } + else if (DIALOG_IS(READ_EEPROM_TIPS)) { + TERN_(EEPROM_SETTINGS, (void)settings.load()); + clear_cur_ui(); + draw_return_ui(); + } + else if (DIALOG_IS(REVERT_EEPROM_TIPS)) { + TERN_(EEPROM_SETTINGS, (void)settings.reset()); + clear_cur_ui(); + draw_return_ui(); + } + else if (DIALOG_IS(WIFI_CONFIG_TIPS)) { + uiCfg.configWifi = 1; + clear_cur_ui(); + draw_return_ui(); + } + else if (DIALOG_IS(TYPE_FILAMENT_HEAT_LOAD_COMPLETED)) + uiCfg.filament_heat_completed_load = 1; + else if (DIALOG_IS(TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) + uiCfg.filament_heat_completed_unload = 1; + else if (DIALOG_IS(TYPE_FILAMENT_LOAD_COMPLETED, TYPE_FILAMENT_UNLOAD_COMPLETED)) { + clear_cur_ui(); + draw_return_ui(); } } -static void btn_cancel_event_cb(lv_obj_t * btn, lv_event_t event) { - if (event == LV_EVENT_CLICKED) { - // nothing to do +static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + if (DIALOG_IS(PAUSE_MESSAGE_OPTION)) { + #if ENABLED(ADVANCED_PAUSE_FEATURE) + pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; + #endif } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { - #if ENABLED(ADVANCED_PAUSE_FEATURE) - pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; - #endif - } - else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) - ) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak; - clear_cur_ui(); - draw_return_ui(); - } - else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) - ) { - queue.enqueue_one_P(PSTR("M410")); - uiCfg.filament_rate = 0; - uiCfg.filament_loading_completed = 0; - uiCfg.filament_unloading_completed = 0; - uiCfg.filament_loading_time_flg = 0; - uiCfg.filament_loading_time_cnt = 0; - uiCfg.filament_unloading_time_flg = 0; - uiCfg.filament_unloading_time_cnt = 0; - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; - clear_cur_ui(); - draw_return_ui(); - } - else { - clear_cur_ui(); - draw_return_ui(); - } + else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT, TYPE_FILAMENT_HEAT_LOAD_COMPLETED, TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak; + clear_cur_ui(); + draw_return_ui(); + } + else if (DIALOG_IS(TYPE_FILAMENT_LOADING, TYPE_FILAMENT_UNLOADING)) { + queue.enqueue_one_P(PSTR("M410")); + uiCfg.filament_rate = 0; + uiCfg.filament_loading_completed = 0; + uiCfg.filament_unloading_completed = 0; + uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_time_cnt = 0; + uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_time_cnt = 0; + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + clear_cur_ui(); + draw_return_ui(); + } + else { + clear_cur_ui(); + draw_return_ui(); } } void lv_draw_dialog(uint8_t type) { - - lv_obj_t * btnOk = NULL; - lv_obj_t * btnCancel = NULL; + lv_obj_t *btnOk = nullptr, *btnCancel = nullptr; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != DIALOG_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = DIALOG_UI; @@ -246,153 +219,70 @@ void lv_draw_dialog(uint8_t type) { uiCfg.dialogType = type; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - static lv_style_t style_btn_rel; // A variable to store the released style - lv_style_copy(&style_btn_rel, &lv_style_plain); // Initialize from a built-in style - style_btn_rel.body.border.color = lv_color_hex3(0x269); - style_btn_rel.body.border.width = 1; - style_btn_rel.body.main_color = lv_color_hex3(0xADF); - style_btn_rel.body.grad_color = lv_color_hex3(0x46B); - style_btn_rel.body.shadow.width = 4; - style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM; - style_btn_rel.body.radius = LV_RADIUS_CIRCLE; - style_btn_rel.text.color = lv_color_hex3(0xDEF); - style_btn_rel.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - - static lv_style_t style_btn_pr; // A variable to store the pressed style - lv_style_copy(&style_btn_pr, &style_btn_rel); // Initialize from the released style - style_btn_pr.body.border.color = lv_color_hex3(0x46B); - style_btn_pr.body.main_color = lv_color_hex3(0x8BD); - style_btn_pr.body.grad_color = lv_color_hex3(0x24A); - style_btn_pr.body.shadow.width = 2; - style_btn_pr.text.color = lv_color_hex3(0xBCD); - style_btn_pr.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - - // Set button styles for Released and Pressed - auto lv_btn_use_button_style = [&](lv_obj_t *btn) { - lv_btn_set_style(btn, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btn, LV_BTN_STYLE_PR, &style_btn_pr); - }; - lv_obj_t *labelDialog = lv_label_create_empty(scr); - if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { - btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_use_button_style(btnOk); + if (DIALOG_IS(TYPE_FINISH_PRINT, PAUSE_MESSAGE_RESUME)) { + btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb); lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT - ) { - btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_use_button_style(btnOk); + else if (DIALOG_IS(PAUSE_MESSAGE_WAITING, PAUSE_MESSAGE_INSERT, PAUSE_MESSAGE_HEAT)) { + btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb); lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING - ) { + else if (DIALOG_IS(PAUSE_MESSAGE_PAUSING, PAUSE_MESSAGE_CHANGING, PAUSE_MESSAGE_UNLOAD, PAUSE_MESSAGE_LOAD, PAUSE_MESSAGE_PURGE, PAUSE_MESSAGE_RESUME, PAUSE_MESSAGE_HEATING)) { // nothing to do } - else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_use_button_style(btnCancel); + else if (DIALOG_IS(WIFI_ENABLE_TIPS)) { + btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } - else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_use_button_style(btnCancel); + else if (DIALOG_IS(TRANSFER_NO_DEVICE)) { + btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } #if ENABLED(USE_WIFI_FUNCTION) - else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) { + else if (DIALOG_IS(TYPE_UPLOAD_FILE)) { if (upload_result == 2) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_use_button_style(btnCancel); + btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } else if (upload_result == 3) { - btnOk = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnOk, 100, 50); - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_use_button_style(btnOk); + btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb); lv_obj_t *labelOk = lv_label_create_empty(btnOk); lv_label_set_text(labelOk, print_file_dialog_menu.confirm); } } - #endif //USE_WIFI_FUNCTION - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT - ) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_use_button_style(btnCancel); + #endif + else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT)) { + btnCancel = lv_button_btn_create(scr, BTN_OK_X+90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); tempText1 = lv_label_create_empty(scr); filament_sprayer_temp(); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED - ) { - btnOk = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); - lv_obj_set_size(btnOk, 100, 50); - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_use_button_style(btnOk); + else if (DIALOG_IS(TYPE_FILAMENT_LOAD_COMPLETED, TYPE_FILAMENT_UNLOAD_COMPLETED)) { + btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb); lv_obj_t *labelOk = lv_label_create_empty(btnOk); lv_label_set_text(labelOk, print_file_dialog_menu.confirm); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING - ) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_use_button_style(btnCancel); + else if (DIALOG_IS(TYPE_FILAMENT_LOADING, TYPE_FILAMENT_UNLOADING)) { + btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); - filament_bar = lv_bar_create(scr, NULL); + filament_bar = lv_bar_create(scr, nullptr); lv_obj_set_pos(filament_bar, (TFT_WIDTH-400)/2, ((TFT_HEIGHT - titleHeight)-40)/2); lv_obj_set_size(filament_bar, 400, 25); lv_bar_set_style(filament_bar, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); @@ -400,21 +290,13 @@ void lv_draw_dialog(uint8_t type) { lv_bar_set_value(filament_bar, 0, LV_ANIM_ON); } else { - btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_use_button_style(btnOk); + btnOk = lv_button_btn_create(scr, BTN_OK_X, BTN_OK_Y, 100, 50, btn_ok_event_cb); lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button - btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnCancel, BTN_CANCEL_X, BTN_CANCEL_Y); // Set its position - lv_obj_set_size(btnCancel, 100, 50); // Set its size - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_use_button_style(btnCancel); + btnCancel = lv_button_btn_create(scr, BTN_CANCEL_X, BTN_CANCEL_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); // Add a label to the button - if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + if (DIALOG_IS(PAUSE_MESSAGE_OPTION)) { lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text lv_label_set_text(labelCancel, pause_msg_menu.continuePrint); } @@ -423,105 +305,103 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } } - if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) { + if (DIALOG_IS(TYPE_PRINT_FILE)) { lv_label_set_text(labelDialog, print_file_dialog_menu.print_file); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); lv_obj_t *labelFile = lv_label_create(scr, list_file.long_name[sel_id]); - lv_obj_align(labelFile, NULL, LV_ALIGN_CENTER, 0, -60); + lv_obj_align(labelFile, nullptr, LV_ALIGN_CENTER, 0, -60); } - else if (uiCfg.dialogType == DIALOG_TYPE_STOP) { + else if (DIALOG_IS(TYPE_STOP)) { lv_label_set_text(labelDialog, print_file_dialog_menu.cancle_print); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) { + else if (DIALOG_IS(TYPE_FINISH_PRINT)) { lv_label_set_text(labelDialog, print_file_dialog_menu.print_finish); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING) { + else if (DIALOG_IS(PAUSE_MESSAGE_PAUSING)) { lv_label_set_text(labelDialog, pause_msg_menu.pausing); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING) { + else if (DIALOG_IS(PAUSE_MESSAGE_CHANGING)) { lv_label_set_text(labelDialog, pause_msg_menu.changing); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD) { + else if (DIALOG_IS(PAUSE_MESSAGE_UNLOAD)) { lv_label_set_text(labelDialog, pause_msg_menu.unload); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING) { + else if (DIALOG_IS(PAUSE_MESSAGE_WAITING)) { lv_label_set_text(labelDialog, pause_msg_menu.waiting); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT) { + else if (DIALOG_IS(PAUSE_MESSAGE_INSERT)) { lv_label_set_text(labelDialog, pause_msg_menu.insert); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD) { + else if (DIALOG_IS(PAUSE_MESSAGE_LOAD)) { lv_label_set_text(labelDialog, pause_msg_menu.load); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE) { + else if (DIALOG_IS(PAUSE_MESSAGE_PURGE)) { lv_label_set_text(labelDialog, pause_msg_menu.purge); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { + else if (DIALOG_IS(PAUSE_MESSAGE_RESUME)) { lv_label_set_text(labelDialog, pause_msg_menu.resume); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT) { + else if (DIALOG_IS(PAUSE_MESSAGE_HEAT)) { lv_label_set_text(labelDialog, pause_msg_menu.heat); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING) { + else if (DIALOG_IS(PAUSE_MESSAGE_HEATING)) { lv_label_set_text(labelDialog, pause_msg_menu.heating); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + else if (DIALOG_IS(PAUSE_MESSAGE_OPTION)) { lv_label_set_text(labelDialog, pause_msg_menu.option); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) { + else if (DIALOG_IS(STORE_EEPROM_TIPS)) { lv_label_set_text(labelDialog, eeprom_menu.storeTips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) { + else if (DIALOG_IS(READ_EEPROM_TIPS)) { lv_label_set_text(labelDialog, eeprom_menu.readTips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { + else if (DIALOG_IS(REVERT_EEPROM_TIPS)) { lv_label_set_text(labelDialog, eeprom_menu.revertTips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) { + else if (DIALOG_IS(WIFI_CONFIG_TIPS)) { lv_label_set_text(labelDialog, machine_menu.wifiConfigTips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) { + else if (DIALOG_IS(WIFI_ENABLE_TIPS)) { lv_label_set_text(labelDialog, print_file_dialog_menu.wifi_enable_tips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { + else if (DIALOG_IS(TRANSFER_NO_DEVICE)) { lv_label_set_text(labelDialog, DIALOG_UPDATE_NO_DEVICE_EN); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } #if ENABLED(USE_WIFI_FUNCTION) - else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) { + else if (DIALOG_IS(TYPE_UPLOAD_FILE)) { if (upload_result == 1) { lv_label_set_text(labelDialog, DIALOG_UPLOAD_ING_EN); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } else if (upload_result == 2) { lv_label_set_text(labelDialog, DIALOG_UPLOAD_ERROR_EN); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } else if (upload_result == 3) { char buf[200]; int _index = 0; - ZERO(buf); - strcpy(buf, DIALOG_UPLOAD_FINISH_EN); _index = strlen(buf); buf[_index] = '\n'; @@ -546,41 +426,41 @@ void lv_draw_dialog(uint8_t type) { sprintf(&buf[_index], " %d KBytes/s\n", (int)(upload_size / upload_time / 1024)); lv_label_set_text(labelDialog, buf); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } } - #endif //USE_WIFI_FUNCTION - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) { + #endif // USE_WIFI_FUNCTION + else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) { + else if (DIALOG_IS(TYPE_FILAMENT_HEAT_LOAD_COMPLETED)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat_confirm); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) { + else if (DIALOG_IS(TYPE_FILAMENT_UNLOAD_HEAT)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) { + else if (DIALOG_IS(TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat_confirm); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED) { + else if (DIALOG_IS(TYPE_FILAMENT_LOAD_COMPLETED)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_completed); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED) { + else if (DIALOG_IS(TYPE_FILAMENT_UNLOAD_COMPLETED)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_completed); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) { + else if (DIALOG_IS(TYPE_FILAMENT_LOADING)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_loading); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -70); } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) { + else if (DIALOG_IS(TYPE_FILAMENT_UNLOADING)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_unloading); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); + lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -70); } #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { @@ -592,28 +472,19 @@ void lv_draw_dialog(uint8_t type) { void filament_sprayer_temp() { char buf[20] = {0}; + sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); - public_buf_l[0] = '\0'; - - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, preheat_menu.ext1); - else - strcat(public_buf_l, preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); - + strcpy(public_buf_l, uiCfg.curSprayerChoose < 1 ? extrude_menu.ext1 : extrude_menu.ext2); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); lv_label_set_text(tempText1, public_buf_l); - lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); + lv_obj_align(tempText1, nullptr, LV_ALIGN_CENTER, 0, -50); } void filament_dialog_handle() { - if ((temperature_change_frequency == 1) - && ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT)) - ) { + if (temps_update_flag && (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT))) { filament_sprayer_temp(); - temperature_change_frequency = 0; + temps_update_flag = false; } if (uiCfg.filament_heat_completed_load == 1) { uiCfg.filament_heat_completed_load = 0; @@ -667,9 +538,8 @@ void filament_dialog_handle() { lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED); } - if ( uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING - ) lv_filament_setbar(); + if (DIALOG_IS(TYPE_FILAMENT_LOADING, TYPE_FILAMENT_UNLOADING)) + lv_filament_setbar(); } void lv_filament_setbar() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index dc5adc5ad6..c6f42d90b3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -25,52 +25,55 @@ extern "C" { /* C-declarations for C++ */ #endif -#define DIALOG_TYPE_STOP 0 -#define DIALOG_TYPE_PRINT_FILE 1 -#define DIALOG_TYPE_REPRINT_NO_FILE 2 +enum { + DIALOG_TYPE_STOP = 0, + DIALOG_TYPE_PRINT_FILE, + DIALOG_TYPE_REPRINT_NO_FILE, -#define DIALOG_TYPE_M80_FAIL 3 //** -#define DIALOG_TYPE_MESSAGE_ERR1 4 //** + DIALOG_TYPE_M80_FAIL, + DIALOG_TYPE_MESSAGE_ERR1, -#define DIALOG_TYPE_UPDATE_ESP_FIRMARE 5 -#define DIALOG_TYPE_UPDATE_ESP_DATA 6 -#define DIALOG_TYPE_UPLOAD_FILE 7 -#define DIALOG_TYPE_UNBIND 8 + DIALOG_TYPE_UPDATE_ESP_FIRMARE, + DIALOG_TYPE_UPDATE_ESP_DATA, + DIALOG_TYPE_UPLOAD_FILE, + DIALOG_TYPE_UNBIND, -#define DIALOG_TYPE_FILAMENT_LOAD_HEAT 9 -#define DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED 10 -#define DIALOG_TYPE_FILAMENT_LOADING 11 -#define DIALOG_TYPE_FILAMENT_LOAD_COMPLETED 12 -#define DIALOG_TYPE_FILAMENT_UNLOAD_HEAT 13 -#define DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED 14 -#define DIALOG_TYPE_FILAMENT_UNLOADING 15 -#define DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED 16 + DIALOG_TYPE_FILAMENT_LOAD_HEAT, + DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED, + DIALOG_TYPE_FILAMENT_LOADING, + DIALOG_TYPE_FILAMENT_LOAD_COMPLETED, + DIALOG_TYPE_FILAMENT_UNLOAD_HEAT, + DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED, + DIALOG_TYPE_FILAMENT_UNLOADING, + DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED, -#define DIALOG_TYPE_FILE_LOADING 17 //** + DIALOG_TYPE_FILE_LOADING, -#define DIALOG_TYPE_FILAMENT_NO_PRESS 18 -#define DIALOG_TYPE_FINISH_PRINT 19 + DIALOG_TYPE_FILAMENT_NO_PRESS, + DIALOG_TYPE_FINISH_PRINT, -#define WIFI_ENABLE_TIPS 20 + DIALOG_WIFI_ENABLE_TIPS, -#define DIALOG_PAUSE_MESSAGE_PAUSING 21 -#define DIALOG_PAUSE_MESSAGE_CHANGING 22 -#define DIALOG_PAUSE_MESSAGE_UNLOAD 23 -#define DIALOG_PAUSE_MESSAGE_WAITING 24 -#define DIALOG_PAUSE_MESSAGE_INSERT 25 -#define DIALOG_PAUSE_MESSAGE_LOAD 26 -#define DIALOG_PAUSE_MESSAGE_PURGE 27 -#define DIALOG_PAUSE_MESSAGE_RESUME 28 -#define DIALOG_PAUSE_MESSAGE_HEAT 29 -#define DIALOG_PAUSE_MESSAGE_HEATING 30 -#define DIALOG_PAUSE_MESSAGE_OPTION 31 + DIALOG_PAUSE_MESSAGE_PAUSING, + DIALOG_PAUSE_MESSAGE_CHANGING, + DIALOG_PAUSE_MESSAGE_UNLOAD, + DIALOG_PAUSE_MESSAGE_WAITING, + DIALOG_PAUSE_MESSAGE_INSERT, + DIALOG_PAUSE_MESSAGE_LOAD, + DIALOG_PAUSE_MESSAGE_PURGE, + DIALOG_PAUSE_MESSAGE_RESUME, + DIALOG_PAUSE_MESSAGE_HEAT, + DIALOG_PAUSE_MESSAGE_HEATING, + DIALOG_PAUSE_MESSAGE_OPTION, -#define DIALOG_STORE_EEPROM_TIPS 32 -#define DIALOG_READ_EEPROM_TIPS 33 -#define DIALOG_REVERT_EEPROM_TIPS 34 + DIALOG_STORE_EEPROM_TIPS, + DIALOG_READ_EEPROM_TIPS, + DIALOG_REVERT_EEPROM_TIPS, + + DIALOG_WIFI_CONFIG_TIPS, + DIALOG_TRANSFER_NO_DEVICE +}; -#define DIALOG_WIFI_CONFIG_TIPS 35 -#define DIALOG_TRANSFER_NO_DEVICE 36 #define BTN_OK_X 100 #define BTN_OK_Y 180 #define BTN_CANCEL_X 280 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp index 59e04e7402..5e5c6b4907 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp @@ -28,163 +28,58 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_EEPROM_RETURN 1 -#define ID_EEPROM_STORE 2 -#define ID_EEPROM_STORE_ARROW 3 -#define ID_EEPROM_READ 4 -#define ID_EEPROM_READ_ARROW 5 -#define ID_EEPROM_REVERT 6 -#define ID_EEPROM_REVERT_ARROW 7 +enum { + ID_EEPROM_RETURN = 1, + ID_EEPROM_STORE, + ID_EEPROM_STORE_ARROW, + ID_EEPROM_READ, + ID_EEPROM_READ_ARROW, + ID_EEPROM_REVERT, + ID_EEPROM_REVERT_ARROW +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_EEPROM_RETURN: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - draw_return_ui(); - } + lv_clear_eeprom_settings(); + draw_return_ui(); break; case ID_EEPROM_STORE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); - } - break; - case ID_EEPROM_STORE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); - } + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); break; #if 0 case ID_EEPROM_READ: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_READ_EEPROM_TIPS); - } - break; - case ID_EEPROM_READ_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_READ_EEPROM_TIPS); - } + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_READ_EEPROM_TIPS); break; #endif - case ID_EEPROM_REVERT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_REVERT_EEPROM_TIPS); - } - break; - case ID_EEPROM_REVERT_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_REVERT_EEPROM_TIPS); - } + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_REVERT_EEPROM_TIPS); break; } } void lv_draw_eeprom_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonStore, *labelStore; - //lv_obj_t *buttonRead,*labelRead,*buttonReadNarrow; - lv_obj_t *buttonRevert, *labelRevert; - lv_obj_t * line1, * line2; //* line3; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EEPROM_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = EEPROM_SETTINGS_UI; } disp_state = EEPROM_SETTINGS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - lv_refr_now(lv_refr_get_disp_refreshing()); - buttonRevert = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonRevert, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonRevert, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonRevert, event_handler, ID_EEPROM_REVERT, NULL, 0); - lv_btn_use_label_style(buttonRevert); - lv_btn_set_layout(buttonRevert, LV_LAYOUT_OFF); - labelRevert = lv_label_create_empty(buttonRevert); /*Add a label to the button*/ - - (void)lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_EEPROM_REVERT_ARROW); - - //line3 = lv_line_create(scr, NULL); - //lv_ex_line(line3,line_points[2]); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonStore = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonStore, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonStore, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonStore, event_handler, ID_EEPROM_STORE, NULL, 0); - lv_btn_use_label_style(buttonStore); - lv_btn_set_layout(buttonStore, LV_LAYOUT_OFF); - labelStore = lv_label_create_empty(buttonStore); /*Add a label to the button*/ - - (void)lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_EEPROM_STORE_ARROW); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_EEPROM_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelStore, eeprom_menu.store); - lv_obj_align(labelStore, buttonStore, LV_ALIGN_IN_LEFT_MID,0, 0); - - //lv_label_set_text(labelRead, eeprom_menu.read); - //lv_obj_align(labelRead, buttonRead, LV_ALIGN_IN_LEFT_MID,0, 0); - - lv_label_set_text(labelRevert, eeprom_menu.revert); - lv_obj_align(labelRevert, buttonRevert, LV_ALIGN_IN_LEFT_MID, 0, 0); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonRevert); - lv_group_add_obj(g, buttonStore); - lv_group_add_obj(g, buttonBack); - } - #endif - + lv_screen_menu_item(scr, eeprom_menu.revert, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_EEPROM_REVERT, 0); + lv_screen_menu_item(scr, eeprom_menu.store, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_EEPROM_STORE, 1); + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_EEPROM_RETURN, true); } void lv_clear_eeprom_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp index 096e72878a..35bbc6f061 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp @@ -30,84 +30,44 @@ #if BUTTONS_EXIST(EN1, EN2) -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t * buttonEncoderState = NULL; -static lv_obj_t *labelEncoderState = NULL; +extern lv_group_t *g; +static lv_obj_t *scr; +static lv_obj_t *buttonEncoderState = nullptr; -#define ID_ENCODER_RETURN 1 -#define ID_ENCODER_STATE 2 +enum { + ID_ENCODER_RETURN = 1, + ID_ENCODER_STATE +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_ENCODER_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_encoder_settings(); - draw_return_ui(); - } + lv_clear_encoder_settings(); + draw_return_ui(); break; case ID_ENCODER_STATE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - gCfgItems.encoder_enable ^= true; - lv_imgbtn_set_src_both(buttonEncoderState, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); - lv_label_set_text(labelEncoderState, machine_menu.enable); - update_spi_flash(); - } + gCfgItems.encoder_enable ^= true; + lv_screen_menu_item_onoff_update(buttonEncoderState, gCfgItems.encoder_enable); + update_spi_flash(); break; } } void lv_draw_encoder_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelEncoderTips = NULL; - - lv_obj_t * line1 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ENCODER_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = ENCODER_SETTINGS_UI; } disp_state = ENCODER_SETTINGS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.EncoderConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); - labelEncoderTips = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.EncoderConfText); + buttonEncoderState = lv_screen_menu_item_onoff(scr, machine_menu.EncoderConfText, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ENCODER_STATE, 0, gCfgItems.encoder_enable); - buttonEncoderState = lv_imgbtn_create(scr, gCfgItems.encoder_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V, event_handler, ID_ENCODER_STATE); - labelEncoderState = lv_label_create_empty(buttonEncoderState); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_ENCODER_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - lv_label_set_text(labelEncoderState, gCfgItems.encoder_enable ? machine_menu.enable : machine_menu.disable); - lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonEncoderState); - lv_group_add_obj(g, buttonBack); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_ENCODER_RETURN, true); } void lv_clear_encoder_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index 435b91e1d8..e82229c909 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -36,35 +36,31 @@ #include "mks_hardware_test.h" #include "../../../../inc/MarlinConfig.h" -static lv_obj_t * scr; +static lv_obj_t *scr; void lv_draw_error_message(PGM_P const msg) { #if 0 - static lv_obj_t * message = NULL, *kill_message = NULL, *reset_tips = NULL; + static lv_obj_t *message = nullptr, *kill_message = nullptr, *reset_tips = nullptr; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ERROR_MESSAGE_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = ERROR_MESSAGE_UI; } disp_state = ERROR_MESSAGE_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); lv_refr_now(lv_refr_get_disp_refreshing()); if (msg) { message = lv_label_create(scr, msg); - lv_obj_align(message, NULL, LV_ALIGN_CENTER, 0, -50); + lv_obj_align(message, nullptr, LV_ALIGN_CENTER, 0, -50); } kill_message = lv_label_create(scr, "PRINTER HALTED"); - lv_obj_align(kill_message, NULL, LV_ALIGN_CENTER, 0, -10); + lv_obj_align(kill_message, nullptr, LV_ALIGN_CENTER, 0, -10); reset_tips = lv_label_create(scr, "Please Reset"); - lv_obj_align(reset_tips, NULL, LV_ALIGN_CENTER, 0, 30); + lv_obj_align(reset_tips, nullptr, LV_ALIGN_CENTER, 0, 30); lv_task_handler(); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 6402040898..9f803afea9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -43,172 +43,121 @@ static lv_obj_t *labelSpeed; static lv_obj_t *tempText; static lv_obj_t *ExtruText; -#define ID_E_ADD 1 -#define ID_E_DEC 2 -#define ID_E_TYPE 3 -#define ID_E_STEP 4 -#define ID_E_SPEED 5 -#define ID_E_RETURN 6 +enum { + ID_E_ADD = 1, + ID_E_DEC, + ID_E_TYPE, + ID_E_STEP, + ID_E_SPEED, + ID_E_RETURN +}; -static int32_t extructAmount; +static int32_t extrudeAmount; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_E_ADD: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { - queue.enqueue_now_P(PSTR("G91")); - ZERO(public_buf_l); - sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), uiCfg.extruStep, 60 * uiCfg.extruSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - extructAmount += uiCfg.extruStep; - disp_extru_amount(); - } - } - break; - case ID_E_DEC: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { - queue.enqueue_now_P(PSTR("G91")); - ZERO(public_buf_l); - sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - extructAmount -= uiCfg.extruStep; - disp_extru_amount(); - } - } - break; - case ID_E_TYPE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (ENABLED(HAS_MULTI_EXTRUDER)) { - if (uiCfg.curSprayerChoose == 0) { - uiCfg.curSprayerChoose = 1; - queue.inject_P(PSTR("T1")); - } - else { - uiCfg.curSprayerChoose = 0; - queue.inject_P(PSTR("T0")); - } - } - else - uiCfg.curSprayerChoose = 0; - - extructAmount = 0; - disp_hotend_temp(); - disp_ext_type(); + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { + queue.enqueue_now_P(PSTR("G91")); + sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), uiCfg.extruStep, 60 * uiCfg.extruSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); + extrudeAmount += uiCfg.extruStep; disp_extru_amount(); } break; - case ID_E_STEP: - if (event == LV_EVENT_CLICKED) { - // nothing to do + case ID_E_DEC: + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { + queue.enqueue_now_P(PSTR("G91")); + sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); + extrudeAmount -= uiCfg.extruStep; + disp_extru_amount(); } - else if (event == LV_EVENT_RELEASED) { - switch (abs(uiCfg.extruStep)) { - case 1: uiCfg.extruStep = 5; break; - case 5: uiCfg.extruStep = 10; break; - case 10: uiCfg.extruStep = 1; break; - default: break; + break; + case ID_E_TYPE: + if (ENABLED(HAS_MULTI_EXTRUDER)) { + if (uiCfg.curSprayerChoose == 0) { + uiCfg.curSprayerChoose = 1; + queue.inject_P(PSTR("T1")); + } + else { + uiCfg.curSprayerChoose = 0; + queue.inject_P(PSTR("T0")); } - disp_ext_step(); } + else + uiCfg.curSprayerChoose = 0; + + extrudeAmount = 0; + disp_hotend_temp(); + disp_ext_type(); + disp_extru_amount(); + break; + case ID_E_STEP: + switch (abs(uiCfg.extruStep)) { + case 1: uiCfg.extruStep = 5; break; + case 5: uiCfg.extruStep = 10; break; + case 10: uiCfg.extruStep = 1; break; + default: break; + } + disp_ext_step(); break; case ID_E_SPEED: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - switch (uiCfg.extruSpeed) { - case 1: uiCfg.extruSpeed = 10; break; - case 10: uiCfg.extruSpeed = 20; break; - case 20: uiCfg.extruSpeed = 1; break; - default: break; - } - disp_ext_speed(); + switch (uiCfg.extruSpeed) { + case 1: uiCfg.extruSpeed = 10; break; + case 10: uiCfg.extruSpeed = 20; break; + case 20: uiCfg.extruSpeed = 1; break; + default: break; } + disp_ext_speed(); break; case ID_E_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } + clear_cur_ui(); + draw_return_ui(); break; } } void lv_draw_extrusion(void) { - lv_obj_t *buttonAdd, *buttonDec, *buttonBack; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EXTRUSION_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = EXTRUSION_UI; } disp_state = EXTRUSION_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonAdd = lv_imgbtn_create(scr, "F:/bmp_in.bin", INTERVAL_V, titleHeight, event_handler, ID_E_ADD); + lv_obj_t *buttonAdd = lv_big_button_create(scr, "F:/bmp_in.bin", extrude_menu.in, INTERVAL_V, titleHeight, event_handler, ID_E_ADD); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); + lv_big_button_create(scr, "F:/bmp_out.bin", extrude_menu.out, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_E_DEC); - buttonDec = lv_imgbtn_create(scr, "F:/bmp_out.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_E_DEC); - buttonType = lv_imgbtn_create(scr, NULL, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_TYPE); - buttonStep = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_STEP); - buttonSpeed = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_SPEED); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_RETURN); - - // Create labels on the image buttons - lv_obj_t *labelAdd = lv_label_create_empty(buttonAdd); - lv_obj_t *labelDec = lv_label_create_empty(buttonDec); - labelType = lv_label_create_empty(buttonType); - labelStep = lv_label_create_empty(buttonStep); - labelSpeed = lv_label_create_empty(buttonSpeed); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(labelAdd, extrude_menu.in); - lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelDec, extrude_menu.out); - lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } + buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_TYPE); + buttonStep = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_STEP); + buttonSpeed = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_SPEED); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAdd); - lv_group_add_obj(g, buttonDec); lv_group_add_obj(g, buttonType); lv_group_add_obj(g, buttonStep); lv_group_add_obj(g, buttonSpeed); - lv_group_add_obj(g, buttonBack); } #endif + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_RETURN); + + // Create labels on the image buttons + labelType = lv_label_create_empty(buttonType); + labelStep = lv_label_create_empty(buttonStep); + labelSpeed = lv_label_create_empty(buttonSpeed); + disp_ext_type(); disp_ext_step(); disp_ext_speed(); @@ -265,12 +214,11 @@ void disp_ext_speed() { void disp_hotend_temp() { char buf[20] = {0}; - public_buf_l[0] = '\0'; - strcat(public_buf_l, extrude_menu.temper_text); sprintf(buf, extrude_menu.temp_value, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + strcpy(public_buf_l, extrude_menu.temper_text); strcat(public_buf_l, buf); lv_label_set_text(tempText, public_buf_l); - lv_obj_align(tempText, NULL, LV_ALIGN_CENTER, 0, -50); + lv_obj_align(tempText, nullptr, LV_ALIGN_CENTER, 0, -50); } void disp_extru_amount() { @@ -278,33 +226,17 @@ void disp_extru_amount() { public_buf_l[0] = '\0'; - if (extructAmount < 999 && extructAmount > -99) { - sprintf(buf1, extrude_menu.count_value_mm, extructAmount); - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, extrude_menu.ext1); - else - strcat(public_buf_l, extrude_menu.ext2); - strcat(public_buf_l, buf1); - } - else if (extructAmount < 9999 && extructAmount > -999) { - sprintf(buf1, extrude_menu.count_value_cm, extructAmount / 10); - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, extrude_menu.ext1); - else - strcat(public_buf_l, extrude_menu.ext2); - strcat(public_buf_l, buf1); - } - else { - sprintf(buf1, extrude_menu.count_value_m, extructAmount / 1000); - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, extrude_menu.ext1); - else - strcat(public_buf_l, extrude_menu.ext2); - strcat(public_buf_l, buf1); - } + if (extrudeAmount < 999 && extrudeAmount > -99) + sprintf(buf1, extrude_menu.count_value_mm, extrudeAmount); + else if (extrudeAmount < 9999 && extrudeAmount > -999) + sprintf(buf1, extrude_menu.count_value_cm, extrudeAmount / 10); + else + sprintf(buf1, extrude_menu.count_value_m, extrudeAmount / 1000); + strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? extrude_menu.ext1 : extrude_menu.ext2); + strcat(public_buf_l, buf1); lv_label_set_text(ExtruText, public_buf_l); - lv_obj_align(ExtruText, NULL, LV_ALIGN_CENTER, 0, -75); + lv_obj_align(ExtruText, nullptr, LV_ALIGN_CENTER, 0, -75); } void disp_ext_step() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index 6024d58203..5306ab3a89 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -35,87 +35,56 @@ #include "../../../../gcode/gcode.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t * fanText; +extern lv_group_t *g; +static lv_obj_t *scr; +static lv_obj_t *fanText; -#define ID_F_ADD 1 -#define ID_F_DEC 2 -#define ID_F_HIGH 3 -#define ID_F_MID 4 -#define ID_F_OFF 5 -#define ID_F_RETURN 6 +enum { + ID_F_ADD = 1, + ID_F_DEC, + ID_F_HIGH, + ID_F_MID, + ID_F_OFF, + ID_F_RETURN +}; static uint8_t fanSpeed; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_F_ADD: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (fanSpeed + 1 <= 255) { - fanSpeed++; - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); - gcode.process_subcommands_now(public_buf_l); - } + if (fanSpeed + 1 <= 255) { + fanSpeed++; + sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); + gcode.process_subcommands_now(public_buf_l); } break; case ID_F_DEC: - if (event == LV_EVENT_CLICKED) { - // nothing to do + if (fanSpeed > 0) { + fanSpeed--; + sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); + gcode.process_subcommands_now(public_buf_l); } - else if (event == LV_EVENT_RELEASED) { - if (fanSpeed > 0) { - fanSpeed--; - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); - gcode.process_subcommands_now(public_buf_l); - } - } - break; case ID_F_HIGH: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - gcode.process_subcommands_now_P(PSTR("M106 S255")); - } + gcode.process_subcommands_now_P(PSTR("M106 S255")); break; case ID_F_MID: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - gcode.process_subcommands_now_P(PSTR("M106 S127")); - } + gcode.process_subcommands_now_P(PSTR("M106 S127")); break; case ID_F_OFF: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - gcode.process_subcommands_now_P(PSTR("M107")); - } + gcode.process_subcommands_now_P(PSTR("M107")); break; case ID_F_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } + clear_cur_ui(); + draw_return_ui(); break; } } void lv_draw_fan(void) { - lv_obj_t *buttonAdd, *buttonDec, *buttonHigh, *buttonMid; - lv_obj_t *buttonOff, *buttonBack; + lv_obj_t *buttonAdd; #if HAS_FAN fanSpeed = thermalManager.fan_speed[0]; @@ -126,63 +95,20 @@ void lv_draw_fan(void) { } disp_state = FAN_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonAdd = lv_imgbtn_create(scr, "F:/bmp_Add.bin", INTERVAL_V, titleHeight, event_handler, ID_F_ADD); + buttonAdd = lv_big_button_create(scr, "F:/bmp_Add.bin", fan_menu.add, INTERVAL_V, titleHeight, event_handler, ID_F_ADD); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - - buttonDec = lv_imgbtn_create(scr, "F:/bmp_Dec.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_F_DEC); - buttonHigh = lv_imgbtn_create(scr, "F:/bmp_speed255.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_HIGH); - buttonMid = lv_imgbtn_create(scr, "F:/bmp_speed127.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_MID); - buttonOff = lv_imgbtn_create(scr, "F:/bmp_speed0.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_OFF); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_RETURN); - - // Create labels on the image buttons - lv_obj_t *labelAdd = lv_label_create_empty(buttonAdd); - lv_obj_t *labelDec = lv_label_create_empty(buttonDec); - lv_obj_t *labelHigh = lv_label_create_empty(buttonHigh); - lv_obj_t *labelMid = lv_label_create_empty(buttonMid); - lv_obj_t *labelOff = lv_label_create_empty(buttonOff); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(labelAdd, fan_menu.add); - lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelDec, fan_menu.dec); - lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelHigh, fan_menu.full); - lv_obj_align(labelHigh, buttonHigh, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelMid, fan_menu.half); - lv_obj_align(labelMid, buttonMid, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOff, fan_menu.off); - lv_obj_align(labelOff, buttonOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAdd); - lv_group_add_obj(g, buttonDec); - lv_group_add_obj(g, buttonHigh); - lv_group_add_obj(g, buttonMid); - lv_group_add_obj(g, buttonOff); - lv_group_add_obj(g, buttonBack); - } - #endif + lv_big_button_create(scr, "F:/bmp_Dec.bin", fan_menu.dec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_F_DEC); + lv_big_button_create(scr, "F:/bmp_speed255.bin", fan_menu.full, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_HIGH); + lv_big_button_create(scr, "F:/bmp_speed127.bin", fan_menu.half, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_MID); + lv_big_button_create(scr, "F:/bmp_speed0.bin", fan_menu.off, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_OFF); + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_RETURN); fanText = lv_label_create_empty(scr); lv_obj_set_style(fanText, &tft_style_label_rel); @@ -197,7 +123,7 @@ void disp_fan_value() { sprintf_P(buf1, PSTR("%3d"), thermalManager.fan_speed[0]); strcat(public_buf_l, buf1); lv_label_set_text(fanText, public_buf_l); - lv_obj_align(fanText, NULL, LV_ALIGN_CENTER, 0, -65); + lv_obj_align(fanText, nullptr, LV_ALIGN_CENTER, 0, -65); } void lv_clear_fan() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index be6defda18..a3f18cf9cb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -38,150 +38,109 @@ static lv_obj_t *buttonType; static lv_obj_t *labelType; static lv_obj_t *tempText1; -#define ID_FILAMNT_IN 1 -#define ID_FILAMNT_OUT 2 -#define ID_FILAMNT_TYPE 3 -#define ID_FILAMNT_RETURN 4 +enum { + ID_FILAMNT_IN = 1, + ID_FILAMNT_OUT, + ID_FILAMNT_TYPE, + ID_FILAMNT_RETURN +}; extern feedRate_t feedrate_mm_s; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_FILAMNT_IN: - if (event == LV_EVENT_CLICKED) { - // nothing to do + uiCfg.filament_load_heat_flg = 1; + if ((abs(thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius) <= 1) + || (gCfgItems.filament_limit_temper <= thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } - else if (event == LV_EVENT_RELEASED) { - uiCfg.filament_load_heat_flg = 1; - if ((abs(thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius) <= 1) - || (gCfgItems.filament_limit_temper <= thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) { - lv_clear_filament_change(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); - } - else { - lv_clear_filament_change(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } + else { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } } break; case ID_FILAMNT_OUT: - if (event == LV_EVENT_CLICKED) { - // nothing to do + uiCfg.filament_unload_heat_flg=1; + if ((thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > 0) + && ((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) <= 1) + || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= gCfgItems.filament_limit_temper)) + ) { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); } - else if (event == LV_EVENT_RELEASED) { - uiCfg.filament_unload_heat_flg=1; - if ((thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > 0) - && ((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= gCfgItems.filament_limit_temper)) - ) { - lv_clear_filament_change(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); - } - else { - lv_clear_filament_change(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } - filament_sprayer_temp(); + else { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } + filament_sprayer_temp(); } break; case ID_FILAMNT_TYPE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if HAS_MULTI_EXTRUDER - if (uiCfg.curSprayerChoose == 0) - uiCfg.curSprayerChoose = 1; - else if (uiCfg.curSprayerChoose == 1) - uiCfg.curSprayerChoose = 0; - #endif - disp_filament_type(); - } + #if HAS_MULTI_EXTRUDER + if (uiCfg.curSprayerChoose == 0) + uiCfg.curSprayerChoose = 1; + else if (uiCfg.curSprayerChoose == 1) + uiCfg.curSprayerChoose = 0; + #endif + disp_filament_type(); break; case ID_FILAMNT_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if HAS_MULTI_EXTRUDER - if (uiCfg.print_state != IDLE && uiCfg.print_state != REPRINTED) - gcode.process_subcommands_now_P(uiCfg.curSprayerChoose_bak == 1 ? PSTR("T1") : PSTR("T0")); - #endif - feedrate_mm_s = (float)uiCfg.moveSpeed_bak; - if (uiCfg.print_state == PAUSED) - planner.set_e_position_mm((destination.e = current_position.e = uiCfg.current_e_position_bak)); - //current_position.e = destination.e = uiCfg.current_e_position_bak; - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + #if HAS_MULTI_EXTRUDER + if (uiCfg.print_state != IDLE && uiCfg.print_state != REPRINTED) + gcode.process_subcommands_now_P(uiCfg.curSprayerChoose_bak == 1 ? PSTR("T1") : PSTR("T0")); + #endif + feedrate_mm_s = (float)uiCfg.moveSpeed_bak; + if (uiCfg.print_state == PAUSED) + planner.set_e_position_mm((destination.e = current_position.e = uiCfg.current_e_position_bak)); + //current_position.e = destination.e = uiCfg.current_e_position_bak; + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; - clear_cur_ui(); - draw_return_ui(); - } + clear_cur_ui(); + draw_return_ui(); break; } } void lv_draw_filament_change(void) { - lv_obj_t *buttonIn, *buttonOut; - lv_obj_t *buttonBack; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENTCHANGE_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENTCHANGE_UI; } disp_state = FILAMENTCHANGE_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonIn = lv_imgbtn_create(scr, "F:/bmp_in.bin", INTERVAL_V, titleHeight, event_handler, ID_FILAMNT_IN); + lv_obj_t *buttonIn = lv_big_button_create(scr, "F:/bmp_in.bin", filament_menu.in, INTERVAL_V, titleHeight, event_handler, ID_FILAMNT_IN); lv_obj_clear_protect(buttonIn, LV_PROTECT_FOLLOW); + lv_big_button_create(scr, "F:/bmp_out.bin", filament_menu.out, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_FILAMNT_OUT); - buttonOut = lv_imgbtn_create(scr, "F:/bmp_out.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_FILAMNT_OUT); - buttonType = lv_imgbtn_create(scr, NULL, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_TYPE); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_RETURN); - - // Create labels on the image buttons - lv_obj_t *labelIn = lv_label_create_empty(buttonIn); - lv_obj_t *labelOut = lv_label_create_empty(buttonOut); - labelType = lv_label_create_empty(buttonType); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(labelIn, filament_menu.in); - lv_obj_align(labelIn, buttonIn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOut, filament_menu.out); - lv_obj_align(labelOut, buttonOut, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - + buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_TYPE); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonIn); - lv_group_add_obj(g, buttonOut); lv_group_add_obj(g, buttonType); - lv_group_add_obj(g, buttonBack); } #endif + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_RETURN); + + // Create labels on the image buttons + labelType = lv_label_create_empty(buttonType); + disp_filament_type(); tempText1 = lv_label_create_empty(scr); @@ -211,16 +170,13 @@ void disp_filament_temp() { public_buf_l[0] = '\0'; - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, preheat_menu.ext1); - else - strcat(public_buf_l, preheat_menu.ext2); + strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? preheat_menu.ext1 : preheat_menu.ext2); sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); lv_label_set_text(tempText1, public_buf_l); - lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); + lv_obj_align(tempText1, nullptr, LV_ALIGN_CENTER, 0, -50); } void lv_clear_filament_change() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index 2a096eafac..ecaeefee56 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -28,233 +28,102 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_FILAMENT_SET_RETURN 1 -#define ID_FILAMENT_SET_IN_LENGTH 2 -#define ID_FILAMENT_SET_IN_SPEED 3 -#define ID_FILAMENT_SET_OUT_LENGTH 4 -#define ID_FILAMENT_SET_OUT_SPEED 5 -#define ID_FILAMENT_SET_TEMP 6 -#define ID_FILAMENT_SET_DOWN 12 -#define ID_FILAMENT_SET_UP 13 +enum { + ID_FILAMENT_SET_RETURN = 1, + ID_FILAMENT_SET_IN_LENGTH, + ID_FILAMENT_SET_IN_SPEED, + ID_FILAMENT_SET_OUT_LENGTH, + ID_FILAMENT_SET_OUT_SPEED, + ID_FILAMENT_SET_TEMP, + ID_FILAMENT_SET_DOWN, + ID_FILAMENT_SET_UP +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_FILAMENT_SET_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_filament_settings(); - draw_return_ui(); - } + uiCfg.para_ui_page = 0; + lv_clear_filament_settings(); + draw_return_ui(); break; case ID_FILAMENT_SET_IN_LENGTH: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = load_length; - lv_clear_filament_settings(); - lv_draw_number_key(); - } + value = load_length; + lv_clear_filament_settings(); + lv_draw_number_key(); break; case ID_FILAMENT_SET_IN_SPEED: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = load_speed; - lv_clear_filament_settings(); - lv_draw_number_key(); - } + value = load_speed; + lv_clear_filament_settings(); + lv_draw_number_key(); break; case ID_FILAMENT_SET_OUT_LENGTH: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = unload_length; - lv_clear_filament_settings(); - lv_draw_number_key(); - } + value = unload_length; + lv_clear_filament_settings(); + lv_draw_number_key(); break; case ID_FILAMENT_SET_OUT_SPEED: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = unload_speed; - lv_clear_filament_settings(); - lv_draw_number_key(); - } + value = unload_speed; + lv_clear_filament_settings(); + lv_draw_number_key(); break; case ID_FILAMENT_SET_TEMP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = filament_temp; - lv_clear_filament_settings(); - lv_draw_number_key(); - } + value = filament_temp; + lv_clear_filament_settings(); + lv_draw_number_key(); break; case ID_FILAMENT_SET_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_filament_settings(); - lv_draw_filament_settings(); - } + uiCfg.para_ui_page = 0; + lv_clear_filament_settings(); + lv_draw_filament_settings(); break; case ID_FILAMENT_SET_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_filament_settings(); - lv_draw_filament_settings(); - } + uiCfg.para_ui_page = 1; + lv_clear_filament_settings(); + lv_draw_filament_settings(); break; } } void lv_draw_filament_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonInLengthValue = NULL, *labelInLengthValue = NULL; - lv_obj_t *buttonInSpeedValue = NULL, *labelInSpeedValue = NULL; - lv_obj_t *buttonOutLengthValue = NULL, *labelOutLengthValue = NULL; - lv_obj_t *buttonOutSpeedValue = NULL, *labelOutSpeedValue = NULL; - lv_obj_t *buttonTemperValue = NULL, *labelTemperValue = NULL; - lv_obj_t *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENT_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENT_SETTINGS_UI; } disp_state = FILAMENT_SETTINGS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.FilamentConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.InLength); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); + lv_screen_menu_item_1_edit(scr, machine_menu.InLength, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_IN_LENGTH, 0, public_buf_l); - buttonInLengthValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_IN_LENGTH); - labelInLengthValue = lv_label_create_empty(buttonInLengthValue); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_speed); + lv_screen_menu_item_1_edit(scr, machine_menu.InSpeed, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FILAMENT_SET_IN_SPEED, 1, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_length); + lv_screen_menu_item_1_edit(scr, machine_menu.OutLength, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_FILAMENT_SET_OUT_LENGTH, 2, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.InSpeed); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_speed); + lv_screen_menu_item_1_edit(scr, machine_menu.OutSpeed, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_FILAMENT_SET_OUT_SPEED, 3, public_buf_l); - buttonInSpeedValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_IN_SPEED); - labelInSpeedValue = lv_label_create_empty(buttonInSpeedValue); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 6, machine_menu.OutLength); - - buttonOutLengthValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_OUT_LENGTH); - labelOutLengthValue = lv_label_create_empty(buttonOutLengthValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.OutSpeed); - - buttonOutSpeedValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_OUT_SPEED); - labelOutSpeedValue = lv_label_create_empty(buttonOutSpeedValue); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create_back(scr, event_handler, ID_FILAMENT_SET_DOWN); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonInLengthValue); - lv_group_add_obj(g, buttonInSpeedValue); - lv_group_add_obj(g, buttonOutLengthValue); - lv_group_add_obj(g, buttonOutSpeedValue); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_DOWN, true); } else { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.FilamentTemperature); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temper); + lv_screen_menu_item_1_edit(scr, machine_menu.FilamentTemperature, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_TEMP, 0, public_buf_l); - buttonTemperValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_TEMP); - labelTemperValue = lv_label_create_empty(buttonTemperValue); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create_back(scr, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_UP); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonTemperValue); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_UP, true); } - labelTurnPage = lv_label_create_empty(buttonTurnPage); - - buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_FILAMENT_SET_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language) { - if (uiCfg.para_ui_page != 1) { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); - lv_label_set_text(labelInLengthValue, public_buf_l); - lv_obj_align(labelInLengthValue, buttonInLengthValue, LV_ALIGN_CENTER, 0, 0); - - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_speed); - lv_label_set_text(labelInSpeedValue, public_buf_l); - lv_obj_align(labelInSpeedValue, buttonInSpeedValue, LV_ALIGN_CENTER, 0, 0); - - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_length); - lv_label_set_text(labelOutLengthValue, public_buf_l); - lv_obj_align(labelOutLengthValue, buttonOutLengthValue, LV_ALIGN_CENTER, 0, 0); - - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_speed); - lv_label_set_text(labelOutSpeedValue, public_buf_l); - lv_obj_align(labelOutSpeedValue, buttonOutSpeedValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - } - else { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temper); - lv_label_set_text(labelTemperValue, public_buf_l); - lv_obj_align(labelTemperValue, buttonTemperValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_FILAMENT_SET_RETURN, true); } void lv_clear_filament_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 4e22c134ac..92510cbc8e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -35,149 +35,67 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_H_ALL 1 -#define ID_H_X 2 -#define ID_H_Y 3 -#define ID_H_Z 4 -#define ID_H_RETURN 5 -#define ID_H_OFF_ALL 6 -#define ID_H_OFF_XY 7 +enum { + ID_H_ALL = 1, + ID_H_X, + ID_H_Y, + ID_H_Z, + ID_H_RETURN, + ID_H_OFF_ALL, + ID_H_OFF_XY +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_H_ALL: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("G28")); - } + queue.inject_P(PSTR("G28")); break; case ID_H_X: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("G28 X0")); - } + queue.inject_P(PSTR("G28 X0")); break; case ID_H_Y: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("G28 Y0")); - } + queue.inject_P(PSTR("G28 Y0")); break; case ID_H_Z: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("G28 Z0")); - } + queue.inject_P(PSTR("G28 Z0")); break; case ID_H_OFF_ALL: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("M84")); - } + queue.inject_P(PSTR("M84")); break; case ID_H_OFF_XY: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("M84 X Y")); - } + queue.inject_P(PSTR("M84 X Y")); break; case ID_H_RETURN: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_home(); - lv_draw_tool(); - } + lv_clear_home(); + lv_draw_tool(); break; } } void lv_draw_home(void) { - lv_obj_t *buttonHomeAll, *buttonHomeX, *buttonHomeY, *buttonHomeZ; - lv_obj_t *buttonBack; - lv_obj_t *buttonOffAll, *buttonOffXY; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ZERO_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = ZERO_UI; } disp_state = ZERO_UI; - scr = lv_obj_create(NULL, NULL); - - //static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - // Create image buttons - //buttonWifi = lv_imgbtn_create(scr, NULL); - //buttonContinue = lv_imgbtn_create(scr, NULL); - buttonHomeAll = lv_imgbtn_create(scr, "F:/bmp_zeroAll.bin", INTERVAL_V, titleHeight, event_handler, ID_H_ALL); - buttonHomeX = lv_imgbtn_create(scr, "F:/bmp_zeroX.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_H_X); - buttonHomeY = lv_imgbtn_create(scr, "F:/bmp_zeroY.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_H_Y); - buttonHomeZ = lv_imgbtn_create(scr, "F:/bmp_zeroZ.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_H_Z); - buttonOffAll = lv_imgbtn_create(scr, "F:/bmp_function1.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_ALL); - buttonOffXY = lv_imgbtn_create(scr, "F:/bmp_function1.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_XY); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_RETURN); - - // Create labels on the image buttons - lv_obj_t *labelHomeAll = lv_label_create_empty(buttonHomeAll); - lv_obj_t *labelHomeX = lv_label_create_empty(buttonHomeX); - lv_obj_t *labelHomeY = lv_label_create_empty(buttonHomeY); - lv_obj_t *labelHomeZ = lv_label_create_empty(buttonHomeZ); - lv_obj_t *labelOffAll = lv_label_create_empty(buttonOffAll); - lv_obj_t *labelOffXY = lv_label_create_empty(buttonOffXY); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(labelHomeAll, home_menu.home_all); - lv_obj_align(labelHomeAll, buttonHomeAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelHomeX, home_menu.home_x); - lv_obj_align(labelHomeX, buttonHomeX, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelHomeY, home_menu.home_y); - lv_obj_align(labelHomeY, buttonHomeY, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelHomeZ, home_menu.home_z); - lv_obj_align(labelHomeZ, buttonHomeZ, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOffAll, set_menu.motoroff); - lv_obj_align(labelOffAll, buttonOffAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOffXY, set_menu.motoroffXY); - lv_obj_align(labelOffXY, buttonOffXY, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonHomeAll); - lv_group_add_obj(g, buttonHomeX); - lv_group_add_obj(g, buttonHomeY); - lv_group_add_obj(g, buttonHomeZ); - lv_group_add_obj(g, buttonOffAll); - lv_group_add_obj(g, buttonOffXY); - lv_group_add_obj(g, buttonBack); - } - #endif + lv_big_button_create(scr, "F:/bmp_zeroAll.bin", home_menu.home_all, INTERVAL_V, titleHeight, event_handler, ID_H_ALL); + lv_big_button_create(scr, "F:/bmp_zeroX.bin", home_menu.home_x, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_H_X); + lv_big_button_create(scr, "F:/bmp_zeroY.bin", home_menu.home_y, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_H_Y); + lv_big_button_create(scr, "F:/bmp_zeroZ.bin", home_menu.home_z, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_H_Z); + lv_big_button_create(scr, "F:/bmp_function1.bin", set_menu.motoroff, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_ALL); + lv_big_button_create(scr, "F:/bmp_function1.bin", set_menu.motoroffXY, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_XY); + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_RETURN); } void lv_clear_home() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp index 67025f92c5..e01208605f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp @@ -31,180 +31,75 @@ #include "../../../../module/stepper/indirection.h" #include "../../../../feature/tmc_util.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_SENSITIVITY_RETURN 1 -#define ID_SENSITIVITY_X 2 -#define ID_SENSITIVITY_Y 3 -#define ID_SENSITIVITY_Z 4 -#define ID_SENSITIVITY_Z2 5 +enum { + ID_SENSITIVITY_RETURN = 1, + ID_SENSITIVITY_X, + ID_SENSITIVITY_Y, + ID_SENSITIVITY_Z, + ID_SENSITIVITY_Z2 +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_SENSITIVITY_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_homing_sensitivity_settings(); - draw_return_ui(); - } + lv_clear_homing_sensitivity_settings(); + draw_return_ui(); break; case ID_SENSITIVITY_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = x_sensitivity; - lv_clear_homing_sensitivity_settings(); - lv_draw_number_key(); - } + value = x_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); break; case ID_SENSITIVITY_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = y_sensitivity; - lv_clear_homing_sensitivity_settings(); - lv_draw_number_key(); - } + value = y_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); break; case ID_SENSITIVITY_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = z_sensitivity; - lv_clear_homing_sensitivity_settings(); - lv_draw_number_key(); - } + value = z_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); break; #if Z2_SENSORLESS case ID_SENSITIVITY_Z2: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = z2_sensitivity; - lv_clear_homing_sensitivity_settings(); - lv_draw_number_key(); - } + value = z2_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); break; #endif } } void lv_draw_homing_sensitivity_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; - #if Z2_SENSORLESS - lv_obj_t *buttonZ2Value = NULL, *labelZ2Value = NULL; - lv_obj_t *line4 = NULL; - #endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != HOMING_SENSITIVITY_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = HOMING_SENSITIVITY_UI; } disp_state = HOMING_SENSITIVITY_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.HomingSensitivityConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.X_Sensitivity); + sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); + lv_screen_menu_item_1_edit(scr, machine_menu.X_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_SENSITIVITY_X, 0, public_buf_l); - buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_X); - labelXValue = lv_label_create_empty(buttonXValue); + sprintf_P(public_buf_l, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); + lv_screen_menu_item_1_edit(scr, machine_menu.Y_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_SENSITIVITY_Y, 1, public_buf_l); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXValue); - #endif - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Y_Sensitivity); - - buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_Y); - labelYValue = lv_label_create_empty(buttonYValue); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYValue); - #endif - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Z_Sensitivity); - - buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_Z); - labelZValue = lv_label_create_empty(buttonZValue); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) lv_group_add_obj(g, buttonZValue); - #endif - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); + sprintf_P(public_buf_l, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); + lv_screen_menu_item_1_edit(scr, machine_menu.Z_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_SENSITIVITY_Z, 2, public_buf_l); #if Z2_SENSORLESS - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.Z2_Sensitivity); - - buttonZ2Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_Z2); - labelZ2Value = lv_label_create_empty(buttonZ2Value); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZ2Value); - #endif - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); + sprintf_P(public_buf_l, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); + lv_screen_menu_item_1_edit(scr, machine_menu.Z2_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_SENSITIVITY_Z2, 3, public_buf_l); #endif - buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_SENSITIVITY_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - #if Z2_SENSORLESS - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); - lv_label_set_text(labelZ2Value, public_buf_l); - lv_obj_align(labelZ2Value, buttonZ2Value, LV_ALIGN_CENTER, 0, 0); - #endif - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_SENSITIVITY_RETURN, true); } void lv_clear_homing_sensitivity_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp index 45d94020e2..5b8f7b45fd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -29,161 +29,71 @@ #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_JERK_RETURN 1 -#define ID_JERK_X 2 -#define ID_JERK_Y 3 -#define ID_JERK_Z 4 -#define ID_JERK_E 5 +enum { + ID_JERK_RETURN = 1, + ID_JERK_X, + ID_JERK_Y, + ID_JERK_Z, + ID_JERK_E +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_JERK_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_jerk_settings(); - draw_return_ui(); - } + lv_clear_jerk_settings(); + draw_return_ui(); break; case ID_JERK_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = XJerk; - lv_clear_jerk_settings(); - lv_draw_number_key(); - } + value = XJerk; + lv_clear_jerk_settings(); + lv_draw_number_key(); break; case ID_JERK_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = YJerk; - lv_clear_jerk_settings(); - lv_draw_number_key(); - } + value = YJerk; + lv_clear_jerk_settings(); + lv_draw_number_key(); break; case ID_JERK_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = ZJerk; - lv_clear_jerk_settings(); - lv_draw_number_key(); - } + value = ZJerk; + lv_clear_jerk_settings(); + lv_draw_number_key(); break; case ID_JERK_E: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = EJerk; - lv_clear_jerk_settings(); - lv_draw_number_key(); - } + value = EJerk; + lv_clear_jerk_settings(); + lv_draw_number_key(); break; } } void lv_draw_jerk_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonEValue = NULL, *labelEValue = NULL; - lv_obj_t *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != JERK_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = JERK_UI; } disp_state = JERK_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.JerkConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.X_Jerk); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.X_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_JERK_X, 0, public_buf_l); - buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_JERK_X); - labelXValue = lv_label_create_empty(buttonXValue); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.Y_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_JERK_Y, 1, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.Z_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_JERK_Z, 2, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Y_Jerk); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[E_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.E_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_JERK_E, 3, public_buf_l); - buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_JERK_Y); - labelYValue = lv_label_create_empty(buttonYValue); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Z_Jerk); - - buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_JERK_Z); - labelZValue = lv_label_create_empty(buttonZValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E_Jerk); - - buttonEValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_JERK_E); - labelEValue = lv_label_create_empty(buttonEValue); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_JERK_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonEValue); - lv_group_add_obj(g, buttonBack); - } - #endif - - if (gCfgItems.multiple_language) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[E_AXIS]); - lv_label_set_text(labelEValue, public_buf_l); - lv_obj_align(labelEValue, buttonEValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_JERK_RETURN, true); } void lv_clear_jerk_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 35ad439c6e..0debf8fa8f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -28,8 +28,8 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; #define LV_KB_CTRL_BTN_FLAGS (LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_CLICK_TRIG) @@ -72,7 +72,7 @@ static const lv_btnm_ctrl_t kb_ctrl_num_map[] = { 1, 1, 1, 2, 1, 1, 1, 1, 1}; -static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { +static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { //LV_ASSERT_OBJ(kb, LV_OBJX_NAME); if (event != LV_EVENT_VALUE_CHANGED) return; @@ -84,7 +84,7 @@ static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { if (lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_NO_REPEAT) && event == LV_EVENT_LONG_PRESSED_REPEAT) return; const char * txt = lv_btnm_get_active_btn_text(kb); - if (txt == NULL) return; + if (txt == nullptr) return; // Do the corresponding action according to the text of the button if (strcmp(txt, "abc") == 0) { @@ -104,13 +104,13 @@ static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { } else if (strcmp(txt, LV_SYMBOL_CLOSE) == 0) { if (kb->event_cb != lv_kb_def_event_cb) { - //lv_res_t res = lv_event_send(kb, LV_EVENT_CANCEL, NULL); + //lv_res_t res = lv_event_send(kb, LV_EVENT_CANCEL, nullptr); //if (res != LV_RES_OK) return; lv_clear_keyboard(); draw_return_ui(); } else { - lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ + lv_kb_set_ta(kb, nullptr); /*De-assign the text area to hide it cursor if needed*/ lv_obj_del(kb); return; } @@ -118,7 +118,7 @@ static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { } else if (strcmp(txt, LV_SYMBOL_OK) == 0) { if (kb->event_cb != lv_kb_def_event_cb) { - //lv_res_t res = lv_event_send(kb, LV_EVENT_APPLY, NULL); + //lv_res_t res = lv_event_send(kb, LV_EVENT_APPLY, nullptr); //if (res != LV_RES_OK) return; const char * ret_ta_txt = lv_ta_get_text(ext->ta); switch (keyboard_value) { @@ -134,18 +134,16 @@ static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { draw_return_ui(); break; case wifiConfig: - memset((void *)uiCfg.wifi_name, 0, sizeof(uiCfg.wifi_name)); + ZERO(uiCfg.wifi_name); memcpy((void *)uiCfg.wifi_name, wifi_list.wifiName[wifi_list.nameIndex], 32); - memset((void *)uiCfg.wifi_key, 0, sizeof(uiCfg.wifi_key)); + ZERO(uiCfg.wifi_key); memcpy((void *)uiCfg.wifi_key, ret_ta_txt, sizeof(uiCfg.wifi_key)); gCfgItems.wifi_mode_sel = STA_MODEL; package_to_wifi(WIFI_PARA_SET, (char *)0, 0); - memset(public_buf_l,0,sizeof(public_buf_l)); - public_buf_l[0] = 0xA5; public_buf_l[1] = 0x09; public_buf_l[2] = 0x01; @@ -172,13 +170,13 @@ static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { } } else { - lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ + lv_kb_set_ta(kb, nullptr); /*De-assign the text area to hide it cursor if needed*/ } return; } /*Add the characters to the text area if set*/ - if (ext->ta == NULL) return; + if (ext->ta == nullptr) return; if (strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) lv_ta_add_char(ext->ta, '\n'); @@ -221,11 +219,7 @@ void lv_draw_keyboard() { } disp_state = KEY_BOARD_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -245,7 +239,7 @@ void lv_draw_keyboard() { pr_style.body.grad_color = lv_color_make(0x6A, 0x3A, 0x0C); /*Create a keyboard and apply the styles*/ - lv_obj_t *kb = lv_kb_create(scr, NULL); + lv_obj_t *kb = lv_kb_create(scr, nullptr); lv_obj_set_event_cb(kb, lv_kb_event_cb); lv_kb_set_cursor_manage(kb, true); lv_kb_set_style(kb, LV_KB_STYLE_BG, &lv_style_transp_tight); @@ -259,8 +253,8 @@ void lv_draw_keyboard() { #endif /*Create a text area. The keyboard will write here*/ - lv_obj_t *ta = lv_ta_create(scr, NULL); - lv_obj_align(ta, NULL, LV_ALIGN_IN_TOP_MID, 0, 10); + lv_obj_t *ta = lv_ta_create(scr, nullptr); + lv_obj_align(ta, nullptr, LV_ALIGN_IN_TOP_MID, 0, 10); if (keyboard_value == gcodeCommand) { get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); public_buf_m[sizeof(public_buf_m)-1] = 0; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index b5c2da09aa..1ff60d9b9b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -33,139 +33,98 @@ #include "../../../../inc/MarlinConfig.h" #include -//static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; - -#define ID_CN 1 -#define ID_T_CN 2 -#define ID_EN 3 -#define ID_RU 4 -#define ID_ES 5 -#define ID_FR 6 -#define ID_IT 7 -#define ID_L_RETURN 8 +enum { + ID_CN = 1, + ID_T_CN, + ID_EN, + ID_RU, + ID_ES, + ID_FR, + ID_IT, + ID_L_RETURN +}; #define SELECTED 1 #define UNSELECTED 0 static void disp_language(uint8_t language, uint8_t state); -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; static lv_obj_t *buttonCN, *buttonT_CN, *buttonEN, *buttonRU; -static lv_obj_t *buttonES, *buttonFR, *buttonIT, *buttonBack; +static lv_obj_t *buttonES, *buttonFR, *buttonIT; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_CN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src_both(buttonCN, "F:/bmp_simplified_cn_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonCN); - gCfgItems.language = LANG_SIMPLE_CHINESE; - update_spi_flash(); - disp_language_init(); - } + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src_both(buttonCN, "F:/bmp_simplified_cn_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonCN); + gCfgItems.language = LANG_SIMPLE_CHINESE; + update_spi_flash(); + disp_language_init(); break; case ID_T_CN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src_both(buttonT_CN, "F:/bmp_traditional_cn_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonT_CN); - gCfgItems.language = LANG_COMPLEX_CHINESE; - update_spi_flash(); - disp_language_init(); - } + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src_both(buttonT_CN, "F:/bmp_traditional_cn_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonT_CN); + gCfgItems.language = LANG_COMPLEX_CHINESE; + update_spi_flash(); + disp_language_init(); break; case ID_EN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src_both(buttonEN, "F:/bmp_english_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonEN); - gCfgItems.language = LANG_ENGLISH; - update_spi_flash(); - disp_language_init(); - } + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src_both(buttonEN, "F:/bmp_english_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonEN); + gCfgItems.language = LANG_ENGLISH; + update_spi_flash(); + disp_language_init(); break; case ID_RU: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src_both(buttonRU, "F:/bmp_russian_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonRU); - gCfgItems.language = LANG_RUSSIAN; - update_spi_flash(); - disp_language_init(); - } + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src_both(buttonRU, "F:/bmp_russian_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonRU); + gCfgItems.language = LANG_RUSSIAN; + update_spi_flash(); + disp_language_init(); break; case ID_ES: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src_both(buttonES, "F:/bmp_spanish_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonES); - gCfgItems.language = LANG_SPANISH; - update_spi_flash(); - disp_language_init(); - } + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src_both(buttonES, "F:/bmp_spanish_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonES); + gCfgItems.language = LANG_SPANISH; + update_spi_flash(); + disp_language_init(); break; case ID_FR: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src_both(buttonFR, "F:/bmp_french_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonFR); - gCfgItems.language = LANG_FRENCH; - update_spi_flash(); - disp_language_init(); - } + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src_both(buttonFR, "F:/bmp_french_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonFR); + gCfgItems.language = LANG_FRENCH; + update_spi_flash(); + disp_language_init(); break; case ID_IT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src_both(buttonIT, "F:/bmp_italy_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonIT); - gCfgItems.language = LANG_ITALY; - update_spi_flash(); - disp_language_init(); - } + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src_both(buttonIT, "F:/bmp_italy_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonIT); + gCfgItems.language = LANG_ITALY; + update_spi_flash(); + disp_language_init(); break; case ID_L_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - buttonCN = NULL; - buttonT_CN = NULL; - buttonEN = NULL; - buttonRU = NULL; - buttonES = NULL; - buttonFR = NULL; - buttonFR = NULL; - buttonIT = NULL; - buttonBack = NULL; - lv_clear_language(); - lv_draw_set(); - } + buttonCN = nullptr; + buttonT_CN = nullptr; + buttonEN = nullptr; + buttonRU = nullptr; + buttonES = nullptr; + buttonFR = nullptr; + buttonFR = nullptr; + buttonIT = nullptr; + lv_clear_language(); + lv_draw_set(); break; - } } @@ -222,7 +181,7 @@ static void disp_language(uint8_t language, uint8_t state) { strcat_P(public_buf_l, PSTR(".bin")); - lv_obj_set_event_cb_mks(obj, event_handler, id, NULL, 0); + lv_obj_set_event_cb_mks(obj, event_handler, id, nullptr, 0); lv_imgbtn_set_src_both(obj, public_buf_l); if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj); @@ -236,78 +195,24 @@ void lv_draw_language(void) { } disp_state = LANGUAGE_UI; - scr = lv_obj_create(NULL, NULL); - - // static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonCN = lv_imgbtn_create(scr, "F:/bmp_simplified_cn.bin", INTERVAL_V, titleHeight, event_handler, ID_CN); + buttonCN = lv_big_button_create(scr, "F:/bmp_simplified_cn.bin", language_menu.chinese_s, INTERVAL_V, titleHeight, event_handler, ID_CN); lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW); - buttonT_CN = lv_imgbtn_create(scr, "F:/bmp_traditional_cn.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_CN); - buttonEN = lv_imgbtn_create(scr, "F:/bmp_english.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_EN); - buttonRU = lv_imgbtn_create(scr, "F:/bmp_russian.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_RU); - buttonES = lv_imgbtn_create(scr, "F:/bmp_spanish.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_ES); - buttonFR = lv_imgbtn_create(scr, "F:/bmp_french.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FR); - buttonIT = lv_imgbtn_create(scr, "F:/bmp_italy.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_IT); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_L_RETURN); - - // Create labels on the image buttons - lv_obj_t *label_CN = lv_label_create_empty(buttonCN); - lv_obj_t *label_T_CN = lv_label_create_empty(buttonT_CN); - lv_obj_t *label_EN = lv_label_create_empty(buttonEN); - lv_obj_t *label_RU = lv_label_create_empty(buttonRU); - lv_obj_t *label_ES = lv_label_create_empty(buttonES); - lv_obj_t *label_FR = lv_label_create_empty(buttonFR); - lv_obj_t *label_IT = lv_label_create_empty(buttonIT); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); + buttonT_CN = lv_big_button_create(scr, "F:/bmp_traditional_cn.bin", language_menu.chinese_t, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_CN); + buttonEN = lv_big_button_create(scr, "F:/bmp_english.bin", language_menu.english, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_EN); + buttonRU = lv_big_button_create(scr, "F:/bmp_russian.bin", language_menu.russian, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_RU); + buttonES = lv_big_button_create(scr, "F:/bmp_spanish.bin", language_menu.spanish, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_ES); + buttonFR = lv_big_button_create(scr, "F:/bmp_french.bin", language_menu.french, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FR); + buttonIT = lv_big_button_create(scr, "F:/bmp_italy.bin", language_menu.italy, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_IT); + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_L_RETURN); disp_language(gCfgItems.language, SELECTED); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_CN, language_menu.chinese_s); - lv_obj_align(label_CN, buttonCN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_T_CN, language_menu.chinese_t); - lv_obj_align(label_T_CN, buttonT_CN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_EN, language_menu.english); - lv_obj_align(label_EN, buttonEN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_RU, language_menu.russian); - lv_obj_align(label_RU, buttonRU, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_ES, language_menu.spanish); - lv_obj_align(label_ES, buttonES, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_FR, language_menu.french); - lv_obj_align(label_FR, buttonFR, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_IT, language_menu.italy); - lv_obj_align(label_IT, buttonIT, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonCN); - lv_group_add_obj(g, buttonT_CN); - lv_group_add_obj(g, buttonEN); - lv_group_add_obj(g, buttonRU); - lv_group_add_obj(g, buttonES); - lv_group_add_obj(g, buttonFR); - lv_group_add_obj(g, buttonIT); - lv_group_add_obj(g, buttonBack); - } - #endif } void lv_clear_language() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index d742f79e59..7bd2b83ace 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -28,194 +28,57 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_LEVEL_RETURN 1 -#define ID_LEVEL_POSITION 2 -#define ID_LEVEL_POSITION_ARROW 3 -#define ID_LEVEL_COMMAND 4 -#define ID_LEVEL_COMMAND_ARROW 5 -#define ID_LEVEL_ZOFFSET 6 -#define ID_LEVEL_ZOFFSET_ARROW 7 +enum { + ID_LEVEL_RETURN = 1, + ID_LEVEL_POSITION, + ID_LEVEL_COMMAND, + ID_LEVEL_ZOFFSET +}; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_LEVEL_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - draw_return_ui(); - } + lv_clear_level_settings(); + draw_return_ui(); break; case ID_LEVEL_POSITION: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - lv_draw_manual_level_pos_settings(); - } - break; - case ID_LEVEL_POSITION_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - lv_draw_manual_level_pos_settings(); - } + lv_clear_level_settings(); + lv_draw_manual_level_pos_settings(); break; case ID_LEVEL_COMMAND: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - keyboard_value = gcodeCommand; - lv_clear_level_settings(); - lv_draw_keyboard(); - } - break; - case ID_LEVEL_COMMAND_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - keyboard_value = gcodeCommand; - lv_clear_level_settings(); - lv_draw_keyboard(); - } + keyboard_value = gcodeCommand; + lv_clear_level_settings(); + lv_draw_keyboard(); break; #if HAS_BED_PROBE case ID_LEVEL_ZOFFSET: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - lv_draw_auto_level_offset_settings(); - } - break; - case ID_LEVEL_ZOFFSET_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - lv_draw_auto_level_offset_settings(); - } + lv_clear_level_settings(); + lv_draw_auto_level_offset_settings(); break; #endif } } void lv_draw_level_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonPosition, *labelPosition, *buttonPositionNarrow; - lv_obj_t *buttonCommand, *labelCommand, *buttonCommandNarrow; - #if HAS_BED_PROBE - lv_obj_t *buttonZoffset, *labelZoffset, *buttonZoffsetNarrow; - lv_obj_t * line3; - #endif - lv_obj_t * line1, * line2; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_PARA_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_PARA_UI; } disp_state = LEVELING_PARA_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.LevelingParaConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); - - buttonPosition = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonPosition, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonPosition, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonPosition, event_handler, ID_LEVEL_POSITION, NULL, 0); - lv_btn_use_label_style(buttonPosition); - lv_btn_set_layout(buttonPosition, LV_LAYOUT_OFF); - labelPosition = lv_label_create_empty(buttonPosition); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPosition); - #endif - - buttonPositionNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_LEVEL_POSITION_ARROW); - lv_btn_set_layout(buttonPositionNarrow, LV_LAYOUT_OFF); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonCommand = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonCommand, PARA_UI_POS_X, PARA_UI_POS_Y * 2); - lv_obj_set_size(buttonCommand, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonCommand, event_handler, ID_LEVEL_COMMAND, NULL, 0); - lv_btn_use_label_style(buttonCommand); - lv_btn_set_layout(buttonCommand, LV_LAYOUT_OFF); - labelCommand = lv_label_create_empty(buttonCommand); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonCommand); - #endif - - buttonCommandNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_LEVEL_COMMAND_ARROW); - lv_btn_set_layout(buttonCommandNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - + lv_screen_menu_item(scr, machine_menu.LevelingManuPosConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_LEVEL_POSITION, 0); + lv_screen_menu_item(scr, machine_menu.LevelingAutoCommandConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_LEVEL_COMMAND, 1); #if HAS_BED_PROBE - - buttonZoffset = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3, PARA_UI_SIZE_X, PARA_UI_SIZE_Y, event_handler, ID_LEVEL_ZOFFSET); - lv_btn_set_layout(buttonZoffset, LV_LAYOUT_OFF); - labelZoffset = lv_label_create_empty(buttonZoffset); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZoffset); - #endif - - buttonZoffsetNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_LEVEL_ZOFFSET_ARROW); - lv_btn_set_layout(buttonZoffsetNarrow, LV_LAYOUT_OFF); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - #endif // HAS_BED_PROBE - - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", event_handler, ID_LEVEL_RETURN); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + lv_screen_menu_item(scr, machine_menu.LevelingAutoZoffsetConf, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_LEVEL_ZOFFSET, 2); #endif - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelPosition, machine_menu.LevelingManuPosConf); - lv_obj_align(labelPosition, buttonPosition, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelCommand, machine_menu.LevelingAutoCommandConf); - lv_obj_align(labelCommand, buttonCommand, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if HAS_BED_PROBE - lv_label_set_text(labelZoffset, machine_menu.LevelingAutoZoffsetConf); - lv_obj_align(labelZoffset, buttonZoffset, LV_ALIGN_IN_LEFT_MID, 0, 0); - #endif - } - + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_LEVEL_RETURN, true); } void lv_clear_level_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp index 2309822e86..45aabae079 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -28,209 +28,60 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_PARA_RETURN 1 -#define ID_PARA_MACHINE 2 -#define ID_PARA_MACHINE_ARROW 3 -#define ID_PARA_MOTOR 4 -#define ID_PARA_MOTOR_ARROW 5 -#define ID_PARA_LEVEL 6 -#define ID_PARA_LEVEL_ARROW 7 -#define ID_PARA_ADVANCE 8 -#define ID_PARA_ADVANCE_ARROW 9 +enum { + ID_PARA_RETURN = 1, + ID_PARA_MACHINE, + ID_PARA_MOTOR, + ID_PARA_LEVEL, + ID_PARA_ADVANCE +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_PARA_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - draw_return_ui(); - } + lv_clear_machine_para(); + draw_return_ui(); break; case ID_PARA_MACHINE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_machine_settings(); - } - break; - case ID_PARA_MACHINE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_machine_settings(); - } + lv_clear_machine_para(); + lv_draw_machine_settings(); break; case ID_PARA_MOTOR: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_motor_settings(); - } - break; - case ID_PARA_MOTOR_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_motor_settings(); - } + lv_clear_machine_para(); + lv_draw_motor_settings(); break; case ID_PARA_LEVEL: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_level_settings(); - } - break; - case ID_PARA_LEVEL_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_level_settings(); - } + lv_clear_machine_para(); + lv_draw_level_settings(); break; case ID_PARA_ADVANCE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_advance_settings(); - } - break; - case ID_PARA_ADVANCE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_advance_settings(); - } + lv_clear_machine_para(); + lv_draw_advance_settings(); break; } } void lv_draw_machine_para(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonMachine, *labelMachine, *buttonMachineNarrow; - lv_obj_t *buttonMotor, *labelMotor, *buttonMotorNarrow; - lv_obj_t *buttonLevel, *labelLevel, *buttonLevelNarrow; - lv_obj_t *buttonAdvance, *labelAdvance, *buttonAdvanceNarrow; - lv_obj_t * line1, * line2, * line3, * line4; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_PARA_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_PARA_UI; } disp_state = MACHINE_PARA_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - lv_refr_now(lv_refr_get_disp_refreshing()); - buttonMachine = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonMachine, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonMachine, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonMachine, event_handler, ID_PARA_MACHINE, NULL, 0); - lv_btn_use_label_style(buttonMachine); - lv_btn_set_layout(buttonMachine, LV_LAYOUT_OFF); - labelMachine = lv_label_create_empty(buttonMachine); /*Add a label to the button*/ - - buttonMachineNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_PARA_MACHINE_ARROW); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonMotor = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonMotor, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonMotor, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonMotor, event_handler, ID_PARA_MOTOR, NULL, 0); - lv_btn_use_label_style(buttonMotor); - lv_btn_set_layout(buttonMotor, LV_LAYOUT_OFF); - labelMotor = lv_label_create_empty(buttonMotor); /*Add a label to the button*/ - - buttonMotorNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_PARA_MOTOR_ARROW); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - buttonLevel = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3, PARA_UI_SIZE_X, PARA_UI_SIZE_Y, event_handler, ID_PARA_LEVEL); - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); - labelLevel = lv_label_create_empty(buttonLevel); /*Add a label to the button*/ - - buttonLevelNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_PARA_LEVEL_ARROW); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - buttonAdvance = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonAdvance, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonAdvance, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonAdvance, event_handler, ID_PARA_ADVANCE, NULL, 0); - lv_btn_use_label_style(buttonAdvance); - lv_btn_set_layout(buttonAdvance, LV_LAYOUT_OFF); - labelAdvance = lv_label_create_empty(buttonAdvance); /*Add a label to the button*/ - - buttonAdvanceNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 4 + PARA_UI_ARROW_V, event_handler, ID_PARA_ADVANCE_ARROW); - lv_btn_set_layout(buttonAdvanceNarrow, LV_LAYOUT_OFF); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_PARA_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, -2); - - lv_label_set_text(labelMachine, MachinePara_menu.MachineSetting); - lv_obj_align(labelMachine, buttonMachine, LV_ALIGN_IN_LEFT_MID, 0, -3); - - lv_label_set_text(labelMotor, MachinePara_menu.MotorSetting); - lv_obj_align(labelMotor, buttonMotor, LV_ALIGN_IN_LEFT_MID, 0, -3); - - lv_label_set_text(labelLevel, MachinePara_menu.leveling); - lv_obj_align(labelLevel, buttonLevel, LV_ALIGN_IN_LEFT_MID, 0, -3); - - lv_label_set_text(labelAdvance, MachinePara_menu.AdvanceSetting); - lv_obj_align(labelAdvance, buttonAdvance, LV_ALIGN_IN_LEFT_MID, 0, -3); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonMachine); - lv_group_add_obj(g, buttonMotor); - lv_group_add_obj(g, buttonLevel); - lv_group_add_obj(g, buttonAdvance); - lv_group_add_obj(g, buttonBack); - } - #endif + lv_screen_menu_item(scr, MachinePara_menu.MachineSetting, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PARA_MACHINE, 0); + lv_screen_menu_item(scr, MachinePara_menu.MotorSetting, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_PARA_MOTOR, 1); + lv_screen_menu_item(scr, MachinePara_menu.leveling, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_PARA_LEVEL, 2); + lv_screen_menu_item(scr, MachinePara_menu.AdvanceSetting, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_PARA_ADVANCE, 3); + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_PARA_RETURN, true); } void lv_clear_machine_para() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp index ae83b7efbc..000b122b34 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -28,188 +28,59 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_MACHINE_RETURN 1 -#define ID_MACHINE_ACCELERATION 2 -#define ID_MACHINE_ACCELERATION_ARROW 3 -#define ID_MACHINE_FEEDRATE 4 -#define ID_MACHINE_FEEDRATE_ARROW 5 -#define ID_MACHINE_JERK 6 -#define ID_MACHINE_JERK_ARROW 7 +enum { + ID_MACHINE_RETURN = 1, + ID_MACHINE_ACCELERATION, + ID_MACHINE_FEEDRATE, + ID_MACHINE_JERK +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_MACHINE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - draw_return_ui(); - } + lv_clear_machine_settings(); + draw_return_ui(); break; case ID_MACHINE_ACCELERATION: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_acceleration_settings(); - } - break; - case ID_MACHINE_ACCELERATION_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_acceleration_settings(); - } + lv_clear_machine_settings(); + lv_draw_acceleration_settings(); break; case ID_MACHINE_FEEDRATE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_max_feedrate_settings(); - } + lv_clear_machine_settings(); + lv_draw_max_feedrate_settings(); break; - case ID_MACHINE_FEEDRATE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { + #if HAS_CLASSIC_JERK + case ID_MACHINE_JERK: lv_clear_machine_settings(); - lv_draw_max_feedrate_settings(); - } - break; - #if HAS_CLASSIC_JERK - case ID_MACHINE_JERK: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_jerk_settings(); - } - break; - case ID_MACHINE_JERK_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_jerk_settings(); - } - break; - #endif + lv_draw_jerk_settings(); + break; + #endif } } void lv_draw_machine_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonAcceleration, *labelAcceleration, *buttonAccelerationNarrow; - lv_obj_t *buttonMaxFeedrate, *labelMaxFeedrate, *buttonMaxFeedrateNarrow; - #if HAS_CLASSIC_JERK - lv_obj_t *buttonJerk, *labelJerk, *buttonJerkNarrow; - #endif - lv_obj_t * line1, * line2; - #if HAS_CLASSIC_JERK - lv_obj_t * line3; - #endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_SETTINGS_UI; } disp_state = MACHINE_SETTINGS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MachineConfigTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - buttonAcceleration = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(buttonAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y); // Set its position - lv_obj_set_size(buttonAcceleration, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonAcceleration, event_handler, ID_MACHINE_ACCELERATION, NULL, 0); - lv_btn_use_label_style(buttonAcceleration); - lv_btn_set_layout(buttonAcceleration, LV_LAYOUT_OFF); - labelAcceleration = lv_label_create_empty(buttonAcceleration); // Add a label to the button - - buttonAccelerationNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_MACHINE_ACCELERATION_ARROW); - - line1 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line1, line_points[0]); - - buttonMaxFeedrate = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(buttonMaxFeedrate, PARA_UI_POS_X, PARA_UI_POS_Y * 2); // Set its position - lv_obj_set_size(buttonMaxFeedrate, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonMaxFeedrate, event_handler, ID_MACHINE_FEEDRATE, NULL, 0); - lv_btn_use_label_style(buttonMaxFeedrate); - lv_btn_set_layout(buttonMaxFeedrate, LV_LAYOUT_OFF); - labelMaxFeedrate = lv_label_create_empty(buttonMaxFeedrate); // Add a label to the button - - buttonMaxFeedrateNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_MACHINE_FEEDRATE_ARROW); - - line2 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line2, line_points[1]); - + lv_screen_menu_item(scr, machine_menu.AccelerationConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MACHINE_ACCELERATION, 0); + lv_screen_menu_item(scr, machine_menu.MaxFeedRateConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MACHINE_FEEDRATE, 1); #if HAS_CLASSIC_JERK - buttonJerk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(buttonJerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3); // Set its position - lv_obj_set_size(buttonJerk, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonJerk, event_handler, ID_MACHINE_JERK, NULL, 0); - lv_btn_use_label_style(buttonJerk); - lv_btn_set_layout(buttonJerk, LV_LAYOUT_OFF); - labelJerk = lv_label_create_empty(buttonJerk); // Add a label to the button - - buttonJerkNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V, event_handler, ID_MACHINE_JERK_ARROW); - - line3 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line3, line_points[2]); - #endif - - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", event_handler, ID_MACHINE_RETURN); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelAcceleration, machine_menu.AccelerationConf); - lv_obj_align(labelAcceleration, buttonAcceleration, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelMaxFeedrate, machine_menu.MaxFeedRateConf); - lv_obj_align(labelMaxFeedrate, buttonMaxFeedrate, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if HAS_CLASSIC_JERK - lv_label_set_text(labelJerk, machine_menu.JerkConf); - lv_obj_align(labelJerk, buttonJerk, LV_ALIGN_IN_LEFT_MID, 0, 0); - #endif - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAcceleration); - lv_group_add_obj(g, buttonMaxFeedrate); - #if HAS_CLASSIC_JERK - lv_group_add_obj(g, buttonJerk); - #endif - lv_group_add_obj(g, buttonBack); - } + lv_screen_menu_item(scr, machine_menu.JerkConf, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_MACHINE_JERK, 2); #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_MACHINE_RETURN, true); } void lv_clear_machine_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 8c0575d343..0513437353 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -33,201 +33,109 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_M_POINT1 1 -#define ID_M_POINT2 2 -#define ID_M_POINT3 3 -#define ID_M_POINT4 4 -#define ID_M_POINT5 5 -#define ID_MANUAL_RETURN 6 +enum { + ID_M_POINT1 = 1, + ID_M_POINT2, + ID_M_POINT3, + ID_M_POINT4, + ID_M_POINT5, + ID_MANUAL_RETURN +}; + +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; -static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_M_POINT1: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[0][0], (int)gCfgItems.levelingPos[0][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; } + queue.enqueue_now_P(PSTR("G1 Z10")); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[0][0], (int)gCfgItems.levelingPos[0][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } break; case ID_M_POINT2: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[1][0], (int)gCfgItems.levelingPos[1][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; } + queue.enqueue_now_P(PSTR("G1 Z10")); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[1][0], (int)gCfgItems.levelingPos[1][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } break; case ID_M_POINT3: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[2][0], (int)gCfgItems.levelingPos[2][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; } + queue.enqueue_now_P(PSTR("G1 Z10")); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[2][0], (int)gCfgItems.levelingPos[2][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } break; case ID_M_POINT4: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[3][0], (int)gCfgItems.levelingPos[3][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; } + queue.enqueue_now_P(PSTR("G1 Z10")); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[3][0], (int)gCfgItems.levelingPos[3][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } break; case ID_M_POINT5: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[4][0], (int)gCfgItems.levelingPos[4][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; } + queue.enqueue_now_P(PSTR("G1 Z10")); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[4][0], (int)gCfgItems.levelingPos[4][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } - break; case ID_MANUAL_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_manualLevel(); - lv_draw_tool(); - } + lv_clear_manualLevel(); + lv_draw_tool(); break; } } void lv_draw_manualLevel(void) { - lv_obj_t *buttonPoint1, *buttonPoint2, *buttonPoint3, *buttonPoint4, *buttonPoint5; - lv_obj_t *buttonBack; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_UI; } disp_state = LEVELING_UI; - scr = lv_obj_create(NULL, NULL); - - // static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonPoint1 = lv_imgbtn_create(scr, "F:/bmp_leveling1.bin", INTERVAL_V, titleHeight, event_handler, ID_M_POINT1); + lv_obj_t *buttonPoint1 = lv_big_button_create(scr, "F:/bmp_leveling1.bin", leveling_menu.position1, INTERVAL_V, titleHeight, event_handler, ID_M_POINT1); lv_obj_clear_protect(buttonPoint1, LV_PROTECT_FOLLOW); - buttonPoint2 = lv_imgbtn_create(scr, "F:/bmp_leveling2.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_M_POINT2); - buttonPoint3 = lv_imgbtn_create(scr, "F:/bmp_leveling3.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_POINT3); - buttonPoint4 = lv_imgbtn_create(scr, "F:/bmp_leveling4.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_POINT4); - buttonPoint5 = lv_imgbtn_create(scr, "F:/bmp_leveling5.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_POINT5); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_MANUAL_RETURN); - - // Create labels on the image buttons - lv_obj_t *label_Point1 = lv_label_create_empty(buttonPoint1); - lv_obj_t *label_Point2 = lv_label_create_empty(buttonPoint2); - lv_obj_t *label_Point3 = lv_label_create_empty(buttonPoint3); - lv_obj_t *label_Point4 = lv_label_create_empty(buttonPoint4); - lv_obj_t *label_Point5 = lv_label_create_empty(buttonPoint5); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Point1, leveling_menu.position1); - lv_obj_align(label_Point1, buttonPoint1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Point2, leveling_menu.position2); - lv_obj_align(label_Point2, buttonPoint2, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Point3, leveling_menu.position3); - lv_obj_align(label_Point3, buttonPoint3, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Point4, leveling_menu.position4); - lv_obj_align(label_Point4, buttonPoint4, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Point5, leveling_menu.position5); - lv_obj_align(label_Point5, buttonPoint5, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPoint1); - lv_group_add_obj(g, buttonPoint2); - lv_group_add_obj(g, buttonPoint3); - lv_group_add_obj(g, buttonPoint4); - lv_group_add_obj(g, buttonPoint5); - lv_group_add_obj(g, buttonBack); - } - #endif + lv_big_button_create(scr, "F:/bmp_leveling2.bin", leveling_menu.position2, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_M_POINT2); + lv_big_button_create(scr, "F:/bmp_leveling3.bin", leveling_menu.position3, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_POINT3); + lv_big_button_create(scr, "F:/bmp_leveling4.bin", leveling_menu.position4, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_POINT4); + lv_big_button_create(scr, "F:/bmp_leveling5.bin", leveling_menu.position5, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_POINT5); + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_MANUAL_RETURN); } void lv_clear_manualLevel() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp index 3f51bc1a74..8dedcd4c7b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -29,353 +29,136 @@ #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_MANUAL_POS_RETURN 1 -#define ID_MANUAL_POS_X1 2 -#define ID_MANUAL_POS_Y1 3 -#define ID_MANUAL_POS_X2 4 -#define ID_MANUAL_POS_Y2 5 -#define ID_MANUAL_POS_X3 6 -#define ID_MANUAL_POS_Y3 7 -#define ID_MANUAL_POS_X4 8 -#define ID_MANUAL_POS_Y4 9 -#define ID_MANUAL_POS_X5 10 -#define ID_MANUAL_POS_Y5 11 -#define ID_MANUAL_POS_DOWN 12 -#define ID_MANUAL_POS_UP 13 +enum { + ID_MANUAL_POS_RETURN = 1, + ID_MANUAL_POS_X1, + ID_MANUAL_POS_Y1, + ID_MANUAL_POS_X2, + ID_MANUAL_POS_Y2, + ID_MANUAL_POS_X3, + ID_MANUAL_POS_Y3, + ID_MANUAL_POS_X4, + ID_MANUAL_POS_Y4, + ID_MANUAL_POS_X5, + ID_MANUAL_POS_Y5, + ID_MANUAL_POS_DOWN, + ID_MANUAL_POS_UP +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_MANUAL_POS_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_manual_level_pos_settings(); - draw_return_ui(); - } + uiCfg.para_ui_page = 0; + lv_clear_manual_level_pos_settings(); + draw_return_ui(); break; case ID_MANUAL_POS_X1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_x1; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_x1; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_Y1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y1; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_y1; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_X2: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_x2; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_x2; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_Y2: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y2; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_y2; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_X3: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_x3; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_x3; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_Y3: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y3; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_y3; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_X4: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_x4; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_x4; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_Y4: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y4; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_y4; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_X5: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y5; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_y5; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_Y5: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y5; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } + value = level_pos_y5; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); break; case ID_MANUAL_POS_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_manual_level_pos_settings(); - lv_draw_manual_level_pos_settings(); - } + uiCfg.para_ui_page = 0; + lv_clear_manual_level_pos_settings(); + lv_draw_manual_level_pos_settings(); break; case ID_MANUAL_POS_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_manual_level_pos_settings(); - lv_draw_manual_level_pos_settings(); - } + uiCfg.para_ui_page = 1; + lv_clear_manual_level_pos_settings(); + lv_draw_manual_level_pos_settings(); break; } } void lv_draw_manual_level_pos_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonX1Value = NULL, *labelX1Value = NULL; - lv_obj_t *buttonY1Value = NULL, *labelY1Value = NULL; - lv_obj_t *buttonX2Value = NULL, *labelX2Value = NULL; - lv_obj_t *buttonY2Value = NULL, *labelY2Value = NULL; - lv_obj_t *buttonX3Value = NULL, *labelX3Value = NULL; - lv_obj_t *buttonY3Value = NULL, *labelY3Value = NULL; - lv_obj_t *buttonX4Value = NULL, *labelX4Value = NULL; - lv_obj_t *buttonY4Value = NULL, *labelY4Value = NULL; - lv_obj_t *buttonX5Value = NULL, *labelX5Value = NULL; - lv_obj_t *buttonY5Value = NULL, *labelY5Value = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + char buf2[50]; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MANUAL_LEVELING_POSIGION_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MANUAL_LEVELING_POSIGION_UI; } disp_state = MANUAL_LEVELING_POSIGION_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.LevelingParaConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, leveling_menu.position1); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[0][1]); + lv_screen_menu_item_2_edit(scr, leveling_menu.position1, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y1, 0, buf2, ID_MANUAL_POS_X1, public_buf_l); - buttonX1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X1); - labelX1Value = lv_label_create_empty(buttonX1Value); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][0]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[1][1]); + lv_screen_menu_item_2_edit(scr, leveling_menu.position2, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MANUAL_POS_Y2, 1, buf2, ID_MANUAL_POS_X2, public_buf_l); - buttonY1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y1); - labelY1Value = lv_label_create_empty(buttonY1Value); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][0]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[2][1]); + lv_screen_menu_item_2_edit(scr, leveling_menu.position3, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_MANUAL_POS_Y3, 2, buf2, ID_MANUAL_POS_X3, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][0]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[3][1]); + lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_MANUAL_POS_Y4, 3, buf2, ID_MANUAL_POS_X4, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, leveling_menu.position2); - - buttonX2Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X2); - labelX2Value = lv_label_create_empty(buttonX2Value); - - buttonY2Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y2); - labelY2Value = lv_label_create_empty(buttonY2Value); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, leveling_menu.position3); - - buttonX3Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X3); - labelX3Value = lv_label_create_empty(buttonX3Value); - - buttonY3Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y3); - labelY3Value = lv_label_create_empty(buttonY3Value); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, leveling_menu.position4); - - buttonX4Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X4); - labelX4Value = lv_label_create_empty(buttonX4Value); - - buttonY4Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y4); - labelY4Value = lv_label_create_empty(buttonY4Value); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_DOWN, NULL, 0); - lv_btn_set_style_both(buttonTurnPage, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonX1Value); - lv_group_add_obj(g, buttonY1Value); - lv_group_add_obj(g, buttonX2Value); - lv_group_add_obj(g, buttonY2Value); - lv_group_add_obj(g, buttonX3Value); - lv_group_add_obj(g, buttonY3Value); - lv_group_add_obj(g, buttonX4Value); - lv_group_add_obj(g, buttonY4Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_DOWN, true); } else { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, leveling_menu.position5); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][0]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[4][1]); + lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y5, 0, buf2, ID_MANUAL_POS_X5, public_buf_l); - buttonX5Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_X5); - labelX5Value = lv_label_create_empty(buttonX5Value); - - buttonY5Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_MANUAL_POS_Y5); - labelY5Value = lv_label_create_empty(buttonY5Value); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_UP, NULL, 0); - lv_btn_set_style_both(buttonTurnPage, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonX5Value); - lv_group_add_obj(g, buttonY5Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_UP, true); } - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create_empty(buttonTurnPage); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_POS_RETURN, NULL, 0); - lv_btn_set_style_both(buttonBack, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create_empty(buttonBack); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language) { - if (uiCfg.para_ui_page != 1) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); - lv_label_set_text(labelX1Value, public_buf_l); - lv_obj_align(labelX1Value, buttonX1Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][1]); - lv_label_set_text(labelY1Value, public_buf_l); - lv_obj_align(labelY1Value, buttonY1Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][0]); - lv_label_set_text(labelX2Value, public_buf_l); - lv_obj_align(labelX2Value, buttonX2Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][1]); - lv_label_set_text(labelY2Value, public_buf_l); - lv_obj_align(labelY2Value, buttonY2Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][0]); - lv_label_set_text(labelX3Value, public_buf_l); - lv_obj_align(labelX3Value, buttonX3Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][1]); - lv_label_set_text(labelY3Value, public_buf_l); - lv_obj_align(labelY3Value, buttonY3Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][0]); - lv_label_set_text(labelX4Value, public_buf_l); - lv_obj_align(labelX4Value, buttonX4Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][1]); - lv_label_set_text(labelY4Value, public_buf_l); - lv_obj_align(labelY4Value, buttonY4Value, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - } - else { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][0]); - lv_label_set_text(labelX5Value, public_buf_l); - lv_obj_align(labelX5Value, buttonX5Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][1]); - lv_label_set_text(labelY5Value, public_buf_l); - lv_obj_align(labelY5Value, buttonY5Value, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_MANUAL_POS_RETURN, true); } void lv_clear_manual_level_pos_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index ff01ceaa6e..5088e859c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -29,254 +29,100 @@ #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_FEED_RETURN 1 -#define ID_FEED_X 2 -#define ID_FEED_Y 3 -#define ID_FEED_Z 4 -#define ID_FEED_E0 5 -#define ID_FEED_E1 6 -#define ID_FEED_DOWN 7 -#define ID_FEED_UP 8 +enum { + ID_FEED_RETURN = 1, + ID_FEED_X, + ID_FEED_Y, + ID_FEED_Z, + ID_FEED_E0, + ID_FEED_E1, + ID_FEED_DOWN, + ID_FEED_UP +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_FEED_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_max_feedrate_settings(); - draw_return_ui(); - } + uiCfg.para_ui_page = 0; + lv_clear_max_feedrate_settings(); + draw_return_ui(); break; case ID_FEED_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = XMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } + value = XMaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); break; case ID_FEED_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = YMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } + value = YMaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); break; case ID_FEED_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = ZMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } + value = ZMaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); break; case ID_FEED_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E0MaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } + value = E0MaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); break; case ID_FEED_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E1MaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } + value = E1MaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); break; case ID_FEED_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_max_feedrate_settings(); - lv_draw_max_feedrate_settings(); - } + uiCfg.para_ui_page = 0; + lv_clear_max_feedrate_settings(); + lv_draw_max_feedrate_settings(); break; case ID_FEED_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_max_feedrate_settings(); - lv_draw_max_feedrate_settings(); - } + uiCfg.para_ui_page = 1; + lv_clear_max_feedrate_settings(); + lv_draw_max_feedrate_settings(); break; } } void lv_draw_max_feedrate_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *buttonE1Value = NULL, *labelE1Value = NULL; - lv_obj_t *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MAXFEEDRATE_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MAXFEEDRATE_UI; } disp_state = MAXFEEDRATE_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MaxFeedRateConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.XMaxFeedRate); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.XMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_X, 0, public_buf_l); - buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_X); - lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); - labelXValue = lv_label_create_empty(buttonXValue); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.YMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FEED_Y, 1, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.ZMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_FEED_Z, 2, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.YMaxFeedRate); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.E0MaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_FEED_E0, 3, public_buf_l); - buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_Y); - lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); - labelYValue = lv_label_create_empty(buttonYValue); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.ZMaxFeedRate); - - buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_Z); - lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); - labelZValue = lv_label_create_empty(buttonZValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E0MaxFeedRate); - - buttonE0Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_E0); - lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); - labelE0Value = lv_label_create_empty(buttonE0Value); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_DOWN, NULL, 0); - lv_btn_set_style_both(buttonTurnPage, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonE0Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FEED_DOWN, true); } else { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.E1MaxFeedRate); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); + lv_screen_menu_item_1_edit(scr, machine_menu.E1MaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_E1, 0, public_buf_l); - buttonE1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_FEED_E1); - lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); - labelE1Value = lv_label_create_empty(buttonE1Value); - - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_UP, NULL, 0); - lv_btn_set_style_both(buttonTurnPage, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonE1Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FEED_UP, true); } - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create_empty(buttonTurnPage); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FEED_RETURN, NULL, 0); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - lv_btn_set_style_both(buttonBack, &style_para_back); - label_Back = lv_label_create_empty(buttonBack); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language) { - if (uiCfg.para_ui_page != 1) { - - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); - } - else { - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); - lv_label_set_text(labelE1Value, public_buf_l); - lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_FEED_RETURN, true); } void lv_clear_max_feedrate_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp index c54318a1b2..697b7de345 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -28,258 +28,78 @@ #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_MOTOR_RETURN 1 -#define ID_MOTOR_STEPS 2 -#define ID_MOTOR_STEPS_ARROW 3 -#define ID_MOTOR_TMC_CURRENT 4 -#define ID_MOTOR_TMC_CURRENT_ARROW 5 -#define ID_MOTOR_STEP_MODE 6 -#define ID_MOTOR_STEP_MODE_ARROW 7 -#define ID_HOME_SENSE 8 -#define ID_HOME_SENSE_ARROW 9 +enum { + ID_MOTOR_RETURN = 1, + ID_MOTOR_STEPS, + ID_MOTOR_TMC_CURRENT, + ID_MOTOR_STEP_MODE, + ID_HOME_SENSE +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_MOTOR_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - draw_return_ui(); - } + lv_clear_motor_settings(); + draw_return_ui(); break; case ID_MOTOR_STEPS: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_step_settings(); - } - break; - case ID_MOTOR_STEPS_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_step_settings(); - } + lv_clear_motor_settings(); + lv_draw_step_settings(); break; #if USE_SENSORLESS - case ID_HOME_SENSE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { + case ID_HOME_SENSE: lv_clear_motor_settings(); lv_draw_homing_sensitivity_settings(); - } - break; - case ID_HOME_SENSE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_homing_sensitivity_settings(); - } - break; + break; #endif - #if HAS_TRINAMIC_CONFIG - case ID_MOTOR_TMC_CURRENT: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_tmc_current_settings(); - } + #if HAS_TRINAMIC_CONFIG + case ID_MOTOR_TMC_CURRENT: + lv_clear_motor_settings(); + lv_draw_tmc_current_settings(); + break; + #if HAS_STEALTHCHOP + case ID_MOTOR_STEP_MODE: + lv_clear_motor_settings(); + lv_draw_tmc_step_mode_settings(); break; - case ID_MOTOR_TMC_CURRENT_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_tmc_current_settings(); - } - break; - #if HAS_STEALTHCHOP - case ID_MOTOR_STEP_MODE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_tmc_step_mode_settings(); - } - break; - case ID_MOTOR_STEP_MODE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_tmc_step_mode_settings(); - } - break; - #endif #endif + #endif } } void lv_draw_motor_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonSteps, *labelSteps, *buttonStepsNarrow; - lv_obj_t * line1; - #if USE_SENSORLESS - lv_obj_t *buttonSensitivity, *labelSensitivity, *buttonSensitivityNarrow; - lv_obj_t * line2; - #endif - #if HAS_TRINAMIC_CONFIG - #if USE_SENSORLESS - lv_obj_t * line3; - #else - lv_obj_t * line2; - #endif - lv_obj_t *buttonTMCcurrent, *labelTMCcurrent, *buttonTMCcurrentNarrow; - #if HAS_STEALTHCHOP - #if USE_SENSORLESS - lv_obj_t * line4; - #else - lv_obj_t * line3; - #endif - lv_obj_t *buttonStepMode, *labelStepMode, *buttonStepModeNarrow; - #endif - #endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOTOR_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MOTOR_SETTINGS_UI; } disp_state = MOTOR_SETTINGS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MotorConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - buttonSteps = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonSteps, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonSteps, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonSteps, event_handler, ID_MOTOR_STEPS, NULL, 0); - lv_btn_use_label_style(buttonSteps); - lv_btn_set_layout(buttonSteps, LV_LAYOUT_OFF); - labelSteps = lv_label_create_empty(buttonSteps); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSteps); - #endif - - buttonStepsNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V, event_handler, ID_MOTOR_STEPS_ARROW); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - + int index = 0; + lv_screen_menu_item(scr, machine_menu.StepsConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MOTOR_STEPS, index++); #if USE_SENSORLESS - buttonSensitivity = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2, PARA_UI_SIZE_X, PARA_UI_SIZE_Y, event_handler, ID_HOME_SENSE); - //lv_obj_set_event_cb(buttonMachine, event_handler); - labelSensitivity = lv_label_create_empty(buttonSensitivity); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSensitivity); - #endif - - buttonSensitivityNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V, event_handler, ID_HOME_SENSE_ARROW); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); + lv_screen_menu_item(scr, machine_menu.HomingSensitivityConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_HOME_SENSE, index); + index++; #endif - - #if HAS_TRINAMIC_CONFIG - buttonTMCcurrent = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonTMCcurrent, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2)); - lv_obj_set_size(buttonTMCcurrent, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonTMCcurrent, event_handler, ID_MOTOR_TMC_CURRENT, NULL, 0); - lv_btn_use_label_style(buttonTMCcurrent); - lv_btn_set_layout(buttonTMCcurrent, LV_LAYOUT_OFF); - labelTMCcurrent = lv_label_create_empty(buttonTMCcurrent); /*Add a label to the button*/ - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTMCcurrent); - #endif - - buttonTMCcurrentNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2) + PARA_UI_ARROW_V, event_handler, ID_MOTOR_TMC_CURRENT_ARROW); - - #if USE_SENSORLESS - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - #else - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - #endif - + lv_screen_menu_item(scr, machine_menu.TMCcurrentConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_MOTOR_TMC_CURRENT, index); + index++; #if HAS_STEALTHCHOP - buttonStepMode = lv_btn_create(scr, NULL, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3), PARA_UI_SIZE_X, PARA_UI_SIZE_Y, event_handler, ID_MOTOR_STEP_MODE); - labelStepMode = lv_label_create_empty(buttonStepMode); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonStepMode); - #endif - - buttonStepModeNarrow = lv_imgbtn_create(scr, "F:/bmp_arrow.bin", PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3) + PARA_UI_ARROW_V, event_handler, ID_MOTOR_STEP_MODE_ARROW); - - #if USE_SENSORLESS - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - #else - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - #endif - - #endif // HAS_STEALTHCHOP - - #endif // HAS_TRINAMIC_CONFIG - - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_MOTOR_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + lv_screen_menu_item(scr, machine_menu.TMCStepModeConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_MOTOR_STEP_MODE, index); + index++; + #endif #endif - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelSteps, machine_menu.StepsConf); - lv_obj_align(labelSteps, buttonSteps, LV_ALIGN_IN_LEFT_MID, 0, 0); - - #if USE_SENSORLESS - lv_label_set_text(labelSensitivity, machine_menu.HomingSensitivityConf); - lv_obj_align(labelSensitivity, buttonSensitivity, LV_ALIGN_IN_LEFT_MID, 0, 0); - #endif - #if HAS_TRINAMIC_CONFIG - lv_label_set_text(labelTMCcurrent, machine_menu.TMCcurrentConf); - lv_obj_align(labelTMCcurrent, buttonTMCcurrent, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if HAS_STEALTHCHOP - lv_label_set_text(labelStepMode, machine_menu.TMCStepModeConf); - lv_obj_align(labelStepMode, buttonStepMode, LV_ALIGN_IN_LEFT_MID, 0, 0); - #endif - #endif - } - + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_MOTOR_RETURN, true); } void lv_clear_motor_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 3dde4ad5a0..0718ffd86e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -33,210 +33,119 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; static lv_obj_t *labelV, *buttonV; -#define ID_M_X_P 1 -#define ID_M_X_N 2 -#define ID_M_Y_P 3 -#define ID_M_Y_N 4 -#define ID_M_Z_P 5 -#define ID_M_Z_N 6 -#define ID_M_STEP 7 -#define ID_M_RETURN 8 +enum { + ID_M_X_P = 1, + ID_M_X_N, + ID_M_Y_P, + ID_M_Y_N, + ID_M_Z_P, + ID_M_Z_N, + ID_M_STEP, + ID_M_RETURN +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_M_X_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_one_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 X%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_one_P(PSTR("G90")); - } + if (queue.length <= (BUFSIZE - 3)) { + queue.enqueue_one_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 X%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_one_P(PSTR("G90")); } break; case ID_M_X_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 X-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } + if (queue.length <= (BUFSIZE - 3)) { + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 X-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } break; case ID_M_Y_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Y%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } + if (queue.length <= (BUFSIZE - 3)) { + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 Y%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } break; case ID_M_Y_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Y-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } + if (queue.length <= (BUFSIZE - 3)) { + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 Y-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } break; case ID_M_Z_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } + if (queue.length <= (BUFSIZE - 3)) { + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 Z%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } break; case ID_M_Z_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } + if (queue.length <= (BUFSIZE - 3)) { + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 Z-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } break; case ID_M_STEP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (abs(10 * (int)uiCfg.move_dist) == 100) - uiCfg.move_dist = 0.1; - else - uiCfg.move_dist *= (float)10; - - disp_move_dist(); - } - + if (abs(10 * (int)uiCfg.move_dist) == 100) + uiCfg.move_dist = 0.1; + else + uiCfg.move_dist *= (float)10; + disp_move_dist(); break; case ID_M_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } + clear_cur_ui(); + draw_return_ui(); break; } } void lv_draw_move_motor(void) { - lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD, *buttonZI, *buttonZD, *buttonBack; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOVE_MOTOR_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = MOVE_MOTOR_UI; } disp_state = MOVE_MOTOR_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - // Create an Image button - buttonXI = lv_imgbtn_create(scr, "F:/bmp_xAdd.bin", INTERVAL_V, titleHeight, event_handler, ID_M_X_P); + lv_obj_t *buttonXI = lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_V, titleHeight, event_handler, ID_M_X_P); lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW); - buttonXD = lv_imgbtn_create(scr, "F:/bmp_xDec.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_X_N); - buttonYI = lv_imgbtn_create(scr, "F:/bmp_yAdd.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_M_Y_P); - buttonYD = lv_imgbtn_create(scr, "F:/bmp_yDec.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Y_N); - buttonZI = lv_imgbtn_create(scr, "F:/bmp_zAdd.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_Z_P); - buttonZD = lv_imgbtn_create(scr, "F:/bmp_zDec.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Z_N); + lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_X_N); + lv_big_button_create(scr, "F:/bmp_yAdd.bin", move_menu.y_add, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_M_Y_P); + lv_big_button_create(scr, "F:/bmp_yDec.bin", move_menu.y_dec, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Y_N); + lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_Z_P); + lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Z_N); - buttonV = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_STEP); - //lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); - - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN); - - // Create labels on the image buttons - lv_obj_t *labelXI = lv_label_create_empty(buttonXI); - lv_obj_t *labelXD = lv_label_create_empty(buttonXD); - lv_obj_t *labelYI = lv_label_create_empty(buttonYI); - lv_obj_t *labelYD = lv_label_create_empty(buttonYD); - lv_obj_t *labelZI = lv_label_create_empty(buttonZI); - lv_obj_t *labelZD = lv_label_create_empty(buttonZD); + // button with image and label changed dinamycally by disp_move_dist + buttonV = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_STEP); labelV = lv_label_create_empty(buttonV); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(labelXI, move_menu.x_add); - lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelXD, move_menu.x_dec); - lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelYI, move_menu.y_add); - lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelYD, move_menu.y_dec); - lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelZI, move_menu.z_add); - lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelZD, move_menu.z_dec); - lv_obj_align(labelZD, buttonZD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXI); - lv_group_add_obj(g, buttonXD); - lv_group_add_obj(g, buttonYI); - lv_group_add_obj(g, buttonYD); - lv_group_add_obj(g, buttonZI); - lv_group_add_obj(g, buttonZD); lv_group_add_obj(g, buttonV); - lv_group_add_obj(g, buttonBack); } #endif + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN); + disp_move_dist(); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 01d6e9a2d5..9ed4d60139 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -49,30 +49,32 @@ #include "../../../../module/probe.h" #endif -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *buttonValue = NULL; -static lv_obj_t *labelValue = NULL; +extern lv_group_t *g; +static lv_obj_t *scr; +static lv_obj_t *buttonValue = nullptr; +static lv_obj_t *labelValue = nullptr; -static char key_value[11] = {0}; -static uint8_t cnt = 0; -static char point_flg = 1; +static char key_value[11] = { 0 }; +static uint8_t cnt = 0; +static bool point_flag = true; -#define ID_NUM_KEY1 1 -#define ID_NUM_KEY2 2 -#define ID_NUM_KEY3 3 -#define ID_NUM_KEY4 4 -#define ID_NUM_KEY5 5 -#define ID_NUM_KEY6 6 -#define ID_NUM_KEY7 7 -#define ID_NUM_KEY8 8 -#define ID_NUM_KEY9 9 -#define ID_NUM_KEY0 10 -#define ID_NUM_BACK 11 -#define ID_NUM_RESET 12 -#define ID_NUM_CONFIRM 13 -#define ID_NUM_POINT 14 -#define ID_NUM_NAGETIVE 15 +enum { + ID_NUM_KEY1 = 1, + ID_NUM_KEY2, + ID_NUM_KEY3, + ID_NUM_KEY4, + ID_NUM_KEY5, + ID_NUM_KEY6, + ID_NUM_KEY7, + ID_NUM_KEY8, + ID_NUM_KEY9, + ID_NUM_KEY0, + ID_NUM_BACK, + ID_NUM_RESET, + ID_NUM_CONFIRM, + ID_NUM_POINT, + ID_NUM_NEGATIVE +}; static void disp_key_value() { char *temp; @@ -80,8 +82,6 @@ static void disp_key_value() { float milliamps; #endif - ZERO(public_buf_m); - switch (value) { case PrintAcceleration: sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.acceleration); @@ -289,14 +289,11 @@ static void disp_key_value() { #endif break; } - ZERO(key_value); + strcpy(key_value, public_buf_m); cnt = strlen(key_value); temp = strchr(key_value, '.'); - if (temp) - point_flg = 0; - else - point_flg = 1; + point_flag = !temp; lv_label_set_text(labelValue, key_value); lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); @@ -540,406 +537,218 @@ static void set_value_confirm() { gcode.process_subcommands_now_P(PSTR("M500")); } -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_NUM_KEY1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'1'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'1'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY2: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'2'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'2'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY3: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'3'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'3'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY4: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'4'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'4'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY5: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'5'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'5'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY6: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'6'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'6'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY7: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'7'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'7'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY8: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'8'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'8'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY9: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'9'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'9'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_KEY0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'0'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt <= 10) { + key_value[cnt] = (char)'0'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_BACK: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt > 0) - cnt--; - if (key_value[cnt] == (char)'.') point_flg = 1; - key_value[cnt] = (char)'\0'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - } + if (cnt > 0) cnt--; + if (key_value[cnt] == (char)'.') point_flag = true; + key_value[cnt] = (char)'\0'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); break; case ID_NUM_RESET: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - ZERO(key_value); - cnt = 0; - key_value[cnt] = (char)'0'; - point_flg = 1; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - } + ZERO(key_value); + cnt = 0; + key_value[cnt] = (char)'0'; + point_flag = true; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); break; case ID_NUM_POINT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if ((cnt != 0) && (point_flg == 1)) { - point_flg = 0; - key_value[cnt] = (char)'.'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + if (cnt != 0 && point_flag) { + point_flag = false; + key_value[cnt] = (char)'.'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; - case ID_NUM_NAGETIVE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt == 0) { - key_value[cnt] = (char)'-'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } + case ID_NUM_NEGATIVE: + if (cnt == 0) { + key_value[cnt] = (char)'-'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; } break; case ID_NUM_CONFIRM: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - last_disp_state = NUMBER_KEY_UI; - if (strlen(key_value) != 0) - set_value_confirm(); - lv_clear_number_key(); - draw_return_ui(); - } + last_disp_state = NUMBER_KEY_UI; + if (strlen(key_value) != 0) set_value_confirm(); + lv_clear_number_key(); + draw_return_ui(); break; } } void lv_draw_number_key(void) { - lv_obj_t *NumberKey_1 = NULL, *NumberKey_2 = NULL, *NumberKey_3 = NULL, *NumberKey_4 = NULL, *NumberKey_5 = NULL; - lv_obj_t *NumberKey_6 = NULL, *NumberKey_7 = NULL, *NumberKey_8 = NULL, *NumberKey_9 = NULL, *NumberKey_0 = NULL; - lv_obj_t *KeyPoint = NULL, *KeyConfirm = NULL, *KeyReset = NULL, *KeyBack = NULL; - lv_obj_t *Minus = NULL; - lv_obj_t *labelKey_1 = NULL, *labelKey_2 = NULL, *labelKey_3 = NULL, *labelKey_4 = NULL, *labelKey_5 = NULL; - lv_obj_t *labelKey_6 = NULL, *labelKey_7 = NULL, *labelKey_8 = NULL, *labelKey_9 = NULL, *labelKey_0 = NULL; - lv_obj_t *labelKeyPoint = NULL, *labelKeyConfirm = NULL, *labelKeyReset = NULL, *labelKeyBack = NULL; - lv_obj_t *labelMinus = NULL; - - buttonValue = NULL; - labelValue = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NUMBER_KEY_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = NUMBER_KEY_UI; } disp_state = NUMBER_KEY_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); //(void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - buttonValue = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonValue, 92, 40); /*Set its position*/ - lv_obj_set_size(buttonValue, 296, 40); - lv_obj_set_event_cb_mks(buttonValue, event_handler, ID_NUM_KEY1, NULL, 0); - lv_btn_set_style(buttonValue, LV_BTN_STYLE_REL, &style_num_text); /*Set the button's released style*/ - lv_btn_set_style(buttonValue, LV_BTN_STYLE_PR, &style_num_text); /*Set the button's pressed style*/ - //lv_btn_set_layout(buttonValue, LV_LAYOUT_OFF); - labelValue = lv_label_create_empty(buttonValue); /*Add a label to the button*/ + buttonValue = lv_btn_create(scr, 92, 40, 296, 40, event_handler, ID_NUM_KEY1, &style_num_text); + labelValue = lv_label_create_empty(buttonValue); - NumberKey_1 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_1, 92, 90); /*Set its position*/ - lv_obj_set_size(NumberKey_1, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_1, event_handler, ID_NUM_KEY1, NULL, 0); - lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_1, LV_LAYOUT_OFF); - labelKey_1 = lv_label_create_empty(NumberKey_1); /*Add a label to the button*/ + lv_obj_t *NumberKey_1 = lv_btn_create(scr, 92, 90, 68, 40, event_handler, ID_NUM_KEY1, &style_num_key_pre); + lv_obj_t *labelKey_1 = lv_label_create_empty(NumberKey_1); lv_label_set_text(labelKey_1, machine_menu.key_1); lv_obj_align(labelKey_1, NumberKey_1, LV_ALIGN_CENTER, 0, 0); - NumberKey_2 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_2, 168, 90); /*Set its position*/ - lv_obj_set_size(NumberKey_2, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_2, event_handler, ID_NUM_KEY2, NULL, 0); - lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_2, LV_LAYOUT_OFF); - labelKey_2 = lv_label_create_empty(NumberKey_2); /*Add a label to the button*/ + lv_obj_t *NumberKey_2 = lv_btn_create(scr, 168, 90, 68, 40, event_handler, ID_NUM_KEY2, &style_num_key_pre); + lv_obj_t *labelKey_2 = lv_label_create_empty(NumberKey_2); lv_label_set_text(labelKey_2, machine_menu.key_2); lv_obj_align(labelKey_2, NumberKey_2, LV_ALIGN_CENTER, 0, 0); - NumberKey_3 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_3, 244, 90); /*Set its position*/ - lv_obj_set_size(NumberKey_3, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_3, event_handler, ID_NUM_KEY3, NULL, 0); - lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_3, LV_LAYOUT_OFF); - labelKey_3 = lv_label_create_empty(NumberKey_3); /*Add a label to the button*/ + lv_obj_t *NumberKey_3 = lv_btn_create(scr, 244, 90, 68, 40, event_handler, ID_NUM_KEY3, &style_num_key_pre); + lv_obj_t *labelKey_3 = lv_label_create_empty(NumberKey_3); lv_label_set_text(labelKey_3, machine_menu.key_3); lv_obj_align(labelKey_3, NumberKey_3, LV_ALIGN_CENTER, 0, 0); - NumberKey_4 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_4, 92, 140); /*Set its position*/ - lv_obj_set_size(NumberKey_4, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_4, event_handler, ID_NUM_KEY4, NULL, 0); - lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_4, LV_LAYOUT_OFF); - labelKey_4 = lv_label_create_empty(NumberKey_4); /*Add a label to the button*/ + lv_obj_t *NumberKey_4 = lv_btn_create(scr, 92, 140, 68, 40, event_handler, ID_NUM_KEY4, &style_num_key_pre); + lv_obj_t *labelKey_4 = lv_label_create_empty(NumberKey_4); lv_label_set_text(labelKey_4, machine_menu.key_4); lv_obj_align(labelKey_4, NumberKey_4, LV_ALIGN_CENTER, 0, 0); - NumberKey_5 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_5, 168, 140); /*Set its position*/ - lv_obj_set_size(NumberKey_5, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_5, event_handler, ID_NUM_KEY5, NULL, 0); - lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_5, LV_LAYOUT_OFF); - labelKey_5 = lv_label_create_empty(NumberKey_5); /*Add a label to the button*/ + lv_obj_t *NumberKey_5 = lv_btn_create(scr, 168, 140, 68, 40, event_handler, ID_NUM_KEY5, &style_num_key_pre); + lv_obj_t *labelKey_5 = lv_label_create_empty(NumberKey_5); lv_label_set_text(labelKey_5, machine_menu.key_5); lv_obj_align(labelKey_5, NumberKey_5, LV_ALIGN_CENTER, 0, 0); - NumberKey_6 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_6, 244, 140); /*Set its position*/ - lv_obj_set_size(NumberKey_6, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_6, event_handler, ID_NUM_KEY6, NULL, 0); - lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_6, LV_LAYOUT_OFF); - labelKey_6 = lv_label_create_empty(NumberKey_6); /*Add a label to the button*/ + lv_obj_t *NumberKey_6 = lv_btn_create(scr, 244, 140, 68, 40, event_handler, ID_NUM_KEY6, &style_num_key_pre); + lv_obj_t *labelKey_6 = lv_label_create_empty(NumberKey_6); lv_label_set_text(labelKey_6, machine_menu.key_6); lv_obj_align(labelKey_6, NumberKey_6, LV_ALIGN_CENTER, 0, 0); - NumberKey_7 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_7, 92, 190); /*Set its position*/ - lv_obj_set_size(NumberKey_7, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_7, event_handler, ID_NUM_KEY7, NULL, 0); - lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_7, LV_LAYOUT_OFF); - labelKey_7 = lv_label_create_empty(NumberKey_7); /*Add a label to the button*/ + lv_obj_t *NumberKey_7 = lv_btn_create(scr, 92, 190, 68, 40, event_handler, ID_NUM_KEY7, &style_num_key_pre); + lv_obj_t *labelKey_7 = lv_label_create_empty(NumberKey_7); lv_label_set_text(labelKey_7, machine_menu.key_7); lv_obj_align(labelKey_7, NumberKey_7, LV_ALIGN_CENTER, 0, 0); - NumberKey_8 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_8, 168, 190); /*Set its position*/ - lv_obj_set_size(NumberKey_8, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_8, event_handler, ID_NUM_KEY8, NULL, 0); - lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_8, LV_LAYOUT_OFF); - labelKey_8 = lv_label_create_empty(NumberKey_8); /*Add a label to the button*/ + lv_obj_t *NumberKey_8 = lv_btn_create(scr, 168, 190, 68, 40, event_handler, ID_NUM_KEY8, &style_num_key_pre); + lv_obj_t *labelKey_8 = lv_label_create_empty(NumberKey_8); lv_label_set_text(labelKey_8, machine_menu.key_8); lv_obj_align(labelKey_8, NumberKey_8, LV_ALIGN_CENTER, 0, 0); - NumberKey_9 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_9, 244, 190); /*Set its position*/ - lv_obj_set_size(NumberKey_9, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_9, event_handler, ID_NUM_KEY9, NULL, 0); - lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_9, LV_LAYOUT_OFF); - labelKey_9 = lv_label_create_empty(NumberKey_9); /*Add a label to the button*/ + lv_obj_t *NumberKey_9 = lv_btn_create(scr, 244, 190, 68, 40, event_handler, ID_NUM_KEY9, &style_num_key_pre); + lv_obj_t *labelKey_9 = lv_label_create_empty(NumberKey_9); lv_label_set_text(labelKey_9, machine_menu.key_9); lv_obj_align(labelKey_9, NumberKey_9, LV_ALIGN_CENTER, 0, 0); - NumberKey_0 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_0, 92, 240); /*Set its position*/ - lv_obj_set_size(NumberKey_0, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_0, event_handler, ID_NUM_KEY0, NULL, 0); - lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_0, LV_LAYOUT_OFF); - labelKey_0 = lv_label_create_empty(NumberKey_0); /*Add a label to the button*/ + lv_obj_t *NumberKey_0 = lv_btn_create(scr, 92, 240, 68, 40, event_handler, ID_NUM_KEY0, &style_num_key_pre); + lv_obj_t *labelKey_0 = lv_label_create_empty(NumberKey_0); lv_label_set_text(labelKey_0, machine_menu.key_0); lv_obj_align(labelKey_0, NumberKey_0, LV_ALIGN_CENTER, 0, 0); - KeyBack = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(KeyBack, 320, 90); /*Set its position*/ - lv_obj_set_size(KeyBack, 68, 40); - lv_obj_set_event_cb_mks(KeyBack, event_handler, ID_NUM_BACK, NULL, 0); - lv_btn_set_style(KeyBack, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(KeyBack, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(KeyBack, LV_LAYOUT_OFF); - labelKeyBack = lv_label_create_empty(KeyBack); /*Add a label to the button*/ + lv_obj_t *KeyBack = lv_btn_create(scr, 320, 90, 68, 40, event_handler, ID_NUM_BACK, &style_num_key_pre); + lv_obj_t *labelKeyBack = lv_label_create_empty(KeyBack); lv_label_set_text(labelKeyBack, machine_menu.key_back); lv_obj_align(labelKeyBack, KeyBack, LV_ALIGN_CENTER, 0, 0); - KeyReset = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(KeyReset, 320, 140); /*Set its position*/ - lv_obj_set_size(KeyReset, 68, 40); - lv_obj_set_event_cb_mks(KeyReset, event_handler, ID_NUM_RESET, NULL, 0); - lv_btn_set_style(KeyReset, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(KeyReset, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(KeyReset, LV_LAYOUT_OFF); - labelKeyReset = lv_label_create_empty(KeyReset); /*Add a label to the button*/ + lv_obj_t *KeyReset = lv_btn_create(scr, 320, 140, 68, 40, event_handler, ID_NUM_RESET, &style_num_key_pre); + lv_obj_t *labelKeyReset = lv_label_create_empty(KeyReset); lv_label_set_text(labelKeyReset, machine_menu.key_reset); lv_obj_align(labelKeyReset, KeyReset, LV_ALIGN_CENTER, 0, 0); - KeyConfirm = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(KeyConfirm, 320, 190); /*Set its position*/ - lv_obj_set_size(KeyConfirm, 68, 90); - lv_obj_set_event_cb_mks(KeyConfirm, event_handler, ID_NUM_CONFIRM, NULL, 0); - lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(KeyConfirm, LV_LAYOUT_OFF); - labelKeyConfirm = lv_label_create_empty(KeyConfirm); /*Add a label to the button*/ + lv_obj_t *KeyConfirm = lv_btn_create(scr, 320, 190, 68, 90, event_handler, ID_NUM_CONFIRM, &style_num_key_pre); + lv_obj_t *labelKeyConfirm = lv_label_create_empty(KeyConfirm); lv_label_set_text(labelKeyConfirm, machine_menu.key_confirm); lv_obj_align(labelKeyConfirm, KeyConfirm, LV_ALIGN_CENTER, 0, 0); - KeyPoint = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(KeyPoint, 244, 240); /*Set its position*/ - lv_obj_set_size(KeyPoint, 68, 40); - lv_obj_set_event_cb_mks(KeyPoint, event_handler, ID_NUM_POINT, NULL, 0); - lv_btn_set_style(KeyPoint, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(KeyPoint, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(KeyPoint, LV_LAYOUT_OFF); - labelKeyPoint = lv_label_create_empty(KeyPoint); /*Add a label to the button*/ + lv_obj_t *KeyPoint = lv_btn_create(scr, 244, 240, 68, 40, event_handler, ID_NUM_POINT, &style_num_key_pre); + lv_obj_t *labelKeyPoint = lv_label_create_empty(KeyPoint); lv_label_set_text(labelKeyPoint, machine_menu.key_point); lv_obj_align(labelKeyPoint, KeyPoint, LV_ALIGN_CENTER, 0, 0); - Minus = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(Minus, 168, 240); /*Set its position*/ - lv_obj_set_size(Minus, 68, 40); - lv_obj_set_event_cb_mks(Minus, event_handler, ID_NUM_NAGETIVE, NULL, 0); - lv_btn_set_style(Minus, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(Minus, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(Minus, LV_LAYOUT_OFF); - labelMinus = lv_label_create_empty(Minus); /*Add a label to the button*/ + lv_obj_t *Minus = lv_btn_create(scr, 168, 240, 68, 40, event_handler, ID_NUM_NEGATIVE, &style_num_key_pre); + lv_obj_t *labelMinus = lv_label_create_empty(Minus); lv_label_set_text(labelMinus, machine_menu.negative); lv_obj_align(labelMinus, Minus, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index dc8bb57149..16f50c16c5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -35,141 +35,99 @@ #include "../../../../sd/cardreader.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_O_PRE_HEAT 1 -#define ID_O_EXTRUCT 2 -#define ID_O_MOV 3 -#define ID_O_FILAMENT 4 -#define ID_O_SPEED 5 -#define ID_O_RETURN 6 -#define ID_O_FAN 7 -#define ID_O_POWER_OFF 8 -#define ID_O_BABY_STEP 9 +enum { + ID_O_PRE_HEAT = 1, + ID_O_EXTRUCT, + ID_O_MOV, + ID_O_FILAMENT, + ID_O_SPEED, + ID_O_RETURN, + ID_O_FAN, + ID_O_POWER_OFF, + ID_O_BABY_STEP +}; static lv_obj_t *label_PowerOff; static lv_obj_t *buttonPowerOff; extern feedRate_t feedrate_mm_s; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_O_PRE_HEAT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_preHeat(); - } + lv_clear_operation(); + lv_draw_preHeat(); break; case ID_O_EXTRUCT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_extrusion(); - } + lv_clear_operation(); + lv_draw_extrusion(); break; case ID_O_MOV: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_move_motor(); - } + lv_clear_operation(); + lv_draw_move_motor(); break; case ID_O_FILAMENT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if HAS_MULTI_EXTRUDER - uiCfg.curSprayerChoose_bak = active_extruder; + #if HAS_MULTI_EXTRUDER + uiCfg.curSprayerChoose_bak = active_extruder; + #endif + if (uiCfg.print_state == WORKING) { + #if ENABLED(SDSUPPORT) + card.pauseSDPrint(); + stop_print_time(); + uiCfg.print_state = PAUSING; #endif - if (uiCfg.print_state == WORKING) { - #if ENABLED(SDSUPPORT) - card.pauseSDPrint(); - stop_print_time(); - uiCfg.print_state = PAUSING; - #endif - } - uiCfg.moveSpeed_bak = (uint16_t)feedrate_mm_s; - uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[active_extruder].target; - lv_clear_operation(); - lv_draw_filament_change(); } + uiCfg.moveSpeed_bak = (uint16_t)feedrate_mm_s; + uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[active_extruder].target; + lv_clear_operation(); + lv_draw_filament_change(); break; case ID_O_FAN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_fan(); - } + lv_clear_operation(); + lv_draw_fan(); break; case ID_O_SPEED: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_change_speed(); - } + lv_clear_operation(); + lv_draw_change_speed(); break; case ID_O_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } + clear_cur_ui(); + draw_return_ui(); break; case ID_O_POWER_OFF: - if (event == LV_EVENT_CLICKED) { - // nothing to do + if (gCfgItems.finish_power_off) { + gCfgItems.finish_power_off = false; + lv_imgbtn_set_src_both(buttonPowerOff, "F:/bmp_manual_off.bin"); + lv_label_set_text(label_PowerOff, printing_more_menu.manual); } - else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.finish_power_off) { - gCfgItems.finish_power_off = false; - lv_imgbtn_set_src_both(buttonPowerOff, "F:/bmp_manual_off.bin"); - lv_label_set_text(label_PowerOff, printing_more_menu.manual); - } - else { - gCfgItems.finish_power_off = true; - lv_imgbtn_set_src_both(buttonPowerOff, "F:/bmp_auto_off.bin"); - lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); - } - lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_obj_refresh_ext_draw_pad(label_PowerOff); - update_spi_flash(); + else { + gCfgItems.finish_power_off = true; + lv_imgbtn_set_src_both(buttonPowerOff, "F:/bmp_auto_off.bin"); + lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); } + lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + lv_obj_refresh_ext_draw_pad(label_PowerOff); + update_spi_flash(); break; case ID_O_BABY_STEP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_baby_stepping(); - } + lv_clear_operation(); + lv_draw_baby_stepping(); break; } } void lv_draw_operation(void) { - lv_obj_t *buttonPreHeat = NULL, *buttonExtrusion = NULL, *buttonSpeed = NULL; - lv_obj_t *buttonBack = NULL, *buttonFan = NULL; - lv_obj_t *labelPreHeat = NULL, *labelExtrusion = NULL; - lv_obj_t *label_Back = NULL, *label_Speed = NULL, *label_Fan = NULL; - lv_obj_t *buttonMove = NULL, *label_Move = NULL; - lv_obj_t *buttonBabyStep = NULL, *label_BabyStep = NULL; - lv_obj_t *buttonFilament = NULL, *label_Filament = NULL; + lv_obj_t *buttonExtrusion = nullptr, *buttonSpeed = nullptr, + *buttonBack = nullptr, + *labelPreHeat = nullptr, *labelExtrusion = nullptr, + *label_Back = nullptr, *label_Speed = nullptr, *label_Fan = nullptr, + *buttonMove = nullptr, *label_Move = nullptr, + *buttonBabyStep = nullptr, *label_BabyStep = nullptr, + *label_Filament = nullptr; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != OPERATE_UI) { disp_state_stack._disp_index++; @@ -177,20 +135,16 @@ void lv_draw_operation(void) { } disp_state = OPERATE_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonPreHeat = lv_imgbtn_create(scr, "F:/bmp_temp.bin", INTERVAL_V, titleHeight, event_handler, ID_O_PRE_HEAT); - buttonFilament = lv_imgbtn_create(scr, "F:/bmp_filamentchange.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_O_FILAMENT); - buttonFan = lv_imgbtn_create(scr, "F:/bmp_fan.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_O_FAN); + lv_obj_t *buttonPreHeat = lv_imgbtn_create(scr, "F:/bmp_temp.bin", INTERVAL_V, titleHeight, event_handler, ID_O_PRE_HEAT); + lv_obj_t *buttonFilament = lv_imgbtn_create(scr, "F:/bmp_filamentchange.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_O_FILAMENT); + lv_obj_t *buttonFan = lv_imgbtn_create(scr, "F:/bmp_fan.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_O_FAN); buttonPowerOff = lv_imgbtn_create(scr, gCfgItems.finish_power_off ? "F:/bmp_auto_off.bin" : "F:/bmp_manual_off.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_O_POWER_OFF); #if HAS_ROTARY_ENCODER diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index c7d2de2e1b..930773b129 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -29,132 +29,62 @@ #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_PAUSE_RETURN 1 -#define ID_PAUSE_X 2 -#define ID_PAUSE_Y 3 -#define ID_PAUSE_Z 4 +enum { + ID_PAUSE_RETURN = 1, + ID_PAUSE_X, + ID_PAUSE_Y, + ID_PAUSE_Z +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_PAUSE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_pause_position(); - draw_return_ui(); - } + lv_clear_pause_position(); + draw_return_ui(); break; case ID_PAUSE_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = pause_pos_x; - lv_clear_pause_position(); - lv_draw_number_key(); - } + value = pause_pos_x; + lv_clear_pause_position(); + lv_draw_number_key(); break; case ID_PAUSE_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = pause_pos_y; - lv_clear_pause_position(); - lv_draw_number_key(); - } + value = pause_pos_y; + lv_clear_pause_position(); + lv_draw_number_key(); break; case ID_PAUSE_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = pause_pos_z; - lv_clear_pause_position(); - lv_draw_number_key(); - } + value = pause_pos_z; + lv_clear_pause_position(); + lv_draw_number_key(); break; } } void lv_draw_pause_position(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; - - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PAUSE_POS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = PAUSE_POS_UI; } disp_state = PAUSE_POS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.PausePosText); - lv_refr_now(lv_refr_get_disp_refreshing()); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.xPos); + sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); + lv_screen_menu_item_1_edit(scr, machine_menu.xPos, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_X, 0, public_buf_l); - buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_PAUSE_X); - labelXValue = lv_label_create_empty(buttonXValue); + sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosY); + lv_screen_menu_item_1_edit(scr, machine_menu.yPos, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_PAUSE_Y, 1, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosZ); + lv_screen_menu_item_1_edit(scr, machine_menu.zPos, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_PAUSE_Z, 2, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.yPos); - - buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_PAUSE_Y); - labelYValue = lv_label_create_empty(buttonYValue); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.zPos); - - buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_PAUSE_Z); - labelZValue = lv_label_create_empty(buttonZValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - buttonBack = lv_btn_create_back(scr, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE, event_handler, ID_PAUSE_RETURN); - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosY); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosZ); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonBack); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_PAUSE_RETURN, true); } void lv_clear_pause_position() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 966d85b6de..a222c7adbf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -33,221 +33,163 @@ #include "../../../../module/temperature.h" #include "../../../../inc/MarlinConfig.h" -static lv_obj_t * scr; +static lv_obj_t *scr; extern lv_group_t* g; static lv_obj_t *buttonType, *buttonStep; static lv_obj_t *labelType; static lv_obj_t *labelStep; -static lv_obj_t * tempText1; +static lv_obj_t *tempText1; -#define ID_P_ADD 1 -#define ID_P_DEC 2 -#define ID_P_TYPE 3 -#define ID_P_STEP 4 -#define ID_P_OFF 5 -#define ID_P_RETURN 6 +enum { + ID_P_ADD = 1, + ID_P_DEC, + ID_P_TYPE, + ID_P_STEP, + ID_P_OFF, + ID_P_RETURN +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_P_ADD: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.curTempType == 0) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target += uiCfg.stepHeat; - if (uiCfg.curSprayerChoose == 0) { - if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - } + if (uiCfg.curTempType == 0) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target += uiCfg.stepHeat; + if (uiCfg.curSprayerChoose == 0) { + if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); } - #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER - else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - } - #endif - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } - #if HAS_HEATED_BED - else { - thermalManager.temp_bed.target += uiCfg.stepHeat; - if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { - thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); - } - thermalManager.start_watching_bed(); + #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); } #endif - disp_desire_temp(); + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } + #if HAS_HEATED_BED + else { + thermalManager.temp_bed.target += uiCfg.stepHeat; + if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { + thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); + } + thermalManager.start_watching_bed(); + } + #endif + disp_desire_temp(); break; case ID_P_DEC: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.curTempType == 0) { - if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > uiCfg.stepHeat) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target -= uiCfg.stepHeat; - } - else { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0; - } - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } - #if HAS_HEATED_BED - else { - if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) { - thermalManager.temp_bed.target -= uiCfg.stepHeat; - } - else { - thermalManager.temp_bed.target = (float)0; - } - thermalManager.start_watching_bed(); - } - #endif - disp_desire_temp(); - } + if (uiCfg.curTempType == 0) { + if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > uiCfg.stepHeat) + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target -= uiCfg.stepHeat; + else + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = 0; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } + #if HAS_HEATED_BED + else { + if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) + thermalManager.temp_bed.target -= uiCfg.stepHeat; + else + thermalManager.temp_bed.target = 0; + + thermalManager.start_watching_bed(); + } + #endif + disp_desire_temp(); break; case ID_P_TYPE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.curTempType == 0) { - if (ENABLED(HAS_MULTI_EXTRUDER)) { - if (uiCfg.curSprayerChoose == 0) { - uiCfg.curSprayerChoose = 1; - } - else if (uiCfg.curSprayerChoose == 1) { - if (TEMP_SENSOR_BED != 0) { - uiCfg.curTempType = 1; - } - else { - uiCfg.curTempType = 0; - uiCfg.curSprayerChoose = 0; - } - } + if (uiCfg.curTempType == 0) { + if (ENABLED(HAS_MULTI_EXTRUDER)) { + if (uiCfg.curSprayerChoose == 0) { + uiCfg.curSprayerChoose = 1; } - else if (uiCfg.curSprayerChoose == 0) { - if (TEMP_SENSOR_BED != 0) + else if (uiCfg.curSprayerChoose == 1) { + if (TEMP_SENSOR_BED != 0) { uiCfg.curTempType = 1; - else - uiCfg.curTempType = 0; + } + else { + uiCfg.curTempType = 0; + uiCfg.curSprayerChoose = 0; + } } } - else if (uiCfg.curTempType == 1) { - uiCfg.curSprayerChoose = 0; - uiCfg.curTempType = 0; + else if (uiCfg.curSprayerChoose == 0) { + if (TEMP_SENSOR_BED != 0) + uiCfg.curTempType = 1; + else + uiCfg.curTempType = 0; } - disp_temp_type(); } + else if (uiCfg.curTempType == 1) { + uiCfg.curSprayerChoose = 0; + uiCfg.curTempType = 0; + } + disp_temp_type(); break; case ID_P_STEP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - switch (uiCfg.stepHeat) { - case 1: uiCfg.stepHeat = 5; break; - case 5: uiCfg.stepHeat = 10; break; - case 10: uiCfg.stepHeat = 1; break; - default: break; - } - disp_step_heat(); + switch (uiCfg.stepHeat) { + case 1: uiCfg.stepHeat = 5; break; + case 5: uiCfg.stepHeat = 10; break; + case 10: uiCfg.stepHeat = 1; break; + default: break; } + disp_step_heat(); break; case ID_P_OFF: - if (event == LV_EVENT_CLICKED) { - // nothing to do + if (uiCfg.curTempType == 0) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = 0; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.curTempType == 0) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + #if HAS_HEATED_BED + else { + thermalManager.temp_bed.target = 0; + thermalManager.start_watching_bed(); } - #if HAS_HEATED_BED - else { - thermalManager.temp_bed.target = (float)0; - thermalManager.start_watching_bed(); - } - #endif - disp_desire_temp(); - } + #endif + disp_desire_temp(); break; case ID_P_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } + clear_cur_ui(); + draw_return_ui(); break; } } void lv_draw_preHeat(void) { - lv_obj_t *buttonAdd, *buttonDec; - lv_obj_t *buttonOff, *buttonBack; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRE_HEAT_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = PRE_HEAT_UI; } disp_state = PRE_HEAT_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - buttonAdd = lv_imgbtn_create(scr, "F:/bmp_Add.bin", INTERVAL_V, titleHeight, event_handler, ID_P_ADD); - lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - buttonDec = lv_imgbtn_create(scr, "F:/bmp_Dec.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_P_DEC); - buttonType = lv_imgbtn_create(scr, NULL, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_TYPE); - buttonStep = lv_imgbtn_create(scr, NULL, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_STEP); - buttonOff = lv_imgbtn_create(scr, "F:/bmp_speed0.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_OFF); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_RETURN); + lv_big_button_create(scr, "F:/bmp_Add.bin", preheat_menu.add, INTERVAL_V, titleHeight, event_handler, ID_P_ADD); + lv_big_button_create(scr, "F:/bmp_Dec.bin", preheat_menu.dec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_P_DEC); - // Create labels on the image buttons - lv_obj_t *labelAdd = lv_label_create_empty(buttonAdd); - lv_obj_t *labelDec = lv_label_create_empty(buttonDec); - labelType = lv_label_create_empty(buttonType); - labelStep = lv_label_create_empty(buttonStep); - lv_obj_t *labelOff = lv_label_create_empty(buttonOff); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(labelAdd, preheat_menu.add); - lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelDec, preheat_menu.dec); - lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOff, preheat_menu.off); - lv_obj_align(labelOff, buttonOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } + buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_TYPE); + buttonStep = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_STEP); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAdd); - lv_group_add_obj(g, buttonDec); lv_group_add_obj(g, buttonType); lv_group_add_obj(g, buttonStep); - lv_group_add_obj(g, buttonOff); - lv_group_add_obj(g, buttonBack); } #endif + lv_big_button_create(scr, "F:/bmp_speed0.bin", preheat_menu.off, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_OFF); + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_RETURN); + + // Create labels on the image buttons + labelType = lv_label_create_empty(buttonType); + labelStep = lv_label_create_empty(buttonStep); + disp_temp_type(); disp_step_heat(); @@ -289,10 +231,7 @@ void disp_desire_temp() { public_buf_l[0] = '\0'; if (uiCfg.curTempType == 0) { - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, preheat_menu.ext1); - else - strcat(public_buf_l, preheat_menu.ext2); + strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? preheat_menu.ext1 : preheat_menu.ext2); sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); } #if HAS_HEATED_BED @@ -304,7 +243,7 @@ void disp_desire_temp() { strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); lv_label_set_text(tempText1, public_buf_l); - lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); + lv_obj_align(tempText1, nullptr, LV_ALIGN_CENTER, 0, -50); } void disp_step_heat() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 8db84c5159..141ea4cd6f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -33,15 +33,17 @@ #include "../../../../sd/cardreader.h" #include "../../../../inc/MarlinConfig.h" -static lv_obj_t * scr; +static lv_obj_t *scr; extern lv_group_t* g; static lv_obj_t *buttonPageUp, *buttonPageDown, *buttonBack, *buttonGcode[FILE_BTN_CNT], *labelPageUp[FILE_BTN_CNT], *buttonText[FILE_BTN_CNT]; -#define ID_P_UP 7 -#define ID_P_DOWN 8 -#define ID_P_RETURN 9 +enum { + ID_P_UP = 7, + ID_P_DOWN, + ID_P_RETURN +}; int8_t curDirLever = 0; LIST_FILE list_file; @@ -74,38 +76,21 @@ uint8_t sel_id = 0; const uint16_t nr = SD_ORDER(i, fileCnt); card.getfilename_sorted(nr); - if (card.flag.filenameIsDir) { - //SERIAL_ECHOLN(card.longest_filename); - list_file.IsFolder[valid_name_cnt] = 1; - } - else { - //SERIAL_ECHOLN(card.longFilename); - list_file.IsFolder[valid_name_cnt] = 0; - } + list_file.IsFolder[valid_name_cnt] = card.flag.filenameIsDir; + strcpy(list_file.file_name[valid_name_cnt], list_file.curDirPath); + strcat_P(list_file.file_name[valid_name_cnt], PSTR("/")); + strcat(list_file.file_name[valid_name_cnt], card.filename); + strcpy(list_file.long_name[valid_name_cnt], card.longest_filename()); - #if 1 - // - memset(list_file.file_name[valid_name_cnt], 0, strlen(list_file.file_name[valid_name_cnt])); - strcpy(list_file.file_name[valid_name_cnt], list_file.curDirPath); - strcat_P(list_file.file_name[valid_name_cnt], PSTR("/")); - strcat(list_file.file_name[valid_name_cnt], card.filename); - // - memset(list_file.long_name[valid_name_cnt], 0, strlen(list_file.long_name[valid_name_cnt])); - if (card.longFilename[0] == 0) - strncpy(list_file.long_name[valid_name_cnt], card.filename, strlen(card.filename)); - else - strncpy(list_file.long_name[valid_name_cnt], card.longFilename, strlen(card.longFilename)); - - valid_name_cnt++; - if (valid_name_cnt == 1) - dir_offset[curDirLever].cur_page_first_offset = list_file.Sd_file_offset; - if (valid_name_cnt >= FILE_NUM) { - dir_offset[curDirLever].cur_page_last_offset = list_file.Sd_file_offset; - list_file.Sd_file_offset++; - break; - } + valid_name_cnt++; + if (valid_name_cnt == 1) + dir_offset[curDirLever].cur_page_first_offset = list_file.Sd_file_offset; + if (valid_name_cnt >= FILE_NUM) { + dir_offset[curDirLever].cur_page_last_offset = list_file.Sd_file_offset; list_file.Sd_file_offset++; - #endif + break; + } + list_file.Sd_file_offset++; } list_file.Sd_file_cnt++; } @@ -115,125 +100,105 @@ uint8_t sel_id = 0; #endif // SDSUPPORT -uint8_t have_pre_pic(char *path) { +bool have_pre_pic(char *path) { #if ENABLED(SDSUPPORT) char *ps1, *ps2, *cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); card.read(public_buf, 512); ps1 = strstr((char *)public_buf, ";simage:"); card.read(public_buf, 512); ps2 = strstr((char *)public_buf, ";simage:"); - if (ps1 || ps2) { - card.closefile(); - return 1; - } card.closefile(); + if (ps1 || ps2) return true; #endif - return 0; + return false; } -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; uint8_t i, file_count = 0; //switch (obj->mks_obj_id) //{ if (obj->mks_obj_id == ID_P_UP) { - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - if (dir_offset[curDirLever].curPage > 0) { - // 2015.05.19 - list_file.Sd_file_cnt = 0; + if (dir_offset[curDirLever].curPage > 0) { + // 2015.05.19 + list_file.Sd_file_cnt = 0; - if (dir_offset[curDirLever].cur_page_first_offset >= FILE_NUM) - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset - FILE_NUM; + if (dir_offset[curDirLever].cur_page_first_offset >= FILE_NUM) + list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset - FILE_NUM; - #if ENABLED(SDSUPPORT) - file_count = search_file(); - #endif - if (file_count != 0) { - dir_offset[curDirLever].curPage--; - lv_clear_print_file(); - disp_gcode_icon(file_count); - } + #if ENABLED(SDSUPPORT) + file_count = search_file(); + #endif + if (file_count != 0) { + dir_offset[curDirLever].curPage--; + lv_clear_print_file(); + disp_gcode_icon(file_count); } } } else if (obj->mks_obj_id == ID_P_DOWN) { - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - if (dir_offset[curDirLever].cur_page_last_offset > 0) { - list_file.Sd_file_cnt = 0; - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_last_offset + 1; - #if ENABLED(SDSUPPORT) - file_count = search_file(); - #endif - if (file_count != 0) { - dir_offset[curDirLever].curPage++; - lv_clear_print_file(); - disp_gcode_icon(file_count); - } - if (file_count < FILE_NUM) - dir_offset[curDirLever].cur_page_last_offset = 0; + if (dir_offset[curDirLever].cur_page_last_offset > 0) { + list_file.Sd_file_cnt = 0; + list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_last_offset + 1; + #if ENABLED(SDSUPPORT) + file_count = search_file(); + #endif + if (file_count != 0) { + dir_offset[curDirLever].curPage++; + lv_clear_print_file(); + disp_gcode_icon(file_count); } + if (file_count < FILE_NUM) + dir_offset[curDirLever].cur_page_last_offset = 0; } } else if (obj->mks_obj_id == ID_P_RETURN) { - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - if (curDirLever > 0) { - int8_t *ch = (int8_t *)strrchr(list_file.curDirPath, '/'); - if (ch) { - *ch = 0; - #if ENABLED(SDSUPPORT) - card.cdup(); - #endif - dir_offset[curDirLever].curPage = 0; - dir_offset[curDirLever].cur_page_first_offset = 0; - dir_offset[curDirLever].cur_page_last_offset = 0; - curDirLever--; - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - #if ENABLED(SDSUPPORT) - file_count = search_file(); - #endif - lv_clear_print_file(); - disp_gcode_icon(file_count); - } - } - else { + if (curDirLever > 0) { + int8_t *ch = (int8_t *)strrchr(list_file.curDirPath, '/'); + if (ch) { + *ch = 0; + #if ENABLED(SDSUPPORT) + card.cdup(); + #endif + dir_offset[curDirLever].curPage = 0; + dir_offset[curDirLever].cur_page_first_offset = 0; + dir_offset[curDirLever].cur_page_last_offset = 0; + curDirLever--; + list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; + #if ENABLED(SDSUPPORT) + file_count = search_file(); + #endif lv_clear_print_file(); - lv_draw_ready_print(); + disp_gcode_icon(file_count); } } + else { + lv_clear_print_file(); + lv_draw_ready_print(); + } } else { for (i = 0; i < FILE_BTN_CNT; i++) { if (obj->mks_obj_id == (i + 1)) { - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - if (list_file.file_name[i][0] != 0) { - if (list_file.IsFolder[i] == 1) { - ZERO(list_file.curDirPath); - strcpy(list_file.curDirPath, list_file.file_name[i]); - curDirLever++; - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - #if ENABLED(SDSUPPORT) - file_count = search_file(); - #endif - lv_clear_print_file(); - disp_gcode_icon(file_count); - } - else { - sel_id = i; - lv_clear_print_file(); - lv_draw_dialog(DIALOG_TYPE_PRINT_FILE); - } - break; + if (list_file.file_name[i][0] != 0) { + if (list_file.IsFolder[i]) { + strcpy(list_file.curDirPath, list_file.file_name[i]); + curDirLever++; + list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; + #if ENABLED(SDSUPPORT) + file_count = search_file(); + #endif + lv_clear_print_file(); + disp_gcode_icon(file_count); } + else { + sel_id = i; + lv_clear_print_file(); + lv_draw_dialog(DIALOG_TYPE_PRINT_FILE); + } + break; } } } @@ -249,11 +214,11 @@ void lv_draw_print_file(void) { } disp_state = PRINT_FILE_UI; - curDirLever = 0; + curDirLever = 0; dir_offset[curDirLever].curPage = 0; list_file.Sd_file_offset = 0; - list_file.Sd_file_cnt = 0; + list_file.Sd_file_cnt = 0; ZERO(dir_offset); ZERO(list_file.IsFolder); @@ -287,14 +252,7 @@ static char test_public_buf_l[40]; void disp_gcode_icon(uint8_t file_num) { uint8_t i; - scr = lv_obj_create(NULL, NULL); - - //static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -319,17 +277,17 @@ void disp_gcode_icon(uint8_t file_num) { if (i >= file_num) break; #ifdef TFT35 - buttonGcode[i] = lv_imgbtn_create(scr, NULL); + buttonGcode[i] = lv_imgbtn_create(scr, nullptr); lv_imgbtn_use_label_style(buttonGcode[i]); lv_obj_clear_protect(buttonGcode[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonGcode[i], LV_LAYOUT_OFF); ZERO(public_buf_m); - cutFileName((char *)list_file.long_name[i], 16, 8, (char *)public_buf_m); + cutFileName((char *)list_file.long_name[i], 16, 8, (char *)public_buf_m); - if (list_file.IsFolder[i] == 1) { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); + if (list_file.IsFolder[i]) { + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0); lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_dir.bin"); if (i < 3) lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); @@ -344,34 +302,33 @@ void disp_gcode_icon(uint8_t file_num) { //lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), list_file.file_name[i], 1); - ZERO(test_public_buf_l); - strcat(test_public_buf_l,"S:"); - strcat(test_public_buf_l,list_file.file_name[i]); - char *temp = strstr(test_public_buf_l,".GCO"); - if (temp) { strcpy(temp,".bin"); } - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); + strcpy(test_public_buf_l, "S:"); + strcat(test_public_buf_l, list_file.file_name[i]); + char *temp = strstr(test_public_buf_l, ".GCO"); + if (temp) strcpy(temp, ".bin"); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0); lv_imgbtn_set_src_both(buttonGcode[i], test_public_buf_l); if (i < 3) { lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET); - buttonText[i] = lv_btn_create(scr, NULL); + buttonText[i] = lv_btn_create(scr, nullptr); //lv_obj_set_event_cb(buttonText[i], event_handler); lv_btn_use_label_style(buttonText[i]); lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); - //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL, 0); + //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),nullptr, 0); lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); lv_obj_set_size(buttonText[i], 100, 40); } else { lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET); - buttonText[i] = lv_btn_create(scr, NULL); + buttonText[i] = lv_btn_create(scr, nullptr); //lv_obj_set_event_cb(buttonText[i], event_handler); lv_btn_use_label_style(buttonText[i]); lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); - //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL, 0); + //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),nullptr, 0); lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); lv_obj_set_size(buttonText[i], 100, 40); } @@ -379,7 +336,7 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_align(labelPageUp[i], buttonText[i], LV_ALIGN_IN_BOTTOM_MID, 0, 0); } else { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0); lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_file.bin"); if (i < 3) lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); @@ -502,7 +459,7 @@ void lv_gcode_file_seek(uint32_t pos) { card.setIndex(pos); } -void cutFileName(char *path, int len, int bytePerLine, char *outStr) { +void cutFileName(char *path, int len, int bytePerLine, char *outStr) { #if _LFN_UNICODE TCHAR *tmpFile; TCHAR *strIndex1 = 0, *strIndex2 = 0, *beginIndex; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h index 083b3d9acf..94786ab070 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -43,7 +43,7 @@ typedef struct { char file_name[FILE_NUM][SHORT_NEME_LEN * MAX_DIR_LEVEL + 1]; char curDirPath[SHORT_NEME_LEN * MAX_DIR_LEVEL + 1]; char long_name[FILE_NUM][SHORT_NEME_LEN * 2 + 1]; - char IsFolder[FILE_NUM]; + bool IsFolder[FILE_NUM]; char Sd_file_cnt; char sd_file_index; char Sd_file_offset; @@ -55,7 +55,7 @@ extern void lv_draw_print_file(void); extern uint32_t lv_open_gcode_file(char *path); extern void lv_gcode_file_read(uint8_t *data_buf); extern void lv_close_gcode_file(); -extern void cutFileName(char *path, int len, int bytePerLine, char *outStr); +extern void cutFileName(char *path, int len, int bytePerLine, char *outStr); extern int ascii2dec_test(char *ascii); extern void lv_clear_print_file(); extern void lv_gcode_file_seek(uint32_t pos); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 312ce69d0c..8191d5fb65 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -59,78 +59,61 @@ TERN_(HAS_MULTI_EXTRUDER, static lv_obj_t *labelExt2); static lv_obj_t* labelBed; #endif -#define ID_PAUSE 1 -#define ID_STOP 2 -#define ID_OPTION 3 +enum { + ID_PAUSE = 1, + ID_STOP, + ID_OPTION +}; bool once_flag; // = false extern bool flash_preview_begin, default_preview_flg, gcode_preview_over; extern uint32_t To_pre_view; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + if (gcode_preview_over) return; switch (obj->mks_obj_id) { case ID_PAUSE: - if (event == LV_EVENT_CLICKED) { - // nothing to do + if (uiCfg.print_state == WORKING) { + // #if ENABLED(PARK_HEAD_ON_PAUSE) + // queue.inject_P(PSTR("M25 P\nM24")); + #if ENABLED(SDSUPPORT) + // queue.inject_P(PSTR("M25\nG91\nG1 Z10\nG90")); + card.pauseSDPrint(); + stop_print_time(); + uiCfg.print_state = PAUSING; + #endif + lv_imgbtn_set_src_both(buttonPause, "F:/bmp_resume.bin"); + lv_label_set_text(labelPause, printing_menu.resume); + lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); } - else if (event == LV_EVENT_RELEASED) { - if (!gcode_preview_over) { - if (uiCfg.print_state == WORKING) { - // #if ENABLED(PARK_HEAD_ON_PAUSE) - // queue.inject_P(PSTR("M25 P\nM24")); - #if ENABLED(SDSUPPORT) - // queue.inject_P(PSTR("M25\nG91\nG1 Z10\nG90")); - card.pauseSDPrint(); - stop_print_time(); - uiCfg.print_state = PAUSING; - #endif - lv_imgbtn_set_src_both(buttonPause, "F:/bmp_resume.bin"); - lv_label_set_text(labelPause, printing_menu.resume); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); - } - else if (uiCfg.print_state == PAUSED) { - uiCfg.print_state = RESUMING; - lv_imgbtn_set_src_both(obj, "F:/bmp_pause.bin"); - lv_label_set_text(labelPause, printing_menu.pause); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); - } - #if ENABLED(POWER_LOSS_RECOVERY) - else if (uiCfg.print_state == REPRINTING) { - uiCfg.print_state = REPRINTED; - lv_imgbtn_set_src_both(obj, "F:/bmp_pause.bin"); - lv_label_set_text(labelPause, printing_menu.pause); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); - // recovery.resume(); - print_time.minutes = recovery.info.print_job_elapsed / 60; - print_time.seconds = recovery.info.print_job_elapsed % 60; - print_time.hours = print_time.minutes / 60; - } - #endif + else if (uiCfg.print_state == PAUSED) { + uiCfg.print_state = RESUMING; + lv_imgbtn_set_src_both(obj, "F:/bmp_pause.bin"); + lv_label_set_text(labelPause, printing_menu.pause); + lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); + } + #if ENABLED(POWER_LOSS_RECOVERY) + else if (uiCfg.print_state == REPRINTING) { + uiCfg.print_state = REPRINTED; + lv_imgbtn_set_src_both(obj, "F:/bmp_pause.bin"); + lv_label_set_text(labelPause, printing_menu.pause); + lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); + // recovery.resume(); + print_time.minutes = recovery.info.print_job_elapsed / 60; + print_time.seconds = recovery.info.print_job_elapsed % 60; + print_time.hours = print_time.minutes / 60; } - } + #endif break; case ID_STOP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (!gcode_preview_over) { - lv_clear_printing(); - lv_draw_dialog(DIALOG_TYPE_STOP); - } - } + lv_clear_printing(); + lv_draw_dialog(DIALOG_TYPE_STOP); break; case ID_OPTION: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (!gcode_preview_over) { - lv_clear_printing(); - lv_draw_operation(); - } - } + lv_clear_printing(); + lv_draw_operation(); break; } } @@ -142,44 +125,38 @@ void lv_draw_printing(void) { disp_state = PRINTING_UI; - scr = lv_obj_create(NULL, NULL); - - // static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create image buttons - lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); + lv_obj_t *buttonExt1 = lv_img_create(scr, nullptr); lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); lv_obj_set_pos(buttonExt1, 205, 136); #if HAS_MULTI_EXTRUDER - lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); + lv_obj_t *buttonExt2 = lv_img_create(scr, nullptr); lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); lv_obj_set_pos(buttonExt2, 350, 136); #endif #if HAS_HEATED_BED - lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); + lv_obj_t *buttonBedstate = lv_img_create(scr, nullptr); lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); lv_obj_set_pos(buttonBedstate, 205, 186); #endif - lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); + lv_obj_t *buttonFanstate = lv_img_create(scr, nullptr); lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); lv_obj_set_pos(buttonFanstate, 350, 186); - lv_obj_t *buttonTime = lv_img_create(scr, NULL); + lv_obj_t *buttonTime = lv_img_create(scr, nullptr); lv_img_set_src(buttonTime, "F:/bmp_time_state.bin"); lv_obj_set_pos(buttonTime, 205, 86); - lv_obj_t *buttonZpos = lv_img_create(scr, NULL); + lv_obj_t *buttonZpos = lv_img_create(scr, nullptr); lv_img_set_src(buttonZpos, "F:/bmp_zpos_state.bin"); lv_obj_set_pos(buttonZpos, 350, 86); @@ -209,19 +186,19 @@ void lv_draw_printing(void) { //lv_btn_set_layout(buttonTime, LV_LAYOUT_OFF); //lv_btn_set_layout(buttonZpos, LV_LAYOUT_OFF); - labelExt1 = lv_label_create(scr, 250, 146, NULL); + labelExt1 = lv_label_create(scr, 250, 146, nullptr); #if HAS_MULTI_EXTRUDER - labelExt2 = lv_label_create(scr, 395, 146, NULL); + labelExt2 = lv_label_create(scr, 395, 146, nullptr); #endif #if HAS_HEATED_BED - labelBed = lv_label_create(scr, 250, 196, NULL); + labelBed = lv_label_create(scr, 250, 196, nullptr); #endif - labelFan = lv_label_create(scr, 395, 196, NULL); - labelTime = lv_label_create(scr, 250, 96, NULL); - labelZpos = lv_label_create(scr, 395, 96, NULL); + labelFan = lv_label_create(scr, 395, 196, nullptr); + labelTime = lv_label_create(scr, 250, 96, nullptr); + labelZpos = lv_label_create(scr, 395, 96, nullptr); labelPause = lv_label_create_empty(buttonPause); labelStop = lv_label_create_empty(buttonStop); @@ -238,7 +215,7 @@ void lv_draw_printing(void) { lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 20, 0); } - bar1 = lv_bar_create(scr, NULL); + bar1 = lv_bar_create(scr, nullptr); lv_obj_set_pos(bar1, 205, 36); lv_obj_set_size(bar1, 270, 40); lv_bar_set_style(bar1, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); @@ -256,12 +233,10 @@ void lv_draw_printing(void) { } void disp_ext_temp() { - ZERO(public_buf_l); sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - ZERO(public_buf_l); sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target); lv_label_set_text(labelExt2, public_buf_l); #endif @@ -269,20 +244,17 @@ void disp_ext_temp() { void disp_bed_temp() { #if HAS_HEATED_BED - ZERO(public_buf_l); sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); lv_label_set_text(labelBed, public_buf_l); #endif } void disp_fan_speed() { - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%3d"), thermalManager.fan_speed[0]); lv_label_set_text(labelFan, public_buf_l); } void disp_print_time() { - ZERO(public_buf_l); #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) const uint32_t r = ui.get_remaining_time(); sprintf_P(public_buf_l, PSTR("%02d:%02d R"), r / 3600, (r % 3600) / 60); @@ -293,7 +265,6 @@ void disp_print_time() { } void disp_fan_Zpos() { - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("%.3f"), current_position[Z_AXIS]); lv_label_set_text(labelZpos, public_buf_l); } @@ -333,7 +304,6 @@ void setProBarRate() { if (disp_state == PRINTING_UI) { lv_bar_set_value(bar1, rate, LV_ANIM_ON); - ZERO(public_buf_l); sprintf_P(public_buf_l, "%d%%", rate); lv_label_set_text(bar1ValueText,public_buf_l); lv_obj_align(bar1ValueText, bar1, LV_ALIGN_CENTER, 0, 0); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h index b7d464e4f0..466efe01cb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h @@ -25,14 +25,16 @@ extern "C" { /* C-declarations for C++ */ #endif -#define IDLE 0 -#define WORKING 1 -#define PAUSING 2 -#define PAUSED 3 -#define REPRINTING 4 -#define REPRINTED 5 -#define RESUMING 6 -#define STOP 7 +enum { + IDLE, + WORKING, + PAUSING, + PAUSED, + REPRINTING, + REPRINTED, + RESUMING, + STOP +}; extern void lv_draw_printing(void); extern void lv_clear_printing(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 765570ca3b..3e8a9aad5b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -43,44 +43,31 @@ //static lv_obj_t *buttonPrint, *buttonTool, *buttonSet; extern lv_group_t* g; -static lv_obj_t * scr; +static lv_obj_t *scr; #if ENABLED(MKS_TEST) uint8_t curent_disp_ui = 0; #endif -#define ID_TOOL 1 -#define ID_SET 2 -#define ID_PRINT 3 +enum { + ID_TOOL = 1, + ID_SET, + ID_PRINT +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_TOOL: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - - lv_clear_ready_print(); - lv_draw_tool(); - } + lv_clear_ready_print(); + lv_draw_tool(); break; case ID_SET: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_ready_print(); - lv_draw_set(); - } + lv_clear_ready_print(); + lv_draw_set(); break; case ID_PRINT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_ready_print(); - lv_draw_print_file(); - } + lv_clear_ready_print(); + lv_draw_print_file(); break; } } @@ -114,20 +101,16 @@ void mks_disp_test() { char buf[30] = {0}; //lv_obj_t *label_tool2 = lv_label_create_empty(scr); //lv_obj_set_pos(label_tool, 20, 50); - ZERO(buf); sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.temp_hotend[0].celsius); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND - ZERO(buf); sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.temp_hotend[1].celsius); lv_label_set_text(e2, buf); #endif - //ZERO(buf); //sprintf_P(buf, PSTR("e3:%d"), (int)thermalManager.temp_hotend[2].celsius); //lv_label_set_text(e3, buf); #if HAS_HEATED_BED - ZERO(buf); sprintf_P(buf, PSTR("bed:%d"), (int)thermalManager.temp_bed.celsius); lv_label_set_text(bed, buf); #endif @@ -135,7 +118,7 @@ void mks_disp_test() { void lv_draw_ready_print(void) { char buf[30] = {0}; - lv_obj_t *buttonPrint, *buttonTool, *buttonSet; + lv_obj_t *buttonTool; disp_state_stack._disp_index = 0; ZERO(disp_state_stack._disp_state); @@ -143,11 +126,7 @@ void lv_draw_ready_print(void) { disp_state = PRINT_READY_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); //lv_obj_set_hidden(scr, true); lv_refr_now(lv_refr_get_disp_refreshing()); @@ -155,12 +134,12 @@ void lv_draw_ready_print(void) { //(void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); // Create image buttons - //buttonPrint = lv_imgbtn_create(scr, NULL); + //buttonPrint = lv_imgbtn_create(scr, nullptr); buttonTool = lv_imgbtn_create(scr, "F:/bmp_tool.bin", event_handler, ID_TOOL); lv_obj_set_pos(buttonTool, 360, 180); - //buttonSet = lv_imgbtn_create(scr, NULL); + //buttonSet = lv_imgbtn_create(scr, nullptr); //lv_obj_set_pos(buttonSet, 180, 90); //lv_obj_set_pos(buttonPrint, 340, 90); @@ -237,34 +216,9 @@ void lv_draw_ready_print(void) { } else { - // Create an Image button - buttonTool = lv_imgbtn_create(scr, "F:/bmp_tool.bin", 20, 90, event_handler, ID_TOOL); - lv_obj_t *label_tool = lv_label_create_empty(buttonTool); - - buttonSet = lv_imgbtn_create(scr, "F:/bmp_set.bin", 180, 90, event_handler, ID_SET); - lv_obj_t *label_set = lv_label_create_empty(buttonSet); - - buttonPrint = lv_imgbtn_create(scr, "F:/bmp_printing.bin", 340, 90, event_handler, ID_PRINT); - lv_obj_t *label_print = lv_label_create_empty(buttonPrint); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_print, main_menu.print); - lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_set, main_menu.set); - lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_tool, main_menu.tool); - lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) { - lv_group_add_obj(g, buttonTool); - lv_group_add_obj(g, buttonSet); - lv_group_add_obj(g, buttonPrint); - } - #endif + lv_big_button_create(scr, "F:/bmp_tool.bin", main_menu.tool, 20, 90, event_handler, ID_TOOL); + lv_big_button_create(scr, "F:/bmp_set.bin", main_menu.set, 180, 90, event_handler, ID_SET); + lv_big_button_create(scr, "F:/bmp_printing.bin", main_menu.print, 340, 90, event_handler, ID_PRINT); } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index e4896866cf..46ea04deaf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -37,100 +37,58 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" -static lv_obj_t * scr; +static lv_obj_t *scr; extern lv_group_t* g; -#define ID_S_WIFI 1 -#define ID_S_FAN 2 -#define ID_S_ABOUT 3 -#define ID_S_CONTINUE 4 -#define ID_S_MOTOR_OFF 5 -#define ID_S_LANGUAGE 6 -#define ID_S_MACHINE_PARA 7 -#define ID_S_EEPROM_SET 8 -#define ID_S_RETURN 9 +enum { + ID_S_WIFI = 1, + ID_S_FAN, + ID_S_ABOUT, + ID_S_CONTINUE, + ID_S_MOTOR_OFF, + ID_S_LANGUAGE, + ID_S_MACHINE_PARA, + ID_S_EEPROM_SET, + ID_S_RETURN +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; #if ENABLED(USE_WIFI_FUNCTION) char buf[6] = { 0 }; #endif switch (obj->mks_obj_id) { - case ID_S_FAN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_fan(); - } + lv_clear_set(); + lv_draw_fan(); break; case ID_S_ABOUT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_about(); - } - break; - case ID_S_CONTINUE: - + lv_clear_set(); + lv_draw_about(); break; + case ID_S_CONTINUE: break; case ID_S_MOTOR_OFF: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if HAS_SUICIDE - suicide(); - #else - queue.enqueue_now_P(PSTR("M84")); - #endif - } + TERN(HAS_SUICIDE, suicide(), queue.enqueue_now_P(PSTR("M84"))); break; case ID_S_LANGUAGE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_language(); - } + lv_clear_set(); + lv_draw_language(); break; case ID_S_MACHINE_PARA: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_machine_para(); - } + lv_clear_set(); + lv_draw_machine_para(); break; case ID_S_EEPROM_SET: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_eeprom_settings(); - } + lv_clear_set(); + lv_draw_eeprom_settings(); break; case ID_S_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_ready_print(); - } + lv_clear_set(); + lv_draw_ready_print(); break; + #if ENABLED(USE_WIFI_FUNCTION) case ID_S_WIFI: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { if (gCfgItems.wifi_mode_sel == STA_MODEL) { if (wifi_link_state == WIFI_CONNECTED) { last_disp_state = SET_UI; @@ -153,7 +111,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else { last_disp_state = SET_UI; lv_clear_set(); - lv_draw_dialog(WIFI_ENABLE_TIPS); + lv_draw_dialog(DIALOG_WIFI_ENABLE_TIPS); } } } @@ -162,131 +120,36 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_clear_set(); lv_draw_wifi(); } - } - break; + break; #endif } } void lv_draw_set(void) { - lv_obj_t *buttonFan, *buttonAbout; - lv_obj_t *buMotorOff, *buttonBack; - #if HAS_LANG_SELECT_SCREEN - lv_obj_t *buttonLanguage; - #endif - lv_obj_t *buttonMachinePara; - lv_obj_t *buttonEepromSet; - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_t *buttonWifi; - #endif - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = SET_UI; } disp_state = SET_UI; - scr = lv_obj_create(NULL, NULL); - - //static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - // Create image buttons - buttonEepromSet = lv_imgbtn_create(scr, "F:/bmp_eeprom_settings.bin", INTERVAL_V, titleHeight, event_handler, ID_S_EEPROM_SET); - //buttonWifi = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, "F:/bmp_fan.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_S_FAN); - buttonAbout = lv_imgbtn_create(scr, "F:/bmp_about.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_S_ABOUT); - //buttonContinue = lv_imgbtn_create(scr, NULL); - buMotorOff = lv_imgbtn_create(scr, ENABLED(HAS_SUICIDE) ? "F:/bmp_manual_off.bin" : "F:/bmp_function1.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_S_MOTOR_OFF); - buttonMachinePara = lv_imgbtn_create(scr, "F:/bmp_machine_para.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_MACHINE_PARA); + lv_big_button_create(scr, "F:/bmp_eeprom_settings.bin", set_menu.eepromSet, INTERVAL_V, titleHeight, event_handler, ID_S_EEPROM_SET); + lv_big_button_create(scr, "F:/bmp_fan.bin", set_menu.fan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_S_FAN); + lv_big_button_create(scr, "F:/bmp_about.bin", set_menu.about, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_S_ABOUT); + lv_big_button_create(scr, ENABLED(HAS_SUICIDE) ? "F:/bmp_manual_off.bin" : "F:/bmp_function1.bin", set_menu.TERN(HAS_SUICIDE, shutdown, motoroff), BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_S_MOTOR_OFF); + lv_big_button_create(scr, "F:/bmp_machine_para.bin", set_menu.machine_para, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_MACHINE_PARA); #if HAS_LANG_SELECT_SCREEN - buttonLanguage = lv_imgbtn_create(scr, "F:/bmp_language.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_LANGUAGE); + lv_big_button_create(scr, "F:/bmp_language.bin", set_menu.language, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_LANGUAGE); #endif #if ENABLED(USE_WIFI_FUNCTION) - buttonWifi = lv_imgbtn_create(scr, "F:/bmp_wifi.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_WIFI); - #endif - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_RETURN); - - /*lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); - lv_obj_set_pos(buttonFan,BTN_X_PIXEL+INTERVAL_V*2,titleHeight); - lv_obj_set_pos(buttonAbout,BTN_X_PIXEL*2+INTERVAL_V*3,titleHeight); - lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); - lv_obj_set_pos(buMotorOff,INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonLanguage,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ - - //lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); - //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); - - /// Create labels on the buttons - //lv_obj_t *labelWifi= lv_label_create_empty(buttonWifi); - lv_obj_t *label_EepromSet = lv_label_create_empty(buttonEepromSet); - lv_obj_t *labelFan = lv_label_create_empty(buttonFan); - lv_obj_t *label_About = lv_label_create_empty(buttonAbout); - //lv_obj_t *label_Continue = lv_label_create_empty(buttonContinue); - lv_obj_t *label_MotorOff = lv_label_create_empty(buMotorOff); - lv_obj_t *label_MachinePara = lv_label_create_empty(buttonMachinePara); - #if HAS_LANG_SELECT_SCREEN - lv_obj_t *label_Language = lv_label_create_empty(buttonLanguage); - #endif - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_t *label_Wifi = lv_label_create_empty(buttonWifi); - #endif - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - - lv_label_set_text(label_EepromSet, set_menu.eepromSet); - lv_obj_align(label_EepromSet, buttonEepromSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelFan, set_menu.fan); - lv_obj_align(labelFan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_About, set_menu.about); - lv_obj_align(label_About, buttonAbout, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - //lv_label_set_text(label_Continue, set_menu.breakpoint); - //lv_obj_align(label_Continue, buttonContinue, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(label_MotorOff, set_menu.TERN(HAS_SUICIDE, shutdown, motoroff)); - lv_obj_align(label_MotorOff, buMotorOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_MachinePara, set_menu.machine_para); - lv_obj_align(label_MachinePara, buttonMachinePara, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - #if HAS_LANG_SELECT_SCREEN - lv_label_set_text(label_Language, set_menu.language); - lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - #endif - - #if ENABLED(USE_WIFI_FUNCTION) - lv_label_set_text(label_Wifi, set_menu.wifi); - lv_obj_align(label_Wifi, buttonWifi, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - #endif - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonEepromSet); - lv_group_add_obj(g, buttonFan); - lv_group_add_obj(g, buttonAbout); - lv_group_add_obj(g, buMotorOff); - lv_group_add_obj(g, buttonMachinePara); - lv_group_add_obj(g, buttonLanguage); - #if ENABLED(USE_WIFI_FUNCTION) - lv_group_add_obj(g, buttonWifi); - #endif - lv_group_add_obj(g, buttonBack); - } + lv_big_button_create(scr, "F:/bmp_wifi.bin", set_menu.wifi, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_WIFI); #endif + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_RETURN); } void lv_clear_set() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index 9f09389146..b2b1b00c3b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -29,243 +29,100 @@ #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_STEP_RETURN 1 -#define ID_STEP_X 2 -#define ID_STEP_Y 3 -#define ID_STEP_Z 4 -#define ID_STEP_E0 5 -#define ID_STEP_E1 6 -#define ID_STEP_DOWN 7 -#define ID_STEP_UP 8 +enum { + ID_STEP_RETURN = 1, + ID_STEP_X, + ID_STEP_Y, + ID_STEP_Z, + ID_STEP_E0, + ID_STEP_E1, + ID_STEP_DOWN, + ID_STEP_UP +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_STEP_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_step_settings(); - draw_return_ui(); - } + uiCfg.para_ui_page = 0; + lv_clear_step_settings(); + draw_return_ui(); break; case ID_STEP_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Xstep; - lv_clear_step_settings(); - lv_draw_number_key(); - } + value = Xstep; + lv_clear_step_settings(); + lv_draw_number_key(); break; case ID_STEP_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Ystep; - lv_clear_step_settings(); - lv_draw_number_key(); - } + value = Ystep; + lv_clear_step_settings(); + lv_draw_number_key(); break; case ID_STEP_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Zstep; - lv_clear_step_settings(); - lv_draw_number_key(); - } + value = Zstep; + lv_clear_step_settings(); + lv_draw_number_key(); break; case ID_STEP_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E0step; - lv_clear_step_settings(); - lv_draw_number_key(); - } + value = E0step; + lv_clear_step_settings(); + lv_draw_number_key(); break; case ID_STEP_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E1step; - lv_clear_step_settings(); - lv_draw_number_key(); - } + value = E1step; + lv_clear_step_settings(); + lv_draw_number_key(); break; case ID_STEP_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_step_settings(); - lv_draw_step_settings(); - } + uiCfg.para_ui_page = 0; + lv_clear_step_settings(); + lv_draw_step_settings(); break; case ID_STEP_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_step_settings(); - lv_draw_step_settings(); - } + uiCfg.para_ui_page = 1; + lv_clear_step_settings(); + lv_draw_step_settings(); break; } } void lv_draw_step_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *buttonE1Value = NULL, *labelE1Value = NULL; - lv_obj_t *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != STEPS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = STEPS_UI; } disp_state = STEPS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.StepsConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); if (uiCfg.para_ui_page != 1) { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.X_Steps); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.X_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_X, 0, public_buf_l); - buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_X); - labelXValue = lv_label_create_empty(buttonXValue); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.Y_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_STEP_Y, 1, public_buf_l); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.Z_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_STEP_Z, 2, public_buf_l); - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Y_Steps); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); + lv_screen_menu_item_1_edit(scr, machine_menu.E0_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_STEP_E0, 3, public_buf_l); - buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_Y); - labelYValue = lv_label_create_empty(buttonYValue); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Z_Steps); - - buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_Z); - labelZValue = lv_label_create_empty(buttonZValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E0_Steps); - - buttonE0Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_E0); - labelE0Value = lv_label_create_empty(buttonE0Value); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, event_handler, ID_STEP_DOWN); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonE0Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_STEP_DOWN, true); } else { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.E1_Steps); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); + lv_screen_menu_item_1_edit(scr, machine_menu.E1_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_E1, 0, public_buf_l); - buttonE1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_STEP_E1); - labelE1Value = lv_label_create_empty(buttonE1Value); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, event_handler, ID_STEP_UP); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonE1Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_STEP_UP, true); } - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create_empty(buttonTurnPage); - - buttonBack = lv_btn_create(scr, NULL); - lv_btn_set_style_both(buttonBack, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_STEP_RETURN, NULL, 0); - label_Back = lv_label_create_empty(buttonBack); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language) { - if (uiCfg.para_ui_page != 1) { - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); - } - else { - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); - lv_label_set_text(labelE1Value, public_buf_l); - lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_STEP_RETURN, true); } void lv_clear_step_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index a05cc257a8..777b93d1f5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -30,304 +30,138 @@ #include "../../../../feature/tmc_util.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_TMC_CURRENT_RETURN 1 -#define ID_TMC_CURRENT_X 2 -#define ID_TMC_CURRENT_Y 3 -#define ID_TMC_CURRENT_Z 4 -#define ID_TMC_CURRENT_E0 5 -#define ID_TMC_CURRENT_E1 6 -#define ID_TMC_CURRENT_DOWN 7 -#define ID_TMC_CURRENT_UP 8 +enum { + ID_TMC_CURRENT_RETURN = 1, + ID_TMC_CURRENT_X, + ID_TMC_CURRENT_Y, + ID_TMC_CURRENT_Z, + ID_TMC_CURRENT_E0, + ID_TMC_CURRENT_E1, + ID_TMC_CURRENT_DOWN, + ID_TMC_CURRENT_UP +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_TMC_CURRENT_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_current_settings(); - draw_return_ui(); - } + uiCfg.para_ui_page = 0; + lv_clear_tmc_current_settings(); + draw_return_ui(); break; + #if AXIS_IS_TMC(X) case ID_TMC_CURRENT_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Xcurrent; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } + value = Xcurrent; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); break; #endif - #if AXIS_IS_TMC(Y) - case ID_TMC_CURRENT_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { + case ID_TMC_CURRENT_Y: value = Ycurrent; lv_clear_tmc_current_settings(); lv_draw_number_key(); - } - break; + break; #endif - #if AXIS_IS_TMC(Z) - case ID_TMC_CURRENT_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { + case ID_TMC_CURRENT_Z: value = Zcurrent; lv_clear_tmc_current_settings(); lv_draw_number_key(); - } - break; + break; #endif - #if AXIS_IS_TMC(E0) case ID_TMC_CURRENT_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E0current; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } + value = E0current; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); break; #endif - #if AXIS_IS_TMC(E1) case ID_TMC_CURRENT_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E1current; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } + value = E1current; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); break; #endif - case ID_TMC_CURRENT_UP: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_current_settings(); - lv_draw_tmc_current_settings(); - } + case ID_TMC_CURRENT_UP: + uiCfg.para_ui_page = 0; + lv_clear_tmc_current_settings(); + lv_draw_tmc_current_settings(); break; case ID_TMC_CURRENT_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_tmc_current_settings(); - lv_draw_tmc_current_settings(); - } + uiCfg.para_ui_page = 1; + lv_clear_tmc_current_settings(); + lv_draw_tmc_current_settings(); break; } } void lv_draw_tmc_current_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *buttonE0Value = NULL, *labelE0Value = NULL; - - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - //#if AXIS_IS_TMC(E1) - lv_obj_t *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; - //#endif - float milliamps; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_CURRENT_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = TMC_CURRENT_UI; } disp_state = TMC_CURRENT_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.TmcCurrentConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + float milliamps; if (uiCfg.para_ui_page != 1) { - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.X_Current); - - buttonXValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_X); - labelXValue = lv_label_create_empty(buttonXValue); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, machine_menu.Y_Current); - - buttonYValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_Y); - labelYValue = lv_label_create_empty(buttonYValue); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, machine_menu.Z_Current); - - buttonZValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_Z); - labelZValue = lv_label_create_empty(buttonZValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - (void)lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.E0_Current); - - buttonE0Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_E0); - labelE0Value = lv_label_create_empty(buttonE0Value); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonE0Value); - } + #if AXIS_IS_TMC(X) + milliamps = stepperX.getMilliamps(); + #else + milliamps = -1; #endif + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_screen_menu_item_1_edit(scr, machine_menu.X_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_X, 0, public_buf_l); - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); + #if AXIS_IS_TMC(Y) + milliamps = stepperY.getMilliamps(); + #else + milliamps = -1; + #endif + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_screen_menu_item_1_edit(scr, machine_menu.Y_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_CURRENT_Y, 1, public_buf_l); - //#if AXIS_IS_TMC(E1) - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_DOWN, NULL, 0); - lv_btn_set_style_both(buttonTurnPage, &style_para_back); + #if AXIS_IS_TMC(Z) + milliamps = stepperZ.getMilliamps(); + #else + milliamps = -1; + #endif + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_screen_menu_item_1_edit(scr, machine_menu.Z_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_CURRENT_Z, 2, public_buf_l); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); - #endif - //#endif + #if AXIS_IS_TMC(E0) + milliamps = stepperE0.getMilliamps(); + #else + milliamps = -1; + #endif + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_screen_menu_item_1_edit(scr, machine_menu.E0_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_TMC_CURRENT_E0, 3, public_buf_l); + + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_DOWN, true); } else { - //#if AXIS_IS_TMC(E1) - labelE1Text = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.E1_Current); + #if AXIS_IS_TMC(E1) + milliamps = stepperE1.getMilliamps(); + #else + milliamps = -1; + #endif + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_screen_menu_item_1_edit(scr, machine_menu.E1_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_E1, 0, public_buf_l); - buttonE1Value = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_TMC_CURRENT_E1); - labelE1Value = lv_label_create_empty(buttonE1Value); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_UP, NULL, 0); - lv_btn_set_style_both(buttonTurnPage, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonE1Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - //#endif + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_UP, true); } - //#if AXIS_IS_TMC(E1) - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create_empty(buttonTurnPage); - //#endif - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_CURRENT_RETURN, NULL, 0); - lv_btn_set_style_both(buttonBack, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - if (uiCfg.para_ui_page != 1) { - //#if AXIS_IS_TMC(E1) - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - //#endif - #if AXIS_IS_TMC(X) - milliamps = stepperX.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_IS_TMC(Y) - milliamps = stepperY.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_IS_TMC(Z) - milliamps = stepperZ.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_IS_TMC(E0) - milliamps = stepperE0.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); - } - else { - //#if AXIS_IS_TMC(E1) - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - #if AXIS_IS_TMC(E1) - milliamps = stepperE1.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelE1Value, public_buf_l); - lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - //#endif - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_TMC_CURRENT_RETURN, true); } void lv_clear_tmc_current_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 2140af0793..3814dacfe1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -34,185 +34,83 @@ #include "../../../../module/settings.h" #endif -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_TMC_MODE_RETURN 1 -#define ID_TMC_MODE_X 2 -#define ID_TMC_MODE_Y 3 -#define ID_TMC_MODE_Z 4 -#define ID_TMC_MODE_E0 5 -#define ID_TMC_MODE_E1 6 -#define ID_TMC_MODE_DOWN 7 -#define ID_TMC_MODE_UP 8 +enum { + ID_TMC_MODE_RETURN = 1, + ID_TMC_MODE_X, + ID_TMC_MODE_Y, + ID_TMC_MODE_Z, + ID_TMC_MODE_E0, + ID_TMC_MODE_E1, + ID_TMC_MODE_DOWN, + ID_TMC_MODE_UP +}; -static lv_obj_t *labelXState = NULL, *labelYState = NULL, *labelZState = NULL, *labelE0State = NULL; -static lv_obj_t *buttonXState = NULL, *buttonYState = NULL, *buttonZState = NULL, *buttonE0State = NULL; +static lv_obj_t *buttonXState = nullptr, *buttonYState = nullptr, *buttonZState = nullptr, *buttonE0State = nullptr; //#if AXIS_HAS_STEALTHCHOP(E1) - static lv_obj_t *labelE1State = NULL, *buttonE1State = NULL; + static lv_obj_t *buttonE1State = nullptr; //#endif -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + + auto toggle_chop = [&](auto &stepper, auto &button) { + const bool isena = stepper.toggle_stepping_mode(); + lv_screen_menu_item_onoff_update(button, isena); + TERN_(EEPROM_SETTINGS, (void)settings.save()); + }; + switch (obj->mks_obj_id) { case ID_TMC_MODE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_step_mode_settings(); - draw_return_ui(); - } + uiCfg.para_ui_page = 0; + lv_clear_tmc_step_mode_settings(); + draw_return_ui(); break; #if AXIS_HAS_STEALTHCHOP(X) case ID_TMC_MODE_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperX.toggle_stepping_mode()) { - lv_imgbtn_set_src_both(buttonXState, "F:/bmp_enable.bin"); - lv_label_set_text(labelXState, machine_menu.enable); - } - else { - lv_imgbtn_set_src_both(buttonXState, "F:/bmp_disable.bin"); - lv_label_set_text(labelXState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - TERN_(EEPROM_SETTINGS, (void)settings.save()); - } + toggle_chop(stepperX, buttonXState); break; - #endif // if AXIS_HAS_STEALTHCHOP(X) - + #endif #if AXIS_HAS_STEALTHCHOP(Y) case ID_TMC_MODE_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperY.toggle_stepping_mode()) { - lv_imgbtn_set_src_both(buttonYState, "F:/bmp_enable.bin"); - lv_label_set_text(labelYState, machine_menu.enable); - } - else { - lv_imgbtn_set_src_both(buttonYState, "F:/bmp_disable.bin"); - lv_label_set_text(labelYState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - TERN_(EEPROM_SETTINGS, (void)settings.save()); - } + toggle_chop(stepperY, buttonYState); break; - #endif // if AXIS_HAS_STEALTHCHOP(Y) - + #endif #if AXIS_HAS_STEALTHCHOP(Z) case ID_TMC_MODE_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperZ.toggle_stepping_mode()) { - lv_imgbtn_set_src_both(buttonZState, "F:/bmp_enable.bin"); - lv_label_set_text(labelZState, machine_menu.enable); - } - else { - lv_imgbtn_set_src_both(buttonZState, "F:/bmp_disable.bin"); - lv_label_set_text(labelZState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - TERN_(EEPROM_SETTINGS, (void)settings.save()); - } + toggle_chop(stepperZ, buttonZState); break; - #endif // if AXIS_HAS_STEALTHCHOP(Z) - + #endif #if AXIS_HAS_STEALTHCHOP(E0) case ID_TMC_MODE_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperE0.toggle_stepping_mode()) { - lv_imgbtn_set_src_both(buttonE0State, "F:/bmp_enable.bin"); - lv_label_set_text(labelE0State, machine_menu.enable); - } - else { - lv_imgbtn_set_src_both(buttonE0State, "F:/bmp_disable.bin"); - lv_label_set_text(labelE0State, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - TERN_(EEPROM_SETTINGS, (void)settings.save()); - } + toggle_chop(stepperE0, buttonE0State); break; - #endif // if AXIS_HAS_STEALTHCHOP(E0) - + #endif #if AXIS_HAS_STEALTHCHOP(E1) case ID_TMC_MODE_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperE1.toggle_stepping_mode()) { - lv_imgbtn_set_src_both(buttonE1State, "F:/bmp_enable.bin"); - lv_label_set_text(labelE1State, machine_menu.enable); - } - else { - lv_imgbtn_set_src_both(buttonE1State, "F:/bmp_disable.bin"); - lv_label_set_text(labelE1State, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - TERN_(EEPROM_SETTINGS, (void)settings.save()); - } + toggle_chop(stepperE1, buttonE1State); break; - #endif // if AXIS_HAS_STEALTHCHOP(E1) - case ID_TMC_MODE_UP: - if (event == LV_EVENT_CLICKED) { + #endif - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_step_mode_settings(); - lv_draw_tmc_step_mode_settings(); - } + case ID_TMC_MODE_UP: + uiCfg.para_ui_page = 0; + lv_clear_tmc_step_mode_settings(); + lv_draw_tmc_step_mode_settings(); break; case ID_TMC_MODE_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_tmc_step_mode_settings(); - lv_draw_tmc_step_mode_settings(); - } + uiCfg.para_ui_page = 1; + lv_clear_tmc_step_mode_settings(); + lv_draw_tmc_step_mode_settings(); break; } } void lv_draw_tmc_step_mode_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXText = NULL, *labelXText = NULL; - lv_obj_t *buttonYText = NULL, *labelYText = NULL; - lv_obj_t *buttonZText = NULL, *labelZText = NULL; - lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL; - - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - //#if AXIS_HAS_STEALTHCHOP(E1) - lv_obj_t *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL; - //#endif - - labelXState = NULL; - buttonXState = NULL; - labelYState = NULL; - buttonYState = NULL; - labelZState = NULL; - buttonZState = NULL; - labelE0State = NULL; - buttonE0State = NULL; - //#if AXIS_HAS_STEALTHCHOP(E1) - labelE1State = NULL; - buttonE1State = NULL; - //#endif + buttonXState = buttonYState = buttonZState = buttonE0State = buttonE1State = nullptr; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_MODE_UI) { disp_state_stack._disp_index++; @@ -220,14 +118,8 @@ void lv_draw_tmc_step_mode_settings(void) { } disp_state = TMC_MODE_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.TmcStepModeConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); bool stealth_X = false, stealth_Y = false, stealth_Z = false, stealth_E0 = false, stealth_E1 = false; @@ -248,136 +140,18 @@ void lv_draw_tmc_step_mode_settings(void) { #endif if (uiCfg.para_ui_page != 1) { - buttonXText = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); - labelXText = lv_label_create_empty(buttonXText); /*Add a label to the button*/ - - buttonXState = lv_imgbtn_create(scr, stealth_X ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_X); - labelXState = lv_label_create_empty(buttonXState); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXState); - #endif - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonYText = lv_btn_create(scr, NULL, PARA_UI_POS_X, PARA_UI_POS_Y * 2, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); - labelYText = lv_label_create_empty(buttonYText); /*Add a label to the button*/ - - buttonYState = lv_imgbtn_create(scr, stealth_Y ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_Y); - labelYState = lv_label_create_empty(buttonYState); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYState); - #endif - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - buttonZText = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); - labelZText = lv_label_create_empty(buttonZText); /*Add a label to the button*/ - - buttonZState = lv_imgbtn_create(scr, stealth_Z ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_Z); - labelZState = lv_label_create_empty(buttonZState); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZState); - #endif - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - buttonE0Text = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); - labelE0Text = lv_label_create_empty(buttonE0Text); /*Add a label to the button*/ - - buttonE0State = lv_imgbtn_create(scr, stealth_E0 ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_E0); - labelE0State = lv_label_create_empty(buttonE0State); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE0State); - #endif - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - //#if AXIS_HAS_STEALTHCHOP(E1) - buttonTurnPage = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", event_handler, ID_TMC_MODE_DOWN); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); - #endif - //#endif + buttonXState = lv_screen_menu_item_onoff(scr, machine_menu.X_StepMode, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_MODE_X, 0, stealth_X); + buttonYState = lv_screen_menu_item_onoff(scr, machine_menu.Y_StepMode, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_MODE_Y, 1, stealth_Y); + buttonZState = lv_screen_menu_item_onoff(scr, machine_menu.Z_StepMode, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_MODE_Z, 2, stealth_Z); + buttonE0State = lv_screen_menu_item_onoff(scr, machine_menu.E0_StepMode, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_TMC_MODE_E0, 2, stealth_E0); + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_MODE_DOWN, true); } else { - //#if AXIS_HAS_STEALTHCHOP(E1) - buttonE1Text = lv_btn_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y, event_handler, 0); - labelE1Text = lv_label_create_empty(buttonE1Text); /*Add a label to the button*/ - - buttonE1State = lv_imgbtn_create(scr, stealth_E1 ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V, event_handler, ID_TMC_MODE_E1); - labelE1State = lv_label_create_empty(buttonE1State); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE1State); - #endif - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", event_handler, ID_TMC_MODE_UP); - //#endif + buttonE1State = lv_screen_menu_item_onoff(scr, machine_menu.E1_StepMode, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_MODE_E1, 0, stealth_E1); + lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_MODE_UP, true); } - //#if AXIS_HAS_STEALTHCHOP(E1) - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); - labelTurnPage = lv_label_create_empty(buttonTurnPage); - //#endif - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_TMC_MODE_RETURN); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - if (uiCfg.para_ui_page != 1) { - lv_label_set_text(labelXText, machine_menu.X_StepMode); - lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelYText, machine_menu.Y_StepMode); - lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelZText, machine_menu.Z_StepMode); - lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelE0Text, machine_menu.E0_StepMode); - lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelXState, stealth_X ? machine_menu.enable : machine_menu.disable); - lv_obj_align(labelXState, buttonXState, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelYState, stealth_Y ? machine_menu.enable : machine_menu.disable); - lv_obj_align(labelYState, buttonYState, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelZState, stealth_Z ? machine_menu.enable : machine_menu.disable); - lv_obj_align(labelZState, buttonZState, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelE0State, stealth_E0 ? machine_menu.enable : machine_menu.disable); - lv_obj_align(labelE0State, buttonE0State, LV_ALIGN_CENTER, 0, 0); - - //#if AXIS_HAS_STEALTHCHOP(E1) - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - //#endif - } - else { - //#if AXIS_HAS_STEALTHCHOP(E1) - lv_label_set_text(labelE1Text, machine_menu.E1_StepMode); - lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - lv_label_set_text(labelE1State, stealth_E1 ? machine_menu.enable : machine_menu.disable); - lv_obj_align(labelE1State, buttonE1State, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - //#endif - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_TMC_MODE_RETURN, true); } void lv_clear_tmc_step_mode_settings() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 8f31072978..2bbd544cc8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -34,182 +34,92 @@ #include "../../../../module/temperature.h" #include "../../../../inc/MarlinConfig.h" -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; -#define ID_T_PRE_HEAT 1 -#define ID_T_EXTRUCT 2 -#define ID_T_MOV 3 -#define ID_T_HOME 4 -#define ID_T_LEVELING 5 -#define ID_T_FILAMENT 6 -#define ID_T_MORE 7 -#define ID_T_RETURN 8 +enum { + ID_T_PRE_HEAT = 1, + ID_T_EXTRUCT, + ID_T_MOV, + ID_T_HOME, + ID_T_LEVELING, + ID_T_FILAMENT, + ID_T_MORE, + ID_T_RETURN +}; #if ENABLED(MKS_TEST) extern uint8_t curent_disp_ui; #endif -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_T_PRE_HEAT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_tool(); - lv_draw_preHeat(); - } + lv_clear_tool(); + lv_draw_preHeat(); break; case ID_T_EXTRUCT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_tool(); - lv_draw_extrusion(); - } + lv_clear_tool(); + lv_draw_extrusion(); break; case ID_T_MOV: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_tool(); - lv_draw_move_motor(); - } + lv_clear_tool(); + lv_draw_move_motor(); break; case ID_T_HOME: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_tool(); - lv_draw_home(); - } + lv_clear_tool(); + lv_draw_home(); break; case ID_T_LEVELING: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - //queue.enqueue_one_P(PSTR("G28")); - //queue.enqueue_one_P(PSTR("G29")); - get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); - public_buf_m[sizeof(public_buf_m)-1] = 0; - queue.inject_P(PSTR(public_buf_m)); - #else - uiCfg.leveling_first_time = 1; - lv_clear_tool(); - lv_draw_manualLevel(); - #endif - } + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + //queue.enqueue_one_P(PSTR("G28")); + //queue.enqueue_one_P(PSTR("G29")); + get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); + public_buf_m[sizeof(public_buf_m)-1] = 0; + queue.inject_P(PSTR(public_buf_m)); + #else + uiCfg.leveling_first_time = 1; + lv_clear_tool(); + lv_draw_manualLevel(); + #endif break; case ID_T_FILAMENT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; - lv_clear_tool(); - lv_draw_filament_change(); - } + uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; + lv_clear_tool(); + lv_draw_filament_change(); break; case ID_T_MORE: break; case ID_T_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - TERN_(MKS_TEST, curent_disp_ui = 1); - lv_clear_tool(); - lv_draw_ready_print(); - } + TERN_(MKS_TEST, curent_disp_ui = 1); + lv_clear_tool(); + lv_draw_ready_print(); break; } } void lv_draw_tool(void) { - lv_obj_t *buttonPreHeat, *buttonExtrusion, *buttonMove, *buttonHome, *buttonLevel; - lv_obj_t *buttonFilament; - lv_obj_t *buttonBack; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TOOL_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = TOOL_UI; } disp_state = TOOL_UI; - scr = lv_obj_create(NULL, NULL); - - //static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - // Create image buttons - buttonPreHeat = lv_imgbtn_create(scr, "F:/bmp_preHeat.bin", INTERVAL_V, titleHeight, event_handler, ID_T_PRE_HEAT); - buttonExtrusion = lv_imgbtn_create(scr, "F:/bmp_extruct.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_EXTRUCT); - buttonMove = lv_imgbtn_create(scr, "F:/bmp_mov.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_T_MOV); - buttonHome = lv_imgbtn_create(scr, "F:/bmp_zero.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_T_HOME); - buttonLevel = lv_imgbtn_create(scr, "F:/bmp_leveling.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_LEVELING); - buttonFilament = lv_imgbtn_create(scr, "F:/bmp_filamentchange.bin",BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight, event_handler,ID_T_FILAMENT); - //buttonMore = lv_imgbtn_createx(scr, NULL); - //lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN); + lv_big_button_create(scr, "F:/bmp_preHeat.bin", tool_menu.preheat, INTERVAL_V, titleHeight, event_handler, ID_T_PRE_HEAT); + lv_big_button_create(scr, "F:/bmp_extruct.bin", tool_menu.extrude, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_EXTRUCT); - // Create labels on the image buttons - lv_obj_t *labelPreHeat = lv_label_create_empty(buttonPreHeat); - lv_obj_t *labelExtrusion = lv_label_create_empty(buttonExtrusion); - lv_obj_t *label_Move = lv_label_create_empty(buttonMove); - lv_obj_t *label_Home = lv_label_create_empty(buttonHome); - lv_obj_t *label_Level = lv_label_create_empty(buttonLevel); - lv_obj_t *label_Filament = lv_label_create_empty(buttonFilament); - //lv_obj_t *label_More = lv_label_create_empty(buttonMore); - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); + lv_big_button_create(scr, "F:/bmp_mov.bin", tool_menu.move, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_T_MOV); + lv_big_button_create(scr, "F:/bmp_zero.bin", tool_menu.home, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_T_HOME); - if (gCfgItems.multiple_language) { - lv_label_set_text(labelPreHeat, tool_menu.preheat); - lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelExtrusion, tool_menu.extrude); - lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Move, tool_menu.move); - lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Home, tool_menu.home); - lv_obj_align(label_Home, buttonHome, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Level, tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling)); - lv_obj_align(label_Level, buttonLevel, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Filament, tool_menu.filament); - lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - //lv_label_set_text(label_More, tool_menu.more); - //lv_obj_align(label_More, buttonMore, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPreHeat); - lv_group_add_obj(g, buttonExtrusion); - lv_group_add_obj(g, buttonMove); - lv_group_add_obj(g, buttonHome); - lv_group_add_obj(g, buttonLevel); - lv_group_add_obj(g, buttonFilament); - lv_group_add_obj(g, buttonBack); - } - #endif + lv_big_button_create(scr, "F:/bmp_leveling.bin", tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling), INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_LEVELING); + lv_big_button_create(scr, "F:/bmp_filamentchange.bin", tool_menu.filament, BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight, event_handler,ID_T_FILAMENT); + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN); } void lv_clear_tool() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index ef23305285..2de5bf25e1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -61,13 +61,14 @@ uint32_t To_pre_view; bool gcode_preview_over, flash_preview_begin, default_preview_flg; uint32_t size = 809; uint16_t row; -uint8_t temperature_change_frequency; +bool temps_update_flag; uint8_t printing_rate_update_flag; extern bool once_flag; extern uint8_t sel_id; extern uint8_t public_buf[512]; extern uint8_t bmp_public_buf[17 * 1024]; +extern lv_group_t *g; extern void LCD_IO_WriteData(uint16_t RegValue); @@ -282,6 +283,9 @@ lv_style_t style_para_back; lv_style_t lv_bar_style_indic; +lv_style_t style_btn_pr; +lv_style_t style_btn_rel; + void tft_style_init() { lv_style_copy(&tft_style_scr, &lv_style_scr); tft_style_scr.body.main_color = LV_COLOR_BACKGROUND; @@ -399,6 +403,25 @@ void tft_style_init() { style_para_back.text.color = LV_COLOR_WHITE; style_para_back.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); + lv_style_copy(&style_btn_rel, &lv_style_plain); + style_btn_rel.body.border.color = lv_color_hex3(0x269); + style_btn_rel.body.border.width = 1; + style_btn_rel.body.main_color = lv_color_hex3(0xADF); + style_btn_rel.body.grad_color = lv_color_hex3(0x46B); + style_btn_rel.body.shadow.width = 4; + style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM; + style_btn_rel.body.radius = LV_RADIUS_CIRCLE; + style_btn_rel.text.color = lv_color_hex3(0xDEF); + style_btn_rel.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); + + lv_style_copy(&style_btn_pr, &style_btn_rel); + style_btn_pr.body.border.color = lv_color_hex3(0x46B); + style_btn_pr.body.main_color = lv_color_hex3(0x8BD); + style_btn_pr.body.grad_color = lv_color_hex3(0x24A); + style_btn_pr.body.shadow.width = 2; + style_btn_pr.text.color = lv_color_hex3(0xBCD); + style_btn_pr.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); + lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color); lv_bar_style_indic.text.color = lv_color_hex3(0xADF); lv_bar_style_indic.image.color = lv_color_hex3(0xADF); @@ -421,7 +444,6 @@ void titleText_cat(char *str, int strSize, char *addPart) { char *getDispText(int index) { - ZERO(public_buf_l); switch (disp_state_stack._disp_state[index]) { case PRINT_READY_UI: @@ -926,30 +948,30 @@ void print_time_run() { } void GUI_RefreshPage() { - if ((systick_uptime_millis % 1000) == 0) temperature_change_frequency = 1; - if ((systick_uptime_millis % 3000) == 0) printing_rate_update_flag = 1; + if ((systick_uptime_millis % 1000) == 0) temps_update_flag = true; + if ((systick_uptime_millis % 3000) == 0) printing_rate_update_flag = true; switch (disp_state) { case MAIN_UI: //lv_draw_ready_print(); break; case EXTRUSION_UI: - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_hotend_temp(); } break; case PRE_HEAT_UI: - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_desire_temp(); } break; case PRINT_READY_UI: /* if (gCfgItems.display_style == 2) { - if (temperature_change_frequency) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_restro_state(); } } @@ -959,8 +981,8 @@ void GUI_RefreshPage() { case PRINT_FILE_UI: break; case PRINTING_UI: - if (temperature_change_frequency) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_ext_temp(); disp_bed_temp(); disp_fan_speed(); @@ -968,15 +990,15 @@ void GUI_RefreshPage() { disp_fan_Zpos(); } if (printing_rate_update_flag || marlin_state == MF_SD_COMPLETE) { - printing_rate_update_flag = 0; + printing_rate_update_flag = false; if (!gcode_preview_over) setProBarRate(); } break; case OPERATE_UI: /* - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_temp_operate(); } @@ -986,16 +1008,16 @@ void GUI_RefreshPage() { case PAUSE_UI: /* - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_temp_pause(); } */ break; case FAN_UI: - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_fan_value(); } break; @@ -1003,14 +1025,12 @@ void GUI_RefreshPage() { case MOVE_MOTOR_UI: /* if (mksReprint.mks_printer_state == MKS_IDLE) { - if ((z_high_count==1)&&(temper_error_flg != 1)) { + if (z_high_count == 1 && temper_error_flg != 1) { z_high_count = 0; - { - memset((char *)gCfgItems.move_z_coordinate, ' ', sizeof(gCfgItems.move_z_coordinate)); - GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); - sprintf_P((char *)gCfgItems.move_z_coordinate, PSTR("Z: %.3f"), current_position[Z_AXIS]); - GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); - } + memset((char *)gCfgItems.move_z_coordinate, ' ', sizeof(gCfgItems.move_z_coordinate)); + GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); + sprintf_P((char *)gCfgItems.move_z_coordinate, PSTR("Z: %.3f"), current_position[Z_AXIS]); + GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); } } */ @@ -1018,9 +1038,9 @@ void GUI_RefreshPage() { #if ENABLED(USE_WIFI_FUNCTION) case WIFI_UI: - if (temperature_change_frequency == 1) { + if (temps_update_flag) { disp_wifi_state(); - temperature_change_frequency = 0; + temps_update_flag = false; } break; #endif @@ -1030,8 +1050,8 @@ void GUI_RefreshPage() { break; case FILAMENTCHANGE_UI: - if (temperature_change_frequency) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_filament_temp(); } break; @@ -1046,9 +1066,9 @@ void GUI_RefreshPage() { break; case WIFI_LIST_UI: #if ENABLED(USE_WIFI_FUNCTION) - if (printing_rate_update_flag == 1) { + if (printing_rate_update_flag) { disp_wifi_list(); - printing_rate_update_flag = 0; + printing_rate_update_flag = false; } #endif break; @@ -1103,8 +1123,8 @@ void GUI_RefreshPage() { #endif case BABY_STEP_UI: - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; + if (temps_update_flag) { + temps_update_flag = false; disp_z_offset_value(); } break; @@ -1589,21 +1609,36 @@ void lv_imgbtn_use_label_style(lv_obj_t *imgbtn) { lv_imgbtn_set_style(imgbtn, LV_BTN_STATE_PR, &tft_style_label_pre); } -// Use label style for the image button +// Use label style for the button void lv_btn_use_label_style(lv_obj_t *btn) { lv_btn_set_style(btn, LV_BTN_STYLE_REL, &tft_style_label_rel); lv_btn_set_style(btn, LV_BTN_STYLE_PR, &tft_style_label_pre); } +// Use button style for the button +void lv_btn_use_button_style(lv_obj_t *btn) { + lv_btn_set_style(btn, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btn, LV_BTN_STYLE_PR, &style_btn_pr); +} + // Use a single style for both Released and Pressed void lv_btn_set_style_both(lv_obj_t *btn, lv_style_t *style) { lv_btn_set_style(btn, LV_BTN_STYLE_REL, style); lv_btn_set_style(btn, LV_BTN_STYLE_PR, style); } +// Create a screen +lv_obj_t* lv_screen_create() { + lv_obj_t *scr = lv_obj_create(nullptr, nullptr); + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + return scr; +} + // Create an empty label lv_obj_t* lv_label_create_empty(lv_obj_t *par) { - return lv_label_create(par, (lv_obj_t*)NULL); + return lv_label_create(par, (lv_obj_t*)nullptr); } // Create a label with style and text @@ -1621,35 +1656,66 @@ lv_obj_t* lv_label_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, const char } // Create a button with callback, ID, and Style. -lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id, lv_style_t *style) { - lv_obj_t *btn = lv_btn_create(par, NULL); +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/, lv_style_t *style/*=&style_para_value*/) { + lv_obj_t *btn = lv_btn_create(par, nullptr); if (id) - lv_obj_set_event_cb_mks(btn, cb, id, NULL, 0); + lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0); else lv_obj_set_event_cb(btn, cb); lv_btn_set_style_both(btn, style); return btn; } -// Create a button with callback and ID. Style set to style_para_value. -lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id) { - return lv_btn_create(par, cb, id, &style_para_value); +// Create a button with callback and ID, with label style. +lv_obj_t* lv_label_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/) { + lv_obj_t *btn = lv_btn_create(par, cb, id, nullptr); + lv_btn_use_label_style(btn); + return btn; +} + +// Create a button with callback and ID, with button style. +lv_obj_t* lv_button_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/) { + lv_obj_t *btn = lv_btn_create(par, cb, id, nullptr); + lv_btn_use_button_style(btn); + return btn; +} + +// Create a button with position, size, callback, ID, and style. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id, lv_style_t *style) { + lv_obj_t *btn = lv_btn_create(par, cb, id, style); + lv_obj_set_pos(btn, x, y); + lv_obj_set_size(btn, w, h); + return btn; } // Create a button with position, size, callback, and ID. Style set to style_para_value. -lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id) { - lv_obj_t *btn = lv_btn_create(par, cb, id); +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id/*=0*/) { + lv_obj_t *btn = lv_btn_create(par, x, y, w, h, cb, id, &style_para_value); + return btn; +} + +// Create a button with position, size, callback, and ID, with label style. +lv_obj_t* lv_label_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id/*=0*/) { + lv_obj_t *btn = lv_label_btn_create(par, cb, id); + lv_obj_set_pos(btn, x, y); + lv_obj_set_size(btn, w, h); + return btn; +} + +// Create a button with position, size, callback, and ID, with label style. +lv_obj_t* lv_button_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id/*=0*/) { + lv_obj_t *btn = lv_button_btn_create(par, cb, id); lv_obj_set_pos(btn, x, y); lv_obj_set_size(btn, w, h); return btn; } // Create a button with callback and ID. Style set to style_para_back. -lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_event_cb_t cb, const int id) { +lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/) { return lv_btn_create(par, cb, id, &style_para_back); } // Create a button with position, size, callback, and ID. Style set to style_para_back. -lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id) { +lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id/*=0*/) { lv_obj_t *btn = lv_btn_create_back(par, cb, id); lv_obj_set_pos(btn, x, y); lv_obj_set_size(btn, w, h); @@ -1657,11 +1723,11 @@ lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord } // Create an image button with image, callback, and ID. Use label style. -lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, const int id) { - lv_obj_t *btn = lv_imgbtn_create(par, NULL); +lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, const int id/*=0*/) { + lv_obj_t *btn = lv_imgbtn_create(par, nullptr); if (img) lv_imgbtn_set_src_both(btn, img); if (id) - lv_obj_set_event_cb_mks(btn, cb, id, NULL, 0); + lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0); else lv_obj_set_event_cb(btn, cb); lv_imgbtn_use_label_style(btn); @@ -1670,12 +1736,96 @@ lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, con } // Create an image button with image, position, callback, and ID. Use label style. -lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id) { +lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id/*=0*/) { lv_obj_t *btn = lv_imgbtn_create(par, img, cb, id); lv_obj_set_pos(btn, x, y); return btn; } +lv_obj_t* lv_big_button_create(lv_obj_t *par, const char *img, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, bool centerLabel) { + lv_obj_t *btn = lv_imgbtn_create(par, img, cb, id); + lv_obj_set_pos(btn, x, y); + lv_obj_t *label = lv_label_create_empty(btn); + if (gCfgItems.multiple_language) { + lv_label_set_text(label, text); + if (centerLabel) + lv_obj_align(label, btn, LV_ALIGN_CENTER, 0, 0); + else + lv_obj_align(label, btn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) + lv_group_add_obj(g, btn); + #endif + return btn; +} + +lv_obj_t* lv_screen_menu_item(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, bool drawArrow) { + lv_obj_t *btn = lv_btn_create(par, nullptr); /*Add a button the current screen*/ + lv_obj_set_pos(btn, x, y); /*Set its position*/ + lv_obj_set_size(btn, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + if (id > -1) lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0); + lv_btn_use_label_style(btn); + lv_btn_set_layout(btn, LV_LAYOUT_OFF); + lv_obj_t *label = lv_label_create_empty(btn); /*Add a label to the button*/ + if (gCfgItems.multiple_language) { + lv_label_set_text(label, text); + lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) { + lv_group_add_obj(g, btn); + } + #endif + + if (drawArrow) (void)lv_imgbtn_create(par, "F:/bmp_arrow.bin", x + PARA_UI_SIZE_X, y + PARA_UI_ARROW_V, cb, id); + + lv_obj_t *line1 = lv_line_create(par, nullptr); + lv_ex_line(line1, line_points[index]); + + return btn; +} + +lv_obj_t* lv_screen_menu_item_1_edit(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const char *editValue) { + lv_obj_t* btn = lv_screen_menu_item(par, text, x, y, cb, -1, index, false); + lv_obj_t* btnValue = lv_btn_create(par, PARA_UI_VALUE_POS_X, y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, cb, id); + lv_obj_t* labelValue = lv_label_create_empty(btnValue); + lv_label_set_text(labelValue, editValue); + lv_obj_align(labelValue, btnValue, LV_ALIGN_CENTER, 0, 0); + return btn; +} + +lv_obj_t* lv_screen_menu_item_2_edit(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const char *editValue, const int idEdit2, const char *editValue2) { + lv_obj_t* btn = lv_screen_menu_item(par, text, x, y, cb, -1, index, false); + + lv_obj_t* btnValue = lv_btn_create(par, PARA_UI_VALUE_POS_X_2, y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, cb, idEdit2); + lv_obj_t* labelValue = lv_label_create_empty(btnValue); + lv_label_set_text(labelValue, editValue2); + lv_obj_align(labelValue, btnValue, LV_ALIGN_CENTER, 0, 0); + + btnValue = lv_btn_create(par, PARA_UI_VALUE_POS_X, y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, cb, id); + labelValue = lv_label_create_empty(btnValue); + lv_label_set_text(labelValue, editValue); + lv_obj_align(labelValue, btnValue, LV_ALIGN_CENTER, 0, 0); + + return btn; +} + +lv_obj_t* lv_screen_menu_item_onoff(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const bool curValue) { + lv_screen_menu_item(par, text, x, y, cb, -1, index, false); + lv_obj_t* btnValue = lv_imgbtn_create(par, curValue ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, y + PARA_UI_STATE_V, cb, id); + lv_obj_t* labelValue = lv_label_create_empty(btnValue); + lv_label_set_text(labelValue, curValue ? machine_menu.enable : machine_menu.disable); + lv_obj_align(labelValue, btnValue, LV_ALIGN_CENTER, 0, 0); + return btnValue; +} + +void lv_screen_menu_item_onoff_update(lv_obj_t *btn, const bool curValue) { + lv_imgbtn_set_src_both(btn, curValue ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin"); + lv_label_set_text((lv_obj_t*)btn->child_ll.head, curValue ? machine_menu.enable : machine_menu.disable); +} + + #if ENABLED(SDSUPPORT) void sd_detection() { @@ -1689,11 +1839,11 @@ lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_coord_t x, lv_coor #endif -void lv_ex_line(lv_obj_t * line, lv_point_t *points) { +void lv_ex_line(lv_obj_t *line, lv_point_t *points) { // Copy the previous line and apply the new style lv_line_set_points(line, points, 2); // Set the points lv_line_set_style(line, LV_LINE_STYLE_MAIN, &style_line); - lv_obj_align(line, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); + lv_obj_align(line, nullptr, LV_ALIGN_IN_TOP_MID, 0, 0); } extern volatile uint32_t systick_uptime_millis; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 5ad0bd87b5..479166cd8f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -164,48 +164,6 @@ #endif // ifdef TFT35 -// Set the same image for both Released and Pressed -void lv_imgbtn_set_src_both(lv_obj_t *imgbtn, const void *src); - -// Set label styles for Released and Pressed -void lv_imgbtn_use_label_style(lv_obj_t *imgbtn); - -// Set label styles for Released and Pressed -void lv_btn_use_label_style(lv_obj_t *btn); - -// Set the same style for both Released and Pressed -void lv_btn_set_style_both(lv_obj_t *btn, lv_style_t *style); - -// Create an empty label -lv_obj_t* lv_label_create_empty(lv_obj_t *par); - -// Create a label with style and text -lv_obj_t* lv_label_create(lv_obj_t *par, const char *text); - -// Create a label with style, position, and text -lv_obj_t* lv_label_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, const char *text); - -// Create a button with callback, ID, and Style. -lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id, lv_style_t *style); - -// Create a button with callback and ID. Style set to style_para_value. -lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id); - -// Create a button with position, size, callback, and ID. Style set to style_para_value. -lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id); - -// Create a button with callback and ID. Style set to style_para_back. -lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_event_cb_t cb, const int id); - -// Create a button with position, size, callback, and ID. Style set to style_para_back. -lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id); - -// Create an image button with image, callback, and ID. Use label style. -lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, const int id); - -// Create an image button with image, position, callback, and ID. Use label style. -lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id); - #ifdef __cplusplus extern "C" { /* C-declarations for C++ */ #endif @@ -240,10 +198,10 @@ typedef struct { } CFG_ITMES; typedef struct { - uint8_t curTempType : 1, - curSprayerChoose : 3, - stepHeat : 4; - uint8_t leveling_first_time : 1, + uint8_t curTempType:1, + curSprayerChoose:3, + stepHeat:4; + uint8_t leveling_first_time:1, para_ui_page:1, configWifi:1, command_send:1, @@ -467,6 +425,8 @@ extern lv_style_t style_sel_text; extern lv_style_t style_para_value; extern lv_style_t style_para_back; extern lv_style_t lv_bar_style_indic; +extern lv_style_t style_btn_pr; +extern lv_style_t style_btn_rel; extern lv_point_t line_points[4][2]; @@ -489,8 +449,78 @@ extern void gCfg_to_spiFlah(); extern void print_time_count(); extern void LV_TASK_HANDLER(); -extern void lv_ex_line(lv_obj_t * line, lv_point_t *points); +extern void lv_ex_line(lv_obj_t *line, lv_point_t *points); #ifdef __cplusplus } /* C-declarations for C++ */ #endif + +// Set the same image for both Released and Pressed +void lv_imgbtn_set_src_both(lv_obj_t *imgbtn, const void *src); + +// Set label styles for Released and Pressed +void lv_imgbtn_use_label_style(lv_obj_t *imgbtn); + +// Set label styles for Released and Pressed +void lv_btn_use_label_style(lv_obj_t *btn); + +// Set the same style for both Released and Pressed +void lv_btn_set_style_both(lv_obj_t *btn, lv_style_t *style); + +// Create a screen +lv_obj_t* lv_screen_create(); + +// Create an empty label +lv_obj_t* lv_label_create_empty(lv_obj_t *par); + +// Create a label with style and text +lv_obj_t* lv_label_create(lv_obj_t *par, const char *text); + +// Create a label with style, position, and text +lv_obj_t* lv_label_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, const char *text); + +// Create a button with callback, ID, and Style. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id, lv_style_t *style=&style_para_value); + +// Create a button with callback and ID, with label style. +lv_obj_t* lv_label_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id=0); + +// Create a button with callback and ID, with button style. +lv_obj_t* lv_button_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id=0); + +// Create a button with position, size, callback, ID, and style. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id, lv_style_t *style); + +// Create a button with position, size, callback, and ID. Style set to style_para_value. +lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id=0); + +// Create a button with position, size, callback, and ID, with label style. +lv_obj_t* lv_label_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id=0); + +// Create a button with position, size, callback, and ID, with button style. +lv_obj_t* lv_button_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id=0); + +// Create a button with callback and ID. Style set to style_para_back. +lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_event_cb_t cb, const int id=0); + +// Create a button with position, size, callback, and ID. Style set to style_para_back. +lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id=0); + +// Create an image button with image, callback, and ID. Use label style. +lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, const int id=0); + +// Create an image button with image, position, callback, and ID. Use label style. +lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id=0); + +// Create a big image button with a label, follow the LVGL UI standard. +lv_obj_t* lv_big_button_create(lv_obj_t *par, const char *img, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, bool centerLabel = false); + +// Create a menu item, follow the LVGL UI standard. +lv_obj_t* lv_screen_menu_item(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, bool drawArrow = true); +lv_obj_t* lv_screen_menu_item_1_edit(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const char *editValue); +lv_obj_t* lv_screen_menu_item_2_edit(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const char *editValue, const int idEdit2, const char *editValue2); +lv_obj_t* lv_screen_menu_item_onoff(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const bool curValue); +void lv_screen_menu_item_onoff_update(lv_obj_t *btn, const bool curValue); + +#define _DIA_1(T) (uiCfg.dialogType == DIALOG_##T) +#define DIALOG_IS(V...) DO(DIA,||,V) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index 78cf35fd07..e8214cad3a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -30,80 +30,60 @@ #include "draw_ui.h" -extern lv_group_t * g; +extern lv_group_t *g; static lv_obj_t *scr, *wifi_name_text, *wifi_key_text, *wifi_state_text, *wifi_ip_text; -#define ID_W_RETURN 1 -#define ID_W_CLOUD 2 -#define ID_W_RECONNECT 3 +enum { + ID_W_RETURN = 1, + ID_W_CLOUD, + ID_W_RECONNECT +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_W_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - lv_draw_set(); - } - break; + clear_cur_ui(); + lv_draw_set(); + break; case ID_W_CLOUD: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - //clear_cur_ui(); - //draw_return_ui(); - } - break; + //clear_cur_ui(); + //draw_return_ui(); + break; case ID_W_RECONNECT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - lv_draw_wifi_list(); - } - break; + clear_cur_ui(); + lv_draw_wifi_list(); + break; } } void lv_draw_wifi(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonCloud = NULL, *label_Cloud = NULL; - lv_obj_t *buttonReconnect = NULL, *label_Reconnect=NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_UI; } disp_state = WIFI_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); // Create an Image button - buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN); - + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); #endif + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - if (gCfgItems.wifi_mode_sel == STA_MODEL) { - //buttonCloud = lv_imgbtn_create(scr, NULL); - buttonReconnect = lv_imgbtn_create(scr, NULL); - } + lv_obj_t *buttonReconnect = nullptr, *label_Reconnect = nullptr; if (gCfgItems.wifi_mode_sel == STA_MODEL) { - lv_obj_set_event_cb_mks(buttonReconnect, event_handler,ID_W_RECONNECT, NULL, 0); + buttonReconnect = lv_imgbtn_create(scr, nullptr); + + lv_obj_set_event_cb_mks(buttonReconnect, event_handler, ID_W_RECONNECT, nullptr, 0); lv_imgbtn_set_src_both(buttonReconnect, "F:/bmp_wifi.bin"); lv_imgbtn_use_label_style(buttonReconnect); @@ -113,12 +93,7 @@ void lv_draw_wifi(void) { lv_obj_set_pos(buttonReconnect, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_btn_set_layout(buttonReconnect, LV_LAYOUT_OFF); - } - label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.wifi_mode_sel == STA_MODEL) { - //label_Cloud = lv_label_create_empty(buttonCloud); label_Reconnect = lv_label_create_empty(buttonReconnect); } @@ -127,9 +102,6 @@ void lv_draw_wifi(void) { lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); if (gCfgItems.wifi_mode_sel == STA_MODEL) { - //lv_label_set_text(label_Cloud, common_menu.text_back); - //lv_obj_align(label_Cloud, buttonCloud, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(label_Reconnect, wifi_menu.reconnect); lv_obj_align(label_Reconnect, buttonReconnect, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -148,38 +120,33 @@ void lv_draw_wifi(void) { } void disp_wifi_state() { - memset(public_buf_m, 0, sizeof(public_buf_m)); - strcpy(public_buf_m,wifi_menu.ip); - strcat(public_buf_m,ipPara.ip_addr); + strcpy(public_buf_m, wifi_menu.ip); + strcat(public_buf_m, ipPara.ip_addr); lv_label_set_text(wifi_ip_text, public_buf_m); - lv_obj_align(wifi_ip_text, NULL, LV_ALIGN_CENTER, 0, -100); + lv_obj_align(wifi_ip_text, nullptr, LV_ALIGN_CENTER, 0, -100); - memset(public_buf_m, 0, sizeof(public_buf_m)); - strcpy(public_buf_m,wifi_menu.wifi); - strcat(public_buf_m,wifiPara.ap_name); + strcpy(public_buf_m, wifi_menu.wifi); + strcat(public_buf_m, wifiPara.ap_name); lv_label_set_text(wifi_name_text, public_buf_m); - lv_obj_align(wifi_name_text, NULL, LV_ALIGN_CENTER, 0, -70); + lv_obj_align(wifi_name_text, nullptr, LV_ALIGN_CENTER, 0, -70); if (wifiPara.mode == AP_MODEL) { - memset(public_buf_m, 0, sizeof(public_buf_m)); - strcpy(public_buf_m,wifi_menu.key); - strcat(public_buf_m,wifiPara.keyCode); + strcpy(public_buf_m, wifi_menu.key); + strcat(public_buf_m, wifiPara.keyCode); lv_label_set_text(wifi_key_text, public_buf_m); - lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER, 0, -40); + lv_obj_align(wifi_key_text, nullptr, LV_ALIGN_CENTER, 0, -40); - memset(public_buf_m, 0, sizeof(public_buf_m)); - strcpy(public_buf_m,wifi_menu.state_ap); + strcpy(public_buf_m, wifi_menu.state_ap); if (wifi_link_state == WIFI_CONNECTED) - strcat(public_buf_m,wifi_menu.connected); + strcat(public_buf_m, wifi_menu.connected); else if (wifi_link_state == WIFI_NOT_CONFIG) - strcat(public_buf_m,wifi_menu.disconnected); + strcat(public_buf_m, wifi_menu.disconnected); else - strcat(public_buf_m,wifi_menu.exception); + strcat(public_buf_m, wifi_menu.exception); lv_label_set_text(wifi_state_text, public_buf_m); - lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER, 0, -10); + lv_obj_align(wifi_state_text, nullptr, LV_ALIGN_CENTER, 0, -10); } else { - ZERO(public_buf_m); strcpy(public_buf_m, wifi_menu.state_sta); if (wifi_link_state == WIFI_CONNECTED) strcat(public_buf_m, wifi_menu.connected); @@ -188,10 +155,10 @@ void disp_wifi_state() { else strcat(public_buf_m, wifi_menu.exception); lv_label_set_text(wifi_state_text, public_buf_m); - lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER, 0, -40); + lv_obj_align(wifi_state_text, nullptr, LV_ALIGN_CENTER, 0, -40); lv_label_set_text(wifi_key_text, ""); - lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER, 0, -10); + lv_obj_align(wifi_key_text, nullptr, LV_ALIGN_CENTER, 0, -10); } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp index b52dbc5e59..cb72469bd4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -39,61 +39,48 @@ WIFI_LIST wifi_list; list_menu_def list_menu; -extern lv_group_t * g; -static lv_obj_t * scr; +extern lv_group_t *g; +static lv_obj_t *scr; static lv_obj_t *buttonWifiN[NUMBER_OF_PAGE]; static lv_obj_t *labelWifiText[NUMBER_OF_PAGE]; static lv_obj_t *labelPageText; -#define ID_WL_RETURN 11 -#define ID_WL_DOWN 12 +#define ID_WL_RETURN 11 +#define ID_WL_DOWN 12 + +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; -static void event_handler(lv_obj_t * obj, lv_event_t event) { if (obj->mks_obj_id == ID_WL_RETURN) { - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - lv_draw_set(); - } + clear_cur_ui(); + lv_draw_set(); } else if (obj->mks_obj_id == ID_WL_DOWN) { - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (wifi_list.getNameNum > 0) { - if ((wifi_list.nameIndex + NUMBER_OF_PAGE) >= wifi_list.getNameNum) { - wifi_list.nameIndex = 0; - wifi_list.currentWifipage = 1; - } - else { - wifi_list.nameIndex += NUMBER_OF_PAGE; - wifi_list.currentWifipage++; - } - disp_wifi_list(); + if (wifi_list.getNameNum > 0) { + if ((wifi_list.nameIndex + NUMBER_OF_PAGE) >= wifi_list.getNameNum) { + wifi_list.nameIndex = 0; + wifi_list.currentWifipage = 1; } + else { + wifi_list.nameIndex += NUMBER_OF_PAGE; + wifi_list.currentWifipage++; + } + disp_wifi_list(); } } else { for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { if (obj->mks_obj_id == i + 1) { - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (wifi_list.getNameNum != 0) { - const bool do_wifi = wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[wifi_list.nameIndex + i]) == 0; - wifi_list.nameIndex += i; - last_disp_state = WIFI_LIST_UI; - lv_clear_wifi_list(); - if (do_wifi) - lv_draw_wifi(); - else { - keyboard_value = wifiConfig; - lv_draw_keyboard(); - } + if (wifi_list.getNameNum != 0) { + const bool do_wifi = wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[wifi_list.nameIndex + i]) == 0; + wifi_list.nameIndex += i; + last_disp_state = WIFI_LIST_UI; + lv_clear_wifi_list(); + if (do_wifi) + lv_draw_wifi(); + else { + keyboard_value = wifiConfig; + lv_draw_keyboard(); } } } @@ -102,34 +89,23 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } void lv_draw_wifi_list(void) { - lv_obj_t *buttonBack = NULL, *buttonDown = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_LIST_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_LIST_UI; } disp_state = WIFI_LIST_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - buttonDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H, event_handler, ID_WL_DOWN); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + (OTHER_BTN_YPIEL + INTERVAL_H) * 2, event_handler, ID_WL_RETURN); + lv_obj_t *buttonDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H, event_handler, ID_WL_DOWN); + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + (OTHER_BTN_YPIEL + INTERVAL_H) * 2, event_handler, ID_WL_RETURN); for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { - buttonWifiN[i] = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonWifiN[i], 0, NAME_BTN_Y*i+10+titleHeight); /*Set its position*/ - lv_obj_set_size(buttonWifiN[i], NAME_BTN_X, NAME_BTN_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonWifiN[i], event_handler, (i+1), NULL, 0); - lv_btn_use_label_style(buttonWifiN[i]); - lv_btn_set_layout(buttonWifiN[i], LV_LAYOUT_OFF); + buttonWifiN[i] = lv_label_btn_create(scr, 0, NAME_BTN_Y * i + 10 + titleHeight, NAME_BTN_X, NAME_BTN_Y, event_handler, i + 1); labelWifiText[i] = lv_label_create_empty(buttonWifiN[i]); #if HAS_ROTARY_ENCODER uint8_t j = 0; @@ -147,9 +123,10 @@ void lv_draw_wifi_list(void) { wifi_list.currentWifipage = 1; if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode == STA_MODEL) { - memset(wifi_list.wifiConnectedName, 0, sizeof(&wifi_list.wifiConnectedName)); + ZERO(wifi_list.wifiConnectedName); memcpy(wifi_list.wifiConnectedName, wifiPara.ap_name, sizeof(wifi_list.wifiConnectedName)); } + #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { lv_group_add_obj(g, buttonDown); @@ -166,10 +143,10 @@ void disp_wifi_list(void) { sprintf((char *)tmpStr, list_menu.file_pages, wifi_list.currentWifipage, wifi_list.getPage); lv_label_set_text(labelPageText, (const char *)tmpStr); - lv_obj_align(labelPageText, NULL, LV_ALIGN_CENTER, 50, -100); + lv_obj_align(labelPageText, nullptr, LV_ALIGN_CENTER, 50, -100); for (i = 0; i < NUMBER_OF_PAGE; i++) { - memset(tmpStr, 0, sizeof(tmpStr)); + ZERO(tmpStr); j = wifi_list.nameIndex + i; if (j >= wifi_list.getNameNum) { @@ -187,7 +164,7 @@ void disp_wifi_list(void) { } void wifi_scan_handle() { - if (uiCfg.dialogType != WIFI_ENABLE_TIPS || uiCfg.command_send != 1) return; + if (!DIALOG_IS(WIFI_ENABLE_TIPS) || uiCfg.command_send != 1) return; last_disp_state = DIALOG_UI; lv_clear_dialog(); if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode != AP_MODEL) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp index 0902135835..0c4fe61132 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp @@ -30,161 +30,117 @@ #include "draw_ui.h" -extern lv_group_t * g; -static lv_obj_t *scr, *labelModelValue = NULL, *buttonModelValue = NULL, *labelCloudValue = NULL; +extern lv_group_t *g; +static lv_obj_t *scr, *labelModelValue = nullptr, *buttonModelValue = nullptr, *labelCloudValue = nullptr; -#define ID_WIFI_RETURN 1 -#define ID_WIFI_MODEL 2 -#define ID_WIFI_NAME 3 -#define ID_WIFI_PASSWORD 4 -#define ID_WIFI_CLOUD 5 -#define ID_WIFI_CONFIG 6 +enum { + ID_WIFI_RETURN = 1, + ID_WIFI_MODEL, + ID_WIFI_NAME, + ID_WIFI_PASSWORD, + ID_WIFI_CLOUD, + ID_WIFI_CONFIG +}; -static void event_handler(lv_obj_t * obj, lv_event_t event) { +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_WIFI_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_wifi_settings(); - draw_return_ui(); - } - break; + lv_clear_wifi_settings(); + draw_return_ui(); + break; case ID_WIFI_MODEL: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.wifi_mode_sel == AP_MODEL) { - gCfgItems.wifi_mode_sel = STA_MODEL; - lv_label_set_text(labelModelValue, WIFI_STA_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); - update_spi_flash(); - } - else { - gCfgItems.wifi_mode_sel = AP_MODEL; - lv_label_set_text(labelModelValue, WIFI_AP_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); - update_spi_flash(); - } - } - break; - case ID_WIFI_NAME: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - keyboard_value = wifiName; - lv_clear_wifi_settings(); - lv_draw_keyboard(); - } - break; - case ID_WIFI_PASSWORD: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - keyboard_value = wifiPassWord; - lv_clear_wifi_settings(); - lv_draw_keyboard(); - } - break; - case ID_WIFI_CLOUD: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.cloud_enable) { - gCfgItems.cloud_enable = false; - lv_obj_set_event_cb_mks(obj, event_handler, ID_WIFI_CLOUD, "bmp_disable.bin", 0); - lv_label_set_text(labelCloudValue, machine_menu.disable); - } - else { - gCfgItems.cloud_enable = true; - lv_obj_set_event_cb_mks(obj, event_handler, ID_WIFI_CLOUD, "bmp_enable.bin", 0); - lv_label_set_text(labelCloudValue, machine_menu.enable); - } + if (gCfgItems.wifi_mode_sel == AP_MODEL) { + gCfgItems.wifi_mode_sel = STA_MODEL; + lv_label_set_text(labelModelValue, WIFI_STA_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); update_spi_flash(); } - break; + else { + gCfgItems.wifi_mode_sel = AP_MODEL; + lv_label_set_text(labelModelValue, WIFI_AP_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); + update_spi_flash(); + } + break; + case ID_WIFI_NAME: + keyboard_value = wifiName; + lv_clear_wifi_settings(); + lv_draw_keyboard(); + break; + case ID_WIFI_PASSWORD: + keyboard_value = wifiPassWord; + lv_clear_wifi_settings(); + lv_draw_keyboard(); + break; + case ID_WIFI_CLOUD: + if (gCfgItems.cloud_enable) { + gCfgItems.cloud_enable = false; + lv_obj_set_event_cb_mks(obj, event_handler, ID_WIFI_CLOUD, "bmp_disable.bin", 0); + lv_label_set_text(labelCloudValue, machine_menu.disable); + } + else { + gCfgItems.cloud_enable = true; + lv_obj_set_event_cb_mks(obj, event_handler, ID_WIFI_CLOUD, "bmp_enable.bin", 0); + lv_label_set_text(labelCloudValue, machine_menu.enable); + } + update_spi_flash(); + break; case ID_WIFI_CONFIG: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_wifi_settings(); - lv_draw_dialog(DIALOG_WIFI_CONFIG_TIPS); - } - break; + lv_clear_wifi_settings(); + lv_draw_dialog(DIALOG_WIFI_CONFIG_TIPS); + break; } } void lv_draw_wifi_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonConfig = NULL, *labelConfig = NULL; - lv_obj_t *labelModelText = NULL; - lv_obj_t *labelNameText = NULL, *buttonNameValue = NULL, *labelNameValue = NULL; - lv_obj_t *labelPassWordText = NULL, *buttonPassWordValue = NULL, *labelPassWordValue = NULL; - lv_obj_t *labelCloudText = NULL, *buttonCloudValue = NULL; - lv_obj_t * line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_SETTINGS_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_SETTINGS_UI; } disp_state = WIFI_SETTINGS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.WifiConfTitle); lv_refr_now(lv_refr_get_disp_refreshing()); - labelModelText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.wifiMode); + lv_obj_t *labelModelText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.wifiMode); - buttonModelValue = lv_imgbtn_create(scr, NULL); - lv_imgbtn_set_src_both(buttonModelValue, "F:/bmp_blank_sel.bin"); - lv_obj_set_pos(buttonModelValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonModelValue, event_handler, ID_WIFI_MODEL, NULL, 0); + lv_obj_t *buttonModelValue = lv_imgbtn_create(scr, "F:/bmp_blank_sel.bin", PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, event_handler, ID_WIFI_MODEL); lv_btn_set_style_both(buttonModelValue, &style_para_value_pre); - lv_btn_set_layout(buttonModelValue, LV_LAYOUT_OFF); labelModelValue = lv_label_create_empty(buttonModelValue); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1,line_points[0]); + lv_obj_t *line1 = lv_line_create(scr, nullptr); + lv_ex_line(line1, line_points[0]); - labelNameText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, NULL); + lv_obj_t *labelNameText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10, nullptr); + lv_obj_t *buttonNameValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_WIFI_NAME); + lv_obj_t *labelNameValue = lv_label_create_empty(buttonNameValue); - buttonNameValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_WIFI_NAME); - labelNameValue = lv_label_create_empty(buttonNameValue); + lv_obj_t *line2 = lv_line_create(scr, nullptr); + lv_ex_line(line2, line_points[1]); - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2,line_points[1]); + lv_obj_t *labelPassWordText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, nullptr); + lv_obj_t *buttonPassWordValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_WIFI_PASSWORD); + lv_obj_t *labelPassWordValue = lv_label_create_empty(buttonPassWordValue); - labelPassWordText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10, NULL); + lv_obj_t *line3 = lv_line_create(scr, nullptr); + lv_ex_line(line3, line_points[2]); - buttonPassWordValue = lv_btn_create(scr, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, event_handler, ID_WIFI_PASSWORD); - labelPassWordValue = lv_label_create_empty(buttonPassWordValue); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3,line_points[2]); - - labelCloudText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.wifiCloud); - - buttonCloudValue = lv_imgbtn_create(scr, gCfgItems.cloud_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V, event_handler, ID_WIFI_CLOUD); + lv_obj_t *labelCloudText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.wifiCloud); + lv_obj_t *buttonCloudValue = lv_imgbtn_create(scr, gCfgItems.cloud_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V, event_handler, ID_WIFI_CLOUD); labelCloudValue = lv_label_create_empty(buttonCloudValue); - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4,line_points[3]); + lv_obj_t *line4 = lv_line_create(scr, nullptr); + lv_ex_line(line4, line_points[3]); - buttonConfig = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_WIFI_CONFIG); - labelConfig = lv_label_create_empty(buttonConfig); + lv_obj_t *buttonConfig = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_WIFI_CONFIG); + lv_obj_t *labelConfig = lv_label_create_empty(buttonConfig); - buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_WIFI_RETURN); - label_Back = lv_label_create_empty(buttonBack); + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_back70x40.bin", PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_WIFI_RETURN); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language) { if (gCfgItems.wifi_mode_sel == AP_MODEL) { @@ -195,26 +151,24 @@ void lv_draw_wifi_settings(void) { lv_label_set_text(labelModelValue, WIFI_STA_TEXT); lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); } - memset(public_buf_m,0,sizeof(public_buf_m)); - strcat(public_buf_m,machine_menu.wifiName); - strcat(public_buf_m,(const char *)uiCfg.wifi_name); - lv_label_set_text(labelNameText,public_buf_m); + strcat(public_buf_m, machine_menu.wifiName); + strcat(public_buf_m, (const char *)uiCfg.wifi_name); + lv_label_set_text(labelNameText, public_buf_m); - lv_label_set_text(labelNameValue,machine_menu.wifiEdit); + lv_label_set_text(labelNameValue, machine_menu.wifiEdit); lv_obj_align(labelNameValue, buttonNameValue, LV_ALIGN_CENTER, 0, 0); - memset(public_buf_m,0,sizeof(public_buf_m)); - strcat(public_buf_m,machine_menu.wifiPassWord); - strcat(public_buf_m,(const char *)uiCfg.wifi_key); - lv_label_set_text(labelPassWordText,public_buf_m); + strcat(public_buf_m, machine_menu.wifiPassWord); + strcat(public_buf_m, (const char *)uiCfg.wifi_key); + lv_label_set_text(labelPassWordText, public_buf_m); - lv_label_set_text(labelPassWordValue,machine_menu.wifiEdit); + lv_label_set_text(labelPassWordValue, machine_menu.wifiEdit); lv_obj_align(labelPassWordValue, buttonPassWordValue, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(labelCloudValue, gCfgItems.cloud_enable ? machine_menu.enable : machine_menu.disable); lv_obj_align(labelCloudValue, buttonCloudValue, LV_ALIGN_CENTER, 0, 0); - lv_label_set_text(labelConfig,machine_menu.wifiConfig); + lv_label_set_text(labelConfig, machine_menu.wifiConfig); lv_obj_align(labelConfig, buttonConfig, LV_ALIGN_CENTER, 0, 0); lv_label_set_text(label_Back, common_menu.text_back); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp index 86ac5dffac..57f2584fa3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp @@ -30,14 +30,14 @@ #include "draw_ui.h" -static lv_obj_t * scr; +static lv_obj_t *scr; TIPS_TYPE wifi_tips_type; TIPS_DISP tips_disp; tips_menu_def tips_menu; void lv_draw_wifi_tips(void) { - static lv_obj_t * text_tips,*wifi_name; + static lv_obj_t *text_tips,*wifi_name; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_TIPS_UI) { disp_state_stack._disp_index++; @@ -45,28 +45,24 @@ void lv_draw_wifi_tips(void) { } disp_state = WIFI_TIPS_UI; - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); + scr = lv_screen_create(); lv_refr_now(lv_refr_get_disp_refreshing()); wifi_name = lv_label_create(scr, (const char *)wifi_list.wifiName[wifi_list.nameIndex]); - lv_obj_align(wifi_name, NULL, LV_ALIGN_CENTER, 0, -20); + lv_obj_align(wifi_name, nullptr, LV_ALIGN_CENTER, 0, -20); text_tips = lv_label_create_empty(scr); if (wifi_tips_type == TIPS_TYPE_JOINING) { lv_label_set_text(text_tips, tips_menu.joining); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER, 0, -60); + lv_obj_align(text_tips, nullptr, LV_ALIGN_CENTER, 0, -60); } else if (wifi_tips_type == TIPS_TYPE_TAILED_JOIN) { lv_label_set_text(text_tips, tips_menu.failedJoin); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER, 0, -60); + lv_obj_align(text_tips, nullptr, LV_ALIGN_CENTER, 0, -60); } else if (wifi_tips_type == TIPS_TYPE_WIFI_CONECTED) { lv_label_set_text(text_tips, tips_menu.wifiConected); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER, 0, -60); + lv_obj_align(text_tips, nullptr, LV_ALIGN_CENTER, 0, -60); } tips_disp.timer = TIPS_TIMER_START; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp index 856d645e9e..fbc8192ffb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp @@ -62,7 +62,7 @@ static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t u memcpy(&__g_xbf_hd, p, sizeof(x_header_t)); } if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min) - return NULL; + return nullptr; uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4; uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); if (p_pos[0] != 0) { @@ -72,7 +72,7 @@ static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t u //return __user_font_getdata(pos+2, gdsc->box_w*__g_xbf_hd.bpp/8); return __user_font_getdata(pos + 2, sizeof(__g_font_buf)); } - return NULL; + return nullptr; } static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { @@ -81,7 +81,7 @@ static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_ memcpy(&__g_xbf_hd, p, sizeof(x_header_t)); } if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min) - return NULL; + return false; uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4; uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); if (p_pos[0] != 0) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index bc329aa82b..06d6ca6b72 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -637,7 +637,7 @@ void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor } } -//static lv_obj_t * scr_test; +//static lv_obj_t *scr_test; void disp_assets_update() { SPI_TFT.LCD_clear(0x0000); disp_string(100, 140, "Assets Updating...", 0xFFFF, 0x0000); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index e6c30b30f8..edd90848d5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -58,13 +58,11 @@ void printer_state_polling() { if (gCfgItems.pausePosZ != (float)-1) { gcode.process_subcommands_now_P(PSTR("G91")); - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("G1 Z%.1f"), gCfgItems.pausePosZ); gcode.process_subcommands_now(public_buf_l); gcode.process_subcommands_now_P(PSTR("G90")); } if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("G1 X%.1f Y%.1f"), gCfgItems.pausePosX, gCfgItems.pausePosY); gcode.process_subcommands_now(public_buf_l); } @@ -88,13 +86,11 @@ void printer_state_polling() { if (uiCfg.print_state == RESUMING) { if (IS_SD_PAUSED()) { if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("G1 X%.1f Y%.1f"), uiCfg.current_x_position_bak, uiCfg.current_y_position_bak); gcode.process_subcommands_now(public_buf_m); } if (gCfgItems.pausePosZ != (float)-1) { gcode.process_subcommands_now_P(PSTR("G91")); - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); gcode.process_subcommands_now(public_buf_l); gcode.process_subcommands_now_P(PSTR("G90")); @@ -109,7 +105,6 @@ void printer_state_polling() { } #if ENABLED(POWER_LOSS_RECOVERY) if (uiCfg.print_state == REPRINTED) { - ZERO(public_buf_m); #if HAS_HOTEND HOTEND_LOOP() { const int16_t et = recovery.info.target_temperature[e]; @@ -128,7 +123,6 @@ void printer_state_polling() { #if 0 // Move back to the saved XY char str_1[16], str_2[16]; - ZERO(public_buf_m); sprintf_P(public_buf_m, PSTR("G1 X%s Y%s F2000"), dtostrf(recovery.info.current_position.x, 1, 3, str_1), dtostrf(recovery.info.current_position.y, 1, 3, str_2) @@ -137,7 +131,6 @@ void printer_state_polling() { if (gCfgItems.pause_reprint && gCfgItems.pausePosZ != -1.0f) { gcode.process_subcommands_now_P(PSTR("G91")); - ZERO(public_buf_l); sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); gcode.process_subcommands_now(public_buf_l); gcode.process_subcommands_now_P(PSTR("G90")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 6143037c2b..2f1ec48b44 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -99,7 +99,7 @@ void SysTick_Callback() { uiCfg.filament_unloading_time_cnt = 0; uiCfg.filament_unloading_time_flg = 0; uiCfg.filament_unloading_completed = 1; - uiCfg.filament_rate = 100; + uiCfg.filament_rate = 100; } } } @@ -133,7 +133,7 @@ void tft_lvgl_init() { lv_init(); - lv_disp_buf_init(&disp_buf, bmp_public_buf, NULL, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/ + lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/ lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ lv_disp_drv_init(&disp_drv); /*Basic initialization*/ @@ -199,7 +199,6 @@ void tft_lvgl_init() { uiCfg.print_state = REPRINTING; - ZERO(public_buf_m); strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); card.printLongPath(public_buf_m); @@ -216,15 +215,14 @@ void tft_lvgl_init() { } void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { - uint16_t i, width, height; - - width = area->x2 - area->x1 + 1; - height = area->y2 - area->y1 + 1; + uint16_t width = area->x2 - area->x1 + 1, + height = area->y2 - area->y1 + 1; SPI_TFT.setWindow((uint16_t)area->x1, (uint16_t)area->y1, width, height); - for (i = 0; i < height; i++) { + + for (uint16_t i = 0; i < height; i++) SPI_TFT.tftio.WriteSequence((uint16_t*)(color_p + width * i), width); - } + lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ W25QXX.init(SPI_QUARTER_SPEED); @@ -310,10 +308,9 @@ extern uint8_t currentFlashPage; uint32_t pic_read_base_addr = 0, pic_read_addr_offset = 0; lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { static char last_path_name[30]; - if (strcasecmp(last_path_name,path) != 0) { + if (strcasecmp(last_path_name, path) != 0) { pic_read_base_addr = lv_get_pic_addr((uint8_t *)path); - ZERO(last_path_name); - strcpy(last_path_name,path); + strcpy(last_path_name, path); } else { W25QXX.init(SPI_QUARTER_SPEED); @@ -362,11 +359,10 @@ uint32_t sd_read_base_addr = 0,sd_read_addr_offset = 0; lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { //cur_namefff = strrchr(path, '/'); char name_buf[100]; - ZERO(name_buf); - strcat(name_buf,"/"); - strcat(name_buf,path); - char *temp = strstr(name_buf,".bin"); - if (temp) { strcpy(temp,".GCO"); } + *name_buf = '/'; + strcpy(name_buf + 1, path); + char *temp = strstr(name_buf, ".bin"); + if (temp) strcpy(temp, ".GCO"); sd_read_base_addr = lv_open_gcode_file((char *)name_buf); sd_read_addr_offset = sd_read_base_addr; if (sd_read_addr_offset == 0) return LV_FS_RES_NOT_EX; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 087a3b2110..1ab186a6be 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -260,7 +260,7 @@ void WriteByteSlip(uint8_t b) { // Wait for a data packet to be returned. If the body of the packet is // non-zero length, return an allocated buffer indirectly containing the // data and return the data length. Note that if the pointer for returning -// the data buffer is NULL, the response is expected to be two bytes of zero. +// the data buffer is nullptr, the response is expected to be two bytes of zero. // // If an error occurs, return a negative value. Otherwise, return the number // of bytes in the response (or zero if the response was not the standard "two bytes of zero"). @@ -533,7 +533,7 @@ EspUploadResult flashFinish(signed char reboot) { // Compute the checksum of a block of data uint16_t checksum(const uint8_t *data, uint16_t dataLen, uint16_t cksum) { - if (data != NULL) { + if (data != nullptr) { while (dataLen--) { cksum ^= (uint16_t)*data++; } diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index ce98f563b9..d67fa516b8 100644 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -53,5 +53,17 @@ opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" +# +# MKS Robin v2 nano LVGL SPI + TMC +# (Robin v2 nano has no FSMC interface) +# +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 +opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2209 +exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" + # cleanup restore_configs From e44a97a09632ce56277f2df7e1a14a62043a0a78 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 24 Oct 2020 18:25:14 -0300 Subject: [PATCH 0452/1370] Update PIO dependencies script --- buildroot/share/PlatformIO/scripts/common-dependencies.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 4b4bba6258..b9cefeab7c 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -208,7 +208,8 @@ def search_compiler(): for filepath in os.listdir(pathdir): if not filepath.endswith(gcc): continue - + # Use entire path to not rely on env PATH + filepath = os.path.sep.join([pathdir, filepath]) # Cache the g++ path to no search always if os.path.exists(ENV_BUILD_PATH): blab('Caching g++ for current env') From 676354f1d1e5dd9dceeb81be835cde0b1c851cd5 Mon Sep 17 00:00:00 2001 From: Nick Date: Sat, 24 Oct 2020 22:48:29 +0100 Subject: [PATCH 0453/1370] Fix Anycubic Chiron "Ready" detection (#19880) Co-authored-by: Scott Lahteine --- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 138 ++++++++---------- .../lib/anycubic_chiron/chiron_tft_defs.h | 2 +- 2 files changed, 63 insertions(+), 77 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 109d82b2a2..99b2559d70 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -40,6 +40,7 @@ #include "../../../../sd/cardreader.h" #include "../../../../libs/numtostr.h" #include "../../../../MarlinCore.h" + namespace Anycubic { printer_state_t ChironTFT::printer_state; @@ -87,7 +88,7 @@ namespace Anycubic { // Enable levelling and Disable end stops during print // as Z home places nozzle above the bed so we need to allow it past the end stops - injectCommands_P(AC_cmnd_enable_levelling); //M211 S0\n")); + injectCommands_P(AC_cmnd_enable_levelling); // Startup tunes are defined in Tunes.h //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1); @@ -179,7 +180,7 @@ namespace Anycubic { #endif switch (printer_state) { case AC_printer_pausing: { - if ( (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) || (strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0 ) ) { + if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 || strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0) { SendtoTFTLN(AC_msg_paused); // enable continue button printer_state = AC_printer_paused; } @@ -189,18 +190,18 @@ namespace Anycubic { case AC_printer_printing: case AC_printer_paused: { // Heater timout, send acknowledgement - if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0 ) { + if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0) { pause_state = AC_paused_heater_timed_out; SendtoTFTLN(AC_msg_paused); // enable continue button PlayTune(BEEPER_PIN,Heater_Timedout,1); } // Reheat finished, send acknowledgement - else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0 ) { + else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0) { pause_state = AC_paused_idle; SendtoTFTLN(AC_msg_paused); // enable continue button } // Filament Purging, send acknowledgement enter run mode - else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0 ) { + else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0) { pause_state = AC_paused_purging_filament; SendtoTFTLN(AC_msg_paused); // enable continue button } @@ -221,14 +222,15 @@ namespace Anycubic { switch (printer_state) { case AC_printer_probing: { // If probing completes ok save the mesh and park - if (strcmp_P(msg, MARLIN_msg_ready) == 0 ) { + // Ignore the custom machine name + if (strcmp_P(msg + strlen(CUSTOM_MACHINE_NAME), MARLIN_msg_ready) == 0) { injectCommands_P(PSTR("M500\nG27")); SendtoTFTLN(AC_msg_probing_complete); printer_state = AC_printer_idle; msg_matched = true; } // If probing fails dont save the mesh raise the probe above the bad point - if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0 ) { + if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0) { PlayTune(BEEPER_PIN, BeepBeepBeeep, 1); injectCommands_P(PSTR("G1 Z50 F500")); SendtoTFTLN(AC_msg_probing_complete); @@ -238,14 +240,14 @@ namespace Anycubic { } break; case AC_printer_printing: { - if (strcmp_P(msg, MARLIN_msg_reheating) == 0 ) { + if (strcmp_P(msg, MARLIN_msg_reheating) == 0) { SendtoTFTLN(AC_msg_paused); // enable continue button msg_matched = true; } } break; case AC_printer_pausing: { - if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) { + if (strcmp_P(msg, MARLIN_msg_print_paused) == 0) { SendtoTFTLN(AC_msg_paused); printer_state = AC_printer_paused; pause_state = AC_paused_idle; @@ -254,7 +256,7 @@ namespace Anycubic { } break; case AC_printer_stopping: { - if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0 ) { + if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0) { SendtoTFTLN(AC_msg_stop); printer_state = AC_printer_idle; msg_matched = true; @@ -289,7 +291,7 @@ namespace Anycubic { serialprintPGM(str); #endif while (const char c = pgm_read_byte(str++)) TFTSer.print(c); - } + } void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { if (str != nullptr) { @@ -300,22 +302,22 @@ namespace Anycubic { #if ACDEBUG(AC_SOME) SERIAL_EOL(); #endif - } - TFTSer.println(""); + } + TFTSer.println(""); } bool ChironTFT::ReadTFTCommand() { bool command_ready = false; - while( (TFTSer.available() > 0) && (command_len < MAX_CMND_LEN) ) { + while(TFTSer.available() > 0 && command_len < MAX_CMND_LEN) { panel_command[command_len] = TFTSer.read(); - if(panel_command[command_len] == '\n') { + if (panel_command[command_len] == '\n') { command_ready = true; break; } command_len++; } - if(command_ready) { + if (command_ready) { panel_command[command_len] = 0x00; #if ACDEBUG(AC_ALL) SERIAL_ECHOLNPAIR("< ", panel_command); @@ -333,56 +335,45 @@ namespace Anycubic { } int8_t ChironTFT::Findcmndpos(const char * buff, char q) { - bool found = false; int8_t pos = 0; - do { - if (buff[pos] == q) { - found = true; - break; - } - pos ++; - } while(pos < MAX_CMND_LEN); - if (found) return pos; + do { if (buff[pos] == q) return pos; } while(++pos < MAX_CMND_LEN); return -1; } void ChironTFT::CheckHeaters() { - uint8_t faultDuration = 0; float temp = 0; + uint8_t faultDuration = 0; + float temp = 0; // if the hotend temp is abnormal, confirm state before signalling panel temp = getActualTemp_celsius(E0); - if ( (temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ) { - do { - faultDuration ++; - if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); - SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp); - break; - } - delay_ms(500); - temp = getActualTemp_celsius(E0); - } while ((temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ); + while (!WITHIN(temp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP)) { + faultDuration++; + if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { + SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp); + break; + } + delay_ms(500); + temp = getActualTemp_celsius(E0); } - // if the hotbed temp is abnormal, confirm state before signalling panel + // If the hotbed temp is abnormal, confirm state before signaling panel faultDuration = 0; temp = getActualTemp_celsius(BED); - if ( (temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ) { - do { - faultDuration ++; - if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); - SERIAL_ECHOLNPAIR_P("Bed temp abnormal! : ", temp); + while (!WITHIN(temp, BED_MINTEMP, BED_MAXTEMP)) { + faultDuration++; + if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { + SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + SERIAL_ECHOLNPAIR_P("Bed temp abnormal! : ", temp); break; - } - delay_ms(500); - temp = getActualTemp_celsius(E0); - } while ((temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ); + } + delay_ms(500); + temp = getActualTemp_celsius(E0); } // Update panel with hotend heater status if (hotend_state != AC_heater_temp_reached) { - if ( WITHIN( getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1 ) ) { + if (WITHIN(getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1)) { SendtoTFTLN(AC_msg_nozzle_heating_done); hotend_state = AC_heater_temp_reached; } @@ -390,7 +381,7 @@ namespace Anycubic { // Update panel with bed heater status if (hotbed_state != AC_heater_temp_reached) { - if ( WITHIN( getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5 ) ) { + if (WITHIN(getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5)) { SendtoTFTLN(AC_msg_bed_heating_done); hotbed_state = AC_heater_temp_reached; } @@ -398,7 +389,7 @@ namespace Anycubic { } void ChironTFT::SendFileList(int8_t startindex) { - // respond to panel request for 4 files starting at index + // Respond to panel request for 4 files starting at index #if ACDEBUG(AC_INFO) SERIAL_ECHOLNPAIR("## SendFileList ## ", startindex); #endif @@ -408,8 +399,8 @@ namespace Anycubic { } void ChironTFT::SelectFile() { - strncpy(selectedfile,panel_command+4,command_len-4); - selectedfile[command_len-5] = '\0'; + strncpy(selectedfile, panel_command + 4, command_len - 4); + selectedfile[command_len - 5] = '\0'; #if ACDEBUG(AC_FILE) SERIAL_ECHOLNPAIR_F(" Selected File: ",selectedfile); #endif @@ -493,7 +484,6 @@ namespace Anycubic { if (isPrintingFromMedia()) { SendtoTFT(PSTR("A6V ")); TFTSer.println(ui8tostr2(getProgress_percent())); - } else SendtoTFTLN(PSTR("A6V ---")); @@ -552,7 +542,7 @@ namespace Anycubic { } else { if (printer_state == AC_printer_resuming_from_power_outage) - injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery + injectCommands_P(PSTR("M1000 C")); // Cancel recovery SendtoTFTLN(AC_msg_stop); printer_state = AC_printer_idle; } @@ -569,7 +559,7 @@ namespace Anycubic { case 14: { // A14 Start Printing // Allows printer to restart the job if we dont want to recover if (printer_state == AC_printer_resuming_from_power_outage) { - injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery + injectCommands_P(PSTR("M1000 C")); // Cancel recovery printer_state = AC_printer_idle; } #if ACDebugLevel >= 1 @@ -587,8 +577,7 @@ namespace Anycubic { if (printer_state == AC_printer_resuming_from_power_outage) // Need to home here to restore the Z position injectCommands_P(AC_cmnd_power_loss_recovery); - - injectCommands_P(PSTR("M1000\n")); // home and start recovery + injectCommands_P(PSTR("M1000")); // home and start recovery break; case 16: { // A16 Set HotEnd temp A17 S170 @@ -631,10 +620,10 @@ namespace Anycubic { case 21: // A21 Home Axis A21 X if (!isPrinting()) { switch ((char)panel_command[4]) { - case 'X': injectCommands_P(PSTR("G28 X\n")); break; - case 'Y': injectCommands_P(PSTR("G28 Y\n")); break; - case 'Z': injectCommands_P(PSTR("G28 Z\n")); break; - case 'C': injectCommands_P(PSTR("G28\n")); break; + case 'X': injectCommands_P(PSTR("G28 X")); break; + case 'Y': injectCommands_P(PSTR("G28 Y")); break; + case 'Z': injectCommands_P(PSTR("G28 Z")); break; + case 'C': injectCommands_P(PSTR("G28")); break; } } break; @@ -729,7 +718,7 @@ namespace Anycubic { // If the same meshpoint is selected twice in a row, move the head to that ready for adjustment if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { if (!isPositionKnown()) - injectCommands_P(PSTR("G28\n")); // home + injectCommands_P(PSTR("G28")); // home if (isPositionKnown()) { #if ACDEBUG(AC_INFO) @@ -769,17 +758,15 @@ namespace Anycubic { switch (panel_command[3]) { case 'C': // Restore and apply original offsets if (!isPrinting()) { - injectCommands_P(PSTR("M501\nM420 S1\n")); - selectedmeshpoint.x = 99; - selectedmeshpoint.y = 99; + injectCommands_P(PSTR("M501\nM420 S1")); + selectedmeshpoint.x = selectedmeshpoint.y = 99; } break; case 'D': // Save Z Offset tables and restore levelling state if (!isPrinting()) { setAxisPosition_mm(1.0,Z); - injectCommands_P(PSTR("M500\n")); - selectedmeshpoint.x = 99; - selectedmeshpoint.y = 99; + injectCommands_P(PSTR("M500")); + selectedmeshpoint.x = selectedmeshpoint.y = 99; } break; case 'G': // Get current offset @@ -790,8 +777,7 @@ namespace Anycubic { TFTSer.println(live_Zoffset); else { TFTSer.println(getZOffset_mm()); - selectedmeshpoint.x = 99; - selectedmeshpoint.y = 99; + selectedmeshpoint.x = selectedmeshpoint.y = 99; } break; case 'S': { // Set offset (adjusts all points by value) @@ -859,8 +845,7 @@ namespace Anycubic { case 34: { // A34 Adjust single mesh point A34 C/S X1 Y1 V123 if (panel_command[3] == 'C') { // Restore original offsets injectCommands_P(PSTR("M501\nM420 S1")); - selectedmeshpoint.x = 99; - selectedmeshpoint.y = 99; + selectedmeshpoint.x = selectedmeshpoint.y = 99; //printer_state = AC_printer_idle; } else { @@ -876,9 +861,10 @@ namespace Anycubic { #endif // Update Meshpoint setMeshPoint(pos,newval); - if ( (printer_state == AC_printer_idle) || (printer_state == AC_printer_probing) ) {//!isPrinting()) { - // if we are at the current mesh point indicated on the panel Move Z pos +/- 0.05mm ( The panel changes the mesh value by +/- 0.05mm on each button press) - if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { + if (printer_state == AC_printer_idle || printer_state == AC_printer_probing /*!isPrinting()*/) { + // if we are at the current mesh point indicated on the panel Move Z pos +/- 0.05mm + // (The panel changes the mesh value by +/- 0.05mm on each button press) + if (selectedmeshpoint.x == pos.x && selectedmeshpoint.y == pos.y) { setSoftEndstopState(false); float currZpos = getAxisPosition_mm(Z); #if ACDEBUG(AC_INFO) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h index 937bdfde33..f5000611a7 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -88,7 +88,7 @@ #define MARLIN_msg_start_probing PSTR("Probing Point 1/25") #define MARLIN_msg_probing_failed PSTR("Probing Failed") -#define MARLIN_msg_ready PSTR("3D Printer Ready.") +#define MARLIN_msg_ready PSTR(" Ready.") #define MARLIN_msg_print_paused PSTR("Print Paused") #define MARLIN_msg_print_aborted PSTR("Print Aborted") #define MARLIN_msg_extruder_heating PSTR("E Heating...") From b586a30e7b0c22b962014a6fcc6041582a6d17ed Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 24 Oct 2020 19:28:31 -0300 Subject: [PATCH 0454/1370] More LVGL UI code reduction (#19879) --- .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 12 +---------- .../lib/mks_ui/draw_acceleration_settings.cpp | 11 +--------- .../lib/mks_ui/draw_advance_settings.cpp | 13 ++---------- .../draw_auto_level_offset_settings.cpp | 12 +---------- .../extui/lib/mks_ui/draw_baby_stepping.cpp | 13 +----------- .../extui/lib/mks_ui/draw_change_speed.cpp | 13 +----------- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 13 +----------- .../extui/lib/mks_ui/draw_eeprom_settings.cpp | 12 +---------- .../lib/mks_ui/draw_encoder_settings.cpp | 12 +---------- .../extui/lib/mks_ui/draw_error_message.cpp | 9 +-------- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 13 +----------- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 12 +---------- .../extui/lib/mks_ui/draw_filament_change.cpp | 13 +----------- .../lib/mks_ui/draw_filament_settings.cpp | 12 +---------- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 13 +----------- .../draw_homing_sensitivity_settings.cpp | 10 +--------- .../extui/lib/mks_ui/draw_jerk_settings.cpp | 10 +--------- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 19 +++++------------- .../lcd/extui/lib/mks_ui/draw_language.cpp | 15 +------------- .../extui/lib/mks_ui/draw_level_settings.cpp | 12 ++--------- .../extui/lib/mks_ui/draw_machine_para.cpp | 12 +---------- .../lib/mks_ui/draw_machine_settings.cpp | 13 +----------- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 11 +--------- .../mks_ui/draw_manual_level_pos_settings.cpp | 9 +-------- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 10 +--------- .../extui/lib/mks_ui/draw_motor_settings.cpp | 14 ++----------- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 13 +----------- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 12 +---------- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 12 +---------- .../extui/lib/mks_ui/draw_pause_position.cpp | 10 +--------- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 12 +---------- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 5 +---- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 10 +--------- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 7 +------ Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 13 +----------- .../extui/lib/mks_ui/draw_step_settings.cpp | 10 +--------- .../lib/mks_ui/draw_tmc_current_settings.cpp | 10 +--------- .../mks_ui/draw_tmc_step_mode_settings.cpp | 10 +--------- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 15 +------------- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 20 ++++++++++++++++++- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 12 +---------- .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 12 +---------- .../extui/lib/mks_ui/draw_wifi_settings.cpp | 12 +---------- .../lcd/extui/lib/mks_ui/draw_wifi_tips.cpp | 9 +-------- .../src/lcd/extui/lib/mks_ui/wifiSerial.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 8 ++------ 48 files changed, 74 insertions(+), 462 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index e028b3e6ec..11c5f816b0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -185,7 +185,7 @@ void SPIFlashStorage::loadPage(uint8_t* buffer) { // char fname[256]; // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); // FILE *fp = fopen(fname, "rb"); - // if (fp != nullptr) { + // if (fp) { // fread(buffer, 1, SPI_FLASH_PageSize, fp); // fclose(fp); // } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index b5e59692fd..34168574ec 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -49,17 +49,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_about(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ABOUT_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ABOUT_UI; - } - disp_state = ABOUT_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(ABOUT_UI); // Create an Image button lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_A_RETURN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index 9b86929bca..ffb6f01579 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -108,16 +108,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_acceleration_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ACCELERATION_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ACCELERATION_UI; - } - disp_state = ACCELERATION_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.AccelerationConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(ACCELERATION_UI, machine_menu.AccelerationConfTitle); if (uiCfg.para_ui_page != 1) { sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.acceleration); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp index 5c3b067682..dd6e484921 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -40,6 +40,7 @@ enum { }; static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_ADVANCE_RETURN: lv_clear_advance_settings(); @@ -69,17 +70,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_advance_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ADVANCED_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ADVANCED_UI; - } - disp_state = ADVANCED_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.AdvancedConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(ADVANCED_UI, machine_menu.AdvancedConfTitle); int index = 0; lv_screen_menu_item(scr, machine_menu.PausePosition, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_POS, index++); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp index 8e40956c0f..3b39debe57 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -65,17 +65,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_auto_level_offset_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NOZZLE_PROBE_OFFSET_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = NOZZLE_PROBE_OFFSET_UI; - } - disp_state = NOZZLE_PROBE_OFFSET_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.OffsetConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(NOZZLE_PROBE_OFFSET_UI, machine_menu.OffsetConfTitle); sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); lv_screen_menu_item_1_edit(scr, machine_menu.Xoffset, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_OFFSET_X, 0, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp index b0a004ed9e..5f489162b0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -112,18 +112,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_baby_stepping(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != BABY_STEP_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = BABY_STEP_UI; - } - disp_state = BABY_STEP_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(BABY_STEP_UI); lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_V, titleHeight, event_handler, ID_BABY_STEP_X_P); lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_X_N); lv_big_button_create(scr, "F:/bmp_yAdd.bin", move_menu.y_add, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_BABY_STEP_Y_P); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index 05158b181c..a5100776ac 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -126,18 +126,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_change_speed(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != CHANGE_SPEED_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = CHANGE_SPEED_UI; - } - disp_state = CHANGE_SPEED_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(CHANGE_SPEED_UI); // Create an Image button lv_big_button_create(scr, "F:/bmp_Add.bin", speed_menu.add, INTERVAL_V, titleHeight, event_handler, ID_C_ADD); lv_big_button_create(scr, "F:/bmp_Dec.bin", speed_menu.dec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_C_DEC); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index a18964919a..67ed24d8c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -211,19 +211,8 @@ static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { void lv_draw_dialog(uint8_t type) { lv_obj_t *btnOk = nullptr, *btnCancel = nullptr; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != DIALOG_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = DIALOG_UI; - } - disp_state = DIALOG_UI; - uiCfg.dialogType = type; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(DIALOG_UI); lv_obj_t *labelDialog = lv_label_create_empty(scr); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp index 5e5c6b4907..924c69536a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp @@ -66,17 +66,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_eeprom_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EEPROM_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = EEPROM_SETTINGS_UI; - } - disp_state = EEPROM_SETTINGS_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(EEPROM_SETTINGS_UI); lv_screen_menu_item(scr, eeprom_menu.revert, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_EEPROM_REVERT, 0); lv_screen_menu_item(scr, eeprom_menu.store, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_EEPROM_STORE, 1); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_EEPROM_RETURN, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp index 35bbc6f061..c9c2d4f28d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp @@ -55,18 +55,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_encoder_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ENCODER_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ENCODER_SETTINGS_UI; - } - disp_state = ENCODER_SETTINGS_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.EncoderConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(ENCODER_SETTINGS_UI, machine_menu.EncoderConfTitle); buttonEncoderState = lv_screen_menu_item_onoff(scr, machine_menu.EncoderConfText, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ENCODER_STATE, 0, gCfgItems.encoder_enable); - lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_ENCODER_RETURN, true); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index e82229c909..a484f14087 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -41,15 +41,8 @@ static lv_obj_t *scr; void lv_draw_error_message(PGM_P const msg) { #if 0 static lv_obj_t *message = nullptr, *kill_message = nullptr, *reset_tips = nullptr; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ERROR_MESSAGE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ERROR_MESSAGE_UI; - } - disp_state = ERROR_MESSAGE_UI; - scr = lv_screen_create(); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(ERROR_MESSAGE_UI, ""); if (msg) { message = lv_label_create(scr, msg); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 9f803afea9..6a1c0c4fb3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -122,18 +122,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_extrusion(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EXTRUSION_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = EXTRUSION_UI; - } - disp_state = EXTRUSION_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(EXTRUSION_UI); // Create image buttons lv_obj_t *buttonAdd = lv_big_button_create(scr, "F:/bmp_in.bin", extrude_menu.in, INTERVAL_V, titleHeight, event_handler, ID_E_ADD); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index 5306ab3a89..5453bbf86b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -89,18 +89,8 @@ void lv_draw_fan(void) { #if HAS_FAN fanSpeed = thermalManager.fan_speed[0]; #endif - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FAN_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = FAN_UI; - } - disp_state = FAN_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(FAN_UI); // Create an Image button buttonAdd = lv_big_button_create(scr, "F:/bmp_Add.bin", fan_menu.add, INTERVAL_V, titleHeight, event_handler, ID_F_ADD); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index a3f18cf9cb..1db11a20e6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -112,18 +112,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_filament_change(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENTCHANGE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENTCHANGE_UI; - } - disp_state = FILAMENTCHANGE_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(FILAMENTCHANGE_UI); // Create an Image button lv_obj_t *buttonIn = lv_big_button_create(scr, "F:/bmp_in.bin", filament_menu.in, INTERVAL_V, titleHeight, event_handler, ID_FILAMNT_IN); lv_obj_clear_protect(buttonIn, LV_PROTECT_FOLLOW); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index ecaeefee56..2c9c3882f0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -89,17 +89,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_filament_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENT_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENT_SETTINGS_UI; - } - disp_state = FILAMENT_SETTINGS_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.FilamentConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(FILAMENT_SETTINGS_UI, machine_menu.FilamentConfTitle); if (uiCfg.para_ui_page != 1) { sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 92510cbc8e..646091bd8b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -77,18 +77,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_home(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ZERO_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ZERO_UI; - } - disp_state = ZERO_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(ZERO_UI); lv_big_button_create(scr, "F:/bmp_zeroAll.bin", home_menu.home_all, INTERVAL_V, titleHeight, event_handler, ID_H_ALL); lv_big_button_create(scr, "F:/bmp_zeroX.bin", home_menu.home_x, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_H_X); lv_big_button_create(scr, "F:/bmp_zeroY.bin", home_menu.home_y, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_H_Y); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp index e01208605f..cbd028b60a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp @@ -75,15 +75,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_homing_sensitivity_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != HOMING_SENSITIVITY_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = HOMING_SENSITIVITY_UI; - } - disp_state = HOMING_SENSITIVITY_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.HomingSensitivityConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(HOMING_SENSITIVITY_UI, machine_menu.HomingSensitivityConfTitle); sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); lv_screen_menu_item_1_edit(scr, machine_menu.X_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_SENSITIVITY_X, 0, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp index 5b8f7b45fd..f07c2761b6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -71,15 +71,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_jerk_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != JERK_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = JERK_UI; - } - disp_state = JERK_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.JerkConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(JERK_UI, machine_menu.JerkConfTitle); sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); lv_screen_menu_item_1_edit(scr, machine_menu.X_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_JERK_X, 0, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 0debf8fa8f..7313ed531f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -84,7 +84,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { if (lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_NO_REPEAT) && event == LV_EVENT_LONG_PRESSED_REPEAT) return; const char * txt = lv_btnm_get_active_btn_text(kb); - if (txt == nullptr) return; + if (!txt) return; // Do the corresponding action according to the text of the button if (strcmp(txt, "abc") == 0) { @@ -169,14 +169,13 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { default: break; } } - else { - lv_kb_set_ta(kb, nullptr); /*De-assign the text area to hide it cursor if needed*/ - } + else + lv_kb_set_ta(kb, nullptr); // De-assign the text area to hide it cursor if needed return; } /*Add the characters to the text area if set*/ - if (ext->ta == nullptr) return; + if (!ext->ta) return; if (strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) lv_ta_add_char(ext->ta, '\n'); @@ -213,15 +212,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { } void lv_draw_keyboard() { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != KEY_BOARD_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = KEY_BOARD_UI; - } - disp_state = KEY_BOARD_UI; - - scr = lv_screen_create(); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(KEY_BOARD_UI, ""); /*Create styles for the keyboard*/ static lv_style_t rel_style, pr_style; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 1ff60d9b9b..8f7279f5dd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -188,19 +188,7 @@ static void disp_language(uint8_t language, uint8_t state) { } void lv_draw_language(void) { - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LANGUAGE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = LANGUAGE_UI; - } - disp_state = LANGUAGE_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(LANGUAGE_UI); // Create image buttons buttonCN = lv_big_button_create(scr, "F:/bmp_simplified_cn.bin", language_menu.chinese_s, INTERVAL_V, titleHeight, event_handler, ID_CN); lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW); @@ -211,7 +199,6 @@ void lv_draw_language(void) { buttonFR = lv_big_button_create(scr, "F:/bmp_french.bin", language_menu.french, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FR); buttonIT = lv_big_button_create(scr, "F:/bmp_italy.bin", language_menu.italy, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_IT); lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_L_RETURN); - disp_language(gCfgItems.language, SELECTED); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index 7bd2b83ace..b1ce90f266 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -39,6 +39,7 @@ enum { }; static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_LEVEL_RETURN: lv_clear_level_settings(); @@ -63,16 +64,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_level_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_PARA_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_PARA_UI; - } - disp_state = LEVELING_PARA_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.LevelingParaConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(LEVELING_PARA_UI, machine_menu.LevelingParaConfTitle); lv_screen_menu_item(scr, machine_menu.LevelingManuPosConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_LEVEL_POSITION, 0); lv_screen_menu_item(scr, machine_menu.LevelingAutoCommandConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_LEVEL_COMMAND, 1); #if HAS_BED_PROBE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp index 45aabae079..5f81d7b369 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -66,17 +66,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_machine_para(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_PARA_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_PARA_UI; - } - disp_state = MACHINE_PARA_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(MACHINE_PARA_UI); lv_screen_menu_item(scr, MachinePara_menu.MachineSetting, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PARA_MACHINE, 0); lv_screen_menu_item(scr, MachinePara_menu.MotorSetting, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_PARA_MOTOR, 1); lv_screen_menu_item(scr, MachinePara_menu.leveling, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_PARA_LEVEL, 2); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp index 000b122b34..deeb51ab0f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -63,18 +63,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_machine_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_SETTINGS_UI; - } - disp_state = MACHINE_SETTINGS_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MachineConfigTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(MACHINE_SETTINGS_UI, machine_menu.MachineConfigTitle); lv_screen_menu_item(scr, machine_menu.AccelerationConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MACHINE_ACCELERATION, 0); lv_screen_menu_item(scr, machine_menu.MaxFeedRateConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MACHINE_FEEDRATE, 1); #if HAS_CLASSIC_JERK diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 0513437353..3c8d562913 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -118,16 +118,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_manualLevel(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_UI; - } - disp_state = LEVELING_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(LEVELING_UI); // Create an Image button lv_obj_t *buttonPoint1 = lv_big_button_create(scr, "F:/bmp_leveling1.bin", leveling_menu.position1, INTERVAL_V, titleHeight, event_handler, ID_M_POINT1); lv_obj_clear_protect(buttonPoint1, LV_PROTECT_FOLLOW); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp index 8dedcd4c7b..6f64badf8b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -121,15 +121,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_manual_level_pos_settings(void) { char buf2[50]; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MANUAL_LEVELING_POSIGION_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MANUAL_LEVELING_POSIGION_UI; - } - disp_state = MANUAL_LEVELING_POSIGION_UI; - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.LevelingParaConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(MANUAL_LEVELING_POSIGION_UI, machine_menu.LevelingParaConfTitle); if (uiCfg.para_ui_page != 1) { sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index 5088e859c0..60efda8b27 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -90,15 +90,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_max_feedrate_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MAXFEEDRATE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MAXFEEDRATE_UI; - } - disp_state = MAXFEEDRATE_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MaxFeedRateConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(MAXFEEDRATE_UI, machine_menu.MaxFeedRateConfTitle); if (uiCfg.para_ui_page != 1) { sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp index 697b7de345..61cefd7615 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -73,19 +73,9 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_motor_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOTOR_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MOTOR_SETTINGS_UI; - } - disp_state = MOTOR_SETTINGS_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.MotorConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - int index = 0; + + scr = lv_screen_create(MOTOR_SETTINGS_UI, machine_menu.MotorConfTitle); lv_screen_menu_item(scr, machine_menu.StepsConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MOTOR_STEPS, index++); #if USE_SENSORLESS lv_screen_menu_item(scr, machine_menu.HomingSensitivityConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_HOME_SENSE, index); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 0718ffd86e..30f2a00422 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -115,18 +115,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_move_motor(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOVE_MOTOR_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MOVE_MOTOR_UI; - } - disp_state = MOVE_MOTOR_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(MOVE_MOTOR_UI); lv_obj_t *buttonXI = lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_V, titleHeight, event_handler, ID_M_X_P); lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW); lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_X_N); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 9ed4d60139..0989b95f82 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -662,17 +662,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_number_key(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NUMBER_KEY_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = NUMBER_KEY_UI; - } - disp_state = NUMBER_KEY_UI; - - scr = lv_screen_create(); - - //(void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(NUMBER_KEY_UI, ""); buttonValue = lv_btn_create(scr, 92, 40, 296, 40, event_handler, ID_NUM_KEY1, &style_num_text); labelValue = lv_label_create_empty(buttonValue); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index 16f50c16c5..07df598d8f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -129,17 +129,7 @@ void lv_draw_operation(void) { *buttonBabyStep = nullptr, *label_BabyStep = nullptr, *label_Filament = nullptr; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != OPERATE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = OPERATE_UI; - } - disp_state = OPERATE_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(OPERATE_UI); // Create image buttons lv_obj_t *buttonPreHeat = lv_imgbtn_create(scr, "F:/bmp_temp.bin", INTERVAL_V, titleHeight, event_handler, ID_O_PRE_HEAT); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index 930773b129..a324aef793 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -65,15 +65,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_pause_position(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PAUSE_POS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = PAUSE_POS_UI; - } - disp_state = PAUSE_POS_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.PausePosText); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(PAUSE_POS_UI, machine_menu.PausePosText); sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); lv_screen_menu_item_1_edit(scr, machine_menu.xPos, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_X, 0, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index a222c7adbf..0e869e67c4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -158,17 +158,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_preHeat(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRE_HEAT_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRE_HEAT_UI; - } - disp_state = PRE_HEAT_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(PRE_HEAT_UI); // Create image buttons lv_big_button_create(scr, "F:/bmp_Add.bin", preheat_menu.add, INTERVAL_V, titleHeight, event_handler, ID_P_ADD); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 141ea4cd6f..cfd06cf09f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -252,10 +252,7 @@ static char test_public_buf_l[40]; void disp_gcode_icon(uint8_t file_num) { uint8_t i; - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(MAIN_UI, ""); // Create image buttons buttonPageUp = lv_imgbtn_create(scr, "F:/bmp_pageUp.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_P_UP); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 8191d5fb65..7614f1e99d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -121,15 +121,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_printing(void) { disp_state_stack._disp_index = 0; ZERO(disp_state_stack._disp_state); - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINTING_UI; - - disp_state = PRINTING_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(PRINTING_UI); // Create image buttons lv_obj_t *buttonExt1 = lv_img_create(scr, nullptr); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 3e8a9aad5b..cee02cc47a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -122,13 +122,8 @@ void lv_draw_ready_print(void) { disp_state_stack._disp_index = 0; ZERO(disp_state_stack._disp_state); - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_READY_UI; - - disp_state = PRINT_READY_UI; - - scr = lv_screen_create(); + scr = lv_screen_create(PRINT_READY_UI, ""); //lv_obj_set_hidden(scr, true); - lv_refr_now(lv_refr_get_disp_refreshing()); if (mks_test_flag == 0x1E) { //(void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index 46ea04deaf..b2211e5631 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -126,18 +126,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_set(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = SET_UI; - } - disp_state = SET_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(SET_UI); lv_big_button_create(scr, "F:/bmp_eeprom_settings.bin", set_menu.eepromSet, INTERVAL_V, titleHeight, event_handler, ID_S_EEPROM_SET); lv_big_button_create(scr, "F:/bmp_fan.bin", set_menu.fan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_S_FAN); lv_big_button_create(scr, "F:/bmp_about.bin", set_menu.about, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_S_ABOUT); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index b2b1b00c3b..022c4d30f9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -90,15 +90,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_step_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != STEPS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = STEPS_UI; - } - disp_state = STEPS_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.StepsConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(STEPS_UI, machine_menu.StepsConfTitle); if (uiCfg.para_ui_page != 1) { sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index 777b93d1f5..aaf3073e3d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -103,15 +103,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_tmc_current_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_CURRENT_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = TMC_CURRENT_UI; - } - disp_state = TMC_CURRENT_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.TmcCurrentConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(TMC_CURRENT_UI, machine_menu.TmcCurrentConfTitle); float milliamps; if (uiCfg.para_ui_page != 1) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 3814dacfe1..53d7e35382 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -112,15 +112,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_tmc_step_mode_settings(void) { buttonXState = buttonYState = buttonZState = buttonE0State = buttonE1State = nullptr; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_MODE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = TMC_MODE_UI; - } - disp_state = TMC_MODE_UI; - - scr = lv_screen_create(); - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.TmcStepModeConfTitle); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(TMC_MODE_UI, machine_menu.TmcStepModeConfTitle); bool stealth_X = false, stealth_Y = false, stealth_Z = false, stealth_E0 = false, stealth_E1 = false; #if AXIS_HAS_STEALTHCHOP(X) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 2bbd544cc8..3a9d78741a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -99,24 +99,11 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_tool(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TOOL_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = TOOL_UI; - } - disp_state = TOOL_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - + scr = lv_screen_create(TOOL_UI); lv_big_button_create(scr, "F:/bmp_preHeat.bin", tool_menu.preheat, INTERVAL_V, titleHeight, event_handler, ID_T_PRE_HEAT); lv_big_button_create(scr, "F:/bmp_extruct.bin", tool_menu.extrude, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_EXTRUCT); - lv_big_button_create(scr, "F:/bmp_mov.bin", tool_menu.move, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_T_MOV); lv_big_button_create(scr, "F:/bmp_zero.bin", tool_menu.home, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_T_HOME); - lv_big_button_create(scr, "F:/bmp_leveling.bin", tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling), INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_LEVELING); lv_big_button_create(scr, "F:/bmp_filamentchange.bin", tool_menu.filament, BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight, event_handler,ID_T_FILAMENT); lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 2de5bf25e1..50c49999af 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -1628,11 +1628,29 @@ void lv_btn_set_style_both(lv_obj_t *btn, lv_style_t *style) { } // Create a screen -lv_obj_t* lv_screen_create() { +lv_obj_t* lv_screen_create(DISP_STATE newScreenType, const char* title) { lv_obj_t *scr = lv_obj_create(nullptr, nullptr); lv_obj_set_style(scr, &tft_style_scr); lv_scr_load(scr); lv_obj_clean(scr); + + // breadcrumbs + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != newScreenType) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = newScreenType; + } + disp_state = newScreenType; + lv_refr_now(lv_refr_get_disp_refreshing()); + + // title + lv_obj_t *titleLabel = nullptr; + if (!title) + titleLabel = lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); + else if (title[0] != '\0') + titleLabel = lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, title); + if (titleLabel) + lv_obj_set_style(titleLabel, &tft_style_label_rel); + return scr; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 479166cd8f..3e3a4073d3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -468,7 +468,7 @@ void lv_btn_use_label_style(lv_obj_t *btn); void lv_btn_set_style_both(lv_obj_t *btn, lv_style_t *style); // Create a screen -lv_obj_t* lv_screen_create(); +lv_obj_t* lv_screen_create(DISP_STATE newScreenType, const char* title = nullptr); // Create an empty label lv_obj_t* lv_label_create_empty(lv_obj_t *par); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index e8214cad3a..313abd4545 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -58,17 +58,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_wifi(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_UI; - } - disp_state = WIFI_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(WIFI_UI); // Create an Image button lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp index cb72469bd4..c826e36d42 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -89,17 +89,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_wifi_list(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_LIST_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_LIST_UI; - } - disp_state = WIFI_LIST_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(WIFI_LIST_UI); lv_obj_t *buttonDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H, event_handler, ID_WL_DOWN); lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + (OTHER_BTN_YPIEL + INTERVAL_H) * 2, event_handler, ID_WL_RETURN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp index 0c4fe61132..441720df82 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp @@ -94,17 +94,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_wifi_settings(void) { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_SETTINGS_UI; - } - disp_state = WIFI_SETTINGS_UI; - - scr = lv_screen_create(); - - (void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, machine_menu.WifiConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(WIFI_SETTINGS_UI, machine_menu.WifiConfTitle); lv_obj_t *labelModelText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.wifiMode); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp index 57f2584fa3..a9e5624996 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp @@ -39,14 +39,7 @@ tips_menu_def tips_menu; void lv_draw_wifi_tips(void) { static lv_obj_t *text_tips,*wifi_name; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_TIPS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_TIPS_UI; - } - disp_state = WIFI_TIPS_UI; - - scr = lv_screen_create(); - lv_refr_now(lv_refr_get_disp_refreshing()); + scr = lv_screen_create(WIFI_TIPS_UI, ""); wifi_name = lv_label_create(scr, (const char *)wifi_list.wifiName[wifi_list.nameIndex]); lv_obj_align(wifi_name, nullptr, LV_ALIGN_CENTER, 0, -20); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp index 6e15deffae..16b65c7ea3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp @@ -53,7 +53,7 @@ WifiSerial::WifiSerial(usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) { /* F1 MCUs have no GPIO_AFR[HL], so turn off PWM if there's a conflict * on this GPIO bit. */ static void disable_timer_if_necessary(timer_dev *dev, uint8 ch) { - if (dev != nullptr) timer_set_mode(dev, ch, TIMER_DISABLED); + if (dev) timer_set_mode(dev, ch, TIMER_DISABLED); } #elif STM32_MCU_SERIES == STM32_SERIES_F2 || STM32_MCU_SERIES == STM32_SERIES_F4 #define disable_timer_if_necessary(dev, ch) ((void)0) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 1ab186a6be..097263a655 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -533,12 +533,8 @@ EspUploadResult flashFinish(signed char reboot) { // Compute the checksum of a block of data uint16_t checksum(const uint8_t *data, uint16_t dataLen, uint16_t cksum) { - if (data != nullptr) { - while (dataLen--) { - cksum ^= (uint16_t)*data++; - } - } - return(cksum); + if (data) while (dataLen--) cksum ^= (uint16_t)*data++; + return cksum; } EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { From a625fee0354064c375810b18068f7640246f965b Mon Sep 17 00:00:00 2001 From: Gurmeet Athwal Date: Sun, 25 Oct 2020 06:11:52 +0530 Subject: [PATCH 0455/1370] Add 'BTN_ENC_EN' for SKR V1.4 with DOGM (#19796) --- Marlin/src/lcd/marlinui.cpp | 12 ++++++++++-- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 5 +++++ Marlin/src/pins/pinsDebug_list.h | 3 +++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 487678eccf..9c456c25c9 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -337,6 +337,10 @@ void MarlinUI::init() { SET_INPUT_PULLUP(BTN_ENC); #endif + #if BUTTON_EXISTS(ENC_EN) + SET_INPUT_PULLUP(BTN_ENC_EN); + #endif + #if BUTTON_EXISTS(BACK) SET_INPUT_PULLUP(BTN_BACK); #endif @@ -957,7 +961,10 @@ void MarlinUI::update() { #endif // ENCODER_RATE_MULTIPLIER - encoderPosition += (encoderDiff * encoderMultiplier) / epps; + // Update position only when ENC_EN is HIGH + if (TERN1(BTN_ENC_EN, !BUTTON_PRESSED(ENC_EN))) + encoderPosition += (encoderDiff * encoderMultiplier) / epps; + encoderDiff = 0; } @@ -1175,7 +1182,8 @@ void MarlinUI::update() { if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; #endif #if BUTTON_EXISTS(ENC) - if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; + // Update button only when ENC_EN is HIGH + if (TERN1(BTN_ENC_EN, !BUTTON_PRESSED(ENC_EN)) && BUTTON_PRESSED(ENC)) newbutton |= EN_C; #endif #if BUTTON_EXISTS(BACK) if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index f2afc23bc2..2b8682aac7 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -399,6 +399,11 @@ #define LCD_PINS_D5 P1_21 #define LCD_PINS_D6 P1_22 #define LCD_PINS_D7 P1_23 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif // !FYSETC_MINI_12864 diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 704f2a487f..cf839e2abd 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -147,6 +147,9 @@ #if defined(BTN_EN2) && BTN_EN2 >= 0 REPORT_NAME_DIGITAL(__LINE__, BTN_EN2) #endif +#if defined(BTN_ENC_EN) && BTN_ENC_EN >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_ENC_EN) +#endif #if defined(BTN_ENC) && BTN_ENC >= 0 REPORT_NAME_DIGITAL(__LINE__, BTN_ENC) #endif From 62d578de9e296126610b5ce59f64a36e9660dd17 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 24 Oct 2020 17:43:42 -0700 Subject: [PATCH 0456/1370] Ignore NativeEthernet on AT90USB1286 (#19885) --- .github/workflows/test-builds.yml | 2 +- platformio.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index f7ba348cc0..0030dceb2a 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -39,6 +39,7 @@ jobs: - esp32 - linux_native - mega2560 + - at90usb1286_dfu - teensy31 - teensy35 - teensy41 @@ -95,7 +96,6 @@ jobs: # Non-working environment tests #- at90usb1286_cdc - #- at90usb1286_dfu #- STM32F103CB_malyan #- mks_robin_mini diff --git a/platformio.ini b/platformio.ini index 326dca172f..56ace1b6e2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -560,7 +560,7 @@ build_unflags = -g -ggdb platform = teensy extends = common_avr8 board = at90usb1286 -lib_ignore = ${env:common_avr8.lib_ignore} Teensy_ADC +lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet # # AT90USB1286 boards using DFU bootloader From e232f930181b3bfcfcbd5f2cc95b86e8ce374578 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 24 Oct 2020 17:44:46 -0700 Subject: [PATCH 0457/1370] Update ZMIB_V2 env names (#19886) --- Marlin/src/pins/pins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 9ea35371a4..4f3397b98d 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -318,7 +318,7 @@ #elif MB(AZTEEG_X1) #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p #elif MB(ZMIB_V2) - #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p + #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p // // Other ATmega644P, ATmega644, ATmega1284P From c59f64ce49819ed4175995d2089bb1084b872899 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 25 Oct 2020 13:46:27 +1300 Subject: [PATCH 0458/1370] Use LiquidCrystal_I2C@1.1.4 for RA_CONTROL_PANEL (#19875) --- buildroot/share/PlatformIO/scripts/common-dependencies.h | 4 +++- platformio.ini | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index c96907bb3f..f5b36c407e 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -37,7 +37,9 @@ // Feature checks for SR_LCD_3W_NL #elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) #define USES_LIQUIDTWI2 -#elif ANY(HAS_MARLINUI_HD44780, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) +#elif ENABLED(LCD_I2C_TYPE_PCA8574) + #define USES_LIQUIDCRYSTAL_I2C +#elif ANY(HAS_MARLINUI_HD44780, LCD_I2C_TYPE_PCF8575, SR_LCD_2W_NL , LCM1602) #define USES_LIQUIDCRYSTAL #endif diff --git a/platformio.ini b/platformio.ini index 56ace1b6e2..3e565e6c4e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -222,6 +222,7 @@ NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 +USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 HAS_WIRED_LCD = src_filter=+ HAS_MARLINUI_HD44780 = src_filter=+ From 80909e4424d152613a8f5f0991b9d0e73aeadf3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pasold?= Date: Sun, 25 Oct 2020 09:43:21 +0100 Subject: [PATCH 0459/1370] Support Fysetc Mini 12864 + GT2560 A(+) (#19878) --- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index f481db2b96..2db030804c 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -116,6 +116,20 @@ #define DOGLCD_CS 21 #define BTN_EN1 40 #define BTN_EN2 42 + #elif ENABLED(FYSETC_MINI_12864) + // Disconnect EXP2-1 and EXP2-2, otherwise future firmware upload won't work. + #define DOGLCD_A0 20 + #define DOGLCD_CS 17 + + #define NEOPIXEL_PIN 21 + #define BTN_EN1 42 + #define BTN_EN2 40 + + #define LCD_RESET_PIN 16 + + #define DEFAULT_LCD_CONTRAST 220 + + #define LCD_BACKLIGHT_PIN -1 #else #define LCD_PINS_RS 20 #define LCD_PINS_ENABLE 17 From c94afc759207845b83b5348e3019801295c868a7 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 25 Oct 2020 21:46:21 +1300 Subject: [PATCH 0460/1370] Fix PASSWORD compile w/out LCD (#19888) --- Marlin/src/feature/password/password.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h index 3c223b6a82..97c3174557 100644 --- a/Marlin/src/feature/password/password.h +++ b/Marlin/src/feature/password/password.h @@ -31,10 +31,10 @@ public: Password() { is_locked = false; } static void lock_machine(); + static void authentication_check(); #if HAS_LCD_MENU static void access_menu_password(); - static void authentication_check(); static void authentication_done(); static void media_gatekeeper(); From ea9e28bb6973566a53bca56ec5a2e5d37b29b8ff Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 25 Oct 2020 04:07:00 -0500 Subject: [PATCH 0461/1370] Format Nucleo F767ZI pins --- Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h | 25 ++++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h index 0a00e03612..90dcfc46e4 100644 --- a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h +++ b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h @@ -57,9 +57,8 @@ * TIM14 - TEMP_TIMER (Marlin) * */ -#define STEP_TIMER 4 -#define TEMP_TIMER 14 - +#define STEP_TIMER 4 +#define TEMP_TIMER 14 /** * These pin assignments are arbitrary and intending for testing purposes. @@ -78,7 +77,7 @@ * GND | · · | PD2 (SERVO0_PIN) PB4 | · · | PF12 (LCD_RS) * GND | · · | PG2  ̄ ̄ ̄ * VIN | · · | PG3 -_*  ̄ ̄ ̄ _CN10 + *  ̄ ̄ ̄ _CN10 * AVDD | · · | PF13 (BTN_EN1) * _CN9_ AGND | · · | PE9 (BTN_EN2) * (TEMP_0) PA3 | · · | PD7 GND | · · | PE11 (BTN_ENC) @@ -152,13 +151,13 @@ _*  ̄ ̄ ̄ _CN10 // // Heaters / Fans // -#define HEATER_0_PIN PA15 // PWM Capable, TIM2_CH1 -#define HEATER_BED_PIN PB3 // PWM Capable, TIM2_CH2 +#define HEATER_0_PIN PA15 // PWM Capable, TIM2_CH1 +#define HEATER_BED_PIN PB3 // PWM Capable, TIM2_CH2 #ifndef FAN_PIN - #define FAN_PIN PB10 // PWM Capable, TIM2_CH3 + #define FAN_PIN PB10 // PWM Capable, TIM2_CH3 #endif -#define FAN1_PIN PB11 // PWM Capable, TIM2_CH4 +#define FAN1_PIN PB11 // PWM Capable, TIM2_CH4 #ifndef E0_AUTO_FAN_PIN #define E0_AUTO_FAN_PIN FAN1_PIN @@ -167,8 +166,8 @@ _*  ̄ ̄ ̄ _CN10 // // Servos // -#define SERVO0_PIN PB4 // PWM Capable, TIM3_CH1 -#define SERVO1_PIN PB5 // PWM Capable, TIM3_CH2 +#define SERVO0_PIN PB4 // PWM Capable, TIM3_CH1 +#define SERVO1_PIN PB5 // PWM Capable, TIM3_CH2 // SPI for external SD Card (Not entirely sure this will work) #define SCK_PIN PA5 @@ -177,13 +176,13 @@ _*  ̄ ̄ ̄ _CN10 #define SS_PIN PA4 #define SDSS PA4 -#define LED_PIN LED_BLUE +#define LED_PIN LED_BLUE // // LCD / Controller // #if IS_RRD_FG_SC - #define BEEPER_PIN PC7 // LCD_BEEPER + #define BEEPER_PIN PC7 // LCD_BEEPER #define BTN_ENC PE11 // BTN_ENC #define SD_DETECT_PIN PD14 #define LCD_PINS_RS PF12 // LCD_RS @@ -193,7 +192,7 @@ _*  ̄ ̄ ̄ _CN10 // #define LCD_PINS_D6 // #define LCD_PINS_D7 #define BTN_EN1 PF13 // BTN_EN1 - #define BTN_EN2 PE9 // BTN_EN2 + #define BTN_EN2 PE9 // BTN_EN2 #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #define BOARD_ST7920_DELAY_2 DELAY_NS(63) From 6c103b72a2d0c638f8d3b0d8eb6c77074bff3ced Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 Oct 2020 17:13:10 -0500 Subject: [PATCH 0462/1370] Clean up comments, USB flash, NULLs --- Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp | 4 +- Marlin/src/HAL/ESP32/i2s.cpp | 4 +- Marlin/src/HAL/LINUX/eeprom.cpp | 4 +- Marlin/src/HAL/LINUX/hardware/Gpio.h | 12 +- Marlin/src/HAL/SAMD51/HAL.cpp | 4 +- Marlin/src/HAL/SAMD51/QSPIFlash.cpp | 4 +- Marlin/src/HAL/STM32/tft/xpt2046.cpp | 2 +- Marlin/src/HAL/STM32/timers.cpp | 2 +- Marlin/src/HAL/STM32F1/HAL.h | 2 +- Marlin/src/HAL/STM32F1/SPI.cpp | 2 +- Marlin/src/HAL/STM32F1/fastio.h | 2 +- Marlin/src/gcode/parser.h | 2 +- Marlin/src/gcode/queue.cpp | 4 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 2 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 13 +- .../ftdi_eve_lib/extended/unicode/unicode.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 12 +- Marlin/src/lcd/menu/menu.cpp | 2 +- Marlin/src/lcd/tft/canvas.cpp | 2 +- Marlin/src/lcd/tft/tft_image.cpp | 2 +- Marlin/src/lcd/tft/tft_queue.cpp | 20 +- Marlin/src/lcd/tft/tft_string.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 9 +- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 4 +- .../libs/heatshrink/heatshrink_decoder.cpp | 8 +- Marlin/src/libs/vector_3.cpp | 2 +- Marlin/src/pins/mega/pins_CNCONTROLS_11.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- Marlin/src/sd/SdBaseFile.cpp | 4 +- Marlin/src/sd/SdBaseFile.h | 7 +- Marlin/src/sd/SdFatConfig.h | 3 +- Marlin/src/sd/SdFatStructs.h | 7 +- Marlin/src/sd/SdFatUtil.cpp | 2 + Marlin/src/sd/SdFatUtil.h | 2 + Marlin/src/sd/SdFile.cpp | 2 + Marlin/src/sd/SdFile.h | 9 +- Marlin/src/sd/SdVolume.cpp | 2 + Marlin/src/sd/SdVolume.h | 7 +- Marlin/src/sd/cardreader.cpp | 4 +- Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp | 274 +++++++++--------- 45 files changed, 231 insertions(+), 238 deletions(-) diff --git a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp index ea2936359d..db5e82ec55 100644 --- a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp +++ b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp @@ -84,7 +84,7 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) { card.getSd2Card().readData(sector_buf); // RAM -> USB - if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { + if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) { card.getSd2Card().readStop(); return CTRL_FAIL; } @@ -120,7 +120,7 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) { while (nb_sector--) { // USB -> RAM - if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { + if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) { card.getSd2Card().writeStop(); return CTRL_FAIL; } diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp index 99b2f755e5..e8f3806543 100644 --- a/Marlin/src/HAL/ESP32/i2s.cpp +++ b/Marlin/src/HAL/ESP32/i2s.cpp @@ -184,7 +184,7 @@ int i2s_init() { // Allocate the array of pointers to the buffers dma.buffers = (uint32_t **)malloc(sizeof(uint32_t*) * DMA_BUF_COUNT); - if (dma.buffers == nullptr) return -1; + if (!dma.buffers) return -1; // Allocate each buffer that can be used by the DMA controller for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) { @@ -194,7 +194,7 @@ int i2s_init() { // Allocate the array of DMA descriptors dma.desc = (lldesc_t**) malloc(sizeof(lldesc_t*) * DMA_BUF_COUNT); - if (dma.desc == nullptr) return -1; + if (!dma.desc) return -1; // Allocate each DMA descriptor that will be used by the DMA controller for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) { diff --git a/Marlin/src/HAL/LINUX/eeprom.cpp b/Marlin/src/HAL/LINUX/eeprom.cpp index 967ca851ab..68fff9c433 100644 --- a/Marlin/src/HAL/LINUX/eeprom.cpp +++ b/Marlin/src/HAL/LINUX/eeprom.cpp @@ -40,7 +40,7 @@ size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } bool PersistentStore::access_start() { const char eeprom_erase_value = 0xFF; FILE * eeprom_file = fopen(filename, "rb"); - if (eeprom_file == nullptr) return false; + if (!eeprom_file) return false; fseek(eeprom_file, 0L, SEEK_END); std::size_t file_size = ftell(eeprom_file); @@ -59,7 +59,7 @@ bool PersistentStore::access_start() { bool PersistentStore::access_finish() { FILE * eeprom_file = fopen(filename, "wb"); - if (eeprom_file == nullptr) return false; + if (!eeprom_file) return false; fwrite(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file); fclose(eeprom_file); return true; diff --git a/Marlin/src/HAL/LINUX/hardware/Gpio.h b/Marlin/src/HAL/LINUX/hardware/Gpio.h index 9255ec1dfc..2d9b1f29eb 100644 --- a/Marlin/src/HAL/LINUX/hardware/Gpio.h +++ b/Marlin/src/HAL/LINUX/hardware/Gpio.h @@ -86,10 +86,10 @@ public: GpioEvent::Type evt_type = value > 1 ? GpioEvent::SET_VALUE : value > pin_map[pin].value ? GpioEvent::RISE : value < pin_map[pin].value ? GpioEvent::FALL : GpioEvent::NOP; pin_map[pin].value = value; GpioEvent evt(Clock::nanos(), pin, evt_type); - if (pin_map[pin].cb != nullptr) { + if (pin_map[pin].cb) { pin_map[pin].cb->interrupt(evt); } - if (Gpio::logger != nullptr) Gpio::logger->log(evt); + if (Gpio::logger) Gpio::logger->log(evt); } static uint16_t get(pin_type pin) { @@ -105,8 +105,8 @@ public: if (!valid_pin(pin)) return; pin_map[pin].mode = value; GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETM); - if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt); - if (Gpio::logger != nullptr) Gpio::logger->log(evt); + if (pin_map[pin].cb) pin_map[pin].cb->interrupt(evt); + if (Gpio::logger) Gpio::logger->log(evt); } static uint8_t getMode(pin_type pin) { @@ -118,8 +118,8 @@ public: if (!valid_pin(pin)) return; pin_map[pin].dir = value; GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETD); - if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt); - if (Gpio::logger != nullptr) Gpio::logger->log(evt); + if (pin_map[pin].cb) pin_map[pin].cb->interrupt(evt); + if (Gpio::logger) Gpio::logger->log(evt); } static uint8_t getDir(pin_type pin) { diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 9f24d30071..d985ef3787 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -300,7 +300,7 @@ uint16_t HAL_adc_result; DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE DMA_STEPSEL_SRC // STEPSEL ); - if (descriptor != nullptr) + if (descriptor) descriptor->BTCTRL.bit.EVOSEL = DMA_EVENT_OUTPUT_BEAT; adc0DMAProgram.startJob(); } @@ -337,7 +337,7 @@ uint16_t HAL_adc_result; DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE DMA_STEPSEL_SRC // STEPSEL ); - if (descriptor != nullptr) + if (descriptor) descriptor->BTCTRL.bit.EVOSEL = DMA_EVENT_OUTPUT_BEAT; adc1DMAProgram.startJob(); } diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp index 307eb3fd45..fc21a1ad8c 100644 --- a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp +++ b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp @@ -35,10 +35,10 @@ uint8_t QSPIFlash::_buf[SFLASH_SECTOR_SIZE]; uint32_t QSPIFlash::_addr = INVALID_ADDR; void QSPIFlash::begin() { - if (_flashBase != nullptr) return; + if (_flashBase) return; _flashBase = new Adafruit_SPIFlashBase(new Adafruit_FlashTransport_QSPI()); - _flashBase->begin(NULL); + _flashBase->begin(nullptr); } size_t QSPIFlash::size() { diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp index 921e377a9f..8c8d28f66a 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp @@ -99,7 +99,7 @@ void XPT2046::Init() { #endif } else { - SPIx.Instance = NULL; + SPIx.Instance = nullptr; SET_INPUT(TOUCH_MISO_PIN); SET_OUTPUT(TOUCH_MOSI_PIN); SET_OUTPUT(TOUCH_SCK_PIN); diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index c0ba19abe5..b708c4bdab 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -109,7 +109,7 @@ // Private Variables // ------------------------ -HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { NULL }; +HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { nullptr }; // ------------------------ // Public functions diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index c10dea0eaf..eaf6494dfa 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -124,7 +124,7 @@ void HAL_idletask(); #endif #ifndef digitalPinHasPWM - #define digitalPinHasPWM(P) (PIN_MAP[P].timer_device != nullptr) + #define digitalPinHasPWM(P) !!PIN_MAP[P].timer_device #define NO_COMPILE_TIME_PWM #endif diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp index 0452cf6293..ef00b407a8 100644 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -656,7 +656,7 @@ static const spi_pins* dev_to_spi_pins(spi_dev *dev) { #if BOARD_NR_SPI >= 3 case RCC_SPI3: return board_spi_pins + 2; #endif - default: return NULL; + default: return nullptr; } } diff --git a/Marlin/src/HAL/STM32F1/fastio.h b/Marlin/src/HAL/STM32F1/fastio.h index e0e2e03a1c..a618fccc57 100644 --- a/Marlin/src/HAL/STM32F1/fastio.h +++ b/Marlin/src/HAL/STM32F1/fastio.h @@ -51,7 +51,7 @@ #define IS_INPUT(IO) (_GET_MODE(IO) == GPIO_INPUT_FLOATING || _GET_MODE(IO) == GPIO_INPUT_ANALOG || _GET_MODE(IO) == GPIO_INPUT_PU || _GET_MODE(IO) == GPIO_INPUT_PD) #define IS_OUTPUT(IO) (_GET_MODE(IO) == GPIO_OUTPUT_PP || _GET_MODE(IO) == GPIO_OUTPUT_OD) -#define PWM_PIN(IO) (PIN_MAP[IO].timer_device != nullptr) +#define PWM_PIN(IO) !!PIN_MAP[IO].timer_device // digitalRead/Write wrappers #define extDigitalRead(IO) digitalRead(IO) diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 42b85ca271..17fb084388 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -245,7 +245,7 @@ public: #endif // The code value pointer was set - FORCE_INLINE static bool has_value() { return value_ptr != nullptr; } + FORCE_INLINE static bool has_value() { return !!value_ptr; } // Seen a parameter with a value static inline bool seenval(const char c) { return seen(c) && has_value(); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 6139e3e2b8..f481052cbf 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -180,7 +180,7 @@ bool GCodeQueue::enqueue_one(const char* cmd) { * Return 'true' if any commands were processed. */ bool GCodeQueue::process_injected_command_P() { - if (injected_commands_P == nullptr) return false; + if (!injected_commands_P) return false; char c; size_t i = 0; @@ -480,7 +480,7 @@ void GCodeQueue::get_serial_commands() { if (npos) { - bool M110 = strstr_P(command, PSTR("M110")) != nullptr; + const bool M110 = !!strstr_P(command, PSTR("M110")); if (M110) { char* n2pos = strchr(command + 4, 'N'); diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 3c7993e375..4b82458398 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1036,7 +1036,7 @@ void MarlinUI::draw_status_screen() { void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { ui.encoder_direction_normal(); uint8_t n = lcd_put_u8str_ind_P(0, 1, pstr, itemIndex, itemString, LCD_WIDTH - 1); - if (value != nullptr) { + if (value) { lcd_put_wchar(':'); n--; const uint8_t len = utf8_strlen(value) + 1; // Plus one for a leading space const lcd_uint_t valrow = n < len ? 2 : 1; // Value on the next row if it won't fit diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 83ebe111ae..c21c2ceb58 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -863,7 +863,7 @@ void MarlinUI::draw_status_screen() { lcd.setCursor(0, MIDDLE_Y); lcd.write(COLOR_EDIT); lcd_put_u8str_P(pstr); - if (value != nullptr) { + if (value) { lcd.write(':'); lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), MIDDLE_Y); // Right-justified, padded by spaces lcd.write(' '); // Overwrite char if value gets shorter diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 53a20476e9..0aba49d564 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -423,7 +423,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop if (onpage) lcd_put_u8str_ind_P(0, baseline, pstr, itemIndex, itemString); // If a value is included, print a colon, then print the value right-justified - if (value != nullptr) { + if (value) { lcd_put_wchar(':'); if (extra_row) { // Assume that value is numeric (with no descender) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 2599b1ad22..106c18cf06 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -346,7 +346,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u switch (msg) { case U8G_DEV_MSG_INIT: - dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, NULL); + dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, nullptr); tftio.Init(); tftio.InitTFT(); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 99b2559d70..a1d1217d6e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -294,7 +294,7 @@ namespace Anycubic { } void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { - if (str != nullptr) { + if (str) { #if ACDEBUG(AC_SOME) SERIAL_ECHOPGM("> "); #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index efbc57e68a..2aaa0d0e33 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -218,12 +218,12 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { } float AnycubicTFTClass::CodeValue() { - return (strtod(&TFTcmdbuffer[TFTbufindr][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindr] + 1], NULL)); + return (strtod(&TFTcmdbuffer[TFTbufindr][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindr] + 1], nullptr)); } bool AnycubicTFTClass::CodeSeen(char code) { TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindr], code); - return (TFTstrchr_pointer != NULL); // Return True if a character was found + return !!TFTstrchr_pointer; // Return True if a character was found } bool AnycubicTFTClass::IsNozzleHomed() { @@ -536,7 +536,7 @@ void AnycubicTFTClass::OnPrintTimerStopped() { } void AnycubicTFTClass::GetCommandFromTFT() { - char *starpos = NULL; + char *starpos = nullptr; while (LCD_SERIAL.available() > 0 && TFTbuflen < TFTBUFSIZE) { serial3_char = LCD_SERIAL.read(); if (serial3_char == '\n' || @@ -549,10 +549,10 @@ void AnycubicTFTClass::GetCommandFromTFT() { TFTcmdbuffer[TFTbufindw][serial3_count] = 0; // terminate string - if ((strchr(TFTcmdbuffer[TFTbufindw], 'A') != NULL)) { + if ((strchr(TFTcmdbuffer[TFTbufindw], 'A') != nullptr)) { int16_t a_command; TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); - a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); + a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], nullptr)))); #if ENABLED(ANYCUBIC_LCD_DEBUG) if ((a_command > 7) && (a_command != 20)) { // No debugging of status polls, please! @@ -682,8 +682,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { else { SelectedDirectory[0] = 0; - if (starpos != NULL) - *(starpos - 1) = '\0'; + if (starpos) *(starpos - 1) = '\0'; strcpy(SelectedFile, TFTstrchr_pointer + 4); SENDLINE_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp index 09473c1c26..bee3f74cab 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp @@ -146,9 +146,9 @@ uint16_t FTDI::get_utf8_char_width(utf8_char_t c, font_size_t fs) { int x = 0, y = 0; #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET - WesternCharSet::render_glyph(NULL, x, y, fs, c) || + WesternCharSet::render_glyph(nullptr, x, y, fs, c) || #endif - StandardCharSet::render_glyph(NULL, x, y, fs, c); + StandardCharSet::render_glyph(nullptr, x, y, fs, c); return x; } @@ -165,7 +165,7 @@ */ uint16_t FTDI::get_utf8_text_width(const char *str, font_size_t fs) { - return render_utf8_text(NULL, 0, 0, str, fs); + return render_utf8_text(nullptr, 0, 0, str, fs); } uint16_t FTDI::get_utf8_text_width(progmem_str pstr, font_size_t fs) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 7313ed531f..acf1d15325 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -110,7 +110,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { draw_return_ui(); } else { - lv_kb_set_ta(kb, nullptr); /*De-assign the text area to hide it cursor if needed*/ + lv_kb_set_ta(kb, nullptr); // De-assign the text area to hide it cursor if needed lv_obj_del(kb); return; } @@ -174,7 +174,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { return; } - /*Add the characters to the text area if set*/ + // Add the characters to the text area if set if (!ext->ta) return; if (strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) @@ -214,7 +214,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { void lv_draw_keyboard() { scr = lv_screen_create(KEY_BOARD_UI, ""); - /*Create styles for the keyboard*/ + // Create styles for the keyboard static lv_style_t rel_style, pr_style; lv_style_copy(&rel_style, &lv_style_btn_rel); @@ -229,7 +229,7 @@ void lv_draw_keyboard() { pr_style.body.main_color = lv_color_make(0x72, 0x42, 0x15); pr_style.body.grad_color = lv_color_make(0x6A, 0x3A, 0x0C); - /*Create a keyboard and apply the styles*/ + // Create a keyboard and apply the styles lv_obj_t *kb = lv_kb_create(scr, nullptr); lv_obj_set_event_cb(kb, lv_kb_event_cb); lv_kb_set_cursor_manage(kb, true); @@ -243,7 +243,7 @@ void lv_draw_keyboard() { } #endif - /*Create a text area. The keyboard will write here*/ + // Create a text area. The keyboard will write here lv_obj_t *ta = lv_ta_create(scr, nullptr); lv_obj_align(ta, nullptr, LV_ALIGN_IN_TOP_MID, 0, 10); if (keyboard_value == gcodeCommand) { @@ -255,7 +255,7 @@ void lv_draw_keyboard() { lv_ta_set_text(ta, ""); } - /*Assign the text area to the keyboard*/ + // Assign the text area to the keyboard lv_kb_set_ta(kb, ta); } diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 5d67410351..cd94927049 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -129,7 +129,7 @@ void MenuEditItemBase::edit_screen(strfunc_t strfunc, loadfunc_t loadfunc) { if (ui.should_draw()) draw_edit_screen(strfunc(ui.encoderPosition + minEditValue)); if (ui.lcd_clicked || (liveEdit && ui.should_draw())) { - if (editValue != nullptr) loadfunc(editValue, ui.encoderPosition + minEditValue); + if (editValue) loadfunc(editValue, ui.encoderPosition + minEditValue); if (callbackFunc && (liveEdit || ui.lcd_clicked)) (*callbackFunc)(); if (ui.use_click()) ui.goto_previous_screen(); } diff --git a/Marlin/src/lcd/tft/canvas.cpp b/Marlin/src/lcd/tft/canvas.cpp index f6a5046b8d..061f078b92 100644 --- a/Marlin/src/lcd/tft/canvas.cpp +++ b/Marlin/src/lcd/tft/canvas.cpp @@ -79,7 +79,7 @@ void CANVAS::AddText(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, ui void CANVAS::AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { uint16_t *data = (uint16_t *)Images[image].data; - if (data == NULL) return; + if (!data) return; uint16_t image_width = Images[image].width, image_height = Images[image].height; diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index 27749cb7f3..8f8b610699 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -23,7 +23,7 @@ #include "tft_image.h" #include -const tImage NoLogo = { (void *)NULL, 0, 0, NOCOLORS }; +const tImage NoLogo = { nullptr, 0, 0, NOCOLORS }; const tImage MarlinLogo112x38x1 = { (void *)marlin_logo_112x38x1, 112, 38, GREYSCALE1 }; const tImage MarlinLogo228x255x2 = { (void *)marlin_logo_228x255x2, 228, 255, GREYSCALE2 }; diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp index e77afaf716..e178a59a2d 100644 --- a/Marlin/src/lcd/tft/tft_queue.cpp +++ b/Marlin/src/lcd/tft/tft_queue.cpp @@ -30,19 +30,19 @@ uint8_t TFT_Queue::queue[]; uint8_t *TFT_Queue::end_of_queue = queue; -uint8_t *TFT_Queue::current_task = NULL; -uint8_t *TFT_Queue::last_task = NULL; +uint8_t *TFT_Queue::current_task = nullptr; +uint8_t *TFT_Queue::last_task = nullptr; void TFT_Queue::reset() { tft.abort(); end_of_queue = queue; - current_task = NULL; - last_task = NULL; + current_task = nullptr; + last_task = nullptr; } void TFT_Queue::async() { - if (current_task == NULL) return; + if (!current_task) return; queueTask_t *task = (queueTask_t *)current_task; // Check IO busy status @@ -63,7 +63,7 @@ void TFT_Queue::async() { } void TFT_Queue::finish_sketch() { - if (last_task == NULL) return; + if (!last_task) return; queueTask_t *task = (queueTask_t *)last_task; if (task->state == TASK_STATE_SKETCH) { @@ -71,7 +71,7 @@ void TFT_Queue::finish_sketch() { task->nextTask = end_of_queue; task->state = TASK_STATE_READY; - if (current_task == NULL) current_task = (uint8_t *)task; + if (!current_task) current_task = (uint8_t *)task; } } @@ -184,7 +184,7 @@ void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, ui task->state = TASK_STATE_READY; task->type = TASK_FILL; - if (current_task == NULL) current_task = (uint8_t *)task; + if (!current_task) current_task = (uint8_t *)task; } void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { @@ -195,7 +195,7 @@ void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) task->state = TASK_STATE_SKETCH; task->type = TASK_CANVAS; - task->nextTask = NULL; + task->nextTask = nullptr; end_of_queue += sizeof(queueTask_t); parametersCanvas_t *task_parameters = (parametersCanvas_t *)end_of_queue; @@ -207,7 +207,7 @@ void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) task_parameters->height = height; task_parameters->count = 0; - if (current_task == NULL) current_task = (uint8_t *)task; + if (!current_task) current_task = (uint8_t *)task; } void TFT_Queue::set_background(uint16_t color) { diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index 663ed97c36..b707596bb3 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -42,7 +42,7 @@ void TFT_String::set_font(const uint8_t *font) { font_header = (font_t *)font; uint32_t glyph; - for (glyph = 0; glyph < 256; glyph++) glyphs[glyph] = NULL; + for (glyph = 0; glyph < 256; glyph++) glyphs[glyph] = nullptr; DEBUG_ECHOLNPAIR("Format: ", font_header->Format); DEBUG_ECHOLNPAIR("BBXWidth: ", font_header->BBXWidth); diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 3e0945b227..93f8f64a2d 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -119,9 +119,8 @@ void Touch::idle() { NOMORE(y, current_control->y + current_control->height); touch(current_control); } - else { - current_control = NULL; - } + else + current_control = nullptr; } else { for (i = 0; i < controls_count; i++) { @@ -133,7 +132,7 @@ void Touch::idle() { } } - if (current_control == NULL) + if (!current_control) touch_time = last_touch_ms; } x = _x; @@ -141,7 +140,7 @@ void Touch::idle() { } else { x = y = 0; - current_control = NULL; + current_control = nullptr; touch_time = 0; touch_control_type = NONE; time_to_hold = 0; diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 339c26cca2..45eab34665 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -452,7 +452,7 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const valu void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { uint16_t line = 1; - if (string == NULL) line++; + if (!string) line++; menu_line(line++); tft_string.set(pref); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index b67e041349..1003f32e7c 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -457,7 +457,7 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const valu void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { uint16_t line = 1; - if (string == NULL) line++; + if (!string) line++; menu_line(line++); tft_string.set(pref); @@ -945,7 +945,7 @@ static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage i tft.add_image(0, 0, imgBtn52Rounded, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); // TODO: Make an add_text() taking a font arg - if (label != NULL) { + if (label) { tft_string.set(label); tft_string.trim(); tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); diff --git a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp index 3f0f828cd7..073a7ed0b6 100644 --- a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp +++ b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp @@ -89,7 +89,7 @@ heatshrink_decoder *heatshrink_decoder_alloc(uint16_t input_buffer_size, uint8_t size_t buffers_sz = (1 << window_sz2) + input_buffer_size; size_t sz = sizeof(heatshrink_decoder) + buffers_sz; heatshrink_decoder *hsd = HEATSHRINK_MALLOC(sz); - if (hsd == nullptr) return nullptr; + if (!hsd) return nullptr; hsd->input_buffer_size = input_buffer_size; hsd->window_sz2 = window_sz2; hsd->lookahead_sz2 = lookahead_sz2; @@ -124,7 +124,7 @@ void heatshrink_decoder_reset(heatshrink_decoder *hsd) { /* Copy SIZE bytes into the decoder's input buffer, if it will fit. */ HSD_sink_res heatshrink_decoder_sink(heatshrink_decoder *hsd, uint8_t *in_buf, size_t size, size_t *input_size) { - if (hsd == nullptr || in_buf == nullptr || input_size == nullptr) + if (!hsd || !in_buf || !input_size) return HSDR_SINK_ERROR_NULL; size_t rem = HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd) - hsd->input_size; @@ -160,7 +160,7 @@ static HSD_state st_backref_count_lsb(heatshrink_decoder *hsd); static HSD_state st_yield_backref(heatshrink_decoder *hsd, output_info *oi); HSD_poll_res heatshrink_decoder_poll(heatshrink_decoder *hsd, uint8_t *out_buf, size_t out_buf_size, size_t *output_size) { - if (hsd == nullptr || out_buf == nullptr || output_size == nullptr) + if (!hsd || !out_buf || !output_size) return HSDR_POLL_ERROR_NULL; *output_size = 0; @@ -351,7 +351,7 @@ static uint16_t get_bits(heatshrink_decoder *hsd, uint8_t count) { } HSD_finish_res heatshrink_decoder_finish(heatshrink_decoder *hsd) { - if (hsd == nullptr) { return HSDR_FINISH_ERROR_NULL; } + if (!hsd) return HSDR_FINISH_ERROR_NULL; switch (hsd->state) { case HSDS_TAG_BIT: return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index 75a30aef82..fd93ba09ad 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -141,7 +141,7 @@ matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) { } void matrix_3x3::debug(PGM_P const title) { - if (title != nullptr) { + if (title) { serialprintPGM(title); SERIAL_EOL(); } diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h index 675d4b7262..0e75aa4a37 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h @@ -141,7 +141,7 @@ // Pins for DOGM SPI LCD Support #define DOGLCD_A0 26 #define DOGLCD_CS 24 -#define DOGLCD_MOSI -1 +#define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 #define BTN_EN1 23 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 86dab41121..7f2ae61aae 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -171,7 +171,7 @@ // Shared FSMC Configs #if HAS_FSMC_TFT - #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h + #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 #define FSMC_CS_PIN PD7 // NE4 diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 2bc9f96e8c..46ed9372ab 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -21,12 +21,12 @@ */ #if __GNUC__ > 8 - // The NXP platform updated GCC from 7.2.1 to 9.2.1 - // and this new warning apparently can be ignored. #pragma GCC diagnostic ignored "-Waddress-of-packed-member" #endif /** + * sd/SdBaseFile.cpp + * * Arduino SdFat Library * Copyright (c) 2009 by William Greiman * diff --git a/Marlin/src/sd/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h index 13a1be863d..2f7dfb9f3b 100644 --- a/Marlin/src/sd/SdBaseFile.h +++ b/Marlin/src/sd/SdBaseFile.h @@ -22,11 +22,8 @@ #pragma once /** - * \file - * \brief SdBaseFile class - */ - -/** + * sd/SdBaseFile.h + * * Arduino SdFat Library * Copyright (c) 2009 by William Greiman * diff --git a/Marlin/src/sd/SdFatConfig.h b/Marlin/src/sd/SdFatConfig.h index 2e03a4181f..8f0596c5dd 100644 --- a/Marlin/src/sd/SdFatConfig.h +++ b/Marlin/src/sd/SdFatConfig.h @@ -22,7 +22,8 @@ #pragma once /** - * SdFatConfig.h + * sd/SdFatConfig.h + * * Arduino SdFat Library * Copyright (c) 2009 by William Greiman * diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h index 484d4e50c6..ac81f1d64e 100644 --- a/Marlin/src/sd/SdFatStructs.h +++ b/Marlin/src/sd/SdFatStructs.h @@ -22,11 +22,8 @@ #pragma once /** - * \file - * \brief FAT file structures - */ - -/** + * sd/SdFatStructs.h + * * Arduino SdFat Library * Copyright (c) 2009 by William Greiman * diff --git a/Marlin/src/sd/SdFatUtil.cpp b/Marlin/src/sd/SdFatUtil.cpp index e2c467c5b6..7d9f33dc50 100644 --- a/Marlin/src/sd/SdFatUtil.cpp +++ b/Marlin/src/sd/SdFatUtil.cpp @@ -21,6 +21,8 @@ */ /** + * sd/SdFatUtil.cpp + * * Arduino SdFat Library * Copyright (c) 2008 by William Greiman * diff --git a/Marlin/src/sd/SdFatUtil.h b/Marlin/src/sd/SdFatUtil.h index 7afed2ede0..f1bb65747e 100644 --- a/Marlin/src/sd/SdFatUtil.h +++ b/Marlin/src/sd/SdFatUtil.h @@ -22,6 +22,8 @@ #pragma once /** + * sd/SdFatUtil.h + * * Arduino SdFat Library * Copyright (c) 2008 by William Greiman * diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp index c82fe2c5ed..cba67e2bba 100644 --- a/Marlin/src/sd/SdFile.cpp +++ b/Marlin/src/sd/SdFile.cpp @@ -21,6 +21,8 @@ */ /** + * sd/SdFile.cpp + * * Arduino SdFat Library * Copyright (c) 2009 by William Greiman * diff --git a/Marlin/src/sd/SdFile.h b/Marlin/src/sd/SdFile.h index 52c8f1f0db..17256b47c8 100644 --- a/Marlin/src/sd/SdFile.h +++ b/Marlin/src/sd/SdFile.h @@ -22,11 +22,8 @@ #pragma once /** - * \file - * \brief SdFile class - */ - -/** + * sd/SdFile.h + * * Arduino SdFat Library * Copyright (c) 2009 by William Greiman * @@ -42,7 +39,7 @@ * \class SdFile * \brief SdBaseFile with Print. */ -class SdFile : public SdBaseFile/*, public Print*/ { +class SdFile : public SdBaseFile { public: SdFile() {} SdFile(const char* name, uint8_t oflag); diff --git a/Marlin/src/sd/SdVolume.cpp b/Marlin/src/sd/SdVolume.cpp index 63731f728c..e262c8867a 100644 --- a/Marlin/src/sd/SdVolume.cpp +++ b/Marlin/src/sd/SdVolume.cpp @@ -21,6 +21,8 @@ */ /** + * sd/SdVolume.cpp + * * Arduino SdFat Library * Copyright (c) 2009 by William Greiman * diff --git a/Marlin/src/sd/SdVolume.h b/Marlin/src/sd/SdVolume.h index 1ffa888468..2d57c681c4 100644 --- a/Marlin/src/sd/SdVolume.h +++ b/Marlin/src/sd/SdVolume.h @@ -22,11 +22,8 @@ #pragma once /** - * \file - * \brief SdVolume class - */ - -/** + * sd/SdVolume.h + * * Arduino SdFat Library * Copyright (c) 2009 by William Greiman * diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index b809b2c10f..a633440ff6 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -639,7 +639,7 @@ bool CardReader::fileExists(const char * const path) { selectByName(*diveDir, fname); diveDir->close(); } - return fname != nullptr; + return !!fname; } // @@ -684,7 +684,7 @@ void CardReader::write_command(char * const buf) { char* end = buf + strlen(buf) - 1; file.writeError = false; - if ((npos = strchr(buf, 'N')) != nullptr) { + if ((npos = strchr(buf, 'N'))) { begin = strchr(npos, ' ') + 1; end = strchr(npos, '*') - 1; } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp index 8a989157b4..f26e82b9c7 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp @@ -22,7 +22,10 @@ * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ -/* USB functions */ + +// +// USB functions supporting Flash Drive +// #include "../../../inc/MarlinConfigPre.h" @@ -35,7 +38,7 @@ static uint8_t usb_task_state; /* constructor */ USB::USB() : bmHubPre(0) { - usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; //set up state machine + usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; // Set up state machine init(); } @@ -45,13 +48,8 @@ void USB::init() { bmHubPre = 0; } -uint8_t USB::getUsbTaskState() { - return usb_task_state; -} - -void USB::setUsbTaskState(uint8_t state) { - usb_task_state = state; -} +uint8_t USB::getUsbTaskState() { return usb_task_state; } +void USB::setUsbTaskState(uint8_t state) { usb_task_state = state; } EpInfo* USB::getEpInfoEntry(uint8_t addr, uint8_t ep) { UsbDevice *p = addrPool.GetUsbDevicePtr(addr); @@ -70,9 +68,11 @@ EpInfo* USB::getEpInfoEntry(uint8_t addr, uint8_t ep) { return nullptr; } -/* set device table entry */ - -/* each device is different and has different number of endpoints. This function plugs endpoint record structure, defined in application, to devtable */ +/** + * Set device table entry + * Each device is different and has different number of endpoints. + * This function plugs endpoint record structure, defined in application, to devtable + */ uint8_t USB::setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr) { if (!eprecord_ptr) return USB_ERROR_INVALID_ARGUMENT; @@ -112,7 +112,7 @@ uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_l USBTRACE2(" NAK Limit: ", nak_limit); USBTRACE("\r\n"); */ - regWr(rPERADDR, addr); //set peripheral address + regWr(rPERADDR, addr); // Set peripheral address uint8_t mode = regRd(rMODE); @@ -121,8 +121,6 @@ uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_l //Serial.print("\r\nLS: "); //Serial.println(p->lowspeed, HEX); - - // Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise regWr(rMODE, (p->lowspeed) ? mode | bmLOWSPEED | bmHubPre : mode & ~(bmHUBPRE | bmLOWSPEED)); @@ -133,11 +131,10 @@ uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_l /* depending on request. Actual requests are defined as inlines */ /* return codes: */ /* 00 = success */ - /* 01-0f = non-zero HRSLT */ uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) { - bool direction = false; //request direction, IN or OUT + bool direction = false; // Request direction, IN or OUT uint8_t rcode; SETUP_PKT setup_pkt; @@ -157,15 +154,15 @@ uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bReque setup_pkt.wIndex = wInd; setup_pkt.wLength = total; - bytesWr(rSUDFIFO, 8, (uint8_t*) & setup_pkt); //transfer to setup packet FIFO + bytesWr(rSUDFIFO, 8, (uint8_t*) & setup_pkt); // Transfer to setup packet FIFO - rcode = dispatchPkt(tokSETUP, ep, nak_limit); //dispatch packet + rcode = dispatchPkt(tokSETUP, ep, nak_limit); // Dispatch packet if (rcode) return rcode; // Return HRSLT if not zero - if (dataptr != nullptr) { //data stage, if present - if (direction) { //IN transfer + if (dataptr) { // Data stage, if present + if (direction) { // IN transfer uint16_t left = total; - pep->bmRcvToggle = 1; //bmRCVTOG1; + pep->bmRcvToggle = 1; // BmRCVTOG1; while (left) { // Bytes read into buffer @@ -174,7 +171,7 @@ uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bReque rcode = InTransfer(pep, nak_limit, &read, dataptr); if (rcode == hrTOGERR) { - // yes, we flip it wrong here so that next time it is actually correct! + // Yes, we flip it wrong here so that next time it is actually correct! pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; continue; } @@ -189,21 +186,21 @@ uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bReque if (read < nbytes) break; } } - else { //OUT transfer - pep->bmSndToggle = 1; //bmSNDTOG1; + else { // OUT transfer + pep->bmSndToggle = 1; // BmSNDTOG1; rcode = OutTransfer(pep, nak_limit, nbytes, dataptr); } - if (rcode) return rcode; // return error + if (rcode) return rcode; // Return error } // Status stage - return dispatchPkt((direction) ? tokOUTHS : tokINHS, ep, nak_limit); //GET if direction + return dispatchPkt((direction) ? tokOUTHS : tokINHS, ep, nak_limit); // GET if direction } -/* IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */ -/* Keep sending INs and writes data to memory area pointed by 'data' */ - -/* rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error, - fe USB xfer timeout */ +/** + * IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. + * Keep sending INs and writes data to memory area pointed by 'data' + * rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error, fe = USB xfer timeout + */ uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { EpInfo *pep = nullptr; uint16_t nak_limit = 0; @@ -227,29 +224,29 @@ uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, ui uint8_t maxpktsize = pep->maxPktSize; *nbytesptr = 0; - regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value + regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); // Set toggle value - // use a 'break' to exit this loop + // Use a 'break' to exit this loop for (;;) { - rcode = dispatchPkt(tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS. + rcode = dispatchPkt(tokIN, pep->epAddr, nak_limit); // IN packet to EP-'endpoint'. Function takes care of NAKS. if (rcode == hrTOGERR) { - // yes, we flip it wrong here so that next time it is actually correct! + // Yes, we flip it wrong here so that next time it is actually correct! pep->bmRcvToggle = (regRd(rHRSL) & bmRCVTOGRD) ? 0 : 1; - regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value + regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); // Set toggle value continue; } if (rcode) { //printf(">>>>>>>> Problem! dispatchPkt %2.2x\r\n", rcode); - break; //should be 0, indicating ACK. Else return error code. + break; // Should be 0, indicating ACK. Else return error code. } /* check for RCVDAVIRQ and generate error if not present */ /* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */ if ((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) { //printf(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n"); - rcode = 0xF0; //receive error + rcode = 0xF0; // Receive error break; } - pktsize = regRd(rRCVBC); //number of received bytes + pktsize = regRd(rRCVBC); // Number of received bytes //printf("Got %i bytes \r\n", pktsize); // This would be OK, but... //assert(pktsize <= nbytes); @@ -266,7 +263,7 @@ uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, ui data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data); regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer - *nbytesptr += pktsize; // add this packet's byte count to total transfer length + *nbytesptr += pktsize; // Add this packet's byte count to total transfer length /* The transfer is complete under two conditions: */ /* 1. The device sent a short packet (L.T. maxPacketSize) */ @@ -284,10 +281,11 @@ uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, ui return rcode; } -/* OUT transfer to arbitrary endpoint. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */ -/* Handles NAK bug per Maxim Application Note 4000 for single buffer transfer */ - -/* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */ +/** + * OUT transfer to arbitrary endpoint. Handles multiple packets if necessary. Transfers 'nbytes' bytes. + * Handles NAK bug per Maxim Application Note 4000 for single buffer transfer + * rcode 0 if no errors. rcode 01-0f is relayed from HRSL + */ uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { EpInfo *pep = nullptr; uint16_t nak_limit = 0; @@ -300,7 +298,7 @@ uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dat uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) { uint8_t rcode = hrSUCCESS, retry_count; - uint8_t *data_p = data; //local copy of the data pointer + uint8_t *data_p = data; // Local copy of the data pointer uint16_t bytes_tosend, nak_count; uint16_t bytes_left = nbytes; @@ -311,17 +309,17 @@ uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8 uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT; - regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value + regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); // Set toggle value while (bytes_left) { retry_count = 0; nak_count = 0; bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left; - bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO - regWr(rSNDBC, bytes_tosend); //set number of bytes - regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet - while (!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ - regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ + bytesWr(rSNDFIFO, bytes_tosend, data_p); // Filling output FIFO + regWr(rSNDBC, bytes_tosend); // Set number of bytes + regWr(rHXFR, (tokOUT | pep->epAddr)); // Dispatch packet + while (!(regRd(rHIRQ) & bmHXFRDNIRQ)); // Wait for the completion IRQ + regWr(rHIRQ, bmHXFRDNIRQ); // Clear IRQ rcode = (regRd(rHRSL) & 0x0F); while (rcode && ((int32_t)((uint32_t)millis() - timeout) < 0L)) { @@ -330,18 +328,18 @@ uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8 nak_count++; if (nak_limit && (nak_count == nak_limit)) goto breakout; - //return ( rcode); + //return rcode; break; case hrTIMEOUT: retry_count++; if (retry_count == USB_RETRY_LIMIT) goto breakout; - //return ( rcode); + //return rcode; break; case hrTOGERR: - // yes, we flip it wrong here so that next time it is actually correct! + // Yes, we flip it wrong here so that next time it is actually correct! pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; - regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value + regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); // Set toggle value break; default: goto breakout; @@ -351,26 +349,27 @@ uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8 regWr(rSNDBC, 0); regWr(rSNDFIFO, *data_p); regWr(rSNDBC, bytes_tosend); - regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet - while (!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ - regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ + regWr(rHXFR, (tokOUT | pep->epAddr)); // Dispatch packet + while (!(regRd(rHIRQ) & bmHXFRDNIRQ)); // Wait for the completion IRQ + regWr(rHIRQ, bmHXFRDNIRQ); // Clear IRQ rcode = (regRd(rHRSL) & 0x0F); - } // while rcode && .... + } // While rcode && .... bytes_left -= bytes_tosend; data_p += bytes_tosend; - } // while bytes_left... + } // While bytes_left... breakout: - pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle - return ( rcode); //should be 0 in all cases + pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; // BmSNDTOG1 : bmSNDTOG0; // Update toggle + return ( rcode); // Should be 0 in all cases } -/* dispatch USB packet. Assumes peripheral address is set and relevant buffer is loaded/empty */ -/* If NAK, tries to re-send up to nak_limit times */ -/* If nak_limit == 0, do not count NAKs, exit after timeout */ -/* If bus timeout, re-sends up to USB_RETRY_LIMIT times */ - -/* return codes 0x00-0x0F are HRSLT( 0x00 being success ), 0xFF means timeout */ +/** + * Dispatch USB packet. Assumes peripheral address is set and relevant buffer is loaded/empty + * If NAK, tries to re-send up to nak_limit times + * If nak_limit == 0, do not count NAKs, exit after timeout + * If bus timeout, re-sends up to USB_RETRY_LIMIT times + * return codes 0x00-0x0F are HRSLT( 0x00 being success ), 0xFF means timeout + */ uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) { uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT; uint8_t tmpdata; @@ -380,29 +379,28 @@ uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) { while ((int32_t)((uint32_t)millis() - timeout) < 0L) { #if defined(ESP8266) || defined(ESP32) - yield(); // needed in order to reset the watchdog timer on the ESP8266 + yield(); // Needed in order to reset the watchdog timer on the ESP8266 #endif - regWr(rHXFR, (token | ep)); //launch the transfer + regWr(rHXFR, (token | ep)); // Launch the transfer rcode = USB_ERROR_TRANSFER_TIMEOUT; - while ((int32_t)((uint32_t)millis() - timeout) < 0L) { //wait for transfer completion + while ((int32_t)((uint32_t)millis() - timeout) < 0L) { // Wait for transfer completion #if defined(ESP8266) || defined(ESP32) - yield(); // needed to reset the watchdog timer on the ESP8266 + yield(); // Needed to reset the watchdog timer on the ESP8266 #endif tmpdata = regRd(rHIRQ); if (tmpdata & bmHXFRDNIRQ) { - regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt + regWr(rHIRQ, bmHXFRDNIRQ); // Clear the interrupt rcode = 0x00; break; } - } // while millis() < timeout + } // While millis() < timeout - //if (rcode != 0x00) //exit if timeout - // return ( rcode); + //if (rcode != 0x00) return rcode; // Exit if timeout - rcode = (regRd(rHRSL) & 0x0F); //analyze transfer result + rcode = (regRd(rHRSL) & 0x0F); // Analyze transfer result switch (rcode) { case hrNAK: @@ -419,12 +417,12 @@ uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) { return (rcode); } - } // while timeout > millis() + } // While timeout > millis() return rcode; } -/* USB main task. Performs enumeration/cleanup */ -void USB::Task() { //USB state machine +// USB main task. Performs enumeration/cleanup +void USB::Task() { // USB state machine uint8_t rcode; uint8_t tmpdata; static uint32_t delay = 0; @@ -437,19 +435,19 @@ void USB::Task() { //USB state machine /* modify USB task state if Vbus changed */ switch (tmpdata) { - case SE1: //illegal state + case SE1: // Illegal state usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL; lowspeed = false; break; - case SE0: //disconnected + case SE0: // Disconnected if ((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED) usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; lowspeed = false; break; case LSHOST: lowspeed = true; - //intentional fallthrough - case FSHOST: //attached + // Intentional fallthrough + case FSHOST: // Attached if ((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) { delay = (uint32_t)millis() + USB_SETTLE_DELAY; usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE; @@ -470,31 +468,31 @@ void USB::Task() { //USB state machine usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE; break; - case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: //just sit here + case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: // Just sit here break; - case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here + case USB_DETACHED_SUBSTATE_ILLEGAL: // Just sit here break; - case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device + case USB_ATTACHED_SUBSTATE_SETTLE: // Settle time for just attached device if ((int32_t)((uint32_t)millis() - delay) >= 0L) usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE; - else break; // don't fall through + else break; // Don't fall through case USB_ATTACHED_SUBSTATE_RESET_DEVICE: - regWr(rHCTL, bmBUSRST); //issue bus reset + regWr(rHCTL, bmBUSRST); // Issue bus reset usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE; break; case USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE: if ((regRd(rHCTL) & bmBUSRST) == 0) { - tmpdata = regRd(rMODE) | bmSOFKAENAB; //start SOF generation + tmpdata = regRd(rMODE) | bmSOFKAENAB; // Start SOF generation regWr(rMODE, tmpdata); usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF; - //delay = (uint32_t)millis() + 20; //20ms wait after reset per USB spec + //delay = (uint32_t)millis() + 20; // 20ms wait after reset per USB spec } break; - case USB_ATTACHED_SUBSTATE_WAIT_SOF: //todo: change check order + case USB_ATTACHED_SUBSTATE_WAIT_SOF: // Todo: change check order if (regRd(rHIRQ) & bmFRAMEIRQ) { - //when first SOF received _and_ 20ms has passed we can continue + // When first SOF received _and_ 20ms has passed we can continue /* - if (delay < (uint32_t)millis()) //20ms passed + if (delay < (uint32_t)millis()) // 20ms passed usb_task_state = USB_STATE_CONFIGURING; */ usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET; @@ -503,7 +501,7 @@ void USB::Task() { //USB state machine break; case USB_ATTACHED_SUBSTATE_WAIT_RESET: if ((int32_t)((uint32_t)millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING; - else break; // don't fall through + else break; // Don't fall through case USB_STATE_CONFIGURING: //Serial.print("\r\nConf.LS: "); @@ -565,11 +563,11 @@ again: if (rcode == USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET) { if (parent == 0) { // Send a bus reset on the root interface. - regWr(rHCTL, bmBUSRST); //issue bus reset - delay(102); // delay 102ms, compensate for clock inaccuracy. + regWr(rHCTL, bmBUSRST); // Issue bus reset + delay(102); // Delay 102ms, compensate for clock inaccuracy. } else { - // reset parent port + // Reset parent port devConfig[parent]->ResetHubPort(port); } } @@ -592,11 +590,11 @@ again: // Issue a bus reset, because the device may be in a limbo state if (parent == 0) { // Send a bus reset on the root interface. - regWr(rHCTL, bmBUSRST); //issue bus reset - delay(102); // delay 102ms, compensate for clock inaccuracy. + regWr(rHCTL, bmBUSRST); // Issue bus reset + delay(102); // Delay 102ms, compensate for clock inaccuracy. } else { - // reset parent port + // Reset parent port devConfig[parent]->ResetHubPort(port); } } @@ -623,19 +621,19 @@ again: * 4: set address * 5: pUsb->setEpInfoEntry(bAddress, 1, epInfo), exit on fail * 6: while (configurations) { - * for (each configuration) { - * for (each driver) { - * 6a: Ask device if it likes configuration. Returns 0 on OK. - * If successful, the driver configured device. - * The driver now owns the endpoints, and takes over managing them. - * The following will need codes: - * Everything went well, instance consumed, exit with success. - * Instance already in use, ignore it, try next driver. - * Not a supported device, ignore it, try next driver. - * Not a supported configuration for this device, ignore it, try next driver. - * Could not configure device, fatal, exit with fail. - * } - * } + * for (each configuration) { + * for (each driver) { + * 6a: Ask device if it likes configuration. Returns 0 on OK. + * If successful, the driver configured device. + * The driver now owns the endpoints, and takes over managing them. + * The following will need codes: + * Everything went well, instance consumed, exit with success. + * Instance already in use, ignore it, try next driver. + * Not a supported device, ignore it, try next driver. + * Not a supported configuration for this device, ignore it, try next driver. + * Could not configure device, fatal, exit with fail. + * } + * } * } * 7: for (each driver) { * 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID @@ -671,7 +669,7 @@ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { oldep_ptr = p->epinfo; // Temporary assign new pointer to epInfo to p->epinfo in order to - // avoid toggle inconsistence + // Avoid toggle inconsistence p->epinfo = &epInfo; @@ -687,7 +685,7 @@ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { return rcode; } - // to-do? + // To-do? // Allocate new address according to device class //bAddress = addrPool.AllocAddress(parent, false, port); @@ -698,11 +696,11 @@ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { // Qualify with subclass too. // // VID/PID & class tests default to false for drivers not yet ported - // subclass defaults to true, so you don't have to define it if you don't have to. + // Subclass defaults to true, so you don't have to define it if you don't have to. // for (devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) { - if (!devConfig[devConfigIndex]) continue; // no driver - if (devConfig[devConfigIndex]->GetAddress()) continue; // consumed + if (!devConfig[devConfigIndex]) continue; // No driver + if (devConfig[devConfigIndex]->GetAddress()) continue; // Consumed if (devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) { rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed); if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED) @@ -712,20 +710,20 @@ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { if (devConfigIndex < USB_NUMDEVICES) return rcode; - // blindly attempt to configure + // Blindly attempt to configure for (devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) { if (!devConfig[devConfigIndex]) continue; - if (devConfig[devConfigIndex]->GetAddress()) continue; // consumed + if (devConfig[devConfigIndex]->GetAddress()) continue; // Consumed if (devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) continue; // If this is true it means it must have returned USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED above rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed); //printf("ERROR ENUMERATING %2.2x\r\n", rcode); if (!(rcode == USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED || rcode == USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE)) { - // in case of an error dev_index should be reset to 0 - // in order to start from the very beginning the - // next time the program gets here + // In case of an error dev_index should be reset to 0 + // in order to start from the very beginning the + // next time the program gets here //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) - // devConfigIndex = 0; + //devConfigIndex = 0; return rcode; } } @@ -744,20 +742,22 @@ uint8_t USB::ReleaseDevice(uint8_t addr) { return 0; } -#if 1 //!defined(USB_METHODS_INLINE) -//get device descriptor - +// Get device descriptor uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, nullptr); } -//get configuration descriptor +// Get configuration descriptor uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, nullptr); } -/* Requests Configuration Descriptor. Sends two Get Conf Descr requests. The first one gets the total length of all descriptors, then the second one requests this - total length. The length of the first request can be shorter ( 4 bytes ), however, there are devices which won't work unless this length is set to 9 */ +/** + * Requests Configuration Descriptor. Sends two Get Conf Descr requests. + * The first one gets the total length of all descriptors, then the second one requests this + * total length. The length of the first request can be shorter (4 bytes), however, there are + * devices which won't work unless this length is set to 9. + */ uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) { const uint8_t bufSize = 64; uint8_t buf[bufSize]; @@ -773,25 +773,23 @@ uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p); } -//get string descriptor - +// Get string descriptor uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, nullptr); } -//set address +// Set address uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) { uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); - //delay(2); //per USB 2.0 sect.9.2.6.3 + //delay(2); // Per USB 2.0 sect.9.2.6.3 delay(300); // Older spec says you should wait at least 200ms return rcode; //return ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); } -//set configuration +// Set configuration uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) { return ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); } -#endif // defined(USB_METHODS_INLINE) #endif // USB_FLASH_DRIVE_SUPPORT From 2a8fdb8ee46559e7d6850f5a7a1c2ea435cb23cb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 25 Oct 2020 04:19:51 -0500 Subject: [PATCH 0463/1370] Followup for BTN_ENC_EN --- Marlin/src/lcd/marlinui.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 9c456c25c9..0a87965721 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -808,6 +808,14 @@ millis_t next_lcd_update_ms; millis_t MarlinUI::return_to_status_ms = 0; #endif +inline bool can_encode() { + #if BUTTON_EXISTS(ENC_EN) + return !BUTTON_PRESSED(ENC_EN); // Update position only when ENC_EN is HIGH + #else + return true; + #endif +} + void MarlinUI::update() { static uint16_t max_display_update_time = 0; @@ -961,9 +969,7 @@ void MarlinUI::update() { #endif // ENCODER_RATE_MULTIPLIER - // Update position only when ENC_EN is HIGH - if (TERN1(BTN_ENC_EN, !BUTTON_PRESSED(ENC_EN))) - encoderPosition += (encoderDiff * encoderMultiplier) / epps; + if (can_encode()) encoderPosition += (encoderDiff * encoderMultiplier) / epps; encoderDiff = 0; } @@ -1182,8 +1188,7 @@ void MarlinUI::update() { if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; #endif #if BUTTON_EXISTS(ENC) - // Update button only when ENC_EN is HIGH - if (TERN1(BTN_ENC_EN, !BUTTON_PRESSED(ENC_EN)) && BUTTON_PRESSED(ENC)) newbutton |= EN_C; + if (can_encode() && BUTTON_PRESSED(ENC)) newbutton |= EN_C; #endif #if BUTTON_EXISTS(BACK) if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; From 3bab0fccc2f32504db23b61b05405b79cdce7d3d Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Tue, 27 Oct 2020 11:13:05 -0600 Subject: [PATCH 0464/1370] Fix NO_WORKSPACE_OFFSETS compile --- Marlin/src/module/probe.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 98e6aff1b5..63229242b5 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -145,25 +145,25 @@ public: return TERN(IS_KINEMATIC, (X_CENTER) - probe_radius(), _MAX((X_MIN_BED) + (PROBING_MARGIN_LEFT), (X_MIN_POS) + offset_xy.x) - ) - TERN0(NOZZLE_AS_PROBE, home_offset.x); + ) - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.x)); } static inline float max_x() { return TERN(IS_KINEMATIC, (X_CENTER) + probe_radius(), _MIN((X_MAX_BED) - (PROBING_MARGIN_RIGHT), (X_MAX_POS) + offset_xy.x) - ) - TERN0(NOZZLE_AS_PROBE, home_offset.x); + ) - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.x)); } static inline float min_y() { return TERN(IS_KINEMATIC, (Y_CENTER) - probe_radius(), _MAX((Y_MIN_BED) + (PROBING_MARGIN_FRONT), (Y_MIN_POS) + offset_xy.y) - ) - TERN0(NOZZLE_AS_PROBE, home_offset.y); + ) - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.y)); } static inline float max_y() { return TERN(IS_KINEMATIC, (Y_CENTER) + probe_radius(), _MIN((Y_MAX_BED) - (PROBING_MARGIN_BACK), (Y_MAX_POS) + offset_xy.y) - ) - TERN0(NOZZLE_AS_PROBE, home_offset.y); + ) - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.y)); } #if NEEDS_THREE_PROBE_POINTS From 5a74114e23dae75aa426ee861b34cdcf4f44643c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 27 Oct 2020 17:09:19 -0300 Subject: [PATCH 0465/1370] Fix some LVGL bugs (#19904) --- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp | 15 +-------------- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_print_file.cpp | 7 +------ Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 7 +++++-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- .../extui/lib/mks_ui/tft_lvgl_configuration.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h | 2 +- 8 files changed, 12 insertions(+), 27 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h index 696bc16974..f3be3dc0ba 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -21,7 +21,7 @@ */ #pragma once -#include "../../inc/MarlinConfigPre.h" +#include "../../../../inc/MarlinConfigPre.h" #if HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index 34168574ec..01f64e8fc6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -50,20 +50,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_about(void) { scr = lv_screen_create(ABOUT_UI); - - // Create an Image button - lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_A_RETURN); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - // Create a label on the image button - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_A_RETURN); //fw_version = lv_label_create(scr, SHORT_BUILD_VERSION); //lv_obj_align(fw_version, nullptr, LV_ALIGN_CENTER, 0, -60); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 67ed24d8c0..0a36b09ce7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -214,7 +214,7 @@ void lv_draw_dialog(uint8_t type) { uiCfg.dialogType = type; scr = lv_screen_create(DIALOG_UI); - lv_obj_t *labelDialog = lv_label_create_empty(scr); + lv_obj_t *labelDialog = lv_label_create(scr, ""); if (DIALOG_IS(TYPE_FINISH_PRINT, PAUSE_MESSAGE_RESUME)) { btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index cfd06cf09f..f513ea4d0b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -208,11 +208,6 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_print_file(void) { //uint8_t i; uint8_t file_count; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRINT_FILE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_FILE_UI; - } - disp_state = PRINT_FILE_UI; curDirLever = 0; dir_offset[curDirLever].curPage = 0; @@ -252,7 +247,7 @@ static char test_public_buf_l[40]; void disp_gcode_icon(uint8_t file_num) { uint8_t i; - scr = lv_screen_create(MAIN_UI, ""); + scr = lv_screen_create(PRINT_FILE_UI, ""); // Create image buttons buttonPageUp = lv_imgbtn_create(scr, "F:/bmp_pageUp.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_P_UP); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 50c49999af..c7f5f418f5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -1640,7 +1640,6 @@ lv_obj_t* lv_screen_create(DISP_STATE newScreenType, const char* title) { disp_state_stack._disp_state[disp_state_stack._disp_index] = newScreenType; } disp_state = newScreenType; - lv_refr_now(lv_refr_get_disp_refreshing()); // title lv_obj_t *titleLabel = nullptr; @@ -1651,18 +1650,22 @@ lv_obj_t* lv_screen_create(DISP_STATE newScreenType, const char* title) { if (titleLabel) lv_obj_set_style(titleLabel, &tft_style_label_rel); + lv_refr_now(lv_refr_get_disp_refreshing()); + return scr; } // Create an empty label lv_obj_t* lv_label_create_empty(lv_obj_t *par) { - return lv_label_create(par, (lv_obj_t*)nullptr); + lv_obj_t *label = lv_label_create(par, (lv_obj_t*)nullptr); + return label; } // Create a label with style and text lv_obj_t* lv_label_create(lv_obj_t *par, const char *text) { lv_obj_t *label = lv_label_create_empty(par); if (text) lv_label_set_text(label, text); + lv_obj_set_style(label, &tft_style_label_rel); return label; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 3e3a4073d3..eb54b3e4ea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -86,7 +86,7 @@ #include "draw_wifi_tips.h" #endif -#include "../../inc/MarlinConfigPre.h" +#include "../../../../inc/MarlinConfigPre.h" #define FILE_SYS_USB 0 #define FILE_SYS_SD 1 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 2f1ec48b44..26f6301763 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -43,7 +43,7 @@ #include "../../../../MarlinCore.h" #include "../../../../inc/MarlinConfig.h" -#include HAL_PATH(../../HAL, tft/xpt2046.h) +#include HAL_PATH(../../../../HAL, tft/xpt2046.h) #include "../../../marlinui.h" XPT2046 touch; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h index 0b402a3adb..656e440bc2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -#include "../../inc/MarlinConfigPre.h" +#include "../../../../inc/MarlinConfigPre.h" #include #include From 3b42e0263ab18d9a19dff6b0fa00413b192fa61c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 27 Oct 2020 17:16:35 -0300 Subject: [PATCH 0466/1370] Keep watchdog refreshed in LVGL init (#19900) --- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp | 1 + .../extui/lib/mks_ui/tft_lvgl_configuration.cpp | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 70c48f5c8e..5ba7722f55 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -488,6 +488,7 @@ uint8_t public_buf[512]; } void UpdateAssets() { + if (!card.isMounted()) return; SdFile dir, root = card.getroot(); if (dir.open(&root, assetsPath, O_RDONLY)) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 26f6301763..21e3040c2e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -116,17 +116,20 @@ void tft_lvgl_init() { ui_cfg_init(); disp_language_init(); - //init tft first! + watchdog_refresh(); // LVGL init takes time + + // Init TFT first! SPI_TFT.spi_init(SPI_FULL_SPEED); SPI_TFT.LCD_init(); + watchdog_refresh(); // LVGL init takes time + //spi_flash_read_test(); #if ENABLED(SDSUPPORT) - watchdog_refresh(); UpdateAssets(); + watchdog_refresh(); // LVGL init takes time #endif - watchdog_refresh(); mks_test_get(); touch.Init(); @@ -189,9 +192,11 @@ void tft_lvgl_init() { lv_encoder_pin_init(); + bool ready = true; #if ENABLED(POWER_LOSS_RECOVERY) recovery.load(); if (recovery.valid()) { + ready = false; if (gCfgItems.from_flash_pic) flash_preview_begin = true; else @@ -201,14 +206,12 @@ void tft_lvgl_init() { strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); card.printLongPath(public_buf_m); - strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id])); - lv_draw_printing(); } - else #endif - lv_draw_ready_print(); + + if (ready) lv_draw_ready_print(); if (mks_test_flag == 0x1E) mks_gpio_test(); From aecf545446981a5087f58e5dff4420f8aba1576d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 27 Oct 2020 16:21:03 -0500 Subject: [PATCH 0467/1370] Fix Archim 1, add Archim 1&2 tests --- Marlin/src/HAL/DUE/fastio.h | 2 +- Marlin/src/pins/pins.h | 2 +- buildroot/tests/DUE-tests | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h index 286319302d..119d0005af 100644 --- a/Marlin/src/HAL/DUE/fastio.h +++ b/Marlin/src/HAL/DUE/fastio.h @@ -477,7 +477,7 @@ #define DIO91_PIN 15 #define DIO91_WPORT PIOB -#if ARDUINO_SAM_ARCHIM +#ifdef ARDUINO_SAM_ARCHIM #define DIO92_PIN 11 #define DIO92_WPORT PIOC diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 4f3397b98d..c4dbe60e99 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -483,7 +483,7 @@ #elif MB(ULTRATRONICS_PRO) #include "sam/pins_ULTRATRONICS_PRO.h" // SAM3X8E env:DUE env:DUE_debug #elif MB(ARCHIM1) - #include "sam/pins_ARCHIM1.h" // SAM3X8E env:DUE env:DUE_debug + #include "sam/pins_ARCHIM1.h" // SAM3X8E env:DUE_archim env:DUE_archim_debug #elif MB(ARCHIM2) #include "sam/pins_ARCHIM2.h" // SAM3X8E env:DUE_archim env:DUE_archim_debug #elif MB(ALLIGATOR) diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 7f488f6126..91fba12a3e 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -35,6 +35,9 @@ opt_add TEMP_CHAMBER_PIN 6 opt_set HEATER_CHAMBER_PIN 45 exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." +# +# RADDS with BLTouch, ABL(B), 3 x Z auto-align +# restore_configs opt_set MOTHERBOARD BOARD_RADDS opt_enable USE_XMAX_PLUG USE_YMAX_PLUG ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ @@ -60,3 +63,15 @@ opt_set EXTRUDERS 2 opt_set NUM_SERVOS 1 opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER BEEP_ON_FEEDRATE_CHANGE POWER_LOSS_RECOVERY exec_test $1 $2 "RAMPS4DUE_EEF with SWITCHING_EXTRUDER, POWER_LOSS_RECOVERY" + +# +# Test Archim 1 +# +use_example_configs UltiMachine/Archim1 +exec_test $1 $2 "Archim 1 base configuration" + +# +# Test Archim 2 +# +use_example_configs UltiMachine/Archim2 +exec_test $1 $2 "Archim 2 base configuration" From f43f71646e0dc161168be7f425870746b32df922 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 27 Oct 2020 17:21:38 -0500 Subject: [PATCH 0468/1370] Archim test matching env --- .github/workflows/test-builds.yml | 1 + buildroot/tests/DUE-tests | 12 ------------ buildroot/tests/DUE_archim-tests | 21 +++++++++++++++++++++ 3 files changed, 22 insertions(+), 12 deletions(-) create mode 100755 buildroot/tests/DUE_archim-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 0030dceb2a..9624733838 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -36,6 +36,7 @@ jobs: # Base Environments - DUE + - DUE_archim - esp32 - linux_native - mega2560 diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 91fba12a3e..0da0d798d0 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -63,15 +63,3 @@ opt_set EXTRUDERS 2 opt_set NUM_SERVOS 1 opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER BEEP_ON_FEEDRATE_CHANGE POWER_LOSS_RECOVERY exec_test $1 $2 "RAMPS4DUE_EEF with SWITCHING_EXTRUDER, POWER_LOSS_RECOVERY" - -# -# Test Archim 1 -# -use_example_configs UltiMachine/Archim1 -exec_test $1 $2 "Archim 1 base configuration" - -# -# Test Archim 2 -# -use_example_configs UltiMachine/Archim2 -exec_test $1 $2 "Archim 2 base configuration" diff --git a/buildroot/tests/DUE_archim-tests b/buildroot/tests/DUE_archim-tests new file mode 100755 index 0000000000..4d9eb36419 --- /dev/null +++ b/buildroot/tests/DUE_archim-tests @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# +# Build tests for DUE (Atmel SAM3X8E ARM Cortex-M3) +# + +# exit on first failure +set -e + +# +# Test Archim 1 +# +use_example_configs UltiMachine/Archim1 +exec_test $1 $2 "Archim 1 base configuration" + +# +# Test Archim 2 +# +use_example_configs UltiMachine/Archim2 +exec_test $1 $2 "Archim 2 base configuration" + +restore_configs From d4669dbf6af9519ae5b553605e7a26a774c6a512 Mon Sep 17 00:00:00 2001 From: Speaka <48431623+Speaka@users.noreply.github.com> Date: Tue, 27 Oct 2020 23:25:01 +0100 Subject: [PATCH 0469/1370] Fix G35 PROGMEM strings (#19926) --- Marlin/src/gcode/bedlevel/G35.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index f6ae2db2c7..b39a7b9ed8 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -129,15 +129,19 @@ void GcodeSuite::G35() { const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true); if (isnan(z_probed_height)) { - SERIAL_ECHOPAIR("G35 failed at point ", int(i), " (", tramming_point_name[i], ")"); + SERIAL_ECHOPAIR("G35 failed at point ", int(i), " ("); + SERIAL_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i])); + SERIAL_CHAR(')'); SERIAL_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y); err_break = true; break; } if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("Probing point ", int(i), " (", tramming_point_name[i], ")"); - SERIAL_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y, SP_Z_STR, z_probed_height); + DEBUG_ECHOPAIR("Probing point ", int(i), " ("); + DEBUG_PRINT_P((char *)pgm_read_ptr(&tramming_point_name[i])); + DEBUG_CHAR(')'); + DEBUG_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y, SP_Z_STR, z_probed_height); } z_measured[i] = z_probed_height; @@ -155,9 +159,9 @@ void GcodeSuite::G35() { const float decimal_part = adjust - float(full_turns); const int minutes = trunc(decimal_part * 60.0f); - SERIAL_ECHOPAIR("Turn ", tramming_point_name[i], - " ", (screw_thread & 1) == (adjust > 0) ? "CCW" : "CW", - " by ", abs(full_turns), " turns"); + SERIAL_ECHOPGM("Turn "); + SERIAL_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i])); + SERIAL_ECHOPAIR(" ", (screw_thread & 1) == (adjust > 0) ? "CCW" : "CW", " by ", abs(full_turns), " turns"); if (minutes) SERIAL_ECHOPAIR(" and ", abs(minutes), " minutes"); if (ENABLED(REPORT_TRAMMING_MM)) SERIAL_ECHOPAIR(" (", -diff, "mm)"); SERIAL_EOL(); From d7d1ef82284eec8fa961b4f67447de59dc53b5d2 Mon Sep 17 00:00:00 2001 From: Lucas Seiki Oshiro Date: Tue, 27 Oct 2020 22:41:12 -0300 Subject: [PATCH 0470/1370] "Sound: ON/OFF" menu item (#19901) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/inc/Conditionals_post.h | 16 ++++++----- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 1 + Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 1 + Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/marlinui.cpp | 5 ++++ Marlin/src/lcd/marlinui.h | 6 +++++ Marlin/src/lcd/menu/menu_configuration.cpp | 8 ++++++ Marlin/src/libs/buzzer.cpp | 8 +++--- Marlin/src/module/settings.cpp | 30 +++++++++++++++++++++ buildroot/tests/LPC1768-tests | 2 +- buildroot/tests/mega2560-tests | 4 +-- buildroot/tests/teensy35-tests | 2 +- 13 files changed, 74 insertions(+), 13 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 31661a582e..951aab7804 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1090,6 +1090,9 @@ // BACK menu items keep the highlight at the top //#define TURBO_BACK_MENU_ITEM + // Add a mute option to the LCD menu + //#define SOUND_MENU_ITEM + /** * LED Control Menu * Add LED Control to the LCD menu diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index bb717ba097..bbbcf6fb2f 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2505,11 +2505,11 @@ /** * Buzzer/Speaker */ -#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) +#if PIN_EXISTS(BEEPER) + #define USE_BEEPER 1 +#endif +#if USE_BEEPER || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) #define HAS_BUZZER 1 - #if PIN_EXISTS(BEEPER) - #define USE_BEEPER 1 - #endif #endif #if ENABLED(LCD_USE_I2C_BUZZER) @@ -2528,8 +2528,12 @@ #endif #endif -#if HAS_BUZZER && LCD_FEEDBACK_FREQUENCY_DURATION_MS && LCD_FEEDBACK_FREQUENCY_HZ - #define HAS_CHIRP 1 +#if HAS_BUZZER + #if LCD_FEEDBACK_FREQUENCY_DURATION_MS && LCD_FEEDBACK_FREQUENCY_HZ + #define HAS_CHIRP 1 + #endif +#else + #undef SOUND_MENU_ITEM // No buzzer menu item without a buzzer #endif /** diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 4b82458398..81862e1ddf 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -113,6 +113,7 @@ static void createChar_P(const char c, const byte * const ptr) { #if ENABLED(LCD_USE_I2C_BUZZER) void MarlinUI::buzz(const long duration, const uint16_t freq) { + if (!buzzer_enabled) return; lcd.buzz(duration, freq); } #endif diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index c21c2ceb58..571d576bbc 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -289,6 +289,7 @@ uint8_t MarlinUI::read_slow_buttons(void) { // Duration in ms, freq in Hz void MarlinUI::buzz(const long duration, const uint16_t freq) { if (!PanelDetected) return; + if (!buzzer_enabled) return; #if ENABLED(TFTGLCD_PANEL_SPI) WRITE(TFTGLCD_CS, LOW); SPI_SEND_ONE(BUZZER); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index e8b4769cc2..8bf4fa6b7e 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -659,6 +659,7 @@ namespace Language_en { PROGMEM Language_Str MSG_REHEATING = _UxGT("Reheating..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Probe Wizard"); + PROGMEM Language_Str MSG_SOUND = _UxGT("Sound"); } #if FAN_COUNT == 1 diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 0a87965721..1994e4094b 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -74,12 +74,17 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #endif #endif +#if ENABLED(SOUND_MENU_ITEM) + bool MarlinUI::buzzer_enabled = true; +#endif + #if EITHER(PCA9632_BUZZER, USE_BEEPER) #include "../libs/buzzer.h" // for BUZZ() macro #if ENABLED(PCA9632_BUZZER) #include "../feature/leds/pca9632.h" #endif void MarlinUI::buzz(const long duration, const uint16_t freq) { + if (!buzzer_enabled) return; #if ENABLED(PCA9632_BUZZER) PCA9632_buzz(duration, freq); #elif USE_BEEPER diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index bf9e47e0c8..d0b66aee45 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -292,6 +292,12 @@ public: TERN_(HAS_LCD_MENU, currentScreen = status_screen); } + #if ENABLED(SOUND_MENU_ITEM) + static bool buzzer_enabled; // Initialized by settings.load() + #else + static constexpr bool buzzer_enabled = true; + #endif + #if HAS_BUZZER static void buzz(const long duration, const uint16_t freq); #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 22947ee514..f667242bc1 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -45,6 +45,10 @@ #endif #endif +#if ENABLED(SOUND_MENU_ITEM) + #include "../../libs/buzzer.h" +#endif + #define HAS_DEBUG_MENU ENABLED(LCD_PROGRESS_BAR_TEST) void menu_advanced_settings(); @@ -412,6 +416,10 @@ void menu_configuration() { SUBMENU_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M_SETTINGS, _menu_configuration_preheat_settings); #endif + #if ENABLED(SOUND_MENU_ITEM) + EDIT_ITEM(bool, MSG_SOUND, &ui.buzzer_enabled, []{ ui.chirp(); }); + #endif + #if ENABLED(EEPROM_SETTINGS) ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); if (!busy) ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings); diff --git a/Marlin/src/libs/buzzer.cpp b/Marlin/src/libs/buzzer.cpp index 8459695359..57ed5fb419 100644 --- a/Marlin/src/libs/buzzer.cpp +++ b/Marlin/src/libs/buzzer.cpp @@ -26,6 +26,7 @@ #include "buzzer.h" #include "../module/temperature.h" +#include "../lcd/marlinui.h" #if ENABLED(EXTENSIBLE_UI) #include "../lcd/extui/ui_api.h" @@ -44,6 +45,7 @@ Buzzer buzzer; * @param frequency Frequency of the tone in hertz */ void Buzzer::tone(const uint16_t duration, const uint16_t frequency/*=0*/) { + if (!ui.buzzer_enabled) return; while (buffer.isFull()) { tick(); thermalManager.manage_heater(); @@ -53,6 +55,7 @@ void Buzzer::tone(const uint16_t duration, const uint16_t frequency/*=0*/) { } void Buzzer::tick() { + if (!ui.buzzer_enabled) return; const millis_t now = millis(); if (!state.endtime) { @@ -62,12 +65,11 @@ void Buzzer::tick() { state.endtime = now + state.tone.duration; if (state.tone.frequency > 0) { - #if ENABLED(EXTENSIBLE_UI) + #if ENABLED(EXTENSIBLE_UI) && DISABLED(EXTUI_LOCAL_BEEPER) CRITICAL_SECTION_START(); ExtUI::onPlayTone(state.tone.frequency, state.tone.duration); CRITICAL_SECTION_END(); - #endif - #if ENABLED(SPEAKER) && (DISABLED(EXTENSIBLE_UI) || ENABLED(EXTUI_LOCAL_BEEPER)) + #elif ENABLED(SPEAKER) CRITICAL_SECTION_START(); ::tone(BEEPER_PIN, state.tone.frequency, state.tone.duration); CRITICAL_SECTION_END(); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d01486a80d..5c646c85dd 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -153,6 +153,10 @@ #include "../feature/ethernet.h" #endif +#if ENABLED(SOUND_MENU_ITEM) + #include "../libs/buzzer.h" +#endif + #pragma pack(push, 1) // No padding between variables #if HAS_ETHERNET @@ -451,6 +455,12 @@ typedef struct SettingsDataStruct { ethernet_subnet; // M554 P #endif + // + // Buzzer enable/disable + // + #if ENABLED(SOUND_MENU_ITEM) + bool buzzer_enabled; + #endif } SettingsData; //static_assert(sizeof(SettingsData) <= MARLIN_EEPROM_SIZE, "EEPROM too small to contain SettingsData!"); @@ -1422,6 +1432,13 @@ void MarlinSettings::postprocess() { } #endif + // + // Buzzer enable/disable + // + #if ENABLED(SOUND_MENU_ITEM) + EEPROM_WRITE(ui.buzzer_enabled); + #endif + // // Report final CRC and Data Size // @@ -2293,6 +2310,14 @@ void MarlinSettings::postprocess() { EEPROM_READ(ethernet_subnet); ethernet.subnet = ethernet_subnet; #endif + // + // Buzzer enable/disable + // + #if ENABLED(SOUND_MENU_ITEM) + _FIELD_TEST(buzzer_enabled); + EEPROM_READ(ui.buzzer_enabled); + #endif + // // Validate Final Size and CRC // @@ -2603,6 +2628,11 @@ void MarlinSettings::reset() { // TERN_(TOUCH_SCREEN_CALIBRATION, touch.calibration_reset()); + // + // Buzzer enable/disable + // + TERN_(SOUND_MENU_ITEM, ui.buzzer_enabled = true); + // // Magnetic Parking Extruder // diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests index 2f206f02f2..7877b60721 100755 --- a/buildroot/tests/LPC1768-tests +++ b/buildroot/tests/LPC1768-tests @@ -38,7 +38,7 @@ opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 -1 opt_set TEMP_SENSOR_BED 5 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ - FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING \ + FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING SOUND_MENU_ITEM \ NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index d3fd5c0192..a6902b9d14 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -27,7 +27,7 @@ opt_set TEMP_SENSOR_4 1000 opt_set TEMP_SENSOR_BED 1 opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ - SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS \ + SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ @@ -82,7 +82,7 @@ restore_configs opt_set MOTHERBOARD BOARD_MEGACONTROLLER opt_set LCD_LANGUAGE de opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT \ - MINIPANEL SDSUPPORT PCA9632 LCD_INFO_MENU \ + MINIPANEL SDSUPPORT PCA9632 LCD_INFO_MENU SOUND_MENU_ITEM \ AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT EXPERIMENTAL_I2CBUS M100_FREE_MEMORY_WATCHER \ diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests index 20a0c19726..39ee4faf49 100755 --- a/buildroot/tests/teensy35-tests +++ b/buildroot/tests/teensy35-tests @@ -20,7 +20,7 @@ opt_set TEMP_SENSOR_0 1 opt_set TEMP_SENSOR_1 5 opt_set TEMP_SENSOR_BED 1 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ - FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ + FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE SOUND_MENU_ITEM \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER \ From f5f6170858258e2ba5b46b4e9b3ec2fa07fab9f3 Mon Sep 17 00:00:00 2001 From: Orel <37673727+0r31@users.noreply.github.com> Date: Wed, 28 Oct 2020 03:37:10 +0100 Subject: [PATCH 0471/1370] Fix DAC-related bugs (#19921) Co-authored-by: Scott Lahteine --- Marlin/src/feature/dac/dac_mcp4728.cpp | 2 +- Marlin/src/gcode/calibrate/G34.cpp | 4 ++-- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/module/settings.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index 81c465cf29..c7a6370e17 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -124,7 +124,7 @@ uint8_t MCP4728::getDrvPct(const uint8_t channel) { return uint8_t(100.0 * dac_v * DAC Values array and calls fastwrite to update the DAC. */ void MCP4728::setDrvPct(xyze_uint8_t &pct) { - dac_values *= 0.01 * pct * (DAC_STEPPER_MAX); + dac_values *= pct.asFloat() * 0.01f * (DAC_STEPPER_MAX); fastWrite(); } diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index 0ca4490eb6..315b2d7333 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -80,7 +80,7 @@ void GcodeSuite::G34() { const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; stepper.set_digipot_current(1, target_current); - #elif HAS_MOTOR_CURRENT_DAC + #elif ENABLED(HAS_MOTOR_CURRENT_DAC) const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT); const float previous_current = dac_amps(Z_AXIS, target_current); stepper_dac.set_current_value(Z_AXIS, target_current); @@ -126,7 +126,7 @@ void GcodeSuite::G34() { stepper.set_digipot_current(Z_AXIS, previous_current); #elif HAS_MOTOR_CURRENT_PWM stepper.set_digipot_current(1, previous_current); - #elif HAS_MOTOR_CURRENT_DAC + #elif ENABLED(HAS_MOTOR_CURRENT_DAC) stepper_dac.set_current_value(Z_AXIS, previous_current); #elif ENABLED(HAS_MOTOR_CURRENT_I2C) digipot_i2c.set_current(Z_AXIS, previous_current) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 642d9d84d9..0e207ffc55 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -72,7 +72,7 @@ void menu_backlash(); EDIT_DAC_PERCENT(Y); EDIT_DAC_PERCENT(Z); EDIT_DAC_PERCENT(E); - ACTION_ITEM(MSG_DAC_EEPROM_WRITE, dac_commit_eeprom); + ACTION_ITEM(MSG_DAC_EEPROM_WRITE, stepper_dac.commit_eeprom); END_MENU(); } diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 5c646c85dd..2ae4be5f49 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3821,7 +3821,7 @@ void MarlinSettings::reset() { #elif HAS_MOTOR_CURRENT_I2C // i2c-based has any number of values // Values sent over i2c are not stored. // Indexes map directly to drivers, not axes. - #elif HAS_MOTOR_CURRENT_DAC // DAC-based has 4 values, for X Y Z E + #elif ENABLED(HAS_MOTOR_CURRENT_DAC) // DAC-based has 4 values, for X Y Z E // Values sent over i2c are not stored. Uses indirect mapping. #endif From 2a4cdf5a5dba07d7297b0ec61d418d9f19fff20b Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 27 Oct 2020 19:40:12 -0700 Subject: [PATCH 0472/1370] Fix LCD menus + DAC (#19907) --- Marlin/src/module/settings.cpp | 6 +++--- buildroot/tests/at90usb1286_dfu-tests | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 2ae4be5f49..fc432b7e9b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3800,7 +3800,7 @@ void MarlinSettings::reset() { #endif #endif - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + #if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM) CONFIG_ECHO_HEADING("Stepper motor currents:"); CONFIG_ECHO_START(); #if HAS_MOTOR_CURRENT_PWM @@ -3818,10 +3818,10 @@ void MarlinSettings::reset() { SERIAL_CHAR(' ', 'B'); // B (maps to E1 by default) SERIAL_ECHOLN(stepper.motor_current_setting[4]); #endif - #elif HAS_MOTOR_CURRENT_I2C // i2c-based has any number of values + #elif ENABLED(HAS_MOTOR_CURRENT_I2C) // i2c-based has any number of values // Values sent over i2c are not stored. // Indexes map directly to drivers, not axes. - #elif ENABLED(HAS_MOTOR_CURRENT_DAC) // DAC-based has 4 values, for X Y Z E + #elif ENABLED(HAS_MOTOR_CURRENT_DAC) // DAC-based has 4 values, for X Y Z E // Values sent over i2c are not stored. Uses indirect mapping. #endif diff --git a/buildroot/tests/at90usb1286_dfu-tests b/buildroot/tests/at90usb1286_dfu-tests index 7571994ec4..a9b7e2bbb0 100644 --- a/buildroot/tests/at90usb1286_dfu-tests +++ b/buildroot/tests/at90usb1286_dfu-tests @@ -11,7 +11,12 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_PRINTRBOARD -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "Printrboard Configuration" + +restore_configs +opt_set MOTHERBOARD BOARD_PRINTRBOARD_REVF +opt_enable MINIPANEL +exec_test $1 $2 "Printrboard RevF with MiniPanel and Stepper DAC (in pins file)" # clean up restore_configs From d08511c5dc0ec8a7377cb456588f2caa9a99bacd Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 27 Oct 2020 23:54:30 -0300 Subject: [PATCH 0473/1370] Color UI circular task queue (#19918) --- Marlin/src/lcd/tft/tft_queue.cpp | 52 ++++++++++++++++++-------------- Marlin/src/lcd/tft/tft_queue.h | 7 +++++ 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp index e178a59a2d..43628706a9 100644 --- a/Marlin/src/lcd/tft/tft_queue.cpp +++ b/Marlin/src/lcd/tft/tft_queue.cpp @@ -32,6 +32,7 @@ uint8_t TFT_Queue::queue[]; uint8_t *TFT_Queue::end_of_queue = queue; uint8_t *TFT_Queue::current_task = nullptr; uint8_t *TFT_Queue::last_task = nullptr; +uint8_t *TFT_Queue::last_parameter = nullptr; void TFT_Queue::reset() { tft.abort(); @@ -39,6 +40,7 @@ void TFT_Queue::reset() { end_of_queue = queue; current_task = nullptr; last_task = nullptr; + last_parameter = nullptr; } void TFT_Queue::async() { @@ -113,49 +115,28 @@ void TFT_Queue::canvas(queueTask_t *task) { switch (*item) { case CANVAS_SET_BACKGROUND: Canvas.SetBackground(((parametersCanvasBackground_t *)item)->color); - item += sizeof(parametersCanvasBackground_t); break; case CANVAS_ADD_TEXT: Canvas.AddText(((parametersCanvasText_t *)item)->x, ((parametersCanvasText_t *)item)->y, ((parametersCanvasText_t *)item)->color, item + sizeof(parametersCanvasText_t), ((parametersCanvasText_t *)item)->maxWidth); - item += sizeof(parametersCanvasText_t) + ((parametersCanvasText_t *)item)->stringLength; break; case CANVAS_ADD_IMAGE: MarlinImage image; uint16_t *colors; - colorMode_t color_mode; image = ((parametersCanvasImage_t *)item)->image; colors = (uint16_t *)(item + sizeof(parametersCanvasImage_t)); Canvas.AddImage(((parametersCanvasImage_t *)item)->x, ((parametersCanvasImage_t *)item)->y, image, colors); - - item = (uint8_t *)colors; - color_mode = Images[image].colorMode; - - switch (color_mode) { - case GREYSCALE1: - item += sizeof(uint16_t); - break; - case GREYSCALE2: - item += sizeof(uint16_t) * 3; - break; - case GREYSCALE4: - item += sizeof(uint16_t) * 15; - break; - default: - break; - } break; case CANVAS_ADD_BAR: Canvas.AddBar(((parametersCanvasBar_t *)item)->x, ((parametersCanvasBar_t *)item)->y, ((parametersCanvasBar_t *)item)->width, ((parametersCanvasBar_t *)item)->height, ((parametersCanvasBar_t *)item)->color); - item += sizeof(parametersCanvasBar_t); break; case CANVAS_ADD_RECTANGLE: Canvas.AddRectangle(((parametersCanvasRectangle_t *)item)->x, ((parametersCanvasRectangle_t *)item)->y, ((parametersCanvasRectangle_t *)item)->width, ((parametersCanvasRectangle_t *)item)->height, ((parametersCanvasRectangle_t *)item)->color); - item += sizeof(parametersCanvasRectangle_t); break; } + item = ((parametersCanvasBackground_t *)item)->nextParameter; } if (Canvas.ToScreen()) task->state = TASK_STATE_COMPLETED; @@ -172,6 +153,7 @@ void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, ui parametersFill_t *task_parameters = (parametersFill_t *)end_of_queue; end_of_queue += sizeof(parametersFill_t); + last_parameter = end_of_queue; task_parameters->x = x; task_parameters->y = y; task_parameters->width = width; @@ -201,6 +183,7 @@ void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) parametersCanvas_t *task_parameters = (parametersCanvas_t *)end_of_queue; end_of_queue += sizeof(parametersCanvas_t); + last_parameter = end_of_queue; task_parameters->x = x; task_parameters->y = y; task_parameters->width = width; @@ -211,19 +194,33 @@ void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) } void TFT_Queue::set_background(uint16_t color) { + handle_queue_overflow(sizeof(parametersCanvasBackground_t)); parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); parametersCanvasBackground_t *parameters = (parametersCanvasBackground_t *)end_of_queue; + last_parameter = end_of_queue; parameters->type = CANVAS_SET_BACKGROUND; parameters->color = color; end_of_queue += sizeof(parametersCanvasBackground_t); task_parameters->count++; + parameters->nextParameter = end_of_queue; +} + +#define QUEUE_SAFETY_FREE_SPACE 100 + +void TFT_Queue::handle_queue_overflow(uint16_t sizeNeeded) { + if (uintptr_t(end_of_queue) + sizeNeeded + (QUEUE_SAFETY_FREE_SPACE) - uintptr_t(queue) >= QUEUE_SIZE) { + end_of_queue = queue; + ((parametersCanvasText_t *)last_parameter)->nextParameter = end_of_queue; + } } void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth) { + handle_queue_overflow(sizeof(parametersCanvasText_t) + maxWidth); parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); parametersCanvasText_t *parameters = (parametersCanvasText_t *)end_of_queue; + last_parameter = end_of_queue; uint8_t *pointer = string; @@ -239,13 +236,16 @@ void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string /* TODO: Deal with maxWidth */ while ((*(end_of_queue++) = *pointer++) != 0x00); + parameters->nextParameter = end_of_queue; parameters->stringLength = pointer - string; task_parameters->count++; } void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { + handle_queue_overflow(sizeof(parametersCanvasImage_t)); parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); parametersCanvasImage_t *parameters = (parametersCanvasImage_t *)end_of_queue; + last_parameter = end_of_queue; parameters->type = CANVAS_ADD_IMAGE; parameters->x = x; @@ -254,6 +254,7 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *col end_of_queue += sizeof(parametersCanvasImage_t); task_parameters->count++; + parameters->nextParameter = end_of_queue; colorMode_t color_mode = Images[image].colorMode; @@ -275,6 +276,7 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *col } end_of_queue = (uint8_t *)color; + parameters->nextParameter = end_of_queue; } uint16_t gradient(uint16_t colorA, uint16_t colorB, uint16_t factor) { @@ -314,8 +316,10 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t colo } void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { + handle_queue_overflow(sizeof(parametersCanvasBar_t)); parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); parametersCanvasBar_t *parameters = (parametersCanvasBar_t *)end_of_queue; + last_parameter = end_of_queue; parameters->type = CANVAS_ADD_BAR; parameters->x = x; @@ -326,11 +330,14 @@ void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, end_of_queue += sizeof(parametersCanvasBar_t); task_parameters->count++; + parameters->nextParameter = end_of_queue; } void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { + handle_queue_overflow(sizeof(parametersCanvasRectangle_t)); parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); parametersCanvasRectangle_t *parameters = (parametersCanvasRectangle_t *)end_of_queue; + last_parameter = end_of_queue; parameters->type = CANVAS_ADD_RECTANGLE; parameters->x = x; @@ -341,6 +348,7 @@ void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t h end_of_queue += sizeof(parametersCanvasRectangle_t); task_parameters->count++; + parameters->nextParameter = end_of_queue; } #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_queue.h b/Marlin/src/lcd/tft/tft_queue.h index 9aa0d5b6c9..6cb3caf4a2 100644 --- a/Marlin/src/lcd/tft/tft_queue.h +++ b/Marlin/src/lcd/tft/tft_queue.h @@ -73,11 +73,13 @@ typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) { CanvasSubtype type; + uint8_t *nextParameter; uint16_t color; } parametersCanvasBackground_t; typedef struct __attribute__((__packed__)) { CanvasSubtype type; + uint8_t *nextParameter; uint16_t x; uint16_t y; uint16_t color; @@ -88,6 +90,7 @@ typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) { CanvasSubtype type; + uint8_t *nextParameter; int16_t x; int16_t y; MarlinImage image; @@ -95,6 +98,7 @@ typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) { CanvasSubtype type; + uint8_t *nextParameter; uint16_t x; uint16_t y; uint16_t width; @@ -104,6 +108,7 @@ typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) { CanvasSubtype type; + uint8_t *nextParameter; uint16_t x; uint16_t y; uint16_t width; @@ -117,10 +122,12 @@ class TFT_Queue { static uint8_t *end_of_queue; static uint8_t *current_task; static uint8_t *last_task; + static uint8_t *last_parameter; static void finish_sketch(); static void fill(queueTask_t *task); static void canvas(queueTask_t *task); + static void handle_queue_overflow(uint16_t sizeNeeded); public: static void reset(); From fa0614516a51d06bfddbc9c3a142a67fe16d74e5 Mon Sep 17 00:00:00 2001 From: Gurmeet Athwal Date: Wed, 28 Oct 2020 08:25:49 +0530 Subject: [PATCH 0474/1370] Update ExtUI path in config comment (#19908) --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 5ec41c596b..054e90d8d9 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2196,7 +2196,7 @@ // // Third-party or vendor-customized controller interfaces. -// Sources should be installed in 'src/lcd/extensible_ui'. +// Sources should be installed in 'src/lcd/extui'. // //#define EXTENSIBLE_UI From 2bb94b4329aba90bec065d8e299b95a132abd9dc Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 28 Oct 2020 15:57:32 +1300 Subject: [PATCH 0475/1370] AZTEEG X5 mini LED pins (#19909) --- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index ad792447ea..6fddc16224 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -38,6 +38,9 @@ // LED // #define LED_PIN P1_18 +#define LED2_PIN P1_20 +#define LED3_PIN P1_19 +#define LED4_PIN P1_21 // // Servos @@ -79,14 +82,13 @@ #define E0_ENABLE_PIN P0_04 // -// DIGIPOT slave addresses +// DIGIPOT slave addresses (7-bit unshifted) // #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_A 0x2C #endif - #ifndef DIGIPOT_I2C_ADDRESS_B - #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2E #endif // From d6e93bb9c7ffdfd791676a2fc83a7fce16d2ac7b Mon Sep 17 00:00:00 2001 From: Alexander Fomichev Date: Wed, 28 Oct 2020 05:59:22 +0300 Subject: [PATCH 0476/1370] Generalize BTT SKR E3-DIP version (#19910) --- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 63b97b666f..c151b44bb7 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -25,7 +25,7 @@ #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif -#define BOARD_INFO_NAME "BTT SKR E3 DIP V1.0" +#define BOARD_INFO_NAME "BTT SKR E3 DIP V1.x" // Release PB3/PB4 (TMC_SW Pins) from JTAG pins #define DISABLE_JTAG From 0c81d86cd4a9d5f056b1b2e72c2af0e6d62d9d9f Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 29 Oct 2020 01:45:10 -0300 Subject: [PATCH 0477/1370] Permit spaces in dependencies g++ path (#19929) --- buildroot/share/PlatformIO/scripts/common-dependencies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index b9cefeab7c..f3bc2b9b02 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -234,7 +234,7 @@ def load_marlin_features(): build_flags = env.ParseFlagsExtended(build_flags) cxx = search_compiler() - cmd = [cxx] + cmd = ['"' + cxx + '"'] # Build flags from board.json #if 'BOARD' in env: From b590cee35a61452aab9bf6fda10900e6aca165a5 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 29 Oct 2020 01:47:12 -0300 Subject: [PATCH 0478/1370] Keep SPI active on LPC176x (#19932) --- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index b3d2908ac9..cb0d54c003 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -263,8 +263,9 @@ uint16_t SPIClass::transfer16(const uint16_t data) { } void SPIClass::end() { - // SSP_Cmd(_currentSetting->spi_d, DISABLE); // stop device or SSP_DeInit? - SSP_DeInit(_currentSetting->spi_d); + // Neither is needed for Marlin + //SSP_Cmd(_currentSetting->spi_d, DISABLE); + //SSP_DeInit(_currentSetting->spi_d); } void SPIClass::send(uint8_t data) { From 67fbee389ed08bd2c46ce1fe93e1477202c04121 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 29 Oct 2020 00:14:55 -0500 Subject: [PATCH 0479/1370] Add a note about substitution chars --- Marlin/src/lcd/language/language_en.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 8bf4fa6b7e..42954d79e5 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -26,6 +26,13 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html + * + * Substitutions are applied for the following characters when used + * in menu items that call lcd_put_u8str_ind_P with an index: + * + * = displays '0'....'10' for indexes 0 - 10 + * ~ displays '1'....'11' for indexes 0 - 10 + * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) */ #define en 1234 From 59914df5b7a5cd63c7445a9897cda5ad3872649c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 29 Oct 2020 00:48:50 -0500 Subject: [PATCH 0480/1370] Fix comments, spacing --- Marlin/src/HAL/LINUX/pinsDebug.h | 12 ++++++------ Marlin/src/HAL/shared/backtrace/unwarm.cpp | 2 +- Marlin/src/HAL/shared/backtrace/unwarm.h | 2 +- Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp | 2 +- Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp | 2 +- Marlin/src/HAL/shared/backtrace/unwarmbytab.h | 2 +- Marlin/src/HAL/shared/backtrace/unwarmmem.cpp | 2 +- Marlin/src/HAL/shared/backtrace/unwarmmem.h | 2 +- Marlin/src/HAL/shared/backtrace/unwinder.cpp | 2 +- Marlin/src/HAL/shared/backtrace/unwinder.h | 2 +- Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp | 2 +- Marlin/src/HAL/shared/backtrace/unwmemaccess.h | 2 +- .../share/sublime/MarlinFirmware.sublime-project | 2 +- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Marlin/src/HAL/LINUX/pinsDebug.h b/Marlin/src/HAL/LINUX/pinsDebug.h index a93ceddc61..8f8543ef59 100644 --- a/Marlin/src/HAL/LINUX/pinsDebug.h +++ b/Marlin/src/HAL/LINUX/pinsDebug.h @@ -26,15 +26,15 @@ */ #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define pwm_details(pin) pin = pin // do nothing // print PWM details -#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. -#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) +#define pwm_details(pin) NOOP // (do nothing) +#define pwm_status(pin) false // Print a pin's PWM status. Return true if it's currently a PWM pin. +#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) #define digitalRead_mod(p) digitalRead(p) #define PRINT_PORT(p) -#define GET_ARRAY_PIN(p) pin_array[p].pin +#define GET_ARRAY_PIN(p) pin_array[p].pin #define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) -#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin // active ADC function/mode/code values for PINSEL registers constexpr int8_t ADC_pin_mode(pin_t pin) { diff --git a/Marlin/src/HAL/shared/backtrace/unwarm.cpp b/Marlin/src/HAL/shared/backtrace/unwarm.cpp index cdc9c06c61..adbcca69cc 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarm.cpp @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commercially or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liability for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Utility functions and glue for ARM unwinding sub-modules. **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwarm.h b/Marlin/src/HAL/shared/backtrace/unwarm.h index 3128e354cc..86dc98c073 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm.h +++ b/Marlin/src/HAL/shared/backtrace/unwarm.h @@ -6,7 +6,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commerically or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liablity for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Internal interface between the ARM unwinding sub-modules. **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp index 0ec9bd56af..59734bfbfe 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commercially or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liability for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Abstract interpreter for ARM mode. **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp index 26ca8b2604..be4abd090f 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commercially or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liability for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Abstract interpretation for Thumb mode. **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.h b/Marlin/src/HAL/shared/backtrace/unwarmbytab.h index 77a1c82dbd..e2f80db2a5 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmbytab.h +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.h @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commerically or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liablity for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Interface to the memory tracking sub-system. **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp b/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp index cf9ac414c4..a40d8540ec 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commerically or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liablity for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Implementation of the memory tracking sub-system. **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwarmmem.h b/Marlin/src/HAL/shared/backtrace/unwarmmem.h index 588618b34f..1340bbdf0a 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmmem.h +++ b/Marlin/src/HAL/shared/backtrace/unwarmmem.h @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commerically or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liablity for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Interface to the memory tracking sub-system. **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwinder.cpp b/Marlin/src/HAL/shared/backtrace/unwinder.cpp index e63af1ed25..0f88e2a7f7 100644 --- a/Marlin/src/HAL/shared/backtrace/unwinder.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwinder.cpp @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commercially or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liability for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Implementation of the interface into the ARM unwinder. **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwinder.h b/Marlin/src/HAL/shared/backtrace/unwinder.h index cae1379513..157808d540 100644 --- a/Marlin/src/HAL/shared/backtrace/unwinder.h +++ b/Marlin/src/HAL/shared/backtrace/unwinder.h @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commerically or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liablity for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. **************************************************************************/ /** \file * Interface to the ARM stack unwinding module. diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index c93494d485..e749530645 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commercially or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liability for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Utility functions to access memory **************************************************************************/ diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.h b/Marlin/src/HAL/shared/backtrace/unwmemaccess.h index fe42bd9485..562ab3f05d 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.h +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.h @@ -7,7 +7,7 @@ * for free and use it as they wish, with or without modifications, and in * any context, commerically or otherwise. The only limitation is that I * don't guarantee that the software is fit for any purpose or accept any - * liablity for it's use or misuse - this software is without warranty. + * liability for its use or misuse - this software is without warranty. *************************************************************************** * File Description: Utility functions to access memory **************************************************************************/ diff --git a/buildroot/share/sublime/MarlinFirmware.sublime-project b/buildroot/share/sublime/MarlinFirmware.sublime-project index 9b5234f7a1..1e9275f646 100644 --- a/buildroot/share/sublime/MarlinFirmware.sublime-project +++ b/buildroot/share/sublime/MarlinFirmware.sublime-project @@ -11,7 +11,7 @@ ".vscode" ], "binary_file_patterns": - [ "*.psd", "*.png", "*.jpg", "*.jpeg", "*.bdf", "*.patch", "avrdude_5.*", "*.svg" ], + [ "*.psd", "*.png", "*.jpg", "*.jpeg", "*.bdf", "*.patch", "avrdude_5.*", "*.svg", "*.bin", "*.woff" ], "file_exclude_patterns": [ "Marlin/platformio.ini", From e6092ad1463d0131a0fedf00d1cff7f568f84eb3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 29 Oct 2020 00:49:03 -0500 Subject: [PATCH 0481/1370] .bin and .woff are binary --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index 2588229e05..83897cba6e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,3 +17,5 @@ *.png binary *.jpg binary *.fon binary +*.bin binary +*.woff binary From 88e88743b9d9f79da8f5b758a2ac140ee3ad3291 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 29 Oct 2020 02:52:50 -0300 Subject: [PATCH 0482/1370] Color UI for MKS SGen-L V2 (#19919) --- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 52 +++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 1a558075b6..0719752399 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -251,7 +251,7 @@ * _____ _____ * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) - * (LCD_D4) 0.15 | · ·| 0.17 (LCD_D5) (BTN_EN2) 3.26 | · ·| 0.9 (SD_MOSI) + * (LCD_D4) 0.15 | · · | 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · | 0.9 (SD_MOSI) * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST * GND | · · | 5V GND | · · | NC * ----- ----- @@ -299,6 +299,56 @@ #define LCD_PINS_D7 P1_22 #define KILL_PIN -1 // NC + #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI + #define TFT_CS_PIN P1_00 + #define TFT_A0_PIN P1_22 + #define TFT_DC_PIN P1_22 + #define TFT_MISO_PIN P0_08 + #define TFT_BACKLIGHT_PIN P0_18 + #define TFT_RESET_PIN P0_16 + + #define LCD_USE_DMA_SPI + + #define TOUCH_INT_PIN P0_17 + #define TOUCH_CS_PIN P0_15 + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 + + // Disable any LCD related PINs config + #define LCD_PINS_ENABLE -1 + #define LCD_PINS_RS -1 + + // XPT2046 Touch Screen calibration + #if ENABLED(TFT_CLASSIC_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11386 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8684 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 689 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -273 + #endif + #elif ENABLED(TFT_COLOR_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17089 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11424 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 1044 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -365 + #endif + + #define TFT_BUFFER_SIZE 2400 + #endif + #else // !MKS_12864OLED_SSD1306 #define LCD_PINS_RS P0_16 From 3cb7128116626794ab69985c2f5639b2bfe73542 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 29 Oct 2020 01:14:02 -0500 Subject: [PATCH 0483/1370] Tweak code formatting --- Marlin/src/module/temperature.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 3468a4c1c5..d119a72a64 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1233,9 +1233,9 @@ void Temperature::manage_heater() { #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER_VENT #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 #endif - if( (temp_chamber.celsius - temp_chamber.target >= HIGH_EXCESS_HEAT_LIMIT) && !flag_chamber_excess_heat) { - // open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds - // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT + if (!flag_chamber_excess_heat && temp_chamber.celsius - temp_chamber.target >= HIGH_EXCESS_HEAT_LIMIT) { + // Open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds if the + // temperature didn't drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) { if (old_temp - temp_chamber.celsius < float(MIN_COOLING_SLOPE_DEG_CHAMBER_VENT)) flag_chamber_excess_heat = true; //the bed is heating the chamber too much next_cool_check_ms_2 = ms + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER_VENT; From 176cb29eabaf11cc3f96e16cb70043be2dd3b7e6 Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Wed, 28 Oct 2020 11:23:46 -0600 Subject: [PATCH 0484/1370] Improvement and fixes to FTDI touch UI - Fixed incorrect LCD text string - Fixed incorrect refresh of filament change screens - Allow host control via touch UI - Updates to leveling menu - Modified ExtUI::isPrinting() to check if the job timer is running - Added ExtUI method to check whether a host print is paused --- .../ftdi_eve_touch_ui/language/language_en.h | 2 +- .../screens/change_filament_screen.cpp | 1 + .../confirm_abort_print_dialog_box.cpp | 8 +- .../screens/leveling_menu.cpp | 73 +++++++++---------- .../lib/ftdi_eve_touch_ui/screens/screens.h | 3 + .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 55 ++++++++++---- Marlin/src/lcd/extui/ui_api.cpp | 6 +- Marlin/src/lcd/extui/ui_api.h | 1 + 8 files changed, 90 insertions(+), 59 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index cc96c8b9cd..ce60ab5090 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -119,7 +119,7 @@ namespace Language_en { PROGMEM Language_Str MSG_CAUTION = u8"Caution:"; PROGMEM Language_Str MSG_HOT = u8"Hot!"; PROGMEM Language_Str MSG_UNLOAD_FILAMENT = u8"Unload/Retract"; - PROGMEM Language_Str MSG_LOAD_FILAMENT = u8"Load/Extruder"; + PROGMEM Language_Str MSG_LOAD_FILAMENT = u8"Load/Extrude"; PROGMEM Language_Str MSG_MOMENTARY = u8"Momentary"; PROGMEM Language_Str MSG_CONTINUOUS = u8"Continuous"; PROGMEM Language_Str MSG_PLEASE_WAIT = u8"Please wait..."; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index 589da9b210..60394d06df 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -84,6 +84,7 @@ void ChangeFilamentScreen::drawTempGradient(uint16_t x, uint16_t y, uint16_t w, } void ChangeFilamentScreen::onEntry() { + BaseScreen::onEntry(); screen_data.ChangeFilamentScreen.e_tag = ExtUI::getActiveTool() + 10; screen_data.ChangeFilamentScreen.t_tag = 0; screen_data.ChangeFilamentScreen.repeat_tag = 0; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp index e23592a46e..eb3e2a3e01 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp @@ -26,6 +26,8 @@ #include "screens.h" +#include "../../../../../feature/host_actions.h" + using namespace ExtUI; void ConfirmAbortPrintDialogBox::onRedraw(draw_mode_t) { @@ -37,7 +39,11 @@ bool ConfirmAbortPrintDialogBox::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); - stopPrint(); + if (ExtUI::isPrintingFromMedia()) + ExtUI::stopPrint(); + #ifdef ACTION_ON_CANCEL + else host_action_cancel(); + #endif return true; default: return DialogBoxBaseClass::onTouchEnd(tag); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index 763403d287..a91d48c037 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -35,29 +35,27 @@ using namespace ExtUI; using namespace Theme; #ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 10 + #define GRID_ROWS 9 #define GRID_COLS 2 #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define Z_AUTO_ALIGN_POS BTN_POS(1,4), BTN_SIZE(2,1) - #define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(2,1) - #define BLTOUCH_TITLE_POS BTN_POS(1,7), BTN_SIZE(2,1) - #define BLTOUCH_RESET_POS BTN_POS(1,8), BTN_SIZE(1,1) - #define BLTOUCH_TEST_POS BTN_POS(2,8), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,10), BTN_SIZE(2,1) -#else - #define GRID_ROWS 8 - #define GRID_COLS 2 - #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define Z_AUTO_ALIGN_POS BTN_POS(1,4), BTN_SIZE(2,1) - #define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define LEVEL_AXIS_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LEVEL_BED_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define SHOW_MESH_POS BTN_POS(1,4), BTN_SIZE(2,1) #define BLTOUCH_TITLE_POS BTN_POS(1,6), BTN_SIZE(2,1) #define BLTOUCH_RESET_POS BTN_POS(1,7), BTN_SIZE(1,1) #define BLTOUCH_TEST_POS BTN_POS(2,7), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) +#else + #define GRID_ROWS 7 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define LEVEL_AXIS_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LEVEL_BED_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define SHOW_MESH_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define BLTOUCH_TITLE_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define BLTOUCH_RESET_POS BTN_POS(1,6), BTN_SIZE(1,1) + #define BLTOUCH_TEST_POS BTN_POS(2,6), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,7), BTN_SIZE(2,1) #endif void LevelingMenu::onRedraw(draw_mode_t what) { @@ -73,21 +71,16 @@ void LevelingMenu::onRedraw(draw_mode_t what) { cmd.font(font_large) .text(TITLE_POS, GET_TEXT_F(MSG_LEVELING)) .font(font_medium).colors(normal_btn) - .tag(2).button(LEVEL_BED_POS, GET_TEXT_F(MSG_LEVEL_BED)) - .enabled( - #ifdef AXIS_LEVELING_COMMANDS - 1 - #endif - ) - .tag(3).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) - .enabled(ENABLED(Z_STEPPER_AUTO_ALIGN)) - .tag(4).button(Z_AUTO_ALIGN_POS, GET_TEXT_F(MSG_AUTO_Z_ALIGN)) + #if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION) + .tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) + #endif + .tag(3).button(LEVEL_BED_POS, GET_TEXT_F(MSG_LEVEL_BED)) .enabled(ENABLED(HAS_MESH)) - .tag(5).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)); + .tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)); #if ENABLED(BLTOUCH) cmd.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) - .tag(6).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) - .tag(7).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)); + .tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) + .tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)); #endif cmd.colors(action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); @@ -97,25 +90,25 @@ void LevelingMenu::onRedraw(draw_mode_t what) { bool LevelingMenu::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); break; - case 2: + #if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION) + case 2: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break; + #endif + case 3: + #ifndef BED_LEVELING_COMMANDS + #define BED_LEVELING_COMMANDS "G29" + #endif #if HAS_MESH BedMeshScreen::startMeshProbe(); #else SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); #endif break; - #ifdef AXIS_LEVELING_COMMANDS - case 3: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS)); break; - #endif - #if ENABLED(Z_STEPPER_AUTO_ALIGN) - case 4: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break; - #endif #if HAS_MESH - case 5: GOTO_SCREEN(BedMeshScreen); break; + case 4: GOTO_SCREEN(BedMeshScreen); break; #endif #if ENABLED(BLTOUCH) - case 6: injectCommands_P(PSTR("M280 P0 S60")); break; - case 7: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; + case 5: injectCommands_P(PSTR("M280 P0 S60")); break; + case 6: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; #endif default: return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 2108cff8df..71fc7d9ee3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -365,6 +365,9 @@ class MainMenu : public BaseScreen, public CachedScreen { }; class TuneMenu : public BaseScreen, public CachedScreen { + private: + static void pausePrint(); + static void resumePrint(); public: static void onRedraw(draw_mode_t); static bool onTouchEnd(uint8_t tag); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index 9fe2f1e9cb..258ee4b04f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -26,6 +26,8 @@ #include "screens.h" +#include "../../../../../feature/host_actions.h" + using namespace FTDI; using namespace Theme; @@ -63,23 +65,24 @@ void TuneMenu::onRedraw(draw_mode_t what) { #endif if (what & FOREGROUND) { - using namespace ExtUI; + const bool sdOrHostPrinting = ExtUI::isPrinting(); + const bool sdOrHostPaused = ExtUI::isPrintingPaused(); CommandProcessor cmd; cmd.colors(normal_btn) .font(font_medium) .tag(2).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) - .enabled(!isPrinting() || isPrintingFromMediaPaused()) + .enabled(!sdOrHostPrinting || sdOrHostPaused) .tag(3).button( FIL_CHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) .tag(9).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) .enabled(EITHER(HAS_BED_PROBE, BABYSTEPPING)) .tag(4).button( NUDGE_NOZ_POS, GET_TEXT_F(TERN(BABYSTEPPING, MSG_NUDGE_NOZZLE, MSG_ZPROBE_ZOFFSET))) .tag(5).button( SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) - .tag(isPrintingFromMediaPaused() ? 7 : 6) - .enabled(TERN0(SDSUPPORT, isPrintingFromMedia())) - .button( PAUSE_POS, isPrintingFromMediaPaused() ? GET_TEXT_F(MSG_RESUME_PRINT) : GET_TEXT_F(MSG_PAUSE_PRINT)) - .enabled(TERN0(SDSUPPORT, isPrintingFromMedia())) + .enabled(sdOrHostPrinting) + .tag(sdOrHostPaused ? 7 : 6) + .button( PAUSE_POS, sdOrHostPaused ? GET_TEXT_F(MSG_RESUME_PRINT) : GET_TEXT_F(MSG_PAUSE_PRINT)) + .enabled(sdOrHostPrinting) .tag(8).button( STOP_POS, GET_TEXT_F(MSG_STOP_PRINT)) .enabled(ENABLED(CASE_LIGHT_ENABLE)) .tag(10).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) @@ -94,26 +97,26 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { using namespace Theme; using namespace ExtUI; switch (tag) { - case 1: GOTO_PREVIOUS(); break; - case 2: GOTO_SCREEN(TemperatureScreen); break; - case 3: GOTO_SCREEN(ChangeFilamentScreen); break; - case 4: + case 1: GOTO_PREVIOUS(); break; + case 2: GOTO_SCREEN(TemperatureScreen); break; + case 3: GOTO_SCREEN(ChangeFilamentScreen); break; + case 4: #if ENABLED(BABYSTEPPING) GOTO_SCREEN(NudgeNozzleScreen); #elif HAS_BED_PROBE GOTO_SCREEN(ZOffsetScreen); #endif break; - case 5: GOTO_SCREEN(FeedratePercentScreen); break; - case 6: sound.play(twinkle, PLAY_ASYNCHRONOUS); ExtUI::pausePrint(); GOTO_SCREEN(StatusScreen); break; - case 7: sound.play(twinkle, PLAY_ASYNCHRONOUS); ExtUI::resumePrint(); GOTO_SCREEN(StatusScreen); break; - case 8: + case 5: GOTO_SCREEN(FeedratePercentScreen); break; + case 6: pausePrint(); break; + case 7: resumePrint(); break; + case 8: GOTO_SCREEN(ConfirmAbortPrintDialogBox); current_screen.forget(); PUSH_SCREEN(StatusScreen); break; #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - case 9: GOTO_SCREEN(FilamentMenu); break; + case 9: GOTO_SCREEN(FilamentMenu); break; #endif #if ENABLED(CASE_LIGHT_ENABLE) case 10: GOTO_SCREEN(CaseLightScreen); break; @@ -124,4 +127,24 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +void TuneMenu::pausePrint() { + sound.play(twinkle, PLAY_ASYNCHRONOUS); + if (ExtUI::isPrintingFromMedia()) + ExtUI::pausePrint(); + #ifdef ACTION_ON_PAUSE + else host_action_pause(); + #endif + GOTO_SCREEN(StatusScreen); +} + +void TuneMenu::resumePrint() { + sound.play(twinkle, PLAY_ASYNCHRONOUS); + if (ExtUI::isPrintingFromMedia()) + ExtUI::resumePrint(); + #ifdef ACTION_ON_RESUME + else host_action_resume(); + #endif + GOTO_SCREEN(StatusScreen); +} + +#endif // TOUCH_UI_FTDI_EVE && !TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 33b5d5458e..80033e911b 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -972,7 +972,11 @@ namespace ExtUI { } bool isPrinting() { - return (commandsInQueue() || isPrintingFromMedia() || IFSD(IS_SD_PRINTING(), false)); + return (commandsInQueue() || isPrintingFromMedia() || IFSD(IS_SD_PRINTING(), false)) || print_job_timer.isRunning() || print_job_timer.isPaused(); + } + + bool isPrintingPaused() { + return isPrinting() && (isPrintingFromMediaPaused() || print_job_timer.isPaused()); } bool isMediaInserted() { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 15122ec69e..48d0e97220 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -302,6 +302,7 @@ namespace ExtUI { bool isPrintingFromMediaPaused(); bool isPrintingFromMedia(); bool isPrinting(); + bool isPrintingPaused(); void printFile(const char *filename); void stopPrint(); From cec907536178aff81913c0f5f5a262349e6a151b Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 29 Oct 2020 04:01:25 -0300 Subject: [PATCH 0485/1370] PIO env for MKS Nano boards in STM32 (#19905) --- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 2 +- platformio.ini | 32 ++++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index b1e49f4d9f..fbd12fb59c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -25,7 +25,7 @@ * MKS Robin nano (STM32F130VET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) +#if NOT_TARGET(__STM32F1__, STM32F1) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." diff --git a/platformio.ini b/platformio.ini index 3e565e6c4e..b052a26b58 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1310,17 +1310,39 @@ build_flags = ${lerdge_common.build_flags} # RUMBA32 # [env:rumba32] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -Os -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -DTIMER_SERIAL=TIM9 -board = rumba32_f446ve +board = rumba32_f446ve upload_protocol = dfu -monitor_speed = 500000 +monitor_speed = 500000 + +# +# MKS Robin Nano V1.2 and V2 using hal STM32 +# +[env:mks_robin_nano35_stm32] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 +board = genericSTM32F103VE +board_build.core = stm32 +board_build.variant = MARLIN_F103Vx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.firmware = Robin_nano35.bin +board_upload.offset_address = 0x08007000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py ################################# # # From ba28660acb9c6c8373354b0289f9b12936a1bbe5 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Thu, 29 Oct 2020 22:27:01 +0100 Subject: [PATCH 0486/1370] Update Italian language (#19953) --- Marlin/src/lcd/language/language_it.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 38fffcb73b..73639c2790 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -26,6 +26,13 @@ * * LCD Menu Messages * See also https://marlinfw.org/docs/development/lcd_language.html + * + * Substitutions are applied for the following characters when used + * in menu items that call lcd_put_u8str_ind_P with an index: + * + * = displays '0'....'10' for indexes 0 - 10 + * ~ displays '1'....'11' for indexes 0 - 10 + * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) */ #define DISPLAY_CHARSET_ISO10646_1 @@ -65,6 +72,9 @@ namespace Language_it { PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home asse Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Tramming assistito"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("Iterazione G34: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Precis.in calo!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Precis.raggiunta"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home assi XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premi per iniziare"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Punto successivo"); @@ -652,4 +662,5 @@ namespace Language_it { PROGMEM Language_Str MSG_REHEATING = _UxGT("Riscaldando..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Proc.guid.sonda Z"); + PROGMEM Language_Str MSG_SOUND = _UxGT("Suono"); } From 3dbe4ac59395048c98f6cd76bdaada7fac807f64 Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 30 Oct 2020 00:17:04 +0200 Subject: [PATCH 0487/1370] FAST_PWM for STM32F1 (#19952) --- Marlin/src/HAL/STM32F1/HAL.h | 17 ++++++ Marlin/src/HAL/STM32F1/fast_pwm.cpp | 68 ++++++++++++++++++++++ Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 -- Marlin/src/lcd/menu/menu_spindle_laser.cpp | 6 +- 4 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/fast_pwm.cpp diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index eaf6494dfa..b77539d7b6 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -244,3 +244,20 @@ void analogWrite(pin_t pin, int pwm_val8); // PWM only! mul by 257 in maple!? #define PLATFORM_M997_SUPPORT void flashFirmware(const int16_t); + +#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment + +/** + * set_pwm_frequency + * Set the frequency of the timer corresponding to the provided pin + * All Timer PWM pins run at the same frequency + */ +void set_pwm_frequency(const pin_t pin, int f_desired); + +/** + * set_pwm_duty + * Set the PWM duty cycle of the provided pin to the provided value + * Optionally allows inverting the duty cycle [default = false] + * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] + */ +void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false); diff --git a/Marlin/src/HAL/STM32F1/fast_pwm.cpp b/Marlin/src/HAL/STM32F1/fast_pwm.cpp new file mode 100644 index 0000000000..884d482af5 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/fast_pwm.cpp @@ -0,0 +1,68 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfigPre.h" + +#if NEEDS_HARDWARE_PWM + +#include +#include "HAL.h" +#include "timers.h" + +void set_pwm_frequency(const pin_t pin, int f_desired) { + if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer + + timer_dev *timer = PIN_MAP[pin].timer_device; + uint8_t channel = PIN_MAP[pin].timer_channel; + + // Protect used timers + if (timer == get_timer_dev(TEMP_TIMER_NUM)) return; + if (timer == get_timer_dev(STEP_TIMER_NUM)) return; + #if PULSE_TIMER_NUM != STEP_TIMER_NUM + if (timer == get_timer_dev(PULSE_TIMER_NUM)) return; + #endif + + if (!(timer->regs.bas->SR & TIMER_CR1_CEN)) // Ensure the timer is enabled + timer_init(timer); + + timer_set_mode(timer, channel, TIMER_PWM); + uint16_t preload = 255; // Lock 255 PWM resolution for high frequencies + int32_t prescaler = (HAL_TIMER_RATE) / (preload + 1) / f_desired - 1; + if (prescaler > 65535) { // For low frequencies increase prescaler + prescaler = 65535; + preload = (HAL_TIMER_RATE) / (prescaler + 1) / f_desired - 1; + } + if (prescaler < 0) return; // Too high frequency + timer_set_reload(timer, preload); + timer_set_prescaler(timer, prescaler); +} + +void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { + timer_dev *timer = PIN_MAP[pin].timer_device; + uint16_t max_val = timer->regs.bas->ARR * v / v_size; + if (invert) max_val = v_size - max_val; + pwmWrite(pin, max_val); +} + +#endif // NEEDS_HARDWARE_PWM +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index a0381ea8c8..937bef8803 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -25,10 +25,6 @@ * Test STM32F1-specific configuration values for errors at compile-time. */ -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F1." -#endif - #if !defined(HAVE_SW_SERIAL) && HAS_TMC_SW_SERIAL #warning "With TMC2208/9 consider using SoftwareSerialM with HAVE_SW_SERIAL and appropriate SS_TIMER." #error "Missing SoftwareSerial implementation." diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index 04b999eaf6..f1bf433c21 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -55,10 +55,8 @@ #endif } - #if ENABLED(MARLIN_DEV_MODE) - #if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) - EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 50000, cutter.refresh_frequency); - #endif + #if BOTH(MARLIN_DEV_MODE, HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) + EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 50000, cutter.refresh_frequency); #endif END_MENU(); } From 2774b70fbf8e62e3bc3b7a0efb23a1c1d8ff12d2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 29 Oct 2020 17:33:59 -0500 Subject: [PATCH 0488/1370] gcode_D EEPROM size, cleanup Fixes #19920 Co-Authored-By: Orel <37673727+0r31@users.noreply.github.com> --- Marlin/src/HAL/AVR/eeprom.cpp | 2 +- Marlin/src/HAL/DUE/eeprom_flash.cpp | 2 +- Marlin/src/HAL/DUE/eeprom_wired.cpp | 2 +- Marlin/src/HAL/ESP32/eeprom.cpp | 2 +- Marlin/src/HAL/LINUX/eeprom.cpp | 2 +- Marlin/src/HAL/LPC1768/eeprom_flash.cpp | 2 +- Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/LPC1768/eeprom_wired.cpp | 2 +- Marlin/src/HAL/SAMD51/eeprom_flash.cpp | 2 +- Marlin/src/HAL/SAMD51/eeprom_qspi.cpp | 2 +- Marlin/src/HAL/SAMD51/eeprom_wired.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_sram.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_wired.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/eeprom.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/eeprom.cpp | 2 +- Marlin/src/HAL/TEENSY40_41/eeprom.cpp | 2 +- Marlin/src/gcode/gcode_d.cpp | 46 ++++++++------------- 25 files changed, 42 insertions(+), 52 deletions(-) diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp index c7906985eb..ee2a73e410 100644 --- a/Marlin/src/HAL/AVR/eeprom.cpp +++ b/Marlin/src/HAL/AVR/eeprom.cpp @@ -59,7 +59,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = eeprom_read_byte((uint8_t*)pos); if (writing) *value = c; diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index 6f38da0967..209a5161ae 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -996,7 +996,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = ee_Read(uint32_t(pos)); if (writing) *value = c; diff --git a/Marlin/src/HAL/DUE/eeprom_wired.cpp b/Marlin/src/HAL/DUE/eeprom_wired.cpp index 4599d6a7cd..b488c36f16 100644 --- a/Marlin/src/HAL/DUE/eeprom_wired.cpp +++ b/Marlin/src/HAL/DUE/eeprom_wired.cpp @@ -62,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = eeprom_read_byte((uint8_t*)pos); if (writing) *value = c; diff --git a/Marlin/src/HAL/ESP32/eeprom.cpp b/Marlin/src/HAL/ESP32/eeprom.cpp index 1bf687c6fe..cb5f881284 100644 --- a/Marlin/src/HAL/ESP32/eeprom.cpp +++ b/Marlin/src/HAL/ESP32/eeprom.cpp @@ -44,7 +44,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { for (size_t i = 0; i < size; i++) { uint8_t c = EEPROM.read(pos++); if (writing) value[i] = c; diff --git a/Marlin/src/HAL/LINUX/eeprom.cpp b/Marlin/src/HAL/LINUX/eeprom.cpp index 68fff9c433..532f323c6e 100644 --- a/Marlin/src/HAL/LINUX/eeprom.cpp +++ b/Marlin/src/HAL/LINUX/eeprom.cpp @@ -78,7 +78,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return (bytes_written != size); // return true for any error } -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { std::size_t bytes_read = 0; if (writing) { for (std::size_t i = 0; i < size; i++) { diff --git a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp index 2558486375..3c0c3c8ec3 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp @@ -119,7 +119,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; // return true for any error } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos]; if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i]; crc16(crc, buff, size); diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp index 9f2475f490..54a64ccd72 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp @@ -143,7 +143,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return bytes_written != size; // return true for any error } -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { if (!eeprom_file_open) return true; UINT bytes_read = 0; FRESULT s; diff --git a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp index 16c15eaf00..d94aba6119 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp @@ -64,7 +64,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { // Read from external EEPROM const uint8_t c = eeprom_read_byte((uint8_t*)pos); diff --git a/Marlin/src/HAL/SAMD51/eeprom_flash.cpp b/Marlin/src/HAL/SAMD51/eeprom_flash.cpp index 429ef1c2d4..871bf22b7f 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_flash.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_flash.cpp @@ -79,7 +79,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { while (size--) { SYNC(NVMCTRL->SEESTAT.bit.BUSY); uint8_t c = ((volatile uint8_t *)SEEPROM_ADDR)[pos]; diff --git a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp index b403f7939f..faa7637197 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp @@ -56,7 +56,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { while (size--) { uint8_t c = qspi.readByte(pos); if (writing) *value = c; diff --git a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp index 3283195897..d9a0225a7a 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp @@ -59,7 +59,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { while (size--) { uint8_t c = eeprom_read_byte((uint8_t*)pos); if (writing) *value = c; diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index 0933b9f4e8..c83376d265 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -261,7 +261,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { const uint8_t c = TERN(FLASH_EEPROM_LEVELING, ram_eeprom[pos], eeprom_buffered_read_byte(pos)); if (writing) *value = c; diff --git a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp index 711a83ed5b..c9180bf09b 100644 --- a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp @@ -78,7 +78,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { for (size_t i = 0; i < size; i++) { uint8_t c = HAL_eeprom_data[pos + i]; if (writing) value[i] = c; diff --git a/Marlin/src/HAL/STM32/eeprom_sram.cpp b/Marlin/src/HAL/STM32/eeprom_sram.cpp index 5f6f26f9c6..135bcabde9 100644 --- a/Marlin/src/HAL/STM32/eeprom_sram.cpp +++ b/Marlin/src/HAL/STM32/eeprom_sram.cpp @@ -52,7 +52,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { // Read from either external EEPROM, program flash or Backup SRAM const uint8_t c = ( *(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)) ); diff --git a/Marlin/src/HAL/STM32/eeprom_wired.cpp b/Marlin/src/HAL/STM32/eeprom_wired.cpp index 8c46e45f03..ad54c12c47 100644 --- a/Marlin/src/HAL/STM32/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32/eeprom_wired.cpp @@ -65,7 +65,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { // Read from either external EEPROM, program flash or Backup SRAM const uint8_t c = eeprom_read_byte((uint8_t*)pos); diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp index 658b7cd4a6..94b5e099bd 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -68,7 +68,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t * const p = (uint8_t * const)pos; uint8_t c = eeprom_read_byte(p); diff --git a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp index 8db8c8638b..dfcaaaf29f 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp @@ -101,7 +101,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; // return true for any error } -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos]; if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i]; crc16(crc, buff, size); diff --git a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp index 11959191f6..d608ccee14 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp @@ -79,7 +79,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { for (size_t i = 0; i < size; i++) { uint8_t c = HAL_eeprom_data[pos + i]; if (writing) value[i] = c; diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp index fffd6ccaf0..6e992a22a3 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -72,7 +72,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = eeprom_read_byte((uint8_t*)pos); if (writing && value) *value = c; diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp index 00b808fd48..8c5795b685 100644 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp @@ -96,7 +96,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = ee_read_byte((uint8_t*)pos); if (writing) *value = c; diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp index c0d82dbd07..2bf386bec5 100644 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp @@ -62,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = eeprom_read_byte((uint8_t*)pos); if (writing) *value = c; diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp index cc5c56f7d5..f2ae5dd534 100644 --- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp @@ -57,7 +57,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = eeprom_read_byte((uint8_t*)pos); if (writing) *value = c; diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp index ccbdc6b116..8cd6b4ff41 100644 --- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp @@ -61,7 +61,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = eeprom_read_byte((uint8_t*)pos); if (writing) *value = c; diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp index 030a8c38af..fe2de388a7 100644 --- a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp @@ -61,7 +61,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui return false; } -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { uint8_t c = eeprom_read_byte((uint8_t*)pos); if (writing) *value = c; diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 2fd03144c5..0bd2955875 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -54,9 +54,7 @@ size_t total = persistentStore.capacity(); int pos = 0; const uint8_t value = 0x0; - while(total--) { - persistentStore.write_data(pos, &value, 1); - } + while (total--) persistentStore.write_data(pos, &value, 1); persistentStore.access_finish(); #else settings.reset(); @@ -70,7 +68,7 @@ uint8_t *pointer = parser.hex_adr_val('A'); uint16_t len = parser.ushortval('C', 1); uintptr_t addr = (uintptr_t)pointer; - NOMORE(addr, (size_t)(SRAM_SIZE - 1)); + NOMORE(addr, size_t(SRAM_SIZE - 1)); NOMORE(len, SRAM_SIZE - addr); if (parser.seenval('X')) { // Write the hex bytes after the X @@ -91,16 +89,13 @@ uint8_t *pointer = parser.hex_adr_val('A'); uint16_t len = parser.ushortval('C', 1); uintptr_t addr = (uintptr_t)pointer; - #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) - #endif - NOMORE(addr, (size_t)(MARLIN_EEPROM_SIZE - 1)); - NOMORE(len, MARLIN_EEPROM_SIZE - addr); + NOMORE(addr, size_t(persistentStore.capacity() - 1)); + NOMORE(len, persistentStore.capacity() - addr); if (parser.seenval('X')) { uint16_t val = parser.hex_val('X'); #if ENABLED(EEPROM_SETTINGS) persistentStore.access_start(); - while(len--) { + while (len--) { int pos = 0; persistentStore.write_data(pos, (uint8_t *)&val, sizeof(val)); } @@ -111,23 +106,18 @@ #endif } else { - while (len--) { - // Read bytes from EEPROM - #if ENABLED(EEPROM_SETTINGS) - persistentStore.access_start(); - uint8_t val; - while(len--) { - int pos = 0; - if (!persistentStore.read_data(pos, (uint8_t *)&val, sizeof(val))) { - print_hex_byte(val); - } - } - SERIAL_EOL(); - persistentStore.access_finish(); - #else - SERIAL_ECHOLNPGM("NO EEPROM"); - #endif - } + // Read bytes from EEPROM + #if ENABLED(EEPROM_SETTINGS) + persistentStore.access_start(); + int pos = 0; + uint8_t val; + while (len--) if (!persistentStore.read_data(pos, &val, 1)) print_hex_byte(val); + SERIAL_EOL(); + persistentStore.access_finish(); + #else + SERIAL_ECHOLNPGM("NO EEPROM"); + len = 0; + #endif SERIAL_EOL(); } } break; @@ -156,7 +146,7 @@ uint8_t *pointer = parser.hex_adr_val('A'); uint16_t len = parser.ushortval('C', 1); uintptr_t addr = (uintptr_t)pointer; - NOMORE(addr, (size_t)(FLASH_SIZE - 1)); + NOMORE(addr, size_t(FLASH_SIZE - 1)); NOMORE(len, FLASH_SIZE - addr); if (parser.seenval('X')) { // TODO: Write the hex bytes after the X From 4b08e06fa67e52f5a589f64fe4b5b3116a5f93c5 Mon Sep 17 00:00:00 2001 From: Orel <37673727+0r31@users.noreply.github.com> Date: Fri, 30 Oct 2020 02:02:29 +0100 Subject: [PATCH 0489/1370] Rename, adjust Dagoma F5 (#19947) --- Marlin/src/core/boards.h | 2 +- Marlin/src/module/thermistor/thermistor_17.h | 78 +++++++++++++++++++ Marlin/src/module/thermistor/thermistors.h | 3 + Marlin/src/pins/pins.h | 8 +- .../{pins_RAMPS_DAGOMA.h => pins_DAGOMA_F5.h} | 38 +++++++-- 5 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 Marlin/src/module/thermistor/thermistor_17.h rename Marlin/src/pins/ramps/{pins_RAMPS_DAGOMA.h => pins_DAGOMA_F5.h} (61%) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index e115903342..a1e39f9ae8 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -92,7 +92,7 @@ #define BOARD_TRIGORILLA_14_11 1136 // ... Rev 1.1 (new servo pin order) #define BOARD_RAMPS_ENDER_4 1137 // Creality: Ender-4, CR-8 #define BOARD_RAMPS_CREALITY 1138 // Creality: CR10S, CR20, CR-X -#define BOARD_RAMPS_DAGOMA 1139 // Dagoma F5 +#define BOARD_DAGOMA_F5 1139 // Dagoma F5 #define BOARD_FYSETC_F6_13 1140 // FYSETC F6 1.3 #define BOARD_FYSETC_F6_14 1141 // FYSETC F6 1.4 #define BOARD_DUPLICATOR_I3_PLUS 1142 // Wanhao Duplicator i3 Plus diff --git a/Marlin/src/module/thermistor/thermistor_17.h b/Marlin/src/module/thermistor/thermistor_17.h new file mode 100644 index 0000000000..32b5bb77a8 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_17.h @@ -0,0 +1,78 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// Dagoma NTC 100k white thermistor +const temp_entry_t temptable_17[] PROGMEM = { + { OV( 16), 309 }, + { OV( 18), 307 }, + { OV( 20), 300 }, + { OV( 22), 293 }, + { OV( 26), 284 }, + { OV( 29), 272 }, + { OV( 33), 266 }, + { OV( 36), 260 }, + { OV( 42), 252 }, + { OV( 46), 247 }, + { OV( 48), 244 }, + { OV( 51), 241 }, + { OV( 62), 231 }, + { OV( 73), 222 }, + { OV( 78), 219 }, + { OV( 87), 212 }, + { OV( 98), 207 }, + { OV( 109), 201 }, + { OV( 118), 197 }, + { OV( 131), 191 }, + { OV( 145), 186 }, + { OV( 160), 181 }, + { OV( 177), 175 }, + { OV( 203), 169 }, + { OV( 222), 164 }, + { OV( 256), 156 }, + { OV( 283), 151 }, + { OV( 312), 145 }, + { OV( 343), 140 }, + { OV( 377), 131 }, + { OV( 413), 125 }, + { OV( 454), 119 }, + { OV( 496), 113 }, + { OV( 537), 108 }, + { OV( 578), 102 }, + { OV( 619), 97 }, + { OV( 658), 92 }, + { OV( 695), 87 }, + { OV( 735), 81 }, + { OV( 773), 75 }, + { OV( 808), 70 }, + { OV( 844), 64 }, + { OV( 868), 59 }, + { OV( 892), 54 }, + { OV( 914), 49 }, + { OV( 935), 42 }, + { OV( 951), 38 }, + { OV( 967), 32 }, + { OV( 975), 28 }, + { OV(1000), 20 }, + { OV(1010), 10 }, + { OV(1024), -273 } // for safety +}; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 0b0419c520..f90361d9a3 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -105,6 +105,9 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(15) // JGAurora A5 thermistor calibration #include "thermistor_15.h" #endif +#if ANY_THERMISTOR_IS(17) // Dagoma NTC 100k white thermistor + #include "thermistor_17.h" +#endif #if ANY_THERMISTOR_IS(18) // ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 #include "thermistor_18.h" #endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index c4dbe60e99..62749a3f6e 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -179,8 +179,8 @@ #include "ramps/pins_RAMPS_ENDER_4.h" // ATmega2560 env:mega2560 #elif MB(RAMPS_CREALITY) #include "ramps/pins_RAMPS_CREALITY.h" // ATmega2560 env:mega2560 -#elif MB(RAMPS_DAGOMA) - #include "ramps/pins_RAMPS_DAGOMA.h" // ATmega2560 env:mega2560 +#elif MB(DAGOMA_F5) + #include "ramps/pins_DAGOMA_F5.h" // ATmega2560 env:mega2560 #elif MB(FYSETC_F6_13) #include "ramps/pins_FYSETC_F6_13.h" // ATmega2560 env:FYSETC_F6_13 #elif MB(FYSETC_F6_14) @@ -713,6 +713,7 @@ #define BOARD_BIGTREE_SKR_E3_DIP -1017 #define BOARD_RUMBA32 -1018 #define BOARD_RUMBA32_AUS3D -1019 + #define BOARD_RAMPS_DAGOMA -1020 #if MB(MKS_13) #error "BOARD_MKS_13 has been renamed BOARD_MKS_GEN_13. Please update your configuration." @@ -756,6 +757,8 @@ #error "BOARD_RUMBA32 is now BOARD_RUMBA32_MKS or BOARD_RUMBA32_V1_0. Please update your configuration." #elif MB(RUMBA32_AUS3D) #error "BOARD_RUMBA32_AUS3D is now BOARD_RUMBA32_V1_0. Please update your configuration." + #elif MB(RAMPS_DAGOMA) + #error "BOARD_RAMPS_DAGOMA is now BOARD_DAGOMA_F5. Please update your configuration." #else #error "Unknown MOTHERBOARD value set in Configuration.h" #endif @@ -780,6 +783,7 @@ #undef BOARD_BIGTREE_SKR_E3_DIP #undef BOARD_RUMBA32 #undef BOARD_RUMBA32_AUS3D + #undef BOARD_RAMPS_DAGOMA #endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h b/Marlin/src/pins/ramps/pins_DAGOMA_F5.h similarity index 61% rename from Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h rename to Marlin/src/pins/ramps/pins_DAGOMA_F5.h index ad56b7f9d1..667ae47f70 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h +++ b/Marlin/src/pins/ramps/pins_DAGOMA_F5.h @@ -22,21 +22,47 @@ #pragma once #if HOTENDS > 2 || E_STEPPERS > 2 - #error "Dagoma3D F5 RAMPS supports only 2 hotends / E-steppers. Comment out this line to continue." + #error "Dagoma3D F5 supports only 2 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "Dagoma3D F5 RAMPS" +#define BOARD_INFO_NAME "Dagoma3D F5" +// +// Endstops +// #define X_STOP_PIN 2 #define Y_STOP_PIN 3 #define Z_STOP_PIN 15 -#define FIL_RUNOUT_PIN 39 -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 7 +#define FIL_RUNOUT_PIN 39 +#if EXTRUDERS > 1 + #define FIL_RUNOUT2_PIN 14 #endif // -// Import RAMPS 1.4 pins +// LCD delays +// +#if HAS_MARLINUI_U8GLIB + #define BOARD_ST7920_DELAY_1 DELAY_NS(0) + #define BOARD_ST7920_DELAY_2 DELAY_NS(250) + #define BOARD_ST7920_DELAY_3 DELAY_NS(250) +#endif + +// +// DAC steppers +// +#define HAS_MOTOR_CURRENT_DAC + +#define DAC_STEPPER_ORDER { 0, 1, 2, 3 } + +#define DAC_STEPPER_SENSE 0.11 +#define DAC_STEPPER_ADDRESS 0 +#define DAC_STEPPER_MAX 4096 +#define DAC_STEPPER_VREF 1 +#define DAC_STEPPER_GAIN 0 +#define DAC_OR_ADDRESS 0x00 + +// +// Import default RAMPS 1.4 pins // #include "pins_RAMPS.h" From aec215aaf3c8f82397607e81225b4aa3a6276d02 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 30 Oct 2020 00:10:04 +0000 Subject: [PATCH 0490/1370] Fix bilinear_line_to_destination definition See #19431 --- Marlin/src/feature/bedlevel/abl/abl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index a585c1e155..39d8815fad 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -348,7 +348,7 @@ float bilinear_z_offset(const xy_pos_t &raw) { * Prepare a bilinear-leveled linear move on Cartesian, * splitting the move where it crosses grid borders. */ - void bilinear_line_to_destination(const feedRate_t scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { + void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { // Get current and destination cells for this line xy_int_t c1 { CELL_INDEX(x, current_position.x), CELL_INDEX(y, current_position.y) }, c2 { CELL_INDEX(x, destination.x), CELL_INDEX(y, destination.y) }; From 08f2735e86c336525b7a73efdbaea38b073f8095 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 31 Oct 2020 16:12:35 -0500 Subject: [PATCH 0491/1370] Cutter enable inline at full power Co-Authored-By: Luu Lac <45380455+shitcreek@users.noreply.github.com> --- Marlin/src/feature/spindle_laser.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 15ff661c73..e8db3aa608 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -235,7 +235,7 @@ public: // Inline modes of all other functions; all enable planner inline power control static inline void set_inline_enabled(const bool enable) { if (enable) - inline_power(cpwr_to_upwr(SPEED_POWER_STARTUP)); + inline_power(255); else { isReady = false; unitPower = menuPower = 0; From d18ab2d206e5d6d4f6a5da4627553d1bbdca768e Mon Sep 17 00:00:00 2001 From: Julien Lirochon Date: Sat, 31 Oct 2020 19:45:10 +0100 Subject: [PATCH 0492/1370] Fix SpindleLaser::cpwr_to_pct() maths (#19970) --- Marlin/src/feature/spindle_laser.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index e8db3aa608..9d21c96fb9 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -46,14 +46,14 @@ class SpindleLaser { public: static constexpr float - min_pct = round(TERN(CUTTER_POWER_RELATIVE, 0, (100 * float(SPEED_POWER_MIN) / TERN(SPINDLE_FEATURE, float(SPEED_POWER_MAX), 100)))), - max_pct = round(TERN(SPINDLE_FEATURE, 100, float(SPEED_POWER_MAX))); + min_pct = TERN(CUTTER_POWER_RELATIVE, 0, TERN(SPINDLE_FEATURE, round(100.0f * (SPEED_POWER_MIN) / (SPEED_POWER_MAX)), SPEED_POWER_MIN))), + max_pct = TERN(SPINDLE_FEATURE, 100, SPEED_POWER_MAX); static const inline uint8_t pct_to_ocr(const float pct) { return uint8_t(PCT_TO_PWM(pct)); } // cpower = configured values (ie SPEED_POWER_MAX) static const inline uint8_t cpwr_to_pct(const cutter_cpower_t cpwr) { // configured value to pct - return unitPower ? round(100 * (cpwr - SPEED_POWER_FLOOR) / (SPEED_POWER_MAX - SPEED_POWER_FLOOR)) : 0; + return unitPower ? round(100.0f * (cpwr - (SPEED_POWER_FLOOR)) / (SPEED_POWER_MAX - (SPEED_POWER_FLOOR))) : 0; } // Convert a configured value (cpower)(ie SPEED_POWER_STARTUP) to unit power (upwr, upower), From 261e8df837f63d8ab1e10a97db7afaecba990a69 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 31 Oct 2020 16:28:33 -0500 Subject: [PATCH 0493/1370] Cutter power cleanup --- Marlin/src/feature/spindle_laser.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 9d21c96fb9..50e92fe663 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -39,24 +39,27 @@ #ifndef SPEED_POWER_INTERCEPT #define SPEED_POWER_INTERCEPT 0 #endif -#define SPEED_POWER_FLOOR TERN(CUTTER_POWER_RELATIVE, SPEED_POWER_MIN, 0) // #define _MAP(N,S1,S2,D1,D2) ((N)*_MAX((D2)-(D1),0)/_MAX((S2)-(S1),1)+(D1)) class SpindleLaser { public: static constexpr float - min_pct = TERN(CUTTER_POWER_RELATIVE, 0, TERN(SPINDLE_FEATURE, round(100.0f * (SPEED_POWER_MIN) / (SPEED_POWER_MAX)), SPEED_POWER_MIN))), + min_pct = TERN(CUTTER_POWER_RELATIVE, 0, TERN(SPINDLE_FEATURE, round(100.0f * (SPEED_POWER_MIN) / (SPEED_POWER_MAX)), SPEED_POWER_MIN)), max_pct = TERN(SPINDLE_FEATURE, 100, SPEED_POWER_MAX); static const inline uint8_t pct_to_ocr(const float pct) { return uint8_t(PCT_TO_PWM(pct)); } - // cpower = configured values (ie SPEED_POWER_MAX) - static const inline uint8_t cpwr_to_pct(const cutter_cpower_t cpwr) { // configured value to pct - return unitPower ? round(100.0f * (cpwr - (SPEED_POWER_FLOOR)) / (SPEED_POWER_MAX - (SPEED_POWER_FLOOR))) : 0; + // cpower = configured values (e.g., SPEED_POWER_MAX) + + // Convert configured power range to a percentage + static const inline uint8_t cpwr_to_pct(const cutter_cpower_t cpwr) { + constexpr cutter_cpower_t power_floor = TERN(CUTTER_POWER_RELATIVE, SPEED_POWER_MIN, 0), + power_range = SPEED_POWER_MAX - power_floor; + return unitPower ? round(100.0f * (cpwr - power_floor) / power_range) : 0; } - // Convert a configured value (cpower)(ie SPEED_POWER_STARTUP) to unit power (upwr, upower), + // Convert a cpower (e.g., SPEED_POWER_STARTUP) to unit power (upwr, upower), // which can be PWM, Percent, or RPM (rel/abs). static const inline cutter_power_t cpwr_to_upwr(const cutter_cpower_t cpwr) { // STARTUP power to Unit power const cutter_power_t upwr = ( From 3eaeaa8af3d08c1a7e23df310d98626329a4737d Mon Sep 17 00:00:00 2001 From: Nick Date: Sat, 31 Oct 2020 21:54:31 +0000 Subject: [PATCH 0494/1370] Fix Chiron probe low point (#19962) --- Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h index f5000611a7..af030df580 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -54,7 +54,7 @@ #define MAX_PATH_LEN 16 * MAX_FOLDER_DEPTH // Maximum number of characters in a SD file path #define AC_HEATER_FAULT_VALIDATION_TIME 5 // number of 1/2 second loops before signalling a heater fault -#define AC_LOWEST_MESHPOINT_VAL -7.00 // The lowest value you can set for a single mesh point offset +#define AC_LOWEST_MESHPOINT_VAL Z_PROBE_LOW_POINT // The lowest value you can set for a single mesh point offset // TFT panel commands #define AC_msg_sd_card_inserted PSTR("J00") From 2a61ce80b8d63997415d9ba71f842f6ce20fc3c4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 31 Oct 2020 19:14:10 -0300 Subject: [PATCH 0495/1370] Put PIO "debug" build in the corner (#19975) --- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 3e75434ee7..ee2afb1d26 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -10,3 +10,13 @@ env.Append(CXXFLAGS=[ #"-Wno-maybe-uninitialized", #"-Wno-sign-compare" ]) + +# Useful for JTAG debugging +# +# It will separe release and debug build folders. +# It useful when we need keep two live versions: one debug, for debugging, +# other release, for flashing. +# Without this, PIO will recompile everything twice for any small change. +# +if env.GetBuildType() == "debug": + env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' From c9c17b886375338d8812bb7c7b7a9b68ce883f09 Mon Sep 17 00:00:00 2001 From: Alexander Semion Date: Sun, 1 Nov 2020 01:42:05 +0300 Subject: [PATCH 0496/1370] Add SPINDLE_SERVO option (#19971) --- Marlin/Configuration_adv.h | 7 +++++++ Marlin/src/feature/spindle_laser.cpp | 12 +++++++++++- Marlin/src/feature/spindle_laser.h | 5 ++++- Marlin/src/gcode/control/M3-M5.cpp | 8 +++++++- Marlin/src/inc/Conditionals_adv.h | 6 +++++- Marlin/src/inc/SanityCheck.h | 8 ++++---- 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 951aab7804..b39e9e1722 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2943,11 +2943,18 @@ #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC) + //#define SPINDLE_SERVO // A servo converting an angle to spindle power + #ifdef SPINDLE_SERVO + #define SPINDLE_SERVO_NR 0 // Index of servo used for spindle control + #define SPINDLE_SERVO_MIN 10 // Minimum angle for servo spindle + #endif + /** * Speed / Power can be set ('M3 S') and displayed in terms of: * - PWM255 (S0 - S255) * - PERCENT (S0 - S100) * - RPM (S0 - S50000) Best for use with a spindle + * - SERVO (S0 - S180) */ #define CUTTER_POWER_UNIT PWM255 diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index bc387a9334..3b28b61b49 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -30,6 +30,10 @@ #include "spindle_laser.h" +#if ENABLED(SPINDLE_SERVO) + #include "../module/servo.h" +#endif + SpindleLaser cutter; uint8_t SpindleLaser::power; bool SpindleLaser::isReady; // Ready to apply power setting from the UI to OCR @@ -45,7 +49,11 @@ cutter_power_t SpindleLaser::menuPower, // Power s // Init the cutter to a safe OFF state // void SpindleLaser::init() { - OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Init spindle to off + #if ENABLED(SPINDLE_SERVO) + MOVE_SERVO(SPINDLE_SERVO_NR, SPINDLE_SERVO_MIN); + #else + OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Init spindle to off + #endif #if ENABLED(SPINDLE_CHANGE_DIR) OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // Init rotation to clockwise (M3) #endif @@ -97,6 +105,8 @@ void SpindleLaser::apply_power(const uint8_t opwr) { ocr_off(); isReady = false; } + #elif ENABLED(SPINDLE_SERVO) + MOVE_SERVO(SPINDLE_SERVO_NR, power); #else WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE); isReady = true; diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 50e92fe663..74d06634a0 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -35,6 +35,7 @@ #endif #define PCT_TO_PWM(X) ((X) * 255 / 100) +#define PCT_TO_SERVO(X) ((X) * 180 / 100) #ifndef SPEED_POWER_INTERCEPT #define SPEED_POWER_INTERCEPT 0 @@ -60,7 +61,7 @@ public: } // Convert a cpower (e.g., SPEED_POWER_STARTUP) to unit power (upwr, upower), - // which can be PWM, Percent, or RPM (rel/abs). + // which can be PWM, Percent, Servo angle, or RPM (rel/abs). static const inline cutter_power_t cpwr_to_upwr(const cutter_cpower_t cpwr) { // STARTUP power to Unit power const cutter_power_t upwr = ( #if ENABLED(SPINDLE_FEATURE) @@ -69,6 +70,8 @@ public: cpwr // to RPM #elif CUTTER_UNIT_IS(PERCENT) // to PCT cpwr_to_pct(cpwr) + #elif CUTTER_UNIT_IS(SERVO) // to SERVO angle + PCT_TO_SERVO(cpwr_to_pct(cpwr)) #else // to PWM PCT_TO_PWM(cpwr_to_pct(cpwr)) #endif diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp index 1326c30669..6f2409f69f 100644 --- a/Marlin/src/gcode/control/M3-M5.cpp +++ b/Marlin/src/gcode/control/M3-M5.cpp @@ -69,9 +69,13 @@ void GcodeSuite::M3_M4(const bool is_M4) { auto get_s_power = [] { if (parser.seenval('S')) { const float spwr = parser.value_float(); - cutter.unitPower = TERN(SPINDLE_LASER_PWM, + #if ENABLED(SPINDLE_SERVO) + cutter.unitPower = spwr; + #else + cutter.unitPower = TERN(SPINDLE_LASER_PWM, cutter.power_to_range(cutter_power_t(round(spwr))), spwr > 0 ? 255 : 0); + #endif } else cutter.unitPower = cutter.cpwr_to_upwr(SPEED_POWER_STARTUP); @@ -108,6 +112,8 @@ void GcodeSuite::M3_M4(const bool is_M4) { } else cutter.set_power(cutter.upower_to_ocr(get_s_power())); + #elif ENABLED(SPINDLE_SERVO) + cutter.set_power(get_s_power()); #else cutter.set_enabled(true); #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 05935be549..2a898d6084 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -33,7 +33,7 @@ // Determine NUM_SERVOS if none was supplied #ifndef NUM_SERVOS #define NUM_SERVOS 0 - #if ANY(CHAMBER_VENT, HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) + #if ANY(HAS_Z_SERVO_PROBE, CHAMBER_VENT, SWITCHING_TOOLHEAD, SWITCHING_EXTRUDER, SWITCHING_NOZZLE, SPINDLE_SERVO) #if NUM_SERVOS <= Z_PROBE_SERVO_NR #undef NUM_SERVOS #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1) @@ -62,6 +62,10 @@ #undef NUM_SERVOS #define NUM_SERVOS (SWITCHING_EXTRUDER_E23_SERVO_NR + 1) #endif + #if NUM_SERVOS <= SPINDLE_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SPINDLE_SERVO_NR + 1) + #endif #endif #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 657e055241..cadf84abd1 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3007,8 +3007,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #if HAS_CUTTER #ifndef CUTTER_POWER_UNIT #error "CUTTER_POWER_UNIT is required with a spindle or laser. Please update your Configuration_adv.h." - #elif !CUTTER_UNIT_IS(PWM255) && !CUTTER_UNIT_IS(PERCENT) && !CUTTER_UNIT_IS(RPM) - #error "CUTTER_POWER_UNIT must be PWM255, PERCENT, or RPM. Please update your Configuration_adv.h." + #elif !CUTTER_UNIT_IS(PWM255) && !CUTTER_UNIT_IS(PERCENT) && !CUTTER_UNIT_IS(RPM) && !CUTTER_UNIT_IS(SERVO) + #error "CUTTER_POWER_UNIT must be PWM255, PERCENT, RPM, or SERVO. Please update your Configuration_adv.h." #endif #if ENABLED(LASER_POWER_INLINE) @@ -3047,8 +3047,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #define _PIN_CONFLICT(P) (PIN_EXISTS(P) && P##_PIN == SPINDLE_LASER_PWM_PIN) #if BOTH(SPINDLE_FEATURE, LASER_FEATURE) #error "Enable only one of SPINDLE_FEATURE or LASER_FEATURE." - #elif !PIN_EXISTS(SPINDLE_LASER_ENA) - #error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN." + #elif !PIN_EXISTS(SPINDLE_LASER_ENA) && DISABLED(SPINDLE_SERVO) + #error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN or SPINDLE_SERVO to control the power." #elif ENABLED(SPINDLE_CHANGE_DIR) && !PIN_EXISTS(SPINDLE_DIR) #error "SPINDLE_DIR_PIN is required for SPINDLE_CHANGE_DIR." #elif ENABLED(SPINDLE_LASER_PWM) From d9a47ec075ba5b1324ac847beda6891843e6e654 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 1 Nov 2020 01:39:30 -0700 Subject: [PATCH 0497/1370] Get STM32 clock rates from framework (#19978) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/STM32/timers.cpp | 14 +++++++++----- Marlin/src/HAL/STM32/timers.h | 3 ++- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 1 - 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index b708c4bdab..442aa74d1c 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -68,26 +68,23 @@ #endif #ifdef STM32F0xx - #define MCU_TIMER_RATE (F_CPU) // Frequency of timer peripherals #define MCU_STEP_TIMER 16 #define MCU_TEMP_TIMER 17 #elif defined(STM32F1xx) - #define MCU_TIMER_RATE (F_CPU) #define MCU_STEP_TIMER 4 #define MCU_TEMP_TIMER 2 #elif defined(STM32F401xC) || defined(STM32F401xE) - #define MCU_TIMER_RATE (F_CPU / 2) #define MCU_STEP_TIMER 9 #define MCU_TEMP_TIMER 10 #elif defined(STM32F4xx) || defined(STM32F7xx) - #define MCU_TIMER_RATE (F_CPU / 2) #define MCU_STEP_TIMER 6 // STM32F401 has no TIM6, TIM7, or TIM8 #define MCU_TEMP_TIMER 14 // TIM7 is consumed by Software Serial if used. #endif #ifndef HAL_TIMER_RATE - #define HAL_TIMER_RATE MCU_TIMER_RATE + #define HAL_TIMER_RATE GetStepperTimerClkFreq() #endif + #ifndef STEP_TIMER #define STEP_TIMER MCU_STEP_TIMER #endif @@ -115,6 +112,13 @@ HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { nullptr }; // Public functions // ------------------------ +uint32_t GetStepperTimerClkFreq() { + // Timer input clocks vary between devices, and in some cases between timers on the same device. + // Retrieve at runtime to ensure device compatibility. Cache result to avoid repeated overhead. + static uint32_t clkfreq = timer_instance[STEP_TIMER_NUM]->getTimerClkFreq(); + return clkfreq; +} + // frequency is in Hertz void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { if (!HAL_timer_initialized(timer_num)) { diff --git a/Marlin/src/HAL/STM32/timers.h b/Marlin/src/HAL/STM32/timers.h index 5515219ead..de762794ee 100644 --- a/Marlin/src/HAL/STM32/timers.h +++ b/Marlin/src/HAL/STM32/timers.h @@ -57,7 +57,8 @@ // TODO: get rid of manual rate/prescale/ticks/cycles taken for procedures in stepper.cpp #define STEPPER_TIMER_RATE 2000000 // 2 Mhz -#define STEPPER_TIMER_PRESCALE ((HAL_TIMER_RATE)/(STEPPER_TIMER_RATE)) +extern uint32_t GetStepperTimerClkFreq(); +#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / (STEPPER_TIMER_RATE)) #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs #define PULSE_TIMER_RATE STEPPER_TIMER_RATE diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 9a6a16516c..eee0094ea8 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -47,7 +47,6 @@ #define STEP_TIMER 10 #define TEMP_TIMER 14 -#define HAL_TIMER_RATE F_CPU // // Limit Switches From 95fb749923cc1693cf15b087ba316e2a474520ba Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 1 Nov 2020 04:40:59 -0600 Subject: [PATCH 0498/1370] Clean up SPI and ST7920 defines (#19956) --- Marlin/src/HAL/STM32F1/spi_pins.h | 6 +-- .../dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 32 +++++++++++++++ .../lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h | 41 +------------------ Marlin/src/pins/pins_postprocess.h | 3 ++ .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 3 +- .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 1 - Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 2 +- Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 3 +- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 7 +++- .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 27 ++++++------ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 3 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 4 +- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h | 2 - 21 files changed, 68 insertions(+), 82 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/spi_pins.h b/Marlin/src/HAL/STM32F1/spi_pins.h index 8f2b324f64..59ac446410 100644 --- a/Marlin/src/HAL/STM32F1/spi_pins.h +++ b/Marlin/src/HAL/STM32F1/spi_pins.h @@ -49,10 +49,6 @@ #undef SDSS #define SDSS SS_PIN -#if ENABLED(ENABLE_SPI3) - #define SPI_DEVICE 3 -#elif ENABLED(ENABLE_SPI2) - #define SPI_DEVICE 2 -#else +#ifndef SPI_DEVICE #define SPI_DEVICE 1 #endif diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index e6bd80c2c2..8542424d7e 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -33,6 +33,38 @@ #include "ultralcd_st7920_u8glib_rrd_AVR.h" +#if F_CPU >= 20000000 + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(50) +#elif MB(3DRAG, K8200, K8400) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(188) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(MINIRAMBO, EINSY_RAMBO, EINSY_RETRO, SILVER_GATE) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(250) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(RAMBO) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(BQ_ZUM_MEGA_3D) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(189) +#elif defined(ARDUINO_ARCH_STM32) + #define CPU_ST7920_DELAY_1 DELAY_NS(300) + #define CPU_ST7920_DELAY_2 DELAY_NS(40) + #define CPU_ST7920_DELAY_3 DELAY_NS(340) +#elif F_CPU == 16000000 + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(63) +#else + #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd_AVR.h'" +#endif + #ifndef ST7920_DELAY_1 #ifdef BOARD_ST7920_DELAY_1 #define ST7920_DELAY_1 BOARD_ST7920_DELAY_1 diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h index 70be70eab7..e8a48299cb 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h @@ -37,43 +37,6 @@ #include -// If you want you can define your own set of delays in Configuration.h -//#define ST7920_DELAY_1 DELAY_NS(0) -//#define ST7920_DELAY_2 DELAY_NS(0) -//#define ST7920_DELAY_3 DELAY_NS(0) - -#if F_CPU >= 20000000 - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(50) -#elif MB(3DRAG, K8200, K8400) - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(188) - #define CPU_ST7920_DELAY_3 DELAY_NS(0) -#elif MB(MINIRAMBO, EINSY_RAMBO, EINSY_RETRO, SILVER_GATE) - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(250) - #define CPU_ST7920_DELAY_3 DELAY_NS(0) -#elif MB(RAMBO) - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(0) -#elif MB(BQ_ZUM_MEGA_3D) - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(189) -#elif defined(ARDUINO_ARCH_STM32) - #define CPU_ST7920_DELAY_1 DELAY_NS(300) - #define CPU_ST7920_DELAY_2 DELAY_NS(40) - #define CPU_ST7920_DELAY_3 DELAY_NS(340) -#elif F_CPU == 16000000 - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(63) -#else - #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd_AVR.h'" -#endif - void ST7920_SWSPI_SND_8BIT(uint8_t val); #if DOGM_SPI_DELAY_US > 0 @@ -82,8 +45,8 @@ void ST7920_SWSPI_SND_8BIT(uint8_t val); #define U8G_DELAY() DELAY_US(10) #endif -#define ST7920_CS() { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); } -#define ST7920_NCS() { WRITE(ST7920_CS_PIN,0); } +#define ST7920_CS() { WRITE(ST7920_CS_PIN, HIGH); U8G_DELAY(); } +#define ST7920_NCS() { WRITE(ST7920_CS_PIN, LOW); } #define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); U8G_DELAY(); } #define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); U8G_DELAY(); } #define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4U)); U8G_DELAY(); } diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index fdf9f095cb..788f2093c1 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -871,6 +871,9 @@ #undef ST7920_DELAY_1 #undef ST7920_DELAY_2 #undef ST7920_DELAY_3 + #undef BOARD_ST7920_DELAY_1 + #undef BOARD_ST7920_DELAY_2 + #undef BOARD_ST7920_DELAY_3 #endif #undef HAS_FREE_AUX2_PINS diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index ce43e677e2..16c247cc87 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -210,14 +210,13 @@ #endif #if SD_CONNECTION_IS(LCD) - #define ENABLE_SPI3 + #define SPI_DEVICE 3 #define SD_DETECT_PIN PB9 #define SCK_PIN PB3 #define MISO_PIN PB4 #define MOSI_PIN PB5 #define SS_PIN PA15 #elif SD_CONNECTION_IS(ONBOARD) - #define ENABLE_SPI1 #define SD_DETECT_PIN PA3 #define SCK_PIN PA5 #define MISO_PIN PA6 diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index 66930a2ea5..0e94249a99 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -165,7 +165,6 @@ // SD-NAND // #if SD_CONNECTION_IS(ONBOARD) - #define ENABLE_SPI1 #define SD_DETECT_PIN -1 #define SCK_PIN PA5 #define MISO_PIN PA6 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 6d87e6b14f..d89cfc6da8 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -185,7 +185,7 @@ // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available // Needs to use SPI2 -#define ENABLE_SPI2 +#define SPI_DEVICE 2 #define SCK_PIN PB13 #define MISO_PIN PB14 #define MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index bdce235841..262a9a241b 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -200,7 +200,7 @@ // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available // so SPI2 is required. -#define ENABLE_SPI2 +#define SPI_DEVICE 2 #define SCK_PIN PB13 #define MISO_PIN PB14 #define MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index 7f3ab03654..bf3389492a 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -56,7 +56,7 @@ // SPI // Note: FLSun Hispeed (clone MKS_Robin_miniV2) board is using SPI2 interface. // -#define ENABLE_SPI2 +#define SPI_DEVICE 2 // SPI Flash #define HAS_SPI_FLASH 1 diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index 55a809efab..4f555c373f 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -132,7 +132,7 @@ // // LCD / Controller // -#define ENABLE_SPI2 +#define SPI_DEVICE 2 #define SS_PIN PB12 #define SCK_PIN PB13 #define MISO_PIN PB14 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 63c0da476d..e6c8098f2a 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -166,7 +166,7 @@ #endif // SPI1(PA7) & SPI3(PB5) not available -#define ENABLE_SPI2 +#define SPI_DEVICE 2 #if ENABLED(SDIO_SUPPORT) #define SCK_PIN PB13 // SPI2 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 4998c92dc5..2b7417c29f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -55,8 +55,7 @@ // // Note: MKS Robin board is using SPI2 interface. // -//#define SPI_MODULE 2 -#define ENABLE_SPI2 +#define SPI_DEVICE 2 // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index af2908545b..ffcdc3cfdf 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -167,7 +167,7 @@ // // SD Card // -#define ENABLE_SPI2 +#define SPI_DEVICE 2 #define SD_DETECT_PIN PC10 #define SCK_PIN PB13 #define MISO_PIN PB14 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index ffd21917dd..ab5350e4de 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -34,7 +34,6 @@ //#define DISABLE_DEBUG #define DISABLE_JTAG -#define ENABLE_SPI2 // // Limit Switches @@ -135,8 +134,12 @@ // // SD Card // -#define ENABLE_SPI2 #define SD_DETECT_PIN PC10 + +// +// SPI +// +#define SPI_DEVICE 2 #define SCK_PIN PB13 #define MISO_PIN P1B4 #define MOSI_PIN P1B5 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 493efc5c7b..4c1299fe02 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -38,7 +38,6 @@ //#define DISABLE_DEBUG #define DISABLE_JTAG -#define ENABLE_SPI2 // // Servos @@ -87,9 +86,9 @@ // // Temperature Sensors // -#define TEMP_BED_PIN PA1 //TB -#define TEMP_0_PIN PA0 //TH1 -#define TEMP_1_PIN PA2 //TH2 +#define TEMP_BED_PIN PA1 // TB +#define TEMP_0_PIN PA0 // TH1 +#define TEMP_1_PIN PA2 // TH2 #define FIL_RUNOUT_PIN PB10 // MT_DET @@ -132,24 +131,22 @@ #endif // !MKS_MINI_12864 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif // HAS_WIRED_LCD // // SD Card // -#define ENABLE_SPI2 #define SD_DETECT_PIN PC10 + +// +// SPI +// +#define SPI_DEVICE 2 #define SCK_PIN PB13 #define MISO_PIN PB14 #define MOSI_PIN PB15 #define SS_PIN PA15 - -#ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) -#endif -#ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) -#endif -#ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 14f9c3b626..8c63f79732 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -48,7 +48,7 @@ #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif -#define ENABLE_SPI2 +#define SPI_DEVICE 2 // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 7f2ae61aae..ff381b3753 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -48,7 +48,7 @@ #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif -#define ENABLE_SPI2 +#define SPI_DEVICE 2 // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index fbd12fb59c..0630c0f3cb 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -55,8 +55,7 @@ // // Note: MKS Robin board is using SPI2 interface. // -//#define SPI_MODULE 2 -#define ENABLE_SPI2 +#define SPI_DEVICE 2 // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index db6bc93205..639a8f0579 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -41,8 +41,7 @@ // // Note: MKS Robin board is using SPI2 interface. // -//#define SPI_MODULE 2 -#define ENABLE_SPI2 +#define SPI_DEVICE 2 // // Servos @@ -191,7 +190,6 @@ #endif #if SD_CONNECTION_IS(LCD) - #define ENABLE_SPI2 #define SD_DETECT_PIN PG3 #define SCK_PIN PB13 #define MISO_PIN PB14 diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index bfd1f2abdc..818dbb5f7e 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -173,7 +173,7 @@ #endif // SPI1(PA7) & SPI3(PB5) not available -#define ENABLE_SPI2 +#define SPI_DEVICE 2 #if ENABLED(SDIO_SUPPORT) #define SCK_PIN PB13 // SPI2 ok diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h index ab277d4372..4dce7b79c0 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h @@ -46,8 +46,6 @@ #define FLASH_EEPROM_LEVELING #endif -#define ENABLE_SPI1 - #include "pins_RUMBA32_common.h" #if HAS_TMC_UART From 5c90d0d0ae1f3706fd6ede91bbc868a641fe39e1 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 1 Nov 2020 07:42:53 -0300 Subject: [PATCH 0499/1370] Reset calibration screen touch timer on click (#19951) --- Marlin/src/lcd/tft/touch.cpp | 4 ++-- Marlin/src/lcd/tft/touch.h | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 93f8f64a2d..d54506442d 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -61,7 +61,7 @@ void Touch::init() { enable(); } -void Touch::add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data) { +void Touch::add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, intptr_t data) { if (controls_count == MAX_CONTROLS) return; controls[controls_count].type = type; @@ -306,7 +306,7 @@ bool MarlinUI::touch_pressed() { return touch.is_clicked(); } -void add_control(uint16_t x, uint16_t y, TouchControlType control_type, int32_t data, MarlinImage image, bool is_enabled, uint16_t color_enabled, uint16_t color_disabled) { +void add_control(uint16_t x, uint16_t y, TouchControlType control_type, intptr_t data, MarlinImage image, bool is_enabled, uint16_t color_enabled, uint16_t color_disabled) { uint16_t width = Images[image].width; uint16_t height = Images[image].height; tft.canvas(x, y, width, height); diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h index 17aa5bdd97..4ba3e22c8e 100644 --- a/Marlin/src/lcd/tft/touch.h +++ b/Marlin/src/lcd/tft/touch.h @@ -85,9 +85,9 @@ enum TouchControlType : uint16_t { typedef void (*screenFunc_t)(); -void add_control(uint16_t x, uint16_t y, TouchControlType control_type, int32_t data, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED); +void add_control(uint16_t x, uint16_t y, TouchControlType control_type, intptr_t data, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED); inline void add_control(uint16_t x, uint16_t y, TouchControlType control_type, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, control_type, 0, image, is_enabled, color_enabled, color_disabled); } -inline void add_control(uint16_t x, uint16_t y, screenFunc_t screen, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, MENU_SCREEN, (int32_t)screen, image, is_enabled, color_enabled, color_disabled); } +inline void add_control(uint16_t x, uint16_t y, screenFunc_t screen, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, MENU_SCREEN, (intptr_t)screen, image, is_enabled, color_enabled, color_disabled); } typedef struct __attribute__((__packed__)) { TouchControlType type; @@ -95,7 +95,7 @@ typedef struct __attribute__((__packed__)) { uint16_t y; uint16_t width; uint16_t height; - int32_t data; + intptr_t data; } touch_control_t; typedef struct __attribute__((__packed__)) { @@ -158,7 +158,7 @@ class Touch { public: static void init(); - static void reset() { controls_count = 0; touch_time = -1; current_control = NULL; } + static void reset() { controls_count = 0; touch_time = 0; current_control = NULL; } static void clear() { controls_count = 0; } static void idle(); static bool is_clicked() { @@ -171,7 +171,7 @@ class Touch { static void disable() { enabled = false; } static void enable() { enabled = true; } - static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data = 0); + static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, intptr_t data = 0); static touch_calibration_t calibration; static void calibration_reset() { calibration = {TOUCH_CALIBRATION_X, TOUCH_CALIBRATION_Y, TOUCH_OFFSET_X, TOUCH_OFFSET_Y, TOUCH_ORIENTATION}; } From e335e7437903b85aba4ed2da873f2be9b99495e3 Mon Sep 17 00:00:00 2001 From: "Alexander D. Kanevskiy" Date: Mon, 2 Nov 2020 01:44:46 +0200 Subject: [PATCH 0500/1370] Y-center GLCD status logo, reorganize (#19954) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 1246 +---------------------- Marlin/src/lcd/dogm/status/bed.h | 110 ++ Marlin/src/lcd/dogm/status/chamber.h | 89 ++ Marlin/src/lcd/dogm/status/combined.h | 236 +++++ Marlin/src/lcd/dogm/status/cutter.h | 123 +++ Marlin/src/lcd/dogm/status/fan.h | 443 ++++++++ Marlin/src/lcd/dogm/status/hotend.h | 336 ++++++ 7 files changed, 1370 insertions(+), 1213 deletions(-) create mode 100644 Marlin/src/lcd/dogm/status/bed.h create mode 100644 Marlin/src/lcd/dogm/status/chamber.h create mode 100644 Marlin/src/lcd/dogm/status/combined.h create mode 100644 Marlin/src/lcd/dogm/status/cutter.h create mode 100644 Marlin/src/lcd/dogm/status/fan.h create mode 100644 Marlin/src/lcd/dogm/status/hotend.h diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index e76b7da598..15578e21d9 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -57,805 +57,43 @@ // Default Status Screen Heater or Hotends bitmaps // #if !STATUS_HEATERS_WIDTH && !STATUS_HOTEND1_WIDTH - #if ENABLED(STATUS_COMBINE_HEATERS) - - #undef STATUS_HOTEND_ANIM - #undef STATUS_BED_ANIM - #define STATUS_HEATERS_XSPACE 24 - - // - // Status Screen Combined Heater bitmaps - // - #if HAS_HEATED_BED && HOTENDS <= 4 - - #if HOTENDS == 0 - - #define STATUS_HEATERS_WIDTH 96 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #elif HOTENDS == 1 - - #define STATUS_HEATERS_WIDTH 96 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, - B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, - B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #elif HOTENDS == 2 - - #define STATUS_HEATERS_WIDTH 96 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #elif HOTENDS == 3 - - #define STATUS_HEATERS_WIDTH 96 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #else // HOTENDS > 3 - - #define STATUS_HEATERS_WIDTH 120 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00001000,B00100000,B10000000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #endif // HOTENDS - - #define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10) - - #else // !HAS_HEATED_BED || HOTENDS > 3 - - #if HOTENDS == 0 - - #define STATUS_HEATERS_WIDTH 0 - - #elif HOTENDS == 1 - - #define STATUS_HEATERS_WIDTH 12 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111111,B11110000, - B00111111,B11110000, - B00011111,B11100000, - B00011111,B11100000, - B00111111,B11110000, - B00111111,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #elif HOTENDS == 2 - - #define STATUS_HEATERS_WIDTH 36 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000, - B00111100,B11110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000, - B00011110,B11100000,B00000000,B00011101,B11100000, - B00111110,B11110000,B00000000,B00111011,B11110000, - B00111110,B11110000,B00000000,B00111000,B01110000, - B00111111,B11110000,B00000000,B00111111,B11110000, - B00001111,B11000000,B00000000,B00001111,B11000000, - B00000111,B10000000,B00000000,B00000111,B10000000, - B00000011,B00000000,B00000000,B00000011,B00000000 - }; - - #elif HOTENDS == 3 - - #define STATUS_HEATERS_WIDTH 60 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 - }; - - #elif HOTENDS == 4 - - #define STATUS_HEATERS_WIDTH 84 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 - }; - - #else // HOTENDS > 4 - - #define STATUS_HEATERS_WIDTH 108 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111000,B01110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B11110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111000,B11110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00011111,B01100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00011111,B01100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00111100,B11110000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 - }; - - #endif // HOTENDS - - #endif // !HAS_HEATED_BED || HOTENDS > 3 - - #else // !STATUS_COMBINE_HEATERS - - // - // Status Screen Hotends bitmaps - // + #include "status/combined.h" + #else #if HAS_HOTEND - - #define STATUS_HOTEND1_WIDTH 16 - - #define MAX_HOTEND_BITMAPS 5 - #if HOTENDS > MAX_HOTEND_BITMAPS - #define STATUS_HOTEND_BITMAPS MAX_HOTEND_BITMAPS - #else - #define STATUS_HOTEND_BITMAPS HOTENDS - #endif - - #if HOTENDS == 1 || ENABLED(STATUS_HOTEND_NUMBERLESS) - - const unsigned char status_hotend_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111111,B11110000, - B00111111,B11110000, - B00011111,B11100000, - B00011111,B11100000, - B00111111,B11110000, - B00111111,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100000,B00010000, - B00100000,B00010000, - B00010000,B00100000, - B00010000,B00100000, - B00100000,B00010000, - B00100000,B00010000, - B00110000,B00110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #endif - - #elif HOTENDS >= 2 - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend1_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111110,B11110000, - B00111100,B11110000, - B00011010,B11100000, - B00011110,B11100000, - B00111110,B11110000, - B00111110,B11110000, - B00111110,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend1_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100001,B00010000, - B00100011,B00010000, - B00010101,B00100000, - B00010001,B00100000, - B00100001,B00010000, - B00100001,B00010000, - B00110001,B00110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend2_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111100,B11110000, - B00111011,B01110000, - B00011111,B01100000, - B00011110,B11100000, - B00111101,B11110000, - B00111011,B11110000, - B00111000,B01110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend2_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100011,B00010000, - B00100100,B10010000, - B00010000,B10100000, - B00010001,B00100000, - B00100010,B00010000, - B00100100,B00010000, - B00110111,B10110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #else - - const unsigned char status_hotend1_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111110,B11110000, - B00111100,B11110000, - B00111010,B11110000, - B00011110,B11100000, - B00011110,B11100000, - B00111110,B11110000, - B00111110,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend2_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111100,B11110000, - B00111011,B01110000, - B00111111,B01110000, - B00011110,B11100000, - B00011101,B11100000, - B00111011,B11110000, - B00111000,B01110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #endif - - #if STATUS_HOTEND_BITMAPS >= 3 - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend3_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111100,B11110000, - B00111011,B01110000, - B00011111,B01100000, - B00011100,B11100000, - B00111111,B01110000, - B00111011,B01110000, - B00111100,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend3_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100011,B00010000, - B00100100,B10010000, - B00010000,B10100000, - B00010011,B00100000, - B00100000,B10010000, - B00100100,B10010000, - B00110011,B00110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #else - - const unsigned char status_hotend3_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111100,B11110000, - B00111011,B01110000, - B00111111,B01110000, - B00011100,B11100000, - B00011111,B01100000, - B00111011,B01110000, - B00111100,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #endif - - #endif - - #if STATUS_HOTEND_BITMAPS >= 4 - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend4_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111011,B01110000, - B00111011,B01110000, - B00011011,B01100000, - B00011011,B01100000, - B00111000,B00110000, - B00111111,B01110000, - B00111111,B01110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend4_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100100,B10010000, - B00100100,B10010000, - B00010100,B10100000, - B00010100,B10100000, - B00100111,B11010000, - B00100000,B10010000, - B00110000,B10110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #else - - const unsigned char status_hotend4_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111011,B01110000, - B00111011,B01110000, - B00111011,B01110000, - B00011011,B01100000, - B00011000,B00100000, - B00111111,B01110000, - B00111111,B01110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #endif - - #endif - - #if STATUS_HOTEND_BITMAPS >= 5 - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend5_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111000,B01110000, - B00111011,B11110000, - B00011000,B11100000, - B00011111,B01100000, - B00111111,B01110000, - B00111011,B01110000, - B00111100,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend5_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100111,B10010000, - B00100100,B00010000, - B00010111,B00100000, - B00010000,B10100000, - B00100000,B10010000, - B00100100,B10010000, - B00110011,B00110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #else - - const unsigned char status_hotend5_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111000,B01110000, - B00111011,B11110000, - B00111000,B11110000, - B00011111,B01100000, - B00011111,B01100000, - B00111011,B01110000, - B00111100,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #endif - - #endif - - #endif - + #include "status/hotend.h" #else #define STATUS_HEATERS_HEIGHT 20 #endif - - #endif - -#endif // !STATUS_HEATERS_WIDTH && !STATUS_HOTEND1_WIDTH - -// LASER / SPINDLE -#if !STATUS_CUTTER_WIDTH && HAS_CUTTER - #define STATUS_CUTTER_WIDTH 24 - #define STATUS_CUTTER_X 80 - #if ENABLED(LASER_FEATURE) - #ifdef STATUS_CUTTER_ANIM - const unsigned char status_cutter_on_bmp[] PROGMEM = { - B00000000,B00100100,B00000000, - B00000000,B01100110,B00000000, - B00000000,B11000011,B00000000, - B00000001,B10011001,B10000000, - B00000011,B00100100,B11000000, - B00000000,B01000010,B00000000, - B00000000,B01000010,B00000000, - B00000011,B00100100,B11000000, - B00000001,B10011001,B10000000, - B00000000,B11000011,B00000000, - B00000000,B01100110,B00000000, - B00000000,B00100100,B00000000 - }; - const unsigned char status_cutter_bmp[] PROGMEM = { - B00000000,B00100100,B00000000, - B00000000,B01100110,B00000000, - B00000000,B00000000,B00000000, - B00000001,B00000000,B10000000, - B00000011,B00000000,B11000000, - B00000000,B00011000,B00000000, - B00000000,B00011000,B00000000, - B00000011,B00000000,B11000000, - B00000001,B00000000,B10000000, - B00000000,B00000000,B00000000, - B00000000,B01100110,B00000000, - B00000000,B00100100,B00000000 - }; - #else - const unsigned char status_cutter_bmp[] PROGMEM = { - B00000000,B00100100,B00000000, - B00000000,B01100110,B00000000, - B00000000,B11000011,B00000000, - B00000001,B10000001,B10000000, - B00000011,B00000000,B11000000, - B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000, - B00000011,B00000000,B11000000, - B00000001,B10000001,B10000000, - B00000000,B11000011,B00000000, - B00000000,B01100110,B00000000, - B00000000,B00100100,B00000000 - }; - #endif - #else - #ifdef STATUS_CUTTER_ANIM - const unsigned char status_cutter_on_bmp[] PROGMEM = { - B00000001,B11111110,B10000000, - B00000000,B11000000,B00000000, - B00000001,B10000000,B10000000, - B00000001,B00000000,B10000000, - B00000001,B11111100,B10000000, - B00000000,B11100000,B00000000, - B00000001,B11000000,B10000000, - B00000000,B10000001,B00000000, - B00000000,B01111010,B00000000, - B00000000,B00110100,B00000000, - B00000000,B00011000,B00000000, - B00000000,B00000000,B00000000 - }; - const unsigned char status_cutter_bmp[] PROGMEM = { - B00000001,B11111110,B10000000, - B00000000,B11000000,B00000000, - B00000001,B10000000,B10000000, - B00000001,B00000000,B10000000, - B00000001,B11111100,B10000000, - B00000000,B11100000,B00000000, - B00000001,B11000000,B10000000, - B00000000,B10000001,B00000000, - B00000000,B01111010,B00000000, - B00000000,B00110100,B00000000, - B00000000,B00011000,B00000000, - B00000000,B00000000,B00000000 - }; - #else - const unsigned char status_cutter_bmp[] PROGMEM = { - B00000001,B11000010,B10000000, - B00000001,B00011100,B10000000, - B00000000,B11100001,B00000000, - B00000001,B00001110,B10000000, - B00000001,B01110000,B10000000, - B00000000,B10000111,B10000000, - B00000001,B00111111,B10000000, - B00000000,B11111111,B00000000, - B00000000,B01111110,B00000000, - B00000000,B00111100,B00000000, - B00000000,B00011000,B00000000, - B00000000,B00000000,B00000000 - }; - #endif - #endif -#endif // LASER / SPINDLE - -// -// Default Status Screen Bed bitmaps -// -#if !STATUS_BED_WIDTH && HAS_HEATED_BED && DISABLED(STATUS_COMBINE_HEATERS) - - #if ENABLED(STATUS_ALT_BED_BITMAP) - - #define STATUS_BED_ANIM - #define STATUS_BED_WIDTH 24 - #ifndef STATUS_BED_X - #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_BED_BYTEWIDTH + STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) - #endif - #define STATUS_BED_TEXT_X (STATUS_BED_X + 11) - - const unsigned char status_bed_bmp[] PROGMEM = { - B11111111,B11111111,B11000000, - B01000000,B00000000,B00100000, - B00100000,B00000000,B00010000, - B00010000,B00000000,B00001000, - B00001000,B00000000,B00000100, - B00000100,B00000000,B00000010, - B00000011,B11111111,B11111111 - }; - - const unsigned char status_bed_on_bmp[] PROGMEM = { - B00000010,B00100010,B00000000, - B00000100,B01000100,B00000000, - B00000100,B01000100,B00000000, - B00000010,B00100010,B00000000, - B00000001,B00010001,B00000000, - B11111111,B11111111,B11000000, - B01000000,B10001000,B10100000, - B00100001,B00010001,B00010000, - B00010010,B00100010,B00001000, - B00001000,B00000000,B00000100, - B00000100,B00000000,B00000010, - B00000011,B11111111,B11111111 - }; - - #else - - #define STATUS_BED_WIDTH 21 - #ifndef STATUS_BED_X - #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_BED_BYTEWIDTH + STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) - #endif - - #ifdef STATUS_BED_ANIM - - const unsigned char status_bed_bmp[] PROGMEM = { - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - const unsigned char status_bed_on_bmp[] PROGMEM = { - B00000100,B00010000,B01000000, - B00000010,B00001000,B00100000, - B00000010,B00001000,B00100000, - B00000100,B00010000,B01000000, - B00001000,B00100000,B10000000, - B00010000,B01000001,B00000000, - B00010000,B01000001,B00000000, - B00001000,B00100000,B10000000, - B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - #else - - const unsigned char status_bed_bmp[] PROGMEM = { - B00000100,B00010000,B01000000, - B00000010,B00001000,B00100000, - B00000010,B00001000,B00100000, - B00000100,B00010000,B01000000, - B00001000,B00100000,B10000000, - B00010000,B01000001,B00000000, - B00010000,B01000001,B00000000, - B00001000,B00100000,B10000000, - B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - #endif - #endif #endif +// +// Laser / Spindle +// +#if !STATUS_CUTTER_WIDTH && HAS_CUTTER + #include "status/cutter.h" +#endif +#ifndef STATUS_CUTTER_WIDTH + #define STATUS_CUTTER_WIDTH 0 +#endif + +// +// Bed +// +#if !STATUS_BED_WIDTH && HAS_HEATED_BED && DISABLED(STATUS_COMBINE_HEATERS) + #include "status/bed.h" +#endif #ifndef STATUS_BED_WIDTH #define STATUS_BED_WIDTH 0 #endif +// +// Chamber +// #if !STATUS_CHAMBER_WIDTH && HAS_TEMP_CHAMBER && ((HOTENDS <= 4 && !HAS_HEATED_BED) || (HOTENDS <= 3 && HAS_HEATED_BED)) - #define STATUS_CHAMBER_WIDTH 21 - #if STATUS_HEATERS_WIDTH - #if ENABLED(STATUS_COMBINE_HEATERS) - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - 2 - (STATUS_CHAMBER_BYTEWIDTH) * 8) - #elif HAS_FAN0 && HAS_HEATED_BED && HOTENDS <= 2 - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - 2 - (STATUS_HEATERS_BYTEWIDTH - STATUS_CHAMBER_BYTEWIDTH) * 8) - #elif HAS_FAN0 && !HAS_HEATED_BED - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) - #else - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH) * 8) - #endif - #endif - - #ifdef STATUS_CHAMBER_ANIM - - const unsigned char status_chamber_bmp[] PROGMEM = { - B00011111,B11111111,B11111000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - const unsigned char status_chamber_on_bmp[] PROGMEM = { - B00011111,B11111111,B11111000, - B00010000,B00000000,B00001000, - B00010000,B10000100,B00001000, - B00010000,B01000010,B00001000, - B00010000,B01000010,B00001000, - B00010000,B10000100,B00001000, - B00010001,B00001000,B00001000, - B00010001,B00001000,B00001000, - B00010000,B10000100,B00001000, - B00010000,B00000000,B00001000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - #else - - const unsigned char status_chamber_bmp[] PROGMEM = { - B00011111,B11111111,B11111000, - B00010000,B00000000,B00001000, - B00010000,B10000100,B00001000, - B00010000,B01000010,B00001000, - B00010000,B01000010,B00001000, - B00010000,B10000100,B00001000, - B00010001,B00001000,B00001000, - B00010001,B00001000,B00001000, - B00010000,B10000100,B00001000, - B00010000,B00000000,B00001000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - #endif + #include "status/chamber.h" #endif - #ifndef STATUS_CHAMBER_WIDTH #define STATUS_CHAMBER_WIDTH 0 #endif @@ -881,427 +119,7 @@ // Provide default Fan Bitmaps // #if !STATUS_FAN_WIDTH && STATUS_FAN_FRAMES > 0 - - // Provide a fan animation if none exists - - #if STATUS_FAN_FRAMES <= 2 - - #define STATUS_FAN_Y 2 - #define STATUS_FAN_WIDTH 20 - - #if ENABLED(STATUS_ALT_FAN_BITMAP) - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00000001,B11111110,B00000000, - B00000110,B00000001,B10000000, - B00001000,B11111100,B01000000, - B00010000,B11111100,B00100000, - B00010000,B01111000,B00100000, - B00100000,B00110000,B00010000, - B00101100,B00000000,B11010000, - B00101110,B00110001,B11010000, - B00101111,B01111011,B11010000, - B00101111,B01111011,B11010000, - B00101110,B00110001,B11010000, - B00101100,B00000000,B11010000, - B00100000,B00110000,B00010000, - B00010000,B01111000,B00100000, - B00010000,B11111100,B00100000, - B00001000,B11111100,B01000000, - B00000110,B00000001,B10000000, - B00000001,B11111110,B00000000 - }; - - #if STATUS_FAN_FRAMES == 2 - const unsigned char status_fan1_bmp[] PROGMEM = { - B00000001,B11111110,B00000000, - B00000110,B00000001,B10000000, - B00001001,B10000110,B01000000, - B00010011,B10000111,B00100000, - B00010111,B10000111,B10100000, - B00101111,B10000111,B11010000, - B00101111,B00000011,B11010000, - B00100000,B00110000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B00110000,B00010000, - B00101111,B00000011,B11010000, - B00101111,B10000111,B11010000, - B00010111,B10000111,B10100000, - B00010011,B10000111,B00100000, - B00001001,B10000110,B01000000, - B00000110,B00000001,B10000000, - B00000001,B11111110,B00000000 - }; - #endif - - #else // !STATUS_ALT_FAN_BITMAP - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00111111,B11111111,B11110000, - B00111000,B00000000,B01110000, - B00110000,B11111100,B00110000, - B00100000,B11111100,B00010000, - B00100000,B01111000,B00010000, - B00100000,B00110000,B00010000, - B00101100,B00000000,B11010000, - B00101110,B00110001,B11010000, - B00101111,B01111011,B11010000, - B00101111,B01111011,B11010000, - B00101110,B00110001,B11010000, - B00101100,B00000000,B11010000, - B00100000,B00110000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B11111100,B00010000, - B00110000,B11111100,B00110000, - B00111000,B00000000,B01110000, - B00111111,B11111111,B11110000 - }; - - #if STATUS_FAN_FRAMES == 2 - const unsigned char status_fan1_bmp[] PROGMEM = { - B00111111,B11111111,B11110000, - B00111000,B00000000,B01110000, - B00110001,B10000110,B00110000, - B00100011,B10000111,B00010000, - B00100111,B10000111,B10010000, - B00101111,B10000111,B11010000, - B00101111,B00000011,B11010000, - B00100000,B00110000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B00110000,B00010000, - B00101111,B00000011,B11010000, - B00101111,B10000111,B11010000, - B00100111,B10000111,B10010000, - B00100011,B10000111,B00010000, - B00110001,B10000110,B00110000, - B00111000,B00000000,B01110000, - B00111111,B11111111,B11110000 - }; - #endif - - #endif // !STATUS_ALT_FAN_BITMAP - - #elif STATUS_FAN_FRAMES == 3 - - #define STATUS_FAN_WIDTH 20 - - #if ENABLED(STATUS_ALT_FAN_BITMAP) - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00000000,B11000000, - B00001001,B00000001,B00100000, - B00010111,B10000011,B11010000, - B00010111,B10000011,B11010000, - B00101111,B11000111,B11101000, - B00100111,B11000111,B11001000, - B00100001,B11111111,B00001000, - B00100000,B01111100,B00001000, - B00100000,B01111100,B00001000, - B00100000,B01111100,B00001000, - B00100001,B11111111,B00001000, - B00100111,B11000111,B11001000, - B00101111,B11000111,B11101000, - B00010111,B10000011,B11010000, - B00010111,B10000011,B11010000, - B00001001,B00000001,B00100000, - B00000110,B00000000,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan1_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00110000,B11000000, - B00001001,B11110000,B00100000, - B00010001,B11110000,B00010000, - B00010000,B11110000,B00010000, - B00100000,B11110000,B01101000, - B00100000,B00110001,B11101000, - B00100000,B00111001,B11101000, - B00100000,B01111111,B11111000, - B00111111,B11111111,B11111000, - B00111111,B11111100,B00001000, - B00101111,B00111000,B00001000, - B00101110,B00011000,B00001000, - B00101100,B00011110,B00001000, - B00010000,B00011110,B00010000, - B00010000,B00011111,B00010000, - B00001000,B00011111,B00100000, - B00000110,B00011000,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan2_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00011000,B11000000, - B00001000,B00011111,B00100000, - B00010000,B00011111,B10010000, - B00010100,B00011111,B00010000, - B00101110,B00011110,B00001000, - B00101111,B00011100,B00001000, - B00101111,B10111000,B00001000, - B00111111,B11111100,B00001000, - B00111111,B11111111,B11111000, - B00100000,B01111111,B11111000, - B00100000,B00111011,B11101000, - B00100000,B01110001,B11101000, - B00100000,B11110000,B11101000, - B00010001,B11110000,B01010000, - B00010011,B11110000,B00010000, - B00001001,B11110000,B00100000, - B00000110,B00110000,B11000000, - B00000001,B11111111,B00000000 - }; - - #else // !STATUS_ALT_FAN_BITMAP - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00000000,B11111000, - B00111001,B00000001,B00111000, - B00110111,B10000011,B11011000, - B00110111,B10000011,B11011000, - B00101111,B11000111,B11101000, - B00100111,B11000111,B11001000, - B00100001,B11111111,B00001000, - B00100000,B01111100,B00001000, - B00100000,B01111100,B00001000, - B00100000,B01111100,B00001000, - B00100001,B11111111,B00001000, - B00100111,B11000111,B11001000, - B00101111,B11000111,B11101000, - B00110111,B10000011,B11011000, - B00110111,B10000011,B11011000, - B00111001,B00000001,B00111000, - B00111110,B00000000,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan1_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00110000,B11111000, - B00111001,B11110000,B00111000, - B00110001,B11110000,B00011000, - B00110000,B11110000,B00011000, - B00100000,B11110000,B01101000, - B00100000,B00110001,B11101000, - B00100000,B00111001,B11101000, - B00100000,B01111111,B11111000, - B00111111,B11111111,B11111000, - B00111111,B11111100,B00001000, - B00101111,B00111000,B00001000, - B00101110,B00011000,B00001000, - B00101100,B00011110,B00001000, - B00110000,B00011110,B00011000, - B00110000,B00011111,B00011000, - B00111000,B00011111,B00111000, - B00111110,B00011000,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan2_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00011000,B11111000, - B00111000,B00011111,B00111000, - B00110000,B00011111,B10011000, - B00110100,B00011111,B00011000, - B00101110,B00011110,B00001000, - B00101111,B00011100,B00001000, - B00101111,B10111000,B00001000, - B00111111,B11111100,B00001000, - B00111111,B11111111,B11111000, - B00100000,B01111111,B11111000, - B00100000,B00111011,B11101000, - B00100000,B01110001,B11101000, - B00100000,B11110000,B11101000, - B00110001,B11110000,B01011000, - B00110011,B11110000,B00011000, - B00111001,B11110000,B00111000, - B00111110,B00110000,B11111000, - B00111111,B11111111,B11111000 - }; - - #endif // !STATUS_ALT_FAN_BITMAP - - #elif STATUS_FAN_FRAMES == 4 - - #define STATUS_FAN_WIDTH 20 - - #if ENABLED(STATUS_ALT_FAN_BITMAP) - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00000000,B11000000, - B00001000,B00111111,B00100000, - B00010000,B01111110,B00010000, - B00010000,B01111100,B00010000, - B00101000,B01111100,B00001000, - B00101100,B00111000,B00001000, - B00101111,B00111001,B11001000, - B00101111,B11111111,B11101000, - B00101111,B11000111,B11101000, - B00101111,B11111111,B11101000, - B00100111,B00111001,B11101000, - B00100000,B00111000,B01101000, - B00100000,B01111100,B00101000, - B00010000,B01111100,B00010000, - B00010000,B11111100,B00010000, - B00001001,B11111000,B00100000, - B00000110,B00000000,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan1_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00000000,B11000000, - B00001000,B00001111,B00100000, - B00010100,B00011111,B11010000, - B00010110,B00011111,B10010000, - B00101111,B00011111,B00001000, - B00101111,B10011110,B00001000, - B00101111,B11111100,B00001000, - B00101111,B11011100,B00001000, - B00100111,B11101111,B11001000, - B00100000,B01110111,B11101000, - B00100000,B01111111,B11101000, - B00100000,B11110011,B11101000, - B00100001,B11110001,B11101000, - B00010011,B11110000,B11010000, - B00010111,B11110000,B01010000, - B00001001,B11100000,B00100000, - B00000110,B00000000,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan2_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B10000000,B11000000, - B00001001,B10000000,B00100000, - B00010111,B10000001,B11010000, - B00010111,B11000011,B11010000, - B00100111,B11000111,B11101000, - B00100011,B11000111,B11111000, - B00100001,B11111111,B10001000, - B00100000,B01101100,B00001000, - B00100000,B01101100,B00001000, - B00100000,B01101100,B00001000, - B00100011,B11111111,B00001000, - B00111111,B11000111,B10001000, - B00101111,B11000111,B11001000, - B00010111,B10000111,B11010000, - B00010111,B00000011,B11010000, - B00001000,B00000011,B00100000, - B00000110,B00000010,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan3_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00000000,B11000000, - B00001001,B11110000,B00100000, - B00010001,B11100000,B00010000, - B00010001,B11100000,B00010000, - B00100001,B11100001,B11101000, - B00100000,B11110011,B11101000, - B00100000,B01111111,B11101000, - B00100000,B01110111,B11101000, - B00101000,B11101110,B00101000, - B00101111,B11011100,B00001000, - B00101111,B11111100,B00001000, - B00101111,B10011110,B00001000, - B00101111,B00001111,B00001000, - B00010000,B00001111,B00010000, - B00010000,B00001111,B00010000, - B00001000,B00011111,B00100000, - B00000110,B00000000,B11000000, - B00000001,B11111111,B00000000 - }; - - #else // !STATUS_ALT_FAN_BITMAP - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00000000,B11111000, - B00111000,B00111111,B00111000, - B00110000,B01111110,B00011000, - B00110000,B01111100,B00011000, - B00101000,B01111100,B00001000, - B00101100,B00111000,B00001000, - B00101111,B00111001,B11001000, - B00101111,B11111111,B11101000, - B00101111,B11000111,B11101000, - B00101111,B11111111,B11101000, - B00100111,B00111001,B11101000, - B00100000,B00111000,B01101000, - B00100000,B01111100,B00101000, - B00110000,B01111100,B00011000, - B00110000,B11111100,B00011000, - B00111001,B11111000,B00111000, - B00111110,B00000000,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan1_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00000000,B11111000, - B00111000,B00001111,B00111000, - B00110100,B00011111,B11011000, - B00110110,B00011111,B10011000, - B00101111,B00011111,B00001000, - B00101111,B10011110,B00001000, - B00101111,B11111100,B00001000, - B00101111,B11011100,B00001000, - B00100111,B11101111,B11001000, - B00100000,B01110111,B11101000, - B00100000,B01111111,B11101000, - B00100000,B11110011,B11101000, - B00100001,B11110001,B11101000, - B00110011,B11110000,B11011000, - B00110111,B11110000,B01011000, - B00111001,B11100000,B00111000, - B00111110,B00000000,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan2_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B10000000,B11111000, - B00111001,B10000000,B00111000, - B00110111,B10000001,B11011000, - B00110111,B11000011,B11011000, - B00100111,B11000111,B11101000, - B00100011,B11000111,B11111000, - B00100001,B11111111,B10001000, - B00100000,B01101100,B00001000, - B00100000,B01101100,B00001000, - B00100000,B01101100,B00001000, - B00100011,B11111111,B00001000, - B00111111,B11000111,B10001000, - B00101111,B11000111,B11001000, - B00110111,B10000111,B11011000, - B00110111,B00000011,B11011000, - B00111000,B00000011,B00111000, - B00111110,B00000010,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan3_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00000000,B11111000, - B00111001,B11110000,B00111000, - B00110001,B11100000,B00011000, - B00110001,B11100000,B00011000, - B00100001,B11100001,B11101000, - B00100000,B11110011,B11101000, - B00100000,B01111111,B11101000, - B00100000,B01110111,B11101000, - B00101000,B11101110,B00101000, - B00101111,B11011100,B00001000, - B00101111,B11111100,B00001000, - B00101111,B10011110,B00001000, - B00101111,B00001111,B00001000, - B00110000,B00001111,B00011000, - B00110000,B00001111,B00011000, - B00111000,B00011111,B00111000, - B00111110,B00000000,B11111000, - B00111111,B11111111,B11111000 - }; - - #endif // !STATUS_ALT_FAN_BITMAP - - #endif + #include "status/fan.h" #else #undef STATUS_FAN_FRAMES #define STATUS_FAN_WIDTH 0 @@ -1325,7 +143,6 @@ #endif #if ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) - // // Disable the logo bitmap if insufficient space // @@ -1341,7 +158,7 @@ #undef STATUS_LOGO_WIDTH #endif - #if !defined(STATUS_HEATERS_X) && ((HAS_MULTI_HOTEND && STATUS_LOGO_WIDTH && BED_OR_CHAMBER_OR_FAN) || (HOTENDS >= 3 && !BED_OR_CHAMBER_OR_FAN)) + #if !defined(STATUS_HEATERS_X) && ((HAS_HOTEND && STATUS_LOGO_WIDTH && BED_OR_CHAMBER_OR_FAN) || (HOTENDS >= 3 && !BED_OR_CHAMBER_OR_FAN)) #define _STATUS_HEATERS_X(H,S,N) ((LCD_PIXEL_WIDTH - (H * (S + N)) - (_EXTRA_WIDTH) + (STATUS_LOGO_WIDTH)) / 2) #if STATUS_HOTEND1_WIDTH #if HOTENDS > 2 @@ -1353,7 +170,6 @@ #define STATUS_HEATERS_X _STATUS_HEATERS_X(1, STATUS_HEATERS_WIDTH, 4) #endif #endif - #endif // @@ -1367,14 +183,18 @@ #endif #if STATUS_LOGO_WIDTH #ifndef STATUS_LOGO_X - #define STATUS_LOGO_X 0 - #endif - #ifndef STATUS_LOGO_Y - #define STATUS_LOGO_Y _MIN(0U, (20 - (STATUS_LOGO_HEIGHT)) / 2) + #ifdef STATUS_HEATERS_X + #define STATUS_LOGO_X ((STATUS_HEATERS_X - (STATUS_LOGO_WIDTH) - 1) / 2) + #else + #define STATUS_LOGO_X 0 + #endif #endif #ifndef STATUS_LOGO_HEIGHT #define STATUS_LOGO_HEIGHT (sizeof(status_logo_bmp) / (STATUS_LOGO_BYTEWIDTH)) #endif + #ifndef STATUS_LOGO_Y + #define STATUS_LOGO_Y _MAX(0L, (28L - _MIN(28L, STATUS_LOGO_HEIGHT)) / 2L) + #endif static_assert( sizeof(status_logo_bmp) == (STATUS_LOGO_BYTEWIDTH) * (STATUS_LOGO_HEIGHT), "Status logo bitmap (status_logo_bmp) dimensions don't match data." diff --git a/Marlin/src/lcd/dogm/status/bed.h b/Marlin/src/lcd/dogm/status/bed.h new file mode 100644 index 0000000000..c484a12929 --- /dev/null +++ b/Marlin/src/lcd/dogm/status/bed.h @@ -0,0 +1,110 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// lcd/dogm/status/bed.h - Status Screen Bed bitmaps +// + +#if ENABLED(STATUS_ALT_BED_BITMAP) + + #define STATUS_BED_ANIM + #define STATUS_BED_WIDTH 24 + #ifndef STATUS_BED_X + #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_BED_BYTEWIDTH + STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) + #endif + #define STATUS_BED_TEXT_X (STATUS_BED_X + 11) + + const unsigned char status_bed_bmp[] PROGMEM = { + B11111111,B11111111,B11000000, + B01000000,B00000000,B00100000, + B00100000,B00000000,B00010000, + B00010000,B00000000,B00001000, + B00001000,B00000000,B00000100, + B00000100,B00000000,B00000010, + B00000011,B11111111,B11111111 + }; + + const unsigned char status_bed_on_bmp[] PROGMEM = { + B00000010,B00100010,B00000000, + B00000100,B01000100,B00000000, + B00000100,B01000100,B00000000, + B00000010,B00100010,B00000000, + B00000001,B00010001,B00000000, + B11111111,B11111111,B11000000, + B01000000,B10001000,B10100000, + B00100001,B00010001,B00010000, + B00010010,B00100010,B00001000, + B00001000,B00000000,B00000100, + B00000100,B00000000,B00000010, + B00000011,B11111111,B11111111 + }; + +#else + + #define STATUS_BED_WIDTH 21 + #ifndef STATUS_BED_X + #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_BED_BYTEWIDTH + STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) + #endif + + #ifdef STATUS_BED_ANIM + + const unsigned char status_bed_bmp[] PROGMEM = { + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + + const unsigned char status_bed_on_bmp[] PROGMEM = { + B00000100,B00010000,B01000000, + B00000010,B00001000,B00100000, + B00000010,B00001000,B00100000, + B00000100,B00010000,B01000000, + B00001000,B00100000,B10000000, + B00010000,B01000001,B00000000, + B00010000,B01000001,B00000000, + B00001000,B00100000,B10000000, + B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + + #else + + const unsigned char status_bed_bmp[] PROGMEM = { + B00000100,B00010000,B01000000, + B00000010,B00001000,B00100000, + B00000010,B00001000,B00100000, + B00000100,B00010000,B01000000, + B00001000,B00100000,B10000000, + B00010000,B01000001,B00000000, + B00010000,B01000001,B00000000, + B00001000,B00100000,B10000000, + B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + + #endif + +#endif diff --git a/Marlin/src/lcd/dogm/status/chamber.h b/Marlin/src/lcd/dogm/status/chamber.h new file mode 100644 index 0000000000..787a90884a --- /dev/null +++ b/Marlin/src/lcd/dogm/status/chamber.h @@ -0,0 +1,89 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// lcd/dogm/status/chamber.h - Status Screen Chamber bitmaps +// + +#define STATUS_CHAMBER_WIDTH 21 +#if STATUS_HEATERS_WIDTH + #if ENABLED(STATUS_COMBINE_HEATERS) + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - 2 - (STATUS_CHAMBER_BYTEWIDTH) * 8) + #elif HAS_FAN0 && HAS_HEATED_BED && HOTENDS <= 2 + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - 2 - (STATUS_HEATERS_BYTEWIDTH - STATUS_CHAMBER_BYTEWIDTH) * 8) + #elif HAS_FAN0 && !HAS_HEATED_BED + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) + #else + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH) * 8) + #endif +#endif + +#ifdef STATUS_CHAMBER_ANIM + + const unsigned char status_chamber_bmp[] PROGMEM = { + B00011111,B11111111,B11111000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + const unsigned char status_chamber_on_bmp[] PROGMEM = { + B00011111,B11111111,B11111000, + B00010000,B00000000,B00001000, + B00010000,B10000100,B00001000, + B00010000,B01000010,B00001000, + B00010000,B01000010,B00001000, + B00010000,B10000100,B00001000, + B00010001,B00001000,B00001000, + B00010001,B00001000,B00001000, + B00010000,B10000100,B00001000, + B00010000,B00000000,B00001000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + +#else + + const unsigned char status_chamber_bmp[] PROGMEM = { + B00011111,B11111111,B11111000, + B00010000,B00000000,B00001000, + B00010000,B10000100,B00001000, + B00010000,B01000010,B00001000, + B00010000,B01000010,B00001000, + B00010000,B10000100,B00001000, + B00010001,B00001000,B00001000, + B00010001,B00001000,B00001000, + B00010000,B10000100,B00001000, + B00010000,B00000000,B00001000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + +#endif diff --git a/Marlin/src/lcd/dogm/status/combined.h b/Marlin/src/lcd/dogm/status/combined.h new file mode 100644 index 0000000000..69aad5b00e --- /dev/null +++ b/Marlin/src/lcd/dogm/status/combined.h @@ -0,0 +1,236 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// lcd/dogm/status/combined.h - Status Screen Combined Heater bitmaps +// + +#undef STATUS_HOTEND_ANIM +#undef STATUS_BED_ANIM +#define STATUS_HEATERS_XSPACE 24 + +#if HAS_HEATED_BED && HOTENDS <= 4 + + #if HOTENDS == 0 + + #define STATUS_HEATERS_WIDTH 96 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #elif HOTENDS == 1 + + #define STATUS_HEATERS_WIDTH 96 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, + B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #elif HOTENDS == 2 + + #define STATUS_HEATERS_WIDTH 96 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #elif HOTENDS == 3 + + #define STATUS_HEATERS_WIDTH 96 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #else // HOTENDS > 3 + + #define STATUS_HEATERS_WIDTH 120 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00001000,B00100000,B10000000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #endif // HOTENDS + + #define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10) + +#else // !HAS_HEATED_BED || HOTENDS > 3 + + #if HOTENDS == 0 + + #define STATUS_HEATERS_WIDTH 0 + + #elif HOTENDS == 1 + + #define STATUS_HEATERS_WIDTH 12 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111111,B11110000, + B00111111,B11110000, + B00011111,B11100000, + B00011111,B11100000, + B00111111,B11110000, + B00111111,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #elif HOTENDS == 2 + + #define STATUS_HEATERS_WIDTH 36 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000, + B00111110,B11110000,B00000000,B00111100,B11110000, + B00111100,B11110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000, + B00011110,B11100000,B00000000,B00011101,B11100000, + B00111110,B11110000,B00000000,B00111011,B11110000, + B00111110,B11110000,B00000000,B00111000,B01110000, + B00111111,B11110000,B00000000,B00111111,B11110000, + B00001111,B11000000,B00000000,B00001111,B11000000, + B00000111,B10000000,B00000000,B00000111,B10000000, + B00000011,B00000000,B00000000,B00000011,B00000000 + }; + + #elif HOTENDS == 3 + + #define STATUS_HEATERS_WIDTH 60 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 + }; + + #elif HOTENDS == 4 + + #define STATUS_HEATERS_WIDTH 84 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 + }; + + #else // HOTENDS > 4 + + #define STATUS_HEATERS_WIDTH 108 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111000,B01110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B11110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111000,B11110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00011111,B01100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00011111,B01100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00111100,B11110000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 + }; + + #endif // HOTENDS + +#endif // !HAS_HEATED_BED || HOTENDS > 3 diff --git a/Marlin/src/lcd/dogm/status/cutter.h b/Marlin/src/lcd/dogm/status/cutter.h new file mode 100644 index 0000000000..0e3b9dd188 --- /dev/null +++ b/Marlin/src/lcd/dogm/status/cutter.h @@ -0,0 +1,123 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// lcd/dogm/status/cutter.h - Status Screen Laser / Spindle bitmaps +// + +#define STATUS_CUTTER_WIDTH 24 +#define STATUS_CUTTER_X 80 + +#if ENABLED(LASER_FEATURE) + #ifdef STATUS_CUTTER_ANIM + const unsigned char status_cutter_on_bmp[] PROGMEM = { + B00000000,B00100100,B00000000, + B00000000,B01100110,B00000000, + B00000000,B11000011,B00000000, + B00000001,B10011001,B10000000, + B00000011,B00100100,B11000000, + B00000000,B01000010,B00000000, + B00000000,B01000010,B00000000, + B00000011,B00100100,B11000000, + B00000001,B10011001,B10000000, + B00000000,B11000011,B00000000, + B00000000,B01100110,B00000000, + B00000000,B00100100,B00000000 + }; + const unsigned char status_cutter_bmp[] PROGMEM = { + B00000000,B00100100,B00000000, + B00000000,B01100110,B00000000, + B00000000,B00000000,B00000000, + B00000001,B00000000,B10000000, + B00000011,B00000000,B11000000, + B00000000,B00011000,B00000000, + B00000000,B00011000,B00000000, + B00000011,B00000000,B11000000, + B00000001,B00000000,B10000000, + B00000000,B00000000,B00000000, + B00000000,B01100110,B00000000, + B00000000,B00100100,B00000000 + }; + #else + const unsigned char status_cutter_bmp[] PROGMEM = { + B00000000,B00100100,B00000000, + B00000000,B01100110,B00000000, + B00000000,B11000011,B00000000, + B00000001,B10000001,B10000000, + B00000011,B00000000,B11000000, + B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000, + B00000011,B00000000,B11000000, + B00000001,B10000001,B10000000, + B00000000,B11000011,B00000000, + B00000000,B01100110,B00000000, + B00000000,B00100100,B00000000 + }; + #endif +#else + #ifdef STATUS_CUTTER_ANIM + const unsigned char status_cutter_on_bmp[] PROGMEM = { + B00000001,B11111110,B10000000, + B00000000,B11000000,B00000000, + B00000001,B10000000,B10000000, + B00000001,B00000000,B10000000, + B00000001,B11111100,B10000000, + B00000000,B11100000,B00000000, + B00000001,B11000000,B10000000, + B00000000,B10000001,B00000000, + B00000000,B01111010,B00000000, + B00000000,B00110100,B00000000, + B00000000,B00011000,B00000000, + B00000000,B00000000,B00000000 + }; + const unsigned char status_cutter_bmp[] PROGMEM = { + B00000001,B11111110,B10000000, + B00000000,B11000000,B00000000, + B00000001,B10000000,B10000000, + B00000001,B00000000,B10000000, + B00000001,B11111100,B10000000, + B00000000,B11100000,B00000000, + B00000001,B11000000,B10000000, + B00000000,B10000001,B00000000, + B00000000,B01111010,B00000000, + B00000000,B00110100,B00000000, + B00000000,B00011000,B00000000, + B00000000,B00000000,B00000000 + }; + #else + const unsigned char status_cutter_bmp[] PROGMEM = { + B00000001,B11000010,B10000000, + B00000001,B00011100,B10000000, + B00000000,B11100001,B00000000, + B00000001,B00001110,B10000000, + B00000001,B01110000,B10000000, + B00000000,B10000111,B10000000, + B00000001,B00111111,B10000000, + B00000000,B11111111,B00000000, + B00000000,B01111110,B00000000, + B00000000,B00111100,B00000000, + B00000000,B00011000,B00000000, + B00000000,B00000000,B00000000 + }; + #endif +#endif diff --git a/Marlin/src/lcd/dogm/status/fan.h b/Marlin/src/lcd/dogm/status/fan.h new file mode 100644 index 0000000000..65f8e9c230 --- /dev/null +++ b/Marlin/src/lcd/dogm/status/fan.h @@ -0,0 +1,443 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// lcd/dogm/status/fan.h - Status Screen Fan bitmaps +// + +#undef STATUS_FAN_WIDTH +#define STATUS_FAN_WIDTH 20 + +#if STATUS_FAN_FRAMES <= 2 + + #define STATUS_FAN_Y 2 + + #if ENABLED(STATUS_ALT_FAN_BITMAP) + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00000001,B11111110,B00000000, + B00000110,B00000001,B10000000, + B00001000,B11111100,B01000000, + B00010000,B11111100,B00100000, + B00010000,B01111000,B00100000, + B00100000,B00110000,B00010000, + B00101100,B00000000,B11010000, + B00101110,B00110001,B11010000, + B00101111,B01111011,B11010000, + B00101111,B01111011,B11010000, + B00101110,B00110001,B11010000, + B00101100,B00000000,B11010000, + B00100000,B00110000,B00010000, + B00010000,B01111000,B00100000, + B00010000,B11111100,B00100000, + B00001000,B11111100,B01000000, + B00000110,B00000001,B10000000, + B00000001,B11111110,B00000000 + }; + + #if STATUS_FAN_FRAMES == 2 + const unsigned char status_fan1_bmp[] PROGMEM = { + B00000001,B11111110,B00000000, + B00000110,B00000001,B10000000, + B00001001,B10000110,B01000000, + B00010011,B10000111,B00100000, + B00010111,B10000111,B10100000, + B00101111,B10000111,B11010000, + B00101111,B00000011,B11010000, + B00100000,B00110000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B00110000,B00010000, + B00101111,B00000011,B11010000, + B00101111,B10000111,B11010000, + B00010111,B10000111,B10100000, + B00010011,B10000111,B00100000, + B00001001,B10000110,B01000000, + B00000110,B00000001,B10000000, + B00000001,B11111110,B00000000 + }; + #endif + + #else // !STATUS_ALT_FAN_BITMAP + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00111111,B11111111,B11110000, + B00111000,B00000000,B01110000, + B00110000,B11111100,B00110000, + B00100000,B11111100,B00010000, + B00100000,B01111000,B00010000, + B00100000,B00110000,B00010000, + B00101100,B00000000,B11010000, + B00101110,B00110001,B11010000, + B00101111,B01111011,B11010000, + B00101111,B01111011,B11010000, + B00101110,B00110001,B11010000, + B00101100,B00000000,B11010000, + B00100000,B00110000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B11111100,B00010000, + B00110000,B11111100,B00110000, + B00111000,B00000000,B01110000, + B00111111,B11111111,B11110000 + }; + + #if STATUS_FAN_FRAMES == 2 + const unsigned char status_fan1_bmp[] PROGMEM = { + B00111111,B11111111,B11110000, + B00111000,B00000000,B01110000, + B00110001,B10000110,B00110000, + B00100011,B10000111,B00010000, + B00100111,B10000111,B10010000, + B00101111,B10000111,B11010000, + B00101111,B00000011,B11010000, + B00100000,B00110000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B00110000,B00010000, + B00101111,B00000011,B11010000, + B00101111,B10000111,B11010000, + B00100111,B10000111,B10010000, + B00100011,B10000111,B00010000, + B00110001,B10000110,B00110000, + B00111000,B00000000,B01110000, + B00111111,B11111111,B11110000 + }; + #endif + + #endif // !STATUS_ALT_FAN_BITMAP + +#elif STATUS_FAN_FRAMES == 3 + + #if ENABLED(STATUS_ALT_FAN_BITMAP) + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00000000,B11000000, + B00001001,B00000001,B00100000, + B00010111,B10000011,B11010000, + B00010111,B10000011,B11010000, + B00101111,B11000111,B11101000, + B00100111,B11000111,B11001000, + B00100001,B11111111,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100001,B11111111,B00001000, + B00100111,B11000111,B11001000, + B00101111,B11000111,B11101000, + B00010111,B10000011,B11010000, + B00010111,B10000011,B11010000, + B00001001,B00000001,B00100000, + B00000110,B00000000,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan1_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00110000,B11000000, + B00001001,B11110000,B00100000, + B00010001,B11110000,B00010000, + B00010000,B11110000,B00010000, + B00100000,B11110000,B01101000, + B00100000,B00110001,B11101000, + B00100000,B00111001,B11101000, + B00100000,B01111111,B11111000, + B00111111,B11111111,B11111000, + B00111111,B11111100,B00001000, + B00101111,B00111000,B00001000, + B00101110,B00011000,B00001000, + B00101100,B00011110,B00001000, + B00010000,B00011110,B00010000, + B00010000,B00011111,B00010000, + B00001000,B00011111,B00100000, + B00000110,B00011000,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan2_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00011000,B11000000, + B00001000,B00011111,B00100000, + B00010000,B00011111,B10010000, + B00010100,B00011111,B00010000, + B00101110,B00011110,B00001000, + B00101111,B00011100,B00001000, + B00101111,B10111000,B00001000, + B00111111,B11111100,B00001000, + B00111111,B11111111,B11111000, + B00100000,B01111111,B11111000, + B00100000,B00111011,B11101000, + B00100000,B01110001,B11101000, + B00100000,B11110000,B11101000, + B00010001,B11110000,B01010000, + B00010011,B11110000,B00010000, + B00001001,B11110000,B00100000, + B00000110,B00110000,B11000000, + B00000001,B11111111,B00000000 + }; + + #else // !STATUS_ALT_FAN_BITMAP + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111001,B00000001,B00111000, + B00110111,B10000011,B11011000, + B00110111,B10000011,B11011000, + B00101111,B11000111,B11101000, + B00100111,B11000111,B11001000, + B00100001,B11111111,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100001,B11111111,B00001000, + B00100111,B11000111,B11001000, + B00101111,B11000111,B11101000, + B00110111,B10000011,B11011000, + B00110111,B10000011,B11011000, + B00111001,B00000001,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan1_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00110000,B11111000, + B00111001,B11110000,B00111000, + B00110001,B11110000,B00011000, + B00110000,B11110000,B00011000, + B00100000,B11110000,B01101000, + B00100000,B00110001,B11101000, + B00100000,B00111001,B11101000, + B00100000,B01111111,B11111000, + B00111111,B11111111,B11111000, + B00111111,B11111100,B00001000, + B00101111,B00111000,B00001000, + B00101110,B00011000,B00001000, + B00101100,B00011110,B00001000, + B00110000,B00011110,B00011000, + B00110000,B00011111,B00011000, + B00111000,B00011111,B00111000, + B00111110,B00011000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan2_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00011000,B11111000, + B00111000,B00011111,B00111000, + B00110000,B00011111,B10011000, + B00110100,B00011111,B00011000, + B00101110,B00011110,B00001000, + B00101111,B00011100,B00001000, + B00101111,B10111000,B00001000, + B00111111,B11111100,B00001000, + B00111111,B11111111,B11111000, + B00100000,B01111111,B11111000, + B00100000,B00111011,B11101000, + B00100000,B01110001,B11101000, + B00100000,B11110000,B11101000, + B00110001,B11110000,B01011000, + B00110011,B11110000,B00011000, + B00111001,B11110000,B00111000, + B00111110,B00110000,B11111000, + B00111111,B11111111,B11111000 + }; + + #endif // !STATUS_ALT_FAN_BITMAP + +#elif STATUS_FAN_FRAMES == 4 + + #if ENABLED(STATUS_ALT_FAN_BITMAP) + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00000000,B11000000, + B00001000,B00111111,B00100000, + B00010000,B01111110,B00010000, + B00010000,B01111100,B00010000, + B00101000,B01111100,B00001000, + B00101100,B00111000,B00001000, + B00101111,B00111001,B11001000, + B00101111,B11111111,B11101000, + B00101111,B11000111,B11101000, + B00101111,B11111111,B11101000, + B00100111,B00111001,B11101000, + B00100000,B00111000,B01101000, + B00100000,B01111100,B00101000, + B00010000,B01111100,B00010000, + B00010000,B11111100,B00010000, + B00001001,B11111000,B00100000, + B00000110,B00000000,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan1_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00000000,B11000000, + B00001000,B00001111,B00100000, + B00010100,B00011111,B11010000, + B00010110,B00011111,B10010000, + B00101111,B00011111,B00001000, + B00101111,B10011110,B00001000, + B00101111,B11111100,B00001000, + B00101111,B11011100,B00001000, + B00100111,B11101111,B11001000, + B00100000,B01110111,B11101000, + B00100000,B01111111,B11101000, + B00100000,B11110011,B11101000, + B00100001,B11110001,B11101000, + B00010011,B11110000,B11010000, + B00010111,B11110000,B01010000, + B00001001,B11100000,B00100000, + B00000110,B00000000,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan2_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B10000000,B11000000, + B00001001,B10000000,B00100000, + B00010111,B10000001,B11010000, + B00010111,B11000011,B11010000, + B00100111,B11000111,B11101000, + B00100011,B11000111,B11111000, + B00100001,B11111111,B10001000, + B00100000,B01101100,B00001000, + B00100000,B01101100,B00001000, + B00100000,B01101100,B00001000, + B00100011,B11111111,B00001000, + B00111111,B11000111,B10001000, + B00101111,B11000111,B11001000, + B00010111,B10000111,B11010000, + B00010111,B00000011,B11010000, + B00001000,B00000011,B00100000, + B00000110,B00000010,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan3_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00000000,B11000000, + B00001001,B11110000,B00100000, + B00010001,B11100000,B00010000, + B00010001,B11100000,B00010000, + B00100001,B11100001,B11101000, + B00100000,B11110011,B11101000, + B00100000,B01111111,B11101000, + B00100000,B01110111,B11101000, + B00101000,B11101110,B00101000, + B00101111,B11011100,B00001000, + B00101111,B11111100,B00001000, + B00101111,B10011110,B00001000, + B00101111,B00001111,B00001000, + B00010000,B00001111,B00010000, + B00010000,B00001111,B00010000, + B00001000,B00011111,B00100000, + B00000110,B00000000,B11000000, + B00000001,B11111111,B00000000 + }; + + #else // !STATUS_ALT_FAN_BITMAP + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111000,B00111111,B00111000, + B00110000,B01111110,B00011000, + B00110000,B01111100,B00011000, + B00101000,B01111100,B00001000, + B00101100,B00111000,B00001000, + B00101111,B00111001,B11001000, + B00101111,B11111111,B11101000, + B00101111,B11000111,B11101000, + B00101111,B11111111,B11101000, + B00100111,B00111001,B11101000, + B00100000,B00111000,B01101000, + B00100000,B01111100,B00101000, + B00110000,B01111100,B00011000, + B00110000,B11111100,B00011000, + B00111001,B11111000,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan1_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111000,B00001111,B00111000, + B00110100,B00011111,B11011000, + B00110110,B00011111,B10011000, + B00101111,B00011111,B00001000, + B00101111,B10011110,B00001000, + B00101111,B11111100,B00001000, + B00101111,B11011100,B00001000, + B00100111,B11101111,B11001000, + B00100000,B01110111,B11101000, + B00100000,B01111111,B11101000, + B00100000,B11110011,B11101000, + B00100001,B11110001,B11101000, + B00110011,B11110000,B11011000, + B00110111,B11110000,B01011000, + B00111001,B11100000,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan2_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B10000000,B11111000, + B00111001,B10000000,B00111000, + B00110111,B10000001,B11011000, + B00110111,B11000011,B11011000, + B00100111,B11000111,B11101000, + B00100011,B11000111,B11111000, + B00100001,B11111111,B10001000, + B00100000,B01101100,B00001000, + B00100000,B01101100,B00001000, + B00100000,B01101100,B00001000, + B00100011,B11111111,B00001000, + B00111111,B11000111,B10001000, + B00101111,B11000111,B11001000, + B00110111,B10000111,B11011000, + B00110111,B00000011,B11011000, + B00111000,B00000011,B00111000, + B00111110,B00000010,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan3_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111001,B11110000,B00111000, + B00110001,B11100000,B00011000, + B00110001,B11100000,B00011000, + B00100001,B11100001,B11101000, + B00100000,B11110011,B11101000, + B00100000,B01111111,B11101000, + B00100000,B01110111,B11101000, + B00101000,B11101110,B00101000, + B00101111,B11011100,B00001000, + B00101111,B11111100,B00001000, + B00101111,B10011110,B00001000, + B00101111,B00001111,B00001000, + B00110000,B00001111,B00011000, + B00110000,B00001111,B00011000, + B00111000,B00011111,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + + #endif // !STATUS_ALT_FAN_BITMAP + +#endif diff --git a/Marlin/src/lcd/dogm/status/hotend.h b/Marlin/src/lcd/dogm/status/hotend.h new file mode 100644 index 0000000000..559fa50018 --- /dev/null +++ b/Marlin/src/lcd/dogm/status/hotend.h @@ -0,0 +1,336 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// lcd/dogm/status/hotend.h - Status Screen Hotends bitmaps +// + +#define STATUS_HOTEND1_WIDTH 16 + +#define MAX_HOTEND_BITMAPS 5 +#if HOTENDS > MAX_HOTEND_BITMAPS + #define STATUS_HOTEND_BITMAPS MAX_HOTEND_BITMAPS +#else + #define STATUS_HOTEND_BITMAPS HOTENDS +#endif + +#if HOTENDS == 1 || ENABLED(STATUS_HOTEND_NUMBERLESS) + + const unsigned char status_hotend_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111111,B11110000, + B00111111,B11110000, + B00011111,B11100000, + B00011111,B11100000, + B00111111,B11110000, + B00111111,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100000,B00010000, + B00100000,B00010000, + B00010000,B00100000, + B00010000,B00100000, + B00100000,B00010000, + B00100000,B00010000, + B00110000,B00110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #endif + +#elif HOTENDS >= 2 + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend1_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111110,B11110000, + B00111100,B11110000, + B00011010,B11100000, + B00011110,B11100000, + B00111110,B11110000, + B00111110,B11110000, + B00111110,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend1_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100001,B00010000, + B00100011,B00010000, + B00010101,B00100000, + B00010001,B00100000, + B00100001,B00010000, + B00100001,B00010000, + B00110001,B00110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend2_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111100,B11110000, + B00111011,B01110000, + B00011111,B01100000, + B00011110,B11100000, + B00111101,B11110000, + B00111011,B11110000, + B00111000,B01110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend2_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100011,B00010000, + B00100100,B10010000, + B00010000,B10100000, + B00010001,B00100000, + B00100010,B00010000, + B00100100,B00010000, + B00110111,B10110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #else + + const unsigned char status_hotend1_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111110,B11110000, + B00111100,B11110000, + B00111010,B11110000, + B00011110,B11100000, + B00011110,B11100000, + B00111110,B11110000, + B00111110,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend2_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111100,B11110000, + B00111011,B01110000, + B00111111,B01110000, + B00011110,B11100000, + B00011101,B11100000, + B00111011,B11110000, + B00111000,B01110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #endif + + #if STATUS_HOTEND_BITMAPS >= 3 + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend3_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111100,B11110000, + B00111011,B01110000, + B00011111,B01100000, + B00011100,B11100000, + B00111111,B01110000, + B00111011,B01110000, + B00111100,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend3_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100011,B00010000, + B00100100,B10010000, + B00010000,B10100000, + B00010011,B00100000, + B00100000,B10010000, + B00100100,B10010000, + B00110011,B00110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #else + + const unsigned char status_hotend3_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111100,B11110000, + B00111011,B01110000, + B00111111,B01110000, + B00011100,B11100000, + B00011111,B01100000, + B00111011,B01110000, + B00111100,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #endif + + #endif + + #if STATUS_HOTEND_BITMAPS >= 4 + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend4_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011011,B01100000, + B00111000,B00110000, + B00111111,B01110000, + B00111111,B01110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend4_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100100,B10010000, + B00100100,B10010000, + B00010100,B10100000, + B00010100,B10100000, + B00100111,B11010000, + B00100000,B10010000, + B00110000,B10110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #else + + const unsigned char status_hotend4_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111011,B01110000, + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011000,B00100000, + B00111111,B01110000, + B00111111,B01110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #endif + + #endif + + #if STATUS_HOTEND_BITMAPS >= 5 + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend5_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111000,B01110000, + B00111011,B11110000, + B00011000,B11100000, + B00011111,B01100000, + B00111111,B01110000, + B00111011,B01110000, + B00111100,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend5_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100111,B10010000, + B00100100,B00010000, + B00010111,B00100000, + B00010000,B10100000, + B00100000,B10010000, + B00100100,B10010000, + B00110011,B00110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #else + + const unsigned char status_hotend5_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111000,B01110000, + B00111011,B11110000, + B00111000,B11110000, + B00011111,B01100000, + B00011111,B01100000, + B00111011,B01110000, + B00111100,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #endif + + #endif + +#endif From 3c512648daf1c2134c03be2a7dd9f7a776f08c8e Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 1 Nov 2020 23:15:06 -0300 Subject: [PATCH 0501/1370] Increase SPI Speed on LPC. Color and Classic UI for MKS SGEN L. (#19945) --- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 4 +- Marlin/src/HAL/LPC1768/include/SPI.h | 15 ++++--- Marlin/src/HAL/LPC1768/tft/tft_spi.cpp | 4 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 53 +++++++++++++++++++++++ 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index cb0d54c003..b800721c5a 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -357,8 +357,8 @@ void SPIClass::setDataSize(uint32_t ds) { void SPIClass::updateSettings() { //SSP_DeInit(_currentSetting->spi_d); //todo: need force de init?! - // divide PCLK by 2 for SSP0 - CLKPWR_SetPCLKDiv(_currentSetting->spi_d == LPC_SSP0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2); + // Divide PCLK by 2 for SSP0 + //CLKPWR_SetPCLKDiv(_currentSetting->spi_d == LPC_SSP0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2); SSP_CFG_Type HW_SPI_init; // data structure to hold init values SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode diff --git a/Marlin/src/HAL/LPC1768/include/SPI.h b/Marlin/src/HAL/LPC1768/include/SPI.h index 9da2a32556..ffcd87fe96 100644 --- a/Marlin/src/HAL/LPC1768/include/SPI.h +++ b/Marlin/src/HAL/LPC1768/include/SPI.h @@ -37,13 +37,14 @@ #define DATA_SIZE_8BIT SSP_DATABIT_8 #define DATA_SIZE_16BIT SSP_DATABIT_16 -#define SPI_CLOCK_DIV2 8333333 //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED -#define SPI_CLOCK_DIV4 4166667 //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED -#define SPI_CLOCK_DIV8 2083333 //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED -#define SPI_CLOCK_DIV16 1000000 //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED -#define SPI_CLOCK_DIV32 500000 //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 -#define SPI_CLOCK_DIV64 250000 //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 -#define SPI_CLOCK_DIV128 125000 //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h +#define SPI_CLOCK_MAX_TFT 30000000UL +#define SPI_CLOCK_DIV2 8333333 //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED +#define SPI_CLOCK_DIV4 4166667 //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED +#define SPI_CLOCK_DIV8 2083333 //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED +#define SPI_CLOCK_DIV16 1000000 //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED +#define SPI_CLOCK_DIV32 500000 //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 +#define SPI_CLOCK_DIV64 250000 //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 +#define SPI_CLOCK_DIV128 125000 //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp index 84907acd07..a2cb66ab5b 100644 --- a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp +++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp @@ -89,7 +89,7 @@ void TFT_SPI::Init() { #elif TFT_MISO_PIN == BOARD_SPI2_MISO_PIN SPIx.setModule(2); #endif - SPIx.setClock(SPI_CLOCK_MAX); + SPIx.setClock(SPI_CLOCK_MAX_TFT); SPIx.setBitOrder(MSBFIRST); SPIx.setDataMode(SPI_MODE0); } @@ -125,7 +125,7 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { } DataTransferEnd(); - SPIx.setClock(SPI_CLOCK_MAX); + SPIx.setClock(SPI_CLOCK_MAX_TFT); #endif return data >> 7; diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 0a8f3a6da8..f948c32f92 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -249,6 +249,59 @@ #define LCD_PINS_ENABLE P1_22 #define LCD_PINS_D4 P0_17 + #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI + #define TFT_CS_PIN P1_00 + #define TFT_A0_PIN P1_22 + #define TFT_DC_PIN P1_22 + #define TFT_MISO_PIN P0_08 + #define TFT_BACKLIGHT_PIN P0_18 + #define TFT_RESET_PIN P0_16 + + #define LCD_USE_DMA_SPI + + #define TOUCH_INT_PIN P0_17 + #define TOUCH_CS_PIN P0_15 + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 + + // Disable any LCD related PINs config + #define LCD_PINS_ENABLE -1 + #define LCD_PINS_RS -1 + + // XPT2046 Touch Screen calibration + #if ENABLED(TFT_CLASSIC_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11386 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8684 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 689 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -273 + #endif + #elif ENABLED(TFT_COLOR_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -16741 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11258 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 1024 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -367 + #endif + + #define TFT_BUFFER_SIZE 2400 + #endif + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #elif IS_TFTGLCD_PANEL #undef BEEPER_PIN From 172996f2b3142c68544d5fe9feb33ebcb89d5eff Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 1 Nov 2020 23:38:10 -0300 Subject: [PATCH 0502/1370] Fix STM32 HW Serial + EP compile (#19990) --- Marlin/src/HAL/STM32/HAL.cpp | 10 ++++++++-- Marlin/src/HAL/STM32/HAL.h | 1 + Marlin/src/HAL/STM32/usb_serial.cpp | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index 83604b1104..c886f9c0b9 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -81,7 +81,9 @@ void HAL_init() { SetTimerInterruptPriorities(); - TERN_(EMERGENCY_PARSER, USB_Hook_init()); + #if ENABLED(EMERGENCY_PARSER) && USBD_USE_CDC + USB_Hook_init(); + #endif } void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } @@ -128,8 +130,12 @@ uint16_t HAL_adc_get_result() { return HAL_adc_result; } void flashFirmware(const int16_t) { NVIC_SystemReset(); } // Maple Compatibility +volatile uint32_t systick_uptime_millis = 0; systickCallback_t systick_user_callback; void systick_attach_callback(systickCallback_t cb) { systick_user_callback = cb; } -void HAL_SYSTICK_Callback() { if (systick_user_callback) systick_user_callback(); } +void HAL_SYSTICK_Callback() { + systick_uptime_millis++; + if (systick_user_callback) systick_user_callback(); +} #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index a1f7515d6b..3cd138ba61 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -184,3 +184,4 @@ void flashFirmware(const int16_t); typedef void (*systickCallback_t)(void); void systick_attach_callback(systickCallback_t cb); void HAL_SYSTICK_Callback(); +extern volatile uint32_t systick_uptime_millis; diff --git a/Marlin/src/HAL/STM32/usb_serial.cpp b/Marlin/src/HAL/STM32/usb_serial.cpp index 2dd1bef12c..25c47d694f 100644 --- a/Marlin/src/HAL/STM32/usb_serial.cpp +++ b/Marlin/src/HAL/STM32/usb_serial.cpp @@ -21,7 +21,7 @@ #include "../../inc/MarlinConfigPre.h" -#if ENABLED(EMERGENCY_PARSER) +#if ENABLED(EMERGENCY_PARSER) && USBD_USE_CDC #include "usb_serial.h" #include "../../feature/e_parser.h" From b79e2d1e8d975f20a5fd426a54910682fad43179 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 2 Nov 2020 23:22:14 -0300 Subject: [PATCH 0503/1370] Add a filament runout note (#19973) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 054e90d8d9..f2884c75cb 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1170,6 +1170,12 @@ * Filament Runout Sensors * Mechanical or opto endstops are used to check for the presence of filament. * + * IMPORTANT: Runout will only trigger if Marlin is aware that a print job is running. + * Marlin knows a print job is running when: + * 1. Running a print job from media started with M24. + * 2. The Print Job Timer has been started with M75. + * 3. The heaters were turned on and PRINTJOB_TIMER_AUTOSTART is enabled. + * * RAMPS-based boards use SERVO3_PIN for the first runout sensor. * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. */ From 2ae8014da703787568ba57454885a290ec5f3635 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 3 Nov 2020 17:17:37 -0600 Subject: [PATCH 0504/1370] DWIN cleanup, preserve Z offset --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 60 ++++++++++++------------------- 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 45704d5724..5c6022d09e 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -594,7 +594,7 @@ inline void Item_Prepare_Home(const uint8_t row) { if (HMI_IsChinese()) { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else DWIN_Frame_AreaCopy(1, 43, 89, 98, 101, LBLX, MBASE(row)); #endif @@ -602,7 +602,7 @@ inline void Item_Prepare_Home(const uint8_t row) { else { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." #endif @@ -1271,14 +1271,8 @@ void HMI_Move_Z() { probe.offset.z = dwin_zoffset; TERN_(EEPROM_SETTINGS, settings.save()); #endif - if (HMI_ValueStruct.show_mode == -4) { - checkkey = Prepare; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); - } - else { - checkkey = Tune; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); - } + checkkey = HMI_ValueStruct.show_mode == -4 ? Prepare : Tune; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); DWIN_UpdateLCD(); return; } @@ -1311,11 +1305,7 @@ void HMI_Move_Z() { } if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.E_Temp)) { EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -1) { // temperature - checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); - } - else if (HMI_ValueStruct.show_mode == -2) { + if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), ui.material_preset[0].hotend_temp); @@ -1327,10 +1317,11 @@ void HMI_Move_Z() { DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), ui.material_preset[1].hotend_temp); return; } - else { // tune + else if (HMI_ValueStruct.show_mode == -1) // Temperature + checkkey = TemperatureID; + else checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); - } + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0); return; } @@ -1358,11 +1349,7 @@ void HMI_Move_Z() { } if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Bed_Temp)) { EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -1) { - checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); - } - else if (HMI_ValueStruct.show_mode == -2) { + if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), ui.material_preset[0].bed_temp); @@ -1374,10 +1361,11 @@ void HMI_Move_Z() { DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), ui.material_preset[1].bed_temp); return; } - else { + else if (HMI_ValueStruct.show_mode == -1) + checkkey = TemperatureID; + else checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); - } + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); return; } @@ -1406,11 +1394,7 @@ void HMI_Move_Z() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Fan_speed)) { EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -1) { - checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); - } - else if (HMI_ValueStruct.show_mode == -2) { + if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].fan_speed = HMI_ValueStruct.Fan_speed; DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), ui.material_preset[0].fan_speed); @@ -1422,10 +1406,11 @@ void HMI_Move_Z() { DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), ui.material_preset[1].fan_speed); return; } - else { + else if (HMI_ValueStruct.show_mode == -1) + checkkey = TemperatureID; + else checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); - } + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); return; } @@ -1844,7 +1829,8 @@ void Draw_Status_Area(const bool with_update) { #if HAS_ZOFFSET_ITEM DWIN_ICON_Show(ICON, ICON_Zoffset, 158, 428); - DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178, 429, BABY_Z_VAR * 100); + dwin_zoffset = BABY_Z_VAR; + DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178, 429, dwin_zoffset * 100); #endif if (with_update) { @@ -3573,7 +3559,7 @@ void EachMomentUpdate() { else if (dwin_abort_flag && !HMI_flag.home_flag) { // Print Stop dwin_abort_flag = false; HMI_ValueStruct.print_speed = feedrate_percentage = 100; - dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); + dwin_zoffset = BABY_Z_VAR; select_page.set(0); Goto_MainMenu(); } @@ -3681,6 +3667,7 @@ void DWIN_HandleScreen() { void DWIN_CompletedHoming() { HMI_flag.home_flag = false; + dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); if (checkkey == Last_Prepare) { checkkey = Prepare; select_prepare.now = PREPARE_CASE_HOME; @@ -3689,7 +3676,6 @@ void DWIN_CompletedHoming() { } else if (checkkey == Back_Main) { HMI_ValueStruct.print_speed = feedrate_percentage = 100; - dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); planner.finish_and_disable(); Goto_MainMenu(); } From 65383dd6166db2e3f9ba9d6ca1a0b5debc8e5f39 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 3 Nov 2020 20:21:15 -0300 Subject: [PATCH 0505/1370] Show un-mounted media slot (#20005) --- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 45eab34665..4e2cd8acc4 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -336,7 +336,7 @@ void MarlinUI::draw_status_screen() { #if ENABLED(TOUCH_SCREEN) add_control(256, 130, menu_main, imgSettings); - TERN_(SDSUPPORT, add_control(0, 130, menu_media, imgSD, card.isMounted() && !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + TERN_(SDSUPPORT, add_control(0, 130, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); #endif } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 1003f32e7c..0c44a3151b 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -341,7 +341,7 @@ void MarlinUI::draw_status_screen() { #if ENABLED(TOUCH_SCREEN) add_control(404, 180, menu_main, imgSettings); - TERN_(SDSUPPORT, add_control(12, 180, menu_media, imgSD, card.isMounted() && !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + TERN_(SDSUPPORT, add_control(12, 180, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); #endif } From 930aad6d31c983675ca011e9fcbb67750dd64b2f Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 3 Nov 2020 20:25:33 -0300 Subject: [PATCH 0506/1370] Better Classic UI touch resolution (#20004) --- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 35 ++-------- Marlin/src/lcd/touch/touch_buttons.cpp | 64 +++++-------------- Marlin/src/lcd/touch/touch_buttons.h | 30 +++++++++ Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 15 +---- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 15 +---- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 17 +---- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 15 +---- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 15 +---- 8 files changed, 59 insertions(+), 147 deletions(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 106c18cf06..8698dbb017 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -73,10 +73,8 @@ TFT_IO tftio; #define HEIGHT LCD_PIXEL_HEIGHT #define PAGE_HEIGHT 8 -#include "../scaled_tft.h" +#include "../touch/touch_buttons.h" -#define UPSCALE0(M) ((M) * (GRAPHICAL_TFT_UPSCALE)) -#define UPSCALE(A,M) (UPSCALE0(M) + (A)) #define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) #define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) @@ -276,29 +274,10 @@ static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, B01111111,B11111111,B11111111,B11111110, }; - #define BUTTON_SIZE_X 32 - #define BUTTON_SIZE_Y 20 - - // 14, 90, 166, 242, 185 are the original values upscaled 2x. - #define BUTTOND_X_LO UPSCALE0(14 / 2) - #define BUTTOND_X_HI (UPSCALE(BUTTOND_X_LO, BUTTON_SIZE_X) - 1) - - #define BUTTONA_X_LO UPSCALE0(90 / 2) - #define BUTTONA_X_HI (UPSCALE(BUTTONA_X_LO, BUTTON_SIZE_X) - 1) - - #define BUTTONB_X_LO UPSCALE0(166 / 2) - #define BUTTONB_X_HI (UPSCALE(BUTTONB_X_LO, BUTTON_SIZE_X) - 1) - - #define BUTTONC_X_LO UPSCALE0(242 / 2) - #define BUTTONC_X_HI (UPSCALE(BUTTONC_X_LO, BUTTON_SIZE_X) - 1) - - #define BUTTON_Y_LO UPSCALE0(140 / 2) + 44 // 184 2x, 254 3x - #define BUTTON_Y_HI (UPSCALE(BUTTON_Y_LO, BUTTON_SIZE_Y) - 1) - void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) { - uint16_t buffer[BUTTON_SIZE_X * sq(GRAPHICAL_TFT_UPSCALE)]; + uint16_t buffer[BUTTON_WIDTH * sq(GRAPHICAL_TFT_UPSCALE)]; - if (length > BUTTON_SIZE_X) return; + if (length > BUTTON_WIDTH) return; for (uint16_t i = 0; i < height; i++) { uint16_t k = 0; @@ -368,16 +347,16 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u // Bottom buttons #if HAS_TOUCH_XPT2046 setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); - drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR); + drawImage(buttonD, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTCANCEL_COLOR); setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI); - drawImage(buttonA, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); + drawImage(buttonA, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR); setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI); - drawImage(buttonB, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); + drawImage(buttonB, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR); setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); - drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR); + drawImage(buttonC, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTOKMENU_COLOR); #endif // HAS_TOUCH_XPT2046 return 0; diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp index eeb22aae6e..4e98486969 100644 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -29,45 +29,13 @@ XPT2046 touchIO; #include "../../lcd/marlinui.h" // For EN_C bit mask -/** - * Draw and Touch processing - * - * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. - * TOUCH_SENSOR_WIDTH/HEIGHT (320x240) is the Touch Area resolution. - * TFT_WIDTH/HEIGHT (320x240 or 480x320) is the Actual (FSMC) Display resolution. - * - * - All native (u8g) drawing is done in LCD_PIXEL_* (128x64) - * - The DOGM pixels are is upscaled 2-3x (as needed) for display. - * - Touch coordinates use TOUCH_SENSOR_* resolution and are converted to - * click and scroll-wheel events (emulating of a common DOGM display). - * - * TOUCH_SCREEN resolution exists to fit our calibration values. The original touch code was made - * and originally calibrated for 320x240. If you decide to change the resolution of the touch code, - * new calibration values will be needed. - * - * The Marlin menus are drawn scaled in the upper region of the screen. The bottom region (in a - * fixed location in TOUCH_SCREEN* coordinate space) is used for 4 general-purpose buttons to - * navigate and select menu items. Both regions are touchable. - * - * The Marlin screen touchable area starts at TFT_PIXEL_OFFSET_X/Y (translated to SCREEN_PCT_LEFT/TOP) - * and spans LCD_PIXEL_WIDTH/HEIGHT (scaled to SCREEN_PCT_WIDTH/HEIGHT). - */ +#define DOGM_AREA_LEFT TFT_PIXEL_OFFSET_X +#define DOGM_AREA_TOP TFT_PIXEL_OFFSET_Y +#define DOGM_AREA_WIDTH (GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_WIDTH) +#define DOGM_AREA_HEIGHT (GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_HEIGHT) -// Touch sensor resolution independent of display resolution -#define TOUCH_SENSOR_WIDTH 320 -#define TOUCH_SENSOR_HEIGHT 240 - -#define SCREEN_PCT_WIDE(X) ((X) * (TOUCH_SENSOR_WIDTH) / (TFT_WIDTH)) -#define SCREEN_PCT_HIGH(Y) ((Y) * (TOUCH_SENSOR_HEIGHT) / (TFT_HEIGHT)) - -#define SCREEN_PCT_LEFT SCREEN_PCT_WIDE(TFT_PIXEL_OFFSET_X) -#define SCREEN_PCT_TOP SCREEN_PCT_HIGH(TFT_PIXEL_OFFSET_Y) -#define SCREEN_PCT_WIDTH SCREEN_PCT_WIDE((GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_WIDTH)) -#define SCREEN_PCT_HEIGHT SCREEN_PCT_HIGH((GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_HEIGHT)) - -// Coordinates in terms of 240-unit-tall touch area -#define BUTTON_AREA_TOP 175 -#define BUTTON_AREA_BOT 234 +#define BUTTON_AREA_TOP BUTTON_Y_LO +#define BUTTON_AREA_BOT BUTTON_Y_HI TouchButtons touch; @@ -83,25 +51,25 @@ uint8_t TouchButtons::read_buttons() { y = uint16_t((uint32_t(y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; #if (TFT_ROTATION & TFT_ROTATE_180) - x = TOUCH_SENSOR_WIDTH - x; - y = TOUCH_SENSOR_HEIGHT - y; + x = TFT_WIDTH - x; + y = TFT_HEIGHT - y; #endif // Touch within the button area simulates an encoder button if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) - return WITHIN(x, 14, 77) ? EN_D - : WITHIN(x, 90, 153) ? EN_A - : WITHIN(x, 166, 229) ? EN_B - : WITHIN(x, 242, 305) ? EN_C + return WITHIN(x, BUTTOND_X_LO, BUTTOND_X_HI) ? EN_D + : WITHIN(x, BUTTONA_X_LO, BUTTONA_X_HI) ? EN_A + : WITHIN(x, BUTTONB_X_LO, BUTTONB_X_HI) ? EN_B + : WITHIN(x, BUTTONC_X_LO, BUTTONC_X_HI) ? EN_C : 0; - if ( !WITHIN(x, SCREEN_PCT_LEFT, SCREEN_PCT_LEFT + SCREEN_PCT_WIDTH) - || !WITHIN(y, SCREEN_PCT_TOP, SCREEN_PCT_TOP + SCREEN_PCT_HEIGHT) + if ( !WITHIN(x, DOGM_AREA_LEFT, DOGM_AREA_LEFT + DOGM_AREA_WIDTH) + || !WITHIN(y, DOGM_AREA_TOP, DOGM_AREA_TOP + DOGM_AREA_HEIGHT) ) return 0; // Column and row above BUTTON_AREA_TOP - int8_t col = (x - (SCREEN_PCT_LEFT)) * (LCD_WIDTH) / (SCREEN_PCT_WIDTH), - row = (y - (SCREEN_PCT_TOP)) * (LCD_HEIGHT) / (SCREEN_PCT_HEIGHT); + int8_t col = (x - (DOGM_AREA_LEFT)) * (LCD_WIDTH) / (DOGM_AREA_WIDTH), + row = (y - (DOGM_AREA_TOP)) * (LCD_HEIGHT) / (DOGM_AREA_HEIGHT); // Send the touch to the UI (which will simulate the encoder wheel) MarlinUI::screen_click(row, col, x, y); diff --git a/Marlin/src/lcd/touch/touch_buttons.h b/Marlin/src/lcd/touch/touch_buttons.h index 451e5a5a37..bf05d2bae5 100644 --- a/Marlin/src/lcd/touch/touch_buttons.h +++ b/Marlin/src/lcd/touch/touch_buttons.h @@ -20,6 +20,36 @@ #include +#include "../../inc/MarlinConfig.h" +#include "../scaled_tft.h" + +#define UPSCALE0(M) ((M) * (GRAPHICAL_TFT_UPSCALE)) +#define UPSCALE(A,M) (UPSCALE0(M) + (A)) + +#define BUTTON_DRAW_WIDTH 32 +#define BUTTON_DRAW_HEIGHT 20 + +#define BUTTON_WIDTH UPSCALE0(BUTTON_DRAW_WIDTH) +#define BUTTON_HEIGHT UPSCALE0(BUTTON_DRAW_HEIGHT) + +// calc the space between buttons +#define BUTTON_SPACING (((TFT_WIDTH) - (BUTTON_WIDTH * 4)) / 5) + +#define BUTTOND_X_LO BUTTON_SPACING +#define BUTTOND_X_HI BUTTOND_X_LO + BUTTON_WIDTH - 1 + +#define BUTTONA_X_LO BUTTOND_X_HI + BUTTON_SPACING +#define BUTTONA_X_HI BUTTONA_X_LO + BUTTON_WIDTH - 1 + +#define BUTTONB_X_LO BUTTONA_X_HI + BUTTON_SPACING +#define BUTTONB_X_HI BUTTONB_X_LO + BUTTON_WIDTH - 1 + +#define BUTTONC_X_LO BUTTONB_X_HI + BUTTON_SPACING +#define BUTTONC_X_HI BUTTONC_X_LO + BUTTON_WIDTH - 1 + +#define BUTTON_Y_HI (TFT_HEIGHT) - (BUTTON_SPACING / 2) +#define BUTTON_Y_LO BUTTON_Y_HI - BUTTON_HEIGHT + class TouchButtons { public: static void init(); diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index d89cfc6da8..1818727372 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -155,7 +155,7 @@ #endif // XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) +#if ANY(TFT_LVGL_UI, TFT_COLOR_UI, TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17181 #endif @@ -168,19 +168,6 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -9 #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 262a9a241b..1d6e6b3983 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -170,7 +170,7 @@ #endif // XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) +#if ANY(TFT_LVGL_UI, TFT_COLOR_UI, TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17181 #endif @@ -183,19 +183,6 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -9 #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index ff381b3753..5c3dfc2ad8 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -198,7 +198,7 @@ #endif // XPT2046 Touch Screen calibration -#if EITHER(HAS_TFT_LVGL_UI_FSMC, TFT_480x320) +#if ANY(HAS_TFT_LVGL_UI_FSMC, TFT_COLOR_UI, TFT_CLASSIC_UI) && ENABLED(TFT_RES_480x320) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION 17880 #endif @@ -211,20 +211,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET 349 #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 12149 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -8746 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -35 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 256 - #endif -#elif ENABLED(TFT_320x240) +#elif EITHER(TFT_COLOR_UI, TFT_CLASSIC_UI) && ENABLED(TFT_RES_320x240) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12246 #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 0630c0f3cb..e009d34d94 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -284,7 +284,7 @@ #endif // XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) +#if ANY(TFT_LVGL_UI, TFT_COLOR_UI, TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17253 #endif @@ -297,19 +297,6 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -24 #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11386 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8684 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 339 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -18 - #endif #endif #if HAS_WIRED_LCD && !HAS_SPI_TFT diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 818dbb5f7e..8314858d13 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -137,7 +137,7 @@ #endif // XPT2046 Touch Screen calibration -#if ENABLED(TFT_COLOR_UI) || ENABLED(TFT_LVGL_UI) +#if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -17181 #endif @@ -150,19 +150,6 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET -9 #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif #endif #if NEED_TOUCH_PINS From bbfac75f1942500dbeb2dbbba908a721bd8156de Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 3 Nov 2020 15:27:09 -0800 Subject: [PATCH 0507/1370] Add note about TMC2225/6 (#20002) --- Marlin/Configuration.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f2884c75cb..0b6234bbcc 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -674,6 +674,8 @@ * * A4988 is assumed for unspecified drivers. * + * Use TMC2208/TMC2208_STANDALONE for TMC2225 drivers and TMC2209/TMC2209_STANDALONE for TMC2226 drivers. + * * Options: A4988, A5984, DRV8825, LV8729, L6470, L6474, POWERSTEP01, * TB6560, TB6600, TMC2100, * TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE, From 67d58ccb98445f9bb491b96b82436004e5468708 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 4 Nov 2020 15:08:31 -0600 Subject: [PATCH 0508/1370] HAL support for 8s watchdog --- Marlin/src/HAL/DUE/watchdog.cpp | 2 +- Marlin/src/HAL/ESP32/watchdog.cpp | 2 ++ Marlin/src/HAL/LINUX/watchdog.cpp | 2 ++ Marlin/src/HAL/LINUX/watchdog.h | 2 -- Marlin/src/HAL/LPC1768/watchdog.cpp | 4 ++- Marlin/src/HAL/LPC1768/watchdog.h | 2 -- Marlin/src/HAL/SAMD51/watchdog.cpp | 34 ++++++++++--------- Marlin/src/HAL/STM32/watchdog.cpp | 31 +++++++++-------- Marlin/src/HAL/STM32F1/watchdog.cpp | 7 ++++ Marlin/src/HAL/STM32F1/watchdog.h | 7 ---- Marlin/src/HAL/STM32_F4_F7/watchdog.cpp | 44 +++++++++++++------------ Marlin/src/HAL/TEENSY31_32/watchdog.cpp | 4 ++- Marlin/src/HAL/TEENSY35_36/watchdog.cpp | 4 ++- Marlin/src/HAL/TEENSY40_41/watchdog.cpp | 10 ++---- 14 files changed, 82 insertions(+), 73 deletions(-) diff --git a/Marlin/src/HAL/DUE/watchdog.cpp b/Marlin/src/HAL/DUE/watchdog.cpp index 0f46971830..e144db8291 100644 --- a/Marlin/src/HAL/DUE/watchdog.cpp +++ b/Marlin/src/HAL/DUE/watchdog.cpp @@ -36,7 +36,7 @@ void watchdogSetup() { #if ENABLED(USE_WATCHDOG) // 4 seconds timeout - uint32_t timeout = 4000; + uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000); // Calculate timeout value in WDT counter ticks: This assumes // the slow clock is running at 32.768 kHz watchdog diff --git a/Marlin/src/HAL/ESP32/watchdog.cpp b/Marlin/src/HAL/ESP32/watchdog.cpp index f6fcfa3182..5ec03c4607 100644 --- a/Marlin/src/HAL/ESP32/watchdog.cpp +++ b/Marlin/src/HAL/ESP32/watchdog.cpp @@ -25,6 +25,8 @@ #if ENABLED(USE_WATCHDOG) +#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout + #include "watchdog.h" void watchdogSetup() { diff --git a/Marlin/src/HAL/LINUX/watchdog.cpp b/Marlin/src/HAL/LINUX/watchdog.cpp index c15b0e311c..84202e48b6 100644 --- a/Marlin/src/HAL/LINUX/watchdog.cpp +++ b/Marlin/src/HAL/LINUX/watchdog.cpp @@ -27,6 +27,8 @@ #include "watchdog.h" +#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout + void watchdog_init() {} void HAL_watchdog_refresh() {} diff --git a/Marlin/src/HAL/LINUX/watchdog.h b/Marlin/src/HAL/LINUX/watchdog.h index 472624cc78..49a0d9c631 100644 --- a/Marlin/src/HAL/LINUX/watchdog.h +++ b/Marlin/src/HAL/LINUX/watchdog.h @@ -21,7 +21,5 @@ */ #pragma once -#define WDT_TIMEOUT 4000000 // 4 second timeout - void watchdog_init(); void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/LPC1768/watchdog.cpp b/Marlin/src/HAL/LPC1768/watchdog.cpp index 3cd22d6651..f23ccf5b51 100644 --- a/Marlin/src/HAL/LPC1768/watchdog.cpp +++ b/Marlin/src/HAL/LPC1768/watchdog.cpp @@ -28,6 +28,8 @@ #include #include "watchdog.h" +#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout + void watchdog_init() { #if ENABLED(WATCHDOG_RESET_MANUAL) // We enable the watchdog timer, but only for the interrupt. @@ -52,7 +54,7 @@ void watchdog_init() { #else WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET); #endif - WDT_Start(WDT_TIMEOUT); + WDT_Start(WDT_TIMEOUT_US); } void HAL_watchdog_refresh() { diff --git a/Marlin/src/HAL/LPC1768/watchdog.h b/Marlin/src/HAL/LPC1768/watchdog.h index cc170881f3..c843f0ed55 100644 --- a/Marlin/src/HAL/LPC1768/watchdog.h +++ b/Marlin/src/HAL/LPC1768/watchdog.h @@ -21,8 +21,6 @@ */ #pragma once -#define WDT_TIMEOUT 4000000 // 4 second timeout - void watchdog_init(); void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/SAMD51/watchdog.cpp b/Marlin/src/HAL/SAMD51/watchdog.cpp index ebc8dffe13..9de451836a 100644 --- a/Marlin/src/HAL/SAMD51/watchdog.cpp +++ b/Marlin/src/HAL/SAMD51/watchdog.cpp @@ -24,28 +24,30 @@ #if ENABLED(USE_WATCHDOG) - #include "watchdog.h" +#include "watchdog.h" - void watchdog_init() { - // The low-power oscillator used by the WDT runs at 32,768 Hz with - // a 1:32 prescale, thus 1024 Hz, though probably not super precise. +#define WDT_TIMEOUT_REG TERN(WATCHDOG_DURATION_8S, WDT_CONFIG_PER_CYC8192, WDT_CONFIG_PER_CYC4096) // 4 or 8 second timeout - // Setup WDT clocks - MCLK->APBAMASK.bit.OSC32KCTRL_ = true; - MCLK->APBAMASK.bit.WDT_ = true; - OSC32KCTRL->OSCULP32K.bit.EN1K = true; // Enable out 1K (this is what WDT uses) +void watchdog_init() { + // The low-power oscillator used by the WDT runs at 32,768 Hz with + // a 1:32 prescale, thus 1024 Hz, though probably not super precise. - WDT->CTRLA.bit.ENABLE = false; // Disable watchdog for config - SYNC(WDT->SYNCBUSY.bit.ENABLE); + // Setup WDT clocks + MCLK->APBAMASK.bit.OSC32KCTRL_ = true; + MCLK->APBAMASK.bit.WDT_ = true; + OSC32KCTRL->OSCULP32K.bit.EN1K = true; // Enable out 1K (this is what WDT uses) - WDT->INTENCLR.reg = WDT_INTENCLR_EW; // Disable early warning interrupt - WDT->CONFIG.reg = WDT_CONFIG_PER_CYC4096; // Set at least 4s period for chip reset + WDT->CTRLA.bit.ENABLE = false; // Disable watchdog for config + SYNC(WDT->SYNCBUSY.bit.ENABLE); - HAL_watchdog_refresh(); + WDT->INTENCLR.reg = WDT_INTENCLR_EW; // Disable early warning interrupt + WDT->CONFIG.reg = WDT_TIMEOUT_REG; // Set a 4s or 8s period for chip reset - WDT->CTRLA.reg = WDT_CTRLA_ENABLE; // Start watchdog now in normal mode - SYNC(WDT->SYNCBUSY.bit.ENABLE); - } + HAL_watchdog_refresh(); + + WDT->CTRLA.reg = WDT_CTRLA_ENABLE; // Start watchdog now in normal mode + SYNC(WDT->SYNCBUSY.bit.ENABLE); +} #endif // USE_WATCHDOG diff --git a/Marlin/src/HAL/STM32/watchdog.cpp b/Marlin/src/HAL/STM32/watchdog.cpp index cc18553149..3d83408311 100644 --- a/Marlin/src/HAL/STM32/watchdog.cpp +++ b/Marlin/src/HAL/STM32/watchdog.cpp @@ -25,23 +25,26 @@ #if ENABLED(USE_WATCHDOG) - #include "../../inc/MarlinConfig.h" +#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout - #include "watchdog.h" - #include +#include "../../inc/MarlinConfig.h" - void watchdog_init() { - #if DISABLED(DISABLE_WATCHDOG_INIT) - IWatchdog.begin(4000000); // 4 sec timeout - #endif - } +#include "watchdog.h" +#include - void HAL_watchdog_refresh() { - IWatchdog.reload(); - #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) - TOGGLE(LED_PIN); // heartbeat indicator - #endif - } +void watchdog_init() { + #if DISABLED(DISABLE_WATCHDOG_INIT) + IWatchdog.begin(WDT_TIMEOUT_US); + #endif +} + +void HAL_watchdog_refresh() { + IWatchdog.reload(); + #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heartbeat indicator + #endif +} #endif // USE_WATCHDOG + #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32F1/watchdog.cpp b/Marlin/src/HAL/STM32F1/watchdog.cpp index ca91a6fe43..d37fe7dfc7 100644 --- a/Marlin/src/HAL/STM32F1/watchdog.cpp +++ b/Marlin/src/HAL/STM32F1/watchdog.cpp @@ -33,6 +33,13 @@ #include #include "watchdog.h" +/** + * The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and + * 625 reload value (counts down to 0) + * use 1250 for 8 seconds + */ +#define STM32F1_WD_RELOAD TERN(WATCHDOG_DURATION_8S, 1250, 625) // 4 or 8 second timeout + void HAL_watchdog_refresh() { #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) TOGGLE(LED_PIN); // heartbeat indicator diff --git a/Marlin/src/HAL/STM32F1/watchdog.h b/Marlin/src/HAL/STM32F1/watchdog.h index 7185d69775..72513d476c 100644 --- a/Marlin/src/HAL/STM32F1/watchdog.h +++ b/Marlin/src/HAL/STM32F1/watchdog.h @@ -27,13 +27,6 @@ #include -/** - * The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and - * 625 reload value (counts down to 0) - * use 1250 for 8 seconds - */ -#define STM32F1_WD_RELOAD 625 - // Arduino STM32F1 core now has watchdog support // Initialize watchdog with a 4 second countdown time diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp b/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp index cb12ec7aac..c0afd0cd58 100644 --- a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp @@ -25,31 +25,33 @@ #if ENABLED(USE_WATCHDOG) - #include "watchdog.h" +#include "watchdog.h" - IWDG_HandleTypeDef hiwdg; +#define WDT_TIMEOUT_COUNT TERN(WATCHDOG_DURATION_8S, 8192, 4096) // 4 or 8 second timeout - void watchdog_init() { - hiwdg.Instance = IWDG; - hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock - hiwdg.Init.Reload = 4095; //4095 counts = 4 seconds at 1024Hz - if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { - //Error_Handler(); - } - else { - #if PIN_EXISTS(LED) && DISABLED(PINS_DEBUGGING) - TOGGLE(LED_PIN); // heartbeat indicator - #endif - } +IWDG_HandleTypeDef hiwdg; + +void watchdog_init() { + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_32; // 32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock + hiwdg.Init.Reload = WDT_TIMEOUT_COUNT - 1; + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { + //Error_Handler(); } - - void HAL_watchdog_refresh() { - /* Refresh IWDG: reload counter */ - if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { - /* Refresh Error */ - //Error_Handler(); - } + else { + #if PIN_EXISTS(LED) && DISABLED(PINS_DEBUGGING) + TOGGLE(LED_PIN); // heartbeat indicator + #endif } +} + +void HAL_watchdog_refresh() { + /* Refresh IWDG: reload counter */ + if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { + /* Refresh Error */ + //Error_Handler(); + } +} #endif // USE_WATCHDOG #endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/TEENSY31_32/watchdog.cpp b/Marlin/src/HAL/TEENSY31_32/watchdog.cpp index 9f7b70d9f9..5e21236129 100644 --- a/Marlin/src/HAL/TEENSY31_32/watchdog.cpp +++ b/Marlin/src/HAL/TEENSY31_32/watchdog.cpp @@ -27,9 +27,11 @@ #include "watchdog.h" +#define WDT_TIMEOUT_MS TERN(WATCHDOG_DURATION_8S, 8000, 4000) // 4 or 8 second timeout + void watchdog_init() { WDOG_TOVALH = 0; - WDOG_TOVALL = 4000; + WDOG_TOVALL = WDT_TIMEOUT_MS; WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; } diff --git a/Marlin/src/HAL/TEENSY35_36/watchdog.cpp b/Marlin/src/HAL/TEENSY35_36/watchdog.cpp index e735ee7923..3825e27928 100644 --- a/Marlin/src/HAL/TEENSY35_36/watchdog.cpp +++ b/Marlin/src/HAL/TEENSY35_36/watchdog.cpp @@ -27,9 +27,11 @@ #include "watchdog.h" +#define WDT_TIMEOUT_MS TERN(WATCHDOG_DURATION_8S, 8000, 4000) // 4 or 8 second timeout + void watchdog_init() { WDOG_TOVALH = 0; - WDOG_TOVALL = 4000; + WDOG_TOVALL = WDT_TIMEOUT_MS; WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; } diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp index 8b05ddb153..dd7c0aa92f 100644 --- a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp +++ b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp @@ -19,31 +19,27 @@ * along with this program. If not, see . * */ +#ifdef __IMXRT1062__ /** * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ -#ifdef __IMXRT1062__ - #include "../../inc/MarlinConfig.h" #if ENABLED(USE_WATCHDOG) #include "watchdog.h" -// 4 seconds timeout -#define WDTO 4 //seconds +#define WDT_TIMEOUT TERN(WATCHDOG_DURATION_8S, 8, 4) // 4 or 8 second timeout -uint8_t timeoutval = (WDTO - 0.5f) / 0.5f; +constexpr uint8_t timeoutval = (WDT_TIMEOUT - 0.5f) / 0.5f; void watchdog_init() { - CCM_CCGR3 |= CCM_CCGR3_WDOG1(3); // enable WDOG1 clocks WDOG1_WMCR = 0; // disable power down PDE WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval); WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE; - } void HAL_watchdog_refresh() { From b767a82bd8f174c9d934c37f80ebd9716425b306 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 4 Nov 2020 23:15:19 +0200 Subject: [PATCH 0509/1370] FAST_PWM for STM32 (#20025) --- Marlin/src/HAL/STM32/HAL.h | 17 ++++++++ Marlin/src/HAL/STM32/fast_pwm.cpp | 57 ++++++++++++++++++++++++++ Marlin/src/HAL/STM32/inc/SanityCheck.h | 3 -- Marlin/src/HAL/STM32/timers.cpp | 1 - Marlin/src/HAL/STM32/timers.h | 2 + 5 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 Marlin/src/HAL/STM32/fast_pwm.cpp diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 3cd138ba61..c92c8890ea 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -185,3 +185,20 @@ typedef void (*systickCallback_t)(void); void systick_attach_callback(systickCallback_t cb); void HAL_SYSTICK_Callback(); extern volatile uint32_t systick_uptime_millis; + +#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment + +/** + * set_pwm_frequency + * Set the frequency of the timer corresponding to the provided pin + * All Timer PWM pins run at the same frequency + */ +void set_pwm_frequency(const pin_t pin, int f_desired); + +/** + * set_pwm_duty + * Set the PWM duty cycle of the provided pin to the provided value + * Optionally allows inverting the duty cycle [default = false] + * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] + */ +void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false); diff --git a/Marlin/src/HAL/STM32/fast_pwm.cpp b/Marlin/src/HAL/STM32/fast_pwm.cpp new file mode 100644 index 0000000000..cf8e16e4b1 --- /dev/null +++ b/Marlin/src/HAL/STM32/fast_pwm.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if NEEDS_HARDWARE_PWM + +#include "HAL.h" +#include "timers.h" + +void set_pwm_frequency(const pin_t pin, int f_desired) { + if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer + + PinName pin_name = digitalPinToPinName(pin); + TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); // Get HAL timer instance + + LOOP_S_L_N(i, 0, NUM_HARDWARE_TIMERS) // Protect used timers + if (timer_instance[i] && timer_instance[i]->getHandle()->Instance == Instance) + return; + + pwm_start(pin_name, f_desired, 0, RESOLUTION_8B_COMPARE_FORMAT); +} + +void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { + PinName pin_name = digitalPinToPinName(pin); + TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); + uint16_t adj_val = Instance->ARR * v / v_size; + if (invert) adj_val = Instance->ARR - adj_val; + + switch (get_pwm_channel(pin_name)) { + case TIM_CHANNEL_1: LL_TIM_OC_SetCompareCH1(Instance, adj_val); break; + case TIM_CHANNEL_2: LL_TIM_OC_SetCompareCH2(Instance, adj_val); break; + case TIM_CHANNEL_3: LL_TIM_OC_SetCompareCH3(Instance, adj_val); break; + case TIM_CHANNEL_4: LL_TIM_OC_SetCompareCH4(Instance, adj_val); break; + } +} + +#endif // NEEDS_HARDWARE_PWM diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 30d0750d90..c51fecc7bd 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -28,9 +28,6 @@ // #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" //#endif -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32." -#endif #if ENABLED(SDCARD_EEPROM_EMULATION) && DISABLED(SDSUPPORT) #undef SDCARD_EEPROM_EMULATION // Avoid additional error noise diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index 442aa74d1c..90f8c3dc94 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -27,7 +27,6 @@ // Local defines // ------------------------ -#define NUM_HARDWARE_TIMERS 2 // Default timer priorities. Override by specifying alternate priorities in the board pins file. // The TONE timer is not present here, as it currently cannot be set programmatically. It is set diff --git a/Marlin/src/HAL/STM32/timers.h b/Marlin/src/HAL/STM32/timers.h index de762794ee..2bf70fc0fa 100644 --- a/Marlin/src/HAL/STM32/timers.h +++ b/Marlin/src/HAL/STM32/timers.h @@ -43,6 +43,8 @@ #define hal_timer_t uint32_t #define HAL_TIMER_TYPE_MAX UINT16_MAX +#define NUM_HARDWARE_TIMERS 2 + #ifndef STEP_TIMER_NUM #define STEP_TIMER_NUM 0 // Timer Index for Stepper #endif From dd92c79339bcc19a4ea403ce1f03e75c8f6b8dd5 Mon Sep 17 00:00:00 2001 From: Josh Schroeder Date: Wed, 4 Nov 2020 22:15:25 -0500 Subject: [PATCH 0510/1370] Wiring warning for ANET_FULL_GRAPHICS_LCD on SKR 1.4 (#20011) --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 2b8682aac7..2fcf42d9bb 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -234,7 +234,29 @@ */ #if HAS_WIRED_LCD #if ENABLED(ANET_FULL_GRAPHICS_LCD) + #error "CAUTION! ANET_FULL_GRAPHICS_LCD requires wiring modifications. See 'pins_BTT_SKR_V1_4.h' for details. Comment out this line to continue." + /** + * 1. Cut the tab off the LCD connector so it can be plugged into the "EXP1" connector the other way. + * 2. Swap the LCD's +5V (Pin2) and GND (Pin1) wires. (This is the critical part!) + * 3. Rewire the CLK Signal (LCD Pin9) to LCD Pin7. (LCD Pin9 remains open because this pin is open drain.) + * 4. A wire is needed to connect the Reset switch at J3 (LCD Pin7) to EXP2 (Pin3) on the board. + * + * !!! If you are unsure, ask for help! Your motherboard may be damaged in some circumstances !!! + * + * The ANET_FULL_GRAPHICS_LCD connector plug: + * + * BEFORE AFTER + * _____ _____ + * GND 1 | 1 2 | 2 5V 5V 1 | 1 2 | 2 GND + * CS 3 | 3 4 | 4 BTN_EN2 CS 3 | 3 4 | 4 BTN_EN2 + * SID 5 | 5 6 6 BTN_EN1 SID 5 | 5 6 6 BTN_EN1 + * open 7 | 7 8 | 8 BTN_ENC CLK 7 | 7 8 | 8 BTN_ENC + * CLK 9 | 9 10| 10 Beeper open 9 | 9 10| 10 Beeper + * ----- ----- + * LCD LCD + */ + #define LCD_PINS_RS P1_23 #define BTN_EN1 P1_20 From b643a07b669430403147195951e22deddde7c969 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 5 Nov 2020 17:16:27 -0600 Subject: [PATCH 0511/1370] Comment, spacing cleanup --- Marlin/src/HAL/STM32/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32/fast_pwm.cpp | 2 +- Marlin/src/HAL/STM32F1/watchdog.cpp | 6 ++---- Marlin/src/HAL/STM32F1/watchdog.h | 8 +++----- Marlin/src/gcode/control/M3-M5.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 5 +++++ Marlin/src/inc/SanityCheck.h | 11 +---------- .../src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h | 2 ++ Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 6 +++--- 11 files changed, 21 insertions(+), 27 deletions(-) diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index c83376d265..702e42e561 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -113,7 +113,7 @@ bool PersistentStore::access_start() { // This must be the first time since power on that we have accessed the storage, or someone // loaded and called write_data and never called access_finish. // Lets go looking for the slot that holds our configuration. - if (eeprom_data_written) DEBUG_ECHOLN("Dangling EEPROM write_data"); + if (eeprom_data_written) DEBUG_ECHOLNPGM("Dangling EEPROM write_data"); uint32_t address = FLASH_ADDRESS_START; while (address <= FLASH_ADDRESS_END) { uint32_t address_value = (*(__IO uint32_t*)address); diff --git a/Marlin/src/HAL/STM32/fast_pwm.cpp b/Marlin/src/HAL/STM32/fast_pwm.cpp index cf8e16e4b1..99101c6e81 100644 --- a/Marlin/src/HAL/STM32/fast_pwm.cpp +++ b/Marlin/src/HAL/STM32/fast_pwm.cpp @@ -32,7 +32,7 @@ void set_pwm_frequency(const pin_t pin, int f_desired) { PinName pin_name = digitalPinToPinName(pin); TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); // Get HAL timer instance - + LOOP_S_L_N(i, 0, NUM_HARDWARE_TIMERS) // Protect used timers if (timer_instance[i] && timer_instance[i]->getHandle()->Instance == Instance) return; diff --git a/Marlin/src/HAL/STM32F1/watchdog.cpp b/Marlin/src/HAL/STM32F1/watchdog.cpp index d37fe7dfc7..b812a4fa64 100644 --- a/Marlin/src/HAL/STM32F1/watchdog.cpp +++ b/Marlin/src/HAL/STM32F1/watchdog.cpp @@ -34,9 +34,7 @@ #include "watchdog.h" /** - * The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and - * 625 reload value (counts down to 0) - * use 1250 for 8 seconds + * The watchdog clock is 40Khz. So for a 4s or 8s interval use a /256 preescaler and 625 or 1250 reload value (counts down to 0). */ #define STM32F1_WD_RELOAD TERN(WATCHDOG_DURATION_8S, 1250, 625) // 4 or 8 second timeout @@ -56,7 +54,7 @@ void watchdogSetup() { * * @return No return * - * @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0) + * @details The watchdog clock is 40Khz. So for a 4s or 8s interval use a /256 preescaler and 625 or 1250 reload value (counts down to 0). */ void watchdog_init() { #if DISABLED(DISABLE_WATCHDOG_INIT) diff --git a/Marlin/src/HAL/STM32F1/watchdog.h b/Marlin/src/HAL/STM32F1/watchdog.h index 72513d476c..68920f8cb6 100644 --- a/Marlin/src/HAL/STM32F1/watchdog.h +++ b/Marlin/src/HAL/STM32F1/watchdog.h @@ -27,11 +27,9 @@ #include -// Arduino STM32F1 core now has watchdog support - -// Initialize watchdog with a 4 second countdown time +// Initialize watchdog with a 4 or 8 second countdown time void watchdog_init(); -// Reset watchdog. MUST be called at least every 4 seconds after the -// first watchdog_init or STM32F1 will reset. +// Reset watchdog. MUST be called every 4 or 8 seconds after the +// first watchdog_init or the STM32F1 will reset. void HAL_watchdog_refresh(); diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp index 6f2409f69f..4ca103da5b 100644 --- a/Marlin/src/gcode/control/M3-M5.cpp +++ b/Marlin/src/gcode/control/M3-M5.cpp @@ -113,7 +113,7 @@ void GcodeSuite::M3_M4(const bool is_M4) { else cutter.set_power(cutter.upower_to_ocr(get_s_power())); #elif ENABLED(SPINDLE_SERVO) - cutter.set_power(get_s_power()); + cutter.set_power(get_s_power()); #else cutter.set_enabled(true); #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 6f632aa569..a2ac480f2a 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -675,6 +675,10 @@ #define HAS_BED_PROBE 1 #endif +#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + #undef PROBE_MANUALLY +#endif + #if ANY(HAS_BED_PROBE, PROBE_MANUALLY, MESH_BED_LEVELING) #define PROBE_SELECTED 1 #endif @@ -747,6 +751,7 @@ #define HAS_PROBING_PROCEDURE 1 #endif #if !HAS_LEVELING + #undef PROBE_MANUALLY #undef RESTORE_LEVELING_AFTER_G28 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index cadf84abd1..443669bb25 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1382,9 +1382,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * Unified Bed Leveling */ - // Hide PROBE_MANUALLY from the rest of the code - #undef PROBE_MANUALLY - #if IS_SCARA #error "AUTO_BED_LEVELING_UBL does not yet support SCARA printers." #elif DISABLED(EEPROM_SETTINGS) @@ -1410,13 +1407,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif ENABLED(MESH_BED_LEVELING) - // Hide PROBE_MANUALLY from the rest of the code - #undef PROBE_MANUALLY - - /** - * Mesh Bed Leveling - */ - + // Mesh Bed Leveling #if ENABLED(DELTA) #error "MESH_BED_LEVELING is not compatible with DELTA printers." #elif GRID_MAX_POINTS_X > 9 || GRID_MAX_POINTS_Y > 9 diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp index e2f2fd9346..467444c214 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp @@ -26,7 +26,7 @@ #if ENABLED(DGUS_LCD_UI_FYSETC) -#include "../DGUSDisplayDef.h" +#include "DGUSDisplayDef.h" #include "../DGUSDisplay.h" #include "../DGUSScreenHandler.h" diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h index f6a65fe8a0..910f5f7791 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h @@ -21,6 +21,8 @@ */ #pragma once +#include "../DGUSDisplayDef.h" + enum DGUSLCD_Screens : uint8_t { DGUSLCD_SCREEN_BOOT = 0, DGUSLCD_SCREEN_MAIN = 1, diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 2fcf42d9bb..8df631b677 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -256,7 +256,7 @@ * ----- ----- * LCD LCD */ - + #define LCD_PINS_RS P1_23 #define BTN_EN1 P1_20 diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index ee2afb1d26..a0a3b45043 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -13,10 +13,10 @@ env.Append(CXXFLAGS=[ # Useful for JTAG debugging # -# It will separe release and debug build folders. -# It useful when we need keep two live versions: one debug, for debugging, +# It will separe release and debug build folders. +# It useful when we need keep two live versions: one debug, for debugging, # other release, for flashing. # Without this, PIO will recompile everything twice for any small change. -# +# if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' From 5082106145caadc0952c00f7830179354562ad9e Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 5 Nov 2020 16:10:18 -0800 Subject: [PATCH 0512/1370] Fix BTT002 PeripheralPins PWM assignments (#20036) --- .../variants/BIGTREE_BTT002/PeripheralPins.c | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c index cff269db0b..bee09b15b1 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c @@ -114,14 +114,10 @@ const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED const PinMap PinMap_PWM[] = { - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 HEATER0 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 HEATER1 - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 HEATER2 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 BED - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN0 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN2 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 EXTENSION1-4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 BED + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 HEATER0 + {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 FAN0 + {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 FAN1 /** * Unused by specifications on BTT002. (PLEASE CONFIRM) @@ -132,9 +128,9 @@ const PinMap PinMap_PWM[] = { */ //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 BLTOUCH is a "servo" + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BLTOUCH is a "servo" + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 @@ -154,8 +150,10 @@ const PinMap PinMap_PWM[] = { //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 @@ -163,9 +161,7 @@ const PinMap PinMap_PWM[] = { //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N @@ -180,7 +176,11 @@ const PinMap PinMap_PWM[] = { //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + //{PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 //{PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 //{PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N From 1767a3bd7072059e620d054af4a0b8d8fb30a04e Mon Sep 17 00:00:00 2001 From: Sergey1560 <53866542+Sergey1560@users.noreply.github.com> Date: Fri, 6 Nov 2020 03:13:21 +0300 Subject: [PATCH 0513/1370] Don't close diveDir in fileExists (#20035) --- Marlin/src/sd/cardreader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index a633440ff6..5a914050c4 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -637,7 +637,7 @@ bool CardReader::fileExists(const char * const path) { if (fname) { diveDir->rewind(); selectByName(*diveDir, fname); - diveDir->close(); + //diveDir->close(); } return !!fname; } From 10c8647c1b4d902dfa15bbe02a4a0ba990406f50 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 5 Nov 2020 16:15:29 -0800 Subject: [PATCH 0514/1370] Fix 0 extruders & bed compile (#20030) --- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 3 +++ Marlin/src/lcd/menu/menu_temperature.cpp | 9 ++------- buildroot/tests/rambo-tests | 10 ++++++++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index d07474d810..85654b9189 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -104,6 +104,9 @@ #if DO_DRAW_HOTENDS #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) +#endif + +#if EITHER(DO_DRAW_BED, DO_DRAW_HOTENDS) #define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1) #endif diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 28ea54efba..f914301328 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -63,15 +63,14 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #if HAS_TEMP_HOTEND inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } - #if HAS_HEATED_BED - inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } - #endif + void do_preheat_end_m() { _preheat_end(editable.int8, 0); } #endif #if HAS_HEATED_BED inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } #endif #if HAS_TEMP_HOTEND && HAS_HEATED_BED + inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ @@ -86,10 +85,6 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #endif - void do_preheat_end_m() { - _preheat_end(editable.int8, 0); - } - #if HAS_MULTI_HOTEND || HAS_HEATED_BED // Set editable.int8 to the Material index before entering this menu diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index ec8af16c23..6fc720d1e1 100644 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -60,6 +60,16 @@ opt_enable USE_XMAX_PLUG USE_YMAX_PLUG USE_ZMAX_PLUG \ opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS exec_test $1 $2 "Rambo CNC Configuration" +# +# Rambo heated bed only +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMBO +opt_set EXTRUDERS 0 +opt_set TEMP_SENSOR_BED 1 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +exec_test $1 $2 "Rambo heated bed only" + # # Build with the default configurations # From 35d7618117b7ecb4f1aa21d1c3cd17a55ebb1ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Jovan=C3=AD=20Gonz=C3=A1lez?= Date: Fri, 6 Nov 2020 01:16:08 +0100 Subject: [PATCH 0515/1370] Add Spanish translations (#20020) --- Marlin/src/lcd/language/language_es.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index c77b12ee77..ca7328c3e6 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -43,9 +43,11 @@ namespace Language_es { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD/USB insertado"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD/USB retirado"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Esperando al SD/USB"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Fallo al iniciar SD"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Error lectura SD/USB"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbordamiento de subllamada"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops"); PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); @@ -60,6 +62,10 @@ namespace Language_es { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Origen Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Origen Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto alineado Z"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Recorrido asistido"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Iteración: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("¡Precisión disminuyendo!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Precisión conseguida"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Pulsar para comenzar"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Siguiente punto"); From 9ba113bc05d9306e7560803d022f3052c0760007 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 6 Nov 2020 19:09:29 -0600 Subject: [PATCH 0516/1370] Clean up corrected urls --- Marlin/src/core/multi_language.h | 2 +- Marlin/src/lcd/extui/example.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h | 2 +- .../lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp | 2 +- .../lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h | 2 +- .../ftdi_eve_lib/extended/command_processor.cpp | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp | 2 +- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h | 2 +- .../ftdi_eve_lib/extended/unicode/font_bitmaps.cpp | 2 +- .../ftdi_eve_lib/extended/unicode/font_bitmaps.h | 2 +- .../ftdi_eve_lib/extended/unicode/font_size_t.cpp | 2 +- .../ftdi_eve_lib/extended/unicode/font_size_t.h | 2 +- .../ftdi_eve_lib/extended/unicode/standard_char_set.cpp | 2 +- .../ftdi_eve_lib/extended/unicode/standard_char_set.h | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h | 2 +- .../ftdi_eve_lib/extended/unicode/western_char_set.cpp | 2 +- .../ftdi_eve_lib/extended/unicode/western_char_set.h | 2 +- .../ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp | 2 +- .../ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp | 2 +- .../screens/base_numeric_adjustment_screen.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h | 2 +- .../lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h | 2 +- .../lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp | 2 +- .../screens/confirm_abort_print_dialog_box.cpp | 2 +- .../screens/confirm_auto_calibration_dialog_box.cpp | 2 +- .../screens/confirm_erase_flash_dialog_box.cpp | 2 +- .../screens/confirm_start_print_dialog_box.cpp | 2 +- .../screens/confirm_user_request_alert_box.cpp | 2 +- .../ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp | 2 +- .../screens/stepper_bump_sensitivity_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp | 2 +- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h | 2 +- .../lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h | 2 +- .../lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h | 2 +- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/lcd/extui/ui_api.h | 2 +- Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp | 2 +- Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h | 2 +- 143 files changed, 143 insertions(+), 143 deletions(-) diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h index 5852c439a8..6af4af2f8d 100644 --- a/Marlin/src/core/multi_language.h +++ b/Marlin/src/core/multi_language.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp index a5ef5652bc..592d67214d 100644 --- a/Marlin/src/lcd/extui/example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp index 2c466ffd04..a64c237fa1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../compat.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h index 3edc2a9de1..eef8cf8677 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ class SPIFlash { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp index 46683401dc..8d2d74ea26 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../compat.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h index fcaa610e8b..be393a952c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h index 11ad0798b5..741b7076d1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h index 7476c9e67e..76b231536b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h index c09d10f148..6bb920885a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index bb95411e06..f64f2b5b5f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_basic.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h index a9fdb5c5c7..74a7f29800 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /**************************************************************************** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h index 1e6642fedc..507e251518 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /**************************************************************************** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h index 75a2d54fca..47cd698253 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h index 4063bf2d5d..26053709d3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /**************************************************************************** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h index 448717b478..e57d11c3a7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /**************************************************************************** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h index 8d455907e9..d90fc1e8f0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp index d91d08fbfa..a9b46e013b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_basic.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h index 30ec786c60..e3a23d768f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h index 436c67edf2..cd41a5fe06 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h index b763c890c2..73260703c2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp index 7224b681bb..a7777a97fe 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h index 94ccbb7a60..b27ed7f59e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp index baed9f8502..9f2b6dd35f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h index da927aeae2..44934f909a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp index 3dd2b88b19..0808f2f4f2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h index d9bede92df..c5f08297be 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h index 6e4d0668fe..006978babb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h index e3c3ebb39d..490cbd4e54 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h index 7da6213211..202c3cd7fb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h index 2b18244e22..62762ee964 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp index 57a9e3e89b..81a081faae 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h index d1f84c8a6e..ef92361498 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h index fbdfe2fe99..20df15a91e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp index 6a5b6e3cf8..481589854b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h index e2650b10ae..fcfe70bd76 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp index 3616f15ab6..18e5d4bc5b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h index 261995147c..9d8cd44061 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp index b2f62f060c..a69280f5fc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h index 7852b7ec3e..a2d8aa9443 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp index 58ec96ac15..84233c5ce3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h index 700da7bcf2..f64d033d52 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp index c5126721ab..e288d27030 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h index f1e22e17dd..185b53e6ff 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp index 733cf8f660..0e251f7bb1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h index f5bf644ef9..a2cb8b25c9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp index b50c12fc6d..b795e01d42 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h index 7decdfd38f..e320bd7344 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ namespace FTDI { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp index bee3f74cab..d21b7f0e7f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h index 16f7e197b5..566f212187 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp index 4aa2580c63..af0f5cb843 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h index 2adad2327a..652bd6b2eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ namespace FTDI { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h index 3426e1377d..3f85cf02aa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h index 5357de3ef3..6695134046 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py index da08014e89..c6eba3946c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py @@ -56,7 +56,7 @@ header = ''' * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h index 5c1a74f66e..c5ddbb4a61 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp index 912c95731d..e4ecdc8b49 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h index 873e84455a..cbc05c5aa3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index ce60ab5090..807c816307 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index fe68faefee..ed7e653af1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "compat.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h index 5ad84c60b0..ae95a64709 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp index 9cd17637bd..952f0cac02 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index cfb268f0b4..1b7d043314 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp index bd09d2a5cd..89d9f05330 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp index 8d65518455..58f4544ffc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp index 1c4ef594bb..10cbd3bc62 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp index c84dd45f00..16b26e6821 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index a11609dd97..eb8f742313 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp index 76ebdca587..b2611be250 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp index da772971ce..85885fb388 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp index 48ce320482..102631f18e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp index e2bb8a2414..5ddc2d02ae 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h index 9279fd7df0..4faddc64b1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h index f03e3413f8..50fc5ab9f8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index c5e26da98a..fc6dc5ee57 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index e881995f2e..2515732d43 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp index 0d8d71b45c..9723abba09 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp index 4ce8f608f1..e79f25fcb5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp index 776a9fe5f7..5b2b7d4116 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index 60394d06df..3f85fc9320 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp index eb3e2a3e01..528d93d5d1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp index 7e1a82025d..f7c85672af 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp index 574de21088..baf5959c1b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp index 4e5b174d53..0dbee2414d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index 6b6affadd5..93dfcba47d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp index 8496955f73..203b2b037e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp index 8e56c4197b..3a5abf9449 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp index 782ae7bbc7..2ae3d7b049 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp index 8845dfb5c0..1a4d9fd705 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp index 7f3f507fd6..41f72e8e53 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp index 2698708e51..28f0e6a731 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp index 82ee118e4c..dfdba33b08 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp index f1808bf20e..c281ccb050 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index f4c224dbe8..90e3040079 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp index c806ef499b..3f0e25f734 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp index 25a44c1adb..8fb813e79f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp index b96c2be7c8..9c751bc345 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp index d365b12eb1..329fa6c97f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp index d98324623c..273da348c1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp index 5b4c1c9175..6c5dfcfa9f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index a91d48c037..a202a611ec 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp index 8a5c675fac..2feaa03295 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp index 7854ce5e39..35bbd7ad90 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 53e3ab00c7..17e15afc5c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp index 29ac2f1b40..fdbb9623b5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp index 2316f93ee2..ac1374b99a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp index d7e476e04e..8912663f27 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index 5dd3174821..06faf303e2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp index 07d6900c16..85c7206b04 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp index ed3c8d999b..aac0f9a277 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp index a8891162ea..03f9e2c465 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp index 69eecaf54b..c3110b77dc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp index 94b8ac0fb5..9be2239797 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp index f4a99accd6..350e2de7eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index dc38890a0e..dab411a256 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 16aa682168..64927d58d9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 71fc7d9ee3..7b062045f9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp index de7eb92a88..a4464c1e49 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp index cb26324808..0e224da967 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index fc7453fca7..8aef5dd413 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp index 693d125fbf..84d76dcefa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp index 136582f09a..d6e36c1efa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp index 92035d1b1c..e9bc50ae45 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp index 44ee453f15..2ffbdb9b8e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp index b7ce76ecd2..c3114a3922 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h index e37a82d28a..545c701700 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp index c254d2997f..e320bf5a01 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp index 436445024a..185512b57b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp index 8c3bc856b3..cd5cedf463 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index 258ee4b04f..894b238ae0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp index d7c4562041..6a9acbf8f1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp index f5cd03697c..dd211e3439 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h index 2cb039c84d..8c0366ebeb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h index 4e2fde6ab3..cdcf00a21b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h index 63115b4187..bdb9d492ab 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h index eb9cadeba1..e023599a27 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h index dd5088e0ce..e3a30a6dfe 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp index f4a80bcc09..afbed0cab1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../compat.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h index b2b8890386..66c1cb810c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h index df7782ce87..e0f0f31da5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 80033e911b..ac8e6ebf88 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -38,7 +38,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 48d0e97220..c429a0aade 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -39,7 +39,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp index 6d2182cb8b..358b49d5b4 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /* What follows is a modified version of the MAX3421e originally defined in diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h index 07ca811a4d..5c3b852d55 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once From afed97bf0eb2ee2db61f813b8133f1274a641f94 Mon Sep 17 00:00:00 2001 From: Mauro Date: Sat, 7 Nov 2020 02:28:41 +0100 Subject: [PATCH 0517/1370] Fix E4d@box pins, stepper i2s (#20055) --- Marlin/src/pins/esp32/pins_E4D.h | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index ebb8e1af7d..2a1f070dda 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -31,7 +31,7 @@ #error "Oops! Select an ESP32 board in 'Tools > Board.'" #elif EXTRUDERS > 1 || E_STEPPERS > 1 #error "E4d@box only supports one E Stepper. Comment out this line to continue." -#elif HOTENDS > 2 +#elif HOTENDS > 1 #error "E4d@box currently supports only one hotend. Comment out this line to continue." #endif @@ -39,6 +39,21 @@ #define BOARD_WEBSITE_URL "github.com/Exilaus/E4d@box" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +// +// Disable I2S stepper stream +// +#undef I2S_STEPPER_STREAM + +// +// Redefine I2S for ESP32 +// +#undef I2S_WS +#define I2S_WS 23 +#undef I2S_BCK +#define I2S_BCK 22 +#undef I2S_DATA +#define I2S_DATA 21 + // // Limit Switches // @@ -82,9 +97,11 @@ #define FAN_PIN 0 #define HEATER_BED_PIN 15 -// SPI +// +// MicroSD card on SPI +// +#define MOSI_PIN 23 +#define MISO_PIN 19 +#define SCK_PIN 18 #define SDSS 5 -#define I2S_STEPPER_STREAM -#define I2S_WS 23 -#define I2S_BCK 22 -#define I2S_DATA 21 +#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers From e49f267c4ae6d8f7b500f85da4c3414b2a01d3b6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 6 Nov 2020 20:16:30 -0600 Subject: [PATCH 0518/1370] Use nullptr --- .../extended/unicode/western_char_set.cpp | 2 +- .../ftdi_eve_lib/extras/poly_ui.h | 4 ++-- Marlin/src/lcd/tft/tft_string.h | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp index af0f5cb843..171637f03a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp @@ -435,7 +435,7 @@ base_char = base_special ? NO_DOT_I : std_char; } - // If cmd != NULL, draw the glyph to the screen + // If cmd != nullptr, draw the glyph to the screen if (cmd) { ext_vertex2ii(*cmd, x, y, base_special ? alt_font : std_font, base_char); if (accent_char) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h index a501de20ba..ba41650f2f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h @@ -90,7 +90,7 @@ class PolyReader { if (start_x != eol) close_loop(); else - p = NULL; + p = nullptr; } else { x = pgm_read_word_far(p++); @@ -106,7 +106,7 @@ class PolyReader { } } - bool has_more() { return p != NULL; } + bool has_more() { return p != nullptr; } bool end_of_loop() { return start_x == eol; } }; diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h index 924d6de430..e800b1ded9 100644 --- a/Marlin/src/lcd/tft/tft_string.h +++ b/Marlin/src/lcd/tft/tft_string.h @@ -80,22 +80,22 @@ class TFT_String { static font_t *font() { return font_header; }; static uint16_t font_height() { return font_header->FontAscent - font_header->FontDescent; } - static glyph_t *glyph(uint8_t character) { return glyphs[character] == NULL ? glyphs[0x3F] : glyphs[character]; } /* Use '?' for unknown glyphs */ + static glyph_t *glyph(uint8_t character) { return glyphs[character] ?: glyphs[0x3F]; } /* Use '?' for unknown glyphs */ static inline glyph_t *glyph(uint8_t *character) { return glyph(*character); } static void set(); static void add(uint8_t character) { add_character(character); eol(); } static void add(uint8_t *string); - static void add(uint8_t *string, int8_t index, uint8_t *itemString = NULL); + static void add(uint8_t *string, int8_t index, uint8_t *itemString=nullptr); static void set(uint8_t *string) { set(); add(string); }; - static void set(uint8_t *string, int8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; + static void set(uint8_t *string, int8_t index, const char *itemString=nullptr) { set(); add(string, index, (uint8_t *)itemString); }; static inline void set(const char *string) { set((uint8_t *)string); } - static inline void set(const char *string, int8_t index, const char *itemString = NULL) { set((uint8_t *)string, index, itemString); } + static inline void set(const char *string, int8_t index, const char *itemString=nullptr) { set((uint8_t *)string, index, itemString); } static inline void add(const char *string) { add((uint8_t *)string); } - static void trim(uint8_t character = 0x20); - static void rtrim(uint8_t character = 0x20); - static void ltrim(uint8_t character = 0x20); + static void trim(uint8_t character=0x20); + static void rtrim(uint8_t character=0x20); + static void ltrim(uint8_t character=0x20); static uint16_t width() { return span; } static uint8_t *string() { return data; } static uint16_t center(uint16_t width) { return span > width ? 0 : (width - span) / 2; } From 2dd1522e30257efc092b5ffdf7a5a9c41cd8a16c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 7 Nov 2020 00:07:15 -0300 Subject: [PATCH 0519/1370] Standardize Marlin SPI (part 1) (#19989) --- .github/workflows/test-builds.yml | 1 + Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 39 ++--- Marlin/src/HAL/LPC1768/MarlinSPI.h | 45 +++++ Marlin/src/HAL/LPC1768/include/SPI.h | 5 + Marlin/src/HAL/STM32/MarlinSPI.cpp | 161 ++++++++++++++++++ Marlin/src/HAL/STM32/MarlinSPI.h | 107 ++++++++++++ Marlin/src/HAL/STM32/timers.h | 2 +- Marlin/src/HAL/STM32F1/MarlinSPI.h | 45 +++++ Marlin/src/HAL/STM32F1/SPI.cpp | 12 ++ Marlin/src/HAL/STM32F1/SPI.h | 5 + Marlin/src/lcd/lcdprint.cpp | 7 +- Marlin/src/lcd/tft/tft_string.cpp | 38 +++-- Marlin/src/libs/W25Qxx.cpp | 30 ++-- Marlin/src/libs/W25Qxx.h | 4 + Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 3 + buildroot/tests/mks_robin_nano35-tests | 2 +- buildroot/tests/mks_robin_nano35_stm32-tests | 69 ++++++++ 17 files changed, 522 insertions(+), 53 deletions(-) create mode 100644 Marlin/src/HAL/LPC1768/MarlinSPI.h create mode 100644 Marlin/src/HAL/STM32/MarlinSPI.cpp create mode 100644 Marlin/src/HAL/STM32/MarlinSPI.h create mode 100644 Marlin/src/HAL/STM32F1/MarlinSPI.h create mode 100644 buildroot/tests/mks_robin_nano35_stm32-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 9624733838..41b3047485 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -83,6 +83,7 @@ jobs: - STM32F103RET6_creality - LERDGEX - mks_robin_nano35 + - mks_robin_nano35_stm32 - NUCLEO_F767ZI # Put lengthy tests last diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index b800721c5a..16ac789fc0 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -127,11 +127,9 @@ for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]); } - void spiSend(uint32_t chan, byte b) { - } + void spiSend(uint32_t chan, byte b) {} - void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) { - } + void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {} // Read single byte from SPI uint8_t spiRec() { return doio(0xFF); } @@ -143,9 +141,7 @@ for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF); } - uint8_t spiTransfer(uint8_t b) { - return doio(b); - } + uint8_t spiTransfer(uint8_t b) { return doio(b); } // Write from buffer to SPI void spiSendBlock(uint8_t token, const uint8_t* buf) { @@ -201,6 +197,15 @@ SPIClass::SPIClass(uint8_t device) { GPDMA_Init(); } +SPIClass::SPIClass(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel) { + #if BOARD_NR_SPI >= 1 + if (mosi == BOARD_SPI1_MOSI_PIN) SPIClass(1); + #endif + #if BOARD_NR_SPI >= 2 + if (mosi == BOARD_SPI2_MOSI_PIN) SPIClass(2); + #endif +} + void SPIClass::begin() { // Init the SPI pins in the first begin call if ((_currentSetting->spi_d == LPC_SSP0 && spiInitialised[0] == false) || @@ -331,25 +336,15 @@ void SPIClass::read(uint8_t *buf, uint32_t len) { for (uint16_t i = 0; i < len; i++) buf[i] = transfer(0xFF); } -void SPIClass::setClock(uint32_t clock) { - _currentSetting->clock = clock; -} +void SPIClass::setClock(uint32_t clock) { _currentSetting->clock = clock; } -void SPIClass::setModule(uint8_t device) { - _currentSetting = &_settings[device - 1];// SPI channels are called 1 2 and 3 but the array is zero indexed -} +void SPIClass::setModule(uint8_t device) { _currentSetting = &_settings[device - 1]; } // SPI channels are called 1, 2, and 3 but the array is zero-indexed -void SPIClass::setBitOrder(uint8_t bitOrder) { - _currentSetting->bitOrder = bitOrder; -} +void SPIClass::setBitOrder(uint8_t bitOrder) { _currentSetting->bitOrder = bitOrder; } -void SPIClass::setDataMode(uint8_t dataMode) { - _currentSetting->dataMode = dataMode; -} +void SPIClass::setDataMode(uint8_t dataMode) { _currentSetting->dataMode = dataMode; } -void SPIClass::setDataSize(uint32_t ds) { - _currentSetting->dataSize = ds; -} +void SPIClass::setDataSize(uint32_t dataSize) { _currentSetting->dataSize = dataSize; } /** * Set up/tear down diff --git a/Marlin/src/HAL/LPC1768/MarlinSPI.h b/Marlin/src/HAL/LPC1768/MarlinSPI.h new file mode 100644 index 0000000000..fab245f904 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/MarlinSPI.h @@ -0,0 +1,45 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +/** + * Marlin currently requires 3 SPI classes: + * + * SPIClass: + * This class is normally provided by frameworks and has a semi-default interface. + * This is needed because some libraries reference it globally. + * + * SPISettings: + * Container for SPI configs for SPIClass. As above, libraries may reference it globally. + * + * These two classes are often provided by frameworks so we cannot extend them to add + * useful methods for Marlin. + * + * MarlinSPI: + * Provides the default SPIClass interface plus some Marlin goodies such as a simplified + * interface for SPI DMA transfer. + * + */ + +using MarlinSPI = SPIClass; diff --git a/Marlin/src/HAL/LPC1768/include/SPI.h b/Marlin/src/HAL/LPC1768/include/SPI.h index ffcd87fe96..ecd91f6a3b 100644 --- a/Marlin/src/HAL/LPC1768/include/SPI.h +++ b/Marlin/src/HAL/LPC1768/include/SPI.h @@ -126,6 +126,11 @@ public: */ SPIClass(uint8_t spiPortNumber); + /** + * Init using pins + */ + SPIClass(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel = (pin_t)-1); + /** * Select and configure the current selected SPI device to use */ diff --git a/Marlin/src/HAL/STM32/MarlinSPI.cpp b/Marlin/src/HAL/STM32/MarlinSPI.cpp new file mode 100644 index 0000000000..fd05b1aeb4 --- /dev/null +++ b/Marlin/src/HAL/STM32/MarlinSPI.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "MarlinSPI.h" + +static void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb, uint32_t dataSize) { + spi_init(obj, speed, mode, msb); + // spi_init set 8bit always + // TODO: copy the code from spi_init and handle data size, to avoid double init always!! + if (dataSize != SPI_DATASIZE_8BIT) { + obj->handle.Init.DataSize = dataSize; + HAL_SPI_Init(&obj->handle); + __HAL_SPI_ENABLE(&obj->handle); + } +} + +void MarlinSPI::setClockDivider(uint8_t _div) { + _speed = spi_getClkFreq(&_spi);// / _div; + _clockDivider = _div; +} + +void MarlinSPI::begin(void) { + //TODO: only call spi_init if any parameter changed!! + spi_init(&_spi, _speed, _dataMode, _bitOrder, _dataSize); +} + +void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaHandle, uint32_t direction, bool minc) { + _dmaHandle.Init.Direction = direction; + _dmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; + _dmaHandle.Init.Mode = DMA_NORMAL; + _dmaHandle.Init.Priority = DMA_PRIORITY_LOW; + _dmaHandle.Init.MemInc = minc ? DMA_MINC_ENABLE : DMA_MINC_DISABLE; + + if (_dataSize == DATA_SIZE_8BIT) { + _dmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + _dmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + } + else { + _dmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + _dmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + } + #ifdef STM32F4xx + _dmaHandle.Init.Channel = DMA_CHANNEL_3; + _dmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + #endif + + // start DMA hardware + // TODO: check if hardware is already enabled + #ifdef SPI1_BASE + if (_spiHandle.Instance == SPI1) { + #ifdef STM32F1xx + __HAL_RCC_DMA1_CLK_ENABLE(); + _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel3 : DMA1_Channel2; + #elif defined(STM32F4xx) + __HAL_RCC_DMA2_CLK_ENABLE(); + _dmaHandle.Instance = DMA2_Stream3; + #endif + } + #endif + #ifdef SPI2_BASE + if (_spiHandle.Instance == SPI2) { + #ifdef STM32F1xx + __HAL_RCC_DMA1_CLK_ENABLE(); + _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel5 : DMA1_Channel4; + #elif defined(STM32F4xx) + //TODO: f4 dma config + #endif + } + #endif + #ifdef SPI3_BASE + if (_spiHandle.Instance == SPI3) { + #ifdef STM32F1xx + __HAL_RCC_DMA2_CLK_ENABLE(); + _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA2_Channel2 : DMA2_Channel1; + #elif defined(STM32F4xx) + //TODO: f4 dma config + #endif + } + #endif + + HAL_DMA_Init(&_dmaHandle); +} + +byte MarlinSPI::transfer(uint8_t _data) { + uint8_t rxData = 0xFF; + HAL_SPI_TransmitReceive(&_spi.handle, &_data, &rxData, 1, HAL_MAX_DELAY); + return rxData; +} + +uint8_t MarlinSPI::dmaTransfer(const void *transmitBuf, void *receiveBuf, uint16_t length) { + const uint8_t ff = 0xFF; + + //if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) //only enable if disabled + __HAL_SPI_ENABLE(&_spi.handle); + + if (receiveBuf) { + setupDma(_spi.handle, _dmaRx, DMA_PERIPH_TO_MEMORY, true); + HAL_DMA_Start(&_dmaRx, (uint32_t)&(_spi.handle.Instance->DR), (uint32_t)receiveBuf, length); + SET_BIT(_spi.handle.Instance->CR2, SPI_CR2_RXDMAEN); /* Enable Rx DMA Request */ + } + + // check for 2 lines transfer + bool mincTransmit = true; + if (transmitBuf == nullptr && _spi.handle.Init.Direction == SPI_DIRECTION_2LINES && _spi.handle.Init.Mode == SPI_MODE_MASTER) { + transmitBuf = &ff; + mincTransmit = false; + } + + if (transmitBuf) { + setupDma(_spi.handle, _dmaTx, DMA_MEMORY_TO_PERIPH, mincTransmit); + HAL_DMA_Start(&_dmaTx, (uint32_t)transmitBuf, (uint32_t)&(_spi.handle.Instance->DR), length); + SET_BIT(_spi.handle.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ + } + + if (transmitBuf) { + HAL_DMA_PollForTransfer(&_dmaTx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); + HAL_DMA_Abort(&_dmaTx); + HAL_DMA_DeInit(&_dmaTx); + } + + // while ((_spi.handle.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} + + if (receiveBuf) { + HAL_DMA_PollForTransfer(&_dmaRx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); + HAL_DMA_Abort(&_dmaRx); + HAL_DMA_DeInit(&_dmaRx); + } + + return 1; +} + +uint8_t MarlinSPI::dmaSend(const void * transmitBuf, uint16_t length, bool minc) { + setupDma(_spi.handle, _dmaTx, DMA_MEMORY_TO_PERIPH, minc); + HAL_DMA_Start(&_dmaTx, (uint32_t)transmitBuf, (uint32_t)&(_spi.handle.Instance->DR), length); + __HAL_SPI_ENABLE(&_spi.handle); + SET_BIT(_spi.handle.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ + HAL_DMA_PollForTransfer(&_dmaTx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); + HAL_DMA_Abort(&_dmaTx); + // DeInit objects + HAL_DMA_DeInit(&_dmaTx); + return 1; +} diff --git a/Marlin/src/HAL/STM32/MarlinSPI.h b/Marlin/src/HAL/STM32/MarlinSPI.h new file mode 100644 index 0000000000..fbd3585ff4 --- /dev/null +++ b/Marlin/src/HAL/STM32/MarlinSPI.h @@ -0,0 +1,107 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "HAL.h" +#include + +extern "C" { + #include +} + +/** + * Marlin currently requires 3 SPI classes: + * + * SPIClass: + * This class is normally provided by frameworks and has a semi-default interface. + * This is needed because some libraries reference it globally. + * + * SPISettings: + * Container for SPI configs for SPIClass. As above, libraries may reference it globally. + * + * These two classes are often provided by frameworks so we cannot extend them to add + * useful methods for Marlin. + * + * MarlinSPI: + * Provides the default SPIClass interface plus some Marlin goodies such as a simplified + * interface for SPI DMA transfer. + * + */ + +#define DATA_SIZE_8BIT SPI_DATASIZE_8BIT +#define DATA_SIZE_16BIT SPI_DATASIZE_16BIT + +class MarlinSPI { +public: + MarlinSPI() : MarlinSPI(NC, NC, NC, NC) {} + + MarlinSPI(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel = (pin_t)NC) : _mosiPin(mosi), _misoPin(miso), _sckPin(sclk), _ssPin(ssel) { + _spi.pin_miso = digitalPinToPinName(_misoPin); + _spi.pin_mosi = digitalPinToPinName(_mosiPin); + _spi.pin_sclk = digitalPinToPinName(_sckPin); + _spi.pin_ssel = digitalPinToPinName(_ssPin); + _dataSize = DATA_SIZE_8BIT; + _bitOrder = MSBFIRST; + _dataMode = SPI_MODE_0; + _spi.handle.State = HAL_SPI_STATE_RESET; + setClockDivider(SPI_SPEED_CLOCK_DIV2_MHZ); + } + + void begin(void); + void end(void) {} + + byte transfer(uint8_t _data); + uint8_t dmaTransfer(const void *transmitBuf, void *receiveBuf, uint16_t length); + uint8_t dmaSend(const void * transmitBuf, uint16_t length, bool minc = true); + + /* These methods are deprecated and kept for compatibility. + * Use SPISettings with SPI.beginTransaction() to configure SPI parameters. + */ + void setBitOrder(BitOrder _order) { _bitOrder = _order; } + + void setDataMode(uint8_t _mode) { + switch (_mode) { + case SPI_MODE0: _dataMode = SPI_MODE_0; break; + case SPI_MODE1: _dataMode = SPI_MODE_1; break; + case SPI_MODE2: _dataMode = SPI_MODE_2; break; + case SPI_MODE3: _dataMode = SPI_MODE_3; break; + } + } + + void setClockDivider(uint8_t _div); + +private: + void setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaHandle, uint32_t direction, bool minc = false); + + spi_t _spi; + DMA_HandleTypeDef _dmaTx; + DMA_HandleTypeDef _dmaRx; + BitOrder _bitOrder; + spi_mode_e _dataMode; + uint8_t _clockDivider; + uint32_t _speed; + uint32_t _dataSize; + pin_t _mosiPin; + pin_t _misoPin; + pin_t _sckPin; + pin_t _ssPin; +}; diff --git a/Marlin/src/HAL/STM32/timers.h b/Marlin/src/HAL/STM32/timers.h index 2bf70fc0fa..4649824303 100644 --- a/Marlin/src/HAL/STM32/timers.h +++ b/Marlin/src/HAL/STM32/timers.h @@ -105,7 +105,7 @@ void SetTimerInterruptPriorities(); // FORCE_INLINE because these are used in performance-critical situations FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_num) { - return timer_instance[timer_num] != NULL; + return timer_instance[timer_num] != nullptr; } FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { return HAL_timer_initialized(timer_num) ? timer_instance[timer_num]->getCount() : 0; diff --git a/Marlin/src/HAL/STM32F1/MarlinSPI.h b/Marlin/src/HAL/STM32F1/MarlinSPI.h new file mode 100644 index 0000000000..fab245f904 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/MarlinSPI.h @@ -0,0 +1,45 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +/** + * Marlin currently requires 3 SPI classes: + * + * SPIClass: + * This class is normally provided by frameworks and has a semi-default interface. + * This is needed because some libraries reference it globally. + * + * SPISettings: + * Container for SPI configs for SPIClass. As above, libraries may reference it globally. + * + * These two classes are often provided by frameworks so we cannot extend them to add + * useful methods for Marlin. + * + * MarlinSPI: + * Provides the default SPIClass interface plus some Marlin goodies such as a simplified + * interface for SPI DMA transfer. + * + */ + +using MarlinSPI = SPIClass; diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp index ef00b407a8..8995109238 100644 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -147,6 +147,18 @@ SPIClass::SPIClass(uint32_t spi_num) { _currentSetting->state = SPI_STATE_IDLE; } +SPIClass::SPIClass(int8_t mosi, int8_t miso, int8_t sclk, int8_t ssel) { + #if BOARD_NR_SPI >= 1 + if (mosi == BOARD_SPI1_MOSI_PIN) SPIClass(1); + #endif + #if BOARD_NR_SPI >= 2 + if (mosi == BOARD_SPI2_MOSI_PIN) SPIClass(2); + #endif + #if BOARD_NR_SPI >= 3 + if (mosi == BOARD_SPI3_MOSI_PIN) SPIClass(3); + #endif +} + /** * Set up/tear down */ diff --git a/Marlin/src/HAL/STM32F1/SPI.h b/Marlin/src/HAL/STM32F1/SPI.h index 0d20a46577..828644f1dd 100644 --- a/Marlin/src/HAL/STM32F1/SPI.h +++ b/Marlin/src/HAL/STM32F1/SPI.h @@ -163,6 +163,11 @@ public: */ SPIClass(uint32_t spiPortNumber); + /** + * Init using pins + */ + SPIClass(int8_t mosi, int8_t miso, int8_t sclk, int8_t ssel=-1); + /** * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). */ diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index e381c590f5..6781b81d7c 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -32,7 +32,12 @@ /** * lcd_put_u8str_ind_P - * Print a string with an index substituted within it + * + * Print a string with an index substituted within it: + * + * = displays '0'....'10' for indexes 0 - 10 + * ~ displays '1'....'11' for indexes 0 - 10 + * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) */ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const inStr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { uint8_t *p = (uint8_t*)pstr; diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index b707596bb3..eb805ac423 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -44,21 +44,21 @@ void TFT_String::set_font(const uint8_t *font) { for (glyph = 0; glyph < 256; glyph++) glyphs[glyph] = nullptr; - DEBUG_ECHOLNPAIR("Format: ", font_header->Format); - DEBUG_ECHOLNPAIR("BBXWidth: ", font_header->BBXWidth); - DEBUG_ECHOLNPAIR("BBXHeight: ", font_header->BBXHeight); - DEBUG_ECHOLNPAIR("BBXOffsetX: ", font_header->BBXOffsetX); - DEBUG_ECHOLNPAIR("BBXOffsetY: ", font_header->BBXOffsetY); - DEBUG_ECHOLNPAIR("CapitalAHeight: ", font_header->CapitalAHeight); - DEBUG_ECHOLNPAIR("Encoding65Pos: ", font_header->Encoding65Pos); - DEBUG_ECHOLNPAIR("Encoding97Pos: ", font_header->Encoding97Pos); + DEBUG_ECHOLNPAIR("Format: ", font_header->Format); + DEBUG_ECHOLNPAIR("BBXWidth: ", font_header->BBXWidth); + DEBUG_ECHOLNPAIR("BBXHeight: ", font_header->BBXHeight); + DEBUG_ECHOLNPAIR("BBXOffsetX: ", font_header->BBXOffsetX); + DEBUG_ECHOLNPAIR("BBXOffsetY: ", font_header->BBXOffsetY); + DEBUG_ECHOLNPAIR("CapitalAHeight: ", font_header->CapitalAHeight); + DEBUG_ECHOLNPAIR("Encoding65Pos: ", font_header->Encoding65Pos); + DEBUG_ECHOLNPAIR("Encoding97Pos: ", font_header->Encoding97Pos); DEBUG_ECHOLNPAIR("FontStartEncoding: ", font_header->FontStartEncoding); - DEBUG_ECHOLNPAIR("FontEndEncoding: ", font_header->FontEndEncoding); - DEBUG_ECHOLNPAIR("LowerGDescent: ", font_header->LowerGDescent); - DEBUG_ECHOLNPAIR("FontAscent: ", font_header->FontAscent); - DEBUG_ECHOLNPAIR("FontDescent: ", font_header->FontDescent); - DEBUG_ECHOLNPAIR("FontXAscent: ", font_header->FontXAscent); - DEBUG_ECHOLNPAIR("FontXDescent: ", font_header->FontXDescent); + DEBUG_ECHOLNPAIR("FontEndEncoding: ", font_header->FontEndEncoding); + DEBUG_ECHOLNPAIR("LowerGDescent: ", font_header->LowerGDescent); + DEBUG_ECHOLNPAIR("FontAscent: ", font_header->FontAscent); + DEBUG_ECHOLNPAIR("FontDescent: ", font_header->FontDescent); + DEBUG_ECHOLNPAIR("FontXAscent: ", font_header->FontXAscent); + DEBUG_ECHOLNPAIR("FontXDescent: ", font_header->FontXDescent); add_glyphs(font); } @@ -72,9 +72,8 @@ void TFT_String::add_glyphs(const uint8_t *font) { glyphs[glyph] = (glyph_t *)pointer; pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->DataSize; } - else { + else pointer++; - } } } @@ -86,6 +85,13 @@ void TFT_String::set() { uint8_t read_byte(uint8_t *byte) { return *byte; } +/** + * Add a string, applying substitutions for the following characters: + * + * = displays '0'....'10' for indexes 0 - 10 + * ~ displays '1'....'11' for indexes 0 - 10 + * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) + */ void TFT_String::add(uint8_t *string, int8_t index, uint8_t *itemString) { wchar_t wchar; diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index 03e002f66f..ebf326f2e5 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -25,7 +25,6 @@ #if HAS_SPI_FLASH #include "W25Qxx.h" -#include W25QXXFlash W25QXX; @@ -41,6 +40,11 @@ W25QXXFlash W25QXX; #ifndef SPI_FLASH_CS_PIN #define SPI_FLASH_CS_PIN W25QXX_CS_PIN #endif +#ifndef NC + #define NC -1 +#endif + +MarlinSPI W25QXXFlash::mySPI(SPI_FLASH_MOSI_PIN, SPI_FLASH_MISO_PIN, SPI_FLASH_SCK_PIN, NC); #define W25QXX_CS_H OUT_WRITE(SPI_FLASH_CS_PIN, HIGH) #define W25QXX_CS_L OUT_WRITE(SPI_FLASH_CS_PIN, LOW) @@ -69,11 +73,11 @@ void W25QXXFlash::init(uint8_t spiRate) { case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; default: clock = SPI_CLOCK_DIV2;// Default from the SPI library } - SPI.setModule(SPI_DEVICE); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); + + mySPI.setClockDivider(clock); + mySPI.setBitOrder(MSBFIRST); + mySPI.setDataMode(SPI_MODE0); + mySPI.begin(); } /** @@ -82,12 +86,12 @@ void W25QXXFlash::init(uint8_t spiRate) { * @return Byte received */ uint8_t W25QXXFlash::spi_flash_Rec() { - const uint8_t returnByte = SPI.transfer(0xFF); + const uint8_t returnByte = mySPI.transfer(0xFF); return returnByte; } uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { - const uint8_t returnByte = SPI.transfer(data); + const uint8_t returnByte = mySPI.transfer(data); return returnByte; } @@ -100,7 +104,9 @@ uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { * * @details Uses DMA */ -void W25QXXFlash::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); } +void W25QXXFlash::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { + mySPI.dmaTransfer(0, const_cast(buf), nbyte); +} /** * @brief Send a single byte on SPI port @@ -109,7 +115,7 @@ void W25QXXFlash::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer * * @details */ -void W25QXXFlash::spi_flash_Send(uint8_t b) { SPI.send(b); } +void W25QXXFlash::spi_flash_Send(uint8_t b) { mySPI.transfer(b); } /** * @brief Write token and then write from 512 byte buffer to SPI (for SD card) @@ -120,8 +126,8 @@ void W25QXXFlash::spi_flash_Send(uint8_t b) { SPI.send(b); } * @details Use DMA */ void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { - SPI.send(token); - SPI.dmaSend(const_cast(buf), 512); + mySPI.transfer(token); + mySPI.dmaSend(const_cast(buf), 512); } uint16_t W25QXXFlash::W25QXX_ReadID(void) { diff --git a/Marlin/src/libs/W25Qxx.h b/Marlin/src/libs/W25Qxx.h index ac3e8a169b..eddae6b1f2 100644 --- a/Marlin/src/libs/W25Qxx.h +++ b/Marlin/src/libs/W25Qxx.h @@ -23,6 +23,8 @@ #include +#include HAL_PATH(../HAL, MarlinSPI.h) + #define W25X_WriteEnable 0x06 #define W25X_WriteDisable 0x04 #define W25X_ReadStatusReg 0x05 @@ -49,6 +51,8 @@ #define SPI_FLASH_PerWritePageSize 256 class W25QXXFlash { +private: + static MarlinSPI mySPI; public: void init(uint8_t spiRate); static uint8_t spi_flash_Rec(); diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 5c3dfc2ad8..e7e583a6f5 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -191,6 +191,9 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 + #define TFT_CS_PIN FSMC_CS_PIN + #define TFT_RS_PIN FSMC_RS_PIN + #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index d67fa516b8..426f29d473 100644 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -15,7 +15,7 @@ opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" # -# MKS Robin v2 nano LVGL SPI +# MKS Robin v2 nano Emulated DOGM SPI # (Robin v2 nano has no FSMC interface) # use_example_configs Mks/Robin diff --git a/buildroot/tests/mks_robin_nano35_stm32-tests b/buildroot/tests/mks_robin_nano35_stm32-tests new file mode 100644 index 0000000000..58912b85a3 --- /dev/null +++ b/buildroot/tests/mks_robin_nano35_stm32-tests @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# +# Build tests for MKS Robin nano +# (STM32F1 genericSTM32F103VE) +# + +# exit on first failure +set -e + +# +# MKS Robin nano v1.2 Emulated DOGM FSMC +# +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO +exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" + +# +# MKS Robin v2 nano Emulated DOGM SPI +# (Robin v2 nano has no FSMC interface) +# +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_INTERFACE_FSMC +opt_enable TFT_INTERFACE_SPI +exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" + +# +# MKS Robin nano v1.2 LVGL FSMC +# +# use_example_configs Mks/Robin +# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO +# opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 +# opt_enable TFT_LVGL_UI TFT_RES_480x320 +# exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" + +# +# MKS Robin v2 nano LVGL SPI +# (Robin v2 nano has no FSMC interface) +# +# use_example_configs Mks/Robin +# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +# opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 +# opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 +# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" + +# +# MKS Robin v2 nano New Color UI 480x320 SPI +# (Robin v2 nano has no FSMC interface) +# +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 +opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" + +# +# MKS Robin v2 nano LVGL SPI + TMC +# (Robin v2 nano has no FSMC interface) +# +# use_example_configs Mks/Robin +# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +# opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 +# opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 +# opt_set X_DRIVER_TYPE TMC2209 +# opt_set Y_DRIVER_TYPE TMC2209 +# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" + +# cleanup +restore_configs From 5a918e2b2e546ffdee06ed8778e0f6d33f5dd358 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 6 Nov 2020 23:46:46 -0600 Subject: [PATCH 0520/1370] Update some file headers --- Marlin/src/HAL/LPC1768/tft/xpt2046.cpp | 5 ++++- Marlin/src/HAL/LPC1768/tft/xpt2046.h | 5 ++++- Marlin/src/HAL/STM32/tft/xpt2046.cpp | 5 ++++- Marlin/src/HAL/STM32/tft/xpt2046.h | 5 ++++- Marlin/src/HAL/STM32F1/tft/xpt2046.cpp | 5 ++++- Marlin/src/HAL/STM32F1/tft/xpt2046.h | 5 ++++- .../lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h | 2 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 2 +- Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp | 5 ++++- Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp | 5 ++++- Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp | 5 ++++- Marlin/src/lcd/tft/fontdata/helvetica_14.cpp | 5 ++++- Marlin/src/lcd/tft/touch.cpp | 5 ++++- Marlin/src/lcd/tft/touch.h | 5 ++++- Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 2 +- Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h | 2 +- 16 files changed, 52 insertions(+), 16 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp index 5f96630043..e51256a708 100644 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.h b/Marlin/src/HAL/LPC1768/tft/xpt2046.h index 019f75efce..29db0b3fc4 100644 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.h +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.h @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp index 8c8d28f66a..f95bb8ca4d 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h index 7a6d8439c5..3acf3898a3 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32/tft/xpt2046.h @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp index 616d05fead..4f5c4df375 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h index 019f75efce..29db0b3fc4 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h index 6ea317dbc3..5d9735892d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h @@ -10,7 +10,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 4623b8f492..8a6cbaaf31 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp index cc328e885d..f03366d6f7 100644 --- a/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp +++ b/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp index ade8bf23b8..21531f5c14 100644 --- a/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp +++ b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp index 12efb3ba49..e7411ea9ed 100644 --- a/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp +++ b/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp index a27ea43697..87e7135e37 100644 --- a/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp +++ b/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index d54506442d..cde9698024 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h index 4ba3e22c8e..7cb05891de 100644 --- a/Marlin/src/lcd/tft/touch.h +++ b/Marlin/src/lcd/tft/touch.h @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index 4f555c373f..9bb2cd371a 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h index 021ef1d5f6..b12c12c848 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm From 989ef47bde66bb7ff9072b650d6ab3ae42c919ee Mon Sep 17 00:00:00 2001 From: George Fu Date: Sat, 7 Nov 2020 13:48:52 +0800 Subject: [PATCH 0521/1370] FYSETC E4 board support (#20032) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/esp32/pins_FYSETC_E4.h | 126 +++++++++++++++++++++++++ Marlin/src/pins/pins.h | 2 + platformio.ini | 5 + 4 files changed, 134 insertions(+) create mode 100644 Marlin/src/pins/esp32/pins_FYSETC_E4.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index a1e39f9ae8..12bf167f40 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -378,6 +378,7 @@ #define BOARD_MRR_ESPA 6001 // MRR ESPA board based on ESP32 (native pins only) #define BOARD_MRR_ESPE 6002 // MRR ESPE board based on ESP32 (with I2S stepper stream) #define BOARD_E4D_BOX 6003 // E4d@BOX +#define BOARD_FYSETC_E4 6004 // FYSETC E4 // // SAMD51 ARM Cortex M4 diff --git a/Marlin/src/pins/esp32/pins_FYSETC_E4.h b/Marlin/src/pins/esp32/pins_FYSETC_E4.h new file mode 100644 index 0000000000..af179256e1 --- /dev/null +++ b/Marlin/src/pins/esp32/pins_FYSETC_E4.h @@ -0,0 +1,126 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * FYSETC E4 pin assignments + * FYSETC E4 is a 3D printer control board based on the ESP32 microcontroller. + * Supports 4 stepper drivers, heated bed, single hotend. + */ + +#ifndef ARDUINO_ARCH_ESP32 + #error "Oops! Select an ESP32 board in 'Tools > Board.'" +#elif EXTRUDERS > 1 || E_STEPPERS > 1 + #error "FYSETC E4 only supports one E Stepper. Comment out this line to continue." +#elif HOTENDS > 1 + #error "FYSETC E4 currently supports only one hotend. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "FYSETC_E4" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Disable I2S stepper stream +// +#undef I2S_STEPPER_STREAM +#define I2S_WS -1 +#define I2S_BCK -1 +#define I2S_DATA -1 + +// +// Limit Switches +// +#define X_STOP_PIN 34 +#define Y_STOP_PIN 35 +#define Z_STOP_PIN 15 + +// +// Steppers +// +#define X_STEP_PIN 27 +#define X_DIR_PIN 26 +#define X_ENABLE_PIN 25 + +#define Y_STEP_PIN 33 +#define Y_DIR_PIN 32 +#define Y_ENABLE_PIN X_ENABLE_PIN + +#define Z_STEP_PIN 14 +#define Z_DIR_PIN 12 +#define Z_ENABLE_PIN X_ENABLE_PIN + +#define E0_STEP_PIN 16 +#define E0_DIR_PIN 17 +#define E0_ENABLE_PIN X_ENABLE_PIN + +#if HAS_TMC_UART + // + // TMC2209 stepper drivers + // + + // + // Hardware serial 1 + // + #define X_HARDWARE_SERIAL Serial1 + #define Y_HARDWARE_SERIAL Serial1 + #define Z_HARDWARE_SERIAL Serial1 + #define E0_HARDWARE_SERIAL Serial1 + + #define TMC_BAUD_RATE 115200 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 36 // Analog Input +#define TEMP_BED_PIN 39 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define FAN_PIN 13 +#define HEATER_BED_PIN 4 + +// +// MicroSD card +// +#define MOSI_PIN 23 +#define MISO_PIN 19 +#define SCK_PIN 18 +#define SDSS 5 +#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers + +/** + * Hardware serial pins + * + * Override these pins in Configuration.h or Configuration_adv.h if needed. + * + * Note: Serial2 can be defined using HARDWARE_SERIAL2_RX and HARDWARE_SERIAL2_TX + * but MRR ESPA does not have enough spare pins for such reassignment. + */ +#ifndef HARDWARE_SERIAL1_RX + #define HARDWARE_SERIAL1_RX 21 +#endif +#ifndef HARDWARE_SERIAL1_TX + #define HARDWARE_SERIAL1_TX 22 +#endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 62749a3f6e..2936676c4d 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -665,6 +665,8 @@ #include "esp32/pins_MRR_ESPE.h" // ESP32 env:esp32 #elif MB(E4D_BOX) #include "esp32/pins_E4D.h" // ESP32 env:esp32 +#elif MB(FYSETC_E4) + #include "esp32/pins_FYSETC_E4.h" // ESP32 env:FYSETC_E4 // // Adafruit Grand Central M4 (SAMD51 ARM Cortex-M4) diff --git a/platformio.ini b/platformio.ini index b052a26b58..0bd4fbe7a1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1363,6 +1363,11 @@ upload_speed = 115200 #upload_port = marlinesp.local #board_build.flash_mode = qio +[env:FYSETC_E4] +platform = espressif32@1.11.2 +extends = env:esp32 +board_build.partitions = default_16MB.csv + # # Teensy 3.1 / 3.2 (ARM Cortex-M4) # From ecabbb6974524d500d28f618d2b3eb006422b4bc Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 6 Nov 2020 21:49:53 -0800 Subject: [PATCH 0522/1370] Fix FYSETC S6 timer conflict (#20044) --- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 8638e9a4cf..656849487a 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -34,8 +34,8 @@ #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME #endif -// Change the priority to 3. Priority 2 is for software serial. -//#define TEMP_TIMER_IRQ_PRIO 3 +// Avoid conflict with TIMER_TONE defined in variant +#define STEP_TIMER 10 // // EEPROM Emulation From 3afa6e526bbf286ebd24a50b1962b27667a5225f Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 6 Nov 2020 21:51:52 -0800 Subject: [PATCH 0523/1370] STM32F1 cleanup, incl. SoftwareSerial removal (#20046) --- Marlin/src/HAL/STM32F1/SoftwareSerial.cpp | 60 ----------------------- Marlin/src/HAL/STM32F1/SoftwareSerial.h | 44 ----------------- Marlin/src/HAL/STM32F1/build_flags.py | 2 +- Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 5 -- platformio.ini | 14 ++---- 5 files changed, 6 insertions(+), 119 deletions(-) delete mode 100644 Marlin/src/HAL/STM32F1/SoftwareSerial.cpp delete mode 100644 Marlin/src/HAL/STM32F1/SoftwareSerial.h diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp deleted file mode 100644 index 993403cf72..0000000000 --- a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(__STM32F1__) && !defined(HAVE_SW_SERIAL) - -/** - * Empty class for Software Serial implementation (Custom RX/TX pins) - * - * TODO: Optionally use https://github.com/FYSETC/SoftwareSerialM if TMC UART is wanted - */ - -#include "SoftwareSerial.h" - -// Constructor - -SoftwareSerial::SoftwareSerial(int8_t RX_pin, int8_t TX_pin) {} - -// Public - -void SoftwareSerial::begin(const uint32_t baudrate) { -} - -bool SoftwareSerial::available() { - return false; -} - -uint8_t SoftwareSerial::read() { - return 0; -} - -uint16_t SoftwareSerial::write(uint8_t byte) { - return 0; -} - -void SoftwareSerial::flush() {} - -void SoftwareSerial::listen() { - listening = true; -} - -void SoftwareSerial::stopListening() { - listening = false; -} - -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.h b/Marlin/src/HAL/STM32F1/SoftwareSerial.h deleted file mode 100644 index 1c8058665a..0000000000 --- a/Marlin/src/HAL/STM32F1/SoftwareSerial.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -#ifndef HAVE_SW_SERIAL - #define SW_SERIAL_PLACEHOLDER 1 -#endif - -class SoftwareSerial { -public: - SoftwareSerial(int8_t RX_pin, int8_t TX_pin); - - void begin(const uint32_t baudrate); - - bool available(); - - uint8_t read(); - uint16_t write(uint8_t byte); - void flush(); - - void listen(); - void stopListening(); - -protected: - bool listening; -}; diff --git a/Marlin/src/HAL/STM32F1/build_flags.py b/Marlin/src/HAL/STM32F1/build_flags.py index 98c871a1d8..c51fd4fa58 100755 --- a/Marlin/src/HAL/STM32F1/build_flags.py +++ b/Marlin/src/HAL/STM32F1/build_flags.py @@ -3,7 +3,7 @@ import sys #dynamic build flags for generic compile options if __name__ == "__main__": - args = " ".join([ "-std=gnu11", + args = " ".join([ "-std=gnu++14", "-Os", "-mcpu=cortex-m3", "-mthumb", diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index 937bef8803..8d4c54ec0f 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -25,11 +25,6 @@ * Test STM32F1-specific configuration values for errors at compile-time. */ -#if !defined(HAVE_SW_SERIAL) && HAS_TMC_SW_SERIAL - #warning "With TMC2208/9 consider using SoftwareSerialM with HAVE_SW_SERIAL and appropriate SS_TIMER." - #error "Missing SoftwareSerial implementation." -#endif - #if ENABLED(SDCARD_EEPROM_EMULATION) && DISABLED(SDSUPPORT) #undef SDCARD_EEPROM_EMULATION // Avoid additional error noise #if USE_FALLBACK_EEPROM diff --git a/platformio.ini b/platformio.ini index 0bd4fbe7a1..7ab0755cdc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -711,7 +711,7 @@ src_filter = ${common.default_src_filter} + + lib_ignore = SPI @@ -1121,18 +1121,14 @@ build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX # Creality (STM32F103RET6) # [env:STM32F103RET6_creality] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RE -build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py - ${common.build_flags} -std=gnu++14 -DSTM32_XL_DENSITY -DTEMP_TIMER_CHAN=4 -extra_scripts = ${common.extra_scripts} +platform = ${env:STM32F103RE.platform} +extends = env:STM32F103RE +build_flags = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4 +extra_scripts = ${env:STM32F103RE.extra_scripts} pre:buildroot/share/PlatformIO/scripts/random-bin.py buildroot/share/PlatformIO/scripts/creality.py -lib_ignore = ${common_stm32f1.lib_ignore} debug_tool = jlink upload_protocol = jlink -monitor_speed = 115200 # # FLSUN QQ (STM32F103VET6) From a1ec49fedac3c0a5871cb92ce96da025fe333c30 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 6 Nov 2020 22:48:17 -0800 Subject: [PATCH 0524/1370] Sanity-check illegal native USB (#20047) Co-authored-by: Scott Lahteine --- Marlin/src/inc/SanityCheck.h | 14 ++++++++++++++ Marlin/src/pins/stm32f1/pins_CHITU3D.h | 6 ++++-- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 6 ++++-- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 6 ++++-- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 6 +++--- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 2 ++ Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 4 ++-- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 2 ++ Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 3 ++- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 2 ++ Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 2 ++ Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 2 ++ Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 2 ++ Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 3 +++ Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 ++ Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 4 ++-- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 3 +++ buildroot/tests/mks_robin_lite-tests | 2 +- buildroot/tests/mks_robin_pro-tests | 2 ++ 28 files changed, 76 insertions(+), 15 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 443669bb25..498455e59e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2294,6 +2294,20 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "GRAPHICAL_TFT_UPSCALE must be set to 2 or 3." #endif +/** + * Some boards forbid the use of -1 Native USB + */ +#if ENABLED(BOARD_NO_NATIVE_USB) + #undef BOARD_NO_NATIVE_USB + #if SERIAL_PORT == -1 + #error "SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT to a valid value for your board." + #elif SERIAL_PORT_2 == -1 + #error "SERIAL_PORT_2 is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT_2 to a valid value for your board." + #elif LCD_SERIAL_PORT == -1 + #error "LCD_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set LCD_SERIAL_PORT to a valid value for your board." + #endif +#endif + /** * Serial displays require a dedicated serial port */ diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index 1d8f4f684b..aa83a0cb04 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -21,8 +21,8 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif /** @@ -32,6 +32,8 @@ #define BOARD_INFO_NAME "Chitu3D" #define DEFAULT_MACHINE_NAME "STM32F103RET6" +#define BOARD_NO_NATIVE_USB + // Enable I2C_EEPROM for testing //#define I2C_EEPROM diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 1818727372..b13fde026c 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -21,8 +21,8 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif /** @@ -32,6 +32,8 @@ #define BOARD_INFO_NAME "Chitu3D V5" #define DEFAULT_MACHINE_NAME "STM32F103ZET6" +#define BOARD_NO_NATIVE_USB + #define DISABLE_JTAG // diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 1d6e6b3983..a015fb2704 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -21,8 +21,8 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif /** @@ -32,6 +32,8 @@ #define BOARD_INFO_NAME "Chitu3D" #define DEFAULT_MACHINE_NAME "STM32F103ZET6" +#define BOARD_NO_NATIVE_USB + #define DISABLE_JTAG // diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index eb910dd846..c6f2dd8b80 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -26,9 +26,7 @@ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#if HOTENDS > 1 || E_STEPPERS > 1 +#elif HOTENDS > 1 || E_STEPPERS > 1 #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." #endif @@ -39,6 +37,8 @@ #define DEFAULT_MACHINE_NAME "Ender 3 V2" #endif +#define BOARD_NO_NATIVE_USB + // // EEPROM // diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index bf3389492a..5f91072440 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -38,6 +38,8 @@ #define BOARD_INFO_NAME "FLSun HiSpeedV1" #define BOARD_WEBSITE_URL "github.com/Foxies-CSTL" +#define BOARD_NO_NATIVE_USB + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index 9bb2cd371a..073d6c7368 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -21,12 +21,12 @@ */ #pragma once -#ifndef __STM32F1__ +#if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif #define BOARD_INFO_NAME "FLY_MINI" -#define BOARD_WEBSITE_URL "github.com/FLYmaker" +#define BOARD_WEBSITE_URL "github.com/FLYmaker" #define DISABLE_JTAG // diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index bab6182e4f..aebb776b29 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -28,6 +28,8 @@ #define BOARD_INFO_NAME "FYSETC AIO II" #define BOARD_WEBSITE_URL "fysetc.com" +#define BOARD_NO_NATIVE_USB + #define DISABLE_JTAG #define pins_v2_20190128 // new pins define diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index deca1a0546..b8a4ccf770 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -29,11 +29,12 @@ #define BOARD_INFO_NAME "FYSETC Cheetah" #define BOARD_WEBSITE_URL "fysetc.com" -// https://github.com/FYSETC/Cheetah // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +#define BOARD_NO_NATIVE_USB + #define DISABLE_JTAG #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index 00c5721384..52b857ac0a 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -33,6 +33,8 @@ #define BOARD_INFO_NAME "GTM32 Pro VB" #define DEFAULT_MACHINE_NAME "STM32F103VET6" +#define BOARD_NO_NATIVE_USB + //#define DISABLE_DEBUG // diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index b10748e57f..85d0be6d6b 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -33,6 +33,8 @@ #define BOARD_INFO_NAME "GTM32 Pro VB" #define DEFAULT_MACHINE_NAME "STM32F103VET6" +#define BOARD_NO_NATIVE_USB + //#define DISABLE_DEBUG // diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index 00c5721384..52b857ac0a 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -33,6 +33,8 @@ #define BOARD_INFO_NAME "GTM32 Pro VB" #define DEFAULT_MACHINE_NAME "STM32F103VET6" +#define BOARD_NO_NATIVE_USB + //#define DISABLE_DEBUG // diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index b913530f67..292119ce02 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -33,6 +33,8 @@ #define BOARD_INFO_NAME "GTM32 Pro VB" #define DEFAULT_MACHINE_NAME "M201" +#define BOARD_NO_NATIVE_USB + //#define DISABLE_DEBUG // diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index 0dd8fb69a5..f86acf1f24 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -33,8 +33,11 @@ #elif HOTENDS > 1 || E_STEPPERS > 1 #error "JGAurora 32-bit board only supports 1 hotend / E-stepper. Comment out this line to continue." #endif + #define BOARD_INFO_NAME "JGAurora A5S A1 board" +#define BOARD_NO_NATIVE_USB + #ifndef STM32_XL_DENSITY #define STM32_XL_DENSITY #endif diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index c685570707..fd5c573878 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -31,6 +31,8 @@ #define BOARD_INFO_NAME "Longer3D" #define ALFAWISE_UX0 // Common to all Longer3D STM32F1 boards (used for Open drain mosfets) +#define BOARD_NO_NATIVE_USB + //#define DISABLE_DEBUG // We still want to debug with STLINK... #define DISABLE_JTAG // We free the jtag pins (PA15) but keep STLINK // Release PB4 (STEP_X_PIN) from JTAG NRST role. diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index e6c8098f2a..581dd5375b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -35,6 +35,8 @@ #define BOARD_INFO_NAME "MKS Robin" +#define BOARD_NO_NATIVE_USB + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 2b7417c29f..9c0f2deeab 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -35,6 +35,8 @@ #define BOARD_INFO_NAME "MKS Robin e3p" +#define BOARD_NO_NATIVE_USB + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index ffcdc3cfdf..2dcd7780af 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -29,6 +29,8 @@ #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif +#define BOARD_NO_NATIVE_USB + #define BOARD_WEBSITE_URL "github.com/makerbase-mks" //#define DISABLE_DEBUG diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index ab5350e4de..d7c4aebe37 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -32,6 +32,8 @@ #endif #define BOARD_WEBSITE_URL "github.com/makerbase-mks" +#define BOARD_NO_NATIVE_USB + //#define DISABLE_DEBUG #define DISABLE_JTAG diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 4c1299fe02..f8b8a891be 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -36,6 +36,8 @@ #endif #define BOARD_WEBSITE_URL "github.com/makerbase-mks" +#define BOARD_NO_NATIVE_USB + //#define DISABLE_DEBUG #define DISABLE_JTAG diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 8c63f79732..2406c22d55 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -33,6 +33,8 @@ #define BOARD_INFO_NAME "MKS Robin Mini" +#define BOARD_NO_NATIVE_USB + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index e7e583a6f5..3c9b2f5b59 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -33,6 +33,8 @@ #define BOARD_INFO_NAME "MKS Robin Nano" +#define BOARD_NO_NATIVE_USB + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index e009d34d94..9c1d073da6 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -35,6 +35,8 @@ #define BOARD_INFO_NAME "MKS Robin nano V2.0" +#define BOARD_NO_NATIVE_USB + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 639a8f0579..8f1a405e8c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -33,6 +33,8 @@ #define BOARD_INFO_NAME "MKS Robin pro" +#define BOARD_NO_NATIVE_USB + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index 3ebc4bca57..ef82b71f56 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -21,8 +21,8 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif /** diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 8314858d13..2fc34ce296 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -35,6 +35,9 @@ #endif #define BOARD_INFO_NAME "Trigorilla Pro" + +#define BOARD_NO_NATIVE_USB + #define DISABLE_JTAG // diff --git a/buildroot/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite-tests index 34809641ec..d54627e069 100644 --- a/buildroot/tests/mks_robin_lite-tests +++ b/buildroot/tests/mks_robin_lite-tests @@ -8,7 +8,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_MKS_ROBIN_LITE -opt_set SERIAL_PORT -1 +opt_set SERIAL_PORT 1 opt_enable EEPROM_SETTINGS opt_enable SDSUPPORT exec_test $1 $2 "Default Configuration with Fallback SD EEPROM" diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests index 50ec7b0dd1..3cafc6142f 100644 --- a/buildroot/tests/mks_robin_pro-tests +++ b/buildroot/tests/mks_robin_pro-tests @@ -8,6 +8,8 @@ set -e use_example_configs Mks/Robin_Pro opt_enable EMERGENCY_PARSER +opt_set SERIAL_PORT 3 +opt_disable SERIAL_PORT_2 opt_set SDCARD_CONNECTION LCD opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 From 45e0dd1966ca21d07d2cd10846b1109f417857de Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 7 Nov 2020 02:38:39 -0600 Subject: [PATCH 0525/1370] Add 'mfconfig' script used to manage configs --- buildroot/share/git/mfconfig | 183 +++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100755 buildroot/share/git/mfconfig diff --git a/buildroot/share/git/mfconfig b/buildroot/share/git/mfconfig new file mode 100755 index 0000000000..3fd5e399cc --- /dev/null +++ b/buildroot/share/git/mfconfig @@ -0,0 +1,183 @@ +#!/usr/bin/env bash +# +# mfconfig init source dest +# mfconfig manual source dest +# +# The MarlinFirmware/Configurations layout could be broken up into branches, +# but this makes management more complicated and requires more commits to +# perform the same operation, so this uses a single branch with subfolders. +# +# init - Initialize the repo with a base commit and changes: +# - Source will be an 'import' branch containing all current configs. +# - Create an empty 'BASE' branch from 'init-repo'. +# - Add Marlin config files, but reset all to defaults. +# - Commit this so changes will be clear in following commits. +# - Add changed Marlin config files and commit. +# +# manual - Manually import changes from the Marlin repo +# - Replace 'default' configs with those from the Marlin repo. +# - Wait for manual propagation to the rest of the configs. +# - Run init with the given 'source' and 'dest' +# + +REPOHOME="`dirname ~/Projects/Maker/Firmware/.`" +MARLINREPO="$REPOHOME/MarlinFirmware" +CONFIGREPO="$REPOHOME/Configurations" + +CEXA=config/examples +CDEF=config/default +BC=Configuration.h +AC=Configuration_adv.h + +COMMIT_STEPS=0 + +#cd "$CONFIGREPO" 2>/dev/null || { echo "Can't find Configurations repo!" ; exit 1; } + +ACTION=${1:-init} +IMPORT=${2:-"import-2.0.x"} +EXPORT=${3:-"bugfix-2.0.x"} + +echo -n "Doing grhh ... " ; grhh ; echo + +if [[ $ACTION == "manual" ]]; then + + # + # Copy the latest default configs from MarlinFirmware/Marlin + # or one of the import branches here, then use them to construct + # a 'BASE' branch with only defaults as a starting point. + # + + echo "- Updating '$IMPORT' from Marlin..." + + git checkout $IMPORT || exit + + # Reset from the latest complete state + #git reset --hard master + + cp "$MARLINREPO/Marlin/"Configuration*.h "$CDEF/" + #git add . && git commit -m "Changes from Marlin ($(date '+%Y-%m-%d %H:%M'))." + + echo "- Fix up the import branch and come back." + + read -p "- Ready to init [y/N] ?" INIT_YES + echo + + [[ $INIT_YES == 'Y' || $INIT_YES == 'y' ]] || { echo "Done." ; exit ; } + + ACTION='init' +fi + +if [[ $ACTION == "init" ]]; then + # + # Copy all configs from a source such as MarlinFirmware/Marlin + # or one of the import branches here, then use them to construct + # a 'BASE' branch with only defaults as a starting point. + # + + echo "- Initializing BASE branch..." + + # Use the import branch as the source + git checkout $IMPORT || exit + + # Copy to a temporary location + TEMP=$( mktemp -d ) ; cp -R config $TEMP + + # Make sure we're not on the 'BASE' branch... + git checkout master >/dev/null 2>&1 || exit + + # Create 'BASE' as a copy of 'init-repo' (README, LICENSE, etc.) + git branch -D BASE 2>/dev/null + git checkout init-repo -b BASE || exit + + # Copy all config files into place + echo "- Copying configs from Marlin..." + cp -R "$TEMP/config" . + + # Delete anything that's not a Configuration file + find config -type f \! -name "Configuration*" -exec rm "{}" \; + + # DEBUG: Commit the original config files for comparison + ((COMMIT_STEPS)) && git add . >/dev/null && git commit -m "Commit for comparison" >/dev/null + + # Init Cartesian configurations to default + echo "- Initializing configs to default state..." + + find "$CEXA" -name $BC ! -path */delta/* -print0 \ + | while read -d $'\0' F ; do cp "$CDEF/$BC" "$F" ; done + find "$CEXA" -name $AC ! -path */delta/* -print0 \ + | while read -d $'\0' F ; do cp "$CDEF/$AC" "$F" ; done + + # DEBUG: Commit the reset for review + ((COMMIT_STEPS)) && git add . >/dev/null && git commit -m "Reset Cartesian/SCARA configs..." >/dev/null + + # Create base Delta configurations + cp "$CDEF"/* "$CEXA/delta/generic" + + # DEBUG: Commit the reset for review + ((COMMIT_STEPS)) && git add . >/dev/null && git commit -m "Reset Generic Delta..." >/dev/null + + cp -R "$TEMP/$CEXA/delta/generic"/Conf* "$CEXA/delta/generic" + + # DEBUG: Commit Generic Delta changes for review + ((COMMIT_STEPS)) && git add . >/dev/null && git commit -m "Apply Generic Delta..." >/dev/null + + find "$CEXA/delta" -name $BC ! -path */generic/* -print0 \ + | while read -d $'\0' F ; do cp "$CEXA/delta/generic/$BC" "$F" ; done + find "$CEXA/delta" -name $AC ! -path */generic/* -print0 \ + | while read -d $'\0' F ; do cp "$CEXA/delta/generic/$AC" "$F" ; done + + # DEBUG: Commit the reset for review + ((COMMIT_STEPS)) && git add . >/dev/null && git commit -m "Reset Delta configs..." >/dev/null + + # SCARA configurations + find "$CEXA/SCARA" -name $BC \ + | while read -d $'\0' F ; do cp "$CDEF/$BC" "$F" ; done + find "$CEXA/SCARA" -name $AC \ + | while read -d $'\0' F ; do cp "$CDEF/$AC" "$F" ; done + + # DEBUG: Commit the reset for review or... + ((COMMIT_STEPS)) && git add . >/dev/null && git commit -m "Reset SCARA..." >/dev/null + + # Update the %VERSION% in the README.md file + SED=$(which gsed || which sed) + VERS=$( echo $EXPORT | $SED 's/release-//' ) + eval "${SED} -E -i~ -e 's/%VERSION%/$VERS/g' README.md" + rm -f README.md~ + + # NOT DEBUGGING: Commit the 'BASE', ready for customizations + ((COMMIT_STEPS)) || git add . >/dev/null && git commit --amend --no-edit >/dev/null + + # Create a new branch from 'BASE' for the final result + echo "- Creating '$EXPORT' branch for the result..." + git branch -D $EXPORT 2>/dev/null + git checkout -b $EXPORT || exit + + # Delete temporary branch + git branch -D BASE 2>/dev/null + + echo "- Applying example config customizations..." + cp -R "$TEMP/config" . + find config -type f \! -name "Configuration*" -exec rm "{}" \; + + echo "- Adding path labels to all configs..." + config-labels.py >/dev/null 2>&1 + + git add . >/dev/null && git commit -m "Examples Customizations" >/dev/null + + echo "- Copying extras from Marlin..." + cp -R "$TEMP/config" . + + # Apply labels again! + config-labels.py >/dev/null 2>&1 + + git add . >/dev/null && git commit -m "Examples Extras" >/dev/null + + rm -rf $TEMP + + git push -f --set-upstream upstream "$EXPORT" + +else + + echo "Usage: mfconfig init|manual|rebase" + +fi From d81c1961c24037c6f2652d8165fe180add7907f5 Mon Sep 17 00:00:00 2001 From: Darren Horrocks Date: Sat, 7 Nov 2020 08:42:14 +0000 Subject: [PATCH 0526/1370] Anet 1.0 alternative graphical LCD wiring (#20022) --- Marlin/Configuration.h | 3 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 5 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 5 +- Marlin/src/pins/sanguino/pins_ANET_10.h | 54 +++++++++++++++------ 6 files changed, 51 insertions(+), 20 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0b6234bbcc..1297c61aed 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2095,9 +2095,10 @@ // // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 // A clone of the RepRapDiscount full graphics display but with -// different pins/wiring (see pins_ANET_10.h). +// different pins/wiring (see pins_ANET_10.h). Enable one of these. // //#define ANET_FULL_GRAPHICS_LCD +//#define ANET_FULL_GRAPHICS_LCD_ALT_WIRING // // AZSMZ 12864 LCD with SD diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index a2ac480f2a..98aa4afb8c 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -235,7 +235,7 @@ #define BOARD_ST7920_DELAY_2 DELAY_NS(125) #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#elif ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD, BQ_LCD_SMART_CONTROLLER) +#elif ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING, BQ_LCD_SMART_CONTROLLER) #define IS_RRD_FG_SC 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 498455e59e..ef79241d71 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2220,7 +2220,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + COUNT_ENABLED(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) \ + COUNT_ENABLED(VIKI2, miniVIKI) \ + COUNT_ENABLED(ZONESTAR_12864LCD, ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) \ - + ENABLED(ANET_FULL_GRAPHICS_LCD) \ + + COUNT_ENABLED(ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING) \ + ENABLED(AZSMZ_12864) \ + ENABLED(BQ_LCD_SMART_CONTROLLER) \ + ENABLED(CARTESIO_UI) \ diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index 51e48fc8e9..6f84a2a44d 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -215,9 +215,10 @@ #define EXPA2_10_PIN P0_17 #if HAS_WIRED_LCD + #if ENABLED(ANET_FULL_GRAPHICS_LCD_ALT_WIRING) + #error "ANET_FULL_GRAPHICS_LCD_ALT_WIRING only applies to the ANET 1.0 board." - #if ENABLED(ANET_FULL_GRAPHICS_LCD) - + #elif ENABLED(ANET_FULL_GRAPHICS_LCD) #error "CAUTION! ANET_FULL_GRAPHICS_LCD requires wiring modifications. See 'pins_BTT_SKR_V1_3.h' for details. Comment out this line to continue." /** diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 8df631b677..14bac7d723 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -233,7 +233,10 @@ * EXP2 EXP1 */ #if HAS_WIRED_LCD - #if ENABLED(ANET_FULL_GRAPHICS_LCD) + #if ENABLED(ANET_FULL_GRAPHICS_LCD_ALT_WIRING) + #error "ANET_FULL_GRAPHICS_LCD_ALT_WIRING only applies to the ANET 1.0 board." + + #elif ENABLED(ANET_FULL_GRAPHICS_LCD) #error "CAUTION! ANET_FULL_GRAPHICS_LCD requires wiring modifications. See 'pins_BTT_SKR_V1_4.h' for details. Comment out this line to continue." /** diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index d48db36287..81c0fe562d 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -145,13 +145,16 @@ * * Only the following displays are supported: * ZONESTAR_LCD - * ANET_FULL_GRAPHICS_LCD + * ANET_FULL_GRAPHICS_LCD(_ALT_WIRING)? * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER */ #if HAS_WIRED_LCD + #define LCD_SDSS 28 + #if HAS_ADC_BUTTONS + #define SERVO0_PIN 27 // free for BLTouch/3D-Touch #define LCD_PINS_RS 28 #define LCD_PINS_ENABLE 29 @@ -160,26 +163,49 @@ #define LCD_PINS_D6 16 #define LCD_PINS_D7 17 #define ADC_KEYPAD_PIN 1 + #elif IS_RRD_FG_SC + // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 - #define SERVO0_PIN 29 // free for BLTouch/3D-Touch - #define BEEPER_PIN 17 - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 28 - #define LCD_PINS_D4 30 - #define BTN_EN1 11 - #define BTN_EN2 10 - #define BTN_ENC 16 - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) - #define BOARD_ST7920_DELAY_2 DELAY_NS(63) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #define STD_ENCODER_PULSES_PER_STEP 4 - #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 + + #if ENABLED(ANET_FULL_GRAPHICS_LCD_ALT_WIRING) + #define SERVO0_PIN 30 + #define BEEPER_PIN 27 + #define LCD_PINS_RS 29 + #define LCD_PINS_ENABLE 16 + #define LCD_PINS_D4 11 + #define BTN_EN1 28 + #define BTN_EN2 10 + #define BTN_ENC 17 + #define BOARD_ST7920_DELAY_1 DELAY_NS(250) + #define BOARD_ST7920_DELAY_2 DELAY_NS(250) + #define BOARD_ST7920_DELAY_3 DELAY_NS(250) + #else + #define SERVO0_PIN 29 // free for BLTouch/3D-Touch + #define BEEPER_PIN 17 + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 28 + #define LCD_PINS_D4 30 + #define BTN_EN1 11 + #define BTN_EN2 10 + #define BTN_ENC 16 + #define BOARD_ST7920_DELAY_1 DELAY_NS(0) + #define BOARD_ST7920_DELAY_2 DELAY_NS(63) + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif + #endif + #else + #define SERVO0_PIN 27 + +#endif + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN SERVO0_PIN #endif /** From 7e94079b5b1b5cd0d3bf2034348b628909ca4332 Mon Sep 17 00:00:00 2001 From: Darren Horrocks Date: Sat, 7 Nov 2020 08:43:51 +0000 Subject: [PATCH 0527/1370] Optimized (non-optiboot) Melzi env (#20021) Co-authored-by: Scott Lahteine --- Marlin/src/pins/pins.h | 40 +++++------ platformio.ini | 158 +++++++++++++++++++++++------------------ 2 files changed, 107 insertions(+), 91 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 2936676c4d..22b0c6947f 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -298,27 +298,27 @@ // #elif MB(SANGUINOLOLU_11) - #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(SANGUINOLOLU_12) - #include "sanguino/pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(MELZI) - #include "sanguino/pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(MELZI_V2) - #include "sanguino/pins_MELZI_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_MELZI_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(MELZI_MAKR3D) - #include "sanguino/pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(MELZI_CREALITY) - #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi env:melzi_optimized env:melzi_optiboot + #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi env:melzi_optimized env:melzi_optiboot env:melzi_optiboot_optimized #elif MB(MELZI_MALYAN) - #include "sanguino/pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(MELZI_TRONXY) - #include "sanguino/pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(STB_11) - #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(AZTEEG_X1) - #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(ZMIB_V2) - #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized // // Other ATmega644P, ATmega644, ATmega1284P @@ -327,27 +327,27 @@ #elif MB(GEN3_MONOLITHIC) #include "sanguino/pins_GEN3_MONOLITHIC.h" // ATmega644P env:sanguino644p #elif MB(GEN3_PLUS) - #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(GEN6) - #include "sanguino/pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(GEN6_DELUXE) - #include "sanguino/pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(GEN7_CUSTOM) - #include "sanguino/pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(GEN7_12) - #include "sanguino/pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(GEN7_13) - #include "sanguino/pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(GEN7_14) - #include "sanguino/pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized #elif MB(OMCA_A) #include "sanguino/pins_OMCA_A.h" // ATmega644 env:sanguino644p #elif MB(OMCA) #include "sanguino/pins_OMCA.h" // ATmega644P, ATmega644 env:sanguino644p #elif MB(ANET_10) - #include "sanguino/pins_ANET_10.h" // ATmega1284P env:sanguino1284p + #include "sanguino/pins_ANET_10.h" // ATmega1284P env:sanguino1284p env:sanguino1284p_optimized #elif MB(SETHI) - #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized // // Teensyduino - AT90USB1286, AT90USB1286P diff --git a/platformio.ini b/platformio.ini index 7ab0755cdc..07edbf3918 100644 --- a/platformio.ini +++ b/platformio.ini @@ -434,9 +434,9 @@ src_filter = ${common.default_src_filter} + # ATmega2560 # [env:mega2560] -platform = atmelavr -extends = common_avr8 -board = megaatmega2560 +platform = atmelavr +extends = common_avr8 +board = megaatmega2560 # # ATmega2560 with extended pins 70-85 defined @@ -457,9 +457,9 @@ extra_scripts = ${common.extra_scripts} # ATmega1280 # [env:mega1280] -platform = atmelavr -extends = common_avr8 -board = megaatmega1280 +platform = atmelavr +extends = common_avr8 +board = megaatmega1280 # # MightyBoard ATmega2560 (MegaCore 100 pin boards variants) @@ -474,81 +474,97 @@ upload_speed = 57600 # MightyBoard ATmega2560 (MegaCore 100 pin boards variants) # [env:MightyBoard2560] -platform = atmelavr -extends = common_avr8 -board = ATmega2560 -upload_protocol = wiring -upload_speed = 57600 +platform = atmelavr +extends = common_avr8 +board = ATmega2560 +upload_protocol = wiring +upload_speed = 57600 board_upload.maximum_size = 253952 # # RAMBo # [env:rambo] -platform = atmelavr -extends = common_avr8 -board = reprap_rambo +platform = atmelavr +extends = common_avr8 +board = reprap_rambo # # FYSETC F6 V1.3 # [env:FYSETC_F6_13] -platform = atmelavr -extends = common_avr8 -board = fysetc_f6_13 +platform = atmelavr +extends = common_avr8 +board = fysetc_f6_13 # # FYSETC F6 V1.4 # [env:FYSETC_F6_14] -platform = atmelavr -extends = common_avr8 -board = fysetc_f6_14 +platform = atmelavr +extends = common_avr8 +board = fysetc_f6_14 # # Sanguinololu (ATmega644p) # [env:sanguino644p] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega644p +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega644p # # Sanguinololu (ATmega1284p) # [env:sanguino1284p] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega1284p +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p board_upload.maximum_size = 126976 # # Melzi and clones (ATmega1284p) # [env:melzi] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega1284p -upload_speed = 57600 -board_upload.maximum_size = 126976 +platform = atmelavr +extends = env:sanguino1284p +upload_speed = 57600 + +# +# Sanguinololu (ATmega1284p stock bootloader with tuned flags) +# + +[tuned_1284p] +build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues + +[env:sanguino1284p_optimized] +platform = atmelavr +extends = env:melzi +build_flags = ${tuned_1284p.build_flags} + +# +# Melzi and clones (alias for sanguino1284p_optimized) +# +[env:melzi_optimized] +platform = atmelavr +extends = env:sanguino1284p_optimized # # Melzi and clones (Optiboot bootloader) # [env:melzi_optiboot] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega1284p -upload_speed = 115200 +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p +upload_speed = 115200 # # Melzi and clones (Zonestar Melzi2 with tuned flags) # -[env:melzi_optimized] -platform = atmelavr -extends = env:melzi_optiboot -build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues -build_unflags = -g -ggdb +[env:melzi_optiboot_optimized] +platform = atmelavr +extends = env:melzi_optiboot +build_flags = ${tuned_1284p.build_flags} # # AT90USB1286 boards using CDC bootloader @@ -558,10 +574,10 @@ build_unflags = -g -ggdb # - TEENSYLU # [env:at90usb1286_cdc] -platform = teensy -extends = common_avr8 -board = at90usb1286 -lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet +platform = teensy +extends = common_avr8 +board = at90usb1286 +lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet # # AT90USB1286 boards using DFU bootloader @@ -570,8 +586,8 @@ lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet # - ? 5DPRINT ? # [env:at90usb1286_dfu] -platform = teensy -extends = env:at90usb1286_cdc +platform = teensy +extends = env:at90usb1286_cdc ################################# # # @@ -586,20 +602,20 @@ extends = env:at90usb1286_cdc # - RADDS # [env:DUE] -platform = atmelsam -board = due -src_filter = ${common.default_src_filter} + + +platform = atmelsam +board = due +src_filter = ${common.default_src_filter} + + [env:DUE_USB] -platform = atmelsam -extends = env:DUE -board = dueUSB +platform = atmelsam +extends = env:DUE +board = dueUSB [env:DUE_debug] # Used when WATCHDOG_RESET_MANUAL is enabled -platform = atmelsam -extends = env:DUE -build_flags = ${common.build_flags} +platform = atmelsam +extends = env:DUE +build_flags = ${common.build_flags} -funwind-tables -mpoke-function-name @@ -607,24 +623,24 @@ build_flags = ${common.build_flags} # Archim SAM # [common_DUE_archim] -platform = atmelsam -extends = env:DUE -board = archim -build_flags = ${common.build_flags} +platform = atmelsam +extends = env:DUE +board = archim +build_flags = ${common.build_flags} -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON board_build.variants_dir = buildroot/share/PlatformIO/variants/ -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common.extra_scripts} Marlin/src/HAL/DUE/upload_extra_script.py [env:DUE_archim] -platform = ${common_DUE_archim.platform} -extends = common_DUE_archim +platform = ${common_DUE_archim.platform} +extends = common_DUE_archim # Used when WATCHDOG_RESET_MANUAL is enabled [env:DUE_archim_debug] -platform = ${common_DUE_archim.platform} -extends = common_DUE_archim -build_flags = ${common_DUE_archim.build_flags} -funwind-tables -mpoke-function-name +platform = ${common_DUE_archim.platform} +extends = common_DUE_archim +build_flags = ${common_DUE_archim.build_flags} -funwind-tables -mpoke-function-name ################################# # # @@ -678,14 +694,14 @@ build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC17 # NXP LPC176x ARM Cortex-M3 # [env:LPC1768] -platform = ${common_LPC.platform} -extends = common_LPC -board = nxp_lpc1768 +platform = ${common_LPC.platform} +extends = common_LPC +board = nxp_lpc1768 [env:LPC1769] -platform = ${common_LPC.platform} -extends = common_LPC -board = nxp_lpc1769 +platform = ${common_LPC.platform} +extends = common_LPC +board = nxp_lpc1769 ################################# # # From af5cf823eaee255fbcc6b7a7c746a8e1a651cc02 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 7 Nov 2020 06:00:29 -0300 Subject: [PATCH 0528/1370] Color UI single touch menu navigation (#20053) --- Marlin/Configuration.h | 4 ++++ Marlin/src/lcd/tft/touch.cpp | 5 ++++- Marlin/src/lcd/tft/ui_320x240.cpp | 5 ++++- Marlin/src/lcd/tft/ui_480x320.cpp | 5 ++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1297c61aed..719e11b899 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2343,6 +2343,10 @@ //#define XPT2046_Y_CALIBRATION -8981 //#define XPT2046_X_OFFSET -43 //#define XPT2046_Y_OFFSET 257 + + #if ENABLED(TFT_COLOR_UI) + //#define SINGLE_TOUCH_NAVIGATION + #endif #endif // diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index cde9698024..adbc2923a4 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -206,7 +206,10 @@ void Touch::touch(touch_control_t *control) { case MENU_SCREEN: ui.goto_screen((screenFunc_t)control->data); break; case BACK: ui.goto_previous_screen(); break; - case CLICK: ui.lcd_clicked = true; break; + case CLICK: + TERN_(SINGLE_TOUCH_NAVIGATION, ui.encoderPosition = control->data); + ui.lcd_clicked = true; + break; #if HAS_RESUME_CONTINUE case RESUME_CONTINUE: extern bool wait_for_user; wait_for_user = false; break; #endif diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 4e2cd8acc4..999cec29ba 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -647,7 +647,10 @@ void menu_item(const uint8_t row, bool sel ) { #endif menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 2 + 34 * row, 320, 32, encoderTopLine + row)); + #if ENABLED(TOUCH_SCREEN) + const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? CLICK : MENU_ITEM; + touch.add_control(tct, 0, 2 + 34 * row, 320, 32, encoderTopLine + row); + #endif } void MarlinUI::move_axis_screen() { diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 0c44a3151b..9ba5c1b157 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -652,7 +652,10 @@ void menu_item(const uint8_t row, bool sel ) { #endif menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row)); + #if ENABLED(TOUCH_SCREEN) + const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? CLICK : MENU_ITEM; + touch.add_control(tct, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row); + #endif } #if ENABLED(BABYSTEP_ZPROBE_OFFSET) From ec5b2aab15c314de9fed8669ec3316202dbe75fb Mon Sep 17 00:00:00 2001 From: Speaka <48431623+Speaka@users.noreply.github.com> Date: Sat, 7 Nov 2020 10:20:27 +0100 Subject: [PATCH 0529/1370] Tramming Wizard submenu option (#20000) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 4 +- Marlin/src/feature/tramming.h | 59 ++++++++++++ Marlin/src/gcode/bedlevel/G35.cpp | 26 +++--- Marlin/src/lcd/language/language_en.h | 6 +- Marlin/src/lcd/menu/menu_motion.cpp | 8 +- Marlin/src/lcd/menu/menu_tramming.cpp | 93 +++++++++++++++++++ .../PlatformIO/scripts/common-dependencies.h | 3 + buildroot/tests/DUE-tests | 2 +- platformio.ini | 2 + 9 files changed, 184 insertions(+), 19 deletions(-) create mode 100644 Marlin/src/feature/tramming.h create mode 100644 Marlin/src/lcd/menu/menu_tramming.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b39e9e1722..cd8a055ffb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -808,7 +808,9 @@ #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation //#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first - //#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item for Assisted Tramming + + //#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item to run G35 Assisted Tramming (MarlinUI) + //#define ASSISTED_TRAMMING_WIZARD // Make the menu item open a Tramming Wizard sub-menu /** * Screw thread: diff --git a/Marlin/src/feature/tramming.h b/Marlin/src/feature/tramming.h new file mode 100644 index 0000000000..79f7407716 --- /dev/null +++ b/Marlin/src/feature/tramming.h @@ -0,0 +1,59 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../inc/MarlinConfigPre.h" + +#if !WITHIN(TRAMMING_SCREW_THREAD, 30, 51) || TRAMMING_SCREW_THREAD % 10 > 1 + #error "TRAMMING_SCREW_THREAD must be equal to 30, 31, 40, 41, 50, or 51." +#endif + +constexpr xy_pos_t screws_tilt_adjust_pos[] = TRAMMING_POINT_XY; + +#define G35_PROBE_COUNT COUNT(screws_tilt_adjust_pos) +static_assert(G35_PROBE_COUNT >= 3, "TRAMMING_POINT_XY requires at least 3 XY positions."); + +extern const char point_name_1[], point_name_2[], point_name_3[] + #ifdef TRAMMING_POINT_NAME_4 + , point_name_4[] + #ifdef TRAMMING_POINT_NAME_5 + , point_name_5[] + #endif + #endif +; + +#define _NR_TRAM_NAMES 2 +#ifdef TRAMMING_POINT_NAME_3 + #undef _NR_TRAM_NAMES + #define _NR_TRAM_NAMES 3 + #ifdef TRAMMING_POINT_NAME_4 + #undef _NR_TRAM_NAMES + #define _NR_TRAM_NAMES 4 + #ifdef TRAMMING_POINT_NAME_5 + #undef _NR_TRAM_NAMES + #define _NR_TRAM_NAMES 5 + #endif + #endif +#endif +static_assert(_NR_TRAM_NAMES >= G35_PROBE_COUNT, "Define enough TRAMMING_POINT_NAME_s for all TRAMMING_POINT_XY entries."); +#undef _NR_TRAM_NAMES + +extern PGM_P const tramming_point_name[]; diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index b39a7b9ed8..f0abc543cb 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -36,19 +36,23 @@ #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../../core/debug_out.h" -constexpr xy_pos_t screws_tilt_adjust_pos[] = TRAMMING_POINT_XY; +// +// Define tramming point names. +// -static PGMSTR(point_name_1, TRAMMING_POINT_NAME_1); -static PGMSTR(point_name_2, TRAMMING_POINT_NAME_2); -static PGMSTR(point_name_3, TRAMMING_POINT_NAME_3); +#include "../../feature/tramming.h" // Validate + +PGMSTR(point_name_1, TRAMMING_POINT_NAME_1); +PGMSTR(point_name_2, TRAMMING_POINT_NAME_2); +PGMSTR(point_name_3, TRAMMING_POINT_NAME_3); #ifdef TRAMMING_POINT_NAME_4 - static PGMSTR(point_name_4, TRAMMING_POINT_NAME_4); + PGMSTR(point_name_4, TRAMMING_POINT_NAME_4); #ifdef TRAMMING_POINT_NAME_5 - static PGMSTR(point_name_5, TRAMMING_POINT_NAME_5); + PGMSTR(point_name_5, TRAMMING_POINT_NAME_5); #endif #endif -static PGM_P const tramming_point_name[] PROGMEM = { +PGM_P const tramming_point_name[] PROGMEM = { point_name_1, point_name_2, point_name_3 #ifdef TRAMMING_POINT_NAME_4 , point_name_4 @@ -58,14 +62,6 @@ static PGM_P const tramming_point_name[] PROGMEM = { #endif }; -#define G35_PROBE_COUNT COUNT(screws_tilt_adjust_pos) - -#if !WITHIN(TRAMMING_SCREW_THREAD, 30, 51) || TRAMMING_SCREW_THREAD % 10 > 1 - #error "TRAMMING_SCREW_THREAD must be equal to 30, 31, 40, 41, 50, or 51." -#endif - -static_assert(G35_PROBE_COUNT > 2, "TRAMMING_POINT_XY requires at least 3 XY positions."); - /** * G35: Read bed corners to help adjust bed screws * diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 42954d79e5..2f50902bff 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -73,7 +73,6 @@ namespace Language_en { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming"); PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Iteration: %i"); PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Accuracy Decreasing!"); PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Accuracy Achieved"); @@ -85,6 +84,10 @@ namespace Language_en { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Set Home Offsets"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets Applied"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Set Origin"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming"); + PROGMEM Language_Str MSG_TRAMMING_WIZARD = _UxGT("Tramming Wizard"); + PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Select Origin"); + PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Last value "); #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preheat ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preheat ") PREHEAT_1_LABEL " ~"; @@ -666,6 +669,7 @@ namespace Language_en { PROGMEM Language_Str MSG_REHEATING = _UxGT("Reheating..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Probe Wizard"); + PROGMEM Language_Str MSG_SOUND = _UxGT("Sound"); } diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 2972920f34..c681842e90 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -305,6 +305,10 @@ void menu_move() { void menu_bed_leveling(); #endif +#if ENABLED(ASSISTED_TRAMMING_WIZARD) + void goto_tramming_wizard(); +#endif + void menu_motion() { START_MENU(); @@ -346,7 +350,9 @@ void menu_motion() { // // Assisted Bed Tramming // - #if ENABLED(ASSISTED_TRAMMING_MENU_ITEM) + #if ENABLED(ASSISTED_TRAMMING_WIZARD) + SUBMENU(MSG_TRAMMING_WIZARD, goto_tramming_wizard); + #elif ENABLED(ASSISTED_TRAMMING_MENU_ITEM) GCODES_ITEM(MSG_ASSISTED_TRAMMING, PSTR("G35")); #endif diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp new file mode 100644 index 0000000000..c01f983833 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -0,0 +1,93 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// +// Bed Tramming Wizard +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, ASSISTED_TRAMMING_WIZARD) + +#include "menu_item.h" + +#include "../../feature/tramming.h" + +#include "../../module/motion.h" +#include "../../module/probe.h" +#include "../../gcode/queue.h" + +//#define DEBUG_OUT 1 +#include "../../core/debug_out.h" + +float z_measured[G35_PROBE_COUNT] = { 0 }; +static uint8_t tram_index = 0; + +bool probe_single_point() { + const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[tram_index], PROBE_PT_RAISE, 0, true); + DEBUG_ECHOLNPAIR("probe_single_point: ", z_probed_height, "mm"); + z_measured[tram_index] = z_probed_height; + return !isnan(z_probed_height); +} + +void _menu_single_probe(const uint8_t point) { + tram_index = point; + DEBUG_ECHOLNPAIR("Screen: single probe screen Arg:", point); + START_MENU(); + STATIC_ITEM(MSG_LEVEL_CORNERS, SS_LEFT); + STATIC_ITEM(MSG_LAST_VALUE_SP, SS_LEFT, ftostr42_52(z_measured[0] - z_measured[point])); // Print diff + ACTION_ITEM(MSG_UBL_BC_INSERT2, []{ if (probe_single_point()) ui.refresh(); }); + ACTION_ITEM(MSG_BUTTON_DONE, []{ ui.goto_previous_screen_no_defer(); }); // Back + END_MENU(); +} + +void tramming_wizard_menu() { + DEBUG_ECHOLNPAIR("Screen: tramming_wizard_menu"); + START_MENU(); + STATIC_ITEM(MSG_SELECT_ORIGIN); + + // Draw a menu item for each tramming point + LOOP_L_N(i, G35_PROBE_COUNT) + SUBMENU_N_P(i, (char*)pgm_read_ptr(&tramming_point_name[i]), []{ _menu_single_probe(MenuItemBase::itemIndex); }); + + ACTION_ITEM(MSG_BUTTON_DONE, []{ ui.goto_previous_screen_no_defer(); }); + END_MENU(); +} + +// Init the wizard and enter the submenu +void goto_tramming_wizard() { + DEBUG_ECHOLNPAIR("Screen: goto_tramming_wizard", 1); + tram_index = 0; + ui.defer_status_screen(); + //probe_single_point(); // Probe first point to get differences + + // Inject G28, wait for homing to complete, + set_all_unhomed(); + queue.inject_P(G28_STR); + ui.goto_screen([]{ + _lcd_draw_homing(); + if (all_axes_homed()) + ui.goto_screen(tramming_wizard_menu); + }); +} + +#endif // HAS_LCD_MENU && ASSISTED_TRAMMING_WIZARD diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index f5b36c407e..ed2f46abae 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -111,6 +111,9 @@ #if ENABLED(TOUCH_SCREEN_CALIBRATION) #define HAS_MENU_TOUCH_SCREEN #endif + #if ENABLED(ASSISTED_TRAMMING_WIZARD) + #define HAS_MENU_TRAMMING + #endif #if ENABLED(AUTO_BED_LEVELING_UBL) #define HAS_MENU_UBL #endif diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 0da0d798d0..4a7c492d7b 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -14,7 +14,7 @@ opt_set TEMP_SENSOR_BED 2 opt_set GRID_MAX_POINTS_X 16 opt_set FANMUX0_PIN 53 opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING ASSISTED_TRAMMING \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD \ EEPROM_SETTINGS SDSUPPORT BINARY_FILE_TRANSFER \ BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ diff --git a/platformio.ini b/platformio.ini index 07edbf3918..af7ce47a50 100644 --- a/platformio.ini +++ b/platformio.ini @@ -48,6 +48,7 @@ default_src_filter = + - - + - - - + - - - - - @@ -259,6 +260,7 @@ HAS_MENU_CUTTER = src_filter=+ HAS_MENU_TEMPERATURE = src_filter=+ HAS_MENU_TMC = src_filter=+ HAS_MENU_TOUCH_SCREEN = src_filter=+ +HAS_MENU_TRAMMING = src_filter=+ HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_CHIRON = src_filter=+ + ANYCUBIC_LCD_I3MEGA = src_filter=+ + From b129652597cd44ef7f662e63282ec04fb6c78473 Mon Sep 17 00:00:00 2001 From: LinFor Date: Sat, 7 Nov 2020 12:37:45 +0300 Subject: [PATCH 0530/1370] Fix Endstop Interrupts with SPI endstops, sanity checks (#20051) Co-authored-by: Scott Lahteine --- Marlin/src/inc/SanityCheck.h | 110 ++++++++++++++++++--------------- Marlin/src/module/endstops.cpp | 3 + 2 files changed, 64 insertions(+), 49 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ef79241d71..b6ff725470 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1941,7 +1941,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif // Delta and Cartesian use 3 homing endstops -#if !IS_SCARA +#if NONE(IS_SCARA, SPI_ENDSTOPS) #if X_HOME_DIR < 0 && DISABLED(USE_XMIN_PLUG) #error "Enable USE_XMIN_PLUG when homing X to MIN." #elif X_HOME_DIR > 0 && DISABLED(USE_XMAX_PLUG) @@ -2510,56 +2510,68 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #define Y_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Y,TMC2209) #define Z_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Z,TMC2209) + #if NONE(SPI_ENDSTOPS, ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS) + #if X_SENSORLESS && X_HOME_DIR < 0 && DISABLED(ENDSTOPPULLUP_XMIN) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMIN (or ENDSTOPPULLUPS) when homing to X_MIN." + #elif X_SENSORLESS && X_HOME_DIR > 0 && DISABLED(ENDSTOPPULLUP_XMAX) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMAX (or ENDSTOPPULLUPS) when homing to X_MAX." + #elif Y_SENSORLESS && Y_HOME_DIR < 0 && DISABLED(ENDSTOPPULLUP_YMIN) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMIN (or ENDSTOPPULLUPS) when homing to Y_MIN." + #elif Y_SENSORLESS && Y_HOME_DIR > 0 && DISABLED(ENDSTOPPULLUP_YMAX) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMAX (or ENDSTOPPULLUPS) when homing to Y_MAX." + #elif Z_SENSORLESS && Z_HOME_DIR < 0 && DISABLED(ENDSTOPPULLUP_ZMIN) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMIN (or ENDSTOPPULLUPS) when homing to Z_MIN." + #elif Z_SENSORLESS && Z_HOME_DIR > 0 && DISABLED(ENDSTOPPULLUP_ZMAX) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMAX (or ENDSTOPPULLUPS) when homing to Z_MAX." + #endif + #endif + + #if ENABLED(SPI_ENDSTOPS) + #if ENABLED(QUICK_HOME) + #warning "SPI_ENDSTOPS may be unreliable with QUICK_HOME. Adjust back-offs for better results." + #endif + #else + #if X_SENSORLESS && X_HOME_DIR < 0 && X_MIN_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING + #if X_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING = true when homing to X_MIN." + #else + #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to X_MIN." + #endif + #elif X_SENSORLESS && X_HOME_DIR > 0 && X_MAX_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING + #if X_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING = true when homing to X_MAX." + #else + #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to X_MAX." + #endif + #elif Y_SENSORLESS && Y_HOME_DIR < 0 && Y_MIN_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING + #if Y_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING = true when homing to Y_MIN." + #else + #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to Y_MIN." + #endif + #elif Y_SENSORLESS && Y_HOME_DIR > 0 && Y_MAX_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING + #if Y_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING = true when homing to Y_MAX." + #else + #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to Y_MAX." + #endif + #elif Z_SENSORLESS && Z_HOME_DIR < 0 && Z_MIN_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING + #if Z_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING = true when homing to Z_MIN." + #else + #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to Z_MIN." + #endif + #elif Z_SENSORLESS && Z_HOME_DIR > 0 && Z_MAX_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING + #if Z_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING = true when homing to Z_MAX." + #else + #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to Z_MAX." + #endif + #endif + #endif + #if ENABLED(DELTA) && !BOTH(STEALTHCHOP_XY, STEALTHCHOP_Z) #error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP_XY and STEALTHCHOP_Z." - #elif X_SENSORLESS && X_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_XMIN) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMIN (or ENDSTOPPULLUPS) when homing to X_MIN." - #elif X_SENSORLESS && X_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_XMAX) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMAX (or ENDSTOPPULLUPS) when homing to X_MAX." - #elif Y_SENSORLESS && Y_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_YMIN) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMIN (or ENDSTOPPULLUPS) when homing to Y_MIN." - #elif Y_SENSORLESS && Y_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_YMAX) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMAX (or ENDSTOPPULLUPS) when homing to Y_MAX." - #elif Z_SENSORLESS && Z_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMIN (or ENDSTOPPULLUPS) when homing to Z_MIN." - #elif Z_SENSORLESS && Z_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMAX) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMAX (or ENDSTOPPULLUPS) when homing to Z_MAX." - #elif X_SENSORLESS && X_HOME_DIR < 0 && X_MIN_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING - #if X_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING = true when homing to X_MIN." - #else - #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to X_MIN." - #endif - #elif X_SENSORLESS && X_HOME_DIR > 0 && X_MAX_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING - #if X_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING = true when homing to X_MAX." - #else - #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to X_MAX." - #endif - #elif Y_SENSORLESS && Y_HOME_DIR < 0 && Y_MIN_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING - #if Y_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING = true when homing to Y_MIN." - #else - #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to Y_MIN." - #endif - #elif Y_SENSORLESS && Y_HOME_DIR > 0 && Y_MAX_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING - #if Y_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING = true when homing to Y_MAX." - #else - #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to Y_MAX." - #endif - #elif Z_SENSORLESS && Z_HOME_DIR < 0 && Z_MIN_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING - #if Z_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING = true when homing to Z_MIN." - #else - #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to Z_MIN." - #endif - #elif Z_SENSORLESS && Z_HOME_DIR > 0 && Z_MAX_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING - #if Z_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING = true when homing to Z_MAX." - #else - #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to Z_MAX." - #endif #elif ENDSTOP_NOISE_THRESHOLD #error "SENSORLESS_HOMING is incompatible with ENDSTOP_NOISE_THRESHOLD." #elif !(X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS) diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 928c9ad8b9..825194cf45 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -899,6 +899,9 @@ void Endstops::update() { hit = true; } #endif + + if (TERN0(ENDSTOP_INTERRUPTS_FEATURE, hit)) update(); + return hit; } From 426d555f6e371aec701424796c656084179faa59 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 7 Nov 2020 16:20:19 -0600 Subject: [PATCH 0531/1370] TFT cleanup --- Marlin/src/HAL/STM32/tft/tft_fsmc.h | 20 +++++++++----------- Marlin/src/HAL/STM32F1/tft/tft_fsmc.h | 8 ++++---- Marlin/src/lcd/tft/ui_480x320.cpp | 14 +++++++------- Marlin/src/lcd/tft_io/ssd1963.h | 2 +- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h index cbec7613ef..e2e0128c5e 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h @@ -21,30 +21,28 @@ */ #pragma once +#include "../../../inc/MarlinConfig.h" + #ifdef STM32F1xx #include "stm32f1xx_hal.h" + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) #elif defined(STM32F4xx) #include "stm32f4xx_hal.h" + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) #else - #error FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware. + #error "FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware." #endif #ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) #endif #ifndef LCD_READ_ID4 #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) #endif -#define DATASIZE_8BIT SPI_DATASIZE_8BIT -#define DATASIZE_16BIT SPI_DATASIZE_16BIT -#define TFT_IO_DRIVER TFT_FSMC - -#ifdef STM32F1xx - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) -#elif defined(STM32F4xx) - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) -#endif +#define DATASIZE_8BIT SPI_DATASIZE_8BIT +#define DATASIZE_16BIT SPI_DATASIZE_16BIT +#define TFT_IO_DRIVER TFT_FSMC typedef struct { __IO uint16_t REG; diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h index 11eb1ffa84..d9ee1f4c77 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h @@ -22,7 +22,7 @@ #pragma once #ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) #endif #ifndef LCD_READ_ID4 #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) @@ -30,9 +30,9 @@ #include -#define DATASIZE_8BIT DMA_SIZE_8BITS -#define DATASIZE_16BIT DMA_SIZE_16BITS -#define TFT_IO_DRIVER TFT_FSMC +#define DATASIZE_8BIT DMA_SIZE_8BITS +#define DATASIZE_16BIT DMA_SIZE_16BITS +#define TFT_IO_DRIVER TFT_FSMC typedef struct { __IO uint16_t REG; diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 9ba5c1b157..e2bbdcde7f 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -428,21 +428,21 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const valu extern screenFunc_t _manual_move_func_ptr; if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { - #define SLIDER_LENGHT 336 + #define SLIDER_LENGTH 336 #define SLIDER_Y_POSITION 186 - tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); + tft.canvas((TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION, SLIDER_LENGTH, 16); tft.set_background(COLOR_BACKGROUND); - int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; + int16_t position = (SLIDER_LENGTH - 2) * ui.encoderPosition / maxEditValue; tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); tft.add_bar(1, 6, position, 4, COLOR_SLIDER); - tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); - tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); + tft.add_bar(position + 1, 6, SLIDER_LENGTH - 2 - position, 4, COLOR_SLIDER_INACTIVE); + tft.add_bar(SLIDER_LENGTH - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); #if ENABLED(TOUCH_SCREEN) - tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); - touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); + tft.add_image((SLIDER_LENGTH - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); + touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGTH, 32, maxEditValue); #endif } diff --git a/Marlin/src/lcd/tft_io/ssd1963.h b/Marlin/src/lcd/tft_io/ssd1963.h index 4953a96233..af42e306c6 100644 --- a/Marlin/src/lcd/tft_io/ssd1963.h +++ b/Marlin/src/lcd/tft_io/ssd1963.h @@ -125,7 +125,7 @@ static const uint16_t ssd1963_init[] = { ESC_REG(SSD1963_NORON), ESC_REG(SSD1963_DISPON), - ESC_REG(SSD1963_SPWMCFG), 0x0006, 0x00f0, 0x0001, 0x00f0, 0x0000, 0x0000, + ESC_REG(SSD1963_SPWMCFG), 0x0006, 0x00F0, 0x0001, 0x00F0, 0x0000, 0x0000, ESC_REG(SSD1963_SDBCCFG), 0x000D, ESC_END }; From dfb6dd2ad279094ee78bdbde716818584543fe07 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 7 Nov 2020 16:53:37 -0600 Subject: [PATCH 0532/1370] Apply some pins formatting --- Marlin/src/pins/mega/pins_GT2560_V3_A20.h | 14 +++++++------- Marlin/src/pins/ramps/pins_3DRAG.h | 2 +- Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h | 10 +++++----- Marlin/src/pins/ramps/pins_DAGOMA_F5.h | 10 +++++----- Marlin/src/pins/ramps/pins_K8400.h | 10 +++++----- Marlin/src/pins/ramps/pins_MKS_BASE_16.h | 14 +++++++------- Marlin/src/pins/ramps/pins_RL200.h | 18 +++++++++--------- Marlin/src/pins/ramps/pins_TANGO.h | 14 +++++++------- Marlin/src/pins/ramps/pins_VORON.h | 10 +++++----- Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h | 14 +++++++------- Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h | 12 ++++++------ .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h | 18 +++++++++--------- .../src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h | 18 +++++++++--------- 13 files changed, 82 insertions(+), 82 deletions(-) diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h index 20cccf148f..c445f5b241 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h @@ -25,17 +25,17 @@ * Geeetech A20M pin assignment */ -#define LCD_PINS_RS 5 -#define LCD_PINS_ENABLE 36 -#define LCD_PINS_D4 21 -#define LCD_PINS_D7 6 +#define LCD_PINS_RS 5 +#define LCD_PINS_ENABLE 36 +#define LCD_PINS_D4 21 +#define LCD_PINS_D7 6 #define SPEAKER // The speaker can produce tones #if IS_NEWPANEL - #define BTN_EN1 16 - #define BTN_EN2 17 - #define BTN_ENC 19 + #define BTN_EN1 16 + #define BTN_EN2 17 + #define BTN_ENC 19 #endif #include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h index b7f0517aac..5a0afdc550 100644 --- a/Marlin/src/pins/ramps/pins_3DRAG.h +++ b/Marlin/src/pins/ramps/pins_3DRAG.h @@ -157,7 +157,7 @@ #define SPINDLE_LASER_PWM_PIN 46 // Hardware PWM #define SPINDLE_LASER_ENA_PIN 62 // Pullup! #define SPINDLE_DIR_PIN 48 - #elif !BOTH(IS_ULTRA_LCD, IS_NEWPANEL) // use expansion header if no LCD in use + #elif !BOTH(IS_ULTRA_LCD, IS_NEWPANEL) // Use expansion header if no LCD in use #define SPINDLE_LASER_ENA_PIN 16 // Pullup or pulldown! #define SPINDLE_DIR_PIN 17 #endif diff --git a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h index af1adabbbc..97ef1b4fd8 100644 --- a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h +++ b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h @@ -34,9 +34,9 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_ENA_PIN 66 // Pullup or pulldown! -#define SPINDLE_DIR_PIN 67 -#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 66 // Pullup or pulldown! +#define SPINDLE_DIR_PIN 67 +#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM #include "pins_RAMPS.h" @@ -45,5 +45,5 @@ // #undef TEMP_0_PIN #undef TEMP_1_PIN -#define TEMP_0_PIN 9 // Analog Input -#define TEMP_1_PIN 11 // Analog Input +#define TEMP_0_PIN 9 // Analog Input +#define TEMP_1_PIN 11 // Analog Input diff --git a/Marlin/src/pins/ramps/pins_DAGOMA_F5.h b/Marlin/src/pins/ramps/pins_DAGOMA_F5.h index 667ae47f70..07e46acfe7 100644 --- a/Marlin/src/pins/ramps/pins_DAGOMA_F5.h +++ b/Marlin/src/pins/ramps/pins_DAGOMA_F5.h @@ -30,13 +30,13 @@ // // Endstops // -#define X_STOP_PIN 2 -#define Y_STOP_PIN 3 -#define Z_STOP_PIN 15 +#define X_STOP_PIN 2 +#define Y_STOP_PIN 3 +#define Z_STOP_PIN 15 -#define FIL_RUNOUT_PIN 39 +#define FIL_RUNOUT_PIN 39 #if EXTRUDERS > 1 - #define FIL_RUNOUT2_PIN 14 + #define FIL_RUNOUT2_PIN 14 #endif // diff --git a/Marlin/src/pins/ramps/pins_K8400.h b/Marlin/src/pins/ramps/pins_K8400.h index c36e291598..af687927f4 100644 --- a/Marlin/src/pins/ramps/pins_K8400.h +++ b/Marlin/src/pins/ramps/pins_K8400.h @@ -40,8 +40,8 @@ // // Limit Switches // -#define X_STOP_PIN 3 -#define Y_STOP_PIN 14 +#define X_STOP_PIN 3 +#define Y_STOP_PIN 14 #undef X_MIN_PIN #undef X_MAX_PIN @@ -52,13 +52,13 @@ // Steppers // #undef E1_STEP_PIN -#define E1_STEP_PIN 32 +#define E1_STEP_PIN 32 // // Heaters / Fans // #undef HEATER_1_PIN -#define HEATER_1_PIN 11 +#define HEATER_1_PIN 11 // // Misc. Functions @@ -69,5 +69,5 @@ #if Z_STEP_PIN == 26 #undef Z_STEP_PIN - #define Z_STEP_PIN 32 + #define Z_STEP_PIN 32 #endif diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h index 42796acf8b..a4dfca21b4 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h @@ -30,30 +30,30 @@ #endif #define BOARD_INFO_NAME "MKS BASE 1.6" -#define MKS_BASE_VERSION 16 +#define MKS_BASE_VERSION 16 // // Servos // -#define SERVO1_PIN 12 // Digital 12 / Pin 25 +#define SERVO1_PIN 12 // Digital 12 / Pin 25 // // Omitted RAMPS pins // #ifndef SERVO2_PIN - #define SERVO2_PIN -1 + #define SERVO2_PIN -1 #endif #ifndef SERVO3_PIN - #define SERVO3_PIN -1 + #define SERVO3_PIN -1 #endif #ifndef FILWIDTH_PIN - #define FILWIDTH_PIN -1 + #define FILWIDTH_PIN -1 #endif #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN -1 + #define FIL_RUNOUT_PIN -1 #endif #ifndef PS_ON_PIN - #define PS_ON_PIN -1 + #define PS_ON_PIN -1 #endif #include "pins_MKS_BASE_common.h" diff --git a/Marlin/src/pins/ramps/pins_RL200.h b/Marlin/src/pins/ramps/pins_RL200.h index 3fccb90276..047ad160be 100644 --- a/Marlin/src/pins/ramps/pins_RL200.h +++ b/Marlin/src/pins/ramps/pins_RL200.h @@ -37,16 +37,16 @@ #error "You must set ([XYZ]|Z2|E0)_DRIVER_TYPE to DRV8825 in Configuration.h for RL200." #endif -#define E0_STEP_PIN 26 // (RUMBA E1 pins) -#define E0_DIR_PIN 25 -#define E0_ENABLE_PIN 27 +#define E0_STEP_PIN 26 // (RUMBA E1 pins) +#define E0_DIR_PIN 25 +#define E0_ENABLE_PIN 27 -#define E1_STEP_PIN 29 // (RUMBA E2 pins) -#define E1_DIR_PIN 28 -#define E1_ENABLE_PIN 39 +#define E1_STEP_PIN 29 // (RUMBA E2 pins) +#define E1_DIR_PIN 28 +#define E1_ENABLE_PIN 39 -#define Z2_STEP_PIN 23 // (RUMBA E0 pins) -#define Z2_DIR_PIN 22 -#define Z2_ENABLE_PIN 24 +#define Z2_STEP_PIN 23 // (RUMBA E0 pins) +#define Z2_DIR_PIN 22 +#define Z2_ENABLE_PIN 24 #include "pins_RUMBA.h" diff --git a/Marlin/src/pins/ramps/pins_TANGO.h b/Marlin/src/pins/ramps/pins_TANGO.h index 715444cee2..451d2f874d 100644 --- a/Marlin/src/pins/ramps/pins_TANGO.h +++ b/Marlin/src/pins/ramps/pins_TANGO.h @@ -27,26 +27,26 @@ #define BOARD_INFO_NAME "Tango" -#define FAN_PIN 8 -#define FAN1_PIN -1 +#define FAN_PIN 8 +#define FAN1_PIN -1 #ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 7 + #define E0_AUTO_FAN_PIN 7 #endif #ifndef TEMP_0_PIN #if TEMP_SENSOR_0 == -1 - #define TEMP_0_PIN 10 // Analog Input (connector *K1* on Tango thermocouple ADD ON is used) + #define TEMP_0_PIN 10 // Analog Input (connector *K1* on Tango thermocouple ADD ON is used) #else - #define TEMP_0_PIN 15 // Analog Input (default connector for thermistor *T0* on rumba board is used) + #define TEMP_0_PIN 15 // Analog Input (default connector for thermistor *T0* on rumba board is used) #endif #endif #ifndef TEMP_1_PIN #if TEMP_SENSOR_1 == -1 - #define TEMP_1_PIN 9 // Analog Input (connector *K2* on Tango thermocouple ADD ON is used) + #define TEMP_1_PIN 9 // Analog Input (connector *K2* on Tango thermocouple ADD ON is used) #else - #define TEMP_1_PIN 14 // Analog Input (default connector for thermistor *T1* on rumba board is used) + #define TEMP_1_PIN 14 // Analog Input (default connector for thermistor *T1* on rumba board is used) #endif #endif diff --git a/Marlin/src/pins/ramps/pins_VORON.h b/Marlin/src/pins/ramps/pins_VORON.h index 40ec71b6f0..9ab6573468 100644 --- a/Marlin/src/pins/ramps/pins_VORON.h +++ b/Marlin/src/pins/ramps/pins_VORON.h @@ -28,7 +28,7 @@ #define BOARD_INFO_NAME "VORON Design v2" -#define RAMPS_D8_PIN 11 +#define RAMPS_D8_PIN 11 #include "pins_RAMPS.h" @@ -36,17 +36,17 @@ // Heaters / Fans // #undef FAN_PIN -#define FAN_PIN 5 // Using the pin for the controller fan since controller fan is always on. -#define CONTROLLER_FAN_PIN 8 +#define FAN_PIN 5 // Using the pin for the controller fan since controller fan is always on. +#define CONTROLLER_FAN_PIN 8 // // Auto fans // #ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 6 // Servo pin 6 for E3D Fan + #define E0_AUTO_FAN_PIN 6 // Servo pin 6 for E3D Fan #endif #ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN 6 // Servo pin 6 for E3D Fan (same pin for both extruders since it's the same fan) + #define E1_AUTO_FAN_PIN 6 // Servo pin 6 for E3D Fan (same pin for both extruders since it's the same fan) #endif // diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index 9f406c1f78..f110fe5794 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -62,17 +62,17 @@ #undef LCD_PINS_D6 #undef LCD_PINS_D7 -#define LCD_SDSS 31 // Smart Controller SD card reader (rather than the Melzi) -#define LCD_PINS_RS 28 // ST9720 CS -#define LCD_PINS_ENABLE 17 // ST9720 DAT -#define LCD_PINS_D4 30 // ST9720 CLK +#define LCD_SDSS 31 // Smart Controller SD card reader (rather than the Melzi) +#define LCD_PINS_RS 28 // ST9720 CS +#define LCD_PINS_ENABLE 17 // ST9720 DAT +#define LCD_PINS_D4 30 // ST9720 CLK #if ENABLED(BLTOUCH) - #define SERVO0_PIN 27 + #define SERVO0_PIN 27 #undef BEEPER_PIN #elif ENABLED(FILAMENT_RUNOUT_SENSOR) #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 27 + #define FIL_RUNOUT_PIN 27 #endif #if FIL_RUNOUT_PIN == BEEPER_PIN #undef BEEPER_PIN @@ -81,7 +81,7 @@ #if ENABLED(MINIPANEL) #undef DOGLCD_CS - #define DOGLCD_CS LCD_PINS_RS + #define DOGLCD_CS LCD_PINS_RS #endif /** diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h index 5014620c6b..8b4faeeaf9 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h @@ -50,9 +50,9 @@ #undef BTN_EN2 #undef BTN_ENC -#define LCD_PINS_RS 17 // ST9720 CS -#define LCD_PINS_ENABLE 16 // ST9720 DAT -#define LCD_PINS_D4 11 // ST9720 CLK -#define BTN_EN1 30 -#define BTN_EN2 29 -#define BTN_ENC 28 +#define LCD_PINS_RS 17 // ST9720 CS +#define LCD_PINS_ENABLE 16 // ST9720 DAT +#define LCD_PINS_D4 11 // ST9720 CLK +#define BTN_EN1 30 +#define BTN_EN2 29 +#define BTN_ENC 28 diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h index 8d384c7396..165c41ffe7 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h @@ -25,7 +25,7 @@ #define BOARD_INFO_NAME "BTT SKR Mini E3 V1.2" -#define NEOPIXEL_PIN PC7 // LED driving pin +#define NEOPIXEL_PIN PC7 // LED driving pin /** * TMC2208/TMC2209 stepper drivers @@ -34,17 +34,17 @@ // // Software serial // - #define X_SERIAL_TX_PIN PB15 - #define X_SERIAL_RX_PIN PB15 + #define X_SERIAL_TX_PIN PB15 + #define X_SERIAL_RX_PIN PB15 - #define Y_SERIAL_TX_PIN PC6 - #define Y_SERIAL_RX_PIN PC6 + #define Y_SERIAL_TX_PIN PC6 + #define Y_SERIAL_RX_PIN PC6 - #define Z_SERIAL_TX_PIN PC10 - #define Z_SERIAL_RX_PIN PC10 + #define Z_SERIAL_TX_PIN PC10 + #define Z_SERIAL_RX_PIN PC10 - #define E0_SERIAL_TX_PIN PC11 - #define E0_SERIAL_RX_PIN PC11 + #define E0_SERIAL_TX_PIN PC11 + #define E0_SERIAL_RX_PIN PC11 // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h index 5e8bd11b4b..65b16755ca 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h @@ -36,7 +36,7 @@ #undef RGB_LED_G_PIN #undef RGB_LED_B_PIN -#define FAN1_PIN PB0 // Fan1 +#define FAN1_PIN PB0 // Fan1 #if HAS_TMC_UART @@ -47,17 +47,17 @@ // // Software serial // - #define X_SERIAL_TX_PIN PA11 - #define X_SERIAL_RX_PIN PA12 + #define X_SERIAL_TX_PIN PA11 + #define X_SERIAL_RX_PIN PA12 - #define Y_SERIAL_TX_PIN PB6 - #define Y_SERIAL_RX_PIN PB7 + #define Y_SERIAL_TX_PIN PB6 + #define Y_SERIAL_RX_PIN PB7 - #define Z_SERIAL_TX_PIN PB10 - #define Z_SERIAL_RX_PIN PB11 + #define Z_SERIAL_TX_PIN PB10 + #define Z_SERIAL_RX_PIN PB11 - #define E0_SERIAL_TX_PIN PA2 - #define E0_SERIAL_RX_PIN PA3 + #define E0_SERIAL_TX_PIN PA2 + #define E0_SERIAL_RX_PIN PA3 // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 From 4052ef709758216c63a4044cfd01201e7948010c Mon Sep 17 00:00:00 2001 From: Albert van Osch Date: Sat, 7 Nov 2020 23:59:19 +0100 Subject: [PATCH 0533/1370] Zonestar Z8 XM2 support (#19991) --- Marlin/src/core/boards.h | 87 +++++----- Marlin/src/lcd/menu/menu_tramming.cpp | 2 +- Marlin/src/lcd/thermistornames.h | 2 + Marlin/src/module/thermistor/thermistor_503.h | 57 +++++++ Marlin/src/module/thermistor/thermistors.h | 3 + Marlin/src/pins/pins.h | 10 +- Marlin/src/pins/ramps/pins_ZRIB_V52.h | 159 ++++++++++++++++++ 7 files changed, 272 insertions(+), 48 deletions(-) create mode 100644 Marlin/src/module/thermistor/thermistor_503.h create mode 100644 Marlin/src/pins/ramps/pins_ZRIB_V52.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 12bf167f40..efccc3716d 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -69,49 +69,50 @@ #define BOARD_MKS_GEN_L 1113 // MKS GEN L #define BOARD_KFB_2 1114 // BigTreeTech or BIQU KFB2.0 #define BOARD_ZRIB_V20 1115 // zrib V2.0 control board (Chinese knock off RAMPS replica) -#define BOARD_FELIX2 1116 // Felix 2.0+ Electronics Board (RAMPS like) -#define BOARD_RIGIDBOARD 1117 // Invent-A-Part RigidBoard -#define BOARD_RIGIDBOARD_V2 1118 // Invent-A-Part RigidBoard V2 -#define BOARD_SAINSMART_2IN1 1119 // Sainsmart 2-in-1 board -#define BOARD_ULTIMAKER 1120 // Ultimaker -#define BOARD_ULTIMAKER_OLD 1121 // Ultimaker (Older electronics. Pre 1.5.4. This is rare) -#define BOARD_AZTEEG_X3 1122 // Azteeg X3 -#define BOARD_AZTEEG_X3_PRO 1123 // Azteeg X3 Pro -#define BOARD_ULTIMAIN_2 1124 // Ultimainboard 2.x (Uses TEMP_SENSOR 20) -#define BOARD_RUMBA 1125 // Rumba -#define BOARD_RUMBA_RAISE3D 1126 // Raise3D N series Rumba derivative -#define BOARD_RL200 1127 // Rapide Lite 200 (v1, low-cost RUMBA clone with drv) -#define BOARD_FORMBOT_TREX2PLUS 1128 // Formbot T-Rex 2 Plus -#define BOARD_FORMBOT_TREX3 1129 // Formbot T-Rex 3 -#define BOARD_FORMBOT_RAPTOR 1130 // Formbot Raptor -#define BOARD_FORMBOT_RAPTOR2 1131 // Formbot Raptor 2 -#define BOARD_BQ_ZUM_MEGA_3D 1132 // bq ZUM Mega 3D -#define BOARD_MAKEBOARD_MINI 1133 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake -#define BOARD_TRIGORILLA_13 1134 // TriGorilla Anycubic version 1.3-based on RAMPS EFB -#define BOARD_TRIGORILLA_14 1135 // ... Ver 1.4 -#define BOARD_TRIGORILLA_14_11 1136 // ... Rev 1.1 (new servo pin order) -#define BOARD_RAMPS_ENDER_4 1137 // Creality: Ender-4, CR-8 -#define BOARD_RAMPS_CREALITY 1138 // Creality: CR10S, CR20, CR-X -#define BOARD_DAGOMA_F5 1139 // Dagoma F5 -#define BOARD_FYSETC_F6_13 1140 // FYSETC F6 1.3 -#define BOARD_FYSETC_F6_14 1141 // FYSETC F6 1.4 -#define BOARD_DUPLICATOR_I3_PLUS 1142 // Wanhao Duplicator i3 Plus -#define BOARD_VORON 1143 // VORON Design -#define BOARD_TRONXY_V3_1_0 1144 // Tronxy TRONXY-V3-1.0 -#define BOARD_Z_BOLT_X_SERIES 1145 // Z-Bolt X Series -#define BOARD_TT_OSCAR 1146 // TT OSCAR -#define BOARD_OVERLORD 1147 // Overlord/Overlord Pro -#define BOARD_HJC2560C_REV1 1148 // ADIMLab Gantry v1 -#define BOARD_HJC2560C_REV2 1149 // ADIMLab Gantry v2 -#define BOARD_TANGO 1150 // BIQU Tango V1 -#define BOARD_MKS_GEN_L_V2 1151 // MKS GEN L V2 -#define BOARD_MKS_GEN_L_V21 1152 // MKS GEN L V2.1 -#define BOARD_COPYMASTER_3D 1153 // Copymaster 3D -#define BOARD_ORTUR_4 1154 // Ortur 4 -#define BOARD_TENLOG_D3_HERO 1155 // Tenlog D3 Hero IDEX printer -#define BOARD_RAMPS_S_12_EEFB 1156 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed) -#define BOARD_RAMPS_S_12_EEEB 1157 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed) -#define BOARD_RAMPS_S_12_EFFB 1158 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed) +#define BOARD_ZRIB_V52 1116 // zrib V5.2 control board (Chinese knock off RAMPS replica) +#define BOARD_FELIX2 1117 // Felix 2.0+ Electronics Board (RAMPS like) +#define BOARD_RIGIDBOARD 1118 // Invent-A-Part RigidBoard +#define BOARD_RIGIDBOARD_V2 1119 // Invent-A-Part RigidBoard V2 +#define BOARD_SAINSMART_2IN1 1120 // Sainsmart 2-in-1 board +#define BOARD_ULTIMAKER 1121 // Ultimaker +#define BOARD_ULTIMAKER_OLD 1122 // Ultimaker (Older electronics. Pre 1.5.4. This is rare) +#define BOARD_AZTEEG_X3 1123 // Azteeg X3 +#define BOARD_AZTEEG_X3_PRO 1124 // Azteeg X3 Pro +#define BOARD_ULTIMAIN_2 1125 // Ultimainboard 2.x (Uses TEMP_SENSOR 20) +#define BOARD_RUMBA 1126 // Rumba +#define BOARD_RUMBA_RAISE3D 1127 // Raise3D N series Rumba derivative +#define BOARD_RL200 1128 // Rapide Lite 200 (v1, low-cost RUMBA clone with drv) +#define BOARD_FORMBOT_TREX2PLUS 1129 // Formbot T-Rex 2 Plus +#define BOARD_FORMBOT_TREX3 1130 // Formbot T-Rex 3 +#define BOARD_FORMBOT_RAPTOR 1131 // Formbot Raptor +#define BOARD_FORMBOT_RAPTOR2 1132 // Formbot Raptor 2 +#define BOARD_BQ_ZUM_MEGA_3D 1133 // bq ZUM Mega 3D +#define BOARD_MAKEBOARD_MINI 1134 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake +#define BOARD_TRIGORILLA_13 1135 // TriGorilla Anycubic version 1.3-based on RAMPS EFB +#define BOARD_TRIGORILLA_14 1136 // ... Ver 1.4 +#define BOARD_TRIGORILLA_14_11 1137 // ... Rev 1.1 (new servo pin order) +#define BOARD_RAMPS_ENDER_4 1138 // Creality: Ender-4, CR-8 +#define BOARD_RAMPS_CREALITY 1139 // Creality: CR10S, CR20, CR-X +#define BOARD_DAGOMA_F5 1140 // Dagoma F5 +#define BOARD_FYSETC_F6_13 1141 // FYSETC F6 1.3 +#define BOARD_FYSETC_F6_14 1142 // FYSETC F6 1.4 +#define BOARD_DUPLICATOR_I3_PLUS 1143 // Wanhao Duplicator i3 Plus +#define BOARD_VORON 1144 // VORON Design +#define BOARD_TRONXY_V3_1_0 1145 // Tronxy TRONXY-V3-1.0 +#define BOARD_Z_BOLT_X_SERIES 1146 // Z-Bolt X Series +#define BOARD_TT_OSCAR 1147 // TT OSCAR +#define BOARD_OVERLORD 1148 // Overlord/Overlord Pro +#define BOARD_HJC2560C_REV1 1149 // ADIMLab Gantry v1 +#define BOARD_HJC2560C_REV2 1150 // ADIMLab Gantry v2 +#define BOARD_TANGO 1151 // BIQU Tango V1 +#define BOARD_MKS_GEN_L_V2 1152 // MKS GEN L V2 +#define BOARD_MKS_GEN_L_V21 1153 // MKS GEN L V2.1 +#define BOARD_COPYMASTER_3D 1154 // Copymaster 3D +#define BOARD_ORTUR_4 1155 // Ortur 4 +#define BOARD_TENLOG_D3_HERO 1156 // Tenlog D3 Hero IDEX printer +#define BOARD_RAMPS_S_12_EEFB 1157 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed) +#define BOARD_RAMPS_S_12_EEEB 1158 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed) +#define BOARD_RAMPS_S_12_EFFB 1159 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed) // // RAMBo and derivatives diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index c01f983833..a102fe7e57 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/thermistornames.h b/Marlin/src/lcd/thermistornames.h index 37f285d483..f9f91ac49a 100644 --- a/Marlin/src/lcd/thermistornames.h +++ b/Marlin/src/lcd/thermistornames.h @@ -68,6 +68,8 @@ #define THERMISTOR_NAME "Zonestar (Tronxy X3A)" #elif THERMISTOR_ID == 502 #define THERMISTOR_NAME "Zonestar (P802M Hot Bed)" +#elif THERMISTOR_ID == 503 + #define THERMISTOR_NAME "Zonestar (Z8XM2 Bed)" #elif THERMISTOR_ID == 512 #define THERMISTOR_NAME "RPW-Ultra" #elif THERMISTOR_ID == 6 diff --git a/Marlin/src/module/thermistor/thermistor_503.h b/Marlin/src/module/thermistor/thermistor_503.h new file mode 100644 index 0000000000..fc4bffffdb --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_503.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// Zonestar (Z8XM2) Heated Bed thermistor. Added By AvanOsch +// These are taken from the Zonestar settings in original Repetier firmware: Z8XM2_ZRIB_LCD12864_V51.zip +const temp_entry_t temptable_503[] PROGMEM = { + { OV( 12), 300 }, + { OV( 27), 270 }, + { OV( 47), 250 }, + { OV( 68), 230 }, + { OV( 99), 210 }, + { OV( 120), 200 }, + { OV( 141), 190 }, + { OV( 171), 180 }, + { OV( 201), 170 }, + { OV( 261), 160 }, + { OV( 321), 150 }, + { OV( 401), 140 }, + { OV( 451), 130 }, + { OV( 551), 120 }, + { OV( 596), 110 }, + { OV( 626), 105 }, + { OV( 666), 100 }, + { OV( 697), 90 }, + { OV( 717), 85 }, + { OV( 798), 69 }, + { OV( 819), 65 }, + { OV( 870), 55 }, + { OV( 891), 51 }, + { OV( 922), 39 }, + { OV( 968), 28 }, + { OV( 980), 23 }, + { OV( 991), 17 }, + { OV( 1001), 9 }, + { OV(1021), -27 }, + { OV(1023), -200} +}; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index f90361d9a3..ab92102de3 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -75,6 +75,9 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(502) // Unknown thermistor used by the Zonestar Průša P802M hot bed #include "thermistor_502.h" #endif +#if ANY_THERMISTOR_IS(503) // Zonestar (Z8XM2) Heated Bed thermistor + #include "thermistor_503.h" +#endif #if ANY_THERMISTOR_IS(512) // 100k thermistor in RPW-Ultra hotend, Pull-up = 4.7 kOhm, "unknown model" #include "thermistor_512.h" #endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 22b0c6947f..5eb4717e78 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -104,13 +104,13 @@ #elif MB(3DRAG) #include "ramps/pins_3DRAG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(K8200) - #include "ramps/pins_K8200.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) + #include "ramps/pins_K8200.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(K8400) - #include "ramps/pins_K8400.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) + #include "ramps/pins_K8400.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(K8600) #include "ramps/pins_K8600.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(K8800) - #include "ramps/pins_K8800.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) + #include "ramps/pins_K8800.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(BAM_DICE) #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(BAM_DICE_DUE) @@ -132,7 +132,9 @@ #elif MB(KFB_2) #include "ramps/pins_BIQU_KFB_2.h" // ATmega2560 env:mega2560 #elif MB(ZRIB_V20) - #include "ramps/pins_ZRIB_V20.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (MKS_GEN_13) + #include "ramps/pins_ZRIB_V20.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(ZRIB_V52) + #include "ramps/pins_ZRIB_V52.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(FELIX2) #include "ramps/pins_FELIX2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 #elif MB(RIGIDBOARD) diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V52.h b/Marlin/src/pins/ramps/pins_ZRIB_V52.h new file mode 100644 index 0000000000..983c840bbc --- /dev/null +++ b/Marlin/src/pins/ramps/pins_ZRIB_V52.h @@ -0,0 +1,159 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * ZRIB V5.2 Based on MKS BASE v1.4 with A4982 stepper drivers and digital micro-stepping + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "ZRIB V5.2 only supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "ZRIB V5.2" + +#define MKS_BASE_VERSION 14 +#define IS_RAMPS_EFB + +// +// Heaters / Fans +// +#define FAN_PIN 9 // PH6 ** Pin18 ** PWM9 +#define FAN1_PIN 6 + +// +// Extra Extruder / Stepper for V5.2 +// +#define E2_STEP_PIN 4 +#define E2_DIR_PIN 5 +#define E2_ENABLE_PIN 22 + +#include "pins_MKS_BASE_common.h" + +/* + Available connectors on MKS BASE v1.4 (Basically same as ZRIB V5.2) + + ======= + | GND | + |-----| E0 + | 10 | (10) PB4 ** Pin23 ** PWM10 + |-----| + | GND | + |-----| E1 + | 7 | ( 7) PH4 ** Pin16 ** PWM7 + |-----| + | GND | + |-----| FAN + | 9 | ( 9) PH6 ** Pin18 ** PWM9 + ======= + + ======= + | GND | + |-----| Heated Bed + | 8 | ( 8) PH5 ** Pin17 ** PWM8 + ======= + + ========== + | 12-24V | + |--------| Power + | GND | + ========== + + XS3 Connector + ================= + | 65 | GND | 5V | (65) PK3 ** Pin86 ** A11 + |----|-----|----| + | 66 | GND | 5V | (66) PK4 ** Pin85 ** A12 + ================= + + Servos Connector + ================= + | 11 | GND | 5V | (11) PB5 ** Pin24 ** PWM11 + |----|-----|----| + | 12 | GND | 5V | (12) PB6 ** Pin25 ** PWM12 + ================= + + ICSP + ================= + | 5V | 51 | GND | (51) PB2 ** Pin21 ** SPI_MOSI + |----|----|-----| + | 50 | 52 | RST | (50) PB3 ** Pin22 ** SPI_MISO + ================= (52) PB1 ** Pin20 ** SPI_SCK + + XS6/AUX-1 Connector + ====================== + | 5V | GND | NC | 20 | (20) PD1 ** Pin44 ** I2C_SDA + |----|-----|----|----| + | 50 | 51 | 52 | 21 | (50) PB3 ** Pin22 ** SPI_MISO + ====================== (51) PB2 ** Pin21 ** SPI_MOSI + (52) PB1 ** Pin20 ** SPI_SCK + (21) PD0 ** Pin43 ** I2C_SCL + + Temperature + ================================== + | GND | 69 | GND | 68 | GND | 67 | + ================================== + (69) PK7 ** Pin82 ** A15 + (68) PK6 ** Pin83 ** A14 + (67) PK5 ** Pin84 ** A13 + + Limit Switches + ============ + | 2 | GND | X+ ( 2) PE4 ** Pin6 ** PWM2 + |----|-----| + | 3 | GND | X- ( 3) PE5 ** Pin7 ** PWM3 + |----|-----| + | 15 | GND | Y+ (15) PJ0 ** Pin63 ** USART3_RX + |----|-----| + | 14 | GND | Y- (14) PJ1 ** Pin64 ** USART3_TX + |----|-----| + | 19 | GND | Z+ (19) PD2 ** Pin45 ** USART1_RX + |----|-----| + | 18 | GND | Z- (18) PD3 ** Pin46 ** USART1_TX + ============ + + EXP1 + ============ + | 37 | 35 | (37) PC0 ** Pin53 ** D37 + |-----|----| (35) PC2 ** Pin55 ** D35 + | 17 | 16 | (17) PH0 ** Pin12 ** USART2_RX + |-----|----| (16) PH1 ** Pin13 ** USART2_TX + | 23 | 25 | (23) PA1 ** Pin77 ** D23 + |-----|----| (25) PA3 ** Pin75 ** D25 + | 27 | 29 | (27) PA5 ** Pin73 ** D27 + |-----|----| (29) PA7 ** Pin71 ** D29 + | GND | 5V | + ============ + + EXP2 + ============ + | 50 | 52 | (50) PB3 ** Pin22 ** SPI_MISO + |-----|----| (52) PB1 ** Pin20 ** SPI_SCK + | 31 | 53 | (31) PC6 ** Pin59 ** D31 + |-----|----| (53) PB0 ** Pin19 ** SPI_SS + | 33 | 51 | (33) PC4 ** Pin57 ** D33 + |-----|----| (51) PB2 ** Pin21 ** SPI_MOSI + | 49 | 41 | (49) PL0 ** Pin35 ** D49 + |-----|----| (41) PG0 ** Pin51 ** D41 + | GND | NC | + ============ +*/ From 734dd1c293ee78a44c59e582fbd8583335f5bf0c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 7 Nov 2020 17:43:47 -0600 Subject: [PATCH 0534/1370] MSG_AUTOSTART => MSG_RUN_AUTO_FILES --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp | 3 ++- Marlin/src/lcd/language/language_an.h | 2 +- Marlin/src/lcd/language/language_bg.h | 2 +- Marlin/src/lcd/language/language_ca.h | 2 +- Marlin/src/lcd/language/language_cz.h | 2 +- Marlin/src/lcd/language/language_de.h | 2 +- Marlin/src/lcd/language/language_el.h | 2 +- Marlin/src/lcd/language/language_el_gr.h | 2 +- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/language/language_es.h | 2 +- Marlin/src/lcd/language/language_eu.h | 2 +- Marlin/src/lcd/language/language_fi.h | 2 +- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_gl.h | 2 +- Marlin/src/lcd/language/language_hr.h | 2 +- Marlin/src/lcd/language/language_hu.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_jp_kana.h | 2 +- Marlin/src/lcd/language/language_ko_KR.h | 2 +- Marlin/src/lcd/language/language_nl.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_pt_br.h | 2 +- Marlin/src/lcd/language/language_ro.h | 2 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/language/language_uk.h | 2 +- Marlin/src/lcd/language/language_vi.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 2 +- Marlin/src/lcd/language/language_zh_TW.h | 2 +- Marlin/src/lcd/menu/menu_main.cpp | 6 +++--- 32 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 5c6022d09e..fe2397fa6b 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -2144,7 +2144,7 @@ void HMI_Printing() { #endif #endif - strcat_P(cmd, PSTR("M24")); + strcat_P(cmd, M24_STR); queue.inject(cmd); } else { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index edd90848d5..4f700a16dc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -32,6 +32,7 @@ #include "../../../../module/motion.h" #include "../../../../sd/cardreader.h" #include "../../../../inc/MarlinConfig.h" +#include "../../../../MarlinCore.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -95,7 +96,7 @@ void printer_state_polling() { gcode.process_subcommands_now(public_buf_l); gcode.process_subcommands_now_P(PSTR("G90")); } - gcode.process_subcommands_now_P(PSTR("M24")); + gcode.process_subcommands_now_P(M24_STR); uiCfg.print_state = WORKING; start_print_time(); diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index a5030fcd56..13400f8459 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -42,7 +42,7 @@ namespace Language_an { PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tarcheta sacada"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters PROGMEM Language_Str MSG_MAIN = _UxGT("Menu prencipal"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inicio automatico"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Inicio automatico"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Amortar motors"); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Levar a l'orichen"); PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Orichen X"); diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index dcb06e31e7..b774cc29a2 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -40,7 +40,7 @@ namespace Language_bg { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Картата е поÑтавена"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Картата е извадена"); PROGMEM Language_Str MSG_MAIN = _UxGT("Меню"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ÐвтоÑтарт"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("ÐвтоÑтарт"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Изкл. двигатели"); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Паркиране"); PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Задай Ðачало"); diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index 0657c4a759..0ad725262d 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -38,7 +38,7 @@ namespace Language_ca { PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Targeta extreta."); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inici automatic"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Inici automatic"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desactiva motors"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu de depuracio"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progres"); diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 9cbd7042d6..073d46bad2 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -57,7 +57,7 @@ namespace Language_cz { PROGMEM Language_Str MSG_MAIN = _UxGT("Hlavní nabídka"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Další nastavení"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfigurace"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autostart"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Uvolnit motory"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Nabídka ladÄ›ní"); #if LCD_WIDTH >= 20 diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index f8d891576e..1ca23d6044 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -53,7 +53,7 @@ namespace Language_de { PROGMEM Language_Str MSG_MAIN = _UxGT("Hauptmenü"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Erw. Einstellungen"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguration"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autostart"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren deaktivieren"); // M84 :: Max length 19 characters PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug-Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Statusbalken-Test"); diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index 125119d5cc..885f745708 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -40,7 +40,7 @@ namespace Language_el { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Εισαγωγή κάÏτας"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("ΑφαίÏεση κάÏτας"); PROGMEM Language_Str MSG_MAIN = _UxGT("Βασική Οθόνη"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Αυτόματη εκκίνηση"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Αυτόματη εκκίνηση"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("ΑπενεÏγοποίηση ΜοτέÏ"); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Αυτομ. επαναφοÏά στο αÏχικό σημείο"); //SHORTEN PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("ΑÏχικό σημείο X"); diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index 3db6fccdf0..fe36b6d663 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -41,7 +41,7 @@ namespace Language_el_gr { PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("ΑφαίÏεση κάÏτας"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters PROGMEM Language_Str MSG_MAIN = _UxGT("Βασική Οθόνη"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Αυτόματη εκκίνηση"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Αυτόματη εκκίνηση"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("ΑπενεÏγοποίηση βηματιστή"); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Αυτομ. επαναφοÏά στο αÏχικό σημείο"); PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("ΑÏχικό σημείο X"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 2f50902bff..ffaaf2e02a 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -64,7 +64,7 @@ namespace Language_en { PROGMEM Language_Str MSG_MAIN = _UxGT("Main"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Advanced Settings"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuration"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Run Auto Files"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Disable Steppers"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Menu"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Progress Bar Test"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index ca7328c3e6..d4cf5fe54b 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -53,7 +53,7 @@ namespace Language_es { PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Ajustes avanzados"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuración"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inicio automático"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Inicio automático"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Apagar motores"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menú depuración"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Prob. barra progreso"); diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 7e35c6ee41..01ba4b5200 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -42,7 +42,7 @@ namespace Language_eu { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Txartela sartuta"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Txartela kenduta"); PROGMEM Language_Str MSG_MAIN = _UxGT("Menu nagusia"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto hasiera"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Auto hasiera"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Itzali motoreak"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Arazketa Menua"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Prog. Barra Proba"); diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index e8621377d9..c8633ce0aa 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -40,7 +40,7 @@ namespace Language_fi { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kortti asetettu"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kortti poistettu"); PROGMEM Language_Str MSG_MAIN = _UxGT("Palaa"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Automaatti"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Automaatti"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Vapauta moottorit"); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Aja referenssiin"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Aseta origo"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 714feeee99..661d6b5cc3 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -52,7 +52,7 @@ namespace Language_fr { PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Config. avancée"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuration"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Exéc. auto.gcode"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Exéc. auto.gcode"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Arrêter moteurs"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu debug"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barre progress."); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 2fd4bf6975..d1d1704174 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -54,7 +54,7 @@ namespace Language_gl { PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Axustes avanzados"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuración"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoarranque"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autoarranque"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Apagar motores"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menú depuración"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progreso"); diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index 1b2ae41fce..dba0e6df67 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -41,7 +41,7 @@ namespace Language_hr { PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD kartica uklonjena"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters PROGMEM Language_Str MSG_MAIN = _UxGT("Main"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto pokretanje"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Auto pokretanje"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Ugasi steppere"); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Automatski homing"); PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home-aj X"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 6e1b30c180..a5eae451a6 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -56,7 +56,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_MAIN = _UxGT(""); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További Beállítások"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguráció"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoinditás"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autoinditás"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 73639c2790..5a3d8f4c52 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -62,7 +62,7 @@ namespace Language_it { PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principale"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Impostaz. avanzate"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configurazione"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autostart"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Disabilita Motori"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu di debug"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra avanzam."); diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index 32b12f50cb..ef288bd396 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -47,7 +47,7 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("メディアノトリダシ"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("エンドストップ"); // "Endstops" // Max length 8 characters PROGMEM Language_Str MSG_MAIN = _UxGT("メイン"); // "Main" - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ジドウカイシ"); // "Autostart" + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("ジドウカイシ"); // "Autostart" PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("モーターデンゲン オフ"); // "Disable steppers" PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("デãƒãƒƒã‚°ãƒ¡ãƒ‹ãƒ¥ãƒ¼"); // "Debug Menu" PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("プログレスãƒãƒ¼ テスト"); // "Progress Bar Test" diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h index 1ab03dcf57..20700896c1 100644 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ b/Marlin/src/lcd/language/language_ko_KR.h @@ -42,7 +42,7 @@ namespace Language_ko_KR { PROGMEM Language_Str MSG_MAIN = _UxGT("뒤로"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("고급 설정"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("설정"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ìžë™ 시작"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("ìžë™ 시작"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("모터 정지"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("디버깅 메뉴"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("프로그레스바 테스트"); diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index c142c5c9bf..9cbebe1bb3 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -43,7 +43,7 @@ namespace Language_nl { PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kaart verwijderd"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters PROGMEM Language_Str MSG_MAIN = _UxGT("Hoofdmenu"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autostart"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren uit"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Menu"); // accepted English terms PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Vooruitgang Test"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 770c872a40..9b764c86a7 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -52,7 +52,7 @@ namespace Language_pl { PROGMEM Language_Str MSG_MAIN = _UxGT("Menu główne"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Ustawienie zaawansowane"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguracja"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autostart"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("WyÅ‚Ä…cz silniki"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu Debugowania"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Testowy pasek postÄ™pu"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index cf2f7a0cce..b52ae51c1c 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -51,7 +51,7 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Config. Avançada"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuração"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Início automático"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Início automático"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desabilit. motores"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu Debug"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Testar Barra Progres"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 7b54f24abf..c4d2bea073 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -53,7 +53,7 @@ namespace Language_ro { PROGMEM Language_Str MSG_MAIN = _UxGT("Principal"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Setari Avansate"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configurare"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autostart"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Dezactivare Motoare"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Meniu Debug"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test Bara Progres"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 2a2f568573..3734185357 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -56,7 +56,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_MAIN = _UxGT("ОÑновное меню"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Другие наÑтройки"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("КонфигурациÑ"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ÐвтоÑтарт"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("ÐвтоÑтарт"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Выключить двигатели"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню отладки"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("ТеÑÑ‚ индикатора"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index d0fdf5749c..e3de108191 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -57,7 +57,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_MAIN = _UxGT("Hlavná ponuka"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("PokroÄilé nastav."); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfigurácia"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto-Å¡tart"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Auto-Å¡tart"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("UvolniÅ¥ motory"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Ponuka ladenia"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. priebehu"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index f81f153789..cca3a7eda7 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -57,7 +57,7 @@ namespace Language_tr { PROGMEM Language_Str MSG_MAIN = _UxGT("Ana"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("GeliÅŸmiÅŸ Ayarlar"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Yapılandırma"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Oto. BaÅŸlat"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Oto. BaÅŸlat"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorları Durdur"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hata Ayıklama"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Durum ÇubuÄŸu Testi"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 9cc1002964..ac79b0b820 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -58,7 +58,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_MAIN = _UxGT("ОÑновне меню"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Інші налаштуваннÑ"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("КонфігураціÑ"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ÐвтоÑтарт"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("ÐвтоÑтарт"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Вимкнути двигуни"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню Debug"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("ТеÑÑ‚ Progress Bar"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index f7cf606575..8a1cfad92a 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -47,7 +47,7 @@ namespace Language_vi { PROGMEM Language_Str MSG_MAIN = _UxGT("Chính"); // Main PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Thiết lập cấp cao"); // Advanced Settings PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Cấu hình"); // Configuration - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Khởi chạy tá»± Ä‘á»™ng"); // Autostart + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Khởi chạy tá»± Ä‘á»™ng"); // Autostart PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Tắt Ä‘á»™ng cÆ¡ bÆ°á»›c"); // Disable steppers PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu gỡ lá»—i"); // Debug Menu PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Kiểm tra tiến Ä‘á»™"); // Progress bar test diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 3bebe12fda..56fd8a22f6 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -51,7 +51,7 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_MAIN = _UxGT("主èœå•"); //"Main" PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("高级设置"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("é…ç½®"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("自动开始"); //"Autostart" + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("自动开始"); //"Autostart" PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("关闭步进电机"); //"Disable steppers" PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("调试èœå•"); // "Debug Menu" PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("进度æ¡æµ‹è¯•"); // "Progress Bar Test" diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 7abf895d54..ac061e9b81 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -50,7 +50,7 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_MAIN = _UxGT("主é¸å–®"); //"Main" PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("進階設置"); //"Advanced Settings" PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("設置"); //Configuration - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("自動開始"); //"Autostart" + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("自動開始"); //"Autostart" PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("關閉步進馬é”"); //"Disable steppers" PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("除錯é¸å–®"); // "Debug Menu" PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("進度æ¢æ¸¬è©¦"); // "Progress Bar Test" diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 5b98382559..992303b791 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -133,10 +133,10 @@ void menu_main() { // *** IF THIS SECTION IS CHANGED, REPRODUCE BELOW *** // - // Autostart + // Run Auto Files // #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_AUTOSTART, card.beginautostart); + ACTION_ITEM(MSG_RUN_AUTO_FILES, card.beginautostart); #endif if (card_detected) { @@ -238,7 +238,7 @@ void menu_main() { // Autostart // #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_AUTOSTART, card.beginautostart); + ACTION_ITEM(MSG_RUN_AUTO_FILES, card.beginautostart); #endif if (card_detected) { From 5bf82b34c6b3b22ca8530115f48db4c91518eb71 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 7 Nov 2020 17:55:31 -0600 Subject: [PATCH 0535/1370] Temperature 'autostart' => 'auto_job' --- Marlin/src/gcode/temp/M104_M109.cpp | 4 ++-- Marlin/src/gcode/temp/M140_M190.cpp | 4 ++-- Marlin/src/gcode/temp/M141_M191.cpp | 4 ++-- Marlin/src/module/temperature.cpp | 6 +++--- Marlin/src/module/temperature.h | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index d2b466e2fb..90e1b601e4 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -105,7 +105,7 @@ void GcodeSuite::M104() { * mode, for instance in a dual extruder setup, without affecting the running * print timer. */ - thermalManager.check_timer_autostart(false, true); + thermalManager.auto_job_check_timer(false, true); #endif } @@ -182,7 +182,7 @@ void GcodeSuite::M109() { * standby mode, (e.g., in a dual extruder setup) without affecting * the running print timer. */ - thermalManager.check_timer_autostart(true, true); + thermalManager.auto_job_check_timer(true, true); #endif #if HAS_DISPLAY diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index ac8228085e..d684127fe1 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -81,7 +81,7 @@ void GcodeSuite::M140() { * temperatures need to be set below mintemp. Order of M140, M104, and M141 * at the end of the print does not matter. */ - thermalManager.check_timer_autostart(false, true); + thermalManager.auto_job_check_timer(false, true); #endif } } @@ -128,7 +128,7 @@ void GcodeSuite::M190() { thermalManager.setTargetBed(temp); - TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.check_timer_autostart(true, false)); + TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.auto_job_check_timer(true, false)); ui.set_status_P(thermalManager.isHeatingBed() ? GET_TEXT(MSG_BED_HEATING) : GET_TEXT(MSG_BED_COOLING)); diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp index fc80c5f4cb..17eb71eada 100644 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ b/Marlin/src/gcode/temp/M141_M191.cpp @@ -60,7 +60,7 @@ void GcodeSuite::M141() { * temperatures need to be set below mintemp. Order of M140, M104, and M141 * at the end of the print does not matter. */ - thermalManager.check_timer_autostart(false, true); + thermalManager.auto_job_check_timer(false, true); #endif } } @@ -75,7 +75,7 @@ void GcodeSuite::M191() { const bool no_wait_for_cooling = parser.seenval('S'); if (no_wait_for_cooling || parser.seenval('R')) { thermalManager.setTargetChamber(parser.value_celsius()); - TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.check_timer_autostart(true, false)); + TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.auto_job_check_timer(true, false)); } else return; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index d119a72a64..40f8624efb 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2154,7 +2154,7 @@ void Temperature::disable_all_heaters() { #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - bool Temperature::over_autostart_threshold() { + bool Temperature::auto_job_over_threshold() { #if HAS_HOTEND HOTEND_LOOP() if (degTargetHotend(e) > (EXTRUDE_MINTEMP) / 2) return true; #endif @@ -2162,8 +2162,8 @@ void Temperature::disable_all_heaters() { || TERN0(HAS_HEATED_CHAMBER, degTargetChamber() > CHAMBER_MINTEMP); } - void Temperature::check_timer_autostart(const bool can_start, const bool can_stop) { - if (over_autostart_threshold()) { + void Temperature::auto_job_check_timer(const bool can_start, const bool can_stop) { + if (auto_job_over_threshold()) { if (can_start) startOrResumeJob(); } else if (can_stop) { diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 57b0fecbcc..4b27fff19d 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -731,8 +731,8 @@ class Temperature { /** * Methods to check if heaters are enabled, indicating an active job */ - static bool over_autostart_threshold(); - static void check_timer_autostart(const bool can_start, const bool can_stop); + static bool auto_job_over_threshold(); + static void auto_job_check_timer(const bool can_start, const bool can_stop); #endif /** From 367e717aebd68d55b528bd1927b73017ed20f6a9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 7 Nov 2020 18:28:29 -0600 Subject: [PATCH 0536/1370] Add alternative TERN macros --- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/core/macros.h | 3 +++ Marlin/src/feature/backlash.h | 4 ++-- Marlin/src/feature/leds/neopixel.h | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h | 3 +++ Marlin/src/lcd/menu/menu.cpp | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 4 ++-- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/module/settings.cpp | 6 +++--- Marlin/src/module/stepper.cpp | 2 +- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/module/temperature.h | 2 +- Marlin/src/module/tool_change.cpp | 8 ++++---- 15 files changed, 26 insertions(+), 20 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e395bdccb8..be3dcdd109 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -248,7 +248,7 @@ bool wait_for_heatup = true; bool wait_for_user; // = false; void wait_for_user_response(millis_t ms/*=0*/, const bool no_sleep/*=false*/) { - TERN(ADVANCED_PAUSE_FEATURE,,UNUSED(no_sleep)); + UNUSED(no_sleep); KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = true; if (ms) ms += millis(); // expire time diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 7948e8ce87..7985706173 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -196,6 +196,9 @@ #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. +#define IF_ENABLED TERN_ +#define IF_DISABLED(O,A) TERN(O,,A) + #define ANY(V...) !DISABLED(V) #define NONE(V...) DISABLED(V) #define ALL(V...) ENABLED(V) diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h index 8d00570f99..49857f1f99 100644 --- a/Marlin/src/feature/backlash.h +++ b/Marlin/src/feature/backlash.h @@ -54,17 +54,17 @@ public: #endif static inline float get_measurement(const AxisEnum a) { + UNUSED(a); // Return the measurement averaged over all readings return TERN(MEASURE_BACKLASH_WHEN_PROBING , measured_count[a] > 0 ? measured_mm[a] / measured_count[a] : 0 , 0 ); - TERN(MEASURE_BACKLASH_WHEN_PROBING,,UNUSED(a)); } static inline bool has_measurement(const AxisEnum a) { + UNUSED(a); return TERN0(MEASURE_BACKLASH_WHEN_PROBING, measured_count[a] > 0); - TERN(MEASURE_BACKLASH_WHEN_PROBING,,UNUSED(a)); } static inline bool has_any_measurement() { diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 42046fa563..d7354207fc 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -110,7 +110,7 @@ public: #if CONJOINED_NEOPIXEL adaneo2.show(); #else - TERN(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); + IF_DISABLED(NEOPIXEL2_SEPARATE, adaneo1.setPin(NEOPIXEL2_PIN)); adaneo1.show(); adaneo1.setPin(NEOPIXEL_PIN); #endif diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 0aba49d564..480721e56a 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -123,7 +123,7 @@ bool MarlinUI::detected() { return true; } custom_start_bmp #endif ; - TERN(CUSTOM_BOOTSCREEN_ANIMATED,,UNUSED(frame)); + UNUSED(frame); u8g.drawBitmapP(left, top, CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH, CUSTOM_BOOTSCREEN_BMPHEIGHT, bmp); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h index cd41a5fe06..0f4bbbdb9a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h @@ -253,6 +253,9 @@ #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. + #define IF_ENABLED TERN_ + #define IF_DISABLED(O,A) _TERN(_ENA_1(O),,A) + #define ANY(V...) !DISABLED(V) #define NONE(V...) DISABLED(V) #define ALL(V...) ENABLED(V) diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index cd94927049..35c736c560 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -81,7 +81,7 @@ void MarlinUI::save_previous_screen() { } void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back/*=false*/)) { - TERN(TURBO_BACK_MENU_ITEM,,constexpr bool is_back = false); + IF_DISABLED(TURBO_BACK_MENU_ITEM, constexpr bool is_back = false); TERN_(HAS_TOUCH_XPT2046, on_edit_screen = false); if (screen_history_depth > 0) { menuPosition &sh = screen_history[--screen_history_depth]; diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 0e207ffc55..fdddf1781a 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -202,12 +202,12 @@ void menu_backlash(); // Helpers for editing PID Ki & Kd values // grab the PID value out of the temp variable; scale it; then update the PID driver void copy_and_scalePID_i(int16_t e) { - TERN(PID_PARAMS_PER_HOTEND,,UNUSED(e)); + UNUSED(e); PID_PARAM(Ki, e) = scalePID_i(raw_Ki); thermalManager.updatePID(); } void copy_and_scalePID_d(int16_t e) { - TERN(PID_PARAMS_PER_HOTEND,,UNUSED(e)); + UNUSED(e); PID_PARAM(Kd, e) = scalePID_d(raw_Kd); thermalManager.updatePID(); } diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index d116a6a398..5f0afa4768 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -219,7 +219,7 @@ static PGM_P pause_header() { #define HOTEND_STATUS_ITEM() do { \ if (_menuLineNr == _thisItemNr) { \ if (ui.should_draw()) { \ - TERN(HAS_GRAPHICAL_TFT,, MenuItem_static::draw(_lcdLineNr, GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT)); \ + IF_DISABLED(HAS_GRAPHICAL_TFT, MenuItem_static::draw(_lcdLineNr, GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT)); \ ui.draw_hotend_status(_lcdLineNr, hotend_status_extruder); \ } \ if (_skipStatic && encoderLine <= _thisItemNr) { \ diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index f0f5c21bec..5dce47eec2 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -64,7 +64,7 @@ static void _lcd_mesh_fine_tune(PGM_P const msg) { ubl.encoder_diff > 0 ? 0.005f : -0.005f ); ubl.encoder_diff = 0; - TERN(IS_TFTGLCD_PANEL,,ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); + IF_DISABLED(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); } TERN_(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index fc432b7e9b..b1b9bb6e0a 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1497,7 +1497,7 @@ void MarlinSettings::postprocess() { } DEBUG_ECHO_START(); DEBUG_ECHOLNPAIR("EEPROM version mismatch (EEPROM=", stored_ver, " Marlin=" EEPROM_VERSION ")"); - TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_version()); + IF_DISABLED(EEPROM_AUTO_INIT, ui.eeprom_alert_version()); eeprom_error = true; } else { @@ -2325,13 +2325,13 @@ void MarlinSettings::postprocess() { if (eeprom_error) { DEBUG_ECHO_START(); DEBUG_ECHOLNPAIR("Index: ", int(eeprom_index - (EEPROM_OFFSET)), " Size: ", datasize()); - TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_index()); + IF_DISABLED(EEPROM_AUTO_INIT, ui.eeprom_alert_index()); } else if (working_crc != stored_crc) { eeprom_error = true; DEBUG_ERROR_START(); DEBUG_ECHOLNPAIR("EEPROM CRC mismatch - (stored) ", stored_crc, " != ", working_crc, " (calculated)!"); - TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_crc()); + IF_DISABLED(EEPROM_AUTO_INIT, ui.eeprom_alert_crc()); } else if (!validating) { DEBUG_ECHO_START(); diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 0a83a90ba2..627ecf9ebb 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -180,7 +180,7 @@ bool Stepper::abort_current_block; uint32_t Stepper::acceleration_time, Stepper::deceleration_time; uint8_t Stepper::steps_per_isr; -TERN(ADAPTIVE_STEP_SMOOTHING,,constexpr) uint8_t Stepper::oversampling_factor; +IF_DISABLED(ADAPTIVE_STEP_SMOOTHING, constexpr) uint8_t Stepper::oversampling_factor; xyze_long_t Stepper::delta_error{0}; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 40f8624efb..4eb7216511 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -268,7 +268,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, int16_t Temperature::maxtemp_raw_BED = HEATER_BED_RAW_HI_TEMP; #endif TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } - TERN(PIDTEMPBED,, millis_t Temperature::next_bed_check_ms); + IF_DISABLED(PIDTEMPBED, millis_t Temperature::next_bed_check_ms); #endif // HAS_HEATED_BED #if HAS_TEMP_CHAMBER diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 4b27fff19d..c3c3ce2d8b 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -392,7 +392,7 @@ class Temperature { #if HAS_HEATED_BED TERN_(WATCH_BED, static bed_watch_t watch_bed); - TERN(PIDTEMPBED,,static millis_t next_bed_check_ms); + IF_DISABLED(PIDTEMPBED, static millis_t next_bed_check_ms); #ifdef BED_MINTEMP static int16_t mintemp_raw_BED; #endif diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 1cdafe019d..0d0ef46059 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -799,8 +799,8 @@ void tool_change_prime() { // Park #if ENABLED(TOOLCHANGE_PARK) if (ok) { - TERN(TOOLCHANGE_PARK_Y_ONLY,,current_position.x = toolchange_settings.change_point.x); - TERN(TOOLCHANGE_PARK_X_ONLY,,current_position.y = toolchange_settings.change_point.y); + IF_DISABLED(TOOLCHANGE_PARK_Y_ONLY, current_position.x = toolchange_settings.change_point.x); + IF_DISABLED(TOOLCHANGE_PARK_X_ONLY, current_position.y = toolchange_settings.change_point.y); planner.buffer_line(current_position, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE), active_extruder); planner.synchronize(); } @@ -998,8 +998,8 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { // Toolchange park #if ENABLED(TOOLCHANGE_PARK) && DISABLED(SWITCHING_NOZZLE) if (can_move_away && toolchange_settings.enable_park) { - TERN(TOOLCHANGE_PARK_Y_ONLY,,current_position.x = toolchange_settings.change_point.x); - TERN(TOOLCHANGE_PARK_X_ONLY,,current_position.y = toolchange_settings.change_point.y); + IF_DISABLED(TOOLCHANGE_PARK_Y_ONLY, current_position.x = toolchange_settings.change_point.x); + IF_DISABLED(TOOLCHANGE_PARK_X_ONLY, current_position.y = toolchange_settings.change_point.y); planner.buffer_line(current_position, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE), old_tool); planner.synchronize(); } From 841f0d57781388b189de1018d8d78b79dc32b6cb Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 8 Nov 2020 00:15:30 -0800 Subject: [PATCH 0537/1370] Fix tool-change servo index for E2 and up (#20060) --- Marlin/src/module/tool_change.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 0d0ef46059..d77901f029 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -123,7 +123,7 @@ if (e < EXTRUDERS - 1) #endif { - MOVE_SERVO(_SERVO_NR(e), servo_angles[_SERVO_NR(e)][e]); + MOVE_SERVO(_SERVO_NR(e), servo_angles[_SERVO_NR(e)][e & 1]); safe_delay(500); } } From 7da62cc9f7a37641d163edc9d6c21ed1a4780786 Mon Sep 17 00:00:00 2001 From: "Alexander D. Kanevskiy" Date: Sun, 8 Nov 2020 10:20:07 +0200 Subject: [PATCH 0538/1370] POWER_LOSS_PIN for BTT SKR mini MZ / E3 2.0 (#20069) --- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 50257f4f46..b65411be8a 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -62,6 +62,13 @@ #define FIL_RUNOUT_PIN PC15 // "E0-STOP" #endif +// +// Power-loss Detection +// +#ifndef POWER_LOSS_PIN + #define POWER_LOSS_PIN PC12 // Power Loss Detection: PWR-DET +#endif + // // Steppers // From 44f689320bf98c3a134ca49a640a99c75fe43674 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Mon, 9 Nov 2020 01:31:14 +0100 Subject: [PATCH 0539/1370] Use extra G35 BLTouch HS Mode clearance in Tramming Wizard (#20057) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/bedlevel/G35.cpp | 3 +-- Marlin/src/lcd/menu/menu_tramming.cpp | 4 ++++ Marlin/src/module/probe.cpp | 13 ++----------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index f0abc543cb..789d8bcf19 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -120,8 +120,7 @@ void GcodeSuite::G35() { // In BLTOUCH HS mode, the probe travels in a deployed state. // Users of G35 might have a badly misaligned bed, so raise Z by the // length of the deployed pin (BLTOUCH stroke < 7mm) - current_position.z = (Z_CLEARANCE_BETWEEN_PROBES) + (7 * ENABLED(BLTOUCH_HS_MODE)); - + do_blocking_move_to_z((Z_CLEARANCE_BETWEEN_PROBES) + TERN0(BLTOUCH_HS_MODE, 7)); const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true); if (isnan(z_probed_height)) { diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index a102fe7e57..317335d51b 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -43,6 +43,10 @@ float z_measured[G35_PROBE_COUNT] = { 0 }; static uint8_t tram_index = 0; bool probe_single_point() { + // In BLTOUCH HS mode, the probe travels in a deployed state. + // Users of Tramming Wizard might have a badly misaligned bed, so raise Z by the + // length of the deployed pin (BLTOUCH stroke < 7mm) + do_blocking_move_to_z((Z_CLEARANCE_BETWEEN_PROBES) + TERN0(BLTOUCH_HS_MODE, 7)); const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[tram_index], PROBE_PT_RAISE, 0, true); DEBUG_ECHOLNPAIR("probe_single_point: ", z_probed_height, "mm"); z_measured[tram_index] = z_probed_height; diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d008720389..ff80063d65 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -667,8 +667,8 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise if (bltouch.triggered()) bltouch._reset(); #endif - // TODO: Adapt for SCARA, where the offset rotates - xyz_pos_t npos = { rx, ry }; + // On delta keep Z below clip height or do_blocking_move_to will abort + xyz_pos_t npos = { rx, ry, _MIN(TERN(DELTA, delta_clip_start_height, current_position.z), current_position.z) }; if (probe_relative) { // The given position is in terms of the probe if (!can_reach(npos)) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Position Not Reachable"); @@ -678,15 +678,6 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise } else if (!position_is_reachable(npos)) return NAN; // The given position is in terms of the nozzle - npos.z = - #if ENABLED(DELTA) - // Move below clip height or xy move will be aborted by do_blocking_move_to - _MIN(current_position.z, delta_clip_start_height) - #else - current_position.z - #endif - ; - const float old_feedrate_mm_s = feedrate_mm_s; feedrate_mm_s = XY_PROBE_FEEDRATE_MM_S; From 170ba87648f3c81fc9828a497b39db26f04f6d56 Mon Sep 17 00:00:00 2001 From: Hebezo Date: Mon, 9 Nov 2020 01:37:41 +0100 Subject: [PATCH 0540/1370] Add POWER_OFF_DELAY option (#19987) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 7 ++++--- Marlin/src/MarlinCore.h | 10 ++++++---- Marlin/src/feature/power.cpp | 8 ++++++++ Marlin/src/feature/power.h | 1 + Marlin/src/gcode/control/M80_M81.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 9 +++++++-- Marlin/src/inc/SanityCheck.h | 4 ++-- 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 719e11b899..ea77b4e429 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -344,9 +344,10 @@ #define AUTO_POWER_E_FANS #define AUTO_POWER_CONTROLLERFAN #define AUTO_POWER_CHAMBER_FAN - //#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU over this temperature - //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU over this temperature - #define POWER_TIMEOUT 30 + //#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU if any extruder is over this temperature + //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU if the chamber is over this temperature + #define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration + //#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time. #endif #endif diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index 69afc7f30e..908636e967 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -92,11 +92,13 @@ extern bool wait_for_heatup; #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_STATE); powersupply_on = true; }while(0) #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE); powersupply_on = false; }while(0) #if ENABLED(AUTO_POWER_CONTROL) - #define PSU_ON() powerManager.power_on() - #define PSU_OFF() powerManager.power_off() + #define PSU_ON() powerManager.power_on() + #define PSU_OFF() powerManager.power_off() + #define PSU_OFF_SOON() powerManager.power_off_soon() #else - #define PSU_ON() PSU_PIN_ON() - #define PSU_OFF() PSU_PIN_OFF() + #define PSU_ON() PSU_PIN_ON() + #define PSU_OFF() PSU_PIN_OFF() + #define PSU_OFF_SOON PSU_OFF #endif #endif diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 9427f684e7..8d05d14698 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -126,4 +126,12 @@ void Power::power_off() { } } +void Power::power_off_soon() { + #if POWER_OFF_DELAY + lastPowerOn = millis() - SEC_TO_MS(POWER_TIMEOUT) + SEC_TO_MS(POWER_OFF_DELAY); + #else + power_off(); + #endif +} + #endif // AUTO_POWER_CONTROL diff --git a/Marlin/src/feature/power.h b/Marlin/src/feature/power.h index 8b988907e6..2462b9231b 100644 --- a/Marlin/src/feature/power.h +++ b/Marlin/src/feature/power.h @@ -32,6 +32,7 @@ class Power { static void check(); static void power_on(); static void power_off(); + static void power_off_soon(); private: static millis_t lastPowerOn; static bool is_power_needed(); diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index a8f7f7c10b..ea0f9c2b13 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -105,7 +105,7 @@ void GcodeSuite::M81() { #if HAS_SUICIDE suicide(); #elif ENABLED(PSU_CONTROL) - PSU_OFF(); + PSU_OFF_SOON(); #endif LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF ".")); diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index bbbcf6fb2f..a8e619fb3b 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -416,8 +416,13 @@ #endif #endif -#if !defined(PSU_POWERUP_DELAY) && ENABLED(PSU_CONTROL) - #define PSU_POWERUP_DELAY 250 +#if ENABLED(PSU_CONTROL) + #ifndef PSU_POWERUP_DELAY + #define PSU_POWERUP_DELAY 250 + #endif + #ifndef POWER_OFF_DELAY + #define POWER_OFF_DELAY 0 + #endif #endif /** diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b6ff725470..1082947191 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3016,9 +3016,9 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "PSU_CONTROL requires PSU_ACTIVE_STATE to be defined as 'HIGH' or 'LOW'." #elif !PIN_EXISTS(PS_ON) #error "PSU_CONTROL requires PS_ON_PIN." + #elif POWER_OFF_DELAY < 0 + #error "POWER_OFF_DELAY must be a positive value." #endif -#elif ENABLED(AUTO_POWER_CONTROL) - #error "AUTO_POWER_CONTROL requires PSU_CONTROL." #endif #if HAS_CUTTER From b2d6b8c5671ec55fff7aa12da71b23fda772b8b7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 9 Nov 2020 01:17:37 -0600 Subject: [PATCH 0541/1370] Simplified temp sensor conditionals --- Marlin/src/inc/Conditionals_post.h | 100 ++++++++------- Marlin/src/inc/SanityCheck.h | 42 +++---- Marlin/src/module/temperature.cpp | 137 +++++++++++---------- Marlin/src/module/temperature.h | 25 ++-- Marlin/src/module/thermistor/thermistors.h | 44 +++---- 5 files changed, 170 insertions(+), 178 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index a8e619fb3b..9eeb39f9a8 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -436,7 +436,7 @@ #endif #if TEMP_SENSOR_0 == -5 || TEMP_SENSOR_0 == -3 || TEMP_SENSOR_0 == -2 - #define HEATER_0_USES_MAX6675 + #define HEATER_0_USES_MAX6675 1 #if TEMP_SENSOR_0 == -3 #define HEATER_0_MAX6675_TMIN -270 #define HEATER_0_MAX6675_TMAX 1800 @@ -445,19 +445,19 @@ #define HEATER_0_MAX6675_TMAX 1024 #endif #if TEMP_SENSOR_0 == -5 - #define MAX6675_IS_MAX31865 + #define MAX6675_IS_MAX31865 1 #elif TEMP_SENSOR_0 == -3 - #define MAX6675_IS_MAX31855 + #define MAX6675_IS_MAX31855 1 #endif #elif TEMP_SENSOR_0 == -4 - #define HEATER_0_USES_AD8495 + #define HEATER_0_USES_AD8495 1 #elif TEMP_SENSOR_0 == -1 - #define HEATER_0_USES_AD595 + #define HEATER_0_USES_AD595 1 #elif TEMP_SENSOR_0 > 0 #define THERMISTOR_HEATER_0 TEMP_SENSOR_0 - #define HEATER_0_USES_THERMISTOR + #define HEATER_0_USES_THERMISTOR 1 #if TEMP_SENSOR_0 == 1000 - #define HEATER_0_USER_THERMISTOR + #define HEATER_0_USER_THERMISTOR 1 #endif #else #undef HEATER_0_MINTEMP @@ -465,7 +465,7 @@ #endif #if TEMP_SENSOR_1 == -5 || TEMP_SENSOR_1 == -3 || TEMP_SENSOR_1 == -2 - #define HEATER_1_USES_MAX6675 + #define HEATER_1_USES_MAX6675 1 #if TEMP_SENSOR_1 == -3 #define HEATER_1_MAX6675_TMIN -270 #define HEATER_1_MAX6675_TMAX 1800 @@ -483,14 +483,14 @@ #endif #endif #elif TEMP_SENSOR_1 == -4 - #define HEATER_1_USES_AD8495 + #define HEATER_1_USES_AD8495 1 #elif TEMP_SENSOR_1 == -1 - #define HEATER_1_USES_AD595 + #define HEATER_1_USES_AD595 1 #elif TEMP_SENSOR_1 > 0 #define THERMISTOR_HEATER_1 TEMP_SENSOR_1 - #define HEATER_1_USES_THERMISTOR + #define HEATER_1_USES_THERMISTOR 1 #if TEMP_SENSOR_1 == 1000 - #define HEATER_1_USER_THERMISTOR + #define HEATER_1_USER_THERMISTOR 1 #endif #else #undef HEATER_1_MINTEMP @@ -498,18 +498,18 @@ #endif #if TEMP_SENSOR_2 == -4 - #define HEATER_2_USES_AD8495 + #define HEATER_2_USES_AD8495 1 #elif TEMP_SENSOR_2 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_2." #elif TEMP_SENSOR_2 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_2." #elif TEMP_SENSOR_2 == -1 - #define HEATER_2_USES_AD595 + #define HEATER_2_USES_AD595 1 #elif TEMP_SENSOR_2 > 0 #define THERMISTOR_HEATER_2 TEMP_SENSOR_2 - #define HEATER_2_USES_THERMISTOR + #define HEATER_2_USES_THERMISTOR 1 #if TEMP_SENSOR_2 == 1000 - #define HEATER_2_USER_THERMISTOR + #define HEATER_2_USER_THERMISTOR 1 #endif #else #undef HEATER_2_MINTEMP @@ -517,18 +517,18 @@ #endif #if TEMP_SENSOR_3 == -4 - #define HEATER_3_USES_AD8495 + #define HEATER_3_USES_AD8495 1 #elif TEMP_SENSOR_3 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_3." #elif TEMP_SENSOR_3 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_3." #elif TEMP_SENSOR_3 == -1 - #define HEATER_3_USES_AD595 + #define HEATER_3_USES_AD595 1 #elif TEMP_SENSOR_3 > 0 #define THERMISTOR_HEATER_3 TEMP_SENSOR_3 - #define HEATER_3_USES_THERMISTOR + #define HEATER_3_USES_THERMISTOR 1 #if TEMP_SENSOR_3 == 1000 - #define HEATER_3_USER_THERMISTOR + #define HEATER_3_USER_THERMISTOR 1 #endif #else #undef HEATER_3_MINTEMP @@ -536,18 +536,18 @@ #endif #if TEMP_SENSOR_4 == -4 - #define HEATER_4_USES_AD8495 + #define HEATER_4_USES_AD8495 1 #elif TEMP_SENSOR_4 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_4." #elif TEMP_SENSOR_4 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_4." #elif TEMP_SENSOR_4 == -1 - #define HEATER_4_USES_AD595 + #define HEATER_4_USES_AD595 1 #elif TEMP_SENSOR_4 > 0 #define THERMISTOR_HEATER_4 TEMP_SENSOR_4 - #define HEATER_4_USES_THERMISTOR + #define HEATER_4_USES_THERMISTOR 1 #if TEMP_SENSOR_4 == 1000 - #define HEATER_4_USER_THERMISTOR + #define HEATER_4_USER_THERMISTOR 1 #endif #else #undef HEATER_4_MINTEMP @@ -555,18 +555,18 @@ #endif #if TEMP_SENSOR_5 == -4 - #define HEATER_5_USES_AD8495 + #define HEATER_5_USES_AD8495 1 #elif TEMP_SENSOR_5 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_5." #elif TEMP_SENSOR_5 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_5." #elif TEMP_SENSOR_5 == -1 - #define HEATER_5_USES_AD595 + #define HEATER_5_USES_AD595 1 #elif TEMP_SENSOR_5 > 0 #define THERMISTOR_HEATER_5 TEMP_SENSOR_5 - #define HEATER_5_USES_THERMISTOR + #define HEATER_5_USES_THERMISTOR 1 #if TEMP_SENSOR_5 == 1000 - #define HEATER_5_USER_THERMISTOR + #define HEATER_5_USER_THERMISTOR 1 #endif #else #undef HEATER_5_MINTEMP @@ -574,18 +574,18 @@ #endif #if TEMP_SENSOR_6 == -4 - #define HEATER_6_USES_AD8495 + #define HEATER_6_USES_AD8495 1 #elif TEMP_SENSOR_6 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_6." #elif TEMP_SENSOR_6 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_6." #elif TEMP_SENSOR_6 == -1 - #define HEATER_6_USES_AD595 + #define HEATER_6_USES_AD595 1 #elif TEMP_SENSOR_6 > 0 #define THERMISTOR_HEATER_6 TEMP_SENSOR_6 - #define HEATER_6_USES_THERMISTOR + #define HEATER_6_USES_THERMISTOR 1 #if TEMP_SENSOR_6 == 1000 - #define HEATER_6_USER_THERMISTOR + #define HEATER_6_USER_THERMISTOR 1 #endif #else #undef HEATER_6_MINTEMP @@ -593,18 +593,18 @@ #endif #if TEMP_SENSOR_7 == -4 - #define HEATER_7_USES_AD8495 + #define HEATER_7_USES_AD8495 1 #elif TEMP_SENSOR_7 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_7." #elif TEMP_SENSOR_7 == -2 #error "MAX7775 Thermocouples (-2) not supported for TEMP_SENSOR_7." #elif TEMP_SENSOR_7 == -1 - #define HEATER_7_USES_AD595 + #define HEATER_7_USES_AD595 1 #elif TEMP_SENSOR_7 > 0 #define THERMISTOR_HEATER_7 TEMP_SENSOR_7 - #define HEATER_7_USES_THERMISTOR + #define HEATER_7_USES_THERMISTOR 1 #if TEMP_SENSOR_7 == 1000 - #define HEATER_7_USER_THERMISTOR + #define HEATER_7_USER_THERMISTOR 1 #endif #else #undef HEATER_7_MINTEMP @@ -612,18 +612,18 @@ #endif #if TEMP_SENSOR_BED == -4 - #define HEATER_BED_USES_AD8495 + #define HEATER_BED_USES_AD8495 1 #elif TEMP_SENSOR_BED == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_BED." #elif TEMP_SENSOR_BED == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_BED." #elif TEMP_SENSOR_BED == -1 - #define HEATER_BED_USES_AD595 + #define HEATER_BED_USES_AD595 1 #elif TEMP_SENSOR_BED > 0 #define THERMISTORBED TEMP_SENSOR_BED - #define HEATER_BED_USES_THERMISTOR + #define HEATER_BED_USES_THERMISTOR 1 #if TEMP_SENSOR_BED == 1000 - #define HEATER_BED_USER_THERMISTOR + #define HEATER_BED_USER_THERMISTOR 1 #endif #else #undef BED_MINTEMP @@ -631,18 +631,18 @@ #endif #if TEMP_SENSOR_CHAMBER == -4 - #define HEATER_CHAMBER_USES_AD8495 + #define HEATER_CHAMBER_USES_AD8495 1 #elif TEMP_SENSOR_CHAMBER == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_CHAMBER." #elif TEMP_SENSOR_CHAMBER == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_CHAMBER." #elif TEMP_SENSOR_CHAMBER == -1 - #define HEATER_CHAMBER_USES_AD595 + #define HEATER_CHAMBER_USES_AD595 1 #elif TEMP_SENSOR_CHAMBER > 0 #define THERMISTORCHAMBER TEMP_SENSOR_CHAMBER - #define HEATER_CHAMBER_USES_THERMISTOR + #define HEATER_CHAMBER_USES_THERMISTOR 1 #if TEMP_SENSOR_CHAMBER == 1000 - #define HEATER_CHAMBER_USER_THERMISTOR + #define HEATER_CHAMBER_USER_THERMISTOR 1 #endif #else #undef CHAMBER_MINTEMP @@ -650,25 +650,21 @@ #endif #if TEMP_SENSOR_PROBE == -4 - #define HEATER_PROBE_USES_AD8495 + #define HEATER_PROBE_USES_AD8495 1 #elif TEMP_SENSOR_PROBE == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_PROBE." #elif TEMP_SENSOR_PROBE == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_PROBE." #elif TEMP_SENSOR_PROBE == -1 - #define HEATER_PROBE_USES_AD595 + #define HEATER_PROBE_USES_AD595 1 #elif TEMP_SENSOR_PROBE > 0 #define THERMISTORPROBE TEMP_SENSOR_PROBE - #define PROBE_USES_THERMISTOR + #define HEATER_PROBE_USES_THERMISTOR 1 #if TEMP_SENSOR_PROBE == 1000 - #define PROBE_USER_THERMISTOR + #define HEATER_PROBE_USER_THERMISTOR 1 #endif #endif -#define HOTEND_USES_THERMISTOR ANY( \ - HEATER_0_USES_THERMISTOR, HEATER_1_USES_THERMISTOR, HEATER_2_USES_THERMISTOR, HEATER_3_USES_THERMISTOR, \ - HEATER_4_USES_THERMISTOR, HEATER_5_USES_THERMISTOR, HEATER_6_USES_THERMISTOR, HEATER_7_USES_THERMISTOR ) - /** * X_DUAL_ENDSTOPS endstop reassignment */ diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1082947191..3762d40c53 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1618,34 +1618,41 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Required custom thermistor settings */ -#if ENABLED(HEATER_0_USER_THERMISTOR) && !(defined(HOTEND0_PULLUP_RESISTOR_OHMS) && defined(HOTEND0_RESISTANCE_25C_OHMS) && defined(HOTEND0_BETA)) +#if HEATER_0_USER_THERMISTOR && !(defined(HOTEND0_PULLUP_RESISTOR_OHMS) && defined(HOTEND0_RESISTANCE_25C_OHMS) && defined(HOTEND0_BETA)) #error "TEMP_SENSOR_0 1000 requires HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS and HOTEND0_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_1_USER_THERMISTOR) && !(defined(HOTEND1_PULLUP_RESISTOR_OHMS) && defined(HOTEND1_RESISTANCE_25C_OHMS) && defined(HOTEND1_BETA)) +#elif HEATER_1_USER_THERMISTOR && !(defined(HOTEND1_PULLUP_RESISTOR_OHMS) && defined(HOTEND1_RESISTANCE_25C_OHMS) && defined(HOTEND1_BETA)) #error "TEMP_SENSOR_1 1000 requires HOTEND1_PULLUP_RESISTOR_OHMS, HOTEND1_RESISTANCE_25C_OHMS and HOTEND1_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_2_USER_THERMISTOR) && !(defined(HOTEND2_PULLUP_RESISTOR_OHMS) && defined(HOTEND2_RESISTANCE_25C_OHMS) && defined(HOTEND2_BETA)) +#elif HEATER_2_USER_THERMISTOR && !(defined(HOTEND2_PULLUP_RESISTOR_OHMS) && defined(HOTEND2_RESISTANCE_25C_OHMS) && defined(HOTEND2_BETA)) #error "TEMP_SENSOR_2 1000 requires HOTEND2_PULLUP_RESISTOR_OHMS, HOTEND2_RESISTANCE_25C_OHMS and HOTEND2_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_3_USER_THERMISTOR) && !(defined(HOTEND3_PULLUP_RESISTOR_OHMS) && defined(HOTEND3_RESISTANCE_25C_OHMS) && defined(HOTEND3_BETA)) +#elif HEATER_3_USER_THERMISTOR && !(defined(HOTEND3_PULLUP_RESISTOR_OHMS) && defined(HOTEND3_RESISTANCE_25C_OHMS) && defined(HOTEND3_BETA)) #error "TEMP_SENSOR_3 1000 requires HOTEND3_PULLUP_RESISTOR_OHMS, HOTEND3_RESISTANCE_25C_OHMS and HOTEND3_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_4_USER_THERMISTOR) && !(defined(HOTEND4_PULLUP_RESISTOR_OHMS) && defined(HOTEND4_RESISTANCE_25C_OHMS) && defined(HOTEND4_BETA)) +#elif HEATER_4_USER_THERMISTOR && !(defined(HOTEND4_PULLUP_RESISTOR_OHMS) && defined(HOTEND4_RESISTANCE_25C_OHMS) && defined(HOTEND4_BETA)) #error "TEMP_SENSOR_4 1000 requires HOTEND4_PULLUP_RESISTOR_OHMS, HOTEND4_RESISTANCE_25C_OHMS and HOTEND4_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_5_USER_THERMISTOR) && !(defined(HOTEND5_PULLUP_RESISTOR_OHMS) && defined(HOTEND5_RESISTANCE_25C_OHMS) && defined(HOTEND5_BETA)) +#elif HEATER_5_USER_THERMISTOR && !(defined(HOTEND5_PULLUP_RESISTOR_OHMS) && defined(HOTEND5_RESISTANCE_25C_OHMS) && defined(HOTEND5_BETA)) #error "TEMP_SENSOR_5 1000 requires HOTEND5_PULLUP_RESISTOR_OHMS, HOTEND5_RESISTANCE_25C_OHMS and HOTEND5_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_6_USER_THERMISTOR) && !(defined(HOTEND6_PULLUP_RESISTOR_OHMS) && defined(HOTEND6_RESISTANCE_25C_OHMS) && defined(HOTEND6_BETA)) +#elif HEATER_6_USER_THERMISTOR && !(defined(HOTEND6_PULLUP_RESISTOR_OHMS) && defined(HOTEND6_RESISTANCE_25C_OHMS) && defined(HOTEND6_BETA)) #error "TEMP_SENSOR_6 1000 requires HOTEND6_PULLUP_RESISTOR_OHMS, HOTEND6_RESISTANCE_25C_OHMS and HOTEND6_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_7_USER_THERMISTOR) && !(defined(HOTEND7_PULLUP_RESISTOR_OHMS) && defined(HOTEND7_RESISTANCE_25C_OHMS) && defined(HOTEND7_BETA)) +#elif HEATER_7_USER_THERMISTOR && !(defined(HOTEND7_PULLUP_RESISTOR_OHMS) && defined(HOTEND7_RESISTANCE_25C_OHMS) && defined(HOTEND7_BETA)) #error "TEMP_SENSOR_7 1000 requires HOTEND7_PULLUP_RESISTOR_OHMS, HOTEND7_RESISTANCE_25C_OHMS and HOTEND7_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_BED_USER_THERMISTOR) && !(defined(BED_PULLUP_RESISTOR_OHMS) && defined(BED_RESISTANCE_25C_OHMS) && defined(BED_BETA)) +#elif HEATER_BED_USER_THERMISTOR && !(defined(BED_PULLUP_RESISTOR_OHMS) && defined(BED_RESISTANCE_25C_OHMS) && defined(BED_BETA)) #error "TEMP_SENSOR_BED 1000 requires BED_PULLUP_RESISTOR_OHMS, BED_RESISTANCE_25C_OHMS and BED_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_CHAMBER_USER_THERMISTOR) && !(defined(CHAMBER_PULLUP_RESISTOR_OHMS) && defined(CHAMBER_RESISTANCE_25C_OHMS) && defined(CHAMBER_BETA)) +#elif HEATER_CHAMBER_USER_THERMISTOR && !(defined(CHAMBER_PULLUP_RESISTOR_OHMS) && defined(CHAMBER_RESISTANCE_25C_OHMS) && defined(CHAMBER_BETA)) #error "TEMP_SENSOR_CHAMBER 1000 requires CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS and CHAMBER_BETA in Configuration_adv.h." #endif /** - * A Sensor ID has to be set for each heater + * Pins and Sensor IDs must be set for each heater */ +#if HEATER_0_USES_MAX6675 && !PIN_EXISTS(MAX6675_SS) + #error "MAX6675_SS_PIN (required for TEMP_SENSOR_0) not defined for this board." +#elif HAS_HOTEND && !HAS_TEMP_HOTEND + #error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board." +#elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 + #error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin." +#endif #if HAS_MULTI_HOTEND - #if ENABLED(HEATER_1_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS2) + #if HEATER_1_USES_MAX6675 && !PIN_EXISTS(MAX6675_SS2) #error "MAX6675_SS2_PIN (required for TEMP_SENSOR_1) not defined for this board." #elif TEMP_SENSOR_1 == 0 #error "TEMP_SENSOR_1 is required with 2 or more HOTENDS." @@ -1808,7 +1815,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT." #endif -#if ENABLED(MAX6675_IS_MAX31865) && (!defined(MAX31865_SENSOR_OHMS) || !defined(MAX31865_CALIBRATION_OHMS)) +#if MAX6675_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS) && defined(MAX31865_CALIBRATION_OHMS)) #error "MAX31865_SENSOR_OHMS and MAX31865_CALIBRATION_OHMS must be set in Configuration.h when using a MAX31865 temperature sensor." #endif @@ -1827,15 +1834,6 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_0 is required if there are any extruders." #endif -// Pins are required for heaters -#if ENABLED(HEATER_0_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS) - #error "MAX6675_SS_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif HAS_HOTEND && !HAS_TEMP_HOTEND - #error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 - #error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin." -#endif - /** * Temperature status LEDs */ diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 4eb7216511..b476b35593 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -44,7 +44,7 @@ #include "../lcd/extui/ui_api.h" #endif -#if ENABLED(MAX6675_IS_MAX31865) +#if MAX6675_IS_MAX31865 #include #ifndef MAX31865_CS_PIN #define MAX31865_CS_PIN MAX6675_SS_PIN // HW:49 SW:65 for example @@ -114,7 +114,13 @@ #if HAS_SERVOS #include "./servo.h" #endif -#if HOTEND_USES_THERMISTOR + +#if ANY(HEATER_0_USES_THERMISTOR, HEATER_1_USES_THERMISTOR, HEATER_2_USES_THERMISTOR, HEATER_3_USES_THERMISTOR, \ + HEATER_4_USES_THERMISTOR, HEATER_5_USES_THERMISTOR, HEATER_6_USES_THERMISTOR, HEATER_7_USES_THERMISTOR ) + #define HAS_HOTEND_THERMISTOR 1 +#endif + +#if HAS_HOTEND_THERMISTOR #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) static const temp_entry_t* heater_ttbl_map[2] = { HEATER_0_TEMPTABLE, HEATER_1_TEMPTABLE }; static constexpr uint8_t heater_ttbllen_map[2] = { HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN }; @@ -1046,11 +1052,11 @@ void Temperature::manage_heater() { updateTemperaturesFromRawValues(); // also resets the watchdog #if DISABLED(IGNORE_THERMOCOUPLE_ERRORS) - #if ENABLED(HEATER_0_USES_MAX6675) + #if HEATER_0_USES_MAX6675 if (temp_hotend[0].celsius > _MIN(HEATER_0_MAXTEMP, HEATER_0_MAX6675_TMAX - 1.0)) max_temp_error(H_E0); if (temp_hotend[0].celsius < _MAX(HEATER_0_MINTEMP, HEATER_0_MAX6675_TMIN + .01)) min_temp_error(H_E0); #endif - #if ENABLED(HEATER_1_USES_MAX6675) + #if HEATER_1_USES_MAX6675 if (temp_hotend[1].celsius > _MIN(HEATER_1_MAXTEMP, HEATER_1_MAX6675_TMAX - 1.0)) max_temp_error(H_E1); if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(H_E1); #endif @@ -1336,34 +1342,34 @@ void Temperature::manage_heater() { void Temperature::reset_user_thermistors() { user_thermistor_t user_thermistor[USER_THERMISTORS] = { - #if ENABLED(HEATER_0_USER_THERMISTOR) + #if HEATER_0_USER_THERMISTOR { true, 0, 0, HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS, 0, 0, HOTEND0_BETA, 0 }, #endif - #if ENABLED(HEATER_1_USER_THERMISTOR) + #if HEATER_1_USER_THERMISTOR { true, 0, 0, HOTEND1_PULLUP_RESISTOR_OHMS, HOTEND1_RESISTANCE_25C_OHMS, 0, 0, HOTEND1_BETA, 0 }, #endif - #if ENABLED(HEATER_2_USER_THERMISTOR) + #if HEATER_2_USER_THERMISTOR { true, 0, 0, HOTEND2_PULLUP_RESISTOR_OHMS, HOTEND2_RESISTANCE_25C_OHMS, 0, 0, HOTEND2_BETA, 0 }, #endif - #if ENABLED(HEATER_3_USER_THERMISTOR) + #if HEATER_3_USER_THERMISTOR { true, 0, 0, HOTEND3_PULLUP_RESISTOR_OHMS, HOTEND3_RESISTANCE_25C_OHMS, 0, 0, HOTEND3_BETA, 0 }, #endif - #if ENABLED(HEATER_4_USER_THERMISTOR) + #if HEATER_4_USER_THERMISTOR { true, 0, 0, HOTEND4_PULLUP_RESISTOR_OHMS, HOTEND4_RESISTANCE_25C_OHMS, 0, 0, HOTEND4_BETA, 0 }, #endif - #if ENABLED(HEATER_5_USER_THERMISTOR) + #if HEATER_5_USER_THERMISTOR { true, 0, 0, HOTEND5_PULLUP_RESISTOR_OHMS, HOTEND5_RESISTANCE_25C_OHMS, 0, 0, HOTEND5_BETA, 0 }, #endif - #if ENABLED(HEATER_6_USER_THERMISTOR) + #if HEATER_6_USER_THERMISTOR { true, 0, 0, HOTEND6_PULLUP_RESISTOR_OHMS, HOTEND6_RESISTANCE_25C_OHMS, 0, 0, HOTEND6_BETA, 0 }, #endif - #if ENABLED(HEATER_7_USER_THERMISTOR) + #if HEATER_7_USER_THERMISTOR { true, 0, 0, HOTEND7_PULLUP_RESISTOR_OHMS, HOTEND7_RESISTANCE_25C_OHMS, 0, 0, HOTEND7_BETA, 0 }, #endif - #if ENABLED(HEATER_BED_USER_THERMISTOR) + #if HEATER_BED_USER_THERMISTOR { true, 0, 0, BED_PULLUP_RESISTOR_OHMS, BED_RESISTANCE_25C_OHMS, 0, 0, BED_BETA, 0 }, #endif - #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) + #if HEATER_CHAMBER_USER_THERMISTOR { true, 0, 0, CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS, 0, 0, CHAMBER_BETA, 0 } #endif }; @@ -1462,91 +1468,91 @@ void Temperature::manage_heater() { switch (e) { case 0: - #if ENABLED(HEATER_0_USER_THERMISTOR) + #if HEATER_0_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_0, raw); - #elif ENABLED(HEATER_0_USES_MAX6675) + #elif HEATER_0_USES_MAX6675 return ( - #if ENABLED(MAX6675_IS_MAX31865) + #if MAX6675_IS_MAX31865 max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS) #else raw * 0.25 #endif ); - #elif ENABLED(HEATER_0_USES_AD595) + #elif HEATER_0_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_0_USES_AD8495) + #elif HEATER_0_USES_AD8495 return TEMP_AD8495(raw); #else break; #endif case 1: - #if ENABLED(HEATER_1_USER_THERMISTOR) + #if HEATER_1_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_1, raw); - #elif ENABLED(HEATER_1_USES_MAX6675) + #elif HEATER_1_USES_MAX6675 return raw * 0.25; - #elif ENABLED(HEATER_1_USES_AD595) + #elif HEATER_1_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_1_USES_AD8495) + #elif HEATER_1_USES_AD8495 return TEMP_AD8495(raw); #else break; #endif case 2: - #if ENABLED(HEATER_2_USER_THERMISTOR) + #if HEATER_2_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_2, raw); - #elif ENABLED(HEATER_2_USES_AD595) + #elif HEATER_2_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_2_USES_AD8495) + #elif HEATER_2_USES_AD8495 return TEMP_AD8495(raw); #else break; #endif case 3: - #if ENABLED(HEATER_3_USER_THERMISTOR) + #if HEATER_3_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_3, raw); - #elif ENABLED(HEATER_3_USES_AD595) + #elif HEATER_3_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_3_USES_AD8495) + #elif HEATER_3_USES_AD8495 return TEMP_AD8495(raw); #else break; #endif case 4: - #if ENABLED(HEATER_4_USER_THERMISTOR) + #if HEATER_4_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_4, raw); - #elif ENABLED(HEATER_4_USES_AD595) + #elif HEATER_4_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_4_USES_AD8495) + #elif HEATER_4_USES_AD8495 return TEMP_AD8495(raw); #else break; #endif case 5: - #if ENABLED(HEATER_5_USER_THERMISTOR) + #if HEATER_5_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_5, raw); - #elif ENABLED(HEATER_5_USES_AD595) + #elif HEATER_5_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_5_USES_AD8495) + #elif HEATER_5_USES_AD8495 return TEMP_AD8495(raw); #else break; #endif case 6: - #if ENABLED(HEATER_6_USER_THERMISTOR) + #if HEATER_6_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_6, raw); - #elif ENABLED(HEATER_6_USES_AD595) + #elif HEATER_6_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_6_USES_AD8495) + #elif HEATER_6_USES_AD8495 return TEMP_AD8495(raw); #else break; #endif case 7: - #if ENABLED(HEATER_7_USER_THERMISTOR) + #if HEATER_7_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_7, raw); - #elif ENABLED(HEATER_7_USES_AD595) + #elif HEATER_7_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_7_USES_AD8495) + #elif HEATER_7_USES_AD8495 return TEMP_AD8495(raw); #else break; @@ -1554,7 +1560,7 @@ void Temperature::manage_heater() { default: break; } - #if HOTEND_USES_THERMISTOR + #if HAS_HOTEND_THERMISTOR // Thermistor with conversion table? const temp_entry_t(*tt)[] = (temp_entry_t(*)[])(heater_ttbl_map[e]); SCAN_THERMISTOR_TABLE((*tt), heater_ttbllen_map[e]); @@ -1568,13 +1574,13 @@ void Temperature::manage_heater() { // Derived from RepRap FiveD extruder::getTemperature() // For bed temperature measurement. float Temperature::analog_to_celsius_bed(const int raw) { - #if ENABLED(HEATER_BED_USER_THERMISTOR) + #if HEATER_BED_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_BED, raw); - #elif ENABLED(HEATER_BED_USES_THERMISTOR) + #elif HEATER_BED_USES_THERMISTOR SCAN_THERMISTOR_TABLE(BED_TEMPTABLE, BED_TEMPTABLE_LEN); - #elif ENABLED(HEATER_BED_USES_AD595) + #elif HEATER_BED_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_BED_USES_AD8495) + #elif HEATER_BED_USES_AD8495 return TEMP_AD8495(raw); #else UNUSED(raw); @@ -1587,13 +1593,13 @@ void Temperature::manage_heater() { // Derived from RepRap FiveD extruder::getTemperature() // For chamber temperature measurement. float Temperature::analog_to_celsius_chamber(const int raw) { - #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) + #if HEATER_CHAMBER_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_CHAMBER, raw); - #elif ENABLED(HEATER_CHAMBER_USES_THERMISTOR) + #elif HEATER_CHAMBER_USES_THERMISTOR SCAN_THERMISTOR_TABLE(CHAMBER_TEMPTABLE, CHAMBER_TEMPTABLE_LEN); - #elif ENABLED(HEATER_CHAMBER_USES_AD595) + #elif HEATER_CHAMBER_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(HEATER_CHAMBER_USES_AD8495) + #elif HEATER_CHAMBER_USES_AD8495 return TEMP_AD8495(raw); #else UNUSED(raw); @@ -1606,13 +1612,13 @@ void Temperature::manage_heater() { // Derived from RepRap FiveD extruder::getTemperature() // For probe temperature measurement. float Temperature::analog_to_celsius_probe(const int raw) { - #if ENABLED(PROBE_USER_THERMISTOR) + #if HEATER_PROBE_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_PROBE, raw); - #elif ENABLED(PROBE_USES_THERMISTOR) + #elif HEATER_PROBE_USES_THERMISTOR SCAN_THERMISTOR_TABLE(PROBE_TEMPTABLE, PROBE_TEMPTABLE_LEN); - #elif ENABLED(PROBE_USES_AD595) + #elif HEATER_PROBE_USES_AD595 return TEMP_AD595(raw); - #elif ENABLED(PROBE_USES_AD8495) + #elif HEATER_PROBE_USES_AD8495 return TEMP_AD8495(raw); #else UNUSED(raw); @@ -1628,16 +1634,11 @@ void Temperature::manage_heater() { * as it would block the stepper routine. */ void Temperature::updateTemperaturesFromRawValues() { - #if ENABLED(HEATER_0_USES_MAX6675) - temp_hotend[0].raw = READ_MAX6675(0); - #endif - #if ENABLED(HEATER_1_USES_MAX6675) - temp_hotend[1].raw = READ_MAX6675(1); - #endif + TERN_(HEATER_0_USES_MAX6675, temp_hotend[0].raw = READ_MAX6675(0)); + TERN_(HEATER_1_USES_MAX6675, temp_hotend[1].raw = READ_MAX6675(1)); #if HAS_HOTEND HOTEND_LOOP() temp_hotend[e].celsius = analog_to_celsius_hotend(temp_hotend[e].raw, e); #endif - TERN_(HAS_HEATED_BED, temp_bed.celsius = analog_to_celsius_bed(temp_bed.raw)); TERN_(HAS_TEMP_CHAMBER, temp_chamber.celsius = analog_to_celsius_chamber(temp_chamber.raw)); TERN_(HAS_TEMP_PROBE, temp_probe.celsius = analog_to_celsius_probe(temp_probe.raw)); @@ -1700,7 +1701,7 @@ void Temperature::init() { #if MB(RUMBA) // Disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector - #define _AD(N) ANY(HEATER_##N##_USES_AD595, HEATER_##N##_USES_AD8495) + #define _AD(N) (HEATER_##N##_USES_AD595 || HEATER_##N##_USES_AD8495) #if _AD(0) || _AD(1) || _AD(2) || _AD(BED) || _AD(CHAMBER) MCUCR = _BV(JTD); MCUCR = _BV(JTD); @@ -1802,7 +1803,7 @@ void Temperature::init() { #endif - #if ENABLED(HEATER_1_USES_MAX6675) + #if HEATER_1_USES_MAX6675 OUT_WRITE(MAX6675_SS2_PIN, HIGH); #endif @@ -2215,7 +2216,7 @@ void Temperature::disable_all_heaters() { #define MAX6675_HEAT_INTERVAL 250UL - #if ENABLED(MAX6675_IS_MAX31855) + #if MAX6675_IS_MAX31855 static uint32_t max6675_temp = 2000; #define MAX6675_ERROR_MASK 7 #define MAX6675_DISCARD_BITS 18 @@ -2241,7 +2242,7 @@ void Temperature::disable_all_heaters() { next_max6675_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; - #if ENABLED(MAX6675_IS_MAX31865) + #if MAX6675_IS_MAX31865 max6675_temp = int(max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS)); #endif @@ -2256,7 +2257,7 @@ void Temperature::disable_all_heaters() { #if COUNT_6675 > 1 #define WRITE_MAX6675(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0) #define SET_OUTPUT_MAX6675() do{ switch (hindex) { case 1: SET_OUTPUT(MAX6675_SS2_PIN); break; default: SET_OUTPUT(MAX6675_SS_PIN); } }while(0) - #elif ENABLED(HEATER_1_USES_MAX6675) + #elif HEATER_1_USES_MAX6675 #define WRITE_MAX6675(V) WRITE(MAX6675_SS2_PIN, V) #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS2_PIN) #else @@ -2336,14 +2337,14 @@ void Temperature::disable_all_heaters() { */ void Temperature::update_raw_temperatures() { - #if HAS_TEMP_ADC_0 && DISABLED(HEATER_0_USES_MAX6675) + #if HAS_TEMP_ADC_0 && !HEATER_0_USES_MAX6675 temp_hotend[0].update(); #endif #if HAS_TEMP_ADC_1 #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) redundant_temperature_raw = temp_hotend[1].acc; - #elif DISABLED(HEATER_1_USES_MAX6675) + #elif !HEATER_1_USES_MAX6675 temp_hotend[1].update(); #endif #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index c3c3ce2d8b..4090b845d3 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -253,31 +253,31 @@ typedef struct { int16_t raw_min, raw_max, mintemp, maxtemp; } temp_range_t; #if HAS_USER_THERMISTORS enum CustomThermistorIndex : uint8_t { - #if ENABLED(HEATER_0_USER_THERMISTOR) + #if HEATER_0_USER_THERMISTOR CTI_HOTEND_0, #endif - #if ENABLED(HEATER_1_USER_THERMISTOR) + #if HEATER_1_USER_THERMISTOR CTI_HOTEND_1, #endif - #if ENABLED(HEATER_2_USER_THERMISTOR) + #if HEATER_2_USER_THERMISTOR CTI_HOTEND_2, #endif - #if ENABLED(HEATER_3_USER_THERMISTOR) + #if HEATER_3_USER_THERMISTOR CTI_HOTEND_3, #endif - #if ENABLED(HEATER_4_USER_THERMISTOR) + #if HEATER_4_USER_THERMISTOR CTI_HOTEND_4, #endif - #if ENABLED(HEATER_5_USER_THERMISTOR) + #if HEATER_5_USER_THERMISTOR CTI_HOTEND_5, #endif - #if ENABLED(HEATER_BED_USER_THERMISTOR) + #if HEATER_BED_USER_THERMISTOR CTI_BED, #endif - #if ENABLED(HEATER_PROBE_USER_THERMISTOR) + #if HEATER_PROBE_USER_THERMISTOR CTI_PROBE, #endif - #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) + #if HEATER_CHAMBER_USER_THERMISTOR CTI_CHAMBER, #endif USER_THERMISTORS @@ -811,15 +811,12 @@ class Temperature { #if HAS_MAX6675 #define COUNT_6675 1 + BOTH(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) #if COUNT_6675 > 1 + #define HAS_MULTI_6675 #define READ_MAX6675(N) read_max6675(N) #else #define READ_MAX6675(N) read_max6675() #endif - static int read_max6675( - #if COUNT_6675 > 1 - const uint8_t hindex=0 - #endif - ); + static int read_max6675(TERN_(HAS_MULTI_6675, const uint8_t hindex=0)); #endif static void checkExtruderAutoFans(); diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index ab92102de3..340712e22d 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -206,7 +206,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if THERMISTOR_HEATER_0 #define HEATER_0_TEMPTABLE TT_NAME(THERMISTOR_HEATER_0) #define HEATER_0_TEMPTABLE_LEN COUNT(HEATER_0_TEMPTABLE) -#elif defined(HEATER_0_USES_THERMISTOR) +#elif HEATER_0_USES_THERMISTOR #error "No heater 0 thermistor table specified" #else #define HEATER_0_TEMPTABLE nullptr @@ -216,7 +216,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if THERMISTOR_HEATER_1 #define HEATER_1_TEMPTABLE TT_NAME(THERMISTOR_HEATER_1) #define HEATER_1_TEMPTABLE_LEN COUNT(HEATER_1_TEMPTABLE) -#elif defined(HEATER_1_USES_THERMISTOR) +#elif HEATER_1_USES_THERMISTOR #error "No heater 1 thermistor table specified" #else #define HEATER_1_TEMPTABLE nullptr @@ -226,7 +226,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if THERMISTOR_HEATER_2 #define HEATER_2_TEMPTABLE TT_NAME(THERMISTOR_HEATER_2) #define HEATER_2_TEMPTABLE_LEN COUNT(HEATER_2_TEMPTABLE) -#elif defined(HEATER_2_USES_THERMISTOR) +#elif HEATER_2_USES_THERMISTOR #error "No heater 2 thermistor table specified" #else #define HEATER_2_TEMPTABLE nullptr @@ -236,7 +236,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if THERMISTOR_HEATER_3 #define HEATER_3_TEMPTABLE TT_NAME(THERMISTOR_HEATER_3) #define HEATER_3_TEMPTABLE_LEN COUNT(HEATER_3_TEMPTABLE) -#elif defined(HEATER_3_USES_THERMISTOR) +#elif HEATER_3_USES_THERMISTOR #error "No heater 3 thermistor table specified" #else #define HEATER_3_TEMPTABLE nullptr @@ -246,7 +246,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if THERMISTOR_HEATER_4 #define HEATER_4_TEMPTABLE TT_NAME(THERMISTOR_HEATER_4) #define HEATER_4_TEMPTABLE_LEN COUNT(HEATER_4_TEMPTABLE) -#elif defined(HEATER_4_USES_THERMISTOR) +#elif HEATER_4_USES_THERMISTOR #error "No heater 4 thermistor table specified" #else #define HEATER_4_TEMPTABLE nullptr @@ -256,7 +256,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if THERMISTOR_HEATER_5 #define HEATER_5_TEMPTABLE TT_NAME(THERMISTOR_HEATER_5) #define HEATER_5_TEMPTABLE_LEN COUNT(HEATER_5_TEMPTABLE) -#elif defined(HEATER_5_USES_THERMISTOR) +#elif HEATER_5_USES_THERMISTOR #error "No heater 5 thermistor table specified" #else #define HEATER_5_TEMPTABLE nullptr @@ -266,7 +266,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if THERMISTOR_HEATER_6 #define HEATER_6_TEMPTABLE TT_NAME(THERMISTOR_HEATER_6) #define HEATER_6_TEMPTABLE_LEN COUNT(HEATER_6_TEMPTABLE) -#elif defined(HEATER_6_USES_THERMISTOR) +#elif HEATER_6_USES_THERMISTOR #error "No heater 6 thermistor table specified" #else #define HEATER_6_TEMPTABLE nullptr @@ -276,7 +276,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if THERMISTOR_HEATER_7 #define HEATER_7_TEMPTABLE TT_NAME(THERMISTOR_HEATER_7) #define HEATER_7_TEMPTABLE_LEN COUNT(HEATER_7_TEMPTABLE) -#elif defined(HEATER_7_USES_THERMISTOR) +#elif HEATER_7_USES_THERMISTOR #error "No heater 7 thermistor table specified" #else #define HEATER_7_TEMPTABLE nullptr @@ -286,7 +286,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #ifdef THERMISTORBED #define BED_TEMPTABLE TT_NAME(THERMISTORBED) #define BED_TEMPTABLE_LEN COUNT(BED_TEMPTABLE) -#elif defined(HEATER_BED_USES_THERMISTOR) +#elif HEATER_BED_USES_THERMISTOR #error "No bed thermistor table specified" #else #define BED_TEMPTABLE_LEN 0 @@ -295,7 +295,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #ifdef THERMISTORCHAMBER #define CHAMBER_TEMPTABLE TT_NAME(THERMISTORCHAMBER) #define CHAMBER_TEMPTABLE_LEN COUNT(CHAMBER_TEMPTABLE) -#elif defined(HEATER_CHAMBER_USES_THERMISTOR) +#elif HEATER_CHAMBER_USES_THERMISTOR #error "No chamber thermistor table specified" #else #define CHAMBER_TEMPTABLE_LEN 0 @@ -304,7 +304,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #ifdef THERMISTORPROBE #define PROBE_TEMPTABLE TT_NAME(THERMISTORPROBE) #define PROBE_TEMPTABLE_LEN COUNT(PROBE_TEMPTABLE) -#elif defined(HEATER_PROBE_USES_THERMISTOR) +#elif HEATER_PROBE_USES_THERMISTOR #error "No probe thermistor table specified" #else #define PROBE_TEMPTABLE_LEN 0 @@ -402,7 +402,7 @@ static_assert( #endif #ifndef HEATER_0_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_0) || !defined(HEATER_0_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_0) || !HEATER_0_USES_THERMISTOR #define HEATER_0_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_0_RAW_LO_TEMP 0 #else @@ -411,7 +411,7 @@ static_assert( #endif #endif #ifndef HEATER_1_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_1) || !defined(HEATER_1_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_1) || !HEATER_1_USES_THERMISTOR #define HEATER_1_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_1_RAW_LO_TEMP 0 #else @@ -420,7 +420,7 @@ static_assert( #endif #endif #ifndef HEATER_2_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_2) || !defined(HEATER_2_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_2) || !HEATER_2_USES_THERMISTOR #define HEATER_2_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_2_RAW_LO_TEMP 0 #else @@ -429,7 +429,7 @@ static_assert( #endif #endif #ifndef HEATER_3_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_3) || !defined(HEATER_3_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_3) || !HEATER_3_USES_THERMISTOR #define HEATER_3_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_3_RAW_LO_TEMP 0 #else @@ -438,7 +438,7 @@ static_assert( #endif #endif #ifndef HEATER_4_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_4) || !defined(HEATER_4_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_4) || !HEATER_4_USES_THERMISTOR #define HEATER_4_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_4_RAW_LO_TEMP 0 #else @@ -447,7 +447,7 @@ static_assert( #endif #endif #ifndef HEATER_5_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_5) || !defined(HEATER_5_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_5) || !HEATER_5_USES_THERMISTOR #define HEATER_5_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_5_RAW_LO_TEMP 0 #else @@ -456,7 +456,7 @@ static_assert( #endif #endif #ifndef HEATER_6_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_6) || !defined(HEATER_6_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_6) || !HEATER_6_USES_THERMISTOR #define HEATER_6_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_6_RAW_LO_TEMP 0 #else @@ -465,7 +465,7 @@ static_assert( #endif #endif #ifndef HEATER_7_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_7) || !defined(HEATER_7_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_7) || !HEATER_7_USES_THERMISTOR #define HEATER_7_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_7_RAW_LO_TEMP 0 #else @@ -474,7 +474,7 @@ static_assert( #endif #endif #ifndef HEATER_BED_RAW_HI_TEMP - #if TT_REV(THERMISTORBED) || !defined(HEATER_BED_USES_THERMISTOR) + #if TT_REV(THERMISTORBED) || !HEATER_BED_USES_THERMISTOR #define HEATER_BED_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_BED_RAW_LO_TEMP 0 #else @@ -483,7 +483,7 @@ static_assert( #endif #endif #ifndef HEATER_CHAMBER_RAW_HI_TEMP - #if TT_REV(THERMISTORCHAMBER) || !defined(HEATER_CHAMBER_USES_THERMISTOR) + #if TT_REV(THERMISTORCHAMBER) || !HEATER_CHAMBER_USES_THERMISTOR #define HEATER_CHAMBER_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_CHAMBER_RAW_LO_TEMP 0 #else @@ -492,7 +492,7 @@ static_assert( #endif #endif #ifndef HEATER_PROBE_RAW_HI_TEMP - #if TT_REV(THERMISTORPROBE) || !defined(HEATER_PROBE_USES_THERMISTOR) + #if TT_REV(THERMISTORPROBE) || !HEATER_PROBE_USES_THERMISTOR #define HEATER_PROBE_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_PROBE_RAW_LO_TEMP 0 #else From ca730314e7fdd332f5879b5629f4f56d5be65e28 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 9 Nov 2020 18:53:19 -0600 Subject: [PATCH 0542/1370] Ability to disable M32 --- Marlin/src/gcode/gcode.cpp | 5 +- Marlin/src/gcode/gcode.h | 2 +- Marlin/src/gcode/sd/M32.cpp | 4 +- Marlin/src/inc/Conditionals_adv.h | 4 ++ Marlin/src/sd/cardreader.cpp | 82 +++++++++++++++++-------------- Marlin/src/sd/cardreader.h | 9 ++-- buildroot/tests/LPC1769-tests | 1 + platformio.ini | 2 + 8 files changed, 64 insertions(+), 45 deletions(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index e2c70ad3ae..1d6bd94231 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -431,7 +431,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 28: M28(); break; // M28: Start SD write case 29: M29(); break; // M29: Stop SD write case 30: M30(); break; // M30 Delete File - case 32: M32(); break; // M32: Select file and start SD print + + #if HAS_MEDIA_SUBCALLS + case 32: M32(); break; // M32: Select file and start SD print + #endif #if ENABLED(LONG_FILENAME_HOST_SUPPORT) case 33: M33(); break; // M33: Get the long full path to a file or folder diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 34df51e517..5db8b08e08 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -541,7 +541,7 @@ private: static void M31(); #if ENABLED(SDSUPPORT) - static void M32(); + TERN_(HAS_MEDIA_SUBCALLS, static void M32()); TERN_(LONG_FILENAME_HOST_SUPPORT, static void M33()); #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) static void M34(); diff --git a/Marlin/src/gcode/sd/M32.cpp b/Marlin/src/gcode/sd/M32.cpp index 55ec6ea497..ea893c9232 100644 --- a/Marlin/src/gcode/sd/M32.cpp +++ b/Marlin/src/gcode/sd/M32.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if ENABLED(SDSUPPORT) +#if HAS_MEDIA_SUBCALLS #include "../gcode.h" #include "../../sd/cardreader.h" @@ -56,4 +56,4 @@ void GcodeSuite::M32() { } } -#endif // SDSUPPORT +#endif // HAS_MEDIA_SUBCALLS diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 2a898d6084..02513e3eaa 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -146,6 +146,10 @@ #define HAS_PRINT_PROGRESS 1 #endif +#if ENABLED(SDSUPPORT) && SD_PROCEDURE_DEPTH + #define HAS_MEDIA_SUBCALLS 1 +#endif + #if HAS_PRINT_PROGRESS && EITHER(PRINT_PROGRESS_SHOW_DECIMALS, SHOW_REMAINING_TIME) #define HAS_PRINT_PROGRESS_PERMYRIAD 1 #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 5a914050c4..d2713539b7 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -118,9 +118,11 @@ Sd2Card CardReader::sd2card; SdVolume CardReader::volume; SdFile CardReader::file; -uint8_t CardReader::file_subcall_ctr; -uint32_t CardReader::filespos[SD_PROCEDURE_DEPTH]; -char CardReader::proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; +#if HAS_MEDIA_SUBCALLS + uint8_t CardReader::file_subcall_ctr; + uint32_t CardReader::filespos[SD_PROCEDURE_DEPTH]; + char CardReader::proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; +#endif uint32_t CardReader::filesize, CardReader::sdpos; @@ -135,7 +137,8 @@ CardReader::CardReader() { #endif flag.sdprinting = flag.mounted = flag.saving = flag.logging = false; filesize = sdpos = 0; - file_subcall_ctr = 0; + + TERN_(HAS_MEDIA_SUBCALLS, file_subcall_ctr = 0); workDirDepth = 0; ZERO(workDirParents); @@ -540,34 +543,39 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* switch (subcall_type) { case 0: // Starting a new print. "Now fresh file: ..." announceOpen(2, path); - file_subcall_ctr = 0; + TERN_(HAS_MEDIA_SUBCALLS, file_subcall_ctr = 0); break; - case 1: // Starting a sub-procedure + #if HAS_MEDIA_SUBCALLS - // With no file is open it's a simple macro. "Now doing file: ..." - if (!isFileOpen()) { announceOpen(1, path); break; } + case 1: // Starting a sub-procedure - // Too deep? The firmware has to bail. - if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) { - SERIAL_ERROR_MSG("Exceeded max SUBROUTINE depth:" STRINGIFY(SD_PROCEDURE_DEPTH)); - kill(GET_TEXT(MSG_KILL_SUBCALL_OVERFLOW)); - return; - } + // With no file is open it's a simple macro. "Now doing file: ..." + if (!isFileOpen()) { announceOpen(1, path); break; } - // Store current filename (based on workDirParents) and position - getAbsFilename(proc_filenames[file_subcall_ctr]); - filespos[file_subcall_ctr] = sdpos; + // Too deep? The firmware has to bail. + if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) { + SERIAL_ERROR_MSG("Exceeded max SUBROUTINE depth:", int(SD_PROCEDURE_DEPTH)); + kill(GET_TEXT(MSG_KILL_SUBCALL_OVERFLOW)); + return; + } - // For sub-procedures say 'SUBROUTINE CALL target: "..." parent: "..." pos12345' - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("SUBROUTINE CALL target:\"", path, "\" parent:\"", proc_filenames[file_subcall_ctr], "\" pos", sdpos); - file_subcall_ctr++; - break; + // Store current filename (based on workDirParents) and position + getAbsFilename(proc_filenames[file_subcall_ctr]); - case 2: // Resuming previous file after sub-procedure - SERIAL_ECHO_MSG("END SUBROUTINE"); - break; + TERN_(HAS_MEDIA_SUBCALLS, filespos[file_subcall_ctr] = sdpos); + + // For sub-procedures say 'SUBROUTINE CALL target: "..." parent: "..." pos12345' + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("SUBROUTINE CALL target:\"", path, "\" parent:\"", proc_filenames[file_subcall_ctr], "\" pos", sdpos); + file_subcall_ctr++; + break; + + case 2: // Resuming previous file after sub-procedure + SERIAL_ECHO_MSG("END SUBROUTINE"); + break; + + #endif } endFilePrint(); @@ -603,7 +611,7 @@ void CardReader::openFileWrite(char * const path) { if (!isMounted()) return; announceOpen(2, path); - file_subcall_ctr = 0; + TERN_(HAS_MEDIA_SUBCALLS, file_subcall_ctr = 0); endFilePrint(); @@ -1158,17 +1166,19 @@ uint16_t CardReader::get_num_Files() { void CardReader::fileHasFinished() { planner.synchronize(); file.close(); - if (file_subcall_ctr > 0) { // Resume calling file after closing procedure - file_subcall_ctr--; - openFileRead(proc_filenames[file_subcall_ctr], 2); // 2 = Returning from sub-procedure - setIndex(filespos[file_subcall_ctr]); - startFileprint(); - } - else { - endFilePrint(TERN_(SD_RESORT, true)); - marlin_state = MF_SD_COMPLETE; - } + #if HAS_MEDIA_SUBCALLS + if (file_subcall_ctr > 0) { // Resume calling file after closing procedure + file_subcall_ctr--; + openFileRead(proc_filenames[file_subcall_ctr], 2); // 2 = Returning from sub-procedure + setIndex(filespos[file_subcall_ctr]); + startFileprint(); + return; + } + #endif + + endFilePrint(TERN_(SD_RESORT, true)); + marlin_state = MF_SD_COMPLETE; } #if ENABLED(AUTO_REPORT_SD_STATUS) diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 33645b6531..c6fe37400c 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -249,12 +249,11 @@ private: // // Procedure calls to other files // - #ifndef SD_PROCEDURE_DEPTH - #define SD_PROCEDURE_DEPTH 1 + #if HAS_MEDIA_SUBCALLS + static uint8_t file_subcall_ctr; + static uint32_t filespos[SD_PROCEDURE_DEPTH]; + static char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; #endif - static uint8_t file_subcall_ctr; - static uint32_t filespos[SD_PROCEDURE_DEPTH]; - static char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; // // SD Auto Reporting diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index 4314b0d5ff..df66f0ab75 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -23,6 +23,7 @@ opt_enable VIKI2 SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER +opt_disable SD_PROCEDURE_DEPTH opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Smoothieboard with many features" diff --git a/platformio.ini b/platformio.ini index af7ce47a50..15b8d4c23a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -180,6 +180,7 @@ default_src_filter = + - - + - - - + - - - - @@ -370,6 +371,7 @@ Z_PROBE_SLED = src_filter=+ G38_PROBE_TARGET = src_filter=+ MAGNETIC_PARKING_EXTRUDER = src_filter=+ SDSUPPORT = src_filter=+ +HAS_MEDIA_SUBCALLS = src_filter=+ HAS_EXTRUDERS = src_filter=+ + AUTO_REPORT_TEMPERATURES = src_filter=+ INCH_MODE_SUPPORT = src_filter=+ From 367c447ff82a5faf836a7c7da81e7c662b21596f Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Tue, 10 Nov 2020 10:21:05 +0100 Subject: [PATCH 0543/1370] Fix 320x240 touch buttons Y (#20079) --- Marlin/src/lcd/touch/touch_buttons.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/touch/touch_buttons.h b/Marlin/src/lcd/touch/touch_buttons.h index bf05d2bae5..a79bb15be4 100644 --- a/Marlin/src/lcd/touch/touch_buttons.h +++ b/Marlin/src/lcd/touch/touch_buttons.h @@ -47,7 +47,7 @@ #define BUTTONC_X_LO BUTTONB_X_HI + BUTTON_SPACING #define BUTTONC_X_HI BUTTONC_X_LO + BUTTON_WIDTH - 1 -#define BUTTON_Y_HI (TFT_HEIGHT) - (BUTTON_SPACING / 2) +#define BUTTON_Y_HI (TFT_HEIGHT) - BUTTON_SPACING #define BUTTON_Y_LO BUTTON_Y_HI - BUTTON_HEIGHT class TouchButtons { From 791fba3187330693ab133b099692561e0310d775 Mon Sep 17 00:00:00 2001 From: Gustavo Alvarez <462213+sl1pkn07@users.noreply.github.com> Date: Tue, 10 Nov 2020 10:22:08 +0100 Subject: [PATCH 0544/1370] Fix SKR E3 DIP pin CLCD_SPI_CS (#20078) --- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index c151b44bb7..c748dbbed3 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -264,7 +264,7 @@ #define BEEPER_PIN PB6 #define CLCD_MOD_RESET PA9 - #define CLCD_SPI_CS PA8 + #define CLCD_SPI_CS PB8 #endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 From 24c2ce6a87d6b95216ab43ef3edc2b95f630ca70 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Tue, 10 Nov 2020 10:26:45 +0100 Subject: [PATCH 0545/1370] Update issues/support link (#20077) Co-authored-by: Scott Lahteine --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3c2afa874..f70b7c409a 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Proposed patches should be submitted as a Pull Request against the ([bugfix-2.0. - This branch is for fixing bugs and integrating any new features for the duration of the Marlin 2.0.x life-cycle. - Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. -- Please submit your questions and concerns to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues). +- Please submit Feature Requests and Bug Reports to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues/new/choose). Support resources are also listed there. ### [RepRap.org Wiki Page](https://reprap.org/wiki/Marlin) From 2365df532f45070bc5cd4af01b5d11c606d8287f Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Tue, 10 Nov 2020 10:27:34 +0100 Subject: [PATCH 0546/1370] What if 8 was 9? (#20076) --- Marlin/src/MarlinCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index be3dcdd109..44abf722f2 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -509,7 +509,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { kill(); } - // M18 / M94 : Handle steppers inactive time timeout + // M18 / M84 : Handle steppers inactive time timeout if (gcode.stepper_inactive_time) { static bool already_shutdown_steppers; // = false From ee48fc6544bcf916bd1c4ac24831648b33835194 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 10 Nov 2020 01:32:08 -0800 Subject: [PATCH 0547/1370] Fix Arduino DUE compilation (#20058) --- Marlin/src/HAL/STM32/MarlinSPI.cpp | 4 ++++ Marlin/src/feature/controllerfan.cpp | 2 ++ Marlin/src/feature/controllerfan.h | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/HAL/STM32/MarlinSPI.cpp b/Marlin/src/HAL/STM32/MarlinSPI.cpp index fd05b1aeb4..da11b88a60 100644 --- a/Marlin/src/HAL/STM32/MarlinSPI.cpp +++ b/Marlin/src/HAL/STM32/MarlinSPI.cpp @@ -20,6 +20,8 @@ * */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + #include "MarlinSPI.h" static void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb, uint32_t dataSize) { @@ -159,3 +161,5 @@ uint8_t MarlinSPI::dmaSend(const void * transmitBuf, uint16_t length, bool minc) HAL_DMA_DeInit(&_dmaTx); return 1; } + +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index fa5a86b019..0206467752 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -34,6 +34,8 @@ uint8_t ControllerFan::speed; #if ENABLED(CONTROLLER_FAN_EDITABLE) controllerFan_settings_t ControllerFan::settings; // {0} + #else + const controllerFan_settings_t &ControllerFan::settings = controllerFan_defaults; #endif void ControllerFan::setup() { diff --git a/Marlin/src/feature/controllerfan.h b/Marlin/src/feature/controllerfan.h index d1d39f21f3..55f2d5cfc7 100644 --- a/Marlin/src/feature/controllerfan.h +++ b/Marlin/src/feature/controllerfan.h @@ -58,7 +58,7 @@ class ControllerFan { #if ENABLED(CONTROLLER_FAN_EDITABLE) static controllerFan_settings_t settings; #else - static const controllerFan_settings_t constexpr &settings = controllerFan_defaults; + static const controllerFan_settings_t &settings; #endif static inline bool state() { return speed > 0; } static inline void init() { reset(); } From ccb5e3405262cb582882288872bf8ec8857b84c4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 10 Nov 2020 22:39:34 -0300 Subject: [PATCH 0548/1370] Fix UI compile issues (#20092) --- .../lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_language.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 10 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 4 +- Marlin/src/lcd/lcdprint.cpp | 2 +- Marlin/src/lcd/marlinui.cpp | 110 +++++++++--------- Marlin/src/lcd/marlinui.h | 10 +- 9 files changed, 75 insertions(+), 73 deletions(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp index c745f971dc..aa5f990898 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp @@ -55,7 +55,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_U8GLIB +#if HAS_MARLINUI_U8GLIB && DISABLED(TFT_CLASSIC_UI) #include "HAL_LCD_com_defines.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 8f7279f5dd..befed7a646 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -181,7 +181,7 @@ static void disp_language(uint8_t language, uint8_t state) { strcat_P(public_buf_l, PSTR(".bin")); - lv_obj_set_event_cb_mks(obj, event_handler, id, nullptr, 0); + lv_obj_set_event_cb_mks(obj, event_handler, id, "", 0); lv_imgbtn_set_src_both(obj, public_buf_l); if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index f513ea4d0b..9014e88d75 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -279,7 +279,7 @@ void disp_gcode_icon(uint8_t file_num) { cutFileName((char *)list_file.long_name[i], 16, 8, (char *)public_buf_m); if (list_file.IsFolder[i]) { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0); lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_dir.bin"); if (i < 3) lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); @@ -298,7 +298,7 @@ void disp_gcode_icon(uint8_t file_num) { strcat(test_public_buf_l, list_file.file_name[i]); char *temp = strstr(test_public_buf_l, ".GCO"); if (temp) strcpy(temp, ".bin"); - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0); lv_imgbtn_set_src_both(buttonGcode[i], test_public_buf_l); if (i < 3) { lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET); @@ -308,7 +308,7 @@ void disp_gcode_icon(uint8_t file_num) { lv_btn_use_label_style(buttonText[i]); lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); - //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),nullptr, 0); + //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),"", 0); lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); lv_obj_set_size(buttonText[i], 100, 40); } @@ -320,7 +320,7 @@ void disp_gcode_icon(uint8_t file_num) { lv_btn_use_label_style(buttonText[i]); lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); - //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),nullptr, 0); + //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),"", 0); lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); lv_obj_set_size(buttonText[i], 100, 40); } @@ -328,7 +328,7 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_align(labelPageUp[i], buttonText[i], LV_ALIGN_IN_BOTTOM_MID, 0, 0); } else { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), nullptr, 0); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0); lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_file.bin"); if (i < 3) lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index c7f5f418f5..58b593a128 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -1680,7 +1680,7 @@ lv_obj_t* lv_label_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, const char lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/, lv_style_t *style/*=&style_para_value*/) { lv_obj_t *btn = lv_btn_create(par, nullptr); if (id) - lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0); + lv_obj_set_event_cb_mks(btn, cb, id, "", 0); else lv_obj_set_event_cb(btn, cb); lv_btn_set_style_both(btn, style); @@ -1748,7 +1748,7 @@ lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, con lv_obj_t *btn = lv_imgbtn_create(par, nullptr); if (img) lv_imgbtn_set_src_both(btn, img); if (id) - lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0); + lv_obj_set_event_cb_mks(btn, cb, id, "", 0); else lv_obj_set_event_cb(btn, cb); lv_imgbtn_use_label_style(btn); @@ -1785,7 +1785,7 @@ lv_obj_t* lv_screen_menu_item(lv_obj_t *par, const char *text, lv_coord_t x, lv_ lv_obj_t *btn = lv_btn_create(par, nullptr); /*Add a button the current screen*/ lv_obj_set_pos(btn, x, y); /*Set its position*/ lv_obj_set_size(btn, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - if (id > -1) lv_obj_set_event_cb_mks(btn, cb, id, nullptr, 0); + if (id > -1) lv_obj_set_event_cb_mks(btn, cb, id, "", 0); lv_btn_use_label_style(btn); lv_btn_set_layout(btn, LV_LAYOUT_OFF); lv_obj_t *label = lv_label_create_empty(btn); /*Add a label to the button*/ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index 313abd4545..6f14c20d29 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -73,7 +73,7 @@ void lv_draw_wifi(void) { buttonReconnect = lv_imgbtn_create(scr, nullptr); - lv_obj_set_event_cb_mks(buttonReconnect, event_handler, ID_W_RECONNECT, nullptr, 0); + lv_obj_set_event_cb_mks(buttonReconnect, event_handler, ID_W_RECONNECT, "", 0); lv_imgbtn_set_src_both(buttonReconnect, "F:/bmp_wifi.bin"); lv_imgbtn_use_label_style(buttonReconnect); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 097263a655..d67cb8cc29 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if HAS_TFT_LVGL_UI +#if BOTH(HAS_TFT_LVGL_UI, USE_WIFI_FUNCTION) #include "draw_ui.h" #include "wifi_module.h" @@ -822,4 +822,4 @@ int32_t wifi_upload(int type) { return esp_upload.uploadResult == success ? 0 : -1; } -#endif // HAS_TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI && USE_WIFI_FUNCTION diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index 6781b81d7c..2c78b14834 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -26,7 +26,7 @@ #include "../inc/MarlinConfigPre.h" -#if HAS_WIRED_LCD +#if HAS_WIRED_LCD && !HAS_GRAPHICAL_TFT #include "lcdprint.h" diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 1994e4094b..17c3c3edfe 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -262,67 +262,71 @@ millis_t MarlinUI::next_button_update_ms; // = 0 #endif - void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, bool wordwrap/*=false*/) { - SETCURSOR(col, row); - if (!string) return; + #if !HAS_GRAPHICAL_TFT - auto _newline = [&col, &row]{ - col = 0; row++; // Move col to string len (plus space) - SETCURSOR(0, row); // Simulate carriage return - }; + void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, bool wordwrap/*=false*/) { + SETCURSOR(col, row); + if (!string) return; - uint8_t *p = (uint8_t*)string; - wchar_t ch; - if (wordwrap) { - uint8_t *wrd = nullptr, c = 0; - // find the end of the part - for (;;) { - if (!wrd) wrd = p; // Get word start /before/ advancing - p = get_utf8_value_cb(p, cb_read_byte, &ch); - const bool eol = !ch; // zero ends the string - // End or a break between phrases? - if (eol || ch == ' ' || ch == '-' || ch == '+' || ch == '.') { - if (!c && ch == ' ') { if (wrd) wrd++; continue; } // collapse extra spaces - // Past the right and the word is not too long? - if (col + c > LCD_WIDTH && col >= (LCD_WIDTH) / 4) _newline(); // should it wrap? - c += !eol; // +1 so the space will be printed - col += c; // advance col to new position - while (c) { // character countdown - --c; // count down to zero - wrd = get_utf8_value_cb(wrd, cb_read_byte, &ch); // get characters again - lcd_put_wchar(ch); // character to the LCD + auto _newline = [&col, &row]{ + col = 0; row++; // Move col to string len (plus space) + SETCURSOR(0, row); // Simulate carriage return + }; + + uint8_t *p = (uint8_t*)string; + wchar_t ch; + if (wordwrap) { + uint8_t *wrd = nullptr, c = 0; + // find the end of the part + for (;;) { + if (!wrd) wrd = p; // Get word start /before/ advancing + p = get_utf8_value_cb(p, cb_read_byte, &ch); + const bool eol = !ch; // zero ends the string + // End or a break between phrases? + if (eol || ch == ' ' || ch == '-' || ch == '+' || ch == '.') { + if (!c && ch == ' ') { if (wrd) wrd++; continue; } // collapse extra spaces + // Past the right and the word is not too long? + if (col + c > LCD_WIDTH && col >= (LCD_WIDTH) / 4) _newline(); // should it wrap? + c += !eol; // +1 so the space will be printed + col += c; // advance col to new position + while (c) { // character countdown + --c; // count down to zero + wrd = get_utf8_value_cb(wrd, cb_read_byte, &ch); // get characters again + lcd_put_wchar(ch); // character to the LCD + } + if (eol) break; // all done! + wrd = nullptr; // set up for next word } - if (eol) break; // all done! - wrd = nullptr; // set up for next word + else c++; // count word characters + } + } + else { + for (;;) { + p = get_utf8_value_cb(p, cb_read_byte, &ch); + if (!ch) break; + lcd_put_wchar(ch); + col++; + if (col >= LCD_WIDTH) _newline(); } - else c++; // count word characters } } - else { - for (;;) { - p = get_utf8_value_cb(p, cb_read_byte, &ch); - if (!ch) break; - lcd_put_wchar(ch); - col++; - if (col >= LCD_WIDTH) _newline(); - } - } - } - void MarlinUI::draw_select_screen_prompt(PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { - const uint8_t plen = utf8_strlen_P(pref), slen = suff ? utf8_strlen_P(suff) : 0; - uint8_t col = 0, row = 0; - if (!string && plen + slen <= LCD_WIDTH) { - col = (LCD_WIDTH - plen - slen) / 2; - row = LCD_HEIGHT > 3 ? 1 : 0; + void MarlinUI::draw_select_screen_prompt(PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { + const uint8_t plen = utf8_strlen_P(pref), slen = suff ? utf8_strlen_P(suff) : 0; + uint8_t col = 0, row = 0; + if (!string && plen + slen <= LCD_WIDTH) { + col = (LCD_WIDTH - plen - slen) / 2; + row = LCD_HEIGHT > 3 ? 1 : 0; + } + wrap_string_P(col, row, pref, true); + if (string) { + if (col) { col = 0; row++; } // Move to the start of the next line + wrap_string(col, row, string); + } + if (suff) wrap_string_P(col, row, suff); } - wrap_string_P(col, row, pref, true); - if (string) { - if (col) { col = 0; row++; } // Move to the start of the next line - wrap_string(col, row, string); - } - if (suff) wrap_string_P(col, row, suff); - } + + #endif // !HAS_GRAPHICAL_TFT #endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index d0b66aee45..ed02f4000b 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -80,12 +80,10 @@ #include "lcdprint.h" - void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, const bool wordwrap=false); - inline void wrap_string_P(uint8_t &col, uint8_t &row, PGM_P const pstr, const bool wordwrap=false) { _wrap_string(col, row, pstr, read_byte_rom, wordwrap); } - inline void wrap_string(uint8_t &col, uint8_t &row, const char * const string, const bool wordwrap=false) { _wrap_string(col, row, string, read_byte_ram, wordwrap); } - - #if ENABLED(SDSUPPORT) - #include "../sd/cardreader.h" + #if !HAS_GRAPHICAL_TFT + void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, const bool wordwrap=false); + inline void wrap_string_P(uint8_t &col, uint8_t &row, PGM_P const pstr, const bool wordwrap=false) { _wrap_string(col, row, pstr, read_byte_rom, wordwrap); } + inline void wrap_string(uint8_t &col, uint8_t &row, const char * const string, const bool wordwrap=false) { _wrap_string(col, row, string, read_byte_ram, wordwrap); } #endif typedef void (*screenFunc_t)(); From 8eb5950ebd51faf00fff438ef0b5557a55fd8d02 Mon Sep 17 00:00:00 2001 From: Speaka <48431623+Speaka@users.noreply.github.com> Date: Wed, 11 Nov 2020 02:41:21 +0100 Subject: [PATCH 0549/1370] Tramming Wizard wait position (#20063) --- Marlin/Configuration_adv.h | 1 + Marlin/src/lcd/menu/menu_tramming.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index cd8a055ffb..ba56862d5d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -811,6 +811,7 @@ //#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item to run G35 Assisted Tramming (MarlinUI) //#define ASSISTED_TRAMMING_WIZARD // Make the menu item open a Tramming Wizard sub-menu + //#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment /** * Screw thread: diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index 317335d51b..c9043a118b 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -50,6 +50,14 @@ bool probe_single_point() { const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[tram_index], PROBE_PT_RAISE, 0, true); DEBUG_ECHOLNPAIR("probe_single_point: ", z_probed_height, "mm"); z_measured[tram_index] = z_probed_height; + + #ifdef ASSISTED_TRAMMING_WAIT_POSITION + // Move XY to safe position + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Moving away"); + const xyz_pos_t wait_pos = ASSISTED_TRAMMING_WAIT_POSITION; + do_blocking_move_to(wait_pos, XY_PROBE_FEEDRATE_MM_S); + #endif + return !isnan(z_probed_height); } From 42b37da1e77b1776f07a55745605e7d920739bcf Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 11 Nov 2020 15:06:42 +1300 Subject: [PATCH 0550/1370] BTT driver expansion for SKR 1.3/1.4 (#20088) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 172 ++++++++++-------- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 51 ++++++ Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 6 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 2 +- Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 2 +- 7 files changed, 157 insertions(+), 80 deletions(-) diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 999cec29ba..559bc5b222 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -649,7 +649,7 @@ void menu_item(const uint8_t row, bool sel ) { menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); #if ENABLED(TOUCH_SCREEN) const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? CLICK : MENU_ITEM; - touch.add_control(tct, 0, 2 + 34 * row, 320, 32, encoderTopLine + row); + touch.add_control(tct, 0, 2 + 34 * row, TFT_WIDTH, 32, encoderTopLine + row); #endif } diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 14bac7d723..bb2cacd5ba 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -208,31 +208,57 @@ #define E1_SERIAL_TX_PIN P1_01 #define E1_SERIAL_RX_PIN P1_01 - #define Z2_SERIAL_TX_PIN P1_01 - #define Z2_SERIAL_RX_PIN P1_01 - // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 #endif +/* _____ _____ + * NC | 1 2 | GND 5V | 1 2 | GND + * RESET | 3 4 | 1.31 1.23 | 3 4 | 1.22 + * 0.18 | 5 6 3.25 1.21 | 5 6 1.20 + * 0.16 | 7 8 | 3.26 1.19 | 7 8 | 1.18 + * 0.15 | 9 10| 0.17 0.28 | 9 10| 1.30 + * ----- ----- + * EXP2 EXP1 + */ + +#define EXPA1_03_PIN P1_23 +#define EXPA1_04_PIN P1_22 +#define EXPA1_05_PIN P1_21 +#define EXPA1_06_PIN P1_20 +#define EXPA1_07_PIN P1_19 +#define EXPA1_08_PIN P1_18 +#define EXPA1_09_PIN P0_28 +#define EXPA1_10_PIN P1_30 + +#define EXPA2_03_PIN -1 +#define EXPA2_04_PIN P1_31 +#define EXPA2_05_PIN P0_18 +#define EXPA2_06_PIN P3_25 +#define EXPA2_07_PIN P0_16 +#define EXPA2_08_PIN P3_26 +#define EXPA2_09_PIN P0_15 +#define EXPA2_10_PIN P0_17 + // // SD Connection // #if SD_CONNECTION_IS(LCD) - #define SS_PIN P0_16 + #define SS_PIN EXPA2_07_PIN #endif /** * _____ _____ * NC | · · | GND 5V | · · | GND * RESET | · · | 1.31 (SD_DETECT) (LCD_D7) 1.23 | · · | 1.22 (LCD_D6) - * (MOSI) 0.18 | · · | 3.25 (BTN_EN2) (LCD_D5) 1.21 | · · | 1.20 (LCD_D4) + * (MOSI) 0.18 | · · 3.25 (BTN_EN2) (LCD_D5) 1.21 | · · 1.20 (LCD_D4) * (SD_SS) 0.16 | · · | 3.26 (BTN_EN1) (LCD_RS) 1.19 | · · | 1.18 (LCD_EN) * (SCK) 0.15 | · · | 0.17 (MISO) (BTN_ENC) 0.28 | · · | 1.30 (BEEPER) * ----- ----- * EXP2 EXP1 */ -#if HAS_WIRED_LCD + +#if HAS_WIRED_LCD && !HAS_BTT_EXP_MOT #if ENABLED(ANET_FULL_GRAPHICS_LCD_ALT_WIRING) #error "ANET_FULL_GRAPHICS_LCD_ALT_WIRING only applies to the ANET 1.0 board." @@ -249,35 +275,35 @@ * * The ANET_FULL_GRAPHICS_LCD connector plug: * - * BEFORE AFTER - * _____ _____ - * GND 1 | 1 2 | 2 5V 5V 1 | 1 2 | 2 GND - * CS 3 | 3 4 | 4 BTN_EN2 CS 3 | 3 4 | 4 BTN_EN2 - * SID 5 | 5 6 6 BTN_EN1 SID 5 | 5 6 6 BTN_EN1 - * open 7 | 7 8 | 8 BTN_ENC CLK 7 | 7 8 | 8 BTN_ENC - * CLK 9 | 9 10| 10 Beeper open 9 | 9 10| 10 Beeper - * ----- ----- - * LCD LCD + * BEFORE AFTER + * _____ _____ + * GND | 1 2 | 5V 5V | 1 2 | GND + * CS | 3 4 | BTN_EN2 CS | 3 4 | BTN_EN2 + * SID | 5 6 BTN_EN1 SID | 5 6 BTN_EN1 + * open | 7 8 | BTN_ENC CLK | 7 8 | BTN_ENC + * CLK | 9 10| Beeper open | 9 10| Beeper + * ----- ----- + * LCD LCD */ - #define LCD_PINS_RS P1_23 + #define LCD_PINS_RS EXPA1_03_PIN - #define BTN_EN1 P1_20 - #define BTN_EN2 P1_22 - #define BTN_ENC P1_18 + #define BTN_EN1 EXPA1_06_PIN + #define BTN_EN2 EXPA1_04_PIN + #define BTN_ENC EXPA1_08_PIN - #define LCD_PINS_ENABLE P1_21 - #define LCD_PINS_D4 P1_19 + #define LCD_PINS_ENABLE EXPA1_05_PIN + #define LCD_PINS_D4 EXPA1_07_PIN #elif ENABLED(CR10_STOCKDISPLAY) - #define BTN_ENC P0_28 // (58) open-drain - #define LCD_PINS_RS P1_22 + #define BTN_ENC EXPA1_09_PIN // (58) open-drain + #define LCD_PINS_RS EXPA1_04_PIN - #define BTN_EN1 P1_18 - #define BTN_EN2 P1_20 + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN - #define LCD_PINS_ENABLE P1_23 - #define LCD_PINS_D4 P1_21 + #define LCD_PINS_ENABLE EXPA1_03_PIN + #define LCD_PINS_D4 EXPA1_05_PIN #elif ENABLED(ENDER2_STOCKDISPLAY) @@ -285,43 +311,43 @@ * _____ * 5V | 1 2 | GND * (MOSI) 1.23 | 3 4 | 1.22 (LCD_RS) - * (LCD_A0) 1.21 | 5 6 | 1.20 (BTN_EN2) + * (LCD_A0) 1.21 | 5 6 1.20 (BTN_EN2) * RESET 1.19 | 7 8 | 1.18 (BTN_EN1) * (BTN_ENC) 0.28 | 9 10| 1.30 (SCK) * ----- * EXP1 */ - #define BTN_EN1 P1_18 - #define BTN_EN2 P1_20 - #define BTN_ENC P0_28 + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN + #define BTN_ENC EXPA1_09_PIN - #define DOGLCD_CS P1_22 - #define DOGLCD_A0 P1_21 - #define DOGLCD_SCK P1_30 - #define DOGLCD_MOSI P1_23 + #define DOGLCD_CS EXPA1_04_PIN + #define DOGLCD_A0 EXPA1_05_PIN + #define DOGLCD_SCK EXPA1_10_PIN + #define DOGLCD_MOSI EXPA1_03_PIN #define FORCE_SOFT_SPI #define LCD_BACKLIGHT_PIN -1 #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI - #define TFT_CS_PIN P1_22 - #define TFT_A0_PIN P1_23 - #define TFT_DC_PIN P1_23 - #define TFT_MISO_PIN P0_17 - #define TFT_BACKLIGHT_PIN P1_18 - #define TFT_RESET_PIN P1_19 + #define TFT_CS_PIN EXPA1_04_PIN + #define TFT_A0_PIN EXPA1_03_PIN + #define TFT_DC_PIN EXPA1_03_PIN + #define TFT_MISO_PIN EXPA2_10_PIN + #define TFT_BACKLIGHT_PIN EXPA1_08_PIN + #define TFT_RESET_PIN EXPA1_07_PIN #define LCD_USE_DMA_SPI - #define TOUCH_INT_PIN P1_21 - #define TOUCH_CS_PIN P1_20 + #define TOUCH_INT_PIN EXPA1_05_PIN + #define TOUCH_CS_PIN EXPA1_06_PIN #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 // SPI 1 - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 + #define SCK_PIN EXPA2_09_PIN + #define MISO_PIN EXPA2_10_PIN + #define MOSI_PIN EXPA2_05_PIN // Disable any LCD related PINs config #define LCD_PINS_ENABLE -1 @@ -361,72 +387,72 @@ #elif IS_TFTGLCD_PANEL #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_26 + #define TFTGLCD_CS EXPA2_08_PIN #endif - #define SD_DETECT_PIN P1_31 + #define SD_DETECT_PIN EXPA2_04_PIN #else - #define BTN_ENC P0_28 // (58) open-drain - #define LCD_PINS_RS P1_19 + #define BTN_ENC EXPA1_09_PIN // (58) open-drain + #define LCD_PINS_RS EXPA1_07_PIN - #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 - #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + #define BTN_EN1 EXPA2_08_PIN // (31) J3-2 & AUX-4 + #define BTN_EN2 EXPA2_06_PIN // (33) J3-4 & AUX-4 - #define LCD_PINS_ENABLE P1_18 - #define LCD_PINS_D4 P1_20 + #define LCD_PINS_ENABLE EXPA1_08_PIN + #define LCD_PINS_D4 EXPA1_06_PIN - #define LCD_SDSS P0_16 // (16) J3-7 & AUX-4 + #define LCD_SDSS EXPA2_07_PIN // (16) J3-7 & AUX-4 #if SD_CONNECTION_IS(LCD) - #define SD_DETECT_PIN P1_31 // (49) (NOT 5V tolerant) + #define SD_DETECT_PIN EXPA2_04_PIN // (49) (NOT 5V tolerant) #endif #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS P1_18 - #define DOGLCD_A0 P1_19 - #define DOGLCD_SCK P0_15 - #define DOGLCD_MOSI P0_18 + #define DOGLCD_CS EXPA1_08_PIN + #define DOGLCD_A0 EXPA1_07_PIN + #define DOGLCD_SCK EXPA2_09_PIN + #define DOGLCD_MOSI EXPA2_05_PIN #define LCD_BACKLIGHT_PIN -1 #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems // results in LCD soft SPI mode 3, SD soft SPI mode 0 - #define LCD_RESET_PIN P1_20 // Must be high or open for LCD to operate normally. + #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN P1_21 + #define RGB_LED_R_PIN EXPA1_05_PIN #endif #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN P1_22 + #define RGB_LED_G_PIN EXPA1_04_PIN #endif #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN P1_23 + #define RGB_LED_B_PIN EXPA1_03_PIN #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN P1_21 + #define NEOPIXEL_PIN EXPA1_05_PIN #endif #else // !FYSETC_MINI_12864 #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS P1_21 - #define DOGLCD_A0 P1_22 - #define DOGLCD_SCK P0_15 - #define DOGLCD_MOSI P0_18 + #define DOGLCD_CS EXPA1_05_PIN + #define DOGLCD_A0 EXPA1_04_PIN + #define DOGLCD_SCK EXPA2_09_PIN + #define DOGLCD_MOSI EXPA2_05_PIN #define FORCE_SOFT_SPI #endif #if IS_ULTIPANEL - #define LCD_PINS_D5 P1_21 - #define LCD_PINS_D6 P1_22 - #define LCD_PINS_D7 P1_23 + #define LCD_PINS_D5 EXPA1_05_PIN + #define LCD_PINS_D6 EXPA1_04_PIN + #define LCD_PINS_D7 EXPA1_03_PIN #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #define BTN_ENC_EN EXPA1_03_PIN // Detect the presence of the encoder #endif #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 820c35a01c..e6cfc0afaf 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -29,6 +29,14 @@ #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif +// If you have the Big tree tech driver expantion module, enable HAS_BTT_EXP_MOT +// https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT +//#define HAS_BTT_EXP_MOT 1 + +#if BOTH(HAS_WIRED_LCD,HAS_BTT_EXP_MOT) + #ERROR "Having a LCD on EXP1/EXP2 and a expanion motor module on EXP1/EXP2 is not possable." +#endif + // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 @@ -115,3 +123,46 @@ #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." #endif + +#if HAS_BTT_EXP_MOT +/* _____ _____ + * NC | · · | GND NC | · · | GND + * NC | · · | 1.31 (M1EN) (M2EN) 1.23 | · · | 1.22 (M3EN) + * (M1STP) 0.18 | · · 3.25 (M1DIR) (M1RX) 1.21 | · · 1.20 (M1DIAG) + * (M2DIR) 0.16 | · · | 3.26 (M2STP) (M2RX) 1.19 | · · | 1.18 (M2DIAG) + * (M3DIR) 0.15 | · · | 0.17 (M3STP) (M3RX) 0.28 | · · | 1.30 (M3DIAG) + * ----- ----- + * EXP2 EXP1 + */ + + // M1 on Driver Expansion Module + #define E2_STEP_PIN EXPA2_05_PIN + #define E2_DIR_PIN EXPA2_06_PIN + #define E2_ENABLE_PIN EXPA2_04_PIN + #define E2_DIAG_PIN EXPA1_06_PIN + #define E2_CS_PIN EXPA1_05_PIN + #if HAS_TMC_UART + #define E2_SERIAL_TX_PIN EXPA1_05_PIN + #define E2_SERIAL_RX_PIN EXPA1_05_PIN + #endif + // M2 on Driver Expansion Module + #define E3_STEP_PIN EXPA2_08_PIN + #define E3_DIR_PIN EXPA2_07_PIN + #define E3_ENABLE_PIN EXPA1_03_PIN + #define E3_DIAG_PIN EXPA1_08_PIN + #define E3_CS_PIN EXPA1_07_PIN + #if HAS_TMC_UART + #define E3_SERIAL_TX_PIN EXPA1_07_PIN + #define E3_SERIAL_RX_PIN EXPA1_07_PIN + #endif + // M3 on Driver Expansion Module + #define E4_STEP_PIN EXPA2_10_PIN + #define E4_DIR_PIN EXPA2_09_PIN + #define E4_ENABLE_PIN EXPA1_04_PIN + #define E4_DIAG_PIN EXPA1_10_PIN + #define E4_CS_PIN EXPA1_09_PIN + #if HAS_TMC_UART + #define E4_SERIAL_TX_PIN EXPA1_09_PIN + #define E4_SERIAL_RX_PIN EXPA1_09_PIN + #endif +#endif // HAS_BTT_EXP_MOT diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index f948c32f92..b0d1ec1f03 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -229,7 +229,7 @@ * _____ _____ * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) - * (LCD_D4) 0.15 | · · | 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · | 0.9 (SD_MOSI) + * (LCD_D4) 0.15 | · · 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · 0.9 (SD_MOSI) * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST * GND | · · | 5V GND | · · | NC * ----- ----- diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 0719752399..dcf0741a76 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -249,9 +249,9 @@ /** * _____ _____ - * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) - * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) - * (LCD_D4) 0.15 | · · | 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · | 0.9 (SD_MOSI) + * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) + * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) + * (LCD_D4) 0.15 | · · 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · 0.9 (SD_MOSI) * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST * GND | · · | 5V GND | · · | NC * ----- ----- diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index a0174f2602..c11cd9e9da 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -155,7 +155,7 @@ * _____ * 5V | · · | GND * (LCD_EN) P0_18 | · · | P0_16 (LCD_RS) - * (LCD_D4) P0_15 | · · | P3_25 (BTN_EN2) + * (LCD_D4) P0_15 | · · P3_25 (BTN_EN2) * (RESET) P2_11 | · · | P3_26 (BTN_EN1) * (BTN_ENC) P1_30 | · · | P1_31 (BEEPER) * ----- diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index 80eb3f1534..66714240e7 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -201,7 +201,7 @@ * ----- ----- * 5V/D41 | · · | GND 5V | · · | GND * RESET | · · | D49 (SD_DETECT) (LCD_D7) D29 | · · | D27 (LCD_D6) - * (MOSI) D51 | · · | D33 (BTN_EN2) (LCD_D5) D25 | · · | D23 (LCD_D4) + * (MOSI) D51 | · · D33 (BTN_EN2) (LCD_D5) D25 | · · D23 (LCD_D4) * (SD_SS) D53 | · · | D31 (BTN_EN1) (LCD_RS) D16 | · · | D17 (LCD_EN) * (SCK) D52 | · · | D50 (MISO) (BTN_ENC) D35 | · · | D37 (BEEPER) * ----- ----- From 45b242d5f78a7f19d0462f359c703ac4eb06be5c Mon Sep 17 00:00:00 2001 From: Costas Basdekis Date: Wed, 11 Nov 2020 02:13:29 +0000 Subject: [PATCH 0551/1370] Fix Linux GPIO logging (#20093) Co-authored-by: Scott Lahteine --- .gitignore | 3 +++ Marlin/src/HAL/LINUX/main.cpp | 23 +++++++++++------------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 1ac1abbe15..4e4412f5e7 100755 --- a/.gitignore +++ b/.gitignore @@ -183,3 +183,6 @@ cmake-build-* #Python __pycache__ + +#IOLogger logs +*_log.csv diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp index 481f059030..eadc409324 100644 --- a/Marlin/src/HAL/LINUX/main.cpp +++ b/Marlin/src/HAL/LINUX/main.cpp @@ -19,22 +19,23 @@ */ #ifdef __PLAT_LINUX__ -extern void setup(); -extern void loop(); - -#include - -#include -#include +//#define GPIO_LOGGING // Full GPIO and Positional Logging #include "../../inc/MarlinConfig.h" -#include -#include #include "../shared/Delay.h" #include "hardware/IOLoggerCSV.h" #include "hardware/Heater.h" #include "hardware/LinearAxis.h" +#include +#include +#include +#include +#include + +extern void setup(); +extern void loop(); + // simple stdout / stdin implementation for fake serial port void write_serial_thread() { for (;;) { @@ -64,8 +65,6 @@ void simulation_loop() { LinearAxis z_axis(Z_ENABLE_PIN, Z_DIR_PIN, Z_STEP_PIN, Z_MIN_PIN, Z_MAX_PIN); LinearAxis extruder0(E0_ENABLE_PIN, E0_DIR_PIN, E0_STEP_PIN, P_NC, P_NC); - //#define GPIO_LOGGING // Full GPIO and Positional Logging - #ifdef GPIO_LOGGING IOLoggerCSV logger("all_gpio_log.csv"); Gpio::attachLogger(&logger); @@ -88,7 +87,7 @@ void simulation_loop() { #ifdef GPIO_LOGGING if (x_axis.position != x || y_axis.position != y || z_axis.position != z) { - uint64_t update = MAX3(x_axis.last_update, y_axis.last_update, z_axis.last_update); + uint64_t update = _MAX(x_axis.last_update, y_axis.last_update, z_axis.last_update); position_log << update << ", " << x_axis.position << ", " << y_axis.position << ", " << z_axis.position << std::endl; position_log.flush(); x = x_axis.position; From dc144fb9101969b56c5a149193fc22ad29b34f00 Mon Sep 17 00:00:00 2001 From: Costas Basdekis Date: Wed, 11 Nov 2020 06:39:23 +0000 Subject: [PATCH 0552/1370] Distinct runout states (#19965) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 22 +++++- Marlin/src/HAL/DUE/fastio.h | 3 + Marlin/src/HAL/ESP32/fastio.h | 3 + Marlin/src/feature/mmu2/mmu2.cpp | 2 +- Marlin/src/feature/runout.h | 67 ++++++++++++++----- Marlin/src/gcode/feature/pause/M600.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 67 +++++++++++++++++++ Marlin/src/inc/SanityCheck.h | 30 ++++----- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 4 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 6 +- .../screens/endstop_state_screen.cpp | 4 +- Marlin/src/module/endstops.cpp | 7 +- buildroot/tests/BIGTREE_GTR_V1_0-tests | 15 ++++- buildroot/tests/mega2560-tests | 15 +++++ 14 files changed, 202 insertions(+), 45 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ea77b4e429..0036f40c4a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1186,9 +1186,27 @@ #if ENABLED(FILAMENT_RUNOUT_SENSOR) #define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500. #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. - #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. - //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FIL_RUNOUT_PULL // Use internal pullup / pulldown for filament runout pins. + + // Override individually if the runout sensors vary + //#define FIL_RUNOUT1_STATE LOW + //#define FIL_RUNOUT1_PULL + //#define FIL_RUNOUT2_STATE LOW + //#define FIL_RUNOUT2_PULL + //#define FIL_RUNOUT3_STATE LOW + //#define FIL_RUNOUT3_PULL + //#define FIL_RUNOUT4_STATE LOW + //#define FIL_RUNOUT4_PULL + //#define FIL_RUNOUT5_STATE LOW + //#define FIL_RUNOUT5_PULL + //#define FIL_RUNOUT6_STATE LOW + //#define FIL_RUNOUT6_PULL + //#define FIL_RUNOUT7_STATE LOW + //#define FIL_RUNOUT7_PULL + //#define FIL_RUNOUT8_STATE LOW + //#define FIL_RUNOUT8_PULL // Set one or more commands to execute on filament runout. // (After 'M412 H' Marlin will ask the host to handle the process.) diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h index 119d0005af..5fb8b4d015 100644 --- a/Marlin/src/HAL/DUE/fastio.h +++ b/Marlin/src/HAL/DUE/fastio.h @@ -163,6 +163,9 @@ #define SET_INPUT(IO) _SET_INPUT(IO) // Set pin as input with pullup (wrapper) #define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +// Set pin as input with pulldown (substitution) +#define SET_INPUT_PULLDOWN SET_INPUT + // Set pin as output (wrapper) - reads the pin and sets the output to that value #define SET_OUTPUT(IO) _SET_OUTPUT(IO) // Set pin as PWM diff --git a/Marlin/src/HAL/ESP32/fastio.h b/Marlin/src/HAL/ESP32/fastio.h index 2ded3a5f62..8db89dca12 100644 --- a/Marlin/src/HAL/ESP32/fastio.h +++ b/Marlin/src/HAL/ESP32/fastio.h @@ -52,6 +52,9 @@ // Set pin as input with pullup wrapper #define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +// Set pin as input with pulldown (substitution) +#define SET_INPUT_PULLDOWN SET_INPUT + // Set pin as output wrapper #define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0) diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index c5cf485850..d76476e719 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -163,7 +163,7 @@ uint8_t MMU2::get_current_tool() { } #if EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) - #define FILAMENT_PRESENT() (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE) + #define FILAMENT_PRESENT() (READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE) #endif void MMU2::mmu_loop() { diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index a5abf057d1..aa1ccc9cc5 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -149,18 +149,34 @@ class FilamentSensorBase { public: static inline void setup() { - #if ENABLED(FIL_RUNOUT_PULLUP) - #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT_PULLDOWN) - #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT_PIN(P) SET_INPUT(P) + #define _INIT_RUNOUT_PIN(P,S,U) do{ if (DISABLED(U)) SET_INPUT(P); else if (S) SET_INPUT_PULLDOWN(P); else SET_INPUT_PULLUP(P); }while(0) + #define INIT_RUNOUT_PIN(N) _INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN, FIL_RUNOUT##N##_STATE, FIL_RUNOUT##N##_PULL) + #if NUM_RUNOUT_SENSORS >= 1 + INIT_RUNOUT_PIN(1); #endif - - #define _INIT_RUNOUT(N) INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN); - REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _INIT_RUNOUT) - #undef _INIT_RUNOUT - #undef INIT_RUNOUT_PIN + #if NUM_RUNOUT_SENSORS >= 2 + INIT_RUNOUT_PIN(2); + #endif + #if NUM_RUNOUT_SENSORS >= 3 + INIT_RUNOUT_PIN(3); + #endif + #if NUM_RUNOUT_SENSORS >= 4 + INIT_RUNOUT_PIN(4); + #endif + #if NUM_RUNOUT_SENSORS >= 5 + INIT_RUNOUT_PIN(5); + #endif + #if NUM_RUNOUT_SENSORS >= 6 + INIT_RUNOUT_PIN(6); + #endif + #if NUM_RUNOUT_SENSORS >= 7 + INIT_RUNOUT_PIN(7); + #endif + #if NUM_RUNOUT_SENSORS >= 8 + INIT_RUNOUT_PIN(8); + #endif + #undef _INIT_RUNOUT_PIN + #undef INIT_RUNOUT_PIN } // Return a bitmask of runout pin states @@ -172,11 +188,32 @@ class FilamentSensorBase { // Return a bitmask of runout flag states (1 bits always indicates runout) static inline uint8_t poll_runout_states() { - return poll_runout_pins() - #if FIL_RUNOUT_STATE == LOW - ^ uint8_t(_BV(NUM_RUNOUT_SENSORS) - 1) + return poll_runout_pins() ^ uint8_t(0 + #if NUM_RUNOUT_SENSORS >= 1 + | (FIL_RUNOUT1_STATE ? 0 : _BV(1 - 1)) #endif - ; + #if NUM_RUNOUT_SENSORS >= 2 + | (FIL_RUNOUT2_STATE ? 0 : _BV(2 - 1)) + #endif + #if NUM_RUNOUT_SENSORS >= 3 + | (FIL_RUNOUT3_STATE ? 0 : _BV(3 - 1)) + #endif + #if NUM_RUNOUT_SENSORS >= 4 + | (FIL_RUNOUT4_STATE ? 0 : _BV(4 - 1)) + #endif + #if NUM_RUNOUT_SENSORS >= 5 + | (FIL_RUNOUT5_STATE ? 0 : _BV(5 - 1)) + #endif + #if NUM_RUNOUT_SENSORS >= 6 + | (FIL_RUNOUT6_STATE ? 0 : _BV(6 - 1)) + #endif + #if NUM_RUNOUT_SENSORS >= 7 + | (FIL_RUNOUT7_STATE ? 0 : _BV(7 - 1)) + #endif + #if NUM_RUNOUT_SENSORS >= 8 + | (FIL_RUNOUT8_STATE ? 0 : _BV(8 - 1)) + #endif + ); } }; diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 0af68333ca..e676ed38a4 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -88,7 +88,7 @@ void GcodeSuite::M600() { // In this case, for duplicating modes set DXC_ext to the extruder that ran out. #if HAS_FILAMENT_SENSOR && NUM_RUNOUT_SENSORS > 1 if (idex_is_duplicating()) - DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_STATE) ? 1 : 0; + DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT2_STATE) ? 1 : 0; #else DXC_ext = active_extruder; #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 98aa4afb8c..865365c0ee 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -675,6 +675,73 @@ #define HAS_BED_PROBE 1 #endif +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #if NUM_RUNOUT_SENSORS >= 1 + #ifndef FIL_RUNOUT1_STATE + #define FIL_RUNOUT1_STATE FIL_RUNOUT_STATE + #endif + #ifndef FIL_RUNOUT1_PULL + #define FIL_RUNOUT1_PULL FIL_RUNOUT_PULL + #endif + #endif + #if NUM_RUNOUT_SENSORS >= 2 + #ifndef FIL_RUNOUT2_STATE + #define FIL_RUNOUT2_STATE FIL_RUNOUT_STATE + #endif + #ifndef FIL_RUNOUT2_PULL + #define FIL_RUNOUT2_PULL FIL_RUNOUT_PULL + #endif + #endif + #if NUM_RUNOUT_SENSORS >= 3 + #ifndef FIL_RUNOUT3_STATE + #define FIL_RUNOUT3_STATE FIL_RUNOUT_STATE + #endif + #ifndef FIL_RUNOUT3_PULL + #define FIL_RUNOUT3_PULL FIL_RUNOUT_PULL + #endif + #endif + #if NUM_RUNOUT_SENSORS >= 4 + #ifndef FIL_RUNOUT4_STATE + #define FIL_RUNOUT4_STATE FIL_RUNOUT_STATE + #endif + #ifndef FIL_RUNOUT4_PULL + #define FIL_RUNOUT4_PULL FIL_RUNOUT_PULL + #endif + #endif + #if NUM_RUNOUT_SENSORS >= 5 + #ifndef FIL_RUNOUT5_STATE + #define FIL_RUNOUT5_STATE FIL_RUNOUT_STATE + #endif + #ifndef FIL_RUNOUT5_PULL + #define FIL_RUNOUT5_PULL FIL_RUNOUT_PULL + #endif + #endif + #if NUM_RUNOUT_SENSORS >= 6 + #ifndef FIL_RUNOUT6_STATE + #define FIL_RUNOUT6_STATE FIL_RUNOUT_STATE + #endif + #ifndef FIL_RUNOUT6_PULL + #define FIL_RUNOUT6_PULL FIL_RUNOUT_PULL + #endif + #endif + #if NUM_RUNOUT_SENSORS >= 7 + #ifndef FIL_RUNOUT7_STATE + #define FIL_RUNOUT7_STATE FIL_RUNOUT_STATE + #endif + #ifndef FIL_RUNOUT7_PULL + #define FIL_RUNOUT7_PULL FIL_RUNOUT_PULL + #endif + #endif + #if NUM_RUNOUT_SENSORS >= 8 + #ifndef FIL_RUNOUT8_STATE + #define FIL_RUNOUT8_STATE FIL_RUNOUT_STATE + #endif + #ifndef FIL_RUNOUT8_PULL + #define FIL_RUNOUT8_PULL FIL_RUNOUT_PULL + #endif + #endif +#endif // FILAMENT_RUNOUT_SENSOR + #if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) #undef PROBE_MANUALLY #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 3762d40c53..e2a79cd5ea 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -111,7 +111,7 @@ #elif defined(FILAMENT_SENSOR) #error "FILAMENT_SENSOR is now FILAMENT_WIDTH_SENSOR. Please update your configuration." #elif defined(ENDSTOPPULLUP_FIL_RUNOUT) - #error "ENDSTOPPULLUP_FIL_RUNOUT is now FIL_RUNOUT_PULLUP. Please update your configuration." + #error "ENDSTOPPULLUP_FIL_RUNOUT is now FIL_RUNOUT_PULL. Please update your configuration." #elif defined(DISABLE_MAX_ENDSTOPS) || defined(DISABLE_MIN_ENDSTOPS) #error "DISABLE_MAX_ENDSTOPS and DISABLE_MIN_ENDSTOPS deprecated. Use individual USE_*_PLUG options instead." #elif defined(LANGUAGE_INCLUDE) @@ -660,8 +660,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if BOTH(ENDSTOPPULLUPS, ENDSTOPPULLDOWNS) #error "Enable only one of ENDSTOPPULLUPS or ENDSTOPPULLDOWNS." -#elif BOTH(FIL_RUNOUT_PULLUP, FIL_RUNOUT_PULLDOWN) - #error "Enable only one of FIL_RUNOUT_PULLUP or FIL_RUNOUT_PULLDOWN." #elif BOTH(ENDSTOPPULLUP_XMAX, ENDSTOPPULLDOWN_XMAX) #error "Enable only one of ENDSTOPPULLUP_X_MAX or ENDSTOPPULLDOWN_X_MAX." #elif BOTH(ENDSTOPPULLUP_YMAX, ENDSTOPPULLDOWN_YMAX) @@ -814,18 +812,20 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "FILAMENT_RUNOUT_SENSOR requires FIL_RUNOUT_PIN." #elif NUM_RUNOUT_SENSORS > E_STEPPERS #error "NUM_RUNOUT_SENSORS cannot exceed the number of E steppers." - #elif NUM_RUNOUT_SENSORS > 1 && !PIN_EXISTS(FIL_RUNOUT2) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 1 requires FIL_RUNOUT2_PIN." - #elif NUM_RUNOUT_SENSORS > 2 && !PIN_EXISTS(FIL_RUNOUT3) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 2 requires FIL_RUNOUT3_PIN." - #elif NUM_RUNOUT_SENSORS > 3 && !PIN_EXISTS(FIL_RUNOUT4) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 3 requires FIL_RUNOUT4_PIN." - #elif NUM_RUNOUT_SENSORS > 4 && !PIN_EXISTS(FIL_RUNOUT5) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 4 requires FIL_RUNOUT5_PIN." - #elif NUM_RUNOUT_SENSORS > 5 && !PIN_EXISTS(FIL_RUNOUT6) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 5 requires FIL_RUNOUT6_PIN." - #elif NONE(SDSUPPORT, PRINTJOB_TIMER_AUTOSTART) - #error "FILAMENT_RUNOUT_SENSOR requires SDSUPPORT or PRINTJOB_TIMER_AUTOSTART." + #elif NUM_RUNOUT_SENSORS >= 2 && !PIN_EXISTS(FIL_RUNOUT2) + #error "FIL_RUNOUT2_PIN is required with NUM_RUNOUT_SENSORS >= 2." + #elif NUM_RUNOUT_SENSORS >= 3 && !PIN_EXISTS(FIL_RUNOUT3) + #error "FIL_RUNOUT3_PIN is required with NUM_RUNOUT_SENSORS >= 3." + #elif NUM_RUNOUT_SENSORS >= 4 && !PIN_EXISTS(FIL_RUNOUT4) + #error "FIL_RUNOUT4_PIN is required with NUM_RUNOUT_SENSORS >= 4." + #elif NUM_RUNOUT_SENSORS >= 5 && !PIN_EXISTS(FIL_RUNOUT5) + #error "FIL_RUNOUT5_PIN is required with NUM_RUNOUT_SENSORS >= 5." + #elif NUM_RUNOUT_SENSORS >= 6 && !PIN_EXISTS(FIL_RUNOUT6) + #error "FIL_RUNOUT6_PIN is required with NUM_RUNOUT_SENSORS >= 6." + #elif NUM_RUNOUT_SENSORS >= 7 && !PIN_EXISTS(FIL_RUNOUT7) + #error "FIL_RUNOUT7_PIN is required with NUM_RUNOUT_SENSORS >= 7." + #elif NUM_RUNOUT_SENSORS >= 8 && !PIN_EXISTS(FIL_RUNOUT8) + #error "FIL_RUNOUT8_PIN is required with NUM_RUNOUT_SENSORS >= 8." #elif FILAMENT_RUNOUT_DISTANCE_MM < 0 #error "FILAMENT_RUNOUT_DISTANCE_MM must be greater than or equal to zero." #elif DISABLED(ADVANCED_PAUSE_FEATURE) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index a1d1217d6e..4725afb8bc 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -76,8 +76,8 @@ namespace Anycubic { #endif // Filament runout is handled by Marlin settings in Configuration.h - // set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. - // enable FIL_RUNOUT_PULLUP + // opt_set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. + // opt_enable FIL_RUNOUT_PULL TFTSer.begin(115200); diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 2aaa0d0e33..6d15d937b9 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -87,7 +87,7 @@ void AnycubicTFTClass::OnSetup() { SET_INPUT_PULLUP(SD_DETECT_PIN); #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) - SET_INPUT_PULLUP(FIL_RUNOUT_PIN); + SET_INPUT_PULLUP(FIL_RUNOUT1_PIN); #endif mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; @@ -935,7 +935,7 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { #if ENABLED(FILAMENT_RUNOUT_SENSOR) // NOTE: ExtUI::getFilamentRunoutState() only returns the runout state if the job is printing // we want to actually check the status of the pin here, regardless of printstate - if (READ(FIL_RUNOUT_PIN)) { + if (READ(FIL_RUNOUT1_PIN)) { if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) { // play tone to indicate filament is out ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); @@ -983,7 +983,7 @@ void AnycubicTFTClass::PausePrint() { void AnycubicTFTClass::ResumePrint() { #if ENABLED(SDSUPPORT) #if ENABLED(FILAMENT_RUNOUT_SENSOR) - if (READ(FIL_RUNOUT_PIN)) { + if (READ(FIL_RUNOUT1_PIN)) { #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp index 41f72e8e53..09561edc02 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -92,12 +92,12 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { PIN_DISABLED(5, 3, PSTR(STR_Z_MIN), Z_MIN) #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT) - PIN_ENABLED (1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT, FIL_RUNOUT_STATE) + PIN_ENABLED (1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT, FIL_RUNOUT1_STATE) #else PIN_DISABLED(1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT) #endif #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) - PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT_STATE) + PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT2_STATE) #else PIN_DISABLED(3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2) #endif diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 825194cf45..697ced7833 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -459,18 +459,19 @@ void _O2 Endstops::report_states() { #endif #if HAS_FILAMENT_SENSOR #if NUM_RUNOUT_SENSORS == 1 - print_es_state(READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); + print_es_state(READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); #else - #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; break; + #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; state = FIL_RUNOUT##N##_STATE; break; LOOP_S_LE_N(i, 1, NUM_RUNOUT_SENSORS) { pin_t pin; + uint8_t state; switch (i) { default: continue; REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _CASE_RUNOUT) } SERIAL_ECHOPGM(STR_FILAMENT_RUNOUT_SENSOR); if (i > 1) SERIAL_CHAR(' ', '0' + i); - print_es_state(extDigitalRead(pin) != FIL_RUNOUT_STATE); + print_es_state(extDigitalRead(pin) != state); } #undef _CASE_RUNOUT #endif diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests index e8d47562aa..1db0bcffd2 100644 --- a/buildroot/tests/BIGTREE_GTR_V1_0-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0-tests @@ -24,7 +24,20 @@ opt_set E2_AUTO_FAN_PIN PC12 opt_set X_DRIVER_TYPE TMC2208 opt_set Y_DRIVER_TYPE TMC2130 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan and Mixed TMC Drivers" +opt_enable FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE +opt_set FIL_RUNOUT_PIN 3 +opt_set FIL_RUNOUT2_PIN 4 +opt_set FIL_RUNOUT3_PIN 5 +opt_set FIL_RUNOUT4_PIN 6 +opt_set FIL_RUNOUT5_PIN 7 +opt_set FIL_RUNOUT6_PIN 8 +opt_set FIL_RUNOUT7_PIN 9 +opt_set FIL_RUNOUT8_PIN 10 +opt_set FIL_RUNOUT4_STATE HIGH +opt_enable FIL_RUNOUT4_PULL +opt_set FIL_RUNOUT8_STATE HIGH +opt_enable FIL_RUNOUT8_PULL +exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" restore_configs opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index a6902b9d14..9ae43dcdb5 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -75,6 +75,21 @@ opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2 | Servo | 3-Point + Debug | G38 ..." +# +# 5 runout sensors with distinct states +# +restore_configs +opt_set EXTRUDERS 5 +opt_set NUM_SERVOS 1 +opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ + AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ + NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ + PRUSA_MMU2 MMU2_MENUS PRUSA_MMU2_S_MODE DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ + FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULL +opt_set MIXING_STEPPERS 5 +opt_set FIL_RUNOUT3_STATE HIGH +exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" + # # Test MINIRAMBO with PWM_MOTOR_CURRENT and many features # From 3030bf4274313d8b9724b0a8f2c920dfe1f08bf4 Mon Sep 17 00:00:00 2001 From: LinFor Date: Wed, 11 Nov 2020 23:14:39 +0300 Subject: [PATCH 0553/1370] Handle UTF in long filenames (#20087) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 4 ++ Marlin/src/lcd/fontutils.cpp | 107 +++++++++++++------------------ Marlin/src/sd/SdBaseFile.cpp | 58 +++++++++++++++-- Marlin/src/sd/SdFatConfig.h | 7 +- buildroot/share/fonts/genpages.c | 48 +++++--------- 5 files changed, 124 insertions(+), 100 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ba56862d5d..b308b05e19 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1256,6 +1256,10 @@ // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. #endif + // Allow international symbols in long filenames. To display correctly, the + // LCD's font must contain the characters. Check your selected LCD language. + #define UTF_FILENAME_SUPPORT + // This allows hosts to request long names for files and folders with M33 //#define LONG_FILENAME_HOST_SUPPORT diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp index 22b54c72de..4aaf621844 100644 --- a/Marlin/src/lcd/fontutils.cpp +++ b/Marlin/src/lcd/fontutils.cpp @@ -9,6 +9,8 @@ #include "../inc/MarlinConfig.h" +#define MAX_UTF8_CHAR_SIZE 4 + #if HAS_WIRED_LCD #include "marlinui.h" #include "../MarlinCore.h" @@ -79,6 +81,8 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t uint32_t val = 0; uint8_t *p = pstart; + #define NEXT_6_BITS() do{ val <<= 6; p++; valcur = cb_read_byte(p); val |= (valcur & 0x3F); }while(0) + uint8_t valcur = cb_read_byte(p); if (0 == (0x80 & valcur)) { val = valcur; @@ -86,74 +90,51 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t } else if (0xC0 == (0xE0 & valcur)) { val = valcur & 0x1F; - val <<= 6; - p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - p++; - } - else if (0xE0 == (0xF0 & valcur)) { - val = valcur & 0x0F; - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - p++; - } - else if (0xF0 == (0xF8 & valcur)) { - val = valcur & 0x07; - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - p++; - } - else if (0xF8 == (0xFC & valcur)) { - val = valcur & 0x03; - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - p++; - } - else if (0xFC == (0xFE & valcur)) { - val = valcur & 0x01; - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); - val <<= 6; p++; - valcur = cb_read_byte(p); - val |= (valcur & 0x3F); + NEXT_6_BITS(); p++; } + #if MAX_UTF8_CHAR_SIZE >= 3 + else if (0xE0 == (0xF0 & valcur)) { + val = valcur & 0x0F; + NEXT_6_BITS(); + NEXT_6_BITS(); + p++; + } + #endif + #if MAX_UTF8_CHAR_SIZE >= 4 + else if (0xF0 == (0xF8 & valcur)) { + val = valcur & 0x07; + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + p++; + } + #endif + #if MAX_UTF8_CHAR_SIZE >= 5 + else if (0xF8 == (0xFC & valcur)) { + val = valcur & 0x03; + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + p++; + } + #endif + #if MAX_UTF8_CHAR_SIZE >= 6 + else if (0xFC == (0xFE & valcur)) { + val = valcur & 0x01; + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + p++; + } + #endif else if (0x80 == (0xC0 & valcur)) for (; 0x80 == (0xC0 & valcur); ) { p++; valcur = cb_read_byte(p); } else - for (; ((0xFE & valcur) > 0xFC); ) { p++; valcur = cb_read_byte(p); } + for (; 0xFC < (0xFE & valcur); ) { p++; valcur = cb_read_byte(p); } if (pval) *pval = val; diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 46ed9372ab..acc5ba17f2 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -1103,19 +1103,67 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { if (WITHIN(seq, 1, MAX_VFAT_ENTRIES)) { // TODO: Store the filename checksum to verify if a long-filename-unaware system modified the file table. n = (seq - 1) * (FILENAME_LENGTH); - LOOP_L_N(i, FILENAME_LENGTH) - longFilename[n + i] = (i < 5) ? VFAT->name1[i] : (i < 11) ? VFAT->name2[i - 5] : VFAT->name3[i - 11]; + LOOP_L_N(i, FILENAME_LENGTH) { + uint16_t utf16_ch = (i < 5) ? VFAT->name1[i] : (i < 11) ? VFAT->name2[i - 5] : VFAT->name3[i - 11]; + #if ENABLED(UTF_FILENAME_SUPPORT) + // We can't reconvert to UTF-8 here as UTF-8 is variable-size encoding, but joining LFN blocks + // needs static bytes addressing. So here just store full UTF-16LE words to re-convert later. + uint16_t idx = (n + i) * 2; // This is fixed as FAT LFN always contain UTF-16LE encoding + longFilename[idx] = utf16_ch & 0xFF; + longFilename[idx+1] = (utf16_ch >> 8) & 0xFF; + #else + // Replace all multibyte characters to '_' + longFilename[n + i] = (utf16_ch > 0xFF) ? '_' : (utf16_ch & 0xFF); + #endif + } // If this VFAT entry is the last one, add a NUL terminator at the end of the string - if (VFAT->sequenceNumber & 0x40) longFilename[n + FILENAME_LENGTH] = '\0'; + if (VFAT->sequenceNumber & 0x40) longFilename[(n + FILENAME_LENGTH) * LONG_FILENAME_CHARSIZE] = '\0'; } } } + // Return if normal file or subdirectory - if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; + if (DIR_IS_FILE_OR_SUBDIR(dir)) { + #if ENABLED(UTF_FILENAME_SUPPORT) + // Convert filename from utf-16 to utf-8 as Marlin expects + #if LONG_FILENAME_CHARSIZE > 2 + // Add warning for developers for currently not supported 3-byte cases (Conversion series of 2-byte + // codepoints to 3-byte in-place will break the rest of filename) + #error "Currently filename re-encoding is done in-place. It may break the remaining chars to use 3-byte codepoints." + #endif + uint16_t currentPos = 0; + LOOP_L_N(i, (LONG_FILENAME_LENGTH / 2)) { + uint16_t idx = i * 2; // This is fixed as FAT LFN always contain UTF-16LE encoding + + uint16_t utf16_ch = longFilename[idx] | (longFilename[idx + 1] << 8); + if (0xD800 == (utf16_ch & 0xF800)) // Surrogate pair - encode as '_' + longFilename[currentPos++] = '_'; + else if (0 == (utf16_ch & 0xFF80)) // Encode as 1-byte utf-8 char + longFilename[currentPos++] = utf16_ch & 0x007F; + else if (0 == (utf16_ch & 0xF800)) { // Encode as 2-byte utf-8 char + longFilename[currentPos++] = 0xC0 | ((utf16_ch >> 6) & 0x1F); + longFilename[currentPos++] = 0x80 | (utf16_ch & 0x3F); + } + else { + #if LONG_FILENAME_CHARSIZE > 2 // Encode as 3-byte utf-8 char + longFilename[currentPos++] = 0xE0 | ((utf16_ch >> 12) & 0x0F); + longFilename[currentPos++] = 0xC0 | ((utf16_ch >> 6) & 0x3F); + longFilename[currentPos++] = 0xC0 | (utf16_ch & 0x3F); + #else // Encode as '_' + longFilename[currentPos++] = '_'; + #endif + } + + if (0 == utf16_ch) break; // End of filename + } + return currentPos; + #else + return n; + #endif + } } } - // Read next directory entry into the cache // Assumes file is correctly positioned dir_t* SdBaseFile::readDirCache() { diff --git a/Marlin/src/sd/SdFatConfig.h b/Marlin/src/sd/SdFatConfig.h index 8f0596c5dd..13ac3a7487 100644 --- a/Marlin/src/sd/SdFatConfig.h +++ b/Marlin/src/sd/SdFatConfig.h @@ -103,5 +103,10 @@ #define FILENAME_LENGTH 13 // Number of UTF-16 characters per entry +// UTF-8 may use up to 3 bytes to represent single UTF-16 code point. +// We discard 3-byte characters allowing only 2-bytes +// or 1-byte if UTF_FILENAME_SUPPORT disabled. +#define LONG_FILENAME_CHARSIZE TERN(UTF_FILENAME_SUPPORT, 2, 1) + // Total bytes needed to store a single long filename -#define LONG_FILENAME_LENGTH (FILENAME_LENGTH * MAX_VFAT_ENTRIES + 1) +#define LONG_FILENAME_LENGTH (FILENAME_LENGTH * LONG_FILENAME_CHARSIZE * MAX_VFAT_ENTRIES + 1) diff --git a/buildroot/share/fonts/genpages.c b/buildroot/share/fonts/genpages.c index 2a87b19d47..c855ceac50 100644 --- a/buildroot/share/fonts/genpages.c +++ b/buildroot/share/fonts/genpages.c @@ -71,63 +71,49 @@ uint8_t* get_utf8_value(uint8_t *pstart, wchar_t *pval) { assert(NULL != pstart); + #define NEXT_6_BITS() do{ val <<= 6; p++; val |= (*p & 0x3F); }while(0) + if (0 == (0x80 & *p)) { val = (size_t)*p; p++; } else if (0xC0 == (0xE0 & *p)) { val = *p & 0x1F; - val <<= 6; - p++; - val |= (*p & 0x3F); + NEXT_6_BITS(); p++; assert((wchar_t)val == get_val_utf82uni(pstart)); } else if (0xE0 == (0xF0 & *p)) { val = *p & 0x0F; - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); + NEXT_6_BITS(); + NEXT_6_BITS(); p++; assert((wchar_t)val == get_val_utf82uni(pstart)); } else if (0xF0 == (0xF8 & *p)) { val = *p & 0x07; - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); p++; assert((wchar_t)val == get_val_utf82uni(pstart)); } else if (0xF8 == (0xFC & *p)) { val = *p & 0x03; - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); p++; assert((wchar_t)val == get_val_utf82uni(pstart)); } else if (0xFC == (0xFE & *p)) { val = *p & 0x01; - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); - val <<= 6; p++; - val |= (*p & 0x3F); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); + NEXT_6_BITS(); p++; assert((wchar_t)val == get_val_utf82uni(pstart)); } From cf43c9901fdb4e4e30b95a8fb537215a3353738e Mon Sep 17 00:00:00 2001 From: Davidsg33k Date: Wed, 11 Nov 2020 13:30:36 -0700 Subject: [PATCH 0554/1370] 400 Z steps-per-mm (#20104) --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0036f40c4a..785be167b8 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -748,7 +748,7 @@ * Override with M92 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 500 } /** * Default Max Feed Rate (mm/s) From ac74786c2be127d9ab77e1f556f3847c07c74335 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 12 Nov 2020 09:35:13 +1300 Subject: [PATCH 0555/1370] Fix compile with PLR, no fan (#20096) --- Marlin/src/feature/powerloss.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 874bcff46d..bef2309449 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -433,13 +433,15 @@ void PrintJobRecovery::resume() { #endif // Restore print cooling fan speeds - FANS_LOOP(i) { - uint8_t f = info.fan_speed[i]; - if (f) { - sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f); - gcode.process_subcommands_now(cmd); + #if HAS_FAN + FANS_LOOP(i) { + const int f = info.fan_speed[i]; + if (f) { + sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f); + gcode.process_subcommands_now(cmd); + } } - } + #endif // Restore retract and hop state #if ENABLED(FWRETRACT) From d4b86322a97348619d6289b2c7980f1c9fbe2a89 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 11 Nov 2020 14:39:12 -0600 Subject: [PATCH 0556/1370] M32 followup --- Marlin/src/sd/cardreader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index d2713539b7..aea2e693c4 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -562,8 +562,7 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* // Store current filename (based on workDirParents) and position getAbsFilename(proc_filenames[file_subcall_ctr]); - - TERN_(HAS_MEDIA_SUBCALLS, filespos[file_subcall_ctr] = sdpos); + filespos[file_subcall_ctr] = sdpos; // For sub-procedures say 'SUBROUTINE CALL target: "..." parent: "..." pos12345' SERIAL_ECHO_START(); From 012745b218578051a7a4e841d1b84f13ef13a38f Mon Sep 17 00:00:00 2001 From: Hebezo Date: Wed, 11 Nov 2020 22:16:19 +0100 Subject: [PATCH 0557/1370] Option to ignore SD at startup (#20099) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 1 + Marlin/src/inc/SanityCheck.h | 19 +++++++++++++------ Marlin/src/sd/cardreader.cpp | 3 ++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b308b05e19..d05388075a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1172,6 +1172,7 @@ // Enable this option and set to HIGH if your SD cards are incorrectly detected. //#define SD_DETECT_STATE HIGH + //#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up //#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash) #define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e2a79cd5ea..995daa7b8e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -582,6 +582,11 @@ /** * Serial */ +#ifndef SERIAL_PORT + #error "SERIAL_PORT must be defined in Configuration.h" +#elif defined(SERIAL_PORT_2) && SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT. Please update your configuration." +#endif #if !(defined(__AVR__) && defined(USBCON)) #if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." @@ -594,12 +599,6 @@ #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." #endif -#ifndef SERIAL_PORT - #error "SERIAL_PORT must be defined in Configuration.h" -#elif defined(SERIAL_PORT_2) && SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT. Please update your configuration." -#endif - /** * Multiple Stepper Drivers Per Axis */ @@ -2194,6 +2193,14 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #endif +#if ENABLED(SD_IGNORE_AT_STARTUP) + #if ENABLED(POWER_LOSS_RECOVERY) + #error "SD_IGNORE_AT_STARTUP is incompatible with POWER_LOSS_RECOVERY." + #elif ENABLED(SDCARD_EEPROM_EMULATION) + #error "SD_IGNORE_AT_STARTUP is incompatible with SDCARD_EEPROM_EMULATION." + #endif +#endif + /** * Make sure only one display is enabled */ diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index aea2e693c4..1be5f4f2f6 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -425,7 +425,8 @@ void CardReader::manage_media() { if (stat) { // Media Inserted safe_delay(500); // Some boards need a delay to get settled - mount(); // Try to mount the media + if (TERN1(SD_IGNORE_AT_STARTUP, old_stat != 2)) + mount(); // Try to mount the media #if MB(FYSETC_CHEETAH, FYSETC_CHEETAH_V12, FYSETC_AIO_II) reset_stepper_drivers(); // Workaround for Cheetah bug #endif From 02c3c314fece3cc0e8b5b4f9b9fd6cf3573ae53f Mon Sep 17 00:00:00 2001 From: JoAnn Manges Date: Wed, 11 Nov 2020 16:52:35 -0500 Subject: [PATCH 0558/1370] Fix MAX31865 on SPI (PT100/1000) support (#20074) --- Marlin/Configuration.h | 10 +- Marlin/src/inc/Conditionals_post.h | 9 +- Marlin/src/inc/SanityCheck.h | 10 +- Marlin/src/module/temperature.cpp | 187 ++++++++++-------- Marlin/src/module/temperature.h | 2 +- .../PlatformIO/variants/archim/variant.h | 8 +- platformio.ini | 2 +- 7 files changed, 128 insertions(+), 100 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 785be167b8..374a420539 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -436,11 +436,11 @@ #define DUMMY_THERMISTOR_998_VALUE 25 #define DUMMY_THERMISTOR_999_VALUE 100 -// Resistor values when using a MAX31865 (sensor -5) -// Sensor value is typically 100 (PT100) or 1000 (PT1000) -// Calibration value is typically 430 ohm for AdaFruit PT100 modules and 4300 ohm for AdaFruit PT1000 modules. -//#define MAX31865_SENSOR_OHMS 100 -//#define MAX31865_CALIBRATION_OHMS 430 +// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1 +//#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000) +//#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for AdaFruit PT100; 4300 for AdaFruit PT1000 +//#define MAX31865_SENSOR_OHMS_1 100 +//#define MAX31865_CALIBRATION_OHMS_1 430 // Use temp sensor 1 as a redundant sensor with sensor 0. If the readings // from the two sensors differ too much the print will be aborted. diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 9eeb39f9a8..9fb3e53c4e 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -445,9 +445,9 @@ #define HEATER_0_MAX6675_TMAX 1024 #endif #if TEMP_SENSOR_0 == -5 - #define MAX6675_IS_MAX31865 1 + #define MAX6675_0_IS_MAX31865 1 #elif TEMP_SENSOR_0 == -3 - #define MAX6675_IS_MAX31855 1 + #define MAX6675_0_IS_MAX31855 1 #endif #elif TEMP_SENSOR_0 == -4 #define HEATER_0_USES_AD8495 1 @@ -473,6 +473,11 @@ #define HEATER_1_MAX6675_TMIN 0 #define HEATER_1_MAX6675_TMAX 1024 #endif + #if TEMP_SENSOR_1 == -5 + #define MAX6675_1_IS_MAX31865 1 + #elif TEMP_SENSOR_1 == -3 + #define MAX6675_1_IS_MAX31855 1 + #endif #if TEMP_SENSOR_1 != TEMP_SENSOR_0 #if TEMP_SENSOR_1 == -5 #error "If MAX31865 Thermocouple (-5) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match." diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 995daa7b8e..10f4676aa9 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -405,6 +405,10 @@ #error "MAX6675_SS is now MAX6675_SS_PIN. Please update your configuration and/or pins." #elif defined(MAX6675_SS2) #error "MAX6675_SS2 is now MAX6675_SS2_PIN. Please update your configuration and/or pins." +#elif defined(MAX31865_SENSOR_OHMS) + #error "MAX31865_SENSOR_OHMS is now MAX31865_SENSOR_OHMS_0. Please update your configuration." +#elif defined(MAX31865_CALIBRATION_OHMS) + #error "MAX31865_CALIBRATION_OHMS is now MAX31865_CALIBRATION_OHMS_0. Please update your configuration." #elif defined(SPINDLE_LASER_ENABLE) #error "SPINDLE_LASER_ENABLE is now SPINDLE_FEATURE or LASER_FEATURE. Please update your Configuration_adv.h." #elif defined(SPINDLE_LASER_ENABLE_PIN) @@ -1814,8 +1818,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT." #endif -#if MAX6675_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS) && defined(MAX31865_CALIBRATION_OHMS)) - #error "MAX31865_SENSOR_OHMS and MAX31865_CALIBRATION_OHMS must be set in Configuration.h when using a MAX31865 temperature sensor." +#if MAX6675_0_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS_0) && defined(MAX31865_CALIBRATION_OHMS_0)) + #error "MAX31865_SENSOR_OHMS_0 and MAX31865_CALIBRATION_OHMS_0 must be set in Configuration.h if TEMP_SENSOR_0 is MAX31865." +#elif MAX6675_1_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS_1) && defined(MAX31865_CALIBRATION_OHMS_1)) + #error "MAX31865_SENSOR_OHMS_1 and MAX31865_CALIBRATION_OHMS_1 must be set in Configuration.h if TEMP_SENSOR_1 is MAX31865." #endif /** diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index b476b35593..22c92fe448 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -44,30 +44,44 @@ #include "../lcd/extui/ui_api.h" #endif -#if MAX6675_IS_MAX31865 +#if MAX6675_0_IS_MAX31865 || MAX6675_1_IS_MAX31865 #include - #ifndef MAX31865_CS_PIN - #define MAX31865_CS_PIN MAX6675_SS_PIN // HW:49 SW:65 for example + #if MAX6675_0_IS_MAX31865 && !defined(MAX31865_CS_PIN) && PIN_EXISTS(MAX6675_SS) + #define MAX31865_CS_PIN MAX6675_SS_PIN + #endif + #if MAX6675_1_IS_MAX31865 && !defined(MAX31865_CS2_PIN) && PIN_EXISTS(MAX6675_SS2) + #define MAX31865_CS2_PIN MAX6675_SS2_PIN #endif #ifndef MAX31865_MOSI_PIN - #define MAX31865_MOSI_PIN MOSI_PIN // 63 + #define MAX31865_MOSI_PIN MOSI_PIN #endif #ifndef MAX31865_MISO_PIN - #define MAX31865_MISO_PIN MAX6675_DO_PIN // 42 + #define MAX31865_MISO_PIN MAX6675_DO_PIN #endif #ifndef MAX31865_SCK_PIN - #define MAX31865_SCK_PIN MAX6675_SCK_PIN // 40 + #define MAX31865_SCK_PIN MAX6675_SCK_PIN + #endif + #if MAX6675_0_IS_MAX31865 && PIN_EXISTS(MAX31865_CS) + #define HAS_MAX31865 1 + Adafruit_MAX31865 max31865_0 = Adafruit_MAX31865(MAX31865_CS_PIN + #if MAX31865_CS_PIN != MAX6675_SS_PIN + , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK + #endif + ); + #endif + #if MAX6675_1_IS_MAX31865 && PIN_EXISTS(MAX31865_CS2) + #define HAS_MAX31865 1 + Adafruit_MAX31865 max31865_1 = Adafruit_MAX31865(MAX31865_CS2_PIN + #if MAX31865_CS2_PIN != MAX6675_SS2_PIN + , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK + #endif + ); #endif - Adafruit_MAX31865 max31865 = Adafruit_MAX31865(MAX31865_CS_PIN - #if MAX31865_CS_PIN != MAX6675_SS_PIN - , MAX31865_MOSI_PIN // For software SPI also set MOSI/MISO/SCK - , MAX31865_MISO_PIN - , MAX31865_SCK_PIN - #endif - ); #endif -#define MAX6675_SEPARATE_SPI (EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) && PINS_EXIST(MAX6675_SCK, MAX6675_DO)) +#if EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) && PINS_EXIST(MAX6675_SCK, MAX6675_DO) + #define MAX6675_SEPARATE_SPI 1 +#endif #if MAX6675_SEPARATE_SPI #include "../libs/private_spi.h" @@ -1471,13 +1485,7 @@ void Temperature::manage_heater() { #if HEATER_0_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_0, raw); #elif HEATER_0_USES_MAX6675 - return ( - #if MAX6675_IS_MAX31865 - max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS) - #else - raw * 0.25 - #endif - ); + return TERN(MAX6675_0_IS_MAX31865, max31865_0.temperature(MAX31865_SENSOR_OHMS_0, MAX31865_CALIBRATION_OHMS_0), raw * 0.25); #elif HEATER_0_USES_AD595 return TEMP_AD595(raw); #elif HEATER_0_USES_AD8495 @@ -1489,7 +1497,7 @@ void Temperature::manage_heater() { #if HEATER_1_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_1, raw); #elif HEATER_1_USES_MAX6675 - return raw * 0.25; + return TERN(MAX6675_1_IS_MAX31865, max31865_1.temperature(MAX31865_SENSOR_OHMS_1, MAX31865_CALIBRATION_OHMS_1), raw * 0.25); #elif HEATER_1_USES_AD595 return TEMP_AD595(raw); #elif HEATER_1_USES_AD8495 @@ -1691,7 +1699,8 @@ void Temperature::updateTemperaturesFromRawValues() { */ void Temperature::init() { - TERN_(MAX6675_IS_MAX31865, max31865.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE + TERN_(MAX6675_0_IS_MAX31865, max31865_0.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE + TERN_(MAX6675_1_IS_MAX31865, max31865_1.begin(MAX31865_2WIRE)); #if EARLY_WATCHDOG // Flag that the thermalManager should be running @@ -2200,50 +2209,64 @@ void Temperature::disable_all_heaters() { #define THERMOCOUPLE_MAX_ERRORS 15 #endif - int Temperature::read_max6675( - #if COUNT_6675 > 1 - const uint8_t hindex - #endif - ) { - #if COUNT_6675 == 1 - constexpr uint8_t hindex = 0; - #else - // Needed to return the correct temp when this is called too soon - static uint16_t max6675_temp_previous[COUNT_6675] = { 0 }; - #endif - - static uint8_t max6675_errors[COUNT_6675] = { 0 }; - + int Temperature::read_max6675(TERN_(HAS_MULTI_6675, const uint8_t hindex/*=0*/)) { #define MAX6675_HEAT_INTERVAL 250UL - #if MAX6675_IS_MAX31855 + #if MAX6675_0_IS_MAX31855 || MAX6675_1_IS_MAX31855 static uint32_t max6675_temp = 2000; #define MAX6675_ERROR_MASK 7 #define MAX6675_DISCARD_BITS 18 - #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 + #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 + #elif HAS_MAX31865 + static uint16_t max6675_temp = 2000; // From datasheet 16 bits D15-D0 + #define MAX6675_ERROR_MASK 1 // D0 Bit not used + #define MAX6675_DISCARD_BITS 1 // Data is in D15-D1 + #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 #else static uint16_t max6675_temp = 2000; #define MAX6675_ERROR_MASK 4 #define MAX6675_DISCARD_BITS 3 - #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16 + #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16 #endif + #if HAS_MULTI_6675 + // Needed to return the correct temp when this is called between readings + static uint16_t max6675_temp_previous[COUNT_6675] = { 0 }; + #define MAX6675_TEMP(I) max6675_temp_previous[I] + #define MAX6675_SEL(A,B) (hindex ? (B) : (A)) + #define MAX6675_WRITE(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0) + #define MAX6675_SET_OUTPUT() do{ switch (hindex) { case 1: SET_OUTPUT(MAX6675_SS2_PIN); break; default: SET_OUTPUT(MAX6675_SS_PIN); } }while(0) + #else + constexpr uint8_t hindex = 0; + #define MAX6675_TEMP(I) max6675_temp + #if MAX6675_1_IS_MAX31865 + #define MAX6675_SEL(A,B) B + #else + #define MAX6675_SEL(A,B) A + #endif + #if HEATER_0_USES_MAX6675 + #define MAX6675_WRITE(V) WRITE(MAX6675_SS_PIN, V) + #define MAX6675_SET_OUTPUT() SET_OUTPUT(MAX6675_SS_PIN) + #else + #define MAX6675_WRITE(V) WRITE(MAX6675_SS2_PIN, V) + #define MAX6675_SET_OUTPUT() SET_OUTPUT(MAX6675_SS2_PIN) + #endif + #endif + + static uint8_t max6675_errors[COUNT_6675] = { 0 }; + // Return last-read value between readings static millis_t next_max6675_ms[COUNT_6675] = { 0 }; millis_t ms = millis(); - if (PENDING(ms, next_max6675_ms[hindex])) - return int( - #if COUNT_6675 == 1 - max6675_temp - #else - max6675_temp_previous[hindex] // Need to return the correct previous value - #endif - ); - + if (PENDING(ms, next_max6675_ms[hindex])) return int(MAX6675_TEMP(hindex)); next_max6675_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; - #if MAX6675_IS_MAX31865 - max6675_temp = int(max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS)); + #if HAS_MAX31865 + Adafruit_MAX31865 &maxref = MAX6675_SEL(max31865_0, max31865_1); + max6675_temp = int(maxref.temperature( + MAX6675_SEL(MAX31865_SENSOR_OHMS_0, MAX31865_SENSOR_OHMS_1), + MAX6675_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1) + )); #endif // @@ -2254,39 +2277,24 @@ void Temperature::disable_all_heaters() { spiInit(MAX6675_SPEED_BITS); #endif - #if COUNT_6675 > 1 - #define WRITE_MAX6675(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0) - #define SET_OUTPUT_MAX6675() do{ switch (hindex) { case 1: SET_OUTPUT(MAX6675_SS2_PIN); break; default: SET_OUTPUT(MAX6675_SS_PIN); } }while(0) - #elif HEATER_1_USES_MAX6675 - #define WRITE_MAX6675(V) WRITE(MAX6675_SS2_PIN, V) - #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS2_PIN) - #else - #define WRITE_MAX6675(V) WRITE(MAX6675_SS_PIN, V) - #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS_PIN) - #endif - - SET_OUTPUT_MAX6675(); - WRITE_MAX6675(LOW); // enable TT_MAX6675 + MAX6675_SET_OUTPUT(); + MAX6675_WRITE(LOW); // enable TT_MAX6675 DELAY_NS(100); // Ensure 100ns delay // Read a big-endian temperature value max6675_temp = 0; for (uint8_t i = sizeof(max6675_temp); i--;) { - max6675_temp |= ( - #if MAX6675_SEPARATE_SPI - max6675_spi.receive() - #else - spiRec() - #endif - ); + max6675_temp |= TERN(MAX6675_SEPARATE_SPI, max6675_spi.receive(), spiRec()); if (i > 0) max6675_temp <<= 8; // shift left if not the last byte } - WRITE_MAX6675(HIGH); // disable TT_MAX6675 + MAX6675_WRITE(HIGH); // disable TT_MAX6675 - if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK)) { - max6675_errors[hindex] += 1; + const uint8_t fault_31865 = TERN1(HAS_MAX31865, maxref.readFault()); + + if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK) && fault_31865) { + max6675_errors[hindex]++; if (max6675_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) { SERIAL_ERROR_START(); SERIAL_ECHOPGM("Temp measurement error! "); @@ -2298,18 +2306,29 @@ void Temperature::disable_all_heaters() { SERIAL_ECHOLNPGM("Short to GND"); else if (max6675_temp & 4) SERIAL_ECHOLNPGM("Short to VCC"); + #elif HAS_MAX31865 + if (fault_31865) { + maxref.clearFault(); + SERIAL_ECHOPAIR("MAX31865 Fault :(", fault_31865, ") >>"); + if (fault_31865 & MAX31865_FAULT_HIGHTHRESH) + SERIAL_ECHOLNPGM("RTD High Threshold"); + else if (fault_31865 & MAX31865_FAULT_LOWTHRESH) + SERIAL_ECHOLNPGM("RTD Low Threshold"); + else if (fault_31865 & MAX31865_FAULT_REFINLOW) + SERIAL_ECHOLNPGM("REFIN- > 0.85 x Bias"); + else if (fault_31865 & MAX31865_FAULT_REFINHIGH) + SERIAL_ECHOLNPGM("REFIN- < 0.85 x Bias - FORCE- open"); + else if (fault_31865 & MAX31865_FAULT_RTDINLOW) + SERIAL_ECHOLNPGM("REFIN- < 0.85 x Bias - FORCE- open"); + else if (fault_31865 & MAX31865_FAULT_OVUV) + SERIAL_ECHOLNPGM("Under/Over voltage"); + } #else SERIAL_ECHOLNPGM("MAX6675"); #endif // Thermocouple open - max6675_temp = 4 * ( - #if COUNT_6675 > 1 - hindex ? HEATER_1_MAX6675_TMAX : HEATER_0_MAX6675_TMAX - #else - TERN(HEATER_1_USES_MAX6675, HEATER_1_MAX6675_TMAX, HEATER_0_MAX6675_TMAX) - #endif - ); + max6675_temp = 4 * MAX6675_SEL(HEATER_0_MAX6675_TMAX, HEATER_1_MAX6675_TMAX); } else max6675_temp >>= MAX6675_DISCARD_BITS; @@ -2319,13 +2338,11 @@ void Temperature::disable_all_heaters() { max6675_errors[hindex] = 0; } - #if ENABLED(MAX6675_IS_MAX31855) + #if MAX6675_0_IS_MAX31855 || MAX6675_1_IS_MAX31855 if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; // Support negative temperature #endif - #if COUNT_6675 > 1 - max6675_temp_previous[hindex] = max6675_temp; - #endif + MAX6675_TEMP(hindex) = max6675_temp; return int(max6675_temp); } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 4090b845d3..edaa1c5384 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -811,7 +811,7 @@ class Temperature { #if HAS_MAX6675 #define COUNT_6675 1 + BOTH(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) #if COUNT_6675 > 1 - #define HAS_MULTI_6675 + #define HAS_MULTI_6675 1 #define READ_MAX6675(N) read_max6675(N) #else #define READ_MAX6675(N) read_max6675() diff --git a/buildroot/share/PlatformIO/variants/archim/variant.h b/buildroot/share/PlatformIO/variants/archim/variant.h index 179a137353..11f8f63bfb 100644 --- a/buildroot/share/PlatformIO/variants/archim/variant.h +++ b/buildroot/share/PlatformIO/variants/archim/variant.h @@ -55,10 +55,10 @@ extern "C"{ *----------------------------------------------------------------------------*/ // Number of pins defined in PinDescription array -#define PINS_COUNT (79U) -#define NUM_DIGITAL_PINS (66U) -#define NUM_ANALOG_INPUTS (12U) -#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) +#define PINS_COUNT 79 +#define NUM_DIGITAL_PINS 66 +#define NUM_ANALOG_INPUTS 12 +#define analogInputToDigitalPin(p) ((p < 12) ? (p) + 54 : -1) #define digitalPinToPort(P) ( g_APinDescription[P].pPort ) #define digitalPinToBitMask(P) ( g_APinDescription[P].ulPin ) diff --git a/platformio.ini b/platformio.ini index 15b8d4c23a..360a02f420 100644 --- a/platformio.ini +++ b/platformio.ini @@ -222,7 +222,7 @@ HAS_L64XX = Arduino-L6470@0.8.0 src_filter=+ + + NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ -MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 +MAX6675_._IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 From a5ee22baa25cb994b02b203de9996da4f452c524 Mon Sep 17 00:00:00 2001 From: LinFor Date: Thu, 12 Nov 2020 01:27:45 +0300 Subject: [PATCH 0559/1370] Fix MAX6675 SPI init, conflicts (#20086) --- Marlin/src/MarlinCore.cpp | 8 ++++++++ Marlin/src/module/temperature.cpp | 19 +------------------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 44abf722f2..f38ba35dd5 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -991,6 +991,14 @@ void setup() { SETUP_RUN(HAL_init()); + // Init and disable SPI thermocouples + #if HEATER_0_USES_MAX6675 + OUT_WRITE(MAX6675_SS_PIN, HIGH); // Disable + #endif + #if HEATER_1_USES_MAX6675 + OUT_WRITE(MAX6675_SS2_PIN, HIGH); // Disable + #endif + #if HAS_L64XX SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 22c92fe448..167b35cc2b 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1799,22 +1799,7 @@ void Temperature::init() { INIT_FAN_PIN(CONTROLLER_FAN_PIN); #endif - #if MAX6675_SEPARATE_SPI - - OUT_WRITE(SCK_PIN, LOW); - OUT_WRITE(MOSI_PIN, HIGH); - SET_INPUT_PULLUP(MISO_PIN); - - max6675_spi.init(); - - OUT_WRITE(SS_PIN, HIGH); - OUT_WRITE(MAX6675_SS_PIN, HIGH); - - #endif - - #if HEATER_1_USES_MAX6675 - OUT_WRITE(MAX6675_SS2_PIN, HIGH); - #endif + TERN_(MAX6675_SEPARATE_SPI, max6675_spi.init()); HAL_adc_init(); @@ -2277,9 +2262,7 @@ void Temperature::disable_all_heaters() { spiInit(MAX6675_SPEED_BITS); #endif - MAX6675_SET_OUTPUT(); MAX6675_WRITE(LOW); // enable TT_MAX6675 - DELAY_NS(100); // Ensure 100ns delay // Read a big-endian temperature value From 27c74d2f7294030f702d2ea023110a9072a70e06 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 11 Nov 2020 16:58:34 -0600 Subject: [PATCH 0560/1370] Add HOME_Z_FIRST option (#20113) --- Marlin/Configuration_adv.h | 1 + Marlin/src/gcode/calibrate/G28.cpp | 13 ++++--------- Marlin/src/inc/Conditionals_LCD.h | 4 ++++ Marlin/src/inc/SanityCheck.h | 6 +++++- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d05388075a..0acf2e5f77 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -660,6 +660,7 @@ //#define QUICK_HOME // If G28 contains XY do a diagonal move first //#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X +//#define HOME_Z_FIRST // Home Z first. Requires a Z-MIN endstop (not a probe). //#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first // @section bltouch diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index a91dd82a2a..ef39290d2d 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -313,7 +313,7 @@ void GcodeSuite::G28() { home_all = homeX == homeY && homeX == homeZ, // All or None doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ; - #if Z_HOME_DIR > 0 // If homing away from BED do Z first + #if ENABLED(HOME_Z_FIRST) if (doZ) homeaxis(Z_AXIS); @@ -373,18 +373,13 @@ void GcodeSuite::G28() { TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); // Home Z last if homing towards the bed - #if Z_HOME_DIR < 0 - + #if DISABLED(HOME_Z_FIRST) if (doZ) { TERN_(BLTOUCH, bltouch.init()); - TERN(Z_SAFE_HOMING, home_z_safely(), homeaxis(Z_AXIS)); - probe.move_z_after_homing(); - - } // doZ - - #endif // Z_HOME_DIR < 0 + } + #endif sync_plan_position(); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 865365c0ee..0bb98e9e06 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -778,6 +778,10 @@ #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN #endif +#if Z_HOME_DIR > 0 + #define HOME_Z_FIRST // If homing away from BED do Z first +#endif + /** * Set granular options based on the specific type of leveling */ diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 10f4676aa9..0f98a8badf 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1548,7 +1548,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Deploying the Allen Key probe uses big moves in z direction. Too dangerous for an unhomed z-axis. */ #if ENABLED(Z_PROBE_ALLEN_KEY) && (Z_HOME_DIR < 0) && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - #error "You can't home to a z min endstop with a Z_PROBE_ALLEN_KEY." + #error "You can't home to a Z min endstop with a Z_PROBE_ALLEN_KEY." #endif /** @@ -1965,6 +1965,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "Enable USE_ZMAX_PLUG when homing Z to MAX." #endif +#if BOTH(HOME_Z_FIRST, USE_PROBE_FOR_Z_HOMING) + #error "HOME_Z_FIRST can't be used when homing Z with a probe." +#endif + // Dual/multiple endstops requirements #if ENABLED(X_DUAL_ENDSTOPS) #if !X2_USE_ENDSTOP From 26a1cd9a00cd532c5a61655d59af17d61a1951de Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 11 Nov 2020 16:58:09 -0600 Subject: [PATCH 0561/1370] Terse sanity messages --- Marlin/src/inc/SanityCheck.h | 470 +++++++++++++++++------------------ 1 file changed, 230 insertions(+), 240 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 0f98a8badf..2ef4cbb785 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -79,9 +79,9 @@ * Warnings for old configurations */ #ifndef MOTHERBOARD - #error "MOTHERBOARD is required. Please update your configuration." + #error "MOTHERBOARD is required." #elif !defined(X_BED_SIZE) || !defined(Y_BED_SIZE) - #error "X_BED_SIZE and Y_BED_SIZE are now required! Please update your configuration." + #error "X_BED_SIZE and Y_BED_SIZE are now required!" #elif WATCH_TEMP_PERIOD > 500 #error "WATCH_TEMP_PERIOD now uses seconds instead of milliseconds." #elif DISABLED(THERMAL_PROTECTION_HOTENDS) && (defined(WATCH_TEMP_PERIOD) || defined(THERMAL_PROTECTION_PERIOD)) @@ -93,41 +93,41 @@ #elif defined(X_HOME_RETRACT_MM) #error "[XYZ]_HOME_RETRACT_MM settings have been renamed [XYZ]_HOME_BUMP_MM." #elif defined(SDCARDDETECTINVERTED) - #error "SDCARDDETECTINVERTED is now SD_DETECT_STATE (HIGH). Please update your configuration." + #error "SDCARDDETECTINVERTED is now SD_DETECT_STATE (HIGH)." #elif defined(SD_DETECT_INVERTED) - #error "SD_DETECT_INVERTED is now SD_DETECT_STATE (HIGH). Please update your configuration." + #error "SD_DETECT_INVERTED is now SD_DETECT_STATE (HIGH)." #elif defined(BTENABLED) - #error "BTENABLED is now BLUETOOTH. Please update your configuration." + #error "BTENABLED is now BLUETOOTH." #elif defined(CUSTOM_MENDEL_NAME) - #error "CUSTOM_MENDEL_NAME is now CUSTOM_MACHINE_NAME. Please update your configuration." + #error "CUSTOM_MENDEL_NAME is now CUSTOM_MACHINE_NAME." #elif defined(HAS_AUTOMATIC_VERSIONING) - #error "HAS_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE. Please update your configuration." + #error "HAS_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE." #elif defined(USE_AUTOMATIC_VERSIONING) - #error "USE_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE. Please update your configuration." + #error "USE_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE." #elif defined(SDSLOW) #error "SDSLOW deprecated. Set SPI_SPEED to SPI_HALF_SPEED instead." #elif defined(SDEXTRASLOW) #error "SDEXTRASLOW deprecated. Set SPI_SPEED to SPI_QUARTER_SPEED instead." #elif defined(FILAMENT_SENSOR) - #error "FILAMENT_SENSOR is now FILAMENT_WIDTH_SENSOR. Please update your configuration." + #error "FILAMENT_SENSOR is now FILAMENT_WIDTH_SENSOR." #elif defined(ENDSTOPPULLUP_FIL_RUNOUT) - #error "ENDSTOPPULLUP_FIL_RUNOUT is now FIL_RUNOUT_PULL. Please update your configuration." + #error "ENDSTOPPULLUP_FIL_RUNOUT is now FIL_RUNOUT_PULL." #elif defined(DISABLE_MAX_ENDSTOPS) || defined(DISABLE_MIN_ENDSTOPS) #error "DISABLE_MAX_ENDSTOPS and DISABLE_MIN_ENDSTOPS deprecated. Use individual USE_*_PLUG options instead." #elif defined(LANGUAGE_INCLUDE) - #error "LANGUAGE_INCLUDE has been replaced by LCD_LANGUAGE. Please update your configuration." + #error "LANGUAGE_INCLUDE has been replaced by LCD_LANGUAGE." #elif defined(EXTRUDER_OFFSET_X) || defined(EXTRUDER_OFFSET_Y) #error "EXTRUDER_OFFSET_[XY] is deprecated. Use HOTEND_OFFSET_[XY] instead." #elif defined(PID_PARAMS_PER_EXTRUDER) #error "PID_PARAMS_PER_EXTRUDER is deprecated. Use PID_PARAMS_PER_HOTEND instead." #elif defined(EXTRUDER_WATTS) || defined(BED_WATTS) - #error "EXTRUDER_WATTS and BED_WATTS are deprecated. Remove them from your configuration." + #error "EXTRUDER_WATTS and BED_WATTS are deprecated and should be removed." #elif defined(SERVO_ENDSTOP_ANGLES) #error "SERVO_ENDSTOP_ANGLES is deprecated. Use Z_SERVO_ANGLES instead." #elif defined(X_ENDSTOP_SERVO_NR) || defined(Y_ENDSTOP_SERVO_NR) #error "X_ENDSTOP_SERVO_NR and Y_ENDSTOP_SERVO_NR are deprecated and should be removed." #elif defined(Z_ENDSTOP_SERVO_NR) - #error "Z_ENDSTOP_SERVO_NR is now Z_PROBE_SERVO_NR. Please update your configuration." + #error "Z_ENDSTOP_SERVO_NR is now Z_PROBE_SERVO_NR." #elif defined(DEFAULT_XYJERK) #error "DEFAULT_XYJERK is deprecated. Use DEFAULT_XJERK and DEFAULT_YJERK instead." #elif defined(XY_TRAVEL_SPEED) @@ -135,57 +135,57 @@ #elif defined(PROBE_SERVO_DEACTIVATION_DELAY) #error "PROBE_SERVO_DEACTIVATION_DELAY is deprecated. Use DEACTIVATE_SERVOS_AFTER_MOVE instead." #elif defined(SERVO_DEACTIVATION_DELAY) - #error "SERVO_DEACTIVATION_DELAY is deprecated. Use SERVO_DELAY instead." + #error "SERVO_DEACTIVATION_DELAY is now SERVO_DELAY." #elif ENABLED(FILAMENTCHANGEENABLE) - #error "FILAMENTCHANGEENABLE is now ADVANCED_PAUSE_FEATURE. Please update your configuration." + #error "FILAMENTCHANGEENABLE is now ADVANCED_PAUSE_FEATURE." #elif ENABLED(FILAMENT_CHANGE_FEATURE) - #error "FILAMENT_CHANGE_FEATURE is now ADVANCED_PAUSE_FEATURE. Please update your configuration." + #error "FILAMENT_CHANGE_FEATURE is now ADVANCED_PAUSE_FEATURE." #elif defined(FILAMENT_CHANGE_X_POS) || defined(FILAMENT_CHANGE_Y_POS) - #error "FILAMENT_CHANGE_[XY]_POS is now set with NOZZLE_PARK_POINT. Please update your configuration." + #error "FILAMENT_CHANGE_[XY]_POS is now set with NOZZLE_PARK_POINT." #elif defined(FILAMENT_CHANGE_Z_ADD) - #error "FILAMENT_CHANGE_Z_ADD is now set with NOZZLE_PARK_POINT. Please update your configuration." + #error "FILAMENT_CHANGE_Z_ADD is now set with NOZZLE_PARK_POINT." #elif defined(FILAMENT_CHANGE_XY_FEEDRATE) - #error "FILAMENT_CHANGE_XY_FEEDRATE is now NOZZLE_PARK_XY_FEEDRATE. Please update your configuration." + #error "FILAMENT_CHANGE_XY_FEEDRATE is now NOZZLE_PARK_XY_FEEDRATE." #elif defined(FILAMENT_CHANGE_Z_FEEDRATE) - #error "FILAMENT_CHANGE_Z_FEEDRATE is now NOZZLE_PARK_Z_FEEDRATE. Please update your configuration." + #error "FILAMENT_CHANGE_Z_FEEDRATE is now NOZZLE_PARK_Z_FEEDRATE." #elif defined(PAUSE_PARK_X_POS) || defined(PAUSE_PARK_Y_POS) - #error "PAUSE_PARK_[XY]_POS is now set with NOZZLE_PARK_POINT. Please update your configuration." + #error "PAUSE_PARK_[XY]_POS is now set with NOZZLE_PARK_POINT." #elif defined(PAUSE_PARK_Z_ADD) - #error "PAUSE_PARK_Z_ADD is now set with NOZZLE_PARK_POINT. Please update your configuration." + #error "PAUSE_PARK_Z_ADD is now set with NOZZLE_PARK_POINT." #elif defined(PAUSE_PARK_XY_FEEDRATE) - #error "PAUSE_PARK_XY_FEEDRATE is now NOZZLE_PARK_XY_FEEDRATE. Please update your configuration." + #error "PAUSE_PARK_XY_FEEDRATE is now NOZZLE_PARK_XY_FEEDRATE." #elif defined(PAUSE_PARK_Z_FEEDRATE) - #error "PAUSE_PARK_Z_FEEDRATE is now NOZZLE_PARK_Z_FEEDRATE. Please update your configuration." + #error "PAUSE_PARK_Z_FEEDRATE is now NOZZLE_PARK_Z_FEEDRATE." #elif defined(FILAMENT_CHANGE_RETRACT_FEEDRATE) - #error "FILAMENT_CHANGE_RETRACT_FEEDRATE is now PAUSE_PARK_RETRACT_FEEDRATE. Please update your configuration." + #error "FILAMENT_CHANGE_RETRACT_FEEDRATE is now PAUSE_PARK_RETRACT_FEEDRATE." #elif defined(FILAMENT_CHANGE_RETRACT_LENGTH) - #error "FILAMENT_CHANGE_RETRACT_LENGTH is now PAUSE_PARK_RETRACT_LENGTH. Please update your configuration." + #error "FILAMENT_CHANGE_RETRACT_LENGTH is now PAUSE_PARK_RETRACT_LENGTH." #elif defined(FILAMENT_CHANGE_EXTRUDE_FEEDRATE) - #error "FILAMENT_CHANGE_EXTRUDE_FEEDRATE is now ADVANCED_PAUSE_PURGE_FEEDRATE. Please update your configuration." + #error "FILAMENT_CHANGE_EXTRUDE_FEEDRATE is now ADVANCED_PAUSE_PURGE_FEEDRATE." #elif defined(ADVANCED_PAUSE_EXTRUDE_FEEDRATE) - #error "ADVANCED_PAUSE_EXTRUDE_FEEDRATE is now ADVANCED_PAUSE_PURGE_FEEDRATE. Please update your configuration." + #error "ADVANCED_PAUSE_EXTRUDE_FEEDRATE is now ADVANCED_PAUSE_PURGE_FEEDRATE." #elif defined(FILAMENT_CHANGE_EXTRUDE_LENGTH) - #error "FILAMENT_CHANGE_EXTRUDE_LENGTH is now ADVANCED_PAUSE_PURGE_LENGTH. Please update your configuration." + #error "FILAMENT_CHANGE_EXTRUDE_LENGTH is now ADVANCED_PAUSE_PURGE_LENGTH." #elif defined(ADVANCED_PAUSE_EXTRUDE_LENGTH) - #error "ADVANCED_PAUSE_EXTRUDE_LENGTH is now ADVANCED_PAUSE_PURGE_LENGTH. Please update your configuration." + #error "ADVANCED_PAUSE_EXTRUDE_LENGTH is now ADVANCED_PAUSE_PURGE_LENGTH." #elif defined(FILAMENT_CHANGE_NOZZLE_TIMEOUT) - #error "FILAMENT_CHANGE_NOZZLE_TIMEOUT is now PAUSE_PARK_NOZZLE_TIMEOUT. Please update your configuration." + #error "FILAMENT_CHANGE_NOZZLE_TIMEOUT is now PAUSE_PARK_NOZZLE_TIMEOUT." #elif defined(FILAMENT_CHANGE_NUMBER_OF_ALERT_BEEPS) - #error "FILAMENT_CHANGE_NUMBER_OF_ALERT_BEEPS is now FILAMENT_CHANGE_ALERT_BEEPS. Please update your configuration." + #error "FILAMENT_CHANGE_NUMBER_OF_ALERT_BEEPS is now FILAMENT_CHANGE_ALERT_BEEPS." #elif defined(FILAMENT_CHANGE_NO_STEPPER_TIMEOUT) - #error "FILAMENT_CHANGE_NO_STEPPER_TIMEOUT is now PAUSE_PARK_NO_STEPPER_TIMEOUT. Please update your configuration." + #error "FILAMENT_CHANGE_NO_STEPPER_TIMEOUT is now PAUSE_PARK_NO_STEPPER_TIMEOUT." #elif defined(PLA_PREHEAT_HOTEND_TEMP) - #error "PLA_PREHEAT_HOTEND_TEMP is now PREHEAT_1_TEMP_HOTEND. Please update your configuration." + #error "PLA_PREHEAT_HOTEND_TEMP is now PREHEAT_1_TEMP_HOTEND." #elif defined(PLA_PREHEAT_HPB_TEMP) - #error "PLA_PREHEAT_HPB_TEMP is now PREHEAT_1_TEMP_BED. Please update your configuration." + #error "PLA_PREHEAT_HPB_TEMP is now PREHEAT_1_TEMP_BED." #elif defined(PLA_PREHEAT_FAN_SPEED) - #error "PLA_PREHEAT_FAN_SPEED is now PREHEAT_1_FAN_SPEED. Please update your configuration." + #error "PLA_PREHEAT_FAN_SPEED is now PREHEAT_1_FAN_SPEED." #elif defined(ABS_PREHEAT_HOTEND_TEMP) - #error "ABS_PREHEAT_HOTEND_TEMP is now PREHEAT_2_TEMP_HOTEND. Please update your configuration." + #error "ABS_PREHEAT_HOTEND_TEMP is now PREHEAT_2_TEMP_HOTEND." #elif defined(ABS_PREHEAT_HPB_TEMP) - #error "ABS_PREHEAT_HPB_TEMP is now PREHEAT_2_TEMP_BED. Please update your configuration." + #error "ABS_PREHEAT_HPB_TEMP is now PREHEAT_2_TEMP_BED." #elif defined(ABS_PREHEAT_FAN_SPEED) - #error "ABS_PREHEAT_FAN_SPEED is now PREHEAT_2_FAN_SPEED. Please update your configuration." + #error "ABS_PREHEAT_FAN_SPEED is now PREHEAT_2_FAN_SPEED." #elif defined(ENDSTOPS_ONLY_FOR_HOMING) #error "ENDSTOPS_ONLY_FOR_HOMING is deprecated. Use (disable) ENDSTOPS_ALWAYS_ON_DEFAULT instead." #elif defined(HOMING_FEEDRATE) @@ -193,111 +193,111 @@ #elif defined(MANUAL_HOME_POSITIONS) #error "MANUAL_HOME_POSITIONS is deprecated. Set MANUAL_[XYZ]_HOME_POS as-needed instead." #elif defined(PID_ADD_EXTRUSION_RATE) - #error "PID_ADD_EXTRUSION_RATE is now PID_EXTRUSION_SCALING and is DISABLED by default. Are you sure you want to use this option? Please update your configuration." + #error "PID_ADD_EXTRUSION_RATE is now PID_EXTRUSION_SCALING and is DISABLED by default." #elif defined(Z_RAISE_BEFORE_HOMING) - #error "Z_RAISE_BEFORE_HOMING is now Z_HOMING_HEIGHT. Please update your configuration." + #error "Z_RAISE_BEFORE_HOMING is now Z_HOMING_HEIGHT." #elif defined(MIN_Z_HEIGHT_FOR_HOMING) - #error "MIN_Z_HEIGHT_FOR_HOMING is now Z_HOMING_HEIGHT. Please update your configuration." + #error "MIN_Z_HEIGHT_FOR_HOMING is now Z_HOMING_HEIGHT." #elif defined(Z_RAISE_BEFORE_PROBING) || defined(Z_RAISE_AFTER_PROBING) #error "Z_RAISE_(BEFORE|AFTER)_PROBING are deprecated. Use Z_CLEARANCE_DEPLOY_PROBE and Z_AFTER_PROBING instead." #elif defined(Z_RAISE_PROBE_DEPLOY_STOW) || defined(Z_RAISE_BETWEEN_PROBINGS) - #error "Z_RAISE_PROBE_DEPLOY_STOW and Z_RAISE_BETWEEN_PROBINGS are now Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES. Please update your configuration." + #error "Z_RAISE_PROBE_DEPLOY_STOW and Z_RAISE_BETWEEN_PROBINGS are now Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES." #elif defined(Z_PROBE_DEPLOY_HEIGHT) || defined(Z_PROBE_TRAVEL_HEIGHT) - #error "Z_PROBE_DEPLOY_HEIGHT and Z_PROBE_TRAVEL_HEIGHT are now Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES. Please update your configuration." + #error "Z_PROBE_DEPLOY_HEIGHT and Z_PROBE_TRAVEL_HEIGHT are now Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES." #elif defined(MANUAL_BED_LEVELING) - #error "MANUAL_BED_LEVELING is now LCD_BED_LEVELING. Please update your configuration." + #error "MANUAL_BED_LEVELING is now LCD_BED_LEVELING." #elif defined(MESH_HOME_SEARCH_Z) - #error "MESH_HOME_SEARCH_Z is now LCD_PROBE_Z_RANGE. Please update your configuration." + #error "MESH_HOME_SEARCH_Z is now LCD_PROBE_Z_RANGE." #elif defined(MANUAL_PROBE_Z_RANGE) - #error "MANUAL_PROBE_Z_RANGE is now LCD_PROBE_Z_RANGE. Please update your configuration." + #error "MANUAL_PROBE_Z_RANGE is now LCD_PROBE_Z_RANGE." #elif !defined(MIN_STEPS_PER_SEGMENT) - #error Please replace "const int dropsegments" with "#define MIN_STEPS_PER_SEGMENT" (and increase by 1) in Configuration_adv.h. + #error "Please replace 'const int dropsegments' with '#define MIN_STEPS_PER_SEGMENT' (and increase by 1)." #elif MIN_STEPS_PER_SEGMENT <= 0 - #error "MIN_STEPS_PER_SEGMENT must be at least 1. Please update your Configuration_adv.h." + #error "MIN_STEPS_PER_SEGMENT must be at least 1." #elif defined(PREVENT_DANGEROUS_EXTRUDE) - #error "PREVENT_DANGEROUS_EXTRUDE is now PREVENT_COLD_EXTRUSION. Please update your configuration." + #error "PREVENT_DANGEROUS_EXTRUDE is now PREVENT_COLD_EXTRUSION." #elif defined(SCARA) - #error "SCARA is now MORGAN_SCARA. Please update your configuration." + #error "SCARA is now MORGAN_SCARA." #elif defined(ENABLE_AUTO_BED_LEVELING) #error "ENABLE_AUTO_BED_LEVELING is deprecated. Specify AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_3POINT." #elif defined(AUTO_BED_LEVELING_FEATURE) #error "AUTO_BED_LEVELING_FEATURE is deprecated. Specify AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_3POINT." #elif defined(ABL_GRID_POINTS) - #error "ABL_GRID_POINTS is now GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y. Please update your configuration." + #error "ABL_GRID_POINTS is now GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y." #elif defined(ABL_GRID_POINTS_X) || defined(ABL_GRID_POINTS_Y) - #error "ABL_GRID_POINTS_[XY] is now GRID_MAX_POINTS_[XY]. Please update your configuration." + #error "ABL_GRID_POINTS_[XY] is now GRID_MAX_POINTS_[XY]." #elif defined(ABL_GRID_MAX_POINTS_X) || defined(ABL_GRID_MAX_POINTS_Y) - #error "ABL_GRID_MAX_POINTS_[XY] is now GRID_MAX_POINTS_[XY]. Please update your configuration." + #error "ABL_GRID_MAX_POINTS_[XY] is now GRID_MAX_POINTS_[XY]." #elif defined(MESH_NUM_X_POINTS) || defined(MESH_NUM_Y_POINTS) - #error "MESH_NUM_[XY]_POINTS is now GRID_MAX_POINTS_[XY]. Please update your configuration." + #error "MESH_NUM_[XY]_POINTS is now GRID_MAX_POINTS_[XY]." #elif defined(UBL_MESH_NUM_X_POINTS) || defined(UBL_MESH_NUM_Y_POINTS) - #error "UBL_MESH_NUM_[XY]_POINTS is now GRID_MAX_POINTS_[XY]. Please update your configuration." + #error "UBL_MESH_NUM_[XY]_POINTS is now GRID_MAX_POINTS_[XY]." #elif defined(UBL_G26_MESH_VALIDATION) - #error "UBL_G26_MESH_VALIDATION is now G26_MESH_VALIDATION. Please update your configuration." + #error "UBL_G26_MESH_VALIDATION is now G26_MESH_VALIDATION." #elif defined(UBL_MESH_EDIT_ENABLED) - #error "UBL_MESH_EDIT_ENABLED is now G26_MESH_VALIDATION. Please update your configuration." + #error "UBL_MESH_EDIT_ENABLED is now G26_MESH_VALIDATION." #elif defined(UBL_MESH_EDITING) - #error "UBL_MESH_EDITING is now G26_MESH_VALIDATION. Please update your configuration." + #error "UBL_MESH_EDITING is now G26_MESH_VALIDATION." #elif defined(BLTOUCH_HEATERS_OFF) - #error "BLTOUCH_HEATERS_OFF is now PROBING_HEATERS_OFF. Please update your configuration." + #error "BLTOUCH_HEATERS_OFF is now PROBING_HEATERS_OFF." #elif defined(BLTOUCH_V3) - #error "BLTOUCH_V3 is obsolete. Please update your configuration." + #error "BLTOUCH_V3 is obsolete." #elif defined(BLTOUCH_FORCE_OPEN_DRAIN_MODE) - #error "BLTOUCH_FORCE_OPEN_DRAIN_MODE is obsolete. Please update your configuration." + #error "BLTOUCH_FORCE_OPEN_DRAIN_MODE is obsolete." #elif defined(BEEPER) - #error "BEEPER is now BEEPER_PIN. Please update your pins definitions." + #error "BEEPER is now BEEPER_PIN." #elif defined(SDCARDDETECT) - #error "SDCARDDETECT is now SD_DETECT_PIN. Please update your pins definitions." + #error "SDCARDDETECT is now SD_DETECT_PIN." #elif defined(STAT_LED_RED) || defined(STAT_LED_BLUE) - #error "STAT_LED_RED/STAT_LED_BLUE are now STAT_LED_RED_PIN/STAT_LED_BLUE_PIN. Please update your pins definitions." + #error "STAT_LED_RED/STAT_LED_BLUE are now STAT_LED_RED_PIN/STAT_LED_BLUE_PIN." #elif defined(LCD_PIN_BL) - #error "LCD_PIN_BL is now LCD_BACKLIGHT_PIN. Please update your pins definitions." + #error "LCD_PIN_BL is now LCD_BACKLIGHT_PIN." #elif defined(LCD_PIN_RESET) - #error "LCD_PIN_RESET is now LCD_RESET_PIN. Please update your pins definitions." + #error "LCD_PIN_RESET is now LCD_RESET_PIN." #elif defined(EXTRUDER_0_AUTO_FAN_PIN) || defined(EXTRUDER_1_AUTO_FAN_PIN) || defined(EXTRUDER_2_AUTO_FAN_PIN) || defined(EXTRUDER_3_AUTO_FAN_PIN) - #error "EXTRUDER_[0123]_AUTO_FAN_PIN is now E[0123]_AUTO_FAN_PIN. Please update your Configuration_adv.h." + #error "EXTRUDER_[0123]_AUTO_FAN_PIN is now E[0123]_AUTO_FAN_PIN." #elif defined(PID_FAN_SCALING) && !HAS_FAN #error "PID_FAN_SCALING needs at least one fan enabled." #elif defined(min_software_endstops) || defined(max_software_endstops) - #error "(min|max)_software_endstops are now (MIN|MAX)_SOFTWARE_ENDSTOPS. Please update your configuration." + #error "(min|max)_software_endstops are now (MIN|MAX)_SOFTWARE_ENDSTOPS." #elif ENABLED(Z_PROBE_SLED) && defined(SLED_PIN) #error "Replace SLED_PIN with SOL1_PIN (applies to both Z_PROBE_SLED and SOLENOID_PROBE)." #elif defined(CONTROLLERFAN_PIN) - #error "CONTROLLERFAN_PIN is now CONTROLLER_FAN_PIN, enabled with USE_CONTROLLER_FAN. Please update your Configuration_adv.h." + #error "CONTROLLERFAN_PIN is now CONTROLLER_FAN_PIN, enabled with USE_CONTROLLER_FAN." #elif defined(CONTROLLERFAN_SPEED) - #error "CONTROLLERFAN_SPEED is now CONTROLLERFAN_SPEED_ACTIVE. Please update your Configuration_adv.h." + #error "CONTROLLERFAN_SPEED is now CONTROLLERFAN_SPEED_ACTIVE." #elif defined(CONTROLLERFAN_SECS) - #error "CONTROLLERFAN_SECS is now CONTROLLERFAN_IDLE_TIME. Please update your Configuration_adv.h." + #error "CONTROLLERFAN_SECS is now CONTROLLERFAN_IDLE_TIME." #elif defined(MIN_RETRACT) - #error "MIN_RETRACT is now MIN_AUTORETRACT and MAX_AUTORETRACT. Please update your Configuration_adv.h." + #error "MIN_RETRACT is now MIN_AUTORETRACT and MAX_AUTORETRACT." #elif defined(ADVANCE) - #error "ADVANCE was removed in Marlin 1.1.6. Please use LIN_ADVANCE." + #error "ADVANCE is now LIN_ADVANCE." #elif defined(LIN_ADVANCE_E_D_RATIO) - #error "LIN_ADVANCE (1.5) no longer uses LIN_ADVANCE_E_D_RATIO. Check your configuration." + #error "LIN_ADVANCE (1.5) no longer uses LIN_ADVANCE_E_D_RATIO." #elif defined(NEOPIXEL_RGBW_LED) - #error "NEOPIXEL_RGBW_LED is now NEOPIXEL_LED. Please update your configuration." + #error "NEOPIXEL_RGBW_LED is now NEOPIXEL_LED." #elif ENABLED(DELTA) && defined(DELTA_PROBEABLE_RADIUS) #error "Remove DELTA_PROBEABLE_RADIUS and use PROBING_MARGIN to inset the probe area instead." #elif ENABLED(DELTA) && defined(DELTA_CALIBRATION_RADIUS) #error "Remove DELTA_CALIBRATION_RADIUS and use PROBING_MARGIN to inset the probe area instead." #elif defined(UBL_MESH_INSET) - #error "UBL_MESH_INSET is now just MESH_INSET. Please update your configuration." + #error "UBL_MESH_INSET is now just MESH_INSET." #elif defined(UBL_MESH_MIN_X) || defined(UBL_MESH_MIN_Y) || defined(UBL_MESH_MAX_X) || defined(UBL_MESH_MAX_Y) - #error "UBL_MESH_(MIN|MAX)_[XY] is now just MESH_(MIN|MAX)_[XY]. Please update your configuration." + #error "UBL_MESH_(MIN|MAX)_[XY] is now just MESH_(MIN|MAX)_[XY]." #elif defined(ABL_PROBE_PT_1_X) || defined(ABL_PROBE_PT_1_Y) || defined(ABL_PROBE_PT_2_X) || defined(ABL_PROBE_PT_2_Y) || defined(ABL_PROBE_PT_3_X) || defined(ABL_PROBE_PT_3_Y) - #error "ABL_PROBE_PT_[123]_[XY] is no longer required. Please remove it from Configuration.h." + #error "ABL_PROBE_PT_[123]_[XY] is no longer required. Please remove it." #elif defined(UBL_PROBE_PT_1_X) || defined(UBL_PROBE_PT_1_Y) || defined(UBL_PROBE_PT_2_X) || defined(UBL_PROBE_PT_2_Y) || defined(UBL_PROBE_PT_3_X) || defined(UBL_PROBE_PT_3_Y) - #error "UBL_PROBE_PT_[123]_[XY] is no longer required. Please remove it from Configuration.h." + #error "UBL_PROBE_PT_[123]_[XY] is no longer required. Please remove it." #elif defined(MIN_PROBE_EDGE) - #error "MIN_PROBE_EDGE is now called PROBING_MARGIN. Please update your configuration." + #error "MIN_PROBE_EDGE is now called PROBING_MARGIN." #elif defined(MIN_PROBE_EDGE_LEFT) - #error "MIN_PROBE_EDGE_LEFT is now called PROBING_MARGIN_LEFT. Please update your configuration." + #error "MIN_PROBE_EDGE_LEFT is now called PROBING_MARGIN_LEFT." #elif defined(MIN_PROBE_EDGE_RIGHT) - #error "MIN_PROBE_EDGE_RIGHT is now called PROBING_MARGIN_RIGHT. Please update your configuration." + #error "MIN_PROBE_EDGE_RIGHT is now called PROBING_MARGIN_RIGHT." #elif defined(MIN_PROBE_EDGE_FRONT) - #error "MIN_PROBE_EDGE_FRONT is now called PROBING_MARGIN_FRONT. Please update your configuration." + #error "MIN_PROBE_EDGE_FRONT is now called PROBING_MARGIN_FRONT." #elif defined(MIN_PROBE_EDGE_BACK) - #error "MIN_PROBE_EDGE_BACK is now called PROBING_MARGIN_BACK. Please update your configuration." + #error "MIN_PROBE_EDGE_BACK is now called PROBING_MARGIN_BACK." #elif defined(LEFT_PROBE_BED_POSITION) #error "LEFT_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_LEFT instead." #elif defined(RIGHT_PROBE_BED_POSITION) @@ -307,243 +307,229 @@ #elif defined(BACK_PROBE_BED_POSITION) #error "BACK_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_BACK instead." #elif defined(ENABLE_MESH_EDIT_GFX_OVERLAY) - #error "ENABLE_MESH_EDIT_GFX_OVERLAY is now MESH_EDIT_GFX_OVERLAY. Please update your configuration." + #error "ENABLE_MESH_EDIT_GFX_OVERLAY is now MESH_EDIT_GFX_OVERLAY." #elif defined(BABYSTEP_ZPROBE_GFX_REVERSE) - #error "BABYSTEP_ZPROBE_GFX_REVERSE is now set by OVERLAY_GFX_REVERSE. Please update your configurations." + #error "BABYSTEP_ZPROBE_GFX_REVERSE is now set by OVERLAY_GFX_REVERSE." #elif defined(UBL_GRANULAR_SEGMENTATION_FOR_CARTESIAN) - #error "UBL_GRANULAR_SEGMENTATION_FOR_CARTESIAN is now SEGMENT_LEVELED_MOVES. Please update your configuration." + #error "UBL_GRANULAR_SEGMENTATION_FOR_CARTESIAN is now SEGMENT_LEVELED_MOVES." #elif HAS_PID_HEATING && (defined(K1) || !defined(PID_K1)) - #error "K1 is now PID_K1. Please update your configuration." + #error "K1 is now PID_K1." #elif defined(PROBE_DOUBLE_TOUCH) - #error "PROBE_DOUBLE_TOUCH is now MULTIPLE_PROBING. Please update your configuration." + #error "PROBE_DOUBLE_TOUCH is now MULTIPLE_PROBING." #elif defined(ANET_KEYPAD_LCD) - #error "ANET_KEYPAD_LCD is now ZONESTAR_LCD. Please update your configuration." + #error "ANET_KEYPAD_LCD is now ZONESTAR_LCD." #elif defined(LCD_I2C_SAINSMART_YWROBOT) - #error "LCD_I2C_SAINSMART_YWROBOT is now LCD_SAINSMART_I2C_(1602|2004). Please update your configuration." + #error "LCD_I2C_SAINSMART_YWROBOT is now LCD_SAINSMART_I2C_(1602|2004)." #elif defined(MEASURED_LOWER_LIMIT) || defined(MEASURED_UPPER_LIMIT) - #error "MEASURED_(UPPER|LOWER)_LIMIT is now FILWIDTH_ERROR_MARGIN. Please update your configuration." + #error "MEASURED_(UPPER|LOWER)_LIMIT is now FILWIDTH_ERROR_MARGIN." #elif defined(HAVE_TMCDRIVER) - #error "HAVE_TMCDRIVER is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." + #error "HAVE_TMCDRIVER is now [AXIS]_DRIVER_TYPE TMC26X." #elif defined(STEALTHCHOP) - #error "STEALTHCHOP is now STEALTHCHOP_(XY|Z|E). Please update your Configuration_adv.h." + #error "STEALTHCHOP is now STEALTHCHOP_(XY|Z|E)." #elif defined(HAVE_TMC26X) - #error "HAVE_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." + #error "HAVE_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X." #elif defined(HAVE_TMC2130) - #error "HAVE_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." + #error "HAVE_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130." #elif defined(HAVE_TMC2208) - #error "HAVE_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h." + #error "HAVE_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208." #elif defined(HAVE_L6470DRIVER) - #error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." + #error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470." #elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) || defined(Z3_IS_TMC) \ || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC) || defined(E5_IS_TMC) || defined(E6_IS_TMC) || defined(E7_IS_TMC) - #error "[AXIS]_IS_TMC is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." + #error "[AXIS]_IS_TMC is now [AXIS]_DRIVER_TYPE TMC26X." #elif defined(X_IS_TMC26X) || defined(X2_IS_TMC26X) || defined(Y_IS_TMC26X) || defined(Y2_IS_TMC26X) || defined(Z_IS_TMC26X) || defined(Z2_IS_TMC26X) || defined(Z3_IS_TMC26X) \ || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X) || defined(E5_IS_TMC26X) || defined(E6_IS_TMC26X) || defined(E7_IS_TMC26X) - #error "[AXIS]_IS_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." + #error "[AXIS]_IS_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X." #elif defined(X_IS_TMC2130) || defined(X2_IS_TMC2130) || defined(Y_IS_TMC2130) || defined(Y2_IS_TMC2130) || defined(Z_IS_TMC2130) || defined(Z2_IS_TMC2130) || defined(Z3_IS_TMC2130) \ || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130) || defined(E5_IS_TMC2130) || defined(E6_IS_TMC2130) || defined(E7_IS_TMC2130) - #error "[AXIS]_IS_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." + #error "[AXIS]_IS_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130." #elif defined(X_IS_TMC2208) || defined(X2_IS_TMC2208) || defined(Y_IS_TMC2208) || defined(Y2_IS_TMC2208) || defined(Z_IS_TMC2208) || defined(Z2_IS_TMC2208) || defined(Z3_IS_TMC2208) \ || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208) || defined(E5_IS_TMC2208) || defined(E6_IS_TMC2208) || defined(E7_IS_TMC2208) - #error "[AXIS]_IS_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h." + #error "[AXIS]_IS_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208." #elif defined(X_IS_L6470) || defined(X2_IS_L6470) || defined(Y_IS_L6470) || defined(Y2_IS_L6470) || defined(Z_IS_L6470) || defined(Z2_IS_L6470) || defined(Z3_IS_L6470) \ || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470) || defined(E5_IS_L6470) || defined(E6_IS_L6470) || defined(E7_IS_L6470) - #error "[AXIS]_IS_L6470 is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." + #error "[AXIS]_IS_L6470 is now [AXIS]_DRIVER_TYPE L6470." #elif defined(AUTOMATIC_CURRENT_CONTROL) - #error "AUTOMATIC_CURRENT_CONTROL is now MONITOR_DRIVER_STATUS. Please update your configuration." + #error "AUTOMATIC_CURRENT_CONTROL is now MONITOR_DRIVER_STATUS." #elif defined(FILAMENT_CHANGE_LOAD_LENGTH) - #error "FILAMENT_CHANGE_LOAD_LENGTH is now FILAMENT_CHANGE_FAST_LOAD_LENGTH. Please update your configuration." + #error "FILAMENT_CHANGE_LOAD_LENGTH is now FILAMENT_CHANGE_FAST_LOAD_LENGTH." #elif defined(LEVEL_CORNERS_INSET) - #error "LEVEL_CORNERS_INSET is now LEVEL_CORNERS_INSET_LFRB . Please update your Configuration.h." + #error "LEVEL_CORNERS_INSET is now LEVEL_CORNERS_INSET_LFRB." #elif ENABLED(LEVEL_BED_CORNERS) && !defined(LEVEL_CORNERS_INSET_LFRB) - #error "LEVEL_BED_CORNERS requires LEVEL_CORNERS_INSET_LFRB values. Please update your Configuration.h." + #error "LEVEL_BED_CORNERS requires LEVEL_CORNERS_INSET_LFRB values." #elif defined(BEZIER_JERK_CONTROL) - #error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION. Please update your configuration." + #error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION." #elif HAS_JUNCTION_DEVIATION && defined(JUNCTION_DEVIATION_FACTOR) - #error "JUNCTION_DEVIATION_FACTOR is now JUNCTION_DEVIATION_MM. Please update your configuration." + #error "JUNCTION_DEVIATION_FACTOR is now JUNCTION_DEVIATION_MM." #elif defined(JUNCTION_ACCELERATION_FACTOR) #error "JUNCTION_ACCELERATION_FACTOR is obsolete. Delete it from Configuration_adv.h." #elif defined(JUNCTION_ACCELERATION) #error "JUNCTION_ACCELERATION is obsolete. Delete it from Configuration_adv.h." #elif defined(MAX7219_DEBUG_STEPPER_HEAD) - #error "MAX7219_DEBUG_STEPPER_HEAD is now MAX7219_DEBUG_PLANNER_HEAD. Please update your configuration." + #error "MAX7219_DEBUG_STEPPER_HEAD is now MAX7219_DEBUG_PLANNER_HEAD." #elif defined(MAX7219_DEBUG_STEPPER_TAIL) - #error "MAX7219_DEBUG_STEPPER_TAIL is now MAX7219_DEBUG_PLANNER_TAIL. Please update your configuration." + #error "MAX7219_DEBUG_STEPPER_TAIL is now MAX7219_DEBUG_PLANNER_TAIL." #elif defined(MAX7219_DEBUG_STEPPER_QUEUE) - #error "MAX7219_DEBUG_STEPPER_QUEUE is now MAX7219_DEBUG_PLANNER_QUEUE. Please update your configuration." + #error "MAX7219_DEBUG_STEPPER_QUEUE is now MAX7219_DEBUG_PLANNER_QUEUE." #elif defined(ENDSTOP_NOISE_FILTER) - #error "ENDSTOP_NOISE_FILTER is now ENDSTOP_NOISE_THRESHOLD [2-7]. Please update your configuration." + #error "ENDSTOP_NOISE_FILTER is now ENDSTOP_NOISE_THRESHOLD [2-7]." #elif defined(RETRACT_ZLIFT) - #error "RETRACT_ZLIFT is now RETRACT_ZRAISE. Please update your Configuration_adv.h." + #error "RETRACT_ZLIFT is now RETRACT_ZRAISE." #elif defined(TOOLCHANGE_PARK_ZLIFT) || defined(TOOLCHANGE_UNPARK_ZLIFT) - #error "TOOLCHANGE_PARK_ZLIFT and TOOLCHANGE_UNPARK_ZLIFT are now TOOLCHANGE_ZRAISE. Please update your configuration." + #error "TOOLCHANGE_PARK_ZLIFT and TOOLCHANGE_UNPARK_ZLIFT are now TOOLCHANGE_ZRAISE." #elif defined(SINGLENOZZLE_TOOLCHANGE_ZRAISE) - #error "SINGLENOZZLE_TOOLCHANGE_ZRAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." + #error "SINGLENOZZLE_TOOLCHANGE_ZRAISE is now TOOLCHANGE_ZRAISE." #elif defined(SINGLENOZZLE_SWAP_LENGTH) - #error "SINGLENOZZLE_SWAP_LENGTH is now TOOLCHANGE_FIL_SWAP_LENGTH. Please update your configuration." + #error "SINGLENOZZLE_SWAP_LENGTH is now TOOLCHANGE_FIL_SWAP_LENGTH." #elif defined(SINGLENOZZLE_SWAP_RETRACT_SPEED) - #error "SINGLENOZZLE_SWAP_RETRACT_SPEED is now TOOLCHANGE_FIL_SWAP_RETRACT_SPEED. Please update your configuration." + #error "SINGLENOZZLE_SWAP_RETRACT_SPEED is now TOOLCHANGE_FIL_SWAP_RETRACT_SPEED." #elif defined(SINGLENOZZLE_SWAP_PRIME_SPEED) - #error "SINGLENOZZLE_SWAP_PRIME_SPEED is now TOOLCHANGE_FIL_SWAP_PRIME_SPEED. Please update your configuration." + #error "SINGLENOZZLE_SWAP_PRIME_SPEED is now TOOLCHANGE_FIL_SWAP_PRIME_SPEED." #elif defined(SINGLENOZZLE_SWAP_PARK) - #error "SINGLENOZZLE_SWAP_PARK is now TOOLCHANGE_PARK. Please update your configuration." + #error "SINGLENOZZLE_SWAP_PARK is now TOOLCHANGE_PARK." #elif defined(SINGLENOZZLE_TOOLCHANGE_XY) - #error "SINGLENOZZLE_TOOLCHANGE_XY is now TOOLCHANGE_PARK_XY. Please update your configuration." + #error "SINGLENOZZLE_TOOLCHANGE_XY is now TOOLCHANGE_PARK_XY." #elif defined(SINGLENOZZLE_PARK_XY_FEEDRATE) - #error "SINGLENOZZLE_PARK_XY_FEEDRATE is now TOOLCHANGE_PARK_XY_FEEDRATE. Please update your configuration." + #error "SINGLENOZZLE_PARK_XY_FEEDRATE is now TOOLCHANGE_PARK_XY_FEEDRATE." #elif defined(PARKING_EXTRUDER_SECURITY_RAISE) - #error "PARKING_EXTRUDER_SECURITY_RAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." + #error "PARKING_EXTRUDER_SECURITY_RAISE is now TOOLCHANGE_ZRAISE." #elif defined(SWITCHING_TOOLHEAD_SECURITY_RAISE) - #error "SWITCHING_TOOLHEAD_SECURITY_RAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." + #error "SWITCHING_TOOLHEAD_SECURITY_RAISE is now TOOLCHANGE_ZRAISE." #elif defined(G0_FEEDRATE) && G0_FEEDRATE == 0 - #error "G0_FEEDRATE is now used to set the G0 feedrate. Please update your configuration." + #error "G0_FEEDRATE is now used to set the G0 feedrate." #elif defined(MBL_Z_STEP) - #error "MBL_Z_STEP is now MESH_EDIT_Z_STEP. Please update your configuration." + #error "MBL_Z_STEP is now MESH_EDIT_Z_STEP." #elif defined(CHDK) - #error "CHDK is now CHDK_PIN. Please update your Configuration_adv.h." -#elif defined(MAX6675_SS) - #error "MAX6675_SS is now MAX6675_SS_PIN. Please update your configuration and/or pins." -#elif defined(MAX6675_SS2) - #error "MAX6675_SS2 is now MAX6675_SS2_PIN. Please update your configuration and/or pins." + #error "CHDK is now CHDK_PIN." +#elif defined(MAX6675_SS) || defined(MAX6675_SS2) + #error "MAX6675_SS / MAX6675_SS2 is now MAX6675_SS_PIN / MAX6675_SS2_PIN." #elif defined(MAX31865_SENSOR_OHMS) - #error "MAX31865_SENSOR_OHMS is now MAX31865_SENSOR_OHMS_0. Please update your configuration." + #error "MAX31865_SENSOR_OHMS is now MAX31865_SENSOR_OHMS_0." #elif defined(MAX31865_CALIBRATION_OHMS) - #error "MAX31865_CALIBRATION_OHMS is now MAX31865_CALIBRATION_OHMS_0. Please update your configuration." + #error "MAX31865_CALIBRATION_OHMS is now MAX31865_CALIBRATION_OHMS_0." #elif defined(SPINDLE_LASER_ENABLE) - #error "SPINDLE_LASER_ENABLE is now SPINDLE_FEATURE or LASER_FEATURE. Please update your Configuration_adv.h." + #error "SPINDLE_LASER_ENABLE is now SPINDLE_FEATURE or LASER_FEATURE." #elif defined(SPINDLE_LASER_ENABLE_PIN) - #error "SPINDLE_LASER_ENABLE_PIN is now SPINDLE_LASER_ENA_PIN. Please update your Configuration_adv.h and/or pins." + #error "SPINDLE_LASER_ENABLE_PIN is now SPINDLE_LASER_ENA_PIN." #elif defined(SPINDLE_DIR_CHANGE) - #error "SPINDLE_DIR_CHANGE is now SPINDLE_CHANGE_DIR. Please update your Configuration_adv.h." + #error "SPINDLE_DIR_CHANGE is now SPINDLE_CHANGE_DIR." #elif defined(SPINDLE_STOP_ON_DIR_CHANGE) - #error "SPINDLE_STOP_ON_DIR_CHANGE is now SPINDLE_CHANGE_DIR_STOP. Please update your Configuration_adv.h." + #error "SPINDLE_STOP_ON_DIR_CHANGE is now SPINDLE_CHANGE_DIR_STOP." #elif defined(SPINDLE_LASER_ACTIVE_HIGH) - #error "SPINDLE_LASER_ACTIVE_HIGH is now SPINDLE_LASER_ACTIVE_STATE. Please update your Configuration_adv.h." + #error "SPINDLE_LASER_ACTIVE_HIGH is now SPINDLE_LASER_ACTIVE_STATE." #elif defined(SPINDLE_LASER_ENABLE_INVERT) - #error "SPINDLE_LASER_ENABLE_INVERT is now SPINDLE_LASER_ACTIVE_STATE. Please update your Configuration_adv.h." + #error "SPINDLE_LASER_ENABLE_INVERT is now SPINDLE_LASER_ACTIVE_STATE." #elif defined(CUTTER_POWER_DISPLAY) - #error "CUTTER_POWER_DISPLAY is now CUTTER_POWER_UNIT. Please update your Configuration_adv.h." + #error "CUTTER_POWER_DISPLAY is now CUTTER_POWER_UNIT." #elif defined(CHAMBER_HEATER_PIN) - #error "CHAMBER_HEATER_PIN is now HEATER_CHAMBER_PIN. Please update your configuration and/or pins." + #error "CHAMBER_HEATER_PIN is now HEATER_CHAMBER_PIN." #elif defined(TMC_Z_CALIBRATION) - #error "TMC_Z_CALIBRATION has been deprecated in favor of MECHANICAL_GANTRY_CALIBRATION. Please update your configuration." + #error "TMC_Z_CALIBRATION has been deprecated in favor of MECHANICAL_GANTRY_CALIBRATION." #elif defined(Z_MIN_PROBE_ENDSTOP) - #error "Z_MIN_PROBE_ENDSTOP is no longer required. Please remove it from Configuration.h." + #error "Z_MIN_PROBE_ENDSTOP is no longer required. Please remove it." #elif defined(DUAL_NOZZLE_DUPLICATION_MODE) - #error "DUAL_NOZZLE_DUPLICATION_MODE is now MULTI_NOZZLE_DUPLICATION. Please update your configuration." + #error "DUAL_NOZZLE_DUPLICATION_MODE is now MULTI_NOZZLE_DUPLICATION." #elif defined(MENU_ITEM_CASE_LIGHT) - #error "MENU_ITEM_CASE_LIGHT is now CASE_LIGHT_MENU. Please update your configuration." + #error "MENU_ITEM_CASE_LIGHT is now CASE_LIGHT_MENU." #elif defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - #error "ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED is now SD_ABORT_ON_ENDSTOP_HIT. Please update your Configuration_adv.h." + #error "ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED is now SD_ABORT_ON_ENDSTOP_HIT." #elif defined(LPC_SD_LCD) || defined(LPC_SD_ONBOARD) || defined(LPC_SD_CUSTOM_CABLE) - #error "LPC_SD_(LCD|ONBOARD|CUSTOM_CABLE) are now SDCARD_CONNECTION. Please update your Configuration_adv.h." + #error "LPC_SD_(LCD|ONBOARD|CUSTOM_CABLE) are now SDCARD_CONNECTION." #elif defined(USB_SD_DISABLED) - #error "USB_SD_DISABLED is now NO_SD_HOST_DRIVE. Please update your Configuration_adv.h." + #error "USB_SD_DISABLED is now NO_SD_HOST_DRIVE." #elif defined(USB_SD_ONBOARD) #error "USB_SD_ONBOARD is obsolete. Disable NO_SD_HOST_DRIVE instead." #elif defined(PSU_ACTIVE_HIGH) - #error "PSU_ACTIVE_HIGH is now PSU_ACTIVE_STATE. Please update your configuration." + #error "PSU_ACTIVE_HIGH is now PSU_ACTIVE_STATE." #elif POWER_SUPPLY == 1 #error "Replace POWER_SUPPLY 1 by enabling PSU_CONTROL and setting PSU_ACTIVE_STATE to 'LOW'." #elif POWER_SUPPLY == 2 #error "Replace POWER_SUPPLY 2 by enabling PSU_CONTROL and setting PSU_ACTIVE_STATE to 'HIGH'." #elif defined(POWER_SUPPLY) - #error "POWER_SUPPLY is now obsolete. Please remove it from Configuration.h." + #error "POWER_SUPPLY is now obsolete. Please remove it." #elif defined(MKS_ROBIN_TFT) - #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. Please update your configuration." + #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT." #elif defined(SDPOWER) - #error "SDPOWER is now SDPOWER_PIN. Please update your configuration and/or pins." + #error "SDPOWER is now SDPOWER_PIN." #elif defined(STRING_SPLASH_LINE1) || defined(STRING_SPLASH_LINE2) - #error "STRING_SPLASH_LINE[12] are now obsolete. Please remove them from Configuration.h." + #error "STRING_SPLASH_LINE[12] are now obsolete. Please remove them." #elif defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_X) || defined(Z_PROBE_ALLEN_KEY_STOW_1_X) - #error "Z_PROBE_ALLEN_KEY_(DEPLOY|STOW) coordinates are now a single setting. Please update your configuration." + #error "Z_PROBE_ALLEN_KEY_(DEPLOY|STOW) coordinates are now a single setting." #elif defined(X_PROBE_OFFSET_FROM_EXTRUDER) || defined(Y_PROBE_OFFSET_FROM_EXTRUDER) || defined(Z_PROBE_OFFSET_FROM_EXTRUDER) - #error "[XYZ]_PROBE_OFFSET_FROM_EXTRUDER is now NOZZLE_TO_PROBE_OFFSET. Please update your configuration." + #error "[XYZ]_PROBE_OFFSET_FROM_EXTRUDER is now NOZZLE_TO_PROBE_OFFSET." #elif defined(MIN_PROBE_X) || defined(MIN_PROBE_Y) || defined(MAX_PROBE_X) || defined(MAX_PROBE_Y) - #error "(MIN|MAX)_PROBE_[XY] are now calculated at runtime. Please remove them from Configuration.h." + #error "(MIN|MAX)_PROBE_[XY] are now calculated at runtime. Please remove them." #elif defined(Z_STEPPER_ALIGN_X) || defined(Z_STEPPER_ALIGN_X) - #error "Z_STEPPER_ALIGN_X and Z_STEPPER_ALIGN_Y are now combined as Z_STEPPER_ALIGN_XY. Please update your Configuration_adv.h." + #error "Z_STEPPER_ALIGN_X and Z_STEPPER_ALIGN_Y are now combined as Z_STEPPER_ALIGN_XY." #elif defined(JUNCTION_DEVIATION) - #error "JUNCTION_DEVIATION is no longer required. (See CLASSIC_JERK). Please remove it from Configuration.h." + #error "JUNCTION_DEVIATION is no longer required. (See CLASSIC_JERK). Please remove it." #elif defined(BABYSTEP_MULTIPLICATOR) - #error "BABYSTEP_MULTIPLICATOR is now BABYSTEP_MULTIPLICATOR_[XY|Z]. Please update Configuration_adv.h." + #error "BABYSTEP_MULTIPLICATOR is now BABYSTEP_MULTIPLICATOR_[XY|Z]." #elif defined(LULZBOT_TOUCH_UI) - #error "LULZBOT_TOUCH_UI is now TOUCH_UI_FTDI_EVE. Please update your configuration." + #error "LULZBOT_TOUCH_UI is now TOUCH_UI_FTDI_EVE." #elif defined(PS_DEFAULT_OFF) - #error "PS_DEFAULT_OFF is now PSU_DEFAULT_OFF. Please update your configuration." + #error "PS_DEFAULT_OFF is now PSU_DEFAULT_OFF." #elif defined(FILAMENT_UNLOAD_RETRACT_LENGTH) - #error "FILAMENT_UNLOAD_RETRACT_LENGTH is now FILAMENT_UNLOAD_PURGE_RETRACT. Please update Configuration_adv.h." + #error "FILAMENT_UNLOAD_RETRACT_LENGTH is now FILAMENT_UNLOAD_PURGE_RETRACT." #elif defined(FILAMENT_UNLOAD_DELAY) - #error "FILAMENT_UNLOAD_DELAY is now FILAMENT_UNLOAD_PURGE_DELAY. Please update Configuration_adv.h." + #error "FILAMENT_UNLOAD_DELAY is now FILAMENT_UNLOAD_PURGE_DELAY." #elif defined(HOME_USING_SPREADCYCLE) - #error "HOME_USING_SPREADCYCLE is now obsolete. Please remove it from Configuration_adv.h." + #error "HOME_USING_SPREADCYCLE is now obsolete. Please remove it." #elif defined(DGUS_LCD) - #error "DGUS_LCD is now DGUS_LCD_UI_(ORIGIN|FYSETC|HIPRECY). Please update your configuration." + #error "DGUS_LCD is now DGUS_LCD_UI_(ORIGIN|FYSETC|HIPRECY)." #elif defined(DGUS_SERIAL_PORT) - #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." + #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT." #elif defined(DGUS_BAUDRATE) - #error "DGUS_BAUDRATE is now LCD_BAUDRATE. Please update your configuration." + #error "DGUS_BAUDRATE is now LCD_BAUDRATE." #elif defined(DGUS_STATS_RX_BUFFER_OVERRUNS) - #error "DGUS_STATS_RX_BUFFER_OVERRUNS is now STATS_RX_BUFFER_OVERRUNS. Please update your configuration." -#elif defined(DGUS_SERIAL_PORT) - #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." + #error "DGUS_STATS_RX_BUFFER_OVERRUNS is now STATS_RX_BUFFER_OVERRUNS." #elif defined(ANYCUBIC_LCD_SERIAL_PORT) - #error "ANYCUBIC_LCD_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." + #error "ANYCUBIC_LCD_SERIAL_PORT is now LCD_SERIAL_PORT." #elif defined(INTERNAL_SERIAL_PORT) - #error "INTERNAL_SERIAL_PORT is now MMU2_SERIAL_PORT. Please update your configuration." -#elif defined(X_DUAL_ENDSTOPS_ADJUSTMENT) - #error "X_DUAL_ENDSTOPS_ADJUSTMENT is now X2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." -#elif defined(Y_DUAL_ENDSTOPS_ADJUSTMENT) - #error "Y_DUAL_ENDSTOPS_ADJUSTMENT is now Y2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." -#elif defined(Z_DUAL_ENDSTOPS_ADJUSTMENT) - #error "Z_DUAL_ENDSTOPS_ADJUSTMENT is now Z2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." + #error "INTERNAL_SERIAL_PORT is now MMU2_SERIAL_PORT." +#elif defined(X_DUAL_ENDSTOPS_ADJUSTMENT) || defined(Y_DUAL_ENDSTOPS_ADJUSTMENT) || defined(Z_DUAL_ENDSTOPS_ADJUSTMENT) + #error "[XYZ]_DUAL_ENDSTOPS_ADJUSTMENT is now [XYZ]2_ENDSTOP_ADJUSTMENT." #elif defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT2) || defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT3) - #error "Z_TRIPLE_ENDSTOPS_ADJUSTMENT[23] is now Z[23]_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." + #error "Z_TRIPLE_ENDSTOPS_ADJUSTMENT[23] is now Z[23]_ENDSTOP_ADJUSTMENT." #elif defined(Z_QUAD_ENDSTOPS_ADJUSTMENT2) || defined(Z_QUAD_ENDSTOPS_ADJUSTMENT3) || defined(Z_QUAD_ENDSTOPS_ADJUSTMENT4) - #error "Z_QUAD_ENDSTOPS_ADJUSTMENT[234] is now Z[234]_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." + #error "Z_QUAD_ENDSTOPS_ADJUSTMENT[234] is now Z[234]_ENDSTOP_ADJUSTMENT." #elif defined(Z_DUAL_STEPPER_DRIVERS) - #error "Z_DUAL_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 2. Please update Configuration_adv.h." + #error "Z_DUAL_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 2." #elif defined(Z_TRIPLE_STEPPER_DRIVERS) - #error "Z_TRIPLE_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 3. Please update Configuration_adv.h." + #error "Z_TRIPLE_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 3." #elif defined(Z_QUAD_STEPPER_DRIVERS) - #error "Z_QUAD_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 4. Please update Configuration_adv.h." -#elif defined(Z_DUAL_ENDSTOPS) - #error "Z_DUAL_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." -#elif defined(Z_TRIPLE_ENDSTOPS) - #error "Z_TRIPLE_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." -#elif defined(Z_QUAD_ENDSTOPS) - #error "Z_QUAD_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." + #error "Z_QUAD_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 4." +#elif defined(Z_DUAL_ENDSTOPS) || defined(Z_TRIPLE_ENDSTOPS) || defined(Z_QUAD_ENDSTOPS) + #error "Z_(DUAL|TRIPLE|QUAD)_ENDSTOPS is now Z_MULTI_ENDSTOPS." #elif defined(DUGS_UI_MOVE_DIS_OPTION) - #error "DUGS_UI_MOVE_DIS_OPTION is spelled DGUS_UI_MOVE_DIS_OPTION. Please update Configuration_adv.h." + #error "DUGS_UI_MOVE_DIS_OPTION is spelled DGUS_UI_MOVE_DIS_OPTION." #elif defined(ORIG_E0_AUTO_FAN_PIN) || defined(ORIG_E1_AUTO_FAN_PIN) || defined(ORIG_E2_AUTO_FAN_PIN) || defined(ORIG_E3_AUTO_FAN_PIN) || defined(ORIG_E4_AUTO_FAN_PIN) || defined(ORIG_E5_AUTO_FAN_PIN) || defined(ORIG_E6_AUTO_FAN_PIN) || defined(ORIG_E7_AUTO_FAN_PIN) - #error "ORIG_Ex_AUTO_FAN_PIN is now just Ex_AUTO_FAN_PIN. Make sure your pins are up to date." + #error "ORIG_Ex_AUTO_FAN_PIN is now just Ex_AUTO_FAN_PIN." #elif defined(ORIG_CHAMBER_AUTO_FAN_PIN) - #error "ORIG_CHAMBER_AUTO_FAN_PIN is now just CHAMBER_AUTO_FAN_PIN. Make sure your pins are up to date." + #error "ORIG_CHAMBER_AUTO_FAN_PIN is now just CHAMBER_AUTO_FAN_PIN." #elif defined(HOMING_BACKOFF_MM) - #error "HOMING_BACKOFF_MM is now HOMING_BACKOFF_POST_MM. Please update Configuration_adv.h." + #error "HOMING_BACKOFF_MM is now HOMING_BACKOFF_POST_MM." #elif defined(X_HOME_BUMP_MM) || defined(Y_HOME_BUMP_MM) || defined(Z_HOME_BUMP_MM) - #error "[XYZ]_HOME_BUMP_MM is now HOMING_BUMP_MM. Please update Configuration_adv.h." + #error "[XYZ]_HOME_BUMP_MM is now HOMING_BUMP_MM." #elif defined(DIGIPOT_I2C) - #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." + #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018)." #elif defined(TOUCH_BUTTONS) - #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." -#elif defined(LCD_FULL_PIXEL_HEIGHT) - #error "LCD_FULL_PIXEL_HEIGHT is deprecated and should be removed. Please update your Configuration.h." -#elif defined(LCD_FULL_PIXEL_WIDTH) - #error "LCD_FULL_PIXEL_WIDTH is deprecated and should be removed. Please update your Configuration.h." + #error "TOUCH_BUTTONS is now TOUCH_SCREEN." +#elif defined(LCD_FULL_PIXEL_HEIGHT) || defined(LCD_FULL_PIXEL_WIDTH) + #error "LCD_FULL_PIXEL_(WIDTH|HEIGHT) is deprecated and should be removed." #elif defined(FSMC_UPSCALE) - #error "FSMC_UPSCALE is now GRAPHICAL_TFT_UPSCALE. Please update your Configuration.h." + #error "FSMC_UPSCALE is now GRAPHICAL_TFT_UPSCALE." #elif defined(ANYCUBIC_TFT_MODEL) - #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." + #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA." #elif defined(EVENT_GCODE_SD_STOP) - #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT. Please update your Configuration.h." + #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT." #elif defined(GRAPHICAL_TFT_ROTATE_180) - #error "GRAPHICAL_TFT_ROTATE_180 is now TFT_ROTATION set to TFT_ROTATE_180. Please update your Configuration.h." + #error "GRAPHICAL_TFT_ROTATE_180 is now TFT_ROTATION set to TFT_ROTATE_180." #elif defined(FIL_RUNOUT_INVERTING) #if FIL_RUNOUT_INVERTING - #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update your Configuration.h." + #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH." #else - #error "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW. Please update your Configuration.h." + #error "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW." #endif #endif @@ -552,11 +538,11 @@ */ #if ENABLED(PROBE_TEMP_COMPENSATION) #if defined(PTC_PARK_POS_X) || defined(PTC_PARK_POS_Y) || defined(PTC_PARK_POS_Z) - #error "PTC_PARK_POS_[XYZ] is now PTC_PARK_POS (array). Please update Configuration_adv.h." + #error "PTC_PARK_POS_[XYZ] is now PTC_PARK_POS (array)." #elif !defined(PTC_PARK_POS) #error "PROBE_TEMP_COMPENSATION requires PTC_PARK_POS." #elif defined(PTC_PROBE_POS_X) || defined(PTC_PROBE_POS_Y) - #error "PTC_PROBE_POS_[XY] is now PTC_PROBE_POS (array). Please update Configuration_adv.h." + #error "PTC_PROBE_POS_[XY] is now PTC_PROBE_POS (array)." #elif !defined(PTC_PROBE_POS) #error "PROBE_TEMP_COMPENSATION requires PTC_PROBE_POS." #endif @@ -587,9 +573,13 @@ * Serial */ #ifndef SERIAL_PORT - #error "SERIAL_PORT must be defined in Configuration.h" + #error "SERIAL_PORT must be defined." #elif defined(SERIAL_PORT_2) && SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT. Please update your configuration." + #error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT." +#elif defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == SERIAL_PORT + #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT." +#elif defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == SERIAL_PORT_2 + #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2." #endif #if !(defined(__AVR__) && defined(USBCON)) #if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 @@ -845,7 +835,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif DISABLED(NOZZLE_PARK_FEATURE) #error "ADVANCED_PAUSE_FEATURE requires NOZZLE_PARK_FEATURE." #elif !defined(FILAMENT_UNLOAD_PURGE_FEEDRATE) - #error "ADVANCED_PAUSE_FEATURE requires FILAMENT_UNLOAD_PURGE_FEEDRATE. Please add it to Configuration_adv.h." + #error "ADVANCED_PAUSE_FEATURE requires FILAMENT_UNLOAD_PURGE_FEEDRATE." #elif ENABLED(EXTRUDER_RUNOUT_PREVENT) #error "EXTRUDER_RUNOUT_PREVENT is incompatible with ADVANCED_PAUSE_FEATURE." #elif ENABLED(PARK_HEAD_ON_PAUSE) && NONE(SDSUPPORT, IS_NEWPANEL, EMERGENCY_PARSER) @@ -892,24 +882,24 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) #ifndef TOOLCHANGE_FS_LENGTH - #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_LENGTH. Please update your Configuration_adv.h." + #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_LENGTH." #elif !defined(TOOLCHANGE_FS_RETRACT_SPEED) - #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_RETRACT_SPEED. Please update your Configuration_adv.h." + #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_RETRACT_SPEED." #elif !defined(TOOLCHANGE_FS_PRIME_SPEED) - #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_PRIME_SPEED. Please update your Configuration_adv.h." + #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_PRIME_SPEED." #endif #endif #if ENABLED(TOOLCHANGE_PARK) #ifndef TOOLCHANGE_PARK_XY - #error "TOOLCHANGE_PARK requires TOOLCHANGE_PARK_XY. Please update your Configuration." + #error "TOOLCHANGE_PARK requires TOOLCHANGE_PARK_XY." #elif !defined(TOOLCHANGE_PARK_XY_FEEDRATE) - #error "TOOLCHANGE_PARK requires TOOLCHANGE_PARK_XY_FEEDRATE. Please update your Configuration." + #error "TOOLCHANGE_PARK requires TOOLCHANGE_PARK_XY_FEEDRATE." #endif #endif #ifndef TOOLCHANGE_ZRAISE - #error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1. Please update your Configuration_adv.h." + #error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1." #endif #elif ENABLED(MK2_MULTIPLEXER) @@ -922,7 +912,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * Sanity checking for the Průša MK2 Multiplexer */ #ifdef SNMM - #error "SNMM is now MK2_MULTIPLEXER. Please update your configuration." + #error "SNMM is now MK2_MULTIPLEXER." #endif /** @@ -1221,7 +1211,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(EXT_SOLENOID) #error "SOLENOID_PROBE is incompatible with EXT_SOLENOID." #elif !HAS_SOLENOID_1 - #error "SOLENOID_PROBE requires SOL1_PIN. It can be added to your Configuration.h." + #error "SOLENOID_PROBE requires SOL1_PIN." #endif #endif @@ -1388,7 +1378,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if IS_SCARA #error "AUTO_BED_LEVELING_UBL does not yet support SCARA printers." #elif DISABLED(EEPROM_SETTINGS) - #error "AUTO_BED_LEVELING_UBL requires EEPROM_SETTINGS. Please update your configuration." + #error "AUTO_BED_LEVELING_UBL requires EEPROM_SETTINGS." #elif !WITHIN(GRID_MAX_POINTS_X, 3, 15) || !WITHIN(GRID_MAX_POINTS_Y, 3, 15) #error "GRID_MAX_POINTS_[XY] must be a whole number between 3 and 15." #elif !defined(RESTORE_LEVELING_AFTER_G28) @@ -1777,22 +1767,22 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #if TEMP_SENSOR_CHAMBER && !PIN_EXISTS(TEMP_CHAMBER) - #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN. Please add it to your configuration." + #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN." #endif #if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2)) - #error "CHAMBER_FAN_MODE must be between 0 and 2. Please update your Configuration_adv.h." + #error "CHAMBER_FAN_MODE must be between 0 and 2." #endif #if ENABLED(CHAMBER_VENT) #ifndef CHAMBER_VENT_SERVO_NR - #error "CHAMBER_VENT_SERVO_NR is required for CHAMBER SERVO. Update your Configuration_adv.h." + #error "CHAMBER_VENT_SERVO_NR is required for CHAMBER SERVO." #elif !NUM_SERVOS #error "NUM_SERVOS is required for a Heated Chamber vent servo (CHAMBER_VENT_SERVO_NR)." #elif CHAMBER_VENT_SERVO_NR >= NUM_SERVOS #error "CHAMBER_VENT_SERVO_NR must be smaller than NUM_SERVOS." #elif HAS_Z_SERVO_PROBE && CHAMBER_VENT_SERVO_NR == Z_PROBE_SERVO_NR - #error "CHAMBER SERVO is already used by BLTOUCH. Please change." + #error "CHAMBER SERVO is already used by BLTOUCH." #elif CHAMBER_VENT_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) #error "SERVO0_PIN must be defined for your Heated Chamber vent servo." #elif CHAMBER_VENT_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) @@ -1806,7 +1796,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if TEMP_SENSOR_PROBE #if !PIN_EXISTS(TEMP_PROBE) - #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN. Please add it to your configuration." + #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN." #elif !HAS_TEMP_ADC_PROBE #error "TEMP_PROBE_PIN must be an ADC pin." #elif !ENABLED(FIX_MOUNTED_PROBE) @@ -1819,9 +1809,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #if MAX6675_0_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS_0) && defined(MAX31865_CALIBRATION_OHMS_0)) - #error "MAX31865_SENSOR_OHMS_0 and MAX31865_CALIBRATION_OHMS_0 must be set in Configuration.h if TEMP_SENSOR_0 is MAX31865." + #error "MAX31865_SENSOR_OHMS_0 and MAX31865_CALIBRATION_OHMS_0 must be set if TEMP_SENSOR_0 is MAX31865." #elif MAX6675_1_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS_1) && defined(MAX31865_CALIBRATION_OHMS_1)) - #error "MAX31865_SENSOR_OHMS_1 and MAX31865_CALIBRATION_OHMS_1 must be set in Configuration.h if TEMP_SENSOR_1 is MAX31865." + #error "MAX31865_SENSOR_OHMS_1 and MAX31865_CALIBRATION_OHMS_1 must be set if TEMP_SENSOR_1 is MAX31865." #endif /** @@ -2328,17 +2318,17 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal */ #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == SERIAL_PORT - #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." + #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT." #elif defined(SERIAL_PORT_2) && LCD_SERIAL_PORT == SERIAL_PORT_2 - #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." + #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2." #endif #else #if HAS_DGUS_LCD - #error "The DGUS LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #error "The DGUS LCD requires LCD_SERIAL_PORT to be defined." #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - #error "The ANYCUBIC LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #error "The ANYCUBIC LCD requires LCD_SERIAL_PORT to be defined." #elif ENABLED(MALYAN_LCD) - #error "MALYAN_LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #error "MALYAN_LCD requires LCD_SERIAL_PORT to be defined." #endif #endif @@ -2827,7 +2817,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS) - #error "PRINTCOUNTER requires EEPROM_SETTINGS. Please update your Configuration." + #error "PRINTCOUNTER requires EEPROM_SETTINGS." #endif #if ENABLED(USB_FLASH_DRIVE_SUPPORT) && !PINS_EXIST(USB_CS, USB_INTR) @@ -2972,11 +2962,11 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #if (PIN_EXISTS(CHDK) + PIN_EXISTS(PHOTOGRAPH) + defined(PHOTO_SWITCH_POSITION)) > 1 #error "Please define only one of CHDK_PIN, PHOTOGRAPH_PIN, or PHOTO_SWITCH_POSITION." #elif defined(PHOTO_SWITCH_POSITION) && !defined(PHOTO_POSITION) - #error "PHOTO_SWITCH_POSITION requires PHOTO_POSITION. Please update your Configuration_adv.h." + #error "PHOTO_SWITCH_POSITION requires PHOTO_POSITION." #elif PIN_EXISTS(CHDK) && defined(CHDK_DELAY) - #error "CHDK_DELAY has been replaced by PHOTO_SWITCH_MS. Please update your Configuration_adv.h." + #error "CHDK_DELAY has been replaced by PHOTO_SWITCH_MS." #elif PIN_EXISTS(CHDK) && !defined(PHOTO_SWITCH_MS) - #error "PHOTO_SWITCH_MS is required with CHDK_PIN. Please update your Configuration_adv.h." + #error "PHOTO_SWITCH_MS is required with CHDK_PIN." #elif defined(PHOTO_RETRACT_MM) static_assert(PHOTO_RETRACT_MM + 0 >= 0, "PHOTO_RETRACT_MM must be >= 0."); #endif @@ -3038,16 +3028,16 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #if HAS_CUTTER #ifndef CUTTER_POWER_UNIT - #error "CUTTER_POWER_UNIT is required with a spindle or laser. Please update your Configuration_adv.h." + #error "CUTTER_POWER_UNIT is required with a spindle or laser." #elif !CUTTER_UNIT_IS(PWM255) && !CUTTER_UNIT_IS(PERCENT) && !CUTTER_UNIT_IS(RPM) && !CUTTER_UNIT_IS(SERVO) - #error "CUTTER_POWER_UNIT must be PWM255, PERCENT, RPM, or SERVO. Please update your Configuration_adv.h." + #error "CUTTER_POWER_UNIT must be PWM255, PERCENT, RPM, or SERVO." #endif #if ENABLED(LASER_POWER_INLINE) #if ENABLED(SPINDLE_CHANGE_DIR) #error "SPINDLE_CHANGE_DIR and LASER_POWER_INLINE are incompatible." #elif ENABLED(LASER_MOVE_G0_OFF) && DISABLED(LASER_MOVE_POWER) - #error "LASER_MOVE_G0_OFF requires LASER_MOVE_POWER. Please update your Configuration_adv.h." + #error "LASER_MOVE_G0_OFF requires LASER_MOVE_POWER." #endif #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) #if DISABLED(SPINDLE_LASER_PWM) From 3ee61e2084ce589481830f1dbbfc9c1627bddfe9 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 12 Nov 2020 20:26:49 -0800 Subject: [PATCH 0562/1370] UTF longname followup (#20115) --- Marlin/src/sd/SdBaseFile.cpp | 63 ++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index acc5ba17f2..db2a9e2de9 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -1109,8 +1109,8 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { // We can't reconvert to UTF-8 here as UTF-8 is variable-size encoding, but joining LFN blocks // needs static bytes addressing. So here just store full UTF-16LE words to re-convert later. uint16_t idx = (n + i) * 2; // This is fixed as FAT LFN always contain UTF-16LE encoding - longFilename[idx] = utf16_ch & 0xFF; - longFilename[idx+1] = (utf16_ch >> 8) & 0xFF; + longFilename[idx] = utf16_ch & 0xFF; + longFilename[idx + 1] = (utf16_ch >> 8) & 0xFF; #else // Replace all multibyte characters to '_' longFilename[n + i] = (utf16_ch > 0xFF) ? '_' : (utf16_ch & 0xFF); @@ -1122,45 +1122,44 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { } } - // Return if normal file or subdirectory + // Post-process normal file or subdirectory longname, if any if (DIR_IS_FILE_OR_SUBDIR(dir)) { #if ENABLED(UTF_FILENAME_SUPPORT) - // Convert filename from utf-16 to utf-8 as Marlin expects #if LONG_FILENAME_CHARSIZE > 2 // Add warning for developers for currently not supported 3-byte cases (Conversion series of 2-byte // codepoints to 3-byte in-place will break the rest of filename) #error "Currently filename re-encoding is done in-place. It may break the remaining chars to use 3-byte codepoints." #endif - uint16_t currentPos = 0; - LOOP_L_N(i, (LONG_FILENAME_LENGTH / 2)) { - uint16_t idx = i * 2; // This is fixed as FAT LFN always contain UTF-16LE encoding - uint16_t utf16_ch = longFilename[idx] | (longFilename[idx + 1] << 8); - if (0xD800 == (utf16_ch & 0xF800)) // Surrogate pair - encode as '_' - longFilename[currentPos++] = '_'; - else if (0 == (utf16_ch & 0xFF80)) // Encode as 1-byte utf-8 char - longFilename[currentPos++] = utf16_ch & 0x007F; - else if (0 == (utf16_ch & 0xF800)) { // Encode as 2-byte utf-8 char - longFilename[currentPos++] = 0xC0 | ((utf16_ch >> 6) & 0x1F); - longFilename[currentPos++] = 0x80 | (utf16_ch & 0x3F); - } - else { - #if LONG_FILENAME_CHARSIZE > 2 // Encode as 3-byte utf-8 char - longFilename[currentPos++] = 0xE0 | ((utf16_ch >> 12) & 0x0F); - longFilename[currentPos++] = 0xC0 | ((utf16_ch >> 6) & 0x3F); - longFilename[currentPos++] = 0xC0 | (utf16_ch & 0x3F); - #else // Encode as '_' - longFilename[currentPos++] = '_'; - #endif - } - - if (0 == utf16_ch) break; // End of filename - } - return currentPos; - #else - return n; + // Is there a long filename to decode? + if (longFilename) { + // Reset n to the start of the long name + n = 0; + for (uint16_t idx = 0; idx < (LONG_FILENAME_LENGTH) / 2; idx += 2) { // idx is fixed since FAT LFN always contains UTF-16LE encoding + uint16_t utf16_ch = longFilename[idx] | (longFilename[idx + 1] << 8); + if (0xD800 == (utf16_ch & 0xF800)) // Surrogate pair - encode as '_' + longFilename[n++] = '_'; + else if (0 == (utf16_ch & 0xFF80)) // Encode as 1-byte UTF-8 char + longFilename[n++] = utf16_ch & 0x007F; + else if (0 == (utf16_ch & 0xF800)) { // Encode as 2-byte UTF-8 char + longFilename[n++] = 0xC0 | ((utf16_ch >> 6) & 0x1F); + longFilename[n++] = 0x80 | ( utf16_ch & 0x3F); + } + else { + #if LONG_FILENAME_CHARSIZE > 2 // Encode as 3-byte UTF-8 char + longFilename[n++] = 0xE0 | ((utf16_ch >> 12) & 0x0F); + longFilename[n++] = 0xC0 | ((utf16_ch >> 6) & 0x3F); + longFilename[n++] = 0xC0 | ( utf16_ch & 0x3F); + #else // Encode as '_' + longFilename[n++] = '_'; + #endif + } + if (0 == utf16_ch) break; // End of filename + } // idx + } // longFilename #endif - } + return n; + } // DIR_IS_FILE_OR_SUBDIR } } From 7b745345f732e05855d15552b811954de3d03f7f Mon Sep 17 00:00:00 2001 From: LinFor Date: Fri, 13 Nov 2020 07:49:19 +0300 Subject: [PATCH 0563/1370] Fix UTF filename scroll (#20121) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- Marlin/src/lcd/fontutils.cpp | 42 ++++++++++++++++++++++----- Marlin/src/lcd/fontutils.h | 4 +++ Marlin/src/lcd/marlinui.cpp | 14 ++++----- 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 480721e56a..4e265a8ee4 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -461,8 +461,8 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { if (mark_as_selected(row, sel)) { + const uint8_t maxlen = LCD_WIDTH - isDir; if (isDir) lcd_put_wchar(LCD_STR_FOLDER[0]); - constexpr uint8_t maxlen = LCD_WIDTH - 1; const pixel_len_t pixw = maxlen * (MENU_FONT_WIDTH); pixel_len_t n = pixw - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), pixw); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp index 4aaf621844..65c8c06409 100644 --- a/Marlin/src/lcd/fontutils.cpp +++ b/Marlin/src/lcd/fontutils.cpp @@ -75,6 +75,11 @@ int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, return -1; } +/* Returns true if passed byte is first byte of UTF-8 char sequence */ +static inline bool utf8_is_start_byte_of_char(const uint8_t b) { + return 0x80 != (b & 0xC0); +} + /* This function gets the character at the pstart position, interpreting UTF8 multibyte sequences and returns the pointer to the next character */ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval) { @@ -131,8 +136,8 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t p++; } #endif - else if (0x80 == (0xC0 & valcur)) - for (; 0x80 == (0xC0 & valcur); ) { p++; valcur = cb_read_byte(p); } + else if (!utf8_is_start_byte_of_char(valcur)) + for (; !utf8_is_start_byte_of_char(valcur); ) { p++; valcur = cb_read_byte(p); } else for (; 0xFC < (0xFE & valcur); ) { p++; valcur = cb_read_byte(p); } @@ -143,12 +148,12 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t static inline uint8_t utf8_strlen_cb(const char *pstart, read_byte_cb_t cb_read_byte) { uint8_t cnt = 0; - uint8_t *pnext = (uint8_t *)pstart; + uint8_t *p = (uint8_t *)pstart; for (;;) { - wchar_t ch; - pnext = get_utf8_value_cb(pnext, cb_read_byte, &ch); - if (!ch) break; - cnt++; + const uint8_t b = cb_read_byte(p); + if (!b) break; + if (utf8_is_start_byte_of_char(b)) cnt++; + p++; } return cnt; } @@ -160,3 +165,26 @@ uint8_t utf8_strlen(const char *pstart) { uint8_t utf8_strlen_P(PGM_P pstart) { return utf8_strlen_cb(pstart, read_byte_rom); } + +static inline uint8_t utf8_byte_pos_by_char_num_cb(const char *pstart, read_byte_cb_t cb_read_byte, const uint8_t charnum) { + uint8_t *p = (uint8_t *)pstart; + uint8_t char_idx = 0; + uint8_t byte_idx = 0; + for (;;) { + const uint8_t b = cb_read_byte(p + byte_idx); + if (!b) return byte_idx; // Termination byte of string + if (utf8_is_start_byte_of_char(b)) { + char_idx++; + if (char_idx == charnum + 1) return byte_idx; + } + byte_idx++; + } +} + +uint8_t utf8_byte_pos_by_char_num(const char *pstart, const uint8_t charnum) { + return utf8_byte_pos_by_char_num_cb(pstart, read_byte_ram, charnum); +} + +uint8_t utf8_byte_pos_by_char_num_P(PGM_P pstart, const uint8_t charnum) { + return utf8_byte_pos_by_char_num_cb(pstart, read_byte_rom, charnum); +} diff --git a/Marlin/src/lcd/fontutils.h b/Marlin/src/lcd/fontutils.h index 74c4a87fb9..04ff81148f 100644 --- a/Marlin/src/lcd/fontutils.h +++ b/Marlin/src/lcd/fontutils.h @@ -41,3 +41,7 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t /* Returns length of string in CHARACTERS, NOT BYTES */ uint8_t utf8_strlen(const char *pstart); uint8_t utf8_strlen_P(PGM_P pstart); + +/* Returns start byte position of desired char number */ +uint8_t utf8_byte_pos_by_char_num(const char *pstart, const uint8_t charnum); +uint8_t utf8_byte_pos_by_char_num_P(PGM_P pstart, const uint8_t charnum); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 17c3c3edfe..457d3cefd7 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -208,10 +208,13 @@ millis_t MarlinUI::next_button_update_ms; // = 0 filename_scroll_pos = 0; // Reset scroll to the start lcd_status_update_delay = 8; // Don't scroll right away } - outstr += filename_scroll_pos; + // Advance byte position corresponding to filename_scroll_pos char position + outstr += TERN(UTF_FILENAME_SUPPORT, utf8_byte_pos_by_char_num(outstr, filename_scroll_pos), filename_scroll_pos); } #else - theCard.longFilename[maxlen] = '\0'; // cutoff at screen edge + theCard.longFilename[ + TERN(UTF_FILENAME_SUPPORT, utf8_byte_pos_by_char_num(theCard.longFilename, maxlen), maxlen) + ] = '\0'; // cutoff at screen edge #endif } return outstr; @@ -1006,11 +1009,8 @@ void MarlinUI::update() { // If scrolling of long file names is enabled and we are in the sd card menu, // cause a refresh to occur until all the text has scrolled into view. if (currentScreen == menu_media && !lcd_status_update_delay--) { - lcd_status_update_delay = 4; - if (++filename_scroll_pos > filename_scroll_max) { - filename_scroll_pos = 0; - lcd_status_update_delay = 12; - } + lcd_status_update_delay = ++filename_scroll_pos >= filename_scroll_max ? 12 : 4; // Long delay at end and start + if (filename_scroll_pos > filename_scroll_max) filename_scroll_pos = 0; refresh(LCDVIEW_REDRAW_NOW); RESET_STATUS_TIMEOUT(); } From dc949f5488b696cd9dc0e57a316c125eb385b9f3 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Thu, 12 Nov 2020 23:54:18 -0500 Subject: [PATCH 0564/1370] G34 Z stepper locking (#20091) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/calibrate/G28.cpp | 5 + Marlin/src/gcode/calibrate/G34_M422.cpp | 704 +++++++++++++----------- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 2 +- Marlin/src/inc/SanityCheck.h | 7 +- platformio.ini | 1 + 6 files changed, 382 insertions(+), 339 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index ef39290d2d..c0bc179869 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -375,6 +375,11 @@ void GcodeSuite::G28() { // Home Z last if homing towards the bed #if DISABLED(HOME_Z_FIRST) if (doZ) { + #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + stepper.set_all_z_lock(false); + stepper.set_separate_multi_axis(false); + #endif + TERN_(BLTOUCH, bltouch.init()); TERN(Z_SAFE_HOMING, home_z_safely(), homeaxis(Z_AXIS)); probe.move_z_after_homing(); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 5e1ec5b961..8d3dd0d06b 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfigPre.h" -#if ENABLED(Z_STEPPER_AUTO_ALIGN) +#if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) #include "../../feature/z_stepper_align.h" @@ -51,364 +51,398 @@ /** * G34: Z-Stepper automatic alignment * - * I - * T - * A - * R points based on current probe offsets + * Manual stepper lock controls (reset by G28): + * L Unlock all steppers + * Z<1-4> Z stepper to lock / unlock + * S 0=UNLOCKED 1=LOCKED. If omitted, assume LOCKED. + * + * Examples: + * G34 Z1 ; Lock Z1 + * G34 L Z2 ; Unlock all, then lock Z2 + * G34 Z2 S0 ; Unlock Z2 + * + * With Z_STEPPER_AUTO_ALIGN: + * I Number of tests. If omitted, Z_STEPPER_ALIGN_ITERATIONS. + * T Target Accuracy factor. If omitted, Z_STEPPER_ALIGN_ACC. + * A Provide an Amplification value. If omitted, Z_STEPPER_ALIGN_AMP. + * R Flag to recalculate points based on current probe offsets */ void GcodeSuite::G34() { DEBUG_SECTION(log_G34, "G34", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) log_machine_info(); - do { // break out on error + planner.synchronize(); // Prevent damage - #if NUM_Z_STEPPER_DRIVERS == 4 - SERIAL_ECHOLNPGM("Alignment for 4 steppers is Experimental!"); - #elif NUM_Z_STEPPER_DRIVERS > 4 - SERIAL_ECHOLNPGM("Alignment not supported for over 4 steppers"); - break; - #endif + const bool seenL = parser.seen('L'); + if (seenL) stepper.set_all_z_lock(false); - const int8_t z_auto_align_iterations = parser.intval('I', Z_STEPPER_ALIGN_ITERATIONS); - if (!WITHIN(z_auto_align_iterations, 1, 30)) { - SERIAL_ECHOLNPGM("?(I)teration out of bounds (1-30)."); - break; + const bool seenZ = parser.seenval('Z'); + if (seenZ) { + const bool state = parser.boolval('S', true); + switch (parser.intval('Z')) { + case 1: stepper.set_z1_lock(state); break; + case 2: stepper.set_z2_lock(state); break; + #if NUM_Z_STEPPER_DRIVERS >= 3 + case 3: stepper.set_z3_lock(state); break; + #if NUM_Z_STEPPER_DRIVERS >= 4 + case 4: stepper.set_z4_lock(state); break; + #endif + #endif } + } - const float z_auto_align_accuracy = parser.floatval('T', Z_STEPPER_ALIGN_ACC); - if (!WITHIN(z_auto_align_accuracy, 0.01f, 1.0f)) { - SERIAL_ECHOLNPGM("?(T)arget accuracy out of bounds (0.01-1.0)."); - break; - } + if (seenL || seenZ) { + stepper.set_separate_multi_axis(seenZ); + return; + } - const float z_auto_align_amplification = - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - Z_STEPPER_ALIGN_AMP; - #else - parser.floatval('A', Z_STEPPER_ALIGN_AMP); - if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) { - SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0)."); - break; - } + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + do { // break out on error + + #if NUM_Z_STEPPER_DRIVERS == 4 + SERIAL_ECHOLNPGM("Alignment for 4 steppers is Experimental!"); + #elif NUM_Z_STEPPER_DRIVERS > 4 + SERIAL_ECHOLNPGM("Alignment not supported for over 4 steppers"); + break; #endif - if (parser.seen('R')) z_stepper_align.reset_to_default(); - - const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - - // Wait for planner moves to finish! - planner.synchronize(); - - // Disable the leveling matrix before auto-aligning - #if HAS_LEVELING - TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active); - set_bed_leveling_enabled(false); - #endif - - TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); - - // Always home with tool 0 active - #if HAS_MULTI_HOTEND - const uint8_t old_tool_index = active_extruder; - tool_change(0, true); - #endif - - TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false)); - - // In BLTOUCH HS mode, the probe travels in a deployed state. - // Users of G34 might have a badly misaligned bed, so raise Z by the - // length of the deployed pin (BLTOUCH stroke < 7mm) - #define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE)) - - // Compute a worst-case clearance height to probe from. After the first - // iteration this will be re-calculated based on the actual bed position - auto magnitude2 = [&](const uint8_t i, const uint8_t j) { - const xy_pos_t diff = z_stepper_align.xy[i] - z_stepper_align.xy[j]; - return HYPOT2(diff.x, diff.y); - }; - float z_probe = Z_BASIC_CLEARANCE + (G34_MAX_GRADE) * 0.01f * SQRT( - #if NUM_Z_STEPPER_DRIVERS == 3 - _MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 0)) - #elif NUM_Z_STEPPER_DRIVERS == 4 - _MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 3), - magnitude2(3, 0), magnitude2(0, 2), magnitude2(1, 3)) - #else - magnitude2(0, 1) - #endif - ); - - // Home before the alignment procedure - if (!all_axes_known()) home_all_axes(); - - // Move the Z coordinate realm towards the positive - dirty trick - current_position.z += z_probe * 0.5f; - sync_plan_position(); - // Now, the Z origin lies below the build plate. That allows to probe deeper, before run_z_probe throws an error. - // This hack is un-done at the end of G34 - either by re-homing, or by using the probed heights of the last iteration. - - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - float last_z_align_move[NUM_Z_STEPPER_DRIVERS] = ARRAY_N(NUM_Z_STEPPER_DRIVERS, 10000.0f, 10000.0f, 10000.0f, 10000.0f); - #else - float last_z_align_level_indicator = 10000.0f; - #endif - float z_measured[NUM_Z_STEPPER_DRIVERS] = { 0 }, - z_maxdiff = 0.0f, - amplification = z_auto_align_amplification; - - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - bool adjustment_reverse = false; - #endif - - #if HAS_DISPLAY - PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION); - const uint8_t iter_str_len = strlen_P(msg_iteration); - #endif - - // Final z and iteration values will be used after breaking the loop - float z_measured_min; - uint8_t iteration = 0; - bool err_break = false; // To break out of nested loops - while (iteration < z_auto_align_iterations) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions."); - - const int iter = iteration + 1; - SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter); - #if HAS_DISPLAY - char str[iter_str_len + 2 + 1]; - sprintf_P(str, msg_iteration, iter); - ui.set_status(str); - #endif - - // Initialize minimum value - z_measured_min = 100000.0f; - float z_measured_max = -100000.0f; - - // Probe all positions (one per Z-Stepper) - LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { - // iteration odd/even --> downward / upward stepper sequence - const uint8_t iprobe = (iteration & 1) ? NUM_Z_STEPPER_DRIVERS - 1 - i : i; - - // Safe clearance even on an incline - if ((iteration == 0 || i > 0) && z_probe > current_position.z) do_blocking_move_to_z(z_probe); - - if (DEBUGGING(LEVELING)) - DEBUG_ECHOLNPAIR_P(PSTR("Probing X"), z_stepper_align.xy[iprobe].x, SP_Y_STR, z_stepper_align.xy[iprobe].y); - - // Probe a Z height for each stepper. - // Probing sanity check is disabled, as it would trigger even in normal cases because - // current_position.z has been manually altered in the "dirty trick" above. - const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false); - if (isnan(z_probed_height)) { - SERIAL_ECHOLNPGM("Probing failed"); - LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); - err_break = true; - break; - } - - // Add height to each value, to provide a more useful target height for - // the next iteration of probing. This allows adjustments to be made away from the bed. - z_measured[iprobe] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES; - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(iprobe + 1), " measured position is ", z_measured[iprobe]); - - // Remember the minimum measurement to calculate the correction later on - z_measured_min = _MIN(z_measured_min, z_measured[iprobe]); - z_measured_max = _MAX(z_measured_max, z_measured[iprobe]); - } // for (i) - - if (err_break) break; - - // Adapt the next probe clearance height based on the new measurements. - // Safe_height = lowest distance to bed (= highest measurement) plus highest measured misalignment. - z_maxdiff = z_measured_max - z_measured_min; - z_probe = Z_BASIC_CLEARANCE + z_measured_max + z_maxdiff; - - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - // Replace the initial values in z_measured with calculated heights at - // each stepper position. This allows the adjustment algorithm to be - // shared between both possible probing mechanisms. - - // This must be done after the next z_probe height is calculated, so that - // the height is calculated from actual print area positions, and not - // extrapolated motor movements. - - // Compute the least-squares fit for all probed points. - // Calculate the Z position of each stepper and store it in z_measured. - // This allows the actual adjustment logic to be shared by both algorithms. - linear_fit_data lfd; - incremental_LSF_reset(&lfd); - LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { - SERIAL_ECHOLNPAIR("PROBEPT_", int(i), ": ", z_measured[i]); - incremental_LSF(&lfd, z_stepper_align.xy[i], z_measured[i]); - } - finish_incremental_LSF(&lfd); - - z_measured_min = 100000.0f; - LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { - z_measured[i] = -(lfd.A * z_stepper_align.stepper_xy[i].x + lfd.B * z_stepper_align.stepper_xy[i].y + lfd.D); - z_measured_min = _MIN(z_measured_min, z_measured[i]); - } - - SERIAL_ECHOLNPAIR("CALCULATED STEPPER POSITIONS: Z1=", z_measured[0], " Z2=", z_measured[1], " Z3=", z_measured[2]); - #endif - - SERIAL_ECHOLNPAIR("\n" - "DIFFERENCE Z1-Z2=", ABS(z_measured[0] - z_measured[1]) - #if NUM_Z_STEPPER_DRIVERS == 3 - , " Z2-Z3=", ABS(z_measured[1] - z_measured[2]) - , " Z3-Z1=", ABS(z_measured[2] - z_measured[0]) - #endif - ); - #if HAS_DISPLAY - char fstr1[10]; - #if NUM_Z_STEPPER_DRIVERS == 2 - char msg[6 + (6 + 5) * 1 + 1]; - #else - char msg[6 + (6 + 5) * 3 + 1], fstr2[10], fstr3[10]; - #endif - sprintf_P(msg, - PSTR("Diffs Z1-Z2=%s" - #if NUM_Z_STEPPER_DRIVERS == 3 - " Z2-Z3=%s" - " Z3-Z1=%s" - #endif - ), dtostrf(ABS(z_measured[0] - z_measured[1]), 1, 3, fstr1) - #if NUM_Z_STEPPER_DRIVERS == 3 - , dtostrf(ABS(z_measured[1] - z_measured[2]), 1, 3, fstr2) - , dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3) - #endif - ); - ui.set_status(msg); - #endif - - auto decreasing_accuracy = [](const float &v1, const float &v2){ - if (v1 < v2 * 0.7f) { - SERIAL_ECHOLNPGM("Decreasing Accuracy Detected."); - LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY); - return true; - } - return false; - }; - - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - - // Check if the applied corrections go in the correct direction. - // Calculate the sum of the absolute deviations from the mean of the probe measurements. - // Compare to the last iteration to ensure it's getting better. - - // Calculate mean value as a reference - float z_measured_mean = 0.0f; - LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) z_measured_mean += z_measured[zstepper]; - z_measured_mean /= NUM_Z_STEPPER_DRIVERS; - - // Calculate the sum of the absolute deviations from the mean value - float z_align_level_indicator = 0.0f; - LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) - z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean); - - // If it's getting worse, stop and throw an error - err_break = decreasing_accuracy(last_z_align_level_indicator, z_align_level_indicator); - if (err_break) break; - - last_z_align_level_indicator = z_align_level_indicator; - #endif - - // The following correction actions are to be enabled for select Z-steppers only - stepper.set_separate_multi_axis(true); - - bool success_break = true; - // Correct the individual stepper offsets - LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) { - // Calculate current stepper move - float z_align_move = z_measured[zstepper] - z_measured_min; - const float z_align_abs = ABS(z_align_move); - - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - // Optimize one iteration's correction based on the first measurements - if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification; - - // Check for less accuracy compared to last move - if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs); - adjustment_reverse = !adjustment_reverse; - } - - // Remember the alignment for the next iteration, but only if steppers move, - // otherwise it would be just zero (in case this stepper was at z_measured_min already) - if (z_align_abs > 0) last_z_align_move[zstepper] = z_align_abs; - #endif - - // Stop early if all measured points achieve accuracy target - if (z_align_abs > z_auto_align_accuracy) success_break = false; - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " corrected by ", z_align_move); - - // Lock all steppers except one - stepper.set_all_z_lock(true, zstepper); - - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - // Decreasing accuracy was detected so move was inverted. - // Will match reversed Z steppers on dual steppers. Triple will need more work to map. - if (adjustment_reverse) { - z_align_move = -z_align_move; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " correction reversed to ", z_align_move); - } - #endif - - // Do a move to correct part of the misalignment for the current stepper - do_blocking_move_to_z(amplification * z_align_move + current_position.z); - } // for (zstepper) - - // Back to normal stepper operations - stepper.set_all_z_lock(false); - stepper.set_separate_multi_axis(false); - - if (err_break) break; - - if (success_break) { - SERIAL_ECHOLNPGM("Target accuracy achieved."); - LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED); + const int8_t z_auto_align_iterations = parser.intval('I', Z_STEPPER_ALIGN_ITERATIONS); + if (!WITHIN(z_auto_align_iterations, 1, 30)) { + SERIAL_ECHOLNPGM("?(I)teration out of bounds (1-30)."); break; } - iteration++; - } // while (iteration < z_auto_align_iterations) + const float z_auto_align_accuracy = parser.floatval('T', Z_STEPPER_ALIGN_ACC); + if (!WITHIN(z_auto_align_accuracy, 0.01f, 1.0f)) { + SERIAL_ECHOLNPGM("?(T)arget accuracy out of bounds (0.01-1.0)."); + break; + } - if (err_break) - SERIAL_ECHOLNPGM("G34 aborted."); - else { - SERIAL_ECHOLNPAIR("Did ", int(iteration + (iteration != z_auto_align_iterations)), " of ", int(z_auto_align_iterations)); - SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); - } + const float z_auto_align_amplification = TERN(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, Z_STEPPER_ALIGN_AMP, parser.floatval('A', Z_STEPPER_ALIGN_AMP)); + if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) { + SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0)."); + break; + } - // Stow the probe, as the last call to probe.probe_at_point(...) left - // the probe deployed if it was successful. - probe.stow(); + if (parser.seen('R')) z_stepper_align.reset_to_default(); - #if ENABLED(HOME_AFTER_G34) - // After this operation the z position needs correction - set_axis_never_homed(Z_AXIS); - // Home Z after the alignment procedure - process_subcommands_now_P(PSTR("G28Z")); - #else - // Use the probed height from the last iteration to determine the Z height. - // z_measured_min is used, because all steppers are aligned to z_measured_min. - // Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier. - current_position.z -= z_measured_min - (float)Z_CLEARANCE_BETWEEN_PROBES; + const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; + + // Disable the leveling matrix before auto-aligning + #if HAS_LEVELING + TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active); + set_bed_leveling_enabled(false); + #endif + + TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); + + // Always home with tool 0 active + #if HAS_MULTI_HOTEND + const uint8_t old_tool_index = active_extruder; + tool_change(0, true); + #endif + + TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false)); + + // In BLTOUCH HS mode, the probe travels in a deployed state. + // Users of G34 might have a badly misaligned bed, so raise Z by the + // length of the deployed pin (BLTOUCH stroke < 7mm) + #define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE)) + + // Compute a worst-case clearance height to probe from. After the first + // iteration this will be re-calculated based on the actual bed position + auto magnitude2 = [&](const uint8_t i, const uint8_t j) { + const xy_pos_t diff = z_stepper_align.xy[i] - z_stepper_align.xy[j]; + return HYPOT2(diff.x, diff.y); + }; + float z_probe = Z_BASIC_CLEARANCE + (G34_MAX_GRADE) * 0.01f * SQRT( + #if NUM_Z_STEPPER_DRIVERS == 3 + _MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 0)) + #elif NUM_Z_STEPPER_DRIVERS == 4 + _MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 3), + magnitude2(3, 0), magnitude2(0, 2), magnitude2(1, 3)) + #else + magnitude2(0, 1) + #endif + ); + + // Home before the alignment procedure + if (!all_axes_known()) home_all_axes(); + + // Move the Z coordinate realm towards the positive - dirty trick + current_position.z += z_probe * 0.5f; sync_plan_position(); - #endif + // Now, the Z origin lies below the build plate. That allows to probe deeper, before run_z_probe throws an error. + // This hack is un-done at the end of G34 - either by re-homing, or by using the probed heights of the last iteration. - // Restore the active tool after homing - TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, DISABLED(PARKING_EXTRUDER))); // Fetch previous tool for parking extruder + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + float last_z_align_move[NUM_Z_STEPPER_DRIVERS] = ARRAY_N(NUM_Z_STEPPER_DRIVERS, 10000.0f, 10000.0f, 10000.0f, 10000.0f); + #else + float last_z_align_level_indicator = 10000.0f; + #endif + float z_measured[NUM_Z_STEPPER_DRIVERS] = { 0 }, + z_maxdiff = 0.0f, + amplification = z_auto_align_amplification; - #if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34) - set_bed_leveling_enabled(leveling_was_active); - #endif + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + bool adjustment_reverse = false; + #endif - }while(0); + #if HAS_DISPLAY + PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION); + const uint8_t iter_str_len = strlen_P(msg_iteration); + #endif + + // Final z and iteration values will be used after breaking the loop + float z_measured_min; + uint8_t iteration = 0; + bool err_break = false; // To break out of nested loops + while (iteration < z_auto_align_iterations) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions."); + + const int iter = iteration + 1; + SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter); + #if HAS_DISPLAY + char str[iter_str_len + 2 + 1]; + sprintf_P(str, msg_iteration, iter); + ui.set_status(str); + #endif + + // Initialize minimum value + z_measured_min = 100000.0f; + float z_measured_max = -100000.0f; + + // Probe all positions (one per Z-Stepper) + LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { + // iteration odd/even --> downward / upward stepper sequence + const uint8_t iprobe = (iteration & 1) ? NUM_Z_STEPPER_DRIVERS - 1 - i : i; + + // Safe clearance even on an incline + if ((iteration == 0 || i > 0) && z_probe > current_position.z) do_blocking_move_to_z(z_probe); + + if (DEBUGGING(LEVELING)) + DEBUG_ECHOLNPAIR_P(PSTR("Probing X"), z_stepper_align.xy[iprobe].x, SP_Y_STR, z_stepper_align.xy[iprobe].y); + + // Probe a Z height for each stepper. + // Probing sanity check is disabled, as it would trigger even in normal cases because + // current_position.z has been manually altered in the "dirty trick" above. + const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false); + if (isnan(z_probed_height)) { + SERIAL_ECHOLNPGM("Probing failed"); + LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); + err_break = true; + break; + } + + // Add height to each value, to provide a more useful target height for + // the next iteration of probing. This allows adjustments to be made away from the bed. + z_measured[iprobe] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(iprobe + 1), " measured position is ", z_measured[iprobe]); + + // Remember the minimum measurement to calculate the correction later on + z_measured_min = _MIN(z_measured_min, z_measured[iprobe]); + z_measured_max = _MAX(z_measured_max, z_measured[iprobe]); + } // for (i) + + if (err_break) break; + + // Adapt the next probe clearance height based on the new measurements. + // Safe_height = lowest distance to bed (= highest measurement) plus highest measured misalignment. + z_maxdiff = z_measured_max - z_measured_min; + z_probe = Z_BASIC_CLEARANCE + z_measured_max + z_maxdiff; + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Replace the initial values in z_measured with calculated heights at + // each stepper position. This allows the adjustment algorithm to be + // shared between both possible probing mechanisms. + + // This must be done after the next z_probe height is calculated, so that + // the height is calculated from actual print area positions, and not + // extrapolated motor movements. + + // Compute the least-squares fit for all probed points. + // Calculate the Z position of each stepper and store it in z_measured. + // This allows the actual adjustment logic to be shared by both algorithms. + linear_fit_data lfd; + incremental_LSF_reset(&lfd); + LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { + SERIAL_ECHOLNPAIR("PROBEPT_", int(i), ": ", z_measured[i]); + incremental_LSF(&lfd, z_stepper_align.xy[i], z_measured[i]); + } + finish_incremental_LSF(&lfd); + + z_measured_min = 100000.0f; + LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { + z_measured[i] = -(lfd.A * z_stepper_align.stepper_xy[i].x + lfd.B * z_stepper_align.stepper_xy[i].y + lfd.D); + z_measured_min = _MIN(z_measured_min, z_measured[i]); + } + + SERIAL_ECHOLNPAIR("CALCULATED STEPPER POSITIONS: Z1=", z_measured[0], " Z2=", z_measured[1], " Z3=", z_measured[2]); + #endif + + SERIAL_ECHOLNPAIR("\n" + "DIFFERENCE Z1-Z2=", ABS(z_measured[0] - z_measured[1]) + #if NUM_Z_STEPPER_DRIVERS == 3 + , " Z2-Z3=", ABS(z_measured[1] - z_measured[2]) + , " Z3-Z1=", ABS(z_measured[2] - z_measured[0]) + #endif + ); + #if HAS_DISPLAY + char fstr1[10]; + #if NUM_Z_STEPPER_DRIVERS == 2 + char msg[6 + (6 + 5) * 1 + 1]; + #else + char msg[6 + (6 + 5) * 3 + 1], fstr2[10], fstr3[10]; + #endif + sprintf_P(msg, + PSTR("Diffs Z1-Z2=%s" + #if NUM_Z_STEPPER_DRIVERS == 3 + " Z2-Z3=%s" + " Z3-Z1=%s" + #endif + ), dtostrf(ABS(z_measured[0] - z_measured[1]), 1, 3, fstr1) + #if NUM_Z_STEPPER_DRIVERS == 3 + , dtostrf(ABS(z_measured[1] - z_measured[2]), 1, 3, fstr2) + , dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3) + #endif + ); + ui.set_status(msg); + #endif + + auto decreasing_accuracy = [](const float &v1, const float &v2){ + if (v1 < v2 * 0.7f) { + SERIAL_ECHOLNPGM("Decreasing Accuracy Detected."); + LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY); + return true; + } + return false; + }; + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + + // Check if the applied corrections go in the correct direction. + // Calculate the sum of the absolute deviations from the mean of the probe measurements. + // Compare to the last iteration to ensure it's getting better. + + // Calculate mean value as a reference + float z_measured_mean = 0.0f; + LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) z_measured_mean += z_measured[zstepper]; + z_measured_mean /= NUM_Z_STEPPER_DRIVERS; + + // Calculate the sum of the absolute deviations from the mean value + float z_align_level_indicator = 0.0f; + LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) + z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean); + + // If it's getting worse, stop and throw an error + err_break = decreasing_accuracy(last_z_align_level_indicator, z_align_level_indicator); + if (err_break) break; + + last_z_align_level_indicator = z_align_level_indicator; + #endif + + // The following correction actions are to be enabled for select Z-steppers only + stepper.set_separate_multi_axis(true); + + bool success_break = true; + // Correct the individual stepper offsets + LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) { + // Calculate current stepper move + float z_align_move = z_measured[zstepper] - z_measured_min; + const float z_align_abs = ABS(z_align_move); + + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Optimize one iteration's correction based on the first measurements + if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification; + + // Check for less accuracy compared to last move + if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs); + adjustment_reverse = !adjustment_reverse; + } + + // Remember the alignment for the next iteration, but only if steppers move, + // otherwise it would be just zero (in case this stepper was at z_measured_min already) + if (z_align_abs > 0) last_z_align_move[zstepper] = z_align_abs; + #endif + + // Stop early if all measured points achieve accuracy target + if (z_align_abs > z_auto_align_accuracy) success_break = false; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " corrected by ", z_align_move); + + // Lock all steppers except one + stepper.set_all_z_lock(true, zstepper); + + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Decreasing accuracy was detected so move was inverted. + // Will match reversed Z steppers on dual steppers. Triple will need more work to map. + if (adjustment_reverse) { + z_align_move = -z_align_move; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " correction reversed to ", z_align_move); + } + #endif + + // Do a move to correct part of the misalignment for the current stepper + do_blocking_move_to_z(amplification * z_align_move + current_position.z); + } // for (zstepper) + + // Back to normal stepper operations + stepper.set_all_z_lock(false); + stepper.set_separate_multi_axis(false); + + if (err_break) break; + + if (success_break) { + SERIAL_ECHOLNPGM("Target accuracy achieved."); + LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED); + break; + } + + iteration++; + } // while (iteration < z_auto_align_iterations) + + if (err_break) + SERIAL_ECHOLNPGM("G34 aborted."); + else { + SERIAL_ECHOLNPAIR("Did ", int(iteration + (iteration != z_auto_align_iterations)), " of ", int(z_auto_align_iterations)); + SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); + } + + // Stow the probe, as the last call to probe.probe_at_point(...) left + // the probe deployed if it was successful. + probe.stow(); + + #if ENABLED(HOME_AFTER_G34) + // After this operation the z position needs correction + set_axis_never_homed(Z_AXIS); + // Home Z after the alignment procedure + process_subcommands_now_P(PSTR("G28Z")); + #else + // Use the probed height from the last iteration to determine the Z height. + // z_measured_min is used, because all steppers are aligned to z_measured_min. + // Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier. + current_position.z -= z_measured_min - (float)Z_CLEARANCE_BETWEEN_PROBES; + sync_plan_position(); + #endif + + // Restore the active tool after homing + TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, DISABLED(PARKING_EXTRUDER))); // Fetch previous tool for parking extruder + + #if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34) + set_bed_leveling_enabled(leveling_was_active); + #endif + + }while(0); + #endif } +#endif // Z_MULTI_ENDSTOPS || Z_STEPPER_AUTO_ALIGN + +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + /** * M422: Set a Z-Stepper automatic alignment XY point. * Use repeatedly to set multiple points. diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 1d6bd94231..ee8aa0bba4 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -327,7 +327,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 33: G33(); break; // G33: Delta Auto-Calibration #endif - #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) + #if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) case 34: G34(); break; // G34: Z Stepper automatic alignment using probe #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 5db8b08e08..ddd48a389d 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -468,7 +468,7 @@ private: TERN_(DELTA_AUTO_CALIBRATION, static void G33()); - #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) + #if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) static void G34(); #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2ef4cbb785..55778634cd 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2792,8 +2792,11 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "Z_STEPPER_AUTO_ALIGN requires NUM_Z_STEPPER_DRIVERS greater than 1." #elif !HAS_BED_PROBE #error "Z_STEPPER_AUTO_ALIGN requires a Z-bed probe." - #elif ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) && NUM_Z_STEPPER_DRIVERS < 3 - #error "Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS requires NUM_Z_STEPPER_DRIVERS to be 3 or 4." + #elif ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + static_assert(WITHIN(Z_STEPPER_ALIGN_AMP, 0.5, 2.0), "Z_STEPPER_ALIGN_AMP must be between 0.5 and 2.0."); + #if NUM_Z_STEPPER_DRIVERS < 3 + #error "Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS requires NUM_Z_STEPPER_DRIVERS to be 3 or 4." + #endif #endif #endif diff --git a/platformio.ini b/platformio.ini index 360a02f420..932d19075d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -316,6 +316,7 @@ EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+ +< HAS_CUTTER = src_filter=+ + EXPERIMENTAL_I2CBUS = src_filter=+ + MECHANICAL_GANTRY_CAL.+ = src_filter=+ +Z_MULTI_ENDSTOPS = src_filter=+ Z_STEPPER_AUTO_ALIGN = src_filter=+ + G26_MESH_VALIDATION = src_filter=+ ASSISTED_TRAMMING = src_filter=+ From 030f745b088c43e7ef09041e830a2b7fc7657cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Pereira?= Date: Fri, 13 Nov 2020 07:23:05 +0000 Subject: [PATCH 0565/1370] Typo in MMU2 serial protocol description (#19949) --- Marlin/src/feature/mmu2/serial-protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/mmu2/serial-protocol.md b/Marlin/src/feature/mmu2/serial-protocol.md index 936830e1dc..7ff0901742 100644 --- a/Marlin/src/feature/mmu2/serial-protocol.md +++ b/Marlin/src/feature/mmu2/serial-protocol.md @@ -26,7 +26,7 @@ Now we are sure MMU is available and ready. If there was a timeout or other comm - *Firmware version* is an integer value, but we don't care about it - *Build number* is an integer value and has to be >=126, or =>132 if 12V mode is enabled -- *FINDA status* is 1 if the is filament loaded to the extruder, 0 otherwise +- *FINDA status* is 1 if the filament is loaded to the extruder, 0 otherwise *Build number* is checked against the required value, if it does not match, printer is halted. From 96acbb250610d7f7fd98b8930ea13df9e718b10d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 13 Nov 2020 00:45:26 -0600 Subject: [PATCH 0566/1370] LCD_FIRST_TOOL status bitmaps --- Marlin/src/lcd/dogm/status/combined.h | 171 ++++++++---- Marlin/src/lcd/dogm/status/hotend.h | 360 ++++++++++++++++++-------- 2 files changed, 377 insertions(+), 154 deletions(-) diff --git a/Marlin/src/lcd/dogm/status/combined.h b/Marlin/src/lcd/dogm/status/combined.h index 69aad5b00e..ca18f21af6 100644 --- a/Marlin/src/lcd/dogm/status/combined.h +++ b/Marlin/src/lcd/dogm/status/combined.h @@ -29,6 +29,9 @@ #undef STATUS_BED_ANIM #define STATUS_HEATERS_XSPACE 24 +// +// Status Screen Combined Heater bitmaps +// #if HAS_HEATED_BED && HOTENDS <= 4 #if HOTENDS == 0 @@ -75,13 +78,23 @@ const unsigned char status_heaters_bmp[] PROGMEM = { B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + #else + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + #endif B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, @@ -94,13 +107,23 @@ const unsigned char status_heaters_bmp[] PROGMEM = { B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000, + B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00001000,B00100000,B10000000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00010000,B01000001,B00000000, + B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00010000,B01000001,B00000000, + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00001000,B00100000,B10000000, + #else + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000, + #endif B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, @@ -113,13 +136,23 @@ const unsigned char status_heaters_bmp[] PROGMEM = { B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00001000,B00100000,B10000000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000, + B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000, + B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000, + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000, + #else + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00001000,B00100000,B10000000, + #endif B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, @@ -161,13 +194,23 @@ const unsigned char status_heaters_bmp[] PROGMEM = { B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000, - B00111100,B11110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000, - B00011110,B11100000,B00000000,B00011101,B11100000, - B00111110,B11110000,B00000000,B00111011,B11110000, - B00111110,B11110000,B00000000,B00111000,B01110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000,B00000000,B00111110,B11110000, + B00111011,B01110000,B00000000,B00111100,B11110000, + B00111011,B01110000,B00000000,B00111010,B11110000, + B00011011,B01100000,B00000000,B00011110,B11100000, + B00011011,B01100000,B00000000,B00011110,B11100000, + B00111011,B01110000,B00000000,B00111110,B11110000, + B00111100,B11110000,B00000000,B00111110,B11110000, + #else + B00111110,B11110000,B00000000,B00111100,B11110000, + B00111100,B11110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000, + B00011110,B11100000,B00000000,B00011101,B11100000, + B00111110,B11110000,B00000000,B00111011,B11110000, + B00111110,B11110000,B00000000,B00111000,B01110000, + #endif B00111111,B11110000,B00000000,B00111111,B11110000, B00001111,B11000000,B00000000,B00001111,B11000000, B00000111,B10000000,B00000000,B00000111,B10000000, @@ -180,13 +223,23 @@ const unsigned char status_heaters_bmp[] PROGMEM = { B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000, + B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000, + B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000, + B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000, + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000, + #else + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000, + #endif B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, @@ -199,13 +252,23 @@ const unsigned char status_heaters_bmp[] PROGMEM = { B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000, + B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, + B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000, + B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000, + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000, + #else + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000, + #endif B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, @@ -218,13 +281,23 @@ const unsigned char status_heaters_bmp[] PROGMEM = { B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111000,B01110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B11110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111000,B11110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00011111,B01100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00011111,B01100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00111100,B11110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000, + B00111011,B01110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, + B00111011,B01110000,B00000000,B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000, + B00011011,B01100000,B00000000,B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000, + B00111011,B01110000,B00000000,B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000, + B00111100,B11110000,B00000000,B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000, + #else + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111000,B01110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B11110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111000,B11110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00011111,B01100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00011111,B01100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00111100,B11110000, + #endif B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, diff --git a/Marlin/src/lcd/dogm/status/hotend.h b/Marlin/src/lcd/dogm/status/hotend.h index 559fa50018..4dddc42bee 100644 --- a/Marlin/src/lcd/dogm/status/hotend.h +++ b/Marlin/src/lcd/dogm/status/hotend.h @@ -77,13 +77,23 @@ const unsigned char status_hotend1_a_bmp[] PROGMEM = { B00011111,B11100000, B00111111,B11110000, - B00111110,B11110000, - B00111100,B11110000, - B00011010,B11100000, - B00011110,B11100000, - B00111110,B11110000, - B00111110,B11110000, - B00111110,B11110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000, + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011011,B01100000, + B00111011,B01110000, + B00111100,B11110000, + #else + B00111110,B11110000, + B00111100,B11110000, + B00011010,B11100000, + B00011110,B11100000, + B00111110,B11110000, + B00111110,B11110000, + B00111110,B11110000, + #endif B00001111,B11000000, B00000111,B10000000, B00000011,B00000000 @@ -92,13 +102,23 @@ const unsigned char status_hotend1_b_bmp[] PROGMEM = { B00011111,B11100000, B00100000,B00010000, - B00100001,B00010000, - B00100011,B00010000, - B00010101,B00100000, - B00010001,B00100000, - B00100001,B00010000, - B00100001,B00010000, - B00110001,B00110000, + #if LCD_FIRST_TOOL == 0 + B00100011,B00010000, + B00100100,B10010000, + B00010100,B10100000, + B00010100,B10100000, + B00100100,B10010000, + B00100100,B10010000, + B00110011,B00110000, + #else + B00100001,B00010000, + B00100011,B00010000, + B00010101,B00100000, + B00010001,B00100000, + B00100001,B00010000, + B00100001,B00010000, + B00110001,B00110000, + #endif B00001000,B01000000, B00000100,B10000000, B00000011,B00000000 @@ -107,13 +127,23 @@ const unsigned char status_hotend2_a_bmp[] PROGMEM = { B00011111,B11100000, B00111111,B11110000, - B00111100,B11110000, - B00111011,B01110000, - B00011111,B01100000, - B00011110,B11100000, - B00111101,B11110000, - B00111011,B11110000, - B00111000,B01110000, + #if LCD_FIRST_TOOL == 0 + B00111110,B11110000, + B00111100,B11110000, + B00011010,B11100000, + B00011110,B11100000, + B00111110,B11110000, + B00111110,B11110000, + B00111110,B11110000, + #else + B00111100,B11110000, + B00111011,B01110000, + B00011111,B01100000, + B00011110,B11100000, + B00111101,B11110000, + B00111011,B11110000, + B00111000,B01110000, + #endif B00001111,B11000000, B00000111,B10000000, B00000011,B00000000 @@ -122,13 +152,23 @@ const unsigned char status_hotend2_b_bmp[] PROGMEM = { B00011111,B11100000, B00100000,B00010000, - B00100011,B00010000, - B00100100,B10010000, - B00010000,B10100000, - B00010001,B00100000, - B00100010,B00010000, - B00100100,B00010000, - B00110111,B10110000, + #if LCD_FIRST_TOOL == 0 + B00100001,B00010000, + B00100011,B00010000, + B00010101,B00100000, + B00010001,B00100000, + B00100001,B00010000, + B00100001,B00010000, + B00110001,B00110000, + #else + B00100011,B00010000, + B00100100,B10010000, + B00010000,B10100000, + B00010001,B00100000, + B00100010,B00010000, + B00100100,B00010000, + B00110111,B10110000, + #endif B00001000,B01000000, B00000100,B10000000, B00000011,B00000000 @@ -138,13 +178,23 @@ const unsigned char status_hotend1_a_bmp[] PROGMEM = { B00011111,B11100000, - B00111110,B11110000, - B00111100,B11110000, - B00111010,B11110000, - B00011110,B11100000, - B00011110,B11100000, - B00111110,B11110000, - B00111110,B11110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000, + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011011,B01100000, + B00111011,B01110000, + B00111100,B11110000, + #else + B00111110,B11110000, + B00111100,B11110000, + B00111010,B11110000, + B00011110,B11100000, + B00011110,B11100000, + B00111110,B11110000, + B00111110,B11110000, + #endif B00111111,B11110000, B00001111,B11000000, B00000111,B10000000, @@ -153,13 +203,23 @@ const unsigned char status_hotend2_a_bmp[] PROGMEM = { B00011111,B11100000, - B00111100,B11110000, - B00111011,B01110000, - B00111111,B01110000, - B00011110,B11100000, - B00011101,B11100000, - B00111011,B11110000, - B00111000,B01110000, + #if LCD_FIRST_TOOL == 0 + B00111110,B11110000, + B00111100,B11110000, + B00111010,B11110000, + B00011110,B11100000, + B00011110,B11100000, + B00111110,B11110000, + B00111110,B11110000, + #else + B00111100,B11110000, + B00111011,B01110000, + B00111111,B01110000, + B00011110,B11100000, + B00011101,B11100000, + B00111011,B11110000, + B00111000,B01110000, + #endif B00111111,B11110000, B00001111,B11000000, B00000111,B10000000, @@ -175,13 +235,23 @@ const unsigned char status_hotend3_a_bmp[] PROGMEM = { B00011111,B11100000, B00111111,B11110000, - B00111100,B11110000, - B00111011,B01110000, - B00011111,B01100000, - B00011100,B11100000, - B00111111,B01110000, - B00111011,B01110000, - B00111100,B11110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000, + B00111011,B01110000, + B00011111,B01100000, + B00011110,B11100000, + B00111101,B11110000, + B00111011,B11110000, + B00111000,B01110000, + #else + B00111100,B11110000, + B00111011,B01110000, + B00011111,B01100000, + B00011100,B11100000, + B00111111,B01110000, + B00111011,B01110000, + B00111100,B11110000, + #endif B00001111,B11000000, B00000111,B10000000, B00000011,B00000000 @@ -190,13 +260,23 @@ const unsigned char status_hotend3_b_bmp[] PROGMEM = { B00011111,B11100000, B00100000,B00010000, - B00100011,B00010000, - B00100100,B10010000, - B00010000,B10100000, - B00010011,B00100000, - B00100000,B10010000, - B00100100,B10010000, - B00110011,B00110000, + #if LCD_FIRST_TOOL == 0 + B00100011,B00010000, + B00100100,B10010000, + B00010000,B10100000, + B00010001,B00100000, + B00100010,B00010000, + B00100100,B00010000, + B00110111,B10110000, + #else + B00100011,B00010000, + B00100100,B10010000, + B00010000,B10100000, + B00010011,B00100000, + B00100000,B10010000, + B00100100,B10010000, + B00110011,B00110000, + #endif B00001000,B01000000, B00000100,B10000000, B00000011,B00000000 @@ -206,13 +286,23 @@ const unsigned char status_hotend3_a_bmp[] PROGMEM = { B00011111,B11100000, - B00111100,B11110000, - B00111011,B01110000, - B00111111,B01110000, - B00011100,B11100000, - B00011111,B01100000, - B00111011,B01110000, - B00111100,B11110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000, + B00111011,B01110000, + B00111111,B01110000, + B00011110,B11100000, + B00011101,B11100000, + B00111011,B11110000, + B00111000,B01110000, + #else + B00111100,B11110000, + B00111011,B01110000, + B00111111,B01110000, + B00011100,B11100000, + B00011111,B01100000, + B00111011,B01110000, + B00111100,B11110000, + #endif B00111111,B11110000, B00001111,B11000000, B00000111,B10000000, @@ -230,13 +320,23 @@ const unsigned char status_hotend4_a_bmp[] PROGMEM = { B00011111,B11100000, B00111111,B11110000, - B00111011,B01110000, - B00111011,B01110000, - B00011011,B01100000, - B00011011,B01100000, - B00111000,B00110000, - B00111111,B01110000, - B00111111,B01110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000, + B00111011,B01110000, + B00011111,B01100000, + B00011100,B11100000, + B00111111,B01110000, + B00111011,B01110000, + B00111100,B11110000, + #else + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011011,B01100000, + B00111000,B00110000, + B00111111,B01110000, + B00111111,B01110000, + #endif B00001111,B11000000, B00000111,B10000000, B00000011,B00000000 @@ -245,13 +345,23 @@ const unsigned char status_hotend4_b_bmp[] PROGMEM = { B00011111,B11100000, B00100000,B00010000, - B00100100,B10010000, - B00100100,B10010000, - B00010100,B10100000, - B00010100,B10100000, - B00100111,B11010000, - B00100000,B10010000, - B00110000,B10110000, + #if LCD_FIRST_TOOL == 0 + B00100011,B00010000, + B00100100,B10010000, + B00010000,B10100000, + B00010011,B00100000, + B00100000,B10010000, + B00100100,B10010000, + B00110011,B00110000, + #else + B00100100,B10010000, + B00100100,B10010000, + B00010100,B10100000, + B00010100,B10100000, + B00100111,B11010000, + B00100000,B10010000, + B00110000,B10110000, + #endif B00001000,B01000000, B00000100,B10000000, B00000011,B00000000 @@ -261,13 +371,23 @@ const unsigned char status_hotend4_a_bmp[] PROGMEM = { B00011111,B11100000, - B00111011,B01110000, - B00111011,B01110000, - B00111011,B01110000, - B00011011,B01100000, - B00011000,B00100000, - B00111111,B01110000, - B00111111,B01110000, + #if LCD_FIRST_TOOL == 0 + B00111100,B11110000, + B00111011,B01110000, + B00111111,B01110000, + B00011100,B11100000, + B00011111,B01100000, + B00111011,B01110000, + B00111100,B11110000, + #else + B00111011,B01110000, + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011000,B00100000, + B00111111,B01110000, + B00111111,B01110000, + #endif B00111111,B11110000, B00001111,B11000000, B00000111,B10000000, @@ -285,13 +405,23 @@ const unsigned char status_hotend5_a_bmp[] PROGMEM = { B00011111,B11100000, B00111111,B11110000, - B00111000,B01110000, - B00111011,B11110000, - B00011000,B11100000, - B00011111,B01100000, - B00111111,B01110000, - B00111011,B01110000, - B00111100,B11110000, + #if LCD_FIRST_TOOL == 0 + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011011,B01100000, + B00111000,B00110000, + B00111111,B01110000, + B00111111,B01110000, + #else + B00111000,B01110000, + B00111011,B11110000, + B00011000,B11100000, + B00011111,B01100000, + B00111111,B01110000, + B00111011,B01110000, + B00111100,B11110000, + #endif B00001111,B11000000, B00000111,B10000000, B00000011,B00000000 @@ -300,13 +430,23 @@ const unsigned char status_hotend5_b_bmp[] PROGMEM = { B00011111,B11100000, B00100000,B00010000, - B00100111,B10010000, - B00100100,B00010000, - B00010111,B00100000, - B00010000,B10100000, - B00100000,B10010000, - B00100100,B10010000, - B00110011,B00110000, + #if LCD_FIRST_TOOL == 0 + B00100100,B10010000, + B00100100,B10010000, + B00010100,B10100000, + B00010100,B10100000, + B00100111,B11010000, + B00100000,B10010000, + B00110000,B10110000, + #else + B00100111,B10010000, + B00100100,B00010000, + B00010111,B00100000, + B00010000,B10100000, + B00100000,B10010000, + B00100100,B10010000, + B00110011,B00110000, + #endif B00001000,B01000000, B00000100,B10000000, B00000011,B00000000 @@ -316,13 +456,23 @@ const unsigned char status_hotend5_a_bmp[] PROGMEM = { B00011111,B11100000, - B00111000,B01110000, - B00111011,B11110000, - B00111000,B11110000, - B00011111,B01100000, - B00011111,B01100000, - B00111011,B01110000, - B00111100,B11110000, + #if LCD_FIRST_TOOL == 0 + B00111011,B01110000, + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011000,B00100000, + B00111111,B01110000, + B00111111,B01110000, + #else + B00111000,B01110000, + B00111011,B11110000, + B00111000,B11110000, + B00011111,B01100000, + B00011111,B01100000, + B00111011,B01110000, + B00111100,B11110000, + #endif B00111111,B11110000, B00001111,B11000000, B00000111,B10000000, From cb1d2de838f9c13679b4e297e22b068a3b8da272 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 13 Nov 2020 18:28:06 -0600 Subject: [PATCH 0567/1370] .gitignore for native / simulation --- .gitignore | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 4e4412f5e7..62f73a7c0d 100755 --- a/.gitignore +++ b/.gitignore @@ -148,7 +148,7 @@ Marlin/*/*/*/*/readme.txt # Secure Credentials Configuration_Secure.h -#Visual Studio +# Visual Studio *.sln *.vcxproj *.vcxproj.user @@ -159,30 +159,34 @@ __vm/ .vs/ vc-fileutils.settings -#Visual Studio Code +# Visual Studio Code .vscode .vscode/.browse.c_cpp.db* .vscode/c_cpp_properties.json .vscode/launch.json .vscode/*.db -#cmake +# cmake CMakeLists.txt src/CMakeLists.txt CMakeListsPrivate.txt -#CLion +# CLion cmake-build-* -#Eclipse +# Eclipse .project .cproject .pydevproject .settings .classpath -#Python +# Python __pycache__ -#IOLogger logs +# IOLogger logs *_log.csv + +# Simulation / Native +eeprom.dat +imgui.ini From 7e535022ab6ba90ae8ad042493cc518166c521ee Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 13 Nov 2020 18:27:31 -0600 Subject: [PATCH 0568/1370] Fix compile warnings, serial alias --- Marlin/src/core/serial.h | 6 +++--- Marlin/src/gcode/stats/M31.cpp | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 6 ++++++ Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 4 ++-- Marlin/src/libs/duration_t.h | 7 ++++++- Marlin/src/module/printcounter.cpp | 2 +- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index c3baaf9ada..4824866aeb 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -303,14 +303,14 @@ extern uint8_t marlin_debug_flags; void serial_echopair_PGM(PGM_P const s_P, const char *v); void serial_echopair_PGM(PGM_P const s_P, char v); void serial_echopair_PGM(PGM_P const s_P, int v); +void serial_echopair_PGM(PGM_P const s_P, unsigned int v); void serial_echopair_PGM(PGM_P const s_P, long v); +void serial_echopair_PGM(PGM_P const s_P, unsigned long v); void serial_echopair_PGM(PGM_P const s_P, float v); void serial_echopair_PGM(PGM_P const s_P, double v); -void serial_echopair_PGM(PGM_P const s_P, unsigned int v); -void serial_echopair_PGM(PGM_P const s_P, unsigned long v); inline void serial_echopair_PGM(PGM_P const s_P, uint8_t v) { serial_echopair_PGM(s_P, (int)v); } inline void serial_echopair_PGM(PGM_P const s_P, bool v) { serial_echopair_PGM(s_P, (int)v); } -inline void serial_echopair_PGM(PGM_P const s_P, void *v) { serial_echopair_PGM(s_P, (unsigned long)v); } +inline void serial_echopair_PGM(PGM_P const s_P, void *v) { serial_echopair_PGM(s_P, (uintptr_t)v); } void serialprintPGM(PGM_P str); void serial_echo_start(); diff --git a/Marlin/src/gcode/stats/M31.cpp b/Marlin/src/gcode/stats/M31.cpp index c0e7d2a7ae..207f9e144e 100644 --- a/Marlin/src/gcode/stats/M31.cpp +++ b/Marlin/src/gcode/stats/M31.cpp @@ -30,7 +30,7 @@ * M31: Get the time since the start of SD Print (or last M109) */ void GcodeSuite::M31() { - char buffer[21]; + char buffer[22]; duration_t(print_job_timer.duration()).toString(buffer); ui.set_status(buffer); diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 85654b9189..9fef625826 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -774,9 +774,15 @@ void MarlinUI::draw_status_screen() { mixer.update_mix_from_vtool(); mix_label = PSTR("Mx"); } + + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wformat-overflow" + sprintf_P(mixer_messages, PSTR(S_FMT " %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); lcd_put_u8str(X_LABEL_POS, XYZ_BASELINE, mixer_messages); + #pragma GCC diagnostic pop + #else if (show_e_total) { diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 7988985c2e..77feacf4a9 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -217,7 +217,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { // It is using a hex display for that: It expects BSD coded data in the format xxyyzz void DGUSScreenHandler::DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var) { printStatistics state = print_job_timer.getStats(); - char buf[21]; + char buf[22]; duration_t elapsed = state.printTime; elapsed.toString(buf); dgusdisplay.WriteVariable(VP_PrintAccTime, buf, var.size, true); @@ -225,7 +225,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { void DGUSScreenHandler::DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var) { printStatistics state = print_job_timer.getStats(); - char buf[21]; + char buf[10]; sprintf_P(buf, PSTR("%u"), state.totalPrints); dgusdisplay.WriteVariable(VP_PrintsTotal, buf, var.size, true); } diff --git a/Marlin/src/libs/duration_t.h b/Marlin/src/libs/duration_t.h index 31d8bab385..9c1d72dfaf 100644 --- a/Marlin/src/libs/duration_t.h +++ b/Marlin/src/libs/duration_t.h @@ -106,6 +106,9 @@ struct duration_t { return this->value; } + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wformat-overflow" + /** * @brief Formats the duration as a string * @details String will be formated using a "full" representation of duration @@ -127,7 +130,7 @@ struct duration_t { m = this->minute() % 60, s = this->second() % 60; - if (y) sprintf_P(buffer, PSTR("%iy %id %ih %im %is"), y, d, h, m, s); + if (y) sprintf_P(buffer, PSTR("%iy %id %ih %im %is"), y, d, h, m, s); else if (d) sprintf_P(buffer, PSTR("%id %ih %im %is"), d, h, m, s); else if (h) sprintf_P(buffer, PSTR("%ih %im %is"), h, m, s); else if (m) sprintf_P(buffer, PSTR("%im %is"), m, s); @@ -163,4 +166,6 @@ struct duration_t { return 6; } } + + #pragma GCC diagnostic pop }; diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 86aedf2161..ab87717f01 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -177,7 +177,7 @@ void PrintCounter::saveStats() { #endif void PrintCounter::showStats() { - char buffer[21]; + char buffer[22]; SERIAL_ECHOPGM(STR_STATS); SERIAL_ECHOLNPAIR( From 2f57b1d5294779bffcef726b2b77bf4990479064 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 13 Nov 2020 18:47:34 -0600 Subject: [PATCH 0569/1370] Optimize M360 --- Marlin/src/gcode/host/M360.cpp | 73 ++++++++++++++++------------------ 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 9970dc4df9..f49a32cc61 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -28,16 +28,24 @@ #include "../../module/motion.h" #include "../../module/planner.h" -static void config_prefix(PGM_P const name, PGM_P const pref=nullptr) { +#if EXTRUDERS + #include "../../module/temperature.h" +#endif + +static void config_prefix(PGM_P const name, PGM_P const pref=nullptr, const int8_t ind=-1) { SERIAL_ECHOPGM("Config:"); if (pref) serialprintPGM(pref); + if (ind >= 0) { SERIAL_ECHO(int(ind)); SERIAL_CHAR(':'); } serialprintPGM(name); SERIAL_CHAR(':'); } -static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr) { - config_prefix(name, pref); +static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr, const int8_t ind=-1) { + config_prefix(name, pref, ind); SERIAL_ECHOLN(val); } +static void config_line_e(const int8_t e, PGM_P const name, const float val) { + config_line(name, val, PSTR("Extr."), e + 1); +} /** * M360: Report Firmware configuration @@ -52,19 +60,19 @@ void GcodeSuite::M360() { // // Basics and Enabled items // - config_line(PSTR("Baudrate"), BAUDRATE); - config_line(PSTR("InputBuffer"), MAX_CMD_SIZE); - config_line(PSTR("PrintlineCache"), BUFSIZE); - config_line(PSTR("MixingExtruder"), ENABLED(MIXING_EXTRUDER)); - config_line(PSTR("SDCard"), ENABLED(SDSUPPORT)); - config_line(PSTR("Fan"), ENABLED(HAS_FAN)); - config_line(PSTR("LCD"), ENABLED(HAS_DISPLAY)); + config_line(PSTR("Baudrate"), BAUDRATE); + config_line(PSTR("InputBuffer"), MAX_CMD_SIZE); + config_line(PSTR("PrintlineCache"), BUFSIZE); + config_line(PSTR("MixingExtruder"), ENABLED(MIXING_EXTRUDER)); + config_line(PSTR("SDCard"), ENABLED(SDSUPPORT)); + config_line(PSTR("Fan"), ENABLED(HAS_FAN)); + config_line(PSTR("LCD"), ENABLED(HAS_DISPLAY)); config_line(PSTR("SoftwarePowerSwitch"), 1); config_line(PSTR("SupportLocalFilamentchange"), ENABLED(ADVANCED_PAUSE_FEATURE)); - config_line(PSTR("CaseLights"), ENABLED(CASE_LIGHT_ENABLE)); - config_line(PSTR("ZProbe"), ENABLED(HAS_BED_PROBE)); - config_line(PSTR("Autolevel"), ENABLED(HAS_LEVELING)); - config_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); + config_line(PSTR("CaseLights"), ENABLED(CASE_LIGHT_ENABLE)); + config_line(PSTR("ZProbe"), ENABLED(HAS_BED_PROBE)); + config_line(PSTR("Autolevel"), ENABLED(HAS_LEVELING)); + config_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); // // Homing Directions @@ -96,15 +104,15 @@ void GcodeSuite::M360() { PGMSTR(UNRET_STR, "RetractionUndo"); PGMSTR(SPEED_STR, "Speed"); // M10 Retract with swap (long) moves - config_line(PSTR("Length"), fwretract.settings.retract_length, RET_STR); - config_line(SPEED_STR, fwretract.settings.retract_feedrate_mm_s, RET_STR); - config_line(PSTR("ZLift"), fwretract.settings.retract_zraise, RET_STR); + config_line(PSTR("Length"), fwretract.settings.retract_length, RET_STR); + config_line(SPEED_STR, fwretract.settings.retract_feedrate_mm_s, RET_STR); + config_line(PSTR("ZLift"), fwretract.settings.retract_zraise, RET_STR); config_line(PSTR("LongLength"), fwretract.settings.swap_retract_length, RET_STR); // M11 Recover (undo) with swap (long) moves - config_line(SPEED_STR, fwretract.settings.retract_recover_feedrate_mm_s, UNRET_STR); - config_line(PSTR("ExtraLength"), fwretract.settings.retract_recover_extra, UNRET_STR); + config_line(SPEED_STR, fwretract.settings.retract_recover_feedrate_mm_s, UNRET_STR); + config_line(PSTR("ExtraLength"), fwretract.settings.retract_recover_extra, UNRET_STR); config_line(PSTR("ExtraLongLength"), fwretract.settings.swap_retract_recover_extra, UNRET_STR); - config_line(PSTR("LongSpeed"), fwretract.settings.swap_retract_recover_feedrate_mm_s, UNRET_STR); + config_line(PSTR("LongSpeed"), fwretract.settings.swap_retract_recover_feedrate_mm_s, UNRET_STR); #endif // @@ -165,24 +173,13 @@ void GcodeSuite::M360() { // config_line(PSTR("NumExtruder"), EXTRUDERS); #if EXTRUDERS - #define DIAM_VALUE(N) TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[N]) - #if HAS_LINEAR_E_JERK - #define E_JERK_VAL(N) planner.max_e_jerk[E_INDEX_N(N)] - #elif HAS_CLASSIC_JERK - #define E_JERK_VAL(N) planner.max_jerk.e - #else - #define E_JERK_VAL(N) DEFAULT_EJERK - #endif - #define _EXTR_ITEM(N) do{ \ - PGMSTR(EXTR_STR, "Extr." STRINGIFY(INCREMENT(N)) ":"); \ - config_line(JERK_STR, E_JERK_VAL(N), EXTR_STR); \ - config_line(PSTR("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(N)], EXTR_STR); \ - config_line(PSTR("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(N)], EXTR_STR); \ - config_line(PSTR("Diameter"), DIAM_VALUE(N), EXTR_STR); \ - config_line(PSTR("MaxTemp"), (HEATER_##N##_MAXTEMP) - (HOTEND_OVERSHOOT), EXTR_STR); \ - }while(0) - - REPEAT(EXTRUDERS, _EXTR_ITEM); + LOOP_L_N(e, EXTRUDERS) { + config_line_e(e, JERK_STR, TERN(HAS_LINEAR_E_JERK, planner.max_e_jerk[E_INDEX_N(e)], TERN(HAS_CLASSIC_JERK, planner.max_jerk.e, DEFAULT_EJERK))); + config_line_e(e, PSTR("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(e)]); + config_line_e(e, PSTR("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(e)]); + config_line_e(e, PSTR("Diameter"), TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[e])); + config_line_e(e, PSTR("MaxTemp"), thermalManager.heater_maxtemp[e]); + } #endif } From 6b5ddfe235c4bbbc454a2c52dcf154e774bd0f4c Mon Sep 17 00:00:00 2001 From: Luu Lac <45380455+shitcreek@users.noreply.github.com> Date: Fri, 13 Nov 2020 18:48:59 -0600 Subject: [PATCH 0570/1370] Fix "autotune" LCD message (#20127) --- Marlin/src/gcode/temp/M303.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index c1bf9efd7f..52e34fc473 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -77,7 +77,7 @@ void GcodeSuite::M303() { KEEPALIVE_STATE(NOT_BUSY); #endif - ui.set_status(GET_TEXT(MSG_PID_AUTOTUNE)); + ui.set_status_P(GET_TEXT(MSG_PID_AUTOTUNE)); thermalManager.PID_autotune(temp, e, c, u); ui.reset_status(); } From 65a5eb47b3fdf93643181a29ec4098d4817976fe Mon Sep 17 00:00:00 2001 From: phcay <58492957+phcay@users.noreply.github.com> Date: Sat, 14 Nov 2020 02:24:08 +0100 Subject: [PATCH 0571/1370] Fix extraneous Linear Advance DIR change (#20131) --- Marlin/src/module/stepper.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 627ecf9ebb..8b4bc23cb9 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2255,7 +2255,6 @@ uint32_t Stepper::block_phase_isr() { interval = LA_isr_rate; } else if (step_events_completed < decelerate_after && LA_current_adv_steps < LA_max_adv_steps) { - //step_events_completed <= (uint32_t)accelerate_until) { LA_steps++; LA_current_adv_steps++; interval = LA_isr_rate; @@ -2266,6 +2265,8 @@ uint32_t Stepper::block_phase_isr() { else interval = LA_ADV_NEVER; + if (!LA_steps) return interval; // Leave pins alone if there are no steps! + DIR_WAIT_BEFORE(); #if ENABLED(MIXING_EXTRUDER) From 90f3d1f7a6d06eefa17aef2eadc70b6f2f721d4c Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 13 Nov 2020 18:10:50 -0800 Subject: [PATCH 0572/1370] UTF Filenames followup (#20135) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0acf2e5f77..ecc6f9dd89 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1260,7 +1260,7 @@ // Allow international symbols in long filenames. To display correctly, the // LCD's font must contain the characters. Check your selected LCD language. - #define UTF_FILENAME_SUPPORT + //#define UTF_FILENAME_SUPPORT // This allows hosts to request long names for files and folders with M33 //#define LONG_FILENAME_HOST_SUPPORT From 2b63a1b4e1daafd8743735eea3152da5ee3551ab Mon Sep 17 00:00:00 2001 From: Minims Date: Sat, 14 Nov 2020 03:13:36 +0100 Subject: [PATCH 0573/1370] BTT Motor Expansion for SKR Pro (#20123) --- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 150 +++++++++++++----- 1 file changed, 111 insertions(+), 39 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 995fcb9585..e1d28f34de 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -25,6 +25,13 @@ #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #endif +// BigTreeTech driver expansion module https://bit.ly/3ptRRoj +//#define BTT_MOTOR_EXPANSION + +#if BOTH(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) + #error "It's not possible to have both LCD and motor expansion module on EXP1/EXP2." +#endif + // Use one of these or SDCard-based Emulation will be used #if NO_EEPROM_SELECTED //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation @@ -247,14 +254,43 @@ #define SDCARD_CONNECTION LCD #endif +/** + * ----- ----- + * NC | 1 2 | GND 5V | 1 2 | GND + * RESET | 3 4 | PF12(SD_DETECT) (LCD_D7) PG7 | 3 4 | PG6 (LCD_D6) + * (MOSI)PB15 | 5 6 PF11(BTN_EN2) (LCD_D5) PG3 | 5 6 PG2 (LCD_D4) + * (SD_SS)PB12 | 7 8 | PG10(BTN_EN1) (LCD_RS) PD10 | 7 8 | PD11 (LCD_EN) + * (SCK)PB13 | 9 10| PB14(MISO) (BTN_ENC) PA8 | 9 10| PG4 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ + +#define EXPA1_03_PIN PG7 +#define EXPA1_04_PIN PG6 +#define EXPA1_05_PIN PG3 +#define EXPA1_06_PIN PG2 +#define EXPA1_07_PIN PD10 +#define EXPA1_08_PIN PD11 +#define EXPA1_09_PIN PA8 +#define EXPA1_10_PIN PG4 + +#define EXPA2_03_PIN -1 +#define EXPA2_04_PIN PF12 +#define EXPA2_05_PIN PB15 +#define EXPA2_06_PIN PF11 +#define EXPA2_07_PIN PB12 +#define EXPA2_08_PIN PG10 +#define EXPA2_09_PIN PB13 +#define EXPA2_10_PIN PB14 + // // Onboard SD card // Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2 // #if SD_CONNECTION_IS(LCD) - #define SD_DETECT_PIN PF12 - #define SDSS PB12 + #define SD_DETECT_PIN EXPA2_04_PIN + #define SDSS EXPA2_07_PIN #elif SD_CONNECTION_IS(ONBOARD) @@ -273,16 +309,52 @@ #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" #endif -/** - * ----- ----- - * NC | · · | GND 5V | · · | GND - * RESET | · · | PF12(SD_DETECT) (LCD_D7) PG7 | · · | PG6 (LCD_D6) - * (MOSI)PB15 | · · | PF11(BTN_EN2) (LCD_D5) PG3 | · · | PG2 (LCD_D4) - * (SD_SS)PB12 | · · | PG10(BTN_EN1) (LCD_RS) PD10 | · · | PD11 (LCD_EN) - * (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA8 | · · | PG4 (BEEPER) - * ----- ----- - * EXP2 EXP1 - */ +#if ENABLED(BTT_MOTOR_EXPANSION) + /** + * _____ _____ + * NC | · · | GND NC | · · | GND + * NC | · · | PF12 (M1EN) (M2EN) PG7 | · · | PG6 (M3EN) + * (M1STP) PB15 | · · PF11 (M1DIR) (M1RX) PG3 | · · PG2 (M1DIAG) + * (M2DIR) PB12 | · · | PG10 (M2STP) (M2RX) PD10 | · · | PD11 (M2DIAG) + * (M3DIR) PB13 | · · | PB14 (M3STP) (M3RX) PA8 | · · | PG4 (M3DIAG) + * ----- ----- + * EXP2 EXP1 + */ + + // M1 on Driver Expansion Module + #define E3_STEP_PIN EXPA2_05_PIN + #define E3_DIR_PIN EXPA2_06_PIN + #define E3_ENABLE_PIN EXPA2_04_PIN + #define E3_DIAG_PIN EXPA1_06_PIN + #define E3_CS_PIN EXPA1_05_PIN + #if HAS_TMC_UART + #define E3_SERIAL_TX_PIN EXPA1_05_PIN + #define E3_SERIAL_RX_PIN EXPA1_05_PIN + #endif + + // M2 on Driver Expansion Module + #define E4_STEP_PIN EXPA2_08_PIN + #define E4_DIR_PIN EXPA2_07_PIN + #define E4_ENABLE_PIN EXPA1_03_PIN + #define E4_DIAG_PIN EXPA1_08_PIN + #define E4_CS_PIN EXPA1_07_PIN + #if HAS_TMC_UART + #define E4_SERIAL_TX_PIN EXPA1_07_PIN + #define E4_SERIAL_RX_PIN EXPA1_07_PIN + #endif + + // M3 on Driver Expansion Module + #define E5_STEP_PIN EXPA2_10_PIN + #define E5_DIR_PIN EXPA2_09_PIN + #define E5_ENABLE_PIN EXPA1_04_PIN + #define E5_DIAG_PIN EXPA1_10_PIN + #define E5_CS_PIN EXPA1_09_PIN + #if HAS_TMC_UART + #define E5_SERIAL_TX_PIN EXPA1_09_PIN + #define E5_SERIAL_RX_PIN EXPA1_09_PIN + #endif + +#endif // BTT_MOTOR_EXPANSION // // LCDs and Controllers @@ -290,23 +362,23 @@ #if IS_TFTGLCD_PANEL #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS PG10 + #define TFTGLCD_CS EXPA2_08_PIN #endif #elif HAS_WIRED_LCD - #define BEEPER_PIN PG4 - #define BTN_ENC PA8 + #define BEEPER_PIN EXPA1_10_PIN + #define BTN_ENC EXPA1_09_PIN #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS PG6 + #define LCD_PINS_RS EXPA1_04_PIN - #define BTN_EN1 PD11 - #define BTN_EN2 PG2 + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN - #define LCD_PINS_ENABLE PG7 - #define LCD_PINS_D4 PG3 + #define LCD_PINS_ENABLE EXPA1_03_PIN + #define LCD_PINS_D4 EXPA1_05_PIN // CR10_STOCKDISPLAY default timing is too fast #undef BOARD_ST7920_DELAY_1 @@ -315,45 +387,45 @@ #elif ENABLED(MKS_MINI_12864) - #define DOGLCD_A0 PG6 - #define DOGLCD_CS PG3 - #define BTN_EN1 PG10 - #define BTN_EN2 PF11 + #define DOGLCD_A0 EXPA1_04_PIN + #define DOGLCD_CS EXPA1_05_PIN + #define BTN_EN1 EXPA2_08_PIN + #define BTN_EN2 EXPA2_06_PIN #else - #define LCD_PINS_RS PD10 + #define LCD_PINS_RS EXPA1_07_PIN - #define BTN_EN1 PG10 - #define BTN_EN2 PF11 + #define BTN_EN1 EXPA2_08_PIN + #define BTN_EN2 EXPA2_06_PIN - #define LCD_PINS_ENABLE PD11 - #define LCD_PINS_D4 PG2 + #define LCD_PINS_ENABLE EXPA1_08_PIN + #define LCD_PINS_D4 EXPA1_06_PIN #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS PD11 - #define DOGLCD_A0 PD10 + #define DOGLCD_CS EXPA1_08_PIN + #define DOGLCD_A0 EXPA1_07_PIN //#define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN PG2 // Must be high or open for LCD to operate normally. + #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PG3 + #define RGB_LED_R_PIN EXPA1_05_PIN #endif #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PG6 + #define RGB_LED_G_PIN EXPA1_04_PIN #endif #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PG7 + #define RGB_LED_B_PIN EXPA1_03_PIN #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN PG3 + #define NEOPIXEL_PIN EXPA1_05_PIN #endif #endif // !FYSETC_MINI_12864 #if IS_ULTIPANEL - #define LCD_PINS_D5 PG3 - #define LCD_PINS_D6 PG6 - #define LCD_PINS_D7 PG7 + #define LCD_PINS_D5 EXPA1_05_PIN + #define LCD_PINS_D6 EXPA1_04_PIN + #define LCD_PINS_D7 EXPA1_03_PIN #endif #endif From 7f7c27be305a7fd658e61124d23383b8e2f18a66 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 14 Nov 2020 18:09:17 -0600 Subject: [PATCH 0574/1370] Add parser.is_command(letter, code) --- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/parser.cpp | 4 ++-- Marlin/src/gcode/parser.h | 5 ++++- Marlin/src/gcode/queue.cpp | 13 ++++++++----- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index ee8aa0bba4..544d7b777d 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -250,7 +250,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { * Will still block Gcodes if M511 is disabled, in which case the printer should be unlocked via LCD Menu */ #if ENABLED(PASSWORD_FEATURE) - if (password.is_locked && !(parser.command_letter == 'M' && parser.codenum == 511)) { + if (password.is_locked && !parser.is_command('M', 511)) { SERIAL_ECHO_MSG(STR_PRINTER_LOCKED); return; } diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index bba64dbbc4..4bff045e30 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -45,7 +45,7 @@ char *GCodeParser::command_ptr, *GCodeParser::string_arg, *GCodeParser::value_ptr; char GCodeParser::command_letter; -int GCodeParser::codenum; +uint16_t GCodeParser::codenum; #if ENABLED(USE_GCODE_SUBCODES) uint8_t GCodeParser::subcode; @@ -270,7 +270,7 @@ void GCodeParser::parse(char *p) { // Special handling for M32 [P] !/path/to/file.g# // The path must be the last parameter - if (param == '!' && letter == 'M' && codenum == 32) { + if (param == '!' && is_command('M', 32)) { string_arg = p; // Name starts after '!' char * const lb = strchr(p, '#'); // Already seen '#' as SD char (to pause buffering) if (lb) *lb = '\0'; // Safe to mark the end of the filename diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 17fb084388..69bbdaf02d 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -84,7 +84,7 @@ public: static char *command_ptr, // The command, so it can be echoed *string_arg, // string of command line command_letter; // G, M, or T - static int codenum; // 123 + static uint16_t codenum; // 123 #if ENABLED(USE_GCODE_SUBCODES) static uint8_t subcode; // .1 #endif @@ -244,6 +244,9 @@ public: static bool chain(); #endif + // Test whether the parsed command matches the input + static inline bool is_command(const char ltr, const uint16_t num) { return command_letter == ltr && codenum == num; } + // The code value pointer was set FORCE_INLINE static bool has_value() { return !!value_ptr; } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index f481052cbf..12dfce5111 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -416,11 +416,14 @@ inline void process_stream_char(const char c, uint8_t &sis, char (&buff)[MAX_CMD * keep sensor readings going and watchdog alive. */ inline bool process_line_done(uint8_t &sis, char (&buff)[MAX_CMD_SIZE], int &ind) { - sis = PS_NORMAL; - buff[ind] = 0; - if (ind) { ind = 0; return false; } - thermalManager.manage_heater(); - return true; + sis = PS_NORMAL; // "Normal" Serial Input State + buff[ind] = '\0'; // Of course, I'm a Terminator. + const bool is_empty = (ind == 0); // An empty line? + if (is_empty) + thermalManager.manage_heater(); // Keep sensors satisfied + else + ind = 0; // Start a new line + return is_empty; // Inform the caller } /** From 90f647b6be031c55773d22bebf93b6c80aae3a5e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 14 Nov 2020 18:27:16 -0600 Subject: [PATCH 0575/1370] Fix some LCD/serial strings --- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 14 +++++++------- .../lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 571d576bbc..9c36cca253 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -675,8 +675,8 @@ void MarlinUI::draw_status_screen() { // lcd.setCursor(0, 0); - _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' '); - _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' '); + _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' '); + _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' '); _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); #if HAS_LEVELING && !HAS_HEATED_BED @@ -700,7 +700,7 @@ void MarlinUI::draw_status_screen() { uint8_t len = elapsed.toDigital(buffer); lcd.setCursor((LCD_WIDTH - 1) - len, 1); - lcd.write(0x07); lcd.print(buffer); // LCD_CLOCK_CHAR + lcd.write(LCD_STR_CLOCK[0]); lcd.print(buffer); // // Line 3 - progressbar @@ -807,13 +807,13 @@ void MarlinUI::draw_status_screen() { void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { if (!PanelDetected) return; lcd.setCursor((LCD_WIDTH - 14) / 2, row + 1); - lcd.write(0x02); lcd_put_u8str_P(" E"); lcd.write('1' + extruder); lcd.write(' '); - lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(0x01); lcd.write('/'); - lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(0x01); + lcd.write(LCD_STR_THERMOMETER[0]); lcd_put_u8str_P(PSTR(" E")); lcd.write('1' + extruder); lcd.write(' '); + lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(LCD_STR_DEGREE[0]); lcd.write('/'); + lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(LCD_STR_DEGREE[0]); lcd.print_line(); } - #endif // ADVANCED_PAUSE_FEATURE + #endif // Draw a static item with no left-right margin required. Centered by default. void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 4725afb8bc..b6086b82ed 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -364,7 +364,7 @@ namespace Anycubic { faultDuration++; if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { SendtoTFTLN(AC_msg_nozzle_temp_abnormal); - SERIAL_ECHOLNPAIR_P("Bed temp abnormal! : ", temp); + SERIAL_ECHOLNPAIR("Bed temp abnormal! : ", temp); break; } delay_ms(500); From 3d9b45300061ac748cc15fc95e748f8df1b792d6 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 15 Nov 2020 19:39:58 -0300 Subject: [PATCH 0576/1370] Add Touch Calibration screen (#20049) --- Marlin/Configuration.h | 8 +- Marlin/src/HAL/LPC1768/tft/xpt2046.cpp | 2 +- Marlin/src/HAL/STM32F1/SPI.cpp | 8 +- Marlin/src/HAL/STM32F1/tft/xpt2046.cpp | 2 +- Marlin/src/MarlinCore.cpp | 8 +- Marlin/src/gcode/bedlevel/G26.cpp | 2 +- Marlin/src/gcode/lcd/M995.cpp | 13 +- Marlin/src/inc/Conditionals_LCD.h | 20 +- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 16 +- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 109 +++- .../lib/mks_ui/draw_touch_calibration.cpp | 120 ++++ .../extui/lib/mks_ui/draw_touch_calibration.h | 35 ++ Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 572 +++++------------- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 3 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 35 +- Marlin/src/lcd/language/language_en.h | 9 + Marlin/src/lcd/language/language_fr.h | 9 + Marlin/src/lcd/language/language_pt.h | 9 + Marlin/src/lcd/language/language_pt_br.h | 9 + Marlin/src/lcd/marlinui.cpp | 14 +- Marlin/src/lcd/marlinui.h | 22 +- Marlin/src/lcd/menu/menu.cpp | 8 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 4 +- Marlin/src/lcd/menu/menu_touch_screen.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 70 +-- Marlin/src/lcd/tft/touch.h | 79 +-- Marlin/src/lcd/tft/ui_320x240.cpp | 26 +- Marlin/src/lcd/tft/ui_480x320.cpp | 26 +- Marlin/src/lcd/tft_io/touch_calibration.cpp | 81 +++ Marlin/src/lcd/tft_io/touch_calibration.h | 93 +++ Marlin/src/lcd/touch/touch_buttons.cpp | 28 +- Marlin/src/module/settings.cpp | 12 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 31 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 31 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 31 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 16 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 16 +- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 60 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 29 - Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 16 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 29 - .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 16 - Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 16 +- platformio.ini | 2 +- 45 files changed, 845 insertions(+), 904 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h create mode 100644 Marlin/src/lcd/tft_io/touch_calibration.cpp create mode 100644 Marlin/src/lcd/tft_io/touch_calibration.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 374a420539..be512e371c 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2358,10 +2358,10 @@ #define TOUCH_SCREEN_CALIBRATION - //#define XPT2046_X_CALIBRATION 12316 - //#define XPT2046_Y_CALIBRATION -8981 - //#define XPT2046_X_OFFSET -43 - //#define XPT2046_Y_OFFSET 257 + //#define TOUCH_CALIBRATION_X 12316 + //#define TOUCH_CALIBRATION_Y -8981 + //#define TOUCH_OFFSET_X -43 + //#define TOUCH_OFFSET_Y 257 #if ENABLED(TFT_COLOR_UI) //#define SINGLE_TOUCH_NAVIGATION diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp index e51256a708..cf14405484 100644 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046 +#if HAS_TFT_XPT2046 || HAS_TOUCH_BUTTONS #include "xpt2046.h" #include diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp index 8995109238..c0a35b88d1 100644 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -147,15 +147,15 @@ SPIClass::SPIClass(uint32_t spi_num) { _currentSetting->state = SPI_STATE_IDLE; } -SPIClass::SPIClass(int8_t mosi, int8_t miso, int8_t sclk, int8_t ssel) { +SPIClass::SPIClass(int8_t mosi, int8_t miso, int8_t sclk, int8_t ssel) : SPIClass(1) { #if BOARD_NR_SPI >= 1 - if (mosi == BOARD_SPI1_MOSI_PIN) SPIClass(1); + if (mosi == BOARD_SPI1_MOSI_PIN) setModule(1); #endif #if BOARD_NR_SPI >= 2 - if (mosi == BOARD_SPI2_MOSI_PIN) SPIClass(2); + if (mosi == BOARD_SPI2_MOSI_PIN) setModule(2); #endif #if BOARD_NR_SPI >= 3 - if (mosi == BOARD_SPI3_MOSI_PIN) SPIClass(3); + if (mosi == BOARD_SPI3_MOSI_PIN) setModule(3); #endif } diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp index 4f5c4df375..98371c5ffb 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046 +#if HAS_TFT_XPT2046 || HAS_TOUCH_BUTTONS #include "xpt2046.h" #include diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index f38ba35dd5..acd1321af4 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -60,7 +60,7 @@ #include "sd/cardreader.h" #include "lcd/marlinui.h" -#if HAS_TOUCH_XPT2046 +#if HAS_TOUCH_BUTTONS #include "lcd/touch/touch_buttons.h" #endif @@ -1109,7 +1109,7 @@ void setup() { SETUP_RUN(ethernet.init()); #endif - #if HAS_TOUCH_XPT2046 + #if HAS_TOUCH_BUTTONS SETUP_RUN(touch.init()); #endif @@ -1307,6 +1307,10 @@ void setup() { SETUP_RUN(password.lock_machine()); // Will not proceed until correct password provided #endif + #if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) && EITHER(TFT_CLASSIC_UI, TFT_COLOR_UI) + ui.check_touch_calibration(); + #endif + marlin_state = MF_RUNNING; SETUP_LOG("setup() completed."); diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 1c0d8cba8e..650b039b55 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -405,7 +405,7 @@ inline bool turn_on_heaters() { inline bool prime_nozzle() { const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; - #if HAS_LCD_MENU && !HAS_TOUCH_XPT2046 // ui.button_pressed issue with touchscreen + #if HAS_LCD_MENU && !HAS_TOUCH_BUTTONS // ui.button_pressed issue with touchscreen #if ENABLED(PREVENT_LENGTHY_EXTRUDE) float Total_Prime = 0.0; #endif diff --git a/Marlin/src/gcode/lcd/M995.cpp b/Marlin/src/gcode/lcd/M995.cpp index 72d0d29f76..bc8dc35d4e 100644 --- a/Marlin/src/gcode/lcd/M995.cpp +++ b/Marlin/src/gcode/lcd/M995.cpp @@ -25,14 +25,23 @@ #if ENABLED(TOUCH_SCREEN_CALIBRATION) #include "../gcode.h" -#include "../../lcd/menu/menu.h" + +#if ENABLED(TFT_LVGL_UI) + #include "../../lcd/extui/lib/mks_ui/draw_touch_calibration.h" +#else + #include "../../lcd/menu/menu.h" +#endif /** * M995: Touch screen calibration for TFT display */ void GcodeSuite::M995() { - ui.goto_screen(touch_screen_calibration); + #if ENABLED(TFT_LVGL_UI) + lv_draw_touch_calibration_screen(); + #else + ui.goto_screen(touch_screen_calibration); + #endif } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 0bb98e9e06..b784e12b99 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1073,8 +1073,24 @@ // This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' #if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT #undef TOUCH_SCREEN - #undef TOUCH_SCREEN_CALIBRATION #if !HAS_TFT_LVGL_UI - #define HAS_TOUCH_XPT2046 1 + #define HAS_TOUCH_BUTTONS 1 + #endif +#endif + +// XPT2046_** Compatibility +#if !(defined(TOUCH_CALIBRATION_X) || defined(TOUCH_CALIBRATION_Y) || defined(TOUCH_OFFSET_X) || defined(TOUCH_OFFSET_Y) || defined(TOUCH_ORIENTATION)) + #if defined(XPT2046_X_CALIBRATION) && defined(XPT2046_Y_CALIBRATION) && defined(XPT2046_X_OFFSET) && defined(XPT2046_Y_OFFSET) + #define TOUCH_CALIBRATION_X XPT2046_X_CALIBRATION + #define TOUCH_CALIBRATION_Y XPT2046_Y_CALIBRATION + #define TOUCH_OFFSET_X XPT2046_X_OFFSET + #define TOUCH_OFFSET_Y XPT2046_Y_OFFSET + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE + #else + #define TOUCH_CALIBRATION_X 0 + #define TOUCH_CALIBRATION_Y 0 + #define TOUCH_OFFSET_X 0 + #define TOUCH_OFFSET_Y 0 + #define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE #endif #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 02513e3eaa..1bd9dc47a4 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -364,7 +364,7 @@ // Touch Screen or "Touch Buttons" need XPT2046 pins // but they use different components -#if EITHER(HAS_TFT_XPT2046, HAS_TOUCH_XPT2046) +#if EITHER(HAS_TFT_XPT2046, HAS_TOUCH_BUTTONS) #define NEED_TOUCH_PINS 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 55778634cd..22930a7621 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3172,17 +3172,17 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) * Touch Buttons */ #if ENABLED(TOUCH_SCREEN) - #ifndef XPT2046_X_CALIBRATION - #error "XPT2046_X_CALIBRATION must be defined with TOUCH_SCREEN." + #ifndef TOUCH_CALIBRATION_X + #error "TOUCH_CALIBRATION_X must be defined with TOUCH_SCREEN." #endif - #ifndef XPT2046_Y_CALIBRATION - #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_SCREEN." + #ifndef TOUCH_CALIBRATION_Y + #error "TOUCH_CALIBRATION_Y must be defined with TOUCH_SCREEN." #endif - #ifndef XPT2046_X_OFFSET - #error "XPT2046_X_OFFSET must be defined with TOUCH_SCREEN." + #ifndef TOUCH_OFFSET_X + #error "TOUCH_OFFSET_X must be defined with TOUCH_SCREEN." #endif - #ifndef XPT2046_Y_OFFSET - #error "XPT2046_Y_OFFSET must be defined with TOUCH_SCREEN." + #ifndef TOUCH_OFFSET_Y + #error "TOUCH_OFFSET_Y must be defined with TOUCH_SCREEN." #endif #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 8698dbb017..d7d09fda5b 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -75,6 +75,11 @@ TFT_IO tftio; #include "../touch/touch_buttons.h" +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "../tft_io/touch_calibration.h" + #include "../marlinui.h" +#endif + #define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) #define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) @@ -129,7 +134,7 @@ static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, tftio.set_window(Xmin, Ymin, Xmax, Ymax); } -#if HAS_TOUCH_XPT2046 +#if HAS_TOUCH_BUTTONS static const uint8_t buttonD[] = { B01111111,B11111111,B11111111,B11111110, @@ -302,7 +307,7 @@ static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, } } -#endif // HAS_TOUCH_XPT2046 +#endif // HAS_TOUCH_BUTTONS // Used to fill RGB565 (16bits) background inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { @@ -313,6 +318,27 @@ inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { static bool preinit = true; static uint8_t page; +#if HAS_TOUCH_BUTTONS + static bool redrawTouchButtons = true; + static void drawTouchButtons(u8g_t *u8g, u8g_dev_t *dev) { + if (!redrawTouchButtons) return; + redrawTouchButtons = false; + + // Bottom buttons + setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); + drawImage(buttonD, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTCANCEL_COLOR); + + setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI); + drawImage(buttonA, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR); + + setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI); + drawImage(buttonB, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR); + + setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); + drawImage(buttonC, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTOKMENU_COLOR); + } +#endif // HAS_TOUCH_BUTTONS + uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); @@ -328,6 +354,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, nullptr); tftio.Init(); tftio.InitTFT(); + TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset()); if (preinit) { preinit = false; @@ -343,28 +370,13 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++) u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer); #endif - - // Bottom buttons - #if HAS_TOUCH_XPT2046 - setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); - drawImage(buttonD, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTCANCEL_COLOR); - - setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI); - drawImage(buttonA, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR); - - setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI); - drawImage(buttonB, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTARROWS_COLOR); - - setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); - drawImage(buttonC, u8g, dev, BUTTON_DRAW_WIDTH, BUTTON_DRAW_HEIGHT, TFT_BTOKMENU_COLOR); - #endif // HAS_TOUCH_XPT2046 - return 0; case U8G_DEV_MSG_STOP: preinit = true; break; case U8G_DEV_MSG_PAGE_FIRST: page = 0; + TERN_(HAS_TOUCH_BUTTONS, drawTouchButtons(u8g, dev)); setWindow(u8g, dev, TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI); break; @@ -456,4 +468,65 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_TFT_FN); +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + + static void drawCross(uint16_t x, uint16_t y, uint16_t color) { + tftio.set_window(x - 15, y, x + 15, y); + tftio.WriteMultiple(color, 31); + tftio.set_window(x, y - 15, x, y + 15); + tftio.WriteMultiple(color, 31); + } + + void MarlinUI::touch_calibration_screen() { + uint16_t x, y; + calibrationState calibration_stage = touch_calibration.get_calibration_state(); + + if (calibration_stage == CALIBRATION_NONE) { + // start and clear screen + defer_status_screen(true); + calibration_stage = touch_calibration.calibration_start(); + tftio.set_window(0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); + tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); + } + else { + // clear last cross + x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x; + y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y; + drawCross(x, y, TFT_MARLINBG_COLOR); + } + + const char *str = nullptr; + if (calibration_stage < CALIBRATION_SUCCESS) { + // handle current state + switch (calibration_stage) { + case CALIBRATION_TOP_LEFT: str = GET_TEXT(MSG_TOP_LEFT); break; + case CALIBRATION_BOTTOM_LEFT: str = GET_TEXT(MSG_BOTTOM_LEFT); break; + case CALIBRATION_TOP_RIGHT: str = GET_TEXT(MSG_TOP_RIGHT); break; + case CALIBRATION_BOTTOM_RIGHT: str = GET_TEXT(MSG_BOTTOM_RIGHT); break; + default: break; + } + + x = touch_calibration.calibration_points[calibration_stage].x; + y = touch_calibration.calibration_points[calibration_stage].y; + drawCross(x, y, TFT_MARLINUI_COLOR); + } + else { + // end calibration + str = calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED); + defer_status_screen(false); + touch_calibration.calibration_end(); + TERN_(HAS_TOUCH_BUTTONS, redrawTouchButtons = true); + } + + // draw current message + tftio.set_window(TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI); + do { + set_font(FONT_MENU); + lcd_put_u8str(0, LCD_PIXEL_HEIGHT / 2, str); + } while (u8g.nextPage()); + drawing_screen = false; + } + +#endif // TOUCH_SCREEN_CALIBRATION + #endif // HAS_MARLINUI_U8GLIB && (FSMC_CS_PIN || HAS_SPI_GRAPHICAL_TFT) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.cpp new file mode 100644 index 0000000000..69307a702b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.cpp @@ -0,0 +1,120 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_TFT_LVGL_UI, TOUCH_SCREEN_CALIBRATION) + +#include "draw_ui.h" +#include "draw_touch_calibration.h" +#include + +#include "../../../../inc/MarlinConfig.h" +#include "../../../tft_io/touch_calibration.h" +#include "SPI_TFT.h" + +static lv_obj_t *scr; +static lv_obj_t *status_label; + +static void event_handler(lv_obj_t *obj, lv_event_t event); + +enum { + ID_TC_RETURN = 1 +}; + +static void drawCross(uint16_t x, uint16_t y, uint16_t color) { + SPI_TFT.tftio.set_window(x - 15, y, x + 15, y); + SPI_TFT.tftio.WriteMultiple(color, 31); + SPI_TFT.tftio.set_window(x, y - 15, x, y + 15); + SPI_TFT.tftio.WriteMultiple(color, 31); +} + +void lv_update_touch_calibration_screen() { + uint16_t x, y; + + calibrationState calibration_stage = touch_calibration.get_calibration_state(); + if (calibration_stage == CALIBRATION_NONE) { + // start and clear screen + calibration_stage = touch_calibration.calibration_start(); + } + else { + // clear last cross + x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x; + y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y; + drawCross(x, y, LV_COLOR_BACKGROUND.full); + } + + const char *str = nullptr; + if (calibration_stage < CALIBRATION_SUCCESS) { + // handle current state + switch (calibration_stage) { + case CALIBRATION_TOP_LEFT: str = GET_TEXT(MSG_TOP_LEFT); break; + case CALIBRATION_BOTTOM_LEFT: str = GET_TEXT(MSG_BOTTOM_LEFT); break; + case CALIBRATION_TOP_RIGHT: str = GET_TEXT(MSG_TOP_RIGHT); break; + case CALIBRATION_BOTTOM_RIGHT: str = GET_TEXT(MSG_BOTTOM_RIGHT); break; + default: break; + } + + x = touch_calibration.calibration_points[calibration_stage].x; + y = touch_calibration.calibration_points[calibration_stage].y; + drawCross(x, y, LV_COLOR_WHITE.full); + } + else { + // end calibration + str = calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED); + touch_calibration.calibration_end(); + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_TC_RETURN); + } + + // draw current message + lv_label_set_text(status_label, str); + lv_obj_align(status_label, nullptr, LV_ALIGN_CENTER, 0, 0); +} + +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + switch (obj->mks_obj_id) { + case ID_TC_RETURN: + TERN_(MKS_TEST, curent_disp_ui = 1); + lv_clear_touch_calibration_screen(); + lv_draw_ready_print(); + break; + } +} + +void lv_draw_touch_calibration_screen() { + disp_state_stack._disp_index = 0; + ZERO(disp_state_stack._disp_state); + scr = lv_screen_create(TOUCH_CALIBRATION_UI, ""); + + status_label = lv_label_create(scr, ""); + lv_obj_align(status_label, nullptr, LV_ALIGN_CENTER, 0, 0); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + lv_update_touch_calibration_screen(); +} + +void lv_clear_touch_calibration_screen() { + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI && TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h new file mode 100644 index 0000000000..b14700dcf3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h @@ -0,0 +1,35 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_touch_calibration_screen(); +extern void lv_clear_touch_calibration_screen(); +extern void lv_update_touch_calibration_screen(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 58b593a128..a6c96d6799 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -48,6 +48,10 @@ #include "../../../../feature/pause.h" #endif +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "draw_touch_calibration.h" +#endif + CFG_ITMES gCfgItems; UI_CFG uiCfg; DISP_STATE_STACK disp_state_stack; @@ -1138,227 +1142,94 @@ void clear_cur_ui() { last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index]; switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { - case PRINT_READY_UI: - //Get_Temperature_Flg = 0; - lv_clear_ready_print(); - break; - case PRINT_FILE_UI: - lv_clear_print_file(); - break; - case PRINTING_UI: - lv_clear_printing(); - break; - case MOVE_MOTOR_UI: - lv_clear_move_motor(); - break; - case OPERATE_UI: - lv_clear_operation(); - break; - case PAUSE_UI: - //Clear_pause(); - break; - case EXTRUSION_UI: - lv_clear_extrusion(); - break; - case PRE_HEAT_UI: - lv_clear_preHeat(); - break; - case CHANGE_SPEED_UI: - lv_clear_change_speed(); - break; - case FAN_UI: - lv_clear_fan(); - break; - case SET_UI: - lv_clear_set(); - break; - case ZERO_UI: - lv_clear_home(); - break; - case SPRAYER_UI: - //Clear_Sprayer(); - break; - case MACHINE_UI: - //Clear_Machine(); - break; - case LANGUAGE_UI: - lv_clear_language(); - break; - case ABOUT_UI: - lv_clear_about(); - break; - case LOG_UI: - //Clear_Connect(); - break; - case DISK_UI: - //Clear_Disk(); - break; + case PRINT_READY_UI: //Get_Temperature_Flg = 0; + lv_clear_ready_print(); break; + case PRINT_FILE_UI: lv_clear_print_file(); break; + case PRINTING_UI: lv_clear_printing(); break; + case MOVE_MOTOR_UI: lv_clear_move_motor(); break; + case OPERATE_UI: lv_clear_operation(); break; + case PAUSE_UI: /* Clear_pause(); */ break; + case EXTRUSION_UI: lv_clear_extrusion(); break; + case PRE_HEAT_UI: lv_clear_preHeat(); break; + case CHANGE_SPEED_UI: lv_clear_change_speed(); break; + case FAN_UI: lv_clear_fan(); break; + case SET_UI: lv_clear_set(); break; + case ZERO_UI: lv_clear_home(); break; + case SPRAYER_UI: /* Clear_Sprayer(); */ break; + case MACHINE_UI: /* Clear_Machine(); */ break; + case LANGUAGE_UI: lv_clear_language(); break; + case ABOUT_UI: lv_clear_about(); break; + case LOG_UI: /* Clear_Connect(); */ break; + case DISK_UI: /* Clear_Disk(); */ break; #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_UI: - lv_clear_wifi(); - break; + case WIFI_UI: lv_clear_wifi(); break; #endif - case MORE_UI: - //Clear_more(); - break; - case FILETRANSFER_UI: - //Clear_fileTransfer(); - break; - case DIALOG_UI: - lv_clear_dialog(); - break; - case FILETRANSFERSTATE_UI: - //Clear_WifiFileTransferdialog(); - break; - case PRINT_MORE_UI: - //Clear_Printmore(); - break; - case FILAMENTCHANGE_UI: - lv_clear_filament_change(); - break; - case LEVELING_UI: - lv_clear_manualLevel(); - break; - case BIND_UI: - //Clear_Bind(); - break; + case MORE_UI: /* Clear_more(); */ break; + case FILETRANSFER_UI: /* Clear_fileTransfer(); */ break; + case DIALOG_UI: lv_clear_dialog(); break; + case FILETRANSFERSTATE_UI: /* Clear_WifiFileTransferdialog(); */ break; + case PRINT_MORE_UI: /* Clear_Printmore(); */ break; + case FILAMENTCHANGE_UI: lv_clear_filament_change(); break; + case LEVELING_UI: lv_clear_manualLevel(); break; + case BIND_UI: /* Clear_Bind(); */ break; #if HAS_BED_PROBE - case NOZZLE_PROBE_OFFSET_UI: - lv_clear_auto_level_offset_settings(); - break; + case NOZZLE_PROBE_OFFSET_UI: lv_clear_auto_level_offset_settings(); break; #endif - case TOOL_UI: - lv_clear_tool(); - break; - case MESHLEVELING_UI: - //Clear_MeshLeveling(); - break; - case HARDWARE_TEST_UI: - //Clear_Hardwaretest(); - break; + case TOOL_UI: lv_clear_tool(); break; + case MESHLEVELING_UI: /* Clear_MeshLeveling(); */ break; + case HARDWARE_TEST_UI: /* Clear_Hardwaretest(); */ break; #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_LIST_UI: - lv_clear_wifi_list(); - break; + case WIFI_LIST_UI: lv_clear_wifi_list(); break; #endif - case KEY_BOARD_UI: - lv_clear_keyboard(); - break; + case KEY_BOARD_UI: lv_clear_keyboard(); break; #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_TIPS_UI: - lv_clear_wifi_tips(); - break; + case WIFI_TIPS_UI: lv_clear_wifi_tips(); break; #endif - case MACHINE_PARA_UI: - lv_clear_machine_para(); - break; - case MACHINE_SETTINGS_UI: - lv_clear_machine_settings(); - break; - case TEMPERATURE_SETTINGS_UI: - //Clear_TemperatureSettings(); - break; - case MOTOR_SETTINGS_UI: - lv_clear_motor_settings(); - break; - case MACHINETYPE_UI: - //Clear_MachineType(); - break; - case STROKE_UI: - //Clear_Stroke(); - break; - case HOME_DIR_UI: - //Clear_HomeDir(); - break; - case ENDSTOP_TYPE_UI: - //Clear_EndstopType(); - break; - case FILAMENT_SETTINGS_UI: - lv_clear_filament_settings(); - break; - case LEVELING_SETTIGNS_UI: - //Clear_LevelingSettings(); - break; - case LEVELING_PARA_UI: - lv_clear_level_settings(); - break; - case DELTA_LEVELING_PARA_UI: - //Clear_DeltaLevelPara(); - break; - case MANUAL_LEVELING_POSIGION_UI: - lv_clear_manual_level_pos_settings(); - break; - case MAXFEEDRATE_UI: - lv_clear_max_feedrate_settings(); - break; - case STEPS_UI: - lv_clear_step_settings(); - break; - case ACCELERATION_UI: - lv_clear_acceleration_settings(); - break; - case JERK_UI: - #if HAS_CLASSIC_JERK - lv_clear_jerk_settings(); - #endif - break; - case MOTORDIR_UI: - //Clear_MotorDir(); - break; - case HOMESPEED_UI: - //Clear_HomeSpeed(); - break; - case NOZZLE_CONFIG_UI: - //Clear_NozzleConfig(); - break; - case HOTBED_CONFIG_UI: - //Clear_HotbedConfig(); - break; - case ADVANCED_UI: - lv_clear_advance_settings(); - break; - case DOUBLE_Z_UI: - //Clear_DoubleZ(); - break; - case ENABLE_INVERT_UI: - //Clear_EnableInvert(); - break; - case NUMBER_KEY_UI: - lv_clear_number_key(); - break; - case BABY_STEP_UI: - lv_clear_baby_stepping(); - break; - case PAUSE_POS_UI: - lv_clear_pause_position(); - break; + case MACHINE_PARA_UI: lv_clear_machine_para(); break; + case MACHINE_SETTINGS_UI: lv_clear_machine_settings(); break; + case TEMPERATURE_SETTINGS_UI: /* Clear_TemperatureSettings(); */ break; + case MOTOR_SETTINGS_UI: lv_clear_motor_settings(); break; + case MACHINETYPE_UI: /* Clear_MachineType(); */ break; + case STROKE_UI: /* Clear_Stroke(); */ break; + case HOME_DIR_UI: /* Clear_HomeDir(); */ break; + case ENDSTOP_TYPE_UI: /* Clear_EndstopType(); */ break; + case FILAMENT_SETTINGS_UI: lv_clear_filament_settings(); break; + case LEVELING_SETTIGNS_UI: /* Clear_LevelingSettings(); */ break; + case LEVELING_PARA_UI: lv_clear_level_settings(); break; + case DELTA_LEVELING_PARA_UI: /* Clear_DeltaLevelPara(); */ break; + case MANUAL_LEVELING_POSIGION_UI: lv_clear_manual_level_pos_settings(); break; + case MAXFEEDRATE_UI: lv_clear_max_feedrate_settings(); break; + case STEPS_UI: lv_clear_step_settings(); break; + case ACCELERATION_UI: lv_clear_acceleration_settings(); break; + case JERK_UI: TERN_(HAS_CLASSIC_JERK, lv_clear_jerk_settings()); break; + case MOTORDIR_UI: /* Clear_MotorDir(); */ break; + case HOMESPEED_UI: /* Clear_HomeSpeed(); */ break; + case NOZZLE_CONFIG_UI: /* Clear_NozzleConfig(); */ break; + case HOTBED_CONFIG_UI: /* Clear_HotbedConfig(); */ break; + case ADVANCED_UI: lv_clear_advance_settings(); break; + case DOUBLE_Z_UI: /* Clear_DoubleZ(); */ break; + case ENABLE_INVERT_UI: /* Clear_EnableInvert(); */ break; + case NUMBER_KEY_UI: lv_clear_number_key(); break; + case BABY_STEP_UI: lv_clear_baby_stepping(); break; + case PAUSE_POS_UI: lv_clear_pause_position(); break; #if HAS_TRINAMIC_CONFIG - case TMC_CURRENT_UI: - lv_clear_tmc_current_settings(); - break; + case TMC_CURRENT_UI: lv_clear_tmc_current_settings(); break; #endif - case EEPROM_SETTINGS_UI: - lv_clear_eeprom_settings(); - break; + case EEPROM_SETTINGS_UI: lv_clear_eeprom_settings(); break; #if HAS_STEALTHCHOP - case TMC_MODE_UI: - lv_clear_tmc_step_mode_settings(); - break; + case TMC_MODE_UI: lv_clear_tmc_step_mode_settings(); break; #endif #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_SETTINGS_UI: - lv_clear_wifi_settings(); - break; + case WIFI_SETTINGS_UI: lv_clear_wifi_settings(); break; #endif #if USE_SENSORLESS - case HOMING_SENSITIVITY_UI: - lv_clear_homing_sensitivity_settings(); - break; + case HOMING_SENSITIVITY_UI: lv_clear_homing_sensitivity_settings(); break; #endif #if HAS_ROTARY_ENCODER - case ENCODER_SETTINGS_UI: - lv_clear_encoder_settings(); - break; + case ENCODER_SETTINGS_UI: lv_clear_encoder_settings(); break; + #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + case TOUCH_CALIBRATION_UI: lv_clear_touch_calibration_screen(); break; #endif default: break; } @@ -1370,227 +1241,98 @@ void draw_return_ui() { disp_state_stack._disp_index--; switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { - case PRINT_READY_UI: - lv_draw_ready_print(); - break; - case PRINT_FILE_UI: - lv_draw_print_file(); - break; - case PRINTING_UI: - if (gCfgItems.from_flash_pic) flash_preview_begin = true; - else default_preview_flg = true; - lv_draw_printing(); - break; - case MOVE_MOTOR_UI: - lv_draw_move_motor(); - break; - case OPERATE_UI: - lv_draw_operation(); - break; + case PRINT_READY_UI: lv_draw_ready_print(); break; + case PRINT_FILE_UI: lv_draw_print_file(); break; - #if 1 - case PAUSE_UI: - //draw_pause(); - break; - #endif + case PRINTING_UI: if (gCfgItems.from_flash_pic) + flash_preview_begin = true; + else + default_preview_flg = true; + lv_draw_printing(); + break; - case EXTRUSION_UI: - lv_draw_extrusion(); - break; - case PRE_HEAT_UI: - lv_draw_preHeat(); - break; - case CHANGE_SPEED_UI: - lv_draw_change_speed(); - break; - case FAN_UI: - lv_draw_fan(); - break; - case SET_UI: - lv_draw_set(); - break; - case ZERO_UI: - lv_draw_home(); - break; - case SPRAYER_UI: - //draw_Sprayer(); - break; - case MACHINE_UI: - //draw_Machine(); - break; - case LANGUAGE_UI: - lv_draw_language(); - break; - case ABOUT_UI: - lv_draw_about(); - break; + case MOVE_MOTOR_UI: lv_draw_move_motor(); break; + case OPERATE_UI: lv_draw_operation(); break; + case PAUSE_UI: /* draw_pause(); */ break; + case EXTRUSION_UI: lv_draw_extrusion(); break; + case PRE_HEAT_UI: lv_draw_preHeat(); break; + case CHANGE_SPEED_UI: lv_draw_change_speed(); break; + case FAN_UI: lv_draw_fan(); break; + case SET_UI: lv_draw_set(); break; + case ZERO_UI: lv_draw_home(); break; + case SPRAYER_UI: /* draw_Sprayer(); */ break; + case MACHINE_UI: /* draw_Machine(); */ break; + case LANGUAGE_UI: lv_draw_language(); break; + case ABOUT_UI: lv_draw_about(); break; - case CALIBRATE_UI: - //draw_calibrate(); - break; - case DISK_UI: - //draw_Disk(); - break; + case CALIBRATE_UI: /* draw_calibrate(); */ break; + case DISK_UI: /* draw_Disk(); */ break; #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_UI: - lv_draw_wifi(); - break; + case WIFI_UI: lv_draw_wifi(); break; #endif - case MORE_UI: - //draw_More(); - break; - case PRINT_MORE_UI: - //draw_printmore(); - break; - case FILAMENTCHANGE_UI: - lv_draw_filament_change(); - break; - case LEVELING_UI: - lv_draw_manualLevel(); - break; - case BIND_UI: - //draw_bind(); - break; + case MORE_UI: /* draw_More(); */ break; + case PRINT_MORE_UI: /* draw_printmore(); */ break; + case FILAMENTCHANGE_UI: lv_draw_filament_change(); break; + case LEVELING_UI: lv_draw_manualLevel(); break; + case BIND_UI: /* draw_bind(); */ break; #if HAS_BED_PROBE - case NOZZLE_PROBE_OFFSET_UI: - lv_draw_auto_level_offset_settings(); - break; + case NOZZLE_PROBE_OFFSET_UI: lv_draw_auto_level_offset_settings(); break; #endif - case TOOL_UI: - lv_draw_tool(); - break; - case MESHLEVELING_UI: - //draw_meshleveling(); - break; - case HARDWARE_TEST_UI: - //draw_Hardwaretest(); - break; - case WIFI_LIST_UI: - #if ENABLED(USE_WIFI_FUNCTION) - lv_draw_wifi_list(); - #endif - break; - case KEY_BOARD_UI: - lv_draw_keyboard(); - break; - case WIFI_TIPS_UI: - #if ENABLED(USE_WIFI_FUNCTION) - lv_draw_wifi_tips(); - #endif - break; - case MACHINE_PARA_UI: - lv_draw_machine_para(); - break; - case MACHINE_SETTINGS_UI: - lv_draw_machine_settings(); - break; - case TEMPERATURE_SETTINGS_UI: - //draw_TemperatureSettings(); - break; - case MOTOR_SETTINGS_UI: - lv_draw_motor_settings(); - break; - case MACHINETYPE_UI: - //draw_MachineType(); - break; - case STROKE_UI: - //draw_Stroke(); - break; - case HOME_DIR_UI: - //draw_HomeDir(); - break; - case ENDSTOP_TYPE_UI: - //draw_EndstopType(); - break; - case FILAMENT_SETTINGS_UI: - lv_draw_filament_settings(); - break; - case LEVELING_SETTIGNS_UI: - //draw_LevelingSettings(); - break; - case LEVELING_PARA_UI: - lv_draw_level_settings(); - break; - case DELTA_LEVELING_PARA_UI: - //draw_DeltaLevelPara(); - break; - case MANUAL_LEVELING_POSIGION_UI: - lv_draw_manual_level_pos_settings(); - break; - case MAXFEEDRATE_UI: - lv_draw_max_feedrate_settings(); - break; - case STEPS_UI: - lv_draw_step_settings(); - break; - case ACCELERATION_UI: - lv_draw_acceleration_settings(); - break; - case JERK_UI: - #if HAS_CLASSIC_JERK - lv_draw_jerk_settings(); - #endif - break; - case MOTORDIR_UI: - //draw_MotorDir(); - break; - case HOMESPEED_UI: - //draw_HomeSpeed(); - break; - case NOZZLE_CONFIG_UI: - //draw_NozzleConfig(); - break; - case HOTBED_CONFIG_UI: - //draw_HotbedConfig(); - break; - case ADVANCED_UI: - lv_draw_advance_settings(); - break; - case DOUBLE_Z_UI: - //draw_DoubleZ(); - break; - case ENABLE_INVERT_UI: - //draw_EnableInvert(); - break; - case NUMBER_KEY_UI: - lv_draw_number_key(); - break; - case DIALOG_UI: - //draw_dialog(uiCfg.dialogType); - break; - case BABY_STEP_UI: - lv_draw_baby_stepping(); - break; - case PAUSE_POS_UI: - lv_draw_pause_position(); - break; - #if HAS_TRINAMIC_CONFIG - case TMC_CURRENT_UI: - lv_draw_tmc_current_settings(); - break; - #endif - case EEPROM_SETTINGS_UI: - lv_draw_eeprom_settings(); - break; + case TOOL_UI: lv_draw_tool(); break; + case MESHLEVELING_UI: /* draw_meshleveling(); */ break; + case HARDWARE_TEST_UI: /* draw_Hardwaretest(); */ break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_LIST_UI: lv_draw_wifi_list(); break; + #endif + case KEY_BOARD_UI: lv_draw_keyboard(); break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_TIPS_UI: lv_draw_wifi_tips(); break; + #endif + case MACHINE_PARA_UI: lv_draw_machine_para(); break; + case MACHINE_SETTINGS_UI: lv_draw_machine_settings(); break; + case TEMPERATURE_SETTINGS_UI: /* draw_TemperatureSettings(); */ break; + case MOTOR_SETTINGS_UI: lv_draw_motor_settings(); break; + case MACHINETYPE_UI: /* draw_MachineType(); */ break; + case STROKE_UI: /* draw_Stroke(); */ break; + case HOME_DIR_UI: /* draw_HomeDir(); */ break; + case ENDSTOP_TYPE_UI: /* draw_EndstopType(); */ break; + case FILAMENT_SETTINGS_UI: lv_draw_filament_settings(); break; + case LEVELING_SETTIGNS_UI: /* draw_LevelingSettings(); */ break; + case LEVELING_PARA_UI: lv_draw_level_settings(); break; + case DELTA_LEVELING_PARA_UI: /* draw_DeltaLevelPara(); */ break; + case MANUAL_LEVELING_POSIGION_UI: lv_draw_manual_level_pos_settings(); break; + case MAXFEEDRATE_UI: lv_draw_max_feedrate_settings(); break; + case STEPS_UI: lv_draw_step_settings(); break; + case ACCELERATION_UI: lv_draw_acceleration_settings(); break; + #if HAS_CLASSIC_JERK + case JERK_UI: lv_draw_jerk_settings(); break; + #endif + case MOTORDIR_UI: /* draw_MotorDir(); */ break; + case HOMESPEED_UI: /* draw_HomeSpeed(); */ break; + case NOZZLE_CONFIG_UI: /* draw_NozzleConfig(); */ break; + case HOTBED_CONFIG_UI: /* draw_HotbedConfig(); */ break; + case ADVANCED_UI: lv_draw_advance_settings(); break; + case DOUBLE_Z_UI: /* draw_DoubleZ(); */ break; + case ENABLE_INVERT_UI: /* draw_EnableInvert(); */ break; + case NUMBER_KEY_UI: lv_draw_number_key(); break; + case DIALOG_UI: /* draw_dialog(uiCfg.dialogType); */ break; + case BABY_STEP_UI: lv_draw_baby_stepping(); break; + case PAUSE_POS_UI: lv_draw_pause_position(); break; + #if HAS_TRINAMIC_CONFIG + case TMC_CURRENT_UI: lv_draw_tmc_current_settings(); break; + #endif + case EEPROM_SETTINGS_UI: lv_draw_eeprom_settings(); break; #if HAS_STEALTHCHOP - case TMC_MODE_UI: - lv_draw_tmc_step_mode_settings(); - break; + case TMC_MODE_UI: lv_draw_tmc_step_mode_settings(); break; #endif #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_SETTINGS_UI: - lv_draw_wifi_settings(); - break; + case WIFI_SETTINGS_UI: lv_draw_wifi_settings(); break; #endif #if USE_SENSORLESS - case HOMING_SENSITIVITY_UI: - lv_draw_homing_sensitivity_settings(); - break; + case HOMING_SENSITIVITY_UI: lv_draw_homing_sensitivity_settings(); break; #endif #if HAS_ROTARY_ENCODER - case ENCODER_SETTINGS_UI: - lv_draw_encoder_settings(); - break; + case ENCODER_SETTINGS_UI: lv_draw_encoder_settings(); break; #endif default: break; } @@ -1879,15 +1621,11 @@ void LV_TASK_HANDLER() { lv_task_handler(); if (mks_test_flag == 0x1E) mks_hardware_test(); - #if HAS_GCODE_PREVIEW - disp_pre_gcode(2, 36); - #endif + TERN_(HAS_GCODE_PREVIEW, disp_pre_gcode(2, 36)); GUI_RefreshPage(); - #if ENABLED(USE_WIFI_FUNCTION) - get_wifi_commands(); - #endif + TERN_(USE_WIFI_FUNCTION, get_wifi_commands()); //sd_detection(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index eb54b3e4ea..6d162676e8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -313,7 +313,8 @@ typedef enum { EEPROM_SETTINGS_UI, WIFI_SETTINGS_UI, HOMING_SENSITIVITY_UI, - ENCODER_SETTINGS_UI + ENCODER_SETTINGS_UI, + TOUCH_CALIBRATION_UI } DISP_STATE; typedef struct { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 21e3040c2e..9b8e3e1589 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -51,6 +51,11 @@ XPT2046 touch; #include "../../../../feature/powerloss.h" #endif +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "../../../tft_io/touch_calibration.h" + #include "draw_touch_calibration.h" +#endif + #include #ifndef TFT_WIDTH @@ -211,7 +216,14 @@ void tft_lvgl_init() { } #endif - if (ready) lv_draw_ready_print(); + if (ready) { + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + if (touch_calibration.need_calibration()) lv_draw_touch_calibration_screen(); + else lv_draw_ready_print(); + #else + lv_draw_ready_print(); + #endif + } if (mks_test_flag == 0x1E) mks_gpio_test(); @@ -240,17 +252,22 @@ unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { static bool get_point(int16_t *x, int16_t *y) { bool is_touched = touch.getRawPoint(x, y); - if (is_touched) { - *x = int16_t((int32_t(*x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; - *y = int16_t((int32_t(*y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; - } + if (!is_touched) return false; - #if (TFT_ROTATION & TFT_ROTATE_180) - *x = int16_t((TFT_WIDTH) - (int)(*x)); - *y = int16_t((TFT_HEIGHT) - (int)(*y)); + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + const calibrationState state = touch_calibration.get_calibration_state(); + if (state >= CALIBRATION_TOP_LEFT && state <= CALIBRATION_BOTTOM_RIGHT) { + if (touch_calibration.handleTouch(*x, *y)) lv_update_touch_calibration_screen(); + return false; + } + *x = int16_t((int32_t(*x) * touch_calibration.calibration.x) >> 16) + touch_calibration.calibration.offset_x; + *y = int16_t((int32_t(*y) * touch_calibration.calibration.y) >> 16) + touch_calibration.calibration.offset_y; + #else + *x = int16_t((int32_t(*x) * TOUCH_CALIBRATION_X) >> 16) + TOUCH_OFFSET_X; + *y = int16_t((int32_t(*y) * TOUCH_CALIBRATION_Y) >> 16) + TOUCH_OFFSET_Y; #endif - return is_touched; + return true; } bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index ffaaf2e02a..d14880d977 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -671,6 +671,15 @@ namespace Language_en { PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Probe Wizard"); PROGMEM Language_Str MSG_SOUND = _UxGT("Sound"); + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Top Left"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Bottom Left"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Top Right"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Bottom Right"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibration Completed"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibration Failed"); + #endif } #if FAN_COUNT == 1 diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 661d6b5cc3..90e57ab3fb 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -570,4 +570,13 @@ namespace Language_fr { PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dans:"); PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Lissage"); + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Haut à Gauche"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Bas à Gauche"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Haut à Droite"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Bas à Droite"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibration Terminée"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Échec de l'étalonnage"); + #endif } diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 37da621624..3a002d657b 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -160,4 +160,13 @@ namespace Language_pt { PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Fim de curso"); PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora Incorreta"); + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Superior Esquerdo"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Inferior Esquerdo"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Superior Direto"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Inferior Direto"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibração Completa"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibração Falhou"); + #endif } diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index b52ae51c1c..c210425ce8 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -478,4 +478,13 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Clique p. finalizar")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Continuando...")); #endif + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Superior Esquerdo"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Inferior Esquerdo"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Superior Direto"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Inferior Direto"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibração Completa"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibração Falhou"); + #endif } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 457d3cefd7..13c85be787 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -158,7 +158,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if HAS_SLOW_BUTTONS volatile uint8_t MarlinUI::slow_buttons; #endif - #if HAS_TOUCH_XPT2046 + #if HAS_TOUCH_BUTTONS #include "touch/touch_buttons.h" bool MarlinUI::on_edit_screen = false; #endif @@ -241,7 +241,7 @@ millis_t MarlinUI::next_button_update_ms; // = 0 int8_t MarlinUI::encoderDirection = ENCODERBASE; #endif - #if HAS_TOUCH_XPT2046 + #if HAS_TOUCH_BUTTONS uint8_t MarlinUI::touch_buttons; uint8_t MarlinUI::repeat_delay; #endif @@ -862,7 +862,7 @@ void MarlinUI::update() { quick_feedback(); // - Always make a click sound }; - #if HAS_TOUCH_XPT2046 + #if HAS_TOUCH_BUTTONS if (touch_buttons) { RESET_STATUS_TIMEOUT(); if (touch_buttons & (EN_A | EN_B)) { // Menu arrows, in priority @@ -883,7 +883,7 @@ void MarlinUI::update() { } else // keep wait_for_unclick value - #endif // HAS_TOUCH_XPT2046 + #endif // HAS_TOUCH_BUTTONS { // Integrated LCD click handling via button_pressed @@ -905,7 +905,7 @@ void MarlinUI::update() { next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; - #if HAS_TOUCH_XPT2046 + #if HAS_TOUCH_BUTTONS if (on_status_screen()) next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2; @@ -1250,7 +1250,7 @@ void MarlinUI::update() { #if HAS_SLOW_BUTTONS | slow_buttons #endif - #if BOTH(HAS_TOUCH_XPT2046, HAS_ENCODER_ACTION) + #if BOTH(HAS_TOUCH_BUTTONS, HAS_ENCODER_ACTION) | (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF)) #endif ); @@ -1561,7 +1561,7 @@ void MarlinUI::update() { #endif - #if HAS_TOUCH_XPT2046 + #if HAS_TOUCH_BUTTONS // // Screen Click diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index ed02f4000b..0445c641ba 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -31,6 +31,10 @@ #include "../sd/cardreader.h" #endif +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "tft_io/touch_calibration.h" +#endif + #if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY) #define HAS_ENCODER_ACTION 1 #endif @@ -74,7 +78,7 @@ uint8_t get_ADC_keyValue(); #endif - #define LCD_UPDATE_INTERVAL TERN(HAS_TOUCH_XPT2046, 50, 100) + #define LCD_UPDATE_INTERVAL TERN(HAS_TOUCH_BUTTONS, 50, 100) #if HAS_LCD_MENU @@ -146,7 +150,7 @@ #define BUTTON_PRESSED(BN) !READ(BTN_## BN) - #if BUTTON_EXISTS(ENC) || HAS_TOUCH_XPT2046 + #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS #define BLEN_C 2 #define EN_C _BV(BLEN_C) #endif @@ -212,7 +216,7 @@ #endif -#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_XPT2046, IS_TFTGLCD_PANEL) +#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL) #define BLEN_D 3 #define EN_D _BV(BLEN_D) #define LCD_BACK_CLICKED() (buttons & EN_D) @@ -311,6 +315,12 @@ public: // LCD implementations static void clear_lcd(); + #if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) + static void check_touch_calibration() { + if (touch_calibration.need_calibration()) currentScreen = touch_calibration_screen; + } + #endif + #if ENABLED(SDSUPPORT) static void media_changed(const uint8_t old_stat, const uint8_t stat); #endif @@ -452,7 +462,7 @@ public: static void draw_hotend_status(const uint8_t row, const uint8_t extruder); #endif - #if HAS_TOUCH_XPT2046 + #if HAS_TOUCH_BUTTONS static bool on_edit_screen; static void screen_click(const uint8_t row, const uint8_t col, const uint8_t x, const uint8_t y); #endif @@ -512,7 +522,7 @@ public: static millis_t return_to_status_ms; #endif - #if HAS_TOUCH_XPT2046 + #if HAS_TOUCH_BUTTONS static uint8_t touch_buttons; static uint8_t repeat_delay; #endif @@ -682,7 +692,7 @@ public: #endif #if ENABLED(TOUCH_SCREEN_CALIBRATION) - static void touch_calibration(); + static void touch_calibration_screen(); #endif #if HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 35c736c560..81ac32a60c 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -82,7 +82,7 @@ void MarlinUI::save_previous_screen() { void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back/*=false*/)) { IF_DISABLED(TURBO_BACK_MENU_ITEM, constexpr bool is_back = false); - TERN_(HAS_TOUCH_XPT2046, on_edit_screen = false); + TERN_(HAS_TOUCH_BUTTONS, on_edit_screen = false); if (screen_history_depth > 0) { menuPosition &sh = screen_history[--screen_history_depth]; goto_screen(sh.menu_function, @@ -123,7 +123,7 @@ void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_b * MenuItem_int3::draw(encoderLine == _thisItemNr, _lcdLineNr, plabel, &feedrate_percentage, 10, 999) */ void MenuEditItemBase::edit_screen(strfunc_t strfunc, loadfunc_t loadfunc) { - TERN_(HAS_TOUCH_XPT2046, ui.repeat_delay = BUTTON_DELAY_EDIT); + TERN_(HAS_TOUCH_BUTTONS, ui.repeat_delay = BUTTON_DELAY_EDIT); if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = 0; if (int32_t(ui.encoderPosition) > maxEditValue) ui.encoderPosition = maxEditValue; if (ui.should_draw()) @@ -145,7 +145,7 @@ void MenuEditItemBase::goto_edit_screen( const screenFunc_t cb, // Callback after edit const bool le // Flag to call cb() during editing ) { - TERN_(HAS_TOUCH_XPT2046, ui.on_edit_screen = true); + TERN_(HAS_TOUCH_BUTTONS, ui.on_edit_screen = true); ui.screen_changed = true; ui.save_previous_screen(); ui.refresh(); @@ -175,7 +175,7 @@ bool printer_busy() { void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, const uint8_t top/*=0*/, const uint8_t items/*=0*/) { if (currentScreen != screen) { - TERN_(HAS_TOUCH_XPT2046, repeat_delay = BUTTON_DELAY_MENU); + TERN_(HAS_TOUCH_BUTTONS, repeat_delay = BUTTON_DELAY_MENU); TERN_(LCD_SET_PROGRESS_MANUALLY, progress_reset()); diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index e19b04ccb5..905d7a07cd 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -37,8 +37,10 @@ #endif #if HAS_GRAPHICAL_TFT - #include "../tft/touch.h" #include "../tft/tft.h" + #if ENABLED(TOUCH_SCREEN) + #include "../tft/touch.h" + #endif #endif #if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp index ea610e0886..5fc4b584d5 100644 --- a/Marlin/src/lcd/menu/menu_touch_screen.cpp +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -29,7 +29,7 @@ void touch_screen_calibration() { - ui.touch_calibration(); + ui.touch_calibration_screen(); } diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index adbc2923a4..112ff0b438 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -48,17 +48,12 @@ millis_t Touch::last_touch_ms = 0, Touch::repeat_delay, Touch::touch_time; TouchControlType Touch::touch_control_type = NONE; -touch_calibration_t Touch::calibration; -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - calibrationState Touch::calibration_state = CALIBRATION_NONE; - touch_calibration_point_t Touch::calibration_points[4]; -#endif #if HAS_RESUME_CONTINUE extern bool wait_for_user; #endif void Touch::init() { - calibration_reset(); + TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset()); reset(); io.Init(); enable(); @@ -155,52 +150,7 @@ void Touch::touch(touch_control_t *control) { switch (control->type) { #if ENABLED(TOUCH_SCREEN_CALIBRATION) case CALIBRATE: - ui.refresh(); - - if (calibration_state < CALIBRATION_SUCCESS) { - calibration_points[calibration_state].x = int16_t(control->data >> 16); - calibration_points[calibration_state].y = int16_t(control->data & 0xFFFF); - calibration_points[calibration_state].raw_x = x; - calibration_points[calibration_state].raw_y = y; - } - - switch (calibration_state) { - case CALIBRATION_POINT_1: calibration_state = CALIBRATION_POINT_2; break; - case CALIBRATION_POINT_2: calibration_state = CALIBRATION_POINT_3; break; - case CALIBRATION_POINT_3: calibration_state = CALIBRATION_POINT_4; break; - case CALIBRATION_POINT_4: - if (validate_precision_x(0, 1) && validate_precision_x(2, 3) && validate_precision_y(0, 2) && validate_precision_y(1, 3)) { - calibration_state = CALIBRATION_SUCCESS; - calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_x + calibration_points[2].raw_x - calibration_points[1].raw_x - calibration_points[0].raw_x); - calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_y - calibration_points[2].raw_y + calibration_points[1].raw_y - calibration_points[0].raw_y); - calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_x + calibration_points[1].raw_x) * calibration.x) >> 17); - calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_y + calibration_points[2].raw_y) * calibration.y) >> 17); - calibration.orientation = TOUCH_LANDSCAPE; - } - else if (validate_precision_y(0, 1) && validate_precision_y(2, 3) && validate_precision_x(0, 2) && validate_precision_x(1, 3)) { - calibration_state = CALIBRATION_SUCCESS; - calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_y + calibration_points[2].raw_y - calibration_points[1].raw_y - calibration_points[0].raw_y); - calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_x - calibration_points[2].raw_x + calibration_points[1].raw_x - calibration_points[0].raw_x); - calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_y + calibration_points[1].raw_y) * calibration.x) >> 17); - calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_x + calibration_points[2].raw_x) * calibration.y) >> 17); - calibration.orientation = TOUCH_PORTRAIT; - } - else { - calibration_state = CALIBRATION_FAIL; - calibration_reset(); - } - - if (calibration_state == CALIBRATION_SUCCESS) { - SERIAL_ECHOLNPGM("Touch screen calibration completed"); - SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_X ", calibration.x); - SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_Y ", calibration.y); - SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x); - SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y); - SERIAL_ECHOPGM("TOUCH_ORIENTATION "); if (calibration.orientation == TOUCH_LANDSCAPE) SERIAL_ECHOLNPGM("TOUCH_LANDSCAPE"); else SERIAL_ECHOLNPGM("TOUCH_PORTRAIT"); - } - break; - default: break; - } + if (touch_calibration.handleTouch(x, y)) ui.refresh(); break; #endif // TOUCH_SCREEN_CALIBRATION @@ -298,12 +248,18 @@ void Touch::hold(touch_control_t *control, millis_t delay) { } bool Touch::get_point(int16_t *x, int16_t *y) { - bool is_touched = (calibration.orientation == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + bool is_touched = (touch_calibration.calibration.orientation == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); - if (is_touched && calibration.orientation != TOUCH_ORIENTATION_NONE) { - *x = int16_t((int32_t(*x) * calibration.x) >> 16) + calibration.offset_x; - *y = int16_t((int32_t(*y) * calibration.y) >> 16) + calibration.offset_y; - } + if (is_touched && touch_calibration.calibration.orientation != TOUCH_ORIENTATION_NONE) { + *x = int16_t((int32_t(*x) * touch_calibration.calibration.x) >> 16) + touch_calibration.calibration.offset_x; + *y = int16_t((int32_t(*y) * touch_calibration.calibration.y) >> 16) + touch_calibration.calibration.offset_y; + } + #else + bool is_touched = (TOUCH_ORIENTATION == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); + *x = uint16_t((uint32_t(*x) * TOUCH_CALIBRATION_X) >> 16) + TOUCH_OFFSET_X; + *y = uint16_t((uint32_t(*y) * TOUCH_CALIBRATION_Y) >> 16) + TOUCH_OFFSET_Y; + #endif return is_touched; } Touch touch; diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h index 7cb05891de..8023f649ce 100644 --- a/Marlin/src/lcd/tft/touch.h +++ b/Marlin/src/lcd/tft/touch.h @@ -23,42 +23,16 @@ #include "../../inc/MarlinConfigPre.h" -#if ENABLED(TOUCH_SCREEN) - #include "tft_color.h" #include "tft_image.h" +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "../tft_io/touch_calibration.h" +#endif + #include HAL_PATH(../../HAL, tft/xpt2046.h) #define TOUCH_DRIVER XPT2046 -#ifndef TOUCH_SCREEN_CALIBRATION_PRECISION - #define TOUCH_SCREEN_CALIBRATION_PRECISION 80 -#endif - -#ifndef TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS - #define TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS 2500 -#endif - -#define TOUCH_ORIENTATION_NONE 0 -#define TOUCH_LANDSCAPE 1 -#define TOUCH_PORTRAIT 2 - -#if !(defined(TOUCH_CALIBRATION_X) || defined(TOUCH_CALIBRATION_Y) || defined(TOUCH_OFFSET_X) || defined(TOUCH_OFFSET_Y) || defined(TOUCH_ORIENTATION)) - #if defined(XPT2046_X_CALIBRATION) && defined(XPT2046_Y_CALIBRATION) && defined(XPT2046_X_OFFSET) && defined(XPT2046_Y_OFFSET) - #define TOUCH_CALIBRATION_X XPT2046_X_CALIBRATION - #define TOUCH_CALIBRATION_Y XPT2046_Y_CALIBRATION - #define TOUCH_OFFSET_X XPT2046_X_OFFSET - #define TOUCH_OFFSET_Y XPT2046_Y_OFFSET - #define TOUCH_ORIENTATION TOUCH_LANDSCAPE - #else - #define TOUCH_CALIBRATION_X 0 - #define TOUCH_CALIBRATION_Y 0 - #define TOUCH_OFFSET_X 0 - #define TOUCH_OFFSET_Y 0 - #define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE - #endif -#endif - // Menu Navigation extern int8_t encoderTopLine, encoderLine, screen_items; @@ -101,31 +75,6 @@ typedef struct __attribute__((__packed__)) { intptr_t data; } touch_control_t; -typedef struct __attribute__((__packed__)) { - int32_t x; - int32_t y; - int16_t offset_x; - int16_t offset_y; - uint8_t orientation; -} touch_calibration_t; - -typedef struct __attribute__((__packed__)) { - uint16_t x; - uint16_t y; - int16_t raw_x; - int16_t raw_y; -} touch_calibration_point_t; - -enum calibrationState : uint8_t { - CALIBRATION_POINT_1 = 0x00, - CALIBRATION_POINT_2, - CALIBRATION_POINT_3, - CALIBRATION_POINT_4, - CALIBRATION_SUCCESS, - CALIBRATION_FAIL, - CALIBRATION_NONE, -}; - #define MAX_CONTROLS 16 #define MINIMUM_HOLD_TIME 15 #define TOUCH_REPEAT_DELAY 75 @@ -150,15 +99,6 @@ class Touch { static void touch(touch_control_t *control); static void hold(touch_control_t *control, millis_t delay = 0); - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - static calibrationState calibration_state; - static touch_calibration_point_t calibration_points[4]; - - static bool validate_precision(int32_t a, int32_t b) { return (a > b ? (100 * b) / a : (100 * a) / b) > TOUCH_SCREEN_CALIBRATION_PRECISION; } - static bool validate_precision_x(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_x, calibration_points[b].raw_x); } - static bool validate_precision_y(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_y, calibration_points[b].raw_y); } - #endif // TOUCH_SCREEN_CALIBRATION - public: static void init(); static void reset() { controls_count = 0; touch_time = 0; current_control = NULL; } @@ -175,17 +115,6 @@ class Touch { static void enable() { enabled = true; } static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, intptr_t data = 0); - - static touch_calibration_t calibration; - static void calibration_reset() { calibration = {TOUCH_CALIBRATION_X, TOUCH_CALIBRATION_Y, TOUCH_OFFSET_X, TOUCH_OFFSET_Y, TOUCH_ORIENTATION}; } - - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - static calibrationState calibration_start() { calibration = {0, 0, 0, 0, TOUCH_ORIENTATION_NONE}; return calibration_state = CALIBRATION_POINT_1; } - static void calibration_end() { calibration_state = CALIBRATION_NONE; } - static calibrationState get_calibration_state() { return calibration_state; } - #endif // TOUCH_SCREEN_CALIBRATION }; extern Touch touch; - -#endif // TOUCH_SCREEN diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 559bc5b222..3444cfe12f 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -584,33 +584,37 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #endif // AUTO_BED_LEVELING_UBL #if ENABLED(TOUCH_SCREEN_CALIBRATION) - void MarlinUI::touch_calibration() { - static uint16_t x, y; + void MarlinUI::touch_calibration_screen() { + uint16_t x, y; - calibrationState calibration_stage = touch.get_calibration_state(); + calibrationState calibration_stage = touch_calibration.get_calibration_state(); if (calibration_stage == CALIBRATION_NONE) { defer_status_screen(true); clear_lcd(); - calibration_stage = touch.calibration_start(); + calibration_stage = touch_calibration.calibration_start(); } else { + x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x; + y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y; tft.canvas(x - 15, y - 15, 31, 31); tft.set_background(COLOR_BACKGROUND); } - x = 20; y = 20; touch.clear(); if (calibration_stage < CALIBRATION_SUCCESS) { switch (calibration_stage) { - case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; - case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; - case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; - case CALIBRATION_POINT_4: x = TFT_WIDTH - 21; y = TFT_HEIGHT - 21; tft_string.set("Bottom Right"); break; + case CALIBRATION_TOP_LEFT: tft_string.set(GET_TEXT(MSG_TOP_LEFT)); break; + case CALIBRATION_BOTTOM_LEFT: tft_string.set(GET_TEXT(MSG_BOTTOM_LEFT)); break; + case CALIBRATION_TOP_RIGHT: tft_string.set(GET_TEXT(MSG_TOP_RIGHT)); break; + case CALIBRATION_BOTTOM_RIGHT: tft_string.set(GET_TEXT(MSG_BOTTOM_RIGHT)); break; default: break; } + x = touch_calibration.calibration_points[calibration_stage].x; + y = touch_calibration.calibration_points[calibration_stage].y; + tft.canvas(x - 15, y - 15, 31, 31); tft.set_background(COLOR_BACKGROUND); tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); @@ -619,9 +623,9 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); } else { - tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? "Calibration Completed" : "Calibration Failed"); + tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED)); defer_status_screen(false); - touch.calibration_end(); + touch_calibration.calibration_end(); touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index e2bbdcde7f..ac76e81c93 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -589,33 +589,37 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #endif // AUTO_BED_LEVELING_UBL #if ENABLED(TOUCH_SCREEN_CALIBRATION) - void MarlinUI::touch_calibration() { - static uint16_t x, y; + void MarlinUI::touch_calibration_screen() { + uint16_t x, y; - calibrationState calibration_stage = touch.get_calibration_state(); + calibrationState calibration_stage = touch_calibration.get_calibration_state(); if (calibration_stage == CALIBRATION_NONE) { defer_status_screen(true); clear_lcd(); - calibration_stage = touch.calibration_start(); + calibration_stage = touch_calibration.calibration_start(); } else { + x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x; + y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y; tft.canvas(x - 15, y - 15, 31, 31); tft.set_background(COLOR_BACKGROUND); } - x = 20; y = 20; touch.clear(); if (calibration_stage < CALIBRATION_SUCCESS) { switch (calibration_stage) { - case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; - case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; - case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; - case CALIBRATION_POINT_4: x = TFT_WIDTH - 21; y = TFT_HEIGHT - 21; tft_string.set("Bottom Right"); break; + case CALIBRATION_TOP_LEFT: tft_string.set(GET_TEXT(MSG_TOP_LEFT)); break; + case CALIBRATION_BOTTOM_LEFT: tft_string.set(GET_TEXT(MSG_BOTTOM_LEFT)); break; + case CALIBRATION_TOP_RIGHT: tft_string.set(GET_TEXT(MSG_TOP_RIGHT)); break; + case CALIBRATION_BOTTOM_RIGHT: tft_string.set(GET_TEXT(MSG_BOTTOM_RIGHT)); break; default: break; } + x = touch_calibration.calibration_points[calibration_stage].x; + y = touch_calibration.calibration_points[calibration_stage].y; + tft.canvas(x - 15, y - 15, 31, 31); tft.set_background(COLOR_BACKGROUND); tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); @@ -624,9 +628,9 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); } else { - tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? "Calibration Completed" : "Calibration Failed"); + tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED)); defer_status_screen(false); - touch.calibration_end(); + touch_calibration.calibration_end(); touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); } diff --git a/Marlin/src/lcd/tft_io/touch_calibration.cpp b/Marlin/src/lcd/tft_io/touch_calibration.cpp new file mode 100644 index 0000000000..e4ad8f215b --- /dev/null +++ b/Marlin/src/lcd/tft_io/touch_calibration.cpp @@ -0,0 +1,81 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + +#include "touch_calibration.h" + +TouchCalibration touch_calibration; + +touch_calibration_t TouchCalibration::calibration; +calibrationState TouchCalibration::calibration_state = CALIBRATION_NONE; +touch_calibration_point_t TouchCalibration::calibration_points[4]; + +void TouchCalibration::validate_calibration() { + const bool landscape = validate_precision_x(0, 1) && validate_precision_x(2, 3) && validate_precision_y(0, 2) && validate_precision_y(1, 3); + const bool portrait = validate_precision_y(0, 1) && validate_precision_y(2, 3) && validate_precision_x(0, 2) && validate_precision_x(1, 3); + + if (landscape || portrait) { + calibration_state = CALIBRATION_SUCCESS; + calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_x + calibration_points[2].raw_x - calibration_points[1].raw_x - calibration_points[0].raw_x); + calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_y - calibration_points[2].raw_y + calibration_points[1].raw_y - calibration_points[0].raw_y); + calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_x + calibration_points[1].raw_x) * calibration.x) >> 17); + calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_y + calibration_points[2].raw_y) * calibration.y) >> 17); + calibration.orientation = landscape ? TOUCH_LANDSCAPE : TOUCH_PORTRAIT; + } + else { + calibration_state = CALIBRATION_FAIL; + calibration_reset(); + } + + if (calibration_state == CALIBRATION_SUCCESS) { + SERIAL_ECHOLNPGM("Touch screen calibration completed"); + SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_X ", calibration.x); + SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_Y ", calibration.y); + SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x); + SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y); + SERIAL_ECHOPGM("TOUCH_ORIENTATION "); if (calibration.orientation == TOUCH_LANDSCAPE) SERIAL_ECHOLNPGM("TOUCH_LANDSCAPE"); else SERIAL_ECHOLNPGM("TOUCH_PORTRAIT"); + } +} + +bool TouchCalibration::handleTouch(uint16_t x, uint16_t y) { + static millis_t next_button_update_ms = 0; + const millis_t now = millis(); + if (PENDING(now, next_button_update_ms)) return false; + next_button_update_ms = now + BUTTON_DELAY_MENU; + + if (calibration_state < CALIBRATION_SUCCESS) { + calibration_points[calibration_state].raw_x = x; + calibration_points[calibration_state].raw_y = y; + } + + switch (calibration_state) { + case CALIBRATION_TOP_LEFT: calibration_state = CALIBRATION_BOTTOM_LEFT; break; + case CALIBRATION_BOTTOM_LEFT: calibration_state = CALIBRATION_TOP_RIGHT; break; + case CALIBRATION_TOP_RIGHT: calibration_state = CALIBRATION_BOTTOM_RIGHT; break; + case CALIBRATION_BOTTOM_RIGHT: validate_calibration(); break; + default: break; + } + + return true; +} + +#endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/lcd/tft_io/touch_calibration.h b/Marlin/src/lcd/tft_io/touch_calibration.h new file mode 100644 index 0000000000..5bebafffd2 --- /dev/null +++ b/Marlin/src/lcd/tft_io/touch_calibration.h @@ -0,0 +1,93 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#ifndef TOUCH_SCREEN_CALIBRATION_PRECISION + #define TOUCH_SCREEN_CALIBRATION_PRECISION 80 +#endif + +#ifndef TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS + #define TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS 2500 +#endif + +#define TOUCH_ORIENTATION_NONE 0 +#define TOUCH_LANDSCAPE 1 +#define TOUCH_PORTRAIT 2 + +#ifndef TOUCH_ORIENTATION + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE +#endif + +typedef struct __attribute__((__packed__)) { + int32_t x, y; + int16_t offset_x, offset_y; + uint8_t orientation; +} touch_calibration_t; + +typedef struct __attribute__((__packed__)) { + uint16_t x, y; + int16_t raw_x, raw_y; +} touch_calibration_point_t; + +enum calibrationState : uint8_t { + CALIBRATION_TOP_LEFT = 0x00, + CALIBRATION_BOTTOM_LEFT, + CALIBRATION_TOP_RIGHT, + CALIBRATION_BOTTOM_RIGHT, + CALIBRATION_SUCCESS, + CALIBRATION_FAIL, + CALIBRATION_NONE, +}; + +class TouchCalibration { +public: + static calibrationState calibration_state; + static touch_calibration_point_t calibration_points[4]; + + static bool validate_precision(int32_t a, int32_t b) { return (a > b ? (100 * b) / a : (100 * a) / b) > TOUCH_SCREEN_CALIBRATION_PRECISION; } + static bool validate_precision_x(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_x, calibration_points[b].raw_x); } + static bool validate_precision_y(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_y, calibration_points[b].raw_y); } + static void validate_calibration(); + + static touch_calibration_t calibration; + static void calibration_reset() { calibration = { TOUCH_CALIBRATION_X, TOUCH_CALIBRATION_Y, TOUCH_OFFSET_X, TOUCH_OFFSET_Y, TOUCH_ORIENTATION }; } + static bool need_calibration() { return !calibration.offset_x && !calibration.offset_y && !calibration.x && !calibration.y; } + + static calibrationState calibration_start() { + calibration = { 0, 0, 0, 0, TOUCH_ORIENTATION_NONE }; + calibration_state = CALIBRATION_TOP_LEFT; + calibration_points[CALIBRATION_TOP_LEFT].x = 30; + calibration_points[CALIBRATION_TOP_LEFT].y = 30; + calibration_points[CALIBRATION_BOTTOM_LEFT].x = 30; + calibration_points[CALIBRATION_BOTTOM_LEFT].y = TFT_HEIGHT - 31; + calibration_points[CALIBRATION_TOP_RIGHT].x = TFT_WIDTH - 31; + calibration_points[CALIBRATION_TOP_RIGHT].y = 30; + calibration_points[CALIBRATION_BOTTOM_RIGHT].x = TFT_WIDTH - 31; + calibration_points[CALIBRATION_BOTTOM_RIGHT].y = TFT_HEIGHT - 31; + return calibration_state; + } + static void calibration_end() { calibration_state = CALIBRATION_NONE; } + static calibrationState get_calibration_state() { return calibration_state; } + + static bool handleTouch(uint16_t x, uint16_t y); +}; + +extern TouchCalibration touch_calibration; diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp index 4e98486969..8e231ca9ab 100644 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -19,7 +19,7 @@ #include "../../inc/MarlinConfig.h" -#if HAS_TOUCH_XPT2046 +#if HAS_TOUCH_BUTTONS #include "touch_buttons.h" #include "../scaled_tft.h" @@ -27,7 +27,11 @@ #include HAL_PATH(../../HAL, tft/xpt2046.h) XPT2046 touchIO; -#include "../../lcd/marlinui.h" // For EN_C bit mask +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "../tft_io/touch_calibration.h" +#endif + +#include "../marlinui.h" // For EN_C bit mask #define DOGM_AREA_LEFT TFT_PIXEL_OFFSET_X #define DOGM_AREA_TOP TFT_PIXEL_OFFSET_Y @@ -47,14 +51,20 @@ uint8_t TouchButtons::read_buttons() { if (!touchIO.getRawPoint(&x, &y)) return 0; - x = uint16_t((uint32_t(x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; - y = uint16_t((uint32_t(y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; - - #if (TFT_ROTATION & TFT_ROTATE_180) - x = TFT_WIDTH - x; - y = TFT_HEIGHT - y; + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + const calibrationState state = touch_calibration.get_calibration_state(); + if (state >= CALIBRATION_TOP_LEFT && state <= CALIBRATION_BOTTOM_RIGHT) { + if (touch_calibration.handleTouch(x, y)) ui.refresh(); + return 0; + } + x = int16_t((int32_t(x) * touch_calibration.calibration.x) >> 16) + touch_calibration.calibration.offset_x; + y = int16_t((int32_t(y) * touch_calibration.calibration.y) >> 16) + touch_calibration.calibration.offset_y; + #else + x = uint16_t((uint32_t(x) * TOUCH_CALIBRATION_X) >> 16) + TOUCH_OFFSET_X; + y = uint16_t((uint32_t(y) * TOUCH_CALIBRATION_Y) >> 16) + TOUCH_OFFSET_Y; #endif + // Touch within the button area simulates an encoder button if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) return WITHIN(x, BUTTOND_X_LO, BUTTOND_X_HI) ? EN_D @@ -77,4 +87,4 @@ uint8_t TouchButtons::read_buttons() { return 0; } -#endif // HAS_TOUCH_XPT2046 +#endif // HAS_TOUCH_BUTTONS diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index b1b9bb6e0a..21997b4740 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -146,7 +146,7 @@ #endif #if ENABLED(TOUCH_SCREEN_CALIBRATION) - #include "../lcd/tft/touch.h" + #include "../lcd/tft_io/touch_calibration.h" #endif #if HAS_ETHERNET @@ -443,7 +443,7 @@ typedef struct SettingsDataStruct { // TOUCH_SCREEN_CALIBRATION // #if ENABLED(TOUCH_SCREEN_CALIBRATION) - touch_calibration_t touch_calibration; + touch_calibration_t touch_calibration_data; #endif // Ethernet settings @@ -1410,7 +1410,7 @@ void MarlinSettings::postprocess() { // TOUCH_SCREEN_CALIBRATION // #if ENABLED(TOUCH_SCREEN_CALIBRATION) - EEPROM_WRITE(touch.calibration); + EEPROM_WRITE(touch_calibration.calibration); #endif // @@ -2293,8 +2293,8 @@ void MarlinSettings::postprocess() { // TOUCH_SCREEN_CALIBRATION // #if ENABLED(TOUCH_SCREEN_CALIBRATION) - _FIELD_TEST(touch.calibration); - EEPROM_READ(touch.calibration); + _FIELD_TEST(touch_calibration_data); + EEPROM_READ(touch_calibration.calibration); #endif // @@ -2626,7 +2626,7 @@ void MarlinSettings::reset() { // // TOUCH_SCREEN_CALIBRATION // - TERN_(TOUCH_SCREEN_CALIBRATION, touch.calibration_reset()); + TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset()); // // Buzzer enable/disable diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index bb2cacd5ba..04e9a2f80a 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -353,36 +353,7 @@ #define LCD_PINS_ENABLE -1 #define LCD_PINS_RS -1 - // XPT2046 Touch Screen calibration - #if ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11245 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8629 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 685 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -285 - #endif - #elif ENABLED(TFT_480x320_SPI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17232 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11196 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 1047 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -358 - #endif - - #define TFT_BUFFER_SIZE 2400 - #endif + #define TFT_BUFFER_SIZE 2400 #elif IS_TFTGLCD_PANEL diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index b0d1ec1f03..705dd4f9aa 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -268,36 +268,7 @@ #define LCD_PINS_ENABLE -1 #define LCD_PINS_RS -1 - // XPT2046 Touch Screen calibration - #if ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11386 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8684 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 689 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -273 - #endif - #elif ENABLED(TFT_COLOR_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -16741 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11258 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 1024 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -367 - #endif - - #define TFT_BUFFER_SIZE 2400 - #endif + #define TFT_BUFFER_SIZE 2400 #define BTN_EN1 P3_25 #define BTN_EN2 P3_26 diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index dcf0741a76..8d2ce364b2 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -318,36 +318,7 @@ #define LCD_PINS_ENABLE -1 #define LCD_PINS_RS -1 - // XPT2046 Touch Screen calibration - #if ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11386 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8684 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 689 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -273 - #endif - #elif ENABLED(TFT_COLOR_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17089 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11424 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 1044 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -365 - #endif - - #define TFT_BUFFER_SIZE 2400 - #endif + #define TFT_BUFFER_SIZE 2400 #else // !MKS_12864OLED_SSD1306 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index b13fde026c..32d4e0c9d4 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -158,17 +158,17 @@ // XPT2046 Touch Screen calibration #if ANY(TFT_LVGL_UI, TFT_COLOR_UI, TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17181 + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X -17181 #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11434 + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y 11434 #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 501 + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X 501 #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -9 + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y -9 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index a015fb2704..066a6cc8aa 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -173,17 +173,17 @@ // XPT2046 Touch Screen calibration #if ANY(TFT_LVGL_UI, TFT_COLOR_UI, TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17181 + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X -17181 #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11434 + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y 11434 #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 501 + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X 501 #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -9 + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y -9 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index 5f91072440..a056aa96e5 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -286,22 +286,22 @@ // MKS Robin TFT v2.0 with ILI9341 // Read display identification information (0xD3 on ILI9341) -//#define XPT2046_X_CALIBRATION 12013 -//#define XPT2046_Y_CALIBRATION -8711 -//#define XPT2046_X_OFFSET -32 -//#define XPT2046_Y_OFFSET 256 +//#define TOUCH_CALIBRATION_X 12013 +//#define TOUCH_CALIBRATION_Y -8711 +//#define TOUCH_OFFSET_X -32 +//#define TOUCH_OFFSET_Y 256 // MKS Robin TFT v1.1 with ILI9328 -//#define XPT2046_X_CALIBRATION -11792 -//#define XPT2046_Y_CALIBRATION 8947 -//#define XPT2046_X_OFFSET 342 -//#define XPT2046_Y_OFFSET -19 +//#define TOUCH_CALIBRATION_X -11792 +//#define TOUCH_CALIBRATION_Y 8947 +//#define TOUCH_OFFSET_X 342 +//#define TOUCH_OFFSET_Y -19 // MKS Robin TFT v1.1 with R61505 -//#define XPT2046_X_CALIBRATION 12489 -//#define XPT2046_Y_CALIBRATION 9210 -//#define XPT2046_X_OFFSET -52 -//#define XPT2046_Y_OFFSET -17 +//#define TOUCH_CALIBRATION_X 12489 +//#define TOUCH_CALIBRATION_Y 9210 +//#define TOUCH_OFFSET_X -52 +//#define TOUCH_OFFSET_Y -17 // QQS-Pro uses MKS Robin TFT v2.0 @@ -324,42 +324,6 @@ #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 #endif -// XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI_FSMC, TFT_COLOR_UI) - #define TFT_BUFFER_SIZE 14400 - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 12218 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -8814 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -35 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 256 - #endif - -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 12149 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -8746 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -35 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 256 - #endif - - #define TFT_MARLINUI_COLOR 0xFFFF // White - #define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow - #define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan -#endif - #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PC2 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 9c0f2deeab..b1f41f9fa7 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -282,35 +282,6 @@ #define TFT_BUFFER_SIZE 14400 #endif -// XPT2046 Touch Screen calibration -#if EITHER(HAS_TFT_LVGL_UI, TFT_480x320_SPI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17253 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11579 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 514 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -24 - #endif -#elif HAS_SPI_GRAPHICAL_TFT - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11386 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8684 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 339 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -18 - #endif -#endif - #if HAS_WIRED_LCD && !HAS_SPI_TFT // NON TFT Displays diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 2406c22d55..ca4dd8d792 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -171,17 +171,17 @@ #endif #if ENABLED(TOUCH_SCREEN) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 12033 + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X 12033 #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -9047 + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y -9047 #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -30 + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X -30 #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 254 + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y 254 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 3c9b2f5b59..760f27060e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -202,35 +202,6 @@ #define TFT_BUFFER_SIZE 14400 #endif -// XPT2046 Touch Screen calibration -#if ANY(HAS_TFT_LVGL_UI_FSMC, TFT_COLOR_UI, TFT_CLASSIC_UI) && ENABLED(TFT_RES_480x320) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 17880 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -12234 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -45 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 349 - #endif -#elif EITHER(TFT_COLOR_UI, TFT_CLASSIC_UI) && ENABLED(TFT_RES_320x240) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12246 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 9453 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 360 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -22 - #endif -#endif - #define HAS_SPI_FLASH 1 #if HAS_SPI_FLASH #define SPI_FLASH_SIZE 0x1000000 // 16MB diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 9c1d073da6..8b41296971 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -285,22 +285,6 @@ #define TFT_BUFFER_SIZE 14400 #endif -// XPT2046 Touch Screen calibration -#if ANY(TFT_LVGL_UI, TFT_COLOR_UI, TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17253 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11579 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 514 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -24 - #endif -#endif - #if HAS_WIRED_LCD && !HAS_SPI_TFT // NON TFT Displays diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 2fc34ce296..543a90b66b 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -141,17 +141,17 @@ // XPT2046 Touch Screen calibration #if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17181 + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X -17181 #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11434 + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y 11434 #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 501 + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X 501 #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -9 + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y -9 #endif #endif diff --git a/platformio.ini b/platformio.ini index 932d19075d..626c7d2bec 100644 --- a/platformio.ini +++ b/platformio.ini @@ -236,7 +236,7 @@ HAS_SPI_TFT = src_filter=+ + DWIN_CREALITY_LCD = src_filter=+ IS_TFTGLCD_PANEL = src_filter=+ -HAS_TOUCH_XPT2046 = src_filter=+ +HAS_TOUCH_BUTTONS = src_filter=+ HAS_LCD_MENU = src_filter=+ HAS_GAMES = src_filter=+ MARLIN_BRICKOUT = src_filter=+ From 983bb8906339e1d5ae2892b1ff63922ab8bb51b5 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Mon, 16 Nov 2020 00:56:05 -0500 Subject: [PATCH 0577/1370] Update IDEX menus, add post-M605 event G-code (#20133) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/gcode/control/M605.cpp | 4 ++++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_configuration.cpp | 15 +++++++++------ buildroot/tests/mega2560-tests | 6 +++--- 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ecc6f9dd89..2c9ac1aea4 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -637,6 +637,9 @@ // Default x offset in duplication mode (typically set to half print bed width) #define DEFAULT_DUPLICATION_X_OFFSET 100 + + // Default action to execute following M605 mode change commands. Typically G28X to apply new mode. + //#define EVENT_GCODE_IDEX_AFTER_MODECHANGE "G28X" #endif // Activate a solenoid on the active extruder with M380. Disable all with M381. diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index b1e54b25e7..0d7a9f431b 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -103,6 +103,10 @@ } idex_set_parked(false); set_duplication_enabled(false); + + #ifdef EVENT_GCODE_IDEX_AFTER_MODECHANGE + gcode.process_subcommands_now_P(PSTR(EVENT_GCODE_IDEX_AFTER_MODECHANGE)); + #endif } else if (!parser.seen('W')) // if no S or W parameter, the DXC mode gets reset to the user's default dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index d14880d977..4231eca5ce 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -144,6 +144,7 @@ namespace Language_en { PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("Duplicate X-Gap"); PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2nd Nozzle X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2nd Nozzle Y"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z"); diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index f667242bc1..2c3af1e5ee 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -194,16 +194,19 @@ void menu_advanced_settings(); START_MENU(); BACK_ITEM(MSG_CONFIGURATION); - GCODES_ITEM(MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100")); + GCODES_ITEM(MSG_IDEX_MODE_AUTOPARK, PSTR("M605S1\nG28X\nG1X0")); GCODES_ITEM(MSG_IDEX_MODE_DUPLICATE, need_g28 - ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100") // If Y or Z is not homed, do a full G28 first - : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100") + ? PSTR("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0") // If Y or Z is not homed, do a full G28 first + : PSTR("M605S1\nT0\nM605S2\nG28X\nG1X0") ); GCODES_ITEM(MSG_IDEX_MODE_MIRRORED_COPY, need_g28 - ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") // If Y or Z is not homed, do a full G28 first - : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") + ? PSTR("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0\nM605S3") // If Y or Z is not homed, do a full G28 first + : PSTR("M605S1\nT0\nM605S2\nG28 X\nG1X0\nM605S3") ); - GCODES_ITEM(MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X")); + GCODES_ITEM(MSG_IDEX_MODE_FULL_CTRL, PSTR("M605S0\nG28X")); + + EDIT_ITEM(float42_52, MSG_IDEX_DUPE_GAP, &duplicate_extruder_x_offset, (X2_MIN_POS) - (X1_MIN_POS), (X_BED_SIZE) - 20); + END_MENU(); } diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 9ae43dcdb5..cc9830be36 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -259,10 +259,10 @@ exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home ######## Example Configurations ############## # -# Test a full-featured CR-10S config +# Test a basic DUAL_X_CARRIAGE configuration # -use_example_configs Creality/CR-10S -exec_test $1 $2 "Full-featured CR-10S config" +use_example_configs Formbot/T_Rex_3 +exec_test $1 $2 "Formbot/T_Rex_3 example configuration." # # BQ Hephestos 2 From daa2a04fc9ca7abed3a58306b2627f84a89ddbbc Mon Sep 17 00:00:00 2001 From: FanDjango <51046875+FanDjango@users.noreply.github.com> Date: Mon, 16 Nov 2020 21:56:05 +0100 Subject: [PATCH 0578/1370] Guards for large BLOCK_BUFFER_SIZE (>=128) (#20130) Co-authored-by: Scott Lahteine --- Marlin/src/inc/SanityCheck.h | 2 ++ Marlin/src/module/planner.cpp | 18 ++++++++---------- Marlin/src/module/planner.h | 6 +++++- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 22930a7621..18506163f5 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2759,6 +2759,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #if !BLOCK_BUFFER_SIZE || !IS_POWER_OF_2(BLOCK_BUFFER_SIZE) #error "BLOCK_BUFFER_SIZE must be a power of 2." +#elif BLOCK_BUFFER_SIZE > 64 + #error "A very large BLOCK_BUFFER_SIZE is not needed and takes longer to drain the buffer on pause / cancel." #endif #if ENABLED(LED_CONTROL_MENU) && !IS_ULTIPANEL diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 74535df1f9..147adb12e3 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -213,7 +213,7 @@ xyze_float_t Planner::previous_speed; float Planner::previous_nominal_speed_sqr; #if ENABLED(DISABLE_INACTIVE_EXTRUDER) - uint8_t Planner::g_uc_extruder_last_move[EXTRUDERS] = { 0 }; + last_move_t Planner::g_uc_extruder_last_move[EXTRUDERS] = { 0 }; #endif #ifdef XY_FREQUENCY_LIMIT @@ -2037,22 +2037,20 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #if ENABLED(DISABLE_INACTIVE_EXTRUDER) // Enable only the selected extruder LOOP_L_N(i, EXTRUDERS) - if (g_uc_extruder_last_move[i] > 0) g_uc_extruder_last_move[i]--; - - #if HAS_DUPLICATION_MODE - if (extruder_duplication_enabled && extruder == 0) { - ENABLE_AXIS_E1(); - g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; - } - #endif + if (g_uc_extruder_last_move[i]) g_uc_extruder_last_move[i]--; #define ENABLE_ONE_E(N) do{ \ if (extruder == N) { \ ENABLE_AXIS_E##N(); \ g_uc_extruder_last_move[N] = (BLOCK_BUFFER_SIZE) * 2; \ + if ((N) == 0 && TERN0(HAS_DUPLICATION_MODE, extruder_duplication_enabled)) \ + ENABLE_AXIS_E1(); \ } \ - else if (!g_uc_extruder_last_move[N]) \ + else if (!g_uc_extruder_last_move[N]) { \ DISABLE_AXIS_E##N(); \ + if ((N) == 0 && TERN0(HAS_DUPLICATION_MODE, extruder_duplication_enabled)) \ + DISABLE_AXIS_E1(); \ + } \ }while(0); #else diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index c4e11490b1..ac30938f2a 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -287,6 +287,10 @@ typedef struct { #endif } skew_factor_t; +#if ENABLED(DISABLE_INACTIVE_EXTRUDER) + typedef IF<(BLOCK_BUFFER_SIZE > 64), uint16_t, uint8_t>::type last_move_t; +#endif + class Planner { public: @@ -435,7 +439,7 @@ class Planner { #if ENABLED(DISABLE_INACTIVE_EXTRUDER) // Counters to manage disabling inactive extruders - static uint8_t g_uc_extruder_last_move[EXTRUDERS]; + static last_move_t g_uc_extruder_last_move[EXTRUDERS]; #endif #if HAS_WIRED_LCD From a01fab662c7ac908c002c2a56d1166502a012114 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 16 Nov 2020 12:56:59 -0800 Subject: [PATCH 0579/1370] Allow dummy thermistors without pin definitions (#20159) --- Marlin/src/inc/Conditionals_post.h | 26 ++++++++++++++++++++++++-- Marlin/src/inc/SanityCheck.h | 16 ++++++++-------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 9fb3e53c4e..f8727dd963 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -458,6 +458,8 @@ #define HEATER_0_USES_THERMISTOR 1 #if TEMP_SENSOR_0 == 1000 #define HEATER_0_USER_THERMISTOR 1 + #elif TEMP_SENSOR_0 == 998 || TEMP_SENSOR_0 == 999 + #define HEATER_0_DUMMY_THERMISTOR 1 #endif #else #undef HEATER_0_MINTEMP @@ -496,6 +498,8 @@ #define HEATER_1_USES_THERMISTOR 1 #if TEMP_SENSOR_1 == 1000 #define HEATER_1_USER_THERMISTOR 1 + #elif TEMP_SENSOR_1 == 998 || TEMP_SENSOR_1 == 999 + #define HEATER_1_DUMMY_THERMISTOR 1 #endif #else #undef HEATER_1_MINTEMP @@ -515,6 +519,8 @@ #define HEATER_2_USES_THERMISTOR 1 #if TEMP_SENSOR_2 == 1000 #define HEATER_2_USER_THERMISTOR 1 + #elif TEMP_SENSOR_2 == 998 || TEMP_SENSOR_2 == 999 + #define HEATER_2_DUMMY_THERMISTOR 1 #endif #else #undef HEATER_2_MINTEMP @@ -534,6 +540,8 @@ #define HEATER_3_USES_THERMISTOR 1 #if TEMP_SENSOR_3 == 1000 #define HEATER_3_USER_THERMISTOR 1 + #elif TEMP_SENSOR_3 == 998 || TEMP_SENSOR_3 == 999 + #define HEATER_3_DUMMY_THERMISTOR 1 #endif #else #undef HEATER_3_MINTEMP @@ -553,6 +561,8 @@ #define HEATER_4_USES_THERMISTOR 1 #if TEMP_SENSOR_4 == 1000 #define HEATER_4_USER_THERMISTOR 1 + #elif TEMP_SENSOR_4 == 998 || TEMP_SENSOR_4 == 999 + #define HEATER_4_DUMMY_THERMISTOR 1 #endif #else #undef HEATER_4_MINTEMP @@ -572,6 +582,8 @@ #define HEATER_5_USES_THERMISTOR 1 #if TEMP_SENSOR_5 == 1000 #define HEATER_5_USER_THERMISTOR 1 + #elif TEMP_SENSOR_5 == 998 || TEMP_SENSOR_5 == 999 + #define HEATER_5_DUMMY_THERMISTOR 1 #endif #else #undef HEATER_5_MINTEMP @@ -591,6 +603,8 @@ #define HEATER_6_USES_THERMISTOR 1 #if TEMP_SENSOR_6 == 1000 #define HEATER_6_USER_THERMISTOR 1 + #elif TEMP_SENSOR_6 == 998 || TEMP_SENSOR_6 == 999 + #define HEATER_6_DUMMY_THERMISTOR 1 #endif #else #undef HEATER_6_MINTEMP @@ -610,6 +624,8 @@ #define HEATER_7_USES_THERMISTOR 1 #if TEMP_SENSOR_7 == 1000 #define HEATER_7_USER_THERMISTOR 1 + #elif TEMP_SENSOR_7 == 998 || TEMP_SENSOR_7 == 999 + #define HEATER_7_DUMMY_THERMISTOR 1 #endif #else #undef HEATER_7_MINTEMP @@ -629,6 +645,8 @@ #define HEATER_BED_USES_THERMISTOR 1 #if TEMP_SENSOR_BED == 1000 #define HEATER_BED_USER_THERMISTOR 1 + #elif TEMP_SENSOR_BED == 998 || TEMP_SENSOR_BED == 999 + #define HEATER_BED_DUMMY_THERMISTOR 1 #endif #else #undef BED_MINTEMP @@ -648,6 +666,8 @@ #define HEATER_CHAMBER_USES_THERMISTOR 1 #if TEMP_SENSOR_CHAMBER == 1000 #define HEATER_CHAMBER_USER_THERMISTOR 1 + #elif TEMP_SENSOR_CHAMBER == 998 || TEMP_SENSOR_CHAMBER == 999 + #define HEATER_CHAMBER_DUMMY_THERMISTOR 1 #endif #else #undef CHAMBER_MINTEMP @@ -667,6 +687,8 @@ #define HEATER_PROBE_USES_THERMISTOR 1 #if TEMP_SENSOR_PROBE == 1000 #define HEATER_PROBE_USER_THERMISTOR 1 + #elif TEMP_SENSOR_PROBE == 998 || TEMP_SENSOR_PROBE == 999 + #define HEATER_PROBE_DUMMY_THERMISTOR 1 #endif #endif @@ -1754,7 +1776,7 @@ // // ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) // -#define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && DISABLED(HEATER_##P##_USES_MAX6675)) +#define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && NONE(HEATER_##P##_USES_MAX6675, HEATER_##P##_DUMMY_THERMISTOR)) #if HAS_ADC_TEST(0) #define HAS_TEMP_ADC_0 1 #endif @@ -1789,7 +1811,7 @@ #define HAS_TEMP_ADC_CHAMBER 1 #endif -#if HAS_HOTEND && EITHER(HAS_TEMP_ADC_0, HEATER_0_USES_MAX6675) +#if HAS_HOTEND && ANY(HAS_TEMP_ADC_0, HEATER_0_USES_MAX6675, HEATER_0_DUMMY_THERMISTOR) #define HAS_TEMP_HOTEND 1 #endif #define HAS_TEMP_BED HAS_TEMP_ADC_BED diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 18506163f5..65504ab795 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1638,7 +1638,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal */ #if HEATER_0_USES_MAX6675 && !PIN_EXISTS(MAX6675_SS) #error "MAX6675_SS_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif HAS_HOTEND && !HAS_TEMP_HOTEND +#elif HAS_HOTEND && !HAS_TEMP_HOTEND && !HEATER_0_DUMMY_THERMISTOR #error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board." #elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 #error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin." @@ -1649,7 +1649,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "MAX6675_SS2_PIN (required for TEMP_SENSOR_1) not defined for this board." #elif TEMP_SENSOR_1 == 0 #error "TEMP_SENSOR_1 is required with 2 or more HOTENDS." - #elif !ANY_PIN(TEMP_1, MAX6675_SS2) + #elif !ANY_PIN(TEMP_1, MAX6675_SS2) && !HEATER_1_DUMMY_THERMISTOR #error "TEMP_1_PIN not defined for this board." #elif ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) #error "HOTENDS must be 1 with TEMP_SENSOR_1_AS_REDUNDANT." @@ -1659,7 +1659,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_2 is required with 3 or more HOTENDS." #elif !HAS_HEATER_2 #error "HEATER_2_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_2) + #elif !PIN_EXISTS(TEMP_2) && !HEATER_2_DUMMY_THERMISTOR #error "TEMP_2_PIN not defined for this board." #endif #if HOTENDS > 3 @@ -1667,7 +1667,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_3 is required with 4 or more HOTENDS." #elif !HAS_HEATER_3 #error "HEATER_3_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_3) + #elif !PIN_EXISTS(TEMP_3) && !HEATER_3_DUMMY_THERMISTOR #error "TEMP_3_PIN not defined for this board." #endif #if HOTENDS > 4 @@ -1675,7 +1675,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_4 is required with 5 or more HOTENDS." #elif !HAS_HEATER_4 #error "HEATER_4_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_4) + #elif !PIN_EXISTS(TEMP_4) && !HEATER_4_DUMMY_THERMISTOR #error "TEMP_4_PIN not defined for this board." #endif #if HOTENDS > 5 @@ -1683,7 +1683,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_5 is required with 6 HOTENDS." #elif !HAS_HEATER_5 #error "HEATER_5_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_5) + #elif !PIN_EXISTS(TEMP_5) && !HEATER_5_DUMMY_THERMISTOR #error "TEMP_5_PIN not defined for this board." #endif #if HOTENDS > 6 @@ -1691,7 +1691,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_6 is required with 6 HOTENDS." #elif !HAS_HEATER_6 #error "HEATER_6_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_6) + #elif !PIN_EXISTS(TEMP_6) && !HEATER_6_DUMMY_THERMISTOR #error "TEMP_6_PIN not defined for this board." #endif #if HOTENDS > 7 @@ -1699,7 +1699,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_7 is required with 7 HOTENDS." #elif !HAS_HEATER_7 #error "HEATER_7_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_7) + #elif !PIN_EXISTS(TEMP_7) && !HEATER_7_DUMMY_THERMISTOR #error "TEMP_7_PIN not defined for this board." #endif #elif TEMP_SENSOR_7 != 0 From 2979504b9ca00286aceb0614befd952e0724c80b Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 17 Nov 2020 00:37:37 -0800 Subject: [PATCH 0580/1370] Multi-Hotend Preheat Fixes (#20165) * Return to Status Screen on Multi-Hotend Preheat All Co-authored-by: Victor Oliveira <81722+rhapsodv@users.noreply.github.com> --- Marlin/src/lcd/menu/menu_temperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index f914301328..7b6d7f1a1d 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -108,8 +108,8 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i HOTEND_LOOP() PREHEAT_ITEMS(editable.int8, e); ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_ALL, []() { - TERN_(HAS_HEATED_BED, []{ _preheat_bed(editable.int8); }); HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[editable.int8].hotend_temp, e); + TERN(HAS_HEATED_BED, _preheat_bed(editable.int8), ui.return_to_status()); }); #endif From b5e7b8e29ed94ac6e3649c592a894fe12e354652 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 17 Nov 2020 00:40:37 -0800 Subject: [PATCH 0581/1370] Allow overriding servo pin for MKS Robin Mini (#20158) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index ca4dd8d792..ae68357589 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -111,7 +111,9 @@ #define POWER_LOSS_PIN PA2 // PW_DET #define PS_ON_PIN PA3 // PW_OFF -#define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) +#ifndef SERVO0_PIN + #define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) +#endif #define MT_DET_1_PIN PA4 #define MT_DET_PIN_INVERTING false From 562c41af4edde5c69b3ac0ed08eb1e96aa31c946 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 17 Nov 2020 05:45:01 -0300 Subject: [PATCH 0582/1370] Use intptr types (simulator) (#20142) --- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index d7d09fda5b..600d7e3faa 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -458,7 +458,7 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p case U8G_COM_MSG_WRITE_SEQ: tftio.DataTransferBegin(DATASIZE_16BIT); for (uint8_t i = 0; i < arg_val; i += 2) - tftio.WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); + tftio.WriteData(*(uint16_t *)(((uintptr_t)arg_ptr) + i)); tftio.DataTransferEnd(); break; diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index ac76e81c93..6d1043068d 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -941,7 +941,7 @@ static void disable_steppers() { queue.inject_P(PSTR("M84")); } -static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { +static void drawBtn(int x, int y, const char* label, intptr_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { uint16_t width = Images[imgBtn52Rounded].width; uint16_t height = Images[imgBtn52Rounded].height; @@ -982,11 +982,11 @@ void MarlinUI::move_axis_screen() { // ROW 1 -> E- Y- CurY Z+ int x = X_MARGIN, y = Y_MARGIN, spacing = 0; - drawBtn(x, y, "E+", (int32_t)e_plus, imgUp, E_BTN_COLOR, !busy); + drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy); spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y+", (int32_t)y_plus, imgUp, Y_BTN_COLOR, !busy); + drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy); // Cur Y x += BTN_WIDTH; @@ -995,7 +995,7 @@ void MarlinUI::move_axis_screen() { drawAxisValue(Y_AXIS); x += spacing; - drawBtn(x, y, "Z+", (int32_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step // ROW 2 -> "Ex" X- HOME X+ "Z" y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; @@ -1005,24 +1005,24 @@ void MarlinUI::move_axis_screen() { motionAxisState.eNamePos.x = x; motionAxisState.eNamePos.y = y; drawCurESelection(); - TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select)); + TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); x += BTN_WIDTH + spacing; - drawBtn(x, y, "X-", (int32_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); x += BTN_WIDTH + spacing; //imgHome is 64x64 - TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy)); + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); x += BTN_WIDTH + spacing; uint16_t xplus_x = x; - drawBtn(x, y, "X+", (int32_t)x_plus, imgRight, X_BTN_COLOR, !busy); + drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); x += BTN_WIDTH + spacing; motionAxisState.zTypePos.x = x; motionAxisState.zTypePos.y = y; drawCurZSelection(); #if HAS_BED_PROBE - if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (int32_t)z_select); + if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); #endif // ROW 3 -> E- CurX Y- Z- @@ -1030,7 +1030,7 @@ void MarlinUI::move_axis_screen() { x = X_MARGIN; spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; - drawBtn(x, y, "E-", (int32_t)e_minus, imgDown, E_BTN_COLOR, !busy); + drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); // Cur E motionAxisState.eValuePos.x = x; @@ -1043,10 +1043,10 @@ void MarlinUI::move_axis_screen() { drawAxisValue(X_AXIS); x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y-", (int32_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy); x += BTN_WIDTH + spacing; - drawBtn(x, y, "Z-", (int32_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step // Cur Z motionAxisState.zValuePos.x = x; @@ -1060,11 +1060,11 @@ void MarlinUI::move_axis_screen() { motionAxisState.stepValuePos.y = y; if (!busy) { drawCurStepValue(); - TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size)); + TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); } // alinged with x+ - drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (int32_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); + drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); } From cc9df782ceaed830acd7e105a628ab3523b22516 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 17 Nov 2020 21:45:43 +1300 Subject: [PATCH 0583/1370] add ethernet to src filter (#20136) Co-authored-by: ellensp --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index 626c7d2bec..1e0b84b625 100644 --- a/platformio.ini +++ b/platformio.ini @@ -77,6 +77,7 @@ default_src_filter = + - - + - - - - + - - - - - - From 78eb12958a6a6d0e86b95d2c6c50b821806173e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E7=AB=8B=E6=9E=AB?= <49380822+FLYmaker@users.noreply.github.com> Date: Tue, 17 Nov 2020 19:35:02 +0800 Subject: [PATCH 0584/1370] Add FLY_CDY board (#19979) Co-authored-by: FLYmaker Co-authored-by: Scott Lahteine Co-authored-by: Scott Lahteine Co-authored-by: Jason Smith --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/lpc1769/pins_FLY_CDY.h | 188 +++++++++++++++++++++++++ Marlin/src/pins/pins.h | 2 + 3 files changed, 191 insertions(+) create mode 100644 Marlin/src/pins/lpc1769/pins_FLY_CDY.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index efccc3716d..b60f73c2dc 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -243,6 +243,7 @@ #define BOARD_BTT_SKR_V1_4_TURBO 2508 // BigTreeTech SKR v1.4 TURBO (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_MKS_SGEN_L_V2 2509 // MKS SGEN_L V2 (Power outputs: Hotend0, Hotend1, Bed, Fan) #define BOARD_BTT_SKR_E3_TURBO 2510 // BigTreeTech SKR E3 Turbo (Power outputs: Hotend0, Hotend1, Bed, Fan0, Fan1) +#define BOARD_FLY_CDY 2511 // FLY_CDY (Power outputs: Hotend0, Hotend1, Hotend2, Bed, Fan0, Fan1, Fan2) // // SAM3X8E ARM Cortex M3 diff --git a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h new file mode 100644 index 0000000000..b678917734 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h @@ -0,0 +1,188 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "FLY-CDY" +#define BOARD_WEBSITE_URL "https://github.com/FLYmaker/FLY-CDY" + +// +// Servos +// +#define SERVO0_PIN P1_26 + + +// +// Limit Switches +// + +#define X_MIN_PIN P1_29 // X- +#define X_MAX_PIN P1_28 // X+ +#define Y_MIN_PIN P1_27 // Y- +#define Y_MAX_PIN P1_25 // Y+ +#define Z_MIN_PIN P1_22 // Z- +#define Z_MAX_PIN P0_27 // Z+ + + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P1_01 +#define X_ENABLE_PIN P1_00 +#ifndef X_CS_PIN + #define X_CS_PIN P1_04 +#endif + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P1_09 +#define Y_ENABLE_PIN P1_08 +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_10 +#endif + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P1_15 +#define Z_ENABLE_PIN P1_14 +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_16 +#endif + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P4_29 +#define E0_ENABLE_PIN P1_17 +#ifndef E0_CS_PIN + #define E0_CS_PIN P4_28 +#endif + +#define E1_STEP_PIN P2_04 +#define E1_DIR_PIN P2_11 +#define E1_ENABLE_PIN P0_04 +#ifndef E1_CS_PIN + #define E1_CS_PIN P2_12 +#endif + +#define E2_STEP_PIN P2_05 +#define E2_DIR_PIN P0_11 +#define E2_ENABLE_PIN P2_13 +#ifndef E2_CS_PIN + #define E2_CS_PIN P0_10 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P0_20 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P0_19 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P0_21 + #endif +#endif + + +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN P1_04 + #define X_SERIAL_RX_PIN P1_04 + + #define Y_SERIAL_TX_PIN P1_10 + #define Y_SERIAL_RX_PIN P1_10 + + #define Z_SERIAL_TX_PIN P1_16 + #define Z_SERIAL_RX_PIN P1_16 + + #define E0_SERIAL_TX_PIN P4_28 + #define E0_SERIAL_RX_PIN P4_28 + + #define E1_SERIAL_TX_PIN P2_12 + #define E1_SERIAL_RX_PIN P2_12 + + #define E2_SERIAL_TX_PIN P0_10 + #define E2_SERIAL_RX_PIN P0_10 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + + + +// +// Temperature Sensors +// +#define TEMP_0_PIN P0_26_A3 // (T4) +#define TEMP_1_PIN P0_25_A2 // (T3) +#define TEMP_2_PIN P0_24_A1 // (T2) +#define TEMP_BED_PIN P0_23_A0 // (T1) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P3_26 +#define HEATER_0_PIN P3_25 +#define HEATER_1_PIN P1_20 +#define HEATER_2_PIN P1_23 +#ifndef FAN_PIN + #define FAN_PIN P1_18 +#endif +#define FAN1_PIN P1_21 +#define FAN2_PIN P1_24 + + +// +// LCD / Controller +// +#define BEEPER_PIN P2_07 +#define LCD_PINS_RS P2_10 +#define LCD_PINS_ENABLE P0_22 +#define LCD_PINS_D4 P1_19 +#define LCD_PINS_D5 P2_08 +#define LCD_PINS_D6 P1_30 +#define LCD_PINS_D7 P1_31 +#define BTN_EN1 P0_00 +#define BTN_EN2 P0_01 +#define BTN_ENC P0_28 + + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #define SS_PIN P0_06 + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SD_DETECT_PIN P0_05 +#elif SD_CONNECTION_IS(LCD) + #define SCK_PIN P0_15 + #define MISO_PIN P0_17 + #define MOSI_PIN P0_18 + #define SS_PIN P0_16 + #define SD_DETECT_PIN P2_06 +#endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 5eb4717e78..b9e12d8233 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -433,6 +433,8 @@ #include "lpc1769/pins_MKS_SGEN_L_V2.h" // LPC1769 env:LPC1769 #elif MB(BTT_SKR_E3_TURBO) #include "lpc1769/pins_BTT_SKR_E3_TURBO.h" // LPC1769 env:LPC1769 +#elif MB(FLY_CDY) + #include "lpc1769/pins_FLY_CDY.h" // LPC1769 env:LPC1769 // // Due (ATSAM) boards From 550306d1b67e66dea37f460f725202f75f0e1f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Morav=C4=8D=C3=ADk?= Date: Tue, 17 Nov 2020 21:30:06 +0100 Subject: [PATCH 0585/1370] Update Slovak language (#20181) --- Marlin/src/lcd/language/language_sk.h | 29 +++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index e3de108191..77e4b46424 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -66,7 +66,9 @@ namespace Language_sk { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domov os Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domov os Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto-zarovn. Z"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Asist. vyrovnanie"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("Iterácia G34: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Klesajúca presnosÅ¥!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Dosiahnutá presnosÅ¥"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Parkovanie XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím zaÄnete"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("ÄŽalší bod"); @@ -75,6 +77,10 @@ namespace Language_sk { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("NastaviÅ¥ ofsety"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastavené"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("NastaviÅ¥ zaÄiatok"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Asist. vyrovnanie"); + PROGMEM Language_Str MSG_TRAMMING_WIZARD = _UxGT("Spriev. vyrovn."); + PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Vyberte zaÄiatok"); + PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Posl. hodnota "); #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL " ~"; @@ -131,6 +137,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikácia"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrkadlená kópia"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("Duplik. medz.-X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. tryska X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. tryska Y"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. tryska Z"); @@ -248,7 +255,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Tryska ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Tryska zaparkovná"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Tryska zaparkovaná"); PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Záložná tryska"); PROGMEM Language_Str MSG_BED = _UxGT("Podložka"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Komora"); @@ -259,7 +266,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("RýchlosÅ¥ ex. vent. ~"); PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Vent. riad. jedn."); PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Voľno. rýchl."); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto-režím"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto-režim"); PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív. rýchl."); PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Doba neÄinnosti"); PROGMEM Language_Str MSG_FLOW = _UxGT("Prietok"); @@ -435,6 +442,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X ofset"); PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y ofset"); PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z ofset"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Pos. trysku k podl."); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); @@ -588,7 +596,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Heslo je "); PROGMEM Language_Str MSG_START_OVER = _UxGT("ZaÄaÅ¥ odznova"); PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Nezabudnite uložiÅ¥!"); - PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Heslo odstránene"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Heslo odstránené"); // // Filament Change screens show up to 3 lines on a 4-line display @@ -643,4 +651,17 @@ namespace Language_sk { #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("ZohriaÅ¥"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Zohrievanie..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Sprievodca sondy Z"); + + PROGMEM Language_Str MSG_SOUND = _UxGT("Zvuk"); + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Ľavý horný"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Ľavý dolný"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Pravý horný"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Pravý dolný"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrácia dokonÄená"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Kalibrácia zlyhala"); + #endif } From dc644df9bcca737a95cfd68281ce3e74e25c2ee4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 17 Nov 2020 17:32:30 -0300 Subject: [PATCH 0586/1370] Reduce RAM usage for TFT Color UI on SGen-L (#20179) --- Marlin/src/lcd/tft/tft_queue.cpp | 2 +- Marlin/src/lcd/tft/tft_queue.h | 6 ++++-- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp index 43628706a9..0b538ef4a8 100644 --- a/Marlin/src/lcd/tft/tft_queue.cpp +++ b/Marlin/src/lcd/tft/tft_queue.cpp @@ -210,7 +210,7 @@ void TFT_Queue::set_background(uint16_t color) { #define QUEUE_SAFETY_FREE_SPACE 100 void TFT_Queue::handle_queue_overflow(uint16_t sizeNeeded) { - if (uintptr_t(end_of_queue) + sizeNeeded + (QUEUE_SAFETY_FREE_SPACE) - uintptr_t(queue) >= QUEUE_SIZE) { + if (uintptr_t(end_of_queue) + sizeNeeded + (QUEUE_SAFETY_FREE_SPACE) - uintptr_t(queue) >= TFT_QUEUE_SIZE) { end_of_queue = queue; ((parametersCanvasText_t *)last_parameter)->nextParameter = end_of_queue; } diff --git a/Marlin/src/lcd/tft/tft_queue.h b/Marlin/src/lcd/tft/tft_queue.h index 6cb3caf4a2..7eaa0c01c1 100644 --- a/Marlin/src/lcd/tft/tft_queue.h +++ b/Marlin/src/lcd/tft/tft_queue.h @@ -25,7 +25,9 @@ #include "tft_string.h" #include "tft_image.h" -#define QUEUE_SIZE 8192 +#ifndef TFT_QUEUE_SIZE + #define TFT_QUEUE_SIZE 8192 +#endif enum QueueTaskType : uint8_t { TASK_END_OF_QUEUE = 0x00, @@ -118,7 +120,7 @@ typedef struct __attribute__((__packed__)) { class TFT_Queue { private: - static uint8_t queue[QUEUE_SIZE]; + static uint8_t queue[TFT_QUEUE_SIZE]; static uint8_t *end_of_queue; static uint8_t *current_task; static uint8_t *last_task; diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 705dd4f9aa..7f9efcdb16 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -268,7 +268,8 @@ #define LCD_PINS_ENABLE -1 #define LCD_PINS_RS -1 - #define TFT_BUFFER_SIZE 2400 + #define TFT_BUFFER_SIZE 1200 + #define TFT_QUEUE_SIZE 6144 #define BTN_EN1 P3_25 #define BTN_EN2 P3_26 From 180fe914b61d111449d4af3836d5498d6b2e0ff4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 17 Nov 2020 21:44:53 -0300 Subject: [PATCH 0587/1370] Prevent #div0 error (#20183) --- Marlin/src/feature/leds/printer_event_leds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index 31c628c281..3a6b91a258 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -41,6 +41,7 @@ PrinterEventLEDs printerEventLEDs; uint8_t PrinterEventLEDs::old_intensity = 0; inline uint8_t pel_intensity(const float &start, const float ¤t, const float &target) { + if (uint16_t(start) == uint16_t(target)) return 255; return (uint8_t)map(constrain(current, start, target), start, target, 0.f, 255.f); } From 1c81a126c5a8a7f12efabca40ed4278477eb2db2 Mon Sep 17 00:00:00 2001 From: Costas Basdekis Date: Wed, 18 Nov 2020 02:04:28 +0000 Subject: [PATCH 0588/1370] Local testing via Makefile & Docker (#19981) --- .github/workflows/test-builds.yml | 6 +- Makefile | 56 ++++ README.md | 5 + buildroot/share/git/mftest | 293 +++++++++++-------- buildroot/tests/ARMED-tests | 2 +- buildroot/tests/BIGTREE_BTT002-tests | 2 +- buildroot/tests/BIGTREE_GTR_V1_0-tests | 4 +- buildroot/tests/BIGTREE_SKR_PRO-tests | 4 +- buildroot/tests/DUE-tests | 6 +- buildroot/tests/DUE_archim-tests | 4 +- buildroot/tests/FLYF407ZG-tests | 2 +- buildroot/tests/FYSETC_F6_13-tests | 2 +- buildroot/tests/FYSETC_S6-tests | 2 +- buildroot/tests/LERDGEX-tests | 2 +- buildroot/tests/LPC1768-tests | 6 +- buildroot/tests/LPC1769-tests | 8 +- buildroot/tests/NUCLEO_F767ZI-tests | 2 +- buildroot/tests/SAMD51_grandcentral_m4-tests | 2 +- buildroot/tests/STM32F070CB_malyan-tests | 2 +- buildroot/tests/STM32F070RB_malyan-tests | 2 +- buildroot/tests/STM32F103CB_malyan-tests | 2 +- buildroot/tests/STM32F103RC_btt-tests | 2 +- buildroot/tests/STM32F103RC_btt_USB-tests | 2 +- buildroot/tests/STM32F103RC_fysetc-tests | 2 +- buildroot/tests/STM32F103RC_meeb-tests | 2 +- buildroot/tests/STM32F103RE-tests | 2 +- buildroot/tests/STM32F103RET6_creality-tests | 2 +- buildroot/tests/STM32F103RE_btt-tests | 2 +- buildroot/tests/STM32F103RE_btt_USB-tests | 2 +- buildroot/tests/STM32F103VE_longer-tests | 2 +- buildroot/tests/STM32F4-tests | 2 +- buildroot/tests/STM32F401VE_STEVAL-tests | 2 +- buildroot/tests/STM32F407VE_black-tests | 2 +- buildroot/tests/STM32F7-tests | 2 +- buildroot/tests/at90usb1286_cdc-tests | 2 +- buildroot/tests/at90usb1286_dfu-tests | 4 +- buildroot/tests/esp32-tests | 4 +- buildroot/tests/jgaurora_a5s_a1-tests | 2 +- buildroot/tests/linux_native-tests | 2 +- buildroot/tests/malyan_M300-tests | 2 +- buildroot/tests/mega1280-tests | 8 +- buildroot/tests/mega2560-tests | 20 +- buildroot/tests/mks_robin-tests | 2 +- buildroot/tests/mks_robin_lite-tests | 2 +- buildroot/tests/mks_robin_mini-tests | 2 +- buildroot/tests/mks_robin_nano35-tests | 12 +- buildroot/tests/mks_robin_pro-tests | 2 +- buildroot/tests/mks_robin_stm32-tests | 2 +- buildroot/tests/rambo-tests | 6 +- buildroot/tests/rumba32-tests | 6 +- buildroot/tests/run_tests | 48 ++- buildroot/tests/sanguino1284p-tests | 2 +- buildroot/tests/sanguino644p-tests | 2 +- buildroot/tests/teensy31-tests | 4 +- buildroot/tests/teensy35-tests | 16 +- buildroot/tests/teensy41-tests | 16 +- docker-compose.yml | 19 ++ docker/Dockerfile | 7 + get_test_targets.py | 12 + 59 files changed, 418 insertions(+), 226 deletions(-) create mode 100644 Makefile create mode 100644 docker-compose.yml create mode 100644 docker/Dockerfile create mode 100644 get_test_targets.py diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 41b3047485..d87d10569d 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -119,8 +119,4 @@ jobs: - name: Run ${{ matrix.test-platform }} Tests run: | - # Inline tests script - chmod +x buildroot/bin/* - chmod +x buildroot/tests/* - export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} - run_tests . ${{ matrix.test-platform }} + make tests-single-ci TEST_TARGET=${{ matrix.test-platform }} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..8e1c77aa99 --- /dev/null +++ b/Makefile @@ -0,0 +1,56 @@ +help: + @echo "Tasks for local development:" + @echo "* tests-single-ci: Run a single test from inside the CI" + @echo "* tests-single-local: Run a single test locally" + @echo "* tests-single-local-docker: Run a single test locally, using docker-compose" + @echo "* tests-all-local: Run all tests locally" + @echo "* tests-all-local-docker: Run all tests locally, using docker-compose" + @echo "* setup-local-docker: Setup local docker-compose" + @echo "" + @echo "Options for testing:" + @echo " TEST_TARGET Set when running tests-single-*, to select the" + @echo " test. If you set it to ALL it will run all " + @echo " tests, but some of them are broken: use " + @echo " tests-all-* instead to run only the ones that " + @echo " run on GitHub CI" + @echo " ONLY_TEST Limit tests to only those that contain this, or" + @echo " the index of the test (1-based)" + @echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value" + @echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:" + @echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!" +.PHONY: help + +tests-single-ci: + export GIT_RESET_HARD=true + $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) +.PHONY: tests-single-ci + +tests-single-local: + @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make tests-all-local" ; return 1; fi + chmod +x buildroot/bin/* + chmod +x buildroot/tests/* + export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \ + && export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \ + && run_tests . $(TEST_TARGET) "$(ONLY_TEST)" +.PHONY: tests-single-local + +tests-single-local-docker: + @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make tests-all-local-docker" ; return 1; fi + docker-compose run --rm marlin $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)" +.PHONY: tests-single-local-docker + +tests-all-local: + chmod +x buildroot/bin/* + chmod +x buildroot/tests/* + export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \ + && export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \ + && for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done +.PHONY: tests-all-local + +tests-all-local-docker: + docker-compose run --rm marlin $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) +.PHONY: tests-all-local-docker + +setup-local-docker: + docker-compose build +.PHONY: setup-local-docker diff --git a/README.md b/README.md index f70b7c409a..8b623b382e 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,11 @@ Proposed patches should be submitted as a Pull Request against the ([bugfix-2.0. - This branch is for fixing bugs and integrating any new features for the duration of the Marlin 2.0.x life-cycle. - Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. - Please submit Feature Requests and Bug Reports to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues/new/choose). Support resources are also listed there. +- Whenever you add new features, be sure to add tests to `buildroot/tests` and then run your tests locally, if possible. + - It's optional: Running all the tests on Windows might take a long time, and they will run anyway on GitHub. + - If you're running the tests on Linux (or on WSL with the code on a Linux volume) the speed is much faster. + - You can use `make tests-all-local` or `make tests-single-local TEST_TARGET=...`. + - If you prefer Docker you can use `make tests-all-local-docker` or `make tests-all-local-docker TEST_TARGET=...`. ### [RepRap.org Wiki Page](https://reprap.org/wiki/Marlin) diff --git a/buildroot/share/git/mftest b/buildroot/share/git/mftest index cfb5dd05f3..fda864672a 100755 --- a/buildroot/share/git/mftest +++ b/buildroot/share/git/mftest @@ -7,7 +7,33 @@ # MFINFO=$(mfinfo) || exit 1 -[[ -d Marlin/src ]] || { echo "Please 'cd' up to repo root." ; exit 1 ; } +[[ -d Marlin/src ]] || { echo "Please 'cd' to the Marlin repo root." ; exit 1 ; } + +perror() { echo -e "$0: \033[0;31m$1 -- $2\033[0m" ; } +errout() { echo -e "\033[0;31m$1\033[0m" ; } +bugout() { ((DEBUG)) && echo -e "\033[0;32m$1\033[0m" ; } + +usage() { + echo " +Usage: mftest [-t|--env=] [-n|--num=] [-m|--make] [-y|--build=] + mftest [-a|--autobuild] + mftest [-r|--rebuild] + mftest [-u|--autoupload] [-n|--num=] + +OPTIONS + -t --env The environment of the test to apply / run. (As named in platformio.ini.) + -n --num The index of the test to run. (In *-tests file order.) + -m --make Use the make / Docker method for the build. + -y --build Skip 'Do you want to build this test?' and assume YES. + -h --help Print this help. + -a --autobuild PIO Build using the MOTHERBOARD environment. + -u --autoupload PIO Upload using the MOTHERBOARD environment. + -v --verbose Extra output for debugging. + +env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41 + +" +} TESTPATH=buildroot/tests @@ -22,111 +48,146 @@ ISCMD='^(restore|opt|exec|use|pins|env)_' ISEXEC='^exec_' ISCONT='\\ *$' -# Get the environment and test number from the command -TESTENV=${1:-'-'} -CHOICE=${2:-0} -AUTOENV=0 +# Get environment, test number, etc. from the command +TESTENV='-' +CHOICE=0 +DEBUG=0 + +while getopts 'abhmruvyn:t:-:' OFLAG; do + case "${OFLAG}" in + a) AUTO_BUILD=1 ; bugout "Auto-Build target..." ;; + h) EXIT_USAGE=1 ;; + m) USE_MAKE=1 ; bugout "Using make with Docker..." ;; + n) case "$OPTARG" in + *[!0-9]*) perror "option requires a number" $OFLAG ; EXIT_USAGE=1 ;; + *) CHOICE="$OPTARG" ; bugout "Got a number: $CHOICE" ;; + esac + ;; + r) REBUILD=1 ; bugout "Rebuilding previous..." ;; + t) TESTENV="$OPTARG" ; bugout "Got a target: $TESTENV" ;; + u) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; + v) DEBUG=1 ; bugout "Debug ON" ;; + y) BUILD_YES='Y' ; bugout "Build will initiate..." ;; + -) IFS="=" read -r ONAM OVAL <<< "$OPTARG" + case "$ONAM" in + help) [[ -z "$OVAL" ]] || perror "option can't take value $OVAL" $ONAM ; EXIT_USAGE=1 ;; + autobuild) AUTO_BUILD=1 ; bugout "Auto-Build target..." ;; + autoupload) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; + env) case "$OVAL" in + '') perror "option requires a value" $ONAM ; EXIT_USAGE=1 ;; + *) TESTENV="$OVAL" ; bugout "Got a target: $TESTENV" ;; + esac + ;; + num) case "$OVAL" in + [0-9]+) CHOICE="$OVAL" ; bugout "Got a number: $CHOICE" ;; + *) perror "option requires a value" $ONAM ; EXIT_USAGE=1 ;; + esac + ;; + rebuild) REBUILD=1 ; bugout "Rebuilding previous..." ;; + make) USE_MAKE=1 ; bugout "Using make with Docker..." ;; +debug|verbose) DEBUG=1 ; bugout "Debug ON" ;; + build) case "$OVAL" in + ''|y|yes) BUILD_YES='Y' ;; + n|no) BUILD_YES='N' ;; + *) perror "option value must be y, n, yes, or no" $ONAM ; EXIT_USAGE=1 ;; + esac + bugout "Build will initiate? ($BUILD_YES)" + ;; + *) perror "Unknown flag" "$OPTARG" ; EXIT_USAGE=1 ;; + esac + ;; + esac +done + +((EXIT_USAGE)) && { usage ; exit 1 ; } + +if ((REBUILD)); then + bugout "Rebuilding previous..." + # Build with the last-built env + [[ -f "$STATE_FILE" ]] || { errout "No previous (-r) build state found." ; exit 1 ; } + read TESTENV <"$STATE_FILE" + pio run -d . -e $TESTENV + exit +fi -# Allow shorthand for test name case $TESTENV in - tree) pio run -d . -e include_tree ; exit 1 ;; - due) TESTENV='DUE' ;; - esp) TESTENV='esp32' ;; - lin*) TESTENV='linux_native' ;; - lpc?(8)) TESTENV='LPC1768' ;; - lpc9) TESTENV='LPC1769' ;; - m128) TESTENV='mega1280' ;; - m256) TESTENV='mega2560' ;; - mega) TESTENV='mega2560' ;; - stm) TESTENV='STM32F103RE' ;; - f1) TESTENV='STM32F103RE' ;; - f4) TESTENV='STM32F4' ;; - f7) TESTENV='STM32F7' ;; - s6) TESTENV='FYSETC_S6' ;; - teensy) TESTENV='teensy31' ;; - t31) TESTENV='teensy31' ;; - t32) TESTENV='teensy31' ;; - t35) TESTENV='teensy35' ;; - t36) TESTENV='teensy35' ;; - t40) TESTENV='teensy41' ;; - t41) TESTENV='teensy41' ;; - --h|--help) echo -e "$(basename $0) : Marlin Firmware test, build, and upload\n" - echo "Usage: $(basename $0) ................. Select env and test to apply / run" - echo " $(basename $0) [-y] env ........ Select a test for env to apply / run" - echo " $(basename $0) [-y] env test ... Apply / run the specified env test" - echo " $(basename $0) -b [variant] .... Auto-build the specified variant" - echo " $(basename $0) -u [variant] .... Auto-build and upload the specified variant" - echo - echo "env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41" - exit - ;; - - # Build with the last-built env - -r) [[ -f "$STATE_FILE" ]] || { echo "No previous (-r) build state found." ; exit 1 ; } - read TESTENV <"$STATE_FILE" - pio run -d . -e $TESTENV - exit - ;; - - -[bu]) MB=$( grep -E "^\s*#define MOTHERBOARD" Marlin/Configuration.h | awk '{ print $3 }' | $SED 's/BOARD_//' ) - [[ -z $MB ]] && { echo "Error - Can't read MOTHERBOARD setting." ; exit 1 ; } - BLINE=$( grep -E "define\s+BOARD_$MB\b" Marlin/src/core/boards.h ) - BNUM=$( $SED -E 's/^.+BOARD_[^ ]+ +([0-9]+).+$/\1/' <<<"$BLINE" ) - BDESC=$( $SED -E 's/^.+\/\/ *(.+)$/\1/' <<<"$BLINE" ) - [[ -z $BNUM ]] && { echo "Error - Can't find $MB in boards list." ; exit 1 ; } - readarray -t ENVS <<< $( grep -EA1 "MB\(.*\b$MB\b.*\)" Marlin/src/pins/pins.h | grep -E '#include.+//.+env:.+' | grep -oE 'env:[^ ]+' | $SED -E 's/env://' ) - [[ -z $ENVS ]] && { echo "Error - Can't find target(s) for $MB ($BNUM)." ; exit 1 ; } - ECOUNT=${#ENVS[*]} - - if [[ $ECOUNT == 1 ]]; then - TARGET=$ENVS - else - if [[ $CHOICE == 0 ]]; then - # - # List env names and numbers. Get selection. - # - echo "Available targets for \"$BDESC\" | $MB ($BNUM):" - - IND=0 ; for ENV in "${ENVS[@]}"; do let IND++ ; echo " $IND) $ENV" ; done - - if [[ $ECOUNT > 1 ]]; then - for (( ; ; )) - do - read -p "Select a target for '$MB' (1-$ECOUNT) : " CHOICE - [[ -z "$CHOICE" ]] && { echo '(canceled)' ; exit 1 ; } - [[ $CHOICE =~ $ISNUM ]] && ((CHOICE >= 1 && CHOICE <= ECOUNT)) && break - echo ">>> Invalid environment choice '$CHOICE'." - done - echo - fi - else - echo "Detected \"$BDESC\" | $MB ($BNUM)." - [[ $CHOICE > $ECOUNT ]] && { echo "Environment selection out of range." ; exit 1 ; } - fi - TARGET="${ENVS[$CHOICE-1]}" - echo "Selected $TARGET" - fi - - echo "$TARGET" >"$STATE_FILE" - - if [[ $TESTENV == "-u" ]]; then - echo "Build/Uploading environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -t upload -e $TARGET - else - echo "Building environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -e $TARGET - fi - exit - ;; - - # The -y flag may come first - -y) TESTENV=${2:-'-'} ; CHOICE=${3:-0} ;; - - -[a-z]) echo "Unknown flag $TESTENV" ; exit 1 ;; - -) ;; + tree) pio run -d . -e include_tree ; exit 1 ;; + due) TESTENV='DUE' ;; + esp) TESTENV='esp32' ;; + lin*) TESTENV='linux_native' ;; +lpc?(8)) TESTENV='LPC1768' ;; + lpc9) TESTENV='LPC1769' ;; + m128) TESTENV='mega1280' ;; + m256) TESTENV='mega2560' ;; + mega) TESTENV='mega2560' ;; + stm) TESTENV='STM32F103RE' ;; + f1) TESTENV='STM32F103RE' ;; + f4) TESTENV='STM32F4' ;; + f7) TESTENV='STM32F7' ;; + s6) TESTENV='FYSETC_S6' ;; + teensy) TESTENV='teensy31' ;; + t31) TESTENV='teensy31' ;; + t32) TESTENV='teensy31' ;; + t35) TESTENV='teensy35' ;; + t36) TESTENV='teensy35' ;; + t40) TESTENV='teensy41' ;; + t41) TESTENV='teensy41' ;; esac +if ((AUTO_BUILD)); then + # + # List environments that apply to the current MOTHERBOARD. + # + echo ; echo -n "Auto " ; ((AUTO_BUILD == 2)) && echo "Upload..." || echo "Build..." + MB=$( grep -E "^\s*#define MOTHERBOARD" Marlin/Configuration.h | awk '{ print $3 }' | $SED 's/BOARD_//' ) + [[ -z $MB ]] && { echo "Error - Can't read MOTHERBOARD setting." ; exit 1 ; } + BLINE=$( grep -E "define\s+BOARD_$MB\b" Marlin/src/core/boards.h ) + BNUM=$( $SED -E 's/^.+BOARD_[^ ]+ +([0-9]+).+$/\1/' <<<"$BLINE" ) + BDESC=$( $SED -E 's/^.+\/\/ *(.+)$/\1/' <<<"$BLINE" ) + [[ -z $BNUM ]] && { echo "Error - Can't find $MB in boards list." ; exit 1 ; } + ENVS=( $( grep -EA1 "MB\(.*\b$MB\b.*\)" Marlin/src/pins/pins.h | grep -E '#include.+//.+env:[^ ]+' | grep -oE 'env:[^ ]+' | $SED -E 's/env://' ) ) + [[ -z $ENVS ]] && { errout "Error - Can't find target(s) for $MB ($BNUM)." ; exit 1 ; } + ECOUNT=${#ENVS[*]} + + if [[ $ECOUNT == 1 ]]; then + TARGET=$ENVS + else + if [[ $CHOICE == 0 ]]; then + # List env names and numbers. Get selection. + echo "Available targets for \"$BDESC\" | $MB ($BNUM):" + + IND=0 ; for ENV in "${ENVS[@]}"; do let IND++ ; echo " $IND) $ENV" ; done + + if [[ $ECOUNT > 1 ]]; then + for (( ; ; )) + do + read -p "Select a target for '$MB' (1-$ECOUNT) : " CHOICE + [[ -z "$CHOICE" ]] && { echo '(canceled)' ; exit 1 ; } + [[ $CHOICE =~ $ISNUM ]] && ((CHOICE >= 1 && CHOICE <= ECOUNT)) && break + errout ">>> Invalid environment choice '$CHOICE'." + done + echo + fi + else + echo "Detected \"$BDESC\" | $MB ($BNUM)." + [[ $CHOICE > $ECOUNT ]] && { echo "Environment selection out of range." ; exit 1 ; } + fi + TARGET="${ENVS[$CHOICE-1]}" + echo "Selected $TARGET" + fi + + echo "$TARGET" >"$STATE_FILE" + + if ((AUTO_BUILD == 2)); then + echo "Uploading environment $TARGET for board $MB ($BNUM)..." ; echo + pio run -t upload -e $TARGET + else + echo "Building environment $TARGET for board $MB ($BNUM)..." ; echo + pio run -e $TARGET + fi + exit +fi + # # List available tests and ask for selection # @@ -148,20 +209,20 @@ if [[ $TESTENV == '-' ]]; then for (( ; ; )) do read -p "Select a test to apply (1-$IND) : " NAMEIND - [[ -z "$NAMEIND" ]] && { echo '(canceled)' ; exit 1 ; } + [[ -z "$NAMEIND" ]] && { errout "(canceled)" ; exit 1 ; } [[ $NAMEIND =~ $ISNUM ]] && ((NAMEIND >= 1 && NAMEIND <= IND)) && { TESTENV=${NAMES[$NAMEIND-1]} ; echo ; break ; } - echo "Invalid selection." + errout "Invalid selection." done fi # Get the contents of the test file -OUT=$( cat $TESTPATH/$TESTENV-tests 2>/dev/null ) || { echo "Can't find test '$TESTENV'." ; exit 1 ; } +OUT=$( cat $TESTPATH/$TESTENV-tests 2>/dev/null ) || { errout "Can't find test '$TESTENV'." ; exit 1 ; } # Count up the number of tests TESTCOUNT=$( awk "/$ISEXEC/{a++}END{print a}" <<<"$OUT" ) # User entered a number? -(( CHOICE && CHOICE > TESTCOUNT )) && { echo "Invalid test selection '$CHOICE' (1-$TESTCOUNT)." ; exit 1 ; } +(( CHOICE && CHOICE > TESTCOUNT )) && { errout "Invalid test selection '$CHOICE' (1-$TESTCOUNT)." ; exit 1 ; } if [[ $CHOICE == 0 ]]; then # @@ -172,7 +233,7 @@ if [[ $CHOICE == 0 ]]; then while IFS= read -r LINE do if [[ $LINE =~ $ISEXEC ]]; then - DESC=$( "$SED" -E 's/^.+"(.*)".*$/\1/g' <<<"$LINE" ) + DESC=$( "$SED" -E 's/^exec_test \$1 \$2 "([^"]+)".*$/\1/g' <<<"$LINE" ) (( ++IND < 10 )) && echo -n " " echo " $IND) $DESC" fi @@ -183,9 +244,9 @@ if [[ $CHOICE == 0 ]]; then for (( ; ; )) do read -p "Select a '$TESTENV' test (1-$TESTCOUNT) : " CHOICE - [[ -z "$CHOICE" ]] && { echo '(canceled)' ; exit 1 ; } + [[ -z "$CHOICE" ]] && { errout "(canceled)" ; exit 1 ; } [[ $CHOICE =~ $ISNUM ]] && ((CHOICE >= 1 && CHOICE <= TESTCOUNT)) && break - echo ">>> Invalid test selection '$CHOICE'." + errout ">>> Invalid test selection '$CHOICE'." done fi fi @@ -193,6 +254,7 @@ fi # # Run the specified test lines # +echo -ne "\033[0;33m" echo "$OUT" | { IND=0 GOTX=0 @@ -210,27 +272,26 @@ echo "$OUT" | { } ((IND == CHOICE)) && { GOTX=1 - [[ $CMD == "" ]] && CMD="$LINE" || CMD=$( echo -e "$CMD$LINE" | $SED -e 's/\\//g' ) - [[ $LINE =~ $ISCONT ]] || { echo $CMD ; eval "$CMD" ; CMD="" ; } + [[ $CMD == "" ]] && CMD="$LINE" || CMD=$( echo -e "$CMD$LINE" | $SED -e 's/\\//g' | $SED -E 's/ +/ /g' ) + [[ $LINE =~ $ISCONT ]] || { echo "$CMD" ; eval "$CMD" ; CMD="" ; } } fi fi done } +echo -ne "\033[0m" # Make clear it's a TEST opt_set CUSTOM_MACHINE_NAME "\"$TESTENV-tests ($CHOICE)\"" -# Get a -y parameter the lazy way -[[ "$2" == "-y" || "$3" == "-y" ]] && BUILD_YES='Y' - # Build the test too? -if [[ $BUILD_YES != 'Y' ]]; then +if [[ -z "$BUILD_YES" ]]; then echo read -p "Build $TESTENV test #$CHOICE (y/N) ? " BUILD_YES fi [[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && { - pio run -d . -e $TESTENV + ((USE_MAKE)) && make tests-single-local TEST_TARGET=$TESTENV ONLY_TEST=$CHOICE + ((USE_MAKE)) || pio run -d . -e $TESTENV echo "$TESTENV" >"$STATE_FILE" } diff --git a/buildroot/tests/ARMED-tests b/buildroot/tests/ARMED-tests index e5959a4383..6aa1308ca4 100644 --- a/buildroot/tests/ARMED-tests +++ b/buildroot/tests/ARMED-tests @@ -13,7 +13,7 @@ restore_configs use_example_configs ArmEd opt_set X_DRIVER_TYPE TMC2130 opt_set Y_DRIVER_TYPE TMC2208 -exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" +exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" "$3" # clean up restore_configs diff --git a/buildroot/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002-tests index 64e6322eca..90e033e969 100644 --- a/buildroot/tests/BIGTREE_BTT002-tests +++ b/buildroot/tests/BIGTREE_BTT002-tests @@ -14,7 +14,7 @@ opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 opt_set SERIAL_PORT 1 opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 -exec_test $1 $2 "BigTreeTech BTT002 Default Configuration plus TMC steppers" +exec_test $1 $2 "BigTreeTech BTT002 Default Configuration plus TMC steppers" "$3" # clean up restore_configs diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests index 1db0bcffd2..9750b8fc2c 100644 --- a/buildroot/tests/BIGTREE_GTR_V1_0-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0-tests @@ -37,7 +37,7 @@ opt_set FIL_RUNOUT4_STATE HIGH opt_enable FIL_RUNOUT4_PULL opt_set FIL_RUNOUT8_STATE HIGH opt_enable FIL_RUNOUT8_PULL -exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" +exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" "$3" restore_configs opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 @@ -53,7 +53,7 @@ opt_set DEFAULT_Kp_LIST "{ 22.2, 20.0, 21.0, 19.0, 18.0, 17.0 }" opt_set DEFAULT_Ki_LIST "{ 1.08 }" opt_set DEFAULT_Kd_LIST "{ 114.0, 112.0, 110.0, 108.0 }" opt_enable TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_MIGRATION_FEATURE TOOLCHANGE_FS_INIT_BEFORE_SWAP TOOLCHANGE_FS_PRIME_FIRST_USED PID_PARAMS_PER_HOTEND -exec_test $1 $2 "BigTreeTech GTR 6 Extruders Triple Z" +exec_test $1 $2 "BigTreeTech GTR 6 Extruders Triple Z" "$3" # clean up restore_configs diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests index 1295f5858c..3d0000ccc4 100644 --- a/buildroot/tests/BIGTREE_SKR_PRO-tests +++ b/buildroot/tests/BIGTREE_SKR_PRO-tests @@ -12,7 +12,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 opt_set SERIAL_PORT 1 -exec_test $1 $2 "BigTreeTech SKR Pro Default Configuration" +exec_test $1 $2 "BigTreeTech SKR Pro Default Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 @@ -26,7 +26,7 @@ opt_set E2_AUTO_FAN_PIN PC12 opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING -exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" +exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" "$3" # clean up restore_configs diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 4a7c492d7b..ccb49bf482 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -33,7 +33,7 @@ opt_set EXTRUDER_AUTO_FAN_SPEED 100 opt_set TEMP_SENSOR_CHAMBER 3 opt_add TEMP_CHAMBER_PIN 6 opt_set HEATER_CHAMBER_PIN 45 -exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." +exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." "$3" # # RADDS with BLTouch, ABL(B), 3 x Z auto-align @@ -51,7 +51,7 @@ opt_add Z2_MAX_PIN 2 opt_add Z3_MAX_PIN 3 pins_set ramps/RAMPS X_MAX_PIN -1 pins_set ramps/RAMPS Y_MAX_PIN -1 -exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" +exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" "$3" # # Test SWITCHING_EXTRUDER @@ -62,4 +62,4 @@ opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF opt_set EXTRUDERS 2 opt_set NUM_SERVOS 1 opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER BEEP_ON_FEEDRATE_CHANGE POWER_LOSS_RECOVERY -exec_test $1 $2 "RAMPS4DUE_EEF with SWITCHING_EXTRUDER, POWER_LOSS_RECOVERY" +exec_test $1 $2 "RAMPS4DUE_EEF with SWITCHING_EXTRUDER, POWER_LOSS_RECOVERY" "$3" diff --git a/buildroot/tests/DUE_archim-tests b/buildroot/tests/DUE_archim-tests index 4d9eb36419..f1711a8f3d 100755 --- a/buildroot/tests/DUE_archim-tests +++ b/buildroot/tests/DUE_archim-tests @@ -10,12 +10,12 @@ set -e # Test Archim 1 # use_example_configs UltiMachine/Archim1 -exec_test $1 $2 "Archim 1 base configuration" +exec_test $1 $2 "Archim 1 base configuration" "$3" # # Test Archim 2 # use_example_configs UltiMachine/Archim2 -exec_test $1 $2 "Archim 2 base configuration" +exec_test $1 $2 "Archim 2 base configuration" "$3" restore_configs diff --git a/buildroot/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG-tests index f1a65da6cb..2c915eb48b 100644 --- a/buildroot/tests/FLYF407ZG-tests +++ b/buildroot/tests/FLYF407ZG-tests @@ -12,7 +12,7 @@ opt_set MOTHERBOARD BOARD_FLYF407ZG opt_set SERIAL_PORT -1 opt_set X_DRIVER_TYPE TMC2208 opt_set Y_DRIVER_TYPE TMC2130 -exec_test $1 $2 "FLYF407ZG Default Config with mixed TMC Drivers" +exec_test $1 $2 "FLYF407ZG Default Config with mixed TMC Drivers" "$3" # cleanup restore_configs diff --git a/buildroot/tests/FYSETC_F6_13-tests b/buildroot/tests/FYSETC_F6_13-tests index 631a117785..a3e9f4ef39 100644 --- a/buildroot/tests/FYSETC_F6_13-tests +++ b/buildroot/tests/FYSETC_F6_13-tests @@ -12,7 +12,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_FYSETC_F6_13 opt_enable DGUS_LCD_UI_FYSETC -exec_test $1 $2 "FYSETC F6 1.3 with DGUS" +exec_test $1 $2 "FYSETC F6 1.3 with DGUS" "$3" # clean up restore_configs diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6-tests index c75629156b..18951ebb79 100644 --- a/buildroot/tests/FYSETC_S6-tests +++ b/buildroot/tests/FYSETC_S6-tests @@ -11,7 +11,7 @@ restore_configs use_example_configs FYSETC/S6 opt_set Y_DRIVER_TYPE TMC2209 opt_set Z_DRIVER_TYPE TMC2130 -exec_test $1 $2 "FYSETC S6 Example" +exec_test $1 $2 "FYSETC S6 Example" "$3" # cleanup restore_configs diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX-tests index c2d72e0d77..7fcdb2684f 100644 --- a/buildroot/tests/LERDGEX-tests +++ b/buildroot/tests/LERDGEX-tests @@ -12,7 +12,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_LERDGE_X opt_set SERIAL_PORT 1 -exec_test $1 $2 "LERDGE X with Default Configuration" +exec_test $1 $2 "LERDGE X with Default Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests index 7877b60721..9604ca2403 100755 --- a/buildroot/tests/LPC1768-tests +++ b/buildroot/tests/LPC1768-tests @@ -17,7 +17,7 @@ restore_configs opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB opt_enable VIKI2 SDSUPPORT SDCARD_READONLY SERIAL_PORT_2 NEOPIXEL_LED opt_set NEOPIXEL_PIN P1_16 -exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), NeoPixel" +exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), NeoPixel" "$3" #restore_configs #use_example_configs Mks/Sbase @@ -30,7 +30,7 @@ opt_set TEMP_SENSOR_1 1 opt_set NUM_SERVOS 2 opt_set SERVO_DELAY "{ 300, 300 }" opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR ULTIMAKERCONTROLLER -exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE" +exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE" "$3" restore_configs opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB @@ -47,7 +47,7 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT ADAPTIVE_FAN_ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER opt_set GRID_MAX_POINTS_X 16 opt_set NOZZLE_TO_PROBE_OFFSET "{ 0, 0, 0 }" -exec_test $1 $2 "Re-ARM with NOZZLE_AS_PROBE and many features." +exec_test $1 $2 "Re-ARM with NOZZLE_AS_PROBE and many features." "$3" # clean up restore_configs diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index df66f0ab75..e4787f82da 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -10,7 +10,7 @@ set -e # Build with the default configurations # use_example_configs Azteeg/X5GT -exec_test $1 $2 "Azteeg X5GT Example Configuration" +exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD @@ -25,7 +25,7 @@ opt_enable VIKI2 SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER opt_disable SD_PROCEDURE_DEPTH opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Smoothieboard with many features" +exec_test $1 $2 "Smoothieboard with many features" "$3" restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD @@ -39,7 +39,7 @@ opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PI Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI" +exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI" "$3" #restore_configs #opt_set MOTHERBOARD BOARD_AZTEEG_X5_MINI_WIFI @@ -67,7 +67,7 @@ opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT MECHANICAL SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \ EXPERIMENTAL_I2CBUS opt_disable PSU_CONTROL -exec_test $1 $2 "Cohesion3D Remix DELTA + ABL Bilinear + EEPROM + SENSORLESS_PROBING" +exec_test $1 $2 "Cohesion3D Remix DELTA + ABL Bilinear + EEPROM + SENSORLESS_PROBING" "$3" # clean up restore_configs diff --git a/buildroot/tests/NUCLEO_F767ZI-tests b/buildroot/tests/NUCLEO_F767ZI-tests index 05125a4539..1a2e7c8362 100644 --- a/buildroot/tests/NUCLEO_F767ZI-tests +++ b/buildroot/tests/NUCLEO_F767ZI-tests @@ -15,7 +15,7 @@ opt_set SERIAL_PORT -1 opt_enable BLTOUCH Z_SAFE_HOMING SPEAKER opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2208 -exec_test $1 $2 "Mixed timer usage" +exec_test $1 $2 "Mixed timer usage" "$3" # clean up restore_configs diff --git a/buildroot/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4-tests index fbaf5fb7e5..a98929520e 100644 --- a/buildroot/tests/SAMD51_grandcentral_m4-tests +++ b/buildroot/tests/SAMD51_grandcentral_m4-tests @@ -33,7 +33,7 @@ opt_enable ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION BLTOUCH Z_MIN_PROBE_R MOVE_Z_WHEN_IDLE BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ LIN_ADVANCE ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE MONITOR_DRIVER_STATUS SENSORLESS_HOMING \ SQUARE_WAVE_STEPPING TMC_DEBUG EXPERIMENTAL_SCURVE -exec_test $1 $2 "Build Grand Central M4 Default Configuration" +exec_test $1 $2 "Build Grand Central M4 Default Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan-tests index 20bd111fa9..eeec7e9b1f 100644 --- a/buildroot/tests/STM32F070CB_malyan-tests +++ b/buildroot/tests/STM32F070CB_malyan-tests @@ -9,7 +9,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 opt_set SERIAL_PORT -1 -exec_test $1 $2 "Malyan M200 v2 Default Config" +exec_test $1 $2 "Malyan M200 v2 Default Config" "$3" # cleanup restore_configs diff --git a/buildroot/tests/STM32F070RB_malyan-tests b/buildroot/tests/STM32F070RB_malyan-tests index 58237a70eb..493dd5fdbd 100644 --- a/buildroot/tests/STM32F070RB_malyan-tests +++ b/buildroot/tests/STM32F070RB_malyan-tests @@ -9,7 +9,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 opt_set SERIAL_PORT -1 -exec_test $1 $2 "Malyan M200 v2 Default Config" +exec_test $1 $2 "Malyan M200 v2 Default Config" "$3" # cleanup restore_configs diff --git a/buildroot/tests/STM32F103CB_malyan-tests b/buildroot/tests/STM32F103CB_malyan-tests index e594cb43db..6624b6c3c2 100644 --- a/buildroot/tests/STM32F103CB_malyan-tests +++ b/buildroot/tests/STM32F103CB_malyan-tests @@ -7,7 +7,7 @@ set -e use_example_configs Malyan/M200 -exec_test $1 $2 "Malyan M200" +exec_test $1 $2 "Malyan M200" "$3" # cleanup restore_configs diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests index ad15ee7237..77044dcb36 100644 --- a/buildroot/tests/STM32F103RC_btt-tests +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -22,7 +22,7 @@ opt_set Y_SLAVE_ADDRESS 1 opt_set Z_SLAVE_ADDRESS 2 opt_set E0_SLAVE_ADDRESS 3 -exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" +exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB-tests index 8f7fff0b32..d752c87d18 100644 --- a/buildroot/tests/STM32F103RC_btt_USB-tests +++ b/buildroot/tests/STM32F103RC_btt_USB-tests @@ -13,7 +13,7 @@ restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 opt_set SERIAL_PORT 1 opt_set SERIAL_PORT_2 -1 -exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - Basic Configuration" +exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - Basic Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RC_fysetc-tests b/buildroot/tests/STM32F103RC_fysetc-tests index dfa85d9bb6..0e78c73188 100644 --- a/buildroot/tests/STM32F103RC_fysetc-tests +++ b/buildroot/tests/STM32F103RC_fysetc-tests @@ -10,7 +10,7 @@ set -e # Build with the default configurations # use_example_configs "Creality/Ender-3/FYSETC Cheetah 1.2/base" -exec_test $1 $2 "Cheetah 1.2 Configuration" +exec_test $1 $2 "Cheetah 1.2 Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb-tests index 74e770d3c8..4fcb6e8118 100644 --- a/buildroot/tests/STM32F103RC_meeb-tests +++ b/buildroot/tests/STM32F103RC_meeb-tests @@ -17,7 +17,7 @@ opt_set X_DRIVER_TYPE TMC2208 opt_set Y_DRIVER_TYPE TMC2208 opt_set Z_DRIVER_TYPE TMC2208 opt_set E0_DRIVER_TYPE TMC2208 -exec_test $1 $2 "MEEB_3DP - Basic Config with TMC2208 SW Serial" +exec_test $1 $2 "MEEB_3DP - Basic Config with TMC2208 SW Serial" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RE-tests b/buildroot/tests/STM32F103RE-tests index 63fe5ba393..909c362d06 100755 --- a/buildroot/tests/STM32F103RE-tests +++ b/buildroot/tests/STM32F103RE-tests @@ -16,7 +16,7 @@ opt_set SERIAL_PORT -1 opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT \ PAREN_COMMENTS GCODE_MOTION_MODES SINGLENOZZLE TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_PARK \ BAUD_RATE_GCODE GCODE_MACROS NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE -exec_test $1 $2 "STM32F1R EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT PAREN_COMMENTS GCODE_MOTION_MODES" +exec_test $1 $2 "STM32F1R EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT PAREN_COMMENTS GCODE_MOTION_MODES" "$3" # cleanup restore_configs diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests index ca723c7aa2..954827ddd9 100644 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -11,6 +11,6 @@ set -e # use_example_configs "Creality/Ender-3 V2" opt_enable MARLIN_DEV_MODE -exec_test $1 $2 "Ender 3 v2" +exec_test $1 $2 "Ender 3 v2" "$3" restore_configs diff --git a/buildroot/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt-tests index 9a829a553e..ab8681c7f5 100644 --- a/buildroot/tests/STM32F103RE_btt-tests +++ b/buildroot/tests/STM32F103RE_btt-tests @@ -15,7 +15,7 @@ opt_set SERIAL_PORT 1 opt_set SERIAL_PORT_2 -1 opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 -exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Config with mixed TMC Drivers" +exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Config with mixed TMC Drivers" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB-tests index 77751d776e..e35d68898c 100644 --- a/buildroot/tests/STM32F103RE_btt_USB-tests +++ b/buildroot/tests/STM32F103RE_btt_USB-tests @@ -13,7 +13,7 @@ restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP opt_set SERIAL_PORT 1 opt_set SERIAL_PORT_2 -1 -exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" +exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer-tests index 8eb9e4cd1b..461f128873 100755 --- a/buildroot/tests/STM32F103VE_longer-tests +++ b/buildroot/tests/STM32F103VE_longer-tests @@ -8,7 +8,7 @@ set -e use_example_configs Alfawise/U20 opt_enable BAUD_RATE_GCODE -exec_test $1 $2 "Full-featured U20 config" +exec_test $1 $2 "Full-featured U20 config" "$3" # cleanup restore_configs diff --git a/buildroot/tests/STM32F4-tests b/buildroot/tests/STM32F4-tests index b5beb73663..89281860f6 100644 --- a/buildroot/tests/STM32F4-tests +++ b/buildroot/tests/STM32F4-tests @@ -10,7 +10,7 @@ set -e # Build with the default configurations # use_example_configs STM32/STM32F4 -exec_test $1 $2 "STM32F4 Default Configuration" +exec_test $1 $2 "STM32F4 Default Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL-tests index 2811014c13..d7c90e7907 100644 --- a/buildroot/tests/STM32F401VE_STEVAL-tests +++ b/buildroot/tests/STM32F401VE_STEVAL-tests @@ -10,7 +10,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_STEVAL_3DP001V1 opt_set SERIAL_PORT -1 -exec_test $1 $2 "STM32F401VE_STEVAL Default Config" +exec_test $1 $2 "STM32F401VE_STEVAL Default Config" "$3" # cleanup restore_configs diff --git a/buildroot/tests/STM32F407VE_black-tests b/buildroot/tests/STM32F407VE_black-tests index 908382ec2a..6b7a3cfe7c 100755 --- a/buildroot/tests/STM32F407VE_black-tests +++ b/buildroot/tests/STM32F407VE_black-tests @@ -9,7 +9,7 @@ set -e restore_configs use_example_configs STM32/Black_STM32F407VET6 opt_enable BAUD_RATE_GCODE -exec_test $1 $2 "Full-featured Sample Black STM32F407VET6 config" +exec_test $1 $2 "Full-featured Sample Black STM32F407VET6 config" "$3" # cleanup restore_configs diff --git a/buildroot/tests/STM32F7-tests b/buildroot/tests/STM32F7-tests index 281222f156..b23a16467e 100644 --- a/buildroot/tests/STM32F7-tests +++ b/buildroot/tests/STM32F7-tests @@ -12,7 +12,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_REMRAM_V1 opt_set SERIAL_PORT 1 -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "Default Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/at90usb1286_cdc-tests b/buildroot/tests/at90usb1286_cdc-tests index 812e2ebcae..01d752db8b 100644 --- a/buildroot/tests/at90usb1286_cdc-tests +++ b/buildroot/tests/at90usb1286_cdc-tests @@ -11,7 +11,7 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_BRAINWAVE_PRO -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "Default Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/at90usb1286_dfu-tests b/buildroot/tests/at90usb1286_dfu-tests index a9b7e2bbb0..75672a6a51 100644 --- a/buildroot/tests/at90usb1286_dfu-tests +++ b/buildroot/tests/at90usb1286_dfu-tests @@ -11,12 +11,12 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_PRINTRBOARD -exec_test $1 $2 "Printrboard Configuration" +exec_test $1 $2 "Printrboard Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_PRINTRBOARD_REVF opt_enable MINIPANEL -exec_test $1 $2 "Printrboard RevF with MiniPanel and Stepper DAC (in pins file)" +exec_test $1 $2 "Printrboard RevF with MiniPanel and Stepper DAC (in pins file)" "$3" # clean up restore_configs diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32-tests index 204e7aa708..283d02f7e0 100755 --- a/buildroot/tests/esp32-tests +++ b/buildroot/tests/esp32-tests @@ -15,7 +15,7 @@ opt_enable WIFISUPPORT WEBSUPPORT GCODE_MACROS BAUD_RATE_GCODE M115_GEOMETRY_REP opt_add WIFI_SSID "\"ssid\"" opt_add WIFI_PWD "\"password\"" opt_set TX_BUFFER_SIZE 64 -exec_test $1 $2 "ESP32 with WIFISUPPORT and WEBSUPPORT" +exec_test $1 $2 "ESP32 with WIFISUPPORT and WEBSUPPORT" "$3" # # Build with TMC drivers using hardware serial @@ -35,7 +35,7 @@ opt_set Y_SLAVE_ADDRESS 1 opt_set Z_SLAVE_ADDRESS 2 opt_set E0_SLAVE_ADDRESS 3 opt_enable HOTEND_IDLE_TIMEOUT -exec_test $1 $2 "ESP32, TMC HW Serial, Hotend Idle" +exec_test $1 $2 "ESP32, TMC HW Serial, Hotend Idle" "$3" # cleanup restore_configs diff --git a/buildroot/tests/jgaurora_a5s_a1-tests b/buildroot/tests/jgaurora_a5s_a1-tests index c6cc9e3f9c..e9be89eb30 100644 --- a/buildroot/tests/jgaurora_a5s_a1-tests +++ b/buildroot/tests/jgaurora_a5s_a1-tests @@ -10,7 +10,7 @@ set -e # Build with the default configurations # use_example_configs JGAurora/A5S -exec_test $1 $2 "JGAurora/A5S Configuration" +exec_test $1 $2 "JGAurora/A5S Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/linux_native-tests b/buildroot/tests/linux_native-tests index 38f531dadc..711691fb9d 100755 --- a/buildroot/tests/linux_native-tests +++ b/buildroot/tests/linux_native-tests @@ -13,7 +13,7 @@ restore_configs opt_set MOTHERBOARD BOARD_LINUX_RAMPS opt_set TEMP_SENSOR_BED 1 opt_enable PIDTEMPBED EEPROM_SETTINGS BAUD_RATE_GCODE -exec_test $1 $2 "Linux with EEPROM" +exec_test $1 $2 "Linux with EEPROM" "$3" # cleanup restore_configs diff --git a/buildroot/tests/malyan_M300-tests b/buildroot/tests/malyan_M300-tests index 1955accaa5..27bdcfb059 100755 --- a/buildroot/tests/malyan_M300-tests +++ b/buildroot/tests/malyan_M300-tests @@ -10,7 +10,7 @@ restore_configs use_example_configs "delta/Malyan M300" opt_disable AUTO_BED_LEVELING_3POINT opt_set LCD_SERIAL_PORT 1 -exec_test $1 $2 "Malyan M300 (delta)" +exec_test $1 $2 "Malyan M300 (delta)" "$3" # cleanup restore_configs diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index ce13d4a6e8..1f06767248 100644 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -27,7 +27,7 @@ opt_set POWER_MONITOR_CURRENT_PIN 14 opt_set POWER_MONITOR_VOLTAGE_PIN 15 opt_set CLOSED_LOOP_ENABLE_PIN 44 opt_set CLOSED_LOOP_MOVE_COMPLETE_PIN 45 -exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, Power Monitor, and LCD" +exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, Power Monitor, and LCD" "$3" # # Test DUAL_X_CARRIAGE @@ -39,21 +39,21 @@ opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 1 opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD opt_set REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 -exec_test $1 $2 "TT Oscar | DUAL_X_CARRIAGE" +exec_test $1 $2 "TT Oscar | DUAL_X_CARRIAGE" "$3" # # Delta Config (generic) + Probeless # use_example_configs delta/generic opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_AUTO_CALIBRATION DELTA_CALIBRATION_MENU -exec_test $1 $2 "RAMPS | DELTA | RRD LCD | DELTA_AUTO_CALIBRATION | DELTA_CALIBRATION_MENU" +exec_test $1 $2 "RAMPS | DELTA | RRD LCD | DELTA_AUTO_CALIBRATION | DELTA_CALIBRATION_MENU" "$3" # # Delta Config (generic) + ABL bilinear + BLTOUCH use_example_configs delta/generic opt_set LCD_LANGUAGE cz opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_CALIBRATION_MENU AUTO_BED_LEVELING_BILINEAR BLTOUCH -exec_test $1 $2 "DELTA | RRD LCD | ABL Bilinear | BLTOUCH" +exec_test $1 $2 "DELTA | RRD LCD | ABL Bilinear | BLTOUCH" "$3" # clean up restore_configs diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index cc9830be36..113ec9ed1b 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -32,7 +32,7 @@ opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATU MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL -exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE ..." +exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE ..." "$3" # # Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language @@ -58,7 +58,7 @@ opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATU opt_set LCD_LANGUAGE jp_kana opt_disable SEGMENT_LEVELED_MOVES opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL M114_DETAIL -exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." +exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." "$3" # # Test a Servo Probe @@ -73,7 +73,7 @@ opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ PRUSA_MMU2 MMU2_MENUS PRUSA_MMU2_S_MODE DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING -exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2 | Servo | 3-Point + Debug | G38 ..." +exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2 | Servo | 3-Point + Debug | G38 ..." "$3" # # 5 runout sensors with distinct states @@ -110,7 +110,7 @@ opt_add M100_FREE_MEMORY_DUMPER opt_add M100_FREE_MEMORY_CORRUPTOR opt_set PWM_MOTOR_CURRENT "{ 1300, 1300, 1250 }" opt_set I2C_SLAVE_ADDRESS 63 -exec_test $1 $2 "MEGACONTROLLER | Minipanel | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." +exec_test $1 $2 "MEGACONTROLLER | Minipanel | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." "$3" # # Mixing Extruder with 5 steppers, Greek @@ -122,7 +122,7 @@ opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY \ USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z opt_set MIXING_STEPPERS 5 opt_set LCD_LANGUAGE ru -exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" +exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" # # Test SPEAKER with BOARD_BQ_ZUM_MEGA_3D and BQ_LCD_SMART_CONTROLLER @@ -163,7 +163,7 @@ opt_set FAN_MIN_PWM 50 opt_set FAN_KICKSTART_TIME 100 opt_set XY_FREQUENCY_LIMIT 15 opt_add FILWIDTH_PIN 5 -exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home Y > X | FW Retract ..." +exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home Y > X | FW Retract ..." "$3" ######## Other Standard LCD/Panels ############## # @@ -286,13 +286,13 @@ opt_add L6470_CHAIN_MISO_PIN 49 opt_add L6470_CHAIN_MOSI_PIN 40 opt_add L6470_CHAIN_SS_PIN 42 opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" -exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." +exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." "$3" # # Delta Config (FLSUN AC because it's complex) # use_example_configs delta/FLSUN/auto_calibrate -exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" +exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" "$3" # # Makibox Config need to check board type for Teensy++ 2.0 @@ -315,7 +315,7 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE \ MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD \ USE_ZMIN_PLUG SENSORLESS_HOMING TMC_DEBUG M114_DETAIL -exec_test $1 $2 "RAMPS | Mixed TMC | Sensorless | RRDFGSC | Games" +exec_test $1 $2 "RAMPS | Mixed TMC | Sensorless | RRDFGSC | Games" "$3" # # SCARA with Mixed TMC @@ -330,7 +330,7 @@ opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 opt_set Z_DRIVER_TYPE TMC2130_STANDALONE opt_set E0_DRIVER_TYPE TMC2660 -exec_test $1 $2 "RAMPS | SCARA | Mixed TMC | EEPROM" +exec_test $1 $2 "RAMPS | SCARA | Mixed TMC | EEPROM" "$3" # # tvrrug Config need to check board type for sanguino atmega644p diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests index 4246231070..3fccc87c59 100644 --- a/buildroot/tests/mks_robin-tests +++ b/buildroot/tests/mks_robin-tests @@ -8,7 +8,7 @@ set -e use_example_configs Mks/Robin -exec_test $1 $2 "MKS Robin config (FSMC Color UI)" +exec_test $1 $2 "MKS Robin config (FSMC Color UI)" "$3" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite-tests index d54627e069..c4be4f206d 100644 --- a/buildroot/tests/mks_robin_lite-tests +++ b/buildroot/tests/mks_robin_lite-tests @@ -11,7 +11,7 @@ opt_set MOTHERBOARD BOARD_MKS_ROBIN_LITE opt_set SERIAL_PORT 1 opt_enable EEPROM_SETTINGS opt_enable SDSUPPORT -exec_test $1 $2 "Default Configuration with Fallback SD EEPROM" +exec_test $1 $2 "Default Configuration with Fallback SD EEPROM" "$3" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests index 1c40ea4535..6675634f30 100644 --- a/buildroot/tests/mks_robin_mini-tests +++ b/buildroot/tests/mks_robin_mini-tests @@ -11,7 +11,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_MINI opt_set EXTRUDERS 1 opt_set TEMP_SENSOR_1 0 -exec_test $1 $2 "MKS Robin mini" +exec_test $1 $2 "MKS Robin mini" "$3" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index 426f29d473..5dcf79b1ae 100644 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -12,7 +12,7 @@ set -e # use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" +exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" "$3" # # MKS Robin v2 nano Emulated DOGM SPI @@ -22,7 +22,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 opt_disable TFT_INTERFACE_FSMC opt_enable TFT_INTERFACE_SPI -exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" +exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" "$3" # # MKS Robin nano v1.2 LVGL FSMC @@ -31,7 +31,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 opt_enable TFT_LVGL_UI TFT_RES_480x320 -exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" +exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" "$3" # # MKS Robin v2 nano LVGL SPI @@ -41,7 +41,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 -exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" +exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" "$3" # # MKS Robin v2 nano New Color UI 480x320 SPI @@ -51,7 +51,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 -exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3" # # MKS Robin v2 nano LVGL SPI + TMC @@ -63,7 +63,7 @@ opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2209 -exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" +exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests index 3cafc6142f..3503d0ce1f 100644 --- a/buildroot/tests/mks_robin_pro-tests +++ b/buildroot/tests/mks_robin_pro-tests @@ -15,7 +15,7 @@ opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 opt_set TEMP_SENSOR_BED 1 opt_disable THERMAL_PROTECTION_HOTENDS -exec_test $1 $2 "MKS Robin Pro, TMC Drivers, no thermal protection" +exec_test $1 $2 "MKS Robin Pro, TMC Drivers, no thermal protection" "$3" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_stm32-tests b/buildroot/tests/mks_robin_stm32-tests index 4aa146fa52..e250dceca2 100644 --- a/buildroot/tests/mks_robin_stm32-tests +++ b/buildroot/tests/mks_robin_stm32-tests @@ -7,7 +7,7 @@ set -e use_example_configs Mks/Robin -exec_test $1 $2 "MKS Robin base configuration" +exec_test $1 $2 "MKS Robin base configuration" "$3" # cleanup restore_configs diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 6fc720d1e1..231a21747b 100644 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -42,7 +42,7 @@ opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TE SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL opt_add DEBUG_POWER_LOSS_RECOVERY -exec_test $1 $2 "RAMBO | EXTRUDERS 2 | CHAR LCD + SD | FIX Probe | ABL-Linear | Advanced Pause | PLR | LEDs ..." +exec_test $1 $2 "RAMBO | EXTRUDERS 2 | CHAR LCD + SD | FIX Probe | ABL-Linear | Advanced Pause | PLR | LEDs ..." "$3" # # Full size Rambo Dual Endstop CNC @@ -58,7 +58,7 @@ opt_enable USE_XMAX_PLUG USE_YMAX_PLUG USE_ZMAX_PLUG \ S_CURVE_ACCELERATION X_DUAL_STEPPER_DRIVERS X_DUAL_ENDSTOPS Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS \ ADAPTIVE_STEP_SMOOTHING CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS -exec_test $1 $2 "Rambo CNC Configuration" +exec_test $1 $2 "Rambo CNC Configuration" "$3" # # Rambo heated bed only @@ -79,7 +79,7 @@ opt_set X_DRIVER_TYPE TMC2130 opt_set Y_DRIVER_TYPE TMC2130 opt_set Z_DRIVER_TYPE TMC2130 opt_set E0_DRIVER_TYPE TMC2130 -exec_test $1 $2 "Einsy RAMBo with TMC2130" +exec_test $1 $2 "Einsy RAMBo with TMC2130" "$3" # clean up restore_configs diff --git a/buildroot/tests/rumba32-tests b/buildroot/tests/rumba32-tests index 42f9beb9af..20a640efed 100644 --- a/buildroot/tests/rumba32-tests +++ b/buildroot/tests/rumba32-tests @@ -15,7 +15,7 @@ opt_enable PIDTEMPBED opt_set TEMP_SENSOR_BED 1 opt_disable THERMAL_PROTECTION_BED opt_set X_DRIVER_TYPE TMC2130 -exec_test $1 $2 "RUMBA32 V1.0 with TMC2130, PID Bed, and bed thermal protection disabled" +exec_test $1 $2 "RUMBA32 V1.0 with TMC2130, PID Bed, and bed thermal protection disabled" "$3" # Build examples restore_configs @@ -25,7 +25,7 @@ opt_enable PIDTEMPBED EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPH opt_set TEMP_SENSOR_BED 1 opt_set X_DRIVER_TYPE TMC2130 opt_set Y_DRIVER_TYPE TMC2208 -exec_test $1 $2 "RUMBA32 V1.1 with TMC2130, TMC2208, PID Bed, EEPROM settings, and graphic LCD controller" +exec_test $1 $2 "RUMBA32 V1.1 with TMC2130, TMC2208, PID Bed, EEPROM settings, and graphic LCD controller" "$3" # Build examples restore_configs @@ -33,7 +33,7 @@ opt_set MOTHERBOARD BOARD_RUMBA32_MKS opt_set SERIAL_PORT -1 opt_set X_DRIVER_TYPE TMC2130 opt_set Y_DRIVER_TYPE TMC2208 -exec_test $1 $2 "RUMBA32 MKS Default Config with Mixed TMC Drivers" +exec_test $1 $2 "RUMBA32 MKS Default Config with Mixed TMC Drivers" "$3" # cleanup restore_configs diff --git a/buildroot/tests/run_tests b/buildroot/tests/run_tests index d01107f45a..a0eef6a05f 100755 --- a/buildroot/tests/run_tests +++ b/buildroot/tests/run_tests @@ -10,11 +10,27 @@ set -e exec_test () { printf "\n\033[0;32m[Test $2] \033[0m$3...\n" - if platformio run --project-dir $1 -e $2 --silent; then + # Check to see if we should skip tests + if [[ -n "$4" ]] ; then + if [[ ! "$3" =~ $4 ]] ; then + printf "\033[1;33mSkipped\033[0m\n" + return 0 + fi + fi + if [[ -z "$VERBOSE_PLATFORMIO" ]] ; then + silent="--silent" + else + silent="" + fi + if platformio run --project-dir $1 -e $2 $silent; then printf "\033[0;32mPassed\033[0m\n" return 0 else - git reset --hard HEAD + if [[ -n $GIT_RESET_HARD ]]; then + git reset --hard HEAD + else + restore_configs + fi printf "\033[0;31mFailed!\033[0m\n" return 1 fi @@ -30,12 +46,32 @@ if [[ $2 = "ALL" ]]; then testenv=$(basename $f | cut -d"-" -f1) printf "Running \033[0;32m$f\033[0m Tests\n" exec_test $1 "$testenv --target clean" "Setup Build Environment" - $f $1 $testenv - git reset --hard HEAD + if [[ $GIT_RESET_HARD == "true" ]]; then + git reset --hard HEAD + else + restore_configs + fi done else exec_test $1 "$2 --target clean" "Setup Build Environment" - $2-tests $1 $2 - git reset --hard HEAD + test_name="$3" + # If the test name is 1 or 2 digits, treat it as an index + if [[ "$test_name" =~ ^[0-9][0-9]?$ ]] ; then + # Find the test name that corresponds to that index + test_name="$(cat buildroot/tests/$2-tests | grep -e '^exec_test' | sed -n "$3p" | sed "s/.*\$1 \$2 \"\([^\"]*\).*/\1/g")" + if [[ -z "$test_name" ]] ; then + # Fail if none matches + printf "\033[0;31mCould not find test \033[0m#$3\033[0;31m in \033[0mbuildroot/tests/$2-tests\n" + exit 1 + else + printf "\033[0;32mMatching test \033[0m#$3\033[0;32m: '\033[0m$test_name\033[0;32m'\n" + fi + fi + $2-tests $1 $2 "$test_name" + if [[ $GIT_RESET_HARD == "true" ]]; then + git reset --hard HEAD + else + restore_configs + fi fi printf "\033[0;32mAll tests completed successfully\033[0m\n" diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests index 7181f961c4..748d2a8fa3 100644 --- a/buildroot/tests/sanguino1284p-tests +++ b/buildroot/tests/sanguino1284p-tests @@ -11,7 +11,7 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "Default Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/sanguino644p-tests b/buildroot/tests/sanguino644p-tests index 41626b23f7..12910a76fa 100644 --- a/buildroot/tests/sanguino644p-tests +++ b/buildroot/tests/sanguino644p-tests @@ -11,7 +11,7 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "Default Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31-tests index be377b15af..448a8860c7 100755 --- a/buildroot/tests/teensy31-tests +++ b/buildroot/tests/teensy31-tests @@ -8,7 +8,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_TEENSY31_32 -exec_test $1 $2 "Teensy3.1 with default config" +exec_test $1 $2 "Teensy3.1 with default config" "$3" # # Test many features together @@ -27,4 +27,4 @@ opt_enable EEPROM_SETTINGS FILAMENT_WIDTH_SENSOR CALIBRATION_GCODE BAUD_RATE_GCO HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT opt_set I2C_SLAVE_ADDRESS 63 opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Teensy3.1 with many features" +exec_test $1 $2 "Teensy3.1 with many features" "$3" diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests index 39ee4faf49..79998a26d3 100755 --- a/buildroot/tests/teensy35-tests +++ b/buildroot/tests/teensy35-tests @@ -8,7 +8,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 -exec_test $1 $2 "Teensy3.5 with default config" +exec_test $1 $2 "Teensy3.5 with default config" "$3" # # Test as many features together as possible @@ -29,7 +29,7 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT opt_set I2C_SLAVE_ADDRESS 63 opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Teensy3.5 with many features" +exec_test $1 $2 "Teensy3.5 with many features" "$3" # # Test a Sled Z Probe with Linear leveling @@ -37,7 +37,7 @@ exec_test $1 $2 "Teensy3.5 with many features" restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 opt_enable EEPROM_SETTINGS Z_PROBE_SLED Z_SAFE_HOMING AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE GCODE_MACROS -exec_test $1 $2 "Sled Z Probe with Linear leveling" +exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # # Test a Servo Probe @@ -63,7 +63,7 @@ opt_set MOTHERBOARD BOARD_TEENSY35_36 opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 1 opt_enable MAGNETIC_PARKING_EXTRUDER ULTIMAKERCONTROLLER -exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" +exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" "$3" # # Mixing Extruder @@ -72,7 +72,7 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER opt_set MIXING_STEPPERS 2 -exec_test $1 $2 "Mixing Extruder" +exec_test $1 $2 "Mixing Extruder" "$3" # # Test SWITCHING_EXTRUDER @@ -97,7 +97,7 @@ opt_set Y_MIN_ENDSTOP_INVERTING true opt_add X_CS_PIN 46 opt_add Y_CS_PIN 47 opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING -exec_test $1 $2 "Teensy 3.5/3.6 COREXY" +exec_test $1 $2 "Teensy 3.5/3.6 COREXY" "$3" # # Enable COREXZ @@ -105,7 +105,7 @@ exec_test $1 $2 "Teensy 3.5/3.6 COREXY" restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 opt_enable COREXZ -exec_test $1 $2 "Teensy 3.5/3.6 COREXZ" +exec_test $1 $2 "Teensy 3.5/3.6 COREXZ" "$3" # # Enable Dual Z with Dual Z endstops @@ -116,7 +116,7 @@ opt_set NUM_Z_STEPPER_DRIVERS 2 opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG pins_set ramps/RAMPS X_MAX_PIN -1 opt_add Z2_MAX_PIN 2 -exec_test $1 $2 "Dual Z with Dual Z endstops" +exec_test $1 $2 "Dual Z with Dual Z endstops" "$3" # Clean up restore_configs diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests index 628b295a7f..135891940e 100644 --- a/buildroot/tests/teensy41-tests +++ b/buildroot/tests/teensy41-tests @@ -8,7 +8,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 -exec_test $1 $2 "Teensy4.1 with default config" +exec_test $1 $2 "Teensy4.1 with default config" "$3" # # Test as many features together as possible @@ -30,7 +30,7 @@ opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ opt_add EXTUI_EXAMPLE opt_set I2C_SLAVE_ADDRESS 63 opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Teensy4.1 with many features" +exec_test $1 $2 "Teensy4.1 with many features" "$3" # # Test a Sled Z Probe with Linear leveling @@ -38,7 +38,7 @@ exec_test $1 $2 "Teensy4.1 with many features" restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 opt_enable EEPROM_SETTINGS Z_PROBE_SLED Z_SAFE_HOMING AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE GCODE_MACROS -exec_test $1 $2 "Sled Z Probe with Linear leveling" +exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # # Test a Servo Probe @@ -65,7 +65,7 @@ opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 1 opt_set SERIAL_PORT_2 -2 opt_enable EEPROM_SETTINGS MAGNETIC_PARKING_EXTRUDER -exec_test $1 $2 "Ethernet, EEPROM, Magnetic Parking Extruder, No LCD" +exec_test $1 $2 "Ethernet, EEPROM, Magnetic Parking Extruder, No LCD" "$3" # # Mixing Extruder @@ -74,7 +74,7 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL opt_set MIXING_STEPPERS 2 -exec_test $1 $2 "Mixing Extruder" +exec_test $1 $2 "Mixing Extruder" "$3" # # Test SWITCHING_EXTRUDER @@ -99,7 +99,7 @@ opt_set Y_MIN_ENDSTOP_INVERTING true opt_add X_CS_PIN 46 opt_add Y_CS_PIN 47 opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING -exec_test $1 $2 "Teensy 4.0/4.1 COREXY" +exec_test $1 $2 "Teensy 4.0/4.1 COREXY" "$3" # # Enable COREXZ @@ -107,7 +107,7 @@ exec_test $1 $2 "Teensy 4.0/4.1 COREXY" restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 opt_enable COREXZ -exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" +exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" "$3" # # Enable Dual Z with Dual Z endstops @@ -118,7 +118,7 @@ opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG opt_set NUM_Z_STEPPER_DRIVERS 2 pins_set ramps/RAMPS X_MAX_PIN -1 opt_add Z2_MAX_PIN 2 -exec_test $1 $2 "Dual Z with Dual Z endstops" +exec_test $1 $2 "Dual Z with Dual Z endstops" "$3" # Clean up restore_configs diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..a85e0f8315 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ +version: "3.8" +services: + # The main image: this doesn't run any particular command, but is mainly used + # for running tests locally + marlin: + image: marlin-dev + build: + dockerfile: Dockerfile + context: docker + working_dir: /code + volumes: + - .:/code + - platformio-cache:/root/.platformio + +volumes: + # This volume holds installed libraries for PlatformIO. If this is deleted you + # will have to download all the dependencies again, which can be a very slow + # process + platformio-cache: diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000000..903b8b71fd --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.9.0-buster + +RUN pip install -U https://github.com/platformio/platformio-core/archive/develop.zip +RUN platformio update +# To get the test platforms +RUN pip install PyYaml +#ENV PATH /code/buildroot/bin/:/code/buildroot/tests/:${PATH} diff --git a/get_test_targets.py b/get_test_targets.py new file mode 100644 index 0000000000..ce2080eba0 --- /dev/null +++ b/get_test_targets.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python +""" +Extract the builds used in Github CI, so that we can run them locally +""" +import yaml + + +with open('.github/workflows/test-builds.yml') as f: + github_configuration = yaml.safe_load(f) +test_platforms = github_configuration\ + ['jobs']['test_builds']['strategy']['matrix']['test-platform'] +print(' '.join(test_platforms)) From 18869c666f6820338bfb95d38c96bee634602db2 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 17 Nov 2020 23:07:34 -0300 Subject: [PATCH 0589/1370] =?UTF-8?q?COLOR=5FUI=20without=20TOUCH=5FSCREEN?= =?UTF-8?q?=20=F0=9F=91=8D=F0=9F=8F=BB=20(#20178)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 4 +- Marlin/src/lcd/tft/ui_480x320.cpp | 60 ++++++++++++----------- buildroot/tests/mks_robin_nano35-tests | 9 ++++ 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 905d7a07cd..d089b2125a 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -169,7 +169,9 @@ if (ui.should_draw()) { MenuItem_static::draw(1, GET_TEXT(MSG_LEVEL_BED_WAITING)); // Color UI needs a control to detect a touch - TERN_(HAS_GRAPHICAL_TFT, touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT)); + #if BOTH(TOUCH_SCREEN, HAS_GRAPHICAL_TFT) + touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT); + #endif } if (ui.use_click()) { manual_probe_index = 0; diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 6d1043068d..285e55631a 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -49,7 +49,9 @@ #error "Seriously? High resolution TFT screen without menu?" #endif -static bool draw_menu_navigation = false; +#if ENABLED(TOUCH_SCREEN) + static bool draw_menu_navigation = false; +#endif void MarlinUI::tft_idle() { #if ENABLED(TOUCH_SCREEN) @@ -897,35 +899,37 @@ static void z_minus() { moveAxis(Z_AXIS, -1); } -static void e_select() { - motionAxisState.e_selection++; - if (motionAxisState.e_selection >= EXTRUDERS) { - motionAxisState.e_selection = 0; +#if ENABLED(TOUCH_SCREEN) + static void e_select() { + motionAxisState.e_selection++; + if (motionAxisState.e_selection >= EXTRUDERS) { + motionAxisState.e_selection = 0; + } + + quick_feedback(); + drawCurESelection(); + drawAxisValue(E_AXIS); } - quick_feedback(); - drawCurESelection(); - drawAxisValue(E_AXIS); -} + static void do_home() { + quick_feedback(); + drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING)); + queue.inject_P(G28_STR); + // Disable touch until home is done + TERN_(HAS_TFT_XPT2046, touch.disable()); + drawAxisValue(E_AXIS); + drawAxisValue(X_AXIS); + drawAxisValue(Y_AXIS); + drawAxisValue(Z_AXIS); + } -static void do_home() { - quick_feedback(); - drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING)); - queue.inject_P(G28_STR); - // Disable touch until home is done - TERN_(HAS_TFT_XPT2046, touch.disable()); - drawAxisValue(E_AXIS); - drawAxisValue(X_AXIS); - drawAxisValue(Y_AXIS); - drawAxisValue(Z_AXIS); -} - -static void step_size() { - motionAxisState.currentStepSize = motionAxisState.currentStepSize / 10.0; - if (motionAxisState.currentStepSize < 0.0015) motionAxisState.currentStepSize = 10.0; - quick_feedback(); - drawCurStepValue(); -} + static void step_size() { + motionAxisState.currentStepSize = motionAxisState.currentStepSize / 10.0; + if (motionAxisState.currentStepSize < 0.0015) motionAxisState.currentStepSize = 10.0; + quick_feedback(); + drawCurStepValue(); + } +#endif #if HAS_BED_PROBE static void z_select() { @@ -1021,7 +1025,7 @@ void MarlinUI::move_axis_screen() { motionAxisState.zTypePos.x = x; motionAxisState.zTypePos.y = y; drawCurZSelection(); - #if HAS_BED_PROBE + #if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); #endif diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index 5dcf79b1ae..69f370ea69 100644 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -65,5 +65,14 @@ opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2209 exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3" +# +# MKS Robin v2 nano New Color UI 480x320 SPI Without Touch Screen +# +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 TOUCH_SCREEN +opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 TFT_COLOR_UI +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI without TOUCH_SCREEN" + # cleanup restore_configs From 7848096acbfdbc5e5da97eceeccf86ea388038d5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 17 Nov 2020 19:11:13 -0800 Subject: [PATCH 0590/1370] Fix NAN mesh entries with ABL_BILINEAR_SUBDIVISION (#20143) --- Marlin/src/feature/bedlevel/abl/abl.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index 39d8815fad..44e4fc38a1 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -161,6 +161,14 @@ void print_bilinear_leveling_grid() { #define LINEAR_EXTRAPOLATION(E, I) ((E) * 2 - (I)) float bed_level_virt_coord(const uint8_t x, const uint8_t y) { uint8_t ep = 0, ip = 1; + if (x > GRID_MAX_POINTS_X + 1 || y > GRID_MAX_POINTS_Y + 1) { + // The requested point requires extrapolating two points beyond the mesh. + // These values are only requested for the edges of the mesh, which are always an actual mesh point, + // and do not require interpolation. When interpolation is not needed, this "Mesh + 2" point is + // cancelled out in bed_level_virt_cmr and does not impact the result. Return 0.0 rather than + // making this function more complex by extrapolating two points. + return 0.0; + } if (!x || x == ABL_TEMP_POINTS_X - 1) { if (x) { ep = GRID_MAX_POINTS_X - 1; From 26d3caf97c5cf97f75758b975f3a6d4333142970 Mon Sep 17 00:00:00 2001 From: wmariz <11435639+wmariz@users.noreply.github.com> Date: Wed, 18 Nov 2020 00:54:21 -0300 Subject: [PATCH 0591/1370] Probe Wizard XY position (#20167) --- Marlin/Configuration_adv.h | 3 ++- Marlin/src/inc/Conditionals_post.h | 1 + Marlin/src/lcd/marlinui.h | 2 +- Marlin/src/lcd/menu/menu.h | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 31 +++++++++++++++-------- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 2c9ac1aea4..0951dfaa6d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1085,6 +1085,7 @@ //#define PROBE_OFFSET_WIZARD #if ENABLED(PROBE_OFFSET_WIZARD) #define PROBE_OFFSET_START -4.0 // Estimated nozzle-to-probe Z offset, plus a little extra + //#define PROBE_OFFSET_WIZARD_XY_POS XY_CENTER // Set a convenient position to do the measurement #endif #endif @@ -3447,7 +3448,7 @@ #define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move //#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction - //#define GANTRY_CALIBRATION_SAFE_POSITION { X_CENTER, Y_CENTER } // Safe position for nozzle + //#define GANTRY_CALIBRATION_SAFE_POSITION XY_CENTER // Safe position for nozzle //#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM //#define GANTRY_CALIBRATION_COMMANDS_PRE "" #define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index f8727dd963..acb5cc2351 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -100,6 +100,7 @@ #define _Y_HALF_BED ((Y_BED_SIZE) / 2) #define X_CENTER TERN(BED_CENTER_AT_0_0, 0, _X_HALF_BED) #define Y_CENTER TERN(BED_CENTER_AT_0_0, 0, _Y_HALF_BED) +#define XY_CENTER { X_CENTER, Y_CENTER } // Get the linear boundaries of the bed #define X_MIN_BED (X_CENTER - _X_HALF_BED) diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 0445c641ba..6ce59132bf 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -622,7 +622,7 @@ public: // // Special handling if a move is underway // - #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) || (ENABLED(LCD_BED_LEVELING) && EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) + #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) || (ENABLED(LCD_BED_LEVELING) && EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) || (ENABLED(PROBE_OFFSET_WIZARD) && defined(PROBE_OFFSET_WIZARD_XY_POS)) #define LCD_HAS_WAIT_FOR_MOVE 1 static bool wait_for_move; #else diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 4dd66637f1..66fe73cec1 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -220,7 +220,7 @@ void _lcd_draw_homing(); #endif #if ENABLED(PROBE_OFFSET_WIZARD) - void goto_probe_offset_wizard(); + void home_and_goto_probe_offset_wizard(); #endif #if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index fdddf1781a..12f9d57b46 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -488,7 +488,7 @@ void menu_backlash(); EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); #if ENABLED(PROBE_OFFSET_WIZARD) - SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); + SUBMENU(MSG_PROBE_WIZARD, home_and_goto_probe_offset_wizard); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 8a6cbaaf31..9f21550098 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -36,6 +36,7 @@ #include "menu_item.h" #include "menu_addon.h" +#include "../../gcode/queue.h" #include "../../module/motion.h" #include "../../module/planner.h" #include "../../module/probe.h" @@ -120,22 +121,32 @@ void probe_offset_wizard_menu() { END_MENU(); } -void goto_probe_offset_wizard() { - ui.defer_status_screen(); +#ifdef PROBE_OFFSET_WIZARD_XY_POS - prepare_for_calibration(); + #define HAS_PROBE_OFFSET_WIZARD_XY_POS 1 - probe.offset.z = PROBE_OFFSET_START; + inline void goto_probe_offset_wizard() { + if (ui.wait_for_move) return; + constexpr xy_pos_t wizard_pos = PROBE_OFFSET_WIZARD_XY_POS; + current_position = wizard_pos; + ui.wait_for_move = true; + line_to_current_position(MMM_TO_MMS(HOMING_FEEDRATE_XY)); // Could invoke idle() + ui.wait_for_move = false; + ui.synchronize(); + prepare_for_calibration(); + probe.offset.z = PROBE_OFFSET_START; + ui.goto_screen(probe_offset_wizard_menu); + ui.defer_status_screen(); + } - set_all_unhomed(); +#endif + +void home_and_goto_probe_offset_wizard() { queue.inject_P(G28_STR); - ui.goto_screen([]{ _lcd_draw_homing(); - if (all_axes_homed()) { - ui.goto_screen(probe_offset_wizard_menu); - ui.defer_status_screen(); - } + if (all_axes_homed()) + ui.goto_screen(TERN(HAS_PROBE_OFFSET_WIZARD_XY_POS, goto_probe_offset_wizard, probe_offset_wizard_menu)); }); } From 172cc0dd03c796e08651e8df755e0fad2a3f3856 Mon Sep 17 00:00:00 2001 From: Thomas Niccolo Reyes Date: Wed, 18 Nov 2020 12:30:32 +0800 Subject: [PATCH 0592/1370] Open File Browser on Media Insert (option) (#20151) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 2 ++ Marlin/src/feature/password/password.h | 2 +- Marlin/src/gcode/gcode.h | 8 ++------ Marlin/src/lcd/marlinui.cpp | 11 ++++++++++- Marlin/src/lcd/marlinui.h | 1 + Marlin/src/lcd/menu/menu_item.h | 1 + Marlin/src/lcd/menu/menu_main.cpp | 4 ++-- Marlin/src/lcd/menu/menu_media.cpp | 4 +++- Marlin/src/lcd/menu/menu_password.cpp | 8 +++----- 9 files changed, 25 insertions(+), 16 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0951dfaa6d..fa7323a666 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1193,6 +1193,8 @@ //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files + //#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted + #define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27") #if ENABLED(PRINTER_EVENT_LEDS) diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h index 97c3174557..1382d6df40 100644 --- a/Marlin/src/feature/password/password.h +++ b/Marlin/src/feature/password/password.h @@ -47,7 +47,7 @@ public: static void start_over(); static void digit_entered(); - static void set_password_done(); + static void set_password_done(const bool with_set=true); static void menu_password_report(); static void remove_password(); diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index ddd48a389d..3fbb88829e 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -769,12 +769,8 @@ private: #if ENABLED(PASSWORD_FEATURE) static void M510(); - #if ENABLED(PASSWORD_UNLOCK_GCODE) - static void M511(); - #endif - #if ENABLED(PASSWORD_CHANGE_GCODE) - static void M512(); - #endif + TERN_(PASSWORD_UNLOCK_GCODE, static void M511()); + TERN_(PASSWORD_CHANGE_GCODE, static void M512()); #endif TERN_(SDSUPPORT, static void M524()); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 13c85be787..9d0ebe27e4 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -30,6 +30,10 @@ #include "../feature/host_actions.h" #endif +#if ENABLED(BROWSE_MEDIA_ON_INSERT, PASSWORD_ON_SD_PRINT_MENU) + #include "../feature/password/password.h" +#endif + // All displays share the MarlinUI class #include "marlinui.h" MarlinUI ui; @@ -1620,7 +1624,12 @@ void MarlinUI::update() { if (status) { if (old_status < 2) { TERN_(EXTENSIBLE_UI, ExtUI::onMediaInserted()); // ExtUI response - set_status_P(GET_TEXT(MSG_MEDIA_INSERTED)); + #if ENABLED(BROWSE_MEDIA_ON_INSERT) + quick_feedback(); + goto_screen(MEDIA_MENU_GATEWAY); + #else + set_status_P(GET_TEXT(MSG_MEDIA_INSERTED)); + #endif } } else { diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 6ce59132bf..3311f55ed5 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -322,6 +322,7 @@ public: #endif #if ENABLED(SDSUPPORT) + #define MEDIA_MENU_GATEWAY TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media) static void media_changed(const uint8_t old_stat, const uint8_t stat); #endif diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 3ebe38235d..6430021223 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -354,6 +354,7 @@ class MenuItem_bool : public MenuEditItemBase { #define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) #define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) +#define BACK_ITEM_P(PLABEL) MENU_ITEM_P(back, PLABEL) #define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) #define ACTION_ITEM_N_S_P(N, S, PLABEL, ACTION) MENU_ITEM_N_S_P(function, N, S, PLABEL, ACTION) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 992303b791..bb65ce61e2 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -141,7 +141,7 @@ void menu_main() { if (card_detected) { if (!card_open) { - SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); + SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY); #if PIN_EXISTS(SD_DETECT) GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); #else @@ -248,7 +248,7 @@ void menu_main() { #else GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); #endif - SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); + SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY); } } else { diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index 93ecc49d98..59cb2baa23 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -104,6 +104,8 @@ class MenuItem_sdfolder : public MenuItem_sdbase { } }; +extern uint8_t screen_history_depth; + void menu_media() { ui.encoder_direction_menus(); @@ -115,7 +117,7 @@ void menu_media() { #endif START_MENU(); - BACK_ITEM(MSG_MAIN); + BACK_ITEM_P(TERN1(BROWSE_MEDIA_ON_INSERT, screen_history_depth) ? GET_TEXT(MSG_MAIN) : GET_TEXT(MSG_BACK)); if (card.flag.workDirIsRoot) { #if !PIN_EXISTS(SD_DETECT) ACTION_ITEM(MSG_REFRESH, []{ encoderTopLine = 0; card.mount(); }); diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp index c3924b5686..c58931cf2e 100644 --- a/Marlin/src/lcd/menu/menu_password.cpp +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -152,19 +152,17 @@ void Password::menu_password_report() { END_SCREEN(); } -void Password::set_password_done() { - is_set = true; +void Password::set_password_done(const bool with_set/*=true*/) { + is_set = with_set; value = value_entry; ui.completion_feedback(true); ui.goto_screen(menu_password_report); } void Password::remove_password() { - is_set = false; string[0] = '0'; string[1] = '\0'; - ui.completion_feedback(true); - ui.goto_screen(menu_password_report); + set_password_done(false); } // From 292e83466e356ae4a21bd5c85745535d50e332f6 Mon Sep 17 00:00:00 2001 From: Foxies Date: Wed, 18 Nov 2020 05:32:34 +0100 Subject: [PATCH 0593/1370] FLSun Hispeedv1 Board update (#19959) Co-authored-by: Scott Lahteine --- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 188 +++++++++---------- 1 file changed, 86 insertions(+), 102 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index a056aa96e5..05b8b19a8a 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -50,15 +50,16 @@ // #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif +// // SPI // Note: FLSun Hispeed (clone MKS_Robin_miniV2) board is using SPI2 interface. // -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // SPI Flash #define HAS_SPI_FLASH 1 @@ -108,49 +109,26 @@ #define E0_STEP_PIN PD6 // E0_STEP #define E0_DIR_PIN PD3 // E0_DIR +/** + * FLSUN Hi-Speed has no hard-wired UART pins for TMC drivers. + * Several wiring options are provided below, defaulting to + * to the most compatible. + */ + // // Drivers // #if HAS_TMC220x - - #if ENABLED(HARDWARE_SERIAL) /* TMC2209 */ - #define X_SLAVE_ADDRESS 3 // | | : - #define Y_SLAVE_ADDRESS 2 // : | : - #define Z_SLAVE_ADDRESS 1 // | : : - //#define E0_SLAVE_ADDRESS 0 // : : : - - #define X_SERIAL_TX_PIN PA9 // TXD1 - #define X_SERIAL_RX_PIN PA9 // TXD1 - - #define Y_SERIAL_TX_PIN PA9 // TXD1 - #define Y_SERIAL_RX_PIN PA9 // TXD1 - - #define Z_SERIAL_TX_PIN PA9 // TXD1 - #define Z_SERIAL_RX_PIN PA9 // TXD1 - - #elif ENABLED(SOFTWARE_SERIAL) /* TMC220x */ - /** - * TMC2208 stepper UART-configurable by PDN_UART pin - * Software serial - */ - #define X_SLAVE_ADDRESS 0 - #define Y_SLAVE_ADDRESS 0 - #define Z_SLAVE_ADDRESS 0 - - #define X_SERIAL_TX_PIN PA10 // RXD1 - #define X_SERIAL_RX_PIN PA10 // RXD1 - - #define Y_SERIAL_TX_PIN PA9 // TXD1 - #define Y_SERIAL_RX_PIN PA9 // TXD1 - - #define Z_SERIAL_TX_PIN PC7 // IO1 - #define Z_SERIAL_RX_PIN PC7 // IO1 - - #endif - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + // SoftwareSerial with one pin per driver + // Compatible with TMC2208 and TMC2209 drivers + #define X_SERIAL_TX_PIN PA10 // RXD1 + #define X_SERIAL_RX_PIN PA10 // RXD1 + #define Y_SERIAL_TX_PIN PA9 // TXD1 + #define Y_SERIAL_RX_PIN PA9 // TXD1 + #define Z_SERIAL_TX_PIN PC7 // IO1 + #define Z_SERIAL_RX_PIN PC7 // IO1 + #define TMC_BAUD_RATE 19200 #else - // Motor current PWM pins #define MOTOR_CURRENT_PWM_XY_PIN PA6 // VREF2/3 CONTROL XY #define MOTOR_CURRENT_PWM_Z_PIN PA7 // VREF4 CONTROL Z @@ -159,33 +137,33 @@ #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } #endif - /** - * src: MKS Robin_Mini V2 - * __ESP(M1)__ -J1- - * GND| 15 | | 08 |+3v3 (22)=>RXD1(PA10) // - * | 16 | | 07 |MOSI (21)=>TXD1(PA9) // active low, probably OK to leave floating - * IO2| 17 | | 06 |MISO (19)=>IO1(PC7) // Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) - * IO0| 18 | | 05 |CLK (18)=>IO0(PA8) // must be high (ESP3D software configures this with a pullup so OK to leave as floating) - * IO1| 19 | | 03 |EN (03)=>WIFI_EN() // Must be high for module to run - * | nc | | nc | (01)=>WIFI_CTRL(PA5) - * RX| 21 | | nc | - * TX| 22 | | 01 |RST - *  ̄ ̄ AE ̄ ̄ - * - */ - #ifdef ESP_WIFI - #define WIFI_IO0_PIN PA8 // PC13 MKS ESP WIFI IO0 PIN - #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN - #define WIFI_RESET_PIN PA5 // MKS ESP WIFI RESET PIN - #endif +/** + * MKS Robin_Wifi or another ESP8266 module + * + * __ESP(M1)__ -J1- + * GND| 15 | | 08 |+3v3 (22) RXD1 (PA10) + * | 16 | | 07 |MOSI (21) TXD1 (PA9) Active LOW, probably OK to leave floating + * IO2| 17 | | 06 |MISO (19) IO1 (PC7) Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) + * IO0| 18 | | 05 |CLK (18) IO0 (PA8) Must be HIGH (ESP3D software configures this with a pullup so OK to leave as floating) + * IO1| 19 | | 03 |EN (03) WIFI_EN Must be HIGH for module to run + * | nc | | nc | (01) WIFI_CTRL (PA5) + * RX| 21 | | nc | + * TX| 22 | | 01 |RST + *  ̄ ̄ AE ̄ ̄ + */ + // Module ESP-WIFI + #define ESP_WIFI_MODULE_COM 2 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this + #define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT & SERIAL_PORT_2 + #define ESP_WIFI_MODULE_RESET_PIN PA5 // WIFI CTRL/RST + #define ESP_WIFI_MODULE_ENABLE_PIN -1 + #define ESP_WIFI_MODULE_TXD_PIN PA9 // MKS or ESP WIFI RX PIN + #define ESP_WIFI_MODULE_RXD_PIN PA10 // MKS or ESP WIFI TX PIN #endif // // EXTRUDER // -#if AXIS_DRIVER_TYPE(E0,TMC2208)||AXIS_DRIVER_TYPE(E0,TMC2209) - #define E0_SLAVE_ADDRESS 0 - +#if AXIS_DRIVER_TYPE_E0(TMC2208) || AXIS_DRIVER_TYPE_E0(TMC2209) #define E0_SERIAL_TX_PIN PA8 // IO0 #define E0_SERIAL_RX_PIN PA8 // IO0 #define TMC_BAUD_RATE 19200 @@ -199,7 +177,7 @@ #endif // -// Temperature Sensors(THM) +// Temperature Sensors (THM) // #define TEMP_0_PIN PC1 // TEMP_E0 #define TEMP_BED_PIN PC0 // TEMP_BED @@ -211,7 +189,6 @@ #define HEATER_BED_PIN PA0 // HEATER_BED-WKUP #define FAN_PIN PB1 // E_FAN -//#define CONTROLLER_FAN_PIN PD6 // BOARD FAN // // Misc. Functions @@ -221,12 +198,24 @@ #define POWER_LOSS_PIN PA2 // PW_DET (UPS) MKSPWC #endif +/** + * Connector J2 + * ------- + * DIO O|1 2|O 3v3 + * CSK O|3 5|O GND + * RST O|5 6|O GND + * ------- + */ +//#define SW_DIO PA13 +//#define SW_CLK PA14 +//#define SW_RST NRST // (14) + // // Power Supply Control // #if ENABLED(PSU_CONTROL) #define KILL_PIN PA2 // PW_DET - #define KILL_PIN_INVERTING true // + #define KILL_PIN_INVERTING true //#define PS_ON_PIN PA3 // PW_CN /PW_OFF #endif @@ -240,28 +229,33 @@ //#define LED_PIN PB2 // BOOT1 #if ENABLED(NEOPIXEL_LED) - #define LED_PWM PA8 + #define LED_PWM PC7 // IO1 #ifndef NEOPIXEL_PIN - #define NEOPIXEL_PIN LED_PWM // USED WIFI IO0/IO1/TX/RX PIN + #define NEOPIXEL_PIN LED_PWM // USED WIFI IO0/IO1 PIN #endif #endif -//Others test. -//#define SERVO0_PIN PA5 // WIFI CRTL -//#define GPIO_CLEAR PA8 // IO0 -//#define GPIO_SET PA5 - // // SD Card // -#define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz /* 18 MHz (18000000) or 4.5MHz (450000) */ -//#define SDIO_CLOCK 18000000 // 18 MHz (18000000) -#if ENABLED(SDIO_SUPPORT) - #define SCK_PIN PB13 // SPI2 - #define MISO_PIN PB14 // SPI2 - #define MOSI_PIN PB15 // SPI2 - #define SD_DETECT_PIN PD12 // SD_CD +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +// Use the on-board card socket labeled SD_Extender +#if SD_CONNECTION_IS(CUSTOM_CABLE) + #define SCK_PIN PC12 + #define MISO_PIN PC8 + #define MOSI_PIN PD2 + #define SS_PIN -1 + #define SD_DETECT_PIN PD12 // SD_CD (if -1 no detection) +#else + #define SDIO_SUPPORT + #define SDIO_CLOCK 4500000 // 4.5 MHz + #define SDIO_READ_RETRIES 16 + #define ONBOARD_SPI_DEVICE 1 // SPI1 + #define ONBOARD_SD_CS_PIN PC11 + #define SD_DETECT_PIN -1 // SD_CD (-1 active refresh) #endif // @@ -271,6 +265,10 @@ #define BEEPER_PIN PC5 #endif +#if ENABLED(SPEAKER) && BEEPER_PIN == PC5 + #error "FLSun HiSpeed default BEEPER_PIN is not a SPEAKER." +#endif + /** * Note: MKS Robin TFT screens use various TFT controllers * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) @@ -284,26 +282,7 @@ * because Marlin uses the reset as a failsafe to revive a glitchy LCD. */ -// MKS Robin TFT v2.0 with ILI9341 -// Read display identification information (0xD3 on ILI9341) -//#define TOUCH_CALIBRATION_X 12013 -//#define TOUCH_CALIBRATION_Y -8711 -//#define TOUCH_OFFSET_X -32 -//#define TOUCH_OFFSET_Y 256 - -// MKS Robin TFT v1.1 with ILI9328 -//#define TOUCH_CALIBRATION_X -11792 -//#define TOUCH_CALIBRATION_Y 8947 -//#define TOUCH_OFFSET_X 342 -//#define TOUCH_OFFSET_Y -19 - -// MKS Robin TFT v1.1 with R61505 -//#define TOUCH_CALIBRATION_X 12489 -//#define TOUCH_CALIBRATION_Y 9210 -//#define TOUCH_OFFSET_X -52 -//#define TOUCH_OFFSET_Y -17 - -// QQS-Pro uses MKS Robin TFT v2.0 +// QQS-Pro uses MKS Robin TFT v2.0 320x240 // Shared FSMC Configs #if HAS_FSMC_TFT @@ -320,8 +299,13 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 + #define TFT_BUFFER_SIZE 14400 + #if ENABLED(TFT_CLASSIC_UI) + #define TFT_MARLINBG_COLOR 0x3186 // White + #define TFT_MARLINUI_COLOR 0xC7B6 // green + #define TFT_BTARROWS_COLOR 0xDEE6 // Yellow + #define TFT_BTOKMENU_COLOR 0x145F // Cyan + #endif #endif #if NEED_TOUCH_PINS From ccac37613b6f541bc93ee62acb3b1c2022db3bcb Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 18 Nov 2020 02:48:14 -0300 Subject: [PATCH 0594/1370] Improve USB Media Host conditions (#20176) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h | 4 ++++ Marlin/src/HAL/LPC1768/main.cpp | 4 ++-- .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 2 +- Marlin/src/HAL/STM32/inc/Conditionals_adv.h | 4 ++++ Marlin/src/HAL/STM32F1/HAL.cpp | 24 +++++++++---------- Marlin/src/HAL/STM32F1/HAL.h | 4 ++-- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 5 ---- Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h | 8 +++++++ Marlin/src/HAL/STM32F1/msc_sd.cpp | 4 ++-- Marlin/src/HAL/STM32F1/onboard_sd.cpp | 9 +++---- Marlin/src/inc/Conditionals_post.h | 4 +--- 11 files changed, 40 insertions(+), 32 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h index 5f1c4b1601..8e7cab185f 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if DISABLED(NO_SD_HOST_DRIVE) + #define HAS_SD_HOST_DRIVE 1 +#endif diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index 0b4045cb99..645d6942eb 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -122,7 +122,7 @@ void HAL_init() { delay(1000); // Give OS time to notice USB_Connect(TRUE); - #if DISABLED(NO_SD_HOST_DRIVE) + #if HAS_SD_HOST_DRIVE MSC_SD_Init(0); // Enable USB SD card access #endif @@ -140,7 +140,7 @@ void HAL_init() { // HAL idle task void HAL_idletask() { - #if HAS_SHARED_MEDIA + #if HAS_SD_HOST_DRIVE // If Marlin is using the SD card we need to lock it to prevent access from // a PC via USB. // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index 6e73e87c21..9c2666ed26 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -31,7 +31,7 @@ #error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported" #endif -#ifdef USBD_USE_CDC_COMPOSITE +#if HAS_SD_HOST_DRIVE // use USB drivers diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h index 5f1c4b1601..e07c0d9cda 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if defined(USBD_USE_CDC_COMPOSITE) && DISABLED(NO_SD_HOST_DRIVE) + #define HAS_SD_HOST_DRIVE 1 +#endif diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 6733aead6d..e6ac87b0eb 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -82,7 +82,7 @@ // Public Variables // ------------------------ -#if (defined(SERIAL_USB) && !defined(USE_USB_COMPOSITE)) +#if defined(SERIAL_USB) && !HAS_SD_HOST_DRIVE USBSerial SerialUSB; #endif @@ -251,7 +251,7 @@ void HAL_init() { #if PIN_EXISTS(LED) OUT_WRITE(LED_PIN, LOW); #endif - #ifdef USE_USB_COMPOSITE + #if HAS_SD_HOST_DRIVE MSC_SD_init(); #endif #if PIN_EXISTS(USB_CONNECT) @@ -263,17 +263,15 @@ void HAL_init() { // HAL idle task void HAL_idletask() { - #ifdef USE_USB_COMPOSITE - #if HAS_SHARED_MEDIA - // If Marlin is using the SD card we need to lock it to prevent access from - // a PC via USB. - // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but - // this will not reliably detect delete operations. To be safe we will lock - // the disk if Marlin has it mounted. Unfortunately there is currently no way - // to unmount the disk from the LCD menu. - // if (IS_SD_PRINTING() || IS_SD_FILE_OPEN()) - /* copy from lpc1768 framework, should be fixed later for process HAS_SHARED_MEDIA*/ - #endif + #if HAS_SD_HOST_DRIVE + // If Marlin is using the SD card we need to lock it to prevent access from + // a PC via USB. + // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but + // this will not reliably detect delete operations. To be safe we will lock + // the disk if Marlin has it mounted. Unfortunately there is currently no way + // to unmount the disk from the LCD menu. + // if (IS_SD_PRINTING() || IS_SD_FILE_OPEN()) + /* copy from lpc1768 framework, should be fixed later for process HAS_SD_HOST_DRIVE*/ // process USB mass storage device class loop MarlinMSC.loop(); #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index b77539d7b6..2880865dbb 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -42,7 +42,7 @@ #include "../../inc/MarlinConfigPre.h" -#ifdef USE_USB_COMPOSITE +#if HAS_SD_HOST_DRIVE #include "msc_sd.h" #endif @@ -61,7 +61,7 @@ #endif #ifdef SERIAL_USB - #ifndef USE_USB_COMPOSITE + #if !HAS_SD_HOST_DRIVE #define UsbSerial Serial #else #define UsbSerial MarlinCompositeSerial diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index f52e6fec2b..5f1c4b1601 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -20,8 +20,3 @@ * */ #pragma once - -#if ENABLED(USE_USB_COMPOSITE) - //#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE." - #undef SD_CHECK_AND_RETRY -#endif diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h index 5f1c4b1601..0fe7924765 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h @@ -20,3 +20,11 @@ * */ #pragma once + +#ifdef USE_USB_COMPOSITE + //#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE." + #undef SD_CHECK_AND_RETRY + #if DISABLED(NO_SD_HOST_DRIVE) + #define HAS_SD_HOST_DRIVE 1 + #endif +#endif diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index 4f44f2ee90..44242358ee 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -13,7 +13,7 @@ * along with this program. If not, see . * */ -#if defined(__STM32F1__) && defined(USE_USB_COMPOSITE) +#if defined(__STM32F1__) && HAS_SD_HOST_DRIVE #include "msc_sd.h" #include "SPI.h" @@ -77,4 +77,4 @@ void MSC_SD_init() { #endif } -#endif // __STM32F1__ && USE_USB_COMPOSITE +#endif // __STM32F1__ && HAS_SD_HOST_DRIVE diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.cpp b/Marlin/src/HAL/STM32F1/onboard_sd.cpp index 9c2b128ddc..6092aea320 100644 --- a/Marlin/src/HAL/STM32F1/onboard_sd.cpp +++ b/Marlin/src/HAL/STM32F1/onboard_sd.cpp @@ -21,10 +21,11 @@ #include "SPI.h" #include "fastio.h" -#if HAS_SHARED_MEDIA - #ifndef ONBOARD_SPI_DEVICE - #define ONBOARD_SPI_DEVICE SPI_DEVICE - #endif +#ifndef ONBOARD_SPI_DEVICE + #define ONBOARD_SPI_DEVICE SPI_DEVICE +#endif + +#if HAS_SD_HOST_DRIVE #define ONBOARD_SD_SPI SPI #else SPIClass OnboardSPI(ONBOARD_SPI_DEVICE); diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index acb5cc2351..cae7544fa3 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -360,14 +360,13 @@ */ #if ENABLED(SDSUPPORT) - #if SD_CONNECTION_IS(ONBOARD) && DISABLED(NO_SD_HOST_DRIVE) && !defined(ARDUINO_GRAND_CENTRAL_M4) + #if HAS_SD_HOST_DRIVE && SD_CONNECTION_IS(ONBOARD) // // The external SD card is not used. Hardware SPI is used to access the card. // When sharing the SD card with a PC we want the menu options to // mount/unmount the card and refresh it. So we disable card detect. // #undef SD_DETECT_PIN - #define HAS_SHARED_MEDIA 1 #endif #if PIN_EXISTS(SD_DETECT) @@ -381,7 +380,6 @@ #define SD_DETECT_STATE LOW #endif #endif - #endif #if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) From 125ad2003d141778100ebb26f9785488af9546b6 Mon Sep 17 00:00:00 2001 From: Thomas Niccolo Reyes Date: Wed, 18 Nov 2020 13:49:56 +0800 Subject: [PATCH 0595/1370] Remaining Time for Prusa-style LCD layout (#20148) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 72 +++++++++++---------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 81862e1ddf..b85d5adf2a 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -707,6 +707,35 @@ void MarlinUI::draw_status_message(const bool blink) { * |01234567890123456789| */ +inline uint8_t draw_elapsed_or_remaining_time(uint8_t timepos) { + char buffer[14]; + + #if ENABLED(SHOW_REMAINING_TIME) + const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE); + if (show_remain) { + #if ENABLED(USE_M73_REMAINING_TIME) + duration_t remaining = get_remaining_time(); + #else + uint8_t progress = get_progress_percent(); + uint32_t elapsed = print_job_timer.duration(); + duration_t remaining = (progress > 0) ? ((elapsed * 25600 / progress) >> 8) - elapsed : 0; + #endif + timepos -= remaining.toDigital(buffer); + lcd_put_wchar(timepos, 2, 'R'); + } + #else + constexpr bool show_remain = false; + #endif + + if (!show_remain) { + duration_t elapsed = print_job_timer.duration(); + timepos -= elapsed.toDigital(buffer); + lcd_put_wchar(timepos, 2, LCD_STR_CLOCK[0]); + } + lcd_put_u8str(buffer); + return timepos; +} + void MarlinUI::draw_status_screen() { const bool blink = get_blink(); @@ -845,33 +874,7 @@ void MarlinUI::draw_status_screen() { lcd_put_u8str(i16tostr3rj(feedrate_percentage)); lcd_put_wchar('%'); - char buffer[14]; - uint8_t timepos = 0; - #if ENABLED(SHOW_REMAINING_TIME) - const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE); - if (show_remain) { - #if ENABLED(USE_M73_REMAINING_TIME) - duration_t remaining = get_remaining_time(); - #else - uint8_t progress = get_progress_percent(); - uint32_t elapsed = print_job_timer.duration(); - duration_t remaining = (progress > 0) ? ((elapsed * 25600 / progress) >> 8) - elapsed : 0; - #endif - const uint8_t len = remaining.toDigital(buffer); - timepos = LCD_WIDTH - 1 - len; - lcd_put_wchar(timepos, 2, 'R'); - } - #else - constexpr bool show_remain = false; - #endif - - if (!show_remain) { - duration_t elapsed = print_job_timer.duration(); - const uint8_t len = elapsed.toDigital(buffer); - timepos = LCD_WIDTH - 1 - len; - lcd_put_wchar(timepos, 2, LCD_STR_CLOCK[0]); - } - lcd_put_u8str(buffer); + const uint8_t timepos = draw_elapsed_or_remaining_time(LCD_WIDTH - 1); #if LCD_WIDTH >= 20 lcd_moveto(timepos - 7, 2); @@ -955,7 +958,7 @@ void MarlinUI::draw_status_screen() { #elif HAS_MULTI_HOTEND && HAS_HEATED_BED _draw_bed_status(blink); #elif HAS_PRINT_PROGRESS - #define DREW_PRINT_PROGRESS + #define DREW_PRINT_PROGRESS 1 _draw_print_progress(); #endif @@ -963,14 +966,15 @@ void MarlinUI::draw_status_screen() { // Elapsed Time or SD Percent // lcd_moveto(LCD_WIDTH - 9, 2); - #if HAS_PRINT_PROGRESS && !defined(DREW_PRINT_PROGRESS) + + #if HAS_PRINT_PROGRESS && !DREW_PRINT_PROGRESS + _draw_print_progress(); + #else - duration_t elapsed = print_job_timer.duration(); - char buffer[14]; - (void)elapsed.toDigital(buffer); - lcd_put_wchar(LCD_STR_CLOCK[0]); - lcd_put_u8str(buffer); + + (void)draw_elapsed_or_remaining_time(LCD_WIDTH - 4); + #endif #endif // LCD_INFO_SCREEN_STYLE 1 From ef51bd16dc8e4b28ea048b333e6de65d506cc273 Mon Sep 17 00:00:00 2001 From: Philippe Cayrol <58492957+phcay@users.noreply.github.com> Date: Wed, 18 Nov 2020 06:56:51 +0100 Subject: [PATCH 0596/1370] Better edit range for Linear Advance K (#20155) --- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 8 ++++---- Marlin/src/lcd/menu/menu_tune.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index ac8e6ebf88..1583db41e9 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -626,7 +626,7 @@ namespace ExtUI { void setLinearAdvance_mm_mm_s(const float value, const extruder_t extruder) { if (extruder < EXTRUDERS) - planner.extruder_advance_K[extruder - E0] = constrain(value, 0, 999); + planner.extruder_advance_K[extruder - E0] = constrain(value, 0, 10); } #endif diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 12f9d57b46..268573beb0 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -110,10 +110,10 @@ void menu_backlash(); #if ENABLED(LIN_ADVANCE) #if EXTRUDERS == 1 - EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10); #elif HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); + EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 10); #endif #endif @@ -587,10 +587,10 @@ void menu_advanced_settings() { SUBMENU(MSG_FILAMENT, menu_advanced_filament); #elif ENABLED(LIN_ADVANCE) #if EXTRUDERS == 1 - EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10); #elif HAS_MULTI_EXTRUDER LOOP_L_N(n, E_STEPPERS) - EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); + EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 10); #endif #endif diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 041786794e..87168ba1e7 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -202,10 +202,10 @@ void menu_tune() { // #if ENABLED(LIN_ADVANCE) && DISABLED(SLIM_LCD_MENUS) #if EXTRUDERS == 1 - EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10); #elif HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); + EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 10); #endif #endif From 5f9ccb361aaa74de15d4408b154f2d6511877444 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 17 Nov 2020 21:59:48 -0800 Subject: [PATCH 0597/1370] Use MANUAL_PROBE_START_Z for UBL manual probing (#20160) --- Marlin/src/feature/bedlevel/ubl/ubl.h | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 6 +++--- Marlin/src/inc/Conditionals_post.h | 4 ++++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 22ca1f69ec..c90b1f7ac1 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -62,7 +62,7 @@ class unified_bed_leveling { #if IS_NEWPANEL static void move_z_with_encoder(const float &multiplier); static float measure_point_with_encoder(); - static float measure_business_card_thickness(float in_height); + static float measure_business_card_thickness(); static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; #endif diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index ea2e62dd51..e8524da368 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -484,7 +484,7 @@ } if (parser.seen('B')) { - g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(float(Z_CLEARANCE_BETWEEN_PROBES)); + g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); if (ABS(g29_card_thickness) > 1.5f) { SERIAL_ECHOLNPGM("?Error in Business Card measurement."); return; @@ -837,11 +837,11 @@ static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } - float unified_bed_leveling::measure_business_card_thickness(float in_height) { + float unified_bed_leveling::measure_business_card_thickness() { ui.capture(); save_ubl_active_state_and_disable(); // Disable bed level correction for probing - do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), in_height); + do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), MANUAL_PROBE_START_Z); //, _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f); planner.synchronize(); diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index cae7544fa3..99a40b016a 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2603,6 +2603,10 @@ #endif #endif +#if !defined(MANUAL_PROBE_START_Z) && defined(Z_CLEARANCE_BETWEEN_PROBES) + #define MANUAL_PROBE_START_Z Z_CLEARANCE_BETWEEN_PROBES +#endif + #ifndef __SAM3X8E__ //todo: hal: broken hal encapsulation #undef UI_VOLTAGE_LEVEL #undef RADDS_DISPLAY From b6d2671260aed4cb52d57d8dddf24e487c6bcdee Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 18 Nov 2020 00:13:17 -0600 Subject: [PATCH 0598/1370] USB Media Host followup Restore HAS_SHARED_MEDIA --- Marlin/src/HAL/LPC1768/main.cpp | 5 +++-- Marlin/src/HAL/STM32F1/HAL.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index 645d6942eb..085b8ce04b 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -35,10 +35,11 @@ extern "C" { #include } -#include "../../sd/cardreader.h" #include "../../inc/MarlinConfig.h" #include "../../core/millis_t.h" +#include "../../sd/cardreader.h" + extern uint32_t MSC_SD_Init(uint8_t pdrv); extern "C" int isLPC1769(); extern "C" void disk_timerproc(); @@ -140,7 +141,7 @@ void HAL_init() { // HAL idle task void HAL_idletask() { - #if HAS_SD_HOST_DRIVE + #if HAS_SHARED_MEDIA // If Marlin is using the SD card we need to lock it to prevent access from // a PC via USB. // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index e6ac87b0eb..dfa99d83f4 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -263,7 +263,7 @@ void HAL_init() { // HAL idle task void HAL_idletask() { - #if HAS_SD_HOST_DRIVE + #if HAS_SHARED_MEDIA // If Marlin is using the SD card we need to lock it to prevent access from // a PC via USB. // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 99a40b016a..994d83ffb3 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -367,6 +367,7 @@ // mount/unmount the card and refresh it. So we disable card detect. // #undef SD_DETECT_PIN + #define HAS_SHARED_MEDIA 1 #endif #if PIN_EXISTS(SD_DETECT) From bd38e59479c17d3e7c385d9c32c62303ab74c6cc Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 18 Nov 2020 08:27:21 +0100 Subject: [PATCH 0599/1370] SMUFF (MMU2 clone) support (#19912) --- Marlin/Configuration.h | 32 +- Marlin/Configuration_adv.h | 60 +- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 4 +- Marlin/src/MarlinCore.cpp | 21 +- Marlin/src/feature/{snmm.cpp => mmu/mmu.cpp} | 4 +- Marlin/src/feature/{snmm.h => mmu/mmu.h} | 0 .../mmu2-serial-protocol.md} | 0 Marlin/src/feature/{mmu2 => mmu}/mmu2.cpp | 512 +++++++++--------- Marlin/src/feature/{mmu2 => mmu}/mmu2.h | 22 +- Marlin/src/gcode/config/M220.cpp | 4 +- Marlin/src/gcode/control/T.cpp | 8 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 16 +- Marlin/src/gcode/feature/prusa_MMU2/M403.cpp | 6 +- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 +- Marlin/src/gcode/parser.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 42 +- Marlin/src/inc/SanityCheck.h | 144 ++--- Marlin/src/lcd/menu/menu_main.cpp | 2 +- Marlin/src/lcd/menu/menu_mmu2.cpp | 34 +- Marlin/src/module/settings.cpp | 243 ++++----- Marlin/src/module/stepper/indirection.h | 7 +- Marlin/src/module/tool_change.cpp | 16 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 4 +- Marlin/src/pins/pins.h | 7 +- Marlin/src/pins/pins_postprocess.h | 10 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 4 +- buildroot/tests/mega2560-tests | 18 +- platformio.ini | 10 +- 29 files changed, 622 insertions(+), 616 deletions(-) rename Marlin/src/feature/{snmm.cpp => mmu/mmu.cpp} (95%) rename Marlin/src/feature/{snmm.h => mmu/mmu.h} (100%) rename Marlin/src/feature/{mmu2/serial-protocol.md => mmu/mmu2-serial-protocol.md} (100%) rename Marlin/src/feature/{mmu2 => mmu}/mmu2.cpp (75%) rename Marlin/src/feature/{mmu2 => mmu}/mmu2.h (84%) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index be512e371c..4521895fdc 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -158,33 +158,19 @@ #endif /** - * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * Multi-Material Unit + * Set to one of these predefined models: * - * This device allows one stepper driver on a control board to drive - * two to eight stepper motors, one at a time, in a manner suitable - * for extruders. - * - * This option only allows the multiplexer to switch on tool-change. - * Additional options to configure custom E moves are pending. - */ -//#define MK2_MULTIPLEXER -#if ENABLED(MK2_MULTIPLEXER) - // Override the default DIO selector pins here, if needed. - // Some pins files may provide defaults for these pins. - //#define E_MUX0_PIN 40 // Always Required - //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs - //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs -#endif - -/** - * Průša Multi-Material Unit v2 + * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) + * PRUSA_MMU2 : Průša MMU2 + * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) + * SMUFF_EMU_MMU2 : Technik Gegg SMUFF (Průša MMU2 emulation mode) + * SMUFF_EMU_MMU2S : Technik Gegg SMUFF (Průša MMU2S emulation mode) * * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. - * Requires EXTRUDERS = 5 - * - * For additional configuration see Configuration_adv.h + * See additional options in Configuration_adv.h. */ -//#define PRUSA_MMU2 +//#define MMU_MODEL PRUSA_MMU2 // A dual extruder that uses a single stepper motor //#define SWITCHING_EXTRUDER diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fa7323a666..68d31ceaff 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3532,11 +3532,24 @@ #endif /** - * Průša Multi-Material Unit v2 + * Průša Multi-Material Unit (MMU) * Enable in Configuration.h + * + * These devices allow a single stepper driver on the board to drive + * multi-material feeders with any number of stepper motors. */ -#if ENABLED(PRUSA_MMU2) - +#if HAS_PRUSA_MMU1 + /** + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + * + * Override the default DIO selector pins here, if needed. + * Some pins files may provide defaults for these pins. + */ + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#elif HAS_PRUSA_MMU2 // Serial port used for communication with MMU2. // For AVR enable the UART port used for the MMU. (e.g., mmuSerial) // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) @@ -3554,7 +3567,7 @@ // Add an LCD menu for MMU2 //#define MMU2_MENUS - #if ENABLED(MMU2_MENUS) + #if EITHER(MMU2_MENUS, HAS_PRUSA_MMU2S) // Settings for filament load / unload from the LCD menu. // This is for Průša MK3-style extruders. Customize for your hardware. #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 @@ -3579,29 +3592,12 @@ { -50.0, 2000 } #endif - /** - * MMU Extruder Sensor - * - * Support for a Průša (or other) IR Sensor to detect filament near the extruder - * and make loading more reliable. Suitable for an extruder equipped with a filament - * sensor less than 38mm from the gears. - * - * During loading the extruder will stop when the sensor is triggered, then do a last - * move up to the gears. If no filament is detected, the MMU2 can make some more attempts. - * If all attempts fail, a filament runout will be triggered. - */ - //#define MMU_EXTRUDER_SENSOR - #if ENABLED(MMU_EXTRUDER_SENSOR) - #define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail - #endif - /** * Using a sensor like the MMU2S * This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S. * See https://help.prusa3d.com/en/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560, step 11 */ - //#define PRUSA_MMU2_S_MODE - #if ENABLED(PRUSA_MMU2_S_MODE) + #if HAS_PRUSA_MMU2S #define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries) #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min) @@ -3617,11 +3613,29 @@ #define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \ { -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE } + #else + + /** + * MMU1 Extruder Sensor + * + * Support for a Průša (or other) IR Sensor to detect filament near the extruder + * and make loading more reliable. Suitable for an extruder equipped with a filament + * sensor less than 38mm from the gears. + * + * During loading the extruder will stop when the sensor is triggered, then do a last + * move up to the gears. If no filament is detected, the MMU2 can make some more attempts. + * If all attempts fail, a filament runout will be triggered. + */ + //#define MMU_EXTRUDER_SENSOR + #if ENABLED(MMU_EXTRUDER_SENSOR) + #define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail + #endif + #endif //#define MMU2_DEBUG // Write debug info to serial output -#endif // PRUSA_MMU2 +#endif // HAS_PRUSA_MMU2 /** * Advanced Print Counter settings diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 8b7d27742d..21d149fcaf 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -97,8 +97,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #define IS_RX0(P) (P == P0_03) #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) #error "Serial port pins (0) conflict with Trinamic SPI pins!" - #elif ENABLED(MK2_MULTIPLEXER) && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN)) - #error "Serial port pins (0) conflict with MK2 multiplexer pins!" + #elif HAS_PRUSA_MMU1 && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN)) + #error "Serial port pins (0) conflict with Multi-Material-Unit multiplexer pins!" #elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN)) #error "Serial port pins (0) conflict with X/Y axis SPI pins!" #endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index acd1321af4..60765c9833 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -213,8 +213,8 @@ #include "feature/controllerfan.h" #endif -#if ENABLED(PRUSA_MMU2) - #include "feature/mmu2/mmu2.h" +#if HAS_PRUSA_MMU2 + #include "feature/mmu/mmu2.h" #endif #if HAS_L64XX @@ -713,9 +713,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { TERN_(HAS_FILAMENT_SENSOR, runout.run()); // Run HAL idle tasks - #ifdef HAL_IDLETASK - HAL_idletask(); - #endif + TERN_(HAL_IDLETASK, HAL_idletask()); // Check network connection TERN_(HAS_ETHERNET, ethernet.check()); @@ -772,7 +770,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { #endif // Update the Průša MMU2 - TERN_(PRUSA_MMU2, mmu2.mmu_loop()); + TERN_(HAS_PRUSA_MMU2, mmu2.mmu_loop()); // Handle Joystick jogging TERN_(POLL_JOG, joystick.inject_jog_moves()); @@ -780,9 +778,8 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { // Direct Stepping TERN_(DIRECT_STEPPING, page_manager.write_responses()); - #if HAS_TFT_LVGL_UI - LV_TASK_HANDLER(); - #endif + // Update the LVGL interface + TERN_(HAS_TFT_LVGL_UI, LV_TASK_HANDLER()); } /** @@ -1187,8 +1184,8 @@ void setup() { SETUP_RUN(caselight.update_brightness()); #endif - #if ENABLED(MK2_MULTIPLEXER) - SETUP_LOG("MK2_MULTIPLEXER"); + #if HAS_PRUSA_MMU1 + SETUP_LOG("Prusa MMU1"); SET_OUTPUT(E_MUX0_PIN); SET_OUTPUT(E_MUX1_PIN); SET_OUTPUT(E_MUX2_PIN); @@ -1268,7 +1265,7 @@ void setup() { SETUP_RUN(test_tmc_connection(true, true, true, true)); #endif - #if ENABLED(PRUSA_MMU2) + #if HAS_PRUSA_MMU2 SETUP_RUN(mmu2.init()); #endif diff --git a/Marlin/src/feature/snmm.cpp b/Marlin/src/feature/mmu/mmu.cpp similarity index 95% rename from Marlin/src/feature/snmm.cpp rename to Marlin/src/feature/mmu/mmu.cpp index 25723f7b38..2b48823ee7 100644 --- a/Marlin/src/feature/snmm.cpp +++ b/Marlin/src/feature/mmu/mmu.cpp @@ -22,7 +22,7 @@ #include "../inc/MarlinConfig.h" -#if ENABLED(MK2_MULTIPLEXER) +#if HAS_PRUSA_MMU1 #include "../module/stepper.h" @@ -35,4 +35,4 @@ void select_multiplexed_stepper(const uint8_t e) { safe_delay(100); } -#endif // MK2_MULTIPLEXER +#endif // HAS_PRUSA_MMU1 diff --git a/Marlin/src/feature/snmm.h b/Marlin/src/feature/mmu/mmu.h similarity index 100% rename from Marlin/src/feature/snmm.h rename to Marlin/src/feature/mmu/mmu.h diff --git a/Marlin/src/feature/mmu2/serial-protocol.md b/Marlin/src/feature/mmu/mmu2-serial-protocol.md similarity index 100% rename from Marlin/src/feature/mmu2/serial-protocol.md rename to Marlin/src/feature/mmu/mmu2-serial-protocol.md diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp similarity index 75% rename from Marlin/src/feature/mmu2/mmu2.cpp rename to Marlin/src/feature/mmu/mmu2.cpp index d76476e719..61adcfca72 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if ENABLED(PRUSA_MMU2) +#if HAS_PRUSA_MMU2 #include "mmu2.h" #include "../../lcd/menu/menu_mmu2.h" @@ -94,7 +94,7 @@ MMU2 mmu2; #define mmuSerial MMU2_SERIAL bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved; -#if ENABLED(PRUSA_MMU2_S_MODE) +#if HAS_PRUSA_MMU2S bool MMU2::mmu2s_triggered; #endif uint8_t MMU2::cmd, MMU2::cmd_arg, MMU2::last_cmd, MMU2::extruder; @@ -105,23 +105,19 @@ int16_t MMU2::version = -1, MMU2::buildnr = -1; millis_t MMU2::prev_request, MMU2::prev_P0_request; char MMU2::rx_buffer[MMU_RX_SIZE], MMU2::tx_buffer[MMU_TX_SIZE]; -#if BOTH(HAS_LCD_MENU, MMU2_MENUS) +struct E_Step { + float extrude; //!< extrude distance in mm + feedRate_t feedRate; //!< feed rate in mm/s +}; - struct E_Step { - float extrude; //!< extrude distance in mm - feedRate_t feedRate; //!< feed rate in mm/s - }; - - static constexpr E_Step - ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE } - , load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE } - #if ENABLED(PRUSA_MMU2_S_MODE) - , can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE } - , can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE } - #endif - ; - -#endif // MMU2_MENUS +static constexpr E_Step + ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE } + , load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE } + #if HAS_PRUSA_MMU2S + , can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE } + , can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE } + #endif +; MMU2::MMU2() { rx_buffer[0] = '\0'; @@ -162,7 +158,7 @@ uint8_t MMU2::get_current_tool() { return extruder == MMU2_NO_TOOL ? -1 : extruder; } -#if EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) +#if EITHER(HAS_PRUSA_MMU2S, MMU_EXTRUDER_SENSOR) #define FILAMENT_PRESENT() (READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE) #endif @@ -188,7 +184,7 @@ void MMU2::mmu_loop() { case -2: if (rx_ok()) { - sscanf(rx_buffer, "%uok\n", &version); + sscanf(rx_buffer, "%huok\n", &version); DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'"); @@ -199,7 +195,7 @@ void MMU2::mmu_loop() { case -3: if (rx_ok()) { - sscanf(rx_buffer, "%uok\n", &buildnr); + sscanf(rx_buffer, "%huok\n", &buildnr); DEBUG_ECHOLNPAIR("MMU => ", buildnr); @@ -242,7 +238,7 @@ void MMU2::mmu_loop() { enabled = true; state = 1; - TERN_(PRUSA_MMU2_S_MODE, mmu2s_triggered = false); + TERN_(HAS_PRUSA_MMU2S, mmu2s_triggered = false); } break; @@ -307,7 +303,7 @@ void MMU2::mmu_loop() { state = 2; // wait for response } - TERN_(PRUSA_MMU2_S_MODE, check_filament()); + TERN_(HAS_PRUSA_MMU2S, check_filament()); break; case 2: // response to command P0 @@ -324,7 +320,7 @@ void MMU2::mmu_loop() { else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s) state = 1; - TERN_(PRUSA_MMU2_S_MODE, check_filament()); + TERN_(HAS_PRUSA_MMU2S, check_filament()); break; case 3: // response to mmu commands @@ -340,9 +336,9 @@ void MMU2::mmu_loop() { #endif if (rx_ok()) { - // Response to C0 mmu command in PRUSA_MMU2_S_MODE + // Response to C0 mmu command in MMU2S model bool can_reset = true; - #if ENABLED(PRUSA_MMU2_S_MODE) + #if HAS_PRUSA_MMU2S if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) { can_reset = false; // MMU ok received but filament sensor not triggered, retrying... @@ -367,7 +363,7 @@ void MMU2::mmu_loop() { } state = 1; } - TERN_(PRUSA_MMU2_S_MODE, check_filament()); + TERN_(HAS_PRUSA_MMU2S, check_filament()); break; } } @@ -487,7 +483,7 @@ static void mmu2_not_responding() { BUZZ(100, 659); } -#if ENABLED(PRUSA_MMU2_S_MODE) +#if HAS_PRUSA_MMU2S bool MMU2::load_to_gears() { command(MMU_CMD_C0); @@ -541,33 +537,38 @@ static void mmu2_not_responding() { * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. */ void MMU2::tool_change(const char* special) { - - if (!enabled) return; - - #if ENABLED(MMU2_MENUS) + if (!enabled) return; set_runout_valid(false); switch (*special) { case '?': { - uint8_t index = mmu2_choose_filament(); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_filament_to_nozzle(index); + #if ENABLED(MMU2_MENUS) + const uint8_t index = mmu2_choose_filament(); + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + load_filament_to_nozzle(index); + #else + BUZZ(400, 40); + #endif } break; case 'x': { - planner.synchronize(); - uint8_t index = mmu2_choose_filament(); - DISABLE_AXIS_E0(); - command(MMU_CMD_T0 + index); - manage_response(true, true); + #if ENABLED(MMU2_MENUS) + planner.synchronize(); + const uint8_t index = mmu2_choose_filament(); + DISABLE_AXIS_E0(); + command(MMU_CMD_T0 + index); + manage_response(true, true); - if (load_to_gears()) { - mmu_loop(); - ENABLE_AXIS_E0(); - extruder = index; - active_extruder = 0; - } + if (load_to_gears()) { + mmu_loop(); + ENABLE_AXIS_E0(); + extruder = index; + active_extruder = 0; + } + #else + BUZZ(400, 40); + #endif } break; case 'c': { @@ -577,8 +578,6 @@ static void mmu2_not_responding() { } set_runout_valid(true); - - #endif // MMU2_MENUS } #elif ENABLED(MMU_EXTRUDER_SENSOR) @@ -628,20 +627,23 @@ static void mmu2_not_responding() { void MMU2::tool_change(const char* special) { if (!enabled) return; - #if ENABLED(MMU2_MENUS) + set_runout_valid(false); - set_runout_valid(false); - - switch (*special) { - case '?': { - DEBUG_ECHOLNPGM("case ?\n"); + switch (*special) { + case '?': { + DEBUG_ECHOLNPGM("case ?\n"); + #if ENABLED(MMU2_MENUS) uint8_t index = mmu2_choose_filament(); while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); load_filament_to_nozzle(index); - } break; + #else + BUZZ(400, 40); + #endif + } break; - case 'x': { - DEBUG_ECHOLNPGM("case x\n"); + case 'x': { + DEBUG_ECHOLNPGM("case x\n"); + #if ENABLED(MMU2_MENUS) planner.synchronize(); uint8_t index = mmu2_choose_filament(); DISABLE_AXIS_E0(); @@ -654,18 +656,19 @@ static void mmu2_not_responding() { ENABLE_AXIS_E0(); extruder = index; active_extruder = 0; - } break; + #else + BUZZ(400, 40); + #endif + } break; - case 'c': { - DEBUG_ECHOLNPGM("case c\n"); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); - } break; - } + case 'c': { + DEBUG_ECHOLNPGM("case c\n"); + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); + } break; + } - set_runout_valid(true); - - #endif // MMU2_MENUS + set_runout_valid(true); } void MMU2::mmu_continue_loading() { @@ -682,68 +685,74 @@ static void mmu2_not_responding() { mmu_idl_sens = 0; } -#elif DISABLED(MMU_EXTRUDER_SENSOR) && DISABLED(PRUSA_MMU2_S_MODE) +#else // !HAS_PRUSA_MMU2S && !MMU_EXTRUDER_SENSOR -/** - * Handle tool change - */ -void MMU2::tool_change(const uint8_t index) { - if (!enabled) return; + /** + * Handle tool change + */ + void MMU2::tool_change(const uint8_t index) { + if (!enabled) return; - set_runout_valid(false); + set_runout_valid(false); - if (index != extruder) { - DISABLE_AXIS_E0(); - ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); - command(MMU_CMD_T0 + index); - manage_response(true, true); - command(MMU_CMD_C0); - extruder = index; //filament change is finished - active_extruder = 0; - ENABLE_AXIS_E0(); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); - ui.reset_status(); + if (index != extruder) { + DISABLE_AXIS_E0(); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + command(MMU_CMD_T0 + index); + manage_response(true, true); + command(MMU_CMD_C0); + extruder = index; //filament change is finished + active_extruder = 0; + ENABLE_AXIS_E0(); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); + ui.reset_status(); + } + + set_runout_valid(true); } - set_runout_valid(true); -} - -/** - * Handle special T?/Tx/Tc commands - * - * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically - * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. - * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. - */ -void MMU2::tool_change(const char* special) { - if (!enabled) return; - - #if ENABLED(MMU2_MENUS) + /** + * Handle special T?/Tx/Tc commands + * + * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically + * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. + * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. + */ + void MMU2::tool_change(const char* special) { + if (!enabled) return; set_runout_valid(false); switch (*special) { case '?': { DEBUG_ECHOLNPGM("case ?\n"); - uint8_t index = mmu2_choose_filament(); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_filament_to_nozzle(index); + #if ENABLED(MMU2_MENUS) + uint8_t index = mmu2_choose_filament(); + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + load_filament_to_nozzle(index); + #else + BUZZ(400, 40); + #endif } break; case 'x': { DEBUG_ECHOLNPGM("case x\n"); - planner.synchronize(); - uint8_t index = mmu2_choose_filament(); - DISABLE_AXIS_E0(); - command(MMU_CMD_T0 + index); - manage_response(true, true); - command(MMU_CMD_C0); - mmu_loop(); + #if ENABLED(MMU2_MENUS) + planner.synchronize(); + uint8_t index = mmu2_choose_filament(); + DISABLE_AXIS_E0(); + command(MMU_CMD_T0 + index); + manage_response(true, true); + command(MMU_CMD_C0); + mmu_loop(); - ENABLE_AXIS_E0(); - extruder = index; - active_extruder = 0; + ENABLE_AXIS_E0(); + extruder = index; + active_extruder = 0; + #else + BUZZ(400, 40); + #endif } break; case 'c': { @@ -754,11 +763,9 @@ void MMU2::tool_change(const char* special) { } set_runout_valid(true); - - #endif } -#endif // MMU_EXTRUDER_SENSOR +#endif // HAS_PRUSA_MMU2S /** * Set next command @@ -866,7 +873,7 @@ void MMU2::filament_runout() { planner.synchronize(); } -#if ENABLED(PRUSA_MMU2_S_MODE) +#if HAS_PRUSA_MMU2S void MMU2::check_filament() { const bool present = FILAMENT_PRESENT(); @@ -907,162 +914,159 @@ void MMU2::filament_runout() { DEBUG_ECHOLNPGM(" succeeded."); return true; } + #endif -#if BOTH(HAS_LCD_MENU, MMU2_MENUS) +// Load filament into MMU2 +void MMU2::load_filament(const uint8_t index) { + if (!enabled) return; + command(MMU_CMD_L0 + index); + manage_response(false, false); + BUZZ(200, 404); +} - // Load filament into MMU2 - void MMU2::load_filament(const uint8_t index) { - if (!enabled) return; - command(MMU_CMD_L0 + index); +/** + * Switch material and load to nozzle + */ +bool MMU2::load_filament_to_nozzle(const uint8_t index) { + + if (!enabled) return false; + + if (thermalManager.tooColdToExtrude(active_extruder)) { + BUZZ(200, 404); + LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); + return false; + } + + command(MMU_CMD_T0 + index); + manage_response(true, true); + + const bool success = load_to_gears(); + if (success) { + mmu_loop(); + extruder = index; + active_extruder = 0; + load_to_nozzle(); + BUZZ(200, 404); + } + return success; +} + +/** + * Load filament to nozzle of multimaterial printer + * + * This function is used only only after T? (user select filament) and M600 (change filament). + * It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading + * filament to nozzle. + */ +void MMU2::load_to_nozzle() { + if (!enabled) return; + execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); +} + +bool MMU2::eject_filament(const uint8_t index, const bool recover) { + + if (!enabled) return false; + + if (thermalManager.tooColdToExtrude(active_extruder)) { + BUZZ(200, 404); + LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); + return false; + } + + LCD_MESSAGEPGM(MSG_MMU2_EJECTING_FILAMENT); + + ENABLE_AXIS_E0(); + current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED; + line_to_current_position(MMM_TO_MMS(2500)); + planner.synchronize(); + command(MMU_CMD_E0 + index); + manage_response(false, false); + + if (recover) { + LCD_MESSAGEPGM(MSG_MMU2_EJECT_RECOVER); + BUZZ(200, 404); + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), CONTINUE_STR)); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover"))); + wait_for_user_response(); + BUZZ(200, 404); + BUZZ(200, 404); + + command(MMU_CMD_R0); manage_response(false, false); + } + + ui.reset_status(); + + // no active tool + extruder = MMU2_NO_TOOL; + + set_runout_valid(false); + + BUZZ(200, 404); + + DISABLE_AXIS_E0(); + + return true; +} + +/** + * Unload from hotend and retract to MMU + */ +bool MMU2::unload() { + + if (!enabled) return false; + + if (thermalManager.tooColdToExtrude(active_extruder)) { BUZZ(200, 404); + LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); + return false; } - /** - * Switch material and load to nozzle - */ - bool MMU2::load_filament_to_nozzle(const uint8_t index) { + filament_ramming(); - if (!enabled) return false; + command(MMU_CMD_U0); + manage_response(false, true); - if (thermalManager.tooColdToExtrude(active_extruder)) { - BUZZ(200, 404); - LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); - return false; - } + BUZZ(200, 404); - command(MMU_CMD_T0 + index); - manage_response(true, true); + // no active tool + extruder = MMU2_NO_TOOL; - const bool success = load_to_gears(); - if (success) { - mmu_loop(); - extruder = index; - active_extruder = 0; - load_to_nozzle(); - BUZZ(200, 404); - } - return success; - } + set_runout_valid(false); - /** - * Load filament to nozzle of multimaterial printer - * - * This function is used only only after T? (user select filament) and M600 (change filament). - * It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading - * filament to nozzle. - */ - void MMU2::load_to_nozzle() { - if (!enabled) return; - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); - } + return true; +} - bool MMU2::eject_filament(const uint8_t index, const bool recover) { +/** + * Unload sequence to optimize shape of the tip of the unloaded filament + */ +void MMU2::filament_ramming() { + execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); +} - if (!enabled) return false; +void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) { - if (thermalManager.tooColdToExtrude(active_extruder)) { - BUZZ(200, 404); - LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); - return false; - } + planner.synchronize(); + ENABLE_AXIS_E0(); - LCD_MESSAGEPGM(MSG_MMU2_EJECTING_FILAMENT); + const E_Step* step = sequence; - ENABLE_AXIS_E0(); - current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED; - line_to_current_position(2500 / 60); + LOOP_L_N(i, steps) { + const float es = pgm_read_float(&(step->extrude)); + const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate)); + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("E step ", es, "/", fr_mm_m); + + current_position.e += es; + line_to_current_position(MMM_TO_MMS(fr_mm_m)); planner.synchronize(); - command(MMU_CMD_E0 + index); - manage_response(false, false); - if (recover) { - LCD_MESSAGEPGM(MSG_MMU2_EJECT_RECOVER); - BUZZ(200, 404); - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), CONTINUE_STR)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover"))); - wait_for_user_response(); - BUZZ(200, 404); - BUZZ(200, 404); - - command(MMU_CMD_R0); - manage_response(false, false); - } - - ui.reset_status(); - - // no active tool - extruder = MMU2_NO_TOOL; - - set_runout_valid(false); - - BUZZ(200, 404); - - DISABLE_AXIS_E0(); - - return true; + step++; } - /** - * Unload from hotend and retract to MMU - */ - bool MMU2::unload() { + DISABLE_AXIS_E0(); +} - if (!enabled) return false; - - if (thermalManager.tooColdToExtrude(active_extruder)) { - BUZZ(200, 404); - LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); - return false; - } - - filament_ramming(); - - command(MMU_CMD_U0); - manage_response(false, true); - - BUZZ(200, 404); - - // no active tool - extruder = MMU2_NO_TOOL; - - set_runout_valid(false); - - return true; - } - - /** - * Unload sequence to optimize shape of the tip of the unloaded filament - */ - void MMU2::filament_ramming() { - execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); - } - - void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) { - - planner.synchronize(); - ENABLE_AXIS_E0(); - - const E_Step* step = sequence; - - LOOP_L_N(i, steps) { - const float es = pgm_read_float(&(step->extrude)); - const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate)); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("E step ", es, "/", fr_mm_m); - - current_position.e += es; - line_to_current_position(MMM_TO_MMS(fr_mm_m)); - planner.synchronize(); - - step++; - } - - DISABLE_AXIS_E0(); - } - -#endif // HAS_LCD_MENU && MMU2_MENUS - -#endif // PRUSA_MMU2 +#endif // HAS_PRUSA_MMU2 diff --git a/Marlin/src/feature/mmu2/mmu2.h b/Marlin/src/feature/mmu/mmu2.h similarity index 84% rename from Marlin/src/feature/mmu2/mmu2.h rename to Marlin/src/feature/mmu/mmu2.h index 678f65d072..09ff3b6683 100644 --- a/Marlin/src/feature/mmu2/mmu2.h +++ b/Marlin/src/feature/mmu/mmu2.h @@ -49,13 +49,11 @@ public: static uint8_t get_current_tool(); static void set_filament_type(const uint8_t index, const uint8_t type); - #if BOTH(HAS_LCD_MENU, MMU2_MENUS) - static bool unload(); - static void load_filament(uint8_t); - static void load_all(); - static bool load_filament_to_nozzle(const uint8_t index); - static bool eject_filament(const uint8_t index, const bool recover); - #endif + static bool unload(); + static void load_filament(uint8_t); + static void load_all(); + static bool load_filament_to_nozzle(const uint8_t index); + static bool eject_filament(const uint8_t index, const bool recover); private: static bool rx_str_P(const char* str); @@ -72,15 +70,13 @@ private: static bool get_response(); static void manage_response(const bool move_axes, const bool turn_off_nozzle); - #if BOTH(HAS_LCD_MENU, MMU2_MENUS) - static void load_to_nozzle(); - static void filament_ramming(); - static void execute_extruder_sequence(const E_Step * sequence, int steps); - #endif + static void load_to_nozzle(); + static void filament_ramming(); + static void execute_extruder_sequence(const E_Step * sequence, int steps); static void filament_runout(); - #if ENABLED(PRUSA_MMU2_S_MODE) + #if HAS_PRUSA_MMU2S static bool mmu2s_triggered; static void check_filament(); static bool can_load(); diff --git a/Marlin/src/gcode/config/M220.cpp b/Marlin/src/gcode/config/M220.cpp index 1bec6a7782..37fe7d3a5f 100644 --- a/Marlin/src/gcode/config/M220.cpp +++ b/Marlin/src/gcode/config/M220.cpp @@ -31,13 +31,13 @@ * * Report the current speed percentage factor if no parameter is specified * - * With PRUSA_MMU2... + * For MMU2 and MMU2S devices... * B : Flag to back up the current factor * R : Flag to restore the last-saved factor */ void GcodeSuite::M220() { - #if ENABLED(PRUSA_MMU2) + #if HAS_PRUSA_MMU2 static int16_t backup_feedrate_percentage = 100; if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage; if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage; diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index d95e60ff8d..592b2b3dce 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -27,8 +27,8 @@ #include "../../module/motion.h" #endif -#if ENABLED(PRUSA_MMU2) - #include "../../feature/mmu2/mmu2.h" +#if HAS_PRUSA_MMU2 + #include "../../feature/mmu/mmu2.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) @@ -40,7 +40,7 @@ * F[units/min] Set the movement feedrate * S1 Don't move the tool in XY after change * - * For PRUSA_MMU2: + * For PRUSA_MMU2(S) and SMUFF_EMU_MMU2(S) * T[n] Gcode to extrude at least 38.10 mm at feedrate 19.02 mm/s must follow immediately to load to extruder wheels. * T? Gcode to extrude shouldn't have to follow. Load to extruder wheels is done automatically. * Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load. @@ -54,7 +54,7 @@ void GcodeSuite::T(const int8_t tool_index) { // Count this command as movement / activity reset_stepper_timeout(); - #if ENABLED(PRUSA_MMU2) + #if HAS_PRUSA_MMU2 if (parser.string_arg) { mmu2.tool_change(parser.string_arg); // Special commands T?/Tx/Tc return; diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index a193d83d40..a100d462da 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -38,8 +38,8 @@ #include "../../../lcd/marlinui.h" #endif -#if ENABLED(PRUSA_MMU2) - #include "../../../feature/mmu2/mmu2.h" +#if HAS_PRUSA_MMU2 + #include "../../../feature/mmu/mmu2.h" #endif #if ENABLED(MIXING_EXTRUDER) @@ -86,7 +86,7 @@ void GcodeSuite::M701() { // Show initial "wait for load" message TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder)); - #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU) // Change toolhead if specified uint8_t active_extruder_before_filament_change = active_extruder; if (active_extruder != target_extruder) @@ -98,7 +98,7 @@ void GcodeSuite::M701() { do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); // Load filament - #if ENABLED(PRUSA_MMU2) + #if HAS_PRUSA_MMU2 mmu2.load_filament_to_nozzle(target_extruder); #else constexpr float purge_length = ADVANCED_PAUSE_PURGE_LENGTH, @@ -121,7 +121,7 @@ void GcodeSuite::M701() { if (park_point.z > 0) do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); - #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU) // Restore toolhead if it was changed if (active_extruder_before_filament_change != active_extruder) tool_change(active_extruder_before_filament_change, false); @@ -186,7 +186,7 @@ void GcodeSuite::M702() { // Show initial "wait for unload" message TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder)); - #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU) // Change toolhead if specified uint8_t active_extruder_before_filament_change = active_extruder; if (active_extruder != target_extruder) @@ -198,7 +198,7 @@ void GcodeSuite::M702() { do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); // Unload filament - #if ENABLED(PRUSA_MMU2) + #if HAS_PRUSA_MMU2 mmu2.unload(); #else #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS) @@ -227,7 +227,7 @@ void GcodeSuite::M702() { if (park_point.z > 0) do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); - #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU) // Restore toolhead if it was changed if (active_extruder_before_filament_change != active_extruder) tool_change(active_extruder_before_filament_change, false); diff --git a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp index 91e35dbf65..31d076337a 100644 --- a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp +++ b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp @@ -22,10 +22,10 @@ #include "../../../inc/MarlinConfigPre.h" -#if ENABLED(PRUSA_MMU2) +#if HAS_PRUSA_MMU2 #include "../../gcode.h" -#include "../../../feature/mmu2/mmu2.h" +#include "../../../feature/mmu/mmu2.h" /** * M403: Set filament type for MMU2 @@ -46,4 +46,4 @@ void GcodeSuite::M403() { SERIAL_ECHO_MSG("M403 - bad arguments."); } -#endif // PRUSA_MMU2 +#endif // HAS_PRUSA_MMU2 diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 544d7b777d..3bce34c1f3 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -702,7 +702,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 402: M402(); break; // M402: Stow probe #endif - #if ENABLED(PRUSA_MMU2) + #if HAS_PRUSA_MMU2 case 403: M403(); break; #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 3fbb88829e..1d74ac3719 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -181,7 +181,7 @@ * M217 - Set filament swap parameters: "M217 S P R". (Requires SINGLENOZZLE) * M218 - Set/get a tool offset: "M218 T X Y". (Requires 2 or more extruders) * M220 - Set Feedrate Percentage: "M220 S" (i.e., "FR" on the LCD) - * Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires PRUSA_MMU2) + * Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires an MMU_MODEL version 2 or 2S) * M221 - Set Flow Percentage: "M221 S" * M226 - Wait until a pin is in a given state: "M226 P S" (Requires DIRECT_PIN_CONTROL) * M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE) @@ -735,7 +735,7 @@ private: static void M402(); #endif - TERN_(PRUSA_MMU2, static void M403()); + TERN_(HAS_PRUSA_MMU2, static void M403()); #if ENABLED(FILAMENT_WIDTH_SENSOR) static void M404(); diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 4bff045e30..a513c4b596 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -155,7 +155,7 @@ void GCodeParser::parse(char *p) { // Skip spaces to get the numeric part while (*p == ' ') p++; - #if ENABLED(PRUSA_MMU2) + #if HAS_PRUSA_MMU2 if (letter == 'T') { // check for special MMU2 T?/Tx/Tc commands if (*p == '?' || *p == 'x' || *p == 'c') { diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index b784e12b99..5fe73a9467 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -495,6 +495,36 @@ #endif #endif +/** + * Multi-Material-Unit supported models + */ +#define PRUSA_MMU1 1 +#define PRUSA_MMU2 2 +#define PRUSA_MMU2S 3 +#define SMUFF_EMU_MMU2 12 +#define SMUFF_EMU_MMU2S 13 + +#ifdef MMU_MODEL + #define HAS_MMU 1 + #if MMU_MODEL == PRUSA_MMU1 + #define HAS_PRUSA_MMU1 1 + #elif MMU_MODEL % 10 == PRUSA_MMU2 + #define HAS_PRUSA_MMU2 1 + #elif MMU_MODEL % 10 == PRUSA_MMU2S + #define HAS_PRUSA_MMU2 1 + #define HAS_PRUSA_MMU2S 1 + #endif + #if MMU_MODEL >= SMUFF_EMU_MMU2 + #define HAS_SMUFF 1 + #endif +#endif + +#undef PRUSA_MMU1 +#undef PRUSA_MMU2 +#undef PRUSA_MMU2S +#undef SMUFF_EMU_MMU2 +#undef SMUFF_EMU_MMU2S + /** * Extruders have some combination of stepper motors and hotends * so we separate these concepts into the defines: @@ -512,8 +542,6 @@ #undef SWITCHING_EXTRUDER #undef SWITCHING_NOZZLE #undef MIXING_EXTRUDER - #undef MK2_MULTIPLEXER - #undef PRUSA_MMU2 #undef HOTEND_IDLE_TIMEOUT #elif EXTRUDERS > 1 #define HAS_MULTI_EXTRUDER 1 @@ -539,17 +567,17 @@ #elif ENABLED(SWITCHING_TOOLHEAD) #define E_STEPPERS EXTRUDERS #define E_MANUAL EXTRUDERS -#elif ENABLED(PRUSA_MMU2) +#elif HAS_PRUSA_MMU2 #define E_STEPPERS 1 #endif -// No inactive extruders with MK2_MULTIPLEXER or SWITCHING_NOZZLE -#if EITHER(MK2_MULTIPLEXER, SWITCHING_NOZZLE) +// No inactive extruders with SWITCHING_NOZZLE or Průša MMU1 +#if ENABLED(SWITCHING_NOZZLE) || HAS_PRUSA_MMU1 #undef DISABLE_INACTIVE_EXTRUDER #endif -// Průša MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE -#if EITHER(MK2_MULTIPLEXER, PRUSA_MMU2) +// Průša MMU1, MMU 2.0, MMUS 2.0 and SMUFF force SINGLENOZZLE +#if HAS_MMU #define SINGLENOZZLE #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 65504ab795..4215f225e3 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -804,7 +804,11 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if !PIN_EXISTS(FIL_RUNOUT) #error "FILAMENT_RUNOUT_SENSOR requires FIL_RUNOUT_PIN." #elif NUM_RUNOUT_SENSORS > E_STEPPERS - #error "NUM_RUNOUT_SENSORS cannot exceed the number of E steppers." + #if HAS_PRUSA_MMU2 + #error "NUM_RUNOUT_SENSORS must be 1 with MMU2 / MMU2S." + #else + #error "NUM_RUNOUT_SENSORS cannot exceed the number of E steppers." + #endif #elif NUM_RUNOUT_SENSORS >= 2 && !PIN_EXISTS(FIL_RUNOUT2) #error "FIL_RUNOUT2_PIN is required with NUM_RUNOUT_SENSORS >= 2." #elif NUM_RUNOUT_SENSORS >= 3 && !PIN_EXISTS(FIL_RUNOUT3) @@ -867,6 +871,42 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "INDIVIDUAL_AXIS_HOMING_MENU is incompatible with DELTA kinematics." #endif +/** + * Sanity checking for all Průša MMU + */ +#ifdef SNMM + #error "SNMM is obsolete. Define MMU_MODEL as PRUSA_MMU1 instead." +#elif ENABLED(MK2_MULTIPLEXER) + #error "MK2_MULTIPLEXER is obsolete. Define MMU_MODEL as PRUSA_MMU1 instead." +#elif ENABLED(PRUSA_MMU2) + #error "PRUSA_MMU2 is obsolete. Define MMU_MODEL as PRUSA_MMU2 instead." +#elif ENABLED(PRUSA_MMU2_S_MODE) + #error "PRUSA_MMU2_S_MODE is obsolete. Define MMU_MODEL as PRUSA_MMU2S instead." +#endif + +/** + * Multi-Material-Unit 2 / SMUFF requirements + */ +#if HAS_PRUSA_MMU2 + #if EXTRUDERS != 5 + #undef SINGLENOZZLE + #error "PRUSA_MMU2(S) requires exactly 5 EXTRUDERS. Please update your Configuration." + #elif DISABLED(NOZZLE_PARK_FEATURE) + #error "PRUSA_MMU2(S) requires NOZZLE_PARK_FEATURE. Enable it to continue." + #elif HAS_PRUSA_MMU2S && DISABLED(FILAMENT_RUNOUT_SENSOR) + #error "PRUSA_MMU2S requires FILAMENT_RUNOUT_SENSOR. Enable it to continue." + #elif ENABLED(MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR) + #error "MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue." + #elif ENABLED(MMU_EXTRUDER_SENSOR) && !HAS_LCD_MENU + #error "MMU_EXTRUDER_SENSOR requires an LCD supporting MarlinUI to be enabled." + #elif DISABLED(ADVANCED_PAUSE_FEATURE) + static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2(S) / SMUFF_EMU_MMU2(S)."); + #endif +#endif +#if HAS_SMUFF && EXTRUDERS > 12 + #error "Too many extruders for SMUFF_EMU_MMU2(S). (12 maximum)." +#endif + /** * Options only for EXTRUDERS > 1 */ @@ -902,17 +942,14 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1." #endif -#elif ENABLED(MK2_MULTIPLEXER) - #error "MK2_MULTIPLEXER requires 2 or more EXTRUDERS." -#elif ENABLED(SINGLENOZZLE) - #error "SINGLENOZZLE requires 2 or more EXTRUDERS." -#endif +#elif HAS_PRUSA_MMU1 || HAS_SMUFF + + #error "Multi-Material-Unit requires 2 or more EXTRUDERS." + +#elif ENABLED(SINGLENOZZLE) + + #error "SINGLENOZZLE requires 2 or more EXTRUDERS." -/** - * Sanity checking for the Průša MK2 Multiplexer - */ -#ifdef SNMM - #error "SNMM is now MK2_MULTIPLEXER." #endif /** @@ -1870,48 +1907,46 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Test Extruder Stepper Pins */ -#if DISABLED(MK2_MULTIPLEXER) // MK2_MULTIPLEXER uses E0 stepper only - #if E_STEPPERS - #if !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE) - #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." +#if E_STEPPERS + #if !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE) + #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 1 + #if !(PINS_EXIST(E1_STEP, E1_DIR) && HAS_E1_ENABLE) + #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." #endif - #if E_STEPPERS > 1 - #if !(PINS_EXIST(E1_STEP, E1_DIR) && HAS_E1_ENABLE) - #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." + #if E_STEPPERS > 2 + #if !(PINS_EXIST(E2_STEP, E2_DIR) && HAS_E2_ENABLE) + #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." #endif - #if E_STEPPERS > 2 - #if !(PINS_EXIST(E2_STEP, E2_DIR) && HAS_E2_ENABLE) - #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." + #if E_STEPPERS > 3 + #if !(PINS_EXIST(E3_STEP, E3_DIR) && HAS_E3_ENABLE) + #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." #endif - #if E_STEPPERS > 3 - #if !(PINS_EXIST(E3_STEP, E3_DIR) && HAS_E3_ENABLE) - #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." + #if E_STEPPERS > 4 + #if !(PINS_EXIST(E4_STEP, E4_DIR) && HAS_E4_ENABLE) + #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." #endif - #if E_STEPPERS > 4 - #if !(PINS_EXIST(E4_STEP, E4_DIR) && HAS_E4_ENABLE) - #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." + #if E_STEPPERS > 5 + #if !(PINS_EXIST(E5_STEP, E5_DIR) && HAS_E5_ENABLE) + #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board." #endif - #if E_STEPPERS > 5 - #if !(PINS_EXIST(E5_STEP, E5_DIR) && HAS_E5_ENABLE) - #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board." + #if E_STEPPERS > 6 + #if !(PINS_EXIST(E6_STEP, E6_DIR) && HAS_E6_ENABLE) + #error "E6_STEP_PIN, E6_DIR_PIN, or E6_ENABLE_PIN not defined for this board." #endif - #if E_STEPPERS > 6 - #if !(PINS_EXIST(E6_STEP, E6_DIR) && HAS_E6_ENABLE) - #error "E6_STEP_PIN, E6_DIR_PIN, or E6_ENABLE_PIN not defined for this board." + #if E_STEPPERS > 7 + #if !(PINS_EXIST(E7_STEP, E7_DIR) && HAS_E7_ENABLE) + #error "E7_STEP_PIN, E7_DIR_PIN, or E7_ENABLE_PIN not defined for this board." #endif - #if E_STEPPERS > 7 - #if !(PINS_EXIST(E7_STEP, E7_DIR) && HAS_E7_ENABLE) - #error "E7_STEP_PIN, E7_DIR_PIN, or E7_ENABLE_PIN not defined for this board." - #endif - #endif // E_STEPPERS > 7 - #endif // E_STEPPERS > 6 - #endif // E_STEPPERS > 5 - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - #endif // E_STEPPERS -#endif + #endif // E_STEPPERS > 7 + #endif // E_STEPPERS > 6 + #endif // E_STEPPERS > 5 + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 +#endif // E_STEPPERS /** * Endstop Tests @@ -2977,23 +3012,6 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif -/** - * Průša MMU2 requirements - */ -#if ENABLED(PRUSA_MMU2) - #if EXTRUDERS != 5 - #error "PRUSA_MMU2 requires EXTRUDERS = 5." - #elif DISABLED(NOZZLE_PARK_FEATURE) - #error "PRUSA_MMU2 requires NOZZLE_PARK_FEATURE. Enable it to continue." - #elif EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR) - #error "PRUSA_MMU2_S_MODE or MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue." - #elif BOTH(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) - #error "Enable only one of PRUSA_MMU2_S_MODE or MMU_EXTRUDER_SENSOR." - #elif DISABLED(ADVANCED_PAUSE_FEATURE) - static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2."); - #endif -#endif - /** * Advanced PRINTCOUNTER settings */ diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index bb65ce61e2..cda11bfc57 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -46,7 +46,7 @@ #define MACHINE_CAN_PAUSE 1 #endif -#if ENABLED(PRUSA_MMU2) +#if ENABLED(MMU2_MENUS) #include "../../lcd/menu/menu_mmu2.h" #endif diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index 0a63d90c63..8a34e7d296 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -24,13 +24,10 @@ #if BOTH(HAS_LCD_MENU, MMU2_MENUS) -#include "../../feature/mmu2/mmu2.h" +#include "../../feature/mmu/mmu2.h" #include "menu_mmu2.h" #include "menu_item.h" -uint8_t currentTool; -bool mmuMenuWait; - // // Load Filament // @@ -123,9 +120,12 @@ void menu_mmu2() { // T* Choose Filament // -inline void action_mmu2_choose(const uint8_t tool) { - currentTool = tool; - mmuMenuWait = false; +uint8_t feeder_index; +bool wait_for_mmu_menu; + +inline void action_mmu2_chosen(const uint8_t index) { + feeder_index = index; + wait_for_mmu_menu = false; } void menu_mmu2_choose_filament() { @@ -133,7 +133,7 @@ void menu_mmu2_choose_filament() { #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_DEFAULT|SS_INVERT); #endif - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_choose(MenuItemBase::itemIndex); }); + LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_chosen(MenuItemBase::itemIndex); }); END_MENU(); } @@ -142,32 +142,32 @@ void menu_mmu2_choose_filament() { // void menu_mmu2_pause() { - currentTool = mmu2.get_current_tool(); + feeder_index = mmu2.get_current_tool(); START_MENU(); #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_DEFAULT|SS_INVERT); #endif - ACTION_ITEM(MSG_MMU2_RESUME, []{ mmuMenuWait = false; }); + ACTION_ITEM(MSG_MMU2_RESUME, []{ wait_for_mmu_menu = false; }); ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, []{ mmu2.unload(); }); - ACTION_ITEM(MSG_MMU2_LOAD_FILAMENT, []{ mmu2.load_filament(currentTool); }); - ACTION_ITEM(MSG_MMU2_LOAD_TO_NOZZLE, []{ mmu2.load_filament_to_nozzle(currentTool); }); + ACTION_ITEM(MSG_MMU2_LOAD_FILAMENT, []{ mmu2.load_filament(feeder_index); }); + ACTION_ITEM(MSG_MMU2_LOAD_TO_NOZZLE, []{ mmu2.load_filament_to_nozzle(feeder_index); }); END_MENU(); } void mmu2_M600() { ui.defer_status_screen(); ui.goto_screen(menu_mmu2_pause); - mmuMenuWait = true; - while (mmuMenuWait) idle(); + wait_for_mmu_menu = true; + while (wait_for_mmu_menu) idle(); } uint8_t mmu2_choose_filament() { ui.defer_status_screen(); ui.goto_screen(menu_mmu2_choose_filament); - mmuMenuWait = true; - while (mmuMenuWait) idle(); + wait_for_mmu_menu = true; + while (wait_for_mmu_menu) idle(); ui.return_to_status(); - return currentTool; + return feeder_index; } #endif // HAS_LCD_MENU && MMU2_MENUS diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 21997b4740..6614aec35b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1068,46 +1068,30 @@ void MarlinSettings::postprocess() { #if AXIS_IS_TMC(Z4) tmc_stepper_current.Z4 = stepperZ4.getMilliamps(); #endif - #if MAX_EXTRUDERS - #if AXIS_IS_TMC(E0) - tmc_stepper_current.E0 = stepperE0.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 1 - #if AXIS_IS_TMC(E1) - tmc_stepper_current.E1 = stepperE1.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 2 - #if AXIS_IS_TMC(E2) - tmc_stepper_current.E2 = stepperE2.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 3 - #if AXIS_IS_TMC(E3) - tmc_stepper_current.E3 = stepperE3.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 4 - #if AXIS_IS_TMC(E4) - tmc_stepper_current.E4 = stepperE4.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 5 - #if AXIS_IS_TMC(E5) - tmc_stepper_current.E5 = stepperE5.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 6 - #if AXIS_IS_TMC(E6) - tmc_stepper_current.E6 = stepperE6.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 7 - #if AXIS_IS_TMC(E7) - tmc_stepper_current.E7 = stepperE7.getMilliamps(); - #endif - #endif // MAX_EXTRUDERS > 7 - #endif // MAX_EXTRUDERS > 6 - #endif // MAX_EXTRUDERS > 5 - #endif // MAX_EXTRUDERS > 4 - #endif // MAX_EXTRUDERS > 3 - #endif // MAX_EXTRUDERS > 2 - #endif // MAX_EXTRUDERS > 1 - #endif // MAX_EXTRUDERS + #if AXIS_IS_TMC(E0) + tmc_stepper_current.E0 = stepperE0.getMilliamps(); + #endif + #if AXIS_IS_TMC(E1) + tmc_stepper_current.E1 = stepperE1.getMilliamps(); + #endif + #if AXIS_IS_TMC(E2) + tmc_stepper_current.E2 = stepperE2.getMilliamps(); + #endif + #if AXIS_IS_TMC(E3) + tmc_stepper_current.E3 = stepperE3.getMilliamps(); + #endif + #if AXIS_IS_TMC(E4) + tmc_stepper_current.E4 = stepperE4.getMilliamps(); + #endif + #if AXIS_IS_TMC(E5) + tmc_stepper_current.E5 = stepperE5.getMilliamps(); + #endif + #if AXIS_IS_TMC(E6) + tmc_stepper_current.E6 = stepperE6.getMilliamps(); + #endif + #if AXIS_IS_TMC(E7) + tmc_stepper_current.E7 = stepperE7.getMilliamps(); + #endif #endif EEPROM_WRITE(tmc_stepper_current); } @@ -1144,46 +1128,30 @@ void MarlinSettings::postprocess() { #if AXIS_HAS_STEALTHCHOP(Z4) tmc_hybrid_threshold.Z4 = stepperZ4.get_pwm_thrs(); #endif - #if MAX_EXTRUDERS - #if AXIS_HAS_STEALTHCHOP(E0) - tmc_hybrid_threshold.E0 = stepperE0.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 1 - #if AXIS_HAS_STEALTHCHOP(E1) - tmc_hybrid_threshold.E1 = stepperE1.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 2 - #if AXIS_HAS_STEALTHCHOP(E2) - tmc_hybrid_threshold.E2 = stepperE2.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 3 - #if AXIS_HAS_STEALTHCHOP(E3) - tmc_hybrid_threshold.E3 = stepperE3.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 4 - #if AXIS_HAS_STEALTHCHOP(E4) - tmc_hybrid_threshold.E4 = stepperE4.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 5 - #if AXIS_HAS_STEALTHCHOP(E5) - tmc_hybrid_threshold.E5 = stepperE5.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 6 - #if AXIS_HAS_STEALTHCHOP(E6) - tmc_hybrid_threshold.E6 = stepperE6.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 7 - #if AXIS_HAS_STEALTHCHOP(E7) - tmc_hybrid_threshold.E7 = stepperE7.get_pwm_thrs(); - #endif - #endif // MAX_EXTRUDERS > 7 - #endif // MAX_EXTRUDERS > 6 - #endif // MAX_EXTRUDERS > 5 - #endif // MAX_EXTRUDERS > 4 - #endif // MAX_EXTRUDERS > 3 - #endif // MAX_EXTRUDERS > 2 - #endif // MAX_EXTRUDERS > 1 - #endif // MAX_EXTRUDERS + #if AXIS_HAS_STEALTHCHOP(E0) + tmc_hybrid_threshold.E0 = stepperE0.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + tmc_hybrid_threshold.E1 = stepperE1.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + tmc_hybrid_threshold.E2 = stepperE2.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + tmc_hybrid_threshold.E3 = stepperE3.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + tmc_hybrid_threshold.E4 = stepperE4.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + tmc_hybrid_threshold.E5 = stepperE5.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + tmc_hybrid_threshold.E6 = stepperE6.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + tmc_hybrid_threshold.E7 = stepperE7.get_pwm_thrs(); + #endif #else const tmc_hybrid_threshold_t tmc_hybrid_threshold = { .X = 100, .Y = 100, .Z = 3, @@ -1219,73 +1187,54 @@ void MarlinSettings::postprocess() { { _FIELD_TEST(tmc_stealth_enabled); - tmc_stealth_enabled_t tmc_stealth_enabled = { false, false, false, false, false, false, false, false, false, false, false, false, false }; - - #if HAS_STEALTHCHOP - #if AXIS_HAS_STEALTHCHOP(X) - tmc_stealth_enabled.X = stepperX.get_stored_stealthChop(); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - tmc_stealth_enabled.Y = stepperY.get_stored_stealthChop(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - tmc_stealth_enabled.Z = stepperZ.get_stored_stealthChop(); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - tmc_stealth_enabled.X2 = stepperX2.get_stored_stealthChop(); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - tmc_stealth_enabled.Y2 = stepperY2.get_stored_stealthChop(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - tmc_stealth_enabled.Z2 = stepperZ2.get_stored_stealthChop(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - tmc_stealth_enabled.Z3 = stepperZ3.get_stored_stealthChop(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - tmc_stealth_enabled.Z4 = stepperZ4.get_stored_stealthChop(); - #endif - #if MAX_EXTRUDERS - #if AXIS_HAS_STEALTHCHOP(E0) - tmc_stealth_enabled.E0 = stepperE0.get_stored_stealthChop(); - #endif - #if MAX_EXTRUDERS > 1 - #if AXIS_HAS_STEALTHCHOP(E1) - tmc_stealth_enabled.E1 = stepperE1.get_stored_stealthChop(); - #endif - #if MAX_EXTRUDERS > 2 - #if AXIS_HAS_STEALTHCHOP(E2) - tmc_stealth_enabled.E2 = stepperE2.get_stored_stealthChop(); - #endif - #if MAX_EXTRUDERS > 3 - #if AXIS_HAS_STEALTHCHOP(E3) - tmc_stealth_enabled.E3 = stepperE3.get_stored_stealthChop(); - #endif - #if MAX_EXTRUDERS > 4 - #if AXIS_HAS_STEALTHCHOP(E4) - tmc_stealth_enabled.E4 = stepperE4.get_stored_stealthChop(); - #endif - #if MAX_EXTRUDERS > 5 - #if AXIS_HAS_STEALTHCHOP(E5) - tmc_stealth_enabled.E5 = stepperE5.get_stored_stealthChop(); - #endif - #if MAX_EXTRUDERS > 6 - #if AXIS_HAS_STEALTHCHOP(E6) - tmc_stealth_enabled.E6 = stepperE6.get_stored_stealthChop(); - #endif - #if MAX_EXTRUDERS > 7 - #if AXIS_HAS_STEALTHCHOP(E7) - tmc_stealth_enabled.E7 = stepperE7.get_stored_stealthChop(); - #endif - #endif // MAX_EXTRUDERS > 7 - #endif // MAX_EXTRUDERS > 6 - #endif // MAX_EXTRUDERS > 5 - #endif // MAX_EXTRUDERS > 4 - #endif // MAX_EXTRUDERS > 3 - #endif // MAX_EXTRUDERS > 2 - #endif // MAX_EXTRUDERS > 1 - #endif // MAX_EXTRUDERS + tmc_stealth_enabled_t tmc_stealth_enabled = { false }; + #if AXIS_HAS_STEALTHCHOP(X) + tmc_stealth_enabled.X = stepperX.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_stealth_enabled.Y = stepperY.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_stealth_enabled.Z = stepperZ.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + tmc_stealth_enabled.X2 = stepperX2.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + tmc_stealth_enabled.Y2 = stepperY2.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + tmc_stealth_enabled.Z2 = stepperZ2.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + tmc_stealth_enabled.Z3 = stepperZ3.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + tmc_stealth_enabled.Z4 = stepperZ4.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + tmc_stealth_enabled.E0 = stepperE0.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + tmc_stealth_enabled.E1 = stepperE1.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + tmc_stealth_enabled.E2 = stepperE2.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + tmc_stealth_enabled.E3 = stepperE3.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + tmc_stealth_enabled.E4 = stepperE4.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + tmc_stealth_enabled.E5 = stepperE5.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + tmc_stealth_enabled.E6 = stepperE6.get_stored_stealthChop(); + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + tmc_stealth_enabled.E7 = stepperE7.get_stored_stealthChop(); #endif EEPROM_WRITE(tmc_stealth_enabled); } diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index ec0d63a89d..dfdd63b05b 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -417,12 +417,15 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define NORM_E_DIR(E) do{ E0_DIR_WRITE(E ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0) #define REV_E_DIR(E) do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0) #endif -#elif ENABLED(PRUSA_MMU2) + +#elif HAS_PRUSA_MMU2 + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) #define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR) #define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR) -#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index +#elif HAS_PRUSA_MMU1 // One multiplexed stepper driver, reversed on odd index + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0) #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index d77901f029..a981931917 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -73,10 +73,6 @@ #include "../feature/solenoid.h" #endif -#if ENABLED(MK2_MULTIPLEXER) - #include "../feature/snmm.h" -#endif - #if ENABLED(MIXING_EXTRUDER) #include "../feature/mixing.h" #endif @@ -89,8 +85,10 @@ #include "../feature/fanmux.h" #endif -#if ENABLED(PRUSA_MMU2) - #include "../feature/mmu2/mmu2.h" +#if HAS_PRUSA_MMU1 + #include "../feature/mmu/mmu.h" +#elif HAS_PRUSA_MMU2 + #include "../feature/mmu/mmu2.h" #endif #if HAS_LCD_MENU @@ -863,7 +861,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { mixer.T(new_tool); #endif - #elif ENABLED(PRUSA_MMU2) + #elif HAS_PRUSA_MMU2 UNUSED(no_move); @@ -1171,8 +1169,6 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); #endif - TERN_(PRUSA_MMU2, mmu2.tool_change(new_tool)); - TERN_(SWITCHING_NOZZLE_TWO_SERVOS, lower_nozzle(new_tool)); } // (new_tool != old_tool) @@ -1184,7 +1180,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { enable_solenoid_on_active_extruder(); #endif - #if ENABLED(MK2_MULTIPLEXER) + #if HAS_PRUSA_MMU1 if (new_tool >= E_STEPPERS) return invalid_extruder_error(new_tool); select_multiplexed_stepper(new_tool); #endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 2430958895..b993e38460 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -131,9 +131,9 @@ #define PIN_P2_11 P2_11 // Interrupt Capable // -// Průša i3 MK2 Multi Material Multiplexer Support +// Průša i3 MMU1 (Multi Material Multiplexer) Support // -#if ENABLED(MK2_MULTIPLEXER) +#if HAS_PRUSA_MMU1 #define E_MUX0_PIN P1_23 // J8-3 #define E_MUX1_PIN P2_12 // J8-4 #define E_MUX2_PIN P2_11 // J8-5 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index b9e12d8233..e9eee4f371 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -35,7 +35,12 @@ * These numbers are the same in any pin mapping. */ -#define MAX_EXTRUDERS 8 +#if HAS_SMUFF + #define MAX_EXTRUDERS 12 +#else + #define MAX_EXTRUDERS 8 +#endif +#define MAX_E_STEPPERS 8 #if MB(RAMPS_13_EFB, RAMPS_14_EFB, RAMPS_PLUS_EFB, RAMPS_14_RE_ARM_EFB, RAMPS_SMART_EFB, RAMPS_DUO_EFB, RAMPS4DUE_EFB) #define IS_RAMPS_EFB diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index 788f2093c1..de70248d4d 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -521,7 +521,7 @@ #define X2_STEP_PIN _EPIN(X2_E_INDEX, STEP) #define X2_DIR_PIN _EPIN(X2_E_INDEX, DIR) #define X2_ENABLE_PIN _EPIN(X2_E_INDEX, ENABLE) - #if X2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(X2_STEP) + #if X2_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(X2_STEP) #error "No E stepper plug left for X2!" #endif #endif @@ -594,7 +594,7 @@ #define Y2_STEP_PIN _EPIN(Y2_E_INDEX, STEP) #define Y2_DIR_PIN _EPIN(Y2_E_INDEX, DIR) #define Y2_ENABLE_PIN _EPIN(Y2_E_INDEX, ENABLE) - #if Y2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Y2_STEP) + #if Y2_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(Y2_STEP) #error "No E stepper plug left for Y2!" #endif #endif @@ -662,7 +662,7 @@ #define Z2_STEP_PIN _EPIN(Z2_E_INDEX, STEP) #define Z2_DIR_PIN _EPIN(Z2_E_INDEX, DIR) #define Z2_ENABLE_PIN _EPIN(Z2_E_INDEX, ENABLE) - #if Z2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z2_STEP) + #if Z2_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(Z2_STEP) #error "No E stepper plug left for Z2!" #endif #endif @@ -729,7 +729,7 @@ #define Z3_STEP_PIN _EPIN(Z3_E_INDEX, STEP) #define Z3_DIR_PIN _EPIN(Z3_E_INDEX, DIR) #define Z3_ENABLE_PIN _EPIN(Z3_E_INDEX, ENABLE) - #if Z3_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z3_STEP) + #if Z3_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(Z3_STEP) #error "No E stepper plug left for Z3!" #endif #endif @@ -796,7 +796,7 @@ #define Z4_STEP_PIN _EPIN(Z4_E_INDEX, STEP) #define Z4_DIR_PIN _EPIN(Z4_E_INDEX, DIR) #define Z4_ENABLE_PIN _EPIN(Z4_E_INDEX, ENABLE) - #if Z4_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z4_STEP) + #if Z4_E_INDEX >= MAX_E_STEPPERS || !PIN_EXISTS(Z4_STEP) #error "No E stepper plug left for Z4!" #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index eaf90da1ae..eb1e886fa4 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -25,8 +25,8 @@ #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 8 || E_STEPPERS > 8 #error "BIGTREE GTR V1.0 supports up to 8 hotends / E-steppers." -#elif HOTENDS > MAX_EXTRUDERS || E_STEPPERS > MAX_EXTRUDERS - #error "Marlin extruder/hotends limit! Increase MAX_EXTRUDERS to continue." +#elif HOTENDS > MAX_E_STEPPERS || E_STEPPERS > MAX_E_STEPPERS + #error "Marlin extruder/hotends limit! Increase MAX_E_STEPPERS to continue." #endif #define BOARD_INFO_NAME "BTT GTR V1.0" diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 113ec9ed1b..294de2a767 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -66,28 +66,38 @@ exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sle # restore_configs opt_set LCD_LANGUAGE zh_CN +opt_set MMU_MODEL PRUSA_MMU2S opt_set EXTRUDERS 5 opt_set NUM_SERVOS 1 opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ - PRUSA_MMU2 MMU2_MENUS PRUSA_MMU2_S_MODE DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ + MMU2_MENUS DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING -exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2 | Servo | 3-Point + Debug | G38 ..." "$3" +exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2S | Servo | 3-Point + Debug | G38 ..." "$3" # # 5 runout sensors with distinct states # restore_configs +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO opt_set EXTRUDERS 5 opt_set NUM_SERVOS 1 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 1 +opt_set TEMP_SENSOR_3 1 +opt_set TEMP_SENSOR_4 1 opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ - PRUSA_MMU2 MMU2_MENUS PRUSA_MMU2_S_MODE DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ + DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULL -opt_set MIXING_STEPPERS 5 +opt_set NUM_RUNOUT_SENSORS 5 +opt_set FIL_RUNOUT2_PIN 44 +opt_set FIL_RUNOUT3_PIN 45 opt_set FIL_RUNOUT3_STATE HIGH +opt_set FIL_RUNOUT4_PIN 46 +opt_set FIL_RUNOUT5_PIN 47 exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" # diff --git a/platformio.ini b/platformio.ini index 1e0b84b625..862c42b01b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -93,7 +93,8 @@ default_src_filter = + - - + - - - - - - + - + - - - - - - @@ -101,7 +102,6 @@ default_src_filter = + - - + - - - - - - - - - - - - - @@ -304,7 +304,8 @@ PRINTER_EVENT_LEDS = src_filter=+ TEMP_STAT_LEDS = src_filter=+ MAX7219_DEBUG = src_filter=+ + MIXING_EXTRUDER = src_filter=+ + -PRUSA_MMU2 = src_filter=+ + +HAS_PRUSA_MMU1 = src_filter=+ +HAS_PRUSA_MMU2 = src_filter=+ + PASSWORD_FEATURE = src_filter=+ + ADVANCED_PAUSE_FEATURE = src_filter=+ + + AUTO_POWER_CONTROL = src_filter=+ @@ -312,8 +313,7 @@ HAS_POWER_MONITOR = src_filter=+ + + PROBE_TEMP_COMPENSATION = src_filter=+ + HAS_FILAMENT_SENSOR = src_filter=+ + -MK2_MULTIPLEXER = src_filter=+ -EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+ + +(EXT|MANUAL)_SOLENOID.* = src_filter=+ + HAS_CUTTER = src_filter=+ + EXPERIMENTAL_I2CBUS = src_filter=+ + MECHANICAL_GANTRY_CAL.+ = src_filter=+ From 29d45b1144ad93cac238d2a638b4dae5e3426e98 Mon Sep 17 00:00:00 2001 From: bosd Date: Thu, 19 Nov 2020 02:32:52 +0100 Subject: [PATCH 0600/1370] Fix broken #include (#20193) --- Marlin/src/feature/mmu/mmu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/mmu/mmu.cpp b/Marlin/src/feature/mmu/mmu.cpp index 2b48823ee7..9a448296bb 100644 --- a/Marlin/src/feature/mmu/mmu.cpp +++ b/Marlin/src/feature/mmu/mmu.cpp @@ -20,7 +20,7 @@ * */ -#include "../inc/MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if HAS_PRUSA_MMU1 From 11f08804d16ad0747afa87aa701e0b0e706406de Mon Sep 17 00:00:00 2001 From: JoAnn Manges Date: Wed, 18 Nov 2020 21:12:03 -0800 Subject: [PATCH 0601/1370] Use RTD for MAX31865 reading (#20188) --- Marlin/src/module/temperature.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 167b35cc2b..19de70b31c 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2248,10 +2248,7 @@ void Temperature::disable_all_heaters() { #if HAS_MAX31865 Adafruit_MAX31865 &maxref = MAX6675_SEL(max31865_0, max31865_1); - max6675_temp = int(maxref.temperature( - MAX6675_SEL(MAX31865_SENSOR_OHMS_0, MAX31865_SENSOR_OHMS_1), - MAX6675_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1) - )); + const uint16_t max31865_ohms = (uint32_t(maxref.readRTD()) * MAX6675_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1)) >> 16; #endif // @@ -2325,6 +2322,9 @@ void Temperature::disable_all_heaters() { if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; // Support negative temperature #endif + // Return the RTD resistance for MAX31865 for display in SHOW_TEMP_ADC_VALUES + TERN_(HAS_MAX31865, max6675_temp = max31865_ohms); + MAX6675_TEMP(hindex) = max6675_temp; return int(max6675_temp); From 1040f14da41003beee687317c3ad90c39c869b8a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 19 Nov 2020 02:32:33 -0300 Subject: [PATCH 0602/1370] Abort print on media removal (#20200) --- Marlin/src/sd/cardreader.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 1be5f4f2f6..4416f4e907 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -454,8 +454,17 @@ void CardReader::manage_media() { DEBUG_ECHOLNPGM("SD: No UI Detected."); } +/** + * "Release" the media by clearing the 'mounted' flag. + * Used by M22, "Release Media", manage_media. + */ void CardReader::release() { - endFilePrint(); + // Card removed while printing? Abort! + if (IS_SD_PRINTING()) + card.flag.abort_sd_printing = true; + else + endFilePrint(); + flag.mounted = false; flag.workDirIsRoot = true; #if ALL(SDCARD_SORT_ALPHA, SDSORT_USES_RAM, SDSORT_CACHE_NAMES) @@ -463,6 +472,10 @@ void CardReader::release() { #endif } +/** + * Open a G-code file and set Marlin to start processing it. + * Enqueues M23 and M24 commands to initiate a media print. + */ void CardReader::openAndPrintFile(const char *name) { char cmd[4 + strlen(name) + 1]; // Room for "M23 ", filename, and null extern const char M23_STR[]; @@ -472,6 +485,12 @@ void CardReader::openAndPrintFile(const char *name) { queue.enqueue_now_P(M24_STR); } +/** + * Start or resume a media print by setting the sdprinting flag. + * The file browser pre-sort is also purged to free up memory, + * since you cannot browse files during active printing. + * Used by M24 and anywhere Start / Resume applies. + */ void CardReader::startFileprint() { if (isMounted()) { flag.sdprinting = true; @@ -479,6 +498,9 @@ void CardReader::startFileprint() { } } +// +// Run tasks upon finishing or aborting a file print. +// void CardReader::endFilePrint(TERN_(SD_RESORT, const bool re_sort/*=false*/)) { TERN_(ADVANCED_PAUSE_FEATURE, did_pause_print = 0); TERN_(DWIN_CREALITY_LCD, HMI_flag.print_finish = flag.sdprinting); From 15febdfe074e8b60a8650ce57fce327c4997371e Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 19 Nov 2020 03:05:05 -0300 Subject: [PATCH 0603/1370] Fix Filament Change menu item labels (#20201) --- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 5f0afa4768..af8a4fc2b5 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -91,7 +91,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { BACK_ITEM(MSG_BACK); #if PREHEAT_COUNT LOOP_L_N(m, PREHEAT_COUNT) - ACTION_ITEM_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); + ACTION_ITEM_N_S(extruder, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); #endif EDIT_ITEM_FAST_N(int3, extruder, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[extruder].target, EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, From d92f69f137eec0efe794a747b7fe076359bbc13d Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 19 Nov 2020 19:09:51 +1300 Subject: [PATCH 0604/1370] Remaining Time followup (#20199) --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index b85d5adf2a..00968f4ba0 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -707,7 +707,7 @@ void MarlinUI::draw_status_message(const bool blink) { * |01234567890123456789| */ -inline uint8_t draw_elapsed_or_remaining_time(uint8_t timepos) { +inline uint8_t draw_elapsed_or_remaining_time(uint8_t timepos, const bool blink) { char buffer[14]; #if ENABLED(SHOW_REMAINING_TIME) @@ -716,7 +716,7 @@ inline uint8_t draw_elapsed_or_remaining_time(uint8_t timepos) { #if ENABLED(USE_M73_REMAINING_TIME) duration_t remaining = get_remaining_time(); #else - uint8_t progress = get_progress_percent(); + uint8_t progress = ui.get_progress_percent(); uint32_t elapsed = print_job_timer.duration(); duration_t remaining = (progress > 0) ? ((elapsed * 25600 / progress) >> 8) - elapsed : 0; #endif @@ -874,7 +874,7 @@ void MarlinUI::draw_status_screen() { lcd_put_u8str(i16tostr3rj(feedrate_percentage)); lcd_put_wchar('%'); - const uint8_t timepos = draw_elapsed_or_remaining_time(LCD_WIDTH - 1); + const uint8_t timepos = draw_elapsed_or_remaining_time(LCD_WIDTH - 1, blink); #if LCD_WIDTH >= 20 lcd_moveto(timepos - 7, 2); @@ -973,7 +973,7 @@ void MarlinUI::draw_status_screen() { #else - (void)draw_elapsed_or_remaining_time(LCD_WIDTH - 4); + (void)draw_elapsed_or_remaining_time(LCD_WIDTH - 4, blink); #endif From 40071c3fb9e299e389115636bfcd3b81650433df Mon Sep 17 00:00:00 2001 From: Maciej Rutkowski Date: Thu, 19 Nov 2020 11:49:44 +0100 Subject: [PATCH 0605/1370] Fix GTR NeoPixel pin with FYSETC Mini12864 (#20203) --- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index eb1e886fa4..60b2adbfa8 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -381,7 +381,7 @@ #define RGB_LED_B_PIN PG5 #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN PF13 + #define NEOPIXEL_PIN PG7 #endif #endif // !FYSETC_MINI_12864 From 0264841dc44abbe536409a1f298904de0d6976fa Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 19 Nov 2020 16:47:49 -0300 Subject: [PATCH 0606/1370] Reduce RAM usage for TFT Color UI on SGen-L V2 (#20209) --- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 8 ++++++-- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 7f9efcdb16..502c937588 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -268,8 +268,12 @@ #define LCD_PINS_ENABLE -1 #define LCD_PINS_RS -1 - #define TFT_BUFFER_SIZE 1200 - #define TFT_QUEUE_SIZE 6144 + #ifndef TFT_BUFFER_SIZE + #define TFT_BUFFER_SIZE 1200 + #endif + #ifndef TFT_QUEUE_SIZE + #define TFT_QUEUE_SIZE 6144 + #endif #define BTN_EN1 P3_25 #define BTN_EN2 P3_26 diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 8d2ce364b2..6dc0c1e8ff 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -251,7 +251,7 @@ * _____ _____ * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) - * (LCD_D4) 0.15 | · · 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · 0.9 (SD_MOSI) + * (LCD_D4) 0.15 | · · | 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · | 0.9 (SD_MOSI) * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST * GND | · · | 5V GND | · · | NC * ----- ----- @@ -318,7 +318,12 @@ #define LCD_PINS_ENABLE -1 #define LCD_PINS_RS -1 - #define TFT_BUFFER_SIZE 2400 + #ifndef TFT_BUFFER_SIZE + #define TFT_BUFFER_SIZE 1200 + #endif + #ifndef TFT_QUEUE_SIZE + #define TFT_QUEUE_SIZE 6144 + #endif #else // !MKS_12864OLED_SSD1306 From 5ef1d053eb1db92c8f245efe900f677851c4ad7e Mon Sep 17 00:00:00 2001 From: Till Date: Thu, 19 Nov 2020 21:07:47 +0100 Subject: [PATCH 0607/1370] Add Thermistor 20-21 notes (#19246) --- Marlin/Configuration.h | 6 ++++-- Marlin/src/module/thermistor/thermistor_21.h | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 4521895fdc..9d2dd0b710 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -375,8 +375,10 @@ * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" * 15 : 100k thermistor calibration for JGAurora A5 hotend * 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 - * 20 : Pt100 with circuit in the Ultimainboard V2.x with 5v excitation (AVR) - * 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....) + * 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage. + * NOTES: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21. + * 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v ADC reference voltage (STM32, LPC176x....) and 5V INA826 amplifier board supply. + * NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C. * 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB) * 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB) * 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup) diff --git a/Marlin/src/module/thermistor/thermistor_21.h b/Marlin/src/module/thermistor/thermistor_21.h index cd867df291..2ca705b950 100644 --- a/Marlin/src/module/thermistor/thermistor_21.h +++ b/Marlin/src/module/thermistor/thermistor_21.h @@ -26,7 +26,8 @@ #undef OV_SCALE #define OV_SCALE(N) (float((N) * 5) / 3.3f) -// Pt100 with INA826 amp with 3.3v excitation based on "Pt100 with INA826 amp on Ultimaker v2.0 electronics" +// Pt100 with INA826 amplifier board with 5v supply based on Thermistor 20, with 3v3 ADC reference on the mainboard. +// If the ADC reference and INA826 board supply voltage are identical, Thermistor 20 instead. const temp_entry_t temptable_21[] PROGMEM = { { OV( 0), 0 }, { OV(227), 1 }, From f1b32b808fb7349c32d0a3ea84acdd9275985669 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 19 Nov 2020 15:51:53 -0600 Subject: [PATCH 0608/1370] MKS WiFi preliminary changes --- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 4 +- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/gcode/feature/L6470/M916-918.cpp | 4 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 2 +- .../ftdi_eve_lib/extended/dl_cache.h | 13 ++--- .../ftdi_eve_lib/extended/tiny_timer.cpp | 6 +-- .../screens/bed_mesh_screen.cpp | 9 ++-- .../ftdi_eve_touch_ui/screens/boot_screen.cpp | 3 +- .../screens/files_screen.cpp | 14 ++--- .../ftdi_eve_touch_ui/screens/lock_screen.cpp | 31 +++++------ .../screens/save_settings_dialog_box.cpp | 5 +- .../lib/mks_ui/draw_advance_settings.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 6 +-- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 12 ++--- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 6 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 35 ++++++------ Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 8 ++- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 5 +- .../extui/lib/mks_ui/draw_wifi_settings.cpp | 12 ++--- .../lcd/extui/lib/mks_ui/draw_wifi_tips.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/irq_overrid.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 2 +- .../extui/lib/mks_ui/printer_operation.cpp | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 54 +++++++++---------- .../lib/mks_ui/tft_lvgl_configuration.cpp | 3 +- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 2 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/wifiSerial.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h | 8 +-- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 10 ++-- 33 files changed, 132 insertions(+), 156 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index ebf11cb429..7c9625d64c 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -111,7 +111,9 @@ constexpr bool serial_handles_emergency(int port) { // Instantiate all UARTs even if they are not needed // This avoids a bunch of logic to figure out every serial // port which may be in use on the system. -DEFINE_HWSERIAL_MARLIN(MSerial1, 1); +#if DISABLED(MKS_WIFI_MODULE) + DEFINE_HWSERIAL_MARLIN(MSerial1, 1); +#endif DEFINE_HWSERIAL_MARLIN(MSerial2, 2); DEFINE_HWSERIAL_MARLIN(MSerial3, 3); #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 60765c9833..5769da05d0 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -979,7 +979,7 @@ void setup() { #endif SERIAL_ECHO_MSG("start"); - #if BOTH(HAS_TFT_LVGL_UI, USE_WIFI_FUNCTION) + #if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) mks_esp_wifi_init(); WIFISERIAL.begin(WIFI_BAUDRATE); serial_connect_timeout = millis() + 1000UL; diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp index 8165b71e44..2672f91239 100644 --- a/Marlin/src/gcode/feature/L6470/M916-918.cpp +++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp @@ -308,8 +308,8 @@ void GcodeSuite::M917() { L64xxManager.set_param(axis_index[j], L6470_KVAL_HOLD, kval_hold); } DEBUG_ECHOLNPGM("."); - gcode.reset_stepper_timeout(); // reset_stepper_timeout to keep steppers powered - watchdog_refresh();; // beat the dog + gcode.reset_stepper_timeout(); // keep steppers powered + watchdog_refresh(); safe_delay(5000); status_composite_temp = 0; for (j = 0; j < driver_count; j++) { diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 9c36cca253..74be828c72 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -204,7 +204,7 @@ void TFTGLCD::print_line() { #endif } -void TFTGLCD::print_screen(){ +void TFTGLCD::print_screen() { if (!PanelDetected) return; framebuffer[FBSIZE - 2] = picBits & PIC_MASK; framebuffer[FBSIZE - 1] = ledBits; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h index 44934f909a..73b4b0bbc8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h @@ -29,15 +29,12 @@ * * The DLCache can be used like so: * - * void some_function() { - * DLCache dlcache(UNIQUE_ID); + * DLCache dlcache(UNIQUE_ID); * - * if (dlcache.hasData()) { - * dlcache.append(); - * } else { - * // Add stuff to the DL - * dlcache.store(); - * } + * if (dlcache.hasData()) + * dlcache.append(); + * else + * dlcache.store(); // Add stuff to the DL */ class DLCache { private: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp index 84233c5ce3..2147dd7c8f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp @@ -32,11 +32,7 @@ bool tiny_timer_t::elapsed(tiny_time_t duration) { #endif ); uint8_t elapsed = now - _start; - if (elapsed >= duration._duration) { - return true; - } else { - return false; - } + return elapsed >= duration._duration; } void tiny_timer_t::start() { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index eb8f742313..c54a7e04b5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -78,9 +78,9 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: } } } - if (val_cnt) { + if (val_cnt) val_mean /= val_cnt; - } else { + else { val_mean = 0; val_min = 0; val_max = 0; @@ -327,11 +327,10 @@ void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::pr screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; break; case ExtUI::MESH_FINISH: - if (screen_data.BedMeshScreen.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) { + if (screen_data.BedMeshScreen.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_COMPLETE; - } else { + else screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE; - } screen_data.BedMeshScreen.count = GRID_MAX_POINTS; break; case ExtUI::PROBE_START: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp index e79f25fcb5..40e49672d4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -72,7 +72,8 @@ void BootScreen::onIdle() { GOTO_SCREEN(TouchCalibrationScreen); current_screen.forget(); PUSH_SCREEN(StatusScreen); - } else { + } + else { if (!UIFlashStorage::is_valid()) { StatusScreen::loadBitmaps(); SpinnerDialogBox::show(GET_TEXT_F(MSG_PLEASE_WAIT)); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index 90e3040079..aed81045f4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -152,11 +152,11 @@ void FilesScreen::drawFooter() { #undef MARGIN_T #undef MARGIN_B #ifdef TOUCH_UI_PORTRAIT - #define MARGIN_T 15 - #define MARGIN_B 5 + #define MARGIN_T 15 + #define MARGIN_B 5 #else - #define MARGIN_T 5 - #define MARGIN_B 5 + #define MARGIN_T 5 + #define MARGIN_B 5 #endif const bool has_selection = screen_data.FilesScreen.selected_tag != 0xFF; const uint8_t back_tag = screen_data.FilesScreen.flags.is_root ? 240 : 245; @@ -170,11 +170,11 @@ void FilesScreen::drawFooter() { .tag(back_tag).button( BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BACK)) .enabled(has_selection) .colors(has_selection ? action_btn : normal_btn); - if (screen_data.FilesScreen.flags.is_dir) { + + if (screen_data.FilesScreen.flags.is_dir) cmd.tag(244).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN)); - } else { + else cmd.tag(243).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT)); - } } void FilesScreen::onRedraw(draw_mode_t what) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp index 35bbd7ad90..193bb681ec 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp @@ -122,28 +122,25 @@ char &LockScreen::message_style() { } void LockScreen::onPasscodeEntered() { - if (passcode == 0) { - // We are defining a passcode + if (passcode == 0) { // We are defining a passcode message_style() = 0; onRefresh(); sound.play(twinkle, PLAY_SYNCHRONOUS); passcode = compute_checksum(); GOTO_PREVIOUS(); - } else { - // We are verifying a passcode - if (passcode == compute_checksum()) { - message_style() = 'g'; - onRefresh(); - sound.play(twinkle, PLAY_SYNCHRONOUS); - GOTO_PREVIOUS(); - } - else { - message_style() = 'w'; - onRefresh(); - sound.play(sad_trombone, PLAY_SYNCHRONOUS); - current_screen.forget(); // Discard the screen the user was trying to go to. - GOTO_PREVIOUS(); - } + } + else if (passcode == compute_checksum()) { // We are verifying a passcode + message_style() = 'g'; + onRefresh(); + sound.play(twinkle, PLAY_SYNCHRONOUS); + GOTO_PREVIOUS(); + } + else { + message_style() = 'w'; + onRefresh(); + sound.play(sad_trombone, PLAY_SYNCHRONOUS); + current_screen.forget(); // Discard the screen the user was trying to go to. + GOTO_PREVIOUS(); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp index 350e2de7eb..eff0431a94 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp @@ -56,10 +56,9 @@ void SaveSettingsDialogBox::promptToSaveSettings() { // so SaveSettingsDialogBox doesn't return here. GOTO_SCREEN(SaveSettingsDialogBox); current_screen.forget(); - } else { - // No save needed. - GOTO_PREVIOUS(); } + else + GOTO_PREVIOUS(); // No save needed. } #endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp index dd6e484921..534fd6072c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_clear_advance_settings(); lv_draw_filament_settings(); break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case ID_WIFI_PARA: lv_clear_advance_settings(); lv_draw_wifi_settings(); @@ -75,7 +75,7 @@ void lv_draw_advance_settings(void) { int index = 0; lv_screen_menu_item(scr, machine_menu.PausePosition, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_POS, index++); lv_screen_menu_item(scr, machine_menu.FilamentConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FILAMENT_SETTINGS, index++); - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) lv_screen_menu_item(scr, machine_menu.WifiSettings, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_WIFI_PARA, index++); #endif #if HAS_ROTARY_ENCODER diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 0a36b09ce7..1fcb1bd2e2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -239,7 +239,7 @@ void lv_draw_dialog(uint8_t type) { lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) else if (DIALOG_IS(TYPE_UPLOAD_FILE)) { if (upload_result == 2) { btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); @@ -377,7 +377,7 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelDialog, DIALOG_UPDATE_NO_DEVICE_EN); lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) else if (DIALOG_IS(TYPE_UPLOAD_FILE)) { if (upload_result == 1) { lv_label_set_text(labelDialog, DIALOG_UPLOAD_ING_EN); @@ -418,7 +418,7 @@ void lv_draw_dialog(uint8_t type) { lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } } - #endif // USE_WIFI_FUNCTION + #endif // MKS_WIFI_MODULE else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat); lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index acf1d15325..9f7c936fb3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -122,7 +122,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { //if (res != LV_RES_OK) return; const char * ret_ta_txt = lv_ta_get_text(ext->ta); switch (keyboard_value) { - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case wifiName: memcpy(uiCfg.wifi_name,ret_ta_txt,sizeof(uiCfg.wifi_name)); lv_clear_keyboard(); @@ -158,7 +158,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { wifi_tips_type = TIPS_TYPE_JOINING; lv_draw_wifi_tips(); break; - #endif // USE_WIFI_FUNCTION + #endif // MKS_WIFI_MODULE case gcodeCommand: uint8_t buf[100]; strncpy((char *)buf,ret_ta_txt,sizeof(buf)); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index 07df598d8f..518ddbd251 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -180,10 +180,7 @@ void lv_draw_operation(void) { label_PowerOff = lv_label_create_empty(buttonPowerOff); if (uiCfg.print_state != WORKING) { - /* - label_Filament = lv_label_create_empty(buttonFilament); - } else { - */ + //label_Filament = lv_label_create_empty(buttonFilament); labelExtrusion = lv_label_create_empty(buttonExtrusion); label_Move = lv_label_create_empty(buttonMove); } @@ -210,11 +207,8 @@ void lv_draw_operation(void) { lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); if (uiCfg.print_state != WORKING) { - /* - lv_label_set_text(label_Filament, operation_menu.filament); - lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - } else { - */ + //lv_label_set_text(label_Filament, operation_menu.filament); + //lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(labelExtrusion, operation_menu.extr); lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index cee02cc47a..51d8cea15e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -219,7 +219,7 @@ void lv_draw_ready_print(void) { void lv_clear_ready_print() { #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) lv_group_remove_all_objs(g); + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); #endif lv_obj_del(scr); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index b2211e5631..939d91b7f1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -54,7 +54,7 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) char buf[6] = { 0 }; #endif switch (obj->mks_obj_id) { @@ -87,7 +87,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_ready_print(); break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case ID_S_WIFI: if (gCfgItems.wifi_mode_sel == STA_MODEL) { if (wifi_link_state == WIFI_CONNECTED) { @@ -135,7 +135,7 @@ void lv_draw_set(void) { #if HAS_LANG_SELECT_SCREEN lv_big_button_create(scr, "F:/bmp_language.bin", set_menu.language, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_LANGUAGE); #endif - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) lv_big_button_create(scr, "F:/bmp_wifi.bin", set_menu.wifi, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_WIFI); #endif lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_RETURN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index a6c96d6799..102234b090 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -138,7 +138,7 @@ void gCfgItems_init() { gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2; gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2; gCfgItems.cloud_enable = true; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) gCfgItems.wifi_mode_sel = STA_MODEL; gCfgItems.fileSysType = FILE_SYS_SD; gCfgItems.wifi_type = ESP_WIFI; @@ -203,7 +203,7 @@ void ui_cfg_init() { uiCfg.filament_unloading_time_flg = 0; uiCfg.filament_unloading_time_cnt = 0; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) memset(&wifiPara, 0, sizeof(wifiPara)); memset(&ipPara, 0, sizeof(ipPara)); strcpy(wifiPara.ap_name, WIFI_AP_NAME); @@ -542,7 +542,7 @@ char *getDispText(int index) { strcpy(public_buf_l, tool_menu.title); break; case WIFI_LIST_UI: - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) strcpy(public_buf_l, list_menu.title); break; #endif @@ -1040,7 +1040,7 @@ void GUI_RefreshPage() { */ break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: if (temps_update_flag) { disp_wifi_state(); @@ -1061,7 +1061,7 @@ void GUI_RefreshPage() { break; case DIALOG_UI: filament_dialog_handle(); - TERN_(USE_WIFI_FUNCTION, wifi_scan_handle()); + TERN_(MKS_WIFI_MODULE, wifi_scan_handle()); break; case MESHLEVELING_UI: /*disp_zpos();*/ @@ -1069,7 +1069,7 @@ void GUI_RefreshPage() { case HARDWARE_TEST_UI: break; case WIFI_LIST_UI: - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) if (printing_rate_update_flag) { disp_wifi_list(); printing_rate_update_flag = false; @@ -1080,7 +1080,7 @@ void GUI_RefreshPage() { /*update_password_disp(); update_join_state_disp();*/ break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_TIPS_UI: switch (wifi_tips_type) { case TIPS_TYPE_JOINING: @@ -1216,11 +1216,11 @@ void clear_cur_ui() { case TMC_CURRENT_UI: lv_clear_tmc_current_settings(); break; #endif case EEPROM_SETTINGS_UI: lv_clear_eeprom_settings(); break; - #if HAS_STEALTHCHOP - case TMC_MODE_UI: lv_clear_tmc_step_mode_settings(); break; - #endif + #if HAS_STEALTHCHOP + case TMC_MODE_UI: lv_clear_tmc_step_mode_settings(); break; + #endif #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_SETTINGS_UI: lv_clear_wifi_settings(); break; + case WIFI_SETTINGS_UI: lv_clear_wifi_settings(); break; #endif #if USE_SENSORLESS case HOMING_SENSITIVITY_UI: lv_clear_homing_sensitivity_settings(); break; @@ -1516,10 +1516,8 @@ lv_obj_t* lv_big_button_create(lv_obj_t *par, const char *img, const char *text, else lv_obj_align(label, btn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) - lv_group_add_obj(g, btn); - #endif + if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable)) + lv_group_add_obj(g, btn); return btn; } @@ -1535,11 +1533,8 @@ lv_obj_t* lv_screen_menu_item(lv_obj_t *par, const char *text, lv_coord_t x, lv_ lv_label_set_text(label, text); lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0); } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) { - lv_group_add_obj(g, btn); - } - #endif + if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable)) + lv_group_add_obj(g, btn); if (drawArrow) (void)lv_imgbtn_create(par, "F:/bmp_arrow.bin", x + PARA_UI_SIZE_X, y + PARA_UI_ARROW_V, cb, id); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 6d162676e8..a888217b9a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -76,7 +76,7 @@ #include "draw_keyboard.h" #include "draw_encoder_settings.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) #include "wifiSerial.h" #include "wifi_module.h" #include "wifi_upload.h" @@ -378,14 +378,12 @@ typedef enum { level_pos_x4, level_pos_y4, level_pos_x5, - level_pos_y5 + level_pos_y5, #if HAS_BED_PROBE - , x_offset, y_offset, - z_offset + z_offset, #endif - , load_length, load_speed, unload_length, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index 6f14c20d29..47a5dff048 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -26,7 +26,7 @@ #include #include "tft_lvgl_configuration.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) #include "draw_ui.h" @@ -159,5 +159,5 @@ void lv_clear_wifi() { lv_obj_del(scr); } -#endif // USE_WIFI_FUNCTION +#endif // MKS_WIFI_MODULE #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp index c826e36d42..f902edce7c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -26,7 +26,7 @@ #include #include "tft_lvgl_configuration.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) #include "draw_ui.h" @@ -170,6 +170,5 @@ void lv_clear_wifi_list() { lv_obj_del(scr); } -#endif // USE_WIFI_FUNCTION - +#endif // MKS_WIFI_MODULE #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp index 441720df82..9c8c094e4c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp @@ -26,7 +26,7 @@ #include #include "tft_lvgl_configuration.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) #include "draw_ui.h" @@ -96,7 +96,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_wifi_settings(void) { scr = lv_screen_create(WIFI_SETTINGS_UI, machine_menu.WifiConfTitle); - lv_obj_t *labelModelText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.wifiMode); + lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.wifiMode); lv_obj_t *buttonModelValue = lv_imgbtn_create(scr, "F:/bmp_blank_sel.bin", PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V, event_handler, ID_WIFI_MODEL); lv_btn_set_style_both(buttonModelValue, &style_para_value_pre); @@ -119,7 +119,7 @@ void lv_draw_wifi_settings(void) { lv_obj_t *line3 = lv_line_create(scr, nullptr); lv_ex_line(line3, line_points[2]); - lv_obj_t *labelCloudText = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.wifiCloud); + lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10, machine_menu.wifiCloud); lv_obj_t *buttonCloudValue = lv_imgbtn_create(scr, gCfgItems.cloud_enable ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V, event_handler, ID_WIFI_CLOUD); labelCloudValue = lv_label_create_empty(buttonCloudValue); @@ -141,14 +141,14 @@ void lv_draw_wifi_settings(void) { lv_label_set_text(labelModelValue, WIFI_STA_TEXT); lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER, 0, 0); } - strcat(public_buf_m, machine_menu.wifiName); + strcpy(public_buf_m, machine_menu.wifiName); strcat(public_buf_m, (const char *)uiCfg.wifi_name); lv_label_set_text(labelNameText, public_buf_m); lv_label_set_text(labelNameValue, machine_menu.wifiEdit); lv_obj_align(labelNameValue, buttonNameValue, LV_ALIGN_CENTER, 0, 0); - strcat(public_buf_m, machine_menu.wifiPassWord); + strcpy(public_buf_m, machine_menu.wifiPassWord); strcat(public_buf_m, (const char *)uiCfg.wifi_key); lv_label_set_text(labelPassWordText, public_buf_m); @@ -184,5 +184,5 @@ void lv_clear_wifi_settings() { lv_obj_del(scr); } -#endif // USE_WIFI_FUNCTION +#endif // MKS_WIFI_MODULE #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp index a9e5624996..7428d36488 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp @@ -26,7 +26,7 @@ #include #include "tft_lvgl_configuration.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) #include "draw_ui.h" @@ -64,5 +64,5 @@ void lv_draw_wifi_tips(void) { void lv_clear_wifi_tips() { lv_obj_del(scr); } -#endif // USE_WIFI_FUNCTION +#endif // MKS_WIFI_MODULE #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp index b9c7ccd9e6..128bf0b2d4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp @@ -25,7 +25,7 @@ #include "tft_lvgl_configuration.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) #include "draw_ui.h" #include "wifiSerial.h" @@ -66,5 +66,5 @@ void __irq_usart1(void) { } /* C-declarations for C++ */ #endif -#endif // USE_WIFI_FUNCTION +#endif // MKS_WIFI_MODULE #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 5ba7722f55..4dd84d0212 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -205,7 +205,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_enable.bin", "bmp_return.bin", - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) // wifi screen "bmp_wifi.bin", #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 4f700a16dc..58f9f4fce6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -148,7 +148,7 @@ void printer_state_polling() { if (uiCfg.print_state == WORKING) filament_check(); - TERN_(USE_WIFI_FUNCTION, wifi_looping()); + TERN_(MKS_WIFI_MODULE, wifi_looping()); } void filament_pin_setup() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index fa8d5a52a4..bb537527be 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -48,7 +48,7 @@ #define MACHINE_TYPE_CNOFIG_EN "Machine settings" #define MOTOR_CONFIG_EN "Motor settings" #define MACHINE_LEVELING_CONFIG_EN "Leveling settings" -#define ADVANCE_CONFIG_EN "Adavance settings" +#define ADVANCE_CONFIG_EN "Advanced settings" #define MACHINE_CONFIG_TITLE_EN "Machine Settings" #define MACHINE_TYPE_EN "Machine type" @@ -82,9 +82,9 @@ #define MIN_ENDSTOP_X_EN "X-axis minimum Endstop" #define MIN_ENDSTOP_Y_EN "Y-axis minimum Endstop" #define MIN_ENDSTOP_Z_EN "Z-axis minimum Endstop" -#define MAX_ENDSTOP_X_EN "X axis maximum Endstop" -#define MAX_ENDSTOP_Y_EN "Y axis maximum Endstop" -#define MAX_ENDSTOP_Z_EN "Z axis maximum Endstop" +#define MAX_ENDSTOP_X_EN "X-axis maximum Endstop" +#define MAX_ENDSTOP_Y_EN "Y-axis maximum Endstop" +#define MAX_ENDSTOP_Z_EN "Z-axis maximum Endstop" #define ENDSTOP_FIL_EN "Filament sensor" #define ENDSTOP_LEVEL_EN "Leveling sensor" #define ENDSTOP_OPENED_EN "Open" @@ -107,11 +107,11 @@ #define AUTO_LEVELING_ENABLE_EN "Enable auto leveling" #define BLTOUCH_LEVELING_ENABLE_EN "Enable BLtouch" #define PROBE_PORT_EN "Probe connector" -#define PROBE_X_OFFSET_EN "Probe x axis offset" -#define PROBE_Y_OFFSET_EN "Probe y axis offset" -#define PROBE_Z_OFFSET_EN "Probe z axis offset" -#define PROBE_XY_SPEED_EN "Probe xy axis speed" -#define PROBE_Z_SPEED_EN "Probe z axis speed" +#define PROBE_X_OFFSET_EN "Probe X-axis offset" +#define PROBE_Y_OFFSET_EN "Probe Y-axis offset" +#define PROBE_Z_OFFSET_EN "Probe Z-axis offset" +#define PROBE_XY_SPEED_EN "Probe XY-axis speed" +#define PROBE_Z_SPEED_EN "Probe Z-axis speed" #define ENABLE_EN "YES" #define DISABLE_EN "NO" #define Z_MIN_EN "ZMin" @@ -162,11 +162,11 @@ #define HOMEFEEDRATECONF_EN "Home speed setting" #define MAXFEEDRATE_CONF_TITLE_EN "Machine Settings>Maximum speed" -#define X_MAXFEEDRATE_EN "X axis maximum speed" -#define Y_MAXFEEDRATE_EN "Y axis maximum speed" -#define Z_MAXFEEDRATE_EN "Z axis maximum speed" -#define E0_MAXFEEDRATE_EN "E0 axis maximum speed" -#define E1_MAXFEEDRATE_EN "E1 axis maximum speed" +#define X_MAXFEEDRATE_EN "X-axis maximum speed" +#define Y_MAXFEEDRATE_EN "Y-axis maximum speed" +#define Z_MAXFEEDRATE_EN "Z-axis maximum speed" +#define E0_MAXFEEDRATE_EN "E0-axis maximum speed" +#define E1_MAXFEEDRATE_EN "E1-axis maximum speed" #define ACCELERATION_CONF_TITLE_EN "Machine Settings>Acceleration" #define PRINT_ACCELERATION_EN "Print acceleration" @@ -192,18 +192,18 @@ #define E1_STEPS_EN "E1-axis steps" #define TMC_CURRENT_CONF_TITLE_EN "Machine Settings>TMC current settings" -#define X_TMC_CURRENT_EN "X axis current (mA)" -#define Y_TMC_CURRENT_EN "Y axis current (mA)" -#define Z_TMC_CURRENT_EN "Z axis current (mA)" -#define E0_TMC_CURRENT_EN "E0 axis current (mA)" -#define E1_TMC_CURRENT_EN "E1 axis current (mA)" +#define X_TMC_CURRENT_EN "X-axis current (mA)" +#define Y_TMC_CURRENT_EN "Y-axis current (mA)" +#define Z_TMC_CURRENT_EN "Z-axis current (mA)" +#define E0_TMC_CURRENT_EN "E0-axis current (mA)" +#define E1_TMC_CURRENT_EN "E1-axis current (mA)" #define TMC_MODE_CONF_TITLE_EN "Machine Settings>TMC step mode settings" -#define X_TMC_MODE_EN "Whether X axis enable stealthChop modes" -#define Y_TMC_MODE_EN "Whether Y axis enable stealthChop modes" -#define Z_TMC_MODE_EN "Whether Z axis enable stealthChop modes" -#define E0_TMC_MODE_EN "Whether E0 axis enable stealthChop modes" -#define E1_TMC_MODE_EN "Whether E1 axis enable stealthChop modes" +#define X_TMC_MODE_EN "Whether X-axis enable stealthChop modes" +#define Y_TMC_MODE_EN "Whether Y-axis enable stealthChop modes" +#define Z_TMC_MODE_EN "Whether Z-axis enable stealthChop modes" +#define E0_TMC_MODE_EN "Whether E0-axis enable stealthChop modes" +#define E1_TMC_MODE_EN "Whether E1-axis enable stealthChop modes" #define MOTORDIR_CONF_TITLE_EN "Machine Settings>Motor direction" #define X_MOTORDIR_EN "X-axis motor direction invert" @@ -241,9 +241,9 @@ #define E_ENABLE_PINS_INVERT_EN "E_ENABLE_PIN_INVERT" #define PAUSE_POSITION_EN "Printing pause position settings" -#define PAUSE_POSITION_X_EN "X axis position (Absolute position,-1 invalid)" -#define PAUSE_POSITION_Y_EN "Y axis position (Absolute position,-1 invalid)" -#define PAUSE_POSITION_Z_EN "Z axis position (Relative position,-1 invalid)" +#define PAUSE_POSITION_X_EN "X-axis position (Absolute position,-1 invalid)" +#define PAUSE_POSITION_Y_EN "Y-axis position (Absolute position,-1 invalid)" +#define PAUSE_POSITION_Z_EN "Z-axis position (Relative position,-1 invalid)" #define WIFI_SETTINGS_TITLE_EN "Machine Settings>Wi-Fi Parameter" #define WIFI_SETTINGS_MODE_EN "Wi-Fi Mode" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 9b8e3e1589..9e383a6abd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -84,7 +84,7 @@ uint8_t bmp_public_buf[17 * 1024]; void SysTick_Callback() { lv_tick_inc(1); print_time_count(); - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) if (tips_disp.timer == TIPS_TIMER_START) tips_disp.timer_count++; #endif @@ -523,7 +523,6 @@ void lv_encoder_pin_init() { const uint8_t enc_c = (buttons & EN_C) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; if (enc_c != last_button_state) { state = enc_c ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; - last_button_state = enc_c; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index 727ab33aea..df28893f41 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -33,7 +33,7 @@ #include //#define TFT_ROTATION TFT_ROTATE_180 -#define USE_WIFI_FUNCTION 0 +#define MKS_WIFI_MODULE 0 extern void tft_lvgl_init(); extern void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index e230195eab..c3c0f37365 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -853,7 +853,7 @@ void disp_language_init() { machine_menu.key_point = KEYBOARD_KEY_POINT_EN; machine_menu.negative = KEYBOARD_KEY_NEGATIVE_EN; // wifi-list - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) list_menu.title = TEXT_WIFI_MENU_TITLE_EN; list_menu.file_pages = FILE_PAGES_EN; @@ -861,7 +861,7 @@ void disp_language_init() { tips_menu.joining = TEXT_WIFI_JOINING_EN; tips_menu.failedJoin = TEXT_WIFI_FAILED_JOIN_EN; tips_menu.wifiConected = TEXT_WIFI_WIFI_CONECTED_EN; - #endif //USE_WIFI_FUNCTION + #endif //MKS_WIFI_MODULE machine_setting_disp(); operation_menu.babystep = TEXT_BABY_STEP_EN; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp index 16b65c7ea3..93fce6af30 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp @@ -25,7 +25,7 @@ #include "tft_lvgl_configuration.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) #include "draw_ui.h" #include "wifiSerial.h" @@ -118,5 +118,5 @@ int WifiSerial::wifi_rb_is_full(void) { return rb_is_full(this->usart_device->rb); } -#endif // USE_WIFI_FUNCTION +#endif // MKS_WIFI_MODULE #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h index 9d3946fee7..3206666bef 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h @@ -23,10 +23,10 @@ #include "tft_lvgl_configuration.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) -#if SERIAL_PORT_2 != -1 - #error "SERIAL_PORT_2 must be set to -1 with HAS_TFT_LVGL_UI and USE_WIFI_FUNCTION." +#ifdef SERIAL_PORT_2 + #error "SERIAL_PORT_2 must be disabled with HAS_TFT_LVGL_UI and MKS_WIFI_MODULE." #endif #define WIFI_BAUDRATE 115200 @@ -99,4 +99,4 @@ extern WifiSerial WifiSerial1; #define WIFISERIAL WifiSerial1 -#endif // USE_WIFI_FUNCTION +#endif // MKS_WIFI_MODULE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index bfc23f238c..eeeff4fa31 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -27,7 +27,7 @@ #include "wifi_module.h" #include "wifi_upload.h" -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" @@ -283,7 +283,7 @@ void esp_port_begin(uint8_t interrupt) { } #endif if (interrupt) { - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) WIFISERIAL.end(); for (uint16_t i = 0; i < 65535; i++); WIFISERIAL.begin(WIFI_BAUDRATE); @@ -293,7 +293,7 @@ void esp_port_begin(uint8_t interrupt) { #endif } else { - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) WIFISERIAL.end(); for (uint16_t i = 0; i < 65535; i++); WIFISERIAL.begin(WIFI_UPLOAD_BAUDRATE); @@ -305,7 +305,7 @@ void esp_port_begin(uint8_t interrupt) { } } -#if ENABLED(USE_WIFI_FUNCTION) +#if ENABLED(MKS_WIFI_MODULE) int raw_send_to_wifi(char *buf, int len) { if (buf == 0 || len <= 0) return 0; @@ -1811,5 +1811,5 @@ int readWifiBuf(int8_t *buf, int32_t len) { return i; } -#endif // USE_WIFI_FUNCTION +#endif // MKS_WIFI_MODULE #endif // HAS_TFT_LVGL_UI From 7729a0c3bb43951d136946cd74c778d5f926ae3e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 19 Nov 2020 17:28:45 -0600 Subject: [PATCH 0609/1370] More MKS WiFi --- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 18 +++++++++--------- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 102234b090..46c1ab8279 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -1161,7 +1161,7 @@ void clear_cur_ui() { case ABOUT_UI: lv_clear_about(); break; case LOG_UI: /* Clear_Connect(); */ break; case DISK_UI: /* Clear_Disk(); */ break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: lv_clear_wifi(); break; #endif case MORE_UI: /* Clear_more(); */ break; @@ -1178,11 +1178,11 @@ void clear_cur_ui() { case TOOL_UI: lv_clear_tool(); break; case MESHLEVELING_UI: /* Clear_MeshLeveling(); */ break; case HARDWARE_TEST_UI: /* Clear_Hardwaretest(); */ break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_LIST_UI: lv_clear_wifi_list(); break; #endif case KEY_BOARD_UI: lv_clear_keyboard(); break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_TIPS_UI: lv_clear_wifi_tips(); break; #endif case MACHINE_PARA_UI: lv_clear_machine_para(); break; @@ -1219,7 +1219,7 @@ void clear_cur_ui() { #if HAS_STEALTHCHOP case TMC_MODE_UI: lv_clear_tmc_step_mode_settings(); break; #endif - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_SETTINGS_UI: lv_clear_wifi_settings(); break; #endif #if USE_SENSORLESS @@ -1267,7 +1267,7 @@ void draw_return_ui() { case CALIBRATE_UI: /* draw_calibrate(); */ break; case DISK_UI: /* draw_Disk(); */ break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: lv_draw_wifi(); break; #endif case MORE_UI: /* draw_More(); */ break; @@ -1281,11 +1281,11 @@ void draw_return_ui() { case TOOL_UI: lv_draw_tool(); break; case MESHLEVELING_UI: /* draw_meshleveling(); */ break; case HARDWARE_TEST_UI: /* draw_Hardwaretest(); */ break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_LIST_UI: lv_draw_wifi_list(); break; #endif case KEY_BOARD_UI: lv_draw_keyboard(); break; - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_TIPS_UI: lv_draw_wifi_tips(); break; #endif case MACHINE_PARA_UI: lv_draw_machine_para(); break; @@ -1325,7 +1325,7 @@ void draw_return_ui() { #if HAS_STEALTHCHOP case TMC_MODE_UI: lv_draw_tmc_step_mode_settings(); break; #endif - #if ENABLED(USE_WIFI_FUNCTION) + #if ENABLED(MKS_WIFI_MODULE) case WIFI_SETTINGS_UI: lv_draw_wifi_settings(); break; #endif #if USE_SENSORLESS @@ -1620,7 +1620,7 @@ void LV_TASK_HANDLER() { GUI_RefreshPage(); - TERN_(USE_WIFI_FUNCTION, get_wifi_commands()); + TERN_(MKS_WIFI_MODULE, get_wifi_commands()); //sd_detection(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index d67cb8cc29..1de5571276 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, USE_WIFI_FUNCTION) +#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) #include "draw_ui.h" #include "wifi_module.h" @@ -822,4 +822,4 @@ int32_t wifi_upload(int type) { return esp_upload.uploadResult == success ? 0 : -1; } -#endif // HAS_TFT_LVGL_UI && USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI && MKS_WIFI_MODULE From 48c2065a17acf3d8a1843edda6dafa48c8a74c86 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 19 Nov 2020 17:37:43 -0600 Subject: [PATCH 0610/1370] MKS WiFi strings --- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index bb537527be..36aa21e126 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -165,8 +165,8 @@ #define X_MAXFEEDRATE_EN "X-axis maximum speed" #define Y_MAXFEEDRATE_EN "Y-axis maximum speed" #define Z_MAXFEEDRATE_EN "Z-axis maximum speed" -#define E0_MAXFEEDRATE_EN "E0-axis maximum speed" -#define E1_MAXFEEDRATE_EN "E1-axis maximum speed" +#define E0_MAXFEEDRATE_EN "E0 maximum speed" +#define E1_MAXFEEDRATE_EN "E1 maximum speed" #define ACCELERATION_CONF_TITLE_EN "Machine Settings>Acceleration" #define PRINT_ACCELERATION_EN "Print acceleration" @@ -175,49 +175,49 @@ #define X_ACCELERATION_EN "X-axis acceleration" #define Y_ACCELERATION_EN "Y-axis acceleration" #define Z_ACCELERATION_EN "Z-axis acceleration" -#define E0_ACCELERATION_EN "E0-axis acceleration" -#define E1_ACCELERATION_EN "E1-axis acceleration" +#define E0_ACCELERATION_EN "E0 acceleration" +#define E1_ACCELERATION_EN "E1 acceleration" #define JERK_CONF_TITLE_EN "Machine Settings>Jerk speed" #define X_JERK_EN "X-axis jerk speed" #define Y_JERK_EN "Y-axis jerk speed" #define Z_JERK_EN "J-axis jerk speed" -#define E_JERK_EN "E-axis jerk speed" +#define E_JERK_EN "Extruder jerk speed" #define STEPS_CONF_TITLE_EN "Machine Settings>Steps settings" #define X_STEPS_EN "X-axis steps" -#define Y_STEPS_EN "Y-axis stepS" -#define Z_STEPS_EN "Z-axis stepS" -#define E0_STEPS_EN "E0-axis steps" -#define E1_STEPS_EN "E1-axis steps" +#define Y_STEPS_EN "Y-axis steps" +#define Z_STEPS_EN "Z-axis steps" +#define E0_STEPS_EN "E0 steps" +#define E1_STEPS_EN "E1 steps" #define TMC_CURRENT_CONF_TITLE_EN "Machine Settings>TMC current settings" #define X_TMC_CURRENT_EN "X-axis current (mA)" #define Y_TMC_CURRENT_EN "Y-axis current (mA)" #define Z_TMC_CURRENT_EN "Z-axis current (mA)" -#define E0_TMC_CURRENT_EN "E0-axis current (mA)" -#define E1_TMC_CURRENT_EN "E1-axis current (mA)" +#define E0_TMC_CURRENT_EN "E0 current (mA)" +#define E1_TMC_CURRENT_EN "E1 current (mA)" #define TMC_MODE_CONF_TITLE_EN "Machine Settings>TMC step mode settings" -#define X_TMC_MODE_EN "Whether X-axis enable stealthChop modes" -#define Y_TMC_MODE_EN "Whether Y-axis enable stealthChop modes" -#define Z_TMC_MODE_EN "Whether Z-axis enable stealthChop modes" -#define E0_TMC_MODE_EN "Whether E0-axis enable stealthChop modes" -#define E1_TMC_MODE_EN "Whether E1-axis enable stealthChop modes" +#define X_TMC_MODE_EN "Whether X-axis enables stealthChop mode" +#define Y_TMC_MODE_EN "Whether Y-axis enables stealthChop mode" +#define Z_TMC_MODE_EN "Whether Z-axis enables stealthChop mode" +#define E0_TMC_MODE_EN "Whether E0 enables stealthChop mode" +#define E1_TMC_MODE_EN "Whether E1 enables stealthChop mode" #define MOTORDIR_CONF_TITLE_EN "Machine Settings>Motor direction" #define X_MOTORDIR_EN "X-axis motor direction invert" #define Y_MOTORDIR_EN "Y-axis motor direction invert" #define Z_MOTORDIR_EN "Z-axis motor direction invert" -#define E0_MOTORDIR_EN "E0-axis motor direction invert" -#define E1_MOTORDIR_EN "E1-axis motor direction invert" +#define E0_MOTORDIR_EN "E0 motor direction invert" +#define E1_MOTORDIR_EN "E1 motor direction invert" #define INVERT_P_EN "YES" #define INVERT_N_EN "NO" #define HOMEFEEDRATE_CONF_TITLE_EN "Machine Settings>Home speed" -#define X_HOMESPEED_EN "XY-axis Home speed" -#define Y_HOMESPEED_EN "Y-axis Home speed" -#define Z_HOMESPEED_EN "Z-axis Home speed" +#define X_HOMESPEED_EN "XY-axis home speed" +#define Y_HOMESPEED_EN "Y-axis home speed" +#define Z_HOMESPEED_EN "Z-axis home speed" #define ADVANCED_CONF_TITLE_EN "Machine Settings>Advance" #define PWROFF_DECTION_EN "power off dection module" @@ -260,10 +260,10 @@ #define OFFSET_Z_EN "Z offset" #define HOMING_SENSITIVITY_CONF_TITLE_EN "Machine Settings>Sensitivity" -#define X_SENSITIVITY_EN "X Axis Sensitivity" -#define Y_SENSITIVITY_EN "Y Axis Sensitivity" -#define Z_SENSITIVITY_EN "Z Axis Sensitivity" -#define Z2_SENSITIVITY_EN "Z2 Axis Sensitivity" +#define X_SENSITIVITY_EN "X-axis sensitivity" +#define Y_SENSITIVITY_EN "Y-axis sensitivity" +#define Z_SENSITIVITY_EN "Z-axis sensitivity" +#define Z2_SENSITIVITY_EN "Z2-axis sensitivity" #define ENCODER_CONF_TITLE_EN "Machine Settings>Rotary encoder settings" #define ENCODER_CONF_TEXT_EN "Is the encoder function used?" From 2e193b9a29d4fcf20abeee83fb332f199a6fe7bf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 19 Nov 2020 17:41:16 -0600 Subject: [PATCH 0611/1370] Fix Z label --- Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 36aa21e126..41bf82e80f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -181,7 +181,7 @@ #define JERK_CONF_TITLE_EN "Machine Settings>Jerk speed" #define X_JERK_EN "X-axis jerk speed" #define Y_JERK_EN "Y-axis jerk speed" -#define Z_JERK_EN "J-axis jerk speed" +#define Z_JERK_EN "Z-axis jerk speed" #define E_JERK_EN "Extruder jerk speed" #define STEPS_CONF_TITLE_EN "Machine Settings>Steps settings" From afd3ee264bdef29bd67a4be2648c5fe0f71b3184 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Fri, 20 Nov 2020 04:49:12 +0500 Subject: [PATCH 0612/1370] Windows LPC Upload for non-admins (#20208) Co-authored-by: Victor Mateus Oliveira Co-authored-by: Scott Lahteine --- Marlin/src/HAL/LPC1768/upload_extra_script.py | 88 +++++++------------ 1 file changed, 33 insertions(+), 55 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py index 9b0d0617a0..1daaa883ed 100755 --- a/Marlin/src/HAL/LPC1768/upload_extra_script.py +++ b/Marlin/src/HAL/LPC1768/upload_extra_script.py @@ -23,63 +23,50 @@ def print_error(e): %(e, env.get('PIOENV'))) try: + # + # Find a disk for upload + # + upload_disk = 'Disk not found' + target_file_found = False + target_drive_found = False if current_OS == 'Windows': # # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' # Windows - doesn't care about the disk's name, only cares about the drive letter - # - - # - # get all drives on this computer - # import subprocess - # typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' - driveStr = str(subprocess.check_output("fsutil fsinfo drives")) - # typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' - # driveStr = driveStr.strip().lstrip('Drives: ') <- Doesn't work in other Languages as English. In German is "Drives:" = "Laufwerke:" - FirstFound = driveStr.find(':',0,-1) # Find the first ":" and - driveStr = driveStr[FirstFound + 1 : -1] # truncate to the rest - # typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\', - # 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\'] - drives = driveStr.split() + from ctypes import windll + import string + + # getting list of drives + # https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python + drives = [] + bitmask = windll.kernel32.GetLogicalDrives() + for letter in string.ascii_uppercase: + if bitmask & 1: + drives.append(letter) + bitmask >>= 1 - upload_disk = 'Disk not found' - target_file_found = False - target_drive_found = False for drive in drives: - final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:' + final_drive_name = drive + ':\\' + # print ('disc check: {}'.format(final_drive_name)) try: volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT)) except Exception as e: + print ('error:{}'.format(e)) continue else: - if target_drive in volume_info and target_file_found == False: # set upload if not found target file yet + if target_drive in volume_info and not target_file_found: # set upload if not found target file yet target_drive_found = True upload_disk = final_drive_name if target_filename in volume_info: - if target_file_found == False: + if not target_file_found: upload_disk = final_drive_name target_file_found = True - # - # set upload_port to drive if found - # - - if target_file_found == True or target_drive_found == True: - env.Replace( - UPLOAD_PORT=upload_disk - ) - print('upload disk: ', upload_disk) - else: - print_error('Autodetect Error') - elif current_OS == 'Linux': # # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive' # - upload_disk = 'Disk not found' - target_file_found = False - target_drive_found = False drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser())) if target_drive in drives: # If target drive is found, use it. target_drive_found = True @@ -101,22 +88,15 @@ try: if target_file_found or target_drive_found: env.Replace( - UPLOAD_FLAGS="-P$UPLOAD_PORT", - UPLOAD_PORT=upload_disk + UPLOAD_FLAGS="-P$UPLOAD_PORT" ) - print('upload disk: ', upload_disk) - else: - print_error('Autodetect Error') elif current_OS == 'Darwin': # MAC # # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive' # - upload_disk = 'Disk not found' drives = os.listdir('/Volumes') # human readable names - target_file_found = False - target_drive_found = False - if target_drive in drives and target_file_found == False: # set upload if not found target file yet + if target_drive in drives and not target_file_found: # set upload if not found target file yet target_drive_found = True upload_disk = '/Volumes/' + target_drive + '/' for drive in drives: @@ -126,20 +106,18 @@ try: continue else: if target_filename in filenames: - if target_file_found == False: + if not target_file_found: upload_disk = '/Volumes/' + drive + '/' target_file_found = True - # - # set upload_port to drive if found - # - if target_file_found == True or target_drive_found == True: - env.Replace( - UPLOAD_PORT=upload_disk - ) - print('\nupload disk: ', upload_disk, '\n') - else: - print_error('Autodetect Error') + # + # Set upload_port to drive if found + # + if target_file_found or target_drive_found: + env.Replace(UPLOAD_PORT=upload_disk) + print('\nUpload disk: ', upload_disk, '\n') + else: + print_error('Autodetect Error') except Exception as e: print_error(str(e)) From 2abde8a068ff74227eb10ea137a5e4febec77f25 Mon Sep 17 00:00:00 2001 From: Orel <37673727+0r31@users.noreply.github.com> Date: Fri, 20 Nov 2020 01:08:21 +0100 Subject: [PATCH 0613/1370] Fix DAC setDrvPct (#20205) --- Marlin/src/feature/dac/dac_mcp4728.cpp | 4 ++-- Marlin/src/feature/dac/dac_mcp4728.h | 2 +- Marlin/src/feature/dac/stepper_dac.cpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index c7a6370e17..4f33c4e050 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -123,8 +123,8 @@ uint8_t MCP4728::getDrvPct(const uint8_t channel) { return uint8_t(100.0 * dac_v * Receives all Drive strengths as 0-100 percent values, updates * DAC Values array and calls fastwrite to update the DAC. */ -void MCP4728::setDrvPct(xyze_uint8_t &pct) { - dac_values *= pct.asFloat() * 0.01f * (DAC_STEPPER_MAX); +void MCP4728::setDrvPct(xyze_uint_t &pct) { + dac_values = pct * (DAC_STEPPER_MAX) * 0.01f; fastWrite(); } diff --git a/Marlin/src/feature/dac/dac_mcp4728.h b/Marlin/src/feature/dac/dac_mcp4728.h index 571716d483..3a7d5f10f6 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.h +++ b/Marlin/src/feature/dac/dac_mcp4728.h @@ -76,7 +76,7 @@ public: static uint8_t fastWrite(); static uint8_t simpleCommand(const byte simpleCommand); static uint8_t getDrvPct(const uint8_t channel); - static void setDrvPct(xyze_uint8_t &pct); + static void setDrvPct(xyze_uint_t &pct); }; extern MCP4728 mcp4728; diff --git a/Marlin/src/feature/dac/stepper_dac.cpp b/Marlin/src/feature/dac/stepper_dac.cpp index 5f10b4ccfb..5170a35511 100644 --- a/Marlin/src/feature/dac/stepper_dac.cpp +++ b/Marlin/src/feature/dac/stepper_dac.cpp @@ -33,7 +33,7 @@ bool dac_present = false; constexpr xyze_uint8_t dac_order = DAC_STEPPER_ORDER; -xyze_uint8_t dac_channel_pct = DAC_MOTOR_CURRENT_DEFAULT; +xyze_uint_t dac_channel_pct = DAC_MOTOR_CURRENT_DEFAULT; StepperDAC stepper_dac; @@ -72,8 +72,8 @@ void StepperDAC::set_current_percent(const uint8_t channel, float val) { set_current_value(channel, _MIN(val, 100.0f) * (DAC_STEPPER_MAX) / 100.0f); } -static float dac_perc(int8_t n) { return 100.0 * mcp4728.getValue(dac_order[n]) * RECIPROCAL(DAC_STEPPER_MAX); } -static float dac_amps(int8_t n) { return mcp4728.getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE); } +static float dac_perc(int8_t n) { return mcp4728.getDrvPct(dac_order[n]); } +static float dac_amps(int8_t n) { return mcp4728.getValue(dac_order[n]) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE * 1000); } uint8_t StepperDAC::get_current_percent(const AxisEnum axis) { return mcp4728.getDrvPct(dac_order[axis]); } void StepperDAC::set_current_percents(xyze_uint8_t &pct) { From 35d3e74267a3916328524599a07b177471e386b7 Mon Sep 17 00:00:00 2001 From: Ajtak Date: Fri, 20 Nov 2020 01:25:27 +0100 Subject: [PATCH 0614/1370] Longer LK Pro / Alfawise PRO board (#20185) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 ++ Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h | 38 ++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index b60f73c2dc..e68ba196ee 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -113,6 +113,7 @@ #define BOARD_RAMPS_S_12_EEFB 1157 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_RAMPS_S_12_EEEB 1158 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed) #define BOARD_RAMPS_S_12_EFFB 1159 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed) +#define BOARD_RAMPS_LONGER3D_LK4PRO 1160 // Longer LKxxPRO/ Alfawise UxxPro (PRO version) // // RAMBo and derivatives diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index e9eee4f371..af3b724756 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -220,6 +220,8 @@ #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 #elif MB(RAMPS_S_12_EFFB) #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 +#elif MB(RAMPS_LONGER3D_LKPRO) + #include "ramps/pins_LONGER3D_LK4PRO.h" // ATmega2560 env:mega2560 // // RAMBo and derivatives diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h new file mode 100644 index 0000000000..8acf4e2f4f --- /dev/null +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// Longer UI assumptions +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "Longer UI supports only 1 hotend / E-stepper." +#endif + +#define BOARD_INFO_NAME "LGT Kit 1.0" + +#define SD_DETECT_PIN 49 +#define FIL_RUNOUT_PIN 2 +#define Z_MIN_PIN 35 + +// +// Import RAMPS 1.4 pins +// +#include "pins_RAMPS.h" From 7ad127668dcd15fad58384f6f0d8c92d2a3c3013 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 19 Nov 2020 23:09:33 -0300 Subject: [PATCH 0615/1370] Missing header to use suicide() on LVGL UI (#20214) --- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index 939d91b7f1..0ccb274153 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -37,6 +37,10 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" +#if HAS_SUICIDE + #include "../../../../MarlinCore.h" +#endif + static lv_obj_t *scr; extern lv_group_t* g; From 264e921d3f87ec8c9407e0ce73869c55561ba213 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 20 Nov 2020 10:46:18 -0300 Subject: [PATCH 0616/1370] SINGLE_TOUCH_NAVIGATION Follow Up (#20213) --- Marlin/src/lcd/tft/touch.cpp | 3 ++- Marlin/src/lcd/tft/touch.h | 1 + Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 112ff0b438..7a45851a5d 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -156,10 +156,11 @@ void Touch::touch(touch_control_t *control) { case MENU_SCREEN: ui.goto_screen((screenFunc_t)control->data); break; case BACK: ui.goto_previous_screen(); break; - case CLICK: + case MENU_CLICK: TERN_(SINGLE_TOUCH_NAVIGATION, ui.encoderPosition = control->data); ui.lcd_clicked = true; break; + case CLICK: ui.lcd_clicked = true; break; #if HAS_RESUME_CONTINUE case RESUME_CONTINUE: extern bool wait_for_user; wait_for_user = false; break; #endif diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h index 8023f649ce..6726f031ff 100644 --- a/Marlin/src/lcd/tft/touch.h +++ b/Marlin/src/lcd/tft/touch.h @@ -45,6 +45,7 @@ enum TouchControlType : uint16_t { PAGE_UP, PAGE_DOWN, CLICK, + MENU_CLICK, RESUME_CONTINUE, SLIDER, INCREASE, diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 3444cfe12f..45a91cd5e5 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -652,7 +652,7 @@ void menu_item(const uint8_t row, bool sel ) { menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); #if ENABLED(TOUCH_SCREEN) - const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? CLICK : MENU_ITEM; + const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? MENU_CLICK : MENU_ITEM; touch.add_control(tct, 0, 2 + 34 * row, TFT_WIDTH, 32, encoderTopLine + row); #endif } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 285e55631a..d152acdf77 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -659,7 +659,7 @@ void menu_item(const uint8_t row, bool sel ) { menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); #if ENABLED(TOUCH_SCREEN) - const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? CLICK : MENU_ITEM; + const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? MENU_CLICK : MENU_ITEM; touch.add_control(tct, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row); #endif } From 7f84a7a85e48307c72198d7574b59f760abf5d8b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 20 Nov 2020 17:41:01 -0600 Subject: [PATCH 0617/1370] Printrboard labels --- Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 2 +- platformio.ini | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index 22edb70213..ea4b950a17 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -30,7 +30,7 @@ #endif #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "PRINTRBOARD_G2" + #define BOARD_INFO_NAME "Printrboard G2" #endif // diff --git a/platformio.ini b/platformio.ini index 862c42b01b..9fb4904020 100644 --- a/platformio.ini +++ b/platformio.ini @@ -587,8 +587,8 @@ lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet # # AT90USB1286 boards using DFU bootloader -# - PrintrBoard -# - PrintrBoard Rev.F +# - Printrboard +# - Printrboard Rev.F # - ? 5DPRINT ? # [env:at90usb1286_dfu] From 9ebe05064686d7d4f444c642920ea30ca5ce81f4 Mon Sep 17 00:00:00 2001 From: Kurt Haenen Date: Sat, 21 Nov 2020 02:48:53 +0100 Subject: [PATCH 0618/1370] Fix backward Filament (Presence) Sensor pulls (#20228) Co-authored-by: Kurt Haenen Co-authored-by: Scott Lahteine --- Marlin/src/feature/runout.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index aa1ccc9cc5..e1b9ca11b7 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -149,7 +149,7 @@ class FilamentSensorBase { public: static inline void setup() { - #define _INIT_RUNOUT_PIN(P,S,U) do{ if (DISABLED(U)) SET_INPUT(P); else if (S) SET_INPUT_PULLDOWN(P); else SET_INPUT_PULLUP(P); }while(0) + #define _INIT_RUNOUT_PIN(P,S,U) do{ if (DISABLED(U)) SET_INPUT(P); else if (S) SET_INPUT_PULLUP(P); else SET_INPUT_PULLDOWN(P); }while(0) #define INIT_RUNOUT_PIN(N) _INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN, FIL_RUNOUT##N##_STATE, FIL_RUNOUT##N##_PULL) #if NUM_RUNOUT_SENSORS >= 1 INIT_RUNOUT_PIN(1); From d5e13f255d8b8d6af6c241c82bedc14aa88de01d Mon Sep 17 00:00:00 2001 From: Simone Primarosa Date: Sat, 21 Nov 2020 02:53:04 +0100 Subject: [PATCH 0619/1370] Fix bad SET_FAST_PWM_FREQ calls (#20227) --- Marlin/src/module/temperature.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 19de70b31c..d9ce6e151e 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1683,12 +1683,12 @@ void Temperature::updateTemperaturesFromRawValues() { #endif #define INIT_FAN_PIN(P) do{ _INIT_FAN_PIN(P); SET_FAST_PWM_FREQ(P); }while(0) #if EXTRUDER_AUTO_FAN_SPEED != 255 - #define INIT_E_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(FAST_PWM_FAN_FREQUENCY); } else SET_OUTPUT(P); }while(0) + #define INIT_E_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0) #else #define INIT_E_AUTO_FAN_PIN(P) SET_OUTPUT(P) #endif #if CHAMBER_AUTO_FAN_SPEED != 255 - #define INIT_CHAMBER_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(FAST_PWM_FAN_FREQUENCY); } else SET_OUTPUT(P); }while(0) + #define INIT_CHAMBER_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0) #else #define INIT_CHAMBER_AUTO_FAN_PIN(P) SET_OUTPUT(P) #endif From 7f91ff07c4c29cd82ad7bb28c5245b04235adfbd Mon Sep 17 00:00:00 2001 From: Simone Primarosa Date: Sat, 21 Nov 2020 03:36:19 +0100 Subject: [PATCH 0620/1370] Superscript substitution (#20219) Co-authored-by: Scott Lahteine --- Marlin/src/core/language.h | 4 ++++ Marlin/src/lcd/language/language_an.h | 2 +- Marlin/src/lcd/language/language_bg.h | 2 +- Marlin/src/lcd/language/language_ca.h | 2 +- Marlin/src/lcd/language/language_cz.h | 2 +- Marlin/src/lcd/language/language_da.h | 2 +- Marlin/src/lcd/language/language_de.h | 4 ++-- Marlin/src/lcd/language/language_el.h | 2 +- Marlin/src/lcd/language/language_el_gr.h | 2 +- Marlin/src/lcd/language/language_en.h | 4 ++-- Marlin/src/lcd/language/language_es.h | 2 +- Marlin/src/lcd/language/language_fi.h | 2 +- Marlin/src/lcd/language/language_fr.h | 4 ++-- Marlin/src/lcd/language/language_gl.h | 2 +- Marlin/src/lcd/language/language_hr.h | 2 +- Marlin/src/lcd/language/language_hu.h | 2 +- Marlin/src/lcd/language/language_it.h | 4 ++-- Marlin/src/lcd/language/language_jp_kana.h | 6 +++--- Marlin/src/lcd/language/language_nl.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_pt.h | 2 +- Marlin/src/lcd/language/language_pt_br.h | 2 +- Marlin/src/lcd/language/language_ro.h | 4 ++-- Marlin/src/lcd/language/language_ru.h | 4 ++-- Marlin/src/lcd/language/language_sk.h | 4 ++-- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/language/language_uk.h | 4 ++-- Marlin/src/lcd/language/language_vi.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 4 ++-- Marlin/src/lcd/language/language_zh_TW.h | 2 +- 30 files changed, 44 insertions(+), 40 deletions(-) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 60d9aa6b72..f1e477933a 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -380,6 +380,10 @@ #define LCD_STR_E6 "E" LCD_STR_N6 #define LCD_STR_E7 "E" LCD_STR_N7 +// Use superscripts, if possible. Evaluated at point of use. +#define SUPERSCRIPT_TWO TERN(NOT_EXTENDED_ISO10646_1_5X7, "^2", "²") +#define SUPERSCRIPT_THREE TERN(NOT_EXTENDED_ISO10646_1_5X7, "^3", "³") + #include "multi_language.h" // Allow multiple languages #include "../lcd/language/language_en.h" diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index 13400f8459..8eb6ab5794 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -121,7 +121,7 @@ namespace Language_an { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); PROGMEM Language_Str MSG_MOTION = _UxGT("Movimiento"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index b774cc29a2..62b291b7c3 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -106,7 +106,7 @@ namespace Language_bg { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); PROGMEM Language_Str MSG_MOTION = _UxGT("Движение"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Ðишка"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диам. нишка"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Диам. нишка *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD контраÑÑ‚"); diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index 0ad725262d..b924e3472d 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -111,7 +111,7 @@ namespace Language_ca { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); PROGMEM Language_Str MSG_MOTION = _UxGT("Moviment"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. Fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. Fil. *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contrast de LCD"); diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 073d46bad2..97bc2a30cc 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -301,7 +301,7 @@ namespace Language_cz { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Teplota"); PROGMEM Language_Str MSG_MOTION = _UxGT("Pohyb"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E na mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E na mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Prum."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Prum. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Vysunout mm"); diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index be9ad758ce..ff0751aebf 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -101,7 +101,7 @@ namespace Language_da { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); PROGMEM Language_Str MSG_MOTION = _UxGT("Bevægelse"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E i mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E i mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrast"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 1ca23d6044..17dabddb3a 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -318,8 +318,8 @@ namespace Language_de { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); PROGMEM Language_Str MSG_MOTION = _UxGT("Bewegung"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filamentdurchmesser"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Filamentdurchmesser *"); diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index 885f745708..d1dce1b958 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -132,7 +132,7 @@ namespace Language_el { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("ΘεÏμοκÏασία"); PROGMEM Language_Str MSG_MOTION = _UxGT("Κίνηση"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Îήμα"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("ΔιάμετÏος νήματος"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("ΔιάμετÏος νήματος *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("ΚοντÏάστ LCD"); diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index fe36b6d663..db67540ffb 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -134,7 +134,7 @@ namespace Language_el_gr { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("ΘεÏμοκÏασία"); PROGMEM Language_Str MSG_MOTION = _UxGT("Κίνηση"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Îήμα"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("ΔιάμετÏος νήματος"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("ΔιάμετÏος νήματος *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("ΚοντÏάστ LCD"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 4231eca5ce..0355f2f512 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -337,8 +337,8 @@ namespace Language_en { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); PROGMEM Language_Str MSG_MOTION = _UxGT("Motion"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index d4cf5fe54b..1ec1e3dbda 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -313,7 +313,7 @@ namespace Language_es { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); PROGMEM Language_Str MSG_MOTION = _UxGT("Movimiento"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diámetro Fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diámetro Fil. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm"); diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index c8633ce0aa..4f10adfc3e 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -95,7 +95,7 @@ namespace Language_fi { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Lämpötila"); PROGMEM Language_Str MSG_MOTION = _UxGT("Liike"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrasti"); PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Tallenna muistiin"); PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Lataa muistista"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 90e57ab3fb..3a741a6057 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -281,8 +281,8 @@ namespace Language_fr { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Température"); PROGMEM Language_Str MSG_MOTION = _UxGT("Mouvement"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("Limite en mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("Limite en mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diamètre fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diamètre fil. *"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index d1d1704174..5b0da33649 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -316,7 +316,7 @@ namespace Language_gl { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); PROGMEM Language_Str MSG_MOTION = _UxGT("Movemento"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. fil. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm"); diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index dba0e6df67..0ef2ad6c35 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -94,7 +94,7 @@ namespace Language_hr { PROGMEM Language_Str MSG_SELECT_E = _UxGT("Odaberi *"); PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); PROGMEM Language_Str MSG_MOTION = _UxGT("Gibanje"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD-a"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index a5eae451a6..94a7ba4858 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -318,7 +318,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Höfok"); PROGMEM Language_Str MSG_MOTION = _UxGT("Mozgatások"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Nyomtatószál"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm³-ben"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm") SUPERSCRIPT_THREE _UxGT("-ben"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. Ãtm."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. Ãtm. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Kiadás mm"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 5a3d8f4c52..6a10afec07 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -333,8 +333,8 @@ namespace Language_it { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("Limite E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("Limite E in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite E *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. filo"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. filo *"); diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index ef288bd396..d17d3aaf2d 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -113,7 +113,7 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_LCD_OFF = _UxGT("オフ"); // "Off" PROGMEM Language_Str MSG_SELECT = _UxGT("センタク"); // "Select" PROGMEM Language_Str MSG_SELECT_E = _UxGT("センタク *"); - PROGMEM Language_Str MSG_ACC = _UxGT("カソクド mm/s²"); // "Accel" + PROGMEM Language_Str MSG_ACC = _UxGT("カソクド mm/s") SUPERSCRIPT_TWO; // "Accel" PROGMEM Language_Str MSG_JERK = _UxGT("ヤクドウ mm/s"); // "Jerk" PROGMEM Language_Str MSG_VA_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_A; // "Va-jerk" PROGMEM Language_Str MSG_VB_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_B; // "Vb-jerk" @@ -129,14 +129,14 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_VMAX_EN = _UxGT("サイダイオクリソクド *"); // "Vmax E1" PROGMEM Language_Str MSG_VMIN = _UxGT("サイショウオクリソクド"); // "Vmin" PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("サイショウイドウソクド"); // "VTrav min" - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("カソクド mm/s²"); // "Accel" + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("カソクド mm/s") SUPERSCRIPT_TWO; // "Accel" PROGMEM Language_Str MSG_AMAX = _UxGT("サイダイカソクド "); // "Amax " PROGMEM Language_Str MSG_A_RETRACT = _UxGT("ヒキコミカソクド"); // "A-retract" PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("イドウカソクド"); // "A-travel" PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("オンド"); // "Temperature" PROGMEM Language_Str MSG_MOTION = _UxGT("ウゴキセッテイ"); // "Motion" PROGMEM Language_Str MSG_FILAMENT = _UxGT("フィラメント"); // "Filament" - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("フィラメントãƒãƒ§ãƒƒã‚±ã‚¤"); // "Fil. Dia." PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("フィラメントãƒãƒ§ãƒƒã‚±ã‚¤ *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCDコントラスト"); // "LCD contrast" diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index 9cbebe1bb3..c4e0b7f161 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -115,7 +115,7 @@ namespace Language_nl { PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); // accepted english dutch PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); // accepted english dutch - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD contrast"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 9b764c86a7..3b6479dfa8 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -289,7 +289,7 @@ namespace Language_pl { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); PROGMEM Language_Str MSG_MOTION = _UxGT("Ruch"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E w mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E w mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Åšr. fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Åšr. fil. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("WysuÅ„ mm"); diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 3a002d657b..fb41cb99a5 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -109,7 +109,7 @@ namespace Language_pt { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E em mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E em mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Diam."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Diam. *"); PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index c210425ce8..05fc639f83 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -259,7 +259,7 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Extrusão em mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Extrusão em mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diâmetro Fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diâmetro Fil. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarr. mm"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index c4d2bea073..c2e50fc698 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -315,8 +315,8 @@ namespace Language_ro { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); PROGMEM Language_Str MSG_MOTION = _UxGT("Motion"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 3734185357..0be6cb5eb3 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -369,8 +369,8 @@ namespace Language_ru { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); PROGMEM Language_Str MSG_MOTION = _UxGT("Движение"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Филамент"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E огран.,мм³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E огран.,мм") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E огран. *"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диам. филамента"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 77e4b46424..2e05ee4513 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -320,8 +320,8 @@ namespace Language_sk { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Teplota"); PROGMEM Language_Str MSG_MOTION = _UxGT("Pohyb"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E v mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit v mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E v mm") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit v mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Priem. fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Priem. fil. *"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index cca3a7eda7..307abf118a 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -306,7 +306,7 @@ namespace Language_tr { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Sıcaklık"); PROGMEM Language_Str MSG_MOTION = _UxGT("Hareket"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filaman"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ekstrüzyon/mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ekstrüzyon/mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filaman Çapı"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Filaman Çapı *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Çıkart mm"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index ac79b0b820..71b4cd018d 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -372,8 +372,8 @@ namespace Language_uk { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); PROGMEM Language_Str MSG_MOTION = _UxGT("Рух"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Пруток"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E обмеж.,мм³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E обмеж.,мм") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E обмеж. *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Діам. прутка"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Діам. прутка *"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 8a1cfad92a..fad32507ce 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -257,7 +257,7 @@ namespace Language_vi { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Nhiệt Ä‘á»™"); // Temperature PROGMEM Language_Str MSG_MOTION = _UxGT("Chuyển Ä‘á»™ng"); // Motion PROGMEM Language_Str MSG_FILAMENT = _UxGT("Vật liệu in"); // dây nhá»±a - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E bằng mm³"); // E in mm + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E bằng mm") SUPERSCRIPT_THREE; // E in mm PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("ÄÆ°á»ng kính nhá»±a"); // Fil. Dai. PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("ÄÆ°á»ng kính nhá»±a *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Dỡ mm"); // unload mm diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 56fd8a22f6..0e1de36b57 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -313,8 +313,8 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("温度"); //"Temperature" PROGMEM Language_Str MSG_MOTION = _UxGT("è¿åŠ¨"); //"Motion" PROGMEM Language_Str MSG_FILAMENT = _UxGT("æ–™ä¸"); //"Filament" menu_advanced_filament - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E 在 mm³"); //"E in mm3" volumetric_enabled - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E é™åˆ¶ 在 mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E 在 mm") SUPERSCRIPT_THREE; //"E in mm3" volumetric_enabled + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E é™åˆ¶ 在 mm") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E é™åˆ¶ *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("ä¸æ–™ç›´å¾„"); //"Fil. Dia." PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("ä¸æ–™ç›´å¾„ *"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index ac061e9b81..9708bbda9c 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -287,7 +287,7 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("溫度"); //"Temperature" PROGMEM Language_Str MSG_MOTION = _UxGT("é‹ä½œ"); //"Motion" PROGMEM Language_Str MSG_FILAMENT = _UxGT("絲料測容"); //"Filament" menu_control_volumetric - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("測容ç©mm³"); //"E in mm3" volumetric_enabled + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("測容ç©mm") SUPERSCRIPT_THREE; //"E in mm3" volumetric_enabled PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("絲料直徑"); //"Fil. Dia." PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("絲料直徑 *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("å¸è¼‰ mm"); // "Unload mm" From f3805edbd69a9ef53b1fdcfa37dbd5f66e44c053 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 20 Nov 2020 21:25:51 -0600 Subject: [PATCH 0621/1370] Power-Loss cleanup --- Marlin/src/feature/powerloss.cpp | 22 ++++++++-------- Marlin/src/feature/powerloss.h | 45 +++++++++----------------------- 2 files changed, 24 insertions(+), 43 deletions(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index bef2309449..c4e0ef694a 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -180,10 +180,10 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ // Machine state info.current_position = current_position; + info.feedrate = uint16_t(feedrate_mm_s * 60.0f); info.zraise = zraise; TERN_(HAS_HOME_OFFSET, info.home_offset = home_offset); TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift); - info.feedrate = uint16_t(feedrate_mm_s * 60.0f); #if HAS_MULTI_EXTRUDER info.active_extruder = active_extruder; @@ -209,7 +209,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ #endif #if HAS_LEVELING - info.leveling = planner.leveling_active; + info.flag.leveling = planner.leveling_active; info.fade = TERN0(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height); #endif @@ -220,12 +220,12 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ info.retract_hop = fwretract.current_hop; #endif - // Relative axis modes - info.axis_relative = gcode.axis_relative; - // Elapsed print job time info.print_job_elapsed = print_job_timer.duration(); + // Relative axis modes + info.axis_relative = gcode.axis_relative; + // Misc. Marlin flags info.flag.dryrun = !!(marlin_debug_flags & MARLIN_DEBUG_DRYRUN); info.flag.allow_cold_extrusion = TERN0(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude); @@ -457,8 +457,8 @@ void PrintJobRecovery::resume() { #if HAS_LEVELING // Restore leveling state before 'G92 Z' to ensure // the Z stepper count corresponds to the native Z. - if (info.fade || info.leveling) { - sprintf_P(cmd, PSTR("M420 S%i Z%s"), int(info.leveling), dtostrf(info.fade, 1, 1, str_1)); + if (info.fade || info.flag.leveling) { + sprintf_P(cmd, PSTR("M420 S%i Z%s"), int(info.flag.leveling), dtostrf(info.fade, 1, 1, str_1)); gcode.process_subcommands_now(cmd); } #endif @@ -507,15 +507,15 @@ void PrintJobRecovery::resume() { sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1)); gcode.process_subcommands_now(cmd); - // Relative axis modes - gcode.axis_relative = info.axis_relative; - TERN_(HAS_HOME_OFFSET, home_offset = info.home_offset); TERN_(HAS_POSITION_SHIFT, position_shift = info.position_shift); #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT LOOP_XYZ(i) update_workspace_offset((AxisEnum)i); #endif + // Relative axis modes + gcode.axis_relative = info.axis_relative; + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) const uint8_t old_flags = marlin_debug_flags; marlin_debug_flags |= MARLIN_DEBUG_ECHO; @@ -598,7 +598,7 @@ void PrintJobRecovery::resume() { #endif #if HAS_LEVELING - DEBUG_ECHOLNPAIR("leveling: ", int(info.leveling), " fade: ", info.fade); + DEBUG_ECHOLNPAIR("leveling: ", int(info.flag.leveling), " fade: ", info.fade); #endif #if ENABLED(FWRETRACT) DEBUG_ECHOPGM("retract: "); diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index e31b2ec915..60923c6b3e 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -47,42 +47,24 @@ typedef struct { // Machine state xyze_pos_t current_position; + uint16_t feedrate; float zraise; - #if HAS_HOME_OFFSET - xyz_pos_t home_offset; - #endif - #if HAS_POSITION_SHIFT - xyz_pos_t position_shift; - #endif - uint16_t feedrate; - - #if HAS_MULTI_EXTRUDER - uint8_t active_extruder; - #endif + TERN_(HAS_HOME_OFFSET, xyz_pos_t home_offset); + TERN_(HAS_POSITION_SHIFT, xyz_pos_t position_shift); + TERN_(HAS_MULTI_EXTRUDER, uint8_t active_extruder); #if DISABLED(NO_VOLUMETRICS) bool volumetric_enabled; float filament_size[EXTRUDERS]; #endif - #if HAS_HOTEND - int16_t target_temperature[HOTENDS]; - #endif + TERN_(HAS_HOTEND, int16_t target_temperature[HOTENDS]); + TERN_(HAS_HEATED_BED, int16_t target_temperature_bed); + TERN_(HAS_FAN, uint8_t fan_speed[FAN_COUNT]); - #if HAS_HEATED_BED - int16_t target_temperature_bed; - #endif - - #if HAS_FAN - uint8_t fan_speed[FAN_COUNT]; - #endif - - #if HAS_LEVELING - bool leveling; - float fade; - #endif + TERN_(HAS_LEVELING, float fade); #if ENABLED(FWRETRACT) float retract[EXTRUDERS], retract_hop; @@ -92,14 +74,9 @@ typedef struct { #if ENABLED(MIXING_EXTRUDER) //uint_fast8_t selected_vtool; //mixer_comp_t color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; - #if ENABLED(GRADIENT_MIX) - gradient_t gradient; - #endif + TERN_(GRADIENT_MIX, gradient_t gradient); #endif - // Relative axis modes - uint8_t axis_relative; - // SD Filename and position char sd_filename[MAXPATHNAMELENGTH]; volatile uint32_t sdpos; @@ -107,10 +84,14 @@ typedef struct { // Job elapsed time millis_t print_job_elapsed; + // Relative axis modes + uint8_t axis_relative; + // Misc. Marlin flags struct { bool dryrun:1; // M111 S8 bool allow_cold_extrusion:1; // M302 P1 + TERN_(HAS_LEVELING, bool leveling:1); } flag; uint8_t valid_foot; From a95a41ef7376cd1252ffcba7819d36ad94d3c8f1 Mon Sep 17 00:00:00 2001 From: Gurmeet Athwal Date: Sat, 21 Nov 2020 13:17:04 +0530 Subject: [PATCH 0622/1370] BTN_ENC_EN for many boards (#19890) Enables CHECK_ENCODER_ACTIVE_SIGNAL for many more boards. Co-authored-by: Scott Lahteine Co-authored-by: Jason Smith --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 5 +++++ Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 5 +++++ Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 5 +++++ Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 5 +++++ Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h | 5 +++++ Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 5 +++++ Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 5 +++++ Marlin/src/pins/mega/pins_CHEAPTRONICv2.h | 4 ++++ Marlin/src/pins/mega/pins_GT2560_REV_A.h | 4 ++++ Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 5 +++++ Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 4 ++++ Marlin/src/pins/rambo/pins_MINIRAMBO.h | 4 ++++ Marlin/src/pins/rambo/pins_RAMBO.h | 4 ++++ Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 4 ++++ Marlin/src/pins/ramps/pins_RAMPS.h | 4 ++++ Marlin/src/pins/ramps/pins_RAMPS_S_12.h | 5 +++++ Marlin/src/pins/ramps/pins_TT_OSCAR.h | 4 ++++ Marlin/src/pins/sam/pins_ARCHIM1.h | 5 +++++ Marlin/src/pins/sam/pins_DUE3DOM.h | 5 +++++ Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 5 +++++ Marlin/src/pins/sam/pins_RADDS.h | 4 ++++ Marlin/src/pins/sam/pins_RAMPS_DUO.h | 4 ++++ Marlin/src/pins/sam/pins_RAMPS_FD_V1.h | 4 ++++ Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 4 ++++ Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 4 ++++ Marlin/src/pins/samd/pins_RAMPS_144.h | 4 ++++ Marlin/src/pins/sanguino/pins_ANET_10.h | 4 ++++ Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 5 +++++ Marlin/src/pins/stm32f1/pins_CHITU3D.h | 4 ++++ Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 4 ++++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 5 +++++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 5 +++++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 5 +++++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 5 +++++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 5 +++++ Marlin/src/pins/stm32f1/pins_STM32F1R.h | 4 ++++ Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 4 ++++ Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 5 +++++ Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 5 +++++ Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h | 5 +++++ Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 5 +++++ Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 5 +++++ 42 files changed, 191 insertions(+) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index 6f84a2a44d..c621f93a2a 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -353,6 +353,11 @@ #define LCD_PINS_D5 EXPA1_05_PIN #define LCD_PINS_D6 EXPA1_04_PIN #define LCD_PINS_D7 EXPA1_03_PIN + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif // !FYSETC_MINI_12864 diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 3562619f5c..9977230094 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -136,6 +136,11 @@ #define LCD_PINS_D5 P0_22 #define LCD_PINS_D6 P1_29 #define LCD_PINS_D7 P1_28 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 502c937588..68cfe65601 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -352,6 +352,11 @@ #define LCD_PINS_D5 P0_17 #define LCD_PINS_D6 P1_00 #define LCD_PINS_D7 P1_22 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif // !FYSETC_MINI_12864 diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 674bd6b0ff..f746064991 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -420,6 +420,11 @@ #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h index 4e3b2ef425..700e79de9c 100644 --- a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h +++ b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h @@ -110,4 +110,9 @@ #define BTN_ENC P1_30 #define SD_DETECT_PIN -1 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // IS_RRD_FG_SC diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index 6fddc16224..ac1d9f6906 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -175,6 +175,11 @@ #endif #define BEEPER_PIN P1_30 // (37) not 5V tolerant #define DOGLCD_CS P0_16 // (16) + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #if ENABLED(MINIPANEL) diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 6dc0c1e8ff..638268a546 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -371,6 +371,11 @@ #define LCD_PINS_D5 P0_17 #define LCD_PINS_D6 P1_00 #define LCD_PINS_D7 P1_22 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif // !FYSETC_MINI_12864 diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h index af9f683c7d..3f18bc8bbe 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h @@ -119,6 +119,10 @@ #define LCD_PINS_D6 41 #define LCD_PINS_D7 40 +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder +#endif + // // Beeper, SD Card, Encoder // diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index 2db030804c..e1752c1f85 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -158,6 +158,10 @@ #define LCD_PINS_D6 20 #define LCD_PINS_D7 19 + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #define SD_DETECT_PIN -1 #endif // !IS_NEWPANEL diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index c2cc24943a..2ca2cc9c8d 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -181,6 +181,11 @@ #define LCD_PINS_D7 71 #define BTN_EN1 14 #define BTN_EN2 72 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #define BTN_ENC 9 // AUX-2 diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index 7e53246181..a6a4b65e05 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -194,6 +194,10 @@ #define SD_DETECT_PIN 15 + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // IS_ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE #endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index 8b034820cf..4dcf35827c 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -187,6 +187,10 @@ #endif // !MINIRAMBO_10A + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // IS_ULTIPANEL || TOUCH_UI_ULTIPANEL #endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 62e7565c14..7dcaeb8e57 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -228,6 +228,10 @@ #endif // !VIKI2 && !miniVIKI + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #else // !IS_NEWPANEL - old style panel with shift register // No Beeper added diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index 66714240e7..15ac2f447b 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -275,6 +275,10 @@ #define DOGLCD_A0 27 #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #if IS_NEWPANEL diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 69a80d6b27..57d4c047e2 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -512,6 +512,10 @@ #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + // // LCD Display input pins // diff --git a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h index 1e063c269d..42b665ce86 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h @@ -263,6 +263,11 @@ #ifndef SD_DETECT_PIN #define SD_DETECT_PIN 38 #endif + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index 725d36466c..e6a95fdab9 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -350,6 +350,10 @@ #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + // // LCD Display input pins // diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h index 347afe9ebd..1fda0ccb44 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM1.h +++ b/Marlin/src/pins/sam/pins_ARCHIM1.h @@ -198,4 +198,9 @@ #define BTN_EN2 13 // D13 PB27_TIOB0 #define BTN_ENC 16 // D16 PA13_TXD1 #endif // IS_NEWPANEL + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index a5c22ff3f2..90d6bdc340 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -168,4 +168,9 @@ #define BEEPER_PIN -1 #endif // SPARK_FULL_GRAPHICS + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index b3e76199dc..5a205423ed 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -171,4 +171,9 @@ #define DOGLCD_CS 45 #endif // SPARK_FULL_GRAPHICS + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index cd895365d0..7b9c7f1b28 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -287,6 +287,10 @@ #endif // SPARK_FULL_GRAPHICS + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD #ifndef SDSS diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h index 44e2695a53..d2ab5c96b2 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -127,6 +127,10 @@ #endif #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // IS_NEWPANEL #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h index a0dbddf567..80e8f0dc7e 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -203,6 +203,10 @@ #define DOGLCD_MISO 74 // MISO_PIN #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD #if HAS_TMC_UART diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 49378541a9..6a283401f4 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -271,4 +271,8 @@ #define BTN_ENC 40 #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 1cc2eee6b0..6ec10f64af 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -253,4 +253,8 @@ #define BTN_ENC 40 #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index 1948acf897..d72b55d3af 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -594,6 +594,10 @@ #endif #endif // IS_NEWPANEL + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD // diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index 81c0fe562d..10fee8bcf1 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -198,6 +198,10 @@ #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #else #define SERVO0_PIN 27 diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index 16c247cc87..410424f6b5 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -179,6 +179,11 @@ #define LCD_PINS_D5 PB7 #define LCD_PINS_D6 PC15 #define LCD_PINS_D7 PC14 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif // !FYSETC_MINI_12864 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index aa83a0cb04..b18c9dd914 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -283,4 +283,8 @@ #endif #endif // IS_NEWPANEL + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index 073d6c7368..859f9fab1e 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -154,6 +154,10 @@ #define BTN_EN2 PB3 #define BTN_ENC PC13 +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder +#endif + // // Filament runout // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index b1f41f9fa7..b9283a060f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -309,6 +309,11 @@ #define LCD_PINS_D5 PE15 #define LCD_PINS_D6 PD11 #define LCD_PINS_D7 PD10 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #ifndef BOARD_ST7920_DELAY_1 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 2dcd7780af..c2b7e52067 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -160,6 +160,11 @@ #define LCD_PINS_D5 PA7 #define LCD_PINS_D6 PC4 #define LCD_PINS_D7 PC5 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif // !MKS_MINI_12864 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index f8b8a891be..27bd4033cd 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -129,6 +129,11 @@ #define LCD_PINS_D5 PA7 #define LCD_PINS_D6 PC4 #define LCD_PINS_D7 PC5 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif // !MKS_MINI_12864 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 8b41296971..1816d6bd41 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -321,6 +321,11 @@ #define LCD_PINS_D5 PE15 #define LCD_PINS_D6 PD11 #define LCD_PINS_D7 PD10 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #ifndef BOARD_ST7920_DELAY_1 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 8f1a405e8c..65aa5cc39e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -258,6 +258,11 @@ #define LCD_PINS_D5 PF15 #define LCD_PINS_D6 PF12 #define LCD_PINS_D7 PF13 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index 1b9a62fe9e..6f252fbef6 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -258,4 +258,8 @@ #endif #endif // IS_NEWPANEL + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index b13d495542..4b981c9251 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -132,6 +132,10 @@ #define DOGLCD_CS LCD_PINS_D5 #define DOGLCD_A0 LCD_PINS_D6 +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder +#endif + // // Onboard SD support // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 6f9c3d3095..19ff2a34e2 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -232,6 +232,11 @@ #define LCD_PINS_D5 PE11 #define LCD_PINS_D6 PE12 #define LCD_PINS_D7 PE13 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 60b2adbfa8..6c475faeb5 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -389,6 +389,11 @@ #define LCD_PINS_D5 PG7 #define LCD_PINS_D6 PG6 #define LCD_PINS_D7 PG5 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index e1d28f34de..235ed1edcc 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -426,6 +426,11 @@ #define LCD_PINS_D5 EXPA1_05_PIN #define LCD_PINS_D6 EXPA1_04_PIN #define LCD_PINS_D7 EXPA1_03_PIN + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 656849487a..a8105c37a2 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -256,6 +256,11 @@ #define LCD_PINS_D5 PC12 #define LCD_PINS_D6 PD0 #define LCD_PINS_D7 PD1 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index eee0094ea8..24c32d6d81 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -164,6 +164,11 @@ #define LCD_PINS_D5 PE13 #define LCD_PINS_D6 PE14 #define LCD_PINS_D7 PE15 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + #endif // Alter timing for graphical display From add6b836dfadcd51b3bdaa77861e5bb48fc2a6c5 Mon Sep 17 00:00:00 2001 From: Orel <37673727+0r31@users.noreply.github.com> Date: Sat, 21 Nov 2020 23:27:06 +0100 Subject: [PATCH 0623/1370] Skip unnecessary (costly) SW Stepper Enable (#20218) Co-authored-by: Jason Smith Co-authored-by: Scott Lahteine --- Marlin/src/module/stepper/indirection.cpp | 5 ++++ Marlin/src/module/stepper/indirection.h | 28 +++++++++++++++-------- buildroot/tests/NUCLEO_F767ZI-tests | 2 +- buildroot/tests/esp32-tests | 2 +- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Marlin/src/module/stepper/indirection.cpp b/Marlin/src/module/stepper/indirection.cpp index 6f9ac9ba0a..6297d83366 100644 --- a/Marlin/src/module/stepper/indirection.cpp +++ b/Marlin/src/module/stepper/indirection.cpp @@ -43,3 +43,8 @@ void reset_stepper_drivers() { TERN_(HAS_L64XX, L64xxManager.init_to_defaults()); TERN_(HAS_TRINAMIC_CONFIG, reset_trinamic_drivers()); } + +#if ENABLED(SOFTWARE_DRIVER_ENABLE) + // Flags to optimize XYZ Enabled state + xyz_bool_t axis_sw_enabled; // = { false, false, false } +#endif diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index dfdd63b05b..04cebc216f 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -843,22 +843,32 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // // Axis steppers enable / disable macros // +#if ENABLED(SOFTWARE_DRIVER_ENABLE) + // Avoid expensive calls to enable / disable steppers + extern xyz_bool_t axis_sw_enabled; + #define SHOULD_ENABLE(N) !axis_sw_enabled.N + #define SHOULD_DISABLE(N) axis_sw_enabled.N + #define AFTER_CHANGE(N,TF) axis_sw_enabled.N = TF +#else + #define SHOULD_ENABLE(N) true + #define SHOULD_DISABLE(N) true + #define AFTER_CHANGE(N,TF) NOOP +#endif + +#define ENABLE_AXIS_X() if (SHOULD_ENABLE(x)) { ENABLE_STEPPER_X(); ENABLE_STEPPER_X2(); AFTER_CHANGE(x, true); } +#define DISABLE_AXIS_X() if (SHOULD_DISABLE(x)) { DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); AFTER_CHANGE(x, false); FORGET_AXIS(X_AXIS); } +#define ENABLE_AXIS_Y() if (SHOULD_ENABLE(y)) { ENABLE_STEPPER_Y(); ENABLE_STEPPER_Y2(); AFTER_CHANGE(y, true); } +#define DISABLE_AXIS_Y() if (SHOULD_DISABLE(y)) { DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); AFTER_CHANGE(y, false); FORGET_AXIS(Y_AXIS); } +#define ENABLE_AXIS_Z() if (SHOULD_ENABLE(z)) { ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); AFTER_CHANGE(z, true); } +#define DISABLE_AXIS_Z() if (SHOULD_DISABLE(z)) { DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); AFTER_CHANGE(z, false); FORGET_AXIS(Z_AXIS); Z_RESET(); } + #define FORGET_AXIS(A) TERN(HOME_AFTER_DEACTIVATE, set_axis_never_homed(A), CBI(axis_known_position, A)) -#define ENABLE_AXIS_X() do{ ENABLE_STEPPER_X(); ENABLE_STEPPER_X2(); }while(0) -#define DISABLE_AXIS_X() do{ DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); FORGET_AXIS(X_AXIS); }while(0) - -#define ENABLE_AXIS_Y() do{ ENABLE_STEPPER_Y(); ENABLE_STEPPER_Y2(); }while(0) -#define DISABLE_AXIS_Y() do{ DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); FORGET_AXIS(Y_AXIS); }while(0) - -#define ENABLE_AXIS_Z() do{ ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); }while(0) - #ifdef Z_AFTER_DEACTIVATE #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; sync_plan_position(); }while(0) #else #define Z_RESET() #endif -#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); FORGET_AXIS(Z_AXIS); Z_RESET(); }while(0) // // Extruder steppers enable / disable macros diff --git a/buildroot/tests/NUCLEO_F767ZI-tests b/buildroot/tests/NUCLEO_F767ZI-tests index 1a2e7c8362..bd5ca86970 100644 --- a/buildroot/tests/NUCLEO_F767ZI-tests +++ b/buildroot/tests/NUCLEO_F767ZI-tests @@ -12,7 +12,7 @@ set -e restore_configs opt_set MOTHERBOARD BOARD_NUCLEO_F767ZI opt_set SERIAL_PORT -1 -opt_enable BLTOUCH Z_SAFE_HOMING SPEAKER +opt_enable BLTOUCH Z_SAFE_HOMING SPEAKER SOFTWARE_DRIVER_ENABLE opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "Mixed timer usage" "$3" diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32-tests index 283d02f7e0..310eea298e 100755 --- a/buildroot/tests/esp32-tests +++ b/buildroot/tests/esp32-tests @@ -34,7 +34,7 @@ opt_set X_SLAVE_ADDRESS 0 opt_set Y_SLAVE_ADDRESS 1 opt_set Z_SLAVE_ADDRESS 2 opt_set E0_SLAVE_ADDRESS 3 -opt_enable HOTEND_IDLE_TIMEOUT +opt_enable HOTEND_IDLE_TIMEOUT SOFTWARE_DRIVER_ENABLE exec_test $1 $2 "ESP32, TMC HW Serial, Hotend Idle" "$3" # cleanup From 69b61fef671d29ac6e27e4484f4e5b614b2c29f5 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 21 Nov 2020 20:16:03 -0300 Subject: [PATCH 0624/1370] Fix Load Filament wait (#20243) --- Marlin/src/feature/pause.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 0a3609b3a1..024338f242 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -199,7 +199,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l first_impatient_beep(max_beep_count); KEEPALIVE_STATE(PAUSED_FOR_USER); - + wait_for_user = true; // LCD click or M108 will clear this #if ENABLED(HOST_PROMPT_SUPPORT) const char tool = '0' #if NUM_RUNOUT_SENSORS > 1 From 9c9fd8714e936f42cc085f0c49d25b8f8c782bb5 Mon Sep 17 00:00:00 2001 From: Kurt Haenen Date: Sun, 22 Nov 2020 00:56:56 +0100 Subject: [PATCH 0625/1370] Proper pullup/pulldown configurability (#20242) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 34 ++++++++--- Marlin/Configuration_adv.h | 3 +- Marlin/src/feature/powerloss.h | 10 ++-- Marlin/src/feature/runout.h | 4 +- Marlin/src/inc/Conditionals_LCD.h | 56 +++++++++++++------ Marlin/src/inc/SanityCheck.h | 26 ++++++++- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- buildroot/tests/BIGTREE_GTR_V1_0-tests | 4 +- buildroot/tests/mega2560-tests | 2 +- 9 files changed, 102 insertions(+), 39 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 9d2dd0b710..c64569d2bf 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1176,25 +1176,41 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. - #define FIL_RUNOUT_PULL // Use internal pullup / pulldown for filament runout pins. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. // Override individually if the runout sensors vary //#define FIL_RUNOUT1_STATE LOW - //#define FIL_RUNOUT1_PULL + //#define FIL_RUNOUT1_PULLUP + //#define FIL_RUNOUT1_PULLDOWN + //#define FIL_RUNOUT2_STATE LOW - //#define FIL_RUNOUT2_PULL + //#define FIL_RUNOUT2_PULLUP + //#define FIL_RUNOUT2_PULLDOWN + //#define FIL_RUNOUT3_STATE LOW - //#define FIL_RUNOUT3_PULL + //#define FIL_RUNOUT3_PULLUP + //#define FIL_RUNOUT3_PULLDOWN + //#define FIL_RUNOUT4_STATE LOW - //#define FIL_RUNOUT4_PULL + //#define FIL_RUNOUT4_PULLUP + //#define FIL_RUNOUT4_PULLDOWN + //#define FIL_RUNOUT5_STATE LOW - //#define FIL_RUNOUT5_PULL + //#define FIL_RUNOUT5_PULLUP + //#define FIL_RUNOUT5_PULLDOWN + //#define FIL_RUNOUT6_STATE LOW - //#define FIL_RUNOUT6_PULL + //#define FIL_RUNOUT6_PULLUP + //#define FIL_RUNOUT6_PULLDOWN + //#define FIL_RUNOUT7_STATE LOW - //#define FIL_RUNOUT7_PULL + //#define FIL_RUNOUT7_PULLUP + //#define FIL_RUNOUT7_PULLDOWN + //#define FIL_RUNOUT8_STATE LOW - //#define FIL_RUNOUT8_PULL + //#define FIL_RUNOUT8_PULLUP + //#define FIL_RUNOUT8_PULLDOWN // Set one or more commands to execute on filament runout. // (After 'M412 H' Marlin will ask the host to handle the process.) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 68d31ceaff..baa0433f19 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1217,7 +1217,8 @@ //#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss - //#define POWER_LOSS_PULL // Set pullup / pulldown as appropriate + //#define POWER_LOSS_PULLUP // Set pullup / pulldown as appropriate for your sensor + //#define POWER_LOSS_PULLDOWN //#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power. diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 60923c6b3e..73cd0b70fa 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -120,12 +120,10 @@ class PrintJobRecovery { static inline void setup() { #if PIN_EXISTS(POWER_LOSS) - #if ENABLED(POWER_LOSS_PULL) - #if POWER_LOSS_STATE == LOW - SET_INPUT_PULLUP(POWER_LOSS_PIN); - #else - SET_INPUT_PULLDOWN(POWER_LOSS_PIN); - #endif + #if ENABLED(POWER_LOSS_PULLUP) + SET_INPUT_PULLUP(POWER_LOSS_PIN); + #elif ENABLED(POWER_LOSS_PULLDOWN) + SET_INPUT_PULLDOWN(POWER_LOSS_PIN); #else SET_INPUT(POWER_LOSS_PIN); #endif diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index e1b9ca11b7..09443e6e2b 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -149,8 +149,8 @@ class FilamentSensorBase { public: static inline void setup() { - #define _INIT_RUNOUT_PIN(P,S,U) do{ if (DISABLED(U)) SET_INPUT(P); else if (S) SET_INPUT_PULLUP(P); else SET_INPUT_PULLDOWN(P); }while(0) - #define INIT_RUNOUT_PIN(N) _INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN, FIL_RUNOUT##N##_STATE, FIL_RUNOUT##N##_PULL) + #define _INIT_RUNOUT_PIN(P,S,U,D) do{ if (ENABLED(U)) SET_INPUT_PULLUP(P); else if (ENABLED(D)) SET_INPUT_PULLDOWN(P); else SET_INPUT(P); }while(0) + #define INIT_RUNOUT_PIN(N) _INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN, FIL_RUNOUT##N##_STATE, FIL_RUNOUT##N##_PULLUP, FIL_RUNOUT##N##_PULLDOWN) #if NUM_RUNOUT_SENSORS >= 1 INIT_RUNOUT_PIN(1); #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 5fe73a9467..42a4e037d8 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -708,64 +708,88 @@ #ifndef FIL_RUNOUT1_STATE #define FIL_RUNOUT1_STATE FIL_RUNOUT_STATE #endif - #ifndef FIL_RUNOUT1_PULL - #define FIL_RUNOUT1_PULL FIL_RUNOUT_PULL + #ifndef FIL_RUNOUT1_PULLUP + #define FIL_RUNOUT1_PULLUP FIL_RUNOUT_PULLUP + #endif + #ifndef FIL_RUNOUT1_PULLDOWN + #define FIL_RUNOUT1_PULLDOWN FIL_RUNOUT_PULLDOWN #endif #endif #if NUM_RUNOUT_SENSORS >= 2 #ifndef FIL_RUNOUT2_STATE #define FIL_RUNOUT2_STATE FIL_RUNOUT_STATE #endif - #ifndef FIL_RUNOUT2_PULL - #define FIL_RUNOUT2_PULL FIL_RUNOUT_PULL + #ifndef FIL_RUNOUT2_PULLUP + #define FIL_RUNOUT2_PULLUP FIL_RUNOUT_PULLUP + #endif + #ifndef FIL_RUNOUT2_PULLDOWN + #define FIL_RUNOUT2_PULLDOWN FIL_RUNOUT_PULLDOWN #endif #endif #if NUM_RUNOUT_SENSORS >= 3 #ifndef FIL_RUNOUT3_STATE #define FIL_RUNOUT3_STATE FIL_RUNOUT_STATE #endif - #ifndef FIL_RUNOUT3_PULL - #define FIL_RUNOUT3_PULL FIL_RUNOUT_PULL + #ifndef FIL_RUNOUT3_PULLUP + #define FIL_RUNOUT3_PULLUP FIL_RUNOUT_PULLUP + #endif + #ifndef FIL_RUNOUT3_PULLDOWN + #define FIL_RUNOUT3_PULLDOWN FIL_RUNOUT_PULLDOWN #endif #endif #if NUM_RUNOUT_SENSORS >= 4 #ifndef FIL_RUNOUT4_STATE #define FIL_RUNOUT4_STATE FIL_RUNOUT_STATE #endif - #ifndef FIL_RUNOUT4_PULL - #define FIL_RUNOUT4_PULL FIL_RUNOUT_PULL + #ifndef FIL_RUNOUT4_PULLUP + #define FIL_RUNOUT4_PULLUP FIL_RUNOUT_PULLUP + #endif + #ifndef FIL_RUNOUT4_PULLDOWN + #define FIL_RUNOUT4_PULLDOWN FIL_RUNOUT_PULLDOWN #endif #endif #if NUM_RUNOUT_SENSORS >= 5 #ifndef FIL_RUNOUT5_STATE #define FIL_RUNOUT5_STATE FIL_RUNOUT_STATE #endif - #ifndef FIL_RUNOUT5_PULL - #define FIL_RUNOUT5_PULL FIL_RUNOUT_PULL + #ifndef FIL_RUNOUT5_PULLUP + #define FIL_RUNOUT5_PULLUP FIL_RUNOUT_PULLUP + #endif + #ifndef FIL_RUNOUT5_PULLDOWN + #define FIL_RUNOUT5_PULLDOWN FIL_RUNOUT_PULLDOWN #endif #endif #if NUM_RUNOUT_SENSORS >= 6 #ifndef FIL_RUNOUT6_STATE #define FIL_RUNOUT6_STATE FIL_RUNOUT_STATE #endif - #ifndef FIL_RUNOUT6_PULL - #define FIL_RUNOUT6_PULL FIL_RUNOUT_PULL + #ifndef FIL_RUNOUT6_PULLUP + #define FIL_RUNOUT6_PULLUP FIL_RUNOUT_PULLUP + #endif + #ifndef FIL_RUNOUT6_PULLDOWN + #define FIL_RUNOUT6_PULLDOWN FIL_RUNOUT_PULLDOWN #endif #endif #if NUM_RUNOUT_SENSORS >= 7 #ifndef FIL_RUNOUT7_STATE #define FIL_RUNOUT7_STATE FIL_RUNOUT_STATE #endif - #ifndef FIL_RUNOUT7_PULL - #define FIL_RUNOUT7_PULL FIL_RUNOUT_PULL + #ifndef FIL_RUNOUT7_PULLUP + #define FIL_RUNOUT7_PULLUP FIL_RUNOUT_PULLUP + #endif + #ifndef FIL_RUNOUT7_PULLDOWN + #define FIL_RUNOUT7_PULLDOWN FIL_RUNOUT_PULLDOWN #endif #endif #if NUM_RUNOUT_SENSORS >= 8 #ifndef FIL_RUNOUT8_STATE #define FIL_RUNOUT8_STATE FIL_RUNOUT_STATE #endif - #ifndef FIL_RUNOUT8_PULL - #define FIL_RUNOUT8_PULL FIL_RUNOUT_PULL + #ifndef FIL_RUNOUT8_PULLUP + #define FIL_RUNOUT8_PULLUP FIL_RUNOUT_PULLUP + #endif + #ifndef FIL_RUNOUT8_PULLDOWN + #define FIL_RUNOUT8_PULLDOWN FIL_RUNOUT_PULLDOWN #endif #endif #endif // FILAMENT_RUNOUT_SENSOR diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 4215f225e3..072bb26bfe 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -111,7 +111,7 @@ #elif defined(FILAMENT_SENSOR) #error "FILAMENT_SENSOR is now FILAMENT_WIDTH_SENSOR." #elif defined(ENDSTOPPULLUP_FIL_RUNOUT) - #error "ENDSTOPPULLUP_FIL_RUNOUT is now FIL_RUNOUT_PULL." + #error "ENDSTOPPULLUP_FIL_RUNOUT is now FIL_RUNOUT_PULLUP." #elif defined(DISABLE_MAX_ENDSTOPS) || defined(DISABLE_MIN_ENDSTOPS) #error "DISABLE_MAX_ENDSTOPS and DISABLE_MIN_ENDSTOPS deprecated. Use individual USE_*_PLUG options instead." #elif defined(LANGUAGE_INCLUDE) @@ -525,6 +525,8 @@ #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT." #elif defined(GRAPHICAL_TFT_ROTATE_180) #error "GRAPHICAL_TFT_ROTATE_180 is now TFT_ROTATION set to TFT_ROTATE_180." +#elif defined(POWER_LOSS_PULL) + #error "POWER_LOSS_PULL is now specifically POWER_LOSS_PULL(UP|DOWN)." #elif defined(FIL_RUNOUT_INVERTING) #if FIL_RUNOUT_INVERTING #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH." @@ -653,6 +655,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if BOTH(ENDSTOPPULLUPS, ENDSTOPPULLDOWNS) #error "Enable only one of ENDSTOPPULLUPS or ENDSTOPPULLDOWNS." +#elif BOTH(FIL_RUNOUT_PULLUP, FIL_RUNOUT_PULLDOWN) + #error "Enable only one of FIL_RUNOUT_PULLUP or FIL_RUNOUT_PULLDOWN." #elif BOTH(ENDSTOPPULLUP_XMAX, ENDSTOPPULLDOWN_XMAX) #error "Enable only one of ENDSTOPPULLUP_X_MAX or ENDSTOPPULLDOWN_X_MAX." #elif BOTH(ENDSTOPPULLUP_YMAX, ENDSTOPPULLDOWN_YMAX) @@ -823,6 +827,22 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "FIL_RUNOUT7_PIN is required with NUM_RUNOUT_SENSORS >= 7." #elif NUM_RUNOUT_SENSORS >= 8 && !PIN_EXISTS(FIL_RUNOUT8) #error "FIL_RUNOUT8_PIN is required with NUM_RUNOUT_SENSORS >= 8." + #elif BOTH(FIL_RUNOUT1_PULLUP, FIL_RUNOUT1_PULLDOWN) + #error "You can't enable FIL_RUNOUT1_PULLUP and FIL_RUNOUT1_PULLDOWN at the same time." + #elif BOTH(FIL_RUNOUT2_PULLUP, FIL_RUNOUT2_PULLDOWN) + #error "You can't enable FIL_RUNOUT2_PULLUP and FIL_RUNOUT2_PULLDOWN at the same time." + #elif BOTH(FIL_RUNOUT3_PULLUP, FIL_RUNOUT3_PULLDOWN) + #error "You can't enable FIL_RUNOUT3_PULLUP and FIL_RUNOUT3_PULLDOWN at the same time." + #elif BOTH(FIL_RUNOUT4_PULLUP, FIL_RUNOUT4_PULLDOWN) + #error "You can't enable FIL_RUNOUT4_PULLUP and FIL_RUNOUT4_PULLDOWN at the same time." + #elif BOTH(FIL_RUNOUT5_PULLUP, FIL_RUNOUT5_PULLDOWN) + #error "You can't enable FIL_RUNOUT5_PULLUP and FIL_RUNOUT5_PULLDOWN at the same time." + #elif BOTH(FIL_RUNOUT6_PULLUP, FIL_RUNOUT6_PULLDOWN) + #error "You can't enable FIL_RUNOUT6_PULLUP and FIL_RUNOUT6_PULLDOWN at the same time." + #elif BOTH(FIL_RUNOUT7_PULLUP, FIL_RUNOUT7_PULLDOWN) + #error "You can't enable FIL_RUNOUT7_PULLUP and FIL_RUNOUT7_PULLDOWN at the same time." + #elif BOTH(FIL_RUNOUT8_PULLUP, FIL_RUNOUT8_PULLDOWN) + #error "You can't enable FIL_RUNOUT8_PULLUP and FIL_RUNOUT8_PULLDOWN at the same time." #elif FILAMENT_RUNOUT_DISTANCE_MM < 0 #error "FILAMENT_RUNOUT_DISTANCE_MM must be greater than or equal to zero." #elif DISABLED(ADVANCED_PAUSE_FEATURE) @@ -2824,6 +2844,10 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "BACKUP_POWER_SUPPLY requires a POWER_LOSS_PIN." #endif +#if BOTH(POWER_LOSS_PULLUP, POWER_LOSS_PULLDOWN) + #error "You can't enable POWER_LOSS_PULLUP and POWER_LOSS_PULLDOWN at the same time." +#endif + #if ENABLED(Z_STEPPER_AUTO_ALIGN) #if NUM_Z_STEPPER_DRIVERS <= 1 #error "Z_STEPPER_AUTO_ALIGN requires NUM_Z_STEPPER_DRIVERS greater than 1." diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index b6086b82ed..226fb7291e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -77,7 +77,7 @@ namespace Anycubic { // Filament runout is handled by Marlin settings in Configuration.h // opt_set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. - // opt_enable FIL_RUNOUT_PULL + // opt_enable FIL_RUNOUT_PULLUP TFTSer.begin(115200); diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests index 9750b8fc2c..ef245143a8 100644 --- a/buildroot/tests/BIGTREE_GTR_V1_0-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0-tests @@ -34,9 +34,9 @@ opt_set FIL_RUNOUT6_PIN 8 opt_set FIL_RUNOUT7_PIN 9 opt_set FIL_RUNOUT8_PIN 10 opt_set FIL_RUNOUT4_STATE HIGH -opt_enable FIL_RUNOUT4_PULL +opt_enable FIL_RUNOUT4_PULLUP opt_set FIL_RUNOUT8_STATE HIGH -opt_enable FIL_RUNOUT8_PULL +opt_enable FIL_RUNOUT8_PULLUP exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" "$3" restore_configs diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 294de2a767..01ade82891 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -91,7 +91,7 @@ opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_ AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ - FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULL + FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULLUP opt_set NUM_RUNOUT_SENSORS 5 opt_set FIL_RUNOUT2_PIN 44 opt_set FIL_RUNOUT3_PIN 45 From 56c0608e4dc850857983317a551a2b8a7a8fd40e Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sun, 22 Nov 2020 01:21:43 +0100 Subject: [PATCH 0626/1370] Clear menu history for browse media on insert (#20236) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/marlinui.cpp | 1 + Marlin/src/lcd/menu/menu.cpp | 2 +- Marlin/src/lcd/menu/menu.h | 3 +++ Marlin/src/lcd/menu/menu_media.cpp | 2 -- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 9d0ebe27e4..acf35afb18 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1625,6 +1625,7 @@ void MarlinUI::update() { if (old_status < 2) { TERN_(EXTENSIBLE_UI, ExtUI::onMediaInserted()); // ExtUI response #if ENABLED(BROWSE_MEDIA_ON_INSERT) + clear_menu_history(); quick_feedback(); goto_screen(MEDIA_MENU_GATEWAY); #else diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 81ac32a60c..1497940ffe 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -206,8 +206,8 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co screen_items = items; if (on_status_screen()) { defer_status_screen(false); + clear_menu_history(); TERN_(AUTO_BED_LEVELING_UBL, ubl.lcd_map_control = false); - screen_history_depth = 0; } clear_lcd(); diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 66fe73cec1..5782d2070a 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -249,3 +249,6 @@ void _lcd_draw_homing(); #if ENABLED(TOUCH_SCREEN_CALIBRATION) void touch_screen_calibration(); #endif + +extern uint8_t screen_history_depth; +inline void clear_menu_history() { screen_history_depth = 0; } diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index 59cb2baa23..7a525d06b5 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -104,8 +104,6 @@ class MenuItem_sdfolder : public MenuItem_sdbase { } }; -extern uint8_t screen_history_depth; - void menu_media() { ui.encoder_direction_menus(); From 08717ef11721c6f37349af3c6ca6cc6802d9d3ec Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 21 Nov 2020 22:32:56 -0600 Subject: [PATCH 0627/1370] Put "$3" on all tests --- buildroot/tests/LPC1768-tests | 4 +- buildroot/tests/LPC1769-tests | 2 +- buildroot/tests/mega1280-tests | 2 +- buildroot/tests/mega2560-tests | 40 ++++++++++---------- buildroot/tests/mks_robin_nano35-tests | 2 +- buildroot/tests/mks_robin_nano35_stm32-tests | 12 +++--- buildroot/tests/rambo-tests | 2 +- buildroot/tests/teensy41-tests | 6 +-- 8 files changed, 35 insertions(+), 35 deletions(-) diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests index 9604ca2403..b8d0730314 100755 --- a/buildroot/tests/LPC1768-tests +++ b/buildroot/tests/LPC1768-tests @@ -11,7 +11,7 @@ set -e # #restore_configs #opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB -#exec_test $1 $2 "Default Configuration" +#exec_test $1 $2 "Default Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB @@ -21,7 +21,7 @@ exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), N #restore_configs #use_example_configs Mks/Sbase -#exec_test $1 $2 "MKS SBASE Example Config" +#exec_test $1 $2 "MKS SBASE Example Config" "$3" restore_configs opt_set MOTHERBOARD BOARD_MKS_SBASE diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index e4787f82da..702f8035ec 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -54,7 +54,7 @@ exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI" "$3" #opt_set FAN_MIN_PWM 50 #opt_set FAN_KICKSTART_TIME 100 #opt_set XY_FREQUENCY_LIMIT 15 -#exec_test $1 $2 "Azteeg X5 MINI WIFI Many less common options" +#exec_test $1 $2 "Azteeg X5 MINI WIFI Many less common options" "$3" restore_configs use_example_configs delta/generic diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index 1f06767248..ac1b5f692d 100644 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -10,7 +10,7 @@ set -e # Build with the default configurations # #restore_configs -#exec_test $1 $2 "Default Configuration" +#exec_test $1 $2 "Default Configuration" "$3" # # Test MESH_BED_LEVELING feature, with LCD diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 01ade82891..a968a5d213 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -10,7 +10,7 @@ set -e # Build with the default configurations # #restore_configs -#exec_test $1 $2 "Default Configuration" +#exec_test $1 $2 "Default Configuration" "$3" # # Test a probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders @@ -98,7 +98,7 @@ opt_set FIL_RUNOUT3_PIN 45 opt_set FIL_RUNOUT3_STATE HIGH opt_set FIL_RUNOUT4_PIN 46 opt_set FIL_RUNOUT5_PIN 47 -exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" +exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" "$3" # # Test MINIRAMBO with PWM_MOTOR_CURRENT and many features @@ -148,7 +148,7 @@ exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" # #restore_configs #opt_enable COREXY -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # Test many less common options @@ -181,27 +181,27 @@ exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home # #restore_configs #opt_enable ULTRA_LCD -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # DOGLCD # #restore_configs #opt_enable DOGLCD -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # MAKRPANEL # Needs to use Melzi and Sanguino hardware # #restore_configs #opt_enable MAKRPANEL -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # REPRAP_DISCOUNT_SMART_CONTROLLER, SDSUPPORT, BABYSTEPPING, RIGIDBOARD_V2, and DAC_MOTOR_CURRENT_DEFAULT # #restore_configs #opt_set MOTHERBOARD BOARD_RIGIDBOARD_V2 #opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # # G3D_PANEL with SDCARD_SORT_ALPHA and STATUS_MESSAGE_SCROLLING # @@ -211,20 +211,20 @@ exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home #opt_set SDSORT_USES_RAM true #opt_set SDSORT_USES_STACK true #opt_set SDSORT_CACHE_NAMES true -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # REPRAPWORLD_KEYPAD # # Cant find configuration details to get it to compile #restore_configs #opt_enable ULTRA_LCD REPRAPWORLD_KEYPAD REPRAPWORLD_KEYPAD_MOVE_STEP -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # RA_CONTROL_PANEL # #restore_configs #opt_enable RA_CONTROL_PANEL PINS_DEBUGGING -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" ######## I2C LCD/PANELS ############## # @@ -236,49 +236,49 @@ exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home # #restore_configs #opt_enable LCD_SAINSMART_I2C_1602 -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # LCD_I2C_PANELOLU2 # #restore_configs #opt_enable LCD_I2C_PANELOLU2 -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # LCD_I2C_VIKI # #restore_configs #opt_enable LCD_I2C_VIKI -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # LCM1602 # #restore_configs #opt_enable LCM1602 -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # Language files test with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER # #restore_configs #opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done +#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff" "$3"; done # #restore_configs #opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done +#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff" "$3"; done ######## Example Configurations ############## # # Test a basic DUAL_X_CARRIAGE configuration # use_example_configs Formbot/T_Rex_3 -exec_test $1 $2 "Formbot/T_Rex_3 example configuration." +exec_test $1 $2 "Formbot/T_Rex_3 example configuration." "$3" # # BQ Hephestos 2 #restore_configs #use_example_configs Hephestos_2 -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 @@ -308,7 +308,7 @@ exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" "$3" # Makibox Config need to check board type for Teensy++ 2.0 # #use_example_configs makibox -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # # Test mixed TMC config @@ -346,7 +346,7 @@ exec_test $1 $2 "RAMPS | SCARA | Mixed TMC | EEPROM" "$3" # tvrrug Config need to check board type for sanguino atmega644p # #use_example_configs tvrrug/Round2 -#exec_test $1 $2 "Stuff" +#exec_test $1 $2 "Stuff" "$3" # clean up restore_configs diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index 69f370ea69..391566f6d7 100644 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -72,7 +72,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 TOUCH_SCREEN opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 TFT_COLOR_UI -exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI without TOUCH_SCREEN" +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI without TOUCH_SCREEN" "$3" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_nano35_stm32-tests b/buildroot/tests/mks_robin_nano35_stm32-tests index 58912b85a3..696fb94069 100644 --- a/buildroot/tests/mks_robin_nano35_stm32-tests +++ b/buildroot/tests/mks_robin_nano35_stm32-tests @@ -12,7 +12,7 @@ set -e # use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" +exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" "$3" # # MKS Robin v2 nano Emulated DOGM SPI @@ -22,7 +22,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 opt_disable TFT_INTERFACE_FSMC opt_enable TFT_INTERFACE_SPI -exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" +exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" "$3" # # MKS Robin nano v1.2 LVGL FSMC @@ -31,7 +31,7 @@ exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" # opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO # opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 # opt_enable TFT_LVGL_UI TFT_RES_480x320 -# exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" +# exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" "$3" # # MKS Robin v2 nano LVGL SPI @@ -41,7 +41,7 @@ exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" # opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 # opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 # opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 -# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" +# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" "$3" # # MKS Robin v2 nano New Color UI 480x320 SPI @@ -51,7 +51,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 -exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3" # # MKS Robin v2 nano LVGL SPI + TMC @@ -63,7 +63,7 @@ exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" # opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 # opt_set X_DRIVER_TYPE TMC2209 # opt_set Y_DRIVER_TYPE TMC2209 -# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" +# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3" # cleanup restore_configs diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 231a21747b..6d2ef4f58a 100644 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -68,7 +68,7 @@ opt_set MOTHERBOARD BOARD_RAMBO opt_set EXTRUDERS 0 opt_set TEMP_SENSOR_BED 1 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -exec_test $1 $2 "Rambo heated bed only" +exec_test $1 $2 "Rambo heated bed only" "$3" # # Build with the default configurations diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests index 135891940e..6829045496 100644 --- a/buildroot/tests/teensy41-tests +++ b/buildroot/tests/teensy41-tests @@ -48,13 +48,13 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # opt_enable Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE \ # AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS # opt_set NUM_SERVOS 1 -# exec_test $1 $2 "Servo Probe" +# exec_test $1 $2 "Servo Probe" "$3" # # ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES # # opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS \ # EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES -# exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" +# exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" "$3" # # Test MAGNETIC_PARKING_EXTRUDER with no LCD @@ -84,7 +84,7 @@ exec_test $1 $2 "Mixing Extruder" "$3" # opt_set EXTRUDERS 2 # opt_set NUM_SERVOS 1 # opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER -# exec_test $1 $2 "SWITCHING_EXTRUDER" +# exec_test $1 $2 "SWITCHING_EXTRUDER" "$3" # # Enable COREXY From 82c1bac4e36f485830bd1f715f80203904857d5f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 1 Nov 2020 20:30:58 -0600 Subject: [PATCH 0628/1370] Move core conditionals earlier --- Marlin/src/inc/Conditionals_LCD.h | 59 +++++++++++++++++++++++++----- Marlin/src/inc/Conditionals_post.h | 37 ------------------- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 42a4e037d8..952ff2bbd6 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -26,16 +26,6 @@ * Conditionals that need to be set before Configuration_adv.h or pins.h */ -// Kinematics -#if ENABLED(MORGAN_SCARA) - #define IS_SCARA 1 - #define IS_KINEMATIC 1 -#elif ENABLED(DELTA) - #define IS_KINEMATIC 1 -#else - #define IS_CARTESIAN 1 -#endif - // MKS_LCD12864 is a variant of MKS_MINI_12864 #if ENABLED(MKS_LCD12864) #define MKS_MINI_12864 @@ -888,6 +878,55 @@ #define BOOT_MARLIN_LOGO_SMALL #endif +/** + * CoreXY, CoreXZ, and CoreYZ - and their reverse + */ +#if EITHER(COREXY, COREYX) + #define CORE_IS_XY 1 +#endif +#if EITHER(COREXZ, COREZX) + #define CORE_IS_XZ 1 +#endif +#if EITHER(COREYZ, COREZY) + #define CORE_IS_YZ 1 +#endif +#if CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ + #define IS_CORE 1 +#endif +#if IS_CORE + #if CORE_IS_XY + #define CORE_AXIS_1 A_AXIS + #define CORE_AXIS_2 B_AXIS + #define NORMAL_AXIS Z_AXIS + #elif CORE_IS_XZ + #define CORE_AXIS_1 A_AXIS + #define NORMAL_AXIS Y_AXIS + #define CORE_AXIS_2 C_AXIS + #elif CORE_IS_YZ + #define NORMAL_AXIS X_AXIS + #define CORE_AXIS_1 B_AXIS + #define CORE_AXIS_2 C_AXIS + #endif + #define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n)) +#elif ENABLED(MARKFORGED_XY) + // Markforged kinematics + #define CORE_AXIS_1 A_AXIS + #define CORE_AXIS_2 B_AXIS + #define NORMAL_AXIS Z_AXIS +#endif + +#if ENABLED(MORGAN_SCARA) + #define IS_SCARA 1 + #define IS_KINEMATIC 1 +#elif ENABLED(DELTA) + #define IS_KINEMATIC 1 +#else + #define IS_CARTESIAN 1 + #if !IS_CORE + #define IS_FULL_CARTESIAN 1 + #endif +#endif + // This flag indicates some kind of jerk storage is needed #if EITHER(CLASSIC_JERK, IS_KINEMATIC) #define HAS_CLASSIC_JERK 1 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 994d83ffb3..4f4787855c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -120,43 +120,6 @@ #endif #endif -/** - * CoreXY, CoreXZ, and CoreYZ - and their reverse - */ -#if EITHER(COREXY, COREYX) - #define CORE_IS_XY 1 -#endif -#if EITHER(COREXZ, COREZX) - #define CORE_IS_XZ 1 -#endif -#if EITHER(COREYZ, COREZY) - #define CORE_IS_YZ 1 -#endif -#if CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ - #define IS_CORE 1 -#endif -#if IS_CORE - #if CORE_IS_XY - #define CORE_AXIS_1 A_AXIS - #define CORE_AXIS_2 B_AXIS - #define NORMAL_AXIS Z_AXIS - #elif CORE_IS_XZ - #define CORE_AXIS_1 A_AXIS - #define NORMAL_AXIS Y_AXIS - #define CORE_AXIS_2 C_AXIS - #elif CORE_IS_YZ - #define NORMAL_AXIS X_AXIS - #define CORE_AXIS_1 B_AXIS - #define CORE_AXIS_2 C_AXIS - #endif - #define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n)) -#elif ENABLED(MARKFORGED_XY) - // Markforged kinematics - #define CORE_AXIS_1 A_AXIS - #define CORE_AXIS_2 B_AXIS - #define NORMAL_AXIS Z_AXIS -#endif - // Calibration codes only for non-core axes #if EITHER(BACKLASH_GCODE, CALIBRATION_GCODE) #if EITHER(IS_CORE, MARKFORGED_XY) From 28cd6eca888172de9fdef0a7c2cfec4da8f1e9d5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 21 Nov 2020 23:00:17 -0600 Subject: [PATCH 0629/1370] Hide docker droppings --- buildroot/share/sublime/MarlinFirmware.sublime-project | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildroot/share/sublime/MarlinFirmware.sublime-project b/buildroot/share/sublime/MarlinFirmware.sublime-project index 1e9275f646..e0cf953fa8 100644 --- a/buildroot/share/sublime/MarlinFirmware.sublime-project +++ b/buildroot/share/sublime/MarlinFirmware.sublime-project @@ -19,7 +19,8 @@ "Marlin/.gitignore", "Marlin/*/platformio.ini", "Marlin/*/.travis.yml", - "Marlin/*/.gitignore" + "Marlin/*/.gitignore", + "*.d" ], "path": "../../.." } From 5e57e60692ec6760532650dbf008290aac3021d5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 22 Nov 2020 16:20:33 -0800 Subject: [PATCH 0630/1370] Fix UBL manual mesh adjust behavior (#20248) --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index e8524da368..94bec99194 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -949,7 +949,7 @@ g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. #if ENABLED(UBL_MESH_EDIT_MOVES_Z) - const float h_offset = parser.seenval('H') ? parser.value_linear_units() : 0; + const float h_offset = parser.seenval('H') ? parser.value_linear_units() : MANUAL_PROBE_START_Z; if (!WITHIN(h_offset, 0, 10)) { SERIAL_ECHOLNPGM("Offset out of bounds. (0 to 10mm)\n"); return; @@ -970,8 +970,6 @@ do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance - TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset - MeshFlags done_flags{0}; const xy_int8_t &lpos = location.pos; do { From 300a944af6c2aa325a41fa19f2bff44ee7bccb66 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 22 Nov 2020 18:44:17 -0600 Subject: [PATCH 0631/1370] Allow Status Message without LCD (#20246) --- Marlin/src/gcode/temp/M303.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 4 + Marlin/src/lcd/marlinui.cpp | 221 ++++++++++++++++-------------- Marlin/src/lcd/marlinui.h | 47 +++---- 4 files changed, 147 insertions(+), 127 deletions(-) diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 52e34fc473..a066ddc88d 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -77,7 +77,7 @@ void GcodeSuite::M303() { KEEPALIVE_STATE(NOT_BUSY); #endif - ui.set_status_P(GET_TEXT(MSG_PID_AUTOTUNE)); + LCD_MESSAGEPGM(MSG_PID_AUTOTUNE); thermalManager.PID_autotune(temp, e, c, u); ui.reset_status(); } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 952ff2bbd6..9c080ee286 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -472,6 +472,10 @@ #endif #endif +#if EITHER(HAS_DISPLAY, GLOBAL_STATUS_MESSAGE) + #define HAS_STATUS_MESSAGE 1 +#endif + #if IS_ULTIPANEL && DISABLED(NO_LCD_MENUS) #define HAS_LCD_MENU 1 #endif diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index acf35afb18..241d3a1712 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1332,59 +1332,16 @@ void MarlinUI::update() { #endif // HAS_WIRED_LCD -#if HAS_DISPLAY +#if HAS_STATUS_MESSAGE + + //////////////////////////////////////////// + ////////////// Status Message ////////////// + //////////////////////////////////////////// #if ENABLED(EXTENSIBLE_UI) #include "extui/ui_api.h" #endif - //////////////////////////////////////////// - /////////////// Status Line //////////////// - //////////////////////////////////////////// - - #if ENABLED(STATUS_MESSAGE_SCROLLING) - void MarlinUI::advance_status_scroll() { - // Advance by one UTF8 code-word - if (status_scroll_offset < utf8_strlen(status_message)) - while (!START_OF_UTF8_CHAR(status_message[++status_scroll_offset])); - else - status_scroll_offset = 0; - } - char* MarlinUI::status_and_len(uint8_t &len) { - char *out = status_message + status_scroll_offset; - len = utf8_strlen(out); - return out; - } - #endif - - void MarlinUI::finish_status(const bool persist) { - - #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE) > 0) - UNUSED(persist); - #endif - - #if ENABLED(LCD_PROGRESS_BAR) || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - const millis_t ms = millis(); - #endif - - #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL - progress_bar_ms = ms; - #if PROGRESS_MSG_EXPIRE > 0 - expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; - #endif - #endif - - #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - next_filament_display = ms + 5000UL; // Show status message for 5s - #endif - - #if BOTH(HAS_WIRED_LCD, STATUS_MESSAGE_SCROLLING) - status_scroll_offset = 0; - #endif - - TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); - } - bool MarlinUI::has_status() { return (status_message[0] != '\0'); } void MarlinUI::set_status(const char * const message, const bool persist) { @@ -1414,16 +1371,45 @@ void MarlinUI::update() { finish_status(persist); } - #include + /** + * Reset the status message + */ + void MarlinUI::reset_status(const bool no_welcome) { + #if SERVICE_INTERVAL_1 > 0 + static PGMSTR(service1, "> " SERVICE_NAME_1 "!"); + #endif + #if SERVICE_INTERVAL_2 > 0 + static PGMSTR(service2, "> " SERVICE_NAME_2 "!"); + #endif + #if SERVICE_INTERVAL_3 > 0 + static PGMSTR(service3, "> " SERVICE_NAME_3 "!"); + #endif + PGM_P msg; + if (printingIsPaused()) + msg = GET_TEXT(MSG_PRINT_PAUSED); + #if ENABLED(SDSUPPORT) + else if (IS_SD_PRINTING()) + return set_status(card.longest_filename(), true); + #endif + else if (print_job_timer.isRunning()) + msg = GET_TEXT(MSG_PRINTING); - void MarlinUI::status_printf_P(const uint8_t level, PGM_P const fmt, ...) { - if (level < alert_level) return; - alert_level = level; - va_list args; - va_start(args, fmt); - vsnprintf_P(status_message, MAX_MESSAGE_LENGTH, fmt, args); - va_end(args); - finish_status(level > 0); + #if SERVICE_INTERVAL_1 > 0 + else if (print_job_timer.needsService(1)) msg = service1; + #endif + #if SERVICE_INTERVAL_2 > 0 + else if (print_job_timer.needsService(2)) msg = service2; + #endif + #if SERVICE_INTERVAL_3 > 0 + else if (print_job_timer.needsService(3)) msg = service3; + #endif + + else if (!no_welcome) + msg = GET_TEXT(WELCOME_MSG); + else + return; + + set_status_P(msg, -1); } void MarlinUI::set_status_P(PGM_P const message, int8_t level) { @@ -1459,51 +1445,76 @@ void MarlinUI::update() { TERN_(HAS_LCD_MENU, return_to_status()); } - PGM_P print_paused = GET_TEXT(MSG_PRINT_PAUSED); + #include - /** - * Reset the status message - */ - void MarlinUI::reset_status(const bool no_welcome) { - PGM_P printing = GET_TEXT(MSG_PRINTING); - PGM_P welcome = GET_TEXT(WELCOME_MSG); - #if SERVICE_INTERVAL_1 > 0 - static PGMSTR(service1, "> " SERVICE_NAME_1 "!"); - #endif - #if SERVICE_INTERVAL_2 > 0 - static PGMSTR(service2, "> " SERVICE_NAME_2 "!"); - #endif - #if SERVICE_INTERVAL_3 > 0 - static PGMSTR(service3, "> " SERVICE_NAME_3 "!"); - #endif - PGM_P msg; - if (printingIsPaused()) - msg = print_paused; - #if ENABLED(SDSUPPORT) - else if (IS_SD_PRINTING()) - return set_status(card.longest_filename(), true); - #endif - else if (print_job_timer.isRunning()) - msg = printing; - - #if SERVICE_INTERVAL_1 > 0 - else if (print_job_timer.needsService(1)) msg = service1; - #endif - #if SERVICE_INTERVAL_2 > 0 - else if (print_job_timer.needsService(2)) msg = service2; - #endif - #if SERVICE_INTERVAL_3 > 0 - else if (print_job_timer.needsService(3)) msg = service3; - #endif - - else if (!no_welcome) - msg = welcome; - else - return; - - set_status_P(msg, -1); + void MarlinUI::status_printf_P(const uint8_t level, PGM_P const fmt, ...) { + if (level < alert_level) return; + alert_level = level; + va_list args; + va_start(args, fmt); + vsnprintf_P(status_message, MAX_MESSAGE_LENGTH, fmt, args); + va_end(args); + finish_status(level > 0); } + void MarlinUI::finish_status(const bool persist) { + + #if HAS_SPI_LCD + + #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE) > 0) + UNUSED(persist); + #endif + + #if ENABLED(LCD_PROGRESS_BAR) || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + const millis_t ms = millis(); + #endif + + #if ENABLED(LCD_PROGRESS_BAR) + progress_bar_ms = ms; + #if PROGRESS_MSG_EXPIRE > 0 + expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; + #endif + #endif + + #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + next_filament_display = ms + 5000UL; // Show status message for 5s + #endif + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + status_scroll_offset = 0; + #endif + + #endif + + TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); + } + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + + void MarlinUI::advance_status_scroll() { + // Advance by one UTF8 code-word + if (status_scroll_offset < utf8_strlen(status_message)) + while (!START_OF_UTF8_CHAR(status_message[++status_scroll_offset])); + else + status_scroll_offset = 0; + } + + char* MarlinUI::status_and_len(uint8_t &len) { + char *out = status_message + status_scroll_offset; + len = utf8_strlen(out); + return out; + } + + #endif + +#endif + +#if HAS_DISPLAY + + #if ENABLED(SDSUPPORT) + extern bool wait_for_user, wait_for_heatup; + #endif + void MarlinUI::abort_print() { #if ENABLED(SDSUPPORT) wait_for_heatup = wait_for_user = false; @@ -1514,7 +1525,7 @@ void MarlinUI::update() { #endif TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("UI Aborted"), DISMISS_STR)); print_job_timer.stop(); - set_status_P(GET_TEXT(MSG_PRINT_ABORTED)); + LCD_MESSAGEPGM(MSG_PRINT_ABORTED); TERN_(HAS_LCD_MENU, return_to_status()); } @@ -1530,7 +1541,7 @@ void MarlinUI::update() { TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("UI Pause"), PSTR("Resume"))); - set_status_P(print_paused); + LCD_MESSAGEPGM(MSG_PRINT_PAUSED); #if ENABLED(PARK_HEAD_ON_PAUSE) TERN_(HAS_WIRED_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress @@ -1615,6 +1626,10 @@ void MarlinUI::update() { #if ENABLED(SDSUPPORT) + #if ENABLED(EXTENSIBLE_UI) + #include "extui/ui_api.h" + #endif + void MarlinUI::media_changed(const uint8_t old_status, const uint8_t status) { if (old_status == status) { TERN_(EXTENSIBLE_UI, ExtUI::onMediaError()); // Failed to mount/unmount @@ -1629,7 +1644,7 @@ void MarlinUI::update() { quick_feedback(); goto_screen(MEDIA_MENU_GATEWAY); #else - set_status_P(GET_TEXT(MSG_MEDIA_INSERTED)); + LCD_MESSAGEPGM(MSG_MEDIA_INSERTED); #endif } } @@ -1637,7 +1652,7 @@ void MarlinUI::update() { if (old_status < 2) { TERN_(EXTENSIBLE_UI, ExtUI::onMediaRemoved()); // ExtUI response #if PIN_EXISTS(SD_DETECT) - set_status_P(GET_TEXT(MSG_MEDIA_REMOVED)); + LCD_MESSAGEPGM(MSG_MEDIA_REMOVED); #if HAS_LCD_MENU if (!defer_return_to_status) return_to_status(); #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 3311f55ed5..ccf995bd71 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -373,17 +373,9 @@ public: static constexpr uint8_t get_progress_percent() { return 0; } #endif - #if HAS_DISPLAY - - static void init(); - static void update(); - static void set_alert_status_P(PGM_P const message); - + #if HAS_STATUS_MESSAGE static char status_message[]; - static bool has_status(); - static uint8_t alert_level; // Higher levels block lower levels - static inline void reset_alert_level() { alert_level = 0; } #if ENABLED(STATUS_MESSAGE_SCROLLING) static uint8_t status_scroll_offset; @@ -391,6 +383,28 @@ public: static char* status_and_len(uint8_t &len); #endif + static bool has_status(); + static void reset_status(const bool no_welcome=false); + static void set_status(const char* const message, const bool persist=false); + static void set_status_P(PGM_P const message, const int8_t level=0); + static void status_printf_P(const uint8_t level, PGM_P const fmt, ...); + static void set_alert_status_P(PGM_P const message); + static inline void reset_alert_level() { alert_level = 0; } + #else + static constexpr bool has_status() { return false; } + static inline void reset_status(const bool=false) {} + static void set_status(const char* message, const bool=false); + static void set_status_P(PGM_P message, const int8_t=0); + static void status_printf_P(const uint8_t, PGM_P message, ...); + static inline void set_alert_status_P(PGM_P const) {} + static inline void reset_alert_level() {} + #endif + + #if HAS_DISPLAY + + static void init(); + static void update(); + static void abort_print(); static void pause_print(); static void resume_print(); @@ -481,25 +495,12 @@ public: static bool get_blink(); static void kill_screen(PGM_P const lcd_error, PGM_P const lcd_component); static void draw_kill_screen(); - static void set_status(const char* const message, const bool persist=false); - static void set_status_P(PGM_P const message, const int8_t level=0); - static void status_printf_P(const uint8_t level, PGM_P const fmt, ...); - static void reset_status(const bool no_welcome=false); #else // No LCD - // Send status to host as a notification - static void set_status(const char* message, const bool=false); - static void set_status_P(PGM_P message, const int8_t=0); - static void status_printf_P(const uint8_t, PGM_P message, ...); - static inline void init() {} static inline void update() {} static inline void return_to_status() {} - static inline void set_alert_status_P(PGM_P const) {} - static inline void reset_status(const bool=false) {} - static inline void reset_alert_level() {} - static constexpr bool has_status() { return false; } #endif @@ -702,7 +703,7 @@ public: private: - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE static void finish_status(const bool persist); #endif From 8cd25f35c25a31efd54255af102b4104e880dadb Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 22 Nov 2020 16:47:52 -0800 Subject: [PATCH 0632/1370] Fix dummy thermistors for Bed, Chamber, Probe (#20247) --- Marlin/src/inc/Conditionals_post.h | 15 +++++++++++---- Marlin/src/module/temperature.cpp | 18 +++++++++--------- Marlin/src/module/temperature.h | 6 +++--- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 4f4787855c..35fd92e10b 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1774,12 +1774,19 @@ #define HAS_TEMP_ADC_CHAMBER 1 #endif -#if HAS_HOTEND && ANY(HAS_TEMP_ADC_0, HEATER_0_USES_MAX6675, HEATER_0_DUMMY_THERMISTOR) +#define HAS_TEMP(N) ANY(HAS_TEMP_ADC_##N, HEATER_##N##_USES_MAX6675, HEATER_##N##_DUMMY_THERMISTOR) +#if HAS_HOTEND && HAS_TEMP(0) #define HAS_TEMP_HOTEND 1 #endif -#define HAS_TEMP_BED HAS_TEMP_ADC_BED -#define HAS_TEMP_PROBE HAS_TEMP_ADC_PROBE -#define HAS_TEMP_CHAMBER HAS_TEMP_ADC_CHAMBER +#if HAS_TEMP(BED) + #define HAS_TEMP_BED 1 +#endif +#if HAS_TEMP(PROBE) + #define HAS_TEMP_PROBE 1 +#endif +#if HAS_TEMP(CHAMBER) + #define HAS_TEMP_CHAMBER 1 +#endif #if ENABLED(JOYSTICK) #if PIN_EXISTS(JOY_X) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index d9ce6e151e..d704ebc85b 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1839,13 +1839,13 @@ void Temperature::init() { #if HAS_JOY_ADC_EN SET_INPUT_PULLUP(JOY_EN_PIN); #endif - #if HAS_HEATED_BED + #if HAS_TEMP_ADC_BED HAL_ANALOG_SELECT(TEMP_BED_PIN); #endif - #if HAS_TEMP_CHAMBER + #if HAS_TEMP_ADC_CHAMBER HAL_ANALOG_SELECT(TEMP_CHAMBER_PIN); #endif - #if HAS_TEMP_PROBE + #if HAS_TEMP_ADC_PROBE HAL_ANALOG_SELECT(TEMP_PROBE_PIN); #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) @@ -2355,9 +2355,9 @@ void Temperature::update_raw_temperatures() { TERN_(HAS_TEMP_ADC_5, temp_hotend[5].update()); TERN_(HAS_TEMP_ADC_6, temp_hotend[6].update()); TERN_(HAS_TEMP_ADC_7, temp_hotend[7].update()); - TERN_(HAS_HEATED_BED, temp_bed.update()); - TERN_(HAS_TEMP_CHAMBER, temp_chamber.update()); - TERN_(HAS_TEMP_PROBE, temp_probe.update()); + TERN_(HAS_TEMP_ADC_BED, temp_bed.update()); + TERN_(HAS_TEMP_ADC_CHAMBER, temp_chamber.update()); + TERN_(HAS_TEMP_ADC_PROBE, temp_probe.update()); TERN_(HAS_JOY_ADC_X, joystick.x.update()); TERN_(HAS_JOY_ADC_Y, joystick.y.update()); @@ -2822,17 +2822,17 @@ void Temperature::tick() { case MeasureTemp_0: ACCUMULATE_ADC(temp_hotend[0]); break; #endif - #if HAS_HEATED_BED + #if HAS_TEMP_ADC_BED case PrepareTemp_BED: HAL_START_ADC(TEMP_BED_PIN); break; case MeasureTemp_BED: ACCUMULATE_ADC(temp_bed); break; #endif - #if HAS_TEMP_CHAMBER + #if HAS_TEMP_ADC_CHAMBER case PrepareTemp_CHAMBER: HAL_START_ADC(TEMP_CHAMBER_PIN); break; case MeasureTemp_CHAMBER: ACCUMULATE_ADC(temp_chamber); break; #endif - #if HAS_TEMP_PROBE + #if HAS_TEMP_ADC_PROBE case PrepareTemp_PROBE: HAL_START_ADC(TEMP_PROBE_PIN); break; case MeasureTemp_PROBE: ACCUMULATE_ADC(temp_probe); break; #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index edaa1c5384..33f38c3036 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -89,13 +89,13 @@ enum ADCSensorState : char { #if HAS_TEMP_ADC_0 PrepareTemp_0, MeasureTemp_0, #endif - #if HAS_HEATED_BED + #if HAS_TEMP_ADC_BED PrepareTemp_BED, MeasureTemp_BED, #endif - #if HAS_TEMP_CHAMBER + #if HAS_TEMP_ADC_CHAMBER PrepareTemp_CHAMBER, MeasureTemp_CHAMBER, #endif - #if HAS_TEMP_PROBE + #if HAS_TEMP_ADC_PROBE PrepareTemp_PROBE, MeasureTemp_PROBE, #endif #if HAS_TEMP_ADC_1 From 82663c7d114b89d90e3a28cc03ed3a52faa096f2 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 23 Nov 2020 03:07:43 -0800 Subject: [PATCH 0633/1370] Fix Z4 in ENABLE/DISABLE_AXIS_Z (#20256) This was accidentally broken in PR #20218 --- Marlin/src/module/stepper/indirection.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 04cebc216f..d14bfc7329 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -859,8 +859,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define DISABLE_AXIS_X() if (SHOULD_DISABLE(x)) { DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); AFTER_CHANGE(x, false); FORGET_AXIS(X_AXIS); } #define ENABLE_AXIS_Y() if (SHOULD_ENABLE(y)) { ENABLE_STEPPER_Y(); ENABLE_STEPPER_Y2(); AFTER_CHANGE(y, true); } #define DISABLE_AXIS_Y() if (SHOULD_DISABLE(y)) { DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); AFTER_CHANGE(y, false); FORGET_AXIS(Y_AXIS); } -#define ENABLE_AXIS_Z() if (SHOULD_ENABLE(z)) { ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); AFTER_CHANGE(z, true); } -#define DISABLE_AXIS_Z() if (SHOULD_DISABLE(z)) { DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); AFTER_CHANGE(z, false); FORGET_AXIS(Z_AXIS); Z_RESET(); } +#define ENABLE_AXIS_Z() if (SHOULD_ENABLE(z)) { ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); AFTER_CHANGE(z, true); } +#define DISABLE_AXIS_Z() if (SHOULD_DISABLE(z)) { DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); AFTER_CHANGE(z, false); FORGET_AXIS(Z_AXIS); Z_RESET(); } #define FORGET_AXIS(A) TERN(HOME_AFTER_DEACTIVATE, set_axis_never_homed(A), CBI(axis_known_position, A)) From a711e22b1784cd5ed2100be7b948b90925569cc8 Mon Sep 17 00:00:00 2001 From: rdhoggattjr <64983896+rdhoggattjr@users.noreply.github.com> Date: Mon, 23 Nov 2020 23:02:54 -0600 Subject: [PATCH 0634/1370] LCD position in current units (#20145) --- Marlin/src/gcode/host/M114.cpp | 7 +-- Marlin/src/gcode/parser.h | 4 ++ Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 35 ++++++++++---- Marlin/src/lcd/language/language_en.h | 3 ++ Marlin/src/lcd/menu/menu_motion.cpp | 53 ++++++++++++++-------- 5 files changed, 68 insertions(+), 34 deletions(-) diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp index 85a38f6462..75356ff66f 100644 --- a/Marlin/src/gcode/host/M114.cpp +++ b/Marlin/src/gcode/host/M114.cpp @@ -55,7 +55,6 @@ } void report_current_position_detail() { - // Position as sent by G-code SERIAL_ECHOPGM("\nLogical:"); report_xyz(current_position.asLogical()); @@ -81,11 +80,7 @@ #if IS_KINEMATIC // Kinematics applied to the leveled position - #if IS_SCARA - SERIAL_ECHOPGM("ScaraK: "); - #else - SERIAL_ECHOPGM("DeltaK: "); - #endif + SERIAL_ECHOPGM(TERN(IS_SCARA, "ScaraK: ", "DeltaK: ")); inverse_kinematics(leveled); // writes delta[] report_xyz(delta); #endif diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 69bbdaf02d..8633d2b1e9 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -329,6 +329,10 @@ public: #endif + static inline bool using_inch_units() { return mm_to_linear_unit(1.0f) != 1.0f; } + + #define IN_TO_MM(I) ((I) * 25.4f) + #define MM_TO_IN(M) ((M) / 25.4f) #define LINEAR_UNIT(V) parser.mm_to_linear_unit(V) #define VOLUMETRIC_UNIT(V) parser.mm_to_volumetric_unit(V) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 9fef625826..882b2fef50 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -38,10 +38,11 @@ #include "../../module/motion.h" #include "../../module/temperature.h" +#include "../../gcode/parser.h" // for units (and volumetric) + #if ENABLED(FILAMENT_LCD_DISPLAY) #include "../../feature/filwidth.h" #include "../../module/planner.h" - #include "../../gcode/parser.h" #endif #if HAS_CUTTER @@ -67,6 +68,11 @@ #define X_LABEL_POS 3 #define X_VALUE_POS 11 #define XYZ_SPACING 37 + +#define X_LABEL_POS_IN (X_LABEL_POS - 2) +#define X_VALUE_POS_IN (X_VALUE_POS - 5) +#define XYZ_SPACING_IN (XYZ_SPACING + 9) + #define XYZ_BASELINE (30 + INFO_FONT_ASCENT) #define EXTRAS_BASELINE (40 + INFO_FONT_ASCENT) #define STATUS_BASELINE (LCD_PIXEL_HEIGHT - INFO_FONT_DESCENT) @@ -370,10 +376,12 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons // Homed and known, display constantly. // FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { + const bool is_inch = parser.using_inch_units(); const AxisEnum a = TERN(LCD_SHOW_E_TOTAL, axis == E_AXIS ? X_AXIS : axis, axis); - const uint8_t offs = (XYZ_SPACING) * a; - lcd_put_wchar(X_LABEL_POS + offs, XYZ_BASELINE, axis_codes[axis]); - lcd_moveto(X_VALUE_POS + offs, XYZ_BASELINE); + const uint8_t offs = a * (is_inch ? XYZ_SPACING_IN : XYZ_SPACING); + lcd_put_wchar((is_inch ? X_LABEL_POS_IN : X_LABEL_POS) + offs, XYZ_BASELINE, axis_codes[axis]); + lcd_moveto((is_inch ? X_VALUE_POS_IN : X_VALUE_POS) + offs, XYZ_BASELINE); + if (blink) lcd_put_u8str(value); else { @@ -390,9 +398,16 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const } } +/** + * Draw the Status Screen for a 128x64 DOGM (U8glib) display. + * + * Called as needed to update the current display stripe. + * Use the PAGE_CONTAINS macros to avoid pointless draw calls. + */ void MarlinUI::draw_status_screen() { + constexpr int xystorage = TERN(INCH_MODE_SUPPORT, 8, 5); + static char xstring[TERN(LCD_SHOW_E_TOTAL, 12, xystorage)], ystring[xystorage], zstring[8]; - static char xstring[TERN(LCD_SHOW_E_TOTAL, 12, 5)], ystring[5], zstring[8]; #if ENABLED(FILAMENT_LCD_DISPLAY) static char wstring[5], mstring[4]; #endif @@ -439,7 +454,8 @@ void MarlinUI::draw_status_screen() { #endif const xyz_pos_t lpos = current_position.asLogical(); - strcpy(zstring, ftostr52sp(lpos.z)); + const bool is_inch = parser.using_inch_units(); + strcpy(zstring, is_inch ? ftostr42_52(LINEAR_UNIT(lpos.z)) : ftostr52sp(lpos.z)); if (show_e_total) { #if ENABLED(LCD_SHOW_E_TOTAL) @@ -448,8 +464,8 @@ void MarlinUI::draw_status_screen() { #endif } else { - strcpy(xstring, ftostr4sign(lpos.x)); - strcpy(ystring, ftostr4sign(lpos.y)); + strcpy(xstring, is_inch ? ftostr53_63(LINEAR_UNIT(lpos.x)) : ftostr4sign(lpos.x)); + strcpy(ystring, is_inch ? ftostr53_63(LINEAR_UNIT(lpos.y)) : ftostr4sign(lpos.y)); } #if ENABLED(FILAMENT_LCD_DISPLAY) @@ -854,6 +870,9 @@ void MarlinUI::draw_status_screen() { } } +/** + * Draw the Status Message area + */ void MarlinUI::draw_status_message(const bool blink) { // Get the UTF8 character count of the string diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 0355f2f512..04487fa13f 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -258,6 +258,9 @@ namespace Language_en { PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Move 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Move 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Move 10mm"); + PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Move 0.001in"); + PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Move 0.01in"); + PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Move 0.1in"); PROGMEM Language_Str MSG_SPEED = _UxGT("Speed"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index c681842e90..468af3273c 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -32,6 +32,7 @@ #include "menu_addon.h" #include "../../module/motion.h" +#include "../../gcode/parser.h" // for inch support #if ENABLED(DELTA) #include "../../module/delta.h" @@ -95,7 +96,12 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), axis ); - MenuEditItemBase::draw_edit_screen(name, ui.manual_move.menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr63(pos)); + if (parser.using_inch_units()) { + const float imp_pos = LINEAR_UNIT(pos); + MenuEditItemBase::draw_edit_screen(name, ftostr63(imp_pos)); + } + else + MenuEditItemBase::draw_edit_screen(name, ui.manual_move.menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr63(pos)); } } void lcd_move_x() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_X), X_AXIS); } @@ -165,26 +171,33 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int } BACK_ITEM(MSG_MOVE_AXIS); - SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); }); - SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); - SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); - if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - // Determine digits needed right of decimal - constexpr uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - PGM_P const label = GET_TEXT(MSG_MOVE_Z_DIST); - char tmp[strlen_P(label) + 10 + 1], numstr[10]; - sprintf_P(tmp, label, dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + if (parser.using_inch_units()) { + SUBMENU(MSG_MOVE_01IN, []{ _goto_manual_move(IN_TO_MM(0.100f)); }); + SUBMENU(MSG_MOVE_001IN, []{ _goto_manual_move(IN_TO_MM(0.010f)); }); + SUBMENU(MSG_MOVE_0001IN, []{ _goto_manual_move(IN_TO_MM(0.001f)); }); + } + else { + SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); }); + SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); + SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); + if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { + // Determine digits needed right of decimal + constexpr uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + PGM_P const label = GET_TEXT(MSG_MOVE_Z_DIST); + char tmp[strlen_P(label) + 10 + 1], numstr[10]; + sprintf_P(tmp, label, dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); - #if DISABLED(HAS_GRAPHICAL_TFT) - extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); - lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); - #else - SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - #endif + #if DISABLED(HAS_GRAPHICAL_TFT) + extern const char NUL_STR[]; + SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); + lcd_put_u8str(tmp); + MENU_ITEM_ADDON_END(); + #else + SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + #endif + } } END_MENU(); } From 629f0e21c946a4c36e5754ba4fc2186283b2fc2d Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 25 Nov 2020 11:14:22 +1300 Subject: [PATCH 0635/1370] Set "lcd_move_e" index to fix the label (#20263) --- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 468af3273c..478608e9b3 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -205,7 +205,7 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int #if E_MANUAL inline void _goto_menu_move_distance_e() { - ui.goto_screen([]{ _menu_move_distance(E_AXIS, []{ lcd_move_e(); }, -1); }); + ui.goto_screen([]{ _menu_move_distance(E_AXIS, []{ lcd_move_e(TERN_(MULTI_MANUAL, active_extruder)); }, -1); }); } inline void _menu_move_distance_e_maybe() { From 6cca5a9f9252f6b23cc53a968164ab0987893dc3 Mon Sep 17 00:00:00 2001 From: pseudex Date: Tue, 24 Nov 2020 23:20:06 +0100 Subject: [PATCH 0636/1370] Allow cold Filament Load/Unload with M302 P1 (#20262) Co-authored-by: Scott Lahteine --- Marlin/src/feature/pause.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 024338f242..1593b0cc57 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -142,10 +142,10 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P #endif UNUSED(mode); - if (wait) - return thermalManager.wait_for_hotend(active_extruder); + if (wait) return thermalManager.wait_for_hotend(active_extruder); - wait_for_heatup = true; // Allow interruption by Emergency Parser M108 + // Allow interruption by Emergency Parser M108 + wait_for_heatup = TERN1(PREVENT_COLD_EXTRUSION, !thermalManager.allow_cold_extrude); while (wait_for_heatup && ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW) idle(); wait_for_heatup = false; From 03cdfafc2ad5a7f12dca7829e173ecb65d2e0112 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 24 Nov 2020 14:27:59 -0800 Subject: [PATCH 0637/1370] No Z_MULTI_ENDSTOPS when HOMING_Z_WITH_PROBE (#20254) --- Marlin/src/inc/SanityCheck.h | 2 ++ buildroot/tests/DUE-tests | 7 +------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 072bb26bfe..0dfa305841 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2006,6 +2006,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "Enable USE_ZMIN_PLUG when homing Z to MIN." #elif Z_HOME_DIR > 0 && ENABLED(USE_PROBE_FOR_Z_HOMING) #error "Z_HOME_DIR must be -1 when homing Z with the probe." +#elif BOTH(HOMING_Z_WITH_PROBE, Z_MULTI_ENDSTOPS) + #error "Z_MULTI_ENDSTOPS is incompatible with USE_PROBE_FOR_Z_HOMING." #elif Z_HOME_DIR > 0 && DISABLED(USE_ZMAX_PLUG) #error "Enable USE_ZMAX_PLUG when homing Z to MAX." #endif diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index ccb49bf482..009688ce21 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -41,14 +41,9 @@ exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options restore_configs opt_set MOTHERBOARD BOARD_RADDS opt_enable USE_XMAX_PLUG USE_YMAX_PLUG ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ - Z_MULTI_ENDSTOPS Z_STEPPER_AUTO_ALIGN Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS \ - Z_SAFE_HOMING + Z_STEPPER_AUTO_ALIGN Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS Z_SAFE_HOMING #TOUCH_UI_FTDI_EVE LCD_ALEPHOBJECTS_CLCD_UI OTHER_PIN_LAYOUT opt_set NUM_Z_STEPPER_DRIVERS 3 -opt_add Z2_MAX_ENDSTOP_INVERTING false -opt_add Z3_MAX_ENDSTOP_INVERTING false -opt_add Z2_MAX_PIN 2 -opt_add Z3_MAX_PIN 3 pins_set ramps/RAMPS X_MAX_PIN -1 pins_set ramps/RAMPS Y_MAX_PIN -1 exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" "$3" From 109c08e9e5ae89c4f878b53902ee98c817c62333 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 24 Nov 2020 17:38:13 -0600 Subject: [PATCH 0638/1370] Consistent Probe XY offset type --- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 2 +- Marlin/src/module/probe.cpp | 2 +- Marlin/src/module/probe.h | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 38f17869fb..8ffada5c03 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -144,7 +144,7 @@ void GcodeSuite::G76() { const xyz_pos_t parkpos = temp_comp.park_point, probe_pos_xyz = xyz_pos_t(temp_comp.measure_point) + xyz_pos_t({ 0.0f, 0.0f, PTC_PROBE_HEATING_OFFSET }), - noz_pos_xyz = probe_pos_xyz - xy_pos_t(probe.offset_xy); // Nozzle position based on probe position + noz_pos_xyz = probe_pos_xyz - probe.offset_xy; // Nozzle position based on probe position if (do_bed_cal || do_probe_cal) { // Ensure park position is reachable diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index ff80063d65..f02b909150 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -89,7 +89,7 @@ Probe probe; xyz_pos_t Probe::offset; // Initialized by settings.load() #if HAS_PROBE_XY_OFFSET - const xyz_pos_t &Probe::offset_xy = Probe::offset; + const xy_pos_t &Probe::offset_xy = xy_pos_t(Probe::offset); #endif #if ENABLED(Z_PROBE_SLED) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 63229242b5..cac106fed6 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -112,9 +112,9 @@ public: FORCE_INLINE static bool good_bounds(const xy_pos_t &lf, const xy_pos_t &rb) { return ( #if IS_KINEMATIC - can_reach(lf.x, 0) && can_reach(rb.x, 0) && can_reach(0, lf.y) && can_reach(0, rb.y) + can_reach(lf.x, 0) && can_reach(rb.x, 0) && can_reach(0, lf.y) && can_reach(0, rb.y) #else - can_reach(lf) && can_reach(rb) + can_reach(lf) && can_reach(rb) #endif ); } @@ -122,7 +122,7 @@ public: // Use offset_xy for read only access // More optimal the XY offset is known to always be zero. #if HAS_PROBE_XY_OFFSET - static const xyz_pos_t &offset_xy; + static const xy_pos_t &offset_xy; #else static constexpr xy_pos_t offset_xy = xy_pos_t({ 0, 0 }); // See #16767 #endif From 4e940ffcc21d63bfa5ffa16c900b2d16ff3a6210 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 24 Nov 2020 17:53:26 -0600 Subject: [PATCH 0639/1370] Cosmetic G29 ABL tweak --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index f387dd9bd8..9999d92e22 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -656,8 +656,9 @@ G29_TYPE GcodeSuite::G29() { #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - z_values[meshCount.x][meshCount.y] = measured_z + zoffset; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, z_values[meshCount.x][meshCount.y])); + const float z = measured_z + zoffset; + z_values[meshCount.x][meshCount.y] = z; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, z)); #endif From 27b2e2d3e7a62ff74d50e62055807723c3d093e6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 24 Nov 2020 18:29:11 -0600 Subject: [PATCH 0640/1370] Update TOUCH_UI_LULZBOT_BIO wrappers --- .../screens/advanced_settings_menu.cpp | 5 +-- .../screens/bio_advanced_settings.cpp | 4 +-- .../screens/bio_confirm_home_e.cpp | 5 +-- .../screens/bio_confirm_home_xyz.cpp | 5 +-- .../screens/bio_main_menu.cpp | 4 +-- .../screens/bio_printing_dialog_box.cpp | 10 ++---- .../screens/bio_tune_menu.cpp | 4 +-- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 32 ++++--------------- .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 2 +- 9 files changed, 25 insertions(+), 46 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 1b7d043314..3ffc88c385 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) +#if ENABLED(TOUCH_UI_FTDI_EVE) && DISABLED(TOUCH_UI_LULZBOT_BIO) #include "screens.h" @@ -152,4 +152,5 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { } return true; } -#endif // TOUCH_UI_FTDI_EVE + +#endif // TOUCH_UI_FTDI_EVE && !TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp index b2611be250..196f26fe22 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) #include "screens.h" @@ -134,4 +134,4 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp index 85885fb388..3f6b4116f1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) #include "screens.h" @@ -53,4 +53,5 @@ bool BioConfirmHomeE::onTouchEnd(uint8_t tag) { } return true; } -#endif // TOUCH_UI_FTDI_EVE + +#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp index 102631f18e..f712fdfff9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) #include "screens.h" @@ -52,4 +52,5 @@ bool BioConfirmHomeXYZ::onTouchEnd(uint8_t tag) { } return true; } -#endif // TOUCH_UI_FTDI_EVE + +#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp index 5ddc2d02ae..dacbaf6866 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) #include "screens.h" @@ -85,4 +85,4 @@ bool MainMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index fc6dc5ee57..3842637703 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) #include "screens.h" @@ -78,11 +78,7 @@ void BioPrintingDialogBox::draw_interaction_buttons(draw_mode_t what) { .font(font_medium) .colors(isPrinting() ? action_btn : normal_btn) .tag(2).button(BTN_POS(1,9), BTN_SIZE(1,1), F("Menu")) - #if ENABLED(SDSUPPORT) - .enabled(isPrinting() ? isPrintingFromMedia() : 1) - #else - .enabled(isPrinting() ? 0 : 1) - #endif + .enabled(isPrinting() ? TERN0(SDSUPPORT, isPrintingFromMedia()) : 1) .tag(3) .colors(isPrinting() ? normal_btn : action_btn) .button( BTN_POS(2,9), BTN_SIZE(1,1), isPrinting() ? F("Cancel") : F("Back")); @@ -152,4 +148,4 @@ void BioPrintingDialogBox::show() { GOTO_SCREEN(BioPrintingDialogBox); } -#endif // TOUCH_UI_FTDI_EVE +#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp index 9723abba09..ceea3742b0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) #include "screens.h" @@ -76,4 +76,4 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 17e15afc5c..85006566bb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -23,7 +23,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) +#if ENABLED(TOUCH_UI_FTDI_EVE) && DISABLED(TOUCH_UI_LULZBOT_BIO) #include "screens.h" @@ -75,34 +75,14 @@ void MainMenu::onRedraw(draw_mode_t what) { 1 #endif ) - .tag(3).button( CLEAN_NOZZLE_POS, GET_TEXT_F( - #if ENABLED(TOUCH_UI_COCOA_PRESS) - MSG_PREHEAT_1 - #else - MSG_CLEAN_NOZZLE - #endif - )) + .tag(3).button( CLEAN_NOZZLE_POS, GET_TEXT_F(TERN(TOUCH_UI_COCOA_PRESS, MSG_PREHEAT_1, MSG_CLEAN_NOZZLE))) .tag(4).button( MOVE_AXIS_POS, GET_TEXT_F(MSG_MOVE_AXIS)) .tag(5).button( DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS)) .tag(6).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) - .enabled( - #if DISABLED(TOUCH_UI_LULZBOT_BIO) - 1 - #endif - ) - .tag(7).button( FILAMENTCHANGE_POS, GET_TEXT_F( - #if ENABLED(TOUCH_UI_COCOA_PRESS) - MSG_CASE_LIGHT - #else - MSG_FILAMENTCHANGE - #endif - )) + .enabled(IF_DISABLED(TOUCH_UI_LULZBOT_BIO, 1)) + .tag(7).button( FILAMENTCHANGE_POS, GET_TEXT_F(TERN(TOUCH_UI_COCOA_PRESS, MSG_CASE_LIGHT, MSG_FILAMENTCHANGE)) .tag(8).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .enabled( - #ifdef HAS_LEVELING - 1 - #endif - ) + .enabled(TERN_(HAS_LEVELING, 1)) .tag(9).button( LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) .tag(10).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) @@ -140,4 +120,4 @@ bool MainMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // TOUCH_UI_FTDI_EVE && !TOUCH_UI_LULZBOT_BIO diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index 894b238ae0..10cbb8af53 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) +#if ENABLED(TOUCH_UI_FTDI_EVE) && DISABLED(TOUCH_UI_LULZBOT_BIO) #include "screens.h" From 38a62f0d5b0a1c27128e7338a4f850d441fba106 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 25 Nov 2020 01:08:35 -0300 Subject: [PATCH 0641/1370] add missing header to use HAS_SD_HOST_DRIVE (#20270) --- Marlin/src/HAL/STM32F1/msc_sd.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index 44242358ee..ba722b8aeb 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -13,6 +13,8 @@ * along with this program. If not, see . * */ +#include "../../inc/MarlinConfigPre.h" + #if defined(__STM32F1__) && HAS_SD_HOST_DRIVE #include "msc_sd.h" From c86ede8cfb8012fdb35cb995e4ccd7d35e71ea8c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 25 Nov 2020 02:39:49 -0300 Subject: [PATCH 0642/1370] Fix COLOR_UI without TOUCH_SCREEN_CALIBRATION (#20269) --- Marlin/src/lcd/tft_io/tft_io.h | 8 ++++++++ Marlin/src/lcd/tft_io/touch_calibration.h | 9 +-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h index 63d6936ac0..50b0ce4463 100644 --- a/Marlin/src/lcd/tft_io/tft_io.h +++ b/Marlin/src/lcd/tft_io/tft_io.h @@ -71,6 +71,14 @@ // #define TFT_COLOR TFT_COLOR_RGB // #endif +#define TOUCH_ORIENTATION_NONE 0 +#define TOUCH_LANDSCAPE 1 +#define TOUCH_PORTRAIT 2 + +#ifndef TOUCH_ORIENTATION + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE +#endif + #define SSD1963 0x5761 #define ST7735 0x89F0 #define ST7789 0x8552 diff --git a/Marlin/src/lcd/tft_io/touch_calibration.h b/Marlin/src/lcd/tft_io/touch_calibration.h index 5bebafffd2..93ed9aa609 100644 --- a/Marlin/src/lcd/tft_io/touch_calibration.h +++ b/Marlin/src/lcd/tft_io/touch_calibration.h @@ -19,6 +19,7 @@ #pragma once #include "../../inc/MarlinConfigPre.h" +#include "tft_io.h" #ifndef TOUCH_SCREEN_CALIBRATION_PRECISION #define TOUCH_SCREEN_CALIBRATION_PRECISION 80 @@ -28,14 +29,6 @@ #define TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS 2500 #endif -#define TOUCH_ORIENTATION_NONE 0 -#define TOUCH_LANDSCAPE 1 -#define TOUCH_PORTRAIT 2 - -#ifndef TOUCH_ORIENTATION - #define TOUCH_ORIENTATION TOUCH_LANDSCAPE -#endif - typedef struct __attribute__((__packed__)) { int32_t x, y; int16_t offset_x, offset_y; From 0c24347cdb95ba571c0038fd76decf039ac43d67 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Thu, 26 Nov 2020 04:38:00 +0100 Subject: [PATCH 0643/1370] Probe Offset Wizard improvements (#20239) --- Marlin/Configuration_adv.h | 10 +- Marlin/src/gcode/calibrate/G28.cpp | 4 +- Marlin/src/inc/SanityCheck.h | 33 ++++--- Marlin/src/lcd/language/language_en.h | 2 + Marlin/src/lcd/marlinui.h | 2 +- Marlin/src/lcd/menu/menu.h | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 114 ++++++++++++++-------- 8 files changed, 109 insertions(+), 60 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index baa0433f19..7c8f2da948 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1084,8 +1084,14 @@ #if HAS_BED_PROBE //#define PROBE_OFFSET_WIZARD #if ENABLED(PROBE_OFFSET_WIZARD) - #define PROBE_OFFSET_START -4.0 // Estimated nozzle-to-probe Z offset, plus a little extra - //#define PROBE_OFFSET_WIZARD_XY_POS XY_CENTER // Set a convenient position to do the measurement + // + // Enable to init the Probe Z-Offset when starting the Wizard. + // Use the estimated nozzle-to-probe Z offset, plus a little more. + // + //#define PROBE_OFFSET_WIZARD_START_Z -4.0 + + // Set a convenient position to do the calibration (probing point and nozzle/bed-distance) + //#define PROBE_OFFSET_WIZARD_XY_POS { X_CENTER, Y_CENTER } #endif #endif diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index c0bc179869..c4effe7d58 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -324,7 +324,7 @@ void GcodeSuite::G28() { ? 0 : (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT); - if (z_homing_height && (doX || doY || (ENABLED(Z_SAFE_HOMING) && doZ))) { + if (z_homing_height && (doX || doY || TERN0(Z_SAFE_HOMING, doZ))) { // Raise Z before homing any other axes and z is not already high enough (never lower z) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); do_z_clearance(z_homing_height, true, DISABLED(UNKNOWN_Z_NO_RAISE)); @@ -337,7 +337,7 @@ void GcodeSuite::G28() { #endif // Home Y (before X) - if (ENABLED(HOME_Y_BEFORE_X) && (doY || (ENABLED(CODEPENDENT_XY_HOMING) && doX))) + if (ENABLED(HOME_Y_BEFORE_X) && (doY || TERN0(CODEPENDENT_XY_HOMING, doX))) homeaxis(Y_AXIS); // Home X diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 0dfa305841..9f4c10dd53 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -525,6 +525,8 @@ #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT." #elif defined(GRAPHICAL_TFT_ROTATE_180) #error "GRAPHICAL_TFT_ROTATE_180 is now TFT_ROTATION set to TFT_ROTATE_180." +#elif defined(PROBE_OFFSET_START) + #error "PROBE_OFFSET_START is now PROBE_OFFSET_WIZARD_START_Z." #elif defined(POWER_LOSS_PULL) #error "POWER_LOSS_PULL is now specifically POWER_LOSS_PULL(UP|DOWN)." #elif defined(FIL_RUNOUT_INVERTING) @@ -1345,25 +1347,32 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "Z_MIN_PROBE_PIN must be defined if Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN is not enabled." #endif + /** + * Check for improper NOZZLE_TO_PROBE_OFFSET + */ + constexpr xyz_pos_t sanity_nozzle_to_probe_offset = NOZZLE_TO_PROBE_OFFSET; #if ENABLED(NOZZLE_AS_PROBE) - constexpr float sanity_nozzle_to_probe_offset[] = NOZZLE_TO_PROBE_OFFSET; - static_assert(sanity_nozzle_to_probe_offset[0] == 0.0 && sanity_nozzle_to_probe_offset[1] == 0.0, - "NOZZLE_AS_PROBE requires the X,Y offsets in NOZZLE_TO_PROBE_OFFSET to be 0,0."); - #endif - - #if DISABLED(NOZZLE_AS_PROBE) - static_assert(PROBING_MARGIN >= 0, "PROBING_MARGIN must be >= 0."); - static_assert(PROBING_MARGIN_BACK >= 0, "PROBING_MARGIN_BACK must be >= 0."); + static_assert(sanity_nozzle_to_probe_offset.x == 0 && sanity_nozzle_to_probe_offset.y == 0, + "NOZZLE_AS_PROBE requires the XY offsets in NOZZLE_TO_PROBE_OFFSET to both be 0."); + #else + static_assert(sanity_nozzle_to_probe_offset.z <= 0.25, + "Are you sure your Probe triggers above the nozzle? Set a negative Z value in the NOZZLE_TO_PROBE_OFFSET."); + #ifdef PROBE_OFFSET_WIZARD_START_Z + static_assert(PROBE_OFFSET_WIZARD_START_Z <= 0.25, + "Are you sure your Probe triggers above the nozzle? Set a negative value for PROBE_OFFSET_WIZARD_START_Z."); + #endif + static_assert(PROBING_MARGIN >= 0, "PROBING_MARGIN must be >= 0."); + static_assert(PROBING_MARGIN_BACK >= 0, "PROBING_MARGIN_BACK must be >= 0."); static_assert(PROBING_MARGIN_FRONT >= 0, "PROBING_MARGIN_FRONT must be >= 0."); - static_assert(PROBING_MARGIN_LEFT >= 0, "PROBING_MARGIN_LEFT must be >= 0."); + static_assert(PROBING_MARGIN_LEFT >= 0, "PROBING_MARGIN_LEFT must be >= 0."); static_assert(PROBING_MARGIN_RIGHT >= 0, "PROBING_MARGIN_RIGHT must be >= 0."); #endif #define _MARGIN(A) TERN(IS_SCARA, SCARA_PRINTABLE_RADIUS, TERN(DELTA, DELTA_PRINTABLE_RADIUS, ((A##_BED_SIZE) / 2))) - static_assert(PROBING_MARGIN < _MARGIN(X), "PROBING_MARGIN is too large."); - static_assert(PROBING_MARGIN_BACK < _MARGIN(Y), "PROBING_MARGIN_BACK is too large."); + static_assert(PROBING_MARGIN < _MARGIN(X), "PROBING_MARGIN is too large."); + static_assert(PROBING_MARGIN_BACK < _MARGIN(Y), "PROBING_MARGIN_BACK is too large."); static_assert(PROBING_MARGIN_FRONT < _MARGIN(Y), "PROBING_MARGIN_FRONT is too large."); - static_assert(PROBING_MARGIN_LEFT < _MARGIN(X), "PROBING_MARGIN_LEFT is too large."); + static_assert(PROBING_MARGIN_LEFT < _MARGIN(X), "PROBING_MARGIN_LEFT is too large."); static_assert(PROBING_MARGIN_RIGHT < _MARGIN(X), "PROBING_MARGIN_RIGHT is too large."); #undef _MARGIN diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 04487fa13f..af0903b916 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -673,6 +673,8 @@ namespace Language_en { PROGMEM Language_Str MSG_REHEATING = _UxGT("Reheating..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Probe Wizard"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Probing Z Reference"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Moving to Probing Pos"); PROGMEM Language_Str MSG_SOUND = _UxGT("Sound"); diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index ccf995bd71..8e968abda0 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -624,7 +624,7 @@ public: // // Special handling if a move is underway // - #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) || (ENABLED(LCD_BED_LEVELING) && EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) || (ENABLED(PROBE_OFFSET_WIZARD) && defined(PROBE_OFFSET_WIZARD_XY_POS)) + #if ANY(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION, PROBE_OFFSET_WIZARD) || (ENABLED(LCD_BED_LEVELING) && EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) #define LCD_HAS_WAIT_FOR_MOVE 1 static bool wait_for_move; #else diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 5782d2070a..cf2f6b1633 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -220,7 +220,7 @@ void _lcd_draw_homing(); #endif #if ENABLED(PROBE_OFFSET_WIZARD) - void home_and_goto_probe_offset_wizard(); + void goto_probe_offset_wizard(); #endif #if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 268573beb0..3f2a6da11b 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -488,7 +488,7 @@ void menu_backlash(); EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); #if ENABLED(PROBE_OFFSET_WIZARD) - SUBMENU(MSG_PROBE_WIZARD, home_and_goto_probe_offset_wizard); + SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 9f21550098..f2b08afd79 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -28,12 +28,6 @@ #if ENABLED(PROBE_OFFSET_WIZARD) -#ifndef PROBE_OFFSET_START - #error "PROBE_OFFSET_WIZARD requires a PROBE_OFFSET_START with a negative value." -#else - static_assert(PROBE_OFFSET_START < 0, "PROBE_OFFSET_START must be < 0. Please update your configuration."); -#endif - #include "menu_item.h" #include "menu_addon.h" #include "../../gcode/queue.h" @@ -46,21 +40,20 @@ #endif // Global storage -float z_offset_backup, calculated_z_offset; +float z_offset_backup, calculated_z_offset, z_offset_ref; TERN_(HAS_LEVELING, bool leveling_was_active); -void prepare_for_calibration() { - z_offset_backup = probe.offset.z; - - // Disable soft endstops for free Z movement - SET_SOFT_ENDSTOP_LOOSE(true); - - // Disable leveling for raw planner motion - #if HAS_LEVELING - leveling_was_active = planner.leveling_active; - set_bed_leveling_enabled(false); - #endif +inline void z_clearance_move() { + do_z_clearance( + #ifdef Z_AFTER_HOMING + Z_AFTER_HOMING + #elif defined(Z_HOMING_HEIGHT) + Z_HOMING_HEIGHT + #else + 10 + #endif + ); } void set_offset_and_go_back(const float &z) { @@ -77,7 +70,7 @@ void _goto_manual_move_z(const float scale) { void probe_offset_wizard_menu() { START_MENU(); - calculated_z_offset = probe.offset.z + current_position.z; + calculated_z_offset = probe.offset.z + current_position.z - z_offset_ref; if (LCD_HEIGHT >= 4) STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT); @@ -92,7 +85,7 @@ void probe_offset_wizard_menu() { char tmp[20], numstr[10]; // Determine digits needed right of decimal const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); #if DISABLED(HAS_GRAPHICAL_TFT) extern const char NUL_STR[]; @@ -107,47 +100,86 @@ void probe_offset_wizard_menu() { ACTION_ITEM(MSG_BUTTON_DONE, []{ set_offset_and_go_back(calculated_z_offset); - do_z_clearance(20.0 - #ifdef Z_AFTER_HOMING - - 20.0 + Z_AFTER_HOMING - #endif - ); + current_position.z = z_offset_ref; // Set Z to z_offset_ref, as we can expect it is at probe height + sync_plan_position(); + z_clearance_move(); // Raise Z as if it was homed }); ACTION_ITEM(MSG_BUTTON_CANCEL, []{ set_offset_and_go_back(z_offset_backup); + // If wizard-homing was done by probe with with PROBE_OFFSET_WIZARD_START_Z + #if EITHER(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, USE_PROBE_FOR_Z_HOMING) && defined(PROBE_OFFSET_WIZARD_START_Z) + set_axis_never_homed(Z_AXIS); // On cancel the Z position needs correction + queue.inject_P(PSTR("G28Z")); + #else // Otherwise do a Z clearance move like after Homing + z_clearance_move(); + #endif }); END_MENU(); } -#ifdef PROBE_OFFSET_WIZARD_XY_POS +void prepare_for_probe_offset_wizard() { + if (ui.wait_for_move) return; - #define HAS_PROBE_OFFSET_WIZARD_XY_POS 1 + #if defined(PROBE_OFFSET_WIZARD_XY_POS) || NONE(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, USE_PROBE_FOR_Z_HOMING) + if (ui.should_draw()) MenuItem_static::draw(1, GET_TEXT(MSG_PROBE_WIZARD_PROBING)); - inline void goto_probe_offset_wizard() { - if (ui.wait_for_move) return; + #ifndef PROBE_OFFSET_WIZARD_XY_POS + #define PROBE_OFFSET_WIZARD_XY_POS XY_CENTER + #endif + // Get X and Y from configuration, or use center constexpr xy_pos_t wizard_pos = PROBE_OFFSET_WIZARD_XY_POS; - current_position = wizard_pos; + + // Probe for Z reference ui.wait_for_move = true; - line_to_current_position(MMM_TO_MMS(HOMING_FEEDRATE_XY)); // Could invoke idle() + z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_STOW, 0, true); ui.wait_for_move = false; - ui.synchronize(); - prepare_for_calibration(); - probe.offset.z = PROBE_OFFSET_START; - ui.goto_screen(probe_offset_wizard_menu); - ui.defer_status_screen(); - } -#endif + #endif -void home_and_goto_probe_offset_wizard() { + // Move Nozzle to Probing/Homing Position + ui.wait_for_move = true; + current_position += probe.offset_xy; + line_to_current_position(MMM_TO_MMS(HOMING_FEEDRATE_XY)); + ui.synchronize(GET_TEXT(MSG_PROBE_WIZARD_MOVING)); + ui.wait_for_move = false; + + // Go to Calibration Menu + ui.goto_screen(probe_offset_wizard_menu); + ui.defer_status_screen(); +} + +void goto_probe_offset_wizard() { + ui.defer_status_screen(); + set_all_unhomed(); + + // Store probe.offset.z for Case: Cancel + z_offset_backup = probe.offset.z; + + #ifdef PROBE_OFFSET_WIZARD_START_Z + probe.offset.z = PROBE_OFFSET_WIZARD_START_Z; + #endif + + // Store Bed-Leveling-State and disable + #if HAS_LEVELING + leveling_was_active = planner.leveling_active; + set_bed_leveling_enabled(false); + #endif + + // Home all axes queue.inject_P(G28_STR); + ui.goto_screen([]{ _lcd_draw_homing(); - if (all_axes_homed()) - ui.goto_screen(TERN(HAS_PROBE_OFFSET_WIZARD_XY_POS, goto_probe_offset_wizard, probe_offset_wizard_menu)); + if (all_axes_homed()) { + SET_SOFT_ENDSTOP_LOOSE(true); // Disable soft endstops for free Z movement + z_offset_ref = 0; // Set Z Value for Wizard Position to 0 + ui.goto_screen(prepare_for_probe_offset_wizard); + ui.defer_status_screen(); + } }); + } #endif // PROBE_OFFSET_WIZARD From 664e9d6dfe6cec01c5e125f78ecd3df7b0143fb0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 25 Nov 2020 21:40:56 -0600 Subject: [PATCH 0644/1370] Reduce warnings, extern "C" cleanup (#20279) --- Marlin/src/HAL/AVR/HAL.h | 16 ++++++++++------ Marlin/src/HAL/DUE/HAL.h | 12 +++++++++--- Marlin/src/HAL/ESP32/HAL.h | 12 +++++++++--- Marlin/src/HAL/ESP32/timers.h | 8 +++++--- Marlin/src/HAL/HAL.h | 4 ++++ Marlin/src/HAL/LINUX/HAL.cpp | 17 ++++++----------- Marlin/src/HAL/LINUX/HAL.h | 12 +++++++++--- Marlin/src/HAL/LINUX/include/Arduino.h | 11 ++++++----- Marlin/src/HAL/LPC1768/HAL.cpp | 17 ++++++----------- Marlin/src/HAL/LPC1768/HAL.h | 12 +++++++++--- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 19 ++++--------------- Marlin/src/HAL/LPC1768/main.cpp | 12 ++++++------ Marlin/src/HAL/SAMD51/HAL.h | 12 +++++++++--- Marlin/src/HAL/STM32/HAL.h | 10 +++++++--- Marlin/src/HAL/STM32F1/HAL.h | 10 +++++++--- Marlin/src/HAL/STM32F1/timers.h | 6 ++++-- Marlin/src/HAL/STM32_F4_F7/HAL.h | 10 +++++++--- Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp | 8 +++----- Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp | 8 +++----- Marlin/src/HAL/TEENSY31_32/HAL.h | 16 ++++++++++------ Marlin/src/HAL/TEENSY31_32/timers.h | 4 ++-- Marlin/src/HAL/TEENSY35_36/HAL.h | 16 ++++++++++------ Marlin/src/HAL/TEENSY35_36/timers.h | 4 ++-- Marlin/src/HAL/TEENSY40_41/HAL.h | 16 ++++++++++------ Marlin/src/HAL/TEENSY40_41/timers.h | 10 ++++++---- Marlin/src/libs/duration_t.h | 10 +++++++--- 26 files changed, 170 insertions(+), 122 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index ce15ed29fb..aa6a321320 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -122,12 +122,16 @@ inline uint8_t HAL_get_reset_source() { return MCUSR; } inline void HAL_reboot() {} // reboot the board or restart the bootloader -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -extern "C" { - int freeMemory(); -} -#pragma GCC diagnostic pop +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + +extern "C" int freeMemory(); + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // ADC #ifdef DIDR2 diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 88ace59575..395ca4ccc9 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -153,10 +153,16 @@ void HAL_init(); // void _delay_ms(const int delay); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + int freeMemory(); -#pragma GCC diagnostic pop + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif #ifdef __cplusplus extern "C" { diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index ebc16c9525..5ef13e0c21 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -100,10 +100,16 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader void _delay_ms(int delay); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + int freeMemory(); -#pragma GCC diagnostic pop + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif void analogWrite(pin_t pin, int value); diff --git a/Marlin/src/HAL/ESP32/timers.h b/Marlin/src/HAL/ESP32/timers.h index 7d35186b1c..98386e3980 100644 --- a/Marlin/src/HAL/ESP32/timers.h +++ b/Marlin/src/HAL/ESP32/timers.h @@ -91,9 +91,11 @@ typedef uint64_t hal_timer_t; #define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler() #endif -extern "C" void tempTC_Handler(); -extern "C" void stepTC_Handler(); -extern "C" void pwmTC_Handler(); +extern "C" { + void tempTC_Handler(); + void stepTC_Handler(); + void pwmTC_Handler(); +} // ------------------------ // Types diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index 5eca2f7eac..9eefda8fb1 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -23,6 +23,10 @@ #include "platforms.h" +#ifndef GCC_VERSION + #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#endif + #include HAL_PATH(.,HAL.h) #ifdef SERIAL_PORT_2 diff --git a/Marlin/src/HAL/LINUX/HAL.cpp b/Marlin/src/HAL/LINUX/HAL.cpp index d7d7c2d2b4..ee9e31e140 100644 --- a/Marlin/src/HAL/LINUX/HAL.cpp +++ b/Marlin/src/HAL/LINUX/HAL.cpp @@ -27,18 +27,13 @@ HalSerial usb_serial; // U8glib required functions -extern "C" void u8g_xMicroDelay(uint16_t val) { - DELAY_US(val); -} -extern "C" void u8g_MicroDelay() { - u8g_xMicroDelay(1); -} -extern "C" void u8g_10MicroDelay() { - u8g_xMicroDelay(10); -} -extern "C" void u8g_Delay(uint16_t val) { - delay(val); +extern "C" { + void u8g_xMicroDelay(uint16_t val) { DELAY_US(val); } + void u8g_MicroDelay() { u8g_xMicroDelay(1); } + void u8g_10MicroDelay() { u8g_xMicroDelay(10); } + void u8g_Delay(uint16_t val) { delay(val); } } + //************************// // return free heap space diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index 1c8dbfd4dc..729f6c856e 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -79,10 +79,16 @@ extern HalSerial usb_serial; inline void HAL_init() {} // Utility functions -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + int freeMemory(); -#pragma GCC diagnostic pop + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // ADC #define HAL_ADC_VREF 5.0 diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/LINUX/include/Arduino.h index e28b474ede..6aeb0db583 100644 --- a/Marlin/src/HAL/LINUX/include/Arduino.h +++ b/Marlin/src/HAL/LINUX/include/Arduino.h @@ -67,8 +67,11 @@ void cli(); // Disable void sei(); // Enable void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode); void detachInterrupt(uint32_t pin); -extern "C" void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode); -extern "C" void GpioDisableInt(uint32_t port, uint32_t pin); + +extern "C" { + void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode); + void GpioDisableInt(uint32_t port, uint32_t pin); +} // Program Memory #define pgm_read_ptr(addr) (*((void**)(addr))) @@ -92,9 +95,7 @@ using std::memcpy; #define strlen_P strlen // Time functions -extern "C" { - void delay(const int milis); -} +extern "C" void delay(const int milis); void _delay_ms(const int delay); void delayMicroseconds(unsigned long); uint32_t millis(); diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index 939f1e8a94..3614e95385 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -32,18 +32,13 @@ uint32_t HAL_adc_reading = 0; // U8glib required functions -extern "C" void u8g_xMicroDelay(uint16_t val) { - DELAY_US(val); -} -extern "C" void u8g_MicroDelay() { - u8g_xMicroDelay(1); -} -extern "C" void u8g_10MicroDelay() { - u8g_xMicroDelay(10); -} -extern "C" void u8g_Delay(uint16_t val) { - delay(val); +extern "C" { + void u8g_xMicroDelay(uint16_t val) { DELAY_US(val); } + void u8g_MicroDelay() { u8g_xMicroDelay(1); } + void u8g_10MicroDelay() { u8g_xMicroDelay(10); } + void u8g_Delay(uint16_t val) { delay(val); } } + //************************// // return free heap space diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index cb637e715d..51a13389b1 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -107,10 +107,16 @@ extern "C" volatile uint32_t _millis; // // Utility functions // -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + int freeMemory(); -#pragma GCC diagnostic pop + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // // ADC API diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index 5374e005d3..baad3f8f26 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -26,30 +26,19 @@ #if USING_SERIAL_0 MarlinSerial MSerial(LPC_UART0); - extern "C" void UART0_IRQHandler() { - MSerial.IRQHandler(); - } + extern "C" void UART0_IRQHandler() { MSerial.IRQHandler(); } #endif - #if USING_SERIAL_1 MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1); - extern "C" void UART1_IRQHandler() { - MSerial1.IRQHandler(); - } + extern "C" void UART1_IRQHandler() { MSerial1.IRQHandler(); } #endif - #if USING_SERIAL_2 MarlinSerial MSerial2(LPC_UART2); - extern "C" void UART2_IRQHandler() { - MSerial2.IRQHandler(); - } + extern "C" void UART2_IRQHandler() { MSerial2.IRQHandler(); } #endif - #if USING_SERIAL_3 MarlinSerial MSerial3(LPC_UART3); - extern "C" void UART3_IRQHandler() { - MSerial3.IRQHandler(); - } + extern "C" void UART3_IRQHandler() { MSerial3.IRQHandler(); } #endif #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index 085b8ce04b..96faf54d7f 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -31,18 +31,18 @@ #include #include -extern "C" { - #include -} - #include "../../inc/MarlinConfig.h" #include "../../core/millis_t.h" #include "../../sd/cardreader.h" extern uint32_t MSC_SD_Init(uint8_t pdrv); -extern "C" int isLPC1769(); -extern "C" void disk_timerproc(); + +extern "C" { + #include + extern "C" int isLPC1769(); + extern "C" void disk_timerproc(); +} void SysTick_Callback() { disk_timerproc(); } diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index 7cb3635bd7..ff93101146 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -135,10 +135,16 @@ void HAL_idletask(); // FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + int freeMemory(); -#pragma GCC diagnostic pop + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif #ifdef __cplusplus extern "C" { diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index c92c8890ea..16dc7a4539 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -140,15 +140,19 @@ void _delay_ms(const int delay); extern "C" char* _sbrk(int incr); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif static inline int freeMemory() { volatile char top; return &top - reinterpret_cast(_sbrk(0)); } -#pragma GCC diagnostic pop +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // // ADC diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 2880865dbb..06f75662cf 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -189,8 +189,10 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader void _delay_ms(const int delay); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif /* extern "C" { @@ -213,7 +215,9 @@ static int freeMemory() { return &top - reinterpret_cast(_sbrk(0)); } -#pragma GCC diagnostic pop +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // // ADC diff --git a/Marlin/src/HAL/STM32F1/timers.h b/Marlin/src/HAL/STM32F1/timers.h index 6f360f6bfc..3e2e7775f1 100644 --- a/Marlin/src/HAL/STM32F1/timers.h +++ b/Marlin/src/HAL/STM32F1/timers.h @@ -129,8 +129,10 @@ timer_dev* get_timer_dev(int number); #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() #endif -extern "C" void tempTC_Handler(); -extern "C" void stepTC_Handler(); +extern "C" { + void tempTC_Handler(); + void stepTC_Handler(); +} // ------------------------ // Public Variables diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.h b/Marlin/src/HAL/STM32_F4_F7/HAL.h index 00a65de792..85fbf098ff 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.h +++ b/Marlin/src/HAL/STM32_F4_F7/HAL.h @@ -162,15 +162,19 @@ int freeMemory() { } */ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif static inline int freeMemory() { volatile char top; return &top - reinterpret_cast(_sbrk(0)); } -#pragma GCC diagnostic pop +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // // ADC diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp index dc41f89131..8b753f7290 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp @@ -79,11 +79,9 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { HAL_TIM_Base_Start_IT(&TimerHandle[timer_num].handle); } -extern "C" void TIM5_IRQHandler() { - ((void(*)())TimerHandle[0].callback)(); -} -extern "C" void TIM7_IRQHandler() { - ((void(*)())TimerHandle[1].callback)(); +extern "C" { + void TIM5_IRQHandler() { ((void(*)())TimerHandle[0].callback)(); } + void TIM7_IRQHandler() { ((void(*)())TimerHandle[1].callback)(); } } void HAL_timer_enable_interrupt(const uint8_t timer_num) { diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp index f7ded7454d..bc8f76af09 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp @@ -83,11 +83,9 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { } //forward the interrupt -extern "C" void TIM5_IRQHandler() { - ((void(*)())timerConfig[0].callback)(); -} -extern "C" void TIM7_IRQHandler() { - ((void(*)())timerConfig[1].callback)(); +extern "C" { + void TIM5_IRQHandler() { ((void(*)())timerConfig[0].callback)(); } + void TIM7_IRQHandler() { ((void(*)())timerConfig[1].callback)(); } } void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 8ab358e9e1..9156aadb4d 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -97,12 +97,16 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -extern "C" { - int freeMemory(); -} -#pragma GCC diagnostic pop +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + +extern "C" int freeMemory(); + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // ADC diff --git a/Marlin/src/HAL/TEENSY31_32/timers.h b/Marlin/src/HAL/TEENSY31_32/timers.h index 135b328830..61b8673596 100644 --- a/Marlin/src/HAL/TEENSY31_32/timers.h +++ b/Marlin/src/HAL/TEENSY31_32/timers.h @@ -74,10 +74,10 @@ typedef uint32_t hal_timer_t; #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) #ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void ftm0_isr() //void TC3_Handler() + #define HAL_STEP_TIMER_ISR() extern "C" void ftm0_isr() //void TC3_Handler() #endif #ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void ftm1_isr() //void TC4_Handler() + #define HAL_TEMP_TIMER_ISR() extern "C" void ftm1_isr() //void TC4_Handler() #endif void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 2b735d6224..04151e8378 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -103,12 +103,16 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -extern "C" { - int freeMemory(); -} -#pragma GCC diagnostic pop +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + +extern "C" int freeMemory(); + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // ADC diff --git a/Marlin/src/HAL/TEENSY35_36/timers.h b/Marlin/src/HAL/TEENSY35_36/timers.h index 5c623cd801..99269ac657 100644 --- a/Marlin/src/HAL/TEENSY35_36/timers.h +++ b/Marlin/src/HAL/TEENSY35_36/timers.h @@ -73,10 +73,10 @@ typedef uint32_t hal_timer_t; #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) #ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void ftm0_isr() //void TC3_Handler() + #define HAL_STEP_TIMER_ISR() extern "C" void ftm0_isr() //void TC3_Handler() #endif #ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void ftm1_isr() //void TC4_Handler() + #define HAL_TEMP_TIMER_ISR() extern "C" void ftm1_isr() //void TC4_Handler() #endif void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 1e0043342d..28f511631e 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -120,12 +120,16 @@ uint8_t HAL_get_reset_source(); FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -extern "C" { - uint32_t freeMemory(); -} -#pragma GCC diagnostic pop +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + +extern "C" uint32_t freeMemory(); + +#if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop +#endif // ADC diff --git a/Marlin/src/HAL/TEENSY40_41/timers.h b/Marlin/src/HAL/TEENSY40_41/timers.h index 7e4cd080cb..556333d7f4 100644 --- a/Marlin/src/HAL/TEENSY40_41/timers.h +++ b/Marlin/src/HAL/TEENSY40_41/timers.h @@ -72,14 +72,16 @@ typedef uint32_t hal_timer_t; #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) #ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() // GPT1_Handler() + #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() // GPT1_Handler() #endif #ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() // GPT2_Handler() + #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() // GPT2_Handler() #endif -extern "C" void stepTC_Handler(); -extern "C" void tempTC_Handler(); +extern "C" { + void stepTC_Handler(); + void tempTC_Handler(); +} void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); diff --git a/Marlin/src/libs/duration_t.h b/Marlin/src/libs/duration_t.h index 9c1d72dfaf..bd654b7bad 100644 --- a/Marlin/src/libs/duration_t.h +++ b/Marlin/src/libs/duration_t.h @@ -106,8 +106,10 @@ struct duration_t { return this->value; } - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wformat-overflow" + #if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wformat-overflow" + #endif /** * @brief Formats the duration as a string @@ -167,5 +169,7 @@ struct duration_t { } } - #pragma GCC diagnostic pop + #if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop + #endif }; From e2c57f6d47b3a871ea09cf82a50bf8d6c333183e Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 25 Nov 2020 22:37:18 -0800 Subject: [PATCH 0645/1370] Retire HAL for STM32F4 / F7 (#20153) --- .github/workflows/test-builds.yml | 21 +- Marlin/src/HAL/STM32/pinsDebug.h | 258 ++++- Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h | 125 --- Marlin/src/HAL/STM32/pinsDebug_STM32duino.h | 273 ------ Marlin/src/HAL/STM32F1/pinsDebug.h | 104 +- Marlin/src/HAL/STM32_F4_F7/HAL.cpp | 95 -- Marlin/src/HAL/STM32_F4_F7/HAL.h | 203 ---- Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp | 164 ---- Marlin/src/HAL/STM32_F4_F7/README.md | 6 - Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md | 12 - Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp | 113 --- Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h | 134 --- Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md | 27 - .../src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp | 898 ------------------ Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h | 593 ------------ Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp | 127 --- Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h | 107 --- Marlin/src/HAL/STM32_F4_F7/Servo.cpp | 51 - Marlin/src/HAL/STM32_F4_F7/Servo.h | 41 - Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp | 535 ----------- Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h | 114 --- Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp | 111 --- Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp | 77 -- .../src/HAL/STM32_F4_F7/endstop_interrupts.h | 49 - Marlin/src/HAL/STM32_F4_F7/fastio.h | 310 ------ .../HAL/STM32_F4_F7/inc/Conditionals_LCD.h | 26 - .../HAL/STM32_F4_F7/inc/Conditionals_adv.h | 22 - .../HAL/STM32_F4_F7/inc/Conditionals_post.h | 29 - Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h | 41 - Marlin/src/HAL/STM32_F4_F7/pinsDebug.h | 27 - Marlin/src/HAL/STM32_F4_F7/spi_pins.h | 35 - Marlin/src/HAL/STM32_F4_F7/timers.h | 28 - Marlin/src/HAL/STM32_F4_F7/watchdog.cpp | 57 -- Marlin/src/HAL/STM32_F4_F7/watchdog.h | 27 - Marlin/src/HAL/platforms.h | 2 - .../src/HAL/shared/backtrace/unwmemaccess.cpp | 11 - Marlin/src/HAL/shared/servo.h | 2 - Marlin/src/core/boards.h | 50 +- Marlin/src/core/macros.h | 6 +- Marlin/src/module/stepper/TMC26X.h | 6 +- Marlin/src/pins/pins.h | 18 +- .../pins/{stm32f4 => stm32f1}/pins_BEAST.h | 4 +- .../src/pins/stm32f4/pins_GENERIC_STM32F4.h | 197 ---- Marlin/src/pins/stm32f7/pins_THE_BORG.h | 183 ---- buildroot/tests/BIGTREE_SKR_PRO-tests | 2 +- .../tests/{STM32F7-tests => REMRAM_V1-tests} | 2 +- buildroot/tests/STM32F103RC_btt-tests | 1 + buildroot/tests/STM32F4-tests | 16 - platformio.ini | 17 +- 49 files changed, 399 insertions(+), 4958 deletions(-) delete mode 100644 Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h delete mode 100644 Marlin/src/HAL/STM32/pinsDebug_STM32duino.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/HAL.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/HAL.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/README.md delete mode 100644 Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md delete mode 100644 Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md delete mode 100644 Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/Servo.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/Servo.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/fastio.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/pinsDebug.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/spi_pins.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/timers.h delete mode 100644 Marlin/src/HAL/STM32_F4_F7/watchdog.cpp delete mode 100644 Marlin/src/HAL/STM32_F4_F7/watchdog.h rename Marlin/src/pins/{stm32f4 => stm32f1}/pins_BEAST.h (98%) delete mode 100644 Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h delete mode 100644 Marlin/src/pins/stm32f7/pins_THE_BORG.h rename buildroot/tests/{STM32F7-tests => REMRAM_V1-tests} (89%) delete mode 100644 buildroot/tests/STM32F4-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index d87d10569d..53ffbe0c08 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -54,7 +54,7 @@ jobs: - sanguino1284p - sanguino644p - # Extended STM32 Environments + # STM32F1 (Maple) Environments - STM32F103RC_btt - STM32F103RC_btt_USB @@ -64,38 +64,37 @@ jobs: - STM32F103RC_meeb - jgaurora_a5s_a1 - STM32F103VE_longer + - mks_robin + - mks_robin_lite + - mks_robin_pro + - STM32F103RET6_creality + - mks_robin_nano35 + + # STM32 (ST) Environments + - STM32F407VE_black - STM32F401VE_STEVAL - BIGTREE_BTT002 - BIGTREE_SKR_PRO - BIGTREE_GTR_V1_0 - - mks_robin - mks_robin_stm32 - ARMED - FYSETC_S6 - STM32F070CB_malyan - STM32F070RB_malyan - malyan_M300 - - mks_robin_lite - FLYF407ZG - rumba32 - - mks_robin_pro - - STM32F103RET6_creality - LERDGEX - - mks_robin_nano35 - mks_robin_nano35_stm32 - NUCLEO_F767ZI + - REMRAM_V1 # Put lengthy tests last - LPC1768 - LPC1769 - # STM32 with non-STM framework. both broken for now. they should use HAL_STM32 which is working. - - #- STM32F4 - #- STM32F7 - # Non-working environment tests #- at90usb1286_cdc #- STM32F103CB_malyan diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h index ec08e3fd75..77c93ee41e 100644 --- a/Marlin/src/HAL/STM32/pinsDebug.h +++ b/Marlin/src/HAL/STM32/pinsDebug.h @@ -18,17 +18,257 @@ */ #pragma once -#if !(defined(NUM_DIGITAL_PINS) || defined(BOARD_NR_GPIO_PINS)) - #error "M43 not supported for this board" +#include + +#ifndef NUM_DIGITAL_PINS + // Only in ST's Arduino core (STM32duino, STM32Core) + #error "Expected NUM_DIGITAL_PINS not found" #endif -// Strange - STM32F4 comes to HAL_STM32 rather than HAL_STM32F4 for these files -#ifdef STM32F4 - #ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) - #include "pinsDebug_STM32duino.h" - #elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) - #include "pinsDebug_STM32GENERIC.h" +/** + * Life gets complicated if you want an easy to use 'M43 I' output (in port/pin order) + * because the variants in this platform do not always define all the I/O port/pins + * that a CPU has. + * + * VARIABLES: + * Ard_num - Arduino pin number - defined by the platform. It is used by digitalRead and + * digitalWrite commands and by M42. + * - does not contain port/pin info + * - is not in port/pin order + * - typically a variant will only assign Ard_num to port/pins that are actually used + * Index - M43 counter - only used to get Ard_num + * x - a parameter/argument used to search the pin_array to try to find a signal name + * associated with a Ard_num + * Port_pin - port number and pin number for use with CPU registers and printing reports + * + * Since M43 uses digitalRead and digitalWrite commands, only the Port_pins with an Ard_num + * are accessed and/or displayed. + * + * Three arrays are used. + * + * digitalPin[] is provided by the platform. It consists of the Port_pin numbers in + * Arduino pin number order. + * + * pin_array is a structure generated by the pins/pinsDebug.h header file. It is generated by + * the preprocessor. Only the signals associated with enabled options are in this table. + * It contains: + * - name of the signal + * - the Ard_num assigned by the pins_YOUR_BOARD.h file using the platform defines. + * EXAMPLE: "#define KILL_PIN PB1" results in Ard_num of 57. 57 is then used as the + * argument to digitalPinToPinName(IO) to get the Port_pin number + * - if it is a digital or analog signal. PWMs are considered digital here. + * + * pin_xref is a structure generated by this header file. It is generated by the + * preprocessor. It is in port/pin order. It contains just the port/pin numbers defined by the + * platform for this variant. + * - Ard_num + * - printable version of Port_pin + * + * Routines with an "x" as a parameter/argument are used to search the pin_array to try to + * find a signal name associated with a port/pin. + * + * NOTE - the Arduino pin number is what is used by the M42 command, NOT the port/pin for that + * signal. The Arduino pin number is listed by the M43 I command. + */ + +//////////////////////////////////////////////////////// +// +// make a list of the Arduino pin numbers in the Port/Pin order +// + +#define _PIN_ADD_2(NAME_ALPHA, ARDUINO_NUM) { {NAME_ALPHA}, ARDUINO_NUM }, +#define _PIN_ADD(NAME_ALPHA, ARDUINO_NUM) { NAME_ALPHA, ARDUINO_NUM }, +#define PIN_ADD(NAME) _PIN_ADD(#NAME, NAME) + +typedef struct { + char Port_pin_alpha[5]; + pin_t Ard_num; +} XrefInfo; + +const XrefInfo pin_xref[] PROGMEM = { + #include "pins_Xref.h" +}; + +//////////////////////////////////////////////////////////// + +#define MODE_PIN_INPUT 0 // Input mode (reset state) +#define MODE_PIN_OUTPUT 1 // General purpose output mode +#define MODE_PIN_ALT 2 // Alternate function mode +#define MODE_PIN_ANALOG 3 // Analog mode + +#define PIN_NUM(P) (P & 0x000F) +#define PIN_NUM_ALPHA_LEFT(P) (((P & 0x000F) < 10) ? ('0' + (P & 0x000F)) : '1') +#define PIN_NUM_ALPHA_RIGHT(P) (((P & 0x000F) > 9) ? ('0' + (P & 0x000F) - 10) : 0 ) +#define PORT_NUM(P) ((P >> 4) & 0x0007) +#define PORT_ALPHA(P) ('A' + (P >> 4)) + +/** + * Translation of routines & variables used by pinsDebug.h + */ +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define VALID_PIN(ANUM) ((ANUM) >= 0 && (ANUM) < NUMBER_PINS_TOTAL) +#define digitalRead_mod(Ard_num) extDigitalRead(Ard_num) // must use Arduino pin numbers when doing reads +#define PRINT_PIN(Q) +#define PRINT_PORT(ANUM) port_print(ANUM) +#define DIGITAL_PIN_TO_ANALOG_PIN(ANUM) -1 // will report analog pin number in the print port routine +#define GET_PIN_MAP_PIN_M43(Index) pin_xref[Index].Ard_num + +// x is a variable used to search pin_array +#define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital) +#define GET_ARRAY_PIN(x) ((pin_t) pin_array[x].pin) +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin + +#ifndef M43_NEVER_TOUCH + #define _M43_NEVER_TOUCH(Index) (Index >= 9 && Index <= 12) // SERIAL/USB pins: PA9(TX) PA10(RX) PA11(USB_DM) PA12(USB_DP) + #ifdef KILL_PIN + #define M43_NEVER_TOUCH(Index) m43_never_touch(Index) + + bool m43_never_touch(const pin_t Index) { + static pin_t M43_kill_index = -1; + if (M43_kill_index < 0) + for (M43_kill_index = 0; M43_kill_index < NUMBER_PINS_TOTAL; M43_kill_index++) + if (KILL_PIN == GET_PIN_MAP_PIN_M43(M43_kill_index)) break; + return _M43_NEVER_TOUCH(Index) || Index == M43_kill_index; // KILL_PIN and SERIAL/USB + } #else - #error "M43 not supported for this board" + #define M43_NEVER_TOUCH(Index) _M43_NEVER_TOUCH(Index) #endif #endif + +uint8_t get_pin_mode(const pin_t Ard_num) { + uint32_t mode_all = 0; + const PinName dp = digitalPinToPinName(Ard_num); + switch (PORT_ALPHA(dp)) { + case 'A' : mode_all = GPIOA->MODER; break; + case 'B' : mode_all = GPIOB->MODER; break; + case 'C' : mode_all = GPIOC->MODER; break; + case 'D' : mode_all = GPIOD->MODER; break; + #ifdef PE_0 + case 'E' : mode_all = GPIOE->MODER; break; + #elif defined(PF_0) + case 'F' : mode_all = GPIOF->MODER; break; + #elif defined(PG_0) + case 'G' : mode_all = GPIOG->MODER; break; + #elif defined(PH_0) + case 'H' : mode_all = GPIOH->MODER; break; + #elif defined(PI_0) + case 'I' : mode_all = GPIOI->MODER; break; + #elif defined(PJ_0) + case 'J' : mode_all = GPIOJ->MODER; break; + #elif defined(PK_0) + case 'K' : mode_all = GPIOK->MODER; break; + #elif defined(PL_0) + case 'L' : mode_all = GPIOL->MODER; break; + #endif + } + return (mode_all >> (2 * uint8_t(PIN_NUM(dp)))) & 0x03; +} + +bool GET_PINMODE(const pin_t Ard_num) { + const uint8_t pin_mode = get_pin_mode(Ard_num); + return pin_mode == MODE_PIN_OUTPUT || pin_mode == MODE_PIN_ALT; // assume all alt definitions are PWM +} + +int8_t digital_pin_to_analog_pin(pin_t Ard_num) { + Ard_num -= NUM_ANALOG_FIRST; + return (Ard_num >= 0 && Ard_num < NUM_ANALOG_INPUTS) ? Ard_num : -1; +} + +bool IS_ANALOG(const pin_t Ard_num) { + return get_pin_mode(Ard_num) == MODE_PIN_ANALOG; +} + +bool is_digital(const pin_t x) { + const uint8_t pin_mode = get_pin_mode(pin_array[x].pin); + return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT; +} + +void port_print(const pin_t Ard_num) { + char buffer[16]; + pin_t Index; + for (Index = 0; Index < NUMBER_PINS_TOTAL; Index++) + if (Ard_num == GET_PIN_MAP_PIN_M43(Index)) break; + + const char * ppa = pin_xref[Index].Port_pin_alpha; + sprintf_P(buffer, PSTR("%s"), ppa); + SERIAL_ECHO(buffer); + if (ppa[3] == '\0') SERIAL_CHAR(' '); + + // print analog pin number + const int8_t Port_pin = digital_pin_to_analog_pin(Ard_num); + if (Port_pin >= 0) { + sprintf_P(buffer, PSTR(" (A%d) "), Port_pin); + SERIAL_ECHO(buffer); + if (Port_pin < 10) SERIAL_CHAR(' '); + } + else + SERIAL_ECHO_SP(7); + + // Print number to be used with M42 + sprintf_P(buffer, PSTR(" M42 P%d "), Ard_num); + SERIAL_ECHO(buffer); + if (Ard_num < 10) SERIAL_CHAR(' '); + if (Ard_num < 100) SERIAL_CHAR(' '); +} + +bool pwm_status(const pin_t Ard_num) { + return get_pin_mode(Ard_num) == MODE_PIN_ALT; +} + +void pwm_details(const pin_t Ard_num) { + if (pwm_status(Ard_num)) { + uint32_t alt_all = 0; + const PinName dp = digitalPinToPinName(Ard_num); + pin_t pin_number = uint8_t(PIN_NUM(dp)); + const bool over_7 = pin_number >= 8; + const uint8_t ind = over_7 ? 1 : 0; + switch (PORT_ALPHA(dp)) { // get alt function + case 'A' : alt_all = GPIOA->AFR[ind]; break; + case 'B' : alt_all = GPIOB->AFR[ind]; break; + case 'C' : alt_all = GPIOC->AFR[ind]; break; + case 'D' : alt_all = GPIOD->AFR[ind]; break; + #ifdef PE_0 + case 'E' : alt_all = GPIOE->AFR[ind]; break; + #elif defined (PF_0) + case 'F' : alt_all = GPIOF->AFR[ind]; break; + #elif defined (PG_0) + case 'G' : alt_all = GPIOG->AFR[ind]; break; + #elif defined (PH_0) + case 'H' : alt_all = GPIOH->AFR[ind]; break; + #elif defined (PI_0) + case 'I' : alt_all = GPIOI->AFR[ind]; break; + #elif defined (PJ_0) + case 'J' : alt_all = GPIOJ->AFR[ind]; break; + #elif defined (PK_0) + case 'K' : alt_all = GPIOK->AFR[ind]; break; + #elif defined (PL_0) + case 'L' : alt_all = GPIOL->AFR[ind]; break; + #endif + } + if (over_7) pin_number -= 8; + + uint8_t alt_func = (alt_all >> (4 * pin_number)) & 0x0F; + SERIAL_ECHOPAIR("Alt Function: ", alt_func); + if (alt_func < 10) SERIAL_CHAR(' '); + SERIAL_ECHOPGM(" - "); + switch (alt_func) { + case 0 : SERIAL_ECHOPGM("system (misc. I/O)"); break; + case 1 : SERIAL_ECHOPGM("TIM1/TIM2 (probably PWM)"); break; + case 2 : SERIAL_ECHOPGM("TIM3..5 (probably PWM)"); break; + case 3 : SERIAL_ECHOPGM("TIM8..11 (probably PWM)"); break; + case 4 : SERIAL_ECHOPGM("I2C1..3"); break; + case 5 : SERIAL_ECHOPGM("SPI1/SPI2"); break; + case 6 : SERIAL_ECHOPGM("SPI3"); break; + case 7 : SERIAL_ECHOPGM("USART1..3"); break; + case 8 : SERIAL_ECHOPGM("USART4..6"); break; + case 9 : SERIAL_ECHOPGM("CAN1/CAN2, TIM12..14 (probably PWM)"); break; + case 10 : SERIAL_ECHOPGM("OTG"); break; + case 11 : SERIAL_ECHOPGM("ETH"); break; + case 12 : SERIAL_ECHOPGM("FSMC, SDIO, OTG"); break; + case 13 : SERIAL_ECHOPGM("DCMI"); break; + case 14 : SERIAL_ECHOPGM("unused (shouldn't see this)"); break; + case 15 : SERIAL_ECHOPGM("EVENTOUT"); break; + } + } +} // pwm_details diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h b/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h deleted file mode 100644 index 9069d9f7bd..0000000000 --- a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Support routines for STM32GENERIC (Maple) - */ - -/** - * Translation of routines & variables used by pinsDebug.h - */ - -#ifdef BOARD_NR_GPIO_PINS // Only in STM32GENERIC (Maple) - -#ifdef __STM32F1__ - #include "../STM32F1/fastio.h" -#elif defined(STM32F4) || defined(STM32F7) - #include "../STM32_F4_F7/fastio.h" -#else - #include "fastio.h" -#endif - -extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS]; - -#define NUM_DIGITAL_PINS BOARD_NR_GPIO_PINS -#define NUMBER_PINS_TOTAL BOARD_NR_GPIO_PINS -#define VALID_PIN(pin) (pin >= 0 && pin < BOARD_NR_GPIO_PINS) -#define GET_ARRAY_PIN(p) pin_t(pin_array[p].pin) -#define pwm_status(pin) PWM_PIN(pin) -#define digitalRead_mod(p) extDigitalRead(p) -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3hd "), int16_t(p)); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PORT(p) print_port(p) -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define MULTI_NAME_PAD 21 // space needed to be pretty if not first name assigned to a pin - -// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities -#ifndef M43_NEVER_TOUCH - #define M43_NEVER_TOUCH(Q) (Q >= 9 && Q <= 12) // SERIAL/USB pins PA9(TX) PA10(RX) -#endif - -static inline int8_t get_pin_mode(pin_t pin) { - return VALID_PIN(pin) ? _GET_MODE(pin) : -1; -} - -static inline pin_t DIGITAL_PIN_TO_ANALOG_PIN(pin_t pin) { - if (!VALID_PIN(pin)) return -1; - int8_t adc_channel = int8_t(PIN_MAP[pin].adc_channel); - #ifdef NUM_ANALOG_INPUTS - if (adc_channel >= NUM_ANALOG_INPUTS) adc_channel = ADCx; - #endif - return pin_t(adc_channel); -} - -static inline bool IS_ANALOG(pin_t pin) { - if (!VALID_PIN(pin)) return false; - if (PIN_MAP[pin].adc_channel != ADCx) { - #ifdef NUM_ANALOG_INPUTS - if (PIN_MAP[pin].adc_channel >= NUM_ANALOG_INPUTS) return false; - #endif - return _GET_MODE(pin) == GPIO_INPUT_ANALOG && !M43_NEVER_TOUCH(pin); - } - return false; -} - -static inline bool GET_PINMODE(const pin_t pin) { - return VALID_PIN(pin) && !IS_INPUT(pin); -} - -static inline bool GET_ARRAY_IS_DIGITAL(const int16_t array_pin) { - const pin_t pin = GET_ARRAY_PIN(array_pin); - return (!IS_ANALOG(pin) - #ifdef NUM_ANALOG_INPUTS - || PIN_MAP[pin].adc_channel >= NUM_ANALOG_INPUTS - #endif - ); -} - -#include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density - -static inline void pwm_details(const pin_t pin) { - if (PWM_PIN(pin)) { - timer_dev * const tdev = PIN_MAP[pin].timer_device; - const uint8_t channel = PIN_MAP[pin].timer_channel; - const char num = ( - #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) - tdev == &timer8 ? '8' : - tdev == &timer5 ? '5' : - #endif - tdev == &timer4 ? '4' : - tdev == &timer3 ? '3' : - tdev == &timer2 ? '2' : - tdev == &timer1 ? '1' : '?' - ); - char buffer[10]; - sprintf_P(buffer, PSTR(" TIM%c CH%c"), num, ('0' + channel)); - SERIAL_ECHO(buffer); - } -} - -static inline void print_port(pin_t pin) { - const char port = 'A' + char(pin >> 4); // pin div 16 - const int16_t gbit = PIN_MAP[pin].gpio_bit; - char buffer[8]; - sprintf_P(buffer, PSTR("P%c%hd "), port, gbit); - if (gbit < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(buffer); -} - -#endif // BOARD_NR_GPIO_PINS diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h b/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h deleted file mode 100644 index 71480153a7..0000000000 --- a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) - -/** - * Life gets complicated if you want an easy to use 'M43 I' output (in port/pin order) - * because the variants in this platform do not always define all the I/O port/pins - * that a CPU has. - * - * VARIABLES: - * Ard_num - Arduino pin number - defined by the platform. It is used by digitalRead and - * digitalWrite commands and by M42. - * - does not contain port/pin info - * - is not in port/pin order - * - typically a variant will only assign Ard_num to port/pins that are actually used - * Index - M43 counter - only used to get Ard_num - * x - a parameter/argument used to search the pin_array to try to find a signal name - * associated with a Ard_num - * Port_pin - port number and pin number for use with CPU registers and printing reports - * - * Since M43 uses digitalRead and digitalWrite commands, only the Port_pins with an Ard_num - * are accessed and/or displayed. - * - * Three arrays are used. - * - * digitalPin[] is provided by the platform. It consists of the Port_pin numbers in - * Arduino pin number order. - * - * pin_array is a structure generated by the pins/pinsDebug.h header file. It is generated by - * the preprocessor. Only the signals associated with enabled options are in this table. - * It contains: - * - name of the signal - * - the Ard_num assigned by the pins_YOUR_BOARD.h file using the platform defines. - * EXAMPLE: "#define KILL_PIN PB1" results in Ard_num of 57. 57 is then used as the - * argument to digitalPinToPinName(IO) to get the Port_pin number - * - if it is a digital or analog signal. PWMs are considered digital here. - * - * pin_xref is a structure generated by this header file. It is generated by the - * preprocessor. It is in port/pin order. It contains just the port/pin numbers defined by the - * platform for this variant. - * - Ard_num - * - printable version of Port_pin - * - * Routines with an "x" as a parameter/argument are used to search the pin_array to try to - * find a signal name associated with a port/pin. - * - * NOTE - the Arduino pin number is what is used by the M42 command, NOT the port/pin for that - * signal. The Arduino pin number is listed by the M43 I command. - */ - -//////////////////////////////////////////////////////// -// -// make a list of the Arduino pin numbers in the Port/Pin order -// - -#define _PIN_ADD_2(NAME_ALPHA, ARDUINO_NUM) { {NAME_ALPHA}, ARDUINO_NUM }, -#define _PIN_ADD(NAME_ALPHA, ARDUINO_NUM) { NAME_ALPHA, ARDUINO_NUM }, -#define PIN_ADD(NAME) _PIN_ADD(#NAME, NAME) - -typedef struct { - char Port_pin_alpha[5]; - pin_t Ard_num; -} XrefInfo; - -const XrefInfo pin_xref[] PROGMEM = { - #include "pins_Xref.h" -}; - -//////////////////////////////////////////////////////////// - -#define MODE_PIN_INPUT 0 // Input mode (reset state) -#define MODE_PIN_OUTPUT 1 // General purpose output mode -#define MODE_PIN_ALT 2 // Alternate function mode -#define MODE_PIN_ANALOG 3 // Analog mode - -#define PIN_NUM(P) (P & 0x000F) -#define PIN_NUM_ALPHA_LEFT(P) (((P & 0x000F) < 10) ? ('0' + (P & 0x000F)) : '1') -#define PIN_NUM_ALPHA_RIGHT(P) (((P & 0x000F) > 9) ? ('0' + (P & 0x000F) - 10) : 0 ) -#define PORT_NUM(P) ((P >> 4) & 0x0007) -#define PORT_ALPHA(P) ('A' + (P >> 4)) - -/** - * Translation of routines & variables used by pinsDebug.h - */ -#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define VALID_PIN(ANUM) ((ANUM) >= 0 && (ANUM) < NUMBER_PINS_TOTAL) -#define digitalRead_mod(Ard_num) extDigitalRead(Ard_num) // must use Arduino pin numbers when doing reads -#define PRINT_PIN(Q) -#define PRINT_PORT(ANUM) port_print(ANUM) -#define DIGITAL_PIN_TO_ANALOG_PIN(ANUM) -1 // will report analog pin number in the print port routine -#define GET_PIN_MAP_PIN_M43(Index) pin_xref[Index].Ard_num - -// x is a variable used to search pin_array -#define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital) -#define GET_ARRAY_PIN(x) ((pin_t) pin_array[x].pin) -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin - -#ifndef M43_NEVER_TOUCH - #define _M43_NEVER_TOUCH(Index) (Index >= 9 && Index <= 12) // SERIAL/USB pins: PA9(TX) PA10(RX) PA11(USB_DM) PA12(USB_DP) - #ifdef KILL_PIN - #define M43_NEVER_TOUCH(Index) m43_never_touch(Index) - - bool m43_never_touch(const pin_t Index) { - static pin_t M43_kill_index = -1; - if (M43_kill_index < 0) - for (M43_kill_index = 0; M43_kill_index < NUMBER_PINS_TOTAL; M43_kill_index++) - if (KILL_PIN == GET_PIN_MAP_PIN_M43(M43_kill_index)) break; - return _M43_NEVER_TOUCH(Index) || Index == M43_kill_index; // KILL_PIN and SERIAL/USB - } - #else - #define M43_NEVER_TOUCH(Index) _M43_NEVER_TOUCH(Index) - #endif -#endif - -uint8_t get_pin_mode(const pin_t Ard_num) { - uint32_t mode_all = 0; - const PinName dp = digitalPinToPinName(Ard_num); - switch (PORT_ALPHA(dp)) { - case 'A' : mode_all = GPIOA->MODER; break; - case 'B' : mode_all = GPIOB->MODER; break; - case 'C' : mode_all = GPIOC->MODER; break; - case 'D' : mode_all = GPIOD->MODER; break; - #ifdef PE_0 - case 'E' : mode_all = GPIOE->MODER; break; - #elif defined(PF_0) - case 'F' : mode_all = GPIOF->MODER; break; - #elif defined(PG_0) - case 'G' : mode_all = GPIOG->MODER; break; - #elif defined(PH_0) - case 'H' : mode_all = GPIOH->MODER; break; - #elif defined(PI_0) - case 'I' : mode_all = GPIOI->MODER; break; - #elif defined(PJ_0) - case 'J' : mode_all = GPIOJ->MODER; break; - #elif defined(PK_0) - case 'K' : mode_all = GPIOK->MODER; break; - #elif defined(PL_0) - case 'L' : mode_all = GPIOL->MODER; break; - #endif - } - return (mode_all >> (2 * uint8_t(PIN_NUM(dp)))) & 0x03; -} - -bool GET_PINMODE(const pin_t Ard_num) { - const uint8_t pin_mode = get_pin_mode(Ard_num); - return pin_mode == MODE_PIN_OUTPUT || pin_mode == MODE_PIN_ALT; // assume all alt definitions are PWM -} - -int8_t digital_pin_to_analog_pin(pin_t Ard_num) { - Ard_num -= NUM_ANALOG_FIRST; - return (Ard_num >= 0 && Ard_num < NUM_ANALOG_INPUTS) ? Ard_num : -1; -} - -bool IS_ANALOG(const pin_t Ard_num) { - return get_pin_mode(Ard_num) == MODE_PIN_ANALOG; -} - -bool is_digital(const pin_t x) { - const uint8_t pin_mode = get_pin_mode(pin_array[x].pin); - return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT; -} - -void port_print(const pin_t Ard_num) { - char buffer[16]; - pin_t Index; - for (Index = 0; Index < NUMBER_PINS_TOTAL; Index++) - if (Ard_num == GET_PIN_MAP_PIN_M43(Index)) break; - - const char * ppa = pin_xref[Index].Port_pin_alpha; - sprintf_P(buffer, PSTR("%s"), ppa); - SERIAL_ECHO(buffer); - if (ppa[3] == '\0') SERIAL_CHAR(' '); - - // print analog pin number - const int8_t Port_pin = digital_pin_to_analog_pin(Ard_num); - if (Port_pin >= 0) { - sprintf_P(buffer, PSTR(" (A%d) "), Port_pin); - SERIAL_ECHO(buffer); - if (Port_pin < 10) SERIAL_CHAR(' '); - } - else - SERIAL_ECHO_SP(7); - - // Print number to be used with M42 - sprintf_P(buffer, PSTR(" M42 P%d "), Ard_num); - SERIAL_ECHO(buffer); - if (Ard_num < 10) SERIAL_CHAR(' '); - if (Ard_num < 100) SERIAL_CHAR(' '); -} - -bool pwm_status(const pin_t Ard_num) { - return get_pin_mode(Ard_num) == MODE_PIN_ALT; -} - -void pwm_details(const pin_t Ard_num) { - if (pwm_status(Ard_num)) { - uint32_t alt_all = 0; - const PinName dp = digitalPinToPinName(Ard_num); - pin_t pin_number = uint8_t(PIN_NUM(dp)); - const bool over_7 = pin_number >= 8; - const uint8_t ind = over_7 ? 1 : 0; - switch (PORT_ALPHA(dp)) { // get alt function - case 'A' : alt_all = GPIOA->AFR[ind]; break; - case 'B' : alt_all = GPIOB->AFR[ind]; break; - case 'C' : alt_all = GPIOC->AFR[ind]; break; - case 'D' : alt_all = GPIOD->AFR[ind]; break; - #ifdef PE_0 - case 'E' : alt_all = GPIOE->AFR[ind]; break; - #elif defined (PF_0) - case 'F' : alt_all = GPIOF->AFR[ind]; break; - #elif defined (PG_0) - case 'G' : alt_all = GPIOG->AFR[ind]; break; - #elif defined (PH_0) - case 'H' : alt_all = GPIOH->AFR[ind]; break; - #elif defined (PI_0) - case 'I' : alt_all = GPIOI->AFR[ind]; break; - #elif defined (PJ_0) - case 'J' : alt_all = GPIOJ->AFR[ind]; break; - #elif defined (PK_0) - case 'K' : alt_all = GPIOK->AFR[ind]; break; - #elif defined (PL_0) - case 'L' : alt_all = GPIOL->AFR[ind]; break; - #endif - } - if (over_7) pin_number -= 8; - - uint8_t alt_func = (alt_all >> (4 * pin_number)) & 0x0F; - SERIAL_ECHOPAIR("Alt Function: ", alt_func); - if (alt_func < 10) SERIAL_CHAR(' '); - SERIAL_ECHOPGM(" - "); - switch (alt_func) { - case 0 : SERIAL_ECHOPGM("system (misc. I/O)"); break; - case 1 : SERIAL_ECHOPGM("TIM1/TIM2 (probably PWM)"); break; - case 2 : SERIAL_ECHOPGM("TIM3..5 (probably PWM)"); break; - case 3 : SERIAL_ECHOPGM("TIM8..11 (probably PWM)"); break; - case 4 : SERIAL_ECHOPGM("I2C1..3"); break; - case 5 : SERIAL_ECHOPGM("SPI1/SPI2"); break; - case 6 : SERIAL_ECHOPGM("SPI3"); break; - case 7 : SERIAL_ECHOPGM("USART1..3"); break; - case 8 : SERIAL_ECHOPGM("USART4..6"); break; - case 9 : SERIAL_ECHOPGM("CAN1/CAN2, TIM12..14 (probably PWM)"); break; - case 10 : SERIAL_ECHOPGM("OTG"); break; - case 11 : SERIAL_ECHOPGM("ETH"); break; - case 12 : SERIAL_ECHOPGM("FSMC, SDIO, OTG"); break; - case 13 : SERIAL_ECHOPGM("DCMI"); break; - case 14 : SERIAL_ECHOPGM("unused (shouldn't see this)"); break; - case 15 : SERIAL_ECHOPGM("EVENTOUT"); break; - } - } -} // pwm_details - -#endif // NUM_DIGITAL_PINS diff --git a/Marlin/src/HAL/STM32F1/pinsDebug.h b/Marlin/src/HAL/STM32F1/pinsDebug.h index 2d63ebd770..8e7a3d8135 100644 --- a/Marlin/src/HAL/STM32F1/pinsDebug.h +++ b/Marlin/src/HAL/STM32F1/pinsDebug.h @@ -18,10 +18,102 @@ */ #pragma once -#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) - #include "../STM32/pinsDebug_STM32duino.h" -#elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) - #include "../STM32/pinsDebug_STM32GENERIC.h" -#else - #error "M43 not supported for this board" +/** + * Support routines for STM32GENERIC (Maple) + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#ifndef BOARD_NR_GPIO_PINS // Only in STM32GENERIC (Maple) + #error "Expected BOARD_NR_GPIO_PINS not found" #endif + +#include "fastio.h" + +extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS]; + +#define NUM_DIGITAL_PINS BOARD_NR_GPIO_PINS +#define NUMBER_PINS_TOTAL BOARD_NR_GPIO_PINS +#define VALID_PIN(pin) (pin >= 0 && pin < BOARD_NR_GPIO_PINS) +#define GET_ARRAY_PIN(p) pin_t(pin_array[p].pin) +#define pwm_status(pin) PWM_PIN(pin) +#define digitalRead_mod(p) extDigitalRead(p) +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3hd "), int16_t(p)); SERIAL_ECHO(buffer); }while(0) +#define PRINT_PORT(p) print_port(p) +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define MULTI_NAME_PAD 21 // space needed to be pretty if not first name assigned to a pin + +// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities +#ifndef M43_NEVER_TOUCH + #define M43_NEVER_TOUCH(Q) (Q >= 9 && Q <= 12) // SERIAL/USB pins PA9(TX) PA10(RX) +#endif + +static inline int8_t get_pin_mode(pin_t pin) { + return VALID_PIN(pin) ? _GET_MODE(pin) : -1; +} + +static inline pin_t DIGITAL_PIN_TO_ANALOG_PIN(pin_t pin) { + if (!VALID_PIN(pin)) return -1; + int8_t adc_channel = int8_t(PIN_MAP[pin].adc_channel); + #ifdef NUM_ANALOG_INPUTS + if (adc_channel >= NUM_ANALOG_INPUTS) adc_channel = ADCx; + #endif + return pin_t(adc_channel); +} + +static inline bool IS_ANALOG(pin_t pin) { + if (!VALID_PIN(pin)) return false; + if (PIN_MAP[pin].adc_channel != ADCx) { + #ifdef NUM_ANALOG_INPUTS + if (PIN_MAP[pin].adc_channel >= NUM_ANALOG_INPUTS) return false; + #endif + return _GET_MODE(pin) == GPIO_INPUT_ANALOG && !M43_NEVER_TOUCH(pin); + } + return false; +} + +static inline bool GET_PINMODE(const pin_t pin) { + return VALID_PIN(pin) && !IS_INPUT(pin); +} + +static inline bool GET_ARRAY_IS_DIGITAL(const int16_t array_pin) { + const pin_t pin = GET_ARRAY_PIN(array_pin); + return (!IS_ANALOG(pin) + #ifdef NUM_ANALOG_INPUTS + || PIN_MAP[pin].adc_channel >= NUM_ANALOG_INPUTS + #endif + ); +} + +#include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density + +static inline void pwm_details(const pin_t pin) { + if (PWM_PIN(pin)) { + timer_dev * const tdev = PIN_MAP[pin].timer_device; + const uint8_t channel = PIN_MAP[pin].timer_channel; + const char num = ( + #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + tdev == &timer8 ? '8' : + tdev == &timer5 ? '5' : + #endif + tdev == &timer4 ? '4' : + tdev == &timer3 ? '3' : + tdev == &timer2 ? '2' : + tdev == &timer1 ? '1' : '?' + ); + char buffer[10]; + sprintf_P(buffer, PSTR(" TIM%c CH%c"), num, ('0' + channel)); + SERIAL_ECHO(buffer); + } +} + +static inline void print_port(pin_t pin) { + const char port = 'A' + char(pin >> 4); // pin div 16 + const int16_t gbit = PIN_MAP[pin].gpio_bit; + char buffer[8]; + sprintf_P(buffer, PSTR("P%c%hd "), port, gbit); + if (gbit < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(buffer); +} diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL.cpp deleted file mode 100644 index b4629d2afd..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "HAL.h" - -//#include - -// ------------------------ -// Public Variables -// ------------------------ - -uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -/* VGPV Done with defines -// disable interrupts -void cli() { noInterrupts(); } - -// enable interrupts -void sei() { interrupts(); } -*/ - -void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } - -uint8_t HAL_get_reset_source() { - if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) return RST_WATCHDOG; - if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) return RST_SOFTWARE; - if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) return RST_EXTERNAL; - if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) return RST_POWER_ON; - return 0; -} - -void _delay_ms(const int delay_ms) { delay(delay_ms); } - -extern "C" { - extern unsigned int _ebss; // end of bss section -} - -// return free memory between end of heap (or end bss) and whatever is current - -/* -#include -//extern caddr_t _sbrk(int incr); -#ifndef CONFIG_HEAP_END -extern char _lm_heap_end; -#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) -#endif - -extern "C" { - static int freeMemory() { - char top = 't'; - return &top - reinterpret_cast(sbrk(0)); - } - int freeMemory() { - int free_memory; - int heap_end = (int)_sbrk(0); - free_memory = ((int)&free_memory) - ((int)heap_end); - return free_memory; - } -} -*/ - -// ------------------------ -// ADC -// ------------------------ - -void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } - -uint16_t HAL_adc_get_result() { return HAL_adc_result; } - -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.h b/Marlin/src/HAL/STM32_F4_F7/HAL.h deleted file mode 100644 index 85fbf098ff..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.h +++ /dev/null @@ -1,203 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define CPU_32_BIT - -#include "../../inc/MarlinConfigPre.h" - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" - -#include "fastio.h" -#include "watchdog.h" - -#include - -#if defined(STM32F4) && USBCON - #include -#endif - -// ------------------------ -// Defines -// ------------------------ - -// Serial override -//extern HalSerial usb_serial; - -#define _MSERIAL(X) SerialUART##X -#define MSERIAL(X) _MSERIAL(X) -#define SerialUART0 Serial1 - -#if defined(STM32F4) && SERIAL_PORT == 0 - #error "SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." -#elif SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB -#elif WITHIN(SERIAL_PORT, 0, 6) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#else - #error "SERIAL_PORT must be from -1 to 6. Please update your configuration." -#endif - -#ifdef SERIAL_PORT_2 - #if defined(STM32F4) && SERIAL_PORT_2 == 0 - #error "SERIAL_PORT_2 cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif SERIAL_PORT_2 == -1 - #define MYSERIAL1 SerialUSB - #elif WITHIN(SERIAL_PORT_2, 0, 6) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) - #else - #error "SERIAL_PORT_2 must be from -1 to 6. Please update your configuration." - #endif -#endif - -#ifdef LCD_SERIAL_PORT - #if defined(STM32F4) && LCD_SERIAL_PORT == 0 - #error "LCD_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif LCD_SERIAL_PORT == -1 - #define LCD_SERIAL SerialUSB - #elif WITHIN(LCD_SERIAL_PORT, 0, 6) - #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) - #else - #error "LCD_SERIAL_PORT must be from -1 to 6. Please update your configuration." - #endif -#endif - -/** - * TODO: review this to return 1 for pins that are not analog input - */ -#ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) (p) -#endif - -#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_PRIMASK()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() -#define cli() __disable_irq() -#define sei() __enable_irq() - -// On AVR this is in math.h? -#define square(x) ((x)*(x)) - -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*(addr)) - -// ------------------------ -// Types -// ------------------------ - -typedef int8_t pin_t; - -#ifdef STM32F4 - #define HAL_SERVO_LIB libServo -#endif - -// ------------------------ -// Public Variables -// ------------------------ - -// Result of last ADC conversion -extern uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -// Memory related -#define __bss_end __bss_end__ - -inline void HAL_init() {} - -// Clear reset reason -void HAL_clear_reset_source(); - -// Reset reason -uint8_t HAL_get_reset_source(); - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -void _delay_ms(const int delay); - -/* -extern "C" { - int freeMemory(); -} -*/ - -extern "C" char* _sbrk(int incr); - -/* -int freeMemory() { - volatile int top; - top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); - return top; -} -*/ - -#if GCC_VERSION <= 50000 - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wunused-function" -#endif - -static inline int freeMemory() { - volatile char top; - return &top - reinterpret_cast(_sbrk(0)); -} - -#if GCC_VERSION <= 50000 - #pragma GCC diagnostic pop -#endif - -// -// ADC -// - -#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) - -inline void HAL_adc_init() {} - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_result -#define HAL_ADC_READY() true - -void HAL_adc_start_conversion(const uint8_t adc_pin); -uint16_t HAL_adc_get_result(); - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -#ifdef STM32F4 - #define JTAG_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY) - #define JTAGSWD_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_NONE) -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp deleted file mode 100644 index ebd0b4cee7..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -/** - * Software SPI functions originally from Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman - */ - -/** - * Adapted to the Marlin STM32F4/7 HAL - */ - -#include "../../inc/MarlinConfig.h" - -#include -#include -#include "../shared/HAL_SPI.h" -#include "spi_pins.h" - -// ------------------------ -// Public Variables -// ------------------------ - -static SPISettings spiConfig; - -// ------------------------ -// Public functions -// ------------------------ - -#if ENABLED(SOFTWARE_SPI) - // ------------------------ - // Software SPI - // ------------------------ - #error "Software SPI not supported for STM32F4/7. Use Hardware SPI." -#else - -// ------------------------ -// Hardware SPI -// ------------------------ - -/** - * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz - */ - -/** - * @brief Begin SPI port setup - * - * @return Nothing - * - * @details Only configures SS pin since libmaple creates and initialize the SPI object - */ -void spiBegin() { - #if !defined(SS_PIN) || SS_PIN < 0 - #error "SS_PIN not defined!" - #endif - - OUT_WRITE(SS_PIN, HIGH); -} - -/** Configure SPI for specified SPI speed */ -void spiInit(uint8_t spiRate) { - // Use datarates Marlin uses - uint32_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 - case SPI_HALF_SPEED: clock = 5000000; break; - case SPI_QUARTER_SPEED: clock = 2500000; break; - case SPI_EIGHTH_SPEED: clock = 1250000; break; - case SPI_SPEED_5: clock = 625000; break; - case SPI_SPEED_6: clock = 300000; break; - default: clock = 4000000; // Default from the SPI libarary - } - spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); - SPI.begin(); -} - -/** - * @brief Receives a single byte from the SPI port. - * - * @return Byte received - * - * @details - */ -uint8_t spiRec() { - SPI.beginTransaction(spiConfig); - uint8_t returnByte = SPI.transfer(0xFF); - SPI.endTransaction(); - return returnByte; -} - -/** - * @brief Receives a number of bytes from the SPI port to a buffer - * - * @param buf Pointer to starting address of buffer to write to. - * @param nbyte Number of bytes to receive. - * @return Nothing - * - * @details Uses DMA - */ -void spiRead(uint8_t* buf, uint16_t nbyte) { - SPI.beginTransaction(spiConfig); - #ifndef STM32GENERIC - SPI.dmaTransfer(0, const_cast(buf), nbyte); - #else - SPI.transfer((uint8_t*)buf, nbyte); - #endif - SPI.endTransaction(); -} - -/** - * @brief Sends a single byte on SPI port - * - * @param b Byte to send - * - * @details - */ -void spiSend(uint8_t b) { - SPI.beginTransaction(spiConfig); - SPI.transfer(b); - SPI.endTransaction(); -} - -/** - * @brief Write token and then write from 512 byte buffer to SPI (for SD card) - * - * @param buf Pointer with buffer start address - * @return Nothing - * - * @details Use DMA - */ -void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPI.beginTransaction(spiConfig); - SPI.transfer(token); - #ifndef STM32GENERIC - SPI.dmaSend(const_cast(buf), 512); - #else - SPI.transfer((uint8_t*)buf, nullptr, 512); - #endif - SPI.endTransaction(); -} - -#endif // SOFTWARE_SPI -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/README.md b/Marlin/src/HAL/STM32_F4_F7/README.md deleted file mode 100644 index 3b5a9ab02e..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# This HAL is for... - - - STM32F407 MCU with STM32Generic Arduino core by danieleff. - - STM32F765 board "The Borg" with STM32Generic. - -See the `README.md` files in HAL_STM32F4 and HAL_STM32F7 for the specifics of those hals. diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md b/Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md deleted file mode 100644 index 10396e875b..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# This HAL is for the STM32F407 MCU used with STM32Generic Arduino core by danieleff. - -# Arduino core is located at: - -https://github.com/danieleff/STM32GENERIC - -Unzip it into [Arduino]/hardware folder - -# This HAL is in development. - -This HAL is a modified version of Chris Barr's Picoprint STM32F4 HAL. - diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp deleted file mode 100644 index 8b753f7290..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && defined(STM32F4) - -#include "../../../inc/MarlinConfig.h" - -// ------------------------ -// Local defines -// ------------------------ - -#define NUM_HARDWARE_TIMERS 2 -#define STEP_TIMER_IRQ_ID TIM5_IRQn -#define TEMP_TIMER_IRQ_ID TIM7_IRQn - -// ------------------------ -// Private Variables -// ------------------------ - -stm32_timer_t TimerHandle[NUM_HARDWARE_TIMERS]; - -// ------------------------ -// Public functions -// ------------------------ - -bool timers_initialized[NUM_HARDWARE_TIMERS] = {false}; - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - - if (!timers_initialized[timer_num]) { - constexpr uint32_t step_prescaler = STEPPER_TIMER_PRESCALE - 1, - temp_prescaler = TEMP_TIMER_PRESCALE - 1; - switch (timer_num) { - case STEP_TIMER_NUM: - // STEPPER TIMER TIM5 - use a 32bit timer - __HAL_RCC_TIM5_CLK_ENABLE(); - TimerHandle[timer_num].handle.Instance = TIM5; - TimerHandle[timer_num].handle.Init.Prescaler = step_prescaler; - TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; - TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - TimerHandle[timer_num].callback = (uint32_t)TC5_Handler; - HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 1, 0); - break; - - case TEMP_TIMER_NUM: - // TEMP TIMER TIM7 - any available 16bit Timer (1 already used for PWM) - __HAL_RCC_TIM7_CLK_ENABLE(); - TimerHandle[timer_num].handle.Instance = TIM7; - TimerHandle[timer_num].handle.Init.Prescaler = temp_prescaler; - TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; - TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - TimerHandle[timer_num].callback = (uint32_t)TC7_Handler; - HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_ID, 2, 0); - break; - } - timers_initialized[timer_num] = true; - } - - TimerHandle[timer_num].handle.Init.Period = (((HAL_TIMER_RATE) / TimerHandle[timer_num].handle.Init.Prescaler) / frequency) - 1; - if (HAL_TIM_Base_Init(&TimerHandle[timer_num].handle) == HAL_OK) - HAL_TIM_Base_Start_IT(&TimerHandle[timer_num].handle); -} - -extern "C" { - void TIM5_IRQHandler() { ((void(*)())TimerHandle[0].callback)(); } - void TIM7_IRQHandler() { ((void(*)())TimerHandle[1].callback)(); } -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: HAL_NVIC_EnableIRQ(STEP_TIMER_IRQ_ID); break; - case TEMP_TIMER_NUM: HAL_NVIC_EnableIRQ(TEMP_TIMER_IRQ_ID); break; - } -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: HAL_NVIC_DisableIRQ(STEP_TIMER_IRQ_ID); break; - case TEMP_TIMER_NUM: HAL_NVIC_DisableIRQ(TEMP_TIMER_IRQ_ID); break; - } - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)STEP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)STEP_TIMER_IRQ_ID) & (uint32_t)0x1F)); - case TEMP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) & (uint32_t)0x1F)); - } - return false; -} - -#endif // STM32GENERIC && STM32F4 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h deleted file mode 100644 index a4a7ad82cc..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? -#define HAL_TIMER_TYPE_MAX 0xFFFF - -#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency - -#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz -#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -// TODO change this - -#ifdef STM32GENERIC - #define TC_TIMER_ARGS -#else - #define TC_TIMER_ARGS stimer_t *htim -#endif - -extern void TC5_Handler(TC_TIMER_ARGS); -extern void TC7_Handler(TC_TIMER_ARGS); -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() void TC5_Handler(TC_TIMER_ARGS) -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() void TC7_Handler(TC_TIMER_ARGS) -#endif - -// ------------------------ -// Types -// ------------------------ - -#ifdef STM32GENERIC - typedef struct { - TIM_HandleTypeDef handle; - uint32_t callback; - } tTimerConfig; - typedef tTimerConfig stm32_timer_t; -#else - typedef stimer_t stm32_timer_t; -#endif - -// ------------------------ -// Public Variables -// ------------------------ - -extern stm32_timer_t TimerHandle[]; - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -FORCE_INLINE static uint32_t HAL_timer_get_count(const uint8_t timer_num) { - return __HAL_TIM_GET_COUNTER(&TimerHandle[timer_num].handle); -} - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { - __HAL_TIM_SET_AUTORELOAD(&TimerHandle[timer_num].handle, compare); - if (HAL_timer_get_count(timer_num) >= compare) - TimerHandle[timer_num].handle.Instance->EGR |= TIM_EGR_UG; // Generate an immediate update interrupt -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - return __HAL_TIM_GET_AUTORELOAD(&TimerHandle[timer_num].handle); -} - -#ifdef STM32GENERIC - FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { - if (__HAL_TIM_GET_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE) == SET) - __HAL_TIM_CLEAR_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE); - } -#else - #define HAL_timer_isr_prologue(TIMER_NUM) -#endif - -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md b/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md deleted file mode 100644 index 23155b425e..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# This HAL is for the STM32F765 board "The Borg" used with STM32Generic Arduino core by danieleff. - -# Original core is located at: - -https://github.com/danieleff/STM32GENERIC - -but I haven't committed the changes needed for the Borg there yet, so please use: - -https://github.com/Spawn32/STM32GENERIC - -Unzip it into [Arduino]/hardware folder - - -Download the latest GNU ARM Embedded Toolchain: - -https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads - -(The one in Arduino doesn't support STM32F7). - -Change compiler.path in platform.txt to point to the one you downloaded. - -# This HAL is in development. -# Currently only tested on "The Borg". - -You will also need the latest Arduino 1.9.0-beta or newer. - -This HAL is a modified version of Chris Barr's Picoprint STM32F4 HAL, so shouldn't be to hard to get it to work on a F4. diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp deleted file mode 100644 index e67808c3c4..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp +++ /dev/null @@ -1,898 +0,0 @@ -/** - * TMC26XStepper.cpp - - TMC26X Stepper library for Wiring/Arduino - * - * based on the stepper library by Tom Igoe, et. al. - * - * Copyright (c) 2011, Interactive Matter, Marcus Nowotny - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#if defined(STM32GENERIC) && defined(STM32F7) - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_DRIVER(TMC2660) - -#include -#include -#include "TMC2660.h" - -#include "../../../inc/MarlinConfig.h" -#include "../../../MarlinCore.h" -#include "../../../module/stepper/indirection.h" -#include "../../../module/printcounter.h" -#include "../../../libs/duration_t.h" -#include "../../../libs/hex_print.h" - -//some default values used in initialization -#define DEFAULT_MICROSTEPPING_VALUE 32 - -//TMC26X register definitions -#define DRIVER_CONTROL_REGISTER 0x0UL -#define CHOPPER_CONFIG_REGISTER 0x80000UL -#define COOL_STEP_REGISTER 0xA0000ul -#define STALL_GUARD2_LOAD_MEASURE_REGISTER 0xC0000ul -#define DRIVER_CONFIG_REGISTER 0xE0000ul - -#define REGISTER_BIT_PATTERN 0xFFFFFul - -//definitions for the driver control register -#define MICROSTEPPING_PATTERN 0xFul -#define STEP_INTERPOLATION 0x200UL -#define DOUBLE_EDGE_STEP 0x100UL -#define VSENSE 0x40UL -#define READ_MICROSTEP_POSTION 0x0UL -#define READ_STALL_GUARD_READING 0x10UL -#define READ_STALL_GUARD_AND_COOL_STEP 0x20UL -#define READ_SELECTION_PATTERN 0x30UL - -//definitions for the chopper config register -#define CHOPPER_MODE_STANDARD 0x0UL -#define CHOPPER_MODE_T_OFF_FAST_DECAY 0x4000UL -#define T_OFF_PATTERN 0xFul -#define RANDOM_TOFF_TIME 0x2000UL -#define BLANK_TIMING_PATTERN 0x18000UL -#define BLANK_TIMING_SHIFT 15 -#define HYSTERESIS_DECREMENT_PATTERN 0x1800UL -#define HYSTERESIS_DECREMENT_SHIFT 11 -#define HYSTERESIS_LOW_VALUE_PATTERN 0x780UL -#define HYSTERESIS_LOW_SHIFT 7 -#define HYSTERESIS_START_VALUE_PATTERN 0x78UL -#define HYSTERESIS_START_VALUE_SHIFT 4 -#define T_OFF_TIMING_PATERN 0xFul - -//definitions for cool step register -#define MINIMUM_CURRENT_FOURTH 0x8000UL -#define CURRENT_DOWN_STEP_SPEED_PATTERN 0x6000UL -#define SE_MAX_PATTERN 0xF00ul -#define SE_CURRENT_STEP_WIDTH_PATTERN 0x60UL -#define SE_MIN_PATTERN 0xFul - -//definitions for StallGuard2 current register -#define STALL_GUARD_FILTER_ENABLED 0x10000UL -#define STALL_GUARD_TRESHHOLD_VALUE_PATTERN 0x17F00ul -#define CURRENT_SCALING_PATTERN 0x1Ful -#define STALL_GUARD_CONFIG_PATTERN 0x17F00ul -#define STALL_GUARD_VALUE_PATTERN 0x7F00ul - -//definitions for the input from the TMC2660 -#define STATUS_STALL_GUARD_STATUS 0x1UL -#define STATUS_OVER_TEMPERATURE_SHUTDOWN 0x2UL -#define STATUS_OVER_TEMPERATURE_WARNING 0x4UL -#define STATUS_SHORT_TO_GROUND_A 0x8UL -#define STATUS_SHORT_TO_GROUND_B 0x10UL -#define STATUS_OPEN_LOAD_A 0x20UL -#define STATUS_OPEN_LOAD_B 0x40UL -#define STATUS_STAND_STILL 0x80UL -#define READOUT_VALUE_PATTERN 0xFFC00ul - -#define CPU_32_BIT - -//default values -#define INITIAL_MICROSTEPPING 0x3UL //32th microstepping - -SPIClass SPI_6(SPI6, SPI6_MOSI_PIN, SPI6_MISO_PIN, SPI6_SCK_PIN); - -#define STEPPER_SPI SPI_6 - -//debuging output - -//#define TMC_DEBUG1 - -uint8_t current_scaling = 0; - -/** - * Constructor - * number_of_steps - the steps per rotation - * cs_pin - the SPI client select pin - * dir_pin - the pin where the direction pin is connected - * step_pin - the pin where the step pin is connected - */ -TMC26XStepper::TMC26XStepper(const int16_t in_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t current, uint16_t resistor) { - // We are not started yet - started = false; - - // By default cool step is not enabled - cool_step_enabled = false; - - // Save the pins for later use - this->cs_pin = cs_pin; - this->dir_pin = dir_pin; - this->step_pin = step_pin; - - // Store the current sense resistor value for later use - this->resistor = resistor; - - // Initizalize our status values - this->steps_left = 0; - this->direction = 0; - - // Initialize register values - driver_control_register_value = DRIVER_CONTROL_REGISTER | INITIAL_MICROSTEPPING; - chopper_config_register = CHOPPER_CONFIG_REGISTER; - - // Setting the default register values - driver_control_register_value = DRIVER_CONTROL_REGISTER|INITIAL_MICROSTEPPING; - microsteps = _BV(INITIAL_MICROSTEPPING); - chopper_config_register = CHOPPER_CONFIG_REGISTER; - cool_step_register_value = COOL_STEP_REGISTER; - stallguard2_current_register_value = STALL_GUARD2_LOAD_MEASURE_REGISTER; - driver_configuration_register_value = DRIVER_CONFIG_REGISTER | READ_STALL_GUARD_READING; - - // Set the current - setCurrent(current); - // Set to a conservative start value - setConstantOffTimeChopper(7, 54, 13,12,1); - // Set a nice microstepping value - setMicrosteps(DEFAULT_MICROSTEPPING_VALUE); - // Save the number of steps - number_of_steps = in_steps; -} - - -/** - * start & configure the stepper driver - * just must be called. - */ -void TMC26XStepper::start() { - - #ifdef TMC_DEBUG1 - SERIAL_ECHOLNPGM("\n TMC26X stepper library"); - SERIAL_ECHOPAIR("\n CS pin: ", cs_pin); - SERIAL_ECHOPAIR("\n DIR pin: ", dir_pin); - SERIAL_ECHOPAIR("\n STEP pin: ", step_pin); - SERIAL_PRINTF("\n current scaling: %d", current_scaling); - SERIAL_PRINTF("\n Resistor: %d", resistor); - //SERIAL_PRINTF("\n current: %d", current); - SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); - #endif - - //set the pins as output & its initial value - pinMode(step_pin, OUTPUT); - pinMode(dir_pin, OUTPUT); - pinMode(cs_pin, OUTPUT); - extDigitalWrite(step_pin, LOW); - extDigitalWrite(dir_pin, LOW); - extDigitalWrite(cs_pin, HIGH); - - STEPPER_SPI.begin(); - STEPPER_SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); - - //set the initial values - send262(driver_control_register_value); - send262(chopper_config_register); - send262(cool_step_register_value); - send262(stallguard2_current_register_value); - send262(driver_configuration_register_value); - - //save that we are in running mode - started = true; -} - -/** - * Mark the driver as unstarted to be able to start it again - */ -void TMC26XStepper::un_start() { started = false; } - - -/** - * Sets the speed in revs per minute - */ -void TMC26XStepper::setSpeed(uint16_t whatSpeed) { - this->speed = whatSpeed; - this->step_delay = 60UL * sq(1000UL) / ((uint32_t)this->number_of_steps * (uint32_t)whatSpeed * (uint32_t)this->microsteps); - #ifdef TMC_DEBUG0 // crashes - SERIAL_ECHOPAIR("\nStep delay in micros: ", this->step_delay); - #endif - // Update the next step time - this->next_step_time = this->last_step_time + this->step_delay; -} - -uint16_t TMC26XStepper::getSpeed() { return this->speed; } - -/** - * Moves the motor steps_to_move steps. - * Negative indicates the reverse direction. - */ -char TMC26XStepper::step(int16_t steps_to_move) { - if (this->steps_left == 0) { - this->steps_left = ABS(steps_to_move); // how many steps to take - - // determine direction based on whether steps_to_move is + or -: - if (steps_to_move > 0) - this->direction = 1; - else if (steps_to_move < 0) - this->direction = 0; - return 0; - } - return -1; -} - -char TMC26XStepper::move() { - // decrement the number of steps, moving one step each time: - if (this->steps_left > 0) { - uint32_t time = micros(); - // move only if the appropriate delay has passed: - - // rem if (time >= this->next_step_time) { - - if (ABS(time - this->last_step_time) > this->step_delay) { - // increment or decrement the step number, - // depending on direction: - if (this->direction == 1) - extDigitalWrite(step_pin, HIGH); - else { - extDigitalWrite(dir_pin, HIGH); - extDigitalWrite(step_pin, HIGH); - } - // get the timeStamp of when you stepped: - this->last_step_time = time; - this->next_step_time = time + this->step_delay; - // decrement the steps left: - steps_left--; - //disable the step & dir pins - extDigitalWrite(step_pin, LOW); - extDigitalWrite(dir_pin, LOW); - } - return -1; - } - return 0; -} - -char TMC26XStepper::isMoving() { return this->steps_left > 0; } - -uint16_t TMC26XStepper::getStepsLeft() { return this->steps_left; } - -char TMC26XStepper::stop() { - //note to self if the motor is currently moving - char state = isMoving(); - //stop the motor - this->steps_left = 0; - this->direction = 0; - //return if it was moving - return state; -} - -void TMC26XStepper::setCurrent(uint16_t current) { - uint8_t current_scaling = 0; - //calculate the current scaling from the max current setting (in mA) - float mASetting = (float)current, - resistor_value = (float)this->resistor; - // remove vsense flag - this->driver_configuration_register_value &= ~(VSENSE); - // Derived from I = (cs + 1) / 32 * (Vsense / Rsense) - // leading to cs = 32 * R * I / V (with V = 0,31V oder 0,165V and I = 1000 * current) - // with Rsense = 0,15 - // for vsense = 0,310V (VSENSE not set) - // or vsense = 0,165V (VSENSE set) - current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.31 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 - - // Check if the current scalingis too low - if (current_scaling < 16) { - // Set the csense bit to get a use half the sense voltage (to support lower motor currents) - this->driver_configuration_register_value |= VSENSE; - // and recalculate the current setting - current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.165 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 - #ifdef TMC_DEBUG0 // crashes - SERIAL_ECHOPAIR("\nCS (Vsense=1): ",current_scaling); - #endif - } - #ifdef TMC_DEBUG0 // crashes - else - SERIAL_ECHOPAIR("\nCS: ", current_scaling); - #endif - - // do some sanity checks - NOMORE(current_scaling, 31); - - // delete the old value - stallguard2_current_register_value &= ~(CURRENT_SCALING_PATTERN); - // set the new current scaling - stallguard2_current_register_value |= current_scaling; - // if started we directly send it to the motor - if (started) { - send262(driver_configuration_register_value); - send262(stallguard2_current_register_value); - } -} - -uint16_t TMC26XStepper::getCurrent() { - // Calculate the current according to the datasheet to be on the safe side. - // This is not the fastest but the most accurate and illustrative way. - float result = (float)(stallguard2_current_register_value & CURRENT_SCALING_PATTERN), - resistor_value = (float)this->resistor, - voltage = (driver_configuration_register_value & VSENSE) ? 0.165 : 0.31; - result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); - return (uint16_t)result; -} - -void TMC26XStepper::setStallGuardThreshold(char stallguard_threshold, char stallguard_filter_enabled) { - // We just have 5 bits - LIMIT(stallguard_threshold, -64, 63); - - // Add trim down to 7 bits - stallguard_threshold &= 0x7F; - // Delete old StallGuard settings - stallguard2_current_register_value &= ~(STALL_GUARD_CONFIG_PATTERN); - if (stallguard_filter_enabled) - stallguard2_current_register_value |= STALL_GUARD_FILTER_ENABLED; - - // Set the new StallGuard threshold - stallguard2_current_register_value |= (((uint32_t)stallguard_threshold << 8) & STALL_GUARD_CONFIG_PATTERN); - // If started we directly send it to the motor - if (started) send262(stallguard2_current_register_value); -} - -char TMC26XStepper::getStallGuardThreshold() { - uint32_t stallguard_threshold = stallguard2_current_register_value & STALL_GUARD_VALUE_PATTERN; - //shift it down to bit 0 - stallguard_threshold >>= 8; - //convert the value to an int16_t to correctly handle the negative numbers - char result = stallguard_threshold; - //check if it is negative and fill it up with leading 1 for proper negative number representation - //rem if (result & _BV(6)) { - - if (TEST(result, 6)) result |= 0xC0; - return result; -} - -char TMC26XStepper::getStallGuardFilter() { - if (stallguard2_current_register_value & STALL_GUARD_FILTER_ENABLED) - return -1; - return 0; -} - -/** - * Set the number of microsteps per step. - * 0,2,4,8,16,32,64,128,256 is supported - * any value in between will be mapped to the next smaller value - * 0 and 1 set the motor in full step mode - */ -void TMC26XStepper::setMicrosteps(const int16_t in_steps) { - uint16_t setting_pattern; - - if (in_steps >= 256) setting_pattern = 0; - else if (in_steps >= 128) setting_pattern = 1; - else if (in_steps >= 64) setting_pattern = 2; - else if (in_steps >= 32) setting_pattern = 3; - else if (in_steps >= 16) setting_pattern = 4; - else if (in_steps >= 8) setting_pattern = 5; - else if (in_steps >= 4) setting_pattern = 6; - else if (in_steps >= 2) setting_pattern = 7; - else if (in_steps <= 1) setting_pattern = 8; // 1 and 0 lead to full step - - microsteps = _BV(8 - setting_pattern); - - #ifdef TMC_DEBUG0 // crashes - SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); - #endif - - // Delete the old value - this->driver_control_register_value &= 0x000FFFF0UL; - - // Set the new value - this->driver_control_register_value |= setting_pattern; - - // If started we directly send it to the motor - if (started) send262(driver_control_register_value); - - // Recalculate the stepping delay by simply setting the speed again - this->setSpeed(this->speed); -} - -/** - * returns the effective number of microsteps at the moment - */ -int16_t TMC26XStepper::getMicrosteps() { return microsteps; } - -/** - * constant_off_time: The off time setting controls the minimum chopper frequency. - * For most applications an off time within the range of 5μs to 20μs will fit. - * 2...15: off time setting - * - * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the - * duration of the ringing on the sense resistor. For - * 0: min. setting 3: max. setting - * - * fast_decay_time_setting: Fast decay time setting. With CHM=1, these bits control the portion of fast decay for each chopper cycle. - * 0: slow decay only - * 1...15: duration of fast decay phase - * - * sine_wave_offset: Sine wave offset. With CHM=1, these bits control the sine wave offset. - * A positive offset corrects for zero crossing error. - * -3..-1: negative offset 0: no offset 1...12: positive offset - * - * use_current_comparator: Selects usage of the current comparator for termination of the fast decay cycle. - * If current comparator is enabled, it terminates the fast decay cycle in case the current - * reaches a higher negative value than the actual positive value. - * 1: enable comparator termination of fast decay cycle - * 0: end by time only - */ -void TMC26XStepper::setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, uint8_t use_current_comparator) { - // Perform some sanity checks - LIMIT(constant_off_time, 2, 15); - - // Save the constant off time - this->constant_off_time = constant_off_time; - - // Calculate the value acc to the clock cycles - const char blank_value = blank_time >= 54 ? 3 : - blank_time >= 36 ? 2 : - blank_time >= 24 ? 1 : 0; - - LIMIT(fast_decay_time_setting, 0, 15); - LIMIT(sine_wave_offset, -3, 12); - - // Shift the sine_wave_offset - sine_wave_offset += 3; - - // Calculate the register setting - // First of all delete all the values for this - chopper_config_register &= ~(_BV(12) | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); - // Set the constant off pattern - chopper_config_register |= CHOPPER_MODE_T_OFF_FAST_DECAY; - // Set the blank timing value - chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; - // Setting the constant off time - chopper_config_register |= constant_off_time; - // Set the fast decay time - // Set msb - chopper_config_register |= (((uint32_t)(fast_decay_time_setting & 0x8)) << HYSTERESIS_DECREMENT_SHIFT); - // Other bits - chopper_config_register |= (((uint32_t)(fast_decay_time_setting & 0x7)) << HYSTERESIS_START_VALUE_SHIFT); - // Set the sine wave offset - chopper_config_register |= (uint32_t)sine_wave_offset << HYSTERESIS_LOW_SHIFT; - // Using the current comparator? - if (!use_current_comparator) - chopper_config_register |= _BV(12); - - // If started we directly send it to the motor - if (started) { - // rem send262(driver_control_register_value); - send262(chopper_config_register); - } -} - -/** - * constant_off_time: The off time setting controls the minimum chopper frequency. - * For most applications an off time within the range of 5μs to 20μs will fit. - * 2...15: off time setting - * - * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the - * duration of the ringing on the sense resistor. For - * 0: min. setting 3: max. setting - * - * hysteresis_start: Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value HEND. - * 1...8 - * - * hysteresis_end: Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by HDEC. - * The sum HSTRT+HEND must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. - * -3..-1: negative HEND 0: zero HEND 1...12: positive HEND - * - * hysteresis_decrement: Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. - * 0: fast decrement 3: very slow decrement - */ - -void TMC26XStepper::setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement) { - // Perform some sanity checks - LIMIT(constant_off_time, 2, 15); - - // Save the constant off time - this->constant_off_time = constant_off_time; - - // Calculate the value acc to the clock cycles - const char blank_value = blank_time >= 54 ? 3 : - blank_time >= 36 ? 2 : - blank_time >= 24 ? 1 : 0; - - LIMIT(hysteresis_start, 1, 8); - hysteresis_start--; - - LIMIT(hysteresis_start, -3, 12); - - // Shift the hysteresis_end - hysteresis_end += 3; - - LIMIT(hysteresis_decrement, 0, 3); - - //first of all delete all the values for this - chopper_config_register &= ~(CHOPPER_MODE_T_OFF_FAST_DECAY | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); - - //set the blank timing value - chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; - //setting the constant off time - chopper_config_register |= constant_off_time; - //set the hysteresis_start - chopper_config_register |= ((uint32_t)hysteresis_start) << HYSTERESIS_START_VALUE_SHIFT; - //set the hysteresis end - chopper_config_register |= ((uint32_t)hysteresis_end) << HYSTERESIS_LOW_SHIFT; - //set the hystereis decrement - chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; - //if started we directly send it to the motor - if (started) { - //rem send262(driver_control_register_value); - send262(chopper_config_register); - } -} - -/** - * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. - * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, thus it depends on the microstep position. - * With some motors a slightly audible beat can occur between the chopper frequencies, especially when they are near to each other. This typically occurs at a - * few microstep positions within each quarter wave. This effect normally is not audible when compared to mechanical noise generated by ball bearings, etc. - * Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. - * Hint: A common factor, which can cause motor noise, is a bad PCB layout causing coupling of both sense resistor voltages - * (please refer to sense resistor layout hint in chapter 8.1). - * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. - * It modulates the slow decay time setting when switched on by the RNDTF bit. The RNDTF feature further spreads the chopper spectrum, - * reducing electromagnetic emission on single frequencies. - */ -void TMC26XStepper::setRandomOffTime(char value) { - if (value) - chopper_config_register |= RANDOM_TOFF_TIME; - else - chopper_config_register &= ~(RANDOM_TOFF_TIME); - //if started we directly send it to the motor - if (started) { - //rem send262(driver_control_register_value); - send262(chopper_config_register); - } -} - -void TMC26XStepper::setCoolStepConfiguration( - uint16_t lower_SG_threshold, - uint16_t SG_hysteresis, - uint8_t current_decrement_step_size, - uint8_t current_increment_step_size, - uint8_t lower_current_limit -) { - // Sanitize the input values - NOMORE(lower_SG_threshold, 480); - // Divide by 32 - lower_SG_threshold >>= 5; - NOMORE(SG_hysteresis, 480); - // Divide by 32 - SG_hysteresis >>= 5; - NOMORE(current_decrement_step_size, 3); - NOMORE(current_increment_step_size, 3); - NOMORE(lower_current_limit, 1); - - // Store the lower level in order to enable/disable the cool step - this->cool_step_lower_threshold=lower_SG_threshold; - // If cool step is not enabled we delete the lower value to keep it disabled - if (!this->cool_step_enabled) lower_SG_threshold = 0; - // The good news is that we can start with a complete new cool step register value - // And simply set the values in the register - cool_step_register_value = ((uint32_t)lower_SG_threshold) - | (((uint32_t)SG_hysteresis) << 8) - | (((uint32_t)current_decrement_step_size) << 5) - | (((uint32_t)current_increment_step_size) << 13) - | (((uint32_t)lower_current_limit) << 15) - | COOL_STEP_REGISTER; // Register signature - - if (started) send262(cool_step_register_value); -} - -void TMC26XStepper::setCoolStepEnabled(boolean enabled) { - // Simply delete the lower limit to disable the cool step - cool_step_register_value &= ~SE_MIN_PATTERN; - // And set it to the proper value if cool step is to be enabled - if (enabled) - cool_step_register_value |= this->cool_step_lower_threshold; - // And save the enabled status - this->cool_step_enabled = enabled; - // Save the register value - if (started) send262(cool_step_register_value); -} - -boolean TMC26XStepper::isCoolStepEnabled() { return this->cool_step_enabled; } - -uint16_t TMC26XStepper::getCoolStepLowerSgThreshold() { - // We return our internally stored value - in order to provide the correct setting even if cool step is not enabled - return this->cool_step_lower_threshold<<5; -} - -uint16_t TMC26XStepper::getCoolStepUpperSgThreshold() { - return uint8_t((cool_step_register_value & SE_MAX_PATTERN) >> 8) << 5; -} - -uint8_t TMC26XStepper::getCoolStepCurrentIncrementSize() { - return uint8_t((cool_step_register_value & CURRENT_DOWN_STEP_SPEED_PATTERN) >> 13); -} - -uint8_t TMC26XStepper::getCoolStepNumberOfSGReadings() { - return uint8_t((cool_step_register_value & SE_CURRENT_STEP_WIDTH_PATTERN) >> 5); -} - -uint8_t TMC26XStepper::getCoolStepLowerCurrentLimit() { - return uint8_t((cool_step_register_value & MINIMUM_CURRENT_FOURTH) >> 15); -} - -void TMC26XStepper::setEnabled(boolean enabled) { - //delete the t_off in the chopper config to get sure - chopper_config_register &= ~(T_OFF_PATTERN); - if (enabled) { - //and set the t_off time - chopper_config_register |= this->constant_off_time; - } - //if not enabled we don't have to do anything since we already delete t_off from the register - if (started) send262(chopper_config_register); -} - -boolean TMC26XStepper::isEnabled() { return !!(chopper_config_register & T_OFF_PATTERN); } - -/** - * reads a value from the TMC26X status register. The value is not obtained directly but can then - * be read by the various status routines. - */ -void TMC26XStepper::readStatus(char read_value) { - uint32_t old_driver_configuration_register_value = driver_configuration_register_value; - //reset the readout configuration - driver_configuration_register_value &= ~(READ_SELECTION_PATTERN); - //this now equals TMC26X_READOUT_POSITION - so we just have to check the other two options - if (read_value == TMC26X_READOUT_STALLGUARD) - driver_configuration_register_value |= READ_STALL_GUARD_READING; - else if (read_value == TMC26X_READOUT_CURRENT) - driver_configuration_register_value |= READ_STALL_GUARD_AND_COOL_STEP; - - //all other cases are ignored to prevent funny values - //check if the readout is configured for the value we are interested in - if (driver_configuration_register_value != old_driver_configuration_register_value) { - //because then we need to write the value twice - one time for configuring, second time to get the value, see below - send262(driver_configuration_register_value); - } - //write the configuration to get the last status - send262(driver_configuration_register_value); -} - -int16_t TMC26XStepper::getMotorPosition() { - //we read it out even if we are not started yet - perhaps it is useful information for somebody - readStatus(TMC26X_READOUT_POSITION); - return getReadoutValue(); -} - -//reads the StallGuard setting from last status -//returns -1 if StallGuard information is not present -int16_t TMC26XStepper::getCurrentStallGuardReading() { - //if we don't yet started there cannot be a StallGuard value - if (!started) return -1; - //not time optimal, but solution optiomal: - //first read out the StallGuard value - readStatus(TMC26X_READOUT_STALLGUARD); - return getReadoutValue(); -} - -uint8_t TMC26XStepper::getCurrentCSReading() { - //if we don't yet started there cannot be a StallGuard value - if (!started) return 0; - //not time optimal, but solution optiomal: - //first read out the StallGuard value - readStatus(TMC26X_READOUT_CURRENT); - return (getReadoutValue() & 0x1F); -} - -uint16_t TMC26XStepper::getCurrentCurrent() { - float result = (float)getCurrentCSReading(), - resistor_value = (float)this->resistor, - voltage = (driver_configuration_register_value & VSENSE)? 0.165 : 0.31; - result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); - return (uint16_t)result; -} - -/** - * Return true if the StallGuard threshold has been reached - */ -boolean TMC26XStepper::isStallGuardOverThreshold() { - if (!this->started) return false; - return (driver_status_result & STATUS_STALL_GUARD_STATUS); -} - -/** - * returns if there is any over temperature condition: - * OVER_TEMPERATURE_PREWARING if pre warning level has been reached - * OVER_TEMPERATURE_SHUTDOWN if the temperature is so hot that the driver is shut down - * Any of those levels are not too good. - */ -char TMC26XStepper::getOverTemperature() { - if (!this->started) return 0; - - if (driver_status_result & STATUS_OVER_TEMPERATURE_SHUTDOWN) - return TMC26X_OVERTEMPERATURE_SHUTDOWN; - - if (driver_status_result & STATUS_OVER_TEMPERATURE_WARNING) - return TMC26X_OVERTEMPERATURE_PREWARING; - - return 0; -} - -// Is motor channel A shorted to ground -boolean TMC26XStepper::isShortToGroundA() { - if (!this->started) return false; - return (driver_status_result & STATUS_SHORT_TO_GROUND_A); -} - -// Is motor channel B shorted to ground -boolean TMC26XStepper::isShortToGroundB() { - if (!this->started) return false; - return (driver_status_result & STATUS_SHORT_TO_GROUND_B); -} - -// Is motor channel A connected -boolean TMC26XStepper::isOpenLoadA() { - if (!this->started) return false; - return (driver_status_result & STATUS_OPEN_LOAD_A); -} - -// Is motor channel B connected -boolean TMC26XStepper::isOpenLoadB() { - if (!this->started) return false; - return (driver_status_result & STATUS_OPEN_LOAD_B); -} - -// Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s -boolean TMC26XStepper::isStandStill() { - if (!this->started) return false; - return (driver_status_result & STATUS_STAND_STILL); -} - -//is chopper inactive since 2^20 clock cycles - defaults to ~0,08s -boolean TMC26XStepper::isStallGuardReached() { - if (!this->started) return false; - return (driver_status_result & STATUS_STALL_GUARD_STATUS); -} - -//reads the StallGuard setting from last status -//returns -1 if StallGuard information is not present -int16_t TMC26XStepper::getReadoutValue() { - return (int)(driver_status_result >> 10); -} - -int16_t TMC26XStepper::getResistor() { return this->resistor; } - -boolean TMC26XStepper::isCurrentScalingHalfed() { - return !!(this->driver_configuration_register_value & VSENSE); -} -/** - * version() returns the version of the library: - */ -int16_t TMC26XStepper::version() { return 1; } - -void TMC26XStepper::debugLastStatus() { - #ifdef TMC_DEBUG1 - if (this->started) { - if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_PREWARING) - SERIAL_ECHOLNPGM("\n WARNING: Overtemperature Prewarning!"); - else if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_SHUTDOWN) - SERIAL_ECHOLNPGM("\n ERROR: Overtemperature Shutdown!"); - - if (this->isShortToGroundA()) - SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel A!"); - - if (this->isShortToGroundB()) - SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel B!"); - - if (this->isOpenLoadA()) - SERIAL_ECHOLNPGM("\n ERROR: Channel A seems to be unconnected!"); - - if (this->isOpenLoadB()) - SERIAL_ECHOLNPGM("\n ERROR: Channel B seems to be unconnected!"); - - if (this->isStallGuardReached()) - SERIAL_ECHOLNPGM("\n INFO: Stall Guard level reached!"); - - if (this->isStandStill()) - SERIAL_ECHOLNPGM("\n INFO: Motor is standing still."); - - uint32_t readout_config = driver_configuration_register_value & READ_SELECTION_PATTERN; - const int16_t value = getReadoutValue(); - if (readout_config == READ_MICROSTEP_POSTION) { - SERIAL_ECHOPAIR("\n Microstep position phase A: ", value); - } - else if (readout_config == READ_STALL_GUARD_READING) { - SERIAL_ECHOPAIR("\n Stall Guard value:", value); - } - else if (readout_config == READ_STALL_GUARD_AND_COOL_STEP) { - SERIAL_ECHOPAIR("\n Approx Stall Guard: ", value & 0xF); - SERIAL_ECHOPAIR("\n Current level", value & 0x1F0); - } - } - #endif -} - -/** - * send register settings to the stepper driver via SPI - * returns the current status - */ -inline void TMC26XStepper::send262(uint32_t datagram) { - uint32_t i_datagram; - - //preserver the previous spi mode - //uint8_t oldMode = SPCR & SPI_MODE_MASK; - - //if the mode is not correct set it to mode 3 - //if (oldMode != SPI_MODE3) { - // SPI.setDataMode(SPI_MODE3); - //} - - //select the TMC driver - extDigitalWrite(cs_pin, LOW); - - //ensure that only valid bist are set (0-19) - //datagram &=REGISTER_BIT_PATTERN; - - #ifdef TMC_DEBUG1 - //SERIAL_PRINTF("Sending "); - //SERIAL_PRINTF("Sending ", datagram,HEX); - //SERIAL_ECHOPAIR("\n\nSending \n", print_hex_long(datagram)); - SERIAL_PRINTF("\n\nSending %x", datagram); - #endif - - //write/read the values - i_datagram = STEPPER_SPI.transfer((datagram >> 16) & 0xFF); - i_datagram <<= 8; - i_datagram |= STEPPER_SPI.transfer((datagram >> 8) & 0xFF); - i_datagram <<= 8; - i_datagram |= STEPPER_SPI.transfer((datagram) & 0xFF); - i_datagram >>= 4; - - #ifdef TMC_DEBUG1 - //SERIAL_PRINTF("Received "); - //SERIAL_PRINTF("Received ", i_datagram,HEX); - //SERIAL_ECHOPAIR("\n\nReceived \n", i_datagram); - SERIAL_PRINTF("\n\nReceived %x", i_datagram); - debugLastStatus(); - #endif - - //deselect the TMC chip - extDigitalWrite(cs_pin, HIGH); - - //restore the previous SPI mode if neccessary - //if the mode is not correct set it to mode 3 - //if (oldMode != SPI_MODE3) { - // SPI.setDataMode(oldMode); - //} - - //store the datagram as status result - driver_status_result = i_datagram; -} - -#endif // HAS_DRIVER(TMC2660) - -#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h deleted file mode 100644 index 208c3bc7e0..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h +++ /dev/null @@ -1,593 +0,0 @@ -/** - * TMC26XStepper.h - - TMC26X Stepper library for Wiring/Arduino - * - * based on the stepper library by Tom Igoe, et. al. - * - * Copyright (c) 2011, Interactive Matter, Marcus Nowotny - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#pragma once - -#include - -//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature situation in the TMC chip -/*! - * This warning indicates that the TMC chip is too warm. - * It is still working but some parameters may be inferior. - * You should do something against it. - */ -#define TMC26X_OVERTEMPERATURE_PREWARING 1 -//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature shutdown in the TMC chip -/*! - * This warning indicates that the TMC chip is too warm to operate and has shut down to prevent damage. - * It will stop working until it cools down again. - * If you encouter this situation you must do something against it. Like reducing the current or improving the PCB layout - * and/or heat management. - */ -#define TMC26X_OVERTEMPERATURE_SHUTDOWN 2 - -//which values can be read out -/*! - * Selects to readout the microstep position from the motor. - *\sa readStatus() - */ -#define TMC26X_READOUT_POSITION 0 -/*! - * Selects to read out the StallGuard value of the motor. - *\sa readStatus() - */ -#define TMC26X_READOUT_STALLGUARD 1 -/*! - * Selects to read out the current current setting (acc. to CoolStep) and the upper bits of the StallGuard value from the motor. - *\sa readStatus(), setCurrent() - */ -#define TMC26X_READOUT_CURRENT 3 - -/*! - * Define to set the minimum current for CoolStep operation to 1/2 of the selected CS minium. - *\sa setCoolStepConfiguration() - */ -#define COOL_STEP_HALF_CS_LIMIT 0 -/*! - * Define to set the minimum current for CoolStep operation to 1/4 of the selected CS minium. - *\sa setCoolStepConfiguration() - */ -#define COOL_STEP_QUARTDER_CS_LIMIT 1 - -/*! - * \class TMC26XStepper - * \brief Class representing a TMC26X stepper driver - * - * To use one of these drivers in your code create an object of its class: - * \code - * TMC26XStepper tmc_stepper = TMC26XStepper(200,1,2,3,500); - * \endcode - * see TMC26XStepper(int16_t number_of_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t rms_current) - * - * Keep in mind that you need to start the driver with start() in order to configure the TMC26X. - * - * The most important function is move(). It checks if the motor requires a step. It's important to call move() as - * often as possible in loop(). I suggest using a very fast loop routine and always call move() at the beginning or end. - * - * To move you must set a movement speed with setSpeed(). The speed is a positive value, setting the RPM. - * - * To really move the motor you have to call step() to tell the driver to move the motor the given number - * of steps in the given direction. Positive values move the motor in one direction, negative values in the other. - * - * You can check with isMoving() if the motor is still moving or stop it abruptly with stop(). - */ -class TMC26XStepper { - public: - /*! - * \brief Create a new representation of a stepper motor connected to a TMC26X stepper driver - * - * Main constructor. If in doubt use this. All parameters must be provided as described below. - * - * \param number_of_steps Number of steps the motor has per rotation. - * \param cs_pin Arduino pin connected to the Client Select Pin (!CS) of the TMC26X for SPI. - * \param dir_pin Arduino pin connected to the DIR input of the TMC26X. - * \param step_pin Arduino pin connected to the STEP pin of the TMC26X. - * \param rms_current Maximum current to provide to the motor in mA (!). A value of 200 will send up to 200mA to the motor. - * \param resistor Current sense resistor in milli-Ohm, defaults to 0.15 Ohm (or 150 milli-Ohm) as in the TMC260 Arduino Shield. - * - * You must also call TMC26XStepper.start() to configure the stepper driver for use. - * - * By default the Constant Off Time chopper is used. See TMC26XStepper.setConstantOffTimeChopper() for details. - * This should work on most motors (YMMV). You may want to configure and use the Spread Cycle Chopper. See setSpreadCycleChopper(). - * - * By default a microstepping of 1/32 is used to provide a smooth motor run while still giving a good progression per step. - * Change stepping by sending setMicrosteps() a different value. - * \sa start(), setMicrosteps() - */ - TMC26XStepper(const int16_t in_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t current, uint16_t resistor=100); //resistor=150 - - /*! - * \brief Configure and start the TMC26X stepper driver. Before this is called the stepper driver is nonfunctional. - * - * Configure the TMC26X stepper driver for the given values via SPI. - * Most member functions are non-functional if the driver has not been started, - * therefore it is best to call this in setup(). - */ - void start(); - - /*! - * \brief Reset the stepper in unconfigured mode. - * - * Allows start to be called again. It doesn't change the internal stepper - * configuration or the desired configuration. It just marks the stepper as - * not-yet-started. The stepper doesn't need to be reconfigured before - * starting again, and is not reset to any factory settings. - * It must be reset intentionally. - * (Hint: Normally you do not need this function) - */ - void un_start(); - - /*! - * \brief Set the rotation speed in RPM. - * \param whatSpeed the desired speed in RPM. - */ - void setSpeed(uint16_t whatSpeed); - - /*! - * \brief Report the currently selected speed in RPM. - * \sa setSpeed() - */ - uint16_t getSpeed(); - - /*! - * \brief Set the number of microsteps in 2^i values (rounded) up to 256 - * - * This method sets the number of microsteps per step in 2^i interval. - * It accepts 1, 2, 4, 16, 32, 64, 128 or 256 as valid microsteps. - * Other values will be rounded down to the next smaller value (e.g., 3 gives a microstepping of 2). - * You can always check the current microstepping with getMicrosteps(). - */ - void setMicrosteps(const int16_t in_steps); - - /*! - * \brief Return the effective current number of microsteps selected. - * - * Always returns the effective number of microsteps. - * This may be different from the micro-steps set in setMicrosteps() since it is rounded to 2^i. - * - * \sa setMicrosteps() - */ - int16_t getMicrosteps(); - - /*! - * \brief Initiate a movement with the given number of steps. Positive values move in one direction, negative in the other. - * - * \param number_of_steps The number of steps to move the motor. - * \return 0 if the motor was not moving and moves now. -1 if the motor is moving and the new steps could not be set. - * - * If the previous movement is incomplete the function returns -1 and doesn't change the steps to move the motor. - * If the motor does not move it returns 0. - * - * The movement direction is determined by the sign of the steps parameter. The motor direction in machine space - * cannot be determined, as it depends on the construction of the motor and how it functions in the drive system. - * - * For safety, verify with isMoving() or even use stop() to stop the motor before giving it new step directions. - * \sa isMoving(), getStepsLeft(), stop() - */ - char step(int16_t number_of_steps); - - /*! - * \brief Central movement method. Must be called as often as possible in the loop function and is very fast. - * - * Check if the motor still has to move and whether the wait-to-step interval has expired, and manages the - * number of steps remaining to fulfill the current move command. - * - * This function is implemented to be as fast as possible, so call it as often as possible in your loop. - * It should be invoked with as frequently and with as much regularity as possible. - * - * This can be called even when the motor is known not to be moving. It will simply return. - * - * The frequency with which this function is called determines the top stepping speed of the motor. - * It is recommended to call this using a hardware timer to ensure regular invocation. - * \sa step() - */ - char move(); - - /*! - * \brief Check whether the last movement command is done. - * \return 0 if the motor stops, -1 if the motor is moving. - * - * Used to determine if the motor is ready for new movements. - *\sa step(), move() - */ - char isMoving(); - - /*! - * \brief Get the number of steps left in the current movement. - * \return The number of steps left in the movement. Always positive. - */ - uint16_t getStepsLeft(); - - /*! - * \brief Stop the motor immediately. - * \return -1 if the motor was moving and is really stoped or 0 if it was not moving at all. - * - * This method directly and abruptly stops the motor and may be used as an emergency stop. - */ - char stop(); - - /*! - * \brief Set and configure the classical Constant Off Timer Chopper - * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) - * \param blank_time Comparator blank time. This duration needs to safely cover the duration of the switching event and the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting - * \param fast_decay_time_setting Fast decay time setting. Controls the portion of fast decay for each chopper cycle. 0: slow decay only, 1…15: duration of fast decay phase - * \param sine_wave_offset Sine wave offset. Controls the sine wave offset. A positive offset corrects for zero crossing error. -3…-1: negative offset, 0: no offset,1…12: positive offset - * \param use_curreent_comparator Selects usage of the current comparator for termination of the fast decay cycle. If current comparator is enabled, it terminates the fast decay cycle in case the current reaches a higher negative value than the actual positive value. (0 disable, -1 enable). - * - * The classic constant off time chopper uses a fixed portion of fast decay following each on phase. - * While the duration of the on time is determined by the chopper comparator, the fast decay time needs - * to be set by the user in a way, that the current decay is enough for the driver to be able to follow - * the falling slope of the sine wave, and on the other hand it should not be too long, in order to minimize - * motor current ripple and power dissipation. This best can be tuned using an oscilloscope or - * trying out motor smoothness at different velocities. A good starting value is a fast decay time setting - * similar to the slow decay time setting. - * After tuning of the fast decay time, the offset should be determined, in order to have a smooth zero transition. - * This is necessary, because the fast decay phase leads to the absolute value of the motor current being lower - * than the target current (see figure 17). If the zero offset is too low, the motor stands still for a short - * moment during current zero crossing, if it is set too high, it makes a larger microstep. - * Typically, a positive offset setting is required for optimum operation. - * - * \sa setSpreadCycleChoper() for other alternatives. - * \sa setRandomOffTime() for spreading the noise over a wider spectrum - */ - void setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, uint8_t use_current_comparator); - - /*! - * \brief Sets and configures with spread cycle chopper. - * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) - * \param blank_time Selects the comparator blank time. This time needs to safely cover the switching event and the duration of the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting - * \param hysteresis_start Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value. 1 … 8 - * \param hysteresis_end Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by hysteresis_decrement. The sum hysteresis_start + hysteresis_end must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. - * \param hysteresis_decrement Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. 0 (fast decrement) … 3 (slow decrement). - * - * The spreadCycle chopper scheme (pat.fil.) is a precise and simple to use chopper principle, which automatically determines - * the optimum fast decay portion for the motor. Anyhow, a number of settings can be made in order to optimally fit the driver - * to the motor. - * Each chopper cycle is comprised of an on-phase, a slow decay phase, a fast decay phase and a second slow decay phase. - * The slow decay phases limit the maximum chopper frequency and are important for low motor and driver power dissipation. - * The hysteresis start setting limits the chopper frequency by forcing the driver to introduce a minimum amount of - * current ripple into the motor coils. The motor inductivity determines the ability to follow a changing motor current. - * The duration of the on- and fast decay phase needs to cover at least the blank time, because the current comparator is - * disabled during this time. - * - * \sa setRandomOffTime() for spreading the noise over a wider spectrum - */ - void setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement); - - /*! - * \brief Use random off time for noise reduction (0 for off, -1 for on). - * \param value 0 for off, -1 for on - * - * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. - * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, - * thus it depends on the microstep position. With some motors a slightly audible beat can occur between the chopper - * frequencies, especially when they are near to each other. This typically occurs at a few microstep positions within - * each quarter wave. - * This effect normally is not audible when compared to mechanical noise generated by ball bearings, - * etc. Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. - * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. - * It modulates the slow decay time setting when switched on. The random off time feature further spreads the chopper spectrum, - * reducing electromagnetic emission on single frequencies. - */ - void setRandomOffTime(char value); - - /*! - * \brief set the maximum motor current in mA (1000 is 1 Amp) - * Keep in mind this is the maximum peak Current. The RMS current will be 1/sqrt(2) smaller. The actual current can also be smaller - * by employing CoolStep. - * \param current the maximum motor current in mA - * \sa getCurrent(), getCurrentCurrent() - */ - void setCurrent(uint16_t current); - - /*! - * \brief readout the motor maximum current in mA (1000 is an Amp) - * This is the maximum current. to get the current current - which may be affected by CoolStep us getCurrentCurrent() - * \return the maximum motor current in milli amps - * \sa getCurrentCurrent() - */ - uint16_t getCurrent(); - - /*! - * \brief set the StallGuard threshold in order to get sensible StallGuard readings. - * \param stallguard_threshold -64 … 63 the StallGuard threshold - * \param stallguard_filter_enabled 0 if the filter is disabled, -1 if it is enabled - * - * The StallGuard threshold is used to optimize the StallGuard reading to sensible values. It should be at 0 at - * the maximum allowable load on the otor (but not before). = is a good starting point (and the default) - * If you get Stall Gaurd readings of 0 without any load or with too little laod increase the value. - * If you get readings of 1023 even with load decrease the setting. - * - * If you switch on the filter the StallGuard reading is only updated each 4th full step to reduce the noise in the - * reading. - * - * \sa getCurrentStallGuardReading() to read out the current value. - */ - void setStallGuardThreshold(char stallguard_threshold, char stallguard_filter_enabled); - - /*! - * \brief reads out the StallGuard threshold - * \return a number between -64 and 63. - */ - char getStallGuardThreshold(); - - /*! - * \brief returns the current setting of the StallGuard filter - * \return 0 if not set, -1 if set - */ - char getStallGuardFilter(); - - /*! - * \brief This method configures the CoolStep smart energy operation. You must have a proper StallGuard configuration for the motor situation (current, voltage, speed) in rder to use this feature. - * \param lower_SG_threshold Sets the lower threshold for stallGuard2TM reading. Below this value, the motor current becomes increased. Allowed values are 0...480 - * \param SG_hysteresis Sets the distance between the lower and the upper threshold for stallGuard2TM reading. Above the upper threshold (which is lower_SG_threshold+SG_hysteresis+1) the motor current becomes decreased. Allowed values are 0...480 - * \param current_decrement_step_size Sets the current decrement steps. If the StallGuard value is above the threshold the current gets decremented by this step size. 0...32 - * \param current_increment_step_size Sets the current increment step. The current becomes incremented for each measured stallGuard2TM value below the lower threshold. 0...8 - * \param lower_current_limit Sets the lower motor current limit for coolStepTM operation by scaling the CS value. Values can be COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT - * The CoolStep smart energy operation automatically adjust the current sent into the motor according to the current load, - * read out by the StallGuard in order to provide the optimum torque with the minimal current consumption. - * You configure the CoolStep current regulator by defining upper and lower bounds of StallGuard readouts. If the readout is above the - * limit the current gets increased, below the limit the current gets decreased. - * You can specify the upper an lower threshold of the StallGuard readout in order to adjust the current. You can also set the number of - * StallGuard readings neccessary above or below the limit to get a more stable current adjustement. - * The current adjustement itself is configured by the number of steps the current gests in- or decreased and the absolut minimum current - * (1/2 or 1/4th otf the configured current). - * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT - */ - void setCoolStepConfiguration(uint16_t lower_SG_threshold, uint16_t SG_hysteresis, uint8_t current_decrement_step_size, - uint8_t current_increment_step_size, uint8_t lower_current_limit); - - /*! - * \brief enables or disables the CoolStep smart energy operation feature. It must be configured before enabling it. - * \param enabled true if CoolStep should be enabled, false if not. - * \sa setCoolStepConfiguration() - */ - void setCoolStepEnabled(boolean enabled); - - - /*! - * \brief check if the CoolStep feature is enabled - * \sa setCoolStepEnabled() - */ - boolean isCoolStepEnabled(); - - /*! - * \brief returns the lower StallGuard threshold for the CoolStep operation - * \sa setCoolStepConfiguration() - */ - uint16_t getCoolStepLowerSgThreshold(); - - /*! - * \brief returns the upper StallGuard threshold for the CoolStep operation - * \sa setCoolStepConfiguration() - */ - uint16_t getCoolStepUpperSgThreshold(); - - /*! - * \brief returns the number of StallGuard readings befor CoolStep adjusts the motor current. - * \sa setCoolStepConfiguration() - */ - uint8_t getCoolStepNumberOfSGReadings(); - - /*! - * \brief returns the increment steps for the current for the CoolStep operation - * \sa setCoolStepConfiguration() - */ - uint8_t getCoolStepCurrentIncrementSize(); - - /*! - * \brief returns the absolut minium current for the CoolStep operation - * \sa setCoolStepConfiguration() - * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT - */ - uint8_t getCoolStepLowerCurrentLimit(); - - /*! - * \brief Get the current microstep position for phase A - * \return The current microstep position for phase A 0…255 - * - * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. - */ - int16_t getMotorPosition(); - - /*! - * \brief Reads the current StallGuard value. - * \return The current StallGuard value, lesser values indicate higher load, 0 means stall detected. - * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. - * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. - */ - int16_t getCurrentStallGuardReading(); - - /*! - * \brief Reads the current current setting value as fraction of the maximum current - * Returns values between 0 and 31, representing 1/32 to 32/32 (=1) - * \sa setCoolStepConfiguration() - */ - uint8_t getCurrentCSReading(); - - - /*! - *\brief a convenience method to determine if the current scaling uses 0.31V or 0.165V as reference. - *\return false if 0.13V is the reference voltage, true if 0.165V is used. - */ - boolean isCurrentScalingHalfed(); - - /*! - * \brief Reads the current current setting value and recalculates the absolute current in mA (1A would be 1000). - * This method calculates the currently used current setting (either by setting or by CoolStep) and reconstructs - * the current in mA by usinge the VSENSE and resistor value. This method uses floating point math - so it - * may not be the fastest. - * \sa getCurrentCSReading(), getResistor(), isCurrentScalingHalfed(), getCurrent() - */ - uint16_t getCurrentCurrent(); - - /*! - * \brief checks if there is a StallGuard warning in the last status - * \return 0 if there was no warning, -1 if there was some warning. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - * - * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. - */ - boolean isStallGuardOverThreshold(); - - /*! - * \brief Return over temperature status of the last status readout - * return 0 is everything is OK, TMC26X_OVERTEMPERATURE_PREWARING if status is reached, TMC26X_OVERTEMPERATURE_SHUTDOWN is the chip is shutdown, -1 if the status is unknown. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - char getOverTemperature(); - - /*! - * \brief Is motor channel A shorted to ground detected in the last status readout. - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - - boolean isShortToGroundA(); - - /*! - * \brief Is motor channel B shorted to ground detected in the last status readout. - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - boolean isShortToGroundB(); - /*! - * \brief iIs motor channel A connected according to the last statu readout. - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - boolean isOpenLoadA(); - - /*! - * \brief iIs motor channel A connected according to the last statu readout. - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - boolean isOpenLoadB(); - - /*! - * \brief Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - boolean isStandStill(); - - /*! - * \brief checks if there is a StallGuard warning in the last status - * \return 0 if there was no warning, -1 if there was some warning. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - * - * \sa isStallGuardOverThreshold() - * TODO why? - * - * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. - */ - boolean isStallGuardReached(); - - /*! - *\brief enables or disables the motor driver bridges. If disabled the motor can run freely. If enabled not. - *\param enabled a boolean value true if the motor should be enabled, false otherwise. - */ - void setEnabled(boolean enabled); - - /*! - *\brief checks if the output bridges are enabled. If the bridges are not enabled the motor can run freely - *\return true if the bridges and by that the motor driver are enabled, false if not. - *\sa setEnabled() - */ - boolean isEnabled(); - - /*! - * \brief Manually read out the status register - * This function sends a byte to the motor driver in order to get the current readout. The parameter read_value - * seletcs which value will get returned. If the read_vlaue changes in respect to the previous readout this method - * automatically send two bytes to the motor: one to set the redout and one to get the actual readout. So this method - * may take time to send and read one or two bits - depending on the previous readout. - * \param read_value selects which value to read out (0..3). You can use the defines TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, or TMC_262_READOUT_CURRENT - * \sa TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, TMC_262_READOUT_CURRENT - */ - void readStatus(char read_value); - - /*! - * \brief Returns the current sense resistor value in milliohm. - * The default value of ,15 Ohm will return 150. - */ - int16_t getResistor(); - - /*! - * \brief Prints out all the information that can be found in the last status read out - it does not force a status readout. - * The result is printed via Serial - */ - void debugLastStatus(); - - /*! - * \brief library version - * \return the version number as int. - */ - int16_t version(); - - private: - uint16_t steps_left; // The steps the motor has to do to complete the movement - int16_t direction; // Direction of rotation - uint32_t step_delay; // Delay between steps, in ms, based on speed - int16_t number_of_steps; // Total number of steps this motor can take - uint16_t speed; // Store the current speed in order to change the speed after changing microstepping - uint16_t resistor; // Current sense resitor value in milliohm - - uint32_t last_step_time, // Timestamp (ms) of the last step - next_step_time; // Timestamp (ms) of the next step - - // Driver control register copies to easily set & modify the registers - uint32_t driver_control_register_value, - chopper_config_register, - cool_step_register_value, - stallguard2_current_register_value, - driver_configuration_register_value, - driver_status_result; // The driver status result - - // Helper routione to get the top 10 bit of the readout - inline int16_t getReadoutValue(); - - // The pins for the stepper driver - uint8_t cs_pin, step_pin, dir_pin; - - // Status values - boolean started; // If the stepper has been started yet - int16_t microsteps; // The current number of micro steps - char constant_off_time; // We need to remember this value in order to enable and disable the motor - uint8_t cool_step_lower_threshold; // we need to remember the threshold to enable and disable the CoolStep feature - boolean cool_step_enabled; // We need to remember this to configure the coolstep if it si enabled - - // SPI sender - inline void send262(uint32_t datagram); -}; diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp deleted file mode 100644 index bc8f76af09..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && defined(STM32F7) - -#include "../../../inc/MarlinConfig.h" - -// ------------------------ -// Local defines -// ------------------------ - -#define NUM_HARDWARE_TIMERS 2 - -//#define PRESCALER 1 - -// ------------------------ -// Private Variables -// ------------------------ - -tTimerConfig timerConfig[NUM_HARDWARE_TIMERS]; - -// ------------------------ -// Public functions -// ------------------------ - -bool timers_initialized[NUM_HARDWARE_TIMERS] = { false }; - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - - if (!timers_initialized[timer_num]) { - switch (timer_num) { - case STEP_TIMER_NUM: - //STEPPER TIMER TIM5 //use a 32bit timer - __HAL_RCC_TIM5_CLK_ENABLE(); - timerConfig[0].timerdef.Instance = TIM5; - timerConfig[0].timerdef.Init.Prescaler = (STEPPER_TIMER_PRESCALE); - timerConfig[0].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; - timerConfig[0].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - timerConfig[0].IRQ_Id = TIM5_IRQn; - timerConfig[0].callback = (uint32_t)TC5_Handler; - HAL_NVIC_SetPriority(timerConfig[0].IRQ_Id, 1, 0); - #if PIN_EXISTS(STEPPER_ENABLE) - OUT_WRITE(STEPPER_ENABLE_PIN, HIGH); - #endif - break; - case TEMP_TIMER_NUM: - //TEMP TIMER TIM7 // any available 16bit Timer (1 already used for PWM) - __HAL_RCC_TIM7_CLK_ENABLE(); - timerConfig[1].timerdef.Instance = TIM7; - timerConfig[1].timerdef.Init.Prescaler = (TEMP_TIMER_PRESCALE); - timerConfig[1].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; - timerConfig[1].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - timerConfig[1].IRQ_Id = TIM7_IRQn; - timerConfig[1].callback = (uint32_t)TC7_Handler; - HAL_NVIC_SetPriority(timerConfig[1].IRQ_Id, 2, 0); - break; - } - timers_initialized[timer_num] = true; - } - - timerConfig[timer_num].timerdef.Init.Period = (((HAL_TIMER_RATE) / timerConfig[timer_num].timerdef.Init.Prescaler) / frequency) - 1; - - if (HAL_TIM_Base_Init(&timerConfig[timer_num].timerdef) == HAL_OK) - HAL_TIM_Base_Start_IT(&timerConfig[timer_num].timerdef); -} - -//forward the interrupt -extern "C" { - void TIM5_IRQHandler() { ((void(*)())timerConfig[0].callback)(); } - void TIM7_IRQHandler() { ((void(*)())timerConfig[1].callback)(); } -} - -void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { - __HAL_TIM_SetAutoreload(&timerConfig[timer_num].timerdef, compare); -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - HAL_NVIC_EnableIRQ(timerConfig[timer_num].IRQ_Id); -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - HAL_NVIC_DisableIRQ(timerConfig[timer_num].IRQ_Id); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - return __HAL_TIM_GetAutoreload(&timerConfig[timer_num].timerdef); -} - -uint32_t HAL_timer_get_count(const uint8_t timer_num) { - return __HAL_TIM_GetCounter(&timerConfig[timer_num].timerdef); -} - -void HAL_timer_isr_prologue(const uint8_t timer_num) { - if (__HAL_TIM_GET_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE) == SET) { - __HAL_TIM_CLEAR_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE); - } -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - const uint32_t IRQ_Id = uint32_t(timerConfig[timer_num].IRQ_Id); - return NVIC->ISER[IRQ_Id >> 5] & _BV32(IRQ_Id & 0x1F); -} - -#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h deleted file mode 100644 index d2f78259d6..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? -#define HAL_TIMER_TYPE_MAX 0xFFFF - -#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency -#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz - -#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz -#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) -#define TEMP_ISR_ENABLED() HAL_timer_interrupt_enabled(TEMP_TIMER_NUM) - -// TODO change this - -extern void TC5_Handler(); -extern void TC7_Handler(); -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() void TC5_Handler() -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() void TC7_Handler() -#endif - -// ------------------------ -// Types -// ------------------------ - -typedef struct { - TIM_HandleTypeDef timerdef; - IRQn_Type IRQ_Id; - uint32_t callback; -} tTimerConfig; - -// ------------------------ -// Public Variables -// ------------------------ - -//extern const tTimerConfig timerConfig[]; - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare); -hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); -uint32_t HAL_timer_get_count(const uint8_t timer_num); -void HAL_timer_isr_prologue(const uint8_t timer_num); -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/STM32_F4_F7/Servo.cpp b/Marlin/src/HAL/STM32_F4_F7/Servo.cpp deleted file mode 100644 index 7185468f50..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/Servo.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "Servo.h" - -int8_t libServo::attach(const int pin) { - if (servoIndex >= MAX_SERVOS) return -1; - return super::attach(pin); -} - -int8_t libServo::attach(const int pin, const int min, const int max) { - return super::attach(pin, min, max); -} - -void libServo::move(const int value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - if (attach(0) >= 0) { - write(value); - safe_delay(servo_delay[servoIndex]); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } -} - -#endif // HAS_SERVOS -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/Servo.h b/Marlin/src/HAL/STM32_F4_F7/Servo.h deleted file mode 100644 index e42cc60840..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/Servo.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//#ifdef STM32F7 -// #include <../../libraries/Servo/src/Servo.h> -//#else - #include -//#endif - -// Inherit and expand on the official library -class libServo : public Servo { - public: - int8_t attach(const int pin); - int8_t attach(const int pin, const int min, const int max); - void move(const int value); - private: - typedef Servo super; - uint16_t min_ticks, max_ticks; - uint8_t servoIndex; // index into the channel data for this servo -}; diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp deleted file mode 100644 index e0726c7cd5..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp +++ /dev/null @@ -1,535 +0,0 @@ -/** - ****************************************************************************** - * @file eeprom_emul.cpp - * @author MCD Application Team - * @version V1.2.6 - * @date 04-November-2016 - * @brief This file provides all the EEPROM emulation firmware functions. - ****************************************************************************** - * @attention - * - * Copyright © 2016 STMicroelectronics International N.V. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted, provided that the following conditions are met: - * - * 1. Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific written permission. - * 4. This software, including modifications and/or derivative works of this - * software, must execute solely and exclusively on microcontroller or - * microprocessor devices manufactured by or for STMicroelectronics. - * 5. Redistribution and use of this software other than as permitted under - * this license is void and will automatically terminate your rights under - * this license. - * - * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY - * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT - * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/** @addtogroup EEPROM_Emulation - * @{ - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -/* Includes ------------------------------------------------------------------*/ -#include "eeprom_emul.h" - -/* Private variables ---------------------------------------------------------*/ - -/* Global variable used to store variable value in read sequence */ -uint16_t DataVar = 0; - -/* Virtual address defined by the user: 0xFFFF value is prohibited */ -uint16_t VirtAddVarTab[NB_OF_VAR]; - -/* Private function prototypes -----------------------------------------------*/ - -static HAL_StatusTypeDef EE_Format(); -static uint16_t EE_FindValidPage(uint8_t Operation); -static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data); -static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data); -static uint16_t EE_VerifyPageFullyErased(uint32_t Address); - - /** - * @brief Restore the pages to a known good state in case of page's status - * corruption after a power loss. - * @param None. - * @retval - Flash error code: on write Flash error - * - FLASH_COMPLETE: on success - */ - -/* Private functions ---------------------------------------------------------*/ - -uint16_t EE_Initialize() { - /* Get Page0 and Page1 status */ - uint16_t PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS), - PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); - - FLASH_EraseInitTypeDef pEraseInit; - pEraseInit.TypeErase = TYPEERASE_SECTORS; - pEraseInit.Sector = PAGE0_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - - HAL_StatusTypeDef FlashStatus; // = HAL_OK - - /* Check for invalid header states and repair if necessary */ - uint32_t SectorError; - switch (PageStatus0) { - case ERASED: - if (PageStatus1 == VALID_PAGE) { /* Page0 erased, Page1 valid */ - /* Erase Page0 */ - if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { - /* As the last operation, simply return the result */ - return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - } - } - else if (PageStatus1 == RECEIVE_DATA) { /* Page0 erased, Page1 receive */ - /* Erase Page0 */ - if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { - HAL_StatusTypeDef fStat = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (fStat != HAL_OK) return fStat; - } - /* Mark Page1 as valid */ - /* As the last operation, simply return the result */ - return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); - } - else { /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ - /* Erase both Page0 and Page1 and set Page0 as valid page */ - /* As the last operation, simply return the result */ - return EE_Format(); - } - break; - - case RECEIVE_DATA: - if (PageStatus1 == VALID_PAGE) { /* Page0 receive, Page1 valid */ - /* Transfer data from Page1 to Page0 */ - int16_t x = -1; - for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { - if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) - x = VarIdx; - if (VarIdx != x) { - /* Read the last variables' updates */ - uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); - /* In case variable corresponding to the virtual address was found */ - if (ReadStatus != 0x1) { - /* Transfer the variable to the Page0 */ - uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); - /* If program operation was failed, a Flash error code is returned */ - if (EepromStatus != HAL_OK) return EepromStatus; - } - } - } - /* Mark Page0 as valid */ - FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - pEraseInit.Sector = PAGE1_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - /* Erase Page1 */ - if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { - /* As the last operation, simply return the result */ - return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - } - } - else if (PageStatus1 == ERASED) { /* Page0 receive, Page1 erased */ - pEraseInit.Sector = PAGE1_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - /* Erase Page1 */ - if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { - HAL_StatusTypeDef fStat = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (fStat != HAL_OK) return fStat; - } - /* Mark Page0 as valid */ - /* As the last operation, simply return the result */ - return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); - } - else { /* Invalid state -> format eeprom */ - /* Erase both Page0 and Page1 and set Page0 as valid page */ - /* As the last operation, simply return the result */ - return EE_Format(); - } - break; - - case VALID_PAGE: - if (PageStatus1 == VALID_PAGE) { /* Invalid state -> format eeprom */ - /* Erase both Page0 and Page1 and set Page0 as valid page */ - FlashStatus = EE_Format(); - /* If erase/program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - } - else if (PageStatus1 == ERASED) { /* Page0 valid, Page1 erased */ - pEraseInit.Sector = PAGE1_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - /* Erase Page1 */ - if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { - FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - } - } - else { /* Page0 valid, Page1 receive */ - /* Transfer data from Page0 to Page1 */ - int16_t x = -1; - for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { - if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) - x = VarIdx; - - if (VarIdx != x) { - /* Read the last variables' updates */ - uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); - /* In case variable corresponding to the virtual address was found */ - if (ReadStatus != 0x1) { - /* Transfer the variable to the Page1 */ - uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); - /* If program operation was failed, a Flash error code is returned */ - if (EepromStatus != HAL_OK) return EepromStatus; - } - } - } - /* Mark Page1 as valid */ - FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - pEraseInit.Sector = PAGE0_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - /* Erase Page0 */ - if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { - /* As the last operation, simply return the result */ - return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - } - } - break; - - default: /* Any other state -> format eeprom */ - /* Erase both Page0 and Page1 and set Page0 as valid page */ - /* As the last operation, simply return the result */ - return EE_Format(); - } - - return HAL_OK; -} - -/** - * @brief Verify if specified page is fully erased. - * @param Address: page address - * This parameter can be one of the following values: - * @arg PAGE0_BASE_ADDRESS: Page0 base address - * @arg PAGE1_BASE_ADDRESS: Page1 base address - * @retval page fully erased status: - * - 0: if Page not erased - * - 1: if Page erased - */ -uint16_t EE_VerifyPageFullyErased(uint32_t Address) { - uint32_t ReadStatus = 1; - /* Check each active page address starting from end */ - while (Address <= PAGE0_END_ADDRESS) { - /* Get the current location content to be compared with virtual address */ - uint16_t AddressValue = (*(__IO uint16_t*)Address); - /* Compare the read address with the virtual address */ - if (AddressValue != ERASED) { - /* In case variable value is read, reset ReadStatus flag */ - ReadStatus = 0; - break; - } - /* Next address location */ - Address += 4; - } - /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */ - return ReadStatus; -} - -/** - * @brief Returns the last stored variable data, if found, which correspond to - * the passed virtual address - * @param VirtAddress: Variable virtual address - * @param Data: Global variable contains the read variable value - * @retval Success or error status: - * - 0: if variable was found - * - 1: if the variable was not found - * - NO_VALID_PAGE: if no valid page was found. - */ -uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) { - uint16_t ReadStatus = 1; - - /* Get active Page for read operation */ - uint16_t ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); - - /* Check if there is no valid page */ - if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; - - /* Get the valid Page start and end Addresses */ - uint32_t PageStartAddress = uint32_t(EEPROM_START_ADDRESS) + uint32_t(ValidPage * (PAGE_SIZE)), - Address = PageStartAddress + PAGE_SIZE - 2; - - /* Check each active page address starting from end */ - while (Address > PageStartAddress + 2) { - /* Get the current location content to be compared with virtual address */ - uint16_t AddressValue = (*(__IO uint16_t*)Address); - - /* Compare the read address with the virtual address */ - if (AddressValue == VirtAddress) { - /* Get content of Address-2 which is variable value */ - *Data = (*(__IO uint16_t*)(Address - 2)); - /* In case variable value is read, reset ReadStatus flag */ - ReadStatus = 0; - break; - } - else /* Next address location */ - Address -= 4; - } - /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ - return ReadStatus; -} - -/** - * @brief Writes/upadtes variable data in EEPROM. - * @param VirtAddress: Variable virtual address - * @param Data: 16 bit data to be written - * @retval Success or error status: - * - FLASH_COMPLETE: on success - * - PAGE_FULL: if valid page is full - * - NO_VALID_PAGE: if no valid page was found - * - Flash error code: on write Flash error - */ -uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) { - /* Write the variable virtual address and value in the EEPROM */ - uint16_t Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); - - /* In case the EEPROM active page is full */ - if (Status == PAGE_FULL) /* Perform Page transfer */ - Status = EE_PageTransfer(VirtAddress, Data); - - /* Return last operation status */ - return Status; -} - -/** - * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE - * @param None - * @retval Status of the last operation (Flash write or erase) done during - * EEPROM formatting - */ -static HAL_StatusTypeDef EE_Format() { - FLASH_EraseInitTypeDef pEraseInit; - pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; - pEraseInit.Sector = PAGE0_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - - HAL_StatusTypeDef FlashStatus; // = HAL_OK - - /* Erase Page0 */ - if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { - uint32_t SectorError; - FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - } - /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */ - FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - - pEraseInit.Sector = PAGE1_ID; - /* Erase Page1 */ - if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { - /* As the last operation, just return the result code */ - uint32_t SectorError; - return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - } - - return HAL_OK; -} - -/** - * @brief Find valid Page for write or read operation - * @param Operation: operation to achieve on the valid page. - * This parameter can be one of the following values: - * @arg READ_FROM_VALID_PAGE: read operation from valid page - * @arg WRITE_IN_VALID_PAGE: write operation from valid page - * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case - * of no valid page was found - */ -static uint16_t EE_FindValidPage(uint8_t Operation) { - /* Get Page0 and Page1 actual status */ - uint16_t PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS), - PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); - - /* Write or read operation */ - switch (Operation) { - case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */ - if (PageStatus1 == VALID_PAGE) { - /* Page0 receiving data */ - return (PageStatus0 == RECEIVE_DATA) ? PAGE0 : PAGE1; - } - else if (PageStatus0 == VALID_PAGE) { - /* Page1 receiving data */ - return (PageStatus1 == RECEIVE_DATA) ? PAGE1 : PAGE0; - } - else - return NO_VALID_PAGE; /* No valid Page */ - - case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */ - if (PageStatus0 == VALID_PAGE) - return PAGE0; /* Page0 valid */ - else if (PageStatus1 == VALID_PAGE) - return PAGE1; /* Page1 valid */ - else - return NO_VALID_PAGE; /* No valid Page */ - - default: - return PAGE0; /* Page0 valid */ - } -} - -/** - * @brief Verify if active page is full and Writes variable in EEPROM. - * @param VirtAddress: 16 bit virtual address of the variable - * @param Data: 16 bit data to be written as variable value - * @retval Success or error status: - * - FLASH_COMPLETE: on success - * - PAGE_FULL: if valid page is full - * - NO_VALID_PAGE: if no valid page was found - * - Flash error code: on write Flash error - */ -static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data) { - /* Get valid Page for write operation */ - uint16_t ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE); - - /* Check if there is no valid page */ - if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; - - /* Get the valid Page start and end Addresses */ - uint32_t Address = uint32_t(EEPROM_START_ADDRESS) + uint32_t(ValidPage * (PAGE_SIZE)), - PageEndAddress = Address + PAGE_SIZE - 1; - - /* Check each active page address starting from begining */ - while (Address < PageEndAddress) { - /* Verify if Address and Address+2 contents are 0xFFFFFFFF */ - if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF) { - /* Set variable data */ - HAL_StatusTypeDef FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - /* Set variable virtual address, return status */ - return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress); - } - else /* Next address location */ - Address += 4; - } - - /* Return PAGE_FULL in case the valid page is full */ - return PAGE_FULL; -} - -/** - * @brief Transfers last updated variables data from the full Page to - * an empty one. - * @param VirtAddress: 16 bit virtual address of the variable - * @param Data: 16 bit data to be written as variable value - * @retval Success or error status: - * - FLASH_COMPLETE: on success - * - PAGE_FULL: if valid page is full - * - NO_VALID_PAGE: if no valid page was found - * - Flash error code: on write Flash error - */ -static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) { - /* Get active Page for read operation */ - uint16_t ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); - uint32_t NewPageAddress = EEPROM_START_ADDRESS; - uint16_t OldPageId = 0; - - if (ValidPage == PAGE1) { /* Page1 valid */ - /* New page address where variable will be moved to */ - NewPageAddress = PAGE0_BASE_ADDRESS; - /* Old page ID where variable will be taken from */ - OldPageId = PAGE1_ID; - } - else if (ValidPage == PAGE0) { /* Page0 valid */ - /* New page address where variable will be moved to */ - NewPageAddress = PAGE1_BASE_ADDRESS; - /* Old page ID where variable will be taken from */ - OldPageId = PAGE0_ID; - } - else - return NO_VALID_PAGE; /* No valid Page */ - - /* Set the new Page status to RECEIVE_DATA status */ - HAL_StatusTypeDef FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - - /* Write the variable passed as parameter in the new active page */ - uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); - /* If program operation was failed, a Flash error code is returned */ - if (EepromStatus != HAL_OK) return EepromStatus; - - /* Transfer process: transfer variables from old to the new active page */ - for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { - if (VirtAddVarTab[VarIdx] != VirtAddress) { /* Check each variable except the one passed as parameter */ - /* Read the other last variable updates */ - uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); - /* In case variable corresponding to the virtual address was found */ - if (ReadStatus != 0x1) { - /* Transfer the variable to the new active page */ - EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); - /* If program operation was failed, a Flash error code is returned */ - if (EepromStatus != HAL_OK) return EepromStatus; - } - } - } - - FLASH_EraseInitTypeDef pEraseInit; - pEraseInit.TypeErase = TYPEERASE_SECTORS; - pEraseInit.Sector = OldPageId; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - - /* Erase the old Page: Set old Page status to ERASED status */ - uint32_t SectorError; - FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - - /* Set new Page status to VALID_PAGE status */ - /* As the last operation, just return the result code */ - return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE); -} - -#endif // FLASH_EEPROM_EMULATION -#endif // STM32GENERIC && (STM32F4 || STM32F7) - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h deleted file mode 100644 index 84c4c6e3d2..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h +++ /dev/null @@ -1,114 +0,0 @@ -/****************************************************************************** - * @file eeprom_emul.h - * @author MCD Application Team - * @version V1.2.6 - * @date 04-November-2016 - * @brief This file contains all the functions prototypes for the EEPROM - * emulation firmware library. - ****************************************************************************** - * @attention - * - * Copyright © 2016 STMicroelectronics International N.V. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted, provided that the following conditions are met: - * - * 1. Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific written permission. - * 4. This software, including modifications and/or derivative works of this - * software, must execute solely and exclusively on microcontroller or - * microprocessor devices manufactured by or for STMicroelectronics. - * 5. Redistribution and use of this software other than as permitted under - * this license is void and will automatically terminate your rights under - * this license. - * - * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY - * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT - * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ******************************************************************************/ -#pragma once - -// ------------------------ -// Includes -// ------------------------ - -#include "../../inc/MarlinConfig.h" - -/* Exported constants --------------------------------------------------------*/ -/* EEPROM emulation firmware error codes */ -#define EE_OK uint32_t(HAL_OK) -#define EE_ERROR uint32_t(HAL_ERROR) -#define EE_BUSY uint32_t(HAL_BUSY) -#define EE_TIMEOUT uint32_t(HAL_TIMEOUT) - -/* Define the size of the sectors to be used */ -#define PAGE_SIZE uint32_t(0x4000) /* Page size = 16KByte */ - -/* Device voltage range supposed to be [2.7V to 3.6V], the operation will - be done by word */ -#define VOLTAGE_RANGE uint8_t(VOLTAGE_RANGE_3) - -/* EEPROM start address in Flash */ -#ifdef STM32F7 - #define EEPROM_START_ADDRESS uint32_t(0x08100000) /* EEPROM emulation start address: - from sector2 : after 16KByte of used - Flash memory */ -#else - #define EEPROM_START_ADDRESS uint32_t(0x08078000) /* EEPROM emulation start address: - after 480KByte of used Flash memory */ -#endif - -/* Pages 0 and 1 base and end addresses */ -#define PAGE0_BASE_ADDRESS uint32_t(EEPROM_START_ADDRESS + 0x0000) -#define PAGE0_END_ADDRESS uint32_t(EEPROM_START_ADDRESS + PAGE_SIZE - 1) -#define PAGE0_ID FLASH_SECTOR_1 - -#define PAGE1_BASE_ADDRESS uint32_t(EEPROM_START_ADDRESS + 0x4000) -#define PAGE1_END_ADDRESS uint32_t(EEPROM_START_ADDRESS + 2 * (PAGE_SIZE) - 1) -#define PAGE1_ID FLASH_SECTOR_2 - -/* Used Flash pages for EEPROM emulation */ -#define PAGE0 uint16_t(0x0000) -#define PAGE1 uint16_t(0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/ - -/* No valid page define */ -#define NO_VALID_PAGE uint16_t(0x00AB) - -/* Page status definitions */ -#define ERASED uint16_t(0xFFFF) /* Page is empty */ -#define RECEIVE_DATA uint16_t(0xEEEE) /* Page is marked to receive data */ -#define VALID_PAGE uint16_t(0x0000) /* Page containing valid data */ - -/* Valid pages in read and write defines */ -#define READ_FROM_VALID_PAGE uint8_t(0x00) -#define WRITE_IN_VALID_PAGE uint8_t(0x01) - -/* Page full define */ -#define PAGE_FULL uint8_t(0x80) - -/* Variables' number */ -#define NB_OF_VAR uint16_t(4096) - -/* Exported functions ------------------------------------------------------- */ -uint16_t EE_Initialize(); -uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); -uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp deleted file mode 100644 index 8c5795b685..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" -#include "eeprom_emul.h" - -// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to -// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F4/7 - -#ifdef STM32F7 - #define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR -#else - //#define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR -#endif - -void ee_write_byte(uint8_t *pos, unsigned char value) { - HAL_FLASH_Unlock(); - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - - const unsigned eeprom_address = (unsigned)pos; - if (EE_WriteVariable(eeprom_address, uint16_t(value)) != EE_OK) - for (;;) HAL_Delay(1); // Spin forever until watchdog reset - - HAL_FLASH_Lock(); -} - -uint8_t ee_read_byte(uint8_t *pos) { - uint16_t data = 0xFF; - const unsigned eeprom_address = (unsigned)pos; - (void)EE_ReadVariable(eeprom_address, &data); // Data unchanged on error - return uint8_t(data); -} - -#ifndef MARLIN_EEPROM_SIZE - #error "MARLIN_EEPROM_SIZE is required for Flash-based EEPROM." -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::access_start() { - static bool ee_initialized = false; - if (!ee_initialized) { - HAL_FLASH_Unlock(); - - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - - /* EEPROM Init */ - if (EE_Initialize() != EE_OK) - for (;;) HAL_Delay(1); // Spin forever until watchdog reset - - HAL_FLASH_Lock(); - ee_initialized = true; - } - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != ee_read_byte(p)) { - ee_write_byte(p, v); - if (ee_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = ee_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // FLASH_EEPROM_EMULATION -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp deleted file mode 100644 index 2bf386bec5..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -/** - * PersistentStore for Arduino-style EEPROM interface - * with simple implementations supplied by Marlin. - */ - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { eeprom_init(); return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h b/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h deleted file mode 100644 index fdff8cc644..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/STM32_F4_F7/fastio.h b/Marlin/src/HAL/STM32_F4_F7/fastio.h deleted file mode 100644 index f42be58354..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/fastio.h +++ /dev/null @@ -1,310 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O interfaces for STM32F4/7 - * These use GPIO functions instead of Direct Port Manipulation, as on AVR. - */ - -#ifndef PWM - #define PWM OUTPUT -#endif - -#define READ(IO) digitalRead(IO) -#define WRITE(IO,V) digitalWrite(IO,V) - -#define _GET_MODE(IO) -#define _SET_MODE(IO,M) pinMode(IO, M) -#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ - -#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ -#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ -#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ -#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) -#define SET_PWM(IO) _SET_MODE(IO, PWM) - -#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) - -#define IS_INPUT(IO) -#define IS_OUTPUT(IO) - -#define PWM_PIN(P) true - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) - -// -// Pins Definitions -// -#define PORTA 0 -#define PORTB 1 -#define PORTC 2 -#define PORTD 3 -#define PORTE 4 -#define PORTF 5 -#define PORTG 6 - -#define _STM32_PIN(P,PN) ((PORT##P * 16) + PN) - -#undef PA0 -#define PA0 _STM32_PIN(A, 0) -#undef PA1 -#define PA1 _STM32_PIN(A, 1) -#undef PA2 -#define PA2 _STM32_PIN(A, 2) -#undef PA3 -#define PA3 _STM32_PIN(A, 3) -#undef PA4 -#define PA4 _STM32_PIN(A, 4) -#undef PA5 -#define PA5 _STM32_PIN(A, 5) -#undef PA6 -#define PA6 _STM32_PIN(A, 6) -#undef PA7 -#define PA7 _STM32_PIN(A, 7) -#undef PA8 -#define PA8 _STM32_PIN(A, 8) -#undef PA9 -#define PA9 _STM32_PIN(A, 9) -#undef PA10 -#define PA10 _STM32_PIN(A, 10) -#undef PA11 -#define PA11 _STM32_PIN(A, 11) -#undef PA12 -#define PA12 _STM32_PIN(A, 12) -#undef PA13 -#define PA13 _STM32_PIN(A, 13) -#undef PA14 -#define PA14 _STM32_PIN(A, 14) -#undef PA15 -#define PA15 _STM32_PIN(A, 15) - -#undef PB0 -#define PB0 _STM32_PIN(B, 0) -#undef PB1 -#define PB1 _STM32_PIN(B, 1) -#undef PB2 -#define PB2 _STM32_PIN(B, 2) -#undef PB3 -#define PB3 _STM32_PIN(B, 3) -#undef PB4 -#define PB4 _STM32_PIN(B, 4) -#undef PB5 -#define PB5 _STM32_PIN(B, 5) -#undef PB6 -#define PB6 _STM32_PIN(B, 6) -#undef PB7 -#define PB7 _STM32_PIN(B, 7) -#undef PB8 -#define PB8 _STM32_PIN(B, 8) -#undef PB9 -#define PB9 _STM32_PIN(B, 9) -#undef PB10 -#define PB10 _STM32_PIN(B, 10) -#undef PB11 -#define PB11 _STM32_PIN(B, 11) -#undef PB12 -#define PB12 _STM32_PIN(B, 12) -#undef PB13 -#define PB13 _STM32_PIN(B, 13) -#undef PB14 -#define PB14 _STM32_PIN(B, 14) -#undef PB15 -#define PB15 _STM32_PIN(B, 15) - -#undef PC0 -#define PC0 _STM32_PIN(C, 0) -#undef PC1 -#define PC1 _STM32_PIN(C, 1) -#undef PC2 -#define PC2 _STM32_PIN(C, 2) -#undef PC3 -#define PC3 _STM32_PIN(C, 3) -#undef PC4 -#define PC4 _STM32_PIN(C, 4) -#undef PC5 -#define PC5 _STM32_PIN(C, 5) -#undef PC6 -#define PC6 _STM32_PIN(C, 6) -#undef PC7 -#define PC7 _STM32_PIN(C, 7) -#undef PC8 -#define PC8 _STM32_PIN(C, 8) -#undef PC9 -#define PC9 _STM32_PIN(C, 9) -#undef PC10 -#define PC10 _STM32_PIN(C, 10) -#undef PC11 -#define PC11 _STM32_PIN(C, 11) -#undef PC12 -#define PC12 _STM32_PIN(C, 12) -#undef PC13 -#define PC13 _STM32_PIN(C, 13) -#undef PC14 -#define PC14 _STM32_PIN(C, 14) -#undef PC15 -#define PC15 _STM32_PIN(C, 15) - -#undef PD0 -#define PD0 _STM32_PIN(D, 0) -#undef PD1 -#define PD1 _STM32_PIN(D, 1) -#undef PD2 -#define PD2 _STM32_PIN(D, 2) -#undef PD3 -#define PD3 _STM32_PIN(D, 3) -#undef PD4 -#define PD4 _STM32_PIN(D, 4) -#undef PD5 -#define PD5 _STM32_PIN(D, 5) -#undef PD6 -#define PD6 _STM32_PIN(D, 6) -#undef PD7 -#define PD7 _STM32_PIN(D, 7) -#undef PD8 -#define PD8 _STM32_PIN(D, 8) -#undef PD9 -#define PD9 _STM32_PIN(D, 9) -#undef PD10 -#define PD10 _STM32_PIN(D, 10) -#undef PD11 -#define PD11 _STM32_PIN(D, 11) -#undef PD12 -#define PD12 _STM32_PIN(D, 12) -#undef PD13 -#define PD13 _STM32_PIN(D, 13) -#undef PD14 -#define PD14 _STM32_PIN(D, 14) -#undef PD15 -#define PD15 _STM32_PIN(D, 15) - -#undef PE0 -#define PE0 _STM32_PIN(E, 0) -#undef PE1 -#define PE1 _STM32_PIN(E, 1) -#undef PE2 -#define PE2 _STM32_PIN(E, 2) -#undef PE3 -#define PE3 _STM32_PIN(E, 3) -#undef PE4 -#define PE4 _STM32_PIN(E, 4) -#undef PE5 -#define PE5 _STM32_PIN(E, 5) -#undef PE6 -#define PE6 _STM32_PIN(E, 6) -#undef PE7 -#define PE7 _STM32_PIN(E, 7) -#undef PE8 -#define PE8 _STM32_PIN(E, 8) -#undef PE9 -#define PE9 _STM32_PIN(E, 9) -#undef PE10 -#define PE10 _STM32_PIN(E, 10) -#undef PE11 -#define PE11 _STM32_PIN(E, 11) -#undef PE12 -#define PE12 _STM32_PIN(E, 12) -#undef PE13 -#define PE13 _STM32_PIN(E, 13) -#undef PE14 -#define PE14 _STM32_PIN(E, 14) -#undef PE15 -#define PE15 _STM32_PIN(E, 15) - -#ifdef STM32F7 - - #undef PORTF - #define PORTF 5 - #undef PF0 - #define PF0 _STM32_PIN(F, 0) - #undef PF1 - #define PF1 _STM32_PIN(F, 1) - #undef PF2 - #define PF2 _STM32_PIN(F, 2) - #undef PF3 - #define PF3 _STM32_PIN(F, 3) - #undef PF4 - #define PF4 _STM32_PIN(F, 4) - #undef PF5 - #define PF5 _STM32_PIN(F, 5) - #undef PF6 - #define PF6 _STM32_PIN(F, 6) - #undef PF7 - #define PF7 _STM32_PIN(F, 7) - #undef PF8 - #define PF8 _STM32_PIN(F, 8) - #undef PF9 - #define PF9 _STM32_PIN(F, 9) - #undef PF10 - #define PF10 _STM32_PIN(F, 10) - #undef PF11 - #define PF11 _STM32_PIN(F, 11) - #undef PF12 - #define PF12 _STM32_PIN(F, 12) - #undef PF13 - #define PF13 _STM32_PIN(F, 13) - #undef PF14 - #define PF14 _STM32_PIN(F, 14) - #undef PF15 - #define PF15 _STM32_PIN(F, 15) - - #undef PORTG - #define PORTG 6 - #undef PG0 - #define PG0 _STM32_PIN(G, 0) - #undef PG1 - #define PG1 _STM32_PIN(G, 1) - #undef PG2 - #define PG2 _STM32_PIN(G, 2) - #undef PG3 - #define PG3 _STM32_PIN(G, 3) - #undef PG4 - #define PG4 _STM32_PIN(G, 4) - #undef PG5 - #define PG5 _STM32_PIN(G, 5) - #undef PG6 - #define PG6 _STM32_PIN(G, 6) - #undef PG7 - #define PG7 _STM32_PIN(G, 7) - #undef PG8 - #define PG8 _STM32_PIN(G, 8) - #undef PG9 - #define PG9 _STM32_PIN(G, 9) - #undef PG10 - #define PG10 _STM32_PIN(G, 10) - #undef PG11 - #define PG11 _STM32_PIN(G, 11) - #undef PG12 - #define PG12 _STM32_PIN(G, 12) - #undef PG13 - #define PG13 _STM32_PIN(G, 13) - #undef PG14 - #define PG14 _STM32_PIN(G, 14) - #undef PG15 - #define PG15 _STM32_PIN(G, 15) - -#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h deleted file mode 100644 index a9f1b58222..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/STM32F4_F7." -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h deleted file mode 100644 index b5d808e21a..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if ENABLED(EEPROM_SETTINGS) && defined(STM32F7) - #undef USE_WIRED_EEPROM - #undef SRAM_EEPROM_EMULATION - #undef SDCARD_EEPROM_EMULATION - #define FLASH_EEPROM_EMULATION -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h deleted file mode 100644 index 9bb36f3bbb..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test STM32F4/7-specific configuration values for errors at compile-time. - */ -//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) -// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" -//#endif - -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for STM32F4/7. Disable EMERGENCY_PARSER to continue." -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F4/F7." -#endif - -#if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h b/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h deleted file mode 100644 index 973abb1b01..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) - #include "../STM32/pinsDebug_STM32duino.h" -#elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) - #include "../STM32/pinsDebug_STM32GENERIC.h" -#else - #error "M43 Pins Debugging not supported for this board." -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/spi_pins.h b/Marlin/src/HAL/STM32_F4_F7/spi_pins.h deleted file mode 100644 index 75a6a2b250..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/spi_pins.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Define SPI Pins: SCK, MISO, MOSI, SS - */ -#ifndef SCK_PIN - #define SCK_PIN PA5 -#endif -#ifndef MISO_PIN - #define MISO_PIN PA6 -#endif -#ifndef MOSI_PIN - #define MOSI_PIN PA7 -#endif -#ifndef SS_PIN - #define SS_PIN PA8 -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/timers.h b/Marlin/src/HAL/STM32_F4_F7/timers.h deleted file mode 100644 index 4e8c81783e..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/timers.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef STM32F4 - #include "STM32F4/timers.h" -#else - #include "STM32F7/timers.h" -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp b/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp deleted file mode 100644 index c0afd0cd58..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include "watchdog.h" - -#define WDT_TIMEOUT_COUNT TERN(WATCHDOG_DURATION_8S, 8192, 4096) // 4 or 8 second timeout - -IWDG_HandleTypeDef hiwdg; - -void watchdog_init() { - hiwdg.Instance = IWDG; - hiwdg.Init.Prescaler = IWDG_PRESCALER_32; // 32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock - hiwdg.Init.Reload = WDT_TIMEOUT_COUNT - 1; - if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { - //Error_Handler(); - } - else { - #if PIN_EXISTS(LED) && DISABLED(PINS_DEBUGGING) - TOGGLE(LED_PIN); // heartbeat indicator - #endif - } -} - -void HAL_watchdog_refresh() { - /* Refresh IWDG: reload counter */ - if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { - /* Refresh Error */ - //Error_Handler(); - } -} - -#endif // USE_WATCHDOG -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.h b/Marlin/src/HAL/STM32_F4_F7/watchdog.h deleted file mode 100644 index 3dbc2d08c1..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/watchdog.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -extern IWDG_HandleTypeDef hiwdg; - -void watchdog_init(); -void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h index ef17d19170..e0617bdf7f 100644 --- a/Marlin/src/HAL/platforms.h +++ b/Marlin/src/HAL/platforms.h @@ -37,8 +37,6 @@ #define HAL_PATH(PATH, NAME) XSTR(PATH/LPC1768/NAME) #elif defined(__STM32F1__) || defined(TARGET_STM32F1) #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32F1/NAME) -#elif defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32_F4_F7/NAME) #elif defined(ARDUINO_ARCH_STM32) #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32/NAME) #elif defined(ARDUINO_ARCH_ESP32) diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index e749530645..5ca46f9886 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -74,17 +74,6 @@ #define START_FLASH_ADDR 0x08000000 #define END_FLASH_ADDR 0x08080000 -#elif MB(THE_BORG) - - // For STM32F765 in BORG - // SRAM (0x20000000 - 0x20080000) (512kb) - // FLASH (0x08000000 - 0x08100000) (1024kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20080000 - #define START_FLASH_ADDR 0x08000000 - #define END_FLASH_ADDR 0x08100000 - #elif MB(REMRAM_V1, NUCLEO_F767ZI) // For STM32F765VI in RemRam v1 diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h index 6d850da851..c2560a8538 100644 --- a/Marlin/src/HAL/shared/servo.h +++ b/Marlin/src/HAL/shared/servo.h @@ -76,8 +76,6 @@ #include "../LPC1768/Servo.h" #elif defined(__STM32F1__) || defined(TARGET_STM32F1) #include "../STM32F1/Servo.h" -#elif defined(STM32GENERIC) && defined(STM32F4) - #include "../STM32_F4_F7/Servo.h" #elif defined(ARDUINO_ARCH_STM32) #include "../STM32/Servo.h" #elif defined(ARDUINO_ARCH_ESP32) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index e68ba196ee..1d1f3972d9 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -329,6 +329,7 @@ #define BOARD_TRIGORILLA_PRO 4037 // Trigorilla Pro (STM32F103ZET6) #define BOARD_FLY_MINI 4038 // FLY MINI (STM32F103RCT6) #define BOARD_FLSUN_HISPEED 4039 // FLSUN HiSpeedV1 (STM32F103VET6) +#define BOARD_BEAST 4040 // STM32F103RET6 Libmaple-based controller // // ARM Cortex-M4F @@ -341,37 +342,34 @@ // STM32 ARM Cortex-M4F // -#define BOARD_BEAST 4200 // STM32F4xxVxT6 Libmaple-based STM32F4 controller -#define BOARD_GENERIC_STM32F4 4201 // STM32 STM32GENERIC-based STM32F4 controller -#define BOARD_ARMED 4202 // Arm'ed STM32F4-based controller -#define BOARD_RUMBA32_V1_0 4203 // RUMBA32 STM32F446VET6 based controller from Aus3D -#define BOARD_RUMBA32_V1_1 4204 // RUMBA32 STM32F446VET6 based controller from Aus3D -#define BOARD_RUMBA32_MKS 4205 // RUMBA32 STM32F446VET6 based controller from Makerbase -#define BOARD_BLACK_STM32F407VE 4206 // BLACK_STM32F407VE -#define BOARD_BLACK_STM32F407ZE 4207 // BLACK_STM32F407ZE -#define BOARD_STEVAL_3DP001V1 4208 // STEVAL-3DP001V1 3D PRINTER BOARD -#define BOARD_BTT_SKR_PRO_V1_1 4209 // BigTreeTech SKR Pro v1.1 (STM32F407ZG) -#define BOARD_BTT_SKR_PRO_V1_2 4210 // BigTreeTech SKR Pro v1.2 (STM32F407ZG) -#define BOARD_BTT_BTT002_V1_0 4211 // BigTreeTech BTT002 v1.0 (STM32F407VG) -#define BOARD_BTT_GTR_V1_0 4212 // BigTreeTech GTR v1.0 (STM32F407IGT) -#define BOARD_LERDGE_K 4213 // Lerdge K (STM32F407ZG) -#define BOARD_LERDGE_S 4214 // Lerdge S (STM32F407VE) -#define BOARD_LERDGE_X 4215 // Lerdge X (STM32F407VE) -#define BOARD_VAKE403D 4216 // VAkE 403D (STM32F446VET6) -#define BOARD_FYSETC_S6 4217 // FYSETC S6 board -#define BOARD_FYSETC_S6_V2_0 4218 // FYSETC S6 v2.0 board -#define BOARD_FLYF407ZG 4219 // FLYF407ZG board (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4220 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_ARMED 4200 // Arm'ed STM32F4-based controller +#define BOARD_RUMBA32_V1_0 4201 // RUMBA32 STM32F446VET6 based controller from Aus3D +#define BOARD_RUMBA32_V1_1 4202 // RUMBA32 STM32F446VET6 based controller from Aus3D +#define BOARD_RUMBA32_MKS 4203 // RUMBA32 STM32F446VET6 based controller from Makerbase +#define BOARD_BLACK_STM32F407VE 4204 // BLACK_STM32F407VE +#define BOARD_BLACK_STM32F407ZE 4205 // BLACK_STM32F407ZE +#define BOARD_STEVAL_3DP001V1 4206 // STEVAL-3DP001V1 3D PRINTER BOARD +#define BOARD_BTT_SKR_PRO_V1_1 4207 // BigTreeTech SKR Pro v1.1 (STM32F407ZG) +#define BOARD_BTT_SKR_PRO_V1_2 4208 // BigTreeTech SKR Pro v1.2 (STM32F407ZG) +#define BOARD_BTT_BTT002_V1_0 4209 // BigTreeTech BTT002 v1.0 (STM32F407VG) +#define BOARD_BTT_GTR_V1_0 4210 // BigTreeTech GTR v1.0 (STM32F407IGT) +#define BOARD_LERDGE_K 4211 // Lerdge K (STM32F407ZG) +#define BOARD_LERDGE_S 4212 // Lerdge S (STM32F407VE) +#define BOARD_LERDGE_X 4213 // Lerdge X (STM32F407VE) +#define BOARD_VAKE403D 4214 // VAkE 403D (STM32F446VET6) +#define BOARD_FYSETC_S6 4215 // FYSETC S6 board +#define BOARD_FYSETC_S6_V2_0 4216 // FYSETC S6 v2.0 board +#define BOARD_FLYF407ZG 4217 // FLYF407ZG board (STM32F407ZG) +#define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE) // // ARM Cortex M7 // -#define BOARD_THE_BORG 5000 // THE-BORG (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_REMRAM_V1 5001 // RemRam v1 -#define BOARD_TEENSY41 5002 // Teensy 4.1 -#define BOARD_T41U5XBB 5003 // T41U5XBB Teensy 4.1 breakout board -#define BOARD_NUCLEO_F767ZI 5004 // ST NUCLEO-F767ZI Dev Board +#define BOARD_REMRAM_V1 5000 // RemRam v1 +#define BOARD_TEENSY41 5001 // Teensy 4.1 +#define BOARD_T41U5XBB 5002 // T41U5XBB Teensy 4.1 breakout board +#define BOARD_NUCLEO_F767ZI 5003 // ST NUCLEO-F767ZI Dev Board // // Espressif ESP32 WiFi diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 7985706173..2e38fad30e 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -61,11 +61,7 @@ #define _O3 __attribute__((optimize("O3"))) #ifndef UNUSED - #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - #define UNUSED(X) (void)X - #else - #define UNUSED(x) ((void)(x)) - #endif + #define UNUSED(x) ((void)(x)) #endif // Clock speed factors diff --git a/Marlin/src/module/stepper/TMC26X.h b/Marlin/src/module/stepper/TMC26X.h index 8977266b47..547eb6521f 100644 --- a/Marlin/src/module/stepper/TMC26X.h +++ b/Marlin/src/module/stepper/TMC26X.h @@ -31,11 +31,7 @@ // TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI #include -#if defined(STM32GENERIC) && defined(STM32F7) - #include "../../HAL/STM32_F4_F7/STM32F7/TMC2660.h" -#else - #include -#endif +#include void tmc26x_init_to_defaults(); diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index af3b724756..1660d16dd2 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -594,6 +594,8 @@ #include "stm32f1/pins_FLY_MINI.h" // STM32F1 env:FLY_MINI #elif MB(FLSUN_HISPEED) #include "stm32f1/pins_FLSUN_HISPEED.h" // STM32F1 env:flsun_hispeed +#elif MB(BEAST) + #include "stm32f1/pins_BEAST.h" // STM32F1 env:STM32F103RE // // ARM Cortex-M4F @@ -608,10 +610,6 @@ // STM32 ARM Cortex-M4F // -#elif MB(BEAST) - #include "stm32f4/pins_BEAST.h" // STM32F4 env:STM32F4 -#elif MB(GENERIC_STM32F4) - #include "stm32f4/pins_GENERIC_STM32F4.h" // STM32F4 env:STM32F4 #elif MB(ARMED) #include "stm32f4/pins_ARMED.h" // STM32F4 env:ARMED #elif MB(RUMBA32_V1_0) @@ -633,13 +631,13 @@ #elif MB(BTT_BTT002_V1_0) #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 #elif MB(LERDGE_K) - #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:STM32F4 + #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:LERDGEK #elif MB(LERDGE_S) - #include "stm32f4/pins_LERDGE_S.h" // STM32F4 env:LERDGE_S + #include "stm32f4/pins_LERDGE_S.h" // STM32F4 env:LERDGES #elif MB(LERDGE_X) - #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGE_X + #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGEX #elif MB(VAKE403D) - #include "stm32f4/pins_VAKE403D.h" // STM32F4 env:STM32F4 + #include "stm32f4/pins_VAKE403D.h" // STM32F4 #elif MB(FYSETC_S6) #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 #elif MB(FLYF407ZG) @@ -653,10 +651,8 @@ // ARM Cortex M7 // -#elif MB(THE_BORG) - #include "stm32f7/pins_THE_BORG.h" // STM32F7 env:STM32F7 #elif MB(REMRAM_V1) - #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:STM32F7 + #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:REMRAM_V1 #elif MB(NUCLEO_F767ZI) #include "stm32f7/pins_NUCLEO_F767ZI.h" // STM32F7 env:NUCLEO_F767ZI #elif MB(TEENSY41) diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f1/pins_BEAST.h similarity index 98% rename from Marlin/src/pins/stm32f4/pins_BEAST.h rename to Marlin/src/pins/stm32f1/pins_BEAST.h index 279d0b9ec7..ccb8a31ab7 100644 --- a/Marlin/src/pins/stm32f4/pins_BEAST.h +++ b/Marlin/src/pins/stm32f1/pins_BEAST.h @@ -21,8 +21,8 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif /** diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h deleted file mode 100644 index 4acfd743b7..0000000000 --- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * To build with Arduino IDE use "Discovery F407VG" - * To build with PlatformIO use environment "STM32F4" - */ -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "STM32F4 supports up to 2 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "Misc. STM32F4" -#define DEFAULT_MACHINE_NAME "STM32F407VET6" - -//#define I2C_EEPROM - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Limit Switches -// -#define X_MIN_PIN PE0 -#define X_MAX_PIN -1 -#define Y_MIN_PIN PE1 -#define Y_MAX_PIN -1 -#define Z_MIN_PIN PE14 -#define Z_MAX_PIN -1 - -// -// Z Probe (when not Z_MIN_PIN) -// - -//#ifndef Z_MIN_PROBE_PIN -// #define Z_MIN_PROBE_PIN PA4 -//#endif - -// -// Steppers -// - -#define X_STEP_PIN PD3 -#define X_DIR_PIN PD2 -#define X_ENABLE_PIN PD0 -//#ifndef X_CS_PIN -// #define X_CS_PIN PD1 -//#endif - -#define Y_STEP_PIN PE11 -#define Y_DIR_PIN PE10 -#define Y_ENABLE_PIN PE13 -//#ifndef Y_CS_PIN -// #define Y_CS_PIN PE12 -//#endif - -#define Z_STEP_PIN PD6 -#define Z_DIR_PIN PD7 -#define Z_ENABLE_PIN PD4 -//#ifndef Z_CS_PIN -// #define Z_CS_PIN PD5 -//#endif - -#define E0_STEP_PIN PB5 -#define E0_DIR_PIN PB6 -#define E0_ENABLE_PIN PB3 -//#ifndef E0_CS_PIN -// #define E0_CS_PIN PB4 -//#endif - -#define E1_STEP_PIN PE4 -#define E1_DIR_PIN PE2 -#define E1_ENABLE_PIN PE3 -//#ifndef E1_CS_PIN -// #define E1_CS_PIN PE5 -//#endif - -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 - -// -// Temperature Sensors -// - -#define TEMP_0_PIN PC0 // Analog Input -#define TEMP_1_PIN PC1 // Analog Input -#define TEMP_BED_PIN PC2 // Analog Input - -// -// Heaters / Fans -// - -#define HEATER_0_PIN PA1 -#define HEATER_1_PIN PA2 -#define HEATER_BED_PIN PA0 - -#ifndef FAN_PIN - #define FAN_PIN PC6 -#endif -#define FAN1_PIN PC7 -#define FAN2_PIN PC8 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PC7 -#endif - -// -// Misc. Functions -// - -//#define CASE_LIGHT_PIN_CI PF13 -//#define CASE_LIGHT_PIN_DO PF14 -//#define NEOPIXEL_PIN PF13 - -// -// Průša i3 MK2 Multi Material Multiplexer Support -// - -//#define E_MUX0_PIN PG3 -//#define E_MUX1_PIN PG4 - -// -// Servos -// - -//#define SERVO0_PIN PE13 -//#define SERVO1_PIN PE14 - -#define SDSS PE7 -#define SS_PIN PE7 -#define LED_PIN PB7 //Alive -#define PS_ON_PIN PA10 -#define KILL_PIN PA8 -#define PWR_LOSS PA4 //Power loss / nAC_FAULT - -// -// LCD / Controller -// - -#define SD_DETECT_PIN PA15 -#define BEEPER_PIN PC9 -#define LCD_PINS_RS PE9 -#define LCD_PINS_ENABLE PE8 -#define LCD_PINS_D4 PB12 -#define LCD_PINS_D5 PB13 -#define LCD_PINS_D6 PB14 -#define LCD_PINS_D7 PB15 -#define BTN_EN1 PC4 -#define BTN_EN2 PC5 -#define BTN_ENC PC3 - -// -// Filament runout -// - -#define FIL_RUNOUT_PIN PA3 - -// -// ST7920 Delays -// -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) - #endif -#endif diff --git a/Marlin/src/pins/stm32f7/pins_THE_BORG.h b/Marlin/src/pins/stm32f7/pins_THE_BORG.h deleted file mode 100644 index c050824a83..0000000000 --- a/Marlin/src/pins/stm32f7/pins_THE_BORG.h +++ /dev/null @@ -1,183 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F7) - #error "Oops! Select an STM32F7 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 - #error "The-Borg supports up to 3 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "The-Borge" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 -#endif - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Limit Switches -// -#define X_MIN_PIN PE9 -#define X_MAX_PIN PE10 -#define Y_MIN_PIN PE7 -#define Y_MAX_PIN PE8 -#define Z_MIN_PIN PF15 -#define Z_MAX_PIN PG0 -#define E_MIN_PIN PE2 -#define E_MAX_PIN PE3 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PA4 -#endif - -// -// Steppers -// -#define STEPPER_ENABLE_PIN PE0 - -#define X_STEP_PIN PC6 // 96, 39 in Arduino -#define X_DIR_PIN PC7 -#define X_ENABLE_PIN PC8 - -#define Y_STEP_PIN PD9 -#define Y_DIR_PIN PD10 -#define Y_ENABLE_PIN PD11 - -#define Z_STEP_PIN PE15 -#define Z_DIR_PIN PG1 -#define Z_ENABLE_PIN PD8 - -#define E0_STEP_PIN PB1 -#define E0_DIR_PIN PB2 -#define E0_ENABLE_PIN PE11 - -#define E1_STEP_PIN PC4 -#define E1_DIR_PIN PC5 -#define E1_ENABLE_PIN PB0 - -#define E2_STEP_PIN PC13 -#define E2_DIR_PIN PC14 -#define E2_ENABLE_PIN PC15 - -#define Z2_STEP_PIN PC13 -#define Z2_DIR_PIN PC14 -#define Z2_ENABLE_PIN PC15 - -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 - -#define SPI1_SCK_PIN PA5 -#define SPI1_MISO_PIN PA6 -#define SPI1_MOSI_PIN PA7 - -#define SPI6_SCK_PIN PG13 -#define SPI6_MISO_PIN PG12 -#define SPI6_MOSI_PIN PG14 - -// -// Temperature Sensors -// - -#define TEMP_0_PIN PC3 // Analog Input -#define TEMP_1_PIN PC2 // Analog Input -#define TEMP_2_PIN PC1 // Analog Input -#define TEMP_3_PIN PC0 // Analog Input - -#define TEMP_BED_PIN PF10 // Analog Input - -#define TEMP_5_PIN PE12 // Analog Input, Probe temp - -// -// Heaters / Fans -// -#define HEATER_0_PIN PD15 -#define HEATER_1_PIN PD14 -#define HEATER_BED_PIN PF6 - -#ifndef FAN_PIN - #define FAN_PIN PD13 -#endif -#define FAN1_PIN PA0 -#define FAN2_PIN PA1 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PA1 -#endif - -// -// Misc. Functions -// - -//#define CASE_LIGHT_PIN_CI PF13 -//#define CASE_LIGHT_PIN_DO PF14 -//#define NEOPIXEL_PIN PF13 - -// -// Průša i3 MK2 Multi Material Multiplexer Support -// - -#define E_MUX0_PIN PG3 -#define E_MUX1_PIN PG4 - -// -// Servos -// - -#define SERVO0_PIN PE13 -#define SERVO1_PIN PE14 - -#define SDSS PA8 -#define SS_PIN PA8 -#define LED_PIN PA2 // Alive -#define PS_ON_PIN PA3 -#define KILL_PIN -1 //PD5 // EXP2-10 -#define PWR_LOSS PG5 // Power loss / nAC_FAULT - -// -// MAX7219_DEBUG -// -#define MAX7219_CLK_PIN PG10 // EXP1-1 -#define MAX7219_DIN_PIN PD7 // EXP1-3 -#define MAX7219_LOAD_PIN PD1 // EXP1-5 - -// -// LCD / Controller -// -//#define SD_DETECT_PIN -1 //PB6) // EXP2-4 -#define BEEPER_PIN PG10 // EXP1-1 -#define LCD_PINS_RS PG9 // EXP1-4 -#define LCD_PINS_ENABLE PD7 // EXP1-3 -#define LCD_PINS_D4 PD1 // EXP1-5 -#define LCD_PINS_D5 PF0 // EXP1-6 -#define LCD_PINS_D6 PD3 // EXP1-7 -#define LCD_PINS_D7 PD4 // EXP1-8 -#define BTN_EN1 PD6 // EXP2-5 -#define BTN_EN2 PD0 // EXP2-3 -#define BTN_ENC PG11 // EXP1-2 diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests index 3d0000ccc4..ff4a8d734e 100644 --- a/buildroot/tests/BIGTREE_SKR_PRO-tests +++ b/buildroot/tests/BIGTREE_SKR_PRO-tests @@ -25,7 +25,7 @@ opt_set E1_AUTO_FAN_PIN PC11 opt_set E2_AUTO_FAN_PIN PC12 opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2130 -opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING +opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING PINS_DEBUGGING exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" "$3" # clean up diff --git a/buildroot/tests/STM32F7-tests b/buildroot/tests/REMRAM_V1-tests similarity index 89% rename from buildroot/tests/STM32F7-tests rename to buildroot/tests/REMRAM_V1-tests index b23a16467e..f5944ff5af 100644 --- a/buildroot/tests/STM32F7-tests +++ b/buildroot/tests/REMRAM_V1-tests @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for STM32F7 +# Build tests for REMRAM_V1 # # exit on first failure diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests index 77044dcb36..5d695c9296 100644 --- a/buildroot/tests/STM32F103RC_btt-tests +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -21,6 +21,7 @@ opt_set X_SLAVE_ADDRESS 0 opt_set Y_SLAVE_ADDRESS 1 opt_set Z_SLAVE_ADDRESS 2 opt_set E0_SLAVE_ADDRESS 3 +opt_enable PINS_DEBUGGING exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" diff --git a/buildroot/tests/STM32F4-tests b/buildroot/tests/STM32F4-tests deleted file mode 100644 index 89281860f6..0000000000 --- a/buildroot/tests/STM32F4-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F4 disco_f407vg -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -use_example_configs STM32/STM32F4 -exec_test $1 $2 "STM32F4 Default Configuration" "$3" - -# clean up -restore_configs diff --git a/platformio.ini b/platformio.ini index 9fb4904020..062514c882 100644 --- a/platformio.ini +++ b/platformio.ini @@ -863,22 +863,13 @@ lib_deps = ${common_stm32f1.lib_deps} USBComposite for STM32F1@0.91 # -# STM32F4 with STM32GENERIC +# REMRAM_V1 # -[env:STM32F4] -platform = ${common_stm32.platform} -board = disco_f407vg -build_flags = ${common.build_flags} -DUSE_STM32GENERIC -DSTM32GENERIC -DSTM32F4 -DMENU_USB_SERIAL -DMENU_SERIAL=SerialUSB -DHAL_IWDG_MODULE_ENABLED -src_filter = ${common.default_src_filter} + - - -# -# STM32F7 with STM32GENERIC -# -[env:STM32F7] +[env:REMRAM_V1] platform = ${common_stm32.platform} +extends = common_stm32 board = remram_v1 -build_flags = ${common.build_flags} -DUSE_STM32GENERIC -DSTM32GENERIC -DSTM32F7 -DMENU_USB_SERIAL -DMENU_SERIAL=SerialUSB -DHAL_IWDG_MODULE_ENABLED -src_filter = ${common.default_src_filter} + - +build_flags = ${common_stm32.build_flags} # # ST NUCLEO-F767ZI Development Board From 6ec6d1d39d61a57c4a85ded4b6a7a23738f61b2c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 26 Nov 2020 01:08:12 -0600 Subject: [PATCH 0646/1370] Tweak some pin errors --- Marlin/src/pins/esp32/pins_E4D.h | 2 +- Marlin/src/pins/esp32/pins_FYSETC_E4.h | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 6 +++--- Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 2 +- Marlin/src/pins/stm32f7/pins_REMRAM_V1.h | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index 2a1f070dda..6009ea6cdb 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -32,7 +32,7 @@ #elif EXTRUDERS > 1 || E_STEPPERS > 1 #error "E4d@box only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 - #error "E4d@box currently supports only one hotend. Comment out this line to continue." + #error "E4d@box only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "E4D@BOX" diff --git a/Marlin/src/pins/esp32/pins_FYSETC_E4.h b/Marlin/src/pins/esp32/pins_FYSETC_E4.h index af179256e1..5b62518689 100644 --- a/Marlin/src/pins/esp32/pins_FYSETC_E4.h +++ b/Marlin/src/pins/esp32/pins_FYSETC_E4.h @@ -32,7 +32,7 @@ #elif EXTRUDERS > 1 || E_STEPPERS > 1 #error "FYSETC E4 only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 - #error "FYSETC E4 currently supports only one hotend. Comment out this line to continue." + #error "FYSETC E4 only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "FYSETC_E4" diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index 52837df741..02cdd0a009 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -32,7 +32,7 @@ #elif EXTRUDERS > 1 || E_STEPPERS > 1 #error "MRR ESPA only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 - #error "MRR ESPA currently supports only one hotend. Comment out this line to continue." + #error "MRR ESPA only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "MRR ESPA" diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index 0c489dd7b4..0c9ab43fd3 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -33,7 +33,7 @@ #elif EXTRUDERS > 2 || E_STEPPERS > 2 #error "MRR ESPE only supports two E Steppers. Comment out this line to continue." #elif HOTENDS > 1 - #error "MRR ESPE currently supports only one hotend. Comment out this line to continue." + #error "MRR ESPE only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "MRR ESPE" diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index c6f2dd8b80..f0c1611cb8 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -27,7 +27,7 @@ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." + #error "Creality V4 only supports one hotend / E-stepper. Comment out this line to continue." #endif #ifndef BOARD_INFO_NAME diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h index 2028cd9dd4..89ace3493f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h @@ -26,7 +26,7 @@ */ #if HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin E3 supports up to 1 hotends / E-steppers. Comment out this line to continue." + #error "MKS Robin E3 only supports one hotend / E-stepper. Comment out this line to continue." #endif #ifndef BOARD_INFO_NAME diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h index d1f6dece5c..a629bce9f3 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h @@ -26,7 +26,7 @@ */ #if HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin E3D supports up to 1 hotends / E-steppers. Comment out this line to continue." + #error "MKS Robin E3D only supports one hotend / E-stepper. Comment out this line to continue." #endif #ifndef BOARD_INFO_NAME diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index b9283a060f..93890e9aa7 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -28,12 +28,12 @@ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin e3p supports up to 1 hotends / E-steppers. Comment out this line to continue." + #error "MKS Robin E3P only supports one hotend / E-stepper. Comment out this line to continue." #elif HAS_FSMC_TFT - #error "MKS Robin e3p doesn't support FSMC-based TFT displays." + #error "MKS Robin E3P doesn't support FSMC-based TFT displays." #endif -#define BOARD_INFO_NAME "MKS Robin e3p" +#define BOARD_INFO_NAME "MKS Robin E3P" #define BOARD_NO_NATIVE_USB diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 19ff2a34e2..660ba29e97 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -24,7 +24,7 @@ #if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "BIGTREE BTT002 V1.0 supports up to 1 hotends / E-steppers." + #error "BIGTREE BTT002 V1.0 only supports one hotend / E-stepper." #endif #define BOARD_INFO_NAME "BTT BTT002 V1.0" diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index bed51ca660..075aec6e9b 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -21,7 +21,7 @@ #if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "LERDGE X supports only one hotend / E-steppers" + #error "LERDGE X only supports one hotend / E-steppers" #endif #define BOARD_INFO_NAME "Lerdge X" diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h index c3dc004728..f07cf824d2 100644 --- a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h +++ b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h @@ -33,7 +33,7 @@ #endif #if HOTENDS > 1 || E_STEPPERS > 1 - #error "RemRam supports only one hotend / E-stepper." + #error "RemRam only supports one hotend / E-stepper." #endif // From 9d5a391b547bc39161b5a1060068b4819aa3f8f5 Mon Sep 17 00:00:00 2001 From: mks-viva <1224833100@qq.com> Date: Thu, 26 Nov 2020 16:36:29 +0800 Subject: [PATCH 0647/1370] MKS Robin E3 / E3D v1.1 (#20216) --- Marlin/src/core/boards.h | 54 ++++++++------- Marlin/src/pins/pins.h | 4 ++ .../pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h | 67 +++++++++++++++++++ .../src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h | 36 ++++++++++ .../stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h | 39 +++++++++++ .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 10 ++- 6 files changed, 181 insertions(+), 29 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h create mode 100644 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h create mode 100644 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 1d1f3972d9..a6fc1b4dfd 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -289,11 +289,11 @@ // STM32 ARM Cortex-M3 // -#define BOARD_MALYAN_M200_V2 4000 // STM32F070CB STM32F0 controller +#define BOARD_MALYAN_M200_V2 4000 // STM32F070CB controller #define BOARD_MALYAN_M300 4001 // STM32F070-based delta #define BOARD_STM32F103RE 4002 // STM32F103RE Libmaple-based STM32F1 controller -#define BOARD_MALYAN_M200 4003 // STM32C8T6 Libmaple-based STM32F1 controller -#define BOARD_STM3R_MINI 4004 // STM32F103RE Libmaple-based STM32F1 controller +#define BOARD_MALYAN_M200 4003 // STM32C8T6 Libmaple-based STM32F1 controller +#define BOARD_STM3R_MINI 4004 // STM32F103RE Libmaple-based STM32F1 controller #define BOARD_GTM32_PRO_VB 4005 // STM32F103VET6 controller #define BOARD_GTM32_MINI 4006 // STM32F103VET6 controller #define BOARD_GTM32_MINI_A30 4007 // STM32F103VET6 controller @@ -307,29 +307,31 @@ #define BOARD_MKS_ROBIN_LITE 4015 // MKS Robin Lite/Lite2 (STM32F103RCT6) #define BOARD_MKS_ROBIN_LITE3 4016 // MKS Robin Lite3 (STM32F103RCT6) #define BOARD_MKS_ROBIN_PRO 4017 // MKS Robin Pro (STM32F103ZET6) -#define BOARD_MKS_ROBIN_E3 4018 // MKS Robin E3 (STM32F103RCT6) -#define BOARD_MKS_ROBIN_E3D 4019 // MKS Robin E3D (STM32F103RCT6) -#define BOARD_MKS_ROBIN_E3P 4020 // MKS Robin E3p (STM32F103VET6) -#define BOARD_BTT_SKR_MINI_V1_1 4021 // BigTreeTech SKR Mini v1.1 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V1_0 4022 // BigTreeTech SKR Mini E3 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V1_2 4023 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V2_0 4024 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_MZ_V1_0 4025 // BigTreeTech SKR Mini MZ V1.0 (STM32F103RC) -#define BOARD_BTT_SKR_E3_DIP 4026 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) -#define BOARD_JGAURORA_A5S_A1 4027 // JGAurora A5S A1 (STM32F103ZET6) -#define BOARD_FYSETC_AIO_II 4028 // FYSETC AIO_II -#define BOARD_FYSETC_CHEETAH 4029 // FYSETC Cheetah -#define BOARD_FYSETC_CHEETAH_V12 4030 // FYSETC Cheetah V1.2 -#define BOARD_LONGER3D_LK 4031 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 -#define BOARD_CCROBOT_MEEB_3DP 4032 // ccrobot-online.com MEEB_3DP (STM32F103RC) -#define BOARD_CHITU3D_V5 4033 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CHITU3D_V6 4034 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CREALITY_V4 4035 // Creality v4.x (STM32F103RE) -#define BOARD_CREALITY_V427 4036 // Creality v4.2.7 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4037 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4038 // FLY MINI (STM32F103RCT6) -#define BOARD_FLSUN_HISPEED 4039 // FLSUN HiSpeedV1 (STM32F103VET6) -#define BOARD_BEAST 4040 // STM32F103RET6 Libmaple-based controller +#define BOARD_MKS_ROBIN_E3 4018 // MKS Robin E3 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3_V1_1 4019 // MKS Robin E3 V1.1 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3D 4020 // MKS Robin E3D (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3D_V1_1 4021 // MKS Robin E3D V1.1 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3P 4022 // MKS Robin E3p (STM32F103VET6) +#define BOARD_BTT_SKR_MINI_V1_1 4023 // BigTreeTech SKR Mini v1.1 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V1_0 4024 // BigTreeTech SKR Mini E3 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V1_2 4025 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V2_0 4026 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_MZ_V1_0 4027 // BigTreeTech SKR Mini MZ V1.0 (STM32F103RC) +#define BOARD_BTT_SKR_E3_DIP 4028 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) +#define BOARD_JGAURORA_A5S_A1 4029 // JGAurora A5S A1 (STM32F103ZET6) +#define BOARD_FYSETC_AIO_II 4030 // FYSETC AIO_II +#define BOARD_FYSETC_CHEETAH 4031 // FYSETC Cheetah +#define BOARD_FYSETC_CHEETAH_V12 4032 // FYSETC Cheetah V1.2 +#define BOARD_LONGER3D_LK 4033 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 +#define BOARD_CCROBOT_MEEB_3DP 4034 // ccrobot-online.com MEEB_3DP (STM32F103RC) +#define BOARD_CHITU3D_V5 4035 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CHITU3D_V6 4036 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CREALITY_V4 4037 // Creality v4.x (STM32F103RE) +#define BOARD_CREALITY_V427 4038 // Creality v4.2.7 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4039 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4040 // FLY MINI (STM32F103RCT6) +#define BOARD_FLSUN_HISPEED 4041 // FLSUN HiSpeedV1 (STM32F103VET6) +#define BOARD_BEAST 4042 // STM32F103RET6 Libmaple-based controller // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 1660d16dd2..676e113310 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -552,8 +552,12 @@ #include "stm32f1/pins_MKS_ROBIN_PRO.h" // STM32F1 env:mks_robin_pro #elif MB(MKS_ROBIN_E3) #include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3 +#elif MB(MKS_ROBIN_E3_V1_1) + #include "stm32f1/pins_MKS_ROBIN_E3_V1_1.h" // STM32F1 env:mks_robin_e3 #elif MB(MKS_ROBIN_E3D) #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3 +#elif MB(MKS_ROBIN_E3D_V1_1) + #include "stm32f1/pins_MKS_ROBIN_E3D_V1_1.h" // STM32F1 env:mks_robin_e3 #elif MB(MKS_ROBIN_E3P) #include "stm32f1/pins_MKS_ROBIN_E3P.h" // STM32F1 env:mks_robin_e3p #elif MB(BTT_SKR_MINI_V1_1) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h new file mode 100644 index 0000000000..0d927cf7cb --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * MKS Robin E3D v1.1 (STM32F103RCT6) board pin assignments + */ + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "MKS Robin E3D v1.1 only supports one hotend / E-stepper. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS Robin E3D V1.1" +#endif + +// +// Steppers +// +#ifndef X_CS_PIN + #define X_CS_PIN PC7 +#endif +#ifndef Y_CS_PIN + #define Y_CS_PIN PD2 +#endif +#ifndef Z_CS_PIN + #define Z_CS_PIN PC12 +#endif +#ifndef E0_CS_PIN + #define E0_CS_PIN PC11 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB15 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB14 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB13 + #endif +#endif + +#include "pins_MKS_ROBIN_E3_V1_1_common.h" diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h new file mode 100644 index 0000000000..002c35fe54 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * MKS Robin E3 v1.1 (STM32F103RCT6) board pin assignments + */ + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "MKS Robin E3 v1.1 only supports one hotend / E-stepper. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS Robin E3 V1.1" +#endif + +#include "pins_MKS_ROBIN_E3_V1_1_common.h" diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h new file mode 100644 index 0000000000..4eaf2e9469 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1_common.h @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// EEPROM +// +// Onboard I2C EEPROM +#if NO_EEPROM_SELECTED + #define I2C_EEPROM + #define MARLIN_EEPROM_SIZE 0x1000// 4KB + #undef NO_EEPROM_SELECTED +#endif + +#define Z_STEP_PIN PC14 +#define Z_DIR_PIN PC15 + +#define BTN_ENC_EN -1 + +#include "pins_MKS_ROBIN_E3_common.h" diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index c2b7e52067..1362d22086 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -70,8 +70,12 @@ #define Y_DIR_PIN PB9 #define Y_ENABLE_PIN PB12 -#define Z_STEP_PIN PB7 -#define Z_DIR_PIN PB6 +#ifndef Z_STEP_PIN + #define Z_STEP_PIN PB7 +#endif +#ifndef Z_DIR_PIN + #define Z_DIR_PIN PB6 +#endif #define Z_ENABLE_PIN PB8 #define E0_STEP_PIN PB4 @@ -161,7 +165,7 @@ #define LCD_PINS_D6 PC4 #define LCD_PINS_D7 PC5 - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #if !defined(BTN_ENC_EN) && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder #endif From 7421282d9a3209c8ccd68f20e2726cad5729b8b6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 26 Nov 2020 03:47:07 -0600 Subject: [PATCH 0648/1370] Finish HAL/STM32 cpp wrappers --- Marlin/src/HAL/STM32/MarlinSPI.cpp | 1 - Marlin/src/HAL/STM32/MarlinSerial.cpp | 1 - Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 4 +++- Marlin/src/HAL/STM32/eeprom_sdcard.cpp | 5 ++--- Marlin/src/HAL/STM32/fast_pwm.cpp | 2 ++ Marlin/src/HAL/STM32/tft/tft_fsmc.cpp | 2 ++ Marlin/src/HAL/STM32/tft/tft_spi.cpp | 2 ++ Marlin/src/HAL/STM32/tft/xpt2046.cpp | 2 ++ Marlin/src/HAL/STM32/usb_serial.cpp | 3 +-- Marlin/src/HAL/STM32/watchdog.cpp | 1 - 10 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Marlin/src/HAL/STM32/MarlinSPI.cpp b/Marlin/src/HAL/STM32/MarlinSPI.cpp index da11b88a60..399430f5eb 100644 --- a/Marlin/src/HAL/STM32/MarlinSPI.cpp +++ b/Marlin/src/HAL/STM32/MarlinSPI.cpp @@ -19,7 +19,6 @@ * along with this program. If not, see . * */ - #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) #include "MarlinSPI.h" diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index a146664366..50765ee995 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -16,7 +16,6 @@ * along with this program. If not, see . * */ - #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index 9c2666ed26..a7b1e8006f 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -19,10 +19,11 @@ * along with this program. If not, see . * */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) #include "../../inc/MarlinConfig.h" -#if ENABLED(SDIO_SUPPORT) && !defined(STM32GENERIC) +#if ENABLED(SDIO_SUPPORT) #include #include @@ -319,3 +320,4 @@ #endif // !USBD_USE_CDC_COMPOSITE #endif // SDIO_SUPPORT +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp index c9180bf09b..f811468fb4 100644 --- a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp @@ -19,13 +19,12 @@ * along with this program. If not, see . * */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) /** * Implementation of EEPROM settings in SD Card */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - #include "../../inc/MarlinConfig.h" #if ENABLED(SDCARD_EEPROM_EMULATION) @@ -89,4 +88,4 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uin } #endif // SDCARD_EEPROM_EMULATION -#endif // STM32 && !STM32GENERIC +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/fast_pwm.cpp b/Marlin/src/HAL/STM32/fast_pwm.cpp index 99101c6e81..42eecb5e1a 100644 --- a/Marlin/src/HAL/STM32/fast_pwm.cpp +++ b/Marlin/src/HAL/STM32/fast_pwm.cpp @@ -19,6 +19,7 @@ * along with this program. If not, see . * */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) #include "../../inc/MarlinConfigPre.h" @@ -55,3 +56,4 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255 } #endif // NEEDS_HARDWARE_PWM +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp index 3a080d5e27..b6bc7fcd84 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp @@ -19,6 +19,7 @@ * along with this program. If not, see . * */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) #include "../../../inc/MarlinConfig.h" @@ -178,3 +179,4 @@ void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Cou } #endif // HAS_FSMC_TFT +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp index d3eb4ba8db..aed15ad66d 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -19,6 +19,7 @@ * along with this program. If not, see . * */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) #include "../../../inc/MarlinConfig.h" @@ -210,3 +211,4 @@ void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Coun } #endif // HAS_SPI_TFT +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp index f95bb8ca4d..7e2dbfd15a 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp @@ -19,6 +19,7 @@ * along with this program. If not, see . * */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) #include "../../../inc/MarlinConfig.h" @@ -186,3 +187,4 @@ uint16_t XPT2046::SoftwareIO(uint16_t data) { } #endif // HAS_TFT_XPT2046 +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/usb_serial.cpp b/Marlin/src/HAL/STM32/usb_serial.cpp index 25c47d694f..705d649ff5 100644 --- a/Marlin/src/HAL/STM32/usb_serial.cpp +++ b/Marlin/src/HAL/STM32/usb_serial.cpp @@ -16,7 +16,6 @@ * along with this program. If not, see . * */ - #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) #include "../../inc/MarlinConfigPre.h" @@ -51,5 +50,5 @@ void USB_Hook_init() { USBD_CDC_fops.Receive = USBD_CDC_Receive_hook; } -#endif // EMERGENCY_PARSER +#endif // EMERGENCY_PARSER && USBD_USE_CDC #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/watchdog.cpp b/Marlin/src/HAL/STM32/watchdog.cpp index 3d83408311..aad0a79a0c 100644 --- a/Marlin/src/HAL/STM32/watchdog.cpp +++ b/Marlin/src/HAL/STM32/watchdog.cpp @@ -46,5 +46,4 @@ void HAL_watchdog_refresh() { } #endif // USE_WATCHDOG - #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC From fc1deea2b86f433449700d4919f5c4c95e810e81 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 25 Nov 2020 23:36:22 -0600 Subject: [PATCH 0649/1370] No auto debug for EEPROM_CHITCHAT --- Marlin/src/module/settings.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 6614aec35b..c49c643b60 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -559,13 +559,11 @@ void MarlinSettings::postprocess() { #endif // SD_FIRMWARE_UPDATE #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - static_assert( - EEPROM_OFFSET + sizeof(SettingsData) < ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE, - "ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE is insufficient to capture all EEPROM data." - ); + static_assert(EEPROM_OFFSET + sizeof(SettingsData) < ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE, + "ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE is insufficient to capture all EEPROM data."); #endif -#define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) +//#define DEBUG_OUT 1 #include "../core/debug_out.h" #if ENABLED(EEPROM_SETTINGS) From 7c9c897dac11287cbb7fc702030d233610b07274 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 25 Nov 2020 22:28:42 -0600 Subject: [PATCH 0650/1370] Optimize emergency parser check --- Marlin/src/gcode/queue.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 12dfce5111..ba2cdf35b1 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -538,12 +538,11 @@ void GCodeQueue::get_serial_commands() { #if DISABLED(EMERGENCY_PARSER) // Process critical commands early - if (strcmp_P(command, PSTR("M108")) == 0) { - wait_for_heatup = false; - TERN_(HAS_LCD_MENU, wait_for_user = false); + if (command[0] == 'M') switch (command[3]) { + case '8': if (command[2] == '0' && command[1] == '1') { wait_for_heatup = false; TERN_(HAS_LCD_MENU, wait_for_user = false); } break; + case '2': if (command[2] == '1' && command[1] == '1') kill(M112_KILL_STR, nullptr, true); break; + case '0': if (command[1] == '4' && command[2] == '1') quickstop_stepper(); break; } - if (strcmp_P(command, PSTR("M112")) == 0) kill(M112_KILL_STR, nullptr, true); - if (strcmp_P(command, PSTR("M410")) == 0) quickstop_stepper(); #endif #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 From 747bde7e648ddd7cf8404b5d7ce551804a4dc9e6 Mon Sep 17 00:00:00 2001 From: wmariz <11435639+wmariz@users.noreply.github.com> Date: Thu, 26 Nov 2020 10:58:19 -0300 Subject: [PATCH 0651/1370] Level Corners with Probe option (#20241) --- Marlin/Configuration.h | 6 + Marlin/src/feature/backlash.cpp | 10 +- Marlin/src/feature/bltouch.cpp | 11 +- Marlin/src/gcode/calibrate/G425.cpp | 8 +- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/lcd/language/language_en.h | 3 + Marlin/src/lcd/menu/menu_bed_corners.cpp | 205 +++++++++++++++++++---- Marlin/src/module/endstops.cpp | 6 +- Marlin/src/module/probe.cpp | 20 +-- Marlin/src/module/probe.h | 6 + buildroot/tests/LPC1769-tests | 1 + 11 files changed, 211 insertions(+), 69 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c64569d2bf..3320e18abc 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1392,6 +1392,12 @@ #define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points #define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points //#define LEVEL_CENTER_TOO // Move to the center after the last corner + //#define LEVEL_CORNERS_USE_PROBE + #if ENABLED(LEVEL_CORNERS_USE_PROBE) + #define LEVEL_CORNERS_PROBE_TOLERANCE 0.1 + #define LEVEL_CORNERS_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify + //#define LEVEL_CORNERS_AUDIO_FEEDBACK + #endif #endif /** diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp index 867e9cdd21..b848214f0c 100644 --- a/Marlin/src/feature/backlash.cpp +++ b/Marlin/src/feature/backlash.cpp @@ -123,24 +123,22 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const } #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - #if HAS_CUSTOM_PROBE_PIN - #define TEST_PROBE_PIN (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) - #else - #define TEST_PROBE_PIN (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) - #endif + + #include "../module/probe.h" // Measure Z backlash by raising nozzle in increments until probe deactivates void Backlash::measure_with_probe() { if (measured_count.z == 255) return; const float start_height = current_position.z; - while (current_position.z < (start_height + BACKLASH_MEASUREMENT_LIMIT) && TEST_PROBE_PIN) + while (current_position.z < (start_height + BACKLASH_MEASUREMENT_LIMIT) && PROBE_TRIGGERED()) do_blocking_move_to_z(current_position.z + BACKLASH_MEASUREMENT_RESOLUTION, MMM_TO_MMS(BACKLASH_MEASUREMENT_FEEDRATE)); // The backlash from all probe points is averaged, so count the number of measurements measured_mm.z += current_position.z - start_height; measured_count.z++; } + #endif #endif // BACKLASH_COMPENSATION diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp index d6b1f99c16..48eaf9efc4 100644 --- a/Marlin/src/feature/bltouch.cpp +++ b/Marlin/src/feature/bltouch.cpp @@ -31,6 +31,7 @@ BLTouch bltouch; bool BLTouch::last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain #include "../module/servo.h" +#include "../module/probe.h" void stop(); @@ -90,15 +91,7 @@ void BLTouch::clear() { _stow(); // STOW to be ready for meaningful work. Could fail, don't care } -bool BLTouch::triggered() { - return ( - #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING - #else - READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING - #endif - ); -} +bool BLTouch::triggered() { return PROBE_TRIGGERED(); } bool BLTouch::deploy_proc() { // Do a DEPLOY diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index 6517e6b4bd..9510da7740 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -143,14 +143,16 @@ inline void park_above_object(measurements_t &m, const float uncertainty) { #endif +#if !PIN_EXISTS(CALIBRATION) + #include "../../module/probe.h" +#endif + inline bool read_calibration_pin() { return ( #if PIN_EXISTS(CALIBRATION) READ(CALIBRATION_PIN) != CALIBRATION_PIN_INVERTING - #elif HAS_CUSTOM_PROBE_PIN - READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING #else - READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING + PROBE_TRIGGERED() #endif ); } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9f4c10dd53..eec9ff0844 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -357,6 +357,8 @@ #error "LEVEL_CORNERS_INSET is now LEVEL_CORNERS_INSET_LFRB." #elif ENABLED(LEVEL_BED_CORNERS) && !defined(LEVEL_CORNERS_INSET_LFRB) #error "LEVEL_BED_CORNERS requires LEVEL_CORNERS_INSET_LFRB values." +#elif BOTH(LEVEL_CORNERS_USE_PROBE, SENSORLESS_PROBING) + #error "LEVEL_CORNERS_USE_PROBE is incompatible with SENSORLESS_PROBING." #elif defined(BEZIER_JERK_CONTROL) #error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION." #elif HAS_JUNCTION_DEVIATION && defined(JUNCTION_DEVIATION_FACTOR) @@ -1603,7 +1605,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Allen Key * Deploying the Allen Key probe uses big moves in z direction. Too dangerous for an unhomed z-axis. */ -#if ENABLED(Z_PROBE_ALLEN_KEY) && (Z_HOME_DIR < 0) && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) +#if BOTH(Z_PROBE_ALLEN_KEY, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && (Z_HOME_DIR < 0) #error "You can't home to a Z min endstop with a Z_PROBE_ALLEN_KEY." #endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index af0903b916..2892f79df8 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -125,6 +125,8 @@ namespace Language_en { PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bed Leveling"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Level Bed"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Level Corners"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Raise Bed Until Probe Triggered"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("All Corners Within Tolerance. Level Bed"); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Next Corner"); PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Mesh Editor"); PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Edit Mesh"); @@ -379,6 +381,7 @@ namespace Language_en { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Done"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Back"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Proceed"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("Skip"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Pausing..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause Print"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resume Print"); diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 16f9992c18..52d2d0ec3d 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -44,53 +44,187 @@ #define LEVEL_CORNERS_HEIGHT 0.0 #endif +#if ENABLED(LEVEL_CORNERS_USE_PROBE) + #include "../../module/probe.h" + #include "../../module/endstops.h" + #if ENABLED(BLTOUCH) + #include "../../feature/bltouch.h" + #endif + #ifndef LEVEL_CORNERS_PROBE_TOLERANCE + #define LEVEL_CORNERS_PROBE_TOLERANCE 0.1 + #endif + #if ENABLED(LEVEL_CORNERS_AUDIO_FEEDBACK) + #include "../../libs/buzzer.h" + #define PROBE_BUZZ() BUZZ(200, 600) + #else + #define PROBE_BUZZ() NOOP + #endif + static float last_z; + static bool corner_probing_done; + static bool verify_corner; + static int good_points; +#endif + static_assert(LEVEL_CORNERS_Z_HOP >= 0, "LEVEL_CORNERS_Z_HOP must be >= 0. Please update your configuration."); +extern const char G28_STR[]; + #if HAS_LEVELING static bool leveling_was_active = false; #endif +static int8_t bed_corner; + /** * Level corners, starting in the front-left corner. */ -static int8_t bed_corner; -static inline void _lcd_goto_next_corner() { - constexpr float lfrb[4] = LEVEL_CORNERS_INSET_LFRB; - constexpr xy_pos_t lf { (X_MIN_BED) + lfrb[0], (Y_MIN_BED) + lfrb[1] }, - rb { (X_MAX_BED) - lfrb[2], (Y_MAX_BED) - lfrb[3] }; - line_to_z(LEVEL_CORNERS_Z_HOP); - switch (bed_corner) { - case 0: current_position = lf; break; // copy xy - case 1: current_position.x = rb.x; break; - case 2: current_position.y = rb.y; break; - case 3: current_position.x = lf.x; break; - #if ENABLED(LEVEL_CENTER_TOO) - case 4: current_position.set(X_CENTER, Y_CENTER); break; +#if ENABLED(LEVEL_CORNERS_USE_PROBE) + + static inline void _lcd_level_bed_corners_probing() { + ui.goto_screen([]{ MenuItem_static::draw((LCD_HEIGHT - 1) / 2, GET_TEXT(MSG_PROBING_MESH)); }); + + float lfrb[4] = LEVEL_CORNERS_INSET_LFRB; + xy_pos_t lf { (X_MIN_BED) + lfrb[0] - probe.offset_xy.x , (Y_MIN_BED) + lfrb[1] - probe.offset_xy.y }, + rb { (X_MAX_BED) - lfrb[2] - probe.offset_xy.x , (Y_MAX_BED) - lfrb[3] - probe.offset_xy.y }; + + do_blocking_move_to_z(LEVEL_CORNERS_Z_HOP - probe.offset.z); + + switch (bed_corner) { + case 0: current_position = lf; break; // copy xy + case 1: current_position.x = rb.x; break; + case 2: current_position.y = rb.y; break; + case 3: current_position.x = lf.x; break; + #if ENABLED(LEVEL_CENTER_TOO) + case 4: current_position.set(X_CENTER - probe.offset_xy.x, Y_CENTER - probe.offset_xy.y); good_points--; break; + #endif + } + + do_blocking_move_to_xy(current_position); + + #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) + bltouch.deploy(); // DEPLOY in LOW SPEED MODE on every probe action #endif + TERN_(QUIET_PROBING, probe.set_probing_paused(true)); + + // Move down until the probe is triggered + do_blocking_move_to_z(last_z - (LEVEL_CORNERS_PROBE_TOLERANCE), manual_feedrate_mm_s.z); + + // Check to see if the probe was triggered + bool probe_triggered = TEST(endstops.trigger_state(), TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN, Z_MIN_PROBE)); + if (!probe_triggered) { + + static bool wait_for_probe; + + ui.goto_screen([]{ + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_DONE), GET_TEXT(MSG_BUTTON_SKIP) + , []{ corner_probing_done = true; + wait_for_probe = false; + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); + ui.goto_previous_screen_no_defer(); + } + , []{ wait_for_probe = false; } + , GET_TEXT(MSG_LEVEL_CORNERS_RAISE) + , (const char*)nullptr, PSTR("") + ); + }); + ui.set_selection(true); + + wait_for_probe = true; + while (wait_for_probe && !probe_triggered) { + probe_triggered = PROBE_TRIGGERED(); + if (probe_triggered) PROBE_BUZZ(); + idle(); + } + wait_for_probe = false; + + TERN_(LEVEL_CORNERS_VERIFY_RAISED, verify_corner = true); + } + + TERN_(QUIET_PROBING, probe.set_probing_paused(false)); + + #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) + bltouch.stow(); + #endif + + if (probe_triggered) { + endstops.hit_on_purpose(); + if (!WITHIN(current_position.z, last_z - (LEVEL_CORNERS_PROBE_TOLERANCE), last_z + (LEVEL_CORNERS_PROBE_TOLERANCE))) { + last_z = current_position.z; + good_points = 0; + } + if (!verify_corner) good_points++; + } + + if (!corner_probing_done) { + if (!verify_corner) bed_corner++; + if (bed_corner > 3) bed_corner = 0; + verify_corner = false; + if (good_points < 4) + _lcd_level_bed_corners_probing(); + else { + ui.goto_screen([]{ + MenuItem_confirm::confirm_screen( + []{ ui.goto_previous_screen_no_defer(); + queue.inject_P(TERN(HAS_LEVELING, PSTR("G28\nG29"), G28_STR)); + } + , []{ ui.goto_previous_screen_no_defer(); } + , GET_TEXT(MSG_LEVEL_CORNERS_IN_RANGE) + , (const char*)nullptr, PSTR("?") + ); + }); + ui.set_selection(true); + } + } } - line_to_current_position(manual_feedrate_mm_s.x); - line_to_z(LEVEL_CORNERS_HEIGHT); - if (++bed_corner > 3 + ENABLED(LEVEL_CENTER_TOO)) bed_corner = 0; -} + +#else + + static inline void _lcd_goto_next_corner() { + constexpr float lfrb[4] = LEVEL_CORNERS_INSET_LFRB; + constexpr xy_pos_t lf { (X_MIN_BED) + lfrb[0], (Y_MIN_BED) + lfrb[1] }, + rb { (X_MAX_BED) - lfrb[2], (Y_MAX_BED) - lfrb[3] }; + line_to_z(LEVEL_CORNERS_Z_HOP); + switch (bed_corner) { + case 0: current_position = lf; break; // copy xy + case 1: current_position.x = rb.x; break; + case 2: current_position.y = rb.y; break; + case 3: current_position.x = lf.x; break; + #if ENABLED(LEVEL_CENTER_TOO) + case 4: current_position.set(X_CENTER, Y_CENTER); break; + #endif + } + line_to_current_position(manual_feedrate_mm_s.x); + line_to_z(LEVEL_CORNERS_HEIGHT); + if (++bed_corner > 3 + ENABLED(LEVEL_CENTER_TOO)) bed_corner = 0; + } + +#endif static inline void _lcd_level_bed_corners_homing() { _lcd_draw_homing(); if (all_axes_homed()) { - bed_corner = 0; - ui.goto_screen([]{ - MenuItem_confirm::select_screen( - GET_TEXT(MSG_BUTTON_NEXT), GET_TEXT(MSG_BUTTON_DONE) - , _lcd_goto_next_corner - , []{ - TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); - ui.goto_previous_screen_no_defer(); - } - , GET_TEXT(TERN(LEVEL_CENTER_TOO, MSG_LEVEL_BED_NEXT_POINT, MSG_NEXT_CORNER)) - , (const char*)nullptr, PSTR("?") - ); - }); - ui.set_selection(true); - _lcd_goto_next_corner(); + #if ENABLED(LEVEL_CORNERS_USE_PROBE) + TERN_(LEVEL_CENTER_TOO, bed_corner = 4); + endstops.enable_z_probe(true); + ui.goto_screen(_lcd_level_bed_corners_probing); + #else + bed_corner = 0; + ui.goto_screen([]{ + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_NEXT), GET_TEXT(MSG_BUTTON_DONE) + , _lcd_goto_next_corner + , []{ + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); + ui.goto_previous_screen_no_defer(); + } + , GET_TEXT(TERN(LEVEL_CENTER_TOO, MSG_LEVEL_BED_NEXT_POINT, MSG_NEXT_CORNER)) + , (const char*)nullptr, PSTR("?") + ); + }); + ui.set_selection(true); + _lcd_goto_next_corner(); + #endif } } @@ -107,6 +241,13 @@ void _lcd_level_bed_corners() { set_bed_leveling_enabled(false); #endif + #if ENABLED(LEVEL_CORNERS_USE_PROBE) + last_z = LEVEL_CORNERS_HEIGHT; + corner_probing_done = false; + verify_corner = false; + good_points = 0; + #endif + ui.goto_screen(_lcd_level_bed_corners_homing); } diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 697ced7833..ef0b92a7ee 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -48,6 +48,10 @@ #include "../feature/joystick.h" #endif +#if HAS_BED_PROBE + #include "probe.h" +#endif + Endstops endstops; // private: @@ -455,7 +459,7 @@ void _O2 Endstops::report_states() { ES_REPORT(Z4_MAX); #endif #if HAS_CUSTOM_PROBE_PIN - print_es_state(READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING, PSTR(STR_Z_PROBE)); + print_es_state(PROBE_TRIGGERED(), PSTR(STR_Z_PROBE)); #endif #if HAS_FILAMENT_SENSOR #if NUM_RUNOUT_SENSORS == 1 diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index f02b909150..47c6f569b7 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -270,13 +270,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) do { #if ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED) - if (deploy == ( - #if HAS_CUSTOM_PROBE_PIN - READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING - #else - READ(Z_MIN_PIN) == Z_MIN_ENDSTOP_INVERTING - #endif - )) break; + if (deploy == PROBE_TRIGGERED()) break; #endif BUZZ(100, 659); @@ -375,23 +369,15 @@ bool Probe::set_deployed(const bool deploy) { const xy_pos_t old_xy = current_position; #if ENABLED(PROBE_TRIGGERED_WHEN_STOWED_TEST) - #if HAS_CUSTOM_PROBE_PIN - #define PROBE_STOWED() (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) - #else - #define PROBE_STOWED() (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) - #endif - #endif - - #ifdef PROBE_STOWED // Only deploy/stow if needed - if (PROBE_STOWED() == deploy) { + if (PROBE_TRIGGERED() == deploy) { if (!deploy) endstops.enable_z_probe(false); // Switch off triggered when stowed probes early // otherwise an Allen-Key probe can't be stowed. probe_specific_action(deploy); } - if (PROBE_STOWED() == deploy) { // Unchanged after deploy/stow action? + if (PROBE_TRIGGERED() == deploy) { // Unchanged after deploy/stow action? if (IsRunning()) { SERIAL_ERROR_MSG("Z-Probe failed"); LCD_ALERTMESSAGEPGM_P(PSTR("Err: ZPROBE")); diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index cac106fed6..e5ad892e37 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -38,6 +38,12 @@ }; #endif +#if HAS_CUSTOM_PROBE_PIN + #define PROBE_TRIGGERED() (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) +#else + #define PROBE_TRIGGERED() (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) +#endif + class Probe { public: diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index 702f8035ec..f661babc40 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -19,6 +19,7 @@ opt_set TEMP_SENSOR_1 -1 opt_set TEMP_SENSOR_BED 5 opt_enable VIKI2 SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + LEVEL_BED_CORNERS LEVEL_CORNERS_USE_PROBE LEVEL_CORNERS_VERIFY_RAISED \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ From 3231741cd2f55c9b18acd37353d46c364a0ebf4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20Daleck=C3=BD?= <36531759+daleckystepan@users.noreply.github.com> Date: Thu, 26 Nov 2020 22:21:48 +0100 Subject: [PATCH 0652/1370] [WIP] Fix Probe::offset_xy (#20290) Co-authored-by: Jason Smith --- Marlin/src/module/probe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 47c6f569b7..11447d7129 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -89,7 +89,7 @@ Probe probe; xyz_pos_t Probe::offset; // Initialized by settings.load() #if HAS_PROBE_XY_OFFSET - const xy_pos_t &Probe::offset_xy = xy_pos_t(Probe::offset); + const xy_pos_t &Probe::offset_xy = Probe::offset; #endif #if ENABLED(Z_PROBE_SLED) From deb8df8efff82aa010b82b40d78eda615ffb6c0b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 26 Nov 2020 21:18:40 -0600 Subject: [PATCH 0653/1370] M808 Repeat Markers (#20084) --- Marlin/Configuration_adv.h | 2 + Marlin/src/MarlinCore.cpp | 5 ++ Marlin/src/feature/powerloss.cpp | 3 + Marlin/src/feature/powerloss.h | 6 ++ Marlin/src/feature/repeat.cpp | 81 +++++++++++++++++++++++++++ Marlin/src/feature/repeat.h | 49 ++++++++++++++++ Marlin/src/gcode/gcode.cpp | 4 ++ Marlin/src/gcode/gcode.h | 3 + Marlin/src/gcode/host/M115.cpp | 3 + Marlin/src/gcode/queue.cpp | 23 +++++--- Marlin/src/gcode/sd/M808.cpp | 51 +++++++++++++++++ Marlin/src/sd/cardreader.cpp | 3 +- Marlin/src/sd/cardreader.h | 7 ++- buildroot/test-gcode/M808-loops.gcode | 16 ++++++ buildroot/tests/mega2560-tests | 2 +- platformio.ini | 5 +- 16 files changed, 248 insertions(+), 15 deletions(-) create mode 100644 Marlin/src/feature/repeat.cpp create mode 100644 Marlin/src/feature/repeat.h create mode 100644 Marlin/src/gcode/sd/M808.cpp create mode 100644 buildroot/test-gcode/M808-loops.gcode diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7c8f2da948..e6b76a4133 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1186,6 +1186,8 @@ //#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up //#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash) + //#define GCODE_REPEAT_MARKERS // Enable G-code M808 to set repeat markers and do looping + #define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 5769da05d0..b6282cb098 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -173,6 +173,10 @@ #include "feature/pause.h" #endif +#if ENABLED(GCODE_REPEAT_MARKERS) + #include "feature/repeat.h" +#endif + #if ENABLED(POWER_LOSS_RECOVERY) #include "feature/powerloss.h" #endif @@ -435,6 +439,7 @@ bool printingIsPaused() { void startOrResumeJob() { if (!printingIsPaused()) { + TERN_(GCODE_REPEAT_MARKERS, repeat.reset()); TERN_(CANCEL_OBJECTS, cancelable.reset()); TERN_(LCD_SHOW_E_TOTAL, e_move_accumulator = 0); #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index c4e0ef694a..c55b278a72 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -182,6 +182,8 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ info.current_position = current_position; info.feedrate = uint16_t(feedrate_mm_s * 60.0f); info.zraise = zraise; + + TERN_(GCODE_REPEAT_MARKERS, info.stored_repeat = repeat); TERN_(HAS_HOME_OFFSET, info.home_offset = home_offset); TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift); @@ -507,6 +509,7 @@ void PrintJobRecovery::resume() { sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1)); gcode.process_subcommands_now(cmd); + TERN_(GCODE_REPEAT_MARKERS, repeat = info.stored_repeat); TERN_(HAS_HOME_OFFSET, home_offset = info.home_offset); TERN_(HAS_POSITION_SHIFT, position_shift = info.position_shift); #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 73cd0b70fa..f964f12294 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -30,6 +30,10 @@ #include "../inc/MarlinConfig.h" +#if ENABLED(GCODE_REPEAT_MARKERS) + #include "../feature/repeat.h" +#endif + #if ENABLED(MIXING_EXTRUDER) #include "../feature/mixing.h" #endif @@ -50,6 +54,8 @@ typedef struct { uint16_t feedrate; float zraise; + // Repeat information + TERN_(GCODE_REPEAT_MARKERS, Repeat stored_repeat); TERN_(HAS_HOME_OFFSET, xyz_pos_t home_offset); TERN_(HAS_POSITION_SHIFT, xyz_pos_t position_shift); diff --git a/Marlin/src/feature/repeat.cpp b/Marlin/src/feature/repeat.cpp new file mode 100644 index 0000000000..d48157a84d --- /dev/null +++ b/Marlin/src/feature/repeat.cpp @@ -0,0 +1,81 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../inc/MarlinConfig.h" + +#if ENABLED(GCODE_REPEAT_MARKERS) + +//#define DEBUG_GCODE_REPEAT_MARKERS + +#include "repeat.h" + +#include "../gcode/gcode.h" +#include "../sd/cardreader.h" + +#define DEBUG_OUT ENABLED(DEBUG_GCODE_REPEAT_MARKERS) +#include "../core/debug_out.h" + +repeat_marker_t Repeat::marker[MAX_REPEAT_NESTING]; +uint8_t Repeat::index; + +void Repeat::add_marker(const uint32_t sdpos, const uint16_t count) { + if (index >= MAX_REPEAT_NESTING) + SERIAL_ECHO_MSG("!Too many markers."); + else { + marker[index].sdpos = sdpos; + marker[index].counter = count ?: -1; + index++; + DEBUG_ECHOLNPAIR("Add Marker ", int(index), " at ", sdpos, " (", count, ")"); + } +} + +void Repeat::loop() { + if (!index) // No marker? + SERIAL_ECHO_MSG("!No marker set."); // Inform the user. + else { + const uint8_t ind = index - 1; // Active marker's index + if (!marker[ind].counter) { // Did its counter run out? + DEBUG_ECHOLNPAIR("Pass Marker ", int(index)); + index--; // Carry on. Previous marker on the next 'M808'. + } + else { + card.setIndex(marker[ind].sdpos); // Loop back to the marker. + if (marker[ind].counter > 0) // Ignore a negative (or zero) counter. + --marker[ind].counter; // Decrement the counter. If zero this 'M808' will be skipped next time. + DEBUG_ECHOLNPAIR("Goto Marker ", int(index), " at ", marker[ind].sdpos, " (", marker[ind].counter, ")"); + } + } +} + +void Repeat::cancel() { LOOP_L_N(i, index) marker[i].counter = 0; } + +void Repeat::early_parse_M808(char * const cmd) { + if (is_command_M808(cmd)) { + DEBUG_ECHOLNPAIR("Parsing \"", cmd, "\""); + parser.parse(cmd); + if (parser.seen('L')) + add_marker(card.getIndex(), parser.value_ushort()); + else + Repeat::loop(); + } +} + +#endif // GCODE_REPEAT_MARKERS diff --git a/Marlin/src/feature/repeat.h b/Marlin/src/feature/repeat.h new file mode 100644 index 0000000000..e293b2bbac --- /dev/null +++ b/Marlin/src/feature/repeat.h @@ -0,0 +1,49 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../inc/MarlinConfigPre.h" +#include "../gcode/parser.h" + +#include + +#define MAX_REPEAT_NESTING 10 + +typedef struct { + uint32_t sdpos; // The repeat file position + int16_t counter; // The counter for looping +} repeat_marker_t; + +class Repeat { +private: + static repeat_marker_t marker[MAX_REPEAT_NESTING]; + static uint8_t index; +public: + static inline void reset() { index = 0; } + static bool is_command_M808(char * const cmd) { return cmd[0] == 'M' && cmd[1] == '8' && cmd[2] == '0' && cmd[3] == '8' && !NUMERIC(cmd[4]); } + static void early_parse_M808(char * const cmd); + static void add_marker(const uint32_t sdpos, const uint16_t count); + static void loop(); + static void cancel(); +}; + +extern Repeat repeat; diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 3bce34c1f3..8e2ef62204 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -882,6 +882,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 800: parser.debug(); break; // M800: GCode Parser Test for M #endif + #if ENABLED(GCODE_REPEAT_MARKERS) + case 808: M808(); break; // M808: Set / Goto repeat markers + #endif + #if ENABLED(I2C_POSITION_ENCODERS) case 860: M860(); break; // M860: Report encoder module position case 861: M861(); break; // M861: Report encoder module status diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 1d74ac3719..735456a533 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -242,6 +242,7 @@ * M672 - Set/Reset Duet Smart Effector's sensitivity. (Requires DUET_SMART_EFFECTOR and SMART_EFFECTOR_MOD_PIN) * M701 - Load filament (Requires FILAMENT_LOAD_UNLOAD_GCODES) * M702 - Unload filament (Requires FILAMENT_LOAD_UNLOAD_GCODES) + * M808 - Set or Goto a Repeat Marker (Requires GCODE_REPEAT_MARKERS) * M810-M819 - Define/execute a G-code macro (Requires GCODE_MACROS) * M851 - Set Z probe's XYZ offsets in current units. (Negative values: X=left, Y=front, Z=below) * M852 - Set skew factors: "M852 [I] [J] [K]". (Requires SKEW_CORRECTION_GCODE, and SKEW_CORRECTION_FOR_Z for IJ) @@ -807,6 +808,8 @@ private: static void M702(); #endif + TERN_(GCODE_REPEAT_MARKERS, static void M808()); + TERN_(GCODE_MACROS, static void M810_819()); TERN_(HAS_BED_PROBE, static void M851()); diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 529b1dd6d0..63511b606d 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -117,6 +117,9 @@ void GcodeSuite::M115() { // SDCARD (M20, M23, M24, etc.) cap_line(PSTR("SDCARD"), ENABLED(SDSUPPORT)); + // REPEAT (M808) + cap_line(PSTR("REPEAT"), ENABLED(GCODE_REPEAT_MARKERS)); + // AUTOREPORT_SD_STATUS (M27 extension) cap_line(PSTR("AUTOREPORT_SD_STATUS"), ENABLED(AUTO_REPORT_SD_STATUS)); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index ba2cdf35b1..d23e9ee07f 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -51,6 +51,10 @@ GCodeQueue queue; #include "../feature/powerloss.h" #endif +#if ENABLED(GCODE_REPEAT_MARKERS) + #include "../feature/repeat.h" +#endif + /** * GCode line number handling. Hosts may opt to include line numbers when * sending commands to Marlin, and lines will be checked for sequentiality. @@ -577,10 +581,9 @@ void GCodeQueue::get_serial_commands() { if (!IS_SD_PRINTING()) return; int sd_count = 0; - bool card_eof = card.eof(); - while (length < BUFSIZE && !card_eof) { + while (length < BUFSIZE && !card.eof()) { const int16_t n = card.get(); - card_eof = card.eof(); + const bool card_eof = card.eof(); if (n < 0 && !card_eof) { SERIAL_ERROR_MSG(STR_SD_ERR_READ); continue; } const char sd_char = (char)n; @@ -590,17 +593,21 @@ void GCodeQueue::get_serial_commands() { // Reset stream state, terminate the buffer, and commit a non-empty command if (!is_eol && sd_count) ++sd_count; // End of file with no newline if (!process_line_done(sd_input_state, command_buffer[index_w], sd_count)) { + + // M808 S saves the sdpos of the next line. M808 loops to a new sdpos. + TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command_buffer[index_w])); + + // Put the new command into the buffer (no "ok" sent) _commit_command(false); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.cmd_sdpos = card.getIndex(); // Prime for the NEXT _commit_command - #endif + + // Prime Power-Loss Recovery for the NEXT _commit_command + TERN_(POWER_LOSS_RECOVERY, recovery.cmd_sdpos = card.getIndex()); } - if (card_eof) card.fileHasFinished(); // Handle end of file reached + if (card.eof()) card.fileHasFinished(); // Handle end of file reached } else process_stream_char(sd_char, sd_input_state, command_buffer[index_w], sd_count); - } } diff --git a/Marlin/src/gcode/sd/M808.cpp b/Marlin/src/gcode/sd/M808.cpp new file mode 100644 index 0000000000..0d11b16f8a --- /dev/null +++ b/Marlin/src/gcode/sd/M808.cpp @@ -0,0 +1,51 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(GCODE_REPEAT_MARKERS) + +#include "../gcode.h" +#include "../../feature/repeat.h" + +/** + * M808: Set / Goto a repeat marker + * + * L - Set a repeat marker with 'count' repetitions. If omitted, infinity. + * + * Examples: + * + * M808 L ; Set a loop marker with a count of infinity + * M808 L2 ; Set a loop marker with a count of 2 + * M808 ; Decrement and loop if not zero. + */ +void GcodeSuite::M808() { + + // Handled early and ignored here in the queue. + // Allowed to go into the queue for logging purposes. + + // M808 K sent from the host to cancel all loops + if (parser.seen('K')) repeat.cancel(); + +} + +#endif // GCODE_REPEAT_MARKERS diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 4416f4e907..bce84bbd39 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -699,8 +699,7 @@ void CardReader::removeFile(const char * const name) { void CardReader::report_status() { if (isPrinting()) { - SERIAL_ECHOPGM(STR_SD_PRINTING_BYTE); - SERIAL_ECHO(sdpos); + SERIAL_ECHOPAIR(STR_SD_PRINTING_BYTE, sdpos); SERIAL_CHAR('/'); SERIAL_ECHOLN(filesize); } diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index c6fe37400c..dabbf719f9 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -159,9 +159,9 @@ public: static inline uint32_t getIndex() { return sdpos; } static inline uint32_t getFileSize() { return filesize; } static inline bool eof() { return sdpos >= filesize; } - static inline void setIndex(const uint32_t index) { sdpos = index; file.seekSet(index); } + static inline void setIndex(const uint32_t index) { file.seekSet((sdpos = index)); } static inline char* getWorkDirName() { workDir.getDosName(filename); return filename; } - static inline int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); } + static inline int16_t get() { int16_t out = (int16_t)file.read(); sdpos = file.curPosition(); return out; } static inline int16_t read(void* buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } static inline int16_t write(void* buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } @@ -244,7 +244,8 @@ private: static SdVolume volume; static SdFile file; - static uint32_t filesize, sdpos; + static uint32_t filesize, // Total size of the current file, in bytes + sdpos; // Index most recently read (one behind file.getPos) // // Procedure calls to other files diff --git a/buildroot/test-gcode/M808-loops.gcode b/buildroot/test-gcode/M808-loops.gcode new file mode 100644 index 0000000000..6248c9cc31 --- /dev/null +++ b/buildroot/test-gcode/M808-loops.gcode @@ -0,0 +1,16 @@ +; +; M808 Repeat Marker Test +; + +M808 L3 ; Marker at 54 + +M118 Outer Loop +M300 S220 P100 + +M808 L5 ; Marker at 111 + +M118 Inner Loop +M300 S110 P100 + +M808 +M808 diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index a968a5d213..da3a79f58c 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -107,7 +107,7 @@ restore_configs opt_set MOTHERBOARD BOARD_MEGACONTROLLER opt_set LCD_LANGUAGE de opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT \ - MINIPANEL SDSUPPORT PCA9632 LCD_INFO_MENU SOUND_MENU_ITEM \ + MINIPANEL SDSUPPORT PCA9632 LCD_INFO_MENU SOUND_MENU_ITEM GCODE_REPEAT_MARKERS \ AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT EXPERIMENTAL_I2CBUS M100_FREE_MEMORY_WATCHER \ diff --git a/platformio.ini b/platformio.ini index 062514c882..52310e6b81 100644 --- a/platformio.ini +++ b/platformio.ini @@ -101,6 +101,7 @@ default_src_filter = + - - + - - - - - + - - - - - - - @@ -182,6 +183,7 @@ default_src_filter = + - - + - - - + - - - - @@ -374,6 +376,7 @@ G38_PROBE_TARGET = src_filter=+ MAGNETIC_PARKING_EXTRUDER = src_filter=+ SDSUPPORT = src_filter=+ HAS_MEDIA_SUBCALLS = src_filter=+ +GCODE_REPEAT_MARKERS = src_filter=+ + HAS_EXTRUDERS = src_filter=+ + AUTO_REPORT_TEMPERATURES = src_filter=+ INCH_MODE_SUPPORT = src_filter=+ @@ -402,7 +405,7 @@ framework = arduino extra_scripts = ${common.extra_scripts} build_flags = ${common.build_flags} lib_deps = ${common.lib_deps} -monitor_speed = 250000 +monitor_speed = 115200 monitor_flags = --quiet --echo From 3c5c36de50ddba782161b8a246821505db4801b6 Mon Sep 17 00:00:00 2001 From: BsCmOD <64871957+BsCmOD@users.noreply.github.com> Date: Fri, 27 Nov 2020 04:25:18 +0100 Subject: [PATCH 0654/1370] FIX TMC menu message (#20294) --- Marlin/src/lcd/menu/menu_tmc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index 402ee41a1b..69193701eb 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -247,7 +247,7 @@ void menu_tmc_current() { void menu_tmc() { START_MENU(); - BACK_ITEM(MSG_CONTROL); + BACK_ITEM(MSG_ADVANCED_SETTINGS); SUBMENU(MSG_TMC_CURRENT, menu_tmc_current); #if ENABLED(HYBRID_THRESHOLD) SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs); From 04483dd30756c566652a2b5a0fd45c535dedac8c Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 27 Nov 2020 17:50:21 +1300 Subject: [PATCH 0655/1370] Fix BTT GTR 1.0 endstop/DIAG pins (#20296) --- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 51 ++++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 6c475faeb5..bfa4007658 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -46,15 +46,54 @@ #define PS_ON_PIN PH6 +// +// Trinamic Stallguard pins +// +#define X_DIAG_PIN PF2 // X- +#define Y_DIAG_PIN PC13 // Y- +#define Z_DIAG_PIN PE0 // Z- +#define E0_DIAG_PIN PG14 // X+ +#define E1_DIAG_PIN PG9 // Y+ +#define E2_DIAG_PIN PD3 // Z+ + // // Limit Switches // -#define X_MIN_PIN PF2 -#define X_MAX_PIN PG14 -#define Y_MIN_PIN PC13 -#define Y_MAX_PIN PG9 -#define Z_MIN_PIN PE0 -#define Z_MAX_PIN PD3 +#ifdef X_STALL_SENSITIVITY + #define X_STOP_PIN X_DIAG_PIN + #if X_HOME_DIR < 0 + #define X_MAX_PIN E0_DIAG_PIN // X+ + #else + #define X_MIN_PIN E0_DIAG_PIN // X+ + #endif +#else + #define X_MIN_PIN X_DIAG_PIN // X- + #define X_MAX_PIN E0_DIAG_PIN // X+ +#endif + +#ifdef Y_STALL_SENSITIVITY + #define Y_STOP_PIN Y_DIAG_PIN + #if Y_HOME_DIR < 0 + #define Y_MAX_PIN E1_DIAG_PIN // Y+ + #else + #define Y_MIN_PIN E1_DIAG_PIN // Y+ + #endif +#else + #define Y_MIN_PIN Y_DIAG_PIN // Y- + #define Y_MAX_PIN E1_DIAG_PIN // Y+ +#endif + +#ifdef Z_STALL_SENSITIVITY + #define Z_STOP_PIN Z_DIAG_PIN + #if Z_HOME_DIR < 0 + #define Z_MAX_PIN E2_DIAG_PIN // Z+ + #else + #define Z_MIN_PIN E2_DIAG_PIN // Z+ + #endif +#else + #define Z_MIN_PIN Z_DIAG_PIN // Z- + #define Z_MAX_PIN E2_DIAG_PIN // Z+ +#endif // // Pins on the extender From f63a7b978d3602d214c7396df6f46c4c41187668 Mon Sep 17 00:00:00 2001 From: yysh12 Date: Thu, 26 Nov 2020 23:29:07 -0600 Subject: [PATCH 0656/1370] =?UTF-8?q?Fix=20G2/G3=20arcs=20>=20180=C2=B0=20?= =?UTF-8?q?(#20292)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/gcode/motion/G2_G3.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index c713877a0e..b920e23073 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -77,16 +77,21 @@ void plan_arc( rt_Y = cart[q_axis] - center_Q, start_L = current_position[l_axis]; - // CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required. + // Angle of rotation between position and target from the circle center. float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y); - if (angular_travel < 0) angular_travel += RADIANS(360); + + // Make sure angular travel over 180 degrees goes the other way around. + switch (((angular_travel < 0) << 1) + clockwise) { + case 1: angular_travel -= RADIANS(360); break; // Positive but CW? Reverse direction. + case 2: angular_travel += RADIANS(360); break; // Negative but CCW? Reverse direction. + } + #ifdef MIN_ARC_SEGMENTS - uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * (angular_travel / RADIANS(360))); + uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * ABS(angular_travel) / RADIANS(360)); NOLESS(min_segments, 1U); #else constexpr uint16_t min_segments = 1; #endif - if (clockwise) angular_travel -= RADIANS(360); // Make a circle if the angular rotation is 0 and the target is current position if (NEAR_ZERO(angular_travel) && NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis])) { From a54b07d3aeb44fefd231923e99459de410457b09 Mon Sep 17 00:00:00 2001 From: Sergey1560 <53866542+Sergey1560@users.noreply.github.com> Date: Fri, 27 Nov 2020 09:00:25 +0300 Subject: [PATCH 0657/1370] Group related homing options (#20283) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 4 ++-- Marlin/Configuration_adv.h | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 3320e18abc..0e529b3462 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1099,8 +1099,8 @@ // @section homing -//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed - +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed. Also enable HOME_AFTER_DEACTIVATE for extra safety. +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated. Also enable NO_MOTION_BEFORE_HOMING for extra safety. //#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. //#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ... diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e6b76a4133..03c9ba55eb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -854,8 +854,6 @@ // If the Nozzle or Bed falls when the Z stepper is disabled, set its resting position here. //#define Z_AFTER_DEACTIVATE Z_HOME_POS -//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated - // Default Minimum Feedrates for printing and travel moves #define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. #define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. From 1dd17d857ed5ba7f07a55115484d1143ebec3c39 Mon Sep 17 00:00:00 2001 From: Thomas Niccolo Reyes Date: Sat, 28 Nov 2020 05:26:19 +0800 Subject: [PATCH 0658/1370] Fix M73 LCD code typo (#20300) --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 00968f4ba0..fabd403c6b 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -714,7 +714,7 @@ inline uint8_t draw_elapsed_or_remaining_time(uint8_t timepos, const bool blink) const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE); if (show_remain) { #if ENABLED(USE_M73_REMAINING_TIME) - duration_t remaining = get_remaining_time(); + duration_t remaining = ui.get_remaining_time(); #else uint8_t progress = ui.get_progress_percent(); uint32_t elapsed = print_job_timer.duration(); From 523bc7d355c2a288100b086bfb2b8067cc42e6d5 Mon Sep 17 00:00:00 2001 From: yysh12 Date: Sun, 29 Nov 2020 14:50:54 -0600 Subject: [PATCH 0659/1370] Arc Direction followup for circles (#20314) --- Marlin/src/gcode/motion/G2_G3.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index b920e23073..469d726df9 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -80,24 +80,26 @@ void plan_arc( // Angle of rotation between position and target from the circle center. float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y); - // Make sure angular travel over 180 degrees goes the other way around. - switch (((angular_travel < 0) << 1) + clockwise) { - case 1: angular_travel -= RADIANS(360); break; // Positive but CW? Reverse direction. - case 2: angular_travel += RADIANS(360); break; // Negative but CCW? Reverse direction. - } - #ifdef MIN_ARC_SEGMENTS - uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * ABS(angular_travel) / RADIANS(360)); - NOLESS(min_segments, 1U); + uint16_t min_segments = MIN_ARC_SEGMENTS; #else constexpr uint16_t min_segments = 1; #endif - // Make a circle if the angular rotation is 0 and the target is current position - if (NEAR_ZERO(angular_travel) && NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis])) { - angular_travel = RADIANS(360); + // Do a full circle if angular rotation is near 0 and the target is current position + if ((!angular_travel || NEAR_ZERO(angular_travel)) && NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis])) { + // Preserve direction for circles + angular_travel = clockwise ? -RADIANS(360) : RADIANS(360); + } + else { + // Make sure angular travel over 180 degrees goes the other way around. + switch (((angular_travel < 0) << 1) | clockwise) { + case 1: angular_travel -= RADIANS(360); break; // Positive but CW? Reverse direction. + case 2: angular_travel += RADIANS(360); break; // Negative but CCW? Reverse direction. + } #ifdef MIN_ARC_SEGMENTS - min_segments = MIN_ARC_SEGMENTS; + min_segments = CEIL(min_segments * ABS(angular_travel) / RADIANS(360)); + NOLESS(min_segments, 1U); #endif } From a8ba3c4e2ef3d4f521009181aef59166d36c9a40 Mon Sep 17 00:00:00 2001 From: "Alexander D. Kanevskiy" Date: Sun, 29 Nov 2020 22:55:18 +0200 Subject: [PATCH 0660/1370] SKR E3 Turbo Controller Fan (#20320) --- Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 6d6d7557f5..097a41347c 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -173,6 +173,10 @@ #define FAN_PIN P2_01 #define FAN1_PIN P2_02 +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN FAN1_PIN +#endif + /** * _____ * 5V | 1 2 | GND From 272265c6364913b7797045a0cd01a83563873c7a Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 29 Nov 2020 12:57:05 -0800 Subject: [PATCH 0661/1370] Fix STM32F1 'freeMemory()' warnings (#20319) --- Marlin/src/HAL/STM32F1/HAL.h | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 06f75662cf..226c8ca9b2 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -202,17 +202,9 @@ extern "C" { extern "C" char* _sbrk(int incr); -/* -static int freeMemory() { - volatile int top; - top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); - return top; -} -*/ - -static int freeMemory() { +static inline int freeMemory() { volatile char top; - return &top - reinterpret_cast(_sbrk(0)); + return &top - _sbrk(0); } #if GCC_VERSION <= 50000 From f22b677906a4c410de39060136f344ac2ba0fe06 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 29 Nov 2020 13:00:08 -0800 Subject: [PATCH 0662/1370] Leveling Fade Height default setting (#20316) --- Marlin/Configuration.h | 3 +++ Marlin/src/inc/Conditionals_post.h | 4 ++++ Marlin/src/module/settings.cpp | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0e529b3462..ebc3311d9e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1291,6 +1291,9 @@ // at which point movement will be level to the machine's XY plane. // The height can be set with M420 Z #define ENABLE_LEVELING_FADE_HEIGHT + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + #define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height. + #endif // For Cartesian machines, instead of dividing moves on mesh boundaries, // split up moves into short segments like a Delta. This follows the diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 35fd92e10b..dfecd57749 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2448,6 +2448,10 @@ #endif #endif +#ifndef DEFAULT_LEVELING_FADE_HEIGHT + #define DEFAULT_LEVELING_FADE_HEIGHT 0.0 +#endif + #if ENABLED(SEGMENT_LEVELED_MOVES) && !defined(LEVELED_SEGMENT_LENGTH) #define LEVELED_SEGMENT_LENGTH 5 #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c49c643b60..c6eee271a0 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -696,7 +696,7 @@ void MarlinSettings::postprocess() { // Global Leveling // { - const float zfh = TERN(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height, 10.0f); + const float zfh = TERN(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height, (DEFAULT_LEVELING_FADE_HEIGHT)); EEPROM_WRITE(zfh); } @@ -2588,7 +2588,7 @@ void MarlinSettings::reset() { // // Global Leveling // - TERN_(ENABLE_LEVELING_FADE_HEIGHT, new_z_fade_height = 0.0); + TERN_(ENABLE_LEVELING_FADE_HEIGHT, new_z_fade_height = (DEFAULT_LEVELING_FADE_HEIGHT)); TERN_(HAS_LEVELING, reset_bed_level()); #if HAS_BED_PROBE From 448cf2c3574ad5f406355a7b2f75a509ee0a92ba Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 29 Nov 2020 19:06:40 -0600 Subject: [PATCH 0663/1370] Adjust axis homed / trusted methods (#20323) --- Marlin/src/gcode/calibrate/G28.cpp | 9 ++--- Marlin/src/gcode/calibrate/G34.cpp | 2 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/gcode/feature/pause/M600.cpp | 2 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 12 ++---- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 18 +++------ Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 18 +++------ Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 18 +++------ .../lcd/dogm/status_screen_lite_ST7920.cpp | 11 +++-- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 3 +- Marlin/src/lcd/extui/ui_api.cpp | 12 +++--- Marlin/src/lcd/menu/menu.cpp | 3 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/lcd/tft/ui_320x240.cpp | 31 ++++++-------- Marlin/src/lcd/tft/ui_480x320.cpp | 31 ++++++-------- Marlin/src/module/motion.cpp | 35 ++++++++-------- Marlin/src/module/motion.h | 40 +++++++++++-------- Marlin/src/module/probe.cpp | 4 +- Marlin/src/module/stepper/indirection.h | 8 ++-- 22 files changed, 118 insertions(+), 149 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index c4effe7d58..c17d6dcc8b 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -319,15 +319,14 @@ void GcodeSuite::G28() { #endif - const float z_homing_height = - ENABLED(UNKNOWN_Z_NO_RAISE) && !TEST(axis_known_position, Z_AXIS) - ? 0 - : (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT); + const float z_homing_height = TERN1(UNKNOWN_Z_NO_RAISE, axis_is_trusted(Z_AXIS)) + ? (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) + : 0; if (z_homing_height && (doX || doY || TERN0(Z_SAFE_HOMING, doZ))) { // Raise Z before homing any other axes and z is not already high enough (never lower z) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); - do_z_clearance(z_homing_height, true, DISABLED(UNKNOWN_Z_NO_RAISE)); + do_z_clearance(z_homing_height, axis_is_trusted(Z_AXIS), DISABLED(UNKNOWN_Z_NO_RAISE)); } #if ENABLED(QUICK_HOME) diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index 315b2d7333..85e843c2c8 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -39,7 +39,7 @@ void GcodeSuite::G34() { // Home before the alignment procedure - if (!all_axes_known()) home_all_axes(); + if (!all_axes_trusted()) home_all_axes(); SET_SOFT_ENDSTOP_LOOSE(true); TEMPORARY_BED_LEVELING_STATE(false); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 8d3dd0d06b..840d04f29e 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -167,7 +167,7 @@ void GcodeSuite::G34() { ); // Home before the alignment procedure - if (!all_axes_known()) home_all_axes(); + if (!all_axes_trusted()) home_all_axes(); // Move the Z coordinate realm towards the positive - dirty trick current_position.z += z_probe * 0.5f; diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index e676ed38a4..bdaec7c7f9 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -102,7 +102,7 @@ void GcodeSuite::M600() { #if ENABLED(HOME_BEFORE_FILAMENT_CHANGE) // If needed, home before parking for filament change - if (!all_axes_known()) home_all_axes(); + if (!all_axes_trusted()) home_all_axes(); #endif #if HAS_MULTI_EXTRUDER diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index a100d462da..a889da8aea 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -59,10 +59,8 @@ void GcodeSuite::M701() { xyz_pos_t park_point = NOZZLE_PARK_POINT; - #if ENABLED(NO_MOTION_BEFORE_HOMING) - // Don't raise Z if the machine isn't homed - if (axes_should_home()) park_point.z = 0; - #endif + // Don't raise Z if the machine isn't homed + if (TERN0(NO_MOTION_BEFORE_HOMING, axes_should_home())) park_point.z = 0; #if ENABLED(MIXING_EXTRUDER) const int8_t target_e_stepper = get_target_e_stepper_from_command(); @@ -147,10 +145,8 @@ void GcodeSuite::M701() { void GcodeSuite::M702() { xyz_pos_t park_point = NOZZLE_PARK_POINT; - #if ENABLED(NO_MOTION_BEFORE_HOMING) - // Don't raise Z if the machine isn't homed - if (axes_should_home()) park_point.z = 0; - #endif + // Don't raise Z if the machine isn't homed + if (TERN0(NO_MOTION_BEFORE_HOMING, axes_should_home())) park_point.z = 0; #if ENABLED(MIXING_EXTRUDER) const uint8_t old_mixing_tool = mixer.get_current_vtool(); diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index fabd403c6b..84c477fbde 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -506,18 +506,12 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const lcd_put_wchar('X' + uint8_t(axis)); if (blink) lcd_put_u8str(value); - else { - if (!TEST(axis_homed, axis)) - while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); - else { - #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) - if (!TEST(axis_known_position, axis)) - lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); - else - #endif - lcd_put_u8str(value); - } - } + else if (axis_should_home(axis)) + while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); + else if (NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) && !axis_is_trusted(axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + lcd_put_u8str(value); } FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 74be828c72..cadd693f6f 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -422,18 +422,12 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const lcd.write('X' + uint8_t(axis)); if (blink) lcd.print(value); - else { - if (!TEST(axis_homed, axis)) - while (const char c = *value++) lcd.write(c <= '.' ? c : '?'); - else { - #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) - if (!TEST(axis_known_position, axis)) - lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); - else - #endif - lcd_put_u8str(value); - } - } + else if (axis_should_home(axis)) + while (const char c = *value++) lcd.write(c <= '.' ? c : '?'); + else if (NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) && !axis_is_trusted(axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + lcd_put_u8str(value); } FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *prefix, const bool blink) { diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 882b2fef50..29acb86941 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -384,18 +384,12 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const if (blink) lcd_put_u8str(value); - else { - if (!TEST(axis_homed, axis)) - while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); - else { - #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) - if (!TEST(axis_known_position, axis)) - lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); - else - #endif - lcd_put_u8str(value); - } - } + else if (axis_should_home(axis)) + while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); + else if (NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) && !axis_is_trusted(axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + lcd_put_u8str(value); } /** diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index c06080f601..a538121d2c 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -659,13 +659,13 @@ void ST7920_Lite_Status_Screen::draw_status_message() { #endif } -void ST7920_Lite_Status_Screen::draw_position(const xyze_pos_t &pos, const bool position_known) { +void ST7920_Lite_Status_Screen::draw_position(const xyze_pos_t &pos, const bool position_trusted) { char str[7]; set_ddram_address(DDRAM_LINE_4); begin_data(); // If position is unknown, flash the labels. - const unsigned char alt_label = position_known ? 0 : (ui.get_blink() ? ' ' : 0); + const unsigned char alt_label = position_trusted ? 0 : (ui.get_blink() ? ' ' : 0); if (TERN1(LCD_SHOW_E_TOTAL, !printingIsActive())) { write_byte(alt_label ? alt_label : 'X'); @@ -831,9 +831,8 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { } } - if (countdown == 0 && (forceUpdate || position_changed() - || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed()) - )) draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 1, all_axes_known())); + if (countdown == 0 && (forceUpdate || position_changed() || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed()))) + draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 1, all_axes_trusted())); #endif } @@ -855,7 +854,7 @@ void ST7920_Lite_Status_Screen::update_progress(const bool forceUpdate) { UNUSED(forceUpdate); - #endif // LCD_SET_PROGRESS_MANUALLY || SDSUPPORT + #endif } void ST7920_Lite_Status_Screen::update(const bool forceUpdate) { diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index fe2397fa6b..e9e6ef69e5 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1281,8 +1281,7 @@ void HMI_Move_Z() { last_zoffset = dwin_zoffset; dwin_zoffset = HMI_ValueStruct.offset_value / 100.0f; #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) - if ( (ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_known()) && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()) ) - babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset); + if (BABYSTEP_ALLOWED()) babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset); #endif DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(zoff_line), HMI_ValueStruct.offset_value); DWIN_UpdateLCD(); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 1583db41e9..1877914bfb 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -356,9 +356,9 @@ namespace ExtUI { bool canMove(const axis_t axis) { switch (axis) { #if IS_KINEMATIC || ENABLED(NO_MOTION_BEFORE_HOMING) - case X: return TEST(axis_homed, X_AXIS); - case Y: return TEST(axis_homed, Y_AXIS); - case Z: return TEST(axis_homed, Z_AXIS); + case X: return axis_should_home(X_AXIS); + case Y: return axis_should_home(Y_AXIS); + case Z: return axis_should_home(Z_AXIS); #else case X: case Y: case Z: return true; #endif @@ -889,9 +889,9 @@ namespace ExtUI { bool commandsInQueue() { return (planner.movesplanned() || queue.has_commands_queued()); } - bool isAxisPositionKnown(const axis_t axis) { return TEST(axis_known_position, axis); } - bool isAxisPositionKnown(const extruder_t) { return TEST(axis_known_position, E_AXIS); } - bool isPositionKnown() { return all_axes_known(); } + bool isAxisPositionKnown(const axis_t axis) { return axis_is_trusted((AxisEnum)axis); } + bool isAxisPositionKnown(const extruder_t) { return axis_is_trusted(E_AXIS); } + bool isPositionKnown() { return all_axes_trusted(); } bool isMachineHomed() { return all_axes_homed(); } PGM_P getFirmwareName_str() { diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 1497940ffe..add306b6e3 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -188,8 +188,7 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co doubleclick_expire_ms = millis() + DOUBLECLICK_MAX_INTERVAL; } else if (screen == status_screen && currentScreen == menu_main && PENDING(millis(), doubleclick_expire_ms)) { - if ( (ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_known()) - && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()) ) + if (BABYSTEP_ALLOWED()) screen = TERN(BABYSTEP_ZPROBE_OFFSET, lcd_babystep_zoffset, lcd_babystep_z); else { #if ENABLED(MOVE_Z_WHEN_IDLE) diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 52d2d0ec3d..ad91c404aa 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -230,7 +230,7 @@ static inline void _lcd_level_bed_corners_homing() { void _lcd_level_bed_corners() { ui.defer_status_screen(); - if (!all_axes_known()) { + if (!all_axes_trusted()) { set_all_unhomed(); queue.inject_P(G28_STR); } diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index d089b2125a..64dca3b04f 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -237,7 +237,7 @@ * Save Settings (Req: EEPROM_SETTINGS) */ void menu_bed_leveling() { - const bool is_homed = all_axes_known(), + const bool is_homed = all_axes_trusted(), is_valid = leveling_is_valid(); START_MENU(); diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 2c3af1e5ee..7b95f435ba 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -164,7 +164,7 @@ void menu_advanced_settings(); void menu_tool_offsets() { auto _recalc_offsets = []{ - if (active_extruder && all_axes_known()) { // For the 2nd extruder re-home so the next tool-change gets the new offsets. + if (active_extruder && all_axes_trusted()) { // For the 2nd extruder re-home so the next tool-change gets the new offsets. queue.inject_P(G28_STR); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary. active_extruder = 0; } diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 5dce47eec2..eb19e96626 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -524,7 +524,7 @@ void _ubl_map_screen_homing() { */ void _ubl_goto_map_screen() { if (planner.movesplanned()) return; // The ACTION_ITEM will do nothing - if (!all_axes_known()) { + if (!all_axes_trusted()) { set_all_unhomed(); queue.inject_P(G28_STR); } diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 45a91cd5e5..51f65c59b5 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -257,42 +257,37 @@ void MarlinUI::draw_status_screen() { tft.set_background(COLOR_BACKGROUND); tft.add_rectangle(0, 0, 312, 24, COLOR_AXIS_HOMED); - uint16_t color; - uint16_t offset; - bool is_homed; - tft.add_text( 10, 3, COLOR_AXIS_HOMED , "X"); tft.add_text(127, 3, COLOR_AXIS_HOMED , "Y"); tft.add_text(219, 3, COLOR_AXIS_HOMED , "Z"); - is_homed = TEST(axis_homed, X_AXIS); - tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); - tft.add_text( 68 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + bool not_homed = axis_should_home(X_AXIS); + tft_string.set(blink && not_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft.add_text( 68 - tft_string.width(), 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); - is_homed = TEST(axis_homed, Y_AXIS); - tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); - tft.add_text(185 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + not_homed = axis_should_home(Y_AXIS); + tft_string.set(blink && not_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text(185 - tft_string.width(), 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); - is_homed = TEST(axis_homed, Z_AXIS); - if (blink & !is_homed) { + not_homed = axis_should_home(Z_AXIS); + uint16_t offset = 25; + if (blink && not_homed) tft_string.set("?"); - offset = 25; // ".00" - } else { const float z = LOGICAL_Z_POSITION(current_position.z); tft_string.set(ftostr52sp((int16_t)z)); tft_string.rtrim(); - offset = tft_string.width(); + offset += tft_string.width(); tft_string.set(ftostr52sp(z)); - offset += 25 - tft_string.width(); + offset -= tft_string.width(); } - tft.add_text(301 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + tft.add_text(301 - tft_string.width() - offset, 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); // feed rate tft.canvas(70, 136, 80, 32); tft.set_background(COLOR_BACKGROUND); - color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; tft.add_image(0, 0, imgFeedRate, color); tft_string.set(i16tostr3rj(feedrate_percentage)); tft_string.add('%'); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index d152acdf77..343d187d26 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -262,43 +262,38 @@ void MarlinUI::draw_status_screen() { tft.set_background(COLOR_BACKGROUND); tft.add_rectangle(0, 0, TFT_WIDTH - 8, 34, COLOR_AXIS_HOMED); - uint16_t color; - uint16_t offset; - bool is_homed; - tft.add_text( 16, 3, COLOR_AXIS_HOMED , "X"); tft.add_text(192, 3, COLOR_AXIS_HOMED , "Y"); tft.add_text(330, 3, COLOR_AXIS_HOMED , "Z"); - is_homed = TEST(axis_homed, X_AXIS); - tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); - tft.add_text(102 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + bool not_homed = axis_should_home(X_AXIS); + tft_string.set(blink && not_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft.add_text(102 - tft_string.width(), 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); - is_homed = TEST(axis_homed, Y_AXIS); - tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); - tft.add_text(280 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + not_homed = axis_should_home(Y_AXIS); + tft_string.set(blink && not_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text(280 - tft_string.width(), 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); - is_homed = TEST(axis_homed, Z_AXIS); - if (blink & !is_homed) { + uint16_t offset = 32; + not_homed = axis_should_home(Z_AXIS); + if (blink && not_homed) tft_string.set("?"); - offset = 32; // ".00" - } else { const float z = LOGICAL_Z_POSITION(current_position.z); tft_string.set(ftostr52sp((int16_t)z)); tft_string.rtrim(); - offset = tft_string.width(); + offset += tft_string.width(); tft_string.set(ftostr52sp(z)); - offset += 32 - tft_string.width(); + offset -= tft_string.width(); } - tft.add_text(455 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + tft.add_text(455 - tft_string.width() - offset, 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, 132, TFT_WIDTH - 8, 34)); // feed rate tft.canvas(96, 180, 100, 32); tft.set_background(COLOR_BACKGROUND); - color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; tft.add_image(0, 0, imgFeedRate, color); tft_string.set(i16tostr3rj(feedrate_percentage)); tft_string.add('%'); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 03c8ddc462..3a01cda5c1 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -79,11 +79,11 @@ * Flags that each linear axis was homed. * XYZ on cartesian, ABC on delta, ABZ on SCARA. * - * axis_known_position - * Flags that the position is known in each linear axis. Set when homed. + * axis_trusted + * Flags that the position is trusted in each linear axis. Set when homed. * Cleared whenever a stepper powers off, potentially losing its position. */ -uint8_t axis_homed, axis_known_position; // = 0 +uint8_t axis_homed, axis_trusted; // = 0 // Relative Mode. Enable with G91, disable with G90. bool relative_mode; // = false; @@ -506,8 +506,8 @@ void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRat do_blocking_move_to(raw.x, raw.y, z, fr_mm_s); } -void do_z_clearance(const float &zclear, const bool z_known/*=true*/, const bool raise_on_unknown/*=true*/, const bool lower_allowed/*=false*/) { - const bool rel = raise_on_unknown && !z_known; +void do_z_clearance(const float &zclear, const bool z_trusted/*=true*/, const bool raise_on_untrusted/*=true*/, const bool lower_allowed/*=false*/) { + const bool rel = raise_on_untrusted && !z_trusted; float zdest = zclear + (rel ? current_position.z : 0.0f); if (!lower_allowed) NOLESS(zdest, current_position.z); do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), MMM_TO_MMS(TERN(HAS_BED_PROBE, Z_PROBE_SPEED_FAST, HOMING_FEEDRATE_Z))); @@ -649,7 +649,7 @@ void restore_feedrate_and_scaling() { constexpr xy_pos_t offs{0}; #endif - if (TERN1(IS_SCARA, TEST(axis_homed, X_AXIS) && TEST(axis_homed, Y_AXIS))) { + if (TERN1(IS_SCARA, axis_was_homed(X_AXIS) && axis_was_homed(Y_AXIS))) { const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y); if (dist_2 > delta_max_radius_2) target *= float(delta_max_radius / SQRT(dist_2)); // 200 / 300 = 0.66 @@ -657,7 +657,7 @@ void restore_feedrate_and_scaling() { #else - if (TEST(axis_homed, X_AXIS)) { + if (axis_was_homed(X_AXIS)) { #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X) NOLESS(target.x, soft_endstop.min.x); #endif @@ -666,7 +666,7 @@ void restore_feedrate_and_scaling() { #endif } - if (TEST(axis_homed, Y_AXIS)) { + if (axis_was_homed(Y_AXIS)) { #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y) NOLESS(target.y, soft_endstop.min.y); #endif @@ -677,7 +677,7 @@ void restore_feedrate_and_scaling() { #endif - if (TEST(axis_homed, Z_AXIS)) { + if (axis_was_homed(Z_AXIS)) { #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z) NOLESS(target.z, soft_endstop.min.z); #endif @@ -1124,10 +1124,11 @@ void prepare_line_to_destination() { } uint8_t axes_should_home(uint8_t axis_bits/*=0x07*/) { + #define SHOULD_HOME(A) TERN(HOME_AFTER_DEACTIVATE, axis_is_trusted, axis_was_homed)(A) // Clear test bits that are trusted - if (TEST(axis_bits, X_AXIS) && TEST(axis_homed, X_AXIS)) CBI(axis_bits, X_AXIS); - if (TEST(axis_bits, Y_AXIS) && TEST(axis_homed, Y_AXIS)) CBI(axis_bits, Y_AXIS); - if (TEST(axis_bits, Z_AXIS) && TEST(axis_homed, Z_AXIS)) CBI(axis_bits, Z_AXIS); + if (TEST(axis_bits, X_AXIS) && SHOULD_HOME(X_AXIS)) CBI(axis_bits, X_AXIS); + if (TEST(axis_bits, Y_AXIS) && SHOULD_HOME(Y_AXIS)) CBI(axis_bits, Y_AXIS); + if (TEST(axis_bits, Z_AXIS) && SHOULD_HOME(Z_AXIS)) CBI(axis_bits, Z_AXIS); return axis_bits; } @@ -1388,7 +1389,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t * * DELTA should wait until all homing is done before setting the XYZ * current_position to home, because homing is a single operation. - * In the case where the axis positions are already known and previously + * In the case where the axis positions are trusted and previously * homed, DELTA could home to X or Y individually by moving either one * to the center. However, homing Z always homes XY and Z. * @@ -1401,8 +1402,8 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t void set_axis_is_at_home(const AxisEnum axis) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_is_at_home(", axis_codes[axis], ")"); - SBI(axis_known_position, axis); - SBI(axis_homed, axis); + set_axis_trusted(axis); + set_axis_homed(axis); #if ENABLED(DUAL_X_CARRIAGE) if (axis == X_AXIS && (active_extruder == 1 || dual_x_carriage_mode == DXC_DUPLICATION_MODE)) { @@ -1462,8 +1463,8 @@ void set_axis_is_at_home(const AxisEnum axis) { void set_axis_never_homed(const AxisEnum axis) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); - CBI(axis_known_position, axis); - CBI(axis_homed, axis); + set_axis_untrusted(axis); + set_axis_unhomed(axis); if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index abc59f92b8..efbfd7de4d 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -34,19 +34,6 @@ #include "scara.h" #endif -// Axis homed and known-position states -extern uint8_t axis_homed, axis_known_position; -constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); -FORCE_INLINE bool no_axes_homed() { return !axis_homed; } -FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } -FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } -FORCE_INLINE void set_all_homed() { axis_homed = axis_known_position = xyz_bits; } -FORCE_INLINE void set_all_unhomed() { axis_homed = axis_known_position = 0; } - -FORCE_INLINE bool homing_needed() { - return !TERN(HOME_AFTER_DEACTIVATE, all_axes_known, all_axes_homed)(); -} - // Error margin to work around float imprecision constexpr float fslop = 0.0001; @@ -269,23 +256,42 @@ void remember_feedrate_and_scaling(); void remember_feedrate_scaling_off(); void restore_feedrate_and_scaling(); -void do_z_clearance(const float &zclear, const bool z_known=true, const bool raise_on_unknown=true, const bool lower_allowed=false); +void do_z_clearance(const float &zclear, const bool z_trusted=true, const bool raise_on_untrusted=true, const bool lower_allowed=false); + +/** + * Homing and Trusted Axes + */ +constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); +extern uint8_t axis_homed, axis_trusted; -// -// Homing -// void homeaxis(const AxisEnum axis); void set_axis_is_at_home(const AxisEnum axis); void set_axis_never_homed(const AxisEnum axis); uint8_t axes_should_home(uint8_t axis_bits=0x07); bool homing_needed_error(uint8_t axis_bits=0x07); +FORCE_INLINE bool axis_was_homed(const AxisEnum axis) { return TEST(axis_homed, axis); } +FORCE_INLINE bool axis_is_trusted(const AxisEnum axis) { return TEST(axis_trusted, axis); } +FORCE_INLINE bool axis_should_home(const AxisEnum axis) { return (axes_should_home() & _BV(axis)) != 0; } +FORCE_INLINE bool no_axes_homed() { return !axis_homed; } +FORCE_INLINE bool all_axes_homed() { return xyz_bits == (axis_homed & xyz_bits); } +FORCE_INLINE bool homing_needed() { return !all_axes_homed(); } +FORCE_INLINE bool all_axes_trusted() { return xyz_bits == (axis_trusted & xyz_bits); } +FORCE_INLINE void set_axis_homed(const AxisEnum axis) { SBI(axis_homed, axis); } +FORCE_INLINE void set_axis_unhomed(const AxisEnum axis) { CBI(axis_homed, axis); } +FORCE_INLINE void set_axis_trusted(const AxisEnum axis) { SBI(axis_trusted, axis); } +FORCE_INLINE void set_axis_untrusted(const AxisEnum axis) { CBI(axis_trusted, axis); } +FORCE_INLINE void set_all_homed() { axis_homed = axis_trusted = xyz_bits; } +FORCE_INLINE void set_all_unhomed() { axis_homed = axis_trusted = 0; } + #if ENABLED(NO_MOTION_BEFORE_HOMING) #define MOTION_CONDITIONS (IsRunning() && !homing_needed_error()) #else #define MOTION_CONDITIONS IsRunning() #endif +#define BABYSTEP_ALLOWED() ((ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_trusted()) && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy())) + /** * Workspace offsets */ diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 11447d7129..400206f83a 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -350,7 +350,7 @@ bool Probe::set_deployed(const bool deploy) { // For beds that fall when Z is powered off only raise for trusted Z #if ENABLED(UNKNOWN_Z_NO_RAISE) - const bool unknown_condition = TEST(axis_known_position, Z_AXIS); + const bool unknown_condition = axis_is_trusted(Z_AXIS); #else constexpr float unknown_condition = true; #endif @@ -510,7 +510,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { // Stop the probe before it goes too low to prevent damage. // If Z isn't known then probe to -10mm. - const float z_probe_low_point = TEST(axis_known_position, Z_AXIS) ? -offset.z + Z_PROBE_LOW_POINT : -10.0; + const float z_probe_low_point = axis_is_trusted(Z_AXIS) ? -offset.z + Z_PROBE_LOW_POINT : -10.0; // Double-probing does a fast probe followed by a slow probe #if TOTAL_PROBING == 2 diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index d14bfc7329..4346e9d6cc 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -856,13 +856,11 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #define ENABLE_AXIS_X() if (SHOULD_ENABLE(x)) { ENABLE_STEPPER_X(); ENABLE_STEPPER_X2(); AFTER_CHANGE(x, true); } -#define DISABLE_AXIS_X() if (SHOULD_DISABLE(x)) { DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); AFTER_CHANGE(x, false); FORGET_AXIS(X_AXIS); } +#define DISABLE_AXIS_X() if (SHOULD_DISABLE(x)) { DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); AFTER_CHANGE(x, false); set_axis_untrusted(X_AXIS); } #define ENABLE_AXIS_Y() if (SHOULD_ENABLE(y)) { ENABLE_STEPPER_Y(); ENABLE_STEPPER_Y2(); AFTER_CHANGE(y, true); } -#define DISABLE_AXIS_Y() if (SHOULD_DISABLE(y)) { DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); AFTER_CHANGE(y, false); FORGET_AXIS(Y_AXIS); } +#define DISABLE_AXIS_Y() if (SHOULD_DISABLE(y)) { DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); AFTER_CHANGE(y, false); set_axis_untrusted(Y_AXIS); } #define ENABLE_AXIS_Z() if (SHOULD_ENABLE(z)) { ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); AFTER_CHANGE(z, true); } -#define DISABLE_AXIS_Z() if (SHOULD_DISABLE(z)) { DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); AFTER_CHANGE(z, false); FORGET_AXIS(Z_AXIS); Z_RESET(); } - -#define FORGET_AXIS(A) TERN(HOME_AFTER_DEACTIVATE, set_axis_never_homed(A), CBI(axis_known_position, A)) +#define DISABLE_AXIS_Z() if (SHOULD_DISABLE(z)) { DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); AFTER_CHANGE(z, false); set_axis_untrusted(Z_AXIS); Z_RESET(); } #ifdef Z_AFTER_DEACTIVATE #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; sync_plan_position(); }while(0) From 74c509d36e796d1459361f031a47e9fbf9980ef4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 29 Nov 2020 20:49:42 -0600 Subject: [PATCH 0664/1370] General cleanup --- Marlin/src/feature/bedlevel/abl/abl.cpp | 2 +- Marlin/src/feature/power_monitor.cpp | 4 ++-- Marlin/src/feature/power_monitor.h | 4 ++-- Marlin/src/gcode/feature/controllerfan/M710.cpp | 4 ++-- Marlin/src/gcode/feature/power_monitor/M430.cpp | 4 ++-- Marlin/src/lcd/menu/menu_power_monitor.cpp | 4 ++-- Marlin/src/pins/ramps/pins_RAMPS_S_12.h | 2 +- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index 44e4fc38a1..3fb0cfc358 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -168,7 +168,7 @@ void print_bilinear_leveling_grid() { // cancelled out in bed_level_virt_cmr and does not impact the result. Return 0.0 rather than // making this function more complex by extrapolating two points. return 0.0; - } + } if (!x || x == ABL_TEMP_POINTS_X - 1) { if (x) { ep = GRID_MAX_POINTS_X - 1; diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp index e1e7324fb6..97c4a93363 100644 --- a/Marlin/src/feature/power_monitor.cpp +++ b/Marlin/src/feature/power_monitor.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index a0eaf353f4..f378ee2a10 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/gcode/feature/controllerfan/M710.cpp b/Marlin/src/gcode/feature/controllerfan/M710.cpp index 67d4ad8abf..cc450732ba 100644 --- a/Marlin/src/gcode/feature/controllerfan/M710.cpp +++ b/Marlin/src/gcode/feature/controllerfan/M710.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp index 7639ea962d..9559404456 100644 --- a/Marlin/src/gcode/feature/power_monitor/M430.cpp +++ b/Marlin/src/gcode/feature/power_monitor/M430.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp index e88bdb28d8..d31ebd36b2 100644 --- a/Marlin/src/lcd/menu/menu_power_monitor.cpp +++ b/Marlin/src/lcd/menu/menu_power_monitor.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h index 42b665ce86..1bcf310bc1 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h @@ -263,7 +263,7 @@ #ifndef SD_DETECT_PIN #define SD_DETECT_PIN 38 #endif - + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder #endif diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index 05b8b19a8a..7541f82729 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -243,7 +243,7 @@ #endif // Use the on-board card socket labeled SD_Extender -#if SD_CONNECTION_IS(CUSTOM_CABLE) +#if SD_CONNECTION_IS(CUSTOM_CABLE) #define SCK_PIN PC12 #define MISO_PIN PC8 #define MOSI_PIN PD2 @@ -300,7 +300,7 @@ #define FSMC_DMA_CHANNEL DMA_CH5 #define TFT_BUFFER_SIZE 14400 - #if ENABLED(TFT_CLASSIC_UI) + #if ENABLED(TFT_CLASSIC_UI) #define TFT_MARLINBG_COLOR 0x3186 // White #define TFT_MARLINUI_COLOR 0xC7B6 // green #define TFT_BTARROWS_COLOR 0xDEE6 // Yellow From d34bbee30431b4ae3b243706e69df6d14cbc0d2b Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 30 Nov 2020 04:44:34 -0800 Subject: [PATCH 0665/1370] Increase E3V2 DWIN steps/mm range to 999.9 (#20324) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index e9e6ef69e5..7e2259e17f 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -186,7 +186,6 @@ bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; -constexpr float default_axis_steps_per_unit[] = DEFAULT_AXIS_STEPS_PER_UNIT; uint8_t Percentrecord = 0; uint16_t remain_time = 0; @@ -1522,7 +1521,7 @@ void HMI_StepXYZE() { } // Step limit if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[HMI_flag.step_axis] * 2 * MINUNITMULT); + NOMORE(HMI_ValueStruct.Max_Step, 999.9 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); // Step value DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); From f929123a7b10e8bfcaafdc09f7a3368cb2e41bdb Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 30 Nov 2020 22:25:44 -0800 Subject: [PATCH 0666/1370] Prevent Watchdog reset writing Creality 4.x EEPROM (#20328) --- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp index 94b5e099bd..09fe8f9103 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -48,6 +48,8 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + size_t written = 0; + while (size--) { uint8_t v = *value; uint8_t * const p = (uint8_t * const)pos; @@ -55,7 +57,10 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui // so only write bytes that have changed! if (v != eeprom_read_byte(p)) { eeprom_write_byte(p, v); - delay(2); + if (++written % 128 == 0) + safe_delay(2); // Avoid triggering watchdog during long EEPROM writes + else + delay(2); if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; From e927ef94a66a17ceae611fd8b3b2787531308958 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 1 Dec 2020 00:29:21 -0800 Subject: [PATCH 0667/1370] Fix E3V2 Control Menu when returning from Info (#20338) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 7e2259e17f..a96b1dcb73 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -726,14 +726,14 @@ inline void Draw_Control_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_CONTROL)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); #endif - if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_INFO), F("Info")); + if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_INFO), F("Info")); #else DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control" DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > From 29a962320c3fab8dee7bf6b36b5b0841c78288e8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 1 Dec 2020 16:14:30 -0600 Subject: [PATCH 0668/1370] Tweak to EEPROM safe delay --- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp index 09fe8f9103..9a7e4d799d 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -48,8 +48,6 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - size_t written = 0; - while (size--) { uint8_t v = *value; uint8_t * const p = (uint8_t * const)pos; @@ -57,10 +55,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui // so only write bytes that have changed! if (v != eeprom_read_byte(p)) { eeprom_write_byte(p, v); - if (++written % 128 == 0) - safe_delay(2); // Avoid triggering watchdog during long EEPROM writes - else - delay(2); + if (size & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; From c76f1794872a312d58ec5a9dae3999681241c854 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 1 Dec 2020 21:53:23 -0600 Subject: [PATCH 0669/1370] Level Bed Corners is a sub-menu --- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 478608e9b3..42fdbfceda 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -400,7 +400,7 @@ void menu_motion() { #endif #if ENABLED(LEVEL_BED_CORNERS) && DISABLED(LCD_BED_LEVELING) - ACTION_ITEM(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); + SUBMENU(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); #endif #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) From 564e2e865c88ebe1751e36d807594f16689549f4 Mon Sep 17 00:00:00 2001 From: Mathias Rasmussen Date: Wed, 2 Dec 2020 06:51:04 +0100 Subject: [PATCH 0670/1370] Update to STM32 v10, optimize build (#20325) --- platformio.ini | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/platformio.ini b/platformio.ini index 52310e6b81..b26ece4026 100644 --- a/platformio.ini +++ b/platformio.ini @@ -722,7 +722,7 @@ board = nxp_lpc1769 # HAL/STM32 Base Environment values # [common_stm32] -platform = ststm32@~8.0 +platform = ststm32@~10.0 build_flags = ${common.build_flags} -std=gnu++14 -DUSBCON -DUSBD_USE_CDC @@ -734,14 +734,17 @@ src_filter = ${common.default_src_filter} + + -lib_ignore = SPI -lib_deps = ${common.lib_deps} + -DARDUINO_ARCH_STM32 +build_unflags = -std=gnu11 -std=gnu++11 +src_filter = ${common.default_src_filter} + +lib_ignore = SPI, FreeRTOS701, FreeRTOS821 +lib_deps = ${common.lib_deps} SoftwareSerialM +platform_packages = tool-stm32duino # # STM32F103RC @@ -750,7 +753,6 @@ lib_deps = ${common.lib_deps} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -platform_packages = tool-stm32duino monitor_speed = 115200 # @@ -760,7 +762,6 @@ monitor_speed = 115200 platform = ${common_stm32f1.platform} extends = common_stm32f1 board = MEEB_3DP -platform_packages = tool-stm32duino build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 @@ -842,7 +843,6 @@ lib_deps = ${env:STM32F103RC_btt_512K.lib_deps} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RE -platform_packages = tool-stm32duino monitor_speed = 115200 # @@ -922,7 +922,6 @@ build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 build_unflags = ${common_stm32f1.build_unflags} -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 -lib_ignore = ${common_stm32f1.lib_ignore} # # MKS Robin Mini (STM32F103VET6) @@ -943,7 +942,6 @@ build_flags = ${common_stm32f1.build_flags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_nano35.py build_flags = ${common_stm32f1.build_flags} @@ -1024,7 +1022,6 @@ build_flags = ${common_stm32f1.build_flags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_e3p.py build_flags = ${common_stm32f1.build_flags} @@ -1153,7 +1150,6 @@ upload_protocol = jlink platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_mini.py buildroot/share/PlatformIO/scripts/add_nanolib.py @@ -1195,7 +1191,6 @@ extra_scripts = ${common.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/fly_mini.py build_flags = ${common_stm32f1.build_flags} From f42d15437b7037709d22c95ee00ce7e9ed38bb3b Mon Sep 17 00:00:00 2001 From: Luu Lac <45380455+shitcreek@users.noreply.github.com> Date: Tue, 1 Dec 2020 23:52:09 -0600 Subject: [PATCH 0671/1370] Help hosts when password-locked (#20348) --- Marlin/src/gcode/gcode.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 8e2ef62204..89bc0dc7af 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -252,6 +252,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(PASSWORD_FEATURE) if (password.is_locked && !parser.is_command('M', 511)) { SERIAL_ECHO_MSG(STR_PRINTER_LOCKED); + if (!no_ok) queue.ok_to_send(); return; } #endif From 1c695e130e7ae8893511041f51d6189fc657dc65 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 2 Dec 2020 01:31:06 -0800 Subject: [PATCH 0672/1370] Fix E3V2 DWIN Jerk Menu (#20352) * Fix E3V2 DWIN build without CLASSIC_JERK * Fix jerk edits applying to wrong index --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 147 ++++++++++--------- buildroot/tests/STM32F103RET6_creality-tests | 4 + 2 files changed, 82 insertions(+), 69 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index a96b1dcb73..89ab77ba3c 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -185,7 +185,10 @@ bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; -constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; + +#if HAS_CLASSIC_JERK + constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; +#endif uint8_t Percentrecord = 0; uint16_t remain_time = 0; @@ -1492,8 +1495,8 @@ void HMI_MaxAccelerationXYZE() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk)) { checkkey = MaxJerk; EncoderRate.enabled = false; - if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) - planner.set_max_jerk(HMI_flag.step_axis, HMI_ValueStruct.Max_Jerk / 10); + if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) + planner.set_max_jerk(HMI_flag.jerk_axis, HMI_ValueStruct.Max_Jerk / 10); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); return; } @@ -2955,75 +2958,77 @@ inline void Draw_Max_Accel_Menu() { #endif } -inline void Draw_Max_Jerk_Menu() { - Clear_Main_Window(); +#if HAS_CLASSIC_JERK + inline void Draw_Max_Jerk_Menu() { + Clear_Main_Window(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk" + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk" - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(1)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max Jerk speed X - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max Jerk speed Y - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(3)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(3)); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max Jerk speed Z + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(1)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max Jerk speed X + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max Jerk speed Y + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(3)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(3)); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max Jerk speed Z + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(4)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max Jerk speed E + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Jerk X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Jerk Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Jerk Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Jerk E")); + #endif + #else + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk" + draw_max_en(MBASE(1)); // "Max" + draw_jerk_en(MBASE(1)); // "Jerk" + draw_speed_en(72, MBASE(1)); // "Speed" + say_x(115, MBASE(1)); // "X" + + draw_max_en(MBASE(2)); // "Max" + draw_jerk_en(MBASE(2)); // "Jerk" + draw_speed_en(72, MBASE(2)); // "Speed" + say_y(115, MBASE(2)); // "Y" + + draw_max_en(MBASE(3)); // "Max" + draw_jerk_en(MBASE(3)); // "Jerk" + draw_speed_en(72, MBASE(3)); // "Speed" + say_z(115, MBASE(3)); // "Z" + + #if HAS_HOTEND + draw_max_en(MBASE(4)); // "Max" + draw_jerk_en(MBASE(4)); // "Jerk" + draw_speed_en(72, MBASE(4)); // "Speed" + say_e(115, MBASE(4)); // "E" + #endif + #endif + } + + Draw_Back_First(); + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(4)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max Jerk speed E + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); #endif } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Jerk X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Jerk Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Jerk Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Jerk E")); - #endif - #else - DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk" - draw_max_en(MBASE(1)); // "Max" - draw_jerk_en(MBASE(1)); // "Jerk" - draw_speed_en(72, MBASE(1)); // "Speed" - say_x(115, MBASE(1)); // "X" - - draw_max_en(MBASE(2)); // "Max" - draw_jerk_en(MBASE(2)); // "Jerk" - draw_speed_en(72, MBASE(2)); // "Speed" - say_y(115, MBASE(2)); // "Y" - - draw_max_en(MBASE(3)); // "Max" - draw_jerk_en(MBASE(3)); // "Jerk" - draw_speed_en(72, MBASE(3)); // "Speed" - say_z(115, MBASE(3)); // "Z" - - #if HAS_HOTEND - draw_max_en(MBASE(4)); // "Max" - draw_jerk_en(MBASE(4)); // "Jerk" - draw_speed_en(72, MBASE(4)); // "Speed" - say_e(115, MBASE(4)); // "E" - #endif - #endif - } - - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); - #if HAS_HOTEND - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); - #endif -} +#endif inline void Draw_Steps_Menu() { Clear_Main_Window(); @@ -3636,7 +3641,9 @@ void DWIN_HandleScreen() { #endif case MaxSpeed: HMI_MaxSpeed(); break; case MaxAcceleration: HMI_MaxAcceleration(); break; - case MaxJerk: HMI_MaxJerk(); break; + #if HAS_CLASSIC_JERK + case MaxJerk: HMI_MaxJerk(); break; + #endif case Step: HMI_Step(); break; case Move_X: HMI_Move_X(); break; case Move_Y: HMI_Move_Y(); break; @@ -3657,7 +3664,9 @@ void DWIN_HandleScreen() { case PrintSpeed: HMI_PrintSpeed(); break; case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break; case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break; - case MaxJerk_value: HMI_MaxJerkXYZE(); break; + #if HAS_CLASSIC_JERK + case MaxJerk_value: HMI_MaxJerkXYZE(); break; + #endif case Step_value: HMI_StepXYZE(); break; default: break; } diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests index 954827ddd9..f0377c68f7 100644 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -13,4 +13,8 @@ use_example_configs "Creality/Ender-3 V2" opt_enable MARLIN_DEV_MODE exec_test $1 $2 "Ender 3 v2" "$3" +use_example_configs "Creality/Ender-3 V2" +opt_disable CLASSIC_JERK +exec_test $1 $2 "Ender 3 v2 w/o CLASSIC_JERK" "$3" + restore_configs From 07954edadc198e6603b9714e5349da94e30de2b0 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 2 Dec 2020 03:23:34 -0800 Subject: [PATCH 0673/1370] Permit SD EEPROM emulation on E3V2 (#20353) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 4 +-- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 32 ++++++-------------- buildroot/tests/STM32F103RET6_creality-tests | 3 +- 3 files changed, 13 insertions(+), 26 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 89ab77ba3c..5a21000698 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -216,7 +216,7 @@ void HMI_SetLanguageCache() { } void HMI_SetLanguage() { - #if ENABLED(EEPROM_SETTINGS) + #if BOTH(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); #endif HMI_SetLanguageCache(); @@ -225,7 +225,7 @@ void HMI_SetLanguage() { void HMI_ToggleLanguage() { HMI_flag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE; HMI_SetLanguageCache(); - #if ENABLED(EEPROM_SETTINGS) + #if BOTH(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); #endif } diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index f0c1611cb8..28ff16d4e4 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -43,30 +43,16 @@ // EEPROM // #if NO_EEPROM_SELECTED - // FLASH - //#define FLASH_EEPROM_EMULATION + #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 + //#define SDCARD_EEPROM_EMULATION +#endif - // I2C - #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 used only for display settings - #if ENABLED(IIC_BL24CXX_EEPROM) - #define IIC_EEPROM_SDA PA11 - #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) - #else - #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb - #endif - - // SPI - //#define SPI_EEPROM // EEPROM on SPI-0 - //#define SPI_CHAN_EEPROM1 ? - //#define SPI_EEPROM1_CS ? - - // 2K EEPROM - //#define SPI_EEPROM2_CS ? - - // 32Mb FLASH - //#define SPI_FLASH_CS ? +#if ENABLED(IIC_BL24CXX_EEPROM) + #define IIC_EEPROM_SDA PA11 + #define IIC_EEPROM_SCL PA12 + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) +#elif ENABLED(SDCARD_EEPROM_EMULATION) + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb #endif // diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests index f0377c68f7..4e6c4f988b 100644 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -15,6 +15,7 @@ exec_test $1 $2 "Ender 3 v2" "$3" use_example_configs "Creality/Ender-3 V2" opt_disable CLASSIC_JERK -exec_test $1 $2 "Ender 3 v2 w/o CLASSIC_JERK" "$3" +opt_add SDCARD_EEPROM_EMULATION +exec_test $1 $2 "Ender 3 v2, SD EEPROM, w/o CLASSIC_JERK" "$3" restore_configs From eba293771588e13c668bcb56da29c17a06fae72b Mon Sep 17 00:00:00 2001 From: yysh12 Date: Thu, 3 Dec 2020 04:40:39 -0600 Subject: [PATCH 0674/1370] Fix circle arc condition (#20322) --- Marlin/src/gcode/motion/G2_G3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 469d726df9..9c6710a08d 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -87,7 +87,7 @@ void plan_arc( #endif // Do a full circle if angular rotation is near 0 and the target is current position - if ((!angular_travel || NEAR_ZERO(angular_travel)) && NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis])) { + if (!angular_travel || (NEAR_ZERO(angular_travel) && NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis]))) { // Preserve direction for circles angular_travel = clockwise ? -RADIANS(360) : RADIANS(360); } From 6a8ab8f1e6141d3e6e24ef5c1431e833324301db Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 3 Dec 2020 23:44:33 +1300 Subject: [PATCH 0675/1370] Fix up start, monitor baud (#20326) --- Marlin/src/MarlinCore.cpp | 2 +- platformio.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index b6282cb098..d615f19370 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -982,7 +982,7 @@ void setup() { serial_connect_timeout = millis() + 1000UL; while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif - SERIAL_ECHO_MSG("start"); + SERIAL_ECHOLNPGM("start"); #if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) mks_esp_wifi_init(); diff --git a/platformio.ini b/platformio.ini index b26ece4026..0cff2dac60 100644 --- a/platformio.ini +++ b/platformio.ini @@ -405,7 +405,7 @@ framework = arduino extra_scripts = ${common.extra_scripts} build_flags = ${common.build_flags} lib_deps = ${common.lib_deps} -monitor_speed = 115200 +monitor_speed = 250000 monitor_flags = --quiet --echo From 20ea00e7f61202d520d2897dff7fa8549cb1ab73 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 3 Dec 2020 05:52:39 -0600 Subject: [PATCH 0676/1370] Consolidate common pin includes --- Marlin/src/pins/pins.h | 84 +++++------------------------------------- 1 file changed, 10 insertions(+), 74 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 676e113310..5c603c8475 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -71,35 +71,11 @@ #if MB(RAMPS_OLD) #include "ramps/pins_RAMPS_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_13_EFB) +#elif MB(RAMPS_13_EFB, RAMPS_13_EEB, RAMPS_13_EFF, RAMPS_13_EEF, RAMPS_13_SF) #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_13_EEB) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_13_EFF) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_13_EEF) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_13_SF) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_14_EFB) +#elif MB(RAMPS_14_EFB, RAMPS_14_EEB, RAMPS_14_EFF, RAMPS_14_EEF, RAMPS_14_SF) #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_14_EEB) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_14_EFF) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_14_EEF) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_14_SF) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_PLUS_EFB) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_PLUS_EEB) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_PLUS_EFF) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_PLUS_EEF) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(RAMPS_PLUS_SF) +#elif MB(RAMPS_PLUS_EFB, RAMPS_PLUS_EEB, RAMPS_PLUS_EFF, RAMPS_PLUS_EEF, RAMPS_PLUS_SF) #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 // @@ -178,9 +154,7 @@ #include "ramps/pins_MAKEBOARD_MINI.h" // ATmega2560 env:mega2560 #elif MB(TRIGORILLA_13) #include "ramps/pins_TRIGORILLA_13.h" // ATmega2560 env:mega2560 -#elif MB(TRIGORILLA_14) - #include "ramps/pins_TRIGORILLA_14.h" // ATmega2560 env:mega2560 -#elif MB(TRIGORILLA_14_11) +#elif MB(TRIGORILLA_14, TRIGORILLA_14_11) #include "ramps/pins_TRIGORILLA_14.h" // ATmega2560 env:mega2560 #elif MB(RAMPS_ENDER_4) #include "ramps/pins_RAMPS_ENDER_4.h" // ATmega2560 env:mega2560 @@ -214,11 +188,7 @@ #include "ramps/pins_TENLOG_D3_HERO.h" // ATmega2560 env:mega2560 #elif MB(MKS_GEN_L_V21) #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560 -#elif MB(RAMPS_S_12_EEFB) - #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 -#elif MB(RAMPS_S_12_EEEB) - #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 -#elif MB(RAMPS_S_12_EFFB) +#elif MB(RAMPS_S_12_EEFB, RAMPS_S_12_EEEB, RAMPS_S_12_EFFB) #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 #elif MB(RAMPS_LONGER3D_LKPRO) #include "ramps/pins_LONGER3D_LK4PRO.h" // ATmega2560 env:mega2560 @@ -383,15 +353,7 @@ // LPC1768 ARM Cortex M3 // -#elif MB(RAMPS_14_RE_ARM_EFB) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 -#elif MB(RAMPS_14_RE_ARM_EEB) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 -#elif MB(RAMPS_14_RE_ARM_EFF) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 -#elif MB(RAMPS_14_RE_ARM_EEF) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 -#elif MB(RAMPS_14_RE_ARM_SF) +#elif MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF) #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 #elif MB(MKS_SBASE) #include "lpc1768/pins_MKS_SBASE.h" // LPC1768 env:LPC1768 @@ -461,35 +423,11 @@ #include "sam/pins_RAMPS_FD_V1.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_FD_V2) #include "sam/pins_RAMPS_FD_V2.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_SMART_EFB) +#elif MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF) #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_SMART_EEB) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_SMART_EFF) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_SMART_EEF) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_SMART_SF) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_DUO_EFB) +#elif MB(RAMPS_DUO_EFB, RAMPS_DUO_EEB, RAMPS_DUO_EFF, RAMPS_DUO_EEF, RAMPS_DUO_SF) #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_DUO_EEB) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_DUO_EFF) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_DUO_EEF) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS_DUO_SF) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS4DUE_EFB) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS4DUE_EEB) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS4DUE_EFF) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS4DUE_EEF) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug -#elif MB(RAMPS4DUE_SF) +#elif MB(RAMPS4DUE_EFB, RAMPS4DUE_EEB, RAMPS4DUE_EFF, RAMPS4DUE_EEF, RAMPS4DUE_SF) #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(ULTRATRONICS_PRO) #include "sam/pins_ULTRATRONICS_PRO.h" // SAM3X8E env:DUE env:DUE_debug @@ -616,9 +554,7 @@ #elif MB(ARMED) #include "stm32f4/pins_ARMED.h" // STM32F4 env:ARMED -#elif MB(RUMBA32_V1_0) - #include "stm32f4/pins_RUMBA32_AUS3D.h" // STM32F4 env:rumba32 -#elif MB(RUMBA32_V1_1) +#elif MB(RUMBA32_V1_0, RUMBA32_V1_1) #include "stm32f4/pins_RUMBA32_AUS3D.h" // STM32F4 env:rumba32 #elif MB(RUMBA32_MKS) #include "stm32f4/pins_RUMBA32_MKS.h" // STM32F4 env:rumba32 From dab29dddc34b3cc74cdf83d0ebb6ca2503194340 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 3 Dec 2020 14:23:48 -0300 Subject: [PATCH 0677/1370] Require minimum PlatformIO version (#20361) Co-authored-by: Scott Lahteine Co-authored-by: Jason Smith --- .../PlatformIO/scripts/common-dependencies.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index f3bc2b9b02..56dc86e634 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -16,6 +16,30 @@ except ImportError: # PIO >= 4.4 from platformio.package.meta import PackageSpec as PackageManager +PIO_VERSION_MIN = (5, 0, 3) +try: + from platformio import VERSION as PIO_VERSION + weights = (1000, 100, 1) + version_min = sum([x[0] * float(re.sub(r'[^0-9]', '.', str(x[1]))) for x in zip(weights, PIO_VERSION_MIN)]) + version_cur = sum([x[0] * float(re.sub(r'[^0-9]', '.', str(x[1]))) for x in zip(weights, PIO_VERSION)]) + if version_cur < version_min: + print() + print("**************************************************") + print("****** An update to PlatformIO is ******") + print("****** required to build Marlin Firmware. ******") + print("****** ******") + print("****** Minimum version: ", PIO_VERSION_MIN, " ******") + print("****** Current Version: ", PIO_VERSION, " ******") + print("****** ******") + print("****** Update PlatformIO and try again. ******") + print("**************************************************") + print() + exit(1) +except SystemExit: + exit(1) +except: + print("Can't detect PlatformIO Version") + Import("env") #print(env.Dump()) From 10b8737c7dec74e5688bd60197cfbb85e5213d68 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 3 Dec 2020 19:33:46 -0800 Subject: [PATCH 0678/1370] Fix MESH_BED_LEVELING w/o SEGMENT_LEVELED_MOVES (#20363) --- Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index 1200c2a1b3..ec5b95c108 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -71,8 +71,8 @@ // Start and end in the same cell? No split needed. if (scel == ecel) { - line_to_destination(scaled_fr_mm_s); current_position = destination; + line_to_current_position(scaled_fr_mm_s); return; } @@ -104,8 +104,8 @@ else { // Must already have been split on these border(s) // This should be a rare case. - line_to_destination(scaled_fr_mm_s); current_position = destination; + line_to_current_position(scaled_fr_mm_s); return; } From 43bbf04764e03a355fddd08c6e379167fa3ea41c Mon Sep 17 00:00:00 2001 From: Belin Fieldson Date: Fri, 4 Dec 2020 03:49:30 -0700 Subject: [PATCH 0679/1370] Loosen E on pause for fila-manipulation (#20346) Co-authored-by: Scott Lahteine --- Marlin/src/feature/pause.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 1593b0cc57..c8265a154f 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -295,6 +295,18 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l return true; } +/** + * Disabling E steppers for manual filament change should be fine + * as long as users don't spin the E motor ridiculously fast and + * send current back to their board, potentially frying it. + */ +inline void disable_active_extruder() { + #if HAS_E_STEPPER_ENABLE + disable_e_stepper(active_extruder); + safe_delay(100); + #endif +} + /** * Unload filament from the hotend * @@ -357,11 +369,8 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, planner.settings.retract_acceleration = saved_acceleration; #endif - // Disable E steppers for manual change - #if HAS_E_STEPPER_ENABLE - disable_e_stepper(active_extruder); - safe_delay(100); - #endif + // Disable the Extruder for manual change + disable_active_extruder(); return true; } @@ -447,6 +456,9 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float set_duplication_enabled(saved_ext_dup_mode, saved_ext); #endif + // Disable the Extruder for manual change + disable_active_extruder(); + return true; } From c88a7935d6a57d6eafbfcd2da9f6d09a87e5e363 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Sat, 5 Dec 2020 05:29:55 +0100 Subject: [PATCH 0680/1370] =?UTF-8?q?Don=E2=80=99t=20use=20near=20keyword?= =?UTF-8?q?=20as=20variable=20name=20(#20374)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 94bec99194..9ab7861a01 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -727,7 +727,7 @@ * Probe all invalidated locations of the mesh that can be reached by the probe. * This attempts to fill in locations closest to the nozzle's start location first. */ - void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { + void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW TERN_(HAS_LCD_MENU, ui.capture()); @@ -758,7 +758,7 @@ best = do_furthest ? find_furthest_invalid_mesh_point() - : find_closest_mesh_point_of_type(INVALID, near, true); + : find_closest_mesh_point_of_type(INVALID, pos, true); if (best.pos.x >= 0) { // mesh point found and is reachable by probe TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); @@ -788,8 +788,8 @@ restore_ubl_active_state_and_leave(); do_blocking_move_to_xy( - constrain(near.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), - constrain(near.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) + constrain(pos.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), + constrain(pos.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) ); } @@ -1206,7 +1206,7 @@ found_a_NAN = true; - xy_int8_t near { -1, -1 }; + xy_int8_t near_pos { -1, -1 }; float d1, d2 = 99999.9f; GRID_LOOP(k, l) { if (isnan(z_values[k][l])) continue; @@ -1221,7 +1221,7 @@ if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) d2 = d1; - near.set(i, j); + near_pos.set(i, j); } } @@ -1229,8 +1229,8 @@ // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) // - if (found_a_real && near.x >= 0 && d2 > farthest.distance) { - farthest.pos = near; // Found an invalid location farther from the defined mesh point + if (found_a_real && near_pos.x >= 0 && d2 > farthest.distance) { + farthest.pos = near_pos; // Found an invalid location farther from the defined mesh point farthest.distance = d2; } } // GRID_LOOP From a09d096b876556b0793782e87c1e942c6e97b499 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Dec 2020 23:56:20 -0600 Subject: [PATCH 0681/1370] Improved Longer3D LKx Pro board (#20372) Co-authored-by: mrv96 --- Marlin/src/core/boards.h | 3 +- Marlin/src/pins/pins.h | 8 +- Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h | 38 ------ Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h | 118 ++++++++++++++++++ 4 files changed, 126 insertions(+), 41 deletions(-) delete mode 100644 Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h create mode 100644 Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index a6fc1b4dfd..d85cf2c664 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -113,7 +113,8 @@ #define BOARD_RAMPS_S_12_EEFB 1157 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_RAMPS_S_12_EEEB 1158 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed) #define BOARD_RAMPS_S_12_EFFB 1159 // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed) -#define BOARD_RAMPS_LONGER3D_LK4PRO 1160 // Longer LKxxPRO/ Alfawise UxxPro (PRO version) +#define BOARD_LONGER3D_LK1_PRO 1160 // Longer LK1 PRO / Alfawise U20 Pro (PRO version) +#define BOARD_LONGER3D_LKx_PRO 1161 // Longer LKx PRO / Alfawise Uxx Pro (PRO version) // // RAMBo and derivatives diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 5c603c8475..3c05976964 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -190,8 +190,8 @@ #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560 #elif MB(RAMPS_S_12_EEFB, RAMPS_S_12_EEEB, RAMPS_S_12_EFFB) #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 -#elif MB(RAMPS_LONGER3D_LKPRO) - #include "ramps/pins_LONGER3D_LK4PRO.h" // ATmega2560 env:mega2560 +#elif MB(LONGER3D_LK1_PRO, LONGER3D_LKx_PRO) + #include "ramps/pins_LONGER3D_LKx_PRO.h" // ATmega2560 env:mega2560 // // RAMBo and derivatives @@ -663,6 +663,7 @@ #define BOARD_RUMBA32 -1018 #define BOARD_RUMBA32_AUS3D -1019 #define BOARD_RAMPS_DAGOMA -1020 + #define BOARD_RAMPS_LONGER3D_LK4PRO -1021 #if MB(MKS_13) #error "BOARD_MKS_13 has been renamed BOARD_MKS_GEN_13. Please update your configuration." @@ -708,6 +709,8 @@ #error "BOARD_RUMBA32_AUS3D is now BOARD_RUMBA32_V1_0. Please update your configuration." #elif MB(RAMPS_DAGOMA) #error "BOARD_RAMPS_DAGOMA is now BOARD_DAGOMA_F5. Please update your configuration." + #elif MB(RAMPS_LONGER3D_LK4PRO) + #error "BOARD_RAMPS_LONGER3D_LK4PRO is now BOARD_LONGER3D_LKx_PRO. Please update your configuration." #else #error "Unknown MOTHERBOARD value set in Configuration.h" #endif @@ -733,6 +736,7 @@ #undef BOARD_RUMBA32 #undef BOARD_RUMBA32_AUS3D #undef BOARD_RAMPS_DAGOMA + #undef BOARD_RAMPS_LONGER3D_LK4PRO #endif diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h deleted file mode 100644 index 8acf4e2f4f..0000000000 --- a/Marlin/src/pins/ramps/pins_LONGER3D_LK4PRO.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// Longer UI assumptions -#if HOTENDS > 1 || E_STEPPERS > 1 - #error "Longer UI supports only 1 hotend / E-stepper." -#endif - -#define BOARD_INFO_NAME "LGT Kit 1.0" - -#define SD_DETECT_PIN 49 -#define FIL_RUNOUT_PIN 2 -#define Z_MIN_PIN 35 - -// -// Import RAMPS 1.4 pins -// -#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h new file mode 100644 index 0000000000..3bcaae96a3 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h @@ -0,0 +1,118 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Longer3D LK1/LK4/LK5 Pro board pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "Longer3D LGT KIT V1.0 board only supports 1 hotend / E-stepper. Comment out this line to continue." +#endif + +#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 + #warning "Serial 1 is originally reserved to DGUS LCD." +#endif +#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 + #warning "Serial 2 has no connector. Hardware changes may be required to use it." +#endif +#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 + #define CHANGE_Y_LIMIT_PINS + #warning "Serial 3 is originally reserved to Y limit switches. Hardware changes are required to use it." +#endif + +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + +#define BOARD_INFO_NAME "LGT KIT V1.0" + +// +// Servos +// +#if !MB(LONGER3D_LK1_PRO) + #define SERVO0_PIN 7 +#endif +#define SERVO1_PIN -1 +#define SERVO2_PIN -1 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_STOP_PIN 3 + +#ifdef CHANGE_Y_LIMIT_PINS + #define Y_STOP_PIN 37 +#else + #define Y_MIN_PIN 14 + #define Y_MAX_PIN 15 +#endif + +#if !MB(LONGER3D_LK1_PRO) + #ifdef CHANGE_Y_LIMIT_PINS + #define Z_STOP_PIN 35 + #else + #define Z_MIN_PIN 35 + #define Z_MAX_PIN 37 + #endif +#else + #define Z_MIN_PIN 11 + #define Z_MAX_PIN 37 +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#define Z_MIN_PROBE_PIN -1 + +// +// Misc. Functions +// +#define SD_DETECT_PIN 49 +#define FIL_RUNOUT_PIN 2 + +// +// Other RAMPS 1.3 pins +// +#define IS_RAMPS_EFB // Override autodetection. Bed will be undefined. +#include "pins_RAMPS_13.h" + +// +// Steppers +// +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN +#undef E1_CS_PIN + +// +// Temperature Sensors +// +#undef TEMP_1_PIN + +// +// Průša i3 MK2 Multiplexer Support +// +#undef E_MUX2_PIN +#undef CHANGE_Y_LIMIT_PINS From 1a618b1b312802039622784c418666a88b6403c5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 4 Dec 2020 21:58:39 -0800 Subject: [PATCH 0682/1370] Fix TMC_HOME_PHASE divide by zero (#20368) --- Marlin/src/module/motion.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 3a01cda5c1..7b4c89e759 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1490,10 +1490,12 @@ void set_axis_never_homed(const AxisEnum axis) { effectorBackoutDir, // Direction in which the effector mm coordinates move away from endstop. stepperBackoutDir; // Direction in which the TMC µstep count(phase) move away from endstop. + #define PHASE_PER_MICROSTEP(N) (256 / _MAX(1, N##_MICROSTEPS)) + switch (axis) { #ifdef X_MICROSTEPS case X_AXIS: - phasePerUStep = 256 / (X_MICROSTEPS); + phasePerUStep = PHASE_PER_MICROSTEP(X); phaseCurrent = stepperX.get_microstep_counter(); effectorBackoutDir = -X_HOME_DIR; stepperBackoutDir = INVERT_X_DIR ? effectorBackoutDir : -effectorBackoutDir; @@ -1501,7 +1503,7 @@ void set_axis_never_homed(const AxisEnum axis) { #endif #ifdef Y_MICROSTEPS case Y_AXIS: - phasePerUStep = 256 / (Y_MICROSTEPS); + phasePerUStep = PHASE_PER_MICROSTEP(Y); phaseCurrent = stepperY.get_microstep_counter(); effectorBackoutDir = -Y_HOME_DIR; stepperBackoutDir = INVERT_Y_DIR ? effectorBackoutDir : -effectorBackoutDir; @@ -1509,7 +1511,7 @@ void set_axis_never_homed(const AxisEnum axis) { #endif #ifdef Z_MICROSTEPS case Z_AXIS: - phasePerUStep = 256 / (Z_MICROSTEPS); + phasePerUStep = PHASE_PER_MICROSTEP(Z); phaseCurrent = stepperZ.get_microstep_counter(); effectorBackoutDir = -Z_HOME_DIR; stepperBackoutDir = INVERT_Z_DIR ? effectorBackoutDir : -effectorBackoutDir; From c400c54b86d8f55850518dac12f748e62f795db4 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 4 Dec 2020 22:02:58 -0800 Subject: [PATCH 0683/1370] Suspend Servos for STM32+NeoPixel (#19963) --- Marlin/src/HAL/STM32/HAL.h | 3 +++ Marlin/src/HAL/STM32/eeprom_flash.cpp | 17 ++++------------- Marlin/src/feature/leds/neopixel.h | 3 +++ Marlin/src/inc/Conditionals_post.h | 3 +++ buildroot/tests/BIGTREE_GTR_V1_0-tests | 3 ++- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 16dc7a4539..9842cdaae4 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -29,6 +29,7 @@ #include "../shared/math_32bit.h" #include "../shared/HAL_SPI.h" #include "fastio.h" +#include "Servo.h" #include "watchdog.h" #include "MarlinSerial.h" @@ -110,6 +111,8 @@ typedef int16_t pin_t; #define HAL_SERVO_LIB libServo +#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() +#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() // ------------------------ // Public Variables diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index 702e42e561..8cd62879a5 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -28,15 +28,6 @@ #include "../shared/eeprom_api.h" -#if HAS_SERVOS - #include "Servo.h" - #define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() - #define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() -#else - #define PAUSE_SERVO_OUTPUT() - #define RESUME_SERVO_OUTPUT() -#endif - /** * The STM32 HAL supports chips that deal with "pages" and some with "sectors" and some that * even have multiple "banks" of flash. @@ -172,11 +163,11 @@ bool PersistentStore::access_finish() { current_slot = EEPROM_SLOTS - 1; UNLOCK_FLASH(); - PAUSE_SERVO_OUTPUT(); + TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT()); DISABLE_ISRS(); status = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError); ENABLE_ISRS(); - RESUME_SERVO_OUTPUT(); + TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT()); if (status != HAL_OK) { DEBUG_ECHOLNPAIR("HAL_FLASHEx_Erase=", status); DEBUG_ECHOLNPAIR("GetError=", HAL_FLASH_GetError()); @@ -227,11 +218,11 @@ bool PersistentStore::access_finish() { // Interrupts during this time can have unpredictable results, such as killing Servo // output. Servo output still glitches with interrupts disabled, but recovers after the // erase. - PAUSE_SERVO_OUTPUT(); + TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT()); DISABLE_ISRS(); eeprom_buffer_flush(); ENABLE_ISRS(); - RESUME_SERVO_OUTPUT(); + TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT()); eeprom_data_written = false; #endif diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index d7354207fc..acf2e7f54d 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -105,6 +105,8 @@ public: } static inline void show() { + // Some platforms cannot maintain PWM output when NeoPixel disables interrupts for long durations. + TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT()); adaneo1.show(); #if PIN_EXISTS(NEOPIXEL2) #if CONJOINED_NEOPIXEL @@ -115,6 +117,7 @@ public: adaneo1.setPin(NEOPIXEL_PIN); #endif #endif + TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT()); } #if 0 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index dfecd57749..092dc818b8 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1997,6 +1997,9 @@ #if NUM_SERVOS > 0 #define HAS_SERVOS 1 #endif +#if HAS_SERVOS && defined(PAUSE_SERVO_OUTPUT) && defined(RESUME_SERVO_OUTPUT) + #define HAS_PAUSE_SERVO_OUTPUT 1 +#endif // Sensors #if PIN_EXISTS(FILWIDTH) diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests index ef245143a8..adc850db03 100644 --- a/buildroot/tests/BIGTREE_GTR_V1_0-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0-tests @@ -23,7 +23,8 @@ opt_set E1_AUTO_FAN_PIN PC11 opt_set E2_AUTO_FAN_PIN PC12 opt_set X_DRIVER_TYPE TMC2208 opt_set Y_DRIVER_TYPE TMC2130 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +opt_set NEOPIXEL_PIN PF13 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING opt_enable FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE opt_set FIL_RUNOUT_PIN 3 opt_set FIL_RUNOUT2_PIN 4 From 21b15a0a09891498fa4602806d6dccdd87dfc0af Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 5 Dec 2020 15:23:58 -0600 Subject: [PATCH 0684/1370] Add Creality 4.5.2 board (#20378) Co-authored-by: Jason Smith --- Marlin/src/HAL/STM32F1/HAL.h | 2 + Marlin/src/core/boards.h | 9 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 4 +- Marlin/src/pins/stm32f1/pins_CREALITY_V452.h | 113 +++++++++++++++++++ 5 files changed, 124 insertions(+), 6 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V452.h diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 226c8ca9b2..d8bba774e9 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -109,6 +109,8 @@ #else #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." #endif + + #define SERIAL_GET_TX_BUFFER_FREE LCD_SERIAL.availableForWrite #endif // Set interrupt grouping for this MCU diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index d85cf2c664..643d577d1b 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -329,10 +329,11 @@ #define BOARD_CHITU3D_V6 4036 // Chitu3D TronXY X5SA V5 Board #define BOARD_CREALITY_V4 4037 // Creality v4.x (STM32F103RE) #define BOARD_CREALITY_V427 4038 // Creality v4.2.7 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4039 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4040 // FLY MINI (STM32F103RCT6) -#define BOARD_FLSUN_HISPEED 4041 // FLSUN HiSpeedV1 (STM32F103VET6) -#define BOARD_BEAST 4042 // STM32F103RET6 Libmaple-based controller +#define BOARD_CREALITY_V452 4039 // Creality v4.5.2 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4040 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4041 // FLY MINI (STM32F103RCT6) +#define BOARD_FLSUN_HISPEED 4042 // FLSUN HiSpeedV1 (STM32F103VET6) +#define BOARD_BEAST 4043 // STM32F103RET6 Libmaple-based controller // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 3c05976964..1961d5cf8d 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -530,6 +530,8 @@ #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality #elif MB(CREALITY_V427) #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality +#elif MB(CREALITY_V452) + #include "stm32f1/pins_CREALITY_V452.h" // STM32F1 env:STM32F103RET6_creality #elif MB(TRIGORILLA_PRO) #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro #elif MB(FLY_MINI) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 28ff16d4e4..c66bca8540 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -21,13 +21,13 @@ */ /** - * CREALITY (STM32F103) board pin assignments + * Creality 4.2.x (STM32F103RET6) board pin assignments */ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "Creality V4 only supports one hotend / E-stepper. Comment out this line to continue." + #error "Creality_V4 only supports one hotend / E-stepper. Comment out this line to continue." #endif #ifndef BOARD_INFO_NAME diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h new file mode 100644 index 0000000000..348ab28dff --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Creality v4.5.2 (STM32F103RET6) board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "CREALITY_V452 supports up to 1 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_NAME "Creality v4.5.2" +#define DEFAULT_MACHINE_NAME "Creality3D" + +#define BOARD_NO_NATIVE_USB + +// +// EEPROM +// +#if NO_EEPROM_SELECTED + #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 + //#define SDCARD_EEPROM_EMULATION +#endif + +#if ENABLED(IIC_BL24CXX_EEPROM) + #define IIC_EEPROM_SDA PA11 + #define IIC_EEPROM_SCL PA12 + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) +#elif ENABLED(SDCARD_EEPROM_EMULATION) + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PC4 +// #define X_MAX_PIN PA7 +#define Y_MIN_PIN PC5 +#define Z_MIN_PIN PA4 +#define PROBE_TARE_PIN PA5 + +// +// Steppers +// +#define X_ENABLE_PIN PC3 +#define X_STEP_PIN PB8 +#define X_DIR_PIN PB7 + +#define Y_ENABLE_PIN PC3 +#define Y_STEP_PIN PB6 +#define Y_DIR_PIN PB5 + +#define Z_ENABLE_PIN PC3 +#define Z_STEP_PIN PB4 +#define Z_DIR_PIN PB3 + +#define E0_ENABLE_PIN PC3 +#define E0_STEP_PIN PC2 +#define E0_DIR_PIN PB9 + + +// +// Release PB4 (Z_STEP_PIN) from JTAG NRST role +// +#define DISABLE_DEBUG + +// +// Temperature Sensors +// +#define TEMP_0_PIN PB1 // TH1 +#define TEMP_BED_PIN PB0 // TB1 + +// +// Heaters / Fans + +#define HEATER_0_PIN PA1 // HEATER1 +#define HEATER_BED_PIN PA2 // HOT BED + +#define FAN_PIN PA0 // FAN +#define FAN_SOFT_PWM + +/* SD card detect */ +#define SD_DETECT_PIN PC7 +#define NO_SD_HOST_DRIVE // SD is only seen by the printer + +#define SDIO_SUPPORT // Extra added by Creality +#define SDIO_CLOCK 6000000 // In original source code overridden by Creality in sdio.h + +#define CASE_LIGHT_PIN PA6 + +#define FIL_RUNOUT_PIN PA7 +#define PROBE_ENABLE_PIN PC6 // Optoswitch to Enable Z Probe From 8a18bb844011db5631e633e9a56b85bbbb10c7aa Mon Sep 17 00:00:00 2001 From: LinFor Date: Sun, 6 Dec 2020 03:19:17 +0300 Subject: [PATCH 0685/1370] Fix FYSETC S6 I2C EEPROM size (#20340) Both V1.2 and V2.0 boards have a 24LC16, which is a 2kB EEPROM. Co-authored-by: PingWin Co-authored-by: Jason Smith --- Marlin/src/pins/pins.h | 4 ++-- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 3 +-- Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 1961d5cf8d..fbae5356ca 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -582,12 +582,12 @@ #include "stm32f4/pins_VAKE403D.h" // STM32F4 #elif MB(FYSETC_S6) #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 +#elif MB(FYSETC_S6_V2_0) + #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 #elif MB(FLYF407ZG) #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG #elif MB(MKS_ROBIN2) #include "stm32f4/pins_MKS_ROBIN2.h" // STM32F4 env:MKS_ROBIN2 -#elif MB(FYSETC_S6_V2_0) - #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 // // ARM Cortex M7 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index a8105c37a2..decf4aeb6b 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -42,7 +42,6 @@ // #if NO_EEPROM_SELECTED #define FLASH_EEPROM_EMULATION - //#define SRAM_EEPROM_EMULATION //#define I2C_EEPROM #endif @@ -51,7 +50,7 @@ // 128 kB sector allocated for EEPROM emulation. #define FLASH_EEPROM_LEVELING #elif ENABLED(I2C_EEPROM) - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x0800 // 2KB #endif // diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h index b12c12c848..641805d855 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h @@ -29,7 +29,6 @@ #if NO_EEPROM_SELECTED #undef NO_EEPROM_SELECTED //#define FLASH_EEPROM_EMULATION - //#define SRAM_EEPROM_EMULATION #define I2C_EEPROM #endif From ec2843bcf3fa944817f5faff0fb752923f5e622a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 5 Dec 2020 18:18:28 -0600 Subject: [PATCH 0686/1370] Creality 4.5.2 format and fix --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V452.h | 93 +++++++++++--------- 2 files changed, 51 insertions(+), 44 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index c66bca8540..a7c06cb99d 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -27,7 +27,7 @@ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "Creality_V4 only supports one hotend / E-stepper. Comment out this line to continue." + #error "Creality V4 only supports one hotend / E-stepper. Comment out this line to continue." #endif #ifndef BOARD_INFO_NAME diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h index 348ab28dff..715fd89db8 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h @@ -33,81 +33,88 @@ #define BOARD_NAME "Creality v4.5.2" #define DEFAULT_MACHINE_NAME "Creality3D" +// +// Release PB4 (Z_STEP_PIN) from JTAG NRST role +// +#define DISABLE_DEBUG + #define BOARD_NO_NATIVE_USB // // EEPROM // #if NO_EEPROM_SELECTED - #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 + #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 //#define SDCARD_EEPROM_EMULATION #endif #if ENABLED(IIC_BL24CXX_EEPROM) - #define IIC_EEPROM_SDA PA11 - #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) + #define IIC_EEPROM_SDA PA11 + #define IIC_EEPROM_SCL PA12 + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) #elif ENABLED(SDCARD_EEPROM_EMULATION) - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb #endif // // Limit Switches // -#define X_MIN_PIN PC4 -// #define X_MAX_PIN PA7 -#define Y_MIN_PIN PC5 -#define Z_MIN_PIN PA4 -#define PROBE_TARE_PIN PA5 +#define X_STOP_PIN PC4 +#define Y_STOP_PIN PC5 +#define Z_STOP_PIN PA4 + +#define FIL_RUNOUT_PIN PA7 + +// +// Probe +// +#define PROBE_TARE_PIN PA5 +#define PROBE_ENABLE_PIN PC6 // Optoswitch to Enable Z Probe // // Steppers // -#define X_ENABLE_PIN PC3 -#define X_STEP_PIN PB8 -#define X_DIR_PIN PB7 +#define X_ENABLE_PIN PC3 +#define X_STEP_PIN PB8 +#define X_DIR_PIN PB7 -#define Y_ENABLE_PIN PC3 -#define Y_STEP_PIN PB6 -#define Y_DIR_PIN PB5 +#define Y_ENABLE_PIN PC3 +#define Y_STEP_PIN PB6 +#define Y_DIR_PIN PB5 -#define Z_ENABLE_PIN PC3 -#define Z_STEP_PIN PB4 -#define Z_DIR_PIN PB3 +#define Z_ENABLE_PIN PC3 +#define Z_STEP_PIN PB4 +#define Z_DIR_PIN PB3 -#define E0_ENABLE_PIN PC3 -#define E0_STEP_PIN PC2 -#define E0_DIR_PIN PB9 - - -// -// Release PB4 (Z_STEP_PIN) from JTAG NRST role -// -#define DISABLE_DEBUG +#define E0_ENABLE_PIN PC3 +#define E0_STEP_PIN PC2 +#define E0_DIR_PIN PB9 // // Temperature Sensors // -#define TEMP_0_PIN PB1 // TH1 -#define TEMP_BED_PIN PB0 // TB1 +#define TEMP_0_PIN PB1 // TH1 +#define TEMP_BED_PIN PB0 // TB1 // // Heaters / Fans +// +#define HEATER_0_PIN PA1 // HEATER1 +#define HEATER_BED_PIN PA2 // HOT BED -#define HEATER_0_PIN PA1 // HEATER1 -#define HEATER_BED_PIN PA2 // HOT BED - -#define FAN_PIN PA0 // FAN +#define FAN_PIN PA0 // FAN #define FAN_SOFT_PWM -/* SD card detect */ -#define SD_DETECT_PIN PC7 -#define NO_SD_HOST_DRIVE // SD is only seen by the printer +// +// SD Card +// +#define SD_DETECT_PIN PC7 +#define NO_SD_HOST_DRIVE // SD is only seen by the printer -#define SDIO_SUPPORT // Extra added by Creality -#define SDIO_CLOCK 6000000 // In original source code overridden by Creality in sdio.h +#define SDIO_SUPPORT // Extra added by Creality +#define SDIO_CLOCK 6000000 // In original source code overridden by Creality in sdio.h -#define CASE_LIGHT_PIN PA6 - -#define FIL_RUNOUT_PIN PA7 -#define PROBE_ENABLE_PIN PC6 // Optoswitch to Enable Z Probe +// +// Misc. Functions +// +#define CASE_LIGHT_PIN PA6 From ef35fc60c1d59fbf929eceddb669ef93bac13318 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 5 Dec 2020 18:21:56 -0600 Subject: [PATCH 0687/1370] Use 'nearby' for 'near' --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 9ab7861a01..11bea18c81 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -727,7 +727,7 @@ * Probe all invalidated locations of the mesh that can be reached by the probe. * This attempts to fill in locations closest to the nozzle's start location first. */ - void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { + void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &nearby, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW TERN_(HAS_LCD_MENU, ui.capture()); @@ -758,7 +758,7 @@ best = do_furthest ? find_furthest_invalid_mesh_point() - : find_closest_mesh_point_of_type(INVALID, pos, true); + : find_closest_mesh_point_of_type(INVALID, nearby, true); if (best.pos.x >= 0) { // mesh point found and is reachable by probe TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); @@ -788,8 +788,8 @@ restore_ubl_active_state_and_leave(); do_blocking_move_to_xy( - constrain(pos.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), - constrain(pos.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) + constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), + constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) ); } @@ -1206,7 +1206,7 @@ found_a_NAN = true; - xy_int8_t near_pos { -1, -1 }; + xy_int8_t nearby { -1, -1 }; float d1, d2 = 99999.9f; GRID_LOOP(k, l) { if (isnan(z_values[k][l])) continue; @@ -1221,7 +1221,7 @@ if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) d2 = d1; - near_pos.set(i, j); + nearby.set(i, j); } } @@ -1229,8 +1229,8 @@ // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) // - if (found_a_real && near_pos.x >= 0 && d2 > farthest.distance) { - farthest.pos = near_pos; // Found an invalid location farther from the defined mesh point + if (found_a_real && nearby.x >= 0 && d2 > farthest.distance) { + farthest.pos = nearby; // Found an invalid location farther from the defined mesh point farthest.distance = d2; } } // GRID_LOOP From 284cc8f62d64bf08b737da07225689ced8b88385 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 5 Nov 2020 16:45:22 -0600 Subject: [PATCH 0688/1370] ExtUI homing / leveling additions --- Marlin/src/MarlinCore.cpp | 8 ++++++++ Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 ++ Marlin/src/gcode/calibrate/G28.cpp | 8 ++++++++ Marlin/src/gcode/sd/M1001.cpp | 2 ++ Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 9 +++++++++ Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp | 19 ++++++++++++++++--- Marlin/src/lcd/extui/dgus_lcd.cpp | 10 ++++++++++ Marlin/src/lcd/extui/example.cpp | 16 +++++++++++++--- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 13 +++++++++++-- Marlin/src/lcd/extui/malyan_lcd.cpp | 13 ++++++++++--- Marlin/src/lcd/extui/ui_api.h | 6 ++++++ 11 files changed, 95 insertions(+), 11 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index d615f19370..d4d22a6198 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -77,6 +77,10 @@ #include "lcd/dwin/e3v2/rotary_encoder.h" #endif +#if ENABLED(EXTENSIBLE_UI) + #include "lcd/extui/ui_api.h" +#endif + #if HAS_ETHERNET #include "feature/ethernet.h" #endif @@ -360,6 +364,8 @@ void enable_all_steppers() { ENABLE_AXIS_Y(); ENABLE_AXIS_Z(); enable_e_steppers(); + + TERN_(EXTENSIBLE_UI, ExtUI::onSteppersEnabled()); } void disable_e_steppers() { @@ -379,6 +385,8 @@ void disable_all_steppers() { DISABLE_AXIS_Y(); DISABLE_AXIS_Z(); disable_e_steppers(); + + TERN_(EXTENSIBLE_UI, ExtUI::onSteppersDisabled()); } #if ENABLED(G29_RETRY_AND_RECOVER) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 9999d92e22..653c632f1a 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -177,6 +177,8 @@ G29_TYPE GcodeSuite::G29() { if (DISABLED(PROBE_MANUALLY) && seenQ) G29_RETURN(false); #endif + TERN_(EXTENSIBLE_UI, ExtUI::onMeshLevelingStart()); + const bool seenA = TERN0(PROBE_MANUALLY, parser.seen('A')), no_action = seenA || seenQ, faux = ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) ? parser.boolval('C') : no_action; diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index c17d6dcc8b..31fc1e1cf2 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -50,6 +50,10 @@ #include "../../lcd/dwin/e3v2/dwin.h" #endif +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + #if HAS_L64XX // set L6470 absolute position registers to counts #include "../../libs/L64XX/L64XX_Marlin.h" #endif @@ -209,6 +213,8 @@ void GcodeSuite::G28() { TERN_(DWIN_CREALITY_LCD, HMI_flag.home_flag = true); + TERN_(EXTENSIBLE_UI, ExtUI::onHomingStart()); + #if ENABLED(DUAL_X_CARRIAGE) bool IDEX_saved_duplication_state = extruder_duplication_enabled; DualXMode IDEX_saved_mode = dual_x_carriage_mode; @@ -462,6 +468,8 @@ void GcodeSuite::G28() { TERN_(DWIN_CREALITY_LCD, DWIN_CompletedHoming()); + TERN_(EXTENSIBLE_UI, ExtUI::onHomingComplete()); + report_current_position(); if (ENABLED(NANODLP_Z_SYNC) && (doZ || ENABLED(NANODLP_ALL_AXIS))) diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 4a461170bc..e4b7054bf2 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -96,6 +96,8 @@ void GcodeSuite::M1001() { queue.inject_P(PSTR(SD_FINISHED_RELEASECOMMAND)); #endif + TERN_(EXTENSIBLE_UI, ExtUI::onPrintFinished()); + // Re-select the last printed file in the UI TERN_(SD_REPRINT_LAST_SELECTED_FILE, ui.reselect_last_file()); } diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index a7f9a7a0c3..06baa4c19d 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -62,6 +62,10 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { Chiron.ConfirmationRequest(msg); } void onStatusChanged(const char * const msg) { Chiron.StatusChange(msg); } + void onHomingStart() {} + void onHomingComplete() {} + void onPrintFinished() {} + void onFactoryReset() {} void onStoreSettings(char *buff) { @@ -95,6 +99,8 @@ namespace ExtUI { } #if HAS_MESH + void onMeshLevelingStart() {} + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { // Called when any mesh points are updated //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); @@ -116,6 +122,9 @@ namespace ExtUI { // Called for temperature PID tuning result } #endif + + void onSteppersDisabled() {} + void onSteppersEnabled() {} } #endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp index 15526d16fc..e2bd96068c 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp @@ -52,6 +52,11 @@ namespace ExtUI { void onFilamentRunout(const extruder_t extruder) { AnycubicTFT.OnFilamentRunout(); } void onUserConfirmRequired(const char * const msg) { AnycubicTFT.OnUserConfirmRequired(msg); } void onStatusChanged(const char * const msg) {} + + void onHomingStart() {} + void onHomingComplete() {} + void onPrintFinished() {} + void onFactoryReset() {} void onStoreSettings(char *buff) { @@ -84,9 +89,14 @@ namespace ExtUI { // whether successful or not. } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { - // Called when any mesh points are updated - } + #if HAS_MESH + + void onMeshLevelingStart() {} + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + } + #endif #if ENABLED(POWER_LOSS_RECOVERY) void onPowerLossResume() { @@ -99,6 +109,9 @@ namespace ExtUI { // Called for temperature PID tuning result } #endif + + void onSteppersDisabled() {} + void onSteppersEnabled() {} } #endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index d175b5acac..33d8bd4d89 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -76,7 +76,12 @@ namespace ExtUI { void onStatusChanged(const char * const msg) { ScreenHandler.setstatusmessage(msg); } + void onHomingStart() {} + void onHomingComplete() {} + void onPrintFinished() {} + void onFactoryReset() {} + void onStoreSettings(char *buff) { // Called when saving to EEPROM (i.e. M500). If the ExtUI needs // permanent data to be stored, it can write up to eeprom_data_size bytes @@ -108,6 +113,8 @@ namespace ExtUI { } #if HAS_MESH + void onMeshLevelingStart() {} + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { // Called when any mesh points are updated } @@ -146,5 +153,8 @@ namespace ExtUI { } #endif + void onSteppersDisabled() {} + void onSteppersEnabled() {} } + #endif // HAS_DGUS_LCD diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp index 592d67214d..dd4b3312eb 100644 --- a/Marlin/src/lcd/extui/example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -47,9 +47,9 @@ namespace ExtUI { } void onIdle() {} void onPrinterKilled(PGM_P const error, PGM_P const component) {} - void onMediaInserted() {}; - void onMediaError() {}; - void onMediaRemoved() {}; + void onMediaInserted() {} + void onMediaError() {} + void onMediaRemoved() {} void onPlayTone(const uint16_t frequency, const uint16_t duration) {} void onPrintTimerStarted() {} void onPrintTimerPaused() {} @@ -57,6 +57,11 @@ namespace ExtUI { void onFilamentRunout(const extruder_t extruder) {} void onUserConfirmRequired(const char * const msg) {} void onStatusChanged(const char * const msg) {} + + void onHomingStart() {} + void onHomingComplete() {} + void onPrintFinished() {} + void onFactoryReset() {} void onStoreSettings(char *buff) { @@ -90,6 +95,8 @@ namespace ExtUI { } #if HAS_MESH + void onMeshLevelingStart() {} + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { // Called when any mesh points are updated } @@ -110,6 +117,9 @@ namespace ExtUI { // Called for temperature PID tuning result } #endif + + void onSteppersDisabled() {} + void onSteppersEnabled() {} } #endif // EXTUI_EXAMPLE && EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index ed7e653af1..fc9b5d0a70 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -87,8 +87,9 @@ namespace ExtUI { InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FINISHED); } - void onPrintTimerPaused() { - } + void onPrintTimerPaused() {} + + void onPrintFinished() {} void onFilamentRunout(const extruder_t extruder) { char lcd_msg[30]; @@ -97,6 +98,9 @@ namespace ExtUI { InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED, FTDI::PLAY_SYNCHRONOUS); } + void onHomingStart() {} + void onHomingComplete() {} + void onFactoryReset() { InterfaceSettingsScreen::defaultSettings(); } @@ -134,6 +138,8 @@ namespace ExtUI { } #if HAS_LEVELING && HAS_MESH + void onMeshLevelingStart() {} + void onMeshUpdate(const int8_t x, const int8_t y, const float val) { BedMeshScreen::onMeshUpdate(x, y, val); } @@ -170,6 +176,9 @@ namespace ExtUI { GOTO_SCREEN(StatusScreen); } #endif // HAS_PID_HEATING + + void onSteppersDisabled() {} + void onSteppersEnabled() {} } #endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index 5505a0dff7..bdbf3802ab 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -511,12 +511,15 @@ namespace ExtUI { // Not needed for Malyan LCD void onStatusChanged(const char * const) {} - void onMediaInserted() {}; - void onMediaError() {}; - void onMediaRemoved() {}; + void onMediaInserted() {} + void onMediaError() {} + void onMediaRemoved() {} void onPlayTone(const uint16_t, const uint16_t) {} void onFilamentRunout(const extruder_t extruder) {} void onUserConfirmRequired(const char * const) {} + void onHomingStart() {} + void onHomingComplete() {} + void onPrintFinished() {} void onFactoryReset() {} void onStoreSettings(char*) {} void onLoadSettings(const char*) {} @@ -524,6 +527,7 @@ namespace ExtUI { void onConfigurationStoreRead(bool) {} #if HAS_MESH + void onMeshLevelingStart() {} void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {} void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) {} #endif @@ -531,6 +535,9 @@ namespace ExtUI { #if ENABLED(POWER_LOSS_RECOVERY) void onPowerLossResume() {} #endif + + void onSteppersDisabled() {} + void onSteppersEnabled() {} } #endif // MALYAN_LCD diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index c429a0aade..cdf9b4412a 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -140,6 +140,7 @@ namespace ExtUI { bed_mesh_t& getMeshArray(); float getMeshPoint(const xy_uint8_t &pos); void setMeshPoint(const xy_uint8_t &pos, const float zval); + void onMeshLevelingStart(); void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval); inline void onMeshUpdate(const xy_int8_t &pos, const float zval) { onMeshUpdate(pos.x, pos.y, zval); } @@ -344,11 +345,16 @@ namespace ExtUI { void onPrintTimerStarted(); void onPrintTimerPaused(); void onPrintTimerStopped(); + void onPrintFinished(); void onFilamentRunout(const extruder_t extruder); void onUserConfirmRequired(const char * const msg); void onUserConfirmRequired_P(PGM_P const pstr); void onStatusChanged(const char * const msg); void onStatusChanged_P(PGM_P const pstr); + void onHomingStart(); + void onHomingComplete(); + void onSteppersDisabled(); + void onSteppersEnabled(); void onFactoryReset(); void onStoreSettings(char *); void onLoadSettings(const char *); From 4b6fa1b54d13eed0c40b1594ed97a229b79b4f98 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 5 Dec 2020 19:57:50 -0600 Subject: [PATCH 0689/1370] Move G29 3-point startup earlier --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 653c632f1a..15555d5f8d 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -394,6 +394,11 @@ G29_TYPE GcodeSuite::G29() { planner.synchronize(); + #if ENABLED(AUTO_BED_LEVELING_3POINT) + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling"); + points[0].z = points[1].z = points[2].z = 0; // Probe at 3 arbitrary points + #endif + if (!faux) remember_feedrate_scaling_off(); // Disable auto bed leveling during G29. @@ -411,7 +416,6 @@ G29_TYPE GcodeSuite::G29() { #endif #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (TERN1(PROBE_MANUALLY, !no_action) && (gridSpacing != bilinear_grid_spacing || probe_position_lf != bilinear_start) ) { @@ -425,18 +429,8 @@ G29_TYPE GcodeSuite::G29() { // Can't re-enable (on error) until the new grid is written abl_should_enable = false; } - #endif // AUTO_BED_LEVELING_BILINEAR - #if ENABLED(AUTO_BED_LEVELING_3POINT) - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling"); - - // Probe at 3 arbitrary points - points[0].z = points[1].z = points[2].z = 0; - - #endif // AUTO_BED_LEVELING_3POINT - } // !g29_in_progress #if ENABLED(PROBE_MANUALLY) From b6cd7aaf1789a23558af73caaea9165eba3527b4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 5 Dec 2020 19:25:34 -0600 Subject: [PATCH 0690/1370] Fix STM32F1 SERIAL_GET_TX_BUFFER_FREE --- Marlin/src/HAL/STM32F1/HAL.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index d8bba774e9..2c852f22e1 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -110,7 +110,7 @@ #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." #endif - #define SERIAL_GET_TX_BUFFER_FREE LCD_SERIAL.availableForWrite + #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() #endif // Set interrupt grouping for this MCU From 107834f899eddcfe263b0698077ab392aa865a35 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 5 Dec 2020 19:14:15 -0600 Subject: [PATCH 0691/1370] G28 tweaks --- Marlin/src/gcode/calibrate/G28.cpp | 17 ++++++----------- Marlin/src/lcd/dwin/e3v2/dwin.h | 2 ++ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 31fc1e1cf2..e2b0860eef 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -211,10 +211,6 @@ void GcodeSuite::G28() { TERN_(LASER_MOVE_G28_OFF, cutter.set_inline_enabled(false)); // turn off laser - TERN_(DWIN_CREALITY_LCD, HMI_flag.home_flag = true); - - TERN_(EXTENSIBLE_UI, ExtUI::onHomingStart()); - #if ENABLED(DUAL_X_CARRIAGE) bool IDEX_saved_duplication_state = extruder_duplication_enabled; DualXMode IDEX_saved_mode = dual_x_carriage_mode; @@ -236,17 +232,17 @@ void GcodeSuite::G28() { return; } + TERN_(DWIN_CREALITY_LCD, DWIN_StartHoming()); + TERN_(EXTENSIBLE_UI, ExtUI::onHomingStart()); + planner.synchronize(); // Wait for planner moves to finish! SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state // Disable the leveling matrix before homing #if HAS_LEVELING - - // Cancel the active G29 session - TERN_(PROBE_MANUALLY, g29_in_progress = false); - TERN_(RESTORE_LEVELING_AFTER_G28, const bool leveling_was_active = planner.leveling_active); + TERN_(PROBE_MANUALLY, g29_in_progress = false); // Cancel the active G29 session set_bed_leveling_enabled(false); #endif @@ -439,8 +435,6 @@ void GcodeSuite::G28() { do_blocking_move_to_z(delta_clip_start_height); #endif - TERN_(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_was_active)); - restore_feedrate_and_scaling(); // Restore the active tool after homing @@ -464,10 +458,11 @@ void GcodeSuite::G28() { #endif #endif + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_restore_state)); + ui.refresh(); TERN_(DWIN_CREALITY_LCD, DWIN_CompletedHoming()); - TERN_(EXTENSIBLE_UI, ExtUI::onHomingComplete()); report_current_position(); diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 5bff2e9f78..8f17c30609 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -369,5 +369,7 @@ void DWIN_Update(); void EachMomentUpdate(); void DWIN_HandleScreen(); +inline void DWIN_StartHoming() { HMI_flag.home_flag = true; } + void DWIN_CompletedHoming(); void DWIN_CompletedLeveling(); From 3a73f04fd3e5d4561859f308f3ae6c1127739fb7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 5 Dec 2020 23:05:03 -0600 Subject: [PATCH 0692/1370] G28 followup --- Marlin/src/gcode/calibrate/G28.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index e2b0860eef..f54b2fb7d4 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -435,6 +435,8 @@ void GcodeSuite::G28() { do_blocking_move_to_z(delta_clip_start_height); #endif + TERN_(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_was_active)); + restore_feedrate_and_scaling(); // Restore the active tool after homing @@ -458,8 +460,6 @@ void GcodeSuite::G28() { #endif #endif - TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_restore_state)); - ui.refresh(); TERN_(DWIN_CREALITY_LCD, DWIN_CompletedHoming()); From 72eda1d3ae64c48eb0a3098caeab35b6b192b333 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 6 Dec 2020 17:36:36 -0300 Subject: [PATCH 0693/1370] Avoid invalid memory optimizations (#20389) When building for AVR, merge-all-constants can incorrectly combine constants stored in flash with constants stored in RAM. These have different access requirements, leading to undefined behavior during execution. Co-authored-by: ellensp --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 0cff2dac60..237634a454 100644 --- a/platformio.ini +++ b/platformio.ini @@ -203,7 +203,7 @@ extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py -build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants +build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = # From 2384e5c9c9df27fe27732b6f0392b603a8933e9a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 7 Dec 2020 04:36:22 -0600 Subject: [PATCH 0694/1370] Fix fileExists, use openFailed --- Marlin/src/sd/cardreader.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index bce84bbd39..7ba9f3d3d6 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -662,14 +662,24 @@ void CardReader::openFileWrite(char * const path) { // bool CardReader::fileExists(const char * const path) { if (!isMounted()) return false; + + DEBUG_ECHOLNPAIR("fileExists: ", path); + + // Dive to the file's directory and get the base name SdFile *diveDir = nullptr; const char * const fname = diveToFile(false, diveDir, path); - if (fname) { - diveDir->rewind(); - selectByName(*diveDir, fname); - //diveDir->close(); - } - return !!fname; + if (!fname) return false; + + // Get the longname of the checked file + //diveDir->rewind(); + //selectByName(*diveDir, fname); + //diveDir->close(); + + // Try to open the file and return the result + SdFile tmpFile; + const bool success = tmpFile.open(diveDir, fname, O_READ); + if (success) tmpFile.close(); + return success; } // @@ -1231,7 +1241,7 @@ void CardReader::fileHasFinished() { if (!isMounted()) return; if (recovery.file.isOpen()) return; if (!recovery.file.open(&root, recovery.filename, read ? O_READ : O_CREAT | O_WRITE | O_TRUNC | O_SYNC)) - SERIAL_ECHOLNPAIR(STR_SD_OPEN_FILE_FAIL, recovery.filename, "."); + openFailed(recovery.filename); else if (!read) echo_write_to_file(recovery.filename); } From ea81790d486985c19f0ae5ffcd3a9453980eac35 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 7 Dec 2020 04:04:38 -0600 Subject: [PATCH 0695/1370] Watch idle() depth over 5 --- Marlin/src/MarlinCore.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index d4d22a6198..84eb7e21d1 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -709,6 +709,10 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { * - Handle Joystick jogging */ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { + #if ENABLED(MARLIN_DEV_MODE) + static uint8_t idle_depth = 0; + if (++idle_depth > 5) SERIAL_ECHOLNPAIR("idle() call depth: ", int(idle_depth)); + #endif // Core Marlin activities manage_inactivity(TERN_(ADVANCED_PAUSE_FEATURE, no_stepper_sleep)); @@ -720,7 +724,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { TERN_(MAX7219_DEBUG, max7219.idle_tasks()); // Return if setup() isn't completed - if (marlin_state == MF_INITIALIZING) return; + if (marlin_state == MF_INITIALIZING) goto IDLE_DONE; // Handle filament runout sensors TERN_(HAS_FILAMENT_SENSOR, runout.run()); @@ -764,6 +768,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { // Run i2c Position Encoders #if ENABLED(I2C_POSITION_ENCODERS) + { static millis_t i2cpem_next_update_ms; if (planner.has_blocks_queued()) { const millis_t ms = millis(); @@ -772,6 +777,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { i2cpem_next_update_ms = ms + I2CPE_MIN_UPD_TIME_MS; } } + } #endif // Auto-report Temperatures / SD Status @@ -793,6 +799,10 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { // Update the LVGL interface TERN_(HAS_TFT_LVGL_UI, LV_TASK_HANDLER()); + + IDLE_DONE: + TERN_(MARLIN_DEV_MODE, idle_depth--); + return; } /** From 1932e70e723d3200cdf8564bf658938106ffdd8a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 7 Dec 2020 05:06:09 -0600 Subject: [PATCH 0696/1370] More LPC P-string macros --- Marlin/src/HAL/LPC1768/HAL.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 51a13389b1..9a1852d94d 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -212,3 +212,11 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader #ifndef strcmp_P #define strcmp_P(a, b) strcmp((a), (b)) #endif + +#ifndef strcat_P + #define strcat_P(a, b) strcat((a), (b)) +#endif + +#ifndef strcpy_P + #define strcpy_P(a, b) strcpy((a), (b)) +#endif From 37dd0fd2d64c9b8e7c4b2af2109caa72e33b03ce Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 7 Dec 2020 05:53:15 -0600 Subject: [PATCH 0697/1370] Fix auto#.g file handling, add NO_SD_AUTOSTART (#20071) --- Marlin/Configuration_adv.h | 1 + Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/feature/powerloss.h | 2 +- Marlin/src/gcode/sd/M1001.cpp | 14 +++-- Marlin/src/inc/Conditionals_adv.h | 4 ++ Marlin/src/lcd/menu/menu_main.cpp | 4 +- Marlin/src/sd/cardreader.cpp | 93 +++++++++++++++++-------------- Marlin/src/sd/cardreader.h | 10 ++-- buildroot/tests/mega2560-tests | 2 +- 9 files changed, 78 insertions(+), 56 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 03c9ba55eb..92de09eec9 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1197,6 +1197,7 @@ #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing + //#define NO_SD_AUTOSTART // Remove auto#.g file support completely to save some Flash, SRAM //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files //#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 84eb7e21d1..0171690d4e 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -460,6 +460,7 @@ void startOrResumeJob() { #if ENABLED(SDSUPPORT) inline void abortSDPrinting() { + IF_DISABLED(NO_SD_AUTOSTART, card.autofile_cancel()); card.endFilePrint(TERN_(SD_RESORT, true)); queue.clear(); quickstop_stepper(); @@ -585,7 +586,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { if (ELAPSED(ms, next_home_key_ms)) { next_home_key_ms = ms + HOME_DEBOUNCE_DELAY; LCD_MESSAGEPGM(MSG_AUTO_HOME); - queue.enqueue_now_P(G28_STR); + queue.inject_P(G28_STR); } } #endif @@ -1354,7 +1355,6 @@ void loop() { idle(); #if ENABLED(SDSUPPORT) - card.checkautostart(); if (card.flag.abort_sd_printing) abortSDPrinting(); if (marlin_state == MF_SD_COMPLETE) finishSDPrinting(); #endif diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index f964f12294..25581e1723 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -152,7 +152,7 @@ class PrintJobRecovery { static void resume(); static void purge(); - static inline void cancel() { purge(); card.autostart_index = 0; } + static inline void cancel() { purge(); IF_DISABLED(NO_SD_AUTOSTART, card.autofile_begin()); } static void load(); static void save(const bool force=ENABLED(SAVE_EACH_CMD_MODE), const float zraise=0); diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index e4b7054bf2..406cd074c3 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -27,6 +27,10 @@ #include "../gcode.h" #include "../../module/printcounter.h" +#if DISABLED(NO_SD_AUTOSTART) + #include "../../sd/cardreader.h" +#endif + #ifdef SD_FINISHED_RELEASECOMMAND #include "../queue.h" #endif @@ -60,6 +64,11 @@ * M1001: Execute actions for SD print completion */ void GcodeSuite::M1001() { + // If there's another auto#.g file to run... + if (TERN(NO_SD_AUTOSTART, false, card.autofile_check())) return; + + // Purge the recovery file... + TERN_(POWER_LOSS_RECOVERY, recovery.purge()); // Report total print time const bool long_print = print_job_timer.duration() > 60; @@ -71,9 +80,6 @@ void GcodeSuite::M1001() { // Set the progress bar "done" state TERN_(LCD_SET_PROGRESS_MANUALLY, ui.set_progress_done()); - // Purge the recovery file - TERN_(POWER_LOSS_RECOVERY, recovery.purge()); - // Announce SD file completion { PORT_REDIRECT(SERIAL_BOTH); @@ -93,7 +99,7 @@ void GcodeSuite::M1001() { // Inject SD_FINISHED_RELEASECOMMAND, if any #ifdef SD_FINISHED_RELEASECOMMAND - queue.inject_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + gcode.process_subcommands_now_P(PSTR(SD_FINISHED_RELEASECOMMAND)); #endif TERN_(EXTENSIBLE_UI, ExtUI::onPrintFinished()); diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 1bd9dc47a4..f99e363d7b 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -142,6 +142,10 @@ #undef SD_FINISHED_RELEASECOMMAND #endif +#if ENABLED(NO_SD_AUTOSTART) + #undef MENU_ADDAUTOSTART +#endif + #if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) #define HAS_PRINT_PROGRESS 1 #endif diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index cda11bfc57..1b87e06cc8 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -136,7 +136,7 @@ void menu_main() { // Run Auto Files // #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_RUN_AUTO_FILES, card.beginautostart); + ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); #endif if (card_detected) { @@ -238,7 +238,7 @@ void menu_main() { // Autostart // #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_RUN_AUTO_FILES, card.beginautostart); + ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); #endif if (card_detected) { diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 7ba9f3d3d6..fe8bc4879a 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -61,7 +61,8 @@ card_flags_t CardReader::flag; char CardReader::filename[FILENAME_LENGTH], CardReader::longFilename[LONG_FILENAME_LENGTH]; -int8_t CardReader::autostart_index; + +IF_DISABLED(NO_SD_AUTOSTART, uint8_t CardReader::autofile_index); // = 0 #if BOTH(HAS_MULTI_SERIAL, BINARY_FILE_TRANSFER) int8_t CardReader::transfer_port_index; @@ -135,17 +136,17 @@ CardReader::CardReader() { //sort_reverse = false; #endif #endif + flag.sdprinting = flag.mounted = flag.saving = flag.logging = false; filesize = sdpos = 0; TERN_(HAS_MEDIA_SUBCALLS, file_subcall_ctr = 0); + IF_DISABLED(NO_SD_AUTOSTART, autofile_cancel()); + workDirDepth = 0; ZERO(workDirParents); - // Disable autostart until card is initialized - autostart_index = -1; - #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) SET_INPUT_PULLUP(SD_DETECT_PIN); #endif @@ -442,12 +443,14 @@ void CardReader::manage_media() { if (stat) { TERN_(SDCARD_EEPROM_EMULATION, settings.first_load()); - if (old_stat == 2) // First mount? + if (old_stat == 2) { // First mount? DEBUG_ECHOLNPGM("First mount."); - TERN(POWER_LOSS_RECOVERY, - recovery.check(), // Check for PLR file. (If not there it will beginautostart) - beginautostart() // Look for auto0.g on the next loop - ); + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.check(); // Check for PLR file. (If not there then call autofile_begin) + #elif DISABLED(NO_SD_AUTOSTART) + autofile_begin(); // Look for auto0.g on the next loop + #endif + } } } else @@ -477,12 +480,12 @@ void CardReader::release() { * Enqueues M23 and M24 commands to initiate a media print. */ void CardReader::openAndPrintFile(const char *name) { - char cmd[4 + strlen(name) + 1]; // Room for "M23 ", filename, and null + char cmd[4 + strlen(name) + 1 + 3 + 1]; // Room for "M23 ", filename, "\n", "M24", and null extern const char M23_STR[]; sprintf_P(cmd, M23_STR, name); for (char *c = &cmd[4]; *c; c++) *c = tolower(*c); - queue.enqueue_one_now(cmd); - queue.enqueue_now_P(M24_STR); + strcat_P(cmd, PSTR("\nM24")); + queue.inject(cmd); } /** @@ -511,7 +514,7 @@ void CardReader::endFilePrint(TERN_(SD_RESORT, const bool re_sort/*=false*/)) { void CardReader::openLogFile(char * const path) { flag.logging = DISABLED(SDCARD_READONLY); - TERN(SDCARD_READONLY,,openFileWrite(path)); + IF_DISABLED(SDCARD_READONLY, openFileWrite(path)); } // @@ -735,42 +738,48 @@ void CardReader::write_command(char * const buf) { if (file.writeError) SERIAL_ERROR_MSG(STR_SD_ERR_WRITE_TO_FILE); } -// -// Run the next autostart file. Called: -// - On boot after successful card init -// - After finishing the previous autostart file -// - From the LCD command to run the autostart file -// +#if DISABLED(NO_SD_AUTOSTART) + /** + * Run all the auto#.g files. Called: + * - On boot after successful card init. + * - From the LCD command to Run Auto Files + */ + void CardReader::autofile_begin() { + autofile_index = 1; + (void)autofile_check(); + } -void CardReader::checkautostart() { + /** + * Run the next auto#.g file. Called: + * - On boot after successful card init + * - After finishing the previous auto#.g file + * - From the LCD command to begin the auto#.g files + * + * Return 'true' if there was nothing to do + */ + bool CardReader::autofile_check() { + if (!autofile_index) return true; - if (autostart_index < 0 || flag.sdprinting) return; + if (!isMounted()) + mount(); + else if (ENABLED(SDCARD_EEPROM_EMULATION)) + settings.first_load(); - if (!isMounted()) mount(); - TERN_(SDCARD_EEPROM_EMULATION, else settings.first_load()); - - // Don't run auto#.g when a PLR file exists - if (isMounted() && TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) { - char autoname[8]; - sprintf_P(autoname, PSTR("auto%c.g"), autostart_index + '0'); - dir_t p; - root.rewind(); - while (root.readDir(&p, nullptr) > 0) { - for (int8_t i = (int8_t)strlen((char*)p.name); i--;) p.name[i] = tolower(p.name[i]); - if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { + // Don't run auto#.g when a PLR file exists + if (isMounted() && TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) { + char autoname[10]; + sprintf_P(autoname, PSTR("/auto%c.g"), '0' + autofile_index - 1); + if (fileExists(autoname)) { + cdroot(); openAndPrintFile(autoname); - autostart_index++; - return; + autofile_index++; + return false; } } + autofile_cancel(); + return true; } - autostart_index = -1; -} - -void CardReader::beginautostart() { - autostart_index = 0; - cdroot(); -} +#endif void CardReader::closefile(const bool store_location/*=false*/) { file.sync(); diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index dabbf719f9..b775d8a873 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -90,10 +90,12 @@ public: static void openLogFile(char * const path); static void write_command(char * const buf); - // Auto-Start files - static int8_t autostart_index; // Index of autoX.g files - static void beginautostart(); - static void checkautostart(); + #if DISABLED(NO_SD_AUTOSTART) // Auto-Start auto#.g file handling + static uint8_t autofile_index; // Next auto#.g index to run, plus one. Ignored by autofile_check when zero. + static void autofile_begin(); // Begin check. Called automatically after boot-up. + static bool autofile_check(); // Check for the next auto-start file and run it. + static inline void autofile_cancel() { autofile_index = 0; } + #endif // Basic file ops static void openFileRead(char * const path, const uint8_t subcall=0); diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index da3a79f58c..0a17cacba1 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -49,7 +49,7 @@ opt_set TEMP_SENSOR_4 1000 opt_set TEMP_SENSOR_BED 1 opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ - SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS \ + SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS NO_SD_AUTOSTART \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ From 50247fc89476fa9608444c422e8f25c6bdd9b503 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 8 Dec 2020 09:53:53 +1300 Subject: [PATCH 0698/1370] Shorten Filament Load/Unload Strings to Fit on Graphical Displays (#20369) Co-authored-by: ellensp Co-authored-by: Victor Mateus Oliveira --- Marlin/src/lcd/language/language_en.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 2892f79df8..0b96403b72 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -431,9 +431,9 @@ namespace Language_en { PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Change Filament"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Change Filament *"); PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Load Filament"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Load Filament *"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Load *"); PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Unload Filament"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Unload Filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Unload *"); PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Unload All"); PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Attach Media"); PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Change Media"); From 47fd7fcaeaae38cdf97532ee9fea81095f338552 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 8 Dec 2020 09:57:00 +1300 Subject: [PATCH 0699/1370] Allow BTT EXP-MOT be used with Displays that needs only EXP 1 (#20396) Co-authored-by: ellensp Co-authored-by: Victor Mateus Oliveira --- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index e6cfc0afaf..867b6b6871 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -34,7 +34,11 @@ //#define HAS_BTT_EXP_MOT 1 #if BOTH(HAS_WIRED_LCD,HAS_BTT_EXP_MOT) - #ERROR "Having a LCD on EXP1/EXP2 and a expanion motor module on EXP1/EXP2 is not possable." + #if EITHER(CR10_STOCKDISPLAY,ENDER2_STOCKDISPLAY) + #define EXP_MOT_USE_EXP2_ONLY + #else + #error "Having a LCD that uses both EXP1/EXP2 and a expanion motor module on EXP1/EXP2 is not possible." + #endif #endif // Ignore temp readings during development. @@ -133,36 +137,48 @@ * (M3DIR) 0.15 | · · | 0.17 (M3STP) (M3RX) 0.28 | · · | 1.30 (M3DIAG) * ----- ----- * EXP2 EXP1 + * + * NB In EXP_MOT_USE_EXP2_ONLY mode EXP1 is not used and M2EN and M3EN need to be jumpered to M1EN */ // M1 on Driver Expansion Module #define E2_STEP_PIN EXPA2_05_PIN #define E2_DIR_PIN EXPA2_06_PIN #define E2_ENABLE_PIN EXPA2_04_PIN - #define E2_DIAG_PIN EXPA1_06_PIN - #define E2_CS_PIN EXPA1_05_PIN - #if HAS_TMC_UART - #define E2_SERIAL_TX_PIN EXPA1_05_PIN - #define E2_SERIAL_RX_PIN EXPA1_05_PIN + #ifndef EXP_MOT_USE_EXP2_ONLY + #define E2_DIAG_PIN EXPA1_06_PIN + #define E2_CS_PIN EXPA1_05_PIN + #if HAS_TMC_UART + #define E2_SERIAL_TX_PIN EXPA1_05_PIN + #define E2_SERIAL_RX_PIN EXPA1_05_PIN + #endif #endif // M2 on Driver Expansion Module #define E3_STEP_PIN EXPA2_08_PIN #define E3_DIR_PIN EXPA2_07_PIN - #define E3_ENABLE_PIN EXPA1_03_PIN - #define E3_DIAG_PIN EXPA1_08_PIN - #define E3_CS_PIN EXPA1_07_PIN - #if HAS_TMC_UART - #define E3_SERIAL_TX_PIN EXPA1_07_PIN - #define E3_SERIAL_RX_PIN EXPA1_07_PIN + #ifndef EXP_MOT_USE_EXP2_ONLY + #define E3_ENABLE_PIN EXPA1_03_PIN + #define E3_DIAG_PIN EXPA1_08_PIN + #define E3_CS_PIN EXPA1_07_PIN + #if HAS_TMC_UART + #define E3_SERIAL_TX_PIN EXPA1_07_PIN + #define E3_SERIAL_RX_PIN EXPA1_07_PIN + #endif + #else + #define E3_ENABLE_PIN EXPA2_04_PIN #endif // M3 on Driver Expansion Module #define E4_STEP_PIN EXPA2_10_PIN #define E4_DIR_PIN EXPA2_09_PIN - #define E4_ENABLE_PIN EXPA1_04_PIN - #define E4_DIAG_PIN EXPA1_10_PIN - #define E4_CS_PIN EXPA1_09_PIN - #if HAS_TMC_UART - #define E4_SERIAL_TX_PIN EXPA1_09_PIN - #define E4_SERIAL_RX_PIN EXPA1_09_PIN + #ifndef EXP_MOT_USE_EXP2_ONLY + #define E4_ENABLE_PIN EXPA1_04_PIN + #define E4_DIAG_PIN EXPA1_10_PIN + #define E4_CS_PIN EXPA1_09_PIN + #if HAS_TMC_UART + #define E4_SERIAL_TX_PIN EXPA1_09_PIN + #define E4_SERIAL_RX_PIN EXPA1_09_PIN + #endif + #else + #define E4_ENABLE_PIN EXPA2_04_PIN #endif #endif // HAS_BTT_EXP_MOT From 91e959955410e7de604c81dca73913b55459c2dd Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 8 Dec 2020 02:26:39 -0300 Subject: [PATCH 0700/1370] SPI TFT for STM32F4 boards (#20384) * fix pinsDebug for F1 boards * add MKS Robin PRO V2 board - development board * tft spi working with F4 boards * pins formating * sanity check for TFT on supported cores in STM32 * Fix tabs/spaces in pins file Co-authored-by: Jason Smith --- Marlin/src/HAL/STM32/inc/SanityCheck.h | 4 + Marlin/src/HAL/STM32/pinsDebug.h | 143 +++---- Marlin/src/HAL/STM32/tft/tft_spi.cpp | 108 +++-- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 381 ++++++++++++++++++ platformio.ini | 20 + 7 files changed, 540 insertions(+), 119 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index c51fecc7bd..64632475fd 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -51,3 +51,7 @@ #elif ENABLED(SERIAL_STATS_DROPPED_RX) #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." #endif + +#if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) && NOT_TARGET(STM32F4xx, STM32F1xx) + #error "TFT_COLOR_UI, TFT_LVGL_UI and TFT_CLASSIC_U are currently only supported on STM32F4 and STM32F1 hardware." +#endif diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h index 77c93ee41e..64ee2b03db 100644 --- a/Marlin/src/HAL/STM32/pinsDebug.h +++ b/Marlin/src/HAL/STM32/pinsDebug.h @@ -137,32 +137,19 @@ const XrefInfo pin_xref[] PROGMEM = { #endif uint8_t get_pin_mode(const pin_t Ard_num) { - uint32_t mode_all = 0; const PinName dp = digitalPinToPinName(Ard_num); - switch (PORT_ALPHA(dp)) { - case 'A' : mode_all = GPIOA->MODER; break; - case 'B' : mode_all = GPIOB->MODER; break; - case 'C' : mode_all = GPIOC->MODER; break; - case 'D' : mode_all = GPIOD->MODER; break; - #ifdef PE_0 - case 'E' : mode_all = GPIOE->MODER; break; - #elif defined(PF_0) - case 'F' : mode_all = GPIOF->MODER; break; - #elif defined(PG_0) - case 'G' : mode_all = GPIOG->MODER; break; - #elif defined(PH_0) - case 'H' : mode_all = GPIOH->MODER; break; - #elif defined(PI_0) - case 'I' : mode_all = GPIOI->MODER; break; - #elif defined(PJ_0) - case 'J' : mode_all = GPIOJ->MODER; break; - #elif defined(PK_0) - case 'K' : mode_all = GPIOK->MODER; break; - #elif defined(PL_0) - case 'L' : mode_all = GPIOL->MODER; break; - #endif + uint32_t ll_pin = STM_LL_GPIO_PIN(dp); + GPIO_TypeDef *port = get_GPIO_Port(STM_PORT(dp)); + uint32_t mode = LL_GPIO_GetPinMode(port, ll_pin); + switch (mode) + { + case LL_GPIO_MODE_ANALOG: return MODE_PIN_ANALOG; + case LL_GPIO_MODE_INPUT: return MODE_PIN_INPUT; + case LL_GPIO_MODE_OUTPUT: return MODE_PIN_OUTPUT; + case LL_GPIO_MODE_ALTERNATE: return MODE_PIN_ALT; + TERN_(STM32F1xx, case LL_GPIO_MODE_FLOATING:) + default: return 0; } - return (mode_all >> (2 * uint8_t(PIN_NUM(dp)))) & 0x03; } bool GET_PINMODE(const pin_t Ard_num) { @@ -217,58 +204,62 @@ bool pwm_status(const pin_t Ard_num) { } void pwm_details(const pin_t Ard_num) { - if (pwm_status(Ard_num)) { - uint32_t alt_all = 0; - const PinName dp = digitalPinToPinName(Ard_num); - pin_t pin_number = uint8_t(PIN_NUM(dp)); - const bool over_7 = pin_number >= 8; - const uint8_t ind = over_7 ? 1 : 0; - switch (PORT_ALPHA(dp)) { // get alt function - case 'A' : alt_all = GPIOA->AFR[ind]; break; - case 'B' : alt_all = GPIOB->AFR[ind]; break; - case 'C' : alt_all = GPIOC->AFR[ind]; break; - case 'D' : alt_all = GPIOD->AFR[ind]; break; - #ifdef PE_0 - case 'E' : alt_all = GPIOE->AFR[ind]; break; - #elif defined (PF_0) - case 'F' : alt_all = GPIOF->AFR[ind]; break; - #elif defined (PG_0) - case 'G' : alt_all = GPIOG->AFR[ind]; break; - #elif defined (PH_0) - case 'H' : alt_all = GPIOH->AFR[ind]; break; - #elif defined (PI_0) - case 'I' : alt_all = GPIOI->AFR[ind]; break; - #elif defined (PJ_0) - case 'J' : alt_all = GPIOJ->AFR[ind]; break; - #elif defined (PK_0) - case 'K' : alt_all = GPIOK->AFR[ind]; break; - #elif defined (PL_0) - case 'L' : alt_all = GPIOL->AFR[ind]; break; - #endif - } - if (over_7) pin_number -= 8; + #ifndef STM32F1xx + if (pwm_status(Ard_num)) { + uint32_t alt_all = 0; + const PinName dp = digitalPinToPinName(Ard_num); + pin_t pin_number = uint8_t(PIN_NUM(dp)); + const bool over_7 = pin_number >= 8; + const uint8_t ind = over_7 ? 1 : 0; + switch (PORT_ALPHA(dp)) { // get alt function + case 'A' : alt_all = GPIOA->AFR[ind]; break; + case 'B' : alt_all = GPIOB->AFR[ind]; break; + case 'C' : alt_all = GPIOC->AFR[ind]; break; + case 'D' : alt_all = GPIOD->AFR[ind]; break; + #ifdef PE_0 + case 'E' : alt_all = GPIOE->AFR[ind]; break; + #elif defined (PF_0) + case 'F' : alt_all = GPIOF->AFR[ind]; break; + #elif defined (PG_0) + case 'G' : alt_all = GPIOG->AFR[ind]; break; + #elif defined (PH_0) + case 'H' : alt_all = GPIOH->AFR[ind]; break; + #elif defined (PI_0) + case 'I' : alt_all = GPIOI->AFR[ind]; break; + #elif defined (PJ_0) + case 'J' : alt_all = GPIOJ->AFR[ind]; break; + #elif defined (PK_0) + case 'K' : alt_all = GPIOK->AFR[ind]; break; + #elif defined (PL_0) + case 'L' : alt_all = GPIOL->AFR[ind]; break; + #endif + } + if (over_7) pin_number -= 8; - uint8_t alt_func = (alt_all >> (4 * pin_number)) & 0x0F; - SERIAL_ECHOPAIR("Alt Function: ", alt_func); - if (alt_func < 10) SERIAL_CHAR(' '); - SERIAL_ECHOPGM(" - "); - switch (alt_func) { - case 0 : SERIAL_ECHOPGM("system (misc. I/O)"); break; - case 1 : SERIAL_ECHOPGM("TIM1/TIM2 (probably PWM)"); break; - case 2 : SERIAL_ECHOPGM("TIM3..5 (probably PWM)"); break; - case 3 : SERIAL_ECHOPGM("TIM8..11 (probably PWM)"); break; - case 4 : SERIAL_ECHOPGM("I2C1..3"); break; - case 5 : SERIAL_ECHOPGM("SPI1/SPI2"); break; - case 6 : SERIAL_ECHOPGM("SPI3"); break; - case 7 : SERIAL_ECHOPGM("USART1..3"); break; - case 8 : SERIAL_ECHOPGM("USART4..6"); break; - case 9 : SERIAL_ECHOPGM("CAN1/CAN2, TIM12..14 (probably PWM)"); break; - case 10 : SERIAL_ECHOPGM("OTG"); break; - case 11 : SERIAL_ECHOPGM("ETH"); break; - case 12 : SERIAL_ECHOPGM("FSMC, SDIO, OTG"); break; - case 13 : SERIAL_ECHOPGM("DCMI"); break; - case 14 : SERIAL_ECHOPGM("unused (shouldn't see this)"); break; - case 15 : SERIAL_ECHOPGM("EVENTOUT"); break; + uint8_t alt_func = (alt_all >> (4 * pin_number)) & 0x0F; + SERIAL_ECHOPAIR("Alt Function: ", alt_func); + if (alt_func < 10) SERIAL_CHAR(' '); + SERIAL_ECHOPGM(" - "); + switch (alt_func) { + case 0 : SERIAL_ECHOPGM("system (misc. I/O)"); break; + case 1 : SERIAL_ECHOPGM("TIM1/TIM2 (probably PWM)"); break; + case 2 : SERIAL_ECHOPGM("TIM3..5 (probably PWM)"); break; + case 3 : SERIAL_ECHOPGM("TIM8..11 (probably PWM)"); break; + case 4 : SERIAL_ECHOPGM("I2C1..3"); break; + case 5 : SERIAL_ECHOPGM("SPI1/SPI2"); break; + case 6 : SERIAL_ECHOPGM("SPI3"); break; + case 7 : SERIAL_ECHOPGM("USART1..3"); break; + case 8 : SERIAL_ECHOPGM("USART4..6"); break; + case 9 : SERIAL_ECHOPGM("CAN1/CAN2, TIM12..14 (probably PWM)"); break; + case 10 : SERIAL_ECHOPGM("OTG"); break; + case 11 : SERIAL_ECHOPGM("ETH"); break; + case 12 : SERIAL_ECHOPGM("FSMC, SDIO, OTG"); break; + case 13 : SERIAL_ECHOPGM("DCMI"); break; + case 14 : SERIAL_ECHOPGM("unused (shouldn't see this)"); break; + case 15 : SERIAL_ECHOPGM("EVENTOUT"); break; + } } - } + #else + // TODO: F1 doesn't support changing pins function, so we need to check the function of the PIN and if it's enabled + #endif } // pwm_details diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp index aed15ad66d..d64ebcfe4b 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -34,35 +34,25 @@ DMA_HandleTypeDef TFT_SPI::DMAtx; void TFT_SPI::Init() { SPI_TypeDef *spiInstance; - #if PIN_EXISTS(TFT_RESET) - OUT_WRITE(TFT_RESET_PIN, HIGH); - HAL_Delay(100); - #endif - - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - #endif - OUT_WRITE(TFT_A0_PIN, HIGH); OUT_WRITE(TFT_CS_PIN, HIGH); if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return; if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI)) return; - #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN) - if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return; + #if PIN_EXISTS(TFT_MISO) + if (TFT_MISO_PIN != TFT_MOSI_PIN) + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return; #endif SPIx.Instance = spiInstance; SPIx.State = HAL_SPI_STATE_RESET; SPIx.Init.NSS = SPI_NSS_SOFT; SPIx.Init.Mode = SPI_MODE_MASTER; - SPIx.Init.Direction = - #if TFT_MISO_PIN == TFT_MOSI_PIN - SPI_DIRECTION_1LINE; - #else - SPI_DIRECTION_2LINES; - #endif + if (TFT_MISO_PIN == TFT_MOSI_PIN) + SPIx.Init.Direction = SPI_DIRECTION_1LINE; + else + SPIx.Init.Direction = SPI_DIRECTION_2LINES; SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; SPIx.Init.CLKPhase = SPI_PHASE_1EDGE; SPIx.Init.CLKPolarity = SPI_POLARITY_LOW; @@ -74,31 +64,50 @@ void TFT_SPI::Init() { pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK); pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI); - #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN) - pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO); + #if PIN_EXISTS(TFT_MISO) + if (TFT_MISO_PIN != TFT_MOSI_PIN) + pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO); #endif pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN); #ifdef SPI1_BASE if (SPIx.Instance == SPI1) { __HAL_RCC_SPI1_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); + #ifdef STM32F1xx + __HAL_RCC_DMA1_CLK_ENABLE(); + DMAtx.Instance = DMA1_Channel3; + #elif defined(STM32F4xx) + __HAL_RCC_DMA2_CLK_ENABLE(); + DMAtx.Instance = DMA2_Stream3; + DMAtx.Init.Channel = DMA_CHANNEL_3; + #endif SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; - DMAtx.Instance = DMA1_Channel3; } #endif #ifdef SPI2_BASE if (SPIx.Instance == SPI2) { __HAL_RCC_SPI2_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); - DMAtx.Instance = DMA1_Channel5; + #ifdef STM32F1xx + __HAL_RCC_DMA1_CLK_ENABLE(); + DMAtx.Instance = DMA1_Channel5; + #elif defined(STM32F4xx) + __HAL_RCC_DMA1_CLK_ENABLE(); + DMAtx.Instance = DMA1_Stream4; + DMAtx.Init.Channel = DMA_CHANNEL_4; + #endif } #endif #ifdef SPI3_BASE if (SPIx.Instance == SPI3) { __HAL_RCC_SPI3_CLK_ENABLE(); - __HAL_RCC_DMA2_CLK_ENABLE(); - DMAtx.Instance = DMA2_Channel2; + #ifdef STM32F1xx + __HAL_RCC_DMA2_CLK_ENABLE(); + DMAtx.Instance = DMA2_Channel2; + #elif defined(STM32F4xx) + __HAL_RCC_DMA1_CLK_ENABLE(); + DMAtx.Instance = DMA1_Stream5; + DMAtx.Init.Channel = DMA_CHANNEL_5; + #endif } #endif @@ -110,6 +119,9 @@ void TFT_SPI::Init() { DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; DMAtx.Init.Mode = DMA_NORMAL; DMAtx.Init.Priority = DMA_PRIORITY_LOW; + #if defined(STM32F4xx) + DMAtx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + #endif } void TFT_SPI::DataTransferBegin(uint16_t DataSize) { @@ -142,12 +154,12 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { __HAL_SPI_ENABLE(&SPIx); for (i = 0; i < 4; i++) { - #if TFT_MISO_PIN != TFT_MOSI_PIN + if (TFT_MISO_PIN != TFT_MOSI_PIN) { //if (hspi->Init.Direction == SPI_DIRECTION_2LINES) { while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} SPIx.Instance->DR = 0; //} - #endif + } while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} Data = (Data << 8) | SPIx.Instance->DR; } @@ -162,21 +174,34 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { } bool TFT_SPI::isBusy() { - if (DMAtx.Instance->CCR & DMA_CCR_EN) + #if defined(STM32F1xx) + volatile bool dmaEnabled = (DMAtx.Instance->CCR & DMA_CCR_EN) != RESET; + #elif defined(STM32F4xx) + volatile bool dmaEnabled = DMAtx.Instance->CR & DMA_SxCR_EN; + #endif + if (dmaEnabled) { if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) Abort(); - return DMAtx.Instance->CCR & DMA_CCR_EN; + } + else { + Abort(); + } + return dmaEnabled; } void TFT_SPI::Abort() { - __HAL_DMA_DISABLE(&DMAtx); + // First, abort any running dma + HAL_DMA_Abort(&DMAtx); + // DeInit objects + HAL_DMA_DeInit(&DMAtx); + HAL_SPI_DeInit(&SPIx); + // Deselect CS DataTransferEnd(); } void TFT_SPI::Transmit(uint16_t Data) { - #if TFT_MISO_PIN == TFT_MOSI_PIN + if (TFT_MISO_PIN == TFT_MOSI_PIN) SPI_1LINE_TX(&SPIx); - #endif __HAL_SPI_ENABLE(&SPIx); @@ -185,26 +210,23 @@ void TFT_SPI::Transmit(uint16_t Data) { while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {} - #if TFT_MISO_PIN != TFT_MOSI_PIN + if (TFT_MISO_PIN != TFT_MOSI_PIN) __HAL_SPI_CLEAR_OVRFLAG(&SPIx); /* Clear overrun flag in 2 Lines communication mode because received is not read */ - #endif } void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + // Wait last dma finish, to start another + while(isBusy()) { } + DMAtx.Init.MemInc = MemoryIncrease; HAL_DMA_Init(&DMAtx); + if (TFT_MISO_PIN == TFT_MOSI_PIN) + SPI_1LINE_TX(&SPIx); + DataTransferBegin(); - #if TFT_MISO_PIN == TFT_MOSI_PIN - SPI_1LINE_TX(&SPIx); - #endif - - DMAtx.DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << DMAtx.ChannelIndex); - DMAtx.Instance->CNDTR = Count; - DMAtx.Instance->CPAR = (uint32_t)&(SPIx.Instance->DR); - DMAtx.Instance->CMAR = (uint32_t)Data; - __HAL_DMA_ENABLE(&DMAtx); + HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(SPIx.Instance->DR), Count); __HAL_SPI_ENABLE(&SPIx); SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 643d577d1b..7f0a99dca3 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -365,6 +365,7 @@ #define BOARD_FYSETC_S6_V2_0 4216 // FYSETC S6 v2.0 board #define BOARD_FLYF407ZG 4217 // FLYF407ZG board (STM32F407ZG) #define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_MKS_ROBIN_PRO_V2 4219 // MKS Robin Pro V2 (STM32F407VE) // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index fbae5356ca..c9f6f7b3b3 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -588,6 +588,8 @@ #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG #elif MB(MKS_ROBIN2) #include "stm32f4/pins_MKS_ROBIN2.h" // STM32F4 env:MKS_ROBIN2 +#elif MB(MKS_ROBIN_PRO_V2) + #include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2 // // ARM Cortex M7 diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h new file mode 100644 index 0000000000..e3065439d7 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -0,0 +1,381 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(STM32F4, STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS Robin Nano V3 supports up to 1 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "MKS Robin PRO V2" + +// Use one of these or SDCard-based Emulation will be used +//#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation +//#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation +#define I2C_EEPROM + +// +// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role +// + +// +// Note: MKS Robin board is using SPI2 interface. +// +//#define SPI_MODULE 2 + +// +// Limit Switches +// +#define X_DIAG_PIN PA15 +#define Y_DIAG_PIN PA12 +#define Z_DIAG_PIN PA11 +#define E0_DIAG_PIN PC4 +#define E1_DIAG_PIN PE7 + +// + +#define X_STOP_PIN PA15 +#define Y_STOP_PIN PA12 +#define Z_MIN_PIN PA11 +#define Z_MAX_PIN PC4 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA4 // MT_DET +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PE4 +#define X_STEP_PIN PE3 +#define X_DIR_PIN PE2 +#ifndef X_CS_PIN + #define X_CS_PIN PD5 +#endif + +#define Y_ENABLE_PIN PE1 +#define Y_STEP_PIN PE0 +#define Y_DIR_PIN PB9 +#ifndef Y_CS_PIN + #define Y_CS_PIN PD7 +#endif + +#define Z_ENABLE_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB4 +#ifndef Z_CS_PIN + #define Z_CS_PIN PD4 +#endif + +#define E0_ENABLE_PIN PB3 +#define E0_STEP_PIN PD6 +#define E0_DIR_PIN PD3 +#ifndef E0_CS_PIN + #define E0_CS_PIN PD9 +#endif + +#define E1_ENABLE_PIN PA3 +#define E1_STEP_PIN PD15 +#define E1_DIR_PIN PA1 +#ifndef E1_CS_PIN + #define E1_CS_PIN PD8 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PD14 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PD1 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PD0 + #endif +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial1 + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + + #define X_SERIAL_TX_PIN PD5 + #define X_SERIAL_RX_PIN PD5 + + #define Y_SERIAL_TX_PIN PD7 + #define Y_SERIAL_RX_PIN PD7 + + #define Z_SERIAL_TX_PIN PD4 + #define Z_SERIAL_RX_PIN PD4 + + #define E0_SERIAL_TX_PIN PD9 + #define E0_SERIAL_RX_PIN PD9 + + #define E1_SERIAL_TX_PIN PD8 + #define E1_SERIAL_RX_PIN PD8 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif // TMC2208 || TMC2209 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // TH1 +#define TEMP_1_PIN PC2 // TH2 +#define TEMP_BED_PIN PC0 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC3 // HEATER1 +#define HEATER_1_PIN PB0 // HEATER2 +#define HEATER_BED_PIN PA0 // HOT BED + +#define FAN_PIN PB1 // FAN + +// +// Thermocouples +// +//#define MAX6675_SS_PIN PE5 // TC1 - CS1 +//#define MAX6675_SS_PIN PE6 // TC2 - CS2 + +// +// Misc. Functions +// +// #define POWER_LOSS_PIN PA2 // PW_DET +// #define PS_ON_PIN PA3 // PW_OFF +// #define SUICIDE_PIN PB2 // Enable MKSPWC support +// #define KILL_PIN PA2 // Enable MKSPWC support +// #define KILL_PIN_INVERTING true // Enable MKSPWC support +#define SERVO0_PIN PA8 // Enable BLTOUCH support +//#define LED_PIN PB2 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +// #define USE_NEW_SPI_API 1 + +// +// Onboard SD card +// NOT compatible with LCD +// +// detect pin dont work when ONBOARD and NO_SD_HOST_DRIVE disabled +#if !defined(SDCARD_CONNECTION) || SDCARD_CONNECTION == ONBOARD + #define CUSTOM_SPI_PINS + #if ENABLED(CUSTOM_SPI_PINS) + + #if USE_NEW_SPI_API + #define SD_SPI MARLIN_SPI(HardwareSPI3, PC9) + #else + #define ENABLE_SPI3 + #define SS_PIN -1 + #define SDSS PC9 + #define SCK_PIN PC10 + #define MISO_PIN PC11 + #define MOSI_PIN PC12 + #endif + #define SD_DETECT_PIN PD12 + #endif +#endif + +/* +// +// LCD SD +// +#if SDCARD_CONNECTION == LCD + #define CUSTOM_SPI_PINS + #if ENABLED(CUSTOM_SPI_PINS) + #define ENABLE_SPI1 + #define SDSS PE10 + #define SCK_PIN PA5 + #define MISO_PIN PA6 + #define MOSI_PIN PA7 + #define SD_DETECT_PIN PE12 + #endif +#endif +*/ + +// +// LCD / Controller +#define SPI_FLASH +// #define HAS_SPI_FLASH 1 +#define SPI_DEVICE 2 +#define SPI_FLASH_SIZE 0x1000000 +#if ENABLED(SPI_FLASH) + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif + +/** + * _____ _____ + * (BEEPER)PC5 | · · | PE13(BTN_ENC) (SPI1 MISO) PA6 | · · | PA5 (SPI1 SCK) + * (LCD_EN)PD13 | · · | PC6(LCD_RS) (BTN_EN1) PE8 | · · | PE10 (SPI1 CS) + * (LCD_D4)PE14 | · · | PE15(LCD_D5) (BTN_EN2) PE11 | · · | PA7 (SPI1 MOSI) + * (LCD_D6)PD11 | · · | PD10(LCD_D7) (SPI DET) PE12 | · · | RESET + * GND | · · | 5V GND | · · | 3.3V + *  ̄ ̄ ̄  ̄ ̄ ̄ + * EXP1 EXP2 + */ + +#if EITHER(TFT_480x320_SPI, TFT_LVGL_UI_SPI) + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X -17253 + #endif + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y 11579 + #endif + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X 514 + #endif + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y -24 + #endif + #ifndef TOUCH_ORIENTATION + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE + #endif + + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + #define LCD_BACKLIGHT_PIN PD13 + #ifndef TFT_WIDTH + #define TFT_WIDTH 480 + #endif + #ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 + #endif + + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + + // #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 + +#elif HAS_SPI_LCD + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define LCD_BACKLIGHT_PIN -1 + + // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) + #if ENABLED(MKS_MINI_12864) + //#define LCD_BACKLIGHT_PIN -1 + //#define LCD_RESET_PIN -1 + #define DOGLCD_A0 PD11 + #define DOGLCD_CS PE15 + //#define DOGLCD_SCK PA5 + //#define DOGLCD_MOSI PA7 + + // Required for MKS_MINI_12864 with this board + //#define MKS_LCD12864B + //#undef SHOW_BOOTSCREEN + + #else // !MKS_MINI_12864 + + #define LCD_PINS_D4 PE14 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PE15 + #define LCD_PINS_D6 PD11 + #define LCD_PINS_D7 PD10 + #endif + + #ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(600) + #endif + + #endif // !MKS_MINI_12864 + +#elif ENABLED(SPI_GRAPHICAL_TFT) + #define SPI_TFT_CS_PIN PD11 + #define SPI_TFT_SCK_PIN PA5 + #define SPI_TFT_MISO_PIN PA6 + #define SPI_TFT_MOSI_PIN PA7 + #define SPI_TFT_DC_PIN PD10 + #define SPI_TFT_RST_PIN PC6 + + #define LCD_BACKLIGHT_PIN PD13 + + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 +#endif // HAS_SPI_LCD diff --git a/platformio.ini b/platformio.ini index 237634a454..a8b81d755e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1351,6 +1351,26 @@ extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/stm32_bootloader.py buildroot/share/PlatformIO/scripts/mks_encrypt.py +# +# MKS Robin Pro V2 +# +[env:mks_robin_pro2] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DHAL_HCD_MODULE_ENABLED -DUSBHOST -DARDUINO_BLACK_F407VE +board = genericSTM32F407VET6 +board_build.core = stm32 +board_build.variant = MARLIN_F407VE +board_build.ldscript = ldscript.ld +board_build.firmware = Robin_nano35.bin +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py + ################################# # # # Other Architectures # From ad7fe15154c370337ab49c91ef0e6c6f2686c08c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 8 Dec 2020 20:17:55 -0600 Subject: [PATCH 0701/1370] Style, spacing, typo cleanup for recent changes --- Marlin/src/HAL/STM32/inc/SanityCheck.h | 2 +- Marlin/src/HAL/STM32/pinsDebug.h | 3 +- Marlin/src/HAL/STM32/tft/tft_spi.cpp | 35 +++--- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 4 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 118 +++++++++--------- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 76 +++++------ Marlin/src/pins/ramps/pins_K8600.h | 4 +- Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 4 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 4 +- Marlin/src/pins/stm32f1/pins_CREALITY_V427.h | 4 +- Marlin/src/pins/stm32f1/pins_CREALITY_V452.h | 6 +- .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 2 +- platformio.ini | 8 +- 13 files changed, 133 insertions(+), 137 deletions(-) diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 64632475fd..4df75a0505 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -53,5 +53,5 @@ #endif #if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) && NOT_TARGET(STM32F4xx, STM32F1xx) - #error "TFT_COLOR_UI, TFT_LVGL_UI and TFT_CLASSIC_U are currently only supported on STM32F4 and STM32F1 hardware." + #error "TFT_COLOR_UI, TFT_LVGL_UI and TFT_CLASSIC_UI are currently only supported on STM32F4 and STM32F1 hardware." #endif diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h index 64ee2b03db..048f788e3d 100644 --- a/Marlin/src/HAL/STM32/pinsDebug.h +++ b/Marlin/src/HAL/STM32/pinsDebug.h @@ -141,8 +141,7 @@ uint8_t get_pin_mode(const pin_t Ard_num) { uint32_t ll_pin = STM_LL_GPIO_PIN(dp); GPIO_TypeDef *port = get_GPIO_Port(STM_PORT(dp)); uint32_t mode = LL_GPIO_GetPinMode(port, ll_pin); - switch (mode) - { + switch (mode) { case LL_GPIO_MODE_ANALOG: return MODE_PIN_ANALOG; case LL_GPIO_MODE_INPUT: return MODE_PIN_INPUT; case LL_GPIO_MODE_OUTPUT: return MODE_PIN_OUTPUT; diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp index d64ebcfe4b..1c61d09529 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -40,19 +40,15 @@ void TFT_SPI::Init() { if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return; if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI)) return; - #if PIN_EXISTS(TFT_MISO) - if (TFT_MISO_PIN != TFT_MOSI_PIN) - if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return; + #if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return; #endif SPIx.Instance = spiInstance; SPIx.State = HAL_SPI_STATE_RESET; SPIx.Init.NSS = SPI_NSS_SOFT; SPIx.Init.Mode = SPI_MODE_MASTER; - if (TFT_MISO_PIN == TFT_MOSI_PIN) - SPIx.Init.Direction = SPI_DIRECTION_1LINE; - else - SPIx.Init.Direction = SPI_DIRECTION_2LINES; + SPIx.Init.Direction = (TFT_MISO_PIN == TFT_MOSI_PIN) ? SPI_DIRECTION_1LINE : SPI_DIRECTION_2LINES; SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; SPIx.Init.CLKPhase = SPI_PHASE_1EDGE; SPIx.Init.CLKPolarity = SPI_POLARITY_LOW; @@ -64,9 +60,8 @@ void TFT_SPI::Init() { pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK); pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI); - #if PIN_EXISTS(TFT_MISO) - if (TFT_MISO_PIN != TFT_MOSI_PIN) - pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO); + #if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN + pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO); #endif pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN); @@ -119,7 +114,7 @@ void TFT_SPI::Init() { DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; DMAtx.Init.Mode = DMA_NORMAL; DMAtx.Init.Priority = DMA_PRIORITY_LOW; - #if defined(STM32F4xx) + #ifdef STM32F4xx DMAtx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; #endif } @@ -140,11 +135,10 @@ uint32_t TFT_SPI::GetID() { } uint32_t TFT_SPI::ReadID(uint16_t Reg) { - #if !PIN_EXISTS(TFT_MISO) - return 0; - #else + uint32_t Data = 0; + #if PIN_EXISTS(TFT_MISO) uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler; - uint32_t i, Data = 0; + uint32_t i; SPIx.Init.BaudRatePrescaler = SPIx.Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4; DataTransferBegin(DATASIZE_8BIT); @@ -154,12 +148,12 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { __HAL_SPI_ENABLE(&SPIx); for (i = 0; i < 4; i++) { - if (TFT_MISO_PIN != TFT_MOSI_PIN) { + #if TFT_MISO_PIN != TFT_MOSI_PIN //if (hspi->Init.Direction == SPI_DIRECTION_2LINES) { while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} SPIx.Instance->DR = 0; //} - } + #endif while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} Data = (Data << 8) | SPIx.Instance->DR; } @@ -168,9 +162,9 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { DataTransferEnd(); SPIx.Init.BaudRatePrescaler = BaudRatePrescaler; - - return Data >> 7; #endif + + return Data >> 7; } bool TFT_SPI::isBusy() { @@ -183,9 +177,8 @@ bool TFT_SPI::isBusy() { if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) Abort(); } - else { + else Abort(); - } return dmaEnabled; } diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index 0c9ab43fd3..f95a53240b 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 04e9a2f80a..86fbd18ba2 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -33,7 +33,7 @@ // SD Connection // #ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION LCD + #define SDCARD_CONNECTION LCD #endif // @@ -244,7 +244,7 @@ // SD Connection // #if SD_CONNECTION_IS(LCD) - #define SS_PIN EXPA2_07_PIN + #define SS_PIN EXPA2_07_PIN #endif /** @@ -286,24 +286,24 @@ * LCD LCD */ - #define LCD_PINS_RS EXPA1_03_PIN + #define LCD_PINS_RS EXPA1_03_PIN - #define BTN_EN1 EXPA1_06_PIN - #define BTN_EN2 EXPA1_04_PIN - #define BTN_ENC EXPA1_08_PIN + #define BTN_EN1 EXPA1_06_PIN + #define BTN_EN2 EXPA1_04_PIN + #define BTN_ENC EXPA1_08_PIN - #define LCD_PINS_ENABLE EXPA1_05_PIN - #define LCD_PINS_D4 EXPA1_07_PIN + #define LCD_PINS_ENABLE EXPA1_05_PIN + #define LCD_PINS_D4 EXPA1_07_PIN #elif ENABLED(CR10_STOCKDISPLAY) - #define BTN_ENC EXPA1_09_PIN // (58) open-drain - #define LCD_PINS_RS EXPA1_04_PIN + #define BTN_ENC EXPA1_09_PIN // (58) open-drain + #define LCD_PINS_RS EXPA1_04_PIN - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN - #define LCD_PINS_ENABLE EXPA1_03_PIN - #define LCD_PINS_D4 EXPA1_05_PIN + #define LCD_PINS_ENABLE EXPA1_03_PIN + #define LCD_PINS_D4 EXPA1_05_PIN #elif ENABLED(ENDER2_STOCKDISPLAY) @@ -318,36 +318,36 @@ * EXP1 */ - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN + #define BTN_ENC EXPA1_09_PIN - #define DOGLCD_CS EXPA1_04_PIN - #define DOGLCD_A0 EXPA1_05_PIN - #define DOGLCD_SCK EXPA1_10_PIN - #define DOGLCD_MOSI EXPA1_03_PIN + #define DOGLCD_CS EXPA1_04_PIN + #define DOGLCD_A0 EXPA1_05_PIN + #define DOGLCD_SCK EXPA1_10_PIN + #define DOGLCD_MOSI EXPA1_03_PIN #define FORCE_SOFT_SPI #define LCD_BACKLIGHT_PIN -1 #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI - #define TFT_CS_PIN EXPA1_04_PIN - #define TFT_A0_PIN EXPA1_03_PIN - #define TFT_DC_PIN EXPA1_03_PIN - #define TFT_MISO_PIN EXPA2_10_PIN - #define TFT_BACKLIGHT_PIN EXPA1_08_PIN - #define TFT_RESET_PIN EXPA1_07_PIN + #define TFT_CS_PIN EXPA1_04_PIN + #define TFT_A0_PIN EXPA1_03_PIN + #define TFT_DC_PIN EXPA1_03_PIN + #define TFT_MISO_PIN EXPA2_10_PIN + #define TFT_BACKLIGHT_PIN EXPA1_08_PIN + #define TFT_RESET_PIN EXPA1_07_PIN #define LCD_USE_DMA_SPI - #define TOUCH_INT_PIN EXPA1_05_PIN - #define TOUCH_CS_PIN EXPA1_06_PIN + #define TOUCH_INT_PIN EXPA1_05_PIN + #define TOUCH_CS_PIN EXPA1_06_PIN #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 // SPI 1 - #define SCK_PIN EXPA2_09_PIN - #define MISO_PIN EXPA2_10_PIN - #define MOSI_PIN EXPA2_05_PIN + #define SCK_PIN EXPA2_09_PIN + #define MISO_PIN EXPA2_10_PIN + #define MOSI_PIN EXPA2_05_PIN // Disable any LCD related PINs config #define LCD_PINS_ENABLE -1 @@ -358,72 +358,72 @@ #elif IS_TFTGLCD_PANEL #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS EXPA2_08_PIN + #define TFTGLCD_CS EXPA2_08_PIN #endif - #define SD_DETECT_PIN EXPA2_04_PIN + #define SD_DETECT_PIN EXPA2_04_PIN #else - #define BTN_ENC EXPA1_09_PIN // (58) open-drain - #define LCD_PINS_RS EXPA1_07_PIN + #define BTN_ENC EXPA1_09_PIN // (58) open-drain + #define LCD_PINS_RS EXPA1_07_PIN - #define BTN_EN1 EXPA2_08_PIN // (31) J3-2 & AUX-4 - #define BTN_EN2 EXPA2_06_PIN // (33) J3-4 & AUX-4 + #define BTN_EN1 EXPA2_08_PIN // (31) J3-2 & AUX-4 + #define BTN_EN2 EXPA2_06_PIN // (33) J3-4 & AUX-4 - #define LCD_PINS_ENABLE EXPA1_08_PIN - #define LCD_PINS_D4 EXPA1_06_PIN + #define LCD_PINS_ENABLE EXPA1_08_PIN + #define LCD_PINS_D4 EXPA1_06_PIN - #define LCD_SDSS EXPA2_07_PIN // (16) J3-7 & AUX-4 + #define LCD_SDSS EXPA2_07_PIN // (16) J3-7 & AUX-4 #if SD_CONNECTION_IS(LCD) - #define SD_DETECT_PIN EXPA2_04_PIN // (49) (NOT 5V tolerant) + #define SD_DETECT_PIN EXPA2_04_PIN // (49) (NOT 5V tolerant) #endif #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS EXPA1_08_PIN - #define DOGLCD_A0 EXPA1_07_PIN - #define DOGLCD_SCK EXPA2_09_PIN - #define DOGLCD_MOSI EXPA2_05_PIN + #define DOGLCD_CS EXPA1_08_PIN + #define DOGLCD_A0 EXPA1_07_PIN + #define DOGLCD_SCK EXPA2_09_PIN + #define DOGLCD_MOSI EXPA2_05_PIN #define LCD_BACKLIGHT_PIN -1 #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems // results in LCD soft SPI mode 3, SD soft SPI mode 0 - #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. + #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN EXPA1_05_PIN + #define RGB_LED_R_PIN EXPA1_05_PIN #endif #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN EXPA1_04_PIN + #define RGB_LED_G_PIN EXPA1_04_PIN #endif #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN EXPA1_03_PIN + #define RGB_LED_B_PIN EXPA1_03_PIN #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN EXPA1_05_PIN + #define NEOPIXEL_PIN EXPA1_05_PIN #endif #else // !FYSETC_MINI_12864 #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS EXPA1_05_PIN - #define DOGLCD_A0 EXPA1_04_PIN - #define DOGLCD_SCK EXPA2_09_PIN - #define DOGLCD_MOSI EXPA2_05_PIN + #define DOGLCD_CS EXPA1_05_PIN + #define DOGLCD_A0 EXPA1_04_PIN + #define DOGLCD_SCK EXPA2_09_PIN + #define DOGLCD_MOSI EXPA2_05_PIN #define FORCE_SOFT_SPI #endif #if IS_ULTIPANEL - #define LCD_PINS_D5 EXPA1_05_PIN - #define LCD_PINS_D6 EXPA1_04_PIN - #define LCD_PINS_D7 EXPA1_03_PIN + #define LCD_PINS_D5 EXPA1_05_PIN + #define LCD_PINS_D6 EXPA1_04_PIN + #define LCD_PINS_D7 EXPA1_03_PIN #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define BTN_ENC_EN EXPA1_03_PIN // Detect the presence of the encoder + #define BTN_ENC_EN EXPA1_03_PIN // Detect the presence of the encoder #endif #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 867b6b6871..a75eb6ae5d 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -33,8 +33,8 @@ // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT //#define HAS_BTT_EXP_MOT 1 -#if BOTH(HAS_WIRED_LCD,HAS_BTT_EXP_MOT) - #if EITHER(CR10_STOCKDISPLAY,ENDER2_STOCKDISPLAY) +#if BOTH(HAS_WIRED_LCD, HAS_BTT_EXP_MOT) + #if EITHER(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) #define EXP_MOT_USE_EXP2_ONLY #else #error "Having a LCD that uses both EXP1/EXP2 and a expanion motor module on EXP1/EXP2 is not possible." @@ -129,56 +129,60 @@ #endif #if HAS_BTT_EXP_MOT -/* _____ _____ - * NC | · · | GND NC | · · | GND - * NC | · · | 1.31 (M1EN) (M2EN) 1.23 | · · | 1.22 (M3EN) - * (M1STP) 0.18 | · · 3.25 (M1DIR) (M1RX) 1.21 | · · 1.20 (M1DIAG) - * (M2DIR) 0.16 | · · | 3.26 (M2STP) (M2RX) 1.19 | · · | 1.18 (M2DIAG) - * (M3DIR) 0.15 | · · | 0.17 (M3STP) (M3RX) 0.28 | · · | 1.30 (M3DIAG) - * ----- ----- - * EXP2 EXP1 - * - * NB In EXP_MOT_USE_EXP2_ONLY mode EXP1 is not used and M2EN and M3EN need to be jumpered to M1EN - */ + + /** _____ _____ + * NC | · · | GND NC | · · | GND + * NC | · · | 1.31 (M1EN) (M2EN) 1.23 | · · | 1.22 (M3EN) + * (M1STP) 0.18 | · · 3.25 (M1DIR) (M1RX) 1.21 | · · 1.20 (M1DIAG) + * (M2DIR) 0.16 | · · | 3.26 (M2STP) (M2RX) 1.19 | · · | 1.18 (M2DIAG) + * (M3DIR) 0.15 | · · | 0.17 (M3STP) (M3RX) 0.28 | · · | 1.30 (M3DIAG) + * ----- ----- + * EXP2 EXP1 + * + * NB In EXP_MOT_USE_EXP2_ONLY mode EXP1 is not used and M2EN and M3EN need to be jumpered to M1EN + */ // M1 on Driver Expansion Module - #define E2_STEP_PIN EXPA2_05_PIN - #define E2_DIR_PIN EXPA2_06_PIN - #define E2_ENABLE_PIN EXPA2_04_PIN + #define E2_STEP_PIN EXPA2_05_PIN + #define E2_DIR_PIN EXPA2_06_PIN + #define E2_ENABLE_PIN EXPA2_04_PIN #ifndef EXP_MOT_USE_EXP2_ONLY - #define E2_DIAG_PIN EXPA1_06_PIN - #define E2_CS_PIN EXPA1_05_PIN + #define E2_DIAG_PIN EXPA1_06_PIN + #define E2_CS_PIN EXPA1_05_PIN #if HAS_TMC_UART - #define E2_SERIAL_TX_PIN EXPA1_05_PIN - #define E2_SERIAL_RX_PIN EXPA1_05_PIN + #define E2_SERIAL_TX_PIN EXPA1_05_PIN + #define E2_SERIAL_RX_PIN EXPA1_05_PIN #endif #endif + // M2 on Driver Expansion Module - #define E3_STEP_PIN EXPA2_08_PIN - #define E3_DIR_PIN EXPA2_07_PIN + #define E3_STEP_PIN EXPA2_08_PIN + #define E3_DIR_PIN EXPA2_07_PIN #ifndef EXP_MOT_USE_EXP2_ONLY - #define E3_ENABLE_PIN EXPA1_03_PIN - #define E3_DIAG_PIN EXPA1_08_PIN - #define E3_CS_PIN EXPA1_07_PIN + #define E3_ENABLE_PIN EXPA1_03_PIN + #define E3_DIAG_PIN EXPA1_08_PIN + #define E3_CS_PIN EXPA1_07_PIN #if HAS_TMC_UART - #define E3_SERIAL_TX_PIN EXPA1_07_PIN - #define E3_SERIAL_RX_PIN EXPA1_07_PIN + #define E3_SERIAL_TX_PIN EXPA1_07_PIN + #define E3_SERIAL_RX_PIN EXPA1_07_PIN #endif #else - #define E3_ENABLE_PIN EXPA2_04_PIN + #define E3_ENABLE_PIN EXPA2_04_PIN #endif + // M3 on Driver Expansion Module - #define E4_STEP_PIN EXPA2_10_PIN - #define E4_DIR_PIN EXPA2_09_PIN + #define E4_STEP_PIN EXPA2_10_PIN + #define E4_DIR_PIN EXPA2_09_PIN #ifndef EXP_MOT_USE_EXP2_ONLY - #define E4_ENABLE_PIN EXPA1_04_PIN - #define E4_DIAG_PIN EXPA1_10_PIN - #define E4_CS_PIN EXPA1_09_PIN + #define E4_ENABLE_PIN EXPA1_04_PIN + #define E4_DIAG_PIN EXPA1_10_PIN + #define E4_CS_PIN EXPA1_09_PIN #if HAS_TMC_UART - #define E4_SERIAL_TX_PIN EXPA1_09_PIN - #define E4_SERIAL_RX_PIN EXPA1_09_PIN + #define E4_SERIAL_TX_PIN EXPA1_09_PIN + #define E4_SERIAL_RX_PIN EXPA1_09_PIN #endif #else - #define E4_ENABLE_PIN EXPA2_04_PIN + #define E4_ENABLE_PIN EXPA2_04_PIN #endif + #endif // HAS_BTT_EXP_MOT diff --git a/Marlin/src/pins/ramps/pins_K8600.h b/Marlin/src/pins/ramps/pins_K8600.h index 60bb18204a..1a396b20f4 100644 --- a/Marlin/src/pins/ramps/pins_K8600.h +++ b/Marlin/src/pins/ramps/pins_K8600.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index 4257b2c40e..0c79f108f7 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index a7c06cb99d..44be73029d 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h index 5b51ece07f..d51aaa956a 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h index 715fd89db8..f65e1d5474 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index e3065439d7..48943ad973 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/platformio.ini b/platformio.ini index a8b81d755e..e2f1388efd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1355,10 +1355,10 @@ extra_scripts = ${common.extra_scripts} # MKS Robin Pro V2 # [env:mks_robin_pro2] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_HCD_MODULE_ENABLED -DUSBHOST -DARDUINO_BLACK_F407VE -board = genericSTM32F407VET6 +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DHAL_HCD_MODULE_ENABLED -DUSBHOST -DARDUINO_BLACK_F407VE +board = genericSTM32F407VET6 board_build.core = stm32 board_build.variant = MARLIN_F407VE board_build.ldscript = ldscript.ld From 38bb3b86d2a0a5570736cb78930a429c9051217e Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 8 Dec 2020 22:12:42 -0800 Subject: [PATCH 0702/1370] Clarify Delta & SCARA config location (#20403) --- Marlin/Configuration.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ebc3311d9e..0f92f11418 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -56,15 +56,15 @@ //=========================================================================== //============================= DELTA Printer =============================== //=========================================================================== -// For a Delta printer start with one of the configuration files in the -// config/examples/delta directory and customize for your machine. +// For a Delta printer, start with one of the configuration files in the config/examples/delta directory +// from https://github.com/MarlinFirmware/Configurations/branches/all and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== -// For a SCARA printer start with the configuration files in -// config/examples/SCARA and customize for your machine. +// For a SCARA printer, start with one of the configuration files in the config/examples/SCARA directory +// from https://github.com/MarlinFirmware/Configurations/branches/all and customize for your machine. // // @section info From 4ca3c0bc8634e68f47b96173bde83c0c08f95820 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Wed, 9 Dec 2020 10:06:50 +0100 Subject: [PATCH 0703/1370] Allow positive Z nozzle to probe offset (#20344) * Allow a positive value for z offset from nozzle to probe without sanity checks * Simplify menu_probe_offset.cpp (HOMING_Z_WITH_PROBE) * Add some more explanation to Configuration Files * Raise after probe_at_point as if homed Co-authored-by: Scott Lahteine Co-authored-by: Jason Smith --- Marlin/Configuration.h | 14 ++++++++++++-- Marlin/Configuration_adv.h | 3 ++- Marlin/src/inc/SanityCheck.h | 6 ------ Marlin/src/lcd/menu/menu_probe_offset.cpp | 8 ++++---- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0f92f11418..d528a97bf7 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -954,10 +954,20 @@ /** * Nozzle-to-Probe offsets { X, Y, Z } * - * - Use a caliper or ruler to measure the distance from the tip of + * X and Y offset + * Use a caliper or ruler to measure the distance from the tip of * the Nozzle to the center-point of the Probe in the X and Y axes. + * + * Z offset * - For the Z offset use your best known value and adjust at runtime. - * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. + * - Common probes trigger below the nozzle and have negative values for Z offset. + * - Probes triggering above the nozzle height are uncommon but do exist. When using + * probes such as this, carefully set Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES + * to avoid collisions during probing. + * + * Tune and Adjust + * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. + * - PROBE_OFFSET_WIZARD (configuration_adv.h) can be used for setting the Z offset. * * Assuming the typical work area orientation: * - Probe to RIGHT of the Nozzle has a Positive X offset diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 92de09eec9..f49749c045 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1084,7 +1084,8 @@ #if ENABLED(PROBE_OFFSET_WIZARD) // // Enable to init the Probe Z-Offset when starting the Wizard. - // Use the estimated nozzle-to-probe Z offset, plus a little more. + // Use a height slightly above the estimated nozzle-to-probe Z offset. + // For example, with an offset of -5, consider a starting height of -4. // //#define PROBE_OFFSET_WIZARD_START_Z -4.0 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index eec9ff0844..36dc373ecc 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1357,12 +1357,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS static_assert(sanity_nozzle_to_probe_offset.x == 0 && sanity_nozzle_to_probe_offset.y == 0, "NOZZLE_AS_PROBE requires the XY offsets in NOZZLE_TO_PROBE_OFFSET to both be 0."); #else - static_assert(sanity_nozzle_to_probe_offset.z <= 0.25, - "Are you sure your Probe triggers above the nozzle? Set a negative Z value in the NOZZLE_TO_PROBE_OFFSET."); - #ifdef PROBE_OFFSET_WIZARD_START_Z - static_assert(PROBE_OFFSET_WIZARD_START_Z <= 0.25, - "Are you sure your Probe triggers above the nozzle? Set a negative value for PROBE_OFFSET_WIZARD_START_Z."); - #endif static_assert(PROBING_MARGIN >= 0, "PROBING_MARGIN must be >= 0."); static_assert(PROBING_MARGIN_BACK >= 0, "PROBING_MARGIN_BACK must be >= 0."); static_assert(PROBING_MARGIN_FRONT >= 0, "PROBING_MARGIN_FRONT must be >= 0."); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index f2b08afd79..8f87e82ae0 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -107,8 +107,8 @@ void probe_offset_wizard_menu() { ACTION_ITEM(MSG_BUTTON_CANCEL, []{ set_offset_and_go_back(z_offset_backup); - // If wizard-homing was done by probe with with PROBE_OFFSET_WIZARD_START_Z - #if EITHER(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, USE_PROBE_FOR_Z_HOMING) && defined(PROBE_OFFSET_WIZARD_START_Z) + // If wizard-homing was done by probe with PROBE_OFFSET_WIZARD_START_Z + #if HOMING_Z_WITH_PROBE && defined(PROBE_OFFSET_WIZARD_START_Z) set_axis_never_homed(Z_AXIS); // On cancel the Z position needs correction queue.inject_P(PSTR("G28Z")); #else // Otherwise do a Z clearance move like after Homing @@ -122,7 +122,7 @@ void probe_offset_wizard_menu() { void prepare_for_probe_offset_wizard() { if (ui.wait_for_move) return; - #if defined(PROBE_OFFSET_WIZARD_XY_POS) || NONE(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, USE_PROBE_FOR_Z_HOMING) + #if defined(PROBE_OFFSET_WIZARD_XY_POS) || !HOMING_Z_WITH_PROBE if (ui.should_draw()) MenuItem_static::draw(1, GET_TEXT(MSG_PROBE_WIZARD_PROBING)); #ifndef PROBE_OFFSET_WIZARD_XY_POS @@ -133,7 +133,7 @@ void prepare_for_probe_offset_wizard() { // Probe for Z reference ui.wait_for_move = true; - z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_STOW, 0, true); + z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_RAISE, 0, true); ui.wait_for_move = false; #endif From e3e9982fec759e8cf13f8ac558723f63a43cead3 Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Wed, 9 Dec 2020 04:29:33 -0600 Subject: [PATCH 0704/1370] Fix Spindle/Laser Control menu (#20347) --- Marlin/src/feature/spindle_laser.cpp | 2 +- Marlin/src/feature/spindle_laser.h | 11 ++++++---- Marlin/src/gcode/control/M3-M5.cpp | 2 +- Marlin/src/lcd/language/language_en.h | 13 ++++++------ Marlin/src/lcd/menu/menu.h | 2 ++ Marlin/src/lcd/menu/menu_main.cpp | 2 +- Marlin/src/lcd/menu/menu_spindle_laser.cpp | 24 +++++++++++++--------- 7 files changed, 33 insertions(+), 23 deletions(-) diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 3b28b61b49..3f65234782 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -118,7 +118,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) { // Set the spindle direction and apply immediately // Stop on direction change if SPINDLE_STOP_ON_DIR_CHANGE is enabled // - void SpindleLaser::set_direction(const bool reverse) { + void SpindleLaser::set_reverse(const bool reverse) { const bool dir_state = (reverse == SPINDLE_INVERT_DIR); // Forward (M3) HIGH when not inverted if (TERN0(SPINDLE_STOP_ON_DIR_CHANGE, enabled()) && READ(SPINDLE_DIR_PIN) != dir_state) disable(); WRITE(SPINDLE_DIR_PIN, dir_state); diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 74d06634a0..4d3c802411 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -57,7 +57,7 @@ public: static const inline uint8_t cpwr_to_pct(const cutter_cpower_t cpwr) { constexpr cutter_cpower_t power_floor = TERN(CUTTER_POWER_RELATIVE, SPEED_POWER_MIN, 0), power_range = SPEED_POWER_MAX - power_floor; - return unitPower ? round(100.0f * (cpwr - power_floor) / power_range) : 0; + return cpwr ? round(100.0f * (cpwr - power_floor) / power_range) : 0; } // Convert a cpower (e.g., SPEED_POWER_STARTUP) to unit power (upwr, upower), @@ -191,9 +191,11 @@ public: } #if ENABLED(SPINDLE_CHANGE_DIR) - static void set_direction(const bool reverse); + static void set_reverse(const bool reverse); + static bool is_reverse() { return READ(SPINDLE_DIR_PIN) == SPINDLE_INVERT_DIR; } #else - static inline void set_direction(const bool) {} + static inline void set_reverse(const bool) {} + static bool is_reverse() { return false; } #endif static inline void disable() { isReady = false; set_enabled(false); } @@ -208,11 +210,12 @@ public: else menuPower = cpwr_to_upwr(SPEED_POWER_STARTUP); unitPower = menuPower; - set_direction(reverse); + set_reverse(reverse); set_enabled(true); } FORCE_INLINE static void enable_forward() { enable_with_dir(false); } FORCE_INLINE static void enable_reverse() { enable_with_dir(true); } + FORCE_INLINE static void enable_same_dir() { enable_with_dir(is_reverse()); } #if ENABLED(SPINDLE_LASER_PWM) static inline void update_from_mpower() { diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp index 4ca103da5b..711bb7e5e4 100644 --- a/Marlin/src/gcode/control/M3-M5.cpp +++ b/Marlin/src/gcode/control/M3-M5.cpp @@ -103,7 +103,7 @@ void GcodeSuite::M3_M4(const bool is_M4) { #endif planner.synchronize(); // Wait for previous movement commands (G0/G0/G2/G3) to complete before changing power - cutter.set_direction(is_M4); + cutter.set_reverse(is_M4); #if ENABLED(SPINDLE_LASER_PWM) if (parser.seenval('O')) { diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 0b96403b72..ed9ad954f8 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -107,16 +107,17 @@ namespace Language_en { #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preheat Custom"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Cooldown"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequency"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser Control"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Off"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser On"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laser Power"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindle Control"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Off"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle On"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Power"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laser Power"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Pwr"); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Toggle Laser"); + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Toggle Spindle"); + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Spindle Forward"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Switch Power On"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Switch Power Off"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index cf2f6b1633..de11ee3a5a 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -252,3 +252,5 @@ void _lcd_draw_homing(); extern uint8_t screen_history_depth; inline void clear_menu_history() { screen_history_depth = 0; } + +#define STICKY_SCREEN(S) []{ ui.defer_status_screen(); ui.goto_screen(S); } diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 1b87e06cc8..968de3d4b8 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -170,7 +170,7 @@ void menu_main() { } #if HAS_CUTTER - SUBMENU(MSG_CUTTER(MENU), menu_spindle_laser); + SUBMENU(MSG_CUTTER(MENU), STICKY_SCREEN(menu_spindle_laser)); #endif #if HAS_TEMPERATURE diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index f1bf433c21..d5a291db74 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -33,8 +33,10 @@ #include "../../feature/spindle_laser.h" void menu_spindle_laser() { - - const bool is_enabled = cutter.enabled() && cutter.isReady; + bool is_enabled = cutter.enabled() && cutter.isReady; + #if ENABLED(SPINDLE_CHANGE_DIR) + bool is_rev = cutter.is_reverse(); + #endif START_MENU(); BACK_ITEM(MSG_MAIN); @@ -46,18 +48,20 @@ cutter.mpower_min(), cutter.mpower_max(), cutter.update_from_mpower); #endif - if (is_enabled) - ACTION_ITEM(MSG_CUTTER(OFF), cutter.disable); - else { - ACTION_ITEM(MSG_CUTTER(ON), cutter.enable_forward); - #if ENABLED(SPINDLE_CHANGE_DIR) - ACTION_ITEM(MSG_SPINDLE_REVERSE, cutter.enable_reverse); - #endif - } + editable.state = is_enabled; + EDIT_ITEM(bool, MSG_CUTTER(TOGGLE), &is_enabled, []{ if (editable.state) cutter.disable(); else cutter.enable_same_dir(); }); + + #if ENABLED(SPINDLE_CHANGE_DIR) + if (!is_enabled) { + editable.state = is_rev; + ACTION_ITEM_P(is_rev ? GET_TEXT(MSG_CUTTER(REVERSE)) : GET_TEXT(MSG_CUTTER(FORWARD)), []{ cutter.set_reverse(!editable.state); }); + } + #endif #if BOTH(MARLIN_DEV_MODE, HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 50000, cutter.refresh_frequency); #endif + END_MENU(); } From f193cda03b1e70205406a8fea70f7345fd886c69 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Wed, 9 Dec 2020 04:09:31 -0700 Subject: [PATCH 0705/1370] Fixes and additions to FTDI EVE Touch UI (#20393) - Fixed name conflict with "SUBSCRIPT_TWO" - Fixed rendering bugs in "Leveling Menu" - Only show "Bed Mesh Screen" when UBL is enabled - Removed CocoaPress code from generic "Main Menu" - Removed CocoaPress code from LulzBot Bio "Status" screen - Moved generic "Move Axis" functionality into a base class - Added CocoaPress custom screens: - Status Screen - Unload Cartridge - Load Chocolate - Main Menu - Advanced Settings - XYZ Move (based on "Move Axis" base class) - Extrusion Move (based on "Move Axis" base class) - CocoaPress tweaks to "Temperature" screen - Fix FTDI EVE Touch UI compilation errors when not using leveling. --- .../extended/unicode/western_char_set.cpp | 12 +- .../ftdi_eve_touch_ui/language/language_en.h | 24 +- .../screens/advanced_settings_menu.cpp | 2 +- .../screens/bed_mesh_screen.cpp | 2 +- .../screens/bio_status_screen.cpp | 179 +++------- .../cocoa_press_advanced_settings_menu.cpp | 102 ++++++ .../screens/cocoa_press_load_chocolate.cpp | 101 ++++++ .../screens/cocoa_press_main_menu.cpp | 89 +++++ .../screens/cocoa_press_move_e_screen.cpp | 62 ++++ .../screens/cocoa_press_move_xyz_screen.cpp | 53 +++ ..._menu.cpp => cocoa_press_preheat_menu.cpp} | 72 ++-- ...een.cpp => cocoa_press_preheat_screen.cpp} | 68 +++- .../screens/cocoa_press_status_screen.cpp | 307 ++++++++++++++++++ .../screens/cocoa_press_ui.h | 54 +++ .../screens/cocoa_press_unload_cartridge.cpp | 101 ++++++ .../screens/leveling_menu.cpp | 17 +- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 38 +-- .../screens/move_axis_screen.cpp | 10 +- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 4 + .../lib/ftdi_eve_touch_ui/screens/screens.h | 89 +++-- .../screens/temperature_screen.cpp | 19 +- .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 4 +- .../screens/z_offset_screen.cpp | 2 +- 23 files changed, 1167 insertions(+), 244 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/{preheat_menu.cpp => cocoa_press_preheat_menu.cpp} (55%) rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/{preheat_timer_screen.cpp => cocoa_press_preheat_screen.cpp} (55%) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp index 171637f03a..fc5d4de85d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp @@ -71,9 +71,9 @@ YEN_SIGN, #endif #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - SUPERSCRIPT_ONE, - SUPERSCRIPT_TWO, - SUPERSCRIPT_THREE, + SUPERSCRIPT_1, + SUPERSCRIPT_2, + SUPERSCRIPT_3, #endif #if ENABLED(TOUCH_UI_UTF8_ORDINALS) MASCULINE_ORDINAL, @@ -177,15 +177,15 @@ {UTF8('±'), 0 , NOT_SIGN, 32 }, #endif #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - {UTF8('²'), 0 , SUPERSCRIPT_TWO, 16 }, - {UTF8('³'), 0 , SUPERSCRIPT_THREE, 16 }, + {UTF8('²'), 0 , SUPERSCRIPT_2, 16 }, + {UTF8('³'), 0 , SUPERSCRIPT_3, 16 }, #endif #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) {UTF8('µ'), 0 , MICRON_SIGN, 28 }, {UTF8('¶'), 0 , PILCROW_SIGN, 24 }, #endif #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - {UTF8('¹'), 0 , SUPERSCRIPT_ONE, 16 }, + {UTF8('¹'), 0 , SUPERSCRIPT_1, 16 }, #endif #if ENABLED(TOUCH_UI_UTF8_ORDINALS) {UTF8('º'), 0 , MASCULINE_ORDINAL, 19 }, diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index 807c816307..09ac965e49 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -29,12 +29,6 @@ #define COPYRIGHT_SIGN u8"(c)" #endif -#if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - #define SUPERSCRIPT_TWO u8"²" -#else - #define SUPERSCRIPT_TWO u8"^2" -#endif - #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) #define DEGREE_SIGN u8"°" #else @@ -162,9 +156,21 @@ namespace Language_en { #endif #ifdef TOUCH_UI_COCOA_PRESS - PROGMEM Language_Str MSG_ZONE_1 = u8"Zone 1:"; - PROGMEM Language_Str MSG_ZONE_2 = u8"Zone 2:"; - PROGMEM Language_Str MSG_ZONE_3 = u8"Zone 3:"; + PROGMEM Language_Str MSG_BODY = u8"Body"; + PROGMEM Language_Str MSG_INTERNAL = u8"Internal"; + PROGMEM Language_Str MSG_EXTERNAL = u8"External"; + PROGMEM Language_Str MSG_CHOCOLATE = u8"Chocolate"; + PROGMEM Language_Str MSG_UNLOAD_CARTRIDGE = u8"Unload Cartridge"; + PROGMEM Language_Str MSG_LOAD_CHOCOLATE = u8"Load Chocolate"; + PROGMEM Language_Str MSG_CARTRIDGE_IN = u8"Cartridge In"; + PROGMEM Language_Str MSG_CARTRIDGE_OUT = u8"Cartridge Out"; + PROGMEM Language_Str MSG_PREHEAT_CHOCOLATE = u8"Preheat Chocolate"; PROGMEM Language_Str MSG_PREHEAT_FINISHED = u8"Preheat finished"; + PROGMEM Language_Str MSG_PREHEAT = u8"Preheat"; + PROGMEM Language_Str MSG_BUTTON_PAUSE = u8"Pause"; + PROGMEM Language_Str MSG_BUTTON_RESUME = u8"Resume"; + PROGMEM Language_Str MSG_ELAPSED_PRINT = u8"Elapsed Print"; + PROGMEM Language_Str MSG_XYZ_MOVE = u8"XYZ Move"; + PROGMEM Language_Str MSG_E_MOVE = u8"Extrusion Move"; #endif }; // namespace Language_en diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 3ffc88c385..431c601581 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && DISABLED(TOUCH_UI_LULZBOT_BIO) +#if ENABLED(TOUCH_UI_FTDI_EVE) && NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) #include "screens.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index c54a7e04b5..2cce884d36 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -21,7 +21,7 @@ #include "../config.h" -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_MESH) +#if BOTH(TOUCH_UI_FTDI_EVE, AUTO_BED_LEVELING_UBL) #include "screens.h" #include "screen_data.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index 2515732d43..c95d2d1dba 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -23,15 +23,13 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) #include "screens.h" #include "../ftdi_eve_lib/extras/poly_ui.h" -#if ENABLED(TOUCH_UI_COCOA_PRESS) - #include "cocoa_press_ui.h" -#elif ENABLED(TOUCH_UI_PORTRAIT) +#if ENABLED(TOUCH_UI_PORTRAIT) #include "bio_printer_ui_portrait.h" #else #include "bio_printer_ui_landscape.h" @@ -72,55 +70,30 @@ void StatusScreen::draw_temperature(draw_mode_t what) { if (what & BACKGROUND) { cmd.cmd(COLOR_RGB(bg_color)); - #if ENABLED(TOUCH_UI_LULZBOT_BIO) - // The LulzBot Bio shows the temperature for - // the bed. + // The LulzBot Bio shows the temperature for + // the bed. - #ifdef TOUCH_UI_PORTRAIT - // Draw touch surfaces - ui.bounds(POLY(target_temp), x, y, h, v); - cmd.rectangle(x, y, h, v); - ui.bounds(POLY(actual_temp), x, y, h, v); - cmd.rectangle(x, y, h, v); - #else - ui.bounds(POLY(bed_temp), x, y, h, v); - cmd.rectangle(x, y, h, v); - #endif - ui.bounds(POLY(bed_icon), x, y, h, v); + #ifdef TOUCH_UI_PORTRAIT + // Draw touch surfaces + ui.bounds(POLY(target_temp), x, y, h, v); + cmd.rectangle(x, y, h, v); + ui.bounds(POLY(actual_temp), x, y, h, v); cmd.rectangle(x, y, h, v); - - // Draw bed icon - cmd.cmd(BITMAP_SOURCE(Bed_Heat_Icon_Info)) - .cmd(BITMAP_LAYOUT(Bed_Heat_Icon_Info)) - .cmd(BITMAP_SIZE (Bed_Heat_Icon_Info)) - .cmd(COLOR_RGB(shadow_rgb)) - .icon (x + 2, y + 2, h, v, Bed_Heat_Icon_Info, icon_scale * 2) - .cmd(COLOR_RGB(bg_text_enabled)) - .icon (x, y, h, v, Bed_Heat_Icon_Info, icon_scale * 2); - #elif ENABLED(TOUCH_UI_COCOA_PRESS) && DISABLED(TOUCH_UI_PORTRAIT) - // The CocoaPress shows the temperature for two - // heating zones, but has no bed temperature - - cmd.cmd(COLOR_RGB(bg_text_enabled)); - cmd.font(font_xsmall); - - ui.bounds(POLY(h0_label), x, y, h, v); - cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_1)); - - ui.bounds(POLY(h1_label), x, y, h, v); - cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_2)); - - ui.bounds(POLY(h2_label), x, y, h, v); - cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_3)); - - ui.bounds(POLY(h3_label), x, y, h, v); - cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHAMBER)); #else - UNUSED(x); - UNUSED(y); - UNUSED(h); - UNUSED(v); + ui.bounds(POLY(bed_temp), x, y, h, v); + cmd.rectangle(x, y, h, v); #endif + ui.bounds(POLY(bed_icon), x, y, h, v); + cmd.rectangle(x, y, h, v); + + // Draw bed icon + cmd.cmd(BITMAP_SOURCE(Bed_Heat_Icon_Info)) + .cmd(BITMAP_LAYOUT(Bed_Heat_Icon_Info)) + .cmd(BITMAP_SIZE (Bed_Heat_Icon_Info)) + .cmd(COLOR_RGB(shadow_rgb)) + .icon (x + 2, y + 2, h, v, Bed_Heat_Icon_Info, icon_scale * 2) + .cmd(COLOR_RGB(bg_text_enabled)) + .icon (x, y, h, v, Bed_Heat_Icon_Info, icon_scale * 2); #ifdef TOUCH_UI_USE_UTF8 load_utf8_bitmaps(cmd); // Restore font bitmap handles @@ -130,71 +103,29 @@ void StatusScreen::draw_temperature(draw_mode_t what) { if (what & FOREGROUND) { char str[15]; cmd.cmd(COLOR_RGB(bg_text_enabled)); - #if ENABLED(TOUCH_UI_LULZBOT_BIO) - cmd.font(font_medium); + cmd.font(font_medium); - #ifdef TOUCH_UI_PORTRAIT - if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) - format_temp(str, getTargetTemp_celsius(BED)); - else - strcpy_P(str, GET_TEXT(MSG_BED)); - - ui.bounds(POLY(target_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - - format_temp(str, getActualTemp_celsius(BED)); - ui.bounds(POLY(actual_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - #else - if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) - format_temp_and_temp(str, getActualTemp_celsius(BED), getTargetTemp_celsius(BED)); - else - format_temp_and_idle(str, getActualTemp_celsius(BED)); - - ui.bounds(POLY(bed_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - #endif - - #elif ENABLED(TOUCH_UI_COCOA_PRESS) && DISABLED(TOUCH_UI_PORTRAIT) - // The CocoaPress shows the temperature for two - // heating zones, but has no bed temperature - - cmd.font(font_large); - - if (!isHeaterIdle(E0) && getTargetTemp_celsius(E0) > 0) - format_temp_and_temp(str, getActualTemp_celsius(E0), getTargetTemp_celsius(E0)); + #ifdef TOUCH_UI_PORTRAIT + if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) + format_temp(str, getTargetTemp_celsius(BED)); else - format_temp_and_idle(str, getActualTemp_celsius(E0)); + strcpy_P(str, GET_TEXT(MSG_BED)); - ui.bounds(POLY(h0_temp), x, y, h, v); + ui.bounds(POLY(target_temp), x, y, h, v); cmd.text(x, y, h, v, str); - if (!isHeaterIdle(E1) && getTargetTemp_celsius(E1) > 0) - format_temp_and_temp(str, getActualTemp_celsius(E1), getTargetTemp_celsius(E1)); - else - format_temp_and_idle(str, getActualTemp_celsius(E1)); - - ui.bounds(POLY(h1_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - - if (!isHeaterIdle(E2) && getTargetTemp_celsius(E2) > 0) - format_temp_and_temp(str, getActualTemp_celsius(E2), getTargetTemp_celsius(E2)); - else - format_temp_and_idle(str, getActualTemp_celsius(E2)); - - ui.bounds(POLY(h2_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - - if (!isHeaterIdle(CHAMBER) && getTargetTemp_celsius(CHAMBER) > 0) - format_temp_and_temp(str, getActualTemp_celsius(CHAMBER), getTargetTemp_celsius(CHAMBER)); - else - format_temp_and_idle(str, getActualTemp_celsius(CHAMBER)); - - ui.bounds(POLY(h3_temp), x, y, h, v); + format_temp(str, getActualTemp_celsius(BED)); + ui.bounds(POLY(actual_temp), x, y, h, v); cmd.text(x, y, h, v, str); #else - UNUSED(str); - #endif + if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) + format_temp_and_temp(str, getActualTemp_celsius(BED), getTargetTemp_celsius(BED)); + else + format_temp_and_idle(str, getActualTemp_celsius(BED)); + + ui.bounds(POLY(bed_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + #endif } } @@ -207,7 +138,7 @@ void StatusScreen::draw_syringe(draw_mode_t what) { 0.75 #endif ); - const bool e_homed = TERN0(TOUCH_UI_LULZBOT_BIO, isAxisPositionKnown(E0)); + const bool e_homed = TERN1(TOUCH_UI_LULZBOT_BIO, isAxisPositionKnown(E0)); CommandProcessor cmd; PolyUI ui(cmd, what); @@ -247,7 +178,7 @@ void StatusScreen::draw_arrows(draw_mode_t what) { ui.button_stroke(stroke_rgb, 28); ui.button_shadow(shadow_rgb, shadow_depth); - constexpr uint8_t style = TERN(TOUCH_UI_COCOA_PRESS, PolyUI::FILL | PolyUI::SHADOW, PolyUI::REGULAR); + constexpr uint8_t style = PolyUI::REGULAR; if ((what & BACKGROUND) || jog_xy) { ui.button(1, POLY(x_neg), style); @@ -262,9 +193,7 @@ void StatusScreen::draw_arrows(draw_mode_t what) { } if ((what & BACKGROUND) || e_homed) { - #if DISABLED(TOUCH_UI_COCOA_PRESS) - ui.button(7, POLY(e_neg), style); - #endif + ui.button(7, POLY(e_neg), style); ui.button(8, POLY(e_pos), style); } } @@ -304,11 +233,11 @@ void StatusScreen::draw_overlay_icons(draw_mode_t what) { PolyUI ui(cmd, what); if (what & FOREGROUND) { - ui.button_fill (TERN(TOUCH_UI_COCOA_PRESS, stroke_rgb, fill_rgb)); + ui.button_fill (fill_rgb); ui.button_stroke(stroke_rgb, 28); ui.button_shadow(shadow_rgb, shadow_depth); - constexpr uint8_t style = TERN(TOUCH_UI_COCOA_PRESS, PolyUI::FILL | PolyUI::SHADOW, PolyUI::REGULAR); + constexpr uint8_t style = PolyUI::REGULAR; if (!jog_xy) ui.button(12, POLY(padlock), style); if (!e_homed) ui.button(13, POLY(home_e), style); if (!z_homed) ui.button(14, POLY(home_z), style); @@ -389,9 +318,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) { break; case 9: GOTO_SCREEN(FilesScreen); break; case 10: GOTO_SCREEN(MainMenu); break; - #if ENABLED(TOUCH_UI_LULZBOT_BIO) - case 13: GOTO_SCREEN(BioConfirmHomeE); break; - #endif + case 13: GOTO_SCREEN(BioConfirmHomeE); break; case 14: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break; case 15: GOTO_SCREEN(TemperatureScreen); break; case 16: fine_motion = !fine_motion; break; @@ -431,19 +358,11 @@ bool StatusScreen::onTouchHeld(uint8_t tag) { } void StatusScreen::setStatusMessage(progmem_str pstr) { - #ifdef TOUCH_UI_LULZBOT_BIO - BioPrintingDialogBox::setStatusMessage(pstr); - #else - UNUSED(pstr); - #endif + BioPrintingDialogBox::setStatusMessage(pstr); } void StatusScreen::setStatusMessage(const char * const str) { - #ifdef TOUCH_UI_LULZBOT_BIO - BioPrintingDialogBox::setStatusMessage(str); - #else - UNUSED(str); - #endif + BioPrintingDialogBox::setStatusMessage(str); } void StatusScreen::onIdle() { @@ -451,10 +370,8 @@ void StatusScreen::onIdle() { if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { if (!EventLoop::is_touch_held()) onRefresh(); - #ifdef TOUCH_UI_LULZBOT_BIO - if (isPrintingFromMedia()) - BioPrintingDialogBox::show(); - #endif + if (isPrintingFromMedia()) + BioPrintingDialogBox::show(); refresh_timer.start(); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp new file mode 100644 index 0000000000..23314d5c27 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp @@ -0,0 +1,102 @@ +/***************************************** + * cocoa_press_advance_settings_menu.cpp * + *****************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +#define GRID_ROWS 4 +#define GRID_COLS 3 +#define STEPS_PER_MM_POS BTN_POS(1,1), BTN_SIZE(1,1) +#define TMC_CURRENT_POS BTN_POS(2,1), BTN_SIZE(1,1) +#define LIN_ADVANCE_POS BTN_POS(3,1), BTN_SIZE(1,1) +#define VELOCITY_POS BTN_POS(1,2), BTN_SIZE(1,1) +#define ACCELERATION_POS BTN_POS(2,2), BTN_SIZE(1,1) +#define JERK_POS BTN_POS(3,2), BTN_SIZE(1,1) +#define DISPLAY_POS BTN_POS(1,3), BTN_SIZE(1,1) +#define INTERFACE_POS BTN_POS(2,3), BTN_SIZE(1,1) +#define ENDSTOPS_POS BTN_POS(3,3), BTN_SIZE(1,1) +#define CASE_LIGHT_POS BTN_POS(1,4), BTN_SIZE(1,1) +#define RESTORE_DEFAULTS_POS BTN_POS(2,4), BTN_SIZE(1,1) +#define BACK_POS BTN_POS(3,4), BTN_SIZE(1,1) + +void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)); + } + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(Theme::font_medium) + .tag(2) .button( STEPS_PER_MM_POS, GET_TEXT_F(MSG_STEPS_PER_MM)) + .enabled(ENABLED(HAS_TRINAMIC_CONFIG)) + .tag(3) .button( TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT)) + .enabled(ENABLED(LIN_ADVANCE)) + .tag(4) .button(LIN_ADVANCE_POS, GET_TEXT_F(MSG_LINEAR_ADVANCE)) + .tag(5) .button( VELOCITY_POS, GET_TEXT_F(MSG_VELOCITY)) + .tag(6) .button( ACCELERATION_POS, GET_TEXT_F(MSG_ACCELERATION)) + .tag(7) .button( JERK_POS, GET_TEXT_F(TERN(HAS_JUNCTION_DEVIATION, MSG_JUNCTION_DEVIATION, MSG_JERK))) + .tag(8) .button( ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) + .tag(9) .button( INTERFACE_POS, GET_TEXT_F(MSG_INTERFACE)) + .tag(10).button( DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) + .enabled(ENABLED(CASE_LIGHT_ENABLE)) + .tag(11).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) + .tag(12).button( RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) + .colors(action_btn) + .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; + case 2: GOTO_SCREEN(StepsScreen); break; + #if HAS_TRINAMIC_CONFIG + case 3: GOTO_SCREEN(StepperCurrentScreen); break; + #endif + #if ENABLED(LIN_ADVANCE) + case 4: GOTO_SCREEN(LinearAdvanceScreen); break; + #endif + case 5: GOTO_SCREEN(MaxVelocityScreen); break; + case 6: GOTO_SCREEN(DefaultAccelerationScreen); break; + case 7: GOTO_SCREEN(TERN(HAS_JUNCTION_DEVIATION, JunctionDeviationScreen, JerkScreen)); break; + case 8: GOTO_SCREEN(EndstopStatesScreen); break; + case 9: GOTO_SCREEN(InterfaceSettingsScreen); LockScreen::check_passcode(); break; + case 10: GOTO_SCREEN(DisplayTuningScreen); break; + #if ENABLED(CASE_LIGHT_ENABLE) + case 11: GOTO_SCREEN(CaseLightScreen); break; + #endif + case 12: GOTO_SCREEN(RestoreFailsafeDialogBox); LockScreen::check_passcode(); break; + default: return false; + } + return true; +} +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp new file mode 100644 index 0000000000..36dc3404b9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp @@ -0,0 +1,101 @@ +/************************************ + * cocoa_press_unload_cartridge.cpp * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2020 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && ENABLED(TOUCH_UI_COCOA_PRESS) + +#include "screens.h" +#include "screen_data.h" + +using namespace ExtUI; +using namespace FTDI; +using namespace Theme; + +#define GRID_COLS 2 +#define GRID_ROWS 6 + +#define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) +#define DESCRIPTION_POS BTN_POS(1,2), BTN_SIZE(2,3) +#define CARTRIDGE_OUT_BTN_POS BTN_POS(1,5), BTN_SIZE(1,1) +#define CARTRIDGE_IN_BTN_POS BTN_POS(2,5), BTN_SIZE(1,1) +#define BACK_BTN_POS BTN_POS(1,6), BTN_SIZE(2,1) + +void LoadChocolateScreen::onRedraw(draw_mode_t what) { + CommandProcessor cmd; + + if (what & BACKGROUND) { + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0) + .font(font_large) + .text(TITLE_POS, GET_TEXT_F(MSG_LOAD_CHOCOLATE)); + draw_text_box(cmd, DESCRIPTION_POS, F( + "Drop your chocolate refill into the cartridge. " + "Press and hold the Cartridge Out button until " + "the plunger adapter is visible at the bottom of " + "the extruder. Securely attach a red plunger to " + "the plunger adapter and load the cartridge onto " + "the plunger. Press and hold Cartridge In button " + "until cartridge is fully loaded into the extruder, " + "and use the buttons to help follow the locking path " + "to lock"), + OPT_CENTERY, font_medium); + } + + if (what & FOREGROUND) { + cmd.font(font_medium) + .colors(normal_btn) + .tag(2).button(CARTRIDGE_OUT_BTN_POS, GET_TEXT_F(MSG_CARTRIDGE_OUT)) + .tag(3).button(CARTRIDGE_IN_BTN_POS, GET_TEXT_F(MSG_CARTRIDGE_IN)) + .colors(action_btn) + .tag(1).button(BACK_BTN_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool LoadChocolateScreen::onTouchEnd(uint8_t tag) { + using namespace ExtUI; + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + } + return true; +} + +bool LoadChocolateScreen::onTouchHeld(uint8_t tag) { + if (ExtUI::isMoving()) return false; // Don't allow moves to accumulate + constexpr float increment = 0.25; + MoveAxisScreen::setManualFeedrate(E0, increment); + #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); + #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); + switch (tag) { + case 2: UI_DECREMENT_AXIS(E0); break; + case 3: UI_INCREMENT_AXIS(E0); break; + default: return false; + } + #undef UI_DECREMENT_AXIS + #undef UI_INCREMENT_AXIS + return false; +} + +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp new file mode 100644 index 0000000000..da095eaab6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp @@ -0,0 +1,89 @@ +/***************************** + * cocoa_press_main_menu.cpp * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +#define GRID_ROWS 4 +#define GRID_COLS 2 + +#define MOVE_XYZ_POS BTN_POS(1,1), BTN_SIZE(1,1) +#define TEMPERATURE_POS BTN_POS(2,1), BTN_SIZE(1,1) +#define ZPROBE_ZOFFSET_POS BTN_POS(1,2), BTN_SIZE(1,1) +#define MOVE_E_POS BTN_POS(2,2), BTN_SIZE(1,1) +#define SPEED_POS BTN_POS(1,3), BTN_SIZE(1,1) +#define ADVANCED_SETTINGS_POS BTN_POS(2,3), BTN_SIZE(1,1) +#define ABOUT_PRINTER_POS BTN_POS(1,4), BTN_SIZE(1,1) +#define BACK_POS BTN_POS(2,4), BTN_SIZE(1,1) + +void MainMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)); + } + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(Theme::font_medium) + .tag(2).button( MOVE_XYZ_POS, GET_TEXT_F(MSG_XYZ_MOVE)) + .tag(3).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE)) + .tag(4).button( ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) + .tag(5).button( MOVE_E_POS, GET_TEXT_F(MSG_E_MOVE)) + .tag(6).button( SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) + .tag(7).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag(8).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .colors(action_btn) + .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool MainMenu::onTouchEnd(uint8_t tag) { + using namespace ExtUI; + + switch (tag) { + case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; + case 2: GOTO_SCREEN(MoveXYZScreen); break; + case 3: GOTO_SCREEN(TemperatureScreen); break; + #if BOTH(HAS_LEVELING, HAS_BED_PROBE) + case 4: GOTO_SCREEN(ZOffsetScreen); break; + #endif + case 5: GOTO_SCREEN(MoveEScreen); break; + case 6: GOTO_SCREEN(FeedratePercentScreen); break; + case 7: GOTO_SCREEN(AdvancedSettingsMenu); break; + case 8: GOTO_SCREEN(AboutScreen); break; + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp new file mode 100644 index 0000000000..6e2b4adc39 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp @@ -0,0 +1,62 @@ +/********************************* + * cocoa_press_move_e_screen.cpp * + *********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace ExtUI; + +void MoveEScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(1); + w.units(GET_TEXT_F(MSG_UNITS_MM)); + w.heading( GET_TEXT_F(MSG_E_MOVE)); + w.color(Theme::e_axis); + #if EXTRUDERS == 1 + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); + #elif HAS_MULTI_EXTRUDER + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); + w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1)); + #if EXTRUDERS > 2 + w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2)); + #endif + #if EXTRUDERS > 3 + w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3)); + #endif + #endif + w.increments(); +} + +void MoveEScreen::onIdle() { + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp new file mode 100644 index 0000000000..52a70448cd --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp @@ -0,0 +1,53 @@ +/************************************ + * cocoa_press_move_xyz_screen.cpp * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace ExtUI; + +void MoveXYZScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(1); + w.units(GET_TEXT_F(MSG_UNITS_MM)); + w.heading( GET_TEXT_F(MSG_XYZ_MOVE)); + w.home_buttons(20); + w.color(Theme::x_axis).adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisPosition_mm(X), canMove(X)); + w.color(Theme::y_axis).adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisPosition_mm(Y), canMove(Y)); + w.color(Theme::z_axis).adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisPosition_mm(Z), canMove(Z)); + w.increments(); +} + +void MoveXYZScreen::onIdle() { + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp similarity index 55% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp index 03f9e2c465..476c5e468b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp @@ -1,6 +1,6 @@ -/******************** - * preheat_menu.cpp * - ********************/ +/******************************** + * cocoa_press_preheat_menu.cpp * + ********************************/ /**************************************************************************** * Written By Marcio Teixeira 2020 - Cocoa Press * @@ -29,28 +29,40 @@ using namespace FTDI; using namespace ExtUI; using namespace Theme; +#define GRID_ROWS 5 +#define GRID_COLS 2 + void PreheatMenu::onRedraw(draw_mode_t what) { + const int16_t w = has_extra_heater() ? BTN_W(1) : BTN_W(2); + const int16_t h = BTN_H(1); + if (what & BACKGROUND) { CommandProcessor cmd; cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) .cmd(CLEAR(true,true,true)) - .tag(0); + .tag(0) + .cmd(COLOR_RGB(bg_text_enabled)) + .font(Theme::font_medium) + .text ( BTN_POS(1,1), w, h, GET_TEXT_F(MSG_INTERNAL)); + if (has_extra_heater()) { + cmd.text( BTN_POS(2,1), w, h, GET_TEXT_F(MSG_EXTERNAL)); + } } - #define GRID_ROWS 3 - #define GRID_COLS 2 - if (what & FOREGROUND) { CommandProcessor cmd; - cmd.cmd(COLOR_RGB(bg_text_enabled)) - .font(Theme::font_medium) - .text ( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_PREHEAT_1)) + cmd.font(Theme::font_medium) .colors(normal_btn) - .tag(2).button( BTN_POS(1,2), BTN_SIZE(1,1), F("Dark Chocolate")) - .tag(3).button( BTN_POS(2,2), BTN_SIZE(1,1), F("Milk Chocolate")) - .tag(4).button( BTN_POS(1,3), BTN_SIZE(1,1), F("White Chocolate")) - .colors(action_btn) - .tag(1) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_BACK)); + .tag(2).button( BTN_POS(1,2), w, h, F("Dark Chocolate")) + .tag(3).button( BTN_POS(1,3), w, h, F("Milk Chocolate")) + .tag(4).button( BTN_POS(1,4), w, h, F("White Chocolate")); + if (has_extra_heater()) { + cmd.tag(5).button( BTN_POS(2,2), w, h, F("Dark Chocolate")) + .tag(6).button( BTN_POS(2,3), w, h, F("Milk Chocolate")) + .tag(7).button( BTN_POS(2,4), w, h, F("White Chocolate")); + } + cmd.colors(action_btn) + .tag(1) .button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); } } @@ -58,20 +70,38 @@ bool PreheatMenu::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); break; case 2: - #ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT - injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT)); + #ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_INT_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_INT_SCRIPT)); #endif GOTO_SCREEN(PreheatTimerScreen); break; case 3: - #ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT - injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT)); + #ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_INT_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_INT_SCRIPT)); #endif GOTO_SCREEN(PreheatTimerScreen); break; case 4: - #ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT - injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT)); + #ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_INT_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_INT_SCRIPT)); + #endif + GOTO_SCREEN(PreheatTimerScreen); + break; + case 5: + #ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_EXT_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_EXT_SCRIPT)); + #endif + GOTO_SCREEN(PreheatTimerScreen); + break; + case 6: + #ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_EXT_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_EXT_SCRIPT)); + #endif + GOTO_SCREEN(PreheatTimerScreen); + break; + case 7: + #ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_EXT_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_EXT_SCRIPT)); #endif GOTO_SCREEN(PreheatTimerScreen); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp similarity index 55% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp index c3110b77dc..1aad1f5b4c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp @@ -33,7 +33,14 @@ using namespace ExtUI; using namespace Theme; #define GRID_COLS 2 -#define GRID_ROWS 5 +#define GRID_ROWS 8 + +#define HEADER_POS BTN_POS(2,1), BTN_SIZE(1,2) +#define NOZZLE_ADJ_POS BTN_POS(2,3), BTN_SIZE(1,2) +#define BODY_ADJ_POS BTN_POS(2,5), BTN_SIZE(1,2) +#define CHAMBER_ADJ_POS BTN_POS(2,7), BTN_SIZE(1,2) +#define PROGRESS_POS BTN_POS(1,1), BTN_SIZE(1,7) +#define BACK_POS BTN_POS(1,8), BTN_SIZE(1,1) void PreheatTimerScreen::draw_message(draw_mode_t what) { if (what & BACKGROUND) { @@ -42,7 +49,7 @@ void PreheatTimerScreen::draw_message(draw_mode_t what) { .cmd(CLEAR(true,true,true)) .cmd(COLOR_RGB(bg_text_enabled)) .tag(0); - draw_text_box(cmd, BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_HEATING), OPT_CENTER, font_large); + draw_text_box(cmd, HEADER_POS, GET_TEXT_F(MSG_HEATING), OPT_CENTER, font_large); } } @@ -62,7 +69,7 @@ void PreheatTimerScreen::draw_time_remaining(draw_mode_t what) { CommandProcessor cmd; cmd.font(font_xlarge); - draw_circular_progress(cmd, BTN_POS(1,1), BTN_SIZE(1,5), float(secondsRemaining()) * 100 / COCOA_PRESS_PREHEAT_SECONDS, str, theme_dark, theme_darkest); + draw_circular_progress(cmd, PROGRESS_POS, float(secondsRemaining()) * 100 / COCOA_PRESS_PREHEAT_SECONDS, str, theme_dark, theme_darkest); } } @@ -71,10 +78,45 @@ void PreheatTimerScreen::draw_interaction_buttons(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(font_medium) - .tag(1).button( BTN_POS(2,5), BTN_SIZE(1,1), F("Cancel")); + .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); } } +void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, progmem_str label, float value, int16_t x, int16_t y, int16_t w, int16_t h) { + #define SUB_COLS 9 + #define SUB_ROWS 2 + #define SUB_GRID_W(W) ((W)*w/SUB_COLS) + #define SUB_GRID_H(H) ((H)*h/SUB_ROWS) + #define SUB_GRID_X(X) (SUB_GRID_W((X)-1) + x) + #define SUB_GRID_Y(Y) (SUB_GRID_H((Y)-1) + y) + #define SUB_X(X) (SUB_GRID_X(X) + MARGIN_L) + #define SUB_Y(Y) (SUB_GRID_Y(Y) + MARGIN_T) + #define SUB_W(W) (SUB_GRID_W(W) - MARGIN_L - MARGIN_R) + #define SUB_H(H) (SUB_GRID_H(H) - MARGIN_T - MARGIN_B) + #define SUB_POS(X,Y) SUB_X(X), SUB_Y(Y) + #define SUB_SIZE(W,H) SUB_W(W), SUB_H(H) + + CommandProcessor cmd; + cmd.tag(0) + .font(font_small); + if (what & BACKGROUND) { + cmd.text( SUB_POS(1,1), SUB_SIZE(9,1), label) + .button( SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT); + } + + if (what & FOREGROUND) { + char str[32]; + dtostrf(value, 5, 1, str); + strcat_P(str, PSTR(" ")); + strcat_P(str, (const char*) GET_TEXT_F(MSG_UNITS_C)); + + cmd.text(SUB_POS(1,2), SUB_SIZE(5,1), str) + .font(font_medium) + .tag(tag ).button(SUB_POS(6,2), SUB_SIZE(2,1), F("-")) + .tag(tag+1).button(SUB_POS(8,2), SUB_SIZE(2,1), F("+")); + } +} + void PreheatTimerScreen::onEntry() { screen_data.PreheatTimerScreen.start_ms = millis(); } @@ -83,6 +125,24 @@ void PreheatTimerScreen::onRedraw(draw_mode_t what) { draw_message(what); draw_time_remaining(what); draw_interaction_buttons(what); + draw_adjuster(what, 1, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0), NOZZLE_ADJ_POS); + draw_adjuster(what, 3, GET_TEXT_F(MSG_BODY), getTargetTemp_celsius(E1), BODY_ADJ_POS); + draw_adjuster(what, 5, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS); +} + +bool PreheatTimerScreen::onTouchHeld(uint8_t tag) { + const float increment = (tag == 5 || tag == 6) ? 1 : 0.1; + switch (tag) { + case 1: UI_DECREMENT(TargetTemp_celsius, E0); break; + case 2: UI_INCREMENT(TargetTemp_celsius, E0); break; + case 3: UI_DECREMENT(TargetTemp_celsius, E1); break; + case 4: UI_INCREMENT(TargetTemp_celsius, E1); break; + case 5: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break; + case 6: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break; + default: + return false; + } + return true; } bool PreheatTimerScreen::onTouchEnd(uint8_t tag) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp new file mode 100644 index 0000000000..e3310abaa7 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -0,0 +1,307 @@ +/********************************* + * cocoa_press_status_screen.cpp * + *********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) + +#include "screens.h" + +#include "../ftdi_eve_lib/extras/poly_ui.h" + +#include "cocoa_press_ui.h" + +#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) + +const uint8_t shadow_depth = 5; + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +float StatusScreen::increment; + +void StatusScreen::loadBitmaps() { + constexpr uint32_t base = ftdi_memory_map::RAM_G; + + // Load fonts for internationalization + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_data(base + UTF8_FONT_OFFSET); + #endif +} + +void StatusScreen::draw_progress(draw_mode_t what) { + CommandProcessor cmd; + PolyUI ui(cmd, what); + + int16_t x, y, h, v; + + cmd.cmd(COLOR_RGB(accent_color_1)); + cmd.font(font_medium); + + if (what & BACKGROUND) { + ui.bounds(POLY(print_time_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_ELAPSED_PRINT)); + } + + if (what & FOREGROUND) { + const uint32_t elapsed = getProgress_seconds_elapsed(); + const uint8_t hrs = elapsed/3600; + const uint8_t min = (elapsed/60)%60; + + char str[10]; + sprintf_P(str, PSTR(" %02d : %02d"), hrs, min); + ui.bounds(POLY(print_time_hms), x, y, h, v); + cmd.text(x, y, h, v, str); + + sprintf_P(str, PSTR("%-3d%%"), getProgress_percent() ); + ui.bounds(POLY(print_time_percent), x, y, h, v); + cmd.text(x, y, h, v, str); + } +} + +void StatusScreen::draw_temperature(draw_mode_t what) { + CommandProcessor cmd; + PolyUI ui(cmd, what); + + int16_t x, y, h, v; + + if (what & BACKGROUND) { + cmd.cmd(COLOR_RGB(bg_color)); + + cmd.cmd(COLOR_RGB(fluid_rgb)); + cmd.font(font_medium); + + ui.bounds(POLY(chocolate_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHOCOLATE)); + + ui.bounds(POLY(h0_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_NOZZLE)); + + ui.bounds(POLY(h1_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_BODY)); + + #if ENABLED(COCOA_PRESS_EXTRA_HEATER) + if (has_extra_heater()) { + ui.bounds(POLY(h2_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_EXTERNAL)); + } + #endif + + ui.bounds(POLY(h3_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHAMBER)); + + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); // Restore font bitmap handles + #endif + } + + if (what & FOREGROUND) { + char str[15]; + cmd.cmd(COLOR_RGB(fluid_rgb)); + + cmd.font(font_large); + + format_temp(str, getActualTemp_celsius(E0)); + ui.bounds(POLY(h0_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + + format_temp(str, getActualTemp_celsius(E1)); + ui.bounds(POLY(h1_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + + #if ENABLED(COCOA_PRESS_EXTRA_HEATER) + if (has_extra_heater()) { + format_temp(str, getActualTemp_celsius(E2)); + ui.bounds(POLY(h2_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + } + #endif + + format_temp(str, getActualTemp_celsius(CHAMBER)); + ui.bounds(POLY(h3_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + } +} + +void StatusScreen::draw_syringe(draw_mode_t what) { + #if NUM_SERVOS < 2 + // Note, this requires a new pin 108 to be added to to access ADC9 + // "ArduinoAddons/arduino-1.8.5/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/variant.cpp" + const int val = analogRead(108); + const float fill_level = float(val) / 1024; + #else + constexpr float fill_level = 1.0f; + #endif + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + if (what & BACKGROUND) { + // Paint the shadow for the syringe + ui.color(shadow_rgb); + ui.shadow(POLY(syringe_outline), shadow_depth); + } + + if (what & FOREGROUND) { + int16_t x, y, h, v; + + // Paint the syringe icon + ui.color(syringe_rgb); + ui.fill(POLY(syringe_outline)); + + ui.color(fluid_rgb); + ui.bounds(POLY(syringe_fluid), x, y, h, v); + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(SCISSOR_XY(x,y + v * (1.0 - fill_level))); + cmd.cmd(SCISSOR_SIZE(h, v * fill_level)); + ui.fill(POLY(syringe_fluid), false); + cmd.cmd(RESTORE_CONTEXT()); + + ui.color(stroke_rgb); + ui.fill(POLY(syringe)); + } +} + +void StatusScreen::draw_buttons(draw_mode_t what) { + int16_t x, y, h, v; + + const bool can_print = isMediaInserted() && !isPrintingFromMedia(); + const bool sdOrHostPrinting = ExtUI::isPrinting(); + const bool sdOrHostPaused = ExtUI::isPrintingPaused(); + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + ui.bounds(POLY(unload_cartridge_btn), x, y, h, v); + + cmd.font(font_medium).colors(normal_btn); + + ui.bounds(POLY(unload_cartridge_btn), x, y, h, v); + cmd.tag(1).button(x, y, h, v, GET_TEXT_F(MSG_UNLOAD_CARTRIDGE)); + + ui.bounds(POLY(load_chocolate_btn), x, y, h, v); + cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_LOAD_CHOCOLATE)); + + ui.bounds(POLY(preheat_chocolate_btn), x, y, h, v); + cmd.tag(3).button(x, y, h, v, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE)); + + ui.bounds(POLY(menu_btn), x, y, h, v); + cmd.tag(4).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_MENU)); + + ui.bounds(POLY(pause_btn), x, y, h, v); + cmd.tag(sdOrHostPaused ? 6 : 5).enabled(sdOrHostPrinting).button(x, y, h, v, sdOrHostPaused ? GET_TEXT_F(MSG_BUTTON_RESUME) : GET_TEXT_F(MSG_BUTTON_PAUSE)); + + ui.bounds(POLY(stop_btn), x, y, h, v); + cmd.tag(7).enabled(sdOrHostPrinting).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_STOP)); + + ui.bounds(POLY(extrude_btn), x, y, h, v); + cmd.tag(8).button(x, y, h, v, GET_TEXT_F(MSG_EXTRUDE)); + + ui.bounds(POLY(print_btn), x, y, h, v); + cmd.tag(9).colors(action_btn).enabled(can_print).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_PRINT)); +} + +void StatusScreen::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + draw_progress(what); + draw_syringe(what); + draw_temperature(what); + draw_buttons(what); +} + +bool StatusScreen::onTouchStart(uint8_t) { + increment = 0; + return true; +} + +bool StatusScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_SCREEN(UnloadCartridgeScreen); break; + case 2: GOTO_SCREEN(LoadChocolateScreen); break; + case 3: GOTO_SCREEN(PreheatMenu); break; + case 4: GOTO_SCREEN(MainMenu); break; + case 5: + sound.play(twinkle, PLAY_ASYNCHRONOUS); + if (ExtUI::isPrintingFromMedia()) + ExtUI::pausePrint(); + #ifdef ACTION_ON_PAUSE + else host_action_pause(); + #endif + GOTO_SCREEN(StatusScreen); + break; + case 6: + sound.play(twinkle, PLAY_ASYNCHRONOUS); + if (ExtUI::isPrintingFromMedia()) + ExtUI::resumePrint(); + #ifdef ACTION_ON_RESUME + else host_action_resume(); + #endif + GOTO_SCREEN(StatusScreen); + break; + case 7: + GOTO_SCREEN(ConfirmAbortPrintDialogBox); + current_screen.forget(); + PUSH_SCREEN(StatusScreen); + break; + case 9: GOTO_SCREEN(FilesScreen); break; + default: return false; + } + // If a passcode is enabled, the LockScreen will prevent the + // user from proceeding. + LockScreen::check_passcode(); + return true; +} + +bool StatusScreen::onTouchHeld(uint8_t tag) { + if (tag == 8 && !ExtUI::isMoving()) { + increment = 0.05; + MoveAxisScreen::setManualFeedrate(E0, increment); + UI_INCREMENT(AxisPosition_mm, E0); + current_screen.onRefresh(); + } + return false; +} + +void StatusScreen::setStatusMessage(progmem_str) { +} + +void StatusScreen::setStatusMessage(const char * const) { +} + +void StatusScreen::onIdle() { + reset_menu_timeout(); + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + if (!EventLoop::is_touch_held()) + onRefresh(); + refresh_timer.start(); + } +} + +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h new file mode 100644 index 0000000000..5cbaced7f6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h @@ -0,0 +1,54 @@ + +/**************************************************************************** + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +/** + * This file was auto-generated using "svg2cpp.py" + * + * The encoding consists of x,y pairs with the min and max scaled to + * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the + * start of a new closed path. + */ + +#pragma once + +constexpr float x_min = 0.000000; +constexpr float x_max = 480.000000; +constexpr float y_min = 0.000000; +constexpr float y_max = 272.000000; + +const PROGMEM uint16_t syringe_outline[] = {0xED96, 0x14F0, 0xE65D, 0x10E9, 0xDED2, 0x0F9C, 0xD74B, 0x110E, 0xD01B, 0x1543, 0xCE80, 0x1836, 0xCE0A, 0x1C3A, 0xCE0F, 0x27AD, 0xCF0A, 0x2BD3, 0xD127, 0x2E5B, 0xD2A1, 0x2FF0, 0xD2A2, 0x9FC9, 0xD407, 0xA97A, 0xD7B9, 0xB10C, 0xD7BF, 0xBB58, 0xD978, 0xC2BE, 0xDD55, 0xC6EB, 0xDD58, 0xD159, 0xDE3B, 0xD3A8, 0xDFCF, 0xD3AF, 0xE0B8, 0xD04C, 0xE0B8, 0xC6EB, 0xE4A7, 0xC299, 0xE652, 0xBAF6, 0xE652, 0xB10C, 0xEA2E, 0xA8EA, 0xEB6C, 0x9E86, 0xEB6C, 0x2F58, 0xEF3C, 0x2B4E, 0xF003, 0x2583, 0xEFFD, 0x1AC2, 0xED96, 0x14F0, 0xED96, 0x14F0}; +const PROGMEM uint16_t syringe_fluid[] = {0xDE73, 0x2512, 0xDA0C, 0x261D, 0xD5B8, 0x29A0, 0xD4AE, 0x2D87, 0xD4AE, 0x9F60, 0xD585, 0xA63B, 0xDE44, 0xA9DE, 0xE32A, 0xA942, 0xE7E3, 0xA6A5, 0xE930, 0xA342, 0xE95D, 0x9C1D, 0xE95B, 0x31B8, 0xE955, 0x2B63, 0xE867, 0x2A67, 0xE790, 0x28DE, 0xE342, 0x25CB, 0xDE73, 0x2512}; +const PROGMEM uint16_t syringe[] = {0xED91, 0x1502, 0xE658, 0x10FB, 0xDECE, 0x0FAE, 0xD746, 0x1120, 0xD016, 0x1555, 0xCE7B, 0x1848, 0xCE05, 0x1C4D, 0xCE0A, 0x27BF, 0xCF05, 0x2BE5, 0xD122, 0x2E6E, 0xD29C, 0x3002, 0xD29D, 0x9FDB, 0xD402, 0xA98C, 0xD7B4, 0xB11F, 0xD7BA, 0xBB6A, 0xD973, 0xC2D1, 0xDD50, 0xC6FD, 0xDD53, 0xD16C, 0xDE36, 0xD3BA, 0xDFCA, 0xD3C2, 0xE0B3, 0xD05E, 0xE0B3, 0xC6FD, 0xE4A2, 0xC2AB, 0xE64D, 0xBB09, 0xE64D, 0xB11F, 0xEA29, 0xA8FC, 0xEB67, 0x9E98, 0xEB67, 0x2F6B, 0xEF37, 0x2B60, 0xEFFE, 0x2595, 0xEFF8, 0x1AD5, 0xED91, 0x1502, 0xED91, 0x1502, 0xFFFF, 0xD1CF, 0x1A7E, 0xD84F, 0x16DB, 0xDF19, 0x15A9, 0xE5E0, 0x16EA, 0xEC5B, 0x1AA4, 0xEC9D, 0x1D34, 0xEC9D, 0x20CC, 0xE5F1, 0x1D41, 0xDF02, 0x1C12, 0xD812, 0x1D41, 0xD166, 0x20CC, 0xD16C, 0x1B45, 0xD1CF, 0x1A7E, 0xFFFF, 0xE3BD, 0xACFD, 0xDE8E, 0xAF4F, 0xD988, 0xAC0F, 0xD7CC, 0xA8CD, 0xDD1C, 0xAAA9, 0xE287, 0xAA5B, 0xE655, 0xA8BE, 0xE3BD, 0xACFD, 0xFFFF, 0xE802, 0x2DC5, 0xE809, 0x343C, 0xE808, 0x9FC8, 0xE7E3, 0xA296, 0xE70D, 0xA4B1, 0xE2C9, 0xA70E, 0xDE4E, 0xA790, 0xD6A1, 0xA457, 0xD5FF, 0x9F2B, 0xD5FF, 0x2DFD, 0xD6B2, 0x2B72, 0xDA78, 0x2861, 0xDE9D, 0x276F, 0xE300, 0x2824, 0xE70D, 0x2B13, 0xE7FF, 0x2DB6, 0xE800, 0x2DC5, 0xE802, 0x2DC5, 0xFFFF, 0xE2ED, 0xBA8B, 0xE1CC, 0xBF52, 0xDF1C, 0xC165, 0xDC64, 0xBF99, 0xDB1B, 0xBAFF, 0xDB19, 0xB433, 0xDF04, 0xB552, 0xE2EF, 0xB438, 0xE2ED, 0xBA8B, 0xFFFF, 0xEC09, 0x2893, 0xE925, 0x2A08, 0xE57D, 0x261D, 0xE149, 0x246F, 0xDBDE, 0x24A0, 0xD6BC, 0x2795, 0xD484, 0x2A46, 0xD1C0, 0x2853, 0xD166, 0x251E, 0xD80D, 0x2151, 0xDF02, 0x200C, 0xE5F6, 0x2151, 0xEC9D, 0x251E, 0xEC09, 0x2893}; +const PROGMEM uint16_t unload_cartridge_btn[] = {0x0AAA, 0x0E1E, 0x57FF, 0x0E1E, 0x57FF, 0x33C3, 0x0AAA, 0x33C3, 0x0AAA, 0x0E1E}; +const PROGMEM uint16_t pause_btn[] = {0x47FF, 0xCA58, 0x7FFF, 0xCA58, 0x7FFF, 0xEFFE, 0x47FF, 0xEFFE, 0x47FF, 0xCA58}; +const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAA, 0x3D2C, 0x57FF, 0x3D2C, 0x57FF, 0x62D2, 0x0AAA, 0x62D2, 0x0AAA, 0x3D2C}; +const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAA, 0x6C3B, 0x57FF, 0x6C3B, 0x57FF, 0x91E0, 0x0AAA, 0x91E0, 0x0AAA, 0x6C3B}; +const PROGMEM uint16_t menu_btn[] = {0x0AAA, 0x9B4A, 0x57FF, 0x9B4A, 0x57FF, 0xC0EF, 0x0AAA, 0xC0EF, 0x0AAA, 0x9B4A}; +const PROGMEM uint16_t print_btn[] = {0x0AAA, 0xCA58, 0x42AA, 0xCA58, 0x42AA, 0xEFFE, 0x0AAA, 0xEFFE, 0x0AAA, 0xCA58}; +const PROGMEM uint16_t stop_btn[] = {0x8554, 0xCA58, 0xBD53, 0xCA58, 0xBD53, 0xEFFE, 0x8554, 0xEFFE, 0x8554, 0xCA58}; +const PROGMEM uint16_t print_time_hms[] = {0x62A9, 0xA968, 0x8FFE, 0xA968, 0x8FFE, 0xC0EF, 0x62A9, 0xC0EF, 0x62A9, 0xA968}; +const PROGMEM uint16_t print_time_percent[] = {0x8FFE, 0xA968, 0xBD53, 0xA968, 0xBD53, 0xC0EF, 0x8FFE, 0xC0EF, 0x8FFE, 0xA968}; +const PROGMEM uint16_t print_time_label[] = {0x62A9, 0x91E0, 0xBD53, 0x91E0, 0xBD53, 0xA986, 0x62A9, 0xA986, 0x62A9, 0x91E0}; +const PROGMEM uint16_t h3_temp[] = {0x62A9, 0x75A4, 0x8FFE, 0x75A4, 0x8FFE, 0x8D2C, 0x62A9, 0x8D2C, 0x62A9, 0x75A4}; +const PROGMEM uint16_t h3_label[] = {0x62A9, 0x5E1D, 0x8FFE, 0x5E1D, 0x8FFE, 0x75A4, 0x62A9, 0x75A4, 0x62A9, 0x5E1D}; +const PROGMEM uint16_t chocolate_label[] = {0x62A9, 0x12D2, 0xBD53, 0x12D2, 0xBD53, 0x2A5A, 0x62A9, 0x2A5A, 0x62A9, 0x12D2}; +const PROGMEM uint16_t h0_label[] = {0x62A9, 0x2A5A, 0x8FFE, 0x2A5A, 0x8FFE, 0x41E1, 0x62A9, 0x41E1, 0x62A9, 0x2A5A}; +const PROGMEM uint16_t h0_temp[] = {0x62A9, 0x41E1, 0x8FFE, 0x41E1, 0x8FFE, 0x5968, 0x62A9, 0x5968, 0x62A9, 0x41E1}; +const PROGMEM uint16_t h1_label[] = {0x8FFE, 0x2A5A, 0xBD53, 0x2A5A, 0xBD53, 0x41E1, 0x8FFE, 0x41E1, 0x8FFE, 0x2A5A}; +const PROGMEM uint16_t h1_temp[] = {0x8FFE, 0x41E1, 0xBD53, 0x41E1, 0xBD53, 0x5968, 0x8FFE, 0x5968, 0x8FFE, 0x41E1}; +const PROGMEM uint16_t extrude_btn[] = {0xC859, 0xDD2B, 0xF5AE, 0xDD2B, 0xF5AE, 0xEFFE, 0xC859, 0xEFFE, 0xC859, 0xDD2B}; +const PROGMEM uint16_t h2_label[] = {0x8FFE, 0x5E1D, 0xBD53, 0x5E1D, 0xBD53, 0x75A4, 0x8FFE, 0x75A4, 0x8FFE, 0x5E1D}; +const PROGMEM uint16_t h2_temp[] = {0x8FFE, 0x75A4, 0xBD53, 0x75A4, 0xBD53, 0x8D2C, 0x8FFE, 0x8D2C, 0x8FFE, 0x75A4}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp new file mode 100644 index 0000000000..2e71093370 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp @@ -0,0 +1,101 @@ +/************************************ + * cocoa_press_unload_cartridge.cpp * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2020 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && ENABLED(TOUCH_UI_COCOA_PRESS) + +#include "screens.h" +#include "screen_data.h" + +using namespace ExtUI; +using namespace FTDI; +using namespace Theme; + +#define GRID_COLS 2 +#define GRID_ROWS 6 + +#define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) +#define DESCRIPTION_POS BTN_POS(1,2), BTN_SIZE(2,3) +#define CARTRIDGE_OUT_BTN_POS BTN_POS(1,5), BTN_SIZE(1,1) +#define CARTRIDGE_IN_BTN_POS BTN_POS(2,5), BTN_SIZE(1,1) +#define BACK_BTN_POS BTN_POS(1,6), BTN_SIZE(2,1) + +void UnloadCartridgeScreen::onRedraw(draw_mode_t what) { + CommandProcessor cmd; + + if (what & BACKGROUND) { + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0) + .font(font_large) + .text(TITLE_POS, GET_TEXT_F(MSG_UNLOAD_CARTRIDGE)); + draw_text_box(cmd, DESCRIPTION_POS, F( + "Press and hold the buttons below to help " + "you unlock the cartridge. After unlocking, " + "press and hold the Cartridge Out button " + "until the cartridge is sticking out of the " + "extruder enough to grip and remove. After " + "removing the cartridge, continue holding the " + "Cartridge Out button until the plunger adapter is " + "visible at the bottom of the extruder." + ), + OPT_CENTERY, font_medium); + } + + if (what & FOREGROUND) { + cmd.font(font_medium) + .colors(normal_btn) + .tag(2).button(CARTRIDGE_OUT_BTN_POS, GET_TEXT_F(MSG_CARTRIDGE_OUT)) + .tag(3).button(CARTRIDGE_IN_BTN_POS, GET_TEXT_F(MSG_CARTRIDGE_IN)) + .colors(action_btn) + .tag(1).button(BACK_BTN_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool UnloadCartridgeScreen::onTouchEnd(uint8_t tag) { + using namespace ExtUI; + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + } + return true; +} + +bool UnloadCartridgeScreen::onTouchHeld(uint8_t tag) { + if (ExtUI::isMoving()) return false; // Don't allow moves to accumulate + constexpr float increment = 0.25; + MoveAxisScreen::setManualFeedrate(E0, increment); + #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); + #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); + switch (tag) { + case 2: UI_DECREMENT_AXIS(E0); break; + case 3: UI_INCREMENT_AXIS(E0); break; + default: return false; + } + #undef UI_DECREMENT_AXIS + #undef UI_INCREMENT_AXIS + return false; +} + +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index a202a611ec..bf1e2d522e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -69,20 +69,23 @@ void LevelingMenu::onRedraw(draw_mode_t what) { if (what & FOREGROUND) { CommandProcessor cmd; cmd.font(font_large) + .cmd(COLOR_RGB(bg_text_enabled)) .text(TITLE_POS, GET_TEXT_F(MSG_LEVELING)) + #if ENABLED(BLTOUCH) + .text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) + #endif .font(font_medium).colors(normal_btn) #if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION) .tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) #endif .tag(3).button(LEVEL_BED_POS, GET_TEXT_F(MSG_LEVEL_BED)) .enabled(ENABLED(HAS_MESH)) - .tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)); + .tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)) #if ENABLED(BLTOUCH) - cmd.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) - .tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) - .tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)); + .tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) + .tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)) #endif - cmd.colors(action_btn) + .colors(action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } @@ -97,13 +100,13 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { #ifndef BED_LEVELING_COMMANDS #define BED_LEVELING_COMMANDS "G29" #endif - #if HAS_MESH + #if ENABLED(AUTO_BED_LEVELING_UBL) BedMeshScreen::startMeshProbe(); #else SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); #endif break; - #if HAS_MESH + #if ENABLED(AUTO_BED_LEVELING_UBL) case 4: GOTO_SCREEN(BedMeshScreen); break; #endif #if ENABLED(BLTOUCH) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 85006566bb..4bd22cdabd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -23,7 +23,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && DISABLED(TOUCH_UI_LULZBOT_BIO) +#if ENABLED(TOUCH_UI_FTDI_EVE) && NONE(TOUCH_UI_LULZBOT_BIO,TOUCH_UI_COCOA_PRESS) #include "screens.h" @@ -69,24 +69,20 @@ void MainMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(Theme::font_medium) - .tag(2).button( AUTO_HOME_POS, GET_TEXT_F(MSG_AUTO_HOME)) - .enabled( - #if ANY(NOZZLE_CLEAN_FEATURE, TOUCH_UI_COCOA_PRESS) - 1 - #endif - ) - .tag(3).button( CLEAN_NOZZLE_POS, GET_TEXT_F(TERN(TOUCH_UI_COCOA_PRESS, MSG_PREHEAT_1, MSG_CLEAN_NOZZLE))) - .tag(4).button( MOVE_AXIS_POS, GET_TEXT_F(MSG_MOVE_AXIS)) - .tag(5).button( DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS)) - .tag(6).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .tag( 2).button( AUTO_HOME_POS, GET_TEXT_F(MSG_AUTO_HOME)) + .enabled(ENABLED(NOZZLE_CLEAN_FEATURE)) + .tag( 3).button( CLEAN_NOZZLE_POS, GET_TEXT_F(MSG_CLEAN_NOZZLE)) + .tag( 4).button( MOVE_AXIS_POS, GET_TEXT_F(MSG_MOVE_AXIS)) + .tag( 5).button( DISABLE_STEPPERS_POS,GET_TEXT_F(MSG_DISABLE_STEPPERS)) + .tag( 6).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) .enabled(IF_DISABLED(TOUCH_UI_LULZBOT_BIO, 1)) - .tag(7).button( FILAMENTCHANGE_POS, GET_TEXT_F(TERN(TOUCH_UI_COCOA_PRESS, MSG_CASE_LIGHT, MSG_FILAMENTCHANGE)) - .tag(8).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag( 7).button( FILAMENTCHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) + .tag( 8).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) .enabled(TERN_(HAS_LEVELING, 1)) - .tag(9).button( LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) - .tag(10).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .tag( 9).button( LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) + .tag(10).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) - .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); } } @@ -96,22 +92,16 @@ bool MainMenu::onTouchEnd(uint8_t tag) { switch (tag) { case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; case 2: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break; - #if ENABLED(TOUCH_UI_COCOA_PRESS) - case 3: GOTO_SCREEN(PreheatMenu); break; - #elif ENABLED(NOZZLE_CLEAN_FEATURE) + #if ENABLED(NOZZLE_CLEAN_FEATURE) case 3: injectCommands_P(PSTR("G12")); GOTO_SCREEN(StatusScreen); break; #endif case 4: GOTO_SCREEN(MoveAxisScreen); break; case 5: injectCommands_P(PSTR("M84")); break; case 6: GOTO_SCREEN(TemperatureScreen); break; - #if BOTH(TOUCH_UI_COCOA_PRESS, CASE_LIGHT_ENABLE) - case 7: GOTO_SCREEN(CaseLightScreen); break; - #else case 7: GOTO_SCREEN(ChangeFilamentScreen); break; - #endif case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; #ifdef HAS_LEVELING - case 9: GOTO_SCREEN(LevelingMenu); break; + case 9: GOTO_SCREEN(LevelingMenu); break; #endif case 10: GOTO_SCREEN(AboutScreen); break; default: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index 06faf303e2..972b758024 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -30,7 +30,7 @@ using namespace FTDI; using namespace ExtUI; -void MoveAxisScreen::onEntry() { +void BaseMoveAxisScreen::onEntry() { // Since Marlin keeps only one absolute position for all the extruders, // we have to keep track of the relative motion of individual extruders // ourselves. The relative distances are reset to zero whenever this @@ -68,7 +68,7 @@ void MoveAxisScreen::onRedraw(draw_mode_t what) { w.increments(); } -bool MoveAxisScreen::onTouchHeld(uint8_t tag) { +bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) { #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); const float increment = getIncrement(); @@ -106,7 +106,7 @@ bool MoveAxisScreen::onTouchHeld(uint8_t tag) { return true; } -float MoveAxisScreen::getManualFeedrate(uint8_t axis, float increment_mm) { +float BaseMoveAxisScreen::getManualFeedrate(uint8_t axis, float increment_mm) { // Compute feedrate so that the tool lags the adjuster when it is // being held down, this allows enough margin for the planner to // connect segments and even out the motion. @@ -114,11 +114,11 @@ float MoveAxisScreen::getManualFeedrate(uint8_t axis, float increment_mm) { return min(max_manual_feedrate[axis] / 60.0f, abs(increment_mm * (TOUCH_REPEATS_PER_SECOND) * 0.80f)); } -void MoveAxisScreen::setManualFeedrate(ExtUI::axis_t axis, float increment_mm) { +void BaseMoveAxisScreen::setManualFeedrate(ExtUI::axis_t axis, float increment_mm) { ExtUI::setFeedrate_mm_s(getManualFeedrate(X_AXIS + (axis - ExtUI::X), increment_mm)); } -void MoveAxisScreen::setManualFeedrate(ExtUI::extruder_t, float increment_mm) { +void BaseMoveAxisScreen::setManualFeedrate(ExtUI::extruder_t, float increment_mm) { ExtUI::setFeedrate_mm_s(getManualFeedrate(E_AXIS, increment_mm)); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 64927d58d9..ff85689ef2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -115,6 +115,10 @@ SCREEN_TABLE { #if ENABLED(TOUCH_UI_COCOA_PRESS) DECL_SCREEN(PreheatMenu), DECL_SCREEN(PreheatTimerScreen), + DECL_SCREEN(UnloadCartridgeScreen), + DECL_SCREEN(LoadChocolateScreen), + DECL_SCREEN(MoveXYZScreen), + DECL_SCREEN(MoveEScreen), #endif #if ENABLED(TOUCH_UI_DEVELOPER_MENU) DECL_SCREEN(DeveloperMenu), diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 7b062045f9..3fa18d9f67 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -98,6 +98,10 @@ enum { #if ENABLED(TOUCH_UI_COCOA_PRESS) PREHEAT_MENU_CACHE, PREHEAT_TIMER_SCREEN_CACHE, + UNLOAD_CARTRIDGE_SCREEN_CACHE, + LOAD_CHOCOLATE_SCREEN_CACHE, + MOVE_XYZ_SCREEN_CACHE, + MOVE_E_SCREEN_CACHE, #endif #if ENABLED(SDSUPPORT) FILES_SCREEN_CACHE, @@ -112,7 +116,7 @@ enum { // To save MCU RAM, the status message is "baked" in to the status screen // cache, so we reserve a large chunk of memory for the DL cache -#define STATUS_SCREEN_DL_SIZE 2048 +#define STATUS_SCREEN_DL_SIZE 4096 #define ALERT_BOX_DL_SIZE 3072 #define SPINNER_DL_SIZE 3072 #define FILE_SCREEN_DL_SIZE 4160 @@ -280,6 +284,7 @@ class StatusScreen : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - class PreheatTimerScreen : public BaseScreen, public CachedScreen { - private: - static uint16_t secondsRemaining(); - - static void draw_message(draw_mode_t); - static void draw_time_remaining(draw_mode_t); - static void draw_interaction_buttons(draw_mode_t); - public: - static void onRedraw(draw_mode_t); - - static void onEntry(); - static void onIdle(); - static bool onTouchEnd(uint8_t tag); - }; -#endif - class MainMenu : public BaseScreen, public CachedScreen { public: static void onRedraw(draw_mode_t); @@ -467,7 +449,7 @@ class BaseNumericAdjustmentScreen : public BaseScreen { static bool onTouchEnd(uint8_t tag); }; -class MoveAxisScreen : public BaseNumericAdjustmentScreen, public CachedScreen { +class BaseMoveAxisScreen : public BaseNumericAdjustmentScreen { private: static float getManualFeedrate(uint8_t axis, float increment_mm); public: @@ -475,8 +457,12 @@ class MoveAxisScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); static void onIdle(); }; @@ -852,3 +838,54 @@ class MediaPlayerScreen : public BaseScreen, public UncachedScreen { static bool onTouchEnd(uint8_t tag); }; #endif + +#if ENABLED(TOUCH_UI_COCOA_PRESS) + class PreheatMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; + + class PreheatTimerScreen : public BaseScreen, public CachedScreen { + private: + static uint16_t secondsRemaining(); + + static void draw_message(draw_mode_t); + static void draw_time_remaining(draw_mode_t); + static void draw_interaction_buttons(draw_mode_t); + static void draw_adjuster(draw_mode_t, uint8_t tag, progmem_str label, float value, int16_t x, int16_t y, int16_t w, int16_t h); + public: + static void onRedraw(draw_mode_t); + + static void onEntry(); + static void onIdle(); + static bool onTouchHeld(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + }; + + class UnloadCartridgeScreen : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + }; + + class LoadChocolateScreen : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + }; + + class MoveXYZScreen : public BaseMoveAxisScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static void onIdle(); + }; + + class MoveEScreen : public BaseMoveAxisScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static void onIdle(); + }; +#endif \ No newline at end of file diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp index e320bf5a01..0011306c7e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp @@ -33,7 +33,7 @@ using namespace ExtUI; void TemperatureScreen::onRedraw(draw_mode_t what) { widgets_t w(what); #if TOUCH_UI_LCD_TEMP_SCALING == 10 - w.precision(1) + w.precision(1, DEFAULT_MIDRANGE) #else w.precision(0, getTargetTemp_celsius(E0) == 0 ? DEFAULT_HIGHEST : DEFAULT_MIDRANGE) #endif @@ -41,7 +41,14 @@ void TemperatureScreen::onRedraw(draw_mode_t what) { w.heading(GET_TEXT_F(MSG_TEMPERATURE)); w.button(30, GET_TEXT_F(MSG_COOLDOWN)); #ifndef NO_TOOLHEAD_HEATER_GCODE - #if HOTENDS == 1 + #ifdef TOUCH_UI_COCOA_PRESS + w.adjuster( 2, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0)); + w.adjuster( 4, GET_TEXT_F(MSG_BODY), getTargetTemp_celsius(E1)); + #if ENABLED(COCOA_PRESS_EXTRA_HEATER) + if (has_extra_heater()) + w.adjuster(6, GET_TEXT_F(MSG_EXTERNAL), getTargetTemp_celsius(E2)); + #endif + #elif HOTENDS == 1 w.adjuster( 2, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0)); #else w.adjuster( 2, F(LCD_STR_E0), getTargetTemp_celsius(E0)); @@ -95,12 +102,12 @@ bool TemperatureScreen::onTouchHeld(uint8_t tag) { case 11: UI_INCREMENT(TargetFan_percent, FAN0); break; #endif case 30: - #define _HOTEND_OFF(N) setTargetTemp_celsius(0,E##N); + #define _HOTEND_OFF(N) setTargetTemp_celsius(0, E##N); REPEAT(HOTENDS, _HOTEND_OFF); - TERN_(HAS_HEATED_BED, setTargetTemp_celsius(0,BED)); - TERN_(HAS_HEATED_CHAMBER, setTargetTemp_celsius(0,CHAMBER)); + TERN_(HAS_HEATED_BED, setTargetTemp_celsius(0, BED)); + TERN_(HAS_HEATED_CHAMBER, setTargetTemp_celsius(0, CHAMBER)); #if HAS_FAN - setTargetFan_percent(0,FAN0); + setTargetFan_percent(0, FAN0); #endif break; default: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index 10cbb8af53..f70851521a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -76,7 +76,7 @@ void TuneMenu::onRedraw(draw_mode_t what) { .tag(3).button( FIL_CHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) .tag(9).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) - .enabled(EITHER(HAS_BED_PROBE, BABYSTEPPING)) + .enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE) || ENABLED(BABYSTEPPING)) .tag(4).button( NUDGE_NOZ_POS, GET_TEXT_F(TERN(BABYSTEPPING, MSG_NUDGE_NOZZLE, MSG_ZPROBE_ZOFFSET))) .tag(5).button( SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) .enabled(sdOrHostPrinting) @@ -103,7 +103,7 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { case 4: #if ENABLED(BABYSTEPPING) GOTO_SCREEN(NudgeNozzleScreen); - #elif HAS_BED_PROBE + #elif BOTH(HAS_LEVELING, HAS_BED_PROBE) GOTO_SCREEN(ZOffsetScreen); #endif break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp index dd211e3439..0acfbb07d6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_BED_PROBE) +#if ENABLED(TOUCH_UI_FTDI_EVE) && BOTH(HAS_LEVELING, HAS_BED_PROBE) #include "screens.h" From 70d393b5cd557fb8c8d314ffa5c73c62da923791 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Wed, 9 Dec 2020 12:07:26 -0500 Subject: [PATCH 0706/1370] Move ExtUI ABL mesh edit, limit to bilinear (#20381) * Move ExtUI call Co-authored-by: Scott Lahteine Co-authored-by: Victor Mateus Oliveira Co-authored-by: Sebastiaan Dammann --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 15555d5f8d..05260955bf 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -177,8 +177,6 @@ G29_TYPE GcodeSuite::G29() { if (DISABLED(PROBE_MANUALLY) && seenQ) G29_RETURN(false); #endif - TERN_(EXTENSIBLE_UI, ExtUI::onMeshLevelingStart()); - const bool seenA = TERN0(PROBE_MANUALLY, parser.seen('A')), no_action = seenA || seenQ, faux = ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) ? parser.boolval('C') : no_action; @@ -399,6 +397,10 @@ G29_TYPE GcodeSuite::G29() { points[0].z = points[1].z = points[2].z = 0; // Probe at 3 arbitrary points #endif + #if BOTH(AUTO_BED_LEVELING_BILINEAR, EXTENSIBLE_UI) + ExtUI::onMeshLevelingStart(); + #endif + if (!faux) remember_feedrate_scaling_off(); // Disable auto bed leveling during G29. From 9f740d18720d9a57486704e9ee969544f53dd251 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 9 Dec 2020 18:43:49 -0300 Subject: [PATCH 0707/1370] MKS Robin Pins fixes for STM32 and STM32F1 (#20404) Co-authored-by: Scott Lahteine --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 40 +++++++++++-------- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 7 +--- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 581dd5375b..a36b8a32e6 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -23,7 +23,6 @@ /** * MKS Robin (STM32F130ZET6) board pin assignments - * * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware */ @@ -121,18 +120,9 @@ #define PS_ON_PIN PA3 // PW_OFF #define FIL_RUNOUT_PIN PF11 // MT_DET -#ifdef ARDUINO_ARCH_STM32F1 - #define BEEPER_PIN PC13 -#else - #define BEEPER_PIN -1 -#endif +#define BEEPER_PIN PC13 #define LED_PIN PB2 -#if HAS_FSMC_TFT || HAS_GRAPHICAL_TFT - #define TFT_CS_PIN PG12 // NE4 - #define TFT_RS_PIN PF0 // A0 -#endif - #if HAS_FSMC_TFT /** * Note: MKS Robin TFT screens use various TFT controllers @@ -140,23 +130,27 @@ * ILI9488 is not supported * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp * - * If the screen stays white, disable 'LCD_RESET_PIN' + * If the screen stays white, disable 'TFT_RESET_PIN' * to let the bootloader init the screen. * - * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu + * Setting an 'TFT_RESET_PIN' may cause a flicker when entering the LCD menu * because Marlin uses the reset as a failsafe to revive a glitchy LCD. */ - //#define LCD_RESET_PIN PF6 - #define LCD_BACKLIGHT_PIN PG11 + #define TFT_CS_PIN PG12 // NE4 + #define TFT_RS_PIN PF0 // A0 + #define FSMC_CS_PIN TFT_CS_PIN #define FSMC_RS_PIN TFT_RS_PIN #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 -#elif HAS_GRAPHICAL_TFT + #define TFT_RESET_PIN PF6 #define TFT_BACKLIGHT_PIN PG11 + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 #endif #if NEED_TOUCH_PINS @@ -170,11 +164,23 @@ // SPI1(PA7) & SPI3(PB5) not available #define SPI_DEVICE 2 +#define SDIO_SUPPORT #if ENABLED(SDIO_SUPPORT) #define SCK_PIN PB13 // SPI2 #define MISO_PIN PB14 // SPI2 #define MOSI_PIN PB15 // SPI2 - #define SD_DETECT_PIN PF12 // SD_CD + /** + * MKS Robin has a few hardware revisions + * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware + * + * MKS Robin less or equal to V2.3 don't have SD_DETECT_PIN. + * + * MKS Robin greater or equal to V2.4 have SD_DETECT_PIN at PF12. + * + * You can uncomment it here, or you can add it SD_DETECT_PIN to your Configuration.h + */ + //#define SD_DETECT_PIN -1 + //#define SD_DETECT_PIN PF12 // SD_CD #else // SD as custom software SPI (SDIO pins) #define SCK_PIN PC12 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 760f27060e..4b644d693b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -23,6 +23,7 @@ /** * MKS Robin nano (STM32F130VET6) board pin assignments + * https://github.com/makerbase-mks/MKS-Robin-Nano-V1.X/tree/master/hardware */ #if NOT_TARGET(STM32F1, STM32F1xx) @@ -167,18 +168,14 @@ /** * Note: MKS Robin TFT screens use various TFT controllers. - * If the screen stays white, disable 'LCD_RESET_PIN' + * If the screen stays white, disable 'TFT_RESET_PIN' * to let the bootloader init the screen. */ - // Shared FSMC Configs #if HAS_FSMC_TFT #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - #define TOUCH_CS_PIN PA7 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK #define TOUCH_MISO_PIN PB14 // SPI2_MISO From aecfd95592ae5cb37da254f732d4714c40b44b69 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 10 Dec 2020 10:27:02 -0800 Subject: [PATCH 0708/1370] Clarify "not Interrupt-capable" error message (#20419) --- Marlin/src/HAL/AVR/endstop_interrupts.h | 34 ++++++++++----------- Marlin/src/HAL/LPC1768/endstop_interrupts.h | 26 ++++++++-------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Marlin/src/HAL/AVR/endstop_interrupts.h b/Marlin/src/HAL/AVR/endstop_interrupts.h index ae9a605acc..9fd9c38b86 100644 --- a/Marlin/src/HAL/AVR/endstop_interrupts.h +++ b/Marlin/src/HAL/AVR/endstop_interrupts.h @@ -124,7 +124,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(X_MAX_PIN); #else - static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(X_MAX_PIN); #endif #endif @@ -132,7 +132,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(X_MIN_PIN); #else - static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(X_MIN_PIN); #endif #endif @@ -140,7 +140,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Y_MAX_PIN); #else - static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Y_MAX_PIN); #endif #endif @@ -148,7 +148,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Y_MIN_PIN); #else - static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Y_MIN_PIN); #endif #endif @@ -156,7 +156,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z_MAX_PIN); #else - static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z_MAX_PIN); #endif #endif @@ -164,7 +164,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z_MIN_PIN); #else - static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z_MIN_PIN); #endif #endif @@ -172,7 +172,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(X2_MAX_PIN); #else - static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(X2_MAX_PIN); #endif #endif @@ -180,7 +180,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(X2_MIN_PIN); #else - static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(X2_MIN_PIN); #endif #endif @@ -188,7 +188,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Y2_MAX_PIN); #else - static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Y2_MAX_PIN); #endif #endif @@ -196,7 +196,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Y2_MIN_PIN); #else - static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Y2_MIN_PIN); #endif #endif @@ -204,7 +204,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z2_MAX_PIN); #else - static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z2_MAX_PIN); #endif #endif @@ -212,7 +212,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z2_MIN_PIN); #else - static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z2_MIN_PIN); #endif #endif @@ -220,7 +220,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z3_MAX_PIN); #else - static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z3_MAX_PIN); #endif #endif @@ -228,7 +228,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z3_MIN_PIN); #else - static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z3_MIN_PIN); #endif #endif @@ -236,7 +236,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z4_MAX_PIN); #else - static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z4_MAX_PIN); #endif #endif @@ -244,7 +244,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z4_MIN_PIN); #else - static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z4_MIN_PIN); #endif #endif @@ -252,7 +252,7 @@ void setup_endstop_interrupts() { #if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z_MIN_PROBE_PIN); #else - static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(Z_MIN_PROBE_PIN); #endif #endif diff --git a/Marlin/src/HAL/LPC1768/endstop_interrupts.h b/Marlin/src/HAL/LPC1768/endstop_interrupts.h index b0d0c0ec5c..126d6e7d5b 100644 --- a/Marlin/src/HAL/LPC1768/endstop_interrupts.h +++ b/Marlin/src/HAL/LPC1768/endstop_interrupts.h @@ -46,79 +46,79 @@ void setup_endstop_interrupts() { #if HAS_X_MAX #if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN) - #error "X_MAX_PIN is not INTERRUPT-capable." + #error "X_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(X_MAX_PIN); #endif #if HAS_X_MIN #if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN) - #error "X_MIN_PIN is not INTERRUPT-capable." + #error "X_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(X_MIN_PIN); #endif #if HAS_Y_MAX #if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN) - #error "Y_MAX_PIN is not INTERRUPT-capable." + #error "Y_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Y_MAX_PIN); #endif #if HAS_Y_MIN #if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN) - #error "Y_MIN_PIN is not INTERRUPT-capable." + #error "Y_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Y_MIN_PIN); #endif #if HAS_Z_MAX #if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN) - #error "Z_MAX_PIN is not INTERRUPT-capable." + #error "Z_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MAX_PIN); #endif #if HAS_Z_MIN #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN) - #error "Z_MIN_PIN is not INTERRUPT-capable." + #error "Z_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MIN_PIN); #endif #if HAS_Z2_MAX #if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN) - #error "Z2_MAX_PIN is not INTERRUPT-capable." + #error "Z2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z2_MAX_PIN); #endif #if HAS_Z2_MIN #if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN) - #error "Z2_MIN_PIN is not INTERRUPT-capable." + #error "Z2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z2_MIN_PIN); #endif #if HAS_Z3_MAX #if !LPC1768_PIN_INTERRUPT_M(Z3_MAX_PIN) - #error "Z3_MIN_PIN is not INTERRUPT-capable." + #error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z3_MAX_PIN); #endif #if HAS_Z3_MIN #if !LPC1768_PIN_INTERRUPT_M(Z3_MIN_PIN) - #error "Z3_MIN_PIN is not INTERRUPT-capable." + #error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z3_MIN_PIN); #endif #if HAS_Z4_MAX #if !LPC1768_PIN_INTERRUPT_M(Z4_MAX_PIN) - #error "Z4_MIN_PIN is not INTERRUPT-capable." + #error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z4_MAX_PIN); #endif #if HAS_Z4_MIN #if !LPC1768_PIN_INTERRUPT_M(Z4_MIN_PIN) - #error "Z4_MIN_PIN is not INTERRUPT-capable." + #error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z4_MIN_PIN); #endif #if HAS_Z_MIN_PROBE_PIN #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN) - #error "Z_MIN_PROBE_PIN is not INTERRUPT-capable." + #error "Z_MIN_PROBE_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MIN_PROBE_PIN); #endif From 0c383b858ffd8961a9f4b3f8ff28f095ca3788d8 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 11 Dec 2020 07:30:58 +1300 Subject: [PATCH 0709/1370] Fix UBL Debug Messages (#20423) Co-authored-by: ellensp --- Marlin/src/module/settings.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c6eee271a0..ec549ea2f6 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -563,7 +563,7 @@ void MarlinSettings::postprocess() { "ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE is insufficient to capture all EEPROM data."); #endif -//#define DEBUG_OUT 1 +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" #if ENABLED(EEPROM_SETTINGS) @@ -2294,14 +2294,14 @@ void MarlinSettings::postprocess() { if (!ubl.sanity_check()) { SERIAL_EOL(); - #if ENABLED(EEPROM_CHITCHAT) + #if BOTH(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) ubl.echo_name(); DEBUG_ECHOLNPGM(" initialized.\n"); #endif } else { eeprom_error = true; - #if ENABLED(EEPROM_CHITCHAT) + #if BOTH(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) DEBUG_ECHOPGM("?Can't enable "); ubl.echo_name(); DEBUG_ECHOLNPGM("."); From 2a5b32f109ecdb6aed53907015a0c36e4a61ad9f Mon Sep 17 00:00:00 2001 From: elasticdotventures <35611074+elasticdotventures@users.noreply.github.com> Date: Fri, 11 Dec 2020 18:33:29 +1100 Subject: [PATCH 0710/1370] Z_SENSORLESS sanity checks (#20421) Co-authored-by: Jason Smith --- Marlin/src/inc/SanityCheck.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 36dc373ecc..857f12e454 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2654,6 +2654,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if ENABLED(SENSORLESS_PROBING) #if ENABLED(DELTA) && !(X_SENSORLESS && Y_SENSORLESS && Z_SENSORLESS) #error "SENSORLESS_PROBING for DELTA requires TMC stepper drivers with StallGuard on X, Y, and Z axes." + #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #error "SENSORLESS_PROBING cannot be used with Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN." + #elif ENABLED(USE_PROBE_FOR_Z_HOMING) + #error "SENSORLESS_PROBING cannot be used with USE_PROBE_FOR_Z_HOMING." #elif !Z_SENSORLESS #error "SENSORLESS_PROBING requires a TMC stepper driver with StallGuard on Z." #endif From 74042d368edb473d9b1d6b7ee2800d87012d1b72 Mon Sep 17 00:00:00 2001 From: FanDjango <51046875+FanDjango@users.noreply.github.com> Date: Fri, 11 Dec 2020 09:06:57 +0100 Subject: [PATCH 0711/1370] Probe offset wizard fixes (#20414) * STOW probe, reverting incorrect earlier change from #20344 * Adjust soft endstop disables, to ensure travel below bed functions properly Co-authored-by: FanDjango --- Marlin/src/lcd/menu/menu_probe_offset.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 8f87e82ae0..e5b1da3d0b 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -133,11 +133,13 @@ void prepare_for_probe_offset_wizard() { // Probe for Z reference ui.wait_for_move = true; - z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_RAISE, 0, true); + z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_STOW, 0, true); ui.wait_for_move = false; #endif + SET_SOFT_ENDSTOP_LOOSE(true); // Disable soft endstops for free Z movement + // Move Nozzle to Probing/Homing Position ui.wait_for_move = true; current_position += probe.offset_xy; @@ -173,7 +175,6 @@ void goto_probe_offset_wizard() { ui.goto_screen([]{ _lcd_draw_homing(); if (all_axes_homed()) { - SET_SOFT_ENDSTOP_LOOSE(true); // Disable soft endstops for free Z movement z_offset_ref = 0; // Set Z Value for Wizard Position to 0 ui.goto_screen(prepare_for_probe_offset_wizard); ui.defer_status_screen(); From 8f188adc32d438d98d3783e71defee53a15a14f5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 11 Dec 2020 01:39:51 -0800 Subject: [PATCH 0712/1370] SENSORLESS_PROBING sanity check followup (#20438) --- buildroot/tests/LPC1769-tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index f661babc40..ebfa4cc8dc 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -67,7 +67,7 @@ opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT MECHANICAL TMC_USE_SW_SPI MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z HYBRID_THRESHOLD \ SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \ EXPERIMENTAL_I2CBUS -opt_disable PSU_CONTROL +opt_disable PSU_CONTROL Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN exec_test $1 $2 "Cohesion3D Remix DELTA + ABL Bilinear + EEPROM + SENSORLESS_PROBING" "$3" # clean up From c0ad4718a4d488d5f1f951efa701d73eb52d5b36 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 11 Dec 2020 18:21:56 -0600 Subject: [PATCH 0713/1370] Better animated boot screen --- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 12 ++++++++++-- Marlin/src/lcd/tft/ui_320x240.cpp | 6 +----- Marlin/src/lcd/tft/ui_480x320.cpp | 6 +----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 4e265a8ee4..54735175b4 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -144,10 +144,16 @@ bool MarlinUI::detected() { return true; } constexpr millis_t d = 0; constexpr uint8_t f = 0; #else - constexpr millis_t d = CUSTOM_BOOTSCREEN_FRAME_TIME; + #if DISABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) + constexpr millis_t d = CUSTOM_BOOTSCREEN_FRAME_TIME; + #endif LOOP_L_N(f, COUNT(custom_bootscreen_animation)) #endif { + #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) + const uint8_t fr = _MIN(f, COUNT(custom_bootscreen_frame_time) - 1); + const millis_t d = custom_bootscreen_frame_time[fr]; + #endif u8g.firstPage(); do { draw_custom_bootscreen(f); } while (u8g.nextPage()); if (d) safe_delay(d); @@ -156,7 +162,9 @@ bool MarlinUI::detected() { return true; } #ifndef CUSTOM_BOOTSCREEN_TIMEOUT #define CUSTOM_BOOTSCREEN_TIMEOUT 2500 #endif - safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); + #if CUSTOM_BOOTSCREEN_TIMEOUT + safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); + #endif } #endif // SHOW_CUSTOM_BOOTSCREEN diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 51f65c59b5..ceea4a428e 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -88,10 +88,6 @@ void MarlinUI::clear_lcd() { } #if ENABLED(SHOW_BOOTSCREEN) - #ifndef BOOTSCREEN_TIMEOUT - #define BOOTSCREEN_TIMEOUT 1500 - #endif - void MarlinUI::show_bootscreen() { tft.queue.reset(); @@ -106,7 +102,7 @@ void MarlinUI::clear_lcd() { safe_delay(BOOTSCREEN_TIMEOUT); clear_lcd(); } -#endif // SHOW_BOOTSCREEN +#endif void MarlinUI::draw_kill_screen() { tft.queue.reset(); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 343d187d26..9e387b2402 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -90,10 +90,6 @@ void MarlinUI::clear_lcd() { } #if ENABLED(SHOW_BOOTSCREEN) - #ifndef BOOTSCREEN_TIMEOUT - #define BOOTSCREEN_TIMEOUT 1500 - #endif - #undef BOOTSCREEN_TIMEOUT #define BOOTSCREEN_TIMEOUT 5000 @@ -112,7 +108,7 @@ void MarlinUI::clear_lcd() { safe_delay(BOOTSCREEN_TIMEOUT); clear_lcd(); } -#endif // SHOW_BOOTSCREEN +#endif void MarlinUI::draw_kill_screen() { tft.queue.reset(); From d0c2b643f8b705ecce57f2efa9702ea034354589 Mon Sep 17 00:00:00 2001 From: leodoener Date: Sat, 12 Dec 2020 03:20:24 +0100 Subject: [PATCH 0714/1370] Fix SDCARD_SORT_ALPHA on Ender 3 V2 (#20443) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 5a21000698..db44782fde 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1690,7 +1690,7 @@ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { return; } - card.getfilename_sorted(item - is_subdir); + card.getfilename_sorted(SD_ORDER(item - is_subdir, card.get_num_Files())); char * const name = card.longest_filename(); #if ENABLED(SCROLL_LONG_FILENAMES) From 5aebc9fb0c11d672edadec9a9beffddf1781b1b9 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 13 Dec 2020 07:59:17 +1300 Subject: [PATCH 0715/1370] Add HAS_PIN_27_BOARD for CREALITY_V4 (#20446) Co-authored-by: ellensp --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 44be73029d..69371f0f73 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -48,17 +48,21 @@ #endif #if ENABLED(IIC_BL24CXX_EEPROM) - #define IIC_EEPROM_SDA PA11 - #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) + #define IIC_EEPROM_SDA PA11 + #define IIC_EEPROM_SCL PA12 + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) #elif ENABLED(SDCARD_EEPROM_EMULATION) - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb #endif // // Servos // -#define SERVO0_PIN PB0 // BLTouch OUT +#ifndef HAS_PIN_27_BOARD + #define SERVO0_PIN PB0 // BLTouch OUT +#else + #define SERVO0_PIN PC6 +#endif // // Limit Switches @@ -156,7 +160,9 @@ #define BTN_EN1 PB10 #define BTN_EN2 PB14 - #define BEEPER_PIN PC6 + #ifndef HAS_PIN_27_BOARD + #define BEEPER_PIN PC6 + #endif #elif ENABLED(VET6_12864_LCD) From e9bde7e6fce626540353657a9835f16b8121ee82 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sat, 12 Dec 2020 20:03:28 +0100 Subject: [PATCH 0716/1370] Improve ASSISTED_TRAMMING_WIZARD probe stowing (#20437) * When BLTOUCH_HS_MODE enabled, stow pin before user interaction * For all probes, ensure probe stows at end of wizard --- Marlin/src/lcd/menu/menu_tramming.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index c9043a118b..a0dad20e62 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -43,11 +43,9 @@ float z_measured[G35_PROBE_COUNT] = { 0 }; static uint8_t tram_index = 0; bool probe_single_point() { - // In BLTOUCH HS mode, the probe travels in a deployed state. - // Users of Tramming Wizard might have a badly misaligned bed, so raise Z by the - // length of the deployed pin (BLTOUCH stroke < 7mm) - do_blocking_move_to_z((Z_CLEARANCE_BETWEEN_PROBES) + TERN0(BLTOUCH_HS_MODE, 7)); - const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[tram_index], PROBE_PT_RAISE, 0, true); + do_blocking_move_to_z(TERN(BLTOUCH, Z_CLEARANCE_DEPLOY_PROBE, Z_CLEARANCE_BETWEEN_PROBES)); + //Stow after each point with BLTouch "HIGH SPEED" mode for push-pin safety + const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[tram_index], TERN(BLTOUCH_HS_MODE, PROBE_PT_STOW, PROBE_PT_RAISE), 0, true); DEBUG_ECHOLNPAIR("probe_single_point: ", z_probed_height, "mm"); z_measured[tram_index] = z_probed_height; @@ -81,7 +79,10 @@ void tramming_wizard_menu() { LOOP_L_N(i, G35_PROBE_COUNT) SUBMENU_N_P(i, (char*)pgm_read_ptr(&tramming_point_name[i]), []{ _menu_single_probe(MenuItemBase::itemIndex); }); - ACTION_ITEM(MSG_BUTTON_DONE, []{ ui.goto_previous_screen_no_defer(); }); + ACTION_ITEM(MSG_BUTTON_DONE, []{ + probe.stow(); // Stow before exiting Tramming Wizard + ui.goto_previous_screen_no_defer(); + }); END_MENU(); } From 430855fdca57731eefdf630779fb0a2d9527710c Mon Sep 17 00:00:00 2001 From: FanDjango <51046875+FanDjango@users.noreply.github.com> Date: Sun, 13 Dec 2020 02:18:33 +0100 Subject: [PATCH 0717/1370] Probe Offset Wizard followupBack to PROBE_PT_RAISE/separate STOW, make "PROBING" msg appear (#20439) * Go back to always use PROBE_PT_RAISE with a discrete stow. This ensures a raise above the bed, while stowing prior to exiting the wizard. * Fix issue preventing text while moving to X/Y position Co-authored-by: FanDjango --- Marlin/src/lcd/menu/menu_probe_offset.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index e5b1da3d0b..b73945ea09 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -120,11 +120,11 @@ void probe_offset_wizard_menu() { } void prepare_for_probe_offset_wizard() { - if (ui.wait_for_move) return; - #if defined(PROBE_OFFSET_WIZARD_XY_POS) || !HOMING_Z_WITH_PROBE if (ui.should_draw()) MenuItem_static::draw(1, GET_TEXT(MSG_PROBE_WIZARD_PROBING)); + if (ui.wait_for_move) return; + #ifndef PROBE_OFFSET_WIZARD_XY_POS #define PROBE_OFFSET_WIZARD_XY_POS XY_CENTER #endif @@ -133,13 +133,16 @@ void prepare_for_probe_offset_wizard() { // Probe for Z reference ui.wait_for_move = true; - z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_STOW, 0, true); + z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_RAISE, 0, true); ui.wait_for_move = false; + // Stow the probe, as the last call to probe.probe_at_point(...) left + // the probe deployed if it was successful. + probe.stow(); + #else + if (ui.wait_for_move) return; #endif - SET_SOFT_ENDSTOP_LOOSE(true); // Disable soft endstops for free Z movement - // Move Nozzle to Probing/Homing Position ui.wait_for_move = true; current_position += probe.offset_xy; @@ -147,6 +150,8 @@ void prepare_for_probe_offset_wizard() { ui.synchronize(GET_TEXT(MSG_PROBE_WIZARD_MOVING)); ui.wait_for_move = false; + SET_SOFT_ENDSTOP_LOOSE(true); // Disable soft endstops for free Z movement + // Go to Calibration Menu ui.goto_screen(probe_offset_wizard_menu); ui.defer_status_screen(); From cbe27daafbadb34d7351c60b1d818cde064faf85 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 13 Dec 2020 01:53:21 -0600 Subject: [PATCH 0718/1370] Adjust planner debugging --- Marlin/src/module/planner.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 147adb12e3..5897d10cd5 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1765,14 +1765,15 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif /* <-- add a slash to enable - SERIAL_ECHOLNPAIR(" _populate_block FR:", fr_mm_s, - " A:", target.a, " (", da, " steps)" - " B:", target.b, " (", db, " steps)" - " C:", target.c, " (", dc, " steps)" - #if EXTRUDERS - " E:", target.e, " (", de, " steps)" - #endif - ); + SERIAL_ECHOLNPAIR( + " _populate_block FR:", fr_mm_s, + " A:", target.a, " (", da, " steps)" + " B:", target.b, " (", db, " steps)" + " C:", target.c, " (", dc, " steps)" + #if EXTRUDERS + " E:", target.e, " (", de, " steps)" + #endif + ); //*/ #if EITHER(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) From b81a9e54a30d5e3a66f0ebf668bae47e8e7c5a3c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 13 Dec 2020 01:50:02 -0600 Subject: [PATCH 0719/1370] SHORT_MANUAL_Z_MOVE => FINE_MANUAL_MOVE --- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 4 +++- Marlin/src/lcd/language/language_an.h | 2 +- Marlin/src/lcd/language/language_bg.h | 2 +- Marlin/src/lcd/language/language_ca.h | 2 +- Marlin/src/lcd/language/language_cz.h | 2 +- Marlin/src/lcd/language/language_da.h | 2 +- Marlin/src/lcd/language/language_de.h | 2 +- Marlin/src/lcd/language/language_el.h | 2 +- Marlin/src/lcd/language/language_el_gr.h | 2 +- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/language/language_es.h | 2 +- Marlin/src/lcd/language/language_eu.h | 2 +- Marlin/src/lcd/language/language_fi.h | 2 +- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_gl.h | 2 +- Marlin/src/lcd/language/language_hr.h | 2 +- Marlin/src/lcd/language/language_hu.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_jp_kana.h | 2 +- Marlin/src/lcd/language/language_nl.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_pt.h | 2 +- Marlin/src/lcd/language/language_pt_br.h | 2 +- Marlin/src/lcd/language/language_ro.h | 2 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/language/language_uk.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 2 +- Marlin/src/lcd/language/language_zh_TW.h | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 18 +++++++++--------- Marlin/src/lcd/menu/menu_probe_offset.cpp | 12 ++++++------ 33 files changed, 48 insertions(+), 46 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f49749c045..9e5ebb33ba 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1055,7 +1055,7 @@ #if EITHER(IS_ULTIPANEL, EXTENSIBLE_UI) #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel - #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) + #define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines #if IS_ULTIPANEL #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 857f12e454..10a196b958 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -531,6 +531,8 @@ #error "PROBE_OFFSET_START is now PROBE_OFFSET_WIZARD_START_Z." #elif defined(POWER_LOSS_PULL) #error "POWER_LOSS_PULL is now specifically POWER_LOSS_PULL(UP|DOWN)." +#elif defined(SHORT_MANUAL_Z_MOVE) + #error "SHORT_MANUAL_Z_MOVE is now FINE_MANUAL_MOVE, applying to Z on most printers." #elif defined(FIL_RUNOUT_INVERTING) #if FIL_RUNOUT_INVERTING #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH." @@ -2657,7 +2659,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) #error "SENSORLESS_PROBING cannot be used with Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN." #elif ENABLED(USE_PROBE_FOR_Z_HOMING) - #error "SENSORLESS_PROBING cannot be used with USE_PROBE_FOR_Z_HOMING." + #error "SENSORLESS_PROBING cannot be used with USE_PROBE_FOR_Z_HOMING." #elif !Z_SENSORLESS #error "SENSORLESS_PROBING requires a TMC stepper driver with StallGuard on Z." #endif diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index 8eb6ab5794..0513de7f7d 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -85,7 +85,7 @@ namespace Language_an { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mover %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index 62b291b7c3..5964652156 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -75,7 +75,7 @@ namespace Language_bg { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Движение по Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("ЕкÑтрудер"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("ЕкÑтрудер *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("ПремеÑти Ñ %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("ПремеÑти Ñ %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("ПремеÑти Ñ 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("ПремеÑти Ñ 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("ПремеÑти Ñ 10mm"); diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index b924e3472d..6709a0ce55 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -85,7 +85,7 @@ namespace Language_ca { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mou Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mou %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mou %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mou 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mou 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mou 10mm"); diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 97bc2a30cc..f102e02188 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -241,7 +241,7 @@ namespace Language_cz { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudér *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Posunout o %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Posunout o %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunout o 0,1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunout o 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunout o 10mm"); diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index ff0751aebf..9258812843 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -75,7 +75,7 @@ namespace Language_da { PROGMEM Language_Str MSG_MOVE_X = _UxGT("Flyt X"); PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Flyt Y"); PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Flyt Z"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Flyt %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Flyt %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Flyt 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Flyt 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Flyt 10mm"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 17dabddb3a..1827fd062d 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -234,7 +234,7 @@ namespace Language_de { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Bewege Extruder"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Bewege Extruder *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend zu kalt"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT(" %s mm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT(" %s mm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT(" 0,1 mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1,0 mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("10,0 mm"); diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index d1dce1b958..ebe27fecbd 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -83,7 +83,7 @@ namespace Language_el { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Μετακίνηση Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("ΕξωθητήÏας"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("ΕξωθητήÏας *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Μετακίνηση %s μμ"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Μετακίνηση %s μμ"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ"); diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index db67540ffb..e6909ad5bf 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -84,7 +84,7 @@ namespace Language_el_gr { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Μετακίνηση Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("ΕξωθητήÏας"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("ΕξωθητήÏας *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Μετακίνηση %s μμ"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Μετακίνηση %s μμ"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index ed9ad954f8..b7d767aa3b 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -257,7 +257,7 @@ namespace Language_en { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend too cold"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Move %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Move %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Move 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Move 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Move 10mm"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 1ec1e3dbda..362d2480c1 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -236,7 +236,7 @@ namespace Language_es { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend muy frio"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mover %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 01ba4b5200..1c1c9e423d 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -139,7 +139,7 @@ namespace Language_eu { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mugitu Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusorea"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Estrusorea *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mugitu %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mugitu %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mugitu 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mugitu 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mugitu 10mm"); diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index 4f10adfc3e..9954f1dd8a 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -72,7 +72,7 @@ namespace Language_fi { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Liikuta Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Liikuta %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Liikuta %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Liikuta 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Liikuta 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Liikuta 10mm"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 3a741a6057..4e58e4005c 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -225,7 +225,7 @@ namespace Language_fr { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudeur"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudeur *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Buse trop froide"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Déplacer %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Déplacer %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Déplacer 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Déplacer 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Déplacer 10mm"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 5b0da33649..b0a42a9f90 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -233,7 +233,7 @@ namespace Language_gl { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Bico moi frío"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mover %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index 0ef2ad6c35..1684ad0e1b 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -79,7 +79,7 @@ namespace Language_hr { PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveliraj bed"); PROGMEM Language_Str MSG_MOVE_X = _UxGT("MiÄi X"); PROGMEM Language_Str MSG_MOVE_Y = _UxGT("MiÄi Y"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("MiÄi %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("MiÄi %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("MiÄi 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("MiÄi 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("MiÄi 10mm"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 94a7ba4858..e07c0f6ac7 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -235,7 +235,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mozgás %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mozgás %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mozgás 10mm"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 6a10afec07..61cb3ec284 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -250,7 +250,7 @@ namespace Language_it { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusore"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Estrusore *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Ugello freddo"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Muovi di %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Muovi di %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Muovi di 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Muovi di 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Muovi di 10mm"); diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index d17d3aaf2d..8431d86d1c 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -94,7 +94,7 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Yジク イドウ"); // "Move Y" PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Zジク イドウ"); // "Move Z" PROGMEM Language_Str MSG_MOVE_E = _UxGT("エクストルーダー"); // "Extruder" - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("%smm イドウ"); // "Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("%smm イドウ"); // "Move 0.025mm" PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("0.1mm イドウ"); // "Move 0.1mm" PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1mm イドウ"); // "Move 1mm" PROGMEM Language_Str MSG_MOVE_10MM = _UxGT(" 10mm イドウ"); // "Move 10mm" diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index c4e0b7f161..82e5c292c6 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -87,7 +87,7 @@ namespace Language_nl { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Verplaats Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Verplaats %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Verplaats %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Verplaats 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Verplaats 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Verplaats 10mm"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 3b6479dfa8..47d7162dee 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -230,7 +230,7 @@ namespace Language_pl { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Ekstruzja (os E)"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Ekstruzja (os E) *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Dysza za zimna"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("PrzesuÅ„ co %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("PrzesuÅ„ co %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("PrzesuÅ„ co .1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("PrzesuÅ„ co 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("PrzesuÅ„ co 10mm"); diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index fb41cb99a5..2dc53993b6 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -81,7 +81,7 @@ namespace Language_pt { PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("Mover Extrusor"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Mover Extrusor *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mover %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 05fc639f83..06226b84ed 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -214,7 +214,7 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Mover Extrusor"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Mover Extrusor *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Extrus. mto fria"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mover %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index c2e50fc698..459cc5ee3d 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -232,7 +232,7 @@ namespace Language_ro { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Capat Prea Rece"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Move %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Move %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Move 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Move 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Move 10mm"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 0be6cb5eb3..85dc58a15a 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -290,7 +290,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_MOVE_E = _UxGT("ЭкÑтрудер"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("ЭкÑтрудер *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Сопло не нагрето"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Движение %sмм"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Движение %sмм"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Движение 0.1мм"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Движение 1мм"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Движение 10мм"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 2e05ee4513..9a1e13e2c8 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -247,7 +247,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudér *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Posunúť o %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Posunúť o %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunúť o 0,1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunúť o 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunúť o 10mm"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 307abf118a..57c814ad48 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -235,7 +235,7 @@ namespace Language_tr { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Ekstruder"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Ekstruder *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Nozul Çok SoÄŸuk"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("%smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("%smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("10mm"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 71b4cd018d..2aa483de50 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -286,7 +286,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_MOVE_E = _UxGT("ЕкÑтрудер"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("ЕкÑтрудер *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Сопло дуже холодне"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Рух по %sмм"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Рух по %sмм"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Рух по 0.1мм"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Рух по 1мм"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Рух по 10мм"); diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 0e1de36b57..a4134969aa 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -230,7 +230,7 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_MOVE_E = _UxGT("挤出机"); //"Extruder" PROGMEM Language_Str MSG_MOVE_EN = _UxGT("挤出机 *"); //"Extruder" PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("热端太冷"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("移动 %s mm"); //"Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("移动 %s mm"); //"Move 0.025mm" PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移动 0.1 mm"); //"Move 0.1mm" PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移动 1 mm"); //"Move 1mm" PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移动 10 mm"); //"Move 10mm" diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 9708bbda9c..4654f770ea 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -228,7 +228,7 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_MOVE_E = _UxGT("擠出機"); //"Extruder" PROGMEM Language_Str MSG_MOVE_EN = _UxGT("擠出機 *"); //"Extruder *" PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("噴嘴溫度ä¸å¤ "); //"Hotend too cold" - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("移動 %s mm"); //"Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("移動 %s mm"); //"Move 0.025mm" PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移動 0.1 mm"); //"Move 0.1mm" PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移動 1 mm"); //"Move 1mm" PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移動 10 mm"); //"Move 10mm" diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 42fdbfceda..627d8565ed 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -143,8 +143,8 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } // "Motion" > "Move Xmm" > "Move XYZ" submenu // -#ifndef SHORT_MANUAL_Z_MOVE - #define SHORT_MANUAL_Z_MOVE 0.025 +#ifndef FINE_MANUAL_MOVE + #define FINE_MANUAL_MOVE 0.025 #endif screenFunc_t _manual_move_func_ptr; @@ -180,22 +180,22 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); }); SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); - if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { + if (axis == Z_AXIS && (FINE_MANUAL_MOVE) > 0.0f && (FINE_MANUAL_MOVE) < 0.1f) { // Determine digits needed right of decimal - constexpr uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - PGM_P const label = GET_TEXT(MSG_MOVE_Z_DIST); + constexpr uint8_t digs = !UNEAR_ZERO((FINE_MANUAL_MOVE) * 1000 - int((FINE_MANUAL_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((FINE_MANUAL_MOVE) * 100 - int((FINE_MANUAL_MOVE) * 100)) ? 3 : 2; + PGM_P const label = GET_TEXT(MSG_MOVE_N_MM); char tmp[strlen_P(label) + 10 + 1], numstr[10]; - sprintf_P(tmp, label, dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + sprintf_P(tmp, label, dtostrf(FINE_MANUAL_MOVE, 1, digs, numstr)); #if DISABLED(HAS_GRAPHICAL_TFT) extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(FINE_MANUAL_MOVE)); }); MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); #else - SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + SUBMENU_P(tmp, []{ _goto_manual_move(float(FINE_MANUAL_MOVE)); }); #endif } } diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index b73945ea09..7804e732ec 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -81,20 +81,20 @@ void probe_offset_wizard_menu() { SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); }); SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move_z( 0.1f); }); - if ((SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { + if ((FINE_MANUAL_MOVE) > 0.0f && (FINE_MANUAL_MOVE) < 0.1f) { char tmp[20], numstr[10]; // Determine digits needed right of decimal - const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + const uint8_t digs = !UNEAR_ZERO((FINE_MANUAL_MOVE) * 1000 - int((FINE_MANUAL_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((FINE_MANUAL_MOVE) * 100 - int((FINE_MANUAL_MOVE) * 100)) ? 3 : 2; + sprintf_P(tmp, GET_TEXT(MSG_MOVE_N_MM), dtostrf(FINE_MANUAL_MOVE, 1, digs, numstr)); #if DISABLED(HAS_GRAPHICAL_TFT) extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); + SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(FINE_MANUAL_MOVE)); }); MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); #else - SUBMENU_P(tmp, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); + SUBMENU_P(tmp, []{ _goto_manual_move_z(float(FINE_MANUAL_MOVE)); }); #endif } From 5617d64119694219b1e54d92f0b02d50e86fbb07 Mon Sep 17 00:00:00 2001 From: Chris Pepper Date: Mon, 14 Dec 2020 22:36:25 +0000 Subject: [PATCH 0720/1370] LPC176x framework update (#20469) --- Marlin/src/HAL/LPC1768/HAL.h | 3 --- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 2 +- platformio.ini | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 9a1852d94d..f2347bf5a7 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -47,9 +47,6 @@ extern "C" volatile uint32_t _millis; #include #include -// i2c uses 8-bit shifted address -#define I2C_ADDRESS(A) uint8_t((A) << 1) - // // Default graphical display delays // diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 21d149fcaf..06e060d93a 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -24,7 +24,7 @@ #if PIO_PLATFORM_VERSION < 1001 #error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically." #endif -#if PIO_FRAMEWORK_VERSION < 2005 +#if PIO_FRAMEWORK_VERSION < 2006 #error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries." #endif diff --git a/platformio.ini b/platformio.ini index e2f1388efd..753140467c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -683,7 +683,7 @@ debug_tool = jlink # [common_LPC] platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.3.zip -platform_packages = framework-arduino-lpc176x@^0.2.5 +platform_packages = framework-arduino-lpc176x@^0.2.6 board = nxp_lpc1768 lib_ldf_mode = off lib_compat_mode = strict From 6599e4ea53eabf6eeb372e19b4960b61341a20b5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 14 Dec 2020 20:34:15 -0600 Subject: [PATCH 0721/1370] Fix formatting --- Marlin/src/lcd/menu/menu_tramming.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index a0dad20e62..e51cd0a318 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -44,7 +44,7 @@ static uint8_t tram_index = 0; bool probe_single_point() { do_blocking_move_to_z(TERN(BLTOUCH, Z_CLEARANCE_DEPLOY_PROBE, Z_CLEARANCE_BETWEEN_PROBES)); - //Stow after each point with BLTouch "HIGH SPEED" mode for push-pin safety + // Stow after each point with BLTouch "HIGH SPEED" mode for push-pin safety const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[tram_index], TERN(BLTOUCH_HS_MODE, PROBE_PT_STOW, PROBE_PT_RAISE), 0, true); DEBUG_ECHOLNPAIR("probe_single_point: ", z_probed_height, "mm"); z_measured[tram_index] = z_probed_height; @@ -82,7 +82,7 @@ void tramming_wizard_menu() { ACTION_ITEM(MSG_BUTTON_DONE, []{ probe.stow(); // Stow before exiting Tramming Wizard ui.goto_previous_screen_no_defer(); - }); + }); END_MENU(); } From 20bd54f6d37ea1c94e8bcf4d4d92bc11eba91401 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 5 Dec 2020 19:56:16 -0600 Subject: [PATCH 0722/1370] Preheat before leveling --- Marlin/Configuration.h | 9 +++++++++ Marlin/src/gcode/bedlevel/abl/G29.cpp | 23 ++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d528a97bf7..f904803cc1 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1289,6 +1289,15 @@ */ //#define RESTORE_LEVELING_AFTER_G28 +/** + * Auto-leveling needs preheating + */ +//#define PREHEAT_BEFORE_LEVELING +#if ENABLED(PREHEAT_BEFORE_LEVELING) + #define LEVELING_NOZZLE_TEMP 120 + #define LEVELING_BED_TEMP 50 +#endif + /** * Enable detailed logging of G28, G29, M48, etc. * Turn on with the command 'M111 S32'. diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 05260955bf..157353c063 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -36,9 +36,12 @@ #include "../../../module/probe.h" #include "../../queue.h" +#if EITHER(PROBE_TEMP_COMPENSATION, PREHEAT_BEFORE_LEVELING) + #include "../../../module/temperature.h" +#endif + #if ENABLED(PROBE_TEMP_COMPENSATION) #include "../../../feature/probe_temp_comp.h" - #include "../../../module/temperature.h" #endif #if HAS_DISPLAY @@ -403,6 +406,24 @@ G29_TYPE GcodeSuite::G29() { if (!faux) remember_feedrate_scaling_off(); + #if ENABLED(PREHEAT_BEFORE_LEVELING) + #ifndef LEVELING_NOZZLE_TEMP + #define LEVELING_NOZZLE_TEMP 0 + #endif + #ifndef LEVELING_BED_TEMP + #define LEVELING_BED_TEMP 0 + #endif + if (!dryrun && !faux) { + constexpr uint16_t hotendPreheat = LEVELING_NOZZLE_TEMP, bedPreheat = LEVELING_BED_TEMP; + if (DEBUGGING(LEVELING)) + DEBUG_ECHOLNPAIR("Preheating hotend (", hotendPreheat, ") and bed (", bedPreheat, ")"); + if (hotendPreheat) thermalManager.setTargetHotend(hotendPreheat, 0); + if (bedPreheat) thermalManager.setTargetBed(bedPreheat); + if (hotendPreheat) thermalManager.wait_for_hotend(0); + if (bedPreheat) thermalManager.wait_for_bed_heating(); + } + #endif + // Disable auto bed leveling during G29. // Be formal so G29 can be done successively without G28. if (!no_action) set_bed_leveling_enabled(false); From e6b3c740690c14110a3277f9540ed5e8257d7c8c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 5 Dec 2020 20:10:13 -0600 Subject: [PATCH 0723/1370] Always enable leveling after G28 --- Marlin/Configuration.h | 6 ++++-- Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/inc/SanityCheck.h | 6 +++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f904803cc1..4b3371226e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1284,10 +1284,12 @@ //#define MESH_BED_LEVELING /** - * Normally G28 leaves leveling disabled on completion. Enable - * this option to have G28 restore the prior leveling state. + * Normally G28 leaves leveling disabled on completion. Enable one of + * these options to restore the prior leveling state or to always enable + * leveling immediately after G28. */ //#define RESTORE_LEVELING_AFTER_G28 +//#define ENABLE_LEVELING_AFTER_G28 /** * Auto-leveling needs preheating diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index f54b2fb7d4..092d8d643a 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -241,7 +241,7 @@ void GcodeSuite::G28() { // Disable the leveling matrix before homing #if HAS_LEVELING - TERN_(RESTORE_LEVELING_AFTER_G28, const bool leveling_was_active = planner.leveling_active); + const bool leveling_restore_state = ENABLED(ENABLE_LEVELING_AFTER_G28) || TERN0(RESTORE_LEVELING_AFTER_G28, planner.leveling_active); TERN_(PROBE_MANUALLY, g29_in_progress = false); // Cancel the active G29 session set_bed_leveling_enabled(false); #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 10a196b958..c75cb1cd41 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1445,7 +1445,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "AUTO_BED_LEVELING_UBL requires EEPROM_SETTINGS." #elif !WITHIN(GRID_MAX_POINTS_X, 3, 15) || !WITHIN(GRID_MAX_POINTS_Y, 3, 15) #error "GRID_MAX_POINTS_[XY] must be a whole number between 3 and 15." - #elif !defined(RESTORE_LEVELING_AFTER_G28) + #elif !defined(RESTORE_LEVELING_AFTER_G28) && !defined(ENABLE_LEVELING_AFTER_G28) #error "AUTO_BED_LEVELING_UBL used to enable RESTORE_LEVELING_AFTER_G28. To keep this behavior enable RESTORE_LEVELING_AFTER_G28. Otherwise define it as 'false'." #endif @@ -1473,6 +1473,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif +#if ALL(HAS_LEVELING, RESTORE_LEVELING_AFTER_G28, ENABLE_LEVELING_AFTER_G28) + #error "Only enable RESTORE_LEVELING_AFTER_G28 or ENABLE_LEVELING_AFTER_G28, but not both." +#endif + #if HAS_MESH && HAS_CLASSIC_JERK static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling."); #endif From 0b0eb6a11929cd64f7bf324b2fec601bb5be2760 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 14 Dec 2020 19:02:46 -0800 Subject: [PATCH 0724/1370] Trust that script -x flags will always be set (#20453) --- Makefile | 4 ---- buildroot/tests/ARMED-tests | 0 buildroot/tests/BIGTREE_BTT002-tests | 0 buildroot/tests/BIGTREE_GTR_V1_0-tests | 0 buildroot/tests/BIGTREE_SKR_PRO-tests | 0 buildroot/tests/FLYF407ZG-tests | 0 buildroot/tests/FYSETC_F6_13-tests | 0 buildroot/tests/FYSETC_S6-tests | 0 buildroot/tests/LERDGEX-tests | 0 buildroot/tests/NUCLEO_F767ZI-tests | 0 buildroot/tests/REMRAM_V1-tests | 0 buildroot/tests/SAMD51_grandcentral_m4-tests | 0 buildroot/tests/STM32F070CB_malyan-tests | 0 buildroot/tests/STM32F070RB_malyan-tests | 0 buildroot/tests/STM32F103CB_malyan-tests | 0 buildroot/tests/STM32F103RC_btt-tests | 0 buildroot/tests/STM32F103RC_btt_USB-tests | 0 buildroot/tests/STM32F103RC_fysetc-tests | 0 buildroot/tests/STM32F103RC_meeb-tests | 0 buildroot/tests/STM32F103RET6_creality-tests | 0 buildroot/tests/STM32F103RE_btt-tests | 0 buildroot/tests/STM32F103RE_btt_USB-tests | 0 buildroot/tests/STM32F401VE_STEVAL-tests | 0 buildroot/tests/at90usb1286_cdc-tests | 0 buildroot/tests/at90usb1286_dfu-tests | 0 buildroot/tests/jgaurora_a5s_a1-tests | 0 buildroot/tests/mega1280-tests | 0 buildroot/tests/mks_robin-tests | 0 buildroot/tests/mks_robin_lite-tests | 0 buildroot/tests/mks_robin_mini-tests | 0 buildroot/tests/mks_robin_nano35-tests | 0 buildroot/tests/mks_robin_nano35_stm32-tests | 0 buildroot/tests/mks_robin_pro-tests | 0 buildroot/tests/mks_robin_stm32-tests | 0 buildroot/tests/rambo-tests | 0 buildroot/tests/rumba32-tests | 0 buildroot/tests/sanguino1284p-tests | 0 buildroot/tests/sanguino644p-tests | 0 buildroot/tests/teensy41-tests | 0 39 files changed, 4 deletions(-) mode change 100644 => 100755 buildroot/tests/ARMED-tests mode change 100644 => 100755 buildroot/tests/BIGTREE_BTT002-tests mode change 100644 => 100755 buildroot/tests/BIGTREE_GTR_V1_0-tests mode change 100644 => 100755 buildroot/tests/BIGTREE_SKR_PRO-tests mode change 100644 => 100755 buildroot/tests/FLYF407ZG-tests mode change 100644 => 100755 buildroot/tests/FYSETC_F6_13-tests mode change 100644 => 100755 buildroot/tests/FYSETC_S6-tests mode change 100644 => 100755 buildroot/tests/LERDGEX-tests mode change 100644 => 100755 buildroot/tests/NUCLEO_F767ZI-tests mode change 100644 => 100755 buildroot/tests/REMRAM_V1-tests mode change 100644 => 100755 buildroot/tests/SAMD51_grandcentral_m4-tests mode change 100644 => 100755 buildroot/tests/STM32F070CB_malyan-tests mode change 100644 => 100755 buildroot/tests/STM32F070RB_malyan-tests mode change 100644 => 100755 buildroot/tests/STM32F103CB_malyan-tests mode change 100644 => 100755 buildroot/tests/STM32F103RC_btt-tests mode change 100644 => 100755 buildroot/tests/STM32F103RC_btt_USB-tests mode change 100644 => 100755 buildroot/tests/STM32F103RC_fysetc-tests mode change 100644 => 100755 buildroot/tests/STM32F103RC_meeb-tests mode change 100644 => 100755 buildroot/tests/STM32F103RET6_creality-tests mode change 100644 => 100755 buildroot/tests/STM32F103RE_btt-tests mode change 100644 => 100755 buildroot/tests/STM32F103RE_btt_USB-tests mode change 100644 => 100755 buildroot/tests/STM32F401VE_STEVAL-tests mode change 100644 => 100755 buildroot/tests/at90usb1286_cdc-tests mode change 100644 => 100755 buildroot/tests/at90usb1286_dfu-tests mode change 100644 => 100755 buildroot/tests/jgaurora_a5s_a1-tests mode change 100644 => 100755 buildroot/tests/mega1280-tests mode change 100644 => 100755 buildroot/tests/mks_robin-tests mode change 100644 => 100755 buildroot/tests/mks_robin_lite-tests mode change 100644 => 100755 buildroot/tests/mks_robin_mini-tests mode change 100644 => 100755 buildroot/tests/mks_robin_nano35-tests mode change 100644 => 100755 buildroot/tests/mks_robin_nano35_stm32-tests mode change 100644 => 100755 buildroot/tests/mks_robin_pro-tests mode change 100644 => 100755 buildroot/tests/mks_robin_stm32-tests mode change 100644 => 100755 buildroot/tests/rambo-tests mode change 100644 => 100755 buildroot/tests/rumba32-tests mode change 100644 => 100755 buildroot/tests/sanguino1284p-tests mode change 100644 => 100755 buildroot/tests/sanguino644p-tests mode change 100644 => 100755 buildroot/tests/teensy41-tests diff --git a/Makefile b/Makefile index 8e1c77aa99..ebcdf25e2d 100644 --- a/Makefile +++ b/Makefile @@ -27,8 +27,6 @@ tests-single-ci: tests-single-local: @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET= or use make tests-all-local" ; return 1; fi - chmod +x buildroot/bin/* - chmod +x buildroot/tests/* export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \ && export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \ && run_tests . $(TEST_TARGET) "$(ONLY_TEST)" @@ -40,8 +38,6 @@ tests-single-local-docker: .PHONY: tests-single-local-docker tests-all-local: - chmod +x buildroot/bin/* - chmod +x buildroot/tests/* export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \ && export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \ && for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done diff --git a/buildroot/tests/ARMED-tests b/buildroot/tests/ARMED-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/FYSETC_F6_13-tests b/buildroot/tests/FYSETC_F6_13-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/NUCLEO_F767ZI-tests b/buildroot/tests/NUCLEO_F767ZI-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/REMRAM_V1-tests b/buildroot/tests/REMRAM_V1-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F070RB_malyan-tests b/buildroot/tests/STM32F070RB_malyan-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F103CB_malyan-tests b/buildroot/tests/STM32F103CB_malyan-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F103RC_fysetc-tests b/buildroot/tests/STM32F103RC_fysetc-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/at90usb1286_cdc-tests b/buildroot/tests/at90usb1286_cdc-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/at90usb1286_dfu-tests b/buildroot/tests/at90usb1286_dfu-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/jgaurora_a5s_a1-tests b/buildroot/tests/jgaurora_a5s_a1-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/mks_robin_nano35_stm32-tests b/buildroot/tests/mks_robin_nano35_stm32-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/mks_robin_stm32-tests b/buildroot/tests/mks_robin_stm32-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/rumba32-tests b/buildroot/tests/rumba32-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/sanguino644p-tests b/buildroot/tests/sanguino644p-tests old mode 100644 new mode 100755 diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests old mode 100644 new mode 100755 From a59164d5c833a6b6c4a4028c1500bc18363a3cc3 Mon Sep 17 00:00:00 2001 From: kisslorand <50251547+kisslorand@users.noreply.github.com> Date: Tue, 15 Dec 2020 05:04:45 +0200 Subject: [PATCH 0725/1370] Fix M1001 auto-check logic (#20456) --- Marlin/src/gcode/sd/M1001.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 406cd074c3..8e24b60493 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -65,7 +65,7 @@ */ void GcodeSuite::M1001() { // If there's another auto#.g file to run... - if (TERN(NO_SD_AUTOSTART, false, card.autofile_check())) return; + if (TERN(NO_SD_AUTOSTART, false, !card.autofile_check())) return; // Purge the recovery file... TERN_(POWER_LOSS_RECOVERY, recovery.purge()); From e188b3e28c009d0583453dedadbf4863288ec27a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 14 Dec 2020 21:06:56 -0600 Subject: [PATCH 0726/1370] Auto-check followup --- Marlin/src/gcode/sd/M1001.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 8e24b60493..406cd074c3 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -65,7 +65,7 @@ */ void GcodeSuite::M1001() { // If there's another auto#.g file to run... - if (TERN(NO_SD_AUTOSTART, false, !card.autofile_check())) return; + if (TERN(NO_SD_AUTOSTART, false, card.autofile_check())) return; // Purge the recovery file... TERN_(POWER_LOSS_RECOVERY, recovery.purge()); diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index fe8bc4879a..88b42f836d 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -755,10 +755,10 @@ void CardReader::write_command(char * const buf) { * - After finishing the previous auto#.g file * - From the LCD command to begin the auto#.g files * - * Return 'true' if there was nothing to do + * Return 'true' if an auto file was started */ bool CardReader::autofile_check() { - if (!autofile_index) return true; + if (!autofile_index) return false; if (!isMounted()) mount(); @@ -773,11 +773,11 @@ void CardReader::write_command(char * const buf) { cdroot(); openAndPrintFile(autoname); autofile_index++; - return false; + return true; } } autofile_cancel(); - return true; + return false; } #endif From 46d2dc9beee8f9e16c1db1725dd32c2bd9c0657a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 14 Dec 2020 21:27:05 -0600 Subject: [PATCH 0727/1370] Please install the EditorConfig plugin --- Marlin/Configuration.h | 4 ++-- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 4b3371226e..8b29a4ba80 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -957,14 +957,14 @@ * X and Y offset * Use a caliper or ruler to measure the distance from the tip of * the Nozzle to the center-point of the Probe in the X and Y axes. - * + * * Z offset * - For the Z offset use your best known value and adjust at runtime. * - Common probes trigger below the nozzle and have negative values for Z offset. * - Probes triggering above the nozzle height are uncommon but do exist. When using * probes such as this, carefully set Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES * to avoid collisions during probing. - * + * * Tune and Adjust * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. * - PROBE_OFFSET_WIZARD (configuration_adv.h) can be used for setting the Z offset. diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 69371f0f73..8b5b8562a2 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -60,7 +60,7 @@ // #ifndef HAS_PIN_27_BOARD #define SERVO0_PIN PB0 // BLTouch OUT -#else +#else #define SERVO0_PIN PC6 #endif From 878305671b78271acd5b1c8365a486b7d94942a9 Mon Sep 17 00:00:00 2001 From: JoAnn Manges Date: Tue, 15 Dec 2020 01:16:50 -0500 Subject: [PATCH 0728/1370] Fix RESTORE_LEVELING_AFTER_G28 (#20471) --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 092d8d643a..23c4d56d93 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -435,7 +435,7 @@ void GcodeSuite::G28() { do_blocking_move_to_z(delta_clip_start_height); #endif - TERN_(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_was_active)); + TERN_(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_restore_state)); restore_feedrate_and_scaling(); From 3d7680a42649d393e99257dadb39f9deae65b01e Mon Sep 17 00:00:00 2001 From: Sebastiaan Dammann Date: Mon, 14 Dec 2020 21:29:59 +0100 Subject: [PATCH 0729/1370] Creality v4.5.3 (CR-6 SE, CR-6 MAX) (#20468) --- Marlin/src/core/boards.h | 9 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_CREALITY_V452.h | 90 +-------------- Marlin/src/pins/stm32f1/pins_CREALITY_V453.h | 38 +++++++ Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h | 113 +++++++++++++++++++ 5 files changed, 162 insertions(+), 90 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V453.h create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 7f0a99dca3..172cdd6b5a 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -330,10 +330,11 @@ #define BOARD_CREALITY_V4 4037 // Creality v4.x (STM32F103RE) #define BOARD_CREALITY_V427 4038 // Creality v4.2.7 (STM32F103RE) #define BOARD_CREALITY_V452 4039 // Creality v4.5.2 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4040 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4041 // FLY MINI (STM32F103RCT6) -#define BOARD_FLSUN_HISPEED 4042 // FLSUN HiSpeedV1 (STM32F103VET6) -#define BOARD_BEAST 4043 // STM32F103RET6 Libmaple-based controller +#define BOARD_CREALITY_V453 4040 // Creality v4.5.3 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4041 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4042 // FLY MINI (STM32F103RCT6) +#define BOARD_FLSUN_HISPEED 4043 // FLSUN HiSpeedV1 (STM32F103VET6) +#define BOARD_BEAST 4044 // STM32F103RET6 Libmaple-based controller // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index c9f6f7b3b3..52e6d26b14 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -532,6 +532,8 @@ #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality #elif MB(CREALITY_V452) #include "stm32f1/pins_CREALITY_V452.h" // STM32F1 env:STM32F103RET6_creality +#elif MB(CREALITY_V453) + #include "stm32f1/pins_CREALITY_V453.h" // STM32F1 env:STM32F103RET6_creality #elif MB(TRIGORILLA_PRO) #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro #elif MB(FLY_MINI) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h index f65e1d5474..35eea1da78 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h @@ -24,97 +24,15 @@ * Creality v4.5.2 (STM32F103RET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "CREALITY_V452 supports up to 1 hotends / E-steppers. Comment out this line to continue." +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "Creality v4.5.2 only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_NAME "Creality v4.5.2" -#define DEFAULT_MACHINE_NAME "Creality3D" -// -// Release PB4 (Z_STEP_PIN) from JTAG NRST role -// -#define DISABLE_DEBUG - -#define BOARD_NO_NATIVE_USB - -// -// EEPROM -// -#if NO_EEPROM_SELECTED - #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 - //#define SDCARD_EEPROM_EMULATION -#endif - -#if ENABLED(IIC_BL24CXX_EEPROM) - #define IIC_EEPROM_SDA PA11 - #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) -#elif ENABLED(SDCARD_EEPROM_EMULATION) - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb -#endif - -// -// Limit Switches -// -#define X_STOP_PIN PC4 -#define Y_STOP_PIN PC5 -#define Z_STOP_PIN PA4 - -#define FIL_RUNOUT_PIN PA7 - -// -// Probe -// -#define PROBE_TARE_PIN PA5 -#define PROBE_ENABLE_PIN PC6 // Optoswitch to Enable Z Probe - -// -// Steppers -// -#define X_ENABLE_PIN PC3 -#define X_STEP_PIN PB8 -#define X_DIR_PIN PB7 - -#define Y_ENABLE_PIN PC3 -#define Y_STEP_PIN PB6 -#define Y_DIR_PIN PB5 - -#define Z_ENABLE_PIN PC3 -#define Z_STEP_PIN PB4 -#define Z_DIR_PIN PB3 - -#define E0_ENABLE_PIN PC3 -#define E0_STEP_PIN PC2 -#define E0_DIR_PIN PB9 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PB1 // TH1 -#define TEMP_BED_PIN PB0 // TB1 - -// -// Heaters / Fans -// #define HEATER_0_PIN PA1 // HEATER1 #define HEATER_BED_PIN PA2 // HOT BED - #define FAN_PIN PA0 // FAN -#define FAN_SOFT_PWM +#define PROBE_ENABLE_PIN PC6 // Optoswitch to Enable Z Probe -// -// SD Card -// -#define SD_DETECT_PIN PC7 -#define NO_SD_HOST_DRIVE // SD is only seen by the printer - -#define SDIO_SUPPORT // Extra added by Creality -#define SDIO_CLOCK 6000000 // In original source code overridden by Creality in sdio.h - -// -// Misc. Functions -// -#define CASE_LIGHT_PIN PA6 +#include "pins_CREALITY_V45x.h" diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h new file mode 100644 index 0000000000..836e5a91f1 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Creality v4.5.3 (STM32F103RET6) board pin assignments + */ + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "Creality v4.5.3 only supports one hotend / E-stepper. Comment out this line to continue." +#endif + +#define BOARD_NAME "Creality v4.5.3" + +#define HEATER_0_PIN PB14 // HEATER1 +#define HEATER_BED_PIN PB13 // HOT BED +#define FAN_PIN PB15 // FAN +#define PROBE_ENABLE_PIN PB2 // Optoswitch to Enable Z Probe + +#include "pins_CREALITY_V45x.h" diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h new file mode 100644 index 0000000000..f2be289530 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Creality v4.5.2 and v4.5.3 (STM32F103RET6) board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define DEFAULT_MACHINE_NAME "Creality3D" + +// +// Release PB4 (Z_STEP_PIN) from JTAG NRST role +// +#define DISABLE_DEBUG + +#define BOARD_NO_NATIVE_USB + +// +// EEPROM +// +#if NO_EEPROM_SELECTED + #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 + //#define SDCARD_EEPROM_EMULATION +#endif + +#if ENABLED(IIC_BL24CXX_EEPROM) + #define IIC_EEPROM_SDA PA11 + #define IIC_EEPROM_SCL PA12 + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) +#elif ENABLED(SDCARD_EEPROM_EMULATION) + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb +#endif + +// +// Limit Switches +// +#define X_STOP_PIN PC4 +#define Y_STOP_PIN PC5 +#define Z_STOP_PIN PA4 + +#define FIL_RUNOUT_PIN PA7 + +// +// Probe +// +#define PROBE_TARE_PIN PA5 + +// +// Steppers +// +#define X_ENABLE_PIN PC3 +#define X_STEP_PIN PB8 +#define X_DIR_PIN PB7 + +#define Y_ENABLE_PIN PC3 +#define Y_STEP_PIN PB6 +#define Y_DIR_PIN PB5 + +#define Z_ENABLE_PIN PC3 +#define Z_STEP_PIN PB4 +#define Z_DIR_PIN PB3 + +#define E0_ENABLE_PIN PC3 +#define E0_STEP_PIN PC2 +#define E0_DIR_PIN PB9 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PB1 // TH1 +#define TEMP_BED_PIN PB0 // TB1 + +// +// Heaters / Fans +// + +#define FAN_SOFT_PWM + +// +// SD Card +// +#define SD_DETECT_PIN PC7 +#define NO_SD_HOST_DRIVE // SD is only seen by the printer + +#define SDIO_SUPPORT // Extra added by Creality +#define SDIO_CLOCK 6000000 // In original source code overridden by Creality in sdio.h + +// +// Misc. Functions +// +#define CASE_LIGHT_PIN PA6 From f82b3f0f51b3e5f2633b0c964daf8cf24e29e44b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 15 Dec 2020 00:44:00 -0600 Subject: [PATCH 0730/1370] Update some pins errors --- Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h | 2 +- Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 2 +- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 2 +- Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 4 ++-- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 2 +- Marlin/src/pins/stm32f7/pins_REMRAM_V1.h | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h index 3bcaae96a3..6fcb7b94e0 100644 --- a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h @@ -28,7 +28,7 @@ #if NOT_TARGET(__AVR_ATmega2560__) #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "Longer3D LGT KIT V1.0 board only supports 1 hotend / E-stepper. Comment out this line to continue." + #error "Longer3D LGT KIT V1.0 board only supports one hotend / E-stepper. Comment out this line to continue." #endif #if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 diff --git a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h index 513c7fe8d5..d9964242dd 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h @@ -22,7 +22,7 @@ #pragma once #if HOTENDS > 1 || E_STEPPERS > 1 - #error "Ender-4 supports only 1 hotend / E-stepper. Comment out this line to continue." + #error "Ender-4 only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "Ender-4" diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index 0e94249a99..a255160829 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -24,7 +24,7 @@ #if NOT_TARGET(TARGET_STM32F1) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "CCROBOT-ONLINE MEEB_3DP only supports 1 hotend / E-stepper. Comment out this line to continue." + #error "CCROBOT-ONLINE MEEB_3DP only supports one hotend / E-stepper. Comment out this line to continue." #endif // https://github.com/ccrobot-online/MEEB_3DP diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index 7541f82729..c20af310cc 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -32,7 +32,7 @@ #if NOT_TARGET(__STM32F1__, STM32F1xx) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "FLSUN HiSpeedV1 supports 1 hotend / E-stepper. Comment out this line to continue." + #error "FLSUN HiSpeedV1 only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "FLSun HiSpeedV1" diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index f86acf1f24..4f02b0e23c 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -31,10 +31,10 @@ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "JGAurora 32-bit board only supports 1 hotend / E-stepper. Comment out this line to continue." + #error "JGAurora A5S A1 only supports one hotend / E-stepper. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "JGAurora A5S A1 board" +#define BOARD_INFO_NAME "JGAurora A5S A1" #define BOARD_NO_NATIVE_USB diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index fd5c573878..33f995dcae 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -25,7 +25,7 @@ #if NOT_TARGET(__STM32F1__, STM32F1xx) #error "Oops! Select a STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "Longer3D board only supports 1 hotend / E-stepper. Comment out this line to continue." + #error "Longer3D only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "Longer3D" diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index d7c4aebe37..1ad18a6497 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -24,7 +24,7 @@ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin Lite supports only 1 hotend / E-stepper. Comment out this line to continue." + #error "MKS Robin Lite only supports one hotend / E-stepper. Comment out this line to continue." #endif #ifndef BOARD_INFO_NAME diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index ae68357589..e6a1e92999 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -28,7 +28,7 @@ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin mini only supports 1 hotend / E-stepper. Comment out this line to continue." + #error "MKS Robin mini only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "MKS Robin Mini" diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 660ba29e97..af2ebce9ed 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -24,7 +24,7 @@ #if NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "BIGTREE BTT002 V1.0 only supports one hotend / E-stepper." + #error "BIGTREE BTT002 V1.0 only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "BTT BTT002 V1.0" diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 075aec6e9b..6e0b3e14a7 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -21,7 +21,7 @@ #if NOT_TARGET(STM32F4, STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "LERDGE X only supports one hotend / E-steppers" + #error "LERDGE X only supports one hotend / E-stepper. Comment out this line to continue." #endif #define BOARD_INFO_NAME "Lerdge X" diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h index f07cf824d2..133dcd2935 100644 --- a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h +++ b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h @@ -33,7 +33,7 @@ #endif #if HOTENDS > 1 || E_STEPPERS > 1 - #error "RemRam only supports one hotend / E-stepper." + #error "RemRam only supports one hotend / E-stepper. Comment out this line to continue." #endif // From be7aab204feced145e915022ab94ac9d35220668 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 15 Dec 2020 01:00:28 -0600 Subject: [PATCH 0731/1370] Update some LCD includes --- Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h | 2 ++ Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h | 2 ++ Marlin/src/libs/buzzer.h | 1 + 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp index ed26cac3c5..536640ec95 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp @@ -26,7 +26,7 @@ #if ENABLED(DGUS_LCD_UI_HIPRECY) -#include "../DGUSDisplayDef.h" +#include "DGUSDisplayDef.h" #include "../DGUSDisplay.h" #include "../DGUSScreenHandler.h" diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h index 3ff5e06dc1..d18989a48b 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h @@ -21,6 +21,8 @@ */ #pragma once +#include "../DGUSDisplayDef.h" + enum DGUSLCD_Screens : uint8_t { DGUSLCD_SCREEN_BOOT = 160, DGUSLCD_SCREEN_MAIN = 1, diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index 46e542a959..28e66e5d7c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -26,7 +26,7 @@ #if ENABLED(DGUS_LCD_UI_ORIGIN) -#include "../DGUSDisplayDef.h" +#include "DGUSDisplayDef.h" #include "../DGUSDisplay.h" #include "../DGUSScreenHandler.h" diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h index 451c11adba..5c5a315de6 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h @@ -21,6 +21,8 @@ */ #pragma once +#include "../DGUSDisplayDef.h" + enum DGUSLCD_Screens : uint8_t { DGUSLCD_SCREEN_BOOT = 0, DGUSLCD_SCREEN_MAIN = 10, diff --git a/Marlin/src/libs/buzzer.h b/Marlin/src/libs/buzzer.h index e901660c87..b86fe998fa 100644 --- a/Marlin/src/libs/buzzer.h +++ b/Marlin/src/libs/buzzer.h @@ -118,6 +118,7 @@ #elif HAS_BUZZER // Buzz indirectly via the MarlinUI instance + #include "../lcd/marlinui.h" #define BUZZ(d,f) ui.buzz(d,f) #else From 82b6044dbb643fdb5be7d75bffab02284e7ab03b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 15 Dec 2020 00:53:53 -0600 Subject: [PATCH 0732/1370] Trust STM32 gcc versions --- Marlin/src/HAL/STM32/HAL.h | 10 +++------- Marlin/src/HAL/STM32F1/HAL.h | 10 +++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 9842cdaae4..f2fb5ddb6a 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -143,19 +143,15 @@ void _delay_ms(const int delay); extern "C" char* _sbrk(int incr); -#if GCC_VERSION <= 50000 - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wunused-function" -#endif +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" static inline int freeMemory() { volatile char top; return &top - reinterpret_cast(_sbrk(0)); } -#if GCC_VERSION <= 50000 - #pragma GCC diagnostic pop -#endif +#pragma GCC diagnostic pop // // ADC diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 2c852f22e1..7163db43a2 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -191,10 +191,8 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader void _delay_ms(const int delay); -#if GCC_VERSION <= 50000 - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wunused-function" -#endif +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" /* extern "C" { @@ -209,9 +207,7 @@ static inline int freeMemory() { return &top - _sbrk(0); } -#if GCC_VERSION <= 50000 - #pragma GCC diagnostic pop -#endif +#pragma GCC diagnostic pop // // ADC From fa9463528db87652e1b9865bdf03d56eaa551d93 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 16 Dec 2020 07:35:13 +0100 Subject: [PATCH 0733/1370] Update Italian language (#20480) --- Marlin/src/lcd/language/language_it.h | 40 ++++++++++++++++++++------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 61cb3ec284..ffc6d31a9a 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -71,7 +71,6 @@ namespace Language_it { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home asse Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home asse Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Tramming assistito"); PROGMEM Language_Str MSG_ITERATION = _UxGT("Iterazione G34: %i"); PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Precis.in calo!"); PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Precis.raggiunta"); @@ -83,6 +82,10 @@ namespace Language_it { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Imp. offset home"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset applicato"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Imposta Origine"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Tramming assistito"); + PROGMEM Language_Str MSG_TRAMMING_WIZARD = _UxGT("Wizard Tramming"); + PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Selez. origine"); + PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Ultimo valore "); #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preriscalda ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preriscalda ") PREHEAT_1_LABEL " ~"; @@ -120,6 +123,8 @@ namespace Language_it { PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Livella piano"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Livella piano"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Livella spigoli"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Sollevare il letto finché la sonda non viene attivata"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Tutti gli angoli entro tolleranza. Livella il piano"); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Prossimo spigolo"); PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mesh"); PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifica Mesh"); @@ -129,7 +134,6 @@ namespace Language_it { PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valore di Z"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandi personaliz."); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz."); PROGMEM Language_Str MSG_M48_TEST = _UxGT("Test sonda M48"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("Punto M48"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti"); @@ -140,12 +144,14 @@ namespace Language_it { PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicazione"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia speculare"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pieno controllo"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("X-Gap-X duplicato"); PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2° ugello X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2° ugello Y"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2° ugello Z"); PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 in corso"); PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Strumenti UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Livel.letto unificato"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz."); PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Mesh Manuale"); PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Metti spes. e misura"); PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Misura"); @@ -254,6 +260,9 @@ namespace Language_it { PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Muovi di 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Muovi di 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Muovi di 10mm"); + PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Muovi di 0.001in"); + PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Muovi di 0.01in"); + PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Muovi di 0.1in"); PROGMEM Language_Str MSG_SPEED = _UxGT("Velocità"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Piatto Z"); PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ugello"); @@ -372,6 +381,7 @@ namespace Language_it { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Fatto"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Indietro"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Procedi"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("Salta"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Messa in pausa..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausa stampa"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Riprendi stampa"); @@ -554,14 +564,14 @@ namespace Language_it { PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Agg.firmware MMU!"); PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU chiede attenz."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Riprendi stampa"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Ripresa..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Carica filamento"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Carica tutto"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("MMU riprendi"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("MMU ripresa..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU carica"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("MMU carica tutto"); PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Carica fino ugello"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Espelli filamento"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Espelli filam.~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Scarica filamento"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU espelli"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU espelli ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU scarica"); PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Caric.fil. %i..."); PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Esplus.filam. ..."); PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Scaric.filam. ..."); @@ -662,5 +672,15 @@ namespace Language_it { PROGMEM Language_Str MSG_REHEATING = _UxGT("Riscaldando..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Proc.guid.sonda Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Tasteggio rif.Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Movim.a pos.tasteg."); + PROGMEM Language_Str MSG_SOUND = _UxGT("Suono"); + + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Alto Sinistra"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Basso Sinistra"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Alto Destra"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Basso Destra"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibrazione completata"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibrazion fallita"); } From a45603a344ad47418c0efd0aa2a035d29ca8c254 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 16 Dec 2020 00:41:55 -0600 Subject: [PATCH 0734/1370] Update Hungarian language Co-Authored-By: Zs.Antal <45710979+AntoszHUN@users.noreply.github.com> --- Marlin/src/lcd/language/language_hu.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index e07c0f6ac7..acd27c96aa 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -375,8 +375,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Visszavonás V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S Vi.vo V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVisszah."); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás Távolság"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Csere"); @@ -422,11 +422,11 @@ namespace Language_hu { PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Teszt"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Eltolás Teszt"); PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés"); PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Használ"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Használ"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Elhelyezés"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Szonda Használ"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Szonda Elhelyezés"); PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s Kell"); PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda Eltolások"); PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Szonda X Eltolás"); @@ -439,9 +439,9 @@ namespace Language_hu { PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Végállás megszakítva!"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fütés hiba!"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hiba: SZÃœKSÉGTELEN HÖFOK"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÃœTÉS KIMARADÃS"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÃGY FÃœTÉS KIMARADÃS"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÃœTÉS KIMARADÃS"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÃœTÉSKIMARADÃS"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÃGY FÃœTÉSKIMARADÃS"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÃœTÉSKIMARADÃS"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX Höfok"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN Höfok"); PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEFAGYOTT"); @@ -585,7 +585,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Várj a", "szál betöltésére")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Várj a", "szál tisztításra")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kattints a készre", "szál tiszta")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd foltyat...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd folytat...")); #else PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Katt a folytatáshoz")); PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); From 1b6db623a76fd16a8e2d48c2a8128e4dfb988b11 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Wed, 16 Dec 2020 07:46:10 +0100 Subject: [PATCH 0735/1370] Update French language (#20472) --- Marlin/src/lcd/language/language_fr.h | 35 +++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 4e58e4005c..031db358bd 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -69,6 +69,10 @@ namespace Language_fr { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Régl. décal origine"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Décalages appliqués"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Régler origine"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assistant Molettes"); + PROGMEM Language_Str MSG_TRAMMING_WIZARD = _UxGT("Assistant Molettes"); + PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Molette du lit"); // Not a selection of the origin + PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Ecart origine "); #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Préchauffage ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Préchauffage ") PREHEAT_1_LABEL " ~"; @@ -99,6 +103,8 @@ namespace Language_fr { PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Régler Niv. lit"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveau du lit"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Niveau des coins"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Relever le coin jusqu'à la sonde"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Coins dans la tolérance. Niveau lit "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Coin suivant"); PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Modif. maille"); // 13 car. max PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifier grille"); @@ -313,6 +319,7 @@ namespace Language_fr { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Terminé"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Retour"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Procéder"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("Passer"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Mise en pause..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause impression"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Reprendre impr."); @@ -571,12 +578,26 @@ namespace Language_fr { PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Lissage"); - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Haut à Gauche"); - PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Bas à Gauche"); - PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Haut à Droite"); - PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Bas à Droite"); - PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibration Terminée"); - PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Échec de l'étalonnage"); + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Niveau axe X"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Etalon. auto."); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("En protection, temp. réduite. Ok pour rechauffer et continuer."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("En protection"); #endif + PROGMEM Language_Str MSG_REHEAT = _UxGT("Chauffer"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Réchauffe..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Assistant Sonde Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Mesure référence"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Dépl. vers pos"); + + PROGMEM Language_Str MSG_SOUND = _UxGT("Sons"); + + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Coin haut gauche"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Coin bas gauche"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Coin haut droit"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Coin bas droit"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibration terminée"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Échec de l'étalonnage"); } From bee6b8af8fedb1e406e095fafdb848b182d94d32 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 16 Dec 2020 22:18:40 -0600 Subject: [PATCH 0736/1370] Use homing_feedrate function --- Marlin/src/core/types.h | 1 - Marlin/src/feature/encoder_i2c.cpp | 4 ++-- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/gcode/calibrate/G34.cpp | 2 +- Marlin/src/gcode/feature/pause/G61.cpp | 11 +++++++---- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 6 +++--- .../src/lcd/extui/lib/mks_ui/draw_filament_change.cpp | 2 -- Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp | 2 -- Marlin/src/lcd/menu/menu_probe_offset.cpp | 2 +- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/motion.h | 6 +++++- Marlin/src/module/planner.h | 2 +- Marlin/src/module/probe.cpp | 11 +++-------- 13 files changed, 25 insertions(+), 28 deletions(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index a5b78caabb..20519e1888 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -75,7 +75,6 @@ typedef float feedRate_t; // Conversion macros #define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) #define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) -#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage) // // Coordinates structures for XY, XYZ, XYZE... diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index 8a3e959e07..028e3abe54 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -332,7 +332,7 @@ bool I2CPositionEncoder::test_axis() { const float startPosition = soft_endstop.min[encoderAxis] + 10, endPosition = soft_endstop.max[encoderAxis] - 10; - const feedRate_t fr_mm_s = FLOOR(MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY)); + const feedRate_t fr_mm_s = FLOOR(homing_feedrate(encoderAxis)); ec = false; @@ -382,7 +382,7 @@ void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { int32_t startCount, stopCount; - const feedRate_t fr_mm_s = MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY); + const feedRate_t fr_mm_s = homing_feedrate(encoderAxis); bool oldec = ec; ec = false; diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index c55b278a72..c679e6b68f 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -180,7 +180,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ // Machine state info.current_position = current_position; - info.feedrate = uint16_t(feedrate_mm_s * 60.0f); + info.feedrate = uint16_t(MMS_TO_MMM(feedrate_mm_s)); info.zraise = zraise; TERN_(GCODE_REPEAT_MARKERS, info.stored_repeat = repeat); diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index 85e843c2c8..a96eac0a88 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -63,7 +63,7 @@ void GcodeSuite::G34() { // Move Z to pounce position if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting Z Pounce"); - do_blocking_move_to_z(zpounce, MMM_TO_MMS(HOMING_FEEDRATE_Z)); + do_blocking_move_to_z(zpounce, homing_feedrate(Z_AXIS)); // Store current motor settings, then apply reduced value diff --git a/Marlin/src/gcode/feature/pause/G61.cpp b/Marlin/src/gcode/feature/pause/G61.cpp index d8049f02bc..5d89af0ab8 100644 --- a/Marlin/src/gcode/feature/pause/G61.cpp +++ b/Marlin/src/gcode/feature/pause/G61.cpp @@ -49,10 +49,6 @@ void GcodeSuite::G61(void) { // No saved position? No axes being restored? if (!TEST(saved_slots[slot >> 3], slot & 0x07) || !parser.seen("XYZ")) return; - // Apply any given feedrate over 0.0 - const float fr = parser.linearval('F'); - if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr); - SERIAL_ECHOPAIR(STR_RESTORING_POS " S", int(slot)); LOOP_XYZ(i) { destination[i] = parser.seen(XYZ_CHAR(i)) @@ -63,8 +59,15 @@ void GcodeSuite::G61(void) { } SERIAL_EOL(); + // Apply any given feedrate over 0.0 + feedRate_t saved_feedrate = feedrate_mm_s; + const float fr = parser.linearval('F'); + if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr); + // Move to the saved position prepare_line_to_destination(); + + feedrate_mm_s = saved_feedrate; } #endif // SAVED_POSITIONS diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index db44782fde..38e41ba11e 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1166,7 +1166,7 @@ void HMI_Move_X() { if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); - planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_XY), active_extruder); + planner.buffer_line(current_position, homing_feedrate(X_AXIS), active_extruder); } DWIN_UpdateLCD(); return; @@ -1189,7 +1189,7 @@ void HMI_Move_Y() { if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); - planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_XY), active_extruder); + planner.buffer_line(current_position, homing_feedrate(Y_AXIS), active_extruder); } DWIN_UpdateLCD(); return; @@ -1212,7 +1212,7 @@ void HMI_Move_Z() { if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); - planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_Z), active_extruder); + planner.buffer_line(current_position, homing_feedrate(Z_AXIS), active_extruder); } DWIN_UpdateLCD(); return; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 1db11a20e6..4ab60321b6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -45,8 +45,6 @@ enum { ID_FILAMNT_RETURN }; -extern feedRate_t feedrate_mm_s; - static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index 518ddbd251..ec68c27212 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -53,8 +53,6 @@ enum { static lv_obj_t *label_PowerOff; static lv_obj_t *buttonPowerOff; -extern feedRate_t feedrate_mm_s; - static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 7804e732ec..5b88c8e805 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -146,7 +146,7 @@ void prepare_for_probe_offset_wizard() { // Move Nozzle to Probing/Homing Position ui.wait_for_move = true; current_position += probe.offset_xy; - line_to_current_position(MMM_TO_MMS(HOMING_FEEDRATE_XY)); + line_to_current_position(MMM_TO_MMS(XY_PROBE_SPEED)); ui.synchronize(GET_TEXT(MSG_PROBE_WIZARD_MOVING)); ui.wait_for_move = false; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 7b4c89e759..28bf16a310 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -510,7 +510,7 @@ void do_z_clearance(const float &zclear, const bool z_trusted/*=true*/, const bo const bool rel = raise_on_untrusted && !z_trusted; float zdest = zclear + (rel ? current_position.z : 0.0f); if (!lower_allowed) NOLESS(zdest, current_position.z); - do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), MMM_TO_MMS(TERN(HAS_BED_PROBE, Z_PROBE_SPEED_FAST, HOMING_FEEDRATE_Z))); + do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), TERN(HAS_BED_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST), homing_feedrate(Z_AXIS))); } // diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index efbfd7de4d..2eb54f36fb 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -73,12 +73,16 @@ extern const feedRate_t homing_feedrate_mm_s[XYZ]; FORCE_INLINE feedRate_t homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); } feedRate_t get_homing_bump_feedrate(const AxisEnum axis); +/** + * The default feedrate for many moves, set by the most recent move + */ extern feedRate_t feedrate_mm_s; /** - * Feedrate scaling + * Feedrate scaling is applied to all G0/G1, G2/G3, and G5 moves */ extern int16_t feedrate_percentage; +#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage) // The active extruder (tool). Set with T command. #if HAS_MULTI_EXTRUDER diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index ac30938f2a..5050f060b0 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -978,6 +978,6 @@ class Planner { #endif // !CLASSIC_JERK }; -#define PLANNER_XY_FEEDRATE() (_MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS])) +#define PLANNER_XY_FEEDRATE() _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) extern Planner planner; diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 400206f83a..edf7ba3e20 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -152,8 +152,8 @@ xyz_pos_t Probe::offset; // Initialized by settings.load() inline void run_stow_moves_script() { const xyz_pos_t oldpos = current_position; endstops.enable_z_probe(false); - do_blocking_move_to_z(TOUCH_MI_RETRACT_Z, MMM_TO_MMS(HOMING_FEEDRATE_Z)); - do_blocking_move_to(oldpos, MMM_TO_MMS(HOMING_FEEDRATE_Z)); + do_blocking_move_to_z(TOUCH_MI_RETRACT_Z, homing_feedrate(Z_AXIS)); + do_blocking_move_to(oldpos, homing_feedrate(Z_AXIS)); } #elif ENABLED(Z_PROBE_ALLEN_KEY) @@ -664,11 +664,8 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise } else if (!position_is_reachable(npos)) return NAN; // The given position is in terms of the nozzle - const float old_feedrate_mm_s = feedrate_mm_s; - feedrate_mm_s = XY_PROBE_FEEDRATE_MM_S; - // Move the probe to the starting XYZ - do_blocking_move_to(npos); + do_blocking_move_to(npos, feedRate_t(XY_PROBE_FEEDRATE_MM_S)); float measured_z = NAN; if (!deploy()) measured_z = run_z_probe(sanity_check) + offset.z; @@ -683,8 +680,6 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise SERIAL_ECHOLNPAIR("Bed X: ", LOGICAL_X_POSITION(rx), " Y: ", LOGICAL_Y_POSITION(ry), " Z: ", measured_z); } - feedrate_mm_s = old_feedrate_mm_s; - if (isnan(measured_z)) { stow(); LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); From f50abfcb1bb336fd827e7d3de63dd3dd7183a6f3 Mon Sep 17 00:00:00 2001 From: rafaljot Date: Thu, 17 Dec 2020 13:02:05 +0100 Subject: [PATCH 0737/1370] Homing feedrates as XYZ array (#20426) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 5 ++--- Marlin/src/inc/Conditionals_post.h | 6 +----- Marlin/src/inc/SanityCheck.h | 4 +++- Marlin/src/module/motion.cpp | 16 +++------------- Marlin/src/module/motion.h | 22 +++++++++++++++++++--- Marlin/src/module/probe.cpp | 12 ++++++------ 6 files changed, 34 insertions(+), 31 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 8b29a4ba80..adf6a3d536 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1001,7 +1001,7 @@ #define XY_PROBE_SPEED (133*60) // Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) -#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z +#define Z_PROBE_SPEED_FAST (4*60) // Feedrate (mm/min) for the "accurate" probe of each point #define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) @@ -1458,8 +1458,7 @@ #endif // Homing speeds (mm/min) -#define HOMING_FEEDRATE_XY (50*60) -#define HOMING_FEEDRATE_Z (4*60) +#define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60) } // Validate that endstops are triggered on homing moves #define VALIDATE_HOMING_ENDSTOPS diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 092dc818b8..3510cb2115 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2317,11 +2317,7 @@ #define Z_PROBE_OFFSET_RANGE_MAX 20 #endif #ifndef XY_PROBE_SPEED - #ifdef HOMING_FEEDRATE_XY - #define XY_PROBE_SPEED HOMING_FEEDRATE_XY - #else - #define XY_PROBE_SPEED 4000 - #endif + #define XY_PROBE_SPEED ((homing_feedrate_mm_m.x + homing_feedrate_mm_m.y) / 2) #endif #ifndef NOZZLE_TO_PROBE_OFFSET #define NOZZLE_TO_PROBE_OFFSET { 0, 0, 0 } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c75cb1cd41..6c4c4cc340 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -189,7 +189,9 @@ #elif defined(ENDSTOPS_ONLY_FOR_HOMING) #error "ENDSTOPS_ONLY_FOR_HOMING is deprecated. Use (disable) ENDSTOPS_ALWAYS_ON_DEFAULT instead." #elif defined(HOMING_FEEDRATE) - #error "HOMING_FEEDRATE is deprecated. Set individual rates with HOMING_FEEDRATE_(XY|Z|E) instead." + #error "HOMING_FEEDRATE is now set using the HOMING_FEEDRATE_MM_M array instead." +#elif defined(HOMING_FEEDRATE_XY) || defined(HOMING_FEEDRATE_Z) + #error "HOMING_FEEDRATE_XY and HOMING_FEEDRATE_Z are now set using the HOMING_FEEDRATE_MM_M array instead." #elif defined(MANUAL_HOME_POSITIONS) #error "MANUAL_HOME_POSITIONS is deprecated. Set MANUAL_[XYZ]_HOME_POS as-needed instead." #elif defined(PID_ADD_EXTRUSION_RATE) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 28bf16a310..127ba80788 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -143,16 +143,6 @@ xyze_pos_t destination; // {0} feedRate_t feedrate_mm_s = MMM_TO_MMS(1500); int16_t feedrate_percentage = 100; -// Homing feedrate is const progmem - compare to constexpr in the header -const feedRate_t homing_feedrate_mm_s[XYZ] PROGMEM = { - #if ENABLED(DELTA) - MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z), - #else - MMM_TO_MMS(HOMING_FEEDRATE_XY), MMM_TO_MMS(HOMING_FEEDRATE_XY), - #endif - MMM_TO_MMS(HOMING_FEEDRATE_Z) -}; - // Cartesian conversion result goes here: xyz_pos_t cartes; @@ -195,7 +185,7 @@ xyz_pos_t cartes; #endif #if HAS_ABL_NOT_UBL - float xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); + feedRate_t xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); #endif /** @@ -510,7 +500,7 @@ void do_z_clearance(const float &zclear, const bool z_trusted/*=true*/, const bo const bool rel = raise_on_untrusted && !z_trusted; float zdest = zclear + (rel ? current_position.z : 0.0f); if (!lower_allowed) NOLESS(zdest, current_position.z); - do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), TERN(HAS_BED_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST), homing_feedrate(Z_AXIS))); + do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), TERN(HAS_BED_PROBE, z_probe_fast_mm_s, homing_feedrate(Z_AXIS))); } // @@ -1841,7 +1831,7 @@ void homeaxis(const AxisEnum axis) { current_position[axis] -= ABS(endstop_backoff[axis]) * axis_home_dir; line_to_current_position( #if HOMING_Z_WITH_PROBE - (axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : + (axis == Z_AXIS) ? z_probe_fast_mm_s : #endif homing_feedrate(axis) ); diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 2eb54f36fb..18d8aa9f2e 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -57,7 +57,7 @@ extern xyz_pos_t cartes; #endif #if HAS_ABL_NOT_UBL - extern float xy_probe_feedrate_mm_s; + extern feedRate_t xy_probe_feedrate_mm_s; #define XY_PROBE_FEEDRATE_MM_S xy_probe_feedrate_mm_s #elif defined(XY_PROBE_SPEED) #define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_SPEED) @@ -65,12 +65,28 @@ extern xyz_pos_t cartes; #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() #endif +constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_SPEED_FAST); + /** * Feed rates are often configured with mm/m * but the planner and stepper like mm/s units. */ -extern const feedRate_t homing_feedrate_mm_s[XYZ]; -FORCE_INLINE feedRate_t homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); } +constexpr xyz_feedrate_t homing_feedrate_mm_m = HOMING_FEEDRATE_MM_M; +FORCE_INLINE feedRate_t homing_feedrate(const AxisEnum a) { + float v; + #if ENABLED(DELTA) + v = homing_feedrate_mm_m.z; + #else + switch (a) { + case X_AXIS: v = homing_feedrate_mm_m.x; break; + case Y_AXIS: v = homing_feedrate_mm_m.y; break; + case Z_AXIS: + default: v = homing_feedrate_mm_m.z; + } + #endif + return MMM_TO_MMS(v); +} + feedRate_t get_homing_bump_feedrate(const AxisEnum axis); /** diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index edf7ba3e20..17949a4420 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -516,7 +516,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { #if TOTAL_PROBING == 2 // Do a first probe at the fast speed - if (try_to_probe(PSTR("FAST"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_FAST), + if (try_to_probe(PSTR("FAST"), z_probe_low_point, z_probe_fast_mm_s, sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return NAN; const float first_probe_z = current_position.z; @@ -524,7 +524,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("1st Probe Z:", first_probe_z); // Raise to give the probe clearance - do_blocking_move_to_z(current_position.z + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_MULTI_PROBE, z_probe_fast_mm_s); #elif Z_PROBE_SPEED_FAST != Z_PROBE_SPEED_SLOW @@ -533,8 +533,8 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { const float z = Z_CLEARANCE_DEPLOY_PROBE + 5.0 + (offset.z < 0 ? -offset.z : 0); if (current_position.z > z) { // Probe down fast. If the probe never triggered, raise for probe clearance - if (!probe_down_to_z(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) - do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + if (!probe_down_to_z(z, z_probe_fast_mm_s)) + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES, z_probe_fast_mm_s); } #endif @@ -582,7 +582,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { #if EXTRA_PROBING > 0 < TOTAL_PROBING - 1 #endif - ) do_blocking_move_to_z(z + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + ) do_blocking_move_to_z(z + Z_CLEARANCE_MULTI_PROBE, z_probe_fast_mm_s); #endif } @@ -672,7 +672,7 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise if (!isnan(measured_z)) { const bool big_raise = raise_after == PROBE_PT_BIG_RAISE; if (big_raise || raise_after == PROBE_PT_RAISE) - do_blocking_move_to_z(current_position.z + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + do_blocking_move_to_z(current_position.z + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), z_probe_fast_mm_s); else if (raise_after == PROBE_PT_STOW) if (stow()) measured_z = NAN; // Error on stow? From d6efe75251de748adb23526f0a7ec8507da75318 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 18 Dec 2020 01:05:25 +1300 Subject: [PATCH 0738/1370] Fix ZoneStar LCD 2004 buttons (#20489) --- Marlin/src/lcd/marlinui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 241d3a1712..fb37643cd2 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -923,7 +923,7 @@ void MarlinUI::update() { TERN_(HAS_SLOW_BUTTONS, slow_buttons = read_slow_buttons()); // Buttons that take too long to read in interrupt context - if (TERN0(REPRAPWORLD_KEYPAD, handle_keypad())) + if (TERN0(IS_RRW_KEYPAD, handle_keypad())) RESET_STATUS_TIMEOUT(); uint8_t abs_diff = ABS(encoderDiff); From e5d094d2bd243fe3fcbe5feda5186352e452ab40 Mon Sep 17 00:00:00 2001 From: nb-rapidia <43864438+nb-rapidia@users.noreply.github.com> Date: Thu, 17 Dec 2020 04:13:07 -0800 Subject: [PATCH 0739/1370] Make M220 B / R a standard feature (#20355) --- Marlin/src/gcode/config/M220.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/config/M220.cpp b/Marlin/src/gcode/config/M220.cpp index 37fe7d3a5f..75339f10b9 100644 --- a/Marlin/src/gcode/config/M220.cpp +++ b/Marlin/src/gcode/config/M220.cpp @@ -37,11 +37,9 @@ */ void GcodeSuite::M220() { - #if HAS_PRUSA_MMU2 - static int16_t backup_feedrate_percentage = 100; - if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage; - if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage; - #endif + static int16_t backup_feedrate_percentage = 100; + if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage; + if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage; if (parser.seenval('S')) feedrate_percentage = parser.value_int(); From c3a1cd10abc8ec0336f52abf2822f2707b92f3a8 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 17 Dec 2020 04:18:07 -0800 Subject: [PATCH 0740/1370] Balance CI tests (#20485) --- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 3 +- buildroot/tests/FYSETC_F6_13-tests | 61 +++++++++++ buildroot/tests/LPC1769-tests | 20 +--- buildroot/tests/mega2560-tests | 119 +--------------------- buildroot/tests/mks_robin-tests | 8 ++ buildroot/tests/mks_robin_nano35-tests | 9 -- buildroot/tests/rambo-tests | 46 +++++++++ buildroot/tests/sanguino1284p-tests | 6 +- get_test_targets.py | 0 10 files changed, 125 insertions(+), 149 deletions(-) mode change 100644 => 100755 get_test_targets.py diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6c4c4cc340..be7d97e2ca 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1916,7 +1916,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * LED Backlight Timeout */ -#if defined(LED_BACKLIGHT_TIMEOUT) && !(ENABLED(PSU_CONTROL) && EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1)) +#if defined(LED_BACKLIGHT_TIMEOUT) && !(ENABLED(PSU_CONTROL) && ANY(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864)) #error "LED_BACKLIGHT_TIMEOUT requires a FYSETC Mini Panel and a Power Switch." #endif diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index 15ac2f447b..6133a6417e 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -226,7 +226,7 @@ #define DOGLCD_SCK 17 #define DOGLCD_A0 LCD_PINS_DC - #define KILL_PIN -1 // NC + #undef KILL_PIN #define NEOPIXEL_PIN 27 #else @@ -243,7 +243,6 @@ #define LCD_BACKLIGHT_PIN 27 #endif - #define KILL_PIN 41 #define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. // Seems to work best if left open. diff --git a/buildroot/tests/FYSETC_F6_13-tests b/buildroot/tests/FYSETC_F6_13-tests index a3e9f4ef39..cc7f334099 100755 --- a/buildroot/tests/FYSETC_F6_13-tests +++ b/buildroot/tests/FYSETC_F6_13-tests @@ -14,5 +14,66 @@ opt_set MOTHERBOARD BOARD_FYSETC_F6_13 opt_enable DGUS_LCD_UI_FYSETC exec_test $1 $2 "FYSETC F6 1.3 with DGUS" "$3" +# +# Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 +# +use_example_configs delta/generic +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 +opt_enable RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS EEPROM_CHITCHAT \ + Z_PROBE_ALLEN_KEY AUTO_BED_LEVELING_UBL \ + OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU +opt_set LCD_LANGUAGE ko_KR +opt_set X_DRIVER_TYPE L6470 +opt_set Y_DRIVER_TYPE L6470 +opt_set Z_DRIVER_TYPE L6470 +opt_add L6470_CHAIN_SCK_PIN 53 +opt_add L6470_CHAIN_MISO_PIN 49 +opt_add L6470_CHAIN_MOSI_PIN 40 +opt_add L6470_CHAIN_SS_PIN 42 +opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" +exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." "$3" + +# +# Test mixed TMC config +# +restore_configs +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 +opt_set LCD_LANGUAGE vi +opt_set X_DRIVER_TYPE TMC2160 +opt_set Y_DRIVER_TYPE TMC5160 +opt_set Z_DRIVER_TYPE TMC2208_STANDALONE +opt_set E0_DRIVER_TYPE TMC2130 +opt_set X_MIN_ENDSTOP_INVERTING true +opt_set Y_MIN_ENDSTOP_INVERTING true +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ + MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE \ + MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD \ + USE_ZMIN_PLUG SENSORLESS_HOMING TMC_DEBUG M114_DETAIL +exec_test $1 $2 "RAMPS | Mixed TMC | Sensorless | RRDFGSC | Games" "$3" + +# +# Delta Config (FLSUN AC because it's complex) +# +use_example_configs delta/FLSUN/auto_calibrate +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 +exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" "$3" + +# +# SCARA with Mixed TMC +# +use_example_configs SCARA/Morgan +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 +opt_set LCD_LANGUAGE es +opt_enable USE_ZMIN_PLUG FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR PAUSE_BEFORE_DEPLOY_STOW \ + FYSETC_242_OLED_12864 EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL Z_SAFE_HOMING \ + STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD SENSORLESS_HOMING SQUARE_WAVE_STEPPING +opt_set X_MAX_ENDSTOP_INVERTING false +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set Z_DRIVER_TYPE TMC2130_STANDALONE +opt_set E0_DRIVER_TYPE TMC2660 +opt_add X_HARDWARE_SERIAL Serial2 +exec_test $1 $2 "FYSETC_F6 | SCARA | Mixed TMC | EEPROM" "$3" + # clean up restore_configs diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index ebfa4cc8dc..0a61d42800 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -12,22 +12,6 @@ set -e use_example_configs Azteeg/X5GT exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" -restore_configs -opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 -1 -opt_set TEMP_SENSOR_BED 5 -opt_enable VIKI2 SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ - FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - LEVEL_BED_CORNERS LEVEL_CORNERS_USE_PROBE LEVEL_CORNERS_VERIFY_RAISED \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ - PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ - Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ - LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER -opt_disable SD_PROCEDURE_DEPTH -opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Smoothieboard with many features" "$3" - restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD opt_set EXTRUDERS 2 @@ -35,12 +19,12 @@ opt_set TEMP_SENSOR_1 -1 opt_set TEMP_SENSOR_BED 5 opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET LEVEL_CORNERS_USE_PROBE LEVEL_CORNERS_VERIFY_RAISED \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI" "$3" +exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI and many features" "$3" #restore_configs #opt_set MOTHERBOARD BOARD_AZTEEG_X5_MINI_WIFI diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 0a17cacba1..12bbceab87 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -60,21 +60,6 @@ opt_disable SEGMENT_LEVELED_MOVES opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL M114_DETAIL exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." "$3" -# -# Test a Servo Probe -# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES -# -restore_configs -opt_set LCD_LANGUAGE zh_CN -opt_set MMU_MODEL PRUSA_MMU2S -opt_set EXTRUDERS 5 -opt_set NUM_SERVOS 1 -opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ - AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ - NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ - MMU2_MENUS DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ - FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING -exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2S | Servo | 3-Point + Debug | G38 ..." "$3" # # 5 runout sensors with distinct states @@ -100,27 +85,6 @@ opt_set FIL_RUNOUT4_PIN 46 opt_set FIL_RUNOUT5_PIN 47 exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" "$3" -# -# Test MINIRAMBO with PWM_MOTOR_CURRENT and many features -# -restore_configs -opt_set MOTHERBOARD BOARD_MEGACONTROLLER -opt_set LCD_LANGUAGE de -opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT \ - MINIPANEL SDSUPPORT PCA9632 LCD_INFO_MENU SOUND_MENU_ITEM GCODE_REPEAT_MARKERS \ - AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ - LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ - INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT EXPERIMENTAL_I2CBUS M100_FREE_MEMORY_WATCHER \ - NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE \ - ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES \ - PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL \ - USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE -opt_set CONTROLLERFAN_SPEED_IDLE 128 -opt_add M100_FREE_MEMORY_DUMPER -opt_add M100_FREE_MEMORY_CORRUPTOR -opt_set PWM_MOTOR_CURRENT "{ 1300, 1300, 1250 }" -opt_set I2C_SLAVE_ADDRESS 63 -exec_test $1 $2 "MEGACONTROLLER | Minipanel | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." "$3" # # Mixing Extruder with 5 steppers, Greek @@ -150,31 +114,6 @@ exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" #opt_enable COREXY #exec_test $1 $2 "Stuff" "$3" -# -# Test many less common options -# -restore_configs -opt_set MOTHERBOARD BOARD_MIGHTYBOARD_REVE -opt_set TEMP_SENSOR_0 -2 -opt_set DIGIPOT_I2C_NUM_CHANNELS 5 -opt_set LCD_LANGUAGE it -opt_set MIXING_STEPPERS 2 -opt_set SERVO_DELAY "{ 300, 300, 300 }" -opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ - BABYSTEPPING BABYSTEP_DISPLAY_TOTAL FILAMENT_LCD_DISPLAY \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER MENU_ADDAUTOSTART SDSUPPORT SDCARD_SORT_ALPHA \ - ENDSTOP_NOISE_THRESHOLD FAN_SOFT_PWM \ - FIX_MOUNTED_PROBE AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE FILAMENT_WIDTH_SENSOR PROBE_OFFSET_WIZARD \ - Z_SAFE_HOMING SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER \ - SD_ABORT_ON_ENDSTOP_HIT HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT ADVANCED_OK M114_DETAIL \ - VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS EXTRA_FAN_SPEED FWRETRACT \ - USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_USE_Z_ONLY -opt_set FAN_MIN_PWM 50 -opt_set FAN_KICKSTART_TIME 100 -opt_set XY_FREQUENCY_LIMIT 15 -opt_add FILWIDTH_PIN 5 -exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home Y > X | FW Retract ..." "$3" - ######## Other Standard LCD/Panels ############## # # ULTRA_LCD @@ -277,71 +216,15 @@ exec_test $1 $2 "Formbot/T_Rex_3 example configuration." "$3" # # BQ Hephestos 2 #restore_configs -#use_example_configs Hephestos_2 +#use_example_configs BQ/Hephestos_2 #exec_test $1 $2 "Stuff" "$3" -# -# Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 -# -use_example_configs delta/generic -opt_enable RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS EEPROM_CHITCHAT \ - Z_PROBE_ALLEN_KEY AUTO_BED_LEVELING_UBL \ - OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU -opt_set LCD_LANGUAGE ko_KR -opt_set X_DRIVER_TYPE L6470 -opt_set Y_DRIVER_TYPE L6470 -opt_set Z_DRIVER_TYPE L6470 -opt_add L6470_CHAIN_SCK_PIN 53 -opt_add L6470_CHAIN_MISO_PIN 49 -opt_add L6470_CHAIN_MOSI_PIN 40 -opt_add L6470_CHAIN_SS_PIN 42 -opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" -exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." "$3" - -# -# Delta Config (FLSUN AC because it's complex) -# -use_example_configs delta/FLSUN/auto_calibrate -exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" "$3" - # # Makibox Config need to check board type for Teensy++ 2.0 # #use_example_configs makibox #exec_test $1 $2 "Stuff" "$3" -# -# Test mixed TMC config -# -restore_configs -opt_set LCD_LANGUAGE vi -opt_set X_DRIVER_TYPE TMC2160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set Z_DRIVER_TYPE TMC2208_STANDALONE -opt_set E0_DRIVER_TYPE TMC2130 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ - MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE \ - MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD \ - USE_ZMIN_PLUG SENSORLESS_HOMING TMC_DEBUG M114_DETAIL -exec_test $1 $2 "RAMPS | Mixed TMC | Sensorless | RRDFGSC | Games" "$3" - -# -# SCARA with Mixed TMC -# -use_example_configs SCARA/Morgan -opt_set LCD_LANGUAGE es -opt_enable USE_ZMIN_PLUG FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR PAUSE_BEFORE_DEPLOY_STOW \ - MKS_12864OLED EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL Z_SAFE_HOMING \ - STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD SENSORLESS_HOMING SQUARE_WAVE_STEPPING -opt_set X_MAX_ENDSTOP_INVERTING false -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130_STANDALONE -opt_set E0_DRIVER_TYPE TMC2660 -exec_test $1 $2 "RAMPS | SCARA | Mixed TMC | EEPROM" "$3" - # # tvrrug Config need to check board type for sanguino atmega644p # diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests index 3fccc87c59..652147f867 100755 --- a/buildroot/tests/mks_robin-tests +++ b/buildroot/tests/mks_robin-tests @@ -10,5 +10,13 @@ set -e use_example_configs Mks/Robin exec_test $1 $2 "MKS Robin config (FSMC Color UI)" "$3" +# +# MKS Robin LVGL FSMC +# +use_example_configs Mks/Robin +opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 +opt_enable TFT_LVGL_UI TFT_RES_480x320 +exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" "$3" + # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index 391566f6d7..3c5d1bb66f 100755 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -24,15 +24,6 @@ opt_disable TFT_INTERFACE_FSMC opt_enable TFT_INTERFACE_SPI exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" "$3" -# -# MKS Robin nano v1.2 LVGL FSMC -# -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 -opt_enable TFT_LVGL_UI TFT_RES_480x320 -exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" "$3" - # # MKS Robin v2 nano LVGL SPI # (Robin v2 nano has no FSMC interface) diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 6d2ef4f58a..f93b2d14f2 100755 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -81,5 +81,51 @@ opt_set Z_DRIVER_TYPE TMC2130 opt_set E0_DRIVER_TYPE TMC2130 exec_test $1 $2 "Einsy RAMBo with TMC2130" "$3" +# +# Test MINIRAMBO with PWM_MOTOR_CURRENT and many features +# +restore_configs +opt_set MOTHERBOARD BOARD_MINIRAMBO +opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ + SDSUPPORT PCA9632 SOUND_MENU_ITEM GCODE_REPEAT_MARKERS \ + AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ + LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ + INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT EXPERIMENTAL_I2CBUS M100_FREE_MEMORY_WATCHER \ + NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE \ + ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES \ + PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL +opt_set CONTROLLERFAN_SPEED_IDLE 128 +opt_add M100_FREE_MEMORY_DUMPER +opt_add M100_FREE_MEMORY_CORRUPTOR +opt_set PWM_MOTOR_CURRENT "{ 1300, 1300, 1250 }" +opt_set I2C_SLAVE_ADDRESS 63 +exec_test $1 $2 "MINIRAMBO | RRDGFSC | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." "$3" + +# +# Test many less common options +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMBO +opt_set TEMP_SENSOR_0 -2 +opt_set DIGIPOT_I2C_NUM_CHANNELS 5 +opt_set LCD_LANGUAGE it +opt_set MIXING_STEPPERS 2 +opt_set SERVO_DELAY "{ 300, 300, 300 }" +opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ + BABYSTEPPING BABYSTEP_DISPLAY_TOTAL FILAMENT_LCD_DISPLAY \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER MENU_ADDAUTOSTART SDSUPPORT SDCARD_SORT_ALPHA \ + ENDSTOP_NOISE_THRESHOLD FAN_SOFT_PWM \ + FIX_MOUNTED_PROBE AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE FILAMENT_WIDTH_SENSOR PROBE_OFFSET_WIZARD \ + Z_SAFE_HOMING SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER \ + SD_ABORT_ON_ENDSTOP_HIT HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT ADVANCED_OK M114_DETAIL \ + VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS EXTRA_FAN_SPEED FWRETRACT \ + USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_USE_Z_ONLY +opt_set CONTROLLER_FAN_PIN X_MAX_PIN +opt_set FAN_MIN_PWM 50 +opt_set FAN_KICKSTART_TIME 100 +opt_set XY_FREQUENCY_LIMIT 15 +opt_add FILWIDTH_PIN 5 +exec_test $1 $2 "Rambo | CoreXY, Gradient Mix | Endstop Int. | Home Y > X | FW Retract ..." "$3" + # clean up restore_configs diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests index 748d2a8fa3..a513f095f9 100755 --- a/buildroot/tests/sanguino1284p-tests +++ b/buildroot/tests/sanguino1284p-tests @@ -11,7 +11,11 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 -exec_test $1 $2 "Default Configuration" "$3" +opt_set LCD_LANGUAGE de +opt_enable MINIPANEL USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE +opt_set CONTROLLER_FAN_PIN 27 +exec_test $1 $2 "Default Configuration | MINIPANAL | CONTROLLER_FAN" "$3" + # clean up restore_configs diff --git a/get_test_targets.py b/get_test_targets.py old mode 100644 new mode 100755 From 02b65de6a2cd4778c1b2f3293bed7cd9a732c0ef Mon Sep 17 00:00:00 2001 From: grauerfuchs <42082416+grauerfuchs@users.noreply.github.com> Date: Thu, 17 Dec 2020 18:22:59 -0500 Subject: [PATCH 0741/1370] Fix and optimize MightyBoard (#20493) --- Marlin/Configuration_adv.h | 2 +- .../src/feature/digipot/digipot_mcp4018.cpp | 18 +++++----- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 1 + platformio.ini | 34 +++++++++++-------- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 9e5ebb33ba..aed29d0f2c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1022,7 +1022,7 @@ /** * I2C-based DIGIPOTs (e.g., Azteeg X3 Pro) */ -//#define DIGIPOT_MCP4018 // Requires https://github.com/stawel/SlowSoftI2CMaster +//#define DIGIPOT_MCP4018 // Requires https://github.com/felias-fogg/SlowSoftI2CMaster //#define DIGIPOT_MCP4451 #if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) #define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT:4 AZTEEG_X3_PRO:8 MKS_SBASE:5 MIGHTYBOARD_REVE:5 diff --git a/Marlin/src/feature/digipot/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp index 4b90cc4ead..37853ff428 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4018.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp @@ -27,7 +27,7 @@ #include "digipot.h" #include -#include // https://github.com/stawel/SlowSoftI2CMaster +#include // https://github.com/felias-fogg/SlowSoftI2CMaster // Settings for the I2C based DIGIPOT (MCP4018) based on WT150 @@ -46,21 +46,21 @@ static byte current_to_wiper(const float current) { } static SlowSoftI2CMaster pots[DIGIPOT_I2C_NUM_CHANNELS] = { - SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_X, DIGIPOTS_I2C_SCL) + SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_X, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS)) #if DIGIPOT_I2C_NUM_CHANNELS > 1 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Y, DIGIPOTS_I2C_SCL) + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Y, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS)) #if DIGIPOT_I2C_NUM_CHANNELS > 2 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Z, DIGIPOTS_I2C_SCL) + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Z, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS)) #if DIGIPOT_I2C_NUM_CHANNELS > 3 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E0, DIGIPOTS_I2C_SCL) + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E0, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS)) #if DIGIPOT_I2C_NUM_CHANNELS > 4 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E1, DIGIPOTS_I2C_SCL) + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E1, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS)) #if DIGIPOT_I2C_NUM_CHANNELS > 5 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E2, DIGIPOTS_I2C_SCL) + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E2, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS)) #if DIGIPOT_I2C_NUM_CHANNELS > 6 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E3, DIGIPOTS_I2C_SCL) + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E3, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS)) #if DIGIPOT_I2C_NUM_CHANNELS > 7 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E4, DIGIPOTS_I2C_SCL) + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E4, DIGIPOTS_I2C_SCL, ENABLED(DIGIPOT_ENABLE_I2C_PULLUPS)) #endif #endif #endif diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index d074db8b25..b260a27867 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -118,6 +118,7 @@ #ifndef DIGIPOT_I2C_ADDRESS_A #define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1) #endif +#define DIGIPOT_ENABLE_I2C_PULLUPS // MightyBoard doesn't have hardware I2C pin pull-ups. // // Temperature Sensors diff --git a/platformio.ini b/platformio.ini index 753140467c..2a0901d14d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -457,7 +457,6 @@ board = megaatmega2560 [env:mega2560ext] platform = atmelavr extends = env:mega2560 -board = megaatmega2560 board_build.variant = megaextendedpins extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -471,24 +470,31 @@ extends = common_avr8 board = megaatmega1280 # -# MightyBoard ATmega2560 (MegaCore 100 pin boards variants) +# MightyBoard AVR with extended pins # -[env:MightyBoard1280] -platform = atmelavr -extends = common_avr8 -board = ATmega1280 -upload_speed = 57600 +[mega_extended_optimized] +extends = common_avr8 +board_build.variant = megaextendedpins +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +upload_speed = 57600 +build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues # -# MightyBoard ATmega2560 (MegaCore 100 pin boards variants) +# MightyBoard ATmega1280 +# +[env:MightyBoard1280] +platform = atmelavr +extends = mega_extended_optimized +board = megamega1280 + +# +# MightyBoard ATmega2560 # [env:MightyBoard2560] -platform = atmelavr -extends = common_avr8 -board = ATmega2560 -upload_protocol = wiring -upload_speed = 57600 -board_upload.maximum_size = 253952 +platform = atmelavr +extends = mega_extended_optimized +board = megaatmega2560 # # RAMBo From 51e3d8f08b22af0a86d506e6c612e25f43b9b341 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 18 Dec 2020 19:18:04 -0300 Subject: [PATCH 0742/1370] MKS Robin Nano V3 and STM32F4x0Vx Variant (#20430) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 367 +++++++++++++ .../boards/genericSTM32F407VGT6.json | 56 ++ .../variants/MARLIN_F4x7Vx/PeripheralPins.c | 408 +++++++++++++++ .../variants/MARLIN_F4x7Vx/PinNamesVar.h | 50 ++ .../variants/MARLIN_F4x7Vx/hal_conf_extra.h | 495 ++++++++++++++++++ .../variants/MARLIN_F4x7Vx/ldscript.ld | 203 +++++++ .../variants/MARLIN_F4x7Vx/variant.cpp | 275 ++++++++++ .../variants/MARLIN_F4x7Vx/variant.h | 199 +++++++ platformio.ini | 22 + 11 files changed, 2078 insertions(+) create mode 100644 Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h create mode 100644 buildroot/share/PlatformIO/boards/genericSTM32F407VGT6.json create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 172cdd6b5a..15362c4908 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -367,6 +367,7 @@ #define BOARD_FLYF407ZG 4217 // FLYF407ZG board (STM32F407ZG) #define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE) #define BOARD_MKS_ROBIN_PRO_V2 4219 // MKS Robin Pro V2 (STM32F407VE) +#define BOARD_MKS_ROBIN_NANO_V3 4220 // MKS Robin Nano V3 (STM32F407VG) // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 52e6d26b14..9d1dab10f6 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -592,6 +592,8 @@ #include "stm32f4/pins_MKS_ROBIN2.h" // STM32F4 env:MKS_ROBIN2 #elif MB(MKS_ROBIN_PRO_V2) #include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2 +#elif MB(MKS_ROBIN_NANO_V3) + #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 // // ARM Cortex M7 diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h new file mode 100644 index 0000000000..5ff29a1f1c --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -0,0 +1,367 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(STM32F4, STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS Robin Nano V3 supports up to 2 hotends / E-steppers." +#elif HAS_FSMC_TFT + #error "MKS Robin Nano V3 doesn't support FSMC-based TFT displays." +#endif + +#define BOARD_INFO_NAME "MKS Robin Nano V3" + +// Use one of these or SDCard-based Emulation will be used +//#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation +//#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation +#define I2C_EEPROM + +// +// Release PB4 (Z_DIR_PIN) from JTAG NRST role +// + +// +// Limit Switches +// +#define X_DIAG_PIN PD15 +#define Y_DIAG_PIN PD2 +#define Z_DIAG_PIN PC8 +#define E0_DIAG_PIN PC4 +#define E1_DIAG_PIN PE7 + +// +#define X_STOP_PIN PA15 +#define Y_STOP_PIN PD2 +#define Z_MIN_PIN PC8 +#define Z_MAX_PIN PC4 + +// +// Steppers +// +#define X_ENABLE_PIN PE4 +#define X_STEP_PIN PE3 +#define X_DIR_PIN PE2 +#ifndef X_CS_PIN + #define X_CS_PIN PD5 +#endif + +#define Y_ENABLE_PIN PE1 +#define Y_STEP_PIN PE0 +#define Y_DIR_PIN PB9 +#ifndef Y_CS_PIN + #define Y_CS_PIN PD7 +#endif + +#define Z_ENABLE_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB4 +#ifndef Z_CS_PIN + #define Z_CS_PIN PD4 +#endif + +#define E0_ENABLE_PIN PB3 +#define E0_STEP_PIN PD6 +#define E0_DIR_PIN PD3 +#ifndef E0_CS_PIN + #define E0_CS_PIN PD9 +#endif + +#define E1_ENABLE_PIN PA3 +#define E1_STEP_PIN PD15 +#define E1_DIR_PIN PA1 +#ifndef E1_CS_PIN + #define E1_CS_PIN PD8 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +// This board only support SW SPI for stepper drivers +#if HAS_TMC_SPI + #define TMC_USE_SW_SPI +#endif +#if ENABLED(TMC_USE_SW_SPI) + #if !defined(TMC_SW_MOSI) || TMC_SW_MOSI == -1 + #define TMC_SW_MOSI PD14 + #endif + #if !defined(TMC_SW_MISO) || TMC_SW_MISO == -1 + #define TMC_SW_MISO PD1 + #endif + #if !defined(TMC_SW_SCK) || TMC_SW_SCK == -1 + #define TMC_SW_SCK PD0 + #endif +#endif + +#if HAS_TMC_UART + // + // Software serial + // No Hardware serial for steppers + // + #define X_SERIAL_TX_PIN PD5 + #define X_SERIAL_RX_PIN PD5 + + #define Y_SERIAL_TX_PIN PD7 + #define Y_SERIAL_RX_PIN PD7 + + #define Z_SERIAL_TX_PIN PD4 + #define Z_SERIAL_RX_PIN PD4 + + #define E0_SERIAL_TX_PIN PD9 + #define E0_SERIAL_RX_PIN PD9 + + #define E1_SERIAL_TX_PIN PD8 + #define E1_SERIAL_RX_PIN PD8 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // TH1 +#define TEMP_1_PIN PA2 // TH2 +#define TEMP_BED_PIN PC0 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PE5 // HEATER1 +#define HEATER_1_PIN PB0 // HEATER2 +#define HEATER_BED_PIN PA0 // HOT BED + +#define FAN_PIN PB1 // FAN +#define FAN1_PIN PC14 // FAN1 + +// +// Thermocouples +// +//#define MAX6675_SS_PIN HEATER_0_PIN // TC1 - CS1 +//#define MAX6675_SS_PIN HEATER_1_PIN // TC2 - CS2 + +// +// Misc. Functions +// +#define MT_DET_1 PA4 +#define MT_DET_2 PE6 +#define PW_DET PA13 +#define PW_OFF PB2 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN MT_DET_1 +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN MT_DET_2 +#endif + +#define POWER_LOSS_PIN PW_DET +#define PS_ON_PIN PW_OFF +// +// Enable MKSPWC support +// +//#define SUICIDE_PIN PB2 +//#define KILL_PIN PA2 +//#define KILL_PIN_INVERTING true + +#define SERVO0_PIN PA8 // Enable BLTOUCH support +//#define LED_PIN PB2 + +// Random Info +#define USB_SERIAL -1 //Usb Serial +#define WIFI_SERIAL 3 //USART3 +#define MKS_WIFI_MODULE_SERIAL 1 //USART1 +#define MKS_WIFI_MODULE_SPI 2 //SPI2 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +// +// Onboard SD card +// +// detect pin dont work when ONBOARD and NO_SD_HOST_DRIVE disabled +#if SD_CONNECTION_IS(ONBOARD) + #define CUSTOM_SPI_PINS // TODO: needed because is the only way to set SPI3 for SD on STM32 (by now) + #if ENABLED(CUSTOM_SPI_PINS) + #define ENABLE_SPI3 + #define SS_PIN -1 + #define SDSS PC9 + #define SCK_PIN PC10 + #define MISO_PIN PC11 + #define MOSI_PIN PC12 + #define SD_DETECT_PIN PD12 + #endif +#endif + +// +// LCD SD +// +#if SD_CONNECTION_IS(LCD) + #define CUSTOM_SPI_PINS + #if ENABLED(CUSTOM_SPI_PINS) + #define ENABLE_SPI1 + #define SDSS PE10 + #define SCK_PIN PA5 + #define MISO_PIN PA6 + #define MOSI_PIN PA7 + #define SD_DETECT_PIN PE12 + #endif +#endif + +// +// LCD / Controller +#define SPI_FLASH +#define HAS_SPI_FLASH 1 +#define SPI_DEVICE 2 +#define SPI_FLASH_SIZE 0x1000000 +#if ENABLED(SPI_FLASH) + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PC3 + #define W25QXX_MISO_PIN PC2 + #define W25QXX_SCK_PIN PB13 +#endif + +/** + * _____ _____ + * (BEEPER)PC5 | · · | PE13(BTN_ENC) (SPI1 MISO) PA6 | · · | PA5 (SPI1 SCK) + * (LCD_EN)PD13 | · · | PC6(LCD_RS) (BTN_EN1) PE8 | · · | PE10 (SPI1 CS) + * (LCD_D4)PE14 | · · PE15(LCD_D5) (BTN_EN2) PE11 | · · PA7 (SPI1 MOSI) + * (LCD_D6)PD11 | · · | PD10(LCD_D7) (SPI1_RS) PE12 | · · | RESET + * GND | · · | 5V GND | · · | 3.3V + *  ̄ ̄ ̄  ̄ ̄ ̄ + * EXP1 EXP2 + */ + +#if EITHER(TFT_480x320_SPI, TFT_LVGL_UI_SPI) + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X -17253 + #endif + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y 11579 + #endif + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X 514 + #endif + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y -24 + #endif + #ifndef TOUCH_ORIENTATION + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE + #endif + + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + #define LCD_BACKLIGHT_PIN PD13 + #ifndef TFT_WIDTH + #define TFT_WIDTH 480 + #endif + #ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 + #endif + + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + + #define TFT_BUFFER_SIZE 14400 + +#elif HAS_SPI_LCD + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define LCD_BACKLIGHT_PIN -1 + + // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) + #if ENABLED(MKS_MINI_12864) + //#define LCD_BACKLIGHT_PIN -1 + //#define LCD_RESET_PIN -1 + #define DOGLCD_A0 PD11 + #define DOGLCD_CS PE15 + //#define DOGLCD_SCK PA5 + //#define DOGLCD_MOSI PA7 + + // Required for MKS_MINI_12864 with this board + //#define MKS_LCD12864B + //#undef SHOW_BOOTSCREEN + + #else // !MKS_MINI_12864 + + #define LCD_PINS_D4 PE14 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PE15 + #define LCD_PINS_D6 PD11 + #define LCD_PINS_D7 PD10 + #endif + + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + + #endif // !MKS_MINI_12864 + +#elif ENABLED(SPI_GRAPHICAL_TFT) + #define SPI_TFT_CS_PIN PD11 + #define SPI_TFT_SCK_PIN PA5 + #define SPI_TFT_MISO_PIN PA6 + #define SPI_TFT_MOSI_PIN PA7 + #define SPI_TFT_DC_PIN PD10 + #define SPI_TFT_RST_PIN PC6 + + #define LCD_BACKLIGHT_PIN PD13 + + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 +#endif // HAS_SPI_LCD + +#define HAS_OTG_USB_HOST_SUPPORT diff --git a/buildroot/share/PlatformIO/boards/genericSTM32F407VGT6.json b/buildroot/share/PlatformIO/boards/genericSTM32F407VGT6.json new file mode 100644 index 0000000000..8c211a8549 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/genericSTM32F407VGT6.json @@ -0,0 +1,56 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F407xx -DSTM32F4", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f407vgt6", + "product_line": "STM32F407xx", + "variant": "Generic_F4x7Vx" + }, + "debug": { + "default_tools": [ + "stlink" + ], + "jlink_device": "STM32F407VG", + "openocd_extra_args": [ + "-c", + "reset_config none" + ], + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd" + }, + "frameworks": [ + "arduino", + "cmsis", + "stm32cube", + "libopencm3" + ], + "name": "STM32F407VG (128k RAM, 64k CCM RAM, 1024k Flash", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 131072, + "maximum_size": 1048576, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-high-performance-mcus/stm32f4-series/stm32f407-417/stm32f407vg.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c new file mode 100644 index 0000000000..0fbd848dab --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c @@ -0,0 +1,408 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + * Automatically generated from STM32F407V(E-G)Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +// Some pins can perform PWM from more than one timer. These were selected to utilize as many channels as +// possible from timers which were already dedicated to PWM output. + +// TIM1 = Pins are using for OTG FS +// TIM2 = [HEATER_BED], TIM2 is used OTG HS SOF +// TIM6 = Tone +// TIM8 = [FAN0, HEATER_1] OTG HS +// TIM7 = Servo +// TIM9 = [HEATER_0, ] +// TIM1, TIM8, TIM12 = Pins are using for OTG HS +// No timer = [FAN1 ] + +WEAK const PinMap PinMap_PWM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + {PB_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + // {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + // {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {NC, NP, 0} +}; +#endif + +//*** ETHERNET *** + +#ifdef HAL_ETH_MODULE_ENABLED +WEAK const PinMap PinMap_Ethernet[] = { + {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS + {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK + {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO + {PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL + {PA_7, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS_DV|ETH_RX_DV + {PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 + {PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 + {PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + {PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + {PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER + {PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + {PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + {PB_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + {PC_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDC + {PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 + {PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK + {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 + {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 + {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + {NC, NP, 0} +}; +#endif + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_FS[] = { + // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; +#endif + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_HS[] = { +#ifdef USE_USB_HS_IN_FS + // {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF + // {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + // {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP +#else + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT +#endif /* USE_USB_HS_IN_FS */ + {NC, NP, 0} +}; +#endif + +//*** SD *** + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PinNamesVar.h new file mode 100644 index 0000000000..2424885937 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PinNamesVar.h @@ -0,0 +1,50 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_SOF = PA_8, + USB_OTG_FS_VBUS = PA_9, + USB_OTG_FS_ID = PA_10, + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, + USB_OTG_HS_ULPI_D0 = PA_3, + USB_OTG_HS_SOF = PA_4, + USB_OTG_HS_ULPI_CK = PA_5, + USB_OTG_HS_ULPI_D1 = PB_0, + USB_OTG_HS_ULPI_D2 = PB_1, + USB_OTG_HS_ULPI_D7 = PB_5, + USB_OTG_HS_ULPI_D3 = PB_10, + USB_OTG_HS_ULPI_D4 = PB_11, + USB_OTG_HS_ID = PB_12, + USB_OTG_HS_ULPI_D5 = PB_12, + USB_OTG_HS_ULPI_D6 = PB_13, + USB_OTG_HS_VBUS = PB_13, + USB_OTG_HS_DM = PB_14, + USB_OTG_HS_DP = PB_15, + USB_OTG_HS_ULPI_STP = PC_0, + USB_OTG_HS_ULPI_DIR = PC_2, + USB_OTG_HS_ULPI_NXT = PC_3, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h new file mode 100644 index 0000000000..d3c2f6bd02 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h @@ -0,0 +1,495 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

      © Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

      + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +// #define HAL_CAN_MODULE_ENABLED +/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +#define HAL_CRC_MODULE_ENABLED +// #define HAL_CEC_MODULE_ENABLED +// #define HAL_CRYP_MODULE_ENABLED +#define HAL_DAC_MODULE_ENABLED +// #define HAL_DCMI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +// #define HAL_DMA2D_MODULE_ENABLED +// #define HAL_ETH_MODULE_ENABLED +// #define HAL_FLASH_MODULE_ENABLED +// #define HAL_NAND_MODULE_ENABLED +// #define HAL_NOR_MODULE_ENABLED +// #define HAL_PCCARD_MODULE_ENABLED +// #define HAL_SRAM_MODULE_ENABLED +// #define HAL_SDRAM_MODULE_ENABLED +// #define HAL_HASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +// #define HAL_EXTI_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +// #define HAL_SMBUS_MODULE_ENABLED +// #define HAL_I2S_MODULE_ENABLED +// #define HAL_IWDG_MODULE_ENABLED +// #define HAL_LTDC_MODULE_ENABLED +// #define HAL_DSI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +// #define HAL_QSPI_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +// #define HAL_RNG_MODULE_ENABLED +// #define HAL_RTC_MODULE_ENABLED +// #define HAL_SAI_MODULE_ENABLED +// #define HAL_SD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +// #define HAL_UART_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +// #define HAL_IRDA_MODULE_ENABLED +// #define HAL_SMARTCARD_MODULE_ENABLED +// #define HAL_WWDG_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +// #define HAL_PCD_MODULE_ENABLED +// #define HAL_HCD_MODULE_ENABLED +// #define HAL_FMPI2C_MODULE_ENABLED +// #define HAL_SPDIFRX_MODULE_ENABLED +// #define HAL_DFSDM_MODULE_ENABLED +// #define HAL_LPTIM_MODULE_ENABLED +// #define HAL_MMC_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 0x0FU /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +// #define USE_FULL_ASSERT 1U + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x0010) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x0011) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x0012) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld new file mode 100644 index 0000000000..19eec62fba --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld @@ -0,0 +1,203 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F4x7Vx Device with +** 512/1024KByte FLASH, 192KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,†without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

      © COPYRIGHT(c) 2019 STMicroelectronics

      +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.cpp new file mode 100644 index 0000000000..3721d4f5b5 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.cpp @@ -0,0 +1,275 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Digital PinName array +const PinName digitalPin[] = { + PA_0, // Digital pin 0 + PA_1, // Digital pin 1 + PA_2, // Digital pin 2 + PA_3, // Digital pin 3 + PA_4, // Digital pin 4 + PA_5, // Digital pin 5 + PA_6, // Digital pin 6 + PA_7, // Digital pin 7 + PA_8, // Digital pin 8 + PA_9, // Digital pin 9 + PA_10, // Digital pin 10 + PA_11, // Digital pin 11 + PA_12, // Digital pin 12 + PA_13, // Digital pin 13 + PA_14, // Digital pin 14 + PA_15, // Digital pin 15 + + PB_0, // Digital pin 16 + PB_1, // Digital pin 17 + PB_2, // Digital pin 18 + PB_3, // Digital pin 19 + PB_4, // Digital pin 20 + PB_5, // Digital pin 21 + PB_6, // Digital pin 22 + PB_7, // Digital pin 23 + PB_8, // Digital pin 24 + PB_9, // Digital pin 25 + PB_10, // Digital pin 26 + PB_11, // Digital pin 27 + PB_12, // Digital pin 28 + PB_13, // Digital pin 29 + PB_14, // Digital pin 30 + PB_15, // Digital pin 31 + + PC_0, // Digital pin 32 + PC_1, // Digital pin 33 + PC_2, // Digital pin 34 + PC_3, // Digital pin 35 + PC_4, // Digital pin 36 + PC_5, // Digital pin 37 + PC_6, // Digital pin 38 + PC_7, // Digital pin 39 + PC_8, // Digital pin 40 + PC_9, // Digital pin 41 + PC_10, // Digital pin 42 + PC_11, // Digital pin 43 + PC_12, // Digital pin 44 + PC_13, // Digital pin 45 + PC_14, // Digital pin 46 + PC_15, // Digital pin 47 + + PD_0, // Digital pin 48 + PD_1, // Digital pin 49 + PD_2, // Digital pin 50 + PD_3, // Digital pin 51 + PD_4, // Digital pin 52 + PD_5, // Digital pin 53 + PD_6, // Digital pin 54 + PD_7, // Digital pin 55 + PD_8, // Digital pin 56 + PD_9, // Digital pin 57 + PD_10, // Digital pin 58 + PD_11, // Digital pin 59 + PD_12, // Digital pin 60 + PD_13, // Digital pin 61 + PD_14, // Digital pin 62 + PD_15, // Digital pin 63 + + PE_0, // Digital pin 64 + PE_1, // Digital pin 65 + PE_2, // Digital pin 66 + PE_3, // Digital pin 67 + PE_4, // Digital pin 68 + PE_5, // Digital pin 69 + PE_6, // Digital pin 70 + PE_7, // Digital pin 71 + PE_8, // Digital pin 72 + PE_9, // Digital pin 73 + PE_10, // Digital pin 74 + PE_11, // Digital pin 75 + PE_12, // Digital pin 76 + PE_13, // Digital pin 77 + PE_14, // Digital pin 78 + PE_15, // Digital pin 79 + + PH_0, // Digital pin 80, used by the external oscillator + PH_1 // Digital pin 81, used by the external oscillator +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 0, // A0, PA0 + 1, // A1, PA1 + 2, // A2, PA2 + 3, // A3, PA3 + 4, // A4, PA4 + 5, // A5, PA5 + 6, // A6, PA6 + 7, // A7, PA7 + 16, // A8, PB0 + 17, // A9, PB1 + 32, // A10, PC0 + 33, // A11, PC1 + 34, // A12, PC2 + 35, // A13, PC3 + 36, // A14, PC4 + 37 // A15, PC5 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * @brief Configures the System clock source, PLL Multiplier and Divider factors, + * AHB/APBx prescalers and Flash settings + * @note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ + +/******************************************************************************/ +/* PLL (clocked by HSE) used as System clock source */ +/******************************************************************************/ +static uint8_t SetSysClock_PLL_HSE(uint8_t bypass) +{ + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + // Enable HSE oscillator and activate PLL with HSE as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + if (bypass == 0) { + RCC_OscInitStruct.HSEState = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT + } else { + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN + } + + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = HSE_VALUE / 1000000L; // Expects an 8 MHz external clock by default. Redefine HSE_VALUE if not + RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336) + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2) + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 168 MHz + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // 42 MHz + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // 84 MHz + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + return 0; // FAIL + } + + /* Output clock on MCO1 pin(PA8) for debugging purpose */ + /* + if (bypass == 0) + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz + else + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz + */ + + return 1; // OK +} + +/******************************************************************************/ +/* PLL (clocked by HSI) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_HSI(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + // Enable HSI oscillator and activate PLL with HSI as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; // VCO input clock = 1 MHz (16 MHz / 16) + RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336) + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2) + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 168 MHz + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // 42 MHz + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // 84 MHz + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + return 0; // FAIL + } + + /* Output clock on MCO1 pin(PA8) for debugging purpose */ + //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 16 MHz + + return 1; // OK +} + +WEAK void SystemClock_Config(void) +{ + /* 1- If fail try to start with HSE and external xtal */ + if (SetSysClock_PLL_HSE(0) == 0) { + /* 2- Try to start with HSE and external clock */ + if (SetSysClock_PLL_HSE(1) == 0) { + /* 3- If fail start with HSI clock */ + if (SetSysClock_PLL_HSI() == 0) { + Error_Handler(); + } + } + } + + /* Ensure CCM RAM clock is enabled */ + __HAL_RCC_CCMDATARAMEN_CLK_ENABLE(); + + /* Output clock on MCO2 pin(PC9) for debugging purpose */ + //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h new file mode 100644 index 0000000000..b53ad32d0f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h @@ -0,0 +1,199 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// | DIGITAL | ANALOG IN | ANALOG OUT | UART/USART | TWI | SPI | SPECIAL | +// |---------|------------|------------|-----------------------|----------------------|-----------------------------------|-----------| +#define PA0 PIN_A0 // | 0 | A0 (ADC1) | | UART4_TX | | | | +#define PA1 PIN_A1 // | 1 | A1 (ADC1) | | UART4_RX | | | | +#define PA2 PIN_A2 // | 2 | A2 (ADC1) | | USART2_TX | | | | +#define PA3 PIN_A3 // | 3 | A3 (ADC1) | | USART2_RX | | | | +#define PA4 PIN_A4 // | 4 | A4 (ADC1) | DAC_OUT1 | | | SPI1_SS, (SPI3_SS) | | +#define PA5 PIN_A5 // | 5 | A5 (ADC1) | DAC_OUT2 | | | SPI1_SCK | | +#define PA6 PIN_A6 // | 6 | A6 (ADC1) | | | | SPI1_MISO | | +#define PA7 PIN_A7 // | 7 | A7 (ADC1) | | | | SPI1_MOSI | | +#define PA8 8 // | 8 | | | | TWI3_SCL | | | +#define PA9 9 // | 9 | | | USART1_TX | | | | +#define PA10 10 // | 10 | | | USART1_RX | | | | +#define PA11 11 // | 11 | | | | | | | +#define PA12 12 // | 12 | | | | | | | +#define PA13 13 // | 13 | | | | | | SWD_SWDIO | +#define PA14 14 // | 14 | | | | | | SWD_SWCLK | +#define PA15 15 // | 15 | | | | | SPI3_SS, (SPI1_SS) | | +// |---------|------------|------------|-----------------------|----------------------|-----------------------------------|-----------| +#define PB0 PIN_A8 // | 16 | A8 (ADC1) | | | | | | +#define PB1 PIN_A9 // | 17 | A9 (ADC1) | | | | | | +#define PB2 18 // | 18 | | | | | | BOOT1 | +#define PB3 19 // | 19 | | | | | SPI3_SCK, (SPI1_SCK) | | +#define PB4 20 // | 20 | | | | | SPI3_MISO, (SPI1_MISO) | | +#define PB5 21 // | 21 | | | | | SPI3_MOSI, (SPI1_MOSI) | | +#define PB6 22 // | 22 | | | USART1_TX | TWI1_SCL | | | +#define PB7 23 // | 23 | | | USART1_RX | TWI1_SDA | | | +#define PB8 24 // | 24 | | | | TWI1_SCL | | | +#define PB9 25 // | 25 | | | | TWI1_SDA | SPI2_SS | | +#define PB10 26 // | 26 | | | USART3_TX, (UART4_TX) | TWI2_SCL | SPI2_SCK | | +#define PB11 27 // | 27 | | | USART3_RX | TWI2_SDA | | | +#define PB12 28 // | 28 | | | | | SPI2_SS | | +#define PB13 29 // | 29 | | | | | SPI2_SCK | | +#define PB14 30 // | 30 | | | | | SPI2_MISO | | +#define PB15 31 // | 31 | | | | | SPI2_MOSI | | +// |---------|------------|------------|-----------------------|----------------------|-----------------------------------|-----------| +#define PC0 PIN_A10 // | 32 | A10 (ADC1) | | | | | | +#define PC1 PIN_A11 // | 33 | A11 (ADC1) | | | | | | +#define PC2 PIN_A12 // | 34 | A12 (ADC1) | | | | SPI2_MISO | | +#define PC3 PIN_A13 // | 35 | A13 (ADC1) | | | | SPI2_MOSI | | +#define PC4 PIN_A14 // | 36 | A14 (ADC1) | | | | | | +#define PC5 PIN_A15 // | 37 | A15 (ADC1) | | USART3_RX | | | | +#define PC6 38 // | 38 | | | USART6_TX | | | | +#define PC7 39 // | 39 | | | USART6_RX | | | | +#define PC8 40 // | 40 | | | | | | | +#define PC9 41 // | 41 | | | USART3_TX | TWI3_SDA | | | +#define PC10 42 // | 42 | | | | | SPI3_SCK | | +#define PC11 43 // | 43 | | | USART3_RX, (UART4_RX) | | SPI3_MISO | | +#define PC12 44 // | 44 | | | UART5_TX | | SPI3_MOSI | | +#define PC13 45 // | 45 | | | | | | | +#define PC14 46 // | 46 | | | | | | OSC32_IN | +#define PC15 47 // | 47 | | | | | | OSC32_OUT | +// |---------|------------|------------|-----------------------|----------------------|-----------------------------------|-----------| +#define PD0 48 // | 48 | | | | | | | +#define PD1 49 // | 49 | | | | | | | +#define PD2 50 // | 50 | | | UART5_RX | | | | +#define PD3 51 // | 51 | | | | | | | +#define PD4 52 // | 52 | | | | | | | +#define PD5 53 // | 53 | | | USART2_TX | | | | +#define PD6 54 // | 54 | | | USART2_RX | | | | +#define PD7 55 // | 55 | | | | | | | +#define PD8 56 // | 56 | | | USART3_TX | | | | +#define PD9 57 // | 57 | | | USART3_RX | | | | +#define PD10 58 // | 58 | | | | | | | +#define PD11 59 // | 59 | | | | | | | +#define PD12 60 // | 60 | | | | | | | +#define PD13 61 // | 61 | | | | | | | +#define PD14 62 // | 62 | | | | | | | +#define PD15 63 // | 63 | | | | | | | +// |---------|------------|------------|-----------------------|----------------------|-----------------------------------|-----------| +#define PE0 64 // | 64 | | | | | | | +#define PE1 65 // | 65 | | | | | | | +#define PE2 66 // | 66 | | | | | | | +#define PE3 67 // | 67 | | | | | | | +#define PE4 68 // | 68 | | | | | | | +#define PE5 69 // | 69 | | | | | | | +#define PE6 70 // | 70 | | | | | | | +#define PE7 71 // | 71 | | | | | | | +#define PE8 72 // | 72 | | | | | | | +#define PE9 73 // | 73 | | | | | | | +#define PE10 74 // | 74 | | | | | | | +#define PE11 75 // | 75 | | | | | | | +#define PE12 76 // | 76 | | | | | | | +#define PE13 77 // | 77 | | | | | | | +#define PE14 78 // | 78 | | | | | | | +#define PE15 79 // | 79 | | | | | | | +// |---------|------------|------------|-----------------------|----------------------|-----------------------------------|-----------| +#define PH0 80 // | 80 | | | | | | OSC_IN | +#define PH1 81 // | 81 | | | | | | OSC_OUT | +// |---------|------------|------------|-----------------------|----------------------|-----------------------------------|-----------| + +/// This must be a literal +#define NUM_DIGITAL_PINS 82 +#define NUM_ANALOG_INPUTS 16 + +// On-board LED pin number +#ifndef LED_BUILTIN +#define LED_BUILTIN PA5 +#endif +#define LED_GREEN LED_BUILTIN + +// On-board user button +#ifndef USER_BTN +#define USER_BTN PC13 +#endif + +// SPI definitions +#define PIN_SPI_SS PA4 +#define PIN_SPI_SS1 PA4 +#define PIN_SPI_SS2 PB12 +#define PIN_SPI_SS3 PA15 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + +// I2C definitions +#define PIN_WIRE_SDA PB9 +#define PIN_WIRE_SCL PB8 + +// Timer Definitions +// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin +#ifndef TIMER_TONE + #define TIMER_TONE TIM6 +#endif +#ifndef TIMER_SERVO + #define TIMER_SERVO TIM7 +#endif +#ifndef TIMER_SERIAL + #define TIMER_SERIAL TIM5 +#endif + +// UART Definitions +#define SERIAL_UART_INSTANCE 2 + +// Default pin used for 'Serial' instance +// Mandatory for Firmata +#define PIN_SERIAL_RX PA3 +#define PIN_SERIAL_TX PA2 + +/* Extra HAL modules */ +#define HAL_DAC_MODULE_ENABLED + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE Serial1 +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/platformio.ini b/platformio.ini index 2a0901d14d..11918bc35a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1377,6 +1377,28 @@ extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/stm32_bootloader.py buildroot/share/PlatformIO/scripts/mks_encrypt.py +# +# MKS Robin Nano V3 +# +[env:mks_robin_nano_v3] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC +board = genericSTM32F407VGT6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.firmware = Robin_nano_v3.bin +board_build.offset = 0xC000 +board_upload.offset_address = 0x0800C000 +build_unflags = ${common_stm32.build_unflags} +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py + ################################# # # # Other Architectures # From f7f531e59de9c8daa1bff70535cb4a4bc8dcc7ed Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Fri, 18 Dec 2020 23:21:00 +0100 Subject: [PATCH 0743/1370] DOGM: Slow down touchscreen calibration (#20454) --- Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 600d7e3faa..cbb05bc356 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -525,6 +525,11 @@ U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, lcd_put_u8str(0, LCD_PIXEL_HEIGHT / 2, str); } while (u8g.nextPage()); drawing_screen = false; + safe_delay(250); + if (calibration_stage == CALIBRATION_SUCCESS) { + safe_delay(500); + ui.goto_previous_screen(); + } } #endif // TOUCH_SCREEN_CALIBRATION From e02fd232ba6f6217f896ff82038ea6c2acfc77c2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 18 Dec 2020 21:13:37 -0600 Subject: [PATCH 0744/1370] Rename QUIET_PROBING --- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 4 ++-- Marlin/src/module/motion.cpp | 4 ++-- Marlin/src/module/probe.cpp | 10 +++++----- Marlin/src/module/probe.h | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 3510cb2115..3ce7043f4f 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2373,7 +2373,7 @@ #endif #if HAS_BED_PROBE && (EITHER(PROBING_HEATERS_OFF, PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0) - #define QUIET_PROBING 1 + #define HAS_QUIET_PROBING 1 #endif #if EITHER(ADVANCED_PAUSE_FEATURE, PROBING_HEATERS_OFF) #define HEATER_IDLE_HANDLER 1 diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index ad91c404aa..acd19d69e4 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -104,7 +104,7 @@ static int8_t bed_corner; #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) bltouch.deploy(); // DEPLOY in LOW SPEED MODE on every probe action #endif - TERN_(QUIET_PROBING, probe.set_probing_paused(true)); + TERN_(HAS_QUIET_PROBING, probe.set_probing_paused(true)); // Move down until the probe is triggered do_blocking_move_to_z(last_z - (LEVEL_CORNERS_PROBE_TOLERANCE), manual_feedrate_mm_s.z); @@ -141,7 +141,7 @@ static int8_t bed_corner; TERN_(LEVEL_CORNERS_VERIFY_RAISED, verify_corner = true); } - TERN_(QUIET_PROBING, probe.set_probing_paused(false)); + TERN_(HAS_QUIET_PROBING, probe.set_probing_paused(false)); #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) bltouch.stow(); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 127ba80788..45ec513149 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1321,7 +1321,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t if (is_home_dir) { - #if HOMING_Z_WITH_PROBE && QUIET_PROBING + #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING if (axis == Z_AXIS) probe.set_probing_paused(true); #endif @@ -1360,7 +1360,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t if (is_home_dir) { - #if HOMING_Z_WITH_PROBE && QUIET_PROBING + #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING if (axis == Z_AXIS) probe.set_probing_paused(false); #endif diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 17949a4420..bcd3a03a9a 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -73,7 +73,7 @@ #include "../feature/tmc_util.h" #endif -#if QUIET_PROBING +#if HAS_QUIET_PROBING #include "stepper/indirection.h" #endif @@ -236,7 +236,7 @@ xyz_pos_t Probe::offset; // Initialized by settings.load() #endif // Z_PROBE_ALLEN_KEY -#if QUIET_PROBING +#if HAS_QUIET_PROBING void Probe::set_probing_paused(const bool p) { TERN_(PROBING_HEATERS_OFF, thermalManager.pause(p)); @@ -254,7 +254,7 @@ xyz_pos_t Probe::offset; // Initialized by settings.load() ); } -#endif // QUIET_PROBING +#endif // HAS_QUIET_PROBING /** * Raise Z to a minimum height to make room for a probe to move @@ -437,7 +437,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { endstops.enable(true); #endif - TERN_(QUIET_PROBING, set_probing_paused(true)); + TERN_(HAS_QUIET_PROBING, set_probing_paused(true)); // Move down until the probe is triggered do_blocking_move_to_z(z, fr_mm_s); @@ -451,7 +451,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { #endif ; - TERN_(QUIET_PROBING, set_probing_paused(false)); + TERN_(HAS_QUIET_PROBING, set_probing_paused(false)); // Re-enable stealthChop if used. Disable diag1 pin on driver. #if ENABLED(SENSORLESS_PROBING) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index e5ad892e37..137d360175 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -202,7 +202,7 @@ public: static void servo_probe_init(); #endif - #if QUIET_PROBING + #if HAS_QUIET_PROBING static void set_probing_paused(const bool p); #endif From a4701fbd3e78c8c84b9ac54092330072c82d0a24 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 8 Dec 2020 20:22:30 -0600 Subject: [PATCH 0745/1370] Tweaks for pins_BTT_SKR_common.h --- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index a75eb6ae5d..279c7e8100 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -21,7 +21,7 @@ */ #pragma once -#ifdef SKR_HAS_LPC1769 +#if ENABLED(SKR_HAS_LPC1769) #if NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." #endif @@ -35,9 +35,9 @@ #if BOTH(HAS_WIRED_LCD, HAS_BTT_EXP_MOT) #if EITHER(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) - #define EXP_MOT_USE_EXP2_ONLY + #define EXP_MOT_USE_EXP2_ONLY 1 #else - #error "Having a LCD that uses both EXP1/EXP2 and a expanion motor module on EXP1/EXP2 is not possible." + #error "You can't use both an LCD and a Motor Expansion Module on EXP1/EXP2 at the same time." #endif #endif @@ -146,7 +146,7 @@ #define E2_STEP_PIN EXPA2_05_PIN #define E2_DIR_PIN EXPA2_06_PIN #define E2_ENABLE_PIN EXPA2_04_PIN - #ifndef EXP_MOT_USE_EXP2_ONLY + #if !EXP_MOT_USE_EXP2_ONLY #define E2_DIAG_PIN EXPA1_06_PIN #define E2_CS_PIN EXPA1_05_PIN #if HAS_TMC_UART @@ -158,7 +158,7 @@ // M2 on Driver Expansion Module #define E3_STEP_PIN EXPA2_08_PIN #define E3_DIR_PIN EXPA2_07_PIN - #ifndef EXP_MOT_USE_EXP2_ONLY + #if !EXP_MOT_USE_EXP2_ONLY #define E3_ENABLE_PIN EXPA1_03_PIN #define E3_DIAG_PIN EXPA1_08_PIN #define E3_CS_PIN EXPA1_07_PIN @@ -173,7 +173,7 @@ // M3 on Driver Expansion Module #define E4_STEP_PIN EXPA2_10_PIN #define E4_DIR_PIN EXPA2_09_PIN - #ifndef EXP_MOT_USE_EXP2_ONLY + #if !EXP_MOT_USE_EXP2_ONLY #define E4_ENABLE_PIN EXPA1_04_PIN #define E4_DIAG_PIN EXPA1_10_PIN #define E4_CS_PIN EXPA1_09_PIN From 87fbb8933016ebe7db64c019e0649bca7567e488 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 19 Dec 2020 19:48:31 -0800 Subject: [PATCH 0746/1370] Let boards set Default TMC Slave Addresses (#20498) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 32 ++++++------- Marlin/src/inc/Conditionals_post.h | 48 +++++++++++++++++++ .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h | 14 ++++++ .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h | 22 +++++++-- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 18 +++++-- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 24 ++++++++-- buildroot/tests/STM32F103RC_btt-tests | 4 -- 7 files changed, 130 insertions(+), 32 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index aed29d0f2c..51c2b8f994 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2473,22 +2473,22 @@ * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers * on the same serial port, either here or in your board's pins file. */ - #define X_SLAVE_ADDRESS 0 - #define Y_SLAVE_ADDRESS 0 - #define Z_SLAVE_ADDRESS 0 - #define X2_SLAVE_ADDRESS 0 - #define Y2_SLAVE_ADDRESS 0 - #define Z2_SLAVE_ADDRESS 0 - #define Z3_SLAVE_ADDRESS 0 - #define Z4_SLAVE_ADDRESS 0 - #define E0_SLAVE_ADDRESS 0 - #define E1_SLAVE_ADDRESS 0 - #define E2_SLAVE_ADDRESS 0 - #define E3_SLAVE_ADDRESS 0 - #define E4_SLAVE_ADDRESS 0 - #define E5_SLAVE_ADDRESS 0 - #define E6_SLAVE_ADDRESS 0 - #define E7_SLAVE_ADDRESS 0 + //#define X_SLAVE_ADDRESS 0 + //#define Y_SLAVE_ADDRESS 0 + //#define Z_SLAVE_ADDRESS 0 + //#define X2_SLAVE_ADDRESS 0 + //#define Y2_SLAVE_ADDRESS 0 + //#define Z2_SLAVE_ADDRESS 0 + //#define Z3_SLAVE_ADDRESS 0 + //#define Z4_SLAVE_ADDRESS 0 + //#define E0_SLAVE_ADDRESS 0 + //#define E1_SLAVE_ADDRESS 0 + //#define E2_SLAVE_ADDRESS 0 + //#define E3_SLAVE_ADDRESS 0 + //#define E4_SLAVE_ADDRESS 0 + //#define E5_SLAVE_ADDRESS 0 + //#define E6_SLAVE_ADDRESS 0 + //#define E7_SLAVE_ADDRESS 0 /** * Software enable diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 3ce7043f4f..e9ea26aa7a 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1647,6 +1647,54 @@ #ifndef E7_INTERPOLATE #define E7_INTERPOLATE INTERPOLATE #endif + #ifndef X_SLAVE_ADDRESS + #define X_SLAVE_ADDRESS 0 + #endif + #ifndef Y_SLAVE_ADDRESS + #define Y_SLAVE_ADDRESS 0 + #endif + #ifndef Z_SLAVE_ADDRESS + #define Z_SLAVE_ADDRESS 0 + #endif + #ifndef X2_SLAVE_ADDRESS + #define X2_SLAVE_ADDRESS 0 + #endif + #ifndef Y2_SLAVE_ADDRESS + #define Y2_SLAVE_ADDRESS 0 + #endif + #ifndef Z2_SLAVE_ADDRESS + #define Z2_SLAVE_ADDRESS 0 + #endif + #ifndef Z3_SLAVE_ADDRESS + #define Z3_SLAVE_ADDRESS 0 + #endif + #ifndef Z4_SLAVE_ADDRESS + #define Z4_SLAVE_ADDRESS 0 + #endif + #ifndef E0_SLAVE_ADDRESS + #define E0_SLAVE_ADDRESS 0 + #endif + #ifndef E1_SLAVE_ADDRESS + #define E1_SLAVE_ADDRESS 0 + #endif + #ifndef E2_SLAVE_ADDRESS + #define E2_SLAVE_ADDRESS 0 + #endif + #ifndef E3_SLAVE_ADDRESS + #define E3_SLAVE_ADDRESS 0 + #endif + #ifndef E4_SLAVE_ADDRESS + #define E4_SLAVE_ADDRESS 0 + #endif + #ifndef E5_SLAVE_ADDRESS + #define E5_SLAVE_ADDRESS 0 + #endif + #ifndef E6_SLAVE_ADDRESS + #define E6_SLAVE_ADDRESS 0 + #endif + #ifndef E7_SLAVE_ADDRESS + #define E7_SLAVE_ADDRESS 0 + #endif #endif #if (HAS_E_DRIVER(TMC2660) \ diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h index 78751a6bac..a09da02e15 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h @@ -34,4 +34,18 @@ #define Y_HARDWARE_SERIAL MSerial4 #define Z_HARDWARE_SERIAL MSerial4 #define E0_HARDWARE_SERIAL MSerial4 + + // Default TMC slave addresses + #ifndef X_SLAVE_ADDRESS + #define X_SLAVE_ADDRESS 0 + #endif + #ifndef Y_SLAVE_ADDRESS + #define Y_SLAVE_ADDRESS 2 + #endif + #ifndef Z_SLAVE_ADDRESS + #define Z_SLAVE_ADDRESS 1 + #endif + #ifndef E0_SLAVE_ADDRESS + #define E0_SLAVE_ADDRESS 3 + #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h index 8ed30bffb7..cc4bf46e15 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h @@ -49,13 +49,27 @@ #define CONTROLLER_FAN_PIN FAN1_PIN #endif -/** - * TMC220x stepper drivers - * Hardware serial communication ports. - */ #if HAS_TMC_UART + /** + * TMC220x stepper drivers + * Hardware serial communication ports + */ #define X_HARDWARE_SERIAL MSerial4 #define Y_HARDWARE_SERIAL MSerial4 #define Z_HARDWARE_SERIAL MSerial4 #define E0_HARDWARE_SERIAL MSerial4 + + // Default TMC slave addresses + #ifndef X_SLAVE_ADDRESS + #define X_SLAVE_ADDRESS 0 + #endif + #ifndef Y_SLAVE_ADDRESS + #define Y_SLAVE_ADDRESS 2 + #endif + #ifndef Z_SLAVE_ADDRESS + #define Z_SLAVE_ADDRESS 1 + #endif + #ifndef E0_SLAVE_ADDRESS + #define E0_SLAVE_ADDRESS 3 + #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index aebb776b29..3919723f37 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -87,19 +87,30 @@ #define E0_ENABLE_PIN PC13 #if HAS_TMC_UART - /** * TMC2208/TMC2209 stepper drivers */ - // // Hardware serial with switch - // #define X_HARDWARE_SERIAL MSerial2 #define Y_HARDWARE_SERIAL MSerial2 #define Z_HARDWARE_SERIAL MSerial2 #define E0_HARDWARE_SERIAL MSerial2 + // Default TMC slave addresses + #ifndef X_SLAVE_ADDRESS + #define X_SLAVE_ADDRESS 0 + #endif + #ifndef Y_SLAVE_ADDRESS + #define Y_SLAVE_ADDRESS 1 + #endif + #ifndef Z_SLAVE_ADDRESS + #define Z_SLAVE_ADDRESS 2 + #endif + #ifndef E0_SLAVE_ADDRESS + #define E0_SLAVE_ADDRESS 3 + #endif + // The 4xTMC2209 module doesn't have a serial multiplexer and // needs to set *_SLAVE_ADDRESS in Configuration_adv.h for X,Y,Z,E0 #if HAS_DRIVER(TMC2208) @@ -110,7 +121,6 @@ // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 - #endif // diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index b8a4ccf770..c978092ab2 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -80,10 +80,26 @@ #define E0_DIR_PIN PC14 #define E0_ENABLE_PIN PC13 -#define X_HARDWARE_SERIAL MSerial2 -#define Y_HARDWARE_SERIAL MSerial2 -#define Z_HARDWARE_SERIAL MSerial2 -#define E0_HARDWARE_SERIAL MSerial2 +#if HAS_TMC_UART + #define X_HARDWARE_SERIAL MSerial2 + #define Y_HARDWARE_SERIAL MSerial2 + #define Z_HARDWARE_SERIAL MSerial2 + #define E0_HARDWARE_SERIAL MSerial2 + + // Default TMC slave addresses + #ifndef X_SLAVE_ADDRESS + #define X_SLAVE_ADDRESS 0 + #endif + #ifndef Y_SLAVE_ADDRESS + #define Y_SLAVE_ADDRESS 1 + #endif + #ifndef Z_SLAVE_ADDRESS + #define Z_SLAVE_ADDRESS 2 + #endif + #ifndef E0_SLAVE_ADDRESS + #define E0_SLAVE_ADDRESS 3 + #endif +#endif // // Heaters / Fans diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests index 5d695c9296..0084f59a0c 100755 --- a/buildroot/tests/STM32F103RC_btt-tests +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -17,10 +17,6 @@ opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2209 opt_set Z_DRIVER_TYPE TMC2209 opt_set E0_DRIVER_TYPE TMC2209 -opt_set X_SLAVE_ADDRESS 0 -opt_set Y_SLAVE_ADDRESS 1 -opt_set Z_SLAVE_ADDRESS 2 -opt_set E0_SLAVE_ADDRESS 3 opt_enable PINS_DEBUGGING exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" From 588fec647482492ece2a5c666937e936b4b42b63 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 19 Dec 2020 23:02:38 -0500 Subject: [PATCH 0747/1370] Minimum temp options for Probing and G12 Nozzle Clean (#20383) Co-authored-by: Jason Smith Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 13 ++++++++++- Marlin/src/gcode/bedlevel/abl/G29.cpp | 27 +++++----------------- Marlin/src/inc/Conditionals_LCD.h | 16 +++++++++++++ Marlin/src/inc/SanityCheck.h | 4 ++++ Marlin/src/libs/nozzle.cpp | 17 ++++++++++++++ Marlin/src/module/probe.cpp | 33 +++++++++++++++++++++++++++ Marlin/src/module/probe.h | 4 ++++ buildroot/tests/LPC1768-tests | 3 ++- buildroot/tests/rambo-tests | 2 +- 9 files changed, 95 insertions(+), 24 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index adf6a3d536..0c166d5dda 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1067,6 +1067,13 @@ //#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing //#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors +// Require minimum nozzle and/or bed temperature for probing. +//#define PREHEAT_BEFORE_PROBING +#if ENABLED(PREHEAT_BEFORE_PROBING) + #define PROBING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time + #define PROBING_BED_TEMP 50 +#endif + // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 // :{ 0:'Low', 1:'High' } #define X_ENABLE_ON 0 @@ -1296,7 +1303,7 @@ */ //#define PREHEAT_BEFORE_LEVELING #if ENABLED(PREHEAT_BEFORE_LEVELING) - #define LEVELING_NOZZLE_TEMP 120 + #define LEVELING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time #define LEVELING_BED_TEMP 50 #endif @@ -1666,6 +1673,10 @@ // For a purge/clean station mounted on the X axis //#define NOZZLE_CLEAN_NO_Y + // Require a minimum hotend temperature for cleaning + #define NOZZLE_CLEAN_MIN_TEMP 170 + //#define NOZZLE_CLEAN_HEATUP // Heat up the nozzle instead of skipping wipe + // Explicit wipe G-code script applies to a G12 with no arguments. //#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0" diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 157353c063..8e87bb4f7d 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -36,12 +36,9 @@ #include "../../../module/probe.h" #include "../../queue.h" -#if EITHER(PROBE_TEMP_COMPENSATION, PREHEAT_BEFORE_LEVELING) - #include "../../../module/temperature.h" -#endif - #if ENABLED(PROBE_TEMP_COMPENSATION) #include "../../../feature/probe_temp_comp.h" + #include "../../../module/temperature.h" #endif #if HAS_DISPLAY @@ -404,25 +401,13 @@ G29_TYPE GcodeSuite::G29() { ExtUI::onMeshLevelingStart(); #endif - if (!faux) remember_feedrate_scaling_off(); + if (!faux) { + remember_feedrate_scaling_off(); - #if ENABLED(PREHEAT_BEFORE_LEVELING) - #ifndef LEVELING_NOZZLE_TEMP - #define LEVELING_NOZZLE_TEMP 0 + #if ENABLED(PREHEAT_BEFORE_LEVELING) + if (!dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, LEVELING_BED_TEMP); #endif - #ifndef LEVELING_BED_TEMP - #define LEVELING_BED_TEMP 0 - #endif - if (!dryrun && !faux) { - constexpr uint16_t hotendPreheat = LEVELING_NOZZLE_TEMP, bedPreheat = LEVELING_BED_TEMP; - if (DEBUGGING(LEVELING)) - DEBUG_ECHOLNPAIR("Preheating hotend (", hotendPreheat, ") and bed (", bedPreheat, ")"); - if (hotendPreheat) thermalManager.setTargetHotend(hotendPreheat, 0); - if (bedPreheat) thermalManager.setTargetBed(bedPreheat); - if (hotendPreheat) thermalManager.wait_for_hotend(0); - if (bedPreheat) thermalManager.wait_for_bed_heating(); - } - #endif + } // Disable auto bed leveling during G29. // Be formal so G29 can be done successively without G28. diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 9c080ee286..c683753600 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -819,6 +819,22 @@ #define TOTAL_PROBING MULTIPLE_PROBING #endif #endif + #if ENABLED(PREHEAT_BEFORE_PROBING) + #ifndef PROBING_NOZZLE_TEMP + #define PROBING_NOZZLE_TEMP 0 + #endif + #ifndef PROBING_BED_TEMP + #define PROBING_BED_TEMP 0 + #endif + #endif + #if ENABLED(PREHEAT_BEFORE_LEVELING) + #ifndef LEVELING_NOZZLE_TEMP + #define LEVELING_NOZZLE_TEMP 0 + #endif + #ifndef LEVELING_BED_TEMP + #define LEVELING_BED_TEMP 0 + #endif + #endif #else // Clear probe pin settings when no probe is selected #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index be7d97e2ca..904ef0d38a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1514,6 +1514,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif #endif +#if BOTH(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) + #error "Disable PREHEAT_BEFORE_LEVELING when using PREHEAT_BEFORE_PROBING." +#endif + /** * Homing */ diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 10021005e5..4277e8d8d0 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -31,6 +31,10 @@ Nozzle nozzle; #include "../MarlinCore.h" #include "../module/motion.h" +#if NOZZLE_CLEAN_MIN_TEMP > 20 + #include "../module/temperature.h" +#endif + #if ENABLED(NOZZLE_CLEAN_FEATURE) /** @@ -153,6 +157,19 @@ Nozzle nozzle; const uint8_t arrPos = ANY(SINGLENOZZLE, MIXING_EXTRUDER) ? 0 : active_extruder; + #if NOZZLE_CLEAN_MIN_TEMP > 20 + if (thermalManager.degTargetHotend(arrPos) < NOZZLE_CLEAN_MIN_TEMP) { + #if ENABLED(NOZZLE_CLEAN_HEATUP) + SERIAL_ECHOLNPGM("Nozzle too Cold - Heating"); + thermalManager.setTargetHotend(NOZZLE_CLEAN_MIN_TEMP, arrPos); + thermalManager.wait_for_hotend(arrPos); + #else + SERIAL_ECHOLNPGM("Nozzle too cold - Skipping wipe"); + return; + #endif + } + #endif + #if HAS_SOFTWARE_ENDSTOPS #define LIMIT_AXIS(A) do{ \ diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index bcd3a03a9a..63b1928c76 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -325,6 +325,36 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #endif } +#if EITHER(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) + + /** + * Do preheating as required before leveling or probing + */ + void Probe::preheat_for_probing(const uint16_t hotend_temp, const uint16_t bed_temp) { + #if PROBING_NOZZLE_TEMP || LEVELING_NOZZLE_TEMP + #define WAIT_FOR_NOZZLE_HEAT + #endif + #if PROBING_BED_TEMP || LEVELING_BED_TEMP + #define WAIT_FOR_BED_HEAT + #endif + const uint16_t hotendPreheat = TERN0(WAIT_FOR_NOZZLE_HEAT, thermalManager.degHotend(0) < hotend_temp) ? hotend_temp : 0, + bedPreheat = TERN0(WAIT_FOR_BED_HEAT, thermalManager.degBed() < bed_temp) ? bed_temp : 0; + DEBUG_ECHOPGM("Preheating "); + if (hotendPreheat) { + DEBUG_ECHOPAIR("hotend (", hotendPreheat, ") "); + if (bedPreheat) DEBUG_ECHOPGM("and "); + } + if (bedPreheat) DEBUG_ECHOPAIR("bed (", bedPreheat, ") "); + DEBUG_EOL(); + + TERN_(WAIT_FOR_NOZZLE_HEAT, if (hotendPreheat) thermalManager.setTargetHotend(hotendPreheat, 0)); + TERN_(WAIT_FOR_BED_HEAT, if (bedPreheat) thermalManager.setTargetBed(bedPreheat)); + TERN_(WAIT_FOR_NOZZLE_HEAT, if (hotendPreheat) thermalManager.wait_for_hotend(0)); + TERN_(WAIT_FOR_BED_HEAT, if (bedPreheat) thermalManager.wait_for_bed_heating()); + } + +#endif + /** * Attempt to deploy or stow the probe * @@ -392,6 +422,9 @@ bool Probe::set_deployed(const bool deploy) { #endif + // If preheating is required before any probing... + TERN_(PREHEAT_BEFORE_PROBING, if (deploy) preheat_for_probing(PROBING_NOZZLE_TEMP, PROBING_BED_TEMP)); + do_blocking_move_to(old_xy); endstops.enable_z_probe(deploy); return false; diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 137d360175..3ee699b4db 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -51,6 +51,10 @@ public: static xyz_pos_t offset; + #if EITHER(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) + static void preheat_for_probing(const uint16_t hotend_temp, const uint16_t bed_temp); + #endif + static bool set_deployed(const bool deploy); #if IS_KINEMATIC diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests index b8d0730314..72d794634f 100755 --- a/buildroot/tests/LPC1768-tests +++ b/buildroot/tests/LPC1768-tests @@ -39,7 +39,7 @@ opt_set TEMP_SENSOR_1 -1 opt_set TEMP_SENSOR_BED 5 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING SOUND_MENU_ITEM \ - NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR PREHEAT_BEFORE_LEVELING G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ @@ -47,6 +47,7 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT ADAPTIVE_FAN_ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER opt_set GRID_MAX_POINTS_X 16 opt_set NOZZLE_TO_PROBE_OFFSET "{ 0, 0, 0 }" +opt_set NOZZLE_CLEAN_MIN_TEMP 170 exec_test $1 $2 "Re-ARM with NOZZLE_AS_PROBE and many features." "$3" # clean up diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index f93b2d14f2..5bc1b39f7e 100755 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -25,7 +25,7 @@ opt_set FANMUX0_PIN 53 opt_disable USE_WATCHDOG opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ - PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ + PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ From 3e26e23e60c64498f341e0d9d2ebbe3c41cdd5bc Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 19 Dec 2020 23:11:43 -0500 Subject: [PATCH 0748/1370] Probe Tare, Probe Activation Switch (#20379) Co-authored-by: Scott Lahteine Co-authored-by: Victor Mateus Oliveira Co-authored-by: Jason Smith --- Marlin/Configuration.h | 27 ++++++++++++++ Marlin/src/core/language.h | 1 + Marlin/src/gcode/probe/M401_M402.cpp | 1 + Marlin/src/inc/SanityCheck.h | 8 +++++ Marlin/src/module/endstops.cpp | 21 ++++++++--- Marlin/src/module/motion.cpp | 7 ++-- Marlin/src/module/probe.cpp | 37 +++++++++++++++++++- Marlin/src/module/probe.h | 4 +++ buildroot/tests/STM32F103RET6_creality-tests | 9 +++++ 9 files changed, 108 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0c166d5dda..5fe746a77f 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1006,6 +1006,33 @@ // Feedrate (mm/min) for the "accurate" probe of each point #define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) +/** + * Probe Activation Switch + * A switch indicating proper deployment, or an optical + * switch triggered when the carriage is near the bed. + */ +//#define PROBE_ACTIVATION_SWITCH +#if ENABLED(PROBE_ACTIVATION_SWITCH) + #define PROBE_ACTIVATION_SWITCH_STATE LOW // State indicating probe is active + //#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Override default pin +#endif + +/** + * Tare Probe (determine zero-point) prior to each probe. + * Useful for a strain gauge or piezo sensor that needs to factor out + * elements such as cables pulling on the carriage. + */ +//#define PROBE_TARE +#if ENABLED(PROBE_TARE) + #define PROBE_TARE_TIME 200 // (ms) Time to hold tare pin + #define PROBE_TARE_DELAY 200 // (ms) Delay after tare before + #define PROBE_TARE_STATE HIGH // State to write pin for tare + //#define PROBE_TARE_PIN PA5 // Override default pin + #if ENABLED(PROBE_ACTIVATION_SWITCH) + //#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active + #endif +#endif + /** * Multiple Probing * diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index f1e477933a..98d155e1d1 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -154,6 +154,7 @@ #define STR_Z4_MIN "z4_min" #define STR_Z4_MAX "z4_max" #define STR_Z_PROBE "z_probe" +#define STR_PROBE_EN "probe_en" #define STR_FILAMENT_RUNOUT_SENSOR "filament" #define STR_PROBE_OFFSET "Probe Offset" #define STR_SKEW_MIN "min_skew_factor: " diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp index 8e9bd11b81..bd9bb44c40 100644 --- a/Marlin/src/gcode/probe/M401_M402.cpp +++ b/Marlin/src/gcode/probe/M401_M402.cpp @@ -33,6 +33,7 @@ */ void GcodeSuite::M401() { probe.deploy(); + TERN_(PROBE_TARE, probe.tare()); report_current_position(); } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 904ef0d38a..0ff80dc964 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1409,6 +1409,14 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "Z_SAFE_HOMING is recommended when homing with a probe. Enable it or comment out this line to continue." #endif + #if ENABLED(PROBE_ACTIVATION_SWITCH) + #ifndef PROBE_ACTIVATION_SWITCH_STATE + #error "PROBE_ACTIVATION_SWITCH_STATE is required for PROBE_ACTIVATION_SWITCH." + #elif !PIN_EXISTS(PROBE_ACTIVATION_SWITCH) + #error "A PROBE_ACTIVATION_SWITCH_PIN is required for PROBE_ACTIVATION_SWITCH." + #endif + #endif + #else /** diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index ef0b92a7ee..1467e1b70d 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -280,6 +280,12 @@ void Endstops::init() { #endif #endif + #if ENABLED(PROBE_ACTIVATION_SWITCH) + SET_INPUT(PROBE_ACTIVATION_SWITCH_PIN); + #endif + + TERN_(PROBE_TARE, probe.tare()); + TERN_(ENDSTOP_INTERRUPTS_FEATURE, setup_endstop_interrupts()); // Enable endstops @@ -458,6 +464,9 @@ void _O2 Endstops::report_states() { #if HAS_Z4_MAX ES_REPORT(Z4_MAX); #endif + #if BOTH(MARLIN_DEV_MODE, PROBE_ACTIVATION_SWITCH) + print_es_state(READ(PROBE_ACTIVATION_SWITCH_PIN) == PROBE_ACTIVATION_SWITCH_STATE, PSTR(STR_PROBE_EN)); + #endif #if HAS_CUSTOM_PROBE_PIN print_es_state(PROBE_TRIGGERED(), PSTR(STR_Z_PROBE)); #endif @@ -582,7 +591,7 @@ void Endstops::update() { #endif #endif - #if HAS_Z_MIN && !Z_SPI_SENSORLESS + #if HAS_Z_MIN && NONE(Z_SPI_SENSORLESS, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) UPDATE_ENDSTOP_BIT(Z, MIN); #if ENABLED(Z_MULTI_ENDSTOPS) #if HAS_Z2_MIN @@ -607,9 +616,13 @@ void Endstops::update() { #endif #endif - // When closing the gap check the enabled probe - #if HAS_CUSTOM_PROBE_PIN - UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); + #if HAS_BED_PROBE + // When closing the gap check the enabled probe + if (true + #if ENABLED(PROBE_ACTIVATION_SWITCH) + || READ(PROBE_ACTIVATION_SWITCH_PIN) == PROBE_ACTIVATION_SWITCH_STATE + #endif + ) UPDATE_ENDSTOP_BIT(Z, TERN(HAS_CUSTOM_PROBE_PIN, MIN_PROBE, MIN)); #endif #if HAS_Z_MAX && !Z_SPI_SENSORLESS diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 45ec513149..3800bc6b0a 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1589,8 +1589,11 @@ void homeaxis(const AxisEnum axis) { // Fast move towards endstop until triggered if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Home 1 Fast:"); - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) - if (axis == Z_AXIS && bltouch.deploy()) return; // The initial DEPLOY + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS) { + if (TERN0(BLTOUCH, bltouch.deploy())) return; + if (TERN0(PROBE_TARE, probe.tare())) return; + } #endif #if DISABLED(DELTA) && defined(SENSORLESS_BACKOFF_MM) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 63b1928c76..261fde4913 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -512,6 +512,33 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { return !probe_triggered; } +#if ENABLED(PROBE_TARE) + /** + * @brief Tare the Z probe + * + * @details Signal to the probe to tare itself + * + * @return TRUE if the tare cold not be completed + */ + bool Probe::tare() { + #if BOTH(PROBE_ACTIVATION_SWITCH, PROBE_TARE_ONLY_WHILE_INACTIVE) + if (READ(PROBE_ACTIVATION_SWITCH_PIN) == PROBE_ACTIVATION_SWITCH_STATE) { + SERIAL_ECHOLNPGM("Cannot tare an active probe"); + return true; + } + #endif + + SERIAL_ECHOLNPGM("Taring probe"); + OUT_WRITE(PROBE_TARE_PIN, PROBE_TARE_STATE); + delay(PROBE_TARE_TIME); + OUT_WRITE(PROBE_TARE_PIN, !PROBE_TARE_STATE); + delay(PROBE_TARE_DELAY); + + endstops.hit_on_purpose(); + return false; + } +#endif + /** * @brief Probe at the current XY (possibly more than once) to find the bed Z. * @@ -523,8 +550,11 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { float Probe::run_z_probe(const bool sanity_check/*=true*/) { DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); - auto try_to_probe = [&](PGM_P const plbl, const float &z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) { + auto try_to_probe = [&](PGM_P const plbl, const float &z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) -> bool { // Do a first probe at the fast speed + + if (TERN0(PROBE_TARE, tare())) return true; + const bool probe_fail = probe_down_to_z(z_probe_low_point, fr_mm_s), // No probe trigger? early_fail = (scheck && current_position.z > -offset.z + clearance); // Probe triggered too high? #if ENABLED(DEBUG_LEVELING_FEATURE) @@ -549,6 +579,8 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { #if TOTAL_PROBING == 2 // Do a first probe at the fast speed + if (TERN0(PROBE_TARE, tare())) return NAN; + if (try_to_probe(PSTR("FAST"), z_probe_low_point, z_probe_fast_mm_s, sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return NAN; @@ -586,6 +618,9 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { ) #endif { + // If the probe won't tare, return + if (TERN0(PROBE_TARE, tare())) return true; + // Probe downward slowly to find the bed if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_SLOW), sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return NAN; diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 3ee699b4db..49520eb334 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -210,6 +210,10 @@ public: static void set_probing_paused(const bool p); #endif + #if ENABLED(PROBE_TARE) + static bool tare(); + #endif + private: static bool probe_down_to_z(const float z, const feedRate_t fr_mm_s); static void do_z_raise(const float z_raise); diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests index 4e6c4f988b..cc3275741b 100755 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -19,3 +19,12 @@ opt_add SDCARD_EEPROM_EMULATION exec_test $1 $2 "Ender 3 v2, SD EEPROM, w/o CLASSIC_JERK" "$3" restore_configs +opt_set SERIAL_PORT 1 +opt_set MOTHERBOARD BOARD_CREALITY_V452 +opt_disable NOZZLE_TO_PROBE_OFFSET +opt_enable NOZZLE_AS_PROBE Z_SAFE_HOMING Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN +opt_enable PROBE_ACTIVATION_SWITCH PROBE_ACTIVATION_SWITCH_PIN PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE +exec_test $1 $2 "Creality V4.5.2 PROBE_ACTIVATION_SWITCH, Probe Tare" "$3" + +# clean up +restore_configs From 56e2f391751bb45d237d9118fba5f5486ab0b0fd Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 19 Dec 2020 21:55:57 -0800 Subject: [PATCH 0749/1370] Fix Creality EEPROM watchdog freq. (#20510) --- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp index 9a7e4d799d..a6395698aa 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -48,6 +48,7 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + size_t written = 0; while (size--) { uint8_t v = *value; uint8_t * const p = (uint8_t * const)pos; @@ -55,7 +56,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui // so only write bytes that have changed! if (v != eeprom_read_byte(p)) { eeprom_write_byte(p, v); - if (size & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; From 642110b0726f956105b45b3c27b6ad1b9b65ae88 Mon Sep 17 00:00:00 2001 From: Foxies Date: Sun, 20 Dec 2020 07:17:24 +0100 Subject: [PATCH 0750/1370] Migrate Hispeedv1 (QQS-Pro) to HAL/STM32 (#20354) --- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 59 ++++++++++---------- platformio.ini | 29 ++++++---- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index c20af310cc..4d83e5703c 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -60,6 +60,9 @@ // Note: FLSun Hispeed (clone MKS_Robin_miniV2) board is using SPI2 interface. // #define SPI_DEVICE 2 +#define SCK_PIN PB13 // SPI2 +#define MISO_PIN PB14 // SPI2 +#define MOSI_PIN PB15 // SPI2 // SPI Flash #define HAS_SPI_FLASH 1 @@ -269,43 +272,42 @@ #error "FLSun HiSpeed default BEEPER_PIN is not a SPEAKER." #endif -/** - * Note: MKS Robin TFT screens use various TFT controllers - * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) - * ILI9488 is not supported - * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp - * - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - * - * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu - * because Marlin uses the reset as a failsafe to revive a glitchy LCD. - */ +#if HAS_FSMC_TFT || HAS_GRAPHICAL_TFT + #define TFT_CS_PIN PD7 // NE4 + #define TFT_RS_PIN PD11 // A0 +#endif -// QQS-Pro uses MKS Robin TFT v2.0 320x240 - -// Shared FSMC Configs #if HAS_FSMC_TFT - #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h - #define DOGLCD_SCK -1 - - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define TFT_RESET_PIN PC6 // FSMC_RST + /** + * Note: MKS Robin TFT screens use various TFT controllers + * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) + * ILI9488 is not supported + * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp + * + * If the screen stays white, disable 'LCD_RESET_PIN' + * to let the bootloader init the screen. + * + * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu + * because Marlin uses the reset as a failsafe to revive a glitchy LCD. + */ + //#define TFT_RESET_PIN PC6 // FSMC_RST #define TFT_BACKLIGHT_PIN PD13 + #define FSMC_CS_PIN TFT_CS_PIN // NE4 + #define FSMC_RS_PIN TFT_RS_PIN // A0 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - - #define TFT_BUFFER_SIZE 14400 - #if ENABLED(TFT_CLASSIC_UI) - #define TFT_MARLINBG_COLOR 0x3186 // White - #define TFT_MARLINUI_COLOR 0xC7B6 // green + #ifdef TFT_CLASSIC_UI + #define TFT_MARLINBG_COLOR 0x3186 // Grey + #define TFT_MARLINUI_COLOR 0xC7B6 // Green #define TFT_BTARROWS_COLOR 0xDEE6 // Yellow #define TFT_BTOKMENU_COLOR 0x145F // Cyan - #endif + #endif + #define TFT_BUFFER_SIZE 14400 +#elif HAS_GRAPHICAL_TFT + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 #endif #if NEED_TOUCH_PINS @@ -313,4 +315,5 @@ #define TOUCH_SCK_PIN PB13 // SPI2_SCK #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + #define TOUCH_INT_PIN -1 #endif diff --git a/platformio.ini b/platformio.ini index 11918bc35a..d907ee68d0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1150,18 +1150,25 @@ debug_tool = jlink upload_protocol = jlink # -# FLSUN QQ (STM32F103VET6) +# FLSUN QQS Pro (STM32F103VET6) using hal STM32 +# board Hispeedv1 # -[env:flsun_hispeed] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_mini.py - buildroot/share/PlatformIO/scripts/add_nanolib.py -build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -lib_deps = SoftwareSerialM - #Adafruit NeoPixel=https://github.com/Foxies-CSTL/Robin-NeoPixel-Lib/archive/master.zip +[env:flsun_hispeedv1] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 +board = genericSTM32F103VE +board_build.core = stm32 +board_build.variant = MARLIN_F103Vx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.firmware = Robin_mini.bin +board_upload.offset_address = 0x08007000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py # # STM32F401VE From c831aabe14608bbc68e60128e0d90483c98fec4d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 20 Dec 2020 00:27:04 -0600 Subject: [PATCH 0751/1370] Languages cleanup --- Marlin/src/lcd/language/language_cz.h | 4 ---- Marlin/src/lcd/language/language_de.h | 4 ---- Marlin/src/lcd/language/language_en.h | 14 ++++++-------- Marlin/src/lcd/language/language_es.h | 4 ---- Marlin/src/lcd/language/language_gl.h | 4 ---- Marlin/src/lcd/language/language_hu.h | 4 ---- Marlin/src/lcd/language/language_it.h | 4 ---- Marlin/src/lcd/language/language_pl.h | 4 ---- Marlin/src/lcd/language/language_pt.h | 14 ++++++-------- Marlin/src/lcd/language/language_pt_br.h | 14 ++++++-------- Marlin/src/lcd/language/language_ro.h | 4 ---- Marlin/src/lcd/language/language_ru.h | 4 ---- Marlin/src/lcd/language/language_sk.h | 18 ++++++------------ Marlin/src/lcd/language/language_tr.h | 4 ---- Marlin/src/lcd/language/language_uk.h | 4 ---- Marlin/src/lcd/language/language_zh_CN.h | 4 ---- Marlin/src/lcd/language/language_zh_TW.h | 4 ---- 17 files changed, 24 insertions(+), 88 deletions(-) diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index f102e02188..adcbba7720 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -98,12 +98,8 @@ namespace Language_cz { PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Zahřát vlastní"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Zchladit"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Ovládání laseru"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Vypnout laser"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Zapnout laser"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon laseru"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("VÅ™eteno ovládání"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("VÅ™eteno vyp"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("VÅ™eteno zap"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("VÅ™eteno výkon"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("VÅ™eteno opaÄnÄ›"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnout napájení"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 1827fd062d..265c30c733 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -92,12 +92,8 @@ namespace Language_de { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Abkühlen"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequenz"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser aus"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser an"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laserleistung"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindel-Steuerung"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindel aus"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindel an"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindelleistung"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindelrichtung"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Netzteil ein"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index b7d767aa3b..194a75c6a0 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -682,14 +682,12 @@ namespace Language_en { PROGMEM Language_Str MSG_SOUND = _UxGT("Sound"); - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Top Left"); - PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Bottom Left"); - PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Top Right"); - PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Bottom Right"); - PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibration Completed"); - PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibration Failed"); - #endif + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Top Left"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Bottom Left"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Top Right"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Bottom Right"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibration Completed"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibration Failed"); } #if FAN_COUNT == 1 diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 362d2480c1..7a25ca7a93 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -95,12 +95,8 @@ namespace Language_es { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Enfriar"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Láser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Apagar Láser"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Encender Láser"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potencia Láser"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Control Mandrino"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Apagar Mandrino"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Encender Mandrino"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potencia Mandrino"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Invertir giro"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Encender Fuente"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index b0a42a9f90..379a25497f 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -92,12 +92,8 @@ namespace Language_gl { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Arrefriar"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Láser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Láser Apagado"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Láser Aceso"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potencia Láser"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Control Fuso"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Fuso Apagado"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Fuso Aceso"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potencia Fuso"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverter xiro"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Acender"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index acd27c96aa..21655be6fb 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -94,12 +94,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Visszahütés"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer Vezérlés"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lézer Ki"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lézer Be"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer Teljesítmény"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó Vezérlés"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Orsó Ki"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Orsó Be"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó Teljesítmény"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó Hátra"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bekapcsolás"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index ffc6d31a9a..ba2fef456a 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -107,12 +107,8 @@ namespace Language_it { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Raffredda"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequenza"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Controllo laser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Off"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser On"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potenza laser"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Controllo mandrino"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Mandrino Off"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Mandrino On"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potenza mandrino"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Accendi aliment."); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 47d7162dee..bf7d32e222 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -89,12 +89,8 @@ namespace Language_pl { PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Rozgrzej wÅ‚asne ust."); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("ChÅ‚odzenie"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Sterowanie Lasera"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("WyÅ‚Ä…cz Laser"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("WÅ‚Ä…cz Laser"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Zasilanie Lasera"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Sterowanie wrzeciona"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("WyÅ‚Ä…cz wrzeciono"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("WÅ‚Ä…cz wrzeciono"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Zasilanie wrzeciona"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Rewers wrzeciona"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("WÅ‚Ä…cz zasilacz"); diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 2dc53993b6..60b0c55056 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -161,12 +161,10 @@ namespace Language_pt { PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora Incorreta"); - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Superior Esquerdo"); - PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Inferior Esquerdo"); - PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Superior Direto"); - PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Inferior Direto"); - PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibração Completa"); - PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibração Falhou"); - #endif + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Superior Esquerdo"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Inferior Esquerdo"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Superior Direto"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Inferior Direto"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibração Completa"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibração Falhou"); } diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 06226b84ed..4ddf424b3d 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -479,12 +479,10 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Continuando...")); #endif - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Superior Esquerdo"); - PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Inferior Esquerdo"); - PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Superior Direto"); - PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Inferior Direto"); - PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibração Completa"); - PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibração Falhou"); - #endif + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Superior Esquerdo"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Inferior Esquerdo"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Superior Direto"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Inferior Direto"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibração Completa"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibração Falhou"); } diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 459cc5ee3d..db07ac5c68 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -91,12 +91,8 @@ namespace Language_ro { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Racire"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecventa"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Laser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Oprit"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser Pornit"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Puterea Laserului"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Controlul Spindle"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Oprit"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle Pornit"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Puterea Spindle"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Invers"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Porneste"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 85dc58a15a..30a8d2fec1 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -98,12 +98,8 @@ namespace Language_ru { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждение"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Управление лазером"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Выключить лазер"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Включить лазер"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("МощноÑÑ‚ÑŒ лазера"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Управление шпинделем"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Выключить шпиндель"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Включить шпиндель"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("МощноÑÑ‚ÑŒ шпинделÑ"); #else diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 9a1e13e2c8..1900f53719 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -102,12 +102,8 @@ namespace Language_sk { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("SchladiÅ¥"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Nastavenie lasera"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Vypnúť laser"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Zapnúť laser"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon lasera"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Nastavenie vretena"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Vypnúť vreteno"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Zapnúť vreteno"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Výkon vretena"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spätný chod"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnúť napájanie"); @@ -656,12 +652,10 @@ namespace Language_sk { PROGMEM Language_Str MSG_SOUND = _UxGT("Zvuk"); - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Ľavý horný"); - PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Ľavý dolný"); - PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Pravý horný"); - PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Pravý dolný"); - PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrácia dokonÄená"); - PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Kalibrácia zlyhala"); - #endif + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Ľavý horný"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Ľavý dolný"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Pravý horný"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Pravý dolný"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrácia dokonÄená"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Kalibrácia zlyhala"); } diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 57c814ad48..ca6357027c 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -94,12 +94,8 @@ namespace Language_tr { PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Özel Ön Isınma"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("SoÄŸut/(Durdur)"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lazer Kontrolü"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lazeri Kapat"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lazeri Aç"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lazer Gücü"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindle Kontrolü"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Kapat"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle Aç"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Gücü"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Ters Yön"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Gücü Aç"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 2aa483de50..8916effd27 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -100,8 +100,6 @@ namespace Language_uk { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Вимкнути нагрів"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ð°Ð·ÐµÑ€Ð¾Ð¼"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Вимкнути лазер"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Увімкнути лазер"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_LASER_POWER = _UxGT("ПотужніÑÑ‚ÑŒ лазера"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐ¿Ñ–Ð½Ð´ÐµÐ»ÐµÐ¼"); @@ -109,8 +107,6 @@ namespace Language_uk { PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Потуж.лазера"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керув. шпінделем"); #endif - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Вимкнути шпіндель"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Увімкнути шпіндель"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінделÑ"); #else diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index a4134969aa..cd43ee3b39 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -89,12 +89,8 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("é™æ¸©"); //"Cooldown" PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("切割频率"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("激光控制"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("激光关"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("激光开"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("激光电æº"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("主轴控制"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("主轴关"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("主轴开"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("主轴电æº"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("主轴å转"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("电æºæ‰“å¼€"); //"Switch power on" diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 4654f770ea..f86b15351f 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -87,12 +87,8 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("自定é ç†±"); //"Preheat Custom" PROGMEM Language_Str MSG_COOLDOWN = _UxGT("é™æº«"); //"Cooldown" PROGMEM Language_Str MSG_LASER_MENU = _UxGT("激光控制"); //"Laser Control" - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("激光 é—œ"); //"Laser Off" - PROGMEM Language_Str MSG_LASER_ON = _UxGT("激光 é–‹"); //"Laser On" PROGMEM Language_Str MSG_LASER_POWER = _UxGT("激光電æº"); //"Laser Power" PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("主軸控告制"); //"Spindle Control" - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("主軸 é—œ"); //"Spindle Off" - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("主軸 é–‹"); //"Spindle On" PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("主軸電æº"); //"Spindle Power" PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("主軸å轉"); //"Spindle Reverse" PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("é›»æºæ‰“é–‹"); //"Switch power on" From 525cdeae190e099bf1d7e4b89840f4d41cac3282 Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Sun, 20 Dec 2020 08:33:23 +0200 Subject: [PATCH 0752/1370] Update Russian and Ukrainian languages (#20508) --- Marlin/src/lcd/language/language_ru.h | 73 ++++++++++++++++++++++++--- Marlin/src/lcd/language/language_uk.h | 72 ++++++++++++++++++++++++-- 2 files changed, 135 insertions(+), 10 deletions(-) diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 30a8d2fec1..ffaa406f18 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -43,6 +43,11 @@ namespace Language_ru { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD-карта вÑтавлена"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD-карта извлечена"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Ð’Ñтавьте SD-карту"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Сбой инициализации SD"); + #else + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Сбой инициализ. SD"); + #endif PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Ошибка ÑчитываниÑ"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB диÑк удалён"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Ошибка USB диÑка"); @@ -65,6 +70,9 @@ namespace Language_ru { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Парковка Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Парковка Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Ðвто Z-выравнивание"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 ИтерациÑ: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Уменьшение точноÑти!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("ТочноÑÑ‚ÑŒ доÑтигнута"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Ðулевое положение"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Ðажмите чтобы начать"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ°"); @@ -98,14 +106,18 @@ namespace Language_ru { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждение"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Управление лазером"); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Переключить лазер"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("МощноÑÑ‚ÑŒ лазера"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Управление шпинделем"); + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Переключить шпиндель"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("МощноÑÑ‚ÑŒ шпинделÑ"); #else PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Мощн.шпинделÑ"); #endif + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Шпиндель вперёд"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("ИнверÑÐ¸Ñ ÑˆÐ¿Ð¸Ð½Ð´ÐµÐ»Ñ"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Включить питание"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Выключить питание"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("ЭкÑтрузиÑ"); @@ -132,14 +144,15 @@ namespace Language_ru { PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 теÑÑ‚ Z-зонда"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Отклонение"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 точка"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Зонд за пределами"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Меню IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Размещение Ñопел"); PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Ðвто парковка"); PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Размножение"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Полный контроль"); - - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Размещение Ñопел"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("Дублировать X-зазор"); PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2-е Ñопло X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2-е Ñопло Y"); @@ -161,10 +174,8 @@ namespace Language_ru { PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("ДвигаемÑÑ Ð´Ð°Ð»ÑŒÑˆÐµ"); PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Ðктивировать UBL"); PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивировать UBL"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Редактор Ñеток"); PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Править Ñвою Ñетку"); - #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура Ñтола"); PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура Ñтола"); @@ -249,6 +260,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Ðет хранилища"); PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Ошибка: Сохран. UBL"); PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Ошибка: ВоÑÑтан.UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Смещение Z: "); PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Смещение Z оÑтанов."); PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL пошагово"); PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Строить холодную"); @@ -271,6 +283,14 @@ namespace Language_ru { PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Фиолетовый"); PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Белый"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Свет по умолчанию"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Канал ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Свет #2"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Свет #2 предуÑтановки"); + #else + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Свет #2 предуÑтан."); + #endif + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("ЯркоÑÑ‚ÑŒ"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Свой цвет подÑветки"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Уровень краÑного"); PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Уровень зелёного"); @@ -414,9 +434,11 @@ namespace Language_ru { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Готово"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Ðазад"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Продолжить"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("ПропуÑтить"); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Пауза печати"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Продолжить печать"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Старт Ñ Ñ…Ð¾Ñта"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("ОÑтановить печать"); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Печать объекта"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Завершить объект"); @@ -519,6 +541,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Смещение X"); PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Смещение Y"); PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Смещение Z"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Двигать Ñопло к Ñтолу"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Микрошаг X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Микрошаг Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Микрошаг Z"); @@ -539,8 +562,10 @@ namespace Language_ru { PROGMEM Language_Str MSG_HEATING = _UxGT("Ðагрев..."); PROGMEM Language_Str MSG_COOLING = _UxGT("Охлаждение..."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ðагрев Ñтола..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ðагрев камеры..."); PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охлаждение Ñтола..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Ðагрев зонда..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Охлаждение зонда..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ðагрев камеры..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охладжение камеры..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калибровка Delta"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калибровать X"); @@ -660,6 +685,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("ПерезапуÑк MMU"); PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("ПерезапуÑк MMU..."); PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Удалите и нажмите"); + #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_MIX = _UxGT("Смешивание"); #else @@ -679,8 +705,8 @@ namespace Language_ru { PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Конец Ð’-инÑтрумента"); PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдоним Ð’-инÑтрумента"); PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð¡Ð±Ñ€Ð¾Ñ Ð’-инÑтрументов"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-инÑтрументи Ñброшены"); PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Смешать Ð’-инÑтрументи"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-инÑтрументи Ñброшены"); #else PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перекл. Ñмешивание"); PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Ðктив.Ð’-инÑтрум."); @@ -688,8 +714,8 @@ namespace Language_ru { PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ð’-инÑтрум.кон."); PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдоним Ð’-инÑÑ‚Ñ€."); PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð¡Ð±Ñ€Ð¾Ñ Ð’-инÑтрум."); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-инÑтрум. Ñброшены"); PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Смешать Ð’-инÑтрум."); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-инÑтрум. Ñброшены"); #endif PROGMEM Language_Str MSG_START_Z = _UxGT("Ðачало Z"); PROGMEM Language_Str MSG_END_Z = _UxGT(" Конец Z"); @@ -708,6 +734,21 @@ namespace Language_ru { PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ÐŸÐ¾Ð»Ð¾Ñ…Ð°Ñ Ñкор.Ñтран."); #endif + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Редактировать пароль"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Ðужен логин"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("ÐаÑтройки паролÑ"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Введите цифру"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Смените пароль"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Удалить пароль"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Пароль Ñто "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Старт через"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Запомни Ð´Ð»Ñ ÑохранениÑ!"); + #else + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Запомни, Ñохрани!"); + #endif + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Пароль удалён"); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Парковка...")); // // Filament Change screens show up to 3 lines on a 4-line display @@ -759,6 +800,24 @@ namespace Language_ru { #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("Возобновить нагрев"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Ðагрев..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("МаÑтер Z-зонда"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Зондиров. контрольной точки Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Движение к точке зондированиÑ"); + #else + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Зондир.контр.точки Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Движ. к точке зондир."); + #endif + + PROGMEM Language_Str MSG_SOUND = _UxGT("Звук"); + + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Верхний левый"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Ðижний левый"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Верхний правый"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Ðижний правый"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Калибровка уÑпешна"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Ошибка калибровки"); } #if FAN_COUNT == 1 diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 8916effd27..b0bffd2009 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -44,6 +44,11 @@ namespace Language_uk { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD-картка вÑтавлена"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD-картка видалена"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Ð’Ñтавте SD-картку"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Збій ініціалізації SD"); + #else + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Збій ініціаліз. SD"); + #endif PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Помилка зчитуваннÑ"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB диÑк видалений"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Помилка USB диÑку"); @@ -67,6 +72,9 @@ namespace Language_uk { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Ðвто Z-вирівнюваннÑ"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 ІтераціÑ: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Ð—Ð¼ÐµÐ½ÑŒÑˆÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾ÑÑ‚Ñ–!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("ТочніÑÑ‚ÑŒ доÑÑгнута"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Почати"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("ÐаÑтупна точка"); @@ -100,6 +108,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Вимкнути нагрів"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ð°Ð·ÐµÑ€Ð¾Ð¼"); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Перемкнути лазер"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_LASER_POWER = _UxGT("ПотужніÑÑ‚ÑŒ лазера"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐ¿Ñ–Ð½Ð´ÐµÐ»ÐµÐ¼"); @@ -107,12 +116,15 @@ namespace Language_uk { PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Потуж.лазера"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керув. шпінделем"); #endif + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Перемкнути шпіндель"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінделÑ"); #else PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінд."); #endif + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Шпіндель вперед"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("ÐапрÑмок шпінделÑ"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Увімкнути живленнÑ"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Вимкнути живленнÑ"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("ЕкÑтрузіÑ"); @@ -134,15 +146,20 @@ namespace Language_uk { PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ð†Ð½Ð´ÐµÐºÑ Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Z"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("ВлаÑні команди"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 теÑÑ‚ зонду"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 точка"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Зонд за межами"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("ВідхиленнÑ"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Меню IDEX"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñопел"); PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Ðвто паркуваннÑ"); PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("РозмноженнÑ"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Дзеркальна копіÑ"); - PROGMEM Language_Str MSG_IDEX_MODE_FU1L_CTRL = _UxGT("Повний контроль"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Повний контроль"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("Дублювати X-зазор"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("Друге Ñопло X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("Друге Ñопло Y"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("Друге Ñопло Z"); @@ -267,6 +284,14 @@ namespace Language_uk { PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Фіолетовий"); PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Білий"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("За умовчаннÑм"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Канал ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Світло #2"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Світло #2 передуÑтановки"); + #else + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Світло #2 передуÑтан."); + #endif + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("ЯÑкравіÑÑ‚ÑŒ"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Свої кольори"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Рівень червоного"); PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Рівень зеленого"); @@ -412,10 +437,12 @@ namespace Language_uk { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Готово"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Ðазад"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Продовжити"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("ПропуÑтити"); PROGMEM Language_Str MSG_PAUSING = _UxGT("ПризупиненнÑ..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Призупинити друк"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Відновити друк"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Старт з хоÑту"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("СкаÑувати друк"); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Друк об'єкта"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Завершити об'єкт"); @@ -513,6 +540,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ X"); PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Y"); PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Рухати Ñопло до Ñтолу"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Мікрокрок X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Мікрокрок Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Мікрокрок Z"); @@ -534,13 +562,16 @@ namespace Language_uk { PROGMEM Language_Str MSG_COOLING = _UxGT("ОхолодженнÑ..."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ðагрів Ñтолу..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ðагрів камери..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Ðагрів зонду..."); #if LCD_WIDTH >= 20 PROGMEM Language_Str MSG_BED_COOLING = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñтолу..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ð¸..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð½Ð´Ñƒ..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("ÐšÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Delta"); #else PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охол. Ñтолу..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охол. камери..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Охол. зонду..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібрув. Delta"); #endif PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калібрувати X"); @@ -598,6 +629,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("ПідÑвітка"); PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("ЯÑкравіÑÑ‚ÑŒ Ñвітла"); PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("ÐЕ ТОЙ ПРИÐТЕР"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("ЕкÑтрудовано"); #if LCD_WIDTH >= 20 @@ -662,6 +694,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("ПерезапуÑк MMU"); PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("ПерезапуÑк MMU..."); PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Видаліть, натиÑніть"); + #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_MIX = _UxGT("ЗмішуваннÑ"); #else @@ -681,8 +714,8 @@ namespace Language_uk { PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Кінець Ð’-інÑтрументу"); PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдонім Ð’-інÑтрументу"); PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð—ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð’-інÑтрументів"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрументи зкинуті"); PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати Ð’-інÑтрументи"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрументи зкинуті"); #else PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перемкнути змішув."); PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Ðктив.Ð’-інÑтрум."); @@ -690,8 +723,8 @@ namespace Language_uk { PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ð’-інÑтрум. кін."); PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдонім Ð’-інÑÑ‚Ñ€."); PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð—ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð’-інÑтрум"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрум. зкинуті"); PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати Ð’-інÑтрум."); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрум. зкинуті"); #endif PROGMEM Language_Str MSG_START_Z = _UxGT("Початок Z"); PROGMEM Language_Str MSG_END_Z = _UxGT(" Кінець Z"); @@ -710,6 +743,21 @@ namespace Language_uk { PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидк.Ñтор"); #endif + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Редагувати пароль"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Потрібен логін"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Параметри паролю"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Введіть цифру"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Змінити пароль"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Видалити пароль"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Пароль це "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Старт через"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Запам'Ñтай Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ!"); + #else + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Запам'Ñтай, збережи!"); + #endif + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Пароль видалений"); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("ПаркуваннÑ...")); #if LCD_HEIGHT >= 4 // Up to 3 lines allowed @@ -754,6 +802,24 @@ namespace Language_uk { PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Ð§Ð°Ñ Ð½Ð°Ð³Ñ€Ñ–Ð²Ð°Ñ‡Ð° збіг"); PROGMEM Language_Str MSG_REHEAT = _UxGT("Поновити нагрів"); PROGMEM Language_Str MSG_REHEATING = _UxGT("ÐагріваннÑ..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("МайÑтер Z-зонда"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Зондув. контрольної точки Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Рух до точки зондуваннÑ"); + #else + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Зондув.контр.точки Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Рух до точки зондув."); + #endif + + PROGMEM Language_Str MSG_SOUND = _UxGT("Звук"); + + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Верхній лівий"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Ðижній лівий"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Верхній правий"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Ðижній правий"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("ÐšÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑпішне"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Збій калібруваннÑ"); } #if FAN_COUNT == 1 From 2a58aa2181103f6c097896613a2ef8d4ee978ed2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 20 Dec 2020 00:38:10 -0600 Subject: [PATCH 0753/1370] Fix PIO typo --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index d907ee68d0..e7f22e3f09 100644 --- a/platformio.ini +++ b/platformio.ini @@ -486,7 +486,7 @@ build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide [env:MightyBoard1280] platform = atmelavr extends = mega_extended_optimized -board = megamega1280 +board = megaatmega1280 # # MightyBoard ATmega2560 From be6e1ccba2c5f08ca7dca1a258dae97888278fec Mon Sep 17 00:00:00 2001 From: Dick Streefland Date: Mon, 21 Dec 2020 08:47:49 +0100 Subject: [PATCH 0754/1370] Get E3V2 DWIN `MACHINE_SIZE` from config (#20526) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 38e41ba11e..5a9d555970 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -86,7 +86,7 @@ #endif #ifndef MACHINE_SIZE - #define MACHINE_SIZE "220x220x250" + #define MACHINE_SIZE STRINGIFY(X_BED_SIZE) "x" STRINGIFY(Y_BED_SIZE) "x" STRINGIFY(Z_MAX_POS) #endif #ifndef CORP_WEBSITE_C #define CORP_WEBSITE_C "www.cxsw3d.com" From b799d0d0736ee733d9e1ec7baed8c11e47579233 Mon Sep 17 00:00:00 2001 From: Dick Streefland Date: Mon, 21 Dec 2020 08:49:00 +0100 Subject: [PATCH 0755/1370] Apply HOME_AFTER_DEACTIVATE for 'G28 O' (#20525) --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 23c4d56d93..57c21df765 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -227,7 +227,7 @@ void GcodeSuite::G28() { #endif // Home (O)nly if position is unknown - if (!homing_needed() && parser.boolval('O')) { + if (!axes_should_home() && parser.boolval('O')) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> homing not needed, skip"); return; } From 023ef753b9c6cb04ecad32436ddf93b1cc14fc71 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 21 Dec 2020 17:36:15 -0600 Subject: [PATCH 0756/1370] Clean up some pins --- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 10 +++--- .../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 12 +++---- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 36 +++++++++---------- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index c748dbbed3..a124b4d583 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -48,20 +48,20 @@ // // Limit Switches // -#define X_STOP_PIN PC1 // "X-STOP" -#define Y_STOP_PIN PC0 // "Y-STOP" -#define Z_STOP_PIN PC15 // "Z-STOP" +#define X_STOP_PIN PC1 // X-STOP +#define Y_STOP_PIN PC0 // Y-STOP +#define Z_STOP_PIN PC15 // Z-STOP // // Z Probe must be this pin // -#define Z_MIN_PROBE_PIN PC14 // "PROBE" +#define Z_MIN_PROBE_PIN PC14 // PROBE // // Filament Runout Sensor // #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PC2 // "E0-STOP" + #define FIL_RUNOUT_PIN PC2 // E0-STOP #endif // diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index b65411be8a..9f2513cc82 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -41,25 +41,25 @@ // // Servos // -#define SERVO0_PIN PA1 // "SERVOS" +#define SERVO0_PIN PA1 // SERVOS // // Limit Switches // -#define X_STOP_PIN PC0 // "X-STOP" -#define Y_STOP_PIN PC1 // "Y-STOP" -#define Z_STOP_PIN PC2 // "Z-STOP" +#define X_STOP_PIN PC0 // X-STOP +#define Y_STOP_PIN PC1 // Y-STOP +#define Z_STOP_PIN PC2 // Z-STOP // // Z Probe must be this pin // -#define Z_MIN_PROBE_PIN PC14 // "PROBE" +#define Z_MIN_PROBE_PIN PC14 // PROBE // // Filament Runout Sensor // #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PC15 // "E0-STOP" + #define FIL_RUNOUT_PIN PC15 // E0-STOP #endif // diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index 4d83e5703c..93403b9ddd 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -117,11 +117,7 @@ * Several wiring options are provided below, defaulting to * to the most compatible. */ - -// -// Drivers -// -#if HAS_TMC220x +#if HAS_TMC_UART // SoftwareSerial with one pin per driver // Compatible with TMC2208 and TMC2209 drivers #define X_SERIAL_TX_PIN PA10 // RXD1 @@ -140,20 +136,20 @@ #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } #endif -/** - * MKS Robin_Wifi or another ESP8266 module - * - * __ESP(M1)__ -J1- - * GND| 15 | | 08 |+3v3 (22) RXD1 (PA10) - * | 16 | | 07 |MOSI (21) TXD1 (PA9) Active LOW, probably OK to leave floating - * IO2| 17 | | 06 |MISO (19) IO1 (PC7) Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) - * IO0| 18 | | 05 |CLK (18) IO0 (PA8) Must be HIGH (ESP3D software configures this with a pullup so OK to leave as floating) - * IO1| 19 | | 03 |EN (03) WIFI_EN Must be HIGH for module to run - * | nc | | nc | (01) WIFI_CTRL (PA5) - * RX| 21 | | nc | - * TX| 22 | | 01 |RST - *  ̄ ̄ AE ̄ ̄ - */ + /** + * MKS Robin_Wifi or another ESP8266 module + * + * __ESP(M1)__ -J1- + * GND| 15 | | 08 |+3v3 (22) RXD1 (PA10) + * | 16 | | 07 |MOSI (21) TXD1 (PA9) Active LOW, probably OK to leave floating + * IO2| 17 | | 06 |MISO (19) IO1 (PC7) Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) + * IO0| 18 | | 05 |CLK (18) IO0 (PA8) Must be HIGH (ESP3D software configures this with a pullup so OK to leave as floating) + * IO1| 19 | | 03 |EN (03) WIFI_EN Must be HIGH for module to run + * | nc | | nc | (01) WIFI_CTRL (PA5) + * RX| 21 | | nc | + * TX| 22 | | 01 |RST + *  ̄ ̄ AE ̄ ̄ + */ // Module ESP-WIFI #define ESP_WIFI_MODULE_COM 2 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this #define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT & SERIAL_PORT_2 @@ -303,7 +299,7 @@ #define TFT_MARLINUI_COLOR 0xC7B6 // Green #define TFT_BTARROWS_COLOR 0xDEE6 // Yellow #define TFT_BTOKMENU_COLOR 0x145F // Cyan - #endif + #endif #define TFT_BUFFER_SIZE 14400 #elif HAS_GRAPHICAL_TFT #define TFT_RESET_PIN PC6 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 1362d22086..66d90e0194 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -82,7 +82,7 @@ #define E0_DIR_PIN PB3 #define E0_ENABLE_PIN PB5 -#if HAS_TMC220x +#if HAS_TMC_UART /** * TMC2208/TMC2209 stepper drivers * From 28548e7ea204e41b2a32cd5bb1242b401d42c459 Mon Sep 17 00:00:00 2001 From: Sebastiaan Dammann Date: Sun, 20 Dec 2020 18:10:03 +0100 Subject: [PATCH 0757/1370] Add BTT SKR CR6 board (#20522) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h | 180 +++++++++++++++++++++ buildroot/tests/STM32F103RE_btt_USB-tests | 12 ++ 4 files changed, 195 insertions(+) create mode 100644 Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 15362c4908..ec39ad4e71 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -335,6 +335,7 @@ #define BOARD_FLY_MINI 4042 // FLY MINI (STM32F103RCT6) #define BOARD_FLSUN_HISPEED 4043 // FLSUN HiSpeedV1 (STM32F103VET6) #define BOARD_BEAST 4044 // STM32F103RET6 Libmaple-based controller +#define BOARD_BTT_SKR_CR6 4045 // BigTreeTech SKR CR6 v1.0 (STM32F103RE) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 9d1dab10f6..dbafed2d4e 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -542,6 +542,8 @@ #include "stm32f1/pins_FLSUN_HISPEED.h" // STM32F1 env:flsun_hispeed #elif MB(BEAST) #include "stm32f1/pins_BEAST.h" // STM32F1 env:STM32F103RE +#elif MB(BTT_SKR_CR6) + #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RC_btt_512K_USB // // ARM Cortex-M4F diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h new file mode 100644 index 0000000000..d8c37d85eb --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * BigTreeTech SKR CR-6 (STM32F103RET6) board pin assignments + */ + +#define DEFAULT_MACHINE_NAME "Creality3D" +#define BOARD_INFO_NAME "BTT SKR CR-6" + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +// +// Release PB4 (Z_STEP_PIN) from JTAG NRST role +// +#define DISABLE_DEBUG + +// +// USB connect control +// +#define USB_CONNECT_PIN PA14 +#define USB_CONNECT_INVERTING false + +// +// EEPROM +// + +#if NO_EEPROM_SELECTED + #define I2C_EEPROM +#endif + +/* I2C */ +#if ENABLED(I2C_EEPROM) + #define IIC_EEPROM_SDA PB7 + #define IIC_EEPROM_SCL PB6 + + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#elif ENABLED(SDCARD_EEPROM_EMULATION) + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +#define E2END (MARLIN_EEPROM_SIZE - 1) // 2KB + +// +// Limit Switches +// + +#define X_STOP_PIN PC0 +#define Y_STOP_PIN PC1 +#define Z_STOP_PIN PC14 // Endtop or Probe + +#define FIL_RUNOUT_PIN PC15 + +// +// Probe +// +#define PROBE_TARE_PIN PA1 +#define PROBE_ACTIVATION_SWITCH_PIN PC2 // Optoswitch to Enable Z Probe + +// +// Steppers +// +#define X_ENABLE_PIN PB14 +#define X_STEP_PIN PB13 +#define X_DIR_PIN PB12 + +#define Y_ENABLE_PIN PB11 +#define Y_STEP_PIN PB10 +#define Y_DIR_PIN PB2 + +#define Z_ENABLE_PIN PB1 +#define Z_STEP_PIN PB0 +#define Z_DIR_PIN PC5 + +#define E0_ENABLE_PIN PD2 +#define E0_STEP_PIN PB3 +#define E0_DIR_PIN PB4 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // TH1 +#define TEMP_BED_PIN PC3 // TB1 + +// +// Heaters / Fans +// + +#define HEATER_0_PIN PC8 // HEATER1 +#define HEATER_BED_PIN PC9 // HOT BED + +#define FAN_PIN PC6 // FAN +#define FAN_SOFT_PWM + +#define CONTROLLER_FAN_PIN PC7 + +// +// LCD / Controller +// +#if ENABLED(CR10_STOCKDISPLAY) + #define BTN_ENC PA15 + #define BTN_EN1 PA9 + #define BTN_EN2 PA10 + + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PB15 + #define LCD_PINS_D4 PB9 + + #define BEEPER_PIN PB5 +#endif + +#if HAS_TMC_UART + /** + * TMC2209 stepper drivers + * Hardware serial communication ports. + */ + #define X_HARDWARE_SERIAL MSerial4 + #define Y_HARDWARE_SERIAL MSerial4 + #define Z_HARDWARE_SERIAL MSerial4 + #define E0_HARDWARE_SERIAL MSerial4 + + // Default TMC slave addresses + #ifndef X_SLAVE_ADDRESS + #define X_SLAVE_ADDRESS 0 + #endif + #ifndef Y_SLAVE_ADDRESS + #define Y_SLAVE_ADDRESS 1 + #endif + #ifndef Z_SLAVE_ADDRESS + #define Z_SLAVE_ADDRESS 2 + #endif + #ifndef E0_SLAVE_ADDRESS + #define E0_SLAVE_ADDRESS 3 + #endif +#endif + +// +// SD Card +// + +#define HAS_ONBOARD_SD + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #define SD_DETECT_PIN PC4 + + #define ON_BOARD_SPI_DEVICE 1 // SPI1 + #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card +#endif + +// +// Misc. Functions +// +#define LED_CONTROL_PIN PA13 +#define NEOPIXEL_PIN PA8 diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB-tests index e35d68898c..43162b68a4 100755 --- a/buildroot/tests/STM32F103RE_btt_USB-tests +++ b/buildroot/tests/STM32F103RE_btt_USB-tests @@ -15,5 +15,17 @@ opt_set SERIAL_PORT 1 opt_set SERIAL_PORT_2 -1 exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" "$3" +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_CR6 +opt_set SERIAL_PORT -1 +opt_set SERIAL_PORT_2 2 +opt_set TEMP_SENSOR_BED 1 +opt_enable CR10_STOCKDISPLAY \ + NOZZLE_AS_PROBE Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN Z_SAFE_HOMING \ + PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE \ + PROBING_HEATERS_OFF PREHEAT_BEFORE_PROBING +opt_disable NOZZLE_TO_PROBE_OFFSET +exec_test $1 $2 "BigTreeTech SKR CR6 PROBE_ACTIVATION_SWITCH, Probe Tare" "$3" + # clean up restore_configs From bc3f2f246f6bd478a618073ebc8bdd7dc35b2236 Mon Sep 17 00:00:00 2001 From: cr20-123 <66994235+cr20-123@users.noreply.github.com> Date: Mon, 21 Dec 2020 18:43:45 -0500 Subject: [PATCH 0758/1370] Fix G34 compile with bed leveling disabled (#20537) --- Marlin/src/gcode/calibrate/G34.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index a96eac0a88..e8d4841172 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -41,8 +41,9 @@ void GcodeSuite::G34() { // Home before the alignment procedure if (!all_axes_trusted()) home_all_axes(); + TERN_(HAS_LEVELING, TEMPORARY_BED_LEVELING_STATE(false)); + SET_SOFT_ENDSTOP_LOOSE(true); - TEMPORARY_BED_LEVELING_STATE(false); TemporaryGlobalEndstopsState unlock_z(false); #ifdef GANTRY_CALIBRATION_COMMANDS_PRE From b667722184342d3e1b420d7d4eba076cb645af37 Mon Sep 17 00:00:00 2001 From: LinFor Date: Tue, 22 Dec 2020 02:45:00 +0300 Subject: [PATCH 0759/1370] Fix some Russian (#20529) --- Marlin/src/lcd/language/language_ru.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index ffaa406f18..b3176c0a54 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -694,7 +694,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Компонент ="); PROGMEM Language_Str MSG_MIXER = _UxGT("СмеÑитель"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Градиент"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Полний градиент"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Полный градиент"); PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Цикличное Ñмешивание"); PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Градиент ÑмешиваниÑ"); PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Сменить градиент"); @@ -705,8 +705,8 @@ namespace Language_ru { PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Конец Ð’-инÑтрумента"); PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдоним Ð’-инÑтрумента"); PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð¡Ð±Ñ€Ð¾Ñ Ð’-инÑтрументов"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Смешать Ð’-инÑтрументи"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-инÑтрументи Ñброшены"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Смешать Ð’-инÑтрументы"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-инÑтрументы Ñброшены"); #else PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перекл. Ñмешивание"); PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Ðктив.Ð’-инÑтрум."); @@ -728,10 +728,10 @@ namespace Language_ru { #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Плохой Ð¸Ð½Ð´ÐµÐºÑ Ñтраницы"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ÐŸÐ¾Ð»Ð¾Ñ…Ð°Ñ ÑкороÑÑ‚ÑŒ Ñтраницы"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ÐŸÐ»Ð¾Ñ…Ð°Ñ ÑкороÑÑ‚ÑŒ Ñтраницы"); #else - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("ÐŸÐ¾Ð»Ð¾Ñ…Ð°Ñ Ñтраница"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ÐŸÐ¾Ð»Ð¾Ñ…Ð°Ñ Ñкор.Ñтран."); + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("ÐŸÐ»Ð¾Ñ…Ð°Ñ Ñтраница"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ÐŸÐ»Ð¾Ñ…Ð°Ñ Ñкор.Ñтран."); #endif PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Редактировать пароль"); @@ -779,10 +779,10 @@ namespace Language_ru { #endif PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Драйвера TMC"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Текущие наÑтройки"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Ток двигателей"); PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим"); PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Режим без ÑндÑтопов"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Режим шага"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Режим драйвера"); PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("СброÑ"); From ff2f6cb110060ef2555c73e993b58391bff76608 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 12 Dec 2020 20:47:18 -0600 Subject: [PATCH 0760/1370] Robin pins followup --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index a36b8a32e6..ebfb00bfb6 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -173,11 +173,10 @@ * MKS Robin has a few hardware revisions * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware * - * MKS Robin less or equal to V2.3 don't have SD_DETECT_PIN. + * MKS Robin <= V2.3 have no SD_DETECT_PIN. + * MKS Robin >= V2.4 have SD_DETECT_PIN on PF12. * - * MKS Robin greater or equal to V2.4 have SD_DETECT_PIN at PF12. - * - * You can uncomment it here, or you can add it SD_DETECT_PIN to your Configuration.h + * Uncomment here or add SD_DETECT_PIN to Configuration.h. */ //#define SD_DETECT_PIN -1 //#define SD_DETECT_PIN PF12 // SD_CD From 350dc4ca05bcfa0f8b7a822000ecba0964438778 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 21 Dec 2020 17:48:03 -0600 Subject: [PATCH 0761/1370] Tweak FTDI spacing --- .../screens/advanced_settings_menu.cpp | 32 ++++++++--------- .../base_numeric_adjustment_screen.cpp | 4 +-- .../screens/bed_mesh_screen.cpp | 2 +- .../screens/bio_advanced_settings.cpp | 28 +++++++-------- .../screens/bio_main_menu.cpp | 18 +++++----- .../screens/bio_printing_dialog_box.cpp | 2 +- .../screens/bio_tune_menu.cpp | 14 ++++---- .../cocoa_press_advanced_settings_menu.cpp | 22 ++++++------ .../screens/cocoa_press_main_menu.cpp | 16 ++++----- .../screens/cocoa_press_preheat_menu.cpp | 14 ++++---- .../screens/cocoa_press_preheat_screen.cpp | 4 +-- .../screens/default_acceleration_screen.cpp | 2 +- .../screens/developer_menu.cpp | 36 +++++++++---------- .../screens/dialog_box_base_class.cpp | 8 ++--- .../screens/endstop_state_screen.cpp | 2 +- .../screens/files_screen.cpp | 12 +++---- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 20 +++++------ .../screens/status_screen.cpp | 22 ++++++------ .../screens/touch_registers_screen.cpp | 26 +++++++------- .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 18 +++++----- 20 files changed, 151 insertions(+), 151 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 431c601581..0b2dc911f1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -90,29 +90,29 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { cmd.colors(normal_btn) .font(Theme::font_medium) .enabled(ENABLED(HAS_BED_PROBE)) - .tag(2) .button( ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) + .tag(2) .button(ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) .enabled(ENABLED(CASE_LIGHT_ENABLE)) - .tag(16).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) - .tag(3) .button( STEPS_PER_MM_POS, GET_TEXT_F(MSG_STEPS_PER_MM)) + .tag(16).button(CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) + .tag(3) .button(STEPS_PER_MM_POS, GET_TEXT_F(MSG_STEPS_PER_MM)) .enabled(ENABLED(HAS_TRINAMIC_CONFIG)) - .tag(13).button( TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT)) + .tag(13).button(TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT)) .enabled(ENABLED(SENSORLESS_HOMING)) - .tag(14).button( TMC_HOMING_THRS_POS, GET_TEXT_F(MSG_TMC_HOMING_THRS)) + .tag(14).button(TMC_HOMING_THRS_POS, GET_TEXT_F(MSG_TMC_HOMING_THRS)) .enabled(ENABLED(HAS_MULTI_HOTEND)) - .tag(4) .button( OFFSETS_POS, GET_TEXT_F(MSG_OFFSETS_MENU)) + .tag(4) .button(OFFSETS_POS, GET_TEXT_F(MSG_OFFSETS_MENU)) .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) - .tag(11).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) - .tag(12).button( ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) - .tag(15).button( DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) - .tag(9) .button( INTERFACE_POS, GET_TEXT_F(MSG_INTERFACE)) - .tag(10).button( RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) - .tag(5) .button( VELOCITY_POS, GET_TEXT_F(MSG_VELOCITY)) - .tag(6) .button( ACCELERATION_POS, GET_TEXT_F(MSG_ACCELERATION)) - .tag(7) .button( JERK_POS, GET_TEXT_F(TERN(HAS_JUNCTION_DEVIATION, MSG_JUNCTION_DEVIATION, MSG_JERK))) + .tag(11).button(FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) + .tag(12).button(ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) + .tag(15).button(DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) + .tag(9) .button(INTERFACE_POS, GET_TEXT_F(MSG_INTERFACE)) + .tag(10).button(RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) + .tag(5) .button(VELOCITY_POS, GET_TEXT_F(MSG_VELOCITY)) + .tag(6) .button(ACCELERATION_POS, GET_TEXT_F(MSG_ACCELERATION)) + .tag(7) .button(JERK_POS, GET_TEXT_F(TERN(HAS_JUNCTION_DEVIATION, MSG_JUNCTION_DEVIATION, MSG_JERK))) .enabled(ENABLED(BACKLASH_GCODE)) - .tag(8).button( BACKLASH_POS, GET_TEXT_F(MSG_BACKLASH)) + .tag(8).button(BACKLASH_POS, GET_TEXT_F(MSG_BACKLASH)) .colors(action_btn) - .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp index 10cbd3bc62..a118d851df 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp @@ -219,7 +219,7 @@ void BaseNumericAdjustmentScreen::widgets_t::adjuster_sram_val(uint8_t tag, prog .font(font_small) .text( BTN_POS(1,_line), BTN_SIZE(4,1), label); _button_style(cmd, TEXT_AREA); - cmd.fgcolor(_color).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT); + cmd.fgcolor(_color).button(BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT); } cmd.font(font_medium); @@ -282,7 +282,7 @@ void BaseNumericAdjustmentScreen::widgets_t::text_field(uint8_t tag, progmem_str _button_style(cmd, TEXT_AREA); cmd.fgcolor(_color) .tag(tag) - .button( BTN_POS(5,_line), BTN_SIZE(9,1), F(""), OPT_FLAT); + .button(BTN_POS(5,_line), BTN_SIZE(9,1), F(""), OPT_FLAT); } if (_what & FOREGROUND) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 2cce884d36..dbc4ba3b4b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -250,7 +250,7 @@ void BedMeshScreen::drawHighlightedPointValue() { .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) .text(Z_VALUE_POS, str) .colors(action_btn) - .tag(1).button( OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) + .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); switch (screen_data.BedMeshScreen.message) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp index 196f26fe22..cabcd5ded7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp @@ -43,50 +43,50 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { #define GRID_ROWS 9 #define GRID_COLS 2 - .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(MSG_DISPLAY_MENU)) + .tag(2) .button(BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(MSG_DISPLAY_MENU)) .enabled( #if HAS_TRINAMIC_CONFIG 1 #endif ) - .tag(3) .button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_TMC_CURRENT)) + .tag(3) .button(BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_TMC_CURRENT)) .enabled( #if HAS_TRINAMIC_CONFIG 1 #endif ) - .tag(4) .button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_TMC_HOMING_THRS)) - .tag(5) .button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_LCD_ENDSTOPS)) + .tag(4) .button(BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_TMC_HOMING_THRS)) + .tag(5) .button(BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_LCD_ENDSTOPS)) .enabled( #if HAS_MULTI_HOTEND 1 #endif ) - .tag(6) .button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_OFFSETS_MENU)) + .tag(6) .button(BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_OFFSETS_MENU)) - .tag(7) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(MSG_STEPS_PER_MM)) - .tag(8) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_VELOCITY)) - .tag(9) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_ACCELERATION)) + .tag(7) .button(BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(MSG_STEPS_PER_MM)) + .tag(8) .button(BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_VELOCITY)) + .tag(9) .button(BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_ACCELERATION)) #if HAS_JUNCTION_DEVIATION - .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_JUNCTION_DEVIATION)) + .tag(10) .button(BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_JUNCTION_DEVIATION)) #else - .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_JERK)) + .tag(10) .button(BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_JERK)) #endif .enabled( #if ENABLED(BACKLASH_GCODE) 1 #endif ) - .tag(11) .button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_BACKLASH)) + .tag(11) .button(BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_BACKLASH)) .enabled( #if ENABLED(LIN_ADVANCE) 1 #endif ) - .tag(12) .button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_LINEAR_ADVANCE)) - .tag(13) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE)) - .tag(14) .button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_RESTORE_DEFAULTS)) + .tag(12) .button(BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_LINEAR_ADVANCE)) + .tag(13) .button(BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE)) + .tag(14) .button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_RESTORE_DEFAULTS)) .colors(action_btn) .tag(1). button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); #undef GRID_COLS diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp index dacbaf6866..53203cd35e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp @@ -46,16 +46,16 @@ void MainMenu::onRedraw(draw_mode_t what) { .font(font_large).text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_MAIN)) .colors(normal_btn) .font(font_medium) - .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME)) - .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER)) - .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS)) - .tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) - .tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BED_TEMPERATURE)) - .tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE)) - .tag(8).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .tag(9).button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_MENU)) + .tag(2).button(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME)) + .tag(3).button(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER)) + .tag(4).button(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS)) + .tag(5).button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) + .tag(6).button(BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BED_TEMPERATURE)) + .tag(7).button(BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE)) + .tag(8).button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag(9).button(BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) - .tag(1).button( BTN_POS(1,10), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + .tag(1).button(BTN_POS(1,10), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); } #undef GRID_COLS diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index 3842637703..65b996dd51 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -81,7 +81,7 @@ void BioPrintingDialogBox::draw_interaction_buttons(draw_mode_t what) { .enabled(isPrinting() ? TERN0(SDSUPPORT, isPrintingFromMedia()) : 1) .tag(3) .colors(isPrinting() ? normal_btn : action_btn) - .button( BTN_POS(2,9), BTN_SIZE(1,1), isPrinting() ? F("Cancel") : F("Back")); + .button(BTN_POS(2,9), BTN_SIZE(1,1), isPrinting() ? F("Cancel") : F("Back")); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp index ceea3742b0..dacc1cb6ea 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp @@ -48,14 +48,14 @@ void TuneMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(font_medium) - .enabled( isPrinting()).tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_SPEED)) - .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_BED_TEMPERATURE)) + .enabled( isPrinting()).tag(2).button(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_SPEED)) + .tag(3).button(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_BED_TEMPERATURE)) .enabled(TERN_(BABYSTEPPING, true)) - .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_NUDGE_NOZZLE)) - .enabled(!isPrinting()).tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME)) - .enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER)) - .enabled(!isPrinting()).tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS)) - .colors(action_btn) .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + .tag(4).button(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_NUDGE_NOZZLE)) + .enabled(!isPrinting()).tag(5).button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME)) + .enabled(!isPrinting()).tag(6).button(BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER)) + .enabled(!isPrinting()).tag(7).button(BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS)) + .colors(action_btn) .tag(1).button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); } #undef GRID_COLS #undef GRID_ROWS diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp index 23314d5c27..656bf1db13 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp @@ -56,22 +56,22 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(Theme::font_medium) - .tag(2) .button( STEPS_PER_MM_POS, GET_TEXT_F(MSG_STEPS_PER_MM)) + .tag(2) .button(STEPS_PER_MM_POS, GET_TEXT_F(MSG_STEPS_PER_MM)) .enabled(ENABLED(HAS_TRINAMIC_CONFIG)) - .tag(3) .button( TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT)) + .tag(3) .button(TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT)) .enabled(ENABLED(LIN_ADVANCE)) .tag(4) .button(LIN_ADVANCE_POS, GET_TEXT_F(MSG_LINEAR_ADVANCE)) - .tag(5) .button( VELOCITY_POS, GET_TEXT_F(MSG_VELOCITY)) - .tag(6) .button( ACCELERATION_POS, GET_TEXT_F(MSG_ACCELERATION)) - .tag(7) .button( JERK_POS, GET_TEXT_F(TERN(HAS_JUNCTION_DEVIATION, MSG_JUNCTION_DEVIATION, MSG_JERK))) - .tag(8) .button( ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) - .tag(9) .button( INTERFACE_POS, GET_TEXT_F(MSG_INTERFACE)) - .tag(10).button( DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) + .tag(5) .button(VELOCITY_POS, GET_TEXT_F(MSG_VELOCITY)) + .tag(6) .button(ACCELERATION_POS, GET_TEXT_F(MSG_ACCELERATION)) + .tag(7) .button(JERK_POS, GET_TEXT_F(TERN(HAS_JUNCTION_DEVIATION, MSG_JUNCTION_DEVIATION, MSG_JERK))) + .tag(8) .button(ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) + .tag(9) .button(INTERFACE_POS, GET_TEXT_F(MSG_INTERFACE)) + .tag(10).button(DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) .enabled(ENABLED(CASE_LIGHT_ENABLE)) - .tag(11).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) - .tag(12).button( RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) + .tag(11).button(CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) + .tag(12).button(RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) .colors(action_btn) - .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp index da095eaab6..9c8ad062aa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp @@ -53,16 +53,16 @@ void MainMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(Theme::font_medium) - .tag(2).button( MOVE_XYZ_POS, GET_TEXT_F(MSG_XYZ_MOVE)) - .tag(3).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .tag(2).button(MOVE_XYZ_POS, GET_TEXT_F(MSG_XYZ_MOVE)) + .tag(3).button(TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) .enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE)) - .tag(4).button( ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) - .tag(5).button( MOVE_E_POS, GET_TEXT_F(MSG_E_MOVE)) - .tag(6).button( SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) - .tag(7).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .tag(8).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .tag(4).button(ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) + .tag(5).button(MOVE_E_POS, GET_TEXT_F(MSG_E_MOVE)) + .tag(6).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) + .tag(7).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag(8).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) - .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp index 476c5e468b..4707924b20 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp @@ -53,16 +53,16 @@ void PreheatMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.font(Theme::font_medium) .colors(normal_btn) - .tag(2).button( BTN_POS(1,2), w, h, F("Dark Chocolate")) - .tag(3).button( BTN_POS(1,3), w, h, F("Milk Chocolate")) - .tag(4).button( BTN_POS(1,4), w, h, F("White Chocolate")); + .tag(2).button(BTN_POS(1,2), w, h, F("Dark Chocolate")) + .tag(3).button(BTN_POS(1,3), w, h, F("Milk Chocolate")) + .tag(4).button(BTN_POS(1,4), w, h, F("White Chocolate")); if (has_extra_heater()) { - cmd.tag(5).button( BTN_POS(2,2), w, h, F("Dark Chocolate")) - .tag(6).button( BTN_POS(2,3), w, h, F("Milk Chocolate")) - .tag(7).button( BTN_POS(2,4), w, h, F("White Chocolate")); + cmd.tag(5).button(BTN_POS(2,2), w, h, F("Dark Chocolate")) + .tag(6).button(BTN_POS(2,3), w, h, F("Milk Chocolate")) + .tag(7).button(BTN_POS(2,4), w, h, F("White Chocolate")); } cmd.colors(action_btn) - .tag(1) .button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + .tag(1) .button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp index 1aad1f5b4c..e9996e4bc0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp @@ -78,7 +78,7 @@ void PreheatTimerScreen::draw_interaction_buttons(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(font_medium) - .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } @@ -101,7 +101,7 @@ void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, progmem_st .font(font_small); if (what & BACKGROUND) { cmd.text( SUB_POS(1,1), SUB_SIZE(9,1), label) - .button( SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT); + .button(SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT); } if (what & FOREGROUND) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp index 203b2b037e..de617d4374 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp @@ -40,7 +40,7 @@ void DefaultAccelerationScreen::onRedraw(draw_mode_t what) { w.adjuster( 4, GET_TEXT_F(MSG_ACCEL_TRAVEL), getTravelAcceleration_mm_s2() ); w.adjuster( 6, GET_TEXT_F(MSG_ACCEL_RETRACT), getRetractAcceleration_mm_s2() ); w.increments(); - w.button( 8, GET_TEXT_F(MSG_SET_MAXIMUM)); + w.button( 8, GET_TEXT_F(MSG_SET_MAXIMUM)); } bool DefaultAccelerationScreen::onTouchHeld(uint8_t tag) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp index 3a5abf9449..89a7e1edf7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp @@ -57,32 +57,32 @@ void DeveloperMenu::onRedraw(draw_mode_t what) { #define GRID_COLS 1 cmd.font(font_large) .text ( BTN_POS(1,1), BTN_SIZE(1,1), F("Developer Menu")) .colors(normal_btn) - .tag(2).font(font_medium) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("Show All Widgets")) - .tag(3) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("Stress Test")) - .tag(4) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("Show Touch Registers")) - .tag(5) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("Play Song")) - .tag(6).enabled(has_media).button( BTN_POS(1,6), BTN_SIZE(1,1), F("Play Video from Media")) - .tag(7).enabled(has_flash).button( BTN_POS(1,7), BTN_SIZE(1,1), F("Play Video from SPI Flash")) - .tag(8).enabled(has_flash).button( BTN_POS(1,8), BTN_SIZE(1,1), F("Load Video to SPI Flash")) - .tag(9).enabled(has_flash).button( BTN_POS(1,9), BTN_SIZE(1,1), F("Erase SPI Flash")) + .tag(2).font(font_medium) .button(BTN_POS(1,2), BTN_SIZE(1,1), F("Show All Widgets")) + .tag(3) .button(BTN_POS(1,3), BTN_SIZE(1,1), F("Stress Test")) + .tag(4) .button(BTN_POS(1,4), BTN_SIZE(1,1), F("Show Touch Registers")) + .tag(5) .button(BTN_POS(1,5), BTN_SIZE(1,1), F("Play Song")) + .tag(6).enabled(has_media).button(BTN_POS(1,6), BTN_SIZE(1,1), F("Play Video from Media")) + .tag(7).enabled(has_flash).button(BTN_POS(1,7), BTN_SIZE(1,1), F("Play Video from SPI Flash")) + .tag(8).enabled(has_flash).button(BTN_POS(1,8), BTN_SIZE(1,1), F("Load Video to SPI Flash")) + .tag(9).enabled(has_flash).button(BTN_POS(1,9), BTN_SIZE(1,1), F("Erase SPI Flash")) .tag(1).colors(action_btn) - .button( BTN_POS(1,10), BTN_SIZE(1,1), F("Back")); + .button(BTN_POS(1,10), BTN_SIZE(1,1), F("Back")); #else #define GRID_ROWS 6 #define GRID_COLS 2 cmd.font(font_medium) .text ( BTN_POS(1,1), BTN_SIZE(2,1), F("Developer Menu")) .colors(normal_btn) - .tag(2).font(font_small) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("Show All Widgets")) - .tag(3) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("Show Touch Registers")) - .tag(9) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("Show Pin States")) - .tag(4) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("Play Song")) - .tag(5).enabled(has_media).button( BTN_POS(2,2), BTN_SIZE(1,1), F("Play Video from Media")) - .tag(6).enabled(has_flash).button( BTN_POS(2,3), BTN_SIZE(1,1), F("Play Video from SPI Flash")) - .tag(7).enabled(has_flash).button( BTN_POS(2,4), BTN_SIZE(1,1), F("Load Video to SPI Flash")) - .tag(8).enabled(has_flash).button( BTN_POS(2,5), BTN_SIZE(1,1), F("Erase SPI Flash")) + .tag(2).font(font_small) .button(BTN_POS(1,2), BTN_SIZE(1,1), F("Show All Widgets")) + .tag(3) .button(BTN_POS(1,3), BTN_SIZE(1,1), F("Show Touch Registers")) + .tag(9) .button(BTN_POS(1,4), BTN_SIZE(1,1), F("Show Pin States")) + .tag(4) .button(BTN_POS(1,5), BTN_SIZE(1,1), F("Play Song")) + .tag(5).enabled(has_media).button(BTN_POS(2,2), BTN_SIZE(1,1), F("Play Video from Media")) + .tag(6).enabled(has_flash).button(BTN_POS(2,3), BTN_SIZE(1,1), F("Play Video from SPI Flash")) + .tag(7).enabled(has_flash).button(BTN_POS(2,4), BTN_SIZE(1,1), F("Load Video to SPI Flash")) + .tag(8).enabled(has_flash).button(BTN_POS(2,5), BTN_SIZE(1,1), F("Erase SPI Flash")) .tag(1).colors(action_btn) - .button( BTN_POS(1,6), BTN_SIZE(2,1), F("Back")); + .button(BTN_POS(1,6), BTN_SIZE(2,1), F("Back")); #endif } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp index 2ae3d7b049..6fe7be492d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp @@ -50,20 +50,20 @@ template void DialogBoxBaseClass::drawMessage(progmem_str, int16_t font); void DialogBoxBaseClass::drawYesNoButtons(uint8_t default_btn) { CommandProcessor cmd; cmd.font(font_medium) - .colors(default_btn == 1 ? action_btn : normal_btn).tag(1).button( BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_YES)) - .colors(default_btn == 2 ? action_btn : normal_btn).tag(2).button( BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_NO)); + .colors(default_btn == 1 ? action_btn : normal_btn).tag(1).button(BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_YES)) + .colors(default_btn == 2 ? action_btn : normal_btn).tag(2).button(BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_NO)); } void DialogBoxBaseClass::drawOkayButton() { CommandProcessor cmd; cmd.font(font_medium) - .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_OKAY)); + .tag(1).button(BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_OKAY)); } void DialogBoxBaseClass::drawButton(const progmem_str label) { CommandProcessor cmd; cmd.font(font_medium) - .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), label); + .tag(1).button(BTN_POS(1,8), BTN_SIZE(2,1), label); } void DialogBoxBaseClass::drawSpinner() { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp index 09561edc02..864ba28623 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -121,7 +121,7 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { cmd.font(font_medium) .colors(action_btn) - .tag(1).button( BTN_POS(1,7), BTN_SIZE(6,1), GET_TEXT_F(MSG_BACK)); + .tag(1).button(BTN_POS(1,7), BTN_SIZE(6,1), GET_TEXT_F(MSG_BACK)); #undef GRID_COLS #undef GRID_ROWS } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index aed81045f4..7c0129610d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -141,11 +141,11 @@ void FilesScreen::drawHeader() { CommandProcessor cmd; cmd.colors(normal_btn) .font(font_small) - .tag(0).button( BTN_POS(2,1), BTN_SIZE(4,header_h), str, OPT_CENTER | OPT_FLAT) + .tag(0).button(BTN_POS(2,1), BTN_SIZE(4,header_h), str, OPT_CENTER | OPT_FLAT) .font(font_medium) .colors(action_btn) - .tag(241).enabled(prev_enabled).button( BTN_POS(1,1), BTN_SIZE(1,header_h), F("<")) - .tag(242).enabled(next_enabled).button( BTN_POS(6,1), BTN_SIZE(1,header_h), F(">")); + .tag(241).enabled(prev_enabled).button(BTN_POS(1,1), BTN_SIZE(1,header_h), F("<")) + .tag(242).enabled(next_enabled).button(BTN_POS(6,1), BTN_SIZE(1,header_h), F(">")); } void FilesScreen::drawFooter() { @@ -167,14 +167,14 @@ void FilesScreen::drawFooter() { cmd.colors(normal_btn) .font(font_medium) .colors(has_selection ? normal_btn : action_btn) - .tag(back_tag).button( BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BACK)) + .tag(back_tag).button(BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BACK)) .enabled(has_selection) .colors(has_selection ? action_btn : normal_btn); if (screen_data.FilesScreen.flags.is_dir) - cmd.tag(244).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN)); + cmd.tag(244).button(BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN)); else - cmd.tag(243).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT)); + cmd.tag(243).button(BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT)); } void FilesScreen::onRedraw(draw_mode_t what) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 4bd22cdabd..89b5899e7a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -69,20 +69,20 @@ void MainMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(Theme::font_medium) - .tag( 2).button( AUTO_HOME_POS, GET_TEXT_F(MSG_AUTO_HOME)) + .tag( 2).button(AUTO_HOME_POS, GET_TEXT_F(MSG_AUTO_HOME)) .enabled(ENABLED(NOZZLE_CLEAN_FEATURE)) - .tag( 3).button( CLEAN_NOZZLE_POS, GET_TEXT_F(MSG_CLEAN_NOZZLE)) - .tag( 4).button( MOVE_AXIS_POS, GET_TEXT_F(MSG_MOVE_AXIS)) - .tag( 5).button( DISABLE_STEPPERS_POS,GET_TEXT_F(MSG_DISABLE_STEPPERS)) - .tag( 6).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .tag( 3).button(CLEAN_NOZZLE_POS, GET_TEXT_F(MSG_CLEAN_NOZZLE)) + .tag( 4).button(MOVE_AXIS_POS, GET_TEXT_F(MSG_MOVE_AXIS)) + .tag( 5).button(DISABLE_STEPPERS_POS,GET_TEXT_F(MSG_DISABLE_STEPPERS)) + .tag( 6).button(TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) .enabled(IF_DISABLED(TOUCH_UI_LULZBOT_BIO, 1)) - .tag( 7).button( FILAMENTCHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) - .tag( 8).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag( 7).button(FILAMENTCHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) + .tag( 8).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) .enabled(TERN_(HAS_LEVELING, 1)) - .tag( 9).button( LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) - .tag(10).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .tag( 9).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) + .tag(10).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) - .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index 8aef5dd413..61f59844c0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -66,13 +66,13 @@ void StatusScreen::draw_axis_position(draw_mode_t what) { cmd.tag(6) .fgcolor(Theme::axis_label) .font(Theme::font_large) - .button( UNION_POS(X_LBL_POS, X_VAL_POS), F(""), OPT_FLAT) - .button( UNION_POS(Y_LBL_POS, Y_VAL_POS), F(""), OPT_FLAT) - .button( UNION_POS(Z_LBL_POS, Z_VAL_POS), F(""), OPT_FLAT) + .button(UNION_POS(X_LBL_POS, X_VAL_POS), F(""), OPT_FLAT) + .button(UNION_POS(Y_LBL_POS, Y_VAL_POS), F(""), OPT_FLAT) + .button(UNION_POS(Z_LBL_POS, Z_VAL_POS), F(""), OPT_FLAT) .font(Theme::font_medium) - .fgcolor(Theme::x_axis) .button( X_VAL_POS, F(""), OPT_FLAT) - .fgcolor(Theme::y_axis) .button( Y_VAL_POS, F(""), OPT_FLAT) - .fgcolor(Theme::z_axis) .button( Z_VAL_POS, F(""), OPT_FLAT) + .fgcolor(Theme::x_axis) .button(X_VAL_POS, F(""), OPT_FLAT) + .fgcolor(Theme::y_axis) .button(Y_VAL_POS, F(""), OPT_FLAT) + .fgcolor(Theme::z_axis) .button(Z_VAL_POS, F(""), OPT_FLAT) .font(Theme::font_small) .text ( X_LBL_POS, GET_TEXT_F(MSG_AXIS_X)) .text ( Y_LBL_POS, GET_TEXT_F(MSG_AXIS_Y)) @@ -137,9 +137,9 @@ void StatusScreen::draw_temperature(draw_mode_t what) { if (what & BACKGROUND) { cmd.font(Theme::font_small) .tag(5) - .fgcolor(temp) .button( TEMP_RECT_1, F(""), OPT_FLAT) - .button( TEMP_RECT_2, F(""), OPT_FLAT) - .fgcolor(fan_speed).button( FAN_POS, F(""), OPT_FLAT) + .fgcolor(temp) .button(TEMP_RECT_1, F(""), OPT_FLAT) + .button(TEMP_RECT_2, F(""), OPT_FLAT) + .fgcolor(fan_speed).button(FAN_POS, F(""), OPT_FLAT) .tag(0); // Draw Extruder Bitmap on Extruder Temperature Button @@ -269,7 +269,7 @@ void StatusScreen::draw_interaction_buttons(draw_mode_t what) { .enabled(has_media) .tag(3).button(MEDIA_BTN_POS, isPrintingFromMedia() ? GET_TEXT_F(MSG_PRINTING) : GET_TEXT_F(MSG_BUTTON_MEDIA)) .colors(!has_media ? action_btn : normal_btn) - .tag(4).button( MENU_BTN_POS, GET_TEXT_F(MSG_BUTTON_MENU)); + .tag(4).button(MENU_BTN_POS, GET_TEXT_F(MSG_BUTTON_MENU)); } #undef GRID_COLS } @@ -287,7 +287,7 @@ void StatusScreen::draw_status_message(draw_mode_t what, const char* message) { CommandProcessor cmd; cmd.fgcolor(Theme::status_msg) .tag(0) - .button( STATUS_POS, F(""), OPT_FLAT); + .button(STATUS_POS, F(""), OPT_FLAT); draw_text_box(cmd, STATUS_POS, message, OPT_CENTER, font_large); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp index cd5cedf463..3739413213 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp @@ -47,19 +47,19 @@ void TouchRegistersScreen::onRedraw(draw_mode_t) { #define GRID_COLS 2 cmd.tag(0) .font(font_xsmall) - .fgcolor(transformA) .button( BTN_POS(1,1), BTN_SIZE(1,1), F("TOUCH_XFORM_A")) - .fgcolor(transformB) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("TOUCH_XFORM_B")) - .fgcolor(transformC) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("TOUCH_XFORM_C")) - .fgcolor(transformD) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("TOUCH_XFORM_D")) - .fgcolor(transformE) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("TOUCH_XFORM_E")) - .fgcolor(transformF) .button( BTN_POS(1,6), BTN_SIZE(1,1), F("TOUCH_XFORM_F")) + .fgcolor(transformA) .button(BTN_POS(1,1), BTN_SIZE(1,1), F("TOUCH_XFORM_A")) + .fgcolor(transformB) .button(BTN_POS(1,2), BTN_SIZE(1,1), F("TOUCH_XFORM_B")) + .fgcolor(transformC) .button(BTN_POS(1,3), BTN_SIZE(1,1), F("TOUCH_XFORM_C")) + .fgcolor(transformD) .button(BTN_POS(1,4), BTN_SIZE(1,1), F("TOUCH_XFORM_D")) + .fgcolor(transformE) .button(BTN_POS(1,5), BTN_SIZE(1,1), F("TOUCH_XFORM_E")) + .fgcolor(transformF) .button(BTN_POS(1,6), BTN_SIZE(1,1), F("TOUCH_XFORM_F")) - .fgcolor(transformVal).button( BTN_POS(2,1), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,2), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,3), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,4), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,5), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,6), BTN_SIZE(1,1), F(""), OPT_FLAT); + .fgcolor(transformVal).button(BTN_POS(2,1), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button(BTN_POS(2,2), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button(BTN_POS(2,3), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button(BTN_POS(2,4), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button(BTN_POS(2,5), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button(BTN_POS(2,6), BTN_SIZE(1,1), F(""), OPT_FLAT); sprintf_P(b, PSTR("0x%08lX"), T_Transform_A); cmd.text( BTN_POS(2,1), BTN_SIZE(1,1), b); sprintf_P(b, PSTR("0x%08lX"), T_Transform_B); cmd.text( BTN_POS(2,2), BTN_SIZE(1,1), b); @@ -69,7 +69,7 @@ void TouchRegistersScreen::onRedraw(draw_mode_t) { sprintf_P(b, PSTR("0x%08lX"), T_Transform_F); cmd.text( BTN_POS(2,6), BTN_SIZE(1,1), b); cmd.colors(action_btn).font(font_medium) - .tag(1).button( BTN_POS(2,7), BTN_SIZE(1,1), F("Back")); + .tag(1).button(BTN_POS(2,7), BTN_SIZE(1,1), F("Back")); #undef GRID_COLS #undef GRID_ROWS } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index f70851521a..2246b34a55 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -71,23 +71,23 @@ void TuneMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(font_medium) - .tag(2).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .tag(2).button(TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) .enabled(!sdOrHostPrinting || sdOrHostPaused) - .tag(3).button( FIL_CHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) + .tag(3).button(FIL_CHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) - .tag(9).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) + .tag(9).button(FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) .enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE) || ENABLED(BABYSTEPPING)) - .tag(4).button( NUDGE_NOZ_POS, GET_TEXT_F(TERN(BABYSTEPPING, MSG_NUDGE_NOZZLE, MSG_ZPROBE_ZOFFSET))) - .tag(5).button( SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) + .tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(TERN(BABYSTEPPING, MSG_NUDGE_NOZZLE, MSG_ZPROBE_ZOFFSET))) + .tag(5).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) .enabled(sdOrHostPrinting) .tag(sdOrHostPaused ? 7 : 6) - .button( PAUSE_POS, sdOrHostPaused ? GET_TEXT_F(MSG_RESUME_PRINT) : GET_TEXT_F(MSG_PAUSE_PRINT)) + .button(PAUSE_POS, sdOrHostPaused ? GET_TEXT_F(MSG_RESUME_PRINT) : GET_TEXT_F(MSG_PAUSE_PRINT)) .enabled(sdOrHostPrinting) - .tag(8).button( STOP_POS, GET_TEXT_F(MSG_STOP_PRINT)) + .tag(8).button(STOP_POS, GET_TEXT_F(MSG_STOP_PRINT)) .enabled(ENABLED(CASE_LIGHT_ENABLE)) - .tag(10).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) + .tag(10).button(CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) .tag(1).colors(action_btn) - .button( BACK_POS, GET_TEXT_F(MSG_BACK)); + .button(BACK_POS, GET_TEXT_F(MSG_BACK)); } #undef GRID_COLS #undef GRID_ROWS From 231e5a5eedfbfa37c7551217de0cc43061a180df Mon Sep 17 00:00:00 2001 From: LinFor Date: Tue, 22 Dec 2020 03:06:27 +0300 Subject: [PATCH 0762/1370] Add Tune -> Advanced Settings to FTDI EVE (#20532) --- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index 2246b34a55..f9df61bf6d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -49,7 +49,8 @@ void TuneMenu::onRedraw(draw_mode_t what) { #define PAUSE_POS BTN_POS(1,6), BTN_SIZE(2,1) #define STOP_POS BTN_POS(1,7), BTN_SIZE(2,1) #define CASE_LIGHT_POS BTN_POS(1,8), BTN_SIZE(2,1) - #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) + #define ADVANCED_SETTINGS_POS BTN_POS(1,9), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(2,9), BTN_SIZE(1,1) #else #define GRID_ROWS 5 #define GRID_COLS 2 @@ -61,7 +62,8 @@ void TuneMenu::onRedraw(draw_mode_t what) { #define STOP_POS BTN_POS(2,3), BTN_SIZE(1,1) #define FILAMENT_POS BTN_POS(1,4), BTN_SIZE(1,1) #define CASE_LIGHT_POS BTN_POS(2,4), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define ADVANCED_SETTINGS_POS BTN_POS(1,5), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(2,5), BTN_SIZE(2,1) #endif if (what & FOREGROUND) { @@ -86,6 +88,7 @@ void TuneMenu::onRedraw(draw_mode_t what) { .tag(8).button(STOP_POS, GET_TEXT_F(MSG_STOP_PRINT)) .enabled(ENABLED(CASE_LIGHT_ENABLE)) .tag(10).button(CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) + .tag(11).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) .tag(1).colors(action_btn) .button(BACK_POS, GET_TEXT_F(MSG_BACK)); } @@ -121,6 +124,7 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { #if ENABLED(CASE_LIGHT_ENABLE) case 10: GOTO_SCREEN(CaseLightScreen); break; #endif + case 11: GOTO_SCREEN(AdvancedSettingsMenu); break; default: return false; } From 076f12e82d59d336d5eabd20caaa35856e7799e9 Mon Sep 17 00:00:00 2001 From: LinFor Date: Tue, 22 Dec 2020 03:30:03 +0300 Subject: [PATCH 0763/1370] 12-bit ADC resolution for STM32 (#20519) --- Marlin/src/HAL/STM32/HAL.h | 6 +++--- Marlin/src/module/thermistor/thermistors.h | 2 ++ .../share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index f2fb5ddb6a..b1c27e4ec5 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -159,14 +159,14 @@ static inline int freeMemory() { #define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) -inline void HAL_adc_init() {} - #define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 +#define HAL_ADC_RESOLUTION ADC_RESOLUTION // 12 #define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) #define HAL_READ_ADC() HAL_adc_result #define HAL_ADC_READY() true +inline void HAL_adc_init() { analogReadResolution(HAL_ADC_RESOLUTION); } + void HAL_adc_start_conversion(const uint8_t adc_pin); uint16_t HAL_adc_get_result(); diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 340712e22d..03ed5c2a57 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -27,6 +27,8 @@ #define THERMISTOR_TABLE_SCALE (HAL_ADC_RANGE / _BV(THERMISTOR_TABLE_ADC_RESOLUTION)) #if ENABLED(HAL_ADC_FILTERED) #define OVERSAMPLENR 1 +#elif HAL_ADC_RESOLUTION > 10 + #define OVERSAMPLENR (20 - HAL_ADC_RESOLUTION) #else #define OVERSAMPLENR 16 #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h index ee4b1ef296..07e2cad3f9 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h @@ -114,6 +114,8 @@ extern "C" { #define NUM_ANALOG_INPUTS 7 #define NUM_ANALOG_FIRST 80 +#define ADC_RESOLUTION 12 + // PWM resolution // #define PWM_RESOLUTION 12 #define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans From 31c84d4559f763cbe2777c0682b72d6cf35e9027 Mon Sep 17 00:00:00 2001 From: LinFor Date: Tue, 22 Dec 2020 09:31:14 +0300 Subject: [PATCH 0764/1370] FTDI EVE custom user menus (#20518) --- .../screens/custom_user_menus.cpp | 215 ++++++++++++++++++ .../ftdi_eve_touch_ui/screens/main_menu.cpp | 64 +++++- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 157 +++++++------ .../lib/ftdi_eve_touch_ui/screens/screens.h | 203 ++++++++++------- 4 files changed, 481 insertions(+), 158 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp new file mode 100644 index 0000000000..4132226977 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp @@ -0,0 +1,215 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, CUSTOM_USER_MENUS) && NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +#define _ITEM_TAG(N) (10+N) +#define _USER_DESC(N) USER_DESC_##N +#define _USER_GCODE(N) USER_GCODE_##N +#define _USER_ITEM(N) .tag(_ITEM_TAG(N)).button(USER_ITEM_POS(N), _USER_DESC(N)) +#define _USER_ACTION(N) case _ITEM_TAG(N): injectCommands_P(PSTR(_USER_GCODE(N))); TERN_(USER_SCRIPT_RETURN, GOTO_SCREEN(StatusScreen)); break; + +#define _HAS_1(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) +#define HAS_USER_ITEM(V...) DO(HAS,||,V) + +void CustomUserMenus::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true, true, true)); + } + + #if HAS_USER_ITEM(16, 17, 18, 19, 20) + #define _MORE_THAN_FIFTEEN 1 + #else + #define _MORE_THAN_FIFTEEN 0 + #endif + #if _MORE_THAN_FIFTEEN || HAS_USER_ITEM(11, 12, 13, 14, 15) + #define _MORE_THAN_TEN 1 + #else + #define _MORE_THAN_TEN 0 + #endif + + #ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 11 + #define GRID_COLS (1 + _MORE_THAN_TEN) + #define USER_ITEM_POS(N) BTN_POS((1+((N-1)/10)), ((N-1) % 10 + 1)), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,11), BTN_SIZE(1,1) + #else + #if _MORE_THAN_TEN || HAS_USER_ITEM(6, 7, 8, 9, 10) + #define _MORE_THAN_FIVE 1 + #else + #define _MORE_THAN_FIVE 0 + #endif + #define GRID_ROWS 6 + #define GRID_COLS (1 + _MORE_THAN_FIVE + _MORE_THAN_TEN + _MORE_THAN_FIFTEEN) + #define USER_ITEM_POS(N) BTN_POS((1+((N-1)/5)), ((N-1) % 5 + 1)), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,6), BTN_SIZE(GRID_COLS,1) + #endif + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(Theme::font_medium) + #if HAS_USER_ITEM(1) + _USER_ITEM(1) + #endif + #if HAS_USER_ITEM(2) + _USER_ITEM(2) + #endif + #if HAS_USER_ITEM(3) + _USER_ITEM(3) + #endif + #if HAS_USER_ITEM(4) + _USER_ITEM(4) + #endif + #if HAS_USER_ITEM(5) + _USER_ITEM(5) + #endif + #if HAS_USER_ITEM(6) + _USER_ITEM(6) + #endif + #if HAS_USER_ITEM(7) + _USER_ITEM(7) + #endif + #if HAS_USER_ITEM(8) + _USER_ITEM(8) + #endif + #if HAS_USER_ITEM(9) + _USER_ITEM(9) + #endif + #if HAS_USER_ITEM(10) + _USER_ITEM(10) + #endif + #if HAS_USER_ITEM(11) + _USER_ITEM(11) + #endif + #if HAS_USER_ITEM(12) + _USER_ITEM(12) + #endif + #if HAS_USER_ITEM(13) + _USER_ITEM(13) + #endif + #if HAS_USER_ITEM(14) + _USER_ITEM(14) + #endif + #if HAS_USER_ITEM(15) + _USER_ITEM(15) + #endif + #if HAS_USER_ITEM(16) + _USER_ITEM(16) + #endif + #if HAS_USER_ITEM(17) + _USER_ITEM(17) + #endif + #if HAS_USER_ITEM(18) + _USER_ITEM(18) + #endif + #if HAS_USER_ITEM(19) + _USER_ITEM(19) + #endif + #if HAS_USER_ITEM(20) + _USER_ITEM(20) + #endif + .colors(action_btn) + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool CustomUserMenus::onTouchEnd(uint8_t tag) { + switch (tag) { + #if HAS_USER_ITEM(1) + _USER_ACTION(1) + #endif + #if HAS_USER_ITEM(2) + _USER_ACTION(2) + #endif + #if HAS_USER_ITEM(3) + _USER_ACTION(3) + #endif + #if HAS_USER_ITEM(4) + _USER_ACTION(4) + #endif + #if HAS_USER_ITEM(5) + _USER_ACTION(5) + #endif + #if HAS_USER_ITEM(6) + _USER_ACTION(6) + #endif + #if HAS_USER_ITEM(7) + _USER_ACTION(7) + #endif + #if HAS_USER_ITEM(8) + _USER_ACTION(8) + #endif + #if HAS_USER_ITEM(9) + _USER_ACTION(9) + #endif + #if HAS_USER_ITEM(10) + _USER_ACTION(10) + #endif + #if HAS_USER_ITEM(11) + _USER_ACTION(11) + #endif + #if HAS_USER_ITEM(12) + _USER_ACTION(12) + #endif + #if HAS_USER_ITEM(13) + _USER_ACTION(13) + #endif + #if HAS_USER_ITEM(14) + _USER_ACTION(14) + #endif + #if HAS_USER_ITEM(15) + _USER_ACTION(15) + #endif + #if HAS_USER_ITEM(16) + _USER_ACTION(16) + #endif + #if HAS_USER_ITEM(17) + _USER_ACTION(17) + #endif + #if HAS_USER_ITEM(18) + _USER_ACTION(18) + #endif + #if HAS_USER_ITEM(19) + _USER_ACTION(19) + #endif + #if HAS_USER_ITEM(20) + _USER_ACTION(20) + #endif + + case 1: GOTO_PREVIOUS(); break; + default: return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE && CUSTOM_USER_MENUS && !TOUCH_UI_LULZBOT_BIO && !TOUCH_UI_COCOA_PRESS diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 89b5899e7a..529daa2f83 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /***************** * main_menu.cpp * *****************/ @@ -42,7 +64,12 @@ void MainMenu::onRedraw(draw_mode_t what) { #define GRID_COLS 2 #define ABOUT_PRINTER_POS BTN_POS(1,1), BTN_SIZE(2,1) #define ADVANCED_SETTINGS_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(2,1) + #if ENABLED(CUSTOM_USER_MENUS) + #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(1,1) + #define CUSTOM_USER_MENUS_POS BTN_POS(2,3), BTN_SIZE(1,1) + #else + #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(2,1) + #endif #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(2,1) #define DISABLE_STEPPERS_POS BTN_POS(1,5), BTN_SIZE(2,1) #define MOVE_AXIS_POS BTN_POS(1,6), BTN_SIZE(1,1) @@ -52,17 +79,23 @@ void MainMenu::onRedraw(draw_mode_t what) { #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) #else #define GRID_ROWS 5 - #define GRID_COLS 2 - #define ADVANCED_SETTINGS_POS BTN_POS(1,1), BTN_SIZE(1,1) - #define ABOUT_PRINTER_POS BTN_POS(2,1), BTN_SIZE(1,1) - #define AUTO_HOME_POS BTN_POS(1,2), BTN_SIZE(1,1) - #define CLEAN_NOZZLE_POS BTN_POS(2,2), BTN_SIZE(1,1) - #define MOVE_AXIS_POS BTN_POS(1,3), BTN_SIZE(1,1) - #define DISABLE_STEPPERS_POS BTN_POS(2,3), BTN_SIZE(1,1) - #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(1,1) - #define FILAMENTCHANGE_POS BTN_POS(2,4), BTN_SIZE(1,1) - #define LEVELING_POS BTN_POS(1,5), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(2,5), BTN_SIZE(1,1) + #define GRID_COLS 6 + #define ADVANCED_SETTINGS_POS BTN_POS(1,1), BTN_SIZE(3,1) + #define ABOUT_PRINTER_POS BTN_POS(4,1), BTN_SIZE(3,1) + #define AUTO_HOME_POS BTN_POS(1,2), BTN_SIZE(3,1) + #define CLEAN_NOZZLE_POS BTN_POS(4,2), BTN_SIZE(3,1) + #define MOVE_AXIS_POS BTN_POS(1,3), BTN_SIZE(3,1) + #define DISABLE_STEPPERS_POS BTN_POS(4,3), BTN_SIZE(3,1) + #if ENABLED(CUSTOM_USER_MENUS) + #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define FILAMENTCHANGE_POS BTN_POS(3,4), BTN_SIZE(2,1) + #define CUSTOM_USER_MENUS_POS BTN_POS(5,4), BTN_SIZE(2,1) + #else + #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(3,1) + #define FILAMENTCHANGE_POS BTN_POS(4,4), BTN_SIZE(3,1) + #endif + #define LEVELING_POS BTN_POS(1,5), BTN_SIZE(3,1) + #define BACK_POS BTN_POS(4,5), BTN_SIZE(3,1) #endif if (what & FOREGROUND) { @@ -81,6 +114,9 @@ void MainMenu::onRedraw(draw_mode_t what) { .enabled(TERN_(HAS_LEVELING, 1)) .tag( 9).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) .tag(10).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + #if ENABLED(CUSTOM_USER_MENUS) + .tag(11).button(CUSTOM_USER_MENUS_POS, GET_TEXT_F(MSG_USER_MENU)) + #endif .colors(action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } @@ -104,6 +140,10 @@ bool MainMenu::onTouchEnd(uint8_t tag) { case 9: GOTO_SCREEN(LevelingMenu); break; #endif case 10: GOTO_SCREEN(AboutScreen); break; + #if ENABLED(CUSTOM_USER_MENUS) + case 11: GOTO_SCREEN(CustomUserMenus); break; + #endif + default: return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index ff85689ef2..5b3f9a201f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /*************** * screens.cpp * ***************/ @@ -45,88 +67,91 @@ SCREEN_TABLE { DECL_SCREEN(SaveSettingsDialogBox), DECL_SCREEN(ConfirmStartPrintDialogBox), DECL_SCREEN(ConfirmAbortPrintDialogBox), -#if ENABLED(CALIBRATION_GCODE) - DECL_SCREEN(ConfirmAutoCalibrationDialogBox), -#endif + #if ENABLED(CALIBRATION_GCODE) + DECL_SCREEN(ConfirmAutoCalibrationDialogBox), + #endif + #if ENABLED(CUSTOM_USER_MENUS) + DECL_SCREEN(CustomUserMenus), + #endif DECL_SCREEN(SpinnerDialogBox), DECL_SCREEN(AboutScreen), -#if ENABLED(PRINTCOUNTER) - DECL_SCREEN(StatisticsScreen), -#endif -#if ENABLED(BABYSTEPPING) - DECL_SCREEN(NudgeNozzleScreen), -#endif + #if ENABLED(PRINTCOUNTER) + DECL_SCREEN(StatisticsScreen), + #endif + #if ENABLED(BABYSTEPPING) + DECL_SCREEN(NudgeNozzleScreen), + #endif DECL_SCREEN(MoveAxisScreen), DECL_SCREEN(StepsScreen), -#if HAS_TRINAMIC_CONFIG - DECL_SCREEN(StepperCurrentScreen), - DECL_SCREEN(StepperBumpSensitivityScreen), -#endif -#if HAS_LEVELING - DECL_SCREEN(LevelingMenu), - #if HAS_BED_PROBE - DECL_SCREEN(ZOffsetScreen), + #if HAS_TRINAMIC_CONFIG + DECL_SCREEN(StepperCurrentScreen), + DECL_SCREEN(StepperBumpSensitivityScreen), #endif - #if HAS_MESH - DECL_SCREEN(BedMeshScreen), + #if HAS_LEVELING + DECL_SCREEN(LevelingMenu), + #if HAS_BED_PROBE + DECL_SCREEN(ZOffsetScreen), + #endif + #if HAS_MESH + DECL_SCREEN(BedMeshScreen), + #endif + #endif + #if HAS_MULTI_HOTEND + DECL_SCREEN(NozzleOffsetScreen), + #endif + #if ENABLED(BACKLASH_GCODE) + DECL_SCREEN(BacklashCompensationScreen), #endif -#endif -#if HAS_MULTI_HOTEND - DECL_SCREEN(NozzleOffsetScreen), -#endif -#if ENABLED(BACKLASH_GCODE) - DECL_SCREEN(BacklashCompensationScreen), -#endif DECL_SCREEN(FeedratePercentScreen), DECL_SCREEN(MaxVelocityScreen), DECL_SCREEN(MaxAccelerationScreen), DECL_SCREEN(DefaultAccelerationScreen), -#if HAS_JUNCTION_DEVIATION - DECL_SCREEN(JunctionDeviationScreen), -#else - DECL_SCREEN(JerkScreen), -#endif -#if ENABLED(CASE_LIGHT_ENABLE) - DECL_SCREEN(CaseLightScreen), -#endif -#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - DECL_SCREEN(FilamentMenu), -#endif -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - DECL_SCREEN(FilamentRunoutScreen), -#endif -#if ENABLED(LIN_ADVANCE) - DECL_SCREEN(LinearAdvanceScreen), -#endif + #if HAS_JUNCTION_DEVIATION + DECL_SCREEN(JunctionDeviationScreen), + #else + DECL_SCREEN(JerkScreen), + #endif + #if ENABLED(CASE_LIGHT_ENABLE) + DECL_SCREEN(CaseLightScreen), + #endif + #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + DECL_SCREEN(FilamentMenu), + #endif + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + DECL_SCREEN(FilamentRunoutScreen), + #endif + #if ENABLED(LIN_ADVANCE) + DECL_SCREEN(LinearAdvanceScreen), + #endif DECL_SCREEN(TemperatureScreen), DECL_SCREEN(ChangeFilamentScreen), DECL_SCREEN(InterfaceSettingsScreen), DECL_SCREEN(InterfaceSoundsScreen), DECL_SCREEN(LockScreen), -#if ENABLED(SDSUPPORT) - DECL_SCREEN(FilesScreen), -#endif + #if ENABLED(SDSUPPORT) + DECL_SCREEN(FilesScreen), + #endif DECL_SCREEN(EndstopStatesScreen), -#if ENABLED(TOUCH_UI_LULZBOT_BIO) - DECL_SCREEN(BioPrintingDialogBox), - DECL_SCREEN(BioConfirmHomeXYZ), - DECL_SCREEN(BioConfirmHomeE), -#endif -#if ENABLED(TOUCH_UI_COCOA_PRESS) - DECL_SCREEN(PreheatMenu), - DECL_SCREEN(PreheatTimerScreen), - DECL_SCREEN(UnloadCartridgeScreen), - DECL_SCREEN(LoadChocolateScreen), - DECL_SCREEN(MoveXYZScreen), - DECL_SCREEN(MoveEScreen), -#endif -#if ENABLED(TOUCH_UI_DEVELOPER_MENU) - DECL_SCREEN(DeveloperMenu), - DECL_SCREEN(ConfirmEraseFlashDialogBox), - DECL_SCREEN(WidgetsScreen), - DECL_SCREEN(TouchRegistersScreen), - DECL_SCREEN(StressTestScreen), -#endif + #if ENABLED(TOUCH_UI_LULZBOT_BIO) + DECL_SCREEN(BioPrintingDialogBox), + DECL_SCREEN(BioConfirmHomeXYZ), + DECL_SCREEN(BioConfirmHomeE), + #endif + #if ENABLED(TOUCH_UI_COCOA_PRESS) + DECL_SCREEN(PreheatMenu), + DECL_SCREEN(PreheatTimerScreen), + DECL_SCREEN(UnloadCartridgeScreen), + DECL_SCREEN(LoadChocolateScreen), + DECL_SCREEN(MoveXYZScreen), + DECL_SCREEN(MoveEScreen), + #endif + #if ENABLED(TOUCH_UI_DEVELOPER_MENU) + DECL_SCREEN(DeveloperMenu), + DECL_SCREEN(ConfirmEraseFlashDialogBox), + DECL_SCREEN(WidgetsScreen), + DECL_SCREEN(TouchRegistersScreen), + DECL_SCREEN(StressTestScreen), + #endif DECL_SCREEN(MediaPlayerScreen), DECL_SCREEN(DisplayTuningScreen) }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 3fa18d9f67..265d6eb486 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /************* * screens.h * *************/ @@ -53,59 +75,62 @@ enum { MAX_VELOCITY_SCREEN_CACHE, MAX_ACCELERATION_SCREEN_CACHE, DEFAULT_ACCELERATION_SCREEN_CACHE, -#if HAS_LEVELING - LEVELING_SCREEN_CACHE, - #if HAS_BED_PROBE - ZOFFSET_SCREEN_CACHE, + #if HAS_LEVELING + LEVELING_SCREEN_CACHE, + #if HAS_BED_PROBE + ZOFFSET_SCREEN_CACHE, + #endif + #if HAS_MESH + BED_MESH_SCREEN_CACHE, + #endif #endif - #if HAS_MESH - BED_MESH_SCREEN_CACHE, + #if ENABLED(BABYSTEPPING) + ADJUST_OFFSETS_SCREEN_CACHE, + #endif + #if HAS_TRINAMIC_CONFIG + STEPPER_CURRENT_SCREEN_CACHE, + STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE, + #endif + #if HAS_MULTI_HOTEND + NOZZLE_OFFSET_SCREEN_CACHE, + #endif + #if ENABLED(BACKLASH_GCODE) + BACKLASH_COMPENSATION_SCREEN_CACHE, + #endif + #if HAS_JUNCTION_DEVIATION + JUNC_DEV_SCREEN_CACHE, + #else + JERK_SCREEN_CACHE, + #endif + #if ENABLED(CASE_LIGHT_ENABLE) + CASE_LIGHT_SCREEN_CACHE, + #endif + #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + FILAMENT_MENU_CACHE, + #endif + #if ENABLED(LIN_ADVANCE) + LINEAR_ADVANCE_SCREEN_CACHE, + #endif + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + FILAMENT_RUNOUT_SCREEN_CACHE, + #endif + #if ENABLED(TOUCH_UI_LULZBOT_BIO) + PRINTING_SCREEN_CACHE, + #endif + #if ENABLED(TOUCH_UI_COCOA_PRESS) + PREHEAT_MENU_CACHE, + PREHEAT_TIMER_SCREEN_CACHE, + UNLOAD_CARTRIDGE_SCREEN_CACHE, + LOAD_CHOCOLATE_SCREEN_CACHE, + MOVE_XYZ_SCREEN_CACHE, + MOVE_E_SCREEN_CACHE, + #endif + #if ENABLED(SDSUPPORT) + FILES_SCREEN_CACHE, + #endif + #if ENABLED(CUSTOM_USER_MENUS) + CUSTOM_USER_MENUS_SCREEN_CACHE, #endif -#endif -#if ENABLED(BABYSTEPPING) - ADJUST_OFFSETS_SCREEN_CACHE, -#endif -#if HAS_TRINAMIC_CONFIG - STEPPER_CURRENT_SCREEN_CACHE, - STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE, -#endif -#if HAS_MULTI_HOTEND - NOZZLE_OFFSET_SCREEN_CACHE, -#endif -#if ENABLED(BACKLASH_GCODE) - BACKLASH_COMPENSATION_SCREEN_CACHE, -#endif -#if HAS_JUNCTION_DEVIATION - JUNC_DEV_SCREEN_CACHE, -#else - JERK_SCREEN_CACHE, -#endif -#if ENABLED(CASE_LIGHT_ENABLE) - CASE_LIGHT_SCREEN_CACHE, -#endif -#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - FILAMENT_MENU_CACHE, -#endif -#if ENABLED(LIN_ADVANCE) - LINEAR_ADVANCE_SCREEN_CACHE, -#endif -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - FILAMENT_RUNOUT_SCREEN_CACHE, -#endif -#if ENABLED(TOUCH_UI_LULZBOT_BIO) - PRINTING_SCREEN_CACHE, -#endif -#if ENABLED(TOUCH_UI_COCOA_PRESS) - PREHEAT_MENU_CACHE, - PREHEAT_TIMER_SCREEN_CACHE, - UNLOAD_CARTRIDGE_SCREEN_CACHE, - LOAD_CHOCOLATE_SCREEN_CACHE, - MOVE_XYZ_SCREEN_CACHE, - MOVE_E_SCREEN_CACHE, -#endif -#if ENABLED(SDSUPPORT) - FILES_SCREEN_CACHE, -#endif CHANGE_FILAMENT_SCREEN_CACHE, INTERFACE_SETTINGS_SCREEN_CACHE, INTERFACE_SOUNDS_SCREEN_CACHE, @@ -247,6 +272,14 @@ class ConfirmUserRequestAlertBox : public AlertDialogBox { static void show(const char*); }; +#if ENABLED(CUSTOM_USER_MENUS) + class CustomUserMenus : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; +#endif + class SpinnerDialogBox : public DialogBoxBaseClass, public CachedScreen { public: static void onRedraw(draw_mode_t); @@ -496,6 +529,7 @@ class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen { public: static void onRedraw(draw_mode_t); @@ -511,35 +545,38 @@ class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - private: - enum MeshOpts { - USE_POINTS = 0x01, - USE_COLORS = 0x02, - USE_TAGS = 0x04, - USE_HIGHLIGHT = 0x08, - USE_AUTOSCALE = 0x10 - }; - static uint8_t pointToTag(uint8_t x, uint8_t y); - static bool tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y); - static float getHightlightedValue(); - static void drawHighlightedPointValue(); - static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); - static bool isMeshComplete(ExtUI::bed_mesh_t data); + class BedMeshScreen : public BaseScreen, public CachedScreen { + private: + enum MeshOpts { + USE_POINTS = 0x01, + USE_COLORS = 0x02, + USE_TAGS = 0x04, + USE_HIGHLIGHT = 0x08, + USE_AUTOSCALE = 0x10 + }; - public: - static void onMeshUpdate(const int8_t x, const int8_t y, const float val); - static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); + static uint8_t pointToTag(uint8_t x, uint8_t y); + static bool tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y); + static float getHightlightedValue(); + static void drawHighlightedPointValue(); + static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); + static bool isMeshComplete(ExtUI::bed_mesh_t data); - static void startMeshProbe(); - }; - #endif -#endif + public: + static void onMeshUpdate(const int8_t x, const int8_t y, const float val); + static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + + static void startMeshProbe(); + }; + + #endif // HAS_MESH + +#endif // HAS_LEVELING #if ENABLED(BABYSTEPPING) class NudgeNozzleScreen : public BaseNumericAdjustmentScreen, public CachedScreen { @@ -727,6 +764,7 @@ class LockScreen : public BaseScreen, public CachedScreen { }; #if ENABLED(SDSUPPORT) + class FilesScreen : public BaseScreen, public CachedScreen { private: #ifdef TOUCH_UI_PORTRAIT @@ -761,7 +799,8 @@ class LockScreen : public BaseScreen, public CachedScreen { static bool onTouchEnd(uint8_t tag); static void onIdle(); }; -#endif + +#endif // SDSUPPORT class EndstopStatesScreen : public BaseScreen, public UncachedScreen { public: @@ -779,6 +818,7 @@ class DisplayTuningScreen : public BaseNumericAdjustmentScreen, public CachedScr }; #if ENABLED(TOUCH_UI_DEVELOPER_MENU) + class DeveloperMenu : public BaseScreen, public UncachedScreen { public: static void onRedraw(draw_mode_t); @@ -815,7 +855,8 @@ class DisplayTuningScreen : public BaseNumericAdjustmentScreen, public CachedScr static bool onTouchEnd(uint8_t tag); static void onIdle(); }; -#endif + +#endif // TOUCH_UI_DEVELOPER_MENU class MediaPlayerScreen : public BaseScreen, public UncachedScreen { private: @@ -840,6 +881,7 @@ class MediaPlayerScreen : public BaseScreen, public UncachedScreen { #endif #if ENABLED(TOUCH_UI_COCOA_PRESS) + class PreheatMenu : public BaseScreen, public CachedScreen { public: static void onRedraw(draw_mode_t); @@ -888,4 +930,5 @@ class MediaPlayerScreen : public BaseScreen, public UncachedScreen { static void onRedraw(draw_mode_t); static void onIdle(); }; -#endif \ No newline at end of file + +#endif // TOUCH_UI_COCOA_PRESS From a1313c7066a2048f44d3867390227c6b8cd096aa Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 22 Dec 2020 03:49:34 -0800 Subject: [PATCH 0765/1370] Improve STM32 timer conflict messages (#20544) --- Marlin/src/HAL/STM32/timers.cpp | 185 +++++++++++++++++++------------- 1 file changed, 112 insertions(+), 73 deletions(-) diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index 90f8c3dc94..e8e18a47d4 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -27,7 +27,6 @@ // Local defines // ------------------------ - // Default timer priorities. Override by specifying alternate priorities in the board pins file. // The TONE timer is not present here, as it currently cannot be set programmatically. It is set // by defining TIM_IRQ_PRIO in the variant.h or platformio.ini file, which adjusts the default @@ -96,11 +95,6 @@ #define STEP_TIMER_DEV _TIMER_DEV(STEP_TIMER) #define TEMP_TIMER_DEV _TIMER_DEV(TEMP_TIMER) -#define __TIMER_IRQ_NAME(X) TIM##X##_IRQn -#define _TIMER_IRQ_NAME(X) __TIMER_IRQ_NAME(X) -#define STEP_TIMER_IRQ_NAME _TIMER_IRQ_NAME(STEP_TIMER) -#define TEMP_TIMER_IRQ_NAME _TIMER_IRQ_NAME(TEMP_TIMER) - // ------------------------ // Private Variables // ------------------------ @@ -197,87 +191,132 @@ void SetTimerInterruptPriorities() { TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIO, 0)); } -// This is a terrible hack to replicate the behavior used in the framework's SoftwareSerial.cpp -// to choose a serial timer. It will select TIM7 on most boards used by Marlin, but this is more -// resiliant to new MCUs which may not have a TIM7. Best practice is to explicitly specify -// TIMER_SERIAL to avoid relying on framework selections which may not be predictable. -#if !defined(TIMER_SERIAL) - #if defined (TIM18_BASE) - #define TIMER_SERIAL TIM18 - #elif defined (TIM7_BASE) - #define TIMER_SERIAL TIM7 - #elif defined (TIM6_BASE) - #define TIMER_SERIAL TIM6 - #elif defined (TIM22_BASE) - #define TIMER_SERIAL TIM22 - #elif defined (TIM21_BASE) - #define TIMER_SERIAL TIM21 - #elif defined (TIM17_BASE) - #define TIMER_SERIAL TIM17 - #elif defined (TIM16_BASE) - #define TIMER_SERIAL TIM16 - #elif defined (TIM15_BASE) - #define TIMER_SERIAL TIM15 - #elif defined (TIM14_BASE) - #define TIMER_SERIAL TIM14 - #elif defined (TIM13_BASE) - #define TIMER_SERIAL TIM13 - #elif defined (TIM11_BASE) - #define TIMER_SERIAL TIM11 - #elif defined (TIM10_BASE) - #define TIMER_SERIAL TIM10 - #elif defined (TIM12_BASE) - #define TIMER_SERIAL TIM12 - #elif defined (TIM19_BASE) - #define TIMER_SERIAL TIM19 - #elif defined (TIM9_BASE) - #define TIMER_SERIAL TIM9 - #elif defined (TIM5_BASE) - #define TIMER_SERIAL TIM5 - #elif defined (TIM4_BASE) - #define TIMER_SERIAL TIM4 - #elif defined (TIM3_BASE) - #define TIMER_SERIAL TIM3 - #elif defined (TIM2_BASE) - #define TIMER_SERIAL TIM2 - #elif defined (TIM20_BASE) - #define TIMER_SERIAL TIM20 - #elif defined (TIM8_BASE) - #define TIMER_SERIAL TIM8 - #elif defined (TIM1_BASE) - #define TIMER_SERIAL TIM1 - #else - #error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h +// ------------------------ +// Detect timer conflicts +// ------------------------ + +// This list serves two purposes. Firstly, it facilitates build-time mapping between +// variant-defined timer names (such as TIM1) and timer numbers. It also replicates +// the order of timers used in the framework's SoftwareSerial.cpp. The first timer in +// this list will be automatically used by SoftwareSerial if it is not already defined +// in the board's variant or compiler options. +static constexpr struct {uintptr_t base_address; int timer_number;} stm32_timer_map[] = { + #ifdef TIM18_BASE + { uintptr_t(TIM18), 18 }, #endif + #ifdef TIM7_BASE + { uintptr_t(TIM7), 7 }, + #endif + #ifdef TIM6_BASE + { uintptr_t(TIM6), 6 }, + #endif + #ifdef TIM22_BASE + { uintptr_t(TIM22), 22 }, + #endif + #ifdef TIM21_BASE + { uintptr_t(TIM21), 21 }, + #endif + #ifdef TIM17_BASE + { uintptr_t(TIM17), 17 }, + #endif + #ifdef TIM16_BASE + { uintptr_t(TIM16), 16 }, + #endif + #ifdef TIM15_BASE + { uintptr_t(TIM15), 15 }, + #endif + #ifdef TIM14_BASE + { uintptr_t(TIM14), 14 }, + #endif + #ifdef TIM13_BASE + { uintptr_t(TIM13), 13 }, + #endif + #ifdef TIM11_BASE + { uintptr_t(TIM11), 11 }, + #endif + #ifdef TIM10_BASE + { uintptr_t(TIM10), 10 }, + #endif + #ifdef TIM12_BASE + { uintptr_t(TIM12), 12 }, + #endif + #ifdef TIM19_BASE + { uintptr_t(TIM19), 19 }, + #endif + #ifdef TIM9_BASE + { uintptr_t(TIM9), 9 }, + #endif + #ifdef TIM5_BASE + { uintptr_t(TIM5), 5 }, + #endif + #ifdef TIM4_BASE + { uintptr_t(TIM4), 4 }, + #endif + #ifdef TIM3_BASE + { uintptr_t(TIM3), 3 }, + #endif + #ifdef TIM2_BASE + { uintptr_t(TIM2), 2 }, + #endif + #ifdef TIM20_BASE + { uintptr_t(TIM20), 20 }, + #endif + #ifdef TIM8_BASE + { uintptr_t(TIM8), 8 }, + #endif + #ifdef TIM1_BASE + { uintptr_t(TIM1), 1 } + #endif +}; + +// Convert from a timer base address to its integer timer number. +static constexpr int get_timer_num_from_base_address(uintptr_t base_address) { + for (const auto &timer : stm32_timer_map) + if (timer.base_address == base_address) return timer.timer_number; + return 0; +} + +// The platform's SoftwareSerial.cpp will use the first timer from stm32_timer_map. +#if HAS_TMC_SW_SERIAL && !defined(TIMER_SERIAL) + #define TIMER_SERIAL (stm32_timer_map[0].base_address) #endif -// Place all timers used into an array, then recursively check for duplicates during compilation. -// This does not currently account for timers used for PWM, such as for fans. -// Timers are actually pointers. Convert to integers to simplify constexpr logic. -static constexpr uintptr_t timers_in_use[] = { - uintptr_t(TEMP_TIMER_DEV), // Override in pins file - uintptr_t(STEP_TIMER_DEV), // Override in pins file +// constexpr doesn't like using the base address pointers that timers evaluate to. +// We can get away with casting them to uintptr_t, if we do so inside an array. +// GCC will not currently do it directly to a uintptr_t. +IF_ENABLED(HAS_TMC_SW_SERIAL, static constexpr uintptr_t timer_serial[] = {uintptr_t(TIMER_SERIAL)}); +IF_ENABLED(SPEAKER, static constexpr uintptr_t timer_tone[] = {uintptr_t(TIMER_TONE)}); +IF_ENABLED(HAS_SERVOS, static constexpr uintptr_t timer_servo[] = {uintptr_t(TIMER_SERVO)}); + +enum TimerPurpose { TP_SERIAL, TP_TONE, TP_SERVO, TP_STEP, TP_TEMP }; + +// List of timers, to enable checking for conflicts. +// Includes the purpose of each timer to ease debugging when evaluating at build-time. +// This cannot yet account for timers used for PWM output, such as for fans. +static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = { #if HAS_TMC_SW_SERIAL - uintptr_t(TIMER_SERIAL), // Set in variant.h, or as a define in platformio.h if not present in variant.h + {TP_SERIAL, get_timer_num_from_base_address(timer_serial[0])}, // Set in variant.h, or as a define in platformio.h if not present in variant.h #endif #if ENABLED(SPEAKER) - uintptr_t(TIMER_TONE), // Set in variant.h, or as a define in platformio.h if not present in variant.h + {TP_TONE, get_timer_num_from_base_address(timer_tone[0])}, // Set in variant.h, or as a define in platformio.h if not present in variant.h #endif #if HAS_SERVOS - uintptr_t(TIMER_SERVO), // Set in variant.h, or as a define in platformio.h if not present in variant.h + {TP_SERVO, get_timer_num_from_base_address(timer_servo[0])}, // Set in variant.h, or as a define in platformio.h if not present in variant.h #endif - }; + {TP_STEP, STEP_TIMER}, + {TP_TEMP, TEMP_TIMER}, +}; -static constexpr bool verify_no_duplicate_timers() { +static constexpr bool verify_no_timer_conflicts() { LOOP_L_N(i, COUNT(timers_in_use)) LOOP_S_L_N(j, i + 1, COUNT(timers_in_use)) - if (timers_in_use[i] == timers_in_use[j]) return false; + if (timers_in_use[i].t == timers_in_use[j].t) return false; return true; } -// If this assertion fails at compile time, review the timers_in_use array. If default_envs is -// defined properly in platformio.ini, VS Code can evaluate the array when hovering over it, -// making it easy to identify the conflicting timers. -static_assert(verify_no_duplicate_timers(), "One or more timer conflict detected"); +// If this assertion fails at compile time, review the timers_in_use array. +// If default_envs is defined properly in platformio.ini, VS Code can evaluate the array +// when hovering over it, making it easy to identify the conflicting timers. +static_assert(verify_no_timer_conflicts(), "One or more timer conflict detected. Examine \"timers_in_use\" to help identify conflict."); #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC From f0b7f2702919f8d84ea93bf2b9ffa6e95937cab3 Mon Sep 17 00:00:00 2001 From: Chris Pepper Date: Tue, 22 Dec 2020 11:59:25 +0000 Subject: [PATCH 0766/1370] Fix UBL mesh inset Z position (#20538) --- Marlin/src/feature/bedlevel/ubl/ubl.h | 33 ++++++++----- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 49 ++++++++----------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index c90b1f7ac1..762becfb69 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -122,20 +122,29 @@ class unified_bed_leveling { FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + static int8_t cell_index_x_raw(const float &x) { + return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)); + } + + static int8_t cell_index_y_raw(const float &y) { + return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)); + } + + static int8_t cell_index_x_valid(const float &x) { + return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); + } + + static int8_t cell_index_y_valid(const float &y) { + return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); + } + static int8_t cell_index_x(const float &x) { - const int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); - return constrain(cx, 0, (GRID_MAX_POINTS_X) - 1); // -1 is appropriate if we want all movement to the X_MAX - } // position. But with this defined this way, it is possible - // to extrapolate off of this point even further out. Probably - // that is OK because something else should be keeping that from - // happening and should not be worried about at this level. + return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); + } + static int8_t cell_index_y(const float &y) { - const int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); - return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 1); // -1 is appropriate if we want all movement to the Y_MAX - } // position. But with this defined this way, it is possible - // to extrapolate off of this point even further out. Probably - // that is OK because something else should be keeping that from - // happening and should not be worried about at this level. + return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); + } static inline xy_int8_t cell_indexes(const float &x, const float &y) { return { cell_index_x(x), cell_index_y(y) }; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 010b5951be..8b7cd15a3c 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -56,39 +56,32 @@ // A move within the same cell needs no splitting if (istart == iend) { - // For a move off the bed, use a constant Z raise - if (!WITHIN(iend.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iend.y, 0, GRID_MAX_POINTS_Y - 1)) { - - // Note: There is no Z Correction in this case. We are off the grid and don't know what - // a reasonable correction would be. If the user has specified a UBL_Z_RAISE_WHEN_OFF_MESH - // value, that will be used instead of a calculated (Bi-Linear interpolation) correction. - - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - end.z += UBL_Z_RAISE_WHEN_OFF_MESH; - #endif - planner.buffer_segment(end, scaled_fr_mm_s, extruder); - current_position = destination; - return; - } - FINAL_MOVE: - // The distance is always MESH_X_DIST so multiply by the constant reciprocal. - const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST); + // When UBL_Z_RAISE_WHEN_OFF_MESH is disabled Z correction is extrapolated from the edge of the mesh + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + // For a move off the UBL mesh, use a constant Z raise + if (!cell_index_x_valid(end.x) || !cell_index_y_valid(end.y)) { - float z1, z2; - if (iend.x >= GRID_MAX_POINTS_X - 1) - z1 = z2 = 0.0; - else { - z1 = z_values[iend.x ][iend.y ] + xratio * - (z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]), - z2 = z_values[iend.x ][iend.y + 1] + xratio * - (z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]); - } + // Note: There is no Z Correction in this case. We are off the mesh and don't know what + // a reasonable correction would be, UBL_Z_RAISE_WHEN_OFF_MESH will be used instead of + // a calculated (Bi-Linear interpolation) correction. + + end.z += UBL_Z_RAISE_WHEN_OFF_MESH; + planner.buffer_segment(end, scaled_fr_mm_s, extruder); + current_position = destination; + return; + } + #endif + + // The distance is always MESH_X_DIST so multiply by the constant reciprocal. + const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST), + yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST), + z1 = z_values[iend.x][iend.y ] + xratio * (z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]), + z2 = z_values[iend.x][iend.y + 1] + xratio * (z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]); // X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset. - const float yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST), - z0 = iend.y < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z) : 0.0; + const float z0 = (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. From 30d98396317c3c39a89aa85e63ac8c2433198e76 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 22 Dec 2020 04:02:25 -0800 Subject: [PATCH 0767/1370] Overrides to prevent STM32 timer conflicts (#20545) --- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 3 +++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 3 +++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 3 +++ Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 4 ++++ Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 3 +++ Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 3 +++ platformio.ini | 2 +- 7 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index 93403b9ddd..e980d884a7 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -40,6 +40,9 @@ #define BOARD_NO_NATIVE_USB +// Avoid conflict with TIMER_SERVO when using the STM32 HAL +#define TEMP_TIMER 5 + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 4b644d693b..c430671b2e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -36,6 +36,9 @@ #define BOARD_NO_NATIVE_USB +// Avoid conflict with TIMER_SERVO when using the STM32 HAL +#define TEMP_TIMER 5 + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 1816d6bd41..063e548a32 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -37,6 +37,9 @@ #define BOARD_NO_NATIVE_USB +// Avoid conflict with TIMER_SERVO when using the STM32 HAL +#define TEMP_TIMER 5 + // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 808751d7a5..933ee532a9 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -31,6 +31,10 @@ #define BOARD_WEBSITE_URL "github.com/FLYmaker/FLYF407ZG" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +// Avoid conflict with fans and TIMER_TONE +#define TEMP_TIMER 3 +#define STEP_TIMER 5 + // // EEPROM Emulation // diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index 5ff29a1f1c..c48cbc9e56 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -31,6 +31,9 @@ #define BOARD_INFO_NAME "MKS Robin Nano V3" +// Avoid conflict with TIMER_TONE +#define STEP_TIMER 13 + // Use one of these or SDCard-based Emulation will be used //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index 48943ad973..40da409185 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -29,6 +29,9 @@ #define BOARD_INFO_NAME "MKS Robin PRO V2" +// Avoid conflict with TIMER_TONE +#define STEP_TIMER 13 + // Use one of these or SDCard-based Emulation will be used //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation diff --git a/platformio.ini b/platformio.ini index e7f22e3f09..acb5990edb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -980,7 +980,7 @@ board_build.ldscript = ldscript.ld board_build.offset = 0x7000 board_build.firmware = Robin.bin build_flags = ${common_stm32.build_flags} - -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 + -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 -DTIMER_SERIAL=TIM5 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC extra_scripts = ${common.extra_scripts} From a33c689c402186edd26092381e58272380a20b28 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Tue, 22 Dec 2020 13:17:06 +0100 Subject: [PATCH 0768/1370] Improve Touch Calibration screen (#20524) --- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 20 +++++++++++++++---- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 13 ++++++++++++ .../lib/mks_ui/draw_touch_calibration.cpp | 4 +--- .../lib/mks_ui/tft_lvgl_configuration.cpp | 7 +------ Marlin/src/lcd/tft_io/touch_calibration.cpp | 3 +++ Marlin/src/lcd/tft_io/touch_calibration.h | 6 ++++++ 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 1fcb1bd2e2..5c0f426292 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -55,6 +55,11 @@ #include "../../../../feature/pause.h" #endif +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "../../../tft_io/touch_calibration.h" + #include "draw_touch_calibration.h" +#endif + extern lv_group_t *g; static lv_obj_t *scr, *tempText1, *filament_bar; @@ -161,7 +166,16 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { else if (DIALOG_IS(REVERT_EEPROM_TIPS)) { TERN_(EEPROM_SETTINGS, (void)settings.reset()); clear_cur_ui(); - draw_return_ui(); + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + const bool do_draw_cal = touch_calibration.need_calibration(); + if (do_draw_cal) { + disp_state_stack._disp_index--; // We are asynchronous from the dialog, so let's remove the dialog from the stack + lv_draw_touch_calibration_screen(); + } + #else + constexpr bool do_draw_cal = false; + #endif + if (!do_draw_cal) draw_return_ui(); } else if (DIALOG_IS(WIFI_CONFIG_TIPS)) { uiCfg.configWifi = 1; @@ -181,9 +195,7 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; if (DIALOG_IS(PAUSE_MESSAGE_OPTION)) { - #if ENABLED(ADVANCED_PAUSE_FEATURE) - pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; - #endif + TERN_(ADVANCED_PAUSE_FEATURE, pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT); } else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT, TYPE_FILAMENT_HEAT_LOAD_COMPLETED, TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 51d8cea15e..3cf0c2bec3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -39,6 +39,11 @@ #include "../../../../module/temperature.h" #include "../../../../inc/MarlinConfig.h" +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "../../../tft_io/touch_calibration.h" + #include "draw_touch_calibration.h" +#endif + #include //static lv_obj_t *buttonPrint, *buttonTool, *buttonSet; @@ -215,6 +220,14 @@ void lv_draw_ready_print(void) { lv_big_button_create(scr, "F:/bmp_set.bin", main_menu.set, 180, 90, event_handler, ID_SET); lv_big_button_create(scr, "F:/bmp_printing.bin", main_menu.print, 340, 90, event_handler, ID_PRINT); } + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + // If calibration is required, let's trigger it now, handles the case when there is default value in configuration files + if (!touch_calibration.calibration_loaded()) { + lv_clear_ready_print(); + lv_draw_touch_calibration_screen(); + } + #endif } void lv_clear_ready_print() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.cpp index 69307a702b..8b9371fbe7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.cpp @@ -95,14 +95,12 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_TC_RETURN: TERN_(MKS_TEST, curent_disp_ui = 1); lv_clear_touch_calibration_screen(); - lv_draw_ready_print(); + draw_return_ui(); break; } } void lv_draw_touch_calibration_screen() { - disp_state_stack._disp_index = 0; - ZERO(disp_state_stack._disp_state); scr = lv_screen_create(TOUCH_CALIBRATION_UI, ""); status_label = lv_label_create(scr, ""); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 9e383a6abd..f943c1d6f9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -217,12 +217,7 @@ void tft_lvgl_init() { #endif if (ready) { - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_calibration.need_calibration()) lv_draw_touch_calibration_screen(); - else lv_draw_ready_print(); - #else - lv_draw_ready_print(); - #endif + lv_draw_ready_print(); } if (mks_test_flag == 0x1E) diff --git a/Marlin/src/lcd/tft_io/touch_calibration.cpp b/Marlin/src/lcd/tft_io/touch_calibration.cpp index e4ad8f215b..159f09d087 100644 --- a/Marlin/src/lcd/tft_io/touch_calibration.cpp +++ b/Marlin/src/lcd/tft_io/touch_calibration.cpp @@ -28,6 +28,7 @@ TouchCalibration touch_calibration; touch_calibration_t TouchCalibration::calibration; calibrationState TouchCalibration::calibration_state = CALIBRATION_NONE; touch_calibration_point_t TouchCalibration::calibration_points[4]; +uint8_t TouchCalibration::failed_count; void TouchCalibration::validate_calibration() { const bool landscape = validate_precision_x(0, 1) && validate_precision_x(2, 3) && validate_precision_y(0, 2) && validate_precision_y(1, 3); @@ -44,6 +45,8 @@ void TouchCalibration::validate_calibration() { else { calibration_state = CALIBRATION_FAIL; calibration_reset(); + // Retry up to 5 times before reporting the failure + if (need_calibration() && failed_count++ < 5) calibration_state = CALIBRATION_TOP_LEFT; } if (calibration_state == CALIBRATION_SUCCESS) { diff --git a/Marlin/src/lcd/tft_io/touch_calibration.h b/Marlin/src/lcd/tft_io/touch_calibration.h index 93ed9aa609..f8cbf99bf0 100644 --- a/Marlin/src/lcd/tft_io/touch_calibration.h +++ b/Marlin/src/lcd/tft_io/touch_calibration.h @@ -61,6 +61,7 @@ public: static void validate_calibration(); static touch_calibration_t calibration; + static uint8_t failed_count; static void calibration_reset() { calibration = { TOUCH_CALIBRATION_X, TOUCH_CALIBRATION_Y, TOUCH_OFFSET_X, TOUCH_OFFSET_Y, TOUCH_ORIENTATION }; } static bool need_calibration() { return !calibration.offset_x && !calibration.offset_y && !calibration.x && !calibration.y; } @@ -75,10 +76,15 @@ public: calibration_points[CALIBRATION_TOP_RIGHT].y = 30; calibration_points[CALIBRATION_BOTTOM_RIGHT].x = TFT_WIDTH - 31; calibration_points[CALIBRATION_BOTTOM_RIGHT].y = TFT_HEIGHT - 31; + failed_count = 0; return calibration_state; } static void calibration_end() { calibration_state = CALIBRATION_NONE; } static calibrationState get_calibration_state() { return calibration_state; } + static bool calibration_loaded() { + if (need_calibration()) calibration_reset(); + return !need_calibration(); + } static bool handleTouch(uint16_t x, uint16_t y); }; From 59b5cb6fe266c060339b78050e2f6dd19203c2e4 Mon Sep 17 00:00:00 2001 From: Sean McGroty Date: Tue, 22 Dec 2020 07:25:12 -0500 Subject: [PATCH 0769/1370] Creality v4.3.1 (Ender 6) board (#20512) --- Marlin/src/core/boards.h | 15 ++++---- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_CREALITY_V427.h | 4 -- Marlin/src/pins/stm32f1/pins_CREALITY_V431.h | 39 ++++++++++++++++++++ 4 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V431.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index ec39ad4e71..cd32698069 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -329,13 +329,14 @@ #define BOARD_CHITU3D_V6 4036 // Chitu3D TronXY X5SA V5 Board #define BOARD_CREALITY_V4 4037 // Creality v4.x (STM32F103RE) #define BOARD_CREALITY_V427 4038 // Creality v4.2.7 (STM32F103RE) -#define BOARD_CREALITY_V452 4039 // Creality v4.5.2 (STM32F103RE) -#define BOARD_CREALITY_V453 4040 // Creality v4.5.3 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4041 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4042 // FLY MINI (STM32F103RCT6) -#define BOARD_FLSUN_HISPEED 4043 // FLSUN HiSpeedV1 (STM32F103VET6) -#define BOARD_BEAST 4044 // STM32F103RET6 Libmaple-based controller -#define BOARD_BTT_SKR_CR6 4045 // BigTreeTech SKR CR6 v1.0 (STM32F103RE) +#define BOARD_CREALITY_V431 4039 // Creality v4.3.1 (STM32F103RE) +#define BOARD_CREALITY_V452 4040 // Creality v4.5.2 (STM32F103RE) +#define BOARD_CREALITY_V453 4041 // Creality v4.5.3 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4042 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4043 // FLY MINI (STM32F103RCT6) +#define BOARD_FLSUN_HISPEED 4044 // FLSUN HiSpeedV1 (STM32F103VET6) +#define BOARD_BEAST 4045 // STM32F103RET6 Libmaple-based controller +#define BOARD_BTT_SKR_CR6 4046 // BigTreeTech SKR CR6 v1.0 (STM32F103RE) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index dbafed2d4e..b14228cbf5 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -530,6 +530,8 @@ #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality #elif MB(CREALITY_V427) #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality +#elif MB(CREALITY_V431) + #include "stm32f1/pins_CREALITY_V431.h" // STM32F1 env:STM32F103RET6_creality #elif MB(CREALITY_V452) #include "stm32f1/pins_CREALITY_V452.h" // STM32F1 env:STM32F103RET6_creality #elif MB(CREALITY_V453) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h index d51aaa956a..64ef046bd3 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h @@ -24,10 +24,6 @@ * CREALITY v4.2.7 (STM32F103) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - #define BOARD_INFO_NAME "Creality v4.2.7" #define DEFAULT_MACHINE_NAME "Creality3D" diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V431.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V431.h new file mode 100644 index 0000000000..ff9f76054e --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V431.h @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * CREALITY v4.3.1 (STM32F103) board pin assignments + */ + +#define BOARD_INFO_NAME "Creality v4.3.1" +#define DEFAULT_MACHINE_NAME "Creality3D" + +// +// Steppers +// +#define X_STEP_PIN PB8 +#define X_DIR_PIN PB7 + +#define Y_STEP_PIN PC2 +#define Y_DIR_PIN PB9 + +#include "pins_CREALITY_V4.h" From aa65c6e477c778e59cde1c646fbe5fb44cfa8508 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 22 Dec 2020 04:51:29 -0800 Subject: [PATCH 0770/1370] Anet ET4 / ET4P and Anet TFT28 / TFT35 (#20280) --- Marlin/Configuration.h | 10 + Marlin/src/HAL/STM32/tft/tft_fsmc.cpp | 35 ++-- Marlin/src/HAL/STM32/tft/tft_fsmc.h | 41 +++-- Marlin/src/HAL/STM32/tft/xpt2046.h | 9 +- Marlin/src/core/boards.h | 2 + Marlin/src/core/macros.h | 4 +- Marlin/src/inc/Conditionals_LCD.h | 38 ++-- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/lcd/tft/canvas.cpp | 2 +- Marlin/src/lcd/tft/tft.h | 7 + Marlin/src/lcd/tft/tft_queue.cpp | 27 +-- Marlin/src/lcd/tft/ui_320x240.cpp | 14 +- Marlin/src/lcd/tft_io/tft_io.h | 14 +- Marlin/src/pins/pins.h | 4 + Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 223 +++++++++++++++++++++++ Marlin/src/pins/stm32f4/pins_ANET_ET4P.h | 34 ++++ platformio.ini | 23 +++ 17 files changed, 407 insertions(+), 84 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_ANET_ET4.h create mode 100644 Marlin/src/pins/stm32f4/pins_ANET_ET4P.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 5fe746a77f..ce24bd2117 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2368,6 +2368,16 @@ // //#define LONGER_LK_TFT28 +// +// 320x240, 2.8", FSMC Stock Display from ET4 +// +//#define ANET_ET4_TFT28 + +// +// 480x320, 3.5", FSMC Stock Display from ET5 +// +//#define ANET_ET5_TFT35 + // // Generic TFT with detailed options // diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp index b6bc7fcd84..2a5ad4595b 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp @@ -48,13 +48,14 @@ void TFT_FSMC::Init() { uint32_t NSBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); + // Perform the SRAM1 memory initialization sequence SRAMx.Instance = FSMC_NORSRAM_DEVICE; SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE; - /* SRAMx.Init */ + // SRAMx.Init SRAMx.Init.NSBank = NSBank; SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; - SRAMx.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; + SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16); SRAMx.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; SRAMx.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE; @@ -67,8 +68,8 @@ void TFT_FSMC::Init() { #ifdef STM32F4xx SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE; #endif - /* Read Timing - relatively slow to ensure ID information is correctly read from TFT controller */ - /* Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss */ + // Read Timing - relatively slow to ensure ID information is correctly read from TFT controller + // Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss Timing.AddressSetupTime = 15; Timing.AddressHoldTime = 15; Timing.DataSetupTime = 24; @@ -76,8 +77,8 @@ void TFT_FSMC::Init() { Timing.CLKDivision = 16; Timing.DataLatency = 17; Timing.AccessMode = FSMC_ACCESS_MODE_A; - /* Write Timing */ - /* Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss */ + // Write Timing + // Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss ExtTiming.AddressSetupTime = 8; ExtTiming.AddressHoldTime = 15; ExtTiming.DataSetupTime = 8; @@ -131,7 +132,7 @@ void TFT_FSMC::Init() { uint32_t TFT_FSMC::GetID() { uint32_t id; - WriteReg(0x0000); + WriteReg(0); id = LCD->RAM; if (id == 0) @@ -141,16 +142,16 @@ uint32_t TFT_FSMC::GetID() { return id; } - uint32_t TFT_FSMC::ReadID(uint16_t Reg) { - uint32_t id; - WriteReg(Reg); - id = LCD->RAM; // dummy read - id = Reg << 24; - id |= (LCD->RAM & 0x00FF) << 16; - id |= (LCD->RAM & 0x00FF) << 8; - id |= LCD->RAM & 0x00FF; - return id; - } +uint32_t TFT_FSMC::ReadID(tft_data_t Reg) { + uint32_t id; + WriteReg(Reg); + id = LCD->RAM; // dummy read + id = Reg << 24; + id |= (LCD->RAM & 0x00FF) << 16; + id |= (LCD->RAM & 0x00FF) << 8; + id |= LCD->RAM & 0x00FF; + return id; +} bool TFT_FSMC::isBusy() { if (__IS_DMA_ENABLED(&DMAtx)) diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h index e2e0128c5e..ad39d10d63 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h @@ -44,9 +44,12 @@ #define DATASIZE_16BIT SPI_DATASIZE_16BIT #define TFT_IO_DRIVER TFT_FSMC +#define TFT_DATASIZE TERN(TFT_INTERFACE_FSMC_8BIT, DATASIZE_8BIT, DATASIZE_16BIT) +typedef TERN(TFT_INTERFACE_FSMC_8BIT, uint8_t, uint16_t) tft_data_t; + typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; + __IO tft_data_t REG; + __IO tft_data_t RAM; } LCD_CONTROLLER_TypeDef; class TFT_FSMC { @@ -56,8 +59,8 @@ class TFT_FSMC { static LCD_CONTROLLER_TypeDef *LCD; - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data) { LCD->RAM = Data; __DSB(); } + static uint32_t ReadID(tft_data_t Reg); + static void Transmit(tft_data_t Data) { LCD->RAM = Data; __DSB(); } static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); public: @@ -66,11 +69,11 @@ class TFT_FSMC { static bool isBusy(); static void Abort() { __HAL_DMA_DISABLE(&DMAtx); } - static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {} + static void DataTransferBegin(uint16_t DataWidth = TFT_DATASIZE) {} static void DataTransferEnd() {}; - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg) { LCD->REG = Reg; __DSB(); } + static void WriteData(uint16_t Data) { Transmit(tft_data_t(Data)); } + static void WriteReg(uint16_t Reg) { LCD->REG = tft_data_t(Reg); __DSB(); } static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } @@ -98,14 +101,16 @@ const PinMap PinMap_FSMC[] = { {PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05 {PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06 {PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07 - {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08 - {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09 - {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10 - {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11 - {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12 - {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13 - {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14 - {PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15 + #if DISABLED(TFT_INTERFACE_FSMC_8BIT) + {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08 + {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09 + {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10 + {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11 + {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12 + {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13 + {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14 + {PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15 + #endif {PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE {PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE {NC, NP, 0} @@ -121,7 +126,11 @@ const PinMap PinMap_FSMC_CS[] = { {NC, NP, 0} }; -#define FSMC_RS(A) (void *)((2 << A) - 2) +#if ENABLED(TFT_INTERFACE_FSMC_8BIT) + #define FSMC_RS(A) (void *)((2 << (A-1)) - 1) +#else + #define FSMC_RS(A) (void *)((2 << A) - 2) +#endif const PinMap PinMap_FSMC_RS[] = { #ifdef PF0 diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h index 3acf3898a3..78cb7a4ba5 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32/tft/xpt2046.h @@ -23,8 +23,10 @@ #ifdef STM32F1xx #include + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) #elif defined(STM32F4xx) #include + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) #endif #include "../../../inc/MarlinConfig.h" @@ -60,13 +62,6 @@ enum XPTCoordinate : uint8_t { #define XPT2046_Z1_THRESHOLD 10 #endif -#ifdef STM32F1xx - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) -#elif defined(STM32F4xx) - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) -#endif - - class XPT2046 { private: static SPI_HandleTypeDef SPIx; diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index cd32698069..0e27fc998b 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -370,6 +370,8 @@ #define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE) #define BOARD_MKS_ROBIN_PRO_V2 4219 // MKS Robin Pro V2 (STM32F407VE) #define BOARD_MKS_ROBIN_NANO_V3 4220 // MKS Robin Nano V3 (STM32F407VG) +#define BOARD_ANET_ET4 4221 // ANET ET4 V1.x (STM32F407VGT6) +#define BOARD_ANET_ET4P 4222 // ANET ET4P V1.x (STM32F407VGT6) // // ARM Cortex M7 diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 2e38fad30e..76e55ad3d2 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -151,7 +151,7 @@ #endif -// Macros to chain up to 12 conditions +// Macros to chain up to 14 conditions #define _DO_1(W,C,A) (_##W##_1(A)) #define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B)) #define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V)) @@ -164,6 +164,8 @@ #define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V)) #define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V)) #define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) +#define _DO_13(W,C,A,V...) (_##W##_1(A) C _DO_12(W,C,V)) +#define _DO_14(W,C,A,V...) (_##W##_1(A) C _DO_13(W,C,V)) #define __DO_N(W,C,N,V...) _DO_##N(W,C,V) #define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) #define DO(W,C,V...) (_DO_N(W,C,NUM_ARGS(V),V)) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index c683753600..386482b3ac 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1073,28 +1073,23 @@ * - TFT_COLOR * - GRAPHICAL_TFT_UPSCALE */ -#if ENABLED(MKS_TS35_V2_0) - // Most common: ST7796 +#if ENABLED(MKS_TS35_V2_0) // Most common: ST7796 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) #define TFT_RES_480x320 #define TFT_INTERFACE_SPI -#elif ENABLED(MKS_ROBIN_TFT24) - // Most common: ST7789 +#elif ENABLED(MKS_ROBIN_TFT24) // Most common: ST7789 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC -#elif ENABLED(MKS_ROBIN_TFT28) - // Most common: ST7789 +#elif ENABLED(MKS_ROBIN_TFT28) // Most common: ST7789 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC -#elif ENABLED(MKS_ROBIN_TFT32) - // Most common: ST7789 +#elif ENABLED(MKS_ROBIN_TFT32) // Most common: ST7789 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC -#elif ENABLED(MKS_ROBIN_TFT35) - // Most common: ILI9488 +#elif ENABLED(MKS_ROBIN_TFT35) // Most common: ILI9488 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_RES_480x320 #define TFT_INTERFACE_FSMC @@ -1103,12 +1098,11 @@ #define TFT_DRIVER SSD1963 #define TFT_RES_480x272 #define TFT_INTERFACE_FSMC -#elif ENABLED(MKS_ROBIN_TFT_V1_1R) - // ILI9328 or R61505 +#elif ENABLED(MKS_ROBIN_TFT_V1_1R) // ILI9328 or R61505 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC -#elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) +#elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) // ILI9488 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_DRIVER ILI9488 #define TFT_RES_480x320 @@ -1117,6 +1111,14 @@ #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC +#elif ENABLED(ANET_ET4_TFT28) // ST7789 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) + #define TFT_RES_320x240 + #define TFT_INTERFACE_FSMC +#elif ENABLED(ANET_ET5_TFT35) // ST7796 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) + #define TFT_RES_480x320 + #define TFT_INTERFACE_FSMC #elif ENABLED(TFT_GENERIC) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #if NONE(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320) @@ -1197,11 +1199,9 @@ #define TOUCH_OFFSET_X XPT2046_X_OFFSET #define TOUCH_OFFSET_Y XPT2046_Y_OFFSET #define TOUCH_ORIENTATION TOUCH_LANDSCAPE - #else - #define TOUCH_CALIBRATION_X 0 - #define TOUCH_CALIBRATION_Y 0 - #define TOUCH_OFFSET_X 0 - #define TOUCH_OFFSET_Y 0 - #define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE #endif #endif + +#if MB(ANET_ET4, ANET_ET4P) + #define IS_ANET_ET 1 +#endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 0ff80dc964..a04dc786b2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2303,7 +2303,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) \ + COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \ + COUNT_ENABLED(MKS_12864OLED, MKS_12864OLED_SSD1306) \ - + COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R) \ + + COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, ANET_ET4_TFT28, ANET_ET5_TFT35) \ + COUNT_ENABLED(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) \ + COUNT_ENABLED(VIKI2, miniVIKI) \ + COUNT_ENABLED(ZONESTAR_12864LCD, ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) \ @@ -2347,7 +2347,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #undef IS_EXTUI #undef IS_LEGACY_TFT -#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28) +#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28, ANET_ET4_TFT28, ANET_ET5_TFT35) #if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI) #error "TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI is required for your TFT. Please enable one." #elif 1 < ENABLED(TFT_COLOR_UI) + ENABLED(TFT_CLASSIC_UI) + ENABLED(TFT_LVGL_UI) diff --git a/Marlin/src/lcd/tft/canvas.cpp b/Marlin/src/lcd/tft/canvas.cpp index 061f078b92..3c2cda4fd5 100644 --- a/Marlin/src/lcd/tft/canvas.cpp +++ b/Marlin/src/lcd/tft/canvas.cpp @@ -95,7 +95,7 @@ void CANVAS::AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) if (line >= startLine && line < endLine) { uint16_t *pixel = buffer + x + (line - startLine) * width; for (int16_t j = 0; j < image_width; j++) { - if ((x + j >= 0) && (x + j < width)) *pixel = *data; + if ((x + j >= 0) && (x + j < width)) *pixel = ENDIAN_COLOR(*data); pixel++; data++; } diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h index ed3d5e35c1..159d0e1c19 100644 --- a/Marlin/src/lcd/tft/tft.h +++ b/Marlin/src/lcd/tft/tft.h @@ -30,6 +30,13 @@ #include "../../inc/MarlinConfig.h" +#if TFT_INTERFACE_FSMC_8BIT + // When we have a 8 bit interface, we need to invert the bytes of the color + #define ENDIAN_COLOR(C) (((C) >> 8) | ((C) << 8)) +#else + #define ENDIAN_COLOR(C) (C) +#endif + #if HAS_UI_320x240 #define TFT_WIDTH 320 #define TFT_HEIGHT 240 diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp index 0b538ef4a8..ea0bf0f00a 100644 --- a/Marlin/src/lcd/tft/tft_queue.cpp +++ b/Marlin/src/lcd/tft/tft_queue.cpp @@ -158,7 +158,7 @@ void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, ui task_parameters->y = y; task_parameters->width = width; task_parameters->height = height; - task_parameters->color = color; + task_parameters->color = ENDIAN_COLOR(color); task_parameters->count = width * height; *end_of_queue = TASK_END_OF_QUEUE; @@ -200,7 +200,7 @@ void TFT_Queue::set_background(uint16_t color) { last_parameter = end_of_queue; parameters->type = CANVAS_SET_BACKGROUND; - parameters->color = color; + parameters->color = ENDIAN_COLOR(color); end_of_queue += sizeof(parametersCanvasBackground_t); task_parameters->count++; @@ -227,7 +227,7 @@ void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string parameters->type = CANVAS_ADD_TEXT; parameters->x = x; parameters->y = y; - parameters->color = color; + parameters->color = ENDIAN_COLOR(color); parameters->stringLength = 0; parameters->maxWidth = maxWidth; @@ -261,18 +261,19 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *col if (color_mode == HIGHCOLOR) return; uint16_t *color = (uint16_t *)end_of_queue; - uint8_t number_of_color = 0; + uint8_t color_count = 0; switch (color_mode) { - case GREYSCALE1: number_of_color = 1; break; - case GREYSCALE2: number_of_color = 3; break; - case GREYSCALE4: number_of_color = 15; break; - default: - break; + case GREYSCALE1: color_count = 1; break; + case GREYSCALE2: color_count = 3; break; + case GREYSCALE4: color_count = 15; break; + default: break; } - while (number_of_color--) { - *color++ = *colors++; + uint16_t tmp; + while (color_count--) { + tmp = *colors++; + *color++ = ENDIAN_COLOR(tmp); } end_of_queue = (uint8_t *)color; @@ -326,7 +327,7 @@ void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, parameters->y = y; parameters->width = width; parameters->height = height; - parameters->color = color; + parameters->color = ENDIAN_COLOR(color); end_of_queue += sizeof(parametersCanvasBar_t); task_parameters->count++; @@ -344,7 +345,7 @@ void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t h parameters->y = y; parameters->width = width; parameters->height = height; - parameters->color = color; + parameters->color = ENDIAN_COLOR(color); end_of_queue += sizeof(parametersCanvasRectangle_t); task_parameters->count++; diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index ceea4a428e..bcd1cb2ab9 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -414,21 +414,21 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const valu extern screenFunc_t _manual_move_func_ptr; if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { - #define SLIDER_LENGHT 224 + #define SLIDER_LENGTH 224 #define SLIDER_Y_POSITION 140 - tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); + tft.canvas((TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION, SLIDER_LENGTH, 16); tft.set_background(COLOR_BACKGROUND); - int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; + int16_t position = (SLIDER_LENGTH - 2) * ui.encoderPosition / maxEditValue; tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); tft.add_bar(1, 6, position, 4, COLOR_SLIDER); - tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); - tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); + tft.add_bar(position + 1, 6, SLIDER_LENGTH - 2 - position, 4, COLOR_SLIDER_INACTIVE); + tft.add_bar(SLIDER_LENGTH - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); #if ENABLED(TOUCH_SCREEN) - tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); - touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); + tft.add_image((SLIDER_LENGTH - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); + touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGTH, 32, maxEditValue); #endif } diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h index 50b0ce4463..aa081be486 100644 --- a/Marlin/src/lcd/tft_io/tft_io.h +++ b/Marlin/src/lcd/tft_io/tft_io.h @@ -75,8 +75,20 @@ #define TOUCH_LANDSCAPE 1 #define TOUCH_PORTRAIT 2 +#ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X 0 +#endif +#ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y 0 +#endif +#ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X 0 +#endif +#ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y 0 +#endif #ifndef TOUCH_ORIENTATION - #define TOUCH_ORIENTATION TOUCH_LANDSCAPE + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE #endif #define SSD1963 0x5761 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index b14228cbf5..9cbbf84668 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -598,6 +598,10 @@ #include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2 #elif MB(MKS_ROBIN_NANO_V3) #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 +#elif MB(ANET_ET4) + #include "stm32f4/pins_ANET_ET4.h" // STM32F4 env:Anet_ET4_OpenBLT +#elif MB(ANET_ET4P) + #include "stm32f4/pins_ANET_ET4P.h" // STM32F4 env:Anet_ET4_OpenBLT // // ARM Cortex M7 diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h new file mode 100644 index 0000000000..c0bbe2f423 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h @@ -0,0 +1,223 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "Anet ET4 only supports one hotend / E-stepper. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Anet ET4 1.x" +#endif + +// +// EEPROM +// + +// Use one of these or SDCard-based Emulation will be used +#if NO_EEPROM_SELECTED + //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation + #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation + //#define IIC_BL24CXX_EEPROM // Use I2C EEPROM onboard IC (AT24C04C, Size 4KB, PageSize 16B) +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#elif ENABLED(IIC_BL24CXX_EEPROM) + #define IIC_EEPROM_SDA PB11 + #define IIC_EEPROM_SCL PB10 + #define EEPROM_DEVICE_ADDRESS 0xA0 + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// +// Limit Switches +// +#define X_STOP_PIN PC13 +#define Y_STOP_PIN PE12 +#define Z_STOP_PIN PE11 + +// +// Z Probe +// +#if ENABLED(BLTOUCH) + #error "You will need to use 24V to 5V converter and remove one resistor and capacitor from the motherboard. See https://github.com/davidtgbe/Marlin/blob/bugfix-2.0.x/docs/Tutorials/bltouch-en.md for more information. Comment out this line to proceed at your own risk." + #define SERVO0_PIN PC3 +#elif !defined(Z_MIN_PROBE_PIN) + #define Z_MIN_PROBE_PIN PC3 +#endif + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA2 +#endif + +// +// Power Loss Detection +// +#ifndef POWER_LOSS_PIN + #define POWER_LOSS_PIN PA8 +#endif + +// +// LED PIN +// +#define LED_PIN PD12 + +// +// Steppers +// +#define X_STEP_PIN PB6 +#define X_DIR_PIN PB5 +#define X_ENABLE_PIN PB7 + +#define Y_STEP_PIN PB3 +#define Y_DIR_PIN PD6 +#define Y_ENABLE_PIN PB4 + +#define Z_STEP_PIN PA12 +#define Z_DIR_PIN PA11 +#define Z_ENABLE_PIN PA15 + +#define E0_STEP_PIN PB9 +#define E0_DIR_PIN PB8 +#define E0_ENABLE_PIN PE0 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA1 +#define TEMP_BED_PIN PA4 + +// +// Heaters +// +#define HEATER_0_PIN PA0 +#define HEATER_BED_PIN PE2 + +// +// Fans +// +#define FAN_PIN PE3 // Layer fan +#define FAN1_PIN PE1 // Hotend fan + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN FAN1_PIN +#endif + +// +// LCD / Controller +// +#define TFT_RESET_PIN PE6 +#define TFT_CS_PIN PD7 +#define TFT_RS_PIN PD13 +#define TFT_INTERFACE_FSMC_8BIT + +// +// Touch Screen +// https://ldm-systems.ru/f/doc/catalog/HY-TFT-2,8/XPT2046.pdf +// +#if ENABLED(TOUCH_SCREEN) + #define TOUCH_CS_PIN PB2 + #define TOUCH_SCK_PIN PB0 + #define TOUCH_MOSI_PIN PE5 + #define TOUCH_MISO_PIN PE4 + #define TOUCH_INT_PIN PB1 +#endif + +// Touchscreen calibration does not work correctly with ANET_ET5_TFT35 or ANET_ET4_TFT28 +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #undef TOUCH_SCREEN_CALIBRATION +#endif + +#if ENABLED(ANET_ET5_TFT35) + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X 17125 + #endif + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y -11307 + #endif + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X -26 + #endif + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y 337 + #endif + #ifndef TOUCH_ORIENTATION + #define TOUCH_ORIENTATION TOUCH_PORTRAIT + #endif +#elif ENABLED(ANET_ET4_TFT28) + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X -11838 + #endif + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y 8776 + #endif + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X 333 + #endif + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y -17 + #endif + #ifndef TOUCH_ORIENTATION + #define TOUCH_ORIENTATION TOUCH_PORTRAIT + #endif +#endif + +// +// SD Card +// +//#define SDIO_SUPPORT + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION CUSTOM_CABLE +#endif + +#if ENABLED(SDSUPPORT) + + #define SDIO_D0_PIN PC8 + #define SDIO_D1_PIN PC9 + #define SDIO_D2_PIN PC10 + #define SDIO_D3_PIN PC11 + #define SDIO_CK_PIN PC12 + #define SDIO_CMD_PIN PD2 + + #if DISABLED(SDIO_SUPPORT) + #define SOFTWARE_SPI + #define SDSS SDIO_D3_PIN + #define SCK_PIN SDIO_CK_PIN + #define MISO_PIN SDIO_D0_PIN + #define MOSI_PIN SDIO_CMD_PIN + #endif + + #ifndef SD_DETECT_PIN + #define SD_DETECT_PIN PD3 + #endif + +#endif diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4P.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4P.h new file mode 100644 index 0000000000..eecabbaf98 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4P.h @@ -0,0 +1,34 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#define BOARD_INFO_NAME "Anet ET4P 1.x" + +// +// TMC2208 Configuration_adv defaults for Anet ET4P-MB_V1.x +// +#if !AXIS_DRIVER_TYPE_X(TMC2208_STANDALONE) || !AXIS_DRIVER_TYPE_Y(TMC2208_STANDALONE) || !AXIS_DRIVER_TYPE_Z(TMC2208_STANDALONE) || !AXIS_DRIVER_TYPE_E0(TMC2208_STANDALONE) + #error "ANET_ET4P requires ([XYZ]|E0)_DRIVER_TYPE set to TMC2208_STANDALONE." +#endif + +#include "pins_ANET_ET4.h" diff --git a/platformio.ini b/platformio.ini index acb5990edb..0b2e7c0915 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1241,6 +1241,29 @@ build_flags = ${common_stm32.build_flags} extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +# +# Anet ET4-MB_V1.x/ET4P-MB_V1.x (STM32F407VGT6 ARM Cortex-M4) +# For use with with davidtgbe's OpenBLT bootloader https://github.com/davidtgbe/openblt/releases +# Comment out board_build.offset = 0x10000 if you don't plan to use OpenBLT/flashing directly to 0x08000000. +# +[env:Anet_ET4_OpenBLT] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DHAL_SD_MODULE_ENABLED -DHAL_SRAM_MODULE_ENABLED +board = genericSTM32F407VGT6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.firmware = firmware.srec +board_build.offset = 0x10000 +board_upload.offset_address = 0x08010000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + # # BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) # From 256e94980e797dc0309efa8ea412a896b037232d Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Tue, 22 Dec 2020 14:56:00 +0200 Subject: [PATCH 0771/1370] STM32F1xx support for TFTGLCD (#20515) --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 6 ++++++ Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 12 ++++++------ Marlin/src/pins/stm32f1/pins_MORPHEUS.h | 3 ++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 11bea18c81..549fd7721f 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -972,6 +972,12 @@ MeshFlags done_flags{0}; const xy_int8_t &lpos = location.pos; + + #if IS_TFTGLCD_PANEL + lcd_mesh_edit_setup(0); // Change current screen before calling ui.ubl_plot + safe_delay(50); + #endif + do { location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags); diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index cadd693f6f..57146519a4 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -32,7 +32,7 @@ * and supports color output. */ -#if NONE(__AVR__, TARGET_LPC1768, __STM32F1__, STM32F4xx) +#if NONE(__AVR__, TARGET_LPC1768, STM32F1, STM32F4xx) #warning "Selected platform not yet tested. Please contribute your good pin mappings." #endif @@ -129,7 +129,7 @@ static uint8_t PanelDetected = 0; #if ANY(__AVR__, TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) #define SPI_SEND_ONE(V) SPI.transfer(V); #define SPI_SEND_TWO(V) SPI.transfer16(V); -#elif defined(STM32F4xx) +#elif EITHER(STM32F4xx, STM32F1xx) #define SPI_SEND_ONE(V) SPI.transfer(V, SPI_CONTINUE); #define SPI_SEND_TWO(V) SPI.transfer16(V, SPI_CONTINUE); #elif defined(ARDUINO_ARCH_ESP32) @@ -139,7 +139,7 @@ static uint8_t PanelDetected = 0; #if ANY(__AVR__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L); -#elif defined(STM32F4xx) +#elif EITHER(STM32F4xx, STM32F1xx) #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L, SPI_CONTINUE); #elif ANY(TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_ESP32) #define SPI_SEND_SOME(V,L,Z) do{ for (uint16_t i = 0; i < L; i++) SPI_SEND_ONE(V[(Z)+i]); }while(0) @@ -276,7 +276,7 @@ uint8_t MarlinUI::read_slow_buttons(void) { Wire.endTransmission(); #ifdef __AVR__ Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1); - #elif defined(__STM32F1__) + #elif defined(STM32F1) Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2); #elif EITHER(STM32F4xx, TARGET_LPC1768) Wire.requestFrom(LCD_I2C_ADDRESS, 2); @@ -330,7 +330,7 @@ void MarlinUI::init_lcd() { Wire.endTransmission(); // send buffer #ifdef __AVR__ Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 1, 0, 0, 1); - #elif ANY(__STM32F1__, STM32F4xx, TARGET_LPC1768) + #elif ANY(STM32F1, STM32F4xx, TARGET_LPC1768) Wire.requestFrom(LCD_I2C_ADDRESS, 1); #endif t = (uint8_t)Wire.read(); @@ -626,7 +626,7 @@ Equal to 20x10 text LCD | ttc ttc % | ttc - current temperature | tts tts %%% | tts - setted temperature, %%% - percent for FAN | ICO ICO ICO ICO | ICO - icon 48x48, placed in 2 text lines -| ICO ICO ICO ICO | ICO / +| ICO ICO ICO ICO | ICO or diff --git a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h index ccc92b7527..05e02c9e4d 100644 --- a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h +++ b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h @@ -30,7 +30,7 @@ * MORPHEUS Board pin assignments */ -#if NOT_TARGET(__STM32F1__) +#if NOT_TARGET(__STM32F1__, STM32F1xx) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif @@ -90,3 +90,4 @@ #define LED_PIN PC13 #define SDSS PA3 #define TFTGLCD_CS PA4 +#define SD_DETECT_PIN PC14 From 7c8cff0d3c0aea31ac43132bb8e883d579422977 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 22 Dec 2020 09:57:11 -0300 Subject: [PATCH 0772/1370] Unify FYSETC F6 1.3 / 1.4 (#20507) Co-authored-by: Scott Lahteine --- .github/workflows/test-builds.yml | 2 +- Marlin/src/pins/pins.h | 4 +-- .../share/PlatformIO/boards/fysetc_f6.json | 34 +++++++++++++++++++ .../{FYSETC_F6_13-tests => FYSETC_F6-tests} | 0 platformio.ini | 14 ++------ 5 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 buildroot/share/PlatformIO/boards/fysetc_f6.json rename buildroot/tests/{FYSETC_F6_13-tests => FYSETC_F6-tests} (100%) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 53ffbe0c08..7549e3defc 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -48,7 +48,7 @@ jobs: # Extended AVR Environments - - FYSETC_F6_13 + - FYSETC_F6 - mega1280 - rambo - sanguino1284p diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 9cbbf84668..2218d2fe49 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -163,9 +163,9 @@ #elif MB(DAGOMA_F5) #include "ramps/pins_DAGOMA_F5.h" // ATmega2560 env:mega2560 #elif MB(FYSETC_F6_13) - #include "ramps/pins_FYSETC_F6_13.h" // ATmega2560 env:FYSETC_F6_13 + #include "ramps/pins_FYSETC_F6_13.h" // ATmega2560 env:FYSETC_F6 #elif MB(FYSETC_F6_14) - #include "ramps/pins_FYSETC_F6_14.h" // ATmega2560 env:FYSETC_F6_14 + #include "ramps/pins_FYSETC_F6_14.h" // ATmega2560 env:FYSETC_F6 #elif MB(DUPLICATOR_I3_PLUS) #include "ramps/pins_DUPLICATOR_I3_PLUS.h" // ATmega2560 env:mega2560 #elif MB(VORON) diff --git a/buildroot/share/PlatformIO/boards/fysetc_f6.json b/buildroot/share/PlatformIO/boards/fysetc_f6.json new file mode 100644 index 0000000000..2772f73a65 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/fysetc_f6.json @@ -0,0 +1,34 @@ +{ + "build": { + "core": "arduino", + "extra_flags": "-DARDUINO_AVR_MEGA2560", + "f_cpu": "16000000L", + "hwids": [ + [ + "0x27b2", + "0x0002" + ] + ], + "mcu": "atmega2560", + "variant": "fysetcf6" + }, + "debug": { + "simavr_target": "atmega2560", + "avr-stub": { + "speed": 115200 + } + }, + "frameworks": [ + "arduino" + ], + "name": "FYSETC F6", + "upload": { + "maximum_ram_size": 8192, + "maximum_size": 258048, + "protocol": "wiring", + "require_upload_port": true, + "speed": 115200 + }, + "url": "https://www.fysetc.com/", + "vendor": "FYSETC" +} diff --git a/buildroot/tests/FYSETC_F6_13-tests b/buildroot/tests/FYSETC_F6-tests similarity index 100% rename from buildroot/tests/FYSETC_F6_13-tests rename to buildroot/tests/FYSETC_F6-tests diff --git a/platformio.ini b/platformio.ini index 0b2e7c0915..bf44808b32 100644 --- a/platformio.ini +++ b/platformio.ini @@ -505,20 +505,12 @@ extends = common_avr8 board = reprap_rambo # -# FYSETC F6 V1.3 +# FYSETC F6 V1.3 / V1.4 # -[env:FYSETC_F6_13] +[env:FYSETC_F6] platform = atmelavr extends = common_avr8 -board = fysetc_f6_13 - -# -# FYSETC F6 V1.4 -# -[env:FYSETC_F6_14] -platform = atmelavr -extends = common_avr8 -board = fysetc_f6_14 +board = fysetc_f6 # # Sanguinololu (ATmega644p) From be3e45d759e52bf99d2851a2f7707bb7899b457b Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Tue, 22 Dec 2020 14:01:24 +0100 Subject: [PATCH 0773/1370] Fix G28 leveling state, UBL compile (#20499) --- Marlin/src/gcode/calibrate/G28.cpp | 7 ++++--- Marlin/src/inc/Conditionals_LCD.h | 1 + Marlin/src/inc/SanityCheck.h | 2 -- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 57c21df765..3d739c7ce8 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -241,8 +241,8 @@ void GcodeSuite::G28() { // Disable the leveling matrix before homing #if HAS_LEVELING - const bool leveling_restore_state = ENABLED(ENABLE_LEVELING_AFTER_G28) || TERN0(RESTORE_LEVELING_AFTER_G28, planner.leveling_active); - TERN_(PROBE_MANUALLY, g29_in_progress = false); // Cancel the active G29 session + IF_ENABLED(RESTORE_LEVELING_AFTER_G28, const bool leveling_restore_state = planner.leveling_active); + IF_ENABLED(PROBE_MANUALLY, g29_in_progress = false); // Cancel the active G29 session set_bed_leveling_enabled(false); #endif @@ -435,7 +435,8 @@ void GcodeSuite::G28() { do_blocking_move_to_z(delta_clip_start_height); #endif - TERN_(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_restore_state)); + IF_ENABLED(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_restore_state)); + IF_ENABLED(ENABLE_LEVELING_AFTER_G28, set_bed_leveling_enabled(true)); restore_feedrate_and_scaling(); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 386482b3ac..7c581bef90 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -886,6 +886,7 @@ #if !HAS_LEVELING #undef PROBE_MANUALLY #undef RESTORE_LEVELING_AFTER_G28 + #undef ENABLE_LEVELING_AFTER_G28 #endif #ifdef GRID_MAX_POINTS_X diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index a04dc786b2..b56177462f 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1455,8 +1455,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "AUTO_BED_LEVELING_UBL requires EEPROM_SETTINGS." #elif !WITHIN(GRID_MAX_POINTS_X, 3, 15) || !WITHIN(GRID_MAX_POINTS_Y, 3, 15) #error "GRID_MAX_POINTS_[XY] must be a whole number between 3 and 15." - #elif !defined(RESTORE_LEVELING_AFTER_G28) && !defined(ENABLE_LEVELING_AFTER_G28) - #error "AUTO_BED_LEVELING_UBL used to enable RESTORE_LEVELING_AFTER_G28. To keep this behavior enable RESTORE_LEVELING_AFTER_G28. Otherwise define it as 'false'." #endif #elif HAS_ABL_NOT_UBL From c529209c8fd8fecfd6e2fcc0be4468e401a36768 Mon Sep 17 00:00:00 2001 From: Jan Krajdl Date: Tue, 22 Dec 2020 15:27:14 +0100 Subject: [PATCH 0774/1370] Support RGBW on PCA9632 (#20455) Co-authored-by: Scott Lahteine --- Marlin/src/feature/leds/leds.h | 2 +- Marlin/src/feature/leds/pca9632.cpp | 46 +++++++++++++++++++---------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index 055ea0df37..57b21d576c 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -34,7 +34,7 @@ #endif // A white component can be passed -#if EITHER(RGBW_LED, NEOPIXEL_LED) +#if ANY(RGBW_LED, NEOPIXEL_LED, PCA9632_RGBW) #define HAS_WHITE_LED 1 #endif diff --git a/Marlin/src/feature/leds/pca9632.cpp b/Marlin/src/feature/leds/pca9632.cpp index d8af31cb6c..bb30e0b48b 100644 --- a/Marlin/src/feature/leds/pca9632.cpp +++ b/Marlin/src/feature/leds/pca9632.cpp @@ -58,7 +58,7 @@ #define PCA9632_AUTOGLO 0xC0 #define PCA9632_AUTOGI 0xE0 -// Red=LED0 Green=LED1 Blue=LED2 +// Red=LED0 Green=LED1 Blue=LED2 White=LED3 #ifndef PCA9632_RED #define PCA9632_RED 0x00 #endif @@ -68,9 +68,12 @@ #ifndef PCA9632_BLU #define PCA9632_BLU 0x04 #endif +#if HAS_WHITE_LED && !defined(PCA9632_WHT) + #define PCA9632_WHT 0x06 +#endif // If any of the color indexes are greater than 0x04 they can't use auto increment -#if !defined(PCA9632_NO_AUTO_INC) && (PCA9632_RED > 0x04 || PCA9632_GRN > 0x04 || PCA9632_BLU > 0x04) +#if !defined(PCA9632_NO_AUTO_INC) && (PCA9632_RED > 0x04 || PCA9632_GRN > 0x04 || PCA9632_BLU > 0x04 || PCA9632_WHT > 0x04) #define PCA9632_NO_AUTO_INC #endif @@ -89,25 +92,28 @@ static void PCA9632_WriteRegister(const byte addr, const byte regadd, const byte Wire.endTransmission(); } -static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const byte vr, const byte vg, const byte vb) { +static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const byte vr, const byte vg, const byte vb + #if ENABLED(PCA9632_RGBW) + , const byte vw + #endif +) { #if DISABLED(PCA9632_NO_AUTO_INC) - uint8_t data[4], len = 4; + uint8_t data[4]; data[0] = PCA9632_AUTO_IND | regadd; data[1 + (PCA9632_RED >> 1)] = vr; data[1 + (PCA9632_GRN >> 1)] = vg; data[1 + (PCA9632_BLU >> 1)] = vb; + Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.write(data, sizeof(data)); + Wire.endTransmission(); #else - uint8_t data[6], len = 6; - data[0] = regadd + (PCA9632_RED >> 1); - data[1] = vr; - data[2] = regadd + (PCA9632_GRN >> 1); - data[3] = vg; - data[4] = regadd + (PCA9632_BLU >> 1); - data[5] = vb; + PCA9632_WriteRegister(addr, regadd + (PCA9632_RED >> 1), vr); + PCA9632_WriteRegister(addr, regadd + (PCA9632_GRN >> 1), vg); + PCA9632_WriteRegister(addr, regadd + (PCA9632_BLU >> 1), vb); + #if ENABLED(PCA9632_RGBW) + PCA9632_WriteRegister(addr, regadd + (PCA9632_WHT >> 1), vw); + #endif #endif - Wire.beginTransmission(I2C_ADDRESS(addr)); - Wire.write(data, len); - Wire.endTransmission(); } #if 0 @@ -130,9 +136,17 @@ void PCA9632_set_led_color(const LEDColor &color) { const byte LEDOUT = (color.r ? LED_PWM << PCA9632_RED : 0) | (color.g ? LED_PWM << PCA9632_GRN : 0) - | (color.b ? LED_PWM << PCA9632_BLU : 0); + | (color.b ? LED_PWM << PCA9632_BLU : 0) + #if ENABLED(PCA9632_RGBW) + | (color.w ? LED_PWM << PCA9632_WHT : 0) + #endif + ; - PCA9632_WriteAllRegisters(PCA9632_ADDRESS,PCA9632_PWM0, color.r, color.g, color.b); + PCA9632_WriteAllRegisters(PCA9632_ADDRESS,PCA9632_PWM0, color.r, color.g, color.b + #if ENABLED(PCA9632_RGBW) + , color.w + #endif + ); PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_LEDOUT, LEDOUT); } From 60aeed99c6377efbf522caa85dec2404f14bba16 Mon Sep 17 00:00:00 2001 From: wmariz <11435639+wmariz@users.noreply.github.com> Date: Wed, 23 Dec 2020 03:10:56 -0300 Subject: [PATCH 0775/1370] Refactor 'Level Corners with Probe' (#20460) Co-authored-by: Scott Lahteine --- Marlin/src/feature/bltouch.h | 4 + Marlin/src/lcd/menu/menu_bed_corners.cpp | 285 ++++++++++++----------- Marlin/src/module/motion.cpp | 4 +- Marlin/src/module/probe.cpp | 12 +- 4 files changed, 154 insertions(+), 151 deletions(-) diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h index 40685af1b3..5880bdce75 100644 --- a/Marlin/src/feature/bltouch.h +++ b/Marlin/src/feature/bltouch.h @@ -23,6 +23,10 @@ #include "../inc/MarlinConfigPre.h" +#if DISABLED(BLTOUCH_HS_MODE) + #define BLTOUCH_SLOW_MODE 1 +#endif + // BLTouch commands are sent as servo angles typedef unsigned char BLTCommand; diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index acd19d69e4..56a97b5706 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -51,18 +51,11 @@ #include "../../feature/bltouch.h" #endif #ifndef LEVEL_CORNERS_PROBE_TOLERANCE - #define LEVEL_CORNERS_PROBE_TOLERANCE 0.1 + #define LEVEL_CORNERS_PROBE_TOLERANCE 0.2 #endif - #if ENABLED(LEVEL_CORNERS_AUDIO_FEEDBACK) - #include "../../libs/buzzer.h" - #define PROBE_BUZZ() BUZZ(200, 600) - #else - #define PROBE_BUZZ() NOOP - #endif - static float last_z; - static bool corner_probing_done; - static bool verify_corner; - static int good_points; + float last_z; + int good_points; + bool corner_probing_done, wait_for_probe; #endif static_assert(LEVEL_CORNERS_Z_HOP >= 0, "LEVEL_CORNERS_Z_HOP must be >= 0. Please update your configuration."); @@ -75,115 +68,130 @@ extern const char G28_STR[]; static int8_t bed_corner; +constexpr float inset_lfrb[4] = LEVEL_CORNERS_INSET_LFRB; +constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] }, + rb { (X_MAX_BED) - inset_lfrb[2], (Y_MAX_BED) - inset_lfrb[3] }; + /** * Level corners, starting in the front-left corner. */ #if ENABLED(LEVEL_CORNERS_USE_PROBE) - static inline void _lcd_level_bed_corners_probing() { - ui.goto_screen([]{ MenuItem_static::draw((LCD_HEIGHT - 1) / 2, GET_TEXT(MSG_PROBING_MESH)); }); - - float lfrb[4] = LEVEL_CORNERS_INSET_LFRB; - xy_pos_t lf { (X_MIN_BED) + lfrb[0] - probe.offset_xy.x , (Y_MIN_BED) + lfrb[1] - probe.offset_xy.y }, - rb { (X_MAX_BED) - lfrb[2] - probe.offset_xy.x , (Y_MAX_BED) - lfrb[3] - probe.offset_xy.y }; - - do_blocking_move_to_z(LEVEL_CORNERS_Z_HOP - probe.offset.z); - - switch (bed_corner) { - case 0: current_position = lf; break; // copy xy - case 1: current_position.x = rb.x; break; - case 2: current_position.y = rb.y; break; - case 3: current_position.x = lf.x; break; - #if ENABLED(LEVEL_CENTER_TOO) - case 4: current_position.set(X_CENTER - probe.offset_xy.x, Y_CENTER - probe.offset_xy.y); good_points--; break; - #endif - } - - do_blocking_move_to_xy(current_position); - - #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) - bltouch.deploy(); // DEPLOY in LOW SPEED MODE on every probe action - #endif - TERN_(HAS_QUIET_PROBING, probe.set_probing_paused(true)); - - // Move down until the probe is triggered - do_blocking_move_to_z(last_z - (LEVEL_CORNERS_PROBE_TOLERANCE), manual_feedrate_mm_s.z); - - // Check to see if the probe was triggered - bool probe_triggered = TEST(endstops.trigger_state(), TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN, Z_MIN_PROBE)); - if (!probe_triggered) { - - static bool wait_for_probe; - - ui.goto_screen([]{ - MenuItem_confirm::select_screen( - GET_TEXT(MSG_BUTTON_DONE), GET_TEXT(MSG_BUTTON_SKIP) - , []{ corner_probing_done = true; - wait_for_probe = false; - TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); - ui.goto_previous_screen_no_defer(); - } - , []{ wait_for_probe = false; } - , GET_TEXT(MSG_LEVEL_CORNERS_RAISE) - , (const char*)nullptr, PSTR("") - ); - }); - ui.set_selection(true); - - wait_for_probe = true; - while (wait_for_probe && !probe_triggered) { - probe_triggered = PROBE_TRIGGERED(); - if (probe_triggered) PROBE_BUZZ(); - idle(); - } - wait_for_probe = false; - - TERN_(LEVEL_CORNERS_VERIFY_RAISED, verify_corner = true); - } - - TERN_(HAS_QUIET_PROBING, probe.set_probing_paused(false)); - - #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) - bltouch.stow(); - #endif - - if (probe_triggered) { - endstops.hit_on_purpose(); - if (!WITHIN(current_position.z, last_z - (LEVEL_CORNERS_PROBE_TOLERANCE), last_z + (LEVEL_CORNERS_PROBE_TOLERANCE))) { - last_z = current_position.z; - good_points = 0; - } - if (!verify_corner) good_points++; - } - - if (!corner_probing_done) { - if (!verify_corner) bed_corner++; - if (bed_corner > 3) bed_corner = 0; - verify_corner = false; - if (good_points < 4) - _lcd_level_bed_corners_probing(); - else { - ui.goto_screen([]{ - MenuItem_confirm::confirm_screen( - []{ ui.goto_previous_screen_no_defer(); - queue.inject_P(TERN(HAS_LEVELING, PSTR("G28\nG29"), G28_STR)); - } - , []{ ui.goto_previous_screen_no_defer(); } - , GET_TEXT(MSG_LEVEL_CORNERS_IN_RANGE) - , (const char*)nullptr, PSTR("?") - ); - }); - ui.set_selection(true); - } - } + void _lcd_draw_probing() { + if (ui.should_draw()) MenuItem_static::draw((LCD_HEIGHT - 1) / 2, GET_TEXT(MSG_PROBING_MESH)); } -#else + void _lcd_draw_raise() { + if (!ui.should_draw()) return; + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_DONE), GET_TEXT(MSG_BUTTON_SKIP) + , []{ corner_probing_done = true; wait_for_probe = false; } + , []{ wait_for_probe = false; } + , GET_TEXT(MSG_LEVEL_CORNERS_RAISE) + , (const char*)nullptr, PSTR("") + ); + } + + void _lcd_draw_level_prompt() { + if (!ui.should_draw()) return; + MenuItem_confirm::confirm_screen( + []{ queue.inject_P(TERN(HAS_LEVELING, PSTR("G28\nG29"), G28_STR)); + ui.return_to_status(); + } + , []{ ui.goto_previous_screen_no_defer(); } + , GET_TEXT(MSG_LEVEL_CORNERS_IN_RANGE) + , (const char*)nullptr, PSTR("?") + ); + } + + bool _lcd_level_bed_corners_probe(bool verify=false) { + if (verify) do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // do clearance if needed + TERN_(BLTOUCH_SLOW_MODE, bltouch.deploy()); // Deploy in LOW SPEED MODE on every probe action + do_blocking_move_to_z(last_z - LEVEL_CORNERS_PROBE_TOLERANCE, manual_feedrate_mm_s.z); // Move down to lower tolerance + if (TEST(endstops.trigger_state(), TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN, Z_MIN_PROBE))) { // check if probe triggered + endstops.hit_on_purpose(); + set_current_from_steppers_for_axis(Z_AXIS); + sync_plan_position(); + TERN_(BLTOUCH_SLOW_MODE, bltouch.stow()); // Stow in LOW SPEED MODE on every trigger + // Triggered outside tolerance range? + if (ABS(current_position.z - last_z) > LEVEL_CORNERS_PROBE_TOLERANCE) { + last_z = current_position.z; // Above tolerance. Set a new Z for subsequent corners. + good_points = 0; // ...and start over + } + return true; // probe triggered + } + do_blocking_move_to_z(last_z); // go back to tolerance middle point before raise + return false; // probe not triggered + } + + bool _lcd_level_bed_corners_raise() { + bool probe_triggered = false; + corner_probing_done = false; + wait_for_probe = true; + ui.goto_screen(_lcd_draw_raise); // show raise screen + ui.set_selection(true); + while (wait_for_probe && !probe_triggered) { //loop while waiting to bed raise and probe trigger + probe_triggered = PROBE_TRIGGERED(); + if (probe_triggered) { + endstops.hit_on_purpose(); + TERN_(LEVEL_CORNERS_AUDIO_FEEDBACK, ui.buzz(200, 600)); + } + idle(); + } + TERN_(BLTOUCH_SLOW_MODE, bltouch.stow()); + ui.goto_screen(_lcd_draw_probing); + return (probe_triggered); + } + + void _lcd_test_corners() { + ui.goto_screen(_lcd_draw_probing); + bed_corner = TERN(LEVEL_CENTER_TOO, 4, 0); + last_z = LEVEL_CORNERS_HEIGHT; + endstops.enable_z_probe(true); + good_points = 0; + + do { + do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // clearance + // Select next corner coordinates + xy_pos_t plf = lf - probe.offset_xy, prb = rb - probe.offset_xy; + switch (bed_corner) { + case 0: current_position = plf; break; // copy xy + case 1: current_position.x = prb.x; break; + case 2: current_position.y = prb.y; break; + case 3: current_position.x = plf.x; break; + #if ENABLED(LEVEL_CENTER_TOO) + case 4: current_position.set(X_CENTER - probe.offset_xy.x, Y_CENTER - probe.offset_xy.y); break; + #endif + } + do_blocking_move_to_xy(current_position); // Goto corner + + if (!_lcd_level_bed_corners_probe()) { // Probe down to tolerance + if (_lcd_level_bed_corners_raise()) { // Prompt user to raise bed if needed + #if ENABLED(LEVEL_CORNERS_VERIFY_RAISED) // Verify + while (!_lcd_level_bed_corners_probe(true)) { // Loop while corner verified + if (!_lcd_level_bed_corners_raise()) { // Prompt user to raise bed if needed + if (corner_probing_done) return; // Done was selected + break; // Skip was selected + } + } + #endif + } + else if (corner_probing_done) // Done was selected + return; + } + + if (bed_corner != 4) good_points++; // ignore center + if (++bed_corner > 3) bed_corner = 0; + + } while (good_points < 4); // loop until all corners whitin tolerance + + ui.goto_screen(_lcd_draw_level_prompt); // prompt for bed leveling + ui.set_selection(true); + } + +#else // !LEVEL_CORNERS_USE_PROBE static inline void _lcd_goto_next_corner() { - constexpr float lfrb[4] = LEVEL_CORNERS_INSET_LFRB; - constexpr xy_pos_t lf { (X_MIN_BED) + lfrb[0], (Y_MIN_BED) + lfrb[1] }, - rb { (X_MAX_BED) - lfrb[2], (Y_MAX_BED) - lfrb[3] }; line_to_z(LEVEL_CORNERS_Z_HOP); switch (bed_corner) { case 0: current_position = lf; break; // copy xy @@ -199,33 +207,33 @@ static int8_t bed_corner; if (++bed_corner > 3 + ENABLED(LEVEL_CENTER_TOO)) bed_corner = 0; } -#endif +#endif // !LEVEL_CORNERS_USE_PROBE static inline void _lcd_level_bed_corners_homing() { _lcd_draw_homing(); - if (all_axes_homed()) { - #if ENABLED(LEVEL_CORNERS_USE_PROBE) - TERN_(LEVEL_CENTER_TOO, bed_corner = 4); - endstops.enable_z_probe(true); - ui.goto_screen(_lcd_level_bed_corners_probing); - #else - bed_corner = 0; - ui.goto_screen([]{ - MenuItem_confirm::select_screen( - GET_TEXT(MSG_BUTTON_NEXT), GET_TEXT(MSG_BUTTON_DONE) - , _lcd_goto_next_corner - , []{ - TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); - ui.goto_previous_screen_no_defer(); - } - , GET_TEXT(TERN(LEVEL_CENTER_TOO, MSG_LEVEL_BED_NEXT_POINT, MSG_NEXT_CORNER)) - , (const char*)nullptr, PSTR("?") - ); - }); - ui.set_selection(true); - _lcd_goto_next_corner(); - #endif - } + if (!all_axes_homed()) return; + #if ENABLED(LEVEL_CORNERS_USE_PROBE) + _lcd_test_corners(); + if (corner_probing_done) ui.goto_previous_screen_no_defer(); + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); + endstops.enable_z_probe(false); + #else + bed_corner = 0; + ui.goto_screen([]{ + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_NEXT), GET_TEXT(MSG_BUTTON_DONE) + , _lcd_goto_next_corner + , []{ + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); + ui.goto_previous_screen_no_defer(); + } + , GET_TEXT(TERN(LEVEL_CENTER_TOO, MSG_LEVEL_BED_NEXT_POINT, MSG_NEXT_CORNER)) + , (const char*)nullptr, PSTR("?") + ); + }); + ui.set_selection(true); + _lcd_goto_next_corner(); + #endif } void _lcd_level_bed_corners() { @@ -241,13 +249,6 @@ void _lcd_level_bed_corners() { set_bed_leveling_enabled(false); #endif - #if ENABLED(LEVEL_CORNERS_USE_PROBE) - last_z = LEVEL_CORNERS_HEIGHT; - corner_probing_done = false; - verify_corner = false; - good_points = 0; - #endif - ui.goto_screen(_lcd_level_bed_corners_homing); } diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 3800bc6b0a..9b6a0d913b 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1604,7 +1604,7 @@ void homeaxis(const AxisEnum axis) { do_homing_move(axis, 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir); - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) #endif @@ -1642,7 +1642,7 @@ void homeaxis(const AxisEnum axis) { // Slow move towards endstop until triggered if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Home 2 Slow:"); - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) if (axis == Z_AXIS && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) #endif diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 261fde4913..02c1f55f4a 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -455,9 +455,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { thermalManager.wait_for_bed_heating(); #endif - #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) - if (bltouch.deploy()) return true; // DEPLOY in LOW SPEED MODE on every probe action - #endif + if (TERN0(BLTOUCH_SLOW_MODE, bltouch.deploy())) return true; // Deploy in LOW SPEED MODE on every probe action // Disable stealthChop if used. Enable diag1 pin on driver. #if ENABLED(SENSORLESS_PROBING) @@ -496,9 +494,8 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { tmc_disable_stallguard(stepperZ, stealth_states.z); #endif - #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) - if (probe_triggered && bltouch.stow()) return true; // STOW in LOW SPEED MODE on trigger on every probe action - #endif + if (probe_triggered && TERN0(BLTOUCH_SLOW_MODE, bltouch.stow())) // Stow in LOW SPEED MODE on every trigger + return true; // Clear endstop flags endstops.hit_on_purpose(); @@ -578,9 +575,10 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { // Double-probing does a fast probe followed by a slow probe #if TOTAL_PROBING == 2 - // Do a first probe at the fast speed + // Attempt to tare the probe if (TERN0(PROBE_TARE, tare())) return NAN; + // Do a first probe at the fast speed if (try_to_probe(PSTR("FAST"), z_probe_low_point, z_probe_fast_mm_s, sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return NAN; From ad15890a81169f03517eb7738563c5e1ad691fd5 Mon Sep 17 00:00:00 2001 From: yysh12 Date: Wed, 23 Dec 2020 00:12:20 -0600 Subject: [PATCH 0776/1370] Improve plan_arc circle detection (#20440) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/motion/G2_G3.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 9c6710a08d..61e50247f3 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -41,13 +41,12 @@ #endif /** - * Plan an arc in 2 dimensions + * Plan an arc in 2 dimensions, with optional linear motion in a 3rd dimension * - * The arc is approximated by generating many small linear segments. - * The length of each segment is configured in MM_PER_ARC_SEGMENT (Default 1mm) - * Arcs should only be made relatively large (over 5mm), as larger arcs with - * larger segments will tend to be more efficient. Your slicer should have - * options for G2/G3 arc generation. In future these options may be GCode tunable. + * The arc is traced by generating many small linear segments, as configured by + * MM_PER_ARC_SEGMENT (Default 1mm). In the future we hope more slicers will include + * an option to generate G2/G3 arcs for curved surfaces, as this will allow faster + * boards to produce much smoother curved surfaces. */ void plan_arc( const xyze_pos_t &cart, // Destination position @@ -77,26 +76,33 @@ void plan_arc( rt_Y = cart[q_axis] - center_Q, start_L = current_position[l_axis]; - // Angle of rotation between position and target from the circle center. - float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y); - #ifdef MIN_ARC_SEGMENTS uint16_t min_segments = MIN_ARC_SEGMENTS; #else constexpr uint16_t min_segments = 1; #endif - // Do a full circle if angular rotation is near 0 and the target is current position - if (!angular_travel || (NEAR_ZERO(angular_travel) && NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis]))) { + // Angle of rotation between position and target from the circle center. + float angular_travel; + + // Do a full circle if starting and ending positions are "identical" + if (NEAR(current_position[p_axis], cart[p_axis]) && NEAR(current_position[q_axis], cart[q_axis])) { // Preserve direction for circles angular_travel = clockwise ? -RADIANS(360) : RADIANS(360); } else { + // Calculate the angle + angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y); + + // Angular travel too small to detect? Just return. + if (!angular_travel) return; + // Make sure angular travel over 180 degrees goes the other way around. switch (((angular_travel < 0) << 1) | clockwise) { case 1: angular_travel -= RADIANS(360); break; // Positive but CW? Reverse direction. case 2: angular_travel += RADIANS(360); break; // Negative but CCW? Reverse direction. } + #ifdef MIN_ARC_SEGMENTS min_segments = CEIL(min_segments * ABS(angular_travel) / RADIANS(360)); NOLESS(min_segments, 1U); From 323bf477383233909d3a13af84c3f9cb36b591ef Mon Sep 17 00:00:00 2001 From: LinFor Date: Wed, 23 Dec 2020 09:51:59 +0300 Subject: [PATCH 0777/1370] FTDI EVE: Cyrillic font, some minor fixes (#20517) --- Marlin/Configuration_adv.h | 3 + .../ftdi_eve_lib/basic/commands.cpp | 8 + .../ftdi_eve_lib/basic/commands.h | 1 + .../ftdi_eve_lib/extended/ftdi_extended.h | 1 + .../ftdi_eve_lib/extended/text_ellipsis.cpp | 21 +- .../extended/unicode/cyrillic_char_set.cpp | 139 + .../extended/unicode/cyrillic_char_set.h | 32 + .../unicode/cyrillic_char_set_bitmap_31.h | 2529 +++++++++++++++++ .../extended/unicode/font_bitmaps.cpp | 6 +- .../extended/unicode/font_bitmaps.h | 2 +- .../cyrillic_char_set_bitmap_31.png | Bin 0 -> 34122 bytes .../cyrillic_char_set_bitmap_31.svg | 535 ++++ .../unicode/font_bitmaps/romfont_31.png | Bin 0 -> 16643 bytes .../extended/unicode/standard_char_set.cpp | 3 +- .../extended/unicode/standard_char_set.h | 2 +- .../ftdi_eve_lib/extended/unicode/unicode.cpp | 27 +- .../ftdi_eve_lib/extended/unicode/unicode.h | 5 +- .../extended/unicode/western_char_set.cpp | 15 +- .../extended/unicode/western_char_set.h | 4 +- .../ftdi_eve_lib/extras/bitmap2cpp.py | 10 +- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/sd/SdBaseFile.cpp | 4 +- 22 files changed, 3319 insertions(+), 30 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set_bitmap_31.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.png create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.svg create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.png diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 51c2b8f994..446b308dfb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1563,6 +1563,9 @@ //#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾ //#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬ #endif + + // Cyrillic character set, costs about 27KiB of flash + //#define TOUCH_UI_UTF8_CYRILLIC_CHARSET #endif // Use a smaller font when labels don't fit buttons diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index f64f2b5b5f..1db1175d3c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -211,6 +211,14 @@ void CLCD::mem_write_32(uint32_t reg_address, uint32_t data) { spi_ftdi_deselect(); } +// Fill area of len size with repeated data bytes +void CLCD::mem_write_fill(uint32_t reg_address, uint8_t data, uint16_t len) { + spi_ftdi_select(); + spi_write_addr(reg_address); + while (len--) spi_write_8(data); + spi_ftdi_deselect(); +} + /******************* FT800/810 Co-processor Commands *********************************/ #if FTDI_API_LEVEL == 800 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h index 74a7f29800..376beaec44 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h @@ -115,6 +115,7 @@ class CLCD { static void mem_write_8 (uint32_t reg_address, uint8_t w_data); static void mem_write_16 (uint32_t reg_address, uint16_t w_data); static void mem_write_32 (uint32_t reg_address, uint32_t w_data); + static void mem_write_fill (uint32_t reg_address, uint8_t w_data, uint16_t len); static void mem_write_bulk (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0); static void mem_write_pgm (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0); static void mem_write_bulk (uint32_t reg_address, progmem_str str, uint16_t len, uint8_t padding = 0); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h index 006978babb..505016f5b8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -34,6 +34,7 @@ #include "unicode/unicode.h" #include "unicode/standard_char_set.h" #include "unicode/western_char_set.h" + #include "unicode/cyrillic_char_set.h" #include "unicode/font_bitmaps.h" #include "rgb_t.h" #include "bitmap_info.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp index a69280f5fc..cdec6e5dd2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -37,11 +37,22 @@ namespace FTDI { // split and still allow the ellipsis to fit. int16_t lineWidth = 0; char *breakPoint = str; - for (char* c = str; *c; c++) { - lineWidth += fm.get_char_width(*c); - if (lineWidth + ellipsisWidth < w) - breakPoint = c; - } + #ifdef TOUCH_UI_USE_UTF8 + char *tstr = str; + while (*tstr) { + breakPoint = tstr; + const utf8_char_t c = get_utf8_char_and_inc(tstr); + lineWidth += fm.get_char_width(c); + if (lineWidth + ellipsisWidth < w) + break; + } + #else + for (char* c = str; *c; c++) { + lineWidth += fm.get_char_width(*c); + if (lineWidth + ellipsisWidth < w) + breakPoint = c; + } + #endif if (lineWidth > w) { *breakPoint = '\0'; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp new file mode 100644 index 0000000000..1c193ade4b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp @@ -0,0 +1,139 @@ +/************************ + * cyrillic_char_set.cpp * + ************************/ + +/**************************************************************************** + * Written By Kirill Shashlov 2020 * + * Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../ftdi_extended.h" + +#if ALL(FTDI_EXTENDED, TOUCH_UI_USE_UTF8, TOUCH_UI_UTF8_CYRILLIC_CHARSET) + + #include "cyrillic_char_set_bitmap_31.h" + + #define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0])) + + #define UTF8(A) uint16_t(utf8(U##A)) + + using namespace FTDI; + + constexpr static uint8_t cyrillic_font_handle = 6; + + uint32_t FTDI::CyrillicCharSet::bitmap_addr; + + /** + * Load bitmap data into RAMG. This function is called once at the start + * of the program. + * + * Parameters: + * + * addr - Address in RAMG where the font data is written + * + * Returns: Last wrote address + */ + + uint32_t FTDI::CyrillicCharSet::load_data(uint32_t addr) { + if (addr % 4 != 0) + addr += 4 - (addr % 4); + + // Load the alternative font metrics + CLCD::FontMetrics cyrillic_fm; + cyrillic_fm.ptr = addr + 148; + cyrillic_fm.format = L4; + cyrillic_fm.stride = 20; + cyrillic_fm.width = 40; + cyrillic_fm.height = 49; + LOOP_L_N(i, 127) + cyrillic_fm.char_widths[i] = 0; + + // For cyrillic characters, copy the character widths from the widths tables + LOOP_L_N(i, NUM_ELEMENTS(cyrillic_font_widths)) { + cyrillic_fm.char_widths[i] = cyrillic_font_widths[i]; + } + CLCD::mem_write_bulk(addr, &cyrillic_fm, 148); + + // Decode the RLE data and load it into RAMG as a bitmap + uint32_t lastaddr = write_rle_data(addr + 148, cyrillic_font, sizeof(cyrillic_font)); + + bitmap_addr = addr; + + return lastaddr; + } + + /** + * Populates the bitmap handles for the custom into the display list. + * This function is called once at the start of each display list. + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + */ + + void FTDI::CyrillicCharSet::load_bitmaps(CommandProcessor& cmd) { + CLCD::FontMetrics cyrillic_fm; + cyrillic_fm.ptr = bitmap_addr + 148; + cyrillic_fm.format = L4; + cyrillic_fm.stride = 20; + cyrillic_fm.width = 40; + cyrillic_fm.height = 49; + set_font_bitmap(cmd, cyrillic_fm, cyrillic_font_handle); + } + + /** + * Renders a character at location x and y. The x position is incremented + * by the width of the character. + * + * Parameters: + * + * cmd - If non-NULL the symbol is drawn to the screen. + * If NULL, only increment position for text measurement. + * + * x, y - The location at which to draw the character. On output, + * incremented to the location of the next character. + * + * fs - A scaling object used to scale the font. The display will + * already be configured to scale bitmaps, but positions + * must be scaled using fs.scale() + * + * c - The unicode code point to draw. If the renderer does not + * support the character, it should return false. + * + * Returns: Whether the character was supported. + */ + + bool FTDI::CyrillicCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) { + // A supported character? + if ((c < UTF8('Ð') || c > UTF8('Ñ')) && (c != UTF8('Ð')) && (c != UTF8('Ñ‘'))) return false; + + uint8_t idx = (c == UTF8('Ð')) ? 64 : + (c == UTF8('Ñ‘')) ? 65 : + (c < UTF8('Ñ€')) ? c - UTF8('Ð') : + c - UTF8('Ñ€') + 48 + ; + + uint8_t width = cyrillic_font_widths[idx]; + + // Draw the character + if (cmd) ext_vertex2ii(*cmd, x, y, cyrillic_font_handle, idx); + + // Increment X to the next character position + x += fs.scale(width); + return true; + } + +#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 && TOUCH_UI_UTF8_WESTERN_CHARSET diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.h new file mode 100644 index 0000000000..63493b8bb9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.h @@ -0,0 +1,32 @@ +/********************** + * cyrillic_char_set.h * + **********************/ + +/**************************************************************************** + * Written By Kirill Shashlov 2020 * + * Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +namespace FTDI { + class CyrillicCharSet { + private: + static uint32_t bitmap_addr; + public: + static uint32_t load_data(uint32_t addr); + static void load_bitmaps(CommandProcessor&); + static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); + }; +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set_bitmap_31.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set_bitmap_31.h new file mode 100644 index 0000000000..00bfe3706b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set_bitmap_31.h @@ -0,0 +1,2529 @@ +/******************************** + * cyrillic_char_set_bitmap_31.h * + ********************************/ + +/**************************************************************************** + * Written By Kirill Shashlov 2020 * + * Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * Used GNU FreeFont FreeSans font (licensed under the GPL) * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +const uint8_t cyrillic_font_widths[] PROGMEM = { + 27, // Ð (0) + 26, // Б + 26, // Ð’ + 24, // Г + 33, // Д + 25, // Е + 37, // Ж + 26, // З + + 28, // И (8) + 28, // Й + 26, // К + 25, // Л + 33, // Ðœ + 27, // Ð + 31, // О + 27, // П + + 26, // Р (16) + 29, // С + 28, // Т + 26, // У + 34, // Ф + 27, // Ð¥ + 30, // Ц + 23, // Ч + + 32, // Ш (24) + 34, // Щ + 26, // Ь + 34, // Ы + 34, // Ъ + 28, // Э + 40, // Ю + 26, // Я + + 22, // а (32) + 21, // б + 20, // в + 16, // г + 24, // д + 21, // е + 31, // ж + 19, // з + + 21, // и (40) + 21, // й + 20, // к + 19, // л + 23, // м + 21, // н + 21, // о + 21, // п + + 22, // Ñ€ (48) + 20, // Ñ + 17, // Ñ‚ + 19, // у + 34, // Ñ„ + 19, // Ñ… + 23, // ц + 19, // ч + 26, // ш + 28, // щ + 20, // ÑŒ + 26, // Ñ‹ + 26, // ÑŠ + 20, // Ñ + 30, // ÑŽ + 20, // Ñ + + 26, // Ð + 21, // Ñ‘ +}; + + +/* This is a dump of "font_bitmaps/cyrillic_char_set_bitmap_31.png" + * using the tool "bitmap2cpp.py". The tool converts the image into + * 16-level grayscale and packs two pixels per byte. The resulting + * bytes are then RLE compressed to yield (count, byte) pairs. + */ + +const unsigned char cyrillic_font[] PROGMEM = { + /* 0 */ + 0xb9, 0x00, 0x01, 0x2f, 0x02, 0xff, 0x01, 0x30, 0x10, 0x00, 0x01, 0x7f, + 0x02, 0xff, 0x01, 0x90, 0x10, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xe0, + 0x0f, 0x00, 0x01, 0x03, 0x03, 0xff, 0x01, 0xf4, 0x0f, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xfb, 0x01, 0xff, 0x01, 0xfa, 0x0f, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xf1, 0x02, 0xff, 0x0f, 0x00, 0x01, 0x5f, 0x01, 0xff, + 0x01, 0x90, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x50, 0x0e, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0x40, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0, 0x0d, 0x00, + 0x01, 0x01, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xf1, 0x0d, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfc, 0x0d, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0xef, 0x01, 0xff, + 0x01, 0x20, 0x0c, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, + 0x01, 0x9f, 0x01, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x10, 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x01, 0xf3, 0x0b, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, + 0x01, 0x09, 0x01, 0xff, 0x01, 0xf9, 0x0b, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x01, 0xe0, 0x03, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0xb4, 0x04, 0x44, 0x02, 0xff, 0x01, 0x40, + 0x0a, 0x00, 0x01, 0xaf, 0x08, 0xff, 0x01, 0xa0, 0x0a, 0x00, 0x09, 0xff, + 0x01, 0xf0, 0x09, 0x00, 0x01, 0x06, 0x02, 0xff, 0x05, 0xee, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf5, + 0x05, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, 0x09, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x10, + 0x08, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, + 0x06, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xfe, 0x07, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf2, + 0x07, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, + 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xfd, 0x07, 0x00, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x30, + 0x06, 0x00, 0x01, 0x8d, 0x01, 0xdd, 0x01, 0x60, 0x08, 0x00, 0x01, 0xad, + 0x01, 0xdd, 0x01, 0x70, 0xce, 0x00, + + /* 1 */ + 0xb5, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x1f, + 0x09, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf4, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd5, 0x07, 0x55, 0x01, 0x51, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfe, + 0x04, 0xee, 0x01, 0xdb, 0x01, 0x84, 0x0b, 0x00, 0x01, 0x1f, 0x08, 0xff, + 0x01, 0xe7, 0x0a, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xd2, 0x09, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd6, 0x04, 0x66, 0x01, 0x68, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x05, 0x00, 0x01, 0x04, 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf5, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf9, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf4, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x80, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe7, 0x04, 0x77, 0x01, 0x89, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, + 0x01, 0xe2, 0x09, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfb, 0x01, 0x10, + 0x09, 0x00, 0x01, 0x1d, 0x06, 0xdd, 0x01, 0xdc, 0x01, 0xb7, 0x01, 0x20, + 0xd1, 0x00, + + /* 2 */ + 0xb5, 0x00, 0x01, 0x1f, 0x06, 0xff, 0x01, 0xec, 0x01, 0x94, 0x0b, 0x00, + 0x01, 0x1f, 0x08, 0xff, 0x01, 0xc3, 0x0a, 0x00, 0x01, 0x1f, 0x09, 0xff, + 0x01, 0x40, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd6, 0x03, 0x66, + 0x01, 0x67, 0x01, 0x9d, 0x02, 0xff, 0x01, 0xe1, 0x09, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xf9, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x04, + 0x02, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x20, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0x20, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x05, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xf2, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd2, 0x03, 0x22, 0x01, 0x23, + 0x01, 0x59, 0x02, 0xff, 0x01, 0x50, 0x09, 0x00, 0x01, 0x1f, 0x08, 0xff, + 0x01, 0xd3, 0x0a, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xb3, 0x0a, 0x00, + 0x01, 0x1f, 0x09, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xd4, 0x04, 0x44, 0x01, 0x45, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xfd, + 0x01, 0x10, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, + 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf9, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xf7, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf5, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x05, + 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xe7, 0x04, 0x77, 0x01, 0x79, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe, + 0x01, 0x10, 0x08, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xe3, 0x09, 0x00, + 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x09, 0x00, 0x01, 0x1d, + 0x07, 0xdd, 0x01, 0xb7, 0x01, 0x20, 0xd1, 0x00, + + /* 3 */ + 0xb5, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x1f, + 0x09, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf4, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd5, 0x07, 0x55, 0x01, 0x51, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1e, + 0x01, 0xee, 0x01, 0xb0, 0xd8, 0x00, + + /* 4 */ + 0xb8, 0x00, 0x01, 0x08, 0x09, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, + 0x09, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x09, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfa, 0x05, 0x66, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xf4, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf2, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0xa0, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x30, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xfe, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x08, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf1, + 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x05, 0x00, 0x01, 0x02, + 0x01, 0x22, 0x01, 0x28, 0x02, 0xff, 0x01, 0xc7, 0x06, 0x77, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0x52, 0x01, 0x22, 0x04, 0x00, 0x01, 0x0f, 0x0f, 0xff, + 0x04, 0x00, 0x01, 0x0f, 0x0f, 0xff, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xed, 0x0b, 0xdd, 0x01, 0xef, 0x01, 0xff, 0x04, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x04, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff, + 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, + 0x01, 0x5f, 0x01, 0xff, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x50, + 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x04, 0x00, 0x01, 0x06, 0x01, 0x66, + 0x01, 0x20, 0x0b, 0x00, 0x01, 0x26, 0x01, 0x66, 0x54, 0x00, + + /* 5 */ + 0xb5, 0x00, 0x01, 0x1f, 0x0a, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x0a, 0xff, + 0x09, 0x00, 0x01, 0x1f, 0x0a, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xd6, 0x07, 0x66, 0x01, 0x65, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc1, 0x07, 0x11, 0x01, 0x10, 0x09, 0x00, + 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, + 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf5, 0x09, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd4, 0x07, 0x44, 0x01, 0x41, 0x09, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe7, 0x08, 0x77, 0x01, 0x50, 0x08, 0x00, + 0x01, 0x1f, 0x0a, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x1f, 0x0a, 0xff, + 0x01, 0xb0, 0x08, 0x00, 0x01, 0x1e, 0x0a, 0xee, 0x01, 0xa0, 0xcf, 0x00, + + /* 6 */ + 0xb5, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xf3, 0x04, 0x00, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xe1, + 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x0a, 0x02, 0xff, + 0x01, 0x30, 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, + 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf8, + 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x03, + 0x02, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x50, + 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x1e, + 0x01, 0xff, 0x01, 0xfb, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xf2, + 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfd, + 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x07, 0x00, 0x01, 0x01, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4, 0x09, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xf7, 0x01, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0x02, 0x02, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x05, 0x02, 0xff, + 0x01, 0x40, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x1d, 0x01, 0xff, + 0x01, 0xfa, 0x0b, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xe2, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0x90, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xc0, 0x0b, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x98, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf3, 0x0d, 0x00, + 0x01, 0x2e, 0x05, 0xff, 0x01, 0x60, 0x0d, 0x00, 0x01, 0x07, 0x04, 0xff, + 0x01, 0xfc, 0x0e, 0x00, 0x01, 0x2e, 0x05, 0xff, 0x01, 0x60, 0x0c, 0x00, + 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0xef, 0x01, 0xff, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfd, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0x9a, 0x02, 0xff, 0x01, 0x30, 0x0b, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0xe2, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0xe2, 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, + 0x01, 0x30, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x0d, 0x01, 0xff, + 0x01, 0xfd, 0x01, 0x10, 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf4, + 0x01, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x01, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x50, + 0x01, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf7, + 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x04, + 0x02, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0x80, + 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0xf7, 0x06, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfa, + 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x08, + 0x02, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xb0, 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0xf4, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xfc, 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, + 0x01, 0x0b, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0xd1, 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe1, 0x02, 0x00, 0x01, 0x08, 0x01, 0xff, + 0x01, 0xfe, 0x01, 0x20, 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x90, + 0x04, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x01, 0x00, + 0x01, 0x5d, 0x01, 0xdd, 0x01, 0xd3, 0x05, 0x00, 0x01, 0x3d, 0x01, 0xdd, + 0x01, 0x80, 0x04, 0x00, 0x01, 0x03, 0x02, 0xdd, 0x01, 0x90, 0xc9, 0x00, + + /* 7 */ + 0xa5, 0x00, 0x01, 0x45, 0x01, 0x67, 0x01, 0x65, 0x01, 0x20, 0x0e, 0x00, + 0x01, 0x06, 0x01, 0xcf, 0x03, 0xff, 0x01, 0xfe, 0x01, 0x92, 0x0c, 0x00, + 0x01, 0x04, 0x01, 0xef, 0x06, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0x6f, + 0x02, 0xff, 0x01, 0xfd, 0x01, 0xcb, 0x01, 0xcf, 0x02, 0xff, 0x01, 0xfc, + 0x0a, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0xd6, 0x01, 0x10, 0x02, 0x00, + 0x01, 0x39, 0x02, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x0d, 0x01, 0xff, + 0x01, 0xf9, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf9, 0x09, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x06, 0x00, + 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x07, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x09, 0x00, 0x01, 0xac, 0x01, 0xcb, 0x07, 0x00, + 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x10, 0x00, 0x01, 0x04, 0x02, 0xff, + 0x11, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xfc, 0x10, 0x00, 0x01, 0x01, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf5, 0x10, 0x00, 0x01, 0x5d, 0x02, 0xff, + 0x01, 0xa0, 0x0d, 0x00, 0x02, 0x99, 0x01, 0xbe, 0x02, 0xff, 0x01, 0xf8, + 0x0e, 0x00, 0x05, 0xff, 0x01, 0x40, 0x0e, 0x00, 0x05, 0xff, 0x01, 0xf9, + 0x0e, 0x00, 0x02, 0xbb, 0x01, 0xcd, 0x03, 0xff, 0x01, 0xd1, 0x10, 0x00, + 0x01, 0x16, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x0a, + 0x02, 0xff, 0x01, 0x60, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x07, 0x01, 0x99, 0x01, 0x80, 0x07, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xf0, 0x07, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf0, + 0x07, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf1, 0x07, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xf2, 0x07, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, + 0x07, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xe0, 0x07, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x20, + 0x06, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0xd2, 0x05, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0x30, + 0x08, 0x00, 0x01, 0x1e, 0x02, 0xff, 0x01, 0x81, 0x03, 0x00, 0x01, 0x01, + 0x01, 0x8f, 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x03, 0x01, 0xef, + 0x02, 0xff, 0x01, 0xda, 0x01, 0x98, 0x01, 0x9a, 0x01, 0xdf, 0x02, 0xff, + 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x2d, 0x07, 0xff, 0x01, 0xfa, 0x0c, 0x00, + 0x01, 0x6d, 0x05, 0xff, 0x01, 0xfb, 0x01, 0x30, 0x0d, 0x00, 0x01, 0x27, + 0x01, 0x9b, 0x01, 0xcd, 0x01, 0xba, 0x01, 0x95, 0x01, 0x10, 0xbe, 0x00, + + /* 8 */ + 0xb5, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x07, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x06, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0x2f, 0x02, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0xcf, + 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x05, 0x00, 0x01, 0x06, 0x03, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x05, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xfa, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x1e, 0x01, 0xff, + 0x01, 0xe1, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x60, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x03, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x03, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x03, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x01, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x02, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x02, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x02, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x02, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x80, 0x02, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfd, 0x03, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x01, 0x01, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x04, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x99, 0x01, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x03, 0xff, 0x01, 0x20, + 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, + 0x02, 0xff, 0x01, 0xf7, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0xd0, 0x06, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0x30, + 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1e, + 0x01, 0xee, 0x01, 0xe8, 0x07, 0x00, 0x01, 0x0e, 0x01, 0xee, 0x01, 0xa0, + 0xce, 0x00, + + /* 9 */ + 0x2c, 0x00, 0x01, 0x7f, 0x01, 0xf1, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xe0, + 0x0d, 0x00, 0x01, 0x5f, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xb0, 0x0d, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb6, 0x01, 0x45, + 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50, 0x0d, 0x00, 0x01, 0x05, 0x04, 0xff, + 0x01, 0xfb, 0x0f, 0x00, 0x01, 0x5e, 0x03, 0xff, 0x01, 0x90, 0x10, 0x00, + 0x01, 0x46, 0x01, 0x87, 0x01, 0x51, 0x20, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, 0x01, 0x07, 0x02, 0xff, + 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x06, 0x00, + 0x01, 0x2f, 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x06, 0x00, 0x01, 0xbf, 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x06, 0x03, 0xff, + 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xef, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfa, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x04, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xe1, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, + 0x01, 0x9f, 0x01, 0xff, 0x01, 0x60, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x04, + 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x0d, + 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x70, 0x01, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xfd, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf3, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xfd, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x01, 0x01, 0xef, + 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf5, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0, + 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x04, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x99, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xc0, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0x1f, 0x03, 0xff, 0x01, 0x20, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0xf7, 0x06, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff, + 0x01, 0xd0, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0x1f, 0x02, 0xff, 0x01, 0x30, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xe8, 0x07, 0x00, + 0x01, 0x0e, 0x01, 0xee, 0x01, 0xa0, 0xce, 0x00, + + /* 10 */ + 0xb5, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x1d, + 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x04, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x1d, 0x01, 0xff, + 0x01, 0xf9, 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, + 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x90, 0x0a, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf9, + 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x02, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x01, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf8, 0x0d, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0x80, + 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x2e, 0x01, 0xff, + 0x01, 0xf7, 0x0e, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc3, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x70, 0x0e, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xee, + 0x01, 0xff, 0x01, 0xf7, 0x0f, 0x00, 0x01, 0x1f, 0x03, 0xff, 0x01, 0x70, + 0x0f, 0x00, 0x01, 0x1f, 0x03, 0xff, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x1f, + 0x03, 0xff, 0x01, 0xe2, 0x0f, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xdd, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0e, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc1, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe2, 0x0e, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, + 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x01, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0xe2, 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x01, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0c, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x00, 0x01, 0x01, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x02, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0b, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x01, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0xe2, 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x03, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x0a, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x02, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xe3, 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x04, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x09, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x02, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xe3, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x05, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x08, 0x00, + 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0x05, 0x00, 0x01, 0x02, 0x01, 0xde, + 0x01, 0xee, 0x01, 0xd2, 0xcf, 0x00, + + /* 11 */ + 0xb6, 0x00, 0x01, 0x08, 0x09, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, + 0x09, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x09, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfa, 0x05, 0x66, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf4, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0a, + 0x01, 0xff, 0x01, 0xf4, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf1, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xc0, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x20, + 0x05, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xfe, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x08, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x30, 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf2, + 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x1a, + 0x02, 0xff, 0x01, 0xa0, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, + 0x07, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x06, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x2f, 0x01, 0xff, + 0x01, 0xf4, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, + 0x01, 0x2f, 0x01, 0xfb, 0x01, 0x20, 0x07, 0x00, 0x01, 0xae, 0x01, 0xee, + 0x01, 0x30, 0x07, 0x00, 0x01, 0x03, 0x01, 0x10, 0xc6, 0x00, + + /* 12 */ + 0xb5, 0x00, 0x01, 0x1e, 0x02, 0xee, 0x01, 0x70, 0x08, 0x00, 0x02, 0xee, + 0x01, 0xe7, 0x05, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0xc0, 0x07, 0x00, + 0x01, 0x05, 0x02, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x02, 0xff, + 0x01, 0xf2, 0x07, 0x00, 0x01, 0x0b, 0x02, 0xff, 0x01, 0xf8, 0x05, 0x00, + 0x01, 0x1f, 0x02, 0xff, 0x01, 0xf7, 0x07, 0x00, 0x01, 0x1f, 0x02, 0xff, + 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x01, 0xfd, 0x07, 0x00, + 0x01, 0x6f, 0x02, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x30, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xfc, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x9d, + 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf7, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x98, + 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xe2, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x92, + 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0x92, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0xdf, 0x01, 0xf9, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x42, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0x7f, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xfe, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0x40, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xf9, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x01, 0x0c, 0x01, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf3, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x07, 0x01, 0xff, 0x01, 0xe0, + 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0x80, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x01, 0x00, 0x01, 0xcf, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x30, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x03, 0x00, 0x01, 0x7f, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0xcf, 0x01, 0xf8, + 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xa0, + 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x01, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xd0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0xff, + 0x01, 0xf6, 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0x90, 0x02, 0x00, 0x01, 0xaf, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x20, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0x10, 0x01, 0x7f, 0x01, 0xfd, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x60, 0x01, 0xdf, 0x01, 0xf7, + 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xc2, + 0x01, 0xff, 0x01, 0xf2, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x04, + 0x01, 0xff, 0x01, 0xfa, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x03, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0x70, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x03, 0x00, 0x01, 0x9f, 0x02, 0xff, 0x01, 0x20, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x03, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0x80, + 0x03, 0x00, 0x01, 0x0d, 0x01, 0xee, 0x01, 0xe6, 0x03, 0x00, 0x01, 0x02, + 0x01, 0xee, 0x01, 0xe7, 0xcc, 0x00, + + /* 13 */ + 0xb5, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x0b, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x0b, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x0b, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd4, + 0x07, 0x44, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1e, + 0x01, 0xee, 0x01, 0xb0, 0x07, 0x00, 0x01, 0x8e, 0x01, 0xee, 0x01, 0x40, + 0xce, 0x00, + + /* 14 */ + 0xa6, 0x00, 0x01, 0x13, 0x01, 0x56, 0x01, 0x64, 0x01, 0x31, 0x0e, 0x00, + 0x01, 0x02, 0x01, 0x8d, 0x04, 0xff, 0x01, 0xc7, 0x01, 0x10, 0x0b, 0x00, + 0x01, 0x01, 0x01, 0x9f, 0x06, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x3e, + 0x08, 0xff, 0x01, 0xd2, 0x09, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0xfc, + 0x01, 0x72, 0x01, 0x00, 0x01, 0x01, 0x01, 0x38, 0x01, 0xdf, 0x02, 0xff, + 0x01, 0x30, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x50, + 0x04, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xe2, 0x07, 0x00, 0x01, 0x01, + 0x01, 0xef, 0x01, 0xff, 0x01, 0xd1, 0x06, 0x00, 0x01, 0x2e, 0x01, 0xff, + 0x01, 0xfd, 0x07, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, + 0x06, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x60, 0x06, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xf4, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, + 0x06, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf5, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x30, + 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xfd, 0x0a, 0x00, 0x02, 0xff, 0x05, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x30, + 0x04, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf4, + 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x70, 0x04, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x80, + 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, + 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf4, 0x0a, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, + 0x04, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, + 0x0a, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x10, 0x05, 0x00, 0x02, 0xff, + 0x01, 0x10, 0x08, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfd, 0x06, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf8, 0x06, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe1, 0x08, 0x00, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xfa, 0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x06, 0x00, + 0x01, 0x04, 0x02, 0xff, 0x01, 0x80, 0x06, 0x00, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xfe, 0x01, 0x10, 0x07, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0x01, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf5, 0x08, 0x00, + 0x01, 0x0b, 0x02, 0xff, 0x01, 0xe6, 0x01, 0x10, 0x02, 0x00, 0x01, 0x02, + 0x01, 0x8f, 0x02, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0xaf, 0x02, 0xff, + 0x01, 0xfc, 0x01, 0xa8, 0x01, 0x8a, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xf6, + 0x0a, 0x00, 0x01, 0x06, 0x01, 0xef, 0x06, 0xff, 0x01, 0xfd, 0x01, 0x40, + 0x0b, 0x00, 0x01, 0x18, 0x01, 0xef, 0x04, 0xff, 0x01, 0xfd, 0x01, 0x60, + 0x0d, 0x00, 0x01, 0x03, 0x01, 0x7a, 0x01, 0xcd, 0x01, 0xdc, 0x01, 0xa7, + 0x01, 0x30, 0xbd, 0x00, + + /* 15 */ + 0xb5, 0x00, 0x01, 0x1f, 0x0b, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x0b, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x0b, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe6, 0x07, 0x66, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1e, + 0x01, 0xee, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9e, 0x01, 0xee, 0x01, 0x40, + 0xce, 0x00, + + /* 16 */ + 0xb5, 0x00, 0x01, 0x1e, 0x06, 0xee, 0x01, 0xec, 0x01, 0x95, 0x0b, 0x00, + 0x01, 0x1f, 0x08, 0xff, 0x01, 0xe5, 0x0a, 0x00, 0x01, 0x1f, 0x09, 0xff, + 0x01, 0x80, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd6, 0x03, 0x66, + 0x01, 0x67, 0x01, 0x9d, 0x02, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xfe, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x03, + 0x02, 0xff, 0x01, 0x50, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xa0, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x70, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x05, 0x00, 0x01, 0x1b, 0x02, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc1, 0x03, 0x11, 0x01, 0x12, 0x01, 0x48, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xf9, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xc0, + 0x09, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x09, 0x00, + 0x01, 0x1f, 0x07, 0xff, 0x01, 0xfb, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd4, 0x04, 0x44, 0x01, 0x32, 0x0c, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0xd8, 0x00, + + /* 17 */ + 0xa6, 0x00, 0x01, 0x35, 0x01, 0x66, 0x01, 0x54, 0x01, 0x10, 0x0e, 0x00, + 0x01, 0x06, 0x01, 0xcf, 0x03, 0xff, 0x01, 0xfd, 0x01, 0x71, 0x0c, 0x00, + 0x01, 0x05, 0x01, 0xef, 0x06, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0xaf, + 0x07, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0xd7, + 0x01, 0x20, 0x01, 0x00, 0x01, 0x03, 0x01, 0x9f, 0x02, 0xff, 0x01, 0x70, + 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x01, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf2, 0x08, 0x00, 0x01, 0x02, 0x02, 0xff, + 0x01, 0x60, 0x05, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0x02, 0x02, 0xff, + 0x01, 0x10, 0x07, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0x60, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, + 0x01, 0x60, 0x07, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00, 0x01, 0x05, 0x01, 0x55, + 0x01, 0x40, 0x06, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, 0x11, 0x00, + 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, + 0x01, 0xf5, 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, 0x11, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x11, 0x00, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xf2, 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, 0x11, 0x00, + 0x01, 0x09, 0x01, 0xff, 0x01, 0xf4, 0x11, 0x00, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xf6, 0x11, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x06, 0x00, 0x01, 0x01, 0x01, 0xff, + 0x01, 0xfe, 0x08, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf3, 0x07, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xf0, 0x07, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xb0, 0x07, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x01, 0xb0, 0x07, 0x00, 0x01, 0x1e, 0x01, 0xff, + 0x01, 0xf5, 0x07, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, 0x07, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x05, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x08, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xe3, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00, + 0x01, 0x3f, 0x02, 0xff, 0x01, 0x92, 0x03, 0x00, 0x01, 0x29, 0x02, 0xff, + 0x01, 0xc0, 0x09, 0x00, 0x01, 0x04, 0x03, 0xff, 0x01, 0xda, 0x01, 0x88, + 0x01, 0x9c, 0x02, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00, 0x01, 0x3d, + 0x07, 0xff, 0x01, 0xc1, 0x0c, 0x00, 0x01, 0x7e, 0x05, 0xff, 0x01, 0xd6, + 0x0e, 0x00, 0x01, 0x37, 0x01, 0xac, 0x01, 0xdd, 0x01, 0xca, 0x01, 0x73, + 0xbe, 0x00, + + /* 18 */ + 0xb4, 0x00, 0x01, 0x2f, 0x0b, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x2f, + 0x0b, 0xff, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x2f, 0x0b, 0xff, 0x01, 0xa0, + 0x07, 0x00, 0x01, 0x16, 0x04, 0x66, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xd6, + 0x04, 0x66, 0x01, 0x40, 0x0c, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x2e, 0x01, 0xee, 0x01, 0xa0, 0xd4, 0x00, + + /* 19 */ + 0xb4, 0x00, 0x01, 0x8e, 0x01, 0xee, 0x01, 0xe2, 0x07, 0x00, 0x01, 0xde, + 0x01, 0xee, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfa, + 0x06, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x08, + 0x02, 0xff, 0x01, 0x20, 0x05, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xfa, + 0x08, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0xf2, 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf2, + 0x05, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x20, + 0x09, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x0d, + 0x01, 0xff, 0x01, 0xfa, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, + 0x01, 0x90, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, + 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x90, 0x0b, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x05, 0x02, 0xff, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x07, 0x02, 0xff, + 0x01, 0x20, 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf9, 0x0d, 0x00, + 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, 0x01, 0x00, 0x01, 0x5f, 0x01, 0xff, + 0x01, 0xf1, 0x0d, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x80, 0x0d, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x01, 0xf9, 0x01, 0x05, 0x02, 0xff, 0x01, 0x10, 0x0d, 0x00, 0x01, 0x07, + 0x02, 0xff, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf8, 0x0f, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf1, 0x0f, 0x00, 0x01, 0x7f, + 0x03, 0xff, 0x01, 0x80, 0x0f, 0x00, 0x01, 0x0e, 0x02, 0xff, 0x01, 0xfe, + 0x01, 0x10, 0x0f, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0xf7, 0x11, 0x00, + 0x01, 0xef, 0x01, 0xff, 0x01, 0xe0, 0x10, 0x00, 0x01, 0x01, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x70, 0x10, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfe, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0xe0, 0x10, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x60, + 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfe, 0x11, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0xf6, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xd0, + 0x10, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x0c, + 0x01, 0xee, 0x01, 0xec, 0xd7, 0x00, + + /* 20 */ + 0xbb, 0x00, 0x01, 0x0b, 0x01, 0xee, 0x01, 0xe2, 0x11, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf2, 0x11, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2, + 0x10, 0x00, 0x01, 0x01, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x10, + 0x0d, 0x00, 0x01, 0x48, 0x01, 0xce, 0x05, 0xff, 0x01, 0xfd, 0x01, 0x96, + 0x01, 0x10, 0x09, 0x00, 0x01, 0x7d, 0x09, 0xff, 0x01, 0xfa, 0x01, 0x20, + 0x07, 0x00, 0x01, 0x2d, 0x0b, 0xff, 0x01, 0xf6, 0x06, 0x00, 0x01, 0x03, + 0x01, 0xef, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x75, 0x01, 0x4d, 0x01, 0xff, + 0x01, 0xf6, 0x01, 0x56, 0x01, 0x9d, 0x03, 0xff, 0x01, 0x80, 0x05, 0x00, + 0x01, 0x1e, 0x02, 0xff, 0x01, 0xe6, 0x02, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x02, 0x00, 0x01, 0x3b, 0x02, 0xff, 0x01, 0xf5, 0x05, 0x00, + 0x01, 0x8f, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x02, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfe, + 0x05, 0x00, 0x02, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x03, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0x50, 0x03, 0x00, + 0x01, 0x05, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, 0x03, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, 0x03, 0x00, + 0x01, 0x05, 0x02, 0xff, 0x01, 0x30, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, + 0x02, 0xff, 0x01, 0xd1, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2, + 0x03, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x60, 0x04, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x02, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf2, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfe, 0x05, 0x00, + 0x01, 0x1e, 0x02, 0xff, 0x01, 0xf7, 0x01, 0x10, 0x01, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf2, 0x02, 0x00, 0x01, 0x4c, 0x02, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0x04, 0x03, 0xff, 0x01, 0xfb, 0x01, 0x86, 0x01, 0x5d, + 0x01, 0xff, 0x01, 0xf6, 0x01, 0x67, 0x01, 0xae, 0x03, 0xff, 0x01, 0xa0, + 0x06, 0x00, 0x01, 0x4e, 0x0b, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x01, + 0x01, 0x8e, 0x09, 0xff, 0x01, 0xfb, 0x01, 0x30, 0x09, 0x00, 0x01, 0x48, + 0x01, 0xbe, 0x05, 0xff, 0x01, 0xed, 0x01, 0xa6, 0x01, 0x10, 0x0d, 0x00, + 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x10, 0x10, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf2, 0x11, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2, + 0x11, 0x00, 0x01, 0x0b, 0x01, 0xee, 0x01, 0xe2, 0xd2, 0x00, + + /* 21 */ + 0xb4, 0x00, 0x01, 0x0b, 0x01, 0xee, 0x01, 0xec, 0x07, 0x00, 0x01, 0x2e, + 0x01, 0xee, 0x01, 0xe7, 0x07, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x80, + 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x20, + 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfd, 0x05, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xf6, 0x09, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, + 0x01, 0x80, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xb0, 0x0a, 0x00, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfd, + 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf5, 0x0b, 0x00, 0x01, 0x01, + 0x01, 0xef, 0x01, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x90, 0x0c, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd, 0x0d, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xfd, 0x01, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf3, 0x0e, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x80, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70, + 0x0e, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf9, 0x01, 0xff, 0x01, 0xfc, + 0x0f, 0x00, 0x01, 0x08, 0x03, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0xcf, + 0x02, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfc, + 0x11, 0x00, 0x01, 0xaf, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00, 0x01, 0x05, + 0x03, 0xff, 0x01, 0xd0, 0x0f, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfd, + 0x01, 0xff, 0x01, 0xf9, 0x0f, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x91, + 0x01, 0xef, 0x01, 0xff, 0x01, 0x50, 0x0d, 0x00, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xfd, 0x01, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe1, 0x0d, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xfb, 0x0d, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, + 0x01, 0x01, 0x02, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xfd, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xfc, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0x80, + 0x03, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0a, + 0x01, 0xff, 0x01, 0xfd, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf4, + 0x09, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x07, 0x00, 0x01, 0x02, 0x02, 0xff, + 0x01, 0x80, 0x05, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0xa0, 0x07, 0x00, + 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfd, 0x07, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x01, 0xf5, 0x07, 0x00, 0x01, 0x6e, 0x01, 0xee, 0x01, 0xe3, 0x07, 0x00, + 0x01, 0x0b, 0x01, 0xee, 0x01, 0xed, 0x01, 0x10, 0xce, 0x00, + + /* 22 */ + 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0, 0x07, 0x00, 0x01, 0x9e, + 0x01, 0xee, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x07, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xe6, 0x07, 0x66, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x51, + 0x01, 0x10, 0x06, 0x00, 0x01, 0x1f, 0x0c, 0xff, 0x01, 0xf1, 0x06, 0x00, + 0x01, 0x1f, 0x0c, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0x1f, 0x0c, 0xff, + 0x01, 0xf1, 0x11, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf1, 0x11, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf1, 0x11, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf1, 0x11, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf1, 0x11, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf1, 0x11, 0x00, 0x01, 0x01, 0x01, 0x77, + 0x01, 0x70, 0x55, 0x00, + + /* 23 */ + 0xb4, 0x00, 0x01, 0x04, 0x01, 0xee, 0x01, 0xe8, 0x06, 0x00, 0x01, 0xbe, + 0x01, 0xee, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, + 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, + 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, + 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, + 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, + 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, + 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, + 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, + 0x08, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x10, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfa, + 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, + 0x09, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xba, 0x04, 0xaa, + 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x0b, 0x09, 0xff, + 0x01, 0x10, 0x0a, 0x00, 0x01, 0x8f, 0x08, 0xff, 0x01, 0x10, 0x0a, 0x00, + 0x01, 0x01, 0x01, 0x69, 0x05, 0xaa, 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, + 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, + 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, + 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, + 0x11, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0xbe, + 0x01, 0xee, 0x01, 0x10, 0xd0, 0x00, + + /* 24 */ + 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e, + 0x01, 0xee, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe6, 0x03, 0x66, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0xe6, 0x03, 0x66, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x0d, 0xff, 0x01, 0xd0, 0x05, 0x00, 0x01, 0x1f, + 0x0d, 0xff, 0x01, 0xd0, 0x05, 0x00, 0x01, 0x1f, 0x0d, 0xff, 0x01, 0xc0, + 0xcc, 0x00, + + /* 25 */ + 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e, + 0x01, 0xee, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xc0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe6, 0x03, 0x66, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0xe6, 0x03, 0x66, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd1, + 0x01, 0x10, 0x04, 0x00, 0x01, 0x1f, 0x0e, 0xff, 0x01, 0xfa, 0x04, 0x00, + 0x01, 0x1f, 0x0e, 0xff, 0x01, 0xfa, 0x04, 0x00, 0x01, 0x1f, 0x0e, 0xff, + 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf, 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf, + 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf, 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf, + 0x01, 0xfa, 0x12, 0x00, 0x01, 0xbf, 0x01, 0xfa, 0x12, 0x00, 0x01, 0x57, + 0x01, 0x74, 0x53, 0x00, + + /* 26 */ + 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe8, + 0x03, 0x88, 0x01, 0x76, 0x01, 0x53, 0x0c, 0x00, 0x01, 0x1f, 0x07, 0xff, + 0x01, 0xfb, 0x01, 0x50, 0x0a, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfd, + 0x01, 0x30, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfc, 0x03, 0xcc, + 0x01, 0xcd, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x01, 0x01, 0x7e, 0x02, 0xff, + 0x01, 0x20, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, + 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf9, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x06, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, + 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x05, 0x00, 0x01, 0x1a, 0x02, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd6, 0x04, 0x66, 0x01, 0x7b, 0x02, 0xff, 0x01, 0xf9, + 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x1f, + 0x08, 0xff, 0x01, 0xe6, 0x0a, 0x00, 0x01, 0x1e, 0x06, 0xee, 0x01, 0xed, + 0x01, 0xa5, 0xd2, 0x00, + + /* 27 */ + 0xb5, 0x00, 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0x0a, 0x00, 0x01, 0x3e, + 0x01, 0xee, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, + 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, + 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, + 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xe8, 0x03, 0x88, 0x01, 0x76, 0x01, 0x52, 0x05, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x07, 0xff, + 0x01, 0xfb, 0x01, 0x50, 0x03, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, + 0x04, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xfd, 0x01, 0x30, 0x02, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xfd, 0x04, 0xdd, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf5, 0x02, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x04, 0x00, 0x01, 0x01, 0x01, 0x7e, 0x02, 0xff, 0x01, 0x20, + 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xb0, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x3f, 0x01, 0xff, + 0x01, 0xf1, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xf6, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf8, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x04, 0x01, 0xff, + 0x01, 0xf9, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x05, 0x01, 0xff, + 0x01, 0xf8, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf6, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x01, 0xf2, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0xc0, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x1a, 0x02, 0xff, + 0x01, 0x40, 0x01, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd6, 0x04, 0x66, 0x01, 0x7a, 0x02, 0xff, + 0x01, 0xf9, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, + 0x01, 0x1f, 0x09, 0xff, 0x01, 0xa0, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xff, + 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1f, 0x08, 0xff, 0x01, 0xe6, 0x03, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x1e, 0x06, 0xee, + 0x01, 0xed, 0x01, 0xa5, 0x04, 0x00, 0x01, 0x3e, 0x01, 0xee, 0x01, 0xa0, + 0xcb, 0x00, + + /* 28 */ + 0xb4, 0x00, 0x01, 0x2e, 0x06, 0xee, 0x01, 0x50, 0x0c, 0x00, 0x01, 0x2f, + 0x06, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0x2f, 0x06, 0xff, 0x01, 0x50, + 0x0c, 0x00, 0x01, 0x17, 0x04, 0x77, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, + 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, + 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, + 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x11, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0xb8, 0x03, 0x88, 0x01, 0x76, 0x01, 0x41, 0x0c, 0x00, + 0x01, 0x8f, 0x07, 0xff, 0x01, 0xe8, 0x01, 0x20, 0x0a, 0x00, 0x01, 0x8f, + 0x08, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xed, + 0x04, 0xdd, 0x03, 0xff, 0x01, 0xc0, 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, + 0x01, 0x50, 0x04, 0x00, 0x01, 0x03, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xfb, + 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x07, + 0x02, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, + 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xe0, + 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, + 0x06, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, + 0x06, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x50, + 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x4e, + 0x01, 0xff, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x96, + 0x04, 0x66, 0x01, 0x8d, 0x02, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x01, 0x8f, + 0x08, 0xff, 0x01, 0xfe, 0x01, 0x40, 0x09, 0x00, 0x01, 0x8f, 0x08, 0xff, + 0x01, 0xb2, 0x0a, 0x00, 0x01, 0x7e, 0x06, 0xee, 0x01, 0xec, 0x01, 0x83, + 0xce, 0x00, + + /* 29 */ + 0xa5, 0x00, 0x01, 0x14, 0x01, 0x56, 0x01, 0x54, 0x01, 0x20, 0x0e, 0x00, + 0x01, 0x02, 0x01, 0x8e, 0x03, 0xff, 0x01, 0xfe, 0x01, 0xa4, 0x0d, 0x00, + 0x01, 0x8f, 0x06, 0xff, 0x01, 0xc2, 0x0b, 0x00, 0x01, 0x0c, 0x08, 0xff, + 0x01, 0x50, 0x0a, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x73, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x49, 0x02, 0xff, 0x01, 0xf6, 0x09, 0x00, + 0x01, 0x05, 0x02, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x2c, 0x02, 0xff, + 0x01, 0x30, 0x08, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x5f, 0x01, 0xff, + 0x01, 0xd0, 0x06, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0x60, 0x06, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xfe, 0x08, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x55, 0x01, 0x54, + 0x08, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x90, 0x11, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, + 0x11, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf4, 0x0a, 0x00, 0x01, 0xbf, + 0x08, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xf6, + 0x0a, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0x35, + 0x06, 0x55, 0x01, 0x5a, 0x01, 0xff, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xf5, 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, + 0x06, 0x00, 0x01, 0x09, 0x01, 0xee, 0x01, 0xe5, 0x08, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xf0, 0x06, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf8, + 0x08, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xd0, 0x06, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, + 0x06, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x20, 0x07, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x20, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x90, + 0x06, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0xf3, 0x06, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf3, + 0x08, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x04, 0x00, + 0x01, 0x06, 0x02, 0xff, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, + 0x01, 0xe6, 0x03, 0x00, 0x01, 0x03, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xfd, + 0x0a, 0x00, 0x01, 0x5f, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x87, 0x01, 0x8a, + 0x01, 0xef, 0x02, 0xff, 0x01, 0xd1, 0x0a, 0x00, 0x01, 0x04, 0x01, 0xef, + 0x06, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x19, 0x05, 0xff, + 0x01, 0xfc, 0x01, 0x50, 0x0d, 0x00, 0x01, 0x15, 0x01, 0x9b, 0x01, 0xde, + 0x01, 0xdc, 0x01, 0xa7, 0x01, 0x20, 0xbe, 0x00, + + /* 30 */ + 0xab, 0x00, 0x01, 0x13, 0x01, 0x56, 0x01, 0x54, 0x01, 0x20, 0x06, 0x00, + 0x01, 0x1e, 0x01, 0xee, 0x01, 0xb0, 0x05, 0x00, 0x01, 0x02, 0x01, 0x8d, + 0x03, 0xff, 0x01, 0xfe, 0x01, 0x93, 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x04, 0x00, 0x01, 0x01, 0x01, 0x9f, 0x06, 0xff, 0x01, 0xb2, + 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x3e, + 0x08, 0xff, 0x01, 0x50, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, + 0x03, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xfc, 0x01, 0x62, 0x01, 0x00, + 0x01, 0x02, 0x01, 0x6b, 0x02, 0xff, 0x01, 0xf6, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xfe, + 0x01, 0x40, 0x04, 0x00, 0x01, 0x3d, 0x02, 0xff, 0x01, 0x30, 0x02, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0xd1, 0x05, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xd0, + 0x02, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x04, + 0x02, 0xff, 0x01, 0x10, 0x06, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xf7, + 0x02, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf6, 0x07, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, + 0x02, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x40, + 0x01, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0x80, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90, + 0x01, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x20, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x01, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x02, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x09, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf0, 0x01, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, + 0x01, 0xfc, 0x09, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, + 0x01, 0x1f, 0x05, 0xff, 0x01, 0xfb, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf4, 0x01, 0x00, 0x01, 0x1f, 0x05, 0xff, 0x01, 0xfa, 0x09, 0x00, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, 0x01, 0x1f, 0x05, 0xff, + 0x01, 0xf9, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe5, 0x01, 0x55, 0x01, 0x57, 0x01, 0xff, + 0x01, 0xfa, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, + 0x01, 0xfb, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0xff, 0x01, 0xfd, + 0x09, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, 0x01, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x10, + 0x08, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50, + 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xb0, + 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, + 0x07, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfe, 0x02, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, + 0x07, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x70, + 0x06, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf7, + 0x05, 0x00, 0x01, 0x06, 0x02, 0xff, 0x01, 0x30, 0x02, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xc4, + 0x03, 0x00, 0x01, 0x03, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xf6, 0x03, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x9f, 0x02, 0xff, + 0x01, 0xea, 0x01, 0x87, 0x01, 0x8a, 0x01, 0xef, 0x02, 0xff, 0x01, 0x50, + 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x06, + 0x07, 0xff, 0x01, 0xd4, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, + 0x05, 0x00, 0x01, 0x19, 0x05, 0xff, 0x01, 0xe7, 0x0e, 0x00, 0x01, 0x04, + 0x01, 0x9b, 0x01, 0xce, 0x01, 0xdc, 0x01, 0x95, 0xb9, 0x00, + + /* 31 */ + 0xb7, 0x00, 0x01, 0x04, 0x01, 0x9c, 0x01, 0xde, 0x06, 0xee, 0x01, 0xc0, + 0x09, 0x00, 0x01, 0x04, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xd0, 0x09, 0x00, + 0x01, 0x6f, 0x09, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x04, 0x02, 0xff, + 0x01, 0xfb, 0x01, 0x87, 0x04, 0x77, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd0, + 0x08, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x20, 0x05, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, + 0x01, 0xe1, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, + 0x01, 0x9f, 0x01, 0xff, 0x01, 0x60, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xd0, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x30, 0x06, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x10, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0x20, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xd0, 0x08, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xd0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0xe8, + 0x01, 0x54, 0x04, 0x44, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xd0, 0x09, 0x00, + 0x01, 0x4f, 0x09, 0xff, 0x01, 0xd0, 0x09, 0x00, 0x01, 0x03, 0x01, 0xdf, + 0x08, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x05, 0x01, 0xae, 0x07, 0xff, + 0x01, 0xd0, 0x0c, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x32, + 0x01, 0x22, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xd0, 0x0c, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0xe2, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, + 0x0b, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x30, 0x02, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf5, + 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x04, + 0x02, 0xff, 0x01, 0x60, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, + 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xd0, 0x09, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, + 0x01, 0x90, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x09, 0x00, + 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xd0, 0x09, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xfd, 0x01, 0x10, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, + 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xe1, 0x06, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0x20, + 0x06, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, 0x07, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0xf4, 0x07, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xd0, + 0xcf, 0x00, + + /* 32 */ + 0xff, 0x00, 0x45, 0x00, 0x01, 0x01, 0x01, 0x11, 0x10, 0x00, 0x01, 0x02, + 0x01, 0x8d, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x93, 0x0e, 0x00, 0x01, 0x9f, + 0x05, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x0b, 0x06, 0xff, 0x01, 0xfb, + 0x0c, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x42, 0x01, 0x12, + 0x01, 0x4a, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x30, 0x03, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00, + 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xb0, + 0x0a, 0x00, 0x01, 0x02, 0x01, 0xdd, 0x01, 0xd5, 0x04, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xc0, 0x0e, 0x00, 0x01, 0x02, + 0x01, 0x57, 0x01, 0xad, 0x02, 0xff, 0x01, 0xc0, 0x0c, 0x00, 0x01, 0x16, + 0x01, 0xad, 0x05, 0xff, 0x01, 0xc0, 0x0b, 0x00, 0x01, 0x09, 0x04, 0xff, + 0x01, 0xfe, 0x01, 0x9d, 0x01, 0xff, 0x01, 0xc0, 0x0b, 0x00, 0x01, 0xcf, + 0x02, 0xff, 0x01, 0xc9, 0x01, 0x64, 0x01, 0x10, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x71, + 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xc0, + 0x0a, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x70, + 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xc0, + 0x0a, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0x0a, + 0x02, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0x83, + 0x01, 0x12, 0x01, 0x48, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf4, 0x0b, 0x00, + 0x01, 0xcf, 0x05, 0xff, 0x01, 0x76, 0x02, 0xff, 0x01, 0xf6, 0x0a, 0x00, + 0x01, 0x1b, 0x04, 0xff, 0x01, 0xc3, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, + 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x39, 0x01, 0xce, 0x01, 0xdc, 0x01, 0x94, + 0x02, 0x00, 0x01, 0x2a, 0x01, 0xde, 0x01, 0xb3, 0xbd, 0x00, + + /* 33 */ + 0x93, 0x00, 0x01, 0x03, 0x01, 0xcc, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xd0, 0x10, 0x00, 0x01, 0x26, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xa0, 0x0d, 0x00, 0x01, 0x02, 0x01, 0x69, 0x01, 0xbe, 0x03, 0xff, + 0x01, 0x40, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xcf, 0x04, 0xff, 0x01, 0xf6, + 0x0d, 0x00, 0x01, 0x3f, 0x03, 0xff, 0x01, 0xfe, 0x01, 0xa6, 0x01, 0x10, + 0x0d, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x85, 0x01, 0x10, + 0x0e, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x40, 0x11, 0x00, 0x01, 0x7f, 0x01, 0xf7, 0x02, 0x00, + 0x01, 0x10, 0x0f, 0x00, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0x3a, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xfb, 0x01, 0x71, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xff, + 0x01, 0x99, 0x04, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xdf, 0x05, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x08, + 0x02, 0xff, 0x01, 0xfe, 0x01, 0x72, 0x01, 0x11, 0x01, 0x5b, 0x02, 0xff, + 0x01, 0x50, 0x0a, 0x00, 0x01, 0x0b, 0x02, 0xff, 0x01, 0xc1, 0x03, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x01, 0xe1, 0x0a, 0x00, 0x01, 0x0d, 0x01, 0xff, + 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf7, + 0x0a, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xfd, 0x0a, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf1, + 0x05, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x50, + 0x09, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x80, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, + 0x05, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x50, + 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, + 0x04, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfd, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf6, + 0x0b, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xe3, 0x03, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xa6, + 0x01, 0x45, 0x01, 0x8e, 0x02, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x01, + 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf5, 0x0d, 0x00, 0x01, 0x08, 0x04, 0xff, + 0x01, 0xfc, 0x01, 0x30, 0x0e, 0x00, 0x01, 0x16, 0x01, 0xac, 0x01, 0xed, + 0x01, 0xc8, 0x01, 0x30, 0xc0, 0x00, + + /* 34 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x04, 0x77, 0x01, 0x63, 0x0e, 0x00, + 0x01, 0xef, 0x05, 0xff, 0x01, 0xd5, 0x0d, 0x00, 0x01, 0xef, 0x06, 0xff, + 0x01, 0x60, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x02, 0x99, 0x01, 0xac, + 0x02, 0xff, 0x01, 0xf1, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, + 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x03, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf7, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x03, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xe0, + 0x0c, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x02, 0x99, 0x01, 0xac, 0x02, 0xff, + 0x01, 0x40, 0x0c, 0x00, 0x01, 0xef, 0x05, 0xff, 0x01, 0xf3, 0x0d, 0x00, + 0x01, 0xef, 0x05, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xfc, 0x03, 0x88, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x30, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x04, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x90, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xfa, 0x03, 0x22, 0x01, 0x4b, 0x02, 0xff, 0x01, 0x10, + 0x0b, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0xef, + 0x06, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0xef, 0x04, 0xff, 0x01, 0xfd, + 0x01, 0x93, 0xd4, 0x00, + + /* 35 */ + 0xff, 0x00, 0x56, 0x00, 0x06, 0x77, 0x01, 0x70, 0x0d, 0x00, 0x01, 0xef, + 0x05, 0xff, 0x01, 0xf0, 0x0d, 0x00, 0x01, 0xef, 0x05, 0xff, 0x01, 0xf0, + 0x0d, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x04, 0x99, 0x01, 0x90, 0x0d, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0xd9, 0x00, + + /* 36 */ + 0xff, 0x00, 0x58, 0x00, 0x01, 0x57, 0x06, 0x77, 0x01, 0x20, 0x0c, 0x00, + 0x01, 0xcf, 0x06, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xdf, 0x06, 0xff, + 0x01, 0x50, 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xfd, 0x03, 0x99, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xfa, 0x03, 0x00, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xfa, + 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xfa, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, + 0x01, 0xef, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, + 0x0c, 0x00, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, + 0x01, 0x50, 0x0c, 0x00, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf8, + 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf6, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, + 0x0b, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf3, + 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, + 0x0b, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x90, + 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0x30, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x50, + 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xfd, 0x04, 0x22, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0x50, 0x09, 0x00, 0x01, 0x6a, 0x01, 0xae, 0x08, 0xff, + 0x01, 0xca, 0x01, 0xa0, 0x08, 0x00, 0x01, 0x9f, 0x0a, 0xff, 0x01, 0xf0, + 0x08, 0x00, 0x01, 0x9f, 0x0a, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, + 0x01, 0xf5, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, + 0x01, 0xf5, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, + 0x01, 0xf5, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, + 0x01, 0xf5, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x8e, + 0x01, 0xe5, 0x08, 0x00, 0x01, 0xde, 0x01, 0xe0, 0x6c, 0x00, + + /* 37 */ + 0xff, 0x00, 0x58, 0x00, 0x01, 0x28, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfc, + 0x01, 0x71, 0x0e, 0x00, 0x01, 0x09, 0x05, 0xff, 0x01, 0x60, 0x0c, 0x00, + 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0x73, 0x01, 0x11, 0x01, 0x5b, 0x02, 0xff, + 0x01, 0x50, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xc1, 0x03, 0x00, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0xe0, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfe, + 0x01, 0x10, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, + 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, 0x01, 0xdf, 0x01, 0xfc, + 0x0a, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0x7f, + 0x01, 0xff, 0x0a, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xb0, 0x05, 0x00, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0x30, 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xc6, 0x05, 0x66, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x60, 0x09, 0x00, + 0x01, 0x1f, 0x09, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x2f, 0x09, 0xff, + 0x01, 0x80, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xb6, 0x07, 0x66, + 0x01, 0x30, 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x80, 0x11, 0x00, + 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf0, 0x05, 0x00, 0x01, 0x48, 0x01, 0x88, 0x0a, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xef, 0x01, 0xfc, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd2, 0x03, 0x00, + 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe1, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, + 0x01, 0xa6, 0x01, 0x45, 0x01, 0x7c, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, + 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x08, + 0x04, 0xff, 0x01, 0xfd, 0x01, 0x40, 0x0e, 0x00, 0x01, 0x16, 0x01, 0xad, + 0x01, 0xee, 0x01, 0xc9, 0x01, 0x40, 0xc0, 0x00, + + /* 38 */ + 0xff, 0x00, 0x55, 0x00, 0x01, 0x03, 0x02, 0x77, 0x03, 0x00, 0x01, 0x01, + 0x01, 0x77, 0x01, 0x71, 0x03, 0x00, 0x01, 0x06, 0x01, 0x77, 0x01, 0x73, + 0x06, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xb0, 0x02, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xb0, + 0x06, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfb, 0x02, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf4, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfb, + 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf4, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xc0, + 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfa, 0x01, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfc, + 0x0a, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf4, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x93, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xc1, + 0x0c, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfb, 0x01, 0xff, 0x01, 0xfb, + 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x0d, 0x00, 0x01, 0xcf, 0x04, 0xff, + 0x01, 0xd1, 0x0e, 0x00, 0x01, 0x0d, 0x03, 0xff, 0x01, 0xfd, 0x01, 0x10, + 0x0e, 0x00, 0x01, 0x5f, 0x04, 0xff, 0x01, 0x60, 0x0d, 0x00, 0x01, 0x05, + 0x05, 0xff, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xe5, + 0x01, 0xff, 0x01, 0xf5, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x23, 0x01, 0xff, 0x01, 0xf4, + 0x01, 0x1d, 0x01, 0xff, 0x01, 0xf7, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x01, 0xe2, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x01, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd, + 0x01, 0x20, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x1d, + 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd1, + 0x01, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x01, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x70, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xfd, 0x01, 0x10, 0x01, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, + 0x02, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf8, 0x07, 0x00, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0xd1, 0x02, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf4, + 0x02, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x02, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf8, + 0x05, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd1, 0x03, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x80, 0xcc, 0x00, + + /* 39 */ + 0xff, 0x00, 0x45, 0x00, 0x01, 0x01, 0x11, 0x00, 0x01, 0x17, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0xa5, 0x0e, 0x00, 0x01, 0x06, 0x05, 0xff, + 0x01, 0xd3, 0x0d, 0x00, 0x01, 0x5f, 0x06, 0xff, 0x01, 0x30, 0x0c, 0x00, + 0x01, 0xef, 0x01, 0xff, 0x01, 0xc5, 0x01, 0x21, 0x01, 0x26, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0xd0, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfb, + 0x03, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x0b, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x0b, 0x00, 0x01, 0x05, 0x01, 0x88, 0x01, 0x80, 0x04, 0x00, 0x01, 0xff, + 0x01, 0xfa, 0x11, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x11, 0x00, + 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf4, 0x0e, 0x00, 0x01, 0x01, 0x01, 0x33, + 0x01, 0x36, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x0e, 0x00, 0x01, 0x09, + 0x03, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x09, 0x03, 0xff, + 0x01, 0xfa, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x08, 0x01, 0xee, 0x03, 0xff, + 0x01, 0xe3, 0x10, 0x00, 0x01, 0x01, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfd, + 0x11, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x06, + 0x01, 0x66, 0x01, 0x30, 0x04, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x70, + 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0x80, 0x0a, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf1, + 0x04, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x0a, 0x00, 0x01, 0x0a, + 0x01, 0xff, 0x01, 0xfb, 0x03, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0x10, + 0x0a, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0xe8, 0x01, 0x53, 0x01, 0x46, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0x7f, 0x06, 0xff, + 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xef, 0x04, 0xff, 0x01, 0xf7, + 0x0e, 0x00, 0x01, 0x05, 0x01, 0x9c, 0x01, 0xde, 0x01, 0xdc, 0x01, 0x95, + 0xc1, 0x00, + + /* 40 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x74, 0x04, 0x00, 0x01, 0x05, + 0x01, 0x77, 0x01, 0x76, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x03, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x0e, 0x02, 0xff, 0x01, 0xfe, + 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, + 0x01, 0xcf, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xe1, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0x70, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0xcf, 0x01, 0xfd, 0x01, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, + 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x01, 0xb0, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x20, 0x01, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0, 0x02, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0xdf, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x9f, + 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf3, 0x03, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xa0, + 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x02, 0xff, + 0x01, 0x10, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xff, 0x01, 0xe0, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xfe, + 0xd2, 0x00, + + /* 41 */ + 0xca, 0x00, 0x01, 0x2a, 0x01, 0xa2, 0x03, 0x00, 0x01, 0x3a, 0x01, 0xa2, + 0x0d, 0x00, 0x01, 0x2f, 0x01, 0xf9, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xf1, + 0x0d, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x82, 0x01, 0x00, 0x01, 0x29, + 0x01, 0xff, 0x01, 0xc0, 0x0d, 0x00, 0x01, 0x05, 0x05, 0xff, 0x01, 0x30, + 0x0e, 0x00, 0x01, 0x7f, 0x03, 0xff, 0x01, 0xf6, 0x0f, 0x00, 0x01, 0x02, + 0x01, 0x8b, 0x01, 0xdd, 0x01, 0xb8, 0x01, 0x10, 0x21, 0x00, 0x01, 0x67, + 0x01, 0x74, 0x04, 0x00, 0x01, 0x05, 0x01, 0x77, 0x01, 0x76, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfe, + 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x05, + 0x02, 0xff, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, + 0x01, 0x0e, 0x02, 0xff, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xcf, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x70, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0xcf, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf4, + 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x01, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, 0x01, 0x9f, + 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x20, 0x01, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xe0, 0x02, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0xdf, + 0x01, 0xfc, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, + 0x02, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, + 0x01, 0xef, 0x02, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xfe, + 0x0b, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0x10, 0x03, 0x00, 0x01, 0x9f, + 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xe0, + 0x04, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0xd2, 0x00, + + /* 42 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x74, 0x04, 0x00, 0x01, 0x67, + 0x01, 0x77, 0x01, 0x10, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x03, 0x00, + 0x01, 0x09, 0x01, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0xef, 0x01, 0xf8, + 0x03, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x60, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf8, 0x02, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf5, 0x0d, 0x00, + 0x01, 0xef, 0x01, 0xf8, 0x02, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x50, + 0x0d, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf5, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0x50, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x0a, + 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x40, 0x0f, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf4, + 0x10, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0x40, 0x10, 0x00, 0x01, 0xef, + 0x02, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfa, + 0x10, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xb0, + 0x0f, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfb, + 0x0f, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0xb0, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x0a, + 0x01, 0xff, 0x01, 0xfb, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x02, 0x00, + 0x01, 0x9f, 0x01, 0xff, 0x01, 0xc0, 0x0d, 0x00, 0x01, 0xef, 0x01, 0xf8, + 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfc, 0x0d, 0x00, 0x01, 0xef, + 0x01, 0xf8, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xc0, 0x0c, 0x00, + 0x01, 0xef, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfc, + 0x0c, 0x00, 0x01, 0xef, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xff, + 0x01, 0xc1, 0xd2, 0x00, + + /* 43 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x02, 0x06, 0x77, 0x01, 0x75, 0x0c, 0x00, + 0x01, 0x05, 0x06, 0xff, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, 0x06, 0xff, + 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfb, 0x03, 0xaa, + 0x01, 0xef, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, + 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, + 0x01, 0xf2, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, + 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, + 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, 0x01, 0xbf, + 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, + 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, + 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, + 0x01, 0xf0, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, + 0x0c, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0xbf, + 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x80, 0x03, 0x00, + 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x40, + 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x9f, 0x01, 0xff, + 0x01, 0x10, 0x03, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x04, + 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xfc, 0x0b, 0x00, + 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xfc, + 0x0b, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x70, 0x04, 0x00, 0x01, 0xbf, + 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x9f, 0x01, 0xf6, 0x05, 0x00, 0x01, 0xbf, + 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x34, 0xc7, 0x00, + + /* 44 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x77, 0x01, 0x30, 0x04, 0x00, + 0x01, 0x03, 0x02, 0x77, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xd0, + 0x04, 0x00, 0x01, 0x0b, 0x02, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, + 0x01, 0xf3, 0x04, 0x00, 0x01, 0x2f, 0x02, 0xff, 0x0a, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xfa, 0x04, 0x00, 0x01, 0x9f, 0x02, 0xff, 0x0a, 0x00, + 0x01, 0xef, 0x02, 0xff, 0x01, 0x10, 0x03, 0x00, 0x03, 0xff, 0x0a, 0x00, + 0x01, 0xef, 0x02, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0x06, 0x03, 0xff, + 0x0a, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xe0, 0x02, 0x00, 0x01, 0x0d, + 0x03, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xf5, + 0x02, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x0a, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0xdf, 0x01, 0xfc, 0x02, 0x00, 0x01, 0xaf, + 0x01, 0xfe, 0x01, 0x8f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x01, 0x7f, 0x01, 0xff, 0x01, 0x30, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf8, + 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x7f, + 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf1, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x7f, 0x01, 0xff, + 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0x40, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0xcf, 0x01, 0xfd, 0x01, 0xcf, + 0x01, 0xfe, 0x01, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x00, 0x01, 0x6f, 0x02, 0xff, 0x01, 0xf7, 0x01, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, + 0x01, 0x0f, 0x02, 0xff, 0x01, 0xf1, 0x01, 0x00, 0x01, 0x7f, 0x01, 0xff, + 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x09, 0x02, 0xff, + 0x01, 0xa0, 0x01, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x40, 0x01, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0xcf, 0x01, 0xfd, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xf7, 0x02, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x06, 0x01, 0x61, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x0a, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00, 0x01, 0x7f, 0x01, 0xff, 0xd1, 0x00, + + /* 45 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x74, 0x05, 0x00, 0x01, 0x77, + 0x01, 0x73, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x05, 0xaa, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x07, 0xff, 0x01, 0xf8, 0x0b, 0x00, + 0x01, 0xef, 0x07, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfc, + 0x05, 0x77, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf8, 0xd2, 0x00, + + /* 46 */ + 0xff, 0x00, 0x58, 0x00, 0x01, 0x39, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xeb, + 0x01, 0x60, 0x0e, 0x00, 0x01, 0x1b, 0x04, 0xff, 0x01, 0xfe, 0x01, 0x50, + 0x0c, 0x00, 0x01, 0x02, 0x01, 0xef, 0x05, 0xff, 0x01, 0xf8, 0x0c, 0x00, + 0x01, 0x0d, 0x02, 0xff, 0x01, 0x83, 0x01, 0x12, 0x01, 0x5c, 0x02, 0xff, + 0x01, 0x50, 0x0b, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xd1, 0x03, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x01, 0xe1, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xff, + 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf7, + 0x0a, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xfd, 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf1, + 0x05, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x50, + 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, + 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, + 0x05, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x50, + 0x09, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0x10, 0x09, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, + 0x04, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfd, 0x0b, 0x00, 0x02, 0xff, + 0x01, 0x20, 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf6, 0x0b, 0x00, + 0x01, 0x8f, 0x01, 0xff, 0x01, 0xe3, 0x03, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0xd0, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xa5, 0x01, 0x34, + 0x01, 0x7e, 0x02, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xcf, + 0x05, 0xff, 0x01, 0xf5, 0x0d, 0x00, 0x01, 0x19, 0x04, 0xff, 0x01, 0xfc, + 0x01, 0x30, 0x0e, 0x00, 0x01, 0x27, 0x01, 0xbd, 0x01, 0xee, 0x01, 0xc9, + 0x01, 0x40, 0xc0, 0x00, + + /* 47 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x07, 0x77, 0x01, 0x73, 0x0b, 0x00, + 0x01, 0xef, 0x07, 0xff, 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x07, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x05, 0xaa, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0xd2, 0x00, + + /* 48 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x72, 0x01, 0x00, 0x01, 0x29, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc7, 0x01, 0x10, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf4, 0x01, 0x08, 0x04, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf4, 0x01, 0xaf, 0x05, 0xff, 0x01, 0x80, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xfc, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x42, 0x01, 0x37, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0xf6, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, + 0x01, 0x30, 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, + 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf3, 0x04, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, + 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf2, + 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x05, 0x01, 0xff, + 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00, + 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00, + 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00, + 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x05, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfe, + 0x05, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, + 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf4, + 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xef, + 0x02, 0xff, 0x01, 0x40, 0x02, 0x00, 0x01, 0x1b, 0x01, 0xff, 0x01, 0xfe, + 0x01, 0x10, 0x0a, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x64, + 0x01, 0x58, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf5, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0xaf, 0x05, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x08, 0x04, 0xff, 0x01, 0xe4, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x00, 0x01, 0x28, 0x01, 0xce, 0x01, 0xed, 0x01, 0xa5, + 0x0d, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xde, 0x01, 0xe8, + 0x25, 0x00, + + /* 49 */ + 0xff, 0x00, 0x58, 0x00, 0x01, 0x38, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xea, + 0x01, 0x50, 0x0e, 0x00, 0x01, 0x19, 0x04, 0xff, 0x01, 0xfd, 0x01, 0x20, + 0x0c, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff, 0x01, 0xf2, 0x0c, 0x00, + 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x73, 0x01, 0x12, 0x01, 0x6d, + 0x01, 0xff, 0x01, 0xfd, 0x0c, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xc1, + 0x03, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xb0, + 0x0a, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0x0a, + 0x01, 0xff, 0x01, 0xf0, 0x0a, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, + 0x04, 0x00, 0x01, 0x04, 0x01, 0xbb, 0x01, 0xb1, 0x0a, 0x00, 0x01, 0x0d, + 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, + 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x11, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x70, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, + 0x11, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, 0x11, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x55, 0x01, 0x52, 0x0a, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf1, 0x04, 0x00, 0x01, 0x04, 0x01, 0xff, + 0x01, 0xf4, 0x0a, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, + 0x01, 0x09, 0x01, 0xff, 0x01, 0xf1, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xfe, + 0x01, 0x10, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xc0, 0x0b, 0x00, + 0x01, 0x8f, 0x01, 0xff, 0x01, 0xd2, 0x02, 0x00, 0x01, 0x01, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0x94, + 0x01, 0x34, 0x01, 0x8e, 0x01, 0xff, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x01, + 0x01, 0xdf, 0x05, 0xff, 0x01, 0xe1, 0x0d, 0x00, 0x01, 0x19, 0x04, 0xff, + 0x01, 0xfa, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x27, 0x01, 0xcd, 0x01, 0xee, + 0x01, 0xc8, 0x01, 0x20, 0xc0, 0x00, + + /* 50 */ + 0xff, 0x00, 0x55, 0x00, 0x01, 0x47, 0x06, 0x77, 0x01, 0x76, 0x0c, 0x00, + 0x01, 0x9f, 0x06, 0xff, 0x01, 0xfe, 0x0c, 0x00, 0x01, 0x9f, 0x06, 0xff, + 0x01, 0xfe, 0x0c, 0x00, 0x01, 0x6a, 0x02, 0xaa, 0x01, 0xdf, 0x01, 0xff, + 0x02, 0xaa, 0x01, 0xa9, 0x0f, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, 0x01, 0x9f, 0x01, 0xfe, 0x12, 0x00, + 0x01, 0x9f, 0x01, 0xfe, 0xd7, 0x00, + + /* 51 */ + 0xff, 0x00, 0x55, 0x00, 0x01, 0x67, 0x01, 0x75, 0x05, 0x00, 0x01, 0x05, + 0x01, 0x77, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x05, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb0, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xff, + 0x01, 0x50, 0x04, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x50, 0x0a, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x0b, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf0, 0x03, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf9, 0x0b, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5, + 0x03, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf3, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xfb, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, 0x0c, 0x00, + 0x01, 0x9f, 0x01, 0xff, 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x70, + 0x0c, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, + 0x02, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x0d, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf1, 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5, 0x0d, 0x00, + 0x01, 0x04, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf0, 0x0e, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0x90, 0x0e, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x10, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0x40, 0x0e, 0x00, 0x01, 0x3f, 0x01, 0xff, + 0x01, 0x50, 0x01, 0xbf, 0x01, 0xfd, 0x0f, 0x00, 0x01, 0x0d, 0x01, 0xff, + 0x01, 0xb1, 0x01, 0xff, 0x01, 0xf8, 0x0f, 0x00, 0x01, 0x08, 0x01, 0xff, + 0x01, 0xf7, 0x01, 0xff, 0x01, 0xf2, 0x0f, 0x00, 0x01, 0x03, 0x03, 0xff, + 0x01, 0xc0, 0x10, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0x60, 0x10, 0x00, + 0x01, 0x8f, 0x02, 0xff, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfa, + 0x11, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf4, 0x11, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x80, + 0x11, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x20, 0x11, 0x00, 0x01, 0xef, + 0x01, 0xfc, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x0f, 0x00, + 0x01, 0x05, 0x01, 0x76, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x0f, 0x00, + 0x01, 0x09, 0x03, 0xff, 0x01, 0x50, 0x0f, 0x00, 0x01, 0x09, 0x02, 0xff, + 0x01, 0xf7, 0x10, 0x00, 0x01, 0x05, 0x01, 0xce, 0x01, 0xda, 0x01, 0x30, + 0x24, 0x00, + + /* 52 */ + 0xe3, 0x00, 0x01, 0x05, 0x01, 0x99, 0x01, 0x80, 0x11, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, + 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, + 0x0c, 0x00, 0x01, 0x01, 0x01, 0x8d, 0x01, 0xff, 0x01, 0xeb, 0x01, 0x40, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x02, 0x01, 0x9e, 0x01, 0xff, + 0x01, 0xea, 0x01, 0x50, 0x07, 0x00, 0x01, 0x6f, 0x03, 0xff, 0x01, 0xfa, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x5f, 0x03, 0xff, 0x01, 0xfc, + 0x01, 0x20, 0x05, 0x00, 0x01, 0x06, 0x05, 0xff, 0x01, 0x98, 0x01, 0xff, + 0x01, 0xe4, 0x05, 0xff, 0x01, 0xd1, 0x05, 0x00, 0x01, 0x3f, 0x01, 0xff, + 0x01, 0xfc, 0x01, 0x53, 0x01, 0x36, 0x01, 0xcf, 0x01, 0xfc, 0x01, 0xff, + 0x01, 0xfd, 0x01, 0xff, 0x01, 0x83, 0x01, 0x24, 0x01, 0x9f, 0x01, 0xff, + 0x01, 0xfb, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, + 0x01, 0x0a, 0x03, 0xff, 0x01, 0xe2, 0x02, 0x00, 0x01, 0x03, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfc, + 0x04, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4, + 0x04, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xfb, 0x04, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0, + 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, + 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf7, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0x90, + 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf9, 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, + 0x01, 0x09, 0x01, 0xff, 0x01, 0xf0, 0x05, 0x00, 0x01, 0xff, 0x01, 0xfa, + 0x03, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0x70, 0x04, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x03, 0x00, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf0, 0x05, 0x00, 0x01, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0x90, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf0, + 0x05, 0x00, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xb0, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x04, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x03, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf0, 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf4, 0x03, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf5, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfc, 0x04, 0x00, + 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf1, 0x03, 0x00, 0x01, 0x04, 0x01, 0xff, + 0x01, 0xfc, 0x04, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0x40, 0x03, 0x00, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0xb0, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xa0, 0x02, 0x00, 0x01, 0x0b, 0x03, 0xff, 0x01, 0xe3, 0x02, 0x00, + 0x01, 0x04, 0x02, 0xff, 0x01, 0x40, 0x04, 0x00, 0x01, 0x5f, 0x01, 0xff, + 0x01, 0xfd, 0x01, 0x74, 0x01, 0x47, 0x01, 0xdf, 0x01, 0xfe, 0x03, 0xff, + 0x01, 0x95, 0x01, 0x45, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, + 0x01, 0x08, 0x05, 0xff, 0x01, 0xb8, 0x01, 0xff, 0x01, 0xe6, 0x05, 0xff, + 0x01, 0xd1, 0x06, 0x00, 0x01, 0x7f, 0x03, 0xff, 0x01, 0xfa, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xe0, 0x01, 0x6f, 0x03, 0xff, 0x01, 0xfa, 0x01, 0x10, + 0x06, 0x00, 0x01, 0x02, 0x01, 0x8c, 0x01, 0xef, 0x01, 0xdb, 0x01, 0x50, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x02, 0x01, 0x8d, 0x01, 0xee, + 0x01, 0xd9, 0x01, 0x30, 0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, + 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, + 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, + 0x11, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xe0, 0x1e, 0x00, + + /* 53 */ + 0xff, 0x00, 0x55, 0x00, 0x01, 0x37, 0x01, 0x77, 0x01, 0x30, 0x04, 0x00, + 0x01, 0x17, 0x01, 0x77, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x0d, 0x01, 0xff, + 0x01, 0xe1, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x20, 0x0a, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x0d, 0x01, 0xff, + 0x01, 0xe1, 0x02, 0x00, 0x01, 0xcf, 0x01, 0xfe, 0x01, 0x10, 0x0c, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xf5, 0x0e, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x90, 0x0e, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf2, + 0x01, 0xcf, 0x01, 0xfd, 0x0f, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfe, + 0x01, 0xff, 0x01, 0xf3, 0x10, 0x00, 0x01, 0x6f, 0x02, 0xff, 0x01, 0x70, + 0x10, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xfd, 0x11, 0x00, 0x01, 0x4f, 0x02, 0xff, 0x01, 0x80, + 0x0f, 0x00, 0x01, 0x01, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf3, 0x0f, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xe3, 0x01, 0xef, 0x01, 0xfd, 0x0f, 0x00, + 0x01, 0x6f, 0x01, 0xff, 0x01, 0x50, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x90, + 0x0d, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x01, 0x00, 0x01, 0x0a, + 0x01, 0xff, 0x01, 0xf4, 0x0d, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xe1, + 0x01, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xfd, 0x0d, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90, + 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xf4, 0x0b, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xe1, + 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00, + 0x01, 0x9f, 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x01, 0xa0, 0x0a, 0x00, 0x02, 0x11, 0x05, 0x00, 0x01, 0x01, 0x01, 0x11, + 0x01, 0x10, 0xbe, 0x00, + + /* 54 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x74, 0x05, 0x00, 0x01, 0x77, + 0x01, 0x73, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x00, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x05, 0x11, 0x01, 0xff, + 0x01, 0xf7, 0x0b, 0x00, 0x01, 0xef, 0x07, 0xff, 0x01, 0xfc, 0x01, 0x99, + 0x0a, 0x00, 0x01, 0xef, 0x09, 0xff, 0x0a, 0x00, 0x01, 0xef, 0x09, 0xff, + 0x12, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x12, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x12, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x12, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x12, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x6d, 0x00, + + /* 55 */ + 0xff, 0x00, 0x55, 0x00, 0x01, 0x02, 0x01, 0x77, 0x01, 0x71, 0x04, 0x00, + 0x01, 0x77, 0x01, 0x73, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, + 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, + 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, + 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x04, 0x00, + 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, + 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x05, 0x01, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, + 0x02, 0xff, 0x01, 0x85, 0x03, 0x55, 0x01, 0xff, 0x01, 0xf8, 0x0c, 0x00, + 0x01, 0x6f, 0x06, 0xff, 0x01, 0xf8, 0x0c, 0x00, 0x01, 0x07, 0x06, 0xff, + 0x01, 0xf8, 0x0d, 0x00, 0x01, 0x17, 0x01, 0xbc, 0x03, 0xcc, 0x01, 0xff, + 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x12, 0x00, 0x01, 0x11, 0x01, 0x10, 0xbf, 0x00, + + /* 56 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x66, 0x01, 0x64, 0x02, 0x00, 0x01, 0x01, + 0x01, 0x66, 0x01, 0x62, 0x02, 0x00, 0x01, 0x02, 0x01, 0x66, 0x01, 0x60, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x11, 0x01, 0x13, + 0x01, 0xff, 0x01, 0xf6, 0x02, 0x11, 0x01, 0x17, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0xef, 0x0a, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, + 0x0a, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x0a, 0xff, 0x01, 0xf1, + 0xcf, 0x00, + + /* 57 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x66, 0x01, 0x63, 0x02, 0x00, 0x01, 0x01, + 0x01, 0x66, 0x01, 0x62, 0x02, 0x00, 0x01, 0x02, 0x01, 0x66, 0x01, 0x60, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x02, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xf1, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x11, 0x01, 0x13, + 0x01, 0xff, 0x01, 0xf6, 0x02, 0x11, 0x01, 0x17, 0x01, 0xff, 0x01, 0xf1, + 0x08, 0x00, 0x01, 0xef, 0x0a, 0xff, 0x01, 0xf9, 0x01, 0x95, 0x07, 0x00, + 0x01, 0xef, 0x0b, 0xff, 0x01, 0xf9, 0x07, 0x00, 0x01, 0xef, 0x0b, 0xff, + 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f, 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f, + 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f, 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f, + 0x01, 0xf9, 0x12, 0x00, 0x01, 0x5f, 0x01, 0xf9, 0x6a, 0x00, + + /* 58 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x56, 0x01, 0x63, 0x12, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xff, 0x02, 0xee, 0x01, 0xed, + 0x01, 0xc9, 0x01, 0x60, 0x0d, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0x70, + 0x0c, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xfa, 0x02, 0x33, 0x01, 0x34, 0x01, 0x6a, 0x02, 0xff, 0x01, 0x50, + 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x01, 0xd0, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x0c, + 0x01, 0xff, 0x01, 0xf1, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, + 0x01, 0x09, 0x01, 0xff, 0x01, 0xf3, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x04, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xe0, + 0x0b, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x11, 0x01, 0x38, 0x02, 0xff, + 0x01, 0x70, 0x0b, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0xfc, 0x0c, 0x00, + 0x01, 0xef, 0x06, 0xff, 0x01, 0xc1, 0x0c, 0x00, 0x01, 0xef, 0x05, 0xff, + 0x01, 0xb5, 0x0d, 0x00, 0x05, 0x11, 0xc2, 0x00, + + /* 59 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x56, 0x01, 0x63, 0x07, 0x00, 0x01, 0x02, + 0x01, 0x66, 0x01, 0x60, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x07, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xff, + 0x02, 0xee, 0x01, 0xed, 0x01, 0xc9, 0x01, 0x60, 0x02, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x06, 0xff, 0x01, 0x70, + 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, + 0x06, 0xff, 0x01, 0xfa, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x02, 0x33, 0x01, 0x34, 0x01, 0x6b, + 0x02, 0xff, 0x01, 0x50, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd0, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf1, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf3, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xe0, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x03, 0x11, 0x01, 0x37, 0x02, 0xff, 0x01, 0x70, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x06, 0xff, + 0x01, 0xfc, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, + 0x01, 0xef, 0x06, 0xff, 0x01, 0xc1, 0x01, 0x00, 0x01, 0x07, 0x01, 0xff, + 0x01, 0xf0, 0x08, 0x00, 0x01, 0xef, 0x05, 0xff, 0x01, 0xb5, 0x02, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x05, 0x11, 0x05, 0x00, + 0x01, 0x11, 0x01, 0x10, 0xbb, 0x00, + + /* 60 */ + 0xff, 0x00, 0x55, 0x00, 0x01, 0x36, 0x04, 0x66, 0x01, 0x63, 0x0e, 0x00, + 0x01, 0x9f, 0x04, 0xff, 0x01, 0xf8, 0x0e, 0x00, 0x01, 0x9f, 0x04, 0xff, + 0x01, 0xf8, 0x0e, 0x00, 0x01, 0x6a, 0x03, 0xaa, 0x01, 0xff, 0x01, 0xf8, + 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, + 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x12, 0x00, 0x01, 0xff, 0x01, 0xf8, + 0x12, 0x00, 0x02, 0xff, 0x02, 0xee, 0x01, 0xed, 0x01, 0xc9, 0x01, 0x50, + 0x0d, 0x00, 0x06, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x0c, 0x00, 0x07, 0xff, + 0x01, 0xf9, 0x0c, 0x00, 0x01, 0xff, 0x01, 0xfa, 0x02, 0x33, 0x01, 0x34, + 0x01, 0x6b, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf8, + 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xc0, 0x0b, 0x00, 0x01, 0xff, + 0x01, 0xf8, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf1, 0x0b, 0x00, + 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf3, + 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf3, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x0b, + 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0xe0, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xf9, + 0x03, 0x11, 0x01, 0x38, 0x02, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x07, 0xff, + 0x01, 0xfc, 0x0c, 0x00, 0x07, 0xff, 0x01, 0xb1, 0x0c, 0x00, 0x06, 0xff, + 0x01, 0xb5, 0x0d, 0x00, 0x05, 0x11, 0xbf, 0x00, + + /* 61 */ + 0xff, 0x00, 0x57, 0x00, 0x01, 0x02, 0x01, 0x8c, 0x01, 0xff, 0x01, 0xfd, + 0x01, 0x94, 0x0f, 0x00, 0x01, 0x9f, 0x04, 0xff, 0x01, 0xb2, 0x0d, 0x00, + 0x01, 0x0c, 0x05, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0xf8, 0x01, 0x42, 0x01, 0x36, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xe1, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, + 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfa, 0x0b, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xf5, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x20, + 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0, 0x04, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0x90, 0x0a, 0x00, 0x01, 0x0a, 0x01, 0xcc, 0x01, 0x80, + 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xe0, 0x11, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xf1, 0x0d, 0x00, 0x01, 0x69, 0x03, 0x99, 0x01, 0x9b, + 0x01, 0xff, 0x01, 0xf4, 0x0d, 0x00, 0x01, 0xaf, 0x05, 0xff, 0x01, 0xf5, + 0x0d, 0x00, 0x01, 0xaf, 0x05, 0xff, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x58, + 0x03, 0x88, 0x01, 0x8a, 0x01, 0xff, 0x01, 0xf5, 0x11, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf4, 0x0a, 0x00, 0x01, 0x05, 0x01, 0x55, 0x01, 0x10, + 0x04, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0x80, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0, + 0x0a, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xa0, 0x0a, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf5, + 0x04, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x42, + 0x01, 0x37, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf2, 0x0c, 0x00, 0x01, 0x0b, + 0x06, 0xff, 0x01, 0x40, 0x0d, 0x00, 0x01, 0x8f, 0x04, 0xff, 0x01, 0xc2, + 0x0e, 0x00, 0x01, 0x01, 0x01, 0x8c, 0x01, 0xef, 0x01, 0xed, 0x01, 0x94, + 0xc1, 0x00, + + /* 62 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x56, 0x01, 0x63, 0x04, 0x00, 0x01, 0x05, + 0x01, 0xae, 0x01, 0xff, 0x01, 0xed, 0x01, 0x83, 0x09, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x03, 0x00, 0x01, 0x03, 0x01, 0xdf, 0x04, 0xff, 0x01, 0xa1, + 0x08, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x6f, 0x05, 0xff, + 0x01, 0xfe, 0x01, 0x20, 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0x04, 0x02, 0xff, 0x01, 0xd6, 0x01, 0x32, 0x01, 0x48, 0x02, 0xff, + 0x01, 0xe0, 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf9, + 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x7f, 0x01, 0xff, + 0x01, 0xb0, 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, 0x01, 0x10, + 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x20, 0x04, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x70, 0x06, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, + 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb0, 0x06, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xe0, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfd, + 0x01, 0x99, 0x01, 0x9c, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0xef, 0x04, 0xff, 0x01, 0xf2, + 0x05, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf2, 0x06, 0x00, 0x01, 0xef, + 0x04, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf3, + 0x06, 0x00, 0x01, 0xef, 0x01, 0xfc, 0x01, 0x88, 0x01, 0x8c, 0x01, 0xff, + 0x01, 0xf2, 0x05, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf2, 0x06, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf3, + 0x05, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf0, 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xb0, 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x7f, 0x01, 0xff, + 0x01, 0x70, 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xff, + 0x01, 0x10, 0x06, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf9, + 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x04, 0x02, 0xff, + 0x01, 0xd7, 0x01, 0x32, 0x01, 0x49, 0x02, 0xff, 0x01, 0xd0, 0x07, 0x00, + 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x6f, 0x05, 0xff, 0x01, 0xfd, + 0x01, 0x20, 0x07, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x03, + 0x01, 0xdf, 0x04, 0xff, 0x01, 0xa1, 0x08, 0x00, 0x01, 0x11, 0x01, 0x10, + 0x04, 0x00, 0x01, 0x05, 0x01, 0xad, 0x01, 0xff, 0x01, 0xec, 0x01, 0x82, + 0xbc, 0x00, + + /* 63 */ + 0xff, 0x00, 0x58, 0x00, 0x01, 0x14, 0x05, 0x66, 0x01, 0x60, 0x0c, 0x00, + 0x01, 0x2b, 0x06, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x02, 0x01, 0xef, + 0x06, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0xeb, + 0x02, 0xaa, 0x01, 0xac, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, + 0x0b, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, + 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, + 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf8, + 0x01, 0x20, 0x02, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, + 0x01, 0x08, 0x07, 0xff, 0x01, 0xf2, 0x0c, 0x00, 0x01, 0x8f, 0x06, 0xff, + 0x01, 0xf2, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x9d, 0x05, 0xff, 0x01, 0xf2, + 0x0d, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x62, 0x01, 0x27, + 0x01, 0xff, 0x01, 0xf2, 0x0d, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf7, + 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0d, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, + 0x0c, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf9, 0x02, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf2, 0x0c, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0b, 0x00, 0x01, 0x09, + 0x01, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, + 0x0b, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, + 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0xc0, 0x04, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf2, + 0x0a, 0x00, 0x02, 0x11, 0x06, 0x00, 0x01, 0x11, 0x01, 0x10, 0xbe, 0x00, + + /* 64 */ + 0x2c, 0x00, 0x01, 0xbd, 0x01, 0xdd, 0x01, 0x60, 0x01, 0x05, 0x01, 0xdd, + 0x01, 0xdc, 0x0e, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x70, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xfe, 0x0e, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x70, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x0e, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x70, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x0e, 0x00, 0x01, 0x67, + 0x01, 0x77, 0x01, 0x30, 0x01, 0x02, 0x01, 0x77, 0x01, 0x76, 0x33, 0x00, + 0x01, 0x1c, 0x0a, 0xcc, 0x09, 0x00, 0x01, 0x1f, 0x0a, 0xff, 0x09, 0x00, + 0x01, 0x1f, 0x0a, 0xff, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe8, + 0x08, 0x88, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xfe, 0x07, 0xee, + 0x01, 0xe4, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf5, 0x09, 0x00, + 0x01, 0x1f, 0x09, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xe7, 0x07, 0x77, 0x01, 0x72, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x11, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xd4, 0x08, 0x44, 0x01, 0x30, 0x08, 0x00, 0x01, 0x1f, 0x0a, 0xff, + 0x01, 0xb0, 0x08, 0x00, 0x01, 0x1f, 0x0a, 0xff, 0x01, 0xb0, 0x08, 0x00, + 0x01, 0x1f, 0x0a, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x01, 0x0a, 0x11, + 0xbc, 0x00, + + /* 65 */ + 0xb6, 0x00, 0x01, 0x01, 0x02, 0x55, 0x01, 0x00, 0x01, 0x04, 0x01, 0x55, + 0x01, 0x52, 0x0d, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x00, 0x01, 0x0d, + 0x01, 0xff, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x00, + 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x05, 0x02, 0xff, + 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x04, + 0x02, 0xee, 0x01, 0x00, 0x01, 0x0c, 0x01, 0xee, 0x01, 0xe6, 0x4a, 0x00, + 0x01, 0x17, 0x01, 0xbe, 0x01, 0xff, 0x01, 0xdb, 0x01, 0x60, 0x0e, 0x00, + 0x01, 0x07, 0x04, 0xff, 0x01, 0xfe, 0x01, 0x50, 0x0d, 0x00, 0x01, 0xbf, + 0x05, 0xff, 0x01, 0xf7, 0x0c, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0x94, + 0x01, 0x23, 0x01, 0x6c, 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0xd2, 0x03, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xd0, + 0x0b, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x10, 0x03, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf6, + 0x05, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x0a, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf0, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x0a, 0x00, 0x01, 0x0d, + 0x01, 0xff, 0x01, 0xb0, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0x30, + 0x09, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xb5, 0x05, 0x55, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0x50, 0x09, 0x00, 0x01, 0x1f, 0x09, 0xff, 0x01, 0x70, + 0x09, 0x00, 0x01, 0x2f, 0x09, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x1f, + 0x01, 0xff, 0x01, 0xb7, 0x07, 0x77, 0x01, 0x40, 0x09, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0x80, 0x11, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xb0, + 0x11, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0x37, + 0x01, 0x77, 0x0a, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf5, 0x05, 0x00, + 0x01, 0xdf, 0x01, 0xfd, 0x0b, 0x00, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, + 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x8f, + 0x01, 0xff, 0x01, 0xc1, 0x03, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf1, + 0x0b, 0x00, 0x01, 0x0c, 0x02, 0xff, 0x01, 0x94, 0x01, 0x23, 0x01, 0x6b, + 0x02, 0xff, 0x01, 0x60, 0x0b, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x05, 0xff, + 0x01, 0xf8, 0x0d, 0x00, 0x01, 0x19, 0x04, 0xff, 0x01, 0xfe, 0x01, 0x50, + 0x0e, 0x00, 0x01, 0x27, 0x01, 0xce, 0x01, 0xff, 0x01, 0xda, 0x01, 0x50, + 0xc0, 0x00, + + /* 48 */ + 0xff, 0x00, 0x56, 0x00, 0x01, 0x67, 0x01, 0x72, 0x01, 0x00, 0x01, 0x29, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc7, 0x01, 0x10, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf4, 0x01, 0x08, 0x04, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf4, 0x01, 0xaf, 0x05, 0xff, 0x01, 0x80, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xfc, 0x01, 0xff, 0x01, 0xf9, 0x01, 0x42, 0x01, 0x37, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0xf6, 0x0b, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, + 0x01, 0x30, 0x02, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, + 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf3, 0x04, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x90, + 0x04, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf2, + 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x05, 0x01, 0xff, + 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00, + 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00, + 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfa, 0x06, 0x00, + 0x01, 0xff, 0x01, 0xf9, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfb, 0x05, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xfe, + 0x05, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xef, + 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, + 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xa0, 0x04, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf4, + 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70, 0x0a, 0x00, 0x01, 0xef, + 0x02, 0xff, 0x01, 0x40, 0x02, 0x00, 0x01, 0x1b, 0x01, 0xff, 0x01, 0xfe, + 0x01, 0x10, 0x0a, 0x00, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x64, + 0x01, 0x58, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf5, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0xaf, 0x05, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x08, 0x04, 0xff, 0x01, 0xe4, 0x0c, 0x00, 0x01, 0xef, + 0x01, 0xf9, 0x01, 0x00, 0x01, 0x28, 0x01, 0xce, 0x01, 0xed, 0x01, 0xa5, + 0x0d, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, + 0x12, 0x00, 0x01, 0xef, 0x01, 0xf9, 0x12, 0x00, 0x01, 0xde, 0x01, 0xe8, + 0x25, 0x00, +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp index e288d27030..d04fe7d5b6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp @@ -25,12 +25,14 @@ namespace FTDI { - void write_rle_data(uint16_t addr, const uint8_t *data, size_t n) { + uint32_t write_rle_data(uint32_t addr, const uint8_t *data, size_t n) { for (; n >= 2; n -= 2) { uint8_t count = pgm_read_byte(data++); uint8_t value = pgm_read_byte(data++); - while (count--) CLCD::mem_write_8(addr++, value); + CLCD::mem_write_fill(addr, value, count); + addr += count; } + return addr; } void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h index 185b53e6ff..2b0a533084 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h @@ -24,7 +24,7 @@ class CommandProcessor; namespace FTDI { - void write_rle_data(uint16_t addr, const uint8_t *data, size_t n); + uint32_t write_rle_data(uint32_t addr, const uint8_t *data, size_t n); void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle); void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.png b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.png new file mode 100644 index 0000000000000000000000000000000000000000..bc46ebe6aa07459a05230f7002a6d31269475b96 GIT binary patch literal 34122 zcma%j1z1(v_U}gNMp7CCR7wc}k&tc$q(xHc4navbf*=hN(jiJpcS}p7gfvKrw15bL zZ>)3Qz3<-p{^xz~eBU_-5%ykttvSc|)tDjbcNB>5Y4K4g6p@mmtS0>b3JOJ-g^LYe z?Yl3(ga6?zZhMPxewu+7v1Fa-0nGAxOtemJVJSRc<@>~*t(jVIz8fb zbg@j{5~D?-m{CfyQd*uV8>t?86ywK7b3FUAWKpb~!3-N3VKWo9f_(8-g0!xm1mnHP z!&JlQ>h*HV6~T+FtP^~DT|6du9Et?wZvyc~_L?twt`0Cn^)55V_5?3~&bwE&PtIH8 zbMpB5VRpHB7qL>HXU1)VD!UL=%l&ib&Xv4>f5(cZfQ-#^Z%HZJrS8#OlaCNN#jB2~ zYRAhXGC_oVC$(?%j)~?7Y1Tc0Ydn zt5+GZvE-M@7#SmI!?DT83JMB_KYfZlQO#60F)~V9LR*xJ+`M_w#@4oWf2k){iq~7mWL`sX8fVm4l~NXE7a1&URQ?)1e_0J6i?Etc3r(Qsmjjx zh>@JUEtOJ1L4li-lfQ0eq3uP801X2}xIvLlnShnn&i=Pg?NVJ~7tQ(o4T?J9Q=6T{ zUcRf$VI>$!7j~ErNPe5j{nP-usW}Ba-!#aPl$qu=r~R<(o6a_e94L% zTCQD9i(MkTfaZ+De_&|HM)oTIxy(anP0b5hy1K5`mX?-I&dy{hbdikW=;Pz3s3S)_ z%a59!jrnH zEHdrmbaJ?vF=|sQaLZv@q@au%mEm)8I8^6u%gdvLr(ih=UoB2C-E@)tEbRN|^d~#d z0*ZCrioRNX@_V#Y+>cTPdInZ94tSmU<#z2vfkkq&=u@&VJ@6kTy$${>-MM>UFyL$NpZlAe}UdqLsb2ZviTT&Wq2WX;D$PD<%CeN*Nm)(@6S?9bj0Mo^V_I^Hrw5S7&9h;t~=rNvLzi%`YsNKDNAj z_wLUA{_~QO>%ozcFBrw2w)kV5Z)t6n5|x=r?)&gTS}DH;jYjV@{+un>li{T3!E#qI zG^Dq%u+St(>RasYR@7_oEbXAreg8hFp+QXK>Hd`zaj*EJLb*^Xr{jI=or8l)*1JU4 z-LY?ZY}p-Di+dkkA08k;?Hr67zY`6J!DnS?RIu?k&aVlH&EZ3Qr(_yG==Lh ztgEV`ieMDy6irjx3OGIad3i*)*ocy$mjg{kMkZUAo2%%?os7G#`~95%+EYms9o}rc zN2DSS4o+yqBl6bsIK-sij*dKsOWCNWoBbr;ym{kf?dRvWHd>Id<{5*}!Oq_5Iw-DC zn0&*QN<>ujWrX$KJ6>*XLgXohV&oSTum}rNM=;#Nu6CT`kO&P9_UF=l?_XbEZzYvX zNd;wTXR^{Z%TLN}Le^=b#56HARgLFG?)aW!ruyx2i+2pr#mC-EQe`_Hp(yEn6vYXpE@=Clwb7q*6SsE;Qg2Pq5fc+P2%n9y z=FN{5=q^mxx*9%R8_Lvj)Wx`6H>LXcvCyz{FMOIhOOmYUfp?-%A{Vx1>N%SAe0;U`uA*$siqg{38PEvo z{58|1X827%U~+SDWlIEb5D@V3@s(Kg(@Gham6VWb-n$p_N5((s{j07>CLFj2-v%=h z=N3e=imPzOuw_qB}Y|m=k*09~^E@De!cQ3!a`nS71&b<=p2;`WBPsAJf_ci)gE&BI2m}q3y$Yh|R z>hvL{pxD=YPH6h~7xUW@m)EdHz09<`DAo1E?<=9i9n~@FWOFF{JD=~}#hZM*Ia%rS zZG@fg1qLb_9TF09-Mo`fYHDk$I#O9(i;9kz#aaauk5*!8Dm6nsn`I>Y7r%5=h6C>% zhR2toj)zptJSttdsKqJw;CB|OJ9b`u;QeR00$098EmFZBH}8}*G^8lrzx9ZV2#rak zkeu-i-;`4eBAhHVozceJ+`L5SnzjV=hD;F?V>9?`}QuqDu;xm z94-0hw*Un-wd=RwVBFbYv8v8D83si`urOZf2|w9;7}ZPnQ)*~wIG*P|wzajj;beb5 z(aJ#T)D_L+D;WMXy7C31AE4BjE`N+`58}CB^?bYOWMKU~4Y5pGa%k{>Q{PTeON)YAzw9}uNWZF|Xy4&bnvgy1fAu7e z?Eu>Fpr@)n&<>}FCV4x`Y{z-me}=#XJ-%kO=T`!Kq{L>FGk=~z)GcF@sU<8UA%R-# zN1wodEzXI?j2=37UtbCD-@9F(ajeD)FN&RPlrNs2C=)!760sV}__H}eI4pCEjZJp% z{L#tDz0JY=4_5!#V*j3ePNoW8zp1HJO{ zVQ5&`bLgjMopoLH@V$-cT7lhe8bFAFfq@oG1V6Xu?rvOqsJVRg-doa>nwpyVTG!Pu z2ZG}e91=zoMMd0FSHKMYcVg^{=3i2Bc?y_s&Nfah9h%fE4od!!y?psHYj>7hC>z=D zAA^#^!^6=NXQ>{ud?$gP=-}Y{Rdx$Ly-Q0EIa{IY8f_6WicKt1jLBn>k*yA-s$jZ$ zcytx$7QehuSWwVr)cBNas-v?LKk4G=8xttIhu=QEz@;T858#aZXw#}|^dxYi6VQp{ zY=gDNKp``$nX@yWknLC)u7t~y;%A#mG!~TTJKnqry+ujSXOSOx`c$;8ww4U%*Z!xw zSa@&Wy~_raz58o5-H%uAP87453=YO?)lLRksI094IDY}?oq;nbtR`_OCQ`EP9j zP!wOTOiHGaqiG62#Cb=j$Y9rj>G;QE(VI6H(*4e^Di7GeJJfq@XEirB&+E3(2|G~m zT!vrSEgzI1XB#ijy~cS{0}W6@4&JZT(&=D*H2m_>eCzqJ;NbaF&b4=qjg27{(wQyB zey5{{=;h_*hF_)0&=a}z8h-Efiny<9nWct?62P7xd5i|A4y%iK5kZoPuU}j5OTg}b zaUPqHdFgR0;g8k;bGz7?CAaP z<0Q7WwrbcV^6CYni@@z7R zqNAgczyI(?DYoVgv9`8$iPM6#UbCFt*b-u-ncm}S9`=b>4t64Or3ihJRx&HG(&){)*d%LJ%~|_ zAr%8meC?LGxjBM<^fWa;OzFcdhHBx|8FsPZG|lhqi8a>u@86%q3BnJw0d|mjM$91E zUf`yxq!fK;=jWW?W%SRDFXT69!?j!Cfw!HYWAK{Jj=#$~xjLq(YG`ZAHR#%nyuqtv z_Q-B>|4!xc-5HqIjjLzusrCzYHgfK3*H*Rrfs-VQzGp+{-4WxMx;oK~nR;QCM4(ZW_kx0fo+)>Cccc7+G-7oN^;nLLIWAo~ zZ&2;fuSS-oekCI-OZxZ2^TEN{3XvS|rEPnk1ywlAB#DG}=GQ!D#X)5SYZ)7p=)N~3 z^TEbIiHVDc2=-t9<$^l9y#cZXHG_JQPFtnzc#WHh3A3k{S7-!IFp>RfN@{8?x3jCO zz@(8jZqTL`hguSws2AD6dxWn3VB{+{tTodvsi+W~&0c#gVEKlOo142G03&Nnax&dO zx+K%~OueO$qJsnP8Snx&7Yvls-cpa2OE9*iJ1jgj+?73xPbietY{Sh8$2mrzF)h8l z1e~0l88tODyv9w0a6eZ2#XdvH5%K*kQd3v=^3R`7rzGpHr^oJLAt9y5l`qcrpecpg z5Ze%DH?zUhJOVan?&elua`m-p5R~YICDR8?p*gQZsjq$5ZvI1j@#4j(*RSzl2Yt4= zaddR#55x#T+V}2?V*v`PP~*@sy|MLQ5Ce3ge{5JMw49urY@~IPbv68YG0q{>k#Cqe zOHjg|fi|FcLB*vN%JYX8Oukq2#gwor4R{*%M^x1B-Mgf(s)QwMH-Wl*CnbvijT@ST zQOv(16o42IUL}sXSk;|TU1O{`<&K>3LVfecjG~!}tckB)VIqJnA?>>9xiI>hnlFd; z(d_K(JCnA>&elM!*IAw(WKyLFJ2LY9nWi@OX8ATacMdxukwGTz<|Z#0kf*gb!&s2$A* zkkq(^Qt`~sc+ABaDl@gBgK=F~`WBQq`Ck)`72UV|arF}xfdc@$#NMNv1S7QX>G2m? zWhN=~lP6DPmDoi@Xe53uktZvCyQH`ir)%`Atc;(x@$sg?&hBpM>sJy~Sh2COAu%6I zOxsNQ68VJUM!E`N`=EtqJp)ugjrnkV@ZFv_CsMyvc+Q*L#nrWT-!k0?J2Nv=D1mio zG~{B0!pvJWx~y6kD3NN1BSL}Fne&HC0v2Jpb)vE1z57!9@&Bv_)szp@)tq&W)2QrWh>xyS^XcJK_<|WlIohR`eyrHov6*sG zz;fU@Adyhw0nUm|jQ@Oe{}jODFDnd{NY|?*@akZF?CE(1mru&aaVN#f?MSKM`hi8J z>*@eH{j9vay!6SBmG-ki@t^buJ2Ao7G6f-I4IbN!j^6KKOR0>B1u9?X;tCahxv6rk zk(^qnaPz;sH;uf37IvInQX3QTIb10o0wEv>TM$=H2IC0-8Y z9a!xRD;hsm2diJFXrrOFO}tSeH%rDMpqkLSQ!)=V-7|KM$FOE-#RZKCTHzCN&gP%9 zUg4~k8ap2X3B+niB#ttMm-_I9tVf;;3zt^9mP~1>`$hLWlz;cgo)D9=8k$9>-=8yS zp*VUeL_Iw|+*Hw06Qq4xRs)yWps5Tk!>Gx-R-=4kL)-h$nNQk7guSkOAY%`nP^a-p zi9!1+mBFompN^E%+;Q9meS}(wO1y4#2l|dk!(N28}?%1-#iNpJYW3C=A07!&=D&y}L6n+UVkYqWymF;zZw3 zRJ0PjXika-IvACd^f4y@jm`iZ8_t_U!h$qRav9BVhFdx@&*H4+BYZ(CJpwWnLITxn zbWJ*_n*bl*WU)PD2fpdr2A&Sc{=pPS4CN zoNPD02o4VJT4)R4>g`>2p%HOnF4QYU=eIS2(lz`k`OsPFt!5sw3`yzexV|}QX|~!- z|CiAGuV=M@85$beIzFCIU1(SvbIc4(h?JhbFSOD7mrL)hWSh5z_d$-#OS*W8)nTS? z)M^80or0&pqkAcmevDAp+S4Uav#!-QaF3Z(m6b2}_(NY2@jfb9J5|G9k9<|__0wS( z=Ll31ko6*{?_J@*I(WfX<9jOl=H0u{p-bh}w&U-0wjDLEOGq$+8Pt>0kyOP`XL|E0SkNmvoC(zJ5Iq;(y#7(u~Y({|G>-1$5umEVqw# zzshMVCs6{O2?UkN+1j?OHa9oeGnJde3j=f7V!!+*0M_xeRthC0B|{&T+qY3{92}E( z)IGeq2M1q(R7ZecnBGXvp-Os6JCJ1p;)ZiCSxi5)&>i5t7tm&8`zl#}{!G3{&veu6 zy20qFiDv~;h)&iHp@K@!I_{8JQ9%L7{h@}spK($?p_CU?0L-U{8$CJwkA47dTIhQ% zV3-8gQ+TCh-MAkfErFJf4(*HsNH)_%;+&i>pPF55MT1@Qbv>Mmi)%sh&#y=&DF(Qx z48}Cwk_^CAeC>uvG(>%q<5Jf9Ua|>fX5!Vwq|wZ>eYoY za9(;gB=7^#B0!zd9eLmfc9C*grfBioT@qlK405+R#~DCivn1?0ux-6{n}C zwIqbApQ?}w%bEr_ELWsZI{Clw&A%#YLA}lL%8E3QW*~0TKmq_)Nr4QAiHUhzRh94{ z`y2@iL!#qcQ#jo6MKu}wn(k$njiJo*0Q~8H?CrH5CUAg!sjlu1Oj9OM+Ek}+0*GE1 z+>$mR_EWfNH(jxzko76o)YoUjjs0Se@Og3Z2L`R6y?Q^Zme^tl`Q{qp6D4h{k>99_y`7n|DK7kRbGC372tot0PE!=fYRj8j64^xY;MZR z7U_h7+{9+)2(|2~R2v@cpX2Y>lrYK2s_ni=w=+t3*SMoW;$=BkVLzqA4?Z7&CO6Or z7rmZ5$uuaUswk#M1!rQTZo7Fn-V?cXi##<~o0HP8#z|_Z$ptm9c2V(@=@*KbdXLK^ zaEas<>GTqK0LU=#q7?Vl`VOKe`Wz9GEPyYnS}3**PYzmJ7Quk z^enwMYE%eC{?GqTpozu5`3KZSws=>>0 zPpBGhE-s6U@MKMNbmHevL(bX4&ByKGGw)RI866)thmRkU2tG_DCpHU0?ZM=bZSgz( zZk)9Q{*W`Yy@p?5Kx8i)foj(;JhvnsroJz6a8rti34V7Yg$8bC*cf9+rj(5K;3Q`a^AR1K!DU z>lU3BCndPbi0Nw4pCt8ym?7hCx1j87Gf-^+-0m{>G6GogugYT%vpvzoV_~JSYhn@Jxq_ zjU{Pr*iZ<&XR@tTA7VxKM;{~%4XHyv5_bP?%n(Dc9uK!dg|%CJ6jUWCfU+JImo8m0 z-CgXk81$8s!veFGiI_>kuHw=hkXKWXFLajPk*TJ(!o#|Mpyu~$nVJw6cm9!wyZepN zi?22~8TrgG>BT&wYHkA)K|vHC`z6;mdkzVSw1gaJSD7!b{_+_ru@5ut(y@&;94cw1 zx4$gigGF>=hyOZufIfzRR!A;$6Q4T|A+_+JNxxfpd8u$9T_IaOe9=N03+3eGYaQUQqBakD~POpGx!isk>+4ua^fUAy)IoB*UHh&|oM1(~cB zit6v*znLM)0gvpBaK-+)(z3D(uqQ)7kSr4^^XQG|asIWp3~hk<3xR4m`hK-T2S`i> zb5&2DJXv_FmTY%f@7}!tDCrOmff#{v&F-%st18#@jEy6a8^*xR&wpXgYg@blz{Bog zQ$qv&Jxxu-@>hV%nf2w;DU8x_g6G|ivE*`-SFhyu(3OX^wY3wlbjzsC!r zzkU05C84)=9z+b#q#U(d5SL}P@fOQX@XV|+Ve2Sk`kri7%V9MFX5@@h=8b^}OXX0k!6+R~Vgegd&rqub~$GMb<2xf+%DjF9< zZWk1i%`(eT&Uwns-x+ltwe72`qjRVSHYAQ!qO)N-$XXKr_$BcF6bi*$SHjp@->JSn z$NxI)zL4XroeybykV}d$AD5UIJy_NU#YmgqC2-%GzFA=IlykAIwG1>bMfQZaIJq$U zA}~gY8hhg`Iw9(m@+FQ-_hsJ%Hl%D&2kXIUzQ@)O$SIYG8mIuA>f_@RQeFdYoQ7p_ zT^()PhY!JebV7Edl%ZENt{FF_;I6N(zM#HlR3W+sDD*CCM0K^W1VjXkc3_`O6zU7G z)`0(_9edk;w&8WnJPHNy++4#&3@ipHM0*ysF}=$oppKQ3OFgo%SPZ?^)a|tq78&`@ zCf}~2>IXp7>lS@9+2*a44l}f(k2i1u(P2Qgu<|VdxuKz^zFb$T4}1}!Y*~XT#O2!-aNl=(uQj)W3EOH0B1t=Jbwr&8U%iE; z3qV{7fEy@0gupk^z>}q*7F~%`h6qa_?8~*09D@DzQ36n@uw821iW&67Z~a}4cTiwZnC{S8TP};VT@qZA){sk0I zsJ(yAcp%*F{_oRMxu2KwKu8BGjcoU=>T7As#Ds({+X?YUA1O3$!~zRrUj*??%1VA`l3Z2x zfZ7tc^*`L22e=i!Rj5-?3bd#F5Mntossp(u`uZ0^<{-sMz3KXPI28%l*{!av1%nV& zMJX!_GT!Tsa)=W=IbA`*KuXK1`1x9#MkJ*m8@`^f0I9cqbzop1F*f#-2)MC8`B=8O z*URo^51Sxv*5KUJ?>s%refTCJ-I%pB|E8RWTJp zObe>0*$f(sfcD*c+3xB@kg=T)(E$PMuPblkQenBexD0i41d8|ANz%0-^+9@Kka5w)ko64xfL`Bs*;9LnnMIZ!t zL^l(z*2Y=!cf!Q4IV$?=CMb<3_I5Fk3<_y0W}<+dm^s`HmzUvr7(8QHI%-)0;W5Bk zNYk^iu?Ze@adAN+cnu8=Y+fE#ho$!*R8eZ)H4hFZ5>!KE2R`A#n}!b_u!xG%in_03 zf)@N7AZsvP>X(U6-fC(@zTlEJWS&{UdZkVgbHsQPfw9;Ivi~5MW8LESy||xn{|&jmF>KMS}nQ)VF6>K zrOD@nRy-LXNaGH78od0q+s(eGeGw0=mDG**3yPaqgT%2=gaicTB6XLTg;do|Cmh~F zgOndkqLE@q_dUM4&1UzdtfOo`Qu0i3gDtk_y14kvMuZtAltd0THqsM9CW+|{2^W+< z6z&Uu5+2mKmG+c;g|-Y}N3KvntcnHb%>!%1&eYp%-rx8VtGK$ln#@onM+_uC>G77k zD-E5-=V{c8i+|9);>ZQ398ELss)gNy=<|YohlP;~SAP7TZ#1xtU%qie+pOphG$!dc zfGhjry_Zm^-QC^xk8o>`z~N;}_+%vrb_BLr>Ov_|^m!B^tsrhnN=h(^(bI42Jvfej zkn%)ee0v>ue6Qz}JY>ATw~XYdEWk6H7AnvwItSbx@j1Z`lU7!K*>m9t{PTtS?Ir=QP?j=1 zQ0rdsF*CPVVCjH;=Gb^Zl|O0|Y8lyW=JPT%bhoH_RvKc9J?#|uSj3ECG=F~oxGQBQ zUp^59hNXzpJnGHcw;uq1EkKb}*V4iSKD1Jfh4S|C$%L(or0Lcmni9rviz-Rb+RRy! zQO75>`6?Gz8xTCB;cxKJTi`3D?{RXC`a}K3Sz0mm;OQvOUijv>-H(=lyjlCja=Ad^ zf}ywnvgH2NNB$BlI?k{FdlZ|A0^-(`1c2y#f zYZ3G-n*#hxv(jjlaT@GVCCvEVWgRuMpzdwyEyPsbk}b*5Dd>RU2suu0NC?^V4;BG| z*l|hy?(a9i+9L8%Agosf)YxK13OfKvS{%}W&Iy5JYiKbLRT=1A2e8p*7X?p?^aQd# z=78raQ#1g2fb4Jq2PD87`drrBwg4B|qXn))Q12xuv+TrmpheFLl3gvA_7Aak&9f3!F}orj2{n#BS1l@L*j9L*5O3B_xH9{A`Hd-1al5Y#oG3xLlR za=_%h^K8k53a)7|<)(~VgC=Jj0(hj~Ly1Qlzf|E34z2;CEB0C!lnI`Q4inc_$Zi?s zggcaeUdhmas(&|Cv?KQWY-2so4CyewR9kZO)>v#zjG2n0DLUx9#M(80xVf5njOoC$ zsQ{akS@xHtpFlj6DH6%lNcbF+@)tKA(ylBm?O^jLDJ$D}w?;}F2PdS~jVS^~sn*An zkD7C$``g+uw+BdF0F`4<7JkW#ROXx zo(~{ROX054{bwxuzsU1Hza84MRS&@f1mq1rJHW9$XXQzjK?mEM8MWl{Y*k)&Q(sTd zs>~<;bLb5se|SaM1VYK*rLu=_L$0VxBZZoAE2n! zR@6!*5}NjF{#SghH-Ng-Ri&VKW zv>F@TaY*=YloC`XVd4^T795ln-2Bo#2xdisfdWMzQll~eNU9O@HY@p)Quu|8g@f%W z$7Ujc;W++5BOm~YorehSP?j74LLg|?fVNlheQvbTE*KSg*iG6qyR^Ezth9HW=&A4k z!cp*h3XpHBClfqA<`EXAhIhb8xMmy#ar5hCc#(*Mq@;wGFaRZUe%{2E|C30Jx7rd( z8qerOZ+?f*|L3|(y`*~bKM=lPqMqhxJy*yX_BXmHn1|5jU&sc!fezKT1sNM@JI6c) z4}gKCK0ti2@Ggi~9B{qi=|8mmzUhvH7mNS1#QoouuUxzWAdsa?*T;{_tPgZ_EFOEU zZ`Fr?k)ba_A=Ie@evv*HxNTNqe0hA8>dGf&=W})rM~$E`J^bJQQjk zYHQu$4`;CJuElbw9W&()#rHg%Us)Nm!g-&UhY>Ds?tJUc5a2}^19*7vst-)BU;quO ztVx}*J0A#!pc_JlWU8vDXH&17;$Jfg|JV$BO9-SV7tcL8`2JI* zQKV*(iuFQVAE-T%a@|q?@hM=0frDupK&J_q+8iGHdwb`Qk%YZHG{`Bpp+JE3CiPS% zZ?;7A)~&BFo8Saih~EACw#&iIZ%cc)<^h73LQiEw1Md3Y(+vZK5QS;)>`W3rf$j`` zKOsQw29``pd@Q!hm)q8cvx^3GeEy*)5uC+?@PK$wS&&A&Hg(OYLD3zXo$Pb;>(?QW z%)7LRL@Rxv7DEk+bg4}Vj!RADfhmO(6F_XH0Dar*V7&%MSjN&Fz_?I|n}x;OH9a9R zz+0C_j_q}eIylfl2Rslb%Q6Qu83aYy$(=BRfF&eXSOWCg>_NJOk8D@07Acu2Bm@j^ zaNTaxo`C|HpAj>S!zAYEk4P$~yxU+%?2D6<4L@`)fS{9*!?e|I7$vCu1_rdhLC1!; zi;TAfxYnL4uPxit#a%6<9zR(Kq%LV{N?YGxnarr6yl??M=lz4IGLbk-`o3ScQzlG3 zNQ3@{i$w>;MLW8eGYSLl#@1GO=*W_^w{?3m^gPY?Kd51A<}(Kp0cQ@uR(`2M?lxJlMJU`RL!jy#Zj?dmsoq z>eZ`l z<~)-Mz}CQ^gWDV6B%xP;H{gr=E?6pFMAg7-UY)3Rq~iRnqq% z*x6P3nJeY*gN(455ar=Mz0ouc@X##3MlMv2d^Xv^Vcz@q1K6V88* z07HgB*G?^_x?N zGY)tnE>xsIBsqVy0c89cB-CHeG;25t0QD6T18CeXs^ZQU?#qOPtfH&5zRawlp*4|` zk+nkDF|=Pu!H2t)T-cOJ%AjN=8l0nI(0A3QNKu%C=S$?i-B^`GB~M16Y={ zqH&%ZQs-pa3!A_WL0&~ZH0;c0Fv?VLX!-ZE6}Y^6lAb##Fn_TDc&O{>U^_TCAPf_- zo}`qNa{DaN6s~u*Ag^-NN#|%{WtIEoogl>7QpBF{GXe%%lgTm(!`IQ({R+8ajZAgD zQ^hafhc>t@zud%R5`X#}KCcD)l1r`r6F_^@rRFd8(cpT4wEf{0;)Wv@A^_GvsB6K& zxx-d4M?r#28>LA2h{8X6`E(#yau*@D*3$(s6d}kO`pf~mNC>BJ9J)I>wIGv;mq0}x ztf!&kHMG($febOdume3=HmEmR0iT`GkN}pQ2c7ETCbvmQem$V)| zTfqZ*(xukcolY_QZR0J{C3;C0!3u|j=iquvr{~W6v(Xbln;%Dk(x9Y5JHsI2dtc zA+YYCbmva|l0}iRsOA+4J#B6FEqR8E7xCbcPrIytzPeuSu{n8Tv1$YYcN&+bKVqOD zG;+7_%|$GuF3?u>?Lbiq?{uS>NacI1kTm>CD+~7)LG}DOUV%o zB;5!N9tEpyxKyMSWP*^NV$Lgl7YojBO_T=w++pJ&z6()sGq68G<^jD|au&dCx1IgE z2J;Hn3?fLuZd6f`fo%37ND0n>Z8VVG=t(H1N=dhw^PY;ezSaSA;Ig9Ju? zuhq%>K(#=Ce7?ZDwujMwpx7QkU^6p0IoYK2`E$(Q3on@1$Ud2tO4oz99YKHd97rer zy$RRa+Fp=IUISQ^YY#bZ~2>i3=~@-nuLmHKoo8R`=S6V z3&tkEJV3&&f{wHFz!(E@M&eGvyABpMglt0P@vjA_0V0mGVqu}70w)_6C@7v^YdT_0 z6LJ1vrmBSf4Q7_RK+J@yQgMt|0yaGi3Y*?)h2;W5P>nvG%8j4Ayu39q`}++GTtoZ) z(h3MILZ-r|0df_(7)BZz&!ARyfv`OfSSk3U{Lu-+05}_O$ou;HJ0R3OTc3hVH7rug z$cjO_x3j%{$4C!WgVH4tkeSU+Ktn*}5zL-%SHQG~`^I_)hG9c~-p;}V=&Wq_eR(+$ zXrNBdH_xLT7Qkq)f`4{U8xP?fu8)RJAk$k}OK!hm-^eyV5(9MaMa=TDvS7a*5Z!rc zh*EEPa6}X*e;is*uY>6oGtT+Ed+(G-xNRWsC3`$>?1zOSYwidV$Ag}yl6hbZ**k?d zwfUsB0z`E>?!84nI<2)vtNULF4lb7zgMnrbbkN()!bm{(*oEXU1>Byy3->FF_B)LXToh34S~qB*va+&ze$g}$ zJUpXUBw*yLU2(qds~!*X3|LPg#jBBjqvTO96>Gm5m)-h1c;*9ZgBoB*Xy}85vkQwz zOVSyH!?oq*jt)W+lGRB%10QT?UJFcrj&Krm3P!JcY#BPg+jN9WQkW)#|NfkdPAn1+ z2o44=u=eenlHDJ_KR^Al24-P(1n)h9QJP^<^mqgMpIHFeSIn%7(376rb%g}C1SnEc zW>D>6xrGA?o|*$7h8SUXmkmhCoDVm?i1ol?5p!FMQql;Q4}iTje}f~Tcll_udTy`k z9Vb_jQ6ud`{)>h8t0V3w#K&X9bS~m{u0dY<`Sa(ufndUboDAqRpl0nQeY*+s9dOmA z0FZtM45dgh00@)@udKl6$yz-8#aHOFs-5w&q-1>1W>))N%T(OIQ4P`Zd5Be))YVPe z8TNb+1sndaY1sJ|jPAa^=KvUCQvDow1h{y3&!8GggHUSH9mRr9QZB`}|1TEvuaJ+b z#He+p0X!RKFquh_K25?T@f?C^B~_?ds8S&6gn7!ClW@YKE!VT=^4SYx-{djEBO`G@)eF4|-s1ucc9rro^=Aka6&J5+Uxzh3 zZ0B{(9LD6QI6|Sos$df1;gO9_Kd_P75-Nvd3>N!9|3W0boLM*CJ2;8}wn%&3g$v_bvELvT>1+CJi&rZO=&i zWCHM}Ou=Xg4j`lxQgv!=eT#;W_XMc(izrB$cYrX5M{Fe^RcR0oq>c^U)zP7UI{#4M zuNk?YT9@BGDptdU7na97*xzr5+`a||JN0yv&#mG055vP`AUb;tW8_dhJm~nlS%!b( z>!BU9q_CsFqk!<3Klopso}P-63!hm#XI~iBx?mxio843u56rcZZ5zB&X7B9mT!hZd z$Ic$O-WW=X+X_yO_pjxIC+5tF_vIt#mBf{^nWaDyg=u3_?U~VccbSxqYm+H|LsmUF z0O8N~9UB8-k+#A7i8&}Nvo+4=;a~@UBrEM`7zsVTrwV<1-~>YlFvQ%yWhJuT0=YYI z`yV_|6U0drvQNrLJ+QovIN@rTaVQjIA4xA>?0N77c}F)KL^*=c4Iaur(Lr1J6$%A3 ztKogQ^mXB)Vy)o1udJ*H|Aw?y&f$Wo24c_v`Xd5-^Bh1>E4b0~AYD3rALB{x#h@YM z=H(4~^M*}PN$DAa=KxMW$(|JAtSiWYJb^LTa~E9n8;iJr0f*? zof25|C9>G$KE0}O4)yzF?$3%2MBUn8Td)WT9hSm~gl?Xetm7yEe*Adbu*VNv+8(2i zo3E@uzg+G&G$B|DI{y;)mzdL;>hG3gXXROB8md z{*TI<78-7H032Z=1*1it<{y-TCSn}G4%Xlr%Gc)VQ64_lJ3aRU-py%eUP`arg2=Gh zH}!t8WJvC-M9Kzm+>ikXh?wCc>K{<#A9Z@`$SULc9cJk)FOTggWO)x*8zS(2*I+Oc^`sg+9`~p8$;9KJ6<)58|*ZuyS%z=E2fkK99*ez^* z_t(fMC@2I6z6;5?y{#iVmn3BW671JRxRpRxIE?yR=Ny}0y@dj7Xc-yNOiq`&E!)@A zvw&$am=^x&-Cb(8(A}Ru6ZYkzm0Dr(Ipc&!L{!yDpCCoQXda$%7~{m?AjD>OWRScJ zl&A$DL^}`)?E+_SuL{Nn3pO!{Rt<4b5Rd4B>}~8V#EEP_gcYj?A~Ky+8;c+$dalD* z<>EllX@{`oU07vU;@l`LXXgSf>}`AT9Bj3+ZWm^jeJICuVh zNX0_UN=5hZJVRaOC&hXg3$|{HUa*e#diwMNS7A}BAO(MzLg;kK2Lrz?92U5jq}D)V zY_9q&0j`n7`vnVM2WyB4kI`R}n-Dh3pu`Ec2UBeCvgh`!cH5_y1~lXX0bYCne-Tn86fhcx z5TX+MDIo}guU6dy9U>;?9Qb`vhv$YLu!%wlto!?OM{C3Z22k4rX_MLHK!B5mAU+iz z6qmB|@gee|qrgpBfrAdv8+SmZZ-E9n4=TI5o*pi8rUL~9COqi?pr&mw7RT-rPuueM z2Kc`xnBULzfhB`AntO75EDb0Ff?ZNEd3iipUP|VLx&gK9{QM&uo`sq$2Bau;j#$Jd zwCC(@6vM~IM}y*yLIsD01|Y{0S=NDS0R$QYW_j7`G@p8U0^_RMJf6FFE1(pM)S3^KUZCPnfR*$Sh=i%6v`j+po-4#!&uk(Hy|Yg{ynd~{b|~b;0xdh@$<xkmOR4Zow!rVF(893y>Ayl&7GZ zt}88oa!et}Hu9)IqH`dlmhQ%1^Tbg0$RwXseRR;MehmlM9KkH(K{Fe@h|}#Da*N=# zJx#zl(XjP|D#Q3>2`nrv$*u1b39uPB!6%o6cOLr;XFMENLaG8e$)w=`L}sLE=~X*0 z>`Fq61W{{BLzqW>)T`n6gLV$x>#WP+w5XkM;n|Weo(jRNPi5d(1}QiK0IYIyI8@*~ zFb1krFKLtiKin`w;IeJebhJp2TUc0Ov&ya#ugLol_ooBL_3K0HPs(8mxZidrJ%xMh zvXBrJT(5<*rAoP!$}9hSFXSA zsAJi|pj{DW1TZnY`SIgN=Brngo|ZTBUCs5wCckjO1VkPA>fY||lDrHEbSO!kayz`* zrBF55>puRf1@qs6FT?o$%H?c1DkyZxNAm?~w1OhE=r`2UlQ;aFkdMp+$W=X{8J_xjD7uW7o>KRm}n{-}|3m7DuH>;>mjjn1ZaT0?ou^1ZYwf^ zD75cI-3aF$Ox+n`guQ+Rg5fnc<=$Mm2~l$?7}#*9XDA%S`8$zbH7foOgH)XIf!@lH z&{fb7Fu;37oUY4Q57709?NLg9oYeD3ESe594~5^&nW6mqCw0(kt^0 zx8Uwo>i6*#+q1;n)bfJiZr10m>thc4^#?x=G0{t0uNoHt#{s8&2qeJUt}^Vs=c+vB&nnyskvlV>d_H zcF@hpn%O|Jr*Th& zbLn3_?PNn>(F7VhGHa223uvlg{bL@OT+6c3F)-k)W!8<(9<|8?C8=G_AW!Q9cweT# zcVUoqK+PmNC4~?v^=H~Kv9YGpHO?ca+u#0>tRu<~oEf68odo{i5e!Hx`L4L_q$%a+ z=kEY0k^@OE)CEL!&;2!xBKy*!=ZP<$jBek63C|xw&$2YLBQ-KgV4!#ib5ET6egSwC^$Ag zexDt72B@L0+l64kQD_f$dr5*T845M)5;_v1#ZiKnk)HrzqQ8(hw@^ASp!l zU16wD(v>Y*Y!M>KS}MCz%91Rp6lIGD6;e`463_9i&)n}k^Ui%g_xv-HK7;G``!45s zY^Q096_2jB`!=Up$0Jx}t{tfC5{eA!v$IS#C@7e<+bp7`a02)(>Q6;W4p++k#>UjM zKqeC`IG)6W1_Hzkht@c)Urbt>6~FXar5yS2!?7q=xt`gfOuLub@%sbk4f^5>l@bJg z%)V#^INA?8K70^bp6GWeEzUO()6>TamTbwWzxu&J5JE(W`J~SXp*+7&qv9#g7zCcT z_5J_8D*8;#3AR_05BeO$MPk&m}q6&i2bSLIjiUKBcB;-TQw)L}kZk*Z(#yJ6p$nA{qBql=x13(wYy7%Eh zzG7hadg0{gI0amI>p^boY&l6u;wM|k2;bs0vQ2Sn_!L*!hHD@1+ zw!Js96mGtFv8PPKYHdN{J9HBzkJIRv*4m{k!(NPANcm_vC=z+AzBkc=3z)}UvV&f-A&B`Ea{X8|rY2g5b z=Q!G|(%I=KUK3w5UiZ>>t^rXhotKx_YgY_2I;3*Z$Hm3O9R2+_*a1O6BM2$qDm2(_ zE85^5Y#p}_xWWJdQS@?A7=*l@~Mf@vc>Ml?SVBvFVp1KF3P= z8l{Ds&8=0qu5KyeYZYPUGj;wLx_YWLTlg)*G1{G3VX`bPpUltZX77&O&gv+g)L+@2 z{8Y2$`}a$#pPUmCM{@o!5&W=!^W(%fV>xdAn^W~4si%Hz)9CyH7H6784$)A(L+E?# zE1sfIE1U$1w>CXXkRmK1Ld(0}&ghO>rTGMSZhoXb=o`w-oZKBVcl!#=;-<0$LoZx$ z+P-QKJy=^kD|T>v13TAZUt{tO6mDoTC|doibb-7QLRCrzNl=gLqq)|OjN4DxZX(w1 zCer6V*s$UWe_kvD^qhz0XBGZfYt?W$Yt6BIAoz$rEnEE1SG5%OO#R%bA@?B6@6oOkl-_}2zl~HSPGLy6$`X<=SNfaX5lQ)>Y6w)OHwruYXHuZ z2LDXWessDK^hpd3O@5OLn~iH)uzBjxU9R8DDw6hl0pE9i&EWDupB!_CFX{JQzTBHc za+$ExOe%*j(3FK80PGAY9P^zYUur-7j%q~m zyx*kf?eg1~@$l#}Mnc}<@`vdg7;N+MN@+TcTNBcP4}K&eL9z=Hd^6l6*b%b*t)6_^ z?|5N03`aHGJR}m`PbH|el?_T+ZD;445%c@q>j==e8`q;G0ukuy>+3~RHr$u1gB@f` zP>?#xvv1$(@aUyulN7QU;5sar=|$?xP+UZc-jeZ|U?P;}-}jYxX) zFr8_#uPVj1mH!GAr07~NUq%LoI`p}doRUs5ETKPUx_sYtE125>J(-=G+o;>huU&^0 z=Nv@kl2K7n4G{Q_ONg`7tq6fQlo?bG#WW@Q2u|lxH{;6iK|6MsObE#Yg>19Kmb~uU z`&|)ub=sfn-sM5$KghTq_vhhd(9zLxz%h9`fGfNy_8;HbuUC0)3ABW@kWo6oq(=~`l^b}hTXa5ghZb>gbNTtOdH#VZdlE5 z6uO+%DUY{Cy%BmGc@xd8tyHL|!%XszqlDT5gPu{k3Of;<_Z@5q>o_Ab6{aG+DeEE2 zQunfYp7ztRv40GNRc^g>44`A{kgnN>urGK`S-_M^w+l4T^%iyWkZ?)bUZTCB@p1BI zEXOHo)QW070?1ploXbgDnn{%W>UbYdXeRNiY5cBb14%i!bA5F{XLccz%2E0PYx&zz z2rW#|m*bp$_kv~;l2o-;Jx-x^*T%7<2Nq@`U!G_GKXwbAJQth$*Rc+!NHzh-5^j-t z+~z}Y*-%VXBjI#mIwh!_Fn~a!8UQ1)G_D=WF_1d#>nYWn)~ckrML!d)31Ly9cfN&` zAFhqkmL5{QwDfPCdKuyh%5L42^X`C+4RZwmZ6f_f^wxO^@@E%;KtI1aohS}_r)k!lAJ5x4WoC51}b>PT~2Hj;Om@ zbbt0RF^t^A8CHwiCab8(h*zDWaa2i?ho$>=kRr)k-2@AKg_4$ zXkJq@UqOGWYm&ZTMdCj9qDsW1-qLXipY>V-UEhwyfP2;FE3@cN@txcSNACFexbK=B zGAz~`wKN0`ijk=>KN;<;>X=2(9@|Q%b^P&|k`{g7##Qrk6W2$eBl+ykxn@W7AQDFl z+C8y|R_HeKh@681BolQ`oF;3`ZZHQVW#Fn!Rf4#|I=yf zt9fFBs!9eO?%!I^N?(K~h&{)N;~Sf&l3@1@Kd0kGcJ}Oz=w%U<#eBZZZw;Tq(bs735-J=g#p9e3oHG3rIpLM^Bz)le+X3 zPjV2iKW7s{2z?_col#+GL z3-xI8BGQ!^*WaF^7Ex8!SDmzZixz-5Ce6vsrhTG$jmV2(+lfm%97GV=0q_j+6(otNC0?7C7q^i9S=(G!n* zPCip#_W#xs=MPYlk;L5A$=a-WPgdewdO9m$;L`WIWsW|SdykYvT|K=M!N;&CT6-T- zsZf0tANuHMw!Rqt0R0Ffzd5X+hH#JDJl?16);MF@4T)E90*wO- zb_KE`AoN_q#KvzgmU{lY%=N){J!OTfaQ!@c_0GG-?hNYO?8>Fg%(W17w34Lr@b~ZE zJG)`;le#VaEXiZl$5Ce~R0nxWr`I+}+o6BZ8?V^^(oU!j*I{A?s6R&shl_9d)JDgCiC)b!H7#~d9^q-sqHKpK^4PDld1 z>GYcd6Yz93)2TBq!8HS(wA@b9pFR!YD$99+c>ssT3-fclG{dTSm5d*}8X7tV6-LF} zqjGE6JJ4cVO!(lcfBIZUsXEOHF=rKJaND=FwsIF?6u~k=5Eo98wiwQc_}?Lo5JXZ& zVFnT3f=lzm_C2&P9|WmZ18Si(+fLvOW@Az3K$sBiv4exd0b64z<6Z#}caB$FrmG8H z_C7e=OV(E_CHc6xjuGRTw|}(d^Y%M_!;IvF@`VoVXB)=LO9ih@^c`Sp96rB&LSzIj zn*}Z~mH&qt^Iz@4hOu$Lldc@52)^rR2c7LI$Lc6a+-4jFYrhRX*_$7G$^#@h zoVgENT{29V06r${AvH4SmHMXDN4?AZU0ibCQB7Vp{<$Il)|ZId!Q;_l))Na~! z0IUX4ZBNEjt_PLiN5ywlQkE7+AQE2Z39N%gobWH;u|-7tBO`!4PZX$;+n}aFLO+Wo z8lrnRJ9LfT36OLsXyV(M{RmoC@>V`I^?E_Z5c~!;Wb!!&3iZQdKJ*uwM z!vV1q_)6j3_$5?oQCT@8R}=f4saaWLMP4@N_U)Hyqh<}F<(~|W$IWf#BI)MAN(Nx` zoQ>{3Wa~rmAb$p|RSV~=?%nMM1}rV35DkO7s0(i{k$bo6&lGtTbiGnl1HO@?) zSNK@biB?$OynLAjVG@NK7w5X}iYAsxzMY&r1$>&ioRyW;Z=^ZC^9y|B#AK^4wViqb zifd6fD&TNPZRjXrzlgsrh%Y1Ql-Q*t&mPipdR&D{-(^m(P&KK3d?EMoAkOpCXsWW` zUh#kpni#!uWZkq(eX%M@G6Lvx9bgJq{1Jf&ot%T!2q%}U-1OwDSG2@SI7BiQab>ZA zIcGpQcnn-2GY3Z`Itvn=rn_z1@syO5@_x^gxx4|q3sqZr1!;fv2rHRj%WpB>_{DDe z!IHZrQUBOzFKUoexb(WeRJdLpym%xZkkH{o3k<*qN)qzvfPg~&%@D9LV?HuZhaIvo z5>f2w<86rJFW4T;Uy;u0q(Ow6%8Q89U(>1tDqvR~pdYH8VG@N1nGGuxY|)cqojC&F zLmHics!wk?Z1p*nq&x!8+$!y!rUaqf0`DhtNWRi)Qo(bz{uGn2-(_HA>@`Y*D$?gO z9A1H$A@9|{(F0F3thkQ~L2svuN#Hn6x{Vno{@TivT7WezRlS&YK>VF%+rkh4X6jIe ztD-mKaj#f(G?2=5vQKbCwAdVDaDi91Vr3vaG&w#rTieV}t9m@mIc5=VmX^ny5_s>9 zkc4qmFVJkk?Rxw!D0&OTV`5^+A1d2oK91IPZ~To2FblNS~a>y-mY1~JHO*v|>?0`9aYP_G|qwA&$HugUnkQlkS?e!wz| z4e!0R2R^t-Ywz66yH6$(uLzN2a5v+|XN2+>R?P_X-pH_I!3nL?yT6FCDX!r^;y1s} z!2)C(PTF}qCEBI7G-X4_b;}4`)8(H0@si*0{ZfvVYZe&ZkM1JT#1KvH|8fS45k6QP zkf0DqhuEW%_n^9!nwzKmK6qO|?z(?};L6;Og^2qmyVXV0FnB|B8reuk|8Gw8zkE4+ zpxk2_*nV0q+xjjT2CM=`aq#G1#bRpBSp#AZ!Kv%P4rqA0MF(>C0UGP-t+}u%hziS2 z>EqKoP12N3G=oEEfFwY-rUdkml(x6GcTo=eHi`A?^Q|3`h?+gn1F=9sss`D2<-)=u zCaD`5ukFKxA0g#6TfO}!=d$Q2@{_OO4{!Cnf?%T*0|#N7ue6lZEdvE+YoCf>msQSP zLm|>!dDXfiK}n%VawIc?Toe|n5Zmvl$}6(2Fi=s~y%fTG@4zRNqs=c_B53nWGNg`F z2|CGxJIdX_z#Ld+lHY*azw{yUft-CbbrU_jum+spKsW2^@dw^l;rspyuM{T+V}=7C z28?~YZzmkXQRCgTIhMLHgM-Le@1d`5UW7>R$>Yao=0AY`IcxjK2qI6IT&VrGAwIku zhz#-cNG{|-+_qO;ah>J~+)7rZ=F!}p6EhYnNpM^{pjSCteyA~KIY<059waK1yK}`u zfK^9a6lnoz>FIsNRNU&zo;|#O#f@039EefY%$I?W@@=|xcm1pV+`~IA&>$|RE`81D zJ-IscHLz&L?`&rCde{fb?s5nO(31t3>vsR>@i=_O6LtDfs#|7!MM-$E#34xFXBWPI z&{tPcv7BbO-DvN31|(!|t78Y7{%O;@_{dJ!lPzxh!Iqp}c*{j^Gqrbdj<3R#%+olY z_FyH02q}05fzlI|CQ_iopzKJHybc~aE+c~-TZi2#IvPpQ_8&ukkei^cy33J|uJebm zHDaT1f@|dE${dR(Dj^U=_i&^+p_lWWpZ$0U^a`VoI^Fzzp}#ewj(!)P6k z%5tLNI&6UG+6fvVaw%YdlfF)&sYJp27@YRbE?{zJk)S$+6%a*aX5=t~tmX-Tpx`44 z7nMZZZx^dl1_9>Mf3gMNz1FrUfv?CI6N?W^DxA%nNtMlyq53#89*#?QF} z0lN~UM8o9=Iy47^dhQnRd;vh@dZ7?l$nK;p55^EL=^`l_3gW!BaA@G7VyNi-qIVjY zA({~L$0uw%p9e_vSW}%{pt$|nM}SNg_Y~jK7jw1mq7IX(1WyhLP<%km6R0u%w8Ms+ zi6i@=VSY04A}Bc6ybs-&6~HaK-u`~u@~o(+Z8hUG?S&7oqKHaSeBmy}IP5c7$Yh%0 z-4|AoyesYXguJa;m*9PYF&uz;>pASKtd_uQljAMx7X1`^bzCTf_rxL)(IUh*&5Z9H zkC8woPASQ>LY)yW9y&Y3R8Ux0auWm)_xKb&CA+I1f)J&hNN3L=Gqlx*SI8Kx23T1SIReXjND5B1UgDq}0=(Ua zYYZHuQlAy-cVFnB4!yd!gv5wkgEPldeb_e@E)|&VaVc|RDG#Bzp8^Y42Yu+t)2CH# zovR2;S+x#+diy%sC%ZZU$2X9er&9O;E*;_ZEJElNE zpdvj`9moo#Xj?0YT<$ijhejSAlFCt%Fpr}tvkz3;a=mL9c!d5cRP2QNaTb`P{LED{ zFLAU<%t9rmd&&~C3-o!_MG!UfI(@&n#t(2{^wJ}vqh?iXkUzI6bQ}b`U5pCcxruby zD8)RTNNvZoG;cFUW%A=BBhC`J;>q{#P3TdY8dN;O0xz`Od}u1Gh}0L+m@RQpl&!3m zWCWf%j|n0VrjV^C3$Qxr+|y`da=#X%^Vrwp&|U_tSdfHvQIzTGR1doddoF zB*%q=lv(K4R*6NqJDm(h1(LJ}XO6dFv333UO%PYFEpF!IgpX}433g~9Xe_l#T^6lS zJiEk;MnC{0dwG11*Q^cZfgpvbfd%_LbK|9Xh{G+!Vxf6aec|8=h=}@T1c%d(#~6jt z^^pqjrPKUb-Y#Y6K}L?^CPgaHVU4RE6V{n9NA#8!FN!LA5j&Xp!i_oSeZrJ zfqSK7mHWc}4Z4)t(FZApLd{~|0(iANi&JYF}KMk&d zKEC;Fp?dArl>p*-8y*wl*|iHSN9tG|4Bx&B7RSbcC_q143kNZ-Ge9={5D zwVJF(f!_PE%_|@Q%5BBvLhTc{?*I5?`|^s;rJ;KLadC%WJBsjD9Y>novye)e|Bj__ zp7nv4%R=irxKfoqSmgLOL$_p3M9i{`TpPSEP`NxOzFH~x}Oc6jP z3S=5e7WlyFT+S-K1_^UuE&>tQP?j}x?dHRuZQFh>YPA|+fqoVa4l(Ji7?_lL>IUGo zKLh2UB_XjzXpNQv9hw#tJgs`aNxNhzdNQKof*Gdg^l>9?CEO8SN zl@?W?#9>C(O(a@}dNhcIix9c9IyyP6o3Nsqvc{-C^LcqE!?O_(ed|-|%mOdUEbx>0e0#6m)g@8Z8+&kAeDu#0?e%Xv(2D8>)+~iPXB;yNV z|4EUxw!Y5$d1j^&zwR)ABo~cF0pa{=R3m1F!Khj_0@S^PjQ)dc;9u~Y^Ah*H02~Oi z+p6f=R&daNqZMs0ij7N*>APt)|HS%YI#^jE*Bp4)O+zw4Gj|kPWIb^gM${{e5nE_` z(cn!BvaDii+>G&@r08&MQqNcCKv`A?O*-rzmX$n(R9kP!EL-T=2u?$uHJV8MOc>1{ zJ7CP=qvh=j2x!MD&d81(e)Z~*){4Q!s;~ncI^qw`|*9nkZ9uD`|6)@pZEw2P-B`m2->+b7IKUks+1&7ME-H6#4M0-LJ z-gE(B--)SxxKyK{ZqR}LBj8h}_mSKPQ2w;VxeGS z*?;?EWRD8&2B?@;sbTsNKKjYIy`G*@ph0^2%jiR_P22o@(VAEDqP>$#!F{q12vdaAl zEpDQnAG*qoJst2iQyS z%!WV`tz4@HR^9UrkiN^5-#odRr7un}&nD~G9MWTgfRJNt6wjlp=B z;}1l4$sJv%)&JHVshU~9!{kXio6H9&4_qu%U*7y<+vUi$ zK%8J=W8a{tc=gUrP@_9WF=MOc6O9eeCiET<-Pc~@3xSomEKV{ZGZsj3?qPLG@lz^- z9V!HzZiRf6JB;x892rAetK_A=fP!b%=^Gj*j^ENY{Viyk9@U;nI1;buFnWS><~3Tg zt!Epbm&M{?j)#2*)D;_g@aXrxm)kYb##?do(TO+$oNYOc6F}thD_rH6mzEF=OgZ5J zmv)DAD)b9i&VCNo3=F2H%s)Q5u=c_rNW&Ny)vMD=0y1{l+MdFJlQqJ~#xLAryOo4{ zVPJ#H0ZlcxM=LjB!4V)7@vQ23&^jDpVm819w^bm0W< znVXw4@2kM>!#f>aMwkfP#XB_Mdu;-#T*pTY7LgGVsXpt|iA}aJ1C3$p>l>c|&mko% ztkVw>*JOZXTOBcHkJW>_8d9aTKVVGtytmAY=95eM+2$ zkf(4lDk9><0F74vBpvxWg+iRkW@cQd7@zNz7Z+!Ov|q*&_L)*cc{R0jQm{@%^A>g8 z>>e2N$TKYLTQii&?P~e2lykHW>jCToThMZi; z{O^AkOuFJ5uT2OuqK)Wsh~iPJBo=b+ykNCeGu+&`7K?A4F6H5WQ4kXtrKuw;N3yMT8wg9FV(f} zII|#91i8s@DY&8BceUSlpfa+svKGD&LSKuQAB__TdA@Fyt=DuIuo+A6yCu~U&9u*O zwBm^@d+^|p4xa1%rt#snQ>E>3W|9E|xk%wE9Aq}dr47MT^??)$eZIb~wgs84h5_*L zy&k~88(A5nSnzC!1Gl09fe%GjuU72txkzQ@mB~7wf?-ibmoJxE_c%~Vs%6C`_$Tnw zA|AGKaLvO6QIPR@vX2iT+%lI-*U~RX`5nD=jT10m*d;0gS(w7ASMZ+NpEx};bM|oE z{=Z$e=n7tQE8%J8-1ixPRr(O_PK2BR(wrj61|vt&OB1_-y5$t$1z*fbGgrAYdIQl} z2&yq^{qiDIhWBR=P~OvsE8)`n8bB-Z-$H;07l-}`HcxhHKD~Eo>6Ypn7^@B8oyb@$ z6l_E;dd}{6fFEQA{mZPphhD$FU;b3Ec5h*<@e)vY81^b(bK_&2e~rTYf{cVjR_HJW zBic;AyfIVv7l{VxwEif8wbgdn=kQrfva?5Il+ksEj~2UZY{=+Xw_v~FZviuqb#yzj zViqeK%%l%Lzxra5#Cy-z{52ozO!%L25AwYf^#Kr(Dk_NS*s)`sQY#NQsX3-+>gNO_ zyY>79eL)`ox|nFHS9#eh9KHwkXKPN;82!68hyLgRL|jF+b}>>&H8}khF}VdHy8v`C zVm?Mvlj+<10fa}jg>DwiS5h`E^V+yX+W^!}hMnn@;@k0Y7Q{*MN`J%ozo`1COiFp) zOp7u=fE@f_wR2s<5g~-q zc@|@39~@xQRZ87pv2$kxDGWl`OdruHuTz8k(6b3e5E<4*;!NPxgJ57G8hB3w?iceu z=?ySxLU&*5!n{P+O*b$36pAa`l__K$tz|(UE zI&p!Ia?K-~ykHejEMp6D-$>1j0lgXJBDGqx$?cjN+1HlK9f{`m8sckir^6Nxf!*4u z41|331d^Os;cpOzS{s+!uI^M;R>p;HnAtuSKsdN3>+RE)sfmk6wXSGu!^OAmRBX}S zyLP>Dq4TpP0UvlNu*HcYpxk5b1MY3besA>udo9J&kco3S770lb9(*O);7@a&K24Vs zdf8q;LqQQiDJ(3cm>z7#zqmAyOyi(5VrE|3@J mRXZtzYgym@t2xi-n?D+_`bbY%DPV|#fAsZCbgyl(r~VIewtq+f literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.svg b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.svg new file mode 100644 index 0000000000..25893f5276 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/cyrillic_char_set_bitmap_31.svg @@ -0,0 +1,535 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрÑтуфхцчшщьыъÑÑŽÑÐÑ‘ + + + + + + + + + diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.png b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.png new file mode 100644 index 0000000000000000000000000000000000000000..baafc82171ce585c4841a36d61e5c517187e9067 GIT binary patch literal 16643 zcmbV!cU+Tcx2@xVQd9_4Kzfmmbm@lBiJ;gV{Dc^2pDr6#piVtC!Cr~tmjngH#k?P z2H8E&8YbqAC*KiS&x<>upGusCA>fNW(+QjmIRyoEsh2Ksl0U=Hlntk{L*$m#p=PgZ znp}I!&6MqWr`5?s@%a}oTJkS`5zqAOB0XkG<@t7_Ci|xIhyfpO8jhxi`ytePclo|s z9E}+enqQ5D!#Yrq$~fRluZ~wFy8Prl3K|1|R`m#~(XL-G%fI_byC=-Z!UAk6rd`Id zYt9CMF~~JMgfybJQn470o@YahNJQzE{+!aK%t(FuAdx5ZQ=RO(z{yCbliSSRs(r(2 zRxvWP)`D(sq(Y-Rfxq>#L?wrG5A(}r3cGmy!g7bLst2K-zPMaKNO)OTC<4@y;1d-f z$%}Xq8!Sv~3a{bp51m9VI_PZLR^3x)s&|=xzy5*!+n0|n8a^L;Qc`5N(}R%9`ll|x z1dccK$Zl^}^*Eg@hi8i2IybaUnS0l0;d1PY3%nbbYIF;uE9-8-_=Yq5@0q`b=+^4T zBo>6Sa%L!;bPiqxYMK8nUr35nFv(+Nr;?|&u#;t{-iH^511j}y>L>DVxtjzM>utHr z;Eedjm$#J`cTry@&N=Dj)8b<~?mk-3^fl7422&^9cDuu!Ut`fN!%TI@zFcwO?@>)0-$wr zv3-U!>!lR|HE>ZROSJQWY{?yov6c8e0?_vry}}4kxfIdrI1a7y%m1Cu*%g+O0foCW zI2vHIFAU(R^o=oAJETC5J&aW}54Am8qe_ zaL7o`0<*hMEsZW6RPr7GR^Nvlj!j(9X+k~I4O(S+lbE<)q(k>xG}esUFJucd`pyWm ztH~S+(KFTdn!dkhX&|TaVn>bO*mGjK`i7ZSZzvYMbYNPtq)xj>@5z9#xne@&q=jLP z;pfd|%d;AOp+0|qG>eOyAY&pbngF4ELi#E8wZaku5H}So+XRuq(ZmhFu^AL)4BHTv z^oZ}g@YT8W(@aU{hkj0C9c-njB}FhciouHVeq^dC(d`lW%9vm*RmJB6sMB5Lr+oyF z$Y`Q0_5JPak>mreqVUN#cj=~q!%5D;-Gsii+3T->T!?(3UyDSth4 zW_MI9pSRx?X7y!B9=m^vO{X|<{@~1DJD>*oIv|I^hPuJrD4AF`<8jM%F~6uH ze>(|Z(zFdEN#31~SWhfg#7#2y?Puq;!}A)w*?XiLV?y1i~B>Ypp7(GMyqsMXU$ zxX=WP;6{7PzUq__*tx^T?$qn;xh+VL8sXK*@r1WbFnAJHP!im>d077D!2d2f@y?UY zYLdn$A+GEkbCd{dN#m1m5%y%U#6Y2(HQf@)ZnwK$ZiEh3-F4qa~SAq!*h?VMx9i7kgbkL#%s4V!uC!Td`@!at+^Bg#Rnqz-BU zmkLjX1nME!ADfE>`-}0DDZ&=L8OwhP(!agv|3)ELaVjB^ie&tmox1d`%36sr{&$A) zS9lINBI3LA*3i+Dpb_`lM68E$MvE6nm@?`UXA7xoC}+^y#u3 zkfyfQCrA_)Z+K(iu!cn9if=tdnci3>g=O#SKY7`VV z5IvUk*h^n;M(~-iEA6l4E>28Ox(OiD$&f}Yk(?vpTGHJ<*vbcQWm83)Rz-G!hPcwT zxtC47Z>srhVtjOle;e^$7HC1&oVdonNs)Y{lcQ6Z+nv2HvqrAqQ*I)m0%jO457@MN z?rb1fDSx)3$=!f{;77|Tj3z2%PUU|%3SXX;^|npjl}xYhBC&8xcPE0IKAQurBtq3K zmCF3a$HkbB?tat{^EU$`oYId=%853U;qrtww-dcm3Numdf1l;OTsgF`c0r`xPvKvP z?nzA?8nGOC5eU+`@yYCuQlAyR-t!DM zFf||`S@qwa%IyyG12LyT2Llb%?->PwVnfUZQ2*k+^VwUb{u?1Z2piM9%K=@*?Gcm% ze;9JQiFw|HqNDqBj1ZR3yWV$M#sKNcSY(-eBh$*UC2eVx5V?)@wU5_N3auvs4|6|0 zoAAMHzpS(nL>6Yi-5T_qY!S%(f2P5oyUTNn*tIYqtMFM>C7Qt0Q{MhqUT5{x4Z@yX z?NEcOdd^$pml+Iqd4^t{gBSHCf~&9}YHA<4eVq-x(Ns+8ks3JUTIN zsm7NsKdQ>Z`zcmjdJ&a`J$Wk|fiZWwzdo83`c6+=WV;GqSV)hvb8#9n0iec}4Cr^Y zd#NXSyn^o?2*cDZ7IB^LEHqvA^efxsqAp1ZZftsjYlW*jiecSY`wc^r6!|~Y9Yv;c z%+NX8O@ogwxf?8Br~a;@{T(Ppc~MO)DlyLt#>*%m73%LJJOw)&CiOZv+j}DlEi=t> zJuNlhD_(+ykgsn`sq522H#!)!7McvHIK2!U&ZgGN@ZH!PZ!R3CgL*nCIq3|aP(ric z!=I%NeukmY4oNK~ExB~YlFakQ5BCGzSEfa_r~e3UG^BqrKN`!Kknu^_Awt0A_xGxf z#}jAuLYzD0x$%8G&T8Ac*h()2R1F?uDFD$(N zr0Ou=*Dl4<42yBax|N8%Q{6f4MR#gDO<_1A-5qe304Y};Y_b0`|01|X#x8?&=VOS< z4MZQa+-iywvzig6Jr3h)45*6jqjzG_vUvs-xe|7usaOd z@0LfmKA|vc@ekL`;BIvIfDUrmdsDeoJ*c>LSt8WHwKBUtP>6Gg;=Wu+kLvHQ(7Tpp zgdJ!+j$?oJdO?l-yIIBV>c=OEeowLm^Otc>;5G3w*~klHdn{ED!t)E9m{|d&%a1nI z&SV69^+glc4HK{E+^AA9x?)}HwhzUv{Q0(t@@j-RnH23sw0lRdxT`F+wP1(E$t{t^ zQv^QNgr)yk0(I(+lc%yWL9h^SI#L=I=+D@1f`Ns-&)Uit5bY7~#6L`x4oRa3QeTaU zd4Oq1ZSGmm(K3xNkHK1{W>-aD1r9$!CdQh!Jrm5&Vnzve$N?*NMDh@gD7@lk1Fd%Y zk?FIZNzTXc8DThUbjq-`R=z}D?lyKY&ine*{3S|9mt1ghINN*ZXun;TB zkzK$UNZ$cg&W*fC-aTHsCC|xKq&>LW}C~ z@)hNI-Yxpw*>P_p=-$O;IKy`h;rBK5i>#X5#QSc^kOqg+HQs&(r^9ElTg?Pntx#%w zv$>mE-{G|*Z((GXaxiZ+cX}Y@eG`MFG_iw96O~|l!&_atXTz-$N9bS?_7Kx0Puzas z%DEoS+=U~&-s;L8XyfI2a$mWqkc0xKrwd`>OI97DI zNR93`;Ce`Fm)oe3nH|tlS~j!DwJJdsHvhizI)KkH$~bdsrlPfZxqTKCzX1P)-509^Fh^LPaW$jPl~zKxMPTpC|x%F}xHrC!}ch-gBk*jCXna zt8&K>=9Epb2_2$q{@XI(@ZI!Z&2(wHDWEFy)O_Z(d?=B{5hY!X_IfmS9J<(fb|^x$ zO%CkeXjVcfW0#rclsQSd>vl)(j7^`{O=2UcBP`_Jdzp*n+-^@mQK_2IMY7r#z?Ode zt9}I;O}po&=e}|8f3M1r#h3B+t2qzdgQ?wkXf_P`pKFgKP*n#j9(5+eGQ~9i)*){O z2kXgp5PC0rrOLSdLKb2?VPaH7HLdUR`Y)9F9)!s{O~aJAHG<139>?;6uRIJX9Q(Jc zQp-pba!JU*iog~QA@;Yvsz>2h^X>;FTM4(|uqv^fTa-fivtZKo0mbp>gbMDXB7G#e1*3|qV;H-PR&v#Q1BYThva{;V+&DnUl` zM56!ek=g0qQ%QBVJ&;ulhku+E7481;xH<^P9omL);P$14@8|bv46VAJf)Unl@C{Lk zJpIWw31}WZ!T*I)G-YM7+-9$8ef231Uxky@H|ebZGx1>I%;DFa;jFqt-W)$K&F5j- z$82RDl+n{_T1e90!}WvC{2!g81LPg)+!eB;i2JNX*vD$SZg+%9zb<{~P8GjPRvEkpILm zTY}Fq_>~N3Ir&EQe};wusXN71f?&ht6A`gCjAc20&v?!>LYz{#TY4T46F^BOo-0u& z)4RBD@)O8+U92np7}1h zCypl5YY`^{(>>o-*vg1+qA4tV$bF#vQ_+gAS^~Wvig|N+SvT^s5p={@cPx~JS3Y<{ zq5cpjW{r0Ltx5AkWqK2pStTnkKql};Zx+vA8!9}OcnZ?TKp1MHNcV~M2BowVl~^dR z^Fx6i0T=&lk404`R5iTX-r4na7hhMSm~nlHEqvRPbMwWRf0!u~N_){g zasm)}v`3bH0J1|>HenMR%<#GQgHY?*Ni+I^m&kGbopQfM9lb=@wfj@0BP)AzgA_qo zVFE6(_s86t-R|@rg#o&sl!lt?B|_?!uBY;t(5>$hExJ4@xh8bjz%o zOM72wGD$MI{?@|+vz{EfkuKuqy4%Xv*r;B0FaWwtnfdBq4s5N`?+Yvg4k5BF%X@zr z+ssf7P)Q=KUAZXBn%L=a@GQ+uhdXV1y(mQg^h^2`jJG;_7H zozLnZvPB9<8j43fg){|(eLgL+>_|4*?dpGcks|v}MR2=ebT9YqapC)?0~6O^{M(in z1V85a))X#L;nnMRua~?vUbwvCETgRkO5BfbA|wo^S`KzIz!>hyKhN{m8hev!MmpQ{ z#iPPb2x*-kBpw^c`(XW*!Pw-*^q@DB)Dv8MqQ&)MYM`Yjs@J`bLV*KSO;oT7J$`jJ zn)FY@G9eM*cjH;`JymMH2j6S4e=EIFQKYhlwKtlpa1q2FtuE{N3c+EQ`zC>6$cvN% zj8<#7NQ&LjJGhA(mP$hIyBV6oj_rqvG?qzxts9J8*hifFyC6dRCJRDz+Fy@TSyd~z z^=2_P4p^g=_&DD4ltXF_9*R~@X*x_QH3;iympM1?t2uB!nJ2yAt2)l68Xp(rXV4{+ z3W7O~uLWB2b*k8g813Lw1_1y&;IM8fvgElg>ZkZy8KpznCsE^Z^V2x2hkitG9`N8M zNb43j(OEFvuH=+K?v;AB+J+G;Wzc6`G48stk9OIqv|Gft!hw7^LrU0(c+1-wR4_7K zc{saaDMS_t_yp+woG>tbx((h_R;QT>nDmhl^gW=EP!2^79;9QdDWJlza#h=I?DmDh zO52>%B{jn8n%+(mM*{}SQRAv_a_**ct>DV^Ojhj|SE5FK9UzxOsvohGO#JSb5jnlCz1a zC&mD3kSwL@P0eThU#Ug(0^}69wmV0~omdw=aTrK_I@FwHYRP*vnB9`90JetUY7CIzf)LCFSl!G*VI4U>EV?%cY*|AqIFIeeGj zU|B*Kj#Jz!)fh?^L_R(jQ^1(RVQz~!J;&RBeQBAX03YJQ$5``qiaG_)3L=ugdgamp8~ub@8!N2u|wRz6Seuf_lFY>SfJ_ zM4tF+Lj^36LjD5U{=~GaaGbmlFqDNo=lgqt#=TjpU&J+cAqjp$OJ#?Bf4WR}tSamFI`SjwNZw z*YN>%yC6N)Lqx676C}*-#!i50)z_F0r){G^d>nBt(z(BtjFaU45{DfN86A&kB7j-9 zbjcj|TkDf!D_4T2VY0D@`v_9kfCwCq72emR4{he(~b%v(Zm#w-i zkwBoBm~$@zQeo}SlHz(dHOf=h1tJpIP*A=`Z_MQulxK}9;a++2d9uZs?L?6R)|+ip z78qj+ThT;_>P1pkYiVDw=Mx@WF{gm#OB$P|6j}h;at0~2jmbebKK$oa`ctMP^Kuu+ z9UrZtdrwVVlXw6z^jII5+c%x^M|AvOKoFi1MRL{I91k7i#X-q9BNzFE^(8Py)kp37Gdj*=&jwu>RPGX7Vn#ipF7Ypd_q4W_ObNFe=Oh4 z+O-PMRxJ*@H4071t65UcpW^9ud-Li&Mrb~$K~QAUYc@}ARTtdlq;+Bptfe8j+1|J(fgeRI`dD`ip9rguc^$zbyU2cWDD zm!EItSTJLH(~a6k8OM(j7_{avRMEs>DpRpvWqbDA-C&EBESz}>is{BU9~W(8_jS)R5?7_;~cF5r@o`4!>1QGKl&R5uDM+c8VNA6=6rDev`oN*kyNxHHioDeSh|)NzHd8WtfnI z*i)w3RLW{tLDDPJ#3E^|H1Mf9cYqtr1s|_kN-Uc&4qLRv-1cY>>x>&I916NAJvwBK_k z3xz%>51R&>^~kt9s5+cZYo}bNu1ORcG!!9+9w?$LlrD6@Vs0kW%jQ@Sxie~;fgE5B zOgXQ#Z`g`Umf9v}6suEH z+%sScGWch4k3xqi2l>OK8$8poCqkn|ZYCBD*uoc|7h|1W@4dWni|BHomfS1{EbGz_ zyw5F>SEUsslE?6r2P}rU)gR6zhgV-(sje|pLk$Y!sd`5rH5*(90CU-M6(Jj_uk-sb z%uwPC$EV7UYspcK9gUF6e!jfd=nfEo0p~K58YQ`(7$Abm!jrl{%yOwwqz}yAd2zx& zqFX2(J%P(sg5UoZnB#AluKBPpADZ*4vrpJus(84l9V1FR&`P{$alo#taP z(&7eey1@zObM6{_>&N1j-NE!v9CYt4coA;FZ@W7z=9i-J#@qB1;ymByW{{a}IsSh5s7#kuVYX zuGicpQExR4hL6umH9kmV+P3$*SEd}G2_QEnEcKnjkZER*dLFOCA@?}5!6JlA<1Nw7 z3`y|oE}sFH26IZ-^Ad~1DDlxKCu09IS-Zj9f?ft$@moQjvr7K(!;kgROYa^4F?U~d zxYT17F6SW1dSsu}p|Kv)Y51{U9*xhGQJOixb^+zxa3)bwn)#^VWEmwauiL0ldznN{ z%?{{#K4$2v z+O_9@rWT+gRpqcZgzzsGj1U*uV0p8b>eKW}smb@#$%O+dO0$RC?{V4`Pq@P1x-WMl z2;m$6c1!<+4RG)w6NB8ASp(JuHY(n^l1rdc)-dhXy+?Z-HydKs$kT{KEDZ&4rqc3p ze`IuG+@f09l?M!EsLKV>g>;x8(q%hcqoYu(|3W0nCf&)DUnX`vMM{*Ipvvt|o%_@?;Grt9aPQ3ZF{*sEnHM`|z7Rt)V?G$WW6g$m?=L$3`k2W2u z+bc=+N~8e)0&U)L_^BIIX_Ap7YAbA=eI0C+YT9ksGz^Ude|;1oey%@XR$zF0=p{#I zzO0~&iCyI7WNcP;U)E<|EWZXu_s9%$-7pSAZ`PodSRnR7VRP}!ry?vwZo9J387}NN z)0(cs$U9Mt@1qjWF*WU1goLrvzRBFV`Bq5<)Mt7^$JJKvX1f=5IRi( zk(ULA4ed(MTGlD!AWI6dD=u!C+Sox*FG8Gxba~9Yp*X-lAa3+^ zO4c+3D{qc~W{WX0OOk(m%e3R-GW$;_6`^WcQr<(!)w8nIxgTxdvV8GN$0=ChC#A(< zF-4Vab%t=Y7z`}^8qP@hj^_B?LCRio^e^UvQ5_!22%UlGny?v_NgSwW(7N|e=64ssH>;vCr!(tFgbVr57fn zWtGg$T?~S$aXzco^@b;C{B*CC-!EW8t7fS_$=j% zP2#T82#Vaq^-M9zxdAPortDP32aSff?1}I%Mbi&3{-EOghpEZ`{2iNQF5@WJ&?(Io znrVta){yn;e>imK`KpYEYp6$09hB?&rbDlWzk>SiDe}KNUg+*=ckZii!G0<#ZZW!? zw5o7aqE*Drm-{1L^pnZqU+MQ#reI2gn=UD0mSRr}$kR1R5h)dMS%giAn|*O=)maRw z>|zR|+B(hpt-bpk2$&*wFP3H>#1O$bPWGHc-5OMFSiAvHrh+_c@~!mo9$Cw(n~AZiIS<~o7WOk=tRK23wm~^h~OT>;(htB5)C+taZS35--E`j*X_=nA8 z!!L3!Wk8pPp_-;dv)izk<{K`*(sjf;m)pAD=!uJ^ANYGIv(^;$5kWnbp?=eNb(9S) z^E~tAN@5XUJ6oYT?_5& zi!%FO=wZIxA1{HYZYo(t7x9w}DKcX-=QGXT_WO9&K4%T;>a1s&cirMH6Gx~$C^sj& zjt!-nW=aKMOJSs!2tKtCvCRF`#wN0jNu<<=*Q7YfwEy|Ad7r~-UL4GU6Sb*Ub+V`{ zg{ER3aGUxK!((9OubOw5BtkY}{nUN)mz^G^NmAH&W4+hQ7a56vU{odK%QPw{k6sqO zsm|8!t-Cqk@B#Kkr14=YGxt zu>GIu)wE&97{Mk3J_p*kxEby)rcxBZ_(!tdcRj~W;;ww`7I)=KkCp1M6=#0>ac?1_)4tTcJ;lq7JVSt<=IhqO5sq{~=U*B_` z#(=qU!sa#@wk|vs>{UmcT7Fyk?(Ei=Jx^=Qfn`;nOg0O%iK@B#7gSmgh|+qMZyc4o zji%(FORKNUXbh>KaMDRyUWE7?0T(TirB4SH8qS33DzNBJb9qm zLN-Y2h{&x-~TAsxnG~Vc}FIi4To3@KOUUyvE1!cYY6@a}C@8lEm$w^?Ynocjd zTe0SjyFQn+_VFC`08(R{ejzthNKj6`I>u_6F?{PL0$E2^YIJ@-l-vdJ?Z_9In_SF{ z>X2Ep`x+O8Y>TOj$@-COPxcP?)JrFk+QG%#m5N@OWN-cUbiNSTipfW&Af4KJYJR__ z!rg*?d^+P#neup=>)Y`Ta*o0NxxV3#qsqnU6sh%zuW$A9Xi4B?PU9>s^?xsy&};$f zan8*t>*N`UuYT3TK#`$9G_OK1F%j}?nptFjp6cldMIOD+gjlDLeMZwkHNM(Qj| zCNB;SBoo8JyO9hlQKAjeu0UpA`{ZMcgF`t(vXHP3dRE9npI}^QZFI}jsrWr(RgBQI z?PP-WII}jDIH5`l^1KU$p9B;iuIlHWm){48rH9mwd$D%zC1Z$_zR?=xKPxO7sy;>$jW3q)gE^}lZ zQ}D+v|4*y=JfGJ23S%B2&(4Zhf7&5FK*dJc|nTvOWvQoIon6v5jP6z<65S|yO z=lZLZmWvAJFjtRGotoH95XrJu~9w8XWlAQZ6T(oT=QuX8_V@b6=gzM;LXlf5gc*9KZ~VXx ztSiZ`WQE8-!cpyY)*C>ryJ~2m@a0c+Pf^;E#{raP6QyA0goNJ?Upn;QgT|Cc`4?ds zJu@D{jKea4tNOtlA)}+?4MLKS#MMRIVbdWS1Vj3yzj_5OT_i>D>~-Hj$&{a*03ge0 zIzDqfLEFfu%hj*fII|OZ3|~GB`50}|@_|#N-iWbF_(l+^am9QvA5YV^GgFYb{sV2?B5nX0e1lj16|+4BNY~LYCdbI@na#99KZAUegJm@x zhv+THn#I=?o|Sp0S+WJ3ta)7li%m+RMq>1aeKjluf4e^6Fkq8Wz%3vdn+8pUJ?o~I z7j$8@8n98c!7S-l2Cvp)$7%bs#@tWsfTPU?Mns`Mf;S(~LGw!{r85YkZH?GxEq~;m z=BEamfG%I;o^sj%qzLBglS;z`#KE1fyef~))Y);ebGR&JFp>)DO6Ju+(4-e|BASG1 zt9GsFrVCr;x5*YnZ?L|XpdfY5&Qx-uGpAP>2O#>+YXii&FYC*^qOS|N8F(@98mp?) zYZ?EVx?-%Mzn{rG>{%w9T8Jrk7MxIbD!KJNt8dhV8-x2>E=SdEW}n9 zCf3JF01d`<{#a>ZkqG)G)u&7Fzr0p#nNNOvJ3h6?{>=FLk&5hbvxnRR8}-CoOTYMB z>Gjn)vsfW8wMKLtvJVR(mv{+exiWFJ>hO9SHMneld6i(9gPtrJ`CCAkp3Uj zQkJ^cqN8!?RxFDY9hB}=Se$akXoI;iU*WSTH;*wR4M2R;6i~H>OWWf5--YBQq z#XnA74nnIIcqJK!4JXZkDNnN_XQ%Tnw5(pwsMvp=%K;}fa>bwG2T8v&b~`h5Q#>K< za=pQG-VxF=nJ~;CX!N3XjSN^lsq>>;jJ11go+U62^BL0J5%O*Ra?rN^M_}61XD!9} z%MGizB%Xd`SV*EFMX!1%q0Or*H%%Il>-u*5QY(yTQK@EpUy60uAY()WLUJx*aK<^fn z5rQIoOSn_6)?Sh2&$r=bpL$^)XJZO0esLRJ4f$Z4SwaeG46JHdrVdTP7EcGFbgq1| zx?Ddgtw2b*&3hbRJY_I);3{TqJqD^>iSm^9H7&`h8*5vd>z$nEHXb_gN9)di{**RQ z`qFJUprw493mq$L+_VJ|aXXY~D)zoakV)W`jVH6%zkFRkE!%3zrq7=Olxm^(GEdG{ z6n{vxKDj)S+^Mp0KJK{F#lOLx89hnkHWJ+EAbfAQY{OpS^9&X4yVdAHyOYr2F-#3{j& z=y;qXUQNF!_OR0{JVeKEsg1d4B%j?-YEAVi310a4K^gwgH8P-C)fesj{v>gXY(auJ z3Lt)z#29Mm^y`9Hn311xatOoI`pb0{JYtb6d~Iagw=J%Y5)u;xu_0}o3oXltnQkZC z1^HlJeP|Vw#jRM>QQP)`N zAnmcN?K!(UF4Q>>A!H`5`Fp%{Xer8!ji0ym^=`2`sRUh?b>ypi^r|uK2uSKWc~U_$ zAwk__*L-^^Xn5ABH*93y$Ptt0Gt87C{Fn36HNvu&JsW&d2MZ<9nB8*ph%Vkq)+ZX6 zI{^u7u!V?T3FKjt3t8L2e$NbBS;fQ%rCHag&AYyxCI6oQ@?WS(8jsLBiK(Mm`oEnI zTnM*Pv4ZT9KHVasz0$JV6)5kYw|i+-GqpdxjZ1wK+nhcD-XEcxx=9>CWo>pGpj{bx zSE~O6-t1)@I`^xO!^0UL2Q`xiP2OR0_t4jD&y}6ZY$!!oCNKA0o_QFXkMCc*Tw-nE zei?w9xnjG3tDtGq4kcQ>{J3&+lMPYM-kL=Y!2`SS8JdZa=K64E|BCdoD}3-r;y1Tk zef#1K=>g3D=_d23?RHnu`OV2J&S%b?!GHU|0B?d;i^RLv=RnYSuaq6ta3a#voR1U; zHeq+BbpTg{B)x!2x6-6v<;+b1jU5yxWq;ktTgudloq2;O%ywy)HAJiwiTwJb6#waV i|Nnd8%O};HuN8*pyAKQtEy-7ZMqm4;R=MVF#Qy;jBQ6yH literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp index b795e01d42..d12bf97119 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp @@ -48,7 +48,8 @@ * addr - Address in RAMG where the font data is written */ - void FTDI::StandardCharSet::load_data(uint32_t) { + uint32_t FTDI::StandardCharSet::load_data(uint32_t addr) { + return addr; } /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h index e320bd7344..48794d475f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h @@ -23,7 +23,7 @@ namespace FTDI { class StandardCharSet { public: static uint8_t std_char_width(char); - static void load_data(uint32_t addr); + static uint32_t load_data(uint32_t addr); static void load_bitmaps(CommandProcessor&); static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp index d21b7f0e7f..39b8759204 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp @@ -73,6 +73,13 @@ return val; } + utf8_char_t FTDI::get_utf8_char_and_inc(char *&c) { + utf8_char_t val = *(uint8_t*)c++; + while ((*c & 0xC0) == 0x80) + val = (val << 8) | *(uint8_t*)c++; + return val; + } + /** * Helper function to draw and/or measure a UTF8 string * @@ -92,6 +99,9 @@ const int start_x = x; while (*str) { const utf8_char_t c = get_utf8_char_and_inc(str); + #ifdef TOUCH_UI_UTF8_CYRILLIC_CHARSET + CyrillicCharSet::render_glyph(cmd, x, y, fs, c) || + #endif #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET WesternCharSet::render_glyph(cmd, x, y, fs, c) || #endif @@ -108,11 +118,14 @@ * addr - Address in RAMG where the font data is written */ - void FTDI::load_utf8_data(uint16_t addr) { - #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET - WesternCharSet::load_data(addr); + void FTDI::load_utf8_data(uint32_t addr) { + #ifdef TOUCH_UI_UTF8_CYRILLIC_CHARSET + addr = CyrillicCharSet::load_data(addr); #endif - StandardCharSet::load_data(addr); + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + addr = WesternCharSet::load_data(addr); + #endif + addr = StandardCharSet::load_data(addr); } /** @@ -125,6 +138,9 @@ */ void FTDI::load_utf8_bitmaps(CommandProcessor &cmd) { + #ifdef TOUCH_UI_UTF8_CYRILLIC_CHARSET + CyrillicCharSet::load_bitmaps(cmd); + #endif #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET WesternCharSet::load_bitmaps(cmd); #endif @@ -145,6 +161,9 @@ uint16_t FTDI::get_utf8_char_width(utf8_char_t c, font_size_t fs) { int x = 0, y = 0; + #ifdef TOUCH_UI_UTF8_CYRILLIC_CHARSET + CyrillicCharSet::render_glyph(nullptr, x, y, fs, c) || + #endif #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET WesternCharSet::render_glyph(nullptr, x, y, fs, c) || #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h index 566f212187..b615c812eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h @@ -47,19 +47,20 @@ namespace FTDI { * pointer to the next character */ utf8_char_t get_utf8_char_and_inc(const char *&c); + utf8_char_t get_utf8_char_and_inc(char *&c); /* Returns the next character in a UTF8 string, without incrementing */ inline utf8_char_t get_utf8_char(const char *c) {return get_utf8_char_and_inc(c);} - void load_utf8_data(uint16_t addr); + void load_utf8_data(uint32_t addr); #else typedef char utf8_char_t; inline utf8_char_t get_utf8_char_and_inc(const char *&c) {return *c++;} inline utf8_char_t get_utf8_char(const char *c) {return *c;} - inline void load_utf8_data(uint16_t) {} + inline void load_utf8_data(uint32_t) {} #endif void load_utf8_bitmaps(CommandProcessor& cmd); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp index fc5d4de85d..4fb2f8fdbf 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp @@ -32,7 +32,7 @@ constexpr static uint8_t std_font = 31; constexpr static uint8_t alt_font = 1; - static uint32_t bitmap_addr; + uint32_t FTDI::WesternCharSet::bitmap_addr; /* Glyphs in the WesternCharSet bitmap */ @@ -286,7 +286,7 @@ #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) {UTF8('þ'), 0 , SML_THORN, 25 }, #endif - {UTF8('ÿ'), 'y', DIAERESIS, mid_y} + {UTF8('ÿ'), 'y', DIAERESIS, mid_y}, }; static_assert(UTF8('¡') == 0xC2A1, "Incorrect encoding for character"); @@ -331,7 +331,10 @@ * addr - Address in RAMG where the font data is written */ - void FTDI::WesternCharSet::load_data(uint32_t addr) { + uint32_t FTDI::WesternCharSet::load_data(uint32_t addr) { + if (addr % 4 != 0) + addr += 4 - (addr % 4); + // Load the alternative font metrics CLCD::FontMetrics alt_fm; alt_fm.ptr = addr + 148; @@ -352,9 +355,11 @@ CLCD::mem_write_bulk(addr, &alt_fm, 148); // Decode the RLE data and load it into RAMG as a bitmap - write_rle_data(addr + 148, font, sizeof(font)); + uint32_t lastaddr = write_rle_data(addr + 148, font, sizeof(font)); bitmap_addr = addr; + + return lastaddr; } /** @@ -394,7 +399,7 @@ * * c - The unicode code point to draw. If the renderer does not * support the character, it should return false. - + * * Returns: Whether the character was supported. */ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h index 652bd6b2eb..683093d866 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h @@ -21,8 +21,10 @@ namespace FTDI { class WesternCharSet { + private: + static uint32_t bitmap_addr; public: - static void load_data(uint32_t addr); + static uint32_t load_data(uint32_t addr); static void load_bitmaps(CommandProcessor&); static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py index a7de06d68b..0c4499e9aa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py @@ -49,19 +49,19 @@ class WriteSource: def convert_to_4bpp(self, data, chunk_size = 0): # Invert the image - data = map(lambda i: 255 - i, data) + data = list(map(lambda i: 255 - i, data)) # Quanitize 8-bit values into 4-bits - data = map(lambda i: i >> 4, data) + data = list(map(lambda i: i >> 4, data)) # Make sure there is an even number of elements if (len(data) & 1) == 1: - result.append(0) + data.append(0) # Combine each two adjacent values into one i = iter(data) - data = map(lambda a, b: a << 4 | b, i ,i) + data = list(map(lambda a, b: a << 4 | b, i ,i)) # Pack the data data = pack_rle(data) # Convert values into hex strings - return map(lambda a: "0x" + format(a, '02x'), data) + return list(map(lambda a: "0x" + format(a, '02x'), data)) def end_row(self, y): # Pad each row into even number of values diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 1877914bfb..3bf06a68c2 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -1016,7 +1016,7 @@ namespace ExtUI { } const char* FileList::filename() { - return IFSD(card.longFilename[0] ? card.longFilename : card.filename, ""); + return IFSD(card.longest_filename(), ""); } const char* FileList::shortFilename() { diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index db2a9e2de9..47875a08b1 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -1077,7 +1077,7 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { // If we have a longFilename buffer, mark it as invalid. // If a long filename is found it will be filled automatically. - if (longFilename) longFilename[0] = '\0'; + if (longFilename) { longFilename[0] = '\0'; longFilename[1] = '\0'; } while (1) { @@ -1089,7 +1089,7 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { // skip deleted entry and entry for . and .. if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') { - if (longFilename) longFilename[0] = '\0'; // Invalidate erased file long name, if any + if (longFilename) { longFilename[0] = '\0'; longFilename[1] = '\0'; } // Invalidate erased file long name, if any continue; } From a03ebfda52436199ce1e5674894229e02c841ff4 Mon Sep 17 00:00:00 2001 From: BsCmOD <64871957+BsCmOD@users.noreply.github.com> Date: Wed, 23 Dec 2020 08:01:18 +0100 Subject: [PATCH 0778/1370] Enhanced Italian language (#20551) --- Marlin/src/lcd/language/language_it.h | 50 +++++++++++++-------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index ba2fef456a..7437ae4479 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -41,12 +41,12 @@ namespace Language_it { using namespace Language_en; // Inherit undefined strings from English constexpr uint8_t CHARSIZE = 1; - PROGMEM Language_Str LANGUAGE = _UxGT("Italian"); + PROGMEM Language_Str LANGUAGE = _UxGT("Italiano"); - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronto."); + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronta."); PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("SI"); - PROGMEM Language_Str MSG_NO = _UxGT("NO"); + PROGMEM Language_Str MSG_YES = _UxGT("Si"); + PROGMEM Language_Str MSG_NO = _UxGT("No"); PROGMEM Language_Str MSG_BACK = _UxGT("Indietro"); PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Annullando..."); PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media inserito"); @@ -72,8 +72,8 @@ namespace Language_it { PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home asse Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); PROGMEM Language_Str MSG_ITERATION = _UxGT("Iterazione G34: %i"); - PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Precis.in calo!"); - PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Precis.raggiunta"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Precisione in calo!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Precisione raggiunta"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home assi XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premi per iniziare"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Punto successivo"); @@ -118,10 +118,10 @@ namespace Language_it { PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Muovi Asse"); PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Livella piano"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Livella piano"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Livella spigoli"); - PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Sollevare il letto finché la sonda non viene attivata"); - PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Tutti gli angoli entro tolleranza. Livella il piano"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Prossimo spigolo"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Calibra piano"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Regola la vite finche' la sonda non rileva il piano."); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Tolleranza raggiunta su tutti gli angoli. Piano livellato!"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Prossimo punto"); PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mesh"); PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifica Mesh"); PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Modif. Mesh Fermata"); @@ -447,7 +447,7 @@ namespace Language_it { PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Metti BLTouch a 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Metti BLTouch a OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Segnala modo"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERICOLO: Impostazioni errate possono cause danni! Procedo comunque?"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERICOLO: impostazioni errate possono cause danni! Procedo comunque?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inizializ.TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z offset"); @@ -644,12 +644,12 @@ namespace Language_it { PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Ripresa...")); #endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Drivers TMC"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver in uso"); + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Driver TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Correnti driver"); PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Soglia modo ibrido"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Azzer. senza sens."); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo stepping"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop abil."); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorless homing"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Stealthchop"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("Stealthchop"); PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Resetta"); PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" tra:"); @@ -667,16 +667,16 @@ namespace Language_it { PROGMEM Language_Str MSG_REHEAT = _UxGT("Riscalda"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Riscaldando..."); - PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Proc.guid.sonda Z"); - PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Tasteggio rif.Z"); - PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Movim.a pos.tasteg."); + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Wizard Z offset"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Altezza di riferimento sonda"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Spostati in posizione di rilevazione"); - PROGMEM Language_Str MSG_SOUND = _UxGT("Suono"); + PROGMEM Language_Str MSG_SOUND = _UxGT("Suoni"); - PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Alto Sinistra"); - PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Basso Sinistra"); - PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Alto Destra"); - PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Basso Destra"); + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Alto sinistra"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Basso sinistra"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Alto destra"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Basso destra"); PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibrazione completata"); - PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibrazion fallita"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibrazione fallita"); } From ec83a964841313c65402910d674e4822439a8dac Mon Sep 17 00:00:00 2001 From: Sebastiaan Dammann Date: Wed, 23 Dec 2020 08:02:27 +0100 Subject: [PATCH 0779/1370] Probe Activation Switch followup (#20550) --- Marlin/src/pins/stm32f1/pins_CREALITY_V452.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V453.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h index 35eea1da78..9acbb42a88 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h @@ -33,6 +33,6 @@ #define HEATER_0_PIN PA1 // HEATER1 #define HEATER_BED_PIN PA2 // HOT BED #define FAN_PIN PA0 // FAN -#define PROBE_ENABLE_PIN PC6 // Optoswitch to Enable Z Probe +#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Optoswitch to Enable Z Probe #include "pins_CREALITY_V45x.h" diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h index 836e5a91f1..f990b2f7b4 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h @@ -33,6 +33,6 @@ #define HEATER_0_PIN PB14 // HEATER1 #define HEATER_BED_PIN PB13 // HOT BED #define FAN_PIN PB15 // FAN -#define PROBE_ENABLE_PIN PB2 // Optoswitch to Enable Z Probe +#define PROBE_ACTIVATION_SWITCH_PIN PB2 // Optoswitch to Enable Z Probe #include "pins_CREALITY_V45x.h" From a24298f6253b56c25889d34b2843f05b4cbd44a6 Mon Sep 17 00:00:00 2001 From: Darren Peter Date: Wed, 23 Dec 2020 07:21:02 +0000 Subject: [PATCH 0780/1370] Support ANET_FULL_GRAPHICS_LCD_ALT_WIRING on BTT SKR 1.4 (#20427) --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 31 ++++++++++++++++++- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 2 +- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 86fbd18ba2..d599f2414f 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -260,7 +260,36 @@ #if HAS_WIRED_LCD && !HAS_BTT_EXP_MOT #if ENABLED(ANET_FULL_GRAPHICS_LCD_ALT_WIRING) - #error "ANET_FULL_GRAPHICS_LCD_ALT_WIRING only applies to the ANET 1.0 board." + #error "CAUTION! ANET_FULL_GRAPHICS_LCD_ALT_WIRING requires wiring modifications. See 'pins_BTT_SKR_V1_4.h' for details. Comment out this line to continue." + + /** + * 1. Cut the tab off the LCD connector so it can be plugged into the "EXP1" connector the other way. + * 2. Swap the LCD's +5V (Pin2) and GND (Pin1) wires. (This is the critical part!) + * + * !!! If you are unsure, ask for help! Your motherboard may be damaged in some circumstances !!! + * + * The ANET_FULL_GRAPHICS_LCD_ALT_WIRING connector plug: + * + * BEFORE AFTER + * _____ _____ + * GND | 1 2 | 5V 5V | 1 2 | GND + * CS | 3 4 | BTN_EN2 CS | 3 4 | BTN_EN2 + * SID | 5 6 BTN_EN1 SID | 5 6 BTN_EN1 + * open | 7 8 | BTN_ENC open | 7 8 | BTN_ENC + * CLK | 9 10| Beeper CLK | 9 10| Beeper + * ----- ----- + * LCD LCD + */ + + #define LCD_PINS_RS EXPA1_07_PIN + + #define BTN_EN1 EXPA1_05_PIN + #define BTN_EN2 EXPA1_04_PIN + #define BTN_ENC EXPA1_10_PIN + + #define LCD_PINS_ENABLE EXPA1_08_PIN + #define LCD_PINS_D4 EXPA1_06_PIN + #define BEEPER_PIN EXPA1_03_PIN #elif ENABLED(ANET_FULL_GRAPHICS_LCD) #error "CAUTION! ANET_FULL_GRAPHICS_LCD requires wiring modifications. See 'pins_BTT_SKR_V1_4.h' for details. Comment out this line to continue." diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 279c7e8100..533c92e067 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -104,7 +104,7 @@ // // LCD / Controller // -#if HAS_WIRED_LCD && DISABLED(LCD_USE_I2C_BUZZER) +#if !defined(BEEPER_PIN) && HAS_WIRED_LCD && DISABLED(LCD_USE_I2C_BUZZER) #define BEEPER_PIN P1_30 // (37) not 5V tolerant #endif From fa89a7b0bc1051c9133dd748e16127a50c8b190e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Dec 2020 15:33:34 -0600 Subject: [PATCH 0781/1370] Apply ENABLED in ExiUI / FTDI --- .../ftdi_eve_lib/basic/resolutions.h | 2 +- .../extended/command_processor.cpp | 2 +- .../ftdi_eve_lib/extended/command_processor.h | 10 +++---- .../ftdi_eve_lib/extended/dl_cache.cpp | 2 +- .../ftdi_eve_lib/extended/event_loop.cpp | 2 +- .../ftdi_eve_lib/extended/ftdi_extended.h | 2 +- .../ftdi_eve_lib/extended/grid_layout.h | 2 +- .../ftdi_eve_lib/extended/polygon.h | 2 +- .../ftdi_eve_lib/extended/screen_types.cpp | 2 +- .../ftdi_eve_lib/extended/screen_types.h | 6 ++-- .../ftdi_eve_lib/extended/sound_player.cpp | 2 +- .../ftdi_eve_lib/extended/text_box.cpp | 4 +-- .../ftdi_eve_lib/extended/text_ellipsis.cpp | 4 +-- .../ftdi_eve_lib/extended/tiny_timer.cpp | 14 ++------- .../extended/unicode/font_bitmaps.cpp | 2 +- .../ftdi_eve_lib/extended/unicode/unicode.h | 10 +++---- .../ftdi_eve_touch_ui/language/language_en.h | 2 +- .../screens/advanced_settings_menu.cpp | 2 +- .../base_numeric_adjustment_screen.cpp | 18 +++++------ .../screens/bed_mesh_screen.cpp | 2 +- .../screens/bio_status_screen.cpp | 10 +++---- .../ftdi_eve_touch_ui/screens/boot_screen.cpp | 8 ++--- .../screens/change_filament_screen.cpp | 16 +++++----- .../screens/cocoa_press_status_screen.cpp | 4 +-- .../screens/custom_user_menus.cpp | 2 +- .../screens/developer_menu.cpp | 2 +- .../screens/endstop_state_screen.cpp | 2 +- .../screens/filament_menu.cpp | 2 +- .../screens/files_screen.cpp | 4 +-- .../screens/interface_settings_screen.cpp | 6 ++-- .../screens/interface_sounds_screen.cpp | 2 +- .../screens/leveling_menu.cpp | 2 +- .../ftdi_eve_touch_ui/screens/lock_screen.cpp | 4 +-- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 30 +++---------------- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 22 -------------- .../lib/ftdi_eve_touch_ui/screens/screens.h | 24 +-------------- .../screens/status_screen.cpp | 10 +++---- .../screens/temperature_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 2 +- .../screens/widget_demo_screen.cpp | 4 +-- .../extui/lib/ftdi_eve_touch_ui/theme/fonts.h | 6 ++-- 41 files changed, 91 insertions(+), 165 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h index d90fc1e8f0..5b29816429 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h @@ -45,7 +45,7 @@ static_assert(thfp + thb + Hsize == th, "Mismatch in display th"); \ static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv"); -#ifdef TOUCH_UI_320x240 +#if ENABLED(TOUCH_UI_320x240) namespace FTDI { constexpr uint8_t Pclk = 8; constexpr uint8_t Pclkpol = 0; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp index a7777a97fe..e324cb978a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp @@ -21,7 +21,7 @@ #include "ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) CommandProcessor::btn_style_func_t *CommandProcessor::_btn_style_callback = CommandProcessor::default_button_style_func; bool CommandProcessor::is_tracking = false; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h index b27ed7f59e..da51ee6385 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h @@ -312,12 +312,12 @@ class CommandProcessor : public CLCD::CommandFifo { int8_t apply_fit_text(int16_t w, int16_t h, T text) { using namespace FTDI; int8_t font = _font; - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) const bool is_utf8 = has_utf8_chars(text); #endif for (;font > 26;) { int16_t width, height; - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) if (is_utf8) { width = get_utf8_text_width(text, font_size_t::from_romfont(font)); height = font_size_t::from_romfont(font).get_height(); @@ -345,7 +345,7 @@ class CommandProcessor : public CLCD::CommandFifo { template uint16_t text_width(T text) { using namespace FTDI; - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) if (has_utf8_chars(text)) return get_utf8_text_width(text, font_size_t::from_romfont(_font)); #endif @@ -362,7 +362,7 @@ class CommandProcessor : public CLCD::CommandFifo { #else const int8_t font = _font; #endif - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) if (has_utf8_chars(text)) draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(font), options); else @@ -401,7 +401,7 @@ class CommandProcessor : public CLCD::CommandFifo { const int8_t font = _font; #endif CLCD::CommandFifo::button(x, y, w, h, font, options); - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) if (has_utf8_chars(text)) { CLCD::CommandFifo::str(F("")); apply_text_alignment(x, y, w, h, OPT_CENTER); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp index 9f2b6dd35f..a13c36265e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -22,7 +22,7 @@ #include "ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) /* The Display List Cache mechanism stores the display list corresponding * to a menu into RAM_G so that on subsequent calls drawing the menu does diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp index 0808f2f4f2..6c0392c200 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp @@ -22,7 +22,7 @@ #include "ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) using namespace FTDI; enum { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h index 505016f5b8..fd84c795f1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -29,7 +29,7 @@ #define FTDI_EXTENDED #endif -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) #include "unicode/font_size_t.h" #include "unicode/unicode.h" #include "unicode/standard_char_set.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h index 490cbd4e54..82bb8abf7f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h @@ -88,7 +88,7 @@ } namespace FTDI { - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) constexpr uint16_t display_width = Vsize; constexpr uint16_t display_height = Hsize; #else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h index 202c3cd7fb..6aa52f09c9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h @@ -66,7 +66,7 @@ namespace FTDI { cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); // Drawing the edge strip along scan lines // seems to yield the best performance - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) path_initiator = EDGE_STRIP_B; #else path_initiator = EDGE_STRIP_R; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp index 81a081faae..944237bd28 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp @@ -21,7 +21,7 @@ #include "ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) /********************** VIRTUAL DISPATCH DATA TYPE ******************************/ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h index ef92361498..1581cbbbc7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -158,7 +158,7 @@ class UncachedScreen { using namespace FTDI; CommandProcessor cmd; cmd.cmd(CMD_DLSTART); - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_bitmaps(cmd); #endif @@ -199,7 +199,7 @@ class CachedScreen { CommandProcessor cmd; cmd.cmd(CMD_DLSTART); - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_bitmaps(cmd); #endif current_screen.onRedraw(BACKGROUND); @@ -222,7 +222,7 @@ class CachedScreen { dlcache.append(); } else { - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_bitmaps(cmd); #endif current_screen.onRedraw(BACKGROUND); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp index 481589854b..f9869320ba 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp @@ -21,7 +21,7 @@ #include "ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) namespace FTDI { SoundPlayer sound; // Global sound player object diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp index 18e5d4bc5b..b7422a06b1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp @@ -21,7 +21,7 @@ #include "ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) namespace FTDI { /** @@ -103,7 +103,7 @@ namespace FTDI { if (line[line_len - 1] == '\n' || line[line_len - 1] == ' ') line[line_len - 1] = 0; - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) if (has_utf8_chars(line)) { draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~OPT_CENTERY); } else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp index cdec6e5dd2..5fc89f1fa9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -21,7 +21,7 @@ #include "ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) namespace FTDI { @@ -60,7 +60,7 @@ namespace FTDI { } cmd.apply_text_alignment(x, y, w, h, options); - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) if (has_utf8_chars(str)) { draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options); } else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp index 2147dd7c8f..5219c0d041 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp @@ -21,15 +21,11 @@ #include "ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) bool tiny_timer_t::elapsed(tiny_time_t duration) { uint8_t now = tiny_time_t::tiny_time( - #ifdef __MARLIN_FIRMWARE__ - ExtUI::safe_millis() - #else - millis() - #endif + TERN(__MARLIN_FIRMWARE__, ExtUI::safe_millis(), millis()) ); uint8_t elapsed = now - _start; return elapsed >= duration._duration; @@ -37,11 +33,7 @@ bool tiny_timer_t::elapsed(tiny_time_t duration) { void tiny_timer_t::start() { _start = tiny_time_t::tiny_time( - #ifdef __MARLIN_FIRMWARE__ - ExtUI::safe_millis() - #else - millis() - #endif + TERN(__MARLIN_FIRMWARE__, ExtUI::safe_millis(), millis()) ); } #endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp index d04fe7d5b6..d9acb4f67a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp @@ -21,7 +21,7 @@ #include "../ftdi_extended.h" -#ifdef FTDI_EXTENDED +#if ENABLED(FTDI_EXTENDED) namespace FTDI { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h index b615c812eb..5bb87d9684 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h @@ -24,7 +24,7 @@ class CommandProcessor; namespace FTDI { - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) typedef uint16_t utf8_char_t; /** @@ -75,14 +75,14 @@ namespace FTDI { // Similar to CLCD::FontMetrics, but can be used with UTF8 encoded strings. struct FontMetrics { - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) font_size_t fs; #else CLCD::FontMetrics fm; #endif inline void load(uint8_t rom_font_size) { - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) fs = font_size_t::from_romfont(rom_font_size); #else fm.load(rom_font_size); @@ -90,7 +90,7 @@ namespace FTDI { } inline uint16_t get_char_width(utf8_char_t c) const { - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) return get_utf8_char_width(c, fs); #else return fm.char_widths[(uint8_t)c]; @@ -98,7 +98,7 @@ namespace FTDI { } inline uint8_t get_height() const { - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) return fs.get_height(); #else return fm.height; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index 09ac965e49..c898e7b737 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -146,7 +146,7 @@ namespace Language_en { PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; PROGMEM Language_Str MSG_SHOW_MESH = u8"Show Bed Mesh"; - #ifdef TOUCH_UI_LULZBOT_BIO + #if ENABLED(TOUCH_UI_LULZBOT_BIO) PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; PROGMEM Language_Str MSG_RAISE_PLUNGER = u8"Raise Plunger"; PROGMEM Language_Str MSG_RELEASE_XY_AXIS = u8"Release X and Y Axis"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 0b2dc911f1..9036fc144b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -37,7 +37,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { .cmd(CLEAR(true,true,true)); } - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING) #define GRID_ROWS 9 #else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp index a118d851df..2d11f6948f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp @@ -30,7 +30,7 @@ using namespace FTDI; using namespace Theme; -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 13 #define GRID_ROWS 10 #define LAYOUT_FONT font_small @@ -53,7 +53,7 @@ BaseNumericAdjustmentScreen::widgets_t::widgets_t(draw_mode_t what) : _what(what cmd.font(font_medium); _button(cmd, 1, - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) BTN_POS(1,10), BTN_SIZE(13,1), #else BTN_POS(15,7), BTN_SIZE(4,1), @@ -129,7 +129,7 @@ void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) { cmd.font(font_medium) .tag(0) .text( - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) BTN_POS(1, _line), BTN_SIZE(12,1), #else BTN_POS(5, _line), BTN_SIZE(8,1), @@ -141,7 +141,7 @@ void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) { _line++; } -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_PORTRAIT) #ifdef TOUCH_UI_800x480 #undef EDGE_R #define EDGE_R 20 @@ -172,7 +172,7 @@ void BaseNumericAdjustmentScreen::widgets_t::_draw_increment_btn(CommandProcesso const bool highlight = (_what & FOREGROUND) && (increment == tag); switch (pos) { - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) case 0: _button(cmd, tag, BTN_POS(5,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; case 1: _button(cmd, tag, BTN_POS(7,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; case 2: _button(cmd, tag, BTN_POS(9,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; @@ -192,7 +192,7 @@ void BaseNumericAdjustmentScreen::widgets_t::increments() { if (_what & BACKGROUND) { _button_style(cmd, TEXT_LABEL); cmd.tag(0).text( - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) BTN_POS(1, _line), BTN_SIZE(4,1), #else BTN_POS(15, 1), BTN_SIZE(4,1), @@ -205,7 +205,7 @@ void BaseNumericAdjustmentScreen::widgets_t::increments() { _draw_increment_btn(cmd, _line+1, 244 - _decimals); _draw_increment_btn(cmd, _line+1, 243 - _decimals); - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) _line++; #endif } @@ -308,7 +308,7 @@ void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str lab _button_style(cmd, TEXT_LABEL); cmd.font(font_small) .text( - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) BTN_POS(1, _line), BTN_SIZE( 8,1), #else BTN_POS(1, _line), BTN_SIZE(10,1), @@ -323,7 +323,7 @@ void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str lab .enabled(is_enabled) .font(font_small) .toggle2( - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) BTN_POS( 9,_line), BTN_SIZE(5,1), #else BTN_POS(10,_line), BTN_SIZE(4,1), diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index dbc4ba3b4b..2ed602a809 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -30,7 +30,7 @@ using namespace FTDI; using namespace Theme; using namespace ExtUI; -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 2 #define GRID_ROWS 10 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index c95d2d1dba..fc827e83e3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -73,7 +73,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { // The LulzBot Bio shows the temperature for // the bed. - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) // Draw touch surfaces ui.bounds(POLY(target_temp), x, y, h, v); cmd.rectangle(x, y, h, v); @@ -95,7 +95,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { .cmd(COLOR_RGB(bg_text_enabled)) .icon (x, y, h, v, Bed_Heat_Icon_Info, icon_scale * 2); - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_bitmaps(cmd); // Restore font bitmap handles #endif } @@ -105,7 +105,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { cmd.cmd(COLOR_RGB(bg_text_enabled)); cmd.font(font_medium); - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) format_temp(str, getTargetTemp_celsius(BED)); else @@ -204,7 +204,7 @@ void StatusScreen::draw_fine_motion(draw_mode_t what) { PolyUI ui(cmd, what); cmd.font( - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) font_medium #else font_small @@ -273,7 +273,7 @@ void StatusScreen::loadBitmaps() { CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); // Load fonts for internationalization - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_data(base + UTF8_FONT_OFFSET); #endif } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp index 40e49672d4..a6a8705350 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -30,14 +30,14 @@ #include "../ftdi_eve_lib/extras/poly_ui.h" #include "../archim2-flash/flash_storage.h" -#ifdef SHOW_CUSTOM_BOOTSCREEN - #ifdef TOUCH_UI_PORTRAIT +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + #if ENABLED(TOUCH_UI_PORTRAIT) #include "../theme/bootscreen_logo_portrait.h" #else #include "../theme/_bootscreen_landscape.h" #endif #else - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #include "../theme/marlin_bootscreen_portrait.h" #else #include "../theme/marlin_bootscreen_landscape.h" @@ -92,7 +92,7 @@ void BootScreen::onIdle() { StatusScreen::loadBitmaps(); - #ifdef TOUCH_UI_LULZBOT_BIO + #if ENABLED(TOUCH_UI_LULZBOT_BIO) GOTO_SCREEN(BioConfirmHomeXYZ); current_screen.forget(); PUSH_SCREEN(StatusScreen); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index 3f85fc9320..8f073365ff 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -101,7 +101,7 @@ void ChangeFilamentScreen::onExit() { void ChangeFilamentScreen::onRedraw(draw_mode_t what) { CommandProcessor cmd; - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 2 #define GRID_ROWS 11 #else @@ -114,13 +114,13 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { .cmd(CLEAR(true,true,true)) .cmd(COLOR_RGB(bg_text_enabled)) .tag(0) - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) .font(font_large) #else .font(font_medium) #endif .text(BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_EXTRUDER_SELECTION)) - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) .text(BTN_POS(1,7), BTN_SIZE(1,1), GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) #else .text(BTN_POS(3,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) @@ -142,14 +142,14 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { const rgb_t tcol = getWarmColor(getActualTemp_celsius(e), COOL_TEMP, LOW_TEMP, MED_TEMP, HIGH_TEMP); cmd.cmd(COLOR_RGB(tcol)) .tag(15) - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) .rectangle(BTN_POS(2,7), BTN_SIZE(1,1)) #else .rectangle(BTN_POS(3,2), BTN_SIZE(2,1)) #endif .cmd(COLOR_RGB(tcol.luminance() > 128 ? 0x000000 : 0xFFFFFF)) .font(font_medium) - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) .text(BTN_POS(2,7), BTN_SIZE(1,1), e_str) #else .text(BTN_POS(3,2), BTN_SIZE(2,1), e_str) @@ -177,7 +177,7 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { const bool tog11 = screen_data.ChangeFilamentScreen.e_tag == 11; #endif - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) cmd.font(font_large) #else cmd.font(font_medium) @@ -198,7 +198,7 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { cmd.font( - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) font_large #else font_small @@ -227,7 +227,7 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { .cmd(COLOR_MASK(1,1,1,1)) .cmd(COLOR_RGB(t_ok ? bg_text_enabled : bg_text_disabled)) - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) .font(font_large) .tag(0) .text (BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_UNLOAD_FILAMENT)) .text (BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_LOAD_FILAMENT)) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp index e3310abaa7..d9881d747a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -45,7 +45,7 @@ void StatusScreen::loadBitmaps() { constexpr uint32_t base = ftdi_memory_map::RAM_G; // Load fonts for internationalization - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_data(base + UTF8_FONT_OFFSET); #endif } @@ -111,7 +111,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { ui.bounds(POLY(h3_label), x, y, h, v); cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHAMBER)); - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_bitmaps(cmd); // Restore font bitmap handles #endif } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp index 4132226977..20f90d5a41 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp @@ -57,7 +57,7 @@ void CustomUserMenus::onRedraw(draw_mode_t what) { #define _MORE_THAN_TEN 0 #endif - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_ROWS 11 #define GRID_COLS (1 + _MORE_THAN_TEN) #define USER_ITEM_POS(N) BTN_POS((1+((N-1)/10)), ((N-1) % 10 + 1)), BTN_SIZE(1,1) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp index 89a7e1edf7..9df060a6c4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp @@ -52,7 +52,7 @@ void DeveloperMenu::onRedraw(draw_mode_t what) { #endif cmd.cmd(COLOR_RGB(bg_text_enabled)); - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_ROWS 10 #define GRID_COLS 1 cmd.font(font_large) .text ( BTN_POS(1,1), BTN_SIZE(1,1), F("Developer Menu")) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp index 864ba28623..a091197a87 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -53,7 +53,7 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { #define PIN_DISABLED(X,Y,LABEL,PIN) cmd.enabled(0).PIN_BTN(X,Y,PIN,LABEL); cmd.font( - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) font_large #else font_medium diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp index dfdba33b08..f63fc416dd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp @@ -30,7 +30,7 @@ using namespace FTDI; using namespace ExtUI; using namespace Theme; -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_ROWS 9 #define GRID_COLS 2 #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index 7c0129610d..112d70c074 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -67,7 +67,7 @@ uint16_t FilesScreen::getFileForTag(uint8_t tag) { return screen_data.FilesScreen.cur_page * files_per_page + tag - 2; } -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 6 #define GRID_ROWS (files_per_page + header_h + footer_h) #else @@ -151,7 +151,7 @@ void FilesScreen::drawHeader() { void FilesScreen::drawFooter() { #undef MARGIN_T #undef MARGIN_B - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define MARGIN_T 15 #define MARGIN_B 5 #else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp index 3f0e25f734..f0c6539bed 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -58,7 +58,7 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { #define GRID_COLS 4 - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_ROWS 7 #else #define GRID_ROWS 6 @@ -86,7 +86,7 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { } if (what & FOREGROUND) { - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) constexpr uint8_t w = 2; #else constexpr uint8_t w = 1; @@ -106,7 +106,7 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { #endif #undef EDGE_R #define EDGE_R 0 - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) .colors(normal_btn) .tag(6).button (BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(MSG_SOUNDS)) .colors(action_btn) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp index 8fb813e79f..3e60639304 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp @@ -84,7 +84,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { } if (what & FOREGROUND) { - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) constexpr uint8_t w = 2; #else constexpr uint8_t w = 1; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index bf1e2d522e..53dd5f4fc5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -34,7 +34,7 @@ using namespace FTDI; using namespace ExtUI; using namespace Theme; -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_ROWS 9 #define GRID_COLS 2 #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp index 193bb681ec..a3f2d09188 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp @@ -50,7 +50,7 @@ void LockScreen::onRedraw(draw_mode_t what) { } if (what & FOREGROUND) { - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 1 #define GRID_ROWS 10 #else @@ -81,7 +81,7 @@ void LockScreen::onRedraw(draw_mode_t what) { const uint8_t pressed = EventLoop::get_pressed_tag(); cmd.font(font_large) - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) .text(BTN_POS(1,2), BTN_SIZE(1,1), message) .font(font_xlarge) .text(BTN_POS(1,4), BTN_SIZE(1,1), screen_data.LockScreen.passcode) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 529daa2f83..146b799c20 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -1,25 +1,3 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - /***************** * main_menu.cpp * *****************/ @@ -59,7 +37,7 @@ void MainMenu::onRedraw(draw_mode_t what) { .cmd(CLEAR(true,true,true)); } - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_ROWS 8 #define GRID_COLS 2 #define ABOUT_PRINTER_POS BTN_POS(1,1), BTN_SIZE(2,1) @@ -129,15 +107,15 @@ bool MainMenu::onTouchEnd(uint8_t tag) { case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; case 2: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break; #if ENABLED(NOZZLE_CLEAN_FEATURE) - case 3: injectCommands_P(PSTR("G12")); GOTO_SCREEN(StatusScreen); break; + case 3: injectCommands_P(PSTR("G12")); GOTO_SCREEN(StatusScreen); break; #endif case 4: GOTO_SCREEN(MoveAxisScreen); break; case 5: injectCommands_P(PSTR("M84")); break; case 6: GOTO_SCREEN(TemperatureScreen); break; case 7: GOTO_SCREEN(ChangeFilamentScreen); break; case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; - #ifdef HAS_LEVELING - case 9: GOTO_SCREEN(LevelingMenu); break; + #if HAS_LEVELING + case 9: GOTO_SCREEN(LevelingMenu); break; #endif case 10: GOTO_SCREEN(AboutScreen); break; #if ENABLED(CUSTOM_USER_MENUS) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 5b3f9a201f..5841c38f53 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -1,25 +1,3 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - /*************** * screens.cpp * ***************/ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 265d6eb486..4a2a407bd7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -1,25 +1,3 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - /************* * screens.h * *************/ @@ -767,7 +745,7 @@ class LockScreen : public BaseScreen, public CachedScreen { class FilesScreen : public BaseScreen, public CachedScreen { private: - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) static constexpr uint8_t header_h = 2; static constexpr uint8_t footer_h = 2; static constexpr uint8_t files_per_page = 11; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index 61f59844c0..5764f46c82 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -32,7 +32,7 @@ using namespace FTDI; using namespace Theme; -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_ROWS 8 #else #define GRID_ROWS 8 @@ -43,7 +43,7 @@ void StatusScreen::draw_axis_position(draw_mode_t what) { #define GRID_COLS 3 - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define X_LBL_POS BTN_POS(1,5), BTN_SIZE(1,1) #define Y_LBL_POS BTN_POS(1,6), BTN_SIZE(1,1) #define Z_LBL_POS BTN_POS(1,7), BTN_SIZE(1,1) @@ -111,7 +111,7 @@ void StatusScreen::draw_axis_position(draw_mode_t what) { #undef GRID_COLS } -#ifdef TOUCH_UI_PORTRAIT +#if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 8 #else #define GRID_COLS 12 @@ -164,7 +164,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { .cmd (BITMAP_SIZE (Fan_Icon_Info)) .icon(ICON_POS(FAN_POS), Fan_Icon_Info, icon_scale); - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_bitmaps(cmd); // Restore font bitmap handles #endif } @@ -334,7 +334,7 @@ void StatusScreen::loadBitmaps() { CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon)); // Load fonts for internationalization - #ifdef TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) load_utf8_data(base + UTF8_FONT_OFFSET); #endif } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp index 0011306c7e..bdd434b5de 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp @@ -41,7 +41,7 @@ void TemperatureScreen::onRedraw(draw_mode_t what) { w.heading(GET_TEXT_F(MSG_TEMPERATURE)); w.button(30, GET_TEXT_F(MSG_COOLDOWN)); #ifndef NO_TOOLHEAD_HEATER_GCODE - #ifdef TOUCH_UI_COCOA_PRESS + #if ENABLED(TOUCH_UI_COCOA_PRESS) w.adjuster( 2, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0)); w.adjuster( 4, GET_TEXT_F(MSG_BODY), getTargetTemp_celsius(E1)); #if ENABLED(COCOA_PRESS_EXTRA_HEATER) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index f9df61bf6d..2fce402cf0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -38,7 +38,7 @@ void TuneMenu::onRedraw(draw_mode_t what) { .cmd(CLEAR(true,true,true)); } - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_ROWS 9 #define GRID_COLS 2 #define TEMPERATURE_POS BTN_POS(1,1), BTN_SIZE(2,1) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp index 6a9acbf8f1..96887102dc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp @@ -51,7 +51,7 @@ void WidgetsScreen::onRedraw(draw_mode_t) { const uint16_t m = (slider_val*12*60/0xFFFFU)%60; const uint16_t s = (slider_val*12*60*60/0xFFFFU)%60; - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 3 #define GRID_ROWS 8 cmd.font(font_large) @@ -113,7 +113,7 @@ bool WidgetsScreen::onTouchStart(uint8_t tag) { CommandProcessor cmd; switch (tag) { case 1: GOTO_PREVIOUS(); break; - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) case 2: cmd.track_circular (BTN_POS(1,2), BTN_SIZE(1,2), 2).execute(); break; case 4: cmd.track_linear (BTN_POS(2,3), BTN_SIZE(2,1), 4).execute(); break; case 5: cmd.track_linear (BTN_POS(2,4), BTN_SIZE(2,1), 5).execute(); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h index bdb9d492ab..7cc4e078ad 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h @@ -24,7 +24,7 @@ namespace Theme { #ifdef TOUCH_UI_800x480 - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) constexpr int16_t font_tiny = 26; constexpr int16_t font_xsmall = 28; constexpr int16_t font_small = 29; @@ -41,7 +41,7 @@ namespace Theme { #endif constexpr float icon_scale = 1.0; #elif defined(TOUCH_UI_480x272) - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) constexpr int16_t font_tiny = 26; constexpr int16_t font_xsmall = 26; constexpr int16_t font_small = 26; @@ -59,7 +59,7 @@ namespace Theme { constexpr float icon_scale = 0.6; #endif #elif defined(TOUCH_UI_320x240) - #ifdef TOUCH_UI_PORTRAIT + #if ENABLED(TOUCH_UI_PORTRAIT) constexpr int16_t font_tiny = 26; constexpr int16_t font_xsmall = 26; constexpr int16_t font_small = 26; From 156b5f4749ba9e525f495c3f91de43d3c3723fe2 Mon Sep 17 00:00:00 2001 From: LinFor Date: Thu, 24 Dec 2020 01:37:17 +0300 Subject: [PATCH 0782/1370] Remaining Time for FTDI EVE, bp for ExtUI (#20549) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 30 ++-- Marlin/src/inc/SanityCheck.h | 6 +- .../lib/ftdi_eve_touch_ui/screens/screens.h | 2 +- .../screens/status_screen.cpp | 161 ++++++++++++------ Marlin/src/lcd/extui/ui_api.cpp | 6 +- Marlin/src/lcd/extui/ui_api.h | 13 +- Marlin/src/lcd/marlinui.h | 23 ++- 7 files changed, 156 insertions(+), 85 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 446b308dfb..29d8e976cd 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1134,33 +1134,35 @@ #endif // HAS_LCD_MENU -// Scroll a longer status message into view -//#define STATUS_MESSAGE_SCROLLING +#if HAS_DISPLAY + // The timeout (in ms) to return to the status screen from sub-menus + //#define LCD_TIMEOUT_TO_STATUS 15000 -// On the Info Screen, display XY with one decimal place when possible -//#define LCD_DECIMAL_SMALL_XY + #if ENABLED(SHOW_BOOTSCREEN) + #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) + #endif -// The timeout (in ms) to return to the status screen from sub-menus -//#define LCD_TIMEOUT_TO_STATUS 15000 + // Scroll a longer status message into view + //#define STATUS_MESSAGE_SCROLLING -// Add an 'M73' G-code to set the current percentage -//#define LCD_SET_PROGRESS_MANUALLY + // On the Info Screen, display XY with one decimal place when possible + //#define LCD_DECIMAL_SMALL_XY -// Show the E position (filament used) during printing -//#define LCD_SHOW_E_TOTAL + // Add an 'M73' G-code to set the current percentage + //#define LCD_SET_PROGRESS_MANUALLY -#if ENABLED(SHOW_BOOTSCREEN) - #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) + // Show the E position (filament used) during printing + //#define LCD_SHOW_E_TOTAL #endif -#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) +#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL, EXTENSIBLE_UI) //#define SHOW_REMAINING_TIME // Display estimated time to completion #if ENABLED(SHOW_REMAINING_TIME) //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time #endif - #if HAS_MARLINUI_U8GLIB + #if EITHER(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI) //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b56177462f..a975ac1461 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3211,10 +3211,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #undef _PIN_CONFLICT #endif -#if !HAS_MARLINUI_U8GLIB - #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) - #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD." - #endif +#if NONE(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI) && ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) + #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD." #endif #if HAS_ADC_BUTTONS && defined(ADC_BUTTON_DEBOUNCE_DELAY) && ADC_BUTTON_DEBOUNCE_DELAY < 16 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 4a2a407bd7..4388eebae0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -277,7 +277,7 @@ class StatusScreen : public BaseScreen, public CachedScreen 0 && current_progress < progress_range + 1; + if (show_progress_bar) { + cmd.tag(0).font(font_medium) + .bgcolor(progress) + .progress(PROGRESSBAR_POS, current_progress, progress_range, OPT_FLAT); + } - char time_str[10]; char progress_str[10]; + sprintf_P(progress_str, + #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) + PSTR("%3d.%02d%%"), uint8_t(current_progress / 100), current_progress % 100 + #else + PSTR("%3d%%"), uint8_t(current_progress / 100) + #endif + ); - sprintf_P(time_str, PSTR(" %02d : %02d"), hrs, min); - sprintf_P(progress_str, PSTR("%-3d %%"), getProgress_percent() ); - - cmd.font(font_medium) - .tag(7).text(TIME_POS, time_str) - .text(PROGRESS_POS, progress_str); + #if ENABLED(TOUCH_UI_PORTRAIT) + const uint16_t texts_pos_h = show_progress_bar ? (BTN_H(1)) : (BTN_H(2)); + cmd.font(font_medium) + .tag(7).text(TIME_POS_X, PROGRESSZONE_FIRSTLINE_Y, TIME_POS_W, texts_pos_h, elapsed_str) + #if ENABLED(SHOW_REMAINING_TIME) + .text(REMAINING_POS_X, PROGRESSZONE_FIRSTLINE_Y, REMAINING_POS_W, texts_pos_h, remaining_str) + #endif + .text(PROGRESS_POS_X, PROGRESSZONE_FIRSTLINE_Y, PROGRESS_POS_W, texts_pos_h, progress_str); + #else + cmd.font(font_medium) + .tag(7).text(TIME_POS, elapsed_str) + #if ENABLED(SHOW_REMAINING_TIME) + .text(REMAINING_POS, remaining_str) + #endif + .text(PROGRESS_POS, progress_str); + #endif } + + #undef GRID_COLS } -#undef GRID_COLS - - void StatusScreen::draw_interaction_buttons(draw_mode_t what) { #define GRID_COLS 4 if (what & FOREGROUND) { using namespace ExtUI; #if ENABLED(TOUCH_UI_PORTRAIT) - #define MEDIA_BTN_POS BTN_POS(1,8), BTN_SIZE(2,1) - #define MENU_BTN_POS BTN_POS(3,8), BTN_SIZE(2,1) + #define MEDIA_BTN_POS BTN_POS(1,15), BTN_SIZE(2,2) + #define MENU_BTN_POS BTN_POS(3,15), BTN_SIZE(2,2) #else - #define MEDIA_BTN_POS BTN_POS(1,7), BTN_SIZE(2,2) - #define MENU_BTN_POS BTN_POS(3,7), BTN_SIZE(2,2) + #define MEDIA_BTN_POS BTN_POS(1,13), BTN_SIZE(2,4) + #define MENU_BTN_POS BTN_POS(3,13), BTN_SIZE(2,4) #endif const bool has_media = isMediaInserted() && !isPrintingFromMedia(); @@ -278,9 +329,9 @@ void StatusScreen::draw_status_message(draw_mode_t what, const char* message) { #define GRID_COLS 1 #if ENABLED(TOUCH_UI_PORTRAIT) - #define STATUS_POS BTN_POS(1,4), BTN_SIZE(1,1) + #define STATUS_POS BTN_POS(1,7), BTN_SIZE(1,2) #else - #define STATUS_POS BTN_POS(1,3), BTN_SIZE(1,2) + #define STATUS_POS BTN_POS(1,5), BTN_SIZE(1,4) #endif if (what & BACKGROUND) { diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 3bf06a68c2..7611dbb98a 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -245,7 +245,7 @@ namespace ExtUI { } #ifdef TOUCH_UI_LCD_TEMP_SCALING - #define GET_TEMP_ADJUSTMENT(A) float(A)/TOUCH_UI_LCD_TEMP_SCALING + #define GET_TEMP_ADJUSTMENT(A) (float(A) / (TOUCH_UI_LCD_TEMP_SCALING)) #else #define GET_TEMP_ADJUSTMENT(A) A #endif @@ -807,10 +807,6 @@ namespace ExtUI { #endif #endif - uint8_t getProgress_percent() { - return ui.get_progress_percent(); - } - uint32_t getProgress_seconds_elapsed() { const duration_t elapsed = print_job_timer.duration(); return elapsed.value; diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index cdf9b4412a..5322ac69ce 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -43,6 +43,7 @@ ****************************************************************************/ #include "../../inc/MarlinConfig.h" +#include "../marlinui.h" namespace ExtUI { @@ -129,9 +130,19 @@ namespace ExtUI { float getTravelAcceleration_mm_s2(); float getFeedrate_percent(); int16_t getFlowPercentage(const extruder_t); - uint8_t getProgress_percent(); + + inline uint8_t getProgress_percent() { return ui.get_progress_percent(); } + + #if HAS_PRINT_PROGRESS_PERMYRIAD + inline uint16_t getProgress_permyriad() { return ui.get_progress_permyriad(); } + #endif + uint32_t getProgress_seconds_elapsed(); + #if ENABLED(SHOW_REMAINING_TIME) + inline uint32_t getProgress_seconds_remaining() { return ui.get_remaining_time(); } + #endif + #if HAS_LEVELING bool getLevelingActive(); void setLevelingActive(const bool); diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 8e968abda0..e162dbdd2e 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -57,6 +57,10 @@ #define MULTI_MANUAL 1 #endif +#if HAS_DISPLAY + #include "../module/printcounter.h" +#endif + #if HAS_WIRED_LCD #include "../MarlinCore.h" @@ -357,11 +361,20 @@ public: static void set_progress(const progress_t p) { progress_override = _MIN(p, 100U * (PROGRESS_SCALE)); } static void set_progress_done() { progress_override = (PROGRESS_MASK + 1U) + 100U * (PROGRESS_SCALE); } static void progress_reset() { if (progress_override & (PROGRESS_MASK + 1U)) set_progress(0); } - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - static uint32_t remaining_time; - FORCE_INLINE static void set_remaining_time(const uint32_t r) { remaining_time = r; } - FORCE_INLINE static uint32_t get_remaining_time() { return remaining_time; } - FORCE_INLINE static void reset_remaining_time() { set_remaining_time(0); } + #if ENABLED(SHOW_REMAINING_TIME) + static inline uint32_t _calculated_remaining_time() { + const duration_t elapsed = print_job_timer.duration(); + const progress_t progress = _get_progress(); + return elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + } + #if ENABLED(USE_M73_REMAINING_TIME) + static uint32_t remaining_time; + FORCE_INLINE static void set_remaining_time(const uint32_t r) { remaining_time = r; } + FORCE_INLINE static uint32_t get_remaining_time() { return remaining_time ?: _calculated_remaining_time(); } + FORCE_INLINE static void reset_remaining_time() { set_remaining_time(0); } + #else + FORCE_INLINE static uint32_t get_remaining_time() { return _calculated_remaining_time(); } + #endif #endif #endif static progress_t _get_progress(); From a510c16838b1d19771d7b1a2dcea1df55e424a92 Mon Sep 17 00:00:00 2001 From: ubik2 Date: Wed, 23 Dec 2020 16:19:48 -0800 Subject: [PATCH 0783/1370] Add OPTIMIZED_MESH_STORAGE option (for UBL) (#20371) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 4 +++ Marlin/src/core/macros.h | 1 + Marlin/src/feature/bedlevel/ubl/ubl.cpp | 35 ++++++++++++++++----- Marlin/src/feature/bedlevel/ubl/ubl.h | 30 +++++++++--------- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/module/settings.cpp | 35 ++++++++++++++++++--- 6 files changed, 80 insertions(+), 27 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 29d8e976cd..1abb48fcb4 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1739,6 +1739,10 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +#if BOTH(AUTO_BED_LEVELING_UBL, EEPROM_SETTINGS) + //#define OPTIMIZED_MESH_STORAGE // Store mesh with less precision to save EEPROM space +#endif + /** * Repeatedly attempt G29 leveling until it succeeds. * Stop after G29_MAX_RETRIES attempts. diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 76e55ad3d2..058008646f 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -286,6 +286,7 @@ #define RSQRT(x) (1.0f / sqrtf(x)) #define CEIL(x) ceilf(x) #define FLOOR(x) floorf(x) +#define TRUNC(x) truncf(x) #define LROUND(x) lroundf(x) #define FMOD(x, y) fmodf(x, y) #define HYPOT(x,y) SQRT(HYPOT2(x,y)) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 087fdf42b2..fba065fed9 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -42,9 +42,7 @@ #include "math.h" - void unified_bed_leveling::echo_name() { - SERIAL_ECHOPGM("Unified Bed Leveling"); - } + void unified_bed_leveling::echo_name() { SERIAL_ECHOPGM("Unified Bed Leveling"); } void unified_bed_leveling::report_current_mesh() { if (!leveling_is_valid()) return; @@ -86,9 +84,7 @@ volatile int16_t unified_bed_leveling::encoder_diff; - unified_bed_leveling::unified_bed_leveling() { - reset(); - } + unified_bed_leveling::unified_bed_leveling() { reset(); } void unified_bed_leveling::reset() { const bool was_enabled = planner.leveling_active; @@ -113,6 +109,31 @@ } } + #if ENABLED(OPTIMIZED_MESH_STORAGE) + + constexpr float mesh_store_scaling = 1000; + constexpr int16_t Z_STEPS_NAN = INT16_MAX; + + void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { + auto z_to_store = [](const float &z) { + if (isnan(z)) return Z_STEPS_NAN; + const int32_t z_scaled = TRUNC(z * mesh_store_scaling); + if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) + return Z_STEPS_NAN; // If Z is out of range, return our custom 'NaN' + return int16_t(z_scaled); + }; + GRID_LOOP(x, y) stored_values[x][y] = z_to_store(in_values[x][y]); + } + + void unified_bed_leveling::set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values) { + auto store_to_z = [](const int16_t z_scaled) { + return z_scaled == Z_STEPS_NAN ? NAN : z_scaled / mesh_store_scaling; + }; + GRID_LOOP(x, y) out_values[x][y] = store_to_z(stored_values[x][y]); + } + + #endif // OPTIMIZED_MESH_STORAGE + static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) { SERIAL_ECHO_SP(sp); SERIAL_CHAR('('); @@ -127,7 +148,7 @@ static void serial_echo_column_labels(const uint8_t sp) { SERIAL_ECHO_SP(7); - for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + LOOP_L_N(i, GRID_MAX_POINTS_X) { if (i < 10) SERIAL_CHAR(' '); SERIAL_ECHO(i); SERIAL_ECHO_SP(sp); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 762becfb69..876063c878 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -41,6 +41,10 @@ struct mesh_index_pair; #define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) #define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) +#if ENABLED(OPTIMIZED_MESH_STORAGE) + typedef int16_t mesh_store_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; +#endif + class unified_bed_leveling { private: @@ -106,6 +110,10 @@ class unified_bed_leveling { static int8_t storage_slot; static bed_mesh_t z_values; + #if ENABLED(OPTIMIZED_MESH_STORAGE) + static void set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values); + static void set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values); + #endif static const float _mesh_index_to_xpos[GRID_MAX_POINTS_X], _mesh_index_to_ypos[GRID_MAX_POINTS_Y]; @@ -182,6 +190,12 @@ class unified_bed_leveling { return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1); } + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + #define _UBL_OUTER_Z_RAISE UBL_Z_RAISE_WHEN_OFF_MESH + #else + #define _UBL_OUTER_Z_RAISE NAN + #endif + /** * z_correction_for_x_on_horizontal_mesh_line is an optimization for * the case where the printer is making a vertical line that only crosses horizontal mesh lines. @@ -195,13 +209,7 @@ class unified_bed_leveling { } // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. - return ( - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - UBL_Z_RAISE_WHEN_OFF_MESH - #else - NAN - #endif - ); + return _UBL_OUTER_Z_RAISE; } const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), @@ -224,13 +232,7 @@ class unified_bed_leveling { } // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. - return ( - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - UBL_Z_RAISE_WHEN_OFF_MESH - #else - NAN - #endif - ); + return _UBL_OUTER_Z_RAISE; } const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 549fd7721f..598bfeee50 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -543,7 +543,7 @@ } else { const float cvf = parser.value_float(); - switch ((int)truncf(cvf * 10.0f) - 30) { // 3.1 -> 1 + switch ((int)TRUNC(cvf * 10.0f) - 30) { // 3.1 -> 1 #if ENABLED(UBL_G29_P31) case 1: { diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index ec549ea2f6..e667696007 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2385,12 +2385,14 @@ void MarlinSettings::postprocess() { // or down a little bit without disrupting the mesh data } + #define MESH_STORE_SIZE sizeof(TERN(OPTIMIZED_MESH_STORAGE, mesh_store_t, ubl.z_values)) + uint16_t MarlinSettings::calc_num_meshes() { - return (meshes_end - meshes_start_index()) / sizeof(ubl.z_values); + return (meshes_end - meshes_start_index()) / MESH_STORE_SIZE; } int MarlinSettings::mesh_slot_offset(const int8_t slot) { - return meshes_end - (slot + 1) * sizeof(ubl.z_values); + return meshes_end - (slot + 1) * MESH_STORE_SIZE; } void MarlinSettings::store_mesh(const int8_t slot) { @@ -2407,9 +2409,17 @@ void MarlinSettings::postprocess() { int pos = mesh_slot_offset(slot); uint16_t crc = 0; + #if ENABLED(OPTIMIZED_MESH_STORAGE) + int16_t z_mesh_store[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + ubl.set_store_from_mesh(ubl.z_values, z_mesh_store); + uint8_t * const src = (uint8_t*)&z_mesh_store; + #else + uint8_t * const src = (uint8_t*)&ubl.z_values; + #endif + // Write crc to MAT along with other data, or just tack on to the beginning or end persistentStore.access_start(); - const bool status = persistentStore.write_data(pos, (uint8_t *)&ubl.z_values, sizeof(ubl.z_values), &crc); + const bool status = persistentStore.write_data(pos, src, MESH_STORE_SIZE, &crc); persistentStore.access_finish(); if (status) SERIAL_ECHOLNPGM("?Unable to save mesh data."); @@ -2435,12 +2445,27 @@ void MarlinSettings::postprocess() { int pos = mesh_slot_offset(slot); uint16_t crc = 0; - uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&ubl.z_values; + #if ENABLED(OPTIMIZED_MESH_STORAGE) + int16_t z_mesh_store[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + uint8_t * const dest = (uint8_t*)&z_mesh_store; + #else + uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&ubl.z_values; + #endif persistentStore.access_start(); - const uint16_t status = persistentStore.read_data(pos, dest, sizeof(ubl.z_values), &crc); + const uint16_t status = persistentStore.read_data(pos, dest, MESH_STORE_SIZE, &crc); persistentStore.access_finish(); + #if ENABLED(OPTIMIZED_MESH_STORAGE) + if (into) { + float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + ubl.set_mesh_from_store(z_mesh_store, z_values); + memcpy(into, z_values, sizeof(z_values)); + } + else + ubl.set_mesh_from_store(z_mesh_store, ubl.z_values); + #endif + if (status) SERIAL_ECHOLNPGM("?Unable to load mesh data."); else DEBUG_ECHOLNPAIR("Mesh loaded from slot ", slot); From a5dd4028ac258cb4ac1d6c2b0836ef393a1ee923 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Dec 2020 19:57:49 -0600 Subject: [PATCH 0784/1370] Move BTT_SKR_CR6 --- Marlin/src/core/boards.h | 36 ++++++++++++++++++------------------ Marlin/src/pins/pins.h | 4 ++-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 0e27fc998b..ec82c3c41d 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -319,24 +319,24 @@ #define BOARD_BTT_SKR_MINI_E3_V2_0 4026 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) #define BOARD_BTT_SKR_MINI_MZ_V1_0 4027 // BigTreeTech SKR Mini MZ V1.0 (STM32F103RC) #define BOARD_BTT_SKR_E3_DIP 4028 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) -#define BOARD_JGAURORA_A5S_A1 4029 // JGAurora A5S A1 (STM32F103ZET6) -#define BOARD_FYSETC_AIO_II 4030 // FYSETC AIO_II -#define BOARD_FYSETC_CHEETAH 4031 // FYSETC Cheetah -#define BOARD_FYSETC_CHEETAH_V12 4032 // FYSETC Cheetah V1.2 -#define BOARD_LONGER3D_LK 4033 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 -#define BOARD_CCROBOT_MEEB_3DP 4034 // ccrobot-online.com MEEB_3DP (STM32F103RC) -#define BOARD_CHITU3D_V5 4035 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CHITU3D_V6 4036 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CREALITY_V4 4037 // Creality v4.x (STM32F103RE) -#define BOARD_CREALITY_V427 4038 // Creality v4.2.7 (STM32F103RE) -#define BOARD_CREALITY_V431 4039 // Creality v4.3.1 (STM32F103RE) -#define BOARD_CREALITY_V452 4040 // Creality v4.5.2 (STM32F103RE) -#define BOARD_CREALITY_V453 4041 // Creality v4.5.3 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4042 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4043 // FLY MINI (STM32F103RCT6) -#define BOARD_FLSUN_HISPEED 4044 // FLSUN HiSpeedV1 (STM32F103VET6) -#define BOARD_BEAST 4045 // STM32F103RET6 Libmaple-based controller -#define BOARD_BTT_SKR_CR6 4046 // BigTreeTech SKR CR6 v1.0 (STM32F103RE) +#define BOARD_BTT_SKR_CR6 4029 // BigTreeTech SKR CR6 v1.0 (STM32F103RE) +#define BOARD_JGAURORA_A5S_A1 4030 // JGAurora A5S A1 (STM32F103ZET6) +#define BOARD_FYSETC_AIO_II 4031 // FYSETC AIO_II +#define BOARD_FYSETC_CHEETAH 4032 // FYSETC Cheetah +#define BOARD_FYSETC_CHEETAH_V12 4033 // FYSETC Cheetah V1.2 +#define BOARD_LONGER3D_LK 4034 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 +#define BOARD_CCROBOT_MEEB_3DP 4035 // ccrobot-online.com MEEB_3DP (STM32F103RC) +#define BOARD_CHITU3D_V5 4036 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CHITU3D_V6 4037 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CREALITY_V4 4038 // Creality v4.x (STM32F103RE) +#define BOARD_CREALITY_V427 4039 // Creality v4.2.7 (STM32F103RE) +#define BOARD_CREALITY_V431 4040 // Creality v4.3.1 (STM32F103RE) +#define BOARD_CREALITY_V452 4041 // Creality v4.5.2 (STM32F103RE) +#define BOARD_CREALITY_V453 4042 // Creality v4.5.3 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4043 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4044 // FLY MINI (STM32F103RCT6) +#define BOARD_FLSUN_HISPEED 4045 // FLSUN HiSpeedV1 (STM32F103VET6) +#define BOARD_BEAST 4046 // STM32F103RET6 Libmaple-based controller // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 2218d2fe49..56508b9a21 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -510,6 +510,8 @@ #include "stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB #elif MB(BTT_SKR_E3_DIP) #include "stm32f1/pins_BTT_SKR_E3_DIP.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB +#elif MB(BTT_SKR_CR6) + #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RC_btt_512K_USB #elif MB(JGAURORA_A5S_A1) #include "stm32f1/pins_JGAURORA_A5S_A1.h" // STM32F1 env:jgaurora_a5s_a1 #elif MB(FYSETC_AIO_II) @@ -544,8 +546,6 @@ #include "stm32f1/pins_FLSUN_HISPEED.h" // STM32F1 env:flsun_hispeed #elif MB(BEAST) #include "stm32f1/pins_BEAST.h" // STM32F1 env:STM32F103RE -#elif MB(BTT_SKR_CR6) - #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RC_btt_512K_USB // // ARM Cortex-M4F From fadc8a1944600f849a660f8b52439524b7d768b2 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 23 Dec 2020 23:01:21 -0300 Subject: [PATCH 0785/1370] LVGL and Classic UI for STM32 (#20552) --- Marlin/src/HAL/STM32/HAL_SPI.cpp | 1 - Marlin/src/HAL/STM32/MarlinSPI.cpp | 12 ++++--- Marlin/src/HAL/STM32/tft/tft_fsmc.cpp | 30 ++++++++-------- Marlin/src/HAL/STM32/tft/tft_fsmc.h | 9 +++-- Marlin/src/HAL/STM32/tft/tft_spi.cpp | 10 ++++-- Marlin/src/HAL/STM32/tft/tft_spi.h | 7 ++++ Marlin/src/HAL/STM32/tft/xpt2046.cpp | 22 +----------- Marlin/src/HAL/STM32/tft/xpt2046.h | 5 +-- Marlin/src/gcode/calibrate/G34.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 17 +++++---- Marlin/src/lcd/tft/tft.h | 2 +- Marlin/src/lcd/tft_io/tft_io.h | 2 +- Marlin/src/lcd/touch/touch_buttons.cpp | 4 ++- Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 6 +++- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 24 ++----------- .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 26 ++------------ .../PlatformIO/scripts/anet_et4_openblt.py | 14 ++++++++ .../PlatformIO/scripts/stm32_bootloader.py | 10 +++--- .../variants/MARLIN_F4x7Vx/PeripheralPins.c | 4 +-- platformio.ini | 35 +++++++++++-------- 22 files changed, 113 insertions(+), 133 deletions(-) create mode 100644 buildroot/share/PlatformIO/scripts/anet_et4_openblt.py diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp index f947e6ef32..d79f72cad2 100644 --- a/Marlin/src/HAL/STM32/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp @@ -157,7 +157,6 @@ static SPISettings spiConfig; SPI.setMISO(MISO_PIN); SPI.setMOSI(MOSI_PIN); SPI.setSCLK(SCK_PIN); - SPI.setSSEL(SS_PIN); #endif SPI.begin(); diff --git a/Marlin/src/HAL/STM32/MarlinSPI.cpp b/Marlin/src/HAL/STM32/MarlinSPI.cpp index 399430f5eb..5086b41784 100644 --- a/Marlin/src/HAL/STM32/MarlinSPI.cpp +++ b/Marlin/src/HAL/STM32/MarlinSPI.cpp @@ -60,7 +60,6 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH _dmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; } #ifdef STM32F4xx - _dmaHandle.Init.Channel = DMA_CHANNEL_3; _dmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; #endif @@ -73,7 +72,8 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel3 : DMA1_Channel2; #elif defined(STM32F4xx) __HAL_RCC_DMA2_CLK_ENABLE(); - _dmaHandle.Instance = DMA2_Stream3; + _dmaHandle.Init.Channel = DMA_CHANNEL_3; + _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA2_Stream3 : DMA2_Stream0; #endif } #endif @@ -83,7 +83,9 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH __HAL_RCC_DMA1_CLK_ENABLE(); _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel5 : DMA1_Channel4; #elif defined(STM32F4xx) - //TODO: f4 dma config + __HAL_RCC_DMA1_CLK_ENABLE(); + _dmaHandle.Init.Channel = DMA_CHANNEL_0; + _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Stream4 : DMA1_Stream3; #endif } #endif @@ -93,7 +95,9 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH __HAL_RCC_DMA2_CLK_ENABLE(); _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA2_Channel2 : DMA2_Channel1; #elif defined(STM32F4xx) - //TODO: f4 dma config + __HAL_RCC_DMA1_CLK_ENABLE(); + _dmaHandle.Init.Channel = DMA_CHANNEL_0; + _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Stream5 : DMA1_Stream2; #endif } #endif diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp index 2a5ad4595b..87ca2dbbe1 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp @@ -154,29 +154,27 @@ uint32_t TFT_FSMC::ReadID(tft_data_t Reg) { } bool TFT_FSMC::isBusy() { - if (__IS_DMA_ENABLED(&DMAtx)) + #if defined(STM32F1xx) + volatile bool dmaEnabled = (DMAtx.Instance->CCR & DMA_CCR_EN) != RESET; + #elif defined(STM32F4xx) + volatile bool dmaEnabled = DMAtx.Instance->CR & DMA_SxCR_EN; + #endif + if (dmaEnabled) { if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) Abort(); - return __IS_DMA_ENABLED(&DMAtx); + } + else + Abort(); + return dmaEnabled; } void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { DMAtx.Init.PeriphInc = MemoryIncrease; HAL_DMA_Init(&DMAtx); - - __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)); - __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)); - - #ifdef STM32F1xx - DMAtx.Instance->CNDTR = Count; - DMAtx.Instance->CPAR = (uint32_t)Data; - DMAtx.Instance->CMAR = (uint32_t)&(LCD->RAM); - #elif defined(STM32F4xx) - DMAtx.Instance->NDTR = Count; - DMAtx.Instance->PAR = (uint32_t)Data; - DMAtx.Instance->M0AR = (uint32_t)&(LCD->RAM); - #endif - __HAL_DMA_ENABLE(&DMAtx); + DataTransferBegin(); + HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(LCD->RAM), Count); + HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); + Abort(); } #endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h index ad39d10d63..7c40151e2b 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h @@ -25,10 +25,8 @@ #ifdef STM32F1xx #include "stm32f1xx_hal.h" - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) #elif defined(STM32F4xx) #include "stm32f4xx_hal.h" - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) #else #error "FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware." #endif @@ -77,6 +75,13 @@ class TFT_FSMC { static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + while (Count > 0) { + TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count); + Count = Count > 0xFFFF ? Count - 0xFFFF : 0; + } + } }; diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp index 1c61d09529..3cb797d5f2 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -88,7 +88,7 @@ void TFT_SPI::Init() { #elif defined(STM32F4xx) __HAL_RCC_DMA1_CLK_ENABLE(); DMAtx.Instance = DMA1_Stream4; - DMAtx.Init.Channel = DMA_CHANNEL_4; + DMAtx.Init.Channel = DMA_CHANNEL_0; #endif } #endif @@ -101,7 +101,7 @@ void TFT_SPI::Init() { #elif defined(STM32F4xx) __HAL_RCC_DMA1_CLK_ENABLE(); DMAtx.Instance = DMA1_Stream5; - DMAtx.Init.Channel = DMA_CHANNEL_5; + DMAtx.Init.Channel = DMA_CHANNEL_0; #endif } #endif @@ -183,6 +183,9 @@ bool TFT_SPI::isBusy() { } void TFT_SPI::Abort() { + // Wait for any running spi + while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} + while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {} // First, abort any running dma HAL_DMA_Abort(&DMAtx); // DeInit objects @@ -223,6 +226,9 @@ void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Coun __HAL_SPI_ENABLE(&SPIx); SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ + + HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); + Abort(); } #endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.h b/Marlin/src/HAL/STM32/tft/tft_spi.h index d477b58c00..667b5f366b 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.h +++ b/Marlin/src/HAL/STM32/tft/tft_spi.h @@ -64,4 +64,11 @@ public: static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + while (Count > 0) { + TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count); + Count = Count > 0xFFFF ? Count - 0xFFFF : 0; + } + } }; diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp index 7e2dbfd15a..04294e669c 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp @@ -23,7 +23,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_TFT_XPT2046 +#if HAS_TFT_XPT2046 || HAS_TOUCH_BUTTONS #include "xpt2046.h" #include "pinconfig.h" @@ -31,7 +31,6 @@ uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } SPI_HandleTypeDef XPT2046::SPIx; -DMA_HandleTypeDef XPT2046::DMAtx; void XPT2046::Init() { SPI_TypeDef *spiInstance; @@ -71,34 +70,16 @@ void XPT2046::Init() { if (SPIx.Instance == SPI1) { __HAL_RCC_SPI1_CLK_ENABLE(); SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; - #ifdef STM32F1xx - DMAtx.Instance = DMA1_Channel3; - #elif defined(STM32F4xx) - DMAtx.Instance = DMA2_Stream3; // DMA2_Stream5 - #endif - //SERIAL_ECHO_MSG(" Touch Screen on SPI1"); } #endif #ifdef SPI2_BASE if (SPIx.Instance == SPI2) { __HAL_RCC_SPI2_CLK_ENABLE(); - #ifdef STM32F1xx - DMAtx.Instance = DMA1_Channel5; - #elif defined(STM32F4xx) - DMAtx.Instance = DMA1_Stream4; - #endif - //SERIAL_ECHO_MSG(" Touch Screen on SPI2"); } #endif #ifdef SPI3_BASE if (SPIx.Instance == SPI3) { __HAL_RCC_SPI3_CLK_ENABLE(); - #ifdef STM32F1xx - DMAtx.Instance = DMA2_Channel2; - #elif defined(STM32F4xx) - DMAtx.Instance = DMA1_Stream5; // DMA1_Stream7 - #endif - //SERIAL_ECHO_MSG(" Touch Screen on SPI3"); } #endif } @@ -107,7 +88,6 @@ void XPT2046::Init() { SET_INPUT(TOUCH_MISO_PIN); SET_OUTPUT(TOUCH_MOSI_PIN); SET_OUTPUT(TOUCH_SCK_PIN); - //SERIAL_ECHO_MSG(" Touch Screen on Software SPI"); } getRawData(XPT2046_Z1); diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h index 78cb7a4ba5..5b8acf4b87 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32/tft/xpt2046.h @@ -23,10 +23,8 @@ #ifdef STM32F1xx #include - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) #elif defined(STM32F4xx) #include - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) #endif #include "../../../inc/MarlinConfig.h" @@ -65,9 +63,8 @@ enum XPTCoordinate : uint8_t { class XPT2046 { private: static SPI_HandleTypeDef SPIx; - static DMA_HandleTypeDef DMAtx; - static bool isBusy() { return SPIx.Instance ? __IS_DMA_ENABLED(&DMAtx) : false; } + static bool isBusy() { return false; } static uint16_t getRawData(const XPTCoordinate coordinate); static bool isTouched(); diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index e8d4841172..bcca00dd42 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -42,7 +42,7 @@ void GcodeSuite::G34() { if (!all_axes_trusted()) home_all_axes(); TERN_(HAS_LEVELING, TEMPORARY_BED_LEVELING_STATE(false)); - + SET_SOFT_ENDSTOP_LOOSE(true); TemporaryGlobalEndstopsState unlock_z(false); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 7c581bef90..3e61eb6d4a 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1187,7 +1187,7 @@ // This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' #if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT #undef TOUCH_SCREEN - #if !HAS_TFT_LVGL_UI + #if ENABLED(TFT_CLASSIC_UI) #define HAS_TOUCH_BUTTONS 1 #endif #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index a975ac1461..0aadeef0ee 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3242,7 +3242,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) /** * Touch Buttons */ -#if ENABLED(TOUCH_SCREEN) +#if ENABLED(TOUCH_SCREEN) && DISABLED(TOUCH_SCREEN_CALIBRATION) #ifndef TOUCH_CALIBRATION_X #error "TOUCH_CALIBRATION_X must be defined with TOUCH_SCREEN." #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index cbb05bc356..7f88df7bc4 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -339,6 +339,8 @@ static uint8_t page; } #endif // HAS_TOUCH_BUTTONS +static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT + uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); @@ -352,19 +354,21 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u switch (msg) { case U8G_DEV_MSG_INIT: dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, nullptr); - tftio.Init(); - tftio.InitTFT(); - TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset()); if (preinit) { preinit = false; return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } + if (msgInitCount) return -1; + tftio.Init(); + tftio.InitTFT(); + TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset()); + // Clear Screen setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); #if HAS_LCD_IO - tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); + tftio.WriteMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT)); #else memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2); for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++) @@ -420,8 +424,6 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } -static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT - uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { if (msgInitCount) { if (msg == U8G_COM_MSG_INIT) msgInitCount--; @@ -433,8 +435,6 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p switch (msg) { case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_INIT: - u8g_SetPIOutput(u8g, U8G_PI_RESET); - u8g_Delay(50); isCommand = 0; break; @@ -443,7 +443,6 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p break; case U8G_COM_MSG_RESET: - u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); break; case U8G_COM_MSG_WRITE_BYTE: diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h index 159d0e1c19..431973b894 100644 --- a/Marlin/src/lcd/tft/tft.h +++ b/Marlin/src/lcd/tft/tft.h @@ -30,7 +30,7 @@ #include "../../inc/MarlinConfig.h" -#if TFT_INTERFACE_FSMC_8BIT +#if ENABLED(TFT_INTERFACE_FSMC_8BIT) // When we have a 8 bit interface, we need to invert the bytes of the color #define ENDIAN_COLOR(C) (((C) >> 8) | ((C) << 8)) #else diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h index aa081be486..2456358571 100644 --- a/Marlin/src/lcd/tft_io/tft_io.h +++ b/Marlin/src/lcd/tft_io/tft_io.h @@ -121,7 +121,7 @@ public: static void write_esc_sequence(const uint16_t *Sequence); // Deletaged methods - inline static void Init() { io.Init(); }; + inline static void Init() { io.Init(); io.Abort(); }; inline static bool isBusy() { return io.isBusy(); }; inline static void Abort() { io.Abort(); }; inline static uint32_t GetID() { return io.GetID(); }; diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp index 8e231ca9ab..3d1cc26cd6 100644 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -32,6 +32,7 @@ XPT2046 touchIO; #endif #include "../marlinui.h" // For EN_C bit mask +#include "../tft_io/tft_io.h" #define DOGM_AREA_LEFT TFT_PIXEL_OFFSET_X #define DOGM_AREA_TOP TFT_PIXEL_OFFSET_Y @@ -49,7 +50,8 @@ uint8_t TouchButtons::read_buttons() { #ifdef HAS_WIRED_LCD int16_t x, y; - if (!touchIO.getRawPoint(&x, &y)) return 0; + const bool is_touched = (TERN(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration.orientation, TOUCH_ORIENTATION) == TOUCH_PORTRAIT ? touchIO.getRawPoint(&y, &x) : touchIO.getRawPoint(&x, &y)); + if (!is_touched) return 0; #if ENABLED(TOUCH_SCREEN_CALIBRATION) const calibrationState state = touch_calibration.get_calibration_state(); diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h index c0bbe2f423..7f429d4497 100644 --- a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h @@ -139,11 +139,15 @@ #define TFT_RS_PIN PD13 #define TFT_INTERFACE_FSMC_8BIT +#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT +#define FSMC_CS_PIN TFT_CS_PIN +#define FSMC_RS_PIN TFT_RS_PIN + // // Touch Screen // https://ldm-systems.ru/f/doc/catalog/HY-TFT-2,8/XPT2046.pdf // -#if ENABLED(TOUCH_SCREEN) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB2 #define TOUCH_SCK_PIN PB0 #define TOUCH_MOSI_PIN PE5 diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index c48cbc9e56..e2b3f2c317 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -32,7 +32,7 @@ #define BOARD_INFO_NAME "MKS Robin Nano V3" // Avoid conflict with TIMER_TONE -#define STEP_TIMER 13 +#define STEP_TIMER 10 // Use one of these or SDCard-based Emulation will be used //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation @@ -255,7 +255,7 @@ * EXP1 EXP2 */ -#if EITHER(TFT_480x320_SPI, TFT_LVGL_UI_SPI) +#if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) #ifndef TOUCH_CALIBRATION_X #define TOUCH_CALIBRATION_X -17253 #endif @@ -345,26 +345,6 @@ #define BOARD_ST7920_DELAY_3 DELAY_NS(600) #endif // !MKS_MINI_12864 - -#elif ENABLED(SPI_GRAPHICAL_TFT) - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 - - #define LCD_BACKLIGHT_PIN PD13 - - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 #endif // HAS_SPI_LCD #define HAS_OTG_USB_HOST_SUPPORT diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index 40da409185..05648cf120 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -30,7 +30,7 @@ #define BOARD_INFO_NAME "MKS Robin PRO V2" // Avoid conflict with TIMER_TONE -#define STEP_TIMER 13 +#define STEP_TIMER 10 // Use one of these or SDCard-based Emulation will be used //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation @@ -243,7 +243,7 @@ // // LCD / Controller #define SPI_FLASH -// #define HAS_SPI_FLASH 1 +#define HAS_SPI_FLASH 1 #define SPI_DEVICE 2 #define SPI_FLASH_SIZE 0x1000000 #if ENABLED(SPI_FLASH) @@ -264,7 +264,7 @@ * EXP1 EXP2 */ -#if EITHER(TFT_480x320_SPI, TFT_LVGL_UI_SPI) +#if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) #ifndef TOUCH_CALIBRATION_X #define TOUCH_CALIBRATION_X -17253 #endif @@ -361,24 +361,4 @@ #endif #endif // !MKS_MINI_12864 - -#elif ENABLED(SPI_GRAPHICAL_TFT) - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 - - #define LCD_BACKLIGHT_PIN PD13 - - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 #endif // HAS_SPI_LCD diff --git a/buildroot/share/PlatformIO/scripts/anet_et4_openblt.py b/buildroot/share/PlatformIO/scripts/anet_et4_openblt.py new file mode 100644 index 0000000000..2911a28e78 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/anet_et4_openblt.py @@ -0,0 +1,14 @@ +# Generate the firmware as OpenBLT needs + +import os,sys +from os.path import join + +Import("env") + +env.AddPostAction( + "$BUILD_DIR/${PROGNAME}.elf", + env.VerboseAction(" ".join([ + "$OBJCOPY", "-O", "srec", + "\"$BUILD_DIR/${PROGNAME}.elf\"", "\"$BUILD_DIR/${PROGNAME}.srec\"" + ]), "Building " + join("$BUILD_DIR","${PROGNAME}.srec")) +) diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py index d517f1c8d1..7f49ea0e66 100644 --- a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py +++ b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py @@ -6,9 +6,7 @@ board = DefaultEnvironment().BoardConfig() def noencrypt(source, target, env): firmware = os.path.join(target[0].dir.path, board.get("build.firmware")) - # do not overwrite encrypted firmware if present - if not os.path.isfile(firmware): - shutil.copy(target[0].path, firmware) + shutil.copy(target[0].path, firmware) if 'offset' in board.get("build").keys(): LD_FLASH_OFFSET = board.get("build.offset") @@ -26,5 +24,7 @@ if 'offset' in board.get("build").keys(): if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) - if 'firmware' in board.get("build").keys(): - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt); +board_keys = board.get("build").keys() +# Only copy file if there's no encryptation +if 'firmware' in board_keys and not 'encrypt' in board_keys: + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt) diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c index 0fbd848dab..51ebf60581 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c @@ -254,7 +254,7 @@ WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} @@ -266,7 +266,7 @@ WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} diff --git a/platformio.ini b/platformio.ini index bf44808b32..a95647cf42 100644 --- a/platformio.ini +++ b/platformio.ini @@ -970,6 +970,7 @@ board_build.core = stm32 board_build.variant = MARLIN_F103Zx board_build.ldscript = ldscript.ld board_build.offset = 0x7000 +board_build.encrypt = Yes board_build.firmware = Robin.bin build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 -DTIMER_SERIAL=TIM5 @@ -1155,6 +1156,7 @@ board_build.variant = MARLIN_F103Vx board_build.ldscript = ldscript.ld board_build.offset = 0x7000 board_build.firmware = Robin_mini.bin +board_build.encrypt = Yes board_upload.offset_address = 0x08007000 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC extra_scripts = ${common.extra_scripts} @@ -1247,6 +1249,8 @@ board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx board_build.ldscript = ldscript.ld board_build.firmware = firmware.srec +# Just anet_et4_openblt.py generates the file, not stm32_bootloader.py +board_build.encrypt = Yes board_build.offset = 0x10000 board_upload.offset_address = 0x08010000 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 @@ -1255,6 +1259,7 @@ upload_protocol = jlink extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/anet_et4_openblt.py # # BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) @@ -1304,19 +1309,20 @@ extra_scripts = ${common.extra_scripts} # Lerdge base # [lerdge_common] -platform = ${common_stm32.platform} -extends = common_stm32 -board = LERDGE -board_build.offset = 0x10000 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/lerdge.py -build_flags = ${common_stm32.build_flags} +platform = ${common_stm32.platform} +extends = common_stm32 +board = LERDGE +board_build.offset = 0x10000 +board_build.encrypt = Yes +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/lerdge.py +build_flags = ${common_stm32.build_flags} -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE -DTRANSFER_CLOCK_DIV=8 -DHAL_SRAM_MODULE_ENABLED -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 # # Lerdge X @@ -1369,6 +1375,7 @@ board_build.core = stm32 board_build.variant = MARLIN_F103Vx board_build.ldscript = ldscript.ld board_build.offset = 0x7000 +board_build.encrypt = Yes board_build.firmware = Robin_nano35.bin board_upload.offset_address = 0x08007000 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC @@ -1385,19 +1392,18 @@ extra_scripts = ${common.extra_scripts} [env:mks_robin_pro2] platform = ${common_stm32.platform} extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_HCD_MODULE_ENABLED -DUSBHOST -DARDUINO_BLACK_F407VE +build_flags = ${common_stm32.build_flags} -DHAL_HCD_MODULE_ENABLED -DUSBHOST board = genericSTM32F407VET6 board_build.core = stm32 -board_build.variant = MARLIN_F407VE +board_build.variant = MARLIN_F4x7Vx board_build.ldscript = ldscript.ld -board_build.firmware = Robin_nano35.bin +board_build.firmware = firmware.bin build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC debug_tool = jlink upload_protocol = jlink extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/mks_encrypt.py # # MKS Robin Nano V3 @@ -1419,7 +1425,6 @@ upload_protocol = jlink extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/mks_encrypt.py ################################# # # From 121d4bf52ad209ac3330e7494e180938516a98f0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Dec 2020 20:22:58 -0600 Subject: [PATCH 0786/1370] Add "End Repeat Loops" menu item --- Marlin/src/feature/repeat.h | 4 ++++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_main.cpp | 9 +++++++++ 3 files changed, 14 insertions(+) diff --git a/Marlin/src/feature/repeat.h b/Marlin/src/feature/repeat.h index e293b2bbac..0f4d9425b7 100644 --- a/Marlin/src/feature/repeat.h +++ b/Marlin/src/feature/repeat.h @@ -39,6 +39,10 @@ private: static uint8_t index; public: static inline void reset() { index = 0; } + static inline bool is_active() { + LOOP_L_N(i, index) if (marker[i].counter) return true; + return false; + } static bool is_command_M808(char * const cmd) { return cmd[0] == 'M' && cmd[1] == '8' && cmd[2] == '0' && cmd[3] == '8' && !NUMERIC(cmd[4]); } static void early_parse_M808(char * const cmd); static void add_marker(const uint32_t sdpos, const uint16_t count); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 194a75c6a0..25460ed455 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -388,6 +388,7 @@ namespace Language_en { PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resume Print"); PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Host Start"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop Print"); + PROGMEM Language_Str MSG_END_LOOPS = _UxGT("End Repeat Loops"); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Printing Object"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancel Object"); PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancel Object ="); diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 968de3d4b8..b7cd549e6b 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -58,6 +58,10 @@ #include "../../feature/host_actions.h" #endif +#if ENABLED(GCODE_REPEAT_MARKERS) + #include "../../feature/repeat.h" +#endif + void menu_tune(); void menu_cancelobject(); void menu_motion(); @@ -120,6 +124,11 @@ void menu_main() { }); #endif + #if ENABLED(GCODE_REPEAT_MARKERS) + if (repeat.is_active()) + ACTION_ITEM(MSG_END_LOOPS, repeat.cancel); + #endif + SUBMENU(MSG_TUNE, menu_tune); #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) From 35e1917655225ef4399e8257fc04f97898ae1dd7 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 24 Dec 2020 00:34:09 -0300 Subject: [PATCH 0787/1370] Fix DOGM status message scrolling (#20557) --- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 29acb86941..751d47da55 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -892,6 +892,10 @@ void MarlinUI::draw_status_message(const bool blink) { } else { // String is longer than the available space + if (blink != last_blink) { + last_blink = blink; + advance_status_scroll(); + } // Get a pointer to the next valid UTF8 character // and the string remaining length @@ -911,11 +915,6 @@ void MarlinUI::draw_status_message(const bool blink) { } } } - - if (last_blink != blink) { - last_blink = blink; - advance_status_scroll(); - } } #else // !STATUS_MESSAGE_SCROLLING From f1bf1e1835b77f8f2d81c3abc7fcd2fb8745e1d0 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 23 Dec 2020 19:35:21 -0800 Subject: [PATCH 0788/1370] Fix ST7920 timing for Rumba32, Fysetc S6 (#20556) --- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index decf4aeb6b..7616d744cb 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -273,7 +273,7 @@ #define BOARD_ST7920_DELAY_2 DELAY_NS(48) #endif #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #define BOARD_ST7920_DELAY_3 DELAY_NS(640) #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 24c32d6d81..959e893edc 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -180,7 +180,7 @@ #define BOARD_ST7920_DELAY_2 DELAY_NS(48) #endif #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #define BOARD_ST7920_DELAY_3 DELAY_NS(640) #endif #endif From 089bfad4902506346020b25c0a4e3126ede1db41 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Dec 2020 22:23:45 -0600 Subject: [PATCH 0789/1370] Fix, clean up FTDI EVE Touch UI (#20466) Co-Authored-By: Marcio T. --- .../screens/change_filament_screen.cpp | 155 ++++++++---------- .../screens/status_screen.cpp | 10 +- .../screens/touch_calibration_screen.cpp | 3 + 3 files changed, 76 insertions(+), 92 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index 8f073365ff..3cb7942446 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -31,6 +31,43 @@ using namespace ExtUI; using namespace FTDI; using namespace Theme; +#ifdef TOUCH_UI_PORTRAIT + #define GRID_COLS 2 + #define GRID_ROWS 11 + #define E_TEMP_POS BTN_POS(2,7), BTN_SIZE(1,1) + #define E_TEMP_LBL_POS BTN_POS(1,7), BTN_SIZE(1,1) + #define UNLD_LABL_POS BTN_POS(1,8), BTN_SIZE(1,1) + #define LOAD_LABL_POS BTN_POS(2,8), BTN_SIZE(1,1) + #define UNLD_MOMN_POS BTN_POS(1,9), BTN_SIZE(1,1) + #define LOAD_MOMN_POS BTN_POS(2,9), BTN_SIZE(1,1) + #define UNLD_CONT_POS BTN_POS(1,10), BTN_SIZE(1,1) + #define LOAD_CONT_POS BTN_POS(2,10), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,11), BTN_SIZE(2,1) +#else + #define GRID_COLS 4 + #define GRID_ROWS 6 + #define E_TEMP_POS BTN_POS(3,2), BTN_SIZE(2,1) + #define E_TEMP_LBL_POS BTN_POS(3,1), BTN_SIZE(2,1) + #define UNLD_LABL_POS BTN_POS(3,3), BTN_SIZE(1,1) + #define LOAD_LABL_POS BTN_POS(4,3), BTN_SIZE(1,1) + #define UNLD_MOMN_POS BTN_POS(3,4), BTN_SIZE(1,1) + #define LOAD_MOMN_POS BTN_POS(4,4), BTN_SIZE(1,1) + #define UNLD_CONT_POS BTN_POS(3,5), BTN_SIZE(1,1) + #define LOAD_CONT_POS BTN_POS(4,5), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(3,6), BTN_SIZE(2,1) +#endif +#define REMOVAL_TEMP_LBL_POS BTN_POS(1,3), BTN_SIZE(2,1) +#define GRADIENT_POS BTN_POS(1,4), BTN_SIZE(1,3) +#define LOW_TEMP_POS BTN_POS(2,6), BTN_SIZE(1,1) +#define MED_TEMP_POS BTN_POS(2,5), BTN_SIZE(1,1) +#define HIG_TEMP_POS BTN_POS(2,4), BTN_SIZE(1,1) +#define HEATING_LBL_POS BTN_POS(1,6), BTN_SIZE(1,1) +#define CAUTION_LBL_POS BTN_POS(1,4), BTN_SIZE(1,1) +#define HOT_LBL_POS BTN_POS(1,6), BTN_SIZE(1,1) +#define E_SEL_LBL_POS BTN_POS(1,1), BTN_SIZE(2,1) +#define E1_SEL_POS BTN_POS(1,2), BTN_SIZE(1,1) +#define E2_SEL_POS BTN_POS(2,2), BTN_SIZE(1,1) + #define COOL_TEMP 40 #define LOW_TEMP 180 #define MED_TEMP 200 @@ -101,70 +138,45 @@ void ChangeFilamentScreen::onExit() { void ChangeFilamentScreen::onRedraw(draw_mode_t what) { CommandProcessor cmd; - #if ENABLED(TOUCH_UI_PORTRAIT) - #define GRID_COLS 2 - #define GRID_ROWS 11 - #else - #define GRID_COLS 4 - #define GRID_ROWS 6 - #endif - if (what & BACKGROUND) { cmd.cmd(CLEAR_COLOR_RGB(bg_color)) .cmd(CLEAR(true,true,true)) .cmd(COLOR_RGB(bg_text_enabled)) .tag(0) - #if ENABLED(TOUCH_UI_PORTRAIT) - .font(font_large) - #else - .font(font_medium) - #endif - .text(BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_EXTRUDER_SELECTION)) - #if ENABLED(TOUCH_UI_PORTRAIT) - .text(BTN_POS(1,7), BTN_SIZE(1,1), GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) - #else - .text(BTN_POS(3,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) - .font(font_small) - #endif - .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_REMOVAL_TEMPERATURE)); - drawTempGradient(BTN_POS(1,4), BTN_SIZE(1,3)); + .font(TERN(TOUCH_UI_PORTRAIT, font_large, font_medium)) + .text(E_SEL_LBL_POS, GET_TEXT_F(MSG_EXTRUDER_SELECTION)) + .text(E_TEMP_LBL_POS, GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) + .text(REMOVAL_TEMP_LBL_POS, GET_TEXT_F(MSG_REMOVAL_TEMPERATURE)); + drawTempGradient(GRADIENT_POS); } if (what & FOREGROUND) { + char str[15]; const extruder_t e = getExtruder(); - char e_str[15]; if (isHeaterIdle(e)) - format_temp_and_idle(e_str, getActualTemp_celsius(e)); + format_temp_and_idle(str, getActualTemp_celsius(e)); else - format_temp_and_temp(e_str, getActualTemp_celsius(e), getTargetTemp_celsius(e)); + format_temp_and_temp(str, getActualTemp_celsius(e), getTargetTemp_celsius(e)); const rgb_t tcol = getWarmColor(getActualTemp_celsius(e), COOL_TEMP, LOW_TEMP, MED_TEMP, HIGH_TEMP); cmd.cmd(COLOR_RGB(tcol)) .tag(15) - #if ENABLED(TOUCH_UI_PORTRAIT) - .rectangle(BTN_POS(2,7), BTN_SIZE(1,1)) - #else - .rectangle(BTN_POS(3,2), BTN_SIZE(2,1)) - #endif + .rectangle(E_TEMP_POS) .cmd(COLOR_RGB(tcol.luminance() > 128 ? 0x000000 : 0xFFFFFF)) .font(font_medium) - #if ENABLED(TOUCH_UI_PORTRAIT) - .text(BTN_POS(2,7), BTN_SIZE(1,1), e_str) - #else - .text(BTN_POS(3,2), BTN_SIZE(2,1), e_str) - #endif + .text(E_TEMP_POS, str) .colors(normal_btn); const bool t_ok = getActualTemp_celsius(e) > getSoftenTemp() - 10; if (screen_data.ChangeFilamentScreen.t_tag && !t_ok) { - cmd.text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(MSG_HEATING)); + cmd.text(HEATING_LBL_POS, GET_TEXT_F(MSG_HEATING)); } else if (getActualTemp_celsius(e) > 100) { cmd.cmd(COLOR_RGB(0xFF0000)) - .text(BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_CAUTION)) + .text(CAUTION_LBL_POS, GET_TEXT_F(MSG_CAUTION)) .colors(normal_btn) - .text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(MSG_HOT)); + .text(HOT_LBL_POS, GET_TEXT_F(MSG_HOT)); } #define TOG_STYLE(A) colors(A ? action_btn : normal_btn) @@ -177,79 +189,42 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { const bool tog11 = screen_data.ChangeFilamentScreen.e_tag == 11; #endif - #if ENABLED(TOUCH_UI_PORTRAIT) - cmd.font(font_large) - #else - cmd.font(font_medium) - #endif - .TOG_STYLE(tog10) - .tag(10) .button (BTN_POS(1,2), BTN_SIZE(1,1), F("1")) + cmd.TOG_STYLE(tog10) + .tag(10).button (E1_SEL_POS, F("1")) #if HOTENDS < 2 .enabled(false) #else .TOG_STYLE(tog11) #endif - .tag(11) .button (BTN_POS(2,2), BTN_SIZE(1,1), F("2")); + .tag(11).button (E2_SEL_POS, F("2")); if (!t_ok) reset_menu_timeout(); const bool tog7 = screen_data.ChangeFilamentScreen.repeat_tag == 7; const bool tog8 = screen_data.ChangeFilamentScreen.repeat_tag == 8; - - cmd.font( - #if ENABLED(TOUCH_UI_PORTRAIT) - font_large - #else - font_small - #endif - ); - { char str[30]; - format_temp(str, LOW_TEMP); - cmd.tag(2) .TOG_STYLE(tog2) .button (BTN_POS(2,6), BTN_SIZE(1,1), str); + cmd.tag(2) .TOG_STYLE(tog2).button (LOW_TEMP_POS, str); format_temp(str, MED_TEMP); - cmd.tag(3) .TOG_STYLE(tog3) .button (BTN_POS(2,5), BTN_SIZE(1,1), str); + cmd.tag(3) .TOG_STYLE(tog3).button (MED_TEMP_POS, str); format_temp(str, HIGH_TEMP); - cmd.tag(4) .TOG_STYLE(tog4) .button (BTN_POS(2,4), BTN_SIZE(1,1), str); + cmd.tag(4) .TOG_STYLE(tog4).button (HIG_TEMP_POS, str); } - cmd.colors(normal_btn) - // Add tags to color gradient - .cmd(COLOR_MASK(0,0,0,0)) - .tag(2) .rectangle(BTN_POS(1,6), BTN_SIZE(1,1)) - .tag(3) .rectangle(BTN_POS(1,5), BTN_SIZE(1,1)) - .tag(4) .rectangle(BTN_POS(1,4), BTN_SIZE(1,1)) - .cmd(COLOR_MASK(1,1,1,1)) - - .cmd(COLOR_RGB(t_ok ? bg_text_enabled : bg_text_disabled)) - #if ENABLED(TOUCH_UI_PORTRAIT) - .font(font_large) - .tag(0) .text (BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_UNLOAD_FILAMENT)) - .text (BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_LOAD_FILAMENT)) - .tag(5) .enabled(t_ok).button (BTN_POS(1,9), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) - .tag(6) .enabled(t_ok).button (BTN_POS(2,9), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) - .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(1,10), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) - .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(2,10), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) - .tag(1).colors(action_btn) .button (BTN_POS(1,11), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - #else - .font(font_small) - .tag(0) .text (BTN_POS(3,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_UNLOAD_FILAMENT)) - .text (BTN_POS(4,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_LOAD_FILAMENT)) - .tag(5) .enabled(t_ok).button (BTN_POS(3,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) - .tag(6) .enabled(t_ok).button (BTN_POS(4,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) - .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(3,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) - .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(4,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) - .font(font_medium) - .tag(1).colors(action_btn) .button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - #endif + cmd.cmd(COLOR_RGB(t_ok ? bg_text_enabled : bg_text_disabled)) + .tag(0) .text (UNLD_LABL_POS, GET_TEXT_F(MSG_UNLOAD_FILAMENT)) + .text (LOAD_LABL_POS, GET_TEXT_F(MSG_LOAD_FILAMENT)) + .colors(normal_btn) + .tag(5) .enabled(t_ok).button (UNLD_MOMN_POS, GET_TEXT_F(MSG_MOMENTARY)) + .tag(6) .enabled(t_ok).button (LOAD_MOMN_POS, GET_TEXT_F(MSG_MOMENTARY)) + .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (UNLD_CONT_POS, GET_TEXT_F(MSG_CONTINUOUS)) + .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (LOAD_CONT_POS, GET_TEXT_F(MSG_CONTINUOUS)) + .tag(1).colors(action_btn) .button (BACK_POS, GET_TEXT_F(MSG_BACK)); } - #undef GRID_COLS - #undef GRID_ROWS } uint8_t ChangeFilamentScreen::getSoftenTemp() { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index 8dc1c4643a..51f50343e0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -352,6 +352,13 @@ void StatusScreen::setStatusMessage(progmem_str message) { } void StatusScreen::setStatusMessage(const char* message) { + if (CommandProcessor::is_processing()) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_MSG("Cannot update status message, command processor busy"); + #endif + return; + } + CommandProcessor cmd; cmd.cmd(CMD_DLSTART) .cmd(CLEAR_COLOR_RGB(Theme::bg_color)) @@ -366,8 +373,7 @@ void StatusScreen::setStatusMessage(const char* message) { storeBackground(); #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("New status message: ", message); + SERIAL_ECHO_MSG("New status message: ", message); #endif if (AT_SCREEN(StatusScreen)) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp index 185512b57b..b5312add5a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp @@ -85,6 +85,9 @@ void TouchCalibrationScreen::onRedraw(draw_mode_t) { void TouchCalibrationScreen::onIdle() { if (!CLCD::is_touching() && !CommandProcessor::is_processing()) { GOTO_PREVIOUS(); + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_MSG("Calibration routine finished"); + #endif } } From 48bf80d190a95bfdfe720b9408a65ba00a70ce29 Mon Sep 17 00:00:00 2001 From: Vi B-P Date: Wed, 23 Dec 2020 23:43:33 -0500 Subject: [PATCH 0790/1370] Apply NO_MOTION_BEFORE_HOMING to joystick motion (#20462) Co-authored-by: Scott Lahteine --- Marlin/src/feature/joystick.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marlin/src/feature/joystick.cpp b/Marlin/src/feature/joystick.cpp index d9c5ae7c1b..d2041598a5 100644 --- a/Marlin/src/feature/joystick.cpp +++ b/Marlin/src/feature/joystick.cpp @@ -127,6 +127,11 @@ Joystick joystick; static bool injecting_now; // = false; if (injecting_now) return; + #if ENABLED(NO_MOTION_BEFORE_HOMING) + if (TERN0(HAS_JOY_ADC_X, axis_should_home(X_AXIS)) || TERN0(HAS_JOY_ADC_Y, axis_should_home(Y_AXIS)) || TERN0(HAS_JOY_ADC_Z, axis_should_home(Z_AXIS))) + return; + #endif + static constexpr int QUEUE_DEPTH = 5; // Insert up to this many movements static constexpr float target_lag = 0.25f, // Aim for 1/4 second lag seg_time = target_lag / QUEUE_DEPTH; // 0.05 seconds, short segments inserted every 1/20th of a second From f9dd484381d9aa53267ecefc8db2e87f9e27c8fa Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Wed, 23 Dec 2020 22:50:24 -0600 Subject: [PATCH 0791/1370] Cutter Power in percent format (#20410) Co-authored-by: Scott Lahteine Co-authored-by: Jason Smith Co-authored-by: Luu Lac <45380455+shitcreek@users.noreply.github.com> --- Marlin/src/feature/spindle_laser_types.h | 13 +++++++++---- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 1 - Marlin/src/lcd/menu/menu_item.h | 1 + Marlin/src/libs/numtostr.cpp | 16 ++++++++++------ Marlin/src/libs/numtostr.h | 5 ++++- buildroot/tests/BIGTREE_SKR_PRO-tests | 9 +++++++++ 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Marlin/src/feature/spindle_laser_types.h b/Marlin/src/feature/spindle_laser_types.h index 181c4d73ac..c2994fd5c9 100644 --- a/Marlin/src/feature/spindle_laser_types.h +++ b/Marlin/src/feature/spindle_laser_types.h @@ -39,12 +39,17 @@ typedef IF<(SPEED_POWER_MAX > 255), uint16_t, uint8_t>::type cutter_cpower_t; #if CUTTER_UNIT_IS(RPM) && SPEED_POWER_MAX > 255 typedef uint16_t cutter_power_t; - #define CUTTER_MENU_POWER_TYPE uint16_5 - #define cutter_power2str ui16tostr5rj + #define CUTTER_MENU_POWER_TYPE uint16_5 + #define cutter_power2str ui16tostr5rj #else typedef uint8_t cutter_power_t; - #define CUTTER_MENU_POWER_TYPE uint8 - #define cutter_power2str ui8tostr3rj + #if CUTTER_UNIT_IS(PERCENT) + #define CUTTER_MENU_POWER_TYPE percent_3 + #define cutter_power2str pcttostrpctrj + #else + #define CUTTER_MENU_POWER_TYPE uint8 + #define cutter_power2str ui8tostr3rj + #endif #endif #if ENABLED(MARLIN_DEV_MODE) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 751d47da55..985041ede5 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -618,7 +618,6 @@ void MarlinUI::draw_status_screen() { if (cutter.isReady && PAGE_CONTAINS(STATUS_CUTTER_TEXT_Y - INFO_FONT_ASCENT, STATUS_CUTTER_TEXT_Y - 1)) { #if CUTTER_UNIT_IS(PERCENT) lcd_put_u8str(STATUS_CUTTER_TEXT_X, STATUS_CUTTER_TEXT_Y, cutter_power2str(cutter.unitPower)); - lcd_put_wchar('%'); #elif CUTTER_UNIT_IS(RPM) lcd_put_u8str(STATUS_CUTTER_TEXT_X - 2, STATUS_CUTTER_TEXT_Y, ftostr51rj(float(cutter.unitPower) / 1000)); lcd_put_wchar('K'); diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 6430021223..188463c6c6 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -122,6 +122,7 @@ class TMenuEditItem : MenuEditItemBase { // NAME TYPE STRFUNC SCALE +ROUND DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, 0.5f); // 100% right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(percent_3 ,uint8_t ,pcttostrpctrj , 1 ); // 100% right-justified DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index c3efb2b25a..90696e9ad3 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -34,16 +34,20 @@ char conv[8] = { 0 }; #define INTFLOAT(V,N) (((V) * 10 * pow(10, N) + ((V) < 0 ? -5: 5)) / 10) // pow10? #define UINTFLOAT(V,N) INTFLOAT((V) < 0 ? -(V) : (V), N) -// Convert a full-range unsigned 8bit int to a percentage -const char* ui8tostr4pctrj(const uint8_t i) { - const uint8_t n = ui8_to_percent(i); - conv[3] = RJDIGIT(n, 100); - conv[4] = RJDIGIT(n, 10); - conv[5] = DIGIMOD(n, 1); +// Format uint8_t (0-100) as rj string with 123% / _12% / __1% format +const char* pcttostrpctrj(const uint8_t i) { + conv[3] = RJDIGIT(i, 100); + conv[4] = RJDIGIT(i, 10); + conv[5] = DIGIMOD(i, 1); conv[6] = '%'; return &conv[3]; } +// Convert uint8_t (0-255) to a percentage, format as above +const char* ui8tostr4pctrj(const uint8_t i) { + return pcttostrpctrj(ui8_to_percent(i)); +} + // Convert unsigned 8bit int to string 123 format const char* ui8tostr3rj(const uint8_t i) { conv[4] = RJDIGIT(i, 100); diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index e7c1e67e12..40c298af42 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -23,7 +23,10 @@ #include -// Convert a full-range unsigned 8bit int to a percentage +// Format uint8_t (0-100) as rj string with 123% / _12% / __1% format +const char* pcttostrpctrj(const uint8_t i); + +// Convert uint8_t (0-255) to a percentage, format as above const char* ui8tostr4pctrj(const uint8_t i); // Convert uint8_t to string with 12 format diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests index ff4a8d734e..8dc433deb2 100755 --- a/buildroot/tests/BIGTREE_SKR_PRO-tests +++ b/buildroot/tests/BIGTREE_SKR_PRO-tests @@ -28,5 +28,14 @@ opt_set Y_DRIVER_TYPE TMC2130 opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING PINS_DEBUGGING exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" "$3" +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 +opt_set SERIAL_PORT -1 +opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER +opt_set CUTTER_POWER_UNIT PERCENT +opt_add SPINDLE_LASER_PWM_PIN HEATER_1_PIN +opt_add SPINDLE_LASER_ENA_PIN HEATER_2_PIN +exec_test $1 $2 "Laser, LCD, PERCENT power unit" "$3" + # clean up restore_configs From e3d7603d546578cc673e7e35a426214f3ad564bd Mon Sep 17 00:00:00 2001 From: Ashammaru Date: Sun, 27 Dec 2020 02:01:54 +0100 Subject: [PATCH 0792/1370] Fix SPINDLE_LASER_FREQUENCY (#20509) --- Marlin/src/feature/spindle_laser.cpp | 21 ++++++++++++++------- Marlin/src/feature/spindle_laser.h | 8 +++++++- Marlin/src/lcd/menu/menu_spindle_laser.cpp | 2 +- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 3f65234782..7e17f393cd 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -43,7 +43,7 @@ cutter_power_t SpindleLaser::menuPower, // Power s #if ENABLED(MARLIN_DEV_MODE) cutter_frequency_t SpindleLaser::frequency; // PWM frequency setting; range: 2K - 50K #endif -#define SPINDLE_LASER_PWM_OFF ((SPINDLE_LASER_PWM_INVERT) ? 255 : 0) +#define SPINDLE_LASER_PWM_OFF TERN(SPINDLE_LASER_PWM_INVERT, 255, 0) // // Init the cutter to a safe OFF state @@ -71,16 +71,23 @@ void SpindleLaser::init() { /** * Set the cutter PWM directly to the given ocr value */ - void SpindleLaser::set_ocr(const uint8_t ocr) { - WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_STATE); // Turn spindle on - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + void SpindleLaser::_set_ocr(const uint8_t ocr) { #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY + set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), TERN(MARLIN_DEV_MODE, frequency, SPINDLE_LASER_FREQUENCY)); set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #else + analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); #endif } + + void SpindleLaser::set_ocr(const uint8_t ocr) { + WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_STATE); // Cutter ON + _set_ocr(ocr); + } + void SpindleLaser::ocr_off() { - WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Turn spindle off - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Only write low byte + WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Cutter OFF + _set_ocr(0); } #endif @@ -97,7 +104,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) { ocr_off(); isReady = false; } - else if (enabled() || ENABLED(CUTTER_POWER_RELATIVE)) { + else if (ENABLED(CUTTER_POWER_RELATIVE) || enabled()) { set_ocr(power); isReady = true; } diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 4d3c802411..b0b9c01ec4 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -117,6 +117,12 @@ public: #if ENABLED(SPINDLE_LASER_PWM) + private: + + static void _set_ocr(const uint8_t ocr); + + public: + static void set_ocr(const uint8_t ocr); static inline void set_ocr_power(const uint8_t ocr) { power = ocr; set_ocr(ocr); } static void ocr_off(); @@ -143,7 +149,7 @@ public: #elif CUTTER_UNIT_IS(RPM) 2 #else - #error "???" + #error "CUTTER_UNIT_IS(???)" #endif )); } diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index d5a291db74..f11b23d995 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -59,7 +59,7 @@ #endif #if BOTH(MARLIN_DEV_MODE, HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) - EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 50000, cutter.refresh_frequency); + EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 80000, cutter.refresh_frequency); #endif END_MENU(); From 6d3e22dd4a8b69e20e88f07c76358ecb0f921cd1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Dec 2020 16:26:18 -0600 Subject: [PATCH 0793/1370] Fix some comments --- Marlin/src/gcode/calibrate/G28.cpp | 1 + Marlin/src/module/probe.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 3d739c7ce8..e63f60994f 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -246,6 +246,7 @@ void GcodeSuite::G28() { set_bed_leveling_enabled(false); #endif + // Reset to the XY plane TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); // Count this command as movement / activity diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 02c1f55f4a..d93eda1303 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -548,10 +548,10 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); auto try_to_probe = [&](PGM_P const plbl, const float &z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) -> bool { - // Do a first probe at the fast speed - + // Tare the probe, if supported if (TERN0(PROBE_TARE, tare())) return true; + // Do a first probe at the fast speed const bool probe_fail = probe_down_to_z(z_probe_low_point, fr_mm_s), // No probe trigger? early_fail = (scheck && current_position.z > -offset.z + clearance); // Probe triggered too high? #if ENABLED(DEBUG_LEVELING_FEATURE) From 9947072d2d57534a7d3020534c662cc326b3102d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Dec 2020 16:15:15 -0600 Subject: [PATCH 0794/1370] Remove CREALITY_TOUCH --- Marlin/Configuration.h | 5 ----- Marlin/src/feature/bltouch.h | 13 +++---------- Marlin/src/inc/Conditionals_LCD.h | 5 ----- Marlin/src/inc/SanityCheck.h | 3 +-- 4 files changed, 4 insertions(+), 22 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ce24bd2117..d3b350bce4 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -896,11 +896,6 @@ */ //#define BLTOUCH -/** - * Pressure sensor with a BLTouch-like interface - */ -//#define CREALITY_TOUCH - /** * Touch-MI Probe by hotends.fr * diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h index 5880bdce75..8bd41f03e4 100644 --- a/Marlin/src/feature/bltouch.h +++ b/Marlin/src/feature/bltouch.h @@ -30,16 +30,9 @@ // BLTouch commands are sent as servo angles typedef unsigned char BLTCommand; -#if ENABLED(CREALITY_TOUCH) - #define STOW_ALARM false - #define BLTOUCH_DEPLOY 170 - #define BLTOUCH_STOW 20 -#else - #define STOW_ALARM true - #define BLTOUCH_DEPLOY 10 - #define BLTOUCH_STOW 90 -#endif - +#define STOW_ALARM true +#define BLTOUCH_DEPLOY 10 +#define BLTOUCH_STOW 90 #define BLTOUCH_SW_MODE 60 #define BLTOUCH_SELFTEST 120 #define BLTOUCH_MODE_STORE 130 diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 3e61eb6d4a..ed01f54a0b 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -653,11 +653,6 @@ #define SERIAL_CATCHALL 0 #endif -// Pressure sensor with a BLTouch-like interface -#if ENABLED(CREALITY_TOUCH) - #define BLTOUCH -#endif - /** * The BLTouch Probe emulates a servo probe * and uses "special" angles for its state. diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 0aadeef0ee..48a223d343 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1255,8 +1255,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS */ #if 1 < 0 \ + (DISABLED(BLTOUCH) && HAS_Z_SERVO_PROBE) \ - + (ENABLED(BLTOUCH) && DISABLED(CREALITY_TOUCH)) \ - + COUNT_ENABLED(PROBE_MANUALLY, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, CREALITY_TOUCH, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, RACK_AND_PINION_PROBE, SENSORLESS_PROBING) + + COUNT_ENABLED(PROBE_MANUALLY, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, RACK_AND_PINION_PROBE, SENSORLESS_PROBING) #error "Please enable only one probe option: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo." #endif From 10482ca49c898a1cefcdeb480573d015f0d0c3ee Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Dec 2020 16:21:01 -0600 Subject: [PATCH 0795/1370] Add probe_switch_activated --- Marlin/src/module/endstops.cpp | 9 +++------ Marlin/src/module/endstops.h | 8 ++++++++ Marlin/src/module/probe.cpp | 2 +- buildroot/tests/STM32F103RET6_creality-tests | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 1467e1b70d..b1c7c1c585 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -465,7 +465,7 @@ void _O2 Endstops::report_states() { ES_REPORT(Z4_MAX); #endif #if BOTH(MARLIN_DEV_MODE, PROBE_ACTIVATION_SWITCH) - print_es_state(READ(PROBE_ACTIVATION_SWITCH_PIN) == PROBE_ACTIVATION_SWITCH_STATE, PSTR(STR_PROBE_EN)); + print_es_state(probe_switch_activated(), PSTR(STR_PROBE_EN)); #endif #if HAS_CUSTOM_PROBE_PIN print_es_state(PROBE_TRIGGERED(), PSTR(STR_Z_PROBE)); @@ -618,11 +618,8 @@ void Endstops::update() { #if HAS_BED_PROBE // When closing the gap check the enabled probe - if (true - #if ENABLED(PROBE_ACTIVATION_SWITCH) - || READ(PROBE_ACTIVATION_SWITCH_PIN) == PROBE_ACTIVATION_SWITCH_STATE - #endif - ) UPDATE_ENDSTOP_BIT(Z, TERN(HAS_CUSTOM_PROBE_PIN, MIN_PROBE, MIN)); + if (probe_switch_activated()) + UPDATE_ENDSTOP_BIT(Z, TERN(HAS_CUSTOM_PROBE_PIN, MIN_PROBE, MIN)); #endif #if HAS_Z_MAX && !Z_SPI_SENSORLESS diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 888d25a8bd..05936a6bf3 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -116,6 +116,14 @@ class Endstops { ; } + static inline bool probe_switch_activated() { + return (true + #if ENABLED(PROBE_ACTIVATION_SWITCH) + && READ(PROBE_ACTIVATION_SWITCH_PIN) == PROBE_ACTIVATION_SWITCH_STATE + #endif + ); + } + /** * Report endstop hits to serial. Called from loop(). */ diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d93eda1303..df014bdc28 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -519,7 +519,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { */ bool Probe::tare() { #if BOTH(PROBE_ACTIVATION_SWITCH, PROBE_TARE_ONLY_WHILE_INACTIVE) - if (READ(PROBE_ACTIVATION_SWITCH_PIN) == PROBE_ACTIVATION_SWITCH_STATE) { + if (endstops.probe_switch_activated()) { SERIAL_ECHOLNPGM("Cannot tare an active probe"); return true; } diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests index cc3275741b..199bd6a9c2 100755 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -23,7 +23,7 @@ opt_set SERIAL_PORT 1 opt_set MOTHERBOARD BOARD_CREALITY_V452 opt_disable NOZZLE_TO_PROBE_OFFSET opt_enable NOZZLE_AS_PROBE Z_SAFE_HOMING Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN -opt_enable PROBE_ACTIVATION_SWITCH PROBE_ACTIVATION_SWITCH_PIN PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE +opt_enable PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE exec_test $1 $2 "Creality V4.5.2 PROBE_ACTIVATION_SWITCH, Probe Tare" "$3" # clean up From 892e83e8723ecd395b334c554fd13faa32534e04 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Dec 2020 16:23:18 -0600 Subject: [PATCH 0796/1370] Init tare pin once --- Marlin/src/MarlinCore.cpp | 6 +++++- Marlin/src/module/probe.cpp | 14 ++++++++++++-- Marlin/src/module/probe.h | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 0171690d4e..9a3de3f1ac 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -193,7 +193,7 @@ #include "feature/runout.h" #endif -#if HAS_Z_SERVO_PROBE +#if EITHER(PROBE_TARE, HAS_Z_SERVO_PROBE) #include "module/probe.h" #endif @@ -1119,6 +1119,10 @@ void setup() { SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.) #endif + #if ENABLED(PROBE_TARE) + SETUP_RUN(probe.tare_init()); + #endif + #if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION) SETUP_RUN(card.mount()); // Mount media with settings before first_load #endif diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index df014bdc28..53c35d69f2 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -510,6 +510,16 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { } #if ENABLED(PROBE_TARE) + + /** + * @brief Init the tare pin + * + * @details Init tare pin to ON state for a strain gauge, otherwise OFF + */ + void Probe::tare_init() { + OUT_WRITE(PROBE_TARE_PIN, !PROBE_TARE_STATE); + } + /** * @brief Tare the Z probe * @@ -526,9 +536,9 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { #endif SERIAL_ECHOLNPGM("Taring probe"); - OUT_WRITE(PROBE_TARE_PIN, PROBE_TARE_STATE); + WRITE(PROBE_TARE_PIN, PROBE_TARE_STATE); delay(PROBE_TARE_TIME); - OUT_WRITE(PROBE_TARE_PIN, !PROBE_TARE_STATE); + WRITE(PROBE_TARE_PIN, !PROBE_TARE_STATE); delay(PROBE_TARE_DELAY); endstops.hit_on_purpose(); diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 49520eb334..527f1190fa 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -211,6 +211,7 @@ public: #endif #if ENABLED(PROBE_TARE) + static void tare_init(); static bool tare(); #endif From 2e93923e2403c2062d69122f0ca9b3919d0a5ea0 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 27 Dec 2020 18:49:15 -0800 Subject: [PATCH 0797/1370] Validate defined probe points (#20572) --- Marlin/Configuration_adv.h | 6 +- Marlin/src/feature/tramming.h | 5 ++ Marlin/src/feature/z_stepper_align.cpp | 22 +----- Marlin/src/lcd/menu/menu_bed_corners.cpp | 5 ++ Marlin/src/module/probe.h | 94 ++++++++++++++++-------- 5 files changed, 79 insertions(+), 53 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1abb48fcb4..d871f822da 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -801,10 +801,10 @@ //#define ASSISTED_TRAMMING #if ENABLED(ASSISTED_TRAMMING) - // Define positions for probing points, use the hotend as reference not the sensor. - #define TRAMMING_POINT_XY { { 20, 20 }, { 200, 20 }, { 200, 200 }, { 20, 200 } } + // Define positions for probe points. + #define TRAMMING_POINT_XY { { 20, 20 }, { 180, 20 }, { 180, 180 }, { 20, 180 } } - // Define positions names for probing points. + // Define position names for probe points. #define TRAMMING_POINT_NAME_1 "Front-Left" #define TRAMMING_POINT_NAME_2 "Front-Right" #define TRAMMING_POINT_NAME_3 "Back-Right" diff --git a/Marlin/src/feature/tramming.h b/Marlin/src/feature/tramming.h index 79f7407716..e97fb2fde6 100644 --- a/Marlin/src/feature/tramming.h +++ b/Marlin/src/feature/tramming.h @@ -21,6 +21,7 @@ */ #include "../inc/MarlinConfigPre.h" +#include "../module/probe.h" #if !WITHIN(TRAMMING_SCREW_THREAD, 30, 51) || TRAMMING_SCREW_THREAD % 10 > 1 #error "TRAMMING_SCREW_THREAD must be equal to 30, 31, 40, 41, 50, or 51." @@ -31,6 +32,10 @@ constexpr xy_pos_t screws_tilt_adjust_pos[] = TRAMMING_POINT_XY; #define G35_PROBE_COUNT COUNT(screws_tilt_adjust_pos) static_assert(G35_PROBE_COUNT >= 3, "TRAMMING_POINT_XY requires at least 3 XY positions."); +#define VALIDATE_TRAMMING_POINT(N) static_assert(N >= G35_PROBE_COUNT || Probe::build_time::can_reach(screws_tilt_adjust_pos[N]), \ + "TRAMMING_POINT_XY point " STRINGIFY(N) " is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.") +VALIDATE_TRAMMING_POINT(0); VALIDATE_TRAMMING_POINT(1); VALIDATE_TRAMMING_POINT(2); VALIDATE_TRAMMING_POINT(3); VALIDATE_TRAMMING_POINT(4); + extern const char point_name_1[], point_name_2[], point_name_3[] #ifdef TRAMMING_POINT_NAME_4 , point_name_4[] diff --git a/Marlin/src/feature/z_stepper_align.cpp b/Marlin/src/feature/z_stepper_align.cpp index 87b1f6f251..21fe54d0e6 100644 --- a/Marlin/src/feature/z_stepper_align.cpp +++ b/Marlin/src/feature/z_stepper_align.cpp @@ -54,25 +54,9 @@ void ZStepperAlign::reset_to_default() { #endif ); - constexpr xyz_pos_t dpo = NOZZLE_TO_PROBE_OFFSET; - - #define LTEST(N) (xy_init[N].x >= _MAX(X_MIN_BED + PROBING_MARGIN_LEFT, X_MIN_POS + dpo.x) - 0.00001f) - #define RTEST(N) (xy_init[N].x <= _MIN(X_MAX_BED - PROBING_MARGIN_RIGHT, X_MAX_POS + dpo.x) + 0.00001f) - #define FTEST(N) (xy_init[N].y >= _MAX(Y_MIN_BED + PROBING_MARGIN_FRONT, Y_MIN_POS + dpo.y) - 0.00001f) - #define BTEST(N) (xy_init[N].y <= _MIN(Y_MAX_BED - PROBING_MARGIN_BACK, Y_MAX_POS + dpo.y) + 0.00001f) - - static_assert(LTEST(0) && RTEST(0), "The 1st Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); - static_assert(FTEST(0) && BTEST(0), "The 1st Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); - static_assert(LTEST(1) && RTEST(1), "The 2nd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); - static_assert(FTEST(1) && BTEST(1), "The 2nd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); - #if NUM_Z_STEPPER_DRIVERS >= 3 - static_assert(LTEST(2) && RTEST(2), "The 3rd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); - static_assert(FTEST(2) && BTEST(2), "The 3rd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); - #if NUM_Z_STEPPER_DRIVERS >= 4 - static_assert(LTEST(3) && RTEST(3), "The 4th Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); - static_assert(FTEST(3) && BTEST(3), "The 4th Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); - #endif - #endif + #define VALIDATE_ALIGN_POINT(N) static_assert(N >= NUM_Z_STEPPER_DRIVERS || Probe::build_time::can_reach(xy_init[N]), \ + "Z_STEPPER_ALIGN_XY point " STRINGIFY(N) " is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.") + VALIDATE_ALIGN_POINT(0); VALIDATE_ALIGN_POINT(1); VALIDATE_ALIGN_POINT(2); VALIDATE_ALIGN_POINT(3); #else // !defined(Z_STEPPER_ALIGN_XY) diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 56a97b5706..2252cbc49f 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -77,6 +77,11 @@ constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] */ #if ENABLED(LEVEL_CORNERS_USE_PROBE) + #define VALIDATE_POINT(X, Y, STR) static_assert(Probe::build_time::can_reach((X), (Y)), \ + "LEVEL_CORNERS_INSET_LFRB " STR " inset is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.") + VALIDATE_POINT(lf.x, Y_CENTER, "left"); VALIDATE_POINT(X_CENTER, lf.y, "front"); + VALIDATE_POINT(rb.x, Y_CENTER, "right"); VALIDATE_POINT(X_CENTER, rb.y, "back"); + void _lcd_draw_probing() { if (ui.should_draw()) MenuItem_static::draw((LCD_HEIGHT - 1) / 2, GET_TEXT(MSG_PROBING_MESH)); } diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 527f1190fa..d28cdff53a 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -62,12 +62,12 @@ public: #if HAS_PROBE_XY_OFFSET // Return true if the both nozzle and the probe can reach the given point. // Note: This won't work on SCARA since the probe offset rotates with the arm. - static inline bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) // The nozzle can go where it needs to go? && position_is_reachable(rx, ry, ABS(PROBING_MARGIN)); // Can the nozzle also go near there? } #else - FORCE_INLINE static bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx, ry, PROBING_MARGIN); } #endif @@ -81,7 +81,7 @@ public: * Example: For a probe offset of -10,+10, then for the probe to reach 0,0 the * nozzle must be be able to reach +10,-10. */ - static inline bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) && WITHIN(rx, min_x() - fslop, max_x() + fslop) && WITHIN(ry, min_y() - fslop, max_y() + fslop); @@ -89,13 +89,13 @@ public: #endif - static inline void move_z_after_probing() { + static void move_z_after_probing() { #ifdef Z_AFTER_PROBING do_z_clearance(Z_AFTER_PROBING, true, true, true); // Move down still permitted #endif } static float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); - static inline float probe_at_point(const xy_pos_t &pos, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true) { + static float probe_at_point(const xy_pos_t &pos, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true) { return probe_at_point(pos.x, pos.y, raise_after, verbose_level, probe_relative, sanity_check); } @@ -105,21 +105,21 @@ public: static bool set_deployed(const bool) { return false; } - FORCE_INLINE static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } + static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } #endif - static inline void move_z_after_homing() { + static void move_z_after_homing() { #ifdef Z_AFTER_HOMING do_z_clearance(Z_AFTER_HOMING, true, true, true); - #elif BOTH(Z_AFTER_PROBING,HAS_BED_PROBE) + #elif BOTH(Z_AFTER_PROBING, HAS_BED_PROBE) move_z_after_probing(); #endif } - FORCE_INLINE static bool can_reach(const xy_pos_t &pos) { return can_reach(pos.x, pos.y); } + static bool can_reach(const xy_pos_t &pos) { return can_reach(pos.x, pos.y); } - FORCE_INLINE static bool good_bounds(const xy_pos_t &lf, const xy_pos_t &rb) { + static bool good_bounds(const xy_pos_t &lf, const xy_pos_t &rb) { return ( #if IS_KINEMATIC can_reach(lf.x, 0) && can_reach(rb.x, 0) && can_reach(0, lf.y) && can_reach(0, rb.y) @@ -137,8 +137,8 @@ public: static constexpr xy_pos_t offset_xy = xy_pos_t({ 0, 0 }); // See #16767 #endif - static inline bool deploy() { return set_deployed(true); } - static inline bool stow() { return set_deployed(false); } + static bool deploy() { return set_deployed(true); } + static bool stow() { return set_deployed(false); } #if HAS_BED_PROBE || HAS_LEVELING #if IS_KINEMATIC @@ -146,41 +146,73 @@ public: TERN_(DELTA, DELTA_PRINTABLE_RADIUS) TERN_(IS_SCARA, SCARA_PRINTABLE_RADIUS) ); - static inline float probe_radius() { - return printable_radius - _MAX(PROBING_MARGIN, HYPOT(offset_xy.x, offset_xy.y)); + static constexpr float probe_radius(const xy_pos_t &probe_offset_xy = offset_xy) { + return printable_radius - _MAX(PROBING_MARGIN, HYPOT(probe_offset_xy.x, probe_offset_xy.y)); } #endif - static inline float min_x() { + static constexpr float _min_x(const xy_pos_t &probe_offset_xy = offset_xy) { return TERN(IS_KINEMATIC, - (X_CENTER) - probe_radius(), - _MAX((X_MIN_BED) + (PROBING_MARGIN_LEFT), (X_MIN_POS) + offset_xy.x) - ) - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.x)); + (X_CENTER) - probe_radius(probe_offset_xy), + _MAX((X_MIN_BED) + (PROBING_MARGIN_LEFT), (X_MIN_POS) + probe_offset_xy.x) + ); } - static inline float max_x() { + static constexpr float _max_x(const xy_pos_t &probe_offset_xy = offset_xy) { return TERN(IS_KINEMATIC, - (X_CENTER) + probe_radius(), - _MIN((X_MAX_BED) - (PROBING_MARGIN_RIGHT), (X_MAX_POS) + offset_xy.x) - ) - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.x)); + (X_CENTER) + probe_radius(probe_offset_xy), + _MIN((X_MAX_BED) - (PROBING_MARGIN_RIGHT), (X_MAX_POS) + probe_offset_xy.x) + ); } - static inline float min_y() { + static constexpr float _min_y(const xy_pos_t &probe_offset_xy = offset_xy) { return TERN(IS_KINEMATIC, - (Y_CENTER) - probe_radius(), - _MAX((Y_MIN_BED) + (PROBING_MARGIN_FRONT), (Y_MIN_POS) + offset_xy.y) - ) - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.y)); + (Y_CENTER) - probe_radius(probe_offset_xy), + _MAX((Y_MIN_BED) + (PROBING_MARGIN_FRONT), (Y_MIN_POS) + probe_offset_xy.y) + ); } - static inline float max_y() { + static constexpr float _max_y(const xy_pos_t &probe_offset_xy = offset_xy) { return TERN(IS_KINEMATIC, - (Y_CENTER) + probe_radius(), - _MIN((Y_MAX_BED) - (PROBING_MARGIN_BACK), (Y_MAX_POS) + offset_xy.y) - ) - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.y)); + (Y_CENTER) + probe_radius(probe_offset_xy), + _MIN((Y_MAX_BED) - (PROBING_MARGIN_BACK), (Y_MAX_POS) + probe_offset_xy.y) + ); } + static float min_x() { return _min_x() - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.x)); } + static float max_x() { return _max_x() - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.x)); } + static float min_y() { return _min_y() - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.y)); } + static float max_y() { return _max_y() - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.y)); } + + // constexpr helpers used in build-time static_asserts, relying on default probe offsets. + class build_time { + static constexpr xyz_pos_t default_probe_xyz_offset = + #if HAS_BED_PROBE + NOZZLE_TO_PROBE_OFFSET + #else + { 0 } + #endif + ; + static constexpr xy_pos_t default_probe_xy_offset = { default_probe_xyz_offset.x, default_probe_xyz_offset.y }; + + public: + static constexpr bool can_reach(float x, float y) { + #if IS_KINEMATIC + return HYPOT2(x, y) <= sq(probe_radius(default_probe_xy_offset)); + #else + return WITHIN(x, _min_x(default_probe_xy_offset) - fslop, _max_x(default_probe_xy_offset) + fslop) + && WITHIN(y, _min_y(default_probe_xy_offset) - fslop, _max_y(default_probe_xy_offset) + fslop); + #endif + } + + static constexpr bool can_reach(const xy_pos_t &point) { return can_reach(point.x, point.y); } + }; + #if NEEDS_THREE_PROBE_POINTS // Retrieve three points to probe the bed. Any type exposing set(X,Y) may be used. template - static inline void get_three_points(T points[3]) { + static void get_three_points(T points[3]) { #if HAS_FIXED_3POINT + #define VALIDATE_PROBE_PT(N) static_assert(Probe::build_time::can_reach(xy_pos_t{PROBE_PT_##N##_X, PROBE_PT_##N##_Y}), \ + "PROBE_PT_" STRINGIFY(N) "_(X|Y) is unreachable using default NOZZLE_TO_PROBE_OFFSET and PROBING_MARGIN"); + VALIDATE_PROBE_PT(1); VALIDATE_PROBE_PT(2); VALIDATE_PROBE_PT(3); points[0].set(PROBE_PT_1_X, PROBE_PT_1_Y); points[1].set(PROBE_PT_2_X, PROBE_PT_2_Y); points[2].set(PROBE_PT_3_X, PROBE_PT_3_Y); From 3395d10e82b1536da9eb2c36afb6525bf0b9fe86 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 23 Dec 2020 22:41:52 -0600 Subject: [PATCH 0798/1370] General cleanup --- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 48a223d343..7c4c73d1a9 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1878,7 +1878,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN." #elif !HAS_TEMP_ADC_PROBE #error "TEMP_PROBE_PIN must be an ADC pin." - #elif !ENABLED(FIX_MOUNTED_PROBE) + #elif DISABLED(FIX_MOUNTED_PROBE) #error "TEMP_SENSOR_PROBE shouldn't be set without FIX_MOUNTED_PROBE." #endif #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index d599f2414f..829c38ec45 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -280,7 +280,7 @@ * ----- ----- * LCD LCD */ - + #define LCD_PINS_RS EXPA1_07_PIN #define BTN_EN1 EXPA1_05_PIN From 214f6cb6e39dc3d066a00cba9e116d5698a28674 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Dec 2020 20:50:16 -0600 Subject: [PATCH 0799/1370] Allow define HOMING_FEEDRATE_(XY|Z) --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 7c4c73d1a9..949828d5f8 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -190,7 +190,7 @@ #error "ENDSTOPS_ONLY_FOR_HOMING is deprecated. Use (disable) ENDSTOPS_ALWAYS_ON_DEFAULT instead." #elif defined(HOMING_FEEDRATE) #error "HOMING_FEEDRATE is now set using the HOMING_FEEDRATE_MM_M array instead." -#elif defined(HOMING_FEEDRATE_XY) || defined(HOMING_FEEDRATE_Z) +#elif (defined(HOMING_FEEDRATE_XY) || defined(HOMING_FEEDRATE_Z)) && !defined(HOMING_FEEDRATE_MM_M) #error "HOMING_FEEDRATE_XY and HOMING_FEEDRATE_Z are now set using the HOMING_FEEDRATE_MM_M array instead." #elif defined(MANUAL_HOME_POSITIONS) #error "MANUAL_HOME_POSITIONS is deprecated. Set MANUAL_[XYZ]_HOME_POS as-needed instead." From adca49e432e78487806ea1c1b1976238707a8e51 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Dec 2020 21:00:07 -0600 Subject: [PATCH 0800/1370] Remove URL scheme --- Marlin/Version.h | 4 ++-- Marlin/src/core/boards.h | 2 +- Marlin/src/core/language.h | 2 +- Marlin/src/inc/Version.h | 4 ++-- Marlin/src/libs/heatshrink/heatshrink_common.h | 2 +- Marlin/src/pins/lpc1769/pins_FLY_CDY.h | 2 +- Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h | 2 +- Marlin/src/pins/ramps/pins_3DRAG.h | 2 +- Marlin/src/pins/ramps/pins_K8200.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAIN_2.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 2 +- Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 2 +- Marlin/src/pins/teensy2/pins_SAV_MKI.h | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index fe0724fbfc..eb2f9f9a14 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -54,7 +54,7 @@ * has a distinct Github fork— the Source Code URL should just be the main * Marlin repository. */ -//#define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" +//#define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin" /** * Default generic printer UUID. @@ -65,7 +65,7 @@ * The WEBSITE_URL is the location where users can get more information such as * documentation about a specific Marlin release. */ -//#define WEBSITE_URL "https://marlinfw.org" +//#define WEBSITE_URL "marlinfw.org" /** * Set the vendor info the serial USB interface, if changable diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index ec82c3c41d..3057f12b7f 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -189,7 +189,7 @@ #define BOARD_GEN3_PLUS 1601 // Gen3+ #define BOARD_GEN6 1602 // Gen6 #define BOARD_GEN6_DELUXE 1603 // Gen6 deluxe -#define BOARD_GEN7_CUSTOM 1604 // Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics" +#define BOARD_GEN7_CUSTOM 1604 // Gen7 custom (Alfons3 Version) https://github.com/Alfons3/Generation_7_Electronics #define BOARD_GEN7_12 1605 // Gen7 v1.1, v1.2 #define BOARD_GEN7_13 1606 // Gen7 v1.3 #define BOARD_GEN7_14 1607 // Gen7 v1.4 diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 98d155e1d1..d6048d293c 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -91,7 +91,7 @@ #define MACHINE_UUID DEFAULT_MACHINE_UUID #endif -#define MARLIN_WEBSITE_URL "https://marlinfw.org" +#define MARLIN_WEBSITE_URL "marlinfw.org" //#if !defined(STRING_SPLASH_LINE3) && defined(WEBSITE_URL) // #define STRING_SPLASH_LINE3 WEBSITE_URL diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 0cea923f6a..b69f15ad37 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -82,7 +82,7 @@ * providing the source code to your customers.) */ #ifndef SOURCE_CODE_URL - #define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" + #define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin" #endif /** @@ -97,7 +97,7 @@ * documentation about a specific Marlin release. Displayed in the Info Menu. */ #ifndef WEBSITE_URL - #define WEBSITE_URL "https://marlinfw.org" + #define WEBSITE_URL "marlinfw.org" #endif /** diff --git a/Marlin/src/libs/heatshrink/heatshrink_common.h b/Marlin/src/libs/heatshrink/heatshrink_common.h index c8dc95406e..68653e4793 100644 --- a/Marlin/src/libs/heatshrink/heatshrink_common.h +++ b/Marlin/src/libs/heatshrink/heatshrink_common.h @@ -4,7 +4,7 @@ #pragma once #define HEATSHRINK_AUTHOR "Scott Vokes " -#define HEATSHRINK_URL "https://github.com/atomicobject/heatshrink" +#define HEATSHRINK_URL "github.com/atomicobject/heatshrink" /* Version 0.4.1 */ #define HEATSHRINK_VERSION_MAJOR 0 diff --git a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h index b678917734..e9c943d4ae 100644 --- a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h +++ b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h @@ -26,7 +26,7 @@ #endif #define BOARD_INFO_NAME "FLY-CDY" -#define BOARD_WEBSITE_URL "https://github.com/FLYmaker/FLY-CDY" +#define BOARD_WEBSITE_URL "github.com/FLYmaker/FLY-CDY" // // Servos diff --git a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h index 52e757c534..0abea23a45 100644 --- a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h +++ b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h @@ -31,7 +31,7 @@ #define BOARD_INFO_NAME "Wanhao i3 Mini 0ne+" #define DEFAULT_MACHINE_NAME "i3 Mini" -#define BOARD_WEBSITE_URL "https://tinyurl.com/yyxw7se7" +#define BOARD_WEBSITE_URL "tinyurl.com/yyxw7se7" // // Limit Switches diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h index 5a0afdc550..6c7f7f4db6 100644 --- a/Marlin/src/pins/ramps/pins_3DRAG.h +++ b/Marlin/src/pins/ramps/pins_3DRAG.h @@ -34,7 +34,7 @@ #endif #ifndef DEFAULT_SOURCE_CODE_URL - #define DEFAULT_SOURCE_CODE_URL "https://3dprint.elettronicain.it/" + #define DEFAULT_SOURCE_CODE_URL "3dprint.elettronicain.it" #endif // diff --git a/Marlin/src/pins/ramps/pins_K8200.h b/Marlin/src/pins/ramps/pins_K8200.h index 5d4d2d7022..df685e0f0c 100644 --- a/Marlin/src/pins/ramps/pins_K8200.h +++ b/Marlin/src/pins/ramps/pins_K8200.h @@ -28,6 +28,6 @@ #define BOARD_INFO_NAME "Velleman K8200" #define DEFAULT_MACHINE_NAME "K8200" -#define DEFAULT_SOURCE_CODE_URL "https://github.com/CONSULitAS/Marlin-K8200" +#define DEFAULT_SOURCE_CODE_URL "github.com/CONSULitAS/Marlin-K8200" #include "pins_3DRAG.h" diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index c6251ae817..211caddba0 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -39,7 +39,7 @@ #define BOARD_INFO_NAME "Ultimaker 2.x" #define DEFAULT_MACHINE_NAME "Ultimaker" -#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" +#define DEFAULT_SOURCE_CODE_URL "github.com/Ultimaker/Marlin" // // Limit Switches diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index 116301f4d4..447138f53e 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -39,7 +39,7 @@ #define BOARD_INFO_NAME "Ultimaker" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" +#define DEFAULT_SOURCE_CODE_URL "github.com/Ultimaker/Marlin" // // Servos diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index 9b17384aaf..a59a000dff 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -74,7 +74,7 @@ #define BOARD_INFO_NAME "Ultimaker 1.5.4+" #endif #define DEFAULT_MACHINE_NAME "Ultimaker" -#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" +#define DEFAULT_SOURCE_CODE_URL "github.com/Ultimaker/Marlin" // // Limit Switches diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index 0c79f108f7..3cf68ac905 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -26,7 +26,7 @@ #endif #define BOARD_INFO_NAME "Zonestar ZMIB_V2" -#define BOARD_WEBSITE_URL "https://www.aliexpress.com/item/32957490744.html" +#define BOARD_WEBSITE_URL "www.aliexpress.com/item/32957490744.html" #define IS_ZMIB_V2 diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h index 4d083ecd12..bcc456c16e 100644 --- a/Marlin/src/pins/teensy2/pins_SAV_MKI.h +++ b/Marlin/src/pins/teensy2/pins_SAV_MKI.h @@ -68,7 +68,7 @@ #define BOARD_INFO_NAME "SAV MkI" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#define DEFAULT_SOURCE_CODE_URL "https://tinyurl.com/onru38b" +#define DEFAULT_SOURCE_CODE_URL "tinyurl.com/onru38b" // // Servos From a8800d5b0a7b204b8b988d633898babd9cb31532 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 27 Dec 2020 19:10:53 -0800 Subject: [PATCH 0801/1370] Small / Large Boot Screen option for TFT_COLOR_UI (#20578) --- Marlin/Configuration_adv.h | 4 +++- Marlin/src/lcd/tft/ui_320x240.cpp | 16 +++++++++++++--- Marlin/src/lcd/tft/ui_320x240.h | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 20 +++++++++++++------- Marlin/src/lcd/tft/ui_480x320.h | 2 +- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d871f822da..6b1febc8f5 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1140,6 +1140,9 @@ #if ENABLED(SHOW_BOOTSCREEN) #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) + #if EITHER(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI) + #define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash) + #endif #endif // Scroll a longer status message into view @@ -1450,7 +1453,6 @@ //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames //#define STATUS_HEAT_PERCENT // Show heating in a progress bar - //#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash) //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~‭3260 (or ~940) bytes of PROGMEM. // Frivolous Game Options diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index bcd1cb2ab9..2cc586a48a 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -92,10 +92,20 @@ void MarlinUI::clear_lcd() { tft.queue.reset(); tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); - tft.add_image(0, 0, imgBootScreen); // MarlinLogo320x240x16 - + #if ENABLED(BOOT_MARLIN_LOGO_SMALL) + #define BOOT_LOGO_W 195 // MarlinLogo195x59x16 + #define BOOT_LOGO_H 59 + #define SITE_URL_Y (TFT_HEIGHT - 46) + tft.set_background(COLOR_BACKGROUND); + #else + #define BOOT_LOGO_W 320 // MarlinLogo320x240x16 + #define BOOT_LOGO_H 240 + #define SITE_URL_Y (TFT_HEIGHT - 52) + #endif + tft.add_image((TFT_WIDTH - BOOT_LOGO_W) / 2, (TFT_HEIGHT - BOOT_LOGO_H) / 2, imgBootScreen); #ifdef WEBSITE_URL - tft.add_text(4, 188, COLOR_WEBSITE_URL, WEBSITE_URL); + tft_string.set(WEBSITE_URL); + tft.add_text(tft_string.center(TFT_WIDTH), SITE_URL_Y, COLOR_WEBSITE_URL, tft_string); #endif tft.queue.sync(); diff --git a/Marlin/src/lcd/tft/ui_320x240.h b/Marlin/src/lcd/tft/ui_320x240.h index c9822f11cc..0f928eea37 100644 --- a/Marlin/src/lcd/tft/ui_320x240.h +++ b/Marlin/src/lcd/tft/ui_320x240.h @@ -44,7 +44,7 @@ void menu_item(const uint8_t row, bool sel = false); #define ABSOLUTE_ZERO -273.15 const tImage Images[imgCount] = { - MarlinLogo320x240x16, + TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MarlinLogo320x240x16), HotEnd_64x64x4, Bed_64x64x4, Bed_Heated_64x64x4, diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 9e387b2402..8d05ab7df4 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -90,18 +90,24 @@ void MarlinUI::clear_lcd() { } #if ENABLED(SHOW_BOOTSCREEN) - #undef BOOTSCREEN_TIMEOUT - #define BOOTSCREEN_TIMEOUT 5000 - void MarlinUI::show_bootscreen() { tft.queue.reset(); tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft.add_image(142, 130, imgBootScreen); // MarlinLogo195x59x16 - + #if ENABLED(BOOT_MARLIN_LOGO_SMALL) + #define BOOT_LOGO_W 195 // MarlinLogo195x59x16 + #define BOOT_LOGO_H 59 + #define SITE_URL_Y (TFT_HEIGHT - 70) + tft.set_background(COLOR_BACKGROUND); + #else + #define BOOT_LOGO_W 480 // MarlinLogo480x320x16 + #define BOOT_LOGO_H 320 + #define SITE_URL_Y (TFT_HEIGHT - 90) + #endif + tft.add_image((TFT_WIDTH - BOOT_LOGO_W) / 2, (TFT_HEIGHT - BOOT_LOGO_H) / 2, imgBootScreen); #ifdef WEBSITE_URL - tft.add_text(8, 250, COLOR_WEBSITE_URL, WEBSITE_URL); + tft_string.set(WEBSITE_URL); + tft.add_text(tft_string.center(TFT_WIDTH), SITE_URL_Y, COLOR_WEBSITE_URL, tft_string); #endif tft.queue.sync(); diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h index 053ee78158..cc62ee8cce 100644 --- a/Marlin/src/lcd/tft/ui_480x320.h +++ b/Marlin/src/lcd/tft/ui_480x320.h @@ -44,7 +44,7 @@ void menu_item(const uint8_t row, bool sel = false); #define ABSOLUTE_ZERO -273.15 const tImage Images[imgCount] = { - MarlinLogo195x59x16, + TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MarlinLogo480x320x16), HotEnd_64x64x4, Bed_64x64x4, Bed_Heated_64x64x4, From 910908fb32ca1d097527ab527c820448f875e757 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 28 Dec 2020 02:08:06 -0300 Subject: [PATCH 0802/1370] Better defaults, compatibility for SDIO + STM32 (#20570) --- .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 60 ++++++++++--------- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 2 + Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 1 + Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 1 + Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 1 + platformio.ini | 8 +-- 6 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index a7b1e8006f..e00fb9b16f 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -88,18 +88,37 @@ MKS Robin board seems to have stable SDIO with BusWide 1bit and ClockDiv 8 i.e. 4.8MHz SDIO clock frequency Additional testing is required as there are clearly some 4bit initialization problems - - Add -DTRANSFER_CLOCK_DIV=8 to build parameters to improve SDIO stability */ - #ifndef TRANSFER_CLOCK_DIV - #define TRANSFER_CLOCK_DIV (uint8_t(SDIO_INIT_CLK_DIV) / 40) - #endif - #ifndef USBD_OK #define USBD_OK 0 #endif + // Target Clock, configurable. Default is 18MHz, from STM32F1 + #ifndef SDIO_CLOCK + #define SDIO_CLOCK 18000000 /* 18 MHz */ + #endif + + // SDIO retries, configurable. Default is 3, from STM32F1 + #ifndef SDIO_READ_RETRIES + #define SDIO_READ_RETRIES 3 + #endif + + // SDIO Max Clock (naming from STM Manual, don't change) + #define SDIOCLK 48000000 + + static uint32_t clock_to_divider(uint32_t clk) { + // limit the SDIO master clock to 8/3 of PCLK2. See STM32 Manuals + // Also limited to no more than 48Mhz (SDIOCLK). + const uint32_t pclk2 = HAL_RCC_GetPCLK2Freq(); + clk = min(clk, (uint32_t)(pclk2 * 8 / 3)); + clk = min(clk, (uint32_t)SDIOCLK); + // Round up divider, so we don't run the card over the speed supported, + // and subtract by 2, because STM32 will add 2, as written in the manual: + // SDIO_CK frequency = SDIOCLK / [CLKDIV + 2] + return pclk2 / clk + (pclk2 % clk != 0) - 2; + } + void go_to_transfer_speed() { SD_InitTypeDef Init; @@ -109,7 +128,7 @@ Init.ClockPowerSave = hsd.Init.ClockPowerSave; Init.BusWide = hsd.Init.BusWide; Init.HardwareFlowControl = hsd.Init.HardwareFlowControl; - Init.ClockDiv = TRANSFER_CLOCK_DIV; + Init.ClockDiv = clock_to_divider(SDIO_CLOCK); /* Initialize SDIO peripheral interface with default configuration */ SDIO_Init(hsd.Instance, Init); @@ -155,38 +174,25 @@ //Initialize the SDIO (with initial <400Khz Clock) tempreg = 0; //Reset value tempreg |= SDIO_CLKCR_CLKEN; // Clock enabled - tempreg |= (uint32_t)0x76; // Clock Divider. Clock = 48000 / (118 + 2) = 400Khz + tempreg |= SDIO_INIT_CLK_DIV; // Clock Divider. Clock = 48000 / (118 + 2) = 400Khz // Keep the rest at 0 => HW_Flow Disabled, Rising Clock Edge, Disable CLK ByPass, Bus Width = 0, Power save Disable SDIO->CLKCR = tempreg; // Power up the SDIO - SDIO->POWER = 0x03; + SDIO_PowerState_ON(SDIO); } void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { // application specific init - UNUSED(hsd); /* Prevent unused argument(s) compilation warning */ + UNUSED(hsd); // Prevent unused argument(s) compilation warning __HAL_RCC_SDIO_CLK_ENABLE(); // turn on SDIO clock } - constexpr uint8_t SD_RETRY_COUNT = TERN(SD_CHECK_AND_RETRY, 3, 1); - bool SDIO_Init() { - //init SDIO and get SD card info - - uint8_t retryCnt = SD_RETRY_COUNT; + uint8_t retryCnt = SDIO_READ_RETRIES; bool status; hsd.Instance = SDIO; - hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET - - /* - hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; - hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; - hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; - hsd.Init.BusWide = SDIO_BUS_WIDE_1B; - hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; - hsd.Init.ClockDiv = 8; - */ + hsd.State = HAL_SD_STATE_RESET; SD_LowLevel_Init(); @@ -258,7 +264,7 @@ bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { hsd.Instance = SDIO; - uint8_t retryCnt = SD_RETRY_COUNT; + uint8_t retryCnt = SDIO_READ_RETRIES; bool status; for (;;) { @@ -307,7 +313,7 @@ bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { hsd.Instance = SDIO; - uint8_t retryCnt = SD_RETRY_COUNT; + uint8_t retryCnt = SDIO_READ_RETRIES; bool status; for (;;) { status = (bool) HAL_SD_WriteBlocks(&hsd, (uint8_t*)src, block, 1, 500); // write one 512 byte block with 500mS timeout diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index ebfb00bfb6..21dad6df3e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -165,6 +165,8 @@ #define SPI_DEVICE 2 #define SDIO_SUPPORT +#define SDIO_CLOCK 4500000 +#define SDIO_READ_RETRIES 16 #if ENABLED(SDIO_SUPPORT) #define SCK_PIN PB13 // SPI2 #define MISO_PIN PB14 // SPI2 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 48973688a0..ef96eecd74 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -142,6 +142,7 @@ // SD support // #define SDIO_SUPPORT +#define SDIO_CLOCK 4800000 // // Misc. Functions diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index 0600ed4338..bd4d1f6618 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -156,6 +156,7 @@ // SD support // #define SDIO_SUPPORT +#define SDIO_CLOCK 4800000 #define SCK_PIN PC12 //confirmed working #define MISO_PIN PC8 //confirmed working diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 6e0b3e14a7..c8f52d6987 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -127,6 +127,7 @@ // #define SDIO_SUPPORT #define SD_DETECT_PIN PA8 +#define SDIO_CLOCK 4800000 // // LCD / Controller diff --git a/platformio.ini b/platformio.ini index a95647cf42..924da69a74 100644 --- a/platformio.ini +++ b/platformio.ini @@ -973,7 +973,7 @@ board_build.offset = 0x7000 board_build.encrypt = Yes board_build.firmware = Robin.bin build_flags = ${common_stm32.build_flags} - -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 -DTIMER_SERIAL=TIM5 + -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC extra_scripts = ${common.extra_scripts} @@ -1149,7 +1149,7 @@ upload_protocol = jlink [env:flsun_hispeedv1] platform = ${common_stm32.platform} extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 +build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 board = genericSTM32F103VE board_build.core = stm32 board_build.variant = MARLIN_F103Vx @@ -1321,7 +1321,7 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common_stm32.build_flags} -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE - -DTRANSFER_CLOCK_DIV=8 -DHAL_SRAM_MODULE_ENABLED + -DHAL_SRAM_MODULE_ENABLED build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 # @@ -1369,7 +1369,7 @@ monitor_speed = 500000 [env:mks_robin_nano35_stm32] platform = ${common_stm32.platform} extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 +build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 board = genericSTM32F103VE board_build.core = stm32 board_build.variant = MARLIN_F103Vx From 427a2fca4dc27d039f39a2b96d063e56aa593ae6 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 28 Dec 2020 02:11:36 -0300 Subject: [PATCH 0803/1370] Fix Menu Mixer for Color UI (#20566) --- Marlin/src/lcd/menu/menu_mixer.cpp | 9 +++++++++ Marlin/src/lcd/tft/tft.h | 1 + Marlin/src/lcd/tft/ui_320x240.cpp | 21 +++++++++++++++++++++ Marlin/src/lcd/tft/ui_480x320.cpp | 21 +++++++++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index 8010239336..d07b89c7c0 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -33,6 +33,10 @@ #include "../../feature/mixing.h" +#if HAS_GRAPHICAL_TFT + #include "../tft/tft.h" +#endif + #define CHANNEL_MIX_EDITING !HAS_DUAL_MIXING #if ENABLED(GRADIENT_MIX) @@ -67,6 +71,9 @@ mixer.refresh_gradient(); ui.goto_previous_screen(); } + else { + TERN_(HAS_GRAPHICAL_TFT, tft.draw_edit_screen_buttons()); + } } void lcd_mixer_edit_gradient_menu() { @@ -155,6 +162,8 @@ void lcd_mixer_mix_edit() { ui.goto_previous_screen(); } + TERN_(HAS_GRAPHICAL_TFT, tft.draw_edit_screen_buttons()); + #else START_MENU(); diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h index 431973b894..d3ef62ec5b 100644 --- a/Marlin/src/lcd/tft/tft.h +++ b/Marlin/src/lcd/tft/tft.h @@ -93,6 +93,7 @@ class TFT { static inline void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main = COLOR_WHITE, uint16_t color_background = COLOR_BACKGROUND, uint16_t color_shadow = COLOR_BLACK) { queue.add_image(x, y, image, color_main, color_background, color_shadow); } static inline void add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.add_bar(x, y, width, height, color); } static inline void add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.add_rectangle(x, y, width, height, color); } + static void draw_edit_screen_buttons(); }; extern TFT tft; diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 2cc586a48a..4c09d9803e 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -442,6 +442,10 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const valu #endif } + tft.draw_edit_screen_buttons(); +} + +void TFT::draw_edit_screen_buttons() { #if ENABLED(TOUCH_SCREEN) add_control(32, 176, DECREASE, imgDecrease); add_control(224, 176, INCREASE, imgIncrease); @@ -658,6 +662,23 @@ void menu_item(const uint8_t row, bool sel ) { #endif } +void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { + #define TFT_COL_WIDTH ((TFT_WIDTH) / (LCD_WIDTH)) + tft.canvas(col * TFT_COL_WIDTH, 4 + 45 * row, TFT_WIDTH - (col * TFT_COL_WIDTH), 43); + tft.set_background(COLOR_BACKGROUND); +} + +int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + tft_string.set(utf8_str_P); + tft_string.trim(); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + return tft_string.width(); +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + return lcd_put_u8str_max_P(utf8_str, max_length); +} + void MarlinUI::move_axis_screen() { } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 8d05ab7df4..ddd08e4d0d 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -445,6 +445,10 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const valu #endif } + tft.draw_edit_screen_buttons(); +} + +void TFT::draw_edit_screen_buttons() { #if ENABLED(TOUCH_SCREEN) add_control(64, 256, DECREASE, imgDecrease); add_control(352, 256, INCREASE, imgIncrease); @@ -661,6 +665,23 @@ void menu_item(const uint8_t row, bool sel ) { #endif } +void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { + #define TFT_COL_WIDTH ((TFT_WIDTH) / (LCD_WIDTH)) + tft.canvas(col * TFT_COL_WIDTH, 4 + 45 * row, TFT_WIDTH - (col * TFT_COL_WIDTH), 43); + tft.set_background(COLOR_BACKGROUND); +} + +int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + tft_string.set(utf8_str_P); + tft_string.trim(); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + return tft_string.width(); +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + return lcd_put_u8str_max_P(utf8_str, max_length); +} + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) #include "../../feature/babystep.h" #endif From a74d4609af0777d711d1f97ab7caba9fdd63543e Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 28 Dec 2020 02:14:08 -0300 Subject: [PATCH 0804/1370] Use ADC_RESOLUTION 12 for all STM32 (#20562) --- .../share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h | 4 ++-- platformio.ini | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h index 07e2cad3f9..4bd5b63dfe 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h @@ -114,10 +114,10 @@ extern "C" { #define NUM_ANALOG_INPUTS 7 #define NUM_ANALOG_FIRST 80 -#define ADC_RESOLUTION 12 +//#define ADC_RESOLUTION 12 // PWM resolution -// #define PWM_RESOLUTION 12 +//#define PWM_RESOLUTION 12 #define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans #define PWM_MAX_DUTY_CYCLE 255 diff --git a/platformio.ini b/platformio.ini index 924da69a74..2aff7aad23 100644 --- a/platformio.ini +++ b/platformio.ini @@ -725,6 +725,7 @@ build_flags = ${common.build_flags} -std=gnu++14 -DUSBCON -DUSBD_USE_CDC -DTIM_IRQ_PRIO=13 + -DADC_RESOLUTION=12 build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + + From 63f083db969ec5ae7e8959323bed82f5728d4e7a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 28 Dec 2020 02:15:01 -0300 Subject: [PATCH 0805/1370] Fix LVGL_UI G-code preview (#20564) --- Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp | 9 +++++---- .../src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 9014e88d75..96e322bbec 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -298,8 +298,8 @@ void disp_gcode_icon(uint8_t file_num) { strcat(test_public_buf_l, list_file.file_name[i]); char *temp = strstr(test_public_buf_l, ".GCO"); if (temp) strcpy(temp, ".bin"); - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0); - lv_imgbtn_set_src_both(buttonGcode[i], test_public_buf_l); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), test_public_buf_l, 0); + lv_imgbtn_set_src_both(buttonGcode[i], buttonGcode[i]->mks_pic_name); if (i < 3) { lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET); buttonText[i] = lv_btn_create(scr, nullptr); @@ -358,7 +358,7 @@ void disp_gcode_icon(uint8_t file_num) { uint32_t lv_open_gcode_file(char *path) { #if ENABLED(SDSUPPORT) uint32_t *ps4; - uint32_t pre_sread_cnt = 0; + uint32_t pre_sread_cnt = UINT32_MAX; char *cur_name; cur_name = strrchr(path, '/'); @@ -399,6 +399,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { char temp_test[200]; volatile uint16_t *p_index; + watchdog_refresh(); memset(public_buf, 0, 200); while (card.isFileOpen()) { @@ -418,7 +419,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { uint16_t c = card.get(); // check if we have more data or finished the line (CR) if (c == '\r') break; - card.setIndex(card.getIndex()); + card.setIndex(card.getIndex() - 1); k++; j = 0; ignore_start = false; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index f943c1d6f9..8ce317c571 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -380,7 +380,7 @@ lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_ if (temp) strcpy(temp, ".GCO"); sd_read_base_addr = lv_open_gcode_file((char *)name_buf); sd_read_addr_offset = sd_read_base_addr; - if (sd_read_addr_offset == 0) return LV_FS_RES_NOT_EX; + if (sd_read_addr_offset == UINT32_MAX) return LV_FS_RES_NOT_EX; return LV_FS_RES_OK; } From ed1c0b71df0a079def84742148f3dcf60e459c1a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 28 Dec 2020 02:39:52 -0300 Subject: [PATCH 0806/1370] Fix Change Filament menu actions (#20565) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/menu/menu_filament.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index af8a4fc2b5..2a13452dc1 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -90,8 +90,10 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_DEFAULT|SS_INVERT); BACK_ITEM(MSG_BACK); #if PREHEAT_COUNT + const int8_t old_index = MenuItemBase::itemIndex; LOOP_L_N(m, PREHEAT_COUNT) - ACTION_ITEM_N_S(extruder, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); + ACTION_ITEM_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); + MenuItemBase::itemIndex = old_index; #endif EDIT_ITEM_FAST_N(int3, extruder, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[extruder].target, EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, From 8aa453d75b07caa0fcd764501521cb8bc2c1db71 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 27 Dec 2020 23:49:15 -0600 Subject: [PATCH 0807/1370] Menu item index followup --- Marlin/src/lcd/menu/menu_filament.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 2a13452dc1..7bd12bde17 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -86,20 +86,20 @@ inline PGM_P change_filament_header(const PauseMode mode) { void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { _change_filament_mode = mode; _change_filament_extruder = extruder; + const int8_t old_index = MenuItemBase::itemIndex; START_MENU(); if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_DEFAULT|SS_INVERT); BACK_ITEM(MSG_BACK); #if PREHEAT_COUNT - const int8_t old_index = MenuItemBase::itemIndex; LOOP_L_N(m, PREHEAT_COUNT) ACTION_ITEM_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); - MenuItemBase::itemIndex = old_index; #endif EDIT_ITEM_FAST_N(int3, extruder, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[extruder].target, EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, _change_filament_with_custom ); END_MENU(); + MenuItemBase::itemIndex = old_index; } /** From 7b33ceebbbfd02459e939be1831cb3a92cb422ac Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Mon, 28 Dec 2020 19:56:37 -0800 Subject: [PATCH 0808/1370] Apply SHOW_BOOTSCREEN to TFT_COLOR_UI (#20586) --- Marlin/src/inc/Conditionals_LCD.h | 4 ---- Marlin/src/lcd/tft/tft_image.cpp | 14 ++++++++------ Marlin/src/lcd/tft/tft_image.h | 16 +++++++++------- Marlin/src/lcd/tft/ui_320x240.h | 2 +- Marlin/src/lcd/tft/ui_480x320.h | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index ed01f54a0b..8188d55316 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1197,7 +1197,3 @@ #define TOUCH_ORIENTATION TOUCH_LANDSCAPE #endif #endif - -#if MB(ANET_ET4, ANET_ET4P) - #define IS_ANET_ET 1 -#endif diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index 8f8b610699..9cc6fb15e4 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -25,12 +25,14 @@ const tImage NoLogo = { nullptr, 0, 0, NOCOLORS }; -const tImage MarlinLogo112x38x1 = { (void *)marlin_logo_112x38x1, 112, 38, GREYSCALE1 }; -const tImage MarlinLogo228x255x2 = { (void *)marlin_logo_228x255x2, 228, 255, GREYSCALE2 }; -const tImage MarlinLogo228x255x4 = { (void *)marlin_logo_228x255x4, 228, 255, GREYSCALE4 }; -const tImage MarlinLogo195x59x16 = { (void *)marlin_logo_195x59x16, 195, 59, HIGHCOLOR }; -const tImage MarlinLogo320x240x16 = { (void *)marlin_logo_320x240x16, 320, 240, HIGHCOLOR }; -const tImage MarlinLogo480x320x16 = { (void *)marlin_logo_480x320x16, 480, 320, HIGHCOLOR }; +#if ENABLED(SHOW_BOOTSCREEN) + const tImage MarlinLogo112x38x1 = { (void *)marlin_logo_112x38x1, 112, 38, GREYSCALE1 }; + const tImage MarlinLogo228x255x2 = { (void *)marlin_logo_228x255x2, 228, 255, GREYSCALE2 }; + const tImage MarlinLogo228x255x4 = { (void *)marlin_logo_228x255x4, 228, 255, GREYSCALE4 }; + const tImage MarlinLogo195x59x16 = { (void *)marlin_logo_195x59x16, 195, 59, HIGHCOLOR }; + const tImage MarlinLogo320x240x16 = { (void *)marlin_logo_320x240x16, 320, 240, HIGHCOLOR }; + const tImage MarlinLogo480x320x16 = { (void *)marlin_logo_480x320x16, 480, 320, HIGHCOLOR }; +#endif const tImage Background320x30x16 = { (void *)background_320x30x16, 320, 30, HIGHCOLOR }; const tImage HotEnd_64x64x4 = { (void *)hotend_64x64x4, 64, 64, GREYSCALE4 }; diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h index 1f13967ba2..21bd2d665f 100644 --- a/Marlin/src/lcd/tft/tft_image.h +++ b/Marlin/src/lcd/tft/tft_image.h @@ -22,7 +22,7 @@ #pragma once #include "stdint.h" - +#include "../../inc/MarlinConfigPre.h" extern const uint8_t marlin_logo_112x38x1[]; extern const uint8_t marlin_logo_228x255x2[]; @@ -120,12 +120,14 @@ typedef struct __attribute__((__packed__)) { extern const tImage NoLogo; -extern const tImage MarlinLogo112x38x1; -extern const tImage MarlinLogo228x255x2; -extern const tImage MarlinLogo228x255x4; -extern const tImage MarlinLogo195x59x16; -extern const tImage MarlinLogo320x240x16; -extern const tImage MarlinLogo480x320x16; +#if ENABLED(SHOW_BOOTSCREEN) + extern const tImage MarlinLogo112x38x1; + extern const tImage MarlinLogo228x255x2; + extern const tImage MarlinLogo228x255x4; + extern const tImage MarlinLogo195x59x16; + extern const tImage MarlinLogo320x240x16; + extern const tImage MarlinLogo480x320x16; +#endif extern const tImage Background320x30x16; extern const tImage HotEnd_64x64x4; diff --git a/Marlin/src/lcd/tft/ui_320x240.h b/Marlin/src/lcd/tft/ui_320x240.h index 0f928eea37..249a21c4f1 100644 --- a/Marlin/src/lcd/tft/ui_320x240.h +++ b/Marlin/src/lcd/tft/ui_320x240.h @@ -44,7 +44,7 @@ void menu_item(const uint8_t row, bool sel = false); #define ABSOLUTE_ZERO -273.15 const tImage Images[imgCount] = { - TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MarlinLogo320x240x16), + TERN(SHOW_BOOTSCREEN, TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MarlinLogo320x240x16), NoLogo), HotEnd_64x64x4, Bed_64x64x4, Bed_Heated_64x64x4, diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h index cc62ee8cce..078f35ac68 100644 --- a/Marlin/src/lcd/tft/ui_480x320.h +++ b/Marlin/src/lcd/tft/ui_480x320.h @@ -44,7 +44,7 @@ void menu_item(const uint8_t row, bool sel = false); #define ABSOLUTE_ZERO -273.15 const tImage Images[imgCount] = { - TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MarlinLogo480x320x16), + TERN(SHOW_BOOTSCREEN, TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MarlinLogo480x320x16), NoLogo), HotEnd_64x64x4, Bed_64x64x4, Bed_Heated_64x64x4, From eda5a884c64ef0646d90b8744dabbe43adc4c619 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 29 Dec 2020 01:07:11 -0300 Subject: [PATCH 0809/1370] LVGL G-code preview. Legacy MKS WiFi Cura plugin compatibility (#20589) --- Marlin/src/core/macros.h | 1 + Marlin/src/feature/e_parser.h | 1 - Marlin/src/gcode/queue.cpp | 2 -- Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp | 12 ++++++++++-- .../lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp | 12 +++++++++--- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 058008646f..56e80b87dc 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -216,6 +216,7 @@ #define ANY_BUTTON(V...) DO(BTNEX,||,V) #define WITHIN(N,L,H) ((N) >= (L) && (N) <= (H)) +#define ISEOL(C) ((C) == '\n' || (C) == '\r') #define NUMERIC(a) WITHIN(a, '0', '9') #define DECIMAL(a) (NUMERIC(a) || a == '.') #define HEXCHR(a) (NUMERIC(a) ? (a) - '0' : WITHIN(a, 'a', 'f') ? ((a) - 'a' + 10) : WITHIN(a, 'A', 'F') ? ((a) - 'A' + 10) : -1) diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index 0bb0253149..a4c07de465 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -76,7 +76,6 @@ public: FORCE_INLINE static void disable() { enabled = false; } FORCE_INLINE static void update(State &state, const uint8_t c) { - #define ISEOL(C) ((C) == '\n' || (C) == '\r') switch (state) { case EP_RESET: switch (c) { diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index d23e9ee07f..98fe91db40 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -158,8 +158,6 @@ bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/ return true; } -#define ISEOL(C) ((C) == '\n' || (C) == '\r') - /** * Enqueue with Serial Echo * Return true if the command was consumed diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 96e322bbec..38b62db3b4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -417,12 +417,20 @@ void lv_gcode_file_read(uint8_t *data_buf) { } uint16_t c = card.get(); - // check if we have more data or finished the line (CR) - if (c == '\r') break; + // check for more data or end of line (CR or LF) + if (ISEOL(c)) { + c = card.get(); // more eol? + if (!ISEOL(c)) card.setIndex(card.getIndex() - 1); + break; + } card.setIndex(card.getIndex() - 1); k++; j = 0; ignore_start = false; + if (k > 1) { + card.closefile(); + break; + } } #if HAS_TFT_LVGL_UI_SPI for (i = 0; i < 200;) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 8ce317c571..f13a4b36cf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -369,8 +369,9 @@ lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p } //sd +extern uint8_t public_buf[512]; char *cur_namefff; -uint32_t sd_read_base_addr = 0,sd_read_addr_offset = 0; +uint32_t sd_read_base_addr = 0, sd_read_addr_offset = 0, small_image_size = 409; lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { //cur_namefff = strrchr(path, '/'); char name_buf[100]; @@ -381,6 +382,11 @@ lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_ sd_read_base_addr = lv_open_gcode_file((char *)name_buf); sd_read_addr_offset = sd_read_base_addr; if (sd_read_addr_offset == UINT32_MAX) return LV_FS_RES_NOT_EX; + // find small image size + card.read(public_buf, 512); + public_buf[511] = '\0'; + char* eol = strpbrk((const char*)public_buf, "\n\r"); + small_image_size = (uintptr_t)eol - (uintptr_t)((uint32_t *)(&public_buf[0])) + 1; return LV_FS_RES_OK; } @@ -406,14 +412,14 @@ lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t b } lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { - sd_read_addr_offset = sd_read_base_addr + (pos - 4) / 200 * 409; + sd_read_addr_offset = sd_read_base_addr + (pos - 4) / 200 * small_image_size; lv_gcode_file_seek(sd_read_addr_offset); return LV_FS_RES_OK; } lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { if (sd_read_addr_offset) *pos_p = 0; - else *pos_p = (sd_read_addr_offset - sd_read_base_addr) / 409 * 200 + 4; + else *pos_p = (sd_read_addr_offset - sd_read_base_addr) / small_image_size * 200 + 4; return LV_FS_RES_OK; } From f539e319f0812039c4af5d4300bfc21fc5f910bb Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Tue, 29 Dec 2020 05:13:56 +0100 Subject: [PATCH 0810/1370] Clarify sanity-check for custom status bitmap (#20588) --- Marlin/src/inc/SanityCheck.h | 2 +- buildroot/tests/STM32F103VE_longer-tests | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 949828d5f8..6121c5ed13 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -721,7 +721,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE) #error "SHOW_CUSTOM_BOOTSCREEN requires Graphical LCD or TOUCH_UI_FTDI_EVE." #elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_MARLINUI_U8GLIB - #error "CUSTOM_STATUS_SCREEN_IMAGE requires a Graphical LCD." + #error "CUSTOM_STATUS_SCREEN_IMAGE requires a 128x64 DOGM B/W Graphical LCD." #endif /** diff --git a/buildroot/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer-tests index 461f128873..c9ef580015 100755 --- a/buildroot/tests/STM32F103VE_longer-tests +++ b/buildroot/tests/STM32F103VE_longer-tests @@ -8,7 +8,17 @@ set -e use_example_configs Alfawise/U20 opt_enable BAUD_RATE_GCODE -exec_test $1 $2 "Full-featured U20 config" "$3" +exec_test $1 $2 "CLASSIC_UI U20 config" "$3" + +use_example_configs Alfawise/U20 +opt_enable BAUD_RATE_GCODE +opt_enable TFT_COLOR_UI +opt_disable TFT_CLASSIC_UI +exec_test $1 $2 "COLOR_UI U20 config" "$3" + +use_example_configs Alfawise/U20-bltouch +opt_enable BAUD_RATE_GCODE +exec_test $1 $2 "BLTouch U20 config" # cleanup restore_configs From c3dc74bba0045ef09a0ba49493d84c5a12888351 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 28 Dec 2020 23:10:48 -0600 Subject: [PATCH 0811/1370] Pins, comment cleanup --- Marlin/src/inc/Conditionals_LCD.h | 1 + Marlin/src/inc/Conditionals_adv.h | 4 +++ Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 10 ++++--- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 7 +++-- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 10 ++++--- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 27 ++++++++++------- .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 29 ++++++++++--------- Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h | 5 +--- .../variants/BIGTREE_GTR_V1/hal_conf_extra.h | 2 +- .../BIGTREE_SKR_PRO_1v1/hal_conf_extra.h | 2 +- buildroot/tests/STM32F103VE_longer-tests | 5 ++-- 13 files changed, 62 insertions(+), 44 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 8188d55316..f1192cea12 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -833,6 +833,7 @@ #else // Clear probe pin settings when no probe is selected #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + #undef USE_PROBE_FOR_Z_HOMING #endif #if Z_HOME_DIR > 0 diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index f99e363d7b..93f912e5c5 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -382,6 +382,10 @@ #define POLL_JOG #endif +#ifndef HOMING_BUMP_MM + #define HOMING_BUMP_MM { 0, 0, 0 } +#endif + /** * Driver Timings (in nanoseconds) * NOTE: Driver timing order is longest-to-shortest duration. diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 68cfe65601..6d9d225eff 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -189,7 +189,7 @@ // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 -#endif // TMC2208 || TMC2209 +#endif // HAS_TMC_UART // // Temperature Sensors diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 93890e9aa7..3118a521bb 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -40,7 +40,6 @@ // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // - #define DISABLE_DEBUG // @@ -59,6 +58,11 @@ // #define SPI_DEVICE 2 +// +// Servos +// +#define SERVO0_PIN PA8 // Enable BLTOUCH + // // Limit Switches // @@ -155,7 +159,7 @@ // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 -#endif // TMC2208 || TMC2209 +#endif // HAS_TMC_UART // // Temperature Sensors @@ -200,8 +204,6 @@ #define FIL_RUNOUT_PIN PA4 #endif -#define SERVO0_PIN PA8 // Enable BLTOUCH - //#define LED_PIN PB2 // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index c430671b2e..ea3a7a1eea 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -56,6 +56,11 @@ #define SPI_DEVICE 2 +// +// Servos +// +#define SERVO0_PIN PA8 // Enable BLTOUCH + // // Limit Switches // @@ -148,8 +153,6 @@ #define FIL_RUNOUT2_PIN PE6 #endif -#define SERVO0_PIN PA8 // Enable BLTOUCH support - //#define LED_PIN PB2 // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 063e548a32..6ef3a08043 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -43,7 +43,6 @@ // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // - #define DISABLE_DEBUG // @@ -62,6 +61,11 @@ // #define SPI_DEVICE 2 +// +// Servos +// +#define SERVO0_PIN PA8 // Enable BLTOUCH + // // Limit Switches // @@ -163,7 +167,7 @@ // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 -#endif // TMC2208 || TMC2209 +#endif // HAS_TMC_UART // // Temperature Sensors @@ -218,8 +222,6 @@ #define FIL_RUNOUT2_PIN PE6 #endif -#define SERVO0_PIN PA8 // Enable BLTOUCH - //#define LED_PIN PB2 // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 65aa5cc39e..89bb41b197 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -48,7 +48,7 @@ // // Servos // -#define SERVO0_PIN PA8 // BLTOUCH +#define SERVO0_PIN PA8 // Enable BLTOUCH // // Limit Switches diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index e2b3f2c317..f0fc99e0c0 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -31,8 +31,11 @@ #define BOARD_INFO_NAME "MKS Robin Nano V3" +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT + // Avoid conflict with TIMER_TONE -#define STEP_TIMER 10 +#define STEP_TIMER 10 // Use one of these or SDCard-based Emulation will be used //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation @@ -42,6 +45,12 @@ // // Release PB4 (Z_DIR_PIN) from JTAG NRST role // +//#define DISABLE_DEBUG + +// +// Servos +// +#define SERVO0_PIN PA8 // Enable BLTOUCH // // Limit Switches @@ -98,8 +107,8 @@ // // Software SPI pins for TMC2130 stepper drivers +// This board only supports SW SPI for stepper drivers // -// This board only support SW SPI for stepper drivers #if HAS_TMC_SPI #define TMC_USE_SW_SPI #endif @@ -179,6 +188,7 @@ #define POWER_LOSS_PIN PW_DET #define PS_ON_PIN PW_OFF + // // Enable MKSPWC support // @@ -186,14 +196,13 @@ //#define KILL_PIN PA2 //#define KILL_PIN_INVERTING true -#define SERVO0_PIN PA8 // Enable BLTOUCH support //#define LED_PIN PB2 // Random Info -#define USB_SERIAL -1 //Usb Serial -#define WIFI_SERIAL 3 //USART3 -#define MKS_WIFI_MODULE_SERIAL 1 //USART1 -#define MKS_WIFI_MODULE_SPI 2 //SPI2 +#define USB_SERIAL -1 // USB Serial +#define WIFI_SERIAL 3 // USART3 +#define MKS_WIFI_MODULE_SERIAL 1 // USART1 +#define MKS_WIFI_MODULE_SPI 2 // SPI2 #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD @@ -331,7 +340,7 @@ //#define MKS_LCD12864B //#undef SHOW_BOOTSCREEN - #else // !MKS_MINI_12864 + #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 #if ENABLED(ULTIPANEL) @@ -346,5 +355,3 @@ #endif // !MKS_MINI_12864 #endif // HAS_SPI_LCD - -#define HAS_OTG_USB_HOST_SUPPORT diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index 05648cf120..3336340469 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -30,7 +30,7 @@ #define BOARD_INFO_NAME "MKS Robin PRO V2" // Avoid conflict with TIMER_TONE -#define STEP_TIMER 10 +#define STEP_TIMER 10 // Use one of these or SDCard-based Emulation will be used //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation @@ -40,12 +40,18 @@ // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // +//#define DISABLE_DEBUG // // Note: MKS Robin board is using SPI2 interface. // //#define SPI_MODULE 2 +// +// Servos +// +#define SERVO0_PIN PA8 // Enable BLTOUCH + // // Limit Switches // @@ -55,8 +61,6 @@ #define E0_DIAG_PIN PC4 #define E1_DIAG_PIN PE7 -// - #define X_STOP_PIN PA15 #define Y_STOP_PIN PA12 #define Z_MIN_PIN PA11 @@ -159,7 +163,7 @@ // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 -#endif // TMC2208 || TMC2209 +#endif // HAS_TMC_UART // // Temperature Sensors @@ -186,19 +190,18 @@ // // Misc. Functions // -// #define POWER_LOSS_PIN PA2 // PW_DET -// #define PS_ON_PIN PA3 // PW_OFF -// #define SUICIDE_PIN PB2 // Enable MKSPWC support -// #define KILL_PIN PA2 // Enable MKSPWC support -// #define KILL_PIN_INVERTING true // Enable MKSPWC support -#define SERVO0_PIN PA8 // Enable BLTOUCH support +//#define POWER_LOSS_PIN PA2 // PW_DET +//#define PS_ON_PIN PA3 // PW_OFF +//#define SUICIDE_PIN PB2 // Enable MKSPWC support +//#define KILL_PIN PA2 // Enable MKSPWC support +//#define KILL_PIN_INVERTING true // Enable MKSPWC support //#define LED_PIN PB2 #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD #endif -// #define USE_NEW_SPI_API 1 +//#define USE_NEW_SPI_API 1 // // Onboard SD card @@ -243,7 +246,7 @@ // // LCD / Controller #define SPI_FLASH -#define HAS_SPI_FLASH 1 +#define HAS_SPI_FLASH 1 #define SPI_DEVICE 2 #define SPI_FLASH_SIZE 0x1000000 #if ENABLED(SPI_FLASH) @@ -316,7 +319,7 @@ #define LCD_READ_ID 0xD3 #define LCD_USE_DMA_SPI - // #define TFT_DRIVER ST7796 + //#define TFT_DRIVER ST7796 #define TFT_BUFFER_SIZE 14400 #elif HAS_SPI_LCD diff --git a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h index 90dcfc46e4..466cce565d 100644 --- a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h +++ b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h @@ -36,7 +36,7 @@ // Decrease delays and flash wear by spreading writes across the // 128 kB sector allocated for EEPROM emulation. // Not yet supported on F7 hardware - // #define FLASH_EEPROM_LEVELING + //#define FLASH_EEPROM_LEVELING #endif /** @@ -188,9 +188,6 @@ #define LCD_PINS_RS PF12 // LCD_RS #define LCD_PINS_ENABLE PD15 // LCD_EN #define LCD_PINS_D4 PB13 // LCD_D4 - // #define LCD_PINS_D5 - // #define LCD_PINS_D6 - // #define LCD_PINS_D7 #define BTN_EN1 PF13 // BTN_EN1 #define BTN_EN2 PE9 // BTN_EN2 diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h index e0e8239aac..f7f9e23e99 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h @@ -44,7 +44,7 @@ #undef HAL_IRDA_MODULE_ENABLED #undef HAL_SMARTCARD_MODULE_ENABLED #undef HAL_WWDG_MODULE_ENABLED -#undef HAL_HCD_MODULE_ENABLED +//#undef HAL_HCD_MODULE_ENABLED #undef HAL_FMPI2C_MODULE_ENABLED #undef HAL_SPDIFRX_MODULE_ENABLED #undef HAL_DFSDM_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h index e0e8239aac..f7f9e23e99 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h @@ -44,7 +44,7 @@ #undef HAL_IRDA_MODULE_ENABLED #undef HAL_SMARTCARD_MODULE_ENABLED #undef HAL_WWDG_MODULE_ENABLED -#undef HAL_HCD_MODULE_ENABLED +//#undef HAL_HCD_MODULE_ENABLED #undef HAL_FMPI2C_MODULE_ENABLED #undef HAL_SPDIFRX_MODULE_ENABLED #undef HAL_DFSDM_MODULE_ENABLED diff --git a/buildroot/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer-tests index c9ef580015..1c90744c01 100755 --- a/buildroot/tests/STM32F103VE_longer-tests +++ b/buildroot/tests/STM32F103VE_longer-tests @@ -11,9 +11,8 @@ opt_enable BAUD_RATE_GCODE exec_test $1 $2 "CLASSIC_UI U20 config" "$3" use_example_configs Alfawise/U20 -opt_enable BAUD_RATE_GCODE -opt_enable TFT_COLOR_UI -opt_disable TFT_CLASSIC_UI +opt_enable BAUD_RATE_GCODE TFT_COLOR_UI +opt_disable TFT_CLASSIC_UI CUSTOM_STATUS_SCREEN_IMAGE exec_test $1 $2 "COLOR_UI U20 config" "$3" use_example_configs Alfawise/U20-bltouch From 79672d51f665e5fb30058b368443a83094e8c2e7 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 29 Dec 2020 02:16:38 -0300 Subject: [PATCH 0812/1370] USB FD via native USB Host + MSC (#20571) --- Marlin/Configuration_adv.h | 14 ++- Marlin/src/HAL/STM32/usb_host.cpp | 117 ++++++++++++++++++ Marlin/src/HAL/STM32/usb_host.h | 60 +++++++++ Marlin/src/inc/Conditionals_adv.h | 4 + Marlin/src/inc/SanityCheck.h | 6 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 12 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 3 + .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 3 + .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 1 + .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 4 + .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 18 ++- .../sd/usb_flashdrive/Sd2Card_FlashDrive.h | 41 +++--- platformio.ini | 50 +++++++- 13 files changed, 300 insertions(+), 33 deletions(-) create mode 100644 Marlin/src/HAL/STM32/usb_host.cpp create mode 100644 Marlin/src/HAL/STM32/usb_host.h diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 6b1febc8f5..990eb05144 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1326,9 +1326,6 @@ */ //#define USB_FLASH_DRIVE_SUPPORT #if ENABLED(USB_FLASH_DRIVE_SUPPORT) - #define USB_CS_PIN SDSS - #define USB_INTR_PIN SD_DETECT_PIN - /** * USB Host Shield Library * @@ -1339,7 +1336,18 @@ * is less tested and is known to interfere with Servos. * [1] This requires USB_INTR_PIN to be interrupt-capable. */ + //#define USE_UHS2_USB //#define USE_UHS3_USB + + /** + * Native USB Host supported by some boards (USB OTG) + */ + //#define USE_OTG_USB_HOST + + #if DISABLED(USE_OTG_USB_HOST) + #define USB_CS_PIN SDSS + #define USB_INTR_PIN SD_DETECT_PIN + #endif #endif /** diff --git a/Marlin/src/HAL/STM32/usb_host.cpp b/Marlin/src/HAL/STM32/usb_host.cpp new file mode 100644 index 0000000000..ed743361e6 --- /dev/null +++ b/Marlin/src/HAL/STM32/usb_host.cpp @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +#if BOTH(USE_OTG_USB_HOST, USBHOST) + +#include "usb_host.h" +#include "../shared/Marduino.h" +#include "usbh_core.h" +#include "usbh_msc.h" + +USBH_HandleTypeDef hUsbHost; +USBHost usb; +BulkStorage bulk(&usb); + +static void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id) { + switch(id) { + case HOST_USER_SELECT_CONFIGURATION: + //SERIAL_ECHOLNPGM("APPLICATION_SELECT_CONFIGURATION"); + break; + case HOST_USER_DISCONNECTION: + //SERIAL_ECHOLNPGM("APPLICATION_DISCONNECT"); + //usb.setUsbTaskState(USB_STATE_RUNNING); + break; + case HOST_USER_CLASS_ACTIVE: + //SERIAL_ECHOLNPGM("APPLICATION_READY"); + usb.setUsbTaskState(USB_STATE_RUNNING); + break; + case HOST_USER_CONNECTION: + break; + default: + break; + } +} + +bool USBHost::start() { + if (USBH_Init(&hUsbHost, USBH_UserProcess, TERN(USE_USB_HS_IN_FS, HOST_HS, HOST_FS)) != USBH_OK) { + SERIAL_ECHOLNPGM("Error: USBH_Init"); + return false; + } + if (USBH_RegisterClass(&hUsbHost, USBH_MSC_CLASS) != USBH_OK) { + SERIAL_ECHOLNPGM("Error: USBH_RegisterClass"); + return false; + } + if (USBH_Start(&hUsbHost) != USBH_OK) { + SERIAL_ECHOLNPGM("Error: USBH_Start"); + return false; + } + return true; +} + +void USBHost::Task() { + USBH_Process(&hUsbHost); +} + +uint8_t USBHost::getUsbTaskState() { + return usb_task_state; +} + +void USBHost::setUsbTaskState(uint8_t state) { + usb_task_state = state; + if (usb_task_state == USB_STATE_RUNNING) { + MSC_LUNTypeDef info; + USBH_MSC_GetLUNInfo(&hUsbHost, usb.lun, &info); + capacity = info.capacity.block_nbr / 2000; + block_size = info.capacity.block_size; + block_count = info.capacity.block_nbr; + // SERIAL_ECHOLNPAIR("info.capacity.block_nbr : %ld\n", info.capacity.block_nbr); + // SERIAL_ECHOLNPAIR("info.capacity.block_size: %d\n", info.capacity.block_size); + // SERIAL_ECHOLNPAIR("capacity : %d MB\n", capacity); + } +}; + +bool BulkStorage::LUNIsGood(uint8_t t) { + return USBH_MSC_IsReady(&hUsbHost) && USBH_MSC_UnitIsReady(&hUsbHost, t); +} + +uint32_t BulkStorage::GetCapacity(uint8_t lun) { + return usb->block_count; +} + +uint16_t BulkStorage::GetSectorSize(uint8_t lun) { + return usb->block_size; +} + +uint8_t BulkStorage::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf) { + return USBH_MSC_Read(&hUsbHost, lun, addr, buf, blocks) != USBH_OK; +} + +uint8_t BulkStorage::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf) { + return USBH_MSC_Write(&hUsbHost, lun, addr, const_cast (buf), blocks) != USBH_OK; +} + +#endif // USE_OTG_USB_HOST && USBHOST +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/usb_host.h b/Marlin/src/HAL/STM32/usb_host.h new file mode 100644 index 0000000000..c0001c0d75 --- /dev/null +++ b/Marlin/src/HAL/STM32/usb_host.h @@ -0,0 +1,60 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +typedef enum { + USB_STATE_INIT, + USB_STATE_ERROR, + USB_STATE_RUNNING, +} usb_state_t; + +class USBHost { +public: + bool start(); + void Task(); + uint8_t getUsbTaskState(); + void setUsbTaskState(uint8_t state); + uint8_t regRd(uint8_t reg) { return 0x0; }; + uint8_t usb_task_state = USB_STATE_INIT; + uint8_t lun = 0; + uint32_t capacity = 0; + uint16_t block_size = 0; + uint32_t block_count = 0; +}; + +class BulkStorage { +public: + BulkStorage(USBHost *usb) : usb(usb) {}; + + bool LUNIsGood(uint8_t t); + uint32_t GetCapacity(uint8_t lun); + uint16_t GetSectorSize(uint8_t lun); + uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf); + uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf); + + USBHost *usb; +}; + +extern USBHost usb; +extern BulkStorage bulk; diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 93f912e5c5..dda0298740 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -386,6 +386,10 @@ #define HOMING_BUMP_MM { 0, 0, 0 } #endif +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && NONE(USE_OTG_USB_HOST, USE_UHS3_USB) + #define USE_UHS2_USB +#endif + /** * Driver Timings (in nanoseconds) * NOTE: Driver timing order is longest-to-shortest duration. diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6121c5ed13..62c954c899 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2912,10 +2912,14 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "PRINTCOUNTER requires EEPROM_SETTINGS." #endif -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && !PINS_EXIST(USB_CS, USB_INTR) +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && !PINS_EXIST(USB_CS, USB_INTR) && DISABLED(USE_OTG_USB_HOST) #error "USB_CS_PIN and USB_INTR_PIN are required for USB_FLASH_DRIVE_SUPPORT." #endif +#if ENABLED(USE_OTG_USB_HOST) && !defined(HAS_OTG_USB_HOST_SUPPORT) + #error "The current board does not support USE_OTG_USB_HOST." +#endif + #if ENABLED(SD_FIRMWARE_UPDATE) && !defined(__AVR_ATmega2560__) #error "SD_FIRMWARE_UPDATE requires an ATmega2560-based (Arduino Mega) board." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index e6a1e92999..b3cfe5b6ba 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -52,6 +52,13 @@ #define SPI_DEVICE 2 +// +// Servos +// +#ifndef SERVO0_PIN + #define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) +#endif + // // Limit Switches // @@ -91,6 +98,7 @@ #ifndef DEFAULT_PWM_MOTOR_CURRENT #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } #endif + // // Temperature Sensors // @@ -111,10 +119,6 @@ #define POWER_LOSS_PIN PA2 // PW_DET #define PS_ON_PIN PA3 // PW_OFF -#ifndef SERVO0_PIN - #define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) -#endif - #define MT_DET_1_PIN PA4 #define MT_DET_PIN_INVERTING false diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index bfa4007658..d594e3ca49 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -35,6 +35,9 @@ #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24C64 ... 64Kb = 8KB) +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT + #define TP // Enable to define servo and probe pins // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 235ed1edcc..be05ebcfa9 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -44,6 +44,9 @@ #define FLASH_EEPROM_LEVELING #endif +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT + // // Servos // diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index f0fc99e0c0..81edff6793 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -41,6 +41,7 @@ //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation #define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB // // Release PB4 (Z_DIR_PIN) from JTAG NRST role diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index 3336340469..719f8773f5 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -36,6 +36,10 @@ //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation #define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB + +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index 539d316542..28a18cd9d8 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -44,8 +44,9 @@ #include "../../core/serial.h" #include "../../module/temperature.h" -static_assert(USB_CS_PIN != -1, "USB_CS_PIN must be defined"); -static_assert(USB_INTR_PIN != -1, "USB_INTR_PIN must be defined"); +#if DISABLED(USE_OTG_USB_HOST) && !PINS_EXIST(USB_CS, USB_INTR) + #error "USB_FLASH_DRIVE_SUPPORT requires USB_CS_PIN and USB_INTR_PIN to be defined." +#endif #if ENABLED(USE_UHS3_USB) #define NO_AUTO_SPEED @@ -81,6 +82,17 @@ static_assert(USB_INTR_PIN != -1, "USB_INTR_PIN must be defined"); #define UHS_START (usb.Init() == 0) #define UHS_STATE(state) UHS_USB_HOST_STATE_##state +#elif ENABLED(USE_OTG_USB_HOST) + + #if HAS_SD_HOST_DRIVE + #include HAL_PATH(../../HAL, msc_sd.h) + #endif + + #include HAL_PATH(../../HAL, usb_host.h) + + #define UHS_START usb.start() + #define rREVISION 0 + #define UHS_STATE(state) USB_STATE_##state #else #include "lib-uhs2/Usb.h" #include "lib-uhs2/masstorage.h" @@ -250,7 +262,7 @@ bool Sd2Card::isInserted() { return state == MEDIA_READY; } -bool Sd2Card::ready() { +bool Sd2Card::isReady() { return state > DO_STARTUP; } diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index 8ca95ba706..83245168ab 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -23,26 +23,27 @@ /** * \file - * \brief Sd2Card class for V2 SD/SDHC cards + * \brief Sd2Card class for USB Flash Drive */ - #include "../SdFatConfig.h" #include "../SdInfo.h" -/** - * Define SOFTWARE_SPI to use bit-bang SPI - */ -#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) - #define SOFTWARE_SPI -#endif +#if DISABLED(USE_OTG_USB_HOST) + /** + * Define SOFTWARE_SPI to use bit-bang SPI + */ + #if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) + #define SOFTWARE_SPI + #endif -// SPI pin definitions - do not edit here - change in SdFatConfig.h -#if ENABLED(SOFTWARE_SPI) - #warning "Auto-assigning '10' as the SD_CHIP_SELECT_PIN." - #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD -#else - // hardware pin defs - #define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS. + // SPI pin definitions - do not edit here - change in SdFatConfig.h + #if ENABLED(SOFTWARE_SPI) + #warning "Auto-assigning '10' as the SD_CHIP_SELECT_PIN." + #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD + #else + // hardware pin defs + #define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS. + #endif #endif class Sd2Card { @@ -54,22 +55,24 @@ class Sd2Card { public: static bool usbStartup(); - bool init(const uint8_t sckRateID=0, const pin_t chipSelectPin=SD_CHIP_SELECT_PIN); + bool init(const uint8_t sckRateID=0, const pin_t chipSelectPin=TERN(USE_OTG_USB_HOST, 0, SD_CHIP_SELECT_PIN)); static void idle(); - inline bool readStart(const uint32_t block) { pos = block; return ready(); } + inline bool readStart(const uint32_t block) { pos = block; return isReady(); } inline bool readData(uint8_t* dst) { return readBlock(pos++, dst); } inline bool readStop() const { return true; } - inline bool writeStart(const uint32_t block, const uint32_t) { pos = block; return ready(); } + inline bool writeStart(const uint32_t block, const uint32_t) { pos = block; return isReady(); } inline bool writeData(uint8_t* src) { return writeBlock(pos++, src); } inline bool writeStop() const { return true; } bool readBlock(uint32_t block, uint8_t* dst); bool writeBlock(uint32_t blockNumber, const uint8_t* src); + bool readCSD(csd_t* csd) { return true; }; + uint32_t cardSize(); static bool isInserted(); - static bool ready(); + bool isReady(); }; diff --git a/platformio.ini b/platformio.ini index 2aff7aad23..3e87968eef 100644 --- a/platformio.ini +++ b/platformio.ini @@ -59,7 +59,7 @@ default_src_filter = + - - + - - - - - - + - - - - - @@ -272,7 +272,8 @@ HAS_DGUS_LCD = src_filter=+ + EXTUI_EXAMPLE = src_filter=+ MALYAN_LCD = src_filter=+ -USB_FLASH_DRIVE_SUPPORT = src_filter=+ +USE_UHS2_USB = src_filter=+ +USE_UHS3_USB = src_filter=+ AUTO_BED_LEVELING_BILINEAR = src_filter=+ AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ MESH_BED_LEVELING = src_filter=+ + @@ -1278,6 +1279,23 @@ extra_scripts = ${common.extra_scripts} debug_tool = stlink debug_init_break = +# +# USB Flash Drive mix-ins for STM32 +# +[stm32_flash_drive] +platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc.zip +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DHAL_HCD_MODULE_ENABLED + -DUSBHOST -DUSBH_IRQ_PRIO=3 -DUSBH_IRQ_SUBPRIO=4 + +# +# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) with USB Flash Drive Support +# +[env:BIGTREE_SKR_PRO_usb_flash_drive] +extends = env:BIGTREE_SKR_PRO +platform_packages = ${stm32_flash_drive.platform_packages} +build_flags = ${stm32_flash_drive.build_flags} + # # Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) # @@ -1290,6 +1308,14 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common_stm32.build_flags} -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 +# +# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) with USB Flash Drive Support +# +[env:BIGTREE_GTR_V1_0_usb_flash_drive] +extends = env:BIGTREE_GTR_V1_0 +platform_packages = ${stm32_flash_drive.platform_packages} +build_flags = ${stm32_flash_drive.build_flags} + # # BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) # @@ -1392,13 +1418,16 @@ extra_scripts = ${common.extra_scripts} # [env:mks_robin_pro2] platform = ${common_stm32.platform} +platform_packages = ${stm32_flash_drive.platform_packages} extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_HCD_MODULE_ENABLED -DUSBHOST +build_flags = ${stm32_flash_drive.build_flags} board = genericSTM32F407VET6 board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx board_build.ldscript = ldscript.ld board_build.firmware = firmware.bin +board_build.offset = 0x0000 +board_upload.offset_address = 0x08000000 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC debug_tool = jlink upload_protocol = jlink @@ -1427,6 +1456,21 @@ extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py +# +# MKS Robin Nano V3 with USB Flash Drive Support +# Currently, using a STM32duino fork, until USB Host get merged +# +[env:mks_robin_nano_v3_usb_flash_drive] +extends = env:mks_robin_nano_v3 +platform_packages = ${stm32_flash_drive.platform_packages} +build_flags = ${stm32_flash_drive.build_flags} + -DUSBCON + -DUSE_USBHOST_HS + -DUSBD_IRQ_PRIO=5 + -DUSBD_IRQ_SUBPRIO=6 + -DUSE_USB_HS_IN_FS + -DUSBD_USE_CDC + ################################# # # # Other Architectures # From cf996949faf8b6f7dbc5f7ec2aad34e4ff1f9f61 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 29 Dec 2020 02:26:35 -0300 Subject: [PATCH 0813/1370] Support 4.3" (480x272) Color UI display (#20334) --- Marlin/Configuration.h | 1 + Marlin/src/inc/Conditionals_LCD.h | 9 +++ Marlin/src/lcd/tft/tft.h | 3 + Marlin/src/lcd/tft/ui_480x320.cpp | 67 +++++++++++---------- Marlin/src/lcd/tft/ui_480x320.h | 13 +++- Marlin/src/lcd/tft_io/ssd1963.h | 6 +- Marlin/src/lcd/tft_io/touch_calibration.cpp | 45 ++++++++++---- Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 5 -- 8 files changed, 97 insertions(+), 52 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d3b350bce4..d78657275b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2438,6 +2438,7 @@ //#define TOUCH_CALIBRATION_Y -8981 //#define TOUCH_OFFSET_X -43 //#define TOUCH_OFFSET_Y 257 + //#define TOUCH_ORIENTATION TOUCH_LANDSCAPE #if ENABLED(TFT_COLOR_UI) //#define SINGLE_TOUCH_NAVIGATION diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index f1192cea12..c94fcd0cfe 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1169,6 +1169,12 @@ #elif ENABLED(TFT_INTERFACE_FSMC) #define TFT_480x320 #endif +#elif ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 272 + #if ENABLED(TFT_INTERFACE_SPI) + #define TFT_480x272_SPI + #elif ENABLED(TFT_INTERFACE_FSMC) + #define TFT_480x272 + #endif #endif // Fewer lines with touch buttons on-screen @@ -1178,6 +1184,9 @@ #elif EITHER(TFT_480x320, TFT_480x320_SPI) #define HAS_UI_480x320 1 #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) +#elif EITHER(TFT_480x272, TFT_480x272_SPI) + #define HAS_UI_480x272 1 + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) #endif // This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h index d3ef62ec5b..99d335d135 100644 --- a/Marlin/src/lcd/tft/tft.h +++ b/Marlin/src/lcd/tft/tft.h @@ -43,6 +43,9 @@ #elif HAS_UI_480x320 #define TFT_WIDTH 480 #define TFT_HEIGHT 320 +#elif HAS_UI_480x272 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 272 #else #error "Unsupported display resolution!" #endif diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index ddd08e4d0d..f7955fb1bd 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_UI_480x320 +#if HAS_UI_480x320 || HAS_UI_480x272 #include "ui_480x320.h" @@ -56,9 +56,9 @@ void MarlinUI::tft_idle() { #if ENABLED(TOUCH_SCREEN) if (draw_menu_navigation) { - add_control(104, 286, PAGE_UP, imgPageUp, encoderTopLine > 0); - add_control(344, 286, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); - add_control(224, 286, BACK, imgBack); + add_control(104, TFT_HEIGHT - 34, PAGE_UP, imgPageUp, encoderTopLine > 0); + add_control(344, TFT_HEIGHT - 34, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); + add_control(224, TFT_HEIGHT - 34, BACK, imgBack); draw_menu_navigation = false; } #endif @@ -259,10 +259,12 @@ void MarlinUI::draw_status_screen() { } } + y += TERN(HAS_UI_480x272, 118, 128); + // coordinates - tft.canvas(4, 132, TFT_WIDTH - 8, 34); + tft.canvas(4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT); tft.set_background(COLOR_BACKGROUND); - tft.add_rectangle(0, 0, TFT_WIDTH - 8, 34, COLOR_AXIS_HOMED); + tft.add_rectangle(0, 0, TFT_WIDTH - 8, FONT_LINE_HEIGHT, COLOR_AXIS_HOMED); tft.add_text( 16, 3, COLOR_AXIS_HOMED , "X"); tft.add_text(192, 3, COLOR_AXIS_HOMED , "Y"); @@ -290,10 +292,11 @@ void MarlinUI::draw_status_screen() { offset -= tft_string.width(); } tft.add_text(455 - tft_string.width() - offset, 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, 132, TFT_WIDTH - 8, 34)); + TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT)); + y += TERN(HAS_UI_480x272, 38, 48); // feed rate - tft.canvas(96, 180, 100, 32); + tft.canvas(96, y, 100, 32); tft.set_background(COLOR_BACKGROUND); uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; tft.add_image(0, 0, imgFeedRate, color); @@ -303,7 +306,7 @@ void MarlinUI::draw_status_screen() { TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 96, 176, 100, 32)); // flow rate - tft.canvas(284, 180, 100, 32); + tft.canvas(284, y, 100, 32); tft.set_background(COLOR_BACKGROUND); color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; tft.add_image(0, 0, imgFlowRate, color); @@ -312,36 +315,38 @@ void MarlinUI::draw_status_screen() { tft.add_text(36, 1, color , tft_string); TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 284, 176, 100, 32, active_extruder)); + #if ENABLED(TOUCH_SCREEN) + add_control(404, y, menu_main, imgSettings); + TERN_(SDSUPPORT, add_control(12, y, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + #endif + + y += TERN(HAS_UI_480x272, 36, 44); // print duration char buffer[14]; duration_t elapsed = print_job_timer.duration(); elapsed.toDigital(buffer); - tft.canvas((TFT_WIDTH - 128) / 2, 224, 128, 29); + tft.canvas((TFT_WIDTH - 128) / 2, y, 128, 29); tft.set_background(COLOR_BACKGROUND); tft_string.set(buffer); tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); + y += TERN(HAS_UI_480x272, 28, 36); // progress bar const uint8_t progress = ui.get_progress_percent(); - tft.canvas(4, 260, TFT_WIDTH - 8, 9); + tft.canvas(4, y, TFT_WIDTH - 8, 9); tft.set_background(COLOR_PROGRESS_BG); tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME); if (progress) tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR); + y += 20; // status message - tft.canvas(0, 280, TFT_WIDTH, 29); + tft.canvas(0, y, TFT_WIDTH, FONT_LINE_HEIGHT - 5); tft.set_background(COLOR_BACKGROUND); tft_string.set(status_message); tft_string.trim(); tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); - - - #if ENABLED(TOUCH_SCREEN) - add_control(404, 180, menu_main, imgSettings); - TERN_(SDSUPPORT, add_control(12, 180, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); - #endif } // Draw a static item with no left-right margin required. Centered by default. @@ -450,9 +455,9 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const valu void TFT::draw_edit_screen_buttons() { #if ENABLED(TOUCH_SCREEN) - add_control(64, 256, DECREASE, imgDecrease); - add_control(352, 256, INCREASE, imgIncrease); - add_control(208, 256, CLICK, imgConfirm); + add_control(64, TFT_HEIGHT - 64, DECREASE, imgDecrease); + add_control(352, TFT_HEIGHT - 64, INCREASE, imgIncrease); + add_control(208, TFT_HEIGHT - 64, CLICK, imgConfirm); #endif } @@ -481,8 +486,8 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); } #if ENABLED(TOUCH_SCREEN) - add_control(88, 256, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); - add_control(328, 256, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + add_control(88, TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + add_control(328, TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); #endif } @@ -541,7 +546,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, lpos = pos.asLogical(); - tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2 - 43, 120, 43); + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2 - MENU_ITEM_HEIGHT, 120, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(X_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); @@ -549,7 +554,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.trim(); tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2, 120, 43); + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2, 120, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(Y_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); @@ -557,7 +562,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.trim(); tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2 + 43, 120, 43); + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2 + MENU_ITEM_HEIGHT, 120, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(Z_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); @@ -566,13 +571,13 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 48) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 5, 48, 43); + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 48) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 5, 48, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(ui8tostr3rj(x_plot)); tft_string.trim(); tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET + 16 - 24, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2, 48, 43); + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET + 16 - 24, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2, 48, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(ui8tostr3rj(y_plot)); tft_string.trim(); @@ -586,7 +591,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); add_control(320, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); - add_control(224, 286, BACK, imgBack); + add_control(224, TFT_HEIGHT - 34, BACK, imgBack); #endif } #endif // AUTO_BED_LEVELING_UBL @@ -644,7 +649,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #endif // TOUCH_SCREEN_CALIBRATION void menu_line(const uint8_t row, uint16_t color) { - tft.canvas(0, 4 + 45 * row, TFT_WIDTH, 43); + tft.canvas(0, 4 + (MENU_ITEM_HEIGHT + 2) * row, TFT_WIDTH, MENU_ITEM_HEIGHT); tft.set_background(color); } @@ -661,7 +666,7 @@ void menu_item(const uint8_t row, bool sel ) { menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); #if ENABLED(TOUCH_SCREEN) const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? MENU_CLICK : MENU_ITEM; - touch.add_control(tct, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row); + touch.add_control(tct, 0, 4 + (MENU_ITEM_HEIGHT + 2) * row, TFT_WIDTH, MENU_ITEM_HEIGHT, encoderTopLine + row); #endif } diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h index 078f35ac68..e3a688f112 100644 --- a/Marlin/src/lcd/tft/ui_480x320.h +++ b/Marlin/src/lcd/tft/ui_480x320.h @@ -38,8 +38,17 @@ void draw_fan_status(uint16_t x, uint16_t y, const bool blink); void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); void menu_item(const uint8_t row, bool sel = false); -#define MENU_FONT_NAME Helvetica18 -#define SYMBOLS_FONT_NAME Helvetica18_symbols +#if HAS_UI_480x320 + #define MENU_FONT_NAME Helvetica18 + #define SYMBOLS_FONT_NAME Helvetica18_symbols + #define MENU_ITEM_HEIGHT 43 + #define FONT_LINE_HEIGHT 34 +#elif HAS_UI_480x272 + #define MENU_FONT_NAME Helvetica14 + #define SYMBOLS_FONT_NAME Helvetica14_symbols + #define MENU_ITEM_HEIGHT 36 + #define FONT_LINE_HEIGHT 24 +#endif #define ABSOLUTE_ZERO -273.15 diff --git a/Marlin/src/lcd/tft_io/ssd1963.h b/Marlin/src/lcd/tft_io/ssd1963.h index af42e306c6..8564b28bfb 100644 --- a/Marlin/src/lcd/tft_io/ssd1963.h +++ b/Marlin/src/lcd/tft_io/ssd1963.h @@ -39,10 +39,10 @@ IF_0((TFT_ORIENTATION) & TFT_INVERT_X, SSD1963_MADCTL_FH) | \ IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, SSD1963_MADCTL_FV) -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR - #define SSD1963_COLOR SSD1963_MADCTL_BGR -#elif TFT_COLOR == TFT_COLOR_RGB +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_RGB #define SSD1963_COLOR SSD1963_MADCTL_RGB +#elif TFT_COLOR == TFT_COLOR_BGR + #define SSD1963_COLOR SSD1963_MADCTL_BGR #endif #define SSD1963_MADCTL_DATA (SSD1963_ORIENTATION) | (SSD1963_COLOR) diff --git a/Marlin/src/lcd/tft_io/touch_calibration.cpp b/Marlin/src/lcd/tft_io/touch_calibration.cpp index 159f09d087..3c24d42734 100644 --- a/Marlin/src/lcd/tft_io/touch_calibration.cpp +++ b/Marlin/src/lcd/tft_io/touch_calibration.cpp @@ -23,6 +23,11 @@ #include "touch_calibration.h" +#define TOUCH_CALIBRATION_MAX_RETRIES 5 + +#define DEBUG_OUT ENABLED(DEBUG_TOUCH_CALIBRATION) +#include "../../core/debug_out.h" + TouchCalibration touch_calibration; touch_calibration_t TouchCalibration::calibration; @@ -31,23 +36,40 @@ touch_calibration_point_t TouchCalibration::calibration_points[4]; uint8_t TouchCalibration::failed_count; void TouchCalibration::validate_calibration() { - const bool landscape = validate_precision_x(0, 1) && validate_precision_x(2, 3) && validate_precision_y(0, 2) && validate_precision_y(1, 3); - const bool portrait = validate_precision_y(0, 1) && validate_precision_y(2, 3) && validate_precision_x(0, 2) && validate_precision_x(1, 3); + #define VALIDATE_PRECISION(XY, A, B) validate_precision_##XY(CALIBRATION_##A, CALIBRATION_##B) + const bool landscape = VALIDATE_PRECISION(x, TOP_LEFT, BOTTOM_LEFT) + && VALIDATE_PRECISION(x, TOP_RIGHT, BOTTOM_RIGHT) + && VALIDATE_PRECISION(y, TOP_LEFT, TOP_RIGHT) + && VALIDATE_PRECISION(y, BOTTOM_LEFT, BOTTOM_RIGHT); + const bool portrait = VALIDATE_PRECISION(y, TOP_LEFT, BOTTOM_LEFT) + && VALIDATE_PRECISION(y, TOP_RIGHT, BOTTOM_RIGHT) + && VALIDATE_PRECISION(x, TOP_LEFT, TOP_RIGHT) + && VALIDATE_PRECISION(x, BOTTOM_LEFT, BOTTOM_RIGHT); + #undef VALIDATE_PRECISION - if (landscape || portrait) { + #define CAL_PTS(N) calibration_points[CALIBRATION_##N] + if (landscape) { calibration_state = CALIBRATION_SUCCESS; - calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_x + calibration_points[2].raw_x - calibration_points[1].raw_x - calibration_points[0].raw_x); - calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_y - calibration_points[2].raw_y + calibration_points[1].raw_y - calibration_points[0].raw_y); - calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_x + calibration_points[1].raw_x) * calibration.x) >> 17); - calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_y + calibration_points[2].raw_y) * calibration.y) >> 17); - calibration.orientation = landscape ? TOUCH_LANDSCAPE : TOUCH_PORTRAIT; + calibration.x = ((CAL_PTS(TOP_RIGHT).x - CAL_PTS(TOP_LEFT).x) << 17) / (CAL_PTS(BOTTOM_RIGHT).raw_x + CAL_PTS(TOP_RIGHT).raw_x - CAL_PTS(BOTTOM_LEFT).raw_x - CAL_PTS(TOP_LEFT).raw_x); + calibration.y = ((CAL_PTS(BOTTOM_LEFT).y - CAL_PTS(TOP_LEFT).y) << 17) / (CAL_PTS(BOTTOM_RIGHT).raw_y - CAL_PTS(TOP_RIGHT).raw_y + CAL_PTS(BOTTOM_LEFT).raw_y - CAL_PTS(TOP_LEFT).raw_y); + calibration.offset_x = CAL_PTS(TOP_LEFT).x - int16_t(((CAL_PTS(TOP_LEFT).raw_x + CAL_PTS(BOTTOM_LEFT).raw_x) * calibration.x) >> 17); + calibration.offset_y = CAL_PTS(TOP_LEFT).y - int16_t(((CAL_PTS(TOP_LEFT).raw_y + CAL_PTS(TOP_RIGHT).raw_y) * calibration.y) >> 17); + calibration.orientation = TOUCH_LANDSCAPE; + } + else if (portrait) { + calibration_state = CALIBRATION_SUCCESS; + calibration.x = ((CAL_PTS(TOP_RIGHT).x - CAL_PTS(TOP_LEFT).x) << 17) / (CAL_PTS(BOTTOM_RIGHT).raw_y + CAL_PTS(TOP_RIGHT).raw_y - CAL_PTS(BOTTOM_LEFT).raw_y - CAL_PTS(TOP_LEFT).raw_y); + calibration.y = ((CAL_PTS(BOTTOM_LEFT).y - CAL_PTS(TOP_LEFT).y) << 17) / (CAL_PTS(BOTTOM_RIGHT).raw_x - CAL_PTS(TOP_RIGHT).raw_x + CAL_PTS(BOTTOM_LEFT).raw_x - CAL_PTS(TOP_LEFT).raw_x); + calibration.offset_x = CAL_PTS(TOP_LEFT).x - int16_t(((CAL_PTS(TOP_LEFT).raw_y + CAL_PTS(BOTTOM_LEFT).raw_y) * calibration.x) >> 17); + calibration.offset_y = CAL_PTS(TOP_LEFT).y - int16_t(((CAL_PTS(TOP_LEFT).raw_x + CAL_PTS(TOP_RIGHT).raw_x) * calibration.y) >> 17); + calibration.orientation = TOUCH_PORTRAIT; } else { calibration_state = CALIBRATION_FAIL; calibration_reset(); - // Retry up to 5 times before reporting the failure - if (need_calibration() && failed_count++ < 5) calibration_state = CALIBRATION_TOP_LEFT; + if (need_calibration() && failed_count++ < TOUCH_CALIBRATION_MAX_RETRIES) calibration_state = CALIBRATION_TOP_LEFT; } + #undef CAL_PTS if (calibration_state == CALIBRATION_SUCCESS) { SERIAL_ECHOLNPGM("Touch screen calibration completed"); @@ -55,7 +77,7 @@ void TouchCalibration::validate_calibration() { SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_Y ", calibration.y); SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x); SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y); - SERIAL_ECHOPGM("TOUCH_ORIENTATION "); if (calibration.orientation == TOUCH_LANDSCAPE) SERIAL_ECHOLNPGM("TOUCH_LANDSCAPE"); else SERIAL_ECHOLNPGM("TOUCH_PORTRAIT"); + SERIAL_ECHO_TERNARY(calibration.orientation == TOUCH_LANDSCAPE, "TOUCH_ORIENTATION ", "TOUCH_LANDSCAPE", "TOUCH_PORTRAIT", "\n"); } } @@ -68,6 +90,7 @@ bool TouchCalibration::handleTouch(uint16_t x, uint16_t y) { if (calibration_state < CALIBRATION_SUCCESS) { calibration_points[calibration_state].raw_x = x; calibration_points[calibration_state].raw_y = y; + DEBUG_ECHOLNPAIR("TouchCalibration - State: ", calibration_state, ", x: ", calibration_points[calibration_state].x, ", raw_x: ", x, ", y: ", calibration_points[calibration_state].y, ", raw_y: ", y); } switch (calibration_state) { diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h index 7f429d4497..0721aab844 100644 --- a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h @@ -155,11 +155,6 @@ #define TOUCH_INT_PIN PB1 #endif -// Touchscreen calibration does not work correctly with ANET_ET5_TFT35 or ANET_ET4_TFT28 -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - #undef TOUCH_SCREEN_CALIBRATION -#endif - #if ENABLED(ANET_ET5_TFT35) #ifndef TOUCH_CALIBRATION_X #define TOUCH_CALIBRATION_X 17125 From 7a748bd565f8b95dfcdb5f2706d5d0a255b0ebe3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 30 Dec 2020 22:00:36 -0600 Subject: [PATCH 0814/1370] SPI and pins cleanup --- .../dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp | 15 +- .../HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp | 3 - Marlin/src/HAL/LPC1768/tft/xpt2046.h | 2 +- .../u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp | 8 +- .../u8g/u8g_com_HAL_LPC1768_sw_spi.cpp | 8 +- .../STM32F1/dogm/u8g_com_stm32duino_swspi.cpp | 12 +- Marlin/src/HAL/STM32F1/tft/xpt2046.h | 2 +- Marlin/src/libs/L64XX/README.md | 2 +- .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 2 +- Marlin/src/pins/lpc1769/pins_FLY_CDY.h | 7 - Marlin/src/pins/stm32f1/pins_BEAST.h | 146 ++--------------- .../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 10 +- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 147 ++--------------- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 148 ++---------------- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 30 ++-- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 96 ++++++------ Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 2 +- .../variants/CHITU_F103/board/board.h | 3 - 20 files changed, 130 insertions(+), 517 deletions(-) diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp index be4b49c0f9..d07da15ad8 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -64,12 +64,11 @@ #include "../../../MarlinCore.h" -void spiBegin(); -void spiInit(uint8_t spiRate); -void spiSend(uint8_t b); -void spiSend(const uint8_t* buf, size_t n); +#ifndef LCD_SPI_SPEED + #define LCD_SPI_SPEED SPI_QUARTER_SPEED +#endif -#include "../../shared/Marduino.h" +#include "../../shared/HAL_SPI.h" #include "../fastio.h" void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) { @@ -100,11 +99,7 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va spiBegin(); - #ifndef SPI_SPEED - #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card - #endif - spiInit(2); - + spiInit(LCD_SPI_SPEED); break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp index ea7204fa36..890546af58 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp @@ -59,9 +59,6 @@ #if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920) -#undef SPI_SPEED -#define SPI_SPEED 2 // About 2 MHz - #include "u8g_com_HAL_DUE_sw_spi_shared.h" #include "../../shared/Marduino.h" diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.h b/Marlin/src/HAL/LPC1768/tft/xpt2046.h index 29db0b3fc4..223985f3d2 100644 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.h +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.h @@ -37,7 +37,7 @@ #define TOUCH_SCK_PIN SCK_PIN #endif #ifndef TOUCH_CS_PIN - #define TOUCH_CS_PIN CS_PIN + #define TOUCH_CS_PIN SS_PIN #endif #ifndef TOUCH_INT_PIN #define TOUCH_INT_PIN -1 diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp index 10d8494162..61211d9d88 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp @@ -62,9 +62,11 @@ #include #include #include "../../shared/Delay.h" +#include "../../shared/HAL_SPI.h" -#undef SPI_SPEED -#define SPI_SPEED 3 // About 1 MHz +#ifndef LCD_SPI_SPEED + #define LCD_SPI_SPEED SPI_EIGHTH_SPEED // About 1 MHz +#endif static pin_t SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL; static uint8_t SPI_speed = 0; @@ -92,7 +94,7 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar u8g_SetPIOutput(u8g, U8G_PI_MOSI); u8g_Delay(5); - SPI_speed = swSpiInit(SPI_SPEED, SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL); + SPI_speed = swSpiInit(LCD_SPI_SPEED, SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL); u8g_SetPILevel(u8g, U8G_PI_CS, 0); u8g_SetPILevel(u8g, U8G_PI_SCK, 0); diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp index ca9d6ecfbe..7f38ec54af 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp @@ -60,9 +60,11 @@ #if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920) #include +#include "../../shared/HAL_SPI.h" -#undef SPI_SPEED -#define SPI_SPEED 2 // About 2 MHz +#ifndef LCD_SPI_SPEED + #define LCD_SPI_SPEED SPI_QUARTER_SPEED // About 2 MHz +#endif #include #include @@ -145,7 +147,7 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, u8g_SetPIOutput(u8g, U8G_PI_CS); u8g_SetPIOutput(u8g, U8G_PI_A0); if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET); - SPI_speed = swSpiInit(SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]); + SPI_speed = swSpiInit(LCD_SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]); u8g_SetPILevel(u8g, U8G_PI_SCK, 0); u8g_SetPILevel(u8g, U8G_PI_MOSI, 0); break; diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp index 60596054e8..784a80c29f 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp @@ -23,12 +23,14 @@ #if BOTH(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) #include +#include "../../shared/HAL_SPI.h" -#undef SPI_SPEED -#define SPI_SPEED 0 // Fastest -//#define SPI_SPEED 2 // Slower +#ifndef LCD_SPI_SPEED + #define LCD_SPI_SPEED SPI_FULL_SPEED // Fastest + //#define LCD_SPI_SPEED SPI_QUARTER_SPEED // Slower +#endif -static uint8_t SPI_speed = SPI_SPEED; +static uint8_t SPI_speed = LCD_SPI_SPEED; static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { LOOP_L_N(i, 8) { @@ -104,7 +106,7 @@ static uint8_t swSpiInit(const uint8_t spi_speed) { uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch (msg) { case U8G_COM_MSG_INIT: - SPI_speed = swSpiInit(SPI_SPEED); + SPI_speed = swSpiInit(LCD_SPI_SPEED); break; case U8G_COM_MSG_STOP: diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h index 29db0b3fc4..223985f3d2 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h @@ -37,7 +37,7 @@ #define TOUCH_SCK_PIN SCK_PIN #endif #ifndef TOUCH_CS_PIN - #define TOUCH_CS_PIN CS_PIN + #define TOUCH_CS_PIN SS_PIN #endif #ifndef TOUCH_INT_PIN #define TOUCH_INT_PIN -1 diff --git a/Marlin/src/libs/L64XX/README.md b/Marlin/src/libs/L64XX/README.md index c68d8ca0ed..d28bec5e67 100644 --- a/Marlin/src/libs/L64XX/README.md +++ b/Marlin/src/libs/L64XX/README.md @@ -16,7 +16,7 @@ This software assumes that all drivers are in one SPI daisy chain. - SDO of the last device is tied to MISO of the controller -- All devices share the same `SCK` and `SS_PIN` pins. The user must supply a macro to control the `RESET_PIN`(s). +- All devices share the same `SCK_PIN` and `SS_PIN` pins. The user must supply a macro to control the `RESET_PIN`(s). - Each L6470 passes the data it saw on its SDI to its neighbor on the **NEXT** SPI cycle (8 bit delay). diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 097a41347c..a34b70bae3 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -174,7 +174,7 @@ #define FAN1_PIN P2_02 #ifndef CONTROLLER_FAN_PIN - #define CONTROLLER_FAN_PIN FAN1_PIN + #define CONTROLLER_FAN_PIN FAN1_PIN #endif /** diff --git a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h index e9c943d4ae..5e4bea1c2b 100644 --- a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h +++ b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h @@ -33,7 +33,6 @@ // #define SERVO0_PIN P1_26 - // // Limit Switches // @@ -45,7 +44,6 @@ #define Z_MIN_PIN P1_22 // Z- #define Z_MAX_PIN P0_27 // Z+ - // // Steppers // @@ -106,7 +104,6 @@ #endif #endif - #if HAS_TMC_UART #define X_SERIAL_TX_PIN P1_04 #define X_SERIAL_RX_PIN P1_04 @@ -130,8 +127,6 @@ #define TMC_BAUD_RATE 19200 #endif - - // // Temperature Sensors // @@ -153,7 +148,6 @@ #define FAN1_PIN P1_21 #define FAN2_PIN P1_24 - // // LCD / Controller // @@ -168,7 +162,6 @@ #define BTN_EN2 P0_01 #define BTN_ENC P0_28 - #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD #endif diff --git a/Marlin/src/pins/stm32f1/pins_BEAST.h b/Marlin/src/pins/stm32f1/pins_BEAST.h index ccb8a31ab7..bf2cf6463a 100644 --- a/Marlin/src/pins/stm32f1/pins_BEAST.h +++ b/Marlin/src/pins/stm32f1/pins_BEAST.h @@ -123,16 +123,7 @@ #if HAS_WIRED_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 + #error "REPRAPWORLD_GRAPHICAL_LCD is not supported." #else #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -141,144 +132,27 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if !IS_NEWPANEL - #define BEEPER_PIN 33 - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + #error "Non-NEWPANEL LCD is not supported." #endif #endif #if IS_NEWPANEL - #if IS_RRD_SC - - #define BEEPER_PIN 37 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - + #error "RRD Smart Controller is not supported." #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - + #error "REPRAPWORLD_GRAPHICAL_LCD is not supported." #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN 41 - + #error "LCD_I2C_PANELOLU2 is not supported." #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - - #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - + #error "LCD_I2C_VIKI is not supported." #elif ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN 33 - - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SDSS 53 - #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - - #define KILL_PIN 31 - - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - + #error "VIKI2 / miniVIKI is not supported." #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 - + #error "ELB_FULL_GRAPHIC_CONTROLLER is not supported." #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 - - #define KILL_PIN 64 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - // not connected to a pin - #define SD_DETECT_PIN 49 - + #error "MINIPANEL is not supported." #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons directly attached to AUX-2 - #if IS_RRW_KEYPAD - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #else - //#define SD_DETECT_PIN -1 // Ramps doesn't use this - #endif - + #error "Other generic NEWPANEL LCD is not supported." #endif #endif // IS_NEWPANEL diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 9f2513cc82..ead939707f 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -188,7 +188,7 @@ * Board Display * _____ _____ * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) - * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) GLCD_CS | 3 4 | SD_CS (PA10) + * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) LCD_CS | 3 4 | SD_CS (PA10) * (FREE) PB9 | 5 6 | PA10 (SD_CS) (FREE) | 5 6 | MOSI (SPI1-MOSI) * RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | (FREE) * (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index e980d884a7..c52b12b26b 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -62,10 +62,10 @@ // SPI // Note: FLSun Hispeed (clone MKS_Robin_miniV2) board is using SPI2 interface. // +#define SCK_PIN PB13 // SPI2 +#define MISO_PIN PB14 // SPI2 +#define MOSI_PIN PB15 // SPI2 #define SPI_DEVICE 2 -#define SCK_PIN PB13 // SPI2 -#define MISO_PIN PB14 // SPI2 -#define MOSI_PIN PB15 // SPI2 // SPI Flash #define HAS_SPI_FLASH 1 @@ -129,7 +129,7 @@ #define Y_SERIAL_RX_PIN PA9 // TXD1 #define Z_SERIAL_TX_PIN PC7 // IO1 #define Z_SERIAL_RX_PIN PC7 // IO1 - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #else // Motor current PWM pins #define MOTOR_CURRENT_PWM_XY_PIN PA6 // VREF2/3 CONTROL XY @@ -210,7 +210,7 @@ */ //#define SW_DIO PA13 //#define SW_CLK PA14 -//#define SW_RST NRST // (14) +//#define SW_RST NRST // (14) // // Power Supply Control diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index 6f252fbef6..d666755c6f 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -100,16 +100,7 @@ #if HAS_WIRED_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 + #error "REPRAPWORLD_GRAPHICAL_LCD is not supported." #else #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -118,145 +109,29 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if !IS_NEWPANEL - #define BEEPER_PIN 33 - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + #error "Non-NEWPANEL LCD is not supported." #endif #endif #if IS_NEWPANEL - #if IS_RRD_SC - - #define BEEPER_PIN 37 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - + #error "RRD Smart Controller is not supported." #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - + #error "REPRAPWORLD_GRAPHICAL_LCD is not supported." #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN 41 - + #error "LCD_I2C_PANELOLU2 is not supported." #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - - #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - + #error "LCD_I2C_VIKI is not supported." #elif ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN 33 - - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SDSS 53 - #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - - #define KILL_PIN 31 - - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - + #error "VIKI2 / miniVIKI is not supported." #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 - + #error "ELB_FULL_GRAPHIC_CONTROLLER is not supported." #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 - - #define KILL_PIN 64 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - // not connected to a pin - #define SD_DETECT_PIN 49 - + #error "MINIPANEL is not supported." #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons directly attached to AUX-2 - #if IS_RRW_KEYPAD - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #else - //#define SD_DETECT_PIN -1 // Ramps doesn't use this - #endif - + #error "Other generic NEWPANEL LCD is not supported." #endif - #endif // IS_NEWPANEL + #endif #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index ef82b71f56..4f8183caf4 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -115,16 +115,7 @@ #if HAS_WIRED_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 + #error "REPRAPWORLD_GRAPHICAL_LCD is not supported." #else #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -133,13 +124,7 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if !IS_NEWPANEL - #define BEEPER_PIN 33 - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + #error "Non-NEWPANEL LCD is not supported." #endif #endif @@ -154,132 +139,23 @@ #elif IS_NEWPANEL #if IS_RRD_SC - - #define BEEPER_PIN 37 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - + #error "RRD Smart Controller is not supported." #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - + #error "REPRAPWORLD_GRAPHICAL_LCD is not supported." #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN 41 - + #error "LCD_I2C_PANELOLU2 is not supported." #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - - #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - + #error "LCD_I2C_VIKI is not supported." #elif ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN 33 - - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SDSS 53 - #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - - #define KILL_PIN 31 - - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - + #error "VIKI2 / miniVIKI is not supported." #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 - + #error "ELB_FULL_GRAPHIC_CONTROLLER is not supported." #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 - - #define KILL_PIN 64 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - // not connected to a pin - #define SD_DETECT_PIN 49 - + #error "MINIPANEL is not supported." #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons directly attached to AUX-2 - #if IS_RRW_KEYPAD - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #else - //#define SD_DETECT_PIN -1 // Ramps doesn't use this - #endif - + #error "Other generic NEWPANEL LCD is not supported." #endif - #endif // IS_NEWPANEL + + #endif #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index d594e3ca49..d8a6e453fe 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -63,39 +63,39 @@ // Limit Switches // #ifdef X_STALL_SENSITIVITY - #define X_STOP_PIN X_DIAG_PIN + #define X_STOP_PIN X_DIAG_PIN #if X_HOME_DIR < 0 - #define X_MAX_PIN E0_DIAG_PIN // X+ + #define X_MAX_PIN E0_DIAG_PIN // X+ #else - #define X_MIN_PIN E0_DIAG_PIN // X+ + #define X_MIN_PIN E0_DIAG_PIN // X+ #endif #else - #define X_MIN_PIN X_DIAG_PIN // X- - #define X_MAX_PIN E0_DIAG_PIN // X+ + #define X_MIN_PIN X_DIAG_PIN // X- + #define X_MAX_PIN E0_DIAG_PIN // X+ #endif #ifdef Y_STALL_SENSITIVITY - #define Y_STOP_PIN Y_DIAG_PIN + #define Y_STOP_PIN Y_DIAG_PIN #if Y_HOME_DIR < 0 - #define Y_MAX_PIN E1_DIAG_PIN // Y+ + #define Y_MAX_PIN E1_DIAG_PIN // Y+ #else - #define Y_MIN_PIN E1_DIAG_PIN // Y+ + #define Y_MIN_PIN E1_DIAG_PIN // Y+ #endif #else - #define Y_MIN_PIN Y_DIAG_PIN // Y- - #define Y_MAX_PIN E1_DIAG_PIN // Y+ + #define Y_MIN_PIN Y_DIAG_PIN // Y- + #define Y_MAX_PIN E1_DIAG_PIN // Y+ #endif #ifdef Z_STALL_SENSITIVITY - #define Z_STOP_PIN Z_DIAG_PIN + #define Z_STOP_PIN Z_DIAG_PIN #if Z_HOME_DIR < 0 - #define Z_MAX_PIN E2_DIAG_PIN // Z+ + #define Z_MAX_PIN E2_DIAG_PIN // Z+ #else - #define Z_MIN_PIN E2_DIAG_PIN // Z+ + #define Z_MIN_PIN E2_DIAG_PIN // Z+ #endif #else - #define Z_MIN_PIN Z_DIAG_PIN // Z- - #define Z_MAX_PIN E2_DIAG_PIN // Z+ + #define Z_MIN_PIN Z_DIAG_PIN // Z- + #define Z_MAX_PIN E2_DIAG_PIN // Z+ #endif // diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index ef96eecd74..688c321c72 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -142,7 +142,7 @@ // SD support // #define SDIO_SUPPORT -#define SDIO_CLOCK 4800000 +#define SDIO_CLOCK 4800000 // // Misc. Functions diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index bd4d1f6618..8775847738 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -35,61 +35,61 @@ // // Servos // -#define SERVO0_PIN PD12 //confirmed +#define SERVO0_PIN PD12 //#define SERVO1_PIN -1 // // Limit Switches // -#define X_MIN_PIN PG9 //confirmed -#define Y_MIN_PIN PG10 //confirmed -#define Z_MIN_PIN PG11 //confirmed +#define X_MIN_PIN PG9 +#define Y_MIN_PIN PG10 +#define Z_MIN_PIN PG11 -#define X_MAX_PIN PG12 //confirmed -#define Y_MAX_PIN PG13 //confirmed -#define Z_MAX_PIN PG14 //confirmed +#define X_MAX_PIN PG12 +#define Y_MAX_PIN PG13 +#define Z_MAX_PIN PG14 // // Filament runout // -#define FIL_RUNOUT_PIN PC5 //confirmed +#define FIL_RUNOUT_PIN PC5 // // Z Probe (when not Z_MIN_PIN) // #ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PG8 //confirmed + #define Z_MIN_PROBE_PIN PG8 #endif // // Steppers // -#define X_STEP_PIN PF7 //confirmed -#define X_DIR_PIN PF8 //confirmed -#define X_ENABLE_PIN PF6 //confirmed +#define X_STEP_PIN PF7 +#define X_DIR_PIN PF8 +#define X_ENABLE_PIN PF6 -#define Y_STEP_PIN PF10 //confirmed -#define Y_DIR_PIN PF11 //confirmed -#define Y_ENABLE_PIN PF9 //confirmed +#define Y_STEP_PIN PF10 +#define Y_DIR_PIN PF11 +#define Y_ENABLE_PIN PF9 -#define Z_STEP_PIN PF13 //confirmed -#define Z_DIR_PIN PF14 //confirmed -#define Z_ENABLE_PIN PF12 //confirmed +#define Z_STEP_PIN PF13 +#define Z_DIR_PIN PF14 +#define Z_ENABLE_PIN PF12 -#define E0_STEP_PIN PG0 //confirmed -#define E0_DIR_PIN PG1 //confirmed -#define E0_ENABLE_PIN PF15 //confirmed +#define E0_STEP_PIN PG0 +#define E0_DIR_PIN PG1 +#define E0_ENABLE_PIN PF15 -#define E1_STEP_PIN PG3 //confirmed -#define E1_DIR_PIN PG4 //confirmed -#define E1_ENABLE_PIN PG2 //confirmed +#define E1_STEP_PIN PG3 +#define E1_DIR_PIN PG4 +#define E1_ENABLE_PIN PG2 // // Temperature Sensors // #define TEMP_0_PIN PC0 // See below for activation of thermistor readings #define TEMP_1_PIN PC1 // See below for activation of thermistor readings -#define TEMP_BED_PIN PC3 //confirmed +#define TEMP_BED_PIN PC3 // Lergde-S can choose thermocouple/thermistor mode in software. // For use with thermistors, these pins must be OUT/LOW. @@ -114,13 +114,13 @@ // // Heaters / Fans // -#define HEATER_0_PIN PA0 //confirmed -#define HEATER_1_PIN PA1 //confirmed -#define HEATER_BED_PIN PA3 //confirmed +#define HEATER_0_PIN PA0 +#define HEATER_1_PIN PA1 +#define HEATER_BED_PIN PA3 -#define FAN_PIN PA15 // heater 0 fan 1 //confirmed -#define FAN1_PIN PB10 // heater 1 fan 2 //confirmed -#define FAN2_PIN PF5 // heater 0 fan 2 and heater 1 fan 1 (two sockets, switched together) //confirmed +#define FAN_PIN PA15 // heater 0 fan 1 +#define FAN1_PIN PB10 // heater 1 fan 2 +#define FAN2_PIN PF5 // heater 0 fan 2 and heater 1 fan 1 (two sockets, switched together) #ifndef E0_AUTO_FAN_PIN #define E0_AUTO_FAN_PIN PF5 @@ -136,19 +136,19 @@ // LED / Lighting // //Lerdge-S board has two LED connectors (this is the one on the mainboard) -#define CASE_LIGHT_PIN PC7 //confirmed +#define CASE_LIGHT_PIN PC7 //on the dual extrusion addon board is a RGB connector -#define RGB_LED_R_PIN PC7 // Shared with the mainboard LED light connector (CASE_LIGHT_PIN), confirmed -#define RGB_LED_G_PIN PB0 //confirmed -#define RGB_LED_B_PIN PB1 //confirmed +#define RGB_LED_R_PIN PC7 // Shared with the mainboard LED light connector (CASE_LIGHT_PIN) +#define RGB_LED_G_PIN PB0 +#define RGB_LED_B_PIN PB1 // // Misc. Functions // #define SDSS PC11 // SD is working using SDIO, not sure if this definition is needed? -#define LED_PIN PC6 // Mainboard soldered green LED, confirmed -#define PS_ON_PIN PB2 // Board has a power module connector, confirmed +#define LED_PIN PC6 // Mainboard soldered green LED +#define PS_ON_PIN PB2 // Board has a power module connector #define KILL_PIN -1 // There is no reset button on the LCD #define POWER_LOSS_PIN -1 // PB2 could be used for this as well @@ -158,12 +158,12 @@ #define SDIO_SUPPORT #define SDIO_CLOCK 4800000 -#define SCK_PIN PC12 //confirmed working -#define MISO_PIN PC8 //confirmed working -#define MOSI_PIN PD2 //confirmed working -#define SS_PIN PC11 //confirmed working +#define SCK_PIN PC12 +#define MISO_PIN PC8 +#define MOSI_PIN PD2 +#define SS_PIN PC11 -#define SD_DETECT_PIN PG15 //confirmed +#define SD_DETECT_PIN PG15 // // Persistent Storage @@ -190,14 +190,14 @@ // // The LCD is initialized in FSMC mode -#define BEEPER_PIN PD13 //confirmed +#define BEEPER_PIN PD13 -#define BTN_EN1 PC14 //confirmed -#define BTN_EN2 PC15 //confirmed -#define BTN_ENC PC13 //confirmed +#define BTN_EN1 PC14 +#define BTN_EN2 PC15 +#define BTN_ENC PC13 -#define TFT_RESET_PIN PD6 //confirmed -#define TFT_BACKLIGHT_PIN PD3 //confirmed +#define TFT_RESET_PIN PD6 +#define TFT_BACKLIGHT_PIN PD3 #define TFT_CS_PIN PD7 // TFT works #define TFT_RS_PIN PD11 // TFT works diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index c8f52d6987..ebf7120a44 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -127,7 +127,7 @@ // #define SDIO_SUPPORT #define SD_DETECT_PIN PA8 -#define SDIO_CLOCK 4800000 +#define SDIO_CLOCK 4800000 // // LCD / Controller diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h b/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h index 20fd9d379f..a1e3346743 100755 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h @@ -69,14 +69,11 @@ #define BOARD_SPI1_MISO_PIN PA6 #define BOARD_SPI1_MOSI_PIN PA7 - - #define BOARD_SPI2_NSS_PIN PB12 #define BOARD_SPI2_SCK_PIN PB13 #define BOARD_SPI2_MISO_PIN PB14 #define BOARD_SPI2_MOSI_PIN PB15 - #define BOARD_SPI3_NSS_PIN PA15 #define BOARD_SPI3_SCK_PIN PB3 #define BOARD_SPI3_MISO_PIN PB4 From 2c58d0881b4f1f03d2173ba0e258d6d2b8b1bf37 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 1 Jan 2021 17:31:15 -0300 Subject: [PATCH 0815/1370] Prefix SD SPI pins (SCK, MISO, MOSI, SS) (#20606) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 10 --- Marlin/Configuration_adv.h | 10 +++ Marlin/src/HAL/AVR/HAL_SPI.cpp | 28 +++--- Marlin/src/HAL/AVR/spi_pins.h | 16 ++-- Marlin/src/HAL/DUE/HAL_SPI.cpp | 88 +++++++++---------- Marlin/src/HAL/DUE/inc/SanityCheck.h | 2 +- Marlin/src/HAL/DUE/spi_pins.h | 20 ++--- Marlin/src/HAL/ESP32/HAL_SPI.cpp | 6 +- Marlin/src/HAL/ESP32/spi_pins.h | 8 +- Marlin/src/HAL/LINUX/spi_pins.h | 33 +++---- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 43 +++++---- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 8 +- Marlin/src/HAL/LPC1768/main.cpp | 6 +- Marlin/src/HAL/LPC1768/spi_pins.h | 28 +++--- Marlin/src/HAL/LPC1768/tft/xpt2046.h | 8 +- .../u8g/u8g_com_HAL_LPC1768_hw_spi.cpp | 16 ++-- Marlin/src/HAL/SAMD51/spi_pins.h | 16 ++-- Marlin/src/HAL/STM32/HAL_SPI.cpp | 26 +++--- Marlin/src/HAL/STM32/spi_pins.h | 16 ++-- Marlin/src/HAL/STM32F1/HAL_SPI.cpp | 4 +- Marlin/src/HAL/STM32F1/spi_pins.h | 20 ++--- Marlin/src/HAL/STM32F1/tft/xpt2046.h | 8 +- Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp | 14 +-- Marlin/src/HAL/TEENSY31_32/spi_pins.h | 8 +- Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp | 14 +-- Marlin/src/HAL/TEENSY35_36/spi_pins.h | 8 +- Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp | 14 +-- Marlin/src/HAL/TEENSY40_41/spi_pins.h | 8 +- Marlin/src/feature/dac/dac_dac084s085.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 6 +- Marlin/src/inc/Conditionals_post.h | 6 +- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/lcd/dogm/marlinui_DOGM.h | 6 +- .../archim2-flash/media_file_reader.cpp | 2 +- .../ftdi_eve_lib/basic/spi.cpp | 2 +- .../screens/media_player_screen.cpp | 2 +- Marlin/src/libs/private_spi.h | 8 +- Marlin/src/module/temperature.cpp | 4 +- Marlin/src/pins/esp32/pins_E4D.h | 6 +- Marlin/src/pins/esp32/pins_FYSETC_E4.h | 6 +- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 6 +- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 6 +- Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h | 16 ++-- Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 10 +-- Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 10 +-- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 8 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 14 +-- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 16 ++-- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 39 ++++---- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 10 +-- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 25 +++--- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 20 ++--- .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 8 +- .../src/pins/lpc1769/pins_COHESION3D_REMIX.h | 21 +++-- Marlin/src/pins/lpc1769/pins_FLY_CDY.h | 16 ++-- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 10 +-- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 8 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 8 +- Marlin/src/pins/pinsDebug_list.h | 8 +- .../src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 6 +- Marlin/src/pins/sam/pins_ARCHIM1.h | 6 +- Marlin/src/pins/sam/pins_ARCHIM2.h | 6 +- Marlin/src/pins/sam/pins_CNCONTROLS_15D.h | 6 +- Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 6 +- Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h | 6 +- .../src/pins/sanguino/pins_MELZI_CREALITY.h | 8 +- Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 6 +- Marlin/src/pins/stm32f0/pins_MALYAN_M300.h | 2 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 2 +- .../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 +- .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 16 ++-- .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 8 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 8 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 8 +- Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h | 14 +-- Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 10 +-- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 18 ++-- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 18 ++-- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 18 ++-- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 18 ++-- Marlin/src/pins/stm32f1/pins_MALYAN_M200.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 14 +-- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 8 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 8 +- .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 8 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 8 +- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 16 ++-- Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 6 +- .../src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 6 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 8 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 8 +- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 6 +- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 12 +-- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 6 +- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 8 +- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 8 +- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 8 +- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 14 +-- .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 14 +-- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 6 +- .../src/pins/stm32f4/pins_STEVAL_3DP001V1.h | 18 ++-- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 14 +-- Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h | 8 +- Marlin/src/sd/cardreader.cpp | 4 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 2 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.h | 2 +- .../sd/usb_flashdrive/lib-uhs2/usbhost.cpp | 8 +- 109 files changed, 612 insertions(+), 613 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d78657275b..c283c86dd5 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1823,16 +1823,6 @@ */ //#define SDSUPPORT -/** - * SD CARD: SPI SPEED - * - * Enable one of the following items for a slower SPI transfer speed. - * This may be required to resolve "volume init" errors. - */ -//#define SPI_SPEED SPI_HALF_SPEED -//#define SPI_SPEED SPI_QUARTER_SPEED -//#define SPI_SPEED SPI_EIGHTH_SPEED - /** * SD CARD: ENABLE CRC * diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 990eb05144..0a64764cae 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1182,6 +1182,16 @@ #endif #if ENABLED(SDSUPPORT) + /** + * SD Card SPI Speed + * May be required to resolve "volume init" errors. + * + * Enable and set to SPI_HALF_SPEED, SPI_QUARTER_SPEED, or SPI_EIGHTH_SPEED + * otherwise full speed will be applied. + * + * :['SPI_HALF_SPEED', 'SPI_QUARTER_SPEED', 'SPI_EIGHTH_SPEED'] + */ + //#define SD_SPI_SPEED SPI_HALF_SPEED // The standard SD detect circuit reads LOW when media is inserted and HIGH when empty. // Enable this option and set to HIGH if your SD cards are incorrectly detected. diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp index 31e589746c..3e5572e559 100644 --- a/Marlin/src/HAL/AVR/HAL_SPI.cpp +++ b/Marlin/src/HAL/AVR/HAL_SPI.cpp @@ -34,17 +34,17 @@ #include "../../inc/MarlinConfig.h" void spiBegin() { - OUT_WRITE(SS_PIN, HIGH); - SET_OUTPUT(SCK_PIN); - SET_INPUT(MISO_PIN); - SET_OUTPUT(MOSI_PIN); + OUT_WRITE(SD_SS_PIN, HIGH); + SET_OUTPUT(SD_SCK_PIN); + SET_INPUT(SD_MISO_PIN); + SET_OUTPUT(SD_MOSI_PIN); #if DISABLED(SOFTWARE_SPI) // SS must be in output mode even it is not chip select - //SET_OUTPUT(SS_PIN); + //SET_OUTPUT(SD_SS_PIN); // set SS high - may be chip select for another SPI device //#if SET_SPI_SS_HIGH - //WRITE(SS_PIN, HIGH); + //WRITE(SD_SS_PIN, HIGH); //#endif // set a default rate spiInit(1); @@ -195,19 +195,19 @@ void spiBegin() { // no interrupts during byte receive - about 8µs cli(); // output pin high - like sending 0xFF - WRITE(MOSI_PIN, HIGH); + WRITE(SD_MOSI_PIN, HIGH); LOOP_L_N(i, 8) { - WRITE(SCK_PIN, HIGH); + WRITE(SD_SCK_PIN, HIGH); nop; // adjust so SCK is nice nop; data <<= 1; - if (READ(MISO_PIN)) data |= 1; + if (READ(SD_MISO_PIN)) data |= 1; - WRITE(SCK_PIN, LOW); + WRITE(SD_SCK_PIN, LOW); } sei(); @@ -225,10 +225,10 @@ void spiBegin() { // no interrupts during byte send - about 8µs cli(); LOOP_L_N(i, 8) { - WRITE(SCK_PIN, LOW); - WRITE(MOSI_PIN, data & 0x80); + WRITE(SD_SCK_PIN, LOW); + WRITE(SD_MOSI_PIN, data & 0x80); data <<= 1; - WRITE(SCK_PIN, HIGH); + WRITE(SD_SCK_PIN, HIGH); } nop; // hold SCK high for a few ns @@ -236,7 +236,7 @@ void spiBegin() { nop; nop; - WRITE(SCK_PIN, LOW); + WRITE(SD_SCK_PIN, LOW); sei(); } diff --git a/Marlin/src/HAL/AVR/spi_pins.h b/Marlin/src/HAL/AVR/spi_pins.h index f3fa78e2bf..831972938a 100644 --- a/Marlin/src/HAL/AVR/spi_pins.h +++ b/Marlin/src/HAL/AVR/spi_pins.h @@ -51,15 +51,15 @@ #define AVR_SS_PIN 16 #endif -#ifndef SCK_PIN - #define SCK_PIN AVR_SCK_PIN +#ifndef SD_SCK_PIN + #define SD_SCK_PIN AVR_SCK_PIN #endif -#ifndef MISO_PIN - #define MISO_PIN AVR_MISO_PIN +#ifndef SD_MISO_PIN + #define SD_MISO_PIN AVR_MISO_PIN #endif -#ifndef MOSI_PIN - #define MOSI_PIN AVR_MOSI_PIN +#ifndef SD_MOSI_PIN + #define SD_MOSI_PIN AVR_MOSI_PIN #endif -#ifndef SS_PIN - #define SS_PIN AVR_SS_PIN +#ifndef SD_SS_PIN + #define SD_SS_PIN AVR_SS_PIN #endif diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 0451d8bcc4..342c373735 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -69,10 +69,10 @@ // run at ~8 .. ~10Mhz - Tx version (Rx data discarded) static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0 - uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ - uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); - uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ - uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */ + uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN); + uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */ + uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN); uint32_t idx = 0; /* Negate bout, as the assembler requires a negated value */ @@ -154,9 +154,9 @@ static uint8_t spiTransferRx0(uint8_t) { // using Mode 0 uint32_t bin = 0; uint32_t work = 0; - uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ - uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ - uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */ + uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */ + uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN); /* The software SPI routine */ __asm__ __volatile__( @@ -225,15 +225,15 @@ static uint8_t spiTransfer1(uint8_t b) { // using Mode 0 int bits = 8; do { - WRITE(MOSI_PIN, b & 0x80); + WRITE(SD_MOSI_PIN, b & 0x80); b <<= 1; // little setup time - WRITE(SCK_PIN, HIGH); + WRITE(SD_SCK_PIN, HIGH); DELAY_NS(125); // 10 cycles @ 84mhz - b |= (READ(MISO_PIN) != 0); + b |= (READ(SD_MISO_PIN) != 0); - WRITE(SCK_PIN, LOW); + WRITE(SD_SCK_PIN, LOW); DELAY_NS(125); // 10 cycles @ 84mhz } while (--bits); return b; @@ -245,15 +245,15 @@ static uint8_t spiTransferX(uint8_t b) { // using Mode 0 int bits = 8; do { - WRITE(MOSI_PIN, b & 0x80); + WRITE(SD_MOSI_PIN, b & 0x80); b <<= 1; // little setup time - WRITE(SCK_PIN, HIGH); + WRITE(SD_SCK_PIN, HIGH); __delay_4cycles(spiDelayCyclesX4); - b |= (READ(MISO_PIN) != 0); + b |= (READ(SD_MISO_PIN) != 0); - WRITE(SCK_PIN, LOW); + WRITE(SD_SCK_PIN, LOW); __delay_4cycles(spiDelayCyclesX4); } while (--bits); return b; @@ -271,10 +271,10 @@ // Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded) static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) { - uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ - uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); - uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ - uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */ + uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN); + uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */ + uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN); uint32_t work = 0; uint32_t txval = 0; @@ -352,9 +352,9 @@ static void spiRxBlock0(uint8_t* ptr, uint32_t todo) { uint32_t bin = 0; uint32_t work = 0; - uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ - uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ - uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */ + uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */ + uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN); /* The software SPI routine */ __asm__ __volatile__( @@ -442,22 +442,22 @@ static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; #if MB(ALLIGATOR) - #define _SS_WRITE(S) WRITE(SS_PIN, S) + #define _SS_WRITE(S) WRITE(SD_SS_PIN, S) #else #define _SS_WRITE(S) NOOP #endif void spiBegin() { - SET_OUTPUT(SS_PIN); + SET_OUTPUT(SD_SS_PIN); _SS_WRITE(HIGH); - SET_OUTPUT(SCK_PIN); - SET_INPUT(MISO_PIN); - SET_OUTPUT(MOSI_PIN); + SET_OUTPUT(SD_SCK_PIN); + SET_INPUT(SD_MISO_PIN); + SET_OUTPUT(SD_MOSI_PIN); } uint8_t spiRec() { _SS_WRITE(LOW); - WRITE(MOSI_PIN, HIGH); // Output 1s 1 + WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1 uint8_t b = spiTransferRx(0xFF); _SS_WRITE(HIGH); return b; @@ -466,7 +466,7 @@ void spiRead(uint8_t* buf, uint16_t nbyte) { if (nbyte) { _SS_WRITE(LOW); - WRITE(MOSI_PIN, HIGH); // Output 1s 1 + WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1 spiRxBlock(buf, nbyte); _SS_WRITE(HIGH); } @@ -519,8 +519,8 @@ } _SS_WRITE(HIGH); - WRITE(MOSI_PIN, HIGH); - WRITE(SCK_PIN, LOW); + WRITE(SD_MOSI_PIN, HIGH); + WRITE(SD_SCK_PIN, LOW); } /** Begin SPI transaction, set clock, bit order, data mode */ @@ -575,20 +575,20 @@ // Configure SPI pins PIO_Configure( - g_APinDescription[SCK_PIN].pPort, - g_APinDescription[SCK_PIN].ulPinType, - g_APinDescription[SCK_PIN].ulPin, - g_APinDescription[SCK_PIN].ulPinConfiguration); + g_APinDescription[SD_SCK_PIN].pPort, + g_APinDescription[SD_SCK_PIN].ulPinType, + g_APinDescription[SD_SCK_PIN].ulPin, + g_APinDescription[SD_SCK_PIN].ulPinConfiguration); PIO_Configure( - g_APinDescription[MOSI_PIN].pPort, - g_APinDescription[MOSI_PIN].ulPinType, - g_APinDescription[MOSI_PIN].ulPin, - g_APinDescription[MOSI_PIN].ulPinConfiguration); + g_APinDescription[SD_MOSI_PIN].pPort, + g_APinDescription[SD_MOSI_PIN].ulPinType, + g_APinDescription[SD_MOSI_PIN].ulPin, + g_APinDescription[SD_MOSI_PIN].ulPinConfiguration); PIO_Configure( - g_APinDescription[MISO_PIN].pPort, - g_APinDescription[MISO_PIN].ulPinType, - g_APinDescription[MISO_PIN].ulPin, - g_APinDescription[MISO_PIN].ulPinConfiguration); + g_APinDescription[SD_MISO_PIN].pPort, + g_APinDescription[SD_MISO_PIN].ulPinType, + g_APinDescription[SD_MISO_PIN].ulPin, + g_APinDescription[SD_MISO_PIN].ulPinConfiguration); // set master mode, peripheral select, fault detection SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS); @@ -606,7 +606,7 @@ WRITE(SPI_EEPROM1_CS, HIGH); WRITE(SPI_EEPROM2_CS, HIGH); WRITE(SPI_FLASH_CS, HIGH); - WRITE(SS_PIN, HIGH); + WRITE(SD_SS_PIN, HIGH); OUT_WRITE(SDSS, LOW); diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h index 6880696506..26fb44f398 100644 --- a/Marlin/src/HAL/DUE/inc/SanityCheck.h +++ b/Marlin/src/HAL/DUE/inc/SanityCheck.h @@ -40,7 +40,7 @@ * Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time * as the TMC2130 soft SPI the most common setup. */ -#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN)) +#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == SD_MOSI_PIN || TMC_SW_##P == SD_MISO_PIN || TMC_SW_##P == SD_SCK_PIN)) #if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130) #if ENABLED(TMC_USE_SW_SPI) diff --git a/Marlin/src/HAL/DUE/spi_pins.h b/Marlin/src/HAL/DUE/spi_pins.h index e28eaf8270..cec22c2c37 100644 --- a/Marlin/src/HAL/DUE/spi_pins.h +++ b/Marlin/src/HAL/DUE/spi_pins.h @@ -43,22 +43,22 @@ #define SPI_PIN 87 #define SPI_CHAN 1 #endif - #define SCK_PIN 76 - #define MISO_PIN 74 - #define MOSI_PIN 75 + #define SD_SCK_PIN 76 + #define SD_MISO_PIN 74 + #define SD_MOSI_PIN 75 #else // defaults #define DUE_SOFTWARE_SPI - #ifndef SCK_PIN - #define SCK_PIN 52 + #ifndef SD_SCK_PIN + #define SD_SCK_PIN 52 #endif - #ifndef MISO_PIN - #define MISO_PIN 50 + #ifndef SD_MISO_PIN + #define SD_MISO_PIN 50 #endif - #ifndef MOSI_PIN - #define MOSI_PIN 51 + #ifndef SD_MOSI_PIN + #define SD_MOSI_PIN 51 #endif #endif /* A.28, A.29, B.21, C.26, C.29 */ -#define SS_PIN SDSS +#define SD_SS_PIN SDSS diff --git a/Marlin/src/HAL/ESP32/HAL_SPI.cpp b/Marlin/src/HAL/ESP32/HAL_SPI.cpp index 8e5875fc38..8ee837ba15 100644 --- a/Marlin/src/HAL/ESP32/HAL_SPI.cpp +++ b/Marlin/src/HAL/ESP32/HAL_SPI.cpp @@ -53,11 +53,11 @@ static SPISettings spiConfig; // ------------------------ void spiBegin() { - #if !PIN_EXISTS(SS) - #error "SS_PIN not defined!" + #if !PIN_EXISTS(SD_SS) + #error "SD_SS_PIN not defined!" #endif - OUT_WRITE(SS_PIN, HIGH); + OUT_WRITE(SD_SS_PIN, HIGH); } void spiInit(uint8_t spiRate) { diff --git a/Marlin/src/HAL/ESP32/spi_pins.h b/Marlin/src/HAL/ESP32/spi_pins.h index 15f8f2ab6b..cfe71eee4a 100644 --- a/Marlin/src/HAL/ESP32/spi_pins.h +++ b/Marlin/src/HAL/ESP32/spi_pins.h @@ -18,7 +18,7 @@ */ #pragma once -#define SS_PIN SDSS -#define SCK_PIN 18 -#define MISO_PIN 19 -#define MOSI_PIN 23 +#define SD_SS_PIN SDSS +#define SD_SCK_PIN 18 +#define SD_MISO_PIN 19 +#define SD_MOSI_PIN 23 diff --git a/Marlin/src/HAL/LINUX/spi_pins.h b/Marlin/src/HAL/LINUX/spi_pins.h index 01ba28e5b6..33136ac9dd 100644 --- a/Marlin/src/HAL/LINUX/spi_pins.h +++ b/Marlin/src/HAL/LINUX/spi_pins.h @@ -24,31 +24,32 @@ #include "../../core/macros.h" #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) +#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently // needed due to the speed and mode required for communicating with each device being different. // This requirement can be removed if the SPI access to these devices is updated to use // spiBeginTransaction. #endif -/** onboard SD card */ -//#define SCK_PIN P0_07 -//#define MISO_PIN P0_08 -//#define MOSI_PIN P0_09 -//#define SS_PIN P0_06 -/** external */ -#ifndef SCK_PIN - #define SCK_PIN 50 +// Onboard SD +//#define SD_SCK_PIN P0_07 +//#define SD_MISO_PIN P0_08 +//#define SD_MOSI_PIN P0_09 +//#define SD_SS_PIN P0_06 + +// External SD +#ifndef SD_SCK_PIN + #define SD_SCK_PIN 50 #endif -#ifndef MISO_PIN - #define MISO_PIN 51 +#ifndef SD_MISO_PIN + #define SD_MISO_PIN 51 #endif -#ifndef MOSI_PIN - #define MOSI_PIN 52 +#ifndef SD_MOSI_PIN + #define SD_MOSI_PIN 52 #endif -#ifndef SS_PIN - #define SS_PIN 53 +#ifndef SD_SS_PIN + #define SD_SS_PIN 53 #endif #ifndef SDSS - #define SDSS SS_PIN + #define SDSS SD_SS_PIN #endif diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index 16ac789fc0..dbc89a33f5 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -55,27 +55,33 @@ #include #include +#include "../shared/HAL_SPI.h" + // ------------------------ // Public functions // ------------------------ #if ENABLED(LPC_SOFTWARE_SPI) - #include - // Software SPI - static uint8_t SPI_speed = 0; + #include + + #ifndef HAL_SPI_SPEED + #define HAL_SPI_SPEED SPI_FULL_SPEED + #endif + + static uint8_t SPI_speed = HAL_SPI_SPEED; static uint8_t spiTransfer(uint8_t b) { - return swSpiTransfer(b, SPI_speed, SCK_PIN, MISO_PIN, MOSI_PIN); + return swSpiTransfer(b, SPI_speed, SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN); } void spiBegin() { - swSpiBegin(SCK_PIN, MISO_PIN, MOSI_PIN); + swSpiBegin(SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN); } void spiInit(uint8_t spiRate) { - SPI_speed = swSpiInit(spiRate, SCK_PIN, MOSI_PIN); + SPI_speed = swSpiInit(spiRate, SD_SCK_PIN, SD_MOSI_PIN); } uint8_t spiRec() { return spiTransfer(0xFF); } @@ -100,14 +106,20 @@ #else - void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0 - spiInit(SPI_SPEED); - } + #ifndef HAL_SPI_SPEED + #ifdef SD_SPI_SPEED + #define HAL_SPI_SPEED SD_SPI_SPEED + #else + #define HAL_SPI_SPEED SPI_FULL_SPEED + #endif + #endif + + void spiBegin() { spiInit(HAL_SPI_SPEED); } // Set up SCK, MOSI & MISO pins for SSP0 void spiInit(uint8_t spiRate) { - #if MISO_PIN == BOARD_SPI1_MISO_PIN + #if SD_MISO_PIN == BOARD_SPI1_MISO_PIN SPI.setModule(1); - #elif MISO_PIN == BOARD_SPI2_MISO_PIN + #elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN SPI.setModule(2); #endif SPI.setDataSize(DATA_SIZE_8BIT); @@ -150,10 +162,9 @@ (void)spiTransfer(buf[i]); } - /** Begin SPI transaction, set clock, bit order, data mode */ + // Begin SPI transaction, set clock, bit order, data mode void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - // TODO: to be implemented - + // TODO: Implement this method } #endif // LPC_SOFTWARE_SPI @@ -392,9 +403,9 @@ void SPIClass::updateSettings() { SSP_Init(_currentSetting->spi_d, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers } -#if MISO_PIN == BOARD_SPI1_MISO_PIN +#if SD_MISO_PIN == BOARD_SPI1_MISO_PIN SPIClass SPI(1); -#elif MISO_PIN == BOARD_SPI2_MISO_PIN +#elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN SPIClass SPI(2); #endif diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 06e060d93a..11b8761550 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -116,8 +116,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #elif HAS_WIRED_LCD #if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1) #error "Serial port pins (1) conflict with Encoder Buttons!" - #elif ANY_TX(1, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \ - || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, MISO_PIN, DOGLCD_A0, SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN) + #elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \ + || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, SD_MISO_PIN, DOGLCD_A0, SD_SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN) #error "Serial port pins (1) conflict with LCD pins!" #endif #endif @@ -205,8 +205,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #error "SDA0 overlaps with BEEPER_PIN!" #elif IS_SCL0(BTN_ENC) #error "SCL0 overlaps with Encoder Button!" - #elif IS_SCL0(SS_PIN) - #error "SCL0 overlaps with SS_PIN!" + #elif IS_SCL0(SD_SS_PIN) + #error "SCL0 overlaps with SD_SS_PIN!" #elif IS_SCL0(LCD_SDSS) #error "SCL0 overlaps with LCD_SDSS!" #endif diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index 96faf54d7f..f41a576376 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -90,11 +90,11 @@ void HAL_init() { //debug_frmwrk_init(); //_DBG("\n\nDebug running\n"); // Initialize the SD card chip select pins as soon as possible - #if PIN_EXISTS(SS) - OUT_WRITE(SS_PIN, HIGH); + #if PIN_EXISTS(SD_SS) + OUT_WRITE(SD_SS_PIN, HIGH); #endif - #if PIN_EXISTS(ONBOARD_SD_CS) && ONBOARD_SD_CS_PIN != SS_PIN + #if PIN_EXISTS(ONBOARD_SD_CS) && ONBOARD_SD_CS_PIN != SD_SS_PIN OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH); #endif diff --git a/Marlin/src/HAL/LPC1768/spi_pins.h b/Marlin/src/HAL/LPC1768/spi_pins.h index b4da5d4df2..e7d774742f 100644 --- a/Marlin/src/HAL/LPC1768/spi_pins.h +++ b/Marlin/src/HAL/LPC1768/spi_pins.h @@ -23,7 +23,7 @@ #include "../../core/macros.h" -#if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) +#if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently // needed due to the speed and mode required for communicating with each device being different. // This requirement can be removed if the SPI access to these devices is updated to use @@ -31,24 +31,24 @@ #endif /** onboard SD card */ -//#define SCK_PIN P0_07 -//#define MISO_PIN P0_08 -//#define MOSI_PIN P0_09 -//#define SS_PIN P0_06 +//#define SD_SCK_PIN P0_07 +//#define SD_MISO_PIN P0_08 +//#define SD_MOSI_PIN P0_09 +//#define SD_SS_PIN P0_06 /** external */ -#ifndef SCK_PIN - #define SCK_PIN P0_15 +#ifndef SD_SCK_PIN + #define SD_SCK_PIN P0_15 #endif -#ifndef MISO_PIN - #define MISO_PIN P0_17 +#ifndef SD_MISO_PIN + #define SD_MISO_PIN P0_17 #endif -#ifndef MOSI_PIN - #define MOSI_PIN P0_18 +#ifndef SD_MOSI_PIN + #define SD_MOSI_PIN P0_18 #endif -#ifndef SS_PIN - #define SS_PIN P1_23 +#ifndef SD_SS_PIN + #define SD_SS_PIN P1_23 #endif #if !defined(SDSS) || SDSS == P_NC // gets defaulted in pins.h #undef SDSS - #define SDSS SS_PIN + #define SDSS SD_SS_PIN #endif diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.h b/Marlin/src/HAL/LPC1768/tft/xpt2046.h index 223985f3d2..65602bda0f 100644 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.h +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.h @@ -28,16 +28,16 @@ #endif #ifndef TOUCH_MISO_PIN - #define TOUCH_MISO_PIN MISO_PIN + #define TOUCH_MISO_PIN SD_MISO_PIN #endif #ifndef TOUCH_MOSI_PIN - #define TOUCH_MOSI_PIN MOSI_PIN + #define TOUCH_MOSI_PIN SD_MOSI_PIN #endif #ifndef TOUCH_SCK_PIN - #define TOUCH_SCK_PIN SCK_PIN + #define TOUCH_SCK_PIN SD_SCK_PIN #endif #ifndef TOUCH_CS_PIN - #define TOUCH_CS_PIN SS_PIN + #define TOUCH_CS_PIN SD_SS_PIN #endif #ifndef TOUCH_INT_PIN #define TOUCH_INT_PIN -1 diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp index 057e10e0f5..b1eea13d57 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp @@ -62,10 +62,13 @@ #include #include "../../shared/HAL_SPI.h" -void spiBegin(); -void spiInit(uint8_t spiRate); -void spiSend(uint8_t b); -void spiSend(const uint8_t* buf, size_t n); +#ifndef LCD_SPI_SPEED + #ifdef SD_SPI_SPEED + #define LCD_SPI_SPEED SD_SPI_SPEED // Assume SPI speed shared with SD + #else + #define LCD_SPI_SPEED SPI_FULL_SPEED // Use full speed if SD speed is not supplied + #endif +#endif uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch (msg) { @@ -81,10 +84,7 @@ uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, u8g_SetPIOutput(u8g, U8G_PI_RESET); u8g_Delay(5); spiBegin(); - #ifndef SPI_SPEED - #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card - #endif - spiInit(SPI_SPEED); + spiInit(LCD_SPI_SPEED); break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ diff --git a/Marlin/src/HAL/SAMD51/spi_pins.h b/Marlin/src/HAL/SAMD51/spi_pins.h index 5a9b1275ef..2a667bcaa1 100644 --- a/Marlin/src/HAL/SAMD51/spi_pins.h +++ b/Marlin/src/HAL/SAMD51/spi_pins.h @@ -30,16 +30,16 @@ * SPI | 53 52 50 51 | * SPI1 | 83 81 80 82 | * +-------------------------+ - * Any pin can be used for Chip Select (SS_PIN) + * Any pin can be used for Chip Select (SD_SS_PIN) */ - #ifndef SCK_PIN - #define SCK_PIN 52 + #ifndef SD_SCK_PIN + #define SD_SCK_PIN 52 #endif - #ifndef MISO_PIN - #define MISO_PIN 50 + #ifndef SD_MISO_PIN + #define SD_MISO_PIN 50 #endif - #ifndef MOSI_PIN - #define MOSI_PIN 51 + #ifndef SD_MOSI_PIN + #define SD_MOSI_PIN 51 #endif #ifndef SDSS #define SDSS 53 @@ -51,4 +51,4 @@ #endif -#define SS_PIN SDSS +#define SD_SS_PIN SDSS diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp index d79f72cad2..eef480777b 100644 --- a/Marlin/src/HAL/STM32/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp @@ -45,10 +45,10 @@ static SPISettings spiConfig; #include "../shared/Delay.h" void spiBegin(void) { - OUT_WRITE(SS_PIN, HIGH); - OUT_WRITE(SCK_PIN, HIGH); - SET_INPUT(MISO_PIN); - OUT_WRITE(MOSI_PIN, HIGH); + OUT_WRITE(SD_SS_PIN, HIGH); + OUT_WRITE(SD_SCK_PIN, HIGH); + SET_INPUT(SD_MISO_PIN); + OUT_WRITE(SD_MOSI_PIN, HIGH); } static uint16_t delay_STM32_soft_spi; @@ -72,15 +72,15 @@ static SPISettings spiConfig; uint8_t HAL_SPI_STM32_SpiTransfer_Mode_3(uint8_t b) { // using Mode 3 for (uint8_t bits = 8; bits--;) { - WRITE(SCK_PIN, LOW); - WRITE(MOSI_PIN, b & 0x80); + WRITE(SD_SCK_PIN, LOW); + WRITE(SD_MOSI_PIN, b & 0x80); DELAY_NS(delay_STM32_soft_spi); - WRITE(SCK_PIN, HIGH); + WRITE(SD_SCK_PIN, HIGH); DELAY_NS(delay_STM32_soft_spi); b <<= 1; // little setup time - b |= (READ(MISO_PIN) != 0); + b |= (READ(SD_MISO_PIN) != 0); } DELAY_NS(125); return b; @@ -132,8 +132,8 @@ static SPISettings spiConfig; * @details Only configures SS pin since stm32duino creates and initialize the SPI object */ void spiBegin() { - #if PIN_EXISTS(SS) - OUT_WRITE(SS_PIN, HIGH); + #if PIN_EXISTS(SD_SS) + OUT_WRITE(SD_SS_PIN, HIGH); #endif } @@ -154,9 +154,9 @@ static SPISettings spiConfig; spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); #if ENABLED(CUSTOM_SPI_PINS) - SPI.setMISO(MISO_PIN); - SPI.setMOSI(MOSI_PIN); - SPI.setSCLK(SCK_PIN); + SPI.setMISO(SD_MISO_PIN); + SPI.setMOSI(SD_MOSI_PIN); + SPI.setSCLK(SD_SCK_PIN); #endif SPI.begin(); diff --git a/Marlin/src/HAL/STM32/spi_pins.h b/Marlin/src/HAL/STM32/spi_pins.h index 176e2a7b20..e2052c5c77 100644 --- a/Marlin/src/HAL/STM32/spi_pins.h +++ b/Marlin/src/HAL/STM32/spi_pins.h @@ -21,15 +21,15 @@ /** * Define SPI Pins: SCK, MISO, MOSI, SS */ -#ifndef SCK_PIN - #define SCK_PIN PIN_SPI_SCK +#ifndef SD_SCK_PIN + #define SD_SCK_PIN PIN_SPI_SCK #endif -#ifndef MISO_PIN - #define MISO_PIN PIN_SPI_MISO +#ifndef SD_MISO_PIN + #define SD_MISO_PIN PIN_SPI_MISO #endif -#ifndef MOSI_PIN - #define MOSI_PIN PIN_SPI_MOSI +#ifndef SD_MOSI_PIN + #define SD_MOSI_PIN PIN_SPI_MOSI #endif -#ifndef SS_PIN - #define SS_PIN PIN_SPI_SS +#ifndef SD_SS_PIN + #define SD_SS_PIN PIN_SPI_SS #endif diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp index 76b1c3e246..7e876f765f 100644 --- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp @@ -61,8 +61,8 @@ * @details Only configures SS pin since libmaple creates and initialize the SPI object */ void spiBegin() { - #if PIN_EXISTS(SS) - OUT_WRITE(SS_PIN, HIGH); + #if PIN_EXISTS(SD_SS) + OUT_WRITE(SD_SS_PIN, HIGH); #endif } diff --git a/Marlin/src/HAL/STM32F1/spi_pins.h b/Marlin/src/HAL/STM32F1/spi_pins.h index 59ac446410..7d650ffe37 100644 --- a/Marlin/src/HAL/STM32F1/spi_pins.h +++ b/Marlin/src/HAL/STM32F1/spi_pins.h @@ -31,23 +31,23 @@ * SPI2 | PB12 PB13 PB14 PB15 | * SPI3 | PA15 PB3 PB4 PB5 | * +-----------------------------+ - * Any pin can be used for Chip Select (SS_PIN) + * Any pin can be used for Chip Select (SD_SS_PIN) * SPI1 is enabled by default */ -#ifndef SCK_PIN - #define SCK_PIN PA5 +#ifndef SD_SCK_PIN + #define SD_SCK_PIN PA5 #endif -#ifndef MISO_PIN - #define MISO_PIN PA6 +#ifndef SD_MISO_PIN + #define SD_MISO_PIN PA6 #endif -#ifndef MOSI_PIN - #define MOSI_PIN PA7 +#ifndef SD_MOSI_PIN + #define SD_MOSI_PIN PA7 #endif -#ifndef SS_PIN - #define SS_PIN PA4 +#ifndef SD_SS_PIN + #define SD_SS_PIN PA4 #endif #undef SDSS -#define SDSS SS_PIN +#define SDSS SD_SS_PIN #ifndef SPI_DEVICE #define SPI_DEVICE 1 diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h index 223985f3d2..65602bda0f 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h @@ -28,16 +28,16 @@ #endif #ifndef TOUCH_MISO_PIN - #define TOUCH_MISO_PIN MISO_PIN + #define TOUCH_MISO_PIN SD_MISO_PIN #endif #ifndef TOUCH_MOSI_PIN - #define TOUCH_MOSI_PIN MOSI_PIN + #define TOUCH_MOSI_PIN SD_MOSI_PIN #endif #ifndef TOUCH_SCK_PIN - #define TOUCH_SCK_PIN SCK_PIN + #define TOUCH_SCK_PIN SD_SCK_PIN #endif #ifndef TOUCH_CS_PIN - #define TOUCH_CS_PIN SS_PIN + #define TOUCH_CS_PIN SD_SS_PIN #endif #ifndef TOUCH_INT_PIN #define TOUCH_INT_PIN -1 diff --git a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp index cdb3f4701c..dce236ef6b 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp @@ -35,18 +35,18 @@ static SPISettings spiConfig; // Initialize SPI bus void spiBegin() { - #if !PIN_EXISTS(SS) - #error "SS_PIN not defined!" + #if !PIN_EXISTS(SD_SS) + #error "SD_SS_PIN not defined!" #endif - OUT_WRITE(SS_PIN, HIGH); - SET_OUTPUT(SCK_PIN); - SET_INPUT(MISO_PIN); - SET_OUTPUT(MOSI_PIN); + OUT_WRITE(SD_SS_PIN, HIGH); + SET_OUTPUT(SD_SCK_PIN); + SET_INPUT(SD_MISO_PIN); + SET_OUTPUT(SD_MOSI_PIN); #if 0 && DISABLED(SOFTWARE_SPI) // set SS high - may be chip select for another SPI device #if SET_SPI_SS_HIGH - WRITE(SS_PIN, HIGH); + WRITE(SD_SS_PIN, HIGH); #endif // set a default rate spiInit(SPI_HALF_SPEED); // 1 diff --git a/Marlin/src/HAL/TEENSY31_32/spi_pins.h b/Marlin/src/HAL/TEENSY31_32/spi_pins.h index 5754fbfeed..6d0d05f85a 100644 --- a/Marlin/src/HAL/TEENSY31_32/spi_pins.h +++ b/Marlin/src/HAL/TEENSY31_32/spi_pins.h @@ -21,7 +21,7 @@ */ #pragma once -#define SCK_PIN 13 -#define MISO_PIN 12 -#define MOSI_PIN 11 -#define SS_PIN 20 //SDSS // A.28, A.29, B.21, C.26, C.29 +#define SD_SCK_PIN 13 +#define SD_MISO_PIN 12 +#define SD_MOSI_PIN 11 +#define SD_SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp index b36900a321..84852cd358 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp @@ -35,18 +35,18 @@ static SPISettings spiConfig; void spiBegin() { - #if !PIN_EXISTS(SS) - #error "SS_PIN not defined!" + #if !PIN_EXISTS(SD_SS) + #error "SD_SS_PIN not defined!" #endif - OUT_WRITE(SS_PIN, HIGH); - SET_OUTPUT(SCK_PIN); - SET_INPUT(MISO_PIN); - SET_OUTPUT(MOSI_PIN); + OUT_WRITE(SD_SS_PIN, HIGH); + SET_OUTPUT(SD_SCK_PIN); + SET_INPUT(SD_MISO_PIN); + SET_OUTPUT(SD_MOSI_PIN); #if 0 && DISABLED(SOFTWARE_SPI) // set SS high - may be chip select for another SPI device #if SET_SPI_SS_HIGH - WRITE(SS_PIN, HIGH); + WRITE(SD_SS_PIN, HIGH); #endif // set a default rate spiInit(SPI_HALF_SPEED); // 1 diff --git a/Marlin/src/HAL/TEENSY35_36/spi_pins.h b/Marlin/src/HAL/TEENSY35_36/spi_pins.h index c76344d075..cfffdc9325 100644 --- a/Marlin/src/HAL/TEENSY35_36/spi_pins.h +++ b/Marlin/src/HAL/TEENSY35_36/spi_pins.h @@ -25,7 +25,7 @@ * HAL SPI Pins for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) */ -#define SCK_PIN 13 -#define MISO_PIN 12 -#define MOSI_PIN 11 -#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 +#define SD_SCK_PIN 13 +#define SD_MISO_PIN 12 +#define SD_MOSI_PIN 11 +#define SD_SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp index 20b472aa35..8c93049027 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp @@ -50,20 +50,20 @@ static SPISettings spiConfig; // ------------------------ void spiBegin() { - #ifndef SS_PIN - #error "SS_PIN is not defined!" + #ifndef SD_SS_PIN + #error "SD_SS_PIN is not defined!" #endif - OUT_WRITE(SS_PIN, HIGH); + OUT_WRITE(SD_SS_PIN, HIGH); - //SET_OUTPUT(SCK_PIN); - //SET_INPUT(MISO_PIN); - //SET_OUTPUT(MOSI_PIN); + //SET_OUTPUT(SD_SCK_PIN); + //SET_INPUT(SD_MISO_PIN); + //SET_OUTPUT(SD_MOSI_PIN); #if 0 && DISABLED(SOFTWARE_SPI) // set SS high - may be chip select for another SPI device #if SET_SPI_SS_HIGH - WRITE(SS_PIN, HIGH); + WRITE(SD_SS_PIN, HIGH); #endif // set a default rate spiInit(SPI_HALF_SPEED); // 1 diff --git a/Marlin/src/HAL/TEENSY40_41/spi_pins.h b/Marlin/src/HAL/TEENSY40_41/spi_pins.h index d6f8d41bf6..ba4a2c700a 100644 --- a/Marlin/src/HAL/TEENSY40_41/spi_pins.h +++ b/Marlin/src/HAL/TEENSY40_41/spi_pins.h @@ -25,7 +25,7 @@ * HAL SPI Pins for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ -#define SCK_PIN 13 -#define MISO_PIN 12 -#define MOSI_PIN 11 -#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 +#define SD_SCK_PIN 13 +#define SD_MISO_PIN 12 +#define SD_MOSI_PIN 11 +#define SD_SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/feature/dac/dac_dac084s085.cpp b/Marlin/src/feature/dac/dac_dac084s085.cpp index 82d17fa28f..649aa5561b 100644 --- a/Marlin/src/feature/dac/dac_dac084s085.cpp +++ b/Marlin/src/feature/dac/dac_dac084s085.cpp @@ -92,7 +92,7 @@ void dac084s085::cshigh() { WRITE(SPI_EEPROM1_CS, HIGH); WRITE(SPI_EEPROM2_CS, HIGH); WRITE(SPI_FLASH_CS, HIGH); - WRITE(SS_PIN, HIGH); + WRITE(SD_SS_PIN, HIGH); } #endif // MB(ALLIGATOR) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index c94fcd0cfe..388adb1809 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1045,9 +1045,9 @@ #define INVERT_E_DIR false #endif -// Fallback SPI Speed -#ifndef SPI_SPEED - #define SPI_SPEED SPI_FULL_SPEED +// Fallback SPI Speed for SD +#if ENABLED(SDSUPPORT) && !defined(SD_SPI_SPEED) + #define SD_SPI_SPEED SPI_FULL_SPEED #endif /** diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index e9ea26aa7a..388caa9eb1 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2590,10 +2590,10 @@ */ #if HAS_MARLINUI_U8GLIB #ifndef DOGLCD_SCK - #define DOGLCD_SCK SCK_PIN + #define DOGLCD_SCK SD_SCK_PIN #endif #ifndef DOGLCD_MOSI - #define DOGLCD_MOSI MOSI_PIN + #define DOGLCD_MOSI SD_MOSI_PIN #endif #endif @@ -2683,7 +2683,7 @@ // Force SDCARD_SORT_ALPHA to be enabled for Graphical LCD on LPC1768 // on boards where SD card and LCD display share the same SPI bus // because of a bug in the shared SPI implementation. (See #8122) -#if defined(TARGET_LPC1768) && IS_RRD_FG_SC && (SCK_PIN == LCD_PINS_D4) +#if defined(TARGET_LPC1768) && IS_RRD_FG_SC && (SD_SCK_PIN == LCD_PINS_D4) #define SDCARD_SORT_ALPHA // Keep one directory level in RAM. Changing directory levels // may still glitch the screen, but LCD updates clean it up. #undef SDSORT_LIMIT diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 62c954c899..de5960df4c 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -105,9 +105,9 @@ #elif defined(USE_AUTOMATIC_VERSIONING) #error "USE_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE." #elif defined(SDSLOW) - #error "SDSLOW deprecated. Set SPI_SPEED to SPI_HALF_SPEED instead." + #error "SDSLOW deprecated. Set SD_SPI_SPEED to SPI_HALF_SPEED instead." #elif defined(SDEXTRASLOW) - #error "SDEXTRASLOW deprecated. Set SPI_SPEED to SPI_QUARTER_SPEED instead." + #error "SDEXTRASLOW deprecated. Set SD_SPI_SPEED to SPI_QUARTER_SPEED instead." #elif defined(FILAMENT_SENSOR) #error "FILAMENT_SENSOR is now FILAMENT_WIDTH_SENSOR." #elif defined(ENDSTOPPULLUP_FIL_RUNOUT) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index 29a1b7d3cf..16cb70dbd8 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -37,7 +37,7 @@ // RepRapWorld Graphical LCD #define U8G_CLASS U8GLIB_ST7920_128X64_4X - #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) + #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN) && (LCD_PINS_ENABLE == SD_MOSI_PIN) #define U8G_PARAM LCD_PINS_RS #else #define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS @@ -48,7 +48,7 @@ // RepRap Discount Full Graphics Smart Controller // and other variant LCDs using ST7920 - #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) + #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN) && (LCD_PINS_ENABLE == SD_MOSI_PIN) #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) #define U8G_PARAM LCD_PINS_RS #else @@ -88,7 +88,7 @@ #define SMART_RAMPS MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF) #define U8G_CLASS U8GLIB_64128N_2X_HAL // 4 stripes (HW-SPI) - #if SMART_RAMPS || DOGLCD_SCK != SCK_PIN || DOGLCD_MOSI != MOSI_PIN + #if SMART_RAMPS || DOGLCD_SCK != SD_SCK_PIN || DOGLCD_MOSI != SD_MOSI_PIN #define FORCE_SOFT_SPI // SW-SPI #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp index 8d2d74ea26..9868492d81 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp @@ -27,7 +27,7 @@ #if ENABLED(SDSUPPORT) bool MediaFileReader::open(const char* filename) { - card.init(SPI_SPEED, SDSS); + card.init(SD_SPI_SPEED, SDSS); volume.init(&card); root.openRoot(&volume); return file.open(&root, filename, O_READ); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp index a9b46e013b..006cbe872c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp @@ -33,7 +33,7 @@ namespace FTDI { SPIClass EVE_SPI(CLCD_SPI_BUS); #endif #ifndef CLCD_HW_SPI_SPEED - #define CLCD_HW_SPI_SPEED 8000000 >> SPI_SPEED + #define CLCD_HW_SPI_SPEED 8000000 >> SD_SPI_SPEED #endif SPISettings SPI::spi_settings(CLCD_HW_SPI_SPEED, MSBFIRST, SPI_MODE0); #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp index 8912663f27..eb0b78a325 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp @@ -151,7 +151,7 @@ void MediaPlayerScreen::playStream(void *obj, media_streamer_func_t *data_stream SERIAL_ECHO_MSG("Done playing video"); exit: - spiInit(SPI_SPEED); // Restore default speed + spiInit(SD_SPI_SPEED); // Restore default speed // Since playing media overwrites RAMG, we need to reinitialize // everything that is stored in RAMG. diff --git a/Marlin/src/libs/private_spi.h b/Marlin/src/libs/private_spi.h index 9c0ffe7486..1d8eacd22d 100644 --- a/Marlin/src/libs/private_spi.h +++ b/Marlin/src/libs/private_spi.h @@ -35,12 +35,12 @@ class SPIclass { // Hardware SPI template<> -class SPIclass { +class SPIclass { public: FORCE_INLINE static void init() { - OUT_WRITE(SCK_PIN, LOW); - OUT_WRITE(MOSI_PIN, HIGH); - SET_INPUT_PULLUP(MISO_PIN); + OUT_WRITE(SD_SCK_PIN, LOW); + OUT_WRITE(SD_MOSI_PIN, HIGH); + SET_INPUT_PULLUP(SD_MISO_PIN); } FORCE_INLINE static uint8_t receive() { #if defined(__AVR__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1062__) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index d704ebc85b..fea992f681 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -53,7 +53,7 @@ #define MAX31865_CS2_PIN MAX6675_SS2_PIN #endif #ifndef MAX31865_MOSI_PIN - #define MAX31865_MOSI_PIN MOSI_PIN + #define MAX31865_MOSI_PIN SD_MOSI_PIN #endif #ifndef MAX31865_MISO_PIN #define MAX31865_MISO_PIN MAX6675_DO_PIN @@ -1662,7 +1662,7 @@ void Temperature::updateTemperaturesFromRawValues() { #if MAX6675_SEPARATE_SPI template SoftSPI SPIclass::softSPI; - SPIclass max6675_spi; + SPIclass max6675_spi; #endif // Init fans according to whether they're native PWM or Software PWM diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index 6009ea6cdb..4a5a2bf9b0 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -100,8 +100,8 @@ // // MicroSD card on SPI // -#define MOSI_PIN 23 -#define MISO_PIN 19 -#define SCK_PIN 18 +#define SD_MOSI_PIN 23 +#define SD_MISO_PIN 19 +#define SD_SCK_PIN 18 #define SDSS 5 #define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers diff --git a/Marlin/src/pins/esp32/pins_FYSETC_E4.h b/Marlin/src/pins/esp32/pins_FYSETC_E4.h index 5b62518689..50a8587b1e 100644 --- a/Marlin/src/pins/esp32/pins_FYSETC_E4.h +++ b/Marlin/src/pins/esp32/pins_FYSETC_E4.h @@ -104,9 +104,9 @@ // // MicroSD card // -#define MOSI_PIN 23 -#define MISO_PIN 19 -#define SCK_PIN 18 +#define SD_MOSI_PIN 23 +#define SD_MISO_PIN 19 +#define SD_SCK_PIN 18 #define SDSS 5 #define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index 02cdd0a009..fe67f75372 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -93,9 +93,9 @@ // // MicroSD card // -#define MOSI_PIN 23 -#define MISO_PIN 19 -#define SCK_PIN 18 +#define SD_MOSI_PIN 23 +#define SD_MISO_PIN 19 +#define SD_SCK_PIN 18 #define SDSS 5 #define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index f95a53240b..3f9a6a0af3 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -112,9 +112,9 @@ // // MicroSD card // -#define MOSI_PIN 23 -#define MISO_PIN 19 -#define SCK_PIN 18 +#define SD_MOSI_PIN 23 +#define SD_MISO_PIN 19 +#define SD_SCK_PIN 18 #define SDSS 5 #define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers diff --git a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h index 78e7426674..70682ad151 100644 --- a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h +++ b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h @@ -102,16 +102,16 @@ #endif #if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - #define SS_PIN LCD_SDSS + #define SD_SCK_PIN P0_15 + #define SD_MISO_PIN P0_17 + #define SD_MOSI_PIN P0_18 + #define SD_SS_PIN LCD_SDSS #define SD_DETECT_PIN P3_25 #elif SD_CONNECTION_IS(ONBOARD) - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 + #define SD_SS_PIN ONBOARD_SD_CS_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." #endif diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h index 8c1c124d90..5ac119f398 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -155,11 +155,11 @@ * Hardware SPI can't be used because P0_17 (MISO) is not brought out on this board. */ #if ENABLED(SDSUPPORT) - #define SCK_PIN P0_15 // EXP1-5 - #define MISO_PIN P0_16 // EXP1-4 - #define MOSI_PIN P0_18 // EXP1-3 - #define SS_PIN P1_30 // EXP1-2 - #define SDSS SS_PIN + #define SD_SCK_PIN P0_15 // EXP1-5 + #define SD_MISO_PIN P0_16 // EXP1-4 + #define SD_MOSI_PIN P0_18 // EXP1-3 + #define SD_SS_PIN P1_30 // EXP1-2 + #define SDSS SD_SS_PIN #endif /** diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index d92d5e578f..3b2137b400 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -127,11 +127,11 @@ */ #if ENABLED(SDSUPPORT) - #define SCK_PIN P0_15 // EXP1-5 - #define MISO_PIN P0_16 // EXP1-4 - #define MOSI_PIN P0_18 // EXP1-3 - #define SS_PIN P1_30 // EXP1-2 - #define SDSS SS_PIN + #define SD_SCK_PIN P0_15 // EXP1-5 + #define SD_MISO_PIN P0_16 // EXP1-4 + #define SD_MOSI_PIN P0_18 // EXP1-3 + #define SD_SS_PIN P1_30 // EXP1-2 + #define SDSS SD_SS_PIN #endif // SDSUPPORT diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h index 0701e45992..8c1396d3fe 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h @@ -107,7 +107,7 @@ #endif #if SD_CONNECTION_IS(LCD) - #define SS_PIN P1_23 + #define SD_SS_PIN P1_23 #endif // Trinamic driver support diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index c621f93a2a..e5b78024cb 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -375,7 +375,7 @@ #endif #if SD_CONNECTION_IS(LCD) - #define SS_PIN EXPA2_07_PIN + #define SD_SS_PIN EXPA2_07_PIN #endif /** diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 829c38ec45..7500431d54 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -244,7 +244,7 @@ // SD Connection // #if SD_CONNECTION_IS(LCD) - #define SS_PIN EXPA2_07_PIN + #define SD_SS_PIN EXPA2_07_PIN #endif /** @@ -374,9 +374,9 @@ #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 // SPI 1 - #define SCK_PIN EXPA2_09_PIN - #define MISO_PIN EXPA2_10_PIN - #define MOSI_PIN EXPA2_05_PIN + #define SD_SCK_PIN EXPA2_09_PIN + #define SD_MISO_PIN EXPA2_10_PIN + #define SD_MOSI_PIN EXPA2_05_PIN // Disable any LCD related PINs config #define LCD_PINS_ENABLE -1 diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 533c92e067..a43940f8f0 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -114,16 +114,16 @@ #define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card #if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 + #define SD_SCK_PIN P0_15 + #define SD_MISO_PIN P0_17 + #define SD_MOSI_PIN P0_18 #elif SD_CONNECTION_IS(ONBOARD) #undef SD_DETECT_PIN #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 + #define SD_SS_PIN ONBOARD_SD_CS_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." #endif diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 9977230094..1970c0c479 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -154,15 +154,15 @@ #define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card #if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - #define SS_PIN P0_16 + #define SD_SCK_PIN P0_15 + #define SD_MISO_PIN P0_17 + #define SD_MOSI_PIN P0_18 + #define SD_SS_PIN P0_16 #elif SD_CONNECTION_IS(ONBOARD) #undef SD_DETECT_PIN #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 + #define SD_SS_PIN ONBOARD_SD_CS_PIN #endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index b993e38460..ea9748ca54 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -182,26 +182,25 @@ * SD_DETECT_PIN entirely and remove that wire from the the custom cable. */ #define SD_DETECT_PIN P2_11 // J8-5 (moved from EXP2 P0.27) - #define SCK_PIN P1_22 // J8-2 (moved from EXP2 P0.7) - #define MISO_PIN P1_23 // J8-3 (moved from EXP2 P0.8) - #define MOSI_PIN P2_12 // J8-4 (moved from EXP2 P0.9) - #define SS_PIN P0_28 + #define SD_SCK_PIN P1_22 // J8-2 (moved from EXP2 P0.7) + #define SD_MISO_PIN P1_23 // J8-3 (moved from EXP2 P0.8) + #define SD_MOSI_PIN P2_12 // J8-4 (moved from EXP2 P0.9) + #define SD_SS_PIN P0_28 #define LPC_SOFTWARE_SPI // With a custom cable we need software SPI because the // selected pins are not on a hardware SPI controller -#elif SD_CONNECTION_IS(LCD) - // use standard cable and header, SPI and SD detect sre shared with on-board SD card - // hardware SPI is used for both SD cards. The detect pin is shred between the - // LCD and onboard SD readers so we disable it. - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN P0_28 -#elif SD_CONNECTION_IS(ONBOARD) - #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN +#elif SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD) + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 + #if SD_CONNECTION_IS(LCD) + // Use standard cable and header, SPI and SD detect are shared with onboard SD card. + // Hardware SPI is used for both SD cards. The detect pin is shared between the + // LCD and onboard SD readers so we disable it. + #define SD_SS_PIN P0_28 + #else + #define SD_DETECT_PIN P0_27 + #define SD_SS_PIN ONBOARD_SD_CS_PIN + #endif #endif /** @@ -238,8 +237,8 @@ #define LCD_PINS_ENABLE P0_18 // EXP1.3 #define LCD_PINS_D4 P0_15 // EXP1.5 #if ANY(VIKI2, miniVIKI) - #define DOGLCD_SCK SCK_PIN - #define DOGLCD_MOSI MOSI_PIN + #define DOGLCD_SCK SD_SCK_PIN + #define DOGLCD_MOSI SD_MOSI_PIN #endif #if ENABLED(FYSETC_MINI_12864) diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 6d9d225eff..b919ecad85 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -375,13 +375,13 @@ #if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 #if SD_CONNECTION_IS(ONBOARD) - #define SS_PIN ONBOARD_SD_CS_PIN + #define SD_SS_PIN ONBOARD_SD_CS_PIN #else - #define SS_PIN P0_28 + #define SD_SS_PIN P0_28 #endif #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index f746064991..e045245188 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -336,11 +336,6 @@ #elif HAS_WIRED_LCD - //#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 - //#define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 - //#define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 - //#define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - #if ENABLED(FYSETC_MINI_12864) #define BEEPER_PIN P1_01 #define BTN_ENC P1_04 @@ -375,8 +370,8 @@ #define DOGLCD_CS P0_16 // (16) #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 - #define DOGLCD_SCK SCK_PIN - #define DOGLCD_MOSI MOSI_PIN + #define DOGLCD_SCK SD_SCK_PIN + #define DOGLCD_MOSI SD_MOSI_PIN #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes @@ -464,16 +459,16 @@ #define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card #if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 - #define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 - #define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 - #define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin + #define SD_SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 + #define SD_MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 + #define SD_MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 + #define SD_SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin #elif SD_CONNECTION_IS(ONBOARD) #undef SD_DETECT_PIN - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 + #define SD_SS_PIN ONBOARD_SD_CS_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." #endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index ac1d9f6906..596efdbb97 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -162,8 +162,8 @@ #define BEEPER_PIN P1_30 // (37) may change if cable changes #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 - #define DOGLCD_SCK SCK_PIN - #define DOGLCD_MOSI MOSI_PIN + #define DOGLCD_SCK SD_SCK_PIN + #define DOGLCD_MOSI SD_MOSI_PIN #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes @@ -204,16 +204,16 @@ #define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card #if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - #define SS_PIN P1_23 + #define SD_SCK_PIN P0_15 + #define SD_MISO_PIN P0_17 + #define SD_MOSI_PIN P0_18 + #define SD_SS_PIN P1_23 #elif SD_CONNECTION_IS(ONBOARD) #undef SD_DETECT_PIN - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 + #define SD_SS_PIN ONBOARD_SD_CS_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." #endif diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index a34b70bae3..0e93aec945 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -253,10 +253,10 @@ #if SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN P2_00 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN P0_06 + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 + #define SD_SS_PIN P0_06 #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "SD CUSTOM_CABLE is not compatible with SKR E3 Turbo." #endif diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h index 66604ef635..edf13cee29 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -233,17 +233,16 @@ #define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card -#if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_07 // (52) system defined J3-9 & AUX-3 - #define MISO_PIN P0_08 // (50) system defined J3-10 & AUX-3 - #define MOSI_PIN P0_09 // (51) system defined J3-10 & AUX-3 - #define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin -#elif SD_CONNECTION_IS(ONBOARD) - #undef SD_DETECT_PIN - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN +#if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD) + #define SD_SCK_PIN P0_07 // (52) system defined J3-9 & AUX-3 + #define SD_MISO_PIN P0_08 // (50) system defined J3-10 & AUX-3 + #define SD_MOSI_PIN P0_09 // (51) system defined J3-10 & AUX-3 + #if SD_CONNECTION_IS(LCD) + #define SD_SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin + #else + #undef SD_DETECT_PIN + #define SD_SS_PIN ONBOARD_SD_CS_PIN + #endif #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." #endif diff --git a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h index 5e4bea1c2b..3982d76a01 100644 --- a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h +++ b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h @@ -167,15 +167,15 @@ #endif #if SD_CONNECTION_IS(ONBOARD) - #define SS_PIN P0_06 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 + #define SD_SS_PIN P0_06 + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 #define SD_DETECT_PIN P0_05 #elif SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - #define SS_PIN P0_16 + #define SD_SCK_PIN P0_15 + #define SD_MISO_PIN P0_17 + #define SD_MOSI_PIN P0_18 + #define SD_SS_PIN P0_16 #define SD_DETECT_PIN P2_06 #endif diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 638268a546..79c79c5914 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -394,13 +394,13 @@ #if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 + #define SD_SCK_PIN P0_07 + #define SD_MISO_PIN P0_08 + #define SD_MOSI_PIN P0_09 #if SD_CONNECTION_IS(ONBOARD) - #define SS_PIN ONBOARD_SD_CS_PIN + #define SD_SS_PIN ONBOARD_SD_CS_PIN #else - #define SS_PIN P0_28 + #define SD_SS_PIN P0_28 #endif #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "No custom SD drive cable defined for this board." diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 4e10d8d1da..c5ce3f8795 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -124,10 +124,10 @@ */ #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) - #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) - #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) - #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) - #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) + #define SD_MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) + #define SD_SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) + #define SD_SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) + #define SD_MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) /** * The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index c11cd9e9da..d4f3e5bc21 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -141,11 +141,11 @@ #define SDCARD_CONNECTION ONBOARD -#define SCK_PIN P0_07 -#define MISO_PIN P0_08 -#define MOSI_PIN P0_09 +#define SD_SCK_PIN P0_07 +#define SD_MISO_PIN P0_08 +#define SD_MOSI_PIN P0_09 #define ONBOARD_SD_CS_PIN P0_06 -#define SS_PIN ONBOARD_SD_CS_PIN +#define SD_SS_PIN ONBOARD_SD_CS_PIN // // LCD / Controller diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index cf839e2abd..0e1b1b09e5 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -702,7 +702,7 @@ // REPORT_NAME_DIGITAL(__LINE__, MISO) // #endif #if PIN_EXISTS(MISO) - REPORT_NAME_DIGITAL(__LINE__, MISO_PIN) + REPORT_NAME_DIGITAL(__LINE__, SD_MISO_PIN) #endif #if PIN_EXISTS(MOSFET_A) REPORT_NAME_DIGITAL(__LINE__, MOSFET_A_PIN) @@ -720,7 +720,7 @@ // REPORT_NAME_DIGITAL(__LINE__, MOSI) // #endif #if PIN_EXISTS(MOSI) - REPORT_NAME_DIGITAL(__LINE__, MOSI_PIN) + REPORT_NAME_DIGITAL(__LINE__, SD_MOSI_PIN) #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_E_PIN) @@ -801,7 +801,7 @@ // REPORT_NAME_DIGITAL(__LINE__, SCK) // #endif #if PIN_EXISTS(SCK) - REPORT_NAME_DIGITAL(__LINE__, SCK_PIN) + REPORT_NAME_DIGITAL(__LINE__, SD_SCK_PIN) #endif // #if defined(SCL) && SCL >= 0 // REPORT_NAME_DIGITAL(__LINE__, SCL) @@ -909,7 +909,7 @@ REPORT_NAME_DIGITAL(__LINE__, SR_STROBE_PIN) #endif #if PIN_EXISTS(SS) - REPORT_NAME_DIGITAL(__LINE__, SS_PIN) + REPORT_NAME_DIGITAL(__LINE__, SD_SS_PIN) #endif #if PIN_EXISTS(STAT_LED_BLUE) REPORT_NAME_DIGITAL(__LINE__, STAT_LED_BLUE_PIN) diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h index 87d24890c9..93ec3d6070 100644 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -80,9 +80,9 @@ #define SDSS 53 // PB0 / SS #define LED_PIN 13 // PB7 / PWM13 -#define MISO_PIN 50 // PB3 -#define MOSI_PIN 51 // PB2 -#define SCK_PIN 52 // PB1 +#define SD_MISO_PIN 50 // PB3 +#define SD_MOSI_PIN 51 // PB2 +#define SD_SCK_PIN 52 // PB1 // // LCDs and Controllers diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h index 1fda0ccb44..57bbeb62a2 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM1.h +++ b/Marlin/src/pins/sam/pins_ARCHIM1.h @@ -170,9 +170,9 @@ #define INT_SDSS 55 // D55 PA24/MCDA3 // External SD card reader on SC2 -#define SCK_PIN 76 // D76 PA27 -#define MISO_PIN 74 // D74 PA25 -#define MOSI_PIN 75 // D75 PA26 +#define SD_SCK_PIN 76 // D76 PA27 +#define SD_MISO_PIN 74 // D74 PA25 +#define SD_MOSI_PIN 75 // D75 PA26 #define SDSS 87 // D87 PA29 // 2MB SPI Flash diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h index 5923ea0f8f..3776cf8bb5 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM2.h +++ b/Marlin/src/pins/sam/pins_ARCHIM2.h @@ -192,9 +192,9 @@ #define INT_SDSS 55 // D55 PA24/MCDA3 // External SD card reader on SC2 -#define SCK_PIN 76 // D76 PA27 -#define MISO_PIN 74 // D74 PA25 -#define MOSI_PIN 75 // D75 PA26 +#define SD_SCK_PIN 76 // D76 PA27 +#define SD_MISO_PIN 74 // D74 PA25 +#define SD_MOSI_PIN 75 // D75 PA26 #define SDSS 87 // D87 PA29 // Unused Digital GPIO J20 Pins diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h index fcd2bb4c67..5bf31450b7 100644 --- a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h +++ b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h @@ -117,9 +117,9 @@ // // SD card // -#define SCK_PIN 76 -#define MISO_PIN 74 -#define MOSI_PIN 75 +#define SD_SCK_PIN 76 +#define SD_MISO_PIN 74 +#define SD_MOSI_PIN 75 #define SDSS 53 #define SD_DETECT_PIN 40 diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index ea4b950a17..424d858a85 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -151,9 +151,9 @@ ///////////////////////////////////////////////////////// -#define MISO_PIN 68 // set to unused pins for now -#define MOSI_PIN 69 // set to unused pins for now -#define SCK_PIN 70 // set to unused pins for now +#define SD_MISO_PIN 68 // set to unused pins for now +#define SD_MOSI_PIN 69 // set to unused pins for now +#define SD_SCK_PIN 70 // set to unused pins for now #define SDSS 71 // set to unused pins for now /** diff --git a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h index 0b91ba61d6..ea096187f7 100644 --- a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h +++ b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h @@ -147,9 +147,9 @@ #define SPI_EEPROM2_CS -1 #define SPI_FLASH_CS -1 -#define SCK_PIN 76 -#define MISO_PIN 74 -#define MOSI_PIN 75 +#define SD_SCK_PIN 76 +#define SD_MISO_PIN 74 +#define SD_MOSI_PIN 75 // SPI for Max6675 or Max31855 Thermocouple #define MAX6675_SS_PIN 65 diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index f110fe5794..97db36dd54 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -91,13 +91,13 @@ PIN: 3 Port: B3 Z_STEP_PIN protected PIN: 4 Port: B4 AVR_SS_PIN protected . FAN_PIN protected - . SS_PIN protected + . SD_SS_PIN protected PIN: 5 Port: B5 AVR_MOSI_PIN Output = 1 - . MOSI_PIN Output = 1 + . SD_MOSI_PIN Output = 1 PIN: 6 Port: B6 AVR_MISO_PIN Input = 0 TIMER3A PWM: 0 WGM: 1 COM3A: 0 CS: 3 TCCR3A: 1 TCCR3B: 3 TIMSK3: 0 - . MISO_PIN Input = 0 + . SD_MISO_PIN Input = 0 PIN: 7 Port: B7 AVR_SCK_PIN Output = 0 TIMER3B PWM: 0 WGM: 1 COM3B: 0 CS: 3 TCCR3A: 1 TCCR3B: 3 TIMSK3: 0 - . SCK_PIN Output = 0 + . SD_SCK_PIN Output = 0 PIN: 8 Port: D0 RXD Input = 1 PIN: 9 Port: D1 TXD Input = 0 PIN: 10 Port: D2 BTN_EN2 Input = 1 diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index 3cf68ac905..d064d80132 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -49,11 +49,11 @@ * PIN: 4 Port: B4 SDSS * PIN: 4 Port: B4 V1: EXP1_6 * PIN: 5 Port: B5 AVR_MOSI_PIN - * . MOSI_PIN + * . SD_MOSI_PIN * PIN: 6 Port: B6 AVR_MISO_PIN - * . EXP1_9(MISO_PIN) + * . EXP1_9(SD_MISO_PIN) * PIN: 7 Port: B7 AVR_SCK_PIN - * . EXP1_10(SCK_PIN) + * . EXP1_10(SD_SCK_PIN) * PIN: 8 Port: D0 RXD * PIN: 9 Port: D1 TXD * PIN: 10 Port: D2 EXP1_8 diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h index a0e035a916..2717439f24 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h @@ -41,7 +41,7 @@ // // SD CARD SPI // -#define SDSS SS_PIN +#define SDSS SD_SS_PIN // // Timers diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index a124b4d583..0426e80fd2 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -280,7 +280,7 @@ #define SD_DETECT_PIN PC4 #elif SD_CONNECTION_IS(LCD) && BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #define SD_DETECT_PIN PA15 - #define SS_PIN PA10 + #define SD_SS_PIN PA10 #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "SD CUSTOM_CABLE is not compatible with SKR E3 DIP." #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index ead939707f..bab662d1be 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -274,7 +274,7 @@ #define SD_DETECT_PIN PC4 #elif SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) #define SD_DETECT_PIN PB5 - #define SS_PIN PA10 + #define SD_SS_PIN PA10 #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "SD CUSTOM_CABLE is not compatible with SKR Mini E3." #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index 410424f6b5..8668e1defd 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -217,16 +217,16 @@ #if SD_CONNECTION_IS(LCD) #define SPI_DEVICE 3 #define SD_DETECT_PIN PB9 - #define SCK_PIN PB3 - #define MISO_PIN PB4 - #define MOSI_PIN PB5 - #define SS_PIN PA15 + #define SD_SCK_PIN PB3 + #define SD_MISO_PIN PB4 + #define SD_MOSI_PIN PB5 + #define SD_SS_PIN PA15 #elif SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN PA3 - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PA7 - #define SS_PIN PA4 + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PA7 + #define SD_SS_PIN PA4 #endif #define ONBOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index a255160829..43dfdece44 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -166,10 +166,10 @@ // #if SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN -1 - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PA7 - #define SS_PIN PA4 + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PA7 + #define SD_SS_PIN PA4 #endif #define ONBOARD_SPI_DEVICE 1 // SPI1 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 32d4e0c9d4..c90ae84acb 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -175,10 +175,10 @@ // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available // Needs to use SPI2 #define SPI_DEVICE 2 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SS_PIN PB12 +#define SD_SCK_PIN PB13 +#define SD_MISO_PIN PB14 +#define SD_MOSI_PIN PB15 +#define SD_SS_PIN PB12 // // SD Card diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 066a6cc8aa..96cf36629a 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -190,10 +190,10 @@ // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available // so SPI2 is required. #define SPI_DEVICE 2 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SS_PIN PB12 +#define SD_SCK_PIN PB13 +#define SD_MISO_PIN PB14 +#define SD_MOSI_PIN PB15 +#define SD_SS_PIN PB12 // // SD Card diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index c52b12b26b..c49c31e741 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -62,9 +62,9 @@ // SPI // Note: FLSun Hispeed (clone MKS_Robin_miniV2) board is using SPI2 interface. // -#define SCK_PIN PB13 // SPI2 -#define MISO_PIN PB14 // SPI2 -#define MOSI_PIN PB15 // SPI2 +#define SD_SCK_PIN PB13 // SPI2 +#define SD_MISO_PIN PB14 // SPI2 +#define SD_MOSI_PIN PB15 // SPI2 #define SPI_DEVICE 2 // SPI Flash @@ -246,10 +246,10 @@ // Use the on-board card socket labeled SD_Extender #if SD_CONNECTION_IS(CUSTOM_CABLE) - #define SCK_PIN PC12 - #define MISO_PIN PC8 - #define MOSI_PIN PD2 - #define SS_PIN -1 + #define SD_SCK_PIN PC12 + #define SD_MISO_PIN PC8 + #define SD_MOSI_PIN PD2 + #define SD_SS_PIN -1 #define SD_DETECT_PIN PD12 // SD_CD (if -1 no detection) #else #define SDIO_SUPPORT diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index 859f9fab1e..2278d55870 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -133,12 +133,12 @@ // LCD / Controller // #define SPI_DEVICE 2 -#define SS_PIN PB12 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 +#define SD_SS_PIN PB12 +#define SD_SCK_PIN PB13 +#define SD_MISO_PIN PB14 +#define SD_MOSI_PIN PB15 -#define SDSS SS_PIN +#define SDSS SD_SS_PIN #define SD_DETECT_PIN PB11 #define BEEPER_PIN PC14 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index 52b857ac0a..5b97e7f202 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -216,23 +216,23 @@ // // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector // - #define SS_PIN PC11 - #define SCK_PIN PC12 - #define MOSI_PIN PD2 - #define MISO_PIN PC8 + #define SD_SS_PIN PC11 + #define SD_SCK_PIN PC12 + #define SD_MOSI_PIN PD2 + #define SD_MISO_PIN PC8 #define SD_DETECT_PIN PC7 #else // // Use the on-board card socket labeled TF_CARD_SOCKET // - #define SS_PIN PA4 - #define SCK_PIN PA5 - #define MOSI_PIN PA7 - #define MISO_PIN PA6 + #define SD_SS_PIN PA4 + #define SD_SCK_PIN PA5 + #define SD_MOSI_PIN PA7 + #define SD_MISO_PIN PA6 #define SD_DETECT_PIN -1 // Card detect is not connected #endif -#define SDSS SS_PIN +#define SDSS SD_SS_PIN // // ESP WiFi can be soldered to J9 connector which is wired to USART2. diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 85d0be6d6b..173eb67f0d 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -210,23 +210,23 @@ // // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector // - #define SS_PIN PC11 - #define SCK_PIN PC12 - #define MOSI_PIN PD2 - #define MISO_PIN PC8 + #define SD_SS_PIN PC11 + #define SD_SCK_PIN PC12 + #define SD_MOSI_PIN PD2 + #define SD_MISO_PIN PC8 #define SD_DETECT_PIN PC7 #else // // Use the on-board card socket labeled TF_CARD_SOCKET // - #define SS_PIN PA4 - #define SCK_PIN PA5 - #define MOSI_PIN PA7 - #define MISO_PIN PA6 + #define SD_SS_PIN PA4 + #define SD_SCK_PIN PA5 + #define SD_MOSI_PIN PA7 + #define SD_MISO_PIN PA6 #define SD_DETECT_PIN -1 // Card detect is not connected #endif -#define SDSS SS_PIN +#define SDSS SD_SS_PIN // // ESP WiFi can be soldered to J9 connector which is wired to USART2. diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index 52b857ac0a..5b97e7f202 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -216,23 +216,23 @@ // // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector // - #define SS_PIN PC11 - #define SCK_PIN PC12 - #define MOSI_PIN PD2 - #define MISO_PIN PC8 + #define SD_SS_PIN PC11 + #define SD_SCK_PIN PC12 + #define SD_MOSI_PIN PD2 + #define SD_MISO_PIN PC8 #define SD_DETECT_PIN PC7 #else // // Use the on-board card socket labeled TF_CARD_SOCKET // - #define SS_PIN PA4 - #define SCK_PIN PA5 - #define MOSI_PIN PA7 - #define MISO_PIN PA6 + #define SD_SS_PIN PA4 + #define SD_SCK_PIN PA5 + #define SD_MOSI_PIN PA7 + #define SD_MISO_PIN PA6 #define SD_DETECT_PIN -1 // Card detect is not connected #endif -#define SDSS SS_PIN +#define SDSS SD_SS_PIN // // ESP WiFi can be soldered to J9 connector which is wired to USART2. diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index 292119ce02..b4a34a4b1e 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -212,24 +212,24 @@ // // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector // - #define SS_PIN PB12 // PC11 - #define SCK_PIN PB13 // PC12 // PC1 - #define MOSI_PIN PB15 // PD2 // PD2 - #define MISO_PIN PB14 // PC8 + #define SD_SS_PIN PB12 // PC11 + #define SD_SCK_PIN PB13 // PC12 // PC1 + #define SD_MOSI_PIN PB15 // PD2 // PD2 + #define SD_MISO_PIN PB14 // PC8 #define SD_DETECT_PIN PC7 #else // // Use the on-board card socket labeled TF_CARD_SOCKET // - #define SS_PIN PA4 - #define SCK_PIN PA5 - #define MOSI_PIN PA7 - #define MISO_PIN PA6 // PA6 + #define SD_SS_PIN PA4 + #define SD_SCK_PIN PA5 + #define SD_MOSI_PIN PA7 + #define SD_MISO_PIN PA6 // PA6 #define SD_DETECT_PIN -1 // Card detect is not connected #endif -#define SDSS SS_PIN +#define SDSS SD_SS_PIN // // ESP WiFi can be soldered to J9 connector which is wired to USART2. diff --git a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h index 95e7e92174..e33e029deb 100644 --- a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h +++ b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h @@ -41,7 +41,7 @@ #define FLASH_EEPROM_EMULATION #endif -#define SDSS SS_PIN +#define SDSS SD_SS_PIN // Based on PWM timer usage, we have to use these timers and soft PWM for the fans // On STM32F103: diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 21dad6df3e..ae9419ab79 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -168,9 +168,9 @@ #define SDIO_CLOCK 4500000 #define SDIO_READ_RETRIES 16 #if ENABLED(SDIO_SUPPORT) - #define SCK_PIN PB13 // SPI2 - #define MISO_PIN PB14 // SPI2 - #define MOSI_PIN PB15 // SPI2 + #define SD_SCK_PIN PB13 // SPI2 + #define SD_MISO_PIN PB14 // SPI2 + #define SD_MOSI_PIN PB15 // SPI2 /** * MKS Robin has a few hardware revisions * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware @@ -184,10 +184,10 @@ //#define SD_DETECT_PIN PF12 // SD_CD #else // SD as custom software SPI (SDIO pins) - #define SCK_PIN PC12 - #define MISO_PIN PC8 - #define MOSI_PIN PD2 - #define SS_PIN -1 + #define SD_SCK_PIN PC12 + #define SD_MISO_PIN PC8 + #define SD_MOSI_PIN PD2 + #define SD_SS_PIN -1 #define ONBOARD_SD_CS_PIN PC11 #define SDSS PD2 #define SD_DETECT_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 66d90e0194..c4a7e9f408 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -180,10 +180,10 @@ // #define SPI_DEVICE 2 #define SD_DETECT_PIN PC10 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SS_PIN PA15 +#define SD_SCK_PIN PB13 +#define SD_MISO_PIN PB14 +#define SD_MOSI_PIN PB15 +#define SD_SS_PIN PA15 #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(125) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index 1ad18a6497..13c2d41d57 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -142,7 +142,7 @@ // SPI // #define SPI_DEVICE 2 -#define SCK_PIN PB13 -#define MISO_PIN P1B4 -#define MOSI_PIN P1B5 -#define SS_PIN PA15 +#define SD_SCK_PIN PB13 +#define SD_MISO_PIN P1B4 +#define SD_MOSI_PIN P1B5 +#define SD_SS_PIN PA15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 27bd4033cd..f814052fa8 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -153,7 +153,7 @@ // SPI // #define SPI_DEVICE 2 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SS_PIN PA15 +#define SD_SCK_PIN PB13 +#define SD_MISO_PIN PB14 +#define SD_MOSI_PIN PB15 +#define SD_SS_PIN PA15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 89bb41b197..39676bf9d7 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -193,10 +193,10 @@ #if SD_CONNECTION_IS(LCD) #define SD_DETECT_PIN PG3 - #define SCK_PIN PB13 - #define MISO_PIN PB14 - #define MOSI_PIN PB15 - #define SS_PIN PG6 + #define SD_SCK_PIN PB13 + #define SD_MISO_PIN PB14 + #define SD_MOSI_PIN PB15 + #define SD_SS_PIN PG6 #elif SD_CONNECTION_IS(ONBOARD) #define SDIO_SUPPORT #define SD_DETECT_PIN PD12 diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 543a90b66b..cf1b7861ed 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -166,17 +166,17 @@ #define SPI_DEVICE 2 #if ENABLED(SDIO_SUPPORT) - #define SCK_PIN PB13 // SPI2 ok - #define MISO_PIN PB14 // SPI2 ok - #define MOSI_PIN PB15 // SPI2 ok - #define SS_PIN PC11 // PB12 is X- ok + #define SD_SCK_PIN PB13 // SPI2 ok + #define SD_MISO_PIN PB14 // SPI2 ok + #define SD_MOSI_PIN PB15 // SPI2 ok + #define SD_SS_PIN PC11 // PB12 is X- ok #define SD_DETECT_PIN -1 // SD_CD ok #else // SD as custom software SPI (SDIO pins) - #define SCK_PIN PC12 - #define MISO_PIN PC8 - #define MOSI_PIN PD2 - #define SS_PIN -1 + #define SD_SCK_PIN PC12 + #define SD_MISO_PIN PC8 + #define SD_MOSI_PIN PD2 + #define SD_SS_PIN -1 #define ONBOARD_SD_CS_PIN PC11 #define SDSS PD2 #define SD_DETECT_PIN -1 diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h index 0721aab844..a63ed1ddf0 100644 --- a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h @@ -210,9 +210,9 @@ #if DISABLED(SDIO_SUPPORT) #define SOFTWARE_SPI #define SDSS SDIO_D3_PIN - #define SCK_PIN SDIO_CK_PIN - #define MISO_PIN SDIO_D0_PIN - #define MOSI_PIN SDIO_CMD_PIN + #define SD_SCK_PIN SDIO_CK_PIN + #define SD_MISO_PIN SDIO_D0_PIN + #define SD_MOSI_PIN SDIO_CMD_PIN #endif #ifndef SD_DETECT_PIN diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index 4b981c9251..c2ad907e04 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -156,8 +156,8 @@ #ifndef SDIO_SUPPORT #define SOFTWARE_SPI // Use soft SPI for onboard SD #define SDSS SDIO_D3_PIN - #define SCK_PIN SDIO_CK_PIN - #define MISO_PIN SDIO_D0_PIN - #define MOSI_PIN SDIO_CMD_PIN + #define SD_SCK_PIN SDIO_CK_PIN + #define SD_MISO_PIN SDIO_D0_PIN + #define SD_MOSI_PIN SDIO_CMD_PIN #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index af2ebce9ed..939bc1eccd 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -175,10 +175,10 @@ // HAL SPI1 pins #define CUSTOM_SPI_PINS #if ENABLED(CUSTOM_SPI_PINS) - #define SCK_PIN PA5 // SPI1 SCLK - #define SS_PIN PA4 // SPI1 SSEL - #define MISO_PIN PA6 // SPI1 MISO - #define MOSI_PIN PA7 // SPI1 MOSI + #define SD_SCK_PIN PA5 // SPI1 SCLK + #define SD_SS_PIN PA4 // SPI1 SSEL + #define SD_MISO_PIN PA6 // SPI1 MISO + #define SD_MOSI_PIN PA7 // SPI1 MOSI #endif // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index d8a6e453fe..981064fa4d 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -341,10 +341,10 @@ // Instruct the STM32 HAL to override the default SPI pins from the variant.h file #define CUSTOM_SPI_PINS #define SDSS PA4 - #define SS_PIN SDSS - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PA7 + #define SD_SS_PIN SDSS + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PA7 #define SD_DETECT_PIN PC4 #elif SD_CONNECTION_IS(CUSTOM_CABLE) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index be05ebcfa9..54153beb1e 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -303,9 +303,9 @@ // so force Software SPI to work around this issue. #define SOFTWARE_SPI #define SDSS PA4 - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PB5 + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PB5 #define SD_DETECT_PIN PB11 #elif SD_CONNECTION_IS(CUSTOM_CABLE) diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 933ee532a9..7965d262c3 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -196,16 +196,16 @@ #ifndef SDIO_SUPPORT #define SOFTWARE_SPI // Use soft SPI for onboard SD #define SDSS SDIO_D3_PIN - #define SCK_PIN SDIO_CK_PIN - #define MISO_PIN SDIO_D0_PIN - #define MOSI_PIN SDIO_CMD_PIN + #define SD_SCK_PIN SDIO_CK_PIN + #define SD_MISO_PIN SDIO_D0_PIN + #define SD_MOSI_PIN SDIO_CMD_PIN #endif #elif SD_CONNECTION_IS(LCD) - #define SCK_PIN PB13 - #define MISO_PIN PB14 - #define MOSI_PIN PB15 + #define SD_SCK_PIN PB13 + #define SD_MISO_PIN PB14 + #define SD_MOSI_PIN PB15 #define SDSS PF11 #define SD_DETECT_PIN PB2 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 7616d744cb..7d435c8cd5 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -180,9 +180,9 @@ // // SPI // -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 +#define SD_SCK_PIN PA5 +#define SD_MISO_PIN PA6 +#define SD_MOSI_PIN PA7 // // Misc. Functions diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 688c321c72..18cbdeaaf5 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -153,10 +153,10 @@ #define KILL_PIN -1 #define POWER_LOSS_PIN PA4 // Power-loss / nAC_FAULT -#define SCK_PIN PC12 -#define MISO_PIN PC8 -#define MOSI_PIN PD2 -#define SS_PIN PC11 +#define SD_SCK_PIN PC12 +#define SD_MISO_PIN PC8 +#define SD_MOSI_PIN PD2 +#define SD_SS_PIN PC11 #define SD_DETECT_PIN PA8 #define BEEPER_PIN PC7 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index 8775847738..486aabfd8e 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -158,10 +158,10 @@ #define SDIO_SUPPORT #define SDIO_CLOCK 4800000 -#define SCK_PIN PC12 -#define MISO_PIN PC8 -#define MOSI_PIN PD2 -#define SS_PIN PC11 +#define SD_SCK_PIN PC12 +#define SD_MISO_PIN PC8 +#define SD_MOSI_PIN PD2 +#define SD_SS_PIN PC11 #define SD_DETECT_PIN PG15 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index ebf7120a44..c73b9927ac 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -117,10 +117,10 @@ // Lerdge supports auto-power off and power loss sense through a single pin. #define POWER_LOSS_PIN PC14 // Power-loss / nAC_FAULT -#define SCK_PIN PC12 -#define MISO_PIN PC8 -#define MOSI_PIN PD2 -#define SS_PIN PC11 +#define SD_SCK_PIN PC12 +#define SD_MISO_PIN PC8 +#define SD_MOSI_PIN PD2 +#define SD_SS_PIN PC11 // // SD support diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index 81edff6793..47997c4677 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -217,11 +217,11 @@ #define CUSTOM_SPI_PINS // TODO: needed because is the only way to set SPI3 for SD on STM32 (by now) #if ENABLED(CUSTOM_SPI_PINS) #define ENABLE_SPI3 - #define SS_PIN -1 + #define SD_SS_PIN -1 #define SDSS PC9 - #define SCK_PIN PC10 - #define MISO_PIN PC11 - #define MOSI_PIN PC12 + #define SD_SCK_PIN PC10 + #define SD_MISO_PIN PC11 + #define SD_MOSI_PIN PC12 #define SD_DETECT_PIN PD12 #endif #endif @@ -234,9 +234,9 @@ #if ENABLED(CUSTOM_SPI_PINS) #define ENABLE_SPI1 #define SDSS PE10 - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PA7 + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PA7 #define SD_DETECT_PIN PE12 #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index 719f8773f5..5533e35f07 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -220,11 +220,11 @@ #define SD_SPI MARLIN_SPI(HardwareSPI3, PC9) #else #define ENABLE_SPI3 - #define SS_PIN -1 + #define SD_SS_PIN -1 #define SDSS PC9 - #define SCK_PIN PC10 - #define MISO_PIN PC11 - #define MOSI_PIN PC12 + #define SD_SCK_PIN PC10 + #define SD_MISO_PIN PC11 + #define SD_MOSI_PIN PC12 #endif #define SD_DETECT_PIN PD12 #endif @@ -239,9 +239,9 @@ #if ENABLED(CUSTOM_SPI_PINS) #define ENABLE_SPI1 #define SDSS PE10 - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PA7 + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PA7 #define SD_DETECT_PIN PE12 #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 959e893edc..2a0cfa897c 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -126,9 +126,9 @@ // // SPI // -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 +#define SD_SCK_PIN PA5 +#define SD_MISO_PIN PA6 +#define SD_MOSI_PIN PA7 // // Misc. Functions diff --git a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h index 0278dd8434..25679517c2 100644 --- a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h +++ b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h @@ -120,13 +120,13 @@ #define L6470_CHAIN_MOSI_PIN 19 // PA7 #define L6470_CHAIN_SS_PIN 16 // PA4 - //#define SCK_PIN L6470_CHAIN_SCK_PIN - //#define MISO_PIN L6470_CHAIN_MISO_PIN - //#define MOSI_PIN L6470_CHAIN_MOSI_PIN + //#define SD_SCK_PIN L6470_CHAIN_SCK_PIN + //#define SD_MISO_PIN L6470_CHAIN_MISO_PIN + //#define SD_MOSI_PIN L6470_CHAIN_MOSI_PIN #else - //#define SCK_PIN 13 // PB13 SPI_S - //#define MISO_PIN 12 // PB14 SPI_M - //#define MOSI_PIN 11 // PB15 SPI_M + //#define SD_SCK_PIN 13 // PB13 SPI_S + //#define SD_MISO_PIN 12 // PB14 SPI_M + //#define SD_MOSI_PIN 11 // PB15 SPI_M #endif /** @@ -249,9 +249,9 @@ #define SOFTWARE_SPI // Use soft SPI for onboard SD #undef SDSS #define SDSS SDIO_D3_PIN - #define SCK_PIN SDIO_CK_PIN - #define MISO_PIN SDIO_D0_PIN - #define MOSI_PIN SDIO_CMD_PIN + #define SD_SCK_PIN SDIO_CK_PIN + #define SD_MISO_PIN SDIO_D0_PIN + #define SD_MOSI_PIN SDIO_CMD_PIN #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index e2463fd47e..1135af847f 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -99,16 +99,16 @@ #define E1_CS_PIN PB0 #endif -#define SCK_PIN PE12 // PA5 // SPI1 for SD card -#define MISO_PIN PE13 // PA6 -#define MOSI_PIN PE14 // PA7 +#define SD_SCK_PIN PE12 // PA5 // SPI1 for SD card +#define SD_MISO_PIN PE13 // PA6 +#define SD_MOSI_PIN PE14 // PA7 // added for SD card : optional or not ??? //#define SD_CHIP_SELECT_PIN SDSS // The default chip select pin for the SD card is SS. // The following three pins must not be redefined for hardware SPI. -//#define SPI_MOSI_PIN MOSI_PIN // SPI Master Out Slave In pin -//#define SPI_MISO_PIN MISO_PIN // SPI Master In Slave Out pin -//#define SPI_SCK_PIN SCK_PIN // SPI Clock pin +//#define SPI_MOSI_PIN SD_MOSI_PIN // SPI Master Out Slave In pin +//#define SPI_MISO_PIN SD_MISO_PIN // SPI Master In Slave Out pin +//#define SPI_SCK_PIN SD_SCK_PIN // SPI Clock pin // // Temperature Sensors (Analog inputs) @@ -159,7 +159,7 @@ #if ENABLED(SDSUPPORT) #define SD_DETECT_PIN PB7 - #define SS_PIN PB_15 // USD_CS -> CS for onboard SD + #define SD_SS_PIN PB_15 // USD_CS -> CS for onboard SD #endif // diff --git a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h index 466cce565d..5e50548c9b 100644 --- a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h +++ b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h @@ -170,10 +170,10 @@ #define SERVO1_PIN PB5 // PWM Capable, TIM3_CH2 // SPI for external SD Card (Not entirely sure this will work) -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 -#define SS_PIN PA4 +#define SD_SCK_PIN PA5 +#define SD_MISO_PIN PA6 +#define SD_MOSI_PIN PA7 +#define SD_SS_PIN PA4 #define SDSS PA4 #define LED_PIN LED_BLUE diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 88b42f836d..7b162f7343 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -379,9 +379,9 @@ void CardReader::mount() { flag.mounted = false; if (root.isOpen()) root.close(); - if (!sd2card.init(SPI_SPEED, SDSS) + if (!sd2card.init(SD_SPI_SPEED, SDSS) #if defined(LCD_SDSS) && (LCD_SDSS != SDSS) - && !sd2card.init(SPI_SPEED, LCD_SDSS) + && !sd2card.init(SD_SPI_SPEED, LCD_SDSS) #endif ) SERIAL_ECHO_MSG(STR_SD_INIT_FAIL); else if (!volume.init(&sd2card)) diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index 28a18cd9d8..c6e3c73f52 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -50,7 +50,7 @@ #if ENABLED(USE_UHS3_USB) #define NO_AUTO_SPEED - #define UHS_MAX3421E_SPD 8000000 >> SPI_SPEED + #define UHS_MAX3421E_SPD 8000000 >> SD_SPI_SPEED #define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 1 #define UHS_HOST_MAX_INTERFACE_DRIVERS 2 #define MASS_MAX_SUPPORTED_LUN 1 diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index 83245168ab..e6980a03aa 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -42,7 +42,7 @@ #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD #else // hardware pin defs - #define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS. + #define SD_CHIP_SELECT_PIN SD_SS_PIN // The default chip select pin for the SD card is SS. #endif #endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp index 358b49d5b4..190a0f1a9e 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp @@ -114,13 +114,7 @@ bool MAX3421e::start() { ncs(); spiBegin(); - spiInit( - #ifdef SPI_SPEED - SPI_SPEED - #else - SPI_FULL_SPEED - #endif - ); + spiInit(SD_SPI_SPEED); // MAX3421e - full-duplex, level interrupt, vbus off. regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | GPX_VBDET)); From 3b4c5f982c90194db4d28bf93a7826b362ae42ee Mon Sep 17 00:00:00 2001 From: zeleps <39417467+zeleps@users.noreply.github.com> Date: Fri, 1 Jan 2021 22:54:44 +0200 Subject: [PATCH 0816/1370] Fix PARKING_EXTRUDER homing with solenoid (#20473) --- Marlin/src/feature/solenoid.cpp | 15 +++++-- Marlin/src/gcode/calibrate/G28.cpp | 6 ++- Marlin/src/gcode/control/T.cpp | 18 +++------ Marlin/src/module/tool_change.cpp | 64 +++++++++++++++++++++--------- Marlin/src/module/tool_change.h | 3 ++ 5 files changed, 71 insertions(+), 35 deletions(-) diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index 8646ec872f..659b642262 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -28,22 +28,29 @@ #include "../module/motion.h" // for active_extruder -#if ENABLED(MANUAL_SOLENOID_CONTROL) - #define HAS_SOLENOID(N) HAS_SOLENOID_##N +// PARKING_EXTRUDER options alter the default behavior of solenoids, this ensures compliance of M380-381 + +#if ENABLED(PARKING_EXTRUDER) + #include "../module/tool_change.h" + #define SOLENOID_MAGNETIZED_STATE (TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT,!)PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE) #else - #define HAS_SOLENOID(N) (HAS_SOLENOID_##N && EXTRUDERS > N) + #define SOLENOID_MAGNETIZED_STATE HIGH #endif +#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && TERN(MANUAL_SOLENOID_CONTROL, true, EXTRUDERS > N)) + // Used primarily with MANUAL_SOLENOID_CONTROL static void set_solenoid(const uint8_t num, const bool active) { - const uint8_t value = active ? HIGH : LOW; + const uint8_t value = active ? SOLENOID_MAGNETIZED_STATE : !SOLENOID_MAGNETIZED_STATE; switch (num) { case 0: OUT_WRITE(SOL0_PIN, value); + TERN_(PARKING_EXTRUDER, if (!active && active_extruder == 0) parking_extruder_set_parked()); // If active extruder's solenoid is disabled, carriage is considered parked break; #if HAS_SOLENOID(1) case 1: OUT_WRITE(SOL1_PIN, value); + TERN_(PARKING_EXTRUDER, if (!active && active_extruder == 1) parking_extruder_set_parked()); // If active extruder's solenoid is disabled, carriage is considered parked break; #endif #if HAS_SOLENOID(2) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index e63f60994f..7c13587a67 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -290,6 +290,10 @@ void GcodeSuite::G28() { #if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE) const uint8_t old_tool_index = active_extruder; #endif + // PARKING_EXTRUDER homing requires different handling of movement / solenoid activation, depending on the side of homing + #if ENABLED(PARKING_EXTRUDER) + const bool pe_final_change_must_unpark = parking_extruder_unpark_after_homing(old_tool_index, X_HOME_DIR + 1 == old_tool_index * 2); + #endif tool_change(0, true); #endif @@ -443,7 +447,7 @@ void GcodeSuite::G28() { // Restore the active tool after homing #if HAS_MULTI_HOTEND && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) - tool_change(old_tool_index, NONE(PARKING_EXTRUDER, DUAL_X_CARRIAGE)); // Do move if one of these + tool_change(old_tool_index, TERN(PARKING_EXTRUDER, !pe_final_change_must_unpark, DISABLED(DUAL_X_CARRIAGE))); // Do move if one of these #endif #if HAS_HOMING_CURRENT diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 592b2b3dce..3ce284f82e 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -61,16 +61,10 @@ void GcodeSuite::T(const int8_t tool_index) { } #endif - #if EXTRUDERS < 2 - - tool_change(tool_index); - - #else - - tool_change( - tool_index, - (tool_index == active_extruder) || parser.boolval('S') - ); - - #endif + tool_change(tool_index + #if HAS_MULTI_EXTRUDER + , TERN(PARKING_EXTRUDER, false, tool_index == active_extruder) // For PARKING_EXTRUDER motion is decided in tool_change() + || parser.boolval('S') + #endif + ); } diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index a981931917..a310442126 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -277,6 +277,28 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #endif } + bool extruder_parked = true, do_solenoid_activation = true; + + // Modifies tool_change() behavior based on homing side + bool parking_extruder_unpark_after_homing(const uint8_t final_tool, bool homed_towards_final_tool) { + do_solenoid_activation = false; // Tell parking_extruder_tool_change to skip solenoid activation + + if (!extruder_parked) return false; // nothing to do + + if (homed_towards_final_tool) { + pe_deactivate_solenoid(1 - final_tool); + DEBUG_ECHOLNPAIR("Disengage magnet", (int)(1 - final_tool)); + pe_activate_solenoid(final_tool); + DEBUG_ECHOLNPAIR("Engage magnet", (int)final_tool); + extruder_parked = false; + return false; + } + + return true; + } + + void parking_extruder_set_parked() { extruder_parked = true; } + inline void parking_extruder_tool_change(const uint8_t new_tool, bool no_move) { if (!no_move) { @@ -304,27 +326,30 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_POS("Start PE Tool-Change", current_position); - current_position.x = parkingposx[active_extruder] + x_offset; + // Don't park the active_extruder unless unparked + if (!extruder_parked) { + current_position.x = parkingposx[active_extruder] + x_offset; - DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder)); - DEBUG_POS("Moving ParkPos", current_position); + DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder)); + DEBUG_POS("Moving ParkPos", current_position); - fast_line_to_current(X_AXIS); + fast_line_to_current(X_AXIS); - // STEP 2 + // STEP 2 - planner.synchronize(); - DEBUG_ECHOLNPGM("(2) Disengage magnet"); - pe_deactivate_solenoid(active_extruder); + planner.synchronize(); + DEBUG_ECHOLNPGM("(2) Disengage magnet"); + pe_deactivate_solenoid(active_extruder); - // STEP 3 + // STEP 3 - current_position.x += active_extruder ? -10 : 10; // move 10mm away from parked extruder + current_position.x += active_extruder ? -10 : 10; // move 10mm away from parked extruder - DEBUG_ECHOLNPGM("(3) Move near new extruder"); - DEBUG_POS("Move away from parked extruder", current_position); + DEBUG_ECHOLNPGM("(3) Move near new extruder"); + DEBUG_POS("Move away from parked extruder", current_position); - fast_line_to_current(X_AXIS); + fast_line_to_current(X_AXIS); + } // STEP 4 @@ -358,13 +383,16 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a planner.synchronize(); // Always sync the final move DEBUG_POS("PE Tool-Change done.", current_position); + extruder_parked = false; } - else { // nomove == true + else if (do_solenoid_activation) { // && nomove == true + // Deactivate old extruder solenoid + TERN(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid, pe_deactivate_solenoid)(active_extruder); // Only engage magnetic field for new extruder - pe_activate_solenoid(new_tool); - // Just save power for inverted magnets - TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid(active_extruder)); + TERN(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_deactivate_solenoid, pe_activate_solenoid)(new_tool); } + + do_solenoid_activation = true; // Activate solenoid for subsequent tool_change() } #endif // PARKING_EXTRUDER @@ -922,7 +950,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { } #endif - if (new_tool != old_tool) { + if (new_tool != old_tool || TERN0(PARKING_EXTRUDER, extruder_parked)) { // PARKING_EXTRUDER may need to attach old_tool when homing destination = current_position; #if BOTH(TOOLCHANGE_FILAMENT_SWAP, HAS_FAN) && TOOLCHANGE_FS_FAN >= 0 diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 0b22f8b6f1..fc953ddf8a 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -93,6 +93,9 @@ void pe_solenoid_init(); + bool parking_extruder_unpark_after_homing(const uint8_t final_tool, bool homed_towards_final_tool); + void parking_extruder_set_parked(); + #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) typedef struct MPESettings { From 14b7eb1c5a42bef7d15650c8abfcf791c1130bb4 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 1 Jan 2021 12:56:59 -0800 Subject: [PATCH 0817/1370] Fix CHAMBER_FAN_MODE 0 build (#20621) --- Marlin/src/module/temperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index fea992f681..6f02f3b900 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1234,7 +1234,7 @@ void Temperature::manage_heater() { #if ENABLED(CHAMBER_FAN) #if CHAMBER_FAN_MODE == 0 - fan_chamber_pwm = CHAMBER_FAN_BASE + fan_chamber_pwm = CHAMBER_FAN_BASE; #elif CHAMBER_FAN_MODE == 1 fan_chamber_pwm = (temp_chamber.celsius > temp_chamber.target) ? (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * (temp_chamber.celsius - temp_chamber.target) : 0; #elif CHAMBER_FAN_MODE == 2 From 25152a8cefcdae546b7ab86d3a04e65facbbc495 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 1 Jan 2021 18:08:10 -0800 Subject: [PATCH 0818/1370] Fix UBL mesh edit delta moves (#20620) Co-authored-by: Scott Lahteine --- Marlin/src/feature/fwretract.cpp | 2 +- Marlin/src/lcd/marlinui.cpp | 16 +++++++--------- Marlin/src/lcd/marlinui.h | 15 ++++++++------- Marlin/src/lcd/menu/menu_ubl.cpp | 13 ++++++++----- Marlin/src/lcd/tft/ui_480x320.cpp | 9 ++++----- 5 files changed, 28 insertions(+), 27 deletions(-) diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index e5c52562a9..2a71af11d6 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -139,7 +139,7 @@ void FWRetract::retract(const bool retracting if (retracting) { // Retract by moving from a faux E position back to the current E position current_retract[active_extruder] = base_retract; - prepare_internal_move_to_destination( // set current to destination + prepare_internal_move_to_destination( // set current from destination settings.retract_feedrate_mm_s * TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS)) ); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index fb37643cd2..3c2f930e68 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -687,7 +687,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { TERN_(IS_KINEMATIC, float ManualMove::offset = 0); TERN_(IS_KINEMATIC, bool ManualMove::processing = false); TERN_(MULTI_MANUAL, int8_t ManualMove::e_index = 0); - uint8_t ManualMove::axis = (uint8_t)NO_AXIS; + AxisEnum ManualMove::axis = NO_AXIS; /** * If a manual move has been posted and its time has arrived, and if the planner @@ -713,14 +713,14 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { if (processing) return; // Prevent re-entry from idle() calls // Add a manual move to the queue? - if (axis != (uint8_t)NO_AXIS && ELAPSED(millis(), start_time) && !planner.is_full()) { + if (axis != NO_AXIS && ELAPSED(millis(), start_time) && !planner.is_full()) { - const feedRate_t fr_mm_s = (uint8_t(axis) <= E_AXIS) ? manual_feedrate_mm_s[axis] : XY_PROBE_FEEDRATE_MM_S; + const feedRate_t fr_mm_s = (axis <= E_AXIS) ? manual_feedrate_mm_s[axis] : XY_PROBE_FEEDRATE_MM_S; #if IS_KINEMATIC #if HAS_MULTI_EXTRUDER - const int8_t old_extruder = active_extruder; + REMEMBER(ae, active_extruder); if (axis == E_AXIS) active_extruder = e_index; #endif @@ -730,7 +730,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { // Reset for the next move offset = 0; - axis = (uint8_t)NO_AXIS; + axis = NO_AXIS; // DELTA and SCARA machines use segmented moves, which could fill the planner during the call to // move_to_destination. This will cause idle() to be called, which can then call this function while the @@ -740,8 +740,6 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { prepare_internal_move_to_destination(fr_mm_s); // will set current_position from destination processing = false; - TERN_(HAS_MULTI_EXTRUDER, active_extruder = old_extruder); - #else // For Cartesian / Core motion simply move to the current_position @@ -749,7 +747,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { //SERIAL_ECHOLNPAIR("Add planner.move with Axis ", int(axis), " at FR ", fr_mm_s); - axis = (uint8_t)NO_AXIS; + axis = NO_AXIS; #endif } @@ -767,7 +765,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { if (move_axis == E_AXIS) e_index = eindex >= 0 ? eindex : active_extruder; #endif start_time = millis() + (menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves - axis = (uint8_t)move_axis; + axis = move_axis; //SERIAL_ECHOLNPAIR("Post Move with Axis ", int(axis), " soon."); } diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index e162dbdd2e..d7285927a3 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -262,8 +262,15 @@ // Manual Movement class class ManualMove { - public: + private: + static AxisEnum axis; + #if MULTI_MANUAL + static int8_t e_index; + #else + static int8_t constexpr e_index = 0; + #endif static millis_t start_time; + public: static float menu_scale; TERN_(IS_KINEMATIC, static float offset); #if IS_KINEMATIC @@ -271,12 +278,6 @@ #else static bool constexpr processing = false; #endif - #if MULTI_MANUAL - static int8_t e_index; - #else - static int8_t constexpr e_index = 0; - #endif - static uint8_t axis; static void task(); static void soon(AxisEnum axis #if MULTI_MANUAL diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index eb19e96626..9b78416717 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -413,6 +413,10 @@ void _lcd_ubl_map_edit_cmd() { * UBL LCD Map Movement */ void ubl_map_move_to_xy() { + const xy_pos_t xy = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }; + + // Some printers have unreachable areas in the mesh. Skip the move if unreachable. + if (!position_is_reachable(xy)) return; #if ENABLED(DELTA) if (current_position.z > delta_clip_start_height) { // Make sure the delta has fully free motion @@ -422,11 +426,10 @@ void ubl_map_move_to_xy() { } #endif - // Set the nozzle position to the mesh point - current_position.set(ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot)); - - // Use the built-in manual move handler - ui.manual_move.soon(ALL_AXES); + // Do an internal move to the mesh point + destination.set(ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot)); + constexpr feedRate_t fr_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); + prepare_internal_move_to_destination(fr_mm_s); // Set current_position from destination } inline int32_t grid_index(const uint8_t x, const uint8_t y) { diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index f7955fb1bd..b6ffb4592f 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -867,17 +867,16 @@ static void moveAxis(AxisEnum axis, const int8_t direction) { NOMORE(ui.manual_move.offset, max - current_position[axis]); #else current_position[axis] += diff; + const char *msg = PSTR(""); // clear the error if (direction < 0 && current_position[axis] < min) { current_position[axis] = min; - drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); } else if (direction > 0 && current_position[axis] > max) { current_position[axis] = max; - drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); - } - else { - drawMessage(""); // clear the error + msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); } + drawMessage(msg); #endif ui.manual_move.soon(axis From f570791e1957af9a044c9852f9fb132e6a9409dd Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 2 Jan 2021 21:06:50 +1300 Subject: [PATCH 0819/1370] Fix //action prefix (#20600) --- Marlin/src/gcode/host/M118.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 06576bb75e..27207b7172 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -66,7 +66,7 @@ void GcodeSuite::M118() { #endif if (hasE) SERIAL_ECHO_START(); - if (hasA) SERIAL_ECHOPGM("// "); + if (hasA) SERIAL_ECHOPGM("//"); SERIAL_ECHOLN(p); TERN_(HAS_MULTI_SERIAL, serial_port_index = old_serial); From 7ef03a761bc528f5bb8bfac01178bd45d7e89e77 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sat, 2 Jan 2021 09:33:31 +0100 Subject: [PATCH 0820/1370] Assisted Tramming improvements (#20298) --- Marlin/Configuration_adv.h | 4 +- Marlin/src/feature/tramming.cpp | 63 +++++++++++++++++++++++++++ Marlin/src/feature/tramming.h | 9 +++- Marlin/src/gcode/bedlevel/G35.cpp | 27 ++---------- Marlin/src/inc/SanityCheck.h | 2 + Marlin/src/lcd/menu/menu_motion.cpp | 2 - Marlin/src/lcd/menu/menu_tramming.cpp | 15 ++----- buildroot/tests/DUE-tests | 3 +- platformio.ini | 3 +- 9 files changed, 86 insertions(+), 42 deletions(-) create mode 100644 Marlin/src/feature/tramming.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0a64764cae..0a51c795dc 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -813,8 +813,8 @@ #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation //#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first - //#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item to run G35 Assisted Tramming (MarlinUI) - //#define ASSISTED_TRAMMING_WIZARD // Make the menu item open a Tramming Wizard sub-menu + //#define ASSISTED_TRAMMING_WIZARD // Add a Tramming Wizard to the LCD menu + //#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment /** diff --git a/Marlin/src/feature/tramming.cpp b/Marlin/src/feature/tramming.cpp new file mode 100644 index 0000000000..b04995f40a --- /dev/null +++ b/Marlin/src/feature/tramming.cpp @@ -0,0 +1,63 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(ASSISTED_TRAMMING) + +#include "tramming.h" + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../core/debug_out.h" + +PGMSTR(point_name_1, TRAMMING_POINT_NAME_1); +PGMSTR(point_name_2, TRAMMING_POINT_NAME_2); +PGMSTR(point_name_3, TRAMMING_POINT_NAME_3); +#ifdef TRAMMING_POINT_NAME_4 + PGMSTR(point_name_4, TRAMMING_POINT_NAME_4); + #ifdef TRAMMING_POINT_NAME_5 + PGMSTR(point_name_5, TRAMMING_POINT_NAME_5); + #endif +#endif + +PGM_P const tramming_point_name[] PROGMEM = { + point_name_1, point_name_2, point_name_3 + #ifdef TRAMMING_POINT_NAME_4 + , point_name_4 + #ifdef TRAMMING_POINT_NAME_5 + , point_name_5 + #endif + #endif +}; + +#ifdef ASSISTED_TRAMMING_WAIT_POSITION + + // Move to the defined wait position + void move_to_tramming_wait_pos() { + constexpr xyz_pos_t wait_pos = ASSISTED_TRAMMING_WAIT_POSITION; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Moving away"); + do_blocking_move_to(wait_pos, XY_PROBE_FEEDRATE_MM_S); + } + +#endif + +#endif // ASSISTED_TRAMMING diff --git a/Marlin/src/feature/tramming.h b/Marlin/src/feature/tramming.h index e97fb2fde6..57b677ae30 100644 --- a/Marlin/src/feature/tramming.h +++ b/Marlin/src/feature/tramming.h @@ -19,8 +19,9 @@ * along with this program. If not, see . * */ +#pragma once -#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" #include "../module/probe.h" #if !WITHIN(TRAMMING_SCREW_THREAD, 30, 51) || TRAMMING_SCREW_THREAD % 10 > 1 @@ -62,3 +63,9 @@ static_assert(_NR_TRAM_NAMES >= G35_PROBE_COUNT, "Define enough TRAMMING_POINT_N #undef _NR_TRAM_NAMES extern PGM_P const tramming_point_name[]; + +#ifdef ASSISTED_TRAMMING_WAIT_POSITION + void move_to_tramming_wait_pos(); +#else + inline void move_to_tramming_wait_pos() {} +#endif diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 789d8bcf19..46f75f2590 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -40,27 +40,7 @@ // Define tramming point names. // -#include "../../feature/tramming.h" // Validate - -PGMSTR(point_name_1, TRAMMING_POINT_NAME_1); -PGMSTR(point_name_2, TRAMMING_POINT_NAME_2); -PGMSTR(point_name_3, TRAMMING_POINT_NAME_3); -#ifdef TRAMMING_POINT_NAME_4 - PGMSTR(point_name_4, TRAMMING_POINT_NAME_4); - #ifdef TRAMMING_POINT_NAME_5 - PGMSTR(point_name_5, TRAMMING_POINT_NAME_5); - #endif -#endif - -PGM_P const tramming_point_name[] PROGMEM = { - point_name_1, point_name_2, point_name_3 - #ifdef TRAMMING_POINT_NAME_4 - , point_name_4 - #ifdef TRAMMING_POINT_NAME_5 - , point_name_5 - #endif - #endif -}; +#include "../../feature/tramming.h" /** * G35: Read bed corners to help adjust bed screws @@ -178,11 +158,10 @@ void GcodeSuite::G35() { // the probe deployed if it was successful. probe.stow(); + move_to_tramming_wait_pos(); + // After this operation the Z position needs correction set_axis_never_homed(Z_AXIS); - - // Home Z after the alignment procedure - process_subcommands_now_P(PSTR("G28Z")); } #endif // ASSISTED_TRAMMING diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index de5960df4c..7ebb9168f6 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -541,6 +541,8 @@ #else #error "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW." #endif +#elif defined(ASSISTED_TRAMMING_MENU_ITEM) + #error "ASSISTED_TRAMMING_MENU_ITEM is deprecated and should be removed." #endif /** diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 627d8565ed..f849d20eca 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -365,8 +365,6 @@ void menu_motion() { // #if ENABLED(ASSISTED_TRAMMING_WIZARD) SUBMENU(MSG_TRAMMING_WIZARD, goto_tramming_wizard); - #elif ENABLED(ASSISTED_TRAMMING_MENU_ITEM) - GCODES_ITEM(MSG_ASSISTED_TRAMMING, PSTR("G35")); #endif // diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index e51cd0a318..a77709e108 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -42,24 +42,18 @@ float z_measured[G35_PROBE_COUNT] = { 0 }; static uint8_t tram_index = 0; -bool probe_single_point() { +static bool probe_single_point() { do_blocking_move_to_z(TERN(BLTOUCH, Z_CLEARANCE_DEPLOY_PROBE, Z_CLEARANCE_BETWEEN_PROBES)); // Stow after each point with BLTouch "HIGH SPEED" mode for push-pin safety const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[tram_index], TERN(BLTOUCH_HS_MODE, PROBE_PT_STOW, PROBE_PT_RAISE), 0, true); DEBUG_ECHOLNPAIR("probe_single_point: ", z_probed_height, "mm"); z_measured[tram_index] = z_probed_height; - - #ifdef ASSISTED_TRAMMING_WAIT_POSITION - // Move XY to safe position - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Moving away"); - const xyz_pos_t wait_pos = ASSISTED_TRAMMING_WAIT_POSITION; - do_blocking_move_to(wait_pos, XY_PROBE_FEEDRATE_MM_S); - #endif + move_to_tramming_wait_pos(); return !isnan(z_probed_height); } -void _menu_single_probe(const uint8_t point) { +static void _menu_single_probe(const uint8_t point) { tram_index = point; DEBUG_ECHOLNPAIR("Screen: single probe screen Arg:", point); START_MENU(); @@ -70,7 +64,7 @@ void _menu_single_probe(const uint8_t point) { END_MENU(); } -void tramming_wizard_menu() { +static void tramming_wizard_menu() { DEBUG_ECHOLNPAIR("Screen: tramming_wizard_menu"); START_MENU(); STATIC_ITEM(MSG_SELECT_ORIGIN); @@ -91,7 +85,6 @@ void goto_tramming_wizard() { DEBUG_ECHOLNPAIR("Screen: goto_tramming_wizard", 1); tram_index = 0; ui.defer_status_screen(); - //probe_single_point(); // Probe first point to get differences // Inject G28, wait for homing to complete, set_all_unhomed(); diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 009688ce21..d4c49a3185 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -14,7 +14,8 @@ opt_set TEMP_SENSOR_BED 2 opt_set GRID_MAX_POINTS_X 16 opt_set FANMUX0_PIN 53 opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING \ + ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD REPORT_TRAMMING_MM ASSISTED_TRAMMING_WAIT_POSITION \ EEPROM_SETTINGS SDSUPPORT BINARY_FILE_TRANSFER \ BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ diff --git a/platformio.ini b/platformio.ini index 3e87968eef..daeaee4021 100644 --- a/platformio.ini +++ b/platformio.ini @@ -106,6 +106,7 @@ default_src_filter = + - - + - - - - - - + - - - - @@ -323,7 +324,7 @@ MECHANICAL_GANTRY_CAL.+ = src_filter=+ Z_MULTI_ENDSTOPS = src_filter=+ Z_STEPPER_AUTO_ALIGN = src_filter=+ + G26_MESH_VALIDATION = src_filter=+ -ASSISTED_TRAMMING = src_filter=+ +ASSISTED_TRAMMING = src_filter=+ + HAS_MESH = src_filter=+ HAS_LEVELING = src_filter=+ DELTA_AUTO_CALIBRATION = src_filter=+ From 5d35e3ccf56e67240904125655cf9d07ab20cbd9 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 2 Jan 2021 21:51:35 +1300 Subject: [PATCH 0821/1370] Check for misplaced configs on build (#20599) Co-authored-by: Scott Lahteine --- .../share/PlatformIO/scripts/common-dependencies.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 56dc86e634..ff7b9f024b 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -300,6 +300,16 @@ def MarlinFeatureIsEnabled(env, feature): return some_on +# +# Check for Configfiles in two common incorrect places +# +def check_configfile_locations(): + for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = 'ERROR: Config files found in directory ' + str(p) + '. Please move them into the Marlin subdirectory.' + raise SystemExit(err) + # # Add a method for other PIO scripts to query enabled features # @@ -308,5 +318,6 @@ env.AddMethod(MarlinFeatureIsEnabled) # # Add dependencies for enabled Marlin features # +check_configfile_locations() apply_features_config() force_ignore_unused_libs() From a42755a061808199d8f0f8491605d1e0bf4d31fd Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sat, 2 Jan 2021 09:53:34 +0100 Subject: [PATCH 0822/1370] Fix a comment (#20629) --- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index 53dd5f4fc5..8d372309bd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -118,4 +118,4 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // BOTH(TOUCH_UI_FTDI_EVE,HAS_LEVELING) +#endif // TOUCH_UI_FTDI_EVE && HAS_LEVELING From eaeb9d1b2092cccf91c6434629fc25fbfab6fc61 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 30 Dec 2020 19:13:47 -0600 Subject: [PATCH 0823/1370] Document, adjust some homing code --- Marlin/src/feature/z_stepper_align.cpp | 4 +- Marlin/src/module/motion.cpp | 64 +++++++++++++++----------- Marlin/src/module/probe.cpp | 10 ++-- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/Marlin/src/feature/z_stepper_align.cpp b/Marlin/src/feature/z_stepper_align.cpp index 21fe54d0e6..1b4eb44749 100644 --- a/Marlin/src/feature/z_stepper_align.cpp +++ b/Marlin/src/feature/z_stepper_align.cpp @@ -58,7 +58,7 @@ void ZStepperAlign::reset_to_default() { "Z_STEPPER_ALIGN_XY point " STRINGIFY(N) " is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.") VALIDATE_ALIGN_POINT(0); VALIDATE_ALIGN_POINT(1); VALIDATE_ALIGN_POINT(2); VALIDATE_ALIGN_POINT(3); - #else // !defined(Z_STEPPER_ALIGN_XY) + #else // !Z_STEPPER_ALIGN_XY const xy_pos_t xy_init[] = { #if NUM_Z_STEPPER_DRIVERS >= 3 // First probe point... @@ -99,7 +99,7 @@ void ZStepperAlign::reset_to_default() { #endif }; - #endif // !defined(Z_STEPPER_ALIGN_XY) + #endif // !Z_STEPPER_ALIGN_XY COPY(xy, xy_init); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 9b6a0d913b..f2fdd7934d 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1293,23 +1293,17 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0) { DEBUG_SECTION(log_move, "do_homing_move", DEBUGGING(LEVELING)); - const feedRate_t real_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); + const feedRate_t home_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("...(", axis_codes[axis], ", ", distance, ", "); if (fr_mm_s) DEBUG_ECHO(fr_mm_s); else - DEBUG_ECHOPAIR("[", real_fr_mm_s, "]"); + DEBUG_ECHOPAIR("[", home_fr_mm_s, "]"); DEBUG_ECHOLNPGM(")"); } - #if ALL(HOMING_Z_WITH_PROBE, HAS_HEATED_BED, WAIT_FOR_BED_HEATER) - // Wait for bed to heat back up between probing points - if (axis == Z_AXIS && distance < 0) - thermalManager.wait_for_bed_heating(); - #endif - // Only do some things when moving towards an endstop const int8_t axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) ? x_home_dir(active_extruder) : home_dir(axis); @@ -1321,9 +1315,14 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t if (is_home_dir) { - #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING - if (axis == Z_AXIS) probe.set_probing_paused(true); - #endif + if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) { + #if ALL(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) + // Wait for bed to heat back up between probing points + thermalManager.wait_for_bed_heating(); + #endif + + TERN_(HAS_QUIET_PROBING, probe.set_probing_paused(true)); + } // Disable stealthChop if used. Enable diag1 pin on driver. TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); @@ -1334,7 +1333,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t current_position[axis] = 0; sync_plan_position(); current_position[axis] = distance; - line_to_current_position(real_fr_mm_s); + line_to_current_position(home_fr_mm_s); #else // Get the ABC or XYZ positions in mm abce_pos_t target = planner.get_axis_positions_mm(); @@ -1352,7 +1351,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t #if HAS_DIST_MM_ARG , cart_dist_mm #endif - , real_fr_mm_s, active_extruder + , home_fr_mm_s, active_extruder ); #endif @@ -1571,7 +1570,9 @@ void homeaxis(const AxisEnum axis) { const int axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) ? x_home_dir(active_extruder) : home_dir(axis); - // Homing Z towards the bed? Deploy the Z probe or endstop. + // + // Homing Z with a probe? Raise Z (maybe) and deploy the Z probe. + // if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && probe.deploy())) return; @@ -1586,23 +1587,34 @@ void homeaxis(const AxisEnum axis) { } #endif - // Fast move towards endstop until triggered - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Home 1 Fast:"); - + // + // Deploy BLTouch or tare the probe just before probing + // #if HOMING_Z_WITH_PROBE if (axis == Z_AXIS) { - if (TERN0(BLTOUCH, bltouch.deploy())) return; + if (TERN0(BLTOUCH, bltouch.deploy())) return; // BLTouch was deployed above, but get the alarm state. if (TERN0(PROBE_TARE, probe.tare())) return; } #endif + // + // Back away to prevent an early X/Y sensorless trigger + // #if DISABLED(DELTA) && defined(SENSORLESS_BACKOFF_MM) const xy_float_t backoff = SENSORLESS_BACKOFF_MM; - if (((ENABLED(X_SENSORLESS) && axis == X_AXIS) || (ENABLED(Y_SENSORLESS) && axis == Y_AXIS)) && backoff[axis]) - do_homing_move(axis, -ABS(backoff[axis]) * axis_home_dir, homing_feedrate(axis)); + if ((TERN0(X_SENSORLESS, axis == X_AXIS) || TERN0(Y_SENSORLESS, axis == Y_AXIS)) && backoff[axis]) { + const float backoff_length = -ABS(backoff[axis]) * axis_home_dir; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Sensorless backoff: ", backoff_length, "mm"); + do_homing_move(axis, backoff_length, homing_feedrate(axis)); + } #endif - do_homing_move(axis, 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir); + // + // Fast move towards endstop until triggered + // + const float move_length = 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Home Fast: ", move_length, "mm"); + do_homing_move(axis, move_length); #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) @@ -1617,7 +1629,7 @@ void homeaxis(const AxisEnum axis) { // If a second homing move is configured... if (bump) { // Move away from the endstop by the axis HOMING_BUMP_MM - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Move Away:"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); do_homing_move(axis, -bump #if HOMING_Z_WITH_PROBE , MMM_TO_MMS(axis == Z_AXIS ? Z_PROBE_SPEED_FAST : 0) @@ -1639,14 +1651,14 @@ void homeaxis(const AxisEnum axis) { } #endif - // Slow move towards endstop until triggered - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Home 2 Slow:"); - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) if (axis == Z_AXIS && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) #endif - do_homing_move(axis, 2 * bump, get_homing_bump_feedrate(axis)); + // Slow move towards endstop until triggered + const float rebump = bump * 2; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Re-bump: ", rebump, "mm"); + do_homing_move(axis, rebump, get_homing_bump_feedrate(axis)); #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) if (axis == Z_AXIS) bltouch.stow(); // The final STOW diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 53c35d69f2..cc5c5e8815 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -373,19 +373,19 @@ bool Probe::set_deployed(const bool deploy) { // Fix-mounted probe should only raise for deploy // unless PAUSE_BEFORE_DEPLOY_STOW is enabled #if EITHER(FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE) && DISABLED(PAUSE_BEFORE_DEPLOY_STOW) - const bool deploy_stow_condition = deploy; + const bool z_raise_wanted = deploy; #else - constexpr bool deploy_stow_condition = true; + constexpr bool z_raise_wanted = true; #endif // For beds that fall when Z is powered off only raise for trusted Z #if ENABLED(UNKNOWN_Z_NO_RAISE) - const bool unknown_condition = axis_is_trusted(Z_AXIS); + const bool z_is_trusted = axis_is_trusted(Z_AXIS); #else - constexpr float unknown_condition = true; + constexpr float z_is_trusted = true; #endif - if (deploy_stow_condition && unknown_condition) + if (z_is_trusted && z_raise_wanted) do_z_raise(_MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) From f4f152bd0179e041447a9d7bafb1fed410986426 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 2 Jan 2021 15:51:51 -0600 Subject: [PATCH 0824/1370] Improved bootscreen animation --- Marlin/src/lcd/dogm/dogm_Bootscreen.h | 15 +++++++++++ Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 37 +++++++++++++++------------ 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/Marlin/src/lcd/dogm/dogm_Bootscreen.h b/Marlin/src/lcd/dogm/dogm_Bootscreen.h index c9001119d9..0b8845ed79 100644 --- a/Marlin/src/lcd/dogm/dogm_Bootscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Bootscreen.h @@ -32,8 +32,16 @@ #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + typedef struct { + const unsigned char *bitmap; + const unsigned short duration; + } boot_frame_t; + #include "../../../_Bootscreen.h" + #ifndef CUSTOM_BOOTSCREEN_BMPWIDTH + #define CUSTOM_BOOTSCREEN_BMPWIDTH 128 + #endif #ifndef CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH #define CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH CEILING(CUSTOM_BOOTSCREEN_BMPWIDTH, 8) #endif @@ -41,6 +49,13 @@ #define CUSTOM_BOOTSCREEN_BMPHEIGHT (sizeof(custom_start_bmp) / (CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH)) #endif + #ifndef CUSTOM_BOOTSCREEN_Y + #if ENABLED(CUSTOM_BOOTSCREEN_BOTTOM_JUSTIFY) + #define CUSTOM_BOOTSCREEN_Y (LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) + #else + #define CUSTOM_BOOTSCREEN_Y ((LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) / 2) + #endif + #endif #endif #if ENABLED(BOOT_MARLIN_LOGO_SMALL) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 54735175b4..87899a96be 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -110,19 +110,21 @@ bool MarlinUI::detected() { return true; } // Draws a slice of a particular frame of the custom bootscreen, without the u8g loop void MarlinUI::draw_custom_bootscreen(const uint8_t frame/*=0*/) { constexpr u8g_uint_t left = u8g_uint_t((LCD_PIXEL_WIDTH - (CUSTOM_BOOTSCREEN_BMPWIDTH)) / 2), - top = u8g_uint_t((LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) / 2); + top = u8g_uint_t(CUSTOM_BOOTSCREEN_Y); #if ENABLED(CUSTOM_BOOTSCREEN_INVERTED) constexpr u8g_uint_t right = left + CUSTOM_BOOTSCREEN_BMPWIDTH, bottom = top + CUSTOM_BOOTSCREEN_BMPHEIGHT; #endif - const u8g_pgm_uint8_t * const bmp = - #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED) - (u8g_pgm_uint8_t*)pgm_read_ptr(&custom_bootscreen_animation[frame]) - #else - custom_start_bmp - #endif - ; + const void * const frame_ptr = pgm_read_ptr(&custom_bootscreen_animation[frame]); + + #if BOTH(CUSTOM_BOOTSCREEN_ANIMATED, CUSTOM_BOOTSCREEN_TIME_PER_FRAME) + const boot_frame_t * const frame_info = (boot_frame_t*)frame_ptr; + const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)pgm_read_ptr(&frame_info->bitmap); + #else + const u8g_pgm_uint8_t * const bmp = TERN(CUSTOM_BOOTSCREEN_ANIMATED, (u8g_pgm_uint8_t*)frame_ptr, custom_start_bmp); + #endif + UNUSED(frame); u8g.drawBitmapP(left, top, CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH, CUSTOM_BOOTSCREEN_BMPHEIGHT, bmp); @@ -141,22 +143,23 @@ bool MarlinUI::detected() { return true; } // Shows the custom bootscreen, with the u8g loop, animations and delays void MarlinUI::show_custom_bootscreen() { #if DISABLED(CUSTOM_BOOTSCREEN_ANIMATED) - constexpr millis_t d = 0; + constexpr millis_t frame_time = 0; constexpr uint8_t f = 0; #else - #if DISABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) - constexpr millis_t d = CUSTOM_BOOTSCREEN_FRAME_TIME; + #if DISABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME) + constexpr millis_t frame_time = CUSTOM_BOOTSCREEN_FRAME_TIME; #endif LOOP_L_N(f, COUNT(custom_bootscreen_animation)) #endif { - #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) - const uint8_t fr = _MIN(f, COUNT(custom_bootscreen_frame_time) - 1); - const millis_t d = custom_bootscreen_frame_time[fr]; + #if ENABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME) + const uint8_t fr = _MIN(f, COUNT(custom_bootscreen_animation) - 1); + const boot_frame_t * const frame_info = (boot_frame_t*)pgm_read_ptr(&custom_bootscreen_animation[fr]); + const millis_t frame_time = pgm_read_word(&frame_info->duration); #endif u8g.firstPage(); do { draw_custom_bootscreen(f); } while (u8g.nextPage()); - if (d) safe_delay(d); + if (frame_time) safe_delay(frame_time); } #ifndef CUSTOM_BOOTSCREEN_TIMEOUT @@ -218,10 +221,10 @@ bool MarlinUI::detected() { return true; } #if DISABLED(BOOT_MARLIN_LOGO_ANIMATED) draw_bootscreen_bmp(start_bmp); #else - constexpr millis_t d = MARLIN_BOOTSCREEN_FRAME_TIME; + constexpr millis_t frame_time = MARLIN_BOOTSCREEN_FRAME_TIME; LOOP_L_N(f, COUNT(marlin_bootscreen_animation)) { draw_bootscreen_bmp((uint8_t*)pgm_read_ptr(&marlin_bootscreen_animation[f])); - if (d) safe_delay(d); + if (frame_time) safe_delay(frame_time); } #endif } From 66c69aef6a471b1f165e2fdfa62c09c2593f71e6 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 3 Jan 2021 13:37:47 +1300 Subject: [PATCH 0825/1370] Homing code followup (#20632) Patching a87e5197cfb2f302c3eea9271b4c25c49df3ab6b --- Marlin/src/module/motion.cpp | 2 +- buildroot/share/PlatformIO/scripts/common-dependencies.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index f2fdd7934d..ace583b6c0 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1657,7 +1657,7 @@ void homeaxis(const AxisEnum axis) { // Slow move towards endstop until triggered const float rebump = bump * 2; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Re-bump: ", rebump, "mm"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Re-bump: ", rebump, "mm"); do_homing_move(axis, rebump, get_homing_bump_feedrate(axis)); #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index ff7b9f024b..24a2eadf9a 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -318,6 +318,6 @@ env.AddMethod(MarlinFeatureIsEnabled) # # Add dependencies for enabled Marlin features # -check_configfile_locations() +check_configfile_locations() apply_features_config() force_ignore_unused_libs() From 385152b3d2983c980cab571b7a7da04c09255430 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 2 Jan 2021 18:40:52 -0600 Subject: [PATCH 0826/1370] Animated boot followup --- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 87899a96be..c326b89aa8 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -116,13 +116,16 @@ bool MarlinUI::detected() { return true; } bottom = top + CUSTOM_BOOTSCREEN_BMPHEIGHT; #endif - const void * const frame_ptr = pgm_read_ptr(&custom_bootscreen_animation[frame]); - - #if BOTH(CUSTOM_BOOTSCREEN_ANIMATED, CUSTOM_BOOTSCREEN_TIME_PER_FRAME) - const boot_frame_t * const frame_info = (boot_frame_t*)frame_ptr; - const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)pgm_read_ptr(&frame_info->bitmap); + #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED) + const void * const frame_ptr = pgm_read_ptr(&custom_bootscreen_animation[frame]); + #if ENABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME) + const boot_frame_t * const frame_info = (boot_frame_t*)frame_ptr; + const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)pgm_read_ptr(&frame_info->bitmap); + #else + const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)frame_ptr; + #endif #else - const u8g_pgm_uint8_t * const bmp = TERN(CUSTOM_BOOTSCREEN_ANIMATED, (u8g_pgm_uint8_t*)frame_ptr, custom_start_bmp); + const u8g_pgm_uint8_t * const bmp = custom_start_bmp; #endif UNUSED(frame); From 3f8a83b2857e1f73217eac4d0e5aee04b9ce70b6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 2 Jan 2021 19:01:09 -0600 Subject: [PATCH 0827/1370] Add ALL_AXES manual move for UBL mesh editing Co-Authored-By: Jason Smith <20053467+sjasonsmith@users.noreply.github.com> #20620 --- Marlin/src/lcd/marlinui.cpp | 15 +++++++++++---- Marlin/src/lcd/marlinui.h | 15 +++++++++++++++ Marlin/src/lcd/menu/menu_ubl.cpp | 7 +++---- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 3c2f930e68..e59b72f47d 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -684,8 +684,11 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { millis_t ManualMove::start_time = 0; float ManualMove::menu_scale = 1; - TERN_(IS_KINEMATIC, float ManualMove::offset = 0); - TERN_(IS_KINEMATIC, bool ManualMove::processing = false); + #if IS_KINEMATIC + float ManualMove::offset = 0; + xyze_pos_t ManualMove::all_axes_destination = { 0 }; + bool ManualMove::processing = false; + #endif TERN_(MULTI_MANUAL, int8_t ManualMove::e_index = 0); AxisEnum ManualMove::axis = NO_AXIS; @@ -725,8 +728,12 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { #endif // Apply a linear offset to a single axis - destination = current_position; - if (axis <= XYZE) destination[axis] += offset; + if (axis == ALL_AXES) + destination = all_axes_destination; + else if (axis <= XYZE) { + destination = current_position; + destination[axis] += offset; + } // Reset for the next move offset = 0; diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index d7285927a3..a926dd58f4 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -23,6 +23,8 @@ #include "../inc/MarlinConfig.h" +#include "../module/motion.h" + #if HAS_BUZZER #include "../libs/buzzer.h" #endif @@ -270,9 +272,22 @@ static int8_t constexpr e_index = 0; #endif static millis_t start_time; + TERN_(IS_KINEMATIC, static xyze_pos_t all_axes_destination); public: static float menu_scale; TERN_(IS_KINEMATIC, static float offset); + template + void set_destination(const T& dest) { + #if IS_KINEMATIC + // Moves are segmented, so the entire move is not submitted at once. + // Using a separate variable prevents corrupting the in-progress move. + all_axes_destination = current_position; + all_axes_destination.set(dest); + #else + // Moves are submitted as single line to the planner using buffer_line. + current_position.set(dest); + #endif + } #if IS_KINEMATIC static bool processing; #else diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 9b78416717..52b7b1ccb0 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -426,10 +426,9 @@ void ubl_map_move_to_xy() { } #endif - // Do an internal move to the mesh point - destination.set(ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot)); - constexpr feedRate_t fr_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); - prepare_internal_move_to_destination(fr_mm_s); // Set current_position from destination + // Use the built-in manual move handler to move to the mesh point. + ui.manual_move.set_destination(xy); + ui.manual_move.soon(ALL_AXES); } inline int32_t grid_index(const uint8_t x, const uint8_t y) { From d5465f1ad8d5ac75bced9ecc9be277f15e521c21 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 3 Jan 2021 07:16:50 -0600 Subject: [PATCH 0828/1370] Creality 4.2.10 board (#20647) --- Marlin/src/core/boards.h | 15 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h | 208 ++++++++++++++++++ 3 files changed, 218 insertions(+), 7 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 3057f12b7f..13a202daed 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -330,13 +330,14 @@ #define BOARD_CHITU3D_V6 4037 // Chitu3D TronXY X5SA V5 Board #define BOARD_CREALITY_V4 4038 // Creality v4.x (STM32F103RE) #define BOARD_CREALITY_V427 4039 // Creality v4.2.7 (STM32F103RE) -#define BOARD_CREALITY_V431 4040 // Creality v4.3.1 (STM32F103RE) -#define BOARD_CREALITY_V452 4041 // Creality v4.5.2 (STM32F103RE) -#define BOARD_CREALITY_V453 4042 // Creality v4.5.3 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4043 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4044 // FLY MINI (STM32F103RCT6) -#define BOARD_FLSUN_HISPEED 4045 // FLSUN HiSpeedV1 (STM32F103VET6) -#define BOARD_BEAST 4046 // STM32F103RET6 Libmaple-based controller +#define BOARD_CREALITY_V4210 4040 // Creality v4.2.10 (STM32F103RE) as found in the CR-30 +#define BOARD_CREALITY_V431 4041 // Creality v4.3.1 (STM32F103RE) +#define BOARD_CREALITY_V452 4042 // Creality v4.5.2 (STM32F103RE) +#define BOARD_CREALITY_V453 4043 // Creality v4.5.3 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4044 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4045 // FLY MINI (STM32F103RCT6) +#define BOARD_FLSUN_HISPEED 4046 // FLSUN HiSpeedV1 (STM32F103VET6) +#define BOARD_BEAST 4047 // STM32F103RET6 Libmaple-based controller // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 56508b9a21..c0995e8826 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -530,6 +530,8 @@ #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 #elif MB(CREALITY_V4) #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality +#elif MB(CREALITY_V4210) + #include "stm32f1/pins_CREALITY_V4210.h" // STM32F1 env:STM32F103RET6_creality #elif MB(CREALITY_V427) #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality #elif MB(CREALITY_V431) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h new file mode 100644 index 0000000000..025e68d4da --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h @@ -0,0 +1,208 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * CREALITY 4.2.10 (STM32F103) board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Creality V4.2.10" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "3DPrintMill" +#endif + +#define BOARD_NO_NATIVE_USB + +// +// EEPROM +// +#if NO_EEPROM_SELECTED + // FLASH + //#define FLASH_EEPROM_EMULATION + + // I2C + #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 used only for display settings + #if ENABLED(IIC_BL24CXX_EEPROM) + #define IIC_EEPROM_SDA PA11 + #define IIC_EEPROM_SCL PA12 + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) + #else + #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb + #endif + + // SPI + //#define SPI_EEPROM // EEPROM on SPI-0 + //#define SPI_CHAN_EEPROM1 ? + //#define SPI_EEPROM1_CS ? + + // 2K EEPROM + //#define SPI_EEPROM2_CS ? + + // 32Mb FLASH + //#define SPI_FLASH_CS ? +#endif + +// +// Servos +// +#define SERVO0_PIN PB0 // BLTouch OUT + +// +// Limit Switches +// +#define X_STOP_PIN PA3 +#define Y_STOP_PIN PA7 +#define Z_STOP_PIN PA5 + +#define Z_MIN_PROBE_PIN PA5 // BLTouch IN + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA6 // "Pulled-high" +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PC3 +#ifndef X_STEP_PIN + #define X_STEP_PIN PC2 +#endif +#ifndef X_DIR_PIN + #define X_DIR_PIN PB9 +#endif + +#define Y_ENABLE_PIN PC3 +#ifndef Y_STEP_PIN + #define Y_STEP_PIN PB8 +#endif +#ifndef Y_DIR_PIN + #define Y_DIR_PIN PB7 +#endif + +#define Z_ENABLE_PIN PC3 +#ifndef Z_STEP_PIN + #define Z_STEP_PIN PB6 +#endif +#ifndef Z_DIR_PIN + #define Z_DIR_PIN PB5 +#endif + +#define E0_ENABLE_PIN PC3 +#ifndef E0_STEP_PIN + #define E0_STEP_PIN PB4 +#endif +#ifndef E0_DIR_PIN + #define E0_DIR_PIN PB3 +#endif + +// +// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role +// +#define DISABLE_DEBUG + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC5 // TH1 +#define TEMP_BED_PIN PC4 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA0 // HEATER1 +#define HEATER_BED_PIN PA1 // HOT BED + +#define FAN_PIN PA2 // FAN +#define FAN_SOFT_PWM + +// +// SD Card +// +#define SD_DETECT_PIN PC7 +#define SDCARD_CONNECTION ONBOARD +#define ONBOARD_SPI_DEVICE 1 +#define ONBOARD_SD_CS_PIN PA4 // SDSS +#define SDIO_SUPPORT +#define NO_SD_HOST_DRIVE // This board's SD is only seen by the printer + +#if ENABLED(CR10_STOCKDISPLAY) && NONE(RET6_12864_LCD, VET6_12864_LCD) + #error "Define RET6_12864_LCD or VET6_12864_LCD to select pins for CR10_STOCKDISPLAY with the Creality V4 controller." +#endif + +#if ENABLED(RET6_12864_LCD) + + // RET6 12864 LCD + #define LCD_PINS_RS PB12 + #define LCD_PINS_ENABLE PB15 + #define LCD_PINS_D4 PB13 + + #define BTN_ENC PB2 + #define BTN_EN1 PB10 + #define BTN_EN2 PB14 + + #define BEEPER_PIN PC6 + +#elif ENABLED(VET6_12864_LCD) + + // VET6 12864 LCD + #define LCD_PINS_RS PA4 + #define LCD_PINS_ENABLE PA7 + #define LCD_PINS_D4 PA5 + + #define BTN_ENC PC5 + #define BTN_EN1 PB10 + #define BTN_EN2 PA6 + +#elif ENABLED(DWIN_CREALITY_LCD) + + // RET6 DWIN ENCODER LCD + #define BTN_ENC PB14 + #define BTN_EN1 PB15 + #define BTN_EN2 PB12 + + //#define LCD_LED_PIN PB2 + #ifndef BEEPER_PIN + #define BEEPER_PIN PB13 + #undef SPEAKER + #endif + +#elif ENABLED(DWIN_VET6_CREALITY_LCD) + + // VET6 DWIN ENCODER LCD + #define BTN_ENC PA6 + #define BTN_EN1 PA7 + #define BTN_EN2 PA4 + + #define BEEPER_PIN PA5 + +#endif From c6c5cc7246b87abb36aa1008aab9a6fc2ebc29eb Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 4 Jan 2021 00:43:31 +0100 Subject: [PATCH 0829/1370] Update Italian language (#20663) --- Marlin/src/lcd/language/language_it.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 7437ae4479..b775a23fb0 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -105,12 +105,17 @@ namespace Language_it { #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Prerisc.personal."); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Raffredda"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequenza"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Controllo laser"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potenza laser"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Controllo mandrino"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potenza laser"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potenza mandrino"); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Alterna Laser"); + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Alterna mandrino"); + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Mandrino in avanti"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Accendi aliment."); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment."); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Estrudi"); @@ -383,6 +388,7 @@ namespace Language_it { PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Riprendi stampa"); PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Host Avvio"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Arresta stampa"); + PROGMEM Language_Str MSG_END_LOOPS = _UxGT("Fine cicli di rip."); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Stampa Oggetto"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancella Oggetto"); PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Canc. Oggetto ="); From d3d8fd6d9b05fe10602faead46c3f26088e76df2 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sun, 3 Jan 2021 20:39:15 -0700 Subject: [PATCH 0830/1370] Fix thermal error protection, reporting (#20655) --- .../ftdi_eve_lib/extended/sound_player.cpp | 4 +-- Marlin/src/module/temperature.cpp | 28 ++++++++++++------- Marlin/src/module/temperature.h | 4 +-- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp index f9869320ba..07d1ff5624 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp @@ -75,9 +75,7 @@ namespace FTDI { while (has_more_notes()) { onIdle(); - #ifdef EXTENSIBLE_UI - ExtUI::yield(); - #endif + TERN_(TOUCH_UI_FTDI_EVE, ExtUI::yield()); } } diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 6f02f3b900..327f43dc03 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -793,9 +793,16 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { inline void loud_kill(PGM_P const lcd_msg, const heater_id_t heater_id) { marlin_state = MF_KILLED; #if USE_BEEPER + thermalManager.disable_all_heaters(); for (uint8_t i = 20; i--;) { - WRITE(BEEPER_PIN, HIGH); delay(25); - WRITE(BEEPER_PIN, LOW); delay(80); + WRITE(BEEPER_PIN, HIGH); + delay(25); + watchdog_refresh(); + WRITE(BEEPER_PIN, LOW); + delay(40); + watchdog_refresh(); + delay(40); + watchdog_refresh(); } WRITE(BEEPER_PIN, HIGH); #endif @@ -820,6 +827,7 @@ void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_ms } disable_all_heaters(); // always disable (even for bogus temp) + watchdog_refresh(); #if BOGUS_TEMPERATURE_GRACE_PERIOD const millis_t ms = millis(); @@ -923,8 +931,8 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { } #endif // PID_EXTRUSION_SCALING #if ENABLED(PID_FAN_SCALING) - if (thermalManager.fan_speed[active_extruder] > PID_FAN_SCALING_MIN_SPEED) { - work_pid[ee].Kf = PID_PARAM(Kf, ee) + (PID_FAN_SCALING_LIN_FACTOR) * thermalManager.fan_speed[active_extruder]; + if (fan_speed[active_extruder] > PID_FAN_SCALING_MIN_SPEED) { + work_pid[ee].Kf = PID_PARAM(Kf, ee) + (PID_FAN_SCALING_LIN_FACTOR) * fan_speed[active_extruder]; pid_output += work_pid[ee].Kf; } //pid_output -= work_pid[ee].Ki; @@ -1243,7 +1251,7 @@ void Temperature::manage_heater() { fan_chamber_pwm += (CHAMBER_FAN_FACTOR) * 2; #endif NOMORE(fan_chamber_pwm, 225); - thermalManager.set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan + set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan #endif #if ENABLED(CHAMBER_VENT) @@ -1274,7 +1282,7 @@ void Temperature::manage_heater() { else if (!flag_chamber_off) { #if ENABLED(CHAMBER_FAN) flag_chamber_off = true; - thermalManager.set_fan_speed(2, 0); + set_fan_speed(2, 0); #endif #if ENABLED(CHAMBER_VENT) flag_chamber_excess_heat = false; @@ -1355,7 +1363,7 @@ void Temperature::manage_heater() { user_thermistor_t Temperature::user_thermistor[USER_THERMISTORS]; // Initialized by settings.load() void Temperature::reset_user_thermistors() { - user_thermistor_t user_thermistor[USER_THERMISTORS] = { + user_thermistor_t default_user_thermistor[USER_THERMISTORS] = { #if HEATER_0_USER_THERMISTOR { true, 0, 0, HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS, 0, 0, HOTEND0_BETA, 0 }, #endif @@ -1387,7 +1395,7 @@ void Temperature::manage_heater() { { true, 0, 0, CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS, 0, 0, CHAMBER_BETA, 0 } #endif }; - COPY(thermalManager.user_thermistor, user_thermistor); + COPY(user_thermistor, default_user_thermistor); } void Temperature::log_user_thermistor(const uint8_t t_index, const bool eprom/*=false*/) { @@ -2423,7 +2431,7 @@ void Temperature::readings_ready() { #endif // HAS_HOTEND - #if HAS_HEATED_BED + #if ENABLED(THERMAL_PROTECTION_BED) #if TEMPDIR(BED) < 0 #define BEDCMP(A,B) ((A)<(B)) #else @@ -2434,7 +2442,7 @@ void Temperature::readings_ready() { if (bed_on && BEDCMP(mintemp_raw_BED, temp_bed.raw)) min_temp_error(H_BED); #endif - #if HAS_HEATED_CHAMBER + #if BOTH(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER) #if TEMPDIR(CHAMBER) < 0 #define CHAMBERCMP(A,B) ((A)<(B)) #else diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 33f38c3036..aa4f2e7634 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -696,7 +696,7 @@ class Temperature { static bool wait_for_chamber(const bool no_wait_for_cooling=true); #endif - #endif // HAS_TEMP_CHAMBER + #endif #if WATCH_CHAMBER static void start_watching_chamber(); @@ -715,7 +715,7 @@ class Temperature { ; start_watching_chamber(); } - #endif // HAS_HEATED_CHAMBER + #endif /** * The software PWM power for a heater From 90c04ee15d3ba3e686e33dafaa95c1e1f91f7870 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 3 Jan 2021 21:45:31 -0600 Subject: [PATCH 0831/1370] Rename FTDI EVE screen data structs --- .../screens/alert_dialog_box.cpp | 6 +- .../base_numeric_adjustment_screen.cpp | 12 ++-- .../screens/bed_mesh_screen.cpp | 42 ++++++------- .../screens/change_filament_screen.cpp | 52 ++++++++-------- .../screens/cocoa_press_move_e_screen.cpp | 10 ++-- .../screens/cocoa_press_preheat_menu.cpp | 2 +- .../screens/cocoa_press_preheat_screen.cpp | 6 +- .../confirm_start_print_dialog_box.cpp | 4 +- .../confirm_user_request_alert_box.cpp | 3 +- .../screens/files_screen.cpp | 60 +++++++++---------- .../screens/interface_settings_screen.cpp | 16 ++--- .../screens/interface_sounds_screen.cpp | 8 +-- .../ftdi_eve_touch_ui/screens/lock_screen.cpp | 20 +++---- .../screens/move_axis_screen.cpp | 28 ++++----- .../screens/nudge_nozzle_screen.cpp | 36 +++++------ .../ftdi_eve_touch_ui/screens/screen_data.h | 26 ++++---- .../screens/spinner_dialog_box.cpp | 8 +-- .../screens/stress_test_screen.cpp | 14 ++--- 18 files changed, 177 insertions(+), 176 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp index 89d9f05330..d63119afe5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp @@ -32,7 +32,7 @@ using namespace Theme; void AlertDialogBox::onEntry() { BaseScreen::onEntry(); - sound.play(screen_data.AlertDialogBox.isError ? sad_trombone : twinkle, PLAY_ASYNCHRONOUS); + sound.play(screen_data.AlertDialog.isError ? sad_trombone : twinkle, PLAY_ASYNCHRONOUS); } void AlertDialogBox::onRedraw(draw_mode_t what) { @@ -45,7 +45,7 @@ template void AlertDialogBox::show(const T message) { drawMessage(message); storeBackground(); - screen_data.AlertDialogBox.isError = false; + screen_data.AlertDialog.isError = false; GOTO_SCREEN(AlertDialogBox); } @@ -53,7 +53,7 @@ template void AlertDialogBox::showError(const T message) { drawMessage(message); storeBackground(); - screen_data.AlertDialogBox.isError = true; + screen_data.AlertDialog.isError = true; GOTO_SCREEN(AlertDialogBox); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp index 2d11f6948f..5271df3022 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp @@ -116,8 +116,8 @@ void BaseNumericAdjustmentScreen::widgets_t::_button(CommandProcessor &cmd, uint BaseNumericAdjustmentScreen::widgets_t &BaseNumericAdjustmentScreen::widgets_t::precision(uint8_t decimals, precision_default_t initial) { _decimals = decimals; - if (screen_data.BaseNumericAdjustmentScreen.increment == 0) { - screen_data.BaseNumericAdjustmentScreen.increment = 243 + (initial - DEFAULT_LOWEST) - _decimals; + if (screen_data.BaseNumericAdjustment.increment == 0) { + screen_data.BaseNumericAdjustment.increment = 243 + (initial - DEFAULT_LOWEST) - _decimals; } return *this; } @@ -154,7 +154,7 @@ void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) { void BaseNumericAdjustmentScreen::widgets_t::_draw_increment_btn(CommandProcessor &cmd, uint8_t, const uint8_t tag) { const char *label = PSTR("?"); uint8_t pos; - uint8_t & increment = screen_data.BaseNumericAdjustmentScreen.increment; + uint8_t & increment = screen_data.BaseNumericAdjustment.increment; if (increment == 0) { increment = tag; // Set the default value to be the first. @@ -358,7 +358,7 @@ void BaseNumericAdjustmentScreen::widgets_t::home_buttons(uint8_t tag) { } void BaseNumericAdjustmentScreen::onEntry() { - screen_data.BaseNumericAdjustmentScreen.increment = 0; // This will force the increment to be picked while drawing. + screen_data.BaseNumericAdjustment.increment = 0; // This will force the increment to be picked while drawing. BaseScreen::onEntry(); CommandProcessor cmd; cmd.set_button_style_callback(nullptr); @@ -367,14 +367,14 @@ void BaseNumericAdjustmentScreen::onEntry() { bool BaseNumericAdjustmentScreen::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); return true; - case 240 ... 245: screen_data.BaseNumericAdjustmentScreen.increment = tag; break; + case 240 ... 245: screen_data.BaseNumericAdjustment.increment = tag; break; default: return current_screen.onTouchHeld(tag); } return true; } float BaseNumericAdjustmentScreen::getIncrement() { - switch (screen_data.BaseNumericAdjustmentScreen.increment) { + switch (screen_data.BaseNumericAdjustment.increment) { case 240: return 0.001; case 241: return 0.01; case 242: return 0.1; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 2ed602a809..9ac8c61efb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -196,7 +196,7 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: } if (opts & USE_HIGHLIGHT) { - const uint8_t tag = screen_data.BedMeshScreen.highlightedTag; + const uint8_t tag = screen_data.BedMesh.highlightedTag; uint8_t x, y; if (tagToPoint(tag, x, y)) { cmd.cmd(COLOR_A(128)) @@ -221,16 +221,16 @@ bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) { } void BedMeshScreen::onEntry() { - screen_data.BedMeshScreen.highlightedTag = 0; - screen_data.BedMeshScreen.count = GRID_MAX_POINTS; - screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; + screen_data.BedMesh.highlightedTag = 0; + screen_data.BedMesh.count = GRID_MAX_POINTS; + screen_data.BedMesh.message = screen_data.BedMesh.MSG_NONE; BaseScreen::onEntry(); } float BedMeshScreen::getHightlightedValue() { - if (screen_data.BedMeshScreen.highlightedTag) { + if (screen_data.BedMesh.highlightedTag) { xy_uint8_t pt; - tagToPoint(screen_data.BedMeshScreen.highlightedTag, pt.x, pt.y); + tagToPoint(screen_data.BedMesh.highlightedTag, pt.x, pt.y); return ExtUI::getMeshPoint(pt); } return NAN; @@ -253,9 +253,9 @@ void BedMeshScreen::drawHighlightedPointValue() { .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); - switch (screen_data.BedMeshScreen.message) { - case screen_data.BedMeshScreen.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; - case screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; + switch (screen_data.BedMesh.message) { + case screen_data.BedMesh.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; + case screen_data.BedMesh.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; default: break; } } @@ -277,11 +277,11 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { if (what & FOREGROUND) { constexpr float autoscale_max_amplitude = 0.03; - const bool gotAllPoints = screen_data.BedMeshScreen.count >= GRID_MAX_POINTS; + const bool gotAllPoints = screen_data.BedMesh.count >= GRID_MAX_POINTS; if (gotAllPoints) { drawHighlightedPointValue(); } - const float levelingProgress = sq(float(screen_data.BedMeshScreen.count) / GRID_MAX_POINTS); + const float levelingProgress = sq(float(screen_data.BedMesh.count) / GRID_MAX_POINTS); BedMeshScreen::drawMesh(INSET_POS(MESH_POS), ExtUI::getMeshArray(), USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (gotAllPoints ? USE_COLORS : 0), autoscale_max_amplitude * levelingProgress @@ -290,7 +290,7 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { } bool BedMeshScreen::onTouchStart(uint8_t tag) { - screen_data.BedMeshScreen.highlightedTag = tag; + screen_data.BedMesh.highlightedTag = tag; return true; } @@ -323,21 +323,21 @@ bool BedMeshScreen::isMeshComplete(ExtUI::bed_mesh_t data) { void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { switch (state) { case ExtUI::MESH_START: - screen_data.BedMeshScreen.count = 0; - screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; + screen_data.BedMesh.count = 0; + screen_data.BedMesh.message = screen_data.BedMesh.MSG_NONE; break; case ExtUI::MESH_FINISH: - if (screen_data.BedMeshScreen.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) - screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_COMPLETE; + if (screen_data.BedMesh.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) + screen_data.BedMesh.message = screen_data.BedMesh.MSG_MESH_COMPLETE; else - screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE; - screen_data.BedMeshScreen.count = GRID_MAX_POINTS; + screen_data.BedMesh.message = screen_data.BedMesh.MSG_MESH_INCOMPLETE; + screen_data.BedMesh.count = GRID_MAX_POINTS; break; case ExtUI::PROBE_START: - screen_data.BedMeshScreen.highlightedTag = pointToTag(x, y); + screen_data.BedMesh.highlightedTag = pointToTag(x, y); break; case ExtUI::PROBE_FINISH: - screen_data.BedMeshScreen.count++; + screen_data.BedMesh.count++; break; } BedMeshScreen::onMeshUpdate(x, y, 0); @@ -345,7 +345,7 @@ void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::pr void BedMeshScreen::startMeshProbe() { GOTO_SCREEN(BedMeshScreen); - screen_data.BedMeshScreen.count = 0; + screen_data.BedMesh.count = 0; injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index 3cb7942446..624bb263eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -122,17 +122,17 @@ void ChangeFilamentScreen::drawTempGradient(uint16_t x, uint16_t y, uint16_t w, void ChangeFilamentScreen::onEntry() { BaseScreen::onEntry(); - screen_data.ChangeFilamentScreen.e_tag = ExtUI::getActiveTool() + 10; - screen_data.ChangeFilamentScreen.t_tag = 0; - screen_data.ChangeFilamentScreen.repeat_tag = 0; - screen_data.ChangeFilamentScreen.saved_extruder = getActiveTool(); + screen_data.ChangeFilament.e_tag = ExtUI::getActiveTool() + 10; + screen_data.ChangeFilament.t_tag = 0; + screen_data.ChangeFilament.repeat_tag = 0; + screen_data.ChangeFilament.saved_extruder = getActiveTool(); #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - screen_data.ChangeFilamentScreen.need_purge = true; + screen_data.ChangeFilament.need_purge = true; #endif } void ChangeFilamentScreen::onExit() { - setActiveTool(screen_data.ChangeFilamentScreen.saved_extruder, true); + setActiveTool(screen_data.ChangeFilament.saved_extruder, true); } void ChangeFilamentScreen::onRedraw(draw_mode_t what) { @@ -170,7 +170,7 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { const bool t_ok = getActualTemp_celsius(e) > getSoftenTemp() - 10; - if (screen_data.ChangeFilamentScreen.t_tag && !t_ok) { + if (screen_data.ChangeFilament.t_tag && !t_ok) { cmd.text(HEATING_LBL_POS, GET_TEXT_F(MSG_HEATING)); } else if (getActualTemp_celsius(e) > 100) { cmd.cmd(COLOR_RGB(0xFF0000)) @@ -181,12 +181,12 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { #define TOG_STYLE(A) colors(A ? action_btn : normal_btn) - const bool tog2 = screen_data.ChangeFilamentScreen.t_tag == 2; - const bool tog3 = screen_data.ChangeFilamentScreen.t_tag == 3; - const bool tog4 = screen_data.ChangeFilamentScreen.t_tag == 4; - const bool tog10 = screen_data.ChangeFilamentScreen.e_tag == 10; + const bool tog2 = screen_data.ChangeFilament.t_tag == 2; + const bool tog3 = screen_data.ChangeFilament.t_tag == 3; + const bool tog4 = screen_data.ChangeFilament.t_tag == 4; + const bool tog10 = screen_data.ChangeFilament.e_tag == 10; #if HAS_MULTI_HOTEND - const bool tog11 = screen_data.ChangeFilamentScreen.e_tag == 11; + const bool tog11 = screen_data.ChangeFilament.e_tag == 11; #endif cmd.TOG_STYLE(tog10) @@ -200,8 +200,8 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { if (!t_ok) reset_menu_timeout(); - const bool tog7 = screen_data.ChangeFilamentScreen.repeat_tag == 7; - const bool tog8 = screen_data.ChangeFilamentScreen.repeat_tag == 8; + const bool tog7 = screen_data.ChangeFilament.repeat_tag == 7; + const bool tog8 = screen_data.ChangeFilament.repeat_tag == 8; { char str[30]; @@ -228,7 +228,7 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { } uint8_t ChangeFilamentScreen::getSoftenTemp() { - switch (screen_data.ChangeFilamentScreen.t_tag) { + switch (screen_data.ChangeFilament.t_tag) { case 2: return LOW_TEMP; case 3: return MED_TEMP; case 4: return HIGH_TEMP; @@ -237,7 +237,7 @@ uint8_t ChangeFilamentScreen::getSoftenTemp() { } ExtUI::extruder_t ChangeFilamentScreen::getExtruder() { - switch (screen_data.ChangeFilamentScreen.e_tag) { + switch (screen_data.ChangeFilament.e_tag) { case 13: return ExtUI::E3; case 12: return ExtUI::E2; case 11: return ExtUI::E1; @@ -248,8 +248,8 @@ ExtUI::extruder_t ChangeFilamentScreen::getExtruder() { void ChangeFilamentScreen::doPurge() { #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 constexpr float purge_distance_mm = FILAMENT_UNLOAD_PURGE_LENGTH; - if (screen_data.ChangeFilamentScreen.need_purge) { - screen_data.ChangeFilamentScreen.need_purge = false; + if (screen_data.ChangeFilament.need_purge) { + screen_data.ChangeFilament.need_purge = false; MoveAxisScreen::setManualFeedrate(getExtruder(), purge_distance_mm); ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(getExtruder()) + purge_distance_mm, getExtruder()); } @@ -277,23 +277,23 @@ bool ChangeFilamentScreen::onTouchEnd(uint8_t tag) { case 3: case 4: // Change temperature - screen_data.ChangeFilamentScreen.t_tag = tag; + screen_data.ChangeFilament.t_tag = tag; setTargetTemp_celsius(getSoftenTemp(), getExtruder()); break; case 7: - screen_data.ChangeFilamentScreen.repeat_tag = (screen_data.ChangeFilamentScreen.repeat_tag == 7) ? 0 : 7; + screen_data.ChangeFilament.repeat_tag = (screen_data.ChangeFilament.repeat_tag == 7) ? 0 : 7; break; case 8: - screen_data.ChangeFilamentScreen.repeat_tag = (screen_data.ChangeFilamentScreen.repeat_tag == 8) ? 0 : 8; + screen_data.ChangeFilament.repeat_tag = (screen_data.ChangeFilament.repeat_tag == 8) ? 0 : 8; break; case 10: case 11: // Change extruder - screen_data.ChangeFilamentScreen.e_tag = tag; - screen_data.ChangeFilamentScreen.t_tag = 0; - screen_data.ChangeFilamentScreen.repeat_tag = 0; + screen_data.ChangeFilament.e_tag = tag; + screen_data.ChangeFilament.t_tag = 0; + screen_data.ChangeFilament.repeat_tag = 0; #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - screen_data.ChangeFilamentScreen.need_purge = true; + screen_data.ChangeFilament.need_purge = true; #endif setActiveTool(getExtruder(), true); break; @@ -319,7 +319,7 @@ bool ChangeFilamentScreen::onTouchHeld(uint8_t tag) { void ChangeFilamentScreen::onIdle() { reset_menu_timeout(); - if (screen_data.ChangeFilamentScreen.repeat_tag) onTouchHeld(screen_data.ChangeFilamentScreen.repeat_tag); + if (screen_data.ChangeFilament.repeat_tag) onTouchHeld(screen_data.ChangeFilament.repeat_tag); if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { onRefresh(); refresh_timer.start(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp index 6e2b4adc39..61411afa1b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp @@ -38,15 +38,15 @@ void MoveEScreen::onRedraw(draw_mode_t what) { w.heading( GET_TEXT_F(MSG_E_MOVE)); w.color(Theme::e_axis); #if EXTRUDERS == 1 - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxis.e_rel[0], canMove(E0)); #elif HAS_MULTI_EXTRUDER - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); - w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxis.e_rel[0], canMove(E0)); + w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxis.e_rel[1], canMove(E1)); #if EXTRUDERS > 2 - w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2)); + w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxis.e_rel[2], canMove(E2)); #endif #if EXTRUDERS > 3 - w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3)); + w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxis.e_rel[3], canMove(E3)); #endif #endif w.increments(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp index 4707924b20..99c0c1b664 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp @@ -21,7 +21,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_COCOA_PRESS) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) #include "screens.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp index e9996e4bc0..c9caef6524 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp @@ -21,7 +21,7 @@ #include "../config.h" -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_COCOA_PRESS) +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) #include "screens.h" #include "screen_data.h" @@ -54,7 +54,7 @@ void PreheatTimerScreen::draw_message(draw_mode_t what) { } uint16_t PreheatTimerScreen::secondsRemaining() { - const uint32_t elapsed_sec = (millis() - screen_data.PreheatTimerScreen.start_ms) / 1000; + const uint32_t elapsed_sec = (millis() - screen_data.PreheatTimer.start_ms) / 1000; return (COCOA_PRESS_PREHEAT_SECONDS > elapsed_sec) ? COCOA_PRESS_PREHEAT_SECONDS - elapsed_sec : 0; } @@ -118,7 +118,7 @@ void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, progmem_st } void PreheatTimerScreen::onEntry() { - screen_data.PreheatTimerScreen.start_ms = millis(); + screen_data.PreheatTimer.start_ms = millis(); } void PreheatTimerScreen::onRedraw(draw_mode_t what) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp index 0dbee2414d..eeca88f280 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp @@ -53,12 +53,12 @@ bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) { const char *ConfirmStartPrintDialogBox::getFilename(bool longName) { FileList files; - files.seek(screen_data.ConfirmStartPrintDialogBox.file_index, true); + files.seek(screen_data.ConfirmStartPrintDialog.file_index, true); return longName ? files.longFilename() : files.shortFilename(); } void ConfirmStartPrintDialogBox::show(uint8_t file_index) { - screen_data.ConfirmStartPrintDialogBox.file_index = file_index; + screen_data.ConfirmStartPrintDialog.file_index = file_index; GOTO_SCREEN(ConfirmStartPrintDialogBox); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index 93dfcba47d..637709e186 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -47,7 +47,7 @@ bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { void ConfirmUserRequestAlertBox::show(const char* msg) { drawMessage(msg); storeBackground(); - screen_data.AlertDialogBox.isError = false; + screen_data.AlertDialog.isError = false; GOTO_SCREEN(ConfirmUserRequestAlertBox); } @@ -55,4 +55,5 @@ void ConfirmUserRequestAlertBox::hide() { if (AT_SCREEN(ConfirmUserRequestAlertBox)) GOTO_PREVIOUS(); } + #endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index 112d70c074..cadc582267 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -32,8 +32,8 @@ using namespace ExtUI; using namespace Theme; void FilesScreen::onEntry() { - screen_data.FilesScreen.cur_page = 0; - screen_data.FilesScreen.selected_tag = 0xFF; + screen_data.Files.cur_page = 0; + screen_data.Files.selected_tag = 0xFF; #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) CLCD::mem_write_32(CLCD::REG::MACRO_0,DL::NOP); #endif @@ -50,21 +50,21 @@ const char *FilesScreen::getSelectedFilename(bool longName) { void FilesScreen::drawSelectedFile() { FileList files; files.seek(getSelectedFileIndex(), true); - screen_data.FilesScreen.flags.is_dir = files.isDir(); + screen_data.Files.flags.is_dir = files.isDir(); drawFileButton( files.filename(), - screen_data.FilesScreen.selected_tag, - screen_data.FilesScreen.flags.is_dir, + screen_data.Files.selected_tag, + screen_data.Files.flags.is_dir, true ); } uint16_t FilesScreen::getSelectedFileIndex() { - return getFileForTag(screen_data.FilesScreen.selected_tag); + return getFileForTag(screen_data.Files.selected_tag); } uint16_t FilesScreen::getFileForTag(uint8_t tag) { - return screen_data.FilesScreen.cur_page * files_per_page + tag - 2; + return screen_data.Files.cur_page * files_per_page + tag - 2; } #if ENABLED(TOUCH_UI_PORTRAIT) @@ -106,15 +106,15 @@ void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, void FilesScreen::drawFileList() { FileList files; - screen_data.FilesScreen.num_page = max(1,ceil(float(files.count()) / files_per_page)); - screen_data.FilesScreen.cur_page = min(screen_data.FilesScreen.cur_page, screen_data.FilesScreen.num_page-1); - screen_data.FilesScreen.flags.is_root = files.isAtRootDir(); + screen_data.Files.num_page = max(1,ceil(float(files.count()) / files_per_page)); + screen_data.Files.cur_page = min(screen_data.Files.cur_page, screen_data.Files.num_page-1); + screen_data.Files.flags.is_root = files.isAtRootDir(); #undef MARGIN_T #undef MARGIN_B #define MARGIN_T 0 #define MARGIN_B 0 - uint16_t fileIndex = screen_data.FilesScreen.cur_page * files_per_page; + uint16_t fileIndex = screen_data.Files.cur_page * files_per_page; for (uint8_t i = 0; i < files_per_page; i++, fileIndex++) { if (files.seek(fileIndex)) { drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false); @@ -126,8 +126,8 @@ void FilesScreen::drawFileList() { } void FilesScreen::drawHeader() { - const bool prev_enabled = screen_data.FilesScreen.cur_page > 0; - const bool next_enabled = screen_data.FilesScreen.cur_page < (screen_data.FilesScreen.num_page - 1); + const bool prev_enabled = screen_data.Files.cur_page > 0; + const bool next_enabled = screen_data.Files.cur_page < (screen_data.Files.num_page - 1); #undef MARGIN_T #undef MARGIN_B @@ -136,7 +136,7 @@ void FilesScreen::drawHeader() { char str[16]; sprintf_P(str, PSTR("Page %d of %d"), - screen_data.FilesScreen.cur_page + 1, screen_data.FilesScreen.num_page); + screen_data.Files.cur_page + 1, screen_data.Files.num_page); CommandProcessor cmd; cmd.colors(normal_btn) @@ -158,8 +158,8 @@ void FilesScreen::drawFooter() { #define MARGIN_T 5 #define MARGIN_B 5 #endif - const bool has_selection = screen_data.FilesScreen.selected_tag != 0xFF; - const uint8_t back_tag = screen_data.FilesScreen.flags.is_root ? 240 : 245; + const bool has_selection = screen_data.Files.selected_tag != 0xFF; + const uint8_t back_tag = screen_data.Files.flags.is_root ? 240 : 245; const uint8_t y = GRID_ROWS - footer_h + 1; const uint8_t h = footer_h; @@ -171,7 +171,7 @@ void FilesScreen::drawFooter() { .enabled(has_selection) .colors(has_selection ? action_btn : normal_btn); - if (screen_data.FilesScreen.flags.is_dir) + if (screen_data.Files.flags.is_dir) cmd.tag(244).button(BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN)); else cmd.tag(243).button(BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT)); @@ -186,8 +186,8 @@ void FilesScreen::onRedraw(draw_mode_t what) { } void FilesScreen::gotoPage(uint8_t page) { - screen_data.FilesScreen.selected_tag = 0xFF; - screen_data.FilesScreen.cur_page = page; + screen_data.Files.selected_tag = 0xFF; + screen_data.Files.cur_page = page; CommandProcessor cmd; cmd.cmd(CMD_DLSTART) .cmd(CLEAR_COLOR_RGB(bg_color)) @@ -201,13 +201,13 @@ bool FilesScreen::onTouchEnd(uint8_t tag) { switch (tag) { case 240: GOTO_PREVIOUS(); return true; case 241: - if (screen_data.FilesScreen.cur_page > 0) { - gotoPage(screen_data.FilesScreen.cur_page-1); + if (screen_data.Files.cur_page > 0) { + gotoPage(screen_data.Files.cur_page-1); } break; case 242: - if (screen_data.FilesScreen.cur_page < (screen_data.FilesScreen.num_page-1)) { - gotoPage(screen_data.FilesScreen.cur_page+1); + if (screen_data.Files.cur_page < (screen_data.Files.num_page-1)) { + gotoPage(screen_data.Files.cur_page+1); } break; case 243: @@ -229,18 +229,18 @@ bool FilesScreen::onTouchEnd(uint8_t tag) { break; default: if (tag < 240) { - screen_data.FilesScreen.selected_tag = tag; + screen_data.Files.selected_tag = tag; #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) if (FTDI::ftdi_chip >= 810) { const char *longFilename = getSelectedLongFilename(); if (longFilename[0]) { CommandProcessor cmd; uint16_t text_width = cmd.font(font_medium).text_width(longFilename); - screen_data.FilesScreen.scroll_pos = 0; + screen_data.Files.scroll_pos = 0; if (text_width > display_width) - screen_data.FilesScreen.scroll_max = text_width - display_width + MARGIN_L + MARGIN_R; + screen_data.Files.scroll_max = text_width - display_width + MARGIN_L + MARGIN_R; else - screen_data.FilesScreen.scroll_max = 0; + screen_data.Files.scroll_max = 0; } } #endif @@ -254,9 +254,9 @@ void FilesScreen::onIdle() { #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) if (FTDI::ftdi_chip >= 810) { CLCD::mem_write_32(CLCD::REG::MACRO_0, - VERTEX_TRANSLATE_X(-int32_t(screen_data.FilesScreen.scroll_pos))); - if (screen_data.FilesScreen.scroll_pos < screen_data.FilesScreen.scroll_max * 16) - screen_data.FilesScreen.scroll_pos++; + VERTEX_TRANSLATE_X(-int32_t(screen_data.Files.scroll_pos))); + if (screen_data.Files.scroll_pos < screen_data.Files.scroll_max * 16) + screen_data.Files.scroll_pos++; } #endif } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp index f0c6539bed..3d50b616fc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -47,8 +47,8 @@ void InterfaceSettingsScreen::onStartup() { } void InterfaceSettingsScreen::onEntry() { - screen_data.InterfaceSettingsScreen.brightness = CLCD::get_brightness(); - screen_data.InterfaceSettingsScreen.volume = SoundPlayer::get_volume(); + screen_data.InterfaceSettings.brightness = CLCD::get_brightness(); + screen_data.InterfaceSettings.volume = SoundPlayer::get_volume(); BaseScreen::onEntry(); } @@ -96,9 +96,9 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { #define EDGE_R 30 .colors(ui_slider) #if DISABLED(LCD_FYSETC_TFT81050) - .tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.brightness, 128) + .tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettings.brightness, 128) #endif - .tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) + .tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), screen_data.InterfaceSettings.volume, 0xFF) .colors(ui_toggle) .tag(4).toggle2(BTN_POS(3,4), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), LockScreen::is_enabled()) #if DISABLED(TOUCH_UI_NO_BOOTSCREEN) @@ -161,13 +161,13 @@ void InterfaceSettingsScreen::onIdle() { CommandProcessor cmd; switch (cmd.track_tag(value)) { case 2: - screen_data.InterfaceSettingsScreen.brightness = max(11, (value * 128UL) / 0xFFFF); - CLCD::set_brightness(screen_data.InterfaceSettingsScreen.brightness); + screen_data.InterfaceSettings.brightness = max(11, (value * 128UL) / 0xFFFF); + CLCD::set_brightness(screen_data.InterfaceSettings.brightness); SaveSettingsDialogBox::settingsChanged(); break; case 3: - screen_data.InterfaceSettingsScreen.volume = value >> 8; - SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume); + screen_data.InterfaceSettings.volume = value >> 8; + SoundPlayer::set_volume(screen_data.InterfaceSettings.volume); SaveSettingsDialogBox::settingsChanged(); break; default: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp index 3e60639304..9f21c6b8c7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp @@ -93,7 +93,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { cmd.font(font_medium) .colors(ui_slider) #define EDGE_R 30 - .tag(2).slider (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) + .tag(2).slider (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettings.volume, 0xFF) .colors(ui_toggle) .tag(3).toggle2 (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::touch_sounds_enabled()) #undef EDGE_R @@ -108,7 +108,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { } void InterfaceSoundsScreen::onEntry() { - screen_data.InterfaceSettingsScreen.volume = SoundPlayer::get_volume(); + screen_data.InterfaceSettings.volume = SoundPlayer::get_volume(); BaseScreen::onEntry(); } @@ -145,8 +145,8 @@ void InterfaceSoundsScreen::onIdle() { CommandProcessor cmd; switch (cmd.track_tag(value)) { case 2: - screen_data.InterfaceSettingsScreen.volume = value >> 8; - SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume); + screen_data.InterfaceSettings.volume = value >> 8; + SoundPlayer::set_volume(screen_data.InterfaceSettings.volume); SaveSettingsDialogBox::settingsChanged(); break; default: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp index a3f2d09188..766f414a11 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp @@ -33,9 +33,9 @@ using namespace Theme; uint16_t LockScreen::passcode = 0; void LockScreen::onEntry() { - const uint8_t siz = sizeof(screen_data.LockScreen.passcode); - memset(screen_data.LockScreen.passcode, '_', siz-1); - screen_data.LockScreen.passcode[siz-1] = '\0'; + const uint8_t siz = sizeof(screen_data.Lock.passcode); + memset(screen_data.Lock.passcode, '_', siz-1); + screen_data.Lock.passcode[siz-1] = '\0'; BaseScreen::onEntry(); } @@ -84,11 +84,11 @@ void LockScreen::onRedraw(draw_mode_t what) { #if ENABLED(TOUCH_UI_PORTRAIT) .text(BTN_POS(1,2), BTN_SIZE(1,1), message) .font(font_xlarge) - .text(BTN_POS(1,4), BTN_SIZE(1,1), screen_data.LockScreen.passcode) + .text(BTN_POS(1,4), BTN_SIZE(1,1), screen_data.Lock.passcode) #else .text(BTN_POS(1,1), BTN_SIZE(1,1), message) .font(font_xlarge) - .text(BTN_POS(1,2), BTN_SIZE(1,1), screen_data.LockScreen.passcode) + .text(BTN_POS(1,2), BTN_SIZE(1,1), screen_data.Lock.passcode) #endif .font(font_large) .colors(normal_btn) @@ -117,8 +117,8 @@ void LockScreen::onRedraw(draw_mode_t what) { char &LockScreen::message_style() { // We use the last byte of the passcode string as a flag to indicate, // which message to show. - constexpr uint8_t last_char = sizeof(screen_data.LockScreen.passcode)-1; - return screen_data.LockScreen.passcode[last_char]; + constexpr uint8_t last_char = sizeof(screen_data.Lock.passcode)-1; + return screen_data.Lock.passcode[last_char]; } void LockScreen::onPasscodeEntered() { @@ -145,10 +145,10 @@ void LockScreen::onPasscodeEntered() { } bool LockScreen::onTouchEnd(uint8_t tag) { - char *c = strchr(screen_data.LockScreen.passcode,'_'); + char *c = strchr(screen_data.Lock.passcode,'_'); if (c) { if (tag == '<') { - if (c != screen_data.LockScreen.passcode) { + if (c != screen_data.Lock.passcode) { // Backspace deletes previous entered characters. *--c = '_'; } @@ -167,7 +167,7 @@ bool LockScreen::onTouchEnd(uint8_t tag) { uint16_t LockScreen::compute_checksum() { uint16_t checksum = 0; - const char* c = screen_data.LockScreen.passcode; + const char* c = screen_data.Lock.passcode; while (*c) { checksum = (checksum << 2) ^ *c++; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index 972b758024..75c6093955 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -37,7 +37,7 @@ void BaseMoveAxisScreen::onEntry() { // screen is entered. LOOP_L_N(i, ExtUI::extruderCount) { - screen_data.MoveAxisScreen.e_rel[i] = 0; + screen_data.MoveAxis.e_rel[i] = 0; } BaseNumericAdjustmentScreen::onEntry(); } @@ -54,15 +54,15 @@ void MoveAxisScreen::onRedraw(draw_mode_t what) { w.color(Theme::e_axis); #if EXTRUDERS == 1 - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxis.e_rel[0], canMove(E0)); #elif HAS_MULTI_EXTRUDER - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); - w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxis.e_rel[0], canMove(E0)); + w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxis.e_rel[1], canMove(E1)); #if EXTRUDERS > 2 - w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2)); + w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxis.e_rel[2], canMove(E2)); #endif #if EXTRUDERS > 3 - w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3)); + w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxis.e_rel[3], canMove(E3)); #endif #endif w.increments(); @@ -80,19 +80,19 @@ bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) { case 6: UI_DECREMENT_AXIS(Z); break; case 7: UI_INCREMENT_AXIS(Z); break; // For extruders, also update relative distances. - case 8: UI_DECREMENT_AXIS(E0); screen_data.MoveAxisScreen.e_rel[0] -= increment; break; - case 9: UI_INCREMENT_AXIS(E0); screen_data.MoveAxisScreen.e_rel[0] += increment; break; + case 8: UI_DECREMENT_AXIS(E0); screen_data.MoveAxis.e_rel[0] -= increment; break; + case 9: UI_INCREMENT_AXIS(E0); screen_data.MoveAxis.e_rel[0] += increment; break; #if HAS_MULTI_EXTRUDER - case 10: UI_DECREMENT_AXIS(E1); screen_data.MoveAxisScreen.e_rel[1] -= increment; break; - case 11: UI_INCREMENT_AXIS(E1); screen_data.MoveAxisScreen.e_rel[1] += increment; break; + case 10: UI_DECREMENT_AXIS(E1); screen_data.MoveAxis.e_rel[1] -= increment; break; + case 11: UI_INCREMENT_AXIS(E1); screen_data.MoveAxis.e_rel[1] += increment; break; #endif #if EXTRUDERS > 2 - case 12: UI_DECREMENT_AXIS(E2); screen_data.MoveAxisScreen.e_rel[2] -= increment; break; - case 13: UI_INCREMENT_AXIS(E2); screen_data.MoveAxisScreen.e_rel[2] += increment; break; + case 12: UI_DECREMENT_AXIS(E2); screen_data.MoveAxis.e_rel[2] -= increment; break; + case 13: UI_INCREMENT_AXIS(E2); screen_data.MoveAxis.e_rel[2] += increment; break; #endif #if EXTRUDERS > 3 - case 14: UI_DECREMENT_AXIS(E3); screen_data.MoveAxisScreen.e_rel[3] -= increment; break; - case 15: UI_INCREMENT_AXIS(E3); screen_data.MoveAxisScreen.e_rel[3] += increment; break; + case 14: UI_DECREMENT_AXIS(E3); screen_data.MoveAxis.e_rel[3] -= increment; break; + case 15: UI_INCREMENT_AXIS(E3); screen_data.MoveAxis.e_rel[3] += increment; break; #endif case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28 X")); break; case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28 Y")); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp index aac0f9a277..f0d3f7eec5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp @@ -32,11 +32,11 @@ using namespace Theme; using namespace ExtUI; void NudgeNozzleScreen::onEntry() { - screen_data.NudgeNozzleScreen.show_offsets = false; + screen_data.NudgeNozzle.show_offsets = false; #if HAS_MULTI_EXTRUDER - screen_data.NudgeNozzleScreen.link_nozzles = true; + screen_data.NudgeNozzle.link_nozzles = true; #endif - screen_data.NudgeNozzleScreen.rel.reset(); + screen_data.NudgeNozzle.rel.reset(); BaseNumericAdjustmentScreen::onEntry(); } @@ -47,19 +47,19 @@ void NudgeNozzleScreen::onRedraw(draw_mode_t what) { w.heading(GET_TEXT_F(MSG_NUDGE_NOZZLE)); #if ENABLED(BABYSTEP_XY) - w.color(x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), screen_data.NudgeNozzleScreen.rel.x / getAxisSteps_per_mm(X)); - w.color(y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), screen_data.NudgeNozzleScreen.rel.y / getAxisSteps_per_mm(Y)); + w.color(x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), screen_data.NudgeNozzle.rel.x / getAxisSteps_per_mm(X)); + w.color(y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), screen_data.NudgeNozzle.rel.y / getAxisSteps_per_mm(Y)); #endif - w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), screen_data.NudgeNozzleScreen.rel.z / getAxisSteps_per_mm(Z)); + w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), screen_data.NudgeNozzle.rel.z / getAxisSteps_per_mm(Z)); w.increments(); #if HAS_MULTI_EXTRUDER - w.toggle(8, GET_TEXT_F(MSG_ADJUST_BOTH_NOZZLES), screen_data.NudgeNozzleScreen.link_nozzles); + w.toggle(8, GET_TEXT_F(MSG_ADJUST_BOTH_NOZZLES), screen_data.NudgeNozzle.link_nozzles); #endif #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE - w.toggle(9, GET_TEXT_F(MSG_SHOW_OFFSETS), screen_data.NudgeNozzleScreen.show_offsets); + w.toggle(9, GET_TEXT_F(MSG_SHOW_OFFSETS), screen_data.NudgeNozzle.show_offsets); - if (screen_data.NudgeNozzleScreen.show_offsets) { + if (screen_data.NudgeNozzle.show_offsets) { char str[19]; w.draw_mode(BOTH); @@ -83,22 +83,22 @@ void NudgeNozzleScreen::onRedraw(draw_mode_t what) { bool NudgeNozzleScreen::onTouchHeld(uint8_t tag) { const float inc = getIncrement(); #if HAS_MULTI_EXTRUDER - const bool link = screen_data.NudgeNozzleScreen.link_nozzles; + const bool link = screen_data.NudgeNozzle.link_nozzles; #else constexpr bool link = true; #endif int16_t steps; switch (tag) { - case 2: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps(-steps, X, link); screen_data.NudgeNozzleScreen.rel.x -= steps; break; - case 3: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps( steps, X, link); screen_data.NudgeNozzleScreen.rel.x += steps; break; - case 4: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps(-steps, Y, link); screen_data.NudgeNozzleScreen.rel.y -= steps; break; - case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); screen_data.NudgeNozzleScreen.rel.y += steps; break; - case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); screen_data.NudgeNozzleScreen.rel.z -= steps; break; - case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); screen_data.NudgeNozzleScreen.rel.z += steps; break; + case 2: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps(-steps, X, link); screen_data.NudgeNozzle.rel.x -= steps; break; + case 3: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps( steps, X, link); screen_data.NudgeNozzle.rel.x += steps; break; + case 4: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps(-steps, Y, link); screen_data.NudgeNozzle.rel.y -= steps; break; + case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); screen_data.NudgeNozzle.rel.y += steps; break; + case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); screen_data.NudgeNozzle.rel.z -= steps; break; + case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); screen_data.NudgeNozzle.rel.z += steps; break; #if HAS_MULTI_EXTRUDER - case 8: screen_data.NudgeNozzleScreen.link_nozzles = !link; break; + case 8: screen_data.NudgeNozzle.link_nozzles = !link; break; #endif - case 9: screen_data.NudgeNozzleScreen.show_offsets = !screen_data.NudgeNozzleScreen.show_offsets; break; + case 9: screen_data.NudgeNozzle.show_offsets = !screen_data.NudgeNozzle.show_offsets; break; default: return false; } #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index dab411a256..fe35fc457b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -30,19 +30,19 @@ struct base_numeric_adjustment_t {uint8_t increment;}; union screen_data_t { - struct base_numeric_adjustment_t BaseNumericAdjustmentScreen; - struct {uint8_t volume; uint8_t brightness;} InterfaceSettingsScreen; - struct {char passcode[5];} LockScreen; - struct {bool isError;} AlertDialogBox; - struct {bool auto_hide;} SpinnerDialogBox; - struct {uint8_t file_index;} ConfirmStartPrintDialogBox; + struct base_numeric_adjustment_t BaseNumericAdjustment; + struct {uint8_t volume; uint8_t brightness;} InterfaceSettings; + struct {char passcode[5];} Lock; + struct {bool isError;} AlertDialog; + struct {bool auto_hide;} SpinnerDialog; + struct {uint8_t file_index;} ConfirmStartPrintDialog; struct { uint8_t e_tag, t_tag, repeat_tag; ExtUI::extruder_t saved_extruder; #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 bool need_purge; #endif - } ChangeFilamentScreen; + } ChangeFilament; struct { struct { uint8_t is_dir : 1; @@ -55,11 +55,11 @@ union screen_data_t { uint16_t scroll_pos; uint16_t scroll_max; #endif - } FilesScreen; + } Files; struct { struct base_numeric_adjustment_t placeholder; float e_rel[ExtUI::extruderCount]; - } MoveAxisScreen; + } MoveAxis; #if HAS_MESH struct { enum : uint8_t { @@ -69,18 +69,18 @@ union screen_data_t { } message; uint8_t count; uint8_t highlightedTag; - } BedMeshScreen; + } BedMesh; #endif #if ENABLED(TOUCH_UI_DEVELOPER_MENU) struct { uint32_t next_watchdog_trigger; const char* message; - } StressTestScreen; + } StressTest; #endif #if ENABLED(TOUCH_UI_COCOA_PRESS) struct { uint32_t start_ms; - } PreheatTimerScreen; + } PreheatTimer; #endif #if ENABLED(BABYSTEPPING) struct { @@ -90,7 +90,7 @@ union screen_data_t { bool link_nozzles; #endif bool show_offsets; - } NudgeNozzleScreen; + } NudgeNozzle; #endif }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp index a4464c1e49..2318a0d108 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp @@ -37,7 +37,7 @@ void SpinnerDialogBox::show(const progmem_str message) { drawMessage(message); drawSpinner(); storeBackground(); - screen_data.SpinnerDialogBox.auto_hide = false; + screen_data.SpinnerDialog.auto_hide = false; } void SpinnerDialogBox::hide() { @@ -53,13 +53,13 @@ void SpinnerDialogBox::enqueueAndWait_P(const progmem_str message, const progmem show(message); GOTO_SCREEN(SpinnerDialogBox); ExtUI::injectCommands_P((const char*)commands); - screen_data.SpinnerDialogBox.auto_hide = true; + screen_data.SpinnerDialog.auto_hide = true; } void SpinnerDialogBox::onIdle() { reset_menu_timeout(); - if (screen_data.SpinnerDialogBox.auto_hide && !commandsInQueue()) { - screen_data.SpinnerDialogBox.auto_hide = false; + if (screen_data.SpinnerDialog.auto_hide && !commandsInQueue()) { + screen_data.SpinnerDialog.auto_hide = false; hide(); GOTO_PREVIOUS(); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp index 2ffbdb9b8e..0aed1b7c53 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -47,8 +47,8 @@ void StressTestScreen::drawDots(uint16_t x, uint16_t y, uint16_t w, uint16_t h) } bool StressTestScreen::watchDogTestNow() { - return screen_data.StressTestScreen.next_watchdog_trigger && - ELAPSED(millis(), screen_data.StressTestScreen.next_watchdog_trigger); + return screen_data.StressTest.next_watchdog_trigger && + ELAPSED(millis(), screen_data.StressTest.next_watchdog_trigger); } void StressTestScreen::onRedraw(draw_mode_t) { @@ -58,7 +58,7 @@ void StressTestScreen::onRedraw(draw_mode_t) { .cmd(CLEAR(true,true,true)) .cmd(COLOR_RGB(bg_text_enabled)) .font(font_medium) - .text(BTN_POS(1,1), BTN_SIZE(4,1), progmem_str(screen_data.StressTestScreen.message)); + .text(BTN_POS(1,1), BTN_SIZE(4,1), progmem_str(screen_data.StressTest.message)); drawDots(BTN_POS(1,3), BTN_SIZE(4,4)); @@ -92,8 +92,8 @@ void StressTestScreen::startupCheck() { } void StressTestScreen::onEntry() { - screen_data.StressTestScreen.next_watchdog_trigger = millis() + 10000 + random(40000); - screen_data.StressTestScreen.message = PSTR("Test 1: Stress testing..."); + screen_data.StressTest.next_watchdog_trigger = millis() + 10000 + random(40000); + screen_data.StressTest.message = PSTR("Test 1: Stress testing..."); // Turn off heaters. setTargetTemp_celsius(0, E0); @@ -104,13 +104,13 @@ void StressTestScreen::onEntry() { } void StressTestScreen::recursiveLockup() { - screen_data.StressTestScreen.message = PSTR("Test 2: Printer will restart."); + screen_data.StressTest.message = PSTR("Test 2: Printer will restart."); current_screen.onRefresh(); recursiveLockup(); } void StressTestScreen::iterativeLockup() { - screen_data.StressTestScreen.message = PSTR("Test 3: Printer will restart."); + screen_data.StressTest.message = PSTR("Test 3: Printer will restart."); for (;;) current_screen.onRefresh(); } From abeefaac7fbc35ce6932e34740ed610c2db69e0d Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sun, 3 Jan 2021 22:59:48 -0500 Subject: [PATCH 0832/1370] Fix SD SPI Speed override, FTDI mesh edit (#20657) Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_LCD.h | 5 ----- Marlin/src/inc/Conditionals_post.h | 5 +++++ .../ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp | 15 ++------------- .../extui/lib/ftdi_eve_touch_ui/screens/screens.h | 1 - 4 files changed, 7 insertions(+), 19 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 388adb1809..79b65e7a9b 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1045,11 +1045,6 @@ #define INVERT_E_DIR false #endif -// Fallback SPI Speed for SD -#if ENABLED(SDSUPPORT) && !defined(SD_SPI_SPEED) - #define SD_SPI_SPEED SPI_FULL_SPEED -#endif - /** * This setting is also used by M109 when trying to calculate * a ballpark safe margin to prevent wait-forever situation. diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 388caa9eb1..135867a72b 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2708,6 +2708,11 @@ #endif #endif +// Fallback SPI Speed for SD +#if ENABLED(SDSUPPORT) && !defined(SD_SPI_SPEED) + #define SD_SPI_SPEED SPI_FULL_SPEED +#endif + // Defined here to catch the above defines #if ENABLED(SDCARD_SORT_ALPHA) && (FOLDER_SORTING || ENABLED(SDSORT_GCODE)) #define HAS_FOLDER_SORTING 1 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 9ac8c61efb..9fb2b20025 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -21,7 +21,7 @@ #include "../config.h" -#if BOTH(TOUCH_UI_FTDI_EVE, AUTO_BED_LEVELING_UBL) +#if BOTH(TOUCH_UI_FTDI_EVE, HAS_MESH) #include "screens.h" #include "screen_data.h" @@ -309,17 +309,6 @@ void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { onRefresh(); } -bool BedMeshScreen::isMeshComplete(ExtUI::bed_mesh_t data) { - for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { - for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { - if (isnan(data[x][y])) { - return false; - } - } - } - return true; -} - void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { switch (state) { case ExtUI::MESH_START: @@ -327,7 +316,7 @@ void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::pr screen_data.BedMesh.message = screen_data.BedMesh.MSG_NONE; break; case ExtUI::MESH_FINISH: - if (screen_data.BedMesh.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) + if (screen_data.BedMesh.count == GRID_MAX_POINTS && ExtUI::getMeshValid()) screen_data.BedMesh.message = screen_data.BedMesh.MSG_MESH_COMPLETE; else screen_data.BedMesh.message = screen_data.BedMesh.MSG_MESH_INCOMPLETE; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 4388eebae0..51fc76f15b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -539,7 +539,6 @@ class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen Date: Sun, 3 Jan 2021 23:07:29 -0500 Subject: [PATCH 0833/1370] Fix IDEX reboot on travel after G28 X (#20654) --- Marlin/src/MarlinCore.cpp | 1 + Marlin/src/module/motion.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 9a3de3f1ac..c1c2fe0615 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -660,6 +660,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { delayed_move_time = 0xFFFFFFFFUL; // force moves to be done destination = current_position; prepare_line_to_destination(); + planner.synchronize(); } #endif diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index ace583b6c0..29ccf619a5 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1006,7 +1006,6 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { line_to_current_position(fr_zfast); } } - planner.synchronize(); // paranoia stepper.set_directions(); idex_set_parked(false); From bb747bcd621664b4b90dbc3f1f13f4f06d509478 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 3 Jan 2021 22:22:21 -0600 Subject: [PATCH 0834/1370] Fix delayed_move_time elapsed test --- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/module/motion.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index c1c2fe0615..343700e9f7 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -655,7 +655,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { #if ENABLED(DUAL_X_CARRIAGE) // handle delayed move timeout - if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) { + if (delayed_move_time && ELAPSED(ms, delayed_move_time) && IsRunning()) { // travel moves have been received so enact them delayed_move_time = 0xFFFFFFFFUL; // force moves to be done destination = current_position; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 29ccf619a5..6ffb0576c4 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -988,7 +988,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { if (delayed_move_time != 0xFFFFFFFFUL) { current_position = destination; NOLESS(raised_parked_position.z, destination.z); - delayed_move_time = millis(); + delayed_move_time = millis() + 1000UL; return true; } } From 8884b1f9a6c0b8127f9a17ec8aae24d06c0e1114 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 3 Jan 2021 22:23:13 -0600 Subject: [PATCH 0835/1370] Move duplication_e_mask --- Marlin/src/module/motion.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 18d8aa9f2e..9352a4e4e6 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -407,9 +407,6 @@ FORCE_INLINE void set_all_unhomed() { axis_homed = axis_tr */ #if HAS_DUPLICATION_MODE extern bool extruder_duplication_enabled; // Used in Dual X mode 2 - #if ENABLED(MULTI_NOZZLE_DUPLICATION) - extern uint8_t duplication_e_mask; - #endif #endif /** @@ -446,6 +443,7 @@ FORCE_INLINE void set_all_unhomed() { axis_homed = axis_tr #else #if ENABLED(MULTI_NOZZLE_DUPLICATION) + extern uint8_t duplication_e_mask; enum DualXMode : char { DXC_DUPLICATION_MODE = 2 }; FORCE_INLINE void set_duplication_enabled(const bool dupe) { extruder_duplication_enabled = dupe; } #endif From eff2330ce148474639c07ccffe274ddc60233b70 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 4 Jan 2021 17:51:46 -0600 Subject: [PATCH 0836/1370] G34/M422 cleanup --- Marlin/src/gcode/calibrate/G34_M422.cpp | 33 +++++++------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 840d04f29e..0bcf954faf 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -320,7 +320,6 @@ void GcodeSuite::G34() { }; #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - // Check if the applied corrections go in the correct direction. // Calculate the sum of the absolute deviations from the mean of the probe measurements. // Compare to the last iteration to ensure it's getting better. @@ -478,32 +477,18 @@ void GcodeSuite::M422() { const bool is_probe_point = parser.seen('S'); - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - if (is_probe_point && parser.seen('W')) { - SERIAL_ECHOLNPGM("?(S) and (W) may not be combined."); - return; - } - #endif + if (TERN0(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, is_probe_point && parser.seen('W'))) { + SERIAL_ECHOLNPGM("?(S) and (W) may not be combined."); + return; + } xy_pos_t *pos_dest = ( - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - !is_probe_point ? z_stepper_align.stepper_xy : - #endif + TERN_(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, !is_probe_point ? z_stepper_align.stepper_xy :) z_stepper_align.xy ); - if (!is_probe_point - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - && !parser.seen('W') - #endif - ) { - SERIAL_ECHOLNPGM( - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - "?(S) or (W) is required." - #else - "?(S) is required." - #endif - ); + if (!is_probe_point && TERN1(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, !parser.seen('W'))) { + SERIAL_ECHOLNPGM("?(S)" TERN_(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, " or (W)") " is required."); return; } @@ -512,7 +497,7 @@ void GcodeSuite::M422() { if (is_probe_point) { position_index = parser.intval('S') - 1; if (!WITHIN(position_index, 0, int8_t(NUM_Z_STEPPER_DRIVERS) - 1)) { - SERIAL_ECHOLNPGM("?(S) Z-ProbePosition index invalid."); + SERIAL_ECHOLNPGM("?(S) Probe-position index invalid."); return; } } @@ -520,7 +505,7 @@ void GcodeSuite::M422() { #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) position_index = parser.intval('W') - 1; if (!WITHIN(position_index, 0, NUM_Z_STEPPER_DRIVERS - 1)) { - SERIAL_ECHOLNPGM("?(W) Z-Stepper index invalid."); + SERIAL_ECHOLNPGM("?(W) Z-stepper index invalid."); return; } #endif From 4b4498be9392c8bd9671890d053983d10645ce63 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 4 Jan 2021 18:18:18 -0600 Subject: [PATCH 0837/1370] Remove untranslated strings --- Marlin/src/lcd/language/language_de.h | 10 ---------- Marlin/src/lcd/language/language_es.h | 10 ---------- Marlin/src/lcd/language/language_gl.h | 10 ---------- Marlin/src/lcd/language/language_hu.h | 10 ---------- Marlin/src/lcd/language/language_it.h | 10 ---------- Marlin/src/lcd/language/language_ro.h | 10 ---------- Marlin/src/lcd/language/language_tr.h | 10 ---------- Marlin/src/lcd/language/language_zh_CN.h | 10 ---------- 8 files changed, 80 deletions(-) diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 265c30c733..68791d9eaa 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -267,16 +267,6 @@ namespace Language_de { PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune fehlge. Falscher Extruder"); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune fehlge. Temperatur zu hoch."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autotune fehlge.! Timeout."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Auswählen"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Auswählen *"); PROGMEM Language_Str MSG_ACC = _UxGT("Beschleunigung"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 7a25ca7a93..58559a4ff5 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -265,16 +265,6 @@ namespace Language_es { PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Apg"); PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Auto-ajuste"); PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Auto-ajuste *"); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Seleccionar"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seleccionar *"); PROGMEM Language_Str MSG_ACC = _UxGT("Aceleración"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 379a25497f..d0ec16b35f 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -266,16 +266,6 @@ namespace Language_gl { PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Auto-Sint. fallida. Extrusor danado."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-Sint. fallida. Temperatura moi alta."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Auto-Sint. fallida. Tempo excedido."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Escolla"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Escolla *"); PROGMEM Language_Str MSG_ACC = _UxGT("Acel"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 21655be6fb..523f9c1c69 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -268,16 +268,6 @@ namespace Language_hu { PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz Adagoló."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Hangolási hiba. Magas hömérséklet."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Hangolási hiba! Idötúllépés."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Kiválaszt"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Kiválaszt *"); PROGMEM Language_Str MSG_ACC = _UxGT("Gyorsítás"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index b775a23fb0..ebf806caaf 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -297,16 +297,6 @@ namespace Language_it { PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Calibrazione fallita. Estrusore errato."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Calibrazione fallita. Temperatura troppo alta."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Calibrazione fallita! Tempo scaduto."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Seleziona"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seleziona *"); PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index db07ac5c68..bd7e1b7a64 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -265,16 +265,6 @@ namespace Language_ro { PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed. Bad extruder."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed. Temperature too high."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Select"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Select *"); PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index ca6357027c..a7a4056c0b 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -257,16 +257,6 @@ namespace Language_tr { PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Kapalı"); PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Kalibrasyon"); PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Kalibrasyon *"); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Seç"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seç *"); PROGMEM Language_Str MSG_ACC = _UxGT("Ä°vme"); diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index cd43ee3b39..5e7c5e7cb5 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -263,16 +263,6 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("自动调失败. å的挤出机"); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("自动调失败. 温度太高"); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("自动调失败! 超时"); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("选择"); //"Select" PROGMEM Language_Str MSG_SELECT_E = _UxGT("选择 *"); PROGMEM Language_Str MSG_ACC = _UxGT("加速度"); //"Accel" acceleration From efe2859227a94e3aa8d0903766c8870481ecb152 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 4 Jan 2021 19:01:45 -0600 Subject: [PATCH 0838/1370] Solenoid cleanups Followups to #20473 ahead of #20675 --- Marlin/src/feature/solenoid.cpp | 37 ++++++++----------------------- Marlin/src/module/tool_change.cpp | 6 +---- 2 files changed, 10 insertions(+), 33 deletions(-) diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index 659b642262..97a74c6d19 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -32,50 +32,31 @@ #if ENABLED(PARKING_EXTRUDER) #include "../module/tool_change.h" - #define SOLENOID_MAGNETIZED_STATE (TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT,!)PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE) -#else - #define SOLENOID_MAGNETIZED_STATE HIGH #endif -#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && TERN(MANUAL_SOLENOID_CONTROL, true, EXTRUDERS > N)) +#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && (ENABLED(MANUAL_SOLENOID_CONTROL) || N < EXTRUDERS)) // Used primarily with MANUAL_SOLENOID_CONTROL static void set_solenoid(const uint8_t num, const bool active) { - const uint8_t value = active ? SOLENOID_MAGNETIZED_STATE : !SOLENOID_MAGNETIZED_STATE; + const uint8_t value = active ? PE_MAGNET_ON_STATE : !PE_MAGNET_ON_STATE; switch (num) { - case 0: - OUT_WRITE(SOL0_PIN, value); - TERN_(PARKING_EXTRUDER, if (!active && active_extruder == 0) parking_extruder_set_parked()); // If active extruder's solenoid is disabled, carriage is considered parked - break; + case 0: OUT_WRITE(SOL0_PIN, value); break; #if HAS_SOLENOID(1) - case 1: - OUT_WRITE(SOL1_PIN, value); - TERN_(PARKING_EXTRUDER, if (!active && active_extruder == 1) parking_extruder_set_parked()); // If active extruder's solenoid is disabled, carriage is considered parked - break; + case 1: OUT_WRITE(SOL1_PIN, value); break; #endif #if HAS_SOLENOID(2) - case 2: - OUT_WRITE(SOL2_PIN, value); - break; + case 2: OUT_WRITE(SOL2_PIN, value); break; #endif #if HAS_SOLENOID(3) - case 3: - OUT_WRITE(SOL3_PIN, value); - break; + case 3: OUT_WRITE(SOL3_PIN, value); break; #endif #if HAS_SOLENOID(4) - case 4: - OUT_WRITE(SOL4_PIN, value); - break; + case 4: OUT_WRITE(SOL4_PIN, value); break; #endif #if HAS_SOLENOID(5) - case 5: - OUT_WRITE(SOL5_PIN, value); - break; + case 5: OUT_WRITE(SOL5_PIN, value); break; #endif - default: - SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); - break; + default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break; } } diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index a310442126..7e78b5fec3 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -260,11 +260,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a void pe_solenoid_init() { LOOP_LE_N(n, 1) - #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) - pe_activate_solenoid(n); - #else - pe_deactivate_solenoid(n); - #endif + TERN(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid, pe_deactivate_solenoid)(n); } void pe_set_solenoid(const uint8_t extruder_num, const uint8_t state) { From ed7698efaa5d5b0bd1dae1e79b6605e687c3639a Mon Sep 17 00:00:00 2001 From: FanDjango <51046875+FanDjango@users.noreply.github.com> Date: Tue, 5 Jan 2021 03:32:52 +0100 Subject: [PATCH 0839/1370] Defer "quiet probing" till the last Z bump (#20610) --- Marlin/src/module/motion.cpp | 37 +++++++++++++++++------------------- Marlin/src/module/planner.h | 2 +- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 6ffb0576c4..6a6d7bf9eb 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1289,7 +1289,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { /** * Home an individual linear axis */ -void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0) { +void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0, const bool final_approach=true) { DEBUG_SECTION(log_move, "do_homing_move", DEBUGGING(LEVELING)); const feedRate_t home_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); @@ -1320,7 +1320,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t thermalManager.wait_for_bed_heating(); #endif - TERN_(HAS_QUIET_PROBING, probe.set_probing_paused(true)); + TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_probing_paused(true)); } // Disable stealthChop if used. Enable diag1 pin on driver. @@ -1359,7 +1359,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t if (is_home_dir) { #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING - if (axis == Z_AXIS) probe.set_probing_paused(false); + if (axis == Z_AXIS && final_approach) probe.set_probing_paused(false); #endif endstops.validate_homing_move(); @@ -1608,32 +1608,29 @@ void homeaxis(const AxisEnum axis) { } #endif - // - // Fast move towards endstop until triggered - // - const float move_length = 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Home Fast: ", move_length, "mm"); - do_homing_move(axis, move_length); - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) - if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) - #endif - + // Determine if a homing bump will be done and the bumps distance // When homing Z with probe respect probe clearance const bool use_probe_bump = TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && home_bump_mm(Z_AXIS)); const float bump = axis_home_dir * ( use_probe_bump ? _MAX(TERN0(HOMING_Z_WITH_PROBE, Z_CLEARANCE_BETWEEN_PROBES), home_bump_mm(Z_AXIS)) : home_bump_mm(axis) ); + // + // Fast move towards endstop until triggered + // + const float move_length = 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Home Fast: ", move_length, "mm"); + do_homing_move(axis, move_length, 0.0, !use_probe_bump); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) + if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) + #endif + // If a second homing move is configured... if (bump) { // Move away from the endstop by the axis HOMING_BUMP_MM if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); - do_homing_move(axis, -bump - #if HOMING_Z_WITH_PROBE - , MMM_TO_MMS(axis == Z_AXIS ? Z_PROBE_SPEED_FAST : 0) - #endif - ); + do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0, false); #if ENABLED(DETECT_BROKEN_ENDSTOP) // Check for a broken endstop @@ -1657,7 +1654,7 @@ void homeaxis(const AxisEnum axis) { // Slow move towards endstop until triggered const float rebump = bump * 2; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Re-bump: ", rebump, "mm"); - do_homing_move(axis, rebump, get_homing_bump_feedrate(axis)); + do_homing_move(axis, rebump, get_homing_bump_feedrate(axis), true); #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) if (axis == Z_AXIS) bltouch.stow(); // The final STOW diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 5050f060b0..cd906c5d13 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -712,7 +712,7 @@ class Planner { private: // Allow do_homing_move to access internal functions, such as buffer_segment. - friend void do_homing_move(const AxisEnum, const float, const feedRate_t); + friend void do_homing_move(const AxisEnum, const float, const feedRate_t, const bool); #endif /** From cc1b8c2d0b303430349272765230d907d2ed3994 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 4 Jan 2021 23:09:35 -0600 Subject: [PATCH 0840/1370] Clarify solenoid active / magnet-on state --- Marlin/src/module/tool_change.cpp | 31 ++++++++++++++----------------- Marlin/src/module/tool_change.h | 6 +++--- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 7e78b5fec3..cfa2e3c714 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -259,11 +259,10 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #elif ENABLED(PARKING_EXTRUDER) void pe_solenoid_init() { - LOOP_LE_N(n, 1) - TERN(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid, pe_deactivate_solenoid)(n); + LOOP_LE_N(n, 1) pe_solenoid_set_pin_state(n, !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE); } - void pe_set_solenoid(const uint8_t extruder_num, const uint8_t state) { + void pe_solenoid_set_pin_state(const uint8_t extruder_num, const uint8_t state) { switch (extruder_num) { case 1: OUT_WRITE(SOL1_PIN, state); break; default: OUT_WRITE(SOL0_PIN, state); break; @@ -282,11 +281,11 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a if (!extruder_parked) return false; // nothing to do if (homed_towards_final_tool) { - pe_deactivate_solenoid(1 - final_tool); + pe_solenoid_magnet_off(1 - final_tool); DEBUG_ECHOLNPAIR("Disengage magnet", (int)(1 - final_tool)); - pe_activate_solenoid(final_tool); + pe_solenoid_magnet_on(final_tool); DEBUG_ECHOLNPAIR("Engage magnet", (int)final_tool); - extruder_parked = false; + parking_extruder_set_parked(false); return false; } @@ -335,7 +334,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a planner.synchronize(); DEBUG_ECHOLNPGM("(2) Disengage magnet"); - pe_deactivate_solenoid(active_extruder); + pe_solenoid_magnet_off(active_extruder); // STEP 3 @@ -353,8 +352,8 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_ECHOLNPGM("(4) Engage magnetic field"); // Just save power for inverted magnets - TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid(active_extruder)); - pe_activate_solenoid(new_tool); + TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_solenoid_magnet_on(active_extruder)); + pe_solenoid_magnet_on(new_tool); // STEP 5 @@ -382,10 +381,10 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a extruder_parked = false; } else if (do_solenoid_activation) { // && nomove == true - // Deactivate old extruder solenoid - TERN(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid, pe_deactivate_solenoid)(active_extruder); - // Only engage magnetic field for new extruder - TERN(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_deactivate_solenoid, pe_activate_solenoid)(new_tool); + // Deactivate current extruder solenoid + pe_solenoid_set_pin_state(active_extruder, !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE); + // Engage new extruder magnetic field + pe_solenoid_set_pin_state(new_tool, PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE); } do_solenoid_activation = true; // Activate solenoid for subsequent tool_change() @@ -1149,10 +1148,8 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { // Just move back down DEBUG_ECHOLNPGM("Move back Z only"); - #if ENABLED(TOOLCHANGE_PARK) - if (toolchange_settings.enable_park) - #endif - do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); + if (TERN1(TOOLCHANGE_PARK, toolchange_settings.enable_park)) + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); #else // Move back to the original (or adjusted) position diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index fc953ddf8a..d908b496ae 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -86,10 +86,10 @@ #define PE_MAGNET_ON_STATE PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE #endif - void pe_set_solenoid(const uint8_t extruder_num, const uint8_t state); + void pe_solenoid_set_pin_state(const uint8_t extruder_num, const uint8_t state); - inline void pe_activate_solenoid(const uint8_t extruder_num) { pe_set_solenoid(extruder_num, PE_MAGNET_ON_STATE); } - inline void pe_deactivate_solenoid(const uint8_t extruder_num) { pe_set_solenoid(extruder_num, !PE_MAGNET_ON_STATE); } + inline void pe_solenoid_magnet_on(const uint8_t extruder_num) { pe_solenoid_set_pin_state(extruder_num, PE_MAGNET_ON_STATE); } + inline void pe_solenoid_magnet_off(const uint8_t extruder_num) { pe_solenoid_set_pin_state(extruder_num, !PE_MAGNET_ON_STATE); } void pe_solenoid_init(); From 01c9d49f091b12e6bafec3c79bb183524b62c508 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 4 Jan 2021 23:35:56 -0600 Subject: [PATCH 0841/1370] Indent tool_change_prime --- Marlin/src/module/tool_change.cpp | 111 +++++++++++++++--------------- 1 file changed, 56 insertions(+), 55 deletions(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index cfa2e3c714..f3f3ee0595 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -793,75 +793,76 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a */ #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) -void tool_change_prime() { - if (toolchange_settings.extra_prime > 0 - && TERN(PREVENT_COLD_EXTRUSION, !thermalManager.targetTooColdToExtrude(active_extruder), 1) - ) { - destination = current_position; // Remember the old position + void tool_change_prime() { + if (toolchange_settings.extra_prime > 0 + && TERN(PREVENT_COLD_EXTRUSION, !thermalManager.targetTooColdToExtrude(active_extruder), 1) + ) { + destination = current_position; // Remember the old position - const bool ok = TERN1(TOOLCHANGE_PARK, all_axes_homed() && toolchange_settings.enable_park); + const bool ok = TERN1(TOOLCHANGE_PARK, all_axes_homed() && toolchange_settings.enable_park); - #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 - // Store and stop fan. Restored on any exit. - REMEMBER(fan, thermalManager.fan_speed[TOOLCHANGE_FS_FAN], 0); - #endif - - // Z raise - if (ok) { - // Do a small lift to avoid the workpiece in the move back (below) - current_position.z += toolchange_settings.z_raise; - #if HAS_SOFTWARE_ENDSTOPS - NOMORE(current_position.z, soft_endstop.max.z); + #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 + // Store and stop fan. Restored on any exit. + REMEMBER(fan, thermalManager.fan_speed[TOOLCHANGE_FS_FAN], 0); #endif - fast_line_to_current(Z_AXIS); - planner.synchronize(); - } - // Park - #if ENABLED(TOOLCHANGE_PARK) + // Z raise if (ok) { - IF_DISABLED(TOOLCHANGE_PARK_Y_ONLY, current_position.x = toolchange_settings.change_point.x); - IF_DISABLED(TOOLCHANGE_PARK_X_ONLY, current_position.y = toolchange_settings.change_point.y); - planner.buffer_line(current_position, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE), active_extruder); + // Do a small lift to avoid the workpiece in the move back (below) + current_position.z += toolchange_settings.z_raise; + #if HAS_SOFTWARE_ENDSTOPS + NOMORE(current_position.z, soft_endstop.max.z); + #endif + fast_line_to_current(Z_AXIS); planner.synchronize(); } - #endif - // Prime (All distances are added and slowed down to ensure secure priming in all circumstances) - unscaled_e_move(toolchange_settings.swap_length + toolchange_settings.extra_prime, MMM_TO_MMS(toolchange_settings.prime_speed)); + // Park + #if ENABLED(TOOLCHANGE_PARK) + if (ok) { + IF_DISABLED(TOOLCHANGE_PARK_Y_ONLY, current_position.x = toolchange_settings.change_point.x); + IF_DISABLED(TOOLCHANGE_PARK_X_ONLY, current_position.y = toolchange_settings.change_point.y); + planner.buffer_line(current_position, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE), active_extruder); + planner.synchronize(); + } + #endif - // Cutting retraction - #if TOOLCHANGE_FS_WIPE_RETRACT - unscaled_e_move(-(TOOLCHANGE_FS_WIPE_RETRACT), MMM_TO_MMS(toolchange_settings.retract_speed)); - #endif + // Prime (All distances are added and slowed down to ensure secure priming in all circumstances) + unscaled_e_move(toolchange_settings.swap_length + toolchange_settings.extra_prime, MMM_TO_MMS(toolchange_settings.prime_speed)); - // Cool down with fan - #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 - thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed; - gcode.dwell(toolchange_settings.fan_time * 1000); - thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0; - #endif + // Cutting retraction + #if TOOLCHANGE_FS_WIPE_RETRACT + unscaled_e_move(-(TOOLCHANGE_FS_WIPE_RETRACT), MMM_TO_MMS(toolchange_settings.retract_speed)); + #endif - // Move back - #if ENABLED(TOOLCHANGE_PARK) - if (ok) { - #if ENABLED(TOOLCHANGE_NO_RETURN) - do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); - #else - do_blocking_move_to(destination, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); - #endif - } - #endif + // Cool down with fan + #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 + thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed; + gcode.dwell(toolchange_settings.fan_time * 1000); + thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0; + #endif - // Cutting recover - unscaled_e_move(toolchange_settings.extra_resume + TOOLCHANGE_FS_WIPE_RETRACT, MMM_TO_MMS(toolchange_settings.unretract_speed)); + // Move back + #if ENABLED(TOOLCHANGE_PARK) + if (ok) { + #if ENABLED(TOOLCHANGE_NO_RETURN) + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); + #else + do_blocking_move_to(destination, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); + #endif + } + #endif - planner.synchronize(); - current_position.e = destination.e; - sync_plan_position_e(); // Resume at the old E position + // Cutting recover + unscaled_e_move(toolchange_settings.extra_resume + TOOLCHANGE_FS_WIPE_RETRACT, MMM_TO_MMS(toolchange_settings.unretract_speed)); + + planner.synchronize(); + current_position.e = destination.e; + sync_plan_position_e(); // Resume at the old E position + } } -} -#endif + +#endif // TOOLCHANGE_FILAMENT_SWAP /** * Perform a tool-change, which may result in moving the From d324f3b16a1f7898268b20614f3cf257657c3526 Mon Sep 17 00:00:00 2001 From: zeleps <39417467+zeleps@users.noreply.github.com> Date: Tue, 5 Jan 2021 07:48:42 +0200 Subject: [PATCH 0842/1370] Don't apply hotend_offset.z to Z soft endstops (#20675) Co-authored-by: Scott Lahteine --- Marlin/src/feature/solenoid.cpp | 5 +++++ Marlin/src/module/motion.cpp | 15 ++++++++------- Marlin/src/module/tool_change.cpp | 4 +--- Marlin/src/module/tool_change.h | 3 ++- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index 97a74c6d19..623f223caa 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -58,6 +58,11 @@ static void set_solenoid(const uint8_t num, const bool active) { #endif default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break; } + + #if ENABLED(PARKING_EXTRUDER) + if (!active && active_extruder == num) // If active extruder's solenoid is disabled, carriage is considered parked + parking_extruder_set_parked(true); + #endif } void enable_solenoid(const uint8_t num) { set_solenoid(num, true); } diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 6a6d7bf9eb..99853f24df 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -595,16 +595,17 @@ void restore_feedrate_and_scaling() { // Software endstops are relative to the tool 0 workspace, so // the movement limits must be shifted by the tool offset to // retain the same physical limit when other tools are selected. - if (old_tool_index != new_tool_index) { - const float offs = hotend_offset[new_tool_index][axis] - hotend_offset[old_tool_index][axis]; - soft_endstop.min[axis] += offs; - soft_endstop.max[axis] += offs; - } - else { - const float offs = hotend_offset[active_extruder][axis]; + + if (new_tool_index == old_tool_index || axis == Z_AXIS) { // The Z axis is "special" and shouldn't be modified + const float offs = (axis == Z_AXIS) ? 0 : hotend_offset[active_extruder][axis]; soft_endstop.min[axis] = base_min_pos(axis) + offs; soft_endstop.max[axis] = base_max_pos(axis) + offs; } + else { + const float diff = hotend_offset[new_tool_index][axis] - hotend_offset[old_tool_index][axis]; + soft_endstop.min[axis] += diff; + soft_endstop.max[axis] += diff; + } #else diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index f3f3ee0595..7f581131d8 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -292,8 +292,6 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a return true; } - void parking_extruder_set_parked() { extruder_parked = true; } - inline void parking_extruder_tool_change(const uint8_t new_tool, bool no_move) { if (!no_move) { @@ -378,7 +376,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a planner.synchronize(); // Always sync the final move DEBUG_POS("PE Tool-Change done.", current_position); - extruder_parked = false; + parking_extruder_set_parked(false); } else if (do_solenoid_activation) { // && nomove == true // Deactivate current extruder solenoid diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index d908b496ae..6b739604f0 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -93,8 +93,9 @@ void pe_solenoid_init(); + extern bool extruder_parked; + inline void parking_extruder_set_parked(const bool parked) { extruder_parked = parked; } bool parking_extruder_unpark_after_homing(const uint8_t final_tool, bool homed_towards_final_tool); - void parking_extruder_set_parked(); #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) From e3cd293f4e726673cde29325aa9b13cf62990a50 Mon Sep 17 00:00:00 2001 From: FanDjango <51046875+FanDjango@users.noreply.github.com> Date: Tue, 5 Jan 2021 06:57:58 +0100 Subject: [PATCH 0843/1370] Adjustable precision in M105 temperature report (#20602) Co-authored-by: Scott Lahteine --- Marlin/src/module/temperature.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 327f43dc03..3c10354d02 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -3007,8 +3007,9 @@ void Temperature::tick() { if (e >= 0) SERIAL_CHAR('0' + e); #endif SERIAL_CHAR(':'); - SERIAL_ECHO(c); - SERIAL_ECHOPAIR(" /" , t); + SERIAL_PRINT(c, _MIN(SERIAL_FLOAT_PRECISION, 2)); + SERIAL_ECHOPGM(" /"); + SERIAL_PRINT(t, _MIN(SERIAL_FLOAT_PRECISION, 2)); #if ENABLED(SHOW_TEMP_ADC_VALUES) SERIAL_ECHOPAIR(" (", r * RECIPROCAL(OVERSAMPLENR)); SERIAL_CHAR(')'); From c64a5a4b8fda56d3d057158440cccfe0e1fe5e51 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 5 Jan 2021 13:18:09 +0100 Subject: [PATCH 0844/1370] Temperature report followup (#20687) Co-authored-by: Scott Lahteine --- Marlin/src/module/temperature.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 3c10354d02..924d796bfc 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1404,8 +1404,7 @@ void Temperature::manage_heater() { SERIAL_ECHOPGM(" M305 "); else SERIAL_ECHO_START(); - SERIAL_CHAR('P'); - SERIAL_CHAR('0' + t_index); + SERIAL_CHAR('P', '0' + t_index); const user_thermistor_t &t = user_thermistor[t_index]; @@ -3001,15 +3000,19 @@ void Temperature::tick() { default: k = 'B'; break; #endif } - SERIAL_CHAR(' '); - SERIAL_CHAR(k); + SERIAL_CHAR(' ', k); #if HAS_MULTI_HOTEND if (e >= 0) SERIAL_CHAR('0' + e); #endif + #ifdef SERIAL_FLOAT_PRECISION + #define SFP _MIN(SERIAL_FLOAT_PRECISION, 2) + #else + #define SFP 2 + #endif SERIAL_CHAR(':'); - SERIAL_PRINT(c, _MIN(SERIAL_FLOAT_PRECISION, 2)); + SERIAL_PRINT(c, SFP); SERIAL_ECHOPGM(" /"); - SERIAL_PRINT(t, _MIN(SERIAL_FLOAT_PRECISION, 2)); + SERIAL_PRINT(t, SFP); #if ENABLED(SHOW_TEMP_ADC_VALUES) SERIAL_ECHOPAIR(" (", r * RECIPROCAL(OVERSAMPLENR)); SERIAL_CHAR(')'); From d10c7347300e08a0961f6cc79128585e0b19cda7 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 6 Jan 2021 01:21:08 +1300 Subject: [PATCH 0845/1370] No BTN_ENC_EN on Anet 10 (#20684) --- Marlin/src/pins/sanguino/pins_ANET_10.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index 10fee8bcf1..fb1b6dbb3c 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -198,14 +198,8 @@ #endif - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder - #endif - #else - #define SERVO0_PIN 27 - #endif #ifndef FIL_RUNOUT_PIN From fd7e34312a8fc10d929ff65b65e79b7f7bc24ee6 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 6 Jan 2021 01:22:51 +1300 Subject: [PATCH 0846/1370] Define SANGUINOLOLU 1.1 enable pins (#20682) --- Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index 69b351e3fc..ffed79de79 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -106,10 +106,10 @@ #else #define HEATER_BED_PIN 14 // (bed) - #define X_ENABLE_PIN -1 - #define Y_ENABLE_PIN -1 - #define Z_ENABLE_PIN -1 - #define E0_ENABLE_PIN -1 + #define X_ENABLE_PIN 4 + #define Y_ENABLE_PIN 4 + #define Z_ENABLE_PIN 4 + #define E0_ENABLE_PIN 4 #endif From aa5ac6c3b2c8592842fab314a64b1ff3f75df4e8 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 6 Jan 2021 01:23:56 +1300 Subject: [PATCH 0847/1370] Fix Azteeg X3 macro typo (#20681) --- Marlin/src/pins/ramps/pins_AZTEEG_X3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h index e919b30cf9..6ddd2a5165 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h @@ -72,7 +72,7 @@ // // Misc // -#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT, STAT_LED_RED) && STAT_LED_RED_PIN == CASE_LIGHT_PIN +#if ENABLED(CASE_LIGHT_ENABLE) && PINS_EXIST(CASE_LIGHT, STAT_LED_RED) && STAT_LED_RED_PIN == CASE_LIGHT_PIN #undef STAT_LED_RED_PIN #endif From 5ef0475dc5cd8caecaef7e4fe5398b49b8558874 Mon Sep 17 00:00:00 2001 From: wilbur4321 Date: Tue, 5 Jan 2021 15:03:45 -0800 Subject: [PATCH 0848/1370] Multi-Z stepper inverting (#20678) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 4 ++-- Marlin/Configuration_adv.h | 9 +++++++-- Marlin/src/inc/Conditionals_adv.h | 16 ++++++++++------ Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 15 +++++---------- Marlin/src/module/stepper.cpp | 11 ++++++++--- 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c283c86dd5..ab112894b1 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1089,7 +1089,7 @@ //#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing //#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors -// Require minimum nozzle and/or bed temperature for probing. +// Require minimum nozzle and/or bed temperature for probing //#define PREHEAT_BEFORE_PROBING #if ENABLED(PREHEAT_BEFORE_PROBING) #define PROBING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time @@ -2428,7 +2428,7 @@ //#define TOUCH_CALIBRATION_Y -8981 //#define TOUCH_OFFSET_X -43 //#define TOUCH_OFFSET_Y 257 - //#define TOUCH_ORIENTATION TOUCH_LANDSCAPE + //#define TOUCH_ORIENTATION TOUCH_LANDSCAPE #if ENABLED(TFT_COLOR_UI) //#define SINGLE_TOUCH_NAVIGATION diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0a51c795dc..c176064693 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -552,7 +552,7 @@ //#define X_DUAL_STEPPER_DRIVERS #if ENABLED(X_DUAL_STEPPER_DRIVERS) - #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define INVERT_X2_VS_X_DIR // Enable if X2 direction signal is opposite to X //#define X_DUAL_ENDSTOPS #if ENABLED(X_DUAL_ENDSTOPS) #define X2_USE_ENDSTOP _XMAX_ @@ -562,7 +562,7 @@ //#define Y_DUAL_STEPPER_DRIVERS #if ENABLED(Y_DUAL_STEPPER_DRIVERS) - #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define INVERT_Y2_VS_Y_DIR // Enable if Y2 direction signal is opposite to Y //#define Y_DUAL_ENDSTOPS #if ENABLED(Y_DUAL_ENDSTOPS) #define Y2_USE_ENDSTOP _YMAX_ @@ -576,6 +576,11 @@ #define NUM_Z_STEPPER_DRIVERS 1 // (1-4) Z options change based on how many #if NUM_Z_STEPPER_DRIVERS > 1 + // Enable if Z motor direction signals are the opposite of Z1 + //#define INVERT_Z2_VS_Z_DIR + //#define INVERT_Z3_VS_Z_DIR + //#define INVERT_Z4_VS_Z_DIR + //#define Z_MULTI_ENDSTOPS #if ENABLED(Z_MULTI_ENDSTOPS) #define Z2_USE_ENDSTOP _XMAX_ diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index dda0298740..d650d32216 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -211,14 +211,18 @@ #if DISABLED(Y_DUAL_STEPPER_DRIVERS) #undef Y2_DRIVER_TYPE #endif -#if NUM_Z_STEPPER_DRIVERS < 2 - #undef Z2_DRIVER_TYPE -#endif -#if NUM_Z_STEPPER_DRIVERS < 3 - #undef Z3_DRIVER_TYPE -#endif + #if NUM_Z_STEPPER_DRIVERS < 4 #undef Z4_DRIVER_TYPE + #undef INVERT_Z4_VS_Z_DIR + #if NUM_Z_STEPPER_DRIVERS < 3 + #undef Z3_DRIVER_TYPE + #undef INVERT_Z3_VS_Z_DIR + #if NUM_Z_STEPPER_DRIVERS < 2 + #undef Z2_DRIVER_TYPE + #undef INVERT_Z2_VS_Z_DIR + #endif + #endif #endif // diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index 8914bc560e..7d36a02d67 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -60,16 +60,11 @@ uint8_t L64XX_Marlin::dir_commands[MAX_L64XX]; // array to hold direction comma const uint8_t L64XX_Marlin::index_to_dir[MAX_L64XX] = { INVERT_X_DIR, INVERT_Y_DIR, INVERT_Z_DIR - , (INVERT_X_DIR) // X2 - #if ENABLED(X_DUAL_STEPPER_DRIVERS) - ^ ENABLED(INVERT_X2_VS_X_DIR) - #endif - , (INVERT_Y_DIR) // Y2 - #if ENABLED(Y_DUAL_STEPPER_DRIVERS) - ^ ENABLED(INVERT_Y2_VS_Y_DIR) - #endif - , INVERT_Z_DIR, INVERT_Z_DIR, INVERT_Z_DIR // Z2,Z3,Z4 - + , (INVERT_X_DIR) ^ BOTH(X_DUAL_STEPPER_DRIVERS, INVERT_X2_VS_X_DIR) // X2 + , (INVERT_Y_DIR) ^ BOTH(Y_DUAL_STEPPER_DRIVERS, INVERT_Y2_VS_Y_DIR) // Y2 + , (INVERT_Z_DIR) ^ ENABLED(INVERT_Z2_VS_Z_DIR) // Z2 + , (INVERT_Z_DIR) ^ ENABLED(INVERT_Z3_VS_Z_DIR) // Z3 + , (INVERT_Z_DIR) ^ ENABLED(INVERT_Z4_VS_Z_DIR) // Z4 , INVERT_E0_DIR, INVERT_E1_DIR, INVERT_E2_DIR, INVERT_E3_DIR , INVERT_E4_DIR, INVERT_E5_DIR, INVERT_E6_DIR, INVERT_E7_DIR }; diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 8b4bc23cb9..c92dd4512d 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -381,7 +381,10 @@ xyze_int8_t Stepper::count_direction{0}; #endif #if NUM_Z_STEPPER_DRIVERS == 4 - #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); Z4_DIR_WRITE(v); }while(0) + #define Z_APPLY_DIR(v,Q) do{ \ + Z_DIR_WRITE(v); Z2_DIR_WRITE((v) ^ ENABLED(INVERT_Z2_VS_Z_DIR)); \ + Z3_DIR_WRITE((v) ^ ENABLED(INVERT_Z3_VS_Z_DIR)); Z4_DIR_WRITE((v) ^ ENABLED(INVERT_Z4_VS_Z_DIR)); \ + }while(0) #if ENABLED(Z_MULTI_ENDSTOPS) #define Z_APPLY_STEP(v,Q) QUAD_ENDSTOP_APPLY_STEP(Z,v) #elif ENABLED(Z_STEPPER_AUTO_ALIGN) @@ -390,7 +393,9 @@ xyze_int8_t Stepper::count_direction{0}; #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); Z4_STEP_WRITE(v); }while(0) #endif #elif NUM_Z_STEPPER_DRIVERS == 3 - #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); }while(0) + #define Z_APPLY_DIR(v,Q) do{ \ + Z_DIR_WRITE(v); Z2_DIR_WRITE((v) ^ ENABLED(INVERT_Z2_VS_Z_DIR)); Z3_DIR_WRITE((v) ^ ENABLED(INVERT_Z3_VS_Z_DIR)); \ + }while(0) #if ENABLED(Z_MULTI_ENDSTOPS) #define Z_APPLY_STEP(v,Q) TRIPLE_ENDSTOP_APPLY_STEP(Z,v) #elif ENABLED(Z_STEPPER_AUTO_ALIGN) @@ -399,7 +404,7 @@ xyze_int8_t Stepper::count_direction{0}; #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); }while(0) #endif #elif NUM_Z_STEPPER_DRIVERS == 2 - #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }while(0) + #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE((v) ^ ENABLED(INVERT_Z2_VS_Z_DIR)); }while(0) #if ENABLED(Z_MULTI_ENDSTOPS) #define Z_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Z,v) #elif ENABLED(Z_STEPPER_AUTO_ALIGN) From 32caeecffba04ee59c525f0c134b0a46082eb191 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 5 Jan 2021 21:03:13 -0600 Subject: [PATCH 0849/1370] Custom build_flags by feature (#20692) --- .../PlatformIO/scripts/common-dependencies.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 24a2eadf9a..73c1727d6a 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -75,7 +75,7 @@ def add_to_feat_cnf(feature, flines): parts = dep.split('=') name = parts.pop(0) rest = '='.join(parts) - if name in ['extra_scripts', 'src_filter', 'lib_ignore']: + if name in ['build_flags', 'extra_scripts', 'src_filter', 'lib_ignore']: feat[name] = rest else: feat['lib_deps'] += [dep] @@ -132,8 +132,7 @@ def force_ignore_unused_libs(): known_libs = get_all_known_libs() diff = (list(set(known_libs) - set(env_libs))) lib_ignore = env.GetProjectOption('lib_ignore') + diff - if verbose: - print("Ignore libraries:", lib_ignore) + blab(f'Ignore libraries: {lib_ignore}') set_env_field('lib_ignore', lib_ignore) def apply_features_config(): @@ -145,7 +144,7 @@ def apply_features_config(): feat = FEATURE_CONFIG[feature] if 'lib_deps' in feat and len(feat['lib_deps']): - blab("Adding lib_deps for %s... " % feature) + blab(f'Adding lib_deps for {feature}...') # feat to add deps_to_add = {} @@ -172,12 +171,18 @@ def apply_features_config(): # Only add the missing dependencies set_env_field('lib_deps', deps + list(deps_to_add.values())) + if 'build_flags' in feat: + f = feat['build_flags'] + blab(f'Adding build_flags for {feature}: {f}') + new_flags = env.GetProjectOption('build_flags') + [ f ] + env.Replace(BUILD_FLAGS=new_flags) + if 'extra_scripts' in feat: - blab("Running extra_scripts for %s... " % feature) + blab(f'Running extra_scripts for {feature}...') env.SConscript(feat['extra_scripts'], exports="env") if 'src_filter' in feat: - blab("Adding src_filter for %s... " % feature) + blab(f'Adding src_filter for {feature}...') src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder my_srcs = re.findall( r'[+-](<.*?>)', feat['src_filter']) @@ -191,7 +196,7 @@ def apply_features_config(): env.Replace(SRC_FILTER=src_filter) if 'lib_ignore' in feat: - blab("Adding lib_ignore for %s... " % feature) + blab(f'Adding lib_ignore for {feature}...') lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] set_env_field('lib_ignore', lib_ignore) @@ -243,7 +248,7 @@ def search_compiler(): return filepath filepath = env.get('CXX') - blab("Couldn't find a compiler! Fallback to %s" % filepath) + blab(f"Couldn't find a compiler! Fallback to {filepath}") return filepath # From 92eee0386f3cf425d67abfe21bfee89de20fa9a8 Mon Sep 17 00:00:00 2001 From: Java Date: Thu, 7 Jan 2021 07:57:11 +0500 Subject: [PATCH 0850/1370] Preheat before Power Loss Recovery homing (#20697) --- Marlin/src/feature/powerloss.cpp | 63 ++++++++++++++------------------ 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index c679e6b68f..0e669a74d4 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -342,6 +342,30 @@ void PrintJobRecovery::resume() { gcode.process_subcommands_now_P(PSTR("M420 S0 Z0")); #endif + #if HAS_HEATED_BED + const int16_t bt = info.target_temperature_bed; + if (bt) { + // Restore the bed temperature + sprintf_P(cmd, PSTR("M190 S%i"), bt); + gcode.process_subcommands_now(cmd); + } + #endif + + // Restore all hotend temperatures + #if HAS_HOTEND + HOTEND_LOOP() { + const int16_t et = info.target_temperature[e]; + if (et) { + #if HAS_MULTI_HOTEND + sprintf_P(cmd, PSTR("T%i S"), e); + gcode.process_subcommands_now(cmd); + #endif + sprintf_P(cmd, PSTR("M109 S%i"), et); + gcode.process_subcommands_now(cmd); + } + } + #endif + // Reset E, raise Z, home XY... #if Z_HOME_DIR > 0 @@ -353,20 +377,11 @@ void PrintJobRecovery::resume() { #else // "G92.9 E0 ..." - // Set Z to 0, raise Z by info.zraise, and Home (XY only for Cartesian) - // with no raise. (Only do simulated homing in Marlin Dev Mode.) - - sprintf_P(cmd, PSTR("G92.9 E0 " - #if ENABLED(BACKUP_POWER_SUPPLY) - "Z%s" // Z was already raised at outage - #else - "Z0\nG1Z%s" // Set Z=0 and Raise Z now - #endif - ), - dtostrf(info.zraise, 1, 3, str_1) - ); + // If a Z raise occurred at outage restore Z, otherwise raise Z now + sprintf_P(cmd, PSTR("G92.9 E0 " TERN(BACKUP_POWER_SUPPLY, "Z%s", "Z0\nG1Z%s")), dtostrf(info.zraise, 1, 3, str_1)); gcode.process_subcommands_now(cmd); + // Home safely with no Z raise gcode.process_subcommands_now_P(PSTR( "G28R0" // No raise during G28 #if IS_CARTESIAN && DISABLED(POWER_LOSS_RECOVER_ZHOME) @@ -404,30 +419,6 @@ void PrintJobRecovery::resume() { #endif #endif - #if HAS_HEATED_BED - const int16_t bt = info.target_temperature_bed; - if (bt) { - // Restore the bed temperature - sprintf_P(cmd, PSTR("M190 S%i"), bt); - gcode.process_subcommands_now(cmd); - } - #endif - - // Restore all hotend temperatures - #if HAS_HOTEND - HOTEND_LOOP() { - const int16_t et = info.target_temperature[e]; - if (et) { - #if HAS_MULTI_HOTEND - sprintf_P(cmd, PSTR("T%i S"), e); - gcode.process_subcommands_now(cmd); - #endif - sprintf_P(cmd, PSTR("M109 S%i"), et); - gcode.process_subcommands_now(cmd); - } - } - #endif - // Select the previously active tool (with no_move) #if HAS_MULTI_EXTRUDER sprintf_P(cmd, PSTR("T%i S"), info.active_extruder); From 074d3f626633dc9e5f80e2cdaf379c504a876551 Mon Sep 17 00:00:00 2001 From: TheCodeExorcist <63008968+TheCodeExorcist@users.noreply.github.com> Date: Thu, 7 Jan 2021 04:13:15 +0100 Subject: [PATCH 0851/1370] Improved MKS Robin support (#19333) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 120 +++++++++++++++++------ 1 file changed, 90 insertions(+), 30 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index ae9419ab79..99e0f0be2a 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -42,15 +42,20 @@ #define DISABLE_JTAG // -// Enable SD EEPROM to prevent infinite boot loop +// EEPROM // -#ifdef ARDUINO_ARCH_STM32 - #define FLASH_EEPROM_EMULATION +#if NO_EEPROM_SELECTED + #ifdef ARDUINO_ARCH_STM32 + #define FLASH_EEPROM_EMULATION + #else + #define SDCARD_EEPROM_EMULATION + #endif +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE (EEPROM_PAGE_SIZE) -#else - #define SDCARD_EEPROM_EMULATION #endif // @@ -102,27 +107,56 @@ #define TEMP_BED_PIN PC0 // TB1 // -// Heaters / Fans +// Heaters // #define HEATER_0_PIN PC7 // HEATER1 #define HEATER_1_PIN PA6 // HEATER2 #define HEATER_BED_PIN PC6 // HOT BED +// +// Fan +// #define FAN_PIN PA7 // FAN -/** - * Note: MKS Robin board is using SPI2 interface. Make sure your stm32duino library is configured accordingly - */ +// +// Thermocouples +// //#define MAX6675_SS_PIN PE5 // TC1 - CS1 //#define MAX6675_SS_PIN PE6 // TC2 - CS2 -#define POWER_LOSS_PIN PA2 // PW_DET -#define PS_ON_PIN PA3 // PW_OFF +// +// Filament runout sensor +// #define FIL_RUNOUT_PIN PF11 // MT_DET +// +// Power loss detection +// +#define POWER_LOSS_PIN PA2 // PW_DET + +// +// Power supply control +// +#define PS_ON_PIN PA3 // PW_OFF + +// +// Piezzoelectric speaker +// #define BEEPER_PIN PC13 + +// +// Activity LED +// #define LED_PIN PB2 +// +// ESP12-S Wi-Fi module +// +#define WIFI_IO0_PIN PG1 + +// +// LCD screen +// #if HAS_FSMC_TFT /** * Note: MKS Robin TFT screens use various TFT controllers @@ -151,6 +185,7 @@ #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 + #define TFT_BUFFER_SIZE 14400 #endif #if NEED_TOUCH_PINS @@ -161,6 +196,7 @@ #define TOUCH_INT_PIN -1 #endif +// SPI2 is shared by LCD touch driver and flash // SPI1(PA7) & SPI3(PB5) not available #define SPI_DEVICE 2 @@ -193,31 +229,55 @@ #define SD_DETECT_PIN -1 #endif +// +// Trinamic TMC2208/2209 UART +// #if HAS_TMC_UART /** - * TMC2208/TMC2209 stepper drivers + * This board does not have dedicated TMC UART pins. Custom wiring is needed. + * You may uncomment one of the options below, or add it to your Configuration.h. * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below + * When using up to four TMC2209 drivers, hardware serial is recommented on + * MSerial0 or MSerial1. + * + * When using TMC2208 or more than four drivers, SoftwareSerial will be needed, + * to provide dedicated pins for each drier. */ - //#define X_HARDWARE_SERIAL MSerial1 - //#define Y_HARDWARE_SERIAL MSerial1 - //#define Z_HARDWARE_SERIAL MSerial1 - //#define E0_HARDWARE_SERIAL MSerial1 - //#define E1_HARDWARE_SERIAL MSerial1 - // Unused servo pins may be repurposed with SoftwareSerialM - //#define X_SERIAL_TX_PIN PF8 // SERVO3_PIN -- XS2 - 6 - //#define Y_SERIAL_TX_PIN PF9 // SERVO2_PIN -- XS2 - 5 - //#define Z_SERIAL_TX_PIN PA1 // SERVO1_PIN -- XS1 - 6 - //#define E0_SERIAL_TX_PIN PC3 // SERVO0_PIN -- XS1 - 5 - //#define X_SERIAL_RX_PIN X_SERIAL_TX_PIN - //#define Y_SERIAL_RX_PIN Y_SERIAL_TX_PIN - //#define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN - //#define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN + //#define TMC_HARDWARE_SERIAL + #if ENABLED(TMC_HARDWARE_SERIAL) + #define X_HARDWARE_SERIAL MSerial0 + #define X2_HARDWARE_SERIAL MSerial0 + #define Y_HARDWARE_SERIAL MSerial0 + #define Y2_HARDWARE_SERIAL MSerial0 + #define Z_HARDWARE_SERIAL MSerial0 + #define Z2_HARDWARE_SERIAL MSerial0 + #define E0_HARDWARE_SERIAL MSerial0 + #define E1_HARDWARE_SERIAL MSerial0 + #endif - // Reduce baud rate for software serial reliability - #if HAS_TMC_SW_SERIAL + //#define TMC_SOFTWARE_SERIAL + #if ENABLED(TMC_SOFTWARE_SERIAL) + #define X_SERIAL_TX_PIN PF8 // SERVO3_PIN -- XS2 - 6 + #define Y_SERIAL_TX_PIN PF9 // SERVO2_PIN -- XS2 - 5 + #define Z_SERIAL_TX_PIN PA1 // SERVO1_PIN -- XS1 - 6 + #define E0_SERIAL_TX_PIN PC3 // SERVO0_PIN -- XS1 - 5 + #define X_SERIAL_RX_PIN X_SERIAL_TX_PIN + #define Y_SERIAL_RX_PIN Y_SERIAL_TX_PIN + #define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN + #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN #define TMC_BAUD_RATE 19200 #endif #endif + +// +// W25Q64 64Mb (8MB) SPI flash +// +#define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x800000 // 8MB + #define W25QXX_CS_PIN PG9 + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif From f19a1833bd7c0276225f4ba773abdf7fe7bdc298 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Fri, 8 Jan 2021 00:55:57 +0100 Subject: [PATCH 0852/1370] Fix M48 output (#20713) --- Marlin/src/gcode/calibrate/M48.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index e70815ad54..46367df10d 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -245,6 +245,7 @@ void GcodeSuite::M48() { SERIAL_ECHO(n + 1); SERIAL_ECHOPAIR(" of ", int(n_samples)); SERIAL_ECHOPAIR_F(": z: ", pz, 3); + SERIAL_CHAR(' '); dev_report(verbose_level > 2, mean, sigma, min, max); SERIAL_EOL(); } From 6a60d47b9020e3073960dfaec63eee32de26bcb1 Mon Sep 17 00:00:00 2001 From: Markus Date: Sat, 9 Jan 2021 01:42:08 +0100 Subject: [PATCH 0853/1370] Up to 6 Tramming points (#20720) --- Marlin/src/feature/tramming.cpp | 6 ++++++ Marlin/src/feature/tramming.h | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/tramming.cpp b/Marlin/src/feature/tramming.cpp index b04995f40a..d03f0cf53b 100644 --- a/Marlin/src/feature/tramming.cpp +++ b/Marlin/src/feature/tramming.cpp @@ -36,6 +36,9 @@ PGMSTR(point_name_3, TRAMMING_POINT_NAME_3); PGMSTR(point_name_4, TRAMMING_POINT_NAME_4); #ifdef TRAMMING_POINT_NAME_5 PGMSTR(point_name_5, TRAMMING_POINT_NAME_5); + #ifdef TRAMMING_POINT_NAME_6 + PGMSTR(point_name_6, TRAMMING_POINT_NAME_6); + #endif #endif #endif @@ -45,6 +48,9 @@ PGM_P const tramming_point_name[] PROGMEM = { , point_name_4 #ifdef TRAMMING_POINT_NAME_5 , point_name_5 + #ifdef TRAMMING_POINT_NAME_6 + , point_name_6 + #endif #endif #endif }; diff --git a/Marlin/src/feature/tramming.h b/Marlin/src/feature/tramming.h index 57b677ae30..eb27fe82fe 100644 --- a/Marlin/src/feature/tramming.h +++ b/Marlin/src/feature/tramming.h @@ -31,17 +31,20 @@ constexpr xy_pos_t screws_tilt_adjust_pos[] = TRAMMING_POINT_XY; #define G35_PROBE_COUNT COUNT(screws_tilt_adjust_pos) -static_assert(G35_PROBE_COUNT >= 3, "TRAMMING_POINT_XY requires at least 3 XY positions."); +static_assert(WITHIN(G35_PROBE_COUNT, 3, 6), "TRAMMING_POINT_XY requires between 3 and 6 XY positions."); #define VALIDATE_TRAMMING_POINT(N) static_assert(N >= G35_PROBE_COUNT || Probe::build_time::can_reach(screws_tilt_adjust_pos[N]), \ "TRAMMING_POINT_XY point " STRINGIFY(N) " is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.") -VALIDATE_TRAMMING_POINT(0); VALIDATE_TRAMMING_POINT(1); VALIDATE_TRAMMING_POINT(2); VALIDATE_TRAMMING_POINT(3); VALIDATE_TRAMMING_POINT(4); +VALIDATE_TRAMMING_POINT(0); VALIDATE_TRAMMING_POINT(1); VALIDATE_TRAMMING_POINT(2); VALIDATE_TRAMMING_POINT(3); VALIDATE_TRAMMING_POINT(4); VALIDATE_TRAMMING_POINT(5); extern const char point_name_1[], point_name_2[], point_name_3[] #ifdef TRAMMING_POINT_NAME_4 , point_name_4[] #ifdef TRAMMING_POINT_NAME_5 , point_name_5[] + #ifdef TRAMMING_POINT_NAME_6 + , point_name_6[] + #endif #endif #endif ; @@ -56,6 +59,10 @@ extern const char point_name_1[], point_name_2[], point_name_3[] #ifdef TRAMMING_POINT_NAME_5 #undef _NR_TRAM_NAMES #define _NR_TRAM_NAMES 5 + #ifdef TRAMMING_POINT_NAME_6 + #undef _NR_TRAM_NAMES + #define _NR_TRAM_NAMES 6 + #endif #endif #endif #endif From c9a9c00f61e1d20198aba532adceba0a49185d12 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 8 Jan 2021 18:51:54 -0600 Subject: [PATCH 0854/1370] Fix Python 2.7 compatibility Fix regression from #20692 --- .../PlatformIO/scripts/common-dependencies.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 73c1727d6a..2f4ad3e502 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -132,7 +132,7 @@ def force_ignore_unused_libs(): known_libs = get_all_known_libs() diff = (list(set(known_libs) - set(env_libs))) lib_ignore = env.GetProjectOption('lib_ignore') + diff - blab(f'Ignore libraries: {lib_ignore}') + blab("Ignore libraries: %s" % lib_ignore) set_env_field('lib_ignore', lib_ignore) def apply_features_config(): @@ -144,7 +144,7 @@ def apply_features_config(): feat = FEATURE_CONFIG[feature] if 'lib_deps' in feat and len(feat['lib_deps']): - blab(f'Adding lib_deps for {feature}...') + blab("Adding lib_deps for %s... " % feature) # feat to add deps_to_add = {} @@ -173,16 +173,16 @@ def apply_features_config(): if 'build_flags' in feat: f = feat['build_flags'] - blab(f'Adding build_flags for {feature}: {f}') + blab("Adding build_flags for %s: %s" % (feature, f)) new_flags = env.GetProjectOption('build_flags') + [ f ] env.Replace(BUILD_FLAGS=new_flags) if 'extra_scripts' in feat: - blab(f'Running extra_scripts for {feature}...') + blab("Running extra_scripts for %s... " % feature) env.SConscript(feat['extra_scripts'], exports="env") if 'src_filter' in feat: - blab(f'Adding src_filter for {feature}...') + blab("Adding src_filter for %s... " % feature) src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder my_srcs = re.findall( r'[+-](<.*?>)', feat['src_filter']) @@ -196,7 +196,7 @@ def apply_features_config(): env.Replace(SRC_FILTER=src_filter) if 'lib_ignore' in feat: - blab(f'Adding lib_ignore for {feature}...') + blab("Adding lib_ignore for %s... " % feature) lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] set_env_field('lib_ignore', lib_ignore) @@ -208,13 +208,13 @@ GCC_PATH_CACHE = os.path.join(ENV_BUILD_PATH, ".gcc_path") def search_compiler(): try: filepath = env.GetProjectOption('custom_gcc') - blab('Getting compiler from env') + blab("Getting compiler from env") return filepath except: pass if os.path.exists(GCC_PATH_CACHE): - blab('Getting g++ path from cache') + blab("Getting g++ path from cache") with open(GCC_PATH_CACHE, 'r') as f: return f.read() @@ -241,14 +241,14 @@ def search_compiler(): filepath = os.path.sep.join([pathdir, filepath]) # Cache the g++ path to no search always if os.path.exists(ENV_BUILD_PATH): - blab('Caching g++ for current env') + blab("Caching g++ for current env") with open(GCC_PATH_CACHE, 'w+') as f: f.write(filepath) return filepath filepath = env.get('CXX') - blab(f"Couldn't find a compiler! Fallback to {filepath}") + blab("Couldn't find a compiler! Fallback to %s" % filepath) return filepath # From 8690f4862df25ba35f3c0aa807d968a9c08973f4 Mon Sep 17 00:00:00 2001 From: Dmitry Katsubo Date: Sat, 9 Jan 2021 01:55:36 +0100 Subject: [PATCH 0855/1370] Fix misc. warnings (#20715) --- Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp | 5 ++--- Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp | 5 ++--- Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp | 3 +-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp index 59734bfbfe..decf74e6e9 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp @@ -43,10 +43,9 @@ static bool isDataProc(uint32_t instr) { } UnwResult UnwStartArm(UnwState * const state) { - bool found = false; uint16_t t = UNW_MAX_INSTR_COUNT; - do { + for (;;) { uint32_t instr; /* Attempt to read the instruction */ @@ -527,7 +526,7 @@ UnwResult UnwStartArm(UnwState * const state) { if (--t == 0) return UNWIND_EXHAUSTED; - } while (!found); + } return UNWIND_UNSUPPORTED; } diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp index be4abd090f..0c6a70649d 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp @@ -30,12 +30,11 @@ static int32_t signExtend11(const uint16_t value) { } UnwResult UnwStartThumb(UnwState * const state) { - bool found = false; uint16_t t = UNW_MAX_INSTR_COUNT; uint32_t lastJumpAddr = 0; // Last JUMP address, to try to detect infinite loops bool loopDetected = false; // If a loop was detected - do { + for (;;) { uint16_t instr; /* Attempt to read the instruction */ @@ -1059,7 +1058,7 @@ UnwResult UnwStartThumb(UnwState * const state) { if (--t == 0) return UNWIND_EXHAUSTED; - } while (!found); + } return UNWIND_SUCCESS; } diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index f97a323350..b3e579e6a4 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -245,9 +245,8 @@ u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire = { u8g_dev_ssd1306_128x64_2x_2_w uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq) { uint8_t is_escape = 0; - uint8_t value; for (;;) { - value = u8g_pgm_read(esc_seq); + uint8_t value = u8g_pgm_read(esc_seq); if (is_escape == 0) { if (value != 255) { if (u8g_WriteByte(u8g, dev, value) == 0 ) From 7c7d28345ed5e4b37c1322d2a3c364257fc31ccf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 2 Jan 2021 16:20:49 -0600 Subject: [PATCH 0856/1370] Optimize some G76 strings --- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 32 ++++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 8ffada5c03..dbe2339f45 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -91,6 +91,12 @@ * - `B` - Run bed temperature calibration. * - `P` - Run probe temperature calibration. */ + +static void say_waiting_for() { SERIAL_ECHOPGM("Waiting for "); } +static void say_waiting_for_probe_heating() { say_waiting_for(); SERIAL_ECHOLNPGM("probe heating."); } +static void say_successfully_calibrated() { SERIAL_ECHOPGM("Successfully calibrated"); } +static void say_failed_to_calibrate() { SERIAL_ECHOPGM("!Failed to calibrate"); } + void GcodeSuite::G76() { // Check if heated bed is available and z-homing is done with probe #if TEMP_SENSOR_BED == 0 || !(HOMING_Z_WITH_PROBE) @@ -108,7 +114,7 @@ void GcodeSuite::G76() { }; auto wait_for_temps = [&](const float tb, const float tp, millis_t &ntr, const millis_t timeout=0) { - SERIAL_ECHOLNPGM("Waiting for bed and probe temperature."); + say_waiting_for(); SERIAL_ECHOLNPGM("bed and probe temperature."); while (fabs(thermalManager.degBed() - tb) > 0.1f || thermalManager.degProbe() > tp) if (report_temps(ntr, timeout)) return true; return false; @@ -184,7 +190,7 @@ void GcodeSuite::G76() { uint16_t target_bed = cali_info_init[TSI_BED].start_temp, target_probe = temp_comp.bed_calib_probe_temp; - SERIAL_ECHOLNPGM("Waiting for cooling."); + say_waiting_for(); SERIAL_ECHOLNPGM(" cooling."); while (thermalManager.degBed() > target_bed || thermalManager.degProbe() > target_probe) report_temps(next_temp_report); @@ -207,7 +213,8 @@ void GcodeSuite::G76() { // Move the nozzle to the probing point and wait for the probe to reach target temp do_blocking_move_to(noz_pos_xyz); - SERIAL_ECHOLNPGM("Waiting for probe heating."); + say_waiting_for_probe_heating(); + SERIAL_EOL(); while (thermalManager.degProbe() < target_probe) report_temps(next_temp_report); @@ -216,10 +223,14 @@ void GcodeSuite::G76() { } SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); - if (temp_comp.finish_calibration(TSI_BED)) - SERIAL_ECHOLNPGM("Successfully calibrated bed."); - else - SERIAL_ECHOLNPGM("!Failed to calibrate bed. Values reset."); + if (temp_comp.finish_calibration(TSI_BED)) { + say_successfully_calibrated(); + SERIAL_ECHOLNPGM(" bed."); + } + else { + say_failed_to_calibrate(); + SERIAL_ECHOLNPGM(" bed. Values reset."); + } // Cleanup thermalManager.setTargetBed(0); @@ -254,7 +265,8 @@ void GcodeSuite::G76() { // Move probe to probing point and wait for it to reach target temperature do_blocking_move_to(noz_pos_xyz); - SERIAL_ECHOLNPAIR("Waiting for probe heating. Bed:", target_bed, " Probe:", target_probe); + say_waiting_for_probe_heating(); + SERIAL_ECHOLNPAIR(" Bed:", target_bed, " Probe:", target_probe); const millis_t probe_timeout_ms = millis() + 900UL * 1000UL; while (thermalManager.degProbe() < target_probe) { if (report_temps(next_temp_report, probe_timeout_ms)) { @@ -271,9 +283,9 @@ void GcodeSuite::G76() { SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); if (temp_comp.finish_calibration(TSI_PROBE)) - SERIAL_ECHOPGM("Successfully calibrated"); + say_successfully_calibrated(); else - SERIAL_ECHOPGM("!Failed to calibrate"); + say_failed_to_calibrate(); SERIAL_ECHOLNPGM(" probe."); // Cleanup From 4e46de66d3d9fe35ed78d165cc83541c8e07f9fc Mon Sep 17 00:00:00 2001 From: Anthony Rich <6941856+antman2@users.noreply.github.com> Date: Sun, 10 Jan 2021 21:50:09 +1000 Subject: [PATCH 0857/1370] Wanhao One+ SD detect pin (#20724) --- Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h index 0abea23a45..715e823393 100644 --- a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h +++ b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h @@ -82,7 +82,7 @@ // // SD Card // -#define SD_DETECT_PIN -1 +#define SD_DETECT_PIN 83 #define SDSS 53 // From 9901b4e9f1baeff96e4d2befc53682cf21d641ca Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Sun, 10 Jan 2021 06:01:25 -0600 Subject: [PATCH 0858/1370] Laser Test Fire (#20452) --- Marlin/Configuration_adv.h | 4 ++++ Marlin/src/feature/spindle_laser.cpp | 3 +++ Marlin/src/feature/spindle_laser.h | 24 +++++++++++++++++++++- Marlin/src/feature/spindle_laser_types.h | 5 +++++ Marlin/src/lcd/language/language_en.h | 2 ++ Marlin/src/lcd/menu/menu_spindle_laser.cpp | 6 ++++++ 6 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index c176064693..7f33e3b3d0 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3055,6 +3055,10 @@ #define SPEED_POWER_MAX 100 // (%) 0-100 #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments) + // Define the minimum and maximum test pulse time values for a laser test fire function + #define LASER_TEST_PULSE_MIN 1 // Used with Laser Control Menu + #define LASER_TEST_PULSE_MAX 999 // Caution: Menu may not show more than 3 characters + /** * Enable inline laser power to be handled in the planner / stepper routines. * Inline power is specified by the I (inline) flag in an M3 command (e.g., M3 S20 I) diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 7e17f393cd..66c04a001c 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -36,6 +36,9 @@ SpindleLaser cutter; uint8_t SpindleLaser::power; +#if ENABLED(LASER_FEATURE) + cutter_test_pulse_t SpindleLaser::testPulse = 50; // Test fire Pulse time ms value. +#endif bool SpindleLaser::isReady; // Ready to apply power setting from the UI to OCR cutter_power_t SpindleLaser::menuPower, // Power set via LCD menu in PWM, PERCENT, or RPM SpindleLaser::unitPower; // LCD status power in PWM, PERCENT, or RPM diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index b0b9c01ec4..57fc136c8c 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -30,6 +30,10 @@ #include "spindle_laser_types.h" +#if USE_BEEPER + #include "../libs/buzzer.h" +#endif + #if ENABLED(LASER_POWER_INLINE) #include "../module/planner.h" #endif @@ -90,6 +94,10 @@ public: static const cutter_power_t mpower_min() { return cpwr_to_upwr(SPEED_POWER_MIN); } static const cutter_power_t mpower_max() { return cpwr_to_upwr(SPEED_POWER_MAX); } + #if ENABLED(LASER_FEATURE) + static cutter_test_pulse_t testPulse; // Test fire Pulse ms value + #endif + static bool isReady; // Ready to apply power setting from the UI to OCR static uint8_t power; @@ -230,7 +238,21 @@ public: } #endif - #endif + #if ENABLED(LASER_FEATURE) + /** + * Test fire the laser using the testPulse ms duration + * Also fires with any PWM power that was previous set + * If not set defaults to 80% power + */ + static inline void test_fire_pulse() { + enable_forward(); // Turn Laser on (Spindle speak but same funct) + TERN_(USE_BEEPER, buzzer.tone(30, 3000)); + delay(testPulse); // Delay for time set by user in pulse ms menu screen. + disable(); // Turn laser off + } + #endif + + #endif // HAS_LCD_MENU #if ENABLED(LASER_POWER_INLINE) /** diff --git a/Marlin/src/feature/spindle_laser_types.h b/Marlin/src/feature/spindle_laser_types.h index c2994fd5c9..0075e54819 100644 --- a/Marlin/src/feature/spindle_laser_types.h +++ b/Marlin/src/feature/spindle_laser_types.h @@ -52,6 +52,11 @@ typedef IF<(SPEED_POWER_MAX > 255), uint16_t, uint8_t>::type cutter_cpower_t; #endif #endif +#if ENABLED(LASER_FEATURE) + typedef uint16_t cutter_test_pulse_t; + #define CUTTER_MENU_PULSE_TYPE uint16_3 +#endif + #if ENABLED(MARLIN_DEV_MODE) typedef uint16_t cutter_frequency_t; #define CUTTER_MENU_FREQUENCY_TYPE uint16_5 diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 25460ed455..1969c98ccc 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -114,6 +114,8 @@ namespace Language_en { PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laser Power"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Pwr"); PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Toggle Laser"); + PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Test Pulse ms"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Fire Pulse"); PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Toggle Spindle"); PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Spindle Forward"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index f11b23d995..93ef224e6f 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -58,6 +58,12 @@ } #endif + #if ENABLED(LASER_FEATURE) + // Setup and fire a test pulse using the current PWM power level for for a duration of test_pulse_min to test_pulse_max ms. + EDIT_ITEM_FAST(CUTTER_MENU_PULSE_TYPE, MSG_LASER_PULSE_MS, &cutter.testPulse, LASER_TEST_PULSE_MIN, LASER_TEST_PULSE_MAX); + ACTION_ITEM(MSG_LASER_FIRE_PULSE, cutter.test_fire_pulse); + #endif + #if BOTH(MARLIN_DEV_MODE, HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 80000, cutter.refresh_frequency); #endif From 4145d85ef15836cda43fa4ef8e5134817d67e33b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 10 Jan 2021 21:37:51 -0600 Subject: [PATCH 0859/1370] Update Slovak glyphs --- Marlin/src/lcd/dogm/fontdata/langdata_sk.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h index d2e7ec2c56..491006e05a 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h @@ -15,9 +15,10 @@ const u8g_fntpgm_uint8_t fontpage_2_186_186[33] U8G_FONT_SECTION("fontpage_2_186 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0x00,0x00, 0x00,0x03,0x0A,0x0A,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40, 0xE0}; -const u8g_fntpgm_uint8_t fontpage_2_190_190[33] U8G_FONT_SECTION("fontpage_2_190_190") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0x00,0x00, - 0x00,0x03,0x0A,0x0A,0x06,0x01,0x00,0xA0,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40, +const u8g_fntpgm_uint8_t fontpage_2_189_190[49] U8G_FONT_SECTION("fontpage_2_189_190") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xBE,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xF8,0x03,0x0A,0x0A,0x06,0x01,0x00,0xA0,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40, 0xE0}; const u8g_fntpgm_uint8_t fontpage_2_199_200[47] U8G_FONT_SECTION("fontpage_2_199_200") = { 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC8,0x00,0x0A,0x00,0x00, @@ -40,7 +41,7 @@ const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253 static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(2, 140, 143, fontpage_2_140_143), // 'ÄŒ' -- 'Ä' FONTDATA_ITEM(2, 186, 186, fontpage_2_186_186), // 'ĺ' -- 'ĺ' - FONTDATA_ITEM(2, 190, 190, fontpage_2_190_190), // 'ľ' -- 'ľ' + FONTDATA_ITEM(2, 189, 190, fontpage_2_189_190), // 'Ľ' -- 'ľ' FONTDATA_ITEM(2, 199, 200, fontpage_2_199_200), // 'Ň' -- 'ň' FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Å ' -- 'Å¡' FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'Å¥' -- 'Å¥' From 928cd1b8ab84c3f55faeb1a53d79f61129cb2207 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 8 Jan 2021 15:07:35 -0600 Subject: [PATCH 0860/1370] Clean up some includes --- Marlin/src/feature/encoder_i2c.cpp | 5 ++--- Marlin/src/feature/joystick.cpp | 1 - Marlin/src/feature/joystick.h | 2 -- Marlin/src/gcode/feature/filwidth/M404-M407.cpp | 1 - Marlin/src/gcode/motion/M290.cpp | 1 - Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 2 -- Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp | 1 - Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp | 1 - Marlin/src/module/stepper.cpp | 1 - 9 files changed, 2 insertions(+), 13 deletions(-) diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index 028e3abe54..dda165edf7 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -34,7 +34,6 @@ #include "encoder_i2c.h" -#include "../module/temperature.h" #include "../module/stepper.h" #include "../gcode/parser.h" @@ -85,7 +84,7 @@ void I2CPositionEncoder::update() { * the encoder would be re-enabled. */ - /* + #if 0 // If the magnetic strength has been good for a certain time, start trusting the module again if (millis() - lastErrorTime > I2CPE_TIME_TRUSTED) { @@ -111,7 +110,7 @@ void I2CPositionEncoder::update() { SERIAL_ECHOLNPGM(")"); #endif } - */ + #endif return; } diff --git a/Marlin/src/feature/joystick.cpp b/Marlin/src/feature/joystick.cpp index d2041598a5..3dca2eb2e9 100644 --- a/Marlin/src/feature/joystick.cpp +++ b/Marlin/src/feature/joystick.cpp @@ -32,7 +32,6 @@ #include "../inc/MarlinConfig.h" // for pins #include "../module/planner.h" -#include "../module/temperature.h" Joystick joystick; diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h index 1d25a30cc2..0c2616671b 100644 --- a/Marlin/src/feature/joystick.h +++ b/Marlin/src/feature/joystick.h @@ -27,8 +27,6 @@ #include "../inc/MarlinConfigPre.h" #include "../core/types.h" -#include "../core/macros.h" -#include "../module/temperature.h" class Joystick { friend class Temperature; diff --git a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp index 516289fe27..a70f7a61fe 100644 --- a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp +++ b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp @@ -26,7 +26,6 @@ #include "../../../feature/filwidth.h" #include "../../../module/planner.h" -#include "../../../module/temperature.h" #include "../../../MarlinCore.h" #include "../../gcode.h" diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index 18cc161fce..df8dad7999 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -27,7 +27,6 @@ #include "../gcode.h" #include "../../feature/babystep.h" #include "../../module/probe.h" -#include "../../module/temperature.h" #include "../../module/planner.h" #if ENABLED(BABYSTEP_ZPROBE_OFFSET) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index 8577b76ce6..c7cd76733f 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -33,11 +33,9 @@ #include "../../ui_api.h" #include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" #include "../../../../module/motion.h" #include "../../../../gcode/queue.h" #include "../../../../module/planner.h" -#include "../../../../sd/cardreader.h" #include "../../../../libs/duration_t.h" #include "../../../../module/printcounter.h" #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 0989b95f82..54ae27d968 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -33,7 +33,6 @@ #include "../../../../gcode/gcode.h" #include "../../../../gcode/queue.h" #include "../../../../module/planner.h" -#include "../../../../module/temperature.h" #include "../../../../inc/MarlinConfig.h" #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 58f9f4fce6..1b611aba60 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -27,7 +27,6 @@ #include #include "../../../../gcode/gcode.h" -#include "../../../../module/temperature.h" #include "../../../../module/planner.h" #include "../../../../module/motion.h" #include "../../../../sd/cardreader.h" diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index c92dd4512d..466f4f333a 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -91,7 +91,6 @@ Stepper stepper; // Singleton #include "planner.h" #include "motion.h" -#include "temperature.h" #include "../lcd/marlinui.h" #include "../gcode/queue.h" #include "../sd/cardreader.h" From 7e188c48e1f711cd1f7148100ddf0af607b0df70 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 7 Jan 2021 18:26:43 -0600 Subject: [PATCH 0861/1370] Tweak STM32F1 pin r/w/t --- Marlin/src/HAL/STM32/fastio.h | 2 +- Marlin/src/HAL/STM32F1/fastio.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h index ea28b8f3bf..17751c44dd 100644 --- a/Marlin/src/HAL/STM32/fastio.h +++ b/Marlin/src/HAL/STM32/fastio.h @@ -59,7 +59,7 @@ void FastIO_init(); // Must be called before using fast io macros #endif #define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->IDR, _BV32(STM_PIN(digitalPinToPinName(IO))))) -#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->ODR ^= _BV32(STM_PIN(digitalPinToPinName(IO)))) +#define _TOGGLE(IO) TBI32(FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->ODR, STM_PIN(digitalPinToPinName(IO))) #define _GET_MODE(IO) #define _SET_MODE(IO,M) pinMode(IO, M) diff --git a/Marlin/src/HAL/STM32F1/fastio.h b/Marlin/src/HAL/STM32F1/fastio.h index a618fccc57..e75254d692 100644 --- a/Marlin/src/HAL/STM32F1/fastio.h +++ b/Marlin/src/HAL/STM32F1/fastio.h @@ -29,9 +29,9 @@ #include -#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & (1U << PIN_MAP[IO].gpio_bit) ? HIGH : LOW) -#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = (1U << PIN_MAP[IO].gpio_bit) << ((V) ? 0 : 16)) -#define TOGGLE(IO) (PIN_MAP[IO].gpio_device->regs->ODR = PIN_MAP[IO].gpio_device->regs->ODR ^ (1U << PIN_MAP[IO].gpio_bit)) +#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & _BV32(PIN_MAP[IO].gpio_bit) ? HIGH : LOW) +#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = _BV32(PIN_MAP[IO].gpio_bit) << ((V) ? 0 : 16)) +#define TOGGLE(IO) TBI32(PIN_MAP[IO].gpio_device->regs->ODR, PIN_MAP[IO].gpio_bit) #define _GET_MODE(IO) gpio_get_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit) #define _SET_MODE(IO,M) gpio_set_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit, M) From fa6a2f52e24817d2fa2332745b9c9c4a1ad6f57f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 10 Jan 2021 21:49:19 -0600 Subject: [PATCH 0862/1370] Fix joystick include --- Marlin/src/feature/joystick.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h index 0c2616671b..e8e218b2f9 100644 --- a/Marlin/src/feature/joystick.h +++ b/Marlin/src/feature/joystick.h @@ -27,6 +27,7 @@ #include "../inc/MarlinConfigPre.h" #include "../core/types.h" +#include "../module/temperature.h" class Joystick { friend class Temperature; From be3caa468699169d55d0c129747dcef3d79add4a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 11 Jan 2021 00:55:16 -0300 Subject: [PATCH 0863/1370] NO_SD_DETECT option (#20741) --- Marlin/Configuration_adv.h | 5 ++++- Marlin/src/inc/Conditionals_post.h | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7f33e3b3d0..ca2e02c736 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1388,13 +1388,16 @@ * Set this option to one of the following (or the board's defaults apply): * * LCD - Use the SD drive in the external LCD controller. - * ONBOARD - Use the SD drive on the control board. (No SD_DETECT_PIN. M21 to init.) + * ONBOARD - Use the SD drive on the control board. * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file). * * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ] */ //#define SDCARD_CONNECTION LCD + // Enable if SD detect is rendered useless (e.g., by using an SD extender) + //#define NO_SD_DETECT + #endif // SDSUPPORT /** diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 135867a72b..43ed3fabfe 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -323,6 +323,11 @@ */ #if ENABLED(SDSUPPORT) + // Extender cable doesn't support SD_DETECT_PIN + #if ENABLED(NO_SD_DETECT) + #undef SD_DETECT_PIN + #endif + #if HAS_SD_HOST_DRIVE && SD_CONNECTION_IS(ONBOARD) // // The external SD card is not used. Hardware SPI is used to access the card. From 92f847c8f784bdcdd7e111e8105d11e980bd67c2 Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Mon, 11 Jan 2021 07:59:42 +0200 Subject: [PATCH 0864/1370] Fixes for TFTGLCD (#20734) --- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 57146519a4..44128cc9f8 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -313,7 +313,7 @@ void MarlinUI::init_lcd() { t = 0; #if ENABLED(TFTGLCD_PANEL_SPI) // SPI speed must be less 10MHz - _SET_OUTPUT(TFTGLCD_CS); + SET_OUTPUT(TFTGLCD_CS); WRITE(TFTGLCD_CS, HIGH); spiInit(TERN(__STM32F1__, SPI_QUARTER_SPEED, SPI_FULL_SPEED)); WRITE(TFTGLCD_CS, LOW); @@ -855,13 +855,14 @@ void MarlinUI::draw_status_screen() { void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { if (!PanelDetected) return; ui.encoder_direction_normal(); - lcd.setCursor(0, MIDDLE_Y); + const uint8_t y = TERN0(AUTO_BED_LEVELING_UBL, ui.external_control) ? LCD_HEIGHT - 1 : MIDDLE_Y; + lcd.setCursor(0, y); lcd.write(COLOR_EDIT); lcd_put_u8str_P(pstr); if (value) { lcd.write(':'); - lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), MIDDLE_Y); // Right-justified, padded by spaces - lcd.write(' '); // Overwrite char if value gets shorter + lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), y); // Right-justified, padded by spaces + lcd.write(' '); // Overwrite char if value gets shorter lcd.print(value); lcd.write(' '); lcd.print_line(); From 8eb32cef2433e8cbbc4b89a27eff27886cb7b95c Mon Sep 17 00:00:00 2001 From: devin122 Date: Mon, 11 Jan 2021 02:46:17 -0500 Subject: [PATCH 0865/1370] Fix TMC220x short circuit (#20731) --- Marlin/src/feature/tmc_util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index d27177326b..29bb249cea 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -147,7 +147,7 @@ static TMC_driver_data get_driver_data(TMC2208Stepper &st) { constexpr uint8_t OTPW_bp = 0, OT_bp = 1; - constexpr uint8_t S2G_bm = 0b11110; // 2..5 + constexpr uint8_t S2G_bm = 0b111100; // 2..5 TMC_driver_data data; const auto ds = data.drv_status = st.DRV_STATUS(); data.is_otpw = TEST(ds, OTPW_bp); @@ -291,7 +291,7 @@ bool should_step_down = false; if (need_update_error_counters) { - if (data.is_ot /* | data.s2ga | data.s2gb*/) st.error_count++; + if (data.is_ot | data.is_s2g) st.error_count++; else if (st.error_count > 0) st.error_count--; #if ENABLED(STOP_ON_ERROR) From 55709b9d2cebdea036761925c8f42da305c4efd3 Mon Sep 17 00:00:00 2001 From: Johan van der Vyver <9843081+jvandervyver@users.noreply.github.com> Date: Wed, 13 Jan 2021 02:05:49 +0200 Subject: [PATCH 0866/1370] Multi-platform DWIN_CREALITY_LCD support (#20738) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/STM32F1/HAL.h | 5 ++- Marlin/src/MarlinCore.cpp | 3 +- Marlin/src/inc/Conditionals_LCD.h | 3 ++ Marlin/src/lcd/dwin/dwin_lcd.cpp | 15 +++++-- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 21 ++++++---- Marlin/src/lcd/dwin/e3v2/dwin.h | 3 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 15 +++---- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 39 +++++++++---------- Marlin/src/module/settings.cpp | 4 -- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 15 ++++++- 10 files changed, 73 insertions(+), 50 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 7163db43a2..a193fe05c8 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -109,8 +109,9 @@ #else #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." #endif - - #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() + #if HAS_DGUS_LCD + #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() + #endif #endif // Set interrupt grouping for this MCU diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 343700e9f7..f994e2e32c 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -995,8 +995,9 @@ void setup() { #endif MYSERIAL0.begin(BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; + millis_t serial_connect_timeout = millis() + 1000UL; while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #if HAS_MULTI_SERIAL && !HAS_ETHERNET MYSERIAL1.begin(BAUDRATE); serial_connect_timeout = millis() + 1000UL; diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 79b65e7a9b..a5bb24f27c 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -651,6 +651,9 @@ #if ENABLED(DWIN_CREALITY_LCD) #define SERIAL_CATCHALL 0 + #ifndef LCD_SERIAL_PORT + #define LCD_SERIAL_PORT 3 // Creality 4.x board + #endif #endif /** diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 7d1528bed1..1978c6a4f8 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -82,20 +82,27 @@ inline void DWIN_String(size_t &i, const __FlashStringHelper * string) { // Send the data in the buffer and the packet end inline void DWIN_Send(size_t &i) { ++i; - LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); delayMicroseconds(1); } - LOOP_L_N(n, 4) { MYSERIAL1.write(DWIN_BufTail[n]); delayMicroseconds(1); } + LOOP_L_N(n, i) { LCD_SERIAL.write(DWIN_SendBuf[n]); delayMicroseconds(1); } + LOOP_L_N(n, 4) { LCD_SERIAL.write(DWIN_BufTail[n]); delayMicroseconds(1); } } /*-------------------------------------- System variable function --------------------------------------*/ // Handshake (1: Success, 0: Fail) bool DWIN_Handshake(void) { + #ifndef LCD_BAUDRATE + #define LCD_BAUDRATE 115200 + #endif + LCD_SERIAL.begin(LCD_BAUDRATE); + const millis_t serial_connect_timeout = millis() + 1000UL; + while (!LCD_SERIAL && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + size_t i = 0; DWIN_Byte(i, 0x00); DWIN_Send(i); - while (MYSERIAL1.available() > 0 && recnum < (signed)sizeof(databuf)) { - databuf[recnum] = MYSERIAL1.read(); + while (LCD_SERIAL.available() > 0 && recnum < (signed)sizeof(databuf)) { + databuf[recnum] = LCD_SERIAL.read(); // ignore the invalid data if (databuf[0] != FHONE) { // prevent the program from running. if (recnum > 0) { diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 5a9d555970..5adf6e8abb 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -497,14 +497,21 @@ inline void Draw_Back_First(const bool is_sel=true) { if (is_sel) Draw_Menu_Cursor(0); } -inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valref) { - if (encoder_diffState == ENCODER_DIFF_CW) - valref += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) - valref -= EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_ENTER) - return true; +#define APPLY_ENCODER_F \ + if (encoder_diffState == ENCODER_DIFF_CW) \ + valref += EncoderRate.encoderMoveValue; \ + else if (encoder_diffState == ENCODER_DIFF_CCW) \ + valref -= EncoderRate.encoderMoveValue; \ + else if (encoder_diffState == ENCODER_DIFF_ENTER) \ + return true; \ return false; + +inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, int16_t &valref) { + APPLY_ENCODER_F +} + +inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, float &valref) { + APPLY_ENCODER_F } // diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 8f17c30609..80bc93dcc5 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -249,7 +249,8 @@ typedef struct { float Move_E_scale = 0; #endif float offset_value = 0; - char show_mode = 0; // -1: Temperature control 0: Printing temperature + TERN_(__STM32F1__, signed) + char show_mode = 0; // -1: Temperature control 0: Printing temperature } HMI_value_t; #define DWIN_CHINESE 123 diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 6d15d937b9..72e5f1d14d 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -592,15 +592,12 @@ void AnycubicTFTClass::GetCommandFromTFT() { } break; case 5: { // A5 GET CURRENT COORDINATE - float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); - float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); - float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); - SEND_PGM("A5V X: "); - LCD_SERIAL.print(xPostition); - SEND_PGM(" Y: "); - LCD_SERIAL.print(yPostition); - SEND_PGM(" Z: "); - LCD_SERIAL.print(zPostition); + const float xPosition = ExtUI::getAxisPosition_mm(ExtUI::X), + yPosition = ExtUI::getAxisPosition_mm(ExtUI::Y), + zPosition = ExtUI::getAxisPosition_mm(ExtUI::Z); + SEND_PGM("A5V X: "); LCD_SERIAL.print(xPosition); + SEND_PGM( " Y: "); LCD_SERIAL.print(yPosition); + SEND_PGM( " Z: "); LCD_SERIAL.print(zPosition); SENDLINE_PGM(""); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index eeeff4fa31..f38145aa80 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -282,27 +282,24 @@ void esp_port_begin(uint8_t interrupt) { dma_init(); } #endif - if (interrupt) { - #if ENABLED(MKS_WIFI_MODULE) - WIFISERIAL.end(); - for (uint16_t i = 0; i < 65535; i++); - WIFISERIAL.begin(WIFI_BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; - while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - //for (uint8_t i=0;i<100;i++)WIFISERIAL.write(0x33); - #endif - } - else { - #if ENABLED(MKS_WIFI_MODULE) - WIFISERIAL.end(); - for (uint16_t i = 0; i < 65535; i++); - WIFISERIAL.begin(WIFI_UPLOAD_BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; - while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - //for (uint16_t i=0;i<65535;i++);//WIFISERIAL.write(0x33); - #endif - dma_init(); - } + + #if ENABLED(MKS_WIFI_MODULE) + WIFISERIAL.end(); + for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } + WIFISERIAL.begin(interrupt ? WIFI_BAUDRATE : WIFI_UPLOAD_BAUDRATE); + + const millis_t serial_connect_timeout = millis() + 1000UL; + while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + + if (interrupt) { + //for (uint8_t i=0;i<100;i++) WIFISERIAL.write(0x33); + } + else { + //for (uint16_t i=0;i<65535;i++); //WIFISERIAL.write(0x33); + } + #endif + + if (!interrupt) dma_init(); } #if ENABLED(MKS_WIFI_MODULE) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index e667696007..0728840f5b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -50,10 +50,6 @@ #include "stepper.h" #include "temperature.h" -#if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/e3v2/dwin.h" -#endif - #include "../lcd/marlinui.h" #include "../libs/vector_3.h" // for matrix_3x3 #include "../gcode/gcode.h" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 7500431d54..2e9aba02cf 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -258,7 +258,20 @@ * EXP2 EXP1 */ -#if HAS_WIRED_LCD && !HAS_BTT_EXP_MOT +#if ENABLED(DWIN_CREALITY_LCD) + + // RET6 DWIN ENCODER LCD + #define BTN_ENC P1_20 + #define BTN_EN1 P1_23 + #define BTN_EN2 P1_22 + + #ifndef BEEPER_PIN + #define BEEPER_PIN P1_21 + #undef SPEAKER + #endif + +#elif HAS_WIRED_LCD && !HAS_BTT_EXP_MOT + #if ENABLED(ANET_FULL_GRAPHICS_LCD_ALT_WIRING) #error "CAUTION! ANET_FULL_GRAPHICS_LCD_ALT_WIRING requires wiring modifications. See 'pins_BTT_SKR_V1_4.h' for details. Comment out this line to continue." From 483804bafdabed6783c9c2ed7ab9a1b48796a3db Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 12 Jan 2021 18:08:16 -0600 Subject: [PATCH 0867/1370] Ok to use C++11 'auto' --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 5adf6e8abb..ca1d7223f1 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -497,21 +497,13 @@ inline void Draw_Back_First(const bool is_sel=true) { if (is_sel) Draw_Menu_Cursor(0); } -#define APPLY_ENCODER_F \ - if (encoder_diffState == ENCODER_DIFF_CW) \ - valref += EncoderRate.encoderMoveValue; \ - else if (encoder_diffState == ENCODER_DIFF_CCW) \ - valref -= EncoderRate.encoderMoveValue; \ - else if (encoder_diffState == ENCODER_DIFF_ENTER) \ - return true; \ - return false; - -inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, int16_t &valref) { - APPLY_ENCODER_F -} - -inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, float &valref) { - APPLY_ENCODER_F +inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valref) { + if (encoder_diffState == ENCODER_DIFF_CW) + valref += EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_CCW) + valref -= EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_ENTER) + return true; } // From bee794e5983d4f1ab404ea9a195b4102d5fa9eed Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 13 Jan 2021 02:38:51 +0100 Subject: [PATCH 0868/1370] Fix comments (#20759) --- Marlin/src/feature/mmu/mmu2.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index 61adcfca72..9e93f95086 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -128,7 +128,6 @@ void MMU2::init() { set_runout_valid(false); #if PIN_EXISTS(MMU2_RST) - // TODO use macros for this WRITE(MMU2_RST_PIN, HIGH); SET_OUTPUT(MMU2_RST_PIN); #endif @@ -955,7 +954,7 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) { /** * Load filament to nozzle of multimaterial printer * - * This function is used only only after T? (user select filament) and M600 (change filament). + * This function is used only after T? (user select filament) and M600 (change filament). * It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading * filament to nozzle. */ From 104aceb44ac91dfd06e3ebe5b3053f2ab97b4d8d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 12 Jan 2021 20:43:52 -0600 Subject: [PATCH 0869/1370] Rotary encoder cleanup (#20753) --- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h | 11 +- Marlin/src/lcd/buttons.h | 234 ++++++++++++++++++ Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp | 144 +++++------ Marlin/src/lcd/dwin/e3v2/rotary_encoder.h | 23 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 18 +- Marlin/src/lcd/lcdprint.h | 18 +- Marlin/src/lcd/marlinui.cpp | 130 ++++------ Marlin/src/lcd/marlinui.h | 142 +---------- Marlin/src/lcd/touch/touch_buttons.cpp | 4 +- Marlin/src/pins/linux/pins_RAMPS_LINUX.h | 14 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 14 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 14 +- Marlin/src/pins/mega/pins_CNCONTROLS_11.h | 6 +- Marlin/src/pins/mega/pins_CNCONTROLS_12.h | 6 +- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 8 +- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 8 +- Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 8 +- Marlin/src/pins/mega/pins_MEGATRONICS_3.h | 8 +- Marlin/src/pins/pinsDebug_list.h | 16 +- Marlin/src/pins/rambo/pins_RAMBO.h | 8 +- Marlin/src/pins/ramps/pins_RAMPS.h | 14 +- Marlin/src/pins/ramps/pins_TT_OSCAR.h | 14 +- Marlin/src/pins/ramps/pins_ULTIMAKER.h | 8 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 8 +- Marlin/src/pins/ramps/pins_ZRIB_V20.h | 6 +- Marlin/src/pins/samd/pins_RAMPS_144.h | 14 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 14 +- Marlin/src/pins/teensy3/pins_TEENSY35_36.h | 6 +- 30 files changed, 484 insertions(+), 438 deletions(-) create mode 100644 Marlin/src/lcd/buttons.h diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 11b8761550..14890bcd6e 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -116,7 +116,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #elif HAS_WIRED_LCD #if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1) #error "Serial port pins (1) conflict with Encoder Buttons!" - #elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \ + #elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK_PIN) \ || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, SD_MISO_PIN, DOGLCD_A0, SD_SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN) #error "Serial port pins (1) conflict with LCD pins!" #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 7ebb9168f6..2547425885 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1595,7 +1595,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * ULTIPANEL encoder */ -#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !defined(SHIFT_CLK) +#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !PIN_EXISTS(SHIFT_CLK) #error "ULTIPANEL controllers require some kind of encoder." #endif diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h index eedcc4afa0..c399b907e4 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h @@ -61,15 +61,12 @@ extern TFTGLCD lcd; #include "../lcdprint.h" // Use panel encoder - free old encoder pins -#undef BTN_EN1 -#undef BTN_EN2 -#undef BTN_ENC -#define BTN_EN1 -1 -#define BTN_EN2 -1 -#define BTN_ENC -1 +#undef BTN_EN1 +#undef BTN_EN2 +#undef BTN_ENC #ifndef EN_C - #define EN_C 4 //for click + #define EN_C 4 // for click #endif #endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/buttons.h b/Marlin/src/lcd/buttons.h new file mode 100644 index 0000000000..07a4524def --- /dev/null +++ b/Marlin/src/lcd/buttons.h @@ -0,0 +1,234 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../inc/MarlinConfig.h" + +#if ((!HAS_ADC_BUTTONS && IS_NEWPANEL) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL + #define HAS_ENCODER_WHEEL 1 +#endif +#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT) + #define HAS_DIGITAL_BUTTONS 1 +#endif +#if !HAS_ADC_BUTTONS && (IS_RRW_KEYPAD || (HAS_WIRED_LCD && !IS_NEWPANEL)) + #define HAS_SHIFT_ENCODER 1 +#endif + +// I2C buttons must be read in the main thread +#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL) + #define HAS_SLOW_BUTTONS 1 +#endif + +#if HAS_ENCODER_WHEEL + #define ENCODER_PHASE_0 0 + #define ENCODER_PHASE_1 2 + #define ENCODER_PHASE_2 3 + #define ENCODER_PHASE_3 1 +#endif + +#if EITHER(HAS_DIGITAL_BUTTONS, DWIN_CREALITY_LCD) + + // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) + #define BLEN_A 0 + #define BLEN_B 1 + + #define EN_A _BV(BLEN_A) + #define EN_B _BV(BLEN_B) + + #define _BUTTON_PRESSED(BN) !READ(BTN_##BN) + + #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS + #define BLEN_C 2 + #define EN_C _BV(BLEN_C) + #endif + + #if ENABLED(LCD_I2C_VIKI) + + #include + + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + // button and encoder bit positions within 'buttons' + #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C + #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET) + #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET) + #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET) + #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET) + + #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used + #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name + #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented. + #else + #define BUTTON_CLICK() (buttons & (B_MI|B_RI)) + #endif + + // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin + + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later + + #define BUTTON_CLICK() (buttons & B_MI) + + #endif + + #endif + +#else + + #undef BUTTON_EXISTS + #define BUTTON_EXISTS(...) false + + // Dummy button, never pressed + #define _BUTTON_PRESSED(BN) false + + // Shift register bits correspond to buttons: + #define BL_LE 7 // Left + #define BL_UP 6 // Up + #define BL_MI 5 // Middle + #define BL_DW 4 // Down + #define BL_RI 3 // Right + #define BL_ST 2 // Red Button + #define B_LE _BV(BL_LE) + #define B_UP _BV(BL_UP) + #define B_MI _BV(BL_MI) + #define B_DW _BV(BL_DW) + #define B_RI _BV(BL_RI) + #define B_ST _BV(BL_ST) + + #ifndef BUTTON_CLICK + #define BUTTON_CLICK() (buttons & (B_MI|B_ST)) + #endif + +#endif + +#if IS_RRW_KEYPAD + #define BTN_OFFSET 0 // Bit offset into buttons for shift register values + + #define BLEN_KEYPAD_F3 0 + #define BLEN_KEYPAD_F2 1 + #define BLEN_KEYPAD_F1 2 + #define BLEN_KEYPAD_DOWN 3 + #define BLEN_KEYPAD_RIGHT 4 + #define BLEN_KEYPAD_MIDDLE 5 + #define BLEN_KEYPAD_UP 6 + #define BLEN_KEYPAD_LEFT 7 + + #define EN_KEYPAD_F1 _BV(BTN_OFFSET + BLEN_KEYPAD_F1) + #define EN_KEYPAD_F2 _BV(BTN_OFFSET + BLEN_KEYPAD_F2) + #define EN_KEYPAD_F3 _BV(BTN_OFFSET + BLEN_KEYPAD_F3) + #define EN_KEYPAD_DOWN _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN) + #define EN_KEYPAD_RIGHT _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT) + #define EN_KEYPAD_MIDDLE _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE) + #define EN_KEYPAD_UP _BV(BTN_OFFSET + BLEN_KEYPAD_UP) + #define EN_KEYPAD_LEFT _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT) + + #define RRK(B) (keypad_buttons & (B)) + + #ifdef EN_C + #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE)) + #else + #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE) + #endif +#endif + +#ifndef EN_A + #define EN_A 0 +#endif +#ifndef EN_B + #define EN_B 0 +#endif +#ifndef EN_C + #define EN_C 0 +#endif +#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL) + #define BLEN_D 3 + #define EN_D _BV(BLEN_D) +#else + #define EN_D 0 +#endif + +#define BUTTON_PRESSED(BN) (_BUTTON_PRESSED_##BN) + +#if BUTTON_EXISTS(EN1) + #define _BUTTON_PRESSED_EN1 _BUTTON_PRESSED(EN1) +#else + #define _BUTTON_PRESSED_EN1 false +#endif +#if BUTTON_EXISTS(EN2) + #define _BUTTON_PRESSED_EN2 _BUTTON_PRESSED(EN2) +#else + #define _BUTTON_PRESSED_EN2 false +#endif +#if BUTTON_EXISTS(ENC_EN) + #define _BUTTON_PRESSED_ENC_EN _BUTTON_PRESSED(ENC_EN) +#else + #define _BUTTON_PRESSED_ENC_EN false +#endif +#if BUTTON_EXISTS(ENC) + #define _BUTTON_PRESSED_ENC _BUTTON_PRESSED(ENC) +#else + #define _BUTTON_PRESSED_ENC false +#endif +#if BUTTON_EXISTS(UP) + #define _BUTTON_PRESSED_UP _BUTTON_PRESSED(UP) +#else + #define _BUTTON_PRESSED_UP false +#endif +#if BUTTON_EXISTS(DWN) + #define _BUTTON_PRESSED_DWN _BUTTON_PRESSED(DWN) +#else + #define _BUTTON_PRESSED_DWN false +#endif +#if BUTTON_EXISTS(LFT) + #define _BUTTON_PRESSED_LFT _BUTTON_PRESSED(LFT) +#else + #define _BUTTON_PRESSED_LFT false +#endif +#if BUTTON_EXISTS(RT) + #define _BUTTON_PRESSED_RT _BUTTON_PRESSED(RT) +#else + #define _BUTTON_PRESSED_RT false +#endif +#if BUTTON_EXISTS(BACK) + #define _BUTTON_PRESSED_BACK _BUTTON_PRESSED(BACK) +#else + #define _BUTTON_PRESSED_BACK false +#endif + +#ifndef BUTTON_CLICK + #if EN_C > 0 + #define BUTTON_CLICK() (buttons & EN_C) + #else + #define BUTTON_CLICK() false + #endif +#endif + +#if EN_D > 0 + #define LCD_BACK_CLICKED() (buttons & EN_D) +#else + #define LCD_BACK_CLICKED() false +#endif diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp index d39c6cfbd5..6c229b7aca 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp @@ -33,6 +33,7 @@ #if ENABLED(DWIN_CREALITY_LCD) #include "rotary_encoder.h" +#include "../../buttons.h" #include "../../../MarlinCore.h" #include "../../../HAL/shared/Delay.h" @@ -43,17 +44,23 @@ #include +#ifndef ENCODER_PULSES_PER_STEP + #define ENCODER_PULSES_PER_STEP 4 +#endif + ENCODER_Rate EncoderRate; // Buzzer -void Encoder_tick(void) { - WRITE(BEEPER_PIN, 1); - delay(10); - WRITE(BEEPER_PIN, 0); +void Encoder_tick() { + #if PIN_EXISTS(BEEPER) + WRITE(BEEPER_PIN, HIGH); + delay(10); + WRITE(BEEPER_PIN, LOW); + #endif } // Encoder initialization -void Encoder_Configuration(void) { +void Encoder_Configuration() { #if BUTTON_EXISTS(EN1) SET_INPUT_PULLUP(BTN_EN1); #endif @@ -63,21 +70,21 @@ void Encoder_Configuration(void) { #if BUTTON_EXISTS(ENC) SET_INPUT_PULLUP(BTN_ENC); #endif - #ifdef BEEPER_PIN + #if PIN_EXISTS(BEEPER) SET_OUTPUT(BEEPER_PIN); #endif } // Analyze encoder value and return state -ENCODER_DiffState Encoder_ReceiveAnalyze(void) { +ENCODER_DiffState Encoder_ReceiveAnalyze() { const millis_t now = millis(); - static unsigned char lastEncoderBits; - unsigned char newbutton = 0; + static uint8_t lastEncoderBits; + uint8_t newbutton = 0; static signed char temp_diff = 0; ENCODER_DiffState temp_diffState = ENCODER_DIFF_NO; - if (BUTTON_PRESSED(EN1)) newbutton |= 0x01; - if (BUTTON_PRESSED(EN2)) newbutton |= 0x02; + if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; + if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; if (BUTTON_PRESSED(ENC)) { static millis_t next_click_update_ms; if (ELAPSED(now, next_click_update_ms)) { @@ -94,22 +101,22 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { } if (newbutton != lastEncoderBits) { switch (newbutton) { - case ENCODER_PHASE_0: { - if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++; + case ENCODER_PHASE_0: + if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++; else if (lastEncoderBits == ENCODER_PHASE_1) temp_diff--; - }break; - case ENCODER_PHASE_1: { - if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++; + break; + case ENCODER_PHASE_1: + if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++; else if (lastEncoderBits == ENCODER_PHASE_2) temp_diff--; - }break; - case ENCODER_PHASE_2: { - if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++; + break; + case ENCODER_PHASE_2: + if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++; else if (lastEncoderBits == ENCODER_PHASE_3) temp_diff--; - }break; - case ENCODER_PHASE_3: { - if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++; + break; + case ENCODER_PHASE_3: + if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++; else if (lastEncoderBits == ENCODER_PHASE_0) temp_diff--; - }break; + break; } lastEncoderBits = newbutton; } @@ -137,9 +144,12 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { } EncoderRate.lastEncoderTime = ms; } + #else + constexpr int32_t encoderMultiplier = 1; - #endif // ENCODER_RATE_MULTIPLIER + + #endif // EncoderRate.encoderMoveValue += (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); EncoderRate.encoderMoveValue = (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); @@ -153,23 +163,23 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { #if PIN_EXISTS(LCD_LED) // Take the low 24 valid bits 24Bit: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0 - unsigned int LED_DataArray[LED_NUM]; + uint16_t LED_DataArray[LED_NUM]; // LED light operation - void LED_Action(void) { + void LED_Action() { LED_Control(RGB_SCALE_WARM_WHITE,0x0F); delay(30); LED_Control(RGB_SCALE_WARM_WHITE,0x00); } // LED initialization - void LED_Configuration(void) { + void LED_Configuration() { SET_OUTPUT(LCD_LED_PIN); } // LED write data - void LED_WriteData(void) { - unsigned char tempCounter_LED, tempCounter_Bit; + void LED_WriteData() { + uint8_t tempCounter_LED, tempCounter_Bit; for (tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) { for (tempCounter_Bit = 0; tempCounter_Bit < 24; tempCounter_Bit++) { if (LED_DataArray[tempCounter_LED] & (0x800000 >> tempCounter_Bit)) { @@ -190,14 +200,13 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { // LED control // RGB_Scale: RGB color ratio // luminance: brightness (0~0xFF) - void LED_Control(unsigned char RGB_Scale, unsigned char luminance) { - unsigned char temp_Counter; - for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { - LED_DataArray[temp_Counter] = 0; + void LED_Control(const uint8_t RGB_Scale, const uint8_t luminance) { + for (uint8_t i = 0; i < LED_NUM; i++) { + LED_DataArray[i] = 0; switch (RGB_Scale) { - case RGB_SCALE_R10_G7_B5: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*5/10; break; - case RGB_SCALE_R10_G7_B4: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*4/10; break; - case RGB_SCALE_R10_G8_B7: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*8/10) << 16 | luminance*7/10; break; + case RGB_SCALE_R10_G7_B5: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 7/10) << 16 | luminance * 5/10; break; + case RGB_SCALE_R10_G7_B4: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 7/10) << 16 | luminance * 4/10; break; + case RGB_SCALE_R10_G8_B7: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 8/10) << 16 | luminance * 7/10; break; } } LED_WriteData(); @@ -207,45 +216,38 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { // RGB_Scale: RGB color ratio // luminance: brightness (0~0xFF) // change_Time: gradient time (ms) - void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval) { - unsigned char temp_Counter; - unsigned char LED_R_Data[LED_NUM], LED_G_Data[LED_NUM], LED_B_Data[LED_NUM]; - bool LED_R_Flag = 0, LED_G_Flag = 0, LED_B_Flag = 0; - - for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { + void LED_GraduallyControl(const uint8_t RGB_Scale, const uint8_t luminance, const uint16_t change_Interval) { + struct { uint8_t g, r, b; } led_data[LED_NUM]; + for (uint8_t i = 0; i < LED_NUM; i++) { switch (RGB_Scale) { - case RGB_SCALE_R10_G7_B5: { - LED_R_Data[temp_Counter] = luminance*10/10; - LED_G_Data[temp_Counter] = luminance*7/10; - LED_B_Data[temp_Counter] = luminance*5/10; - }break; - case RGB_SCALE_R10_G7_B4: { - LED_R_Data[temp_Counter] = luminance*10/10; - LED_G_Data[temp_Counter] = luminance*7/10; - LED_B_Data[temp_Counter] = luminance*4/10; - }break; - case RGB_SCALE_R10_G8_B7: { - LED_R_Data[temp_Counter] = luminance*10/10; - LED_G_Data[temp_Counter] = luminance*8/10; - LED_B_Data[temp_Counter] = luminance*7/10; - }break; + case RGB_SCALE_R10_G7_B5: + led_data[i] = { luminance * 7/10, luminance * 10/10, luminance * 5/10 }; + break; + case RGB_SCALE_R10_G7_B4: + led_data[i] = { luminance * 7/10, luminance * 10/10, luminance * 4/10 }; + break; + case RGB_SCALE_R10_G8_B7: + led_data[i] = { luminance * 8/10, luminance * 10/10, luminance * 7/10 }; + break; } } - for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { - if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) > LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000100; - else if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) < LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000100; - while (1) { - else LED_R_Flag = 1; - if ((unsigned char)(LED_DataArray[temp_Counter]>>16) > LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x010000; - else if ((unsigned char)(LED_DataArray[temp_Counter]>>16) < LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x010000; - else LED_G_Flag = 1; - if ((unsigned char)LED_DataArray[temp_Counter] > LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000001; - else if ((unsigned char)LED_DataArray[temp_Counter] < LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000001; - else LED_B_Flag = 1; + + struct { bool g, r, b; } led_flag = { false, false, false }; + for (uint8_t i = 0; i < LED_NUM; i++) { + while (1) { + const uint8_t g = uint8_t(LED_DataArray[i] >> 16), + r = uint8_t(LED_DataArray[i] >> 8), + b = uint8_t(LED_DataArray[i]); + if (g == led_data[i].g) led_flag.g = true; + else LED_DataArray[i] += (g > led_data[i].g) ? -0x010000 : 0x010000; + if (r == led_data[i].r) led_flag.r = true; + else LED_DataArray[i] += (r > led_data[i].r) ? -0x000100 : 0x000100; + if (b == led_data[i].b) led_flag.b = true; + else LED_DataArray[i] += (b > led_data[i].b) ? -0x000001 : 0x000001; + LED_WriteData(); + if (led_flag.r && led_flag.g && led_flag.b) break; + delay(change_Interval); } - LED_WriteData(); - if (LED_R_Flag && LED_G_Flag && LED_B_Flag) break; - else delay(change_Interval); } } diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h index 93e54839d6..bbba753a0b 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h @@ -34,15 +34,6 @@ /*********************** Encoder Set ***********************/ -#define ENCODER_PHASE_0 0 -#define ENCODER_PHASE_1 2 -#define ENCODER_PHASE_2 3 -#define ENCODER_PHASE_3 1 - -#define ENCODER_PULSES_PER_STEP 4 - -#define BUTTON_PRESSED(BN) !READ(BTN_## BN) - typedef struct { bool enabled = false; int encoderMoveValue = 0; @@ -59,10 +50,10 @@ typedef enum { } ENCODER_DiffState; // Encoder initialization -void Encoder_Configuration(void); +void Encoder_Configuration(); // Analyze encoder value and return state -ENCODER_DiffState Encoder_ReceiveAnalyze(void); +ENCODER_DiffState Encoder_ReceiveAnalyze(); /*********************** Encoder LED ***********************/ @@ -82,23 +73,23 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void); extern unsigned int LED_DataArray[LED_NUM]; // LED light operation - void LED_Action(void); + void LED_Action(); // LED initialization - void LED_Configuration(void); + void LED_Configuration(); // LED write data - void LED_WriteData(void); + void LED_WriteData(); // LED control // RGB_Scale: RGB color ratio // luminance: brightness (0~0xFF) - void LED_Control(unsigned char RGB_Scale, unsigned char luminance); + void LED_Control(const uint8_t RGB_Scale, const uint8_t luminance); // LED gradient control // RGB_Scale: RGB color ratio // luminance: brightness (0~0xFF) // change_Time: gradient time (ms) - void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval); + void LED_GraduallyControl(const uint8_t RGB_Scale, const uint8_t luminance, const uint16_t change_Interval); #endif // LCD_LED diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index f13a4b36cf..097c1aeadc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -468,19 +468,10 @@ void lv_encoder_pin_init() { #if ANY_BUTTON(EN1, EN2, ENC, BACK) uint8_t newbutton = 0; - - #if BUTTON_EXISTS(EN1) - if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; - #endif - #if BUTTON_EXISTS(EN2) - if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; - #endif - #if BUTTON_EXISTS(ENC) - if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; - #endif - #if BUTTON_EXISTS(BACK) - if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; - #endif + if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; + if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; + if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; + if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; #else @@ -488,7 +479,6 @@ void lv_encoder_pin_init() { #endif - static uint8_t buttons = 0; buttons = newbutton; static uint8_t lastEncoderBits; diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index cf34a7ade9..b7732d3198 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -76,8 +76,8 @@ #define INFO_FONT_HEIGHT (INFO_FONT_ASCENT + INFO_FONT_DESCENT) #define INFO_FONT_WIDTH 6 - #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) - #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) + #define LCD_COL_X(col) (( (col)) * (MENU_FONT_WIDTH)) + #define LCD_ROW_Y(row) ((1 + (row)) * (MENU_FONT_HEIGHT)) #else @@ -94,14 +94,18 @@ #define LCD_PIXEL_WIDTH LCD_WIDTH #define LCD_PIXEL_HEIGHT LCD_HEIGHT - #define SETCURSOR(col, row) lcd_moveto(col, row) - #define SETCURSOR_RJ(len, row) SETCURSOR(LCD_WIDTH - (len), row) + #define LCD_COL_X(col) (col) + #define LCD_ROW_Y(row) (row) #endif -#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) -#define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr) -#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) +#define LCD_COL_X_RJ(len) (LCD_PIXEL_WIDTH - LCD_COL_X(len)) +#define LCD_BOTTOM_ROW (LCD_PIXEL_HEIGHT - 1) +#define SETCURSOR(col, row) lcd_moveto(LCD_COL_X(col), LCD_ROW_Y(row)) +#define SETCURSOR_RJ(len, row) lcd_moveto(LCD_COL_X_RJ(len), LCD_ROW_Y(row)) +#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) +#define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr) +#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) int lcd_glyph_height(); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index e59b72f47d..430bfcf48e 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -342,7 +342,6 @@ void MarlinUI::init() { init_lcd(); #if HAS_DIGITAL_BUTTONS - #if BUTTON_EXISTS(EN1) SET_INPUT_PULLUP(BTN_EN1); #endif @@ -352,15 +351,12 @@ void MarlinUI::init() { #if BUTTON_EXISTS(ENC) SET_INPUT_PULLUP(BTN_ENC); #endif - #if BUTTON_EXISTS(ENC_EN) SET_INPUT_PULLUP(BTN_ENC_EN); #endif - #if BUTTON_EXISTS(BACK) SET_INPUT_PULLUP(BTN_BACK); #endif - #if BUTTON_EXISTS(UP) SET_INPUT(BTN_UP); #endif @@ -373,8 +369,7 @@ void MarlinUI::init() { #if BUTTON_EXISTS(RT) SET_INPUT(BTN_RT); #endif - - #endif // !HAS_DIGITAL_BUTTONS + #endif #if HAS_SHIFT_ENCODER @@ -383,14 +378,14 @@ void MarlinUI::init() { SET_OUTPUT(SR_DATA_PIN); SET_OUTPUT(SR_CLK_PIN); - #elif defined(SHIFT_CLK) + #elif PIN_EXISTS(SHIFT_CLK) - SET_OUTPUT(SHIFT_CLK); - OUT_WRITE(SHIFT_LD, HIGH); - #if defined(SHIFT_EN) && SHIFT_EN >= 0 - OUT_WRITE(SHIFT_EN, LOW); + SET_OUTPUT(SHIFT_CLK_PIN); + OUT_WRITE(SHIFT_LD_PIN, HIGH); + #if PIN_EXISTS(SHIFT_EN) + OUT_WRITE(SHIFT_EN_PIN, LOW); #endif - SET_INPUT_PULLUP(SHIFT_OUT); + SET_INPUT_PULLUP(SHIFT_OUT_PIN); #endif @@ -830,11 +825,7 @@ millis_t next_lcd_update_ms; #endif inline bool can_encode() { - #if BUTTON_EXISTS(ENC_EN) - return !BUTTON_PRESSED(ENC_EN); // Update position only when ENC_EN is HIGH - #else - return true; - #endif + return !BUTTON_PRESSED(ENC_EN); // Update encoder only when ENC_EN is not LOW (pressed) } void MarlinUI::update() { @@ -890,18 +881,17 @@ void MarlinUI::update() { else if (!wait_for_unclick && (buttons & EN_C)) // OK button, if not waiting for a debounce release: do_click(); } - else // keep wait_for_unclick value + // keep wait_for_unclick value + #endif - #endif // HAS_TOUCH_BUTTONS - - { - // Integrated LCD click handling via button_pressed - if (!external_control && button_pressed()) { - if (!wait_for_unclick) do_click(); // Handle the click - } - else - wait_for_unclick = false; + if (!touch_buttons) { + // Integrated LCD click handling via button_pressed + if (!external_control && button_pressed()) { + if (!wait_for_unclick) do_click(); // Handle the click } + else + wait_for_unclick = false; + } if (LCD_BACK_CLICKED()) { quick_feedback(); @@ -1198,19 +1188,10 @@ void MarlinUI::update() { #if ANY_BUTTON(EN1, EN2, ENC, BACK) uint8_t newbutton = 0; - - #if BUTTON_EXISTS(EN1) - if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; - #endif - #if BUTTON_EXISTS(EN2) - if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; - #endif - #if BUTTON_EXISTS(ENC) - if (can_encode() && BUTTON_PRESSED(ENC)) newbutton |= EN_C; - #endif - #if BUTTON_EXISTS(BACK) - if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; - #endif + if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; + if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; + if (can_encode() && BUTTON_PRESSED(ENC)) newbutton |= EN_C; + if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; #else @@ -1225,40 +1206,26 @@ void MarlinUI::update() { const int8_t pulses = epps * encoderDirection; - if (false) { - // for the else-ifs below + if (BUTTON_PRESSED(UP)) { + encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses; + next_button_update_ms = now + 300; + } + else if (BUTTON_PRESSED(DWN)) { + encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses; + next_button_update_ms = now + 300; + } + else if (BUTTON_PRESSED(LFT)) { + encoderDiff = -pulses; + next_button_update_ms = now + 300; + } + else if (BUTTON_PRESSED(RT)) { + encoderDiff = pulses; + next_button_update_ms = now + 300; } - #if BUTTON_EXISTS(UP) - else if (BUTTON_PRESSED(UP)) { - encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses; - next_button_update_ms = now + 300; - } - #endif - #if BUTTON_EXISTS(DWN) - else if (BUTTON_PRESSED(DWN)) { - encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses; - next_button_update_ms = now + 300; - } - #endif - #if BUTTON_EXISTS(LFT) - else if (BUTTON_PRESSED(LFT)) { - encoderDiff = -pulses; - next_button_update_ms = now + 300; - } - #endif - #if BUTTON_EXISTS(RT) - else if (BUTTON_PRESSED(RT)) { - encoderDiff = pulses; - next_button_update_ms = now + 300; - } - #endif #endif // UP || DWN || LFT || RT - buttons = (newbutton - #if HAS_SLOW_BUTTONS - | slow_buttons - #endif + buttons = (newbutton | TERN0(HAS_SLOW_BUTTONS, slow_buttons) #if BOTH(HAS_TOUCH_BUTTONS, HAS_ENCODER_ACTION) | (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF)) #endif @@ -1284,13 +1251,13 @@ void MarlinUI::update() { * The rotary encoder part is also independent of the LCD chipset. */ uint8_t val = 0; - WRITE(SHIFT_LD, LOW); - WRITE(SHIFT_LD, HIGH); + WRITE(SHIFT_LD_PIN, LOW); + WRITE(SHIFT_LD_PIN, HIGH); LOOP_L_N(i, 8) { val >>= 1; - if (READ(SHIFT_OUT)) SBI(val, 7); - WRITE(SHIFT_CLK, HIGH); - WRITE(SHIFT_CLK, LOW); + if (READ(SHIFT_OUT_PIN)) SBI(val, 7); + WRITE(SHIFT_CLK_PIN, HIGH); + WRITE(SHIFT_CLK_PIN, LOW); } TERN(REPRAPWORLD_KEYPAD, keypad_buttons, buttons) = ~val; #endif @@ -1306,11 +1273,6 @@ void MarlinUI::update() { #if HAS_ENCODER_WHEEL static uint8_t lastEncoderBits; - #define encrot0 0 - #define encrot1 2 - #define encrot2 3 - #define encrot3 1 - // Manage encoder rotation #define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: encoderDiff += encoderDirection; break; case _E2: encoderDiff -= encoderDirection; } @@ -1319,10 +1281,10 @@ void MarlinUI::update() { if (buttons & EN_B) enc |= B10; if (enc != lastEncoderBits) { switch (enc) { - case encrot0: ENCODER_SPIN(encrot3, encrot1); break; - case encrot1: ENCODER_SPIN(encrot0, encrot2); break; - case encrot2: ENCODER_SPIN(encrot1, encrot3); break; - case encrot3: ENCODER_SPIN(encrot2, encrot0); break; + case ENCODER_PHASE_0: ENCODER_SPIN(ENCODER_PHASE_3, ENCODER_PHASE_1); break; + case ENCODER_PHASE_1: ENCODER_SPIN(ENCODER_PHASE_0, ENCODER_PHASE_2); break; + case ENCODER_PHASE_2: ENCODER_SPIN(ENCODER_PHASE_1, ENCODER_PHASE_3); break; + case ENCODER_PHASE_3: ENCODER_SPIN(ENCODER_PHASE_2, ENCODER_PHASE_0); break; } #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) external_encoder(); diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index a926dd58f4..a64483fcb0 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -25,6 +25,8 @@ #include "../module/motion.h" +#include "buttons.h" + #if HAS_BUZZER #include "../libs/buzzer.h" #endif @@ -40,20 +42,6 @@ #if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY) #define HAS_ENCODER_ACTION 1 #endif -#if ((!HAS_ADC_BUTTONS && IS_NEWPANEL) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL - #define HAS_ENCODER_WHEEL 1 -#endif -#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT) - #define HAS_DIGITAL_BUTTONS 1 -#endif -#if !HAS_ADC_BUTTONS && (IS_RRW_KEYPAD || (HAS_WIRED_LCD && !IS_NEWPANEL)) - #define HAS_SHIFT_ENCODER 1 -#endif - -// I2C buttons must be read in the main thread -#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL) - #define HAS_SLOW_BUTTONS 1 -#endif #if E_MANUAL > 1 #define MULTI_MANUAL 1 @@ -114,130 +102,6 @@ #endif // HAS_WIRED_LCD -#if IS_RRW_KEYPAD - #define BTN_OFFSET 0 // Bit offset into buttons for shift register values - - #define BLEN_KEYPAD_F3 0 - #define BLEN_KEYPAD_F2 1 - #define BLEN_KEYPAD_F1 2 - #define BLEN_KEYPAD_DOWN 3 - #define BLEN_KEYPAD_RIGHT 4 - #define BLEN_KEYPAD_MIDDLE 5 - #define BLEN_KEYPAD_UP 6 - #define BLEN_KEYPAD_LEFT 7 - - #define EN_KEYPAD_F1 _BV(BTN_OFFSET + BLEN_KEYPAD_F1) - #define EN_KEYPAD_F2 _BV(BTN_OFFSET + BLEN_KEYPAD_F2) - #define EN_KEYPAD_F3 _BV(BTN_OFFSET + BLEN_KEYPAD_F3) - #define EN_KEYPAD_DOWN _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN) - #define EN_KEYPAD_RIGHT _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT) - #define EN_KEYPAD_MIDDLE _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE) - #define EN_KEYPAD_UP _BV(BTN_OFFSET + BLEN_KEYPAD_UP) - #define EN_KEYPAD_LEFT _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT) - - #define RRK(B) (keypad_buttons & (B)) - - #ifdef EN_C - #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE)) - #else - #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE) - #endif - -#endif // IS_RRW_KEYPAD - -#if HAS_DIGITAL_BUTTONS - - // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) - #define BLEN_A 0 - #define BLEN_B 1 - - #define EN_A _BV(BLEN_A) - #define EN_B _BV(BLEN_B) - - #define BUTTON_PRESSED(BN) !READ(BTN_## BN) - - #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS - #define BLEN_C 2 - #define EN_C _BV(BLEN_C) - #endif - - #if ENABLED(LCD_I2C_VIKI) - - #include - - #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) - - // button and encoder bit positions within 'buttons' - #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C - #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET) - #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET) - #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET) - #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET) - - #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used - #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name - #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented. - #else - #define BUTTON_CLICK() (buttons & (B_MI|B_RI)) - #endif - - // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin - - #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) - - #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later - - #define BUTTON_CLICK() (buttons & B_MI) - - #endif - - #endif - -#else - - #undef BUTTON_EXISTS - #define BUTTON_EXISTS(...) false - - // Shift register bits correspond to buttons: - #define BL_LE 7 // Left - #define BL_UP 6 // Up - #define BL_MI 5 // Middle - #define BL_DW 4 // Down - #define BL_RI 3 // Right - #define BL_ST 2 // Red Button - #define B_LE _BV(BL_LE) - #define B_UP _BV(BL_UP) - #define B_MI _BV(BL_MI) - #define B_DW _BV(BL_DW) - #define B_RI _BV(BL_RI) - #define B_ST _BV(BL_ST) - - #ifndef BUTTON_CLICK - #define BUTTON_CLICK() (buttons & (B_MI|B_ST)) - #endif - -#endif - -#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL) - #define BLEN_D 3 - #define EN_D _BV(BLEN_D) - #define LCD_BACK_CLICKED() (buttons & EN_D) -#else - #define LCD_BACK_CLICKED() false -#endif - -#ifndef BUTTON_CLICK - #ifdef EN_C - #define BUTTON_CLICK() (buttons & EN_C) - #else - #define BUTTON_CLICK() false - #endif -#endif - #if HAS_MARLINUI_U8GLIB enum MarlinFont : uint8_t { FONT_STATUSMENU = 1, @@ -556,6 +420,8 @@ public: #if HAS_TOUCH_BUTTONS static uint8_t touch_buttons; static uint8_t repeat_delay; + #else + static constexpr uint8_t touch_buttons = 0; #endif #if ENABLED(ENCODER_RATE_MULTIPLIER) diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp index 3d1cc26cd6..975de58211 100644 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -31,7 +31,8 @@ XPT2046 touchIO; #include "../tft_io/touch_calibration.h" #endif -#include "../marlinui.h" // For EN_C bit mask +#include "../buttons.h" // For EN_C bit mask +#include "../marlinui.h" // For ui.refresh #include "../tft_io/tft_io.h" #define DOGM_AREA_LEFT TFT_PIXEL_OFFSET_X @@ -66,7 +67,6 @@ uint8_t TouchButtons::read_buttons() { y = uint16_t((uint32_t(y) * TOUCH_CALIBRATION_Y) >> 16) + TOUCH_OFFSET_Y; #endif - // Touch within the button area simulates an encoder button if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) return WITHIN(x, BUTTOND_X_LO, BUTTOND_X_HI) ? EN_D diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h index ce2ee2579a..ab1446f07c 100644 --- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h +++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h @@ -459,10 +459,10 @@ #if !IS_NEWPANEL // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK_PIN 38 + //#define SHIFT_LD_PIN 42 + //#define SHIFT_OUT_PIN 40 + //#define SHIFT_EN_PIN 17 #endif #endif @@ -608,9 +608,9 @@ // Buttons are directly attached to AUX-2 #if IS_RRW_KEYPAD - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define SHIFT_OUT_PIN 40 + #define SHIFT_CLK_PIN 44 + #define SHIFT_LD_PIN 42 #define BTN_EN1 64 #define BTN_EN2 59 #define BTN_ENC 63 diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index e045245188..7d0f494c34 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -354,15 +354,15 @@ #if IS_NEWPANEL #if IS_RRW_KEYPAD - #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 - #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 - #define SHIFT_LD P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) + #define SHIFT_OUT_PIN P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define SHIFT_CLK_PIN P0_15 // (52) (SCK) J3-9 & AUX-3 + #define SHIFT_LD_PIN P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) #endif #else - //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 - //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 - //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 - //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 + //#define SHIFT_CLK_PIN P3_26 // (31) J3-2 & AUX-4 + //#define SHIFT_LD_PIN P3_25 // (33) J3-4 & AUX-4 + //#define SHIFT_OUT_PIN P2_11 // (35) J3-3 & AUX-4 + //#define SHIFT_EN_PIN P1_22 // (41) J5-4 & AUX-4 #endif #if ANY(VIKI2, miniVIKI) diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index 596efdbb97..fdd64878fb 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -147,14 +147,14 @@ #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 #if IS_RRW_KEYPAD - #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 - #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 - #define SHIFT_LD P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #define SHIFT_OUT_PIN P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define SHIFT_CLK_PIN P0_15 // (52) (SCK) J3-9 & AUX-3 + #define SHIFT_LD_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3 #elif !IS_NEWPANEL - //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 - //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 - //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 - //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 + //#define SHIFT_OUT_PIN P2_11 // (35) J3-3 & AUX-4 + //#define SHIFT_CLK_PIN P3_26 // (31) J3-2 & AUX-4 + //#define SHIFT_LD_PIN P3_25 // (33) J3-4 & AUX-4 + //#define SHIFT_EN_PIN P1_22 // (41) J5-4 & AUX-4 #endif #if ANY(VIKI2, miniVIKI) diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h index 0e75aa4a37..f80e6144ce 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h @@ -149,9 +149,9 @@ #define BTN_ENC 27 // Hardware buttons for manual movement of XYZ -#define SHIFT_OUT 19 -#define SHIFT_LD 18 -#define SHIFT_CLK 17 +#define SHIFT_OUT_PIN 19 +#define SHIFT_LD_PIN 18 +#define SHIFT_CLK_PIN 17 //#define UI1 31 //#define UI2 22 diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h index 35426a4531..540f5c29f5 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h @@ -156,9 +156,9 @@ #define BTN_ENC 38 // Hardware buttons for manual movement of XYZ -#define SHIFT_OUT 42 -#define SHIFT_LD 41 -#define SHIFT_CLK 40 +#define SHIFT_OUT_PIN 42 +#define SHIFT_LD_PIN 41 +#define SHIFT_CLK_PIN 40 //#define UI1 43 //#define UI2 37 diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index e1752c1f85..dcd829f7a7 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -146,10 +146,10 @@ #else // !IS_NEWPANEL - #define SHIFT_CLK 38 - #define SHIFT_LD 42 - #define SHIFT_OUT 40 - #define SHIFT_EN 17 + #define SHIFT_CLK_PIN 38 + #define SHIFT_LD_PIN 42 + #define SHIFT_OUT_PIN 40 + #define SHIFT_EN_PIN 17 #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 5 diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index fa2027fb78..d507d20ca7 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -156,10 +156,10 @@ #else // Buttons attached to a shift register - #define SHIFT_CLK 38 - #define SHIFT_LD 42 - #define SHIFT_OUT 40 - #define SHIFT_EN 17 + #define SHIFT_CLK_PIN 38 + #define SHIFT_LD_PIN 42 + #define SHIFT_OUT_PIN 40 + #define SHIFT_EN_PIN 17 #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 5 diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index 67ec24ed6f..ef4605edd4 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -146,10 +146,10 @@ #define BTN_ENC 43 #else // Buttons attached to shift register of reprapworld keypad v1.1 - #define SHIFT_CLK 63 - #define SHIFT_LD 42 - #define SHIFT_OUT 17 - #define SHIFT_EN 17 + #define SHIFT_CLK_PIN 63 + #define SHIFT_LD_PIN 42 + #define SHIFT_OUT_PIN 17 + #define SHIFT_EN_PIN 17 #endif #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h index 45ebd163a7..9f85d46a54 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h @@ -162,10 +162,10 @@ #define LCD_PINS_D6 39 #define LCD_PINS_D7 15 - #define SHIFT_CLK 43 - #define SHIFT_LD 35 - #define SHIFT_OUT 34 - #define SHIFT_EN 44 + #define SHIFT_CLK_PIN 43 + #define SHIFT_LD_PIN 35 + #define SHIFT_OUT_PIN 34 + #define SHIFT_EN_PIN 44 #if MB(MEGATRONICS_31, MEGATRONICS_32) #define SD_DETECT_PIN 56 diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 0e1b1b09e5..79a67c34f8 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -833,17 +833,17 @@ #if PIN_EXISTS(SERVO3) REPORT_NAME_DIGITAL(__LINE__, SERVO3_PIN) #endif -#if defined(SHIFT_CLK) && SHIFT_CLK >= 0 - REPORT_NAME_DIGITAL(__LINE__, SHIFT_CLK) +#if PIN_EXISTS(SHIFT_CLK) + REPORT_NAME_DIGITAL(__LINE__, SHIFT_CLK_PIN) #endif -#if defined(SHIFT_EN) && SHIFT_EN >= 0 - REPORT_NAME_DIGITAL(__LINE__, SHIFT_EN) +#if PIN_EXISTS(SHIFT_EN) + REPORT_NAME_DIGITAL(__LINE__, SHIFT_EN_PIN) #endif -#if defined(SHIFT_LD) && SHIFT_LD >= 0 - REPORT_NAME_DIGITAL(__LINE__, SHIFT_LD) +#if PIN_EXISTS(SHIFT_LD) + REPORT_NAME_DIGITAL(__LINE__, SHIFT_LD_PIN) #endif -#if defined(SHIFT_OUT) && SHIFT_OUT >= 0 - REPORT_NAME_DIGITAL(__LINE__, SHIFT_OUT) +#if PIN_EXISTS(SHIFT_OUT) + REPORT_NAME_DIGITAL(__LINE__, SHIFT_OUT_PIN) #endif #if PIN_EXISTS(SLED) REPORT_NAME_DIGITAL(__LINE__, SLED_PIN) diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 7dcaeb8e57..be2317b146 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -239,10 +239,10 @@ // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK_PIN 38 + //#define SHIFT_LD_PIN 42 + //#define SHIFT_OUT_PIN 40 + //#define SHIFT_EN_PIN 17 #define LCD_PINS_RS 75 #define LCD_PINS_ENABLE 17 diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 57d4c047e2..ab5711bd5c 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -504,10 +504,10 @@ #if !IS_NEWPANEL // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK_PIN 38 + //#define SHIFT_LD_PIN 42 + //#define SHIFT_OUT_PIN 40 + //#define SHIFT_EN_PIN 17 #endif #endif @@ -722,9 +722,9 @@ #endif // HAS_WIRED_LCD #if IS_RRW_KEYPAD && !HAS_ADC_BUTTONS - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define SHIFT_OUT_PIN 40 + #define SHIFT_CLK_PIN 44 + #define SHIFT_LD_PIN 42 #ifndef BTN_EN1 #define BTN_EN1 64 #endif diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index e6a95fdab9..ca402553e1 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -342,10 +342,10 @@ #if !IS_NEWPANEL // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK_PIN 38 + //#define SHIFT_LD_PIN 42 + //#define SHIFT_OUT_PIN 40 + //#define SHIFT_EN_PIN 17 #endif #endif @@ -491,9 +491,9 @@ // Buttons are directly attached to AUX-2 #if IS_RRW_KEYPAD - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define SHIFT_OUT_PIN 40 + #define SHIFT_CLK_PIN 44 + #define SHIFT_LD_PIN 42 #define BTN_EN1 64 #define BTN_EN2 59 #define BTN_ENC 63 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index 447138f53e..22c7fd95b4 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -142,10 +142,10 @@ #else // !IS_NEWPANEL - Old style panel with shift register // Buttons attached to a shift register - #define SHIFT_CLK 38 - #define SHIFT_LD 42 - #define SHIFT_OUT 40 - #define SHIFT_EN 17 + #define SHIFT_CLK_PIN 38 + #define SHIFT_LD_PIN 42 + #define SHIFT_OUT_PIN 40 + #define SHIFT_EN_PIN 17 #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 5 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index a59a000dff..37c28ece4c 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -197,10 +197,10 @@ #else // !IS_NEWPANEL - Old style panel with shift register // Buttons attached to a shift register - #define SHIFT_CLK 38 - #define SHIFT_LD 42 - #define SHIFT_OUT 40 - #define SHIFT_EN 17 + #define SHIFT_CLK_PIN 38 + #define SHIFT_LD_PIN 42 + #define SHIFT_OUT_PIN 40 + #define SHIFT_EN_PIN 17 #define LCD_PINS_RS 16 #define LCD_PINS_ENABLE 5 diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V20.h b/Marlin/src/pins/ramps/pins_ZRIB_V20.h index 90433c62d7..6c4b28d0b8 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V20.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V20.h @@ -69,9 +69,9 @@ #undef ADC_KEYPAD_PIN #undef BEEPER_PIN - #undef SHIFT_OUT - #undef SHIFT_CLK - #undef SHIFT_LD + #undef SHIFT_OUT_PIN + #undef SHIFT_CLK_PIN + #undef SHIFT_LD_PIN #undef BTN_EN1 #undef BTN_EN2 #undef BTN_ENC diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index d72b55d3af..7a72ef651f 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -363,10 +363,10 @@ #if !IS_NEWPANEL // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK_PIN 38 + //#define SHIFT_LD_PIN 42 + //#define SHIFT_OUT_PIN 40 + //#define SHIFT_EN_PIN 17 #endif #endif @@ -567,9 +567,9 @@ // Buttons are directly attached to AUX-2 #if IS_RRW_KEYPAD // TO TEST - //#define SHIFT_OUT 40 - //#define SHIFT_CLK 44 - //#define SHIFT_LD 42 + //#define SHIFT_OUT_PIN 40 + //#define SHIFT_CLK_PIN 44 + //#define SHIFT_LD_PIN 42 //#define BTN_EN1 56 // Mega/Due:64 - AGCM4:56 //#define BTN_EN2 72 // Mega/Due:59 - AGCM4:72 //#define BTN_ENC 55 // Mega/Due:63 - AGCM4:55 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index b18c9dd914..bb6f571924 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -146,10 +146,10 @@ #define BEEPER_PIN PC1 // 33 // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK PC6 // 38 - //#define SHIFT_LD PC10 // 42 - //#define SHIFT_OUT PC8 // 40 - //#define SHIFT_EN PA1 // 17 + //#define SHIFT_CLK_PIN PC6 // 38 + //#define SHIFT_LD_PIN PC10 // 42 + //#define SHIFT_OUT_PIN PC8 // 40 + //#define SHIFT_EN_PIN PA1 // 17 #endif #endif @@ -260,9 +260,9 @@ #define BTN_EN1 PE0 // 64 #define BTN_EN2 PD11 // 59 #define BTN_ENC PD15 // 63 - #define SHIFT_OUT PC8 // 40 - #define SHIFT_CLK PC12 // 44 - #define SHIFT_LD PC10 // 42 + #define SHIFT_OUT_PIN PC8 // 40 + #define SHIFT_CLK_PIN PC12 // 44 + #define SHIFT_LD_PIN PC10 // 42 #elif ENABLED(PANEL_ONE) #define BTN_EN1 PD11 // 59 // AUX2 PIN 3 #define BTN_EN2 PD15 // 63 // AUX2 PIN 4 diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h index b8a0ffe2c8..71c348536a 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h @@ -146,7 +146,7 @@ #endif #if IS_RRW_KEYPAD - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define SHIFT_OUT_PIN 40 + #define SHIFT_CLK_PIN 44 + #define SHIFT_LD_PIN 42 #endif From 5c181562f6235ecd53333cec0d0ba63e3d6cac31 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 12 Jan 2021 21:02:35 -0600 Subject: [PATCH 0870/1370] MKS UI prelim. cleanup (#20763) --- .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 2 - Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 2 - .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 9 +- Marlin/src/lcd/extui/lib/mks_ui/draw_about.h | 1 - .../extui/lib/mks_ui/draw_baby_stepping.cpp | 3 +- .../lcd/extui/lib/mks_ui/draw_baby_stepping.h | 1 - .../extui/lib/mks_ui/draw_change_speed.cpp | 16 +- .../lcd/extui/lib/mks_ui/draw_change_speed.h | 1 - .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 32 +--- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 3 +- .../extui/lib/mks_ui/draw_error_message.cpp | 23 --- .../lcd/extui/lib/mks_ui/draw_error_message.h | 1 - .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 4 - .../src/lcd/extui/lib/mks_ui/draw_extrusion.h | 1 - Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 27 ++-- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h | 1 - .../extui/lib/mks_ui/draw_filament_change.cpp | 6 +- .../extui/lib/mks_ui/draw_filament_change.h | 1 - Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 4 - Marlin/src/lcd/extui/lib/mks_ui/draw_home.h | 1 - .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 19 +-- .../lcd/extui/lib/mks_ui/draw_language.cpp | 4 - .../src/lcd/extui/lib/mks_ui/draw_language.h | 1 - .../extui/lib/mks_ui/draw_level_settings.cpp | 5 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 4 - .../lcd/extui/lib/mks_ui/draw_manuaLevel.h | 1 - .../mks_ui/draw_manual_level_pos_settings.cpp | 28 +--- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 22 +-- .../extui/lib/mks_ui/draw_motor_settings.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_move_motor.h | 1 - .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 4 - .../lcd/extui/lib/mks_ui/draw_operation.cpp | 7 - .../src/lcd/extui/lib/mks_ui/draw_operation.h | 1 - .../extui/lib/mks_ui/draw_pause_message.cpp | 4 - .../lcd/extui/lib/mks_ui/draw_pause_message.h | 1 - .../extui/lib/mks_ui/draw_pause_position.cpp | 11 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 4 - .../src/lcd/extui/lib/mks_ui/draw_preHeat.h | 1 - .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_print_file.h | 10 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 25 --- .../src/lcd/extui/lib/mks_ui/draw_printing.h | 1 - .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 46 +----- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 1 - Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 36 +---- Marlin/src/lcd/extui/lib/mks_ui/draw_set.h | 1 - .../extui/lib/mks_ui/draw_step_settings.cpp | 21 +-- .../lib/mks_ui/draw_tmc_current_settings.cpp | 23 +-- .../mks_ui/draw_tmc_step_mode_settings.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 19 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h | 1 - .../extui/lib/mks_ui/draw_touch_calibration.h | 1 - Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 153 ++++++------------ Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 5 +- .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 3 + .../lcd/extui/lib/mks_ui/gb2312_puhui16.cpp | 10 -- .../extui/lib/mks_ui/mks_hardware_test.cpp | 20 +-- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 16 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 - .../extui/lib/mks_ui/printer_operation.cpp | 3 - .../lcd/extui/lib/mks_ui/tft_Language_en.h | 45 +----- .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 30 +--- .../lcd/extui/lib/mks_ui/tft_Language_it.h | 20 --- .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 23 +-- .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 104 ++++++------ .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 49 ++---- .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 16 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 27 +--- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 3 + .../extui/lib/mks_ui/tft_multi_language.cpp | 111 ++++--------- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 23 +-- Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 60 ++++--- Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h | 16 +- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 29 +--- Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h | 1 - 78 files changed, 296 insertions(+), 937 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index 11c5f816b0..e1c46811fe 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -169,7 +169,6 @@ void SPIFlashStorage::endWrite() { void SPIFlashStorage::savePage(uint8_t* buffer) { W25QXX.SPI_FLASH_BufferWrite(buffer, m_startAddress + (SPI_FLASH_PageSize * m_currentPage), SPI_FLASH_PageSize); - // Test env // char fname[256]; // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); @@ -180,7 +179,6 @@ void SPIFlashStorage::savePage(uint8_t* buffer) { void SPIFlashStorage::loadPage(uint8_t* buffer) { W25QXX.SPI_FLASH_BufferRead(buffer, m_startAddress + (SPI_FLASH_PageSize * m_currentPage), SPI_FLASH_PageSize); - // Test env // char fname[256]; // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index 394ce48075..76a4de3561 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -73,8 +73,6 @@ void TFT::LCD_clear(uint16_t color) { tftio.WriteMultiple(color, (uint32_t)(TFT_WIDTH) * (TFT_HEIGHT)); } -extern unsigned char bmp_public_buf[17 * 1024]; - void TFT::LCD_Draw_Logo() { #if HAS_LOGO_IN_FLASH setWindow(0, 0, TFT_WIDTH, TFT_HEIGHT); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index 01f64e8fc6..1f09153143 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -25,16 +25,12 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../inc/MarlinConfig.h" extern lv_group_t *g; static lv_obj_t *scr; -static lv_obj_t *fw_type, *board; //*fw_version; +static lv_obj_t *fw_type, *board; enum { ID_A_RETURN = 1 }; @@ -52,9 +48,6 @@ void lv_draw_about(void) { scr = lv_screen_create(ABOUT_UI); lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_A_RETURN); - //fw_version = lv_label_create(scr, SHORT_BUILD_VERSION); - //lv_obj_align(fw_version, nullptr, LV_ALIGN_CENTER, 0, -60); - fw_type = lv_label_create(scr, "Firmware: Marlin " SHORT_BUILD_VERSION); lv_obj_align(fw_type, nullptr, LV_ALIGN_CENTER, 0, -20); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h index 2ee7ec04c6..9eae2b06ca 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h @@ -28,7 +28,6 @@ extern void lv_draw_about(void); extern void lv_clear_about(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp index 5f489162b0..dce83bad2b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -87,7 +87,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { has_adjust_z = 1; break; case ID_BABY_STEP_Z_N: - sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); + sprintf_P(baby_buf, PSTR("M290 Z%.3f"), -babystep_dist); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; break; @@ -136,7 +136,6 @@ void lv_draw_baby_stepping(void) { } void disp_baby_step_dist() { - // char buf[30] = {0}; if ((int)(100 * babystep_dist) == 1) lv_imgbtn_set_src_both(buttonV, "F:/bmp_baby_move0_01.bin"); else if ((int)(100 * babystep_dist) == 5) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h index 333ba2d597..5886a20583 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h @@ -30,7 +30,6 @@ extern void lv_clear_baby_stepping(); extern void disp_baby_step_dist(); extern void disp_z_offset_value(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index a5100776ac..afb0245e2f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../module/planner.h" #include "../../../../inc/MarlinConfig.h" @@ -65,9 +61,6 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { planner.flow_percentage[0] += uiCfg.stepPrintSpeed; else planner.flow_percentage[0] = MAX_EXT_SPEED_PERCENT; - //planner.e_factor[0]= planner.flow_percentage[0]*0.01; - //planner.flow_percentage[1] = planner.flow_percentage[0]; - //planner.e_factor[1]= planner.flow_percentage[1]*0.01; planner.refresh_e_factor(0); #if HAS_MULTI_EXTRUDER planner.flow_percentage[1] = planner.flow_percentage[0]; @@ -88,9 +81,6 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { planner.flow_percentage[0] -= uiCfg.stepPrintSpeed; else planner.flow_percentage[0] = MIN_EXT_SPEED_PERCENT; - //planner.e_factor[0]= planner.flow_percentage[0] * 0.01; - //planner.flow_percentage[1] = planner.flow_percentage[0]; - //planner.e_factor[1]= planner.flow_percentage[1] * 0.01; planner.refresh_e_factor(0); #if HAS_MULTI_EXTRUDER planner.flow_percentage[1] = planner.flow_percentage[0]; @@ -143,9 +133,9 @@ void lv_draw_change_speed(void) { lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_RETURN); // Create labels on the image buttons - labelMov = lv_label_create_empty(buttonMov); - labelExt = lv_label_create_empty(buttonExt); - labelStep = lv_label_create_empty(buttonStep); + labelMov = lv_label_create_empty(buttonMov); + labelExt = lv_label_create_empty(buttonExt); + labelStep = lv_label_create_empty(buttonStep); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h index c4996a3ef7..8fa4c803af 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h @@ -34,7 +34,6 @@ extern void disp_speed_step(); extern void disp_print_speed(); extern void disp_speed_type(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 5c0f426292..55a0e695fe 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -31,11 +31,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - #include "../../../../sd/cardreader.h" #include "../../../../gcode/queue.h" #include "../../../../module/temperature.h" @@ -100,7 +95,6 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { card.openFileRead(cur_name); if (card.isFileOpen()) { feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; planner.flow_percentage[0] = 100; planner.e_factor[0] = planner.flow_percentage[0] * 0.01f; #if HAS_MULTI_EXTRUDER @@ -123,20 +117,8 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { lv_draw_ready_print(); #if ENABLED(SDSUPPORT) - //card.endFilePrint(); - //wait_for_heatup = false; uiCfg.print_state = IDLE; card.flag.abort_sd_printing = true; - //queue.clear(); - //quickstop_stepper(); - //print_job_timer.stop(); - //thermalManager.disable_all_heaters(); - - //#if ENABLED(POWER_LOSS_RECOVERY) - // recovery.purge(); - //#endif - //queue.enqueue_now_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0")); - //queue.inject_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0\nM84\nM107")); #endif } else if (DIALOG_IS(TYPE_FINISH_PRINT)) { @@ -244,19 +226,19 @@ void lv_draw_dialog(uint8_t type) { else if (DIALOG_IS(WIFI_ENABLE_TIPS)) { btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancel); } else if (DIALOG_IS(TRANSFER_NO_DEVICE)) { btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancel); } #if ENABLED(MKS_WIFI_MODULE) else if (DIALOG_IS(TYPE_UPLOAD_FILE)) { if (upload_result == 2) { btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancel); } else if (upload_result == 3) { btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb); @@ -268,7 +250,7 @@ void lv_draw_dialog(uint8_t type) { else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT)) { btnCancel = lv_button_btn_create(scr, BTN_OK_X+90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancel); tempText1 = lv_label_create_empty(scr); filament_sprayer_temp(); @@ -281,7 +263,7 @@ void lv_draw_dialog(uint8_t type) { else if (DIALOG_IS(TYPE_FILAMENT_LOADING, TYPE_FILAMENT_UNLOADING)) { btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancel); filament_bar = lv_bar_create(scr, nullptr); lv_obj_set_pos(filament_bar, (TFT_WIDTH-400)/2, ((TFT_HEIGHT - titleHeight)-40)/2); @@ -303,7 +285,7 @@ void lv_draw_dialog(uint8_t type) { } else { lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancel); } } if (DIALOG_IS(TYPE_PRINT_FILE)) { @@ -314,7 +296,7 @@ void lv_draw_dialog(uint8_t type) { lv_obj_align(labelFile, nullptr, LV_ALIGN_CENTER, 0, -60); } else if (DIALOG_IS(TYPE_STOP)) { - lv_label_set_text(labelDialog, print_file_dialog_menu.cancle_print); + lv_label_set_text(labelDialog, print_file_dialog_menu.cancel_print); lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } else if (DIALOG_IS(TYPE_FINISH_PRINT)) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index c6f42d90b3..c43a79a141 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -33,7 +33,7 @@ enum { DIALOG_TYPE_M80_FAIL, DIALOG_TYPE_MESSAGE_ERR1, - DIALOG_TYPE_UPDATE_ESP_FIRMARE, + DIALOG_TYPE_UPDATE_ESP_FIRMWARE, DIALOG_TYPE_UPDATE_ESP_DATA, DIALOG_TYPE_UPLOAD_FILE, DIALOG_TYPE_UNBIND, @@ -85,7 +85,6 @@ extern void filament_sprayer_temp(); extern void filament_dialog_handle(); extern void lv_filament_setbar(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index a484f14087..bdae725cbb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -27,10 +27,6 @@ #include #include "tft_lvgl_configuration.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "SPI_TFT.h" #include "mks_hardware_test.h" @@ -39,25 +35,6 @@ static lv_obj_t *scr; void lv_draw_error_message(PGM_P const msg) { - #if 0 - static lv_obj_t *message = nullptr, *kill_message = nullptr, *reset_tips = nullptr; - - scr = lv_screen_create(ERROR_MESSAGE_UI, ""); - - if (msg) { - message = lv_label_create(scr, msg); - lv_obj_align(message, nullptr, LV_ALIGN_CENTER, 0, -50); - } - - kill_message = lv_label_create(scr, "PRINTER HALTED"); - lv_obj_align(kill_message, nullptr, LV_ALIGN_CENTER, 0, -10); - - reset_tips = lv_label_create(scr, "Please Reset"); - lv_obj_align(reset_tips, nullptr, LV_ALIGN_CENTER, 0, 30); - - lv_task_handler(); - #endif - SPI_TFT.LCD_clear(0x0000); if (msg) disp_string((TFT_WIDTH - strlen(msg) * 16) / 2, 100, msg, 0xFFFF, 0x0000); disp_string((TFT_WIDTH - strlen("PRINTER HALTED") * 16) / 2, 140, "PRINTER HALTED", 0xFFFF, 0x0000); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h index 8f64d67f93..35e3bd6cf5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h @@ -32,7 +32,6 @@ extern void lv_draw_error_message(PGM_P const msg); extern void lv_clear_error_message(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 6a1c0c4fb3..394c702132 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../module/temperature.h" #include "../../../../gcode/queue.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h index 576cc6c66c..6178a8e19f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h @@ -33,7 +33,6 @@ extern void disp_ext_speed(); extern void disp_hotend_temp(); extern void disp_extru_amount(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index 5453bbf86b..cd74a55e65 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../module/temperature.h" #include "../../../../gcode/queue.h" @@ -52,35 +48,30 @@ static uint8_t fanSpeed; static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + switch (obj->mks_obj_id) { case ID_F_ADD: - if (fanSpeed + 1 <= 255) { - fanSpeed++; - sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); - gcode.process_subcommands_now(public_buf_l); - } + if (fanSpeed < 254) fanSpeed++; break; case ID_F_DEC: - if (fanSpeed > 0) { - fanSpeed--; - sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); - gcode.process_subcommands_now(public_buf_l); - } + if (fanSpeed > 0) fanSpeed--; break; case ID_F_HIGH: - gcode.process_subcommands_now_P(PSTR("M106 S255")); + fanSpeed = 255; break; case ID_F_MID: - gcode.process_subcommands_now_P(PSTR("M106 S127")); + fanSpeed = 127; break; case ID_F_OFF: gcode.process_subcommands_now_P(PSTR("M107")); - break; + return; case ID_F_RETURN: clear_cur_ui(); draw_return_ui(); - break; + return; } + sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); + gcode.process_subcommands_now(public_buf_l); } void lv_draw_fan(void) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h index 602d02c6c0..5a3323e2f2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h @@ -29,7 +29,6 @@ extern void lv_draw_fan(void); extern void lv_clear_fan(); extern void disp_fan_value(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 4ab60321b6..39d32fa745 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -85,10 +85,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_FILAMNT_TYPE: #if HAS_MULTI_EXTRUDER - if (uiCfg.curSprayerChoose == 0) - uiCfg.curSprayerChoose = 1; - else if (uiCfg.curSprayerChoose == 1) - uiCfg.curSprayerChoose = 0; + uiCfg.curSprayerChoose = !uiCfg.curSprayerChoose; #endif disp_filament_type(); break; @@ -100,7 +97,6 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { feedrate_mm_s = (float)uiCfg.moveSpeed_bak; if (uiCfg.print_state == PAUSED) planner.set_e_position_mm((destination.e = current_position.e = uiCfg.current_e_position_bak)); - //current_position.e = destination.e = uiCfg.current_e_position_bak; thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; clear_cur_ui(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h index b0068f7f0f..18efe5839e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h @@ -30,7 +30,6 @@ extern void lv_clear_filament_change(); extern void disp_filament_type(); extern void disp_filament_temp(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 646091bd8b..e0ef10a728 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -27,10 +27,6 @@ #include "draw_set.h" #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h index c5060127a8..a8f11d9237 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h @@ -28,7 +28,6 @@ extern void lv_draw_home(void); extern void lv_clear_home(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 9f7c936fb3..749738f6ea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -73,8 +73,6 @@ static const lv_btnm_ctrl_t kb_ctrl_num_map[] = { 1, 1, 1, 1, 1}; static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { - //LV_ASSERT_OBJ(kb, LV_OBJX_NAME); - if (event != LV_EVENT_VALUE_CHANGED) return; lv_kb_ext_t * ext = (lv_kb_ext_t * )lv_obj_get_ext_attr(kb); @@ -104,22 +102,18 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { } else if (strcmp(txt, LV_SYMBOL_CLOSE) == 0) { if (kb->event_cb != lv_kb_def_event_cb) { - //lv_res_t res = lv_event_send(kb, LV_EVENT_CANCEL, nullptr); - //if (res != LV_RES_OK) return; lv_clear_keyboard(); draw_return_ui(); } else { - lv_kb_set_ta(kb, nullptr); // De-assign the text area to hide it cursor if needed + lv_kb_set_ta(kb, nullptr); // De-assign the text area to hide its cursor if needed lv_obj_del(kb); return; } - return; + return; } else if (strcmp(txt, LV_SYMBOL_OK) == 0) { if (kb->event_cb != lv_kb_def_event_cb) { - //lv_res_t res = lv_event_send(kb, LV_EVENT_APPLY, nullptr); - //if (res != LV_RES_OK) return; const char * ret_ta_txt = lv_ta_get_text(ext->ta); switch (keyboard_value) { #if ENABLED(MKS_WIFI_MODULE) @@ -142,7 +136,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { gCfgItems.wifi_mode_sel = STA_MODEL; - package_to_wifi(WIFI_PARA_SET, (char *)0, 0); + package_to_wifi(WIFI_PARA_SET, (uint8_t *)0, 0); public_buf_l[0] = 0xA5; public_buf_l[1] = 0x09; @@ -151,7 +145,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { public_buf_l[4] = 0x01; public_buf_l[5] = 0xFC; public_buf_l[6] = 0x00; - raw_send_to_wifi(public_buf_l, 6); + raw_send_to_wifi((uint8_t*)public_buf_l, 6); last_disp_state = KEY_BOARD_UI; lv_clear_keyboard(); @@ -238,8 +232,6 @@ void lv_draw_keyboard() { lv_kb_set_style(kb, LV_KB_STYLE_BTN_PR, &pr_style); #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { - //lv_group_add_obj(g, kb); - //lv_group_set_editing(g, true); } #endif @@ -260,9 +252,6 @@ void lv_draw_keyboard() { } void lv_clear_keyboard() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { /* lv_group_remove_all_objs(g); */ } - #endif lv_obj_del(scr); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index befed7a646..7edb73b71f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../inc/MarlinConfig.h" #include diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h index ca6d40bfc3..d4ee14f30a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h @@ -28,7 +28,6 @@ extern void lv_draw_language(void); extern void lv_clear_language(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index b1ce90f266..6d495494bf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -40,23 +40,20 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + lv_clear_level_settings(); switch (obj->mks_obj_id) { case ID_LEVEL_RETURN: - lv_clear_level_settings(); draw_return_ui(); break; case ID_LEVEL_POSITION: - lv_clear_level_settings(); lv_draw_manual_level_pos_settings(); break; case ID_LEVEL_COMMAND: keyboard_value = gcodeCommand; - lv_clear_level_settings(); lv_draw_keyboard(); break; #if HAS_BED_PROBE case ID_LEVEL_ZOFFSET: - lv_clear_level_settings(); lv_draw_auto_level_offset_settings(); break; #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 3c8d562913..338cb1fecc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h index cfa10370e1..60de0b4fe0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h @@ -28,7 +28,6 @@ extern void lv_draw_manualLevel(void); extern void lv_clear_manualLevel(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp index 6f64badf8b..135838a08b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -55,68 +55,50 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { uiCfg.para_ui_page = 0; lv_clear_manual_level_pos_settings(); draw_return_ui(); - break; + return; case ID_MANUAL_POS_X1: value = level_pos_x1; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_Y1: value = level_pos_y1; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_X2: value = level_pos_x2; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_Y2: value = level_pos_y2; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_X3: value = level_pos_x3; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_Y3: value = level_pos_y3; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_X4: value = level_pos_x4; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_Y4: value = level_pos_y4; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_X5: value = level_pos_y5; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_Y5: value = level_pos_y5; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); break; case ID_MANUAL_POS_UP: uiCfg.para_ui_page = 0; lv_clear_manual_level_pos_settings(); lv_draw_manual_level_pos_settings(); - break; + return; case ID_MANUAL_POS_DOWN: uiCfg.para_ui_page = 1; lv_clear_manual_level_pos_settings(); lv_draw_manual_level_pos_settings(); - break; + return; } + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); } void lv_draw_manual_level_pos_settings(void) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index 60efda8b27..dc66bea9c3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -45,48 +45,38 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + + lv_clear_max_feedrate_settings(); switch (obj->mks_obj_id) { case ID_FEED_RETURN: uiCfg.para_ui_page = 0; - lv_clear_max_feedrate_settings(); draw_return_ui(); - break; + return; case ID_FEED_X: value = XMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); break; case ID_FEED_Y: value = YMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); break; case ID_FEED_Z: value = ZMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); break; case ID_FEED_E0: value = E0MaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); break; case ID_FEED_E1: value = E1MaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); break; case ID_FEED_UP: uiCfg.para_ui_page = 0; - lv_clear_max_feedrate_settings(); lv_draw_max_feedrate_settings(); - break; + return; case ID_FEED_DOWN: uiCfg.para_ui_page = 1; - lv_clear_max_feedrate_settings(); lv_draw_max_feedrate_settings(); - break; + return; } + lv_draw_number_key(); } void lv_draw_max_feedrate_settings(void) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp index 61cefd7615..860db5d89d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -41,30 +41,26 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + lv_clear_motor_settings(); switch (obj->mks_obj_id) { case ID_MOTOR_RETURN: - lv_clear_motor_settings(); draw_return_ui(); break; case ID_MOTOR_STEPS: - lv_clear_motor_settings(); lv_draw_step_settings(); break; #if USE_SENSORLESS case ID_HOME_SENSE: - lv_clear_motor_settings(); lv_draw_homing_sensitivity_settings(); break; #endif #if HAS_TRINAMIC_CONFIG case ID_MOTOR_TMC_CURRENT: - lv_clear_motor_settings(); lv_draw_tmc_current_settings(); break; #if HAS_STEALTHCHOP case ID_MOTOR_STEP_MODE: - lv_clear_motor_settings(); lv_draw_tmc_step_mode_settings(); break; #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 30f2a00422..6c0198d9c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" @@ -124,7 +120,7 @@ void lv_draw_move_motor(void) { lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_Z_P); lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Z_N); - // button with image and label changed dinamycally by disp_move_dist + // button with image and label changed dynamically by disp_move_dist buttonV = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_STEP); labelV = lv_label_create_empty(buttonV); #if HAS_ROTARY_ENCODER diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h index fdbb61f6f9..4e41c5ff94 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h @@ -29,7 +29,6 @@ extern void lv_draw_move_motor(void); extern void lv_clear_move_motor(); extern void disp_move_dist(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 54ae27d968..1c339bde7e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../../lvgl/src/lv_objx/lv_img.h" -//#include "../../lvgl/src/lv_core/lv_disp.h" -//#include "../../lvgl/src/lv_core/lv_refr.h" #include "../../../../gcode/gcode.h" #include "../../../../gcode/queue.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index ec68c27212..50aa85e338 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../module/temperature.h" #include "../../../../module/motion.h" @@ -178,7 +174,6 @@ void lv_draw_operation(void) { label_PowerOff = lv_label_create_empty(buttonPowerOff); if (uiCfg.print_state != WORKING) { - //label_Filament = lv_label_create_empty(buttonFilament); labelExtrusion = lv_label_create_empty(buttonExtrusion); label_Move = lv_label_create_empty(buttonMove); } @@ -205,8 +200,6 @@ void lv_draw_operation(void) { lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); if (uiCfg.print_state != WORKING) { - //lv_label_set_text(label_Filament, operation_menu.filament); - //lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(labelExtrusion, operation_menu.extr); lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h index cca1f6a2a5..0257812ec9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h @@ -28,7 +28,6 @@ extern void lv_draw_operation(void); extern void lv_clear_operation(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp index ec6129446a..3eb717b712 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../feature/pause.h" #include "../../../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h index 7d55d83756..88222f0e1a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h @@ -27,7 +27,6 @@ extern void lv_draw_pause_message(const PauseMessage msg); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index a324aef793..59c30bdb95 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -41,27 +41,22 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + lv_clear_pause_position(); switch (obj->mks_obj_id) { case ID_PAUSE_RETURN: - lv_clear_pause_position(); draw_return_ui(); - break; + return; case ID_PAUSE_X: value = pause_pos_x; - lv_clear_pause_position(); - lv_draw_number_key(); break; case ID_PAUSE_Y: value = pause_pos_y; - lv_clear_pause_position(); - lv_draw_number_key(); break; case ID_PAUSE_Z: value = pause_pos_z; - lv_clear_pause_position(); - lv_draw_number_key(); break; } + lv_draw_number_key(); } void lv_draw_pause_position(void) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 0e869e67c4..e1d2aecbe0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../module/temperature.h" #include "../../../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h index c8de942f3f..602f5e9066 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h @@ -31,7 +31,6 @@ extern void disp_temp_type(); extern void disp_step_heat(); extern void disp_desire_temp(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 38b62db3b4..96a6bc1177 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -49,7 +49,7 @@ int8_t curDirLever = 0; LIST_FILE list_file; DIR_OFFSET dir_offset[10]; -extern uint8_t public_buf[512]; +extern uint8_t public_buf[513]; extern char public_buf_m[100]; uint8_t sel_id = 0; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h index 94786ab070..ac3539e71d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -33,16 +33,15 @@ typedef struct { extern DIR_OFFSET dir_offset[10]; #define FILE_NUM 6 -#define SHORT_NEME_LEN 13 +#define SHORT_NAME_LEN 13 #define NAME_CUT_LEN 23 #define MAX_DIR_LEVEL 10 typedef struct { - //char longName[FILE_NUM][LONG_FILENAME_LENGTH]; - char file_name[FILE_NUM][SHORT_NEME_LEN * MAX_DIR_LEVEL + 1]; - char curDirPath[SHORT_NEME_LEN * MAX_DIR_LEVEL + 1]; - char long_name[FILE_NUM][SHORT_NEME_LEN * 2 + 1]; + char file_name[FILE_NUM][SHORT_NAME_LEN * MAX_DIR_LEVEL + 1]; + char curDirPath[SHORT_NAME_LEN * MAX_DIR_LEVEL + 1]; + char long_name[FILE_NUM][SHORT_NAME_LEN * 2 + 1]; bool IsFolder[FILE_NUM]; char Sd_file_cnt; char sd_file_index; @@ -60,7 +59,6 @@ extern int ascii2dec_test(char *ascii); extern void lv_clear_print_file(); extern void lv_gcode_file_seek(uint32_t pos); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 7614f1e99d..13fad747fa 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../MarlinCore.h" // for marlin_state #include "../../../../module/temperature.h" @@ -75,10 +71,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_PAUSE: if (uiCfg.print_state == WORKING) { - // #if ENABLED(PARK_HEAD_ON_PAUSE) - // queue.inject_P(PSTR("M25 P\nM24")); #if ENABLED(SDSUPPORT) - // queue.inject_P(PSTR("M25\nG91\nG1 Z10\nG90")); card.pauseSDPrint(); stop_print_time(); uiCfg.print_state = PAUSING; @@ -99,7 +92,6 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_imgbtn_set_src_both(obj, "F:/bmp_pause.bin"); lv_label_set_text(labelPause, printing_menu.pause); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); - // recovery.resume(); print_time.minutes = recovery.info.print_job_elapsed / 60; print_time.seconds = recovery.info.print_job_elapsed % 60; print_time.hours = print_time.minutes / 60; @@ -164,20 +156,6 @@ void lv_draw_printing(void) { } #endif - // Create labels on the image buttons - //lv_btn_set_layout(buttonExt1, LV_LAYOUT_OFF); - //#if HAS_MULTI_EXTRUDER - // lv_btn_set_layout(buttonExt2, LV_LAYOUT_OFF); - //#endif - - //#if HAS_HEATED_BED - // lv_btn_set_layout(buttonBedstate, LV_LAYOUT_OFF); - //#endif - - //lv_btn_set_layout(buttonFanstate, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonTime, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonZpos, LV_LAYOUT_OFF); - labelExt1 = lv_label_create(scr, 250, 146, nullptr); #if HAS_MULTI_EXTRUDER @@ -262,12 +240,10 @@ void disp_fan_Zpos() { } void reset_print_time() { - // print_time.days = 0; print_time.hours = 0; print_time.minutes = 0; print_time.seconds = 0; print_time.ms_10 = 0; - // print_time.start = 1; } void start_print_time() { print_time.start = 1; } @@ -290,7 +266,6 @@ void setProBarRate() { #endif rate = (rate_tmp_r - (PREVIEW_SIZE + To_pre_view)) * 100 / (gCfgItems.curFilesize - (PREVIEW_SIZE + To_pre_view)); } - // gCurFileState.totalSend = rate; if (rate <= 0) return; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h index 466efe01cb..d6da1a1005 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h @@ -48,7 +48,6 @@ extern void start_print_time(); extern void stop_print_time(); extern void setProBarRate(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 3cf0c2bec3..b16019e8d1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -26,10 +26,6 @@ #include "draw_ready_print.h" #include "draw_tool.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "tft_lvgl_configuration.h" #include "mks_hardware_test.h" #include "draw_ui.h" @@ -46,7 +42,6 @@ #include -//static lv_obj_t *buttonPrint, *buttonTool, *buttonSet; extern lv_group_t* g; static lv_obj_t *scr; #if ENABLED(MKS_TEST) @@ -61,17 +56,16 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + lv_clear_ready_print(); + switch (obj->mks_obj_id) { case ID_TOOL: - lv_clear_ready_print(); lv_draw_tool(); break; case ID_SET: - lv_clear_ready_print(); lv_draw_set(); break; case ID_PRINT: - lv_clear_ready_print(); lv_draw_print_file(); break; } @@ -104,17 +98,12 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - //lv_obj_t *label_tool2 = lv_label_create_empty(scr); - //lv_obj_set_pos(label_tool, 20, 50); sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.temp_hotend[0].celsius); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.temp_hotend[1].celsius); lv_label_set_text(e2, buf); #endif - - //sprintf_P(buf, PSTR("e3:%d"), (int)thermalManager.temp_hotend[2].celsius); - //lv_label_set_text(e3, buf); #if HAS_HEATED_BED sprintf_P(buf, PSTR("bed:%d"), (int)thermalManager.temp_bed.celsius); lv_label_set_text(bed, buf); @@ -128,41 +117,15 @@ void lv_draw_ready_print(void) { disp_state_stack._disp_index = 0; ZERO(disp_state_stack._disp_state); scr = lv_screen_create(PRINT_READY_UI, ""); - //lv_obj_set_hidden(scr, true); if (mks_test_flag == 0x1E) { - //(void)lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text()); - // Create image buttons - //buttonPrint = lv_imgbtn_create(scr, nullptr); buttonTool = lv_imgbtn_create(scr, "F:/bmp_tool.bin", event_handler, ID_TOOL); lv_obj_set_pos(buttonTool, 360, 180); - //buttonSet = lv_imgbtn_create(scr, nullptr); - //lv_obj_set_pos(buttonSet, 180, 90); - //lv_obj_set_pos(buttonPrint, 340, 90); - - //lv_obj_set_pos(buttonTool, SIMPLE_FIRST_PAGE_GRAP+1, (TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - //lv_obj_set_pos(buttonSet, BTN_X_PIXEL+SIMPLE_FIRST_PAGE_GRAP*2+1, (TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - //lv_obj_set_pos(buttonPrint, BTN_X_PIXEL*2+SIMPLE_FIRST_PAGE_GRAP*3+1, (TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - - // Create labels on the image buttons - //lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); - - //lv_obj_t *label_print = lv_label_create_empty(buttonPrint); - //lv_obj_t *label_set = lv_label_create_empty(buttonSet); lv_obj_t *label_tool = lv_label_create_empty(buttonTool); if (gCfgItems.multiple_language) { - //lv_label_set_text(label_print, main_menu.print); - //lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - //lv_label_set_text(label_set, main_menu.set); - //lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - //lv_label_set_style(label_tool, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_label_set_style(label_tool, LV_BTN_STATE_REL, &tft_style_label_rel); lv_label_set_text(label_tool, main_menu.tool); lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -179,11 +142,6 @@ void lv_draw_ready_print(void) { lv_label_set_text(e2, buf); #endif - //e3 = lv_label_create_empty(scr); - //lv_obj_set_pos(e3, 20, 70); - //sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[2].celsius); - //lv_label_set_text(e3, buf); - #if HAS_HEATED_BED bed = lv_label_create_empty(scr); lv_obj_set_pos(bed, 20, 95); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index 5cefe8b59b..7a803f80a4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -33,7 +33,6 @@ extern void disp_det_error(); extern void disp_det_ok(); extern void lv_clear_ready_print(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index 0ccb274153..fa8622e69d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -27,10 +27,6 @@ #include "draw_set.h" #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "pic_manager.h" @@ -58,36 +54,29 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; - #if ENABLED(MKS_WIFI_MODULE) - char buf[6] = { 0 }; - #endif + if (obj->mks_obj_id == ID_S_CONTINUE) return; + if (obj->mks_obj_id == ID_S_MOTOR_OFF) { + TERN(HAS_SUICIDE, suicide(), queue.enqueue_now_P(PSTR("M84"))); + return; + } + lv_clear_set(); switch (obj->mks_obj_id) { case ID_S_FAN: - lv_clear_set(); lv_draw_fan(); break; case ID_S_ABOUT: - lv_clear_set(); lv_draw_about(); break; - case ID_S_CONTINUE: break; - case ID_S_MOTOR_OFF: - TERN(HAS_SUICIDE, suicide(), queue.enqueue_now_P(PSTR("M84"))); - break; case ID_S_LANGUAGE: - lv_clear_set(); lv_draw_language(); break; case ID_S_MACHINE_PARA: - lv_clear_set(); lv_draw_machine_para(); break; case ID_S_EEPROM_SET: - lv_clear_set(); lv_draw_eeprom_settings(); break; case ID_S_RETURN: - lv_clear_set(); lv_draw_ready_print(); break; @@ -96,32 +85,23 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (gCfgItems.wifi_mode_sel == STA_MODEL) { if (wifi_link_state == WIFI_CONNECTED) { last_disp_state = SET_UI; - lv_clear_set(); lv_draw_wifi(); } else { if (uiCfg.command_send == 1) { - buf[0] = 0xA5; - buf[1] = 0x07; - buf[2] = 0x00; - buf[3] = 0x00; - buf[4] = 0xFC; - raw_send_to_wifi(buf, 5); - + uint8_t cmd_wifi_list[] = { 0xA5, 0x07, 0x00, 0x00, 0xFC }; + raw_send_to_wifi(cmd_wifi_list, COUNT(cmd_wifi_list)); last_disp_state = SET_UI; - lv_clear_set(); lv_draw_wifi_list(); } else { last_disp_state = SET_UI; - lv_clear_set(); lv_draw_dialog(DIALOG_WIFI_ENABLE_TIPS); } } } else { last_disp_state = SET_UI; - lv_clear_set(); lv_draw_wifi(); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h index b243bca296..eed0c6c959 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h @@ -28,7 +28,6 @@ extern void lv_draw_set(void); extern void lv_clear_set(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index 022c4d30f9..88cebc4218 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -45,48 +45,37 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + lv_clear_step_settings(); switch (obj->mks_obj_id) { case ID_STEP_RETURN: uiCfg.para_ui_page = 0; - lv_clear_step_settings(); draw_return_ui(); - break; + return; case ID_STEP_X: value = Xstep; - lv_clear_step_settings(); - lv_draw_number_key(); break; case ID_STEP_Y: value = Ystep; - lv_clear_step_settings(); - lv_draw_number_key(); break; case ID_STEP_Z: value = Zstep; - lv_clear_step_settings(); - lv_draw_number_key(); break; case ID_STEP_E0: value = E0step; - lv_clear_step_settings(); - lv_draw_number_key(); break; case ID_STEP_E1: value = E1step; - lv_clear_step_settings(); - lv_draw_number_key(); break; case ID_STEP_UP: uiCfg.para_ui_page = 0; - lv_clear_step_settings(); lv_draw_step_settings(); - break; + return; case ID_STEP_DOWN: uiCfg.para_ui_page = 1; - lv_clear_step_settings(); lv_draw_step_settings(); - break; + return; } + lv_draw_number_key(); } void lv_draw_step_settings(void) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index aaf3073e3d..028c58ab43 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -46,60 +46,49 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + lv_clear_tmc_current_settings(); switch (obj->mks_obj_id) { case ID_TMC_CURRENT_RETURN: uiCfg.para_ui_page = 0; - lv_clear_tmc_current_settings(); draw_return_ui(); - break; - + return; #if AXIS_IS_TMC(X) case ID_TMC_CURRENT_X: value = Xcurrent; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); break; #endif #if AXIS_IS_TMC(Y) case ID_TMC_CURRENT_Y: value = Ycurrent; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); break; #endif #if AXIS_IS_TMC(Z) case ID_TMC_CURRENT_Z: value = Zcurrent; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); break; #endif #if AXIS_IS_TMC(E0) case ID_TMC_CURRENT_E0: value = E0current; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); break; #endif #if AXIS_IS_TMC(E1) case ID_TMC_CURRENT_E1: value = E1current; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); break; #endif case ID_TMC_CURRENT_UP: uiCfg.para_ui_page = 0; - lv_clear_tmc_current_settings(); lv_draw_tmc_current_settings(); - break; + return; case ID_TMC_CURRENT_DOWN: uiCfg.para_ui_page = 1; - lv_clear_tmc_current_settings(); lv_draw_tmc_current_settings(); - break; + return; } + lv_draw_number_key(); + } void lv_draw_tmc_current_settings(void) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 53d7e35382..691e46f01d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -50,9 +50,7 @@ enum { static lv_obj_t *buttonXState = nullptr, *buttonYState = nullptr, *buttonZState = nullptr, *buttonE0State = nullptr; -//#if AXIS_HAS_STEALTHCHOP(E1) - static lv_obj_t *buttonE1State = nullptr; -//#endif +static lv_obj_t *buttonE1State = nullptr; static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 3a9d78741a..c48d275e01 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -25,10 +25,6 @@ #include "draw_ui.h" #include -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" #include "../../../../gcode/queue.h" #include "../../../../module/temperature.h" @@ -54,45 +50,42 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + bool clear = (obj->mks_obj_id != ID_T_LEVELING); + #else + constexpr bool clear = true; + #endif + if (clear) lv_clear_tool(); switch (obj->mks_obj_id) { case ID_T_PRE_HEAT: - lv_clear_tool(); lv_draw_preHeat(); break; case ID_T_EXTRUCT: - lv_clear_tool(); lv_draw_extrusion(); break; case ID_T_MOV: - lv_clear_tool(); lv_draw_move_motor(); break; case ID_T_HOME: - lv_clear_tool(); lv_draw_home(); break; case ID_T_LEVELING: #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - //queue.enqueue_one_P(PSTR("G28")); - //queue.enqueue_one_P(PSTR("G29")); get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); public_buf_m[sizeof(public_buf_m)-1] = 0; queue.inject_P(PSTR(public_buf_m)); #else uiCfg.leveling_first_time = 1; - lv_clear_tool(); lv_draw_manualLevel(); #endif break; case ID_T_FILAMENT: uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; - lv_clear_tool(); lv_draw_filament_change(); break; case ID_T_MORE: break; case ID_T_RETURN: TERN_(MKS_TEST, curent_disp_ui = 1); - lv_clear_tool(); lv_draw_ready_print(); break; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h index 8a033e2c40..2191adccbc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h @@ -28,7 +28,6 @@ extern void lv_draw_tool(void); extern void lv_clear_tool(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h index b14700dcf3..63749a2b3c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h @@ -29,7 +29,6 @@ extern void lv_draw_touch_calibration_screen(); extern void lv_clear_touch_calibration_screen(); extern void lv_update_touch_calibration_screen(); -//extern void disp_temp_ready_print(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 46c1ab8279..ffbaba4ea5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -70,10 +70,11 @@ uint8_t printing_rate_update_flag; extern bool once_flag; extern uint8_t sel_id; -extern uint8_t public_buf[512]; -extern uint8_t bmp_public_buf[17 * 1024]; extern lv_group_t *g; +extern uint8_t bmp_public_buf[14 * 1024]; +extern uint8_t public_buf[513]; + extern void LCD_IO_WriteData(uint16_t RegValue); static const char custom_gcode_command[][100] = { @@ -568,11 +569,7 @@ char *creat_title_text() { ZERO(tmpCurFileStr); - #if _LFN_UNICODE - //cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr); - #else - cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr); - #endif + cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr); ZERO(public_buf_m); @@ -589,10 +586,7 @@ char *creat_title_text() { index++; } - if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - /*|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI*/ - ) { + if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI) { titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)":"); titleText_cat(public_buf_m, sizeof(public_buf_m), tmpCurFileStr); } @@ -617,8 +611,6 @@ char *creat_title_text() { void preview_gcode_prehandle(char *path) { #if ENABLED(SDSUPPORT) - //uint8_t re; - //uint32_t read; uint32_t pre_read_cnt = 0; uint32_t *p1; char *cur_name; @@ -957,7 +949,6 @@ void GUI_RefreshPage() { switch (disp_state) { case MAIN_UI: - //lv_draw_ready_print(); break; case EXTRUSION_UI: if (temps_update_flag) { @@ -972,14 +963,6 @@ void GUI_RefreshPage() { } break; case PRINT_READY_UI: - /* - if (gCfgItems.display_style == 2) { - if (temps_update_flag) { - temps_update_flag = false; - disp_restro_state(); - } - } - */ break; case PRINT_FILE_UI: break; @@ -1000,23 +983,9 @@ void GUI_RefreshPage() { break; case OPERATE_UI: - /* - if (temps_update_flag) { - temps_update_flag = false; - disp_temp_operate(); - } - - setProBarRateOpera(); - */ break; case PAUSE_UI: - /* - if (temps_update_flag) { - temps_update_flag = false; - disp_temp_pause(); - } - */ break; case FAN_UI: @@ -1027,17 +996,6 @@ void GUI_RefreshPage() { break; case MOVE_MOTOR_UI: - /* - if (mksReprint.mks_printer_state == MKS_IDLE) { - if (z_high_count == 1 && temper_error_flg != 1) { - z_high_count = 0; - memset((char *)gCfgItems.move_z_coordinate, ' ', sizeof(gCfgItems.move_z_coordinate)); - GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); - sprintf_P((char *)gCfgItems.move_z_coordinate, PSTR("Z: %.3f"), current_position[Z_AXIS]); - GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); - } - } - */ break; #if ENABLED(MKS_WIFI_MODULE) @@ -1064,7 +1022,6 @@ void GUI_RefreshPage() { TERN_(MKS_WIFI_MODULE, wifi_scan_handle()); break; case MESHLEVELING_UI: - /*disp_zpos();*/ break; case HARDWARE_TEST_UI: break; @@ -1077,8 +1034,6 @@ void GUI_RefreshPage() { #endif break; case KEY_BOARD_UI: - /*update_password_disp(); - update_join_state_disp();*/ break; #if ENABLED(MKS_WIFI_MODULE) case WIFI_TIPS_UI: @@ -1142,33 +1097,33 @@ void clear_cur_ui() { last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index]; switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { - case PRINT_READY_UI: //Get_Temperature_Flg = 0; + case PRINT_READY_UI: lv_clear_ready_print(); break; case PRINT_FILE_UI: lv_clear_print_file(); break; case PRINTING_UI: lv_clear_printing(); break; case MOVE_MOTOR_UI: lv_clear_move_motor(); break; case OPERATE_UI: lv_clear_operation(); break; - case PAUSE_UI: /* Clear_pause(); */ break; + case PAUSE_UI: break; case EXTRUSION_UI: lv_clear_extrusion(); break; case PRE_HEAT_UI: lv_clear_preHeat(); break; case CHANGE_SPEED_UI: lv_clear_change_speed(); break; case FAN_UI: lv_clear_fan(); break; case SET_UI: lv_clear_set(); break; case ZERO_UI: lv_clear_home(); break; - case SPRAYER_UI: /* Clear_Sprayer(); */ break; - case MACHINE_UI: /* Clear_Machine(); */ break; + case SPRAYER_UI: break; + case MACHINE_UI: break; case LANGUAGE_UI: lv_clear_language(); break; case ABOUT_UI: lv_clear_about(); break; - case LOG_UI: /* Clear_Connect(); */ break; - case DISK_UI: /* Clear_Disk(); */ break; + case LOG_UI: break; + case DISK_UI: break; #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: lv_clear_wifi(); break; #endif case MORE_UI: /* Clear_more(); */ break; - case FILETRANSFER_UI: /* Clear_fileTransfer(); */ break; + case FILETRANSFER_UI: break; case DIALOG_UI: lv_clear_dialog(); break; - case FILETRANSFERSTATE_UI: /* Clear_WifiFileTransferdialog(); */ break; - case PRINT_MORE_UI: /* Clear_Printmore(); */ break; + case FILETRANSFERSTATE_UI: break; + case PRINT_MORE_UI: break; case FILAMENTCHANGE_UI: lv_clear_filament_change(); break; case LEVELING_UI: lv_clear_manualLevel(); break; case BIND_UI: /* Clear_Bind(); */ break; @@ -1176,8 +1131,8 @@ void clear_cur_ui() { case NOZZLE_PROBE_OFFSET_UI: lv_clear_auto_level_offset_settings(); break; #endif case TOOL_UI: lv_clear_tool(); break; - case MESHLEVELING_UI: /* Clear_MeshLeveling(); */ break; - case HARDWARE_TEST_UI: /* Clear_Hardwaretest(); */ break; + case MESHLEVELING_UI: break; + case HARDWARE_TEST_UI: break; #if ENABLED(MKS_WIFI_MODULE) case WIFI_LIST_UI: lv_clear_wifi_list(); break; #endif @@ -1187,28 +1142,28 @@ void clear_cur_ui() { #endif case MACHINE_PARA_UI: lv_clear_machine_para(); break; case MACHINE_SETTINGS_UI: lv_clear_machine_settings(); break; - case TEMPERATURE_SETTINGS_UI: /* Clear_TemperatureSettings(); */ break; + case TEMPERATURE_SETTINGS_UI: break; case MOTOR_SETTINGS_UI: lv_clear_motor_settings(); break; - case MACHINETYPE_UI: /* Clear_MachineType(); */ break; - case STROKE_UI: /* Clear_Stroke(); */ break; - case HOME_DIR_UI: /* Clear_HomeDir(); */ break; - case ENDSTOP_TYPE_UI: /* Clear_EndstopType(); */ break; - case FILAMENT_SETTINGS_UI: lv_clear_filament_settings(); break; - case LEVELING_SETTIGNS_UI: /* Clear_LevelingSettings(); */ break; + case MACHINETYPE_UI: break; + case STROKE_UI: break; + case HOME_DIR_UI: break; + case ENDSTOP_TYPE_UI: break; + case FILAMENT_SETTINGS_UI: break; + case LEVELING_SETTIGNS_UI: break; case LEVELING_PARA_UI: lv_clear_level_settings(); break; - case DELTA_LEVELING_PARA_UI: /* Clear_DeltaLevelPara(); */ break; + case DELTA_LEVELING_PARA_UI: break; case MANUAL_LEVELING_POSIGION_UI: lv_clear_manual_level_pos_settings(); break; case MAXFEEDRATE_UI: lv_clear_max_feedrate_settings(); break; case STEPS_UI: lv_clear_step_settings(); break; case ACCELERATION_UI: lv_clear_acceleration_settings(); break; case JERK_UI: TERN_(HAS_CLASSIC_JERK, lv_clear_jerk_settings()); break; - case MOTORDIR_UI: /* Clear_MotorDir(); */ break; - case HOMESPEED_UI: /* Clear_HomeSpeed(); */ break; - case NOZZLE_CONFIG_UI: /* Clear_NozzleConfig(); */ break; - case HOTBED_CONFIG_UI: /* Clear_HotbedConfig(); */ break; + case MOTORDIR_UI: break; + case HOMESPEED_UI: break; + case NOZZLE_CONFIG_UI: break; + case HOTBED_CONFIG_UI: break; case ADVANCED_UI: lv_clear_advance_settings(); break; - case DOUBLE_Z_UI: /* Clear_DoubleZ(); */ break; - case ENABLE_INVERT_UI: /* Clear_EnableInvert(); */ break; + case DOUBLE_Z_UI: break; + case ENABLE_INVERT_UI: break; case NUMBER_KEY_UI: lv_clear_number_key(); break; case BABY_STEP_UI: lv_clear_baby_stepping(); break; case PAUSE_POS_UI: lv_clear_pause_position(); break; @@ -1233,7 +1188,6 @@ void clear_cur_ui() { #endif default: break; } - //GUI_Clear(); } void draw_return_ui() { @@ -1253,25 +1207,25 @@ void draw_return_ui() { case MOVE_MOTOR_UI: lv_draw_move_motor(); break; case OPERATE_UI: lv_draw_operation(); break; - case PAUSE_UI: /* draw_pause(); */ break; + case PAUSE_UI: break; case EXTRUSION_UI: lv_draw_extrusion(); break; case PRE_HEAT_UI: lv_draw_preHeat(); break; case CHANGE_SPEED_UI: lv_draw_change_speed(); break; case FAN_UI: lv_draw_fan(); break; case SET_UI: lv_draw_set(); break; case ZERO_UI: lv_draw_home(); break; - case SPRAYER_UI: /* draw_Sprayer(); */ break; - case MACHINE_UI: /* draw_Machine(); */ break; + case SPRAYER_UI: break; + case MACHINE_UI: break; case LANGUAGE_UI: lv_draw_language(); break; case ABOUT_UI: lv_draw_about(); break; - case CALIBRATE_UI: /* draw_calibrate(); */ break; - case DISK_UI: /* draw_Disk(); */ break; + case CALIBRATE_UI: break; + case DISK_UI: break; #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: lv_draw_wifi(); break; #endif - case MORE_UI: /* draw_More(); */ break; case PRINT_MORE_UI: /* draw_printmore(); */ break; + case MORE_UI: break; case FILAMENTCHANGE_UI: lv_draw_filament_change(); break; case LEVELING_UI: lv_draw_manualLevel(); break; case BIND_UI: /* draw_bind(); */ break; @@ -1279,8 +1233,8 @@ void draw_return_ui() { case NOZZLE_PROBE_OFFSET_UI: lv_draw_auto_level_offset_settings(); break; #endif case TOOL_UI: lv_draw_tool(); break; - case MESHLEVELING_UI: /* draw_meshleveling(); */ break; - case HARDWARE_TEST_UI: /* draw_Hardwaretest(); */ break; + case MESHLEVELING_UI: break; + case HARDWARE_TEST_UI: break; #if ENABLED(MKS_WIFI_MODULE) case WIFI_LIST_UI: lv_draw_wifi_list(); break; #endif @@ -1290,16 +1244,16 @@ void draw_return_ui() { #endif case MACHINE_PARA_UI: lv_draw_machine_para(); break; case MACHINE_SETTINGS_UI: lv_draw_machine_settings(); break; - case TEMPERATURE_SETTINGS_UI: /* draw_TemperatureSettings(); */ break; + case TEMPERATURE_SETTINGS_UI: break; case MOTOR_SETTINGS_UI: lv_draw_motor_settings(); break; - case MACHINETYPE_UI: /* draw_MachineType(); */ break; - case STROKE_UI: /* draw_Stroke(); */ break; - case HOME_DIR_UI: /* draw_HomeDir(); */ break; - case ENDSTOP_TYPE_UI: /* draw_EndstopType(); */ break; + case MACHINETYPE_UI: break; + case STROKE_UI: break; + case HOME_DIR_UI: break; + case ENDSTOP_TYPE_UI: break; case FILAMENT_SETTINGS_UI: lv_draw_filament_settings(); break; - case LEVELING_SETTIGNS_UI: /* draw_LevelingSettings(); */ break; + case LEVELING_SETTIGNS_UI: break; case LEVELING_PARA_UI: lv_draw_level_settings(); break; - case DELTA_LEVELING_PARA_UI: /* draw_DeltaLevelPara(); */ break; + case DELTA_LEVELING_PARA_UI: break; case MANUAL_LEVELING_POSIGION_UI: lv_draw_manual_level_pos_settings(); break; case MAXFEEDRATE_UI: lv_draw_max_feedrate_settings(); break; case STEPS_UI: lv_draw_step_settings(); break; @@ -1307,15 +1261,15 @@ void draw_return_ui() { #if HAS_CLASSIC_JERK case JERK_UI: lv_draw_jerk_settings(); break; #endif - case MOTORDIR_UI: /* draw_MotorDir(); */ break; - case HOMESPEED_UI: /* draw_HomeSpeed(); */ break; - case NOZZLE_CONFIG_UI: /* draw_NozzleConfig(); */ break; - case HOTBED_CONFIG_UI: /* draw_HotbedConfig(); */ break; + case MOTORDIR_UI: break; + case HOMESPEED_UI: break; + case NOZZLE_CONFIG_UI: break; + case HOTBED_CONFIG_UI: break; case ADVANCED_UI: lv_draw_advance_settings(); break; - case DOUBLE_Z_UI: /* draw_DoubleZ(); */ break; - case ENABLE_INVERT_UI: /* draw_EnableInvert(); */ break; + case DOUBLE_Z_UI: break; + case ENABLE_INVERT_UI: break; case NUMBER_KEY_UI: lv_draw_number_key(); break; - case DIALOG_UI: /* draw_dialog(uiCfg.dialogType); */ break; + case DIALOG_UI: break; case BABY_STEP_UI: lv_draw_baby_stepping(); break; case PAUSE_POS_UI: lv_draw_pause_position(); break; #if HAS_TRINAMIC_CONFIG @@ -1612,7 +1566,6 @@ void print_time_count() { } void LV_TASK_HANDLER() { - //lv_tick_inc(1); lv_task_handler(); if (mks_test_flag == 0x1E) mks_hardware_test(); @@ -1622,8 +1575,6 @@ void LV_TASK_HANDLER() { TERN_(MKS_WIFI_MODULE, get_wifi_commands()); - //sd_detection(); - #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_update_encoder(); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index a888217b9a..c911e9a6fd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -28,7 +28,7 @@ // the colors of the last MKS Ui #undef LV_COLOR_BACKGROUND -#define LV_COLOR_BACKGROUND LV_COLOR_MAKE(0x1A, 0x1A, 0x1A) // LV_COLOR_MAKE(0x00, 0x00, 0x00) +#define LV_COLOR_BACKGROUND LV_COLOR_MAKE(0x1A, 0x1A, 0x1A) #define TFT_LV_PARA_BACK_BODY_COLOR LV_COLOR_MAKE(0x4A, 0x52, 0xFF) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index 47a5dff048..8dc6beb130 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -153,9 +153,8 @@ void disp_wifi_state() { } void lv_clear_wifi() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif + if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable)) + lv_group_remove_all_objs(g); lv_obj_del(scr); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp index f902edce7c..699b3fdaef 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -122,6 +122,9 @@ void lv_draw_wifi_list(void) { lv_group_add_obj(g, buttonDown); lv_group_add_obj(g, buttonBack); } + #else + UNUSED(buttonDown); + UNUSED(buttonBack); #endif disp_wifi_list(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp index fbc8192ffb..f3585cc6cb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp @@ -50,10 +50,8 @@ static x_header_t __g_xbf_hd = { .min = 0, .max = 0, .bpp = 0 }; static uint8_t __g_font_buf[63]; static uint8_t *__user_font_getdata(int offset, int size) { - //ZERO(__g_font_buf); get_spi_flash_data((char *)__g_font_buf, offset, size); return __g_font_buf; - //return &buf_test[offset]; } static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t unicode_letter) { @@ -67,9 +65,7 @@ static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t u uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); if (p_pos[0] != 0) { uint32_t pos = p_pos[0]; - //glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(pos, 2); __user_font_getdata(pos, 2); - //return __user_font_getdata(pos+2, gdsc->box_w*__g_xbf_hd.bpp/8); return __user_font_getdata(pos + 2, sizeof(__g_font_buf)); } return nullptr; @@ -97,12 +93,6 @@ static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_ return false; } -/*lv_font_t gb2312_puhui32 = { -.get_glyph_bitmap = __user_font_get_bitmap, -.get_glyph_dsc = __user_font_get_glyph_dsc, -.line_height = 25, -.base_line = 0, -};*/ lv_font_t gb2312_puhui32; void init_gb2312_font() { gb2312_puhui32.get_glyph_bitmap = __user_font_get_bitmap; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index 06d6ca6b72..d2d1c19063 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -53,11 +53,8 @@ void test_gpio_readlevel_L() { #if PIN_EXISTS(MT_DET_2) mt_det2_sta = (READ(MT_DET_2_PIN) == 0); #endif - //mt_det3_sta = (READ(FIL_RUNOUT_3_PIN) == 0); endstopx1_sta = (READ(X_MIN_PIN) == 0); - //endstopx2_sta = (READ(X_MAX_PIN) == 0); endstopy1_sta = (READ(Y_MIN_PIN) == 0); - //endstopy2_sta = (READ(Y_MAX_PIN) == 0); endstopz1_sta = (READ(Z_MIN_PIN) == 0); endstopz2_sta = (READ(Z_MAX_PIN) == 0); #endif @@ -75,11 +72,8 @@ void test_gpio_readlevel_H() { #if PIN_EXISTS(MT_DET_2) mt_det2_sta = (READ(MT_DET_2_PIN) == 1); #endif - //mt_det3_sta = (READ(MT_DET_3_PIN) == 1); endstopx1_sta = (READ(X_MIN_PIN) == 1); - //endstopx2_sta = (READ(X_MAX_PIN) == 1); endstopy1_sta = (READ(Y_MIN_PIN) == 1); - //endstopy2_sta = (READ(Y_MAX_PIN) == 1); endstopz1_sta = (READ(Z_MIN_PIN) == 1); endstopz2_sta = (READ(Z_MAX_PIN) == 1); #endif @@ -88,9 +82,7 @@ void test_gpio_readlevel_H() { void init_test_gpio() { #ifdef MKS_TEST SET_INPUT_PULLUP(X_MIN_PIN); - //SET_INPUT_PULLUP(X_MAX_PIN); SET_INPUT_PULLUP(Y_MIN_PIN); - //SET_INPUT_PULLUP(Y_MAX_PIN); SET_INPUT_PULLUP(Z_MIN_PIN); SET_INPUT_PULLUP(Z_MAX_PIN); @@ -100,7 +92,6 @@ void init_test_gpio() { #if PIN_EXISTS(MT_DET_2) SET_INPUT_PULLUP(MT_DET_2_PIN); #endif - //SET_INPUT_PULLUP(MT_DET_3_PIN); SET_INPUT_PULLUP(MKS_TEST_POWER_LOSS_PIN); SET_INPUT_PULLUP(MKS_TEST_PS_ON_PIN); @@ -122,7 +113,6 @@ void init_test_gpio() { #if !MB(MKS_ROBIN_E3P) WRITE(E1_ENABLE_PIN, LOW); #endif - //WRITE(E2_ENABLE_PIN, LOW); #if MB(MKS_ROBIN_E3P) SET_INPUT_PULLUP(PA1); @@ -167,15 +157,13 @@ void mks_gpio_test() { && (READ(PE6) == 0) && (READ(PE7) == 0) #endif - ) // &&(mt_det3_sta == 1)) + ) disp_det_ok(); else disp_det_error(); if ( (endstopx1_sta == 1) - //&& (endstopx2_sta == 1) && (endstopy1_sta == 1) - //&& (endstopy2_sta == 1) && (endstopz1_sta == 1) && (endstopz2_sta == 1) ) @@ -195,9 +183,7 @@ void mks_hardware_test() { #if !MB(MKS_ROBIN_E3P) WRITE(E1_DIR_PIN, LOW); #endif - //WRITE(E2_DIR_PIN, LOW); thermalManager.fan_speed[0] = 255; - //WRITE(HEATER_2_PIN, HIGH); // HE2 #if !MB(MKS_ROBIN_E3P) WRITE(HEATER_1_PIN, HIGH); // HE1 #endif @@ -212,9 +198,7 @@ void mks_hardware_test() { #if !MB(MKS_ROBIN_E3P) WRITE(E1_DIR_PIN, HIGH); #endif - //WRITE(E2_DIR_PIN, HIGH); thermalManager.fan_speed[0] = 0; - //WRITE(HEATER_2_PIN, LOW); // HE2 #if !MB(MKS_ROBIN_E3P) WRITE(HEATER_1_PIN, LOW); // HE1 #endif @@ -229,7 +213,6 @@ void mks_hardware_test() { // nothing here } else { - //mks_test_beeper(); } if (disp_state == PRINT_READY_UI) @@ -637,7 +620,6 @@ void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor } } -//static lv_obj_t *scr_test; void disp_assets_update() { SPI_TFT.LCD_clear(0x0000); disp_string(100, 140, "Assets Updating...", 0xFFFF, 0x0000); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 4dd84d0212..c908b9af3a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -36,7 +36,6 @@ #include "../../../../MarlinCore.h" extern uint16_t DeviceCode; -extern unsigned char bmp_public_buf[17 * 1024]; #if ENABLED(SDSUPPORT) extern char *createFilename(char * const buffer, const dir_t &p); @@ -55,7 +54,6 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_preHeat.bin", "bmp_extruct.bin", "bmp_mov.bin", - // "bmp_Zero.bin", "bmp_leveling.bin", "bmp_filamentchange.bin", @@ -65,13 +63,8 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_speed255.bin", "bmp_speed127.bin", "bmp_speed0.bin", - - //preheat screen - // "bmp_Add.bin", - // "bmp_Dec.bin", "bmp_speed0.bin", - // "bmp_Extru2.bin", - // "bmp_Extru1.bin", + "bmp_bed.bin", "bmp_step1_degree.bin", "bmp_step5_degree.bin", @@ -113,7 +106,6 @@ static const char assets[][LONG_FILENAME_LENGTH] = { //operation screen "bmp_auto_off.bin", "bmp_speed.bin", - //"bmp_Mamual.bin", //TODO: didn't find it.. changed to bmp_manual_off.bin "bmp_fan.bin", "bmp_temp.bin", "bmp_extrude_opr.bin", @@ -125,7 +117,6 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_step10_percent.bin", "bmp_extruct_sel.bin", "bmp_mov_changespeed.bin", - // "bmp_extrude_opr.bin", equal to "bmp_Extruct.bin" "bmp_mov_sel.bin", "bmp_speed_extruct.bin", @@ -182,9 +173,6 @@ static const char assets[][LONG_FILENAME_LENGTH] = { // settings screen "bmp_about.bin", - //"bmp_Language.bin", - //"bmp_Fan.bin", - //"bmp_manual_off.bin", //start screen "bmp_printing.bin", @@ -373,8 +361,6 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { return Pic_SaveAddr; } -uint8_t public_buf[512]; - #if ENABLED(SDSUPPORT) static void dosName2LongName(const char dosName[11], char* longName) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index ea75915df3..b856916b95 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -95,9 +95,7 @@ #define PIC_NAME_ADDR 0x003000 // Pic information addr #define PIC_SIZE_ADDR 0x007000 // Pic size information addr #define PIC_COUNTER_ADDR 0x008000 // Pic total number - //#define PER_PIC_SAVE_ADDR 0x009000 // Storage address of each picture #define PIC_LOGO_ADDR 0x009000 // Logo addr - //#define PIC_DATA_ADDR 0x02F000 // // TFT35 #define DEFAULT_VIEW_ADDR_TFT35 0xC5800 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 1b611aba60..3c3e7c2674 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -69,9 +69,6 @@ void printer_state_polling() { uiCfg.print_state = PAUSED; uiCfg.current_e_position_bak = current_position.e; - // #if ENABLED(POWER_LOSS_RECOVERY) - // if (recovery.enabled) recovery.save(true); - // #endif gCfgItems.pause_reprint = true; update_spi_flash(); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 41bf82e80f..07f4474dd6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -381,28 +381,12 @@ #define FILAMENT_EXT1_TEXT_EN "Extrusion2" #define FILAMENT_HEAT_TEXT_EN "Preheat" #define FILAMENT_STOP_TEXT_EN "Stop" -//#define FILAMENT_CHANGE_TEXT_EN "Filament replace" #define FILAMENT_TIPS2_TEXT_EN "T:" #define FILAMENT_TIPS3_TEXT_EN "Loading..." #define FILAMENT_TIPS4_TEXT_EN "Unloading..." #define FILAMENT_TIPS5_TEXT_EN "Temp is too low to go,please heat" #define FILAMENT_TIPS6_TEXT_EN "Completed" -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_EN "Please click or \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_EN "Please click or ,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please click for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,click for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,click for return!" -#endif - - #define FILAMENT_CHANGE_TEXT_EN "Please click \nor ,After \npinter pause." #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN "Heating up the nozzle,\nplease wait..." #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN "Heating up the nozzle,\nplease wait..." @@ -419,11 +403,7 @@ #define PRE_HEAT_BED_TEXT_EN "Bed" #define FILE_LOADING_EN "Loading......" -#if 0 - #define NO_FILE_AND_CHECK_EN "No files found!Please insert SD card or U disk!" -#else - #define NO_FILE_AND_CHECK_EN " No files found!\n Check the file system configuration!" -#endif +#define NO_FILE_AND_CHECK_EN " No files found!\n Check the file system configuration!" #define NO_FILE_EN "No files found!" @@ -491,7 +471,6 @@ #define DIALOG_RETRY_EN "Retry" #define DIALOG_STOP_EN "Stop" #define DIALOG_REPRINT_FROM_BREAKPOINT_EN "Reprint from breakpoint?" -//#define DIALOG_UNBIND_PRINTER_EN "Unbind the printer?" #define DIALOG_ERROR_TIPS1_EN "Error:no file,please check it again." #define DIALOG_ERROR_TIPS2_EN "Error:transaction failed.please check display baudrate \nwhether as the same as mainboard!" #define DIALOG_ERROR_TIPS3_EN "Error:file name or path is too long!" @@ -691,34 +670,16 @@ //manual ip #define MANUAL_IP_TITLE_EN "Manual IP" -#define MANUAL_IP_CANCEL_EN "< Cancel" +#define MANUAL_IP_CANCEL_EN "< Cancel" #define MANUAL_IP_APPLY_EN "Join >" #define MANUAL_IP_ADDRESS_EN "IP Address" #define MANUAL_IP_MASK_EN "Subnet Mask" #define MANUAL_IP_GATEWAY_EN "Default Gateway" #define MANUAL_IP_SERVER_EN "Name Server" #define MANUAL_IP_INIT_DATA_EN "0.0.0.0" -#define MANUAL_TEXT_POINT_EN "." +#define MANUAL_TEXT_POINT_EN "." #define MANUAL_TEXT_ENTER_EN "enter" -//Wifi name -//#define TEXT_WIFI_MENU_TITLE_EN "WI-FI" -//#define TEXT_WIFI_SAPCE_EN "space" -//#define TEXT_WIFI_LETTER_EN "abc" -//#define TEXT_WIFI_DIGITAL_EN "123" -//#define TEXT_WIFI_SYMBOL_EN "#+=" -//#define TEXT_WIFI_PASSWORD_EN "Password" - -//#define TEXT_WIFI_POINT_BOLD_EN "`" - -//#define TEXT_WIFI_JOINING_EN "Joining\nNetwork..." -//#define TEXT_WIFI_FAILED_JOIN_EN "Failed to\nJoin Wi-Fi" -//#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi\nConnected" - -//#define TEXT_BUTTON_DISCONECTED_EN "Disconnect" -//#define TEXT_WIFI_FORGET_EN "Forget Network" -//#define TEXT_DISCONECTED_EN "Wi-Fi Connected" - #define TEXT_FORGET_TIPS_TITLE_EN "Forget Network" #define TEXT_FORGET_NETWORK_TIPS1_EN "Are you sure you want to\nforget this network?" #define TEXT_FORGET_NETWORK_TIPS2_EN "This machine will no longer\njoin this Wi-Fi Network." diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index 6944d6b235..8b090285b3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -135,26 +135,12 @@ #define FILAMENT_EXT1_TEXT_FR "Extr2" #define FILAMENT_HEAT_TEXT_FR "Preheat" #define FILAMENT_STOP_TEXT_FR "Arrêter" -//#define FILAMENT_CHANGE_TEXT_FR "Filament remplacer" #define FILAMENT_TIPS2_TEXT_FR "T:" #define FILAMENT_TIPS3_TEXT_FR "Insérer le filament..." #define FILAMENT_TIPS4_TEXT_FR "éjecter le filament..." #define FILAMENT_TIPS5_TEXT_FR "Température trop basse pour démarrer, chauffez svp" #define FILAMENT_TIPS6_TEXT_FR "Terminé" -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_FR "Please click or <éjecter> \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_FR "Please click or <éjecter>,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please click for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,click for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,click for return!" -#endif #define FILAMENT_CHANGE_TEXT_FR "Please click \nor ,After \npinter pause." #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..." #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..." @@ -171,16 +157,9 @@ #define PRE_HEAT_BED_TEXT_FR "Bed" #define FILE_LOADING_FR "Chargement......" -#if 0 - #define NO_FILE_AND_CHECK_FR "Aucun fichier trouvé! Insérez une carte SD ou un disque U!" -#else - #define NO_FILE_AND_CHECK_FR "Aucun fichier,vérifiez à nouveau!" -#endif - +#define NO_FILE_AND_CHECK_FR "Aucun fichier, vérifiez à nouveau!" #define NO_FILE_FR "Pas de fichier!" - - #define EXTRUDER_TEMP_TEXT_FR "Temper" #define EXTRUDER_E_LENGTH1_TEXT_FR "Extruder1" #define EXTRUDER_E_LENGTH2_TEXT_FR "Extruder2" @@ -222,7 +201,7 @@ #define TITLE_ADJUST_FR "Réglage" #define TITLE_WIRELESS_FR "Sans fil" #define TITLE_FILAMENT_FR "Remplacer" -#define TITLE_ABOUT_FR "A propos" +#define TITLE_ABOUT_FR "À propos" #define TITLE_FAN_FR "Ventilateur" #define TITLE_LANGUAGE_FR "Langue" #define TITLE_PAUSE_FR "Pause" @@ -247,7 +226,6 @@ #define DIALOG_STOP_FR "Arrêter" #define DIALOG_REPRINT_FROM_BREAKPOINT_FR "Continuer?" -//#define DIALOG_UNBIND_PRINTER_FR "Non lié?" #define DIALOG_ERROR_TIPS1_FR "Erreur:error:Aucun fichier, \nvérifiez à nouveau." #define DIALOG_ERROR_TIPS2_FR "Erreur:La opération a échoué. \nVerifiez que le baudrate de l'écran et de \nla carte mère soient identique!" #define DIALOG_ERROR_TIPS3_FR "Erreur: le nom du fichier ou le \nchemin d'accès est trop long." @@ -261,10 +239,10 @@ #define MESSAGE_PAUSING_FR "Parking..." #define MESSAGE_CHANGING_FR "Attente filament pour démarrer" #define MESSAGE_UNLOAD_FR "Attente retrait du filament" -#define MESSAGE_WAITING_FR "Presser bouton,pour reprendre" +#define MESSAGE_WAITING_FR "Presser bouton, pour reprendre" #define MESSAGE_INSERT_FR "Insérer filament et app. bouton pour continuer..." #define MESSAGE_LOAD_FR "Attente chargement filament" -#define MESSAGE_PURGE_FR "Attente Purge filament" +#define MESSAGE_PURGE_FR "Attente purge filament" #define MESSAGE_RESUME_FR "Attente reprise impression" #define MESSAGE_HEAT_FR "Presser le bouton pour chauffer..." #define MESSAGE_HEATING_FR "Buse en chauffe Patienter SVP..." diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index f64ca4df79..9f53b1b321 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -135,26 +135,12 @@ #define FILAMENT_EXT1_TEXT_IT "Estrude2" #define FILAMENT_HEAT_TEXT_IT "Preriscaldamento" #define FILAMENT_STOP_TEXT_IT "Stop" -//#define FILAMENT_CHANGE_TEXT_IT "Filamento" #define FILAMENT_TIPS2_TEXT_IT "T:" #define FILAMENT_TIPS3_TEXT_IT "Inserimento del filamento..." #define FILAMENT_TIPS4_TEXT_IT "Estrazione del filamento..." #define FILAMENT_TIPS5_TEXT_IT "Temp is too low to go,please heat" #define FILAMENT_TIPS6_TEXT_IT "Completato" -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_IT "Please click or \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_IT "Please click or ,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please click for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,click for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,click for return!" -#endif #define FILAMENT_CHANGE_TEXT_IT "Please click \nor ,After \npinter pause." #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." @@ -166,16 +152,11 @@ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,\nclick for return!" - #define PRE_HEAT_EXT_TEXT_IT "E" #define PRE_HEAT_BED_TEXT_IT "Piano" #define FILE_LOADING_IT "Caricamento......" -#if 0 - #define NO_FILE_AND_CHECK_IT "Nessun file trovato! Inserisci la scheda SD o il disco U!" -#endif #define NO_FILE_AND_CHECK_IT "Nessun file,\n per favore controllare di nuovo!" - #define NO_FILE_IT "Nessun file!" #define EXTRUDER_TEMP_TEXT_IT "Temper" @@ -241,7 +222,6 @@ #define DIALOG_CANCEL_PRINT_IT "Stop stampa?" #define DIALOG_STOP_IT "Stop" #define DIALOG_REPRINT_FROM_BREAKPOINT_IT "Continua a stampare dal \npunto di interruzione?" -//#define DIALOG_UNBIND_PRINTER_IT "Libero?" #define DIALOG_ERROR_TIPS1_IT "Errore: nessun file, \nper favore controllare di nuovo." #define DIALOG_ERROR_TIPS2_IT "Errore: operazione non riuscita, \nsi prega di controllare se il baudrate del \ndisplay è lo stesso scheda madre" #define DIALOG_ERROR_TIPS3_IT "Errore: il nome del file o il \npercorso è troppo lungo!" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index 9f695b376b..a284b2bad8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -135,26 +135,12 @@ #define FILAMENT_EXT1_TEXT_RU "ÑкÑтрудер2" #define FILAMENT_HEAT_TEXT_RU "нагрев" #define FILAMENT_STOP_TEXT_RU "Ñтоп" -//#define FILAMENT_CHANGE_TEXT_RU "замена" #define FILAMENT_TIPS2_TEXT_RU "T:" #define FILAMENT_TIPS3_TEXT_RU "втÑнуть..." #define FILAMENT_TIPS4_TEXT_RU "вÑдавить..." #define FILAMENT_TIPS5_TEXT_RU "ÐÐ¸Ð·ÐºÐ°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð°, \nнеобходим нагрев" #define FILAMENT_TIPS6_TEXT_RU "завершено" -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_RU "Please click <втÑнуть> or <выдавить> \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_RU "Please click <втÑнуть> or <выдавить>,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament to extruder,and click <да> for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,and click <да> for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please click <да> for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,click <да> for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,click <да> for return!" -#endif #define FILAMENT_CHANGE_TEXT_RU "Please click \nor ,After \npinter pause." #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU "Heating up the nozzle,\nplease wait..." #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU "Heating up the nozzle,\nplease wait..." @@ -166,14 +152,10 @@ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,\nclick for return!" - #define PRE_HEAT_EXT_TEXT_RU "E" #define PRE_HEAT_BED_TEXT_RU "Ñтол" #define FILE_LOADING_RU "загрузка......" -#if 0 - #define NO_FILE_AND_CHECK_RU "Файлы не найдены! Ð’Ñтавьте SD-карту или диÑк U!" -#endif #define NO_FILE_AND_CHECK_RU "нет файла,попробуйте ещё раз!" #define NO_FILE_RU "нет файла!" @@ -242,7 +224,6 @@ #define DIALOG_CANCEL_PRINT_RU "Ñтоп?" #define DIALOG_STOP_RU "Ñтоп" #define DIALOG_REPRINT_FROM_BREAKPOINT_RU "продолжить?" -//#define DIALOG_UNBIND_PRINTER_RU "разрыв?" #define DIALOG_ERROR_TIPS1_RU "ошибка:нет файла, попробуйте ещё раз." #define DIALOG_ERROR_TIPS2_RU "ошибка:Ñбой передачи. уÑтановите ÑкороÑÑ‚ÑŒ \nпередачи данных как на плате управлениÑ!" #define DIALOG_ERROR_TIPS3_RU "ошибка: Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñлишком длинное!" @@ -268,9 +249,9 @@ #define MESSAGE_PURGE_MORE_RU "чиÑтка" #define MESSAGE_CONTINUE_PRINT_RU "РаÑпечатать" #define EEPROM_SETTINGS_TITLE_RU "ÐаÑтройки EEPROM" -#define EEPROM_SETTINGS_STORE_RU "Сохранение наÑтроек в EEPROM" +#define EEPROM_SETTINGS_STORE_RU "Cохранение наÑтроек в EEPROM" #define EEPROM_SETTINGS_READ_RU "Чтение наÑтроек из EEPROM" -#define EEPROM_SETTINGS_REVERT_RU "ВоÑÑтановить заводÑкие наÑтройки по умолчанию" +#define EEPROM_SETTINGS_REVERT_RU "BоÑÑтановить заводÑкие наÑтройки по умолчанию" #define EEPROM_STORE_TIPS_RU "Сохранить наÑтройки в EEPROM?" #define EEPROM_READ_TIPS_RU "Читать наÑтройки из EEPROM?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index 1189927770..45eeb0f990 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -177,42 +177,42 @@ #define E0_STEPS_CN "E0轴脉冲" #define E1_STEPS_CN "E1轴脉冲" -#define TMC_CURRENT_CONF_TITLE_CN "机器å‚æ•°>TMC电æµè®¾ç½®" -#define X_TMC_CURRENT_CN "X轴电æµ(毫安)" -#define Y_TMC_CURRENT_CN "Y轴电æµ(毫安)" -#define Z_TMC_CURRENT_CN "Z轴电æµ(毫安)" -#define E0_TMC_CURRENT_CN "E0轴电æµ(毫安)" -#define E1_TMC_CURRENT_CN "E1轴电æµ(毫安)" +#define TMC_CURRENT_CONF_TITLE_CN "机器å‚æ•°>TMC电æµè®¾ç½®" +#define X_TMC_CURRENT_CN "X轴电æµ(毫安)" +#define Y_TMC_CURRENT_CN "Y轴电æµ(毫安)" +#define Z_TMC_CURRENT_CN "Z轴电æµ(毫安)" +#define E0_TMC_CURRENT_CN "E0轴电æµ(毫安)" +#define E1_TMC_CURRENT_CN "E1轴电æµ(毫安)" -#define TMC_MODE_CONF_TITLE_CN "机器å‚æ•°>TMC模å¼è®¾ç½®" -#define X_TMC_MODE_CN "X轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" -#define Y_TMC_MODE_CN "Y轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" -#define Z_TMC_MODE_CN "Z轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" -#define E0_TMC_MODE_CN "E0轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" -#define E1_TMC_MODE_CN "E1轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define TMC_MODE_CONF_TITLE_CN "机器å‚æ•°>TMC模å¼è®¾ç½®" +#define X_TMC_MODE_CN "X轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define Y_TMC_MODE_CN "Y轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define Z_TMC_MODE_CN "Z轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define E0_TMC_MODE_CN "E0轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define E1_TMC_MODE_CN "E1轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" -#define MOTORDIR_CONF_TITLE_CN "机器å‚æ•°>电机方å‘" -#define X_MOTORDIR_CN "X轴电机方å‘" -#define Y_MOTORDIR_CN "Y轴电机方å‘" -#define Z_MOTORDIR_CN "Z轴电机方å‘" -#define E0_MOTORDIR_CN "E0轴电机方å‘" -#define E1_MOTORDIR_CN "E1轴电机方å‘" -#define INVERT_P_CN "æ­£å‘" -#define INVERT_N_CN "åå‘" +#define MOTORDIR_CONF_TITLE_CN "机器å‚æ•°>电机方å‘" +#define X_MOTORDIR_CN "X轴电机方å‘" +#define Y_MOTORDIR_CN "Y轴电机方å‘" +#define Z_MOTORDIR_CN "Z轴电机方å‘" +#define E0_MOTORDIR_CN "E0轴电机方å‘" +#define E1_MOTORDIR_CN "E1轴电机方å‘" +#define INVERT_P_CN "æ­£å‘" +#define INVERT_N_CN "åå‘" -#define HOMEFEEDRATE_CONF_TITLE_CN "机器å‚æ•°>归零速度" -#define X_HOMESPEED_CN "XY轴归零速度" -#define Y_HOMESPEED_CN "Y轴归零速度" -#define Z_HOMESPEED_CN "Z轴归零速度" +#define HOMEFEEDRATE_CONF_TITLE_CN "机器å‚æ•°>归零速度" +#define X_HOMESPEED_CN "XY轴归零速度" +#define Y_HOMESPEED_CN "Y轴归零速度" +#define Z_HOMESPEED_CN "Z轴归零速度" -#define ADVANCED_CONF_TITLE_CN "机器å‚æ•°>高级设置" -#define PWROFF_DECTION_CN "断电检测模å—" -#define PWROFF_AFTER_PRINT_CN "å¯åŠ¨æ‰“完关机功能" -#define HAVE_UPS_CN "机器é…备UPS电æº" -#define Z2_AND_Z2ENDSTOP_CONF_CN "åŒZè½´åŒé™ä½åŠŸèƒ½è®¾ç½®" -#define ENABLE_PINS_CONF_CN "电机使能脚电平设置" -#define WIFI_SETTINGS_CN "Wi-Fiå‚数设置" -#define ENCODER_SETTINGS_CN "旋钮设置" +#define ADVANCED_CONF_TITLE_CN "机器å‚æ•°>高级设置" +#define PWROFF_DECTION_CN "断电检测模å—" +#define PWROFF_AFTER_PRINT_CN "å¯åŠ¨æ‰“完关机功能" +#define HAVE_UPS_CN "机器é…备UPS电æº" +#define Z2_AND_Z2ENDSTOP_CONF_CN "åŒZè½´åŒé™ä½åŠŸèƒ½è®¾ç½®" +#define ENABLE_PINS_CONF_CN "电机使能脚电平设置" +#define WIFI_SETTINGS_CN "Wi-Fiå‚数设置" +#define ENCODER_SETTINGS_CN "旋钮设置" #define Z2_AND_Z2ENDSTOP_CONF_TITLE_CN "åŒzåŒé™ä½è®¾ç½®" #define Z2_ENABLE_CN "å¯ç”¨Z2è½´" @@ -225,23 +225,23 @@ #define Z_ENABLE_PINS_INVERT_CN "Z轴电机使能电平" #define E_ENABLE_PINS_INVERT_CN "E轴电机使能电平" -#define PAUSE_POSITION_CN "打å°æš‚åœä½ç½®è®¾ç½®" -#define PAUSE_POSITION_X_CN "Xè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" -#define PAUSE_POSITION_Y_CN "Yè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" -#define PAUSE_POSITION_Z_CN "Zè½´æš‚åœä½ç½®(相对ä½ç½®,-1无效)" -#define WIFI_SETTINGS_TITLE_CN "机器å‚æ•°>Wi-Fi设置" -#define WIFI_SETTINGS_MODE_CN "Wi-Fi 模å¼" -#define WIFI_SETTINGS_NAME_CN "Wi-Fi å称: " -#define WIFI_SETTINGS_PASSWORD_CN "Wi-Fi 密ç : " -#define WIFI_SETTINGS_CLOUD_CN "是å¦ä½¿ç”¨äº‘æœåŠ¡?" -#define WIFI_SETTINGS_CONFIG_CN "é…ç½®" -#define WIFI_SETTINGS_EDIT_CN "编辑" -#define WIFI_CONFIG_TIPS_CN "进行Wi-Fié…ç½®?" +#define PAUSE_POSITION_CN "打å°æš‚åœä½ç½®è®¾ç½®" +#define PAUSE_POSITION_X_CN "Xè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" +#define PAUSE_POSITION_Y_CN "Yè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" +#define PAUSE_POSITION_Z_CN "Zè½´æš‚åœä½ç½®(相对ä½ç½®,-1无效)" +#define WIFI_SETTINGS_TITLE_CN "机器å‚æ•°>Wi-Fi设置" +#define WIFI_SETTINGS_MODE_CN "Wi-Fi 模å¼" +#define WIFI_SETTINGS_NAME_CN "Wi-Fi å称: " +#define WIFI_SETTINGS_PASSWORD_CN "Wi-Fi 密ç : " +#define WIFI_SETTINGS_CLOUD_CN "是å¦ä½¿ç”¨äº‘æœåŠ¡?" +#define WIFI_SETTINGS_CONFIG_CN "é…ç½®" +#define WIFI_SETTINGS_EDIT_CN "编辑" +#define WIFI_CONFIG_TIPS_CN "进行Wi-Fié…ç½®?" -#define OFFSET_TITLE_CN "机器å‚æ•°>å移设置" -#define OFFSET_X_CN "X轴与调平开关å移" -#define OFFSET_Y_CN "Y轴与调平开关å移" -#define OFFSET_Z_CN "Z轴与调平开关å移" +#define OFFSET_TITLE_CN "机器å‚æ•°>å移设置" +#define OFFSET_X_CN "X轴与调平开关å移" +#define OFFSET_Y_CN "Y轴与调平开关å移" +#define OFFSET_Z_CN "Z轴与调平开关å移" #define HOMING_SENSITIVITY_CONF_TITLE_CN "机器å‚æ•°>çµæ•åº¦è°ƒèŠ‚" #define X_SENSITIVITY_CN "Xè½´çµæ•åº¦" @@ -364,12 +364,7 @@ #define FILAMENT_EXT1_TEXT_CN "喷头2" #define FILAMENT_HEAT_TEXT_CN "预热" #define FILAMENT_STOP_TEXT_CN "åœæ­¢" -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_CN "请按<进料>或<退料>进行æ¢æ–™!" - #define FILAMENT_CHANGE_TEXT_CN "待打å°æœºæš‚åœåŽ,请按<进料>或<退料>进行æ¢æ–™!" -#else - #define FILAMENT_CHANGE_TEXT_CN "待打å°æœºæš‚åœåŽ,\n请按<进料>或<退料>" -#endif +#define FILAMENT_CHANGE_TEXT_CN "待打å°æœºæš‚åœåŽ,\n请按<进料>或<退料>" #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN "准备进料,正在加热,请ç¨ç­‰!" #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN "准备退料,正在加热,请ç¨ç­‰!" @@ -456,7 +451,6 @@ #define DIALOG_RETRY_CN "é‡è¯•" #define DIALOG_STOP_CN "åœæ­¢" #define DIALOG_REPRINT_FROM_BREAKPOINT_CN "从断点续打?" -//#define DIALOG_UNBIND_PRINTER_CN "解除绑定 ?" #define DIALOG_ERROR_TIPS1_CN "错误:找ä¸åˆ°æ–‡ä»¶,请æ’å…¥sdå¡/u盘!" #define DIALOG_ERROR_TIPS2_CN "错误:通信失败,请检查波特率或主æ¿ç¡¬ä»¶!" #define DIALOG_ERROR_TIPS3_CN "错误:文件å或文件路径太长 !" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 2babbaba93..6366527d88 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -23,13 +23,13 @@ //****************西ç­ç‰™è¯­*************************** #define TOOL_TEXT_SP "Ajustes" -#define PREHEAT_TEXT_SP "Precalentar"//"precalent\nar" +#define PREHEAT_TEXT_SP "Precalentar" #define MOVE_TEXT_SP "Mover" #define HOME_TEXT_SP "Origen" #define PRINT_TEXT_SP "Imprimir" #define EXTRUDE_TEXT_SP "Extrusor" -#define LEVELING_TEXT_SP "Leveling"//"nivelac\nión" -#define AUTO_LEVELING_TEXT_SP "Autolevel"//"auto\nnivelación" +#define LEVELING_TEXT_SP "Leveling" +#define AUTO_LEVELING_TEXT_SP "Autolevel" #define SET_TEXT_SP "Config" #define MORE_TEXT_SP "Más" @@ -135,50 +135,30 @@ #define FILAMENT_EXT1_TEXT_SP "Extrusor2" #define FILAMENT_HEAT_TEXT_SP "Precalentar" #define FILAMENT_STOP_TEXT_SP "Parar" -//#define FILAMENT_CHANGE_TEXT_SP "Filamento" #define FILAMENT_TIPS2_TEXT_SP "T:" #define FILAMENT_TIPS3_TEXT_SP "Dentro..." #define FILAMENT_TIPS4_TEXT_SP "Fuera..." #define FILAMENT_TIPS5_TEXT_SP "Temperatura demasiado baja, por favor calentar" #define FILAMENT_TIPS6_TEXT_SP "Completado" -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_SP "Please click or \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_SP "Please click or ,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor, por favor espere..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor, por favor espere..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el filamento y luego presione\"Confirmar\"para comenzar la carga." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y luego presione\"Confirmar\"para comenzar la carga." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.Presione\"Confirmar\"para retirar el filamento." - #define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,por favor espere." - #define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,por favor espere." - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,presione\"Confirmar\"." - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,presione\"Confirmar\"." -#else - #define FILAMENT_CHANGE_TEXT_SP "Please click \nor ,After \npinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el \nfilamento y luego presione\"Confirmar\"\npara comenzar la carga." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y \nluego presione\"Confirmar\"para \ncomenzar la carga." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.\nPresione\"Confirmar\"para retirar \nel filamento." - #define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,\npor favor espere." - #define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,\npor favor espere." - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,\npresione\"Confirmar\"." - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,\npresione\"Confirmar\"." -#endif + +#define FILAMENT_CHANGE_TEXT_SP "Please click \nor ,After \npinter pause." +#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..." +#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..." +#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el \nfilamento y luego presione\"Confirmar\"\npara comenzar la carga." +#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y \nluego presione\"Confirmar\"para \ncomenzar la carga." +#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.\nPresione\"Confirmar\"para retirar \nel filamento." +#define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,\npor favor espere." +#define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,\npor favor espere." +#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,\npresione\"Confirmar\"." +#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,\npresione\"Confirmar\"." #define PRE_HEAT_EXT_TEXT_SP "Extrusor" #define PRE_HEAT_BED_TEXT_SP "cama" #define FILE_LOADING_SP "Cargando......" -#if 0 - #define NO_FILE_AND_CHECK_SP "No se encontraron archivos! Por favor, inserte la tarjeta SD o el disco U!" -#endif #define NO_FILE_AND_CHECK_SP "Archivo no encontrado,\n por favor insertar SD o disco USB!" - #define NO_FILE_SP "Sin archivo!" - - #define EXTRUDER_TEMP_TEXT_SP "Temper" #define EXTRUDER_E_LENGTH1_TEXT_SP "Extrusor1" #define EXTRUDER_E_LENGTH2_TEXT_SP "Extrusor2" @@ -245,7 +225,6 @@ #define DIALOG_RETRY_SP "Reintentar" #define DIALOG_STOP_SP "Stop" #define DIALOG_REPRINT_FROM_BREAKPOINT_SP "Reprint from breakpoint?" -//#define DIALOG_UNBIND_PRINTER_SP "Unbind the printer?" #define DIALOG_ERROR_TIPS1_SP "Error:archivo no encontrado, \npor favor insertar SD o disco USB." #define DIALOG_ERROR_TIPS2_SP "error:transacción fallida, \nconfigurar baudrate del \ndisplay para la placa base!" #define DIALOG_ERROR_TIPS3_SP "Error : nombre de archivo o \nruta demasiado largo!" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index d956e14aad..3288d5b8f9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -254,7 +254,7 @@ #define TOOL_TEXT_T_CN "工具" #define PREHEAT_TEXT_T_CN "é ç†±" -#define MOVE_TEXT_T_CN "移動" +#define MOVE_TEXT_T_CN "移動" #define HOME_TEXT_T_CN "回零" #define PRINT_TEXT_T_CN "打å°" #define EXTRUDE_TEXT_T_CN "擠出" @@ -364,19 +364,12 @@ #define FILAMENT_EXT1_TEXT_T_CN "å™´é ­2" #define FILAMENT_HEAT_TEXT_T_CN "é ç†±" #define FILAMENT_STOP_TEXT_T_CN "åœæ­¢" -//#define FILAMENT_CHANGE_TEXT_T_CN "準備æ›æ–™" #define FILAMENT_TIPS2_TEXT_T_CN "T:" #define FILAMENT_TIPS3_TEXT_T_CN "正在進料" #define FILAMENT_TIPS4_TEXT_T_CN "正在退料" #define FILAMENT_TIPS5_TEXT_T_CN "溫度太低,è«‹å…ˆé ç†±" #define FILAMENT_TIPS6_TEXT_T_CN "æ›æ–™å®Œæˆ" - -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_T_CN "請按<進料>或<退料>進行æ›æ–™!" - #define FILAMENT_CHANGE_TEXT_T_CN "待打å°æ©Ÿæš«åœåŽ,請按<進料>或<退料>進行æ›æ–™!" -#endif - - #define FILAMENT_CHANGE_TEXT_T_CN "待打å°æ©Ÿæš«åœåŽ,\n請按<進料>或<退料>" +#define FILAMENT_CHANGE_TEXT_T_CN "待打å°æ©Ÿæš«åœåŽ,\n請按<進料>或<退料>" #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_T_CN "準備進料,正在加熱,è«‹ç¨ç­‰" #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_T_CN "準備退料,正在加熱,è«‹ç¨ç­‰" @@ -434,8 +427,8 @@ #define TITLE_PRINTING_T_CN "正在打å°" #define TITLE_OPERATION_T_CN "æ“作" #define TITLE_ADJUST_T_CN "調整" -#define TITLE_WIRELESS_T_CN "無線網絡" -#define TITLE_FILAMENT_T_CN "æ›æ–™" +#define TITLE_WIRELESS_T_CN "無線網絡" +#define TITLE_FILAMENT_T_CN "æ›æ–™" #define TITLE_ABOUT_T_CN "關於" #define TITLE_FAN_T_CN "風扇" #define TITLE_LANGUAGE_T_CN "語言" @@ -459,7 +452,6 @@ #define DIALOG_RETRY_T_CN "é‡è©¦" #define DIALOG_STOP_T_CN "åœæ­¢" #define DIALOG_REPRINT_FROM_BREAKPOINT_T_CN "從斷點續打?" -//#define DIALOG_UNBIND_PRINTER_T_CN "解除ç¶å®š?" #define DIALOG_ERROR_TIPS1_T_CN "錯誤:找ä¸åˆ°æ–‡ä»¶,è«‹æ’å…¥sdå¡/u盤!" #define DIALOG_ERROR_TIPS2_T_CN "錯誤:通信失敗,請檢查波特率或主æ¿ç¡¬ä»¶!" #define DIALOG_ERROR_TIPS3_T_CN "錯誤:文件å或文件路徑太長!" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 097c1aeadc..5350ddb377 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -77,9 +77,10 @@ lv_group_t* g; uint16_t DeviceCode = 0x9488; extern uint8_t sel_id; -extern bool flash_preview_begin, default_preview_flg, gcode_preview_over; +uint8_t bmp_public_buf[14 * 1024]; +uint8_t public_buf[513]; -uint8_t bmp_public_buf[17 * 1024]; +extern bool flash_preview_begin, default_preview_flg, gcode_preview_over; void SysTick_Callback() { lv_tick_inc(1); @@ -109,13 +110,9 @@ void SysTick_Callback() { } } -extern uint8_t bmp_public_buf[17 * 1024]; - void tft_lvgl_init() { - //uint16_t test_id=0; W25QXX.init(SPI_QUARTER_SPEED); - //test_id=W25QXX.W25QXX_ReadID(); gCfgItems_init(); ui_cfg_init(); @@ -129,7 +126,6 @@ void tft_lvgl_init() { watchdog_refresh(); // LVGL init takes time - //spi_flash_read_test(); #if ENABLED(SDSUPPORT) UpdateAssets(); watchdog_refresh(); // LVGL init takes time @@ -141,7 +137,7 @@ void tft_lvgl_init() { lv_init(); - lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/ + lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 14); /*Initialize the display buffer*/ lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ lv_disp_drv_init(&disp_drv); /*Basic initialization*/ @@ -273,11 +269,6 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { tmpTime = millis(); diffTime = getTickDiff(tmpTime, touch_time1); - /*Save the state and save the pressed coordinate*/ - //data->state = TOUCH_PressValid(last_x, last_y) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; - //if (data->state == LV_INDEV_STATE_PR) ADS7843_Rd_Addata((u16 *)&last_x, (u16 *)&last_y); - //touchpad_get_xy(&last_x, &last_y); - /*Save the pressed coordinates and the state*/ if (diffTime > 20) { if (get_point(&last_x, &last_y)) { @@ -285,7 +276,6 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { data->state = LV_INDEV_STATE_PR; // Set the coordinates (if released use the last-pressed coordinates) - data->point.x = last_x; data->point.y = last_y; @@ -369,11 +359,9 @@ lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p } //sd -extern uint8_t public_buf[512]; char *cur_namefff; uint32_t sd_read_base_addr = 0, sd_read_addr_offset = 0, small_image_size = 409; lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { - //cur_namefff = strrchr(path, '/'); char name_buf[100]; *name_buf = '/'; strcpy(name_buf + 1, path); @@ -405,7 +393,6 @@ lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t b else if (btr == 4) { uint8_t header_pic[4] = { 0x04, 0x90, 0x81, 0x0C }; memcpy(buf, header_pic, 4); - //pic_read_addr_offset += 4; *br = 4; } return LV_FS_RES_OK; @@ -453,9 +440,6 @@ void lv_encoder_pin_init() { } #if 1 // HAS_ENCODER_ACTION - - //static const int8_t encoderDirection = 1; - //static int16_t enc_Direction; void lv_update_encoder() { static uint32_t encoder_time1; uint32_t tmpTime, diffTime = 0; @@ -487,9 +471,6 @@ void lv_encoder_pin_init() { #define encrot1 1 #define encrot2 2 - // Manage encoder rotation - //#define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: enc_Direction += encoderDirection; break; case _E2: enc_Direction -= encoderDirection; } - uint8_t enc = 0; if (buttons & EN_A) enc |= B01; if (buttons & EN_B) enc |= B10; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index df28893f41..20fa3242e6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -35,6 +35,9 @@ //#define TFT_ROTATION TFT_ROTATE_180 #define MKS_WIFI_MODULE 0 +extern uint8_t bmp_public_buf[14 * 1024]; +extern uint8_t public_buf[513]; + extern void tft_lvgl_init(); extern void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); extern bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index c3c0f37365..3cbbe538bc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -149,10 +149,6 @@ void machine_setting_disp() { machine_menu.CalibrationRadius = CALIBRATION_RADIUS_CN; machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_CN; - // machine_menu.ProbeMaxLeft=PROBE_REACH_MAX_LEFT_CN; - // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_CN; - // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_CN; - // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_CN; machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_CN; machine_menu.NozzleConf = NOZZLE_CONF_CN; @@ -167,7 +163,6 @@ void machine_setting_disp() { machine_menu.NozzleMaxTemperature = NOZZLE_MAX_TEMPERATURE_CN; machine_menu.Extrude_Min_Temper = EXTRUD_MIN_TEMPER_CN; - // machine_menu.HotbedEnable=HOTBED_ENABLE_CN; machine_menu.HotbedConfTitle = HOTBED_CONF_TITLE_CN; machine_menu.HotbedAjustType = HOTBED_ADJUST_CN; machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_CN; @@ -242,7 +237,6 @@ void machine_setting_disp() { machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_CN; machine_menu.XY_HomeFeedRate = X_HOMESPEED_CN; - // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_CN; machine_menu.Z_HomeFeedRate = Z_HOMESPEED_CN; machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_CN; @@ -382,10 +376,6 @@ void machine_setting_disp() { machine_menu.CalibrationRadius = CALIBRATION_RADIUS_T_CN; machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_T_CN; - // machine_menu.ProbeMaxLeft=PROBE_REACH_MAX_LEFT_T_CN; - // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_T_CN; - // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_T_CN; - // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_T_CN; machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_T_CN; machine_menu.NozzleConf = NOZZLE_CONF_T_CN; @@ -400,7 +390,6 @@ void machine_setting_disp() { machine_menu.NozzleMaxTemperature = NOZZLE_MAX_TEMPERATURE_T_CN; machine_menu.Extrude_Min_Temper = EXTRUD_MIN_TEMPER_T_CN; - // machine_menu.HotbedEnable=HOTBED_ENABLE_T_CN; machine_menu.HotbedConfTitle = HOTBED_CONF_TITLE_T_CN; machine_menu.HotbedAjustType = HOTBED_ADJUST_T_CN; machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_T_CN; @@ -475,7 +464,6 @@ void machine_setting_disp() { machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_T_CN; machine_menu.XY_HomeFeedRate = X_HOMESPEED_T_CN; - // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_T_CN; machine_menu.Z_HomeFeedRate = Z_HOMESPEED_T_CN; machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_T_CN; @@ -499,8 +487,6 @@ void machine_setting_disp() { machine_menu.key_back = KEY_BACK_T_CN; machine_menu.key_reset = KEY_REST_T_CN; machine_menu.key_confirm = KEY_CONFIRM_T_CN; - // machine_menu.high_level = MOTOR_EN_HIGH_LEVEL_T_CN; - // machine_menu.low_level = MOTOR_EN_LOW_LEVEL_T_CN; machine_menu.PausePosText = PAUSE_POSITION_T_CN; machine_menu.xPos = PAUSE_POSITION_X_T_CN; @@ -618,10 +604,6 @@ void machine_setting_disp() { machine_menu.CalibrationRadius = CALIBRATION_RADIUS_EN; machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_EN; - // machine_menu.Level_positon=PROBE_REACH_MAX_LEFT_EN; - // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_EN; - // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_EN; - // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_EN; machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_EN; machine_menu.NozzleConf = NOZZLE_CONF_EN; @@ -711,7 +693,6 @@ void machine_setting_disp() { machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_EN; machine_menu.XY_HomeFeedRate = X_HOMESPEED_EN; - // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_EN; machine_menu.Z_HomeFeedRate = Z_HOMESPEED_EN; machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_EN; @@ -823,7 +804,6 @@ void disp_language_init() { about_menu.type_name = ABOUT_TYPE_TEXT; about_menu.firmware_v = ABOUT_VERSION_TEXT; - // about_menu.wifi = ABOUT_WIFI_TEXT; wifi_menu.ip = WIFI_IP_TEXT; wifi_menu.wifi = WIFI_NAME_TEXT; @@ -861,7 +841,7 @@ void disp_language_init() { tips_menu.joining = TEXT_WIFI_JOINING_EN; tips_menu.failedJoin = TEXT_WIFI_FAILED_JOIN_EN; tips_menu.wifiConected = TEXT_WIFI_WIFI_CONECTED_EN; - #endif //MKS_WIFI_MODULE + #endif machine_setting_disp(); operation_menu.babystep = TEXT_BABY_STEP_EN; @@ -923,7 +903,7 @@ void disp_language_init() { file_menu.page_down = PAGE_DOWN_TEXT_CN; file_menu.file_loading = FILE_LOADING_CN; file_menu.no_file = NO_FILE_CN; - file_menu.no_file_and_check = NO_FILE_CN;// NO_FILE_AND_CHECK_CN; + file_menu.no_file_and_check = NO_FILE_CN; // extrude_menu.title = TITLE_EXTRUDE_CN; extrude_menu.in = EXTRUDER_IN_TEXT_CN; @@ -961,12 +941,9 @@ void disp_language_init() { filesys_menu.sd_sys = SD_CARD_TEXT_CN; filesys_menu.usb_sys = U_DISK_TEXT_CN; // - more_menu.title = TITLE_MORE_CN; + more_menu.title = TITLE_MORE_CN; // WIFI wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_CN; - // wifi_menu.ip = WIFI_IP_TEXT_CN; - // wifi_menu.state = WIFI_STA_TEXT_CN; wifi_menu.cloud = CLOUD_TEXT_CN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_CN; // CLOUD @@ -1055,11 +1032,10 @@ void disp_language_init() { printing_more_menu.speed = PRINTING_CHANGESPEED_CN; printing_more_menu.temp = PRINTING_TEMP_CN; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; print_file_dialog_menu.confirm = DIALOG_CONFIRM_CN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_CN; + print_file_dialog_menu.cancel = DIALOG_CANCLE_CN; print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_CN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_CN; + print_file_dialog_menu.cancel_print = DIALOG_CANCEL_PRINT_CN; print_file_dialog_menu.retry = DIALOG_RETRY_CN; print_file_dialog_menu.stop = DIALOG_STOP_CN; print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_CN; @@ -1153,7 +1129,7 @@ void disp_language_init() { file_menu.page_down = PAGE_DOWN_TEXT_T_CN; file_menu.file_loading = FILE_LOADING_T_CN; file_menu.no_file = NO_FILE_T_CN; - file_menu.no_file_and_check = NO_FILE_T_CN;// NO_FILE_AND_CHECK_T_CN; + file_menu.no_file_and_check = NO_FILE_T_CN; // extrude_menu.title = TITLE_EXTRUDE_T_CN; extrude_menu.in = EXTRUDER_IN_TEXT_T_CN; @@ -1190,12 +1166,9 @@ void disp_language_init() { filesys_menu.sd_sys = SD_CARD_TEXT_T_CN; filesys_menu.usb_sys = U_DISK_TEXT_T_CN; // - more_menu.title = TITLE_MORE_T_CN; + more_menu.title = TITLE_MORE_T_CN; // WIFI wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_CN; - // wifi_menu.ip = WIFI_IP_TEXT_CN; - // wifi_menu.state= WIFI_STA_TEXT_CN; wifi_menu.cloud = CLOUD_TEXT_T_CN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_T_CN; // CLOUD @@ -1233,7 +1206,6 @@ void disp_language_init() { filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_T_CN; filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_T_CN; - // language_menu.title = TITLE_LANGUAGE_T_CN; language_menu.next = PAGE_DOWN_TEXT_T_CN; @@ -1284,11 +1256,10 @@ void disp_language_init() { printing_more_menu.speed = PRINTING_CHANGESPEED_T_CN; printing_more_menu.temp = PRINTING_TEMP_T_CN; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; print_file_dialog_menu.confirm = DIALOG_CONFIRM_T_CN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_T_CN; + print_file_dialog_menu.cancel = DIALOG_CANCLE_T_CN; print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_T_CN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_T_CN; + print_file_dialog_menu.cancel_print = DIALOG_CANCEL_PRINT_T_CN; print_file_dialog_menu.retry = DIALOG_RETRY_T_CN; print_file_dialog_menu.stop = DIALOG_STOP_T_CN; print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_T_CN; @@ -1373,7 +1344,7 @@ void disp_language_init() { file_menu.page_down = PAGE_DOWN_TEXT_EN; file_menu.file_loading = FILE_LOADING_EN; file_menu.no_file = NO_FILE_EN; - file_menu.no_file_and_check = NO_FILE_EN;// NO_FILE_AND_CHECK_EN; + file_menu.no_file_and_check = NO_FILE_EN; // extrude_menu.title = TITLE_EXTRUDE_EN; extrude_menu.in = EXTRUDER_IN_TEXT_EN; @@ -1412,9 +1383,6 @@ void disp_language_init() { filesys_menu.usb_sys = U_DISK_TEXT_EN; // WIFI wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_EN; - // wifi_menu.ip = WIFI_IP_TEXT_EN; - // wifi_menu.state = WIFI_STA_TEXT_EN; wifi_menu.cloud = CLOUD_TEXT_EN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; @@ -1500,11 +1468,10 @@ void disp_language_init() { printing_more_menu.speed = PRINTING_CHANGESPEED_EN; printing_more_menu.temp = PRINTING_TEMP_EN; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN; print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_EN; + print_file_dialog_menu.cancel = DIALOG_CANCLE_EN; print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN; + print_file_dialog_menu.cancel_print = DIALOG_CANCEL_PRINT_EN; print_file_dialog_menu.retry = DIALOG_RETRY_EN; print_file_dialog_menu.stop = DIALOG_STOP_EN; print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN; @@ -1588,7 +1555,7 @@ void disp_language_init() { file_menu.page_down = PAGE_DOWN_TEXT_RU; file_menu.file_loading = FILE_LOADING_RU; file_menu.no_file = NO_FILE_RU; - file_menu.no_file_and_check = NO_FILE_RU;// NO_FILE_AND_CHECK_RU; + file_menu.no_file_and_check = NO_FILE_RU; // extrude_menu.title = TITLE_EXTRUDE_RU; extrude_menu.in = EXTRUDER_IN_TEXT_RU; @@ -1627,13 +1594,9 @@ void disp_language_init() { filesys_menu.usb_sys = U_DISK_TEXT_RU; // WIFI wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_RU; - // wifi_menu.ip = WIFI_IP_TEXT_RU; - // wifi_menu.state = WIFI_STA_TEXT_RU; wifi_menu.cloud = CLOUD_TEXT_RU; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_RU; - cloud_menu.title = TITLE_CLOUD_TEXT_RU; cloud_menu.bind = CLOUD_BINDED_RU; cloud_menu.binded = CLOUD_BINDED_RU; @@ -1715,11 +1678,10 @@ void disp_language_init() { printing_more_menu.manual = MANUAL_SHUTDOWN_RU; printing_more_menu.speed = PRINTING_CHANGESPEED_RU; printing_more_menu.temp = PRINTING_TEMP_RU; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_RU; print_file_dialog_menu.confirm = DIALOG_CONFIRM_RU; - print_file_dialog_menu.cancle = DIALOG_CANCLE_RU; + print_file_dialog_menu.cancel = DIALOG_CANCLE_RU; print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_RU; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_RU; + print_file_dialog_menu.cancel_print = DIALOG_CANCEL_PRINT_RU; print_file_dialog_menu.retry = DIALOG_RETRY_RU; print_file_dialog_menu.stop = DIALOG_STOP_RU; print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_RU; @@ -1807,7 +1769,7 @@ void disp_language_init() { file_menu.page_down = PAGE_DOWN_TEXT_SP; file_menu.file_loading = FILE_LOADING_SP; file_menu.no_file = NO_FILE_SP; - file_menu.no_file_and_check = NO_FILE_SP;// NO_FILE_AND_CHECK_SP; + file_menu.no_file_and_check = NO_FILE_SP; // extrude_menu.title = TITLE_EXTRUDE_SP; extrude_menu.in = EXTRUDER_IN_TEXT_SP; @@ -1847,9 +1809,6 @@ void disp_language_init() { // WIFI wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_SP; - // wifi_menu.ip = WIFI_IP_TEXT_SP; - // wifi_menu.state = WIFI_STA_TEXT_SP; wifi_menu.cloud = CLOUD_TEXT_SP; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_SP; @@ -1935,11 +1894,10 @@ void disp_language_init() { printing_more_menu.speed = PRINTING_CHANGESPEED_SP; printing_more_menu.temp = PRINTING_TEMP_SP; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; print_file_dialog_menu.confirm = DIALOG_CONFIRM_SP; - print_file_dialog_menu.cancle = DIALOG_CANCLE_SP; + print_file_dialog_menu.cancel = DIALOG_CANCLE_SP; print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_SP; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_SP; + print_file_dialog_menu.cancel_print = DIALOG_CANCEL_PRINT_SP; print_file_dialog_menu.retry = DIALOG_RETRY_SP; print_file_dialog_menu.stop = DIALOG_STOP_SP; print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_SP; @@ -2063,13 +2021,9 @@ void disp_language_init() { filesys_menu.usb_sys = U_DISK_TEXT_FR; file_menu.file_loading = FILE_LOADING_FR; file_menu.no_file = NO_FILE_FR; - file_menu.no_file_and_check = NO_FILE_FR;// NO_FILE_AND_CHECK_FR; + file_menu.no_file_and_check = NO_FILE_FR; // WIFI wifi_menu.title = WIFI_NAME_TEXT_FR; - // wifi_menu.key = WIFI_KEY_TEXT_FR; - // wifi_menu.ip = WIFI_IP_TEXT_FR; - // wifi_menu.state = WIFI_STA_TEXT_FR; - // wifi_menu.cloud = CLOSE_TEXT_FR; wifi_menu.cloud = CLOUD_TEXT_FR; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_FR; @@ -2153,11 +2107,10 @@ void disp_language_init() { printing_more_menu.speed = PRINTING_CHANGESPEED_FR; printing_more_menu.temp = PRINTING_TEMP_FR; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; print_file_dialog_menu.confirm = DIALOG_CONFIRM_FR; - print_file_dialog_menu.cancle = DIALOG_CANCLE_FR; + print_file_dialog_menu.cancel = DIALOG_CANCLE_FR; print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_FR; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_FR; + print_file_dialog_menu.cancel_print = DIALOG_CANCEL_PRINT_FR; print_file_dialog_menu.retry = DIALOG_RETRY_FR; print_file_dialog_menu.stop = DIALOG_STOP_FR; print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_FR; @@ -2243,7 +2196,7 @@ void disp_language_init() { file_menu.page_down = PAGE_DOWN_TEXT_IT; file_menu.file_loading = FILE_LOADING_IT; file_menu.no_file = NO_FILE_IT; - file_menu.no_file_and_check = NO_FILE_IT;// NO_FILE_AND_CHECK_IT; + file_menu.no_file_and_check = NO_FILE_IT; // extrude_menu.title = TITLE_EXTRUDE_IT; extrude_menu.in = EXTRUDER_IN_TEXT_IT; @@ -2283,9 +2236,6 @@ void disp_language_init() { // WIFI wifi_menu.title = WIFI_NAME_TEXT_IT; - // wifi_menu.key = WIFI_KEY_TEXT_IT; - // wifi_menu.ip = WIFI_IP_TEXT_IT; - // wifi_menu.state = WIFI_STA_TEXT_IT; wifi_menu.cloud = CLOSE_TEXT_IT; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_IT; @@ -2369,11 +2319,10 @@ void disp_language_init() { printing_more_menu.temp = PRINTING_TEMP_IT; printing_more_menu.speed = PRINTING_CHANGESPEED_IT; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; print_file_dialog_menu.confirm = DIALOG_CONFIRM_IT; - print_file_dialog_menu.cancle = DIALOG_CANCLE_IT; + print_file_dialog_menu.cancel = DIALOG_CANCLE_IT; print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_IT; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_IT; + print_file_dialog_menu.cancel_print = DIALOG_CANCEL_PRINT_IT; print_file_dialog_menu.retry = DIALOG_RETRY_IT; print_file_dialog_menu.stop = DIALOG_STOP_IT; print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_IT; @@ -2460,7 +2409,7 @@ void disp_language_init() { file_menu.page_down = PAGE_DOWN_TEXT_EN; file_menu.file_loading = FILE_LOADING_EN; file_menu.no_file = NO_FILE_EN; - file_menu.no_file_and_check = NO_FILE_EN;// NO_FILE_AND_CHECK_EN; + file_menu.no_file_and_check = NO_FILE_EN; // extrude_menu.title = TITLE_EXTRUDE_EN; extrude_menu.in = EXTRUDER_IN_TEXT_EN; @@ -2493,16 +2442,13 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_EN; set_menu.eepromSet = EEPROM_SETTINGS_EN; // - more_menu.title = TITLE_MORE_EN; + more_menu.title = TITLE_MORE_EN; // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; filesys_menu.usb_sys = U_DISK_TEXT_EN; // WIFI wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_EN; - // wifi_menu.ip = WIFI_IP_TEXT_EN; - // wifi_menu.state = WIFI_STA_TEXT_EN; wifi_menu.cloud = CLOUD_TEXT_EN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; @@ -2588,11 +2534,10 @@ void disp_language_init() { printing_more_menu.speed = PRINTING_CHANGESPEED_EN; printing_more_menu.temp = PRINTING_TEMP_EN; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN; print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_EN; + print_file_dialog_menu.cancel = DIALOG_CANCLE_EN; print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN; + print_file_dialog_menu.cancel_print = DIALOG_CANCEL_PRINT_EN; print_file_dialog_menu.retry = DIALOG_RETRY_EN; print_file_dialog_menu.stop = DIALOG_STOP_EN; print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 675fd41f16..519388992f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -131,10 +131,6 @@ typedef struct machine_common_disp{ const char *CalibrationRadius; const char *LevelingSubXYZConfTitle; - //const char *Level_positon1; - //const char *Level_positon2; - //const char *Level_positon3; - //const char *Level_positon4; const char *TemperatureConfTitle; const char *NozzleConf; @@ -667,9 +663,9 @@ extern dialog_menu_def dialog_menu; typedef struct print_file_dialog_disp { const char *title; const char *confirm; - const char *cancle; + const char *cancel; const char *print_file; - const char *cancle_print; + const char *cancel_print; const char *retry; const char *stop; const char *no_file_print_tips; @@ -740,12 +736,8 @@ typedef struct eeprom_disp{ extern eeprom_def eeprom_menu; /*****************************************/ -//********************************************// -//#if defined(TFT70) // -//#elif defined(TFT35) #define TEXT_VALUE "%d/%d" -//#endif #define TEXT_VALUE_T ": %d℃" #define TEXT_VALUE_mm ": %dmm" @@ -796,19 +788,14 @@ extern eeprom_def eeprom_menu; #define HOME_Y_TEXT "Y" #define HOME_Z_TEXT "Z" #define HOME_ALL_TEXT "All" -//#if defined(MKS_ROBIN_NANO) + #define ABOUT_TYPE_TEXT "MKS Robin Pro" -//#elif defined(MKS_ROBIN_MINI) -//#define ABOUT_TYPE_TEXT "MKS Robin Mini" -//#endif + #define ABOUT_VERSION_TEXT "1.0.0" -//#define ABOUT_WIFI_TEXT "WiFi:" #define FAN_OPEN_TEXT "100%" #define FAN_HALF_TEXT "50%" #define FAN_CLOSE_TEXT "0%" -//#define FAN_TIPS1_TEXT "FAN" -//#define FAN_TIPS2_TEXT "FAN\nClose" #define WIFI_TEXT "WIFI" #define WIFI_IP_TEXT "IP: " @@ -830,7 +817,7 @@ extern eeprom_def eeprom_menu; #define DIALOG_UPLOAD_SPEED_EN "Speed" #define DIALOG_UPDATE_WIFI_FIRMWARE_EN "Updating wifi model firmware" #define DIALOG_UPDATE_WIFI_WEB_EN "Updating wifi model web data" -#define DIALOG_UPDATE_NO_DEVICE_EN "please check \nwether memory device insert!" +#define DIALOG_UPDATE_NO_DEVICE_EN "Please check whether\nmemory device inserted!" #define ZOFFSET_STEP001 "0.01mm" #define ZOFFSET_STEP01 "0.1mm" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h index 3206666bef..e2b560e6fa 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h @@ -26,7 +26,7 @@ #if ENABLED(MKS_WIFI_MODULE) #ifdef SERIAL_PORT_2 - #error "SERIAL_PORT_2 must be disabled with HAS_TFT_LVGL_UI and MKS_WIFI_MODULE." + #error "SERIAL_PORT_2 must be disabled with TFT_LVGL_UI* and MKS_WIFI_MODULE." #endif #define WIFI_BAUDRATE 115200 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index f38145aa80..a8537dd3de 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -110,8 +110,6 @@ extern CLOUD_PARA cloud_para; extern bool once_flag, flash_preview_begin, default_preview_flg, gcode_preview_over; -extern uint8_t bmp_public_buf[17 * 1024]; - uint32_t getWifiTick() { return millis(); } @@ -126,8 +124,10 @@ uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { void wifi_delay(int n) { uint32_t begin = getWifiTick(); uint32_t end = begin; - while (getWifiTickDiff(begin, end) < (uint32_t)n) + while (getWifiTickDiff(begin, end) < (uint32_t)n) { + watchdog_refresh(); end = getWifiTick(); + } } void wifi_reset() { @@ -304,7 +304,7 @@ void esp_port_begin(uint8_t interrupt) { #if ENABLED(MKS_WIFI_MODULE) - int raw_send_to_wifi(char *buf, int len) { + int raw_send_to_wifi(uint8_t *buf, int len) { if (buf == 0 || len <= 0) return 0; for (int i = 0; i < len; i++) WIFISERIAL.write(*(buf + i)); @@ -315,11 +315,11 @@ void esp_port_begin(uint8_t interrupt) { void wifi_ret_ack() {} -char buf_to_wifi[256]; +uint8_t buf_to_wifi[256]; int index_to_wifi = 0; -int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { - char wifi_ret_head = 0xA5; - char wifi_ret_tail = 0xFC; +int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len) { + uint8_t wifi_ret_head = 0xA5; + uint8_t wifi_ret_tail = 0xFC; if (type == WIFI_PARA_SET) { int data_offset = 4; @@ -331,9 +331,9 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { buf_to_wifi[data_offset] = gCfgItems.wifi_mode_sel; buf_to_wifi[data_offset + 1] = apLen; - strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.wifi_name, apLen); + memcpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.wifi_name, apLen); buf_to_wifi[data_offset + apLen + 2] = keyLen; - strncpy(&buf_to_wifi[data_offset + apLen + 3], (const char *)uiCfg.wifi_key, keyLen); + memcpy(&buf_to_wifi[data_offset + apLen + 3], (const char *)uiCfg.wifi_key, keyLen); buf_to_wifi[data_offset + apLen + keyLen + 3] = wifi_ret_tail; index_to_wifi = apLen + keyLen + 3; @@ -410,7 +410,7 @@ int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { buf_to_wifi[data_offset] = gCfgItems.cloud_enable ? 0x0A : 0x05; buf_to_wifi[data_offset + 1] = urlLen; - strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.cloud_hostUrl, urlLen); + memcpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.cloud_hostUrl, urlLen); buf_to_wifi[data_offset + urlLen + 2] = uiCfg.cloud_port & 0xFF; buf_to_wifi[data_offset + urlLen + 3] = (uiCfg.cloud_port >> 8) & 0xFF; buf_to_wifi[data_offset + urlLen + 4] = wifi_ret_tail; @@ -555,7 +555,7 @@ uint8_t Explore_Disk(char* path , uint8_t recu_level) { strcat(Fstream, ".DIR"); strcat(Fstream, "\r\n"); - send_to_wifi(Fstream, strlen(Fstream)); + send_to_wifi((uint8_t*)Fstream, strlen(Fstream)); } return fileCnt; @@ -589,7 +589,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if (tmpStr == 0) { gCfgItems.fileSysType = FILE_SYS_SD; - send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); + send_to_wifi((uint8_t *)"Begin file list\r\n", strlen("Begin file list\r\n")); get_file_list((char *)"0:/"); send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); @@ -602,7 +602,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { char *path = (char *)tempBuf; if (strlen((char *)&tmpStr[index]) < 80) { - send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); + send_to_wifi((uint8_t *)"Begin file list\r\n", strlen("Begin file list\r\n")); if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) gCfgItems.fileSysType = FILE_SYS_SD; @@ -611,7 +611,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcpy((char *)path, (char *)&tmpStr[index]); get_file_list(path); - send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); + send_to_wifi((uint8_t *)"End file list\r\n", strlen("End file list\r\n")); } send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); } @@ -651,9 +651,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { card.openFileRead(cur_name); if (card.isFileOpen()) - send_to_wifi((char *)"File selected\r\n", strlen("File selected\r\n")); + send_to_wifi((uint8_t *)"File selected\r\n", strlen("File selected\r\n")); else { - send_to_wifi((char *)"file.open failed\r\n", strlen("file.open failed\r\n")); + send_to_wifi((uint8_t *)"file.open failed\r\n", strlen("file.open failed\r\n")); strcpy(list_file.file_name[sel_id], "notValid"); } send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); @@ -772,7 +772,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { print_rate = uiCfg.totalSend; ZERO(tempBuf); sprintf((char *)tempBuf, "M27 %d\r\n", print_rate); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } break; @@ -857,7 +857,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ); } - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); queue.enqueue_one_P(PSTR("M105")); break; @@ -866,7 +866,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ZERO(tempBuf); sprintf((char *)tempBuf, "M992 %d%d:%d%d:%d%d\r\n", print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); wifi_ret_ack(); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } break; @@ -876,18 +876,18 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if (strlen((char *)list_file.file_name[sel_id]) > (100 - 1)) return; sprintf((char *)tempBuf, "M994 %s;%d\n", list_file.file_name[sel_id],(int)gCfgItems.curFilesize); wifi_ret_ack(); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } break; case 997: if (uiCfg.print_state == IDLE) { wifi_ret_ack(); - send_to_wifi((char *)"M997 IDLE\r\n", strlen("M997 IDLE\r\n")); + send_to_wifi((uint8_t *)"M997 IDLE\r\n", strlen("M997 IDLE\r\n")); } else if (uiCfg.print_state == WORKING) { wifi_ret_ack(); - send_to_wifi((char *)"M997 PRINTING\r\n", strlen("M997 PRINTING\r\n")); + send_to_wifi((uint8_t *)"M997 PRINTING\r\n", strlen("M997 PRINTING\r\n")); } else if (uiCfg.print_state == PAUSED) { wifi_ret_ack(); @@ -895,7 +895,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } else if (uiCfg.print_state == REPRINTING) { wifi_ret_ack(); - send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); + send_to_wifi((uint8_t *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); } if (uiCfg.command_send == 0) get_wifi_list_command_send(); break; @@ -977,8 +977,8 @@ static int32_t charAtArray(const uint8_t *_array, uint32_t _arrayLen, uint8_t _c } void get_wifi_list_command_send() { - char buf[] = { 0xA5, 0x07, 0x00, 0x00, 0xFC }; - raw_send_to_wifi(buf, 5); + uint8_t cmd_wifi_list[] = { 0xA5, 0x07, 0x00, 0x00, 0xFC }; + raw_send_to_wifi(cmd_wifi_list, COUNT(cmd_wifi_list)); } static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { @@ -1043,7 +1043,7 @@ static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { if ((wifiPara.mode != gCfgItems.wifi_mode_sel) || (strncmp(wifiPara.ap_name, (const char *)uiCfg.wifi_name, 32) != 0) || (strncmp(wifiPara.keyCode, (const char *)uiCfg.wifi_key, 64) != 0)) { - package_to_wifi(WIFI_PARA_SET, (char *)0, 0); + package_to_wifi(WIFI_PARA_SET, (uint8_t *)0, 0); } else uiCfg.configWifi = 0; } @@ -1051,7 +1051,7 @@ static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { if (((cloud_para.state >> 4) != (char)gCfgItems.cloud_enable) || (strncmp(cloud_para.hostUrl, (const char *)uiCfg.cloud_hostUrl, 96) != 0) || (cloud_para.port != uiCfg.cloud_port)) { - package_to_wifi(WIFI_CLOUD_CFG, (char *)0, 0); + package_to_wifi(WIFI_CLOUD_CFG, (uint8_t *)0, 0); } else cfg_cloud_flag = 0; } @@ -1091,17 +1091,13 @@ static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { } } if (wifi_name_is_same != 1) { - //for (j=0;j 0x80) { wifi_name_is_same = 1; - //break; } - //} } if (wifi_name_is_same == 1) { wifi_name_is_same = 0; wifiMsgIdex += wifiNameLen; - //wifi_list.RSSI[i] = msg[wifiMsgIdex]; wifiMsgIdex += 1; wifi_name_num--; //i--; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h index 656e440bc2..30da25bbe0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -170,10 +170,10 @@ typedef struct { #define WIFI_GCODE_BUFFER_LEAST_SIZE 96 #define WIFI_GCODE_BUFFER_SIZE (WIFI_GCODE_BUFFER_LEAST_SIZE * 3) typedef struct { - uint8_t wait_tick; - uint8_t Buffer[WIFI_GCODE_BUFFER_SIZE]; - uint32_t r; - uint32_t w; + uint8_t wait_tick; + uint8_t Buffer[WIFI_GCODE_BUFFER_SIZE]; + uint32_t r; + uint32_t w; } WIFI_GCODE_BUFFER; extern volatile WIFI_STATE wifi_link_state; @@ -184,14 +184,14 @@ extern CLOUD_PARA cloud_para; extern WIFI_GCODE_BUFFER espGcodeFifo; extern uint32_t getWifiTick(); -extern uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); +extern uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); extern void mks_esp_wifi_init(); extern int cfg_cloud_flag; -extern int send_to_wifi(char *buf, int len); +extern int send_to_wifi(uint8_t *buf, int len); extern void wifi_looping(); -extern int raw_send_to_wifi(char *buf, int len); -extern int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len); +extern int raw_send_to_wifi(uint8_t *buf, int len); +extern int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len); extern void get_wifi_list_command_send(); extern void get_wifi_commands(); extern int readWifiBuf(int8_t *buf, int32_t len); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 1de5571276..8b3c4edfcd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -75,7 +75,6 @@ const uint32_t ESP_UNKNOWN_ADDR = 0x40001121; // not used const uint32_t ESP_USER_DATA_RAM_ADDR = 0x3FFE8000; // &user data ram const uint32_t ESP_IRAM_ADDR = 0x40100000; // instruction RAM const uint32_t ESP_FLASH_ADDR = 0x40200000; // address of start of Flash -//const uint32_t ESP_FLASH_READ_STUB_BEGIN = IRAM_ADDR + 0x18; UPLOAD_STRUCT esp_upload; @@ -316,15 +315,11 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t } state = header; needBytes = 2; - break; case end: // expecting frame end c = uploadPort_read(); - if (c != (uint8_t)0xC0) { - return slipFrame; - } + if (c != (uint8_t)0xC0) return slipFrame; state = done; - break; case header: // reading an 8-byte header @@ -373,8 +368,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t } break; - default: // this shouldn't happen - return slipState; + default: return slipState; // this shouldn't happen } } @@ -383,7 +377,6 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t opRet = (uint8_t)getData(1, hdr, 1); // Sync packets often provoke a response with a zero opcode instead of ESP_SYNC if (resp != 0x01 || opRet != op) { - //printf("resp %02x %02x\n", resp, opRet); //debug return respHeader; } @@ -405,7 +398,6 @@ void _writePacket(const uint8_t *data, size_t len) { } else { outBuf[outIndex++] = *data; - } data++; --len; @@ -444,7 +436,6 @@ void sendCommand(uint8_t op, uint32_t checkVal, const uint8_t *data, size_t data putData(checkVal, 4, hdr, 4); // send the packet - //flushInput(); if (op == ESP_SYNC) writePacketRaw(hdr, sizeof(hdr), data, dataLen); else @@ -492,9 +483,7 @@ EspUploadResult Sync(uint16_t timeout) { for (;;) { size_t bodyLen; EspUploadResult rc = readPacket(ESP_SYNC, 0, &bodyLen, defaultTimeout); - if (rc != success || bodyLen != 2) { - break; - } + if (rc != success || bodyLen != 2) break; } } //DEBUG @@ -580,14 +569,9 @@ EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { // Calculate the block checksum cksum = checksum(blkBuf + dataOfst, blkSize, ESP_CHECKSUM_MAGIC); - for (i = 0; i < 3; i++) { - if ((stat = doCommand(ESP_FLASH_DATA, blkBuf, blkBufSize, cksum, 0, blockWriteTimeout)) == success) { + for (i = 0; i < 3; i++) + if ((stat = doCommand(ESP_FLASH_DATA, blkBuf, blkBufSize, cksum, 0, blockWriteTimeout)) == success) break; - } - } - - //printf("Upload %d\%\n", ftell(&esp_upload.uploadFile) * 100 / esp_upload.fileSize); - return stat; #else return success; @@ -720,8 +704,7 @@ void upload_spin() { esp_upload.state = upload_idle;//idle; break; - default: - break; + default: break; } #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h index d942a2c84f..246cc10bec 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h @@ -52,7 +52,6 @@ typedef enum { } EspUploadResult; typedef struct { - //FIL uploadFile; uint32_t fileSize; uint32_t uploadAddress; From eedd9c2bda27f3f31cc9c18253b05dfd1f39b14e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 12 Jan 2021 21:48:34 -0600 Subject: [PATCH 0871/1370] whitespace --- Marlin/src/feature/power.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 8d05d14698..d22247b46d 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -122,7 +122,7 @@ void Power::power_off() { #ifdef PSU_POWEROFF_GCODE GcodeSuite::process_subcommands_now_P(PSTR(PSU_POWEROFF_GCODE)); #endif - PSU_PIN_OFF(); + PSU_PIN_OFF(); } } From 726e2e9bc09b9311bfd33e523301f90f118f321d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 6 Jan 2021 21:32:30 -0600 Subject: [PATCH 0872/1370] Move WRITE_FAN --- Marlin/src/inc/Conditionals_post.h | 1 - Marlin/src/module/temperature.cpp | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 43ed3fabfe..acf8f3620b 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2302,7 +2302,6 @@ #if FAN_COUNT > 0 #define HAS_FAN 1 - #define WRITE_FAN(n, v) WRITE(FAN##n##_PIN, (v) ^ FAN_INVERTING) #endif /** diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 924d796bfc..85222a3463 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2536,6 +2536,8 @@ void Temperature::tick() { static SoftPWM soft_pwm_chamber; #endif + #define WRITE_FAN(n, v) WRITE(FAN##n##_PIN, (v) ^ FAN_INVERTING) + #if DISABLED(SLOW_PWM_HEATERS) #if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_HEATED_CHAMBER, FAN_SOFT_PWM) From 62d20c8b3711d736fc27aace84ab12ae56c4ea77 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 12 Jan 2021 22:32:12 -0600 Subject: [PATCH 0873/1370] Ignore M22 during SD print --- Marlin/src/gcode/sd/M21_M22.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/sd/M21_M22.cpp b/Marlin/src/gcode/sd/M21_M22.cpp index 77df751fc7..a618bc0be3 100644 --- a/Marlin/src/gcode/sd/M21_M22.cpp +++ b/Marlin/src/gcode/sd/M21_M22.cpp @@ -35,6 +35,10 @@ void GcodeSuite::M21() { card.mount(); } /** * M22: Release SD Card */ -void GcodeSuite::M22() { card.release(); } +void GcodeSuite::M22() { + + if (!IS_SD_PRINTING()) card.release(); + +} #endif // SDSUPPORT From a3d6442d02741035e6e5bc6ee61fcb92483fba7e Mon Sep 17 00:00:00 2001 From: MKS-Sean <56996910+MKS-Sean@users.noreply.github.com> Date: Thu, 14 Jan 2021 12:41:09 +0800 Subject: [PATCH 0874/1370] MKS WiFi for TFT_LVGL_UI (#20191) --- Marlin/Configuration.h | 4 + .../lcd/extui/lib/mks_ui/draw_cloud_bind.cpp | 205 ++++++ .../lcd/extui/lib/mks_ui/draw_cloud_bind.h | 37 ++ .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 24 + Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp | 209 ++++++ Marlin/src/lcd/extui/lib/mks_ui/draw_more.h | 33 + .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 102 ++- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 353 +++------- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 18 +- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 54 +- .../src/lcd/extui/lib/mks_ui/irq_overrid.cpp | 18 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 62 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 +- .../extui/lib/mks_ui/printer_operation.cpp | 9 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 9 + .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 8 + .../lcd/extui/lib/mks_ui/tft_Language_it.h | 8 + .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 177 ++++- .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 9 + .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 10 + .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 9 + .../lib/mks_ui/tft_lvgl_configuration.cpp | 62 +- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 6 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 298 ++++++++- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 30 +- .../src/lcd/extui/lib/mks_ui/wifiSerial.cpp | 21 +- Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h | 3 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 615 +++++++++--------- Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h | 11 +- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 428 +++++------- Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h | 7 +- Marlin/src/libs/W25Qxx.cpp | 110 ++-- Marlin/src/sd/SdBaseFile.cpp | 4 +- platformio.ini | 1 + 36 files changed, 1854 insertions(+), 1110 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_more.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ab112894b1..3f9b6174c2 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2395,6 +2395,10 @@ //#define TFT_COLOR_UI //#define TFT_LVGL_UI +#if ENABLED(TFT_LVGL_UI) + //#define MKS_WIFI_MODULE // MKS WiFi module +#endif + /** * TFT Rotation. Set to one of the following values: * diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp new file mode 100644 index 0000000000..9eaf4d29df --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp @@ -0,0 +1,205 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" + +#include "QR_Encode.h" + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *button_bind_or_not = NULL, *label_bind_or_not = NULL; +static lv_obj_t *buttonReleaseBind = NULL, *label_ReleaseBind = NULL; +static lv_obj_t * text_id; + +static uint8_t unbinding_flag = 0; +static uint8_t id_mark = 0; + +#define ID_CLOUD_BIND_RETURN 1 +#define ID_CLOUD_BIND_OR_NOT 2 +#define ID_CLOUD_RELEASE_BIND 3 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + switch (obj->mks_obj_id) { + case ID_CLOUD_BIND_RETURN: + clear_cur_ui(); + draw_return_ui(); + break; + case ID_CLOUD_RELEASE_BIND: + if (cloud_para.state == 0x12) { + clear_cur_ui(); + lv_draw_dialog(DIALOG_TYPE_UNBIND); + } + break; + } +} + +void lv_draw_cloud_bind(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + scr = lv_screen_create(BIND_UI); + + button_bind_or_not = lv_btn_create(scr, NULL); + lv_obj_set_pos(button_bind_or_not, TFT_WIDTH - 130, TFT_HEIGHT - 80 * 3); + lv_obj_set_size(button_bind_or_not, PARA_UI_VALUE_BTN_X_SIZE + 15, PARA_UI_VALUE_BTN_Y_SIZE + 15); + lv_obj_set_event_cb_mks(button_bind_or_not, event_handler, ID_CLOUD_BIND_OR_NOT, NULL, 0); + lv_btn_set_style(button_bind_or_not, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(button_bind_or_not, LV_BTN_STYLE_PR, &style_para_value); + label_bind_or_not = lv_label_create_empty(button_bind_or_not); + + buttonReleaseBind = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonReleaseBind, TFT_WIDTH - 130, TFT_HEIGHT - 80 * 2); + lv_obj_set_size(buttonReleaseBind, PARA_UI_VALUE_BTN_X_SIZE + 15, PARA_UI_VALUE_BTN_Y_SIZE + 15); + lv_obj_set_event_cb_mks(buttonReleaseBind, event_handler, ID_CLOUD_RELEASE_BIND, NULL, 0); + label_ReleaseBind = lv_label_create_empty(buttonReleaseBind); + lv_label_set_text(label_ReleaseBind, cloud_menu.unbind); + lv_obj_align(label_ReleaseBind, buttonReleaseBind, LV_ALIGN_CENTER, 0, 0); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonBack, TFT_WIDTH - 130, TFT_HEIGHT - 80); + lv_obj_set_size(buttonBack, PARA_UI_VALUE_BTN_X_SIZE + 15, PARA_UI_VALUE_BTN_Y_SIZE + 15); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_CLOUD_BIND_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + label_Back = lv_label_create_empty(buttonBack); + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + #if BUTTONS_EXIST(EN1, EN2, ENC) + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonReleaseBind); + lv_group_add_obj(g, buttonBack); + } + #endif + + text_id = lv_label_create_empty(scr); + lv_obj_set_pos(text_id, 50, 60 + 200 + 20); + lv_obj_set_style(text_id, &tft_style_label_rel); + lv_label_set_text(text_id, (char *)cloud_para.id); + + id_mark = 0; + + disp_bind_state(); +} + +void disp_bind_state() { + if (cloud_para.state != 0x12) + unbinding_flag = 0; + + if (unbinding_flag) { + lv_label_set_text(label_bind_or_not, cloud_menu.unbinding); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_PR, &style_para_value); + } + else { + if (cloud_para.state == 0x10) { + lv_label_set_text(label_bind_or_not, cloud_menu.disconnected); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + } + else if (cloud_para.state == 0x11) { + lv_label_set_text(label_bind_or_not, cloud_menu.unbinded); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + } + else if (cloud_para.state == 0x12) { + lv_label_set_text(label_bind_or_not, cloud_menu.binded); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + } + else { + lv_label_set_text(label_bind_or_not, cloud_menu.disable); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + } + } + + if (cloud_para.state == 0x12 && !unbinding_flag) { + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_PR, &style_para_back); + } + else { + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_PR, &style_para_value); + } +} + +static char last_cloud_state = 0; +void refresh_bind_ui() { + if ((last_cloud_state != cloud_para.state) || unbinding_flag) { + disp_bind_state(); + last_cloud_state = cloud_para.state; + } + if (cloud_para.id[0]) { + if (!id_mark) { + display_qrcode((uint8_t *)cloud_para.id); + lv_label_set_text(text_id, (char *)cloud_para.id); + } + } + else + id_mark = 0; +} + +void display_qrcode(uint8_t *qrcode_data) { + uint8_t i, j; + uint16_t x, y, p; + + if (!id_mark) { + EncodeData((char *)qrcode_data); + id_mark = 1; + } + + lv_fill_rect(10, QRCODE_Y, 300, QRCODE_Y + 300, LV_COLOR_WHITE); + + if (m_nSymbleSize * 2 > QRCODE_WIDTH) return; + + for (i = 0; i < 40; i++) + if ((m_nSymbleSize * i * 2) > QRCODE_WIDTH) break; + + p = (i - 1) * 2; + + x = QRCODE_X + 70; + y = QRCODE_Y + 70; + + for (i = 0; i < m_nSymbleSize; i++) + for (j = 0; j < m_nSymbleSize; j++) + if (m_byModuleData[i][j] == 1) + lv_fill_rect(x + p * i, y + p * j, x + p * (i + 1) - 1, y + p * (j + 1) - 1, LV_COLOR_BACKGROUND); +} + +void cloud_unbind() { + package_to_wifi(WIFI_CLOUD_UNBIND, (uint8_t *)0, 0); + unbinding_flag = 1; +} + +void lv_clear_cloud_bind() { + #if BUTTONS_EXIST(EN1, EN2, ENC) + if (gCfgItems.encoder_enable) + lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h new file mode 100644 index 0000000000..f0f354a065 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_cloud_bind(void); +extern void lv_clear_cloud_bind(); +extern void disp_bind_state(); +extern void refresh_bind_ui(); +extern void display_qrcode(uint8_t *qrcode_data); +extern void cloud_unbind(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 55a0e695fe..e2a24f78e1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -172,6 +172,17 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { clear_cur_ui(); draw_return_ui(); } + #if ENABLED(MKS_WIFI_MODULE) + else if (DIALOG_IS(TYPE_UNBIND)) { + cloud_unbind(); + clear_cur_ui(); + draw_return_ui(); + } + #endif + else { + clear_cur_ui(); + draw_return_ui(); + } } static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { @@ -246,6 +257,9 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelOk, print_file_dialog_menu.confirm); } } + else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMARE)) { + // nothing to do + } #endif else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT)) { btnCancel = lv_button_btn_create(scr, BTN_OK_X+90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); @@ -412,6 +426,10 @@ void lv_draw_dialog(uint8_t type) { lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } } + else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMARE)) { + lv_label_set_text(labelDialog, DIALOG_UPDATE_WIFI_FIRMWARE_EN); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } #endif // MKS_WIFI_MODULE else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat); @@ -445,6 +463,12 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_unloading); lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -70); } + #if ENABLED(MKS_WIFI_MODULE) + else if (DIALOG_IS(TYPE_UNBIND)) { + lv_label_set_text(labelDialog, common_menu.unbind_printer_tips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); + } + #endif #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { if (btnOk) lv_group_add_obj(g, btnOk); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index e0ef10a728..5e5b5f36a0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -66,8 +66,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { queue.inject_P(PSTR("M84 X Y")); break; case ID_H_RETURN: - lv_clear_home(); - lv_draw_tool(); + clear_cur_ui(); + draw_return_ui(); break; } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 749738f6ea..ee219d5d0d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -55,13 +55,13 @@ static const lv_btnm_ctrl_t kb_ctrl_uc_map[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; -static const char * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", +static const char * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", ".", LV_SYMBOL_BACKSPACE, "\n", "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; static const lv_btnm_ctrl_t kb_ctrl_spec_map[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, LV_KB_CTRL_BTN_FLAGS | 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp new file mode 100644 index 0000000000..f718e62589 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp @@ -0,0 +1,209 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "../../../../MarlinCore.h" +#include "draw_ready_print.h" +#include "draw_set.h" +#include "lv_conf.h" +#include "draw_ui.h" +#include "../../../../gcode/queue.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_CUSTOM_1 1 +#define ID_CUSTOM_2 2 +#define ID_CUSTOM_3 3 +#define ID_CUSTOM_4 4 +#define ID_CUSTOM_5 5 +#define ID_CUSTOM_6 6 +#define ID_CUSTOM_7 7 +#define ID_M_RETURN 8 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + switch (obj->mks_obj_id) { + #if ENABLED(USER_CMD_1_ENABLE) + case ID_CUSTOM_1: + queue.inject_P(PSTR(USER_GCODE_1)); + break; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + case ID_CUSTOM_2: + queue.inject_P(PSTR(USER_GCODE_2)); + break; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + case ID_CUSTOM_3: + queue.inject_P(PSTR(USER_GCODE_3)); + break; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + case ID_CUSTOM_4: + queue.inject_P(PSTR(USER_GCODE_4)); + break; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + case ID_CUSTOM_5: + queue.inject_P(PSTR(USER_GCODE_5)); + break; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + case ID_CUSTOM_6: + queue.inject_P(PSTR(USER_GCODE_6)); + break; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + case ID_CUSTOM_7: + queue.inject_P(PSTR(USER_GCODE_7)); + break; + #endif + case ID_M_RETURN: + lv_clear_more(); + lv_draw_tool(); + break; + } +} + +void lv_draw_more(void) { + scr = lv_screen_create(MORE_UI); + + const bool enc_ena = TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable); + + #if ENABLED(USER_CMD_1_ENABLE) + lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", INTERVAL_V, titleHeight, event_handler, ID_CUSTOM_1); + if (enc_ena) lv_group_add_obj(g, buttonCustom1); + lv_obj_t *labelCustom1 = lv_label_create_empty(buttonCustom1); + #endif + + #if ENABLED(USER_CMD_2_ENABLE) + lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_CUSTOM_2); + if (enc_ena) lv_group_add_obj(g, buttonCustom2); + lv_obj_t *labelCustom2 = lv_label_create_empty(buttonCustom2); + #endif + + #if ENABLED(USER_CMD_3_ENABLE) + lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_CUSTOM_3); + if (enc_ena) lv_group_add_obj(g, buttonCustom3); + lv_obj_t *labelCustom3 = lv_label_create_empty(buttonCustom3); + #endif + + #if ENABLED(USER_CMD_4_ENABLE) + lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_CUSTOM_4); + if (enc_ena) lv_group_add_obj(g, buttonCustom4); + lv_obj_t *labelCustom4 = lv_label_create_empty(buttonCustom4); + #endif + + #if ENABLED(USER_CMD_5_ENABLE) + lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5); + if (enc_ena) lv_group_add_obj(g, buttonCustom5); + lv_obj_t *labelCustom5 = lv_label_create_empty(buttonCustom5); + #endif + + #if ENABLED(USER_CMD_6_ENABLE) + lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6); + if (enc_ena) lv_group_add_obj(g, buttonCustom6); + lv_obj_t *labelCustom6 = lv_label_create_empty(buttonCustom6); + #endif + + #if ENABLED(USER_CMD_7_ENABLE) + blv_obj_t *uttonCustom7 = lv_imgbtn_create(scr, "F:/bmp_custom7.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_7); + if (enc_ena) lv_group_add_obj(g, buttonCustom7); + lv_obj_t *labelCustom7 = lv_label_create_empty(buttonCustom7); + #endif + + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN); + if (enc_ena) lv_group_add_obj(g, buttonBack); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); + + if (gCfgItems.multiple_language != 0) { + #if ENABLED(USER_CMD_1_ENABLE) + lv_label_set_text(labelCustom1, more_menu.custom1); + lv_obj_align(labelCustom1, buttonCustom1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_2_ENABLE) + lv_label_set_text(labelCustom2, more_menu.custom2); + lv_obj_align(labelCustom2, buttonCustom2, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_3_ENABLE) + lv_label_set_text(labelCustom3, more_menu.custom3); + lv_obj_align(labelCustom3, buttonCustom3, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_4_ENABLE) + lv_label_set_text(labelCustom4, more_menu.custom4); + lv_obj_align(labelCustom4, buttonCustom4, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_5_ENABLE) + lv_label_set_text(labelCustom5, more_menu.custom5); + lv_obj_align(labelCustom5, buttonCustom5, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_6_ENABLE) + lv_label_set_text(labelCustom6, more_menu.custom6); + lv_obj_align(labelCustom6, buttonCustom6, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_7_ENABLE) + lv_label_set_text(labelCustom7, more_menu.custom7); + lv_obj_align(labelCustom7, buttonCustom7, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + + #if BUTTONS_EXIST(EN1, EN2, ENC) + if (enc_ena) { + #if ENABLED(USER_CMD_1_ENABLE) + lv_group_add_obj(g, buttonCustom1); + #endif + #if ENABLED(USER_CMD_2_ENABLE) + lv_group_add_obj(g, buttonCustom2); + #endif + #if ENABLED(USER_CMD_3_ENABLE) + lv_group_add_obj(g, buttonCustom3); + #endif + #if ENABLED(USER_CMD_4_ENABLE) + lv_group_add_obj(g, buttonCustom4); + #endif + #if ENABLED(USER_CMD_5_ENABLE) + lv_group_add_obj(g, buttonCustom5); + #endif + #if ENABLED(USER_CMD_6_ENABLE) + lv_group_add_obj(g, buttonCustom6); + #endif + #if ENABLED(USER_CMD_7_ENABLE) + lv_group_add_obj(g, buttonCustom7); + #endif + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_more() { + #if BUTTONS_EXIST(EN1, EN2, ENC) + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h new file mode 100644 index 0000000000..9dfa705c8e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_more(void); +extern void lv_clear_more(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 6c0198d9c0..ce240bf16d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -27,12 +27,18 @@ #include #include "../../../../gcode/queue.h" +#include "../../../../module/motion.h" #include "../../../../inc/MarlinConfig.h" extern lv_group_t *g; static lv_obj_t *scr; -static lv_obj_t *labelV, *buttonV; +static lv_obj_t *labelV, *buttonV, *labelP; +static lv_task_t *updatePosTask; +static char cur_label = 'Z'; +static float cur_pos = 0; + +void disp_cur_pos(); enum { ID_M_X_P = 1, @@ -47,67 +53,41 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + if (queue.length <= (BUFSIZE - 3)) { + float dist = uiCfg.move_dist; + switch (obj->mks_obj_id) { + case ID_M_X_N: dist *= -1; case ID_M_X_P: cur_label = 'X'; break; + case ID_M_Y_N: dist *= -1; case ID_M_Y_P: cur_label = 'Y'; break; + case ID_M_Z_N: dist *= -1; case ID_M_Z_P: cur_label = 'Z'; break; + } + sprintf_P(public_buf_l, PSTR("G91\nG1 %c%3.1f F%d\nG90"), cur_label, dist, uiCfg.moveSpeed); + queue.inject(public_buf_l); + } + switch (obj->mks_obj_id) { - case ID_M_X_P: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_one_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 X%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_one_P(PSTR("G90")); - } - break; - case ID_M_X_N: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 X-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; - case ID_M_Y_P: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Y%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; - case ID_M_Y_N: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Y-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; - case ID_M_Z_P: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; - case ID_M_Z_N: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; case ID_M_STEP: if (abs(10 * (int)uiCfg.move_dist) == 100) uiCfg.move_dist = 0.1; else - uiCfg.move_dist *= (float)10; + uiCfg.move_dist *= 10.0f; disp_move_dist(); break; case ID_M_RETURN: clear_cur_ui(); draw_return_ui(); - break; + return; } + disp_cur_pos(); +} + +void refresh_pos(lv_task_t *) { + switch (cur_label) { + case 'X': cur_pos = current_position.x; break; + case 'Y': cur_pos = current_position.y; break; + case 'Z': cur_pos = current_position.z; break; + default: return; + } + disp_cur_pos(); } void lv_draw_move_motor(void) { @@ -124,19 +104,28 @@ void lv_draw_move_motor(void) { buttonV = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_STEP); labelV = lv_label_create_empty(buttonV); #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonV); - } + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonV); #endif lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN); + // We need to patch the title to leave some space on the right for displaying the status + lv_obj_t * title = lv_obj_get_child_back(scr, NULL); + if (title != NULL) lv_obj_set_width(title, TFT_WIDTH - 101); + labelP = lv_label_create(scr, TFT_WIDTH - 100, TITLE_YPOS, "Z:0.0mm"); + if (labelP != NULL) + updatePosTask = lv_task_create(refresh_pos, 300, LV_TASK_PRIO_LOWEST, 0); + disp_move_dist(); + disp_cur_pos(); +} + +void disp_cur_pos() { + sprintf_P(public_buf_l, PSTR("%c:%3.1fmm"), cur_label, cur_pos); + if (labelP) lv_label_set_text(labelP, public_buf_l); } void disp_move_dist() { - // char buf[30] = {0}; - if ((int)(10 * uiCfg.move_dist) == 1) lv_imgbtn_set_src_both(buttonV, "F:/bmp_step_move0_1.bin"); else if ((int)(10 * uiCfg.move_dist) == 10) @@ -164,6 +153,7 @@ void lv_clear_move_motor() { #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); #endif + lv_task_del(updatePosTask); lv_obj_del(scr); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index ffbaba4ea5..bb6e9419f0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -138,12 +138,10 @@ void gCfgItems_init() { gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30; gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2; gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2; - gCfgItems.cloud_enable = true; - #if ENABLED(MKS_WIFI_MODULE) - gCfgItems.wifi_mode_sel = STA_MODEL; - gCfgItems.fileSysType = FILE_SYS_SD; - gCfgItems.wifi_type = ESP_WIFI; - #endif + gCfgItems.cloud_enable = false; + gCfgItems.wifi_mode_sel = STA_MODEL; + gCfgItems.fileSysType = FILE_SYS_SD; + gCfgItems.wifi_type = ESP_WIFI; gCfgItems.filamentchange_load_length = 200; gCfgItems.filamentchange_load_speed = 1000; gCfgItems.filamentchange_unload_length = 200; @@ -449,6 +447,7 @@ void titleText_cat(char *str, int strSize, char *addPart) { char *getDispText(int index) { + ZERO(public_buf_l); switch (disp_state_stack._disp_state[index]) { case PRINT_READY_UI: @@ -593,7 +592,9 @@ char *creat_title_text() { if (strlen(public_buf_m) > MAX_TITLE_LEN) { ZERO(public_buf_m); - tmpText = getDispText(0); + tmpText = 0; + for (index = 0; index <= disp_state_stack._disp_index && (!tmpText || *tmpText == 0); index++) + tmpText = getDispText(index); if (*tmpText != 0) { titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">...>"); @@ -639,253 +640,97 @@ char *creat_title_text() { #endif } - #if 1 + void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { + #if ENABLED(SDSUPPORT) + volatile uint32_t i, j; + volatile uint16_t *p_index; + char *cur_name; - void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { - #if ENABLED(SDSUPPORT) - //uint8_t ress; - //uint32_t write; - volatile uint32_t i, j; - volatile uint16_t *p_index; - //int res; - char *cur_name; - - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - - if (gPicturePreviewStart <= 0) { - while (1) { - uint32_t br = card.read(public_buf, 400); - uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:"); - if (p1) { - gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); - break; - } - else { - gPicturePreviewStart += br; - } - if (br < 400) break; - } - } - - card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); - SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); - - j = i = 0; + cur_name = strrchr(path, '/'); + card.openFileRead(cur_name); + if (gPicturePreviewStart <= 0) { while (1) { - card.read(public_buf, 400); - for (i = 0; i < 400;) { - bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); - i += 2; - j++; - } - if (j >= 400) break; - } - for (i = 0; i < 400; i += 2) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; - } - SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); - #if HAS_BAK_VIEW_IN_FLASH - W25QXX.init(SPI_QUARTER_SPEED); - if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); - W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); - #endif - row++; - if (row >= 200) { - size = 809; - row = 0; - - gcode_preview_over = false; - //flash_preview_begin = true; - - card.closefile(); - - /* - if (gCurFileState.file_open_flag != 0xAA) { - reset_file_info(); - res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); - if (res == FR_OK) { - f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xAA; - //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); - srcfp = file; - mksReprint.mks_printer_state = MKS_WORKING; - once_flag = false; - } - } - */ - char *cur_name; - - cur_name = strrchr(list_file.file_name[sel_id], '/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01; - #endif - card.startFileprint(); - TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = false; - } - return; - } - card.closefile(); - #endif // SDSUPPORT - } - - #else // if 1 - - void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { - #if ENABLED(SDSUPPORT) - //uint8_t ress; - //uint32_t write; - volatile uint32_t i, j; - volatile uint16_t *p_index; - //int res; - char *cur_name; - uint16_t Color; - - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - - card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); - #if HAS_TFT_LVGL_UI_SPI - SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); - #else - LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); - LCD_WriteRAM_Prepare(); - #endif - - j = 0; - i = 0; - - while (1) { - card.read(public_buf, 400); - for (i = 0; i < 400;) { - bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); - i += 2; - j++; - } - - //if (i > 800) break; - //#ifdef TFT70 - // if (j > 400) { - // f_read(file, buff_pic, 1, &read); - // break; - // } - //#elif defined(TFT35) - if (j >= 400) - //f_read(file, buff_pic, 1, &read); + uint32_t br = card.read(public_buf, 400); + uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:"); + if (p1) { + gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); break; - //#endif - + } + else { + gPicturePreviewStart += br; + } + if (br < 400) break; } - #if HAS_TFT_LVGL_UI_SPI - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); + } - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = 0xC318; - } - TFT_CS_L; - TFT_DC_H; - SPI.dmaSend(bmp_public_buf, 400, true); - TFT_CS_H; + card.setIndex(gPicturePreviewStart + size * row + 8); + SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); - #else - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = 0x18C3; - LCD_IO_WriteData(*p_index); - i = i + 2; - } - #endif + j = i = 0; + + while (1) { + card.read(public_buf, 400); + for (i = 0; i < 400;) { + bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); + i += 2; + j++; + } + if (j >= 400) break; + } + for (i = 0; i < 400; i += 2) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; + } + SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); + #if HAS_BAK_VIEW_IN_FLASH W25QXX.init(SPI_QUARTER_SPEED); - if (row < 20) - W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); + if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); - row++; - if (row >= 200) { - size = 809; - row = 0; + #endif + row++; + if (row >= 200) { + size = 809; + row = 0; - gcode_preview_over = false; - //flash_preview_begin = true; + gcode_preview_over = false; - card.closefile(); - - /* - if (gCurFileState.file_open_flag != 0xAA) { - reset_file_info(); - res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); - if (res == FR_OK) { - f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xAA; - //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); - srcfp = file; - mksReprint.mks_printer_state = MKS_WORKING; - once_flag = false; - } - } - */ - char *cur_name; - - cur_name = strrchr(list_file.file_name[sel_id], '/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01; - #endif - card.startFileprint(); - TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = false; - } - return; - } card.closefile(); - #endif // SDSUPPORT - } + char *cur_name; - #endif // if 1 + cur_name = strrchr(list_file.file_name[sel_id], '/'); - void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { + SdFile file; + SdFile *curDir; + card.endFilePrint(); + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_READ)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + update_spi_flash(); + } + + card.openFileRead(cur_name); + if (card.isFileOpen()) { + feedrate_percentage = 100; + planner.flow_percentage[0] = 100; + planner.e_factor[0] = planner.flow_percentage[0] * 0.01; + #if HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01; + #endif + card.startFileprint(); + TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); + once_flag = false; + } + return; + } + card.closefile(); + #endif // SDSUPPORT + } + + void draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { int index; int y_off = 0; W25QXX.init(SPI_QUARTER_SPEED); @@ -914,12 +759,12 @@ char *creat_title_text() { #if HAS_BAK_VIEW_IN_FLASH if (flash_preview_begin) { flash_preview_begin = false; - Draw_default_preview(xpos_pixel, ypos_pixel, 1); + draw_default_preview(xpos_pixel, ypos_pixel, 1); } #endif #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH if (default_preview_flg) { - Draw_default_preview(xpos_pixel, ypos_pixel, 0); + draw_default_preview(xpos_pixel, ypos_pixel, 0); default_preview_flg = false; } #endif @@ -1005,12 +850,11 @@ void GUI_RefreshPage() { temps_update_flag = false; } break; + + case BIND_UI: + refresh_bind_ui(); + break; #endif - - case BIND_UI: - /*refresh_bind_ui();*/ - break; - case FILAMENTCHANGE_UI: if (temps_update_flag) { temps_update_flag = false; @@ -1097,8 +941,7 @@ void clear_cur_ui() { last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index]; switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { - case PRINT_READY_UI: - lv_clear_ready_print(); break; + case PRINT_READY_UI: lv_clear_ready_print(); break; case PRINT_FILE_UI: lv_clear_print_file(); break; case PRINTING_UI: lv_clear_printing(); break; case MOVE_MOTOR_UI: lv_clear_move_motor(); break; @@ -1119,14 +962,16 @@ void clear_cur_ui() { #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: lv_clear_wifi(); break; #endif - case MORE_UI: /* Clear_more(); */ break; + case MORE_UI: lv_clear_more(); break; case FILETRANSFER_UI: break; case DIALOG_UI: lv_clear_dialog(); break; case FILETRANSFERSTATE_UI: break; case PRINT_MORE_UI: break; case FILAMENTCHANGE_UI: lv_clear_filament_change(); break; case LEVELING_UI: lv_clear_manualLevel(); break; - case BIND_UI: /* Clear_Bind(); */ break; + #if ENABLED(MKS_WIFI_MODULE) + case BIND_UI: lv_clear_cloud_bind(); break; + #endif #if HAS_BED_PROBE case NOZZLE_PROBE_OFFSET_UI: lv_clear_auto_level_offset_settings(); break; #endif @@ -1224,11 +1069,13 @@ void draw_return_ui() { #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: lv_draw_wifi(); break; #endif - case PRINT_MORE_UI: /* draw_printmore(); */ break; case MORE_UI: break; + case PRINT_MORE_UI: lv_draw_more(); break; case FILAMENTCHANGE_UI: lv_draw_filament_change(); break; case LEVELING_UI: lv_draw_manualLevel(); break; - case BIND_UI: /* draw_bind(); */ break; + #if ENABLED(MKS_WIFI_MODULE) + case BIND_UI: lv_draw_cloud_bind(); break; + #endif #if HAS_BED_PROBE case NOZZLE_PROBE_OFFSET_UI: lv_draw_auto_level_offset_settings(); break; #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index c911e9a6fd..68ef59728e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -46,6 +46,7 @@ #include "draw_preHeat.h" #include "draw_extrusion.h" #include "draw_home.h" +#include "draw_more.h" #include "draw_move_motor.h" #include "draw_fan.h" #include "draw_about.h" @@ -76,6 +77,8 @@ #include "draw_keyboard.h" #include "draw_encoder_settings.h" +#include "../../inc/MarlinConfigPre.h" + #if ENABLED(MKS_WIFI_MODULE) #include "wifiSerial.h" #include "wifi_module.h" @@ -84,11 +87,15 @@ #include "draw_wifi.h" #include "draw_wifi_list.h" #include "draw_wifi_tips.h" + #include "draw_cloud_bind.h" #endif -#include "../../../../inc/MarlinConfigPre.h" -#define FILE_SYS_USB 0 -#define FILE_SYS_SD 1 +#define ESP_WIFI 0x02 +#define AP_MODEL 0x01 +#define STA_MODEL 0x02 + +#define FILE_SYS_USB 0 +#define FILE_SYS_SD 1 #define TICK_CYCLE 1 @@ -157,6 +164,10 @@ #define PARA_UI_BACK_BTN_X_SIZE 70 #define PARA_UI_BACK_BTN_Y_SIZE 40 + #define QRCODE_X 20 + #define QRCODE_Y 40 + #define QRCODE_WIDTH 160 + #else // ifdef TFT35 #define TFT_WIDTH 320 @@ -237,6 +248,7 @@ typedef struct { float desireSprayerTempBak; float current_x_position_bak; float current_y_position_bak; + float current_z_position_bak; float current_e_position_bak; } UI_CFG; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index 8dc6beb130..d52d508eb3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -41,60 +41,64 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + clear_cur_ui(); switch (obj->mks_obj_id) { case ID_W_RETURN: - clear_cur_ui(); lv_draw_set(); break; case ID_W_CLOUD: - //clear_cur_ui(); - //draw_return_ui(); - break; - case ID_W_RECONNECT: - clear_cur_ui(); - lv_draw_wifi_list(); + lv_draw_cloud_bind(); break; + #if ENABLED(MKS_WIFI_MODULE) + case ID_W_RECONNECT: { + uint8_t cmd_wifi_list[] = { 0xA5, 0x07, 0x00, 0x00, 0xFC }; + raw_send_to_wifi(cmd_wifi_list, COUNT(cmd_wifi_list)); + lv_draw_wifi_list(); + } break; + #endif } } void lv_draw_wifi(void) { scr = lv_screen_create(WIFI_UI); - // Create an Image button - lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - lv_obj_t *buttonReconnect = nullptr, *label_Reconnect = nullptr; + lv_obj_t *buttonCloud = nullptr, *label_Cloud = nullptr; + + const bool enc_ena = TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable); if (gCfgItems.wifi_mode_sel == STA_MODEL) { - buttonReconnect = lv_imgbtn_create(scr, nullptr); + if (gCfgItems.cloud_enable) + buttonCloud = lv_imgbtn_create(scr, "F:/bmp_cloud.bin", BTN_X_PIXEL+INTERVAL_V*2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_CLOUD); - lv_obj_set_event_cb_mks(buttonReconnect, event_handler, ID_W_RECONNECT, "", 0); - lv_imgbtn_set_src_both(buttonReconnect, "F:/bmp_wifi.bin"); - lv_imgbtn_use_label_style(buttonReconnect); + buttonReconnect = lv_imgbtn_create(scr, "F:/bmp_wifi.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RECONNECT); #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonReconnect); + if (gCfgItems.cloud_enable) lv_group_add_obj(g, buttonCloud); + if (enc_ena) lv_group_add_obj(g, buttonReconnect); #endif - lv_obj_set_pos(buttonReconnect, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_btn_set_layout(buttonReconnect, LV_LAYOUT_OFF); - label_Reconnect = lv_label_create_empty(buttonReconnect); + if (gCfgItems.cloud_enable) label_Cloud = lv_label_create_empty(buttonCloud); } - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + // Create an Image button + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN); + if (enc_ena) lv_group_add_obj(g, buttonBack); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); + if (gCfgItems.multiple_language) { if (gCfgItems.wifi_mode_sel == STA_MODEL) { + if (gCfgItems.cloud_enable) { + lv_label_set_text(label_Cloud, wifi_menu.cloud); + lv_obj_align(label_Cloud, buttonCloud, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } lv_label_set_text(label_Reconnect, wifi_menu.reconnect); lv_obj_align(label_Reconnect, buttonReconnect, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } wifi_ip_text = lv_label_create_empty(scr); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp index 128bf0b2d4..388c4a35b8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp @@ -46,20 +46,10 @@ #define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); void __irq_usart1(void) { - WIFISERIAL.wifi_usart_irq(USART1_BASE); - if (wifi_link_state == WIFI_TRANS_FILE) { - if (WIFISERIAL.available() == (400)) WIFI_IO1_SET(); - if (WIFISERIAL.wifi_rb_is_full()) { - if (esp_state == TRANSFER_IDLE) esp_state = TRANSFERING; - if (storeRcvData(UART_RX_BUFFER_SIZE)) { - if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); - } - else { - WIFI_IO1_SET(); - esp_state = TRANSFER_STORE; - } - } - } + if ((USART1_BASE->CR1 & USART_CR1_RXNEIE) && (USART1_BASE->SR & USART_SR_RXNE)) + WRITE(WIFI_IO1_PIN, HIGH); + + WIFISERIAL.wifi_usart_irq(USART1_BASE); } #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index c908b9af3a..1cb7ed185e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -42,7 +42,7 @@ extern uint16_t DeviceCode; #endif static const char assets[][LONG_FILENAME_LENGTH] = { - //homing screen + // Homing screen "bmp_zeroAll.bin", "bmp_zero.bin", "bmp_zeroX.bin", @@ -50,14 +50,15 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_zeroZ.bin", "bmp_manual_off.bin", - //tool screen + // Tool screen "bmp_preHeat.bin", "bmp_extruct.bin", "bmp_mov.bin", "bmp_leveling.bin", "bmp_filamentchange.bin", + "bmp_more.bin", - //fan screen + // Fan screen "bmp_Add.bin", "bmp_Dec.bin", "bmp_speed255.bin", @@ -70,7 +71,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_step5_degree.bin", "bmp_step10_degree.bin", - //extrusion screen + // Extrusion screen "bmp_in.bin", "bmp_out.bin", "bmp_extru1.bin", @@ -84,15 +85,15 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_step5_mm.bin", "bmp_step10_mm.bin", - //select file screen + // Select file screen "bmp_pageUp.bin", "bmp_pageDown.bin", "bmp_back.bin", //TODO: why two back buttons? Why not just one? (return / back) "bmp_dir.bin", "bmp_file.bin", - //move motor screen - //TODO: 6 equal icons, just in diffenct rotation... it may be optimized too + // Move motor screen + // TODO: 6 equal icons, just in diffenct rotation... it may be optimized too "bmp_xAdd.bin", "bmp_xDec.bin", "bmp_yAdd.bin", @@ -103,7 +104,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_step_move1.bin", "bmp_step_move10.bin", - //operation screen + // Operation screen "bmp_auto_off.bin", "bmp_speed.bin", "bmp_fan.bin", @@ -111,7 +112,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_extrude_opr.bin", "bmp_move_opr.bin", - //change speed screen + // Change speed screen "bmp_step1_percent.bin", "bmp_step5_percent.bin", "bmp_step10_percent.bin", @@ -120,7 +121,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_mov_sel.bin", "bmp_speed_extruct.bin", - //printing screen + // Printing screen "bmp_pause.bin", "bmp_resume.bin", "bmp_stop.bin", @@ -134,7 +135,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_zpos_state.bin", "bmp_operate.bin", - //manual leval screen (only if disabled auto level) + // Manual Level screen (only if auto level is disabled) #if DISABLED(AUTO_BED_LEVELING_BILINEAR) "bmp_leveling1.bin", "bmp_leveling2.bin", @@ -143,7 +144,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_leveling5.bin", #endif - //lang select screen + // Language Select screen #if HAS_LANG_SELECT_SCREEN "bmp_language.bin", "bmp_simplified_cn.bin", @@ -162,7 +163,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_italy_sel.bin", #endif // HAS_LANG_SELECT_SCREEN - // gcode preview + // G-code preview #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH "bmp_preview.bin", #endif @@ -171,20 +172,18 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_logo.bin", #endif - // settings screen + // Settings screen "bmp_about.bin", - - //start screen - "bmp_printing.bin", - "bmp_set.bin", - "bmp_tool.bin", - - // settings screen "bmp_eeprom_settings.bin", "bmp_machine_para.bin", "bmp_function1.bin", - // base icons + // Start screen + "bmp_printing.bin", + "bmp_set.bin", + "bmp_tool.bin", + + // Base icons "bmp_arrow.bin", "bmp_back70x40.bin", "bmp_value_blank.bin", @@ -194,14 +193,24 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_return.bin", #if ENABLED(MKS_WIFI_MODULE) - // wifi screen + // Wifi screen "bmp_wifi.bin", + "bmp_cloud.bin", #endif - // babystep screen + // Babystep screen "bmp_baby_move0_01.bin", "bmp_baby_move0_05.bin", - "bmp_baby_move0_1.bin" + "bmp_baby_move0_1.bin", + + // More screen + "bmp_custom1.bin", + "bmp_custom2.bin", + "bmp_custom3.bin", + "bmp_custom4.bin", + "bmp_custom5.bin", + "bmp_custom6.bin", + "bmp_custom7.bin" }; #if HAS_SPI_FLASH_FONT @@ -235,14 +244,13 @@ uint32_t lv_get_pic_addr(uint8_t *Pname) { } while (PIC.name[j++] != '\0'); if ((strcasecmp((char*)Pname, (char*)PIC.name)) == 0) { - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) + if (DeviceCode == 0x9488 || DeviceCode == 0x5761) addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35; else addr = PIC_DATA_ADDR_TFT32 + i * PER_PIC_MAX_SPACE_TFT32; return addr; } } - return addr; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index b856916b95..0abfd7834a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -120,7 +120,7 @@ // SD card information first addr #define VAR_INF_ADDR 0x000000 -#define FLASH_INF_VALID_FLAG 0x20200831 +#define FLASH_INF_VALID_FLAG 0x20201118 //Store some gcode commands, such as auto leveling commands #define GCODE_COMMAND_ADDR VAR_INF_ADDR + 3*1024 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 3c3e7c2674..61168fe0ec 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -32,6 +32,7 @@ #include "../../../../sd/cardreader.h" #include "../../../../inc/MarlinConfig.h" #include "../../../../MarlinCore.h" +#include "../../../../gcode/queue.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -55,6 +56,7 @@ void printer_state_polling() { //save the positon uiCfg.current_x_position_bak = current_position.x; uiCfg.current_y_position_bak = current_position.y; + uiCfg.current_z_position_bak = current_position.z; if (gCfgItems.pausePosZ != (float)-1) { gcode.process_subcommands_now_P(PSTR("G91")); @@ -87,10 +89,9 @@ void printer_state_polling() { gcode.process_subcommands_now(public_buf_m); } if (gCfgItems.pausePosZ != (float)-1) { - gcode.process_subcommands_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); - gcode.process_subcommands_now(public_buf_l); - gcode.process_subcommands_now_P(PSTR("G90")); + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("G1 Z%.1f"), uiCfg.current_z_position_bak); + gcode.process_subcommands_now(public_buf_m); } gcode.process_subcommands_now_P(M24_STR); uiCfg.print_state = WORKING; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 07f4474dd6..4fdc946cca 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -114,6 +114,7 @@ #define PROBE_Z_SPEED_EN "Probe Z-axis speed" #define ENABLE_EN "YES" #define DISABLE_EN "NO" +#define LOCKED_EN "N/A" #define Z_MIN_EN "ZMin" #define Z_MAX_EN "ZMax" @@ -725,3 +726,11 @@ #define EEPROM_STORE_TIPS_EN "Store settings to EEPROM?" #define EEPROM_READ_TIPS_EN "Read settings from EEPROM?" #define EEPROM_REVERT_TIPS_EN "Revert settings to factory defaults?" + +#define MORE_CUSTOM1_TEXT_EN USER_DESC_1 +#define MORE_CUSTOM2_TEXT_EN USER_DESC_2 +#define MORE_CUSTOM3_TEXT_EN USER_DESC_3 +#define MORE_CUSTOM4_TEXT_EN USER_DESC_4 +#define MORE_CUSTOM5_TEXT_EN USER_DESC_5 +#define MORE_CUSTOM6_TEXT_EN USER_DESC_6 +#define MORE_CUSTOM7_TEXT_EN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index 8b090285b3..e3226b3cbe 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -257,3 +257,11 @@ #define EEPROM_STORE_TIPS_FR "Stocker les paramètres dans l'EEPROM?" #define EEPROM_READ_TIPS_FR "Lire les paramètres de l'EEPROM?" #define EEPROM_REVERT_TIPS_FR "Rétablir les paramètres par défaut d'usine?" + +#define MORE_CUSTOM1_TEXT_FR USER_DESC_1 +#define MORE_CUSTOM2_TEXT_FR USER_DESC_2 +#define MORE_CUSTOM3_TEXT_FR USER_DESC_3 +#define MORE_CUSTOM4_TEXT_FR USER_DESC_4 +#define MORE_CUSTOM5_TEXT_FR USER_DESC_5 +#define MORE_CUSTOM6_TEXT_FR USER_DESC_6 +#define MORE_CUSTOM7_TEXT_FR USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index 9f53b1b321..2a1ba83cd0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -254,3 +254,11 @@ #define EEPROM_STORE_TIPS_IT "Memorizzare le impostazioni su EEPROM?" #define EEPROM_READ_TIPS_IT "Leggi le impostazioni dalla EEPROM?" #define EEPROM_REVERT_TIPS_IT "Ripristinare le impostazioni predefinite?" + +#define MORE_CUSTOM1_TEXT_IT USER_DESC_1 +#define MORE_CUSTOM2_TEXT_IT USER_DESC_2 +#define MORE_CUSTOM3_TEXT_IT USER_DESC_3 +#define MORE_CUSTOM4_TEXT_IT USER_DESC_4 +#define MORE_CUSTOM5_TEXT_IT USER_DESC_5 +#define MORE_CUSTOM6_TEXT_IT USER_DESC_6 +#define MORE_CUSTOM7_TEXT_IT USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index a284b2bad8..94103354b9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -29,7 +29,7 @@ #define PRINT_TEXT_RU " печать" #define EXTRUDE_TEXT_RU "ÑкÑтрузиÑ" #define LEVELING_TEXT_RU "уровень" -#define AUTO_LEVELING_TEXT_RU "aвто" +#define AUTO_LEVELING_TEXT_RU "aвтоуровень" #define SET_TEXT_RU "наÑтройки" #define MORE_TEXT_RU "больше" @@ -46,23 +46,23 @@ #define BACK_TEXT_RU "назад" #define TOOL_PREHEAT_RU "нагрев" -#define TOOL_EXTRUDE_RU "ÑкÑтрузиÑ" +#define TOOL_EXTRUDE_RU "ÑкÑтрудер" #define TOOL_MOVE_RU "движение" #define TOOL_HOME_RU "домой" #define TOOL_LEVELING_RU "уровень" -#define TOOL_AUTO_LEVELING_RU "aвто" +#define TOOL_AUTO_LEVELING_RU "aвтоуровень" #define TOOL_FILAMENT_RU "замена" #define TOOL_MORE_RU "больше" -#define AXIS_X_ADD_TEXT_RU "X+" -#define AXIS_X_DEC_TEXT_RU "X-" -#define AXIS_Y_ADD_TEXT_RU "Y+" -#define AXIS_Y_DEC_TEXT_RU "Y-" -#define AXIS_Z_ADD_TEXT_RU "Z+" -#define AXIS_Z_DEC_TEXT_RU "Z-" -#define TEXT_01MM_RU "0.1mm" -#define TEXT_1MM_RU "1mm" -#define TEXT_10MM_RU "10mm" +#define AXIS_X_ADD_TEXT_RU "X +" +#define AXIS_X_DEC_TEXT_RU "X -" +#define AXIS_Y_ADD_TEXT_RU "Y +" +#define AXIS_Y_DEC_TEXT_RU "Y -" +#define AXIS_Z_ADD_TEXT_RU "Z +" +#define AXIS_Z_DEC_TEXT_RU "Z -" +#define TEXT_01MM_RU "0.1 mm" +#define TEXT_1MM_RU "1 mm" +#define TEXT_10MM_RU "10 mm" #define HOME_X_TEXT_RU "X" #define HOME_Y_TEXT_RU "Y" @@ -75,18 +75,18 @@ #define EXTRUDER_IN_TEXT_RU "втÑнуть" #define EXTRUDER_OUT_TEXT_RU "выдавить" -#define EXTRUDE_1MM_TEXT_RU "1mm" -#define EXTRUDE_5MM_TEXT_RU "5mm" -#define EXTRUDE_10MM_TEXT_RU "10mm" +#define EXTRUDE_1MM_TEXT_RU "1 mm" +#define EXTRUDE_5MM_TEXT_RU "5 mm" +#define EXTRUDE_10MM_TEXT_RU "10 mm" #define EXTRUDE_LOW_SPEED_TEXT_RU "мин" #define EXTRUDE_MEDIUM_SPEED_TEXT_RU "Ñред" #define EXTRUDE_HIGH_SPEED_TEXT_RU "выÑ" -#define LEVELING_POINT1_TEXT_RU "1точка" -#define LEVELING_POINT2_TEXT_RU "2точка" -#define LEVELING_POINT3_TEXT_RU "3точка" -#define LEVELING_POINT4_TEXT_RU "4точка" -#define LEVELING_POINT5_TEXT_RU "5точка" +#define LEVELING_POINT1_TEXT_RU "1 точка" +#define LEVELING_POINT2_TEXT_RU "2 точка" +#define LEVELING_POINT3_TEXT_RU "3 точка" +#define LEVELING_POINT4_TEXT_RU "4 точка" +#define LEVELING_POINT5_TEXT_RU "5 точка" #define FILESYS_TEXT_RU "ÑиÑтема" #define WIFI_TEXT_RU "WiFi" @@ -95,11 +95,10 @@ #define BREAK_POINT_TEXT_RU "продолжить" #define FILAMENT_TEXT_RU "замена" #define LANGUAGE_TEXT_RU "Ñзык" -#define MOTOR_OFF_TEXT_RU "отклмотор" +#define MOTOR_OFF_TEXT_RU "откл. мотор" #define MOTOR_OFF_XY_TEXT_RU "Off-XY" #define SHUTDOWN_TEXT_RU "выключение" #define MACHINE_PARA_RU "конфиг" -#define EEPROM_SETTINGS_RU "Eeprom Set" #define U_DISK_TEXT_RU "U диÑк" #define SD_CARD_TEXT_RU "SD диÑк" @@ -111,14 +110,14 @@ #define WIFI_CONNECTED_TEXT_RU "подключен" #define WIFI_DISCONNECTED_TEXT_RU "не подключен" #define WIFI_EXCEPTION_TEXT_RU "иÑключение" -#define WIFI_RECONNECT_TEXT_RU "Reconnect" +#define WIFI_RECONNECT_TEXT_RU "выбор Ñети" #define CLOUD_TEXT_RU "облако" #define CLOUD_BIND_RU "Ñоединён" -#define CLOUD_UNBIND_RU "не Ñоединён" -#define CLOUD_UNBINDING_RU "Unbinding" -#define CLOUD_DISCONNECTED_RU "Disconnected" -#define CLOUD_UNBINDED_RU "Unbinded" -#define CLOUD_BINDED_RU "Binded" +#define CLOUD_UNBIND_RU "отÑоед." +#define CLOUD_UNBINDING_RU "отвÑзано" +#define CLOUD_DISCONNECTED_RU "отключено" +#define CLOUD_UNBINDED_RU "неÑвÑз." +#define CLOUD_BINDED_RU "ÑвÑзано" #define CLOUD_DISABLE_RU "Disable" #define FAN_ADD_TEXT_RU "добавить" @@ -169,11 +168,11 @@ #define ABOUT_VERSION_TEXT_RU "Firmware: " #define ABOUT_WIFI_TEXT_RU "WiFi: " -#define PRINTING_OPERATION_RU "управление" +#define PRINTING_OPERATION_RU "опции" #define PRINTING_PAUSE_RU "пауза" #define PRINTING_TEMP_RU "темп" #define PRINTING_CHANGESPEED_RU "ÑкороÑти" -#define PRINTING_RESUME_RU "возобновить" +#define PRINTING_RESUME_RU "возобн. " #define PRINTING_STOP_RU "Ñтоп" #define PRINTING_MORE_RU "больше" #define PRINTING_EXTRUDER_RU "ÑкÑÑ‚Ñ€" @@ -193,6 +192,7 @@ #define TITLE_HOME_RU "Home" #define TITLE_EXTRUDE_RU "ÑкÑтрузиÑ" #define TITLE_LEVELING_RU "уровень" +#define TITLE_MLEVELING_RU "углы" #define TITLE_SET_RU "наÑтройки" #define TITLE_MORE_RU "больше" #define TITLE_CHOOSEFILE_RU "файла" @@ -230,7 +230,7 @@ #define DIALOG_CLOSE_MACHINE_RU "Closing machine......" #define DIALOG_UNBIND_PRINTER_RU "Unbind the printer?" #define DIALOG_FILAMENT_NO_PRESS_RU "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_RU "Печать завершена!" +#define DIALOG_PRINT_FINISH_RU "печать завершена!" #define DIALOG_PRINT_TIME_RU "Ð’Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸: " #define DIALOG_REPRINT_RU "Print again" #define DIALOG_WIFI_ENABLE_TIPS_RU "The wifi module is being configured,\nplease wait a moment....." @@ -253,6 +253,115 @@ #define EEPROM_SETTINGS_READ_RU "Чтение наÑтроек из EEPROM" #define EEPROM_SETTINGS_REVERT_RU "BоÑÑтановить заводÑкие наÑтройки по умолчанию" -#define EEPROM_STORE_TIPS_RU "Сохранить наÑтройки в EEPROM?" -#define EEPROM_READ_TIPS_RU "Читать наÑтройки из EEPROM?" -#define EEPROM_REVERT_TIPS_RU "Revert settings to factory defaults?" +#define MORE_CUSTOM1_TEXT_RU USER_DESC_1 +#define MORE_CUSTOM2_TEXT_RU USER_DESC_2 +#define MORE_CUSTOM3_TEXT_RU USER_DESC_3 +#define MORE_CUSTOM4_TEXT_RU USER_DESC_4 +#define MORE_CUSTOM5_TEXT_RU USER_DESC_5 +#define MORE_CUSTOM6_TEXT_RU USER_DESC_6 +#define MORE_CUSTOM7_TEXT_RU USER_DESC_7 + +//Malderin translate +// +// +#define EEPROM_STORE_TIPS_RU "Cохранить наÑтройки в EEPROM?" +#define EEPROM_READ_TIPS_RU "читать наÑтройки из EEPROM?" +#define EEPROM_REVERT_TIPS_RU "CброÑить наÑтройки к значениÑм по умолчанию?" +#define EEPROM_SETTINGS_RU "EEPROM" + +#define NEXT_RU "Ñлед." +#define PREVIOUS_RU "пред." +#define ENABLE_RU "да " +#define DISABLE_RU "нет" +#define KEY_CONFIRM_RU "OK" + +#define MACHINE_PARA_TITLE_RU "наÑтройки" +#define MACHINE_TYPE_CNOFIG_RU "HаÑтройки принтера" +#define MOTOR_CONFIG_RU "HаÑтройки моторов" +#define MACHINE_LEVELING_CONFIG_RU "HаÑтройки уровнÑ" +#define ADVANCE_CONFIG_RU "PаÑширенные наÑтройки" +#define MACHINE_FILAMENT_CONFIG_RU "HаÑтройки филамента" +#define ENCODER_SETTINGS_RU "HаÑтройки Ñнкодера" + +#define LEVELING_CONF_TITLE_RU "HаÑтройки принтера>HаÑтройки уровнÑ" +#define LEVELING_PARA_CONF_RU "наÑтройки уровнÑ" +#define LEVELING_MANUAL_POS_RU "наÑтройки координат Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ" +#define LEVELING_AUTO_COMMAND_RU "наÑтройки комманд увтоуровнÑ" +#define LEVELING_AUTO_ZOFFSET_RU "координаты ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñопла" + +#define MACHINE_CONFIG_TITLE_RU "HаÑтройки принтера>наÑтройки притера" +#define MAXFEEDRATE_CONF_RU "наÑтройки макÑимальной ÑкороÑти" +#define ACCELERATION_CONF_RU "наÑтройки уÑкорений" +#define JERKCONF_RU "наÑтройки рывков" + +#define MOTOR_CONF_TITLE_RU "HаÑтройки принтера>HаÑтройки моторов" +#define STEPSCONF_RU "наÑтройки шагов" +#define TMC_CURRENT_RU "TMC наÑтройки токов" +#define TMC_STEP_MODE_RU "TMC наÑтрйоки режима шагов" + +#define ACCELERATION_CONF_TITLE_RU "HаÑтройки принтера>уÑкорениÑ" +#define PRINT_ACCELERATION_RU "уÑкорение печати" +#define RETRACT_ACCELERATION_RU "уÑкорение ретракта" +#define TRAVEL_ACCELERATION_RU "уÑкорение перемещений" +#define X_ACCELERATION_RU "уÑкорение оÑи X" +#define Y_ACCELERATION_RU "уÑкорение оÑи Y" +#define Z_ACCELERATION_RU "уÑкорение оÑи Z" +#define E0_ACCELERATION_RU "уÑкорение E0" +#define E1_ACCELERATION_RU "уÑкорение E1" + +#define MAXFEEDRATE_CONF_TITLE_RU "HаÑтройки принтера>макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ" +#define X_MAXFEEDRATE_RU "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ оÑи X" +#define Y_MAXFEEDRATE_RU "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ оÑи Y" +#define Z_MAXFEEDRATE_RU "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ оÑи Z" +#define E0_MAXFEEDRATE_RU "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ E0" +#define E1_MAXFEEDRATE_RU "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ E1" + +#define JERK_CONF_TITLE_RU "HаÑтройки принтера>ÑкороÑÑ‚ÑŒ рывка" +#define X_JERK_RU "ÑкороÑÑ‚ÑŒ рывка оÑи X" +#define Y_JERK_RU "ÑкороÑÑ‚ÑŒ рывка оÑи Y" +#define Z_JERK_RU "ÑкороÑÑ‚ÑŒ рывка оÑи Z" +#define E_JERK_RU "ÑкороÑÑ‚ÑŒ рывка оÑи E" + +#define STEPS_CONF_TITLE_RU "HаÑтройки принтера>наÑтройки шагов" +#define X_STEPS_RU "шаги оÑи X" +#define Y_STEPS_RU "шаги оÑи Y" +#define Z_STEPS_RU "шаги оÑи Z" +#define E0_STEPS_RU "шаги E0" +#define E1_STEPS_RU "шаги E1" + +#define TMC_CURRENT_CONF_TITLE_RU "HаÑтройки принтера>TMC наÑтройка токов" +#define X_TMC_CURRENT_RU "ток оÑи X (mA)" +#define Y_TMC_CURRENT_RU "ток оÑи Y (mA)" +#define Z_TMC_CURRENT_RU "ток оÑи Z (mA)" +#define E0_TMC_CURRENT_RU "ток E0 (mA)" +#define E1_TMC_CURRENT_RU "ток E1 (mA)" + +#define TMC_MODE_CONF_TITLE_RU "HаÑтройки принтера>TMC наÑтройки режима шагов" +#define X_TMC_MODE_RU "включает ли двигатель X режим StealthChop" +#define Y_TMC_MODE_RU "включает ли оÑÑŒ Y режим StealthChop" +#define Z_TMC_MODE_RU "включает ли оÑÑŒ Z режим StealthChop" +#define E0_TMC_MODE_RU "включает ли E0 режим StealthChop" +#define E1_TMC_MODE_RU "включает ли E1 режим StealthChop" + +#define ADVANCED_CONF_TITLE_RU "HаÑтройки принтера>PаÑширенные" +#define PAUSE_POSITION_RU "HаÑтройки позиции паузы печати" +#define PAUSE_POSITION_X_RU "положение по X (абÑ. полож., -1 недейÑтвит.)" +#define PAUSE_POSITION_Y_RU "положение по Y (абÑ. полож., -1 недейÑтвит.)" +#define PAUSE_POSITION_Z_RU "положение по Z (абÑ. полож., -1 недейÑтвит.)" + +#define OFFSET_TITLE_RU "HаÑтройки принтера>отÑтуп" +#define OFFSET_X_RU "X отÑтуп" +#define OFFSET_Y_RU "Y отÑтуп" +#define OFFSET_Z_RU "Z отÑтуп" + +#define FILAMENT_CONF_TITLE_RU "HаÑтройки принтера>HаÑтройки филамента" +#define FILAMENT_IN_LENGTH_RU "длинна загрузки" +#define FILAMENT_IN_SPEED_RU "ÑкороÑÑ‚ÑŒ загрузки" +#define FILAMENT_TEMPERATURE_RU "температура филамента" +#define FILAMENT_OUT_LENGTH_RU "длинна извлечениÑ" +#define FILAMENT_OUT_SPEED_RU "ÑкороÑÑ‚ÑŒ извлечениÑ" + +#define ENCODER_CONF_TITLE_RU "HаÑтройки принтера>HаÑтройки Ñнкодера" +#define ENCODER_CONF_TEXT_RU "Ñнкодер иÑпользуетÑÑ?" + +//end of Malderin translate diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index 45eeb0f990..046968ba87 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -99,6 +99,7 @@ #define PROBE_Z_SPEED_CN "探针Zæ–¹å‘移动速度" #define ENABLE_CN "是" #define DISABLE_CN "å¦" +#define LOCKED_CN "å¦" #define Z_MIN_CN "ZMin" #define Z_MAX_CN "ZMax" @@ -491,3 +492,11 @@ #define EEPROM_STORE_TIPS_CN "是å¦ä¿å­˜å‚数到EEPROM?" #define EEPROM_READ_TIPS_CN "是å¦ä½¿ç”¨EEPROMå‚æ•°?" #define EEPROM_REVERT_TIPS_CN "是å¦æ¢å¤é»˜è®¤å‚æ•°?" + +#define MORE_CUSTOM1_TEXT_CN USER_DESC_1 +#define MORE_CUSTOM2_TEXT_CN USER_DESC_2 +#define MORE_CUSTOM3_TEXT_CN USER_DESC_3 +#define MORE_CUSTOM4_TEXT_CN USER_DESC_4 +#define MORE_CUSTOM5_TEXT_CN USER_DESC_5 +#define MORE_CUSTOM6_TEXT_CN USER_DESC_6 +#define MORE_CUSTOM7_TEXT_CN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 6366527d88..0b714930eb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -29,6 +29,7 @@ #define PRINT_TEXT_SP "Imprimir" #define EXTRUDE_TEXT_SP "Extrusor" #define LEVELING_TEXT_SP "Leveling" +#define MLEVELING_TEXT_SP "Leveling" #define AUTO_LEVELING_TEXT_SP "Autolevel" #define SET_TEXT_SP "Config" #define MORE_TEXT_SP "Más" @@ -50,6 +51,7 @@ #define TOOL_MOVE_SP "Mover" #define TOOL_HOME_SP "Origen" #define TOOL_LEVELING_SP "Leveling" +#define TOOL_MLEVELING_SP "Leveling" #define TOOL_AUTO_LEVELING_SP "Autolevel" #define TOOL_FILAMENT_SP "Filamento" #define TOOL_MORE_SP "Más" @@ -261,3 +263,11 @@ #define EEPROM_STORE_TIPS_SP "¿Guardar ajustes en EEPROM?" #define EEPROM_READ_TIPS_SP "Leer la configuración de EEPROM?" #define EEPROM_REVERT_TIPS_SP "Revert settings to factory defaults?" + +#define MORE_CUSTOM1_TEXT_SP USER_DESC_1 +#define MORE_CUSTOM2_TEXT_SP USER_DESC_2 +#define MORE_CUSTOM3_TEXT_SP USER_DESC_3 +#define MORE_CUSTOM4_TEXT_SP USER_DESC_4 +#define MORE_CUSTOM5_TEXT_SP USER_DESC_5 +#define MORE_CUSTOM6_TEXT_SP USER_DESC_6 +#define MORE_CUSTOM7_TEXT_SP USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 3288d5b8f9..30d0430313 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -99,6 +99,7 @@ #define PROBE_Z_SPEED_T_CN "探针Zæ–¹å‘移動速度" #define ENABLE_T_CN "是" #define DISABLE_T_CN "å¦" +#define LOCKED_T_CN "å¦" #define Z_MIN_T_CN "ZMin" #define Z_MAX_T_CN "ZMax" @@ -489,3 +490,11 @@ #define EEPROM_STORE_TIPS_T_CN "是å¦ä¿å­˜åƒæ•¸åˆ°EEPROM?" #define EEPROM_READ_TIPS_T_CN "是å¦ä½¿ç”¨EEPROMåƒæ•¸?" #define EEPROM_REVERT_TIPS_T_CN "是å¦æ¢å¾©é»˜èªåƒæ•¸?" + +#define MORE_CUSTOM1_TEXT_T_CN USER_DESC_1 +#define MORE_CUSTOM2_TEXT_T_CN USER_DESC_2 +#define MORE_CUSTOM3_TEXT_T_CN USER_DESC_3 +#define MORE_CUSTOM4_TEXT_T_CN USER_DESC_4 +#define MORE_CUSTOM5_TEXT_T_CN USER_DESC_5 +#define MORE_CUSTOM6_TEXT_T_CN USER_DESC_6 +#define MORE_CUSTOM7_TEXT_T_CN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 5350ddb377..d005a9b103 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -19,12 +19,6 @@ * along with this program. If not, see . * */ - -/** - * @file tft_lvgl_configuration.cpp - * @date 2020-02-21 - */ - #include "../../../../inc/MarlinConfigPre.h" #if HAS_TFT_LVGL_UI @@ -56,6 +50,10 @@ XPT2046 touch; #include "draw_touch_calibration.h" #endif +#if ENABLED(MKS_WIFI_MODULE) + #include "wifi_module.h" +#endif + #include #ifndef TFT_WIDTH @@ -120,6 +118,10 @@ void tft_lvgl_init() { watchdog_refresh(); // LVGL init takes time + #if MB(MKS_ROBIN_NANO) + OUT_WRITE(PB0, LOW); // HE1 + #endif + // Init TFT first! SPI_TFT.spi_init(SPI_FULL_SPEED); SPI_TFT.LCD_init(); @@ -137,19 +139,19 @@ void tft_lvgl_init() { lv_init(); - lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 14); /*Initialize the display buffer*/ + lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 14); // Initialize the display buffer - lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ - lv_disp_drv_init(&disp_drv); /*Basic initialization*/ - disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/ - disp_drv.buffer = &disp_buf; /*Assign the buffer to the display*/ - lv_disp_drv_register(&disp_drv); /*Finally register the driver*/ + lv_disp_drv_t disp_drv; // Descriptor of a display driver + lv_disp_drv_init(&disp_drv); // Basic initialization + disp_drv.flush_cb = my_disp_flush; // Set your driver function + disp_drv.buffer = &disp_buf; // Assign the buffer to the display + lv_disp_drv_register(&disp_drv); // Finally register the driver lv_indev_drv_t indev_drv; - lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/ - indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/ - indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ - lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ + lv_indev_drv_init(&indev_drv); // Descriptor of a input device driver + indev_drv.type = LV_INDEV_TYPE_POINTER; // Touch pad is a pointer-like device + indev_drv.read_cb = my_touchpad_read; // Set your driver function + lv_indev_drv_register(&indev_drv); // Finally register the driver #if HAS_ROTARY_ENCODER g = lv_group_create(); @@ -193,6 +195,8 @@ void tft_lvgl_init() { lv_encoder_pin_init(); + TERN_(MKS_WIFI_MODULE, mks_wifi_firmware_update()); + bool ready = true; #if ENABLED(POWER_LOSS_RECOVERY) recovery.load(); @@ -212,12 +216,9 @@ void tft_lvgl_init() { } #endif - if (ready) { - lv_draw_ready_print(); - } + if (ready) lv_draw_ready_print(); - if (mks_test_flag == 0x1E) - mks_gpio_test(); + if (mks_test_flag == 0x1E) mks_gpio_test(); } void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { @@ -229,11 +230,20 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co for (uint16_t i = 0; i < height; i++) SPI_TFT.tftio.WriteSequence((uint16_t*)(color_p + width * i), width); - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ + lv_disp_flush_ready(disp); // Indicate you are ready with the flushing W25QXX.init(SPI_QUARTER_SPEED); } +void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv_color_t bk_color) { + uint16_t width, height; + width = x2 - x1 + 1; + height = y2 - y1 + 1; + SPI_TFT.setWindow((uint16_t)x1, (uint16_t)y1, width, height); + SPI_TFT.tftio.WriteMultiple(bk_color.full, width * height); + W25QXX.init(SPI_QUARTER_SPEED); +} + #define TICK_CYCLE 1 unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { @@ -298,13 +308,13 @@ int16_t enc_diff = 0; lv_indev_state_t state = LV_INDEV_STATE_REL; bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { - (void) indev_drv; /*Unused*/ + (void) indev_drv; // Unused data->state = state; data->enc_diff = enc_diff; enc_diff = 0; - return false; /*No more data to read so return false*/ + return false; // No more data to read so return false } extern uint8_t currentFlashPage; @@ -327,7 +337,7 @@ lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * pa lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p) { lv_fs_res_t res = LV_FS_RES_OK; - /* Add your code here*/ + /* Add your code here */ pic_read_addr_offset = pic_read_base_addr; return res; } @@ -379,7 +389,7 @@ lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_ } lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p) { - /* Add your code here*/ + /* Add your code here */ lv_close_gcode_file(); return LV_FS_RES_OK; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index 20fa3242e6..0d4ea1f404 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -33,7 +33,9 @@ #include //#define TFT_ROTATION TFT_ROTATE_180 -#define MKS_WIFI_MODULE 0 + +extern uint8_t bmp_public_buf[14 * 1024]; +extern uint8_t public_buf[513]; extern uint8_t bmp_public_buf[14 * 1024]; extern uint8_t public_buf[513]; @@ -63,6 +65,8 @@ extern lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uin extern lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); extern lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +extern void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv_color_t bk_color); + #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 3cbbe538bc..2efe68a4ce 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -136,6 +136,7 @@ void machine_setting_disp() { machine_menu.ProbeZspeed = PROBE_Z_SPEED_CN; machine_menu.enable = ENABLE_CN; machine_menu.disable = DISABLE_CN; + machine_menu.locked = LOCKED_CN; machine_menu.z_min = Z_MIN_CN; machine_menu.z_max = Z_MAX_CN; @@ -363,6 +364,7 @@ void machine_setting_disp() { machine_menu.ProbeZspeed = PROBE_Z_SPEED_T_CN; machine_menu.enable = ENABLE_T_CN; machine_menu.disable = DISABLE_T_CN; + machine_menu.locked = LOCKED_T_CN; machine_menu.z_min = Z_MIN_T_CN; machine_menu.z_max = Z_MAX_T_CN; @@ -591,6 +593,7 @@ void machine_setting_disp() { machine_menu.ProbeZspeed = PROBE_Z_SPEED_EN; machine_menu.enable = ENABLE_EN; machine_menu.disable = DISABLE_EN; + machine_menu.locked = LOCKED_EN; machine_menu.z_min = Z_MIN_EN; machine_menu.z_max = Z_MAX_EN; @@ -941,7 +944,28 @@ void disp_language_init() { filesys_menu.sd_sys = SD_CARD_TEXT_CN; filesys_menu.usb_sys = U_DISK_TEXT_CN; // - more_menu.title = TITLE_MORE_CN; + more_menu.title = TITLE_MORE_CN; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_CN; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_CN; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_CN; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_CN; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_CN; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_CN; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_CN; + #endif // WIFI wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_CN; @@ -953,6 +977,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_CN; cloud_menu.unbinding = CLOUD_UNBINDED_CN; cloud_menu.disconnected = CLOUD_DISCONNECTED_CN; + cloud_menu.unbinded = CLOUD_UNBINDED_CN; cloud_menu.disable = CLOUD_DISABLE_CN; // about_menu.title = ABOUT_TEXT_CN; @@ -1166,9 +1191,30 @@ void disp_language_init() { filesys_menu.sd_sys = SD_CARD_TEXT_T_CN; filesys_menu.usb_sys = U_DISK_TEXT_T_CN; // - more_menu.title = TITLE_MORE_T_CN; + more_menu.title = TITLE_MORE_T_CN; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_T_CN; + #endif // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_T_CN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_T_CN; // CLOUD @@ -1178,6 +1224,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_T_CN; cloud_menu.unbinding = CLOUD_UNBINDED_T_CN; cloud_menu.disconnected = CLOUD_DISCONNECTED_T_CN; + cloud_menu.unbinded = CLOUD_UNBINDED_T_CN; cloud_menu.disable = CLOUD_DISABLE_T_CN; // about_menu.title = ABOUT_TEXT_T_CN; @@ -1334,7 +1381,7 @@ void disp_language_init() { preheat_menu.hotbed = HEATBED_TEXT_EN; preheat_menu.off = CLOSE_TEXT_EN; // - move_menu.title = TITLE_MOVE_EN; + move_menu.title = TITLE_MOVE_EN; // home_menu.title = TITLE_HOME_EN; home_menu.stopmove = HOME_STOPMOVE_EN; @@ -1377,12 +1424,34 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_EN; set_menu.eepromSet = EEPROM_SETTINGS_EN; more_menu.title = TITLE_MORE_EN; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_EN; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_EN; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_EN; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_EN; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_EN; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_EN; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_EN; + #endif + // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; filesys_menu.usb_sys = U_DISK_TEXT_EN; // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_EN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; @@ -1392,6 +1461,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_EN; cloud_menu.unbinding = CLOUD_UNBINDED_EN; cloud_menu.disconnected = CLOUD_DISCONNECTED_EN; + cloud_menu.unbinded = CLOUD_UNBINDED_EN; cloud_menu.disable = CLOUD_DISABLE_EN; // about_menu.title = TITLE_ABOUT_EN; @@ -1545,7 +1615,7 @@ void disp_language_init() { preheat_menu.hotbed = HEATBED_TEXT_RU; preheat_menu.off = CLOSE_TEXT_RU; // - move_menu.title = MOVE_TEXT_RU; + move_menu.title = MOVE_TEXT_RU; // home_menu.title = TITLE_HOME_RU; home_menu.stopmove = HOME_STOPMOVE_RU; @@ -1588,21 +1658,137 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_RU; set_menu.eepromSet = EEPROM_SETTINGS_RU; more_menu.title = TITLE_MORE_RU; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_RU; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_RU; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_RU; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_RU; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_RU; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_RU; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_RU; + #endif // filesys_menu.title = TITLE_FILESYS_RU; filesys_menu.sd_sys = SD_CARD_TEXT_RU; filesys_menu.usb_sys = U_DISK_TEXT_RU; // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_RU; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_RU; + machine_menu.next = NEXT_RU; + machine_menu.previous = PREVIOUS_RU; + machine_menu.enable = ENABLE_RU; + machine_menu.disable = DISABLE_RU; + machine_menu.key_confirm = KEY_CONFIRM_RU; + + MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_RU; + MachinePara_menu.title = MACHINE_PARA_TITLE_RU; + machine_menu.MachineConfigTitle = MACHINE_CONFIG_TITLE_RU; + MachinePara_menu.MotorSetting = MOTOR_CONFIG_RU; + MachinePara_menu.leveling = MACHINE_LEVELING_CONFIG_RU; + MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_RU; + machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_RU; + machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_RU; + machine_menu.AccelerationConf = ACCELERATION_CONF_RU; + machine_menu.JerkConf = JERKCONF_RU; + machine_menu.StepsConf = STEPSCONF_RU; + machine_menu.TMCcurrentConf = TMC_CURRENT_RU; + machine_menu.TMCStepModeConf = TMC_STEP_MODE_RU; + machine_menu.PausePosition = PAUSE_POSITION_RU; + machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_RU; + machine_menu.EncoderSettings = ENCODER_SETTINGS_RU; + machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_RU; + + machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_RU; + machine_menu.LevelingParaConf = LEVELING_PARA_CONF_RU; + machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_RU; + machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_RU; + machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_RU; + + machine_menu.AccelerationConfTitle = ACCELERATION_CONF_TITLE_RU; + machine_menu.PrintAcceleration = PRINT_ACCELERATION_RU; + machine_menu.RetractAcceleration = RETRACT_ACCELERATION_RU; + machine_menu.TravelAcceleration = TRAVEL_ACCELERATION_RU; + machine_menu.X_Acceleration = X_ACCELERATION_RU; + machine_menu.Y_Acceleration = Y_ACCELERATION_RU; + machine_menu.Z_Acceleration = Z_ACCELERATION_RU; + machine_menu.E0_Acceleration = E0_ACCELERATION_RU; + machine_menu.E1_Acceleration = E1_ACCELERATION_RU; + + machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_RU; + machine_menu.XMaxFeedRate = X_MAXFEEDRATE_RU; + machine_menu.YMaxFeedRate = Y_MAXFEEDRATE_RU; + machine_menu.ZMaxFeedRate = Z_MAXFEEDRATE_RU; + machine_menu.E0MaxFeedRate = E0_MAXFEEDRATE_RU; + machine_menu.E1MaxFeedRate = E1_MAXFEEDRATE_RU; + + machine_menu.JerkConfTitle = JERK_CONF_TITLE_RU; + machine_menu.X_Jerk = X_JERK_RU; + machine_menu.Y_Jerk = Y_JERK_RU; + machine_menu.Z_Jerk = Z_JERK_RU; + machine_menu.E_Jerk = E_JERK_RU; + + machine_menu.StepsConfTitle = STEPS_CONF_TITLE_RU; + machine_menu.X_Steps = X_STEPS_RU; + machine_menu.Y_Steps = Y_STEPS_RU; + machine_menu.Z_Steps = Z_STEPS_RU; + machine_menu.E0_Steps = E0_STEPS_RU; + machine_menu.E1_Steps = E1_STEPS_RU; + + machine_menu.TmcCurrentConfTitle = TMC_CURRENT_CONF_TITLE_RU; + machine_menu.X_Current = X_TMC_CURRENT_RU; + machine_menu.Y_Current = Y_TMC_CURRENT_RU; + machine_menu.Z_Current = Z_TMC_CURRENT_RU; + machine_menu.E0_Current = E0_TMC_CURRENT_RU; + machine_menu.E1_Current = E1_TMC_CURRENT_RU; + + machine_menu.TmcStepModeConfTitle = TMC_MODE_CONF_TITLE_RU; + machine_menu.X_StepMode = X_TMC_MODE_RU; + machine_menu.Y_StepMode = Y_TMC_MODE_RU; + machine_menu.Z_StepMode = Z_TMC_MODE_RU; + machine_menu.E0_StepMode = E0_TMC_MODE_RU; + machine_menu.E1_StepMode = E1_TMC_MODE_RU; + + machine_menu.PausePosText = PAUSE_POSITION_RU; + machine_menu.xPos = PAUSE_POSITION_X_RU; + machine_menu.yPos = PAUSE_POSITION_Y_RU; + machine_menu.zPos = PAUSE_POSITION_Z_RU; + + machine_menu.OffsetConfTitle = OFFSET_TITLE_RU; + machine_menu.Xoffset = OFFSET_X_RU; + machine_menu.Yoffset = OFFSET_Y_RU; + machine_menu.Zoffset = OFFSET_Z_RU; + + machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_RU; + machine_menu.InLength = FILAMENT_IN_LENGTH_RU; + machine_menu.InSpeed = FILAMENT_IN_SPEED_RU; + machine_menu.FilamentTemperature = FILAMENT_TEMPERATURE_RU; + machine_menu.OutLength = FILAMENT_OUT_LENGTH_RU; + machine_menu.OutSpeed = FILAMENT_OUT_SPEED_RU; + + machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_RU; + machine_menu.EncoderConfText = ENCODER_CONF_TEXT_RU; + cloud_menu.title = TITLE_CLOUD_TEXT_RU; cloud_menu.bind = CLOUD_BINDED_RU; cloud_menu.binded = CLOUD_BINDED_RU; cloud_menu.unbind = CLOUD_UNBIND_RU; cloud_menu.unbinding = CLOUD_UNBINDED_RU; cloud_menu.disconnected = CLOUD_DISCONNECTED_RU; + cloud_menu.unbinded = CLOUD_UNBINDED_RU; cloud_menu.disable = CLOUD_DISABLE_RU; // about_menu.title = ABOUT_TEXT_RU; @@ -1802,13 +1988,34 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_SP; set_menu.eepromSet = EEPROM_SETTINGS_SP; more_menu.title = TITLE_MORE_SP; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_SP; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_SP; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_SP; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_SP; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_SP; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_SP; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_SP; + #endif // filesys_menu.title = TITLE_FILESYS_SP; filesys_menu.sd_sys = SD_CARD_TEXT_SP; filesys_menu.usb_sys = U_DISK_TEXT_SP; // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_SP; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_SP; @@ -1818,6 +2025,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_SP; cloud_menu.unbinding = CLOUD_UNBINDED_SP; cloud_menu.disconnected = CLOUD_DISCONNECTED_SP; + cloud_menu.unbinded = CLOUD_UNBINDED_SP; cloud_menu.disable = CLOUD_DISABLE_SP; // about_menu.title = ABOUT_TEXT_SP; @@ -2015,6 +2223,27 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_FR; set_menu.eepromSet = EEPROM_SETTINGS_FR; more_menu.title = TITLE_MORE_FR; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_FR; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_FR; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_FR; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_FR; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_FR; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_FR; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_FR; + #endif // filesys_menu.title = TITLE_FILESYS_FR; filesys_menu.sd_sys = SD_CARD_TEXT_FR; @@ -2023,7 +2252,7 @@ void disp_language_init() { file_menu.no_file = NO_FILE_FR; file_menu.no_file_and_check = NO_FILE_FR; // WIFI - wifi_menu.title = WIFI_NAME_TEXT_FR; + wifi_menu.title = WIFI_NAME_TEXT_FR; wifi_menu.cloud = CLOUD_TEXT_FR; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_FR; @@ -2033,6 +2262,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_FR; cloud_menu.unbinding = CLOUD_UNBINDED_FR; cloud_menu.disconnected = CLOUD_DISCONNECTED_FR; + cloud_menu.unbinded = CLOUD_UNBINDED_FR; cloud_menu.disable = CLOUD_DISABLE_FR; // about_menu.title = ABOUT_TEXT_FR; @@ -2229,13 +2459,34 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_IT; set_menu.eepromSet = EEPROM_SETTINGS_IT; more_menu.title = TITLE_MORE_IT; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_IT; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_IT; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_IT; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_IT; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_IT; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_IT; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_IT; + #endif // filesys_menu.title = TITLE_FILESYS_IT; filesys_menu.sd_sys = SD_CARD_TEXT_IT; filesys_menu.usb_sys = U_DISK_TEXT_IT; // WIFI - wifi_menu.title = WIFI_NAME_TEXT_IT; + wifi_menu.title = WIFI_NAME_TEXT_IT; wifi_menu.cloud = CLOSE_TEXT_IT; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_IT; @@ -2245,6 +2496,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_IT; cloud_menu.unbinding = CLOUD_UNBINDED_IT; cloud_menu.disconnected = CLOUD_DISCONNECTED_IT; + cloud_menu.unbinded = CLOUD_UNBINDED_IT; cloud_menu.disable = CLOUD_DISABLE_IT; // about_menu.title = ABOUT_TEXT_IT; @@ -2442,13 +2694,34 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_EN; set_menu.eepromSet = EEPROM_SETTINGS_EN; // - more_menu.title = TITLE_MORE_EN; + more_menu.title = TITLE_MORE_EN; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_EN; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_EN; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_EN; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_EN; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_EN; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_EN; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_EN; + #endif // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; filesys_menu.usb_sys = U_DISK_TEXT_EN; // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_EN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; @@ -2458,6 +2731,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_EN; cloud_menu.unbinding = CLOUD_UNBINDED_EN; cloud_menu.disconnected = CLOUD_DISCONNECTED_EN; + cloud_menu.unbinded = CLOUD_UNBINDED_EN; cloud_menu.disable = CLOUD_DISABLE_EN; // about_menu.title = TITLE_ABOUT_EN; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 519388992f..a3b55d469b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -118,6 +118,7 @@ typedef struct machine_common_disp{ const char *ProbeZspeed; const char *enable; const char *disable; + const char *locked; const char *z_min; const char *z_max; @@ -456,6 +457,13 @@ extern filesys_menu_def filesys_menu; typedef struct more_menu_disp { const char *title; + const char *custom1; + const char *custom2; + const char *custom3; + const char *custom4; + const char *custom5; + const char *custom6; + const char *custom7; const char *back; } more_menu_def; @@ -757,15 +765,15 @@ extern eeprom_def eeprom_menu; #define AXIS_Y_DEC_TEXT "Y-" #define AXIS_Z_ADD_TEXT "Z+" #define AXIS_Z_DEC_TEXT "Z-" -#define TEXT_001MM "0.01mm" -#define TEXT_005MM "0.05mm" -#define TEXT_01MM "0.1mm" -#define TEXT_1MM "1mm" -#define TEXT_10MM "10mm" +#define TEXT_001MM "0.01 mm" +#define TEXT_005MM "0.05 mm" +#define TEXT_01MM "0.1 mm" +#define TEXT_1MM "1 mm" +#define TEXT_10MM "10 mm" -#define EXTRUDE_1MM_TEXT "1mm" -#define EXTRUDE_5MM_TEXT "5mm" -#define EXTRUDE_10MM_TEXT "10mm" +#define EXTRUDE_1MM_TEXT "1 mm" +#define EXTRUDE_5MM_TEXT "5 mm" +#define EXTRUDE_10MM_TEXT "10 mm" #define STEP_1PERCENT "1%" #define STEP_5PERCENT "5%" @@ -819,6 +827,6 @@ extern eeprom_def eeprom_menu; #define DIALOG_UPDATE_WIFI_WEB_EN "Updating wifi model web data" #define DIALOG_UPDATE_NO_DEVICE_EN "Please check whether\nmemory device inserted!" -#define ZOFFSET_STEP001 "0.01mm" -#define ZOFFSET_STEP01 "0.1mm" -#define ZOFFSET_STEP1 "1mm" +#define ZOFFSET_STEP001 "0.01 mm" +#define ZOFFSET_STEP01 "0.1 mm" +#define ZOFFSET_STEP1 "1 mm" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp index 93fce6af30..6999c638f5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp @@ -55,10 +55,29 @@ WifiSerial::WifiSerial(usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) { static void disable_timer_if_necessary(timer_dev *dev, uint8 ch) { if (dev) timer_set_mode(dev, ch, TIMER_DISABLED); } + static void usart_enable_no_irq(usart_dev *usart_device, bool with_irq) { + if (with_irq) usart_enable(usart_device); + else { + usart_reg_map *regs = usart_device->regs; + regs->CR1 |= (USART_CR1_TE | USART_CR1_RE);// don't change the word length etc, and 'or' in the patten not overwrite |USART_CR1_M_8N1); + regs->CR1 |= USART_CR1_UE; + } + } + #elif STM32_MCU_SERIES == STM32_SERIES_F2 || STM32_MCU_SERIES == STM32_SERIES_F4 #define disable_timer_if_necessary(dev, ch) ((void)0) + + static void usart_enable_no_irq(usart_dev *usart_device, bool with_irq) { + if (with_irq) usart_enable(usart_device); + else { + usart_reg_map *regs = usart_device->regs; + regs->CR1 |= (USART_CR1_TE | USART_CR1_RE);// don't change the word length etc, and 'or' in the patten not overwrite |USART_CR1_M_8N1); + regs->CR1 |= USART_CR1_UE; + } + } #else #warning "Unsupported STM32 series; timer conflicts are possible" + #define usart_enable_no_irq(X, Y) usart_enable(X) #endif void WifiSerial::begin(uint32 baud) { begin(baud, SERIAL_8N1); } @@ -89,7 +108,7 @@ void WifiSerial::begin(uint32 baud, uint8_t config) { txi->gpio_device, txi->gpio_bit, config); usart_set_baud_rate(this->usart_device, USART_USE_PCLK, baud); - usart_enable(this->usart_device); + usart_enable_no_irq(this->usart_device, baud == WIFI_BAUDRATE); } void WifiSerial::end(void) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h index e2b560e6fa..656ec1b9d0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h @@ -89,8 +89,9 @@ class WifiSerial { int wifi_rb_is_full(void); - private: + struct usart_dev *usart_device; + private: uint8 tx_pin; uint8 rx_pin; }; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index a8537dd3de..dce4ce5977 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -26,6 +26,7 @@ #include "draw_ui.h" #include "wifi_module.h" #include "wifi_upload.h" +#include "SPI_TFT.h" #if ENABLED(MKS_WIFI_MODULE) @@ -36,6 +37,8 @@ #include "../../../../lcd/marlinui.h" #include "../../../../sd/cardreader.h" #include "../../../../module/planner.h" +#include "../../../../module/servo.h" +#include "../../../../module/probe.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif @@ -109,10 +112,9 @@ extern IP_PARA ipPara; extern CLOUD_PARA cloud_para; extern bool once_flag, flash_preview_begin, default_preview_flg, gcode_preview_over; +extern bool flash_dma_mode; -uint32_t getWifiTick() { - return millis(); -} +uint32_t getWifiTick() { return millis(); } uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { if (lastTick <= curTick) @@ -149,40 +151,123 @@ void mount_file_sys(uint8_t disk_type) { } } -static void dma_init() { - #if 0 - __HAL_RCC_DMA1_CLK_ENABLE(); +#include +#include +#include - //HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); - HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 4, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); +#include +#include - hdma_usart1_rx.Instance = DMA1_Channel5; - //hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; - hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; - hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_usart1_rx.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_usart1_rx.Init.Mode = DMA_NORMAL; - hdma_usart1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; - if (HAL_DMA_Init((DMA_HandleTypeDef *)&hdma_usart1_rx) != HAL_OK) { - Error_Handler(); +#include +#include + +#include +#include +#include +#include + +void changeFlashMode(const bool dmaMode) { + if (flash_dma_mode != dmaMode) { + flash_dma_mode = dmaMode; + if (!flash_dma_mode) { + dma_disable(DMA1, DMA_CH5); + dma_clear_isr_bits(DMA1, DMA_CH4); + } + } +} + +static bool longName2DosName(const char *longName, uint8_t *dosName) { + uint8_t i; + for (i = FILENAME_LENGTH; i--;) dosName[i] = '\0'; + while (*longName) { + uint8_t c = *longName++; + if (c == '.') { // For a dot... + if (i == 0) return false; + strcat((char *)dosName, ".GCO"); + break; + } + else { + if (c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters + // Fail for illegal characters + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + while (const uint8_t b = pgm_read_byte(p++)) if (b == c) return false; + dosName[i++] = c + (WITHIN(c, 'a', 'z') ? 'A' - 'a' : 0); // Uppercase required for 8.3 name + } + if (i >= 5) { + strcat((char *)dosName, "~1.GCO"); + break; + } + } + return dosName[0] != '\0'; // Return true if any name was set +} + +static int storeRcvData(volatile uint8_t *bufToCpy, int32_t len) { + unsigned char tmpW = wifiDmaRcvFifo.write_cur; + + if (len > UDISKBUFLEN) return 0; + + if (wifiDmaRcvFifo.state[tmpW] == udisk_buf_empty) { + memcpy((unsigned char *) wifiDmaRcvFifo.bufferAddr[tmpW], (uint8_t *)bufToCpy, len); + wifiDmaRcvFifo.state[tmpW] = udisk_buf_full; + wifiDmaRcvFifo.write_cur = (tmpW + 1) % TRANS_RCV_FIFO_BLOCK_NUM; + return 1; } + return 0; +} - HAL_DMA_Start_IT((DMA_HandleTypeDef *)&hdma_usart1_rx, - (uint32_t)&huart1.Instance->DR, - (uint32_t)(&WifiRxFifo.uartTxBuffer[0]), - UART_RX_BUFFER_SIZE); +static void esp_dma_pre() { + dma_channel_reg_map *channel_regs = dma_tube_regs(DMA1, DMA_CH5); - //HAL_UART_Receive_DMA(&huart1,(uint8_t*)&WifiRxFifo.uartTxBuffer[0], UART_RX_BUFFER_SIZE); + CBI32(channel_regs->CCR, 0); + channel_regs->CMAR = (uint32_t)WIFISERIAL.usart_device->rb->buf; + channel_regs->CNDTR = 0x0000; + channel_regs->CNDTR = UART_RX_BUFFER_SIZE; + DMA1->regs->IFCR = 0xF0000; + SBI32(channel_regs->CCR, 0); +} - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the UART CR3 register */ - SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); +static void dma_ch5_irq_handle() { + uint8 status_bits = dma_get_isr_bits(DMA1, DMA_CH5); + dma_clear_isr_bits(DMA1, DMA_CH5); + if (status_bits & 0x8) { + // DMA transmit Error + } + else if (status_bits & 0x2) { + // DMA transmit complete + if (esp_state == TRANSFER_IDLE) + esp_state = TRANSFERING; + + if (storeRcvData(WIFISERIAL.usart_device->rb->buf, UART_RX_BUFFER_SIZE)) { + esp_dma_pre(); + if (wifiTransError.flag != 0x1) + WIFI_IO1_RESET(); + } + else { + WIFI_IO1_SET(); + esp_state = TRANSFER_STORE; + } + } + else if (status_bits & 0x4) { + // DMA transmit half + WIFI_IO1_SET(); + } +} +static void wifi_usart_dma_init() { + dma_init(DMA1); + uint32_t flags = ( DMA_MINC_MODE | DMA_TRNS_CMPLT | DMA_HALF_TRNS | DMA_TRNS_ERR); + dma_xfer_size dma_bit_size = DMA_SIZE_8BITS; + dma_setup_transfer(DMA1, DMA_CH5, &USART1_BASE->DR, dma_bit_size, + (volatile void*)WIFISERIAL.usart_device->rb->buf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_priority(DMA1, DMA_CH5, DMA_PRIORITY_LOW); + dma_attach_interrupt(DMA1, DMA_CH5, &dma_ch5_irq_handle); + + dma_clear_isr_bits(DMA1, DMA_CH5); + dma_set_num_transfers(DMA1, DMA_CH5, UART_RX_BUFFER_SIZE); + + bb_peri_set_bit(&USART1_BASE->CR3, USART_CR3_DMAR_BIT, 1); + dma_enable(DMA1, DMA_CH5); // enable transmit - #endif for (uint8_t i = 0; i < TRANS_RCV_FIFO_BLOCK_NUM; i++) { wifiDmaRcvFifo.bufferAddr[i] = &bmp_public_buf[1024 * i]; wifiDmaRcvFifo.state[i] = udisk_buf_empty; @@ -193,113 +278,39 @@ static void dma_init() { wifiDmaRcvFifo.write_cur = 0; } -static void wifi_deInit() { - #if 0 - HAL_DMA_Abort((DMA_HandleTypeDef *)&hdma_usart1_rx); - HAL_DMA_DeInit((DMA_HandleTypeDef *)&hdma_usart1_rx); - __HAL_DMA_DISABLE((DMA_HandleTypeDef *)&hdma_usart1_rx); - #endif -} - -extern uint8_t mksUsart1Rx; - void esp_port_begin(uint8_t interrupt) { WifiRxFifo.uart_read_point = 0; WifiRxFifo.uart_write_point = 0; - #if 0 - NVIC_InitTypeDef NVIC_InitStructure; - USART_InitTypeDef USART_InitStructure; - GPIO_InitTypeDef GPIO_InitStruct; + #if 1 - WifiRxFifo.uart_read_point = 0; - WifiRxFifo.uart_write_point = 0; - memset((uint8_t*)WifiRxFifo.uartTxBuffer, 0, sizeof(WifiRxFifo.uartTxBuffer)); - - if (interrupt) { - #if TAN - wifi_deInit (); - - //SZ_STM32_COMInit(COM1, 115200); - __HAL_UART_ENABLE_IT(USART1, USART_IT_RXNE); - - USART_InitStructure.USART_BaudRate = 115200; //���ڵIJ����ʣ�����115200 ��ߴ�4.5Mbits/s - USART_InitStructure.USART_WordLength = USART_WordLength_8b; //�����ֳ���(8�9λ) - USART_InitStructure.USART_StopBits = USART_StopBits_1; //�����õ�ֹͣλ-֧��1��2��ֹͣλ - USART_InitStructure.USART_Parity = USART_Parity_No; //����żУ�� - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //��Ӳ�������� - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //˫��ģʽ��ʹ�ܷ��ͺͽ��� - - __HAL_RCC_USART1_CLK_ENABLE(); - - GPIO_InitStruct.Pin = TFT_WIFI_TX_Pin|TFT_WIFI_RX_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF7_USART1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pin = TFT_WIFI_RX_Pin; - HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); - - USART_Init(USART1, &USART_InitStructure); - - NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; - // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - - NVIC_Init(&NVIC_InitStructure); - #else - HAL_UART_DeInit(&huart1); - MX_USART1_UART_Init(3); - //__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); - HAL_UART_Receive_IT(&huart1,&mksUsart1Rx,1); + #if ENABLED(MKS_WIFI_MODULE) + WIFISERIAL.end(); + if (interrupt) { + for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } + WIFISERIAL.begin(WIFI_BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + } + else { + WIFISERIAL.usart_device->regs->CR1 &= ~USART_CR1_RXNEIE; + WIFISERIAL.begin(WIFI_UPLOAD_BAUDRATE); + wifi_usart_dma_init(); + } #endif - } - else{ - #if 0 - NVIC_DisableIRQ(SZ_STM32_COM1_IRQn); - USART_Cmd(SZ_STM32_COM1, DISABLE); + #else - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); - - SZ_STM32_COMInit(COM1, 1958400); - - USART_Cmd(SZ_STM32_COM1, ENABLE); - - wifi_delay(10); - - dma_init(); + #if MKS_WIFI_MODULE + WIFISERIAL.end(); + for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } + WIFISERIAL.begin(interrupt ? WIFI_BAUDRATE : WIFI_UPLOAD_BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif - HAL_UART_DeInit(&huart1); - MX_USART1_UART_Init(5); - //dma1_5_IRQ_sel = 1; - dma_init(); - } + if (!interrupt) wifi_usart_dma_init(); + #endif - - #if ENABLED(MKS_WIFI_MODULE) - WIFISERIAL.end(); - for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } - WIFISERIAL.begin(interrupt ? WIFI_BAUDRATE : WIFI_UPLOAD_BAUDRATE); - - const millis_t serial_connect_timeout = millis() + 1000UL; - while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - - if (interrupt) { - //for (uint8_t i=0;i<100;i++) WIFISERIAL.write(0x33); - } - else { - //for (uint16_t i=0;i<65535;i++); //WIFISERIAL.write(0x33); - } - #endif - - if (!interrupt) dma_init(); } #if ENABLED(MKS_WIFI_MODULE) @@ -441,10 +452,12 @@ int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len) { ZERO(buf_to_wifi); index_to_wifi = 0; } + return 1; } -int send_to_wifi(char *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } +#define SEND_OK_TO_WIFI send_to_wifi((uint8_t *)"ok\r\n", strlen("ok\r\n")) +int send_to_wifi(uint8_t *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } void set_cur_file_sys(int fileType) { gCfgItems.fileSysType = fileType; } @@ -463,9 +476,9 @@ void get_file_list(char *path) { char wait_ip_back_flag = 0; typedef struct { - char write_buf[513]; int write_index; uint8_t saveFileName[30]; + uint8_t fileTransfer; uint32_t fileLen; uint32_t tick_begin; uint32_t tick_end; @@ -475,22 +488,43 @@ FILE_WRITER file_writer; int32_t lastFragment = 0; -char lastBinaryCmd[50] = { 0 }; +char saveFilePath[50]; -int total_write = 0; -char binary_head[2] = { 0, 0 }; -unsigned char binary_data_len = 0; +static SdFile upload_file, *upload_curDir; +static filepos_t pos; int write_to_file(char *buf, int len) { - for (int i = 0; i < len; i++) { - file_writer.write_buf[file_writer.write_index++] = buf[i]; + int i; + int res = 0; + + for (i = 0; i < len; i++) { + public_buf[file_writer.write_index++] = buf[i]; if (file_writer.write_index >= 512) { - int res = card.write(file_writer.write_buf, file_writer.write_index); - if (res == -1) return -1; - ZERO(file_writer.write_buf); + res = upload_file.write(public_buf, file_writer.write_index); + + if (res == -1) { + upload_file.close(); + const char * const fname = card.diveToFile(true, upload_curDir, saveFilePath); + + if (upload_file.open(upload_curDir, fname, O_WRITE)) { + upload_file.setpos(&pos); + res = upload_file.write(public_buf, file_writer.write_index); + } + } + if (res == -1) { + return -1; + } + upload_file.getpos(&pos); file_writer.write_index = 0; } } + + if (res == -1) { + memset(public_buf, 0, sizeof(public_buf)); + file_writer.write_index = 0; + return -1; + } + return 0; } @@ -543,10 +577,8 @@ uint8_t Explore_Disk(char* path , uint8_t recu_level) { for (uint8_t i = 0; i < fileCnt; i++) { card.getfilename_sorted(SD_ORDER(i, fileCnt)); - //if (card.longFilename[0] == 0) - strcpy(tmp, card.filename); - //else - // strcpy(tmp, card.longFilename); + memset(tmp, 0, sizeof(tmp)); + strcpy(tmp, card.filename); ZERO(Fstream); strcpy(Fstream, tmp); @@ -584,6 +616,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { switch (cmd_value) { case 20: // M20: Print SD / µdisk file + file_writer.fileTransfer = 0; if (uiCfg.print_state == IDLE) { int index = 0; @@ -591,8 +624,8 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { gCfgItems.fileSysType = FILE_SYS_SD; send_to_wifi((uint8_t *)"Begin file list\r\n", strlen("Begin file list\r\n")); get_file_list((char *)"0:/"); - send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + send_to_wifi((uint8_t *)"End file list\r\n", strlen("End file list\r\n")); + SEND_OK_TO_WIFI; break; } @@ -613,14 +646,14 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { get_file_list(path); send_to_wifi((uint8_t *)"End file list\r\n", strlen("End file list\r\n")); } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; } } break; case 21: /*init sd card*/ - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; break; case 23: @@ -632,15 +665,40 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { if (strlen((char *)&tmpStr[index]) < 80) { ZERO(list_file.file_name[sel_id]); + ZERO(list_file.long_name[sel_id]); + uint8_t has_path_selected = 0; if (gCfgItems.wifi_type == ESP_WIFI) { - if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) + if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { gCfgItems.fileSysType = FILE_SYS_SD; - else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) + has_path_selected = 1; + } + else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { gCfgItems.fileSysType = FILE_SYS_USB; + has_path_selected = 1; + } else if (tmpStr[index] != '/') - strcat((char *)list_file.file_name[0], "/"); - strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); + strcat((char *)list_file.file_name[sel_id], "/"); + + if (file_writer.fileTransfer == 1) { + uint8_t dosName[FILENAME_LENGTH]; + uint8_t fileName[sizeof(list_file.file_name[sel_id])]; + fileName[0] = '\0'; + if (has_path_selected == 1) { + strcat((char *)fileName, (char *)&tmpStr[index + 3]); + strcat((char *)list_file.file_name[sel_id], "/"); + } + else strcat((char *)fileName, (char *)&tmpStr[index]); + if (!longName2DosName((const char *)fileName, dosName)) { + strcpy(list_file.file_name[sel_id], "notValid"); + } + strcat((char *)list_file.file_name[sel_id], (char *)dosName); + strcat((char *)list_file.long_name[sel_id], (char *)dosName); + } + else { + strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); + strcat((char *)list_file.long_name[sel_id], (char *)&tmpStr[index]); + } } else @@ -656,7 +714,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { send_to_wifi((uint8_t *)"file.open failed\r\n", strlen("file.open failed\r\n")); strcpy(list_file.file_name[sel_id], "notValid"); } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; } } } @@ -680,6 +738,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { SdFile file; SdFile *curDir; + card.endFilePrint(); const char * const fname = card.diveToFile(true, curDir, cur_name); if (!fname) return; if (file.open(curDir, fname, O_READ)) { @@ -726,7 +785,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { lv_draw_printing(); } } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; break; case 25: @@ -745,7 +804,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { else default_preview_flg = true; lv_draw_printing(); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; } break; @@ -762,7 +821,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { lv_draw_ready_print(); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; } break; @@ -805,8 +864,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ZERO(tempBuf); sprintf((char *)tempBuf, "Writing to file: %s\r\n", (char *)file_writer.saveFileName); wifi_ret_ack(); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - total_write = 0; + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); wifi_link_state = WIFI_WAIT_TRANS_START; } else { @@ -822,7 +880,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { case 991: ZERO(tempBuf); if (cmd_value == 105) { - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; sprintf((char *)tempBuf,"T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n", (float)thermalManager.temp_hotend[0].celsius, (float)thermalManager.temp_hotend[0].target, @@ -891,7 +949,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } else if (uiCfg.print_state == PAUSED) { wifi_ret_ack(); - send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); + send_to_wifi((uint8_t *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); } else if (uiCfg.print_state == REPRINTING) { wifi_ret_ack(); @@ -913,8 +971,8 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { case 115: ZERO(tempBuf); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - send_to_wifi((char *)"FIRMWARE_NAME:Robin_nano\r\n", strlen("FIRMWARE_NAME:Robin_nano\r\n")); + SEND_OK_TO_WIFI; + send_to_wifi((uint8_t *)"FIRMWARE_NAME:Robin_nano\r\n", strlen("FIRMWARE_NAME:Robin_nano\r\n")); break; default: @@ -935,7 +993,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { index++; } if (left - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; else need_ok_later = true; } @@ -961,7 +1019,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { index++; } if (left_g - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; else need_ok_later = true; } @@ -1191,29 +1249,6 @@ void utf8_2_unicode(uint8_t *source,uint8_t Len) { COPY(source, FileName_unicode); } -char saveFilePath[50]; - -static bool longName2DosName(const char* longName, uint8_t* dosName) { - uint8_t i = 11; - while (i--) dosName[i] = '\0'; - while (*longName) { - uint8_t c = *longName++; - if (c == '.') { // For a dot... - if (i == 0) return false; - else { strcat((char *)dosName,".GCO"); return dosName[0] != '\0'; } - } - else { - // Fail for illegal characters - PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); - while (uint8_t b = pgm_read_byte(p++)) if (b == c) return false; - if (c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters - dosName[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name - } - if (i >= 5) strcat((char *)dosName,"~1.GCO"); - } - return dosName[0] != '\0'; // Return true if any name was set -} - static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { uint8_t fileNameLen = *msg; @@ -1226,7 +1261,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { utf8_2_unicode(file_writer.saveFileName,fileNameLen); - ZERO(file_writer.write_buf); + ZERO(public_buf); if (strlen((const char *)file_writer.saveFileName) > sizeof(saveFilePath)) return; @@ -1234,11 +1269,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { ZERO(saveFilePath); if (gCfgItems.fileSysType == FILE_SYS_SD) { - //sprintf((char *)saveFilePath, "/%s", file_writer.saveFileName); - card.mount(); - - //ZERO(list_file.long_name[sel_id]); - //memcpy(list_file.long_name[sel_id],file_writer.saveFileName,sizeof(list_file.long_name[sel_id])); + TERN_(SDSUPPORT, card.mount()); } else if (gCfgItems.fileSysType == FILE_SYS_USB) { @@ -1266,26 +1297,19 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); return; } - sprintf((char *)saveFilePath, "/%s", dosName); + sprintf((char *)saveFilePath, "%s", dosName); - ZERO(list_file.long_name[sel_id]); - memcpy(list_file.long_name[sel_id], dosName, sizeof(dosName)); + card.cdroot(); + upload_file.close(); + const char * const fname = card.diveToFile(true, upload_curDir, saveFilePath); - char *cur_name=strrchr((const char *)saveFilePath,'/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { - gCfgItems.curFilesize = file.fileSize(); - } - else { + if (!upload_file.open(upload_curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { clear_cur_ui(); upload_result = 2; + wifiTransError.flag = 1; wifiTransError.start_tick = getWifiTick(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); return; } @@ -1302,22 +1326,23 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { lv_task_handler(); file_writer.tick_begin = getWifiTick(); + + file_writer.fileTransfer = 1; } -#define FRAG_MASK _BV32(31) +#define FRAG_MASK ~_BV32(31) static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { uint32_t frag = *((uint32_t *)msg); - if ((frag & FRAG_MASK) != (uint32_t)(lastFragment + 1)) { - ZERO(file_writer.write_buf); + ZERO(public_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; } else { if (write_to_file((char *)msg + 4, msgLen - 4) < 0) { - ZERO(file_writer.write_buf); + ZERO(public_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; @@ -1325,16 +1350,31 @@ static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { } lastFragment = frag; - if ((frag & (~FRAG_MASK))) { - int res = card.write(file_writer.write_buf, file_writer.write_index); + if ((frag & (~FRAG_MASK)) != 0) { + int res = upload_file.write(public_buf, file_writer.write_index); if (res == -1) { - ZERO(file_writer.write_buf); + upload_file.close(); + const char * const fname = card.diveToFile(true, upload_curDir, saveFilePath); + if (upload_file.open(upload_curDir, fname, O_WRITE)) { + upload_file.setpos(&pos); + res = upload_file.write(public_buf, file_writer.write_index); + } + } + upload_file.close(); + SdFile file, *curDir; + const char * const fname = card.diveToFile(true, curDir, saveFilePath); + if (file.open(curDir, fname, O_RDWR)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + } + else { + ZERO(public_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; return; } - ZERO(file_writer.write_buf); + ZERO(public_buf); file_writer.write_index = 0; file_writer.tick_end = getWifiTick(); upload_time = getWifiTickDiff(file_writer.tick_begin, file_writer.tick_end) / 1000; @@ -1342,7 +1382,6 @@ static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { wifi_link_state = WIFI_CONNECTED; upload_result = 3; } - } } @@ -1453,7 +1492,6 @@ void esp_data_parser(char *cmdRxBuf, int len) { esp_msg_index = 0; return; } - if ((charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) != -1) && (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL) != -1)) loop_again = true; } @@ -1461,19 +1499,6 @@ void esp_data_parser(char *cmdRxBuf, int len) { } int32_t tick_net_time1, tick_net_time2; - -int storeRcvData(int32_t len) { - unsigned char tmpW = wifiDmaRcvFifo.write_cur; - if (len <= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpW] == udisk_buf_empty) { - for (uint16_t i = 0; i < len; i++) - wifiDmaRcvFifo.bufferAddr[tmpW][i] = WIFISERIAL.read(); - wifiDmaRcvFifo.state[tmpW] = udisk_buf_full; - wifiDmaRcvFifo.write_cur = (tmpW + 1) % TRANS_RCV_FIFO_BLOCK_NUM; - return 1; - } - return 0; -} - int32_t readWifiFifo(uint8_t *retBuf, uint32_t bufLen) { unsigned char tmpR = wifiDmaRcvFifo.read_cur; if (bufLen >= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpR] == udisk_buf_full) { @@ -1496,20 +1521,33 @@ void stopEspTransfer() { wifiTransError.start_tick = getWifiTick(); card.removeFile((const char *)saveFilePath); } - else { - } + wifi_delay(200); WIFI_IO1_SET(); - //exchangeFlashMode(1); //change spi flash to use dma mode + + // disable dma + dma_clear_isr_bits(DMA1, DMA_CH5); + bb_peri_set_bit(&USART1_BASE->CR3, USART_CR3_DMAR_BIT, 0); + dma_disable(DMA1, DMA_CH5); + + wifi_delay(200); + changeFlashMode(true); // Set SPI flash to use DMA mode esp_port_begin(1); + wifi_delay(200); + + W25QXX.init(SPI_QUARTER_SPEED); + + TERN_(HAS_TFT_LVGL_UI_SPI, SPI_TFT.spi_init(SPI_FULL_SPEED)); + TERN_(HAS_SERVOS, servo_init()); + TERN_(HAS_Z_SERVO_PROBE, probe.servo_probe_init()); + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); } void wifi_rcv_handle() { int32_t len = 0; - uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = { 0 }; + uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = {0}; int8_t getDataF = 0; - if (wifi_link_state == WIFI_TRANS_FILE) { #if 0 if (WIFISERIAL.available() == UART_RX_BUFFER_SIZE) { @@ -1531,9 +1569,9 @@ void wifi_rcv_handle() { getDataF = 1; } if (esp_state == TRANSFER_STORE) { - if (storeRcvData(UART_RX_BUFFER_SIZE)) { + if (storeRcvData(WIFISERIAL.usart_device->rb->buf, UART_RX_BUFFER_SIZE)) { esp_state = TRANSFERING; - //esp_dma_pre(); + esp_dma_pre(); if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); } else @@ -1541,13 +1579,11 @@ void wifi_rcv_handle() { } } else { - //len = readUsartFifo((SZ_USART_FIFO *)&WifiRxFifo, (int8_t *)ucStr, UART_RX_BUFFER_SIZE); len = readWifiBuf((int8_t *)ucStr, UART_RX_BUFFER_SIZE); if (len > 0) { esp_data_parser((char *)ucStr, len); - if (wifi_link_state == WIFI_TRANS_FILE) { - //exchangeFlashMode(0); //change spi flash not use dma mode + changeFlashMode(false); // Set SPI flash to use non-DMA mode wifi_delay(10); esp_port_begin(0); wifi_delay(10); @@ -1558,7 +1594,7 @@ void wifi_rcv_handle() { } if (need_ok_later && (queue.length < BUFSIZE)) { need_ok_later = false; - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + send_to_wifi((uint8_t *)"ok\r\n", strlen("ok\r\n")); } } @@ -1569,7 +1605,7 @@ void wifi_rcv_handle() { tick_net_time2 = getWifiTick(); if (wifi_link_state == WIFI_TRANS_FILE) { - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 4500)) { + if (tick_net_time1 && getWifiTickDiff(tick_net_time1, tick_net_time2) > 8000) { wifi_link_state = WIFI_CONNECTED; upload_result = 2; clear_cur_ui(); @@ -1577,11 +1613,10 @@ void wifi_rcv_handle() { lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); } } - - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 10000)) + if (tick_net_time1 && getWifiTickDiff(tick_net_time1, tick_net_time2) > 10000) wifi_link_state = WIFI_NOT_CONFIG; - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 120000)) { + if (tick_net_time1 && getWifiTickDiff(tick_net_time1, tick_net_time2) > 120000) { wifi_link_state = WIFI_NOT_CONFIG; wifi_reset(); tick_net_time1 = getWifiTick(); @@ -1598,7 +1633,10 @@ void wifi_rcv_handle() { } void wifi_looping() { - do { wifi_rcv_handle(); } while (wifi_link_state == WIFI_TRANS_FILE); + do { + wifi_rcv_handle(); + watchdog_refresh(); + } while (wifi_link_state == WIFI_TRANS_FILE); } void mks_esp_wifi_init() { @@ -1616,32 +1654,8 @@ void mks_esp_wifi_init() { wifi_reset(); #if 0 - res = f_open(&esp_upload.uploadFile, ESP_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); - - if (res == FR_OK) { - f_close(&esp_upload.uploadFile); - - wifi_delay(2000); - - if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { - return; - } - - clear_cur_ui(); - - draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); - - if (wifi_upload(0) >= 0) { - - f_unlink("1:/MKS_WIFI_CUR"); - f_rename(ESP_FIRMWARE_FILE,"/MKS_WIFI_CUR"); - } - draw_return_ui(); - - update_flag = 1; - } - if (update_flag == 0) { - res = f_open(&esp_upload.uploadFile, ESP_WEB_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); + if (update_flag == 0) { + res = f_open(&esp_upload.uploadFile, ESP_WEB_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); if (res == FR_OK) { f_close(&esp_upload.uploadFile); @@ -1694,32 +1708,42 @@ void mks_esp_wifi_init() { wifi_link_state = WIFI_NOT_CONFIG; } -#define BUF_INC_POINTER(p) ((p + 1 == UART_FIFO_BUFFER_SIZE) ? 0 : (p + 1)) + +void mks_wifi_firmware_update() { + card.openFileRead((char *)ESP_FIRMWARE_FILE); + + if (card.isFileOpen()) { + card.closefile(); + + wifi_delay(2000); + + if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) + return; + + clear_cur_ui(); + + lv_draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); + + lv_task_handler(); + watchdog_refresh(); + + if (wifi_upload(0) >= 0) { + card.removeFile((char *)ESP_FIRMWARE_FILE_RENAME); + SdFile file, *curDir; + const char * const fname = card.diveToFile(true, curDir, ESP_FIRMWARE_FILE); + if (file.open(curDir, fname, O_READ)) { + file.rename(curDir, (char *)ESP_FIRMWARE_FILE_RENAME); + file.close(); + } + } + clear_cur_ui(); + } +} + +#define BUF_INC_POINTER(p) ((p + 1 == UART_FIFO_BUFFER_SIZE) ? 0:(p + 1)) int usartFifoAvailable(SZ_USART_FIFO *fifo) { - int diff = fifo->uart_write_point - fifo->uart_read_point; - if (diff < 0) diff += UART_FIFO_BUFFER_SIZE; - return diff; -} - -int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { - int i = 0 ; - while (i < len && fifo->uart_read_point != fifo->uart_write_point) { - buf[i++] = fifo->uartTxBuffer[fifo->uart_read_point]; - fifo->uart_read_point = BUF_INC_POINTER(fifo->uart_read_point); - } - return i; -} - -int writeUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { - if (buf == 0 || len <= 0) return -1; - - int i = 0 ; - while (i < len && fifo->uart_read_point != BUF_INC_POINTER(fifo->uart_write_point)) { - fifo->uartTxBuffer[fifo->uart_write_point] = buf[i++]; - fifo->uart_write_point = BUF_INC_POINTER(fifo->uart_write_point); - } - return i; + return WIFISERIAL.available(); } void get_wifi_commands() { @@ -1791,10 +1815,9 @@ void get_wifi_commands() { if (!wifi_comment_mode) wifi_line_buffer[wifi_read_count++] = wifi_char; } } - }// queue has space, serial has data - else { + } // queue has space, serial has data + else espGcodeFifo.wait_tick++; - } } int readWifiBuf(int8_t *buf, int32_t len) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h index 30da25bbe0..07ae6f72db 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -34,11 +34,6 @@ #define UART_RX_BUFFER_SIZE 1024 #define UART_FIFO_BUFFER_SIZE 1024 -#define ESP_WIFI 0x02 - -#define AP_MODEL 0x01 -#define STA_MODEL 0x02 - #define WIFI_DECODE_TYPE 1 #define IP_DHCP_FLAG 1 @@ -66,7 +61,7 @@ typedef enum{ udisk_buf_full, } UDISK_DATA_BUFFER_STATE; -#define TRANS_RCV_FIFO_BLOCK_NUM 8 +#define TRANS_RCV_FIFO_BLOCK_NUM 14 typedef struct { unsigned char *bufferAddr[TRANS_RCV_FIFO_BLOCK_NUM]; @@ -164,7 +159,7 @@ typedef enum { typedef struct { uint32_t uart_read_point; uint32_t uart_write_point; - uint8_t uartTxBuffer[UART_FIFO_BUFFER_SIZE]; + //uint8_t uartTxBuffer[UART_FIFO_BUFFER_SIZE]; } SZ_USART_FIFO; #define WIFI_GCODE_BUFFER_LEAST_SIZE 96 @@ -195,7 +190,7 @@ extern int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len); extern void get_wifi_list_command_send(); extern void get_wifi_commands(); extern int readWifiBuf(int8_t *buf, int32_t len); -extern int storeRcvData(int32_t len); +extern void mks_wifi_firmware_update(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 8b3c4edfcd..2776db3cac 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -28,6 +28,7 @@ #include "wifi_upload.h" #include "../../../../MarlinCore.h" +#include "../../../../sd/cardreader.h" #define WIFI_SET() WRITE(WIFI_RESET_PIN, HIGH); #define WIFI_RESET() WRITE(WIFI_RESET_PIN, LOW); @@ -85,6 +86,7 @@ static const uint32_t defaultTimeout = 500; static const uint32_t eraseTimeout = 15000; static const uint32_t blockWriteTimeout = 200; static const uint32_t blockWriteInterval = 15; // 15ms is long enough, 10ms is mostly too short +static SdFile update_file, *update_curDir; // Messages corresponding to result codes, should make sense when followed by " error" const char *resultMessages[] = { @@ -113,23 +115,15 @@ signed char IsReady() { return esp_upload.state == upload_idle; } -void uploadPort_write(const uint8_t *buf, size_t len) { - #if 0 - int i; - - for (i = 0; i < len; i++) { - while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { /* nada */ } - USART_SendData(USART1, *(buf + i)); - } - #endif +void uploadPort_write(const uint8_t *buf, const size_t len) { + for (size_t i = 0; i < len; i++) + WIFISERIAL.write(*(buf + i)); } char uploadPort_read() { uint8_t retChar; - if (readUsartFifo(&WifiRxFifo, (int8_t *)&retChar, 1) == 1) - return retChar; - else - return 0; + retChar = WIFISERIAL.read(); + return _MAX(retChar, 0); } int uploadPort_available() { @@ -156,25 +150,21 @@ void flushInput() { // Extract 1-4 bytes of a value in little-endian order from a buffer beginning at a specified offset uint32_t getData(unsigned byteCnt, const uint8_t *buf, int ofst) { uint32_t val = 0; - if (buf && byteCnt) { unsigned int shiftCnt = 0; - if (byteCnt > 4) - byteCnt = 4; - do{ + NOMORE(byteCnt, 4); + do { val |= (uint32_t)buf[ofst++] << shiftCnt; shiftCnt += 8; } while (--byteCnt); } - return(val); + return val; } // Put 1-4 bytes of a value in little-endian order into a buffer beginning at a specified offset. void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { if (buf && byteCnt) { - if (byteCnt > 4) { - byteCnt = 4; - } + NOMORE(byteCnt, 4); do { buf[ofst++] = (uint8_t)(val & 0xFF); val >>= 8; @@ -191,44 +181,25 @@ void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { // -2 - a SLIP escape byte was found but the following byte wasn't available // -3 - a SLIP escape byte was followed by an invalid byte int ReadByte(uint8_t *data, signed char slipDecode) { - if (uploadPort_available() == 0) { - return(0); - } + if (uploadPort_available() == 0) return 0; - // at least one byte is available + // At least one byte is available *data = uploadPort_read(); - if (!slipDecode) { - return(1); - } - if (*data == 0xC0) { - // this shouldn't happen - return(-1); - } + if (!slipDecode) return 1; - // if not the SLIP escape, we're done - if (*data != 0xDB) { - return(1); - } + if (*data == 0xC0) return -1; // This shouldn't happen + if (*data != 0xDB) return 1; // If not the SLIP escape, we're done // SLIP escape, check availability of subsequent byte - if (uploadPort_available() == 0) { - return(-2); - } + if (uploadPort_available() == 0) return -2; // process the escaped byte *data = uploadPort_read(); - if (*data == 0xDC) { - *data = 0xC0; - return(2); - } + if (*data == 0xDC) { *data = 0xC0; return 2; } + if (*data == 0xDD) { *data = 0xDB; return 2; } - if (*data == 0xDD) { - *data = 0xDB; - return(2); - } - // invalid - return(-3); + return -3; // invalid } // When we write a sync packet, there must be no gaps between most of the characters. // So use this function, which does a block write to the UART buffer in the latest CoreNG. @@ -242,7 +213,7 @@ void WriteByteRaw(uint8_t b) { } // Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. -void WriteByteSlip(uint8_t b) { +void WriteByteSlip(const uint8_t b) { if (b == 0xC0) { WriteByteRaw(0xDB); WriteByteRaw(0xDC); @@ -251,9 +222,8 @@ void WriteByteSlip(uint8_t b) { WriteByteRaw(0xDB); WriteByteRaw(0xDD); } - else { + else uploadPort_write((const uint8_t *)&b, 1); - } } // Wait for a data packet to be returned. If the body of the packet is @@ -295,10 +265,10 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t EspUploadResult stat; //IWDG_ReloadCounter(); + watchdog_refresh(); - if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) { - return(timeout); - } + if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) + return timeout; if (uploadPort_available() < needBytes) { // insufficient data available @@ -310,9 +280,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t switch (state) { case begin: // expecting frame start c = uploadPort_read(); - if (c != (uint8_t)0xC0) { - break; - } + if (c == (uint8_t)0xC0) break; state = header; needBytes = 2; break; @@ -323,50 +291,45 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t break; case header: // reading an 8-byte header - case body: // reading the response body - { - int rslt; - // retrieve a byte with SLIP decoding - rslt = ReadByte(&c, 1); - if (rslt != 1 && rslt != 2) { - // some error occurred - stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; - return stat; - } - else if (state == header) { - //store the header byte - hdr[hdrIdx++] = c; - if (hdrIdx >= headerLength) { - // get the body length, prepare a buffer for it - *bodyLen = (uint16_t)getData(2, hdr, 2); + case body: { // reading the response body + int rslt; + // retrieve a byte with SLIP decoding + rslt = ReadByte(&c, 1); + if (rslt != 1 && rslt != 2) { + // some error occurred + stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; + return stat; + } + else if (state == header) { + //store the header byte + hdr[hdrIdx++] = c; + if (hdrIdx >= headerLength) { + // get the body length, prepare a buffer for it + *bodyLen = (uint16_t)getData(2, hdr, 2); - // extract the value, if requested - if (valp != 0) { - *valp = getData(4, hdr, 4); - } + // extract the value, if requested + if (valp) + *valp = getData(4, hdr, 4); - if (*bodyLen != 0) { - state = body; - } - else { - needBytes = 1; - state = end; - } - } - } - else { - // Store the response body byte, check for completion - if (bodyIdx < ARRAY_SIZE(respBuf)) { - respBuf[bodyIdx] = c; - } - ++bodyIdx; - if (bodyIdx >= *bodyLen) { + if (*bodyLen != 0) + state = body; + else { needBytes = 1; state = end; } } } - break; + else { + // Store the response body byte, check for completion + if (bodyIdx < ARRAY_SIZE(respBuf)) + respBuf[bodyIdx] = c; + + if (++bodyIdx >= *bodyLen) { + needBytes = 1; + state = end; + } + } + } break; default: return slipState; // this shouldn't happen } @@ -376,9 +339,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t resp = (uint8_t)getData(1, hdr, 0); opRet = (uint8_t)getData(1, hdr, 1); // Sync packets often provoke a response with a zero opcode instead of ESP_SYNC - if (resp != 0x01 || opRet != op) { - return respHeader; - } + if (resp != 0x01 || opRet != op) return respHeader; return success; } @@ -483,6 +444,7 @@ EspUploadResult Sync(uint16_t timeout) { for (;;) { size_t bodyLen; EspUploadResult rc = readPacket(ESP_SYNC, 0, &bodyLen, defaultTimeout); + watchdog_refresh(); if (rc != success || bodyLen != 2) break; } } @@ -527,7 +489,6 @@ uint16_t checksum(const uint8_t *data, uint16_t dataLen, uint16_t cksum) { } EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { - #if 0 const uint32_t blkSize = EspFlashBlockSize; int i; @@ -548,15 +509,14 @@ EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { putData(0, 4, blkBuf, hdrOfst + 12); // Get the data for the block - f_read(&esp_upload.uploadFile, blkBuf + dataOfst, blkSize, &cnt );//->Read(reinterpret_cast(blkBuf + dataOfst), blkSize); + cnt = update_file.read(blkBuf + dataOfst, blkSize); //->Read(reinterpret_cast(blkBuf + dataOfst), blkSize); if (cnt != blkSize) { - if (f_tell(&esp_upload.uploadFile) == esp_upload.fileSize) { + if (update_file.curPosition() == esp_upload.fileSize) { // partial last block, fill the remainder memset(blkBuf + dataOfst + cnt, 0xFF, blkSize - cnt); } - else { + else return fileRead; - } } // Patch the flash parameters into the first block if it is loaded at address 0 @@ -573,212 +533,132 @@ EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { if ((stat = doCommand(ESP_FLASH_DATA, blkBuf, blkBufSize, cksum, 0, blockWriteTimeout)) == success) break; return stat; - #else - return success; - #endif } void upload_spin() { - #if 0 + switch (esp_upload.state) { - case resetting: - - if (esp_upload.connectAttemptNumber == 9) { - // Time to give up - //Network::ResetWiFi(); - esp_upload.uploadResult = connected; - esp_upload.state = done; - } - else { - - // Reset the serial port at the new baud rate. Also reset the ESP8266. - // const uint32_t baud = uploadBaudRates[esp_upload.connectAttemptNumber/esp_upload.retriesPerBaudRate]; - if (esp_upload.connectAttemptNumber % esp_upload.retriesPerBaudRate == 0) { - } - //uploadPort.begin(baud); - //uploadPort_close(); - - uploadPort_begin(); - - wifi_delay(2000); - - flushInput(); - - esp_upload.lastAttemptTime = esp_upload.lastResetTime = getWifiTick(); - esp_upload.state = connecting; - } - - break; - - case connecting: - if ((getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= connectAttemptInterval) && (getWifiTickDiff(esp_upload.lastResetTime, getWifiTick()) >= 500)) { - // Attempt to establish a connection to the ESP8266. - EspUploadResult res = Sync(5000); - esp_upload.lastAttemptTime = getWifiTick(); - if (res == success) { - // Successful connection - //MessageF(" success on attempt %d\n", (connectAttemptNumber % retriesPerBaudRate) + 1); - //printf("connect success\n"); - esp_upload.state = erasing; - } - else { - // This attempt failed - esp_upload.connectAttemptNumber++; - if (esp_upload.connectAttemptNumber % retriesPerReset == 0) { - esp_upload.state = resetting; // try a reset and a lower baud rate - } - } - } - break; - - case erasing: - if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= blockWriteInterval) { - uint32_t eraseSize; - const uint32_t sectorsPerBlock = 16; - const uint32_t sectorSize = 4096; - const uint32_t numSectors = (esp_upload.fileSize + sectorSize - 1)/sectorSize; - const uint32_t startSector = esp_upload.uploadAddress/sectorSize; - - uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); - NOMORE(headSectors, numSectors); - - eraseSize = (numSectors < 2 * headSectors) - ? (numSectors + 1) / 2 * sectorSize - : (numSectors - headSectors) * sectorSize; - - //MessageF("Erasing %u bytes...\n", fileSize); - esp_upload.uploadResult = flashBegin(esp_upload.uploadAddress, eraseSize); - if (esp_upload.uploadResult == success) { - //MessageF("Uploading file...\n"); - esp_upload.uploadBlockNumber = 0; - esp_upload.uploadNextPercentToReport = percentToReportIncrement; - esp_upload.lastAttemptTime = getWifiTick(); - esp_upload.state = uploading; - } - else { - //MessageF("Erase failed\n"); + case resetting: + if (esp_upload.connectAttemptNumber == 9) { + esp_upload.uploadResult = connected; esp_upload.state = done; } - } - break; + else { + uploadPort_begin(); + wifi_delay(2000); + flushInput(); + esp_upload.lastAttemptTime = esp_upload.lastResetTime = getWifiTick(); + esp_upload.state = connecting; + } + break; - case uploading: - // The ESP needs several milliseconds to recover from one packet before it will accept another - if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= 15) { - unsigned int percentComplete; - const uint32_t blkCnt = (esp_upload.fileSize + EspFlashBlockSize - 1) / EspFlashBlockSize; - if (esp_upload.uploadBlockNumber < blkCnt) { - esp_upload.uploadResult = flashWriteBlock(0, 0); + case connecting: + if ((getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= connectAttemptInterval) && (getWifiTickDiff(esp_upload.lastResetTime, getWifiTick()) >= 500)) { + EspUploadResult res = Sync(5000); esp_upload.lastAttemptTime = getWifiTick(); - if (esp_upload.uploadResult != success) { - //MessageF("Flash block upload failed\n"); + if (res == success) + esp_upload.state = erasing; + else { + esp_upload.connectAttemptNumber++; + if (esp_upload.connectAttemptNumber % retriesPerReset == 0) + esp_upload.state = resetting; + } + } + break; + + case erasing: + if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= blockWriteInterval) { + uint32_t eraseSize; + const uint32_t sectorsPerBlock = 16; + const uint32_t sectorSize = 4096; + const uint32_t numSectors = (esp_upload.fileSize + sectorSize - 1)/sectorSize; + const uint32_t startSector = esp_upload.uploadAddress/sectorSize; + + uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); + NOMORE(headSectors, numSectors); + + eraseSize = (numSectors < 2 * headSectors) + ? (numSectors + 1) / 2 * sectorSize + : (numSectors - headSectors) * sectorSize; + + esp_upload.uploadResult = flashBegin(esp_upload.uploadAddress, eraseSize); + if (esp_upload.uploadResult == success) { + esp_upload.uploadBlockNumber = 0; + esp_upload.uploadNextPercentToReport = percentToReportIncrement; + esp_upload.lastAttemptTime = getWifiTick(); + esp_upload.state = uploading; + } + else esp_upload.state = done; - } - percentComplete = (100 * esp_upload.uploadBlockNumber)/blkCnt; - ++esp_upload.uploadBlockNumber; - if (percentComplete >= esp_upload.uploadNextPercentToReport) { - //MessageF("%u%% complete\n", percentComplete); - esp_upload.uploadNextPercentToReport += percentToReportIncrement; - } } - else { - esp_upload.state = done; + break; + + case uploading: + // The ESP needs several milliseconds to recover from one packet before it will accept another + if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= 15) { + unsigned int percentComplete; + const uint32_t blkCnt = (esp_upload.fileSize + EspFlashBlockSize - 1) / EspFlashBlockSize; + if (esp_upload.uploadBlockNumber < blkCnt) { + esp_upload.uploadResult = flashWriteBlock(0, 0); + esp_upload.lastAttemptTime = getWifiTick(); + if (esp_upload.uploadResult != success) + esp_upload.state = done; + percentComplete = (100 * esp_upload.uploadBlockNumber)/blkCnt; + ++esp_upload.uploadBlockNumber; + if (percentComplete >= esp_upload.uploadNextPercentToReport) + esp_upload.uploadNextPercentToReport += percentToReportIncrement; + } + else + esp_upload.state = done; } - } - break; + break; - case done: - f_close(&esp_upload.uploadFile); - //uploadPort.end(); - //uploadPort_close(); - - //WIFI_COM.begin(115200, true); - //wifi_init(); - - if (esp_upload.uploadResult == success) { - //printf("upload successfully\n"); - } - else { - //printf("upload failed\n"); - } - esp_upload.state = upload_idle;//idle; - break; + case done: + update_file.close(); + esp_upload.state = upload_idle; + break; default: break; } - #endif } // Try to upload the given file at the given address void SendUpdateFile(const char *file, uint32_t address) { - #if 0 - FRESULT res = f_open(&esp_upload.uploadFile, file, FA_OPEN_EXISTING | FA_READ); + const char * const fname = card.diveToFile(true, update_curDir, ESP_FIRMWARE_FILE); + if (!update_file.open(update_curDir, fname, O_READ)) return; - if (res != FR_OK) return; + esp_upload.fileSize = update_file.fileSize(); - esp_upload.fileSize = f_size(&esp_upload.uploadFile); if (esp_upload.fileSize == 0) { - f_close(&esp_upload.uploadFile); + update_file.close(); return; } - f_lseek(&esp_upload.uploadFile, 0); esp_upload.uploadAddress = address; esp_upload.connectAttemptNumber = 0; esp_upload.state = resetting; - #endif } static const uint32_t FirmwareAddress = 0x00000000, WebFilesAddress = 0x00100000; void ResetWiFiForUpload(int begin_or_end) { - #if 0 - uint32_t start, now; + //#if 0 + uint32_t start, now; - GPIO_InitTypeDef GPIO_InitStructure; + start = getWifiTick(); + now = start; - #if V1_0_V1_1 - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStructure.Pin = GPIO_Pin_8; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - #else - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = GPIO_Pin_13; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - #endif - start = getWifiTick(); - now = start; + if (begin_or_end == 0) { + SET_OUTPUT(WIFI_IO0_PIN); + WRITE(WIFI_IO0_PIN, LOW); + } + else + SET_INPUT_PULLUP(WIFI_IO0_PIN); - if (begin_or_end == 0) { - #if V1_0_V1_1 - HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_RESET); //update mode - #else - HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_RESET); //update mode - #endif - } - else { - #if V1_0_V1_1 - #if V1_0_V1_1 - HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_SET); //boot mode - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStructure.Pin = GPIO_Pin_8; - GPIO_InitStructure.Mode = GPIO_MODE_INPUT; - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - #endif - #else - HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_SET); //boot mode - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = GPIO_Pin_13; - GPIO_InitStructure.Mode = GPIO_MODE_INPUT; - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - #endif - } - WIFI_RESET(); - while (getWifiTickDiff(start, now) < 500) now = getWifiTick(); - WIFI_SET(); - #endif + WIFI_RESET(); + while (getWifiTickDiff(start, now) < 500) now = getWifiTick(); + WIFI_SET(); + //#endif } int32_t wifi_upload(int type) { @@ -797,7 +677,7 @@ int32_t wifi_upload(int type) { while (esp_upload.state != upload_idle) { upload_spin(); - //IWDG_ReloadCounter(); + watchdog_refresh(); } ResetWiFiForUpload(1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h index 246cc10bec..ff98173b95 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h @@ -25,9 +25,10 @@ extern "C" { /* C-declarations for C++ */ #endif -#define ESP_FIRMWARE_FILE "1:/MksWifi.bin" -#define ESP_WEB_FIRMWARE_FILE "1:/MksWifi_Web.bin" -#define ESP_WEB_FILE "1:/MksWifi_WebView.bin" +#define ESP_FIRMWARE_FILE "MksWifi.bin" +#define ESP_FIRMWARE_FILE_RENAME "MKSWIFI.CUR" +#define ESP_WEB_FIRMWARE_FILE "1:/MksWifi_Web.bin" +#define ESP_WEB_FILE "1:/MksWifi_WebView.bin" typedef enum { upload_idle, diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index ebf326f2e5..dc96758e6d 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -49,6 +49,8 @@ MarlinSPI W25QXXFlash::mySPI(SPI_FLASH_MOSI_PIN, SPI_FLASH_MISO_PIN, SPI_FLASH_S #define W25QXX_CS_H OUT_WRITE(SPI_FLASH_CS_PIN, HIGH) #define W25QXX_CS_L OUT_WRITE(SPI_FLASH_CS_PIN, LOW) +bool flash_dma_mode = true; + void W25QXXFlash::init(uint8_t spiRate) { OUT_WRITE(SPI_FLASH_CS_PIN, HIGH); @@ -144,11 +146,11 @@ uint16_t W25QXXFlash::W25QXX_ReadID(void) { } void W25QXXFlash::SPI_FLASH_WriteEnable(void) { - /* Select the FLASH: Chip Select low */ + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send "Write Enable" instruction */ + // Send "Write Enable" instruction spi_flash_Send(W25X_WriteEnable); - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; } @@ -164,54 +166,54 @@ void W25QXXFlash::SPI_FLASH_WriteEnable(void) { void W25QXXFlash::SPI_FLASH_WaitForWriteEnd(void) { uint8_t FLASH_Status = 0; - /* Select the FLASH: Chip Select low */ + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send "Read Status Register" instruction */ + // Send "Read Status Register" instruction spi_flash_Send(W25X_ReadStatusReg); - /* Loop as long as the memory is busy with a write cycle */ + // Loop as long as the memory is busy with a write cycle do /* Send a dummy byte to generate the clock needed by the FLASH and put the value of the status register in FLASH_Status variable */ FLASH_Status = spi_flash_Rec(); - while ((FLASH_Status & WIP_Flag) == 0x01); /* Write in progress */ + while ((FLASH_Status & WIP_Flag) == 0x01); // Write in progress - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; } void W25QXXFlash::SPI_FLASH_SectorErase(uint32_t SectorAddr) { - /* Send write enable instruction */ + // Send write enable instruction SPI_FLASH_WriteEnable(); - /* Sector Erase */ - /* Select the FLASH: Chip Select low */ + // Sector Erase + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send Sector Erase instruction */ + // Send Sector Erase instruction spi_flash_Send(W25X_SectorErase); - /* Send SectorAddr high nibble address byte */ + // Send SectorAddr high nibble address byte spi_flash_Send((SectorAddr & 0xFF0000) >> 16); - /* Send SectorAddr medium nibble address byte */ + // Send SectorAddr medium nibble address byte spi_flash_Send((SectorAddr & 0xFF00) >> 8); - /* Send SectorAddr low nibble address byte */ + // Send SectorAddr low nibble address byte spi_flash_Send(SectorAddr & 0xFF); - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; - /* Wait the end of Flash writing */ + // Wait the end of Flash writing SPI_FLASH_WaitForWriteEnd(); } void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { SPI_FLASH_WriteEnable(); W25QXX_CS_L; - /* Send Sector Erase instruction */ + // Send Sector Erase instruction spi_flash_Send(W25X_BlockErase); - /* Send SectorAddr high nibble address byte */ + // Send SectorAddr high nibble address byte spi_flash_Send((BlockAddr & 0xFF0000) >> 16); - /* Send SectorAddr medium nibble address byte */ + // Send SectorAddr medium nibble address byte spi_flash_Send((BlockAddr & 0xFF00) >> 8); - /* Send SectorAddr low nibble address byte */ + // Send SectorAddr low nibble address byte spi_flash_Send(BlockAddr & 0xFF); W25QXX_CS_H; @@ -227,18 +229,18 @@ void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { * Return : None *******************************************************************************/ void W25QXXFlash::SPI_FLASH_BulkErase(void) { - /* Send write enable instruction */ + // Send write enable instruction SPI_FLASH_WriteEnable(); - /* Bulk Erase */ - /* Select the FLASH: Chip Select low */ + // Bulk Erase + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send Bulk Erase instruction */ + // Send Bulk Erase instruction spi_flash_Send(W25X_ChipErase); - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; - /* Wait the end of Flash writing */ + // Wait the end of Flash writing SPI_FLASH_WaitForWriteEnd(); } @@ -256,34 +258,34 @@ void W25QXXFlash::SPI_FLASH_BulkErase(void) { * Return : None *******************************************************************************/ void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { - /* Enable the write access to the FLASH */ + // Enable the write access to the FLASH SPI_FLASH_WriteEnable(); - /* Select the FLASH: Chip Select low */ + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send "Write to Memory " instruction */ + // Send "Write to Memory " instruction spi_flash_Send(W25X_PageProgram); - /* Send WriteAddr high nibble address byte to write to */ + // Send WriteAddr high nibble address byte to write to spi_flash_Send((WriteAddr & 0xFF0000) >> 16); - /* Send WriteAddr medium nibble address byte to write to */ + // Send WriteAddr medium nibble address byte to write to spi_flash_Send((WriteAddr & 0xFF00) >> 8); - /* Send WriteAddr low nibble address byte to write to */ + // Send WriteAddr low nibble address byte to write to spi_flash_Send(WriteAddr & 0xFF); NOMORE(NumByteToWrite, SPI_FLASH_PerWritePageSize); - /* while there is data to be written on the FLASH */ + // While there is data to be written on the FLASH while (NumByteToWrite--) { - /* Send the current byte */ + // Send the current byte spi_flash_Send(*pBuffer); - /* Point on the next byte to be written */ + // Point on the next byte to be written pBuffer++; } - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; - /* Wait the end of Flash writing */ + // Wait the end of Flash writing SPI_FLASH_WaitForWriteEnd(); } @@ -306,11 +308,11 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; - if (Addr == 0) { /* WriteAddr is SPI_FLASH_PageSize aligned */ - if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */ + if (Addr == 0) { // WriteAddr is SPI_FLASH_PageSize aligned + if (NumOfPage == 0) { // NumByteToWrite < SPI_FLASH_PageSize SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } - else { /* NumByteToWrite > SPI_FLASH_PageSize */ + else { // NumByteToWrite > SPI_FLASH_PageSize while (NumOfPage--) { SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); WriteAddr += SPI_FLASH_PageSize; @@ -319,9 +321,9 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); } } - else { /* WriteAddr is not SPI_FLASH_PageSize aligned */ - if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */ - if (NumOfSingle > count) { /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */ + else { // WriteAddr is not SPI_FLASH_PageSize aligned + if (NumOfPage == 0) { // NumByteToWrite < SPI_FLASH_PageSize + if (NumOfSingle > count) { // (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize temp = NumOfSingle - count; SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); WriteAddr += count; @@ -332,7 +334,7 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } } - else { /* NumByteToWrite > SPI_FLASH_PageSize */ + else { // NumByteToWrite > SPI_FLASH_PageSize NumByteToWrite -= count; NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; @@ -364,24 +366,24 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui * Return : None *******************************************************************************/ void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { - /* Select the FLASH: Chip Select low */ + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send "Read from Memory " instruction */ + // Send "Read from Memory " instruction spi_flash_Send(W25X_ReadData); - /* Send ReadAddr high nibble address byte to read from */ + // Send ReadAddr high nibble address byte to read from spi_flash_Send((ReadAddr & 0xFF0000) >> 16); - /* Send ReadAddr medium nibble address byte to read from */ + // Send ReadAddr medium nibble address byte to read from spi_flash_Send((ReadAddr & 0xFF00) >> 8); - /* Send ReadAddr low nibble address byte to read from */ + // Send ReadAddr low nibble address byte to read from spi_flash_Send(ReadAddr & 0xFF); - if (NumByteToRead < 33) { - while (NumByteToRead--) { /* while there is data to be read */ - /* Read a byte from the FLASH */ + if (NumByteToRead <= 32 || !flash_dma_mode) { + while (NumByteToRead--) { // While there is data to be read + // Read a byte from the FLASH *pBuffer = spi_flash_Rec(); - /* Point to the next location where the byte read will be saved */ + // Point to the next location where the byte read will be saved pBuffer++; } } diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 47875a08b1..270053be3e 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -401,8 +401,8 @@ bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { // Fail for illegal characters PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); while (uint8_t b = pgm_read_byte(p++)) if (b == c) return false; - if (i > n || c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters - name[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name + if (i > n || c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters + name[i++] = c + (WITHIN(c, 'a', 'z') ? 'A' - 'a' : 0); // Uppercase required for 8.3 name } } *ptr = str; // Set passed pointer to the end diff --git a/platformio.ini b/platformio.ini index daeaee4021..81ed916eeb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -214,6 +214,7 @@ lib_deps = HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip src_filter=+ extra_scripts=download_mks_assets.py +MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/master.zip HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 src_filter=+ + + + + HAS_STEALTHCHOP = src_filter=+ From 86bf374fc4e57cad7104f9a4369090ec8b8a42b6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 14 Jan 2021 00:23:56 -0600 Subject: [PATCH 0875/1370] More MKS UI prelim. cleanup --- Marlin/src/HAL/STM32/tft/tft_fsmc.h | 1 - .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_about.h | 2 +- .../lib/mks_ui/draw_acceleration_settings.cpp | 2 +- .../lib/mks_ui/draw_acceleration_settings.h | 2 +- .../lib/mks_ui/draw_advance_settings.cpp | 2 +- .../extui/lib/mks_ui/draw_advance_settings.h | 2 +- .../draw_auto_level_offset_settings.cpp | 2 +- .../mks_ui/draw_auto_level_offset_settings.h | 2 +- .../extui/lib/mks_ui/draw_baby_stepping.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_baby_stepping.h | 2 +- .../extui/lib/mks_ui/draw_change_speed.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_change_speed.h | 2 +- .../lcd/extui/lib/mks_ui/draw_cloud_bind.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_cloud_bind.h | 2 +- .../extui/lib/mks_ui/draw_eeprom_settings.cpp | 2 +- .../extui/lib/mks_ui/draw_eeprom_settings.h | 2 +- .../lib/mks_ui/draw_encoder_settings.cpp | 2 +- .../extui/lib/mks_ui/draw_encoder_settings.h | 2 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_extrusion.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h | 2 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 2 +- .../extui/lib/mks_ui/draw_filament_change.h | 2 +- .../lib/mks_ui/draw_filament_settings.cpp | 2 +- .../extui/lib/mks_ui/draw_filament_settings.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.h | 2 +- .../draw_homing_sensitivity_settings.cpp | 2 +- .../mks_ui/draw_homing_sensitivity_settings.h | 2 +- .../extui/lib/mks_ui/draw_jerk_settings.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_jerk_settings.h | 2 +- .../lcd/extui/lib/mks_ui/draw_language.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_language.h | 2 +- .../extui/lib/mks_ui/draw_level_settings.cpp | 2 +- .../extui/lib/mks_ui/draw_level_settings.h | 2 +- .../extui/lib/mks_ui/draw_machine_para.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_machine_para.h | 2 +- .../lib/mks_ui/draw_machine_settings.cpp | 2 +- .../extui/lib/mks_ui/draw_machine_settings.h | 2 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.h | 2 +- .../mks_ui/draw_manual_level_pos_settings.cpp | 2 +- .../mks_ui/draw_manual_level_pos_settings.h | 2 +- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 2 +- .../lib/mks_ui/draw_max_feedrate_settings.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp | 91 +++++------------- Marlin/src/lcd/extui/lib/mks_ui/draw_more.h | 2 +- .../extui/lib/mks_ui/draw_motor_settings.cpp | 2 +- .../extui/lib/mks_ui/draw_motor_settings.h | 2 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_move_motor.h | 2 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_number_key.h | 2 +- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_operation.h | 2 +- .../extui/lib/mks_ui/draw_pause_position.cpp | 2 +- .../extui/lib/mks_ui/draw_pause_position.h | 2 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.h | 2 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 5 +- .../lcd/extui/lib/mks_ui/draw_print_file.h | 2 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_printing.h | 2 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.h | 2 +- .../extui/lib/mks_ui/draw_step_settings.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_step_settings.h | 2 +- .../lib/mks_ui/draw_tmc_current_settings.cpp | 2 +- .../lib/mks_ui/draw_tmc_current_settings.h | 2 +- .../mks_ui/draw_tmc_step_mode_settings.cpp | 2 +- .../lib/mks_ui/draw_tmc_step_mode_settings.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 26 ++--- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 3 - Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h | 2 +- .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_wifi_list.h | 2 +- .../extui/lib/mks_ui/draw_wifi_settings.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_wifi_settings.h | 2 +- .../lcd/extui/lib/mks_ui/draw_wifi_tips.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_wifi_tips.h | 2 +- .../src/lcd/extui/lib/mks_ui/irq_overrid.cpp | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 1 - .../extui/lib/mks_ui/tft_lvgl_configuration.h | 5 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 64 ++++--------- .../src/lcd/extui/lib/mks_ui/wifiSerial.cpp | 12 +-- Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h | 7 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 95 +++++++++---------- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 15 ++- Marlin/src/lcd/tft/tft_queue.cpp | 1 - Marlin/src/libs/W25Qxx.cpp | 7 +- 97 files changed, 203 insertions(+), 300 deletions(-) diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h index 7c40151e2b..2200abaa10 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h @@ -84,7 +84,6 @@ class TFT_FSMC { } }; - #ifdef STM32F1xx #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE) #elif defined(STM32F4xx) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index 1f09153143..a57dfc504b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -44,7 +44,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_about(void) { +void lv_draw_about() { scr = lv_screen_create(ABOUT_UI); lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_A_RETURN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h index 9eae2b06ca..77d66aef11 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_about(void); +extern void lv_draw_about(); extern void lv_clear_about(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index ffb6f01579..560f5460f5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -107,7 +107,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_acceleration_settings(void) { +void lv_draw_acceleration_settings() { scr = lv_screen_create(ACCELERATION_UI, machine_menu.AccelerationConfTitle); if (uiCfg.para_ui_page != 1) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h index 6ab49713c9..dc72739106 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_acceleration_settings(void); +extern void lv_draw_acceleration_settings(); extern void lv_clear_acceleration_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp index 534fd6072c..feefc4107c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -69,7 +69,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_advance_settings(void) { +void lv_draw_advance_settings() { scr = lv_screen_create(ADVANCED_UI, machine_menu.AdvancedConfTitle); int index = 0; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h index 84e4a4d4cf..8885fc6a4e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_advance_settings(void); +extern void lv_draw_advance_settings(); extern void lv_clear_advance_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp index 3b39debe57..e41ad44c7a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -64,7 +64,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_auto_level_offset_settings(void) { +void lv_draw_auto_level_offset_settings() { scr = lv_screen_create(NOZZLE_PROBE_OFFSET_UI, machine_menu.OffsetConfTitle); sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h index 688cd205d0..ec61862a24 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_auto_level_offset_settings(void); +extern void lv_draw_auto_level_offset_settings(); extern void lv_clear_auto_level_offset_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp index dce83bad2b..255f6e8f8a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -111,7 +111,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_baby_stepping(void) { +void lv_draw_baby_stepping() { scr = lv_screen_create(BABY_STEP_UI); lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_V, titleHeight, event_handler, ID_BABY_STEP_X_P); lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABY_STEP_X_N); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h index 5886a20583..8793ad772f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_baby_stepping(void); +extern void lv_draw_baby_stepping(); extern void lv_clear_baby_stepping(); extern void disp_baby_step_dist(); extern void disp_z_offset_value(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index afb0245e2f..635625950b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -115,7 +115,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_change_speed(void) { +void lv_draw_change_speed() { scr = lv_screen_create(CHANGE_SPEED_UI); // Create an Image button lv_big_button_create(scr, "F:/bmp_Add.bin", speed_menu.add, INTERVAL_V, titleHeight, event_handler, ID_C_ADD); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h index 8fa4c803af..75e4fe3099 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h @@ -28,7 +28,7 @@ #define MIN_EXT_SPEED_PERCENT 10 #define MAX_EXT_SPEED_PERCENT 999 -extern void lv_draw_change_speed(void); +extern void lv_draw_change_speed(); extern void lv_clear_change_speed(); extern void disp_speed_step(); extern void disp_print_speed(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp index 9eaf4d29df..ae8fe3a321 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp @@ -60,7 +60,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } -void lv_draw_cloud_bind(void) { +void lv_draw_cloud_bind() { lv_obj_t *buttonBack = NULL, *label_Back = NULL; scr = lv_screen_create(BIND_UI); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h index f0f354a065..1626680051 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_cloud_bind(void); +extern void lv_draw_cloud_bind(); extern void lv_clear_cloud_bind(); extern void disp_bind_state(); extern void refresh_bind_ui(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp index 924c69536a..15e319f4a6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp @@ -65,7 +65,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_eeprom_settings(void) { +void lv_draw_eeprom_settings() { scr = lv_screen_create(EEPROM_SETTINGS_UI); lv_screen_menu_item(scr, eeprom_menu.revert, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_EEPROM_REVERT, 0); lv_screen_menu_item(scr, eeprom_menu.store, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_EEPROM_STORE, 1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h index 6d5ecf0870..3d9f7cae00 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_eeprom_settings(void); +extern void lv_draw_eeprom_settings(); extern void lv_clear_eeprom_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp index c9c2d4f28d..e090c6a3b5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp @@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_encoder_settings(void) { +void lv_draw_encoder_settings() { scr = lv_screen_create(ENCODER_SETTINGS_UI, machine_menu.EncoderConfTitle); buttonEncoderState = lv_screen_menu_item_onoff(scr, machine_menu.EncoderConfText, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ENCODER_STATE, 0, gCfgItems.encoder_enable); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_ENCODER_RETURN, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h index 62892a6ec1..392dc67db7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_encoder_settings(void); +extern void lv_draw_encoder_settings(); extern void lv_clear_encoder_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 394c702132..2fdd2c3f2c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -117,7 +117,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_extrusion(void) { +void lv_draw_extrusion() { scr = lv_screen_create(EXTRUSION_UI); // Create image buttons lv_obj_t *buttonAdd = lv_big_button_create(scr, "F:/bmp_in.bin", extrude_menu.in, INTERVAL_V, titleHeight, event_handler, ID_E_ADD); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h index 6178a8e19f..75db2fbab5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_extrusion(void); +extern void lv_draw_extrusion(); extern void lv_clear_extrusion(); extern void disp_ext_type(); extern void disp_ext_step(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index cd74a55e65..af8b441f24 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -74,7 +74,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { gcode.process_subcommands_now(public_buf_l); } -void lv_draw_fan(void) { +void lv_draw_fan() { lv_obj_t *buttonAdd; #if HAS_FAN diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h index 5a3323e2f2..d9b23fbbe4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_fan(void); +extern void lv_draw_fan(); extern void lv_clear_fan(); extern void disp_fan_value(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 39d32fa745..017b7120f0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -105,7 +105,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_filament_change(void) { +void lv_draw_filament_change() { scr = lv_screen_create(FILAMENTCHANGE_UI); // Create an Image button lv_obj_t *buttonIn = lv_big_button_create(scr, "F:/bmp_in.bin", filament_menu.in, INTERVAL_V, titleHeight, event_handler, ID_FILAMNT_IN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h index 18efe5839e..9c1c9a8767 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_filament_change(void); +extern void lv_draw_filament_change(); extern void lv_clear_filament_change(); extern void disp_filament_type(); extern void disp_filament_temp(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index 2c9c3882f0..4dcd9b8b19 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -88,7 +88,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_filament_settings(void) { +void lv_draw_filament_settings() { scr = lv_screen_create(FILAMENT_SETTINGS_UI, machine_menu.FilamentConfTitle); if (uiCfg.para_ui_page != 1) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h index a5ae542895..f9967df31f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_filament_settings(void); +extern void lv_draw_filament_settings(); extern void lv_clear_filament_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 5e5b5f36a0..a737197fce 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -72,7 +72,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_home(void) { +void lv_draw_home() { scr = lv_screen_create(ZERO_UI); lv_big_button_create(scr, "F:/bmp_zeroAll.bin", home_menu.home_all, INTERVAL_V, titleHeight, event_handler, ID_H_ALL); lv_big_button_create(scr, "F:/bmp_zeroX.bin", home_menu.home_x, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_H_X); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h index a8f11d9237..779cbb0130 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_home(void); +extern void lv_draw_home(); extern void lv_clear_home(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp index cbd028b60a..9a1c9dec2a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp @@ -74,7 +74,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_homing_sensitivity_settings(void) { +void lv_draw_homing_sensitivity_settings() { scr = lv_screen_create(HOMING_SENSITIVITY_UI, machine_menu.HomingSensitivityConfTitle); sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h index 0c554702b1..c6f0e11457 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_homing_sensitivity_settings(void); +extern void lv_draw_homing_sensitivity_settings(); extern void lv_clear_homing_sensitivity_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp index f07c2761b6..1c4ac9da61 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -70,7 +70,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_jerk_settings(void) { +void lv_draw_jerk_settings() { scr = lv_screen_create(JERK_UI, machine_menu.JerkConfTitle); sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h index 0531dae9da..69fd344609 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_jerk_settings(void); +extern void lv_draw_jerk_settings(); extern void lv_clear_jerk_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 7edb73b71f..5953d04184 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -183,7 +183,7 @@ static void disp_language(uint8_t language, uint8_t state) { if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj); } -void lv_draw_language(void) { +void lv_draw_language() { scr = lv_screen_create(LANGUAGE_UI); // Create image buttons buttonCN = lv_big_button_create(scr, "F:/bmp_simplified_cn.bin", language_menu.chinese_s, INTERVAL_V, titleHeight, event_handler, ID_CN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h index d4ee14f30a..9e769e3692 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_language(void); +extern void lv_draw_language(); extern void lv_clear_language(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index 6d495494bf..58c6337204 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -60,7 +60,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_level_settings(void) { +void lv_draw_level_settings() { scr = lv_screen_create(LEVELING_PARA_UI, machine_menu.LevelingParaConfTitle); lv_screen_menu_item(scr, machine_menu.LevelingManuPosConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_LEVEL_POSITION, 0); lv_screen_menu_item(scr, machine_menu.LevelingAutoCommandConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_LEVEL_COMMAND, 1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h index ce290172b6..95a4e2e2e5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_level_settings(void); +extern void lv_draw_level_settings(); extern void lv_clear_level_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp index 5f81d7b369..971ea8a69e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -65,7 +65,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_machine_para(void) { +void lv_draw_machine_para() { scr = lv_screen_create(MACHINE_PARA_UI); lv_screen_menu_item(scr, MachinePara_menu.MachineSetting, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PARA_MACHINE, 0); lv_screen_menu_item(scr, MachinePara_menu.MotorSetting, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_PARA_MOTOR, 1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h index e830f75db7..652a7e1eb7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_machine_para(void); +extern void lv_draw_machine_para(); extern void lv_clear_machine_para(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp index deeb51ab0f..b79605d74f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -62,7 +62,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_machine_settings(void) { +void lv_draw_machine_settings() { scr = lv_screen_create(MACHINE_SETTINGS_UI, machine_menu.MachineConfigTitle); lv_screen_menu_item(scr, machine_menu.AccelerationConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MACHINE_ACCELERATION, 0); lv_screen_menu_item(scr, machine_menu.MaxFeedRateConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MACHINE_FEEDRATE, 1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h index 38d02e7189..dd988ede72 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_machine_settings(void); +extern void lv_draw_machine_settings(); extern void lv_clear_machine_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 338cb1fecc..51761da8f3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -113,7 +113,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_manualLevel(void) { +void lv_draw_manualLevel() { scr = lv_screen_create(LEVELING_UI); // Create an Image button lv_obj_t *buttonPoint1 = lv_big_button_create(scr, "F:/bmp_leveling1.bin", leveling_menu.position1, INTERVAL_V, titleHeight, event_handler, ID_M_POINT1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h index 60de0b4fe0..4e9b8275ba 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_manualLevel(void); +extern void lv_draw_manualLevel(); extern void lv_clear_manualLevel(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp index 135838a08b..554c32be94 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -101,7 +101,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_number_key(); } -void lv_draw_manual_level_pos_settings(void) { +void lv_draw_manual_level_pos_settings() { char buf2[50]; scr = lv_screen_create(MANUAL_LEVELING_POSIGION_UI, machine_menu.LevelingParaConfTitle); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h index 8e89ecf559..83fd225bd3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_manual_level_pos_settings(void); +extern void lv_draw_manual_level_pos_settings(); extern void lv_clear_manual_level_pos_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index dc66bea9c3..393d4736ea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -79,7 +79,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_number_key(); } -void lv_draw_max_feedrate_settings(void) { +void lv_draw_max_feedrate_settings() { scr = lv_screen_create(MAXFEEDRATE_UI, machine_menu.MaxFeedRateConfTitle); if (uiCfg.para_ui_page != 1) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h index 78caca5ade..f82ffd0eaa 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_max_feedrate_settings(void); +extern void lv_draw_max_feedrate_settings(); extern void lv_clear_max_feedrate_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp index f718e62589..76bb34988a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp @@ -33,53 +33,28 @@ extern lv_group_t * g; static lv_obj_t * scr; -#define ID_CUSTOM_1 1 -#define ID_CUSTOM_2 2 -#define ID_CUSTOM_3 3 -#define ID_CUSTOM_4 4 -#define ID_CUSTOM_5 5 -#define ID_CUSTOM_6 6 -#define ID_CUSTOM_7 7 -#define ID_M_RETURN 8 +enum { + ID_GCODE = 1, + ID_CUSTOM_1, + ID_CUSTOM_2, + ID_CUSTOM_3, + ID_CUSTOM_4, + ID_CUSTOM_5, + ID_CUSTOM_6, + ID_CUSTOM_7, + ID_M_RETURN, +}; static void event_handler(lv_obj_t * obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { - #if ENABLED(USER_CMD_1_ENABLE) - case ID_CUSTOM_1: - queue.inject_P(PSTR(USER_GCODE_1)); - break; - #endif - #if ENABLED(USER_CMD_2_ENABLE) - case ID_CUSTOM_2: - queue.inject_P(PSTR(USER_GCODE_2)); - break; - #endif - #if ENABLED(USER_CMD_3_ENABLE) - case ID_CUSTOM_3: - queue.inject_P(PSTR(USER_GCODE_3)); - break; - #endif - #if ENABLED(USER_CMD_4_ENABLE) - case ID_CUSTOM_4: - queue.inject_P(PSTR(USER_GCODE_4)); - break; - #endif - #if ENABLED(USER_CMD_5_ENABLE) - case ID_CUSTOM_5: - queue.inject_P(PSTR(USER_GCODE_5)); - break; - #endif - #if ENABLED(USER_CMD_6_ENABLE) - case ID_CUSTOM_6: - queue.inject_P(PSTR(USER_GCODE_6)); - break; - #endif - #if ENABLED(USER_CMD_7_ENABLE) - case ID_CUSTOM_7: - queue.inject_P(PSTR(USER_GCODE_7)); - break; - #endif + case ID_CUSTOM_1: TERN_(USER_CMD_1_ENABLE, queue.inject_P(PSTR(USER_GCODE_1))); break; + case ID_CUSTOM_2: TERN_(USER_CMD_2_ENABLE, queue.inject_P(PSTR(USER_GCODE_2))); break; + case ID_CUSTOM_3: TERN_(USER_CMD_3_ENABLE, queue.inject_P(PSTR(USER_GCODE_3))); break; + case ID_CUSTOM_4: TERN_(USER_CMD_4_ENABLE, queue.inject_P(PSTR(USER_GCODE_4))); break; + case ID_CUSTOM_5: TERN_(USER_CMD_5_ENABLE, queue.inject_P(PSTR(USER_GCODE_5))); break; + case ID_CUSTOM_6: TERN_(USER_CMD_6_ENABLE, queue.inject_P(PSTR(USER_GCODE_6))); break; + case ID_CUSTOM_7: TERN_(USER_CMD_7_ENABLE, queue.inject_P(PSTR(USER_GCODE_7))); break; case ID_M_RETURN: lv_clear_more(); lv_draw_tool(); @@ -87,7 +62,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } -void lv_draw_more(void) { +void lv_draw_more() { scr = lv_screen_create(MORE_UI); const bool enc_ena = TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable); @@ -173,27 +148,13 @@ void lv_draw_more(void) { #if BUTTONS_EXIST(EN1, EN2, ENC) if (enc_ena) { - #if ENABLED(USER_CMD_1_ENABLE) - lv_group_add_obj(g, buttonCustom1); - #endif - #if ENABLED(USER_CMD_2_ENABLE) - lv_group_add_obj(g, buttonCustom2); - #endif - #if ENABLED(USER_CMD_3_ENABLE) - lv_group_add_obj(g, buttonCustom3); - #endif - #if ENABLED(USER_CMD_4_ENABLE) - lv_group_add_obj(g, buttonCustom4); - #endif - #if ENABLED(USER_CMD_5_ENABLE) - lv_group_add_obj(g, buttonCustom5); - #endif - #if ENABLED(USER_CMD_6_ENABLE) - lv_group_add_obj(g, buttonCustom6); - #endif - #if ENABLED(USER_CMD_7_ENABLE) - lv_group_add_obj(g, buttonCustom7); - #endif + TERN_(USER_CMD_1_ENABLE, lv_group_add_obj(g, buttonCustom1)); + TERN_(USER_CMD_2_ENABLE, lv_group_add_obj(g, buttonCustom2)); + TERN_(USER_CMD_3_ENABLE, lv_group_add_obj(g, buttonCustom3)); + TERN_(USER_CMD_4_ENABLE, lv_group_add_obj(g, buttonCustom4)); + TERN_(USER_CMD_5_ENABLE, lv_group_add_obj(g, buttonCustom5)); + TERN_(USER_CMD_6_ENABLE, lv_group_add_obj(g, buttonCustom6)); + TERN_(USER_CMD_7_ENABLE, lv_group_add_obj(g, buttonCustom7)); lv_group_add_obj(g, buttonBack); } #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h index 9dfa705c8e..2a68d3da99 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_more(void); +extern void lv_draw_more(); extern void lv_clear_more(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp index 860db5d89d..ec948f10be 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -68,7 +68,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_motor_settings(void) { +void lv_draw_motor_settings() { int index = 0; scr = lv_screen_create(MOTOR_SETTINGS_UI, machine_menu.MotorConfTitle); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h index 9a1c7a4db5..632f7bd24d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_motor_settings(void); +extern void lv_draw_motor_settings(); extern void lv_clear_motor_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index ce240bf16d..6db1810fcf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -35,7 +35,7 @@ static lv_obj_t *scr; static lv_obj_t *labelV, *buttonV, *labelP; static lv_task_t *updatePosTask; -static char cur_label = 'Z'; +static char cur_label = 'Z'; static float cur_pos = 0; void disp_cur_pos(); @@ -90,7 +90,7 @@ void refresh_pos(lv_task_t *) { disp_cur_pos(); } -void lv_draw_move_motor(void) { +void lv_draw_move_motor() { scr = lv_screen_create(MOVE_MOTOR_UI); lv_obj_t *buttonXI = lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_V, titleHeight, event_handler, ID_M_X_P); lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h index 4e41c5ff94..a9b75c1d13 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_move_motor(void); +extern void lv_draw_move_motor(); extern void lv_clear_move_motor(); extern void disp_move_dist(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 1c339bde7e..0694f89d74 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -656,7 +656,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_number_key(void) { +void lv_draw_number_key() { scr = lv_screen_create(NUMBER_KEY_UI, ""); buttonValue = lv_btn_create(scr, 92, 40, 296, 40, event_handler, ID_NUM_KEY1, &style_num_text); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h index 7902da3649..dbf9015452 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_number_key(void); +extern void lv_draw_number_key(); extern void lv_clear_number_key(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index 50aa85e338..eb4b370838 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -114,7 +114,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_operation(void) { +void lv_draw_operation() { lv_obj_t *buttonExtrusion = nullptr, *buttonSpeed = nullptr, *buttonBack = nullptr, *labelPreHeat = nullptr, *labelExtrusion = nullptr, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h index 0257812ec9..e034f7070b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_operation(void); +extern void lv_draw_operation(); extern void lv_clear_operation(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index 59c30bdb95..46aa1a58d1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -59,7 +59,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_number_key(); } -void lv_draw_pause_position(void) { +void lv_draw_pause_position() { scr = lv_screen_create(PAUSE_POS_UI, machine_menu.PausePosText); sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h index 3e9e079827..e7c92a7396 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_pause_position(void); +extern void lv_draw_pause_position(); extern void lv_clear_pause_position(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index e1d2aecbe0..43f82bca24 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -153,7 +153,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_preHeat(void) { +void lv_draw_preHeat() { scr = lv_screen_create(PRE_HEAT_UI); // Create image buttons diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h index 602f5e9066..da3ce88384 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_preHeat(void); +extern void lv_draw_preHeat(); extern void lv_clear_preHeat(); extern void disp_temp_type(); extern void disp_step_heat(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 96a6bc1177..0a8f81ea86 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -73,8 +73,7 @@ uint8_t sel_id = 0; for (uint16_t i = 0; i < fileCnt; i++) { if (list_file.Sd_file_cnt == list_file.Sd_file_offset) { - const uint16_t nr = SD_ORDER(i, fileCnt); - card.getfilename_sorted(nr); + card.getfilename_sorted(SD_ORDER(i, fileCnt)); list_file.IsFolder[valid_name_cnt] = card.flag.filenameIsDir; strcpy(list_file.file_name[valid_name_cnt], list_file.curDirPath); @@ -205,7 +204,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_print_file(void) { +void lv_draw_print_file() { //uint8_t i; uint8_t file_count; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h index ac3539e71d..759ccdc1c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -50,7 +50,7 @@ typedef struct { extern LIST_FILE list_file; extern void disp_gcode_icon(uint8_t file_num); -extern void lv_draw_print_file(void); +extern void lv_draw_print_file(); extern uint32_t lv_open_gcode_file(char *path); extern void lv_gcode_file_read(uint8_t *data_buf); extern void lv_close_gcode_file(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 13fad747fa..169cf1af7c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -110,7 +110,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_printing(void) { +void lv_draw_printing() { disp_state_stack._disp_index = 0; ZERO(disp_state_stack._disp_state); scr = lv_screen_create(PRINTING_UI); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h index d6da1a1005..7c98fd767b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h @@ -36,7 +36,7 @@ enum { STOP }; -extern void lv_draw_printing(void); +extern void lv_draw_printing(); extern void lv_clear_printing(); extern void disp_ext_temp(); extern void disp_bed_temp(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index b16019e8d1..97200efb08 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -110,7 +110,7 @@ void mks_disp_test() { #endif } -void lv_draw_ready_print(void) { +void lv_draw_ready_print() { char buf[30] = {0}; lv_obj_t *buttonTool; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index 7a803f80a4..a3cfd67665 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_ready_print(void); +extern void lv_draw_ready_print(); extern void mks_disp_test(); extern void disp_Limit_ok(); extern void disp_Limit_error(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index fa8622e69d..f6702b559e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -109,7 +109,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_set(void) { +void lv_draw_set() { scr = lv_screen_create(SET_UI); lv_big_button_create(scr, "F:/bmp_eeprom_settings.bin", set_menu.eepromSet, INTERVAL_V, titleHeight, event_handler, ID_S_EEPROM_SET); lv_big_button_create(scr, "F:/bmp_fan.bin", set_menu.fan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_S_FAN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h index eed0c6c959..8ad8b9f2ea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_set(void); +extern void lv_draw_set(); extern void lv_clear_set(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index 88cebc4218..0f66e5e62d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -78,7 +78,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_number_key(); } -void lv_draw_step_settings(void) { +void lv_draw_step_settings() { scr = lv_screen_create(STEPS_UI, machine_menu.StepsConfTitle); if (uiCfg.para_ui_page != 1) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h index b7eaeb4c61..249e5a7942 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_step_settings(void); +extern void lv_draw_step_settings(); extern void lv_clear_step_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index 028c58ab43..3d503b2115 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -91,7 +91,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } -void lv_draw_tmc_current_settings(void) { +void lv_draw_tmc_current_settings() { scr = lv_screen_create(TMC_CURRENT_UI, machine_menu.TmcCurrentConfTitle); float milliamps; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h index 927db37138..8310305e61 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tmc_current_settings(void); +extern void lv_draw_tmc_current_settings(); extern void lv_clear_tmc_current_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 691e46f01d..51108dedcf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -107,7 +107,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_tmc_step_mode_settings(void) { +void lv_draw_tmc_step_mode_settings() { buttonXState = buttonYState = buttonZState = buttonE0State = buttonE1State = nullptr; scr = lv_screen_create(TMC_MODE_UI, machine_menu.TmcStepModeConfTitle); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h index 35c57ab0cc..a15baf21e8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tmc_step_mode_settings(void); +extern void lv_draw_tmc_step_mode_settings(); extern void lv_clear_tmc_step_mode_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index c48d275e01..23acbb4f84 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -50,25 +50,13 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - bool clear = (obj->mks_obj_id != ID_T_LEVELING); - #else - constexpr bool clear = true; - #endif - if (clear) lv_clear_tool(); + if (TERN1(AUTO_BED_LEVELING_BILINEAR, obj->mks_obj_id != ID_T_LEVELING)) + lv_clear_tool(); switch (obj->mks_obj_id) { - case ID_T_PRE_HEAT: - lv_draw_preHeat(); - break; - case ID_T_EXTRUCT: - lv_draw_extrusion(); - break; - case ID_T_MOV: - lv_draw_move_motor(); - break; - case ID_T_HOME: - lv_draw_home(); - break; + case ID_T_PRE_HEAT: lv_draw_preHeat(); break; + case ID_T_EXTRUCT: lv_draw_extrusion(); break; + case ID_T_MOV: lv_draw_move_motor(); break; + case ID_T_HOME: lv_draw_home(); break; case ID_T_LEVELING: #if ENABLED(AUTO_BED_LEVELING_BILINEAR) get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); @@ -91,7 +79,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_tool(void) { +void lv_draw_tool() { scr = lv_screen_create(TOOL_UI); lv_big_button_create(scr, "F:/bmp_preHeat.bin", tool_menu.preheat, INTERVAL_V, titleHeight, event_handler, ID_T_PRE_HEAT); lv_big_button_create(scr, "F:/bmp_extruct.bin", tool_menu.extrude, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_EXTRUCT); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h index 2191adccbc..1cfd297aba 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tool(void); +extern void lv_draw_tool(); extern void lv_clear_tool(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index bb6e9419f0..50282536e6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -72,9 +72,6 @@ extern bool once_flag; extern uint8_t sel_id; extern lv_group_t *g; -extern uint8_t bmp_public_buf[14 * 1024]; -extern uint8_t public_buf[513]; - extern void LCD_IO_WriteData(uint16_t RegValue); static const char custom_gcode_command[][100] = { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 68ef59728e..2728a07ef1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -444,7 +444,7 @@ extern lv_point_t line_points[4][2]; extern void gCfgItems_init(); extern void ui_cfg_init(); extern void tft_style_init(); -extern char *creat_title_text(void); +extern char *creat_title_text(); extern void preview_gcode_prehandle(char *path); extern void update_spi_flash(); extern void update_gcode_command(int addr,uint8_t *s); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index d52d508eb3..fe22923b44 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -59,7 +59,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_wifi(void) { +void lv_draw_wifi() { scr = lv_screen_create(WIFI_UI); lv_obj_t *buttonReconnect = nullptr, *label_Reconnect = nullptr; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h index 966a84d3b1..1187741ad6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h @@ -26,7 +26,7 @@ #endif -extern void lv_draw_wifi(void); +extern void lv_draw_wifi(); extern void lv_clear_wifi(); extern void disp_wifi_state(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp index 699b3fdaef..d45f9980fc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -88,7 +88,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_wifi_list(void) { +void lv_draw_wifi_list() { scr = lv_screen_create(WIFI_LIST_UI); lv_obj_t *buttonDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H, event_handler, ID_WL_DOWN); @@ -130,7 +130,7 @@ void lv_draw_wifi_list(void) { disp_wifi_list(); } -void disp_wifi_list(void) { +void disp_wifi_list() { int8_t tmpStr[WIFI_NAME_BUFFER_SIZE] = { 0 }; uint8_t i, j; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h index e2d9275ef9..e42b738f14 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h @@ -27,7 +27,7 @@ extern void lv_draw_wifi_list(); extern void lv_clear_wifi_list(); -extern void disp_wifi_list(void); +extern void disp_wifi_list(); extern void cutWifiName(char *name, int len,char *outStr); extern void wifi_scan_handle(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp index 9c8c094e4c..fd2c6467e7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp @@ -93,7 +93,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } -void lv_draw_wifi_settings(void) { +void lv_draw_wifi_settings() { scr = lv_screen_create(WIFI_SETTINGS_UI, machine_menu.WifiConfTitle); lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y + 10, machine_menu.wifiMode); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h index c0d6e0ccdd..605423b131 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h @@ -28,7 +28,7 @@ #define WIFI_AP_TEXT "AP" #define WIFI_STA_TEXT "STA" -extern void lv_draw_wifi_settings(void); +extern void lv_draw_wifi_settings(); extern void lv_clear_wifi_settings(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp index 7428d36488..3db89a87c9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp @@ -36,7 +36,7 @@ TIPS_TYPE wifi_tips_type; TIPS_DISP tips_disp; tips_menu_def tips_menu; -void lv_draw_wifi_tips(void) { +void lv_draw_wifi_tips() { static lv_obj_t *text_tips,*wifi_name; scr = lv_screen_create(WIFI_TIPS_UI, ""); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h index 4f81f00a43..f9896edcc8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h @@ -26,7 +26,7 @@ #endif -extern void lv_draw_wifi_tips(void); +extern void lv_draw_wifi_tips(); extern void lv_clear_wifi_tips(); typedef enum { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp index 388c4a35b8..98b4aff881 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp @@ -45,7 +45,7 @@ #define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); #define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); -void __irq_usart1(void) { +void __irq_usart1() { if ((USART1_BASE->CR1 & USART_CR1_RXNEIE) && (USART1_BASE->SR & USART_SR_RXNE)) WRITE(WIFI_IO1_PIN, HIGH); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 4fdc946cca..2261eeeba9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -399,7 +399,6 @@ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,\nclick for return!" #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,\nclick for return!" - #define PRE_HEAT_EXT_TEXT_EN "E" #define PRE_HEAT_BED_TEXT_EN "Bed" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index 0d4ea1f404..d0ea4e376f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -37,9 +37,6 @@ extern uint8_t bmp_public_buf[14 * 1024]; extern uint8_t public_buf[513]; -extern uint8_t bmp_public_buf[14 * 1024]; -extern uint8_t public_buf[513]; - extern void tft_lvgl_init(); extern void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); extern bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); @@ -48,7 +45,7 @@ extern bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * dat extern void LCD_Clear(uint16_t Color); extern void tft_set_point(uint16_t x, uint16_t y, uint16_t point); extern void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); -extern void LCD_WriteRAM_Prepare(void); +extern void LCD_WriteRAM_Prepare(); extern void lcd_draw_logo(); extern void lv_encoder_pin_init(); extern void lv_update_encoder(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 2efe68a4ce..0401faeebd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -944,7 +944,7 @@ void disp_language_init() { filesys_menu.sd_sys = SD_CARD_TEXT_CN; filesys_menu.usb_sys = U_DISK_TEXT_CN; // - more_menu.title = TITLE_MORE_CN; + more_menu.title = TITLE_MORE_CN; #if ENABLED(USER_CMD_1_ENABLE) more_menu.custom1 = MORE_CUSTOM1_TEXT_CN; #endif @@ -1006,7 +1006,6 @@ void disp_language_init() { filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_CN; filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN; - // language_menu.title = TITLE_LANGUAGE_CN; language_menu.next = PAGE_DOWN_TEXT_CN; @@ -1191,7 +1190,7 @@ void disp_language_init() { filesys_menu.sd_sys = SD_CARD_TEXT_T_CN; filesys_menu.usb_sys = U_DISK_TEXT_T_CN; // - more_menu.title = TITLE_MORE_T_CN; + more_menu.title = TITLE_MORE_T_CN; #if ENABLED(USER_CMD_1_ENABLE) more_menu.custom1 = MORE_CUSTOM1_TEXT_T_CN; #endif @@ -1423,28 +1422,15 @@ void disp_language_init() { set_menu.shutdown = SHUTDOWN_TEXT_EN; set_menu.machine_para = MACHINE_PARA_EN; set_menu.eepromSet = EEPROM_SETTINGS_EN; + // more_menu.title = TITLE_MORE_EN; - #if ENABLED(USER_CMD_1_ENABLE) - more_menu.custom1 = MORE_CUSTOM1_TEXT_EN; - #endif - #if ENABLED(USER_CMD_2_ENABLE) - more_menu.custom2 = MORE_CUSTOM2_TEXT_EN; - #endif - #if ENABLED(USER_CMD_3_ENABLE) - more_menu.custom3 = MORE_CUSTOM3_TEXT_EN; - #endif - #if ENABLED(USER_CMD_4_ENABLE) - more_menu.custom4 = MORE_CUSTOM4_TEXT_EN; - #endif - #if ENABLED(USER_CMD_5_ENABLE) - more_menu.custom5 = MORE_CUSTOM5_TEXT_EN; - #endif - #if ENABLED(USER_CMD_6_ENABLE) - more_menu.custom6 = MORE_CUSTOM6_TEXT_EN; - #endif - #if ENABLED(USER_CMD_7_ENABLE) - more_menu.custom7 = MORE_CUSTOM7_TEXT_EN; - #endif + TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_EN); + TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_EN); + TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_EN); + TERN_(USER_CMD_4_ENABLE, more_menu.custom4 = MORE_CUSTOM4_TEXT_EN); + TERN_(USER_CMD_5_ENABLE, more_menu.custom5 = MORE_CUSTOM5_TEXT_EN); + TERN_(USER_CMD_6_ENABLE, more_menu.custom6 = MORE_CUSTOM6_TEXT_EN); + TERN_(USER_CMD_7_ENABLE, more_menu.custom7 = MORE_CUSTOM7_TEXT_EN); // filesys_menu.title = TITLE_FILESYS_EN; @@ -2694,28 +2680,14 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_EN; set_menu.eepromSet = EEPROM_SETTINGS_EN; // - more_menu.title = TITLE_MORE_EN; - #if ENABLED(USER_CMD_1_ENABLE) - more_menu.custom1 = MORE_CUSTOM1_TEXT_EN; - #endif - #if ENABLED(USER_CMD_2_ENABLE) - more_menu.custom2 = MORE_CUSTOM2_TEXT_EN; - #endif - #if ENABLED(USER_CMD_3_ENABLE) - more_menu.custom3 = MORE_CUSTOM3_TEXT_EN; - #endif - #if ENABLED(USER_CMD_4_ENABLE) - more_menu.custom4 = MORE_CUSTOM4_TEXT_EN; - #endif - #if ENABLED(USER_CMD_5_ENABLE) - more_menu.custom5 = MORE_CUSTOM5_TEXT_EN; - #endif - #if ENABLED(USER_CMD_6_ENABLE) - more_menu.custom6 = MORE_CUSTOM6_TEXT_EN; - #endif - #if ENABLED(USER_CMD_7_ENABLE) - more_menu.custom7 = MORE_CUSTOM7_TEXT_EN; - #endif + more_menu.title = TITLE_MORE_EN; + TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_EN); + TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_EN); + TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_EN); + TERN_(USER_CMD_4_ENABLE, more_menu.custom4 = MORE_CUSTOM4_TEXT_EN); + TERN_(USER_CMD_5_ENABLE, more_menu.custom5 = MORE_CUSTOM5_TEXT_EN); + TERN_(USER_CMD_6_ENABLE, more_menu.custom6 = MORE_CUSTOM6_TEXT_EN); + TERN_(USER_CMD_7_ENABLE, more_menu.custom7 = MORE_CUSTOM7_TEXT_EN); // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp index 6999c638f5..9e528821d7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp @@ -59,7 +59,7 @@ WifiSerial::WifiSerial(usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) { if (with_irq) usart_enable(usart_device); else { usart_reg_map *regs = usart_device->regs; - regs->CR1 |= (USART_CR1_TE | USART_CR1_RE);// don't change the word length etc, and 'or' in the patten not overwrite |USART_CR1_M_8N1); + regs->CR1 |= (USART_CR1_TE | USART_CR1_RE); // don't change the word length etc, and 'or' in the pattern not overwrite |USART_CR1_M_8N1); regs->CR1 |= USART_CR1_UE; } } @@ -71,7 +71,7 @@ WifiSerial::WifiSerial(usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) { if (with_irq) usart_enable(usart_device); else { usart_reg_map *regs = usart_device->regs; - regs->CR1 |= (USART_CR1_TE | USART_CR1_RE);// don't change the word length etc, and 'or' in the patten not overwrite |USART_CR1_M_8N1); + regs->CR1 |= (USART_CR1_TE | USART_CR1_RE); // don't change the word length etc, and 'or' in the pattern not overwrite |USART_CR1_M_8N1); regs->CR1 |= USART_CR1_UE; } } @@ -111,11 +111,11 @@ void WifiSerial::begin(uint32 baud, uint8_t config) { usart_enable_no_irq(this->usart_device, baud == WIFI_BAUDRATE); } -void WifiSerial::end(void) { +void WifiSerial::end() { usart_disable(this->usart_device); } -int WifiSerial::available(void) { +int WifiSerial::available() { return usart_data_available(this->usart_device); } @@ -123,7 +123,7 @@ int WifiSerial::available(void) { // I/O // -int WifiSerial::read(void) { +int WifiSerial::read() { if (usart_data_available(usart_device) <= 0) return -1; return usart_getc(usart_device); } @@ -133,7 +133,7 @@ int WifiSerial::write(unsigned char ch) { return 1; } -int WifiSerial::wifi_rb_is_full(void) { +int WifiSerial::wifi_rb_is_full() { return rb_is_full(this->usart_device->rb); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h index 656ec1b9d0..c2885ccc90 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h @@ -58,8 +58,8 @@ class WifiSerial { void begin(uint32 baud); void begin(uint32 baud,uint8_t config); void end(); - int available(void); - int read(void); + int available(); + int read(); int write(uint8_t); inline void wifi_usart_irq(usart_reg_map *regs) { /* Handling RXNEIE and TXEIE interrupts. @@ -87,8 +87,7 @@ class WifiSerial { } } - int wifi_rb_is_full(void); - + int wifi_rb_is_full(); struct usart_dev *usart_device; private: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index dce4ce5977..eefdbafbda 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -183,7 +183,7 @@ static bool longName2DosName(const char *longName, uint8_t *dosName) { uint8_t c = *longName++; if (c == '.') { // For a dot... if (i == 0) return false; - strcat((char *)dosName, ".GCO"); + strcat_P((char *)dosName, PSTR(".GCO")); break; } else { @@ -194,7 +194,7 @@ static bool longName2DosName(const char *longName, uint8_t *dosName) { dosName[i++] = c + (WITHIN(c, 'a', 'z') ? 'A' - 'a' : 0); // Uppercase required for 8.3 name } if (i >= 5) { - strcat((char *)dosName, "~1.GCO"); + strcat_P((char *)dosName, PSTR("~1.GCO")); break; } } @@ -212,7 +212,6 @@ static int storeRcvData(volatile uint8_t *bufToCpy, int32_t len) { wifiDmaRcvFifo.write_cur = (tmpW + 1) % TRANS_RCV_FIFO_BLOCK_NUM; return 1; } - return 0; } @@ -253,6 +252,7 @@ static void dma_ch5_irq_handle() { WIFI_IO1_SET(); } } + static void wifi_usart_dma_init() { dma_init(DMA1); uint32_t flags = ( DMA_MINC_MODE | DMA_TRNS_CMPLT | DMA_HALF_TRNS | DMA_TRNS_ERR); @@ -289,7 +289,7 @@ void esp_port_begin(uint8_t interrupt) { if (interrupt) { for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } WIFISERIAL.begin(WIFI_BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; + millis_t serial_connect_timeout = millis() + 1000UL; while (PENDING(millis(), serial_connect_timeout)) { /*nada*/ } } else { @@ -305,7 +305,7 @@ void esp_port_begin(uint8_t interrupt) { WIFISERIAL.end(); for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } WIFISERIAL.begin(interrupt ? WIFI_BAUDRATE : WIFI_UPLOAD_BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; + millis_t serial_connect_timeout = millis() + 1000UL; while (PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif if (!interrupt) wifi_usart_dma_init(); @@ -511,16 +511,16 @@ int write_to_file(char *buf, int len) { res = upload_file.write(public_buf, file_writer.write_index); } } - if (res == -1) { - return -1; - } + + if (res == -1) return -1; + upload_file.getpos(&pos); file_writer.write_index = 0; } } if (res == -1) { - memset(public_buf, 0, sizeof(public_buf)); + ZERO(public_buf); file_writer.write_index = 0; return -1; } @@ -576,17 +576,16 @@ uint8_t Explore_Disk(char* path , uint8_t recu_level) { for (uint8_t i = 0; i < fileCnt; i++) { card.getfilename_sorted(SD_ORDER(i, fileCnt)); - - memset(tmp, 0, sizeof(tmp)); + ZERO(tmp); strcpy(tmp, card.filename); ZERO(Fstream); strcpy(Fstream, tmp); if (card.flag.filenameIsDir && recu_level <= 10) - strcat(Fstream, ".DIR"); + strcat_P(Fstream, PSTR(".DIR")); - strcat(Fstream, "\r\n"); + strcat_P(Fstream, PSTR("\r\n")); send_to_wifi((uint8_t*)Fstream, strlen(Fstream)); } @@ -662,23 +661,23 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { int index = 0; while (tmpStr[index] == ' ') index++; - if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { + if (strstr_P((char *)&tmpStr[index], PSTR(".g")) || strstr_P((char *)&tmpStr[index], PSTR(".G"))) { if (strlen((char *)&tmpStr[index]) < 80) { ZERO(list_file.file_name[sel_id]); ZERO(list_file.long_name[sel_id]); uint8_t has_path_selected = 0; if (gCfgItems.wifi_type == ESP_WIFI) { - if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { + if (strncmp_P((char *)&tmpStr[index], PSTR("1:"), 2) == 0) { gCfgItems.fileSysType = FILE_SYS_SD; has_path_selected = 1; } - else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { + else if (strncmp_P((char *)&tmpStr[index], PSTR("0:"), 2) == 0) { gCfgItems.fileSysType = FILE_SYS_USB; has_path_selected = 1; } else if (tmpStr[index] != '/') - strcat((char *)list_file.file_name[sel_id], "/"); + strcat_P((char *)list_file.file_name[sel_id], PSTR("/")); if (file_writer.fileTransfer == 1) { uint8_t dosName[FILENAME_LENGTH]; @@ -686,12 +685,11 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { fileName[0] = '\0'; if (has_path_selected == 1) { strcat((char *)fileName, (char *)&tmpStr[index + 3]); - strcat((char *)list_file.file_name[sel_id], "/"); + strcat_P((char *)list_file.file_name[sel_id], PSTR("/")); } else strcat((char *)fileName, (char *)&tmpStr[index]); - if (!longName2DosName((const char *)fileName, dosName)) { - strcpy(list_file.file_name[sel_id], "notValid"); - } + if (!longName2DosName((const char *)fileName, dosName)) + strcpy_P(list_file.file_name[sel_id], PSTR("notValid")); strcat((char *)list_file.file_name[sel_id], (char *)dosName); strcat((char *)list_file.long_name[sel_id], (char *)dosName); } @@ -712,7 +710,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { send_to_wifi((uint8_t *)"File selected\r\n", strlen("File selected\r\n")); else { send_to_wifi((uint8_t *)"file.open failed\r\n", strlen("file.open failed\r\n")); - strcpy(list_file.file_name[sel_id], "notValid"); + strcpy_P(list_file.file_name[sel_id], PSTR("notValid")); } SEND_OK_TO_WIFI; } @@ -721,7 +719,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { break; case 24: - if (strcmp(list_file.file_name[sel_id], "notValid") != 0) { + if (strcmp_P(list_file.file_name[sel_id], PSTR("notValid")) != 0) { if (uiCfg.print_state == IDLE) { clear_cur_ui(); reset_print_time(); @@ -830,7 +828,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)|| (uiCfg.print_state == REPRINTING)) { print_rate = uiCfg.totalSend; ZERO(tempBuf); - sprintf((char *)tempBuf, "M27 %d\r\n", print_rate); + sprintf_P((char *)tempBuf, PSTR("M27 %d\r\n"), print_rate); send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } break; @@ -842,16 +840,16 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { int index = 0; while (tmpStr[index] == ' ') index++; - if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { + if (strstr_P((char *)&tmpStr[index], PSTR(".g")) || strstr_P((char *)&tmpStr[index], PSTR(".G"))) { strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); if (gCfgItems.fileSysType == FILE_SYS_SD) { ZERO(tempBuf); - sprintf((char *)tempBuf, "%s", file_writer.saveFileName); + sprintf_P((char *)tempBuf, PSTR("%s"), file_writer.saveFileName); } else if (gCfgItems.fileSysType == FILE_SYS_USB) { ZERO(tempBuf); - sprintf((char *)tempBuf, "%s", (char *)file_writer.saveFileName); + sprintf_P((char *)tempBuf, PSTR("%s"), (char *)file_writer.saveFileName); } mount_file_sys(gCfgItems.fileSysType); @@ -862,7 +860,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ZERO(file_writer.saveFileName); strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); ZERO(tempBuf); - sprintf((char *)tempBuf, "Writing to file: %s\r\n", (char *)file_writer.saveFileName); + sprintf_P((char *)tempBuf, PSTR("Writing to file: %s\r\n"), (char *)file_writer.saveFileName); wifi_ret_ack(); send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); wifi_link_state = WIFI_WAIT_TRANS_START; @@ -881,7 +879,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ZERO(tempBuf); if (cmd_value == 105) { SEND_OK_TO_WIFI; - sprintf((char *)tempBuf,"T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n", + sprintf_P((char *)tempBuf, PSTR("T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n"), (float)thermalManager.temp_hotend[0].celsius, (float)thermalManager.temp_hotend[0].target, #if HAS_HEATED_BED @@ -890,7 +888,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { 0.0f, 0.0f, #endif (float)thermalManager.temp_hotend[0].celsius, (float)thermalManager.temp_hotend[0].target, - #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + #if DISABLED(SINGLENOZZLE) && HAS_MULTI_EXTRUDER (float)thermalManager.temp_hotend[1].celsius, (float)thermalManager.temp_hotend[1].target #else 0.0f, 0.0f @@ -898,7 +896,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ); } else { - sprintf((char *)tempBuf,"T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n", + sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, #if HAS_HEATED_BED @@ -907,7 +905,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { 0, 0, #endif (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, - #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + #if DISABLED(SINGLENOZZLE) && HAS_MULTI_EXTRUDER (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target #else 0, 0 @@ -922,7 +920,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { case 992: if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { ZERO(tempBuf); - sprintf((char *)tempBuf, "M992 %d%d:%d%d:%d%d\r\n", print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); + sprintf_P((char *)tempBuf, PSTR("M992 %d%d:%d%d:%d%d\r\n"), print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); wifi_ret_ack(); send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } @@ -932,7 +930,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { ZERO(tempBuf); if (strlen((char *)list_file.file_name[sel_id]) > (100 - 1)) return; - sprintf((char *)tempBuf, "M994 %s;%d\n", list_file.file_name[sel_id],(int)gCfgItems.curFilesize); + sprintf_P((char *)tempBuf, PSTR("M994 %s;%d\n"), list_file.file_name[sel_id], (int)gCfgItems.curFilesize); wifi_ret_ack(); send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } @@ -976,7 +974,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { break; default: - strcat((char *)cmd_line, "\n"); + strcat_P((char *)cmd_line, PSTR("\n")); if (espGcodeFifo.wait_tick > 5) { uint32_t left; @@ -1002,7 +1000,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } } else { - strcat((char *)cmd_line, "\n"); + strcat_P((char *)cmd_line, PSTR("\n")); if (espGcodeFifo.wait_tick > 5) { uint32_t left_g; @@ -1045,7 +1043,7 @@ static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { if (msgLen <= 0) return; // ip - sprintf(ipPara.ip_addr, "%d.%d.%d.%d", msg[0], msg[1], msg[2], msg[3]); + sprintf_P(ipPara.ip_addr, PSTR("%d.%d.%d.%d"), msg[0], msg[1], msg[2], msg[3]); // port // connect state @@ -1143,16 +1141,15 @@ static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { memset(str, 0, WIFI_NAME_BUFFER_SIZE); memcpy(str, &msg[wifiMsgIdex], wifiNameLen); for (j = 0; j < valid_name_num; j++) { - if (strcmp((const char *)str,(const char *)wifi_list.wifiName[j]) == 0) { + if (strcmp((const char *)str, (const char *)wifi_list.wifiName[j]) == 0) { wifi_name_is_same = 1; break; } } - if (wifi_name_is_same != 1) { - if (str[0] > 0x80) { - wifi_name_is_same = 1; - } - } + + if (wifi_name_is_same != 1 && str[0] > 0x80) + wifi_name_is_same = 1; + if (wifi_name_is_same == 1) { wifi_name_is_same = 0; wifiMsgIdex += wifiNameLen; @@ -1199,7 +1196,7 @@ static void gcode_msg_handle(uint8_t * msg, uint16_t msgLen) { } } -void utf8_2_unicode(uint8_t *source,uint8_t Len) { +void utf8_2_unicode(uint8_t *source, uint8_t Len) { uint8_t i = 0, char_i = 0, char_byte_num = 0; uint16_t u16_h, u16_m, u16_l, u16_value; uint8_t FileName_unicode[30]; @@ -1216,7 +1213,6 @@ void utf8_2_unicode(uint8_t *source,uint8_t Len) { } else if (char_byte_num == 0XC0 || char_byte_num == 0XD0) { //--2byte - u16_h = (((uint16_t)source[i] << 8) & 0x1F00) >> 2; u16_l = ((uint16_t)source[i + 1] & 0x003F); u16_value = (u16_h | u16_l); @@ -1241,9 +1237,9 @@ void utf8_2_unicode(uint8_t *source,uint8_t Len) { i += 4; //char_i += 3; } - else { + else break; - } + if (i >= Len || i >= 255) break; } COPY(source, FileName_unicode); @@ -1297,7 +1293,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); return; } - sprintf((char *)saveFilePath, "%s", dosName); + sprintf_P((char *)saveFilePath, PSTR("%s"), dosName); card.cdroot(); upload_file.close(); @@ -1386,8 +1382,7 @@ static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { } void esp_data_parser(char *cmdRxBuf, int len) { - int32_t head_pos; - int32_t tail_pos; + int32_t head_pos, tail_pos; uint16_t cpyLen; int16_t leftLen = len; bool loop_again = false; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 2776db3cac..f4412f3830 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -338,6 +338,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t // Extract elements from the header resp = (uint8_t)getData(1, hdr, 0); opRet = (uint8_t)getData(1, hdr, 1); + // Sync packets often provoke a response with a zero opcode instead of ESP_SYNC if (resp != 0x01 || opRet != op) return respHeader; @@ -666,14 +667,12 @@ int32_t wifi_upload(int type) { ResetWiFiForUpload(0); - if (type == 0) - SendUpdateFile(ESP_FIRMWARE_FILE, FirmwareAddress); - else if (type == 1) - SendUpdateFile(ESP_WEB_FIRMWARE_FILE, FirmwareAddress); - else if (type == 2) - SendUpdateFile(ESP_WEB_FILE, WebFilesAddress); - else - return -1; + switch (type) { + case 0: SendUpdateFile(ESP_FIRMWARE_FILE, FirmwareAddress); break; + case 1: SendUpdateFile(ESP_WEB_FIRMWARE_FILE, FirmwareAddress); break; + case 2: SendUpdateFile(ESP_WEB_FILE, WebFilesAddress); break; + default: return -1; + } while (esp_upload.state != upload_idle) { upload_spin(); diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp index ea0bf0f00a..3f604005f9 100644 --- a/Marlin/src/lcd/tft/tft_queue.cpp +++ b/Marlin/src/lcd/tft/tft_queue.cpp @@ -142,7 +142,6 @@ void TFT_Queue::canvas(queueTask_t *task) { if (Canvas.ToScreen()) task->state = TASK_STATE_COMPLETED; } - void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { finish_sketch(); diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index dc96758e6d..be5b4290dd 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -330,9 +330,8 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui pBuffer += count; SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp); } - else { + else SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); - } } else { // NumByteToWrite > SPI_FLASH_PageSize NumByteToWrite -= count; @@ -387,9 +386,9 @@ void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint pBuffer++; } } - else { + else spi_flash_Read(pBuffer, NumByteToRead); - } + W25QXX_CS_H; } From a588f69f1639ad3339f970ed136beeca0d91f11d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 14 Jan 2021 00:43:47 -0600 Subject: [PATCH 0876/1370] MKS prelim. cleanup (2) --- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 10 +--- .../extui/lib/mks_ui/printer_operation.cpp | 8 +-- .../extui/lib/mks_ui/tft_multi_language.cpp | 56 +++++-------------- 3 files changed, 19 insertions(+), 55 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 2fdd2c3f2c..b9af6d33a8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -55,20 +55,16 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_E_ADD: if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), uiCfg.extruStep, 60 * uiCfg.extruSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); + sprintf_P((char *)public_buf_l, PSTR("G91\nG1 E%d F%d\nG90"), uiCfg.extruStep, 60 * uiCfg.extruSpeed); + queue.inject(public_buf_l); extrudeAmount += uiCfg.extruStep; disp_extru_amount(); } break; case ID_E_DEC: if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); + sprintf_P((char *)public_buf_l, PSTR("G91\nG1 E%d F%d\nG90"), 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); extrudeAmount -= uiCfg.extruStep; disp_extru_amount(); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 61168fe0ec..4467df59d9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -59,10 +59,8 @@ void printer_state_polling() { uiCfg.current_z_position_bak = current_position.z; if (gCfgItems.pausePosZ != (float)-1) { - gcode.process_subcommands_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z%.1f"), gCfgItems.pausePosZ); + sprintf_P(public_buf_l, PSTR("G91\nG1 Z%.1f\nG90"), gCfgItems.pausePosZ); gcode.process_subcommands_now(public_buf_l); - gcode.process_subcommands_now_P(PSTR("G90")); } if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { sprintf_P(public_buf_l, PSTR("G1 X%.1f Y%.1f"), gCfgItems.pausePosX, gCfgItems.pausePosY); @@ -128,10 +126,8 @@ void printer_state_polling() { gcode.process_subcommands_now(public_buf_m); if (gCfgItems.pause_reprint && gCfgItems.pausePosZ != -1.0f) { - gcode.process_subcommands_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); + sprintf_P(public_buf_l, PSTR("G91\nG1 Z-%.1f\nG90"), gCfgItems.pausePosZ); gcode.process_subcommands_now(public_buf_l); - gcode.process_subcommands_now_P(PSTR("G90")); } #endif uiCfg.print_state = WORKING; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 0401faeebd..7db5e80561 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -945,27 +945,13 @@ void disp_language_init() { filesys_menu.usb_sys = U_DISK_TEXT_CN; // more_menu.title = TITLE_MORE_CN; - #if ENABLED(USER_CMD_1_ENABLE) - more_menu.custom1 = MORE_CUSTOM1_TEXT_CN; - #endif - #if ENABLED(USER_CMD_2_ENABLE) - more_menu.custom2 = MORE_CUSTOM2_TEXT_CN; - #endif - #if ENABLED(USER_CMD_3_ENABLE) - more_menu.custom3 = MORE_CUSTOM3_TEXT_CN; - #endif - #if ENABLED(USER_CMD_4_ENABLE) - more_menu.custom4 = MORE_CUSTOM4_TEXT_CN; - #endif - #if ENABLED(USER_CMD_5_ENABLE) - more_menu.custom5 = MORE_CUSTOM5_TEXT_CN; - #endif - #if ENABLED(USER_CMD_6_ENABLE) - more_menu.custom6 = MORE_CUSTOM6_TEXT_CN; - #endif - #if ENABLED(USER_CMD_7_ENABLE) - more_menu.custom7 = MORE_CUSTOM7_TEXT_CN; - #endif + TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_CN); + TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_CN); + TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_CN); + TERN_(USER_CMD_4_ENABLE, more_menu.custom4 = MORE_CUSTOM4_TEXT_CN); + TERN_(USER_CMD_5_ENABLE, more_menu.custom5 = MORE_CUSTOM5_TEXT_CN); + TERN_(USER_CMD_6_ENABLE, more_menu.custom6 = MORE_CUSTOM6_TEXT_CN); + TERN_(USER_CMD_7_ENABLE, more_menu.custom7 = MORE_CUSTOM7_TEXT_CN); // WIFI wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_CN; @@ -1191,27 +1177,13 @@ void disp_language_init() { filesys_menu.usb_sys = U_DISK_TEXT_T_CN; // more_menu.title = TITLE_MORE_T_CN; - #if ENABLED(USER_CMD_1_ENABLE) - more_menu.custom1 = MORE_CUSTOM1_TEXT_T_CN; - #endif - #if ENABLED(USER_CMD_2_ENABLE) - more_menu.custom2 = MORE_CUSTOM2_TEXT_T_CN; - #endif - #if ENABLED(USER_CMD_3_ENABLE) - more_menu.custom3 = MORE_CUSTOM3_TEXT_T_CN; - #endif - #if ENABLED(USER_CMD_4_ENABLE) - more_menu.custom4 = MORE_CUSTOM4_TEXT_T_CN; - #endif - #if ENABLED(USER_CMD_5_ENABLE) - more_menu.custom5 = MORE_CUSTOM5_TEXT_T_CN; - #endif - #if ENABLED(USER_CMD_6_ENABLE) - more_menu.custom6 = MORE_CUSTOM6_TEXT_T_CN; - #endif - #if ENABLED(USER_CMD_7_ENABLE) - more_menu.custom7 = MORE_CUSTOM7_TEXT_T_CN; - #endif + TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_T_CN); + TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_T_CN); + TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_T_CN); + TERN_(USER_CMD_4_ENABLE, more_menu.custom4 = MORE_CUSTOM4_TEXT_T_CN); + TERN_(USER_CMD_5_ENABLE, more_menu.custom5 = MORE_CUSTOM5_TEXT_T_CN); + TERN_(USER_CMD_6_ENABLE, more_menu.custom6 = MORE_CUSTOM6_TEXT_T_CN); + TERN_(USER_CMD_7_ENABLE, more_menu.custom7 = MORE_CUSTOM7_TEXT_T_CN); // WIFI wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_T_CN; From f5341da94d2193c4c767cc52fd6ca8dd03d063ad Mon Sep 17 00:00:00 2001 From: vitaliy172 <68148475+vitaliy172@users.noreply.github.com> Date: Thu, 14 Jan 2021 10:21:28 +0200 Subject: [PATCH 0877/1370] Update Ukrainian language (#20668) --- Marlin/src/lcd/language/language_uk.h | 270 +++++++++++++------------- buildroot/share/fonts/genallfont.sh | 2 +- 2 files changed, 140 insertions(+), 132 deletions(-) diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index b0bffd2009..eb69bc1b74 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -66,7 +66,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("ÐвтоÑтарт"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Вимкнути двигуни"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню Debug"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("ТеÑÑ‚ Progress Bar"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("ТеÑÑ‚ лінії прогр."); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ðвто паркуваннÑ"); PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ X"); PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ Y"); @@ -83,10 +83,10 @@ namespace Language_uk { #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ð’Ñтанов. Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼Ñƒ"); #else - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ð’Ñтанов.зміщ.дому"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ð’Ñтанов. зміщ. дому"); #endif PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¹Ð½ÑÑ‚Ñ–"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ð’Ñтановити ноль"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ð’Ñтановити нуль"); #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Ðагрів ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ðагрів ") PREHEAT_1_LABEL " ~"; @@ -104,11 +104,10 @@ namespace Language_uk { PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Ðагрів $ Ñтіл"); PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Ðагрів $ налашт"); #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Ðагрів Свій"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Ðагрів Ñвого"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Вимкнути нагрів"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ð°Ð·ÐµÑ€Ð¾Ð¼"); - PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Перемкнути лазер"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_LASER_POWER = _UxGT("ПотужніÑÑ‚ÑŒ лазера"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐ¿Ñ–Ð½Ð´ÐµÐ»ÐµÐ¼"); @@ -117,13 +116,14 @@ namespace Language_uk { PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керув. шпінделем"); #endif PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Перемкнути шпіндель"); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Перемкнути лазер"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінделÑ"); #else PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінд."); #endif PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Шпіндель вперед"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("ÐапрÑмок шпінделÑ"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Шпіндель назад"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Увімкнути живленнÑ"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Вимкнути живленнÑ"); @@ -133,6 +133,12 @@ namespace Language_uk { PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ð’Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñтолу"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("ВирівнÑти Ñтіл"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("ВирівнÑти кути"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Вгору до ÑÐ¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð½Ð´Ñƒ"); // not sure about this one + #else + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Вгору до Ñпрацюв. зонду"); + #endif + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Кути в межах. Ð’Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñтолу"); // Too long? PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("ÐаÑтупний кут"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ Z"); @@ -152,13 +158,13 @@ namespace Language_uk { PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Зонд за межами"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("ВідхиленнÑ"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Меню IDEX"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Режим IDEX"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñопел"); PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Ðвто паркуваннÑ"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("РозмноженнÑ"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("ДуплікаціÑ"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Дзеркальна копіÑ"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Повний контроль"); - PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("Дублювати X-зазор"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("Дублюв. X-проміжок"); PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("Друге Ñопло X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("Друге Ñопло Y"); @@ -167,7 +173,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("ВиконуєтьÑÑ G29"); PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("ІнÑтрументи UBL"); PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ UBL"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Точка розвороту"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Точка нахилу"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручне Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñітки"); PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("РозміÑтити шайбу Ñ– вимір."); @@ -176,15 +182,15 @@ namespace Language_uk { PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Розм. шайбу Ñ– вимір."); #endif PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("ВимірюваннÑ"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Видалити Ñ– вимірÑти"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("До наÑтупної точки"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Видалити Ñ– вимірÑти Ñтіл"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Рух до наÑтупної"); PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Ðктивувати UBL"); PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивувати UBL"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура Ñтолу"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура Ñтолу"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура Ñвого Ñтолу"); PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура Ñопла"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура Ñопла"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура Ñвого Ñопла"); PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати Ñвою Ñітку"); PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñітки"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати Ñвою Ñітку"); @@ -201,20 +207,21 @@ namespace Language_uk { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Сітка побудована"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Будувати Ñітку"); #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Будувати Ñітку $"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Підтвердити $"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Будувати Ñітку ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Підтвердити ($)"); #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Буд. холодну Ñітку"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ð’Ñтан.виÑоту Ñітки"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("ВиÑота"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Підтвердити Ñітку"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Підтвердити Ñвою"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрів Ñтолу"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрів Ñопла"); PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ручне грунтуваннÑ"); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Грунт фікÑ. довж."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("ФікÑ. довж. грунт."); // Ò‘ is not supported PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Грунтув. виконане"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 завершена"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 ÑкаÑовано"); PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Вийти з G26"); PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Продовжити Ñітку"); PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Ð’Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñітки"); @@ -242,7 +249,11 @@ namespace Language_uk { PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Заповнити Ñітку"); PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Ðнулювати вÑе"); PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Ðнулювати найближчу"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налашт. вÑе"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налаштувати вÑе"); + #else + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налашт. вÑе"); + #endif #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно налашт.найближчу"); #else @@ -260,7 +271,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z: "); PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z зупинено"); PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL покроково"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Будувати холодну"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Збудувати холодну"); PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Розумне заповн-Ñ"); PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Затвердити Ñітку"); PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точно налашт.вÑе"); @@ -276,7 +287,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("ПередуÑтан. Ñвітла"); #endif PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Червоний"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Оранжевий"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Помаранчевий"); PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Жовтий"); PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Зелений"); PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Синій"); @@ -287,19 +298,19 @@ namespace Language_uk { PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Канал ="); PROGMEM Language_Str MSG_LEDS2 = _UxGT("Світло #2"); #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Світло #2 передуÑтановки"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("ПередуÑтановка Ñвітла #2"); #else - PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Світло #2 передуÑтан."); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("ПередуÑтан. Ñвітла #2"); #endif PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("ЯÑкравіÑÑ‚ÑŒ"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Свої кольори"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Своє Ñвітло"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Рівень червоного"); PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Рівень зеленого"); PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Рівень Ñинього"); PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Рівень білого"); PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("ЯÑкравіÑÑ‚ÑŒ"); - PROGMEM Language_Str MSG_MOVING = _UxGT("ПереміщеннÑ..."); + PROGMEM Language_Str MSG_MOVING = _UxGT("Рух..."); PROGMEM Language_Str MSG_FREE_XY = _UxGT("Звільнити XY"); PROGMEM Language_Str MSG_MOVE_X = _UxGT("Рух по X"); PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Рух по Y"); @@ -307,34 +318,32 @@ namespace Language_uk { PROGMEM Language_Str MSG_MOVE_E = _UxGT("ЕкÑтрудер"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("ЕкÑтрудер *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Сопло дуже холодне"); - PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Рух по %sмм"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Рух по 0.1мм"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Рух по 1мм"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Рух по 10мм"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Рух %sмм"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Рух 0.1мм"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Рух 1мм"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Рух 10мм"); PROGMEM Language_Str MSG_SPEED = _UxGT("ШвидкіÑÑ‚ÑŒ"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Столу"); PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C"; PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Сопло ~"); PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Сопло запарковане"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Сопло очикує"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Сопло очікує"); PROGMEM Language_Str MSG_BED = _UxGT("Стіл, ") LCD_STR_DEGREE "C"; PROGMEM Language_Str MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("ОхолодженнÑ"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ~"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Швидк. вент."); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Швидк. вент. ~"); #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збережене охолодж. ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Додаткове охолодж."); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Додаткове охолодж. ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Контролер охолодженнÑ"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збереж. швидк. вент. ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Дод. швидк. вент. ~"); #else - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збереж.охолодж. ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Додат. охолодж."); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Додат.охолодж ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Контролер охолодж."); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збереж. вент. ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Додат.вент. ~"); #endif + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Вент. контролера"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Дод. швидк. вент."); PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("ХолоÑÑ‚Ñ– оберти"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Робочі оберти"); PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Ðвто-режим"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Робочі оберти"); PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Період проÑтою"); PROGMEM Language_Str MSG_FLOW = _UxGT("Потік"); PROGMEM Language_Str MSG_FLOW_N = _UxGT("Потік ~"); @@ -351,7 +360,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Підбір PID виконано"); PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Збій автопідбору. Поганий екÑтрудер."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Збій автопідбору. Температура завищена."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Збій автопідбору! Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ‡Ð°Ñу."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Збій автопідбору! Вичерпан чаÑ."); PROGMEM Language_Str MSG_SELECT = _UxGT("Вибрати"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Вибрати *"); @@ -393,7 +402,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); PROGMEM Language_Str MSG_MOTION = _UxGT("Рух"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Пруток"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм") SUPERSCRIPT_THREE; + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E, мм") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E обмеж.,мм") SUPERSCRIPT_THREE; PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E обмеж. *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Діам. прутка"); @@ -444,13 +453,14 @@ namespace Language_uk { PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Відновити друк"); PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Старт з хоÑту"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("СкаÑувати друк"); + PROGMEM Language_Str MSG_END_LOOPS = _UxGT("End Repeat Loops"); // needs translation PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Друк об'єкта"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Завершити об'єкт"); PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Завершити об'єкт ="); PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Віднов. піÑÐ»Ñ Ð·Ð±Ð¾ÑŽ"); PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Друкувати з SD"); PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD-картки немає"); - PROGMEM Language_Str MSG_DWELL = _UxGT("СплÑчка..."); + PROGMEM Language_Str MSG_DWELL = _UxGT("Сон..."); PROGMEM Language_Str MSG_USERWAIT = _UxGT("Продовжити..."); PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Друк призупинено"); PROGMEM Language_Str MSG_PRINTING = _UxGT("Друк..."); @@ -462,6 +472,8 @@ namespace Language_uk { #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ð’Ñ‚ÑгуваннÑ, мм"); PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Зміна втÑгув.,мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ретракт V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Стрибок, мм"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("ПоверненнÑ, мм"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Поверн.зміни, мм"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ÐвтовтÑгуваннÑ"); @@ -476,8 +488,8 @@ namespace Language_uk { PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("ПідÑкок, мм"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ÐŸÐ¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Поверн.зміни V"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("ПомінÑти довжини"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("ПомінÑти додатково"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Змінити довжини"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Змінити додатково"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("ОчиÑтити довжину"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Зміна Ñопла"); PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("ПіднÑти по Z"); @@ -491,11 +503,11 @@ namespace Language_uk { PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Паркувати голову"); PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Відновити швидкіÑÑ‚ÑŒ"); #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти охолодженнÑ"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Ð§Ð°Ñ Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти вентилÑтора"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Ð§Ð°Ñ Ð²ÐµÐ½Ñ‚Ð¸Ð»Ñтора"); #else - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти охолодж."); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Ð§Ð°Ñ Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶."); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти вент."); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Ð§Ð°Ñ Ð²ÐµÐ½Ñ‚."); #endif PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Ðвто Увімк."); PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Ðвто Вимкн."); @@ -512,34 +524,34 @@ namespace Language_uk { PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Видалити вÑе"); PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Ð’Ñтавити SD-картку"); PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Заміна SD-картки"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Звільніть SD-картку"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Видаліть SD-картку"); PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-Зонд поза Ñтолом"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Фактор нахилу"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("Z-зонд BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Само-ТеÑÑ‚"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Зкинути BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Само-теÑÑ‚"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Зкинути зонд"); PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("ПіднÑти зонд"); PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("ОпуÑтити зонд"); PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Режим SW"); PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Режим 5V"); PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Режим OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Режим збереженнÑ"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Ð’Ñтановити на 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Ð’Ñтановити на OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Злив звіту"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ÐЕБЕЗПЕКÐ: Ðеправильні параметри приводÑÑ‚ÑŒ до пошкоджень! Продовжувати?"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Ð’Ñтановити BLT на 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Ð’Ñтановити BLT на OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Звітувати злив"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ÐЕБЕЗПЕКÐ: Ðеправильні параметри приводÑÑ‚ÑŒ до пошкоджень! Продовжити?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("Z-Зонд TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("ІніціалізаціÑ"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Ініц. TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("ТеÑÑ‚ Z-зміщеннÑ"); PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Зберегти"); PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("УÑтановити TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("УÑтановити зонд"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Завантажити зонд"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Дім %s%s%s перший"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("УÑтановити Z-зонд"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Завантажити Z-зонд"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Спочатку дім %s%s%s"); PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð¾Ð½Ð´Ñƒ"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ X"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Y"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ X"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ Y"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ Z"); PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Рухати Ñопло до Ñтолу"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Мікрокрок X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Мікрокрок Y"); @@ -551,7 +563,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ВИТІК ТЕПЛÐ"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ВИТІК ТЕПЛРСТОЛУ"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ВИТІК ТЕПЛРКÐМЕРИ"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ПЕРЕГРІВ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ÐœÐКСИМÐЛЬÐРТ"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE; PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИÐТЕР ЗУПИÐЕÐО"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Перезавантажте"); @@ -563,16 +575,15 @@ namespace Language_uk { PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ðагрів Ñтолу..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ðагрів камери..."); PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Ðагрів зонду..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("ÐšÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Delta"); #if LCD_WIDTH >= 20 PROGMEM Language_Str MSG_BED_COOLING = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñтолу..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ð¸..."); PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð½Ð´Ñƒ..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("ÐšÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Delta"); #else PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охол. Ñтолу..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охол. камери..."); PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Охол. зонду..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібрув. Delta"); #endif PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калібрувати X"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калібрувати Y"); @@ -580,41 +591,32 @@ namespace Language_uk { PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калібр. центр"); PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Параметри Delta"); PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("ÐвтокалібруваннÑ"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("ВиÑота Delta"); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Ð—Ð¾Ð½Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Z-зміщ."); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стрижень діагоналі"); - #else - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондув. Z-зміщ."); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стрижень діаг."); - #endif + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Ð’Ñтан. ВиÑоту Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z-Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð¾Ð½Ð´Ñƒ"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Діагональ ÑтрижнÑ"); PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("ВиÑота"); PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("РадіуÑ"); PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Про принтер"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Данні принтера"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Дані принтера"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точкове вирівнюваннÑ"); PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівнюваннÑ"); PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівнюваннÑ"); - #elif LCD_WIDTH == 20 - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точкове вирівнюв."); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівнюван."); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівнюв."); #else - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точк. вирівн."); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точкове вирівн."); PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівн."); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білін. вирівнюв."); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівн."); #endif - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ UBL"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("UBL"); PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Ð’Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñітки"); PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("СтатиÑтика принтера"); PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Про плату"); PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("ТерміÑтори"); PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("ЕкÑтрудери"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Біт/Ñекунду"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Бод"); PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Протокол"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Вимк"); @@ -675,25 +677,29 @@ namespace Language_uk { PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Помилка зондуваннÑ"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ОБЕРІТЬ ПРУТОК"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Понови прошивку MMU!"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Онови прошивку MMU!"); PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU потребує уваги"); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Продовжити друк"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("ПродовженнÑ..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Завантажити пруток"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Завантажити вÑе"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Завантажити в Ñопло"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Звільнити пруток"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Звільнити пруток ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Вивантажити пруток"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ð—Ð²Ñ–Ð»ÑŒÐ½ÐµÐ½Ð½Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Ð’Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Ð’Ñе"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Пруток ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("ПерезапуÑк MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("ПерезапуÑк MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Видаліть, натиÑніть"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("MMU Продовжити"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("MMU ПродовженнÑ..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Завантажити"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("MMU Завантажити вÑе"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Завантажити в Ñопло"); + #else + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Завантаж. в Ñопло"); + #endif + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Звільнити"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Звільнити ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Вивантажити"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("MMU Завантаж. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("MMU ЗвільненнÑ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("MMU ВивантаженнÑ..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("MMU Ð’Ñе"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("MMU Пруток ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU ПерезапуÑк"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU ПерезапуÑк..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("MMU Видаліть, натиÑніть"); #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_MIX = _UxGT("ЗмішуваннÑ"); @@ -704,43 +710,39 @@ namespace Language_uk { PROGMEM Language_Str MSG_MIXER = _UxGT("Змішувач"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Градієнт"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Повний градієнт"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Ð—Ð¼Ñ–ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡."); PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Циклічне змішуваннÑ"); PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Градієнт змішуваннÑ"); PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Змінити градієнт"); + #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перемкнути змішуваннÑ"); PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð’-інÑтрументу"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Початок Ð’-інÑтрументу"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Кінець Ð’-інÑтрументу"); PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдонім Ð’-інÑтрументу"); PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð—ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð’-інÑтрументів"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати Ð’-інÑтрументи"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрументи зкинуті"); #else - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перемкнути змішув."); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Ðктив.Ð’-інÑтрум."); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Ð’-інÑтрум. поч."); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ð’-інÑтрум. кін."); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдонім Ð’-інÑÑ‚Ñ€."); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð—ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð’-інÑтрум"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати Ð’-інÑтрум."); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрум. зкинуті"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Ðктив. Ð’-інÑтрум."); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдонім Ð’-інÑтрум."); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð—ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð’-інÑтрум."); #endif - PROGMEM Language_Str MSG_START_Z = _UxGT("Початок Z"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Кінець Z"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Початок Ð’-інÑтрументу"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Кінець Ð’-інÑтрументу"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати Ð’-інÑтрументи"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрументи зкинуті"); + + PROGMEM Language_Str MSG_START_Z = _UxGT("Початок Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Кінець Z:"); PROGMEM Language_Str MSG_GAMES = _UxGT("Ігри"); PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Цеглини"); PROGMEM Language_Str MSG_INVADERS = _UxGT("ВторгненнÑ"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Змійка"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Zм!йк@"); PROGMEM Language_Str MSG_MAZE = _UxGT("Лабіринт"); + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Погана Ñторінка"); #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Поганий Ñ–Ð½Ð´ÐµÐºÑ Ñторінки"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидкіÑÑ‚ÑŒ Ñторінки"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидкіÑÑ‚ÑŒ Ñтор."); #else - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Погана Ñторінка"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидк.Ñтор"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидк. Ñтор."); #endif PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Редагувати пароль"); @@ -749,21 +751,22 @@ namespace Language_uk { PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Введіть цифру"); PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Змінити пароль"); PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Видалити пароль"); - PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Пароль це "); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Пароль: "); PROGMEM Language_Str MSG_START_OVER = _UxGT("Старт через"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Запам'Ñтай Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ!"); - #else - PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Запам'Ñтай, збережи!"); - #endif + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Ðе забудь зберегти!"); PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Пароль видалений"); PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("ПаркуваннÑ...")); + + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // #if LCD_HEIGHT >= 4 // Up to 3 lines allowed PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("ÐатиÑніть кнопку", "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ", "друку")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Зачекайте", "на початок", "заміни прутка")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Ð’Ñтавте пруток", "та натиÑніть", "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Ð’Ñтавте пруток", "та натиÑніть", "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("ÐатиÑніть кнопку", "Ð´Ð»Ñ Ð½Ð°Ð³Ñ€Ñ–Ð²Ñƒ Ñопла")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Сопло нагріваєтьÑÑ", "зачекайте...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Зачекайте", "на вивід прутка")); @@ -799,7 +802,12 @@ namespace Language_uk { PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Рівень віÑÑ– X"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Ðвто калібруваннÑ"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Ð§Ð°Ñ Ð½Ð°Ð³Ñ€Ñ–Ð²Ð°Ñ‡Ð° збіг"); + + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñтою збіг, температура впала. ÐатиÑніть ОК, щоби знову нагріти та продовжити"); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Ð§Ð°Ñ Ð½Ð°Ð³Ñ€Ñ–Ð²Ð°Ñ‡Ð° збіг"); + #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("Поновити нагрів"); PROGMEM Language_Str MSG_REHEATING = _UxGT("ÐагріваннÑ..."); diff --git a/buildroot/share/fonts/genallfont.sh b/buildroot/share/fonts/genallfont.sh index 66f8e2c84f..820da187df 100755 --- a/buildroot/share/fonts/genallfont.sh +++ b/buildroot/share/fonts/genallfont.sh @@ -57,7 +57,7 @@ OLDWD=`pwd` # # Compile the 'genpages' command in-place # -(cd ${DN_EXEC}; gcc -o genpages genpages.c getline.c) +(cd ${DN_EXEC}; cc -o genpages genpages.c getline.c) # # By default loop through all languages From 7f8188ccb6eef61c5c4cd291a051c8db7747cb3f Mon Sep 17 00:00:00 2001 From: EvilGremlin Date: Thu, 14 Jan 2021 11:33:50 +0300 Subject: [PATCH 0878/1370] ESP32 Tone Generator (#20704) --- Marlin/src/HAL/ESP32/HAL.h | 7 ++++ Marlin/src/HAL/ESP32/Tone.cpp | 59 +++++++++++++++++++++++++++++++++ Marlin/src/HAL/ESP32/timers.cpp | 2 +- Marlin/src/HAL/ESP32/timers.h | 9 +++++ platformio.ini | 5 +-- 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 Marlin/src/HAL/ESP32/Tone.cpp diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 5ef13e0c21..be87737b0f 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -90,6 +90,13 @@ extern uint16_t HAL_adc_result; // Public functions // ------------------------ +// +// Tone +// +void toneInit(); +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); +void noTone(const pin_t _pin); + // clear reset reason void HAL_clear_reset_source(); diff --git a/Marlin/src/HAL/ESP32/Tone.cpp b/Marlin/src/HAL/ESP32/Tone.cpp new file mode 100644 index 0000000000..376c0f32e1 --- /dev/null +++ b/Marlin/src/HAL/ESP32/Tone.cpp @@ -0,0 +1,59 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * Copypaste of SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: Tone function for ESP32 + * Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012 + */ + +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" + +static pin_t tone_pin; +volatile static int32_t toggles; + +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { + tone_pin = _pin; + toggles = 2 * frequency * duration / 1000; + HAL_timer_start(TONE_TIMER_NUM, 2 * frequency); +} + +void noTone(const pin_t _pin) { + HAL_timer_disable_interrupt(TONE_TIMER_NUM); + WRITE(_pin, LOW); +} + +HAL_TONE_TIMER_ISR() { + HAL_timer_isr_prologue(TONE_TIMER_NUM); + + if (toggles) { + toggles--; + TOGGLE(tone_pin); + } + else noTone(tone_pin); // turn off interrupt +} + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/timers.cpp b/Marlin/src/HAL/ESP32/timers.cpp index 3300aea8a8..57662a6658 100644 --- a/Marlin/src/HAL/ESP32/timers.cpp +++ b/Marlin/src/HAL/ESP32/timers.cpp @@ -45,7 +45,7 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { { TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper { TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature { TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM - { TIMER_GROUP_1, TIMER_1, 1, nullptr }, // 3 + { TIMER_GROUP_1, TIMER_1, TONE_TIMER_PRESCALE, toneTC_Handler }, // 3 - Tone }; // ------------------------ diff --git a/Marlin/src/HAL/ESP32/timers.h b/Marlin/src/HAL/ESP32/timers.h index 98386e3980..a47697113d 100644 --- a/Marlin/src/HAL/ESP32/timers.h +++ b/Marlin/src/HAL/ESP32/timers.h @@ -44,6 +44,9 @@ typedef uint64_t hal_timer_t; #ifndef PWM_TIMER_NUM #define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs #endif +#ifndef TONE_TIMER_NUM + #define TONE_TIMER_NUM 3 // index of timer for beeper tones +#endif #define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals @@ -59,6 +62,8 @@ typedef uint64_t hal_timer_t; #define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts +#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here + #define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz #define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency @@ -90,11 +95,15 @@ typedef uint64_t hal_timer_t; #ifndef HAL_PWM_TIMER_ISR #define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler() #endif +#ifndef HAL_TONE_TIMER_ISR + #define HAL_TONE_TIMER_ISR() extern "C" void toneTC_Handler() +#endif extern "C" { void tempTC_Handler(); void stepTC_Handler(); void pwmTC_Handler(); + void toneTC_Handler(); } // ------------------------ diff --git a/platformio.ini b/platformio.ini index 81ed916eeb..24209ba1cf 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1483,12 +1483,13 @@ build_flags = ${stm32_flash_drive.build_flags} # Espressif ESP32 # [env:esp32] -platform = espressif32@1.11.2 +platform = espressif32@2.1.0 board = esp32dev build_flags = ${common.build_flags} -DCORE_DEBUG_LEVEL=0 src_filter = ${common.default_src_filter} + lib_ignore = NativeEthernet -upload_speed = 115200 +upload_speed = 500000 +monitor_speed = 250000 #upload_port = marlinesp.local #board_build.flash_mode = qio From fd6501207f881eb2ca167e2255b85ffa19dd3fe9 Mon Sep 17 00:00:00 2001 From: Jelmer van der Stel Date: Sat, 16 Jan 2021 00:23:04 +0100 Subject: [PATCH 0879/1370] Fix Ender 3 V2 encoder (#20784) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index ca1d7223f1..3126c46fb8 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -502,8 +502,7 @@ inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valr valref += EncoderRate.encoderMoveValue; else if (encoder_diffState == ENCODER_DIFF_CCW) valref -= EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_ENTER) - return true; + return encoder_diffState == ENCODER_DIFF_ENTER; } // From 1e7426e549186d2fecec6274aab993fd6b9704bf Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Thu, 14 Jan 2021 08:48:29 -0700 Subject: [PATCH 0880/1370] Silence unused parameter warnings --- Marlin/src/lcd/marlinui.cpp | 3 ++- Marlin/src/module/settings.cpp | 2 +- Marlin/src/module/temperature.h | 2 +- Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 430bfcf48e..d4e1357e86 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1450,7 +1450,8 @@ void MarlinUI::update() { #if ENABLED(STATUS_MESSAGE_SCROLLING) status_scroll_offset = 0; #endif - + #else // HAS_SPI_LCD + UNUSED(persist); #endif TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 0728840f5b..58cdd5296f 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2363,7 +2363,7 @@ void MarlinSettings::postprocess() { #if ENABLED(AUTO_BED_LEVELING_UBL) inline void ubl_invalid_slot(const int s) { - #if ENABLED(EEPROM_CHITCHAT) + #if BOTH(EEPROM_CHITCHAT, DEBUG_OUT) DEBUG_ECHOLNPGM("?Invalid slot."); DEBUG_ECHO(s); DEBUG_ECHOLNPGM(" mesh slots available."); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index aa4f2e7634..f570fe2107 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -69,7 +69,7 @@ hotend_pid_t; typedef IF<(LPQ_MAX_LEN > 255), uint16_t, uint8_t>::type lpq_ptr_t; #endif -#define PID_PARAM(F,H) _PID_##F(TERN(PID_PARAMS_PER_HOTEND, H, 0)) +#define PID_PARAM(F,H) _PID_##F(TERN(PID_PARAMS_PER_HOTEND, H, 0 & H)) // Always use 'H' to suppress warning #define _PID_Kp(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kp, NAN) #define _PID_Ki(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Ki, NAN) #define _PID_Kd(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kd, NAN) diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index e6980a03aa..5789121367 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -70,7 +70,7 @@ class Sd2Card { bool readBlock(uint32_t block, uint8_t* dst); bool writeBlock(uint32_t blockNumber, const uint8_t* src); - bool readCSD(csd_t* csd) { return true; }; + bool readCSD(csd_t*) { return true; } uint32_t cardSize(); static bool isInserted(); From a7c97182f7bb25239b041eac2db1719117ca7c12 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Fri, 15 Jan 2021 08:11:52 -0700 Subject: [PATCH 0881/1370] Fix compatibility macros --- .../src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h index 0f4bbbdb9a..9be7882a39 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h @@ -206,6 +206,10 @@ // Define macros for compatibility + // Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments + #define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT + #define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) + #define _CAT(a,V...) a##V #define CAT(a,V...) _CAT(a,V) From 0364ae49082428e821d813c80823fea99122a3fe Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Fri, 15 Jan 2021 12:59:27 -0700 Subject: [PATCH 0882/1370] Improve filament runout handling in FTDI EVE Touch UI - On filament runout, take the user to the tune menu where they can initiate a filament change or resume the print. --- .../screens/confirm_user_request_alert_box.cpp | 11 +++++++++-- .../extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp | 4 +++- Marlin/src/lcd/extui/ui_api.cpp | 4 ++++ Marlin/src/lcd/extui/ui_api.h | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index 637709e186..59e1c8220d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -36,8 +36,15 @@ void ConfirmUserRequestAlertBox::onRedraw(draw_mode_t mode) { bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { switch (tag) { case 1: - ExtUI::setUserConfirmed(); - GOTO_PREVIOUS(); + if (ExtUI::isPrintingPaused()) { + // The TuneMenu will call ExtUI::setUserConfirmed() + GOTO_SCREEN(TuneMenu); + current_screen.forget(); + } + else { + ExtUI::setUserConfirmed(); + GOTO_PREVIOUS(); + } return true; case 2: GOTO_PREVIOUS(); return true; default: return false; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index 2fce402cf0..5a290109ff 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -143,7 +143,9 @@ void TuneMenu::pausePrint() { void TuneMenu::resumePrint() { sound.play(twinkle, PLAY_ASYNCHRONOUS); - if (ExtUI::isPrintingFromMedia()) + if (ExtUI::awaitingUserConfirm()) + ExtUI::setUserConfirmed(); + else if (ExtUI::isPrintingFromMedia()) ExtUI::resumePrint(); #ifdef ACTION_ON_RESUME else host_action_resume(); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 7611dbb98a..18689fe36d 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -943,6 +943,10 @@ namespace ExtUI { feedrate_percentage = constrain(value, 10, 500); } + bool awaitingUserConfirm() { + return wait_for_user; + } + void setUserConfirmed() { TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 5322ac69ce..478fe68909 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -197,6 +197,7 @@ namespace ExtUI { void setTravelAcceleration_mm_s2(const float); void setFeedrate_percent(const float); void setFlow_percent(const int16_t, const extruder_t); + bool awaitingUserConfirm(); void setUserConfirmed(); #if ENABLED(LIN_ADVANCE) From a5d2180bf5fa201acedf9ee746c6443794e659e7 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 16 Jan 2021 03:38:34 +0100 Subject: [PATCH 0883/1370] MMU2 as standard serial device (#20771) --- Marlin/Configuration_adv.h | 3 --- Marlin/src/HAL/AVR/HAL.h | 7 +++++++ Marlin/src/HAL/DUE/HAL.h | 8 ++++++++ Marlin/src/HAL/LPC1768/HAL.h | 10 ++++++++++ Marlin/src/HAL/SAMD51/HAL.h | 10 ++++++++++ Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp | 8 ++++---- Marlin/src/HAL/STM32/HAL.h | 10 ++++++++++ Marlin/src/HAL/STM32/MarlinSerial.cpp | 4 ++++ Marlin/src/HAL/STM32F1/HAL.h | 12 ++++++++++++ Marlin/src/feature/mmu/mmu2.cpp | 16 +++++++--------- Marlin/src/inc/Conditionals_adv.h | 5 ++++- Marlin/src/inc/SanityCheck.h | 19 +++++++++++++++---- 12 files changed, 91 insertions(+), 21 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ca2e02c736..0e2545700d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3601,10 +3601,7 @@ //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs #elif HAS_PRUSA_MMU2 // Serial port used for communication with MMU2. - // For AVR enable the UART port used for the MMU. (e.g., mmuSerial) - // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) #define MMU2_SERIAL_PORT 2 - #define MMU2_SERIAL mmuSerial // Use hardware reset for MMU if a pin is defined for it //#define MMU2_RST_PIN 23 diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index aa6a321320..8b95acb0ac 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -97,6 +97,13 @@ typedef int8_t pin_t; #endif #endif +#ifdef MMU2_SERIAL_PORT + #if !WITHIN(MMU2_SERIAL_PORT, -1, 3) + #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif + #define MMU2_SERIAL mmuSerial +#endif + #ifdef LCD_SERIAL_PORT #if !WITHIN(LCD_SERIAL_PORT, -1, 3) #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 395ca4ccc9..4783947f6f 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -59,6 +59,14 @@ #endif #endif +#ifdef MMU2_SERIAL_PORT + #if WITHIN(MMU2_SERIAL_PORT, 0, 3) + #define MMU2_SERIAL MSERIAL(SERIAL_PORT) + #else + #error "MMU2_SERIAL_PORT must be from 0 to 3. Please update your configuration." + #endif +#endif + #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 #define LCD_SERIAL lcdSerial diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index f2347bf5a7..44a4e88624 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -82,6 +82,16 @@ extern "C" volatile uint32_t _millis; #endif #endif +#ifdef MMU2_SERIAL_PORT + #if MMU2_SERIAL_PORT == -1 + #define MMU2_SERIAL UsbSerial + #elif WITHIN(MMU2_SERIAL_PORT, 0, 3) + #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) + #else + #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif +#endif + #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 #define LCD_SERIAL UsbSerial diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index ff93101146..fd2eb59475 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -57,6 +57,16 @@ #endif #endif + #ifdef MMU2_SERIAL_PORT + #if MMU2_SERIAL_PORT == -1 + #define MMU2_SERIAL Serial + #elif WITHIN(MMU2_SERIAL_PORT, 0, 3) + #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) + #else + #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif + #endif + #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 #define LCD_SERIAL Serial diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp index abc5f3acbf..fac67cf5a3 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp @@ -21,13 +21,13 @@ #ifdef ADAFRUIT_GRAND_CENTRAL_M4 /** - * Framework doesn't define some serial to save sercom resources + * Framework doesn't define some serials to save sercom resources * hence if these are used I need to define them */ #include "../../inc/MarlinConfig.h" -#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 +#if USING_SERIAL_1 Uart Serial2(&sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX); void SERCOM4_0_Handler() { Serial2.IrqHandler(); } void SERCOM4_1_Handler() { Serial2.IrqHandler(); } @@ -35,7 +35,7 @@ void SERCOM4_3_Handler() { Serial2.IrqHandler(); } #endif -#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 +#if USING_SERIAL_2 Uart Serial3(&sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX); void SERCOM1_0_Handler() { Serial3.IrqHandler(); } void SERCOM1_1_Handler() { Serial3.IrqHandler(); } @@ -43,7 +43,7 @@ void SERCOM1_3_Handler() { Serial3.IrqHandler(); } #endif -#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 +#if USING_SERIAL_3 Uart Serial4(&sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX); void SERCOM5_0_Handler() { Serial4.IrqHandler(); } void SERCOM5_1_Handler() { Serial4.IrqHandler(); } diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index b1c27e4ec5..65074f0967 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -65,6 +65,16 @@ #endif #endif +#ifdef MMU2_SERIAL_PORT + #if MMU2_SERIAL_PORT == -1 + #define MMU2_SERIAL SerialUSB + #elif WITHIN(MMU2_SERIAL_PORT, 1, 6) + #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) + #else + #error "MMU2_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." + #endif +#endif + #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 #define LCD_SERIAL SerialUSB diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index 50765ee995..4d9177248a 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -48,6 +48,10 @@ DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) #endif +#if defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT >= 0 + DECLARE_SERIAL_PORT_EXP(MMU2_SERIAL_PORT) +#endif + #if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0 DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT) #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index a193fe05c8..ecfc172953 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -99,6 +99,18 @@ #endif #endif +#ifdef MMU2_SERIAL_PORT + #if MMU2_SERIAL_PORT == -1 + #define MMU2_SERIAL UsbSerial + #elif WITHIN(MMU2_SERIAL_PORT, 1, NUM_UARTS) + #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) + #elif NUM_UARTS == 5 + #error "MMU2_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." + #else + #error "MMU2_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #endif +#endif + #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 #define LCD_SERIAL UsbSerial diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index 9e93f95086..a4b7f257a9 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -91,8 +91,6 @@ MMU2 mmu2; #define MMU2_NO_TOOL 99 #define MMU_BAUD 115200 -#define mmuSerial MMU2_SERIAL - bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved; #if HAS_PRUSA_MMU2S bool MMU2::mmu2s_triggered; @@ -132,7 +130,7 @@ void MMU2::init() { SET_OUTPUT(MMU2_RST_PIN); #endif - mmuSerial.begin(MMU_BAUD); + MMU2_SERIAL.begin(MMU_BAUD); extruder = MMU2_NO_TOOL; safe_delay(10); @@ -385,8 +383,8 @@ bool MMU2::rx_start() { bool MMU2::rx_str_P(const char* str) { uint8_t i = strlen(rx_buffer); - while (mmuSerial.available()) { - rx_buffer[i++] = mmuSerial.read(); + while (MMU2_SERIAL.available()) { + rx_buffer[i++] = MMU2_SERIAL.read(); rx_buffer[i] = '\0'; if (i == sizeof(rx_buffer) - 1) { @@ -417,7 +415,7 @@ bool MMU2::rx_str_P(const char* str) { void MMU2::tx_str_P(const char* str) { clear_rx_buffer(); uint8_t len = strlen_P(str); - LOOP_L_N(i, len) mmuSerial.write(pgm_read_byte(str++)); + LOOP_L_N(i, len) MMU2_SERIAL.write(pgm_read_byte(str++)); rx_buffer[0] = '\0'; prev_request = millis(); } @@ -428,7 +426,7 @@ void MMU2::tx_str_P(const char* str) { void MMU2::tx_printf_P(const char* format, int argument = -1) { clear_rx_buffer(); uint8_t len = sprintf_P(tx_buffer, format, argument); - LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]); + LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); rx_buffer[0] = '\0'; prev_request = millis(); } @@ -439,7 +437,7 @@ void MMU2::tx_printf_P(const char* format, int argument = -1) { void MMU2::tx_printf_P(const char* format, int argument1, int argument2) { clear_rx_buffer(); uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2); - LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]); + LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); rx_buffer[0] = '\0'; prev_request = millis(); } @@ -448,7 +446,7 @@ void MMU2::tx_printf_P(const char* format, int argument1, int argument2) { * Empty the rx buffer */ void MMU2::clear_rx_buffer() { - while (mmuSerial.available()) mmuSerial.read(); + while (MMU2_SERIAL.available()) MMU2_SERIAL.read(); rx_buffer[0] = '\0'; } diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index d650d32216..22a671c5b3 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -512,7 +512,10 @@ #endif // Flag the indexed serial ports that are in use -#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) +#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || \ + (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || \ + (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \ + (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) #if ANY_SERIAL_IS(-1) #define USING_SERIAL_DEFAULT #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2547425885..8da31336e8 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -588,10 +588,6 @@ #error "SERIAL_PORT must be defined." #elif defined(SERIAL_PORT_2) && SERIAL_PORT_2 == SERIAL_PORT #error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT." -#elif defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == SERIAL_PORT - #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT." -#elif defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == SERIAL_PORT_2 - #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2." #endif #if !(defined(__AVR__) && defined(USBCON)) #if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 @@ -2389,11 +2385,26 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT to a valid value for your board." #elif SERIAL_PORT_2 == -1 #error "SERIAL_PORT_2 is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT_2 to a valid value for your board." + #elif MMU2_SERIAL_PORT == -1 + #error "MMU2_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set MMU2_SERIAL_PORT to a valid value for your board." #elif LCD_SERIAL_PORT == -1 #error "LCD_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set LCD_SERIAL_PORT to a valid value for your board." #endif #endif +/** + * MMU2 require a dedicated serial port + */ +#ifdef MMU2_SERIAL_PORT + #if MMU2_SERIAL_PORT == SERIAL_PORT + #error "MMU2_SERIAL_PORT cannot be the same as SERIAL_PORT." + #elif defined(SERIAL_PORT_2) && MMU2_SERIAL_PORT == SERIAL_PORT_2 + #error "MMU2_SERIAL_PORT cannot be the same as SERIAL_PORT_2." + #elif defined(LCD_SERIAL_PORT) && MMU2_SERIAL_PORT == LCD_SERIAL_PORT + #error "MMU2_SERIAL_PORT cannot be the same as LCD_SERIAL_PORT." + #endif +#endif + /** * Serial displays require a dedicated serial port */ From 418524b1bece25b33f603fa9d0b5de0a6ae479ae Mon Sep 17 00:00:00 2001 From: RFBomb Date: Sat, 16 Jan 2021 01:43:38 -0500 Subject: [PATCH 0884/1370] Configurable Corner Leveling point order (#20733) --- Marlin/Configuration.h | 19 +++ Marlin/src/lcd/language/language_en.h | 2 + Marlin/src/lcd/menu/menu_bed_corners.cpp | 159 ++++++++++++++++++----- buildroot/tests/rambo-tests | 6 +- 4 files changed, 155 insertions(+), 31 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 3f9b6174c2..4ec64f8659 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1451,6 +1451,25 @@ #define LEVEL_CORNERS_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify //#define LEVEL_CORNERS_AUDIO_FEEDBACK #endif + + /** + * Corner Leveling Order + * + * Set 2 or 4 points. When 2 points are given, the 3rd is the center of the opposite edge. + * + * LF Left-Front RF Right-Front + * LB Left-Back RB Right-Back + * + * Examples: + * + * Default {LF,RB,LB,RF} {LF,RF} {LB,LF} + * LB --------- RB LB --------- RB LB --------- RB LB --------- RB + * | 4 3 | | 3 2 | | <3> | | 1 | + * | | | | | | | <3>| + * | 1 2 | | 1 4 | | 1 2 | | 2 | + * LF --------- RF LF --------- RF LF --------- RF LF --------- RF + */ + #define LEVEL_CORNERS_LEVELING_ORDER { LF, RF, RB, LB } #endif /** diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 1969c98ccc..b17e81d831 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -130,6 +130,8 @@ namespace Language_en { PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Level Corners"); PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Raise Bed Until Probe Triggered"); PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("All Corners Within Tolerance. Level Bed"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Good Points: "); + PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Last Z: "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Next Corner"); PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Mesh Editor"); PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Edit Mesh"); diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 2252cbc49f..0088f306f6 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -56,6 +56,13 @@ float last_z; int good_points; bool corner_probing_done, wait_for_probe; + + #if HAS_MARLINUI_U8GLIB + #include "../dogm/marlinui_DOGM.h" + #endif + #define GOOD_POINTS_TO_STR(N) ui8tostr2(N) + #define LAST_Z_TO_STR(N) ftostr53_63(N) //ftostr42_52(N) + #endif static_assert(LEVEL_CORNERS_Z_HOP >= 0, "LEVEL_CORNERS_Z_HOP must be >= 0. Please update your configuration."); @@ -66,12 +73,89 @@ extern const char G28_STR[]; static bool leveling_was_active = false; #endif -static int8_t bed_corner; +#ifndef LEVEL_CORNERS_LEVELING_ORDER + #define LEVEL_CORNERS_LEVELING_ORDER { LF, RF, LB, RB } // Default + //#define LEVEL_CORNERS_LEVELING_ORDER { LF, LB, RF } // 3 hard-coded points + //#define LEVEL_CORNERS_LEVELING_ORDER { LF, RF } // 3-Point tramming - Rear + //#define LEVEL_CORNERS_LEVELING_ORDER { LF, LB } // 3-Point tramming - Right + //#define LEVEL_CORNERS_LEVELING_ORDER { RF, RB } // 3-Point tramming - Left + //#define LEVEL_CORNERS_LEVELING_ORDER { LB, RB } // 3-Point tramming - Front +#endif +#define LF 1 +#define RF 2 +#define RB 3 +#define LB 4 +constexpr int lco[] = LEVEL_CORNERS_LEVELING_ORDER; +constexpr bool level_corners_3_points = COUNT(lco) == 2; +static_assert(level_corners_3_points || COUNT(lco) == 4, "LEVEL_CORNERS_LEVELING_ORDER must have exactly 2 or 4 corners."); + +constexpr int lcodiff = abs(lco[0] - lco[1]); +static_assert(COUNT(lco) == 4 || lcodiff == 1 || lcodiff == 3, "The first two LEVEL_CORNERS_LEVELING_ORDER corners must be on the same edge."); + +constexpr int nr_edge_points = level_corners_3_points ? 3 : 4; +constexpr int available_points = nr_edge_points + ENABLED(LEVEL_CENTER_TOO); +constexpr int center_index = TERN(LEVEL_CENTER_TOO, available_points - 1, -1); constexpr float inset_lfrb[4] = LEVEL_CORNERS_INSET_LFRB; constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] }, rb { (X_MAX_BED) - inset_lfrb[2], (Y_MAX_BED) - inset_lfrb[3] }; +static int8_t bed_corner; + +/** + * Select next corner coordinates + */ +static inline void _lcd_level_bed_corners_get_next_position() { + + if (level_corners_3_points) { + if (bed_corner >= available_points) bed_corner = 0; // Above max position -> move back to first corner + switch (bed_corner) { + case 0 ... 1: + // First two corners set explicitly by the configuration + current_position = lf; // Left front + switch (lco[bed_corner]) { + case RF: current_position.x = rb.x; break; // Right Front + case RB: current_position = rb; break; // Right Back + case LB: current_position.y = rb.y; break; // Left Back + } + break; + + case 2: + // Determine which edge to probe for 3rd point + current_position.set(lf.x + (rb.x - lf.x) / 2, lf.y + (rb.y - lf.y) / 2); + if ((lco[0] == LB && lco[1] == RB) || (lco[0] == RB && lco[1] == LB)) current_position.y = lf.y; // Front Center + if ((lco[0] == LF && lco[1] == LB) || (lco[0] == LB && lco[1] == LF)) current_position.x = rb.x; // Center Right + if ((lco[0] == RF && lco[1] == RB) || (lco[0] == RB && lco[1] == RF)) current_position.x = lf.x; // Left Center + if ((lco[0] == LF && lco[1] == RF) || (lco[0] == RF && lco[1] == LF)) current_position.y = rb.y; // Center Back + #if DISABLED(LEVEL_CENTER_TOO) && ENABLED(LEVEL_CORNERS_USE_PROBE) + bed_corner++; // Must increment the count to ensure it resets the loop if the 3rd point is out of tolerance + #endif + break; + + #if ENABLED(LEVEL_CENTER_TOO) + case 3: + current_position.set(X_CENTER, Y_CENTER); + break; + #endif + } + } + else { + // Four-Corner Bed Tramming with optional center + if (TERN0(LEVEL_CENTER_TOO, bed_corner == center_index)) { + current_position.set(X_CENTER, Y_CENTER); + TERN_(LEVEL_CORNERS_USE_PROBE, good_points--); // Decrement to allow one additional probe point + } + else { + current_position = lf; // Left front + switch (lco[bed_corner]) { + case RF: current_position.x = rb.x; break; // Right front + case RB: current_position = rb; break; // Right rear + case LB: current_position.y = rb.y; break; // Left rear + } + } + } +} + /** * Level corners, starting in the front-left corner. */ @@ -82,8 +166,37 @@ constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] VALIDATE_POINT(lf.x, Y_CENTER, "left"); VALIDATE_POINT(X_CENTER, lf.y, "front"); VALIDATE_POINT(rb.x, Y_CENTER, "right"); VALIDATE_POINT(X_CENTER, rb.y, "back"); + #ifndef PAGE_CONTAINS + #define PAGE_CONTAINS(...) true + #endif + void _lcd_draw_probing() { - if (ui.should_draw()) MenuItem_static::draw((LCD_HEIGHT - 1) / 2, GET_TEXT(MSG_PROBING_MESH)); + if (!ui.should_draw()) return; + + TERN_(HAS_MARLINUI_U8GLIB, ui.set_font(FONT_MENU)); // Set up the font for extra info + + MenuItem_static::draw(0, GET_TEXT(MSG_PROBING_MESH), SS_INVERT); // "Probing Mesh" heading + + uint8_t cy = LCD_HEIGHT - 1, y = LCD_ROW_Y(cy); + + // Display # of good points found vs total needed + if (PAGE_CONTAINS(y - (MENU_FONT_HEIGHT), y)) { + SETCURSOR(0, cy); + lcd_put_u8str_P(GET_TEXT(MSG_LEVEL_CORNERS_GOOD_POINTS)); + lcd_put_u8str(GOOD_POINTS_TO_STR(good_points)); + lcd_put_wchar('/'); + lcd_put_u8str(GOOD_POINTS_TO_STR(nr_edge_points)); + } + + --cy; + y -= MENU_FONT_HEIGHT; + + // Display the Last Z value + if (PAGE_CONTAINS(y - (MENU_FONT_HEIGHT), y)) { + SETCURSOR(0, cy); + lcd_put_u8str_P(GET_TEXT(MSG_LEVEL_CORNERS_LAST_Z)); + lcd_put_u8str(LAST_Z_TO_STR(last_z)); + } } void _lcd_draw_raise() { @@ -112,7 +225,7 @@ constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] bool _lcd_level_bed_corners_probe(bool verify=false) { if (verify) do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // do clearance if needed TERN_(BLTOUCH_SLOW_MODE, bltouch.deploy()); // Deploy in LOW SPEED MODE on every probe action - do_blocking_move_to_z(last_z - LEVEL_CORNERS_PROBE_TOLERANCE, manual_feedrate_mm_s.z); // Move down to lower tolerance + do_blocking_move_to_z(last_z - LEVEL_CORNERS_PROBE_TOLERANCE, MMM_TO_MMS(Z_PROBE_SPEED_SLOW)); // Move down to lower tolerance if (TEST(endstops.trigger_state(), TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN, Z_MIN_PROBE))) { // check if probe triggered endstops.hit_on_purpose(); set_current_from_steppers_for_axis(Z_AXIS); @@ -149,25 +262,18 @@ constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] } void _lcd_test_corners() { - ui.goto_screen(_lcd_draw_probing); - bed_corner = TERN(LEVEL_CENTER_TOO, 4, 0); + bed_corner = TERN(LEVEL_CENTER_TOO, center_index, 0); last_z = LEVEL_CORNERS_HEIGHT; endstops.enable_z_probe(true); good_points = 0; - + ui.goto_screen(_lcd_draw_probing); do { + ui.refresh(LCDVIEW_REDRAW_NOW); + _lcd_draw_probing(); //update screen with # of good points do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // clearance - // Select next corner coordinates - xy_pos_t plf = lf - probe.offset_xy, prb = rb - probe.offset_xy; - switch (bed_corner) { - case 0: current_position = plf; break; // copy xy - case 1: current_position.x = prb.x; break; - case 2: current_position.y = prb.y; break; - case 3: current_position.x = plf.x; break; - #if ENABLED(LEVEL_CENTER_TOO) - case 4: current_position.set(X_CENTER - probe.offset_xy.x, Y_CENTER - probe.offset_xy.y); break; - #endif - } + + _lcd_level_bed_corners_get_next_position(); // Select next corner coordinates + current_position -= probe.offset_xy; // Account for probe offsets do_blocking_move_to_xy(current_position); // Goto corner if (!_lcd_level_bed_corners_probe()) { // Probe down to tolerance @@ -185,10 +291,10 @@ constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] return; } - if (bed_corner != 4) good_points++; // ignore center + if (bed_corner != center_index) good_points++; // ignore center if (++bed_corner > 3) bed_corner = 0; - } while (good_points < 4); // loop until all corners whitin tolerance + } while (good_points < nr_edge_points); // loop until all points within tolerance ui.goto_screen(_lcd_draw_level_prompt); // prompt for bed leveling ui.set_selection(true); @@ -198,18 +304,13 @@ constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] static inline void _lcd_goto_next_corner() { line_to_z(LEVEL_CORNERS_Z_HOP); - switch (bed_corner) { - case 0: current_position = lf; break; // copy xy - case 1: current_position.x = rb.x; break; - case 2: current_position.y = rb.y; break; - case 3: current_position.x = lf.x; break; - #if ENABLED(LEVEL_CENTER_TOO) - case 4: current_position.set(X_CENTER, Y_CENTER); break; - #endif - } + + // Select next corner coordinates + _lcd_level_bed_corners_get_next_position(); + line_to_current_position(manual_feedrate_mm_s.x); line_to_z(LEVEL_CORNERS_HEIGHT); - if (++bed_corner > 3 + ENABLED(LEVEL_CENTER_TOO)) bed_corner = 0; + if (++bed_corner >= available_points) bed_corner = 0; } #endif // !LEVEL_CORNERS_USE_PROBE diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 5bc1b39f7e..d471f4201c 100755 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -30,7 +30,7 @@ opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TE BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ PID_PARAMS_PER_HOTEND PID_AUTOTUNE_MENU PID_EDIT_MENU LCD_SHOW_E_TOTAL \ - PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LEVEL_BED_CORNERS \ + PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LEVEL_BED_CORNERS LEVEL_CENTER_TOO \ NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM \ ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \ PASSWORD_FEATURE PASSWORD_ON_STARTUP PASSWORD_ON_SD_PRINT_MENU PASSWORD_AFTER_SD_PRINT_END PASSWORD_AFTER_SD_PRINT_ABORT \ @@ -53,10 +53,12 @@ opt_set EXTRUDERS 0 opt_set TEMP_SENSOR_0 999 opt_set DUMMY_THERMISTOR_999_VALUE 170 opt_set DIGIPOT_MOTOR_CURRENT '{ 120, 120, 120, 120, 120 }' +opt_set LEVEL_CORNERS_LEVELING_ORDER '{ LF, RF }' opt_enable USE_XMAX_PLUG USE_YMAX_PLUG USE_ZMAX_PLUG \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER REVERSE_ENCODER_DIRECTION SDSUPPORT EEPROM_SETTINGS \ S_CURVE_ACCELERATION X_DUAL_STEPPER_DRIVERS X_DUAL_ENDSTOPS Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS \ - ADAPTIVE_STEP_SMOOTHING CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES + ADAPTIVE_STEP_SMOOTHING CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES \ + LEVEL_BED_CORNERS LEVEL_CENTER_TOO opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS exec_test $1 $2 "Rambo CNC Configuration" "$3" From 3acf86510d5db124f7443fbe654265636566f84d Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 16 Jan 2021 19:50:25 +1300 Subject: [PATCH 0885/1370] Fix Ender-3 V2 DWIN LPC signed warnings (#20786) --- Marlin/src/lcd/dwin/e3v2/dwin.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 80bc93dcc5..5656d67e9a 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -249,8 +249,7 @@ typedef struct { float Move_E_scale = 0; #endif float offset_value = 0; - TERN_(__STM32F1__, signed) - char show_mode = 0; // -1: Temperature control 0: Printing temperature + int8_t show_mode = 0; // -1: Temperature control 0: Printing temperature } HMI_value_t; #define DWIN_CHINESE 123 From cab93c2ad857c79da30ca36aba34f63a07fe6a2e Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sun, 17 Jan 2021 02:20:35 +0100 Subject: [PATCH 0886/1370] Update Italian language (#20789) --- Marlin/src/lcd/language/language_it.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index ebf806caaf..5bfb6aa9aa 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -112,6 +112,8 @@ namespace Language_it { PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potenza laser"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potenza mandrino"); PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Alterna Laser"); + PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("ms impulso di test"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Spara impulso"); PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Alterna mandrino"); PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Mandrino in avanti"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino"); @@ -126,6 +128,8 @@ namespace Language_it { PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Calibra piano"); PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Regola la vite finche' la sonda non rileva il piano."); PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Tolleranza raggiunta su tutti gli angoli. Piano livellato!"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Punti buoni: "); + PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Ultimo Z: "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Prossimo punto"); PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mesh"); PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifica Mesh"); From 63e3117510f47f2df9d9d2fb83c7d9ffcc6c3ccc Mon Sep 17 00:00:00 2001 From: Martin <34376785+G4Cab@users.noreply.github.com> Date: Sun, 17 Jan 2021 02:49:34 +0100 Subject: [PATCH 0887/1370] 4 / 5 digits for some edit items (#20793) --- Marlin/src/lcd/menu/menu_advanced.cpp | 24 ++++++++++++------------ Marlin/src/lcd/menu/menu_item.h | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 3f2a6da11b..b5f8d1d5de 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -140,16 +140,16 @@ void menu_backlash(); #if ENABLED(ADVANCED_PAUSE_FEATURE) constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999); - EDIT_ITEM_FAST(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); + EDIT_ITEM_FAST(float4, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); #if HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTUNLOAD_E, &fc_settings[n].unload_length, 0, extrude_maxlength); + EDIT_ITEM_FAST_N(float4, n, MSG_FILAMENTUNLOAD_E, &fc_settings[n].unload_length, 0, extrude_maxlength); #endif - EDIT_ITEM_FAST(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); + EDIT_ITEM_FAST(float4, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); #if HAS_MULTI_EXTRUDER LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTLOAD_E, &fc_settings[n].load_length, 0, extrude_maxlength); + EDIT_ITEM_FAST_N(float4, n, MSG_FILAMENTLOAD_E, &fc_settings[n].load_length, 0, extrude_maxlength); #endif #endif @@ -279,7 +279,7 @@ void menu_backlash(); #if ENABLED(PID_EXTRUSION_SCALING) #define _PID_BASE_MENU_ITEMS(N) \ __PID_BASE_MENU_ITEMS(N); \ - EDIT_ITEM_N(float3, N, MSG_PID_C_E, &PID_PARAM(Kc, N), 1, 9990) + EDIT_ITEM_N(float4, N, MSG_PID_C_E, &PID_PARAM(Kc, N), 1, 9990) #else #define _PID_BASE_MENU_ITEMS(N) __PID_BASE_MENU_ITEMS(N) #endif @@ -287,7 +287,7 @@ void menu_backlash(); #if ENABLED(PID_FAN_SCALING) #define _PID_EDIT_MENU_ITEMS(N) \ _PID_BASE_MENU_ITEMS(N); \ - EDIT_ITEM_N(float3, N, MSG_PID_F_E, &PID_PARAM(Kf, N), 1, 9990) + EDIT_ITEM_N(float4, N, MSG_PID_F_E, &PID_PARAM(Kf, N), 1, 9990) #else #define _PID_EDIT_MENU_ITEMS(N) _PID_BASE_MENU_ITEMS(N) #endif @@ -348,7 +348,7 @@ void menu_backlash(); #elif ENABLED(LIMITED_MAX_FR_EDITING) DEFAULT_MAX_FEEDRATE #else - { 999, 999, 999, 999 } + { 9999, 9999, 9999, 9999 } #endif ; #if ENABLED(LIMITED_MAX_FR_EDITING) && !defined(MAX_FEEDRATE_EDIT_VALUES) @@ -360,24 +360,24 @@ void menu_backlash(); START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); - #define EDIT_VMAX(N) EDIT_ITEM_FAST(float3, MSG_VMAX_##N, &planner.settings.max_feedrate_mm_s[_AXIS(N)], 1, max_fr_edit_scaled[_AXIS(N)]) + #define EDIT_VMAX(N) EDIT_ITEM_FAST(float5, MSG_VMAX_##N, &planner.settings.max_feedrate_mm_s[_AXIS(N)], 1, max_fr_edit_scaled[_AXIS(N)]) EDIT_VMAX(A); EDIT_VMAX(B); EDIT_VMAX(C); #if E_STEPPERS - EDIT_ITEM_FAST(float3, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e); + EDIT_ITEM_FAST(float5, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e); #endif #if ENABLED(DISTINCT_E_FACTORS) LOOP_L_N(n, E_STEPPERS) - EDIT_ITEM_FAST_N(float3, n, MSG_VMAX_EN, &planner.settings.max_feedrate_mm_s[E_AXIS_N(n)], 1, max_fr_edit_scaled.e); + EDIT_ITEM_FAST_N(float5, n, MSG_VMAX_EN, &planner.settings.max_feedrate_mm_s[E_AXIS_N(n)], 1, max_fr_edit_scaled.e); #endif // M205 S Min Feedrate - EDIT_ITEM_FAST(float3, MSG_VMIN, &planner.settings.min_feedrate_mm_s, 0, 999); + EDIT_ITEM_FAST(float5, MSG_VMIN, &planner.settings.min_feedrate_mm_s, 0, 9999); // M205 T Min Travel Feedrate - EDIT_ITEM_FAST(float3, MSG_VTRAV_MIN, &planner.settings.min_travel_feedrate_mm_s, 0, 999); + EDIT_ITEM_FAST(float5, MSG_VTRAV_MIN, &planner.settings.min_travel_feedrate_mm_s, 0, 9999); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 188463c6c6..1d9a2f6b2c 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -133,6 +133,7 @@ DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3 , 1 ); // 123 right-justified DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 ); // _2.34, 12.34, -2.34 or 123.45, -23.45 DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); // -1.234, _1.234, +1.234 +DEFINE_MENU_EDIT_ITEM_TYPE(float4 ,float ,ftostr4sign , 1 ); // 1234 right-justified DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) DEFINE_MENU_EDIT_ITEM_TYPE(float51 ,float ,ftostr51rj , 10 ); // 1234.5 right-justified From d814d8f954c9b25fbb324f45ee019ed3ff89ef03 Mon Sep 17 00:00:00 2001 From: "Alexander D. Kanevskiy" Date: Sun, 17 Jan 2021 03:51:08 +0200 Subject: [PATCH 0888/1370] NEOPIXEL overridable on BTT SKR (#20797) --- Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 4 +++- Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h | 5 ++++- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h | 4 +++- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h | 8 ++++++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 0e93aec945..6e498ba6aa 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -70,7 +70,9 @@ #endif // LED driving pin -#define NEOPIXEL_PIN P1_24 +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN P1_24 +#endif // // Power Loss Detection diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h index d8c37d85eb..73a18faf05 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h @@ -177,4 +177,7 @@ // Misc. Functions // #define LED_CONTROL_PIN PA13 -#define NEOPIXEL_PIN PA8 + +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN PA8 +#endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h index 165c41ffe7..4951d697a7 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h @@ -25,7 +25,9 @@ #define BOARD_INFO_NAME "BTT SKR Mini E3 V1.2" -#define NEOPIXEL_PIN PC7 // LED driving pin +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN PC7 // LED driving pin +#endif /** * TMC2208/TMC2209 stepper drivers diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h index cc4bf46e15..af2821f809 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h @@ -39,9 +39,13 @@ // Release PA13/PA14 (led, usb control) from SWD pins #define DISABLE_DEBUG -#define NEOPIXEL_PIN PA8 // LED driving pin +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN PA8 // LED driving pin +#endif -#define PS_ON_PIN PC13 // Power Supply Control +#ifndef PS_ON_PIN + #define PS_ON_PIN PC13 // Power Supply Control +#endif #define FAN1_PIN PC7 From ae53998a88e47edf22ab6ceb38b193df2f63cda5 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 17 Jan 2021 17:34:54 +1300 Subject: [PATCH 0889/1370] Fix Trigorilla Pro STOP pins (#20801) --- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index cf1b7861ed..e09bbff324 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -56,8 +56,8 @@ // // Limit Switches // -#define X_MAX_PIN PG10 -#define Y_MAX_PIN PA12 +#define X_STOP_PIN PG10 +#define Y_STOP_PIN PA12 #define Z_MAX_PIN PA14 #define Z_MIN_PIN PA13 From efc396bd0521bcdfd56e32dbc6d52f9a26cd3849 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 16 Jan 2021 19:03:06 -0600 Subject: [PATCH 0890/1370] General cleanup, use _BV --- Marlin/src/HAL/DUE/fastio.h | 2 +- Marlin/src/HAL/DUE/timers.cpp | 2 +- Marlin/src/HAL/ESP32/Servo.h | 2 +- Marlin/src/HAL/LPC1768/eeprom_flash.cpp | 2 +- Marlin/src/HAL/LPC1768/timers.h | 2 +- Marlin/src/HAL/SAMD51/fastio.h | 2 +- Marlin/src/HAL/SAMD51/timers.cpp | 2 +- Marlin/src/HAL/STM32F1/Servo.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/fastio.h | 2 +- Marlin/src/HAL/TEENSY35_36/fastio.h | 2 +- Marlin/src/HAL/shared/Marduino.h | 16 ++--- .../src/HAL/shared/backtrace/unwarmbytab.cpp | 69 ++++++++----------- Marlin/src/core/macros.h | 8 +-- Marlin/src/feature/direct_stepping.h | 4 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 8 +-- .../lib/anycubic_chiron/chiron_tft_defs.h | 2 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 4 -- Marlin/src/lcd/menu/menu_tune.cpp | 4 -- 19 files changed, 56 insertions(+), 81 deletions(-) diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h index 5fb8b4d015..f375cb6b29 100644 --- a/Marlin/src/HAL/DUE/fastio.h +++ b/Marlin/src/HAL/DUE/fastio.h @@ -50,7 +50,7 @@ #define PWM_PIN(P) WITHIN(P, 2, 13) #ifndef MASK - #define MASK(PIN) (1 << PIN) + #define MASK(PIN) _BV(PIN) #endif /** diff --git a/Marlin/src/HAL/DUE/timers.cpp b/Marlin/src/HAL/DUE/timers.cpp index 9b937d1a7c..65073c510d 100644 --- a/Marlin/src/HAL/DUE/timers.cpp +++ b/Marlin/src/HAL/DUE/timers.cpp @@ -121,7 +121,7 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) { // missing from CMSIS: Check if interrupt is enabled or not static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) { - return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0; + return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F); } bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { diff --git a/Marlin/src/HAL/ESP32/Servo.h b/Marlin/src/HAL/ESP32/Servo.h index b0d9294527..8542092d66 100644 --- a/Marlin/src/HAL/ESP32/Servo.h +++ b/Marlin/src/HAL/ESP32/Servo.h @@ -30,7 +30,7 @@ class Servo { MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo TAU_MSEC = 20, TAU_USEC = (TAU_MSEC * 1000), - MAX_COMPARE = ((1 << 16) - 1), // 65535 + MAX_COMPARE = _BV(16) - 1, // 65535 CHANNEL_MAX_NUM = 16; public: diff --git a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp index 3c0c3c8ec3..38d2705d51 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp @@ -25,7 +25,7 @@ * Emulate EEPROM storage using Flash Memory * * Use a single 32K flash sector to store EEPROM data. To reduce the - * number of erase operations a simple "levelling" scheme is used that + * number of erase operations a simple "leveling" scheme is used that * maintains a number of EEPROM "slots" within the larger flash sector. * Each slot is used in turn and the entire sector is only erased when all * slots have been used. diff --git a/Marlin/src/HAL/LPC1768/timers.h b/Marlin/src/HAL/LPC1768/timers.h index e6744fb005..4b63854685 100644 --- a/Marlin/src/HAL/LPC1768/timers.h +++ b/Marlin/src/HAL/LPC1768/timers.h @@ -152,7 +152,7 @@ FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) { // This function is missing from CMSIS FORCE_INLINE static bool NVIC_GetEnableIRQ(IRQn_Type IRQn) { - return (NVIC->ISER[((uint32_t)IRQn) >> 5] & (1 << ((uint32_t)IRQn) & 0x1F)) != 0; + return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F); } FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { diff --git a/Marlin/src/HAL/SAMD51/fastio.h b/Marlin/src/HAL/SAMD51/fastio.h index c456dfce30..a95b7cac0c 100644 --- a/Marlin/src/HAL/SAMD51/fastio.h +++ b/Marlin/src/HAL/SAMD51/fastio.h @@ -31,7 +31,7 @@ */ #ifndef MASK - #define MASK(PIN) (1 << PIN) + #define MASK(PIN) _BV(PIN) #endif /** diff --git a/Marlin/src/HAL/SAMD51/timers.cpp b/Marlin/src/HAL/SAMD51/timers.cpp index a68af2e074..5c55d32407 100644 --- a/Marlin/src/HAL/SAMD51/timers.cpp +++ b/Marlin/src/HAL/SAMD51/timers.cpp @@ -157,7 +157,7 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) { // missing from CMSIS: Check if interrupt is enabled or not static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) { - return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0; + return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F); } bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { diff --git a/Marlin/src/HAL/STM32F1/Servo.cpp b/Marlin/src/HAL/STM32F1/Servo.cpp index e1ee831493..36f7c6d512 100644 --- a/Marlin/src/HAL/STM32F1/Servo.cpp +++ b/Marlin/src/HAL/STM32F1/Servo.cpp @@ -45,7 +45,7 @@ uint8_t ServoCount = 0; * * This uses the smallest prescaler that allows an overflow < 2^16. */ -#define MAX_OVERFLOW UINT16_MAX //((1 << 16) - 1) +#define MAX_OVERFLOW UINT16_MAX // _BV(16) - 1 #define CYC_MSEC (1000 * CYCLES_PER_MICROSECOND) #define TAU_MSEC 20 #define TAU_USEC (TAU_MSEC * 1000) diff --git a/Marlin/src/HAL/TEENSY31_32/fastio.h b/Marlin/src/HAL/TEENSY31_32/fastio.h index 9a299de9c7..622799ec8c 100644 --- a/Marlin/src/HAL/TEENSY31_32/fastio.h +++ b/Marlin/src/HAL/TEENSY31_32/fastio.h @@ -28,7 +28,7 @@ */ #ifndef MASK - #define MASK(PIN) (1 << PIN) + #define MASK(PIN) _BV(PIN) #endif #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) diff --git a/Marlin/src/HAL/TEENSY35_36/fastio.h b/Marlin/src/HAL/TEENSY35_36/fastio.h index 9a299de9c7..622799ec8c 100644 --- a/Marlin/src/HAL/TEENSY35_36/fastio.h +++ b/Marlin/src/HAL/TEENSY35_36/fastio.h @@ -28,7 +28,7 @@ */ #ifndef MASK - #define MASK(PIN) (1 << PIN) + #define MASK(PIN) _BV(PIN) #endif #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) diff --git a/Marlin/src/HAL/shared/Marduino.h b/Marlin/src/HAL/shared/Marduino.h index 3003f3cc28..2580723511 100644 --- a/Marlin/src/HAL/shared/Marduino.h +++ b/Marlin/src/HAL/shared/Marduino.h @@ -28,9 +28,9 @@ #undef DISABLED // Redefined by ESP32 #undef M_PI // Redefined by all #undef _BV // Redefined by some -#undef sq // Redefined by teensy3/wiring.h #undef SBI // Redefined by arduino/const_functions.h #undef CBI // Redefined by arduino/const_functions.h +#undef sq // Redefined by teensy3/wiring.h #undef UNUSED // Redefined by stm32f4xx_hal_def.h #include // NOTE: If included earlier then this line is a NOOP @@ -40,18 +40,16 @@ #undef _BV #define _BV(b) (1UL << (b)) +#ifndef SBI + #define SBI(A,B) (A |= _BV(B)) +#endif +#ifndef CBI + #define CBI(A,B) (A &= ~_BV(B)) +#endif #undef sq #define sq(x) ((x)*(x)) -#ifndef SBI - #define SBI(A,B) (A |= (1 << (B))) -#endif - -#ifndef CBI - #define CBI(A,B) (A &= ~(1 << (B))) -#endif - #ifndef __AVR__ #ifndef strchr_P // Some platforms define a macro (DUE, teensy35) inline const char* strchr_P(const char *s, int c) { return strchr(s,c); } diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp index bfc062af20..f1ee81ed4a 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp @@ -128,11 +128,8 @@ static UnwResult UnwTabStateInit(const UnwindCallbacks *cb, UnwTabState *ucb, ui * Execute unwinding instructions */ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabState *ucb) { - int instruction; - uint32_t mask; - uint32_t reg; - uint32_t vsp; + uint32_t mask, reg, vsp; /* Consume all instruction byte */ while ((instruction = UnwTabGetNextInstruction(cb, ucb)) != -1) { @@ -140,12 +137,12 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat if ((instruction & 0xC0) == 0x00) { // ARM_EXIDX_CMD_DATA_POP /* vsp = vsp + (xxxxxx << 2) + 4 */ ucb->vrs[13] += ((instruction & 0x3F) << 2) + 4; - } else - if ((instruction & 0xC0) == 0x40) { // ARM_EXIDX_CMD_DATA_PUSH + } + else if ((instruction & 0xC0) == 0x40) { // ARM_EXIDX_CMD_DATA_PUSH /* vsp = vsp - (xxxxxx << 2) - 4 */ ucb->vrs[13] -= ((instruction & 0x3F) << 2) - 4; - } else - if ((instruction & 0xF0) == 0x80) { + } + else if ((instruction & 0xF0) == 0x80) { /* pop under mask {r15-r12},{r11-r4} or refuse to unwind */ instruction = instruction << 8 | UnwTabGetNextInstruction(cb, ucb); @@ -171,17 +168,17 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat } /* Patch up the vrs sp if it was in the mask */ - if ((instruction & (1 << (13 - 4))) != 0) + if (instruction & (1 << (13 - 4))) ucb->vrs[13] = vsp; - - } else - if ((instruction & 0xF0) == 0x90 && // ARM_EXIDX_CMD_REG_TO_SP - instruction != 0x9D && - instruction != 0x9F) { + } + else if ((instruction & 0xF0) == 0x90 // ARM_EXIDX_CMD_REG_TO_SP + && instruction != 0x9D + && instruction != 0x9F + ) { /* vsp = r[nnnn] */ ucb->vrs[13] = ucb->vrs[instruction & 0x0F]; - } else - if ((instruction & 0xF0) == 0xA0) { // ARM_EXIDX_CMD_REG_POP + } + else if ((instruction & 0xF0) == 0xA0) { // ARM_EXIDX_CMD_REG_POP /* pop r4-r[4+nnn] or pop r4-r[4+nnn], r14*/ vsp = ucb->vrs[13]; @@ -204,8 +201,8 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat ucb->vrs[13] = vsp; - } else - if (instruction == 0xB0) { // ARM_EXIDX_CMD_FINISH + } + else if (instruction == 0xB0) { // ARM_EXIDX_CMD_FINISH /* finished */ if (ucb->vrs[15] == 0) ucb->vrs[15] = ucb->vrs[14]; @@ -213,8 +210,8 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat /* All done unwinding */ return UNWIND_SUCCESS; - } else - if (instruction == 0xB1) { // ARM_EXIDX_CMD_REG_POP + } + else if (instruction == 0xB1) { // ARM_EXIDX_CMD_REG_POP /* pop register under mask {r3,r2,r1,r0} */ vsp = ucb->vrs[13]; mask = UnwTabGetNextInstruction(cb, ucb); @@ -234,16 +231,15 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat } ucb->vrs[13] = (uint32_t)vsp; - } else - if (instruction == 0xB2) { // ARM_EXIDX_CMD_DATA_POP + } + else if (instruction == 0xB2) { // ARM_EXIDX_CMD_DATA_POP /* vps = vsp + 0x204 + (uleb128 << 2) */ ucb->vrs[13] += 0x204 + (UnwTabGetNextInstruction(cb, ucb) << 2); - - } else - if (instruction == 0xB3 || // ARM_EXIDX_CMD_VFP_POP - instruction == 0xC8 || - instruction == 0xC9) { - + } + else if (instruction == 0xB3 // ARM_EXIDX_CMD_VFP_POP + || instruction == 0xC8 + || instruction == 0xC9 + ) { /* pop VFP double-precision registers */ vsp = ucb->vrs[13]; @@ -266,27 +262,20 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat } ucb->vrs[13] = vsp; - - } else - if ((instruction & 0xF8) == 0xB8 || - (instruction & 0xF8) == 0xD0) { - + } + else if ((instruction & 0xF8) == 0xB8 || (instruction & 0xF8) == 0xD0) { /* Pop VFP double precision registers D[8]-D[8+nnn] */ ucb->vrs[14] = 0x80 | (instruction & 0x07); - - if ((instruction & 0xF8) == 0xD0) { + if ((instruction & 0xF8) == 0xD0) ucb->vrs[14] = 1 << 17; - } - - } else + } + else return UNWIND_UNSUPPORTED_DWARF_INSTR; } - return UNWIND_SUCCESS; } static inline __attribute__((always_inline)) uint32_t read_psp() { - /* Read the current PSP and return its value as a pointer */ uint32_t psp; diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 56e80b87dc..d5b3342437 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -84,17 +84,13 @@ #define _BV(n) (1<<(n)) #define TEST(n,b) (!!((n)&_BV(b))) #define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0) - #ifndef SBI - #define SBI(A,B) (A |= (1 << (B))) + #define SBI(A,B) (A |= _BV(B)) #endif - #ifndef CBI - #define CBI(A,B) (A &= ~(1 << (B))) + #define CBI(A,B) (A &= ~_BV(B)) #endif - #define TBI(N,B) (N ^= _BV(B)) - #define _BV32(b) (1UL << (b)) #define TEST32(n,b) !!((n)&_BV32(b)) #define SBI32(n,b) (n |= _BV32(b)) diff --git a/Marlin/src/feature/direct_stepping.h b/Marlin/src/feature/direct_stepping.h index cde9d1a0b4..b3007731cd 100644 --- a/Marlin/src/feature/direct_stepping.h +++ b/Marlin/src/feature/direct_stepping.h @@ -93,8 +93,8 @@ namespace DirectStepping { static constexpr int DIRECTIONAL = dir ? 1 : 0; static constexpr int SEGMENTS = segments; - static constexpr int NUM_SEGMENTS = 1 << BITS_SEGMENT; - static constexpr int SEGMENT_STEPS = (1 << (BITS_SEGMENT - DIRECTIONAL)) - 1; + static constexpr int NUM_SEGMENTS = _BV(BITS_SEGMENT); + static constexpr int SEGMENT_STEPS = _BV(BITS_SEGMENT - DIRECTIONAL) - 1; static constexpr int TOTAL_STEPS = SEGMENT_STEPS * SEGMENTS; static constexpr int PAGE_SIZE = (NUM_AXES * BITS_SEGMENT * SEGMENTS) / 8; diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 226fb7291e..2c3217b224 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -86,9 +86,9 @@ namespace Anycubic { safe_delay(200); - // Enable levelling and Disable end stops during print + // Enable leveling and Disable end stops during print // as Z home places nozzle above the bed so we need to allow it past the end stops - injectCommands_P(AC_cmnd_enable_levelling); + injectCommands_P(AC_cmnd_enable_leveling); // Startup tunes are defined in Tunes.h //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1); @@ -762,7 +762,7 @@ namespace Anycubic { selectedmeshpoint.x = selectedmeshpoint.y = 99; } break; - case 'D': // Save Z Offset tables and restore levelling state + case 'D': // Save Z Offset tables and restore leveling state if (!isPrinting()) { setAxisPosition_mm(1.0,Z); injectCommands_P(PSTR("M500")); @@ -784,7 +784,7 @@ namespace Anycubic { float Zshift = atof(&panel_command[4]); setSoftEndstopState(false); // disable endstops // Allow temporary Z position nudging during print - // From the levelling panel use the all points UI to adjust the print pos. + // From the leveling panel use the all points UI to adjust the print pos. if (isPrinting()) { #if ACDEBUG(AC_INFO) SERIAL_ECHOLNPAIR("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h index af030df580..408c0d7484 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -105,7 +105,7 @@ #define AC_cmnd_manual_load_filament PSTR("M83\nG1 E50 F700\nM82") // replace the manual panel commands with something a little faster #define AC_cmnd_manual_unload_filament PSTR("M83\nG1 E-50 F1200\nM82") -#define AC_cmnd_enable_levelling PSTR("M420 S1 V1") +#define AC_cmnd_enable_leveling PSTR("M420 S1 V1") #define AC_cmnd_power_loss_recovery PSTR("G28 X Y R5\nG28 Z") // Lift, home X and Y then home Z when in 'safe' position namespace Anycubic { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 43f82bca24..273462ac90 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -56,7 +56,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); } } - #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + #if DISABLED(SINGLENOZZLE) && HAS_MULTI_EXTRUDER else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); } diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 7b6d7f1a1d..2e5aff1006 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -35,10 +35,6 @@ #include "../../module/motion.h" #endif -#if ENABLED(SINGLENOZZLE) - #include "../../module/tool_change.h" -#endif - // // "Temperature" submenu items // diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 87168ba1e7..5da25ce59a 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -38,10 +38,6 @@ #include "../../feature/bedlevel/bedlevel.h" #endif -#if ENABLED(SINGLENOZZLE) - #include "../../module/tool_change.h" -#endif - #if ENABLED(BABYSTEPPING) #include "../../feature/babystep.h" From e351ea2ee8ef2f588ef13f2ae12cdb02446b1929 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 16 Jan 2021 20:43:46 -0600 Subject: [PATCH 0891/1370] Apply bool to some MKS UI --- .../lib/mks_ui/draw_acceleration_settings.cpp | 8 ++-- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 42 ++++++++-------- .../extui/lib/mks_ui/draw_filament_change.cpp | 4 +- .../lib/mks_ui/draw_filament_settings.cpp | 8 ++-- .../mks_ui/draw_manual_level_pos_settings.cpp | 8 ++-- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 8 ++-- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 2 +- .../extui/lib/mks_ui/draw_step_settings.cpp | 8 ++-- .../lib/mks_ui/draw_tmc_current_settings.cpp | 8 ++-- .../mks_ui/draw_tmc_step_mode_settings.cpp | 8 ++-- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 16 +++---- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 48 +++++++++---------- .../lcd/extui/lib/mks_ui/draw_wifi_list.cpp | 2 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 12 ++--- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 8 ++-- 16 files changed, 96 insertions(+), 96 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index 560f5460f5..04c5ee77cb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -50,7 +50,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_ACCE_RETURN: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_clear_acceleration_settings(); draw_return_ui(); break; @@ -95,12 +95,12 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_number_key(); break; case ID_ACCE_UP: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_clear_acceleration_settings(); lv_draw_acceleration_settings(); break; case ID_ACCE_DOWN: - uiCfg.para_ui_page = 1; + uiCfg.para_ui_page = true; lv_clear_acceleration_settings(); lv_draw_acceleration_settings(); break; @@ -110,7 +110,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_acceleration_settings() { scr = lv_screen_create(ACCELERATION_UI, machine_menu.AccelerationConfTitle); - if (uiCfg.para_ui_page != 1) { + if (!uiCfg.para_ui_page) { sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.acceleration); lv_screen_menu_item_1_edit(scr, machine_menu.PrintAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ACCE_PRINT, 0, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index e2a24f78e1..95077d09f2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -160,14 +160,14 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { if (!do_draw_cal) draw_return_ui(); } else if (DIALOG_IS(WIFI_CONFIG_TIPS)) { - uiCfg.configWifi = 1; + uiCfg.configWifi = true; clear_cur_ui(); draw_return_ui(); } else if (DIALOG_IS(TYPE_FILAMENT_HEAT_LOAD_COMPLETED)) - uiCfg.filament_heat_completed_load = 1; + uiCfg.filament_heat_completed_load = true; else if (DIALOG_IS(TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) - uiCfg.filament_heat_completed_unload = 1; + uiCfg.filament_heat_completed_unload = true; else if (DIALOG_IS(TYPE_FILAMENT_LOAD_COMPLETED, TYPE_FILAMENT_UNLOAD_COMPLETED)) { clear_cur_ui(); draw_return_ui(); @@ -198,11 +198,11 @@ static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { else if (DIALOG_IS(TYPE_FILAMENT_LOADING, TYPE_FILAMENT_UNLOADING)) { queue.enqueue_one_P(PSTR("M410")); uiCfg.filament_rate = 0; - uiCfg.filament_loading_completed = 0; - uiCfg.filament_unloading_completed = 0; - uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_completed = false; + uiCfg.filament_unloading_completed = false; + uiCfg.filament_loading_time_flg = false; uiCfg.filament_loading_time_cnt = 0; - uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_time_flg = false; uiCfg.filament_unloading_time_cnt = 0; thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; clear_cur_ui(); @@ -493,22 +493,22 @@ void filament_dialog_handle() { filament_sprayer_temp(); temps_update_flag = false; } - if (uiCfg.filament_heat_completed_load == 1) { - uiCfg.filament_heat_completed_load = 0; + if (uiCfg.filament_heat_completed_load) { + uiCfg.filament_heat_completed_load = false; lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOADING); planner.synchronize(); - uiCfg.filament_loading_time_flg = 1; + uiCfg.filament_loading_time_flg = true; uiCfg.filament_loading_time_cnt = 0; sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E%d F%d\nG90"), uiCfg.curSprayerChoose, gCfgItems.filamentchange_load_length, gCfgItems.filamentchange_load_speed); queue.inject(public_buf_m); } - if (uiCfg.filament_heat_completed_unload == 1) { - uiCfg.filament_heat_completed_unload = 0; + if (uiCfg.filament_heat_completed_unload) { + uiCfg.filament_heat_completed_unload = false; lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOADING); planner.synchronize(); - uiCfg.filament_unloading_time_flg = 1; + uiCfg.filament_unloading_time_flg = true; uiCfg.filament_unloading_time_cnt = 0; sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E-%d F%d\nG90"), uiCfg.curSprayerChoose, gCfgItems.filamentchange_unload_length, gCfgItems.filamentchange_unload_speed); queue.inject(public_buf_m); @@ -516,31 +516,31 @@ void filament_dialog_handle() { if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) - && (uiCfg.filament_load_heat_flg == 1) + && (uiCfg.filament_load_heat_flg) ) { - uiCfg.filament_load_heat_flg = 0; + uiCfg.filament_load_heat_flg = false; lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } - if (uiCfg.filament_loading_completed == 1) { + if (uiCfg.filament_loading_completed) { uiCfg.filament_rate = 0; - uiCfg.filament_loading_completed = 0; + uiCfg.filament_loading_completed = false; lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED); } if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) - && (uiCfg.filament_unload_heat_flg == 1) + && uiCfg.filament_unload_heat_flg ) { - uiCfg.filament_unload_heat_flg = 0; + uiCfg.filament_unload_heat_flg = false; lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); } - if (uiCfg.filament_unloading_completed == 1) { + if (uiCfg.filament_unloading_completed) { uiCfg.filament_rate = 0; - uiCfg.filament_unloading_completed = 0; + uiCfg.filament_unloading_completed = false; lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 017b7120f0..cff99119e8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -49,7 +49,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_FILAMNT_IN: - uiCfg.filament_load_heat_flg = 1; + uiCfg.filament_load_heat_flg = true; if ((abs(thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius) <= 1) || (gCfgItems.filament_limit_temper <= thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) { lv_clear_filament_change(); @@ -65,7 +65,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } break; case ID_FILAMNT_OUT: - uiCfg.filament_unload_heat_flg=1; + uiCfg.filament_unload_heat_flg = true; if ((thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > 0) && ((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) <= 1) || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= gCfgItems.filament_limit_temper)) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index 4dcd9b8b19..128989a27c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -46,7 +46,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_FILAMENT_SET_RETURN: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_clear_filament_settings(); draw_return_ui(); break; @@ -76,12 +76,12 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_number_key(); break; case ID_FILAMENT_SET_UP: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_clear_filament_settings(); lv_draw_filament_settings(); break; case ID_FILAMENT_SET_DOWN: - uiCfg.para_ui_page = 1; + uiCfg.para_ui_page = true; lv_clear_filament_settings(); lv_draw_filament_settings(); break; @@ -91,7 +91,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_filament_settings() { scr = lv_screen_create(FILAMENT_SETTINGS_UI, machine_menu.FilamentConfTitle); - if (uiCfg.para_ui_page != 1) { + if (!uiCfg.para_ui_page) { sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); lv_screen_menu_item_1_edit(scr, machine_menu.InLength, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_IN_LENGTH, 0, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp index 554c32be94..6cbd703f9c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -52,7 +52,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_MANUAL_POS_RETURN: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_clear_manual_level_pos_settings(); draw_return_ui(); return; @@ -87,12 +87,12 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { value = level_pos_y5; break; case ID_MANUAL_POS_UP: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_clear_manual_level_pos_settings(); lv_draw_manual_level_pos_settings(); return; case ID_MANUAL_POS_DOWN: - uiCfg.para_ui_page = 1; + uiCfg.para_ui_page = true; lv_clear_manual_level_pos_settings(); lv_draw_manual_level_pos_settings(); return; @@ -106,7 +106,7 @@ void lv_draw_manual_level_pos_settings() { scr = lv_screen_create(MANUAL_LEVELING_POSIGION_UI, machine_menu.LevelingParaConfTitle); - if (uiCfg.para_ui_page != 1) { + if (!uiCfg.para_ui_page) { sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[0][1]); lv_screen_menu_item_2_edit(scr, leveling_menu.position1, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y1, 0, buf2, ID_MANUAL_POS_X1, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index 393d4736ea..47bd906a51 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -49,7 +49,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_clear_max_feedrate_settings(); switch (obj->mks_obj_id) { case ID_FEED_RETURN: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; draw_return_ui(); return; case ID_FEED_X: @@ -68,11 +68,11 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { value = E1MaxFeedRate; break; case ID_FEED_UP: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_draw_max_feedrate_settings(); return; case ID_FEED_DOWN: - uiCfg.para_ui_page = 1; + uiCfg.para_ui_page = true; lv_draw_max_feedrate_settings(); return; } @@ -82,7 +82,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_max_feedrate_settings() { scr = lv_screen_create(MAXFEEDRATE_UI, machine_menu.MaxFeedRateConfTitle); - if (uiCfg.para_ui_page != 1) { + if (!uiCfg.para_ui_page) { sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); lv_screen_menu_item_1_edit(scr, machine_menu.XMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_X, 0, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index f6702b559e..6b06793f28 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -88,7 +88,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_wifi(); } else { - if (uiCfg.command_send == 1) { + if (uiCfg.command_send) { uint8_t cmd_wifi_list[] = { 0xA5, 0x07, 0x00, 0x00, 0xFC }; raw_send_to_wifi(cmd_wifi_list, COUNT(cmd_wifi_list)); last_disp_state = SET_UI; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index 0f66e5e62d..c5cf45143f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -48,7 +48,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_clear_step_settings(); switch (obj->mks_obj_id) { case ID_STEP_RETURN: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; draw_return_ui(); return; case ID_STEP_X: @@ -67,11 +67,11 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { value = E1step; break; case ID_STEP_UP: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_draw_step_settings(); return; case ID_STEP_DOWN: - uiCfg.para_ui_page = 1; + uiCfg.para_ui_page = true; lv_draw_step_settings(); return; } @@ -81,7 +81,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_step_settings() { scr = lv_screen_create(STEPS_UI, machine_menu.StepsConfTitle); - if (uiCfg.para_ui_page != 1) { + if (!uiCfg.para_ui_page) { sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); lv_screen_menu_item_1_edit(scr, machine_menu.X_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_X, 0, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index 3d503b2115..61ee3be1c3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -49,7 +49,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_clear_tmc_current_settings(); switch (obj->mks_obj_id) { case ID_TMC_CURRENT_RETURN: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; draw_return_ui(); return; #if AXIS_IS_TMC(X) @@ -79,11 +79,11 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { #endif case ID_TMC_CURRENT_UP: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_draw_tmc_current_settings(); return; case ID_TMC_CURRENT_DOWN: - uiCfg.para_ui_page = 1; + uiCfg.para_ui_page = true; lv_draw_tmc_current_settings(); return; } @@ -95,7 +95,7 @@ void lv_draw_tmc_current_settings() { scr = lv_screen_create(TMC_CURRENT_UI, machine_menu.TmcCurrentConfTitle); float milliamps; - if (uiCfg.para_ui_page != 1) { + if (!uiCfg.para_ui_page) { #if AXIS_IS_TMC(X) milliamps = stepperX.getMilliamps(); #else diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 51108dedcf..08d442f8a3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -63,7 +63,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_TMC_MODE_RETURN: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_clear_tmc_step_mode_settings(); draw_return_ui(); break; @@ -95,12 +95,12 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { #endif case ID_TMC_MODE_UP: - uiCfg.para_ui_page = 0; + uiCfg.para_ui_page = false; lv_clear_tmc_step_mode_settings(); lv_draw_tmc_step_mode_settings(); break; case ID_TMC_MODE_DOWN: - uiCfg.para_ui_page = 1; + uiCfg.para_ui_page = true; lv_clear_tmc_step_mode_settings(); lv_draw_tmc_step_mode_settings(); break; @@ -129,7 +129,7 @@ void lv_draw_tmc_step_mode_settings() { stealth_E1 = stepperE1.get_stealthChop(); #endif - if (uiCfg.para_ui_page != 1) { + if (!uiCfg.para_ui_page) { buttonXState = lv_screen_menu_item_onoff(scr, machine_menu.X_StepMode, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_MODE_X, 0, stealth_X); buttonYState = lv_screen_menu_item_onoff(scr, machine_menu.Y_StepMode, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_MODE_Y, 1, stealth_Y); buttonZState = lv_screen_menu_item_onoff(scr, machine_menu.Z_StepMode, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_MODE_Z, 2, stealth_Z); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 23acbb4f84..682d40858c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -63,7 +63,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { public_buf_m[sizeof(public_buf_m)-1] = 0; queue.inject_P(PSTR(public_buf_m)); #else - uiCfg.leveling_first_time = 1; + uiCfg.leveling_first_time = true; lv_draw_manualLevel(); #endif break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 50282536e6..8abedfe0d8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -181,22 +181,22 @@ void ui_cfg_init() { uiCfg.curTempType = 0; uiCfg.curSprayerChoose = 0; uiCfg.stepHeat = 10; - uiCfg.leveling_first_time = 0; - uiCfg.para_ui_page = 0; + uiCfg.leveling_first_time = false; + uiCfg.para_ui_page = false; uiCfg.extruStep = 5; uiCfg.extruSpeed = 10; uiCfg.move_dist = 1; uiCfg.moveSpeed = 3000; uiCfg.stepPrintSpeed = 10; - uiCfg.command_send = 0; + uiCfg.command_send = false; uiCfg.dialogType = 0; - uiCfg.filament_heat_completed_load = 0; + uiCfg.filament_heat_completed_load = false; uiCfg.filament_rate = 0; - uiCfg.filament_loading_completed = 0; - uiCfg.filament_unloading_completed = 0; - uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_completed = false; + uiCfg.filament_unloading_completed = false; + uiCfg.filament_loading_time_flg = false; uiCfg.filament_loading_time_cnt = 0; - uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_time_flg = false; uiCfg.filament_unloading_time_cnt = 0; #if ENABLED(MKS_WIFI_MODULE) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 2728a07ef1..ded6bc7825 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -194,37 +194,37 @@ typedef struct { uint8_t wifi_mode_sel; uint8_t fileSysType; uint8_t wifi_type; - bool cloud_enable; - bool encoder_enable; + bool cloud_enable, + encoder_enable; int levelingPos[5][2]; - int filamentchange_load_length; - int filamentchange_load_speed; - int filamentchange_unload_length; - int filamentchange_unload_speed; - int filament_limit_temper; - float pausePosX; - float pausePosY; - float pausePosZ; + int filamentchange_load_length, + filamentchange_load_speed, + filamentchange_unload_length, + filamentchange_unload_speed, + filament_limit_temper; + float pausePosX, + pausePosY, + pausePosZ; uint32_t curFilesize; } CFG_ITMES; typedef struct { uint8_t curTempType:1, curSprayerChoose:3, - stepHeat:4; - uint8_t leveling_first_time:1, + stepHeat:4, + curSprayerChoose_bak:4; + bool leveling_first_time:1, para_ui_page:1, configWifi:1, command_send:1, filament_load_heat_flg:1, filament_heat_completed_load:1, filament_unload_heat_flg:1, - filament_heat_completed_unload:1; - uint8_t filament_loading_completed:1, + filament_heat_completed_unload:1, + filament_loading_completed:1, filament_unloading_completed:1, filament_loading_time_flg:1, - filament_unloading_time_flg:1, - curSprayerChoose_bak:4; + filament_unloading_time_flg:1; uint8_t wifi_name[32]; uint8_t wifi_key[64]; uint8_t cloud_hostUrl[96]; @@ -240,16 +240,16 @@ typedef struct { uint16_t cloud_port; uint16_t moveSpeed_bak; uint32_t totalSend; - uint32_t filament_loading_time; - uint32_t filament_unloading_time; - uint32_t filament_loading_time_cnt; - uint32_t filament_unloading_time_cnt; + uint32_t filament_loading_time, + filament_unloading_time, + filament_loading_time_cnt, + filament_unloading_time_cnt; float move_dist; float desireSprayerTempBak; - float current_x_position_bak; - float current_y_position_bak; - float current_z_position_bak; - float current_e_position_bak; + float current_x_position_bak, + current_y_position_bak, + current_z_position_bak, + current_e_position_bak; } UI_CFG; typedef enum { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp index d45f9980fc..bda6306e6c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -157,7 +157,7 @@ void disp_wifi_list() { } void wifi_scan_handle() { - if (!DIALOG_IS(WIFI_ENABLE_TIPS) || uiCfg.command_send != 1) return; + if (!DIALOG_IS(WIFI_ENABLE_TIPS) || !uiCfg.command_send) return; last_disp_state = DIALOG_UI; lv_clear_dialog(); if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode != AP_MODEL) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index d005a9b103..65b7538b71 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -87,22 +87,22 @@ void SysTick_Callback() { if (tips_disp.timer == TIPS_TIMER_START) tips_disp.timer_count++; #endif - if (uiCfg.filament_loading_time_flg == 1) { + if (uiCfg.filament_loading_time_flg) { uiCfg.filament_loading_time_cnt++; uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_loading_time_cnt / (uiCfg.filament_loading_time * 1000.0)) * 100.0) + 0.5); if (uiCfg.filament_loading_time_cnt >= (uiCfg.filament_loading_time * 1000)) { uiCfg.filament_loading_time_cnt = 0; - uiCfg.filament_loading_time_flg = 0; - uiCfg.filament_loading_completed = 1; + uiCfg.filament_loading_time_flg = false; + uiCfg.filament_loading_completed = true; } } - if (uiCfg.filament_unloading_time_flg == 1) { + if (uiCfg.filament_unloading_time_flg) { uiCfg.filament_unloading_time_cnt++; uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_unloading_time_cnt / (uiCfg.filament_unloading_time * 1000.0)) * 100.0) + 0.5); if (uiCfg.filament_unloading_time_cnt >= (uiCfg.filament_unloading_time * 1000)) { uiCfg.filament_unloading_time_cnt = 0; - uiCfg.filament_unloading_time_flg = 0; - uiCfg.filament_unloading_completed = 1; + uiCfg.filament_unloading_time_flg = false; + uiCfg.filament_unloading_completed = true; uiCfg.filament_rate = 100; } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index eefdbafbda..bf4f75017f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -953,7 +953,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { wifi_ret_ack(); send_to_wifi((uint8_t *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); } - if (uiCfg.command_send == 0) get_wifi_list_command_send(); + if (!uiCfg.command_send) get_wifi_list_command_send(); break; case 998: @@ -1095,13 +1095,13 @@ static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { memcpy(wifi_firm_ver, (const char *)&msg[16 + wifiNameLen + wifiKeyLen + hostLen + id_len], ver_len); } - if (uiCfg.configWifi == 1) { + if (uiCfg.configWifi) { if ((wifiPara.mode != gCfgItems.wifi_mode_sel) || (strncmp(wifiPara.ap_name, (const char *)uiCfg.wifi_name, 32) != 0) || (strncmp(wifiPara.keyCode, (const char *)uiCfg.wifi_key, 64) != 0)) { package_to_wifi(WIFI_PARA_SET, (uint8_t *)0, 0); } - else uiCfg.configWifi = 0; + else uiCfg.configWifi = false; } if (cfg_cloud_flag == 1) { if (((cloud_para.state >> 4) != (char)gCfgItems.cloud_enable) @@ -1127,7 +1127,7 @@ static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { wifi_list.getNameNum = msg[0]; if (wifi_list.getNameNum < 20) { - uiCfg.command_send = 1; + uiCfg.command_send = true; ZERO(wifi_list.wifiName); wifi_name_num = wifi_list.getNameNum; valid_name_num = 0; From aabd40a7a28c5562e8bf0ffe8821d244ea4a1595 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 16 Jan 2021 20:43:24 -0600 Subject: [PATCH 0892/1370] Optimize some G-code strings --- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 4 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 12 ++-- .../lib/anycubic_chiron/chiron_tft_defs.h | 4 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 14 ++-- .../screens/bio_status_screen.cpp | 2 +- .../screens/move_axis_screen.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 12 ++-- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 64 +++---------------- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 8 +-- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- 11 files changed, 42 insertions(+), 88 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index dbe2339f45..7438b0e83d 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -38,7 +38,7 @@ #include "../../feature/probe_temp_comp.h" #include "../../lcd/marlinui.h" -#include "../../MarlinCore.h" // for wait_for_heatup and idle() +#include "../../MarlinCore.h" // for wait_for_heatup, idle(), G28_STR #if ENABLED(PRINTJOB_TIMER_AUTOSTART) #include "../../module/printcounter.h" @@ -168,7 +168,7 @@ void GcodeSuite::G76() { return; } - process_subcommands_now_P(PSTR("G28")); + process_subcommands_now_P(G28_STR); } remember_feedrate_scaling_off(); diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 3126c46fb8..e1655d0ed9 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -2332,7 +2332,7 @@ void HMI_Prepare() { case PREPARE_CASE_HOME: // Homing checkkey = Last_Prepare; index_prepare = MROWS; - queue.inject_P(PSTR("G28")); // G28 will set home_flag + queue.inject_P(G28_STR); // G28 will set home_flag Popup_Window_Home(); break; #if HAS_ZOFFSET_ITEM diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 2c3217b224..b0053895a7 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -620,10 +620,10 @@ namespace Anycubic { case 21: // A21 Home Axis A21 X if (!isPrinting()) { switch ((char)panel_command[4]) { - case 'X': injectCommands_P(PSTR("G28 X")); break; - case 'Y': injectCommands_P(PSTR("G28 Y")); break; - case 'Z': injectCommands_P(PSTR("G28 Z")); break; - case 'C': injectCommands_P(PSTR("G28")); break; + case 'X': injectCommands_P(PSTR("G28X")); break; + case 'Y': injectCommands_P(PSTR("G28Y")); break; + case 'Z': injectCommands_P(PSTR("G28Z")); break; + case 'C': injectCommands_P(G28_STR); break; } } break; @@ -718,7 +718,7 @@ namespace Anycubic { // If the same meshpoint is selected twice in a row, move the head to that ready for adjustment if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { if (!isPositionKnown()) - injectCommands_P(PSTR("G28")); // home + injectCommands_P(G28_STR); // home if (isPositionKnown()) { #if ACDEBUG(AC_INFO) @@ -746,7 +746,7 @@ namespace Anycubic { if (isPrinting()) SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling else { - injectCommands_P(isMachineHomed() ? PSTR("G29") : PSTR("G28\nG29")); + injectCommands_P(PSTR("G28O\nG29")); printer_state = AC_printer_probing; SendtoTFTLN(AC_msg_start_probing); } diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h index 408c0d7484..7012e98d92 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -105,8 +105,8 @@ #define AC_cmnd_manual_load_filament PSTR("M83\nG1 E50 F700\nM82") // replace the manual panel commands with something a little faster #define AC_cmnd_manual_unload_filament PSTR("M83\nG1 E-50 F1200\nM82") -#define AC_cmnd_enable_leveling PSTR("M420 S1 V1") -#define AC_cmnd_power_loss_recovery PSTR("G28 X Y R5\nG28 Z") // Lift, home X and Y then home Z when in 'safe' position +#define AC_cmnd_enable_leveling PSTR("M420SV") +#define AC_cmnd_power_loss_recovery PSTR("G28XYR5\nG28Z") // Lift, home X and Y then home Z when in 'safe' position namespace Anycubic { enum heater_state_t : uint8_t { diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 72e5f1d14d..9c1fb90635 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -28,7 +28,7 @@ #include "../../../../libs/numtostr.h" #include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage -#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +#include "../../../../MarlinCore.h" // for quickstop_stepper, disable_steppers, G28_STR #include "../../../../inc/MarlinConfig.h" // command sending macro's with debugging capability @@ -274,12 +274,12 @@ void AnycubicTFTClass::HandleSpecialMenu() { case '6': // "<06SMeshLvl>" SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); - ExtUI::injectCommands_P(PSTR("G29 S1")); + ExtUI::injectCommands_P(PSTR("G29S1")); break; case '7': // "<07MeshNPnt>" SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); - ExtUI::injectCommands_P(PSTR("G29 S2")); + ExtUI::injectCommands_P(PSTR("G29S2")); break; case '8': // "<08HtEndPID>" @@ -758,14 +758,14 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { if (CodeSeen('X')) - ExtUI::injectCommands_P(PSTR("G28 X")); + ExtUI::injectCommands_P(PSTR("G28X")); if (CodeSeen('Y')) - ExtUI::injectCommands_P(PSTR("G28 Y")); + ExtUI::injectCommands_P(PSTR("G28Y")); if (CodeSeen('Z')) - ExtUI::injectCommands_P(PSTR("G28 Z")); + ExtUI::injectCommands_P(PSTR("G28Z")); } else if (CodeSeen('C')) { - ExtUI::injectCommands_P(PSTR("G28")); + ExtUI::injectCommands_P(G28_STR); } } break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index fc827e83e3..90d8d6251d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -319,7 +319,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) { case 9: GOTO_SCREEN(FilesScreen); break; case 10: GOTO_SCREEN(MainMenu); break; case 13: GOTO_SCREEN(BioConfirmHomeE); break; - case 14: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break; + case 14: SpinnerDialogBox::enqueueAndWait_P(F("G28Z")); break; case 15: GOTO_SCREEN(TemperatureScreen); break; case 16: fine_motion = !fine_motion; break; default: return false; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index 75c6093955..ba38918b1c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -94,9 +94,9 @@ bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) { case 14: UI_DECREMENT_AXIS(E3); screen_data.MoveAxis.e_rel[3] -= increment; break; case 15: UI_INCREMENT_AXIS(E3); screen_data.MoveAxis.e_rel[3] += increment; break; #endif - case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28 X")); break; - case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28 Y")); break; - case 22: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break; + case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28X")); break; + case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28Y")); break; + case 22: SpinnerDialogBox::enqueueAndWait_P(F("G28Z")); break; case 23: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break; default: return false; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index a737197fce..5b65f990c1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -31,6 +31,8 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" +extern const char G28_STR[]; + extern lv_group_t *g; static lv_obj_t *scr; @@ -48,22 +50,22 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_H_ALL: - queue.inject_P(PSTR("G28")); + queue.inject_P(G28_STR); break; case ID_H_X: - queue.inject_P(PSTR("G28 X0")); + queue.inject_P(PSTR("G28X")); break; case ID_H_Y: - queue.inject_P(PSTR("G28 Y0")); + queue.inject_P(PSTR("G28Y")); break; case ID_H_Z: - queue.inject_P(PSTR("G28 Z0")); + queue.inject_P(PSTR("G28Z")); break; case ID_H_OFF_ALL: queue.inject_P(PSTR("M84")); break; case ID_H_OFF_XY: - queue.inject_P(PSTR("M84 X Y")); + queue.inject_P(PSTR("M84XY")); break; case ID_H_RETURN: clear_cur_ui(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 51761da8f3..0b09ae391d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -29,6 +29,8 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" +extern const char G28_STR[]; + extern lv_group_t *g; static lv_obj_t *scr; @@ -45,65 +47,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { - case ID_M_POINT1: + case ID_M_POINT1 ... ID_M_POINT5: if (queue.length == 0) { if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; + uiCfg.leveling_first_time = false; + queue.inject_P(G28_STR); } - queue.enqueue_now_P(PSTR("G1 Z10")); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[0][0], (int)gCfgItems.levelingPos[0][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - break; - case ID_M_POINT2: - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - queue.enqueue_now_P(PSTR("G1 Z10")); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[1][0], (int)gCfgItems.levelingPos[1][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - break; - case ID_M_POINT3: - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - queue.enqueue_now_P(PSTR("G1 Z10")); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[2][0], (int)gCfgItems.levelingPos[2][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - - break; - case ID_M_POINT4: - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - queue.enqueue_now_P(PSTR("G1 Z10")); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[3][0], (int)gCfgItems.levelingPos[3][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - break; - case ID_M_POINT5: - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - queue.enqueue_now_P(PSTR("G1 Z10")); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[4][0], (int)gCfgItems.levelingPos[4][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); + const int ind = obj->mks_obj_id - ID_M_POINT1; + sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), (int)gCfgItems.levelingPos[ind][0], (int)gCfgItems.levelingPos[ind][1]); + queue.inject(public_buf_l); } break; case ID_MANUAL_RETURN: diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 64dca3b04f..04c2152e61 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -103,9 +103,9 @@ ui.wait_for_move = true; ui.goto_screen(_lcd_level_bed_done); #if ENABLED(MESH_BED_LEVELING) - queue.inject_P(PSTR("G29 S2")); + queue.inject_P(PSTR("G29S2")); #elif ENABLED(PROBE_MANUALLY) - queue.inject_P(PSTR("G29 V1")); + queue.inject_P(PSTR("G29V1")); #endif } else @@ -155,9 +155,9 @@ // G29 Records Z, moves, and signals when it pauses ui.wait_for_move = true; #if ENABLED(MESH_BED_LEVELING) - queue.inject_P(manual_probe_index ? PSTR("G29 S2") : PSTR("G29 S1")); + queue.inject_P(manual_probe_index ? PSTR("G29S2") : PSTR("G29S1")); #elif ENABLED(PROBE_MANUALLY) - queue.inject_P(PSTR("G29 V1")); + queue.inject_P(PSTR("G29V1")); #endif } diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index f849d20eca..f997b56f38 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -402,7 +402,7 @@ void menu_motion() { #endif #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - GCODES_ITEM(MSG_M48_TEST, PSTR("G28 O\nM48 P10")); + GCODES_ITEM(MSG_M48_TEST, PSTR("G28O\nM48 P10")); #endif // From 522c78b5e6f2faf23e6cbdf928362d784145c29d Mon Sep 17 00:00:00 2001 From: zeleps <39417467+zeleps@users.noreply.github.com> Date: Sun, 17 Jan 2021 07:08:48 +0200 Subject: [PATCH 0893/1370] Fix Tramming Wizard behavior (#20796) --- Marlin/src/feature/bedlevel/bedlevel.h | 4 ++++ Marlin/src/gcode/calibrate/G28.cpp | 5 ++--- Marlin/src/lcd/menu/menu_tramming.cpp | 9 +++++++-- Marlin/src/module/tool_change.cpp | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index 995e9d0dbc..a33f08ad0e 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -23,6 +23,10 @@ #include "../../inc/MarlinConfigPre.h" +#if EITHER(RESTORE_LEVELING_AFTER_G28, ENABLE_LEVELING_AFTER_G28) + #define G28_L0_ENSURES_LEVELING_OFF 1 +#endif + #if ENABLED(PROBE_MANUALLY) extern bool g29_in_progress; #else diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 7c13587a67..2de029a08b 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -241,7 +241,7 @@ void GcodeSuite::G28() { // Disable the leveling matrix before homing #if HAS_LEVELING - IF_ENABLED(RESTORE_LEVELING_AFTER_G28, const bool leveling_restore_state = planner.leveling_active); + const bool leveling_restore_state = parser.boolval('L', TERN(RESTORE_LEVELING_AFTER_G28, planner.leveling_active, ENABLED(ENABLE_LEVELING_AFTER_G28))); IF_ENABLED(PROBE_MANUALLY, g29_in_progress = false); // Cancel the active G29 session set_bed_leveling_enabled(false); #endif @@ -440,8 +440,7 @@ void GcodeSuite::G28() { do_blocking_move_to_z(delta_clip_start_height); #endif - IF_ENABLED(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_restore_state)); - IF_ENABLED(ENABLE_LEVELING_AFTER_G28, set_bed_leveling_enabled(true)); + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_restore_state)); restore_feedrate_and_scaling(); diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index a77709e108..da7afd86ef 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -42,6 +42,10 @@ float z_measured[G35_PROBE_COUNT] = { 0 }; static uint8_t tram_index = 0; +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + static bool probe_single_point() { do_blocking_move_to_z(TERN(BLTOUCH, Z_CLEARANCE_DEPLOY_PROBE, Z_CLEARANCE_BETWEEN_PROBES)); // Stow after each point with BLTouch "HIGH SPEED" mode for push-pin safety @@ -60,7 +64,7 @@ static void _menu_single_probe(const uint8_t point) { STATIC_ITEM(MSG_LEVEL_CORNERS, SS_LEFT); STATIC_ITEM(MSG_LAST_VALUE_SP, SS_LEFT, ftostr42_52(z_measured[0] - z_measured[point])); // Print diff ACTION_ITEM(MSG_UBL_BC_INSERT2, []{ if (probe_single_point()) ui.refresh(); }); - ACTION_ITEM(MSG_BUTTON_DONE, []{ ui.goto_previous_screen_no_defer(); }); // Back + ACTION_ITEM(MSG_BUTTON_DONE, []{ ui.goto_previous_screen(); }); // Back END_MENU(); } @@ -88,7 +92,8 @@ void goto_tramming_wizard() { // Inject G28, wait for homing to complete, set_all_unhomed(); - queue.inject_P(G28_STR); + queue.inject_P(TERN(G28_L0_ENSURES_LEVELING_OFF, PSTR("G28L0"), G28_STR)); + ui.goto_screen([]{ _lcd_draw_homing(); if (all_axes_homed()) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 7f581131d8..95f32f2faa 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -918,7 +918,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { DEBUG_ECHOLNPGM("No move (not homed)"); } - TERN_(HAS_LCD_MENU, if (!no_move) ui.return_to_status()); + TERN_(HAS_LCD_MENU, if (!no_move) ui.update()); #if ENABLED(DUAL_X_CARRIAGE) const bool idex_full_control = dual_x_carriage_mode == DXC_FULL_CONTROL_MODE; From 7836b85c967da464de8f5cfcaf7ad235bf33610e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 16 Jan 2021 23:15:43 -0600 Subject: [PATCH 0894/1370] Reduce some G-code strings --- Marlin/src/lcd/menu/menu_ubl.cpp | 70 ++++++++++++++++---------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 52b7b1ccb0..cbab597d6f 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -139,9 +139,9 @@ void _lcd_ubl_custom_mesh() { * UBL Adjust Mesh Height Command */ void _lcd_ubl_adjust_height_cmd() { - char ubl_lcd_gcode[16]; - const int ind = ubl_height_amount > 0 ? 9 : 10; - strcpy_P(ubl_lcd_gcode, PSTR("G29 P6 C -")); + char ubl_lcd_gcode[13]; + const int ind = ubl_height_amount > 0 ? 6 : 7; + strcpy_P(ubl_lcd_gcode, PSTR("G29P6C-")); sprintf_P(&ubl_lcd_gcode[ind], PSTR(".%i"), ABS(ubl_height_amount)); queue.inject(ubl_lcd_gcode); } @@ -174,8 +174,8 @@ void _menu_ubl_height_adjust() { void _lcd_ubl_edit_mesh() { START_MENU(); BACK_ITEM(MSG_UBL_TOOLS); - GCODES_ITEM(MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - GCODES_ITEM(MSG_UBL_FINE_TUNE_CLOSEST, PSTR("G29 P4 T")); + GCODES_ITEM(MSG_UBL_FINE_TUNE_ALL, PSTR("G29P4R999T")); + GCODES_ITEM(MSG_UBL_FINE_TUNE_CLOSEST, PSTR("G29P4T")); SUBMENU(MSG_UBL_MESH_HEIGHT_ADJUST, _menu_ubl_height_adjust); ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); END_MENU(); @@ -187,8 +187,8 @@ void _lcd_ubl_edit_mesh() { * UBL Validate Custom Mesh Command */ void _lcd_ubl_validate_custom_mesh() { - char ubl_lcd_gcode[24]; - sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26 C P H%" PRIi16 TERN_(HAS_HEATED_BED, " B%" PRIi16)) + char ubl_lcd_gcode[20]; + sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26CPH%" PRIi16 TERN_(HAS_HEATED_BED, "B%" PRIi16)) , custom_hotend_temp #if HAS_HEATED_BED , custom_bed_temp @@ -211,10 +211,10 @@ void _lcd_ubl_edit_mesh() { #if PREHEAT_COUNT #if HAS_HEATED_BED #define VALIDATE_MESH_GCODE_ITEM(M) \ - GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26 C P I" STRINGIFY(M))) + GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26CPI" STRINGIFY(M))) #else #define VALIDATE_MESH_GCODE_ITEM(M) \ - GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26 C P B0 I" STRINGIFY(M))) + GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26CPB0I" STRINGIFY(M))) #endif VALIDATE_MESH_GCODE_ITEM(0); @@ -251,7 +251,7 @@ void _lcd_ubl_grid_level() { EDIT_ITEM(int3, MSG_UBL_SIDE_POINTS, &side_points, 2, 6); ACTION_ITEM(MSG_UBL_MESH_LEVEL, []{ char ubl_lcd_gcode[12]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 J%i"), side_points); + sprintf_P(ubl_lcd_gcode, PSTR("G29J%i"), side_points); queue.inject(ubl_lcd_gcode); }); END_MENU(); @@ -268,7 +268,7 @@ void _lcd_ubl_grid_level() { void _lcd_ubl_mesh_leveling() { START_MENU(); BACK_ITEM(MSG_UBL_TOOLS); - GCODES_ITEM(MSG_UBL_3POINT_MESH_LEVELING, PSTR("G29 J0")); + GCODES_ITEM(MSG_UBL_3POINT_MESH_LEVELING, PSTR("G29J0")); SUBMENU(MSG_UBL_GRID_MESH_LEVELING, _lcd_ubl_grid_level); ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); END_MENU(); @@ -279,7 +279,7 @@ void _lcd_ubl_mesh_leveling() { */ void _lcd_ubl_fillin_amount_cmd() { char ubl_lcd_gcode[18]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 P3 R C.%i"), ubl_fillin_amount); + sprintf_P(ubl_lcd_gcode, PSTR("G29P3RC.%i"), ubl_fillin_amount); gcode.process_subcommands_now(ubl_lcd_gcode); } @@ -297,8 +297,8 @@ void _menu_ubl_fillin() { START_MENU(); BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); EDIT_ITEM(int3, MSG_UBL_FILLIN_AMOUNT, &ubl_fillin_amount, 0, 9, _lcd_ubl_fillin_amount_cmd); - GCODES_ITEM(MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); - GCODES_ITEM(MSG_UBL_MANUAL_FILLIN, PSTR("G29 P2 B T0")); + GCODES_ITEM(MSG_UBL_SMART_FILLIN, PSTR("G29P3T0")); + GCODES_ITEM(MSG_UBL_MANUAL_FILLIN, PSTR("G29P2BT0")); ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); END_MENU(); } @@ -326,7 +326,7 @@ void _lcd_ubl_build_mesh() { BACK_ITEM(MSG_UBL_TOOLS); #if PREHEAT_COUNT #if HAS_HEATED_BED - #define PREHEAT_BED_GCODE(M) "M190 I" STRINGIFY(M) "\n" + #define PREHEAT_BED_GCODE(M) "M190I" STRINGIFY(M) "\n" #else #define PREHEAT_BED_GCODE(M) "" #endif @@ -334,10 +334,10 @@ void _lcd_ubl_build_mesh() { PSTR( \ "G28\n" \ PREHEAT_BED_GCODE(M) \ - "M109 I" STRINGIFY(M) "\n" \ - "G29 P1\n" \ - "M104 S0\n" \ - "M140 S0" \ + "M109I" STRINGIFY(M) "\n" \ + "G29P1\n" \ + "M104S0\n" \ + "M140S0" \ ) ) BUILD_MESH_GCODE_ITEM(0); #if PREHEAT_COUNT > 1 @@ -355,11 +355,11 @@ void _lcd_ubl_build_mesh() { #endif // PREHEAT_COUNT SUBMENU(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh); - GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); + GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29P1")); SUBMENU(MSG_UBL_FILLIN_MESH, _menu_ubl_fillin); - GCODES_ITEM(MSG_UBL_CONTINUE_MESH, PSTR("G29 P1 C")); + GCODES_ITEM(MSG_UBL_CONTINUE_MESH, PSTR("G29P1C")); ACTION_ITEM(MSG_UBL_INVALIDATE_ALL, _lcd_ubl_invalidate); - GCODES_ITEM(MSG_UBL_INVALIDATE_CLOSEST, PSTR("G29 I")); + GCODES_ITEM(MSG_UBL_INVALIDATE_CLOSEST, PSTR("G29I")); ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); END_MENU(); } @@ -369,7 +369,7 @@ void _lcd_ubl_build_mesh() { */ inline void _lcd_ubl_load_save_cmd(const char loadsave, PGM_P const msg) { char ubl_lcd_gcode[40]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 %c%i\nM117 "), loadsave, ubl_storage_slot); + sprintf_P(ubl_lcd_gcode, PSTR("G29%c%i\nM117 "), loadsave, ubl_storage_slot); sprintf_P(&ubl_lcd_gcode[strlen(ubl_lcd_gcode)], msg, ubl_storage_slot); gcode.process_subcommands_now(ubl_lcd_gcode); } @@ -405,7 +405,7 @@ void _lcd_ubl_map_edit_cmd() { char ubl_lcd_gcode[50], str[10], str2[10]; dtostrf(ubl.mesh_index_to_xpos(x_plot), 0, 2, str); dtostrf(ubl.mesh_index_to_ypos(y_plot), 0, 2, str2); - snprintf_P(ubl_lcd_gcode, sizeof(ubl_lcd_gcode), PSTR("G29 P4 X%s Y%s R%i"), str, str2, int(n_edit_pts)); + snprintf_P(ubl_lcd_gcode, sizeof(ubl_lcd_gcode), PSTR("G29P4X%sY%sR%i"), str, str2, int(n_edit_pts)); queue.inject(ubl_lcd_gcode); } @@ -544,9 +544,9 @@ void _ubl_goto_map_screen() { void _lcd_ubl_output_map() { START_MENU(); BACK_ITEM(MSG_UBL_LEVEL_BED); - GCODES_ITEM(MSG_UBL_OUTPUT_MAP_HOST, PSTR("G29 T0")); - GCODES_ITEM(MSG_UBL_OUTPUT_MAP_CSV, PSTR("G29 T1")); - GCODES_ITEM(MSG_UBL_OUTPUT_MAP_BACKUP, PSTR("G29 S-1")); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_HOST, PSTR("G29T0")); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_CSV, PSTR("G29T1")); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_BACKUP, PSTR("G29S-1")); END_MENU(); } @@ -563,7 +563,7 @@ void _menu_ubl_tools() { START_MENU(); BACK_ITEM(MSG_UBL_LEVEL_BED); SUBMENU(MSG_UBL_BUILD_MESH_MENU, _lcd_ubl_build_mesh); - GCODES_ITEM(MSG_UBL_MANUAL_MESH, PSTR("G29 I999\nG29 P2 B T0")); + GCODES_ITEM(MSG_UBL_MANUAL_MESH, PSTR("G29I999\nG29P2BT0")); #if ENABLED(G26_MESH_VALIDATION) SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); #endif @@ -589,12 +589,12 @@ void _menu_ubl_tools() { void _lcd_ubl_step_by_step() { START_MENU(); BACK_ITEM(MSG_UBL_LEVEL_BED); - GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); - GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29 P3 T0")); + GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29P1")); + GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29P3T0")); SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29P4R999T")); SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29P4R999T")); ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd); END_MENU(); } @@ -618,9 +618,9 @@ void _lcd_ubl_level_bed() { START_MENU(); BACK_ITEM(MSG_MOTION); if (planner.leveling_active) - GCODES_ITEM(MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D")); + GCODES_ITEM(MSG_UBL_DEACTIVATE_MESH, PSTR("G29D")); else - GCODES_ITEM(MSG_UBL_ACTIVATE_MESH, PSTR("G29 A")); + GCODES_ITEM(MSG_UBL_ACTIVATE_MESH, PSTR("G29A")); #if ENABLED(G26_MESH_VALIDATION) SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); #endif @@ -628,7 +628,7 @@ void _lcd_ubl_level_bed() { SUBMENU(MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh); SUBMENU(MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map); SUBMENU(MSG_UBL_TOOLS, _menu_ubl_tools); - GCODES_ITEM(MSG_UBL_INFO_UBL, PSTR("G29 W")); + GCODES_ITEM(MSG_UBL_INFO_UBL, PSTR("G29W")); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) editable.decimal = planner.z_fade_height; EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); }); From f101e1925779d4d44f89804eeb9cb62a4eaf999e Mon Sep 17 00:00:00 2001 From: George Fu Date: Sun, 17 Jan 2021 14:46:57 +0800 Subject: [PATCH 0895/1370] FYSETC_242 OLED 12864 for S6 (#20767) --- Marlin/src/lcd/dogm/HAL_LCD_class_defines.h | 13 ++ Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 2 + Marlin/src/lcd/dogm/marlinui_DOGM.h | 16 ++- Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp | 128 ++++++++++++++++++ Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 59 ++++---- 5 files changed, 192 insertions(+), 26 deletions(-) create mode 100644 Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h index 1511c69933..30a5361ab9 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h @@ -107,3 +107,16 @@ public: : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset) { } }; + +extern u8g_dev_t u8g_dev_ssd1309_sw_spi; +extern u8g_dev_t u8g_dev_ssd1309_hw_spi; + +class U8GLIB_SSD1309_128X64_HAL : public U8GLIB { +public: + U8GLIB_SSD1309_128X64_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_ssd1309_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) + { } + U8GLIB_SSD1309_128X64_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_ssd1309_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) + { } +}; diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index 535502f2e1..8a707ab41a 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -52,7 +52,9 @@ #elif defined(ARDUINO_ARCH_STM32) + uint8_t u8g_com_std_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); uint8_t u8g_com_stm32duino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_std_sw_spi_fn #define U8G_COM_HAL_HW_SPI_FN u8g_com_stm32duino_hw_spi_fn #elif defined(__AVR__) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index 16cb70dbd8..e5229cd088 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -110,11 +110,9 @@ #define U8G_CLASS U8GLIB_MINI12864_2X // 8 stripes (HW-SPI) #endif -#elif EITHER(MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) +#elif ENABLED(MKS_12864OLED_SSD1306) // MKS 128x64 (SSD1306) OLED I2C LCD - // - or - - // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER #define FORCE_SOFT_SPI // SW-SPI @@ -124,6 +122,18 @@ #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes #endif +#elif ENABLED(FYSETC_242_OLED_12864) + + // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER + + #define FORCE_SOFT_SPI // SW-SPI + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes + #else + #define U8G_CLASS U8GLIB_SSD1309_128X64_HAL + #endif + #elif ENABLED(ZONESTAR_12864OLED_SSD1306) // Zonestar SSD1306 OLED SPI LCD diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp new file mode 100644 index 0000000000..8ba19216b1 --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp @@ -0,0 +1,128 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include "HAL_LCD_com_defines.h" +#include + +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 + +// SSD1309 init sequence +static const uint8_t u8g_dev_ssd1309_128x64_init_seq[] PROGMEM = { + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_RST(1), // Do reset low pulse with (1*16)+2 milliseconds + U8G_ESC_CS(1), // Enable chip + + 0xFD,0x12, // Command Lock + 0xAE, // Set Display Off + 0xD5,0xA0, // Set Display Clock Divide Ratio/Oscillator Frequency + 0xA8,0x3F, // Set Multiplex Ratio + 0x3D,0x00, // Set Display Offset + 0x40, // Set Display Start Line + 0xA1, // Set Segment Re-Map + 0xC8, // Set COM Output Scan Direction + 0xDA,0x12, // Set COM Pins Hardware Configuration + 0x81,0xDF, // Set Current Control + 0xD9,0x82, // Set Pre-Charge Period + 0xDB,0x34, // Set VCOMH Deselect Level + 0xA4, // Set Entire Display On/Off + 0xA6, // Set Normal/Inverse Display + U8G_ESC_VCC(1), // Power up VCC & Stabilized + U8G_ESC_DLY(50), + 0xAF, // Set Display On + U8G_ESC_DLY(50), + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence +}; + +// Select one init sequence here +#define u8g_dev_ssd1309_128x64_init_seq u8g_dev_ssd1309_128x64_init_seq + +static const uint8_t u8g_dev_ssd1309_128x64_data_start[] PROGMEM = { + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + 0x010, // Set upper 4 bit of the col adr to 0 + 0x000, // Set lower 4 bit of the col adr to 4 + U8G_ESC_END // End of sequence +}; + +static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + 0x0AE, // Display off + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence +}; + +static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + 0x0AF, // Display on + U8G_ESC_DLY(50), // Delay 50 ms + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence +}; + +uint8_t u8g_dev_ssd1309_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1309_128x64_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1309_128x64_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); // Select current page (SSD1306) + u8g_SetAddress(u8g, dev, 1); // Data mode + if (u8g_pb_WriteBuffer(pb, u8g, dev) == 0) return 0; + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); // Instruction mode + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); // 11 Jul 2015: fixed contrast calculation + u8g_SetChipSelect(u8g, dev, 0); + return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); + return 1; + } + return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_ssd1309_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_ssd1309_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1309_buf}; +u8g_dev_t u8g_dev_ssd1309_sw_spi = { u8g_dev_ssd1309_128x64_fn, &u8g_dev_ssd1309_pb, U8G_COM_HAL_SW_SPI_FN }; + +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 7d435c8cd5..a280775646 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -198,7 +198,27 @@ // // LCD / Controller // -#if HAS_WIRED_LCD +#if ENABLED(FYSETC_242_OLED_12864) + + #define BTN_EN1 PC9 + #define BTN_EN2 PD1 + #define BTN_ENC PA8 + + #define BEEPER_PIN PC6 + + #define LCD_PINS_DC PC12 + #define LCD_PINS_RS PC7 // LCD_RST + #define DOGLCD_CS PD2 + #define DOGLCD_MOSI PC10 + #define DOGLCD_SCK PC11 + #define DOGLCD_A0 LCD_PINS_DC + #define FORCE_SOFT_SPI + + #define KILL_PIN -1 // NC + #define NEOPIXEL_PIN PD0 + +#elif HAS_WIRED_LCD + #define BEEPER_PIN PC9 #define BTN_ENC PA8 @@ -211,11 +231,6 @@ #define LCD_PINS_ENABLE PD1 #define LCD_PINS_D4 PC12 - // CR10_STOCKDISPLAY default timing is too fast - #undef BOARD_ST7920_DELAY_1 - #undef BOARD_ST7920_DELAY_2 - #undef BOARD_ST7920_DELAY_3 - #else #define LCD_PINS_RS PD2 @@ -229,7 +244,7 @@ #define LCD_PINS_D4 PC10 #if ENABLED(FYSETC_MINI_12864) - // See https://wiki.fysetc.com/Mini12864_Panel + // See https://wiki.fysetc.com/Mini12864_Panel #define DOGLCD_CS PC11 #define DOGLCD_A0 PD2 #if ENABLED(FYSETC_GENERIC_12864_1_1) @@ -249,36 +264,34 @@ #elif ENABLED(FYSETC_MINI_12864_2_1) #define NEOPIXEL_PIN PC12 #endif - #endif // !FYSETC_MINI_12864 + #endif #if IS_ULTIPANEL #define LCD_PINS_D5 PC12 #define LCD_PINS_D6 PD0 #define LCD_PINS_D7 PD1 - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder #endif - #endif #endif - // Alter timing for graphical display - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(640) - #endif - #endif - #endif // HAS_WIRED_LCD +// Alter timing for graphical display +#if HAS_MARLINUI_U8GLIB + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(640) + #endif +#endif + #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN PB6 #endif From 6162560b6991317c44cd639e5e43418fbd81f248 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 17 Jan 2021 12:08:40 -0600 Subject: [PATCH 0896/1370] Internal G29N for G28+G29 (#20800) --- Marlin/Configuration_adv.h | 4 ++-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 3 ++- Marlin/src/gcode/bedlevel/abl/G29.cpp | 13 +++++++++---- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 2 +- Marlin/src/gcode/feature/pause/M600.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 ++-- .../lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 4 ++-- 12 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0e2545700d..d1b5c7f5ce 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3344,7 +3344,7 @@ //#define USER_SCRIPT_RETURN // Return to status screen after a script #define USER_DESC_1 "Home & UBL Info" - #define USER_GCODE_1 "G28\nG29 W" + #define USER_GCODE_1 "G29NW" #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) @@ -3353,7 +3353,7 @@ #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) #define USER_DESC_4 "Heat Bed/Home/Level" - #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG29N" #define USER_DESC_5 "Home & Info" #define USER_GCODE_5 "G28\nM503" diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 598bfeee50..3f7b2d7d96 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -321,7 +321,8 @@ // Check for commands that require the printer to be homed if (may_move) { planner.synchronize(); - if (axes_should_home()) gcode.home_all_axes(); + // Send 'N' to force homing before G29 (internal only) + if (axes_should_home() || parser.seen('N')) gcode.home_all_axes(); TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 8e87bb4f7d..28ffd59edc 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -181,14 +181,18 @@ G29_TYPE GcodeSuite::G29() { no_action = seenA || seenQ, faux = ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) ? parser.boolval('C') : no_action; - // Don't allow auto-leveling without homing first - if (homing_needed_error()) G29_RETURN(false); - if (!no_action && planner.leveling_active && parser.boolval('O')) { // Auto-level only if needed if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> Auto-level not needed, skip"); G29_RETURN(false); } + // Send 'N' to force homing before G29 (internal only) + if (parser.seen('N')) + gcode.process_subcommands_now_P(TERN(G28_L0_ENSURES_LEVELING_OFF, PSTR("G28L0"), G28_STR)); + + // Don't allow auto-leveling without homing first + if (homing_needed_error()) G29_RETURN(false); + // Define local vars 'static' for manual probing, 'auto' otherwise #define ABL_VAR TERN_(PROBE_MANUALLY, static) @@ -249,7 +253,6 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(AUTO_BED_LEVELING_LINEAR) struct linear_fit_data lsf_results; - incremental_LSF_reset(&lsf_results); #endif /** @@ -324,6 +327,8 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(AUTO_BED_LEVELING_LINEAR) + incremental_LSF_reset(&lsf_results); + do_topography_map = verbose_level > 2 || parser.boolval('T'); // X and Y specify points in each direction, overriding the default diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index d5cc8a4fcb..cf27c14d3b 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -85,7 +85,7 @@ void GcodeSuite::G29() { mbl.reset(); mbl_probe_index = 0; if (!ui.wait_for_move) { - queue.inject_P(PSTR("G28\nG29 S2")); + queue.inject_P(parser.seen('N') ? PSTR("G28" TERN(G28_L0_ENSURES_LEVELING_OFF, "L0", "") "\nG29S2") : PSTR("G29S2")); return; } state = MeshNext; diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index bdaec7c7f9..db8bc93a9f 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -102,7 +102,7 @@ void GcodeSuite::M600() { #if ENABLED(HOME_BEFORE_FILAMENT_CHANGE) // If needed, home before parking for filament change - if (!all_axes_trusted()) home_all_axes(); + if (!all_axes_trusted()) home_all_axes(true); #endif #if HAS_MULTI_EXTRUDER diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 735456a533..765cd8e591 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -369,9 +369,9 @@ public: static void process_subcommands_now_P(PGM_P pgcode); static void process_subcommands_now(char * gcode); - static inline void home_all_axes() { + static inline void home_all_axes(const bool keep_leveling=false) { extern const char G28_STR[]; - process_subcommands_now_P(G28_STR); + process_subcommands_now_P(keep_leveling ? G28_STR : TERN(G28_L0_ENSURES_LEVELING_OFF, PSTR("G28L0"), G28_STR)); } #if EITHER(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 9c1fb90635..a3f7c42a5c 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -324,7 +324,7 @@ void AnycubicTFTClass::HandleSpecialMenu() { case '2': // "<02ABL>" SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); - ExtUI::injectCommands_P(PSTR("G28\nG29")); + ExtUI::injectCommands_P(PSTR("G29N")); break; case '3': // "<03HtendPID>" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 8abedfe0d8..88e6fab07c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -75,7 +75,7 @@ extern lv_group_t *g; extern void LCD_IO_WriteData(uint16_t RegValue); static const char custom_gcode_command[][100] = { - "G28\nG29\nM500", + "G29N\nM500", "G28", "G28", "G28", diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 0088f306f6..bcf5aea8d7 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -213,7 +213,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { void _lcd_draw_level_prompt() { if (!ui.should_draw()) return; MenuItem_confirm::confirm_screen( - []{ queue.inject_P(TERN(HAS_LEVELING, PSTR("G28\nG29"), G28_STR)); + []{ queue.inject_P(TERN(HAS_LEVELING, PSTR("G29N"), G28_STR)); ui.return_to_status(); } , []{ ui.goto_previous_screen_no_defer(); } diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 04c2152e61..6a9f89f118 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -254,7 +254,7 @@ void menu_bed_leveling() { SUBMENU(MSG_LEVEL_BED, _lcd_level_bed_continue); #else // Automatic leveling can just run the G-code - GCODES_ITEM(MSG_LEVEL_BED, is_homed ? PSTR("G29") : PSTR("G28\nG29")); + GCODES_ITEM(MSG_LEVEL_BED, is_homed ? PSTR("G29") : PSTR("G29N")); #endif #if ENABLED(MESH_EDIT_MENU) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index f997b56f38..ecc378b607 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -382,7 +382,7 @@ void menu_motion() { #elif HAS_LEVELING && DISABLED(SLIM_LCD_MENUS) #if DISABLED(PROBE_MANUALLY) - GCODES_ITEM(MSG_LEVEL_BED, PSTR("G28\nG29")); + GCODES_ITEM(MSG_LEVEL_BED, PSTR("G29N")); #endif if (all_axes_homed() && leveling_is_valid()) { diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index cbab597d6f..95e64a0d82 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -355,7 +355,7 @@ void _lcd_ubl_build_mesh() { #endif // PREHEAT_COUNT SUBMENU(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh); - GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29P1")); + GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, PSTR("G29NP1")); SUBMENU(MSG_UBL_FILLIN_MESH, _menu_ubl_fillin); GCODES_ITEM(MSG_UBL_CONTINUE_MESH, PSTR("G29P1C")); ACTION_ITEM(MSG_UBL_INVALIDATE_ALL, _lcd_ubl_invalidate); @@ -589,7 +589,7 @@ void _menu_ubl_tools() { void _lcd_ubl_step_by_step() { START_MENU(); BACK_ITEM(MSG_UBL_LEVEL_BED); - GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29P1")); + GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G29NP1")); GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29P3T0")); SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29P4R999T")); From 69b873b766689563a964fff16c4ab3e2ffa8507d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 17 Jan 2021 15:44:45 -0600 Subject: [PATCH 0897/1370] OS-native targets for "mftest -a" --- buildroot/share/git/mftest | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/buildroot/share/git/mftest b/buildroot/share/git/mftest index fda864672a..11d0ac3881 100755 --- a/buildroot/share/git/mftest +++ b/buildroot/share/git/mftest @@ -138,6 +138,15 @@ if ((AUTO_BUILD)); then # # List environments that apply to the current MOTHERBOARD. # + case $(uname | tr '[:upper:]' '[:lower:]') in + darwin) SYS='mac' ;; + *linux) SYS='lin' ;; + win*) SYS='win' ;; + msys*) SYS='win' ;; + cygwin*) SYS='win' ;; + mingw*) SYS='win' ;; + *) SYS='uni' ;; + esac echo ; echo -n "Auto " ; ((AUTO_BUILD == 2)) && echo "Upload..." || echo "Build..." MB=$( grep -E "^\s*#define MOTHERBOARD" Marlin/Configuration.h | awk '{ print $3 }' | $SED 's/BOARD_//' ) [[ -z $MB ]] && { echo "Error - Can't read MOTHERBOARD setting." ; exit 1 ; } @@ -145,7 +154,7 @@ if ((AUTO_BUILD)); then BNUM=$( $SED -E 's/^.+BOARD_[^ ]+ +([0-9]+).+$/\1/' <<<"$BLINE" ) BDESC=$( $SED -E 's/^.+\/\/ *(.+)$/\1/' <<<"$BLINE" ) [[ -z $BNUM ]] && { echo "Error - Can't find $MB in boards list." ; exit 1 ; } - ENVS=( $( grep -EA1 "MB\(.*\b$MB\b.*\)" Marlin/src/pins/pins.h | grep -E '#include.+//.+env:[^ ]+' | grep -oE 'env:[^ ]+' | $SED -E 's/env://' ) ) + ENVS=( $( grep -EA1 "MB\(.*\b$MB\b.*\)" Marlin/src/pins/pins.h | grep -E "#include.+//.+(env|$SYS):[^ ]+" | grep -oE "(env|$SYS):[^ ]+" | $SED -E "s/(env|$SYS)://" ) ) [[ -z $ENVS ]] && { errout "Error - Can't find target(s) for $MB ($BNUM)." ; exit 1 ; } ECOUNT=${#ENVS[*]} From c69f9b9883e4a23e10513404985aedcb7bde10b8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 18 Jan 2021 21:53:32 -0600 Subject: [PATCH 0898/1370] Clean up whitespace, headings --- Marlin/src/HAL/LINUX/main.cpp | 1 - Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 1 - Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp | 2 +- Marlin/src/lcd/language/language_uk.h | 6 +++--- Marlin/src/libs/BL24CXX.cpp | 1 - Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 2 +- Marlin/src/pins/stm32f4/pins_ANET_ET4P.h | 2 +- Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 2 +- 8 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp index eadc409324..c409a83e5d 100644 --- a/Marlin/src/HAL/LINUX/main.cpp +++ b/Marlin/src/HAL/LINUX/main.cpp @@ -1,6 +1,5 @@ /** * Marlin 3D Printer Firmware - * * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * This program is free software: you can redistribute it and/or modify diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp index 6e992a22a3..16cfc24af6 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -1,6 +1,5 @@ /** * Marlin 3D Printer Firmware - * * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * This program is free software: you can redistribute it and/or modify diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index d2d1c19063..8cbe319d14 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -157,7 +157,7 @@ void mks_gpio_test() { && (READ(PE6) == 0) && (READ(PE7) == 0) #endif - ) + ) disp_det_ok(); else disp_det_error(); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index eb69bc1b74..069ad7066d 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -215,7 +215,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("ВиÑота"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Підтвердити Ñітку"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Підтвердити Ñвою"); - + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрів Ñтолу"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрів Ñопла"); PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ручне грунтуваннÑ"); @@ -714,7 +714,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Циклічне змішуваннÑ"); PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Градієнт змішуваннÑ"); PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Змінити градієнт"); - + #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð’-інÑтрументу"); PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдонім Ð’-інÑтрументу"); @@ -728,7 +728,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Кінець Ð’-інÑтрументу"); PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати Ð’-інÑтрументи"); PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрументи зкинуті"); - + PROGMEM Language_Str MSG_START_Z = _UxGT("Початок Z:"); PROGMEM Language_Str MSG_END_Z = _UxGT(" Кінець Z:"); diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp index d34ed8340f..8de320d576 100644 --- a/Marlin/src/libs/BL24CXX.cpp +++ b/Marlin/src/libs/BL24CXX.cpp @@ -1,6 +1,5 @@ /** * Marlin 3D Printer Firmware - * * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * This program is free software: you can redistribute it and/or modify diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h index a63ed1ddf0..487080f46b 100644 --- a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4P.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4P.h index eecabbaf98..f5ebf82a48 100644 --- a/Marlin/src/pins/stm32f4/pins_ANET_ET4P.h +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4P.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index 47997c4677..49ee420aae 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once From a8bd376fd4988203cf5857ad432419fee5601417 Mon Sep 17 00:00:00 2001 From: Katelyn Schiesser Date: Mon, 18 Jan 2021 19:59:18 -0800 Subject: [PATCH 0899/1370] Raise Z on exit from 'Level Bed Corners' (#20817) --- Marlin/src/lcd/menu/menu_bed_corners.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index bcf5aea8d7..efa5454d8c 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -39,7 +39,6 @@ #ifndef LEVEL_CORNERS_Z_HOP #define LEVEL_CORNERS_Z_HOP 4.0 #endif - #ifndef LEVEL_CORNERS_HEIGHT #define LEVEL_CORNERS_HEIGHT 0.0 #endif @@ -248,7 +247,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { wait_for_probe = true; ui.goto_screen(_lcd_draw_raise); // show raise screen ui.set_selection(true); - while (wait_for_probe && !probe_triggered) { //loop while waiting to bed raise and probe trigger + while (wait_for_probe && !probe_triggered) { // loop while waiting to bed raise and probe trigger probe_triggered = PROBE_TRIGGERED(); if (probe_triggered) { endstops.hit_on_purpose(); @@ -269,7 +268,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { ui.goto_screen(_lcd_draw_probing); do { ui.refresh(LCDVIEW_REDRAW_NOW); - _lcd_draw_probing(); //update screen with # of good points + _lcd_draw_probing(); // update screen with # of good points do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // clearance _lcd_level_bed_corners_get_next_position(); // Select next corner coordinates @@ -330,6 +329,7 @@ static inline void _lcd_level_bed_corners_homing() { GET_TEXT(MSG_BUTTON_NEXT), GET_TEXT(MSG_BUTTON_DONE) , _lcd_goto_next_corner , []{ + line_to_z(LEVEL_CORNERS_Z_HOP); // Raise Z off the bed when done TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); ui.goto_previous_screen_no_defer(); } From 910059adcba0ec9bc7c326bb9a240f3d56feec9f Mon Sep 17 00:00:00 2001 From: Rockman18 Date: Tue, 19 Jan 2021 23:26:25 +0100 Subject: [PATCH 0900/1370] Fix, consolidate PSTR aliases (#20812) Co-authored-by: Jason Smith Co-authored-by: Scott Lahteine --- Marlin/src/HAL/DUE/HAL.h | 10 - Marlin/src/HAL/ESP32/HAL.h | 4 - Marlin/src/HAL/LINUX/HAL.h | 5 - Marlin/src/HAL/LINUX/include/Arduino.h | 21 -- Marlin/src/HAL/LPC1768/HAL.h | 13 -- Marlin/src/HAL/STM32/HAL.h | 8 - Marlin/src/HAL/STM32F1/HAL.h | 8 - Marlin/src/HAL/TEENSY31_32/HAL.h | 11 - Marlin/src/HAL/TEENSY35_36/HAL.h | 11 - Marlin/src/HAL/TEENSY40_41/HAL.h | 11 - Marlin/src/HAL/shared/Marduino.h | 2 + Marlin/src/HAL/shared/progmem.h | 189 ++++++++++++++++++ .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 4 +- .../lib-uhs3/UHS_host/UHS_macros.h | 164 +-------------- buildroot/tests/mks_robin_nano35-tests | 6 +- 18 files changed, 202 insertions(+), 275 deletions(-) create mode 100644 Marlin/src/HAL/shared/progmem.h diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 4783947f6f..c7f2b8f51e 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -83,16 +83,6 @@ // On AVR this is in math.h? #define square(x) ((x)*(x)) -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*((void**)(addr))) -#undef pgm_read_word -#define pgm_read_word(addr) (*((uint16_t*)(addr))) - typedef int8_t pin_t; #define SHARED_SERVOS HAS_SERVOS diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index be87737b0f..d485b5d1d3 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -67,10 +67,6 @@ extern portMUX_TYPE spinlock; #define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock) #define DISABLE_ISRS() portENTER_CRITICAL(&spinlock) -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*(addr)) - // ------------------------ // Types // ------------------------ diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index 729f6c856e..8eaee44cce 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -113,8 +113,3 @@ inline void HAL_reboot() {} // reboot the board or restart the bootloader FORCE_INLINE static void DELAY_CYCLES(uint64_t x) { Clock::delayCycles(x); } - -// Add strcmp_P if missing -#ifndef strcmp_P - #define strcmp_P(a, b) strcmp((a), (b)) -#endif diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/LINUX/include/Arduino.h index 6aeb0db583..d4086e259a 100644 --- a/Marlin/src/HAL/LINUX/include/Arduino.h +++ b/Marlin/src/HAL/LINUX/include/Arduino.h @@ -73,27 +73,6 @@ extern "C" { void GpioDisableInt(uint32_t port, uint32_t pin); } -// Program Memory -#define pgm_read_ptr(addr) (*((void**)(addr))) -#define pgm_read_byte_near(addr) (*((uint8_t*)(addr))) -#define pgm_read_float_near(addr) (*((float*)(addr))) -#define pgm_read_word_near(addr) (*((uint16_t*)(addr))) -#define pgm_read_dword_near(addr) (*((uint32_t*)(addr))) -#define pgm_read_byte(addr) pgm_read_byte_near(addr) -#define pgm_read_float(addr) pgm_read_float_near(addr) -#define pgm_read_word(addr) pgm_read_word_near(addr) -#define pgm_read_dword(addr) pgm_read_dword_near(addr) - -using std::memcpy; -#define memcpy_P memcpy -#define sprintf_P sprintf -#define strstr_P strstr -#define strncpy_P strncpy -#define vsnprintf_P vsnprintf -#define strcpy_P strcpy -#define snprintf_P snprintf -#define strlen_P strlen - // Time functions extern "C" void delay(const int milis); void _delay_ms(const int delay); diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 44a4e88624..c65fff4747 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -214,16 +214,3 @@ void HAL_clear_reset_source(void); uint8_t HAL_get_reset_source(void); inline void HAL_reboot() {} // reboot the board or restart the bootloader - -// Add strcmp_P if missing -#ifndef strcmp_P - #define strcmp_P(a, b) strcmp((a), (b)) -#endif - -#ifndef strcat_P - #define strcat_P(a, b) strcat((a), (b)) -#endif - -#ifndef strcpy_P - #define strcpy_P(a, b) strcpy((a), (b)) -#endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 65074f0967..9d0c421a19 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -106,14 +106,6 @@ // On AVR this is in math.h? #define square(x) ((x)*(x)) -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*(addr)) - // ------------------------ // Types // ------------------------ diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index ecfc172953..c7eef639a5 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -152,14 +152,6 @@ void HAL_idletask(); // On AVR this is in math.h? #define square(x) ((x)*(x)) -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*(addr)) - #define RST_POWER_ON 1 #define RST_EXTERNAL 2 #define RST_BROWN_OUT 4 diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 9156aadb4d..11b5564a17 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -74,17 +74,6 @@ typedef int8_t pin_t; #define ENABLE_ISRS() __enable_irq() #define DISABLE_ISRS() __disable_irq() -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*((void**)(addr))) -// Add type-checking to pgm_read_word -#undef pgm_read_word -#define pgm_read_word(addr) (*((uint16_t*)(addr))) - inline void HAL_init() {} // Clear the reset reason diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 04151e8378..1d66fa5184 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -80,17 +80,6 @@ typedef int8_t pin_t; #undef sq #define sq(x) ((x)*(x)) -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*((void**)(addr))) -// Add type-checking to pgm_read_word -#undef pgm_read_word -#define pgm_read_word(addr) (*((uint16_t*)(addr))) - inline void HAL_init() {} // Clear reset reason diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 28f511631e..b191c7de5f 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -92,21 +92,10 @@ typedef int8_t pin_t; #undef sq #define sq(x) ((x)*(x)) -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - // Don't place string constants in PROGMEM #undef PSTR #define PSTR(str) ({static const char *data = (str); &data[0];}) -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*((void**)(addr))) -// Add type-checking to pgm_read_word -#undef pgm_read_word -#define pgm_read_word(addr) (*((uint16_t*)(addr))) - // Enable hooks into idle and setup for HAL #define HAL_IDLETASK 1 FORCE_INLINE void HAL_idletask() {} diff --git a/Marlin/src/HAL/shared/Marduino.h b/Marlin/src/HAL/shared/Marduino.h index 2580723511..d0ee6ecc9d 100644 --- a/Marlin/src/HAL/shared/Marduino.h +++ b/Marlin/src/HAL/shared/Marduino.h @@ -81,3 +81,5 @@ #ifndef UNUSED #define UNUSED(x) ((void)(x)) #endif + +#include "progmem.h" diff --git a/Marlin/src/HAL/shared/progmem.h b/Marlin/src/HAL/shared/progmem.h new file mode 100644 index 0000000000..8d84728b7b --- /dev/null +++ b/Marlin/src/HAL/shared/progmem.h @@ -0,0 +1,189 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifndef __AVR__ +#ifndef __PGMSPACE_H_ +// This define should prevent reading the system pgmspace.h if included elsewhere +// This is not normally needed. +#define __PGMSPACE_H_ 1 +#endif + +#ifndef PROGMEM +#define PROGMEM +#endif +#ifndef PGM_P +#define PGM_P const char * +#endif +#ifndef PSTR +#define PSTR(str) (str) +#endif +#ifndef F +#define F(str) (str) +#endif +#ifndef _SFR_BYTE +#define _SFR_BYTE(n) (n) +#endif +#ifndef memchr_P +#define memchr_P(str, c, len) memchr((str), (c), (len)) +#endif +#ifndef memcmp_P +#define memcmp_P(a, b, n) memcmp((a), (b), (n)) +#endif +#ifndef memcpy_P +#define memcpy_P(dest, src, num) memcpy((dest), (src), (num)) +#endif +#ifndef memmem_P +#define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen)) +#endif +#ifndef memrchr_P +#define memrchr_P(str, val, len) memrchr((str), (val), (len)) +#endif +#ifndef strcat_P +#define strcat_P(dest, src) strcat((dest), (src)) +#endif +#ifndef strchr_P +#define strchr_P(str, c) strchr((str), (c)) +#endif +#ifndef strchrnul_P +#define strchrnul_P(str, c) strchrnul((str), (c)) +#endif +#ifndef strcmp_P +#define strcmp_P(a, b) strcmp((a), (b)) +#endif +#ifndef strcpy_P +#define strcpy_P(dest, src) strcpy((dest), (src)) +#endif +#ifndef strcasecmp_P +#define strcasecmp_P(a, b) strcasecmp((a), (b)) +#endif +#ifndef strcasestr_P +#define strcasestr_P(a, b) strcasestr((a), (b)) +#endif +#ifndef strlcat_P +#define strlcat_P(dest, src, len) strlcat((dest), (src), (len)) +#endif +#ifndef strlcpy_P +#define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len)) +#endif +#ifndef strlen_P +#define strlen_P(s) strlen((const char *)(s)) +#endif +#ifndef strnlen_P +#define strnlen_P(str, len) strnlen((str), (len)) +#endif +#ifndef strncmp_P +#define strncmp_P(a, b, n) strncmp((a), (b), (n)) +#endif +#ifndef strncasecmp_P +#define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n)) +#endif +#ifndef strncat_P +#define strncat_P(a, b, n) strncat((a), (b), (n)) +#endif +#ifndef strncpy_P +#define strncpy_P(a, b, n) strncmp((a), (b), (n)) +#endif +#ifndef strpbrk_P +#define strpbrk_P(str, chrs) strpbrk((str), (chrs)) +#endif +#ifndef strrchr_P +#define strrchr_P(str, c) strrchr((str), (c)) +#endif +#ifndef strsep_P +#define strsep_P(strp, delim) strsep((strp), (delim)) +#endif +#ifndef strspn_P +#define strspn_P(str, chrs) strspn((str), (chrs)) +#endif +#ifndef strstr_P +#define strstr_P(a, b) strstr((a), (b)) +#endif +#ifndef sprintf_P +#define sprintf_P(s, ...) sprintf((s), __VA_ARGS__) +#endif +#ifndef vfprintf_P +#define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__) +#endif +#ifndef printf_P +#define printf_P(...) printf(__VA_ARGS__) +#endif +#ifndef snprintf_P +#define snprintf_P(s, n, ...) snprintf((s), (n), __VA_ARGS__) +#endif +#ifndef vsprintf_P +#define vsprintf_P(s, ...) vsprintf((s),__VA_ARGS__) +#endif +#ifndef vsnprintf_P +#define vsnprintf_P(s, n, ...) vsnprintf((s), (n),__VA_ARGS__) +#endif +#ifndef fprintf_P +#define fprintf_P(s, ...) fprintf((s), __VA_ARGS__) +#endif + +#ifndef pgm_read_byte +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#endif +#ifndef pgm_read_word +#define pgm_read_word(addr) (*(const unsigned short *)(addr)) +#endif +#ifndef pgm_read_dword +#define pgm_read_dword(addr) (*(const unsigned long *)(addr)) +#endif +#ifndef pgm_read_float +#define pgm_read_float(addr) (*(const float *)(addr)) +#endif + +#ifndef pgm_read_byte_near +#define pgm_read_byte_near(addr) pgm_read_byte(addr) +#endif +#ifndef pgm_read_word_near +#define pgm_read_word_near(addr) pgm_read_word(addr) +#endif +#ifndef pgm_read_dword_near +#define pgm_read_dword_near(addr) pgm_read_dword(addr) +#endif +#ifndef pgm_read_float_near +#define pgm_read_float_near(addr) pgm_read_float(addr) +#endif +#ifndef pgm_read_byte_far +#define pgm_read_byte_far(addr) pgm_read_byte(addr) +#endif +#ifndef pgm_read_word_far +#define pgm_read_word_far(addr) pgm_read_word(addr) +#endif +#ifndef pgm_read_dword_far +#define pgm_read_dword_far(addr) pgm_read_dword(addr) +#endif +#ifndef pgm_read_float_far +#define pgm_read_float_far(addr) pgm_read_float(addr) +#endif + +#ifndef pgm_read_pointer +#define pgm_read_pointer +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) + +#endif // __AVR__ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 95077d09f2..6130e92224 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -257,7 +257,7 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelOk, print_file_dialog_menu.confirm); } } - else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMARE)) { + else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMWARE)) { // nothing to do } #endif @@ -426,7 +426,7 @@ void lv_draw_dialog(uint8_t type) { lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } } - else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMARE)) { + else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMWARE)) { lv_label_set_text(labelDialog, DIALOG_UPDATE_WIFI_FIRMWARE_EN); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index ded6bc7825..f02a58ad43 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -77,7 +77,7 @@ #include "draw_keyboard.h" #include "draw_encoder_settings.h" -#include "../../inc/MarlinConfigPre.h" +#include "../../../../inc/MarlinConfigPre.h" #if ENABLED(MKS_WIFI_MODULE) #include "wifiSerial.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index bf4f75017f..1f8676126c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1663,7 +1663,7 @@ void mks_esp_wifi_init() { clear_cur_ui(); - draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); + draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMWARE); if (wifi_upload(1) >= 0) { f_unlink("1:/MKS_WIFI_CUR"); @@ -1717,7 +1717,7 @@ void mks_wifi_firmware_update() { clear_cur_ui(); - lv_draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); + lv_draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMWARE); lv_task_handler(); watchdog_refresh(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index f4412f3830..378de6d584 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -152,7 +152,7 @@ uint32_t getData(unsigned byteCnt, const uint8_t *buf, int ofst) { uint32_t val = 0; if (buf && byteCnt) { unsigned int shiftCnt = 0; - NOMORE(byteCnt, 4); + NOMORE(byteCnt, 4U); do { val |= (uint32_t)buf[ofst++] << shiftCnt; shiftCnt += 8; @@ -164,7 +164,7 @@ uint32_t getData(unsigned byteCnt, const uint8_t *buf, int ofst) { // Put 1-4 bytes of a value in little-endian order into a buffer beginning at a specified offset. void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { if (buf && byteCnt) { - NOMORE(byteCnt, 4); + NOMORE(byteCnt, 4U); do { buf[ofst++] = (uint8_t)(val & 0xFF); val >>= 8; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h index c5458208d2..fb2e8b3871 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h @@ -144,169 +144,7 @@ e-mail : support@circuitsathome.com #define UHS_GET_DPI(x) (x) #endif -#ifndef __AVR__ -#ifndef __PGMSPACE_H_ -// This define should prevent reading the system pgmspace.h if included elsewhere -// This is not normally needed. -#define __PGMSPACE_H_ 1 -#endif - -#ifndef PROGMEM -#define PROGMEM -#endif -#ifndef PGM_P -#define PGM_P const char * -#endif -#ifndef PSTR -#define PSTR(str) (str) -#endif -#ifndef F -#define F(str) (str) -#endif -#ifndef _SFR_BYTE -#define _SFR_BYTE(n) (n) -#endif -#ifndef memchr_P -#define memchr_P(str, c, len) memchr((str), (c), (len)) -#endif -#ifndef memcmp_P -#define memcmp_P(a, b, n) memcmp((a), (b), (n)) -#endif -#ifndef memcpy_P -#define memcpy_P(dest, src, num) memcpy((dest), (src), (num)) -#endif -#ifndef memmem_P -#define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen)) -#endif -#ifndef memrchr_P -#define memrchr_P(str, val, len) memrchr((str), (val), (len)) -#endif -#ifndef strcat_P -#define strcat_P(dest, src) strcat((dest), (src)) -#endif -#ifndef strchr_P -#define strchr_P(str, c) strchr((str), (c)) -#endif -#ifndef strchrnul_P -#define strchrnul_P(str, c) strchrnul((str), (c)) -#endif -#ifndef strcmp_P -#define strcmp_P(a, b) strcmp((a), (b)) -#endif -#ifndef strcpy_P -#define strcpy_P(dest, src) strcpy((dest), (src)) -#endif -#ifndef strcasecmp_P -#define strcasecmp_P(a, b) strcasecmp((a), (b)) -#endif -#ifndef strcasestr_P -#define strcasestr_P(a, b) strcasestr((a), (b)) -#endif -#ifndef strlcat_P -#define strlcat_P(dest, src, len) strlcat((dest), (src), (len)) -#endif -#ifndef strlcpy_P -#define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len)) -#endif -#ifndef strlen_P -#define strlen_P(s) strlen((const char *)(s)) -#endif -#ifndef strnlen_P -#define strnlen_P(str, len) strnlen((str), (len)) -#endif -#ifndef strncmp_P -#define strncmp_P(a, b, n) strncmp((a), (b), (n)) -#endif -#ifndef strncasecmp_P -#define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n)) -#endif -#ifndef strncat_P -#define strncat_P(a, b, n) strncat((a), (b), (n)) -#endif -#ifndef strncpy_P -#define strncpy_P(a, b, n) strncmp((a), (b), (n)) -#endif -#ifndef strpbrk_P -#define strpbrk_P(str, chrs) strpbrk((str), (chrs)) -#endif -#ifndef strrchr_P -#define strrchr_P(str, c) strrchr((str), (c)) -#endif -#ifndef strsep_P -#define strsep_P(strp, delim) strsep((strp), (delim)) -#endif -#ifndef strspn_P -#define strspn_P(str, chrs) strspn((str), (chrs)) -#endif -#ifndef strstr_P -#define strstr_P(a, b) strstr((a), (b)) -#endif -#ifndef sprintf_P -#define sprintf_P(s, ...) sprintf((s), __VA_ARGS__) -#endif -#ifndef vfprintf_P -#define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__) -#endif -#ifndef printf_P -#define printf_P(...) printf(__VA_ARGS__) -#endif -#ifndef snprintf_P -#define snprintf_P(s, n, ...) ((s), (n), __VA_ARGS__) -#endif -#ifndef vsprintf_P -#define vsprintf_P(s, ...) ((s),__VA_ARGS__) -#endif -#ifndef vsnprintf_P -#define vsnprintf_P(s, n, ...) ((s), (n),__VA_ARGS__) -#endif -#ifndef fprintf_P -#define fprintf_P(s, ...) ((s), __VA_ARGS__) -#endif - -#ifndef pgm_read_byte -#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) -#endif -#ifndef pgm_read_word -#define pgm_read_word(addr) (*(const unsigned short *)(addr)) -#endif -#ifndef pgm_read_dword -#define pgm_read_dword(addr) (*(const unsigned long *)(addr)) -#endif -#ifndef pgm_read_float -#define pgm_read_float(addr) (*(const float *)(addr)) -#endif - -#ifndef pgm_read_byte_near -#define pgm_read_byte_near(addr) pgm_read_byte(addr) -#endif -#ifndef pgm_read_word_near -#define pgm_read_word_near(addr) pgm_read_word(addr) -#endif -#ifndef pgm_read_dword_near -#define pgm_read_dword_near(addr) pgm_read_dword(addr) -#endif -#ifndef pgm_read_float_near -#define pgm_read_float_near(addr) pgm_read_float(addr) -#endif -#ifndef pgm_read_byte_far -#define pgm_read_byte_far(addr) pgm_read_byte(addr) -#endif -#ifndef pgm_read_word_far -#define pgm_read_word_far(addr) pgm_read_word(addr) -#endif -#ifndef pgm_read_dword_far -#define pgm_read_dword_far(addr) pgm_read_dword(addr) -#endif -#ifndef pgm_read_float_far -#define pgm_read_float_far(addr) pgm_read_float(addr) -#endif - -#ifndef pgm_read_pointer -#define pgm_read_pointer -#endif - -#endif - +#include "../../../../HAL/shared/progmem.h" //////////////////////////////////////////////////////////////////////////////// // HANDY MACROS diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index 3c5d1bb66f..6e2f9f1b0c 100755 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -30,9 +30,9 @@ exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" "$3" # use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 -opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 -opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 -exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" "$3" +opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 SERIAL_PORT_2 +opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 MKS_WIFI_MODULE +exec_test $1 $2 "MKS Robin v2 nano LVGL SPI w/ WiFi" "$3" # # MKS Robin v2 nano New Color UI 480x320 SPI From 1fdf283e5daf4593449b8b97b3a01547d7ee9604 Mon Sep 17 00:00:00 2001 From: Rockman18 Date: Tue, 19 Jan 2021 23:27:57 +0100 Subject: [PATCH 0901/1370] Fix MKS UI manual move (#20813) --- Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 6db1810fcf..d10175344d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -54,14 +54,18 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; if (queue.length <= (BUFSIZE - 3)) { + bool do_inject = true; float dist = uiCfg.move_dist; switch (obj->mks_obj_id) { case ID_M_X_N: dist *= -1; case ID_M_X_P: cur_label = 'X'; break; case ID_M_Y_N: dist *= -1; case ID_M_Y_P: cur_label = 'Y'; break; case ID_M_Z_N: dist *= -1; case ID_M_Z_P: cur_label = 'Z'; break; + default: do_inject = false; + } + if (do_inject) { + sprintf_P(public_buf_l, PSTR("G91\nG1 %c%3.1f F%d\nG90"), cur_label, dist, uiCfg.moveSpeed); + queue.inject(public_buf_l); } - sprintf_P(public_buf_l, PSTR("G91\nG1 %c%3.1f F%d\nG90"), cur_label, dist, uiCfg.moveSpeed); - queue.inject(public_buf_l); } switch (obj->mks_obj_id) { From a02e8844154aebe5999ea866411f4201aa4eaa73 Mon Sep 17 00:00:00 2001 From: EmilGustafsson Date: Tue, 19 Jan 2021 23:52:04 +0100 Subject: [PATCH 0902/1370] Swedish language for MarlinUI (#20826) --- .gitignore | 4 +- Marlin/Configuration.h | 4 +- Marlin/src/core/language.h | 1 + Marlin/src/lcd/language/language_sv.h | 681 ++++++++++++++++++++++++++ buildroot/share/fonts/genallfont.sh | 2 +- buildroot/tests/mega2560-tests | 4 +- 6 files changed, 689 insertions(+), 7 deletions(-) create mode 100644 Marlin/src/lcd/language/language_sv.h diff --git a/.gitignore b/.gitignore index 62f73a7c0d..f7d49cc1ed 100755 --- a/.gitignore +++ b/.gitignore @@ -19,9 +19,9 @@ # along with this program. If not, see . # -# Our automatic versioning scheme generates the following file -# NEVER put it in the repository +# Generated files _Version.h +bdf2u8g # # OS diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 4ec64f8659..d86c448441 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1797,9 +1797,9 @@ * Select the language to display on the LCD. These languages are available: * * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it, - * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' } */ #define LCD_LANGUAGE en diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index d6048d293c..923ad903cb 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -68,6 +68,7 @@ // ro Romanian // ru Russian // sk Slovak +// sv Swedish // tr Turkish // uk Ukrainian // vi Vietnamese diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h new file mode 100644 index 0000000000..722443fb21 --- /dev/null +++ b/Marlin/src/lcd/language/language_sv.h @@ -0,0 +1,681 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License för more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Swedish + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 + +namespace Language_sv { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Swedish"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Redo."); + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("JA"); + PROGMEM Language_Str MSG_NO = _UxGT("NEJ"); + PROGMEM Language_Str MSG_BACK = _UxGT("BakÃ¥t"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Avbryter..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media Instatt"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media Borttaget"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Väntar pÃ¥ media"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD init misslyckades"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Media läsningsfel"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB enhet borttagen"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB start misslyckad"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Underanrop överskriden"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Slutstop"); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Mjuk slutstopp"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Huvud"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Advancerade inställningar"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguration"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autostarta Filer"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Inaktivera Stegare"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Meny"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Framstegsindikator Test"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Hem"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Hem X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Hem Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Hem Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Justering"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Iteration: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Noggrannhet Minskar!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Noggrannhet uppnÃ¥dd"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Hemning XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klicka för att börja"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Nästa Punkt"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivellering Färdig!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Falna Höjd"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Sätt Hem Offset"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset Tillämpad"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Sätt Origo"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisterad justering"); + PROGMEM Language_Str MSG_TRAMMING_WIZARD = _UxGT("Justerings Wizard"); + PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Välj Origo"); + PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Senaste värde "); + + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Förvärmning ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Förvärmning ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Stoppa"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Stoppa ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Alla"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Bädd"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Konf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Förvärmning $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Förvärmning $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Förvärmning $ Stoppa"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Förvärmning $ Stoppa ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Förvärmning $ Alla"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Förvärmning $ Bädd"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Förvärmning $ Donf"); + #endif + + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Förvärmning Anpassad"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Nedkylning"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvens"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser kontroll"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindel Kontroll"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laser Styrka"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindel Styrka"); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Växla Laser"); + PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Test Puls ms"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Avfyra Puls"); + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Växla Spindel"); + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Spindel FramÃ¥t"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindel BakÃ¥t"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Av"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser PÃ¥"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindel Av"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindel PÃ¥"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Sätt pÃ¥ ström"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Stäng av ström"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudera"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Dra tillbaka"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Flytta Axel"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bädd Nivellering"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivellera Bädd"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivellera Hörn"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Höj Bädd tills nästa Sond Triggad"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Alla Hörn inom Tolerans. Nivellering Bädd"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Bra Punkter: "); + PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Senaste Z: "); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Nästa Hörn"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Nät Redigerare"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Redigera Nät"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Nätredigering Stoppad"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Sonderingspunkt"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Värde"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Anpassade Kommandon"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Sond Test"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punkt"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sond utan för gränser"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Avvikelse"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Läge"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Verktygsoffset"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkera"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicering"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Speglad Kopia"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Kontroll"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("Duplicera X-AvstÃ¥nd"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2:a Munstycke X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2:a Munstycke Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2:a Munstycke Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Utför G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Verktyg"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Enad Bädd Nivellering (UBL)"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Lutningspunkt"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manuellt skapa nät"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Placera Shim & Mät"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mät"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Ta bort & Mät bädd"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Flyttar till nästa"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivera UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Avaktivera UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Bädd Temp"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bädd Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hetände Temp"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hetände Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Nät Redigera"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Redigera Anpassat Nät"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finjustera Nät"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Färdig Redigera Nät"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Bygg Anpassat Nät"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Bygg Nät"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Bygg Nät ($)"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Bygg Kallt Nät"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Justera Nät Höjd"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Höjd Antal"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validera Nät"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Validera Nät ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validera Anpassat Nät"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Värma Bädd"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Värma Munstycke"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manuel grundning..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fastlängd Grundning"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Färdig Grundning"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Avbruten"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Nivellera G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Fortsätt Bädd Nät"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nät Nivellering"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Punkts Nivellering"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rutnät Nivellering"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivellera Nät"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Sidopunkter"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Kart Typ"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Utmatning Nät Map"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Utmatning för Värd"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Utmatning för CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Utanför skrivare Backup"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Utmatning UBL Info"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Ifyllnad Mängd"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manuell Ifyllnad"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Smart Ifyllnad"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Ifyllnad Nät"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Ogiltigförklara Alla"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Ogiltigförklara Närmast"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Finjustera Alla"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Finjustera Närmast"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Nät Lagra"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Minnesöppning"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ladda Bädd Nät"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Spara Bädd Nät"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Nät %i Ladda"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Nät %i Sparad"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Ingen Lagring"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Fel: UBL Sparad"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Fel: UBL Ã…terställd"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Stoppad"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Steg-för-Steg UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Bygg Kallt Nät"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Smart Ifyllnad"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validera Nät"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Finjustera Alla"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validera Nät"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Finjustera Alla"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Spara Bädd Nät"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Kontroll"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Ljus"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Ljus Förinställd"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Röd"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Gul"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Grön"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("BlÃ¥"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Vitt"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Standard"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Kanal ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Ljus #2"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Ljus #2 Förinställd"); + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Ljusstyrka"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Anpassat Ljus"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Rör Intensitet"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Grön Intensitet"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("BlÃ¥ Intensitet"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Vit Intensitet"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brightness"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Flyttar..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Fri XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Flytta X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Flytta Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Flytta Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hetände för kall"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Flytta %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Flytta 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Flytta 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Flytta 10mm"); + PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Flytta 0.001tum"); + PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Flytta 0.01tum"); + PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Flytta 0.1tum"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Hastighet"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bädd Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Munstycke"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Munstycke ~"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Munstycke Parkerad"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Munstycke Standby"); + PROGMEM Language_Str MSG_BED = _UxGT("Bädd"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Inkapsling"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fläkt Hastighet"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fläkt Hastighet ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Lagrad Fläkt ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fläkt Hastighet"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra Fläkt Hastighet ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Kontroller Fläkt"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Overksam Hastighet"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto läga"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktive Hastighet"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Overksam Period"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flöde"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flöde ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontroll"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("PÃ¥"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Av"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autojustera"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autojustera *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autojustera misslyckad. DÃ¥lig extruder."); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autojustera misslyckad. Temperatur för hög."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autojustera misslyckad! Tidsgräns."); + PROGMEM Language_Str MSG_SELECT = _UxGT("Välj"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Välj *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); + PROGMEM Language_Str MSG_JERK = _UxGT("Ryck"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Ryck"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Ryck"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Ryck"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Ryck"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Knutpunkt Avv"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Hastighet"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VTrav Min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Acceleration"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-Dra tillbaka"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-Färdas"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frekvens max"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Flöde min"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steg/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" Steg/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" Steg/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" Steg/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E Steg/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* Steg/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Rörelse"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("TrÃ¥d"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E i mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Gräns i mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Gräns *"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("TrÃ¥d Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("TrÃ¥d Dia. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Lossa mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Ladda mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advancera K"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advancera K *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Kontrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Spara Inställningar"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Ladda Inställningar"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Ã…terställ Standard"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initiera EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Fel"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Fel"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Fel"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Inställningar Lagrad"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Media Uppdatera"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Ã…terställ Skrivare"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Uppdatera"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info Skärm"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Förbered"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Justera"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Ström övervakning"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Ström"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Spänning"); + PROGMEM Language_Str MSG_POWER = _UxGT("Ström"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start Utskrift"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Nästa"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Initiera"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stoppa"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Skriv"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Ã…terställa"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignorera"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Avbryt"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Färdig"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("BakÃ¥t"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Fortsätt"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("Hoppa över"); + PROGMEM Language_Str MSG_PAUSING = _UxGT("Paus.."); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausera Utskrift"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Ã…teruppta Utskrift"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Värd Start"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stoppa Utskrift"); + PROGMEM Language_Str MSG_END_LOOPS = _UxGT("Slut Upprepningsloop"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Skriver Objekt"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Avbryt Objekt"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Avbryt Objekt ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Ström Avbrott"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Skriv frÃ¥m Media"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Inget Media"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Sov..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Klick för att Ã¥teruppta..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Utskrift Pausad"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Skriver..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Utskrift Avbruten"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Utskrift Färdig"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ingen Flytt."); + PROGMEM Language_Str MSG_KILLED = _UxGT("DÖDAD. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPAD. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Dra tillbaka mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Byt Dra.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Dra tillbaka V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hoppa mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Ã…ter dra tillbaka. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Byt Ã¥ter dra t. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Ã…terdrat. V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Byt Ã¥ter dra. V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Dra-tillbka"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Byt Längd"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Byt Extra"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Rensa Längd"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Byt verktyg"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Höj"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Grund Hastighet"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Ã…tergÃ¥ Hastighet"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Parkera Huvud"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Ã…tergÃ¥r Hastighet"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Fläkt Hastighet"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Fläkt Tid"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto PÃ…"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto AV"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Verktyg Migration"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migration"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Senast Extruder"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrera till *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Byt TrÃ¥d"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Byt TrÃ¥d *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Ladda TrÃ¥d"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Ladda *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Lossa TrÃ¥d"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Lossa *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Lossa All"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Bifoga Media"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Byt Media"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Släpp Media"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Sond Utanför Bädd"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Skev Faktor"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Själv-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Ã…terställ"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Stuva undan"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Fällut"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Läge"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Läge"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Läge"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Läge-Lägring"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Sätt BLTouch to 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Sätt BLTouch to OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Reportera Dränering"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("FARA: DÃ¥lig inställningar kan orsaka skada! Fortsätt ändÃ¥?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Initiera TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Spara"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Fällut TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Fällut Z-Sond"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Stuva undan Z-Sond"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Hem %s%s%s Först"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Sond Offsets"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Sond X Offset"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Sond Y Offset"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Sond Z Offset"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Flytta Munstycke till Bädd"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("SmÃ¥steg X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("SmÃ¥steg Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("SmÃ¥steg Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Slutstopp Avbrott"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Värma Misslyckad"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Fel: REDUNDANT TEMP"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TERMISK ÖVERDRIFT"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BÄDD TERMISK ÖVERDRIFT"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMMARE T. ÖVERDRIFT"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Fel: MAXTEMP"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Fel: MINTEMP"); + PROGMEM Language_Str MSG_HALTED = _UxGT("Utskrift stoppad"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Snälla Ã…terställ"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("t"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Värmer..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Kyler..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bädd Värmer..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bädd Kyler..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Sond Värmer..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Sond Kyler..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kammare Värmer..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kammare Kyler..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrering"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrera X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrera Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrera Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrera Center"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Inställningar"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibrering"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Sätt Delta Höjd"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Sond Z-offset"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Höjd"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Om Skrivaren"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Skrivare Info"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Punkt Nivellering"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Linjär Nivellering"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilinjär Nivellering"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Enhetlig Bädd Nivellering (UBL)"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nät Nivellering"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Skrivar Stats"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Kort Info"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistor"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruderare"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Överdrift Övervakning: AV"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Överdrift Övervakning: PÃ…"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hetände Overksam Tidsgräns"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("LÃ¥dljus"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Ljus ljusstyrka"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("INKORREKT SKRIVARE"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Utskriftsantal"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Färdiga"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total Utskriftstid"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Längsta Jobbtid"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruderade Totalt"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Utskrift"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Färdig"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Längsta"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruderad"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Driv Styrka"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC KOPPLNINGSFEL"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Skriv"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("TRÃ…DBYTE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("UTSKRIFTSPAUSERAD"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("LADDA TRÃ…D"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("LOSSA TRÃ…D"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Ã…TERGÃ… VAÖ:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Rensa mer"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Fortsätt"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Munstycke: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Utskjut Sensor"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Utskjut Dist mm"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Hemning Misslyckad"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondering Misslyckad"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VÄLJ TRÃ…D"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Uppdatera MMU Firmware!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Behöver uppmärksamhet."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("MMU Ã…teruppta"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("MMU Ã…terupptas..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Ladda"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("MMU Ladda Alla"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Ladda till Munstycke"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Mata ut"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Mata ut ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Lossa"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Ladda TrÃ¥d %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Mata ut TrÃ¥d ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Lossa TrÃ¥d..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Alla"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("TrÃ¥d ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Ã…terställ MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Ã…terställer..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Ta bort, Klicka"); + + PROGMEM Language_Str MSG_MIX = _UxGT("Mixa"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponent ="); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Full Gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Växla Mix"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Totera Mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Omvänd Gradient"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktive V-verktyg"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Start V-verktyg"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Slut V-verktyg"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-verktyg"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ã…terställ V-verktyg"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Kommitta V-verktyg Mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-verktyg blev Ã…terställda"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Start Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Slut Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Spel"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Labyrint"); + + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("DÃ¥lig sida index"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("DÃ¥lig sida hastighet"); + + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Redigera Lösenord"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login Krävs"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Lösenordsinställningar"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Ange Siffra"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Sätt/Redigera Lösenord"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Ta bort Lösenord"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Lösenord är "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Börja om"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Kom ihÃ¥g att Spara!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Lösenord Bort taget"); + + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Tryck pÃ¥ knappen", "för att fortsätta utskrift")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkera...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Vänta pÃ¥", "trÃ¥dbyte", "att börja")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Sätt in trÃ¥d", "och tryck pÃ¥ knappen", "för att fortsätta")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Tryck pÃ¥ knappen", "för att värma munstycke")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Munstycke värms", "Var snäll och vänta...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Väntar pÃ¥", "trÃ¥dlossning")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Väntar pÃ¥", "trÃ¥dladdning")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Väntar pÃ¥", "trÃ¥d utrensning")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klicka för att slutföra", "trÃ¥d utrensning")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Väntar pÃ¥ utskrift", "att Ã¥terstarta...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Klick för att fortsätta")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkera...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Vänta...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Sätt in och klicka")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Klicka för att värma")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Värmer...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Lossar...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Laddar...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Rensar...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Klicka för att slutföra")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Ã…tergÃ¥r...")); + #endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver Ström"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Tröskelvärde"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorlös Hemning"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Stegningsläge"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("Smyghack Aktiverad"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Ã…terställ"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" in:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Backlash"); + PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; + PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; + PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korrigering"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Glättning"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("NivÃ¥ X Axel"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Kalibrera"); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Overksam tidsgräns, temperatur minskning. Tryck ok för att Ã¥tervärma och igen för att fortsätta."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Värmare Tidsgräns"); + #endif + PROGMEM Language_Str MSG_REHEAT = _UxGT("Ã…tervärm"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Ã…tervärmning..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Sond Wizard"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Sondering Z Referens"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Flyttar till Sonderings Pos"); + + PROGMEM Language_Str MSG_SOUND = _UxGT("Ljud"); + + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Uppe Vänster"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Nere Vänster"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Uppe Höger"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Nere Höger"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrering Färdig"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Kalibrering Misslyckad"); +} diff --git a/buildroot/share/fonts/genallfont.sh b/buildroot/share/fonts/genallfont.sh index 820da187df..0a66990212 100755 --- a/buildroot/share/fonts/genallfont.sh +++ b/buildroot/share/fonts/genallfont.sh @@ -62,7 +62,7 @@ OLDWD=`pwd` # # By default loop through all languages # -LANGS_DEFAULT="an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana ko_KR nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test" +LANGS_DEFAULT="an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana ko_KR nl pl pt pt_br ro ru sk sv tr uk vi zh_CN zh_TW test" # # Generate data for language list MARLIN_LANGS or all if not provided diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 12bbceab87..4125bf87fa 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -200,11 +200,11 @@ exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" # #restore_configs #opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff" "$3"; done +#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk sv tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff" "$3"; done # #restore_configs #opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff" "$3"; done +#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk sv tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff" "$3"; done ######## Example Configurations ############## # From ccbff12d6ae8f49810c14049dec96256e38cbe2f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 19 Jan 2021 19:19:10 -0600 Subject: [PATCH 0903/1370] Fix SINGLENOZZLE compile --- Marlin/src/gcode/temp/M104_M109.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 4 ++++ Marlin/src/lcd/menu/menu_tune.cpp | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index 90e1b601e4..3007770510 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -45,7 +45,7 @@ #endif #endif -#if ENABLED(SINGLENOZZLE) +#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) #include "../../module/tool_change.h" #endif diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 2e5aff1006..7c8668d95c 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -35,6 +35,10 @@ #include "../../module/motion.h" #endif +#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) + #include "../../module/tool_change.h" +#endif + // // "Temperature" submenu items // diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 5da25ce59a..8028442a02 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -34,6 +34,10 @@ #include "../../module/temperature.h" #include "../../MarlinCore.h" +#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) + #include "../../module/tool_change.h" +#endif + #if HAS_LEVELING #include "../../feature/bedlevel/bedlevel.h" #endif From faf4cb1b748f234ac9527c25446180dc34ba7480 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 20 Jan 2021 03:55:01 +0100 Subject: [PATCH 0904/1370] MMU2 serial followup (#20811) --- Marlin/src/HAL/DUE/HAL.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index c7f2b8f51e..6a4d4f6149 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -61,7 +61,7 @@ #ifdef MMU2_SERIAL_PORT #if WITHIN(MMU2_SERIAL_PORT, 0, 3) - #define MMU2_SERIAL MSERIAL(SERIAL_PORT) + #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else #error "MMU2_SERIAL_PORT must be from 0 to 3. Please update your configuration." #endif From c3341512949d0d95e59e8423e0ba9f464da36005 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 20 Jan 2021 15:55:57 +1300 Subject: [PATCH 0905/1370] USE_M73_REMAINING_TIME sanity-check (#20751) --- Marlin/src/inc/SanityCheck.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 8da31336e8..1e4b4753f9 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -709,6 +709,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif #endif +#if ENABLED(USE_M73_REMAINING_TIME) && DISABLED(LCD_SET_PROGRESS_MANUALLY) + #error "USE_M73_REMAINING_TIME requires LCD_SET_PROGRESS_MANUALLY" +#endif + #if !HAS_LCD_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE) #error "SD_REPRINT_LAST_SELECTED_FILE currently requires a Marlin-native LCD menu." #endif From f6c4c269378efec6f85f43efea82591b07f304ba Mon Sep 17 00:00:00 2001 From: devin122 Date: Tue, 19 Jan 2021 21:57:12 -0500 Subject: [PATCH 0906/1370] Fix reporting of TMC_S2VSA/B (#20730) --- Marlin/src/feature/tmc_util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 29bb249cea..8d0156883b 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -604,8 +604,6 @@ case TMC_PWM_OFS_AUTO: SERIAL_PRINT(st.pwm_ofs_auto(), DEC); break; case TMC_PWM_GRAD_AUTO: SERIAL_PRINT(st.pwm_grad_auto(), DEC); break; case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break; - case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break; - case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break; case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break; default: break; } @@ -631,6 +629,8 @@ case TMC_T150: if (st.t150()) SERIAL_CHAR('*'); break; case TMC_T143: if (st.t143()) SERIAL_CHAR('*'); break; case TMC_T120: if (st.t120()) SERIAL_CHAR('*'); break; + case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break; + case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break; case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; default: break; } From b355f4605eb177c7f9f4b3503dcafa91e85c2607 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 19 Jan 2021 20:58:50 -0600 Subject: [PATCH 0907/1370] Move singlenozzle temp/fan (#20829) --- Marlin/src/gcode/temp/M104_M109.cpp | 4 ++-- Marlin/src/inc/SanityCheck.h | 8 ++++---- Marlin/src/lcd/menu/menu_item.h | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 2 +- Marlin/src/lcd/menu/menu_tune.cpp | 2 +- Marlin/src/module/temperature.cpp | 25 ++++++++++++++++++++++++ Marlin/src/module/temperature.h | 8 ++++++++ Marlin/src/module/tool_change.cpp | 23 +--------------------- Marlin/src/module/tool_change.h | 8 -------- 9 files changed, 43 insertions(+), 39 deletions(-) diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index 3007770510..07e46e1775 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -88,7 +88,7 @@ void GcodeSuite::M104() { if (got_temp) { #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - singlenozzle_temp[target_extruder] = temp; + thermalManager.singlenozzle_temp[target_extruder] = temp; if (target_extruder != active_extruder) return; #endif thermalManager.setTargetHotend(temp, target_extruder); @@ -166,7 +166,7 @@ void GcodeSuite::M109() { if (got_temp) { #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - singlenozzle_temp[target_extruder] = temp; + thermalManager.singlenozzle_temp[target_extruder] = temp; if (target_extruder != active_extruder) return; #endif thermalManager.setTargetHotend(temp, target_extruder); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1e4b4753f9..2d4b073e15 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1935,16 +1935,16 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Basic multi hotend duplication mode */ #if ENABLED(MULTI_NOZZLE_DUPLICATION) - #if HOTENDS < 2 - #error "MULTI_NOZZLE_DUPLICATION requires 2 or more hotends." + #if ENABLED(SINGLENOZZLE) + #error "MULTI_NOZZLE_DUPLICATION is incompatible with SINGLENOZZLE." #elif ENABLED(DUAL_X_CARRIAGE) #error "MULTI_NOZZLE_DUPLICATION is incompatible with DUAL_X_CARRIAGE." - #elif ENABLED(SINGLENOZZLE) - #error "MULTI_NOZZLE_DUPLICATION is incompatible with SINGLENOZZLE." #elif ENABLED(MIXING_EXTRUDER) #error "MULTI_NOZZLE_DUPLICATION is incompatible with MIXING_EXTRUDER." #elif ENABLED(SWITCHING_EXTRUDER) #error "MULTI_NOZZLE_DUPLICATION is incompatible with SWITCHING_EXTRUDER." + #elif HOTENDS < 2 + #error "MULTI_NOZZLE_DUPLICATION requires 2 or more hotends." #endif #endif diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 1d9a2f6b2c..6873f209b4 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -485,7 +485,7 @@ class MenuItem_bool : public MenuEditItemBase { #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) #define DEFINE_SINGLENOZZLE_ITEM() \ auto singlenozzle_item = [&](const uint8_t f) { \ - editable.uint8 = singlenozzle_fan_speed[f]; \ + editable.uint8 = thermalManager.singlenozzle_fan_speed[f]; \ EDIT_ITEM_FAST_N(percent, f, MSG_STORED_FAN_N, &editable.uint8, 0, 255, on_fan_update); \ } #else diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 7c8668d95c..01c1f8f547 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -159,7 +159,7 @@ void menu_temperature() { #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - (HOTEND_OVERSHOOT)); + EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - (HOTEND_OVERSHOOT)); #endif // diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 8028442a02..cccb352d8f 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -127,7 +127,7 @@ void menu_tune() { #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - HOTEND_OVERSHOOT); + EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - HOTEND_OVERSHOOT); #endif // diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 85222a3463..c15270f5eb 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -377,6 +377,13 @@ volatile bool Temperature::raw_temps_ready = false; Temperature::soft_pwm_count_fan[FAN_COUNT]; #endif +#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) + uint16_t Temperature::singlenozzle_temp[EXTRUDERS]; + #if HAS_FAN + uint8_t Temperature::singlenozzle_fan_speed[EXTRUDERS]; + #endif +#endif + #if ENABLED(PROBING_HEATERS_OFF) bool Temperature::paused; #endif @@ -2195,6 +2202,24 @@ void Temperature::disable_all_heaters() { #endif // PROBING_HEATERS_OFF +#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) + + void Temperature::singlenozzle_change(const uint8_t old_tool, const uint8_t new_tool) { + #if HAS_FAN + singlenozzle_fan_speed[old_tool] = fan_speed[0]; + fan_speed[0] = singlenozzle_fan_speed[new_tool]; + #endif + singlenozzle_temp[old_tool] = temp_hotend[0].target; + if (singlenozzle_temp[new_tool] && singlenozzle_temp[new_tool] != singlenozzle_temp[old_tool]) { + setTargetHotend(singlenozzle_temp[new_tool], 0); + TERN_(AUTOTEMP, planner.autotemp_update()); + TERN_(HAS_DISPLAY, set_heating_message(0)); + (void)wait_for_hotend(0, false); // Wait for heating or cooling + } + } + +#endif + #if HAS_MAX6675 #ifndef THERMOCOUPLE_MAX_ERRORS diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index f570fe2107..86c202cadc 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -335,6 +335,14 @@ class Temperature { FORCE_INLINE static bool hotEnoughToExtrude(const uint8_t e) { return !tooColdToExtrude(e); } FORCE_INLINE static bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } + #if ENABLED(SINGLENOZZLE_STANDBY_FAN) + static uint16_t singlenozzle_temp[EXTRUDERS]; + #if HAS_FAN + static uint8_t singlenozzle_fan_speed[EXTRUDERS]; + #endif + static void singlenozzle_change(const uint8_t old_tool, const uint8_t new_tool); + #endif + #if HEATER_IDLE_HANDLER // Heater idle handling. Marlin creates one per hotend and one for the heated bed. diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 95f32f2faa..052b8cd34a 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -49,14 +49,6 @@ bool toolchange_extruder_ready[EXTRUDERS]; #endif -#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - uint16_t singlenozzle_temp[EXTRUDERS]; -#endif - -#if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) - uint8_t singlenozzle_fan_speed[EXTRUDERS]; -#endif - #if ENABLED(MAGNETIC_PARKING_EXTRUDER) || defined(EVENT_GCODE_AFTER_TOOLCHANGE) || (ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0) #include "../gcode/gcode.h" #endif @@ -1081,20 +1073,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { const bool should_move = safe_to_move && !no_move && IsRunning(); if (should_move) { - #if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) - singlenozzle_fan_speed[old_tool] = thermalManager.fan_speed[0]; - thermalManager.fan_speed[0] = singlenozzle_fan_speed[new_tool]; - #endif - - #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - singlenozzle_temp[old_tool] = thermalManager.temp_hotend[0].target; - if (singlenozzle_temp[new_tool] && singlenozzle_temp[new_tool] != singlenozzle_temp[old_tool]) { - thermalManager.setTargetHotend(singlenozzle_temp[new_tool], 0); - TERN_(AUTOTEMP, planner.autotemp_update()); - TERN_(HAS_DISPLAY, thermalManager.set_heating_message(0)); - (void)thermalManager.wait_for_hotend(0, false); // Wait for heating or cooling - } - #endif + TERN_(SINGLENOZZLE_STANDBY_TEMP, thermalManager.singlenozzle_change(old_tool, new_tool)); #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) if (should_swap && !too_cold) { diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 6b739604f0..4f88ca7432 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -114,14 +114,6 @@ #endif -#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - extern uint16_t singlenozzle_temp[EXTRUDERS]; -#endif - -#if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) - extern uint8_t singlenozzle_fan_speed[EXTRUDERS]; -#endif - TERN_(ELECTROMAGNETIC_SWITCHING_TOOLHEAD, void est_init()); TERN_(SWITCHING_TOOLHEAD, void swt_init()); From 8d2f1851eb0dac28e5792c759713a2b210a726fc Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Wed, 20 Jan 2021 23:52:09 +0100 Subject: [PATCH 0908/1370] PSTR alias followup (#20831) --- Marlin/src/HAL/shared/progmem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/shared/progmem.h b/Marlin/src/HAL/shared/progmem.h index 8d84728b7b..539d02705e 100644 --- a/Marlin/src/HAL/shared/progmem.h +++ b/Marlin/src/HAL/shared/progmem.h @@ -101,7 +101,7 @@ #define strncat_P(a, b, n) strncat((a), (b), (n)) #endif #ifndef strncpy_P -#define strncpy_P(a, b, n) strncmp((a), (b), (n)) +#define strncpy_P(a, b, n) strncpy((a), (b), (n)) #endif #ifndef strpbrk_P #define strpbrk_P(str, chrs) strpbrk((str), (chrs)) From 0c62fd02b03d505f26ae63d15898e3d18abc5663 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 21 Jan 2021 13:18:22 +1300 Subject: [PATCH 0909/1370] More PlatformIO source filters (#20822) --- platformio.ini | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/platformio.ini b/platformio.ini index 24209ba1cf..a32bf53d67 100644 --- a/platformio.ini +++ b/platformio.ini @@ -60,7 +60,11 @@ default_src_filter = + - - + - - - - + - + - - - - - - - - + - + - - - - - @@ -77,7 +81,7 @@ default_src_filter = + - - + - - - - - - + - - - - - - - @@ -112,7 +116,7 @@ default_src_filter = + - - + - - - - - + - - - - - @@ -139,6 +143,7 @@ default_src_filter = + - - + - - - + - - - - @@ -190,7 +195,7 @@ default_src_filter = + - - + - - - - - - - + - - - - - - - @@ -199,6 +204,7 @@ default_src_filter = + - - + - - - - + - - - extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -224,7 +230,7 @@ HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip src_filter=+ HAS_L64XX = Arduino-L6470@0.8.0 - src_filter=+ + + + src_filter=+ + + + NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ MAX6675_._IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 @@ -238,6 +244,8 @@ HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 HAS_(FSMC|SPI)_TFT = src_filter=+ + + HAS_FSMC_TFT = src_filter=+ + HAS_SPI_TFT = src_filter=+ + +I2C_EEPROM = src_filter=+ +SPI_EEPROM = src_filter=+ HAS_GRAPHICAL_TFT = src_filter=+ DWIN_CREALITY_LCD = src_filter=+ IS_TFTGLCD_PANEL = src_filter=+ @@ -276,6 +284,7 @@ EXTUI_EXAMPLE = src_filter=+ MALYAN_LCD = src_filter=+ USE_UHS2_USB = src_filter=+ USE_UHS3_USB = src_filter=+ +USB_FLASH_DRIVE_SUPPORT = src_filter=+ AUTO_BED_LEVELING_BILINEAR = src_filter=+ AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ MESH_BED_LEVELING = src_filter=+ + @@ -294,7 +303,7 @@ EMERGENCY_PARSER = src_filter=+ - IIC_BL24CXX_EEPROM = src_filter=+ HAS_SPI_FLASH = src_filter=+ -HAS_ETHERNET = src_filter=+ +HAS_ETHERNET = src_filter=+ + HAS_FANMUX = src_filter=+ FILAMENT_WIDTH_SENSOR = src_filter=+ + FWRETRACT = src_filter=+ + @@ -327,7 +336,7 @@ Z_STEPPER_AUTO_ALIGN = src_filter=+ + ASSISTED_TRAMMING = src_filter=+ + HAS_MESH = src_filter=+ -HAS_LEVELING = src_filter=+ +HAS_LEVELING = src_filter=+ + DELTA_AUTO_CALIBRATION = src_filter=+ CALIBRATION_GCODE = src_filter=+ Z_MIN_PROBE_REPEATABILITY_TEST = src_filter=+ @@ -377,7 +386,7 @@ BABYSTEPPING = src_filter=+ + G38_PROBE_TARGET = src_filter=+ MAGNETIC_PARKING_EXTRUDER = src_filter=+ -SDSUPPORT = src_filter=+ +SDSUPPORT = src_filter=+ + + + + + + HAS_MEDIA_SUBCALLS = src_filter=+ GCODE_REPEAT_MARKERS = src_filter=+ + HAS_EXTRUDERS = src_filter=+ + @@ -393,7 +402,9 @@ BEZIER_CURVE_SUPPORT = src_filter=+ + HAS_BED_PROBE = src_filter=+ + + + IS_SCARA = src_filter=+ +HAS_SERVOS = src_filter=+ + MORGAN_SCARA = src_filter=+ +HAS_MICROSTEPS = src_filter=+ (ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer ESP3DLib=https://github.com/luc-github/ESP3DLib.git arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git From befcdeb74d35a83898c1d70999fbedbeb2778b66 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 20 Jan 2021 18:49:07 -0600 Subject: [PATCH 0910/1370] Keep G29 N on the DL --- Marlin/Configuration_adv.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d1b5c7f5ce..ff78b78d45 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3344,7 +3344,7 @@ //#define USER_SCRIPT_RETURN // Return to status screen after a script #define USER_DESC_1 "Home & UBL Info" - #define USER_GCODE_1 "G29NW" + #define USER_GCODE_1 "G28\nG29W" #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) @@ -3353,7 +3353,7 @@ #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) #define USER_DESC_4 "Heat Bed/Home/Level" - #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG29N" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" #define USER_DESC_5 "Home & Info" #define USER_GCODE_5 "G28\nM503" From 3dde2722bdf2717e190feaecfc146af7d0cd3777 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 20 Jan 2021 18:52:06 -0600 Subject: [PATCH 0911/1370] MarlinUI multi-language support (#20725) --- Marlin/Configuration_adv.h | 17 +++--- Marlin/src/core/multi_language.h | 29 +++++---- Marlin/src/gcode/gcode.cpp | 4 ++ Marlin/src/gcode/gcode.h | 3 + Marlin/src/gcode/lcd/M414.cpp | 44 ++++++++++++++ Marlin/src/inc/MarlinConfig.h | 2 + Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 11 ++-- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 1 - Marlin/src/lcd/lcdprint.cpp | 1 + Marlin/src/lcd/marlinui.cpp | 4 ++ Marlin/src/lcd/marlinui.h | 11 ++++ Marlin/src/lcd/menu/menu_language.cpp | 59 +++++++++++++++++++ Marlin/src/lcd/menu/menu_main.cpp | 8 +++ Marlin/src/module/settings.cpp | 31 +++++++++- buildroot/tests/FYSETC_F6-tests | 1 + platformio.ini | 2 + 16 files changed, 202 insertions(+), 26 deletions(-) create mode 100644 Marlin/src/gcode/lcd/M414.cpp create mode 100644 Marlin/src/lcd/menu/menu_language.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ff78b78d45..714150d240 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1526,6 +1526,16 @@ #endif #endif // HAS_DGUS_LCD +// +// Specify additional languages for the UI. Default specified by LCD_LANGUAGE. +// +#if EITHER(DOGLCD, TOUCH_UI_FTDI_EVE) + //#define LCD_LANGUAGE_2 fr + //#define LCD_LANGUAGE_3 de + //#define LCD_LANGUAGE_4 es + //#define LCD_LANGUAGE_5 it +#endif + // // Touch UI for the FTDI Embedded Video Engine (EVE) // @@ -1601,13 +1611,6 @@ // Use a smaller font when labels don't fit buttons #define TOUCH_UI_FIT_TEXT - // Allow language selection from menu at run-time (otherwise use LCD_LANGUAGE) - //#define LCD_LANGUAGE_1 en - //#define LCD_LANGUAGE_2 fr - //#define LCD_LANGUAGE_3 de - //#define LCD_LANGUAGE_4 es - //#define LCD_LANGUAGE_5 it - // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h index 6af4af2f8d..5a26edf8d4 100644 --- a/Marlin/src/core/multi_language.h +++ b/Marlin/src/core/multi_language.h @@ -20,6 +20,8 @@ ****************************************************************************/ #pragma once +#include "../inc/MarlinConfigPre.h" + typedef const char Language_Str[]; #ifdef LCD_LANGUAGE_5 @@ -57,26 +59,27 @@ typedef const char Language_Str[]; #define GET_LANG(LANG) _GET_LANG(LANG) #if NUM_LANGUAGES > 1 - extern uint8_t lang; + #define HAS_MULTI_LANGUAGE 1 #define GET_TEXT(MSG) ( \ - lang == 0 ? GET_LANG(LCD_LANGUAGE)::MSG : \ - lang == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \ - lang == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \ - lang == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \ - GET_LANG(LCD_LANGUAGE_5)::MSG \ - ) - #define MAX_LANG_CHARSIZE _MAX(GET_LANG(LCD_LANGUAGE)::CHARSIZE, \ - GET_LANG(LCD_LANGUAGE_2)::CHARSIZE, \ - GET_LANG(LCD_LANGUAGE_3)::CHARSIZE, \ - GET_LANG(LCD_LANGUAGE_4)::CHARSIZE, \ - GET_LANG(LCD_LANGUAGE_5)::CHARSIZE) + ui.language == 0 ? GET_LANG(LCD_LANGUAGE )::MSG : \ + ui.language == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \ + ui.language == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \ + ui.language == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \ + GET_LANG(LCD_LANGUAGE_5)::MSG ) + #define MAX_LANG_CHARSIZE _MAX(GET_LANG(LCD_LANGUAGE )::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_2)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_3)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_4)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_5)::CHARSIZE ) #else #define GET_TEXT(MSG) GET_LANG(LCD_LANGUAGE)::MSG - #define MAX_LANG_CHARSIZE GET_LANG(LCD_LANGUAGE)::CHARSIZE + #define MAX_LANG_CHARSIZE LANG_CHARSIZE #endif #define GET_TEXT_F(MSG) (const __FlashStringHelper*)GET_TEXT(MSG) #define GET_LANGUAGE_NAME(INDEX) GET_LANG(LCD_LANGUAGE_##INDEX)::LANGUAGE +#define LANG_CHARSIZE GET_TEXT(CHARSIZE) +#define USE_WIDE_GLYPH (LANG_CHARSIZE > 2) #define MSG_1_LINE(A) A "\0" "\0" #define MSG_2_LINE(A,B) A "\0" B "\0" diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 89bc0dc7af..90a0b0ded0 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -718,6 +718,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 412: M412(); break; // M412: Enable/Disable filament runout detection #endif + #if HAS_MULTI_LANGUAGE + case 414: M414(); break; // M414: Select multi language menu + #endif + #if HAS_LEVELING case 420: M420(); break; // M420: Enable/Disable Bed Leveling #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 765cd8e591..9453eecd94 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -213,6 +213,7 @@ * M410 - Quickstop. Abort all planned moves. * M412 - Enable / Disable Filament Runout Detection. (Requires FILAMENT_RUNOUT_SENSOR) * M413 - Enable / Disable Power-Loss Recovery. (Requires POWER_LOSS_RECOVERY) + * M414 - Set language by index. (Requires LCD_LANGUAGE_2...) * M420 - Enable/Disable Leveling (with current values) S1=enable S0=disable (Requires MESH_BED_LEVELING or ABL) * M421 - Set a single Z coordinate in the Mesh Leveling grid. X Y Z (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL) * M422 - Set Z Stepper automatic alignment position using probe. X Y A (Requires Z_STEPPER_AUTO_ALIGN) @@ -747,6 +748,8 @@ private: TERN_(HAS_FILAMENT_SENSOR, static void M412()); + TERN_(HAS_MULTI_LANGUAGE, static void M414()); + #if HAS_LEVELING static void M420(); static void M421(); diff --git a/Marlin/src/gcode/lcd/M414.cpp b/Marlin/src/gcode/lcd/M414.cpp new file mode 100644 index 0000000000..760028a899 --- /dev/null +++ b/Marlin/src/gcode/lcd/M414.cpp @@ -0,0 +1,44 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_MULTI_LANGUAGE + +#include "../gcode.h" +#include "../../MarlinCore.h" +#include "../../lcd/marlinui.h" + +/** + * M414: Set the language for the UI + * + * Parameters + * S : The language to select + */ +void GcodeSuite::M414() { + + if (parser.seenval('S')) + ui.set_language(parser.value_byte()); + +} + +#endif // HAS_MULTI_LANGUAGE diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h index 2eafa2b417..8fdb4b9bae 100644 --- a/Marlin/src/inc/MarlinConfig.h +++ b/Marlin/src/inc/MarlinConfig.h @@ -55,3 +55,5 @@ #include "../core/serial.h" #endif + +#include "../core/multi_language.h" diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index c326b89aa8..c7c5908b36 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -54,6 +54,7 @@ #include "../../sd/cardreader.h" #include "../../module/temperature.h" #include "../../module/printcounter.h" +#include "../../MarlinCore.h" #if ENABLED(SDSUPPORT) #include "../../libs/duration_t.h" @@ -455,20 +456,22 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop inline void draw_boxed_string(const u8g_uint_t x, const u8g_uint_t y, PGM_P const pstr, const bool inv) { const u8g_uint_t len = utf8_strlen_P(pstr), by = (y + 1) * (MENU_FONT_HEIGHT); - const pixel_len_t bw = len * (MENU_FONT_WIDTH), bx = x * (MENU_FONT_WIDTH); + const u8g_uint_t prop = USE_WIDE_GLYPH ? 2 : 1; + const pixel_len_t bw = len * prop * (MENU_FONT_WIDTH), bx = x * prop * (MENU_FONT_WIDTH); if (inv) { u8g.setColorIndex(1); - u8g.drawBox(bx - 1, by - (MENU_FONT_ASCENT) + 1, bw + 2, MENU_FONT_HEIGHT - 1); + u8g.drawBox(bx / prop - 1, by - (MENU_FONT_ASCENT) + 1, bw / prop + 2, MENU_FONT_HEIGHT - 1); u8g.setColorIndex(0); } - lcd_put_u8str_P(bx, by, pstr); + lcd_put_u8str_P(bx / prop, by, pstr); if (inv) u8g.setColorIndex(1); } void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { ui.draw_select_screen_prompt(pref, string, suff); draw_boxed_string(1, LCD_HEIGHT - 1, no, !yesno); - draw_boxed_string(LCD_WIDTH - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno); + const u8g_uint_t xpos = (LCD_WIDTH) / (USE_WIDE_GLYPH ? 2 : 1); + draw_boxed_string(xpos - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno); } #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 1cb7ed185e..8b96587fea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -64,7 +64,6 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_speed255.bin", "bmp_speed127.bin", "bmp_speed0.bin", - "bmp_speed0.bin", "bmp_bed.bin", "bmp_step1_degree.bin", diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index 2c78b14834..32f425168f 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -28,6 +28,7 @@ #if HAS_WIRED_LCD && !HAS_GRAPHICAL_TFT +#include "marlinui.h" #include "lcdprint.h" /** diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index d4e1357e86..d13c8e409d 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -78,6 +78,10 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #endif #endif +#if HAS_MULTI_LANGUAGE + uint8_t MarlinUI::language; // Initialized by settings.load() +#endif + #if ENABLED(SOUND_MENU_ITEM) bool MarlinUI::buzzer_enabled = true; #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index a64483fcb0..95a521d5dd 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -178,6 +178,17 @@ public: TERN_(HAS_LCD_MENU, currentScreen = status_screen); } + #if HAS_MULTI_LANGUAGE + static uint8_t language; + static inline void set_language(const uint8_t lang) { + if (lang < NUM_LANGUAGES) { + language = lang; + return_to_status(); + refresh(); + } + } + #endif + #if ENABLED(SOUND_MENU_ITEM) static bool buzzer_enabled; // Initialized by settings.load() #else diff --git a/Marlin/src/lcd/menu/menu_language.cpp b/Marlin/src/lcd/menu/menu_language.cpp new file mode 100644 index 0000000000..26660f22f8 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_language.cpp @@ -0,0 +1,59 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// +// Language Selection Menu +// + +#include "../../inc/MarlinConfig.h" + +#if HAS_MULTI_LANGUAGE + +#include "menu_item.h" +#include "../../MarlinCore.h" +#include "../../module/settings.h" + +static void set_lcd_language(const uint8_t inlang) { + ui.set_language(inlang); + (void)settings.save(); +} + +void menu_language() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + MENU_ITEM_P(function, GET_LANG(LCD_LANGUAGE )::LANGUAGE, []{ set_lcd_language(0); }); + MENU_ITEM_P(function, GET_LANG(LCD_LANGUAGE_2)::LANGUAGE, []{ set_lcd_language(1); }); + #if NUM_LANGUAGES > 2 + MENU_ITEM_P(function, GET_LANG(LCD_LANGUAGE_3)::LANGUAGE, []{ set_lcd_language(2); }); + #if NUM_LANGUAGES > 3 + MENU_ITEM_P(function, GET_LANG(LCD_LANGUAGE_4)::LANGUAGE, []{ set_lcd_language(3); }); + #if NUM_LANGUAGES > 4 + MENU_ITEM_P(function, GET_LANG(LCD_LANGUAGE_5)::LANGUAGE, []{ set_lcd_language(4); }); + #endif + #endif + #endif + + END_MENU(); +} + +#endif // HAS_MULTI_LANGUAGE diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index b7cd549e6b..24d048cafd 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -97,6 +97,10 @@ void menu_configuration(); void menu_spindle_laser(); #endif +#if HAS_MULTI_LANGUAGE + void menu_language(); +#endif + extern const char M21_STR[]; void menu_main() { @@ -325,6 +329,10 @@ void menu_main() { } #endif + #if HAS_MULTI_LANGUAGE + SUBMENU(LANGUAGE, menu_language); + #endif + END_MENU(); } diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 58cdd5296f..0a5439facd 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -36,7 +36,7 @@ */ // Change EEPROM version if the structure changes -#define EEPROM_VERSION "V82" +#define EEPROM_VERSION "V83" #define EEPROM_OFFSET 100 // Check the integrity of data offsets. @@ -457,6 +457,11 @@ typedef struct SettingsDataStruct { #if ENABLED(SOUND_MENU_ITEM) bool buzzer_enabled; #endif + + #if HAS_MULTI_LANGUAGE + uint8_t ui_language; // M414 S + #endif + } SettingsData; //static_assert(sizeof(SettingsData) <= MARLIN_EEPROM_SIZE, "EEPROM too small to contain SettingsData!"); @@ -1382,6 +1387,13 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(ui.buzzer_enabled); #endif + // + // Selected LCD language + // + #if HAS_MULTI_LANGUAGE + EEPROM_WRITE(ui.language); + #endif + // // Report final CRC and Data Size // @@ -2261,6 +2273,18 @@ void MarlinSettings::postprocess() { EEPROM_READ(ui.buzzer_enabled); #endif + // + // Selected LCD language + // + #if HAS_MULTI_LANGUAGE + { + uint8_t ui_language; + EEPROM_READ(ui_language); + if (ui_language >= NUM_LANGUAGES) ui_language = 0; + ui.set_language(ui_language); + } + #endif + // // Validate Final Size and CRC // @@ -3846,6 +3870,11 @@ void MarlinSettings::reset() { CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); M553_report(); CONFIG_ECHO_START(); SERIAL_ECHO_SP(2); M554_report(); #endif + + #if HAS_MULTI_LANGUAGE + CONFIG_ECHO_HEADING("UI Language:"); + SERIAL_ECHO_MSG(" M414 S", int(ui.language)); + #endif } #endif // !DISABLE_M503 diff --git a/buildroot/tests/FYSETC_F6-tests b/buildroot/tests/FYSETC_F6-tests index cc7f334099..e1eb6684a5 100755 --- a/buildroot/tests/FYSETC_F6-tests +++ b/buildroot/tests/FYSETC_F6-tests @@ -39,6 +39,7 @@ exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY restore_configs opt_set MOTHERBOARD BOARD_FYSETC_F6_13 opt_set LCD_LANGUAGE vi +opt_set LCD_LANGUAGE_2 fr opt_set X_DRIVER_TYPE TMC2160 opt_set Y_DRIVER_TYPE TMC5160 opt_set Z_DRIVER_TYPE TMC2208_STANDALONE diff --git a/platformio.ini b/platformio.ini index a32bf53d67..a142fe891a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -39,6 +39,7 @@ default_src_filter = + - - + - - - + - - - - @@ -264,6 +265,7 @@ HAS_MENU_DELTA_CALIBRATE = src_filter=+ HAS_MENU_FILAMENT = src_filter=+ LCD_INFO_MENU = src_filter=+ HAS_MENU_JOB_RECOVERY = src_filter=+ +HAS_MULTI_LANGUAGE = src_filter=+ HAS_MENU_LED = src_filter=+ HAS_MENU_MEDIA = src_filter=+ HAS_MENU_MIXER = src_filter=+ From 5e5c0d65f3bce3bf6f795901e1c6aeb1af78d4d2 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 20 Jan 2021 23:26:12 -0800 Subject: [PATCH 0912/1370] Lerdge K/S/X support for Flash Drive (#20593) --- Marlin/src/pins/pins.h | 6 +++--- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 3 +++ Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 3 +++ Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 3 +++ platformio.ini | 24 ++++++++++++++++++++++++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index c0995e8826..2a635df60b 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -581,11 +581,11 @@ #elif MB(BTT_BTT002_V1_0) #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 #elif MB(LERDGE_K) - #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:LERDGEK + #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:LERDGEK env:LERDGEK_usb_flash_drive #elif MB(LERDGE_S) - #include "stm32f4/pins_LERDGE_S.h" // STM32F4 env:LERDGES + #include "stm32f4/pins_LERDGE_S.h" // STM32F4 env:LERDGES env:LERDGES_usb_flash_drive #elif MB(LERDGE_X) - #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGEX + #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGEX env:LERDGEX_usb_flash_drive #elif MB(VAKE403D) #include "stm32f4/pins_VAKE403D.h" // STM32F4 #elif MB(FYSETC_S6) diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 18cbdeaaf5..bf6df03562 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -29,6 +29,9 @@ #define I2C_EEPROM +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT + // // Servos // diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index 486aabfd8e..c6cfa98831 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -32,6 +32,9 @@ //#define I2C_EEPROM +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT + // // Servos // diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index c73b9927ac..606d932c57 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -32,6 +32,9 @@ #define I2C_EEPROM +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT + // // Servos // diff --git a/platformio.ini b/platformio.ini index a142fe891a..6b1543fa53 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1373,6 +1373,14 @@ build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUS extends = lerdge_common board_build.firmware = Lerdge_X_firmware_force.bin +# +# Lerdge X with USB Flash Drive Support +# +[env:LERDGEX_usb_flash_drive] +extends = LERDGEX +platform_packages = ${stm32_flash_drive.platform_packages} +build_flags = ${stm32_flash_drive.build_flags} + # # Lerdge S # @@ -1380,6 +1388,14 @@ board_build.firmware = Lerdge_X_firmware_force.bin extends = lerdge_common board_build.firmware = Lerdge_firmware_force.bin +# +# Lerdge S with USB Flash Drive Support +# +[env:LERDGES_usb_flash_drive] +extends = LERDGES +platform_packages = ${stm32_flash_drive.platform_packages} +build_flags = ${stm32_flash_drive.build_flags} + # # Lerdge K # @@ -1389,6 +1405,14 @@ board_build.firmware = Lerdge_K_firmware_force.bin build_flags = ${lerdge_common.build_flags} -DLERDGEK +# +# Lerdge K with USB Flash Drive Support +# +[env:LERDGEK_usb_flash_drive] +extends = LERDGEK +platform_packages = ${stm32_flash_drive.platform_packages} +build_flags = ${stm32_flash_drive.build_flags} + # # RUMBA32 # From 5252a32de4e305ffb876eb0f8e454968a31fa4c2 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 20 Jan 2021 23:28:38 -0800 Subject: [PATCH 0913/1370] USB Flash Drive env hints for ABM (#20592) --- Marlin/src/pins/pins.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 2a635df60b..f57e8e7dac 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -573,11 +573,11 @@ #elif MB(STEVAL_3DP001V1) #include "stm32f4/pins_STEVAL_3DP001V1.h" // STM32F4 env:STM32F401VE_STEVAL #elif MB(BTT_SKR_PRO_V1_1) - #include "stm32f4/pins_BTT_SKR_PRO_V1_1.h" // STM32F4 env:BIGTREE_SKR_PRO + #include "stm32f4/pins_BTT_SKR_PRO_V1_1.h" // STM32F4 env:BIGTREE_SKR_PRO env:BIGTREE_SKR_PRO_usb_flash_drive #elif MB(BTT_SKR_PRO_V1_2) - #include "stm32f4/pins_BTT_SKR_PRO_V1_2.h" // STM32F4 env:BIGTREE_SKR_PRO + #include "stm32f4/pins_BTT_SKR_PRO_V1_2.h" // STM32F4 env:BIGTREE_SKR_PRO env:BIGTREE_SKR_PRO_usb_flash_drive #elif MB(BTT_GTR_V1_0) - #include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BIGTREE_GTR_V1_0 + #include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BIGTREE_GTR_V1_0 env:BIGTREE_GTR_V1_0_usb_flash_drive #elif MB(BTT_BTT002_V1_0) #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 #elif MB(LERDGE_K) @@ -599,7 +599,7 @@ #elif MB(MKS_ROBIN_PRO_V2) #include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2 #elif MB(MKS_ROBIN_NANO_V3) - #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 + #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 env:mks_robin_nano_v3_usb_flash_drive #elif MB(ANET_ET4) #include "stm32f4/pins_ANET_ET4.h" // STM32F4 env:Anet_ET4_OpenBLT #elif MB(ANET_ET4P) From 67942622f1ffd17fb0cf8170f817dbb494e4016b Mon Sep 17 00:00:00 2001 From: Katelyn Schiesser Date: Thu, 21 Jan 2021 01:30:15 -0800 Subject: [PATCH 0914/1370] Increase filament runout distance edit limit (#20828) --- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b5f8d1d5de..cb7827168b 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -155,7 +155,7 @@ void menu_backlash(); #if HAS_FILAMENT_RUNOUT_DISTANCE editable.decimal = runout.runout_distance(); - EDIT_ITEM(float3, MSG_RUNOUT_DISTANCE_MM, &editable.decimal, 1, float(FILAMENT_RUNOUT_DISTANCE_MM) * 1.5f, + EDIT_ITEM_FAST(float3, MSG_RUNOUT_DISTANCE_MM, &editable.decimal, 1, 999, []{ runout.set_runout_distance(editable.decimal); }, true ); #endif From 71be210795831ac1b478f7bfff09c33bd8a24499 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 21 Jan 2021 03:40:07 -0600 Subject: [PATCH 0915/1370] Move some MarlinCore and MarlinUI code (#20832) --- Marlin/src/MarlinCore.cpp | 118 ++++-------------- Marlin/src/MarlinCore.h | 13 -- Marlin/src/feature/e_parser.h | 1 - Marlin/src/feature/encoder_i2c.cpp | 2 + Marlin/src/feature/pause.cpp | 47 ++----- Marlin/src/feature/pause.h | 6 +- Marlin/src/feature/runout.cpp | 3 +- Marlin/src/feature/runout.h | 8 +- Marlin/src/feature/twibus.cpp | 10 ++ Marlin/src/feature/twibus.h | 13 ++ Marlin/src/gcode/control/M108_M112_M410.cpp | 3 +- Marlin/src/gcode/control/M226.cpp | 2 + Marlin/src/gcode/control/M42.cpp | 4 + Marlin/src/gcode/feature/i2c/M260_M261.cpp | 2 +- Marlin/src/gcode/feature/pause/M125.cpp | 9 +- Marlin/src/gcode/feature/pause/M600.cpp | 9 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 13 +- Marlin/src/gcode/gcode.cpp | 32 ++++- Marlin/src/gcode/gcode.h | 2 + Marlin/src/gcode/queue.cpp | 1 + Marlin/src/gcode/sd/M1001.cpp | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 + Marlin/src/lcd/dwin/e3v2/rotary_encoder.h | 1 - .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 4 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 5 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 2 - .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 4 + Marlin/src/lcd/marlinui.cpp | 2 +- Marlin/src/lcd/marlinui.h | 25 ++-- Marlin/src/lcd/menu/menu_configuration.cpp | 2 + Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 + Marlin/src/lcd/menu/menu_filament.cpp | 4 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 + Marlin/src/module/endstops.cpp | 1 - Marlin/src/module/motion.cpp | 13 +- Marlin/src/module/motion.h | 2 + Marlin/src/module/probe.cpp | 2 +- Marlin/src/module/temperature.cpp | 11 +- 38 files changed, 178 insertions(+), 206 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index f994e2e32c..20cbb35386 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -43,6 +43,7 @@ #include #include "core/utility.h" + #include "module/motion.h" #include "module/planner.h" #include "module/endstops.h" @@ -57,6 +58,7 @@ #include "gcode/parser.h" #include "gcode/queue.h" +#include "feature/pause.h" #include "sd/cardreader.h" #include "lcd/marlinui.h" @@ -139,7 +141,6 @@ #if ENABLED(EXPERIMENTAL_I2CBUS) #include "feature/twibus.h" - TWIBus i2c; #endif #if ENABLED(I2C_POSITION_ENCODERS) @@ -173,10 +174,6 @@ #include "feature/bedlevel/bedlevel.h" #endif -#if BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) - #include "feature/pause.h" -#endif - #if ENABLED(GCODE_REPEAT_MARKERS) #include "feature/repeat.h" #endif @@ -267,40 +264,12 @@ bool wait_for_heatup = true; #endif -#if PIN_EXISTS(CHDK) - extern millis_t chdk_timeout; -#endif - -#if ENABLED(I2C_POSITION_ENCODERS) - I2CPositionEncodersMgr I2CPEM; -#endif - /** * *************************************************************************** * ******************************** FUNCTIONS ******************************** * *************************************************************************** */ -void setup_killpin() { - #if HAS_KILL - #if KILL_PIN_STATE - SET_INPUT_PULLDOWN(KILL_PIN); - #else - SET_INPUT_PULLUP(KILL_PIN); - #endif - #endif -} - -void setup_powerhold() { - #if HAS_SUICIDE - OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); - #endif - #if ENABLED(PSU_CONTROL) - powersupply_on = ENABLED(PSU_DEFAULT_OFF); - if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); - #endif -} - /** * Stepper Reset (RigidBoard, et.al.) */ @@ -309,18 +278,6 @@ void setup_powerhold() { void enableStepperDrivers() { SET_INPUT(STEPPER_RESET_PIN); } // Set to input, allowing pullups to pull the pin high #endif -#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 - - void i2c_on_receive(int bytes) { // just echo all bytes received to serial - i2c.receive(bytes); - } - - void i2c_on_request() { // just send dummy data for now - i2c.reply("Hello World!\n"); - } - -#endif - /** * Sensitive pin test for M42, M226 */ @@ -342,17 +299,6 @@ bool pin_is_protected(const pin_t pin) { #pragma GCC diagnostic pop -void protected_pin_err() { - SERIAL_ERROR_MSG(STR_ERR_PROTECTED_PIN); -} - -void quickstop_stepper() { - planner.quick_stop(); - planner.synchronize(); - set_current_from_steppers_for_axis(ALL_AXES); - sync_plan_position(); -} - void enable_e_steppers() { #define _ENA_E(N) ENABLE_AXIS_E##N(); REPEAT(E_STEPPERS, _ENA_E) @@ -389,41 +335,6 @@ void disable_all_steppers() { TERN_(EXTENSIBLE_UI, ExtUI::onSteppersDisabled()); } -#if ENABLED(G29_RETRY_AND_RECOVER) - - void event_probe_failure() { - #ifdef ACTION_ON_G29_FAILURE - host_action(PSTR(ACTION_ON_G29_FAILURE)); - #endif - #ifdef G29_FAILURE_COMMANDS - gcode.process_subcommands_now_P(PSTR(G29_FAILURE_COMMANDS)); - #endif - #if ENABLED(G29_HALT_ON_FAILURE) - #ifdef ACTION_ON_CANCEL - host_action_cancel(); - #endif - kill(GET_TEXT(MSG_LCD_PROBING_FAILED)); - #endif - } - - void event_probe_recover() { - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, PSTR("G29 Retrying"), DISMISS_STR)); - #ifdef ACTION_ON_G29_RECOVER - host_action(PSTR(ACTION_ON_G29_RECOVER)); - #endif - #ifdef G29_RECOVER_COMMANDS - gcode.process_subcommands_now_P(PSTR(G29_RECOVER_COMMANDS)); - #endif - } - -#endif - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - #include "feature/pause.h" -#else - constexpr bool did_pause_print = false; -#endif - /** * A Print Job exists when the timer is running or SD printing */ @@ -511,8 +422,8 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { // Prevent steppers timing-out in the middle of M600 // unless PAUSE_PARK_NO_STEPPER_TIMEOUT is disabled - const bool parked_or_ignoring = ignore_stepper_queue || - (BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) && did_pause_print); + const bool parked_or_ignoring = ignore_stepper_queue + || TERN0(PAUSE_PARK_NO_STEPPER_TIMEOUT, did_pause_print); // Reset both the M18/M84 activity timeout and the M85 max 'kill' timeout if (parked_or_ignoring) gcode.reset_stepper_timeout(ms); @@ -550,6 +461,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { } #if PIN_EXISTS(CHDK) // Check if pin should be set to LOW (after M240 set it HIGH) + extern millis_t chdk_timeout; if (chdk_timeout && ELAPSED(ms, chdk_timeout)) { chdk_timeout = 0; WRITE(CHDK_PIN, LOW); @@ -1038,13 +950,29 @@ void setup() { SETUP_RUN(recovery.setup()); #endif - SETUP_RUN(setup_killpin()); + #if HAS_KILL + SETUP_LOG("KILL_PIN"); + #if KILL_PIN_STATE + SET_INPUT_PULLDOWN(KILL_PIN); + #else + SET_INPUT_PULLUP(KILL_PIN); + #endif + #endif #if HAS_TMC220x SETUP_RUN(tmc_serial_begin()); #endif - SETUP_RUN(setup_powerhold()); + #if HAS_SUICIDE + SETUP_LOG("SUICIDE_PIN") + OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); + #endif + + #if ENABLED(PSU_CONTROL) + SETUP_LOG("PSU_CONTROL"); + powersupply_on = ENABLED(PSU_DEFAULT_OFF); + if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); + #endif #if HAS_STEPPER_RESET SETUP_RUN(disableStepperDrivers()); diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index 908636e967..f5bdbed535 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -37,11 +37,6 @@ void stop(); void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep=false)); inline void idle_no_sleep() { idle(TERN_(ADVANCED_PAUSE_FEATURE, true)); } -#if ENABLED(EXPERIMENTAL_I2CBUS) - #include "feature/twibus.h" - extern TWIBus i2c; -#endif - #if ENABLED(G38_PROBE_TARGET) extern uint8_t G38_move; // Flag to tell the ISR that G38 is in progress, and the type extern bool G38_did_trigger; // Flag from the ISR to indicate the endstop changed @@ -59,8 +54,6 @@ void disable_all_steppers(); void kill(PGM_P const lcd_error=nullptr, PGM_P const lcd_component=nullptr, const bool steppers_off=false); void minkill(const bool steppers_off=false); -void quickstop_stepper(); - // Global State of the firmware enum MarlinState : uint8_t { MF_INITIALIZING = 0, @@ -103,7 +96,6 @@ extern bool wait_for_heatup; #endif bool pin_is_protected(const pin_t pin); -void protected_pin_err(); #if HAS_SUICIDE inline void suicide() { OUT_WRITE(SUICIDE_PIN, SUICIDE_PIN_INVERTING); } @@ -116,11 +108,6 @@ void protected_pin_err(); inline bool kill_state() { return READ(KILL_PIN) == KILL_PIN_STATE; } #endif -#if ENABLED(G29_RETRY_AND_RECOVER) - void event_probe_recover(); - void event_probe_failure(); -#endif - extern const char NUL_STR[], M112_KILL_STR[], G28_STR[], M21_STR[], M23_STR[], M24_STR[], SP_A_STR[], SP_B_STR[], SP_C_STR[], SP_P_STR[], SP_T_STR[], SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[], diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index a4c07de465..659e516787 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -33,7 +33,6 @@ // External references extern bool wait_for_user, wait_for_heatup; -void quickstop_stepper(); class EmergencyParser { diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index dda165edf7..fa3cf1503f 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -41,6 +41,8 @@ #include +I2CPositionEncodersMgr I2CPEM; + void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { encoderAxis = axis; i2cAddress = address; diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index c8265a154f..5ab4f2b146 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -137,10 +137,7 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder); #endif - #if HAS_LCD_MENU - lcd_pause_show_message(PAUSE_MESSAGE_HEATING, mode); - #endif - UNUSED(mode); + ui.pause_show_message(PAUSE_MESSAGE_HEATING, mode); UNUSED(mode); if (wait) return thermalManager.wait_for_hotend(active_extruder); @@ -181,19 +178,13 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l DEBUG_SECTION(lf, "load_filament", true); DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " showlcd:", int(show_lcd), " pauseforuser:", int(pause_for_user), " pausemode:", int(mode) DXC_SAY); - UNUSED(show_lcd); - if (!ensure_safe_temperature(false, mode)) { - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS, mode); - #endif + if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_STATUS, mode); return false; } if (pause_for_user) { - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_INSERT, mode); - #endif + if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_INSERT, mode); SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_INSERT)); first_impatient_beep(max_beep_count); @@ -217,9 +208,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l } } - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_LOAD, mode); - #endif + if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_LOAD, mode); #if ENABLED(DUAL_X_CARRIAGE) const int8_t saved_ext = active_extruder; @@ -250,9 +239,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_PURGE); - #endif + if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_PURGE); TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Filament Purging..."), CONTINUE_STR)); TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Filament Purging..."))); @@ -266,9 +253,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l do { if (purge_length > 0) { // "Wait for filament purge" - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_PURGE); - #endif + if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_PURGE); // Extrude filament to get into hotend unscaled_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE); @@ -281,7 +266,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l // Show "Purge More" / "Resume" menu and wait for reply KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = false; - lcd_pause_show_message(PAUSE_MESSAGE_OPTION); + ui.pause_show_message(PAUSE_MESSAGE_OPTION); while (pause_menu_response == PAUSE_RESPONSE_WAIT_FOR) idle_no_sleep(); } #endif @@ -330,22 +315,16 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, #endif ); - UNUSED(show_lcd); - #if !BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) constexpr float mix_multiplier = 1.0; #endif if (!ensure_safe_temperature(false, mode)) { - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS); - #endif + if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_STATUS); return false; } - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, mode); - #endif + if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_UNLOAD, mode); // Retract filament unscaled_e_move(-(FILAMENT_UNLOAD_PURGE_RETRACT) * mix_multiplier, (PAUSE_PARK_RETRACT_FEEDRATE) * mix_multiplier); @@ -479,7 +458,7 @@ void show_continue_prompt(const bool is_reload) { DEBUG_SECTION(scp, "pause_print", true); DEBUG_ECHOLNPAIR("... is_reload:", int(is_reload)); - TERN_(HAS_LCD_MENU, lcd_pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING)); + ui.pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING); SERIAL_ECHO_START(); serialprintPGM(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); } @@ -520,7 +499,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep // Wait for the user to press the button to re-heat the nozzle, then // re-heat the nozzle, re-show the continue prompt, restart idle timers, start over if (nozzle_timed_out) { - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_HEAT)); + ui.pause_show_message(PAUSE_MESSAGE_HEAT); SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_HEAT)); TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_HEATER_TIMEOUT), GET_TEXT(MSG_REHEAT))); @@ -614,7 +593,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le thermalManager.wait_for_hotend(active_extruder, false); } - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_RESUME)); + ui.pause_show_message(PAUSE_MESSAGE_RESUME); // Check Temperature before moving hotend ensure_safe_temperature(); @@ -653,7 +632,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Write PLR now to update the z axis value TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); + ui.pause_show_message(PAUSE_MESSAGE_STATUS); #ifdef ACTION_ON_RESUMED host_action_resumed(); diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index c69ed73546..7e58d4564e 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -101,4 +101,8 @@ bool unload_filament(const float &unload_length, const bool show_lcd=false, cons #endif ); -#endif // ADVANCED_PAUSE_FEATURE +#else // !ADVANCED_PAUSE_FEATURE + + constexpr uint8_t did_pause_print = 0; + +#endif // !ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 50e18e52ef..be769d2dc8 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -59,6 +59,7 @@ bool FilamentMonitorBase::enabled = true, // Filament Runout event handler // #include "../MarlinCore.h" +#include "../feature/pause.h" #include "../gcode/queue.h" #if ENABLED(HOST_ACTION_COMMANDS) @@ -71,7 +72,7 @@ bool FilamentMonitorBase::enabled = true, void event_filament_runout() { - if (TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print)) return; // Action already in progress. Purge triggered repeated runout. + if (did_pause_print) return; // Action already in progress. Purge triggered repeated runout. #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) if (migration.in_progress) { diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 09443e6e2b..4b93d01eb7 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -118,9 +118,7 @@ class TFilamentMonitor : public FilamentMonitorBase { // Give the response a chance to update its counter. static inline void run() { - if ( enabled && !filament_ran_out - && (printingIsActive() || TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print)) - ) { + if (enabled && !filament_ran_out && (printingIsActive() || did_pause_print)) { TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, cli()); // Prevent RunoutResponseDelayed::block_completed from accumulating here response.run(); sensor.run(); @@ -343,9 +341,7 @@ class FilamentSensorBase { } static inline void block_completed(const block_t* const b) { - if (b->steps.x || b->steps.y || b->steps.z - || TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print) // Allow pause purge move to re-trigger runout state - ) { + if (b->steps.x || b->steps.y || b->steps.z || did_pause_print) { // Allow pause purge move to re-trigger runout state // Only trigger on extrusion with XYZ movement to allow filament change and retract/recover. const uint8_t e = b->extruder; const int32_t steps = b->steps.e; diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp index 3cc20579ac..855a3188d1 100644 --- a/Marlin/src/feature/twibus.cpp +++ b/Marlin/src/feature/twibus.cpp @@ -28,6 +28,8 @@ #include +TWIBus i2c; + TWIBus::TWIBus() { #if I2C_SLAVE_ADDRESS == 0 Wire.begin(); // No address joins the BUS as the master @@ -155,6 +157,14 @@ void TWIBus::flush() { reset(); } + void i2c_on_receive(int bytes) { // just echo all bytes received to serial + i2c.receive(bytes); + } + + void i2c_on_request() { // just send dummy data for now + i2c.reply("Hello World!\n"); + } + #endif #if ENABLED(DEBUG_TWIBUS) diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h index 82aa9aa16a..5939153482 100644 --- a/Marlin/src/feature/twibus.h +++ b/Marlin/src/feature/twibus.h @@ -31,6 +31,17 @@ typedef void (*twiReceiveFunc_t)(int bytes); typedef void (*twiRequestFunc_t)(); +/** + * For a light i2c protocol that runs on two boards running Marlin see: + * See https://github.com/MarlinFirmware/Marlin/issues/4776#issuecomment-246262879 + */ +#if I2C_SLAVE_ADDRESS > 0 + + void i2c_on_receive(int bytes); // Demo i2c onReceive handler + void i2c_on_request(); // Demo i2c onRequest handler + +#endif + #define TWIBUS_BUFFER_SIZE 32 /** @@ -238,3 +249,5 @@ class TWIBus { static inline void debug(const char[], uint8_t) {} #endif }; + +extern TWIBus i2c; diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp index df145d5d11..f86874acec 100644 --- a/Marlin/src/gcode/control/M108_M112_M410.cpp +++ b/Marlin/src/gcode/control/M108_M112_M410.cpp @@ -25,7 +25,8 @@ #if DISABLED(EMERGENCY_PARSER) #include "../gcode.h" -#include "../../MarlinCore.h" // for wait_for_heatup, kill, quickstop_stepper +#include "../../MarlinCore.h" // for wait_for_heatup, kill +#include "../../module/motion.h" // for quickstop_stepper /** * M108: Stop the waiting for heaters in M109, M190, M303. Does not affect the target temperature. diff --git a/Marlin/src/gcode/control/M226.cpp b/Marlin/src/gcode/control/M226.cpp index ad717e614d..63f022e82b 100644 --- a/Marlin/src/gcode/control/M226.cpp +++ b/Marlin/src/gcode/control/M226.cpp @@ -28,6 +28,8 @@ #include "../../MarlinCore.h" // for pin_is_protected and idle() #include "../../module/stepper.h" +void protected_pin_err(); + /** * M226: Wait until the specified pin reaches the state required (M226 P S) */ diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp index c635c06ec6..6ef8455e0b 100644 --- a/Marlin/src/gcode/control/M42.cpp +++ b/Marlin/src/gcode/control/M42.cpp @@ -31,6 +31,10 @@ #include "../../module/temperature.h" #endif +void protected_pin_err() { + SERIAL_ERROR_MSG(STR_ERR_PROTECTED_PIN); +} + /** * M42: Change pin status via GCode * diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp index 526d9101e1..438d1527f5 100644 --- a/Marlin/src/gcode/feature/i2c/M260_M261.cpp +++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp @@ -26,7 +26,7 @@ #include "../../gcode.h" -#include "../../../MarlinCore.h" // for i2c +#include "../../../feature/twibus.h" /** * M260: Send data to a I2C slave device diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index b1d76e83ae..9391b8661b 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -27,13 +27,10 @@ #include "../../gcode.h" #include "../../parser.h" #include "../../../feature/pause.h" +#include "../../../lcd/marlinui.h" #include "../../../module/motion.h" -#include "../../../sd/cardreader.h" #include "../../../module/printcounter.h" - -#if HAS_LCD_MENU - #include "../../../lcd/marlinui.h" -#endif +#include "../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../feature/powerloss.h" @@ -76,7 +73,7 @@ void GcodeSuite::M125() { const bool sd_printing = TERN0(SDSUPPORT, IS_SD_PRINTING()); - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); + ui.pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT); // If possible, show an LCD prompt with the 'P' flag const bool show_lcd = TERN0(HAS_LCD_MENU, parser.boolval('P')); diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index db8bc93a9f..1c282f2052 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -28,15 +28,12 @@ #include "../../../feature/pause.h" #include "../../../module/motion.h" #include "../../../module/printcounter.h" +#include "../../../lcd/marlinui.h" #if HAS_MULTI_EXTRUDER #include "../../../module/tool_change.h" #endif -#if HAS_LCD_MENU - #include "../../../lcd/marlinui.h" -#endif - #if ENABLED(MMU2_MENUS) #include "../../../lcd/menu/menu_mmu2.h" #endif @@ -96,8 +93,8 @@ void GcodeSuite::M600() { #endif // Show initial "wait for start" message - #if HAS_LCD_MENU && DISABLED(MMU2_MENUS) - lcd_pause_show_message(PAUSE_MESSAGE_CHANGING, PAUSE_MODE_PAUSE_PRINT, target_extruder); + #if DISABLED(MMU2_MENUS) + ui.pause_show_message(PAUSE_MESSAGE_CHANGING, PAUSE_MODE_PAUSE_PRINT, target_extruder); #endif #if ENABLED(HOME_BEFORE_FILAMENT_CHANGE) diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index a889da8aea..9a2b774936 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -29,15 +29,12 @@ #include "../../../module/motion.h" #include "../../../module/temperature.h" #include "../../../feature/pause.h" +#include "../../../lcd/marlinui.h" #if HAS_MULTI_EXTRUDER #include "../../../module/tool_change.h" #endif -#if HAS_LCD_MENU - #include "../../../lcd/marlinui.h" -#endif - #if HAS_PRUSA_MMU2 #include "../../../feature/mmu/mmu2.h" #endif @@ -82,7 +79,7 @@ void GcodeSuite::M701() { if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); // Show initial "wait for load" message - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder)); + ui.pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder); #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU) // Change toolhead if specified @@ -128,7 +125,7 @@ void GcodeSuite::M701() { TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool // Show status screen - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); + ui.pause_show_message(PAUSE_MESSAGE_STATUS); } /** @@ -180,7 +177,7 @@ void GcodeSuite::M702() { if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); // Show initial "wait for unload" message - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder)); + ui.pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder); #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU) // Change toolhead if specified @@ -232,7 +229,7 @@ void GcodeSuite::M702() { TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool // Show status screen - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); + ui.pause_show_message(PAUSE_MESSAGE_STATUS); } #endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 90a0b0ded0..88607b4081 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -61,7 +61,7 @@ GcodeSuite gcode; #include "../feature/password/password.h" #endif -#include "../MarlinCore.h" // for idle() +#include "../MarlinCore.h" // for idle, kill // Inactivity shutdown millis_t GcodeSuite::previous_move_ms = 0, @@ -209,6 +209,31 @@ void GcodeSuite::dwell(millis_t time) { */ #if BOTH(HAS_LEVELING, G29_RETRY_AND_RECOVER) + void GcodeSuite::event_probe_recover() { + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, PSTR("G29 Retrying"), DISMISS_STR)); + #ifdef ACTION_ON_G29_RECOVER + host_action(PSTR(ACTION_ON_G29_RECOVER)); + #endif + #ifdef G29_RECOVER_COMMANDS + process_subcommands_now_P(PSTR(G29_RECOVER_COMMANDS)); + #endif + } + + void GcodeSuite::event_probe_failure() { + #ifdef ACTION_ON_G29_FAILURE + host_action(PSTR(ACTION_ON_G29_FAILURE)); + #endif + #ifdef G29_FAILURE_COMMANDS + process_subcommands_now_P(PSTR(G29_FAILURE_COMMANDS)); + #endif + #if ENABLED(G29_HALT_ON_FAILURE) + #ifdef ACTION_ON_CANCEL + host_action_cancel(); + #endif + kill(GET_TEXT(MSG_LCD_PROBING_FAILED)); + #endif + } + #ifndef G29_MAX_RETRIES #define G29_MAX_RETRIES 0 #endif @@ -216,7 +241,10 @@ void GcodeSuite::dwell(millis_t time) { void GcodeSuite::G29_with_retry() { uint8_t retries = G29_MAX_RETRIES; while (G29()) { // G29 should return true for failed probes ONLY - if (retries--) event_probe_recover(); + if (retries) { + event_probe_recover(); + --retries; + } else { event_probe_failure(); return; diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 9453eecd94..2b7589662e 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -452,6 +452,8 @@ private: #if HAS_LEVELING #if ENABLED(G29_RETRY_AND_RECOVER) + static void event_probe_failure(); + static void event_probe_recover(); static void G29_with_retry(); #define G29_TYPE bool #else diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 98fe91db40..8197205eda 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -31,6 +31,7 @@ GCodeQueue queue; #include "../lcd/marlinui.h" #include "../sd/cardreader.h" +#include "../module/motion.h" #include "../module/planner.h" #include "../module/temperature.h" #include "../MarlinCore.h" diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 406cd074c3..cba0e51af1 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -44,7 +44,7 @@ #endif #if HAS_LEDS_OFF_FLAG - #include "../../MarlinCore.h" // for wait_for_user_response + #include "../../MarlinCore.h" // for wait_for_user_response() #include "../../feature/leds/printer_event_leds.h" #endif diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index c7c5908b36..1ab76a208d 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -544,6 +544,8 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Put Relevant Text on Display + extern const char X_LBL[], Y_LBL[], Z_LBL[]; + // Show X and Y positions at top of screen u8g.setColorIndex(1); if (PAGE_UNDER(7)) { diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h index bbba753a0b..7de80dfe01 100644 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h @@ -30,7 +30,6 @@ ****************************************************************************/ #include "../../../inc/MarlinConfig.h" -#include "../../../MarlinCore.h" /*********************** Encoder Set ***********************/ diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index a3f7c42a5c..baf2da6358 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -27,8 +27,8 @@ #include "../../ui_api.h" #include "../../../../libs/numtostr.h" -#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage -#include "../../../../MarlinCore.h" // for quickstop_stepper, disable_steppers, G28_STR +#include "../../../../module/motion.h" // for quickstop_stepper, A20 read printing speed, feedrate_percentage +#include "../../../../MarlinCore.h" // for disable_steppers, G28_STR #include "../../../../inc/MarlinConfig.h" // command sending macro's with debugging capability diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index ee536ea219..88c119566c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -25,7 +25,8 @@ #include "../../../../inc/MarlinConfigPre.h" -#include "../../../../MarlinCore.h" +#include // size_t + #if HAS_BED_PROBE #include "../../../../module/probe.h" #endif @@ -96,7 +97,7 @@ private: static void WritePGM(const char str[], uint8_t len); static void ProcessRx(); - static inline uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); } + static inline uint16_t swap16(const uint16_t value) { return (value & 0xFFU) << 8U | (value >> 8U); } static rx_datagram_state_t rx_datagram_state; static uint8_t rx_datagram_len; static bool Initialized, no_reentrance; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 7db5e80561..28c90486d0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -23,8 +23,6 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" - #include "draw_ui.h" #include "tft_multi_language.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 1f8676126c..fa01b7196f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -39,6 +39,10 @@ #include "../../../../module/planner.h" #include "../../../../module/servo.h" #include "../../../../module/probe.h" + +#if DISABLED(EMERGENCY_PARSER) + #include "../../../../module/motion.h" +#endif #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index d13c8e409d..25f3903ddc 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1516,7 +1516,7 @@ void MarlinUI::update() { LCD_MESSAGEPGM(MSG_PRINT_PAUSED); #if ENABLED(PARK_HEAD_ON_PAUSE) - TERN_(HAS_WIRED_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress + pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT); // Show message immediately to let user know about pause in progress queue.inject_P(PSTR("M25 P\nM24")); #elif ENABLED(SDSUPPORT) queue.inject_P(PSTR("M25")); diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 95a521d5dd..2e55c9ad1d 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -51,15 +51,13 @@ #include "../module/printcounter.h" #endif +#if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" + #include "../module/motion.h" // for active_extruder +#endif + #if HAS_WIRED_LCD - #include "../MarlinCore.h" - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - #include "../feature/pause.h" - #include "../module/motion.h" // for active_extruder - #endif - enum LCDViewAction : uint8_t { LCDVIEW_NONE, LCDVIEW_REDRAW_NOW, @@ -87,12 +85,6 @@ typedef void (*screenFunc_t)(); typedef void (*menuAction_t)(); - #if ENABLED(ADVANCED_PAUSE_FEATURE) - void lcd_pause_show_message(const PauseMessage message, - const PauseMode mode=PAUSE_MODE_SAME, - const uint8_t extruder=active_extruder); - #endif - #if ENABLED(AUTO_BED_LEVELING_UBL) void lcd_mesh_edit_setup(const float &initial); float lcd_mesh_edit(); @@ -506,6 +498,13 @@ public: #endif + #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) + static void pause_show_message(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder); + #else + static inline void _pause_show_message() {} + #define pause_show_message(...) _pause_show_message() + #endif + // // EEPROM: Reset / Init / Load / Store // diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 7b95f435ba..39752a6fe5 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -161,6 +161,8 @@ void menu_advanced_settings(); #include "../../module/motion.h" #include "../../gcode/queue.h" + extern const char G28_STR[]; + void menu_tool_offsets() { auto _recalc_offsets = []{ diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index 4efcb7c8ed..7411bb1ac2 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -53,6 +53,7 @@ void _man_probe_pt(const xy_pos_t &xy) { #if ENABLED(DELTA_AUTO_CALIBRATION) + #include "../../MarlinCore.h" // for wait_for_user_response() #include "../../gcode/gcode.h" #if ENABLED(HOST_PROMPT_SUPPORT) @@ -81,6 +82,7 @@ void _man_probe_pt(const xy_pos_t &xy) { } void _lcd_delta_calibrate_home() { + extern const char G28_STR[]; queue.inject_P(G28_STR); ui.goto_screen(_lcd_calibrate_homing); } diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 7bd12bde17..19601d678e 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -107,6 +107,8 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { */ #if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + bool printingIsPaused(); + void menu_change_filament() { // Say "filament change" when no print is active editable.int8 = printingIsPaused() ? PAUSE_MODE_PAUSE_PRINT : PAUSE_MODE_CHANGE_FILAMENT; @@ -315,7 +317,7 @@ FORCE_INLINE screenFunc_t ap_message_screen(const PauseMessage message) { return nullptr; } -void lcd_pause_show_message( +void MarlinUI::pause_show_message( const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/ diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index ecc378b607..5206cf4fe8 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -51,6 +51,8 @@ float manual_move_e_origin = 0; #endif +extern const char G28_STR[]; + // // "Motion" > "Move Axis" submenu // diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index b1c7c1c585..b9d2c1cdf5 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -27,7 +27,6 @@ #include "endstops.h" #include "stepper.h" -#include "../MarlinCore.h" #include "../sd/cardreader.h" #include "temperature.h" #include "../lcd/marlinui.h" diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 99853f24df..f7fc66b27a 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -236,8 +236,17 @@ void report_current_position_projected() { } /** - * sync_plan_position - * + * Run out the planner buffer and re-sync the current + * position from the last-updated stepper positions. + */ +void quickstop_stepper() { + planner.quick_stop(); + planner.synchronize(); + set_current_from_steppers_for_axis(ALL_AXES); + sync_plan_position(); +} + +/** * Set the planner/stepper positions directly from current_position with * no kinematic translation. Used for homing axes and cartesian/core syncing. */ diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 9352a4e4e6..887da1aa18 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -212,6 +212,8 @@ void report_current_position_projected(); void get_cartesian_from_steppers(); void set_current_from_steppers_for_axis(const AxisEnum axis); +void quickstop_stepper(); + /** * sync_plan_position * diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index cc5c5e8815..94c409eb72 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -38,7 +38,7 @@ #include "../gcode/gcode.h" #include "../lcd/marlinui.h" -#include "../MarlinCore.h" // for stop(), disable_e_steppers +#include "../MarlinCore.h" // for stop(), disable_e_steppers(), wait_for_user_response() #if HAS_LEVELING #include "../feature/bedlevel/bedlevel.h" diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index c15270f5eb..00a048736a 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -27,14 +27,17 @@ // Useful when debugging thermocouples //#define IGNORE_THERMOCOUPLE_ERRORS +#include "../MarlinCore.h" +#include "../HAL/shared/Delay.h" +#include "../lcd/marlinui.h" + #include "temperature.h" #include "endstops.h" - -#include "../MarlinCore.h" #include "planner.h" -#include "../HAL/shared/Delay.h" -#include "../lcd/marlinui.h" +#if ENABLED(EMERGENCY_PARSER) + #include "motion.h" +#endif #if ENABLED(DWIN_CREALITY_LCD) #include "../lcd/dwin/e3v2/dwin.h" From c409a6df5e954e1103f841232feb49a0e2d82757 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 21 Jan 2021 01:44:03 -0800 Subject: [PATCH 0916/1370] Fix ANYCUBIC_LCD_CHIRON compilation (#20807) Co-authored-by: Scott Lahteine --- .../lib/anycubic_chiron/FileNavigator.cpp | 2 ++ .../extui/lib/anycubic_chiron/chiron_tft.cpp | 9 +++++--- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 23 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp index fb4c84abb4..19f8ec81bc 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -44,6 +44,8 @@ using namespace ExtUI; namespace Anycubic { + FileNavigator filenavigator; + FileList FileNavigator::filelist; // Instance of the Marlin file API char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path uint16_t FileNavigator::lastindex; diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index b0053895a7..61057b5b10 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -54,6 +54,8 @@ namespace Anycubic { float ChironTFT::live_Zoffset; file_menu_t ChironTFT::file_menu; + ChironTFT Chiron; + ChironTFT::ChironTFT(){} void ChironTFT::Startup() { @@ -574,10 +576,11 @@ namespace Anycubic { } break; case 15: // A15 Resuming from outage - if (printer_state == AC_printer_resuming_from_power_outage) + if (printer_state == AC_printer_resuming_from_power_outage) { // Need to home here to restore the Z position - injectCommands_P(AC_cmnd_power_loss_recovery); - injectCommands_P(PSTR("M1000")); // home and start recovery + injectCommands(AC_cmnd_power_loss_recovery); + injectCommands("M1000"); // home and start recovery + } break; case 16: { // A16 Set HotEnd temp A17 S170 diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 2e9aba02cf..dfe86b12b7 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -60,6 +60,13 @@ #else #define X_MIN_PIN P1_26 // E0DET #endif +#elif ENABLED(X_DUAL_ENDSTOPS) + #ifndef X_MIN_PIN + #define X_MIN_PIN P1_29 // X-STOP + #endif + #ifndef X_MAX_PIN + #define X_MAX_PIN P1_26 // E0DET + #endif #else #define X_STOP_PIN P1_29 // X-STOP #endif @@ -71,6 +78,13 @@ #else #define Y_MIN_PIN P1_25 // E1DET #endif +#elif ENABLED(Y_DUAL_ENDSTOPS) + #ifndef Y_MIN_PIN + #define Y_MIN_PIN P1_28 // Y-STOP + #endif + #ifndef Y_MAX_PIN + #define Y_MAX_PIN P1_25 // E1DET + #endif #else #define Y_STOP_PIN P1_28 // Y-STOP #endif @@ -82,6 +96,13 @@ #else #define Z_MIN_PIN P1_00 // PWRDET #endif +#elif ENABLED(Z_MULTI_ENDSTOPS) + #ifndef Z_MIN_PIN + #define Z_MIN_PIN P1_27 // Z-STOP + #endif + #ifndef Z_MAX_PIN + #define Z_MAX_PIN P1_00 // PWRDET + #endif #else #ifndef Z_STOP_PIN #define Z_STOP_PIN P1_27 // Z-STOP @@ -337,6 +358,8 @@ #define LCD_PINS_ENABLE EXPA1_05_PIN #define LCD_PINS_D4 EXPA1_07_PIN + #define BEEPER_PIN EXPA1_10_PIN + #elif ENABLED(CR10_STOCKDISPLAY) #define BTN_ENC EXPA1_09_PIN // (58) open-drain #define LCD_PINS_RS EXPA1_04_PIN From f4a3db8db81fd6a1eb13a9707dd47ee089398ba4 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Thu, 21 Jan 2021 02:14:24 -0800 Subject: [PATCH 0917/1370] Ender 3 V2: Sync reset E in manual move (#20806) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index e1655d0ed9..b872ce32aa 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -2321,9 +2321,9 @@ void HMI_Prepare() { DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT); #if HAS_HOTEND - queue.inject_P(PSTR("G92 E0")); - current_position.e = HMI_ValueStruct.Move_E_scale = 0; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0); + current_position.e = HMI_ValueStruct.Move_E_scale = 0.0; + sync_plan_position_e(); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0.0); #endif break; case PREPARE_CASE_DISA: // Disable steppers @@ -2574,6 +2574,7 @@ void HMI_AxisMove() { if (encoder_diffState == ENCODER_DIFF_ENTER) { HMI_flag.ETempTooLow_flag = false; current_position.e = HMI_ValueStruct.Move_E_scale = 0; + sync_plan_position_e(); Draw_Move_Menu(); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); From de37fbffa3b35451d5c6b7e38402cfcfc0fcbd4a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 21 Jan 2021 17:30:47 -0600 Subject: [PATCH 0918/1370] Fix undefined E_LBL --- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 985041ede5..406e7b8640 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -703,6 +703,7 @@ void MarlinUI::draw_status_screen() { lcd_put_u8str(estimation_x_pos, EXTRAS_BASELINE, estimation_string); } else if (elapsed_string[0]) { + extern const char E_LBL[]; lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, E_LBL); lcd_put_u8str(elapsed_x_pos, EXTRAS_BASELINE, elapsed_string); } From 0b7de80a6ff38a4ca78a50f58d2c211cdfe1a0e7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 22 Jan 2021 15:01:19 -0600 Subject: [PATCH 0919/1370] Move common strings (#20846) --- Marlin/src/MarlinCore.cpp | 11 ----------- Marlin/src/MarlinCore.h | 5 +---- Marlin/src/core/serial.cpp | 16 ++++++++++------ Marlin/src/core/serial.h | 17 ++++++++++++++--- Marlin/src/feature/powerloss.cpp | 1 - Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 2 +- Marlin/src/gcode/calibrate/M48.cpp | 2 -- Marlin/src/gcode/config/M217.cpp | 2 -- Marlin/src/gcode/control/M108_M112_M410.cpp | 2 +- Marlin/src/gcode/gcode.h | 3 ++- Marlin/src/gcode/geometry/M206_M428.cpp | 2 -- Marlin/src/gcode/probe/M851.cpp | 2 -- Marlin/src/gcode/queue.cpp | 3 +++ Marlin/src/gcode/queue.h | 2 ++ Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 1 - Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 -- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 1 - Marlin/src/lcd/extui/dgus_lcd.cpp | 2 -- .../lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp | 2 +- .../screens/filament_runout_screen.cpp | 1 - .../screens/stress_test_screen.cpp | 1 - Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 2 -- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 -- Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp | 10 ++-------- Marlin/src/lcd/marlinui.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 4 +--- Marlin/src/lcd/menu/menu_configuration.cpp | 2 -- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 1 - Marlin/src/lcd/menu/menu_main.cpp | 10 ++++------ Marlin/src/lcd/menu/menu_motion.cpp | 3 --- Marlin/src/lcd/menu/menu_password.cpp | 2 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 1 - Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- Marlin/src/libs/vector_3.cpp | 2 -- Marlin/src/module/settings.cpp | 4 +--- Marlin/src/sd/cardreader.cpp | 6 +++++- Marlin/src/sd/cardreader.h | 2 ++ 38 files changed, 54 insertions(+), 83 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 20cbb35386..7a25876458 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -230,18 +230,7 @@ #include "feature/password/password.h" #endif -PGMSTR(NUL_STR, ""); PGMSTR(M112_KILL_STR, "M112 Shutdown"); -PGMSTR(G28_STR, "G28"); -PGMSTR(M21_STR, "M21"); -PGMSTR(M23_STR, "M23 %s"); -PGMSTR(M24_STR, "M24"); -PGMSTR(SP_P_STR, " P"); PGMSTR(SP_T_STR, " T"); -PGMSTR(X_STR, "X"); PGMSTR(Y_STR, "Y"); PGMSTR(Z_STR, "Z"); PGMSTR(E_STR, "E"); -PGMSTR(X_LBL, "X:"); PGMSTR(Y_LBL, "Y:"); PGMSTR(Z_LBL, "Z:"); PGMSTR(E_LBL, "E:"); -PGMSTR(SP_A_STR, " A"); PGMSTR(SP_B_STR, " B"); PGMSTR(SP_C_STR, " C"); -PGMSTR(SP_X_STR, " X"); PGMSTR(SP_Y_STR, " Y"); PGMSTR(SP_Z_STR, " Z"); PGMSTR(SP_E_STR, " E"); -PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMSTR(SP_E_LBL, " E:"); MarlinState marlin_state = MF_INITIALIZING; diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index f5bdbed535..d43d46bbd8 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -108,7 +108,4 @@ bool pin_is_protected(const pin_t pin); inline bool kill_state() { return READ(KILL_PIN) == KILL_PIN_STATE; } #endif -extern const char NUL_STR[], M112_KILL_STR[], G28_STR[], M21_STR[], M23_STR[], M24_STR[], - SP_A_STR[], SP_B_STR[], SP_C_STR[], - SP_P_STR[], SP_T_STR[], SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[], - X_LBL[], Y_LBL[], Z_LBL[], E_LBL[], SP_X_LBL[], SP_Y_LBL[], SP_Z_LBL[], SP_E_LBL[]; +extern const char M112_KILL_STR[]; diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 0d22f7bfc0..7e53f38517 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -25,8 +25,13 @@ uint8_t marlin_debug_flags = MARLIN_DEBUG_NONE; -static PGMSTR(errormagic, "Error:"); -static PGMSTR(echomagic, "echo:"); +// Commonly-used strings in serial output +PGMSTR(NUL_STR, ""); PGMSTR(SP_P_STR, " P"); PGMSTR(SP_T_STR, " T"); +PGMSTR(X_STR, "X"); PGMSTR(Y_STR, "Y"); PGMSTR(Z_STR, "Z"); PGMSTR(E_STR, "E"); +PGMSTR(X_LBL, "X:"); PGMSTR(Y_LBL, "Y:"); PGMSTR(Z_LBL, "Z:"); PGMSTR(E_LBL, "E:"); +PGMSTR(SP_A_STR, " A"); PGMSTR(SP_B_STR, " B"); PGMSTR(SP_C_STR, " C"); +PGMSTR(SP_X_STR, " X"); PGMSTR(SP_Y_STR, " Y"); PGMSTR(SP_Z_STR, " Z"); PGMSTR(SP_E_STR, " E"); +PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMSTR(SP_E_LBL, " E:"); #if HAS_MULTI_SERIAL int8_t serial_port_index = 0; @@ -35,8 +40,9 @@ static PGMSTR(echomagic, "echo:"); void serialprintPGM(PGM_P str) { while (const char c = pgm_read_byte(str++)) SERIAL_CHAR(c); } -void serial_echo_start() { serialprintPGM(echomagic); } -void serial_error_start() { serialprintPGM(errormagic); } + +void serial_echo_start() { static PGMSTR(echomagic, "echo:"); serialprintPGM(echomagic); } +void serial_error_start() { static PGMSTR(errormagic, "Error:"); serialprintPGM(errormagic); } void serial_echopair_PGM(PGM_P const s_P, const char *v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_PGM(PGM_P const s_P, char v) { serialprintPGM(s_P); SERIAL_CHAR(v); } @@ -65,8 +71,6 @@ void print_bin(uint16_t val) { } } -extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; - void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { if (prefix) serialprintPGM(prefix); SERIAL_ECHOPAIR_P(SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z); diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 4824866aeb..1dd3cd9cd0 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -27,9 +27,17 @@ #include "../feature/ethernet.h" #endif -/** - * Define debug bit-masks - */ +// Commonly-used strings in serial output +extern const char NUL_STR[], SP_P_STR[], SP_T_STR[], + X_STR[], Y_STR[], Z_STR[], E_STR[], + X_LBL[], Y_LBL[], Z_LBL[], E_LBL[], + SP_A_STR[], SP_B_STR[], SP_C_STR[], + SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[], + SP_X_LBL[], SP_Y_LBL[], SP_Z_LBL[], SP_E_LBL[]; + +// +// Debugging flags for use by M111 +// enum MarlinDebugFlags : uint8_t { MARLIN_DEBUG_NONE = 0, MARLIN_DEBUG_ECHO = _BV(0), ///< Echo commands in order as they are processed @@ -50,6 +58,9 @@ enum MarlinDebugFlags : uint8_t { extern uint8_t marlin_debug_flags; #define DEBUGGING(F) (marlin_debug_flags & (MARLIN_DEBUG_## F)) +// +// Serial redirection +// #define SERIAL_BOTH 0x7F #if HAS_MULTI_SERIAL extern int8_t serial_port_index; diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 0e669a74d4..be35ff8511 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -520,7 +520,6 @@ void PrintJobRecovery::resume() { // Resume the SD file from the last position char *fn = info.sd_filename; - extern const char M23_STR[]; sprintf_P(cmd, M23_STR, fn); gcode.process_subcommands_now(cmd); sprintf_P(cmd, PSTR("M24 S%ld T%ld"), resume_sdpos, info.print_job_elapsed); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 28ffd59edc..2e80f090a4 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -188,7 +188,7 @@ G29_TYPE GcodeSuite::G29() { // Send 'N' to force homing before G29 (internal only) if (parser.seen('N')) - gcode.process_subcommands_now_P(TERN(G28_L0_ENSURES_LEVELING_OFF, PSTR("G28L0"), G28_STR)); + process_subcommands_now_P(TERN(G28_L0_ENSURES_LEVELING_OFF, PSTR("G28L0"), G28_STR)); // Don't allow auto-leveling without homing first if (homing_needed_error()) G29_RETURN(false); diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 7438b0e83d..c5572e083f 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -38,7 +38,7 @@ #include "../../feature/probe_temp_comp.h" #include "../../lcd/marlinui.h" -#include "../../MarlinCore.h" // for wait_for_heatup, idle(), G28_STR +#include "../../MarlinCore.h" // for wait_for_heatup, idle() #if ENABLED(PRINTJOB_TIMER_AUTOSTART) #include "../../module/printcounter.h" diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 46367df10d..529d5c75d9 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -51,8 +51,6 @@ * This function requires the machine to be homed before invocation. */ -extern const char SP_Y_STR[]; - void GcodeSuite::M48() { if (homing_needed_error()) return; diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index b57dec31f3..f2fefb5756 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -33,8 +33,6 @@ #include "../../MarlinCore.h" // for SP_X_STR, etc. -extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; - void M217_report(const bool eeprom=false) { #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp index f86874acec..309c806c8f 100644 --- a/Marlin/src/gcode/control/M108_M112_M410.cpp +++ b/Marlin/src/gcode/control/M108_M112_M410.cpp @@ -25,7 +25,7 @@ #if DISABLED(EMERGENCY_PARSER) #include "../gcode.h" -#include "../../MarlinCore.h" // for wait_for_heatup, kill +#include "../../MarlinCore.h" // for wait_for_heatup, kill, M112_KILL_STR #include "../../module/motion.h" // for quickstop_stepper /** diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 2b7589662e..7fd8d6904a 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -310,6 +310,8 @@ enum AxisRelative : uint8_t { REL_X, REL_Y, REL_Z, REL_E, E_MODE_ABS, E_MODE_REL }; +extern const char G28_STR[]; + class GcodeSuite { public: @@ -371,7 +373,6 @@ public: static void process_subcommands_now(char * gcode); static inline void home_all_axes(const bool keep_leveling=false) { - extern const char G28_STR[]; process_subcommands_now_P(keep_leveling ? G28_STR : TERN(G28_L0_ENSURES_LEVELING_OFF, PSTR("G28L0"), G28_STR)); } diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index efb89fbcf2..2a2cdb16ff 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -30,8 +30,6 @@ #include "../../libs/buzzer.h" #include "../../MarlinCore.h" -extern const char SP_Y_STR[], SP_Z_STR[]; - void m206_report() { SERIAL_ECHOLNPAIR_P(PSTR("M206 X"), home_offset.x, SP_Y_STR, home_offset.y, SP_Z_STR, home_offset.z); } diff --git a/Marlin/src/gcode/probe/M851.cpp b/Marlin/src/gcode/probe/M851.cpp index ee60e9ebc0..04b293de31 100644 --- a/Marlin/src/gcode/probe/M851.cpp +++ b/Marlin/src/gcode/probe/M851.cpp @@ -28,8 +28,6 @@ #include "../../feature/bedlevel/bedlevel.h" #include "../../module/probe.h" -extern const char SP_Y_STR[], SP_Z_STR[]; - /** * M851: Set the nozzle-to-probe offsets in current units */ diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 8197205eda..9e626bd235 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -56,6 +56,9 @@ GCodeQueue queue; #include "../feature/repeat.h" #endif +// Frequently used G-code strings +PGMSTR(G28_STR, "G28"); + /** * GCode line number handling. Hosts may opt to include line numbers when * sending commands to Marlin, and lines will be checked for sequentiality. diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 966af2871f..57d4beecb8 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -186,3 +186,5 @@ private: }; extern GCodeQueue queue; + +extern const char G28_STR[]; diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 84c477fbde..635751b3f5 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -471,7 +471,6 @@ void MarlinUI::clear_lcd() { lcd.clear(); } // Show the Marlin logo and short build version // After a delay show the website URL // - extern const char NUL_STR[]; logo_lines(NUL_STR); CENTER_OR_SCROLL(SHORT_BUILD_VERSION, 1500); CENTER_OR_SCROLL(MARLIN_WEBSITE_URL, 1500); diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 1ab76a208d..c7c5908b36 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -544,8 +544,6 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Put Relevant Text on Display - extern const char X_LBL[], Y_LBL[], Z_LBL[]; - // Show X and Y positions at top of screen u8g.setColorIndex(1); if (PAGE_UNDER(7)) { diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 406e7b8640..985041ede5 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -703,7 +703,6 @@ void MarlinUI::draw_status_screen() { lcd_put_u8str(estimation_x_pos, EXTRAS_BASELINE, estimation_string); } else if (elapsed_string[0]) { - extern const char E_LBL[]; lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, E_LBL); lcd_put_u8str(elapsed_x_pos, EXTRAS_BASELINE, elapsed_string); } diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index 33d8bd4d89..9fcb6c8d13 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -35,8 +35,6 @@ #include "lib/dgus/DGUSDisplayDef.h" #include "lib/dgus/DGUSScreenHandler.h" -extern const char NUL_STR[]; - namespace ExtUI { void onStartup() { diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index baf2da6358..1508dc0d27 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -28,7 +28,7 @@ #include "../../../../libs/numtostr.h" #include "../../../../module/motion.h" // for quickstop_stepper, A20 read printing speed, feedrate_percentage -#include "../../../../MarlinCore.h" // for disable_steppers, G28_STR +#include "../../../../MarlinCore.h" // for disable_steppers #include "../../../../inc/MarlinConfig.h" // command sending macro's with debugging capability diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp index c281ccb050..41e3be22ef 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp @@ -36,7 +36,6 @@ void FilamentRunoutScreen::onRedraw(draw_mode_t what) { w.toggle( 2, GET_TEXT_F(MSG_RUNOUT_SENSOR), getFilamentRunoutEnabled()); #if HAS_FILAMENT_RUNOUT_DISTANCE - extern const char NUL_STR[]; w.heading(GET_TEXT_F(MSG_RUNOUT_DISTANCE_MM)); w.units(GET_TEXT_F(MSG_UNITS_MM)); w.precision(0); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp index 0aed1b7c53..6c4aab6d31 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -120,7 +120,6 @@ void StressTestScreen::onIdle() { if (!commandsInQueue()) { if (!isPositionKnown()) { - extern const char G28_STR[]; injectCommands_P(G28_STR); } else { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 5b65f990c1..588b940bb6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -31,8 +31,6 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" -extern const char G28_STR[]; - extern lv_group_t *g; static lv_obj_t *scr; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 0b09ae391d..495acda06b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -29,8 +29,6 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" -extern const char G28_STR[]; - extern lv_group_t *g; static lv_obj_t *scr; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index fa01b7196f..785e854c52 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -21,15 +21,13 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if HAS_TFT_LVGL_UI +#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) #include "draw_ui.h" #include "wifi_module.h" #include "wifi_upload.h" #include "SPI_TFT.h" -#if ENABLED(MKS_WIFI_MODULE) - #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" #include "../../../../gcode/queue.h" @@ -459,7 +457,6 @@ int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len) { return 1; } - #define SEND_OK_TO_WIFI send_to_wifi((uint8_t *)"ok\r\n", strlen("ok\r\n")) int send_to_wifi(uint8_t *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } @@ -553,7 +550,6 @@ typedef struct { uint8_t tail; } ESP_PROTOC_FRAME; - static int cut_msg_head(uint8_t *msg, uint16_t msgLen, uint16_t cutLen) { if (msgLen < cutLen) return 0; @@ -1707,7 +1703,6 @@ void mks_esp_wifi_init() { wifi_link_state = WIFI_NOT_CONFIG; } - void mks_wifi_firmware_update() { card.openFileRead((char *)ESP_FIRMWARE_FILE); @@ -1826,5 +1821,4 @@ int readWifiBuf(int8_t *buf, int32_t len) { return i; } -#endif // MKS_WIFI_MODULE -#endif // HAS_TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI && MKS_WIFI_MODULE diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 25f3903ddc..c3c5d3f094 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1528,7 +1528,7 @@ void MarlinUI::update() { void MarlinUI::resume_print() { reset_status(); TERN_(PARK_HEAD_ON_PAUSE, wait_for_heatup = wait_for_user = false); - if (IS_SD_PAUSED()) queue.inject_P(M24_STR); + TERN_(SDSUPPORT, if (IS_SD_PAUSED()) queue.inject_P(M24_STR)); #ifdef ACTION_ON_RESUME host_action_resume(); #endif diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index efa5454d8c..473b09d328 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -66,8 +66,6 @@ static_assert(LEVEL_CORNERS_Z_HOP >= 0, "LEVEL_CORNERS_Z_HOP must be >= 0. Please update your configuration."); -extern const char G28_STR[]; - #if HAS_LEVELING static bool leveling_was_active = false; #endif @@ -205,7 +203,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { , []{ corner_probing_done = true; wait_for_probe = false; } , []{ wait_for_probe = false; } , GET_TEXT(MSG_LEVEL_CORNERS_RAISE) - , (const char*)nullptr, PSTR("") + , (const char*)nullptr, NUL_STR ); } diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 39752a6fe5..7b95f435ba 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -161,8 +161,6 @@ void menu_advanced_settings(); #include "../../module/motion.h" #include "../../gcode/queue.h" - extern const char G28_STR[]; - void menu_tool_offsets() { auto _recalc_offsets = []{ diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index 7411bb1ac2..a86ae74fce 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -82,7 +82,6 @@ void _man_probe_pt(const xy_pos_t &xy) { } void _lcd_delta_calibrate_home() { - extern const char G28_STR[]; queue.inject_P(G28_STR); ui.goto_screen(_lcd_calibrate_homing); } diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 24d048cafd..878ac83a5a 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -101,8 +101,6 @@ void menu_configuration(); void menu_language(); #endif -extern const char M21_STR[]; - void menu_main() { const bool busy = printingIsActive() #if ENABLED(SDSUPPORT) @@ -156,7 +154,7 @@ void menu_main() { if (!card_open) { SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY); #if PIN_EXISTS(SD_DETECT) - GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); + GCODES_ITEM(MSG_CHANGE_MEDIA, PSTR("M21")); #else GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); #endif @@ -166,7 +164,7 @@ void menu_main() { #if PIN_EXISTS(SD_DETECT) ACTION_ITEM(MSG_NO_MEDIA, nullptr); #else - GCODES_ITEM(MSG_ATTACH_MEDIA, M21_STR); + GCODES_ITEM(MSG_ATTACH_MEDIA, PSTR("M21")); #endif } @@ -257,7 +255,7 @@ void menu_main() { if (card_detected) { if (!card_open) { #if PIN_EXISTS(SD_DETECT) - GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); + GCODES_ITEM(MSG_CHANGE_MEDIA, PSTR("M21")); #else GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); #endif @@ -268,7 +266,7 @@ void menu_main() { #if PIN_EXISTS(SD_DETECT) ACTION_ITEM(MSG_NO_MEDIA, nullptr); #else - GCODES_ITEM(MSG_ATTACH_MEDIA, M21_STR); + GCODES_ITEM(MSG_ATTACH_MEDIA, PSTR("M21")); #endif } } diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 5206cf4fe8..71fc4246c7 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -51,8 +51,6 @@ float manual_move_e_origin = 0; #endif -extern const char G28_STR[]; - // // "Motion" > "Move Axis" submenu // @@ -191,7 +189,6 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int sprintf_P(tmp, label, dtostrf(FINE_MANUAL_MOVE, 1, digs, numstr)); #if DISABLED(HAS_GRAPHICAL_TFT) - extern const char NUL_STR[]; SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(FINE_MANUAL_MOVE)); }); MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); lcd_put_u8str(tmp); diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp index c58931cf2e..80c5c3dc66 100644 --- a/Marlin/src/lcd/menu/menu_password.cpp +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -49,7 +49,7 @@ void Password::menu_password_entry() { // "Login" or "New Code" STATIC_ITEM_P(authenticating ? GET_TEXT(MSG_LOGIN_REQUIRED) : GET_TEXT(MSG_EDIT_PASSWORD), SS_CENTER|SS_INVERT); - STATIC_ITEM_P(PSTR(""), SS_CENTER|SS_INVERT, string); + STATIC_ITEM_P(NUL_STR, SS_CENTER|SS_INVERT, string); // Make the digit edit item look like a sub-menu PGM_P const label = GET_TEXT(MSG_ENTER_DIGIT); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 5b88c8e805..2f0c37b433 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -88,7 +88,6 @@ void probe_offset_wizard_menu() { !UNEAR_ZERO((FINE_MANUAL_MOVE) * 100 - int((FINE_MANUAL_MOVE) * 100)) ? 3 : 2; sprintf_P(tmp, GET_TEXT(MSG_MOVE_N_MM), dtostrf(FINE_MANUAL_MOVE, 1, digs, numstr)); #if DISABLED(HAS_GRAPHICAL_TFT) - extern const char NUL_STR[]; SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(FINE_MANUAL_MOVE)); }); MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); lcd_put_u8str(tmp); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index b6ffb4592f..4165c3990c 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -867,7 +867,7 @@ static void moveAxis(AxisEnum axis, const int8_t direction) { NOMORE(ui.manual_move.offset, max - current_position[axis]); #else current_position[axis] += diff; - const char *msg = PSTR(""); // clear the error + const char *msg = NUL_STR; // clear the error if (direction < 0 && current_position[axis] < min) { current_position[axis] = min; msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index fd93ba09ad..6f87a523e0 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -76,8 +76,6 @@ void vector_3::apply_rotation(const matrix_3x3 &matrix) { matrix.vectors[0][2] * _x + matrix.vectors[1][2] * _y + matrix.vectors[2][2] * _z }; } -extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; - void vector_3::debug(PGM_P const title) { serialprintPGM(title); SERIAL_ECHOPAIR_F_P(SP_X_STR, x, 6); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 0a5439facd..6908635d6e 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -176,8 +176,6 @@ static const uint32_t _DMA[] PROGMEM = DEFAULT_MAX_ACCELERATION; static const float _DASU[] PROGMEM = DEFAULT_AXIS_STEPS_PER_UNIT; static const feedRate_t _DMF[] PROGMEM = DEFAULT_MAX_FEEDRATE; -extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[]; - /** * Current EEPROM Layout * @@ -3181,7 +3179,7 @@ void MarlinSettings::reset() { #elif ENABLED(AUTO_BED_LEVELING_UBL) - config_heading(forReplay, PSTR(""), false); + config_heading(forReplay, NUL_STR, false); if (!forReplay) { ubl.echo_name(); SERIAL_CHAR(':'); diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 7b162f7343..307f31e431 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -57,6 +57,11 @@ #include "../core/debug_out.h" #include "../libs/hex_print.h" +// extern + +PGMSTR(M23_STR, "M23 %s"); +PGMSTR(M24_STR, "M24"); + // public: card_flags_t CardReader::flag; @@ -481,7 +486,6 @@ void CardReader::release() { */ void CardReader::openAndPrintFile(const char *name) { char cmd[4 + strlen(name) + 1 + 3 + 1]; // Room for "M23 ", filename, "\n", "M24", and null - extern const char M23_STR[]; sprintf_P(cmd, M23_STR, name); for (char *c = &cmd[4]; *c; c++) *c = tolower(*c); strcat_P(cmd, PSTR("\nM24")); diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index b775d8a873..7a312b1b57 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -27,6 +27,8 @@ #if ENABLED(SDSUPPORT) +extern const char M23_STR[], M24_STR[]; + #if BOTH(SDCARD_SORT_ALPHA, SDSORT_DYNAMIC_RAM) #define SD_RESORT 1 #endif From 7bbf958e5cfbeb65d2cd263ff71b54a176f79139 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 22 Jan 2021 15:15:01 -0600 Subject: [PATCH 0920/1370] Add labels, condition for BTT GTR M5 pins (#20772) Co-Authored-By: NAPCAL <47440988+NAPCAL@users.noreply.github.com> --- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 148 +++++++++++--------- 1 file changed, 82 insertions(+), 66 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 981064fa4d..cd9d60d2f0 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -39,6 +39,7 @@ #define HAS_OTG_USB_HOST_SUPPORT #define TP // Enable to define servo and probe pins +#define M5_EXTENDER // The M5 extender is attached // // Servos @@ -101,11 +102,13 @@ // // Pins on the extender // -//#define X_MIN_PIN PI4 -//#define X2_MIN_PIN PF12 -//#define Y_MIN_PIN PF4 -//#define Y2_MIN_PIN PI7 -//#define Z_MIN_PIN PF6 +#if ENABLED(M5_EXTENDER) + #define X2_STOP_PIN PI4 // M5 M1_STOP + #define Y2_STOP_PIN PF12 // M5 M5_STOP + #define Z2_STOP_PIN PF4 // M5 M2_STOP + #define Z3_STOP_PIN PI7 // M5 M4_STOP + #define Z4_STOP_PIN PF6 // M5 M3_STOP +#endif #if ENABLED(TP) && !defined(Z_MIN_PROBE_PIN) #define Z_MIN_PROBE_PIN PH11 // Z Probe must be PH11 @@ -156,39 +159,43 @@ #define E2_CS_PIN PC12 #endif -#define E3_STEP_PIN PF3 -#define E3_DIR_PIN PG3 -#define E3_ENABLE_PIN PF8 -#ifndef E3_CS_PIN - #define E3_CS_PIN PG4 -#endif +#if ENABLED(M5_EXTENDER) -#define E4_STEP_PIN PD14 -#define E4_DIR_PIN PD11 -#define E4_ENABLE_PIN PG2 -#ifndef E4_CS_PIN - #define E4_CS_PIN PE15 -#endif + #define E3_STEP_PIN PF3 + #define E3_DIR_PIN PG3 + #define E3_ENABLE_PIN PF8 + #ifndef E3_CS_PIN + #define E3_CS_PIN PG4 + #endif -#define E5_STEP_PIN PE12 -#define E5_DIR_PIN PE10 -#define E5_ENABLE_PIN PF14 -#ifndef E5_CS_PIN - #define E5_CS_PIN PE7 -#endif + #define E4_STEP_PIN PD14 + #define E4_DIR_PIN PD11 + #define E4_ENABLE_PIN PG2 + #ifndef E4_CS_PIN + #define E4_CS_PIN PE15 + #endif -#define E6_STEP_PIN PG0 -#define E6_DIR_PIN PG1 -#define E6_ENABLE_PIN PE8 -#ifndef E6_CS_PIN - #define E6_CS_PIN PF15 -#endif + #define E5_STEP_PIN PE12 + #define E5_DIR_PIN PE10 + #define E5_ENABLE_PIN PF14 + #ifndef E5_CS_PIN + #define E5_CS_PIN PE7 + #endif + + #define E6_STEP_PIN PG0 + #define E6_DIR_PIN PG1 + #define E6_ENABLE_PIN PE8 + #ifndef E6_CS_PIN + #define E6_CS_PIN PF15 + #endif + + #define E7_STEP_PIN PH12 + #define E7_DIR_PIN PH15 + #define E7_ENABLE_PIN PI0 + #ifndef E7_CS_PIN + #define E7_CS_PIN PH14 + #endif -#define E7_STEP_PIN PH12 -#define E7_DIR_PIN PH15 -#define E7_ENABLE_PIN PI0 -#ifndef E7_CS_PIN - #define E7_CS_PIN PH14 #endif // @@ -222,11 +229,11 @@ //#define E0_HARDWARE_SERIAL Serial1 //#define E1_HARDWARE_SERIAL Serial1 //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - //#define E5_HARDWARE_SERIAL Serial1 - //#define E6_HARDWARE_SERIAL Serial1 - //#define E7_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 // M5 MOTOR 1 + //#define E4_HARDWARE_SERIAL Serial1 // M5 MOTOR 2 + //#define E5_HARDWARE_SERIAL Serial1 // M5 MOTOR 3 + //#define E6_HARDWARE_SERIAL Serial1 // M5 MOTOR 4 + //#define E7_HARDWARE_SERIAL Serial1 // M5 MOTOR 5 // // Software serial @@ -249,20 +256,22 @@ #define E2_SERIAL_TX_PIN PC12 #define E2_SERIAL_RX_PIN PC12 - #define E3_SERIAL_TX_PIN PG4 - #define E3_SERIAL_RX_PIN PG4 + #if ENABLED(M5_EXTENDER) + #define E3_SERIAL_TX_PIN PG4 + #define E3_SERIAL_RX_PIN PG4 - #define E4_SERIAL_TX_PIN PE15 - #define E4_SERIAL_RX_PIN PE15 + #define E4_SERIAL_TX_PIN PE15 + #define E4_SERIAL_RX_PIN PE15 - #define E5_SERIAL_TX_PIN PE7 - #define E5_SERIAL_RX_PIN PE7 + #define E5_SERIAL_TX_PIN PE7 + #define E5_SERIAL_RX_PIN PE7 - #define E6_SERIAL_TX_PIN PF15 - #define E6_SERIAL_RX_PIN PF15 + #define E6_SERIAL_TX_PIN PF15 + #define E6_SERIAL_RX_PIN PF15 - #define E7_SERIAL_TX_PIN PH14 - #define E7_SERIAL_RX_PIN PH14 + #define E7_SERIAL_TX_PIN PH14 + #define E7_SERIAL_RX_PIN PH14 + #endif // Reduce baud rate to improve software serial reliability #define TMC_BAUD_RATE 19200 @@ -275,11 +284,13 @@ #define TEMP_1_PIN PC2 // T2 <-> E1 #define TEMP_2_PIN PC3 // T3 <-> E2 -#define TEMP_3_PIN PA3 // T4 <-> E3 -#define TEMP_4_PIN PF9 // T5 <-> E4 -#define TEMP_5_PIN PF10 // T6 <-> E5 -#define TEMP_6_PIN PF7 // T7 <-> E6 -#define TEMP_7_PIN PF5 // T8 <-> E7 +#if ENABLED(M5_EXTENDER) + #define TEMP_3_PIN PA3 // M5 TEMP1 + #define TEMP_4_PIN PF9 // M5 TEMP2 + #define TEMP_5_PIN PF10 // M5 TEMP3 + #define TEMP_6_PIN PF7 // M5 TEMP4 + #define TEMP_7_PIN PF5 // M5 TEMP5 +#endif #define TEMP_BED_PIN PC0 // T0 <-> Bed @@ -289,8 +300,8 @@ #define THERMO_SCK_PIN PI1 // SCK #define THERMO_DO_PIN PI2 // MISO -#define THERMO_CS1_PIN PH9 // CS1 -#define THERMO_CS2_PIN PH2 // CS2 +#define THERMO_CS1_PIN PH9 // GTR K-TEMP +#define THERMO_CS2_PIN PH2 // M5 K-TEMP #define MAX6675_SS_PIN THERMO_CS1_PIN #define MAX6675_SS2_PIN THERMO_CS2_PIN @@ -304,11 +315,13 @@ #define HEATER_1_PIN PA1 // Heater1 #define HEATER_2_PIN PB0 // Heater2 -#define HEATER_3_PIN PD15 // Heater3 -#define HEATER_4_PIN PD13 // Heater4 -#define HEATER_5_PIN PD12 // Heater5 -#define HEATER_6_PIN PE13 // Heater6 -#define HEATER_7_PIN PI6 // Heater7 +#if ENABLED(M5_EXTENDER) + #define HEATER_3_PIN PD15 // M5 HEAT1 + #define HEATER_4_PIN PD13 // M5 HEAT2 + #define HEATER_5_PIN PD12 // M5 HEAT3 + #define HEATER_6_PIN PE13 // M5 HEAT4 + #define HEATER_7_PIN PI6 // M5 HEAT5 +#endif #define HEATER_BED_PIN PA2 // Hotbed @@ -316,11 +329,13 @@ #define FAN1_PIN PE6 // Fan1 #define FAN2_PIN PC8 // Fan2 -#define FAN3_PIN PI5 // Fan3 -#define FAN4_PIN PE9 // Fan4 -#define FAN5_PIN PE11 // Fan5 -//#define FAN6_PIN PC9 // Fan6 -//#define FAN7_PIN PE14 // Fan7 +#if ENABLED(M5_EXTENDER) + #define FAN3_PIN PI5 // M5 FAN1 + #define FAN4_PIN PE9 // M5 FAN2 + #define FAN5_PIN PE11 // M5 FAN3 + //#define FAN6_PIN PC9 // M5 FAN4 + //#define FAN7_PIN PE14 // M5 FAN5 +#endif #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD @@ -456,3 +471,4 @@ #endif // HAS_WIRED_LCD #undef TP +#undef M5_EXTENDER From 22db4c04480fa1645d419df153f343ad7d1804f0 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:58:08 +0100 Subject: [PATCH 0921/1370] =?UTF-8?q?"Move=20=E2=80=A6=20code"=20followup?= =?UTF-8?q?=20(#20852)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix regression from #20832 --- Marlin/src/gcode/gcode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 88607b4081..a29289d8d1 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -40,7 +40,7 @@ GcodeSuite gcode; #include "../module/printcounter.h" #endif -#if ENABLED(HOST_PROMPT_SUPPORT) +#if ENABLED(HOST_ACTION_COMMANDS) #include "../feature/host_actions.h" #endif From a8a6040b7873f77ca411ab951dc4d8492b4c402c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 22 Jan 2021 20:51:58 -0600 Subject: [PATCH 0922/1370] =?UTF-8?q?=F0=9F=9B=A0=20Replace=20lib=5Fdeps?= =?UTF-8?q?=20for=20custom=5Fmarlin.FEATURE=20(#20858)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlatformIO/scripts/common-dependencies.py | 23 ++++++++++++------- platformio.ini | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 2f4ad3e502..4b8c339d46 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -69,16 +69,23 @@ def add_to_feat_cnf(feature, flines): except: FEATURE_CONFIG[feature] = {} + # Get a reference to the FEATURE_CONFIG under construction feat = FEATURE_CONFIG[feature] - atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') - for dep in atoms: - parts = dep.split('=') + + # Split up passed lines on commas or newlines and iterate + # Add common options to the features config under construction + # For lib_deps replace a previous instance of the same library + atoms = re.sub(r',\\s*', '\n', flines).strip().split('\n') + for line in atoms: + parts = line.split('=') name = parts.pop(0) - rest = '='.join(parts) if name in ['build_flags', 'extra_scripts', 'src_filter', 'lib_ignore']: - feat[name] = rest + feat[name] = '='.join(parts) else: - feat['lib_deps'] += [dep] + for dep in line.split(','): + lib_name = re.sub(r'([@~^=]|[<>]=?)[\d.]+', '', dep.strip()).split('=').pop(0) + lib_re = re.compile('(?!^' + lib_name + '\\b)') + feat['lib_deps'] = list(filter(lib_re.match, feat['lib_deps'])) + [dep] def load_config(): config = configparser.ConfigParser() @@ -185,8 +192,8 @@ def apply_features_config(): blab("Adding src_filter for %s... " % feature) src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder - my_srcs = re.findall( r'[+-](<.*?>)', feat['src_filter']) - cur_srcs = re.findall( r'[+-](<.*?>)', src_filter) + my_srcs = re.findall(r'[+-](<.*?>)', feat['src_filter']) + cur_srcs = re.findall(r'[+-](<.*?>)', src_filter) for d in my_srcs: if d in cur_srcs: src_filter = re.sub(r'[+-]' + d, '', src_filter) diff --git a/platformio.ini b/platformio.ini index 6b1543fa53..822f1df8d1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -404,7 +404,7 @@ BEZIER_CURVE_SUPPORT = src_filter=+ + HAS_BED_PROBE = src_filter=+ + + + IS_SCARA = src_filter=+ -HAS_SERVOS = src_filter=+ + +HAS_SERVOS = src_filter=+ + MORGAN_SCARA = src_filter=+ HAS_MICROSTEPS = src_filter=+ (ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer From 5398bfab3648c249c8af58e23b42220b9e753795 Mon Sep 17 00:00:00 2001 From: ScrewThisBanana <71625822+ScrewThisBanana@users.noreply.github.com> Date: Sat, 23 Jan 2021 04:02:22 +0100 Subject: [PATCH 0923/1370] Adding custom move feedrate for G26 (#20729) * Adding custom move feedrate for G26 This commit adds an additional configuration parameter that can be used to specify the movement speed during the G26 validation pattern command during moves without extrusion. Closes MarlinFirmware/Marlin#20615 * Fixing missing default 'G26_XY_FEEDRATE_MOVE' value This commit adds a default 'G26_XY_FEEDRATE_MOVE' value (max movement speed / 1.5) in the G26.cpp - same behaviour as the default 'G26_XY_FEEDRATE' value * Adding comment describing functionality in G26.cpp * Renaming 'G26_XY_FEEDRATE_MOVE' to 'G26_XY_FEEDRATE_TRAVEL' Configuration parameter renamed for better readability and consistency MarlinFirmware/Marlin#20615 * Setting 'G26_XY_FEEDRATE_TRAVEL' to a safer value, aligned comments Changed default value for 'G26_XY_FEEDRATE_TRAVEL' from 150 mm/s to 100 mm/s for safety purposes, comment alignment MarlinFirmware/Marlin#20615 --- Marlin/Configuration.h | 1 + Marlin/src/gcode/bedlevel/G26.cpp | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d86c448441..0b5883d88b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1361,6 +1361,7 @@ #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. + #define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for XY Moves without extrusion for the G26 Mesh Validation Tool #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. #endif diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 650b039b55..c583b505cb 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -128,6 +128,10 @@ #define G26_XY_FEEDRATE (PLANNER_XY_FEEDRATE() / 3.0) #endif +#ifndef G26_XY_FEEDRATE_TRAVEL + #define G26_XY_FEEDRATE_TRAVEL (PLANNER_XY_FEEDRATE() / 1.5) +#endif + #if CROSSHAIRS_SIZE >= INTERSECTION_CIRCLE_RADIUS #error "CROSSHAIRS_SIZE must be less than INTERSECTION_CIRCLE_RADIUS." #endif @@ -213,7 +217,8 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de const xy_pos_t dest = { rx, ry }; - const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. + const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. + const bool has_e_component = e_delta != 0.0; destination = current_position; @@ -224,10 +229,15 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de destination = current_position; } - // If X or Y is involved do a 'normal' move. Otherwise retract/recover/hop. + // If X or Y in combination with E is involved do a 'normal' move. + // If X or Y with no E is involved do a 'fast' move + // Otherwise retract/recover/hop. destination = dest; destination.e += e_delta; - const feedRate_t feed_value = has_xy_component ? feedRate_t(G26_XY_FEEDRATE) : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; + const feedRate_t feed_value = + has_xy_component + ? (has_e_component ? feedRate_t(G26_XY_FEEDRATE) : feedRate_t(G26_XY_FEEDRATE_TRAVEL)) + : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; prepare_internal_move_to_destination(feed_value); destination = current_position; } From 60c9a9e6546261056956a44366850ff7e1c6f3ad Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Sat, 23 Jan 2021 06:23:35 +0100 Subject: [PATCH 0924/1370] lcd_put_wchar_max for COLOR_UI (#20838) Co-Authored-By: Victor Oliveira --- Marlin/src/inc/SanityCheck.h | 16 ++++++++++++---- Marlin/src/lcd/tft/ui_320x240.cpp | 7 +++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2d4b073e15..95210d4527 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -357,10 +357,6 @@ #error "FILAMENT_CHANGE_LOAD_LENGTH is now FILAMENT_CHANGE_FAST_LOAD_LENGTH." #elif defined(LEVEL_CORNERS_INSET) #error "LEVEL_CORNERS_INSET is now LEVEL_CORNERS_INSET_LFRB." -#elif ENABLED(LEVEL_BED_CORNERS) && !defined(LEVEL_CORNERS_INSET_LFRB) - #error "LEVEL_BED_CORNERS requires LEVEL_CORNERS_INSET_LFRB values." -#elif BOTH(LEVEL_CORNERS_USE_PROBE, SENSORLESS_PROBING) - #error "LEVEL_CORNERS_USE_PROBE is incompatible with SENSORLESS_PROBING." #elif defined(BEZIER_JERK_CONTROL) #error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION." #elif HAS_JUNCTION_DEVIATION && defined(JUNCTION_DEVIATION_FACTOR) @@ -1433,6 +1429,18 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif +#if ENABLED(LEVEL_BED_CORNERS) + #ifndef LEVEL_CORNERS_INSET_LFRB + #error "LEVEL_BED_CORNERS requires LEVEL_CORNERS_INSET_LFRB values." + #elif ENABLED(LEVEL_CORNERS_USE_PROBE) + #if !HAS_BED_PROBE + #error "LEVEL_CORNERS_USE_PROBE requires a real probe." + #elif ENABLED(SENSORLESS_PROBING) + #error "LEVEL_CORNERS_USE_PROBE is incompatible with SENSORLESS_PROBING." + #endif + #endif +#endif + /** * Allow only one bed leveling option to be defined */ diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 4c09d9803e..aea0039698 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -668,6 +668,13 @@ void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { tft.set_background(COLOR_BACKGROUND); } +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + tft_string.set(); + tft_string.add(c); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + return tft_string.width(); +} + int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { tft_string.set(utf8_str_P); tft_string.trim(); From 56383d3ca04898396288002f9d33f0d9a6db53c0 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 24 Jan 2021 19:43:23 +1300 Subject: [PATCH 0925/1370] MeatPack serial encoding (#20802) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 2 + Marlin/src/feature/meatpack.cpp | 254 ++++++++++++++++++++++++++++++++ Marlin/src/feature/meatpack.h | 124 ++++++++++++++++ Marlin/src/gcode/host/M115.cpp | 3 + Marlin/src/gcode/queue.cpp | 169 +++++++++++---------- Marlin/src/inc/SanityCheck.h | 8 + buildroot/tests/FYSETC_S6-tests | 1 + platformio.ini | 4 +- 8 files changed, 487 insertions(+), 78 deletions(-) create mode 100644 Marlin/src/feature/meatpack.cpp create mode 100644 Marlin/src/feature/meatpack.h diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 714150d240..604bbb9359 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3298,6 +3298,8 @@ //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters #endif +//#define MEATPACK // Support for MeatPack G-code compression (https://github.com/scottmudge/OctoPrint-MeatPack) + //#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase //#define REPETIER_GCODE_M360 // Add commands originally from Repetier FW diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp new file mode 100644 index 0000000000..ea14b44c46 --- /dev/null +++ b/Marlin/src/feature/meatpack.cpp @@ -0,0 +1,254 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MeatPack G-code Compression + * + * Algorithm & Implementation: Scott Mudge - mail@scottmudge.com + * Date: Dec. 2020 + * + * Character Frequencies from ~30 MB of comment-stripped gcode: + * '1' -> 4451136 '4' -> 1353273 '\n' -> 1087683 '-' -> 90242 + * '0' -> 4253577 '9' -> 1352147 'G' -> 1075806 'Z' -> 34109 + * ' ' -> 3053297 '3' -> 1262929 'X' -> 975742 'M' -> 11879 + * '.' -> 3035310 '5' -> 1189871 'E' -> 965275 'S' -> 9910 + * '2' -> 1523296 '6' -> 1127900 'Y' -> 965274 + * '8' -> 1366812 '7' -> 1112908 'F' -> 99416 + * + * When space is omitted the letter 'E' is used in its place + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(MEATPACK) + +#include "meatpack.h" +MeatPack meatpack; + +#define MeatPack_ProtocolVersion "PV01" +//#define MEATPACK_LOOKUP_TABLE +//#define MP_DEBUG + +#define DEBUG_OUT ENABLED(MP_DEBUG) +#include "../core/debug_out.h" + +bool MeatPack::cmd_is_next = false; // A command is pending +uint8_t MeatPack::state = 0; // Configuration state OFF +uint8_t MeatPack::second_char = 0; // The unpacked 2nd character from an out-of-sequence packed pair +uint8_t MeatPack::cmd_count = 0, // Counts how many command bytes are received (need 2) + MeatPack::full_char_count = 0, // Counts how many full-width characters are to be received + MeatPack::char_out_count = 0; // Stores number of characters to be read out. +uint8_t MeatPack::char_out_buf[2]; // Output buffer for caching up to 2 characters + +#if ENABLED(MEATPACK_LOOKUP_TABLE) + // The 15 most-common characters used in G-code, ~90-95% of all G-code uses these characters + // Stored in SRAM for performance. + static const uint8_t meatPackLookupTable[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '.', ' ', '\n', 'G', 'X', + '\0' // Unused. 0b1111 indicates a literal character + }; +#endif + +uint8_t MeatPack::unpacked_char(register const uint8_t in) { + #if ENABLED(MEATPACK_LOOKUP_TABLE) + + return meatPackLookupTable[in]; + + #else + + switch (in) { + case 0b0000 ... 0b1001: return '0' + in; + case 0b1010: return '.'; + case 0b1011: return (state & MPConfig_Bit_NoSpaces) ? kSpaceCharReplace : ' '; + case 0b1100: return '\n'; + case 0b1101: return 'G'; + case 0b1110: return 'X'; + } + return 0; + + #endif +} + +TERN_(MP_DEBUG, uint8_t chars_decoded = 0); // Log the first 64 bytes after each reset + +void MeatPack::reset_state() { + state = 0; + cmd_is_next = false; + second_char = 0; + cmd_count = full_char_count = char_out_count = 0; + TERN_(MP_DEBUG, chars_decoded = 0); + report_state(); +} + +/** + * Unpack one or two characters from a packed byte into a buffer. + * Return flags indicating whether any literal bytes follow. + */ +uint8_t MeatPack::unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out) { + uint8_t out = 0; + + // If lower nybble is 1111, the higher nybble is unused, and next char is full. + if ((pk & kFirstNotPacked) == kFirstNotPacked) + out = kFirstCharIsLiteral; + else { + const uint8_t chr = pk & 0x0F; + chars_out[0] = unpacked_char(chr); // Set the first char + } + + // Check if upper nybble is 1111... if so, we don't need the second char. + if ((pk & kSecondNotPacked) == kSecondNotPacked) + out |= kSecondCharIsLiteral; + else { + const uint8_t chr = (pk >> 4) & 0x0F; + chars_out[1] = unpacked_char(chr); // Set the second char + } + + return out; +} + +/** + * Interpret a single (non-command) character + * according to the current MeatPack state. + */ +void MeatPack::handle_rx_char_inner(const uint8_t c) { + if (TEST(state, MPConfig_Bit_Active)) { // Is MeatPack active? + if (!full_char_count) { // No literal characters to fetch? + uint8_t buf[2] = { 0, 0 }; + register const uint8_t res = unpack_chars(c, buf); // Decode the byte into one or two characters. + if (res & kFirstCharIsLiteral) { // The 1st character couldn't be packed. + ++full_char_count; // So the next stream byte is a full character. + if (res & kSecondCharIsLiteral) ++full_char_count; // The 2nd character couldn't be packed. Another stream byte is a full character. + else second_char = buf[1]; // Retain the unpacked second character. + } + else { + handle_output_char(buf[0]); // Send the unpacked first character out. + if (buf[0] != '\n') { // After a newline the next char won't be set + if (res & kSecondCharIsLiteral) ++full_char_count; // The 2nd character couldn't be packed. The next stream byte is a full character. + else handle_output_char(buf[1]); // Send the unpacked second character out. + } + } + } + else { + handle_output_char(c); // Pass through the character that couldn't be packed... + if (second_char) { + handle_output_char(second_char); // ...and send an unpacked 2nd character, if set. + second_char = 0; + } + --full_char_count; // One literal character was consumed + } + } + else // Packing not enabled, just copy character to output + handle_output_char(c); +} + +/** + * Buffer a single output character which will be picked up in + * GCodeQueue::get_serial_commands via calls to get_result_char + */ +void MeatPack::handle_output_char(const uint8_t c) { + char_out_buf[char_out_count++] = c; + + #if ENABLED(MP_DEBUG) + if (chars_decoded < 1024) { + ++chars_decoded; + DEBUG_ECHOPGM("RB: "); + MYSERIAL.print((char)c); + DEBUG_EOL(); + } + #endif +} + +/** + * Process a MeatPack command byte to update the state. + * Report the new state to serial. + */ +void MeatPack::handle_command(const MeatPack_Command c) { + switch (c) { + case MPCommand_EnablePacking: SBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] ENA REC"); break; + case MPCommand_DisablePacking: CBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] DIS REC"); break; + case MPCommand_TogglePacking: TBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] TGL REC"); break; + case MPCommand_ResetAll: reset_state(); DEBUG_ECHOLNPGM("[MPDBG] RESET REC"); break; + case MPCommand_EnableNoSpaces: SBI(state, MPConfig_Bit_NoSpaces); DEBUG_ECHOLNPGM("[MPDBG] ENA NSP"); + TERN_(USE_LOOKUP_TABLE, MeatPackLookupTbl[kSpaceCharIdx] = kSpaceCharReplace); + break; + case MPCommand_DisableNoSpaces: CBI(state, MPConfig_Bit_NoSpaces); DEBUG_ECHOLNPGM("[MPDBG] DIS NSP"); + TERN_(USE_LOOKUP_TABLE, MeatPackLookupTbl[kSpaceCharIdx] = ' '); + break; + default: DEBUG_ECHOLNPGM("[MPDBG] UNK CMD REC"); + case MPCommand_QueryConfig: break; + } + report_state(); +} + +void MeatPack::report_state() { + // NOTE: if any configuration vars are added below, the outgoing sync text for host plugin + // should not contain the "PV' substring, as this is used to indicate protocol version + SERIAL_ECHOPGM("[MP] "); + SERIAL_ECHOPGM(MeatPack_ProtocolVersion); + serialprint_onoff(TEST(state, MPConfig_Bit_Active)); + SERIAL_CHAR(' '); + serialprintPGM(TEST(state, MPConfig_Bit_NoSpaces) ? PSTR("NSP") : PSTR("ESP")); + SERIAL_EOL(); +} + +/** + * Interpret a single character received from serial + * according to the current meatpack state. + */ +void MeatPack::handle_rx_char(const uint8_t c) { + if (c == kCommandByte) { // A command (0xFF) byte? + if (cmd_count) { // In fact, two in a row? + cmd_is_next = true; // Then a MeatPack command follows + cmd_count = 0; + } + else + ++cmd_count; // cmd_count = 1 // One command byte received so far... + return; + } + + if (cmd_is_next) { // Were two command bytes received? + handle_command((MeatPack_Command)c); // Then the byte is a MeatPack command + cmd_is_next = false; + return; + } + + if (cmd_count) { // Only a single 0xFF was received + handle_rx_char_inner(kCommandByte); // A single 0xFF is passed on literally so it can be interpreted as kFirstNotPacked|kSecondNotPacked + cmd_count = 0; + } + + handle_rx_char_inner(c); // Other characters are passed on for MeatPack decoding +} + +uint8_t MeatPack::get_result_char(char* const __restrict out) { + uint8_t res = 0; + if (char_out_count) { + res = char_out_count; + char_out_count = 0; + for (register uint8_t i = 0; i < res; ++i) + out[i] = (char)char_out_buf[i]; + } + return res; +} + +#endif // MEATPACK diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h new file mode 100644 index 0000000000..b89f87844f --- /dev/null +++ b/Marlin/src/feature/meatpack.h @@ -0,0 +1,124 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* + * MeatPack G-code Compression + * + * Algorithm & Implementation: Scott Mudge - mail@scottmudge.com + * Date: Dec. 2020 + * + * Specifically optimized for 3D printing G-Code, this is a zero-cost data compression method + * which packs ~180-190% more data into the same amount of bytes going to the CNC controller. + * As a majority of G-Code can be represented by a restricted alphabet, I performed histogram + * analysis on a wide variety of 3D printing gcode samples, and found ~93% of all gcode could + * be represented by the same 15-character alphabet. + * + * This allowed me to design a system of packing 2 8-bit characters into a single byte, assuming + * they fall within this limited 15-character alphabet. Using a 4-bit lookup table, these 8-bit + * characters can be represented by a 4-bit index. + * + * Combined with some logic to allow commingling of full-width characters outside of this 15- + * character alphabet (at the cost of an extra 8-bits per full-width character), and by stripping + * out unnecessary comments, the end result is gcode which is roughly half the original size. + * + * Why did I do this? I noticed micro-stuttering and other data-bottleneck issues while printing + * objects with high curvature, especially at high speeds. There is also the issue of the limited + * baud rate provided by Prusa's Atmega2560-based boards, over the USB serial connection. So soft- + * ware like OctoPrint would also suffer this same micro-stuttering and poor print quality issue. + * + */ +#pragma once + +#include + +/** + * Commands sent to MeatPack to control its behavior. + * They are sent by first sending 2x MeatPack_CommandByte (0xFF) in sequence, + * followed by one of the command bytes below. + * Provided that 0xFF is an exceedingly rare character that is virtually never + * present in G-code naturally, it is safe to assume 2 in sequence should never + * happen naturally, and so it is used as a signal here. + * + * 0xFF *IS* used in "packed" G-code (used to denote that the next 2 characters are + * full-width), however 2 in a row will never occur, as the next 2 bytes will always + * some non-0xFF character. + */ +enum MeatPack_Command : uint8_t { + MPCommand_None = 0, + MPCommand_TogglePacking = 0xFD, + MPCommand_EnablePacking = 0xFB, + MPCommand_DisablePacking = 0xFA, + MPCommand_ResetAll = 0xF9, + MPCommand_QueryConfig = 0xF8, + MPCommand_EnableNoSpaces = 0xF7, + MPCommand_DisableNoSpaces = 0xF6 +}; + +enum MeatPack_ConfigStateBits : uint8_t { + MPConfig_Bit_Active = 0, + MPConfig_Bit_NoSpaces = 1 +}; + +class MeatPack { +private: + friend class GCodeQueue; + + // Utility definitions + static const uint8_t kCommandByte = 0b11111111, + kFirstNotPacked = 0b00001111, + kSecondNotPacked = 0b11110000, + kFirstCharIsLiteral = 0b00000001, + kSecondCharIsLiteral = 0b00000010; + + static const uint8_t kSpaceCharIdx = 11; + static const char kSpaceCharReplace = 'E'; + + static bool cmd_is_next; // A command is pending + static uint8_t state; // Configuration state + static uint8_t second_char; // Buffers a character if dealing with out-of-sequence pairs + static uint8_t cmd_count, // Counter of command bytes received (need 2) + full_char_count, // Counter for full-width characters to be received + char_out_count; // Stores number of characters to be read out. + static uint8_t char_out_buf[2]; // Output buffer for caching up to 2 characters + + // Pass in a character rx'd by SD card or serial. Automatically parses command/ctrl sequences, + // and will control state internally. + static void handle_rx_char(const uint8_t c); + + /** + * After passing in rx'd char using above method, call this to get characters out. + * Can return from 0 to 2 characters at once. + * @param out [in] Output pointer for unpacked/processed data. + * @return Number of characters returned. Range from 0 to 2. + */ + static uint8_t get_result_char(char* const __restrict out); + + static void reset_state(); + static void report_state(); + static uint8_t unpacked_char(register const uint8_t in); + static uint8_t unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out); + static void handle_command(const MeatPack_Command c); + static void handle_output_char(const uint8_t c); + static void handle_rx_char_inner(const uint8_t c); +}; + +extern MeatPack meatpack; diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 63511b606d..1b088e7d34 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -141,6 +141,9 @@ void GcodeSuite::M115() { // CHAMBER_TEMPERATURE (M141, M191) cap_line(PSTR("CHAMBER_TEMPERATURE"), ENABLED(HAS_HEATED_CHAMBER)); + // MEATPACK Compresson + cap_line(PSTR("MEATPACK"), ENABLED(MEATPACK)); + // Machine Geometry #if ENABLED(M115_GEOMETRY_REPORT) const xyz_pos_t dmin = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 9e626bd235..51fec7d41c 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -48,6 +48,10 @@ GCodeQueue queue; #include "../feature/binary_stream.h" #endif +#if ENABLED(MEATPACK) + #include "../feature/meatpack.h" +#endif + #if ENABLED(POWER_LOSS_RECOVERY) #include "../feature/powerloss.h" #endif @@ -474,98 +478,109 @@ void GCodeQueue::get_serial_commands() { const int c = read_serial(i); if (c < 0) continue; - const char serial_char = c; + #if ENABLED(MEATPACK) + meatpack.handle_rx_char(uint8_t(c)); + char c_res[2] = { 0, 0 }; + const uint8_t char_count = meatpack.get_result_char(c_res); + #else + constexpr uint8_t char_count = 1; + #endif - if (ISEOL(serial_char)) { + LOOP_L_N(char_index, char_count) { + const char serial_char = TERN(MEATPACK, c_res[char_index], c); - // Reset our state, continue if the line was empty - if (process_line_done(serial_input_state[i], serial_line_buffer[i], serial_count[i])) - continue; + if (ISEOL(serial_char)) { - char* command = serial_line_buffer[i]; + // Reset our state, continue if the line was empty + if (process_line_done(serial_input_state[i], serial_line_buffer[i], serial_count[i])) + continue; - while (*command == ' ') command++; // Skip leading spaces - char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line + char* command = serial_line_buffer[i]; - if (npos) { + while (*command == ' ') command++; // Skip leading spaces + char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line - const bool M110 = !!strstr_P(command, PSTR("M110")); + if (npos) { - if (M110) { - char* n2pos = strchr(command + 4, 'N'); - if (n2pos) npos = n2pos; + const bool M110 = !!strstr_P(command, PSTR("M110")); + + if (M110) { + char* n2pos = strchr(command + 4, 'N'); + if (n2pos) npos = n2pos; + } + + const long gcode_N = strtol(npos + 1, nullptr, 10); + + if (gcode_N != last_N[i] + 1 && !M110) + return gcode_line_error(PSTR(STR_ERR_LINE_NO), i); + + char *apos = strrchr(command, '*'); + if (apos) { + uint8_t checksum = 0, count = uint8_t(apos - command); + while (count) checksum ^= command[--count]; + if (strtol(apos + 1, nullptr, 10) != checksum) + return gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), i); + } + else + return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); + + last_N[i] = gcode_N; } + #if ENABLED(SDSUPPORT) + // Pronterface "M29" and "M29 " has no line number + else if (card.flag.saving && !is_M29(command)) + return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); + #endif - const long gcode_N = strtol(npos + 1, nullptr, 10); + // + // Movement commands give an alert when the machine is stopped + // - if (gcode_N != last_N[i] + 1 && !M110) - return gcode_line_error(PSTR(STR_ERR_LINE_NO), i); - - char *apos = strrchr(command, '*'); - if (apos) { - uint8_t checksum = 0, count = uint8_t(apos - command); - while (count) checksum ^= command[--count]; - if (strtol(apos + 1, nullptr, 10) != checksum) - return gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), i); - } - else - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); - - last_N[i] = gcode_N; - } - #if ENABLED(SDSUPPORT) - // Pronterface "M29" and "M29 " has no line number - else if (card.flag.saving && !is_M29(command)) - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); - #endif - - // - // Movement commands give an alert when the machine is stopped - // - - if (IsStopped()) { - char* gpos = strchr(command, 'G'); - if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { - case 0: case 1: - #if ENABLED(ARC_SUPPORT) - case 2: case 3: - #endif - #if ENABLED(BEZIER_CURVE_SUPPORT) - case 5: - #endif - PORT_REDIRECT(i); // Reply to the serial port that sent the command - SERIAL_ECHOLNPGM(STR_ERR_STOPPED); - LCD_MESSAGEPGM(MSG_STOPPED); - break; + if (IsStopped()) { + char* gpos = strchr(command, 'G'); + if (gpos) { + switch (strtol(gpos + 1, nullptr, 10)) { + case 0: case 1: + #if ENABLED(ARC_SUPPORT) + case 2: case 3: + #endif + #if ENABLED(BEZIER_CURVE_SUPPORT) + case 5: + #endif + PORT_REDIRECT(i); // Reply to the serial port that sent the command + SERIAL_ECHOLNPGM(STR_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + break; + } } } - } - #if DISABLED(EMERGENCY_PARSER) - // Process critical commands early - if (command[0] == 'M') switch (command[3]) { - case '8': if (command[2] == '0' && command[1] == '1') { wait_for_heatup = false; TERN_(HAS_LCD_MENU, wait_for_user = false); } break; - case '2': if (command[2] == '1' && command[1] == '1') kill(M112_KILL_STR, nullptr, true); break; - case '0': if (command[1] == '4' && command[2] == '1') quickstop_stepper(); break; - } - #endif - - #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 - last_command_time = ms; - #endif - - // Add the command to the queue - _enqueue(serial_line_buffer[i], true - #if HAS_MULTI_SERIAL - , i + #if DISABLED(EMERGENCY_PARSER) + // Process critical commands early + if (command[0] == 'M') switch (command[3]) { + case '8': if (command[2] == '0' && command[1] == '1') { wait_for_heatup = false; TERN_(HAS_LCD_MENU, wait_for_user = false); } break; + case '2': if (command[2] == '1' && command[1] == '1') kill(M112_KILL_STR, nullptr, true); break; + case '0': if (command[1] == '4' && command[2] == '1') quickstop_stepper(); break; + } #endif - ); - } - else - process_stream_char(serial_char, serial_input_state[i], serial_line_buffer[i], serial_count[i]); - } // for NUM_SERIAL + #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 + last_command_time = ms; + #endif + + // Add the command to the queue + _enqueue(serial_line_buffer[i], true + #if HAS_MULTI_SERIAL + , i + #endif + ); + } + else + process_stream_char(serial_char, serial_input_state[i], serial_line_buffer[i], serial_count[i]); + + } // char_count loop + + } // NUM_SERIAL loop } // queue has space, serial has data } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 95210d4527..1f7b317917 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3303,6 +3303,14 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif + +/** + * Sanity Check for MEATPACK and BINARY_FILE_TRANSFER Features + */ +#if BOTH(MEATPACK, BINARY_FILE_TRANSFER) + #error "Either enable MEATPACK or enable BINARY_FILE_TRANSFER." +#endif + /** * Sanity check for valid stepper driver types */ diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6-tests index 18951ebb79..c7f7a16bbd 100755 --- a/buildroot/tests/FYSETC_S6-tests +++ b/buildroot/tests/FYSETC_S6-tests @@ -9,6 +9,7 @@ set -e # Build examples restore_configs use_example_configs FYSETC/S6 +opt_enable MEATPACK opt_set Y_DRIVER_TYPE TMC2209 opt_set Z_DRIVER_TYPE TMC2130 exec_test $1 $2 "FYSETC S6 Example" "$3" diff --git a/platformio.ini b/platformio.ini index 822f1df8d1..11248d7650 100644 --- a/platformio.ini +++ b/platformio.ini @@ -97,6 +97,7 @@ default_src_filter = + - - + - - - + - - - - - @@ -319,6 +320,7 @@ PCA9632 = src_filter=+ PRINTER_EVENT_LEDS = src_filter=+ TEMP_STAT_LEDS = src_filter=+ MAX7219_DEBUG = src_filter=+ + +MEATPACK = src_filter=+ MIXING_EXTRUDER = src_filter=+ + HAS_PRUSA_MMU1 = src_filter=+ HAS_PRUSA_MMU2 = src_filter=+ + @@ -706,7 +708,7 @@ extra_scripts = ${common.extra_scripts} src_filter = ${common.default_src_filter} + + lib_deps = ${common.lib_deps} Servo -custom_marlin.USES_LIQUIDCRYSTAL = LiquidCrystal@1.0.0 +custom_marlin.USES_LIQUIDCRYSTAL = LiquidCrystal~1.0.7 custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace From 17a4ef6730c9ba4af8dcefaff90575c1cd6519b0 Mon Sep 17 00:00:00 2001 From: Roxy-3D Date: Sun, 24 Jan 2021 07:47:22 -0700 Subject: [PATCH 0926/1370] Revert "Adding custom move feedrate for G26 (#20729)" (#20870) This reverts commit 14567f3459d23f6cad0ab055a839b8f2652de979. --- Marlin/Configuration.h | 1 - Marlin/src/gcode/bedlevel/G26.cpp | 16 +++------------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0b5883d88b..d86c448441 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1361,7 +1361,6 @@ #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. - #define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for XY Moves without extrusion for the G26 Mesh Validation Tool #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. #endif diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index c583b505cb..650b039b55 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -128,10 +128,6 @@ #define G26_XY_FEEDRATE (PLANNER_XY_FEEDRATE() / 3.0) #endif -#ifndef G26_XY_FEEDRATE_TRAVEL - #define G26_XY_FEEDRATE_TRAVEL (PLANNER_XY_FEEDRATE() / 1.5) -#endif - #if CROSSHAIRS_SIZE >= INTERSECTION_CIRCLE_RADIUS #error "CROSSHAIRS_SIZE must be less than INTERSECTION_CIRCLE_RADIUS." #endif @@ -217,8 +213,7 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de const xy_pos_t dest = { rx, ry }; - const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. - const bool has_e_component = e_delta != 0.0; + const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. destination = current_position; @@ -229,15 +224,10 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de destination = current_position; } - // If X or Y in combination with E is involved do a 'normal' move. - // If X or Y with no E is involved do a 'fast' move - // Otherwise retract/recover/hop. + // If X or Y is involved do a 'normal' move. Otherwise retract/recover/hop. destination = dest; destination.e += e_delta; - const feedRate_t feed_value = - has_xy_component - ? (has_e_component ? feedRate_t(G26_XY_FEEDRATE) : feedRate_t(G26_XY_FEEDRATE_TRAVEL)) - : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; + const feedRate_t feed_value = has_xy_component ? feedRate_t(G26_XY_FEEDRATE) : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; prepare_internal_move_to_destination(feed_value); destination = current_position; } From bed027f41f0b2d1cc6ff0d01a1b811b6007b9400 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 24 Jan 2021 13:24:16 -0800 Subject: [PATCH 0927/1370] Fix LiquidCrystal CI failures (#20873) Fix incorrect dependency syntax for LPC. Disambiguate LiquidCrystal library names. --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 11248d7650..65d0b9ad8c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -236,7 +236,7 @@ HAS_L64XX = Arduino-L6470@0.8.0 NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ MAX6675_._IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 -USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 +USES_LIQUIDCRYSTAL = bitbucket-fmalpartida/LiquidCrystal@1.5.0 USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 HAS_WIRED_LCD = src_filter=+ @@ -708,7 +708,7 @@ extra_scripts = ${common.extra_scripts} src_filter = ${common.default_src_filter} + + lib_deps = ${common.lib_deps} Servo -custom_marlin.USES_LIQUIDCRYSTAL = LiquidCrystal~1.0.7 +custom_marlin.USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@~1.0.7 custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace From 786bba39ff58519e42e655b3360da480a710f945 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 24 Jan 2021 20:13:02 -0600 Subject: [PATCH 0928/1370] Fix Ender 3 V2 DWIN manual move (#20837) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 63 +++++++++++++++---------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index b872ce32aa..e0caa0722f 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -132,8 +132,9 @@ #define FEEDRATE_E (60) -// Mininum unit (0.1) : multiple (10) -#define MINUNITMULT 10 +// Minimum unit (0.1) : multiple (10) +#define UNITFDIGITS 1 +#define MINUNITMULT pow(10, UNITFDIGITS) #define ENCODER_WAIT 20 #define DWIN_SCROLL_UPDATE_INTERVAL 2000 @@ -1171,8 +1172,8 @@ void HMI_Move_X() { } NOLESS(HMI_ValueStruct.Move_X_scale, (X_MIN_POS) * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_X_scale, (X_MAX_POS) * MINUNITMULT); - current_position.x = HMI_ValueStruct.Move_X_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + current_position.x = HMI_ValueStruct.Move_X_scale / MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); DWIN_UpdateLCD(); } } @@ -1194,8 +1195,8 @@ void HMI_Move_Y() { } NOLESS(HMI_ValueStruct.Move_Y_scale, (Y_MIN_POS) * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_Y_scale, (Y_MAX_POS) * MINUNITMULT); - current_position.y = HMI_ValueStruct.Move_Y_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + current_position.y = HMI_ValueStruct.Move_Y_scale / MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); DWIN_UpdateLCD(); } } @@ -1206,7 +1207,7 @@ void HMI_Move_Z() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scale)) { checkkey = AxisMove; EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -1217,8 +1218,8 @@ void HMI_Move_Z() { } NOLESS(HMI_ValueStruct.Move_Z_scale, Z_MIN_POS * MINUNITMULT); NOMORE(HMI_ValueStruct.Move_Z_scale, Z_MAX_POS * MINUNITMULT); - current_position.z = HMI_ValueStruct.Move_Z_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + current_position.z = HMI_ValueStruct.Move_Z_scale / MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); DWIN_UpdateLCD(); } } @@ -1233,7 +1234,7 @@ void HMI_Move_Z() { checkkey = AxisMove; EncoderRate.enabled = false; last_E_scale = HMI_ValueStruct.Move_E_scale; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); if (!planner.is_full()) { planner.synchronize(); // Wait for planner moves to finish! planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); @@ -1245,8 +1246,8 @@ void HMI_Move_Z() { HMI_ValueStruct.Move_E_scale = last_E_scale + (EXTRUDE_MAXLENGTH) * MINUNITMULT; else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; - current_position.e = HMI_ValueStruct.Move_E_scale / 10; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + current_position.e = HMI_ValueStruct.Move_E_scale / MINUNITMULT; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); DWIN_UpdateLCD(); } } @@ -1503,7 +1504,7 @@ void HMI_MaxAccelerationXYZE() { NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXJERK) * MINUNITMULT); // MaxJerk value - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); } } @@ -1525,7 +1526,7 @@ void HMI_StepXYZE() { NOMORE(HMI_ValueStruct.Max_Step, 999.9 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); // Step value - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); } } @@ -2317,13 +2318,12 @@ void HMI_Prepare() { select_axis.reset(); Draw_Move_Menu(); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), current_position.x * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(1), current_position.x * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(2), current_position.y * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(3), current_position.z * MINUNITMULT); #if HAS_HOTEND - current_position.e = HMI_ValueStruct.Move_E_scale = 0.0; - sync_plan_position_e(); - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0.0); + HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); #endif break; case PREPARE_CASE_DISA: // Disable steppers @@ -2573,8 +2573,7 @@ void HMI_AxisMove() { if (HMI_flag.ETempTooLow_flag) { if (encoder_diffState == ENCODER_DIFF_ENTER) { HMI_flag.ETempTooLow_flag = false; - current_position.e = HMI_ValueStruct.Move_E_scale = 0; - sync_plan_position_e(); + HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; Draw_Move_Menu(); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); @@ -3020,11 +3019,11 @@ inline void Draw_Max_Accel_Menu() { Draw_Back_First(); LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); #if HAS_HOTEND - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); #endif } #endif @@ -3068,11 +3067,11 @@ inline void Draw_Steps_Menu() { Draw_Back_First(); LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_StepX + i); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); #if HAS_HOTEND - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); #endif } @@ -3419,7 +3418,7 @@ void HMI_MaxAcceleration() { checkkey = MaxJerk_value; HMI_flag.jerk_axis = AxisEnum(select_jerk.now - 1); HMI_ValueStruct.Max_Jerk = planner.max_jerk[HMI_flag.jerk_axis] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); EncoderRate.enabled = true; } else { // Back @@ -3449,7 +3448,7 @@ void HMI_Step() { checkkey = Step_value; HMI_flag.step_axis = AxisEnum(select_step.now - 1); HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[HMI_flag.step_axis] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); EncoderRate.enabled = true; } else { // Back From 24a801b660acd6d0ce4b02a326dbb9a3f92a48c2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 24 Jan 2021 21:20:51 -0600 Subject: [PATCH 0929/1370] =?UTF-8?q?=F0=9F=9B=A0Fix=20deps=20script=20ver?= =?UTF-8?q?sion=20regex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/PlatformIO/scripts/common-dependencies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 4b8c339d46..4500f529a6 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -83,7 +83,7 @@ def add_to_feat_cnf(feature, flines): feat[name] = '='.join(parts) else: for dep in line.split(','): - lib_name = re.sub(r'([@~^=]|[<>]=?)[\d.]+', '', dep.strip()).split('=').pop(0) + lib_name = re.sub(r'@([~^]|[<>]=?)?[\d.]+', '', dep.strip()).split('=').pop(0) lib_re = re.compile('(?!^' + lib_name + '\\b)') feat['lib_deps'] = list(filter(lib_re.match, feat['lib_deps'])) + [dep] From 4ce87eeb9198608b398c6cac021f52bcfac80e8a Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Mon, 25 Jan 2021 08:11:34 +0100 Subject: [PATCH 0930/1370] =?UTF-8?q?=F0=9F=A7=BB=20Cosmetic=20changes=20(?= =?UTF-8?q?#20859)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 4 ++-- Marlin/Configuration_adv.h | 32 ++++++++++++++++---------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d86c448441..fd5b6dc848 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -421,7 +421,7 @@ #define TEMP_SENSOR_CHAMBER 0 // Dummy thermistor constant temperature readings, for use with 998 and 999 -#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_998_VALUE 25 #define DUMMY_THERMISTOR_999_VALUE 100 // Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1 @@ -1360,7 +1360,7 @@ #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. - #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. + #define G26_XY_FEEDRATE 100 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. #endif diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 604bbb9359..bcd1d62422 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -163,7 +163,7 @@ #if ENABLED(CHAMBER_VENT) #define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo #define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber - #define LOW_EXCESS_HEAT_LIMIT 3 + #define LOW_EXCESS_HEAT_LIMIT 3 #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 #endif @@ -206,7 +206,7 @@ * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set * below 2. */ - #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_PERIOD 20 // Seconds #define WATCH_TEMP_INCREASE 2 // Degrees Celsius #endif @@ -284,8 +284,8 @@ // DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly. #define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf - #define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf - #define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING + #define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf + #define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING #define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED) #define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0 @@ -2056,21 +2056,21 @@ */ //#define FWRETRACT #if ENABLED(FWRETRACT) - #define FWRETRACT_AUTORETRACT // Override slicer retractions + #define FWRETRACT_AUTORETRACT // Override slicer retractions #if ENABLED(FWRETRACT_AUTORETRACT) - #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length - #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length + #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length + #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length #endif - #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) - #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) - #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting - #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise - #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) - #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) - #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction - #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction + #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) + #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) + #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting + #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise + #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) + #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction #if ENABLED(MIXING_EXTRUDER) - //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously + //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously #endif #endif From 69da8719cf8be61a628f66a9d5b941ae7cf4b14b Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Mon, 25 Jan 2021 08:44:39 +0100 Subject: [PATCH 0931/1370] Graphical TFT fixes, cleanup (#20861) Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_LCD.h | 43 ++-- Marlin/src/inc/SanityCheck.h | 2 - Marlin/src/lcd/menu/menu_bed_corners.cpp | 8 +- Marlin/src/lcd/menu/menu_tune.cpp | 13 +- Marlin/src/lcd/tft/tft_image.cpp | 41 +++- Marlin/src/lcd/tft/tft_image.h | 3 +- Marlin/src/lcd/tft/tft_string.cpp | 7 +- Marlin/src/lcd/tft/tft_string.h | 7 +- Marlin/src/lcd/tft/ui_320x240.cpp | 251 +++---------------- Marlin/src/lcd/tft/ui_320x240.h | 92 +------ Marlin/src/lcd/tft/ui_480x320.cpp | 291 ++++------------------- Marlin/src/lcd/tft/ui_480x320.h | 104 ++------ Marlin/src/lcd/tft/ui_common.cpp | 246 +++++++++++++++++++ Marlin/src/lcd/tft/ui_common.h | 76 ++++++ 14 files changed, 526 insertions(+), 658 deletions(-) create mode 100644 Marlin/src/lcd/tft/ui_common.cpp create mode 100644 Marlin/src/lcd/tft/ui_common.h diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index a5bb24f27c..2acda7bd59 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1155,36 +1155,37 @@ #endif #endif -#if ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 240 - #if ENABLED(TFT_INTERFACE_SPI) - #define TFT_320x240_SPI - #elif ENABLED(TFT_INTERFACE_FSMC) - #define TFT_320x240 - #endif -#elif ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 320 - #if ENABLED(TFT_INTERFACE_SPI) - #define TFT_480x320_SPI - #elif ENABLED(TFT_INTERFACE_FSMC) - #define TFT_480x320 - #endif -#elif ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 272 - #if ENABLED(TFT_INTERFACE_SPI) - #define TFT_480x272_SPI - #elif ENABLED(TFT_INTERFACE_FSMC) - #define TFT_480x272 +#if ENABLED(TFT_COLOR_UI) + #if TFT_HEIGHT == 240 + #if ENABLED(TFT_INTERFACE_SPI) + #define TFT_320x240_SPI + #elif ENABLED(TFT_INTERFACE_FSMC) + #define TFT_320x240 + #endif + #elif TFT_HEIGHT == 320 + #if ENABLED(TFT_INTERFACE_SPI) + #define TFT_480x320_SPI + #elif ENABLED(TFT_INTERFACE_FSMC) + #define TFT_480x320 + #endif + #elif TFT_HEIGHT == 272 + #if ENABLED(TFT_INTERFACE_SPI) + #define TFT_480x272_SPI + #elif ENABLED(TFT_INTERFACE_FSMC) + #define TFT_480x272 + #endif #endif #endif -// Fewer lines with touch buttons on-screen #if EITHER(TFT_320x240, TFT_320x240_SPI) #define HAS_UI_320x240 1 - #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) #elif EITHER(TFT_480x320, TFT_480x320_SPI) #define HAS_UI_480x320 1 - #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) #elif EITHER(TFT_480x272, TFT_480x272_SPI) #define HAS_UI_480x272 1 - #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) +#endif +#if ANY(HAS_UI_320x240, HAS_UI_480x320, HAS_UI_480x272) + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) // Fewer lines with touch buttons onscreen #endif // This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1f7b317917..b3beedfe80 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -802,8 +802,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(BABYSTEP_XY) static_assert(BABYSTEP_MULTIPLICATOR_XY <= 0.25f, "BABYSTEP_MULTIPLICATOR_XY must be less than or equal to 0.25mm."); #endif - #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) && ANY(TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI) - #error "New Color UI (TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI) does not support BABYSTEP_DISPLAY_TOTAL yet." #endif #endif diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 473b09d328..751be18600 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -174,12 +174,13 @@ static inline void _lcd_level_bed_corners_get_next_position() { MenuItem_static::draw(0, GET_TEXT(MSG_PROBING_MESH), SS_INVERT); // "Probing Mesh" heading - uint8_t cy = LCD_HEIGHT - 1, y = LCD_ROW_Y(cy); + uint8_t cy = TERN(TFT_COLOR_UI, 3, LCD_HEIGHT - 1), y = LCD_ROW_Y(cy); // Display # of good points found vs total needed if (PAGE_CONTAINS(y - (MENU_FONT_HEIGHT), y)) { - SETCURSOR(0, cy); + SETCURSOR(TERN(TFT_COLOR_UI, 2, 0), cy); lcd_put_u8str_P(GET_TEXT(MSG_LEVEL_CORNERS_GOOD_POINTS)); + IF_ENABLED(TFT_COLOR_UI, lcd_moveto(12, cy)); lcd_put_u8str(GOOD_POINTS_TO_STR(good_points)); lcd_put_wchar('/'); lcd_put_u8str(GOOD_POINTS_TO_STR(nr_edge_points)); @@ -190,8 +191,9 @@ static inline void _lcd_level_bed_corners_get_next_position() { // Display the Last Z value if (PAGE_CONTAINS(y - (MENU_FONT_HEIGHT), y)) { - SETCURSOR(0, cy); + SETCURSOR(TERN(TFT_COLOR_UI, 2, 0), cy); lcd_put_u8str_P(GET_TEXT(MSG_LEVEL_CORNERS_LAST_Z)); + IF_ENABLED(TFT_COLOR_UI, lcd_moveto(12, 2)); lcd_put_u8str(LAST_Z_TO_STR(last_z)); } } diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index cccb352d8f..0fbb57f2ac 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -71,9 +71,16 @@ const bool in_view = TERN1(HAS_MARLINUI_U8GLIB, PAGE_CONTAINS(LCD_PIXEL_HEIGHT - MENU_FONT_HEIGHT, LCD_PIXEL_HEIGHT - 1)); if (in_view) { TERN_(HAS_MARLINUI_U8GLIB, ui.set_font(FONT_MENU)); - lcd_moveto(0, TERN(HAS_MARLINUI_U8GLIB, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1)); - lcd_put_u8str_P(GET_TEXT(MSG_BABYSTEP_TOTAL)); - lcd_put_wchar(':'); + #if ENABLED(TFT_COLOR_UI) + lcd_moveto(4, 3); + lcd_put_u8str_P(GET_TEXT(MSG_BABYSTEP_TOTAL)); + lcd_put_wchar(':'); + lcd_moveto(10, 3); + #else + lcd_moveto(0, TERN(HAS_MARLINUI_U8GLIB, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1)); + lcd_put_u8str_P(GET_TEXT(MSG_BABYSTEP_TOTAL)); + lcd_put_wchar(':'); + #endif lcd_put_u8str(BABYSTEP_TO_STR(spm * babystep.axis_total[BS_TOTAL_IND(axis)])); } #endif diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index 9cc6fb15e4..851410b2e0 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -20,8 +20,11 @@ * */ +#include "../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + #include "tft_image.h" -#include const tImage NoLogo = { nullptr, 0, 0, NOCOLORS }; @@ -70,4 +73,38 @@ const tImage Leveling_32x32x4 = { (void *)leveling_32x32x4, 32, 32, GREYSC const tImage Slider8x16x4 = { (void *)slider_8x16x4, 8, 16, GREYSCALE4 }; -extern const tImage Images[imgCount]; +const tImage Images[imgCount] = { + TERN(SHOW_BOOTSCREEN, TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MARLIN_LOGO_FULL_SIZE), NoLogo), + HotEnd_64x64x4, + Bed_64x64x4, + Bed_Heated_64x64x4, + Chamber_64x64x4, + Chamber_Heated_64x64x4, + Fan0_64x64x4, + Fan_Slow0_64x64x4, + Fan_Slow1_64x64x4, + Fan_Fast0_64x64x4, + Fan_Fast1_64x64x4, + Feedrate_32x32x4, + Flowrate_32x32x4, + SD_64x64x4, + Menu_64x64x4, + Settings_64x64x4, + Directory_32x32x4, + Confirm_64x64x4, + Cancel_64x64x4, + Increase_64x64x4, + Decrease_64x64x4, + Back_32x32x4, + Up_32x32x4, + Down_32x32x4, + Left_32x32x4, + Right_32x32x4, + Refresh_32x32x4, + Leveling_32x32x4, + Slider8x16x4, + Home_64x64x4, + BtnRounded_64x52x4, +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h index 21bd2d665f..960a4e4356 100644 --- a/Marlin/src/lcd/tft/tft_image.h +++ b/Marlin/src/lcd/tft/tft_image.h @@ -21,9 +21,10 @@ */ #pragma once -#include "stdint.h" #include "../../inc/MarlinConfigPre.h" +#include + extern const uint8_t marlin_logo_112x38x1[]; extern const uint8_t marlin_logo_228x255x2[]; extern const uint8_t marlin_logo_228x255x4[]; diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index eb805ac423..31ac14cf92 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -36,7 +36,7 @@ font_t *TFT_String::font_header; uint8_t TFT_String::data[]; uint16_t TFT_String::span; -uint16_t TFT_String::length; +uint8_t TFT_String::length; void TFT_String::set_font(const uint8_t *font) { font_header = (font_t *)font; @@ -122,13 +122,14 @@ void TFT_String::add(uint8_t *string, int8_t index, uint8_t *itemString) { eol(); } -void TFT_String::add(uint8_t *string) { +void TFT_String::add(uint8_t *string, uint8_t max_len) { wchar_t wchar; - while (*string) { + while (*string && max_len) { string = get_utf8_value_cb(string, read_byte, &wchar); if (wchar > 255) wchar |= 0x0080; uint8_t ch = uint8_t(wchar & 0x00FF); add_character(ch); + max_len--; } eol(); } diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h index e800b1ded9..133889d9ae 100644 --- a/Marlin/src/lcd/tft/tft_string.h +++ b/Marlin/src/lcd/tft/tft_string.h @@ -69,7 +69,7 @@ class TFT_String { static uint8_t data[MAX_STRING_LENGTH + 1]; static uint16_t span; // in pixels - static uint16_t length; // in characters + static uint8_t length; // in characters static void add_character(uint8_t character); static void eol() { data[length] = 0x00; } @@ -85,7 +85,7 @@ class TFT_String { static void set(); static void add(uint8_t character) { add_character(character); eol(); } - static void add(uint8_t *string); + static void add(uint8_t *string, uint8_t max_len=MAX_STRING_LENGTH); static void add(uint8_t *string, int8_t index, uint8_t *itemString=nullptr); static void set(uint8_t *string) { set(); add(string); }; static void set(uint8_t *string, int8_t index, const char *itemString=nullptr) { set(); add(string, index, (uint8_t *)itemString); }; @@ -96,6 +96,9 @@ class TFT_String { static void trim(uint8_t character=0x20); static void rtrim(uint8_t character=0x20); static void ltrim(uint8_t character=0x20); + + static void truncate(uint8_t maxlen) { if (length > maxlen) { length = maxlen; eol(); } } + static uint16_t width() { return span; } static uint8_t *string() { return data; } static uint16_t center(uint16_t width) { return span > width ? 0 : (width - span) / 2; } diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index aea0039698..eadd09ef27 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -24,7 +24,7 @@ #if HAS_UI_320x240 -#include "ui_320x240.h" +#include "ui_common.h" #include "../marlinui.h" #include "../menu/menu.h" @@ -45,12 +45,6 @@ #include "../../feature/bedlevel/bedlevel.h" #endif -#if !HAS_LCD_MENU - #error "Seriously? High resolution TFT screen without menu?" -#endif - -static bool draw_menu_navigation = false; - void MarlinUI::tft_idle() { #if ENABLED(TOUCH_SCREEN) if (draw_menu_navigation) { @@ -65,28 +59,6 @@ void MarlinUI::tft_idle() { TERN_(TOUCH_SCREEN, touch.idle()); } -void MarlinUI::init_lcd() { - tft.init(); - tft.set_font(MENU_FONT_NAME); - #ifdef SYMBOLS_FONT_NAME - tft.add_glyphs(SYMBOLS_FONT_NAME); - #endif - TERN_(TOUCH_SCREEN, touch.init()); - clear_lcd(); -} - -bool MarlinUI::detected() { return true; } - -void MarlinUI::clear_lcd() { - #if ENABLED(TOUCH_SCREEN) - touch.reset(); - draw_menu_navigation = false; - #endif - - tft.queue.reset(); - tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); -} - #if ENABLED(SHOW_BOOTSCREEN) void MarlinUI::show_bootscreen() { tft.queue.reset(); @@ -98,8 +70,8 @@ void MarlinUI::clear_lcd() { #define SITE_URL_Y (TFT_HEIGHT - 46) tft.set_background(COLOR_BACKGROUND); #else - #define BOOT_LOGO_W 320 // MarlinLogo320x240x16 - #define BOOT_LOGO_H 240 + #define BOOT_LOGO_W TFT_WIDTH // MarlinLogo320x240x16 + #define BOOT_LOGO_H TFT_HEIGHT #define SITE_URL_Y (TFT_HEIGHT - 52) #endif tft.add_image((TFT_WIDTH - BOOT_LOGO_W) / 2, (TFT_HEIGHT - BOOT_LOGO_H) / 2, imgBootScreen); @@ -148,22 +120,22 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { currentTemperature = thermalManager.degHotend(Heater); targetTemperature = thermalManager.degTargetHotend(Heater); } -#if HAS_HEATED_BED - else if (Heater == H_BED) { - currentTemperature = thermalManager.degBed(); - targetTemperature = thermalManager.degTargetBed(); - } -#endif // HAS_HEATED_BED -#if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - currentTemperature = thermalManager.degChamber(); - #if HAS_HEATED_CHAMBER - targetTemperature = thermalManager.degTargetChamber(); - #else - targetTemperature = ABSOLUTE_ZERO; - #endif - } -#endif // HAS_TEMP_CHAMBER + #if HAS_HEATED_BED + else if (Heater == H_BED) { + currentTemperature = thermalManager.degBed(); + targetTemperature = thermalManager.degTargetBed(); + } + #endif + #if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + currentTemperature = thermalManager.degChamber(); + #if HAS_HEATED_CHAMBER + targetTemperature = thermalManager.degTargetChamber(); + #else + targetTemperature = ABSOLUTE_ZERO; + #endif + } + #endif else return; TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 64, 100, Heater)); @@ -176,17 +148,17 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { if (currentTemperature >= 50) Color = COLOR_HOTEND; } #if HAS_HEATED_BED - else if (Heater == H_BED) { - if (currentTemperature >= 50) Color = COLOR_HEATED_BED; - image = targetTemperature > 0 ? imgBedHeated : imgBed; - } - #endif // HAS_HEATED_BED + else if (Heater == H_BED) { + if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + image = targetTemperature > 0 ? imgBedHeated : imgBed; + } + #endif #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - if (currentTemperature >= 50) Color = COLOR_CHAMBER; - image = targetTemperature > 0 ? imgChamberHeated : imgChamber; - } - #endif // HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + if (currentTemperature >= 50) Color = COLOR_CHAMBER; + image = targetTemperature > 0 ? imgChamberHeated : imgChamber; + } + #endif tft.add_image(0, 18, image, Color); @@ -200,7 +172,6 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(64) + 2, 8, Color, tft_string); - } } @@ -232,7 +203,7 @@ void MarlinUI::draw_status_screen() { TERN_(TOUCH_SCREEN, touch.clear()); // heaters and fan - uint16_t i, x, y = POS_Y; + uint16_t i, x, y = TFT_STATUS_TOP_Y; for (i = 0 ; i < ITEMS_COUNT; i++) { x = (320 / ITEMS_COUNT - 64) / 2 + (320 * i / ITEMS_COUNT); @@ -341,49 +312,6 @@ void MarlinUI::draw_status_screen() { #endif } -// Draw a static item with no left-right margin required. Centered by default. -void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { - menu_item(row); - tft_string.set(pstr, itemIndex, itemString); - if (vstr) - tft_string.add(vstr); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); -} - -// Draw a generic menu item with pre_char (if selected) and post_char -void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { - menu_item(row, sel); - - uint8_t *string = (uint8_t *)pstr; - MarlinImage image = noImage; - switch (*string) { - case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH - case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER - } - - uint8_t offset = MENU_TEXT_X_OFFSET; - if (image != noImage) { - string++; - offset = 32; - tft.add_image(0, 0, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - } - - tft_string.set(string, itemIndex, itemString); - tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); -} - -// Draw a menu item with a (potentially) editable value -void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { - menu_item(row, sel); - - tft_string.set(pstr, itemIndex, itemString); - tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - if (data) { - tft_string.set(data); - tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - } -} - // Low-level draw_edit_screen can be used to draw an edit screen from anyplace void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { ui.encoder_direction_normal(); @@ -483,16 +411,8 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #endif } -#if ENABLED(SDSUPPORT) - void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { - menu_item(row, sel); - if (isDir) - tft.add_image(0, 0, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - tft.add_text(32, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); - } -#endif - #if ENABLED(ADVANCED_PAUSE_FEATURE) + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { #if ENABLED(TOUCH_SCREEN) touch.clear(); @@ -513,6 +433,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.trim(); tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); } + #endif // ADVANCED_PAUSE_FEATURE #if ENABLED(AUTO_BED_LEVELING_UBL) @@ -562,18 +483,18 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.trim(); tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 32) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 1, 32, 32); + constexpr uint8_t w = (TFT_WIDTH) / 10; + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - w) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 1, w, 32); tft.set_background(COLOR_BACKGROUND); tft_string.set(ui8tostr3rj(x_plot)); tft_string.trim(); - tft.add_text(tft_string.center(32), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + tft.add_text(tft_string.center(w), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + (GRID_HEIGHT - 27) / 2, 32, 32); + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + (GRID_HEIGHT - 27) / 2, w, 32); tft.set_background(COLOR_BACKGROUND); tft_string.set(ui8tostr3rj(y_plot)); tft_string.trim(); - tft.add_text(tft_string.center(32), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + tft.add_text(tft_string.center(w), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); #if ENABLED(TOUCH_SCREEN) touch.clear(); @@ -588,104 +509,6 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const } #endif // AUTO_BED_LEVELING_UBL -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - void MarlinUI::touch_calibration_screen() { - uint16_t x, y; - - calibrationState calibration_stage = touch_calibration.get_calibration_state(); - - if (calibration_stage == CALIBRATION_NONE) { - defer_status_screen(true); - clear_lcd(); - calibration_stage = touch_calibration.calibration_start(); - } - else { - x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x; - y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y; - tft.canvas(x - 15, y - 15, 31, 31); - tft.set_background(COLOR_BACKGROUND); - } - - touch.clear(); - - if (calibration_stage < CALIBRATION_SUCCESS) { - switch (calibration_stage) { - case CALIBRATION_TOP_LEFT: tft_string.set(GET_TEXT(MSG_TOP_LEFT)); break; - case CALIBRATION_BOTTOM_LEFT: tft_string.set(GET_TEXT(MSG_BOTTOM_LEFT)); break; - case CALIBRATION_TOP_RIGHT: tft_string.set(GET_TEXT(MSG_TOP_RIGHT)); break; - case CALIBRATION_BOTTOM_RIGHT: tft_string.set(GET_TEXT(MSG_BOTTOM_RIGHT)); break; - default: break; - } - - x = touch_calibration.calibration_points[calibration_stage].x; - y = touch_calibration.calibration_points[calibration_stage].y; - - tft.canvas(x - 15, y - 15, 31, 31); - tft.set_background(COLOR_BACKGROUND); - tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); - tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); - - touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); - } - else { - tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED)); - defer_status_screen(false); - touch_calibration.calibration_end(); - touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); - } - - tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - } -#endif // TOUCH_SCREEN_CALIBRATION - -void menu_line(const uint8_t row, uint16_t color) { - tft.canvas(0, 2 + 34 * row, TFT_WIDTH, 32); - tft.set_background(color); -} - -void menu_pause_option(); - -void menu_item(const uint8_t row, bool sel ) { - #if ENABLED(TOUCH_SCREEN) - if (row == 0) { - touch.clear(); - draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); - } - #endif - - menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - #if ENABLED(TOUCH_SCREEN) - const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? MENU_CLICK : MENU_ITEM; - touch.add_control(tct, 0, 2 + 34 * row, TFT_WIDTH, 32, encoderTopLine + row); - #endif -} - -void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { - #define TFT_COL_WIDTH ((TFT_WIDTH) / (LCD_WIDTH)) - tft.canvas(col * TFT_COL_WIDTH, 4 + 45 * row, TFT_WIDTH - (col * TFT_COL_WIDTH), 43); - tft.set_background(COLOR_BACKGROUND); -} - -int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { - tft_string.set(); - tft_string.add(c); - tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - return tft_string.width(); -} - -int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { - tft_string.set(utf8_str_P); - tft_string.trim(); - tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - return tft_string.width(); -} - -int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { - return lcd_put_u8str_max_P(utf8_str, max_length); -} - void MarlinUI::move_axis_screen() { } diff --git a/Marlin/src/lcd/tft/ui_320x240.h b/Marlin/src/lcd/tft/ui_320x240.h index 249a21c4f1..40b2185577 100644 --- a/Marlin/src/lcd/tft/ui_320x240.h +++ b/Marlin/src/lcd/tft/ui_320x240.h @@ -21,88 +21,22 @@ */ #pragma once -#include "../../inc/MarlinConfigPre.h" +#define MARLIN_LOGO_FULL_SIZE MarlinLogo320x240x16 -#include "tft.h" -#include "tft_image.h" +#define TFT_STATUS_TOP_Y 0 +#define TFT_TOP_LINE_Y 2 -#if ENABLED(TOUCH_SCREEN) - #include "touch.h" -#endif +#define MENU_TEXT_X_OFFSET 10 +#define MENU_TEXT_Y_OFFSET 7 -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); -void draw_fan_status(uint16_t x, uint16_t y, const bool blink); +#define MENU_ITEM_ICON_X 0 +#define MENU_ITEM_ICON_Y 0 +#define MENU_ITEM_ICON_SPACE 32 -#define MENU_TEXT_X_OFFSET 10 -#define MENU_TEXT_Y_OFFSET 7 -void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); -void menu_item(const uint8_t row, bool sel = false); +#define MENU_ITEM_HEIGHT 32 +#define MENU_LINE_HEIGHT (MENU_ITEM_HEIGHT + 2) -#define MENU_FONT_NAME Helvetica14 -#define SYMBOLS_FONT_NAME Helvetica14_symbols +#define MENU_FONT_NAME Helvetica14 +#define SYMBOLS_FONT_NAME Helvetica14_symbols -#define ABSOLUTE_ZERO -273.15 - -const tImage Images[imgCount] = { - TERN(SHOW_BOOTSCREEN, TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MarlinLogo320x240x16), NoLogo), - HotEnd_64x64x4, - Bed_64x64x4, - Bed_Heated_64x64x4, - Chamber_64x64x4, - Chamber_Heated_64x64x4, - Fan0_64x64x4, - Fan_Slow0_64x64x4, - Fan_Slow1_64x64x4, - Fan_Fast0_64x64x4, - Fan_Fast1_64x64x4, - Feedrate_32x32x4, - Flowrate_32x32x4, - SD_64x64x4, - Menu_64x64x4, - Settings_64x64x4, - Directory_32x32x4, - Confirm_64x64x4, - Cancel_64x64x4, - Increase_64x64x4, - Decrease_64x64x4, - Back_32x32x4, - Up_32x32x4, - Down_32x32x4, - Left_32x32x4, - Right_32x32x4, - Refresh_32x32x4, - Leveling_32x32x4, - Slider8x16x4, - Home_64x64x4, - BtnRounded_64x52x4, -}; - -#if HAS_TEMP_CHAMBER && HOTENDS > 1 - #define ITEM_E0 0 - #define ITEM_E1 1 - #define ITEM_BED 2 - #define ITEM_CHAMBER 3 - #define ITEM_FAN 4 - #define ITEMS_COUNT 5 - #define POS_Y 0 -#elif HAS_TEMP_CHAMBER - #define ITEM_E0 0 - #define ITEM_BED 1 - #define ITEM_CHAMBER 2 - #define ITEM_FAN 3 - #define ITEMS_COUNT 4 - #define POS_Y 0 -#elif HOTENDS > 1 - #define ITEM_E0 0 - #define ITEM_E1 1 - #define ITEM_BED 2 - #define ITEM_FAN 3 - #define ITEMS_COUNT 4 - #define POS_Y 0 -#else - #define ITEM_E0 0 - #define ITEM_BED 1 - #define ITEM_FAN 2 - #define ITEMS_COUNT 3 - #define POS_Y 0 -#endif +#include "ui_common.h" diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 4165c3990c..5000aedc39 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -24,7 +24,7 @@ #if HAS_UI_480x320 || HAS_UI_480x272 -#include "ui_480x320.h" +#include "ui_common.h" #include "../marlinui.h" #include "../menu/menu.h" @@ -45,14 +45,6 @@ #include "../../feature/bedlevel/bedlevel.h" #endif -#if !HAS_LCD_MENU - #error "Seriously? High resolution TFT screen without menu?" -#endif - -#if ENABLED(TOUCH_SCREEN) - static bool draw_menu_navigation = false; -#endif - void MarlinUI::tft_idle() { #if ENABLED(TOUCH_SCREEN) if (draw_menu_navigation) { @@ -67,28 +59,6 @@ void MarlinUI::tft_idle() { TERN_(TOUCH_SCREEN, touch.idle()); } -void MarlinUI::init_lcd() { - tft.init(); - tft.set_font(MENU_FONT_NAME); - #ifdef SYMBOLS_FONT_NAME - tft.add_glyphs(SYMBOLS_FONT_NAME); - #endif - TERN_(TOUCH_SCREEN, touch.init()); - clear_lcd(); -} - -bool MarlinUI::detected() { return true; } - -void MarlinUI::clear_lcd() { - #if ENABLED(TOUCH_SCREEN) - touch.reset(); - draw_menu_navigation = false; - #endif - - tft.queue.reset(); - tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); -} - #if ENABLED(SHOW_BOOTSCREEN) void MarlinUI::show_bootscreen() { tft.queue.reset(); @@ -100,8 +70,8 @@ void MarlinUI::clear_lcd() { #define SITE_URL_Y (TFT_HEIGHT - 70) tft.set_background(COLOR_BACKGROUND); #else - #define BOOT_LOGO_W 480 // MarlinLogo480x320x16 - #define BOOT_LOGO_H 320 + #define BOOT_LOGO_W TFT_WIDTH // MarlinLogo480x320x16 + #define BOOT_LOGO_H TFT_HEIGHT #define SITE_URL_Y (TFT_HEIGHT - 90) #endif tft.add_image((TFT_WIDTH - BOOT_LOGO_W) / 2, (TFT_HEIGHT - BOOT_LOGO_H) / 2, imgBootScreen); @@ -150,22 +120,22 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { currentTemperature = thermalManager.degHotend(Heater); targetTemperature = thermalManager.degTargetHotend(Heater); } -#if HAS_HEATED_BED - else if (Heater == H_BED) { - currentTemperature = thermalManager.degBed(); - targetTemperature = thermalManager.degTargetBed(); - } -#endif // HAS_HEATED_BED -#if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - currentTemperature = thermalManager.degChamber(); - #if HAS_HEATED_CHAMBER - targetTemperature = thermalManager.degTargetChamber(); - #else - targetTemperature = ABSOLUTE_ZERO; - #endif - } -#endif // HAS_TEMP_CHAMBER + #if HAS_HEATED_BED + else if (Heater == H_BED) { + currentTemperature = thermalManager.degBed(); + targetTemperature = thermalManager.degTargetBed(); + } + #endif + #if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + currentTemperature = thermalManager.degChamber(); + #if HAS_HEATED_CHAMBER + targetTemperature = thermalManager.degTargetChamber(); + #else + targetTemperature = ABSOLUTE_ZERO; + #endif + } + #endif else return; TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, Heater)); @@ -178,17 +148,17 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { if (currentTemperature >= 50) Color = COLOR_HOTEND; } #if HAS_HEATED_BED - else if (Heater == H_BED) { - if (currentTemperature >= 50) Color = COLOR_HEATED_BED; - image = targetTemperature > 0 ? imgBedHeated : imgBed; - } - #endif // HAS_HEATED_BED + else if (Heater == H_BED) { + if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + image = targetTemperature > 0 ? imgBedHeated : imgBed; + } + #endif #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - if (currentTemperature >= 50) Color = COLOR_CHAMBER; - image = targetTemperature > 0 ? imgChamberHeated : imgChamber; - } - #endif // HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + if (currentTemperature >= 50) Color = COLOR_CHAMBER; + image = targetTemperature > 0 ? imgChamberHeated : imgChamber; + } + #endif tft.add_image(8, 28, image, Color); @@ -233,7 +203,7 @@ void MarlinUI::draw_status_screen() { TERN_(TOUCH_SCREEN, touch.clear()); // heaters and fan - uint16_t i, x, y = POS_Y; + uint16_t i, x, y = TFT_STATUS_TOP_Y; for (i = 0 ; i < ITEMS_COUNT; i++) { x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); @@ -349,49 +319,6 @@ void MarlinUI::draw_status_screen() { tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); } -// Draw a static item with no left-right margin required. Centered by default. -void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { - menu_item(row); - tft_string.set(pstr, itemIndex, itemString); - if (vstr) - tft_string.add(vstr); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); -} - -// Draw a generic menu item with pre_char (if selected) and post_char -void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { - menu_item(row, sel); - - uint8_t *string = (uint8_t *)pstr; - MarlinImage image = noImage; - switch (*string) { - case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH - case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER - } - - uint8_t offset = MENU_TEXT_X_OFFSET; - if (image != noImage) { - string++; - offset = 42; - tft.add_image(5, 5, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - } - - tft_string.set(string, itemIndex, itemString); - tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); -} - -// Draw a menu item with a (potentially) editable value -void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { - menu_item(row, sel); - - tft_string.set(pstr, itemIndex, itemString); - tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - if (data) { - tft_string.set(data); - tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - } -} - // Low-level draw_edit_screen can be used to draw an edit screen from anyplace void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { ui.encoder_direction_normal(); @@ -491,16 +418,8 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #endif } -#if ENABLED(SDSUPPORT) - void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { - menu_item(row, sel); - if (isDir) - tft.add_image(5, 5, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - tft.add_text(42, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); - } -#endif - #if ENABLED(ADVANCED_PAUSE_FEATURE) + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { #if ENABLED(TOUCH_SCREEN) touch.clear(); @@ -521,6 +440,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.trim(); tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); } + #endif // ADVANCED_PAUSE_FEATURE #if ENABLED(AUTO_BED_LEVELING_UBL) @@ -570,18 +490,18 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.trim(); tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 48) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 5, 48, MENU_ITEM_HEIGHT); + constexpr uint8_t w = (TFT_WIDTH) / 10; + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - w) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 5, w, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(ui8tostr3rj(x_plot)); tft_string.trim(); - tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + tft.add_text(tft_string.center(w), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET + 16 - 24, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2, 48, MENU_ITEM_HEIGHT); + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET + 16 - 24, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2, w, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(ui8tostr3rj(y_plot)); tft_string.trim(); - tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + tft.add_text(tft_string.center(w), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); #if ENABLED(TOUCH_SCREEN) touch.clear(); @@ -596,97 +516,6 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const } #endif // AUTO_BED_LEVELING_UBL -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - void MarlinUI::touch_calibration_screen() { - uint16_t x, y; - - calibrationState calibration_stage = touch_calibration.get_calibration_state(); - - if (calibration_stage == CALIBRATION_NONE) { - defer_status_screen(true); - clear_lcd(); - calibration_stage = touch_calibration.calibration_start(); - } - else { - x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x; - y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y; - tft.canvas(x - 15, y - 15, 31, 31); - tft.set_background(COLOR_BACKGROUND); - } - - touch.clear(); - - if (calibration_stage < CALIBRATION_SUCCESS) { - switch (calibration_stage) { - case CALIBRATION_TOP_LEFT: tft_string.set(GET_TEXT(MSG_TOP_LEFT)); break; - case CALIBRATION_BOTTOM_LEFT: tft_string.set(GET_TEXT(MSG_BOTTOM_LEFT)); break; - case CALIBRATION_TOP_RIGHT: tft_string.set(GET_TEXT(MSG_TOP_RIGHT)); break; - case CALIBRATION_BOTTOM_RIGHT: tft_string.set(GET_TEXT(MSG_BOTTOM_RIGHT)); break; - default: break; - } - - x = touch_calibration.calibration_points[calibration_stage].x; - y = touch_calibration.calibration_points[calibration_stage].y; - - tft.canvas(x - 15, y - 15, 31, 31); - tft.set_background(COLOR_BACKGROUND); - tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); - tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); - - touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); - } - else { - tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED)); - defer_status_screen(false); - touch_calibration.calibration_end(); - touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); - } - - tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - } -#endif // TOUCH_SCREEN_CALIBRATION - -void menu_line(const uint8_t row, uint16_t color) { - tft.canvas(0, 4 + (MENU_ITEM_HEIGHT + 2) * row, TFT_WIDTH, MENU_ITEM_HEIGHT); - tft.set_background(color); -} - -void menu_pause_option(); - -void menu_item(const uint8_t row, bool sel ) { - #if ENABLED(TOUCH_SCREEN) - if (row == 0) { - touch.clear(); - draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); - } - #endif - - menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - #if ENABLED(TOUCH_SCREEN) - const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? MENU_CLICK : MENU_ITEM; - touch.add_control(tct, 0, 4 + (MENU_ITEM_HEIGHT + 2) * row, TFT_WIDTH, MENU_ITEM_HEIGHT, encoderTopLine + row); - #endif -} - -void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { - #define TFT_COL_WIDTH ((TFT_WIDTH) / (LCD_WIDTH)) - tft.canvas(col * TFT_COL_WIDTH, 4 + 45 * row, TFT_WIDTH - (col * TFT_COL_WIDTH), 43); - tft.set_background(COLOR_BACKGROUND); -} - -int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { - tft_string.set(utf8_str_P); - tft_string.trim(); - tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - return tft_string.width(); -} - -int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { - return lcd_put_u8str_max_P(utf8_str, max_length); -} - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) #include "../../feature/babystep.h" #endif @@ -889,37 +718,14 @@ static void moveAxis(AxisEnum axis, const int8_t direction) { drawAxisValue(axis); } -static void e_plus() { - moveAxis(E_AXIS, 1); -} - -static void e_minus() { - moveAxis(E_AXIS, -1); -} - -static void x_minus() { - moveAxis(X_AXIS, -1); -} - -static void x_plus() { - moveAxis(X_AXIS, 1); -} - -static void y_plus() { - moveAxis(Y_AXIS, 1); -} - -static void y_minus() { - moveAxis(Y_AXIS, -1); -} - -static void z_plus() { - moveAxis(Z_AXIS, 1); -} - -static void z_minus() { - moveAxis(Z_AXIS, -1); -} +static void e_plus() { moveAxis(E_AXIS, 1); } +static void e_minus() { moveAxis(E_AXIS, -1); } +static void x_minus() { moveAxis(X_AXIS, -1); } +static void x_plus() { moveAxis(X_AXIS, 1); } +static void y_plus() { moveAxis(Y_AXIS, 1); } +static void y_minus() { moveAxis(Y_AXIS, -1); } +static void z_plus() { moveAxis(Z_AXIS, 1); } +static void z_minus() { moveAxis(Z_AXIS, -1); } #if ENABLED(TOUCH_SCREEN) static void e_select() { @@ -1002,8 +808,9 @@ void MarlinUI::move_axis_screen() { const bool busy = printingIsActive(); - // if we have baby step and we are printing, select baby step - if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + // Babysteps during printing? Select babystep for Z probe offset + if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) + motionAxisState.z_selection = Z_SELECTION_Z_PROBE; // ROW 1 -> E- Y- CurY Z+ int x = X_MARGIN, y = Y_MARGIN, spacing = 0; @@ -1089,7 +896,7 @@ void MarlinUI::move_axis_screen() { TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); } - // alinged with x+ + // aligned with x+ drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h index e3a688f112..fca9ed9c2a 100644 --- a/Marlin/src/lcd/tft/ui_480x320.h +++ b/Marlin/src/lcd/tft/ui_480x320.h @@ -21,97 +21,29 @@ */ #pragma once -#include "../../inc/MarlinConfigPre.h" +#define MARLIN_LOGO_FULL_SIZE MarlinLogo480x320x16 -#include "tft.h" -#include "tft_image.h" +#include "ui_common.h" -#if ENABLED(TOUCH_SCREEN) - #include "touch.h" -#endif +#define TFT_STATUS_TOP_Y 4 +#define TFT_TOP_LINE_Y 4 -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); -void draw_fan_status(uint16_t x, uint16_t y, const bool blink); +#define MENU_TEXT_X_OFFSET 16 +#define MENU_TEXT_Y_OFFSET 7 -#define MENU_TEXT_X_OFFSET 16 -#define MENU_TEXT_Y_OFFSET 7 -void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); -void menu_item(const uint8_t row, bool sel = false); +#define MENU_ITEM_ICON_X 5 +#define MENU_ITEM_ICON_Y 5 +#define MENU_ITEM_ICON_SPACE 42 #if HAS_UI_480x320 - #define MENU_FONT_NAME Helvetica18 - #define SYMBOLS_FONT_NAME Helvetica18_symbols - #define MENU_ITEM_HEIGHT 43 - #define FONT_LINE_HEIGHT 34 + #define MENU_FONT_NAME Helvetica18 + #define SYMBOLS_FONT_NAME Helvetica18_symbols + #define MENU_ITEM_HEIGHT 43 + #define FONT_LINE_HEIGHT 34 #elif HAS_UI_480x272 - #define MENU_FONT_NAME Helvetica14 - #define SYMBOLS_FONT_NAME Helvetica14_symbols - #define MENU_ITEM_HEIGHT 36 - #define FONT_LINE_HEIGHT 24 -#endif - -#define ABSOLUTE_ZERO -273.15 - -const tImage Images[imgCount] = { - TERN(SHOW_BOOTSCREEN, TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MarlinLogo480x320x16), NoLogo), - HotEnd_64x64x4, - Bed_64x64x4, - Bed_Heated_64x64x4, - Chamber_64x64x4, - Chamber_Heated_64x64x4, - Fan0_64x64x4, - Fan_Slow0_64x64x4, - Fan_Slow1_64x64x4, - Fan_Fast0_64x64x4, - Fan_Fast1_64x64x4, - Feedrate_32x32x4, - Flowrate_32x32x4, - SD_64x64x4, - Menu_64x64x4, - Settings_64x64x4, - Directory_32x32x4, - Confirm_64x64x4, - Cancel_64x64x4, - Increase_64x64x4, - Decrease_64x64x4, - Back_32x32x4, - Up_32x32x4, - Down_32x32x4, - Left_32x32x4, - Right_32x32x4, - Refresh_32x32x4, - Leveling_32x32x4, - Slider8x16x4, - Home_64x64x4, - BtnRounded_64x52x4, -}; - -#if HAS_TEMP_CHAMBER && HOTENDS > 1 - #define ITEM_E0 0 - #define ITEM_E1 1 - #define ITEM_BED 2 - #define ITEM_CHAMBER 3 - #define ITEM_FAN 4 - #define ITEMS_COUNT 5 - #define POS_Y 4 -#elif HAS_TEMP_CHAMBER - #define ITEM_E0 0 - #define ITEM_BED 1 - #define ITEM_CHAMBER 2 - #define ITEM_FAN 3 - #define ITEMS_COUNT 4 - #define POS_Y 4 -#elif HOTENDS > 1 - #define ITEM_E0 0 - #define ITEM_E1 1 - #define ITEM_BED 2 - #define ITEM_FAN 3 - #define ITEMS_COUNT 4 - #define POS_Y 4 -#else - #define ITEM_E0 0 - #define ITEM_BED 1 - #define ITEM_FAN 2 - #define ITEMS_COUNT 3 - #define POS_Y 4 + #define MENU_FONT_NAME Helvetica14 + #define SYMBOLS_FONT_NAME Helvetica14_symbols + #define MENU_ITEM_HEIGHT 36 + #define FONT_LINE_HEIGHT 24 #endif +#define MENU_LINE_HEIGHT (MENU_ITEM_HEIGHT + 2) diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp new file mode 100644 index 0000000000..842fc3909c --- /dev/null +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -0,0 +1,246 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include "ui_common.h" +#include "../lcdprint.h" +#include "../../libs/numtostr.h" +#include "../menu/menu.h" + +void menu_pause_option(); + +static xy_uint_t cursor; + +#if ENABLED(TOUCH_SCREEN) + bool draw_menu_navigation = false; +#endif + +void menu_line(const uint8_t row, uint16_t color) { + cursor.set(0, row); + tft.canvas(0, TFT_TOP_LINE_Y + cursor.y * MENU_LINE_HEIGHT, TFT_WIDTH, MENU_ITEM_HEIGHT); + tft.set_background(color); +} + +void menu_item(const uint8_t row, bool sel ) { + #if ENABLED(TOUCH_SCREEN) + if (row == 0) { + touch.clear(); + draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); + } + #endif + + menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + #if ENABLED(TOUCH_SCREEN) + const TouchControlType tct = TERN(SINGLE_TOUCH_NAVIGATION, true, sel) ? MENU_CLICK : MENU_ITEM; + touch.add_control(tct, 0, TFT_TOP_LINE_Y + row * MENU_LINE_HEIGHT, TFT_WIDTH, MENU_ITEM_HEIGHT, encoderTopLine + row); + #endif +} + +// +// lcdprint.h functions +// + +#define TFT_COL_WIDTH ((TFT_WIDTH) / (LCD_WIDTH)) + +void lcd_gotopixel(const uint16_t x, const uint16_t y) { + if (x >= TFT_WIDTH) return; + cursor.set(x / (TFT_COL_WIDTH), y / MENU_LINE_HEIGHT); + tft.canvas(x, TFT_TOP_LINE_Y + y, (TFT_WIDTH) - x, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); +} + +void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { + lcd_gotopixel(int(col) * (TFT_COL_WIDTH), int(row) * MENU_LINE_HEIGHT); +} + +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + if (max_length < 1) return 0; + tft_string.set(); + tft_string.add(c); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + lcd_gotopixel((cursor.x + 1) * (TFT_COL_WIDTH) + tft_string.width(), cursor.y * MENU_LINE_HEIGHT); + return tft_string.width(); +} + +int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + if (max_length < 1) return 0; + tft_string.set(utf8_str_P); + tft_string.trim(); + tft_string.truncate(max_length); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + lcd_gotopixel((cursor.x + 1) * (TFT_COL_WIDTH) + tft_string.width(), cursor.y * MENU_LINE_HEIGHT); + return tft_string.width(); +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + return lcd_put_u8str_max_P(utf8_str, max_length); +} + +void lcd_put_int(const int i) { + // 3 digits max for this one... + const char* str = i16tostr3left(int16_t(i)); + lcd_put_u8str_max(str, 3); +} + +// +// Menu Item methods +// + +// Draw a generic menu item with pre_char (if selected) and post_char +void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { + menu_item(row, sel); + + uint8_t *string = (uint8_t *)pstr; + MarlinImage image = noImage; + switch (*string) { + case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH + case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER + } + + uint8_t offset = MENU_TEXT_X_OFFSET; + if (image != noImage) { + string++; + offset = MENU_ITEM_ICON_SPACE; + tft.add_image(MENU_ITEM_ICON_X, MENU_ITEM_ICON_Y, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + } + + tft_string.set(string, itemIndex, itemString); + tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); +} + +// Draw a menu item with a (potentially) editable value +void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + menu_item(row, sel); + + tft_string.set(pstr, itemIndex, itemString); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + if (data) { + tft_string.set(data); + tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } +} + +// Draw a static item with no left-right margin required. Centered by default. +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { + menu_item(row); + tft_string.set(pstr, itemIndex, itemString); + if (vstr) + tft_string.add(vstr); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); +} + +#if ENABLED(SDSUPPORT) + + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + menu_item(row, sel); + if (isDir) + tft.add_image(MENU_ITEM_ICON_X, MENU_ITEM_ICON_Y, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + tft.add_text(MENU_ITEM_ICON_SPACE, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); + } + +#endif + +// +// MarlinUI methods +// + +bool MarlinUI::detected() { return true; } + +void MarlinUI::init_lcd() { + tft.init(); + tft.set_font(MENU_FONT_NAME); + #ifdef SYMBOLS_FONT_NAME + tft.add_glyphs(SYMBOLS_FONT_NAME); + #endif + TERN_(TOUCH_SCREEN, touch.init()); + clear_lcd(); +} + +void MarlinUI::clear_lcd() { + #if ENABLED(TOUCH_SCREEN) + touch.reset(); + draw_menu_navigation = false; + #endif + + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); + cursor.set(0, 0); +} + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + + void MarlinUI::touch_calibration_screen() { + uint16_t x, y; + + calibrationState calibration_stage = touch_calibration.get_calibration_state(); + + if (calibration_stage == CALIBRATION_NONE) { + defer_status_screen(true); + clear_lcd(); + calibration_stage = touch_calibration.calibration_start(); + } + else { + x = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].x; + y = touch_calibration.calibration_points[_MIN(calibration_stage - 1, CALIBRATION_BOTTOM_RIGHT)].y; + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + } + + touch.clear(); + + if (calibration_stage < CALIBRATION_SUCCESS) { + switch (calibration_stage) { + case CALIBRATION_TOP_LEFT: tft_string.set(GET_TEXT(MSG_TOP_LEFT)); break; + case CALIBRATION_BOTTOM_LEFT: tft_string.set(GET_TEXT(MSG_BOTTOM_LEFT)); break; + case CALIBRATION_TOP_RIGHT: tft_string.set(GET_TEXT(MSG_TOP_RIGHT)); break; + case CALIBRATION_BOTTOM_RIGHT: tft_string.set(GET_TEXT(MSG_BOTTOM_RIGHT)); break; + default: break; + } + + x = touch_calibration.calibration_points[calibration_stage].x; + y = touch_calibration.calibration_points[calibration_stage].y; + + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); + tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); + + touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); + } + else { + tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED)); + defer_status_screen(false); + touch_calibration.calibration_end(); + touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); + } + + tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } + +#endif // TOUCH_SCREEN_CALIBRATION + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/ui_common.h b/Marlin/src/lcd/tft/ui_common.h new file mode 100644 index 0000000000..d40e471171 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_common.h @@ -0,0 +1,76 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#if !HAS_LCD_MENU + #error "Seriously? High resolution TFT screen without menu?" +#endif + +#include "tft.h" +#include "tft_image.h" + +#if ENABLED(TOUCH_SCREEN) + #include "touch.h" + extern bool draw_menu_navigation; +#endif + +#if HAS_UI_320x240 + #include "ui_320x240.h" +#elif HAS_UI_480x320 || HAS_UI_480x272 + #include "ui_480x320.h" +#endif + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); +void draw_fan_status(uint16_t x, uint16_t y, const bool blink); + +void menu_line(const uint8_t row, uint16_t color=COLOR_BACKGROUND); +void menu_item(const uint8_t row, bool sel = false); + +#define ABSOLUTE_ZERO -273.15 + +#if HAS_TEMP_CHAMBER && HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_CHAMBER 3 + #define ITEM_FAN 4 + #define ITEMS_COUNT 5 +#elif HAS_TEMP_CHAMBER + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_CHAMBER 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 +#elif HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 +#else + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_FAN 2 + #define ITEMS_COUNT 3 +#endif From 70ee5e94fdfb17ec8eccce315f196818640da98b Mon Sep 17 00:00:00 2001 From: Kairali Date: Mon, 25 Jan 2021 12:48:31 +0500 Subject: [PATCH 0932/1370] =?UTF-8?q?"Move=20=E2=80=A6=20code"=20followup?= =?UTF-8?q?=20(#20874)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix regression from #20832 --- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 985041ede5..8ae6ab6627 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -40,6 +40,10 @@ #include "../../gcode/parser.h" // for units (and volumetric) +#if ENABLED(LCD_SHOW_E_TOTAL) + #include "../../MarlinCore.h" // for printingIsActive(), marlin_state and MF_SD_COMPLETE +#endif + #if ENABLED(FILAMENT_LCD_DISPLAY) #include "../../feature/filwidth.h" #include "../../module/planner.h" From a576ab83e9c321a22e533bf5e582e646b44944e2 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 25 Jan 2021 20:51:54 +1300 Subject: [PATCH 0933/1370] =?UTF-8?q?"Move=20=E2=80=A6=20code"=20followup?= =?UTF-8?q?=20(#20868)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix regression from #20832 --- Marlin/src/MarlinCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 7a25876458..290cd4c412 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -953,7 +953,7 @@ void setup() { #endif #if HAS_SUICIDE - SETUP_LOG("SUICIDE_PIN") + SETUP_LOG("SUICIDE_PIN"); OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); #endif From 3beb6a9df3b18c431ca42f42252be06a3a585541 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Mon, 25 Jan 2021 08:52:45 +0100 Subject: [PATCH 0934/1370] Cosmetic changes (2) (#20876) --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index fd5b6dc848..51d978daad 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1360,7 +1360,7 @@ #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. - #define G26_XY_FEEDRATE 100 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. + #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. #endif From 82122fe9cd2be275662c6fa66d2605959659fa1b Mon Sep 17 00:00:00 2001 From: "Alexander D. Kanevskiy" Date: Mon, 25 Jan 2021 09:53:48 +0200 Subject: [PATCH 0935/1370] Fix sign warning (#20872) --- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 15578e21d9..61fee3e048 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -193,7 +193,7 @@ #define STATUS_LOGO_HEIGHT (sizeof(status_logo_bmp) / (STATUS_LOGO_BYTEWIDTH)) #endif #ifndef STATUS_LOGO_Y - #define STATUS_LOGO_Y _MAX(0L, (28L - _MIN(28L, STATUS_LOGO_HEIGHT)) / 2L) + #define STATUS_LOGO_Y _MAX(0U, (28U - _MIN(28U, STATUS_LOGO_HEIGHT)) / 2U) #endif static_assert( sizeof(status_logo_bmp) == (STATUS_LOGO_BYTEWIDTH) * (STATUS_LOGO_HEIGHT), From b059c9e5c07e49f7d97f1f1c72786a5e153a6c6a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 25 Jan 2021 04:56:54 -0600 Subject: [PATCH 0936/1370] Reformat abortSDPrinting --- Marlin/src/MarlinCore.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 290cd4c412..31959dbda3 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -362,19 +362,19 @@ void startOrResumeJob() { inline void abortSDPrinting() { IF_DISABLED(NO_SD_AUTOSTART, card.autofile_cancel()); card.endFilePrint(TERN_(SD_RESORT, true)); + queue.clear(); quickstop_stepper(); print_job_timer.stop(); - #if DISABLED(SD_ABORT_NO_COOLDOWN) - thermalManager.disable_all_heaters(); - #endif - #if !HAS_CUTTER - thermalManager.zero_fan_speeds(); - #else - cutter.kill(); // Full cutter shutdown including ISR control - #endif + + IF_DISABLED(SD_ABORT_NO_COOLDOWN, thermalManager.disable_all_heaters()); + + TERN(HAS_CUTTER, cutter.kill(), thermalManager.zero_fan_speeds()); // Full cutter shutdown including ISR control + wait_for_heatup = false; + TERN_(POWER_LOSS_RECOVERY, recovery.purge()); + #ifdef EVENT_GCODE_SD_ABORT queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); #endif From efaff241455e879b2bb7f3e499f3cadca1bcbb70 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 25 Jan 2021 08:32:58 -0600 Subject: [PATCH 0937/1370] Apply SEC_TO_MS and other fixes --- Marlin/src/MarlinCore.cpp | 1 + Marlin/src/core/macros.h | 1 + Marlin/src/gcode/control/M80_M81.cpp | 3 ++- Marlin/src/gcode/feature/L6470/M916-918.cpp | 2 +- Marlin/src/gcode/parser.h | 2 +- Marlin/src/module/printcounter.cpp | 7 ++++--- Marlin/src/module/printcounter.h | 5 +---- Marlin/src/module/temperature.cpp | 1 - Marlin/src/module/tool_change.cpp | 4 ++-- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 31959dbda3..4732afbb87 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -783,6 +783,7 @@ void minkill(const bool steppers_off/*=false*/) { */ void stop() { thermalManager.disable_all_heaters(); // 'unpause' taken care of in here + print_job_timer.stop(); #if ENABLED(PROBING_FANS_OFF) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index d5b3342437..63ef597034 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -162,6 +162,7 @@ #define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) #define _DO_13(W,C,A,V...) (_##W##_1(A) C _DO_12(W,C,V)) #define _DO_14(W,C,A,V...) (_##W##_1(A) C _DO_13(W,C,V)) +#define _DO_15(W,C,A,V...) (_##W##_1(A) C _DO_14(W,C,V)) #define __DO_N(W,C,N,V...) _DO_##N(W,C,V) #define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) #define DO(W,C,V...) (_DO_N(W,C,NUM_ARGS(V),V)) diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index ea0f9c2b13..394b06d8ac 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -89,9 +89,10 @@ */ void GcodeSuite::M81() { thermalManager.disable_all_heaters(); - print_job_timer.stop(); planner.finish_and_disable(); + print_job_timer.stop(); + #if HAS_FAN thermalManager.zero_fan_speeds(); #if ENABLED(PROBING_FANS_OFF) diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp index 2672f91239..8a1ea48306 100644 --- a/Marlin/src/gcode/feature/L6470/M916-918.cpp +++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp @@ -119,7 +119,7 @@ void GcodeSuite::M916() { M91x_counter_max = 256; // KVAL_HOLD is 8 bits uint8_t M91x_delay_s = parser.byteval('D'); // get delay in seconds - millis_t M91x_delay_ms = M91x_delay_s * 60 * 1000; + millis_t M91x_delay_ms = SEC_TO_MS(M91x_delay_s * 60); millis_t M91x_delay_end; DEBUG_ECHOLNPGM(".\n."); diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 8633d2b1e9..cf531c4e47 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -282,7 +282,7 @@ public: // Code value for use as time static inline millis_t value_millis() { return value_ulong(); } - static inline millis_t value_millis_from_seconds() { return (millis_t)(value_float() * 1000); } + static inline millis_t value_millis_from_seconds() { return (millis_t)SEC_TO_MS(value_float()); } // Reduce to fewer bits static inline int16_t value_int() { return (int16_t)value_long(); } diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index ab87717f01..5da1d09c75 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -224,9 +224,12 @@ void PrintCounter::tick() { millis_t now = millis(); - static uint32_t update_next; // = 0 + static millis_t update_next; // = 0 if (ELAPSED(now, update_next)) { + update_next = now + updateInterval; + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("tick"))); + millis_t delta = deltaDuration(); data.printTime += delta; @@ -239,8 +242,6 @@ void PrintCounter::tick() { #if SERVICE_INTERVAL_3 > 0 data.nextService3 -= _MIN(delta, data.nextService3); #endif - - update_next = now + updateInterval * 1000; } static uint32_t eeprom_next; // = 0 diff --git a/Marlin/src/module/printcounter.h b/Marlin/src/module/printcounter.h index 66d8cbb7b3..f7fc96c579 100644 --- a/Marlin/src/module/printcounter.h +++ b/Marlin/src/module/printcounter.h @@ -71,11 +71,8 @@ class PrintCounter: public Stopwatch { * @brief Interval in seconds between counter updates * @details This const value defines what will be the time between each * accumulator update. This is different from the EEPROM save interval. - * - * @note The max value for this option is 60(s), otherwise integer - * overflow will happen. */ - static constexpr uint16_t updateInterval = 10; + static constexpr millis_t updateInterval = SEC_TO_MS(10); /** * @brief Interval in seconds between EEPROM saves diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 00a048736a..589baf7796 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2186,7 +2186,6 @@ void Temperature::disable_all_heaters() { #endif - #if ENABLED(PROBING_HEATERS_OFF) void Temperature::pause(const bool p) { diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 052b8cd34a..867ae5d927 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -828,7 +828,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // Cool down with fan #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed; - gcode.dwell(toolchange_settings.fan_time * 1000); + gcode.dwell(SEC_TO_MS(toolchange_settings.fan_time)); thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0; #endif @@ -1102,7 +1102,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { // Cool down with fan #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed; - gcode.dwell(toolchange_settings.fan_time * 1000); + gcode.dwell(SEC_TO_MS(toolchange_settings.fan_time)); thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0; #endif } diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index ea9748ca54..fbddc66e7c 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -27,7 +27,7 @@ #if defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1769) #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#elif NOT_TARGET(MKS_HAS_LPC1769, MCU_LPC1768) +#elif !defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1768) #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif From 5acd8f36a447e5b4020eea8acfb52854bd790580 Mon Sep 17 00:00:00 2001 From: Gabriele Besta <48332305+bg-master@users.noreply.github.com> Date: Mon, 25 Jan 2021 15:39:24 +0100 Subject: [PATCH 0938/1370] =?UTF-8?q?"Move=20=E2=80=A6=20code"=20followup?= =?UTF-8?q?=20(#20869)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix regression from #20832 --- Marlin/src/feature/runout.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 4b93d01eb7..60154c5e43 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -30,6 +30,7 @@ #include "../module/planner.h" #include "../module/stepper.h" // for block_t #include "../gcode/queue.h" +#include "../feature/pause.h" #include "../inc/MarlinConfig.h" @@ -37,10 +38,6 @@ #include "../lcd/extui/ui_api.h" #endif -#if ENABLED(ADVANCED_PAUSE_FEATURE) - #include "pause.h" -#endif - //#define FILAMENT_RUNOUT_SENSOR_DEBUG #ifndef FILAMENT_RUNOUT_THRESHOLD #define FILAMENT_RUNOUT_THRESHOLD 5 From a582d1dc2fa7221193bc5b9b8da3e31f763f08dd Mon Sep 17 00:00:00 2001 From: Rockman18 Date: Mon, 25 Jan 2021 15:50:39 +0100 Subject: [PATCH 0939/1370] Init KILL, SUICIDE, PSU earlier (#20810) --- Marlin/src/MarlinCore.cpp | 41 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 4732afbb87..7376515260 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -885,6 +885,27 @@ void setup() { #endif #define SETUP_RUN(C) do{ SETUP_LOG(STRINGIFY(C)); C; }while(0) + // Set up these pins early to prevent suicide + #if HAS_KILL + SETUP_LOG("KILL_PIN"); + #if KILL_PIN_STATE + SET_INPUT_PULLDOWN(KILL_PIN); + #else + SET_INPUT_PULLUP(KILL_PIN); + #endif + #endif + + #if HAS_SUICIDE + SETUP_LOG("SUICIDE_PIN"); + OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); + #endif + + #if ENABLED(PSU_CONTROL) + SETUP_LOG("PSU_CONTROL"); + powersupply_on = ENABLED(PSU_DEFAULT_OFF); + if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); + #endif + #if EITHER(DISABLE_DEBUG, DISABLE_JTAG) // Disable any hardware debug to free up pins for IO #if ENABLED(DISABLE_DEBUG) && defined(JTAGSWD_DISABLE) @@ -940,30 +961,10 @@ void setup() { SETUP_RUN(recovery.setup()); #endif - #if HAS_KILL - SETUP_LOG("KILL_PIN"); - #if KILL_PIN_STATE - SET_INPUT_PULLDOWN(KILL_PIN); - #else - SET_INPUT_PULLUP(KILL_PIN); - #endif - #endif - #if HAS_TMC220x SETUP_RUN(tmc_serial_begin()); #endif - #if HAS_SUICIDE - SETUP_LOG("SUICIDE_PIN"); - OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); - #endif - - #if ENABLED(PSU_CONTROL) - SETUP_LOG("PSU_CONTROL"); - powersupply_on = ENABLED(PSU_DEFAULT_OFF); - if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); - #endif - #if HAS_STEPPER_RESET SETUP_RUN(disableStepperDrivers()); #endif From 2aaff47c9dc2927dc275e3e43c19b5ce4a82d07c Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 25 Jan 2021 15:58:52 +0100 Subject: [PATCH 0940/1370] Clean up MMU2 code (#20794) Co-authored-by: Scott Lahteine --- Marlin/src/feature/mmu/mmu2.cpp | 44 +++++++++++++------------------ Marlin/src/feature/mmu/mmu2.h | 1 - Marlin/src/lcd/menu/menu_mmu2.cpp | 19 ++++++------- 3 files changed, 26 insertions(+), 38 deletions(-) diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index a4b7f257a9..e3036947d5 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -167,6 +167,8 @@ void MMU2::mmu_loop() { case -1: if (rx_start()) { + prev_P0_request = millis(); // Initialize finda sensor timeout + DEBUG_ECHOLNPGM("MMU => 'start'"); DEBUG_ECHOLNPGM("MMU <= 'S1'"); @@ -311,7 +313,7 @@ void MMU2::mmu_loop() { // if (finda_runout_valid) DEBUG_ECHOLNPAIR_F("MMU <= 'P0'\nMMU => ", finda, 6); if (!finda && finda_runout_valid) filament_runout(); - if (cmd == 0) ready = true; + if (cmd == MMU_CMD_NONE) ready = true; state = 1; } else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s) @@ -333,18 +335,20 @@ void MMU2::mmu_loop() { #endif if (rx_ok()) { - // Response to C0 mmu command in MMU2S model - bool can_reset = true; #if HAS_PRUSA_MMU2S - if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) { - can_reset = false; + // Respond to C0 MMU command in MMU2S model + const bool keep_trying = !mmu2s_triggered && last_cmd == MMU_CMD_C0; + if (keep_trying) { // MMU ok received but filament sensor not triggered, retrying... DEBUG_ECHOLNPGM("MMU => 'ok' (filament not present in gears)"); DEBUG_ECHOLNPGM("MMU <= 'C0' (keep trying)"); MMU2_COMMAND("C0"); } + #else + constexpr bool keep_trying = false; #endif - if (can_reset) { + + if (!keep_trying) { DEBUG_ECHOLNPGM("MMU => 'ok'"); ready = true; state = 1; @@ -370,11 +374,7 @@ void MMU2::mmu_loop() { */ bool MMU2::rx_start() { // check for start message - if (rx_str_P(PSTR("start\n"))) { - prev_P0_request = millis(); - return true; - } - return false; + return rx_str_P(PSTR("start\n")); } /** @@ -385,13 +385,13 @@ bool MMU2::rx_str_P(const char* str) { while (MMU2_SERIAL.available()) { rx_buffer[i++] = MMU2_SERIAL.read(); - rx_buffer[i] = '\0'; if (i == sizeof(rx_buffer) - 1) { DEBUG_ECHOLNPGM("rx buffer overrun"); break; } } + rx_buffer[i] = '\0'; uint8_t len = strlen_P(str); @@ -416,7 +416,6 @@ void MMU2::tx_str_P(const char* str) { clear_rx_buffer(); uint8_t len = strlen_P(str); LOOP_L_N(i, len) MMU2_SERIAL.write(pgm_read_byte(str++)); - rx_buffer[0] = '\0'; prev_request = millis(); } @@ -427,7 +426,6 @@ void MMU2::tx_printf_P(const char* format, int argument = -1) { clear_rx_buffer(); uint8_t len = sprintf_P(tx_buffer, format, argument); LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); - rx_buffer[0] = '\0'; prev_request = millis(); } @@ -438,7 +436,6 @@ void MMU2::tx_printf_P(const char* format, int argument1, int argument2) { clear_rx_buffer(); uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2); LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); - rx_buffer[0] = '\0'; prev_request = millis(); } @@ -570,7 +567,7 @@ static void mmu2_not_responding() { case 'c': { while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); + load_to_nozzle(); } break; } @@ -791,7 +788,7 @@ bool MMU2::get_response() { } /** - * Wait for response and deal with timeout if nexcessary + * Wait for response and deal with timeout if necessary */ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { @@ -917,6 +914,7 @@ void MMU2::filament_runout() { // Load filament into MMU2 void MMU2::load_filament(const uint8_t index) { if (!enabled) return; + command(MMU_CMD_L0 + index); manage_response(false, false); BUZZ(200, 404); @@ -935,6 +933,7 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) { return false; } + DISABLE_AXIS_E0(); command(MMU_CMD_T0 + index); manage_response(true, true); @@ -957,7 +956,6 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) { * filament to nozzle. */ void MMU2::load_to_nozzle() { - if (!enabled) return; execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); } @@ -1020,7 +1018,8 @@ bool MMU2::unload() { return false; } - filament_ramming(); + // Unload sequence to optimize shape of the tip of the unloaded filament + execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); command(MMU_CMD_U0); manage_response(false, true); @@ -1035,13 +1034,6 @@ bool MMU2::unload() { return true; } -/** - * Unload sequence to optimize shape of the tip of the unloaded filament - */ -void MMU2::filament_ramming() { - execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); -} - void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) { planner.synchronize(); diff --git a/Marlin/src/feature/mmu/mmu2.h b/Marlin/src/feature/mmu/mmu2.h index 09ff3b6683..4326989a74 100644 --- a/Marlin/src/feature/mmu/mmu2.h +++ b/Marlin/src/feature/mmu/mmu2.h @@ -71,7 +71,6 @@ private: static void manage_response(const bool move_axes, const bool turn_off_nozzle); static void load_to_nozzle(); - static void filament_ramming(); static void execute_extruder_sequence(const E_Step * sequence, int steps); static void filament_runout(); diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index 8a34e7d296..7e71f00d25 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -32,15 +32,12 @@ // Load Filament // -void _mmu2_load_filamentToNozzle(uint8_t index) { +inline void action_mmu2_load_filament_to_nozzle(const uint8_t tool) { ui.reset_status(); ui.return_to_status(); - ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); - if (mmu2.load_filament_to_nozzle(index)) ui.reset_status(); -} - -inline void action_mmu2_load_filament_to_nozzle(const uint8_t tool) { - _mmu2_load_filamentToNozzle(tool); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(tool + 1)); + if (mmu2.load_filament_to_nozzle(tool)) + ui.reset_status(); ui.return_to_status(); } @@ -59,14 +56,14 @@ void menu_mmu2_load_filament() { START_MENU(); BACK_ITEM(MSG_MMU2_MENU); ACTION_ITEM(MSG_MMU2_ALL, action_mmu2_load_all); - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ _mmu2_load_filament(MenuItemBase::itemIndex); }); + LOOP_L_N(i, EXTRUDERS) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ _mmu2_load_filament(MenuItemBase::itemIndex); }); END_MENU(); } void menu_mmu2_load_to_nozzle() { START_MENU(); BACK_ITEM(MSG_MMU2_MENU); - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_load_filament_to_nozzle(MenuItemBase::itemIndex); }); + LOOP_L_N(i, EXTRUDERS) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_load_filament_to_nozzle(MenuItemBase::itemIndex); }); END_MENU(); } @@ -92,7 +89,7 @@ void action_mmu2_unload_filament() { void menu_mmu2_eject_filament() { START_MENU(); BACK_ITEM(MSG_MMU2_MENU); - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ _mmu2_eject_filament(MenuItemBase::itemIndex); }); + LOOP_L_N(i, EXTRUDERS) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ _mmu2_eject_filament(MenuItemBase::itemIndex); }); END_MENU(); } @@ -133,7 +130,7 @@ void menu_mmu2_choose_filament() { #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_DEFAULT|SS_INVERT); #endif - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_chosen(MenuItemBase::itemIndex); }); + LOOP_L_N(i, EXTRUDERS) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_chosen(MenuItemBase::itemIndex); }); END_MENU(); } From b9d19291feaf162eb88ab33cad592f3c6d9e854f Mon Sep 17 00:00:00 2001 From: ScrewThisBanana <71625822+ScrewThisBanana@users.noreply.github.com> Date: Tue, 26 Jan 2021 04:14:26 +0100 Subject: [PATCH 0941/1370] Adding custom move feedrate for G26 Travel moves, Original #20729 (#20879) * Adding custom move feedrate for G26 This commit adds an additional configuration parameter that can be used to specify the movement speed during the G26 validation pattern command during moves without extrusion. Closes MarlinFirmware/Marlin#20615 --- Marlin/Configuration.h | 1 + Marlin/src/gcode/bedlevel/G26.cpp | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 51d978daad..71c4256401 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1361,6 +1361,7 @@ #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. + #define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for XY Moves without extrusion for the G26 Mesh Validation Tool #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. #endif diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 650b039b55..c583b505cb 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -128,6 +128,10 @@ #define G26_XY_FEEDRATE (PLANNER_XY_FEEDRATE() / 3.0) #endif +#ifndef G26_XY_FEEDRATE_TRAVEL + #define G26_XY_FEEDRATE_TRAVEL (PLANNER_XY_FEEDRATE() / 1.5) +#endif + #if CROSSHAIRS_SIZE >= INTERSECTION_CIRCLE_RADIUS #error "CROSSHAIRS_SIZE must be less than INTERSECTION_CIRCLE_RADIUS." #endif @@ -213,7 +217,8 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de const xy_pos_t dest = { rx, ry }; - const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. + const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. + const bool has_e_component = e_delta != 0.0; destination = current_position; @@ -224,10 +229,15 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de destination = current_position; } - // If X or Y is involved do a 'normal' move. Otherwise retract/recover/hop. + // If X or Y in combination with E is involved do a 'normal' move. + // If X or Y with no E is involved do a 'fast' move + // Otherwise retract/recover/hop. destination = dest; destination.e += e_delta; - const feedRate_t feed_value = has_xy_component ? feedRate_t(G26_XY_FEEDRATE) : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; + const feedRate_t feed_value = + has_xy_component + ? (has_e_component ? feedRate_t(G26_XY_FEEDRATE) : feedRate_t(G26_XY_FEEDRATE_TRAVEL)) + : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; prepare_internal_move_to_destination(feed_value); destination = current_position; } From 1bc65be70f3c25cb13d898913be12b6784b057a6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 25 Jan 2021 23:53:30 -0600 Subject: [PATCH 0942/1370] Custom G26 FR followup --- Marlin/src/gcode/bedlevel/G26.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index c583b505cb..5a79aaac7b 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -217,29 +217,26 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de const xy_pos_t dest = { rx, ry }; - const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. + const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. const bool has_e_component = e_delta != 0.0; destination = current_position; if (z != last_z) { last_z = destination.z = z; - const feedRate_t feed_value = planner.settings.max_feedrate_mm_s[Z_AXIS] * 0.5f; // Use half of the Z_AXIS max feed rate - prepare_internal_move_to_destination(feed_value); - destination = current_position; + const feedRate_t fr_mm_s = planner.settings.max_feedrate_mm_s[Z_AXIS] * 0.5f; // Use half of the Z_AXIS max feed rate + prepare_internal_move_to_destination(fr_mm_s); } - // If X or Y in combination with E is involved do a 'normal' move. + // If X or Y in combination with E is involved do a 'normal' move. // If X or Y with no E is involved do a 'fast' move // Otherwise retract/recover/hop. destination = dest; destination.e += e_delta; - const feedRate_t feed_value = - has_xy_component - ? (has_e_component ? feedRate_t(G26_XY_FEEDRATE) : feedRate_t(G26_XY_FEEDRATE_TRAVEL)) + const feedRate_t fr_mm_s = has_xy_component + ? (has_e_component ? feedRate_t(G26_XY_FEEDRATE) : feedRate_t(G26_XY_FEEDRATE_TRAVEL)) : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; - prepare_internal_move_to_destination(feed_value); - destination = current_position; + prepare_internal_move_to_destination(fr_mm_s); } FORCE_INLINE void move_to(const xyz_pos_t &where, const float &de) { move_to(where.x, where.y, where.z, de); } From 918894fd849cbd1c69711c5af0fdf359bd6ee7dd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 26 Jan 2021 02:15:05 -0600 Subject: [PATCH 0943/1370] Custom G26 FR followup --- Marlin/Configuration.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 71c4256401..e48e2e4331 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1357,11 +1357,11 @@ //#define G26_MESH_VALIDATION #if ENABLED(G26_MESH_VALIDATION) #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. - #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. - #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. - #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. - #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. - #define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for XY Moves without extrusion for the G26 Mesh Validation Tool + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for G26. + #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for G26. + #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for G26. + #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for G26 XY moves. + #define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for G26 XY travel moves. #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. #endif From cdefc19129d838448139a2147bda35115d689fa4 Mon Sep 17 00:00:00 2001 From: ConstantijnCrijnen <43953114+ConstantijnCrijnen@users.noreply.github.com> Date: Tue, 26 Jan 2021 09:30:31 +0100 Subject: [PATCH 0944/1370] Configure / disable PRINTCOUNTER save interval (#20856) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 3 ++ .../src/HAL/LPC1768/inc/Conditionals_post.h | 7 ++++ Marlin/src/MarlinCore.cpp | 3 +- Marlin/src/lcd/marlinui.cpp | 2 +- Marlin/src/libs/stopwatch.h | 1 + Marlin/src/module/printcounter.cpp | 39 +++++++++++-------- Marlin/src/module/printcounter.h | 21 ++++++---- 7 files changed, 50 insertions(+), 26 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index e48e2e4331..d888e62aaf 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1754,6 +1754,9 @@ * View the current statistics with M78. */ //#define PRINTCOUNTER +#if ENABLED(PRINTCOUNTER) + #define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print +#endif /** * Password diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h index ce6d3fdde2..94e4ce1341 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h @@ -26,3 +26,10 @@ #elif EITHER(I2C_EEPROM, SPI_EEPROM) #define USE_SHARED_EEPROM 1 #endif + +// LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785) +// TODO: Which other boards are incompatible? +#if defined(MCU_LPC1768) && PRINTCOUNTER_SAVE_INTERVAL > 0 + #warning "To prevent step loss, motion will pause for PRINTCOUNTER auto-save." + #define PRINTCOUNTER_SYNC 1 +#endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 7376515260..4b6c281de2 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -365,7 +365,8 @@ void startOrResumeJob() { queue.clear(); quickstop_stepper(); - print_job_timer.stop(); + + print_job_timer.abort(); IF_DISABLED(SD_ABORT_NO_COOLDOWN, thermalManager.disable_all_heaters()); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index c3c5d3f094..46db571936 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1495,8 +1495,8 @@ void MarlinUI::update() { #ifdef ACTION_ON_CANCEL host_action_cancel(); #endif + IF_DISABLED(SDSUPPORT, print_job_timer.stop()); TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("UI Aborted"), DISMISS_STR)); - print_job_timer.stop(); LCD_MESSAGEPGM(MSG_PRINT_ABORTED); TERN_(HAS_LCD_MENU, return_to_status()); } diff --git a/Marlin/src/libs/stopwatch.h b/Marlin/src/libs/stopwatch.h index 6e8e95a9a5..b64a36a90e 100644 --- a/Marlin/src/libs/stopwatch.h +++ b/Marlin/src/libs/stopwatch.h @@ -56,6 +56,7 @@ class Stopwatch { * @return true on success */ static bool stop(); + static inline bool abort() { return stop(); } // Alias by default /** * @brief Pause the stopwatch diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 5da1d09c75..45072c8f01 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -41,6 +41,10 @@ Stopwatch print_job_timer; // Global Print Job Timer instance #include "../libs/buzzer.h" #endif +#if PRINTCOUNTER_SYNC + #include "../module/planner.h" +#endif + // Service intervals #if HAS_SERVICE_INTERVALS #if SERVICE_INTERVAL_1 > 0 @@ -160,6 +164,8 @@ void PrintCounter::saveStats() { // Refuses to save data if object is not loaded if (!isLoaded()) return; + TERN_(PRINTCOUNTER_SYNC, planner.synchronize()); + // Saves the struct to EEPROM persistentStore.access_start(); persistentStore.write_data(address + sizeof(uint8_t), (uint8_t*)&data, sizeof(printStatistics)); @@ -244,11 +250,13 @@ void PrintCounter::tick() { #endif } - static uint32_t eeprom_next; // = 0 - if (ELAPSED(now, eeprom_next)) { - eeprom_next = now + saveInterval * 1000; - saveStats(); - } + #if PRINTCOUNTER_SAVE_INTERVAL > 0 + static millis_t eeprom_next; // = 0 + if (ELAPSED(now, eeprom_next)) { + eeprom_next = now + saveInterval; + saveStats(); + } + #endif } // @Override @@ -268,21 +276,20 @@ bool PrintCounter::start() { return false; } -// @Override -bool PrintCounter::stop() { +bool PrintCounter::_stop(const bool completed) { TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("stop"))); - if (super::stop()) { - data.finishedPrints++; + const bool did_stop = super::stop(); + if (did_stop) { data.printTime += deltaDuration(); - - if (duration() > data.longestPrint) - data.longestPrint = duration(); - - saveStats(); - return true; + if (completed) { + data.finishedPrints++; + if (duration() > data.longestPrint) + data.longestPrint = duration(); + } } - else return false; + saveStats(); + return did_stop; } // @Override diff --git a/Marlin/src/module/printcounter.h b/Marlin/src/module/printcounter.h index f7fc96c579..4deae45a65 100644 --- a/Marlin/src/module/printcounter.h +++ b/Marlin/src/module/printcounter.h @@ -74,13 +74,15 @@ class PrintCounter: public Stopwatch { */ static constexpr millis_t updateInterval = SEC_TO_MS(10); - /** - * @brief Interval in seconds between EEPROM saves - * @details This const value defines what will be the time between each - * EEPROM save cycle, the development team recommends to set this value - * no lower than 3600 secs (1 hour). - */ - static constexpr uint16_t saveInterval = 3600; + #if PRINTCOUNTER_SAVE_INTERVAL > 0 + /** + * @brief Interval in seconds between EEPROM saves + * @details This const value defines what will be the time between each + * EEPROM save cycle, the development team recommends to set this value + * no lower than 3600 secs (1 hour). + */ + static constexpr millis_t saveInterval = MIN_TO_MS(PRINTCOUNTER_SAVE_INTERVAL); + #endif /** * @brief Timestamp of the last call to deltaDuration() @@ -173,7 +175,10 @@ class PrintCounter: public Stopwatch { * The following functions are being overridden */ static bool start(); - static bool stop(); + static bool _stop(const bool completed); + static inline bool stop() { return _stop(true); } + static inline bool abort() { return _stop(false); } + static void reset(); #if HAS_SERVICE_INTERVALS From 5fb8818ae520e8868feea977acb8dd3e0fab1335 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 28 Jan 2021 10:11:25 +1300 Subject: [PATCH 0945/1370] ZONESTAR_LCD warning for RAMPS / ReARM (#20702) --- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 4 ++++ Marlin/src/pins/ramps/pins_RAMPS.h | 1 + buildroot/tests/mega2560-tests | 2 +- buildroot/tests/sanguino1284p-tests | 9 ++++++++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 7d0f494c34..65840308ca 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -325,6 +325,10 @@ #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) +#elif ENABLED(ZONESTAR_LCD) + + #error "CAUTION! ZONESTAR_LCD on REARM requires wiring modifications. NB. ADCs are not 5V tolerant. Comment out this line to continue." + #elif IS_TFTGLCD_PANEL #if ENABLED(TFTGLCD_PANEL_SPI) diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index ab5711bd5c..5bcd877dcd 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -468,6 +468,7 @@ #elif ENABLED(ZONESTAR_LCD) + #error "CAUTION! ZONESTAR_LCD on RAMPS requires wiring modifications. It plugs into AUX2 but GND and 5V need to be swapped. Comment out this line to continue." #define LCD_PINS_RS 64 #define LCD_PINS_ENABLE 44 #define LCD_PINS_D4 63 diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 4125bf87fa..105258d402 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -72,7 +72,7 @@ opt_set TEMP_SENSOR_1 1 opt_set TEMP_SENSOR_2 1 opt_set TEMP_SENSOR_3 1 opt_set TEMP_SENSOR_4 1 -opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ +opt_enable VIKI2 Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests index a513f095f9..55cdf418da 100755 --- a/buildroot/tests/sanguino1284p-tests +++ b/buildroot/tests/sanguino1284p-tests @@ -7,7 +7,7 @@ set -e # -# Build with the default configurations +# Start with default configurations... # restore_configs opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 @@ -16,6 +16,13 @@ opt_enable MINIPANEL USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE opt_set CONTROLLER_FAN_PIN 27 exec_test $1 $2 "Default Configuration | MINIPANAL | CONTROLLER_FAN" "$3" +# +# Start with default configurations... +# +restore_configs +opt_set MOTHERBOARD BOARD_MELZI +opt_enable ZONESTAR_LCD +exec_test $1 $2 "Default Configuration | ZONESTAR_LCD " "$3" # clean up restore_configs From 7a559e47332b19da66e9b0247dfeca9be599466f Mon Sep 17 00:00:00 2001 From: Scott Mudge <19617165+scottmudge@users.noreply.github.com> Date: Wed, 27 Jan 2021 16:18:20 -0500 Subject: [PATCH 0946/1370] MeatPack followup (#20896) --- Marlin/src/feature/meatpack.cpp | 61 ++++++++++----------------------- 1 file changed, 18 insertions(+), 43 deletions(-) diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index ea14b44c46..5a5358d614 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -45,7 +45,6 @@ MeatPack meatpack; #define MeatPack_ProtocolVersion "PV01" -//#define MEATPACK_LOOKUP_TABLE //#define MP_DEBUG #define DEBUG_OUT ENABLED(MP_DEBUG) @@ -59,35 +58,13 @@ uint8_t MeatPack::cmd_count = 0, // Counts how many command bytes are r MeatPack::char_out_count = 0; // Stores number of characters to be read out. uint8_t MeatPack::char_out_buf[2]; // Output buffer for caching up to 2 characters -#if ENABLED(MEATPACK_LOOKUP_TABLE) - // The 15 most-common characters used in G-code, ~90-95% of all G-code uses these characters - // Stored in SRAM for performance. - static const uint8_t meatPackLookupTable[16] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - '.', ' ', '\n', 'G', 'X', - '\0' // Unused. 0b1111 indicates a literal character - }; -#endif - -uint8_t MeatPack::unpacked_char(register const uint8_t in) { - #if ENABLED(MEATPACK_LOOKUP_TABLE) - - return meatPackLookupTable[in]; - - #else - - switch (in) { - case 0b0000 ... 0b1001: return '0' + in; - case 0b1010: return '.'; - case 0b1011: return (state & MPConfig_Bit_NoSpaces) ? kSpaceCharReplace : ' '; - case 0b1100: return '\n'; - case 0b1101: return 'G'; - case 0b1110: return 'X'; - } - return 0; - - #endif -} +// The 15 most-common characters used in G-code, ~90-95% of all G-code uses these characters +// Stored in SRAM for performance. +uint8_t meatPackLookupTable[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '.', ' ', '\n', 'G', 'X', + '\0' // Unused. 0b1111 indicates a literal character +}; TERN_(MP_DEBUG, uint8_t chars_decoded = 0); // Log the first 64 bytes after each reset @@ -112,7 +89,7 @@ uint8_t MeatPack::unpack_chars(const uint8_t pk, uint8_t* __restrict const chars out = kFirstCharIsLiteral; else { const uint8_t chr = pk & 0x0F; - chars_out[0] = unpacked_char(chr); // Set the first char + chars_out[0] = meatPackLookupTable[(uint8_t)chr]; // Set the first char } // Check if upper nybble is 1111... if so, we don't need the second char. @@ -120,7 +97,7 @@ uint8_t MeatPack::unpack_chars(const uint8_t pk, uint8_t* __restrict const chars out |= kSecondCharIsLiteral; else { const uint8_t chr = (pk >> 4) & 0x0F; - chars_out[1] = unpacked_char(chr); // Set the second char + chars_out[1] = meatPackLookupTable[(uint8_t)chr]; // Set the second char } return out; @@ -184,18 +161,18 @@ void MeatPack::handle_output_char(const uint8_t c) { */ void MeatPack::handle_command(const MeatPack_Command c) { switch (c) { + case MPCommand_QueryConfig: break; case MPCommand_EnablePacking: SBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] ENA REC"); break; case MPCommand_DisablePacking: CBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] DIS REC"); break; case MPCommand_TogglePacking: TBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] TGL REC"); break; case MPCommand_ResetAll: reset_state(); DEBUG_ECHOLNPGM("[MPDBG] RESET REC"); break; - case MPCommand_EnableNoSpaces: SBI(state, MPConfig_Bit_NoSpaces); DEBUG_ECHOLNPGM("[MPDBG] ENA NSP"); - TERN_(USE_LOOKUP_TABLE, MeatPackLookupTbl[kSpaceCharIdx] = kSpaceCharReplace); - break; - case MPCommand_DisableNoSpaces: CBI(state, MPConfig_Bit_NoSpaces); DEBUG_ECHOLNPGM("[MPDBG] DIS NSP"); - TERN_(USE_LOOKUP_TABLE, MeatPackLookupTbl[kSpaceCharIdx] = ' '); - break; + case MPCommand_EnableNoSpaces: + SBI(state, MPConfig_Bit_NoSpaces); + meatPackLookupTable[kSpaceCharIdx] = kSpaceCharReplace; DEBUG_ECHOLNPGM("[MPDBG] ENA NSP"); break; + case MPCommand_DisableNoSpaces: + CBI(state, MPConfig_Bit_NoSpaces); + meatPackLookupTable[kSpaceCharIdx] = ' '; DEBUG_ECHOLNPGM("[MPDBG] DIS NSP"); break; default: DEBUG_ECHOLNPGM("[MPDBG] UNK CMD REC"); - case MPCommand_QueryConfig: break; } report_state(); } @@ -204,11 +181,9 @@ void MeatPack::report_state() { // NOTE: if any configuration vars are added below, the outgoing sync text for host plugin // should not contain the "PV' substring, as this is used to indicate protocol version SERIAL_ECHOPGM("[MP] "); - SERIAL_ECHOPGM(MeatPack_ProtocolVersion); + SERIAL_ECHOPGM(MeatPack_ProtocolVersion " "); serialprint_onoff(TEST(state, MPConfig_Bit_Active)); - SERIAL_CHAR(' '); - serialprintPGM(TEST(state, MPConfig_Bit_NoSpaces) ? PSTR("NSP") : PSTR("ESP")); - SERIAL_EOL(); + serialprintPGM(TEST(state, MPConfig_Bit_NoSpaces) ? PSTR(" NSP\n") : PSTR(" ESP\n")); } /** From be058430b4c354d14a6f79bd1ec2a0f19e3896ec Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 27 Jan 2021 15:22:55 -0600 Subject: [PATCH 0947/1370] Remove extra cast --- Marlin/src/feature/meatpack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 5a5358d614..7dd856c8a7 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -89,7 +89,7 @@ uint8_t MeatPack::unpack_chars(const uint8_t pk, uint8_t* __restrict const chars out = kFirstCharIsLiteral; else { const uint8_t chr = pk & 0x0F; - chars_out[0] = meatPackLookupTable[(uint8_t)chr]; // Set the first char + chars_out[0] = meatPackLookupTable[chr]; // Set the first char } // Check if upper nybble is 1111... if so, we don't need the second char. @@ -97,7 +97,7 @@ uint8_t MeatPack::unpack_chars(const uint8_t pk, uint8_t* __restrict const chars out |= kSecondCharIsLiteral; else { const uint8_t chr = (pk >> 4) & 0x0F; - chars_out[1] = meatPackLookupTable[(uint8_t)chr]; // Set the second char + chars_out[1] = meatPackLookupTable[chr]; // Set the second char } return out; From b10b76e882b3f07a53e6da13b7735d1ef012bb17 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 28 Jan 2021 20:46:17 +1300 Subject: [PATCH 0948/1370] MeatPack followup - unused command (#20893) --- Marlin/src/feature/meatpack.cpp | 1 - Marlin/src/feature/meatpack.h | 1 - 2 files changed, 2 deletions(-) diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 7dd856c8a7..631fa042db 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -164,7 +164,6 @@ void MeatPack::handle_command(const MeatPack_Command c) { case MPCommand_QueryConfig: break; case MPCommand_EnablePacking: SBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] ENA REC"); break; case MPCommand_DisablePacking: CBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] DIS REC"); break; - case MPCommand_TogglePacking: TBI(state, MPConfig_Bit_Active); DEBUG_ECHOLNPGM("[MPDBG] TGL REC"); break; case MPCommand_ResetAll: reset_state(); DEBUG_ECHOLNPGM("[MPDBG] RESET REC"); break; case MPCommand_EnableNoSpaces: SBI(state, MPConfig_Bit_NoSpaces); diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h index b89f87844f..b895bcae50 100644 --- a/Marlin/src/feature/meatpack.h +++ b/Marlin/src/feature/meatpack.h @@ -64,7 +64,6 @@ */ enum MeatPack_Command : uint8_t { MPCommand_None = 0, - MPCommand_TogglePacking = 0xFD, MPCommand_EnablePacking = 0xFB, MPCommand_DisablePacking = 0xFA, MPCommand_ResetAll = 0xF9, From 8da8e7d17b09ac8e47fea4e1b231d952a3d639f4 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 28 Jan 2021 20:47:12 +1300 Subject: [PATCH 0949/1370] Meatpack::report_state on serial port init (#20903) Co-authored-by: Scott Lahteine --- Marlin/src/core/serial.cpp | 2 +- Marlin/src/core/serial.h | 4 +- Marlin/src/feature/meatpack.cpp | 4 +- Marlin/src/feature/meatpack.h | 2 +- Marlin/src/feature/spindle_laser.h | 2 +- Marlin/src/gcode/host/M118.cpp | 2 +- Marlin/src/gcode/queue.cpp | 64 +++++++++++++++--------------- Marlin/src/gcode/queue.h | 13 +++--- Marlin/src/sd/cardreader.cpp | 2 +- Marlin/src/sd/cardreader.h | 2 +- 10 files changed, 48 insertions(+), 49 deletions(-) diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 7e53f38517..5871c61f99 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -34,7 +34,7 @@ PGMSTR(SP_X_STR, " X"); PGMSTR(SP_Y_STR, " Y"); PGMSTR(SP_Z_STR, " Z"); PGMST PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMSTR(SP_E_LBL, " E:"); #if HAS_MULTI_SERIAL - int8_t serial_port_index = 0; + serial_index_t serial_port_index = 0; #endif void serialprintPGM(PGM_P str) { diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 1dd3cd9cd0..ae1ef4169f 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -61,9 +61,11 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // +typedef int8_t serial_index_t; #define SERIAL_BOTH 0x7F + #if HAS_MULTI_SERIAL - extern int8_t serial_port_index; + extern serial_index_t serial_port_index; #define _PORT_REDIRECT(n,p) REMEMBER(n,serial_port_index,p) #define _PORT_RESTORE(n) RESTORE(n) diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 631fa042db..cd6d8ce6b9 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -74,7 +74,6 @@ void MeatPack::reset_state() { second_char = 0; cmd_count = full_char_count = char_out_count = 0; TERN_(MP_DEBUG, chars_decoded = 0); - report_state(); } /** @@ -189,7 +188,7 @@ void MeatPack::report_state() { * Interpret a single character received from serial * according to the current meatpack state. */ -void MeatPack::handle_rx_char(const uint8_t c) { +void MeatPack::handle_rx_char(const uint8_t c, const serial_index_t serial_ind) { if (c == kCommandByte) { // A command (0xFF) byte? if (cmd_count) { // In fact, two in a row? cmd_is_next = true; // Then a MeatPack command follows @@ -201,6 +200,7 @@ void MeatPack::handle_rx_char(const uint8_t c) { } if (cmd_is_next) { // Were two command bytes received? + PORT_REDIRECT(serial_ind); handle_command((MeatPack_Command)c); // Then the byte is a MeatPack command cmd_is_next = false; return; diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h index b895bcae50..2641130bd8 100644 --- a/Marlin/src/feature/meatpack.h +++ b/Marlin/src/feature/meatpack.h @@ -101,7 +101,7 @@ private: // Pass in a character rx'd by SD card or serial. Automatically parses command/ctrl sequences, // and will control state internally. - static void handle_rx_char(const uint8_t c); + static void handle_rx_char(const uint8_t c, const serial_index_t serial_ind); /** * After passing in rx'd char using above method, call this to get characters out. diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 57fc136c8c..d50bc7eb42 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -157,7 +157,7 @@ public: #elif CUTTER_UNIT_IS(RPM) 2 #else - #error "CUTTER_UNIT_IS(???)" + #error "CUTTER_UNIT_IS(unknown)" #endif )); } diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 27207b7172..7a77861e2b 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -53,7 +53,7 @@ void GcodeSuite::M118() { } #if HAS_MULTI_SERIAL - const int8_t old_serial = serial_port_index; + const serial_index_t old_serial = serial_port_index; if (WITHIN(port, 0, NUM_SERIAL)) serial_port_index = ( port == 0 ? SERIAL_BOTH diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 51fec7d41c..1059997edb 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -89,7 +89,7 @@ char GCodeQueue::command_buffer[BUFSIZE][MAX_CMD_SIZE]; * The port that the command was received on */ #if HAS_MULTI_SERIAL - int16_t GCodeQueue::port[BUFSIZE]; + serial_index_t GCodeQueue::port[BUFSIZE]; #endif /** @@ -136,11 +136,11 @@ void GCodeQueue::clear() { */ void GCodeQueue::_commit_command(bool say_ok #if HAS_MULTI_SERIAL - , int16_t p/*=-1*/ + , serial_index_t serial_ind/*=-1*/ #endif ) { send_ok[index_w] = say_ok; - TERN_(HAS_MULTI_SERIAL, port[index_w] = p); + TERN_(HAS_MULTI_SERIAL, port[index_w] = serial_ind); TERN_(POWER_LOSS_RECOVERY, recovery.commit_sdpos(index_w)); if (++index_w >= BUFSIZE) index_w = 0; length++; @@ -153,14 +153,14 @@ void GCodeQueue::_commit_command(bool say_ok */ bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/ #if HAS_MULTI_SERIAL - , int16_t pn/*=-1*/ + , serial_index_t serial_ind/*=-1*/ #endif ) { if (*cmd == ';' || length >= BUFSIZE) return false; strcpy(command_buffer[index_w], cmd); _commit_command(say_ok #if HAS_MULTI_SERIAL - , pn + , serial_ind #endif ); return true; @@ -289,9 +289,9 @@ void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { */ void GCodeQueue::ok_to_send() { #if HAS_MULTI_SERIAL - const int16_t pn = command_port(); - if (pn < 0) return; - PORT_REDIRECT(pn); // Reply to the serial port that sent the command + const serial_index_t serial_ind = command_port(); + if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive + PORT_REDIRECT(serial_ind); // Reply to the serial port that sent the command #endif if (!send_ok[index_r]) return; SERIAL_ECHOPGM(STR_OK); @@ -314,14 +314,14 @@ void GCodeQueue::ok_to_send() { * indicate that a command needs to be re-sent. */ void GCodeQueue::flush_and_request_resend() { - const int16_t pn = command_port(); + const serial_index_t serial_ind = command_port(); #if HAS_MULTI_SERIAL - if (pn < 0) return; - PORT_REDIRECT(pn); // Reply to the serial port that sent the command + if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive + PORT_REDIRECT(serial_ind); // Reply to the serial port that sent the command #endif SERIAL_FLUSH(); SERIAL_ECHOPGM(STR_RESEND); - SERIAL_ECHOLN(last_N[pn] + 1); + SERIAL_ECHOLN(last_N[serial_ind] + 1); ok_to_send(); } @@ -348,14 +348,14 @@ inline int read_serial(const uint8_t index) { } } -void GCodeQueue::gcode_line_error(PGM_P const err, const int8_t pn) { - PORT_REDIRECT(pn); // Reply to the serial port that sent the command +void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { + PORT_REDIRECT(serial_ind); // Reply to the serial port that sent the command SERIAL_ERROR_START(); serialprintPGM(err); - SERIAL_ECHOLN(last_N[pn]); - while (read_serial(pn) != -1); // Clear out the RX buffer + SERIAL_ECHOLN(last_N[serial_ind]); + while (read_serial(serial_ind) != -1); // Clear out the RX buffer flush_and_request_resend(); - serial_count[pn] = 0; + serial_count[serial_ind] = 0; } FORCE_INLINE bool is_M29(const char * const cmd) { // matches "M29" & "M29 ", but not "M290", etc @@ -473,13 +473,13 @@ void GCodeQueue::get_serial_commands() { * Loop while serial characters are incoming and the queue is not full */ while (length < BUFSIZE && serial_data_available()) { - LOOP_L_N(i, NUM_SERIAL) { + LOOP_L_N(p, NUM_SERIAL) { - const int c = read_serial(i); + const int c = read_serial(p); if (c < 0) continue; #if ENABLED(MEATPACK) - meatpack.handle_rx_char(uint8_t(c)); + meatpack.handle_rx_char(uint8_t(c), p); char c_res[2] = { 0, 0 }; const uint8_t char_count = meatpack.get_result_char(c_res); #else @@ -492,10 +492,10 @@ void GCodeQueue::get_serial_commands() { if (ISEOL(serial_char)) { // Reset our state, continue if the line was empty - if (process_line_done(serial_input_state[i], serial_line_buffer[i], serial_count[i])) + if (process_line_done(serial_input_state[p], serial_line_buffer[p], serial_count[p])) continue; - char* command = serial_line_buffer[i]; + char* command = serial_line_buffer[p]; while (*command == ' ') command++; // Skip leading spaces char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line @@ -511,25 +511,25 @@ void GCodeQueue::get_serial_commands() { const long gcode_N = strtol(npos + 1, nullptr, 10); - if (gcode_N != last_N[i] + 1 && !M110) - return gcode_line_error(PSTR(STR_ERR_LINE_NO), i); + if (gcode_N != last_N[p] + 1 && !M110) + return gcode_line_error(PSTR(STR_ERR_LINE_NO), p); char *apos = strrchr(command, '*'); if (apos) { uint8_t checksum = 0, count = uint8_t(apos - command); while (count) checksum ^= command[--count]; if (strtol(apos + 1, nullptr, 10) != checksum) - return gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), i); + return gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), p); } else - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); + return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); - last_N[i] = gcode_N; + last_N[p] = gcode_N; } #if ENABLED(SDSUPPORT) // Pronterface "M29" and "M29 " has no line number else if (card.flag.saving && !is_M29(command)) - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); + return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); #endif // @@ -547,7 +547,7 @@ void GCodeQueue::get_serial_commands() { #if ENABLED(BEZIER_CURVE_SUPPORT) case 5: #endif - PORT_REDIRECT(i); // Reply to the serial port that sent the command + PORT_REDIRECT(p); // Reply to the serial port that sent the command SERIAL_ECHOLNPGM(STR_ERR_STOPPED); LCD_MESSAGEPGM(MSG_STOPPED); break; @@ -569,14 +569,14 @@ void GCodeQueue::get_serial_commands() { #endif // Add the command to the queue - _enqueue(serial_line_buffer[i], true + _enqueue(serial_line_buffer[p], true #if HAS_MULTI_SERIAL - , i + , p #endif ); } else - process_stream_char(serial_char, serial_input_state[i], serial_line_buffer[i], serial_count[i]); + process_stream_char(serial_char, serial_input_state[p], serial_line_buffer[p], serial_count[p]); } // char_count loop diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 57d4beecb8..d677146a7d 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -56,12 +56,9 @@ public: * The port that the command was received on */ #if HAS_MULTI_SERIAL - static int16_t port[BUFSIZE]; + static serial_index_t port[BUFSIZE]; #endif - - static int16_t command_port() { - return TERN0(HAS_MULTI_SERIAL, port[index_r]); - } + static inline serial_index_t command_port() { return TERN0(HAS_MULTI_SERIAL, port[index_r]); } GCodeQueue(); @@ -159,13 +156,13 @@ private: static void _commit_command(bool say_ok #if HAS_MULTI_SERIAL - , int16_t p=-1 + , serial_index_t serial_ind=-1 #endif ); static bool _enqueue(const char* cmd, bool say_ok=false #if HAS_MULTI_SERIAL - , int16_t p=-1 + , serial_index_t serial_ind=-1 #endif ); @@ -181,7 +178,7 @@ private: */ static bool enqueue_one(const char* cmd); - static void gcode_line_error(PGM_P const err, const int8_t pn); + static void gcode_line_error(PGM_P const err, const serial_index_t serial_ind); }; diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 307f31e431..2e9101ff84 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -1229,7 +1229,7 @@ void CardReader::fileHasFinished() { uint8_t CardReader::auto_report_sd_interval = 0; millis_t CardReader::next_sd_report_ms; #if HAS_MULTI_SERIAL - int8_t CardReader::auto_report_port; + serial_index_t CardReader::auto_report_port; #endif void CardReader::auto_report_sd_status() { diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 7a312b1b57..272e213800 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -267,7 +267,7 @@ private: static uint8_t auto_report_sd_interval; static millis_t next_sd_report_ms; #if HAS_MULTI_SERIAL - static int8_t auto_report_port; + static serial_index_t auto_report_port; #endif #endif From efa1e563696aeed4d5668c231f0c1e7b3ffffcbc Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Thu, 28 Jan 2021 09:02:06 +0100 Subject: [PATCH 0950/1370] Refactor serial class with templates (#20783) --- Marlin/src/HAL/AVR/HAL.cpp | 7 + Marlin/src/HAL/AVR/HAL.h | 10 +- Marlin/src/HAL/AVR/MarlinSerial.cpp | 195 ++------------- Marlin/src/HAL/AVR/MarlinSerial.h | 91 +++---- Marlin/src/HAL/DUE/HAL.cpp | 7 + Marlin/src/HAL/DUE/HAL.h | 15 +- Marlin/src/HAL/DUE/MarlinSerial.cpp | 166 +------------ Marlin/src/HAL/DUE/MarlinSerial.h | 43 +--- Marlin/src/HAL/DUE/MarlinSerialUSB.cpp | 157 +----------- Marlin/src/HAL/DUE/MarlinSerialUSB.h | 47 +--- Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp | 4 +- .../src/HAL/ESP32/FlushableHardwareSerial.cpp | 5 +- .../src/HAL/ESP32/FlushableHardwareSerial.h | 7 +- Marlin/src/HAL/ESP32/HAL.cpp | 4 + Marlin/src/HAL/ESP32/HAL.h | 4 +- Marlin/src/HAL/ESP32/WebSocketSerial.cpp | 6 +- Marlin/src/HAL/ESP32/WebSocketSerial.h | 7 +- Marlin/src/HAL/LINUX/HAL.cpp | 2 +- Marlin/src/HAL/LINUX/HAL.h | 2 +- Marlin/src/HAL/LINUX/include/serial.h | 102 +------- Marlin/src/HAL/LPC1768/HAL.cpp | 2 + Marlin/src/HAL/LPC1768/HAL.h | 11 +- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 8 +- Marlin/src/HAL/LPC1768/MarlinSerial.h | 22 +- Marlin/src/HAL/SAMD51/HAL.cpp | 5 + Marlin/src/HAL/SAMD51/HAL.h | 14 +- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp | 6 +- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h | 10 +- Marlin/src/HAL/STM32/HAL.cpp | 4 + Marlin/src/HAL/STM32/HAL.h | 11 +- Marlin/src/HAL/STM32/MarlinSerial.cpp | 2 +- Marlin/src/HAL/STM32/MarlinSerial.h | 38 ++- Marlin/src/HAL/STM32F1/HAL.cpp | 1 + Marlin/src/HAL/STM32F1/HAL.h | 5 +- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 20 +- Marlin/src/HAL/STM32F1/MarlinSerial.h | 33 +-- Marlin/src/HAL/STM32F1/msc_sd.cpp | 2 +- Marlin/src/HAL/STM32F1/msc_sd.h | 20 +- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 3 + Marlin/src/HAL/TEENSY31_32/HAL.h | 12 +- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 3 + Marlin/src/HAL/TEENSY35_36/HAL.h | 12 +- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 3 + Marlin/src/HAL/TEENSY40_41/HAL.h | 14 +- Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/core/macros.h | 26 ++ Marlin/src/core/serial.cpp | 17 +- Marlin/src/core/serial.h | 34 +-- Marlin/src/core/serial_base.h | 146 +++++++++++ Marlin/src/core/serial_hook.h | 230 ++++++++++++++++++ Marlin/src/feature/binary_stream.h | 18 +- Marlin/src/feature/host_actions.cpp | 10 +- .../src/gcode/feature/network/M552-M554.cpp | 3 +- Marlin/src/gcode/gcode.cpp | 4 +- Marlin/src/gcode/host/M118.cpp | 13 +- Marlin/src/gcode/queue.cpp | 12 +- Marlin/src/gcode/sd/M1001.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 1 + Marlin/src/lcd/extui/malyan_lcd.cpp | 4 +- Marlin/src/module/temperature.cpp | 4 +- Marlin/src/sd/cardreader.cpp | 12 +- Marlin/src/sd/cardreader.h | 2 +- buildroot/tests/run_tests | 2 +- docs/Serial.md | 44 ++++ 64 files changed, 782 insertions(+), 948 deletions(-) create mode 100644 Marlin/src/core/serial_base.h create mode 100644 Marlin/src/core/serial_hook.h create mode 100644 docs/Serial.md diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp index 58d57c8ee5..4c45a5d78e 100644 --- a/Marlin/src/HAL/AVR/HAL.cpp +++ b/Marlin/src/HAL/AVR/HAL.cpp @@ -24,6 +24,13 @@ #include "../../inc/MarlinConfig.h" #include "HAL.h" +#ifdef USBCON + DefaultSerial MSerial(false, Serial); + #ifdef BLUETOOTH + BTSerial btSerial(false, bluetoothSerial); + #endif +#endif + // ------------------------ // Public Variables // ------------------------ diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 8b95acb0ac..2b565bbe13 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -82,7 +82,15 @@ typedef int8_t pin_t; // Serial ports #ifdef USBCON - #define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial) + #include "../../core/serial_hook.h" + typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; + extern DefaultSerial MSerial; + #ifdef BLUETOOTH + typedef ForwardSerial0Type< decltype(bluetoothSerial) > BTSerial; + extern BTSerial btSerial; + #endif + + #define MYSERIAL0 TERN(BLUETOOTH, btSerial, MSerial) #else #if !WITHIN(SERIAL_PORT, -1, 3) #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 63599efd41..904395de1d 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -454,7 +454,7 @@ void MarlinSerial::flush() { } template -void MarlinSerial::write(const uint8_t c) { +size_t MarlinSerial::write(const uint8_t c) { if (Cfg::TX_SIZE == 0) { _written = true; @@ -480,7 +480,7 @@ void MarlinSerial::write(const uint8_t c) { // location". This makes sure flush() won't return until the bytes // actually got written B_TXC = 1; - return; + return 1; } const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); @@ -510,6 +510,7 @@ void MarlinSerial::write(const uint8_t c) { // Enable TX ISR - Non atomic, but it will eventually enable TX ISR B_UDRIE = 1; } + return 1; } template @@ -556,161 +557,6 @@ void MarlinSerial::flushTX() { } } -/** - * Imports from print.h - */ - -template -void MarlinSerial::print(char c, int base) { - print((long)c, base); -} - -template -void MarlinSerial::print(unsigned char b, int base) { - print((unsigned long)b, base); -} - -template -void MarlinSerial::print(int n, int base) { - print((long)n, base); -} - -template -void MarlinSerial::print(unsigned int n, int base) { - print((unsigned long)n, base); -} - -template -void MarlinSerial::print(long n, int base) { - if (base == 0) write(n); - else if (base == 10) { - if (n < 0) { print('-'); n = -n; } - printNumber(n, 10); - } - else - printNumber(n, base); -} - -template -void MarlinSerial::print(unsigned long n, int base) { - if (base == 0) write(n); - else printNumber(n, base); -} - -template -void MarlinSerial::print(double n, int digits) { - printFloat(n, digits); -} - -template -void MarlinSerial::println() { - print('\r'); - print('\n'); -} - -template -void MarlinSerial::println(const String& s) { - print(s); - println(); -} - -template -void MarlinSerial::println(const char c[]) { - print(c); - println(); -} - -template -void MarlinSerial::println(char c, int base) { - print(c, base); - println(); -} - -template -void MarlinSerial::println(unsigned char b, int base) { - print(b, base); - println(); -} - -template -void MarlinSerial::println(int n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(unsigned int n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(long n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(unsigned long n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(double n, int digits) { - print(n, digits); - println(); -} - -// Private Methods - -template -void MarlinSerial::printNumber(unsigned long n, uint8_t base) { - if (n) { - unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 - int8_t i = 0; - while (n) { - buf[i++] = n % base; - n /= base; - } - while (i--) - print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); - } - else - print('0'); -} - -template -void MarlinSerial::printFloat(double number, uint8_t digits) { - // Handle negative numbers - if (number < 0.0) { - print('-'); - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - LOOP_L_N(i, digits) rounding *= 0.1; - number += rounding; - - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); - - // Print the decimal point, but only if there are digits beyond - if (digits) { - print('.'); - // Extract digits from the remainder one at a time - while (digits--) { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } - } -} - // Hookup ISR handlers ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) { MarlinSerial>::store_rxd_char(); @@ -720,11 +566,9 @@ ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) { MarlinSerial>::_tx_udr_empty_irq(); } -// Preinstantiate -template class MarlinSerial>; - -// Instantiate -MarlinSerial> customizedSerial1; +// Because of the template definition above, it's required to instantiate the template to have all method generated +template class MarlinSerial< MarlinSerialCfg >; +MSerialT customizedSerial1(MSerialT::HasEmergencyParser); #ifdef SERIAL_PORT_2 @@ -737,12 +581,8 @@ MarlinSerial> customizedSerial1; MarlinSerial>::_tx_udr_empty_irq(); } - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> customizedSerial2; - + template class MarlinSerial< MarlinSerialCfg >; + MSerialT2 customizedSerial2(MSerialT2::HasEmergencyParser); #endif #ifdef MMU2_SERIAL_PORT @@ -755,12 +595,8 @@ MarlinSerial> customizedSerial1; MarlinSerial>::_tx_udr_empty_irq(); } - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> mmuSerial; - + template class MarlinSerial< MarlinSerialCfg >; + MSerialT3 mmuSerial(MSerialT3::HasEmergencyParser); #endif #ifdef LCD_SERIAL_PORT @@ -773,12 +609,9 @@ MarlinSerial> customizedSerial1; MarlinSerial>::_tx_udr_empty_irq(); } - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> lcdSerial; - + template class MarlinSerial< LCDSerialCfg >; + MSerialT4 lcdSerial(MSerialT4::HasEmergencyParser); + #if HAS_DGUS_LCD template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::get_tx_buffer_free() { @@ -796,7 +629,7 @@ MarlinSerial> customizedSerial1; // For AT90USB targets use the UART for BT interfacing #if defined(USBCON) && ENABLED(BLUETOOTH) - HardwareSerial bluetoothSerial; + MSerialT5 bluetoothSerial(false); #endif #endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 8a0423d143..93a3fb84d1 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -34,6 +34,7 @@ #include #include "../../inc/MarlinConfigPre.h" +#include "../../core/serial_hook.h" #ifndef SERIAL_PORT #define SERIAL_PORT 0 @@ -135,10 +136,6 @@ UART_DECL(3); #endif - #define DEC 10 - #define HEX 16 - #define OCT 8 - #define BIN 2 #define BYTE 0 // Templated type selector @@ -202,60 +199,30 @@ static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value); static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail(); - public: - + public: FORCE_INLINE static void store_rxd_char(); FORCE_INLINE static void _tx_udr_empty_irq(); - public: - MarlinSerial() {}; - static void begin(const long); - static void end(); - static int peek(); - static int read(); - static void flush(); - static ring_buffer_pos_t available(); - static void write(const uint8_t c); - static void flushTX(); - #if HAS_DGUS_LCD - static ring_buffer_pos_t get_tx_buffer_free(); - #endif + public: + static void begin(const long); + static void end(); + static int peek(); + static int read(); + static void flush(); + static ring_buffer_pos_t available(); + static size_t write(const uint8_t c); + static void flushTX(); + #if HAS_DGUS_LCD + static ring_buffer_pos_t get_tx_buffer_free(); + #endif - static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } + enum { HasEmergencyParser = Cfg::EMERGENCYPARSER }; + static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } - FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } - FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } - FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } - FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; } - - FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } - FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } - FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } - FORCE_INLINE static void print(const char* str) { write(str); } - - static void print(char, int = BYTE); - static void print(unsigned char, int = BYTE); - static void print(int, int = DEC); - static void print(unsigned int, int = DEC); - static void print(long, int = DEC); - static void print(unsigned long, int = DEC); - static void print(double, int = 2); - - static void println(const String& s); - static void println(const char[]); - static void println(char, int = BYTE); - static void println(unsigned char, int = BYTE); - static void println(int, int = DEC); - static void println(unsigned int, int = DEC); - static void println(long, int = DEC); - static void println(unsigned long, int = DEC); - static void println(double, int = 2); - static void println(); - operator bool() { return true; } - - private: - static void printNumber(unsigned long, const uint8_t); - static void printFloat(double, uint8_t); + FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } + FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } + FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } + FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; } }; template @@ -270,12 +237,13 @@ static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS); static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); }; - extern MarlinSerial> customizedSerial1; + + typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT; + extern MSerialT customizedSerial1; #ifdef SERIAL_PORT_2 - - extern MarlinSerial> customizedSerial2; - + typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT2; + extern MSerialT2 customizedSerial2; #endif #endif // !USBCON @@ -294,7 +262,8 @@ static constexpr bool RX_OVERRUNS = false; }; - extern MarlinSerial> mmuSerial; + typedef Serial0Type< MarlinSerial< MMU2SerialCfg > > MSerialT3; + extern MSerial3 mmuSerial; #endif #ifdef LCD_SERIAL_PORT @@ -322,11 +291,13 @@ #endif }; - extern MarlinSerial> lcdSerial; + typedef Serial0Type< MarlinSerial< LCDSerialCfg > > MSerialT4; + extern MSerialT4 lcdSerial; #endif // Use the UART for Bluetooth in AT90USB configurations #if defined(USBCON) && ENABLED(BLUETOOTH) - extern HardwareSerial bluetoothSerial; + typedef Serial0Type MSerialT5; + extern MSerialT5 bluetoothSerial; #endif diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index 6ce85a4643..2ae70843f0 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -102,4 +102,11 @@ uint16_t HAL_adc_get_result() { return HAL_adc_result; } +// Forward the default serial port +DefaultSerial MSerial(false, Serial); + +DefaultSerial1 MSerial1(false, Serial1); +DefaultSerial2 MSerial2(false, Serial2); +DefaultSerial3 MSerial3(false, Serial3); + #endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 6a4d4f6149..78c8a800b9 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -36,9 +36,20 @@ #include -#define _MSERIAL(X) Serial##X +#include "../../core/serial_hook.h" +typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; +extern DefaultSerial MSerial; + +typedef ForwardSerial0Type< decltype(Serial1) > DefaultSerial1; +typedef ForwardSerial0Type< decltype(Serial2) > DefaultSerial2; +typedef ForwardSerial0Type< decltype(Serial3) > DefaultSerial3; +extern DefaultSerial1 MSerial1; +extern DefaultSerial2 MSerial2; +extern DefaultSerial3 MSerial3; + +#define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define Serial0 Serial +#define MSerial0 MSerial // Define MYSERIAL0/1 before MarlinSerial includes! #if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER) diff --git a/Marlin/src/HAL/DUE/MarlinSerial.cpp b/Marlin/src/HAL/DUE/MarlinSerial.cpp index c9a372eeb1..50b84c0b1d 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerial.cpp @@ -382,7 +382,7 @@ void MarlinSerial::flush() { } template -void MarlinSerial::write(const uint8_t c) { +size_t MarlinSerial::write(const uint8_t c) { _written = true; if (Cfg::TX_SIZE == 0) { @@ -400,7 +400,7 @@ void MarlinSerial::write(const uint8_t c) { // XOFF char at the RX isr, but it is properly handled there if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) { HWUART->UART_THR = c; - return; + return 1; } const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); @@ -428,6 +428,7 @@ void MarlinSerial::write(const uint8_t c) { // Enable TX isr - Non atomic, but it will eventually enable TX isr HWUART->UART_IER = UART_IER_TXRDY; } + return 1; } template @@ -473,169 +474,16 @@ void MarlinSerial::flushTX() { } } -/** - * Imports from print.h - */ - -template -void MarlinSerial::print(char c, int base) { - print((long)c, base); -} - -template -void MarlinSerial::print(unsigned char b, int base) { - print((unsigned long)b, base); -} - -template -void MarlinSerial::print(int n, int base) { - print((long)n, base); -} - -template -void MarlinSerial::print(unsigned int n, int base) { - print((unsigned long)n, base); -} - -template -void MarlinSerial::print(long n, int base) { - if (base == 0) write(n); - else if (base == 10) { - if (n < 0) { print('-'); n = -n; } - printNumber(n, 10); - } - else - printNumber(n, base); -} - -template -void MarlinSerial::print(unsigned long n, int base) { - if (base == 0) write(n); - else printNumber(n, base); -} - -template -void MarlinSerial::print(double n, int digits) { - printFloat(n, digits); -} - -template -void MarlinSerial::println() { - print('\r'); - print('\n'); -} - -template -void MarlinSerial::println(const String& s) { - print(s); - println(); -} - -template -void MarlinSerial::println(const char c[]) { - print(c); - println(); -} - -template -void MarlinSerial::println(char c, int base) { - print(c, base); - println(); -} - -template -void MarlinSerial::println(unsigned char b, int base) { - print(b, base); - println(); -} - -template -void MarlinSerial::println(int n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(unsigned int n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(long n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(unsigned long n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(double n, int digits) { - print(n, digits); - println(); -} - -// Private Methods -template -void MarlinSerial::printNumber(unsigned long n, uint8_t base) { - if (n) { - unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 - int8_t i = 0; - while (n) { - buf[i++] = n % base; - n /= base; - } - while (i--) - print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); - } - else - print('0'); -} - -template -void MarlinSerial::printFloat(double number, uint8_t digits) { - // Handle negative numbers - if (number < 0.0) { - print('-'); - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - LOOP_L_N(i, digits) rounding *= 0.1; - number += rounding; - - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); - - // Print the decimal point, but only if there are digits beyond - if (digits) { - print('.'); - // Extract digits from the remainder one at a time - while (digits--) { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } - } -} // If not using the USB port as serial port #if SERIAL_PORT >= 0 - template class MarlinSerial>; // Define - MarlinSerial> customizedSerial1; // Instantiate + template class MarlinSerial< MarlinSerialCfg >; + MSerialT customizedSerial1(MarlinSerialCfg::EMERGENCYPARSER); #endif #if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - template class MarlinSerial>; // Define - MarlinSerial> customizedSerial2; // Instantiate + template class MarlinSerial< MarlinSerialCfg >; + MSerialT2 customizedSerial2(MarlinSerialCfg::EMERGENCYPARSER); #endif #endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h index a194eba2f3..7fc21264bb 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.h +++ b/Marlin/src/HAL/DUE/MarlinSerial.h @@ -30,11 +30,7 @@ #include #include "../../inc/MarlinConfigPre.h" - -#define DEC 10 -#define HEX 16 -#define OCT 8 -#define BIN 2 +#include "../../core/serial_hook.h" // Define constants and variables for buffering incoming serial data. We're // using a ring buffer (I think), in which rx_buffer_head is the index of the @@ -119,7 +115,7 @@ public: static int read(); static void flush(); static ring_buffer_pos_t available(); - static void write(const uint8_t c); + static size_t write(const uint8_t c); static void flushTX(); static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } @@ -128,35 +124,6 @@ public: FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; } - - FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } - FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } - FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } - FORCE_INLINE static void print(const char* str) { write(str); } - - static void print(char, int = 0); - static void print(unsigned char, int = 0); - static void print(int, int = DEC); - static void print(unsigned int, int = DEC); - static void print(long, int = DEC); - static void print(unsigned long, int = DEC); - static void print(double, int = 2); - - static void println(const String& s); - static void println(const char[]); - static void println(char, int = 0); - static void println(unsigned char, int = 0); - static void println(int, int = DEC); - static void println(unsigned int, int = DEC); - static void println(long, int = DEC); - static void println(unsigned long, int = DEC); - static void println(double, int = 2); - static void println(); - operator bool() { return true; } - -private: - static void printNumber(unsigned long, const uint8_t); - static void printFloat(double, uint8_t); }; // Serial port configuration @@ -174,9 +141,11 @@ struct MarlinSerialCfg { }; #if SERIAL_PORT >= 0 - extern MarlinSerial> customizedSerial1; + typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT; + extern MSerialT customizedSerial1; #endif #if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - extern MarlinSerial> customizedSerial2; + typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT2; + extern MSerialT2 customizedSerial2; #endif diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp index a41dbfeb7a..d85aaf14b0 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp @@ -50,10 +50,6 @@ extern "C" { // Pending character static int pending_char = -1; -#if ENABLED(EMERGENCY_PARSER) - static EmergencyParser::State emergency_state; // = EP_RESET -#endif - // Public Methods void MarlinSerialUSB::begin(const long) {} @@ -111,13 +107,13 @@ bool MarlinSerialUSB::available() { void MarlinSerialUSB::flush() { } void MarlinSerialUSB::flushTX() { } -void MarlinSerialUSB::write(const uint8_t c) { +size_t MarlinSerialUSB::write(const uint8_t c) { /* Do not even bother sending anything if USB CDC is not enumerated or not configured on the PC side or there is no program on the PC listening to our messages */ if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) - return; + return 0; /* Wait until the PC has read the pending to be sent data */ while (usb_task_cdc_isenabled() && @@ -129,161 +125,20 @@ void MarlinSerialUSB::write(const uint8_t c) { or not configured on the PC side or there is no program on the PC listening to our messages at this point */ if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) - return; + return 0; // Fifo full // udi_cdc_signal_overrun(); udi_cdc_putc(c); -} - -/** - * Imports from print.h - */ - -void MarlinSerialUSB::print(char c, int base) { - print((long)c, base); -} - -void MarlinSerialUSB::print(unsigned char b, int base) { - print((unsigned long)b, base); -} - -void MarlinSerialUSB::print(int n, int base) { - print((long)n, base); -} - -void MarlinSerialUSB::print(unsigned int n, int base) { - print((unsigned long)n, base); -} - -void MarlinSerialUSB::print(long n, int base) { - if (base == 0) - write(n); - else if (base == 10) { - if (n < 0) { - print('-'); - n = -n; - } - printNumber(n, 10); - } - else - printNumber(n, base); -} - -void MarlinSerialUSB::print(unsigned long n, int base) { - if (base == 0) write(n); - else printNumber(n, base); -} - -void MarlinSerialUSB::print(double n, int digits) { - printFloat(n, digits); -} - -void MarlinSerialUSB::println() { - print('\r'); - print('\n'); -} - -void MarlinSerialUSB::println(const String& s) { - print(s); - println(); -} - -void MarlinSerialUSB::println(const char c[]) { - print(c); - println(); -} - -void MarlinSerialUSB::println(char c, int base) { - print(c, base); - println(); -} - -void MarlinSerialUSB::println(unsigned char b, int base) { - print(b, base); - println(); -} - -void MarlinSerialUSB::println(int n, int base) { - print(n, base); - println(); -} - -void MarlinSerialUSB::println(unsigned int n, int base) { - print(n, base); - println(); -} - -void MarlinSerialUSB::println(long n, int base) { - print(n, base); - println(); -} - -void MarlinSerialUSB::println(unsigned long n, int base) { - print(n, base); - println(); -} - -void MarlinSerialUSB::println(double n, int digits) { - print(n, digits); - println(); -} - -// Private Methods - -void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) { - if (n) { - unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 - int8_t i = 0; - while (n) { - buf[i++] = n % base; - n /= base; - } - while (i--) - print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); - } - else - print('0'); -} - -void MarlinSerialUSB::printFloat(double number, uint8_t digits) { - // Handle negative numbers - if (number < 0.0) { - print('-'); - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - LOOP_L_N(i, digits) - rounding *= 0.1; - - number += rounding; - - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); - - // Print the decimal point, but only if there are digits beyond - if (digits) { - print('.'); - // Extract digits from the remainder one at a time - while (digits--) { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } - } + return 1; } // Preinstantiate #if SERIAL_PORT == -1 - MarlinSerialUSB customizedSerial1; + MSerialT customizedSerial1(TERN0(EMERGENCY_PARSER, true)); #endif #if SERIAL_PORT_2 == -1 - MarlinSerialUSB customizedSerial2; + MSerialT customizedSerial2(TERN0(EMERGENCY_PARSER, true)); #endif #endif // HAS_USB_SERIAL diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h index 2e3622e553..9643a8465a 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.h @@ -27,20 +27,13 @@ */ #include "../../inc/MarlinConfig.h" - #if HAS_USB_SERIAL #include +#include "../../core/serial_hook.h" -#define DEC 10 -#define HEX 16 -#define OCT 8 -#define BIN 2 -class MarlinSerialUSB { - -public: - MarlinSerialUSB() {}; +struct MarlinSerialUSB { static void begin(const long); static void end(); static int peek(); @@ -48,7 +41,7 @@ public: static void flush(); static void flushTX(); static bool available(); - static void write(const uint8_t c); + static size_t write(const uint8_t c); #if ENABLED(SERIAL_STATS_DROPPED_RX) FORCE_INLINE static uint32_t dropped() { return 0; } @@ -57,43 +50,15 @@ public: #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) FORCE_INLINE static int rxMaxEnqueued() { return 0; } #endif - - FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } - FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } - FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } - FORCE_INLINE static void print(const char* str) { write(str); } - - static void print(char, int = 0); - static void print(unsigned char, int = 0); - static void print(int, int = DEC); - static void print(unsigned int, int = DEC); - static void print(long, int = DEC); - static void print(unsigned long, int = DEC); - static void print(double, int = 2); - - static void println(const String& s); - static void println(const char[]); - static void println(char, int = 0); - static void println(unsigned char, int = 0); - static void println(int, int = DEC); - static void println(unsigned int, int = DEC); - static void println(long, int = DEC); - static void println(unsigned long, int = DEC); - static void println(double, int = 2); - static void println(); - operator bool() { return true; } - -private: - static void printNumber(unsigned long, const uint8_t); - static void printFloat(double, uint8_t); }; +typedef Serial0Type MSerialT; #if SERIAL_PORT == -1 - extern MarlinSerialUSB customizedSerial1; + extern MSerialT customizedSerial1; #endif #if SERIAL_PORT_2 == -1 - extern MarlinSerialUSB customizedSerial2; + extern MSerialT customizedSerial2; #endif #endif // HAS_USB_SERIAL diff --git a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp index db5e82ec55..d92d332c1e 100644 --- a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp +++ b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp @@ -68,7 +68,7 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) { { char buffer[80]; sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr); - PORT_REDIRECT(0); + PORT_REDIRECT(SERIAL_PORTMASK(0)); SERIAL_ECHO(buffer); } #endif @@ -108,7 +108,7 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) { { char buffer[80]; sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr); - PORT_REDIRECT(0); + PORT_REDIRECT(SERIAL_PORTMASK(0)); SERIAL_ECHO(buffer); } #endif diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp index d4b2f42c53..cc5a4fc476 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp @@ -24,10 +24,7 @@ #ifdef ARDUINO_ARCH_ESP32 -FlushableHardwareSerial::FlushableHardwareSerial(int uart_nr) - : HardwareSerial(uart_nr) -{} -FlushableHardwareSerial flushableSerial(0); +Serial0Type flushableSerial(false, 0); #endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h index b43caea13c..27df0be4b6 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h @@ -24,14 +24,13 @@ #ifdef ARDUINO_ARCH_ESP32 #include +#include "../../core/serial_hook.h" class FlushableHardwareSerial : public HardwareSerial { public: - FlushableHardwareSerial(int uart_nr); - - inline void flushTX() { /* No need to flush the hardware serial, but defined here for compatibility. */ } + FlushableHardwareSerial(int uart_nr) : HardwareSerial(uart_nr) {} }; -extern FlushableHardwareSerial flushableSerial; +extern Serial0Type flushableSerial; #endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index ead448d78d..6ff1446b1c 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -40,6 +40,10 @@ #endif #endif +#if ENABLED(ESP3D_WIFISUPPORT) + DefaultSerial MSerial(false, Serial2Socket); +#endif + // ------------------------ // Externs // ------------------------ diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index d485b5d1d3..3dc27c6493 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -55,7 +55,9 @@ extern portMUX_TYPE spinlock; #if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) #if ENABLED(ESP3D_WIFISUPPORT) - #define MYSERIAL1 Serial2Socket + typedef ForwardSerial0Type< decltype(Serial2Socket) > DefaultSerial; + extern DefaultSerial MSerial; + #define MYSERIAL1 MSerial #else #define MYSERIAL1 webSocketSerial #endif diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp index ca7f47a1f8..8825742d38 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp @@ -29,7 +29,7 @@ #include "wifi.h" #include -WebSocketSerial webSocketSerial; +MSerialT webSocketSerial(false); AsyncWebSocket ws("/ws"); // TODO Move inside the class. // RingBuffer impl @@ -144,9 +144,5 @@ size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) { return written; } -void WebSocketSerial::flushTX() { - // No need to do anything as there's no benefit to sending partial lines over the websocket connection. -} - #endif // WIFISUPPORT #endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.h b/Marlin/src/HAL/ESP32/WebSocketSerial.h index 7a25c6dc5e..c68792c8c1 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.h +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.h @@ -22,6 +22,7 @@ #pragma once #include "../../inc/MarlinConfig.h" +#include "../../core/serial_hook.h" #include @@ -68,12 +69,9 @@ public: int peek(); int read(); void flush(); - void flushTX(); size_t write(const uint8_t c); size_t write(const uint8_t* buffer, size_t size); - operator bool() { return true; } - #if ENABLED(SERIAL_STATS_DROPPED_RX) FORCE_INLINE uint32_t dropped() { return 0; } #endif @@ -83,4 +81,5 @@ public: #endif }; -extern WebSocketSerial webSocketSerial; +typedef Serial0Type MSerialT; +extern MSerialT webSocketSerial; diff --git a/Marlin/src/HAL/LINUX/HAL.cpp b/Marlin/src/HAL/LINUX/HAL.cpp index ee9e31e140..771f1d2a08 100644 --- a/Marlin/src/HAL/LINUX/HAL.cpp +++ b/Marlin/src/HAL/LINUX/HAL.cpp @@ -24,7 +24,7 @@ #include "../../inc/MarlinConfig.h" #include "../shared/Delay.h" -HalSerial usb_serial; +MSerialT usb_serial(TERN0(EMERGENCY_PARSER, true)); // U8glib required functions extern "C" { diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index 8eaee44cce..e4f4dd3fc3 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -60,7 +60,7 @@ uint8_t _getc(); #define SHARED_SERVOS HAS_SERVOS -extern HalSerial usb_serial; +extern MSerialT usb_serial; #define MYSERIAL0 usb_serial #define ST7920_DELAY_1 DELAY_NS(600) diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h index e916249389..2585be25bf 100644 --- a/Marlin/src/HAL/LINUX/include/serial.h +++ b/Marlin/src/HAL/LINUX/include/serial.h @@ -25,6 +25,7 @@ #if ENABLED(EMERGENCY_PARSER) #include "../../../feature/e_parser.h" #endif +#include "../../../core/serial_hook.h" #include #include @@ -73,19 +74,11 @@ private: volatile uint32_t index_read; }; -class HalSerial { -public: - - #if ENABLED(EMERGENCY_PARSER) - EmergencyParser::State emergency_state; - static inline bool emergency_parser_enabled() { return true; } - #endif - +struct HalSerial { HalSerial() { host_connected = true; } void begin(int32_t) {} - - void end() {} + void end() {} int peek() { uint8_t value; @@ -100,7 +93,7 @@ public: return transmit_buffer.write(c); } - operator bool() { return host_connected; } + bool connected() { return host_connected; } uint16_t available() { return (uint16_t)receive_buffer.available(); @@ -117,92 +110,9 @@ public: while (transmit_buffer.available()) { /* nada */ } } - void printf(const char *format, ...) { - static char buffer[256]; - va_list vArgs; - va_start(vArgs, format); - int length = vsnprintf((char *) buffer, 256, (char const *) format, vArgs); - va_end(vArgs); - if (length > 0 && length < 256) { - if (host_connected) { - for (int i = 0; i < length;) { - if (transmit_buffer.write(buffer[i])) { - ++i; - } - } - } - } - } - - #define DEC 10 - #define HEX 16 - #define OCT 8 - #define BIN 2 - - void print_bin(uint32_t value, uint8_t num_digits) { - uint32_t mask = 1 << (num_digits -1); - for (uint8_t i = 0; i < num_digits; i++) { - if (!(i % 4) && i) write(' '); - if (!(i % 16) && i) write(' '); - if (value & mask) write('1'); - else write('0'); - value <<= 1; - } - } - - void print(const char value[]) { printf("%s" , value); } - void print(char value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 8); - else if (nbase == OCT) printf("%3o", value); - else if (nbase == HEX) printf("%2X", value); - else if (nbase == DEC ) printf("%d", value); - else printf("%c" , value); - } - void print(unsigned char value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 8); - else if (nbase == OCT) printf("%3o", value); - else if (nbase == HEX) printf("%2X", value); - else printf("%u" , value); - } - void print(int value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 16); - else if (nbase == OCT) printf("%6o", value); - else if (nbase == HEX) printf("%4X", value); - else printf("%d", value); - } - void print(unsigned int value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 16); - else if (nbase == OCT) printf("%6o", value); - else if (nbase == HEX) printf("%4X", value); - else printf("%u" , value); - } - void print(long value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 32); - else if (nbase == OCT) printf("%11o", value); - else if (nbase == HEX) printf("%8X", value); - else printf("%ld" , value); - } - void print(unsigned long value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 32); - else if (nbase == OCT) printf("%11o", value); - else if (nbase == HEX) printf("%8X", value); - else printf("%lu" , value); - } - void print(float value, int round = 6) { printf("%f" , value); } - void print(double value, int round = 6) { printf("%f" , value); } - - void println(const char value[]) { printf("%s\n" , value); } - void println(char value, int nbase = 0) { print(value, nbase); println(); } - void println(unsigned char value, int nbase = 0) { print(value, nbase); println(); } - void println(int value, int nbase = 0) { print(value, nbase); println(); } - void println(unsigned int value, int nbase = 0) { print(value, nbase); println(); } - void println(long value, int nbase = 0) { print(value, nbase); println(); } - void println(unsigned long value, int nbase = 0) { print(value, nbase); println(); } - void println(float value, int round = 6) { printf("%f\n" , value); } - void println(double value, int round = 6) { printf("%f\n" , value); } - void println() { print('\n'); } - volatile RingBuffer receive_buffer; volatile RingBuffer transmit_buffer; volatile bool host_connected; }; + +typedef Serial0Type MSerialT; diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index 3614e95385..27aa569fae 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -29,6 +29,8 @@ #include "watchdog.h" #endif +DefaultSerial USBSerial(false, UsbSerial); + uint32_t HAL_adc_reading = 0; // U8glib required functions diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index c65fff4747..1dc4fe6ff9 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -60,12 +60,15 @@ extern "C" volatile uint32_t _millis; #define ST7920_DELAY_3 DELAY_NS(750) #endif +typedef ForwardSerial0Type< decltype(UsbSerial) > DefaultSerial; +extern DefaultSerial USBSerial; + #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) #define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 UsbSerial + #define MYSERIAL0 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else @@ -74,7 +77,7 @@ extern "C" volatile uint32_t _millis; #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 UsbSerial + #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT_2, 0, 3) #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else @@ -84,7 +87,7 @@ extern "C" volatile uint32_t _millis; #ifdef MMU2_SERIAL_PORT #if MMU2_SERIAL_PORT == -1 - #define MMU2_SERIAL UsbSerial + #define MMU2_SERIAL USBSerial #elif WITHIN(MMU2_SERIAL_PORT, 0, 3) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else @@ -94,7 +97,7 @@ extern "C" volatile uint32_t _millis; #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL UsbSerial + #define LCD_SERIAL USBSerial #elif WITHIN(LCD_SERIAL_PORT, 0, 3) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index baad3f8f26..454ace33b2 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -25,19 +25,19 @@ #include "MarlinSerial.h" #if USING_SERIAL_0 - MarlinSerial MSerial(LPC_UART0); + MSerialT MSerial(true, LPC_UART0); extern "C" void UART0_IRQHandler() { MSerial.IRQHandler(); } #endif #if USING_SERIAL_1 - MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1); + MSerialT MSerial1(true, (LPC_UART_TypeDef *) LPC_UART1); extern "C" void UART1_IRQHandler() { MSerial1.IRQHandler(); } #endif #if USING_SERIAL_2 - MarlinSerial MSerial2(LPC_UART2); + MSerialT MSerial2(true, LPC_UART2); extern "C" void UART2_IRQHandler() { MSerial2.IRQHandler(); } #endif #if USING_SERIAL_3 - MarlinSerial MSerial3(LPC_UART3); + MSerialT MSerial3(true, LPC_UART3); extern "C" void UART3_IRQHandler() { MSerial3.IRQHandler(); } #endif diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h index 8d6b64378a..de0f62f006 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.h +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.h @@ -28,6 +28,7 @@ #if ENABLED(EMERGENCY_PARSER) #include "../../feature/e_parser.h" #endif +#include "../../core/serial_hook.h" #ifndef SERIAL_PORT #define SERIAL_PORT 0 @@ -41,27 +42,20 @@ class MarlinSerial : public HardwareSerial { public: - MarlinSerial(LPC_UART_TypeDef *UARTx) : - HardwareSerial(UARTx) - #if ENABLED(EMERGENCY_PARSER) - , emergency_state(EmergencyParser::State::EP_RESET) - #endif - { } + MarlinSerial(LPC_UART_TypeDef *UARTx) : HardwareSerial(UARTx) { } void end() {} #if ENABLED(EMERGENCY_PARSER) bool recv_callback(const char c) override { - emergency_parser.update(emergency_state, c); + emergency_parser.update(static_cast *>(this)->emergency_state, c); return true; // do not discard character } - - EmergencyParser::State emergency_state; - static inline bool emergency_parser_enabled() { return true; } #endif }; -extern MarlinSerial MSerial; -extern MarlinSerial MSerial1; -extern MarlinSerial MSerial2; -extern MarlinSerial MSerial3; +typedef Serial0Type MSerialT; +extern MSerialT MSerial; +extern MSerialT MSerial1; +extern MSerialT MSerial2; +extern MSerialT MSerial3; diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index d985ef3787..a413c4cd80 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -24,6 +24,11 @@ #include #include +#ifdef ADAFRUIT_GRAND_CENTRAL_M4 + DefaultSerial MSerial(false, Serial); + DefaultSerial1 MSerial1(false, Serial1); +#endif + // ------------------------ // Local defines // ------------------------ diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index fd2eb59475..f28583c771 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -32,15 +32,19 @@ #include "MarlinSerial_AGCM4.h" // Serial ports + typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; + extern DefaultSerial MSerial; + typedef ForwardSerial0Type< decltype(Serial1) > DefaultSerial1; + extern DefaultSerial1 MSerial1; // MYSERIAL0 required before MarlinSerial includes! - #define __MSERIAL(X) Serial##X + #define __MSERIAL(X) MSerial##X #define _MSERIAL(X) __MSERIAL(X) #define MSERIAL(X) _MSERIAL(INCREMENT(X)) #if SERIAL_PORT == -1 - #define MYSERIAL0 Serial + #define MYSERIAL0 MSerial #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else @@ -49,7 +53,7 @@ #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 Serial + #define MYSERIAL1 MSerial #elif WITHIN(SERIAL_PORT_2, 0, 3) #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else @@ -59,7 +63,7 @@ #ifdef MMU2_SERIAL_PORT #if MMU2_SERIAL_PORT == -1 - #define MMU2_SERIAL Serial + #define MMU2_SERIAL MSerial #elif WITHIN(MMU2_SERIAL_PORT, 0, 3) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else @@ -69,7 +73,7 @@ #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL Serial + #define LCD_SERIAL MSerial #elif WITHIN(LCD_SERIAL_PORT, 0, 3) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp index fac67cf5a3..ce32eafee5 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp @@ -28,7 +28,7 @@ #include "../../inc/MarlinConfig.h" #if USING_SERIAL_1 - Uart Serial2(&sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX); + UartT Serial2(false, &sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX); void SERCOM4_0_Handler() { Serial2.IrqHandler(); } void SERCOM4_1_Handler() { Serial2.IrqHandler(); } void SERCOM4_2_Handler() { Serial2.IrqHandler(); } @@ -36,7 +36,7 @@ #endif #if USING_SERIAL_2 - Uart Serial3(&sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX); + UartT Serial3(false, &sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX); void SERCOM1_0_Handler() { Serial3.IrqHandler(); } void SERCOM1_1_Handler() { Serial3.IrqHandler(); } void SERCOM1_2_Handler() { Serial3.IrqHandler(); } @@ -44,7 +44,7 @@ #endif #if USING_SERIAL_3 - Uart Serial4(&sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX); + UartT Serial4(false, &sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX); void SERCOM5_0_Handler() { Serial4.IrqHandler(); } void SERCOM5_1_Handler() { Serial4.IrqHandler(); } void SERCOM5_2_Handler() { Serial4.IrqHandler(); } diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h index f3821d8d5a..b7293415d1 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h @@ -20,6 +20,10 @@ */ #pragma once -extern Uart Serial2; -extern Uart Serial3; -extern Uart Serial4; +#include "../../core/serial_hook.h" + +typedef Serial0Type UartT; + +extern UartT Serial2; +extern UartT Serial3; +extern UartT Serial4; diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index c886f9c0b9..b8db5b5e0b 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -28,6 +28,10 @@ #include "../../inc/MarlinConfig.h" #include "../shared/Delay.h" +#ifdef USBCON + DefaultSerial MSerial(false, SerialUSB); +#endif + #if ENABLED(SRAM_EEPROM_EMULATION) #if STM32F7xx #include diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 9d0c421a19..29df0a5c6d 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -39,6 +39,9 @@ #ifdef USBCON #include + #include "../../core/serial_hook.h" + typedef ForwardSerial0Type< decltype(SerialUSB) > DefaultSerial; + extern DefaultSerial MSerial; #endif // ------------------------ @@ -48,7 +51,7 @@ #define MSERIAL(X) _MSERIAL(X) #if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB + #define MYSERIAL0 MSerial #elif WITHIN(SERIAL_PORT, 1, 6) #define MYSERIAL0 MSERIAL(SERIAL_PORT) #else @@ -57,7 +60,7 @@ #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 SerialUSB + #define MYSERIAL1 MSerial #elif WITHIN(SERIAL_PORT_2, 1, 6) #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) #else @@ -67,7 +70,7 @@ #ifdef MMU2_SERIAL_PORT #if MMU2_SERIAL_PORT == -1 - #define MMU2_SERIAL SerialUSB + #define MMU2_SERIAL MSerial #elif WITHIN(MMU2_SERIAL_PORT, 1, 6) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else @@ -77,7 +80,7 @@ #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL SerialUSB + #define LCD_SERIAL MSerial #elif WITHIN(LCD_SERIAL_PORT, 1, 6) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index 4d9177248a..c420ce40cf 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -35,7 +35,7 @@ #define DECLARE_SERIAL_PORT(ser_num) \ void _rx_complete_irq_ ## ser_num (serial_t * obj); \ - MarlinSerial MSerial ## ser_num (USART ## ser_num, &_rx_complete_irq_ ## ser_num); \ + MSerialT MSerial ## ser_num (true, USART ## ser_num, &_rx_complete_irq_ ## ser_num); \ void _rx_complete_irq_ ## ser_num (serial_t * obj) { MSerial ## ser_num ._rx_complete_irq(obj); } #define DECLARE_SERIAL_PORT_EXP(ser_num) DECLARE_SERIAL_PORT(ser_num) diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h index 3611cc78d7..8cc4f0dd4c 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -24,21 +24,15 @@ #include "../../feature/e_parser.h" #endif +#include "../../core/serial_hook.h" + typedef void (*usart_rx_callback_t)(serial_t * obj); -class MarlinSerial : public HardwareSerial { -public: +struct MarlinSerial : public HardwareSerial { MarlinSerial(void* peripheral, usart_rx_callback_t rx_callback) : HardwareSerial(peripheral), _rx_callback(rx_callback) - #if ENABLED(EMERGENCY_PARSER) - , emergency_state(EmergencyParser::State::EP_RESET) - #endif { } - #if ENABLED(EMERGENCY_PARSER) - static inline bool emergency_parser_enabled() { return true; } - #endif - void begin(unsigned long baud, uint8_t config); inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } @@ -46,19 +40,17 @@ public: protected: usart_rx_callback_t _rx_callback; - #if ENABLED(EMERGENCY_PARSER) - EmergencyParser::State emergency_state; - #endif }; -extern MarlinSerial MSerial1; -extern MarlinSerial MSerial2; -extern MarlinSerial MSerial3; -extern MarlinSerial MSerial4; -extern MarlinSerial MSerial5; -extern MarlinSerial MSerial6; -extern MarlinSerial MSerial7; -extern MarlinSerial MSerial8; -extern MarlinSerial MSerial9; -extern MarlinSerial MSerial10; -extern MarlinSerial MSerialLP1; +typedef Serial0Type MSerialT; +extern MSerialT MSerial1; +extern MSerialT MSerial2; +extern MSerialT MSerial3; +extern MSerialT MSerial4; +extern MSerialT MSerial5; +extern MSerialT MSerial6; +extern MSerialT MSerial7; +extern MSerialT MSerial8; +extern MSerialT MSerial9; +extern MSerialT MSerial10; +extern MSerialT MSerialLP1; diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index dfa99d83f4..c1e29a843c 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -84,6 +84,7 @@ #if defined(SERIAL_USB) && !HAS_SD_HOST_DRIVE USBSerial SerialUSB; + DefaultSerial MSerial(false, SerialUSB); #endif uint16_t HAL_adc_result; diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index c7eef639a5..30bf60b6e8 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -61,8 +61,11 @@ #endif #ifdef SERIAL_USB + typedef ForwardSerial0Type< USBSerial > DefaultSerial; + extern DefaultSerial MSerial; + #if !HAS_SD_HOST_DRIVE - #define UsbSerial Serial + #define UsbSerial MSerial #else #define UsbSerial MarlinCompositeSerial #endif diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index 7c9625d64c..c404e81b35 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -28,7 +28,7 @@ // Copied from ~/.platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/usart_private.h // Changed to handle Emergency Parser -static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb, usart_reg_map *regs, MarlinSerial &serial) { +static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb, usart_reg_map *regs, MSerialT &serial) { /* Handle RXNEIE and TXEIE interrupts. * RXNE signifies availability of a byte in DR. * @@ -90,20 +90,20 @@ constexpr bool serial_handles_emergency(int port) { ; } -#define DEFINE_HWSERIAL_MARLIN(name, n) \ - MarlinSerial name(USART##n, \ - BOARD_USART##n##_TX_PIN, \ - BOARD_USART##n##_RX_PIN, \ - serial_handles_emergency(n)); \ - extern "C" void __irq_usart##n(void) { \ +#define DEFINE_HWSERIAL_MARLIN(name, n) \ + MSerialT name(serial_handles_emergency(n),\ + USART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN); \ + extern "C" void __irq_usart##n(void) { \ my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \ } #define DEFINE_HWSERIAL_UART_MARLIN(name, n) \ - MarlinSerial name(UART##n, \ + MSerialT name(serial_handles_emergency(n), \ + UART##n, \ BOARD_USART##n##_TX_PIN, \ - BOARD_USART##n##_RX_PIN, \ - serial_handles_emergency(n)); \ + BOARD_USART##n##_RX_PIN); \ extern "C" void __irq_usart##n(void) { \ my_usart_irq(UART##n->rb, UART##n->wb, UART##n##_BASE, MSerial##n); \ } diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index 6aa94b64ff..692e97e618 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -26,28 +26,13 @@ #include #include "../../inc/MarlinConfigPre.h" -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif +#include "../../core/serial_hook.h" // Increase priority of serial interrupts, to reduce overflow errors #define UART_IRQ_PRIO 1 -class MarlinSerial : public HardwareSerial { -public: - #if ENABLED(EMERGENCY_PARSER) - const bool ep_enabled; - EmergencyParser::State emergency_state; - inline bool emergency_parser_enabled() { return ep_enabled; } - #endif - - MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin, bool TERN_(EMERGENCY_PARSER, ep_capable)) : - HardwareSerial(usart_device, tx_pin, rx_pin) - #if ENABLED(EMERGENCY_PARSER) - , ep_enabled(ep_capable) - , emergency_state(EmergencyParser::State::EP_RESET) - #endif - { } +struct MarlinSerial : public HardwareSerial { + MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) : HardwareSerial(usart_device, tx_pin, rx_pin) { } #ifdef UART_IRQ_PRIO // Shadow the parent methods to set IRQ priority after begin() @@ -62,10 +47,12 @@ public: #endif }; -extern MarlinSerial MSerial1; -extern MarlinSerial MSerial2; -extern MarlinSerial MSerial3; +typedef Serial0Type MSerialT; + +extern MSerialT MSerial1; +extern MSerialT MSerial2; +extern MSerialT MSerial3; #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) - extern MarlinSerial MSerial4; - extern MarlinSerial MSerial5; + extern MSerialT MSerial4; + extern MSerialT MSerial5; #endif diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index ba722b8aeb..548a6dbc57 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -23,7 +23,7 @@ #define PRODUCT_ID 0x29 USBMassStorage MarlinMSC; -MarlinUSBCompositeSerial MarlinCompositeSerial; +Serial0Type MarlinCompositeSerial(true); #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h index 1e4e4c44b1..151287f7a7 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.h +++ b/Marlin/src/HAL/STM32F1/msc_sd.h @@ -18,25 +18,9 @@ #include #include "../../inc/MarlinConfigPre.h" -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - -class MarlinUSBCompositeSerial : public USBCompositeSerial { -public: - MarlinUSBCompositeSerial() : USBCompositeSerial() - #if ENABLED(EMERGENCY_PARSER) - , emergency_state(EmergencyParser::State::EP_RESET) - #endif - { } - - #if ENABLED(EMERGENCY_PARSER) - EmergencyParser::State emergency_state; - inline bool emergency_parser_enabled() { return true; } - #endif -}; +#include "../../core/serial_hook.h" extern USBMassStorage MarlinMSC; -extern MarlinUSBCompositeSerial MarlinCompositeSerial; +extern Serial0Type MarlinCompositeSerial; void MSC_SD_init(); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index 8c3dd83377..51636d29bf 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -31,6 +31,9 @@ #include +DefaultSerial MSerial(false); +USBSerialType USBSerial(false, SerialUSB); + uint16_t HAL_adc_result; static const uint8_t pin2sc1a[] = { diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 11b5564a17..5273b38637 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -50,12 +50,18 @@ #define IS_TEENSY32 1 #endif -#define _MSERIAL(X) Serial##X +#include "../../core/serial_hook.h" +typedef Serial0Type DefaultSerial; +extern DefaultSerial MSerial; +typedef ForwardSerial0Type USBSerialType; +extern USBSerialType USBSerial; + +#define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define Serial0 Serial +#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB + #define MYSERIAL0 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL0 MSERIAL(SERIAL_PORT) #endif diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index 92907353b8..547681de5f 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -31,6 +31,9 @@ #include +DefaultSerial MSerial(false); +USBSerialType USBSerial(false, SerialUSB); + uint16_t HAL_adc_result, HAL_adc_select; static const uint8_t pin2sc1a[] = { diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 1d66fa5184..94c514bf62 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -53,12 +53,18 @@ #define IS_TEENSY35 1 #endif -#define _MSERIAL(X) Serial##X +#include "../../core/serial_hook.h" +typedef Serial0Type DefaultSerial; +extern DefaultSerial MSerial; +typedef ForwardSerial0Type USBSerialType; +extern USBSerialType USBSerial; + +#define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define Serial0 Serial +#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB + #define MYSERIAL0 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL0 MSERIAL(SERIAL_PORT) #endif diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index 5b1b4272f5..26449d7eb2 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -32,6 +32,9 @@ #include +DefaultSerial MSerial(false); +USBSerialType USBSerial(false, SerialUSB); + uint16_t HAL_adc_result, HAL_adc_select; static const uint8_t pin2sc1a[] = { diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index b191c7de5f..6aa1e521a4 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -37,6 +37,10 @@ #include #include +#if HAS_ETHERNET + #include "../../feature/ethernet.h" +#endif + //#define ST7920_DELAY_1 DELAY_NS(600) //#define ST7920_DELAY_2 DELAY_NS(750) //#define ST7920_DELAY_3 DELAY_NS(750) @@ -51,9 +55,15 @@ #define IS_TEENSY41 1 #endif -#define _MSERIAL(X) Serial##X +#include "../../core/serial_hook.h" +typedef Serial0Type DefaultSerial; +extern DefaultSerial MSerial; +typedef ForwardSerial0Type USBSerialType; +extern USBSerialType USBSerial; + +#define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define Serial0 Serial +#define MSerial0 MSerial #if SERIAL_PORT == -1 #define MYSERIAL0 SerialUSB diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 4b6c281de2..ac18128eec 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -920,12 +920,12 @@ void setup() { MYSERIAL0.begin(BAUDRATE); millis_t serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + while (!MYSERIAL0.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #if HAS_MULTI_SERIAL && !HAS_ETHERNET MYSERIAL1.begin(BAUDRATE); serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif SERIAL_ECHOLNPGM("start"); diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 63ef597034..a0ccebc078 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -314,6 +314,32 @@ #endif + // C++11 solution that is standard compliant. is not available on all platform + namespace Private { + template struct enable_if { }; + template struct enable_if { typedef _Tp type; }; + } + // C++11 solution using SFINAE to detect the existance of a member in a class at compile time. + // It creates a HasMember structure containing 'value' set to true if the member exists + #define HAS_MEMBER_IMPL(Member) \ + namespace Private { \ + template struct HasMember_ ## Member { \ + template static Yes& test( decltype(&C::Member) ) ; \ + template static No& test(...); \ + enum { value = sizeof(test(0)) == sizeof(Yes) }; }; \ + } + + // Call the method if it exists, but do nothing if it does not. The method is detected at compile time. + // If the method exists, this is inlined and does not cost anything. Else, an "empty" wrapper is created, returning a default value + #define CALL_IF_EXISTS_IMPL(Return, Method, ...) \ + HAS_MEMBER_IMPL(Method) \ + namespace Private { \ + template FORCE_INLINE typename enable_if::value, Return>::type Call_ ## Method(T * t, Args... a) { return static_cast(t->Method(a...)); } \ + _UNUSED static Return Call_ ## Method(...) { return __VA_ARGS__; } \ + } + #define CALL_IF_EXISTS(Return, That, Method, ...) \ + static_cast(Private::Call_ ## Method(That, ##__VA_ARGS__)) + #else #define MIN_2(a,b) ((a)<(b)?(a):(b)) diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 5871c61f99..365f28ba55 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -23,6 +23,10 @@ #include "serial.h" #include "../inc/MarlinConfig.h" +#if HAS_ETHERNET + #include "../feature/ethernet.h" +#endif + uint8_t marlin_debug_flags = MARLIN_DEBUG_NONE; // Commonly-used strings in serial output @@ -34,7 +38,18 @@ PGMSTR(SP_X_STR, " X"); PGMSTR(SP_Y_STR, " Y"); PGMSTR(SP_Z_STR, " Z"); PGMST PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMSTR(SP_E_LBL, " E:"); #if HAS_MULTI_SERIAL - serial_index_t serial_port_index = 0; + #ifdef SERIAL_CATCHALL + SerialOutputT multiSerial(MYSERIAL, SERIAL_CATCHALL); + #else + #if HAS_ETHERNET + // Runtime checking of the condition variable + ConditionalSerial serialOut1(ethernet.have_telnet_client, MYSERIAL1, false); // Takes reference here + #else + // Don't pay for runtime checking a true variable, instead use the output directly + #define serialOut1 MYSERIAL1 + #endif + SerialOutputT multiSerial(MYSERIAL0, serialOut1); + #endif #endif void serialprintPGM(PGM_P str) { diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index ae1ef4169f..4c0c32f7d8 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -22,10 +22,7 @@ #pragma once #include "../inc/MarlinConfig.h" - -#if HAS_ETHERNET - #include "../feature/ethernet.h" -#endif +#include "serial_hook.h" // Commonly-used strings in serial output extern const char NUL_STR[], SP_P_STR[], SP_T_STR[], @@ -62,40 +59,33 @@ extern uint8_t marlin_debug_flags; // Serial redirection // typedef int8_t serial_index_t; -#define SERIAL_BOTH 0x7F - +#define SERIAL_ALL 0x7F #if HAS_MULTI_SERIAL - extern serial_index_t serial_port_index; - #define _PORT_REDIRECT(n,p) REMEMBER(n,serial_port_index,p) - #define _PORT_RESTORE(n) RESTORE(n) - + #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) + #define SERIAL_ASSERT(P) if(multiSerial.portMask!=(P)){ debugger(); } #ifdef SERIAL_CATCHALL - #define SERIAL_OUT(WHAT, V...) (void)CAT(MYSERIAL,SERIAL_CATCHALL).WHAT(V) + typedef MultiSerial SerialOutputT; #else - #define SERIAL_OUT(WHAT, V...) do{ \ - const bool port2_open = TERN1(HAS_ETHERNET, ethernet.have_telnet_client); \ - if ( serial_port_index == 0 || serial_port_index == SERIAL_BOTH) (void)MYSERIAL0.WHAT(V); \ - if ((serial_port_index == 1 || serial_port_index == SERIAL_BOTH) && port2_open) (void)MYSERIAL1.WHAT(V); \ - }while(0) + typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; #endif - - #define SERIAL_ASSERT(P) if(serial_port_index!=(P)){ debugger(); } + extern SerialOutputT multiSerial; + #define SERIAL_IMPL multiSerial #else #define _PORT_REDIRECT(n,p) NOOP - #define _PORT_RESTORE(n) NOOP - #define SERIAL_OUT(WHAT, V...) (void)MYSERIAL0.WHAT(V) #define SERIAL_ASSERT(P) NOOP + #define SERIAL_IMPL MYSERIAL0 #endif +#define SERIAL_OUT(WHAT, V...) (void)SERIAL_IMPL.WHAT(V) + #define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) -#define PORT_RESTORE() _PORT_RESTORE(1) +#define SERIAL_PORTMASK(P) _BV(P) #define SERIAL_ECHO(x) SERIAL_OUT(print, x) #define SERIAL_ECHO_F(V...) SERIAL_OUT(print, V) #define SERIAL_ECHOLN(x) SERIAL_OUT(println, x) #define SERIAL_PRINT(x,b) SERIAL_OUT(print, x, b) #define SERIAL_PRINTLN(x,b) SERIAL_OUT(println, x, b) -#define SERIAL_PRINTF(V...) SERIAL_OUT(printf, V) #define SERIAL_FLUSH() SERIAL_OUT(flush) #ifdef ARDUINO_ARCH_STM32 diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h new file mode 100644 index 0000000000..b60e3b5788 --- /dev/null +++ b/Marlin/src/core/serial_base.h @@ -0,0 +1,146 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../feature/e_parser.h" +#endif + +#ifndef DEC + #define DEC 10 + #define HEX 16 + #define OCT 8 + #define BIN 2 +#endif + +// flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. +CALL_IF_EXISTS_IMPL(void, flushTX ); +CALL_IF_EXISTS_IMPL(bool, connected, true); + +// Using Curiously Recurring Template Pattern here to avoid virtual table cost when compiling. +// Since the real serial class is known at compile time, this results in compiler writing a completely +// efficient code +template +struct SerialBase { + #if ENABLED(EMERGENCY_PARSER) + const bool ep_enabled; + EmergencyParser::State emergency_state; + inline bool emergency_parser_enabled() { return ep_enabled; } + SerialBase(bool ep_capable) : ep_enabled(ep_capable), emergency_state(EmergencyParser::State::EP_RESET) {} + #else + SerialBase(const bool) {} + #endif + + // Static dispatch methods below: + // The most important method here is where it all ends to: + size_t write(uint8_t c) { return static_cast(this)->write(c); } + // Called when the parser finished processing an instruction, usually build to nothing + void msgDone() { static_cast(this)->msgDone(); } + // Called upon initialization + void begin(const long baudRate) { static_cast(this)->begin(baudRate); } + // Called upon destruction + void end() { static_cast(this)->end(); } + /** Check for available data from the port + @param index The port index, usually 0 */ + bool available(uint8_t index = 0) { return static_cast(this)->available(index); } + /** Read a value from the port + @param index The port index, usually 0 */ + int read(uint8_t index = 0) { return static_cast(this)->read(index); } + // Check if the serial port is connected (usually bypassed) + bool connected() { return static_cast(this)->connected(); } + // Redirect flush + void flush() { static_cast(this)->flush(); } + // Not all implementation have a flushTX, so let's call them only if the child has the implementation + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + + // Glue code here + FORCE_INLINE void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE void print(const char* str) { write(str); } + FORCE_INLINE void print(char c, int base = 0) { print((long)c, base); } + FORCE_INLINE void print(unsigned char c, int base = 0) { print((unsigned long)c, base); } + FORCE_INLINE void print(int c, int base = DEC) { print((long)c, base); } + FORCE_INLINE void print(unsigned int c, int base = DEC) { print((unsigned long)c, base); } + void print(long c, int base = DEC) { if (!base) write(c); write((const uint8_t*)"-", c < 0); printNumber(c < 0 ? -c : c, base); } + void print(unsigned long c, int base = DEC) { printNumber(c, base); } + void print(double c, int digits = 2) { printFloat(c, digits); } + + FORCE_INLINE void println(const char s[]) { print(s); println(); } + FORCE_INLINE void println(char c, int base = 0) { print(c, base); println(); } + FORCE_INLINE void println(unsigned char c, int base = 0) { print(c, base); println(); } + FORCE_INLINE void println(int c, int base = DEC) { print(c, base); println(); } + FORCE_INLINE void println(unsigned int c, int base = DEC) { print(c, base); println(); } + FORCE_INLINE void println(long c, int base = DEC) { print(c, base); println(); } + FORCE_INLINE void println(unsigned long c, int base = DEC) { print(c, base); println(); } + FORCE_INLINE void println(double c, int digits = 2) { print(c, digits); println(); } + void println() { write("\r\n"); } + + // Print a number with the given base + void printNumber(unsigned long n, const uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) write((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else write('0'); + } + + // Print a decimal number + void printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + write('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + LOOP_L_N(i, digits) rounding *= 0.1; + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + printNumber(int_part, 10); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + write('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + printNumber(toPrint, 10); + remainder -= toPrint; + } + } + } +}; + +// All serial instances will be built by chaining the features required for the function in a form of a template +// type definition diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h new file mode 100644 index 0000000000..17cf8bdd7d --- /dev/null +++ b/Marlin/src/core/serial_hook.h @@ -0,0 +1,230 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "serial_base.h" + +// The most basic serial class: it dispatch to the base serial class with no hook whatsoever. This will compile to nothing but the base serial class +template +struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { + typedef SerialBase< BaseSerial > BaseClassT; + + // It's required to implement a write method here to help compiler disambiguate what method to call + using SerialT::write; + using SerialT::flush; + + void msgDone() {} + + bool available(uint8_t index) { return index == 0 && SerialT::available(); } + int read(uint8_t index) { return index == 0 ? SerialT::read() : -1; } + bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } + // We have 2 implementation of the same method in both base class, let's say which one we want + using SerialT::available; + using SerialT::read; + using SerialT::begin; + using SerialT::end; + + using BaseClassT::print; + using BaseClassT::println; + + BaseSerial(const bool e) : BaseClassT(e) {} + + // Forward constructor + template + BaseSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...) {} +}; + +// A serial with a condition checked at runtime for its output +// A bit less efficient than static dispatching but since it's only used for ethernet's serial output right now, it's ok. +template +struct ConditionalSerial : public SerialBase< ConditionalSerial > { + typedef SerialBase< ConditionalSerial > BaseClassT; + + bool & condition; + SerialT & out; + size_t write(uint8_t c) { if (condition) return out.write(c); return 0; } + void flush() { if (condition) out.flush(); } + void begin(long br) { out.begin(br); } + void end() { out.end(); } + + void msgDone() {} + bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } + + bool available(uint8_t index) { return index == 0 && out.available(); } + int read(uint8_t index) { return index == 0 ? out.read() : -1; } + using BaseClassT::available; + using BaseClassT::read; + + ConditionalSerial(bool & conditionVariable, SerialT & out, const bool e) : BaseClassT(e), condition(conditionVariable), out(out) {} +}; + +// A simple foward class that taking a reference to an existing serial instance (likely created in their respective framework) +template +struct ForwardSerial : public SerialBase< ForwardSerial > { + typedef SerialBase< ForwardSerial > BaseClassT; + + SerialT & out; + size_t write(uint8_t c) { return out.write(c); } + void flush() { out.flush(); } + void begin(long br) { out.begin(br); } + void end() { out.end(); } + + void msgDone() {} + // Existing instances implement Arduino's operator bool, so use that if it's available + bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } + + bool available(uint8_t index) { return index == 0 && out.available(); } + int read(uint8_t index) { return index == 0 ? out.read() : -1; } + bool available() { return out.available(); } + int read() { return out.read(); } + + ForwardSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} +}; + +// A class that's can be hooked and unhooked at runtime, useful to capturing the output of the serial interface +template +struct RuntimeSerial : public SerialBase< RuntimeSerial >, public SerialT { + typedef SerialBase< RuntimeSerial > BaseClassT; + typedef void (*WriteHook)(void * userPointer, uint8_t c); + typedef void (*EndOfMessageHook)(void * userPointer); + + WriteHook writeHook; + EndOfMessageHook eofHook; + void * userPointer; + + size_t write(uint8_t c) { + if (writeHook) writeHook(userPointer, c); + return SerialT::write(c); + } + + void msgDone() { + if (eofHook) eofHook(userPointer); + } + + bool available(uint8_t index) { return index == 0 && SerialT::available(); } + int read(uint8_t index) { return index == 0 ? SerialT::read() : -1; } + using SerialT::available; + using SerialT::read; + using SerialT::flush; + using SerialT::begin; + using SerialT::end; + + using BaseClassT::print; + using BaseClassT::println; + + + void setHook(WriteHook writeHook = 0, EndOfMessageHook eofHook = 0, void * userPointer = 0) { + // Order is important here as serial code can be called inside interrupts + // When setting a hook, the user pointer must be set first so if writeHook is called as soon as it's set, it'll be valid + if (userPointer) this->userPointer = userPointer; + this->writeHook = writeHook; + this->eofHook = eofHook; + // Order is important here because of asynchronous access here + // When unsetting a hook, the user pointer must be unset last so that any pending writeHook is still using the old pointer + if (!userPointer) this->userPointer = 0; + } + + RuntimeSerial(const bool e) : BaseClassT(e), writeHook(0), eofHook(0), userPointer(0) {} + + // Forward constructor + template + RuntimeSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...) {} +}; + +// A class that's duplicating its output conditionally to 2 serial interface +template +struct MultiSerial : public SerialBase< MultiSerial > { + typedef SerialBase< MultiSerial > BaseClassT; + + uint8_t portMask; + Serial0T & serial0; + Serial1T & serial1; + + enum Masks { + FirstOutputMask = (1 << offset), + SecondOutputMask = (1 << (offset + 1)), + AllMask = FirstOutputMask | SecondOutputMask, + }; + + size_t write(uint8_t c) { + size_t ret = 0; + if (portMask & FirstOutputMask) ret = serial0.write(c); + if (portMask & SecondOutputMask) ret = serial1.write(c) | ret; + return ret; + } + void msgDone() { + if (portMask & FirstOutputMask) serial0.msgDone(); + if (portMask & SecondOutputMask) serial1.msgDone(); + } + bool available(uint8_t index) { + switch(index) { + case 0 + offset: return serial0.available(); + case 1 + offset: return serial1.available(); + default: return false; + } + } + int read(uint8_t index) { + switch(index) { + case 0 + offset: return serial0.read(); + case 1 + offset: return serial1.read(); + default: return -1; + } + } + void begin(const long br) { + if (portMask & FirstOutputMask) serial0.begin(br); + if (portMask & SecondOutputMask) serial1.begin(br); + } + void end() { + if (portMask & FirstOutputMask) serial0.end(); + if (portMask & SecondOutputMask) serial1.end(); + } + bool connected() { + bool ret = true; + if (portMask & FirstOutputMask) ret = CALL_IF_EXISTS(bool, &serial0, connected); + if (portMask & SecondOutputMask) ret = ret && CALL_IF_EXISTS(bool, &serial1, connected); + return ret; + } + + using BaseClassT::available; + using BaseClassT::read; + + // Redirect flush + void flush() { + if (portMask & FirstOutputMask) serial0.flush(); + if (portMask & SecondOutputMask) serial1.flush(); + } + void flushTX() { + if (portMask & FirstOutputMask) CALL_IF_EXISTS(void, &serial0, flushTX); + if (portMask & SecondOutputMask) CALL_IF_EXISTS(void, &serial1, flushTX); + } + + MultiSerial(Serial0T & serial0, Serial1T & serial1, int8_t mask = AllMask, const bool e = false) : + BaseClassT(e), + portMask(mask), serial0(serial0), serial1(serial1) {} +}; + +// Build the actual serial object depending on current configuration +#define Serial0Type TERN(SERIAL_RUNTIME_HOOK, RuntimeSerial, BaseSerial) +#define ForwardSerial0Type TERN(SERIAL_RUNTIME_HOOK, RuntimeSerial, ForwardSerial) +#ifdef HAS_MULTI_SERIAL + #define Serial1Type ConditionalSerial +#endif diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index 32ebcce2f6..81d6e7184b 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -30,23 +30,11 @@ #endif inline bool bs_serial_data_available(const uint8_t index) { - switch (index) { - case 0: return MYSERIAL0.available(); - #if HAS_MULTI_SERIAL - case 1: return MYSERIAL1.available(); - #endif - } - return false; + return SERIAL_IMPL.available(index); } inline int bs_read_serial(const uint8_t index) { - switch (index) { - case 0: return MYSERIAL0.read(); - #if HAS_MULTI_SERIAL - case 1: return MYSERIAL1.read(); - #endif - } - return -1; + return SERIAL_IMPL.read(index); } #if ENABLED(BINARY_STREAM_COMPRESSION) @@ -297,7 +285,7 @@ public: millis_t transfer_window = millis() + RX_TIMESLICE; #if ENABLED(SDSUPPORT) - PORT_REDIRECT(card.transfer_port_index); + PORT_REDIRECT(SERIAL_PORTMASK(card.transfer_port_index)); #endif #pragma GCC diagnostic push diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index a8b2b51dfc..5ba3a3e3d2 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -38,7 +38,7 @@ #endif void host_action(PGM_P const pstr, const bool eol) { - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); SERIAL_ECHOPGM("//action:"); serialprintPGM(pstr); if (eol) SERIAL_EOL(); @@ -78,20 +78,20 @@ void host_action(PGM_P const pstr, const bool eol) { PromptReason host_prompt_reason = PROMPT_NOT_DEFINED; void host_action_notify(const char * const message) { - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); host_action(PSTR("notification "), false); SERIAL_ECHOLN(message); } void host_action_notify_P(PGM_P const message) { - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); host_action(PSTR("notification "), false); serialprintPGM(message); SERIAL_EOL(); } void host_action_prompt(PGM_P const ptype, const bool eol=true) { - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); host_action(PSTR("prompt_"), false); serialprintPGM(ptype); if (eol) SERIAL_EOL(); @@ -99,7 +99,7 @@ void host_action(PGM_P const pstr, const bool eol) { void host_action_prompt_plus(PGM_P const ptype, PGM_P const pstr, const char extra_char='\0') { host_action_prompt(ptype, false); - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); SERIAL_CHAR(' '); serialprintPGM(pstr); if (extra_char != '\0') SERIAL_CHAR(extra_char); diff --git a/Marlin/src/gcode/feature/network/M552-M554.cpp b/Marlin/src/gcode/feature/network/M552-M554.cpp index d88c38cb5a..6ea15fefbf 100644 --- a/Marlin/src/gcode/feature/network/M552-M554.cpp +++ b/Marlin/src/gcode/feature/network/M552-M554.cpp @@ -47,7 +47,8 @@ void MAC_report() { Ethernet.MACAddress(mac); SERIAL_ECHOPGM(" MAC: "); LOOP_L_N(i, 6) { - SERIAL_PRINTF("%02X", mac[i]); + if (mac[i] < 16) SERIAL_CHAR('0'); + SERIAL_PRINT(mac[i], HEX); if (i < 5) SERIAL_CHAR(':'); } } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index a29289d8d1..f9173188dc 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -986,6 +986,8 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { } if (!no_ok) queue.ok_to_send(); + + SERIAL_OUT(msgDone); // Call the msgDone serial hook to signal command processing done } /** @@ -995,7 +997,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { void GcodeSuite::process_next_command() { char * const current_command = queue.command_buffer[queue.index_r]; - PORT_REDIRECT(queue.port[queue.index_r]); + PORT_REDIRECT(SERIAL_PORTMASK(queue.port[queue.index_r])); #if ENABLED(POWER_LOSS_RECOVERY) recovery.queue_index_r = queue.index_r; diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 7a77861e2b..73115d5c0a 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -53,21 +53,14 @@ void GcodeSuite::M118() { } #if HAS_MULTI_SERIAL - const serial_index_t old_serial = serial_port_index; + const int8_t old_serial = multiSerial.portMask; if (WITHIN(port, 0, NUM_SERIAL)) - serial_port_index = ( - port == 0 ? SERIAL_BOTH - : port == 1 ? 0 - #if HAS_MULTI_SERIAL - : port == 2 ? 1 - #endif - : SERIAL_PORT - ); + multiSerial.portMask = port ? _BV(port - 1) : SERIAL_ALL; #endif if (hasE) SERIAL_ECHO_START(); if (hasA) SERIAL_ECHOPGM("//"); SERIAL_ECHOLN(p); - TERN_(HAS_MULTI_SERIAL, serial_port_index = old_serial); + TERN_(HAS_MULTI_SERIAL, multiSerial.portMask = old_serial); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 1059997edb..4c42f7e353 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -290,8 +290,8 @@ void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { void GCodeQueue::ok_to_send() { #if HAS_MULTI_SERIAL const serial_index_t serial_ind = command_port(); - if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive - PORT_REDIRECT(serial_ind); // Reply to the serial port that sent the command + if (serial_ind < 0) return; + PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif if (!send_ok[index_r]) return; SERIAL_ECHOPGM(STR_OK); @@ -317,7 +317,7 @@ void GCodeQueue::flush_and_request_resend() { const serial_index_t serial_ind = command_port(); #if HAS_MULTI_SERIAL if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive - PORT_REDIRECT(serial_ind); // Reply to the serial port that sent the command + PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif SERIAL_FLUSH(); SERIAL_ECHOPGM(STR_RESEND); @@ -349,11 +349,11 @@ inline int read_serial(const uint8_t index) { } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { - PORT_REDIRECT(serial_ind); // Reply to the serial port that sent the command + PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command SERIAL_ERROR_START(); serialprintPGM(err); SERIAL_ECHOLN(last_N[serial_ind]); - while (read_serial(serial_ind) != -1); // Clear out the RX buffer + while (read_serial(serial_ind) != -1); // Clear out the RX buffer flush_and_request_resend(); serial_count[serial_ind] = 0; } @@ -547,7 +547,7 @@ void GCodeQueue::get_serial_commands() { #if ENABLED(BEZIER_CURVE_SUPPORT) case 5: #endif - PORT_REDIRECT(p); // Reply to the serial port that sent the command + PORT_REDIRECT(SERIAL_PORTMASK(p)); // Reply to the serial port that sent the command SERIAL_ECHOLNPGM(STR_ERR_STOPPED); LCD_MESSAGEPGM(MSG_STOPPED); break; diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index cba0e51af1..bd355d96ba 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -82,7 +82,7 @@ void GcodeSuite::M1001() { // Announce SD file completion { - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); SERIAL_ECHOLNPGM(STR_FILE_PRINTED); } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 2acda7bd59..712ed39cf1 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -320,6 +320,7 @@ // FSMC/SPI TFT Panels (LVGL) #if ENABLED(TFT_LVGL_UI) #define HAS_TFT_LVGL_UI 1 + #define SERIAL_RUNTIME_HOOK 1 #endif // FSMC/SPI TFT Panels diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index bdbf3802ab..6c55eea16d 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -414,8 +414,8 @@ void update_usb_status(const bool forceUpdate) { // This is mildly different than stock, which // appears to use the usb discovery status. // This is more logical. - if (last_usb_connected_status != MYSERIAL0 || forceUpdate) { - last_usb_connected_status = MYSERIAL0; + if (last_usb_connected_status != MYSERIAL0.connected() || forceUpdate) { + last_usb_connected_status = MYSERIAL0.connected(); write_to_lcd_P(last_usb_connected_status ? PSTR("{R:UC}\r\n") : PSTR("{R:UD}\r\n")); } } diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 589baf7796..139f6b9045 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -253,7 +253,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, */ void Temperature::report_fan_speed(const uint8_t target) { if (target >= FAN_COUNT) return; - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); SERIAL_ECHOLNPAIR("M106 P", target, " S", fan_speed[target]); } #endif @@ -3130,7 +3130,7 @@ void Temperature::tick() { void Temperature::auto_report_temperatures() { if (auto_report_temp_interval && ELAPSED(millis(), next_temp_report_ms)) { next_temp_report_ms = millis() + 1000UL * auto_report_temp_interval; - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); print_heater_states(active_extruder); SERIAL_EOL(); } diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 2e9101ff84..f8489549d6 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -550,12 +550,11 @@ void openFailed(const char * const fname) { void announceOpen(const uint8_t doing, const char * const path) { if (doing) { - PORT_REDIRECT(SERIAL_BOTH); + PORT_REDIRECT(SERIAL_ALL); SERIAL_ECHO_START(); SERIAL_ECHOPGM("Now "); serialprintPGM(doing == 1 ? PSTR("doing") : PSTR("fresh")); SERIAL_ECHOLNPAIR(" file: ", path); - PORT_RESTORE(); } } @@ -617,10 +616,11 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* filesize = file.fileSize(); sdpos = 0; - PORT_REDIRECT(SERIAL_BOTH); - SERIAL_ECHOLNPAIR(STR_SD_FILE_OPENED, fname, STR_SD_SIZE, filesize); - SERIAL_ECHOLNPGM(STR_SD_FILE_SELECTED); - PORT_RESTORE(); + { // Don't remove this block, as the PORT_REDIRECT is a RAII + PORT_REDIRECT(SERIAL_ALL); + SERIAL_ECHOLNPAIR(STR_SD_FILE_OPENED, fname, STR_SD_SIZE, filesize); + SERIAL_ECHOLNPGM(STR_SD_FILE_SELECTED); + } selectFileByName(fname); ui.set_status(longFilename[0] ? longFilename : fname); diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 272e213800..10beea5ec4 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -174,7 +174,7 @@ public: #if ENABLED(AUTO_REPORT_SD_STATUS) static void auto_report_sd_status(); static inline void set_auto_report_interval(uint8_t v) { - TERN_(HAS_MULTI_SERIAL, auto_report_port = serial_port_index); + TERN_(HAS_MULTI_SERIAL, auto_report_port = serialHook.portMask); NOMORE(v, 60); auto_report_sd_interval = v; next_sd_report_ms = millis() + 1000UL * v; diff --git a/buildroot/tests/run_tests b/buildroot/tests/run_tests index a0eef6a05f..c4286f4695 100755 --- a/buildroot/tests/run_tests +++ b/buildroot/tests/run_tests @@ -20,7 +20,7 @@ exec_test () { if [[ -z "$VERBOSE_PLATFORMIO" ]] ; then silent="--silent" else - silent="" + silent="-v" fi if platformio run --project-dir $1 -e $2 $silent; then printf "\033[0;32mPassed\033[0m\n" diff --git a/docs/Serial.md b/docs/Serial.md new file mode 100644 index 0000000000..317f5f8c93 --- /dev/null +++ b/docs/Serial.md @@ -0,0 +1,44 @@ +# Serial port architecture in Marlin + +Marlin is targeting a pletora of different CPU architecture and platforms. Each of these platforms has its own serial interface. +While many provide a Arduino-like Serial class, it's not all of them, and the differences in the existing API create a very complex brain teaser for writing code that works more or less on each platform. + +Moreover, many platform have intrinsic needs about serial port (like forwarding the output on multiple serial port, providing a *serial-like* telnet server, mixing USB-based serial port with SD card emulation) that are difficult to handle cleanly in the other platform serial logic. + + +Starting with version `2.0.9`, Marlin provides a common interface for its serial needs. + +## Common interface + +This interface is declared in `Marlin/src/core/serial_base.h` +Any implementation will need to follow this interface for being used transparently in Marlin's codebase. + +The implementation was written to prioritize performance over abstraction, so the base interface is not using virtual inheritance to avoid the cost of virtual dispatching while calling methods. +Instead, the Curiously Recurring Template Pattern (**CRTP**) is used so that, upon compilation, the interface abstraction does not incur a performance cost. + +Because some platform do not follow the same interface, the missing method in the actual low-level implementation are detected via SFINAE and a wrapper is generated when such method are missing. See `CALL_IF_EXISTS` macro in `Marlin/src/core/macros.h` for the documentation of this technic. + +## Composing the desired feature +The different specificities for each architecture are provided by composing the serial type based on desired functionality. +In the `Marlin/src/core/serial_hook.h` file, the different serial feature are declared and defined in each templated type: +1. `BaseSerial` is a simple 1:1 wrapper to the underlying, Arduino compatible, `Serial`'s class. It derives from it. You'll use this if the platform does not do anything specific for the `Serial` object (for example, if an interrupt callback calls directly the serial **instance** in the platform's framework code, this is not the right class to use). This wrapper is completely inlined so that it does not generate any code upon compilation. `BaseSerial` constructor forwards any parameter to the platform's `Serial`'s constructor. +2. `ForwardSerial` is a composing wrapper. It references an actual Arduino compatible `Serial` instance. You'll use this if the instance is declared in the platform's framework and is being referred directly in the framework. This is not as efficient as the `BaseSerial` implementation since static dereferencing is done for each method call (it'll still be faster than virtual dispatching) +3. `ConditionalSerial` is working a bit like the `ForwardSerial` interface, but it checks a boolean condition before calling the referenced instance. You'll use it when the serial output can be switch off at runtime, for example in a *telnet* like serial output that should not emit any packet if no client is connected. +4. `RuntimeSerial` is providing a runtime-modifiable hooking method for its `write` and `msgDone` method. You'll use it if you need to capture the serial output of Marlin, for example to display the G-Code parser's output on a GUI interface. The hooking interface is setup via the `setHook` method. +5. `MultiSerial` is a runtime modifiable serial output multiplexer. It can output (*respectively input*) to 2 different interface based on a port *mask*. You'll use this if you need to output the same serial stream to multiple port. You can plug a `MultiSerial` to itself to duplicate to more than 2 ports. + +## Plumbing +Since all the types above are using CRTP, it's possible to combine them to get the appropriate functionality. +This is easily done via type definition of the feature. + +For example, to present a serial interface that's outputting to 2 serial port, the first one being hooked at runtime and the second one connected to a runtime switchable telnet client, you'll declare the type to use as: +``` +typedef MultiSerial< RuntimeSerial, ConditionalSerial > Serial0Type; +``` + +## Emergency parser +By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it. +Because of this condition, all underlying type takes a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used. + + +*This document was written by [X-Ryl669](https://blog.cyril.by) and is under [CC-SA license](https://creativecommons.org/licenses/by-sa)* \ No newline at end of file From cc545a73a17ea5e2f5681fce1e250e4e9b3a8bf5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 28 Jan 2021 02:19:12 -0600 Subject: [PATCH 0951/1370] Serial refactor followup --- Marlin/src/sd/cardreader.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 10beea5ec4..14529fbff1 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -174,7 +174,7 @@ public: #if ENABLED(AUTO_REPORT_SD_STATUS) static void auto_report_sd_status(); static inline void set_auto_report_interval(uint8_t v) { - TERN_(HAS_MULTI_SERIAL, auto_report_port = serialHook.portMask); + TERN_(HAS_MULTI_SERIAL, auto_report_port = multiSerial.portMask); NOMORE(v, 60); auto_report_sd_interval = v; next_sd_report_ms = millis() + 1000UL * v; From 07a3ed1d7eea03a0a87fc2736b50c7be2385f0b1 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 29 Jan 2021 14:44:16 +1300 Subject: [PATCH 0952/1370] Fix LED_CONTROL_MENU compile (#20914) --- Marlin/src/lcd/menu/menu_led.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index d9540592d0..552c03a69f 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -123,11 +123,15 @@ void menu_led() { #if ENABLED(LED_CONTROL_MENU) editable.state = leds.lights_on; EDIT_ITEM(bool, MSG_LEDS, &editable.state, leds.toggle); - ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds.set_default); + #if ENABLED(LED_COLOR_PRESETS) + ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds.set_default); + #endif #if ENABLED(NEOPIXEL2_SEPARATE) editable.state = leds2.lights_on; EDIT_ITEM(bool, MSG_LEDS2, &editable.state, leds2.toggle); - ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds2.set_default); + #if ENABLED(NEO2_COLOR_PRESETS) + ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds2.set_default); + #endif #endif #if ENABLED(LED_COLOR_PRESETS) SUBMENU(MSG_LED_PRESETS, menu_led_presets); From c7004d100cb13bd3fab0d6cf5b59b4a30853f067 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 29 Jan 2021 14:44:52 +1300 Subject: [PATCH 0953/1370] Fix undefined G28_STR (#20912) --- Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h index a4ecf5604f..59050acccb 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h @@ -94,3 +94,4 @@ private: }; extern AnycubicTFTClass AnycubicTFT; +extern const char G28_STR[]; From 59d16eb18916ba9514acc825c83fca42e1f6fc2e Mon Sep 17 00:00:00 2001 From: George Fu Date: Fri, 29 Jan 2021 09:52:49 +0800 Subject: [PATCH 0954/1370] FYSETC Cheetah 2.0 (#20897) --- Marlin/src/HAL/STM32/eeprom_flash.cpp | 4 +- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + .../pins/stm32f4/pins_FYSETC_CHEETAH_V20.h | 271 ++++++++++ .../PlatformIO/boards/FYSETC_CHEETAH_V20.json | 66 +++ .../PlatformIO/scripts/fysetc_cheetah_v20.py | 9 + .../FYSETC_CHEETAH_V20/PeripheralPins.c | 266 ++++++++++ .../variants/FYSETC_CHEETAH_V20/PinNamesVar.h | 33 ++ .../FYSETC_CHEETAH_V20/hal_conf_custom.h | 496 ++++++++++++++++++ .../variants/FYSETC_CHEETAH_V20/ldscript.ld | 187 +++++++ .../variants/FYSETC_CHEETAH_V20/variant.cpp | 238 +++++++++ .../variants/FYSETC_CHEETAH_V20/variant.h | 151 ++++++ platformio.ini | 12 + 13 files changed, 1735 insertions(+), 1 deletion(-) create mode 100644 Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h create mode 100644 buildroot/share/PlatformIO/boards/FYSETC_CHEETAH_V20.json create mode 100644 buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py create mode 100644 buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h create mode 100644 buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.h diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index 8cd62879a5..633a286dc8 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -61,7 +61,9 @@ #define FLASH_UNIT_SIZE 0x20000 // 128kB #endif - #define FLASH_ADDRESS_START (FLASH_END - ((FLASH_SECTOR_TOTAL - (FLASH_SECTOR)) * (FLASH_UNIT_SIZE)) + 1) + #ifndef FLASH_ADDRESS_START + #define FLASH_ADDRESS_START (FLASH_END - ((FLASH_SECTOR_TOTAL - (FLASH_SECTOR)) * (FLASH_UNIT_SIZE)) + 1) + #endif #define FLASH_ADDRESS_END (FLASH_ADDRESS_START + FLASH_UNIT_SIZE - 1) #define EEPROM_SLOTS ((FLASH_UNIT_SIZE) / (MARLIN_EEPROM_SIZE)) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 13a202daed..6a34a282e2 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -373,6 +373,7 @@ #define BOARD_MKS_ROBIN_NANO_V3 4220 // MKS Robin Nano V3 (STM32F407VG) #define BOARD_ANET_ET4 4221 // ANET ET4 V1.x (STM32F407VGT6) #define BOARD_ANET_ET4P 4222 // ANET ET4P V1.x (STM32F407VGT6) +#define BOARD_FYSETC_CHEETAH_V20 4223 // FYSETC Cheetah V2.0 // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index f57e8e7dac..45e7f049b0 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -604,6 +604,8 @@ #include "stm32f4/pins_ANET_ET4.h" // STM32F4 env:Anet_ET4_OpenBLT #elif MB(ANET_ET4P) #include "stm32f4/pins_ANET_ET4P.h" // STM32F4 env:Anet_ET4_OpenBLT +#elif MB(FYSETC_CHEETAH_V20) + #include "stm32f4/pins_FYSETC_CHEETAH_V20.h" // STM32F4 env:FYSETC_CHEETAH_V20 // // ARM Cortex M7 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h new file mode 100644 index 0000000000..18e689d1d9 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h @@ -0,0 +1,271 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#endif + +#define DEFAULT_MACHINE_NAME "3D Printer" + +#define BOARD_INFO_NAME "FYSETC Cheetah V2.0" +#define BOARD_WEBSITE_URL "fysetc.com" + +// USB Flash Drive support +//#define HAS_OTG_USB_HOST_SUPPORT + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) + #define FLASH_EEPROM_EMULATION + #define FLASH_EEPROM_LEVELING + + #define FLASH_SECTOR 2 + #define FLASH_UNIT_SIZE 0x4000 // 16k + #define FLASH_ADDRESS_START 0x8008000 +#endif + +// +// Z Probe +// +#if ENABLED(BLTOUCH) + #error "You need to set jumper to 5v for Bltouch, then comment out this line to proceed." + #define SERVO0_PIN PA0 +#elif !defined(Z_MIN_PROBE_PIN) + #define Z_MIN_PROBE_PIN PA0 +#endif + +// +// Limit Switches +// +#define X_STOP_PIN PB4 +#define Y_STOP_PIN PB3 +#define Z_STOP_PIN PB1 + +// +// Filament runout +// +#define FIL_RUNOUT_PIN PB5 + +// +// Steppers +// +#define X_STEP_PIN PC0 +#define X_DIR_PIN PC1 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PC14 +#define Y_DIR_PIN PC13 +#define Y_ENABLE_PIN PC15 + +#define Z_STEP_PIN PB9 +#define Z_DIR_PIN PB8 +#define Z_ENABLE_PIN PC2 + +#define E0_STEP_PIN PB2 +#define E0_DIR_PIN PA15 +#define E0_ENABLE_PIN PD2 + +#if HAS_TMC_UART + #define X_HARDWARE_SERIAL Serial2 + #define Y_HARDWARE_SERIAL Serial2 + #define Z_HARDWARE_SERIAL Serial2 + #define E0_HARDWARE_SERIAL Serial2 + + // Default TMC slave addresses + #ifndef X_SLAVE_ADDRESS + #define X_SLAVE_ADDRESS 0 + #endif + #ifndef Y_SLAVE_ADDRESS + #define Y_SLAVE_ADDRESS 2 + #endif + #ifndef Z_SLAVE_ADDRESS + #define Z_SLAVE_ADDRESS 1 + #endif + #ifndef E0_SLAVE_ADDRESS + #define E0_SLAVE_ADDRESS 3 + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC6 +#define HEATER_BED_PIN PC7 +#ifndef FAN_PIN + #define FAN_PIN PA1 +#endif +#define FAN1_PIN PC8 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PC5 // Analog Input +#define TEMP_0_PIN PC4 // Analog Input + +// +// Misc. Functions +// +#define SDSS PA4 +#define SD_DETECT_PIN PC3 + +#ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PB0 +#endif +#ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB7 +#endif +#ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB6 +#endif + +/** + * _____ _____ + * 5V | 1 2 | GND 5V | 1 2 | GND + * RESET | 3 4 | PC3 (SD_DETECT) (LCD_D7) PB7 | 3 4 | PB6 (LCD_D6) + * (SD_MOSI) PA7 5 6 | PC11 (BTN_EN2) (LCD_D5) PB14 5 6 | PB13 (LCD_D4) + * (SD_SS) PA4 | 7 8 | PC10 (BTN_EN1) (LCD_RS) PB12 | 7 8 | PB15 (LCD_EN) + * (SD_SCK) PA5 | 9 10| PA6 (SD_MISO) (BTN_ENC) PC12 | 9 10| PC9 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ + +/** +* _____ +* (BEEPER) PC9 | 1 2 | PC12 (BTN_ENC) +* (BTN_EN1) PC10 | 3 4 | PB14 (LCD_D5/MISO) +* (BTN_EN2) PC11 5 6 | PB13 (LCD_D4/SCK) +* (LCD_RS) PB12 | 7 8 | PB15 (LCD_EN/MOSI) +* GND | 9 10| 5V +* ----- +* EXP3 +*/ + +#define EXPA1_03_PIN PB7 +#define EXPA1_04_PIN PB6 +#define EXPA1_05_PIN PB14 +#define EXPA1_06_PIN PB13 +#define EXPA1_07_PIN PB12 +#define EXPA1_08_PIN PB15 +#define EXPA1_09_PIN PC12 +#define EXPA1_10_PIN PC9 + +#define EXPA2_03_PIN -1 +#define EXPA2_04_PIN PC3 +#define EXPA2_05_PIN PA7 +#define EXPA2_06_PIN PC11 +#define EXPA2_07_PIN PA4 +#define EXPA2_08_PIN PC10 +#define EXPA2_09_PIN PA5 +#define EXPA2_10_PIN PA6 + +#if HAS_WIRED_LCD + + #define BEEPER_PIN EXPA1_10_PIN + #define BTN_ENC EXPA1_09_PIN + + #if ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS EXPA1_07_PIN + + #define BTN_EN1 EXPA2_08_PIN + #define BTN_EN2 EXPA2_06_PIN + + #define LCD_PINS_ENABLE EXPA1_08_PIN + #define LCD_PINS_D4 EXPA1_06_PIN + + // CR10_STOCKDISPLAY default timing is too fast + #undef BOARD_ST7920_DELAY_1 + #undef BOARD_ST7920_DELAY_2 + #undef BOARD_ST7920_DELAY_3 + + #elif ENABLED(MKS_MINI_12864) + + #define DOGLCD_A0 EXPA1_04_PIN + #define DOGLCD_CS EXPA1_05_PIN + #define BTN_EN1 EXPA2_08_PIN + #define BTN_EN2 EXPA2_06_PIN + + #else + + #define LCD_PINS_RS EXPA1_07_PIN + + #define BTN_EN1 EXPA2_06_PIN + #define BTN_EN2 EXPA2_08_PIN + + #define LCD_PINS_ENABLE EXPA1_08_PIN + #define LCD_PINS_D4 EXPA1_06_PIN + + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS EXPA1_08_PIN + #define DOGLCD_A0 EXPA1_07_PIN + //#define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN EXPA1_05_PIN + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN EXPA1_04_PIN + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN EXPA1_03_PIN + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN EXPA1_05_PIN + #endif + #endif // !FYSETC_MINI_12864 + + #if IS_ULTIPANEL + #define LCD_PINS_D5 EXPA1_05_PIN + #define LCD_PINS_D6 EXPA1_04_PIN + #define LCD_PINS_D7 EXPA1_03_PIN + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + + #endif + + #endif + +#endif // HAS_WIRED_LCD + +// Alter timing for graphical display +#if HAS_MARLINUI_U8GLIB + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #endif +#endif + +#if ENABLED(TOUCH_UI_FTDI_EVE) + #define BEEPER_PIN EXPA1_10_PIN + #define CLCD_MOD_RESET EXPA2_08_PIN + #define CLCD_SPI_CS EXPA2_06_PIN +#endif diff --git a/buildroot/share/PlatformIO/boards/FYSETC_CHEETAH_V20.json b/buildroot/share/PlatformIO/boards/FYSETC_CHEETAH_V20.json new file mode 100644 index 0000000000..ff082fdc1f --- /dev/null +++ b/buildroot/share/PlatformIO/boards/FYSETC_CHEETAH_V20.json @@ -0,0 +1,66 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F401xx", + "f_cpu": "84000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "ldscript": "stm32f401rc.ld", + "mcu": "stm32f401rct6", + "variant": "FYSETC_CHEETAH_V20" + }, + "debug": { + "jlink_device": "STM32F401RC", + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd", + "tools": { + "stlink": { + "server": { + "arguments": [ + "-f", + "scripts/interface/stlink.cfg", + "-c", + "transport select hla_swd", + "-f", + "scripts/target/stm32f4x.cfg", + "-c", + "reset_config none" + ], + "executable": "bin/openocd", + "package": "tool-openocd" + } + } + } + }, + "frameworks": [ + "arduino", + "stm32cube" + ], + "name": "STM32F401RC (64k RAM. 256k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 65536, + "maximum_size": 262144, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "offset_address": "0x800C000", + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://www.fysetc.com", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py b/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py new file mode 100644 index 0000000000..10471d3753 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py @@ -0,0 +1,9 @@ +import os +Import("env") + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/ldscript.ld") +for i, flag in enumerate(env["LINKFLAGS"]): + if "-Wl,-T" in flag: + env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script + elif flag == "-T": + env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c new file mode 100644 index 0000000000..3957069f28 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c @@ -0,0 +1,266 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + * Automatically generated from STM32F401R[(B-C)|(D-E)]Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + {NC, NP, 0} +}; +#endif + +//*** No DAC *** + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, + {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PA_11, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PA_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {NC, NP, 0} +}; +#endif + +//*** No CAN *** + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_FS[] = { +#ifndef ARDUINO_CoreBoard_F401RC + {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID +#endif + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; +#endif + +//*** No USB_OTG_HS *** + +//*** SD *** + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PinNamesVar.h b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PinNamesVar.h new file mode 100644 index 0000000000..e1536bcf30 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PinNamesVar.h @@ -0,0 +1,33 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_SOF = PA_8, + USB_OTG_FS_VBUS = PA_9, + USB_OTG_FS_ID = PA_10, + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, +#endif \ No newline at end of file diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h new file mode 100644 index 0000000000..1b9df2b47a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h @@ -0,0 +1,496 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

      © Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

      + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_CUSTOM +#define __STM32F4xx_HAL_CONF_CUSTOM + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ + /** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +#define HAL_CRC_MODULE_ENABLED +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +//#define HAL_DAC_MODULE_ENABLED +/* #define HAL_DCMI_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +#define HAL_IWDG_MODULE_ENABLED +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +/* #define HAL_QSPI_MODULE_ENABLED */ +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_RNG_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED +/* #define HAL_SAI_MODULE_ENABLED */ +//#define HAL_SD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +/* #define HAL_UART_MODULE_ENABLED */ +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED +#ifndef HAL_PCD_MODULE_ENABLED + #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +#endif +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#ifndef HSE_VALUE +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#ifndef HSE_STARTUP_TIMEOUT +#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#ifndef HSI_VALUE +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#ifndef LSI_VALUE +#define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations +in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#ifndef LSE_VALUE +#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#ifndef LSE_STARTUP_TIMEOUT +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#ifndef EXTERNAL_CLOCK_VALUE +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#if !defined (VDD_VALUE) +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#endif +#if !defined (TICK_INT_PRIORITY) +#define TICK_INT_PRIORITY 0x00U /*!< tick interrupt priority */ +#endif +#if !defined (USE_RTOS) +#define USE_RTOS 0U +#endif +#if !defined (PREFETCH_ENABLE) +#define PREFETCH_ENABLE 1U +#endif +#if !defined (INSTRUCTION_CACHE_ENABLE) +#define INSTRUCTION_CACHE_ENABLE 1U +#endif +#if !defined (DATA_CACHE_ENABLE) +#define DATA_CACHE_ENABLE 1U +#endif + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ +#ifndef USE_SPI_CRC +#define USE_SPI_CRC 0U +#endif + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED +#include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED +#include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED +#include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED +#include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED +#include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED +#include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_CUSTOM_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/ldscript.ld b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/ldscript.ld new file mode 100644 index 0000000000..2dbc5177ac --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/ldscript.ld @@ -0,0 +1,187 @@ +/* +***************************************************************************** +** + +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F401RETx Device with +** 512KByte FLASH, 96KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

      © COPYRIGHT(c) 2014 Ac6

      +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200;; /* required amount of heap */ +_Min_Stack_Size = 0x400;; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +FLASH (rx) : ORIGIN = 0x800C000, LENGTH = 256K +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text ALIGN(4): + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} \ No newline at end of file diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.cpp b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.cpp new file mode 100644 index 0000000000..71f3509ed5 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.cpp @@ -0,0 +1,238 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Digital PinName array +const PinName digitalPin[] = { + PA_0, // Digital pin 0 + PA_1, // Digital pin 1 + PA_2, // Digital pin 2 + PA_3, // Digital pin 3 + PA_4, // Digital pin 4 + PA_5, // Digital pin 5 + PA_6, // Digital pin 6 + PA_7, // Digital pin 7 + PA_8, // Digital pin 8 + PA_9, // Digital pin 9 + PA_10, // Digital pin 10 + PA_11, // Digital pin 11 + PA_12, // Digital pin 12 + PA_13, // Digital pin 13 + PA_14, // Digital pin 14 + PA_15, // Digital pin 15 + + PB_0, // Digital pin 16 + PB_1, // Digital pin 17 + PB_2, // Digital pin 18 + PB_3, // Digital pin 19 + PB_4, // Digital pin 20 + PB_5, // Digital pin 21 + PB_6, // Digital pin 22 + PB_7, // Digital pin 23 + PB_8, // Digital pin 24 + PB_9, // Digital pin 25 + PB_10, // Digital pin 26 + PB_12, // Digital pin 27 + PB_13, // Digital pin 28 + PB_14, // Digital pin 29 + PB_15, // Digital pin 30 + + PC_0, // Digital pin 31 + PC_1, // Digital pin 32 + PC_2, // Digital pin 33 + PC_3, // Digital pin 34 + PC_4, // Digital pin 35 + PC_5, // Digital pin 36 + PC_6, // Digital pin 37 + PC_7, // Digital pin 38 + PC_8, // Digital pin 39 + PC_9, // Digital pin 40 + PC_10, // Digital pin 41 + PC_11, // Digital pin 42 + PC_12, // Digital pin 43 + PC_13, // Digital pin 44 + PC_14, // Digital pin 45 + PC_15, // Digital pin 46 + + PD_2, // Digital pin 47 + + PH_0, // Digital pin 48, used by the external oscillator + PH_1 // Digital pin 49, used by the external oscillator +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 0, // A0, PA0 + 1, // A1, PA1 + 2, // A2, PA2 + 3, // A3, PA3 + 4, // A4, PA4 + 5, // A5, PA5 + 6, // A6, PA6 + 7, // A7, PA7 + 16, // A8, PB0 + 17, // A9, PB1 + 31, // A10, PC0 + 32, // A11, PC1 + 33, // A12, PC2 + 34, // A13, PC3 + 35, // A14, PC4 + 36 // A15, PC5 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * @brief Configures the System clock source, PLL Multiplier and Divider factors, + * AHB/APBx prescalers and Flash settings + * @note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ + +/******************************************************************************/ +/* PLL (clocked by HSE) used as System clock source */ +/******************************************************************************/ +static uint8_t SetSysClock_PLL_HSE(uint8_t bypass) +{ + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + + // Enable HSE oscillator and activate PLL with HSE as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + if (bypass == 0) { + RCC_OscInitStruct.HSEState = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT + } else { + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN + } + + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = HSE_VALUE / 1000000L; // Expects an 8 MHz external clock by default. Redefine HSE_VALUE if not + RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336) + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 84 MHz (336 MHz / 4) + RCC_OscInitStruct.PLL.PLLQ = 7; // USB clock = 48 MHz (336 MHz / 7) --> OK for USB + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 84 MHz + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 84 MHz + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 42 MHz + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 84 MHz + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { + return 0; // FAIL + } + + /* Output clock on MCO1 pin(PA8) for debugging purpose */ + /* + if (bypass == 0) + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz + else + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz + */ + + return 1; // OK +} + +/******************************************************************************/ +/* PLL (clocked by HSI) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_HSI(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + + // Enable HSI oscillator and activate PLL with HSI as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; // VCO input clock = 1 MHz (16 MHz / 16) + RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336) + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 84 MHz (336 MHz / 4) + RCC_OscInitStruct.PLL.PLLQ = 7; // USB clock = 48 MHz (336 MHz / 7) --> freq is ok but not precise enough + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 84 MHz + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 84 MHz + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 42 MHz + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 84 MHz + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { + return 0; // FAIL + } + + /* Output clock on MCO1 pin(PA8) for debugging purpose */ + //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 16 MHz + + return 1; // OK +} + +WEAK void SystemClock_Config(void) +{ + /* 1- If fail try to start with HSE and external xtal */ + if (SetSysClock_PLL_HSE(0) == 0) { + /* 2- Try to start with HSE and external clock */ + if (SetSysClock_PLL_HSE(1) == 0) { + /* 3- If fail start with HSI clock */ + if (SetSysClock_PLL_HSI() == 0) { + Error_Handler(); + } + } + } + /* Output clock on MCO2 pin(PC9) for debugging purpose */ + //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4); +} + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.h b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.h new file mode 100644 index 0000000000..d0fb0d9db0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.h @@ -0,0 +1,151 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + + +// | DIGITAL | ANALOG | USART | TWI | SPI | SPECIAL | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PA0 A0 // | 0 | A0 | | | | | +#define PA1 A1 // | 1 | A1 | | | | | +#define PA2 A2 // | 2 | A2 | USART2_TX | | | | +#define PA3 A3 // | 3 | A3 | USART2_RX | | | | +#define PA4 A4 // | 4 | A4 | | | SPI1_SS, (SPI3_SS) | | +#define PA5 A5 // | 5 | A5 | | | SPI1_SCK | | +#define PA6 A6 // | 6 | A6 | | | SPI1_MISO | | +#define PA7 A7 // | 7 | A7 | | | SPI1_MOSI | | +#define PA8 8 // | 8 | | | TWI3_SCL | | | +#define PA9 9 // | 9 | | USART1_TX | | | | +#define PA10 10 // | 10 | | USART1_RX | | | | +#define PA11 11 // | 11 | | USART6_TX | | | | +#define PA12 12 // | 12 | | USART6_RX | | | | +#define PA13 13 // | 13 | | | | | SWD_SWDIO | +#define PA14 14 // | 14 | | | | | SWD_SWCLK | +#define PA15 15 // | 15 | | | | SPI3_SS, (SPI1_SS) | | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PB0 A8 // | 16 | A8 | | | | | +#define PB1 A9 // | 17 | A9 | | | | | +#define PB2 18 // | 18 | | | | | BOOT1 | +#define PB3 19 // | 19 | | | TWI2_SDA | SPI3_SCK, (SPI1_SCK) | | +#define PB4 20 // | 20 | | | TWI3_SDA | SPI3_MISO, (SPI1_MISO) | | +#define PB5 21 // | 21 | | | | SPI3_MOSI, (SPI1_MOSI) | | +#define PB6 22 // | 22 | | USART1_TX | TWI1_SCL | | | +#define PB7 23 // | 23 | | USART1_RX | TWI1_SDA | | | +#define PB8 24 // | 24 | | | TWI1_SCL | | | +#define PB9 25 // | 25 | | | TWI1_SDA | SPI2_SS | | +#define PB10 26 // | 26 | | | TWI2_SCL | SPI2_SCK | | +#define PB12 27 // | 27 | | | | SPI2_SS | | +#define PB13 28 // | 28 | | | | SPI2_SCK | | +#define PB14 29 // | 29 | | | | SPI2_MISO | | +#define PB15 30 // | 30 | | | | SPI2_MOSI | | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PC0 A10 // | 31 | A10 | | | | | +#define PC1 A11 // | 32 | A11 | | | | | +#define PC2 A12 // | 33 | A12 | | | SPI2_MISO | | +#define PC3 A13 // | 34 | A13 | | | SPI2_MOSI | | +#define PC4 A14 // | 35 | A14 | | | | | +#define PC5 A15 // | 36 | A15 | | | | | +#define PC6 37 // | 37 | | USART6_TX | | | | +#define PC7 38 // | 38 | | USART6_RX | | | | +#define PC8 39 // | 39 | | | | | | +#define PC9 40 // | 40 | | | TWI3_SDA | | | +#define PC10 41 // | 41 | | | | SPI3_SCK | | +#define PC11 42 // | 42 | | | | SPI3_MISO | | +#define PC12 43 // | 43 | | | | SPI3_MOSI | | +#define PC13 44 // | 44 | | | | | | +#define PC14 45 // | 45 | | | | | OSC32_IN | +#define PC15 46 // | 46 | | | | | OSC32_OUT | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PD2 47 // | 47 | | | | | | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PH0 48 // | 48 | | | | | OSC_IN | +#define PH1 49 // | 49 | | | | | OSC_OUT | +// |---------|--------|-----------|----------|------------------------|-----------| + +// This must be a literal +#define NUM_DIGITAL_PINS 50 +#define NUM_ANALOG_INPUTS 16 + +// SPI definitions +#define PIN_SPI_SS PA4 +#define PIN_SPI_SS1 PA4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + + +// Timer Definitions +#define TIMER_TONE TIM2 +#define TIMER_SERVO TIM5 +#define TIMER_SERIAL TIM11 + +// UART Definitions +//#define ENABLE_HWSERIAL1 done automatically by the #define SERIAL_UART_INSTANCE below +#define ENABLE_HWSERIAL2 + + +// Define here Serial instance number to map on Serial generic name (if not already used by SerialUSB) +#define SERIAL_UART_INSTANCE 1 //1 for Serial = Serial1 (USART1) + +// Default pin used for 'Serial' instance +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +// Used when user instanciate a hardware Serial using its peripheral name. +// Example: HardwareSerial mySerial(USART3); +// will use PIN_SERIAL3_RX and PIN_SERIAL3_TX if defined. +#define PIN_SERIAL1_RX PA10 +#define PIN_SERIAL1_TX PA9 +#define PIN_SERIAL2_RX PA3 +#define PIN_SERIAL2_TX PA2 + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE Serial1 + #define SERIAL_PORT_HARDWARE_OPEN Serial2 +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 65d0b9ad8c..cce10c0b32 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1198,6 +1198,18 @@ extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py +# +# STM32F401RC +# +[env:FYSETC_CHEETAH_V20] +platform = ${common_stm32.platform} +extends = common_stm32 +board = FYSETC_CHEETAH_V20 +build_flags = ${common_stm32.build_flags} -DSTM32F401xC -DVECT_TAB_OFFSET=0xC000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/FYSETC_CHEETAH_V20.py + # # FLYF407ZG # From b44de74b9171b8a753839348c28dcd731f83f244 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Fri, 29 Jan 2021 02:59:16 +0100 Subject: [PATCH 0955/1370] Optimize serial output code for size (#20911) --- Marlin/src/core/macros.h | 1 + Marlin/src/core/serial_base.h | 26 +++++++++++++------------- Marlin/src/core/serial_hook.h | 24 ++++++++++++++---------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index a0ccebc078..dcc688ae29 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -53,6 +53,7 @@ #define _FORCE_INLINE_ __attribute__((__always_inline__)) __inline__ #define FORCE_INLINE __attribute__((always_inline)) inline +#define NO_INLINE __attribute__((noinline)) #define _UNUSED __attribute__((unused)) #define _O0 __attribute__((optimize("O0"))) #define _Os __attribute__((optimize("Os"))) diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index b60e3b5788..220ccae831 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -78,23 +78,23 @@ struct SerialBase { FORCE_INLINE void write(const char* str) { while (*str) write(*str++); } FORCE_INLINE void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } FORCE_INLINE void print(const char* str) { write(str); } - FORCE_INLINE void print(char c, int base = 0) { print((long)c, base); } - FORCE_INLINE void print(unsigned char c, int base = 0) { print((unsigned long)c, base); } - FORCE_INLINE void print(int c, int base = DEC) { print((long)c, base); } - FORCE_INLINE void print(unsigned int c, int base = DEC) { print((unsigned long)c, base); } + NO_INLINE void print(char c, int base = 0) { print((long)c, base); } + NO_INLINE void print(unsigned char c, int base = 0) { print((unsigned long)c, base); } + NO_INLINE void print(int c, int base = DEC) { print((long)c, base); } + NO_INLINE void print(unsigned int c, int base = DEC) { print((unsigned long)c, base); } void print(long c, int base = DEC) { if (!base) write(c); write((const uint8_t*)"-", c < 0); printNumber(c < 0 ? -c : c, base); } void print(unsigned long c, int base = DEC) { printNumber(c, base); } void print(double c, int digits = 2) { printFloat(c, digits); } - FORCE_INLINE void println(const char s[]) { print(s); println(); } - FORCE_INLINE void println(char c, int base = 0) { print(c, base); println(); } - FORCE_INLINE void println(unsigned char c, int base = 0) { print(c, base); println(); } - FORCE_INLINE void println(int c, int base = DEC) { print(c, base); println(); } - FORCE_INLINE void println(unsigned int c, int base = DEC) { print(c, base); println(); } - FORCE_INLINE void println(long c, int base = DEC) { print(c, base); println(); } - FORCE_INLINE void println(unsigned long c, int base = DEC) { print(c, base); println(); } - FORCE_INLINE void println(double c, int digits = 2) { print(c, digits); println(); } - void println() { write("\r\n"); } + NO_INLINE void println(const char s[]) { print(s); println(); } + NO_INLINE void println(char c, int base = 0) { print(c, base); println(); } + NO_INLINE void println(unsigned char c, int base = 0) { print(c, base); println(); } + NO_INLINE void println(int c, int base = DEC) { print(c, base); println(); } + NO_INLINE void println(unsigned int c, int base = DEC) { print(c, base); println(); } + NO_INLINE void println(long c, int base = DEC) { print(c, base); println(); } + NO_INLINE void println(unsigned long c, int base = DEC) { print(c, base); println(); } + NO_INLINE void println(double c, int digits = 2) { print(c, digits); println(); } + NO_INLINE void println() { write('\r'); write('\n'); } // Print a number with the given base void printNumber(unsigned long n, const uint8_t base) { diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index 17cf8bdd7d..e14b821a9c 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -61,7 +61,7 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial > { bool & condition; SerialT & out; - size_t write(uint8_t c) { if (condition) return out.write(c); return 0; } + NO_INLINE size_t write(uint8_t c) { if (condition) return out.write(c); return 0; } void flush() { if (condition) out.flush(); } void begin(long br) { out.begin(br); } void end() { out.end(); } @@ -83,7 +83,7 @@ struct ForwardSerial : public SerialBase< ForwardSerial > { typedef SerialBase< ForwardSerial > BaseClassT; SerialT & out; - size_t write(uint8_t c) { return out.write(c); } + NO_INLINE size_t write(uint8_t c) { return out.write(c); } void flush() { out.flush(); } void begin(long br) { out.begin(br); } void end() { out.end(); } @@ -111,12 +111,12 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria EndOfMessageHook eofHook; void * userPointer; - size_t write(uint8_t c) { + NO_INLINE size_t write(uint8_t c) { if (writeHook) writeHook(userPointer, c); return SerialT::write(c); } - void msgDone() { + NO_INLINE void msgDone() { if (eofHook) eofHook(userPointer); } @@ -130,7 +130,11 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria using BaseClassT::print; using BaseClassT::println; - + + // Underlying implementation might use Arduino's bool operator + bool connected() { + return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, static_cast(this), connected) : static_cast(this)->operator bool(); + } void setHook(WriteHook writeHook = 0, EndOfMessageHook eofHook = 0, void * userPointer = 0) { // Order is important here as serial code can be called inside interrupts @@ -165,13 +169,13 @@ struct MultiSerial : public SerialBase< MultiSerial AllMask = FirstOutputMask | SecondOutputMask, }; - size_t write(uint8_t c) { + NO_INLINE size_t write(uint8_t c) { size_t ret = 0; if (portMask & FirstOutputMask) ret = serial0.write(c); if (portMask & SecondOutputMask) ret = serial1.write(c) | ret; return ret; } - void msgDone() { + NO_INLINE void msgDone() { if (portMask & FirstOutputMask) serial0.msgDone(); if (portMask & SecondOutputMask) serial1.msgDone(); } @@ -182,7 +186,7 @@ struct MultiSerial : public SerialBase< MultiSerial default: return false; } } - int read(uint8_t index) { + NO_INLINE int read(uint8_t index) { switch(index) { case 0 + offset: return serial0.read(); case 1 + offset: return serial1.read(); @@ -208,11 +212,11 @@ struct MultiSerial : public SerialBase< MultiSerial using BaseClassT::read; // Redirect flush - void flush() { + NO_INLINE void flush() { if (portMask & FirstOutputMask) serial0.flush(); if (portMask & SecondOutputMask) serial1.flush(); } - void flushTX() { + NO_INLINE void flushTX() { if (portMask & FirstOutputMask) CALL_IF_EXISTS(void, &serial0, flushTX); if (portMask & SecondOutputMask) CALL_IF_EXISTS(void, &serial1, flushTX); } From 4b9f2f13b18fd53b3f500777233ce1c8788043c6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 28 Jan 2021 20:40:20 -0600 Subject: [PATCH 0956/1370] AutoReport class (Temperature, Cardreader) (#20913) --- Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 2 +- Marlin/src/gcode/sd/M1001.cpp | 2 +- Marlin/src/gcode/sd/M27.cpp | 10 ++-- Marlin/src/gcode/temp/M155.cpp | 2 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/compat.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 6 +-- .../lib/mks_ui/tft_lvgl_configuration.cpp | 8 +-- Marlin/src/lcd/extui/ui_api.cpp | 6 +-- Marlin/src/lcd/extui/ui_api.h | 6 +-- Marlin/src/libs/autoreport.h | 49 +++++++++++++++++++ Marlin/src/module/temperature.cpp | 28 ++++------- Marlin/src/module/temperature.h | 14 +++--- Marlin/src/sd/cardreader.cpp | 19 ++----- Marlin/src/sd/cardreader.h | 32 ++++++------ 16 files changed, 110 insertions(+), 84 deletions(-) create mode 100644 Marlin/src/libs/autoreport.h diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index ac18128eec..51e0efafd6 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -687,8 +687,8 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { // Auto-report Temperatures / SD Status #if HAS_AUTO_REPORTING if (!gcode.autoreport_paused) { - TERN_(AUTO_REPORT_TEMPERATURES, thermalManager.auto_report_temperatures()); - TERN_(AUTO_REPORT_SD_STATUS, card.auto_report_sd_status()); + TERN_(AUTO_REPORT_TEMPERATURES, thermalManager.auto_reporter.tick()); + TERN_(AUTO_REPORT_SD_STATUS, card.auto_reporter.tick()); } #endif diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index c5572e083f..5d0bb0dc1e 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -267,7 +267,7 @@ void GcodeSuite::G76() { say_waiting_for_probe_heating(); SERIAL_ECHOLNPAIR(" Bed:", target_bed, " Probe:", target_probe); - const millis_t probe_timeout_ms = millis() + 900UL * 1000UL; + const millis_t probe_timeout_ms = millis() + SEC_TO_MS(900UL); while (thermalManager.degProbe() < target_probe) { if (report_temps(next_temp_report, probe_timeout_ms)) { SERIAL_ECHOLNPGM("!Probe heating timed out."); diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index bd355d96ba..1cf700ae26 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -92,7 +92,7 @@ void GcodeSuite::M1001() { printerEventLEDs.onPrintCompleted(); TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_PRINT_DONE))); TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_PRINT_DONE), CONTINUE_STR)); - wait_for_user_response(1000UL * TERN(HAS_LCD_MENU, PE_LEDS_COMPLETED_TIME, 30)); + wait_for_user_response(SEC_TO_MS(TERN(HAS_LCD_MENU, PE_LEDS_COMPLETED_TIME, 30))); printerEventLEDs.onResumeAfterWait(); } #endif diff --git a/Marlin/src/gcode/sd/M27.cpp b/Marlin/src/gcode/sd/M27.cpp index 8592b8af25..a76070fda8 100644 --- a/Marlin/src/gcode/sd/M27.cpp +++ b/Marlin/src/gcode/sd/M27.cpp @@ -36,15 +36,17 @@ void GcodeSuite::M27() { if (parser.seen('C')) { SERIAL_ECHOPGM("Current file: "); card.printFilename(); + return; } #if ENABLED(AUTO_REPORT_SD_STATUS) - else if (parser.seenval('S')) - card.set_auto_report_interval(parser.value_byte()); + if (parser.seenval('S')) { + card.auto_reporter.set_interval(parser.value_byte()); + return; + } #endif - else - card.report_status(); + card.report_status(); } #endif // SDSUPPORT diff --git a/Marlin/src/gcode/temp/M155.cpp b/Marlin/src/gcode/temp/M155.cpp index 30129a0e6f..48c23986ae 100644 --- a/Marlin/src/gcode/temp/M155.cpp +++ b/Marlin/src/gcode/temp/M155.cpp @@ -33,7 +33,7 @@ void GcodeSuite::M155() { if (parser.seenval('S')) - thermalManager.set_auto_report_interval(parser.value_byte()); + thermalManager.auto_reporter.set_interval(parser.value_byte()); } diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index e0caa0722f..39f161f5ad 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -3553,7 +3553,7 @@ void EachMomentUpdate() { static millis_t next_remain_time_update = 0; if (Percentrecord > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag) { remain_time = (elapsed.value - dwin_heat_time) / (Percentrecord * 0.01f) - (elapsed.value - dwin_heat_time); - next_remain_time_update += 20 * 1000UL; + next_remain_time_update += SEC_TO_MS(20); Draw_Print_ProgressRemain(); } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h index 741b7076d1..e26ca4e534 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h @@ -43,8 +43,8 @@ #define min(a,b) ((a)<(b)?(a):(b)) #else namespace UI { - static inline uint32_t safe_millis() {return millis();}; - static inline void yield() {}; + static inline uint32_t safe_millis() { return millis(); } + static inline void yield() {} }; #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 88e6fab07c..84049d51ab 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -889,7 +889,7 @@ void GUI_RefreshPage() { lv_draw_wifi_tips(); } - if (tips_disp.timer_count >= 30 * 1000) { + if (tips_disp.timer_count >= SEC_TO_MS(30)) { tips_disp.timer = TIPS_TIMER_STOP; tips_disp.timer_count = 0; lv_clear_wifi_tips(); @@ -898,7 +898,7 @@ void GUI_RefreshPage() { } break; case TIPS_TYPE_TAILED_JOIN: - if (tips_disp.timer_count >= 3 * 1000) { + if (tips_disp.timer_count >= SEC_TO_MS(3)) { tips_disp.timer = TIPS_TIMER_STOP; tips_disp.timer_count = 0; @@ -908,7 +908,7 @@ void GUI_RefreshPage() { } break; case TIPS_TYPE_WIFI_CONECTED: - if (tips_disp.timer_count >= 3 * 1000) { + if (tips_disp.timer_count >= SEC_TO_MS(3)) { tips_disp.timer = TIPS_TIMER_STOP; tips_disp.timer_count = 0; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 65b7538b71..b7441f71f4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -89,8 +89,8 @@ void SysTick_Callback() { #endif if (uiCfg.filament_loading_time_flg) { uiCfg.filament_loading_time_cnt++; - uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_loading_time_cnt / (uiCfg.filament_loading_time * 1000.0)) * 100.0) + 0.5); - if (uiCfg.filament_loading_time_cnt >= (uiCfg.filament_loading_time * 1000)) { + uiCfg.filament_rate = uint32_t(100.0f * uiCfg.filament_loading_time_cnt / SEC_TO_MS(uiCfg.filament_loading_time) + 0.5f); + if (uiCfg.filament_loading_time_cnt >= SEC_TO_MS(uiCfg.filament_loading_time)) { uiCfg.filament_loading_time_cnt = 0; uiCfg.filament_loading_time_flg = false; uiCfg.filament_loading_completed = true; @@ -98,8 +98,8 @@ void SysTick_Callback() { } if (uiCfg.filament_unloading_time_flg) { uiCfg.filament_unloading_time_cnt++; - uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_unloading_time_cnt / (uiCfg.filament_unloading_time * 1000.0)) * 100.0) + 0.5); - if (uiCfg.filament_unloading_time_cnt >= (uiCfg.filament_unloading_time * 1000)) { + uiCfg.filament_rate = uint32_t(100.0f * uiCfg.filament_unloading_time_cnt / SEC_TO_MS(uiCfg.filament_unloading_time) + 0.5f); + if (uiCfg.filament_unloading_time_cnt >= SEC_TO_MS(uiCfg.filament_unloading_time)) { uiCfg.filament_unloading_time_cnt = 0; uiCfg.filament_unloading_time_flg = false; uiCfg.filament_unloading_completed = true; diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 18689fe36d..d1ffb4c437 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -123,7 +123,7 @@ namespace ExtUI { // Machine was killed, reinit SysTick so we are able to compute time without ISRs if (currTimeHI == 0) { // Get the last time the Arduino time computed (from CMSIS) and convert it to SysTick - currTimeHI = (uint32_t)((GetTickCount() * (uint64_t)(F_CPU / 8000)) >> 24); + currTimeHI = uint32_t((GetTickCount() * uint64_t(F_CPU / 8000)) >> 24); // Reinit the SysTick timer to maximize its period SysTick->LOAD = SysTick_LOAD_RELOAD_Msk; // get the full range for the systick timer @@ -148,9 +148,9 @@ namespace ExtUI { } #endif // __SAM3X8E__ - void delay_us(unsigned long us) { DELAY_US(us); } + void delay_us(uint32_t us) { DELAY_US(us); } - void delay_ms(unsigned long ms) { + void delay_ms(uint32_t ms) { if (flags.printer_killed) DELAY_US(ms * 1000); else diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 478fe68909..bfd658b0d9 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -155,7 +155,7 @@ namespace ExtUI { void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval); inline void onMeshUpdate(const xy_int8_t &pos, const float zval) { onMeshUpdate(pos.x, pos.y, zval); } - typedef enum : unsigned char { + typedef enum : uint8_t { MESH_START, // Prior to start of probe MESH_FINISH, // Following probe of all points PROBE_START, // Beginning probe of grid location @@ -302,8 +302,8 @@ namespace ExtUI { FORCE_INLINE uint32_t safe_millis() { return millis(); } // TODO: Implement for AVR #endif - void delay_us(unsigned long us); - void delay_ms(unsigned long ms); + void delay_us(uint32_t us); + void delay_ms(uint32_t ms); void yield(); /** diff --git a/Marlin/src/libs/autoreport.h b/Marlin/src/libs/autoreport.h new file mode 100644 index 0000000000..9bde9f29fb --- /dev/null +++ b/Marlin/src/libs/autoreport.h @@ -0,0 +1,49 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../inc/MarlinConfig.h" + +template +class AutoReporter { +public: + millis_t next_report_ms; + uint8_t report_interval; + + // Override this method + inline void auto_report() { } + + inline void set_interval(uint8_t seconds, const uint8_t limit=60) { + report_interval = _MIN(seconds, limit); + next_report_ms = millis() + SEC_TO_MS(seconds); + } + + inline void tick() { + if (!report_interval) return; + const millis_t ms = millis(); + if (ELAPSED(ms, next_report_ms)) { + next_report_ms = ms + SEC_TO_MS(report_interval); + PORT_REDIRECT(AR_PORT_INDEX); + auto_report(); + } + } +}; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 139f6b9045..e1fd00dcd6 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1276,7 +1276,7 @@ void Temperature::manage_heater() { // temperature didn't drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) { if (old_temp - temp_chamber.celsius < float(MIN_COOLING_SLOPE_DEG_CHAMBER_VENT)) flag_chamber_excess_heat = true; //the bed is heating the chamber too much - next_cool_check_ms_2 = ms + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER_VENT; + next_cool_check_ms_2 = ms + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_CHAMBER_VENT); old_temp = temp_chamber.celsius; } } @@ -3123,20 +3123,12 @@ void Temperature::tick() { } #if ENABLED(AUTO_REPORT_TEMPERATURES) - - uint8_t Temperature::auto_report_temp_interval; - millis_t Temperature::next_temp_report_ms; - - void Temperature::auto_report_temperatures() { - if (auto_report_temp_interval && ELAPSED(millis(), next_temp_report_ms)) { - next_temp_report_ms = millis() + 1000UL * auto_report_temp_interval; - PORT_REDIRECT(SERIAL_ALL); - print_heater_states(active_extruder); - SERIAL_EOL(); - } + Temperature::AutoReportTemp Temperature::auto_reporter; + void Temperature::AutoReportTemp::auto_report() { + print_heater_states(active_extruder); + SERIAL_EOL(); } - - #endif // AUTO_REPORT_TEMPERATURES + #endif #if HAS_HOTEND && HAS_DISPLAY void Temperature::set_heating_message(const uint8_t e) { @@ -3252,7 +3244,7 @@ void Temperature::tick() { // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG)) break; - next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME; + next_cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME); old_temp = temp; } } @@ -3377,7 +3369,7 @@ void Temperature::tick() { // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_BED if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_BED)) break; - next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_BED; + next_cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_BED); old_temp = temp; } } @@ -3461,7 +3453,7 @@ void Temperature::tick() { SERIAL_ECHOLNPGM("Timed out waiting for probe temperature."); break; } - next_delta_check_ms = now + 1000UL * MIN_DELTA_SLOPE_TIME_PROBE; + next_delta_check_ms = now + SEC_TO_MS(MIN_DELTA_SLOPE_TIME_PROBE); old_temp = temp; } @@ -3566,7 +3558,7 @@ void Temperature::tick() { // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_CHAMBER)) break; - next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER; + next_cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_CHAMBER); old_temp = temp; } } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 86c202cadc..1401e0d354 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -33,6 +33,10 @@ #include "../feature/power.h" #endif +#if ENABLED(AUTO_REPORT_TEMPERATURES) + #include "../libs/autoreport.h" +#endif + #ifndef SOFT_PWM_SCALE #define SOFT_PWM_SCALE 0 #endif @@ -794,14 +798,8 @@ class Temperature { #endif ); #if ENABLED(AUTO_REPORT_TEMPERATURES) - static uint8_t auto_report_temp_interval; - static millis_t next_temp_report_ms; - static void auto_report_temperatures(); - static inline void set_auto_report_interval(uint8_t v) { - NOMORE(v, 60); - auto_report_temp_interval = v; - next_temp_report_ms = millis() + 1000UL * v; - } + class AutoReportTemp : public AutoReporter { void auto_report(); }; + static AutoReportTemp auto_reporter; #endif #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index f8489549d6..e3732e5ef8 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -1226,21 +1226,10 @@ void CardReader::fileHasFinished() { } #if ENABLED(AUTO_REPORT_SD_STATUS) - uint8_t CardReader::auto_report_sd_interval = 0; - millis_t CardReader::next_sd_report_ms; - #if HAS_MULTI_SERIAL - serial_index_t CardReader::auto_report_port; - #endif - - void CardReader::auto_report_sd_status() { - millis_t current_ms = millis(); - if (auto_report_sd_interval && ELAPSED(current_ms, next_sd_report_ms)) { - next_sd_report_ms = current_ms + 1000UL * auto_report_sd_interval; - PORT_REDIRECT(auto_report_port); - report_status(); - } - } -#endif // AUTO_REPORT_SD_STATUS + TERN_(HAS_MULTI_SERIAL, serial_index_t CardReader::auto_report_port); + CardReader::AutoReportSD CardReader::auto_reporter; + void CardReader::AutoReportSD::auto_report() { report_status(); } +#endif #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 14529fbff1..b10a5acd0d 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -59,6 +59,10 @@ typedef struct { ; } card_flags_t; +#if ENABLED(AUTO_REPORT_SD_STATUS) + #include "../libs/autoreport.h" +#endif + class CardReader { public: static card_flags_t flag; // Flags (above) @@ -172,13 +176,16 @@ public: static Sd2Card& getSd2Card() { return sd2card; } #if ENABLED(AUTO_REPORT_SD_STATUS) - static void auto_report_sd_status(); - static inline void set_auto_report_interval(uint8_t v) { - TERN_(HAS_MULTI_SERIAL, auto_report_port = multiSerial.portMask); - NOMORE(v, 60); - auto_report_sd_interval = v; - next_sd_report_ms = millis() + 1000UL * v; - } + // + // SD Auto Reporting + // + #if HAS_MULTI_SERIAL + static serial_index_t auto_report_port; + #else + static constexpr serial_index_t auto_report_port = 0; + #endif + class AutoReportSD : public AutoReporter { void auto_report(); }; + static AutoReportSD auto_reporter; #endif private: @@ -260,17 +267,6 @@ private: static char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; #endif - // - // SD Auto Reporting - // - #if ENABLED(AUTO_REPORT_SD_STATUS) - static uint8_t auto_report_sd_interval; - static millis_t next_sd_report_ms; - #if HAS_MULTI_SERIAL - static serial_index_t auto_report_port; - #endif - #endif - // // Directory items // From 845b99feb7043887e6c1a3d377416797a7775b6b Mon Sep 17 00:00:00 2001 From: rafaljot Date: Fri, 29 Jan 2021 06:22:18 +0100 Subject: [PATCH 0957/1370] MPX_ARM_MINI board (Mingda MD-16) (#20711) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + .../pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h | 176 ++++++++++++++++++ platformio.ini | 17 ++ 4 files changed, 196 insertions(+) create mode 100644 Marlin/src/pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 6a34a282e2..afb6887766 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -338,6 +338,7 @@ #define BOARD_FLY_MINI 4045 // FLY MINI (STM32F103RCT6) #define BOARD_FLSUN_HISPEED 4046 // FLSUN HiSpeedV1 (STM32F103VET6) #define BOARD_BEAST 4047 // STM32F103RET6 Libmaple-based controller +#define BOARD_MINGDA_MPX_ARM_MINI 4048 // STM32F103ZET6 Mingda MD-16 // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 45e7f049b0..737c8869d1 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -548,6 +548,8 @@ #include "stm32f1/pins_FLSUN_HISPEED.h" // STM32F1 env:flsun_hispeed #elif MB(BEAST) #include "stm32f1/pins_BEAST.h" // STM32F1 env:STM32F103RE +#elif MB(MINGDA_MPX_ARM_MINI) + #include "stm32f1/pins_MINGDA_MPX_ARM_MINI.h" // STM32F1 env:STM32F103RE // // ARM Cortex-M4F diff --git a/Marlin/src/pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h b/Marlin/src/pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h new file mode 100644 index 0000000000..429cf14ac5 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h @@ -0,0 +1,176 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * MKS Robin mini (STM32F130VET6) board pin assignments + */ + +#if NOT_TARGET(STM32F1, STM32F1xx) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS Robin supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Mingda MPX_ARM_MINI" + +#define BOARD_NO_NATIVE_USB +#define DISABLE_DEBUG + +// +// EEPROM +// + +/* +//Mingda used an unknown EEPROM chip ATMLH753, so I turned on the emulation below. +//It is connected to EEPROM PB6 PB7 + +#define I2C_EEPROM +#undef NO_EEPROM_SELECTED +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#define USE_SHARED_EEPROM 1 // Use Platform-independent Arduino functions for I2C EEPROM +#define E2END 0xFFFF // EEPROM end address AT24C256 (32kB) +*/ + +#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) + #define FLASH_EEPROM_EMULATION + #define EEPROM_PAGE_SIZE 0x800U // 2KB + #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB +#endif + +#define SPI_DEVICE 2 + +// +// Limit Switches +// +#define X_MIN_PIN PD6 +#define X_MAX_PIN PG15 +#define Y_MIN_PIN PG9 +#define Y_MAX_PIN PG14 +#define Z_MIN_PIN PG10 +#define Z_MAX_PIN PG13 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PG11 +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PD13 +#define X_STEP_PIN PD12 +#define X_DIR_PIN PD11 + +#define Y_ENABLE_PIN PG4 +#define Y_STEP_PIN PG3 +#define Y_DIR_PIN PG2 + +#define Z_ENABLE_PIN PG7 +#define Z_STEP_PIN PG6 +#define Z_DIR_PIN PG5 + +#define E0_ENABLE_PIN PC7 +#define E0_STEP_PIN PC6 +#define E0_DIR_PIN PG8 + +// +// Temperature Sensors +// +//#define TEMP_0_PIN PF6 // THERM_E0 +//#define TEMP_0_PIN PB3 // E0 K+ +#define TEMP_BED_PIN PF7 // THERM_BED + +#define MAX6675_SS_PIN PB5 +#define MAX6675_SCK_PIN PB3 +#define MAX6675_DO_PIN PB4 +#define MAX6675_MOSI_PIN PA14 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB0 +#define HEATER_BED_PIN PB1 + +#define FAN_PIN PA0 // FAN + +// +// SD Card +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define SDIO_SUPPORT +#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SDIO_READ_RETRIES 16 + +#define SD_DETECT_PIN PC5 +#define ONBOARD_SPI_DEVICE 1 // SPI1 +#define ONBOARD_SD_CS_PIN PC10 + +// +// LCD / Controller +// +#define BEEPER_PIN PE4 + +/** + * Note: MKS Robin TFT screens use various TFT controllers. + * If the screen stays white, disable 'LCD_RESET_PIN' + * to let the bootloader init the screen. + */ +#if HAS_FSMC_TFT + /** + * Note: MKS Robin TFT screens use various TFT controllers + * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) + * ILI9488 is not supported + * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp + * + * If the screen stays white, disable 'TFT_RESET_PIN' + * to let the bootloader init the screen. + * + * Setting an 'TFT_RESET_PIN' may cause a flicker when entering the LCD menu + * because Marlin uses the reset as a failsafe to revive a glitchy LCD. + */ + #define TFT_CS_PIN PD7 // NE4 + #define TFT_RS_PIN PG0 // A0 + + #define FSMC_CS_PIN TFT_CS_PIN + #define FSMC_RS_PIN TFT_RS_PIN + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define TFT_RESET_PIN PF15 + #define TFT_BACKLIGHT_PIN PF11 + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 +#endif + +#if NEED_TOUCH_PINS + #define TOUCH_CS_PIN PA4 // SPI2_NSS + #define TOUCH_SCK_PIN PA5 // SPI2_SCK + #define TOUCH_MISO_PIN PA6 // SPI2_MISO + #define TOUCH_MOSI_PIN PA7 // SPI2_MOSI +#endif diff --git a/platformio.ini b/platformio.ini index cce10c0b32..2d81baa200 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1524,6 +1524,23 @@ build_flags = ${stm32_flash_drive.build_flags} -DUSE_USB_HS_IN_FS -DUSBD_USE_CDC +# +# Mingda MPX_ARM_MINI +# + +[env:mingda_mpx_arm_mini] +platform = ${common_stm32.platform} +extends = common_stm32 +board = genericSTM32F103ZE +board_build.core = stm32 +board_build.variant = MARLIN_F103Zx +board_build.ldscript = ldscript.ld +board_build.offset = 0x10000 +build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py + + ################################# # # # Other Architectures # From 0e37370b0cbaf972f43743820974b10bfc691f0d Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 30 Jan 2021 18:41:45 +1300 Subject: [PATCH 0958/1370] Fix G28_STR (#20925) --- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h index e26ca4e534..c01d45ed7c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h @@ -50,3 +50,4 @@ class __FlashStringHelper; typedef const __FlashStringHelper *progmem_str; +extern const char G28_STR[]; From 219f92c4cadaa380767945ad07f401d168b4c4bb Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 30 Jan 2021 18:44:32 +1300 Subject: [PATCH 0959/1370] KILL, BEEPER pins for LCD_FOR_MELZI (#20924) --- Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index ffed79de79..af27159936 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -163,6 +163,8 @@ #define LCD_PINS_RS 17 #define LCD_PINS_ENABLE 16 #define LCD_PINS_D4 11 + #define KILL_PIN 10 + #define BEEPER_PIN 27 #ifndef BOARD_ST7920_DELAY_1 #define BOARD_ST7920_DELAY_1 DELAY_NS(0) From 164199614c4614144d4b4abc455adc6393d9167a Mon Sep 17 00:00:00 2001 From: ConstantijnCrijnen <43953114+ConstantijnCrijnen@users.noreply.github.com> Date: Sat, 30 Jan 2021 07:07:35 +0100 Subject: [PATCH 0960/1370] Language selection auto-save option (#20915) --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/lcd/menu/menu_language.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index bcd1d62422..d21c5069d6 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1534,6 +1534,9 @@ //#define LCD_LANGUAGE_3 de //#define LCD_LANGUAGE_4 es //#define LCD_LANGUAGE_5 it + #ifdef LCD_LANGUAGE_2 + //#define LCD_LANGUAGE_AUTO_SAVE // Automatically save language to EEPROM on change + #endif #endif // diff --git a/Marlin/src/lcd/menu/menu_language.cpp b/Marlin/src/lcd/menu/menu_language.cpp index 26660f22f8..4c4b7880f2 100644 --- a/Marlin/src/lcd/menu/menu_language.cpp +++ b/Marlin/src/lcd/menu/menu_language.cpp @@ -34,7 +34,7 @@ static void set_lcd_language(const uint8_t inlang) { ui.set_language(inlang); - (void)settings.save(); + TERN_(LCD_LANGUAGE_AUTO_SAVE, (void)settings.save()); } void menu_language() { From b3656c387fcaa5b428c3b6d86ad4b95252a24d1a Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sun, 31 Jan 2021 23:47:16 +0100 Subject: [PATCH 0961/1370] Remove extra G29 V newlines (#20955) --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 3f7b2d7d96..41d2a36359 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -742,7 +742,7 @@ if (do_ubl_mesh_map) display_map(g29_map_type); const int point_num = (GRID_MAX_POINTS) - count + 1; - SERIAL_ECHOLNPAIR("\nProbing mesh point ", point_num, "/", int(GRID_MAX_POINTS), ".\n"); + SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", int(GRID_MAX_POINTS), "."); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); #if HAS_LCD_MENU From e7658ec5f5689a4d37cc60d89d73d03f7bdb3bd1 Mon Sep 17 00:00:00 2001 From: zeleps <39417467+zeleps@users.noreply.github.com> Date: Mon, 1 Feb 2021 00:50:12 +0200 Subject: [PATCH 0962/1370] Init serial ports first (#20944) --- Marlin/src/MarlinCore.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 51e0efafd6..8692e9219e 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -886,6 +886,17 @@ void setup() { #endif #define SETUP_RUN(C) do{ SETUP_LOG(STRINGIFY(C)); C; }while(0) + MYSERIAL0.begin(BAUDRATE); + millis_t serial_connect_timeout = millis() + 1000UL; + while (!MYSERIAL0.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + + #if HAS_MULTI_SERIAL && !HAS_ETHERNET + MYSERIAL1.begin(BAUDRATE); + serial_connect_timeout = millis() + 1000UL; + while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #endif + SERIAL_ECHOLNPGM("start"); + // Set up these pins early to prevent suicide #if HAS_KILL SETUP_LOG("KILL_PIN"); @@ -918,17 +929,6 @@ void setup() { #endif #endif - MYSERIAL0.begin(BAUDRATE); - millis_t serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL0.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - - #if HAS_MULTI_SERIAL && !HAS_ETHERNET - MYSERIAL1.begin(BAUDRATE); - serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - #endif - SERIAL_ECHOLNPGM("start"); - #if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) mks_esp_wifi_init(); WIFISERIAL.begin(WIFI_BAUDRATE); From 9ae204df9cb95ace1b38bf9c97ac3b4f77f05083 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Mon, 1 Feb 2021 00:21:27 +0100 Subject: [PATCH 0963/1370] Serial refactor followup (#20932) --- Marlin/src/HAL/STM32/MarlinSerial.cpp | 2 +- Marlin/src/MarlinCore.cpp | 4 ++-- Marlin/src/core/serial_base.h | 27 ++++++++++++++++++------- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 2 +- Marlin/src/gcode/calibrate/M48.cpp | 4 ++-- Marlin/src/gcode/host/M115.cpp | 4 ++-- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/module/tool_change.cpp | 2 +- Marlin/src/sd/SdBaseFile.cpp | 2 +- 9 files changed, 31 insertions(+), 18 deletions(-) diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index c420ce40cf..cfb13f5bb5 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -81,7 +81,7 @@ void MarlinSerial::_rx_complete_irq(serial_t *obj) { } #if ENABLED(EMERGENCY_PARSER) - emergency_parser.update(emergency_state, c); + emergency_parser.update(static_cast(this)->emergency_state, c); #endif } } diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8692e9219e..16111936da 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -614,8 +614,8 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { */ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { #if ENABLED(MARLIN_DEV_MODE) - static uint8_t idle_depth = 0; - if (++idle_depth > 5) SERIAL_ECHOLNPAIR("idle() call depth: ", int(idle_depth)); + static uint16_t idle_depth = 0; + if (++idle_depth > 5) SERIAL_ECHOLNPAIR("idle() call depth: ", idle_depth); #endif // Core Marlin activities diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 220ccae831..f52fa11202 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -78,13 +78,22 @@ struct SerialBase { FORCE_INLINE void write(const char* str) { while (*str) write(*str++); } FORCE_INLINE void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } FORCE_INLINE void print(const char* str) { write(str); } - NO_INLINE void print(char c, int base = 0) { print((long)c, base); } - NO_INLINE void print(unsigned char c, int base = 0) { print((unsigned long)c, base); } - NO_INLINE void print(int c, int base = DEC) { print((long)c, base); } - NO_INLINE void print(unsigned int c, int base = DEC) { print((unsigned long)c, base); } - void print(long c, int base = DEC) { if (!base) write(c); write((const uint8_t*)"-", c < 0); printNumber(c < 0 ? -c : c, base); } - void print(unsigned long c, int base = DEC) { printNumber(c, base); } - void print(double c, int digits = 2) { printFloat(c, digits); } + NO_INLINE void print(char c, int base = 0) { print((long)c, base); } + NO_INLINE void print(unsigned char c, int base = 0) { print((unsigned long)c, base); } + NO_INLINE void print(int c, int base = DEC) { print((long)c, base); } + NO_INLINE void print(unsigned int c, int base = DEC) { print((unsigned long)c, base); } + void print(unsigned long c, int base = DEC) { printNumber(c, base); } + void print(double c, int digits = 2) { printFloat(c, digits); } + void print(long c, int base = DEC) { + if (!base) { + write(c); + return; + } + if (base == DEC && c < 0) { + write((uint8_t)'-'); c = -c; + } + printNumber(c, base); + } NO_INLINE void println(const char s[]) { print(s); println(); } NO_INLINE void println(char c, int base = 0) { print(c, base); println(); } @@ -98,6 +107,10 @@ struct SerialBase { // Print a number with the given base void printNumber(unsigned long n, const uint8_t base) { + if (!base) { + write((uint8_t)n); + return; + } if (n) { unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 int8_t i = 0; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index fba065fed9..b0640e5fa2 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -150,7 +150,7 @@ SERIAL_ECHO_SP(7); LOOP_L_N(i, GRID_MAX_POINTS_X) { if (i < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(i); + SERIAL_ECHO((int)i); SERIAL_ECHO_SP(sp); } serial_delay(10); diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 529d5c75d9..97aea59221 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -240,8 +240,8 @@ void GcodeSuite::M48() { sigma = SQRT(dev_sum / (n + 1)); if (verbose_level > 1) { - SERIAL_ECHO(n + 1); - SERIAL_ECHOPAIR(" of ", int(n_samples)); + SERIAL_ECHO((int)(n + 1)); + SERIAL_ECHOPAIR(" of ", (int)n_samples); SERIAL_ECHOPAIR_F(": z: ", pz, 3); SERIAL_CHAR(' '); dev_report(verbose_level > 2, mean, sigma, min, max); diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 1b088e7d34..0501f3f60b 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -35,8 +35,8 @@ static void cap_line(PGM_P const name, bool ena=false) { SERIAL_ECHOPGM("Cap:"); serialprintPGM(name); - SERIAL_CHAR(':'); - SERIAL_ECHOLN(int(ena ? 1 : 0)); + SERIAL_CHAR(':', ena ? '1' : '0'); + SERIAL_EOL(); } #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index e1fd00dcd6..c6ed3d3a48 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2062,7 +2062,7 @@ void Temperature::init() { switch (heater_id) { case H_BED: SERIAL_ECHOPGM("bed"); break; case H_CHAMBER: SERIAL_ECHOPGM("chamber"); break; - default: SERIAL_ECHO(heater_id); + default: SERIAL_ECHO((int)heater_id); } SERIAL_ECHOLNPAIR( " ; sizeof(running_temp):", sizeof(running_temp), diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 867ae5d927..4278e6be26 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -709,7 +709,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #if EXTRUDERS inline void invalid_extruder_error(const uint8_t e) { SERIAL_ECHO_START(); - SERIAL_CHAR('T'); SERIAL_ECHO(int(e)); + SERIAL_CHAR('T'); SERIAL_ECHO((int)e); SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER); } #endif diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 270053be3e..7693c52330 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -926,7 +926,7 @@ int SdBaseFile::peek() { // print uint8_t with width 2 static void print2u(const uint8_t v) { if (v < 10) SERIAL_CHAR('0'); - SERIAL_ECHO(int(v)); + SERIAL_ECHO((int)v); } /** From c631fb79d555e6b3322e3ce6b344fad65aead473 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Mon, 1 Feb 2021 01:11:50 +0100 Subject: [PATCH 0964/1370] Fix AutoReporter implementation (#20959) --- Marlin/src/libs/autoreport.h | 16 ++++++++-------- Marlin/src/module/temperature.cpp | 4 ++-- Marlin/src/module/temperature.h | 4 ++-- Marlin/src/sd/cardreader.cpp | 4 +--- Marlin/src/sd/cardreader.h | 9 ++------- buildroot/tests/LPC1768-tests | 5 +++-- buildroot/tests/mega2560-tests | 2 +- 7 files changed, 19 insertions(+), 25 deletions(-) diff --git a/Marlin/src/libs/autoreport.h b/Marlin/src/libs/autoreport.h index 9bde9f29fb..2c0a043fbf 100644 --- a/Marlin/src/libs/autoreport.h +++ b/Marlin/src/libs/autoreport.h @@ -23,14 +23,14 @@ #include "../inc/MarlinConfig.h" -template -class AutoReporter { -public: +template +struct AutoReporter { millis_t next_report_ms; uint8_t report_interval; - - // Override this method - inline void auto_report() { } + #if HAS_MULTI_SERIAL + serial_index_t report_port_mask; + AutoReporter() : report_port_mask(SERIAL_ALL) {} + #endif inline void set_interval(uint8_t seconds, const uint8_t limit=60) { report_interval = _MIN(seconds, limit); @@ -42,8 +42,8 @@ public: const millis_t ms = millis(); if (ELAPSED(ms, next_report_ms)) { next_report_ms = ms + SEC_TO_MS(report_interval); - PORT_REDIRECT(AR_PORT_INDEX); - auto_report(); + TERN_(HAS_MULTI_SERIAL, PORT_REDIRECT(report_port_mask)); + Helper::report(); } } }; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index c6ed3d3a48..b5820e17bf 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -3123,8 +3123,8 @@ void Temperature::tick() { } #if ENABLED(AUTO_REPORT_TEMPERATURES) - Temperature::AutoReportTemp Temperature::auto_reporter; - void Temperature::AutoReportTemp::auto_report() { + AutoReporter Temperature::auto_reporter; + void Temperature::AutoReportTemp::report() { print_heater_states(active_extruder); SERIAL_EOL(); } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 1401e0d354..002e1cbf71 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -798,8 +798,8 @@ class Temperature { #endif ); #if ENABLED(AUTO_REPORT_TEMPERATURES) - class AutoReportTemp : public AutoReporter { void auto_report(); }; - static AutoReportTemp auto_reporter; + struct AutoReportTemp { static void report(); }; + static AutoReporter auto_reporter; #endif #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index e3732e5ef8..647e3f3e21 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -1226,9 +1226,7 @@ void CardReader::fileHasFinished() { } #if ENABLED(AUTO_REPORT_SD_STATUS) - TERN_(HAS_MULTI_SERIAL, serial_index_t CardReader::auto_report_port); - CardReader::AutoReportSD CardReader::auto_reporter; - void CardReader::AutoReportSD::auto_report() { report_status(); } + AutoReporter CardReader::auto_reporter; #endif #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index b10a5acd0d..0a89bbba78 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -179,13 +179,8 @@ public: // // SD Auto Reporting // - #if HAS_MULTI_SERIAL - static serial_index_t auto_report_port; - #else - static constexpr serial_index_t auto_report_port = 0; - #endif - class AutoReportSD : public AutoReporter { void auto_report(); }; - static AutoReportSD auto_reporter; + struct AutoReportSD { static void report() { report_status(); } }; + static AutoReporter auto_reporter; #endif private: diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests index 72d794634f..27d2fbf3ff 100755 --- a/buildroot/tests/LPC1768-tests +++ b/buildroot/tests/LPC1768-tests @@ -37,14 +37,15 @@ opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 -1 opt_set TEMP_SENSOR_BED 5 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING SOUND_MENU_ITEM \ NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR PREHEAT_BEFORE_LEVELING G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ HOST_KEEPALIVE_FEATURE HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT \ - LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER + LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \ + SDSUPPORT SDCARD_SORT_ALPHA AUTO_REPORT_SD_STATUS EMERGENCY_PARSER opt_set GRID_MAX_POINTS_X 16 opt_set NOZZLE_TO_PROBE_OFFSET "{ 0, 0, 0 }" opt_set NOZZLE_CLEAN_MIN_TEMP 170 diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 105258d402..e603ea2496 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -27,7 +27,7 @@ opt_set TEMP_SENSOR_4 1000 opt_set TEMP_SENSOR_BED 1 opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ - SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \ + SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT AUTO_REPORT_SD_STATUS SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ From 4153b6a30b0fdf1c215cc488db384bfa24a43720 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Mon, 1 Feb 2021 01:15:14 +0100 Subject: [PATCH 0965/1370] Refresh screen on M22 (detach) (#20958) --- Marlin/src/gcode/sd/M21_M22.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/sd/M21_M22.cpp b/Marlin/src/gcode/sd/M21_M22.cpp index a618bc0be3..f42784d8eb 100644 --- a/Marlin/src/gcode/sd/M21_M22.cpp +++ b/Marlin/src/gcode/sd/M21_M22.cpp @@ -26,6 +26,7 @@ #include "../gcode.h" #include "../../sd/cardreader.h" +#include "../../lcd/marlinui.h" /** * M21: Init SD Card @@ -36,9 +37,8 @@ void GcodeSuite::M21() { card.mount(); } * M22: Release SD Card */ void GcodeSuite::M22() { - if (!IS_SD_PRINTING()) card.release(); - + IF_ENABLED(TFT_COLOR_UI, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); } #endif // SDSUPPORT From 1e5995335c8a7b64640c5173573beebbfd3cc029 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Mon, 1 Feb 2021 01:18:39 +0100 Subject: [PATCH 0966/1370] LVGL UI G-code console (#20755) --- Marlin/src/HAL/AVR/HAL.h | 4 +- Marlin/src/HAL/AVR/MarlinSerial.cpp | 2 +- Marlin/src/HAL/AVR/MarlinSerial.h | 8 +- Marlin/src/HAL/STM32/HAL.h | 2 +- .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 1 - Marlin/src/HAL/STM32F1/MarlinSerial.h | 26 +++++ Marlin/src/core/macros.h | 4 +- Marlin/src/core/serial_hook.h | 7 +- .../src/lcd/extui/lib/mks_ui/draw_gcode.cpp | 109 ++++++++++++++++++ Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h | 33 ++++++ .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 24 +++- .../extui/lib/mks_ui/draw_level_settings.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp | 34 +++--- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 3 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 1 + Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 9 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 2 + .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 50 ++++---- .../lcd/extui/lib/mks_ui/tft_Language_it.h | 2 + .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 2 + .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 2 + .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 2 + .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 2 + .../extui/lib/mks_ui/tft_multi_language.cpp | 16 +++ .../lcd/extui/lib/mks_ui/tft_multi_language.h | 2 + Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h | 8 +- buildroot/tests/mega2560-tests | 5 +- docs/Serial.md | 16 +-- 28 files changed, 299 insertions(+), 79 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 2b565bbe13..5e22ac0836 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -82,14 +82,14 @@ typedef int8_t pin_t; // Serial ports #ifdef USBCON - #include "../../core/serial_hook.h" + #include "../../core/serial_hook.h" typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; extern DefaultSerial MSerial; #ifdef BLUETOOTH typedef ForwardSerial0Type< decltype(bluetoothSerial) > BTSerial; extern BTSerial btSerial; #endif - + #define MYSERIAL0 TERN(BLUETOOTH, btSerial, MSerial) #else #if !WITHIN(SERIAL_PORT, -1, 3) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 904395de1d..265acfae92 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -611,7 +611,7 @@ MSerialT customizedSerial1(MSerialT::HasEmergencyParser); template class MarlinSerial< LCDSerialCfg >; MSerialT4 lcdSerial(MSerialT4::HasEmergencyParser); - + #if HAS_DGUS_LCD template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::get_tx_buffer_free() { diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 93a3fb84d1..2834dbed35 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -238,11 +238,11 @@ static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); }; - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT; + typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT; extern MSerialT customizedSerial1; #ifdef SERIAL_PORT_2 - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT2; + typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT2; extern MSerialT2 customizedSerial2; #endif @@ -262,7 +262,7 @@ static constexpr bool RX_OVERRUNS = false; }; - typedef Serial0Type< MarlinSerial< MMU2SerialCfg > > MSerialT3; + typedef Serial0Type< MarlinSerial< MMU2SerialCfg > > MSerialT3; extern MSerial3 mmuSerial; #endif @@ -292,7 +292,7 @@ }; - typedef Serial0Type< MarlinSerial< LCDSerialCfg > > MSerialT4; + typedef Serial0Type< MarlinSerial< LCDSerialCfg > > MSerialT4; extern MSerialT4 lcdSerial; #endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 29df0a5c6d..5eb827b970 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -39,7 +39,7 @@ #ifdef USBCON #include - #include "../../core/serial_hook.h" + #include "../../core/serial_hook.h" typedef ForwardSerial0Type< decltype(SerialUSB) > DefaultSerial; extern DefaultSerial MSerial; #endif diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index e00fb9b16f..fc9b960c1c 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -163,7 +163,6 @@ GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - #if DISABLED(STM32F1xx) // TODO: use __HAL_RCC_SDIO_RELEASE_RESET() and __HAL_RCC_SDIO_CLK_ENABLE(); RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index 692e97e618..4c0bf0e100 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -28,6 +28,10 @@ #include "../../inc/MarlinConfigPre.h" #include "../../core/serial_hook.h" +#if HAS_TFT_LVGL_UI + extern "C" { extern char public_buf_m[100]; } +#endif + // Increase priority of serial interrupts, to reduce overflow errors #define UART_IRQ_PRIO 1 @@ -45,6 +49,28 @@ struct MarlinSerial : public HardwareSerial { nvic_irq_set_priority(c_dev()->irq_num, UART_IRQ_PRIO); } #endif + + #if HAS_TFT_LVGL_UI + // Hook the serial write method to capture the output of GCode command sent via LCD + uint32_t current_wpos; + void (*line_callback)(void *, const char * msg); + void *user_pointer; + + void set_hook(void (*hook)(void *, const char *), void * that) { line_callback = hook; user_pointer = that; current_wpos = 0; } + + size_t write(uint8_t c) { + if (line_callback) { + if (c == '\n' || current_wpos == sizeof(public_buf_m) - 1) { // End of line, probably end of command anyway + public_buf_m[current_wpos] = 0; + line_callback(user_pointer, public_buf_m); + current_wpos = 0; + } + else + public_buf_m[current_wpos++] = c; + } + return HardwareSerial::write(c); + } + #endif }; typedef Serial0Type MSerialT; diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index dcc688ae29..905b85d56d 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -320,8 +320,8 @@ template struct enable_if { }; template struct enable_if { typedef _Tp type; }; } - // C++11 solution using SFINAE to detect the existance of a member in a class at compile time. - // It creates a HasMember structure containing 'value' set to true if the member exists + // C++11 solution using SFINAE to detect the existance of a member in a class at compile time. + // It creates a HasMember structure containing 'value' set to true if the member exists #define HAS_MEMBER_IMPL(Member) \ namespace Private { \ template struct HasMember_ ## Member { \ diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index e14b821a9c..45e64d7793 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -131,10 +131,11 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria using BaseClassT::print; using BaseClassT::println; + // Underlying implementation might use Arduino's bool operator - bool connected() { - return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, static_cast(this), connected) : static_cast(this)->operator bool(); - } + bool connected() { + return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, static_cast(this), connected) : static_cast(this)->operator bool(); + } void setHook(WriteHook writeHook = 0, EndOfMessageHook eofHook = 0, void * userPointer = 0) { // Order is important here as serial code can be called inside interrupts diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.cpp new file mode 100644 index 0000000000..bd7028720a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.cpp @@ -0,0 +1,109 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "draw_ui.h" +#include + +#include "../../../../inc/MarlinConfig.h" + +extern lv_group_t *g; +static lv_obj_t *scr,*outL,*outV = 0; +static int currentWritePos = 0; +extern uint8_t public_buf[513]; +extern "C" { extern char public_buf_m[100]; } + +enum { + ID_GCODE_RETURN = 1, + ID_GCODE_COMMAND, +}; + +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + lv_clear_gcode(); + switch (obj->mks_obj_id) { + case ID_GCODE_RETURN: + lv_draw_more(); + return; + case ID_GCODE_COMMAND: + keyboard_value = GCodeCommand; + lv_draw_keyboard(); + break; + } +} + +void lv_show_gcode_output(void * that, const char * txt) { + // Ignore echo of command + if (!memcmp(txt, "echo:", 5)) { + public_buf[0] = 0; // Clear output buffer + return; + } + + // Avoid overflow if the answer is too large + size_t len = strlen((const char*)public_buf), tlen = strlen(txt); + if (len + tlen + 1 < sizeof(public_buf)) { + memcpy(public_buf + len, txt, tlen); + public_buf[len + tlen] = '\n'; + } +} + +void lv_serial_capt_hook(void * userPointer, uint8_t c) +{ + if (c == '\n' || currentWritePos == sizeof(public_buf_m) - 1) { // End of line, probably end of command anyway + public_buf_m[currentWritePos] = 0; + lv_show_gcode_output(userPointer, public_buf_m); + currentWritePos = 0; + } + else public_buf_m[currentWritePos++] = c; +} +void lv_eom_hook(void *) +{ + // Message is done, let's remove the hook now + MYSERIAL0.setHook(); + // We are back from the keyboard, so let's redraw ourselves + draw_return_ui(); +} + +void lv_draw_gcode(bool clear) { + if (clear) { + currentWritePos = 0; + public_buf[0] = 0; + } + scr = lv_screen_create(GCODE_UI, more_menu.gcode); + lv_screen_menu_item(scr, more_menu.entergcode, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_GCODE_COMMAND, 1); + outL = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 2, "Result:"); + outV = lv_label_create(scr, PARA_UI_POS_X, PARA_UI_POS_Y * 3, (const char*)public_buf); + + lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_GCODE_RETURN, true); +} + +void lv_clear_gcode() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); + outV = 0; +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h new file mode 100644 index 0000000000..30a378a15a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_gcode(bool clear = false); +extern void lv_clear_gcode(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index ee219d5d0d..2cf6f05a99 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -27,6 +27,7 @@ #include #include "../../../../inc/MarlinConfig.h" +#include "../../../../gcode/queue.h" extern lv_group_t *g; static lv_obj_t *scr; @@ -153,13 +154,22 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { lv_draw_wifi_tips(); break; #endif // MKS_WIFI_MODULE - case gcodeCommand: + case autoLevelGcodeCommand: uint8_t buf[100]; strncpy((char *)buf,ret_ta_txt,sizeof(buf)); update_gcode_command(AUTO_LEVELING_COMMAND_ADDR,buf); lv_clear_keyboard(); draw_return_ui(); break; + case GCodeCommand: + if (queue.length <= (BUFSIZE - 3)) { + // Hook anything that goes to the serial port + MYSERIAL0.setHook(lv_serial_capt_hook, lv_eom_hook, 0); + queue.enqueue_one_now(ret_ta_txt); + } + lv_clear_keyboard(); + // draw_return_ui is called in the end of message hook + break; default: break; } } @@ -238,12 +248,18 @@ void lv_draw_keyboard() { // Create a text area. The keyboard will write here lv_obj_t *ta = lv_ta_create(scr, nullptr); lv_obj_align(ta, nullptr, LV_ALIGN_IN_TOP_MID, 0, 10); - if (keyboard_value == gcodeCommand) { + switch (keyboard_value) { + case autoLevelGcodeCommand: get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); public_buf_m[sizeof(public_buf_m)-1] = 0; lv_ta_set_text(ta, public_buf_m); - } - else { + break; + case GCodeCommand: + // Start with uppercase by default + lv_btnm_set_map(kb, kb_map_uc); + lv_btnm_set_ctrl_map(kb, kb_ctrl_uc_map); + // Fallthrough + default: lv_ta_set_text(ta, ""); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index 58c6337204..b5c1890309 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -49,7 +49,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_draw_manual_level_pos_settings(); break; case ID_LEVEL_COMMAND: - keyboard_value = gcodeCommand; + keyboard_value = autoLevelGcodeCommand; lv_draw_keyboard(); break; #if HAS_BED_PROBE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp index 76bb34988a..c085c4c936 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp @@ -41,20 +41,19 @@ enum { ID_CUSTOM_4, ID_CUSTOM_5, ID_CUSTOM_6, - ID_CUSTOM_7, ID_M_RETURN, }; static void event_handler(lv_obj_t * obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { + case ID_GCODE: lv_clear_more(); lv_draw_gcode(true); break; case ID_CUSTOM_1: TERN_(USER_CMD_1_ENABLE, queue.inject_P(PSTR(USER_GCODE_1))); break; case ID_CUSTOM_2: TERN_(USER_CMD_2_ENABLE, queue.inject_P(PSTR(USER_GCODE_2))); break; case ID_CUSTOM_3: TERN_(USER_CMD_3_ENABLE, queue.inject_P(PSTR(USER_GCODE_3))); break; case ID_CUSTOM_4: TERN_(USER_CMD_4_ENABLE, queue.inject_P(PSTR(USER_GCODE_4))); break; case ID_CUSTOM_5: TERN_(USER_CMD_5_ENABLE, queue.inject_P(PSTR(USER_GCODE_5))); break; case ID_CUSTOM_6: TERN_(USER_CMD_6_ENABLE, queue.inject_P(PSTR(USER_GCODE_6))); break; - case ID_CUSTOM_7: TERN_(USER_CMD_7_ENABLE, queue.inject_P(PSTR(USER_GCODE_7))); break; case ID_M_RETURN: lv_clear_more(); lv_draw_tool(); @@ -67,53 +66,54 @@ void lv_draw_more() { const bool enc_ena = TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable); + lv_obj_t *buttonGCode = lv_imgbtn_create(scr, "F:/bmp_machine_para.bin", INTERVAL_V, titleHeight, event_handler, ID_GCODE); + if (enc_ena) lv_group_add_obj(g, buttonGCode); + lv_obj_t *labelGCode = lv_label_create_empty(buttonGCode); + #if ENABLED(USER_CMD_1_ENABLE) - lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", INTERVAL_V, titleHeight, event_handler, ID_CUSTOM_1); + lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_CUSTOM_1); if (enc_ena) lv_group_add_obj(g, buttonCustom1); lv_obj_t *labelCustom1 = lv_label_create_empty(buttonCustom1); #endif #if ENABLED(USER_CMD_2_ENABLE) - lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_CUSTOM_2); + lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_CUSTOM_2); if (enc_ena) lv_group_add_obj(g, buttonCustom2); lv_obj_t *labelCustom2 = lv_label_create_empty(buttonCustom2); #endif #if ENABLED(USER_CMD_3_ENABLE) - lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_CUSTOM_3); + lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_CUSTOM_3); if (enc_ena) lv_group_add_obj(g, buttonCustom3); lv_obj_t *labelCustom3 = lv_label_create_empty(buttonCustom3); #endif #if ENABLED(USER_CMD_4_ENABLE) - lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_CUSTOM_4); + lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_4); if (enc_ena) lv_group_add_obj(g, buttonCustom4); lv_obj_t *labelCustom4 = lv_label_create_empty(buttonCustom4); #endif #if ENABLED(USER_CMD_5_ENABLE) - lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5); + lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5); if (enc_ena) lv_group_add_obj(g, buttonCustom5); lv_obj_t *labelCustom5 = lv_label_create_empty(buttonCustom5); #endif #if ENABLED(USER_CMD_6_ENABLE) - lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6); + lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6); if (enc_ena) lv_group_add_obj(g, buttonCustom6); lv_obj_t *labelCustom6 = lv_label_create_empty(buttonCustom6); #endif - #if ENABLED(USER_CMD_7_ENABLE) - blv_obj_t *uttonCustom7 = lv_imgbtn_create(scr, "F:/bmp_custom7.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_7); - if (enc_ena) lv_group_add_obj(g, buttonCustom7); - lv_obj_t *labelCustom7 = lv_label_create_empty(buttonCustom7); - #endif - lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN); if (enc_ena) lv_group_add_obj(g, buttonBack); lv_obj_t *label_Back = lv_label_create_empty(buttonBack); if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelGCode, more_menu.gcode); + lv_obj_align(labelGCode, buttonGCode, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #if ENABLED(USER_CMD_1_ENABLE) lv_label_set_text(labelCustom1, more_menu.custom1); lv_obj_align(labelCustom1, buttonCustom1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -138,23 +138,19 @@ void lv_draw_more() { lv_label_set_text(labelCustom6, more_menu.custom6); lv_obj_align(labelCustom6, buttonCustom6, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif - #if ENABLED(USER_CMD_7_ENABLE) - lv_label_set_text(labelCustom7, more_menu.custom7); - lv_obj_align(labelCustom7, buttonCustom7, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - #endif lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } #if BUTTONS_EXIST(EN1, EN2, ENC) if (enc_ena) { + lv_group_add_obj(g, buttonGCode); TERN_(USER_CMD_1_ENABLE, lv_group_add_obj(g, buttonCustom1)); TERN_(USER_CMD_2_ENABLE, lv_group_add_obj(g, buttonCustom2)); TERN_(USER_CMD_3_ENABLE, lv_group_add_obj(g, buttonCustom3)); TERN_(USER_CMD_4_ENABLE, lv_group_add_obj(g, buttonCustom4)); TERN_(USER_CMD_5_ENABLE, lv_group_add_obj(g, buttonCustom5)); TERN_(USER_CMD_6_ENABLE, lv_group_add_obj(g, buttonCustom6)); - TERN_(USER_CMD_7_ENABLE, lv_group_add_obj(g, buttonCustom7)); lv_group_add_obj(g, buttonBack); } #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 682d40858c..a2ecb0e436 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -71,7 +71,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; lv_draw_filament_change(); break; - case ID_T_MORE: break; + case ID_T_MORE: lv_draw_more(); break; case ID_T_RETURN: TERN_(MKS_TEST, curent_disp_ui = 1); lv_draw_ready_print(); @@ -87,6 +87,7 @@ void lv_draw_tool() { lv_big_button_create(scr, "F:/bmp_zero.bin", tool_menu.home, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_T_HOME); lv_big_button_create(scr, "F:/bmp_leveling.bin", tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling), INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_LEVELING); lv_big_button_create(scr, "F:/bmp_filamentchange.bin", tool_menu.filament, BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight, event_handler,ID_T_FILAMENT); + lv_big_button_create(scr, "F:/bmp_more.bin", tool_menu.more, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_MORE); lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 84049d51ab..9d13ca3120 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -1077,6 +1077,7 @@ void draw_return_ui() { case NOZZLE_PROBE_OFFSET_UI: lv_draw_auto_level_offset_settings(); break; #endif case TOOL_UI: lv_draw_tool(); break; + case GCODE_UI: lv_draw_gcode(); break; case MESHLEVELING_UI: break; case HARDWARE_TEST_UI: break; #if ENABLED(MKS_WIFI_MODULE) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index f02a58ad43..34c6b1f254 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -46,6 +46,7 @@ #include "draw_preHeat.h" #include "draw_extrusion.h" #include "draw_home.h" +#include "draw_gcode.h" #include "draw_more.h" #include "draw_move_motor.h" #include "draw_fan.h" @@ -326,7 +327,8 @@ typedef enum { WIFI_SETTINGS_UI, HOMING_SENSITIVITY_UI, ENCODER_SETTINGS_UI, - TOUCH_CALIBRATION_UI + TOUCH_CALIBRATION_UI, + GCODE_UI, } DISP_STATE; typedef struct { @@ -413,7 +415,8 @@ typedef enum { wifiName, wifiPassWord, wifiConfig, - gcodeCommand + autoLevelGcodeCommand, + GCodeCommand, } keyboard_value_state; extern keyboard_value_state keyboard_value; @@ -449,6 +452,8 @@ extern void preview_gcode_prehandle(char *path); extern void update_spi_flash(); extern void update_gcode_command(int addr,uint8_t *s); extern void get_gcode_command(int addr,uint8_t *d); +extern void lv_serial_capt_hook(void *, uint8_t); +extern void lv_eom_hook(void *); #if HAS_GCODE_PREVIEW extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 2261eeeba9..5fa1c82027 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -279,6 +279,8 @@ #define AUTO_LEVELING_TEXT_EN "AutoLevel" #define SET_TEXT_EN "Settings" #define MORE_TEXT_EN "More" +#define MORE_GCODE_EN "G-Code" +#define MORE_ENTER_GCODE_EN "Enter G-Code" #define ADD_TEXT_EN "Add" #define DEC_TEXT_EN "Dec" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index e3226b3cbe..55416f0254 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -22,7 +22,7 @@ #pragma once //*************法文****************************// -#define TOOL_TEXT_FR "prêt" +#define TOOL_TEXT_FR "Prêt" #define PREHEAT_TEXT_FR "Préchauffe" #define MOVE_TEXT_FR "Déplace" #define HOME_TEXT_FR "Acceuil" @@ -32,6 +32,8 @@ #define AUTO_LEVELING_TEXT_FR "AutoLevel" #define SET_TEXT_FR "Config" #define MORE_TEXT_FR "Plus" +#define MORE_GCODE_FR "G-Code" +#define MORE_ENTER_GCODE_FR "Saisir G-Code" #define ADD_TEXT_FR "Ajouter" #define DEC_TEXT_FR "Réduire" @@ -74,7 +76,7 @@ #define PAGE_DOWN_TEXT_FR "En bas" #define EXTRUDER_IN_TEXT_FR "Insérer" -#define EXTRUDER_OUT_TEXT_FR "éjecter" +#define EXTRUDER_OUT_TEXT_FR "Éjecter" #define EXTRUDE_1MM_TEXT_FR "1mm" #define EXTRUDE_5MM_TEXT_FR "5mm" #define EXTRUDE_10MM_TEXT_FR "10mm" @@ -91,13 +93,13 @@ #define FILESYS_TEXT_FR "Fichier" #define WIFI_TEXT_FR "WiFi" #define FAN_TEXT_FR "Fan" -#define ABOUT_TEXT_FR "A propos" +#define ABOUT_TEXT_FR "À propos" #define BREAK_POINT_TEXT_FR "Continuer" #define FILAMENT_TEXT_FR "Remplacer" #define LANGUAGE_TEXT_FR "Langue" #define MOTOR_OFF_TEXT_FR "M-hors" #define MOTOR_OFF_XY_TEXT_FR "M-hors-XY" -#define SHUTDOWN_TEXT_FR "Eteindre" +#define SHUTDOWN_TEXT_FR "Éteindre" #define MACHINE_PARA_FR "Config" #define EEPROM_SETTINGS_FR "Eeprom Set" @@ -130,27 +132,27 @@ #define FAN_TIPS2_TEXT_FR "ventilateur\n0" #define FILAMENT_IN_TEXT_FR "Insérer" -#define FILAMENT_OUT_TEXT_FR "éjecter" +#define FILAMENT_OUT_TEXT_FR "Éjecter" #define FILAMENT_EXT0_TEXT_FR "Extr1" #define FILAMENT_EXT1_TEXT_FR "Extr2" #define FILAMENT_HEAT_TEXT_FR "Preheat" #define FILAMENT_STOP_TEXT_FR "Arrêter" #define FILAMENT_TIPS2_TEXT_FR "T:" #define FILAMENT_TIPS3_TEXT_FR "Insérer le filament..." -#define FILAMENT_TIPS4_TEXT_FR "éjecter le filament..." +#define FILAMENT_TIPS4_TEXT_FR "Éjecter le filament..." #define FILAMENT_TIPS5_TEXT_FR "Température trop basse pour démarrer, chauffez svp" #define FILAMENT_TIPS6_TEXT_FR "Terminé" -#define FILAMENT_CHANGE_TEXT_FR "Please click \nor ,After \npinter pause." -#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..." -#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..." -#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament \nto extruder,and click \nfor start loading." -#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,\nand click for start loading." -#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!" -#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,\nclick for return!" -#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,\nclick for return!" +#define FILAMENT_CHANGE_TEXT_FR "Veuillez presser \nou , après \nla pause." +#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Chauffe de la tête\nPatientez SVP..." +#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Chauffe de la tête\nPatientez SVP..." +#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Tête chaude, veuillez charger le\nfilament dans l'extruder & \nle chargement." +#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Veuillez charger le filament dans\nl'extruder & le chargement." +#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Tête chaude, \npour le déchargement." +#define FILAMENT_DIALOG_LOADING_TIPS_FR "Chargement, patientez SVP." +#define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Déchargement, patientez SVP." +#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Chargement terminé,\n pour revenir!" +#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Déchargement terminé,\n pour revenir!" #define PRE_HEAT_EXT_TEXT_FR "E" @@ -205,12 +207,12 @@ #define TITLE_FAN_FR "Ventilateur" #define TITLE_LANGUAGE_FR "Langue" #define TITLE_PAUSE_FR "Pause" -#define TITLE_CHANGESPEED_FR "Speed" +#define TITLE_CHANGESPEED_FR "Vitesse" #define TITLE_CLOUD_TEXT_FR "Cloud" -#define TITLE_DIALOG_CONFIRM_FR "Confirm" +#define TITLE_DIALOG_CONFIRM_FR "Confirmer" #define TITLE_FILESYS_FR "FileSys" -#define DIALOG_CLOSE_MACHINE_FR "Closing machine......" +#define DIALOG_CLOSE_MACHINE_FR "Extinction..." #define AUTO_SHUTDOWN_FR "Auto" #define MANUAL_SHUTDOWN_FR "Manuel" @@ -220,7 +222,7 @@ #define DIALOG_OK_FR "OK" #define DIALOG_RESET_FR "Réinitialiser" #define DIALOG_RETRY_FR "Recommencez" -#define DIALOG_DISABLE_FR "Disable" +#define DIALOG_DISABLE_FR "Désactiver" #define DIALOG_PRINT_MODEL_FR "Imprimer le fichier?" #define DIALOG_CANCEL_PRINT_FR "Arrêter?" @@ -229,12 +231,12 @@ #define DIALOG_ERROR_TIPS1_FR "Erreur:error:Aucun fichier, \nvérifiez à nouveau." #define DIALOG_ERROR_TIPS2_FR "Erreur:La opération a échoué. \nVerifiez que le baudrate de l'écran et de \nla carte mère soient identique!" #define DIALOG_ERROR_TIPS3_FR "Erreur: le nom du fichier ou le \nchemin d'accès est trop long." -#define DIALOG_UNBIND_PRINTER_FR "Unbind the printer?" -#define DIALOG_FILAMENT_NO_PRESS_FR "Filament detection switch is not pressed" +#define DIALOG_UNBIND_PRINTER_FR "Déconnecter l'imprimante?" +#define DIALOG_FILAMENT_NO_PRESS_FR "Détecteur de filament non pressé" #define DIALOG_PRINT_FINISH_FR "L'impression est terminée!" #define DIALOG_PRINT_TIME_FR "Temps d'impression: " -#define DIALOG_REPRINT_FR "Print again" -#define DIALOG_WIFI_ENABLE_TIPS_FR "The wifi module is being configured,\nplease wait a moment....." +#define DIALOG_REPRINT_FR "Réimprimer" +#define DIALOG_WIFI_ENABLE_TIPS_FR "Le module WIFI se charge\nAttendez SVP..." #define MESSAGE_PAUSING_FR "Parking..." #define MESSAGE_CHANGING_FR "Attente filament pour démarrer" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index 2a1ba83cd0..d46cccfeb8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -32,6 +32,8 @@ #define AUTO_LEVELING_TEXT_IT "AutoLevel" #define SET_TEXT_IT "Imposta" #define MORE_TEXT_IT "Di più" +#define MORE_GCODE_IT "G-Code" +#define MORE_ENTER_GCODE_IT "Inserisci il G-Code" #define ADD_TEXT_IT "Aumentare" #define DEC_TEXT_IT "Ridurre" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index 94103354b9..f5955c38d1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -32,6 +32,8 @@ #define AUTO_LEVELING_TEXT_RU "aвтоуровень" #define SET_TEXT_RU "наÑтройки" #define MORE_TEXT_RU "больше" +#define MORE_GCODE_RU "G-код" +#define MORE_ENTER_GCODE_RU "Введите G-код" #define ADD_TEXT_RU "добавить" #define DEC_TEXT_RU "уменьшить" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index 046968ba87..7ae87b5d3f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -263,6 +263,8 @@ #define AUTO_LEVELING_TEXT_CN "自动调平" #define SET_TEXT_CN "设置" #define MORE_TEXT_CN "更多" +#define MORE_GCODE_CN "G-Code" +#define MORE_ENTER_GCODE_CN "Enter G-Code" #define ADD_TEXT_CN "增加" #define DEC_TEXT_CN "å‡å°‘" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 0b714930eb..28afe186f1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -33,6 +33,8 @@ #define AUTO_LEVELING_TEXT_SP "Autolevel" #define SET_TEXT_SP "Config" #define MORE_TEXT_SP "Más" +#define MORE_GCODE_SP "G-Code" +#define MORE_ENTER_GCODE_SP "Introduzca el G-Code" #define ADD_TEXT_SP "Más" #define DEC_TEXT_SP "Menos" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 30d0430313..8d38bc3c9a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -263,6 +263,8 @@ #define AUTO_LEVELING_TEXT_T_CN "自動調平" #define SET_TEXT_T_CN "設置" #define MORE_TEXT_T_CN "更多" +#define MORE_GCODE_T_CN "G-Code" +#define MORE_ENTER_GCODE_T_CN "Enter G-Code" #define ADD_TEXT_T_CN "增加" #define DEC_TEXT_T_CN "減少" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 28c90486d0..1fd17c20f7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -943,6 +943,8 @@ void disp_language_init() { filesys_menu.usb_sys = U_DISK_TEXT_CN; // more_menu.title = TITLE_MORE_CN; + more_menu.gcode = MORE_GCODE_CN; + more_menu.entergcode = MORE_ENTER_GCODE_CN; TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_CN); TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_CN); TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_CN); @@ -1175,6 +1177,8 @@ void disp_language_init() { filesys_menu.usb_sys = U_DISK_TEXT_T_CN; // more_menu.title = TITLE_MORE_T_CN; + more_menu.gcode = MORE_GCODE_T_CN; + more_menu.entergcode = MORE_ENTER_GCODE_T_CN; TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_T_CN); TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_T_CN); TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_T_CN); @@ -1394,6 +1398,8 @@ void disp_language_init() { set_menu.eepromSet = EEPROM_SETTINGS_EN; // more_menu.title = TITLE_MORE_EN; + more_menu.gcode = MORE_GCODE_EN; + more_menu.entergcode = MORE_ENTER_GCODE_EN; TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_EN); TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_EN); TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_EN); @@ -1614,6 +1620,8 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_RU; set_menu.eepromSet = EEPROM_SETTINGS_RU; more_menu.title = TITLE_MORE_RU; + more_menu.gcode = MORE_GCODE_RU; + more_menu.entergcode = MORE_ENTER_GCODE_RU; #if ENABLED(USER_CMD_1_ENABLE) more_menu.custom1 = MORE_CUSTOM1_TEXT_RU; #endif @@ -1944,6 +1952,8 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_SP; set_menu.eepromSet = EEPROM_SETTINGS_SP; more_menu.title = TITLE_MORE_SP; + more_menu.gcode = MORE_GCODE_SP; + more_menu.entergcode = MORE_ENTER_GCODE_SP; #if ENABLED(USER_CMD_1_ENABLE) more_menu.custom1 = MORE_CUSTOM1_TEXT_SP; #endif @@ -2179,6 +2189,8 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_FR; set_menu.eepromSet = EEPROM_SETTINGS_FR; more_menu.title = TITLE_MORE_FR; + more_menu.gcode = MORE_GCODE_FR; + more_menu.entergcode = MORE_ENTER_GCODE_FR; #if ENABLED(USER_CMD_1_ENABLE) more_menu.custom1 = MORE_CUSTOM1_TEXT_FR; #endif @@ -2415,6 +2427,8 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_IT; set_menu.eepromSet = EEPROM_SETTINGS_IT; more_menu.title = TITLE_MORE_IT; + more_menu.gcode = MORE_GCODE_IT; + more_menu.entergcode = MORE_ENTER_GCODE_IT; #if ENABLED(USER_CMD_1_ENABLE) more_menu.custom1 = MORE_CUSTOM1_TEXT_IT; #endif @@ -2651,6 +2665,8 @@ void disp_language_init() { set_menu.eepromSet = EEPROM_SETTINGS_EN; // more_menu.title = TITLE_MORE_EN; + more_menu.gcode = MORE_GCODE_EN; + more_menu.entergcode = MORE_ENTER_GCODE_EN; TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_EN); TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_EN); TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_EN); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index a3b55d469b..731b2eaecd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -464,6 +464,8 @@ typedef struct more_menu_disp { const char *custom5; const char *custom6; const char *custom7; + const char *gcode; + const char *entergcode; const char *back; } more_menu_def; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h index c2885ccc90..fcc35a6a65 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h @@ -80,10 +80,10 @@ class WifiSerial { } /* TXE signifies readiness to send a byte to DR. */ if ((regs->CR1 & USART_CR1_TXEIE) && (regs->SR & USART_SR_TXE)) { - if (!rb_is_empty(this->usart_device->wb)) - regs->DR=rb_remove(this->usart_device->wb); - else - regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE + if (!rb_is_empty(this->usart_device->wb)) + regs->DR=rb_remove(this->usart_device->wb); + else + regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE } } diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index e603ea2496..aef2b8756a 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -72,8 +72,9 @@ opt_set TEMP_SENSOR_1 1 opt_set TEMP_SENSOR_2 1 opt_set TEMP_SENSOR_3 1 opt_set TEMP_SENSOR_4 1 -opt_enable VIKI2 Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ - AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ +opt_enable VIKI2 BOOT_MARLIN_LOGO_ANIMATED SDSUPPORT AUTO_REPORT_SD_STATUS \ + Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE \ + EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULLUP diff --git a/docs/Serial.md b/docs/Serial.md index 317f5f8c93..69fa94fc15 100644 --- a/docs/Serial.md +++ b/docs/Serial.md @@ -10,13 +10,13 @@ Starting with version `2.0.9`, Marlin provides a common interface for its serial ## Common interface -This interface is declared in `Marlin/src/core/serial_base.h` +This interface is declared in `Marlin/src/core/serial_base.h` Any implementation will need to follow this interface for being used transparently in Marlin's codebase. The implementation was written to prioritize performance over abstraction, so the base interface is not using virtual inheritance to avoid the cost of virtual dispatching while calling methods. Instead, the Curiously Recurring Template Pattern (**CRTP**) is used so that, upon compilation, the interface abstraction does not incur a performance cost. -Because some platform do not follow the same interface, the missing method in the actual low-level implementation are detected via SFINAE and a wrapper is generated when such method are missing. See `CALL_IF_EXISTS` macro in `Marlin/src/core/macros.h` for the documentation of this technic. +Because some platform do not follow the same interface, the missing method in the actual low-level implementation are detected via SFINAE and a wrapper is generated when such method are missing. See `CALL_IF_EXISTS` macro in `Marlin/src/core/macros.h` for the documentation of this technic. ## Composing the desired feature The different specificities for each architecture are provided by composing the serial type based on desired functionality. @@ -25,11 +25,11 @@ In the `Marlin/src/core/serial_hook.h` file, the different serial feature are de 2. `ForwardSerial` is a composing wrapper. It references an actual Arduino compatible `Serial` instance. You'll use this if the instance is declared in the platform's framework and is being referred directly in the framework. This is not as efficient as the `BaseSerial` implementation since static dereferencing is done for each method call (it'll still be faster than virtual dispatching) 3. `ConditionalSerial` is working a bit like the `ForwardSerial` interface, but it checks a boolean condition before calling the referenced instance. You'll use it when the serial output can be switch off at runtime, for example in a *telnet* like serial output that should not emit any packet if no client is connected. 4. `RuntimeSerial` is providing a runtime-modifiable hooking method for its `write` and `msgDone` method. You'll use it if you need to capture the serial output of Marlin, for example to display the G-Code parser's output on a GUI interface. The hooking interface is setup via the `setHook` method. -5. `MultiSerial` is a runtime modifiable serial output multiplexer. It can output (*respectively input*) to 2 different interface based on a port *mask*. You'll use this if you need to output the same serial stream to multiple port. You can plug a `MultiSerial` to itself to duplicate to more than 2 ports. +5. `MultiSerial` is a runtime modifiable serial output multiplexer. It can output (*respectively input*) to 2 different interface based on a port *mask*. You'll use this if you need to output the same serial stream to multiple port. You can plug a `MultiSerial` to itself to duplicate to more than 2 ports. ## Plumbing -Since all the types above are using CRTP, it's possible to combine them to get the appropriate functionality. -This is easily done via type definition of the feature. +Since all the types above are using CRTP, it's possible to combine them to get the appropriate functionality. +This is easily done via type definition of the feature. For example, to present a serial interface that's outputting to 2 serial port, the first one being hooked at runtime and the second one connected to a runtime switchable telnet client, you'll declare the type to use as: ``` @@ -37,8 +37,8 @@ typedef MultiSerial< RuntimeSerial, ConditionalSerial > Se ``` ## Emergency parser -By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it. -Because of this condition, all underlying type takes a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used. +By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it. +Because of this condition, all underlying type takes a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used. -*This document was written by [X-Ryl669](https://blog.cyril.by) and is under [CC-SA license](https://creativecommons.org/licenses/by-sa)* \ No newline at end of file +*This document was written by [X-Ryl669](https://blog.cyril.by) and is under [CC-SA license](https://creativecommons.org/licenses/by-sa)* From 8de850fd07ecffdf31f07500aa959f8170ff5747 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 3 Feb 2021 09:30:19 +1300 Subject: [PATCH 0967/1370] Fix host_response_handler compile (#20962) --- Marlin/src/feature/host_actions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index 5ba3a3e3d2..c194fb7a5b 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -182,7 +182,7 @@ void host_action(PGM_P const pstr, const bool eol) { break; case PROMPT_PAUSE_RESUME: msg = PSTR("LCD_PAUSE_RESUME"); - #if ENABLED(ADVANCED_PAUSE_FEATURE) + #if BOTH(ADVANCED_PAUSE_FEATURE, SDSUPPORT) extern const char M24_STR[]; queue.inject_P(M24_STR); #endif From 811b3d0f08e7552f644ba4e9d27f870ab221bd7a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 2 Feb 2021 17:31:01 -0300 Subject: [PATCH 0968/1370] Include ui_common for MARLIN_LOGO_FULL_SIZE (#20963) --- Marlin/src/lcd/tft/tft_image.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index 851410b2e0..f3480705e1 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -25,6 +25,7 @@ #if HAS_GRAPHICAL_TFT #include "tft_image.h" +#include "ui_common.h" const tImage NoLogo = { nullptr, 0, 0, NOCOLORS }; From 0badef42d58d04eec4aad0a91033e45fcead5e73 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 2 Feb 2021 17:31:51 -0300 Subject: [PATCH 0969/1370] Touch Calibration Screen auto-save option (#20971) --- Marlin/Configuration.h | 4 ++++ Marlin/src/lcd/tft_io/touch_calibration.cpp | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d888e62aaf..d0c00d4ef5 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2457,6 +2457,10 @@ //#define TOUCH_OFFSET_Y 257 //#define TOUCH_ORIENTATION TOUCH_LANDSCAPE + #if BOTH(TOUCH_SCREEN_CALIBRATION, EEPROM_SETTINGS) + #define TOUCH_CALIBRATION_AUTO_SAVE // Auto save successful calibration values to EEPROM + #endif + #if ENABLED(TFT_COLOR_UI) //#define SINGLE_TOUCH_NAVIGATION #endif diff --git a/Marlin/src/lcd/tft_io/touch_calibration.cpp b/Marlin/src/lcd/tft_io/touch_calibration.cpp index 3c24d42734..0f9d25caeb 100644 --- a/Marlin/src/lcd/tft_io/touch_calibration.cpp +++ b/Marlin/src/lcd/tft_io/touch_calibration.cpp @@ -28,6 +28,10 @@ #define DEBUG_OUT ENABLED(DEBUG_TOUCH_CALIBRATION) #include "../../core/debug_out.h" +#if ENABLED(TOUCH_CALIBRATION_AUTO_SAVE) + #include "../../module/settings.h" +#endif + TouchCalibration touch_calibration; touch_calibration_t TouchCalibration::calibration; @@ -78,6 +82,7 @@ void TouchCalibration::validate_calibration() { SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x); SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y); SERIAL_ECHO_TERNARY(calibration.orientation == TOUCH_LANDSCAPE, "TOUCH_ORIENTATION ", "TOUCH_LANDSCAPE", "TOUCH_PORTRAIT", "\n"); + TERN_(TOUCH_CALIBRATION_AUTO_SAVE, settings.save()); } } From 460cdf4c094a7d5dcd98f3082e90450e3df6a4bc Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Tue, 2 Feb 2021 21:33:07 +0100 Subject: [PATCH 0970/1370] Multi-language pertains to Color UI (#20972) --- Marlin/Configuration_adv.h | 2 +- Marlin/src/lcd/tft/tft_string.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d21c5069d6..ea75f48f7a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1529,7 +1529,7 @@ // // Specify additional languages for the UI. Default specified by LCD_LANGUAGE. // -#if EITHER(DOGLCD, TOUCH_UI_FTDI_EVE) +#if ANY(DOGLCD, TFT_COLOR_UI, TOUCH_UI_FTDI_EVE) //#define LCD_LANGUAGE_2 fr //#define LCD_LANGUAGE_3 de //#define LCD_LANGUAGE_4 es diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index 31ac14cf92..c2a571e826 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -26,6 +26,7 @@ #include "tft_string.h" #include "../fontutils.h" +#include "../marlinui.h" //#define DEBUG_TFT_FONT #define DEBUG_OUT ENABLED(DEBUG_TFT_FONT) From da80fd782c37ace9cdb2e79886104ef92017d641 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 2 Feb 2021 17:55:11 -0300 Subject: [PATCH 0971/1370] STM32 Shared Media - USB Mass Storage Device (#20956) --- Marlin/src/HAL/STM32/HAL.cpp | 18 ++++ Marlin/src/HAL/STM32/HAL.h | 2 + Marlin/src/HAL/STM32/inc/Conditionals_adv.h | 2 +- Marlin/src/HAL/STM32/msc_sd.cpp | 112 ++++++++++++++++++++ Marlin/src/HAL/STM32/msc_sd.h | 18 ++++ platformio.ini | 16 +++ 6 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 Marlin/src/HAL/STM32/msc_sd.cpp create mode 100644 Marlin/src/HAL/STM32/msc_sd.h diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index b8db5b5e0b..06744f16b8 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -42,6 +42,11 @@ #endif #endif +#if HAS_SD_HOST_DRIVE + #include "msc_sd.h" + #include "usbd_cdc_if.h" +#endif + // ------------------------ // Public Variables // ------------------------ @@ -88,6 +93,19 @@ void HAL_init() { #if ENABLED(EMERGENCY_PARSER) && USBD_USE_CDC USB_Hook_init(); #endif + + #if HAS_SD_HOST_DRIVE + MSC_SD_init(); // Enable USB SD card access + #endif +} + +// HAL idle task +void HAL_idletask() { + #if HAS_SHARED_MEDIA + // Stm32duino currently doesn't have a "loop/idle" method + CDC_resume_receive(); + CDC_continue_transmit(); + #endif } void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 5eb827b970..8f6c0a5990 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -135,6 +135,8 @@ extern uint16_t HAL_adc_result; // Enable hooks into setup for HAL void HAL_init(); +#define HAL_IDLETASK 1 +void HAL_idletask(); // Clear reset reason void HAL_clear_reset_source(); diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h index e07c0d9cda..672d405d6b 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h @@ -21,6 +21,6 @@ */ #pragma once -#if defined(USBD_USE_CDC_COMPOSITE) && DISABLED(NO_SD_HOST_DRIVE) +#if defined(USBD_USE_CDC_MSC) && DISABLED(NO_SD_HOST_DRIVE) #define HAS_SD_HOST_DRIVE 1 #endif diff --git a/Marlin/src/HAL/STM32/msc_sd.cpp b/Marlin/src/HAL/STM32/msc_sd.cpp new file mode 100644 index 0000000000..63ce7808f1 --- /dev/null +++ b/Marlin/src/HAL/STM32/msc_sd.cpp @@ -0,0 +1,112 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../inc/MarlinConfigPre.h" + +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && HAS_SD_HOST_DRIVE + +#include "msc_sd.h" +#include "../shared/Marduino.h" +#include "usbd_core.h" +#include +#include + +#define BLOCK_SIZE 512 +#define PRODUCT_ID 0x29 + +#include "../../sd/cardreader.h" + +class Sd2CardUSBMscHandler : public USBMscHandler { +public: + bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) { + *pBlockNum = card.getSd2Card().cardSize(); + *pBlockSize = BLOCK_SIZE; + return true; + } + + bool Write(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) { + auto sd2card = card.getSd2Card(); + // single block + if (blkLen == 1) { + watchdog_refresh(); + sd2card.writeBlock(blkAddr, pBuf); + return true; + } + + // multi block optmization + sd2card.writeStart(blkAddr, blkLen); + while (blkLen--) { + watchdog_refresh(); + sd2card.writeData(pBuf); + pBuf += BLOCK_SIZE; + } + sd2card.writeStop(); + return true; + } + + bool Read(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) { + auto sd2card = card.getSd2Card(); + // single block + if (blkLen == 1) { + watchdog_refresh(); + sd2card.readBlock(blkAddr, pBuf); + return true; + } + + // multi block optmization + sd2card.readStart(blkAddr); + while (blkLen--) { + watchdog_refresh(); + sd2card.readData(pBuf); + pBuf += BLOCK_SIZE; + } + sd2card.readStop(); + return true; + } + + bool IsReady() { + return card.isMounted(); + } +}; + +Sd2CardUSBMscHandler usbMscHandler; + +/* USB Mass storage Standard Inquiry Data */ +uint8_t Marlin_STORAGE_Inquirydata[] = { /* 36 */ + /* LUN 0 */ + 0x00, + 0x80, + 0x02, + 0x02, + (STANDARD_INQUIRY_DATA_LEN - 5), + 0x00, + 0x00, + 0x00, + 'M', 'A', 'R', 'L', 'I', 'N', ' ', ' ', /* Manufacturer : 8 bytes */ + 'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */ + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + '0', '.', '0', '1', /* Version : 4 Bytes */ +}; + +USBMscHandler *pSingleMscHandler = &usbMscHandler; + +void MSC_SD_init() { + USBDevice.end(); + delay(200); + USBDevice.begin(); + USBDevice.registerMscHandlers(1, &pSingleMscHandler, Marlin_STORAGE_Inquirydata); +} + +#endif // __STM32F1__ && HAS_SD_HOST_DRIVE diff --git a/Marlin/src/HAL/STM32/msc_sd.h b/Marlin/src/HAL/STM32/msc_sd.h new file mode 100644 index 0000000000..a8e5349f7c --- /dev/null +++ b/Marlin/src/HAL/STM32/msc_sd.h @@ -0,0 +1,18 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +void MSC_SD_init(); diff --git a/platformio.ini b/platformio.ini index 2d81baa200..6008b943ec 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1524,6 +1524,22 @@ build_flags = ${stm32_flash_drive.build_flags} -DUSE_USB_HS_IN_FS -DUSBD_USE_CDC +# +# MKS Robin Nano V3 with USB Flash Drive Support and Shared Media +# Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged +# +[env:mks_robin_nano_v3_usb_flash_drive_msc] +extends = env:mks_robin_nano_v3 +platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip +build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC +build_flags = ${stm32_flash_drive.build_flags} + -DUSBCON + -DUSE_USBHOST_HS + -DUSBD_IRQ_PRIO=5 + -DUSBD_IRQ_SUBPRIO=6 + -DUSE_USB_HS_IN_FS + -DUSBD_USE_CDC_MSC + # # Mingda MPX_ARM_MINI # From 032152c41d4a6671ba7ef661a02e5d7a7630e67f Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 2 Feb 2021 21:57:30 +0100 Subject: [PATCH 0972/1370] Update a UBL comment (#20931) --- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index b0640e5fa2..513d9a9121 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -214,7 +214,7 @@ else if (isnan(f)) serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); else if (human || csv) { - if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Space for positive ('-' for negative) + if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits } if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); From 62a65d3fdcc01682fd134535d0c35faba93bf548 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 3 Feb 2021 10:00:41 +1300 Subject: [PATCH 0973/1370] Note (MarlinUI) limit on PREHEAT settings (#20966) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d0c00d4ef5..b28eb72cb0 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1614,7 +1614,9 @@ // @section temperature -// Preheat Constants +// +// Preheat Constants - Up to 5 are supported without changes +// #define PREHEAT_1_LABEL "PLA" #define PREHEAT_1_TEMP_HOTEND 180 #define PREHEAT_1_TEMP_BED 70 From 4771379302bcf7a783f5f7898fecfda3a234c04a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 2 Feb 2021 16:00:02 -0600 Subject: [PATCH 0974/1370] Evaluate ANY_SERIAL_IS in place --- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 8 ++--- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 8 ++--- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp | 6 ++-- Marlin/src/inc/Conditionals_adv.h | 31 -------------------- 4 files changed, 11 insertions(+), 42 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index 454ace33b2..c636a40a12 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -24,19 +24,19 @@ #include "../../inc/MarlinConfigPre.h" #include "MarlinSerial.h" -#if USING_SERIAL_0 +#if ANY_SERIAL_IS(0) MSerialT MSerial(true, LPC_UART0); extern "C" void UART0_IRQHandler() { MSerial.IRQHandler(); } #endif -#if USING_SERIAL_1 +#if ANY_SERIAL_IS(1) MSerialT MSerial1(true, (LPC_UART_TypeDef *) LPC_UART1); extern "C" void UART1_IRQHandler() { MSerial1.IRQHandler(); } #endif -#if USING_SERIAL_2 +#if ANY_SERIAL_IS(2) MSerialT MSerial2(true, LPC_UART2); extern "C" void UART2_IRQHandler() { MSerial2.IRQHandler(); } #endif -#if USING_SERIAL_3 +#if ANY_SERIAL_IS(3) MSerialT MSerial3(true, LPC_UART3); extern "C" void UART3_IRQHandler() { MSerial3.IRQHandler(); } #endif diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 14890bcd6e..be64ea832e 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -92,7 +92,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #define ANY_TX(N,V...) DO(IS_TX##N,||,V) #define ANY_RX(N,V...) DO(IS_RX##N,||,V) -#if USING_SERIAL_0 +#if ANY_SERIAL_IS(0) #define IS_TX0(P) (P == P0_02) #define IS_RX0(P) (P == P0_03) #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) @@ -106,7 +106,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef IS_RX0 #endif -#if USING_SERIAL_1 +#if ANY_SERIAL_IS(1) #define IS_TX1(P) (P == P0_15) #define IS_RX1(P) (P == P0_16) #define _IS_TX1_1 IS_TX1 @@ -127,7 +127,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef _IS_RX1_1 #endif -#if USING_SERIAL_2 +#if ANY_SERIAL_IS(2) #define IS_TX2(P) (P == P0_10) #define IS_RX2(P) (P == P0_11) #define _IS_TX2_1 IS_TX2 @@ -161,7 +161,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef _IS_RX2_1 #endif -#if USING_SERIAL_3 +#if ANY_SERIAL_IS(3) #define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00) #define PIN_IS_RX3(P) (P##_PIN == P0_01) #if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX) diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp index ce32eafee5..3f43585cf2 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp @@ -27,7 +27,7 @@ #include "../../inc/MarlinConfig.h" -#if USING_SERIAL_1 +#if ANY_SERIAL_IS(1) UartT Serial2(false, &sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX); void SERCOM4_0_Handler() { Serial2.IrqHandler(); } void SERCOM4_1_Handler() { Serial2.IrqHandler(); } @@ -35,7 +35,7 @@ void SERCOM4_3_Handler() { Serial2.IrqHandler(); } #endif -#if USING_SERIAL_2 +#if ANY_SERIAL_IS(2) UartT Serial3(false, &sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX); void SERCOM1_0_Handler() { Serial3.IrqHandler(); } void SERCOM1_1_Handler() { Serial3.IrqHandler(); } @@ -43,7 +43,7 @@ void SERCOM1_3_Handler() { Serial3.IrqHandler(); } #endif -#if USING_SERIAL_3 +#if ANY_SERIAL_IS(3) UartT Serial4(false, &sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX); void SERCOM5_0_Handler() { Serial4.IrqHandler(); } void SERCOM5_1_Handler() { Serial4.IrqHandler(); } diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 22a671c5b3..d6245718f4 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -516,34 +516,3 @@ (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || \ (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \ (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) -#if ANY_SERIAL_IS(-1) - #define USING_SERIAL_DEFAULT -#endif -#if ANY_SERIAL_IS(0) - #define USING_SERIAL_0 1 -#endif -#if ANY_SERIAL_IS(1) - #define USING_SERIAL_1 1 -#endif -#if ANY_SERIAL_IS(2) - #define USING_SERIAL_2 1 -#endif -#if ANY_SERIAL_IS(3) - #define USING_SERIAL_3 1 -#endif -#if ANY_SERIAL_IS(4) - #define USING_SERIAL_4 1 -#endif -#if ANY_SERIAL_IS(5) - #define USING_SERIAL_5 1 -#endif -#if ANY_SERIAL_IS(6) - #define USING_SERIAL_6 1 -#endif -#if ANY_SERIAL_IS(7) - #define USING_SERIAL_7 1 -#endif -#if ANY_SERIAL_IS(8) - #define USING_SERIAL_8 1 -#endif -#undef ANY_SERIAL_IS From 129e9151da069a528cc29a2f8f5ea1efb80de2f1 Mon Sep 17 00:00:00 2001 From: Malderin <52313714+Malderin@users.noreply.github.com> Date: Tue, 2 Feb 2021 19:04:23 -0300 Subject: [PATCH 0975/1370] Add "more" menu in LVGL interface (#20940) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 3 +- Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp | 98 +++++++++++++------ Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 4 +- 3 files changed, 73 insertions(+), 32 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ea75f48f7a..a3699128b4 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3342,7 +3342,8 @@ #endif /** - * User-defined menu items that execute custom GCode + * User-defined menu items to run custom G-code. + * Up to 25 may be defined, but the actual number is LCD-dependent. */ //#define CUSTOM_USER_MENUS #if ENABLED(CUSTOM_USER_MENUS) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp index c085c4c936..62769ae89f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp @@ -33,14 +33,28 @@ extern lv_group_t * g; static lv_obj_t * scr; +#define HAS_USER_ITEM(N) (ENABLED(CUSTOM_USER_MENUS) && defined(USER_DESC_##N) && defined(USER_GCODE_##N)) + enum { ID_GCODE = 1, - ID_CUSTOM_1, - ID_CUSTOM_2, - ID_CUSTOM_3, - ID_CUSTOM_4, - ID_CUSTOM_5, - ID_CUSTOM_6, + #if HAS_USER_ITEM(1) + ID_CUSTOM_1, + #endif + #if HAS_USER_ITEM(2) + ID_CUSTOM_2, + #endif + #if HAS_USER_ITEM(3) + ID_CUSTOM_3, + #endif + #if HAS_USER_ITEM(4) + ID_CUSTOM_4, + #endif + #if HAS_USER_ITEM(5) + ID_CUSTOM_5, + #endif + #if HAS_USER_ITEM(6) + ID_CUSTOM_6, + #endif ID_M_RETURN, }; @@ -48,12 +62,24 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_GCODE: lv_clear_more(); lv_draw_gcode(true); break; - case ID_CUSTOM_1: TERN_(USER_CMD_1_ENABLE, queue.inject_P(PSTR(USER_GCODE_1))); break; - case ID_CUSTOM_2: TERN_(USER_CMD_2_ENABLE, queue.inject_P(PSTR(USER_GCODE_2))); break; - case ID_CUSTOM_3: TERN_(USER_CMD_3_ENABLE, queue.inject_P(PSTR(USER_GCODE_3))); break; - case ID_CUSTOM_4: TERN_(USER_CMD_4_ENABLE, queue.inject_P(PSTR(USER_GCODE_4))); break; - case ID_CUSTOM_5: TERN_(USER_CMD_5_ENABLE, queue.inject_P(PSTR(USER_GCODE_5))); break; - case ID_CUSTOM_6: TERN_(USER_CMD_6_ENABLE, queue.inject_P(PSTR(USER_GCODE_6))); break; + #if HAS_USER_ITEM(1) + case ID_CUSTOM_1: queue.inject_P(PSTR(USER_GCODE_1)); break; + #endif + #if HAS_USER_ITEM(2) + case ID_CUSTOM_2: queue.inject_P(PSTR(USER_GCODE_2)); break; + #endif + #if HAS_USER_ITEM(3) + case ID_CUSTOM_3: queue.inject_P(PSTR(USER_GCODE_3)); break; + #endif + #if HAS_USER_ITEM(4) + case ID_CUSTOM_4: queue.inject_P(PSTR(USER_GCODE_4)); break; + #endif + #if HAS_USER_ITEM(5) + case ID_CUSTOM_5: queue.inject_P(PSTR(USER_GCODE_5)); break; + #endif + #if HAS_USER_ITEM(6) + case ID_CUSTOM_6: queue.inject_P(PSTR(USER_GCODE_6)); break; + #endif case ID_M_RETURN: lv_clear_more(); lv_draw_tool(); @@ -70,37 +96,37 @@ void lv_draw_more() { if (enc_ena) lv_group_add_obj(g, buttonGCode); lv_obj_t *labelGCode = lv_label_create_empty(buttonGCode); - #if ENABLED(USER_CMD_1_ENABLE) + #if HAS_USER_ITEM(1) lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_CUSTOM_1); if (enc_ena) lv_group_add_obj(g, buttonCustom1); lv_obj_t *labelCustom1 = lv_label_create_empty(buttonCustom1); #endif - #if ENABLED(USER_CMD_2_ENABLE) + #if HAS_USER_ITEM(2) lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_CUSTOM_2); if (enc_ena) lv_group_add_obj(g, buttonCustom2); lv_obj_t *labelCustom2 = lv_label_create_empty(buttonCustom2); #endif - #if ENABLED(USER_CMD_3_ENABLE) + #if HAS_USER_ITEM(3) lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_CUSTOM_3); if (enc_ena) lv_group_add_obj(g, buttonCustom3); lv_obj_t *labelCustom3 = lv_label_create_empty(buttonCustom3); #endif - #if ENABLED(USER_CMD_4_ENABLE) + #if HAS_USER_ITEM(4) lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_4); if (enc_ena) lv_group_add_obj(g, buttonCustom4); lv_obj_t *labelCustom4 = lv_label_create_empty(buttonCustom4); #endif - #if ENABLED(USER_CMD_5_ENABLE) + #if HAS_USER_ITEM(5) lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5); if (enc_ena) lv_group_add_obj(g, buttonCustom5); lv_obj_t *labelCustom5 = lv_label_create_empty(buttonCustom5); #endif - #if ENABLED(USER_CMD_6_ENABLE) + #if HAS_USER_ITEM(6) lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6); if (enc_ena) lv_group_add_obj(g, buttonCustom6); lv_obj_t *labelCustom6 = lv_label_create_empty(buttonCustom6); @@ -114,27 +140,27 @@ void lv_draw_more() { lv_label_set_text(labelGCode, more_menu.gcode); lv_obj_align(labelGCode, buttonGCode, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - #if ENABLED(USER_CMD_1_ENABLE) + #if HAS_USER_ITEM(1) lv_label_set_text(labelCustom1, more_menu.custom1); lv_obj_align(labelCustom1, buttonCustom1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif - #if ENABLED(USER_CMD_2_ENABLE) + #if HAS_USER_ITEM(2) lv_label_set_text(labelCustom2, more_menu.custom2); lv_obj_align(labelCustom2, buttonCustom2, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif - #if ENABLED(USER_CMD_3_ENABLE) + #if HAS_USER_ITEM(3) lv_label_set_text(labelCustom3, more_menu.custom3); lv_obj_align(labelCustom3, buttonCustom3, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif - #if ENABLED(USER_CMD_4_ENABLE) + #if HAS_USER_ITEM(4) lv_label_set_text(labelCustom4, more_menu.custom4); lv_obj_align(labelCustom4, buttonCustom4, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif - #if ENABLED(USER_CMD_5_ENABLE) + #if HAS_USER_ITEM(5) lv_label_set_text(labelCustom5, more_menu.custom5); lv_obj_align(labelCustom5, buttonCustom5, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif - #if ENABLED(USER_CMD_6_ENABLE) + #if HAS_USER_ITEM(6) lv_label_set_text(labelCustom6, more_menu.custom6); lv_obj_align(labelCustom6, buttonCustom6, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif @@ -145,12 +171,24 @@ void lv_draw_more() { #if BUTTONS_EXIST(EN1, EN2, ENC) if (enc_ena) { lv_group_add_obj(g, buttonGCode); - TERN_(USER_CMD_1_ENABLE, lv_group_add_obj(g, buttonCustom1)); - TERN_(USER_CMD_2_ENABLE, lv_group_add_obj(g, buttonCustom2)); - TERN_(USER_CMD_3_ENABLE, lv_group_add_obj(g, buttonCustom3)); - TERN_(USER_CMD_4_ENABLE, lv_group_add_obj(g, buttonCustom4)); - TERN_(USER_CMD_5_ENABLE, lv_group_add_obj(g, buttonCustom5)); - TERN_(USER_CMD_6_ENABLE, lv_group_add_obj(g, buttonCustom6)); + #if HAS_USER_ITEM(1) + lv_group_add_obj(g, buttonCustom1); + #endif + #if HAS_USER_ITEM(2) + lv_group_add_obj(g, buttonCustom2); + #endif + #if HAS_USER_ITEM(3) + lv_group_add_obj(g, buttonCustom3); + #endif + #if HAS_USER_ITEM(4) + lv_group_add_obj(g, buttonCustom4); + #endif + #if HAS_USER_ITEM(5) + lv_group_add_obj(g, buttonCustom5); + #endif + #if HAS_USER_ITEM(6) + lv_group_add_obj(g, buttonCustom6); + #endif lv_group_add_obj(g, buttonBack); } #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index a2ecb0e436..aa6d3869a6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -71,7 +71,9 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; lv_draw_filament_change(); break; - case ID_T_MORE: lv_draw_more(); break; + case ID_T_MORE: + lv_draw_more(); + break; case ID_T_RETURN: TERN_(MKS_TEST, curent_disp_ui = 1); lv_draw_ready_print(); From 0d7c02d2c6f19024427da95f58866957331fd4ea Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 4 Feb 2021 18:31:46 -0300 Subject: [PATCH 0976/1370] Re-calibrate touch after EEPROM reset, if needed (#20934) --- Marlin/src/lcd/marlinui.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 46db571936..eea697a464 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1652,7 +1652,13 @@ void MarlinUI::update() { #endif // SDSUPPORT #if HAS_LCD_MENU - void MarlinUI::reset_settings() { settings.reset(); completion_feedback(); } + void MarlinUI::reset_settings() { + settings.reset(); + completion_feedback(); + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + if (touch_calibration.need_calibration()) ui.goto_screen(touch_screen_calibration); + #endif + } #endif #if ENABLED(EEPROM_SETTINGS) From bf631046c095e989de27423e21a8377a95438fad Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Feb 2021 19:18:31 -0600 Subject: [PATCH 0977/1370] Fix some serial char, echo Co-Authored-By: X-Ryl669 <3277165+X-Ryl669@users.noreply.github.com> --- Marlin/src/HAL/shared/backtrace/backtrace.cpp | 4 +- Marlin/src/feature/bedlevel/bedlevel.cpp | 2 +- Marlin/src/feature/direct_stepping.cpp | 6 +- Marlin/src/feature/encoder_i2c.cpp | 23 ++++--- Marlin/src/feature/tmc_util.cpp | 64 +++++++++---------- Marlin/src/gcode/feature/advance/M900.cpp | 2 +- Marlin/src/gcode/queue.cpp | 5 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 7 +- Marlin/src/sd/cardreader.cpp | 2 +- 9 files changed, 55 insertions(+), 60 deletions(-) diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index 6cf5e055e1..605e165b05 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -34,9 +34,9 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { (*p)++; - SERIAL_CHAR('#'); SERIAL_PRINT(*p, DEC); SERIAL_ECHOPGM(" : "); + SERIAL_CHAR('#'); SERIAL_ECHO(*p); SERIAL_ECHOPGM(" : "); SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, HEX); - SERIAL_CHAR('+'); SERIAL_PRINT(bte->address - bte->function,DEC); + SERIAL_CHAR('+'); SERIAL_ECHO(bte->address - bte->function); SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address,HEX); SERIAL_CHAR('\n'); return true; } diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 0e0b87e890..e142b31a78 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -196,7 +196,7 @@ void reset_bed_level() { #endif } #ifdef SCAD_MESH_OUTPUT - SERIAL_CHAR(' ', ']'); // close sub-array + SERIAL_ECHOPGM(" ]"); // close sub-array if (y < sy - 1) SERIAL_CHAR(','); #endif SERIAL_EOL(); diff --git a/Marlin/src/feature/direct_stepping.cpp b/Marlin/src/feature/direct_stepping.cpp index 9766d14640..2698b53dd6 100644 --- a/Marlin/src/feature/direct_stepping.cpp +++ b/Marlin/src/feature/direct_stepping.cpp @@ -180,7 +180,7 @@ namespace DirectStepping { if (!page_states_dirty) return; page_states_dirty = false; - SERIAL_ECHO(Cfg::CONTROL_CHAR); + SERIAL_CHAR(Cfg::CONTROL_CHAR); constexpr int state_bits = 2; constexpr int n_bytes = Cfg::NUM_PAGES >> state_bits; volatile uint8_t bits_b[n_bytes] = { 0 }; @@ -192,10 +192,10 @@ namespace DirectStepping { uint8_t crc = 0; for (uint8_t i = 0 ; i < n_bytes ; i++) { crc ^= bits_b[i]; - SERIAL_ECHO(bits_b[i]); + SERIAL_CHAR(bits_b[i]); } - SERIAL_ECHO(crc); + SERIAL_CHAR(crc); SERIAL_EOL(); } diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index fa3cf1503f..af42165599 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -172,7 +172,7 @@ void I2CPositionEncoder::update() { float sumP = 0; LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i]; const int32_t errorP = int32_t(sumP * RECIPROCAL(I2CPE_ERR_PRST_ARRAY_SIZE)); - SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_CHAR(axis_codes[encoderAxis]); SERIAL_ECHOLNPAIR(" : CORRECT ERR ", errorP * planner.steps_to_mm[encoderAxis], "mm"); babystep.add_steps(encoderAxis, -LROUND(errorP)); errPrstIdx = 0; @@ -192,7 +192,7 @@ void I2CPositionEncoder::update() { if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.settings.axis_steps_per_mm[encoderAxis]) { const millis_t ms = millis(); if (ELAPSED(ms, nextErrorCountTime)) { - SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_CHAR(axis_codes[encoderAxis]); SERIAL_ECHOLNPAIR(" : LARGE ERR ", int(error), "; diffSum=", diffSum); errorCount++; nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; @@ -213,7 +213,7 @@ void I2CPositionEncoder::set_homed() { trusted++; #ifdef I2CPE_DEBUG - SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_CHAR(axis_codes[encoderAxis]); SERIAL_ECHOLNPAIR(" axis encoder homed, offset of ", zeroOffset, " ticks."); #endif } @@ -224,7 +224,7 @@ void I2CPositionEncoder::set_unhomed() { homed = trusted = false; #ifdef I2CPE_DEBUG - SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_CHAR(axis_codes[encoderAxis]); SERIAL_ECHOLNPGM(" axis encoder unhomed."); #endif } @@ -232,7 +232,7 @@ void I2CPositionEncoder::set_unhomed() { bool I2CPositionEncoder::passes_test(const bool report) { if (report) { if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. "); - SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_CHAR(axis_codes[encoderAxis]); serial_ternary(H == I2CPE_MAG_SIG_BAD, PSTR(" axis "), PSTR("magnetic strip "), PSTR("encoder ")); switch (H) { case I2CPE_MAG_SIG_GOOD: @@ -253,7 +253,7 @@ float I2CPositionEncoder::get_axis_error_mm(const bool report) { error = ABS(diff) > 10000 ? 0 : diff; // Huge error is a bad reading if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_CHAR(axis_codes[encoderAxis]); SERIAL_ECHOLNPAIR(" axis target=", target, "mm; actual=", actual, "mm; err=", error, "mm"); } @@ -263,7 +263,7 @@ float I2CPositionEncoder::get_axis_error_mm(const bool report) { int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { if (!active) { if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_CHAR(axis_codes[encoderAxis]); SERIAL_ECHOLNPGM(" axis encoder not active!"); } return 0; @@ -288,7 +288,7 @@ int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { errorPrev = error; if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_CHAR(axis_codes[encoderAxis]); SERIAL_ECHOLNPAIR(" axis target=", target, "; actual=", encoderCountInStepperTicksScaled, "; err=", error); } @@ -667,8 +667,7 @@ void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, else { if (noOffset) { const int32_t raw_count = encoders[idx].get_raw_count(); - SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); - SERIAL_CHAR(' '); + SERIAL_CHAR(axis_codes[encoders[idx].get_axis()], ' '); for (uint8_t j = 31; j > 0; j--) SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); @@ -723,7 +722,7 @@ void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const // and enable it (it will likely have failed initialization on power-up, before the address change). const int8_t idx = idx_from_addr(newaddr); if (idx >= 0 && !encoders[idx].get_active()) { - SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); + SERIAL_CHAR(axis_codes[encoders[idx].get_axis()]); SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again."); encoders[idx].set_active(encoders[idx].passes_test(true)); } @@ -748,7 +747,7 @@ void I2CPositionEncodersMgr::report_module_firmware(const uint8_t address) { if (Wire.requestFrom(I2C_ADDRESS(address), uint8_t(32))) { char c; while (Wire.available() > 0 && (c = (char)Wire.read()) > 0) - SERIAL_ECHO(c); + SERIAL_CHAR(c); SERIAL_EOL(); } diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 8d0156883b..a16af31e55 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -233,10 +233,10 @@ void report_polled_driver_data(TMC &st, const TMC_driver_data &data) { const uint32_t pwm_scale = get_pwm_scale(st); st.printLabel(); - SERIAL_CHAR(':'); SERIAL_PRINT(pwm_scale, DEC); + SERIAL_CHAR(':'); SERIAL_ECHO(pwm_scale); #if ENABLED(TMC_DEBUG) #if HAS_TMCX1X0 || HAS_TMC220x - SERIAL_CHAR('/'); SERIAL_PRINT(data.cs_actual, DEC); + SERIAL_CHAR('/'); SERIAL_ECHO(data.cs_actual); #endif #if HAS_STALLGUARD SERIAL_CHAR('/'); @@ -257,7 +257,7 @@ #endif if (st.flag_otpw) SERIAL_CHAR('F'); // otpw Flag SERIAL_CHAR('|'); - if (st.otpw_count > 0) SERIAL_PRINT(st.otpw_count, DEC); + if (st.otpw_count > 0) SERIAL_ECHO(st.otpw_count); SERIAL_CHAR('\t'); } @@ -551,8 +551,8 @@ #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130) static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { switch (i) { - case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; - case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; + case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break; + case TMC_SGT: SERIAL_ECHO(st.sgt()); break; case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break; case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break; default: break; @@ -563,9 +563,9 @@ static void _tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) { switch (i) { case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break; - case TMC_SG_RESULT: SERIAL_PRINT(st.sg_result(), DEC); break; + case TMC_SG_RESULT: SERIAL_ECHO(st.sg_result()); break; case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('*'); break; - case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; + case TMC_DRV_CS_ACTUAL: SERIAL_ECHO(st.cs_actual()); break; default: break; } } @@ -580,13 +580,13 @@ static void _tmc_status(TMC2160Stepper &st, const TMC_debug_enum i) { switch (i) { - case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; - case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; + case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break; + case TMC_SGT: SERIAL_ECHO(st.sgt()); break; case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break; case TMC_GLOBAL_SCALER: { uint16_t value = st.GLOBAL_SCALER(); - SERIAL_PRINT(value ?: 256, DEC); + SERIAL_ECHO(value ? value : 256); SERIAL_ECHOPGM("/256"); } break; @@ -599,10 +599,10 @@ #if HAS_TMC220x static void _tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { switch (i) { - case TMC_PWM_SCALE_SUM: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break; - case TMC_PWM_SCALE_AUTO: SERIAL_PRINT(st.pwm_scale_auto(), DEC); break; - case TMC_PWM_OFS_AUTO: SERIAL_PRINT(st.pwm_ofs_auto(), DEC); break; - case TMC_PWM_GRAD_AUTO: SERIAL_PRINT(st.pwm_grad_auto(), DEC); break; + case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); break; + case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break; + case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break; + case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break; case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break; case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break; default: break; @@ -613,8 +613,8 @@ template static void _tmc_status(TMCMarlin &st, const TMC_debug_enum i) { switch (i) { - case TMC_SGT: SERIAL_PRINT(st.SGTHRS(), DEC); break; - case TMC_UART_ADDR: SERIAL_PRINT(st.get_address(), DEC); break; + case TMC_SGT: SERIAL_ECHO(st.SGTHRS()); break; + case TMC_UART_ADDR: SERIAL_ECHO(st.get_address()); break; default: TMC2208Stepper *parent = &st; _tmc_status(*parent, i); @@ -631,7 +631,7 @@ case TMC_T120: if (st.t120()) SERIAL_CHAR('*'); break; case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break; case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break; - case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; + case TMC_DRV_CS_ACTUAL: SERIAL_ECHO(st.cs_actual()); break; default: break; } } @@ -639,7 +639,7 @@ #if HAS_DRIVER(TMC2209) static void _tmc_parse_drv_status(TMC2209Stepper &st, const TMC_drv_status_enum i) { switch (i) { - case TMC_SG_RESULT: SERIAL_PRINT(st.SG_RESULT(), DEC); break; + case TMC_SG_RESULT: SERIAL_ECHO(st.SG_RESULT()); break; default: _tmc_parse_drv_status(static_cast(st), i); break; } } @@ -666,15 +666,15 @@ case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; case TMC_IRUN: - SERIAL_PRINT(st.irun(), DEC); + SERIAL_ECHO(st.irun()); SERIAL_ECHOPGM("/31"); break; case TMC_IHOLD: - SERIAL_PRINT(st.ihold(), DEC); + SERIAL_ECHO(st.ihold()); SERIAL_ECHOPGM("/31"); break; case TMC_CS_ACTUAL: - SERIAL_PRINT(st.cs_actual(), DEC); + SERIAL_ECHO(st.cs_actual()); SERIAL_ECHOPGM("/31"); break; case TMC_VSENSE: print_vsense(st); break; @@ -694,11 +694,11 @@ #if ENABLED(MONITOR_DRIVER_STATUS) case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; #endif - case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break; - case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break; - case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break; - case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break; - case TMC_MSCNT: SERIAL_PRINT(st.get_microstep_counter(), DEC); break; + case TMC_TOFF: SERIAL_ECHO(st.toff()); break; + case TMC_TBL: SERIAL_ECHO(st.blank_time()); break; + case TMC_HEND: SERIAL_ECHO(st.hysteresis_end()); break; + case TMC_HSTRT: SERIAL_ECHO(st.hysteresis_start()); break; + case TMC_MSCNT: SERIAL_ECHO(st.get_microstep_counter()); break; default: _tmc_status(st, i); break; } } @@ -714,18 +714,18 @@ case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; case TMC_IRUN: - SERIAL_PRINT(st.cs(), DEC); + SERIAL_ECHO(st.cs()); SERIAL_ECHOPGM("/31"); break; case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break; case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; //case TMC_OTPW: serialprint_truefalse(st.otpw()); break; //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; - case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; - case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break; - case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break; - case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break; - case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break; + case TMC_SGT: SERIAL_ECHO(st.sgt()); break; + case TMC_TOFF: SERIAL_ECHO(st.toff()); break; + case TMC_TBL: SERIAL_ECHO(st.blank_time()); break; + case TMC_HEND: SERIAL_ECHO(st.hysteresis_end()); break; + case TMC_HSTRT: SERIAL_ECHO(st.hysteresis_start()); break; default: break; } } diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp index 5c7155d7c9..3c2c27b62a 100644 --- a/Marlin/src/gcode/feature/advance/M900.cpp +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -43,7 +43,7 @@ void GcodeSuite::M900() { auto echo_value_oor = [](const char ltr, const bool ten=true) { - SERIAL_CHAR('?'); SERIAL_CHAR(ltr); + SERIAL_CHAR('?', ltr); SERIAL_ECHOPGM(" value out of range"); if (ten) SERIAL_ECHOPGM(" (0-10)"); SERIAL_ECHOLNPGM("."); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 4c42f7e353..d5bc857286 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -298,10 +298,9 @@ void GCodeQueue::ok_to_send() { #if ENABLED(ADVANCED_OK) char* p = command_buffer[index_r]; if (*p == 'N') { - SERIAL_ECHO(' '); - SERIAL_ECHO(*p++); + SERIAL_CHAR(' ', *p++); while (NUMERIC_SIGNED(*p)) - SERIAL_ECHO(*p++); + SERIAL_CHAR(*p++); } SERIAL_ECHOPAIR_P(SP_P_STR, int(planner.moves_free()), SP_B_STR, int(BUFSIZE - length)); diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 1508dc0d27..c44d667b8f 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -141,9 +141,7 @@ void AnycubicTFTClass::OnKillTFT() { void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered..."); - SERIAL_ECHO(ui8tostr2(isInserted)); - SERIAL_EOL(); + SERIAL_ECHOLNPAIR("TFT Serial Debug: OnSDCardStateChange event triggered...", (int)isInserted); #endif DoSDCardStateCheck(); } @@ -164,8 +162,7 @@ void AnycubicTFTClass::OnFilamentRunout() { void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOPGM("TFT Serial Debug: OnUserConfirmRequired triggered... "); - SERIAL_ECHOLN(msg); + SERIAL_ECHOLNPAIR("TFT Serial Debug: OnUserConfirmRequired triggered... ", msg); #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 647e3f3e21..c88fdc0693 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -369,7 +369,7 @@ void CardReader::printFilename() { #if ENABLED(LONG_FILENAME_HOST_SUPPORT) selectFileByName(dosFilename); if (longFilename[0]) { - SERIAL_ECHO(' '); + SERIAL_CHAR(' '); SERIAL_ECHO(longFilename); } #endif From bb5c643dfb34a9605a3d175876cc00d266cab609 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Feb 2021 19:37:59 -0600 Subject: [PATCH 0978/1370] Nybbles & Bits --- Marlin/src/libs/W25Qxx.cpp | 24 +++++++++---------- Marlin/src/module/planner.cpp | 24 +++++++++---------- .../src/sd/usb_flashdrive/lib-uhs2/printhex.h | 12 +++++----- .../lib-uhs3/UHS_host/UHS_printhex.h | 12 +++++----- .../USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h | 6 ++--- 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index be5b4290dd..0eb40a1441 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -191,11 +191,11 @@ void W25QXXFlash::SPI_FLASH_SectorErase(uint32_t SectorAddr) { W25QXX_CS_L; // Send Sector Erase instruction spi_flash_Send(W25X_SectorErase); - // Send SectorAddr high nibble address byte + // Send SectorAddr high nybble address byte spi_flash_Send((SectorAddr & 0xFF0000) >> 16); - // Send SectorAddr medium nibble address byte + // Send SectorAddr medium nybble address byte spi_flash_Send((SectorAddr & 0xFF00) >> 8); - // Send SectorAddr low nibble address byte + // Send SectorAddr low nybble address byte spi_flash_Send(SectorAddr & 0xFF); // Deselect the FLASH: Chip Select high @@ -209,11 +209,11 @@ void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { W25QXX_CS_L; // Send Sector Erase instruction spi_flash_Send(W25X_BlockErase); - // Send SectorAddr high nibble address byte + // Send SectorAddr high nybble address byte spi_flash_Send((BlockAddr & 0xFF0000) >> 16); - // Send SectorAddr medium nibble address byte + // Send SectorAddr medium nybble address byte spi_flash_Send((BlockAddr & 0xFF00) >> 8); - // Send SectorAddr low nibble address byte + // Send SectorAddr low nybble address byte spi_flash_Send(BlockAddr & 0xFF); W25QXX_CS_H; @@ -265,11 +265,11 @@ void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint W25QXX_CS_L; // Send "Write to Memory " instruction spi_flash_Send(W25X_PageProgram); - // Send WriteAddr high nibble address byte to write to + // Send WriteAddr high nybble address byte to write to spi_flash_Send((WriteAddr & 0xFF0000) >> 16); - // Send WriteAddr medium nibble address byte to write to + // Send WriteAddr medium nybble address byte to write to spi_flash_Send((WriteAddr & 0xFF00) >> 8); - // Send WriteAddr low nibble address byte to write to + // Send WriteAddr low nybble address byte to write to spi_flash_Send(WriteAddr & 0xFF); NOMORE(NumByteToWrite, SPI_FLASH_PerWritePageSize); @@ -371,11 +371,11 @@ void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint // Send "Read from Memory " instruction spi_flash_Send(W25X_ReadData); - // Send ReadAddr high nibble address byte to read from + // Send ReadAddr high nybble address byte to read from spi_flash_Send((ReadAddr & 0xFF0000) >> 16); - // Send ReadAddr medium nibble address byte to read from + // Send ReadAddr medium nybble address byte to read from spi_flash_Send((ReadAddr & 0xFF00) >> 8); - // Send ReadAddr low nibble address byte to read from + // Send ReadAddr low nybble address byte to read from spi_flash_Send(ReadAddr & 0xFF); if (NumByteToRead <= 32 || !flash_dma_mode) { diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 5897d10cd5..541aed943e 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -418,11 +418,11 @@ void Planner::init() { L("2") A("cpi %16,0x10") // (nr & 0xF00000) == 0 ? A("brcc 3f") // No, skip this - A("swap %15") // Swap nibbles - A("swap %16") // Swap nibbles. Low nibble is 0 + A("swap %15") // Swap nybbles + A("swap %16") // Swap nybbles. Low nybble is 0 A("mov %14, %15") - A("andi %14,0x0F") // Isolate low nibble - A("andi %15,0xF0") // Keep proper nibble in %15 + A("andi %14,0x0F") // Isolate low nybble + A("andi %15,0xF0") // Keep proper nybble in %15 A("or %16, %14") // %16:%15 <<= 4 A("subi %3,-4") // idx += 4 @@ -473,10 +473,10 @@ void Planner::init() { L("9") A("sbrs %3,2") // shift by 4bits position? A("rjmp 16f") // No - A("swap %15") // Swap nibbles. lo nibble of %15 will always be 0 - A("swap %14") // Swap nibbles + A("swap %15") // Swap nybbles. lo nybble of %15 will always be 0 + A("swap %14") // Swap nybbles A("mov %12,%14") - A("andi %12,0x0F") // isolate low nibble + A("andi %12,0x0F") // isolate low nybble A("andi %14,0xF0") // and clear it A("or %15,%12") // %15:%16 <<= 4 L("16") @@ -504,11 +504,11 @@ void Planner::init() { L("11") A("sbrs %3,2") // shift by 4 bit position ? A("rjmp 12f") // No, skip it - A("swap %15") // Swap nibbles - A("andi %14, 0xF0") // Lose the lowest nibble - A("swap %14") // Swap nibbles. Upper nibble is 0 - A("or %14,%15") // Pass nibble from upper byte - A("andi %15, 0x0F") // And get rid of that nibble + A("swap %15") // Swap nybbles + A("andi %14, 0xF0") // Lose the lowest nybble + A("swap %14") // Swap nybbles. Upper nybble is 0 + A("or %14,%15") // Pass nybble from upper byte + A("andi %15, 0x0F") // And get rid of that nybble L("12") A("sbrs %3,3") // shift by 8 bit position ? A("rjmp 6f") // No, skip it diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h index 319cd9c4c8..6ded4fa9cc 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h @@ -32,12 +32,12 @@ void E_Notifyc(char c, int lvl); template void PrintHex(T val, int lvl) { - int num_nibbles = sizeof (T) * 2; + int num_nybbles = sizeof (T) * 2; do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); + char v = 48 + (((val >> (num_nybbles - 1) * 4)) & 0x0F); if (v > 57) v += 7; E_Notifyc(v, lvl); - } while (--num_nibbles); + } while (--num_nybbles); } template @@ -48,12 +48,12 @@ void PrintBin(T val, int lvl) { template void SerialPrintHex(T val) { - int num_nibbles = sizeof (T) * 2; + int num_nybbles = sizeof (T) * 2; do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); + char v = 48 + (((val >> (num_nybbles - 1) * 4)) & 0x0F); if (v > 57) v += 7; USB_HOST_SERIAL.print(v); - } while (--num_nibbles); + } while (--num_nybbles); } template diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h index bfa052b8f7..edf673a4fb 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h @@ -33,13 +33,13 @@ void E_Notifyc(char c, int lvl); template void PrintHex(T val, int lvl) { - int num_nibbles = sizeof (T) * 2; + int num_nybbles = sizeof (T) * 2; do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); + char v = 48 + (((val >> (num_nybbles - 1) * 4)) & 0x0F); if(v > 57) v += 7; E_Notifyc(v, lvl); - } while(--num_nibbles); + } while(--num_nybbles); } template @@ -53,13 +53,13 @@ void PrintBin(T val, int lvl) { template void SerialPrintHex(T val) { - int num_nibbles = sizeof (T) * 2; + int num_nybbles = sizeof (T) * 2; do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); + char v = 48 + (((val >> (num_nybbles - 1) * 4)) & 0x0F); if(v > 57) v += 7; USB_HOST_SERIAL.print(v); - } while(--num_nibbles); + } while(--num_nybbles); } template diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h index f7dd315a04..7fe48652fd 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h @@ -96,7 +96,7 @@ uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* dat /* GPIO write */ /*GPIO byte is split between 2 registers, so two writes are needed to write one byte */ -/* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */ +/* GPOUT bits are in the low nybble. 0-3 in IOPINS1, 4-7 in IOPINS2 */ void UHS_NI MAX3421E_HOST::gpioWr(uint8_t data) { regWr(rIOPINS1, data); data >>= 4; @@ -132,11 +132,11 @@ uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* dat /* GPIO read. See gpioWr for explanation */ -/* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */ +/* GPIN pins are in high nybbles of IOPINS1, IOPINS2 */ uint8_t UHS_NI MAX3421E_HOST::gpioRd() { uint8_t gpin = 0; gpin = regRd(rIOPINS2); //pins 4-7 - gpin &= 0xF0; //clean lower nibble + gpin &= 0xF0; //clean lower nybble gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation. return ( gpin); } From 582458998f4dd91d05a99425aa665ed45816d069 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Feb 2021 23:22:42 -0600 Subject: [PATCH 0979/1370] Use serial shorthand --- Marlin/src/MarlinCore.cpp | 3 +- Marlin/src/feature/binary_stream.h | 9 +-- Marlin/src/feature/cancel_object.cpp | 3 +- Marlin/src/feature/mmu/mmu2.cpp | 9 +-- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 12 ++-- Marlin/src/gcode/config/M281.cpp | 16 ++--- Marlin/src/gcode/config/M304.cpp | 9 +-- Marlin/src/gcode/config/M305.cpp | 6 +- Marlin/src/gcode/control/M280.cpp | 15 ++--- Marlin/src/gcode/host/M113.cpp | 8 +-- Marlin/src/gcode/motion/M290.cpp | 6 +- Marlin/src/gcode/stats/M31.cpp | 3 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 6 +- .../ftdi_eve_lib/basic/commands.cpp | 17 ++--- .../ftdi_eve_lib/extended/event_loop.cpp | 6 +- .../ftdi_eve_lib/extended/screen_types.cpp | 3 +- .../screens/bio_printing_dialog_box.cpp | 3 +- Marlin/src/module/settings.cpp | 64 ++++++++----------- Marlin/src/module/temperature.cpp | 3 +- Marlin/src/module/tool_change.cpp | 3 +- Marlin/src/sd/cardreader.cpp | 16 ++--- 21 files changed, 88 insertions(+), 132 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 16111936da..f0d4fa05a6 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -419,8 +419,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { if (parked_or_ignoring) gcode.reset_stepper_timeout(ms); if (gcode.stepper_max_timed_out(ms)) { - SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR(STR_KILL_INACTIVE_TIME, parser.command_ptr); + SERIAL_ERROR_MSG(STR_KILL_INACTIVE_TIME, parser.command_ptr); kill(); } diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index 81d6e7184b..a70a0a4a27 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -352,8 +352,7 @@ public: } } else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Packet header(", packet.header.sync, "?) corrupt"); + SERIAL_ECHO_MSG("Packet header(", packet.header.sync, "?) corrupt"); stream_state = StreamState::PACKET_RESEND; } } @@ -387,8 +386,7 @@ public: stream_state = StreamState::PACKET_PROCESS; } else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Packet(", packet.header.sync, ") payload corrupt"); + SERIAL_ECHO_MSG("Packet(", packet.header.sync, ") payload corrupt"); stream_state = StreamState::PACKET_RESEND; } } @@ -406,8 +404,7 @@ public: if (packet_retries < MAX_RETRIES || MAX_RETRIES == 0) { packet_retries++; stream_state = StreamState::PACKET_RESET; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Resend request ", int(packet_retries)); + SERIAL_ECHO_MSG("Resend request ", int(packet_retries)); SERIAL_ECHOLNPAIR("rs", sync); } else diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index 853e765b66..3ffd10e970 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -67,8 +67,7 @@ void CancelObject::uncancel_object(const int8_t obj) { void CancelObject::report() { if (active_object >= 0) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Active Object: ", int(active_object)); + SERIAL_ECHO_MSG("Active Object: ", int(active_object)); } if (canceled) { diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index e3036947d5..3bff73e956 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -514,8 +514,7 @@ static void mmu2_not_responding() { extruder = index; // filament change is finished active_extruder = 0; ENABLE_AXIS_E0(); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); + SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder)); } ui.reset_status(); } @@ -602,8 +601,7 @@ static void mmu2_not_responding() { active_extruder = 0; ENABLE_AXIS_E0(); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); + SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder)); ui.reset_status(); } @@ -698,8 +696,7 @@ static void mmu2_not_responding() { extruder = index; //filament change is finished active_extruder = 0; ENABLE_AXIS_E0(); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); + SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder)); ui.reset_status(); } diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index cf27c14d3b..a08e4a0867 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -142,8 +142,7 @@ void GcodeSuite::G29() { if (parser.seenval('I')) { ix = parser.value_int(); if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) { - SERIAL_ECHOPAIR("I out of range (0-", int(GRID_MAX_POINTS_X - 1)); - SERIAL_ECHOLNPGM(")"); + SERIAL_ECHOLNPAIR("I out of range (0-", int(GRID_MAX_POINTS_X - 1), ")"); return; } } @@ -153,8 +152,7 @@ void GcodeSuite::G29() { if (parser.seenval('J')) { iy = parser.value_int(); if (!WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { - SERIAL_ECHOPAIR("J out of range (0-", int(GRID_MAX_POINTS_Y - 1)); - SERIAL_ECHOLNPGM(")"); + SERIAL_ECHOLNPAIR("J out of range (0-", int(GRID_MAX_POINTS_Y - 1), ")"); return; } } @@ -182,10 +180,8 @@ void GcodeSuite::G29() { } // switch(state) - if (state == MeshNext) { - SERIAL_ECHOPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS)); - SERIAL_ECHOLNPAIR(" of ", int(GRID_MAX_POINTS)); - } + if (state == MeshNext) + SERIAL_ECHOLNPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS), " of ", int(GRID_MAX_POINTS)); report_current_position(); } diff --git a/Marlin/src/gcode/config/M281.cpp b/Marlin/src/gcode/config/M281.cpp index 018ca1c092..eeb0fcc470 100644 --- a/Marlin/src/gcode/config/M281.cpp +++ b/Marlin/src/gcode/config/M281.cpp @@ -34,7 +34,9 @@ * U - Stowed Angle */ void GcodeSuite::M281() { + if (!parser.seenval('P')) return; + const int servo_index = parser.value_int(); if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { #if ENABLED(BLTOUCH) @@ -53,16 +55,14 @@ void GcodeSuite::M281() { angle_change = true; } if (!angle_change) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(" Servo ", servo_index, - " L", servo_angles[servo_index][0], - " U", servo_angles[servo_index][1]); + SERIAL_ECHO_MSG(" Servo ", servo_index, + " L", servo_angles[servo_index][0], + " U", servo_angles[servo_index][1]); } } - else { - SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR("Servo ", servo_index, " out of range"); - } + else + SERIAL_ERROR_MSG("Servo ", servo_index, " out of range"); + } #endif // EDITABLE_SERVO_ANGLES diff --git a/Marlin/src/gcode/config/M304.cpp b/Marlin/src/gcode/config/M304.cpp index 10739be3f8..b1af5a5ae2 100644 --- a/Marlin/src/gcode/config/M304.cpp +++ b/Marlin/src/gcode/config/M304.cpp @@ -35,14 +35,15 @@ * D - Set the D value */ void GcodeSuite::M304() { + if (parser.seen('P')) thermalManager.temp_bed.pid.Kp = parser.value_float(); if (parser.seen('I')) thermalManager.temp_bed.pid.Ki = scalePID_i(parser.value_float()); if (parser.seen('D')) thermalManager.temp_bed.pid.Kd = scalePID_d(parser.value_float()); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(" p:", thermalManager.temp_bed.pid.Kp, - " i:", unscalePID_i(thermalManager.temp_bed.pid.Ki), - " d:", unscalePID_d(thermalManager.temp_bed.pid.Kd)); + SERIAL_ECHO_MSG(" p:", thermalManager.temp_bed.pid.Kp, + " i:", unscalePID_i(thermalManager.temp_bed.pid.Ki), + " d:", unscalePID_d(thermalManager.temp_bed.pid.Kd)); + } #endif // PIDTEMPBED diff --git a/Marlin/src/gcode/config/M305.cpp b/Marlin/src/gcode/config/M305.cpp index 3e7206aee4..9771ac2ced 100644 --- a/Marlin/src/gcode/config/M305.cpp +++ b/Marlin/src/gcode/config/M305.cpp @@ -49,10 +49,8 @@ void GcodeSuite::M305() { const bool do_set = parser.seen("BCRT"); // A valid P index is required - if (t_index >= (USER_THERMISTORS) || (do_set && t_index < 0)) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("!Invalid index. (0 <= P <= ", int(USER_THERMISTORS - 1), ")"); - } + if (t_index >= (USER_THERMISTORS) || (do_set && t_index < 0)) + SERIAL_ECHO_MSG("!Invalid index. (0 <= P <= ", int(USER_THERMISTORS - 1), ")"); else if (do_set) { if (parser.seen('R')) // Pullup resistor value if (!thermalManager.set_pull_up_res(t_index, parser.value_float())) diff --git a/Marlin/src/gcode/control/M280.cpp b/Marlin/src/gcode/control/M280.cpp index 6ccbb7becc..187c9a9b19 100644 --- a/Marlin/src/gcode/control/M280.cpp +++ b/Marlin/src/gcode/control/M280.cpp @@ -31,7 +31,9 @@ * M280: Get or set servo position. P [S] */ void GcodeSuite::M280() { + if (!parser.seen('P')) return; + const int servo_index = parser.value_int(); if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { if (parser.seen('S')) { @@ -41,15 +43,12 @@ void GcodeSuite::M280() { else MOVE_SERVO(servo_index, a); } - else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(" Servo ", servo_index, ": ", servo[servo_index].read()); - } - } - else { - SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR("Servo ", servo_index, " out of range"); + else + SERIAL_ECHO_MSG(" Servo ", servo_index, ": ", servo[servo_index].read()); } + else + SERIAL_ERROR_MSG("Servo ", servo_index, " out of range"); + } #endif // HAS_SERVOS diff --git a/Marlin/src/gcode/host/M113.cpp b/Marlin/src/gcode/host/M113.cpp index ce826d6acd..1183cc27a1 100644 --- a/Marlin/src/gcode/host/M113.cpp +++ b/Marlin/src/gcode/host/M113.cpp @@ -32,14 +32,14 @@ * S Optional. Set the keepalive interval. */ void GcodeSuite::M113() { + if (parser.seenval('S')) { host_keepalive_interval = parser.value_byte(); NOMORE(host_keepalive_interval, 60); } - else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("M113 S", (unsigned long)host_keepalive_interval); - } + else + SERIAL_ECHO_MSG("M113 S", (uint16_t)host_keepalive_interval); + } #endif // HOST_KEEPALIVE_FEATURE diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index df8dad7999..8ff94a78fd 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -42,14 +42,12 @@ FORCE_INLINE void mod_probe_offset(const float &offs) { if (TERN1(BABYSTEP_HOTEND_Z_OFFSET, active_extruder == 0)) { probe.offset.z += offs; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET " " STR_Z, probe.offset.z); + SERIAL_ECHO_MSG(STR_PROBE_OFFSET " " STR_Z, probe.offset.z); } else { #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) hotend_offset[active_extruder].z -= offs; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET STR_Z ": ", hotend_offset[active_extruder].z); + SERIAL_ECHO_MSG(STR_PROBE_OFFSET STR_Z ": ", hotend_offset[active_extruder].z); #endif } } diff --git a/Marlin/src/gcode/stats/M31.cpp b/Marlin/src/gcode/stats/M31.cpp index 207f9e144e..355701f6a4 100644 --- a/Marlin/src/gcode/stats/M31.cpp +++ b/Marlin/src/gcode/stats/M31.cpp @@ -35,6 +35,5 @@ void GcodeSuite::M31() { ui.set_status(buffer); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Print time: ", buffer); + SERIAL_ECHO_MSG("Print time: ", buffer); } diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index c44d667b8f..2b47094a4e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -552,10 +552,8 @@ void AnycubicTFTClass::GetCommandFromTFT() { a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], nullptr)))); #if ENABLED(ANYCUBIC_LCD_DEBUG) - if ((a_command > 7) && (a_command != 20)) { // No debugging of status polls, please! - SERIAL_ECHOPGM("TFT Serial Command: "); - SERIAL_ECHOLN(TFTcmdbuffer[TFTbufindw]); - } + if ((a_command > 7) && (a_command != 20)) // No debugging of status polls, please! + SERIAL_ECHOLNPAIR("TFT Serial Command: ", TFTcmdbuffer[TFTbufindw]); #endif switch (a_command) { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index 1db1175d3c..62c66f16f2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -1074,7 +1074,7 @@ void CLCD::init() { uint8_t device_id = mem_read_8(REG::ID); // Read Device ID, Should Be 0x7C; if (device_id == 0x7C) { #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("FTDI chip initialized "); + SERIAL_ECHO_MSG("FTDI chip initialized"); #endif break; } @@ -1082,11 +1082,10 @@ void CLCD::init() { delay(1); if (counter == 249) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Timeout waiting for device ID, should be 124, got ", device_id); - #endif - } + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_MSG("Timeout waiting for device ID, should be 124, got ", int(device_id)); + #endif + } } /* make sure that all units are in working conditions, usually the touch-controller needs a little more time */ @@ -1101,10 +1100,8 @@ void CLCD::init() { else delay(1); - if (ENABLED(TOUCH_UI_DEBUG) && counter == 99) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Timeout waiting for reset status. Should be 0x00, got ", reset_status); - } + if (ENABLED(TOUCH_UI_DEBUG) && counter == 99) + SERIAL_ECHO_MSG("Timeout waiting for reset status. Should be 0x00, got ", int(reset_status)); } mem_write_8(REG::PWM_DUTY, 0); // turn off Backlight, Frequency already is set to 250Hz default diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp index 6c0392c200..78d5f2483e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp @@ -124,8 +124,7 @@ namespace FTDI { case UNPRESSED: if (tag != 0) { #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Touch start: ", tag); + SERIAL_ECHO_MSG("Touch start: ", int(tag)); #endif pressed_tag = tag; @@ -186,8 +185,7 @@ namespace FTDI { if (UIData::flags.bits.touch_end_sound) sound.play(unpress_sound); #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Touch end: ", pressed_tag); + SERIAL_ECHO_MSG("Touch end: ", int(pressed_tag)); #endif const uint8_t saved_pressed_tag = pressed_tag; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp index 944237bd28..a0b434818a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp @@ -43,8 +43,7 @@ void ScreenRef::setScreen(onRedraw_func_t onRedraw_ptr) { if (type != 0xFF) { setType(type); #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("New screen: ", type); + SERIAL_ECHO_MSG("New screen: ", int(type)); #endif } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index 65b996dd51..fb8dc3edf3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -127,8 +127,7 @@ void BioPrintingDialogBox::setStatusMessage(const char* message) { storeBackground(); #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("New status message: ", message); + SERIAL_ECHO_MSG("New status message: ", message); #endif if (AT_SCREEN(BioPrintingDialogBox)) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 6908635d6e..089481d076 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2946,7 +2946,7 @@ void MarlinSettings::reset() { } #define CONFIG_ECHO_START() do{ if (!forReplay) SERIAL_ECHO_START(); }while(0) - #define CONFIG_ECHO_MSG(STR) do{ CONFIG_ECHO_START(); SERIAL_ECHOLNPGM(STR); }while(0) + #define CONFIG_ECHO_MSG(V...) do{ CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR(V); }while(0) #define CONFIG_ECHO_HEADING(STR) config_heading(forReplay, PSTR(STR)) #if HAS_TRINAMIC_CONFIG @@ -3039,26 +3039,24 @@ void MarlinSettings::reset() { } #if EXTRUDERS == 1 - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M200 S", int(parser.volumetric_enabled) - , " D", LINEAR_UNIT(planner.filament_size[0]) - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[0]) - #endif - ); + CONFIG_ECHO_MSG(" M200 S", int(parser.volumetric_enabled) + , " D", LINEAR_UNIT(planner.filament_size[0]) + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[0]) + #endif + ); #else LOOP_L_N(i, EXTRUDERS) { - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M200 T", int(i) - , " D", LINEAR_UNIT(planner.filament_size[i]) - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[i]) - #endif - ); + CONFIG_ECHO_MSG(" M200 T", int(i) + , " D", LINEAR_UNIT(planner.filament_size[i]) + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[i]) + #endif + ); } - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M200 S", int(parser.volumetric_enabled)); + CONFIG_ECHO_MSG(" M200 S", int(parser.volumetric_enabled)); #endif + #endif // EXTRUDERS && !NO_VOLUMETRICS CONFIG_ECHO_HEADING("Steps per unit:"); @@ -3194,7 +3192,7 @@ void MarlinSettings::reset() { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR_P( - PSTR(" M420 S"), planner.leveling_active ? 1 : 0 + PSTR(" M420 S"), int(planner.leveling_active) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) , SP_Z_STR, LINEAR_UNIT(planner.z_fade_height) #endif @@ -3260,8 +3258,7 @@ void MarlinSettings::reset() { #elif ENABLED(BLTOUCH) || (HAS_Z_SERVO_PROBE && defined(Z_SERVO_ANGLES)) case Z_PROBE_SERVO_NR: #endif - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M281 P", int(i), " L", servo_angles[i][0], " U", servo_angles[i][1]); + CONFIG_ECHO_MSG(" M281 P", int(i), " L", servo_angles[i][0], " U", servo_angles[i][1]); default: break; } } @@ -3382,8 +3379,7 @@ void MarlinSettings::reset() { #endif // PIDTEMP #if ENABLED(PIDTEMPBED) - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR( + CONFIG_ECHO_MSG( " M304 P", thermalManager.temp_bed.pid.Kp , " I", unscalePID_i(thermalManager.temp_bed.pid.Ki) , " D", unscalePID_d(thermalManager.temp_bed.pid.Kd) @@ -3400,16 +3396,14 @@ void MarlinSettings::reset() { #if HAS_LCD_CONTRAST CONFIG_ECHO_HEADING("LCD Contrast:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M250 C", ui.contrast); + CONFIG_ECHO_MSG(" M250 C", ui.contrast); #endif TERN_(CONTROLLER_FAN_EDITABLE, M710_report(forReplay)); #if ENABLED(POWER_LOSS_RECOVERY) CONFIG_ECHO_HEADING("Power-Loss Recovery:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M413 S", int(recovery.enabled)); + CONFIG_ECHO_MSG(" M413 S", int(recovery.enabled)); #endif #if ENABLED(FWRETRACT) @@ -3424,8 +3418,7 @@ void MarlinSettings::reset() { ); CONFIG_ECHO_HEADING("Recover: S F"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR( + CONFIG_ECHO_MSG( " M208 S", LINEAR_UNIT(fwretract.settings.retract_recover_extra) , " W", LINEAR_UNIT(fwretract.settings.swap_retract_recover_extra) , " F", LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_recover_feedrate_mm_s)) @@ -3434,8 +3427,7 @@ void MarlinSettings::reset() { #if ENABLED(FWRETRACT_AUTORETRACT) CONFIG_ECHO_HEADING("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M209 S", fwretract.autoretract_enabled ? 1 : 0); + CONFIG_ECHO_MSG(" M209 S", int(fwretract.autoretract_enabled)); #endif // FWRETRACT_AUTORETRACT @@ -3780,13 +3772,10 @@ void MarlinSettings::reset() { #if ENABLED(LIN_ADVANCE) CONFIG_ECHO_HEADING("Linear Advance:"); #if EXTRUDERS < 2 - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M900 K", planner.extruder_advance_K[0]); + CONFIG_ECHO_MSG(" M900 K", planner.extruder_advance_K[0]); #else - LOOP_L_N(i, EXTRUDERS) { - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M900 T", int(i), " K", planner.extruder_advance_K[i]); - } + LOOP_L_N(i, EXTRUDERS) + CONFIG_ECHO_MSG(" M900 T", int(i), " K", planner.extruder_advance_K[i]); #endif #endif @@ -3851,8 +3840,7 @@ void MarlinSettings::reset() { #if HAS_FILAMENT_SENSOR CONFIG_ECHO_HEADING("Filament runout sensor:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR( + CONFIG_ECHO_MSG( " M412 S", int(runout.enabled) #if HAS_FILAMENT_RUNOUT_DISTANCE , " D", LINEAR_UNIT(runout.runout_distance()) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index b5820e17bf..f6d22420f2 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1037,8 +1037,7 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { #if ENABLED(PID_BED_DEBUG) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR( + SERIAL_ECHO_MSG( " PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output, #if DISABLED(PID_OPENLOOP) STR_PID_DEBUG_PTERM, work_pid.Kp, diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 4278e6be26..191617be30 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1196,8 +1196,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { gcode.process_subcommands_now_P(PSTR(EVENT_GCODE_AFTER_TOOLCHANGE)); #endif - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(active_extruder)); + SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(active_extruder)); #endif // HAS_MULTI_EXTRUDER } diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index c88fdc0693..bda7f8aeba 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -270,10 +270,9 @@ void CardReader::printListing(SdFile parent, const char * const prepend/*=nullpt // Get a new directory object using the full path // and dive recursively into it. SdFile child; - if (!child.open(&parent, dosFilename, O_READ)) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_SD_CANT_OPEN_SUBDIR, dosFilename); - } + if (!child.open(&parent, dosFilename, O_READ)) + SERIAL_ECHO_MSG(STR_SD_CANT_OPEN_SUBDIR, dosFilename); + printListing(child, path); // close() is done automatically by destructor of SdFile } @@ -594,8 +593,7 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* filespos[file_subcall_ctr] = sdpos; // For sub-procedures say 'SUBROUTINE CALL target: "..." parent: "..." pos12345' - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("SUBROUTINE CALL target:\"", path, "\" parent:\"", proc_filenames[file_subcall_ctr], "\" pos", sdpos); + SERIAL_ECHO_MSG("SUBROUTINE CALL target:\"", path, "\" parent:\"", proc_filenames[file_subcall_ctr], "\" pos", sdpos); file_subcall_ctr++; break; @@ -941,10 +939,8 @@ void CardReader::cd(const char * relpath) { workDirParents[workDirDepth++] = workDir; TERN_(SDCARD_SORT_ALPHA, presort()); } - else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_SD_CANT_ENTER_SUBDIR, relpath); - } + else + SERIAL_ECHO_MSG(STR_SD_CANT_ENTER_SUBDIR, relpath); } int8_t CardReader::cdup() { From bb511195b8867616438d4c600c14e6678c0728a0 Mon Sep 17 00:00:00 2001 From: "Zs.Antal" <45710979+AntoszHUN@users.noreply.github.com> Date: Fri, 5 Feb 2021 13:28:30 +0100 Subject: [PATCH 0980/1370] Update Hungarian language (#20996) --- Marlin/src/lcd/language/language_hu.h | 96 +++++++++++++++++++-------- 1 file changed, 70 insertions(+), 26 deletions(-) diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 523f9c1c69..c5cd845c27 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -47,6 +47,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló Behelyezve"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló Eltávolítva"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD-Kártya hiba"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba"); @@ -56,7 +57,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_MAIN = _UxGT(""); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További Beállítások"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguráció"); - PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Autoinditás"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoinditás"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); @@ -65,6 +66,10 @@ namespace Language_hu { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Kezdöpont"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Kezdöpont"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Igazítás"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Elektromos segéd"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Ismétlés: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Pontosság csökken!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Pontosság elérve"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Kezdöpont"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez."); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö Pont"); @@ -94,8 +99,12 @@ namespace Language_hu { PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Visszahütés"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer Vezérlés"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lézer Ki"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lézer Be"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer Teljesítmény"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó Vezérlés"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Orsó Ki"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Orsó Be"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó Teljesítmény"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó Hátra"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bekapcsolás"); @@ -114,12 +123,13 @@ namespace Language_hu { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Érték"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni Parancs"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni parancs"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Teszt"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Pont"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Szonda határon kívül"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Eltérés"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mód"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Eszköz Eltolás"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Eszköz eltolás"); PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkolás"); PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás"); @@ -129,9 +139,9 @@ namespace Language_hu { PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fúvóka Z"); PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Szintezz! G29"); PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Eszköz"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Egységes Ãgy Szint"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Döntési Pont"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Kézi Háló Építés"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Egységes ágy szint"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Döntési pont"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Kézi háló építés"); PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Tégy alátétet és mérj"); PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mérés"); PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Ãœres ágyat mérj"); @@ -148,14 +158,12 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló Kész"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni Háló Építés"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló Építés"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló Építés ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló Elfogadás ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg Háló Építés"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("AHáló Magasság Ãllítása"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Összmagasság"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló Építés ($)"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg háló építés"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Háló magasság állítás"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Magasság összege"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló Elfogadás"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló Elfogadás ($)"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi Háló Elfogadása"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ãgy Fűtés"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka Fűtés"); @@ -216,6 +224,10 @@ namespace Language_hu { PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Viola"); PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Fehér"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Csatorna ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("LEDek #2"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Fény #2 Megadott"); + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("FényerÅ‘"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni Szín"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros Intenzitás"); PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zöld Intenzitás"); @@ -231,7 +243,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg"); - PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mozgás %smm"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mozgás %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mozgás 10mm"); @@ -304,7 +316,9 @@ namespace Language_hu { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Höfok"); PROGMEM Language_Str MSG_MOTION = _UxGT("Mozgatások"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Nyomtatószál"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm") SUPERSCRIPT_THREE _UxGT("-ben"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm³-ben"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit mm³-ben"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. Ãtm."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. Ãtm. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Kiadás mm"); @@ -326,12 +340,17 @@ namespace Language_hu { PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); PROGMEM Language_Str MSG_PREPARE = _UxGT("Vezérlés"); PROGMEM Language_Str MSG_TUNE = _UxGT("Hangolás"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Teljesítménymonitor"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Jelenlegi"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Feszültség"); + PROGMEM Language_Str MSG_POWER = _UxGT("Energia"); PROGMEM Language_Str MSG_START_PRINT = _UxGT("Nyomtatás Indítása"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Tovább"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Kezdet"); PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Ãllj"); PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Nyomtatás"); PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Újraindítás"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Mellöz"); PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Mégse"); PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Kész"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Vissza"); @@ -339,6 +358,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_PAUSING = _UxGT("Szüneteltetve..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Nyomtatás Szünetelés"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nyomtatás folytatása"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Hoszt indítás"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Nyomtatás leállítása"); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objektum Nyomtatása"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objektum Törlése"); @@ -361,8 +381,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Visszavonás V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S Vi.vo V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVisszah."); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás Távolság"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Csere"); @@ -408,16 +428,17 @@ namespace Language_hu { PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Eltolás Teszt"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Teszt"); PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés"); PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Használ"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Szonda Használ"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Szonda Elhelyezés"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Használ"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Elhelyezés"); PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s Kell"); PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda Eltolások"); PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Szonda X Eltolás"); PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Szonda Y Eltolás"); PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Szonda Z Eltolás"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fúvóka az ágyhoz"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikrolépés X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikrolépés Z"); @@ -425,9 +446,9 @@ namespace Language_hu { PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Végállás megszakítva!"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fütés hiba!"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hiba: SZÃœKSÉGTELEN HÖFOK"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÃœTÉSKIMARADÃS"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÃGY FÃœTÉSKIMARADÃS"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÃœTÉSKIMARADÃS"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÃœTÉS KIMARADÃS"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÃGY FÃœTÉS KIMARADÃS"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÃœTÉS KIMARADÃS"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX Höfok"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN Höfok"); PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEFAGYOTT"); @@ -439,6 +460,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_COOLING = _UxGT("Hütés..."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ãgy fütés..."); PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ãgy hütés..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Szonda fütése..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Szonda hütése..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kamra fütés..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kamra hütés..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibráció"); @@ -468,6 +491,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI"); PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend üresjárati idök."); PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Munkalámpa"); PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Fényerösség"); @@ -556,6 +580,20 @@ namespace Language_hu { PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Rossz oldalindex"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Rossz oldalsebesség"); + + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Jelszó szerkesztése"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Belépés szükséges"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Jelszóbeállítások"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Ãrja be a számokat"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Jelszó Beáll/Szerk"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Jelszó törlése"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("A jelszó "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Újrakezdés"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Mentse el!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Jelszó törölve"); + // // Filament Change screens show up to 3 lines on a 4-line display // ...or up to 2 lines on a 3-line display @@ -571,7 +609,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Várj a", "szál betöltésére")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Várj a", "szál tisztításra")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kattints a készre", "szál tiszta")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd folytat...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd foltyat...")); #else PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Katt a folytatáshoz")); PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); @@ -600,11 +638,17 @@ namespace Language_hu { PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korrekció"); PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Simítás"); - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Tengely Szint"); + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Tengely szint"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Önkalibrálás"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fűtéskimaradás"); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Tétlenségi idökorlát, a hömérséklet csökkent. Nyomja meg az OK gombot az ismételt felfűtéshez, és újra a folytatáshoz."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fűtés idökorlátja"); + #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("Újrafűt"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafűtés..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Szonda varázsló"); } #if FAN_COUNT == 1 From 9437c72ef648ad161ec56162401b5c4aa5f55d7f Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 6 Feb 2021 02:07:10 +1300 Subject: [PATCH 0981/1370] Fix MKS SGen-L DOGLCD_MOSI pin for FYSETC_MINI_12864 LCD (#20998) --- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index 79c79c5914..abf5be3c89 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -337,7 +337,7 @@ #define DOGLCD_CS P0_18 #define DOGLCD_A0 P0_16 #define DOGLCD_SCK P0_07 - #define DOGLCD_MOSI P1_20 + #define DOGLCD_MOSI P0_09 #define LCD_BACKLIGHT_PIN -1 From bbb49c43e1bee1f6f5869c7c7cb23bb55c4811fd Mon Sep 17 00:00:00 2001 From: Chris Pepper Date: Fri, 5 Feb 2021 22:43:36 +0000 Subject: [PATCH 0982/1370] Mitigate RPi hosts kernel panic on M997 Work around M997 sometimes causing a kernel panic on the host when sent from a Raspbery Pi, the root cause is currently unknown. --- Marlin/src/HAL/LPC1768/HAL.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index 27aa569fae..eddd61af7d 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -63,7 +63,11 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { return ind > -1 ? ind : dval; } -void flashFirmware(const int16_t) { NVIC_SystemReset(); } +void flashFirmware(const int16_t) { + USB_Connect(FALSE); // USB clear connection + delay(2000); // Give OS time to notice + NVIC_SystemReset(); +} void HAL_clear_reset_source(void) { TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag()); From 6054052248597c44c12402960d95844cb560e63f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 5 Feb 2021 18:47:53 -0600 Subject: [PATCH 0983/1370] Use 'false' --- Marlin/src/HAL/LPC1768/HAL.cpp | 2 +- Marlin/src/HAL/LPC1768/main.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index eddd61af7d..f567f26c9e 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -64,7 +64,7 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { } void flashFirmware(const int16_t) { - USB_Connect(FALSE); // USB clear connection + USB_Connect(false); // USB clear connection delay(2000); // Give OS time to notice NVIC_SystemReset(); } diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index f41a576376..1fbeddd9ea 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -119,9 +119,9 @@ void HAL_init() { #endif USB_Init(); // USB Initialization - USB_Connect(FALSE); // USB clear connection + USB_Connect(false); // USB clear connection delay(1000); // Give OS time to notice - USB_Connect(TRUE); + USB_Connect(true); #if HAS_SD_HOST_DRIVE MSC_SD_Init(0); // Enable USB SD card access From 77966135e81a3f6667de63a04527dc27d1f7fc9a Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sat, 6 Feb 2021 05:43:51 +0100 Subject: [PATCH 0984/1370] Fix ARM delay function (#20901) --- Marlin/src/HAL/DUE/HAL_SPI.cpp | 8 +- .../dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp | 1 + .../dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp | 1 + Marlin/src/HAL/STM32/HAL.cpp | 11 -- Marlin/src/HAL/STM32/HAL.h | 1 + Marlin/src/HAL/STM32/HAL_SPI.cpp | 30 ++- Marlin/src/HAL/shared/Delay.cpp | 176 ++++++++++++++++++ Marlin/src/HAL/shared/Delay.h | 132 +++++++------ Marlin/src/MarlinCore.cpp | 3 + Marlin/src/core/macros.h | 2 + Marlin/src/gcode/gcode_d.cpp | 8 +- 11 files changed, 279 insertions(+), 94 deletions(-) create mode 100644 Marlin/src/HAL/shared/Delay.cpp diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 342c373735..6cb2912c12 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -240,7 +240,7 @@ } // all the others - static uint32_t spiDelayCyclesX4 = (F_CPU) / 1000000; // 4µs => 125khz + static uint32_t spiDelayCyclesX4 = 4 * (F_CPU) / 1000000; // 4µs => 125khz static uint8_t spiTransferX(uint8_t b) { // using Mode 0 int bits = 8; @@ -249,12 +249,12 @@ b <<= 1; // little setup time WRITE(SD_SCK_PIN, HIGH); - __delay_4cycles(spiDelayCyclesX4); + DELAY_CYCLES(spiDelayCyclesX4); b |= (READ(SD_MISO_PIN) != 0); WRITE(SD_SCK_PIN, LOW); - __delay_4cycles(spiDelayCyclesX4); + DELAY_CYCLES(spiDelayCyclesX4); } while (--bits); return b; } @@ -510,7 +510,7 @@ spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; break; default: - spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate); + spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate) << 2; // spiRate of 2 gives the maximum error with current CPU spiTransferTx = (pfnSpiTransfer)spiTransferX; spiTransferRx = (pfnSpiTransfer)spiTransferX; spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp index 7df180cbaa..d01cd4dd6b 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp @@ -59,6 +59,7 @@ #if ENABLED(U8GLIB_ST7920) +#include "../../../inc/MarlinConfig.h" #include "../../shared/Delay.h" #include diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp index 615a386c35..4fb7a6e2c3 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp @@ -59,6 +59,7 @@ #if HAS_MARLINUI_U8GLIB +#include "../../../inc/MarlinConfig.h" #include "../../shared/Delay.h" #include diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index 06744f16b8..e694a16a82 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -57,17 +57,6 @@ uint16_t HAL_adc_result; // Public functions // ------------------------ -// Needed for DELAY_NS() / DELAY_US() on CORTEX-M7 -#if (defined(__arm__) || defined(__thumb__)) && __CORTEX_M == 7 - // HAL pre-initialization task - // Force the preinit function to run between the premain() and main() function - // of the STM32 arduino core - __attribute__((constructor (102))) - void HAL_preinit() { - enableCycleCounter(); - } -#endif - // HAL initialization task void HAL_init() { FastIO_init(); diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 8f6c0a5990..be0cc30962 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -194,6 +194,7 @@ void flashFirmware(const int16_t); typedef void (*systickCallback_t)(void); void systick_attach_callback(systickCallback_t cb); void HAL_SYSTICK_Callback(); + extern volatile uint32_t systick_uptime_millis; #define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp index eef480777b..c9f23e6fa3 100644 --- a/Marlin/src/HAL/STM32/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp @@ -51,18 +51,28 @@ static SPISettings spiConfig; OUT_WRITE(SD_MOSI_PIN, HIGH); } - static uint16_t delay_STM32_soft_spi; + // Use function with compile-time value so we can actually reach the desired frequency + // Need to adjust this a little bit: on a 72MHz clock, we have 14ns/clock + // and we'll use ~3 cycles to jump to the method and going back, so it'll take ~40ns from the given clock here + #define CALLING_COST_NS (3U * 1000000000U) / (F_CPU) + void (*delaySPIFunc)(); + void delaySPI_125() { DELAY_NS(125 - CALLING_COST_NS); } + void delaySPI_250() { DELAY_NS(250 - CALLING_COST_NS); } + void delaySPI_500() { DELAY_NS(500 - CALLING_COST_NS); } + void delaySPI_1000() { DELAY_NS(1000 - CALLING_COST_NS); } + void delaySPI_2000() { DELAY_NS(2000 - CALLING_COST_NS); } + void delaySPI_4000() { DELAY_NS(4000 - CALLING_COST_NS); } void spiInit(uint8_t spiRate) { // Use datarates Marlin uses switch (spiRate) { - case SPI_FULL_SPEED: delay_STM32_soft_spi = 125; break; // desired: 8,000,000 actual: ~1.1M - case SPI_HALF_SPEED: delay_STM32_soft_spi = 125; break; // desired: 4,000,000 actual: ~1.1M - case SPI_QUARTER_SPEED:delay_STM32_soft_spi = 250; break; // desired: 2,000,000 actual: ~890K - case SPI_EIGHTH_SPEED: delay_STM32_soft_spi = 500; break; // desired: 1,000,000 actual: ~590K - case SPI_SPEED_5: delay_STM32_soft_spi = 1000; break; // desired: 500,000 actual: ~360K - case SPI_SPEED_6: delay_STM32_soft_spi = 2000; break; // desired: 250,000 actual: ~210K - default: delay_STM32_soft_spi = 4000; break; // desired: 125,000 actual: ~123K + case SPI_FULL_SPEED: delaySPIFunc = &delaySPI_125; break; // desired: 8,000,000 actual: ~1.1M + case SPI_HALF_SPEED: delaySPIFunc = &delaySPI_125; break; // desired: 4,000,000 actual: ~1.1M + case SPI_QUARTER_SPEED:delaySPIFunc = &delaySPI_250; break; // desired: 2,000,000 actual: ~890K + case SPI_EIGHTH_SPEED: delaySPIFunc = &delaySPI_500; break; // desired: 1,000,000 actual: ~590K + case SPI_SPEED_5: delaySPIFunc = &delaySPI_1000; break; // desired: 500,000 actual: ~360K + case SPI_SPEED_6: delaySPIFunc = &delaySPI_2000; break; // desired: 250,000 actual: ~210K + default: delaySPIFunc = &delaySPI_4000; break; // desired: 125,000 actual: ~123K } SPI.begin(); } @@ -75,9 +85,9 @@ static SPISettings spiConfig; WRITE(SD_SCK_PIN, LOW); WRITE(SD_MOSI_PIN, b & 0x80); - DELAY_NS(delay_STM32_soft_spi); + delaySPIFunc(); WRITE(SD_SCK_PIN, HIGH); - DELAY_NS(delay_STM32_soft_spi); + delaySPIFunc(); b <<= 1; // little setup time b |= (READ(SD_MISO_PIN) != 0); diff --git a/Marlin/src/HAL/shared/Delay.cpp b/Marlin/src/HAL/shared/Delay.cpp new file mode 100644 index 0000000000..1ae1b3e381 --- /dev/null +++ b/Marlin/src/HAL/shared/Delay.cpp @@ -0,0 +1,176 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "Delay.h" + +#include "../../inc/MarlinConfig.h" + +#if defined(__arm__) || defined(__thumb__) + + static uint32_t ASM_CYCLES_PER_ITERATION = 4; // Initial bet which will be adjusted in calibrate_delay_loop + + // Simple assembler loop counting down + void delay_asm(uint32_t cy) { + cy = _MAX(cy / ASM_CYCLES_PER_ITERATION, 1U); // Zero is forbidden here + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + L("1") + A("subs %[cnt],#1") + A("bne 1b") + : [cnt]"+r"(cy) // output: +r means input+output + : // input: + : "cc" // clobbers: + ); + } + + // We can't use CMSIS since it's not available on all platform, so fallback to hardcoded register values + #define HW_REG(X) *(volatile uint32_t *)(X) + #define _DWT_CTRL 0xE0001000 + #define _DWT_CYCCNT 0xE0001004 // CYCCNT is 32bits, takes 37s or so to wrap. + #define _DEM_CR 0xE000EDFC + #define _LAR 0xE0001FB0 + + // Use hardware cycle counter instead, it's much safer + void delay_dwt(uint32_t count) { + // Reuse the ASM_CYCLES_PER_ITERATION variable to avoid wasting another useless variable + register uint32_t start = HW_REG(_DWT_CYCCNT) - ASM_CYCLES_PER_ITERATION, elapsed; + do { + elapsed = HW_REG(_DWT_CYCCNT) - start; + } while (elapsed < count); + } + + // Pointer to asm function, calling the functions has a ~20 cycles overhead + DelayImpl DelayCycleFnc = delay_asm; + + void calibrate_delay_loop() { + // Check if we have a working DWT implementation in the CPU (see https://developer.arm.com/documentation/ddi0439/b/Data-Watchpoint-and-Trace-Unit/DWT-Programmers-Model) + if (!HW_REG(_DWT_CTRL)) { + // No DWT present, so fallback to plain old ASM nop counting + // Unfortunately, we don't exactly know how many iteration it'll take to decrement a counter in a loop + // It depends on the CPU architecture, the code current position (flash vs SRAM) + // So, instead of wild guessing and making mistake, instead + // compute it once for all + ASM_CYCLES_PER_ITERATION = 1; + // We need to fetch some reference clock before waiting + cli(); + uint32_t start = micros(); + delay_asm(1000); // On a typical CPU running in MHz, waiting 1000 "unknown cycles" means it'll take between 1ms to 6ms, that's perfectly acceptable + uint32_t end = micros(); + sei(); + uint32_t expectedCycles = (end - start) * ((F_CPU) / 1000000UL); // Convert microseconds to cycles + // Finally compute the right scale + ASM_CYCLES_PER_ITERATION = (uint32_t)(expectedCycles / 1000); + + // No DWT present, likely a Cortex M0 so NOP counting is our best bet here + DelayCycleFnc = delay_asm; + } + else { + // Enable DWT counter + // From https://stackoverflow.com/a/41188674/1469714 + HW_REG(_DEM_CR) = HW_REG(_DEM_CR) | 0x01000000; // Enable trace + #if __CORTEX_M == 7 + HW_REG(_LAR) = 0xC5ACCE55; // Unlock access to DWT registers, see https://developer.arm.com/documentation/ihi0029/e/ section B2.3.10 + #endif + HW_REG(_DWT_CYCCNT) = 0; // Clear DWT cycle counter + HW_REG(_DWT_CTRL) = HW_REG(_DWT_CTRL) | 1; // Enable DWT cycle counter + + // Then calibrate the constant offset from the counter + ASM_CYCLES_PER_ITERATION = 0; + uint32_t s = HW_REG(_DWT_CYCCNT); + uint32_t e = HW_REG(_DWT_CYCCNT); // (e - s) contains the number of cycle required to read the cycle counter + delay_dwt(0); + uint32_t f = HW_REG(_DWT_CYCCNT); // (f - e) contains the delay to call the delay function + the time to read the cycle counter + ASM_CYCLES_PER_ITERATION = (f - e) - (e - s); + + // Use safer DWT function + DelayCycleFnc = delay_dwt; + } + } + + #if ENABLED(MARLIN_DEV_MODE) + void dump_delay_accuracy_check() + { + auto report_call_time = [](PGM_P const name, const uint32_t cycles, const uint32_t total, const bool do_flush=true) { + SERIAL_ECHOPGM("Calling "); + serialprintPGM(name); + SERIAL_ECHOLNPAIR(" for ", cycles, "cycles took: ", total, "cycles"); + if (do_flush) SERIAL_FLUSH(); + }; + + uint32_t s, e; + + SERIAL_ECHOLNPAIR("Computed delay calibration value: ", ASM_CYCLES_PER_ITERATION); + SERIAL_FLUSH(); + // Display the results of the calibration above + constexpr uint32_t testValues[] = { 1, 5, 10, 20, 50, 100, 150, 200, 350, 500, 750, 1000 }; + for (auto i : testValues) { + s = micros(); DELAY_US(i); e = micros(); + report_call_time(PSTR("delay"), i, e - s); + } + + if (HW_REG(_DWT_CTRL)) { + for (auto i : testValues) { + s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(i); e = HW_REG(_DWT_CYCCNT); + report_call_time(PSTR("delay"), i, e - s); + } + + // Measure the delay to call a real function compared to a function pointer + s = HW_REG(_DWT_CYCCNT); delay_dwt(1); e = HW_REG(_DWT_CYCCNT); + report_call_time(PSTR("delay_dwt"), 1, e - s); + + static PGMSTR(dcd, "DELAY_CYCLES directly "); + + s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES( 1); e = HW_REG(_DWT_CYCCNT); + report_call_time(dcd, 1, e - s, false); + + s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES( 5); e = HW_REG(_DWT_CYCCNT); + report_call_time(dcd, 5, e - s, false); + + s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(10); e = HW_REG(_DWT_CYCCNT); + report_call_time(dcd, 10, e - s, false); + + s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(20); e = HW_REG(_DWT_CYCCNT); + report_call_time(dcd, 20, e - s, false); + + s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(50); e = HW_REG(_DWT_CYCCNT); + report_call_time(dcd, 50, e - s, false); + + s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(100); e = HW_REG(_DWT_CYCCNT); + report_call_time(dcd, 100, e - s, false); + + s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(200); e = HW_REG(_DWT_CYCCNT); + report_call_time(dcd, 200, e - s, false); + } + } + #endif // MARLIN_DEV_MODE + + +#else + + void calibrate_delay_loop() {} + #if ENABLED(MARLIN_DEV_MODE) + void dump_delay_accuracy_check() { + static PGMSTR(none, "N/A on this platform"); + serialprintPGM(none); + } + #endif + +#endif diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h index a48f3f79cf..dc1f158b44 100644 --- a/Marlin/src/HAL/shared/Delay.h +++ b/Marlin/src/HAL/shared/Delay.h @@ -21,6 +21,8 @@ */ #pragma once +#include "../../inc/MarlinConfigPre.h" + /** * Busy wait delay cycles routines: * @@ -31,79 +33,68 @@ #include "../../core/macros.h" +void calibrate_delay_loop(); + #if defined(__arm__) || defined(__thumb__) - #if __CORTEX_M == 7 + // We want to have delay_cycle function with the lowest possible overhead, so we adjust at the function at runtime based on the current CPU best feature + typedef void (*DelayImpl)(uint32_t); + extern DelayImpl DelayCycleFnc; - // Cortex-M3 through M7 can use the cycle counter of the DWT unit - // https://www.anthonyvh.com/2017/05/18/cortex_m-cycle_counter/ + // I've measured 36 cycles on my system to call the cycle waiting method, but it shouldn't change much to have a bit more margin, it only consume a bit more flash + #define TRIP_POINT_FOR_CALLING_FUNCTION 40 - FORCE_INLINE static void enableCycleCounter() { - CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; - - #if __CORTEX_M == 7 - DWT->LAR = 0xC5ACCE55; // Unlock DWT on the M7 - #endif - - DWT->CYCCNT = 0; - DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; + // A simple recursive template class that output exactly one 'nop' of code per recursion + template struct NopWriter { + FORCE_INLINE static void build() { + __asm__ __volatile__("nop"); + NopWriter::build(); } + }; + // End the loop + template <> struct NopWriter<0> { FORCE_INLINE static void build() {} }; - FORCE_INLINE volatile uint32_t getCycleCount() { return DWT->CYCCNT; } - - FORCE_INLINE static void DELAY_CYCLES(const uint32_t x) { - const uint32_t endCycles = getCycleCount() + x; - while (PENDING(getCycleCount(), endCycles)) {} - } - - #else - - // https://blueprints.launchpad.net/gcc-arm-embedded/+spec/delay-cycles - - #define nop() __asm__ __volatile__("nop;\n\t":::) - - FORCE_INLINE static void __delay_4cycles(uint32_t cy) { // +1 cycle - #if ARCH_PIPELINE_RELOAD_CYCLES < 2 - #define EXTRA_NOP_CYCLES A("nop") - #else - #define EXTRA_NOP_CYCLES "" - #endif - - __asm__ __volatile__( - A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax - L("1") - A("subs %[cnt],#1") - EXTRA_NOP_CYCLES - A("bne 1b") - : [cnt]"+r"(cy) // output: +r means input+output - : // input: - : "cc" // clobbers: - ); - } - - // Delay in cycles - FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { - - if (__builtin_constant_p(x)) { - #define MAXNOPS 4 - - if (x <= (MAXNOPS)) { - switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } - } - else { // because of +1 cycle inside delay_4cycles - const uint32_t rem = (x - 1) % (MAXNOPS); - switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } - if ((x = (x - 1) / (MAXNOPS))) - __delay_4cycles(x); // if need more then 4 nop loop is more optimal - } - #undef MAXNOPS + namespace Private { + // Split recursing template in 2 different class so we don't reach the maximum template instantiation depth limit + template struct Helper { + FORCE_INLINE static void build() { + DelayCycleFnc(N - 2); // Approximative cost of calling the function (might be off by one or 2 cycles) } - else if ((x >>= 2)) - __delay_4cycles(x); - } - #undef nop + }; - #endif + template struct Helper { + FORCE_INLINE static void build() { + NopWriter::build(); + } + }; + + template <> struct Helper { + FORCE_INLINE static void build() {} + }; + + } + // Select a behavior based on the constexpr'ness of the parameter + // If called with a compile-time parameter, then write as many NOP as required to reach the asked cycle count + // (there is some tripping point here to start looping when it's more profitable than gruntly executing NOPs) + // If not called from a compile-time parameter, fallback to a runtime loop counting version instead + template + struct SmartDelay { + FORCE_INLINE SmartDelay(int) { + if (Cycles == 0) return; + Private::Helper::build(); + } + }; + // Runtime version below. There is no way this would run under less than ~TRIP_POINT_FOR_CALLING_FUNCTION cycles + template + struct SmartDelay { + FORCE_INLINE SmartDelay(int v) { DelayCycleFnc(v); } + }; + + #define DELAY_CYCLES(X) do { SmartDelay _smrtdly_X(X); } while(0) + + // For delay in microseconds, no smart delay selection is required, directly call the delay function + // Teensy compiler is too old and does not accept smart delay compile-time / run-time selection correctly + #define DELAY_US(x) DelayCycleFnc((x) * ((F_CPU) / 1000000UL)) #elif defined(__AVR__) @@ -144,10 +135,15 @@ } #undef nop + // Delay in microseconds + #define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL)) + #elif defined(__PLAT_LINUX__) || defined(ESP32) - // specified inside platform + // DELAY_CYCLES specified inside platform + // Delay in microseconds + #define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL)) #else #error "Unsupported MCU architecture" @@ -157,5 +153,5 @@ // Delay in nanoseconds #define DELAY_NS(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL) / 1000UL) -// Delay in microseconds -#define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL)) + + diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index f0d4fa05a6..626f934ddc 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1005,6 +1005,9 @@ void setup() { SERIAL_ECHO_MSG("Compiled: " __DATE__); SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); + // Some HAL need precise delay adjustment + calibrate_delay_loop(); + // Init buzzer pin(s) #if USE_BEEPER SETUP_RUN(buzzer.init()); diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 905b85d56d..8361248e1c 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -61,6 +61,8 @@ #define _O2 __attribute__((optimize("O2"))) #define _O3 __attribute__((optimize("O3"))) +#define IS_CONSTEXPR(...) __builtin_constant_p(__VA_ARGS__) // Only valid solution with C++14. Should use std::is_constant_evaluated() in C++20 instead + #ifndef UNUSED #define UNUSED(x) ((void)(x)) #endif diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 0bd2955875..653ae6a553 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -30,6 +30,8 @@ #include "../HAL/shared/eeprom_if.h" #include "../HAL/shared/Delay.h" + extern void dump_delay_accuracy_check(); + /** * Dn: G-code for development and testing * @@ -141,7 +143,7 @@ } } break; - case 5: { // D4 Read / Write onboard Flash + case 5: { // D5 Read / Write onboard Flash #define FLASH_SIZE 1024 uint8_t *pointer = parser.hex_adr_val('A'); uint16_t len = parser.ushortval('C', 1); @@ -162,6 +164,10 @@ } } break; + case 6: // D6 Check delay loop accuracy + dump_delay_accuracy_check(); + break; + case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) SERIAL_ECHOLNPGM("Disabling heaters and attempting to trigger Watchdog"); SERIAL_ECHOLNPGM("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")"); From 8416edd127dbb986e6852827849350fd2b331c5f Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Wed, 3 Feb 2021 10:03:48 -0700 Subject: [PATCH 0985/1370] Refactor FTDI EVE Touch Screen (#20987) --- .../ftdi_eve_lib/extended/screen_types.cpp | 4 +- .../ftdi_eve_lib/extended/screen_types.h | 14 +- .../screens/about_screen.cpp | 7 +- .../ftdi_eve_touch_ui/screens/about_screen.h | 33 + .../screens/advanced_settings_menu.cpp | 7 +- .../screens/advanced_settings_menu.h | 32 + .../screens/alert_dialog_box.cpp | 15 +- .../screens/alert_dialog_box.h | 39 + .../screens/backlash_compensation_screen.cpp | 7 +- .../screens/backlash_compensation_screen.h | 32 + .../base_numeric_adjustment_screen.cpp | 21 +- .../screens/base_numeric_adjustment_screen.h | 87 ++ .../ftdi_eve_touch_ui/screens/base_screen.cpp | 7 +- .../ftdi_eve_touch_ui/screens/base_screen.h | 43 + .../screens/bed_mesh_screen.cpp | 51 +- .../screens/bed_mesh_screen.h | 62 ++ .../screens/bio_advanced_settings.cpp | 7 +- .../screens/bio_advanced_settings.h | 32 + .../screens/bio_confirm_home_e.cpp | 7 +- .../screens/bio_confirm_home_e.h | 32 + .../screens/bio_confirm_home_xyz.cpp | 7 +- .../screens/bio_confirm_home_xyz.h | 32 + .../screens/bio_main_menu.cpp | 7 +- .../ftdi_eve_touch_ui/screens/bio_main_menu.h | 32 + .../screens/bio_printing_dialog_box.cpp | 7 +- .../screens/bio_printing_dialog_box.h | 44 + .../screens/bio_status_screen.cpp | 7 +- .../screens/bio_status_screen.h | 56 ++ .../screens/bio_tune_menu.cpp | 7 +- .../ftdi_eve_touch_ui/screens/bio_tune_menu.h | 35 + .../ftdi_eve_touch_ui/screens/boot_screen.cpp | 7 +- .../ftdi_eve_touch_ui/screens/boot_screen.h | 35 + .../screens/case_light_screen.cpp | 7 +- .../screens/case_light_screen.h | 31 + .../screens/change_filament_screen.cpp | 61 +- .../screens/change_filament_screen.h | 51 ++ .../cocoa_press_advanced_settings_menu.cpp | 7 +- .../cocoa_press_advanced_settings_menu.h | 32 + .../screens/cocoa_press_load_chocolate.cpp | 7 +- .../screens/cocoa_press_load_chocolate.h | 34 + .../screens/cocoa_press_main_menu.cpp | 7 +- .../screens/cocoa_press_main_menu.h | 33 + .../screens/cocoa_press_move_e_screen.cpp | 7 +- .../screens/cocoa_press_move_e_screen.h | 33 + .../screens/cocoa_press_move_xyz_screen.cpp | 11 +- .../screens/cocoa_press_move_xyz_screen.h | 33 + .../screens/cocoa_press_preheat_menu.cpp | 7 +- .../screens/cocoa_press_preheat_menu.h | 31 + .../screens/cocoa_press_preheat_screen.cpp | 13 +- .../screens/cocoa_press_preheat_screen.h | 46 + .../screens/cocoa_press_status_screen.cpp | 7 +- .../screens/cocoa_press_status_screen.h | 55 ++ .../screens/cocoa_press_unload_cartridge.cpp | 7 +- .../screens/cocoa_press_unload_cartridge.h | 34 + .../confirm_abort_print_dialog_box.cpp | 7 +- .../screens/confirm_abort_print_dialog_box.h | 32 + .../confirm_auto_calibration_dialog_box.cpp | 7 +- .../confirm_auto_calibration_dialog_box.h | 32 + .../confirm_erase_flash_dialog_box.cpp | 7 +- .../screens/confirm_erase_flash_dialog_box.h | 32 + .../confirm_start_print_dialog_box.cpp | 13 +- .../screens/confirm_start_print_dialog_box.h | 43 + .../confirm_user_request_alert_box.cpp | 9 +- .../screens/confirm_user_request_alert_box.h | 35 + .../screens/custom_user_menus.cpp | 7 +- .../screens/custom_user_menus.h | 32 + .../screens/default_acceleration_screen.cpp | 7 +- .../screens/default_acceleration_screen.h | 32 + .../screens/developer_menu.cpp | 7 +- .../screens/developer_menu.h | 32 + .../screens/dialog_box_base_class.cpp | 7 +- .../screens/dialog_box_base_class.h | 40 + .../screens/display_tuning_screen.cpp | 7 +- .../screens/display_tuning_screen.h | 32 + .../screens/endstop_state_screen.cpp | 7 +- .../screens/endstop_state_screen.h | 35 + .../screens/feedrate_percent_screen.cpp | 7 +- .../screens/feedrate_percent_screen.h | 32 + .../screens/filament_menu.cpp | 7 +- .../ftdi_eve_touch_ui/screens/filament_menu.h | 32 + .../screens/filament_runout_screen.cpp | 7 +- .../screens/filament_runout_screen.h | 32 + .../screens/files_screen.cpp | 69 +- .../ftdi_eve_touch_ui/screens/files_screen.h | 75 ++ .../screens/interface_settings_screen.cpp | 24 +- .../screens/interface_settings_screen.h | 67 ++ .../screens/interface_sounds_screen.cpp | 15 +- .../screens/interface_sounds_screen.h | 57 ++ .../ftdi_eve_touch_ui/screens/jerk_screen.cpp | 7 +- .../ftdi_eve_touch_ui/screens/jerk_screen.h | 32 + .../screens/junction_deviation_screen.cpp | 13 +- .../screens/junction_deviation_screen.h | 32 + .../ftdi_eve_touch_ui/screens/kill_screen.cpp | 7 +- .../ftdi_eve_touch_ui/screens/kill_screen.h | 33 + .../screens/language_menu.cpp | 10 +- .../ftdi_eve_touch_ui/screens/language_menu.h | 32 + .../screens/leveling_menu.cpp | 7 +- .../ftdi_eve_touch_ui/screens/leveling_menu.h | 32 + .../screens/linear_advance_screen.cpp | 7 +- .../screens/linear_advance_screen.h | 32 + .../ftdi_eve_touch_ui/screens/lock_screen.cpp | 28 +- .../ftdi_eve_touch_ui/screens/lock_screen.h | 53 ++ .../ftdi_eve_touch_ui/screens/main_menu.cpp | 7 +- .../lib/ftdi_eve_touch_ui/screens/main_menu.h | 33 + .../screens/max_acceleration_screen.cpp | 7 +- .../screens/max_acceleration_screen.h | 32 + .../screens/max_velocity_screen.cpp | 7 +- .../screens/max_velocity_screen.h | 32 + .../screens/media_player_screen.cpp | 7 +- .../screens/media_player_screen.h | 40 + .../screens/move_axis_screen.cpp | 37 +- .../screens/move_axis_screen.h | 48 + .../screens/nozzle_offsets_screen.cpp | 7 +- .../screens/nozzle_offsets_screen.h | 33 + .../screens/nudge_nozzle_screen.cpp | 45 +- .../screens/nudge_nozzle_screen.h | 44 + .../screens/restore_failsafe_dialog_box.cpp | 7 +- .../screens/restore_failsafe_dialog_box.h | 32 + .../screens/save_settings_dialog_box.cpp | 7 +- .../screens/save_settings_dialog_box.h | 38 + .../ftdi_eve_touch_ui/screens/screen_data.h | 95 +- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 192 ++-- .../lib/ftdi_eve_touch_ui/screens/screens.h | 825 ++---------------- .../screens/spinner_dialog_box.cpp | 17 +- .../screens/spinner_dialog_box.h | 41 + .../screens/statistics_screen.cpp | 7 +- .../screens/statistics_screen.h | 32 + .../screens/status_screen.cpp | 7 +- .../ftdi_eve_touch_ui/screens/status_screen.h | 45 + .../stepper_bump_sensitivity_screen.cpp | 11 +- .../screens/stepper_bump_sensitivity_screen.h | 32 + .../screens/stepper_current_screen.cpp | 7 +- .../screens/stepper_current_screen.h | 32 + .../screens/steps_screen.cpp | 7 +- .../ftdi_eve_touch_ui/screens/steps_screen.h | 32 + .../screens/stress_test_screen.cpp | 23 +- .../screens/stress_test_screen.h | 48 + .../screens/temperature_screen.cpp | 13 +- .../screens/temperature_screen.h | 32 + .../screens/touch_calibration_screen.cpp | 7 +- .../screens/touch_calibration_screen.h | 34 + .../screens/touch_registers_screen.cpp | 7 +- .../screens/touch_registers_screen.h | 32 + .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 7 +- .../lib/ftdi_eve_touch_ui/screens/tune_menu.h | 35 + .../screens/widget_demo_screen.cpp | 7 +- .../screens/widget_demo_screen.h | 34 + .../screens/z_offset_screen.cpp | 7 +- .../screens/z_offset_screen.h | 32 + .../lib/mks_ui/draw_tmc_current_settings.h | 1 - Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h | 3 - .../src/lcd/extui/lib/mks_ui/draw_wifi_tips.h | 1 - 152 files changed, 3378 insertions(+), 1370 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp index a0b434818a..d76b897e0f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp @@ -26,7 +26,7 @@ /********************** VIRTUAL DISPATCH DATA TYPE ******************************/ uint8_t ScreenRef::lookupScreen(onRedraw_func_t onRedraw_ptr) { - for (uint8_t type = 0; type < functionTableSize; type++) { + for (uint8_t type = 0; type < tableSize(); type++) { if (GET_METHOD(type, onRedraw) == onRedraw_ptr) { return type; } @@ -49,7 +49,7 @@ void ScreenRef::setScreen(onRedraw_func_t onRedraw_ptr) { } void ScreenRef::initializeAll() { - for (uint8_t type = 0; type < functionTableSize; type++) + for (uint8_t type = 0; type < tableSize(); type++) GET_METHOD(type, onStartup)(); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h index 1581cbbbc7..94d6d4e26c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -50,7 +50,11 @@ typedef enum { #define GET_METHOD(type, method) reinterpret_cast(pgm_read_ptr_far(&functionTable[type].method##_ptr)) #define SCREEN_TABLE PROGMEM const ScreenRef::table_t ScreenRef::functionTable[] = -#define SCREEN_TABLE_POST const uint8_t ScreenRef::functionTableSize = sizeof(ScreenRef::functionTable)/sizeof(ScreenRef::functionTable[0]); +#define SCREEN_TABLE_POST size_t ScreenRef::tableSize() { \ + constexpr size_t siz = sizeof(functionTable)/sizeof(functionTable[0]); \ + static_assert(siz > 0, "The screen table is empty!"); \ + return siz; \ + } class ScreenRef { protected: @@ -79,14 +83,12 @@ class ScreenRef { uint8_t type = 0; static PROGMEM const table_t functionTable[]; - static const uint8_t functionTableSize; public: - uint8_t getType() {return type;} + static size_t tableSize(); - void setType(uint8_t t) { - type = t; - } + uint8_t getType() {return type;} + void setType(uint8_t t) {type = t;} uint8_t lookupScreen(onRedraw_func_t onRedraw_ptr); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp index 952f0cac02..1d8db12ef9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_ABOUT_SCREEN + #define GRID_COLS 4 #define GRID_ROWS 7 @@ -113,4 +112,4 @@ bool AboutScreen::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_ABOUT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.h new file mode 100644 index 0000000000..b9d94f08b3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.h @@ -0,0 +1,33 @@ +/****************** + * about_screen.h * + ******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_ABOUT_SCREEN +#define FTDI_ABOUT_SCREEN_CLASS AboutScreen + +class AboutScreen : public BaseScreen, public UncachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 9036fc144b..b9255c11b9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) - #include "screens.h" +#ifdef FTDI_ADVANCED_SETTINGS_MENU + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -153,4 +152,4 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && !TOUCH_UI_LULZBOT_BIO +#endif // FTDI_ADVANCED_SETTINGS_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.h new file mode 100644 index 0000000000..a7e34fe6fe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.h @@ -0,0 +1,32 @@ +/*************************** + * advance_settings_menu.h * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_ADVANCED_SETTINGS_MENU +#define FTDI_ADVANCED_SETTINGS_MENU_CLASS AdvancedSettingsMenu + +class AdvancedSettingsMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp index d63119afe5..bbe922ad5d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp @@ -21,18 +21,19 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_ALERT_DIALOG_BOX + +constexpr static AlertDialogBoxData &mydata = screen_data.AlertDialogBox; + using namespace FTDI; using namespace Theme; void AlertDialogBox::onEntry() { BaseScreen::onEntry(); - sound.play(screen_data.AlertDialog.isError ? sad_trombone : twinkle, PLAY_ASYNCHRONOUS); + sound.play(mydata.isError ? sad_trombone : twinkle, PLAY_ASYNCHRONOUS); } void AlertDialogBox::onRedraw(draw_mode_t what) { @@ -45,7 +46,7 @@ template void AlertDialogBox::show(const T message) { drawMessage(message); storeBackground(); - screen_data.AlertDialog.isError = false; + mydata.isError = false; GOTO_SCREEN(AlertDialogBox); } @@ -53,7 +54,7 @@ template void AlertDialogBox::showError(const T message) { drawMessage(message); storeBackground(); - screen_data.AlertDialog.isError = true; + mydata.isError = true; GOTO_SCREEN(AlertDialogBox); } @@ -67,4 +68,4 @@ template void AlertDialogBox::show(const progmem_str); template void AlertDialogBox::showError(const char *); template void AlertDialogBox::showError(const progmem_str); -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_ALERT_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.h new file mode 100644 index 0000000000..0186acf7a0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.h @@ -0,0 +1,39 @@ +/********************** + * alert_dialog_box.h * + **********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_ALERT_DIALOG_BOX +#define FTDI_ALERT_DIALOG_BOX_CLASS AlertDialogBox + +struct AlertDialogBoxData { + bool isError; +}; + +class AlertDialogBox : public DialogBoxBaseClass, public CachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + template static void show(T); + template static void showError(T); + static void hide(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp index 58f4544ffc..11fb72b5a8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, BACKLASH_GCODE) - #include "screens.h" +#ifdef FTDI_BACKLASH_COMP_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -73,4 +72,4 @@ bool BacklashCompensationScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_BACKLASH_COMP_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.h new file mode 100644 index 0000000000..b9e46eb27f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.h @@ -0,0 +1,32 @@ +/********************************** + * backlash_compensation_screen.h * + **********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BACKLASH_COMP_SCREEN +#define FTDI_BACKLASH_COMP_SCREEN_CLASS BacklashCompensationScreen + +class BacklashCompensationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp index 5271df3022..3b40e7f14e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp @@ -21,15 +21,16 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_BASE_NUMERIC_ADJ_SCREEN + using namespace FTDI; using namespace Theme; +constexpr static BaseNumericAdjustmentScreenData &mydata = screen_data.BaseNumericAdjustmentScreen; + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 13 #define GRID_ROWS 10 @@ -116,8 +117,8 @@ void BaseNumericAdjustmentScreen::widgets_t::_button(CommandProcessor &cmd, uint BaseNumericAdjustmentScreen::widgets_t &BaseNumericAdjustmentScreen::widgets_t::precision(uint8_t decimals, precision_default_t initial) { _decimals = decimals; - if (screen_data.BaseNumericAdjustment.increment == 0) { - screen_data.BaseNumericAdjustment.increment = 243 + (initial - DEFAULT_LOWEST) - _decimals; + if (mydata.increment == 0) { + mydata.increment = 243 + (initial - DEFAULT_LOWEST) - _decimals; } return *this; } @@ -154,7 +155,7 @@ void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) { void BaseNumericAdjustmentScreen::widgets_t::_draw_increment_btn(CommandProcessor &cmd, uint8_t, const uint8_t tag) { const char *label = PSTR("?"); uint8_t pos; - uint8_t & increment = screen_data.BaseNumericAdjustment.increment; + uint8_t & increment = mydata.increment; if (increment == 0) { increment = tag; // Set the default value to be the first. @@ -358,7 +359,7 @@ void BaseNumericAdjustmentScreen::widgets_t::home_buttons(uint8_t tag) { } void BaseNumericAdjustmentScreen::onEntry() { - screen_data.BaseNumericAdjustment.increment = 0; // This will force the increment to be picked while drawing. + mydata.increment = 0; // This will force the increment to be picked while drawing. BaseScreen::onEntry(); CommandProcessor cmd; cmd.set_button_style_callback(nullptr); @@ -367,14 +368,14 @@ void BaseNumericAdjustmentScreen::onEntry() { bool BaseNumericAdjustmentScreen::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); return true; - case 240 ... 245: screen_data.BaseNumericAdjustment.increment = tag; break; + case 240 ... 245: mydata.increment = tag; break; default: return current_screen.onTouchHeld(tag); } return true; } float BaseNumericAdjustmentScreen::getIncrement() { - switch (screen_data.BaseNumericAdjustment.increment) { + switch (mydata.increment) { case 240: return 0.001; case 241: return 0.01; case 242: return 0.1; @@ -385,4 +386,4 @@ float BaseNumericAdjustmentScreen::getIncrement() { } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_BASE_NUMERIC_ADJ_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.h new file mode 100644 index 0000000000..c097752674 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.h @@ -0,0 +1,87 @@ +/************************************ + * base_numeric_adjustment_screen.h * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BASE_NUMERIC_ADJ_SCREEN +#define FTDI_BASE_NUMERIC_ADJ_SCREEN_CLASS BaseNumericAdjustmentScreen + +struct BaseNumericAdjustmentScreenData { + uint8_t increment; +}; + +class BaseNumericAdjustmentScreen : public BaseScreen { + public: + enum precision_default_t { + DEFAULT_LOWEST, + DEFAULT_MIDRANGE, + DEFAULT_HIGHEST + }; + + protected: + class widgets_t { + private: + draw_mode_t _what; + uint8_t _line; + uint32_t _color; + uint8_t _decimals; + progmem_str _units; + enum style_t { + BTN_NORMAL, + BTN_ACTION, + BTN_TOGGLE, + BTN_DISABLED, + TEXT_AREA, + TEXT_LABEL + } _style; + + protected: + void _draw_increment_btn(CommandProcessor &, uint8_t line, const uint8_t tag); + void _button(CommandProcessor &, uint8_t tag, int16_t x, int16_t y, int16_t w, int16_t h, progmem_str, bool enabled = true, bool highlight = false); + void _button_style(CommandProcessor &cmd, style_t style); + public: + widgets_t(draw_mode_t); + + widgets_t &color(uint32_t color) {_color = color; return *this;} + widgets_t &units(progmem_str units) {_units = units; return *this;} + widgets_t &draw_mode(draw_mode_t what) {_what = what; return *this;} + widgets_t &precision(uint8_t decimals, precision_default_t = DEFAULT_HIGHEST); + + void heading (progmem_str label); + void adjuster_sram_val (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); + void adjuster (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); + void adjuster (uint8_t tag, progmem_str label, float value=0, bool is_enabled = true); + void button (uint8_t tag, progmem_str label, bool is_enabled = true); + void text_field (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); + void two_buttons (uint8_t tag1, progmem_str label1, + uint8_t tag2, progmem_str label2, bool is_enabled = true); + void toggle (uint8_t tag, progmem_str label, bool value, bool is_enabled = true); + void home_buttons (uint8_t tag); + void increments (); + }; + + static float getIncrement(); + + public: + static void onEntry(); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp index 16b26e6821..139a3100cf 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_BASE_SCREEN + using namespace FTDI; using namespace Theme; @@ -87,4 +86,4 @@ void BaseScreen::reset_menu_timeout() { uint32_t BaseScreen::last_interaction; #endif -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_BASE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.h new file mode 100644 index 0000000000..cbeea1f750 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.h @@ -0,0 +1,43 @@ +/***************** + * base_screen.h * + *****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BASE_SCREEN +#define FTDI_BASE_SCREEN_CLASS BaseScreen + +class BaseScreen : public UIScreen { + protected: + #if LCD_TIMEOUT_TO_STATUS > 0 + static uint32_t last_interaction; + #endif + + static bool buttonIsPressed(uint8_t tag); + + public: + static bool buttonStyleCallback(CommandProcessor &, uint8_t, uint8_t &, uint16_t &, bool); + + static void reset_menu_timeout(); + + static void onEntry(); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 9fb2b20025..b62a9bf01b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -20,16 +20,17 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_MESH) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_BED_MESH_SCREEN + using namespace FTDI; using namespace Theme; using namespace ExtUI; +constexpr static BedMeshScreenData &mydata = screen_data.BedMeshScreen; + #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 2 #define GRID_ROWS 10 @@ -196,7 +197,7 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: } if (opts & USE_HIGHLIGHT) { - const uint8_t tag = screen_data.BedMesh.highlightedTag; + const uint8_t tag = mydata.highlightedTag; uint8_t x, y; if (tagToPoint(tag, x, y)) { cmd.cmd(COLOR_A(128)) @@ -221,16 +222,16 @@ bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) { } void BedMeshScreen::onEntry() { - screen_data.BedMesh.highlightedTag = 0; - screen_data.BedMesh.count = GRID_MAX_POINTS; - screen_data.BedMesh.message = screen_data.BedMesh.MSG_NONE; + mydata.highlightedTag = 0; + mydata.count = GRID_MAX_POINTS; + mydata.message = mydata.MSG_NONE; BaseScreen::onEntry(); } float BedMeshScreen::getHightlightedValue() { - if (screen_data.BedMesh.highlightedTag) { + if (mydata.highlightedTag) { xy_uint8_t pt; - tagToPoint(screen_data.BedMesh.highlightedTag, pt.x, pt.y); + tagToPoint(mydata.highlightedTag, pt.x, pt.y); return ExtUI::getMeshPoint(pt); } return NAN; @@ -253,9 +254,9 @@ void BedMeshScreen::drawHighlightedPointValue() { .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); - switch (screen_data.BedMesh.message) { - case screen_data.BedMesh.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; - case screen_data.BedMesh.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; + switch (mydata.message) { + case mydata.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; + case mydata.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; default: break; } } @@ -277,11 +278,11 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { if (what & FOREGROUND) { constexpr float autoscale_max_amplitude = 0.03; - const bool gotAllPoints = screen_data.BedMesh.count >= GRID_MAX_POINTS; + const bool gotAllPoints = mydata.count >= GRID_MAX_POINTS; if (gotAllPoints) { drawHighlightedPointValue(); } - const float levelingProgress = sq(float(screen_data.BedMesh.count) / GRID_MAX_POINTS); + const float levelingProgress = sq(float(mydata.count) / GRID_MAX_POINTS); BedMeshScreen::drawMesh(INSET_POS(MESH_POS), ExtUI::getMeshArray(), USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (gotAllPoints ? USE_COLORS : 0), autoscale_max_amplitude * levelingProgress @@ -290,7 +291,7 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { } bool BedMeshScreen::onTouchStart(uint8_t tag) { - screen_data.BedMesh.highlightedTag = tag; + mydata.highlightedTag = tag; return true; } @@ -312,21 +313,21 @@ void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { switch (state) { case ExtUI::MESH_START: - screen_data.BedMesh.count = 0; - screen_data.BedMesh.message = screen_data.BedMesh.MSG_NONE; + mydata.count = 0; + mydata.message = mydata.MSG_NONE; break; case ExtUI::MESH_FINISH: - if (screen_data.BedMesh.count == GRID_MAX_POINTS && ExtUI::getMeshValid()) - screen_data.BedMesh.message = screen_data.BedMesh.MSG_MESH_COMPLETE; + if (mydata.count == GRID_MAX_POINTS && ExtUI::getMeshValid()) + mydata.message = mydata.MSG_MESH_COMPLETE; else - screen_data.BedMesh.message = screen_data.BedMesh.MSG_MESH_INCOMPLETE; - screen_data.BedMesh.count = GRID_MAX_POINTS; + mydata.message = mydata.MSG_MESH_INCOMPLETE; + mydata.count = GRID_MAX_POINTS; break; case ExtUI::PROBE_START: - screen_data.BedMesh.highlightedTag = pointToTag(x, y); + mydata.highlightedTag = pointToTag(x, y); break; case ExtUI::PROBE_FINISH: - screen_data.BedMesh.count++; + mydata.count++; break; } BedMeshScreen::onMeshUpdate(x, y, 0); @@ -334,8 +335,8 @@ void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::pr void BedMeshScreen::startMeshProbe() { GOTO_SCREEN(BedMeshScreen); - screen_data.BedMesh.count = 0; + mydata.count = 0; injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); } -#endif // TOUCH_UI_FTDI_EVE && HAS_MESH +#endif // FTDI_BED_MESH_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h new file mode 100644 index 0000000000..7aac484cb6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h @@ -0,0 +1,62 @@ +/********************* + * bed_mesh_screen.h * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BED_MESH_SCREEN +#define FTDI_BED_MESH_SCREEN_CLASS BedMeshScreen + +struct BedMeshScreenData { + enum : uint8_t { + MSG_NONE, + MSG_MESH_COMPLETE, + MSG_MESH_INCOMPLETE + } message; + uint8_t count; + uint8_t highlightedTag; +}; + +class BedMeshScreen : public BaseScreen, public CachedScreen { + private: + enum MeshOpts { + USE_POINTS = 0x01, + USE_COLORS = 0x02, + USE_TAGS = 0x04, + USE_HIGHLIGHT = 0x08, + USE_AUTOSCALE = 0x10 + }; + + static uint8_t pointToTag(uint8_t x, uint8_t y); + static bool tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y); + static float getHightlightedValue(); + static void drawHighlightedPointValue(); + static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); + + public: + static void onMeshUpdate(const int8_t x, const int8_t y, const float val); + static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + + static void startMeshProbe(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp index cabcd5ded7..16b2891e27 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) - #include "screens.h" +#ifdef FTDI_BIO_ADVANCED_SETTINGS_MENU + using namespace FTDI; using namespace Theme; @@ -134,4 +133,4 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO +#endif // FTDI_BIO_ADVANCED_SETTINGS_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.h new file mode 100644 index 0000000000..29a21fe5d9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.h @@ -0,0 +1,32 @@ +/*************************** + * bio_advanced_settings.h * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BIO_ADVANCED_SETTINGS_MENU +#define FTDI_BIO_ADVANCED_SETTINGS_MENU_CLASS AdvancedSettingsMenu + +class AdvancedSettingsMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp index 3f6b4116f1..3b55551375 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) - #include "screens.h" +#ifdef FTDI_BIO_CONFIRM_HOME_E + using namespace FTDI; void BioConfirmHomeE::onRedraw(draw_mode_t) { @@ -54,4 +53,4 @@ bool BioConfirmHomeE::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO +#endif // FTDI_BIO_CONFIRM_HOME_E diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.h new file mode 100644 index 0000000000..151b784b93 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.h @@ -0,0 +1,32 @@ +/**************************** + * bio_confirm_home_e.h * + ****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BIO_CONFIRM_HOME_E +#define FTDI_BIO_CONFIRM_HOME_E_CLASS BioConfirmHomeE + +class BioConfirmHomeE : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp index f712fdfff9..f1abd2e76a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) - #include "screens.h" +#ifdef FTDI_BIO_CONFIRM_HOME_XYZ + using namespace FTDI; void BioConfirmHomeXYZ::onRedraw(draw_mode_t) { @@ -53,4 +52,4 @@ bool BioConfirmHomeXYZ::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO +#endif // FTDI_BIO_CONFIRM_HOME_XYZ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.h new file mode 100644 index 0000000000..d8cb1cdb67 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.h @@ -0,0 +1,32 @@ +/************************** + * bio_confirm_home_xyz.h * + **************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BIO_CONFIRM_HOME_XYZ +#define FTDI_BIO_CONFIRM_HOME_XYZ_CLASS BioConfirmHomeXYZ + +class BioConfirmHomeXYZ : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp index 53203cd35e..6897ceb914 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) - #include "screens.h" +#ifdef FTDI_BIO_MAIN_MENU + using namespace FTDI; using namespace Theme; @@ -85,4 +84,4 @@ bool MainMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO +#endif // FTDI_BIO_MAIN_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.h new file mode 100644 index 0000000000..fdf977fcbf --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.h @@ -0,0 +1,32 @@ +/********************* + * bio_main_menu.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BIO_MAIN_MENU +#define FTDI_BIO_MAIN_MENU_CLASS MainMenu + +class MainMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index fb8dc3edf3..7f81d49a27 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) - #include "screens.h" +#ifdef FTDI_BIO_PRINTING_DIALOG_BOX + #include "../ftdi_eve_lib/extras/circular_progress.h" using namespace FTDI; @@ -147,4 +146,4 @@ void BioPrintingDialogBox::show() { GOTO_SCREEN(BioPrintingDialogBox); } -#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO +#endif // FTDI_BIO_PRINTING_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.h new file mode 100644 index 0000000000..aebbd16128 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.h @@ -0,0 +1,44 @@ +/***************************** + * bio_printing_dialog_box.h * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BIO_PRINTING_DIALOG_BOX +#define FTDI_BIO_PRINTING_DIALOG_BOX_CLASS BioPrintingDialogBox + +class BioPrintingDialogBox : public BaseScreen, public CachedScreen { + private: + static void draw_status_message(draw_mode_t, const char * const); + static void draw_progress(draw_mode_t); + static void draw_time_remaining(draw_mode_t); + static void draw_interaction_buttons(draw_mode_t); + public: + static void onRedraw(draw_mode_t); + + static void show(); + + static void setStatusMessage(const char *); + static void setStatusMessage(progmem_str); + + static void onIdle(); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index 90d8d6251d..f2bb5f3d3c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -22,11 +22,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) - #include "screens.h" +#ifdef FTDI_BIO_STATUS_SCREEN + #include "../ftdi_eve_lib/extras/poly_ui.h" #if ENABLED(TOUCH_UI_PORTRAIT) @@ -376,4 +375,4 @@ void StatusScreen::onIdle() { } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_BIO_STATUS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.h new file mode 100644 index 0000000000..a3bbb60f6c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.h @@ -0,0 +1,56 @@ +/************************* + * bio_status_screen.cpp * + *************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BIO_STATUS_SCREEN +#define FTDI_BIO_STATUS_SCREEN_CLASS StatusScreen + +class StatusScreen : public BaseScreen, public CachedScreen { + private: + static float increment; + static bool jog_xy; + static bool fine_motion; + + static void draw_progress(draw_mode_t what); + static void draw_temperature(draw_mode_t what); + static void draw_syringe(draw_mode_t what); + static void draw_arrows(draw_mode_t what); + static void draw_overlay_icons(draw_mode_t what); + static void draw_fine_motion(draw_mode_t what); + static void draw_buttons(draw_mode_t what); + public: + static void loadBitmaps(); + static void unlockMotors(); + + static void setStatusMessage(const char *); + static void setStatusMessage(progmem_str); + + static void onRedraw(draw_mode_t); + + static bool onTouchStart(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); + +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp index dacc1cb6ea..806f7bd1af 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_LULZBOT_BIO) - #include "screens.h" +#ifdef FTDI_BIO_TUNE_MENU + using namespace FTDI; using namespace Theme; using namespace ExtUI; @@ -76,4 +75,4 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_LULZBOT_BIO +#endif // FTDI_BIO_TUNE_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.h new file mode 100644 index 0000000000..52fe694f37 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.h @@ -0,0 +1,35 @@ +/******************* + * bio_tune_menu.h * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BIO_TUNE_MENU +#define FTDI_BIO_TUNE_MENU_CLASS TuneMenu + +class TuneMenu : public BaseScreen, public CachedScreen { + private: + static void pausePrint(); + static void resumePrint(); + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp index a6a8705350..236830dbc4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -22,11 +22,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_BOOT_SCREEN + #include "../ftdi_eve_lib/extras/poly_ui.h" #include "../archim2-flash/flash_storage.h" @@ -127,4 +126,4 @@ void BootScreen::showSplashScreen() { ExtUI::delay_ms(2500); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_BOOT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.h new file mode 100644 index 0000000000..a267faba6a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.h @@ -0,0 +1,35 @@ +/***************** + * boot_screen.h * + *****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BOOT_SCREEN +#define FTDI_BOOT_SCREEN_CLASS BootScreen + +class BootScreen : public BaseScreen, public UncachedScreen { + private: + static void showSplashScreen(); + public: + static void onRedraw(draw_mode_t); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp index 5b2b7d4116..04327128ab 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp @@ -20,11 +20,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, CASE_LIGHT_ENABLE) - #include "screens.h" +#ifdef FTDI_CASE_LIGHT_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -59,4 +58,4 @@ bool CaseLightScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_CASE_LIGHT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.h new file mode 100644 index 0000000000..55d5fe902f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.h @@ -0,0 +1,31 @@ +/*********************** + * case_light_screen.h * + ***********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_CASE_LIGHT_SCREEN +#define FTDI_CASE_LIGHT_SCREEN_CLASS CaseLightScreen + +class CaseLightScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index 624bb263eb..e9fa8a66d4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -21,16 +21,17 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_CHANGE_FILAMENT_SCREEN + using namespace ExtUI; using namespace FTDI; using namespace Theme; +constexpr static ChangeFilamentScreenData &mydata = screen_data.ChangeFilamentScreen; + #ifdef TOUCH_UI_PORTRAIT #define GRID_COLS 2 #define GRID_ROWS 11 @@ -122,17 +123,17 @@ void ChangeFilamentScreen::drawTempGradient(uint16_t x, uint16_t y, uint16_t w, void ChangeFilamentScreen::onEntry() { BaseScreen::onEntry(); - screen_data.ChangeFilament.e_tag = ExtUI::getActiveTool() + 10; - screen_data.ChangeFilament.t_tag = 0; - screen_data.ChangeFilament.repeat_tag = 0; - screen_data.ChangeFilament.saved_extruder = getActiveTool(); + mydata.e_tag = ExtUI::getActiveTool() + 10; + mydata.t_tag = 0; + mydata.repeat_tag = 0; + mydata.saved_extruder = getActiveTool(); #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - screen_data.ChangeFilament.need_purge = true; + mydata.need_purge = true; #endif } void ChangeFilamentScreen::onExit() { - setActiveTool(screen_data.ChangeFilament.saved_extruder, true); + setActiveTool(mydata.saved_extruder, true); } void ChangeFilamentScreen::onRedraw(draw_mode_t what) { @@ -170,7 +171,7 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { const bool t_ok = getActualTemp_celsius(e) > getSoftenTemp() - 10; - if (screen_data.ChangeFilament.t_tag && !t_ok) { + if (mydata.t_tag && !t_ok) { cmd.text(HEATING_LBL_POS, GET_TEXT_F(MSG_HEATING)); } else if (getActualTemp_celsius(e) > 100) { cmd.cmd(COLOR_RGB(0xFF0000)) @@ -181,12 +182,12 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { #define TOG_STYLE(A) colors(A ? action_btn : normal_btn) - const bool tog2 = screen_data.ChangeFilament.t_tag == 2; - const bool tog3 = screen_data.ChangeFilament.t_tag == 3; - const bool tog4 = screen_data.ChangeFilament.t_tag == 4; - const bool tog10 = screen_data.ChangeFilament.e_tag == 10; + const bool tog2 = mydata.t_tag == 2; + const bool tog3 = mydata.t_tag == 3; + const bool tog4 = mydata.t_tag == 4; + const bool tog10 = mydata.e_tag == 10; #if HAS_MULTI_HOTEND - const bool tog11 = screen_data.ChangeFilament.e_tag == 11; + const bool tog11 = mydata.e_tag == 11; #endif cmd.TOG_STYLE(tog10) @@ -200,8 +201,8 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { if (!t_ok) reset_menu_timeout(); - const bool tog7 = screen_data.ChangeFilament.repeat_tag == 7; - const bool tog8 = screen_data.ChangeFilament.repeat_tag == 8; + const bool tog7 = mydata.repeat_tag == 7; + const bool tog8 = mydata.repeat_tag == 8; { char str[30]; @@ -228,7 +229,7 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { } uint8_t ChangeFilamentScreen::getSoftenTemp() { - switch (screen_data.ChangeFilament.t_tag) { + switch (mydata.t_tag) { case 2: return LOW_TEMP; case 3: return MED_TEMP; case 4: return HIGH_TEMP; @@ -237,7 +238,7 @@ uint8_t ChangeFilamentScreen::getSoftenTemp() { } ExtUI::extruder_t ChangeFilamentScreen::getExtruder() { - switch (screen_data.ChangeFilament.e_tag) { + switch (mydata.e_tag) { case 13: return ExtUI::E3; case 12: return ExtUI::E2; case 11: return ExtUI::E1; @@ -248,8 +249,8 @@ ExtUI::extruder_t ChangeFilamentScreen::getExtruder() { void ChangeFilamentScreen::doPurge() { #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 constexpr float purge_distance_mm = FILAMENT_UNLOAD_PURGE_LENGTH; - if (screen_data.ChangeFilament.need_purge) { - screen_data.ChangeFilament.need_purge = false; + if (mydata.need_purge) { + mydata.need_purge = false; MoveAxisScreen::setManualFeedrate(getExtruder(), purge_distance_mm); ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(getExtruder()) + purge_distance_mm, getExtruder()); } @@ -277,23 +278,23 @@ bool ChangeFilamentScreen::onTouchEnd(uint8_t tag) { case 3: case 4: // Change temperature - screen_data.ChangeFilament.t_tag = tag; + mydata.t_tag = tag; setTargetTemp_celsius(getSoftenTemp(), getExtruder()); break; case 7: - screen_data.ChangeFilament.repeat_tag = (screen_data.ChangeFilament.repeat_tag == 7) ? 0 : 7; + mydata.repeat_tag = (mydata.repeat_tag == 7) ? 0 : 7; break; case 8: - screen_data.ChangeFilament.repeat_tag = (screen_data.ChangeFilament.repeat_tag == 8) ? 0 : 8; + mydata.repeat_tag = (mydata.repeat_tag == 8) ? 0 : 8; break; case 10: case 11: // Change extruder - screen_data.ChangeFilament.e_tag = tag; - screen_data.ChangeFilament.t_tag = 0; - screen_data.ChangeFilament.repeat_tag = 0; + mydata.e_tag = tag; + mydata.t_tag = 0; + mydata.repeat_tag = 0; #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - screen_data.ChangeFilament.need_purge = true; + mydata.need_purge = true; #endif setActiveTool(getExtruder(), true); break; @@ -319,7 +320,7 @@ bool ChangeFilamentScreen::onTouchHeld(uint8_t tag) { void ChangeFilamentScreen::onIdle() { reset_menu_timeout(); - if (screen_data.ChangeFilament.repeat_tag) onTouchHeld(screen_data.ChangeFilament.repeat_tag); + if (mydata.repeat_tag) onTouchHeld(mydata.repeat_tag); if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { onRefresh(); refresh_timer.start(); @@ -327,4 +328,4 @@ void ChangeFilamentScreen::onIdle() { BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_CHANGE_FILAMENT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.h new file mode 100644 index 0000000000..43a4bae6e0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.h @@ -0,0 +1,51 @@ +/**************************** + * change_filament_screen.h * + ****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_CHANGE_FILAMENT_SCREEN +#define FTDI_CHANGE_FILAMENT_SCREEN_CLASS ChangeFilamentScreen + +struct ChangeFilamentScreenData { + uint8_t e_tag, t_tag, repeat_tag; + ExtUI::extruder_t saved_extruder; + #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 + bool need_purge; + #endif +}; + +class ChangeFilamentScreen : public BaseScreen, public CachedScreen { + private: + static uint8_t getSoftenTemp(); + static ExtUI::extruder_t getExtruder(); + static void drawTempGradient(uint16_t x, uint16_t y, uint16_t w, uint16_t h); + static uint32_t getTempColor(uint32_t temp); + static void doPurge(); + public: + static void onEntry(); + static void onExit(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp index 656bf1db13..8d5a3d793a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) - #include "screens.h" +#ifdef FTDI_COCOA_ADVANCED_SETTINGS_MENU + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -99,4 +98,4 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { } return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_ADVANCED_SETTINGS_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.h new file mode 100644 index 0000000000..08c0745321 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.h @@ -0,0 +1,32 @@ +/*************************************** + * cocoa_press_advance_settings_menu.h * + ***************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_ADVANCED_SETTINGS_MENU +#define FTDI_COCOA_ADVANCED_SETTINGS_MENU_CLASS AdvancedSettingsMenu + +class AdvancedSettingsMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp index 36dc3404b9..23ad1b5da6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp @@ -22,12 +22,11 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && ENABLED(TOUCH_UI_COCOA_PRESS) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_COCOA_LOAD_CHOCOLATE_SCREEN + using namespace ExtUI; using namespace FTDI; using namespace Theme; @@ -98,4 +97,4 @@ bool LoadChocolateScreen::onTouchHeld(uint8_t tag) { return false; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_LOAD_CHOCOLATE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h new file mode 100644 index 0000000000..262a6c9802 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h @@ -0,0 +1,34 @@ +/******************************** + * cocoa_press_load_chocolate.h * + ********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2020 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_LOAD_CHOCOLATE_SCREEN +#define FTDI_COCOA_LOAD_CHOCOLATE_SCREEN_CLASS LoadChocolateScreen + +class LoadChocolateScreen : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp index 9c8ad062aa..56981e3084 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp @@ -22,11 +22,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) - #include "screens.h" +#ifdef FTDI_COCOA_MAIN_MENU + using namespace FTDI; using namespace Theme; @@ -86,4 +85,4 @@ bool MainMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_MAIN_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.h new file mode 100644 index 0000000000..7c2bb5039a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.h @@ -0,0 +1,33 @@ +/*************************** + * cocoa_press_main_menu.h * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_MAIN_MENU +#define FTDI_COCOA_MAIN_MENU_CLASS MainMenu + +class MainMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp index 61411afa1b..10660736fa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp @@ -22,12 +22,11 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_COCOA_MOVE_E_SCREEN + using namespace FTDI; using namespace ExtUI; @@ -59,4 +58,4 @@ void MoveEScreen::onIdle() { } BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_MOVE_E_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.h new file mode 100644 index 0000000000..e86a91a529 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.h @@ -0,0 +1,33 @@ +/******************************* + * cocoa_press_move_e_screen.h * + *******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_MOVE_E_SCREEN +#define FTDI_COCOA_MOVE_E_SCREEN_CLASS MoveEScreen + +class MoveEScreen : public BaseMoveAxisScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp index 52a70448cd..c9442c9322 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.cpp @@ -1,6 +1,6 @@ -/************************************ +/*********************************** * cocoa_press_move_xyz_screen.cpp * - ************************************/ + ***********************************/ /**************************************************************************** * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * @@ -22,12 +22,11 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_COCOA_MOVE_XYZ_SCREEN + using namespace FTDI; using namespace ExtUI; @@ -50,4 +49,4 @@ void MoveXYZScreen::onIdle() { } BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_MOVE_XYZ_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.h new file mode 100644 index 0000000000..9cbec113e6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_xyz_screen.h @@ -0,0 +1,33 @@ +/********************************* + * cocoa_press_move_xyz_screen.h * + *********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_MOVE_XYZ_SCREEN +#define FTDI_COCOA_MOVE_XYZ_SCREEN_CLASS MoveXYZScreen + +class MoveXYZScreen : public BaseMoveAxisScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp index 99c0c1b664..d515b2a27b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp @@ -20,11 +20,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) - #include "screens.h" +#ifdef FTDI_COCOA_PREHEAT_MENU + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -110,4 +109,4 @@ bool PreheatMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_PREHEAT_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.h new file mode 100644 index 0000000000..a109e42111 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.h @@ -0,0 +1,31 @@ +/****************************** + * cocoa_press_preheat_menu.h * + ******************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_PREHEAT_MENU +#define FTDI_COCOA_PREHEAT_MENU_CLASS PreheatMenu + +class PreheatMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp index c9caef6524..abea9dcdfe 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp @@ -20,18 +20,19 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_COCOA_PREHEAT_SCREEN + #include "../ftdi_eve_lib/extras/circular_progress.h" using namespace FTDI; using namespace ExtUI; using namespace Theme; +constexpr static PreheatTimerScreenData &mydata = screen_data.PreheatTimerScreen; + #define GRID_COLS 2 #define GRID_ROWS 8 @@ -54,7 +55,7 @@ void PreheatTimerScreen::draw_message(draw_mode_t what) { } uint16_t PreheatTimerScreen::secondsRemaining() { - const uint32_t elapsed_sec = (millis() - screen_data.PreheatTimer.start_ms) / 1000; + const uint32_t elapsed_sec = (millis() - mydata.start_ms) / 1000; return (COCOA_PRESS_PREHEAT_SECONDS > elapsed_sec) ? COCOA_PRESS_PREHEAT_SECONDS - elapsed_sec : 0; } @@ -118,7 +119,7 @@ void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, progmem_st } void PreheatTimerScreen::onEntry() { - screen_data.PreheatTimer.start_ms = millis(); + mydata.start_ms = millis(); } void PreheatTimerScreen::onRedraw(draw_mode_t what) { @@ -169,4 +170,4 @@ void PreheatTimerScreen::onIdle() { BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_PREHEAT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.h new file mode 100644 index 0000000000..e91340a3aa --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.h @@ -0,0 +1,46 @@ +/********************************* + * cocoapress_preheat_screen.cpp * + *********************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_PREHEAT_SCREEN +#define FTDI_COCOA_PREHEAT_SCREEN_CLASS PreheatTimerScreen + +struct PreheatTimerScreenData { + uint32_t start_ms; +}; + +class PreheatTimerScreen : public BaseScreen, public CachedScreen { + private: + static uint16_t secondsRemaining(); + + static void draw_message(draw_mode_t); + static void draw_time_remaining(draw_mode_t); + static void draw_interaction_buttons(draw_mode_t); + static void draw_adjuster(draw_mode_t, uint8_t tag, progmem_str label, float value, int16_t x, int16_t y, int16_t w, int16_t h); + public: + static void onRedraw(draw_mode_t); + + static void onEntry(); + static void onIdle(); + static bool onTouchHeld(uint8_t tag); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp index d9881d747a..f7d44e2936 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -22,11 +22,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_COCOA_PRESS) - #include "screens.h" +#ifdef FTDI_COCOA_STATUS_SCREEN + #include "../ftdi_eve_lib/extras/poly_ui.h" #include "cocoa_press_ui.h" @@ -304,4 +303,4 @@ void StatusScreen::onIdle() { } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_STATUS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.h new file mode 100644 index 0000000000..b22bceac14 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.h @@ -0,0 +1,55 @@ +/******************************* + * cocoa_press_status_screen.h * + *******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_STATUS_SCREEN +#define FTDI_COCOA_STATUS_SCREEN_CLASS StatusScreen + +class StatusScreen : public BaseScreen, public CachedScreen { + private: + static float increment; + static bool jog_xy; + static bool fine_motion; + + static void draw_progress(draw_mode_t what); + static void draw_temperature(draw_mode_t what); + static void draw_syringe(draw_mode_t what); + static void draw_arrows(draw_mode_t what); + static void draw_overlay_icons(draw_mode_t what); + static void draw_fine_motion(draw_mode_t what); + static void draw_buttons(draw_mode_t what); + public: + static void loadBitmaps(); + static void unlockMotors(); + + static void setStatusMessage(const char *); + static void setStatusMessage(progmem_str); + + static void onRedraw(draw_mode_t); + + static bool onTouchStart(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp index 2e71093370..3428c38bb1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.cpp @@ -22,12 +22,11 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && ENABLED(TOUCH_UI_COCOA_PRESS) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN + using namespace ExtUI; using namespace FTDI; using namespace Theme; @@ -98,4 +97,4 @@ bool UnloadCartridgeScreen::onTouchHeld(uint8_t tag) { return false; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.h new file mode 100644 index 0000000000..95a9ee47ec --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_unload_cartridge.h @@ -0,0 +1,34 @@ +/********************************** + * cocoa_press_unload_cartridge.h * + **********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2020 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN +#define FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN_CLASS UnloadCartridgeScreen + +class UnloadCartridgeScreen : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp index 528d93d5d1..dba565189a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_CONFIRM_ABORT_PRINT_DIALOG_BOX + #include "../../../../../feature/host_actions.h" using namespace ExtUI; @@ -50,4 +49,4 @@ bool ConfirmAbortPrintDialogBox::onTouchEnd(uint8_t tag) { } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_CONFIRM_ABORT_PRINT_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.h new file mode 100644 index 0000000000..a97a2000a0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.h @@ -0,0 +1,32 @@ +/************************************ + * confirm_abort_print_dialog_box.h * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_CONFIRM_ABORT_PRINT_DIALOG_BOX +#define FTDI_CONFIRM_ABORT_PRINT_DIALOG_BOX_CLASS ConfirmAbortPrintDialogBox + +class ConfirmAbortPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp index f7c85672af..65b5140ccb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, CALIBRATION_GCODE) - #include "screens.h" +#ifdef FTDI_CONFIRM_AUTO_CALIBRATION_DIALOG_BOX + using namespace ExtUI; using namespace Theme; @@ -45,4 +44,4 @@ bool ConfirmAutoCalibrationDialogBox::onTouchEnd(uint8_t tag) { } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_CONFIRM_AUTO_CALIBRATION_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.h new file mode 100644 index 0000000000..5093b68c73 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.h @@ -0,0 +1,32 @@ +/***************************************** + * confirm_auto_calibration_dialog_box.h * + *****************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_CONFIRM_AUTO_CALIBRATION_DIALOG_BOX +#define FTDI_CONFIRM_AUTO_CALIBRATION_DIALOG_BOX_CLASS ConfirmAutoCalibrationDialogBox + +class ConfirmAutoCalibrationDialogBox : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp index baf5959c1b..13d61005e8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - #include "screens.h" +#ifdef FTDI_CONFIRM_ERASE_FLASH_DIALOG_BOX + #include "../archim2-flash/flash_storage.h" using namespace FTDI; @@ -51,4 +50,4 @@ bool ConfirmEraseFlashDialogBox::onTouchEnd(uint8_t tag) { } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_CONFIRM_ERASE_FLASH_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.h new file mode 100644 index 0000000000..a06f886176 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.h @@ -0,0 +1,32 @@ +/************************************ + * confirm_erase_flash_dialog_box.h * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_CONFIRM_ERASE_FLASH_DIALOG_BOX +#define FTDI_CONFIRM_ERASE_FLASH_DIALOG_BOX_CLASS ConfirmEraseFlashDialogBox + +class ConfirmEraseFlashDialogBox : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp index eeca88f280..86e7e33035 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp @@ -21,16 +21,17 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_CONFIRM_START_PRINT_DIALOG_BOX + using namespace FTDI; using namespace Theme; using namespace ExtUI; +constexpr static ConfirmStartPrintDialogBoxData &mydata = screen_data.ConfirmStartPrintDialogBox; + void ConfirmStartPrintDialogBox::onRedraw(draw_mode_t) { const char *filename = getLongFilename(); char buffer[strlen_P(GET_TEXT(MSG_START_PRINT_CONFIRMATION)) + strlen(filename) + 1]; @@ -53,13 +54,13 @@ bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) { const char *ConfirmStartPrintDialogBox::getFilename(bool longName) { FileList files; - files.seek(screen_data.ConfirmStartPrintDialog.file_index, true); + files.seek(mydata.file_index, true); return longName ? files.longFilename() : files.shortFilename(); } void ConfirmStartPrintDialogBox::show(uint8_t file_index) { - screen_data.ConfirmStartPrintDialog.file_index = file_index; + mydata.file_index = file_index; GOTO_SCREEN(ConfirmStartPrintDialogBox); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_CONFIRM_START_PRINT_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.h new file mode 100644 index 0000000000..e073ed55fa --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.h @@ -0,0 +1,43 @@ +/************************************ + * confirm_start_print_dialog_box.h * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_CONFIRM_START_PRINT_DIALOG_BOX +#define FTDI_CONFIRM_START_PRINT_DIALOG_BOX_CLASS ConfirmStartPrintDialogBox + +struct ConfirmStartPrintDialogBoxData { + uint8_t file_index; +}; + +class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { + private: + inline static const char *getShortFilename() {return getFilename(false);} + inline static const char *getLongFilename() {return getFilename(true);} + + static const char *getFilename(bool longName); + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t); + + static void show(uint8_t file_index); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index 59e1c8220d..957c95f047 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -21,12 +21,11 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_CONFIRM_USER_REQUEST_ALERT_BOX + using namespace FTDI; void ConfirmUserRequestAlertBox::onRedraw(draw_mode_t mode) { @@ -54,7 +53,7 @@ bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { void ConfirmUserRequestAlertBox::show(const char* msg) { drawMessage(msg); storeBackground(); - screen_data.AlertDialog.isError = false; + screen_data.AlertDialogBox.isError = false; GOTO_SCREEN(ConfirmUserRequestAlertBox); } @@ -63,4 +62,4 @@ void ConfirmUserRequestAlertBox::hide() { GOTO_PREVIOUS(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_CONFIRM_USER_REQUEST_ALERT_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.h new file mode 100644 index 0000000000..d9a6c4a4fe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.h @@ -0,0 +1,35 @@ +/************************************ + * confirm_user_request_alert_box.h * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_CONFIRM_USER_REQUEST_ALERT_BOX +#define FTDI_CONFIRM_USER_REQUEST_ALERT_BOX_CLASS ConfirmUserRequestAlertBox + +class ConfirmUserRequestAlertBox : public AlertDialogBox { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t); + static void hide(); + static void show(const char*); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp index 20f90d5a41..9c7c12e10b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp @@ -21,11 +21,10 @@ */ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, CUSTOM_USER_MENUS) && NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) - #include "screens.h" +#ifdef FTDI_CUSTOM_USER_MENUS + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -212,4 +211,4 @@ bool CustomUserMenus::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && CUSTOM_USER_MENUS && !TOUCH_UI_LULZBOT_BIO && !TOUCH_UI_COCOA_PRESS +#endif // FTDI_CUSTOM_USER_MENUS diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.h new file mode 100644 index 0000000000..e46a280369 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.h @@ -0,0 +1,32 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#define FTDI_CUSTOM_USER_MENUS +#define FTDI_CUSTOM_USER_MENUS_CLASS CustomUserMenus + +class CustomUserMenus : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp index de617d4374..6178228d09 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_DEFAULT_ACCELERATION_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -60,4 +59,4 @@ bool DefaultAccelerationScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_DEFAULT_ACCELERATION_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.h new file mode 100644 index 0000000000..9042f6d2b8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.h @@ -0,0 +1,32 @@ +/********************************* + * default_acceleration_screen.h * + *********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_DEFAULT_ACCELERATION_SCREEN +#define FTDI_DEFAULT_ACCELERATION_SCREEN_CLASS DefaultAccelerationScreen + +class DefaultAccelerationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp index 9df060a6c4..0bbce08a2b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - #include "screens.h" +#ifdef FTDI_DEVELOPER_MENU + #include "../archim2-flash/flash_storage.h" using namespace FTDI; @@ -147,4 +146,4 @@ bool DeveloperMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_DEVELOPER_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.h new file mode 100644 index 0000000000..8757248329 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.h @@ -0,0 +1,32 @@ +/******************** + * developer_menu.h * + ********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_DEVELOPER_MENU +#define FTDI_DEVELOPER_MENU_CLASS DeveloperMenu + +class DeveloperMenu : public BaseScreen, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp index 6fe7be492d..feaebb77be 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_DIALOG_BOX_BASE_CLASS + using namespace FTDI; using namespace Theme; @@ -84,4 +83,4 @@ void DialogBoxBaseClass::onIdle() { reset_menu_timeout(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_DIALOG_BOX_BASE_CLASS diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.h new file mode 100644 index 0000000000..ef5e6b569b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.h @@ -0,0 +1,40 @@ +/*************************** + * dialog_box_base_class.h * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_DIALOG_BOX_BASE_CLASS +#define FTDI_DIALOG_BOX_BASE_CLASS_CLASS DialogBoxBaseClass + +class DialogBoxBaseClass : public BaseScreen { + protected: + template static void drawMessage(const T, int16_t font = 0); + static void drawYesNoButtons(uint8_t default_btn = 0); + static void drawOkayButton(); + static void drawSpinner(); + static void drawButton(const progmem_str); + + static void onRedraw(draw_mode_t) {}; + public: + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp index 1a4d9fd705..62a329e907 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_DISPLAY_TUNING_SCREEN + using namespace FTDI; using namespace Theme; @@ -58,4 +57,4 @@ bool DisplayTuningScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_DISPLAY_TUNING_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.h new file mode 100644 index 0000000000..3de840b82e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.h @@ -0,0 +1,32 @@ +/*************************** + * display_tuning_screen.h * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_DISPLAY_TUNING_SCREEN +#define FTDI_DISPLAY_TUNING_SCREEN_CLASS DisplayTuningScreen + +class DisplayTuningScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp index a091197a87..3648321dce 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_ENDSTOP_STATE_SCREEN + using namespace FTDI; using namespace Theme; using namespace ExtUI; @@ -149,4 +148,4 @@ void EndstopStatesScreen::onIdle() { BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_ENDSTOP_STATE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.h new file mode 100644 index 0000000000..c0eaccbe01 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.h @@ -0,0 +1,35 @@ +/************************** + * endstop_state_screen.h * + **************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_ENDSTOP_STATE_SCREEN +#define FTDI_ENDSTOP_STATE_SCREEN_CLASS EndstopStatesScreen + +class EndstopStatesScreen : public BaseScreen, public UncachedScreen { + public: + static void onEntry(); + static void onExit(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp index 28f0e6a731..8b3984aa01 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_FEEDRATE_PERCENT_SCREEN + using namespace FTDI; using namespace ExtUI; @@ -49,4 +48,4 @@ bool FeedratePercentScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_FEEDRATE_PERCENT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.h new file mode 100644 index 0000000000..076cfe97ca --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.h @@ -0,0 +1,32 @@ +/***************************** + * feedrate_percent_screen.h * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_FEEDRATE_PERCENT_SCREEN +#define FTDI_FEEDRATE_PERCENT_SCREEN_CLASS FeedratePercentScreen + +class FeedratePercentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp index f63fc416dd..cf63a1a124 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - #include "screens.h" +#ifdef FTDI_FILAMENT_MENU + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -82,4 +81,4 @@ bool FilamentMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_FILAMENT_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.h new file mode 100644 index 0000000000..73ceec29a5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.h @@ -0,0 +1,32 @@ +/******************* + * filament_menu.h * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_FILAMENT_MENU +#define FTDI_FILAMENT_MENU_CLASS FilamentMenu + +class FilamentMenu : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp index 41e3be22ef..069686b541 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, FILAMENT_RUNOUT_SENSOR) - #include "screens.h" +#ifdef FTDI_FILAMENT_RUNOUT_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -62,4 +61,4 @@ bool FilamentRunoutScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_FILAMENT_RUNOUT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.h new file mode 100644 index 0000000000..ebe7d020cb --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.h @@ -0,0 +1,32 @@ +/**************************** + * filament_runout_screen.h * + ****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_FILAMENT_RUNOUT_SCREEN +#define FTDI_FILAMENT_RUNOUT_SCREEN_CLASS FilamentRunoutScreen + +class FilamentRunoutScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index cadc582267..c8febfd7d8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -21,19 +21,20 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, SDSUPPORT) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_FILES_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; +constexpr static FilesScreenData &mydata = screen_data.FilesScreen; + void FilesScreen::onEntry() { - screen_data.Files.cur_page = 0; - screen_data.Files.selected_tag = 0xFF; + mydata.cur_page = 0; + mydata.selected_tag = 0xFF; #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) CLCD::mem_write_32(CLCD::REG::MACRO_0,DL::NOP); #endif @@ -50,21 +51,21 @@ const char *FilesScreen::getSelectedFilename(bool longName) { void FilesScreen::drawSelectedFile() { FileList files; files.seek(getSelectedFileIndex(), true); - screen_data.Files.flags.is_dir = files.isDir(); + mydata.flags.is_dir = files.isDir(); drawFileButton( files.filename(), - screen_data.Files.selected_tag, - screen_data.Files.flags.is_dir, + mydata.selected_tag, + mydata.flags.is_dir, true ); } uint16_t FilesScreen::getSelectedFileIndex() { - return getFileForTag(screen_data.Files.selected_tag); + return getFileForTag(mydata.selected_tag); } uint16_t FilesScreen::getFileForTag(uint8_t tag) { - return screen_data.Files.cur_page * files_per_page + tag - 2; + return mydata.cur_page * files_per_page + tag - 2; } #if ENABLED(TOUCH_UI_PORTRAIT) @@ -106,15 +107,15 @@ void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, void FilesScreen::drawFileList() { FileList files; - screen_data.Files.num_page = max(1,ceil(float(files.count()) / files_per_page)); - screen_data.Files.cur_page = min(screen_data.Files.cur_page, screen_data.Files.num_page-1); - screen_data.Files.flags.is_root = files.isAtRootDir(); + mydata.num_page = max(1,ceil(float(files.count()) / files_per_page)); + mydata.cur_page = min(mydata.cur_page, mydata.num_page-1); + mydata.flags.is_root = files.isAtRootDir(); #undef MARGIN_T #undef MARGIN_B #define MARGIN_T 0 #define MARGIN_B 0 - uint16_t fileIndex = screen_data.Files.cur_page * files_per_page; + uint16_t fileIndex = mydata.cur_page * files_per_page; for (uint8_t i = 0; i < files_per_page; i++, fileIndex++) { if (files.seek(fileIndex)) { drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false); @@ -126,8 +127,8 @@ void FilesScreen::drawFileList() { } void FilesScreen::drawHeader() { - const bool prev_enabled = screen_data.Files.cur_page > 0; - const bool next_enabled = screen_data.Files.cur_page < (screen_data.Files.num_page - 1); + const bool prev_enabled = mydata.cur_page > 0; + const bool next_enabled = mydata.cur_page < (mydata.num_page - 1); #undef MARGIN_T #undef MARGIN_B @@ -136,7 +137,7 @@ void FilesScreen::drawHeader() { char str[16]; sprintf_P(str, PSTR("Page %d of %d"), - screen_data.Files.cur_page + 1, screen_data.Files.num_page); + mydata.cur_page + 1, mydata.num_page); CommandProcessor cmd; cmd.colors(normal_btn) @@ -158,8 +159,8 @@ void FilesScreen::drawFooter() { #define MARGIN_T 5 #define MARGIN_B 5 #endif - const bool has_selection = screen_data.Files.selected_tag != 0xFF; - const uint8_t back_tag = screen_data.Files.flags.is_root ? 240 : 245; + const bool has_selection = mydata.selected_tag != 0xFF; + const uint8_t back_tag = mydata.flags.is_root ? 240 : 245; const uint8_t y = GRID_ROWS - footer_h + 1; const uint8_t h = footer_h; @@ -171,7 +172,7 @@ void FilesScreen::drawFooter() { .enabled(has_selection) .colors(has_selection ? action_btn : normal_btn); - if (screen_data.Files.flags.is_dir) + if (mydata.flags.is_dir) cmd.tag(244).button(BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN)); else cmd.tag(243).button(BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT)); @@ -186,8 +187,8 @@ void FilesScreen::onRedraw(draw_mode_t what) { } void FilesScreen::gotoPage(uint8_t page) { - screen_data.Files.selected_tag = 0xFF; - screen_data.Files.cur_page = page; + mydata.selected_tag = 0xFF; + mydata.cur_page = page; CommandProcessor cmd; cmd.cmd(CMD_DLSTART) .cmd(CLEAR_COLOR_RGB(bg_color)) @@ -201,13 +202,13 @@ bool FilesScreen::onTouchEnd(uint8_t tag) { switch (tag) { case 240: GOTO_PREVIOUS(); return true; case 241: - if (screen_data.Files.cur_page > 0) { - gotoPage(screen_data.Files.cur_page-1); + if (mydata.cur_page > 0) { + gotoPage(mydata.cur_page-1); } break; case 242: - if (screen_data.Files.cur_page < (screen_data.Files.num_page-1)) { - gotoPage(screen_data.Files.cur_page+1); + if (mydata.cur_page < (mydata.num_page-1)) { + gotoPage(mydata.cur_page+1); } break; case 243: @@ -229,18 +230,18 @@ bool FilesScreen::onTouchEnd(uint8_t tag) { break; default: if (tag < 240) { - screen_data.Files.selected_tag = tag; + mydata.selected_tag = tag; #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) if (FTDI::ftdi_chip >= 810) { const char *longFilename = getSelectedLongFilename(); if (longFilename[0]) { CommandProcessor cmd; uint16_t text_width = cmd.font(font_medium).text_width(longFilename); - screen_data.Files.scroll_pos = 0; + mydata.scroll_pos = 0; if (text_width > display_width) - screen_data.Files.scroll_max = text_width - display_width + MARGIN_L + MARGIN_R; + mydata.scroll_max = text_width - display_width + MARGIN_L + MARGIN_R; else - screen_data.Files.scroll_max = 0; + mydata.scroll_max = 0; } } #endif @@ -254,11 +255,11 @@ void FilesScreen::onIdle() { #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) if (FTDI::ftdi_chip >= 810) { CLCD::mem_write_32(CLCD::REG::MACRO_0, - VERTEX_TRANSLATE_X(-int32_t(screen_data.Files.scroll_pos))); - if (screen_data.Files.scroll_pos < screen_data.Files.scroll_max * 16) - screen_data.Files.scroll_pos++; + VERTEX_TRANSLATE_X(-int32_t(mydata.scroll_pos))); + if (mydata.scroll_pos < mydata.scroll_max * 16) + mydata.scroll_pos++; } #endif } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_FILES_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h new file mode 100644 index 0000000000..a4fb37cc14 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h @@ -0,0 +1,75 @@ +/****************** + * files_screen.h * + ******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_FILES_SCREEN +#define FTDI_FILES_SCREEN_CLASS FilesScreen + +struct FilesScreenData { + struct { + uint8_t is_dir : 1; + uint8_t is_root : 1; + } flags; + uint8_t selected_tag; + uint8_t num_page; + uint8_t cur_page; + #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) + uint16_t scroll_pos; + uint16_t scroll_max; + #endif +}; + +class FilesScreen : public BaseScreen, public CachedScreen { + private: + #if ENABLED(TOUCH_UI_PORTRAIT) + static constexpr uint8_t header_h = 2; + static constexpr uint8_t footer_h = 2; + static constexpr uint8_t files_per_page = 11; + #else + static constexpr uint8_t header_h = 1; + static constexpr uint8_t footer_h = 1; + static constexpr uint8_t files_per_page = 6; + #endif + + static uint8_t getTagForLine(uint8_t line) {return line + 2;} + static uint8_t getLineForTag(uint8_t tag) {return tag - 2;} + static uint16_t getFileForTag(uint8_t tag); + static uint16_t getSelectedFileIndex(); + + inline static const char *getSelectedShortFilename() {return getSelectedFilename(false);} + inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);} + static const char *getSelectedFilename(bool longName); + + static void drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted); + static void drawFileList(); + static void drawHeader(); + static void drawFooter(); + static void drawSelectedFile(); + + static void gotoPage(uint8_t); + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp index 3d50b616fc..2566a960e1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -21,12 +21,11 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_INTERFACE_SETTINGS_SCREEN + #include "../archim2-flash/flash_storage.h" #include "../../../../../module/settings.h" @@ -42,13 +41,14 @@ using namespace ExtUI; using namespace Theme; constexpr bool PERSISTENT_STORE_SUCCESS = false; // persistentStore uses true for error +constexpr static InterfaceSettingsScreenData &mydata = screen_data.InterfaceSettingsScreen; void InterfaceSettingsScreen::onStartup() { } void InterfaceSettingsScreen::onEntry() { - screen_data.InterfaceSettings.brightness = CLCD::get_brightness(); - screen_data.InterfaceSettings.volume = SoundPlayer::get_volume(); + mydata.brightness = CLCD::get_brightness(); + mydata.volume = SoundPlayer::get_volume(); BaseScreen::onEntry(); } @@ -96,9 +96,9 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { #define EDGE_R 30 .colors(ui_slider) #if DISABLED(LCD_FYSETC_TFT81050) - .tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettings.brightness, 128) + .tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), mydata.brightness, 128) #endif - .tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), screen_data.InterfaceSettings.volume, 0xFF) + .tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), mydata.volume, 0xFF) .colors(ui_toggle) .tag(4).toggle2(BTN_POS(3,4), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), LockScreen::is_enabled()) #if DISABLED(TOUCH_UI_NO_BOOTSCREEN) @@ -161,13 +161,13 @@ void InterfaceSettingsScreen::onIdle() { CommandProcessor cmd; switch (cmd.track_tag(value)) { case 2: - screen_data.InterfaceSettings.brightness = max(11, (value * 128UL) / 0xFFFF); - CLCD::set_brightness(screen_data.InterfaceSettings.brightness); + mydata.brightness = max(11, (value * 128UL) / 0xFFFF); + CLCD::set_brightness(mydata.brightness); SaveSettingsDialogBox::settingsChanged(); break; case 3: - screen_data.InterfaceSettings.volume = value >> 8; - SoundPlayer::set_volume(screen_data.InterfaceSettings.volume); + mydata.volume = value >> 8; + SoundPlayer::set_volume(mydata.volume); SaveSettingsDialogBox::settingsChanged(); break; default: @@ -288,4 +288,4 @@ void InterfaceSettingsScreen::loadSettings(const char *buff) { } #endif -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_INTERFACE_SETTINGS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.h new file mode 100644 index 0000000000..f5ddbb1004 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.h @@ -0,0 +1,67 @@ +/******************************* + * interface_settings_screen.h * + *******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_INTERFACE_SETTINGS_SCREEN +#define FTDI_INTERFACE_SETTINGS_SCREEN_CLASS InterfaceSettingsScreen + +struct InterfaceSettingsScreenData { + uint8_t volume; + uint8_t brightness; +}; + +class InterfaceSettingsScreen : public BaseScreen, public CachedScreen { + private: + struct persistent_data_t { + uint32_t touch_transform_a; + uint32_t touch_transform_b; + uint32_t touch_transform_c; + uint32_t touch_transform_d; + uint32_t touch_transform_e; + uint32_t touch_transform_f; + uint16_t passcode; + uint8_t display_brightness; + int8_t display_h_offset_adj; + int8_t display_v_offset_adj; + uint8_t sound_volume; + uint8_t bit_flags; + uint8_t event_sounds[InterfaceSoundsScreen::NUM_EVENTS]; + }; + + public: + #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE + static bool backupEEPROM(); + #endif + + static void saveSettings(char *); + static void loadSettings(const char *); + static void defaultSettings(); + static void failSafeSettings(); + + static void onStartup(); + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp index 9f21c6b8c7..4e47653899 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp @@ -21,12 +21,11 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_INTERFACE_SOUNDS_SCREEN + using namespace FTDI; using namespace Theme; using namespace ExtUI; @@ -93,7 +92,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { cmd.font(font_medium) .colors(ui_slider) #define EDGE_R 30 - .tag(2).slider (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettings.volume, 0xFF) + .tag(2).slider (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) .colors(ui_toggle) .tag(3).toggle2 (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::touch_sounds_enabled()) #undef EDGE_R @@ -108,7 +107,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { } void InterfaceSoundsScreen::onEntry() { - screen_data.InterfaceSettings.volume = SoundPlayer::get_volume(); + screen_data.InterfaceSettingsScreen.volume = SoundPlayer::get_volume(); BaseScreen::onEntry(); } @@ -145,8 +144,8 @@ void InterfaceSoundsScreen::onIdle() { CommandProcessor cmd; switch (cmd.track_tag(value)) { case 2: - screen_data.InterfaceSettings.volume = value >> 8; - SoundPlayer::set_volume(screen_data.InterfaceSettings.volume); + screen_data.InterfaceSettingsScreen.volume = value >> 8; + SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume); SaveSettingsDialogBox::settingsChanged(); break; default: @@ -157,4 +156,4 @@ void InterfaceSoundsScreen::onIdle() { BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_INTERFACE_SOUNDS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.h new file mode 100644 index 0000000000..046d7390fe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.h @@ -0,0 +1,57 @@ +/***************************** + * interface_sounds_screen.h * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_INTERFACE_SOUNDS_SCREEN +#define FTDI_INTERFACE_SOUNDS_SCREEN_CLASS InterfaceSoundsScreen + +class InterfaceSoundsScreen : public BaseScreen, public CachedScreen { + public: + enum event_t { + PRINTING_STARTED = 0, + PRINTING_FINISHED = 1, + PRINTING_FAILED = 2, + + NUM_EVENTS + }; + + private: + friend class InterfaceSettingsScreen; + + static uint8_t event_sounds[NUM_EVENTS]; + + static const char* getSoundSelection(event_t); + static void toggleSoundSelection(event_t); + static void setSoundSelection(event_t, const FTDI::SoundPlayer::sound_t*); + + public: + static void playEventSound(event_t, FTDI::play_mode_t = FTDI::PLAY_ASYNCHRONOUS); + + static void defaultSettings(); + + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp index 9c751bc345..d74879fd41 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, CLASSIC_JERK) - #include "screens.h" +#ifdef FTDI_JERK_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -62,4 +61,4 @@ bool JerkScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && CLASSIC_JERK +#endif // FTDI_JERK_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.h new file mode 100644 index 0000000000..5f7acb2960 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.h @@ -0,0 +1,32 @@ +/***************** + * jerk_screen.h * + *****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_JERK_SCREEN +#define FTDI_JERK_SCREEN_CLASS JerkScreen + +class JerkScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp index 329fa6c97f..4b9f5512bb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp @@ -1,6 +1,6 @@ -/******************* - * boot_screen.cpp * - *******************/ +/********************************* + * junction_deviation_screen.cpp * + *********************************/ /**************************************************************************** * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_JUNCTION_DEVIATION) - #include "screens.h" +#ifdef FTDI_JUNCTION_DEVIATION_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -51,4 +50,4 @@ bool JunctionDeviationScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && !CLASSIC_JERK +#endif // FTDI_JUNCTION_DEVIATION_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.h new file mode 100644 index 0000000000..2239e2a450 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.h @@ -0,0 +1,32 @@ +/******************************* + * junction_deviation_screen.h * + *******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_JUNCTION_DEVIATION_SCREEN +#define FTDI_JUNCTION_DEVIATION_SCREEN_CLASS JunctionDeviationScreen + +class JunctionDeviationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp index 273da348c1..fe58cad93c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_KILL_SCREEN + using namespace FTDI; // The kill screen is an oddball that happens after Marlin has killed the events @@ -59,4 +58,4 @@ void KillScreen::show(const char *message) { InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED, PLAY_SYNCHRONOUS); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_KILL_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.h new file mode 100644 index 0000000000..b6d9495884 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.h @@ -0,0 +1,33 @@ +/***************** + * kill_screen.h * + *****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_KILL_SCREEN +#define FTDI_KILL_SCREEN_CLASS KillScreen + +class KillScreen { + // The KillScreen is behaves differently than the + // others, so we do not bother extending UIScreen. + public: + static void show(const char*); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp index 6c5dfcfa9f..77c0d02756 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp @@ -21,12 +21,12 @@ ****************************************************************************/ #include "../config.h" -#include "../language/language.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && NUM_LANGUAGES > 1 - #include "screens.h" +#ifdef FTDI_LANGUAGE_MENU + +#include "../language/language.h" + using namespace FTDI; using namespace Theme; @@ -63,4 +63,4 @@ bool LanguageMenu::onTouchEnd(uint8_t tag) { return false; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_LANGUAGE_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.h new file mode 100644 index 0000000000..a86333363f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.h @@ -0,0 +1,32 @@ +/******************* + * language_menu.h * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_LANGUAGE_MENU +#define FTDI_LANGUAGE_MENU_CLASS LanguageMenu + +class LanguageMenu : public BaseScreen, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index 8d372309bd..1d4ef84271 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE,HAS_LEVELING) - #include "screens.h" +#ifdef FTDI_LEVELING_MENU + #if BOTH(HAS_BED_PROBE,BLTOUCH) #include "../../../../../feature/bltouch.h" #endif @@ -118,4 +117,4 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && HAS_LEVELING +#endif // FTDI_LEVELING_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.h new file mode 100644 index 0000000000..aaf852be6c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.h @@ -0,0 +1,32 @@ +/******************* + * leveling_menu.h * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_LEVELING_MENU +#define FTDI_LEVELING_MENU_CLASS LevelingMenu + +class LevelingMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp index 2feaa03295..e70d6933cc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, LIN_ADVANCE) - #include "screens.h" +#ifdef FTDI_LINEAR_ADVANCE_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -74,4 +73,4 @@ bool LinearAdvanceScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_LINEAR_ADVANCE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.h new file mode 100644 index 0000000000..8c083c8aeb --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.h @@ -0,0 +1,32 @@ +/*************************** + * linear_advance_screen.h * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_LINEAR_ADVANCE_SCREEN +#define FTDI_LINEAR_ADVANCE_SCREEN_CLASS LinearAdvanceScreen + +class LinearAdvanceScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp index 766f414a11..f89ad5c44c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp @@ -21,21 +21,21 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_LOCK_SCREEN + using namespace FTDI; using namespace Theme; uint16_t LockScreen::passcode = 0; +constexpr static LockScreenData &mydata = screen_data.LockScreen; void LockScreen::onEntry() { - const uint8_t siz = sizeof(screen_data.Lock.passcode); - memset(screen_data.Lock.passcode, '_', siz-1); - screen_data.Lock.passcode[siz-1] = '\0'; + const uint8_t siz = sizeof(mydata.passcode); + memset(mydata.passcode, '_', siz-1); + mydata.passcode[siz-1] = '\0'; BaseScreen::onEntry(); } @@ -84,11 +84,11 @@ void LockScreen::onRedraw(draw_mode_t what) { #if ENABLED(TOUCH_UI_PORTRAIT) .text(BTN_POS(1,2), BTN_SIZE(1,1), message) .font(font_xlarge) - .text(BTN_POS(1,4), BTN_SIZE(1,1), screen_data.Lock.passcode) + .text(BTN_POS(1,4), BTN_SIZE(1,1), mydata.passcode) #else .text(BTN_POS(1,1), BTN_SIZE(1,1), message) .font(font_xlarge) - .text(BTN_POS(1,2), BTN_SIZE(1,1), screen_data.Lock.passcode) + .text(BTN_POS(1,2), BTN_SIZE(1,1), mydata.passcode) #endif .font(font_large) .colors(normal_btn) @@ -117,8 +117,8 @@ void LockScreen::onRedraw(draw_mode_t what) { char &LockScreen::message_style() { // We use the last byte of the passcode string as a flag to indicate, // which message to show. - constexpr uint8_t last_char = sizeof(screen_data.Lock.passcode)-1; - return screen_data.Lock.passcode[last_char]; + constexpr uint8_t last_char = sizeof(mydata.passcode)-1; + return mydata.passcode[last_char]; } void LockScreen::onPasscodeEntered() { @@ -145,10 +145,10 @@ void LockScreen::onPasscodeEntered() { } bool LockScreen::onTouchEnd(uint8_t tag) { - char *c = strchr(screen_data.Lock.passcode,'_'); + char *c = strchr(mydata.passcode,'_'); if (c) { if (tag == '<') { - if (c != screen_data.Lock.passcode) { + if (c != mydata.passcode) { // Backspace deletes previous entered characters. *--c = '_'; } @@ -167,7 +167,7 @@ bool LockScreen::onTouchEnd(uint8_t tag) { uint16_t LockScreen::compute_checksum() { uint16_t checksum = 0; - const char* c = screen_data.Lock.passcode; + const char* c = mydata.passcode; while (*c) { checksum = (checksum << 2) ^ *c++; } @@ -202,4 +202,4 @@ void LockScreen::enable() { GOTO_SCREEN(LockScreen); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_LOCK_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.h new file mode 100644 index 0000000000..05ab8bf80f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.h @@ -0,0 +1,53 @@ +/***************** + * lock_screen.h * + *****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_LOCK_SCREEN +#define FTDI_LOCK_SCREEN_CLASS LockScreen + +struct LockScreenData { + char passcode[5]; +}; + +class LockScreen : public BaseScreen, public CachedScreen { + private: + friend InterfaceSettingsScreen; + + static uint16_t passcode; + + static char & message_style(); + static uint16_t compute_checksum(); + static void onPasscodeEntered(); + public: + static bool is_enabled(); + static void check_passcode(); + static void enable(); + static void disable(); + + static void set_hash(uint16_t pass) {passcode = pass;}; + static uint16_t get_hash() {return passcode;}; + + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 146b799c20..b7914d629b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -22,11 +22,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && NONE(TOUCH_UI_LULZBOT_BIO,TOUCH_UI_COCOA_PRESS) - #include "screens.h" +#ifdef FTDI_MAIN_MENU + using namespace FTDI; using namespace Theme; @@ -128,4 +127,4 @@ bool MainMenu::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && !TOUCH_UI_LULZBOT_BIO +#endif // FTDI_MAIN_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.h new file mode 100644 index 0000000000..ac1300e1b8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.h @@ -0,0 +1,33 @@ +/*************** + * main_menu.h * + ***************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_MAIN_MENU +#define FTDI_MAIN_MENU_CLASS MainMenu + +class MainMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp index fdbb9623b5..d4d14d6331 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_MAX_ACCELERATION_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -83,4 +82,4 @@ bool MaxAccelerationScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_MAX_ACCELERATION_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.h new file mode 100644 index 0000000000..87a79b3bd9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.h @@ -0,0 +1,32 @@ +/***************************** + * max_acceleration_screen.h * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_MAX_ACCELERATION_SCREEN +#define FTDI_MAX_ACCELERATION_SCREEN_CLASS MaxAccelerationScreen + +class MaxAccelerationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp index ac1374b99a..4de3e33360 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_MAX_VELOCITY_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -87,4 +86,4 @@ bool MaxVelocityScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_MAX_VELOCITY_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.h new file mode 100644 index 0000000000..e904a2c058 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.h @@ -0,0 +1,32 @@ +/************************* + * max_velocity_screen.h * + *************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_MAX_VELOCITY_SCREEN +#define FTDI_MAX_VELOCITY_SCREEN_CLASS MaxVelocityScreen + +class MaxVelocityScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp index eb0b78a325..38e8b0b5c7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp @@ -21,6 +21,7 @@ ****************************************************************************/ #include "../config.h" +#include "screens.h" /** * The MediaPlayerScreen allows an AVI to be played. @@ -39,9 +40,7 @@ * ffmpeg -i video.avi -i silence.wav -c copy -map 0:v:0 -map 1:a:0 startup.avi */ -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" +#ifdef FTDI_MEDIA_PLAYER_SCREEN #include "../archim2-flash/flash_storage.h" #include "../archim2-flash/media_file_reader.h" @@ -165,4 +164,4 @@ void MediaPlayerScreen::playStream(void *obj, media_streamer_func_t *data_stream #endif // FTDI_API_LEVEL >= 810 } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_MEDIA_PLAYER_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.h new file mode 100644 index 0000000000..510d5a9386 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.h @@ -0,0 +1,40 @@ +/************************* + * media_player_screen.h * + *************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_MEDIA_PLAYER_SCREEN +#define FTDI_MEDIA_PLAYER_SCREEN_CLASS MediaPlayerScreen + +class MediaPlayerScreen : public BaseScreen, public UncachedScreen { + private: + typedef int16_t media_streamer_func_t(void *obj, void *buff, size_t bytes); + + public: + static bool playCardMedia(); + static bool playBootMedia(); + + static void onEntry(); + static void onRedraw(draw_mode_t); + + static void playStream(void *obj, media_streamer_func_t*); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index ba38918b1c..5f5971458a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -21,15 +21,16 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_MOVE_AXIS_SCREEN + using namespace FTDI; using namespace ExtUI; +constexpr static MoveAxisScreenData &mydata = screen_data.MoveAxisScreen; + void BaseMoveAxisScreen::onEntry() { // Since Marlin keeps only one absolute position for all the extruders, // we have to keep track of the relative motion of individual extruders @@ -37,7 +38,7 @@ void BaseMoveAxisScreen::onEntry() { // screen is entered. LOOP_L_N(i, ExtUI::extruderCount) { - screen_data.MoveAxis.e_rel[i] = 0; + mydata.e_rel[i] = 0; } BaseNumericAdjustmentScreen::onEntry(); } @@ -54,15 +55,15 @@ void MoveAxisScreen::onRedraw(draw_mode_t what) { w.color(Theme::e_axis); #if EXTRUDERS == 1 - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxis.e_rel[0], canMove(E0)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), mydata.e_rel[0], canMove(E0)); #elif HAS_MULTI_EXTRUDER - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxis.e_rel[0], canMove(E0)); - w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxis.e_rel[1], canMove(E1)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), mydata.e_rel[0], canMove(E0)); + w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), mydata.e_rel[1], canMove(E1)); #if EXTRUDERS > 2 - w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxis.e_rel[2], canMove(E2)); + w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), mydata.e_rel[2], canMove(E2)); #endif #if EXTRUDERS > 3 - w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxis.e_rel[3], canMove(E3)); + w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), mydata.e_rel[3], canMove(E3)); #endif #endif w.increments(); @@ -80,19 +81,19 @@ bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) { case 6: UI_DECREMENT_AXIS(Z); break; case 7: UI_INCREMENT_AXIS(Z); break; // For extruders, also update relative distances. - case 8: UI_DECREMENT_AXIS(E0); screen_data.MoveAxis.e_rel[0] -= increment; break; - case 9: UI_INCREMENT_AXIS(E0); screen_data.MoveAxis.e_rel[0] += increment; break; + case 8: UI_DECREMENT_AXIS(E0); mydata.e_rel[0] -= increment; break; + case 9: UI_INCREMENT_AXIS(E0); mydata.e_rel[0] += increment; break; #if HAS_MULTI_EXTRUDER - case 10: UI_DECREMENT_AXIS(E1); screen_data.MoveAxis.e_rel[1] -= increment; break; - case 11: UI_INCREMENT_AXIS(E1); screen_data.MoveAxis.e_rel[1] += increment; break; + case 10: UI_DECREMENT_AXIS(E1); mydata.e_rel[1] -= increment; break; + case 11: UI_INCREMENT_AXIS(E1); mydata.e_rel[1] += increment; break; #endif #if EXTRUDERS > 2 - case 12: UI_DECREMENT_AXIS(E2); screen_data.MoveAxis.e_rel[2] -= increment; break; - case 13: UI_INCREMENT_AXIS(E2); screen_data.MoveAxis.e_rel[2] += increment; break; + case 12: UI_DECREMENT_AXIS(E2); mydata.e_rel[2] -= increment; break; + case 13: UI_INCREMENT_AXIS(E2); mydata.e_rel[2] += increment; break; #endif #if EXTRUDERS > 3 - case 14: UI_DECREMENT_AXIS(E3); screen_data.MoveAxis.e_rel[3] -= increment; break; - case 15: UI_INCREMENT_AXIS(E3); screen_data.MoveAxis.e_rel[3] += increment; break; + case 14: UI_DECREMENT_AXIS(E3); mydata.e_rel[3] -= increment; break; + case 15: UI_INCREMENT_AXIS(E3); mydata.e_rel[3] += increment; break; #endif case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28X")); break; case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28Y")); break; @@ -130,4 +131,4 @@ void MoveAxisScreen::onIdle() { BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_MOVE_AXIS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.h new file mode 100644 index 0000000000..6053286eda --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.h @@ -0,0 +1,48 @@ +/********************** + * move_axis_screen.h * + **********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_MOVE_AXIS_SCREEN +#define FTDI_MOVE_AXIS_SCREEN_CLASS MoveAxisScreen + +struct MoveAxisScreenData { + struct BaseNumericAdjustmentScreenData placeholder; + float e_rel[ExtUI::extruderCount]; +}; + +class BaseMoveAxisScreen : public BaseNumericAdjustmentScreen { + private: + static float getManualFeedrate(uint8_t axis, float increment_mm); + public: + static void setManualFeedrate(ExtUI::axis_t, float increment_mm); + static void setManualFeedrate(ExtUI::extruder_t, float increment_mm); + + static void onEntry(); + static bool onTouchHeld(uint8_t tag); +}; + +class MoveAxisScreen : public BaseMoveAxisScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp index 85c7206b04..a444a07cfc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_MULTI_HOTEND) - #include "screens.h" +#ifdef FTDI_NOZZLE_OFFSETS_SCREEN + using namespace FTDI; using namespace ExtUI; @@ -70,4 +69,4 @@ bool NozzleOffsetScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_NOZZLE_OFFSETS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.h new file mode 100644 index 0000000000..763f3364ce --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.h @@ -0,0 +1,33 @@ +/*************************** + * nozzle_offsets_screen.h * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_NOZZLE_OFFSETS_SCREEN +#define FTDI_NOZZLE_OFFSETS_SCREEN_CLASS NozzleOffsetScreen + +class NozzleOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp index f0d3f7eec5..96ad833b14 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp @@ -21,22 +21,23 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, BABYSTEPPING) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_NUDGE_NOZZLE_SCREEN + using namespace FTDI; using namespace Theme; using namespace ExtUI; +constexpr static NudgeNozzleScreenData &mydata = screen_data.NudgeNozzleScreen; + void NudgeNozzleScreen::onEntry() { - screen_data.NudgeNozzle.show_offsets = false; + mydata.show_offsets = false; #if HAS_MULTI_EXTRUDER - screen_data.NudgeNozzle.link_nozzles = true; + mydata.link_nozzles = true; #endif - screen_data.NudgeNozzle.rel.reset(); + mydata.rel.reset(); BaseNumericAdjustmentScreen::onEntry(); } @@ -47,19 +48,19 @@ void NudgeNozzleScreen::onRedraw(draw_mode_t what) { w.heading(GET_TEXT_F(MSG_NUDGE_NOZZLE)); #if ENABLED(BABYSTEP_XY) - w.color(x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), screen_data.NudgeNozzle.rel.x / getAxisSteps_per_mm(X)); - w.color(y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), screen_data.NudgeNozzle.rel.y / getAxisSteps_per_mm(Y)); + w.color(x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), mydata.rel.x / getAxisSteps_per_mm(X)); + w.color(y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), mydata.rel.y / getAxisSteps_per_mm(Y)); #endif - w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), screen_data.NudgeNozzle.rel.z / getAxisSteps_per_mm(Z)); + w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), mydata.rel.z / getAxisSteps_per_mm(Z)); w.increments(); #if HAS_MULTI_EXTRUDER - w.toggle(8, GET_TEXT_F(MSG_ADJUST_BOTH_NOZZLES), screen_data.NudgeNozzle.link_nozzles); + w.toggle(8, GET_TEXT_F(MSG_ADJUST_BOTH_NOZZLES), mydata.link_nozzles); #endif #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE - w.toggle(9, GET_TEXT_F(MSG_SHOW_OFFSETS), screen_data.NudgeNozzle.show_offsets); + w.toggle(9, GET_TEXT_F(MSG_SHOW_OFFSETS), mydata.show_offsets); - if (screen_data.NudgeNozzle.show_offsets) { + if (mydata.show_offsets) { char str[19]; w.draw_mode(BOTH); @@ -83,22 +84,22 @@ void NudgeNozzleScreen::onRedraw(draw_mode_t what) { bool NudgeNozzleScreen::onTouchHeld(uint8_t tag) { const float inc = getIncrement(); #if HAS_MULTI_EXTRUDER - const bool link = screen_data.NudgeNozzle.link_nozzles; + const bool link = mydata.link_nozzles; #else constexpr bool link = true; #endif int16_t steps; switch (tag) { - case 2: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps(-steps, X, link); screen_data.NudgeNozzle.rel.x -= steps; break; - case 3: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps( steps, X, link); screen_data.NudgeNozzle.rel.x += steps; break; - case 4: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps(-steps, Y, link); screen_data.NudgeNozzle.rel.y -= steps; break; - case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); screen_data.NudgeNozzle.rel.y += steps; break; - case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); screen_data.NudgeNozzle.rel.z -= steps; break; - case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); screen_data.NudgeNozzle.rel.z += steps; break; + case 2: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps(-steps, X, link); mydata.rel.x -= steps; break; + case 3: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps( steps, X, link); mydata.rel.x += steps; break; + case 4: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps(-steps, Y, link); mydata.rel.y -= steps; break; + case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); mydata.rel.y += steps; break; + case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); mydata.rel.z -= steps; break; + case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); mydata.rel.z += steps; break; #if HAS_MULTI_EXTRUDER - case 8: screen_data.NudgeNozzle.link_nozzles = !link; break; + case 8: mydata.link_nozzles = !link; break; #endif - case 9: screen_data.NudgeNozzle.show_offsets = !screen_data.NudgeNozzle.show_offsets; break; + case 9: mydata.show_offsets = !mydata.show_offsets; break; default: return false; } #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE @@ -120,4 +121,4 @@ void NudgeNozzleScreen::onIdle() { reset_menu_timeout(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_NUDGE_NOZZLE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.h new file mode 100644 index 0000000000..c490a25fea --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.h @@ -0,0 +1,44 @@ +/****************** + * nudge_nozzle.h * + ******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_NUDGE_NOZZLE_SCREEN +#define FTDI_NUDGE_NOZZLE_SCREEN_CLASS NudgeNozzleScreen + +struct NudgeNozzleScreenData { + struct BaseNumericAdjustmentScreenData placeholder; + xyz_int_t rel; + #if HAS_MULTI_EXTRUDER + bool link_nozzles; + #endif + bool show_offsets; +}; + +class NudgeNozzleScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp index 9be2239797..8dce1a259c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_RESTORE_FAILSAFE_DIALOG_BOX + using namespace ExtUI; void RestoreFailsafeDialogBox::onRedraw(draw_mode_t) { @@ -48,4 +47,4 @@ bool RestoreFailsafeDialogBox::onTouchEnd(uint8_t tag) { } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_RESTORE_FAILSAFE_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.h new file mode 100644 index 0000000000..84a994730d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.h @@ -0,0 +1,32 @@ +/********************************* + * restore_failsafe_dialog_box.h * + *********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_RESTORE_FAILSAFE_DIALOG_BOX +#define FTDI_RESTORE_FAILSAFE_DIALOG_BOX_CLASS RestoreFailsafeDialogBox + +class RestoreFailsafeDialogBox : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp index eff0431a94..a475a9863c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_SAVE_SETTINGS_DIALOG_BOX + using namespace ExtUI; bool SaveSettingsDialogBox::needs_save = false; @@ -61,4 +60,4 @@ void SaveSettingsDialogBox::promptToSaveSettings() { GOTO_PREVIOUS(); // No save needed. } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_SAVE_SETTINGS_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.h new file mode 100644 index 0000000000..8985a974fe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.h @@ -0,0 +1,38 @@ +/****************************** + * save_settings_dialog_box.h * + ******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_SAVE_SETTINGS_DIALOG_BOX +#define FTDI_SAVE_SETTINGS_DIALOG_BOX_CLASS SaveSettingsDialogBox + +class SaveSettingsDialogBox : public DialogBoxBaseClass, public UncachedScreen { + private: + static bool needs_save; + + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + + static void promptToSaveSettings(); + static void settingsChanged() {needs_save = true;} +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index fe35fc457b..e725a23797 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -27,71 +27,40 @@ // To save RAM, store state information related to a particular screen // in a union. The values should be initialized in the onEntry method. -struct base_numeric_adjustment_t {uint8_t increment;}; +/** + * The DECL_DATA_IF_INCLUDED macro: + * + * union screen_data_t { + * DECL_DATA_IF_INCLUDED(FTDI_EXAMPLE_SCREEN) + * } + * + * Is a shorthand for: + * + * union screen_data_t { + * #ifdef FTDI_EXAMPLE_SCREEN + * struct ExampleScreenData ExampleScreen; + * #endif + * } + * + */ +#define __DECL_DATA_IF_INCLUDED(CLASS) struct CLASS ## Data CLASS ; +#define _DECL_DATA_IF_INCLUDED(CLASS) __DECL_DATA_IF_INCLUDED(CLASS) +#define DECL_DATA_IF_INCLUDED(HEADER) TERN(HEADER, _DECL_DATA_IF_INCLUDED(HEADER ## _CLASS), ) union screen_data_t { - struct base_numeric_adjustment_t BaseNumericAdjustment; - struct {uint8_t volume; uint8_t brightness;} InterfaceSettings; - struct {char passcode[5];} Lock; - struct {bool isError;} AlertDialog; - struct {bool auto_hide;} SpinnerDialog; - struct {uint8_t file_index;} ConfirmStartPrintDialog; - struct { - uint8_t e_tag, t_tag, repeat_tag; - ExtUI::extruder_t saved_extruder; - #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - bool need_purge; - #endif - } ChangeFilament; - struct { - struct { - uint8_t is_dir : 1; - uint8_t is_root : 1; - } flags; - uint8_t selected_tag; - uint8_t num_page; - uint8_t cur_page; - #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) - uint16_t scroll_pos; - uint16_t scroll_max; - #endif - } Files; - struct { - struct base_numeric_adjustment_t placeholder; - float e_rel[ExtUI::extruderCount]; - } MoveAxis; - #if HAS_MESH - struct { - enum : uint8_t { - MSG_NONE, - MSG_MESH_COMPLETE, - MSG_MESH_INCOMPLETE - } message; - uint8_t count; - uint8_t highlightedTag; - } BedMesh; - #endif - #if ENABLED(TOUCH_UI_DEVELOPER_MENU) - struct { - uint32_t next_watchdog_trigger; - const char* message; - } StressTest; - #endif - #if ENABLED(TOUCH_UI_COCOA_PRESS) - struct { - uint32_t start_ms; - } PreheatTimer; - #endif - #if ENABLED(BABYSTEPPING) - struct { - struct base_numeric_adjustment_t placeholder; - xyz_int_t rel; - #if HAS_MULTI_EXTRUDER - bool link_nozzles; - #endif - bool show_offsets; - } NudgeNozzle; - #endif + DECL_DATA_IF_INCLUDED(FTDI_INTERFACE_SETTINGS_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_LOCK_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_SPINNER_DIALOG_BOX) + DECL_DATA_IF_INCLUDED(FTDI_CONFIRM_START_PRINT_DIALOG_BOX) + DECL_DATA_IF_INCLUDED(FTDI_CHANGE_FILAMENT_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_FILES_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_MOVE_AXIS_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_BED_MESH_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_STRESS_TEST_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_NUDGE_NOZZLE_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_BASE_NUMERIC_ADJ_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_ALERT_DIALOG_BOX) }; extern screen_data_t screen_data; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 5841c38f53..ab3c3d7114 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -24,116 +24,98 @@ #if ENABLED(TOUCH_UI_FTDI_EVE) #include "screens.h" -#include "screen_data.h" - tiny_timer_t refresh_timer; -screen_data_t screen_data; + + +/** + * DECL_SCREEN_IF_INCLUDED allows for a concise + * definition of SCREEN_TABLE: + * + * SCREEN_TABLE { + * DECL_SCREEN_IF_INCLUDED(MY_HEADER) + * } + * + * Is a shorthand for: + * + * SCREEN_TABLE { + * #ifdef MY_HEADER + * DECL_SCREEN(MY_HEADER), + * #endif + * } + * + */ +#define COMMA , +#define __DECL_SCREEN_IF_INCLUDED(O,C) THIRD(O, DECL_SCREEN(C) COMMA,) +#define _DECL_SCREEN_IF_INCLUDED(O,C) __DECL_SCREEN_IF_INCLUDED(O ## COMMA, C) +#define DECL_SCREEN_IF_INCLUDED(H) _DECL_SCREEN_IF_INCLUDED(H, H ## _CLASS) SCREEN_TABLE { - DECL_SCREEN(BootScreen), - #if NUM_LANGUAGES > 1 - DECL_SCREEN(LanguageMenu), - #endif - DECL_SCREEN(TouchCalibrationScreen), - DECL_SCREEN(StatusScreen), - DECL_SCREEN(MainMenu), - DECL_SCREEN(TuneMenu), - DECL_SCREEN(AdvancedSettingsMenu), - DECL_SCREEN(AlertDialogBox), - DECL_SCREEN(ConfirmUserRequestAlertBox), - DECL_SCREEN(RestoreFailsafeDialogBox), - DECL_SCREEN(SaveSettingsDialogBox), - DECL_SCREEN(ConfirmStartPrintDialogBox), - DECL_SCREEN(ConfirmAbortPrintDialogBox), - #if ENABLED(CALIBRATION_GCODE) - DECL_SCREEN(ConfirmAutoCalibrationDialogBox), - #endif - #if ENABLED(CUSTOM_USER_MENUS) - DECL_SCREEN(CustomUserMenus), - #endif - DECL_SCREEN(SpinnerDialogBox), - DECL_SCREEN(AboutScreen), - #if ENABLED(PRINTCOUNTER) - DECL_SCREEN(StatisticsScreen), - #endif - #if ENABLED(BABYSTEPPING) - DECL_SCREEN(NudgeNozzleScreen), - #endif - DECL_SCREEN(MoveAxisScreen), - DECL_SCREEN(StepsScreen), - #if HAS_TRINAMIC_CONFIG - DECL_SCREEN(StepperCurrentScreen), - DECL_SCREEN(StepperBumpSensitivityScreen), - #endif - #if HAS_LEVELING - DECL_SCREEN(LevelingMenu), - #if HAS_BED_PROBE - DECL_SCREEN(ZOffsetScreen), - #endif - #if HAS_MESH - DECL_SCREEN(BedMeshScreen), - #endif - #endif - #if HAS_MULTI_HOTEND - DECL_SCREEN(NozzleOffsetScreen), - #endif - #if ENABLED(BACKLASH_GCODE) - DECL_SCREEN(BacklashCompensationScreen), - #endif - DECL_SCREEN(FeedratePercentScreen), - DECL_SCREEN(MaxVelocityScreen), - DECL_SCREEN(MaxAccelerationScreen), - DECL_SCREEN(DefaultAccelerationScreen), - #if HAS_JUNCTION_DEVIATION - DECL_SCREEN(JunctionDeviationScreen), - #else - DECL_SCREEN(JerkScreen), - #endif - #if ENABLED(CASE_LIGHT_ENABLE) - DECL_SCREEN(CaseLightScreen), - #endif - #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - DECL_SCREEN(FilamentMenu), - #endif - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - DECL_SCREEN(FilamentRunoutScreen), - #endif - #if ENABLED(LIN_ADVANCE) - DECL_SCREEN(LinearAdvanceScreen), - #endif - DECL_SCREEN(TemperatureScreen), - DECL_SCREEN(ChangeFilamentScreen), - DECL_SCREEN(InterfaceSettingsScreen), - DECL_SCREEN(InterfaceSoundsScreen), - DECL_SCREEN(LockScreen), - #if ENABLED(SDSUPPORT) - DECL_SCREEN(FilesScreen), - #endif - DECL_SCREEN(EndstopStatesScreen), - #if ENABLED(TOUCH_UI_LULZBOT_BIO) - DECL_SCREEN(BioPrintingDialogBox), - DECL_SCREEN(BioConfirmHomeXYZ), - DECL_SCREEN(BioConfirmHomeE), - #endif - #if ENABLED(TOUCH_UI_COCOA_PRESS) - DECL_SCREEN(PreheatMenu), - DECL_SCREEN(PreheatTimerScreen), - DECL_SCREEN(UnloadCartridgeScreen), - DECL_SCREEN(LoadChocolateScreen), - DECL_SCREEN(MoveXYZScreen), - DECL_SCREEN(MoveEScreen), - #endif - #if ENABLED(TOUCH_UI_DEVELOPER_MENU) - DECL_SCREEN(DeveloperMenu), - DECL_SCREEN(ConfirmEraseFlashDialogBox), - DECL_SCREEN(WidgetsScreen), - DECL_SCREEN(TouchRegistersScreen), - DECL_SCREEN(StressTestScreen), - #endif - DECL_SCREEN(MediaPlayerScreen), - DECL_SCREEN(DisplayTuningScreen) + DECL_SCREEN_IF_INCLUDED(FTDI_BOOT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_LANGUAGE_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_TOUCH_CALIBRATION_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_STATUS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_MAIN_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_TUNE_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_ADVANCED_SETTINGS_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_ALERT_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_CONFIRM_USER_REQUEST_ALERT_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_RESTORE_FAILSAFE_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_SAVE_SETTINGS_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_CONFIRM_START_PRINT_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_CONFIRM_ABORT_PRINT_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_CONFIRM_AUTO_CALIBRATION_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_CUSTOM_USER_MENUS) + DECL_SCREEN_IF_INCLUDED(FTDI_SPINNER_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_ABOUT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_STATISTICS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_NUDGE_NOZZLE_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_MOVE_AXIS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_STEPS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_STEPPER_CURRENT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_STEPPER_BUMP_SENSITIVITY_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_LEVELING_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_Z_OFFSET_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_BED_MESH_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_NOZZLE_OFFSETS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_BACKLASH_COMP_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_FEEDRATE_PERCENT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_MAX_VELOCITY_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_MAX_ACCELERATION_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_DEFAULT_ACCELERATION_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_JUNCTION_DEVIATION_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_JERK_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_CASE_LIGHT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_FILAMENT_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_FILAMENT_RUNOUT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_LINEAR_ADVANCE_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_TEMPERATURE_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_CHANGE_FILAMENT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_INTERFACE_SETTINGS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_INTERFACE_SOUNDS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_LOCK_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_FILES_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_ENDSTOP_STATE_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_BIO_PRINTING_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_BIO_CONFIRMOME_XYZ) + DECL_SCREEN_IF_INCLUDED(FTDI_BIO_CONFIRMOME_E) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_LOAD_CHOCOLATE_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_MOVE_XYZ_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_MOVE_E_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_DEVELOPER_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_CONFIRM_ERASE_FLASH_DIALOG_BOX) + DECL_SCREEN_IF_INCLUDED(FTDI_WIDGET_DEMO_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_TOUCH_REGISTERS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_STRESS_TEST_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_MEDIA_PLAYER_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_DISPLAY_TUNING_SCREEN) }; SCREEN_TABLE_POST +#include "screen_data.h" +screen_data_t screen_data; + #endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 51fc76f15b..a82d8988da 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -22,6 +22,8 @@ #pragma once +#if ENABLED(TOUCH_UI_FTDI_EVE) + #include "../ftdi_eve_lib/ftdi_eve_lib.h" #include "../language/language.h" #include "../theme/theme.h" @@ -127,785 +129,140 @@ enum { /************************* MENU SCREEN DECLARATIONS *************************/ -class BaseScreen : public UIScreen { - protected: - #if LCD_TIMEOUT_TO_STATUS > 0 - static uint32_t last_interaction; - #endif - - static bool buttonIsPressed(uint8_t tag); - - public: - static bool buttonStyleCallback(CommandProcessor &, uint8_t, uint8_t &, uint16_t &, bool); - - static void reset_menu_timeout(); - - static void onEntry(); - static void onIdle(); -}; - -class BootScreen : public BaseScreen, public UncachedScreen { - private: - static void showSplashScreen(); - public: - static void onRedraw(draw_mode_t); - static void onIdle(); -}; - -class AboutScreen : public BaseScreen, public UncachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -#if ENABLED(PRINTCOUNTER) - class StatisticsScreen : public BaseScreen, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; -#endif - -class KillScreen { - // The KillScreen is behaves differently than the - // others, so we do not bother extending UIScreen. - public: - static void show(const char*); -}; - -class DialogBoxBaseClass : public BaseScreen { - protected: - template static void drawMessage(const T, int16_t font = 0); - static void drawYesNoButtons(uint8_t default_btn = 0); - static void drawOkayButton(); - static void drawSpinner(); - static void drawButton(const progmem_str); - - static void onRedraw(draw_mode_t) {}; - public: - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; - -class AlertDialogBox : public DialogBoxBaseClass, public CachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - template static void show(T); - template static void showError(T); - static void hide(); -}; - -class RestoreFailsafeDialogBox : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class SaveSettingsDialogBox : public DialogBoxBaseClass, public UncachedScreen { - private: - static bool needs_save; - - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - - static void promptToSaveSettings(); - static void settingsChanged() {needs_save = true;} -}; - -class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { - private: - inline static const char *getShortFilename() {return getFilename(false);} - inline static const char *getLongFilename() {return getFilename(true);} - - static const char *getFilename(bool longName); - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t); - - static void show(uint8_t file_index); -}; - -class ConfirmAbortPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -#if ENABLED(CALIBRATION_GCODE) -class ConfirmAutoCalibrationDialogBox : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; -#endif - -class ConfirmUserRequestAlertBox : public AlertDialogBox { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t); - static void hide(); - static void show(const char*); -}; - -#if ENABLED(CUSTOM_USER_MENUS) - class CustomUserMenus : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; -#endif - -class SpinnerDialogBox : public DialogBoxBaseClass, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static void onIdle(); - - static void show(const progmem_str); - static void hide(); - static void enqueueAndWait_P(const progmem_str commands); - static void enqueueAndWait_P(const progmem_str message, const progmem_str commands); -}; - -#if NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) -class StatusScreen : public BaseScreen, public CachedScreen { - private: - static void draw_axis_position(draw_mode_t); - static void draw_temperature(draw_mode_t); - static void draw_progress(draw_mode_t); - static void draw_interaction_buttons(draw_mode_t); - static void draw_status_message(draw_mode_t, const char * const); - static void _format_time(char *outstr, uint32_t time); - public: - static void loadBitmaps(); - static void setStatusMessage(const char *); - static void setStatusMessage(progmem_str); - static void onRedraw(draw_mode_t); - static void onStartup(); - static void onEntry(); - static void onIdle(); - static bool onTouchEnd(uint8_t tag); -}; -#else - class StatusScreen : public BaseScreen, public CachedScreen { - private: - static float increment; - static bool jog_xy; - static bool fine_motion; - - static void draw_progress(draw_mode_t what); - static void draw_temperature(draw_mode_t what); - static void draw_syringe(draw_mode_t what); - static void draw_arrows(draw_mode_t what); - static void draw_overlay_icons(draw_mode_t what); - static void draw_fine_motion(draw_mode_t what); - static void draw_buttons(draw_mode_t what); - public: - static void loadBitmaps(); - static void unlockMotors(); - - static void setStatusMessage(const char *); - static void setStatusMessage(progmem_str); - - static void onRedraw(draw_mode_t); - - static bool onTouchStart(uint8_t tag); - static bool onTouchHeld(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); - - }; -#endif +#include "base_screen.h" +#include "base_numeric_adjustment_screen.h" +#include "dialog_box_base_class.h" #if ENABLED(TOUCH_UI_LULZBOT_BIO) - class BioPrintingDialogBox : public BaseScreen, public CachedScreen { - private: - static void draw_status_message(draw_mode_t, const char * const); - static void draw_progress(draw_mode_t); - static void draw_time_remaining(draw_mode_t); - static void draw_interaction_buttons(draw_mode_t); - public: - static void onRedraw(draw_mode_t); + #include "bio_status_screen.h" + #include "bio_main_menu.h" + #include "bio_tune_menu.h" + #include "bio_advanced_settings.h" + #include "bio_printing_dialog_box.h" + #include "bio_confirm_home_xyz.h" + #include "bio_confirm_home_e.h" - static void show(); +#elif ENABLED(TOUCH_UI_COCOA_PRESS) + #include "cocoa_press_status_screen.h" + #include "cocoa_press_main_menu.h" + #include "cocoa_press_advanced_settings.h" + #include "cocoa_press_preheat_menu.h" + #include "cocoa_press_preheat_screen.h" + #include "cocoa_press_unload_cartridge.h" + #include "cocoa_press_load_chocolate.h" + #include "cocoa_press_move_xyz_screen.h" + #include "cocoa_press_move_e_screen.h" + #include "tune_menu.h" - static void setStatusMessage(const char *); - static void setStatusMessage(progmem_str); - - static void onIdle(); - static bool onTouchEnd(uint8_t tag); - }; - - class BioConfirmHomeXYZ : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - class BioConfirmHomeE : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; +#else + #include "status_screen.h" + #include "main_menu.h" + #include "advanced_settings_menu.h" + #include "tune_menu.h" #endif -class MainMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; +#include "boot_screen.h" +#include "about_screen.h" +#include "kill_screen.h" +#include "alert_dialog_box.h" +#include "spinner_dialog_box.h" +#include "restore_failsafe_dialog_box.h" +#include "save_settings_dialog_box.h" +#include "confirm_start_print_dialog_box.h" +#include "confirm_abort_print_dialog_box.h" +#include "confirm_user_request_alert_box.h" +#include "touch_calibration_screen.h" +#include "touch_registers_screen.h" +#include "change_filament_screen.h" +#include "move_axis_screen.h" +#include "steps_screen.h" +#include "stepper_current_screen.h" +#include "feedrate_percent_screen.h" +#include "max_velocity_screen.h" +#include "max_acceleration_screen.h" +#include "default_acceleration_screen.h" +#include "temperature_screen.h" +#include "interface_sounds_screen.h" +#include "interface_settings_screen.h" +#include "lock_screen.h" +#include "endstop_state_screen.h" +#include "display_tuning_screen.h" +#include "media_player_screen.h" -class TuneMenu : public BaseScreen, public CachedScreen { - private: - static void pausePrint(); - static void resumePrint(); - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class TouchCalibrationScreen : public BaseScreen, public UncachedScreen { - public: - static void onRefresh(); - static void onEntry(); - static void onRedraw(draw_mode_t); - static void onIdle(); -}; - -class TouchRegistersScreen : public BaseScreen, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class AdvancedSettingsMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class ChangeFilamentScreen : public BaseScreen, public CachedScreen { - private: - static uint8_t getSoftenTemp(); - static ExtUI::extruder_t getExtruder(); - static void drawTempGradient(uint16_t x, uint16_t y, uint16_t w, uint16_t h); - static uint32_t getTempColor(uint32_t temp); - static void doPurge(); - public: - static void onEntry(); - static void onExit(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - static bool onTouchHeld(uint8_t tag); - static void onIdle(); -}; - -class BaseNumericAdjustmentScreen : public BaseScreen { - public: - enum precision_default_t { - DEFAULT_LOWEST, - DEFAULT_MIDRANGE, - DEFAULT_HIGHEST - }; - - protected: - class widgets_t { - private: - draw_mode_t _what; - uint8_t _line; - uint32_t _color; - uint8_t _decimals; - progmem_str _units; - enum style_t { - BTN_NORMAL, - BTN_ACTION, - BTN_TOGGLE, - BTN_DISABLED, - TEXT_AREA, - TEXT_LABEL - } _style; - - protected: - void _draw_increment_btn(CommandProcessor &, uint8_t line, const uint8_t tag); - void _button(CommandProcessor &, uint8_t tag, int16_t x, int16_t y, int16_t w, int16_t h, progmem_str, bool enabled = true, bool highlight = false); - void _button_style(CommandProcessor &cmd, style_t style); - public: - widgets_t(draw_mode_t); - - widgets_t &color(uint32_t color) {_color = color; return *this;} - widgets_t &units(progmem_str units) {_units = units; return *this;} - widgets_t &draw_mode(draw_mode_t what) {_what = what; return *this;} - widgets_t &precision(uint8_t decimals, precision_default_t = DEFAULT_HIGHEST); - - void heading (progmem_str label); - void adjuster_sram_val (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); - void adjuster (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); - void adjuster (uint8_t tag, progmem_str label, float value=0, bool is_enabled = true); - void button (uint8_t tag, progmem_str label, bool is_enabled = true); - void text_field (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); - void two_buttons (uint8_t tag1, progmem_str label1, - uint8_t tag2, progmem_str label2, bool is_enabled = true); - void toggle (uint8_t tag, progmem_str label, bool value, bool is_enabled = true); - void home_buttons (uint8_t tag); - void increments (); - }; - - static float getIncrement(); - - public: - static void onEntry(); - static bool onTouchEnd(uint8_t tag); -}; - -class BaseMoveAxisScreen : public BaseNumericAdjustmentScreen { - private: - static float getManualFeedrate(uint8_t axis, float increment_mm); - public: - static void setManualFeedrate(ExtUI::axis_t, float increment_mm); - static void setManualFeedrate(ExtUI::extruder_t, float increment_mm); - - static void onEntry(); - static bool onTouchHeld(uint8_t tag); -}; - -class MoveAxisScreen : public BaseMoveAxisScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static void onIdle(); -}; - -class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; +#if ENABLED(PRINTCOUNTER) + #include "statistics_screen.h" +#endif #if HAS_TRINAMIC_CONFIG - class StepperCurrentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; - - class StepperBumpSensitivityScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "stepper_current_screen.h" + #include "stepper_bump_sensitivity_screen.h" #endif #if HAS_MULTI_HOTEND - class NozzleOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "nozzle_offsets_screen.h" #endif #if HAS_LEVELING - - class LevelingMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - + #include "leveling_menu.h" #if HAS_BED_PROBE - class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "z_offset_screen.h" #endif - #if HAS_MESH + #include "bed_mesh_screen.h" + #endif +#endif - class BedMeshScreen : public BaseScreen, public CachedScreen { - private: - enum MeshOpts { - USE_POINTS = 0x01, - USE_COLORS = 0x02, - USE_TAGS = 0x04, - USE_HIGHLIGHT = 0x08, - USE_AUTOSCALE = 0x10 - }; - - static uint8_t pointToTag(uint8_t x, uint8_t y); - static bool tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y); - static float getHightlightedValue(); - static void drawHighlightedPointValue(); - static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); - - public: - static void onMeshUpdate(const int8_t x, const int8_t y, const float val); - static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - - static void startMeshProbe(); - }; - - #endif // HAS_MESH - -#endif // HAS_LEVELING +#if ENABLED(CALIBRATION_GCODE) + #include "confirm_auto_calibration_dialog_box.h" +#endif #if ENABLED(BABYSTEPPING) - class NudgeNozzleScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static bool onTouchHeld(uint8_t tag); - static void onIdle(); - }; + #include "nudge_nozzle_screen.h" #endif #if ENABLED(BACKLASH_GCODE) - class BacklashCompensationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "backlash_compensation_screen.h" #endif -class FeedratePercentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -class MaxVelocityScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -class MaxAccelerationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -class DefaultAccelerationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - #if HAS_JUNCTION_DEVIATION - class JunctionDeviationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "junction_deviation_screen.h" #else - class JerkScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "jerk_screen.h" #endif #if ENABLED(CASE_LIGHT_ENABLE) - class CaseLightScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "case_light_screen.h" #endif #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - class FilamentMenu : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; + #include "filament_menu.h" #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) - class FilamentRunoutScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "filament_runout_screen.h" #endif #if ENABLED(LIN_ADVANCE) - class LinearAdvanceScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; + #include "linear_advance_screen.h" #endif -class TemperatureScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -class InterfaceSoundsScreen : public BaseScreen, public CachedScreen { - public: - enum event_t { - PRINTING_STARTED = 0, - PRINTING_FINISHED = 1, - PRINTING_FAILED = 2, - - NUM_EVENTS - }; - - private: - friend class InterfaceSettingsScreen; - - static uint8_t event_sounds[NUM_EVENTS]; - - static const char* getSoundSelection(event_t); - static void toggleSoundSelection(event_t); - static void setSoundSelection(event_t, const FTDI::SoundPlayer::sound_t*); - - public: - static void playEventSound(event_t, FTDI::play_mode_t = FTDI::PLAY_ASYNCHRONOUS); - - static void defaultSettings(); - - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; - -class InterfaceSettingsScreen : public BaseScreen, public CachedScreen { - private: - struct persistent_data_t { - uint32_t touch_transform_a; - uint32_t touch_transform_b; - uint32_t touch_transform_c; - uint32_t touch_transform_d; - uint32_t touch_transform_e; - uint32_t touch_transform_f; - uint16_t passcode; - uint8_t display_brightness; - int8_t display_h_offset_adj; - int8_t display_v_offset_adj; - uint8_t sound_volume; - uint8_t bit_flags; - uint8_t event_sounds[InterfaceSoundsScreen::NUM_EVENTS]; - }; - - public: - #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - static bool backupEEPROM(); - #endif - - static void saveSettings(char *); - static void loadSettings(const char *); - static void defaultSettings(); - static void failSafeSettings(); - - static void onStartup(); - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; - -class LockScreen : public BaseScreen, public CachedScreen { - private: - friend InterfaceSettingsScreen; - - static uint16_t passcode; - - static char & message_style(); - static uint16_t compute_checksum(); - static void onPasscodeEntered(); - public: - static bool is_enabled(); - static void check_passcode(); - static void enable(); - static void disable(); - - static void set_hash(uint16_t pass) {passcode = pass;}; - static uint16_t get_hash() {return passcode;}; - - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - #if ENABLED(SDSUPPORT) - - class FilesScreen : public BaseScreen, public CachedScreen { - private: - #if ENABLED(TOUCH_UI_PORTRAIT) - static constexpr uint8_t header_h = 2; - static constexpr uint8_t footer_h = 2; - static constexpr uint8_t files_per_page = 11; - #else - static constexpr uint8_t header_h = 1; - static constexpr uint8_t footer_h = 1; - static constexpr uint8_t files_per_page = 6; - #endif - - static uint8_t getTagForLine(uint8_t line) {return line + 2;} - static uint8_t getLineForTag(uint8_t tag) {return tag - 2;} - static uint16_t getFileForTag(uint8_t tag); - static uint16_t getSelectedFileIndex(); - - inline static const char *getSelectedShortFilename() {return getSelectedFilename(false);} - inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);} - static const char *getSelectedFilename(bool longName); - - static void drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted); - static void drawFileList(); - static void drawHeader(); - static void drawFooter(); - static void drawSelectedFile(); - - static void gotoPage(uint8_t); - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); - }; - -#endif // SDSUPPORT - -class EndstopStatesScreen : public BaseScreen, public UncachedScreen { - public: - static void onEntry(); - static void onExit(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; - -class DisplayTuningScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -#if ENABLED(TOUCH_UI_DEVELOPER_MENU) - - class DeveloperMenu : public BaseScreen, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - class ConfirmEraseFlashDialogBox : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - class WidgetsScreen : public BaseScreen, public UncachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static void onIdle(); - }; - - class StressTestScreen : public BaseScreen, public UncachedScreen { - private: - static void drawDots(uint16_t x, uint16_t y, uint16_t h, uint16_t v); - static bool watchDogTestNow(); - static void recursiveLockup(); - static void iterativeLockup(); - static void runTestOnBootup(bool enable); - - public: - static void startupCheck(); - - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); - }; - -#endif // TOUCH_UI_DEVELOPER_MENU - -class MediaPlayerScreen : public BaseScreen, public UncachedScreen { - private: - typedef int16_t media_streamer_func_t(void *obj, void *buff, size_t bytes); - - public: - static bool playCardMedia(); - static bool playBootMedia(); - - static void onEntry(); - static void onRedraw(draw_mode_t); - - static void playStream(void *obj, media_streamer_func_t*); -}; - -#if NUM_LANGUAGES > 1 - class LanguageMenu : public BaseScreen, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; + #include "files_screen.h" #endif -#if ENABLED(TOUCH_UI_COCOA_PRESS) +#if ENABLED(CUSTOM_USER_MENUS) + #include "custom_user_menus.h" +#endif - class PreheatMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; +#if ENABLED(TOUCH_UI_DEVELOPER_MENU) + #include "developer_menu.h" + #include "confirm_erase_flash_dialog_box.h" + #include "widget_demo_screen.h" + #include "stress_test_screen.h" +#endif - class PreheatTimerScreen : public BaseScreen, public CachedScreen { - private: - static uint16_t secondsRemaining(); +#if NUM_LANGUAGES > 1 + #include "language_menu.h" +#endif - static void draw_message(draw_mode_t); - static void draw_time_remaining(draw_mode_t); - static void draw_interaction_buttons(draw_mode_t); - static void draw_adjuster(draw_mode_t, uint8_t tag, progmem_str label, float value, int16_t x, int16_t y, int16_t w, int16_t h); - public: - static void onRedraw(draw_mode_t); - - static void onEntry(); - static void onIdle(); - static bool onTouchHeld(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - }; - - class UnloadCartridgeScreen : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static bool onTouchHeld(uint8_t tag); - }; - - class LoadChocolateScreen : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static bool onTouchHeld(uint8_t tag); - }; - - class MoveXYZScreen : public BaseMoveAxisScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static void onIdle(); - }; - - class MoveEScreen : public BaseMoveAxisScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static void onIdle(); - }; - -#endif // TOUCH_UI_COCOA_PRESS +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp index 2318a0d108..7483261e3c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp @@ -21,15 +21,16 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_SPINNER_DIALOG_BOX + using namespace FTDI; using namespace ExtUI; +constexpr static SpinnerDialogBoxData &mydata = screen_data.SpinnerDialogBox; + void SpinnerDialogBox::onRedraw(draw_mode_t) { } @@ -37,7 +38,7 @@ void SpinnerDialogBox::show(const progmem_str message) { drawMessage(message); drawSpinner(); storeBackground(); - screen_data.SpinnerDialog.auto_hide = false; + mydata.auto_hide = false; } void SpinnerDialogBox::hide() { @@ -53,16 +54,16 @@ void SpinnerDialogBox::enqueueAndWait_P(const progmem_str message, const progmem show(message); GOTO_SCREEN(SpinnerDialogBox); ExtUI::injectCommands_P((const char*)commands); - screen_data.SpinnerDialog.auto_hide = true; + mydata.auto_hide = true; } void SpinnerDialogBox::onIdle() { reset_menu_timeout(); - if (screen_data.SpinnerDialog.auto_hide && !commandsInQueue()) { - screen_data.SpinnerDialog.auto_hide = false; + if (mydata.auto_hide && !commandsInQueue()) { + mydata.auto_hide = false; hide(); GOTO_PREVIOUS(); } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_SPINNER_DIALOG_BOX diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.h new file mode 100644 index 0000000000..c5f0ae8e9f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.h @@ -0,0 +1,41 @@ +/************************ + * spinner_dialog_box.h * + ************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_SPINNER_DIALOG_BOX +#define FTDI_SPINNER_DIALOG_BOX_CLASS SpinnerDialogBox + +struct SpinnerDialogBoxData { + bool auto_hide; +}; + +class SpinnerDialogBox : public DialogBoxBaseClass, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static void onIdle(); + + static void show(const progmem_str); + static void hide(); + static void enqueueAndWait_P(const progmem_str commands); + static void enqueueAndWait_P(const progmem_str message, const progmem_str commands); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp index 0e224da967..2d62d5349b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, PRINTCOUNTER) - #include "screens.h" +#ifdef FTDI_STATISTICS_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -75,4 +74,4 @@ bool StatisticsScreen::onTouchEnd(uint8_t tag) { } } -#endif // TOUCH_UI_FTDI_EVE && PRINTCOUNTER +#endif // FTDI_STATISTICS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.h new file mode 100644 index 0000000000..4176f54101 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.h @@ -0,0 +1,32 @@ +/*********************** + * statistics_screen.h * + ***********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_STATISTICS_SCREEN +#define FTDI_STATISTICS_SCREEN_CLASS StatisticsScreen + +class StatisticsScreen : public BaseScreen, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index 51f50343e0..956795c977 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -21,12 +21,11 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_STATUS_SCREEN + #include "../archim2-flash/flash_storage.h" using namespace FTDI; @@ -462,4 +461,4 @@ bool StatusScreen::onTouchEnd(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_STATUS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.h new file mode 100644 index 0000000000..3a2ba1746c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.h @@ -0,0 +1,45 @@ +/******************* + * status_screen.h * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_STATUS_SCREEN +#define FTDI_STATUS_SCREEN_CLASS StatusScreen + +class StatusScreen : public BaseScreen, public CachedScreen { + private: + static void draw_axis_position(draw_mode_t); + static void draw_temperature(draw_mode_t); + static void draw_progress(draw_mode_t); + static void draw_interaction_buttons(draw_mode_t); + static void draw_status_message(draw_mode_t, const char * const); + static void _format_time(char *outstr, uint32_t time); + public: + static void loadBitmaps(); + static void setStatusMessage(const char *); + static void setStatusMessage(progmem_str); + static void onRedraw(draw_mode_t); + static void onStartup(); + static void onEntry(); + static void onIdle(); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp index 84d76dcefa..701fb78062 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp @@ -1,5 +1,5 @@ -/************************************** - * stepper_bump_sensiivity_screen.cpp * +/*************************************** + * stepper_bump_sensitivity_screen.cpp * **************************************/ /**************************************************************************** @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_TRINAMIC_CONFIG) - #include "screens.h" +#ifdef FTDI_STEPPER_BUMP_SENSITIVITY_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -56,4 +55,4 @@ bool StepperBumpSensitivityScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && HAS_TRINAMIC_CONFIG +#endif // FTDI_STEPPER_BUMP_SENSITIVITY_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.h new file mode 100644 index 0000000000..b37b8014e8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.h @@ -0,0 +1,32 @@ +/************************************* + * stepper_bump_sensitivity_screen.h * + *************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_STEPPER_BUMP_SENSITIVITY_SCREEN +#define FTDI_STEPPER_BUMP_SENSITIVITY_SCREEN_CLASS StepperBumpSensitivityScreen + +class StepperBumpSensitivityScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp index d6e36c1efa..4b63b1f3e4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_TRINAMIC_CONFIG) - #include "screens.h" +#ifdef FTDI_STEPPER_CURRENT_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -124,4 +123,4 @@ bool StepperCurrentScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_STEPPER_CURRENT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.h new file mode 100644 index 0000000000..9186eb1637 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.h @@ -0,0 +1,32 @@ +/**************************** + * stepper_current_screen.h * + ****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_STEPPER_CURRENT_SCREEN +#define FTDI_STEPPER_CURRENT_SCREEN_CLASS StepperCurrentScreen + +class StepperCurrentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp index e9bc50ae45..ec812b776b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_STEPS_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -83,4 +82,4 @@ bool StepsScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_STEPS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.h new file mode 100644 index 0000000000..68a3ced8fa --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.h @@ -0,0 +1,32 @@ +/****************** + * steps_screen.h * + ******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_STEPS_SCREEN +#define FTDI_STEPS_SCREEN_CLASS StepsScreen + +class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp index 6c4aab6d31..37fe81938e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -21,12 +21,11 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - #include "screens.h" #include "screen_data.h" +#ifdef FTDI_STRESS_TEST_SCREEN + #define STRESS_TEST_CHANGE_INTERVAL 6000 #define GRID_COLS 4 @@ -36,6 +35,8 @@ using namespace FTDI; using namespace Theme; using namespace ExtUI; +constexpr static StressTestScreenData &mydata = screen_data.StressTestScreen; + void StressTestScreen::drawDots(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { CommandProcessor cmd; for (uint8_t i = 0; i < 100; i++) { @@ -47,8 +48,8 @@ void StressTestScreen::drawDots(uint16_t x, uint16_t y, uint16_t w, uint16_t h) } bool StressTestScreen::watchDogTestNow() { - return screen_data.StressTest.next_watchdog_trigger && - ELAPSED(millis(), screen_data.StressTest.next_watchdog_trigger); + return mydata.next_watchdog_trigger && + ELAPSED(millis(), mydata.next_watchdog_trigger); } void StressTestScreen::onRedraw(draw_mode_t) { @@ -58,7 +59,7 @@ void StressTestScreen::onRedraw(draw_mode_t) { .cmd(CLEAR(true,true,true)) .cmd(COLOR_RGB(bg_text_enabled)) .font(font_medium) - .text(BTN_POS(1,1), BTN_SIZE(4,1), progmem_str(screen_data.StressTest.message)); + .text(BTN_POS(1,1), BTN_SIZE(4,1), progmem_str(mydata.message)); drawDots(BTN_POS(1,3), BTN_SIZE(4,4)); @@ -92,8 +93,8 @@ void StressTestScreen::startupCheck() { } void StressTestScreen::onEntry() { - screen_data.StressTest.next_watchdog_trigger = millis() + 10000 + random(40000); - screen_data.StressTest.message = PSTR("Test 1: Stress testing..."); + mydata.next_watchdog_trigger = millis() + 10000 + random(40000); + mydata.message = PSTR("Test 1: Stress testing..."); // Turn off heaters. setTargetTemp_celsius(0, E0); @@ -104,13 +105,13 @@ void StressTestScreen::onEntry() { } void StressTestScreen::recursiveLockup() { - screen_data.StressTest.message = PSTR("Test 2: Printer will restart."); + mydata.message = PSTR("Test 2: Printer will restart."); current_screen.onRefresh(); recursiveLockup(); } void StressTestScreen::iterativeLockup() { - screen_data.StressTest.message = PSTR("Test 3: Printer will restart."); + mydata.message = PSTR("Test 3: Printer will restart."); for (;;) current_screen.onRefresh(); } @@ -146,4 +147,4 @@ void StressTestScreen::onIdle() { BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_STRESS_TEST_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.h new file mode 100644 index 0000000000..f35f11adb6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.h @@ -0,0 +1,48 @@ +/************************ + * stress_test_screen.h * + ************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_STRESS_TEST_SCREEN +#define FTDI_STRESS_TEST_SCREEN_CLASS StressTestScreen + +struct StressTestScreenData { + uint32_t next_watchdog_trigger; + const char* message; +}; + +class StressTestScreen : public BaseScreen, public UncachedScreen { + private: + static void drawDots(uint16_t x, uint16_t y, uint16_t h, uint16_t v); + static bool watchDogTestNow(); + static void recursiveLockup(); + static void iterativeLockup(); + static void runTestOnBootup(bool enable); + + public: + static void startupCheck(); + + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp index bdd434b5de..ee78591230 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp @@ -1,6 +1,6 @@ -/******************* - * boot_screen.cpp * - *******************/ +/************************** + * temperature_screen.cpp * + **************************/ /**************************************************************************** * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_TEMPERATURE_SCREEN + using namespace FTDI; using namespace Theme; using namespace ExtUI; @@ -116,4 +115,4 @@ bool TemperatureScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_TEMPERATURE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.h new file mode 100644 index 0000000000..de928c8978 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.h @@ -0,0 +1,32 @@ +/************************ + * temperature_screen.h * + ************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_TEMPERATURE_SCREEN +#define FTDI_TEMPERATURE_SCREEN_CLASS TemperatureScreen + +class TemperatureScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp index b5312add5a..37f0c5d33a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "screens.h" +#ifdef FTDI_TOUCH_CALIBRATION_SCREEN + using namespace FTDI; using namespace Theme; @@ -91,4 +90,4 @@ void TouchCalibrationScreen::onIdle() { } } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_TOUCH_CALIBRATION_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.h new file mode 100644 index 0000000000..b4e6cfb66c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.h @@ -0,0 +1,34 @@ +/****************************** + * touch_calibration_screen.h * + ******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_TOUCH_CALIBRATION_SCREEN +#define FTDI_TOUCH_CALIBRATION_SCREEN_CLASS TouchCalibrationScreen + +class TouchCalibrationScreen : public BaseScreen, public UncachedScreen { + public: + static void onRefresh(); + static void onEntry(); + static void onRedraw(draw_mode_t); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp index 3739413213..01c7169a3e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - #include "screens.h" +#ifdef FTDI_TOUCH_REGISTERS_SCREEN + using namespace FTDI; using namespace Theme; @@ -83,4 +82,4 @@ void TouchRegistersScreen::onRedraw(draw_mode_t) { return true; } -#endif // TOUCH_UI_FTDI_EVE +#endif // FTDI_TOUCH_REGISTERS_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.h new file mode 100644 index 0000000000..b6d4ba8e00 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.h @@ -0,0 +1,32 @@ +/**************************** + * touch_registers_screen.h * + ****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_TOUCH_REGISTERS_SCREEN +#define FTDI_TOUCH_REGISTERS_SCREEN_CLASS TouchRegistersScreen + +class TouchRegistersScreen : public BaseScreen, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index 5a290109ff..c7ff97ea65 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && DISABLED(TOUCH_UI_LULZBOT_BIO) - #include "screens.h" +#ifdef FTDI_TUNE_MENU + #include "../../../../../feature/host_actions.h" using namespace FTDI; @@ -153,4 +152,4 @@ void TuneMenu::resumePrint() { GOTO_SCREEN(StatusScreen); } -#endif // TOUCH_UI_FTDI_EVE && !TOUCH_UI_LULZBOT_BIO +#endif // FTDI_TUNE_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.h new file mode 100644 index 0000000000..b8f9373b19 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.h @@ -0,0 +1,35 @@ +/*************** + * tune_menu.h * + ***************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_TUNE_MENU +#define FTDI_TUNE_MENU_CLASS TuneMenu + +class TuneMenu : public BaseScreen, public CachedScreen { + private: + static void pausePrint(); + static void resumePrint(); + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp index 96887102dc..451b7e786e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - #include "screens.h" +#ifdef FTDI_WIDGET_DEMO_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -155,4 +154,4 @@ void WidgetsScreen::onIdle() { BaseScreen::onIdle(); } -#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_DEVELOPER_MENU +#endif // FTDI_WIDGET_DEMO_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.h new file mode 100644 index 0000000000..e0f7422d12 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.h @@ -0,0 +1,34 @@ +/************************ + * widget_demo_screen.h * + ************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_WIDGET_DEMO_SCREEN +#define FTDI_WIDGET_DEMO_SCREEN_CLASS WidgetsScreen + +class WidgetsScreen : public BaseScreen, public UncachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static void onIdle(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp index 0acfbb07d6..51c9ca79b0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp @@ -21,11 +21,10 @@ ****************************************************************************/ #include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && BOTH(HAS_LEVELING, HAS_BED_PROBE) - #include "screens.h" +#ifdef FTDI_Z_OFFSET_SCREEN + using namespace FTDI; using namespace ExtUI; using namespace Theme; @@ -51,4 +50,4 @@ bool ZOffsetScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // TOUCH_UI_FTDI_EVE && HAS_BED_PROBE +#endif // FTDI_Z_OFFSET_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.h new file mode 100644 index 0000000000..24f38e827c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.h @@ -0,0 +1,32 @@ +/*********************** + * z_offset_screen.h * + ***********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_Z_OFFSET_SCREEN +#define FTDI_Z_OFFSET_SCREEN_CLASS ZOffsetScreen + +class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h index 8310305e61..92a2fb12b5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h @@ -31,4 +31,3 @@ extern void lv_clear_tmc_current_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif - diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h index 1187741ad6..77ba5925a3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h @@ -33,6 +33,3 @@ extern void disp_wifi_state(); #ifdef __cplusplus } /* C-declarations for C++ */ #endif - - - diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h index f9896edcc8..2f9c9f5745 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h @@ -48,4 +48,3 @@ extern TIPS_DISP tips_disp; #ifdef __cplusplus } /* C-declarations for C++ */ #endif - From d7fbb1512a20d805459ea7733fb55984c9f65139 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 14 Dec 2020 00:24:01 -0600 Subject: [PATCH 0986/1370] Melzi, comments cleanup --- Marlin/src/core/boards.h | 2 -- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI.h | 2 ++ 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index afb6887766..0f076b1b2a 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -415,5 +415,3 @@ #define _MB_1(B) (defined(BOARD_##B) && MOTHERBOARD==BOARD_##B) #define MB(V...) DO(MB,||,V) - -#define IS_MELZI MB(MELZI, MELZI_CREALITY, MELZI_MAKR3D, MELZI_MALYAN, MELZI_TRONXY, MELZI_V2) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b3beedfe80..964f894e9e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1907,7 +1907,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if !HAS_HEATER_0 && EXTRUDERS #error "HEATER_0_PIN not defined for this board." #elif !ANY_PIN(TEMP_0, MAX6675_SS) - #error "TEMP_0_PIN not defined for this board." + #error "TEMP_0_PIN or MAX6675_SS not defined for this board." #elif ((defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && !PINS_EXIST(E0_STEP, E0_DIR)) #error "E0_STEP_PIN or E0_DIR_PIN not defined for this board." #elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PINS_EXIST(E0_STEP, E0_DIR) || !HAS_E0_ENABLE)) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index a43940f8f0..80d61d9c47 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -29,7 +29,7 @@ #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." #endif -// If you have the Big tree tech driver expantion module, enable HAS_BTT_EXP_MOT +// If you have the Big tree tech driver expansion module, enable HAS_BTT_EXP_MOT // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT //#define HAS_BTT_EXP_MOT 1 diff --git a/Marlin/src/pins/sanguino/pins_MELZI.h b/Marlin/src/pins/sanguino/pins_MELZI.h index 887aae1858..de4dd1b01d 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI.h +++ b/Marlin/src/pins/sanguino/pins_MELZI.h @@ -29,4 +29,6 @@ #define BOARD_INFO_NAME "Melzi" #endif +#define IS_MELZI 1 + #include "pins_SANGUINOLOLU_12.h" From 243c8b4e1a9859a9801936ad943688fb1e106baa Mon Sep 17 00:00:00 2001 From: Chris Pepper Date: Sun, 7 Feb 2021 20:46:24 +0000 Subject: [PATCH 0987/1370] Improve RPi host kernel panic mitigation It was still possible to cause a Kernel panic, this additional 500ms delay before disconnect appears to mitigate it completely. --- Marlin/src/HAL/LPC1768/HAL.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index f567f26c9e..26a2c0e7db 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -64,8 +64,9 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { } void flashFirmware(const int16_t) { + delay(500); // Give OS time to disconnect USB_Connect(false); // USB clear connection - delay(2000); // Give OS time to notice + delay(1000); // Give OS time to notice NVIC_SystemReset(); } From 80c1be919f46aa02205d4fad2d48d571566925e6 Mon Sep 17 00:00:00 2001 From: Simon Jouet Date: Sun, 7 Feb 2021 22:56:39 +0000 Subject: [PATCH 0988/1370] Fix ESP32 I2S init placement (#21019) --- Marlin/src/HAL/ESP32/HAL.cpp | 6 ++++-- Marlin/src/HAL/ESP32/HAL.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index 6ff1446b1c..fb5f531b22 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -90,8 +90,6 @@ volatile int numPWMUsed = 0, #endif -void HAL_init() { TERN_(I2S_STEPPER_STREAM, i2s_init()); } - void HAL_init_board() { #if ENABLED(ESP3D_WIFISUPPORT) @@ -126,6 +124,10 @@ void HAL_init_board() { #endif #endif + // Initialize the i2s peripheral only if the I2S stepper stream is enabled. + // The following initialization is performed after Serial1 and Serial2 are defined as + // their native pins might conflict with the i2s stream even when they are remapped. + TERN_(I2S_STEPPER_STREAM, i2s_init()); } void HAL_idletask() { diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 3dc27c6493..4d1db571d0 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -139,7 +139,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin); #define HAL_IDLETASK 1 #define BOARD_INIT() HAL_init_board(); void HAL_idletask(); -void HAL_init(); +inline void HAL_init() {} void HAL_init_board(); // From 47b872f5d00678be751891e4a6baa4f9eb494811 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 7 Feb 2021 16:58:06 -0600 Subject: [PATCH 0989/1370] Fix TEMP_0_TR_ENABLE, rename temp conditions (#21016) --- Marlin/Configuration_adv.h | 8 +- Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/inc/Conditionals_post.h | 180 +++++---- Marlin/src/inc/SanityCheck.h | 52 +-- Marlin/src/module/temperature.cpp | 361 ++++++++--------- Marlin/src/module/temperature.h | 33 +- Marlin/src/module/thermistor/thermistors.h | 376 +++++++++--------- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 2 +- platformio.ini | 2 +- 9 files changed, 525 insertions(+), 493 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a3699128b4..f615a54671 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -113,6 +113,12 @@ #define CHAMBER_BETA 3950 // Beta value #endif +#if TEMP_SENSOR_PROBE == 1000 + #define PROBE_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define PROBE_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define PROBE_BETA 3950 // Beta value +#endif + // // Hephestos 2 24V heated bed upgrade kit. // https://store.bq.com/en/heated-bed-kit-hephestos2 @@ -331,7 +337,7 @@ * High Temperature Thermistor Support * * Thermistors able to support high temperature tend to have a hard time getting - * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * good readings at room and lower temperatures. This means TEMP_SENSOR_X_RAW_LO_TEMP * will probably be caught when the heating element first turns on during the * preheating process, which will trigger a min_temp_error as a safety measure * and force stop everything. diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 626f934ddc..df383d8a96 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -938,10 +938,10 @@ void setup() { SETUP_RUN(HAL_init()); // Init and disable SPI thermocouples - #if HEATER_0_USES_MAX6675 + #if TEMP_SENSOR_0_IS_MAX6675 OUT_WRITE(MAX6675_SS_PIN, HIGH); // Disable #endif - #if HEATER_1_USES_MAX6675 + #if TEMP_SENSOR_1_IS_MAX6675 OUT_WRITE(MAX6675_SS2_PIN, HIGH); // Disable #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index acf8f3620b..04c4eb120d 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -404,30 +404,33 @@ #endif #if TEMP_SENSOR_0 == -5 || TEMP_SENSOR_0 == -3 || TEMP_SENSOR_0 == -2 - #define HEATER_0_USES_MAX6675 1 + #define TEMP_SENSOR_0_IS_MAX_TC 1 + #define HAS_MAX_TC 1 #if TEMP_SENSOR_0 == -3 - #define HEATER_0_MAX6675_TMIN -270 - #define HEATER_0_MAX6675_TMAX 1800 + #define TEMP_SENSOR_0_MAX_TC_TMIN -270 + #define TEMP_SENSOR_0_MAX_TC_TMAX 1800 #else - #define HEATER_0_MAX6675_TMIN 0 - #define HEATER_0_MAX6675_TMAX 1024 + #define TEMP_SENSOR_0_MAX_TC_TMIN 0 + #define TEMP_SENSOR_0_MAX_TC_TMAX 1024 #endif #if TEMP_SENSOR_0 == -5 - #define MAX6675_0_IS_MAX31865 1 + #define TEMP_SENSOR_0_IS_MAX31865 1 #elif TEMP_SENSOR_0 == -3 - #define MAX6675_0_IS_MAX31855 1 + #define TEMP_SENSOR_0_IS_MAX31855 1 + #elif TEMP_SENSOR_0 == -2 + #define TEMP_SENSOR_0_IS_MAX6675 1 #endif #elif TEMP_SENSOR_0 == -4 - #define HEATER_0_USES_AD8495 1 + #define TEMP_SENSOR_0_IS_AD8495 1 #elif TEMP_SENSOR_0 == -1 - #define HEATER_0_USES_AD595 1 + #define TEMP_SENSOR_0_IS_AD595 1 #elif TEMP_SENSOR_0 > 0 - #define THERMISTOR_HEATER_0 TEMP_SENSOR_0 - #define HEATER_0_USES_THERMISTOR 1 + #define TEMP_SENSOR_0_THERMISTOR_ID TEMP_SENSOR_0 + #define TEMP_SENSOR_0_IS_THERMISTOR 1 #if TEMP_SENSOR_0 == 1000 - #define HEATER_0_USER_THERMISTOR 1 + #define TEMP_SENSOR_0_IS_CUSTOM 1 #elif TEMP_SENSOR_0 == 998 || TEMP_SENSOR_0 == 999 - #define HEATER_0_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_0_IS_DUMMY 1 #endif #else #undef HEATER_0_MINTEMP @@ -435,18 +438,21 @@ #endif #if TEMP_SENSOR_1 == -5 || TEMP_SENSOR_1 == -3 || TEMP_SENSOR_1 == -2 - #define HEATER_1_USES_MAX6675 1 + #define TEMP_SENSOR_1_IS_MAX_TC 1 + #define HAS_MAX_TC 1 #if TEMP_SENSOR_1 == -3 - #define HEATER_1_MAX6675_TMIN -270 - #define HEATER_1_MAX6675_TMAX 1800 + #define TEMP_SENSOR_1_MAX_TC_TMIN -270 + #define TEMP_SENSOR_1_MAX_TC_TMAX 1800 #else - #define HEATER_1_MAX6675_TMIN 0 - #define HEATER_1_MAX6675_TMAX 1024 + #define TEMP_SENSOR_1_MAX_TC_TMIN 0 + #define TEMP_SENSOR_1_MAX_TC_TMAX 1024 #endif #if TEMP_SENSOR_1 == -5 - #define MAX6675_1_IS_MAX31865 1 + #define TEMP_SENSOR_1_IS_MAX31865 1 #elif TEMP_SENSOR_1 == -3 - #define MAX6675_1_IS_MAX31855 1 + #define TEMP_SENSOR_1_IS_MAX31855 1 + #elif TEMP_SENSOR_1 == -2 + #define TEMP_SENSOR_1_IS_MAX6675 1 #endif #if TEMP_SENSOR_1 != TEMP_SENSOR_0 #if TEMP_SENSOR_1 == -5 @@ -458,37 +464,47 @@ #endif #endif #elif TEMP_SENSOR_1 == -4 - #define HEATER_1_USES_AD8495 1 + #define TEMP_SENSOR_1_IS_AD8495 1 #elif TEMP_SENSOR_1 == -1 - #define HEATER_1_USES_AD595 1 + #define TEMP_SENSOR_1_IS_AD595 1 #elif TEMP_SENSOR_1 > 0 - #define THERMISTOR_HEATER_1 TEMP_SENSOR_1 - #define HEATER_1_USES_THERMISTOR 1 + #define TEMP_SENSOR_1_THERMISTOR_ID TEMP_SENSOR_1 + #define TEMP_SENSOR_1_IS_THERMISTOR 1 #if TEMP_SENSOR_1 == 1000 - #define HEATER_1_USER_THERMISTOR 1 + #define TEMP_SENSOR_1_IS_CUSTOM 1 #elif TEMP_SENSOR_1 == 998 || TEMP_SENSOR_1 == 999 - #define HEATER_1_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_1_IS_DUMMY 1 #endif #else #undef HEATER_1_MINTEMP #undef HEATER_1_MAXTEMP #endif +#if TEMP_SENSOR_0_IS_MAX31855 || TEMP_SENSOR_1_IS_MAX31855 + #define HAS_MAX31855 1 +#endif +#if TEMP_SENSOR_0_IS_MAX31865 || TEMP_SENSOR_1_IS_MAX31865 + #define HAS_MAX31865 1 +#endif +#if TEMP_SENSOR_0_IS_MAX6675 || TEMP_SENSOR_1_IS_MAX6675 + #define HAS_MAX6675 1 +#endif + #if TEMP_SENSOR_2 == -4 - #define HEATER_2_USES_AD8495 1 + #define TEMP_SENSOR_2_IS_AD8495 1 #elif TEMP_SENSOR_2 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_2." #elif TEMP_SENSOR_2 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_2." #elif TEMP_SENSOR_2 == -1 - #define HEATER_2_USES_AD595 1 + #define TEMP_SENSOR_2_IS_AD595 1 #elif TEMP_SENSOR_2 > 0 - #define THERMISTOR_HEATER_2 TEMP_SENSOR_2 - #define HEATER_2_USES_THERMISTOR 1 + #define TEMP_SENSOR_2_THERMISTOR_ID TEMP_SENSOR_2 + #define TEMP_SENSOR_2_IS_THERMISTOR 1 #if TEMP_SENSOR_2 == 1000 - #define HEATER_2_USER_THERMISTOR 1 + #define TEMP_SENSOR_2_IS_CUSTOM 1 #elif TEMP_SENSOR_2 == 998 || TEMP_SENSOR_2 == 999 - #define HEATER_2_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_2_IS_DUMMY 1 #endif #else #undef HEATER_2_MINTEMP @@ -496,20 +512,20 @@ #endif #if TEMP_SENSOR_3 == -4 - #define HEATER_3_USES_AD8495 1 + #define TEMP_SENSOR_3_IS_AD8495 1 #elif TEMP_SENSOR_3 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_3." #elif TEMP_SENSOR_3 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_3." #elif TEMP_SENSOR_3 == -1 - #define HEATER_3_USES_AD595 1 + #define TEMP_SENSOR_3_IS_AD595 1 #elif TEMP_SENSOR_3 > 0 - #define THERMISTOR_HEATER_3 TEMP_SENSOR_3 - #define HEATER_3_USES_THERMISTOR 1 + #define TEMP_SENSOR_3_THERMISTOR_ID TEMP_SENSOR_3 + #define TEMP_SENSOR_3_IS_THERMISTOR 1 #if TEMP_SENSOR_3 == 1000 - #define HEATER_3_USER_THERMISTOR 1 + #define TEMP_SENSOR_3_IS_CUSTOM 1 #elif TEMP_SENSOR_3 == 998 || TEMP_SENSOR_3 == 999 - #define HEATER_3_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_3_IS_DUMMY 1 #endif #else #undef HEATER_3_MINTEMP @@ -517,20 +533,20 @@ #endif #if TEMP_SENSOR_4 == -4 - #define HEATER_4_USES_AD8495 1 + #define TEMP_SENSOR_4_IS_AD8495 1 #elif TEMP_SENSOR_4 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_4." #elif TEMP_SENSOR_4 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_4." #elif TEMP_SENSOR_4 == -1 - #define HEATER_4_USES_AD595 1 + #define TEMP_SENSOR_4_IS_AD595 1 #elif TEMP_SENSOR_4 > 0 - #define THERMISTOR_HEATER_4 TEMP_SENSOR_4 - #define HEATER_4_USES_THERMISTOR 1 + #define TEMP_SENSOR_4_THERMISTOR_ID TEMP_SENSOR_4 + #define TEMP_SENSOR_4_IS_THERMISTOR 1 #if TEMP_SENSOR_4 == 1000 - #define HEATER_4_USER_THERMISTOR 1 + #define TEMP_SENSOR_4_IS_CUSTOM 1 #elif TEMP_SENSOR_4 == 998 || TEMP_SENSOR_4 == 999 - #define HEATER_4_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_4_IS_DUMMY 1 #endif #else #undef HEATER_4_MINTEMP @@ -538,20 +554,20 @@ #endif #if TEMP_SENSOR_5 == -4 - #define HEATER_5_USES_AD8495 1 + #define TEMP_SENSOR_5_IS_AD8495 1 #elif TEMP_SENSOR_5 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_5." #elif TEMP_SENSOR_5 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_5." #elif TEMP_SENSOR_5 == -1 - #define HEATER_5_USES_AD595 1 + #define TEMP_SENSOR_5_IS_AD595 1 #elif TEMP_SENSOR_5 > 0 - #define THERMISTOR_HEATER_5 TEMP_SENSOR_5 - #define HEATER_5_USES_THERMISTOR 1 + #define TEMP_SENSOR_5_THERMISTOR_ID TEMP_SENSOR_5 + #define TEMP_SENSOR_5_IS_THERMISTOR 1 #if TEMP_SENSOR_5 == 1000 - #define HEATER_5_USER_THERMISTOR 1 + #define TEMP_SENSOR_5_IS_CUSTOM 1 #elif TEMP_SENSOR_5 == 998 || TEMP_SENSOR_5 == 999 - #define HEATER_5_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_5_IS_DUMMY 1 #endif #else #undef HEATER_5_MINTEMP @@ -559,20 +575,20 @@ #endif #if TEMP_SENSOR_6 == -4 - #define HEATER_6_USES_AD8495 1 + #define TEMP_SENSOR_6_IS_AD8495 1 #elif TEMP_SENSOR_6 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_6." #elif TEMP_SENSOR_6 == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_6." #elif TEMP_SENSOR_6 == -1 - #define HEATER_6_USES_AD595 1 + #define TEMP_SENSOR_6_IS_AD595 1 #elif TEMP_SENSOR_6 > 0 - #define THERMISTOR_HEATER_6 TEMP_SENSOR_6 - #define HEATER_6_USES_THERMISTOR 1 + #define TEMP_SENSOR_6_THERMISTOR_ID TEMP_SENSOR_6 + #define TEMP_SENSOR_6_IS_THERMISTOR 1 #if TEMP_SENSOR_6 == 1000 - #define HEATER_6_USER_THERMISTOR 1 + #define TEMP_SENSOR_6_IS_CUSTOM 1 #elif TEMP_SENSOR_6 == 998 || TEMP_SENSOR_6 == 999 - #define HEATER_6_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_6_IS_DUMMY 1 #endif #else #undef HEATER_6_MINTEMP @@ -580,20 +596,20 @@ #endif #if TEMP_SENSOR_7 == -4 - #define HEATER_7_USES_AD8495 1 + #define TEMP_SENSOR_7_IS_AD8495 1 #elif TEMP_SENSOR_7 == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_7." #elif TEMP_SENSOR_7 == -2 #error "MAX7775 Thermocouples (-2) not supported for TEMP_SENSOR_7." #elif TEMP_SENSOR_7 == -1 - #define HEATER_7_USES_AD595 1 + #define TEMP_SENSOR_7_IS_AD595 1 #elif TEMP_SENSOR_7 > 0 - #define THERMISTOR_HEATER_7 TEMP_SENSOR_7 - #define HEATER_7_USES_THERMISTOR 1 + #define TEMP_SENSOR_7_THERMISTOR_ID TEMP_SENSOR_7 + #define TEMP_SENSOR_7_IS_THERMISTOR 1 #if TEMP_SENSOR_7 == 1000 - #define HEATER_7_USER_THERMISTOR 1 + #define TEMP_SENSOR_7_IS_CUSTOM 1 #elif TEMP_SENSOR_7 == 998 || TEMP_SENSOR_7 == 999 - #define HEATER_7_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_7_IS_DUMMY 1 #endif #else #undef HEATER_7_MINTEMP @@ -601,20 +617,20 @@ #endif #if TEMP_SENSOR_BED == -4 - #define HEATER_BED_USES_AD8495 1 + #define TEMP_SENSOR_BED_IS_AD8495 1 #elif TEMP_SENSOR_BED == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_BED." #elif TEMP_SENSOR_BED == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_BED." #elif TEMP_SENSOR_BED == -1 - #define HEATER_BED_USES_AD595 1 + #define TEMP_SENSOR_BED_IS_AD595 1 #elif TEMP_SENSOR_BED > 0 - #define THERMISTORBED TEMP_SENSOR_BED - #define HEATER_BED_USES_THERMISTOR 1 + #define TEMP_SENSOR_BED_THERMISTOR_ID TEMP_SENSOR_BED + #define TEMP_SENSOR_BED_IS_THERMISTOR 1 #if TEMP_SENSOR_BED == 1000 - #define HEATER_BED_USER_THERMISTOR 1 + #define TEMP_SENSOR_BED_IS_CUSTOM 1 #elif TEMP_SENSOR_BED == 998 || TEMP_SENSOR_BED == 999 - #define HEATER_BED_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_BED_IS_DUMMY 1 #endif #else #undef BED_MINTEMP @@ -622,20 +638,20 @@ #endif #if TEMP_SENSOR_CHAMBER == -4 - #define HEATER_CHAMBER_USES_AD8495 1 + #define TEMP_SENSOR_CHAMBER_IS_AD8495 1 #elif TEMP_SENSOR_CHAMBER == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_CHAMBER." #elif TEMP_SENSOR_CHAMBER == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_CHAMBER." #elif TEMP_SENSOR_CHAMBER == -1 - #define HEATER_CHAMBER_USES_AD595 1 + #define TEMP_SENSOR_CHAMBER_IS_AD595 1 #elif TEMP_SENSOR_CHAMBER > 0 - #define THERMISTORCHAMBER TEMP_SENSOR_CHAMBER - #define HEATER_CHAMBER_USES_THERMISTOR 1 + #define TEMP_SENSOR_CHAMBER_THERMISTOR_ID TEMP_SENSOR_CHAMBER + #define TEMP_SENSOR_CHAMBER_IS_THERMISTOR 1 #if TEMP_SENSOR_CHAMBER == 1000 - #define HEATER_CHAMBER_USER_THERMISTOR 1 + #define TEMP_SENSOR_CHAMBER_IS_CUSTOM 1 #elif TEMP_SENSOR_CHAMBER == 998 || TEMP_SENSOR_CHAMBER == 999 - #define HEATER_CHAMBER_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_CHAMBER_IS_DUMMY 1 #endif #else #undef CHAMBER_MINTEMP @@ -643,20 +659,20 @@ #endif #if TEMP_SENSOR_PROBE == -4 - #define HEATER_PROBE_USES_AD8495 1 + #define TEMP_SENSOR_PROBE_IS_AD8495 1 #elif TEMP_SENSOR_PROBE == -3 #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_PROBE." #elif TEMP_SENSOR_PROBE == -2 #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_PROBE." #elif TEMP_SENSOR_PROBE == -1 - #define HEATER_PROBE_USES_AD595 1 + #define TEMP_SENSOR_PROBE_IS_AD595 1 #elif TEMP_SENSOR_PROBE > 0 - #define THERMISTORPROBE TEMP_SENSOR_PROBE - #define HEATER_PROBE_USES_THERMISTOR 1 + #define TEMP_SENSOR_PROBE_THERMISTOR_ID TEMP_SENSOR_PROBE + #define TEMP_SENSOR_PROBE_IS_THERMISTOR 1 #if TEMP_SENSOR_PROBE == 1000 - #define HEATER_PROBE_USER_THERMISTOR 1 + #define TEMP_SENSOR_PROBE_IS_CUSTOM 1 #elif TEMP_SENSOR_PROBE == 998 || TEMP_SENSOR_PROBE == 999 - #define HEATER_PROBE_DUMMY_THERMISTOR 1 + #define TEMP_SENSOR_PROBE_IS_DUMMY 1 #endif #endif @@ -1792,7 +1808,7 @@ // // ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) // -#define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && NONE(HEATER_##P##_USES_MAX6675, HEATER_##P##_DUMMY_THERMISTOR)) +#define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && NONE(TEMP_SENSOR_##P##_IS_MAX_TC, TEMP_SENSOR_##P##_IS_DUMMY)) #if HAS_ADC_TEST(0) #define HAS_TEMP_ADC_0 1 #endif @@ -1827,7 +1843,7 @@ #define HAS_TEMP_ADC_CHAMBER 1 #endif -#define HAS_TEMP(N) ANY(HAS_TEMP_ADC_##N, HEATER_##N##_USES_MAX6675, HEATER_##N##_DUMMY_THERMISTOR) +#define HAS_TEMP(N) ANY(HAS_TEMP_ADC_##N, TEMP_SENSOR_##N##_IS_MAX_TC, TEMP_SENSOR_##N##_IS_DUMMY) #if HAS_HOTEND && HAS_TEMP(0) #define HAS_TEMP_HOTEND 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 964f894e9e..2ff5293de2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1698,46 +1698,48 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Required custom thermistor settings */ -#if HEATER_0_USER_THERMISTOR && !(defined(HOTEND0_PULLUP_RESISTOR_OHMS) && defined(HOTEND0_RESISTANCE_25C_OHMS) && defined(HOTEND0_BETA)) +#if TEMP_SENSOR_0_IS_CUSTOM && !(defined(HOTEND0_PULLUP_RESISTOR_OHMS) && defined(HOTEND0_RESISTANCE_25C_OHMS) && defined(HOTEND0_BETA)) #error "TEMP_SENSOR_0 1000 requires HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS and HOTEND0_BETA in Configuration_adv.h." -#elif HEATER_1_USER_THERMISTOR && !(defined(HOTEND1_PULLUP_RESISTOR_OHMS) && defined(HOTEND1_RESISTANCE_25C_OHMS) && defined(HOTEND1_BETA)) +#elif TEMP_SENSOR_1_IS_CUSTOM && !(defined(HOTEND1_PULLUP_RESISTOR_OHMS) && defined(HOTEND1_RESISTANCE_25C_OHMS) && defined(HOTEND1_BETA)) #error "TEMP_SENSOR_1 1000 requires HOTEND1_PULLUP_RESISTOR_OHMS, HOTEND1_RESISTANCE_25C_OHMS and HOTEND1_BETA in Configuration_adv.h." -#elif HEATER_2_USER_THERMISTOR && !(defined(HOTEND2_PULLUP_RESISTOR_OHMS) && defined(HOTEND2_RESISTANCE_25C_OHMS) && defined(HOTEND2_BETA)) +#elif TEMP_SENSOR_2_IS_CUSTOM && !(defined(HOTEND2_PULLUP_RESISTOR_OHMS) && defined(HOTEND2_RESISTANCE_25C_OHMS) && defined(HOTEND2_BETA)) #error "TEMP_SENSOR_2 1000 requires HOTEND2_PULLUP_RESISTOR_OHMS, HOTEND2_RESISTANCE_25C_OHMS and HOTEND2_BETA in Configuration_adv.h." -#elif HEATER_3_USER_THERMISTOR && !(defined(HOTEND3_PULLUP_RESISTOR_OHMS) && defined(HOTEND3_RESISTANCE_25C_OHMS) && defined(HOTEND3_BETA)) +#elif TEMP_SENSOR_3_IS_CUSTOM && !(defined(HOTEND3_PULLUP_RESISTOR_OHMS) && defined(HOTEND3_RESISTANCE_25C_OHMS) && defined(HOTEND3_BETA)) #error "TEMP_SENSOR_3 1000 requires HOTEND3_PULLUP_RESISTOR_OHMS, HOTEND3_RESISTANCE_25C_OHMS and HOTEND3_BETA in Configuration_adv.h." -#elif HEATER_4_USER_THERMISTOR && !(defined(HOTEND4_PULLUP_RESISTOR_OHMS) && defined(HOTEND4_RESISTANCE_25C_OHMS) && defined(HOTEND4_BETA)) +#elif TEMP_SENSOR_4_IS_CUSTOM && !(defined(HOTEND4_PULLUP_RESISTOR_OHMS) && defined(HOTEND4_RESISTANCE_25C_OHMS) && defined(HOTEND4_BETA)) #error "TEMP_SENSOR_4 1000 requires HOTEND4_PULLUP_RESISTOR_OHMS, HOTEND4_RESISTANCE_25C_OHMS and HOTEND4_BETA in Configuration_adv.h." -#elif HEATER_5_USER_THERMISTOR && !(defined(HOTEND5_PULLUP_RESISTOR_OHMS) && defined(HOTEND5_RESISTANCE_25C_OHMS) && defined(HOTEND5_BETA)) +#elif TEMP_SENSOR_5_IS_CUSTOM && !(defined(HOTEND5_PULLUP_RESISTOR_OHMS) && defined(HOTEND5_RESISTANCE_25C_OHMS) && defined(HOTEND5_BETA)) #error "TEMP_SENSOR_5 1000 requires HOTEND5_PULLUP_RESISTOR_OHMS, HOTEND5_RESISTANCE_25C_OHMS and HOTEND5_BETA in Configuration_adv.h." -#elif HEATER_6_USER_THERMISTOR && !(defined(HOTEND6_PULLUP_RESISTOR_OHMS) && defined(HOTEND6_RESISTANCE_25C_OHMS) && defined(HOTEND6_BETA)) +#elif TEMP_SENSOR_6_IS_CUSTOM && !(defined(HOTEND6_PULLUP_RESISTOR_OHMS) && defined(HOTEND6_RESISTANCE_25C_OHMS) && defined(HOTEND6_BETA)) #error "TEMP_SENSOR_6 1000 requires HOTEND6_PULLUP_RESISTOR_OHMS, HOTEND6_RESISTANCE_25C_OHMS and HOTEND6_BETA in Configuration_adv.h." -#elif HEATER_7_USER_THERMISTOR && !(defined(HOTEND7_PULLUP_RESISTOR_OHMS) && defined(HOTEND7_RESISTANCE_25C_OHMS) && defined(HOTEND7_BETA)) +#elif TEMP_SENSOR_7_IS_CUSTOM && !(defined(HOTEND7_PULLUP_RESISTOR_OHMS) && defined(HOTEND7_RESISTANCE_25C_OHMS) && defined(HOTEND7_BETA)) #error "TEMP_SENSOR_7 1000 requires HOTEND7_PULLUP_RESISTOR_OHMS, HOTEND7_RESISTANCE_25C_OHMS and HOTEND7_BETA in Configuration_adv.h." -#elif HEATER_BED_USER_THERMISTOR && !(defined(BED_PULLUP_RESISTOR_OHMS) && defined(BED_RESISTANCE_25C_OHMS) && defined(BED_BETA)) +#elif TEMP_SENSOR_BED_IS_CUSTOM && !(defined(BED_PULLUP_RESISTOR_OHMS) && defined(BED_RESISTANCE_25C_OHMS) && defined(BED_BETA)) #error "TEMP_SENSOR_BED 1000 requires BED_PULLUP_RESISTOR_OHMS, BED_RESISTANCE_25C_OHMS and BED_BETA in Configuration_adv.h." -#elif HEATER_CHAMBER_USER_THERMISTOR && !(defined(CHAMBER_PULLUP_RESISTOR_OHMS) && defined(CHAMBER_RESISTANCE_25C_OHMS) && defined(CHAMBER_BETA)) +#elif TEMP_SENSOR_CHAMBER_IS_CUSTOM && !(defined(CHAMBER_PULLUP_RESISTOR_OHMS) && defined(CHAMBER_RESISTANCE_25C_OHMS) && defined(CHAMBER_BETA)) #error "TEMP_SENSOR_CHAMBER 1000 requires CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS and CHAMBER_BETA in Configuration_adv.h." +#elif TEMP_SENSOR_PROBE_IS_CUSTOM && !(defined(PROBE_PULLUP_RESISTOR_OHMS) && defined(PROBE_RESISTANCE_25C_OHMS) && defined(PROBE_BETA)) + #error "TEMP_SENSOR_PROBE 1000 requires PROBE_PULLUP_RESISTOR_OHMS, PROBE_RESISTANCE_25C_OHMS and PROBE_BETA in Configuration_adv.h." #endif /** * Pins and Sensor IDs must be set for each heater */ -#if HEATER_0_USES_MAX6675 && !PIN_EXISTS(MAX6675_SS) - #error "MAX6675_SS_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif HAS_HOTEND && !HAS_TEMP_HOTEND && !HEATER_0_DUMMY_THERMISTOR +#if TEMP_SENSOR_0_IS_MAX6675 && !ANY_PIN(MAX6675_SS, MAX31855_CS, MAX31865_CS, MAX6675_CS) + #error "TEMP_SENSOR_0 requires a MAX6675_SS_PIN, MAX6675_CS_PIN, MAX31855_CS_PIN, or MAX31865_CS_PIN." +#elif HAS_HOTEND && !HAS_TEMP_HOTEND && !TEMP_SENSOR_0_IS_DUMMY #error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board." #elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 #error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin." #endif #if HAS_MULTI_HOTEND - #if HEATER_1_USES_MAX6675 && !PIN_EXISTS(MAX6675_SS2) - #error "MAX6675_SS2_PIN (required for TEMP_SENSOR_1) not defined for this board." + #if TEMP_SENSOR_1_IS_MAX6675 && !ANY_PIN(MAX6675_SS2, MAX31855_CS2, MAX31865_CS2, MAX6675_CS2) + #error "TEMP_SENSOR_1 requires a MAX6675_SS2_PIN, MAX6675_CS2_PIN, MAX31855_CS2_PIN, or MAX31865_CS2_PIN." #elif TEMP_SENSOR_1 == 0 #error "TEMP_SENSOR_1 is required with 2 or more HOTENDS." - #elif !ANY_PIN(TEMP_1, MAX6675_SS2) && !HEATER_1_DUMMY_THERMISTOR - #error "TEMP_1_PIN not defined for this board." + #elif !ANY_PIN(TEMP_1, MAX6675_SS2) && !TEMP_SENSOR_1_IS_DUMMY + #error "TEMP_1_PIN or MAX6675_SS2_PIN not defined for this board." #elif ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) #error "HOTENDS must be 1 with TEMP_SENSOR_1_AS_REDUNDANT." #endif @@ -1746,7 +1748,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_2 is required with 3 or more HOTENDS." #elif !HAS_HEATER_2 #error "HEATER_2_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_2) && !HEATER_2_DUMMY_THERMISTOR + #elif !PIN_EXISTS(TEMP_2) && !TEMP_SENSOR_2_IS_DUMMY #error "TEMP_2_PIN not defined for this board." #endif #if HOTENDS > 3 @@ -1754,7 +1756,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_3 is required with 4 or more HOTENDS." #elif !HAS_HEATER_3 #error "HEATER_3_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_3) && !HEATER_3_DUMMY_THERMISTOR + #elif !PIN_EXISTS(TEMP_3) && !TEMP_SENSOR_3_IS_DUMMY #error "TEMP_3_PIN not defined for this board." #endif #if HOTENDS > 4 @@ -1762,7 +1764,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_4 is required with 5 or more HOTENDS." #elif !HAS_HEATER_4 #error "HEATER_4_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_4) && !HEATER_4_DUMMY_THERMISTOR + #elif !PIN_EXISTS(TEMP_4) && !TEMP_SENSOR_4_IS_DUMMY #error "TEMP_4_PIN not defined for this board." #endif #if HOTENDS > 5 @@ -1770,7 +1772,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_5 is required with 6 HOTENDS." #elif !HAS_HEATER_5 #error "HEATER_5_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_5) && !HEATER_5_DUMMY_THERMISTOR + #elif !PIN_EXISTS(TEMP_5) && !TEMP_SENSOR_5_IS_DUMMY #error "TEMP_5_PIN not defined for this board." #endif #if HOTENDS > 6 @@ -1778,7 +1780,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_6 is required with 6 HOTENDS." #elif !HAS_HEATER_6 #error "HEATER_6_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_6) && !HEATER_6_DUMMY_THERMISTOR + #elif !PIN_EXISTS(TEMP_6) && !TEMP_SENSOR_6_IS_DUMMY #error "TEMP_6_PIN not defined for this board." #endif #if HOTENDS > 7 @@ -1786,7 +1788,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_7 is required with 7 HOTENDS." #elif !HAS_HEATER_7 #error "HEATER_7_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_7) && !HEATER_7_DUMMY_THERMISTOR + #elif !PIN_EXISTS(TEMP_7) && !TEMP_SENSOR_7_IS_DUMMY #error "TEMP_7_PIN not defined for this board." #endif #elif TEMP_SENSOR_7 != 0 @@ -1895,9 +1897,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT." #endif -#if MAX6675_0_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS_0) && defined(MAX31865_CALIBRATION_OHMS_0)) +#if TEMP_SENSOR_0_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS_0) && defined(MAX31865_CALIBRATION_OHMS_0)) #error "MAX31865_SENSOR_OHMS_0 and MAX31865_CALIBRATION_OHMS_0 must be set if TEMP_SENSOR_0 is MAX31865." -#elif MAX6675_1_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS_1) && defined(MAX31865_CALIBRATION_OHMS_1)) +#elif TEMP_SENSOR_1_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS_1) && defined(MAX31865_CALIBRATION_OHMS_1)) #error "MAX31865_SENSOR_OHMS_1 and MAX31865_CALIBRATION_OHMS_1 must be set if TEMP_SENSOR_1 is MAX31865." #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index f6d22420f2..c935323867 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -47,12 +47,12 @@ #include "../lcd/extui/ui_api.h" #endif -#if MAX6675_0_IS_MAX31865 || MAX6675_1_IS_MAX31865 +#if HAS_MAX31865 #include - #if MAX6675_0_IS_MAX31865 && !defined(MAX31865_CS_PIN) && PIN_EXISTS(MAX6675_SS) + #if TEMP_SENSOR_0_IS_MAX31865 && !defined(MAX31865_CS_PIN) && PIN_EXISTS(MAX6675_SS) #define MAX31865_CS_PIN MAX6675_SS_PIN #endif - #if MAX6675_1_IS_MAX31865 && !defined(MAX31865_CS2_PIN) && PIN_EXISTS(MAX6675_SS2) + #if TEMP_SENSOR_1_IS_MAX31865 && !defined(MAX31865_CS2_PIN) && PIN_EXISTS(MAX6675_SS2) #define MAX31865_CS2_PIN MAX6675_SS2_PIN #endif #ifndef MAX31865_MOSI_PIN @@ -64,16 +64,16 @@ #ifndef MAX31865_SCK_PIN #define MAX31865_SCK_PIN MAX6675_SCK_PIN #endif - #if MAX6675_0_IS_MAX31865 && PIN_EXISTS(MAX31865_CS) - #define HAS_MAX31865 1 + #if TEMP_SENSOR_0_IS_MAX31865 && PIN_EXISTS(MAX31865_CS) + #define HAS_MAX31865_TEMP 1 Adafruit_MAX31865 max31865_0 = Adafruit_MAX31865(MAX31865_CS_PIN #if MAX31865_CS_PIN != MAX6675_SS_PIN , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK #endif ); #endif - #if MAX6675_1_IS_MAX31865 && PIN_EXISTS(MAX31865_CS2) - #define HAS_MAX31865 1 + #if TEMP_SENSOR_1_IS_MAX31865 && PIN_EXISTS(MAX31865_CS2) + #define HAS_MAX31865_TEMP 1 Adafruit_MAX31865 max31865_1 = Adafruit_MAX31865(MAX31865_CS2_PIN #if MAX31865_CS2_PIN != MAX6675_SS2_PIN , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK @@ -82,11 +82,11 @@ #endif #endif -#if EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) && PINS_EXIST(MAX6675_SCK, MAX6675_DO) - #define MAX6675_SEPARATE_SPI 1 +#if (TEMP_SENSOR_0_IS_MAX_TC || TEMP_SENSOR_1_IS_MAX_TC) && PINS_EXIST(MAX6675_SCK, MAX6675_DO) && NO_THERMO_TEMPS + #define THERMO_SEPARATE_SPI 1 #endif -#if MAX6675_SEPARATE_SPI +#if THERMO_SEPARATE_SPI #include "../libs/private_spi.h" #endif @@ -132,20 +132,20 @@ #include "./servo.h" #endif -#if ANY(HEATER_0_USES_THERMISTOR, HEATER_1_USES_THERMISTOR, HEATER_2_USES_THERMISTOR, HEATER_3_USES_THERMISTOR, \ - HEATER_4_USES_THERMISTOR, HEATER_5_USES_THERMISTOR, HEATER_6_USES_THERMISTOR, HEATER_7_USES_THERMISTOR ) +#if ANY(TEMP_SENSOR_0_IS_THERMISTOR, TEMP_SENSOR_1_IS_THERMISTOR, TEMP_SENSOR_2_IS_THERMISTOR, TEMP_SENSOR_3_IS_THERMISTOR, \ + TEMP_SENSOR_4_IS_THERMISTOR, TEMP_SENSOR_5_IS_THERMISTOR, TEMP_SENSOR_6_IS_THERMISTOR, TEMP_SENSOR_7_IS_THERMISTOR ) #define HAS_HOTEND_THERMISTOR 1 #endif #if HAS_HOTEND_THERMISTOR #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - static const temp_entry_t* heater_ttbl_map[2] = { HEATER_0_TEMPTABLE, HEATER_1_TEMPTABLE }; - static constexpr uint8_t heater_ttbllen_map[2] = { HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN }; + static const temp_entry_t* heater_ttbl_map[2] = { TEMPTABLE_0, TEMPTABLE_1 }; + static constexpr uint8_t heater_ttbllen_map[2] = { TEMPTABLE_0_LEN, TEMPTABLE_1_LEN }; #else - #define NEXT_TEMPTABLE(N) ,HEATER_##N##_TEMPTABLE - #define NEXT_TEMPTABLE_LEN(N) ,HEATER_##N##_TEMPTABLE_LEN - static const temp_entry_t* heater_ttbl_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE)); - static constexpr uint8_t heater_ttbllen_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE_LEN REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE_LEN)); + #define NEXT_TEMPTABLE(N) ,TEMPTABLE_##N + #define NEXT_TEMPTABLE_LEN(N) ,TEMPTABLE_##N##_LEN + static const temp_entry_t* heater_ttbl_map[HOTENDS] = ARRAY_BY_HOTENDS(TEMPTABLE_0 REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE)); + static constexpr uint8_t heater_ttbllen_map[HOTENDS] = ARRAY_BY_HOTENDS(TEMPTABLE_0_LEN REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE_LEN)); #endif #endif @@ -285,10 +285,10 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, bed_info_t Temperature::temp_bed; // = { 0 } // Init min and max temp with extreme values to prevent false errors during startup #ifdef BED_MINTEMP - int16_t Temperature::mintemp_raw_BED = HEATER_BED_RAW_LO_TEMP; + int16_t Temperature::mintemp_raw_BED = TEMP_SENSOR_BED_RAW_LO_TEMP; #endif #ifdef BED_MAXTEMP - int16_t Temperature::maxtemp_raw_BED = HEATER_BED_RAW_HI_TEMP; + int16_t Temperature::maxtemp_raw_BED = TEMP_SENSOR_BED_RAW_HI_TEMP; #endif TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } IF_DISABLED(PIDTEMPBED, millis_t Temperature::next_bed_check_ms); @@ -303,10 +303,10 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, millis_t next_cool_check_ms_2 = 0; float old_temp = 9999; #ifdef CHAMBER_MINTEMP - int16_t Temperature::mintemp_raw_CHAMBER = HEATER_CHAMBER_RAW_LO_TEMP; + int16_t Temperature::mintemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_LO_TEMP; #endif #ifdef CHAMBER_MAXTEMP - int16_t Temperature::maxtemp_raw_CHAMBER = HEATER_CHAMBER_RAW_HI_TEMP; + int16_t Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; #endif #if WATCH_CHAMBER chamber_watch_t Temperature::watch_chamber{0}; @@ -347,18 +347,18 @@ volatile bool Temperature::raw_temps_ready = false; lpq_ptr_t Temperature::lpq_ptr = 0; #endif -#define TEMPDIR(N) ((HEATER_##N##_RAW_LO_TEMP) < (HEATER_##N##_RAW_HI_TEMP) ? 1 : -1) +#define TEMPDIR(N) ((TEMP_SENSOR_##N##_RAW_LO_TEMP) < (TEMP_SENSOR_##N##_RAW_HI_TEMP) ? 1 : -1) #if HAS_HOTEND // Init mintemp and maxtemp with extreme values to prevent false errors during startup - constexpr temp_range_t sensor_heater_0 { HEATER_0_RAW_LO_TEMP, HEATER_0_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_1 { HEATER_1_RAW_LO_TEMP, HEATER_1_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_2 { HEATER_2_RAW_LO_TEMP, HEATER_2_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_3 { HEATER_3_RAW_LO_TEMP, HEATER_3_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_4 { HEATER_4_RAW_LO_TEMP, HEATER_4_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_5 { HEATER_5_RAW_LO_TEMP, HEATER_5_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_6 { HEATER_6_RAW_LO_TEMP, HEATER_6_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_7 { HEATER_7_RAW_LO_TEMP, HEATER_7_RAW_HI_TEMP, 0, 16383 }; + constexpr temp_range_t sensor_heater_0 { TEMP_SENSOR_0_RAW_LO_TEMP, TEMP_SENSOR_0_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_1 { TEMP_SENSOR_1_RAW_LO_TEMP, TEMP_SENSOR_1_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_2 { TEMP_SENSOR_2_RAW_LO_TEMP, TEMP_SENSOR_2_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_3 { TEMP_SENSOR_3_RAW_LO_TEMP, TEMP_SENSOR_3_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_4 { TEMP_SENSOR_4_RAW_LO_TEMP, TEMP_SENSOR_4_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_5 { TEMP_SENSOR_5_RAW_LO_TEMP, TEMP_SENSOR_5_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_6 { TEMP_SENSOR_6_RAW_LO_TEMP, TEMP_SENSOR_6_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_7 { TEMP_SENSOR_7_RAW_LO_TEMP, TEMP_SENSOR_7_RAW_HI_TEMP, 0, 16383 }; temp_range_t Temperature::temp_range[HOTENDS] = ARRAY_BY_HOTENDS(sensor_heater_0, sensor_heater_1, sensor_heater_2, sensor_heater_3, sensor_heater_4, sensor_heater_5, sensor_heater_6, sensor_heater_7); #endif @@ -1083,13 +1083,13 @@ void Temperature::manage_heater() { updateTemperaturesFromRawValues(); // also resets the watchdog #if DISABLED(IGNORE_THERMOCOUPLE_ERRORS) - #if HEATER_0_USES_MAX6675 - if (temp_hotend[0].celsius > _MIN(HEATER_0_MAXTEMP, HEATER_0_MAX6675_TMAX - 1.0)) max_temp_error(H_E0); - if (temp_hotend[0].celsius < _MAX(HEATER_0_MINTEMP, HEATER_0_MAX6675_TMIN + .01)) min_temp_error(H_E0); + #if TEMP_SENSOR_0_IS_MAX_TC + if (temp_hotend[0].celsius > _MIN(HEATER_0_MAXTEMP, TEMP_SENSOR_0_MAX_TC_TMAX - 1.0)) max_temp_error(H_E0); + if (temp_hotend[0].celsius < _MAX(HEATER_0_MINTEMP, TEMP_SENSOR_0_MAX_TC_TMIN + .01)) min_temp_error(H_E0); #endif - #if HEATER_1_USES_MAX6675 - if (temp_hotend[1].celsius > _MIN(HEATER_1_MAXTEMP, HEATER_1_MAX6675_TMAX - 1.0)) max_temp_error(H_E1); - if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(H_E1); + #if TEMP_SENSOR_1_IS_MAX_TC + if (temp_hotend[1].celsius > _MIN(HEATER_1_MAXTEMP, TEMP_SENSOR_1_MAX_TC_TMAX - 1.0)) max_temp_error(H_E1); + if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, TEMP_SENSOR_1_MAX_TC_TMIN + .01)) min_temp_error(H_E1); #endif #endif @@ -1373,36 +1373,39 @@ void Temperature::manage_heater() { void Temperature::reset_user_thermistors() { user_thermistor_t default_user_thermistor[USER_THERMISTORS] = { - #if HEATER_0_USER_THERMISTOR + #if TEMP_SENSOR_0_IS_CUSTOM { true, 0, 0, HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS, 0, 0, HOTEND0_BETA, 0 }, #endif - #if HEATER_1_USER_THERMISTOR + #if TEMP_SENSOR_1_IS_CUSTOM { true, 0, 0, HOTEND1_PULLUP_RESISTOR_OHMS, HOTEND1_RESISTANCE_25C_OHMS, 0, 0, HOTEND1_BETA, 0 }, #endif - #if HEATER_2_USER_THERMISTOR + #if TEMP_SENSOR_2_IS_CUSTOM { true, 0, 0, HOTEND2_PULLUP_RESISTOR_OHMS, HOTEND2_RESISTANCE_25C_OHMS, 0, 0, HOTEND2_BETA, 0 }, #endif - #if HEATER_3_USER_THERMISTOR + #if TEMP_SENSOR_3_IS_CUSTOM { true, 0, 0, HOTEND3_PULLUP_RESISTOR_OHMS, HOTEND3_RESISTANCE_25C_OHMS, 0, 0, HOTEND3_BETA, 0 }, #endif - #if HEATER_4_USER_THERMISTOR + #if TEMP_SENSOR_4_IS_CUSTOM { true, 0, 0, HOTEND4_PULLUP_RESISTOR_OHMS, HOTEND4_RESISTANCE_25C_OHMS, 0, 0, HOTEND4_BETA, 0 }, #endif - #if HEATER_5_USER_THERMISTOR + #if TEMP_SENSOR_5_IS_CUSTOM { true, 0, 0, HOTEND5_PULLUP_RESISTOR_OHMS, HOTEND5_RESISTANCE_25C_OHMS, 0, 0, HOTEND5_BETA, 0 }, #endif - #if HEATER_6_USER_THERMISTOR + #if TEMP_SENSOR_6_IS_CUSTOM { true, 0, 0, HOTEND6_PULLUP_RESISTOR_OHMS, HOTEND6_RESISTANCE_25C_OHMS, 0, 0, HOTEND6_BETA, 0 }, #endif - #if HEATER_7_USER_THERMISTOR + #if TEMP_SENSOR_7_IS_CUSTOM { true, 0, 0, HOTEND7_PULLUP_RESISTOR_OHMS, HOTEND7_RESISTANCE_25C_OHMS, 0, 0, HOTEND7_BETA, 0 }, #endif - #if HEATER_BED_USER_THERMISTOR + #if TEMP_SENSOR_BED_IS_CUSTOM { true, 0, 0, BED_PULLUP_RESISTOR_OHMS, BED_RESISTANCE_25C_OHMS, 0, 0, BED_BETA, 0 }, #endif - #if HEATER_CHAMBER_USER_THERMISTOR + #if TEMP_SENSOR_CHAMBER_IS_CUSTOM { true, 0, 0, CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS, 0, 0, CHAMBER_BETA, 0 } #endif + #if TEMP_SENSOR_PROBE_IS_CUSTOM + { true, 0, 0, PROBE_PULLUP_RESISTOR_OHMS, PROBE_RESISTANCE_25C_OHMS, 0, 0, PROBE_BETA, 0 } + #endif }; COPY(user_thermistor, default_user_thermistor); } @@ -1423,16 +1426,17 @@ void Temperature::manage_heater() { SERIAL_ECHOPAIR_F_P(SP_C_STR, t.sh_c_coeff, 9); SERIAL_ECHOPGM(" ; "); serialprintPGM( - TERN_(HEATER_0_USER_THERMISTOR, t_index == CTI_HOTEND_0 ? PSTR("HOTEND 0") :) - TERN_(HEATER_1_USER_THERMISTOR, t_index == CTI_HOTEND_1 ? PSTR("HOTEND 1") :) - TERN_(HEATER_2_USER_THERMISTOR, t_index == CTI_HOTEND_2 ? PSTR("HOTEND 2") :) - TERN_(HEATER_3_USER_THERMISTOR, t_index == CTI_HOTEND_3 ? PSTR("HOTEND 3") :) - TERN_(HEATER_4_USER_THERMISTOR, t_index == CTI_HOTEND_4 ? PSTR("HOTEND 4") :) - TERN_(HEATER_5_USER_THERMISTOR, t_index == CTI_HOTEND_5 ? PSTR("HOTEND 5") :) - TERN_(HEATER_6_USER_THERMISTOR, t_index == CTI_HOTEND_6 ? PSTR("HOTEND 6") :) - TERN_(HEATER_7_USER_THERMISTOR, t_index == CTI_HOTEND_7 ? PSTR("HOTEND 7") :) - TERN_(HEATER_BED_USER_THERMISTOR, t_index == CTI_BED ? PSTR("BED") :) - TERN_(HEATER_CHAMBER_USER_THERMISTOR, t_index == CTI_CHAMBER ? PSTR("CHAMBER") :) + TERN_(TEMP_SENSOR_0_IS_CUSTOM, t_index == CTI_HOTEND_0 ? PSTR("HOTEND 0") :) + TERN_(TEMP_SENSOR_1_IS_CUSTOM, t_index == CTI_HOTEND_1 ? PSTR("HOTEND 1") :) + TERN_(TEMP_SENSOR_2_IS_CUSTOM, t_index == CTI_HOTEND_2 ? PSTR("HOTEND 2") :) + TERN_(TEMP_SENSOR_3_IS_CUSTOM, t_index == CTI_HOTEND_3 ? PSTR("HOTEND 3") :) + TERN_(TEMP_SENSOR_4_IS_CUSTOM, t_index == CTI_HOTEND_4 ? PSTR("HOTEND 4") :) + TERN_(TEMP_SENSOR_5_IS_CUSTOM, t_index == CTI_HOTEND_5 ? PSTR("HOTEND 5") :) + TERN_(TEMP_SENSOR_6_IS_CUSTOM, t_index == CTI_HOTEND_6 ? PSTR("HOTEND 6") :) + TERN_(TEMP_SENSOR_7_IS_CUSTOM, t_index == CTI_HOTEND_7 ? PSTR("HOTEND 7") :) + TERN_(TEMP_SENSOR_BED_IS_CUSTOM, t_index == CTI_BED ? PSTR("BED") :) + TERN_(TEMP_SENSOR_CHAMBER_IS_CUSTOM, t_index == CTI_CHAMBER ? PSTR("CHAMBER") :) + TERN_(TEMP_SENSOR_PROBE_IS_CUSTOM, t_index == CTI_PROBE ? PSTR("PROBE") :) nullptr ); SERIAL_EOL(); @@ -1498,85 +1502,85 @@ void Temperature::manage_heater() { switch (e) { case 0: - #if HEATER_0_USER_THERMISTOR + #if TEMP_SENSOR_0_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_0, raw); - #elif HEATER_0_USES_MAX6675 - return TERN(MAX6675_0_IS_MAX31865, max31865_0.temperature(MAX31865_SENSOR_OHMS_0, MAX31865_CALIBRATION_OHMS_0), raw * 0.25); - #elif HEATER_0_USES_AD595 + #elif TEMP_SENSOR_0_IS_MAX_TC + return TERN(TEMP_SENSOR_0_IS_MAX31865, max31865_0.temperature(MAX31865_SENSOR_OHMS_0, MAX31865_CALIBRATION_OHMS_0), raw * 0.25); + #elif TEMP_SENSOR_0_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_0_USES_AD8495 + #elif TEMP_SENSOR_0_IS_AD8495 return TEMP_AD8495(raw); #else break; #endif case 1: - #if HEATER_1_USER_THERMISTOR + #if TEMP_SENSOR_1_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_1, raw); - #elif HEATER_1_USES_MAX6675 - return TERN(MAX6675_1_IS_MAX31865, max31865_1.temperature(MAX31865_SENSOR_OHMS_1, MAX31865_CALIBRATION_OHMS_1), raw * 0.25); - #elif HEATER_1_USES_AD595 + #elif TEMP_SENSOR_1_IS_MAX_TC + return TERN(TEMP_SENSOR_1_IS_MAX31865, max31865_1.temperature(MAX31865_SENSOR_OHMS_1, MAX31865_CALIBRATION_OHMS_1), raw * 0.25); + #elif TEMP_SENSOR_1_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_1_USES_AD8495 + #elif TEMP_SENSOR_1_IS_AD8495 return TEMP_AD8495(raw); #else break; #endif case 2: - #if HEATER_2_USER_THERMISTOR + #if TEMP_SENSOR_2_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_2, raw); - #elif HEATER_2_USES_AD595 + #elif TEMP_SENSOR_2_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_2_USES_AD8495 + #elif TEMP_SENSOR_2_IS_AD8495 return TEMP_AD8495(raw); #else break; #endif case 3: - #if HEATER_3_USER_THERMISTOR + #if TEMP_SENSOR_3_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_3, raw); - #elif HEATER_3_USES_AD595 + #elif TEMP_SENSOR_3_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_3_USES_AD8495 + #elif TEMP_SENSOR_3_IS_AD8495 return TEMP_AD8495(raw); #else break; #endif case 4: - #if HEATER_4_USER_THERMISTOR + #if TEMP_SENSOR_4_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_4, raw); - #elif HEATER_4_USES_AD595 + #elif TEMP_SENSOR_4_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_4_USES_AD8495 + #elif TEMP_SENSOR_4_IS_AD8495 return TEMP_AD8495(raw); #else break; #endif case 5: - #if HEATER_5_USER_THERMISTOR + #if TEMP_SENSOR_5_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_5, raw); - #elif HEATER_5_USES_AD595 + #elif TEMP_SENSOR_5_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_5_USES_AD8495 + #elif TEMP_SENSOR_5_IS_AD8495 return TEMP_AD8495(raw); #else break; #endif case 6: - #if HEATER_6_USER_THERMISTOR + #if TEMP_SENSOR_6_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_6, raw); - #elif HEATER_6_USES_AD595 + #elif TEMP_SENSOR_6_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_6_USES_AD8495 + #elif TEMP_SENSOR_6_IS_AD8495 return TEMP_AD8495(raw); #else break; #endif case 7: - #if HEATER_7_USER_THERMISTOR + #if TEMP_SENSOR_7_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_7, raw); - #elif HEATER_7_USES_AD595 + #elif TEMP_SENSOR_7_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_7_USES_AD8495 + #elif TEMP_SENSOR_7_IS_AD8495 return TEMP_AD8495(raw); #else break; @@ -1598,13 +1602,13 @@ void Temperature::manage_heater() { // Derived from RepRap FiveD extruder::getTemperature() // For bed temperature measurement. float Temperature::analog_to_celsius_bed(const int raw) { - #if HEATER_BED_USER_THERMISTOR + #if TEMP_SENSOR_BED_IS_CUSTOM return user_thermistor_to_deg_c(CTI_BED, raw); - #elif HEATER_BED_USES_THERMISTOR - SCAN_THERMISTOR_TABLE(BED_TEMPTABLE, BED_TEMPTABLE_LEN); - #elif HEATER_BED_USES_AD595 + #elif TEMP_SENSOR_BED_IS_THERMISTOR + SCAN_THERMISTOR_TABLE(TEMPTABLE_BED, TEMPTABLE_BED_LEN); + #elif TEMP_SENSOR_BED_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_BED_USES_AD8495 + #elif TEMP_SENSOR_BED_IS_AD8495 return TEMP_AD8495(raw); #else UNUSED(raw); @@ -1617,13 +1621,13 @@ void Temperature::manage_heater() { // Derived from RepRap FiveD extruder::getTemperature() // For chamber temperature measurement. float Temperature::analog_to_celsius_chamber(const int raw) { - #if HEATER_CHAMBER_USER_THERMISTOR + #if TEMP_SENSOR_CHAMBER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_CHAMBER, raw); - #elif HEATER_CHAMBER_USES_THERMISTOR - SCAN_THERMISTOR_TABLE(CHAMBER_TEMPTABLE, CHAMBER_TEMPTABLE_LEN); - #elif HEATER_CHAMBER_USES_AD595 + #elif TEMP_SENSOR_CHAMBER_IS_THERMISTOR + SCAN_THERMISTOR_TABLE(TEMPTABLE_CHAMBER, TEMPTABLE_CHAMBER_LEN); + #elif TEMP_SENSOR_CHAMBER_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_CHAMBER_USES_AD8495 + #elif TEMP_SENSOR_CHAMBER_IS_AD8495 return TEMP_AD8495(raw); #else UNUSED(raw); @@ -1636,13 +1640,13 @@ void Temperature::manage_heater() { // Derived from RepRap FiveD extruder::getTemperature() // For probe temperature measurement. float Temperature::analog_to_celsius_probe(const int raw) { - #if HEATER_PROBE_USER_THERMISTOR + #if TEMP_SENSOR_PROBE_IS_CUSTOM return user_thermistor_to_deg_c(CTI_PROBE, raw); - #elif HEATER_PROBE_USES_THERMISTOR - SCAN_THERMISTOR_TABLE(PROBE_TEMPTABLE, PROBE_TEMPTABLE_LEN); - #elif HEATER_PROBE_USES_AD595 + #elif TEMP_SENSOR_PROBE_IS_THERMISTOR + SCAN_THERMISTOR_TABLE(TEMPTABLE_PROBE, TEMPTABLE_PROBE_LEN); + #elif TEMP_SENSOR_PROBE_IS_AD595 return TEMP_AD595(raw); - #elif HEATER_PROBE_USES_AD8495 + #elif TEMP_SENSOR_PROBE_IS_AD8495 return TEMP_AD8495(raw); #else UNUSED(raw); @@ -1658,8 +1662,8 @@ void Temperature::manage_heater() { * as it would block the stepper routine. */ void Temperature::updateTemperaturesFromRawValues() { - TERN_(HEATER_0_USES_MAX6675, temp_hotend[0].raw = READ_MAX6675(0)); - TERN_(HEATER_1_USES_MAX6675, temp_hotend[1].raw = READ_MAX6675(1)); + TERN_(TEMP_SENSOR_0_IS_MAX_TC, temp_hotend[0].raw = READ_MAX_TC(0)); + TERN_(TEMP_SENSOR_1_IS_MAX_TC, temp_hotend[1].raw = READ_MAX_TC(1)); #if HAS_HOTEND HOTEND_LOOP() temp_hotend[e].celsius = analog_to_celsius_hotend(temp_hotend[e].raw, e); #endif @@ -1676,9 +1680,9 @@ void Temperature::updateTemperaturesFromRawValues() { raw_temps_ready = false; } -#if MAX6675_SEPARATE_SPI +#if THERMO_SEPARATE_SPI template SoftSPI SPIclass::softSPI; - SPIclass max6675_spi; + SPIclass max_tc_spi; #endif // Init fans according to whether they're native PWM or Software PWM @@ -1715,8 +1719,8 @@ void Temperature::updateTemperaturesFromRawValues() { */ void Temperature::init() { - TERN_(MAX6675_0_IS_MAX31865, max31865_0.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE - TERN_(MAX6675_1_IS_MAX31865, max31865_1.begin(MAX31865_2WIRE)); + TERN_(TEMP_SENSOR_0_IS_MAX31865, max31865_0.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE + TERN_(TEMP_SENSOR_1_IS_MAX31865, max31865_1.begin(MAX31865_2WIRE)); #if EARLY_WATCHDOG // Flag that the thermalManager should be running @@ -1726,7 +1730,7 @@ void Temperature::init() { #if MB(RUMBA) // Disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector - #define _AD(N) (HEATER_##N##_USES_AD595 || HEATER_##N##_USES_AD8495) + #define _AD(N) (TEMP_SENSOR_##N##_IS_AD595 || TEMP_SENSOR_##N##_IS_AD8495) #if _AD(0) || _AD(1) || _AD(2) || _AD(BED) || _AD(CHAMBER) MCUCR = _BV(JTD); MCUCR = _BV(JTD); @@ -1734,11 +1738,11 @@ void Temperature::init() { #endif // Thermistor activation by MCU pin - #if PIN_EXISTS(TEMP_0_TR_ENABLE_PIN) - OUT_WRITE(TEMP_0_TR_ENABLE_PIN, ENABLED(HEATER_0_USES_MAX6675)); + #if PIN_EXISTS(TEMP_0_TR_ENABLE) + OUT_WRITE(TEMP_0_TR_ENABLE_PIN, ENABLED(TEMP_SENSOR_0_IS_MAX_TC)); #endif - #if PIN_EXISTS(TEMP_1_TR_ENABLE_PIN) - OUT_WRITE(TEMP_1_TR_ENABLE_PIN, ENABLED(HEATER_1_USES_MAX6675)); + #if PIN_EXISTS(TEMP_1_TR_ENABLE) + OUT_WRITE(TEMP_1_TR_ENABLE_PIN, ENABLED(TEMP_SENSOR_1_IS_MAX_TC)); #endif #if BOTH(PIDTEMP, PID_EXTRUSION_SCALING) @@ -1815,7 +1819,7 @@ void Temperature::init() { INIT_FAN_PIN(CONTROLLER_FAN_PIN); #endif - TERN_(MAX6675_SEPARATE_SPI, max6675_spi.init()); + TERN_(THERMO_SEPARATE_SPI, max_tc_spi.init()); HAL_adc_init(); @@ -1914,19 +1918,19 @@ void Temperature::init() { #if HAS_HOTEND #define _TEMP_MIN_E(NR) do{ \ - const int16_t tmin = _MAX(HEATER_ ##NR## _MINTEMP, TERN(HEATER_##NR##_USER_THERMISTOR, 0, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MINTEMP_IND].celsius))); \ + const int16_t tmin = _MAX(HEATER_##NR##_MINTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 0, (int16_t)pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MINTEMP_IND].celsius))); \ temp_range[NR].mintemp = tmin; \ while (analog_to_celsius_hotend(temp_range[NR].raw_min, NR) < tmin) \ temp_range[NR].raw_min += TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) #define _TEMP_MAX_E(NR) do{ \ - const int16_t tmax = _MIN(HEATER_ ##NR## _MAXTEMP, TERN(HEATER_##NR##_USER_THERMISTOR, 2000, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MAXTEMP_IND].celsius) - 1)); \ + const int16_t tmax = _MIN(HEATER_##NR##_MAXTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 2000, (int16_t)pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MAXTEMP_IND].celsius) - 1)); \ temp_range[NR].maxtemp = tmax; \ while (analog_to_celsius_hotend(temp_range[NR].raw_max, NR) > tmax) \ temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) - #define _MINMAX_TEST(N,M) (HOTENDS > N && THERMISTOR_HEATER_##N && THERMISTOR_HEATER_##N != 998 && THERMISTOR_HEATER_##N != 999 && defined(HEATER_##N##_##M##TEMP)) + #define _MINMAX_TEST(N,M) (HOTENDS > N && TEMP_SENSOR_ ##N## THERMISTOR_ID && TEMP_SENSOR_ ##N## THERMISTOR_ID != 998 && TEMP_SENSOR_ ##N## THERMISTOR_ID != 999 && defined(HEATER_##N##_##M##TEMP)) #if _MINMAX_TEST(0, MIN) _TEMP_MIN_E(0); @@ -2221,105 +2225,106 @@ void Temperature::disable_all_heaters() { #endif -#if HAS_MAX6675 +#if HAS_MAX_TC #ifndef THERMOCOUPLE_MAX_ERRORS #define THERMOCOUPLE_MAX_ERRORS 15 #endif - int Temperature::read_max6675(TERN_(HAS_MULTI_6675, const uint8_t hindex/*=0*/)) { + int Temperature::read_max_tc(TERN_(HAS_MULTI_MAX_TC, const uint8_t hindex/*=0*/)) { #define MAX6675_HEAT_INTERVAL 250UL - #if MAX6675_0_IS_MAX31855 || MAX6675_1_IS_MAX31855 - static uint32_t max6675_temp = 2000; - #define MAX6675_ERROR_MASK 7 - #define MAX6675_DISCARD_BITS 18 - #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 - #elif HAS_MAX31865 - static uint16_t max6675_temp = 2000; // From datasheet 16 bits D15-D0 - #define MAX6675_ERROR_MASK 1 // D0 Bit not used - #define MAX6675_DISCARD_BITS 1 // Data is in D15-D1 - #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 + #if HAS_MAX31855 + static uint32_t max_tc_temp = 2000; + #define MAX_TC_ERROR_MASK 7 + #define MAX_TC_DISCARD_BITS 18 + #define MAX_TC_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 + #elif HAS_MAX31865_TEMP + static uint16_t max_tc_temp = 2000; // From datasheet 16 bits D15-D0 + #define MAX_TC_ERROR_MASK 1 // D0 Bit not used + #define MAX_TC_DISCARD_BITS 1 // Data is in D15-D1 + #define MAX_TC_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 #else - static uint16_t max6675_temp = 2000; - #define MAX6675_ERROR_MASK 4 - #define MAX6675_DISCARD_BITS 3 - #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16 + static uint16_t max_tc_temp = 2000; + #define MAX_TC_ERROR_MASK 4 + #define MAX_TC_DISCARD_BITS 3 + #define MAX_TC_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16 #endif - #if HAS_MULTI_6675 + #if HAS_MULTI_MAX_TC // Needed to return the correct temp when this is called between readings - static uint16_t max6675_temp_previous[COUNT_6675] = { 0 }; - #define MAX6675_TEMP(I) max6675_temp_previous[I] - #define MAX6675_SEL(A,B) (hindex ? (B) : (A)) + static uint16_t max_tc_temp_previous[MAX_TC_COUNT] = { 0 }; + #define THERMO_TEMP(I) max_tc_temp_previous[I] + #define THERMO_SEL(A,B) (hindex ? (B) : (A)) #define MAX6675_WRITE(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0) #define MAX6675_SET_OUTPUT() do{ switch (hindex) { case 1: SET_OUTPUT(MAX6675_SS2_PIN); break; default: SET_OUTPUT(MAX6675_SS_PIN); } }while(0) #else constexpr uint8_t hindex = 0; - #define MAX6675_TEMP(I) max6675_temp - #if MAX6675_1_IS_MAX31865 - #define MAX6675_SEL(A,B) B + #define THERMO_TEMP(I) max_tc_temp + #if TEMP_SENSOR_1_IS_MAX31865 + #define THERMO_SEL(A,B) B #else - #define MAX6675_SEL(A,B) A + #define THERMO_SEL(A,B) A #endif - #if HEATER_0_USES_MAX6675 + #if TEMP_SENSOR_0_IS_MAX6675 #define MAX6675_WRITE(V) WRITE(MAX6675_SS_PIN, V) #define MAX6675_SET_OUTPUT() SET_OUTPUT(MAX6675_SS_PIN) #else #define MAX6675_WRITE(V) WRITE(MAX6675_SS2_PIN, V) #define MAX6675_SET_OUTPUT() SET_OUTPUT(MAX6675_SS2_PIN) #endif + #endif - static uint8_t max6675_errors[COUNT_6675] = { 0 }; + static uint8_t max_tc_errors[MAX_TC_COUNT] = { 0 }; // Return last-read value between readings - static millis_t next_max6675_ms[COUNT_6675] = { 0 }; + static millis_t next_max_tc_ms[MAX_TC_COUNT] = { 0 }; millis_t ms = millis(); - if (PENDING(ms, next_max6675_ms[hindex])) return int(MAX6675_TEMP(hindex)); - next_max6675_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; + if (PENDING(ms, next_max_tc_ms[hindex])) return int(THERMO_TEMP(hindex)); + next_max_tc_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; - #if HAS_MAX31865 - Adafruit_MAX31865 &maxref = MAX6675_SEL(max31865_0, max31865_1); - const uint16_t max31865_ohms = (uint32_t(maxref.readRTD()) * MAX6675_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1)) >> 16; + #if HAS_MAX31865_TEMP + Adafruit_MAX31865 &maxref = THERMO_SEL(max31865_0, max31865_1); + const uint16_t max31865_ohms = (uint32_t(maxref.readRTD()) * THERMO_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1)) >> 16; #endif // // TODO: spiBegin, spiRec and spiInit doesn't work when soft spi is used. // - #if !MAX6675_SEPARATE_SPI + #if !THERMO_SEPARATE_SPI spiBegin(); - spiInit(MAX6675_SPEED_BITS); + spiInit(MAX_TC_SPEED_BITS); #endif - MAX6675_WRITE(LOW); // enable TT_MAX6675 - DELAY_NS(100); // Ensure 100ns delay + MAX6675_WRITE(LOW); // enable TT_MAX6675 + DELAY_NS(100); // Ensure 100ns delay // Read a big-endian temperature value - max6675_temp = 0; - for (uint8_t i = sizeof(max6675_temp); i--;) { - max6675_temp |= TERN(MAX6675_SEPARATE_SPI, max6675_spi.receive(), spiRec()); - if (i > 0) max6675_temp <<= 8; // shift left if not the last byte + max_tc_temp = 0; + for (uint8_t i = sizeof(max_tc_temp); i--;) { + max_tc_temp |= TERN(THERMO_SEPARATE_SPI, max_tc_spi.receive(), spiRec()); + if (i > 0) max_tc_temp <<= 8; // shift left if not the last byte } MAX6675_WRITE(HIGH); // disable TT_MAX6675 - const uint8_t fault_31865 = TERN1(HAS_MAX31865, maxref.readFault()); + const uint8_t fault_31865 = TERN1(HAS_MAX31865_TEMP, maxref.readFault()); - if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK) && fault_31865) { - max6675_errors[hindex]++; - if (max6675_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) { + if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max_tc_temp & MAX_TC_ERROR_MASK) && fault_31865) { + max_tc_errors[hindex]++; + if (max_tc_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) { SERIAL_ERROR_START(); SERIAL_ECHOPGM("Temp measurement error! "); - #if MAX6675_ERROR_MASK == 7 + #if MAX_TC_ERROR_MASK == 7 SERIAL_ECHOPGM("MAX31855 "); - if (max6675_temp & 1) + if (max_tc_temp & 1) SERIAL_ECHOLNPGM("Open Circuit"); - else if (max6675_temp & 2) + else if (max_tc_temp & 2) SERIAL_ECHOLNPGM("Short to GND"); - else if (max6675_temp & 4) + else if (max_tc_temp & 4) SERIAL_ECHOLNPGM("Short to VCC"); - #elif HAS_MAX31865 + #elif HAS_MAX31865_TEMP if (fault_31865) { maxref.clearFault(); SERIAL_ECHOPAIR("MAX31865 Fault :(", fault_31865, ") >>"); @@ -2341,43 +2346,43 @@ void Temperature::disable_all_heaters() { #endif // Thermocouple open - max6675_temp = 4 * MAX6675_SEL(HEATER_0_MAX6675_TMAX, HEATER_1_MAX6675_TMAX); + max_tc_temp = 4 * THERMO_SEL(TEMP_SENSOR_0_MAX_TC_TMAX, TEMP_SENSOR_1_MAX_TC_TMAX); } else - max6675_temp >>= MAX6675_DISCARD_BITS; + max_tc_temp >>= MAX_TC_DISCARD_BITS; } else { - max6675_temp >>= MAX6675_DISCARD_BITS; - max6675_errors[hindex] = 0; + max_tc_temp >>= MAX_TC_DISCARD_BITS; + max_tc_errors[hindex] = 0; } - #if MAX6675_0_IS_MAX31855 || MAX6675_1_IS_MAX31855 - if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; // Support negative temperature + #if HAS_MAX31855 + if (max_tc_temp & 0x00002000) max_tc_temp |= 0xFFFFC000; // Support negative temperature #endif // Return the RTD resistance for MAX31865 for display in SHOW_TEMP_ADC_VALUES - TERN_(HAS_MAX31865, max6675_temp = max31865_ohms); + TERN_(HAS_MAX31865_TEMP, max_tc_temp = max31865_ohms); - MAX6675_TEMP(hindex) = max6675_temp; + THERMO_TEMP(hindex) = max_tc_temp; - return int(max6675_temp); + return int(max_tc_temp); } -#endif // HAS_MAX6675 +#endif // HAS_MAX_TC /** * Update raw temperatures */ void Temperature::update_raw_temperatures() { - #if HAS_TEMP_ADC_0 && !HEATER_0_USES_MAX6675 + #if HAS_TEMP_ADC_0 && !TEMP_SENSOR_0_IS_MAX_TC temp_hotend[0].update(); #endif #if HAS_TEMP_ADC_1 #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) redundant_temperature_raw = temp_hotend[1].acc; - #elif !HEATER_1_USES_MAX6675 + #elif !TEMP_SENSOR_1_IS_MAX_TC temp_hotend[1].update(); #endif #endif @@ -2423,9 +2428,9 @@ void Temperature::readings_ready() { #if HAS_HOTEND static constexpr int8_t temp_dir[] = { - TERN(HEATER_0_USES_MAX6675, 0, TEMPDIR(0)) + TERN(TEMP_SENSOR_0_IS_MAX_TC, 0, TEMPDIR(0)) #if HAS_MULTI_HOTEND - , TERN(HEATER_1_USES_MAX6675, 0, TEMPDIR(1)) + , TERN(TEMP_SENSOR_1_IS_MAX_TC, 0, TEMPDIR(1)) #if HOTENDS > 2 #define _TEMPDIR(N) , TEMPDIR(N) REPEAT_S(2, HOTENDS, _TEMPDIR) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 002e1cbf71..75da232874 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -257,31 +257,31 @@ typedef struct { int16_t raw_min, raw_max, mintemp, maxtemp; } temp_range_t; #if HAS_USER_THERMISTORS enum CustomThermistorIndex : uint8_t { - #if HEATER_0_USER_THERMISTOR + #if TEMP_SENSOR_0_IS_CUSTOM CTI_HOTEND_0, #endif - #if HEATER_1_USER_THERMISTOR + #if TEMP_SENSOR_1_IS_CUSTOM CTI_HOTEND_1, #endif - #if HEATER_2_USER_THERMISTOR + #if TEMP_SENSOR_2_IS_CUSTOM CTI_HOTEND_2, #endif - #if HEATER_3_USER_THERMISTOR + #if TEMP_SENSOR_3_IS_CUSTOM CTI_HOTEND_3, #endif - #if HEATER_4_USER_THERMISTOR + #if TEMP_SENSOR_4_IS_CUSTOM CTI_HOTEND_4, #endif - #if HEATER_5_USER_THERMISTOR + #if TEMP_SENSOR_5_IS_CUSTOM CTI_HOTEND_5, #endif - #if HEATER_BED_USER_THERMISTOR + #if TEMP_SENSOR_BED_IS_CUSTOM CTI_BED, #endif - #if HEATER_PROBE_USER_THERMISTOR + #if TEMP_SENSOR_PROBE_IS_CUSTOM CTI_PROBE, #endif - #if HEATER_CHAMBER_USER_THERMISTOR + #if TEMP_SENSOR_CHAMBER_IS_CUSTOM CTI_CHAMBER, #endif USER_THERMISTORS @@ -813,16 +813,15 @@ class Temperature { static void update_raw_temperatures(); static void updateTemperaturesFromRawValues(); - #define HAS_MAX6675 EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) - #if HAS_MAX6675 - #define COUNT_6675 1 + BOTH(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) - #if COUNT_6675 > 1 - #define HAS_MULTI_6675 1 - #define READ_MAX6675(N) read_max6675(N) + #if HAS_MAX_TC + #define MAX_TC_COUNT 1 + BOTH(TEMP_SENSOR_0_IS_MAX_TC, TEMP_SENSOR_1_IS_MAX_TC) + #if MAX_TC_COUNT > 1 + #define HAS_MULTI_MAX_TC 1 + #define READ_MAX_TC(N) read_max_tc(N) #else - #define READ_MAX6675(N) read_max6675() + #define READ_MAX_TC(N) read_max_tc() #endif - static int read_max6675(TERN_(HAS_MULTI_6675, const uint8_t hindex=0)); + static int read_max_tc(TERN_(HAS_MULTI_MAX_TC, const uint8_t hindex=0)); #endif static void checkExtruderAutoFans(); diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 03ed5c2a57..77fc50c8d3 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -42,7 +42,7 @@ #define OV_SCALE(N) (N) #define OV(N) int16_t(OV_SCALE(N) * (OVERSAMPLENR) * (THERMISTOR_TABLE_SCALE)) -#define ANY_THERMISTOR_IS(n) (THERMISTOR_HEATER_0 == n || THERMISTOR_HEATER_1 == n || THERMISTOR_HEATER_2 == n || THERMISTOR_HEATER_3 == n || THERMISTOR_HEATER_4 == n || THERMISTOR_HEATER_5 == n || THERMISTOR_HEATER_6 == n || THERMISTOR_HEATER_7 == n || THERMISTORBED == n || THERMISTORCHAMBER == n || THERMISTORPROBE == n) +#define ANY_THERMISTOR_IS(n) (TEMP_SENSOR_0_THERMISTOR_ID == n || TEMP_SENSOR_1_THERMISTOR_ID == n || TEMP_SENSOR_2_THERMISTOR_ID == n || TEMP_SENSOR_3_THERMISTOR_ID == n || TEMP_SENSOR_4_THERMISTOR_ID == n || TEMP_SENSOR_5_THERMISTOR_ID == n || TEMP_SENSOR_6_THERMISTOR_ID == n || TEMP_SENSOR_7_THERMISTOR_ID == n || TEMP_SENSOR_BED_THERMISTOR_ID == n || TEMP_SENSOR_CHAMBER_THERMISTOR_ID == n || TEMP_SENSOR_PROBE_THERMISTOR_ID == n) typedef struct { int16_t value, celsius; } temp_entry_t; @@ -205,121 +205,121 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #define TT_NAME(_N) _TT_NAME(_N) -#if THERMISTOR_HEATER_0 - #define HEATER_0_TEMPTABLE TT_NAME(THERMISTOR_HEATER_0) - #define HEATER_0_TEMPTABLE_LEN COUNT(HEATER_0_TEMPTABLE) -#elif HEATER_0_USES_THERMISTOR +#if TEMP_SENSOR_0_THERMISTOR_ID + #define TEMPTABLE_0 TT_NAME(TEMP_SENSOR_0_THERMISTOR_ID) + #define TEMPTABLE_0_LEN COUNT(TEMPTABLE_0) +#elif TEMP_SENSOR_0_IS_THERMISTOR #error "No heater 0 thermistor table specified" #else - #define HEATER_0_TEMPTABLE nullptr - #define HEATER_0_TEMPTABLE_LEN 0 + #define TEMPTABLE_0 nullptr + #define TEMPTABLE_0_LEN 0 #endif -#if THERMISTOR_HEATER_1 - #define HEATER_1_TEMPTABLE TT_NAME(THERMISTOR_HEATER_1) - #define HEATER_1_TEMPTABLE_LEN COUNT(HEATER_1_TEMPTABLE) -#elif HEATER_1_USES_THERMISTOR +#if TEMP_SENSOR_1_THERMISTOR_ID + #define TEMPTABLE_1 TT_NAME(TEMP_SENSOR_1_THERMISTOR_ID) + #define TEMPTABLE_1_LEN COUNT(TEMPTABLE_1) +#elif TEMP_SENSOR_1_IS_THERMISTOR #error "No heater 1 thermistor table specified" #else - #define HEATER_1_TEMPTABLE nullptr - #define HEATER_1_TEMPTABLE_LEN 0 + #define TEMPTABLE_1 nullptr + #define TEMPTABLE_1_LEN 0 #endif -#if THERMISTOR_HEATER_2 - #define HEATER_2_TEMPTABLE TT_NAME(THERMISTOR_HEATER_2) - #define HEATER_2_TEMPTABLE_LEN COUNT(HEATER_2_TEMPTABLE) -#elif HEATER_2_USES_THERMISTOR +#if TEMP_SENSOR_2_THERMISTOR_ID + #define TEMPTABLE_2 TT_NAME(TEMP_SENSOR_2_THERMISTOR_ID) + #define TEMPTABLE_2_LEN COUNT(TEMPTABLE_2) +#elif TEMP_SENSOR_2_IS_THERMISTOR #error "No heater 2 thermistor table specified" #else - #define HEATER_2_TEMPTABLE nullptr - #define HEATER_2_TEMPTABLE_LEN 0 + #define TEMPTABLE_2 nullptr + #define TEMPTABLE_2_LEN 0 #endif -#if THERMISTOR_HEATER_3 - #define HEATER_3_TEMPTABLE TT_NAME(THERMISTOR_HEATER_3) - #define HEATER_3_TEMPTABLE_LEN COUNT(HEATER_3_TEMPTABLE) -#elif HEATER_3_USES_THERMISTOR +#if TEMP_SENSOR_3_THERMISTOR_ID + #define TEMPTABLE_3 TT_NAME(TEMP_SENSOR_3_THERMISTOR_ID) + #define TEMPTABLE_3_LEN COUNT(TEMPTABLE_3) +#elif TEMP_SENSOR_3_IS_THERMISTOR #error "No heater 3 thermistor table specified" #else - #define HEATER_3_TEMPTABLE nullptr - #define HEATER_3_TEMPTABLE_LEN 0 + #define TEMPTABLE_3 nullptr + #define TEMPTABLE_3_LEN 0 #endif -#if THERMISTOR_HEATER_4 - #define HEATER_4_TEMPTABLE TT_NAME(THERMISTOR_HEATER_4) - #define HEATER_4_TEMPTABLE_LEN COUNT(HEATER_4_TEMPTABLE) -#elif HEATER_4_USES_THERMISTOR +#if TEMP_SENSOR_4_THERMISTOR_ID + #define TEMPTABLE_4 TT_NAME(TEMP_SENSOR_4_THERMISTOR_ID) + #define TEMPTABLE_4_LEN COUNT(TEMPTABLE_4) +#elif TEMP_SENSOR_4_IS_THERMISTOR #error "No heater 4 thermistor table specified" #else - #define HEATER_4_TEMPTABLE nullptr - #define HEATER_4_TEMPTABLE_LEN 0 + #define TEMPTABLE_4 nullptr + #define TEMPTABLE_4_LEN 0 #endif -#if THERMISTOR_HEATER_5 - #define HEATER_5_TEMPTABLE TT_NAME(THERMISTOR_HEATER_5) - #define HEATER_5_TEMPTABLE_LEN COUNT(HEATER_5_TEMPTABLE) -#elif HEATER_5_USES_THERMISTOR +#if TEMP_SENSOR_5_THERMISTOR_ID + #define TEMPTABLE_5 TT_NAME(TEMP_SENSOR_5_THERMISTOR_ID) + #define TEMPTABLE_5_LEN COUNT(TEMPTABLE_5) +#elif TEMP_SENSOR_5_IS_THERMISTOR #error "No heater 5 thermistor table specified" #else - #define HEATER_5_TEMPTABLE nullptr - #define HEATER_5_TEMPTABLE_LEN 0 + #define TEMPTABLE_5 nullptr + #define TEMPTABLE_5_LEN 0 #endif -#if THERMISTOR_HEATER_6 - #define HEATER_6_TEMPTABLE TT_NAME(THERMISTOR_HEATER_6) - #define HEATER_6_TEMPTABLE_LEN COUNT(HEATER_6_TEMPTABLE) -#elif HEATER_6_USES_THERMISTOR +#if TEMP_SENSOR_6_THERMISTOR_ID + #define TEMPTABLE_6 TT_NAME(TEMP_SENSOR_6_THERMISTOR_ID) + #define TEMPTABLE_6_LEN COUNT(TEMPTABLE_6) +#elif TEMP_SENSOR_6_IS_THERMISTOR #error "No heater 6 thermistor table specified" #else - #define HEATER_6_TEMPTABLE nullptr - #define HEATER_6_TEMPTABLE_LEN 0 + #define TEMPTABLE_6 nullptr + #define TEMPTABLE_6_LEN 0 #endif -#if THERMISTOR_HEATER_7 - #define HEATER_7_TEMPTABLE TT_NAME(THERMISTOR_HEATER_7) - #define HEATER_7_TEMPTABLE_LEN COUNT(HEATER_7_TEMPTABLE) -#elif HEATER_7_USES_THERMISTOR +#if TEMP_SENSOR_7_THERMISTOR_ID + #define TEMPTABLE_7 TT_NAME(TEMP_SENSOR_7_THERMISTOR_ID) + #define TEMPTABLE_7_LEN COUNT(TEMPTABLE_7) +#elif TEMP_SENSOR_7_IS_THERMISTOR #error "No heater 7 thermistor table specified" #else - #define HEATER_7_TEMPTABLE nullptr - #define HEATER_7_TEMPTABLE_LEN 0 + #define TEMPTABLE_7 nullptr + #define TEMPTABLE_7_LEN 0 #endif -#ifdef THERMISTORBED - #define BED_TEMPTABLE TT_NAME(THERMISTORBED) - #define BED_TEMPTABLE_LEN COUNT(BED_TEMPTABLE) -#elif HEATER_BED_USES_THERMISTOR +#ifdef TEMP_SENSOR_BED_THERMISTOR_ID + #define TEMPTABLE_BED TT_NAME(TEMP_SENSOR_BED_THERMISTOR_ID) + #define TEMPTABLE_BED_LEN COUNT(TEMPTABLE_BED) +#elif TEMP_SENSOR_BED_IS_THERMISTOR #error "No bed thermistor table specified" #else - #define BED_TEMPTABLE_LEN 0 + #define TEMPTABLE_BED_LEN 0 #endif -#ifdef THERMISTORCHAMBER - #define CHAMBER_TEMPTABLE TT_NAME(THERMISTORCHAMBER) - #define CHAMBER_TEMPTABLE_LEN COUNT(CHAMBER_TEMPTABLE) -#elif HEATER_CHAMBER_USES_THERMISTOR +#ifdef TEMP_SENSOR_CHAMBER_THERMISTOR_ID + #define TEMPTABLE_CHAMBER TT_NAME(TEMP_SENSOR_CHAMBER_THERMISTOR_ID) + #define TEMPTABLE_CHAMBER_LEN COUNT(TEMPTABLE_CHAMBER) +#elif TEMP_SENSOR_CHAMBER_IS_THERMISTOR #error "No chamber thermistor table specified" #else - #define CHAMBER_TEMPTABLE_LEN 0 + #define TEMPTABLE_CHAMBER_LEN 0 #endif -#ifdef THERMISTORPROBE - #define PROBE_TEMPTABLE TT_NAME(THERMISTORPROBE) - #define PROBE_TEMPTABLE_LEN COUNT(PROBE_TEMPTABLE) -#elif HEATER_PROBE_USES_THERMISTOR +#ifdef TEMP_SENSOR_PROBE_THERMISTOR_ID + #define TEMPTABLE_PROBE TT_NAME(TEMP_SENSOR_PROBE_THERMISTOR_ID) + #define TEMPTABLE_PROBE_LEN COUNT(TEMPTABLE_PROBE) +#elif TEMP_SENSOR_PROBE_IS_THERMISTOR #error "No probe thermistor table specified" #else - #define PROBE_TEMPTABLE_LEN 0 + #define TEMPTABLE_PROBE_LEN 0 #endif // The SCAN_THERMISTOR_TABLE macro needs alteration? static_assert( - HEATER_0_TEMPTABLE_LEN < 256 && HEATER_1_TEMPTABLE_LEN < 256 - && HEATER_2_TEMPTABLE_LEN < 256 && HEATER_3_TEMPTABLE_LEN < 256 - && HEATER_4_TEMPTABLE_LEN < 256 && HEATER_5_TEMPTABLE_LEN < 256 - && HEATER_6_TEMPTABLE_LEN < 256 && HEATER_7_TEMPTABLE_LEN < 256 - && BED_TEMPTABLE_LEN < 256 && CHAMBER_TEMPTABLE_LEN < 256 - && PROBE_TEMPTABLE_LEN < 256, + TEMPTABLE_0_LEN < 256 && TEMPTABLE_1_LEN < 256 + && TEMPTABLE_2_LEN < 256 && TEMPTABLE_3_LEN < 256 + && TEMPTABLE_4_LEN < 256 && TEMPTABLE_5_LEN < 256 + && TEMPTABLE_6_LEN < 256 && TEMPTABLE_7_LEN < 256 + && TEMPTABLE_BED_LEN < 256 && TEMPTABLE_CHAMBER_LEN < 256 + && TEMPTABLE_PROBE_LEN < 256, "Temperature conversion tables over 255 entries need special consideration." ); @@ -327,181 +327,185 @@ static_assert( // For thermistors the highest temperature results in the lowest ADC value // For thermocouples the highest temperature results in the highest ADC value -#define _TT_REV(N) REVERSE_TEMP_SENSOR_RANGE_##N -#define TT_REV(N) _TT_REV(N) +#define _TT_REV(N) REVERSE_TEMP_SENSOR_RANGE_##N +#define TT_REV(N) _TT_REV(TEMP_SENSOR_##N##_THERMISTOR_ID) +#define _TT_REVRAW(N) !TEMP_SENSOR_##N##_IS_THERMISTOR +#define TT_REVRAW(N) (TT_REV(N) || _TT_REVRAW(N)) -#ifdef HEATER_0_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_0) - #define HEATER_0_SENSOR_MINTEMP_IND 0 - #define HEATER_0_SENSOR_MAXTEMP_IND HEATER_0_TEMPTABLE_LEN - 1 +#ifdef TEMPTABLE_0 + #if TT_REV(0) + #define TEMP_SENSOR_0_MINTEMP_IND 0 + #define TEMPTABLE_0_MAXTEMP_IND HEATER_0_LEN - 1 #else - #define HEATER_0_SENSOR_MINTEMP_IND HEATER_0_TEMPTABLE_LEN - 1 - #define HEATER_0_SENSOR_MAXTEMP_IND 0 + #define TEMPTABLE_0_MINTEMP_IND HEATER_0_LEN - 1 + #define TEMP_SENSOR_0_MAXTEMP_IND 0 #endif #endif -#ifdef HEATER_1_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_1) - #define HEATER_1_SENSOR_MINTEMP_IND 0 - #define HEATER_1_SENSOR_MAXTEMP_IND HEATER_1_TEMPTABLE_LEN - 1 +#ifdef TEMPTABLE_1 + #if TT_REV(1) + #define TEMP_SENSOR_1_MINTEMP_IND 0 + #define TEMPTABLE_1_MAXTEMP_IND HEATER_1_LEN - 1 #else - #define HEATER_1_SENSOR_MINTEMP_IND HEATER_1_TEMPTABLE_LEN - 1 - #define HEATER_1_SENSOR_MAXTEMP_IND 0 + #define TEMPTABLE_1_MINTEMP_IND HEATER_1_LEN - 1 + #define TEMP_SENSOR_1_MAXTEMP_IND 0 #endif #endif -#ifdef HEATER_2_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_2) - #define HEATER_2_SENSOR_MINTEMP_IND 0 - #define HEATER_2_SENSOR_MAXTEMP_IND HEATER_2_TEMPTABLE_LEN - 1 +#ifdef TEMPTABLE_2 + #if TT_REV(2) + #define TEMP_SENSOR_2_MINTEMP_IND 0 + #define TEMPTABLE_2_MAXTEMP_IND HEATER_2_LEN - 1 #else - #define HEATER_2_SENSOR_MINTEMP_IND HEATER_2_TEMPTABLE_LEN - 1 - #define HEATER_2_SENSOR_MAXTEMP_IND 0 + #define TEMPTABLE_2_MINTEMP_IND HEATER_2_LEN - 1 + #define TEMP_SENSOR_2_MAXTEMP_IND 0 #endif #endif -#ifdef HEATER_3_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_3) - #define HEATER_3_SENSOR_MINTEMP_IND 0 - #define HEATER_3_SENSOR_MAXTEMP_IND HEATER_3_TEMPTABLE_LEN - 1 +#ifdef TEMPTABLE_3 + #if TT_REV(3) + #define TEMP_SENSOR_3_MINTEMP_IND 0 + #define TEMPTABLE_3_MAXTEMP_IND HEATER_3_LEN - 1 #else - #define HEATER_3_SENSOR_MINTEMP_IND HEATER_3_TEMPTABLE_LEN - 1 - #define HEATER_3_SENSOR_MAXTEMP_IND 0 + #define TEMPTABLE_3_MINTEMP_IND HEATER_3_LEN - 1 + #define TEMP_SENSOR_3_MAXTEMP_IND 0 #endif #endif -#ifdef HEATER_4_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_4) - #define HEATER_4_SENSOR_MINTEMP_IND 0 - #define HEATER_4_SENSOR_MAXTEMP_IND HEATER_4_TEMPTABLE_LEN - 1 +#ifdef TEMPTABLE_4 + #if TT_REV(4) + #define TEMP_SENSOR_4_MINTEMP_IND 0 + #define TEMPTABLE_4_MAXTEMP_IND HEATER_4_LEN - 1 #else - #define HEATER_4_SENSOR_MINTEMP_IND HEATER_4_TEMPTABLE_LEN - 1 - #define HEATER_4_SENSOR_MAXTEMP_IND 0 + #define TEMPTABLE_4_MINTEMP_IND HEATER_4_LEN - 1 + #define TEMP_SENSOR_4_MAXTEMP_IND 0 #endif #endif -#ifdef HEATER_5_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_5) - #define HEATER_5_SENSOR_MINTEMP_IND 0 - #define HEATER_5_SENSOR_MAXTEMP_IND HEATER_5_TEMPTABLE_LEN - 1 +#ifdef TEMPTABLE_5 + #if TT_REV(5) + #define TEMP_SENSOR_5_MINTEMP_IND 0 + #define TEMPTABLE_5_MAXTEMP_IND HEATER_5_LEN - 1 #else - #define HEATER_5_SENSOR_MINTEMP_IND HEATER_5_TEMPTABLE_LEN - 1 - #define HEATER_5_SENSOR_MAXTEMP_IND 0 + #define TEMPTABLE_5_MINTEMP_IND HEATER_5_LEN - 1 + #define TEMP_SENSOR_5_MAXTEMP_IND 0 #endif #endif -#ifdef HEATER_6_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_6) - #define HEATER_6_SENSOR_MINTEMP_IND 0 - #define HEATER_6_SENSOR_MAXTEMP_IND HEATER_6_TEMPTABLE_LEN - 1 +#ifdef TEMPTABLE_6 + #if TT_REV(6) + #define TEMP_SENSOR_6_MINTEMP_IND 0 + #define TEMPTABLE_6_MAXTEMP_IND HEATER_6_LEN - 1 #else - #define HEATER_6_SENSOR_MINTEMP_IND HEATER_6_TEMPTABLE_LEN - 1 - #define HEATER_6_SENSOR_MAXTEMP_IND 0 + #define TEMPTABLE_6_MINTEMP_IND HEATER_6_LEN - 1 + #define TEMP_SENSOR_6_MAXTEMP_IND 0 #endif #endif -#ifdef HEATER_7_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_7) - #define HEATER_7_SENSOR_MINTEMP_IND 0 - #define HEATER_7_SENSOR_MAXTEMP_IND HEATER_7_TEMPTABLE_LEN - 1 +#ifdef TEMPTABLE_7 + #if TT_REV(7) + #define TEMP_SENSOR_7_MINTEMP_IND 0 + #define TEMPTABLE_7_MAXTEMP_IND HEATER_7_LEN - 1 #else - #define HEATER_7_SENSOR_MINTEMP_IND HEATER_7_TEMPTABLE_LEN - 1 - #define HEATER_7_SENSOR_MAXTEMP_IND 0 + #define TEMPTABLE_7_MINTEMP_IND HEATER_7_LEN - 1 + #define TEMP_SENSOR_7_MAXTEMP_IND 0 #endif #endif -#ifndef HEATER_0_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_0) || !HEATER_0_USES_THERMISTOR - #define HEATER_0_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_0_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_0_RAW_HI_TEMP + #if TT_REVRAW(0) + #define TEMP_SENSOR_0_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_0_RAW_LO_TEMP 0 #else - #define HEATER_0_RAW_HI_TEMP 0 - #define HEATER_0_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_0_RAW_HI_TEMP 0 + #define TEMP_SENSOR_0_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_1_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_1) || !HEATER_1_USES_THERMISTOR - #define HEATER_1_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_1_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_1_RAW_HI_TEMP + #if TT_REVRAW(1) + #define TEMP_SENSOR_1_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_1_RAW_LO_TEMP 0 #else - #define HEATER_1_RAW_HI_TEMP 0 - #define HEATER_1_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_1_RAW_HI_TEMP 0 + #define TEMP_SENSOR_1_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_2_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_2) || !HEATER_2_USES_THERMISTOR - #define HEATER_2_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_2_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_2_RAW_HI_TEMP + #if TT_REVRAW(2) + #define TEMP_SENSOR_2_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_2_RAW_LO_TEMP 0 #else - #define HEATER_2_RAW_HI_TEMP 0 - #define HEATER_2_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_2_RAW_HI_TEMP 0 + #define TEMP_SENSOR_2_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_3_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_3) || !HEATER_3_USES_THERMISTOR - #define HEATER_3_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_3_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_3_RAW_HI_TEMP + #if TT_REVRAW(3) + #define TEMP_SENSOR_3_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_3_RAW_LO_TEMP 0 #else - #define HEATER_3_RAW_HI_TEMP 0 - #define HEATER_3_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_3_RAW_HI_TEMP 0 + #define TEMP_SENSOR_3_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_4_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_4) || !HEATER_4_USES_THERMISTOR - #define HEATER_4_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_4_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_4_RAW_HI_TEMP + #if TT_REVRAW(4) + #define TEMP_SENSOR_4_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_4_RAW_LO_TEMP 0 #else - #define HEATER_4_RAW_HI_TEMP 0 - #define HEATER_4_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_4_RAW_HI_TEMP 0 + #define TEMP_SENSOR_4_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_5_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_5) || !HEATER_5_USES_THERMISTOR - #define HEATER_5_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_5_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_5_RAW_HI_TEMP + #if TT_REVRAW(5) + #define TEMP_SENSOR_5_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_5_RAW_LO_TEMP 0 #else - #define HEATER_5_RAW_HI_TEMP 0 - #define HEATER_5_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_5_RAW_HI_TEMP 0 + #define TEMP_SENSOR_5_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_6_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_6) || !HEATER_6_USES_THERMISTOR - #define HEATER_6_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_6_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_6_RAW_HI_TEMP + #if TT_REVRAW(6) + #define TEMP_SENSOR_6_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_6_RAW_LO_TEMP 0 #else - #define HEATER_6_RAW_HI_TEMP 0 - #define HEATER_6_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_6_RAW_HI_TEMP 0 + #define TEMP_SENSOR_6_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_7_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_7) || !HEATER_7_USES_THERMISTOR - #define HEATER_7_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_7_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_7_RAW_HI_TEMP + #if TT_REVRAW(7) + #define TEMP_SENSOR_7_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_7_RAW_LO_TEMP 0 #else - #define HEATER_7_RAW_HI_TEMP 0 - #define HEATER_7_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_7_RAW_HI_TEMP 0 + #define TEMP_SENSOR_7_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_BED_RAW_HI_TEMP - #if TT_REV(THERMISTORBED) || !HEATER_BED_USES_THERMISTOR - #define HEATER_BED_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_BED_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_BED_RAW_HI_TEMP + #if TT_REVRAW(BED) + #define TEMP_SENSOR_BED_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_BED_RAW_LO_TEMP 0 #else - #define HEATER_BED_RAW_HI_TEMP 0 - #define HEATER_BED_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_BED_RAW_HI_TEMP 0 + #define TEMP_SENSOR_BED_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_CHAMBER_RAW_HI_TEMP - #if TT_REV(THERMISTORCHAMBER) || !HEATER_CHAMBER_USES_THERMISTOR - #define HEATER_CHAMBER_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_CHAMBER_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_CHAMBER_RAW_HI_TEMP + #if TT_REVRAW(CHAMBER) + #define TEMP_SENSOR_CHAMBER_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_CHAMBER_RAW_LO_TEMP 0 #else - #define HEATER_CHAMBER_RAW_HI_TEMP 0 - #define HEATER_CHAMBER_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_CHAMBER_RAW_HI_TEMP 0 + #define TEMP_SENSOR_CHAMBER_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif -#ifndef HEATER_PROBE_RAW_HI_TEMP - #if TT_REV(THERMISTORPROBE) || !HEATER_PROBE_USES_THERMISTOR - #define HEATER_PROBE_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_PROBE_RAW_LO_TEMP 0 +#ifndef TEMP_SENSOR_PROBE_RAW_HI_TEMP + #if TT_REVRAW(PROBE) + #define TEMP_SENSOR_PROBE_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_PROBE_RAW_LO_TEMP 0 #else - #define HEATER_PROBE_RAW_HI_TEMP 0 - #define HEATER_PROBE_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_PROBE_RAW_HI_TEMP 0 + #define TEMP_SENSOR_PROBE_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif #undef _TT_REV #undef TT_REV +#undef _TT_REVRAW +#undef TT_REVRAW diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 54153beb1e..549b578f42 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -135,7 +135,7 @@ #define Y_STEP_PIN PE11 #define Y_DIR_PIN PE8 #define Y_ENABLE_PIN PD7 - #ifndef Y_CS_PIN +#ifndef Y_CS_PIN #define Y_CS_PIN PB8 #endif diff --git a/platformio.ini b/platformio.ini index 6008b943ec..9239ace72c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -235,7 +235,7 @@ HAS_L64XX = Arduino-L6470@0.8.0 src_filter=+ + + + NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ -MAX6675_._IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 +TEMP_.+_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 USES_LIQUIDCRYSTAL = bitbucket-fmalpartida/LiquidCrystal@1.5.0 USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 From 1bf469411af2557e9c93bcd139dd918c5c938f75 Mon Sep 17 00:00:00 2001 From: Malderin <52313714+Malderin@users.noreply.github.com> Date: Sun, 7 Feb 2021 20:45:14 -0300 Subject: [PATCH 0990/1370] Fix LVGL "more" menu user items (#21004) Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_adv.h | 7 + .../screens/custom_user_menus.cpp | 3 - Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp | 2 - .../lcd/extui/lib/mks_ui/tft_Language_en.h | 1 - .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 1 - .../lcd/extui/lib/mks_ui/tft_Language_it.h | 1 - .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 6 - .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 1 - .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 1 - .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 1 - .../extui/lib/mks_ui/tft_multi_language.cpp | 160 +++++++++++------- Marlin/src/lcd/menu/menu_custom.cpp | 1 - 12 files changed, 103 insertions(+), 82 deletions(-) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index d6245718f4..c2ba04f0bc 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -516,3 +516,10 @@ (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || \ (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \ (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) + +#if ENABLED(CUSTOM_USER_MENUS) + #define _HAS_1(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) + #define HAS_USER_ITEM(V...) DO(HAS,||,V) +#else + #define HAS_USER_ITEM(N) 0 +#endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp index 9c7c12e10b..ea175706f7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp @@ -35,9 +35,6 @@ using namespace Theme; #define _USER_ITEM(N) .tag(_ITEM_TAG(N)).button(USER_ITEM_POS(N), _USER_DESC(N)) #define _USER_ACTION(N) case _ITEM_TAG(N): injectCommands_P(PSTR(_USER_GCODE(N))); TERN_(USER_SCRIPT_RETURN, GOTO_SCREEN(StatusScreen)); break; -#define _HAS_1(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) -#define HAS_USER_ITEM(V...) DO(HAS,||,V) - void CustomUserMenus::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { CommandProcessor cmd; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp index 62769ae89f..1eb54d231e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp @@ -33,8 +33,6 @@ extern lv_group_t * g; static lv_obj_t * scr; -#define HAS_USER_ITEM(N) (ENABLED(CUSTOM_USER_MENUS) && defined(USER_DESC_##N) && defined(USER_GCODE_##N)) - enum { ID_GCODE = 1, #if HAS_USER_ITEM(1) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 5fa1c82027..fd5780e1d8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -734,4 +734,3 @@ #define MORE_CUSTOM4_TEXT_EN USER_DESC_4 #define MORE_CUSTOM5_TEXT_EN USER_DESC_5 #define MORE_CUSTOM6_TEXT_EN USER_DESC_6 -#define MORE_CUSTOM7_TEXT_EN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index 55416f0254..9440b8b0eb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -266,4 +266,3 @@ #define MORE_CUSTOM4_TEXT_FR USER_DESC_4 #define MORE_CUSTOM5_TEXT_FR USER_DESC_5 #define MORE_CUSTOM6_TEXT_FR USER_DESC_6 -#define MORE_CUSTOM7_TEXT_FR USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index d46cccfeb8..9b88de3df4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -263,4 +263,3 @@ #define MORE_CUSTOM4_TEXT_IT USER_DESC_4 #define MORE_CUSTOM5_TEXT_IT USER_DESC_5 #define MORE_CUSTOM6_TEXT_IT USER_DESC_6 -#define MORE_CUSTOM7_TEXT_IT USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index f5955c38d1..1989eaef1b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -261,11 +261,7 @@ #define MORE_CUSTOM4_TEXT_RU USER_DESC_4 #define MORE_CUSTOM5_TEXT_RU USER_DESC_5 #define MORE_CUSTOM6_TEXT_RU USER_DESC_6 -#define MORE_CUSTOM7_TEXT_RU USER_DESC_7 -//Malderin translate -// -// #define EEPROM_STORE_TIPS_RU "Cохранить наÑтройки в EEPROM?" #define EEPROM_READ_TIPS_RU "читать наÑтройки из EEPROM?" #define EEPROM_REVERT_TIPS_RU "CброÑить наÑтройки к значениÑм по умолчанию?" @@ -365,5 +361,3 @@ #define ENCODER_CONF_TITLE_RU "HаÑтройки принтера>HаÑтройки Ñнкодера" #define ENCODER_CONF_TEXT_RU "Ñнкодер иÑпользуетÑÑ?" - -//end of Malderin translate diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index 7ae87b5d3f..cc1a870339 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -501,4 +501,3 @@ #define MORE_CUSTOM4_TEXT_CN USER_DESC_4 #define MORE_CUSTOM5_TEXT_CN USER_DESC_5 #define MORE_CUSTOM6_TEXT_CN USER_DESC_6 -#define MORE_CUSTOM7_TEXT_CN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 28afe186f1..4654abddee 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -272,4 +272,3 @@ #define MORE_CUSTOM4_TEXT_SP USER_DESC_4 #define MORE_CUSTOM5_TEXT_SP USER_DESC_5 #define MORE_CUSTOM6_TEXT_SP USER_DESC_6 -#define MORE_CUSTOM7_TEXT_SP USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 8d38bc3c9a..8057a3110e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -499,4 +499,3 @@ #define MORE_CUSTOM4_TEXT_T_CN USER_DESC_4 #define MORE_CUSTOM5_TEXT_T_CN USER_DESC_5 #define MORE_CUSTOM6_TEXT_T_CN USER_DESC_6 -#define MORE_CUSTOM7_TEXT_T_CN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 1fd17c20f7..5ee184571f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -945,13 +945,24 @@ void disp_language_init() { more_menu.title = TITLE_MORE_CN; more_menu.gcode = MORE_GCODE_CN; more_menu.entergcode = MORE_ENTER_GCODE_CN; - TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_CN); - TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_CN); - TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_CN); - TERN_(USER_CMD_4_ENABLE, more_menu.custom4 = MORE_CUSTOM4_TEXT_CN); - TERN_(USER_CMD_5_ENABLE, more_menu.custom5 = MORE_CUSTOM5_TEXT_CN); - TERN_(USER_CMD_6_ENABLE, more_menu.custom6 = MORE_CUSTOM6_TEXT_CN); - TERN_(USER_CMD_7_ENABLE, more_menu.custom7 = MORE_CUSTOM7_TEXT_CN); + #if HAS_USER_ITEM(1) + more_menu.custom1 = MORE_CUSTOM1_TEXT_CN; + #endif + #if HAS_USER_ITEM(2) + more_menu.custom2 = MORE_CUSTOM2_TEXT_CN; + #endif + #if HAS_USER_ITEM(3) + more_menu.custom3 = MORE_CUSTOM3_TEXT_CN; + #endif + #if HAS_USER_ITEM(4) + more_menu.custom4 = MORE_CUSTOM4_TEXT_CN; + #endif + #if HAS_USER_ITEM(5) + more_menu.custom5 = MORE_CUSTOM5_TEXT_CN; + #endif + #if HAS_USER_ITEM(6) + more_menu.custom6 = MORE_CUSTOM6_TEXT_CN; + #endif // WIFI wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_CN; @@ -1179,13 +1190,24 @@ void disp_language_init() { more_menu.title = TITLE_MORE_T_CN; more_menu.gcode = MORE_GCODE_T_CN; more_menu.entergcode = MORE_ENTER_GCODE_T_CN; - TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_T_CN); - TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_T_CN); - TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_T_CN); - TERN_(USER_CMD_4_ENABLE, more_menu.custom4 = MORE_CUSTOM4_TEXT_T_CN); - TERN_(USER_CMD_5_ENABLE, more_menu.custom5 = MORE_CUSTOM5_TEXT_T_CN); - TERN_(USER_CMD_6_ENABLE, more_menu.custom6 = MORE_CUSTOM6_TEXT_T_CN); - TERN_(USER_CMD_7_ENABLE, more_menu.custom7 = MORE_CUSTOM7_TEXT_T_CN); + #if HAS_USER_ITEM(1) + more_menu.custom1 = MORE_CUSTOM1_TEXT_CN; + #endif + #if HAS_USER_ITEM(2) + more_menu.custom2 = MORE_CUSTOM2_TEXT_CN; + #endif + #if HAS_USER_ITEM(3) + more_menu.custom3 = MORE_CUSTOM3_TEXT_CN; + #endif + #if HAS_USER_ITEM(4) + more_menu.custom4 = MORE_CUSTOM4_TEXT_CN; + #endif + #if HAS_USER_ITEM(5) + more_menu.custom5 = MORE_CUSTOM5_TEXT_CN; + #endif + #if HAS_USER_ITEM(6) + more_menu.custom6 = MORE_CUSTOM6_TEXT_CN; + #endif // WIFI wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_T_CN; @@ -1400,13 +1422,24 @@ void disp_language_init() { more_menu.title = TITLE_MORE_EN; more_menu.gcode = MORE_GCODE_EN; more_menu.entergcode = MORE_ENTER_GCODE_EN; - TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_EN); - TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_EN); - TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_EN); - TERN_(USER_CMD_4_ENABLE, more_menu.custom4 = MORE_CUSTOM4_TEXT_EN); - TERN_(USER_CMD_5_ENABLE, more_menu.custom5 = MORE_CUSTOM5_TEXT_EN); - TERN_(USER_CMD_6_ENABLE, more_menu.custom6 = MORE_CUSTOM6_TEXT_EN); - TERN_(USER_CMD_7_ENABLE, more_menu.custom7 = MORE_CUSTOM7_TEXT_EN); + #if HAS_USER_ITEM(1) + more_menu.custom1 = MORE_CUSTOM1_TEXT_EN; + #endif + #if HAS_USER_ITEM(2) + more_menu.custom2 = MORE_CUSTOM2_TEXT_EN; + #endif + #if HAS_USER_ITEM(3) + more_menu.custom3 = MORE_CUSTOM3_TEXT_EN; + #endif + #if HAS_USER_ITEM(4) + more_menu.custom4 = MORE_CUSTOM4_TEXT_EN; + #endif + #if HAS_USER_ITEM(5) + more_menu.custom5 = MORE_CUSTOM5_TEXT_EN; + #endif + #if HAS_USER_ITEM(6) + more_menu.custom6 = MORE_CUSTOM6_TEXT_EN; + #endif // filesys_menu.title = TITLE_FILESYS_EN; @@ -1622,27 +1655,24 @@ void disp_language_init() { more_menu.title = TITLE_MORE_RU; more_menu.gcode = MORE_GCODE_RU; more_menu.entergcode = MORE_ENTER_GCODE_RU; - #if ENABLED(USER_CMD_1_ENABLE) + #if HAS_USER_ITEM(1) more_menu.custom1 = MORE_CUSTOM1_TEXT_RU; #endif - #if ENABLED(USER_CMD_2_ENABLE) + #if HAS_USER_ITEM(2) more_menu.custom2 = MORE_CUSTOM2_TEXT_RU; #endif - #if ENABLED(USER_CMD_3_ENABLE) + #if HAS_USER_ITEM(3) more_menu.custom3 = MORE_CUSTOM3_TEXT_RU; #endif - #if ENABLED(USER_CMD_4_ENABLE) + #if HAS_USER_ITEM(4) more_menu.custom4 = MORE_CUSTOM4_TEXT_RU; #endif - #if ENABLED(USER_CMD_5_ENABLE) + #if HAS_USER_ITEM(5) more_menu.custom5 = MORE_CUSTOM5_TEXT_RU; #endif - #if ENABLED(USER_CMD_6_ENABLE) + #if HAS_USER_ITEM(6) more_menu.custom6 = MORE_CUSTOM6_TEXT_RU; #endif - #if ENABLED(USER_CMD_7_ENABLE) - more_menu.custom7 = MORE_CUSTOM7_TEXT_RU; - #endif // filesys_menu.title = TITLE_FILESYS_RU; filesys_menu.sd_sys = SD_CARD_TEXT_RU; @@ -1954,27 +1984,24 @@ void disp_language_init() { more_menu.title = TITLE_MORE_SP; more_menu.gcode = MORE_GCODE_SP; more_menu.entergcode = MORE_ENTER_GCODE_SP; - #if ENABLED(USER_CMD_1_ENABLE) + #if HAS_USER_ITEM(1) more_menu.custom1 = MORE_CUSTOM1_TEXT_SP; #endif - #if ENABLED(USER_CMD_2_ENABLE) + #if HAS_USER_ITEM(2) more_menu.custom2 = MORE_CUSTOM2_TEXT_SP; #endif - #if ENABLED(USER_CMD_3_ENABLE) + #if HAS_USER_ITEM(3) more_menu.custom3 = MORE_CUSTOM3_TEXT_SP; #endif - #if ENABLED(USER_CMD_4_ENABLE) + #if HAS_USER_ITEM(4) more_menu.custom4 = MORE_CUSTOM4_TEXT_SP; #endif - #if ENABLED(USER_CMD_5_ENABLE) + #if HAS_USER_ITEM(5) more_menu.custom5 = MORE_CUSTOM5_TEXT_SP; #endif - #if ENABLED(USER_CMD_6_ENABLE) + #if HAS_USER_ITEM(6) more_menu.custom6 = MORE_CUSTOM6_TEXT_SP; #endif - #if ENABLED(USER_CMD_7_ENABLE) - more_menu.custom7 = MORE_CUSTOM7_TEXT_SP; - #endif // filesys_menu.title = TITLE_FILESYS_SP; filesys_menu.sd_sys = SD_CARD_TEXT_SP; @@ -2191,27 +2218,24 @@ void disp_language_init() { more_menu.title = TITLE_MORE_FR; more_menu.gcode = MORE_GCODE_FR; more_menu.entergcode = MORE_ENTER_GCODE_FR; - #if ENABLED(USER_CMD_1_ENABLE) + #if HAS_USER_ITEM(1) more_menu.custom1 = MORE_CUSTOM1_TEXT_FR; #endif - #if ENABLED(USER_CMD_2_ENABLE) + #if HAS_USER_ITEM(2) more_menu.custom2 = MORE_CUSTOM2_TEXT_FR; #endif - #if ENABLED(USER_CMD_3_ENABLE) + #if HAS_USER_ITEM(3) more_menu.custom3 = MORE_CUSTOM3_TEXT_FR; #endif - #if ENABLED(USER_CMD_4_ENABLE) + #if HAS_USER_ITEM(4) more_menu.custom4 = MORE_CUSTOM4_TEXT_FR; #endif - #if ENABLED(USER_CMD_5_ENABLE) + #if HAS_USER_ITEM(5) more_menu.custom5 = MORE_CUSTOM5_TEXT_FR; #endif - #if ENABLED(USER_CMD_6_ENABLE) + #if HAS_USER_ITEM(6) more_menu.custom6 = MORE_CUSTOM6_TEXT_FR; #endif - #if ENABLED(USER_CMD_7_ENABLE) - more_menu.custom7 = MORE_CUSTOM7_TEXT_FR; - #endif // filesys_menu.title = TITLE_FILESYS_FR; filesys_menu.sd_sys = SD_CARD_TEXT_FR; @@ -2429,27 +2453,24 @@ void disp_language_init() { more_menu.title = TITLE_MORE_IT; more_menu.gcode = MORE_GCODE_IT; more_menu.entergcode = MORE_ENTER_GCODE_IT; - #if ENABLED(USER_CMD_1_ENABLE) + #if HAS_USER_ITEM(1) more_menu.custom1 = MORE_CUSTOM1_TEXT_IT; #endif - #if ENABLED(USER_CMD_2_ENABLE) + #if HAS_USER_ITEM(2) more_menu.custom2 = MORE_CUSTOM2_TEXT_IT; #endif - #if ENABLED(USER_CMD_3_ENABLE) + #if HAS_USER_ITEM(3) more_menu.custom3 = MORE_CUSTOM3_TEXT_IT; #endif - #if ENABLED(USER_CMD_4_ENABLE) + #if HAS_USER_ITEM(4) more_menu.custom4 = MORE_CUSTOM4_TEXT_IT; #endif - #if ENABLED(USER_CMD_5_ENABLE) + #if HAS_USER_ITEM(5) more_menu.custom5 = MORE_CUSTOM5_TEXT_IT; #endif - #if ENABLED(USER_CMD_6_ENABLE) + #if HAS_USER_ITEM(6) more_menu.custom6 = MORE_CUSTOM6_TEXT_IT; #endif - #if ENABLED(USER_CMD_7_ENABLE) - more_menu.custom7 = MORE_CUSTOM7_TEXT_IT; - #endif // filesys_menu.title = TITLE_FILESYS_IT; filesys_menu.sd_sys = SD_CARD_TEXT_IT; @@ -2667,13 +2688,24 @@ void disp_language_init() { more_menu.title = TITLE_MORE_EN; more_menu.gcode = MORE_GCODE_EN; more_menu.entergcode = MORE_ENTER_GCODE_EN; - TERN_(USER_CMD_1_ENABLE, more_menu.custom1 = MORE_CUSTOM1_TEXT_EN); - TERN_(USER_CMD_2_ENABLE, more_menu.custom2 = MORE_CUSTOM2_TEXT_EN); - TERN_(USER_CMD_3_ENABLE, more_menu.custom3 = MORE_CUSTOM3_TEXT_EN); - TERN_(USER_CMD_4_ENABLE, more_menu.custom4 = MORE_CUSTOM4_TEXT_EN); - TERN_(USER_CMD_5_ENABLE, more_menu.custom5 = MORE_CUSTOM5_TEXT_EN); - TERN_(USER_CMD_6_ENABLE, more_menu.custom6 = MORE_CUSTOM6_TEXT_EN); - TERN_(USER_CMD_7_ENABLE, more_menu.custom7 = MORE_CUSTOM7_TEXT_EN); + #if HAS_USER_ITEM(1) + more_menu.custom1 = MORE_CUSTOM1_TEXT_EN; + #endif + #if HAS_USER_ITEM(2) + more_menu.custom2 = MORE_CUSTOM2_TEXT_EN; + #endif + #if HAS_USER_ITEM(3) + more_menu.custom3 = MORE_CUSTOM3_TEXT_EN; + #endif + #if HAS_USER_ITEM(4) + more_menu.custom4 = MORE_CUSTOM4_TEXT_EN; + #endif + #if HAS_USER_ITEM(5) + more_menu.custom5 = MORE_CUSTOM5_TEXT_EN; + #endif + #if HAS_USER_ITEM(6) + more_menu.custom6 = MORE_CUSTOM6_TEXT_EN; + #endif // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp index 7c54ec6e26..f3f946883f 100644 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ b/Marlin/src/lcd/menu/menu_custom.cpp @@ -46,7 +46,6 @@ void _lcd_user_gcode(PGM_P const cmd) { void menu_user() { START_MENU(); BACK_ITEM(MSG_MAIN); - #define HAS_USER_ITEM(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) #define USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); }); #if HAS_USER_ITEM(1) USER_ITEM(1); From 1aae6395c6f3d243525c37fc721790619c1a2f54 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 8 Feb 2021 15:36:04 +1300 Subject: [PATCH 0991/1370] Fix mini12864 v2.1 + PSU control + NeoPixel backlight (#21021) --- Marlin/src/feature/leds/leds.cpp | 12 +++++++----- Marlin/src/feature/leds/leds.h | 2 +- Marlin/src/lcd/marlinui.cpp | 2 +- Marlin/src/lcd/menu/menu_led.cpp | 13 +++++++++++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index ef9099fb20..c8cbdec33b 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -147,11 +147,13 @@ void LEDLights::set_color(const LEDColor &incol millis_t LEDLights::led_off_time; // = 0 void LEDLights::update_timeout(const bool power_on) { - const millis_t ms = millis(); - if (power_on) - reset_timeout(ms); - else if (ELAPSED(ms, led_off_time)) - set_off(); + if (lights_on) { + const millis_t ms = millis(); + if (power_on) + reset_timeout(ms); + else if (ELAPSED(ms, led_off_time)) + set_off(); + } } #endif diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index 57b21d576c..d41c61144a 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -203,7 +203,7 @@ public: public: static inline void reset_timeout(const millis_t &ms) { led_off_time = ms + LED_BACKLIGHT_TIMEOUT; - if (!lights_on) set_default(); + if (!lights_on) update(); } static void update_timeout(const bool power_on); #endif diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index eea697a464..eaee08f43b 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -994,7 +994,7 @@ void MarlinUI::update() { refresh(LCDVIEW_REDRAW_NOW); #ifdef LED_BACKLIGHT_TIMEOUT - leds.reset_timeout(ms); + if (!powersupply_on) leds.reset_timeout(ms); #endif } diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 552c03a69f..de57502788 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -121,11 +121,20 @@ void menu_led() { BACK_ITEM(MSG_MAIN); #if ENABLED(LED_CONTROL_MENU) - editable.state = leds.lights_on; - EDIT_ITEM(bool, MSG_LEDS, &editable.state, leds.toggle); + #if ENABLED(PSU_CONTROL) + extern bool powersupply_on; + #else + constexpr bool powersupply_on = true; + #endif + if (powersupply_on) { + editable.state = leds.lights_on; + EDIT_ITEM(bool, MSG_LEDS, &editable.state, leds.toggle); + } + #if ENABLED(LED_COLOR_PRESETS) ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds.set_default); #endif + #if ENABLED(NEOPIXEL2_SEPARATE) editable.state = leds2.lights_on; EDIT_ITEM(bool, MSG_LEDS2, &editable.state, leds2.toggle); From 127a4ada939ceaff4d7dce58ff5317c7c8527c2c Mon Sep 17 00:00:00 2001 From: MKS-Sean <56996910+MKS-Sean@users.noreply.github.com> Date: Mon, 8 Feb 2021 10:36:57 +0800 Subject: [PATCH 0992/1370] Fix: Unsupported use of %f in printf (#21001) --- .../lib/mks_ui/draw_acceleration_settings.cpp | 8 +-- .../draw_auto_level_offset_settings.cpp | 7 +- .../extui/lib/mks_ui/draw_baby_stepping.cpp | 20 ++++-- .../extui/lib/mks_ui/draw_jerk_settings.cpp | 9 +-- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 11 ++-- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 58 ++++++++--------- .../extui/lib/mks_ui/draw_pause_position.cpp | 7 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 3 +- .../extui/lib/mks_ui/draw_step_settings.cpp | 11 ++-- .../lib/mks_ui/draw_tmc_current_settings.cpp | 11 ++-- .../extui/lib/mks_ui/printer_operation.cpp | 11 ++-- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 64 +++++++++++++------ Marlin/src/module/temperature.cpp | 4 +- 15 files changed, 137 insertions(+), 95 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index 04c5ee77cb..4bc01c9e2d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -109,15 +109,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_acceleration_settings() { scr = lv_screen_create(ACCELERATION_UI, machine_menu.AccelerationConfTitle); - + char str_1[16]; if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.acceleration); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.acceleration, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.PrintAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ACCE_PRINT, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.retract_acceleration); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.retract_acceleration, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.RetractAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_ACCE_RETRA, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.travel_acceleration); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.travel_acceleration, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.TravelAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_ACCE_TRAVEL, 2, public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp index e41ad44c7a..f1cdbfe414 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -65,15 +65,16 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_auto_level_offset_settings() { + char str_1[16]; scr = lv_screen_create(NOZZLE_PROBE_OFFSET_UI, machine_menu.OffsetConfTitle); - sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); + sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.x, 1, 1, str_1) , 0)); lv_screen_menu_item_1_edit(scr, machine_menu.Xoffset, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_OFFSET_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.y, 0)); + sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.y, 1, 1, str_1) , 0)); lv_screen_menu_item_1_edit(scr, machine_menu.Yoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_OFFSET_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), probe.offset.z); + sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.z, 1, 1, str_1) , 0)); lv_screen_menu_item_1_edit(scr, machine_menu.Zoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_OFFSET_Z, 2, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_OFFSET_RETURN, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp index 255f6e8f8a..1e268c9e82 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -60,34 +60,35 @@ static uint8_t has_adjust_z = 0; static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; char baby_buf[30] = { 0 }; + char str_1[16]; switch (obj->mks_obj_id) { case ID_BABY_STEP_X_P: - sprintf_P(baby_buf, PSTR("M290 X%.3f"), babystep_dist); + sprintf_P(baby_buf, PSTR("M290 X%s"), dtostrf(babystep_dist, 1, 3, str_1)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; break; case ID_BABY_STEP_X_N: - sprintf_P(baby_buf, PSTR("M290 X%.3f"), -babystep_dist); + sprintf_P(baby_buf, PSTR("M290 X%s"), dtostrf(-babystep_dist, 1, 3, str_1)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; break; case ID_BABY_STEP_Y_P: - sprintf_P(baby_buf, PSTR("M290 Y%.3f"), babystep_dist); + sprintf_P(baby_buf, PSTR("M290 Y%s"), dtostrf(babystep_dist, 1, 3, str_1)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; break; case ID_BABY_STEP_Y_N: - sprintf_P(baby_buf, PSTR("M290 Y%.3f"), -babystep_dist); + sprintf_P(baby_buf, PSTR("M290 Y%s"), dtostrf(-babystep_dist, 1, 3, str_1)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; break; case ID_BABY_STEP_Z_P: - sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); + sprintf_P(baby_buf, PSTR("M290 Z%s"), dtostrf(babystep_dist, 1, 3, str_1)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; break; case ID_BABY_STEP_Z_N: - sprintf_P(baby_buf, PSTR("M290 Z%.3f"), -babystep_dist); + sprintf_P(baby_buf, PSTR("M290 Z%s"), dtostrf(-babystep_dist, 1, 3, str_1)); gcode.process_subcommands_now_P(PSTR(baby_buf)); has_adjust_z = 1; break; @@ -161,7 +162,12 @@ void disp_baby_step_dist() { void disp_z_offset_value() { char buf[20]; - sprintf_P(buf, PSTR("offset Z: %.3f"), (float)TERN(HAS_BED_PROBE, probe.offset.z, 0)); + #if HAS_BED_PROBE + char str_1[16]; + sprintf_P(buf, PSTR("Offset Z: %s mm"), dtostrf(probe.offset.z, 1, 3, str_1)); + #else + strcpy_P(buf, PSTR("Offset Z: 0 mm")); + #endif lv_label_set_text(zOffsetText, buf); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp index 1c4ac9da61..c911b09128 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -71,18 +71,19 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_jerk_settings() { + char str_1[16]; scr = lv_screen_create(JERK_UI, machine_menu.JerkConfTitle); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[X_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.X_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_JERK_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[Y_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_JERK_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[Z_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_JERK_Z, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[E_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[E_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.E_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_JERK_E, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_JERK_RETURN, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index 47bd906a51..cf74f42ee7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -80,25 +80,26 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_max_feedrate_settings() { + char str_1[16]; scr = lv_screen_create(MAXFEEDRATE_UI, machine_menu.MaxFeedRateConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.XMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.YMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FEED_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.ZMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_FEED_Z, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.E0MaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_FEED_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FEED_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.E1MaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_E1, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FEED_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index d10175344d..1c07583d53 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -52,6 +52,7 @@ enum { }; static void event_handler(lv_obj_t *obj, lv_event_t event) { + char str_1[16]; if (event != LV_EVENT_RELEASED) return; if (queue.length <= (BUFSIZE - 3)) { bool do_inject = true; @@ -63,7 +64,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { default: do_inject = false; } if (do_inject) { - sprintf_P(public_buf_l, PSTR("G91\nG1 %c%3.1f F%d\nG90"), cur_label, dist, uiCfg.moveSpeed); + sprintf_P(public_buf_l, PSTR("G91\nG1 %c%s F%d\nG90"), cur_label, dtostrf(dist, 1, 3, str_1), uiCfg.moveSpeed); queue.inject(public_buf_l); } } @@ -125,7 +126,8 @@ void lv_draw_move_motor() { } void disp_cur_pos() { - sprintf_P(public_buf_l, PSTR("%c:%3.1fmm"), cur_label, cur_pos); + char str_1[16]; + sprintf_P(public_buf_l, PSTR("%c:%s mm"), cur_label, dtostrf(cur_pos, 1, 1, str_1)); if (labelP) lv_label_set_text(labelP, public_buf_l); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 0694f89d74..d001175915 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -73,19 +73,20 @@ enum { static void disp_key_value() { char *temp; + char str_1[16]; #if HAS_TRINAMIC_CONFIG float milliamps; #endif switch (value) { case PrintAcceleration: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.acceleration); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.acceleration, 1, 1, str_1)); break; case RetractAcceleration: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.retract_acceleration); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.retract_acceleration, 1, 1, str_1)); break; case TravelAcceleration: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.travel_acceleration); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.travel_acceleration, 1, 1, str_1)); break; case XAcceleration: sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); @@ -103,105 +104,104 @@ static void disp_key_value() { sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); break; case XMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, str_1)); break; case YMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, str_1)); break; case ZMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, str_1)); break; case E0MaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, str_1)); break; case E1MaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, str_1)); break; case XJerk: #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[X_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[X_AXIS], 1, 1, str_1)); #endif break; case YJerk: #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[Y_AXIS], 1, 1, str_1)); #endif break; case ZJerk: #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[Z_AXIS], 1, 1, str_1)); #endif break; case EJerk: #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[E_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[E_AXIS], 1, 1, str_1)); #endif break; case Xstep: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); - + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, str_1)); break; case Ystep: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, str_1)); break; case Zstep: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, str_1)); break; case E0step: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, str_1)); break; case E1step: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, str_1)); break; case Xcurrent: #if AXIS_IS_TMC(X) milliamps = stepperX.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); #endif break; case Ycurrent: #if AXIS_IS_TMC(Y) milliamps = stepperY.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); #endif break; case Zcurrent: #if AXIS_IS_TMC(Z) milliamps = stepperZ.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); #endif break; case E0current: #if AXIS_IS_TMC(E0) milliamps = stepperE0.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); #endif break; case E1current: #if AXIS_IS_TMC(E1) milliamps = stepperE1.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); #endif break; case pause_pos_x: - sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosX); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosX, 1, 1, str_1)); break; case pause_pos_y: - sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosY); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosY, 1, 1, str_1)); break; case pause_pos_z: - sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosZ); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1)); break; case level_pos_x1: sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][0]); @@ -236,16 +236,16 @@ static void disp_key_value() { #if HAS_BED_PROBE case x_offset: #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.x); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.x, 1, 3, str_1)); #endif break; case y_offset: #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.y); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.y, 1, 3, str_1)); #endif break; case z_offset: - sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.z); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.z, 1, 3, str_1)); break; #endif case load_length: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index 46aa1a58d1..385276af39 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -60,15 +60,16 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_pause_position() { + char str_1[16]; scr = lv_screen_create(PAUSE_POS_UI, machine_menu.PausePosText); - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosX, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.xPos, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosY); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosY, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.yPos, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_PAUSE_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosZ); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.zPos, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_PAUSE_Z, 2, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_PAUSE_RETURN, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 273462ac90..f2fda3a286 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -56,7 +56,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); } } - #if DISABLED(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + #if HAS_MULTI_HOTEND else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 169cf1af7c..782ce21992 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -235,7 +235,8 @@ void disp_print_time() { } void disp_fan_Zpos() { - sprintf_P(public_buf_l, PSTR("%.3f"), current_position[Z_AXIS]); + char str_1[16]; + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(current_position[Z_AXIS], 1, 3, str_1)); lv_label_set_text(labelZpos, public_buf_l); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index c5cf45143f..a88669f371 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -79,25 +79,26 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_step_settings() { + char str_1[16]; scr = lv_screen_create(STEPS_UI, machine_menu.StepsConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.X_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_STEP_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_STEP_Z, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.E0_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_STEP_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_STEP_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.E1_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_E1, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_STEP_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index 61ee3be1c3..7f889461ea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -95,13 +95,14 @@ void lv_draw_tmc_current_settings() { scr = lv_screen_create(TMC_CURRENT_UI, machine_menu.TmcCurrentConfTitle); float milliamps; + char str_1[16]; if (!uiCfg.para_ui_page) { #if AXIS_IS_TMC(X) milliamps = stepperX.getMilliamps(); #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.X_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_X, 0, public_buf_l); #if AXIS_IS_TMC(Y) @@ -109,7 +110,7 @@ void lv_draw_tmc_current_settings() { #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_CURRENT_Y, 1, public_buf_l); #if AXIS_IS_TMC(Z) @@ -117,7 +118,7 @@ void lv_draw_tmc_current_settings() { #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_CURRENT_Z, 2, public_buf_l); #if AXIS_IS_TMC(E0) @@ -125,7 +126,7 @@ void lv_draw_tmc_current_settings() { #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.E0_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_TMC_CURRENT_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_DOWN, true); @@ -136,7 +137,7 @@ void lv_draw_tmc_current_settings() { #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); lv_screen_menu_item_1_edit(scr, machine_menu.E1_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_E1, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 4467df59d9..03bcf22822 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -42,6 +42,7 @@ extern uint32_t To_pre_view; extern bool flash_preview_begin, default_preview_flg, gcode_preview_over; void printer_state_polling() { + char str_1[16]; if (uiCfg.print_state == PAUSING) { #if ENABLED(SDSUPPORT) if (!planner.has_blocks_queued() && card.getIndex() > MIN_FILE_PRINTED) @@ -59,11 +60,11 @@ void printer_state_polling() { uiCfg.current_z_position_bak = current_position.z; if (gCfgItems.pausePosZ != (float)-1) { - sprintf_P(public_buf_l, PSTR("G91\nG1 Z%.1f\nG90"), gCfgItems.pausePosZ); + sprintf_P(public_buf_l, PSTR("G91\nG1 Z%s\nG90"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1)); gcode.process_subcommands_now(public_buf_l); } if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { - sprintf_P(public_buf_l, PSTR("G1 X%.1f Y%.1f"), gCfgItems.pausePosX, gCfgItems.pausePosY); + sprintf_P(public_buf_l, PSTR("G1 X%s Y%s"), dtostrf(gCfgItems.pausePosX, 1, 1, str_1), dtostrf(gCfgItems.pausePosY, 1, 1, str_1)); gcode.process_subcommands_now(public_buf_l); } uiCfg.print_state = PAUSED; @@ -83,12 +84,12 @@ void printer_state_polling() { if (uiCfg.print_state == RESUMING) { if (IS_SD_PAUSED()) { if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { - sprintf_P(public_buf_m, PSTR("G1 X%.1f Y%.1f"), uiCfg.current_x_position_bak, uiCfg.current_y_position_bak); + sprintf_P(public_buf_m, PSTR("G1 X%s Y%s"), dtostrf(uiCfg.current_x_position_bak, 1, 1, str_1), dtostrf(uiCfg.current_y_position_bak, 1, 1, str_1)); gcode.process_subcommands_now(public_buf_m); } if (gCfgItems.pausePosZ != (float)-1) { ZERO(public_buf_m); - sprintf_P(public_buf_m, PSTR("G1 Z%.1f"), uiCfg.current_z_position_bak); + sprintf_P(public_buf_m, PSTR("G1 Z%s"), dtostrf(uiCfg.current_z_position_bak, 1, 1, str_1)); gcode.process_subcommands_now(public_buf_m); } gcode.process_subcommands_now_P(M24_STR); @@ -126,7 +127,7 @@ void printer_state_polling() { gcode.process_subcommands_now(public_buf_m); if (gCfgItems.pause_reprint && gCfgItems.pausePosZ != -1.0f) { - sprintf_P(public_buf_l, PSTR("G91\nG1 Z-%.1f\nG90"), gCfgItems.pausePosZ); + sprintf_P(public_buf_l, PSTR("G91\nG1 Z-%s\nG90"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_2)); gcode.process_subcommands_now(public_buf_l); } #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 785e854c52..71cdb0f7d4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -874,38 +874,64 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } } break; + case 105: case 991: ZERO(tempBuf); if (cmd_value == 105) { - SEND_OK_TO_WIFI; - sprintf_P((char *)tempBuf, PSTR("T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n"), - (float)thermalManager.temp_hotend[0].celsius, (float)thermalManager.temp_hotend[0].target, + SEND_OK_TO_WIFI; + + char *outBuf = (char *)tempBuf; + char str_1[16], tbuf[34]; + + dtostrf(thermalManager.temp_hotend[0].celsius, 1, 1, tbuf); + strcat_P(tbuf, PSTR(" /")); + strcat(tbuf, dtostrf(thermalManager.temp_hotend[0].target, 1, 1, str_1)); + + const int tlen = strlen(tbuf); + + sprintf_P(outBuf, PSTR("T:%s"), tbuf); + outBuf += 2 + tlen; + + strcpy_P(outBuf, PSTR(" B:")); + outBuf += 3; #if HAS_HEATED_BED - (float)thermalManager.temp_bed.celsius, (float)thermalManager.temp_bed.target, + strcpy(outBuf, dtostrf(thermalManager.temp_bed.celsius, 1, 1, str_1)); + strcat_P(outBuf, PSTR(" /")); + strcat(outBuf, dtostrf(thermalManager.temp_bed.target, 1, 1, str_1)); #else - 0.0f, 0.0f, + strcpy_P(outBuf, PSTR("0 /0")); #endif - (float)thermalManager.temp_hotend[0].celsius, (float)thermalManager.temp_hotend[0].target, - #if DISABLED(SINGLENOZZLE) && HAS_MULTI_EXTRUDER - (float)thermalManager.temp_hotend[1].celsius, (float)thermalManager.temp_hotend[1].target + outBuf += 4; + + strcat_P(outBuf, PSTR(" T0:")); + strcat(outBuf, tbuf); + outBuf += 4 + tlen; + + strcat_P(outBuf, PSTR(" T1:")); + outBuf += 4; + #if HAS_MULTI_HOTEND + strcat(outBuf, dtostrf(thermalManager.temp_hotend[1].celsius, 1, 1, str_1)); + strcat_P(outBuf, PSTR(" /")); + strcat(outBuf, dtostrf(thermalManager.temp_hotend[1].target, 1, 1, str_1)); #else - 0.0f, 0.0f + strcat_P(outBuf, PSTR("0 /0")); #endif - ); + outBuf += 4; + + strcat_P(outBuf, PSTR(" @:0 B@:0\r\n")); } else { sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), - - (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, - #if HAS_HEATED_BED - (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target, - #else - 0, 0, - #endif - (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, - #if DISABLED(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, + #if HAS_HEATED_BED + (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target, + #else + 0, 0, + #endif + (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, + #if HAS_MULTI_HOTEND (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target #else 0, 0 diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index c935323867..f66d60ab15 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -3093,7 +3093,7 @@ void Temperature::tick() { #endif , H_CHAMBER ); - #endif // HAS_TEMP_CHAMBER + #endif #if HAS_TEMP_PROBE print_heater_state(degProbe(), 0 #if ENABLED(SHOW_TEMP_ADC_VALUES) @@ -3101,7 +3101,7 @@ void Temperature::tick() { #endif , H_PROBE ); - #endif // HAS_TEMP_PROBE + #endif #if HAS_MULTI_HOTEND HOTEND_LOOP() print_heater_state(degHotend(e), degTargetHotend(e) #if ENABLED(SHOW_TEMP_ADC_VALUES) From 86fd38ef4294fae2aed0a02fd66fd449f9a20d98 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 7 Feb 2021 20:43:18 -0600 Subject: [PATCH 0993/1370] Fix animated boot screen --- Marlin/src/lcd/dogm/dogm_Bootscreen.h | 4 ++++ Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 15 ++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Marlin/src/lcd/dogm/dogm_Bootscreen.h b/Marlin/src/lcd/dogm/dogm_Bootscreen.h index 0b8845ed79..4240861471 100644 --- a/Marlin/src/lcd/dogm/dogm_Bootscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Bootscreen.h @@ -39,6 +39,10 @@ #include "../../../_Bootscreen.h" + #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED) && DISABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) && !defined(CUSTOM_BOOTSCREEN_FRAME_TIME) + #define CUSTOM_BOOTSCREEN_FRAME_TIME 500 // (ms) + #endif + #ifndef CUSTOM_BOOTSCREEN_BMPWIDTH #define CUSTOM_BOOTSCREEN_BMPWIDTH 128 #endif diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index c7c5908b36..d2b1ce7740 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -118,12 +118,10 @@ bool MarlinUI::detected() { return true; } #endif #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED) - const void * const frame_ptr = pgm_read_ptr(&custom_bootscreen_animation[frame]); - #if ENABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME) - const boot_frame_t * const frame_info = (boot_frame_t*)frame_ptr; - const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)pgm_read_ptr(&frame_info->bitmap); + #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) + const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)pgm_read_ptr(&custom_bootscreen_animation[frame].bitmap); #else - const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)frame_ptr; + const u8g_pgm_uint8_t * const bmp = (u8g_pgm_uint8_t*)pgm_read_ptr(&custom_bootscreen_animation[frame]); #endif #else const u8g_pgm_uint8_t * const bmp = custom_start_bmp; @@ -150,16 +148,15 @@ bool MarlinUI::detected() { return true; } constexpr millis_t frame_time = 0; constexpr uint8_t f = 0; #else - #if DISABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME) + #if DISABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) constexpr millis_t frame_time = CUSTOM_BOOTSCREEN_FRAME_TIME; #endif LOOP_L_N(f, COUNT(custom_bootscreen_animation)) #endif { - #if ENABLED(CUSTOM_BOOTSCREEN_TIME_PER_FRAME) + #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) const uint8_t fr = _MIN(f, COUNT(custom_bootscreen_animation) - 1); - const boot_frame_t * const frame_info = (boot_frame_t*)pgm_read_ptr(&custom_bootscreen_animation[fr]); - const millis_t frame_time = pgm_read_word(&frame_info->duration); + const millis_t frame_time = pgm_read_word(&custom_bootscreen_animation[fr].duration); #endif u8g.firstPage(); do { draw_custom_bootscreen(f); } while (u8g.nextPage()); From 13f0e4729c3e926c7858285d6e7fa1aa5d5858e6 Mon Sep 17 00:00:00 2001 From: "Alexander D. Kanevskiy" Date: Mon, 8 Feb 2021 06:44:49 +0200 Subject: [PATCH 0994/1370] Allow SERVO0_PIN override on Creality Melzi (#21007) --- Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index 97db36dd54..225392de1b 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -68,8 +68,12 @@ #define LCD_PINS_D4 30 // ST9720 CLK #if ENABLED(BLTOUCH) - #define SERVO0_PIN 27 - #undef BEEPER_PIN + #ifndef SERVO0_PIN + #define SERVO0_PIN 27 + #endif + #if SERVO0_PIN == BEEPER_PIN + #undef BEEPER_PIN + #endif #elif ENABLED(FILAMENT_RUNOUT_SENSOR) #ifndef FIL_RUNOUT_PIN #define FIL_RUNOUT_PIN 27 From 897d29ea31111eee651cb3bbf2bd4ede1ed5311a Mon Sep 17 00:00:00 2001 From: Arjan Mels <43108771+arjanmels@users.noreply.github.com> Date: Mon, 8 Feb 2021 05:47:08 +0100 Subject: [PATCH 0995/1370] Fix STM32F1 emergency parser (#21011) --- Marlin/src/HAL/STM32F1/HAL.cpp | 29 +++++++++++++++++++++++++++- Marlin/src/HAL/STM32F1/msc_sd.cpp | 32 +++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index c1e29a843c..2f29b9b0e3 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -84,7 +84,32 @@ #if defined(SERIAL_USB) && !HAS_SD_HOST_DRIVE USBSerial SerialUSB; - DefaultSerial MSerial(false, SerialUSB); + DefaultSerial MSerial(true, SerialUSB); + + #if ENABLED(EMERGENCY_PARSER) + #include "../libmaple/usb/stm32f1/usb_reg_map.h" + #include "libmaple/usb_cdcacm.h" + // The original callback is not called (no way to retrieve address). + // That callback detects a special STM32 reset sequence: this functionality is not essential + // as M997 achieves the same. + void my_rx_callback(unsigned int, void*) { + // max length of 16 is enough to contain all emergency commands + uint8 buf[16]; + + //rx is usbSerialPart.endpoints[2] + uint16 len = usb_get_ep_rx_count(USB_CDCACM_RX_ENDP); + uint32 total = usb_cdcacm_data_available(); + + if (len == 0 || total == 0 || !WITHIN(total, len, COUNT(buf))) + return; + + // cannot get character by character due to bug in composite_cdcacm_peek_ex + len = usb_cdcacm_peek(buf, total); + + for (uint32 i = 0; i < len; i++) + emergency_parser.update(MSerial.emergency_state, buf[i + total - len]); + } + #endif #endif uint16_t HAL_adc_result; @@ -254,6 +279,8 @@ void HAL_init() { #endif #if HAS_SD_HOST_DRIVE MSC_SD_init(); + #elif BOTH(SERIAL_USB, EMERGENCY_PARSER) + usb_cdcacm_set_hooks(USB_CDCACM_HOOK_RX, my_rx_callback); #endif #if PIN_EXISTS(USB_CONNECT) OUT_WRITE(USB_CONNECT_PIN, !USB_CONNECT_INVERTING); // USB clear connection diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index 548a6dbc57..a916184999 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -19,6 +19,7 @@ #include "msc_sd.h" #include "SPI.h" +#include "usb_reg_map.h" #define PRODUCT_ID 0x29 @@ -41,14 +42,27 @@ Serial0Type MarlinCompositeSerial(true); #endif #if ENABLED(EMERGENCY_PARSER) - void (*real_rx_callback)(void); - void my_rx_callback(void) { - real_rx_callback(); - int len = MarlinCompositeSerial.available(); - while (len-- > 0) // >0 because available() may return a negative value - emergency_parser.update(MarlinCompositeSerial.emergency_state, MarlinCompositeSerial.peek()); - } +// The original callback is not called (no way to retrieve address). +// That callback detects a special STM32 reset sequence: this functionality is not essential +// as M997 achieves the same. +void my_rx_callback(unsigned int, void*) { + // max length of 16 is enough to contain all emergency commands + uint8 buf[16]; + + //rx is usbSerialPart.endpoints[2] + uint16 len = usb_get_ep_rx_count(usbSerialPart.endpoints[2].address); + uint32 total = composite_cdcacm_data_available(); + + if (len == 0 || total == 0 || !WITHIN(total, len, COUNT(buf))) + return; + + // cannot get character by character due to bug in composite_cdcacm_peek_ex + len = composite_cdcacm_peek(buf, total); + + for (uint32 i = 0; i < len; i++) + emergency_parser.update(MarlinCompositeSerial.emergency_state, buf[i+total-len]); +} #endif void MSC_SD_init() { @@ -73,9 +87,7 @@ void MSC_SD_init() { MarlinCompositeSerial.registerComponent(); USBComposite.begin(); #if ENABLED(EMERGENCY_PARSER) - //rx is usbSerialPart.endpoints[2] - real_rx_callback = usbSerialPart.endpoints[2].callback; - usbSerialPart.endpoints[2].callback = my_rx_callback; + composite_cdcacm_set_hooks(USBHID_CDCACM_HOOK_RX, my_rx_callback); #endif } From 77f48d2bad99c713fecf0ca54933eec960f5891f Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Mon, 8 Feb 2021 07:37:24 +0100 Subject: [PATCH 0996/1370] Serial refactor. Default 8-bit ECHO to int, not char (#20985) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/AVR/MarlinSerial.cpp | 2 +- Marlin/src/HAL/AVR/MarlinSerial.h | 2 +- Marlin/src/HAL/AVR/pinsDebug.h | 22 +-- Marlin/src/HAL/DUE/MarlinSerialUSB.cpp | 9 +- Marlin/src/HAL/DUE/MarlinSerialUSB.h | 19 ++- Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp | 6 +- Marlin/src/HAL/STM32F1/MarlinSerial.h | 26 ---- Marlin/src/HAL/shared/backtrace/backtrace.cpp | 4 +- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/core/macros.h | 6 + Marlin/src/core/serial.cpp | 4 +- Marlin/src/core/serial.h | 132 ++++++++++-------- Marlin/src/core/serial_base.h | 120 ++++++++++------ Marlin/src/core/serial_hook.h | 7 +- Marlin/src/feature/bedlevel/abl/abl.cpp | 4 +- Marlin/src/feature/bedlevel/bedlevel.cpp | 4 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 4 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 8 +- Marlin/src/feature/binary_stream.h | 2 +- Marlin/src/feature/bltouch.cpp | 6 +- Marlin/src/feature/cancel_object.cpp | 5 +- Marlin/src/feature/encoder_i2c.cpp | 8 +- Marlin/src/feature/encoder_i2c.h | 10 +- Marlin/src/feature/mixing.cpp | 4 +- Marlin/src/feature/mixing.h | 14 +- Marlin/src/feature/mmu/mmu2.cpp | 6 +- Marlin/src/feature/pause.cpp | 14 +- Marlin/src/feature/powerloss.cpp | 12 +- Marlin/src/feature/repeat.cpp | 6 +- Marlin/src/gcode/bedlevel/G26.cpp | 2 +- Marlin/src/gcode/bedlevel/G35.cpp | 4 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 4 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 6 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 18 +-- Marlin/src/gcode/calibrate/G425.cpp | 4 +- Marlin/src/gcode/calibrate/M48.cpp | 4 +- Marlin/src/gcode/config/M217.cpp | 2 +- Marlin/src/gcode/config/M305.cpp | 2 +- Marlin/src/gcode/config/M43.cpp | 6 +- Marlin/src/gcode/config/M92.cpp | 2 +- Marlin/src/gcode/control/M605.cpp | 16 +-- Marlin/src/gcode/eeprom/M500-M504.cpp | 4 +- Marlin/src/gcode/feature/advance/M900.cpp | 6 +- Marlin/src/gcode/feature/leds/M7219.cpp | 2 +- Marlin/src/gcode/feature/mixing/M166.cpp | 4 +- .../src/gcode/feature/network/M552-M554.cpp | 2 +- Marlin/src/gcode/feature/pause/G61.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 4 +- Marlin/src/gcode/host/M113.cpp | 2 +- Marlin/src/gcode/host/M360.cpp | 2 +- Marlin/src/gcode/motion/M290.cpp | 2 +- Marlin/src/gcode/parser.cpp | 6 +- Marlin/src/gcode/parser.h | 4 +- Marlin/src/gcode/probe/M851.cpp | 6 +- Marlin/src/gcode/queue.cpp | 4 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 2 +- .../ftdi_eve_lib/basic/commands.cpp | 4 +- .../ftdi_eve_lib/extended/event_loop.cpp | 4 +- .../ftdi_eve_lib/extended/screen_types.cpp | 2 +- .../ftdi_eve_lib/extended/sound_player.cpp | 4 +- Marlin/src/lcd/marlinui.cpp | 4 +- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/libs/bresenham.h | 2 +- Marlin/src/module/motion.cpp | 6 +- Marlin/src/module/probe.cpp | 2 +- Marlin/src/module/settings.cpp | 38 +++-- Marlin/src/module/temperature.cpp | 6 +- Marlin/src/module/tool_change.cpp | 26 ++-- Marlin/src/sd/SdBaseFile.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 2 +- docs/Serial.md | 20 +++ 72 files changed, 379 insertions(+), 337 deletions(-) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 265acfae92..562a70ced7 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -595,7 +595,7 @@ MSerialT customizedSerial1(MSerialT::HasEmergencyParser); MarlinSerial>::_tx_udr_empty_irq(); } - template class MarlinSerial< MarlinSerialCfg >; + template class MarlinSerial< MMU2SerialCfg >; MSerialT3 mmuSerial(MSerialT3::HasEmergencyParser); #endif diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 2834dbed35..9abc3dbed0 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -263,7 +263,7 @@ }; typedef Serial0Type< MarlinSerial< MMU2SerialCfg > > MSerialT3; - extern MSerial3 mmuSerial; + extern MSerialT3 mmuSerial; #endif #ifdef LCD_SERIAL_PORT diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h index dac6b1b150..6bf9f33a0c 100644 --- a/Marlin/src/HAL/AVR/pinsDebug.h +++ b/Marlin/src/HAL/AVR/pinsDebug.h @@ -235,8 +235,8 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); inline void com_print(const uint8_t N, const uint8_t Z) { const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); - SERIAL_ECHOPGM(" COM"); - SERIAL_CHAR('0' + N, Z); + SERIAL_ECHOPAIR(" COM", AS_CHAR('0' + N)); + SERIAL_CHAR(Z); SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03)); } @@ -247,8 +247,8 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1)))); if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1); - SERIAL_ECHOPGM(" TIMER"); - SERIAL_CHAR(T + '0', L); + SERIAL_ECHOPAIR(" TIMER", AS_CHAR(T + '0')); + SERIAL_CHAR(L); SERIAL_ECHO_SP(3); if (N == 3) { @@ -262,19 +262,11 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - SERIAL_ECHOPAIR(" WGM: ", WGM); com_print(T,L); SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) )); - - SERIAL_ECHOPGM(" TCCR"); - SERIAL_CHAR(T + '0'); - SERIAL_ECHOPAIR("A: ", *TCCRA); - - SERIAL_ECHOPGM(" TCCR"); - SERIAL_CHAR(T + '0'); - SERIAL_ECHOPAIR("B: ", *TCCRB); + SERIAL_ECHOPAIR(" TCCR", AS_CHAR(T + '0'), "A: ", *TCCRA); + SERIAL_ECHOPAIR(" TCCR", AS_CHAR(T + '0'), "B: ", *TCCRB); const uint8_t *TMSK = (uint8_t*)TIMSK(T); - SERIAL_ECHOPGM(" TIMSK"); - SERIAL_CHAR(T + '0'); - SERIAL_ECHOPAIR(": ", *TMSK); + SERIAL_ECHOPAIR(" TIMSK", AS_CHAR(T + '0'), ": ", *TMSK); const uint8_t OCIE = L - 'A' + 1; if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); } diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp index d85aaf14b0..a04993ca35 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp @@ -33,10 +33,6 @@ #include "MarlinSerialUSB.h" -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - // Imports from Atmel USB Stack/CDC implementation extern "C" { bool usb_task_cdc_isenabled(); @@ -69,7 +65,7 @@ int MarlinSerialUSB::peek() { pending_char = udi_cdc_getc(); - TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)pending_char)); + TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast(this)->emergency_state, (char)pending_char)); return pending_char; } @@ -91,7 +87,7 @@ int MarlinSerialUSB::read() { int c = udi_cdc_getc(); - TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)c)); + TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast(this)->emergency_state, (char)c)); return c; } @@ -105,7 +101,6 @@ bool MarlinSerialUSB::available() { } void MarlinSerialUSB::flush() { } -void MarlinSerialUSB::flushTX() { } size_t MarlinSerialUSB::write(const uint8_t c) { diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h index 9643a8465a..5281a006b1 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.h @@ -34,21 +34,20 @@ struct MarlinSerialUSB { - static void begin(const long); - static void end(); - static int peek(); - static int read(); - static void flush(); - static void flushTX(); - static bool available(); - static size_t write(const uint8_t c); + void begin(const long); + void end(); + int peek(); + int read(); + void flush(); + bool available(); + size_t write(const uint8_t c); #if ENABLED(SERIAL_STATS_DROPPED_RX) - FORCE_INLINE static uint32_t dropped() { return 0; } + FORCE_INLINE uint32_t dropped() { return 0; } #endif #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - FORCE_INLINE static int rxMaxEnqueued() { return 0; } + FORCE_INLINE int rxMaxEnqueued() { return 0; } #endif }; typedef Serial0Type MSerialT; diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp index 54a64ccd72..b97b161dc9 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp @@ -84,16 +84,16 @@ static void debug_rw(const bool write, int &pos, const uint8_t *value, const siz PGM_P const rw_str = write ? PSTR("write") : PSTR("read"); SERIAL_CHAR(' '); serialprintPGM(rw_str); - SERIAL_ECHOLNPAIR("_data(", pos, ",", int(value), ",", int(size), ", ...)"); + SERIAL_ECHOLNPAIR("_data(", pos, ",", value, ",", size, ", ...)"); if (total) { SERIAL_ECHOPGM(" f_"); serialprintPGM(rw_str); - SERIAL_ECHOPAIR("()=", int(s), "\n size=", int(size), "\n bytes_"); + SERIAL_ECHOPAIR("()=", s, "\n size=", size, "\n bytes_"); serialprintPGM(write ? PSTR("written=") : PSTR("read=")); SERIAL_ECHOLN(total); } else - SERIAL_ECHOLNPAIR(" f_lseek()=", int(s)); + SERIAL_ECHOLNPAIR(" f_lseek()=", s); } // File function return codes for type FRESULT. This goes away soon, but diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index 4c0bf0e100..692e97e618 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -28,10 +28,6 @@ #include "../../inc/MarlinConfigPre.h" #include "../../core/serial_hook.h" -#if HAS_TFT_LVGL_UI - extern "C" { extern char public_buf_m[100]; } -#endif - // Increase priority of serial interrupts, to reduce overflow errors #define UART_IRQ_PRIO 1 @@ -49,28 +45,6 @@ struct MarlinSerial : public HardwareSerial { nvic_irq_set_priority(c_dev()->irq_num, UART_IRQ_PRIO); } #endif - - #if HAS_TFT_LVGL_UI - // Hook the serial write method to capture the output of GCode command sent via LCD - uint32_t current_wpos; - void (*line_callback)(void *, const char * msg); - void *user_pointer; - - void set_hook(void (*hook)(void *, const char *), void * that) { line_callback = hook; user_pointer = that; current_wpos = 0; } - - size_t write(uint8_t c) { - if (line_callback) { - if (c == '\n' || current_wpos == sizeof(public_buf_m) - 1) { // End of line, probably end of command anyway - public_buf_m[current_wpos] = 0; - line_callback(user_pointer, public_buf_m); - current_wpos = 0; - } - else - public_buf_m[current_wpos++] = c; - } - return HardwareSerial::write(c); - } - #endif }; typedef Serial0Type MSerialT; diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index 605e165b05..4a8990c00b 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -35,9 +35,9 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { (*p)++; SERIAL_CHAR('#'); SERIAL_ECHO(*p); SERIAL_ECHOPGM(" : "); - SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, HEX); + SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, PrintBase::Hex); SERIAL_CHAR('+'); SERIAL_ECHO(bte->address - bte->function); - SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address,HEX); SERIAL_CHAR('\n'); + SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address, PrintBase::Hex); SERIAL_CHAR('\n'); return true; } diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index df383d8a96..6b2259dd08 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1003,7 +1003,7 @@ void setup() { ); #endif SERIAL_ECHO_MSG("Compiled: " __DATE__); - SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); + SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, sizeof(block_t) * (BLOCK_BUFFER_SIZE)); // Some HAL need precise delay adjustment calibrate_delay_loop(); diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 8361248e1c..0112dbc736 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -321,6 +321,12 @@ namespace Private { template struct enable_if { }; template struct enable_if { typedef _Tp type; }; + + template struct is_same { enum { value = false }; }; + template struct is_same { enum { value = true }; }; + + template struct first_type_of { typedef T type; }; + template struct first_type_of { typedef T type; }; } // C++11 solution using SFINAE to detect the existance of a member in a class at compile time. // It creates a HasMember structure containing 'value' set to true if the member exists diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 365f28ba55..31f6d67e32 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -59,12 +59,14 @@ void serialprintPGM(PGM_P str) { void serial_echo_start() { static PGMSTR(echomagic, "echo:"); serialprintPGM(echomagic); } void serial_error_start() { static PGMSTR(errormagic, "Error:"); serialprintPGM(errormagic); } +void serial_echopair_PGM(PGM_P const s_P, serial_char_t v) { serialprintPGM(s_P); SERIAL_CHAR(v.c); } void serial_echopair_PGM(PGM_P const s_P, const char *v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(PGM_P const s_P, char v) { serialprintPGM(s_P); SERIAL_CHAR(v); } +void serial_echopair_PGM(PGM_P const s_P, char v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_PGM(PGM_P const s_P, int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_PGM(PGM_P const s_P, long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_PGM(PGM_P const s_P, float v) { serialprintPGM(s_P); SERIAL_DECIMAL(v); } void serial_echopair_PGM(PGM_P const s_P, double v) { serialprintPGM(s_P); SERIAL_DECIMAL(v); } +void serial_echopair_PGM(PGM_P const s_P, unsigned char v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_PGM(PGM_P const s_P, unsigned int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_PGM(PGM_P const s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 4c0c32f7d8..c422f8e25b 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -81,37 +81,49 @@ typedef int8_t serial_index_t; #define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) #define SERIAL_PORTMASK(P) _BV(P) -#define SERIAL_ECHO(x) SERIAL_OUT(print, x) -#define SERIAL_ECHO_F(V...) SERIAL_OUT(print, V) -#define SERIAL_ECHOLN(x) SERIAL_OUT(println, x) -#define SERIAL_PRINT(x,b) SERIAL_OUT(print, x, b) -#define SERIAL_PRINTLN(x,b) SERIAL_OUT(println, x, b) -#define SERIAL_FLUSH() SERIAL_OUT(flush) +// +// SERIAL_CHAR - Print one or more individual chars +// +inline void SERIAL_CHAR(char a) { SERIAL_IMPL.write(a); } +template +void SERIAL_CHAR(char a, Args ... args) { SERIAL_IMPL.write(a); SERIAL_CHAR(args ...); } -#ifdef ARDUINO_ARCH_STM32 - #define SERIAL_FLUSHTX() SERIAL_OUT(flush) -#elif TX_BUFFER_SIZE > 0 - #define SERIAL_FLUSHTX() SERIAL_OUT(flushTX) -#else - #define SERIAL_FLUSHTX() -#endif +/** + * SERIAL_ECHO - Print a single string or value. + * Any numeric parameter (including char) is printed as a base-10 number. + * A string pointer or literal will be output as a string. + * + * NOTE: Use SERIAL_CHAR to print char as a single character. + */ +template +void SERIAL_ECHO(T x) { SERIAL_IMPL.print(x); } -// Print up to 10 chars from a list -#define __CHAR_N(N,V...) _CHAR_##N(V) -#define _CHAR_N(N,V...) __CHAR_N(N,V) -#define _CHAR_1(c) SERIAL_OUT(write, c) -#define _CHAR_2(a,b) do{ _CHAR_1(a); _CHAR_1(b); }while(0) -#define _CHAR_3(a,V...) do{ _CHAR_1(a); _CHAR_2(V); }while(0) -#define _CHAR_4(a,V...) do{ _CHAR_1(a); _CHAR_3(V); }while(0) -#define _CHAR_5(a,V...) do{ _CHAR_1(a); _CHAR_4(V); }while(0) -#define _CHAR_6(a,V...) do{ _CHAR_1(a); _CHAR_5(V); }while(0) -#define _CHAR_7(a,V...) do{ _CHAR_1(a); _CHAR_6(V); }while(0) -#define _CHAR_8(a,V...) do{ _CHAR_1(a); _CHAR_7(V); }while(0) -#define _CHAR_9(a,V...) do{ _CHAR_1(a); _CHAR_8(V); }while(0) -#define _CHAR_10(a,V...) do{ _CHAR_1(a); _CHAR_9(V); }while(0) +// Wrapper for ECHO commands to interpret a char +typedef struct SerialChar { char c; SerialChar(char n) : c(n) { } } serial_char_t; +inline void SERIAL_ECHO(serial_char_t x) { SERIAL_IMPL.write(x.c); } +#define AS_CHAR(C) serial_char_t(C) -#define SERIAL_CHAR(V...) _CHAR_N(NUM_ARGS(V),V) +// SERIAL_ECHO_F prints a floating point value with optional precision +inline void SERIAL_ECHO_F(EnsureDouble x, int digit = 2) { SERIAL_IMPL.print(x, digit); } +template +void SERIAL_ECHOLN(T x) { SERIAL_IMPL.println(x); } + +// SERIAL_PRINT works like SERIAL_ECHO but allow to specify the encoding base of the number printed +template +void SERIAL_PRINT(T x, U y) { SERIAL_IMPL.print(x, y); } + +template +void SERIAL_PRINTLN(T x, U y) { SERIAL_IMPL.println(x, y); } + +// Flush the serial port +inline void SERIAL_FLUSH() { SERIAL_IMPL.flush(); } +inline void SERIAL_FLUSHTX() { SERIAL_IMPL.flushTX(); } + +// Print a single PROGMEM string to serial +void serialprintPGM(PGM_P str); + +// SERIAL_ECHOPAIR / SERIAL_ECHOPAIR_P is used to output a key value pair. The key must be a string and the value can be anything // Print up to 12 pairs of values. Odd elements auto-wrapped in PSTR(). #define __SEP_N(N,V...) _SEP_##N(V) #define _SEP_N(N,V...) __SEP_N(N,V) @@ -170,6 +182,7 @@ typedef int8_t serial_index_t; #define _SEP_23_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_21_P(V); }while(0) #define _SEP_24_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_22_P(V); }while(0) +// SERIAL_ECHOPAIR_P is used to output a key value pair. Unlike SERIAL_ECHOPAIR, the key must be a PGM string already and the value can be anything #define SERIAL_ECHOPAIR_P(V...) _SEP_N_P(NUM_ARGS(V),V) // Print up to 12 pairs of values followed by newline @@ -244,32 +257,39 @@ typedef int8_t serial_index_t; #define SERIAL_ECHOLNPAIR_P(V...) _SELP_N_P(NUM_ARGS(V),V) -// Print up to 20 comma-separated pairs of values -#define __SLST_N(N,V...) _SLST_##N(V) -#define _SLST_N(N,V...) __SLST_N(N,V) -#define _SLST_1(a) SERIAL_ECHO(a) -#define _SLST_2(a,b) do{ SERIAL_ECHO(a); SERIAL_ECHOPAIR(", ",b); }while(0) -#define _SLST_3(a,b,c) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_1(c); }while(0) -#define _SLST_4(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_2(V); }while(0) -#define _SLST_5(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_3(V); }while(0) -#define _SLST_6(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_4(V); }while(0) -#define _SLST_7(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_5(V); }while(0) -#define _SLST_8(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_6(V); }while(0) -#define _SLST_9(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_7(V); }while(0) -#define _SLST_10(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_8(V); }while(0) -#define _SLST_11(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_9(V); }while(0) -#define _SLST_12(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_10(V); }while(0) -#define _SLST_13(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_11(V); }while(0) -#define _SLST_14(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_12(V); }while(0) -#define _SLST_15(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_13(V); }while(0) -#define _SLST_16(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_14(V); }while(0) -#define _SLST_17(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_15(V); }while(0) -#define _SLST_18(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_16(V); }while(0) -#define _SLST_19(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_17(V); }while(0) -#define _SLST_20(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_18(V); }while(0) // Eat two args, pass the rest up +#ifdef AllowDifferentTypeInList -#define SERIAL_ECHOLIST(pre,V...) do{ SERIAL_ECHOPGM(pre); _SLST_N(NUM_ARGS(V),V); }while(0) -#define SERIAL_ECHOLIST_N(N,V...) _SLST_N(N,LIST_N(N,V)) + inline void SERIAL_ECHOLIST_IMPL() {} + template + void SERIAL_ECHOLIST_IMPL(T && t) { SERIAL_IMPL.print(t); } + + template + void SERIAL_ECHOLIST_IMPL(T && t, Args && ... args) { + SERIAL_IMPL.print(t); + serialprintPGM(PSTR(", ")); + SERIAL_ECHOLIST_IMPL(args...); + } + + template + void SERIAL_ECHOLIST(PGM_P const str, Args && ... args) { + SERIAL_IMPL.print(str); + SERIAL_ECHOLIST_IMPL(args...); + } + +#else // Optimization if the listed type are all the same (seems to be the case in the codebase so use that instead) + + template + void SERIAL_ECHOLIST(PGM_P const str, Args && ... args) { + serialprintPGM(str); + typename Private::first_type_of::type values[] = { args... }; + constexpr size_t argsSize = sizeof...(args); + for (size_t i = 0; i < argsSize; i++) { + if (i) serialprintPGM(PSTR(", ")); + SERIAL_IMPL.print(values[i]); + } + } + +#endif #define SERIAL_ECHOPGM_P(P) (serialprintPGM(P)) #define SERIAL_ECHOLNPGM_P(P) (serialprintPGM(P "\n")) @@ -303,19 +323,19 @@ typedef int8_t serial_index_t; // // Functions for serial printing from PROGMEM. (Saves loads of SRAM.) // +void serial_echopair_PGM(PGM_P const s_P, serial_char_t v); void serial_echopair_PGM(PGM_P const s_P, const char *v); void serial_echopair_PGM(PGM_P const s_P, char v); void serial_echopair_PGM(PGM_P const s_P, int v); -void serial_echopair_PGM(PGM_P const s_P, unsigned int v); void serial_echopair_PGM(PGM_P const s_P, long v); -void serial_echopair_PGM(PGM_P const s_P, unsigned long v); void serial_echopair_PGM(PGM_P const s_P, float v); void serial_echopair_PGM(PGM_P const s_P, double v); -inline void serial_echopair_PGM(PGM_P const s_P, uint8_t v) { serial_echopair_PGM(s_P, (int)v); } +void serial_echopair_PGM(PGM_P const s_P, unsigned char v); +void serial_echopair_PGM(PGM_P const s_P, unsigned int v); +void serial_echopair_PGM(PGM_P const s_P, unsigned long v); inline void serial_echopair_PGM(PGM_P const s_P, bool v) { serial_echopair_PGM(s_P, (int)v); } inline void serial_echopair_PGM(PGM_P const s_P, void *v) { serial_echopair_PGM(s_P, (uintptr_t)v); } -void serialprintPGM(PGM_P str); void serial_echo_start(); void serial_error_start(); void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post=nullptr); diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index f52fa11202..81403b55f2 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -22,25 +22,41 @@ #pragma once #include "../inc/MarlinConfigPre.h" +#include "macros.h" #if ENABLED(EMERGENCY_PARSER) #include "../feature/e_parser.h" #endif -#ifndef DEC - #define DEC 10 - #define HEX 16 - #define OCT 8 - #define BIN 2 -#endif - // flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. CALL_IF_EXISTS_IMPL(void, flushTX ); CALL_IF_EXISTS_IMPL(bool, connected, true); +// In order to catch usage errors in code, we make the base to encode number explicit +// If given a number (and not this enum), the compiler will reject the overload, falling back to the (double, digit) version +// We don't want hidden conversion of the first parameter to double, so it has to be as hard to do for the compiler as creating this enum +enum class PrintBase { + Dec = 10, + Hex = 16, + Oct = 8, + Bin = 2 +}; + +// A simple forward struct that prevent the compiler to select print(double, int) as a default overload for any type different than +// double or float. For double or float, a conversion exists so the call will be transparent +struct EnsureDouble { + double a; + FORCE_INLINE operator double() { return a; } + // If the compiler breaks on ambiguity here, it's likely because you're calling print(X, base) with X not a double or a float, and a + // base that's not one of PrintBase's value. This exact code is made to detect such error, you NEED to set a base explicitely like this: + // SERIAL_PRINT(v, PrintBase::Hex) + FORCE_INLINE EnsureDouble(double a) : a(a) {} + FORCE_INLINE EnsureDouble(float a) : a(a) {} +}; + // Using Curiously Recurring Template Pattern here to avoid virtual table cost when compiling. -// Since the real serial class is known at compile time, this results in compiler writing a completely -// efficient code +// Since the real serial class is known at compile time, this results in the compiler writing +// a completely efficient code. template struct SerialBase { #if ENABLED(EMERGENCY_PARSER) @@ -78,39 +94,47 @@ struct SerialBase { FORCE_INLINE void write(const char* str) { while (*str) write(*str++); } FORCE_INLINE void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } FORCE_INLINE void print(const char* str) { write(str); } - NO_INLINE void print(char c, int base = 0) { print((long)c, base); } - NO_INLINE void print(unsigned char c, int base = 0) { print((unsigned long)c, base); } - NO_INLINE void print(int c, int base = DEC) { print((long)c, base); } - NO_INLINE void print(unsigned int c, int base = DEC) { print((unsigned long)c, base); } - void print(unsigned long c, int base = DEC) { printNumber(c, base); } - void print(double c, int digits = 2) { printFloat(c, digits); } - void print(long c, int base = DEC) { - if (!base) { - write(c); - return; - } - if (base == DEC && c < 0) { - write((uint8_t)'-'); c = -c; - } - printNumber(c, base); - } + // No default argument to avoid ambiguity + NO_INLINE void print(char c, PrintBase base) { printNumber((signed long)c, (uint8_t)base); } + NO_INLINE void print(unsigned char c, PrintBase base) { printNumber((unsigned long)c, (uint8_t)base); } + NO_INLINE void print(int c, PrintBase base) { printNumber((signed long)c, (uint8_t)base); } + NO_INLINE void print(unsigned int c, PrintBase base) { printNumber((unsigned long)c, (uint8_t)base); } + void print(unsigned long c, PrintBase base) { printNumber((unsigned long)c, (uint8_t)base); } + void print(long c, PrintBase base) { printNumber((signed long)c, (uint8_t)base); } + void print(EnsureDouble c, int digits) { printFloat(c, digits); } - NO_INLINE void println(const char s[]) { print(s); println(); } - NO_INLINE void println(char c, int base = 0) { print(c, base); println(); } - NO_INLINE void println(unsigned char c, int base = 0) { print(c, base); println(); } - NO_INLINE void println(int c, int base = DEC) { print(c, base); println(); } - NO_INLINE void println(unsigned int c, int base = DEC) { print(c, base); println(); } - NO_INLINE void println(long c, int base = DEC) { print(c, base); println(); } - NO_INLINE void println(unsigned long c, int base = DEC) { print(c, base); println(); } - NO_INLINE void println(double c, int digits = 2) { print(c, digits); println(); } - NO_INLINE void println() { write('\r'); write('\n'); } + // Forward the call to the former's method + FORCE_INLINE void print(char c) { print(c, PrintBase::Dec); } + FORCE_INLINE void print(unsigned char c) { print(c, PrintBase::Dec); } + FORCE_INLINE void print(int c) { print(c, PrintBase::Dec); } + FORCE_INLINE void print(unsigned int c) { print(c, PrintBase::Dec); } + FORCE_INLINE void print(unsigned long c) { print(c, PrintBase::Dec); } + FORCE_INLINE void print(long c) { print(c, PrintBase::Dec); } + FORCE_INLINE void print(double c) { print(c, 2); } + + FORCE_INLINE void println(const char s[]) { print(s); println(); } + FORCE_INLINE void println(char c, PrintBase base) { print(c, base); println(); } + FORCE_INLINE void println(unsigned char c, PrintBase base) { print(c, base); println(); } + FORCE_INLINE void println(int c, PrintBase base) { print(c, base); println(); } + FORCE_INLINE void println(unsigned int c, PrintBase base) { print(c, base); println(); } + FORCE_INLINE void println(long c, PrintBase base) { print(c, base); println(); } + FORCE_INLINE void println(unsigned long c, PrintBase base) { print(c, base); println(); } + FORCE_INLINE void println(double c, int digits) { print(c, digits); println(); } + FORCE_INLINE void println() { write('\r'); write('\n'); } + + // Forward the call to the former's method + FORCE_INLINE void println(char c) { println(c, PrintBase::Dec); } + FORCE_INLINE void println(unsigned char c) { println(c, PrintBase::Dec); } + FORCE_INLINE void println(int c) { println(c, PrintBase::Dec); } + FORCE_INLINE void println(unsigned int c) { println(c, PrintBase::Dec); } + FORCE_INLINE void println(unsigned long c) { println(c, PrintBase::Dec); } + FORCE_INLINE void println(long c) { println(c, PrintBase::Dec); } + FORCE_INLINE void println(double c) { println(c, 2); } // Print a number with the given base - void printNumber(unsigned long n, const uint8_t base) { - if (!base) { - write((uint8_t)n); - return; - } + NO_INLINE void printNumber(unsigned long n, const uint8_t base) { + if (!base) return; // Hopefully, this should raise visible bug immediately + if (n) { unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 int8_t i = 0; @@ -122,9 +146,19 @@ struct SerialBase { } else write('0'); } + void printNumber(signed long n, const uint8_t base) { + if (base == 10 && n < 0) { + n = -n; // This works because all platforms Marlin's builds on are using 2-complement encoding for negative number + // On such CPU, changing the sign of a number is done by inverting the bits and adding one, so if n = 0x80000000 = -2147483648 then + // -n = 0x7FFFFFFF + 1 => 0x80000000 = 2147483648 (if interpreted as unsigned) or -2147483648 if interpreted as signed. + // On non 2-complement CPU, there would be no possible representation for 2147483648. + write('-'); + } + printNumber((unsigned long)n , base); + } // Print a decimal number - void printFloat(double number, uint8_t digits) { + NO_INLINE void printFloat(double number, uint8_t digits) { // Handle negative numbers if (number < 0.0) { write('-'); @@ -147,7 +181,7 @@ struct SerialBase { // Extract digits from the remainder one at a time while (digits--) { remainder *= 10.0; - int toPrint = int(remainder); + unsigned long toPrint = (unsigned long)remainder; printNumber(toPrint, 10); remainder -= toPrint; } @@ -155,5 +189,5 @@ struct SerialBase { } }; -// All serial instances will be built by chaining the features required for the function in a form of a template -// type definition +// All serial instances will be built by chaining the features required +// for the function in the form of a template type definition. diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index 45e64d7793..ad8ec12b6e 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -21,6 +21,7 @@ */ #pragma once +#include "macros.h" #include "serial_base.h" // The most basic serial class: it dispatch to the base serial class with no hook whatsoever. This will compile to nothing but the base serial class @@ -37,6 +38,8 @@ struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { bool available(uint8_t index) { return index == 0 && SerialT::available(); } int read(uint8_t index) { return index == 0 ? SerialT::read() : -1; } bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + // We have 2 implementation of the same method in both base class, let's say which one we want using SerialT::available; using SerialT::read; @@ -68,6 +71,7 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial > { void msgDone() {} bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } + void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } bool available(uint8_t index) { return index == 0 && out.available(); } int read(uint8_t index) { return index == 0 ? out.read() : -1; } @@ -91,6 +95,7 @@ struct ForwardSerial : public SerialBase< ForwardSerial > { void msgDone() {} // Existing instances implement Arduino's operator bool, so use that if it's available bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } + void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } bool available(uint8_t index) { return index == 0 && out.available(); } int read(uint8_t index) { return index == 0 ? out.read() : -1; } @@ -131,11 +136,11 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria using BaseClassT::print; using BaseClassT::println; - // Underlying implementation might use Arduino's bool operator bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, static_cast(this), connected) : static_cast(this)->operator bool(); } + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } void setHook(WriteHook writeHook = 0, EndOfMessageHook eofHook = 0, void * userPointer = 0) { // Order is important here as serial code can be called inside interrupts diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index 3fb0cfc358..a663ee571d 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -47,11 +47,11 @@ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t if (DEBUGGING(LEVELING)) { DEBUG_ECHOPGM("Extrapolate ["); if (x < 10) DEBUG_CHAR(' '); - DEBUG_ECHO((int)x); + DEBUG_ECHO(x); DEBUG_CHAR(xdir ? (xdir > 0 ? '+' : '-') : ' '); DEBUG_CHAR(' '); if (y < 10) DEBUG_CHAR(' '); - DEBUG_ECHO((int)y); + DEBUG_ECHO(y); DEBUG_CHAR(ydir ? (ydir > 0 ? '+' : '-') : ' '); DEBUG_ECHOLNPGM("]"); } diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index e142b31a78..2ad4ffecaf 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -160,7 +160,7 @@ void reset_bed_level() { #ifndef SCAD_MESH_OUTPUT LOOP_L_N(x, sx) { serial_spaces(precision + (x < 10 ? 3 : 2)); - SERIAL_ECHO(int(x)); + SERIAL_ECHO(x); } SERIAL_EOL(); #endif @@ -172,7 +172,7 @@ void reset_bed_level() { SERIAL_ECHOPGM(" ["); // open sub-array #else if (y < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(int(y)); + SERIAL_ECHO(y); #endif LOOP_L_N(x, sx) { SERIAL_CHAR(' '); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 513d9a9121..ef3289f732 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -50,7 +50,7 @@ GRID_LOOP(x, y) if (!isnan(z_values[x][y])) { SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(" M421 I", int(x), " J", int(y)); + SERIAL_ECHOPAIR(" M421 I", x, " J", y); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); serial_delay(75); // Prevent Printrun from exploding } @@ -150,7 +150,7 @@ SERIAL_ECHO_SP(7); LOOP_L_N(i, GRID_MAX_POINTS_X) { if (i < 10) SERIAL_CHAR(' '); - SERIAL_ECHO((int)i); + SERIAL_ECHO(i); SERIAL_ECHO_SP(sp); } serial_delay(10); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 41d2a36359..36acc96d6e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -742,7 +742,7 @@ if (do_ubl_mesh_map) display_map(g29_map_type); const int point_num = (GRID_MAX_POINTS) - count + 1; - SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", int(GRID_MAX_POINTS), "."); + SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); #if HAS_LCD_MENU @@ -1694,7 +1694,7 @@ SERIAL_EOL(); #if HAS_KILL - SERIAL_ECHOLNPAIR("Kill pin on :", int(KILL_PIN), " state:", int(kill_state())); + SERIAL_ECHOLNPAIR("Kill pin on :", KILL_PIN, " state:", kill_state()); #endif SERIAL_EOL(); @@ -1707,8 +1707,8 @@ SERIAL_ECHOLNPAIR("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); serial_delay(50); - SERIAL_ECHOLNPAIR("sizeof(ubl) : ", (int)sizeof(ubl)); SERIAL_EOL(); - SERIAL_ECHOLNPAIR("z_value[][] size: ", (int)sizeof(z_values)); SERIAL_EOL(); + SERIAL_ECHOLNPAIR("sizeof(ubl) : ", sizeof(ubl)); SERIAL_EOL(); + SERIAL_ECHOLNPAIR("z_value[][] size: ", sizeof(z_values)); SERIAL_EOL(); serial_delay(25); SERIAL_ECHOLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index a70a0a4a27..d092b7152f 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -404,7 +404,7 @@ public: if (packet_retries < MAX_RETRIES || MAX_RETRIES == 0) { packet_retries++; stream_state = StreamState::PACKET_RESET; - SERIAL_ECHO_MSG("Resend request ", int(packet_retries)); + SERIAL_ECHO_MSG("Resend request ", packet_retries); SERIAL_ECHOLNPAIR("rs", sync); } else diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp index 48eaf9efc4..7fccc52d05 100644 --- a/Marlin/src/feature/bltouch.cpp +++ b/Marlin/src/feature/bltouch.cpp @@ -64,7 +64,7 @@ void BLTouch::init(const bool set_voltage/*=false*/) { #else if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR("last_written_mode - ", (int)last_written_mode); + DEBUG_ECHOLNPAIR("last_written_mode - ", last_written_mode); DEBUG_ECHOLNPGM("config mode - " #if ENABLED(BLTOUCH_SET_5V_MODE) "BLTOUCH_SET_5V_MODE" @@ -175,7 +175,7 @@ bool BLTouch::status_proc() { _set_SW_mode(); // Incidentally, _set_SW_mode() will also RESET any active alarm const bool tr = triggered(); // If triggered in SW mode, the pin is up, it is STOWED - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("BLTouch is ", (int)tr); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("BLTouch is ", tr); if (tr) _stow(); else _deploy(); // Turn off SW mode, reset any trigger, honor pin state return !tr; @@ -187,7 +187,7 @@ void BLTouch::mode_conv_proc(const bool M5V) { * BLTOUCH V3.0: This will set the mode (twice) and sadly, a STOW is needed at the end, because of the deploy * BLTOUCH V3.1: This will set the mode and store it in the eeprom. The STOW is not needed but does not hurt */ - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("BLTouch Set Mode - ", (int)M5V); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("BLTouch Set Mode - ", M5V); _deploy(); if (M5V) _set_5V_mode(); else _set_OD_mode(); _mode_store(); diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index 3ffd10e970..e2e429ea10 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -66,9 +66,8 @@ void CancelObject::uncancel_object(const int8_t obj) { } void CancelObject::report() { - if (active_object >= 0) { - SERIAL_ECHO_MSG("Active Object: ", int(active_object)); - } + if (active_object >= 0) + SERIAL_ECHO_MSG("Active Object: ", active_object); if (canceled) { SERIAL_ECHO_START(); diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index af42165599..cf5ebfd012 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -49,7 +49,7 @@ void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { initialized++; - SERIAL_ECHOLNPAIR("Setting up encoder on ", axis_codes[encoderAxis], " axis, addr = ", address); + SERIAL_ECHOLNPAIR("Setting up encoder on ", AS_CHAR(axis_codes[encoderAxis]), " axis, addr = ", address); position = get_position(); } @@ -67,7 +67,7 @@ void I2CPositionEncoder::update() { /* if (trusted) { //commented out as part of the note below trusted = false; - SERIAL_ECHOLMPAIR("Fault detected on ", axis_codes[encoderAxis], " axis encoder. Disengaging error correction until module is trusted again."); + SERIAL_ECHOLNPAIR("Fault detected on ", AS_CHAR(axis_codes[encoderAxis]), " axis encoder. Disengaging error correction until module is trusted again."); } */ return; @@ -92,7 +92,7 @@ void I2CPositionEncoder::update() { if (millis() - lastErrorTime > I2CPE_TIME_TRUSTED) { trusted = true; - SERIAL_ECHOLNPAIR("Untrusted encoder module on ", axis_codes[encoderAxis], " axis has been fault-free for set duration, reinstating error correction."); + SERIAL_ECHOLNPAIR("Untrusted encoder module on ", AS_CHAR(axis_codes[encoderAxis]), " axis has been fault-free for set duration, reinstating error correction."); //the encoder likely lost its place when the error occured, so we'll reset and use the printer's //idea of where it the axis is to re-initialize @@ -193,7 +193,7 @@ void I2CPositionEncoder::update() { const millis_t ms = millis(); if (ELAPSED(ms, nextErrorCountTime)) { SERIAL_CHAR(axis_codes[encoderAxis]); - SERIAL_ECHOLNPAIR(" : LARGE ERR ", int(error), "; diffSum=", diffSum); + SERIAL_ECHOLNPAIR(" : LARGE ERR ", error, "; diffSum=", diffSum); errorCount++; nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; } diff --git a/Marlin/src/feature/encoder_i2c.h b/Marlin/src/feature/encoder_i2c.h index 511e560ba0..e771130391 100644 --- a/Marlin/src/feature/encoder_i2c.h +++ b/Marlin/src/feature/encoder_i2c.h @@ -261,32 +261,32 @@ class I2CPositionEncodersMgr { static void report_error_count(const int8_t idx, const AxisEnum axis) { CHECK_IDX(); - SERIAL_ECHOLNPAIR("Error count on ", axis_codes[axis], " axis is ", encoders[idx].get_error_count()); + SERIAL_ECHOLNPAIR("Error count on ", AS_CHAR(axis_codes[axis]), " axis is ", encoders[idx].get_error_count()); } static void reset_error_count(const int8_t idx, const AxisEnum axis) { CHECK_IDX(); encoders[idx].set_error_count(0); - SERIAL_ECHOLNPAIR("Error count on ", axis_codes[axis], " axis has been reset."); + SERIAL_ECHOLNPAIR("Error count on ", AS_CHAR(axis_codes[axis]), " axis has been reset."); } static void enable_ec(const int8_t idx, const bool enabled, const AxisEnum axis) { CHECK_IDX(); encoders[idx].set_ec_enabled(enabled); - SERIAL_ECHOPAIR("Error correction on ", axis_codes[axis]); + SERIAL_ECHOPAIR("Error correction on ", AS_CHAR(axis_codes[axis])); SERIAL_ECHO_TERNARY(encoders[idx].get_ec_enabled(), " axis is ", "en", "dis", "abled.\n"); } static void set_ec_threshold(const int8_t idx, const float newThreshold, const AxisEnum axis) { CHECK_IDX(); encoders[idx].set_ec_threshold(newThreshold); - SERIAL_ECHOLNPAIR("Error correct threshold for ", axis_codes[axis], " axis set to ", newThreshold, "mm."); + SERIAL_ECHOLNPAIR("Error correct threshold for ", AS_CHAR(axis_codes[axis]), " axis set to ", newThreshold, "mm."); } static void get_ec_threshold(const int8_t idx, const AxisEnum axis) { CHECK_IDX(); const float threshold = encoders[idx].get_ec_threshold(); - SERIAL_ECHOLNPAIR("Error correct threshold for ", axis_codes[axis], " axis is ", threshold, "mm."); + SERIAL_ECHOLNPAIR("Error correct threshold for ", AS_CHAR(axis_codes[axis]), " axis is ", threshold, "mm."); } static int8_t idx_from_axis(const AxisEnum axis) { diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index b002e9808a..722020ba8a 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -135,11 +135,11 @@ void Mixer::refresh_collector(const float proportion/*=1.0*/, const uint8_t t/*= cmax = _MAX(cmax, v); csum += v; } - //SERIAL_ECHOPAIR("Mixer::refresh_collector(", proportion, ", ", int(t), ") cmax=", cmax, " csum=", csum, " color"); + //SERIAL_ECHOPAIR("Mixer::refresh_collector(", proportion, ", ", t, ") cmax=", cmax, " csum=", csum, " color"); const float inv_prop = proportion / csum; MIXER_STEPPER_LOOP(i) { c[i] = color[t][i] * inv_prop; - //SERIAL_ECHOPAIR(" [", int(t), "][", int(i), "] = ", int(color[t][i]), " (", c[i], ") "); + //SERIAL_ECHOPAIR(" [", t, "][", i, "] = ", color[t][i], " (", c[i], ") "); } //SERIAL_EOL(); } diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 7fe7062a7a..65d1f1bf95 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -139,9 +139,9 @@ class Mixer { #ifdef MIXER_NORMALIZER_DEBUG SERIAL_ECHOPGM("Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]); SERIAL_ECHOPGM(" ] to Color [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(tcolor[0]), int(tcolor[1]), int(tcolor[2]), int(tcolor[3]), int(tcolor[4]), int(tcolor[5])); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, tcolor[0], tcolor[1], tcolor[2], tcolor[3], tcolor[4], tcolor[5]); SERIAL_ECHOLNPGM(" ]"); #endif } @@ -153,10 +153,10 @@ class Mixer { MIXER_STEPPER_LOOP(i) mix[i] = mixer_perc_t(100.0f * color[j][i] / ctot); #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOPAIR("V-tool ", int(j), " [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(color[j][0]), int(color[j][1]), int(color[j][2]), int(color[j][3]), int(color[j][4]), int(color[j][5])); + SERIAL_ECHOPAIR("V-tool ", j, " [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, color[j][0], color[j][1], color[j][2], color[j][3], color[j][4], color[j][5]); SERIAL_ECHOPGM(" ] to Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]); SERIAL_ECHOLNPGM(" ]"); #endif } @@ -199,9 +199,9 @@ class Mixer { #ifdef MIXER_NORMALIZER_DEBUG SERIAL_ECHOPGM("Gradient [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(gradient.color[0]), int(gradient.color[1]), int(gradient.color[2]), int(gradient.color[3]), int(gradient.color[4]), int(gradient.color[5])); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, gradient.color[0], gradient.color[1], gradient.color[2], gradient.color[3], gradient.color[4], gradient.color[5]); SERIAL_ECHOPGM(" ] to Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]); SERIAL_ECHOLNPGM(" ]"); #endif } diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index 3bff73e956..1aa53ef5eb 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -514,7 +514,7 @@ static void mmu2_not_responding() { extruder = index; // filament change is finished active_extruder = 0; ENABLE_AXIS_E0(); - SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder)); + SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, extruder); } ui.reset_status(); } @@ -601,7 +601,7 @@ static void mmu2_not_responding() { active_extruder = 0; ENABLE_AXIS_E0(); - SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder)); + SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, extruder); ui.reset_status(); } @@ -696,7 +696,7 @@ static void mmu2_not_responding() { extruder = index; //filament change is finished active_extruder = 0; ENABLE_AXIS_E0(); - SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(extruder)); + SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, extruder); ui.reset_status(); } diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 5ab4f2b146..012e6c6e50 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -130,7 +130,7 @@ fil_change_settings_t fc_settings[EXTRUDERS]; */ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=PAUSE_MODE_SAME) { DEBUG_SECTION(est, "ensure_safe_temperature", true); - DEBUG_ECHOLNPAIR("... wait:", int(wait), " mode:", int(mode)); + DEBUG_ECHOLNPAIR("... wait:", wait, " mode:", mode); #if ENABLED(PREVENT_COLD_EXTRUSION) if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) @@ -176,7 +176,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l DXC_ARGS ) { DEBUG_SECTION(lf, "load_filament", true); - DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " showlcd:", int(show_lcd), " pauseforuser:", int(pause_for_user), " pausemode:", int(mode) DXC_SAY); + DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", max_beep_count, " showlcd:", show_lcd, " pauseforuser:", pause_for_user, " pausemode:", mode DXC_SAY); if (!ensure_safe_temperature(false, mode)) { if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_STATUS, mode); @@ -309,7 +309,7 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, #endif ) { DEBUG_SECTION(uf, "unload_filament", true); - DEBUG_ECHOLNPAIR("... unloadlen:", unload_length, " showlcd:", int(show_lcd), " mode:", int(mode) + DEBUG_ECHOLNPAIR("... unloadlen:", unload_length, " showlcd:", show_lcd, " mode:", mode #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) , " mixmult:", mix_multiplier #endif @@ -373,7 +373,7 @@ uint8_t did_pause_print = 0; bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { DEBUG_SECTION(pp, "pause_print", true); - DEBUG_ECHOLNPAIR("... park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", int(show_lcd) DXC_SAY); + DEBUG_ECHOLNPAIR("... park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", show_lcd DXC_SAY); UNUSED(show_lcd); @@ -456,7 +456,7 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float void show_continue_prompt(const bool is_reload) { DEBUG_SECTION(scp, "pause_print", true); - DEBUG_ECHOLNPAIR("... is_reload:", int(is_reload)); + DEBUG_ECHOLNPAIR("... is_reload:", is_reload); ui.pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING); SERIAL_ECHO_START(); @@ -465,7 +465,7 @@ void show_continue_prompt(const bool is_reload) { void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) { DEBUG_SECTION(wfc, "wait_for_confirmation", true); - DEBUG_ECHOLNPAIR("... is_reload:", is_reload, " maxbeep:", int(max_beep_count) DXC_SAY); + DEBUG_ECHOLNPAIR("... is_reload:", is_reload, " maxbeep:", max_beep_count DXC_SAY); bool nozzle_timed_out = false; @@ -561,7 +561,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep */ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, int16_t targetTemp/*=0*/ DXC_ARGS) { DEBUG_SECTION(rp, "resume_print", true); - DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " targetTemp:", targetTemp DXC_SAY); + DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", max_beep_count, " targetTemp:", targetTemp DXC_SAY); /* SERIAL_ECHOLNPAIR( diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index be35ff8511..46b94dbc11 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -532,7 +532,7 @@ void PrintJobRecovery::resume() { void PrintJobRecovery::debug(PGM_P const prefix) { DEBUG_PRINT_P(prefix); - DEBUG_ECHOLNPAIR(" Job Recovery Info...\nvalid_head:", int(info.valid_head), " valid_foot:", int(info.valid_foot)); + DEBUG_ECHOLNPAIR(" Job Recovery Info...\nvalid_head:", info.valid_head, " valid_foot:", info.valid_foot); if (info.valid_head) { if (info.valid_head == info.valid_foot) { DEBUG_ECHOPGM("current_position: "); @@ -565,7 +565,7 @@ void PrintJobRecovery::resume() { DEBUG_ECHOLNPAIR("feedrate: ", info.feedrate); #if HAS_MULTI_EXTRUDER - DEBUG_ECHOLNPAIR("active_extruder: ", int(info.active_extruder)); + DEBUG_ECHOLNPAIR("active_extruder: ", info.active_extruder); #endif #if HAS_HOTEND @@ -584,14 +584,14 @@ void PrintJobRecovery::resume() { #if HAS_FAN DEBUG_ECHOPGM("fan_speed: "); FANS_LOOP(i) { - DEBUG_ECHO(int(info.fan_speed[i])); + DEBUG_ECHO(info.fan_speed[i]); if (i < FAN_COUNT - 1) DEBUG_CHAR(','); } DEBUG_EOL(); #endif #if HAS_LEVELING - DEBUG_ECHOLNPAIR("leveling: ", int(info.flag.leveling), " fade: ", info.fade); + DEBUG_ECHOLNPAIR("leveling: ", info.flag.leveling, " fade: ", info.fade); #endif #if ENABLED(FWRETRACT) DEBUG_ECHOPGM("retract: "); @@ -605,8 +605,8 @@ void PrintJobRecovery::resume() { DEBUG_ECHOLNPAIR("sd_filename: ", info.sd_filename); DEBUG_ECHOLNPAIR("sdpos: ", info.sdpos); DEBUG_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed); - DEBUG_ECHOLNPAIR("dryrun: ", int(info.flag.dryrun)); - DEBUG_ECHOLNPAIR("allow_cold_extrusion: ", int(info.flag.allow_cold_extrusion)); + DEBUG_ECHOLNPAIR("dryrun: ", info.flag.dryrun); + DEBUG_ECHOLNPAIR("allow_cold_extrusion: ", info.flag.allow_cold_extrusion); } else DEBUG_ECHOLNPGM("INVALID DATA"); diff --git a/Marlin/src/feature/repeat.cpp b/Marlin/src/feature/repeat.cpp index d48157a84d..11e4dd6a93 100644 --- a/Marlin/src/feature/repeat.cpp +++ b/Marlin/src/feature/repeat.cpp @@ -43,7 +43,7 @@ void Repeat::add_marker(const uint32_t sdpos, const uint16_t count) { marker[index].sdpos = sdpos; marker[index].counter = count ?: -1; index++; - DEBUG_ECHOLNPAIR("Add Marker ", int(index), " at ", sdpos, " (", count, ")"); + DEBUG_ECHOLNPAIR("Add Marker ", index, " at ", sdpos, " (", count, ")"); } } @@ -53,14 +53,14 @@ void Repeat::loop() { else { const uint8_t ind = index - 1; // Active marker's index if (!marker[ind].counter) { // Did its counter run out? - DEBUG_ECHOLNPAIR("Pass Marker ", int(index)); + DEBUG_ECHOLNPAIR("Pass Marker ", index); index--; // Carry on. Previous marker on the next 'M808'. } else { card.setIndex(marker[ind].sdpos); // Loop back to the marker. if (marker[ind].counter > 0) // Ignore a negative (or zero) counter. --marker[ind].counter; // Decrement the counter. If zero this 'M808' will be skipped next time. - DEBUG_ECHOLNPAIR("Goto Marker ", int(index), " at ", marker[ind].sdpos, " (", marker[ind].counter, ")"); + DEBUG_ECHOLNPAIR("Goto Marker ", index, " at ", marker[ind].sdpos, " (", marker[ind].counter, ")"); } } } diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 5a79aaac7b..9e3cad34f2 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -537,7 +537,7 @@ void GcodeSuite::G26() { if (bedtemp) { if (!WITHIN(bedtemp, 40, BED_MAX_TARGET)) { - SERIAL_ECHOLNPAIR("?Specified bed temperature not plausible (40-", int(BED_MAX_TARGET), "C)."); + SERIAL_ECHOLNPAIR("?Specified bed temperature not plausible (40-", BED_MAX_TARGET, "C)."); return; } g26_bed_temp = bedtemp; diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 46f75f2590..5195ff87c0 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -104,7 +104,7 @@ void GcodeSuite::G35() { const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true); if (isnan(z_probed_height)) { - SERIAL_ECHOPAIR("G35 failed at point ", int(i), " ("); + SERIAL_ECHOPAIR("G35 failed at point ", i, " ("); SERIAL_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i])); SERIAL_CHAR(')'); SERIAL_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y); @@ -113,7 +113,7 @@ void GcodeSuite::G35() { } if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("Probing point ", int(i), " ("); + DEBUG_ECHOPAIR("Probing point ", i, " ("); DEBUG_PRINT_P((char *)pgm_read_ptr(&tramming_point_name[i])); DEBUG_CHAR(')'); DEBUG_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y, SP_Z_STR, z_probed_height); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 2e80f090a4..b1e9fcedaa 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -637,7 +637,7 @@ G29_TYPE GcodeSuite::G29() { // Avoid probing outside the round or hexagonal area if (TERN0(IS_KINEMATIC, !probe.can_reach(probePos))) continue; - if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", int(pt_index), "/", abl_points, "."); + if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", pt_index, "/", abl_points, "."); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); @@ -682,7 +682,7 @@ G29_TYPE GcodeSuite::G29() { // Probe at 3 arbitrary points LOOP_L_N(i, 3) { - if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", int(i + 1), "/3."); + if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", i + 1, "/3."); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); // Retain the last probe position diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index a08e4a0867..c16338a692 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -142,7 +142,7 @@ void GcodeSuite::G29() { if (parser.seenval('I')) { ix = parser.value_int(); if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) { - SERIAL_ECHOLNPAIR("I out of range (0-", int(GRID_MAX_POINTS_X - 1), ")"); + SERIAL_ECHOLNPAIR("I out of range (0-", GRID_MAX_POINTS_X - 1, ")"); return; } } @@ -152,7 +152,7 @@ void GcodeSuite::G29() { if (parser.seenval('J')) { iy = parser.value_int(); if (!WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { - SERIAL_ECHOLNPAIR("J out of range (0-", int(GRID_MAX_POINTS_Y - 1), ")"); + SERIAL_ECHOLNPAIR("J out of range (0-", GRID_MAX_POINTS_Y - 1, ")"); return; } } @@ -181,7 +181,7 @@ void GcodeSuite::G29() { } // switch(state) if (state == MeshNext) - SERIAL_ECHOLNPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS), " of ", int(GRID_MAX_POINTS)); + SERIAL_ECHOLNPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS), " of ", GRID_MAX_POINTS); report_current_position(); } diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 0bcf954faf..50476e8e7c 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -238,7 +238,7 @@ void GcodeSuite::G34() { // the next iteration of probing. This allows adjustments to be made away from the bed. z_measured[iprobe] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(iprobe + 1), " measured position is ", z_measured[iprobe]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", iprobe + 1, " measured position is ", z_measured[iprobe]); // Remember the minimum measurement to calculate the correction later on z_measured_min = _MIN(z_measured_min, z_measured[iprobe]); @@ -267,7 +267,7 @@ void GcodeSuite::G34() { linear_fit_data lfd; incremental_LSF_reset(&lfd); LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { - SERIAL_ECHOLNPAIR("PROBEPT_", int(i), ": ", z_measured[i]); + SERIAL_ECHOLNPAIR("PROBEPT_", i, ": ", z_measured[i]); incremental_LSF(&lfd, z_stepper_align.xy[i], z_measured[i]); } finish_incremental_LSF(&lfd); @@ -357,8 +357,8 @@ void GcodeSuite::G34() { // Check for less accuracy compared to last move if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", zstepper + 1, " last_z_align_move = ", last_z_align_move[zstepper]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", zstepper + 1, " z_align_abs = ", z_align_abs); adjustment_reverse = !adjustment_reverse; } @@ -370,7 +370,7 @@ void GcodeSuite::G34() { // Stop early if all measured points achieve accuracy target if (z_align_abs > z_auto_align_accuracy) success_break = false; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " corrected by ", z_align_move); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", zstepper + 1, " corrected by ", z_align_move); // Lock all steppers except one stepper.set_all_z_lock(true, zstepper); @@ -380,7 +380,7 @@ void GcodeSuite::G34() { // Will match reversed Z steppers on dual steppers. Triple will need more work to map. if (adjustment_reverse) { z_align_move = -z_align_move; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " correction reversed to ", z_align_move); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", zstepper + 1, " correction reversed to ", z_align_move); } #endif @@ -406,7 +406,7 @@ void GcodeSuite::G34() { if (err_break) SERIAL_ECHOLNPGM("G34 aborted."); else { - SERIAL_ECHOLNPAIR("Did ", int(iteration + (iteration != z_auto_align_iterations)), " of ", int(z_auto_align_iterations)); + SERIAL_ECHOLNPAIR("Did ", iteration + (iteration != z_auto_align_iterations), " of ", z_auto_align_iterations); SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); } @@ -467,10 +467,10 @@ void GcodeSuite::M422() { if (!parser.seen_any()) { LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) - SERIAL_ECHOLNPAIR_P(PSTR("M422 S"), int(i + 1), SP_X_STR, z_stepper_align.xy[i].x, SP_Y_STR, z_stepper_align.xy[i].y); + SERIAL_ECHOLNPAIR_P(PSTR("M422 S"), i + 1, SP_X_STR, z_stepper_align.xy[i].x, SP_Y_STR, z_stepper_align.xy[i].y); #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) - SERIAL_ECHOLNPAIR_P(PSTR("M422 W"), int(i + 1), SP_X_STR, z_stepper_align.stepper_xy[i].x, SP_Y_STR, z_stepper_align.stepper_xy[i].y); + SERIAL_ECHOLNPAIR_P(PSTR("M422 W"), i + 1, SP_X_STR, z_stepper_align.stepper_xy[i].x, SP_Y_STR, z_stepper_align.stepper_xy[i].y); #endif return; } diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index 9510da7740..0918bc9d4f 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -375,7 +375,7 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { inline void report_measured_positional_error(const measurements_t &m) { SERIAL_CHAR('T'); - SERIAL_ECHO(int(active_extruder)); + SERIAL_ECHO(active_extruder); SERIAL_ECHOLNPGM(" Positional Error:"); #if HAS_X_CENTER SERIAL_ECHOLNPAIR_P(SP_X_STR, m.pos_error.x); @@ -408,7 +408,7 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { // inline void report_hotend_offsets() { LOOP_S_L_N(e, 1, HOTENDS) - SERIAL_ECHOLNPAIR_P(PSTR("T"), int(e), PSTR(" Hotend Offset X"), hotend_offset[e].x, SP_Y_STR, hotend_offset[e].y, SP_Z_STR, hotend_offset[e].z); + SERIAL_ECHOLNPAIR_P(PSTR("T"), e, PSTR(" Hotend Offset X"), hotend_offset[e].x, SP_Y_STR, hotend_offset[e].y, SP_Z_STR, hotend_offset[e].z); } #endif diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 97aea59221..63d2370697 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -240,8 +240,8 @@ void GcodeSuite::M48() { sigma = SQRT(dev_sum / (n + 1)); if (verbose_level > 1) { - SERIAL_ECHO((int)(n + 1)); - SERIAL_ECHOPAIR(" of ", (int)n_samples); + SERIAL_ECHO(n + 1); + SERIAL_ECHOPAIR(" of ", n_samples); SERIAL_ECHOPAIR_F(": z: ", pz, 3); SERIAL_CHAR(' '); dev_report(verbose_level > 2, mean, sigma, min, max); diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index f2fefb5756..ebe1dbc03c 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -47,7 +47,7 @@ void M217_report(const bool eeprom=false) { " G", toolchange_settings.fan_time); #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOPAIR(" A", int(migration.automode)); + SERIAL_ECHOPAIR(" A", migration.automode); SERIAL_ECHOPAIR(" L", LINEAR_UNIT(migration.last)); #endif diff --git a/Marlin/src/gcode/config/M305.cpp b/Marlin/src/gcode/config/M305.cpp index 9771ac2ced..10ef55c173 100644 --- a/Marlin/src/gcode/config/M305.cpp +++ b/Marlin/src/gcode/config/M305.cpp @@ -50,7 +50,7 @@ void GcodeSuite::M305() { // A valid P index is required if (t_index >= (USER_THERMISTORS) || (do_set && t_index < 0)) - SERIAL_ECHO_MSG("!Invalid index. (0 <= P <= ", int(USER_THERMISTORS - 1), ")"); + SERIAL_ECHO_MSG("!Invalid index. (0 <= P <= ", USER_THERMISTORS - 1, ")"); else if (do_set) { if (parser.seen('R')) // Pullup resistor value if (!thermalManager.set_pull_up_res(t_index, parser.value_float())) diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index 005fdf0f31..42a74fb54f 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -131,7 +131,7 @@ inline void servo_probe_test() { const uint8_t probe_index = parser.byteval('P', Z_PROBE_SERVO_NR); SERIAL_ECHOLNPAIR("Servo probe test\n" - ". using index: ", int(probe_index), + ". using index: ", probe_index, ", deploy angle: ", servo_angles[probe_index][0], ", stow angle: ", servo_angles[probe_index][1] ); @@ -143,7 +143,7 @@ inline void servo_probe_test() { #define PROBE_TEST_PIN Z_MIN_PIN constexpr bool probe_inverting = Z_MIN_ENDSTOP_INVERTING; - SERIAL_ECHOLNPAIR(". Probe Z_MIN_PIN: ", int(PROBE_TEST_PIN)); + SERIAL_ECHOLNPAIR(". Probe Z_MIN_PIN: ", PROBE_TEST_PIN); SERIAL_ECHOPGM(". Z_MIN_ENDSTOP_INVERTING: "); #else @@ -151,7 +151,7 @@ inline void servo_probe_test() { #define PROBE_TEST_PIN Z_MIN_PROBE_PIN constexpr bool probe_inverting = Z_MIN_PROBE_ENDSTOP_INVERTING; - SERIAL_ECHOLNPAIR(". Probe Z_MIN_PROBE_PIN: ", int(PROBE_TEST_PIN)); + SERIAL_ECHOLNPAIR(". Probe Z_MIN_PROBE_PIN: ", PROBE_TEST_PIN); SERIAL_ECHOPGM( ". Z_MIN_PROBE_ENDSTOP_INVERTING: "); #endif diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp index 0a7d52b633..bdb95db8d6 100644 --- a/Marlin/src/gcode/config/M92.cpp +++ b/Marlin/src/gcode/config/M92.cpp @@ -37,7 +37,7 @@ void report_M92(const bool echo=true, const int8_t e=-1) { LOOP_L_N(i, E_STEPPERS) { if (e >= 0 && i != e) continue; if (echo) SERIAL_ECHO_START(); else SERIAL_CHAR(' '); - SERIAL_ECHOLNPAIR_P(PSTR(" M92 T"), (int)i, + SERIAL_ECHOLNPAIR_P(PSTR(" M92 T"), i, SP_E_STR, VOLUMETRIC_UNIT(planner.settings.axis_steps_per_mm[E_AXIS_N(i)])); } #endif diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 0d7a9f431b..3d13cb1c24 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -122,26 +122,26 @@ case DXC_DUPLICATION_MODE: DEBUG_ECHOPGM("DUPLICATION"); break; case DXC_MIRRORED_MODE: DEBUG_ECHOPGM("MIRRORED"); break; } - DEBUG_ECHOPAIR("\nActive Ext: ", int(active_extruder)); + DEBUG_ECHOPAIR("\nActive Ext: ", active_extruder); if (!active_extruder_parked) DEBUG_ECHOPGM(" NOT "); DEBUG_ECHOPGM(" parked."); DEBUG_ECHOPAIR("\nactive_extruder_x_pos: ", current_position.x); DEBUG_ECHOPAIR("\ninactive_extruder_x: ", inactive_extruder_x); - DEBUG_ECHOPAIR("\nextruder_duplication_enabled: ", int(extruder_duplication_enabled)); + DEBUG_ECHOPAIR("\nextruder_duplication_enabled: ", extruder_duplication_enabled); DEBUG_ECHOPAIR("\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset); DEBUG_ECHOPAIR("\nduplicate_extruder_temp_offset: ", duplicate_extruder_temp_offset); DEBUG_ECHOPAIR("\ndelayed_move_time: ", delayed_move_time); - DEBUG_ECHOPAIR("\nX1 Home X: ", x_home_pos(0), "\nX1_MIN_POS=", int(X1_MIN_POS), "\nX1_MAX_POS=", int(X1_MAX_POS)); - DEBUG_ECHOPAIR("\nX2 Home X: ", x_home_pos(1), "\nX2_MIN_POS=", int(X2_MIN_POS), "\nX2_MAX_POS=", int(X2_MAX_POS)); - DEBUG_ECHOPAIR("\nX2_HOME_DIR=", int(X2_HOME_DIR), "\nX2_HOME_POS=", int(X2_HOME_POS)); + DEBUG_ECHOPAIR("\nX1 Home X: ", x_home_pos(0), "\nX1_MIN_POS=", X1_MIN_POS, "\nX1_MAX_POS=", X1_MAX_POS); + DEBUG_ECHOPAIR("\nX2 Home X: ", x_home_pos(1), "\nX2_MIN_POS=", X2_MIN_POS, "\nX2_MAX_POS=", X2_MAX_POS); + DEBUG_ECHOPAIR("\nX2_HOME_DIR=", X2_HOME_DIR, "\nX2_HOME_POS=", X2_HOME_POS); DEBUG_ECHOPAIR("\nDEFAULT_DUAL_X_CARRIAGE_MODE=", STRINGIFY(DEFAULT_DUAL_X_CARRIAGE_MODE)); DEBUG_ECHOPAIR("\toolchange_settings.z_raise=", toolchange_settings.z_raise); - DEBUG_ECHOPAIR("\nDEFAULT_DUPLICATION_X_OFFSET=", int(DEFAULT_DUPLICATION_X_OFFSET)); + DEBUG_ECHOPAIR("\nDEFAULT_DUPLICATION_X_OFFSET=", DEFAULT_DUPLICATION_X_OFFSET); DEBUG_EOL(); HOTEND_LOOP() { - DEBUG_ECHOPAIR_P(SP_T_STR, int(e)); - LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", int(e), "].", XYZ_CHAR(a) | 0x20, "=", hotend_offset[e][a]); + DEBUG_ECHOPAIR_P(SP_T_STR, e); + LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", e, "].", XYZ_CHAR(a) | 0x20, "=", hotend_offset[e][a]); DEBUG_EOL(); } DEBUG_EOL(); diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp index 26c50a6129..cd7833c701 100644 --- a/Marlin/src/gcode/eeprom/M500-M504.cpp +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -75,7 +75,7 @@ void GcodeSuite::M502() { if (dowrite) { val = parser.byteval('V'); persistentStore.write_data(addr, &val); - SERIAL_ECHOLNPAIR("Wrote address ", addr, " with ", int(val)); + SERIAL_ECHOLNPAIR("Wrote address ", addr, " with ", val); } else { if (parser.seenval('T')) { @@ -90,7 +90,7 @@ void GcodeSuite::M502() { } else { persistentStore.read_data(addr, &val); - SERIAL_ECHOLNPAIR("Read address ", addr, " and got ", int(val)); + SERIAL_ECHOLNPAIR("Read address ", addr, " and got ", val); } } return; diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp index 3c2c27b62a..1d76ebf7d5 100644 --- a/Marlin/src/gcode/feature/advance/M900.cpp +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -115,12 +115,12 @@ void GcodeSuite::M900() { #if ENABLED(EXTRA_LIN_ADVANCE_K) #if EXTRUDERS < 2 - SERIAL_ECHOLNPAIR("Advance S", int(new_slot), " K", kref, "(S", int(!new_slot), " K", lref, ")"); + SERIAL_ECHOLNPAIR("Advance S", new_slot, " K", kref, "(S", !new_slot, " K", lref, ")"); #else LOOP_L_N(i, EXTRUDERS) { const bool slot = TEST(lin_adv_slot, i); - SERIAL_ECHOLNPAIR("Advance T", int(i), " S", int(slot), " K", planner.extruder_advance_K[i], - "(S", int(!slot), " K", other_extruder_advance_K[i], ")"); + SERIAL_ECHOLNPAIR("Advance T", i, " S", slot, " K", planner.extruder_advance_K[i], + "(S", !slot, " K", other_extruder_advance_K[i], ")"); SERIAL_EOL(); } #endif diff --git a/Marlin/src/gcode/feature/leds/M7219.cpp b/Marlin/src/gcode/feature/leds/M7219.cpp index a6ee71174b..40d3554dfe 100644 --- a/Marlin/src/gcode/feature/leds/M7219.cpp +++ b/Marlin/src/gcode/feature/leds/M7219.cpp @@ -82,7 +82,7 @@ void GcodeSuite::M7219() { LOOP_L_N(r, MAX7219_LINES) { SERIAL_ECHOPGM("led_line["); if (r < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(int(r)); + SERIAL_ECHO(r); SERIAL_ECHOPGM("]="); for (uint8_t b = 8; b--;) SERIAL_CHAR('0' + TEST(max7219.led_line[r], b)); SERIAL_EOL(); diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp index 9e071a47ec..3f2b8b79e8 100644 --- a/Marlin/src/gcode/feature/mixing/M166.cpp +++ b/Marlin/src/gcode/feature/mixing/M166.cpp @@ -30,7 +30,7 @@ #include "../../../feature/mixing.h" inline void echo_mix() { - SERIAL_ECHOPAIR(" (", int(mixer.mix[0]), "%|", int(mixer.mix[1]), "%)"); + SERIAL_ECHOPAIR(" (", mixer.mix[0], "%|", mixer.mix[1], "%)"); } inline void echo_zt(const int t, const float &z) { @@ -74,7 +74,7 @@ void GcodeSuite::M166() { #if ENABLED(GRADIENT_VTOOL) if (mixer.gradient.vtool_index >= 0) { - SERIAL_ECHOPAIR(" (T", int(mixer.gradient.vtool_index)); + SERIAL_ECHOPAIR(" (T", mixer.gradient.vtool_index); SERIAL_CHAR(')'); } #endif diff --git a/Marlin/src/gcode/feature/network/M552-M554.cpp b/Marlin/src/gcode/feature/network/M552-M554.cpp index 6ea15fefbf..22c718c042 100644 --- a/Marlin/src/gcode/feature/network/M552-M554.cpp +++ b/Marlin/src/gcode/feature/network/M552-M554.cpp @@ -48,7 +48,7 @@ void MAC_report() { SERIAL_ECHOPGM(" MAC: "); LOOP_L_N(i, 6) { if (mac[i] < 16) SERIAL_CHAR('0'); - SERIAL_PRINT(mac[i], HEX); + SERIAL_PRINT(mac[i], PrintBase::Hex); if (i < 5) SERIAL_CHAR(':'); } } diff --git a/Marlin/src/gcode/feature/pause/G61.cpp b/Marlin/src/gcode/feature/pause/G61.cpp index 5d89af0ab8..9d5dcc060a 100644 --- a/Marlin/src/gcode/feature/pause/G61.cpp +++ b/Marlin/src/gcode/feature/pause/G61.cpp @@ -49,7 +49,7 @@ void GcodeSuite::G61(void) { // No saved position? No axes being restored? if (!TEST(saved_slots[slot >> 3], slot & 0x07) || !parser.seen("XYZ")) return; - SERIAL_ECHOPAIR(STR_RESTORING_POS " S", int(slot)); + SERIAL_ECHOPAIR(STR_RESTORING_POS " S", slot); LOOP_XYZ(i) { destination[i] = parser.seen(XYZ_CHAR(i)) ? stored_position[slot][i] + parser.value_axis_units((AxisEnum)i) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index f9173188dc..77ac1fbff8 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -105,7 +105,7 @@ int8_t GcodeSuite::get_target_extruder_from_command() { if (e < EXTRUDERS) return e; SERIAL_ECHO_START(); SERIAL_CHAR('M'); SERIAL_ECHO(parser.codenum); - SERIAL_ECHOLNPAIR(" " STR_INVALID_EXTRUDER " ", int(e)); + SERIAL_ECHOLNPAIR(" " STR_INVALID_EXTRUDER " ", e); return -1; } return active_extruder; @@ -124,7 +124,7 @@ int8_t GcodeSuite::get_target_e_stepper_from_command() { if (e == -1) SERIAL_ECHOLNPGM(" " STR_E_STEPPER_NOT_SPECIFIED); else - SERIAL_ECHOLNPAIR(" " STR_INVALID_E_STEPPER " ", int(e)); + SERIAL_ECHOLNPAIR(" " STR_INVALID_E_STEPPER " ", e); return -1; } diff --git a/Marlin/src/gcode/host/M113.cpp b/Marlin/src/gcode/host/M113.cpp index 1183cc27a1..ddabcefb13 100644 --- a/Marlin/src/gcode/host/M113.cpp +++ b/Marlin/src/gcode/host/M113.cpp @@ -38,7 +38,7 @@ void GcodeSuite::M113() { NOMORE(host_keepalive_interval, 60); } else - SERIAL_ECHO_MSG("M113 S", (uint16_t)host_keepalive_interval); + SERIAL_ECHO_MSG("M113 S", host_keepalive_interval); } diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index f49a32cc61..b0bd4a3b8e 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -35,7 +35,7 @@ static void config_prefix(PGM_P const name, PGM_P const pref=nullptr, const int8_t ind=-1) { SERIAL_ECHOPGM("Config:"); if (pref) serialprintPGM(pref); - if (ind >= 0) { SERIAL_ECHO(int(ind)); SERIAL_CHAR(':'); } + if (ind >= 0) { SERIAL_ECHO(ind); SERIAL_CHAR(':'); } serialprintPGM(name); SERIAL_CHAR(':'); } diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index 8ff94a78fd..1cae8d11a2 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -97,7 +97,7 @@ void GcodeSuite::M290() { #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) { SERIAL_ECHOLNPAIR_P( - PSTR("Hotend "), int(active_extruder) + PSTR("Hotend "), active_extruder #if ENABLED(BABYSTEP_XY) , PSTR("Offset X"), hotend_offset[active_extruder].x , SP_Y_STR, hotend_offset[active_extruder].y diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index a513c4b596..6408b2ce2d 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -307,7 +307,7 @@ void GCodeParser::parse(char *p) { #if ENABLED(DEBUG_GCODE_PARSER) if (debug) { - SERIAL_ECHOPAIR("Got param ", param, " at index ", (int)(p - command_ptr - 1)); + SERIAL_ECHOPAIR("Got param ", param, " at index ", p - command_ptr - 1); if (has_val) SERIAL_ECHOPGM(" (has_val)"); } #endif @@ -391,8 +391,8 @@ void GCodeParser::unknown_command_warning() { "\n sec-ms: ", value_millis_from_seconds(), "\n int: ", value_int(), "\n ushort: ", value_ushort(), - "\n byte: ", (int)value_byte(), - "\n bool: ", (int)value_bool(), + "\n byte: ", value_byte(), + "\n bool: ", value_bool(), "\n linear: ", value_linear_units(), "\n celsius: ", value_celsius() ); diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index cf531c4e47..d60b21a906 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -133,9 +133,9 @@ public: param[ind] = ptr ? ptr - command_ptr : 0; // parameter offset or 0 #if ENABLED(DEBUG_GCODE_PARSER) if (codenum == 800) { - SERIAL_ECHOPAIR("Set bit ", (int)ind, " of codebits (", hex_address((void*)(codebits >> 16))); + SERIAL_ECHOPAIR("Set bit ", ind, " of codebits (", hex_address((void*)(codebits >> 16))); print_hex_word((uint16_t)(codebits & 0xFFFF)); - SERIAL_ECHOLNPAIR(") | param = ", (int)param[ind]); + SERIAL_ECHOLNPAIR(") | param = ", param[ind]); } #endif } diff --git a/Marlin/src/gcode/probe/M851.cpp b/Marlin/src/gcode/probe/M851.cpp index 04b293de31..ee6244932e 100644 --- a/Marlin/src/gcode/probe/M851.cpp +++ b/Marlin/src/gcode/probe/M851.cpp @@ -58,7 +58,7 @@ void GcodeSuite::M851() { if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) offs.x = x; else { - SERIAL_ECHOLNPAIR("?X out of range (-", int(X_BED_SIZE), " to ", int(X_BED_SIZE), ")"); + SERIAL_ECHOLNPAIR("?X out of range (-", X_BED_SIZE, " to ", X_BED_SIZE, ")"); ok = false; } #else @@ -72,7 +72,7 @@ void GcodeSuite::M851() { if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) offs.y = y; else { - SERIAL_ECHOLNPAIR("?Y out of range (-", int(Y_BED_SIZE), " to ", int(Y_BED_SIZE), ")"); + SERIAL_ECHOLNPAIR("?Y out of range (-", Y_BED_SIZE, " to ", Y_BED_SIZE, ")"); ok = false; } #else @@ -85,7 +85,7 @@ void GcodeSuite::M851() { if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) offs.z = z; else { - SERIAL_ECHOLNPAIR("?Z out of range (", int(Z_PROBE_OFFSET_RANGE_MIN), " to ", int(Z_PROBE_OFFSET_RANGE_MAX), ")"); + SERIAL_ECHOLNPAIR("?Z out of range (", Z_PROBE_OFFSET_RANGE_MIN, " to ", Z_PROBE_OFFSET_RANGE_MAX, ")"); ok = false; } } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index d5bc857286..c483522cd7 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -302,8 +302,8 @@ void GCodeQueue::ok_to_send() { while (NUMERIC_SIGNED(*p)) SERIAL_CHAR(*p++); } - SERIAL_ECHOPAIR_P(SP_P_STR, int(planner.moves_free()), - SP_B_STR, int(BUFSIZE - length)); + SERIAL_ECHOPAIR_P(SP_P_STR, planner.moves_free(), + SP_B_STR, BUFSIZE - length); #endif SERIAL_EOL(); } diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 39f161f5ad..55554a98cf 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1772,7 +1772,7 @@ void HMI_SDCardUpdate() { if (HMI_flag.home_flag) return; if (DWIN_lcd_sd_status != card.isMounted()) { DWIN_lcd_sd_status = card.isMounted(); - // SERIAL_ECHOLNPAIR("HMI_SDCardUpdate: ", int(DWIN_lcd_sd_status)); + // SERIAL_ECHOLNPAIR("HMI_SDCardUpdate: ", DWIN_lcd_sd_status); if (DWIN_lcd_sd_status) { if (checkkey == SelectFile) Redraw_SD_List(); diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 2b47094a4e..a990c4c640 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -141,7 +141,7 @@ void AnycubicTFTClass::OnKillTFT() { void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPAIR("TFT Serial Debug: OnSDCardStateChange event triggered...", (int)isInserted); + SERIAL_ECHOLNPAIR("TFT Serial Debug: OnSDCardStateChange event triggered...", isInserted); #endif DoSDCardStateCheck(); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index 62c66f16f2..77d870fd4c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -1083,7 +1083,7 @@ void CLCD::init() { if (counter == 249) { #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("Timeout waiting for device ID, should be 124, got ", int(device_id)); + SERIAL_ECHO_MSG("Timeout waiting for device ID, should be 124, got ", device_id); #endif } } @@ -1101,7 +1101,7 @@ void CLCD::init() { delay(1); if (ENABLED(TOUCH_UI_DEBUG) && counter == 99) - SERIAL_ECHO_MSG("Timeout waiting for reset status. Should be 0x00, got ", int(reset_status)); + SERIAL_ECHO_MSG("Timeout waiting for reset status. Should be 0x00, got ", reset_status); } mem_write_8(REG::PWM_DUTY, 0); // turn off Backlight, Frequency already is set to 250Hz default diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp index 78d5f2483e..ac8f49a055 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp @@ -124,7 +124,7 @@ namespace FTDI { case UNPRESSED: if (tag != 0) { #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("Touch start: ", int(tag)); + SERIAL_ECHO_MSG("Touch start: ", tag); #endif pressed_tag = tag; @@ -185,7 +185,7 @@ namespace FTDI { if (UIData::flags.bits.touch_end_sound) sound.play(unpress_sound); #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("Touch end: ", int(pressed_tag)); + SERIAL_ECHO_MSG("Touch end: ", pressed_tag); #endif const uint8_t saved_pressed_tag = pressed_tag; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp index d76b897e0f..4e318cef17 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp @@ -43,7 +43,7 @@ void ScreenRef::setScreen(onRedraw_func_t onRedraw_ptr) { if (type != 0xFF) { setType(type); #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("New screen: ", int(type)); + SERIAL_ECHO_MSG("New screen: ", type); #endif } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp index 07d1ff5624..f48448eb84 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp @@ -37,9 +37,7 @@ namespace FTDI { void SoundPlayer::play(effect_t effect, note_t note) { #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Playing note ", int(note)); - SERIAL_ECHOLNPAIR(", instrument ", int(effect)); + SERIAL_ECHO_MSG("Playing note ", note, ", instrument ", effect); #endif // Play the note diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index eaee08f43b..88566713a4 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -751,7 +751,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { // For Cartesian / Core motion simply move to the current_position planner.buffer_line(current_position, fr_mm_s, axis == E_AXIS ? e_index : active_extruder); - //SERIAL_ECHOLNPAIR("Add planner.move with Axis ", int(axis), " at FR ", fr_mm_s); + //SERIAL_ECHOLNPAIR("Add planner.move with Axis ", axis, " at FR ", fr_mm_s); axis = NO_AXIS; @@ -772,7 +772,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { #endif start_time = millis() + (menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves axis = move_axis; - //SERIAL_ECHOLNPAIR("Post Move with Axis ", int(axis), " soon."); + //SERIAL_ECHOLNPAIR("Post Move with Axis ", axis, " soon."); } #if ENABLED(AUTO_BED_LEVELING_UBL) diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 7b95f435ba..179a2c2d55 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -216,7 +216,7 @@ void menu_advanced_settings(); #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU) void bltouch_report() { - SERIAL_ECHOLNPAIR("EEPROM Last BLTouch Mode - ", (int)bltouch.last_written_mode); + SERIAL_ECHOLNPAIR("EEPROM Last BLTouch Mode - ", bltouch.last_written_mode); SERIAL_ECHOLNPGM("Configuration BLTouch Mode - " TERN(BLTOUCH_SET_5V_MODE, "5V", "OD")); char mess[21]; strcpy_P(mess, PSTR("BLTouch Mode - ")); diff --git a/Marlin/src/libs/bresenham.h b/Marlin/src/libs/bresenham.h index ade231e26d..6e4162fd13 100644 --- a/Marlin/src/libs/bresenham.h +++ b/Marlin/src/libs/bresenham.h @@ -120,7 +120,7 @@ public: static void report(const uint8_t index) { if (index < Cfg::SIZE) { - SERIAL_ECHOPAIR("bresenham ", int(index), " : (", dividend[index], "/", divisor, ") "); + SERIAL_ECHOPAIR("bresenham ", index, " : (", dividend[index], "/", divisor, ") "); if (counter[index] >= 0) SERIAL_CHAR(' '); if (labs(counter[index]) < 100) { SERIAL_CHAR(' '); if (labs(counter[index]) < 10) SERIAL_CHAR(' '); } SERIAL_ECHO(counter[index]); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index f7fc66b27a..8dc84c33d6 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1305,7 +1305,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t const feedRate_t home_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("...(", axis_codes[axis], ", ", distance, ", "); + DEBUG_ECHOPAIR("...(", AS_CHAR(axis_codes[axis]), ", ", distance, ", "); if (fr_mm_s) DEBUG_ECHO(fr_mm_s); else @@ -1398,7 +1398,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t * Callers must sync the planner position after calling this! */ void set_axis_is_at_home(const AxisEnum axis) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_is_at_home(", axis_codes[axis], ")"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_is_at_home(", AS_CHAR(axis_codes[axis]), ")"); set_axis_trusted(axis); set_axis_homed(axis); @@ -1448,7 +1448,7 @@ void set_axis_is_at_home(const AxisEnum axis) { if (DEBUGGING(LEVELING)) { #if HAS_HOME_OFFSET - DEBUG_ECHOLNPAIR("> home_offset[", axis_codes[axis], "] = ", home_offset[axis]); + DEBUG_ECHOLNPAIR("> home_offset[", AS_CHAR(axis_codes[axis]), "] = ", home_offset[axis]); #endif DEBUG_POS("", current_position); DEBUG_ECHOLNPAIR("<<< set_axis_is_at_home(", axis_codes[axis], ")"); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 94c409eb72..925538ef83 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -719,7 +719,7 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise DEBUG_ECHOLNPAIR( "...(", LOGICAL_X_POSITION(rx), ", ", LOGICAL_Y_POSITION(ry), ", ", raise_after == PROBE_PT_RAISE ? "raise" : raise_after == PROBE_PT_STOW ? "stow" : "none", - ", ", int(verbose_level), + ", ", verbose_level, ", ", probe_relative ? "probe" : "nozzle", "_relative)" ); DEBUG_POS("", current_position); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 089481d076..7fb378191e 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2289,7 +2289,7 @@ void MarlinSettings::postprocess() { eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); if (eeprom_error) { DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("Index: ", int(eeprom_index - (EEPROM_OFFSET)), " Size: ", datasize()); + DEBUG_ECHOLNPAIR("Index: ", eeprom_index - (EEPROM_OFFSET), " Size: ", datasize()); IF_DISABLED(EEPROM_AUTO_INIT, ui.eeprom_alert_index()); } else if (working_crc != stored_crc) { @@ -3039,7 +3039,7 @@ void MarlinSettings::reset() { } #if EXTRUDERS == 1 - CONFIG_ECHO_MSG(" M200 S", int(parser.volumetric_enabled) + CONFIG_ECHO_MSG(" M200 S", parser.volumetric_enabled , " D", LINEAR_UNIT(planner.filament_size[0]) #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[0]) @@ -3047,14 +3047,14 @@ void MarlinSettings::reset() { ); #else LOOP_L_N(i, EXTRUDERS) { - CONFIG_ECHO_MSG(" M200 T", int(i) + CONFIG_ECHO_MSG(" M200 T", i , " D", LINEAR_UNIT(planner.filament_size[i]) #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[i]) #endif ); } - CONFIG_ECHO_MSG(" M200 S", int(parser.volumetric_enabled)); + CONFIG_ECHO_MSG(" M200 S", parser.volumetric_enabled); #endif #endif // EXTRUDERS && !NO_VOLUMETRICS @@ -3076,7 +3076,7 @@ void MarlinSettings::reset() { LOOP_L_N(i, E_STEPPERS) { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR_P( - PSTR(" M203 T"), (int)i + PSTR(" M203 T"), i , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS_N(i)]) ); } @@ -3096,7 +3096,7 @@ void MarlinSettings::reset() { LOOP_L_N(i, E_STEPPERS) { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR_P( - PSTR(" M201 T"), (int)i + PSTR(" M201 T"), i , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(i)]) ); } @@ -3158,7 +3158,7 @@ void MarlinSettings::reset() { CONFIG_ECHO_START(); LOOP_S_L_N(e, 1, HOTENDS) { SERIAL_ECHOPAIR_P( - PSTR(" M218 T"), (int)e, + PSTR(" M218 T"), e, SP_X_STR, LINEAR_UNIT(hotend_offset[e].x), SP_Y_STR, LINEAR_UNIT(hotend_offset[e].y) ); @@ -3192,7 +3192,7 @@ void MarlinSettings::reset() { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR_P( - PSTR(" M420 S"), int(planner.leveling_active) + PSTR(" M420 S"), planner.leveling_active #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) , SP_Z_STR, LINEAR_UNIT(planner.z_fade_height) #endif @@ -3204,7 +3204,7 @@ void MarlinSettings::reset() { LOOP_L_N(py, GRID_MAX_POINTS_Y) { LOOP_L_N(px, GRID_MAX_POINTS_X) { CONFIG_ECHO_START(); - SERIAL_ECHOPAIR_P(PSTR(" G29 S3 I"), (int)px, PSTR(" J"), (int)py); + SERIAL_ECHOPAIR_P(PSTR(" G29 S3 I"), px, PSTR(" J"), py); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(mbl.z_values[px][py]), 5); } } @@ -3233,7 +3233,7 @@ void MarlinSettings::reset() { LOOP_L_N(py, GRID_MAX_POINTS_Y) { LOOP_L_N(px, GRID_MAX_POINTS_X) { CONFIG_ECHO_START(); - SERIAL_ECHOPAIR(" G29 W I", (int)px, " J", (int)py); + SERIAL_ECHOPAIR(" G29 W I", px, " J", py); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(z_values[px][py]), 5); } } @@ -3258,7 +3258,7 @@ void MarlinSettings::reset() { #elif ENABLED(BLTOUCH) || (HAS_Z_SERVO_PROBE && defined(Z_SERVO_ANGLES)) case Z_PROBE_SERVO_NR: #endif - CONFIG_ECHO_MSG(" M281 P", int(i), " L", servo_angles[i][0], " U", servo_angles[i][1]); + CONFIG_ECHO_MSG(" M281 P", i, " L", servo_angles[i][0], " U", servo_angles[i][1]); default: break; } } @@ -3334,7 +3334,7 @@ void MarlinSettings::reset() { LOOP_L_N(i, PREHEAT_COUNT) { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR_P( - PSTR(" M145 S"), (int)i + PSTR(" M145 S"), i #if HAS_HOTEND , PSTR(" H"), TEMP_UNIT(ui.material_preset[i].hotend_temp) #endif @@ -3403,7 +3403,7 @@ void MarlinSettings::reset() { #if ENABLED(POWER_LOSS_RECOVERY) CONFIG_ECHO_HEADING("Power-Loss Recovery:"); - CONFIG_ECHO_MSG(" M413 S", int(recovery.enabled)); + CONFIG_ECHO_MSG(" M413 S", recovery.enabled); #endif #if ENABLED(FWRETRACT) @@ -3425,11 +3425,9 @@ void MarlinSettings::reset() { ); #if ENABLED(FWRETRACT_AUTORETRACT) - CONFIG_ECHO_HEADING("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); - CONFIG_ECHO_MSG(" M209 S", int(fwretract.autoretract_enabled)); - - #endif // FWRETRACT_AUTORETRACT + CONFIG_ECHO_MSG(" M209 S", fwretract.autoretract_enabled); + #endif #endif // FWRETRACT @@ -3775,7 +3773,7 @@ void MarlinSettings::reset() { CONFIG_ECHO_MSG(" M900 K", planner.extruder_advance_K[0]); #else LOOP_L_N(i, EXTRUDERS) - CONFIG_ECHO_MSG(" M900 T", int(i), " K", planner.extruder_advance_K[i]); + CONFIG_ECHO_MSG(" M900 T", i, " K", planner.extruder_advance_K[i]); #endif #endif @@ -3841,7 +3839,7 @@ void MarlinSettings::reset() { #if HAS_FILAMENT_SENSOR CONFIG_ECHO_HEADING("Filament runout sensor:"); CONFIG_ECHO_MSG( - " M412 S", int(runout.enabled) + " M412 S", runout.enabled #if HAS_FILAMENT_RUNOUT_DISTANCE , " D", LINEAR_UNIT(runout.runout_distance()) #endif @@ -3859,7 +3857,7 @@ void MarlinSettings::reset() { #if HAS_MULTI_LANGUAGE CONFIG_ECHO_HEADING("UI Language:"); - SERIAL_ECHO_MSG(" M414 S", int(ui.language)); + SERIAL_ECHO_MSG(" M414 S", ui.language); #endif } diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index f66d60ab15..5a4ed16744 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -828,7 +828,7 @@ void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_ms serialprintPGM(serial_msg); SERIAL_ECHOPGM(STR_STOPPED_HEATER); if (heater_id >= 0) - SERIAL_ECHO((int)heater_id); + SERIAL_ECHO(heater_id); else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) SERIAL_ECHOPGM(STR_HEATER_CHAMBER); else @@ -1494,7 +1494,7 @@ void Temperature::manage_heater() { float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { if (e > HOTENDS - DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)) { SERIAL_ERROR_START(); - SERIAL_ECHO((int)e); + SERIAL_ECHO(e); SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER_NUM); kill(); return 0; @@ -2065,7 +2065,7 @@ void Temperature::init() { switch (heater_id) { case H_BED: SERIAL_ECHOPGM("bed"); break; case H_CHAMBER: SERIAL_ECHOPGM("chamber"); break; - default: SERIAL_ECHO((int)heater_id); + default: SERIAL_ECHO(heater_id); } SERIAL_ECHOLNPAIR( " ; sizeof(running_temp):", sizeof(running_temp), diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 191617be30..0ed3d15b45 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -186,7 +186,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; - DEBUG_ECHOPAIR("(1) Move extruder ", int(new_tool)); + DEBUG_ECHOPAIR("(1) Move extruder ", new_tool); DEBUG_POS(" to new extruder ParkPos", current_position); planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); @@ -196,7 +196,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = grabpos + offsetcompensation; - DEBUG_ECHOPAIR("(2) Couple extruder ", int(new_tool)); + DEBUG_ECHOPAIR("(2) Couple extruder ", new_tool); DEBUG_POS(" to new extruder GrabPos", current_position); planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); @@ -209,7 +209,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; - DEBUG_ECHOPAIR("(3) Move extruder ", int(new_tool)); + DEBUG_ECHOPAIR("(3) Move extruder ", new_tool); DEBUG_POS(" back to new extruder ParkPos", current_position); planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); @@ -219,7 +219,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = mpe_settings.parking_xpos[active_extruder] + (active_extruder == 0 ? MPE_TRAVEL_DISTANCE : -MPE_TRAVEL_DISTANCE) + offsetcompensation; - DEBUG_ECHOPAIR("(4) Move extruder ", int(new_tool)); + DEBUG_ECHOPAIR("(4) Move extruder ", new_tool); DEBUG_POS(" close to old extruder ParkPos", current_position); planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); @@ -229,7 +229,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = mpe_settings.parking_xpos[active_extruder] + offsetcompensation; - DEBUG_ECHOPAIR("(5) Park extruder ", int(new_tool)); + DEBUG_ECHOPAIR("(5) Park extruder ", new_tool); DEBUG_POS(" at old extruder ParkPos", current_position); planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); @@ -239,7 +239,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = oldx; - DEBUG_ECHOPAIR("(6) Move extruder ", int(new_tool)); + DEBUG_ECHOPAIR("(6) Move extruder ", new_tool); DEBUG_POS(" to starting position", current_position); planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); @@ -274,9 +274,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a if (homed_towards_final_tool) { pe_solenoid_magnet_off(1 - final_tool); - DEBUG_ECHOLNPAIR("Disengage magnet", (int)(1 - final_tool)); + DEBUG_ECHOLNPAIR("Disengage magnet", 1 - final_tool); pe_solenoid_magnet_on(final_tool); - DEBUG_ECHOLNPAIR("Engage magnet", (int)final_tool); + DEBUG_ECHOLNPAIR("Engage magnet", final_tool); parking_extruder_set_parked(false); return false; } @@ -315,7 +315,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a if (!extruder_parked) { current_position.x = parkingposx[active_extruder] + x_offset; - DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder)); + DEBUG_ECHOLNPAIR("(1) Park extruder ", active_extruder); DEBUG_POS("Moving ParkPos", current_position); fast_line_to_current(X_AXIS); @@ -411,7 +411,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = placexpos; - DEBUG_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); + DEBUG_ECHOLNPAIR("(1) Place old tool ", active_extruder); DEBUG_POS("Move X SwitchPos", current_position); fast_line_to_current(X_AXIS); @@ -509,7 +509,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR; - SERIAL_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); + SERIAL_ECHOLNPAIR("(1) Place old tool ", active_extruder); DEBUG_POS("Move Y SwitchPos + Security", current_position); fast_line_to_current(Y_AXIS); @@ -709,7 +709,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #if EXTRUDERS inline void invalid_extruder_error(const uint8_t e) { SERIAL_ECHO_START(); - SERIAL_CHAR('T'); SERIAL_ECHO((int)e); + SERIAL_CHAR('T'); SERIAL_ECHO(e); SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER); } #endif @@ -1196,7 +1196,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { gcode.process_subcommands_now_P(PSTR(EVENT_GCODE_AFTER_TOOLCHANGE)); #endif - SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, int(active_extruder)); + SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, active_extruder); #endif // HAS_MULTI_EXTRUDER } diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 7693c52330..3cd88318ff 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -926,7 +926,7 @@ int SdBaseFile::peek() { // print uint8_t with width 2 static void print2u(const uint8_t v) { if (v < 10) SERIAL_CHAR('0'); - SERIAL_ECHO((int)v); + SERIAL_ECHO(v); } /** diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index bda7f8aeba..fd26bdd671 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -583,7 +583,7 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* // Too deep? The firmware has to bail. if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) { - SERIAL_ERROR_MSG("Exceeded max SUBROUTINE depth:", int(SD_PROCEDURE_DEPTH)); + SERIAL_ERROR_MSG("Exceeded max SUBROUTINE depth:", SD_PROCEDURE_DEPTH); kill(GET_TEXT(MSG_KILL_SUBCALL_OVERFLOW)); return; } diff --git a/docs/Serial.md b/docs/Serial.md index 69fa94fc15..948e07b448 100644 --- a/docs/Serial.md +++ b/docs/Serial.md @@ -40,5 +40,25 @@ typedef MultiSerial< RuntimeSerial, ConditionalSerial > Se By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it. Because of this condition, all underlying type takes a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used. +## SERIAL macros +The following macros are defined (in `serial.h`) to output data to the serial ports: + +| MACRO | Parameters | Usage | Example | Expected output | +|-------|------------|-------|---------|-----------------| +| `SERIAL_ECHO` | Any basic type is supported (`char`, `uint8_t`, `int16_t`, `int32_t`, `float`, `long`, `const char*`, ...). | For a numeric type it prints the number in decimal. A string is output as a string. | `uint8_t a = 123; SERIAL_ECHO(a); SERIAL_CHAR(' '); SERIAL_ECHO(' '); ` | `123 32` | +| `SERIAL_ECHOLN` | Same as `SERIAL_ECHO` | Do `SERIAL_ECHO`, adding a newline | `int a = 456; SERIAL_ECHOLN(a);` | `456\n` | +| `SERIAL_ECHO_F` | `float` or `double` | Print a decimal value with a given precision (default 2) | `float a = 3.1415; SERIAL_ECHO_F(a); SERIAL_CHAR(' '); SERIAL_ECHO_F(a, 4);` | `3.14 3.1415`| +| `SERIAL_ECHOPAIR` | String / Value pairs | Print a series of string literals and values alternately | `SERIAL_ECHOPAIR("Bob", 34);` | `Bob34` | +| `SERIAL_ECHOLNPAIR` | Same as `SERIAL_ECHOPAIR` | Do `SERIAL_ECHOPAIR`, adding a newline | `SERIAL_ECHOPAIR("Alice", 56);` | `alice56` | +| `SERIAL_ECHOPAIR_P` | Like `SERIAL_ECHOPAIR` but takes PGM strings | Print a series of PGM strings and values alternately | `SERIAL_ECHOPAIR_P(GET_TEXT(MSG_HELLO), 123);` | `Hello123` | +| `SERIAL_ECHOLNPAIR_P` | Same as `SERIAL_ECHOPAIR_P` | Do `SERIAL_ECHOPAIR_P`, adding a newline | `SERIAL_ECHOLNPAIR_P(PSTR("Alice"), 78);` | `alice78\n` | +| `SERIAL_ECHOLIST` | String literal, values | Print a string literal and a list of values | `SERIAL_ECHOLIST("Key ", 1, 2, 3);` | `Key 1, 2, 3` | +| `SERIAL_ECHO_START` | None | Prefix an echo line | `SERIAL_ECHO_START();` | `echo:` | +| `SERIAL_ECHO_MSG` | Same as `SERIAL_ECHOLN_PAIR` | Print a full echo line | `SERIAL_ECHO_MSG("Count is ", count);` | `echo:Count is 3` | +| `SERIAL_ERROR_START`| None | Prefix an error line | `SERIAL_ERROR_START();` | `Error:` | +| `SERIAL_ERROR_MSG` | Same as `SERIAL_ECHOLN_PAIR` | Print a full error line | `SERIAL_ERROR_MSG("Not found");` | `Error:Not found` | +| `SERIAL_ECHO_SP` | Number of spaces | Print one or more spaces | `SERIAL_ECHO_SP(3)` | ` ` | +| `SERIAL_EOL` | None | Print an end of line | `SERIAL_EOL();` | `\n` | +| `SERIAL_OUT` | `SERIAL_OUT(myMethod)` | Call a custom serial method | `SERIAL_OUT(msgDone);` | ... | *This document was written by [X-Ryl669](https://blog.cyril.by) and is under [CC-SA license](https://creativecommons.org/licenses/by-sa)* From 41ab63897f2340318868789cd5187dd8762c3758 Mon Sep 17 00:00:00 2001 From: JoAnn Manges Date: Mon, 8 Feb 2021 20:51:57 -0500 Subject: [PATCH 0997/1370] MAX Thermocouples rework (#20447) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 2 +- Marlin/src/MarlinCore.cpp | 6 +- Marlin/src/inc/Conditionals_post.h | 84 +++++++ Marlin/src/module/temperature.cpp | 229 +++++++++++++++----- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 1 + 5 files changed, 266 insertions(+), 56 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index be64ea832e..10d6737714 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -31,7 +31,7 @@ /** * Detect an old pins file by checking for old ADC pins values. */ -#define _OLD_TEMP_PIN(P) PIN_EXISTS(P) && _CAT(P,_PIN) <= 7 && _CAT(P,_PIN) != 2 && _CAT(P,_PIN) != 3 +#define _OLD_TEMP_PIN(P) PIN_EXISTS(P) && _CAT(P,_PIN) <= 7 && !WITHIN(_CAT(P,_PIN), TERN(LPC1768_IS_SKRV1_3, 0, 2), 3) // Include P0_00 and P0_01 for SKR V1.3 board #if _OLD_TEMP_PIN(TEMP_BED) #error "TEMP_BED_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." #elif _OLD_TEMP_PIN(TEMP_0) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 6b2259dd08..b085e6145a 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -937,11 +937,11 @@ void setup() { SETUP_RUN(HAL_init()); - // Init and disable SPI thermocouples - #if TEMP_SENSOR_0_IS_MAX6675 + // Init and disable SPI thermocouples; this is still needed + #if TEMP_SENSOR_0_IS_MAX_TC OUT_WRITE(MAX6675_SS_PIN, HIGH); // Disable #endif - #if TEMP_SENSOR_1_IS_MAX6675 + #if TEMP_SENSOR_1_IS_MAX_TC OUT_WRITE(MAX6675_SS2_PIN, HIGH); // Disable #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 04c4eb120d..949885eab7 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -490,6 +490,90 @@ #define HAS_MAX6675 1 #endif +// +// Compatibility layer for MAX (SPI) temp boards +// +#if PIN_EXISTS(MAX6675_SS) + #if TEMP_SENSOR_0_IS_MAX31855 + #define MAX31855_CS_PIN MAX6675_SS_PIN + #elif TEMP_SENSOR_0_IS_MAX31865 + #define MAX31865_CS_PIN MAX6675_SS_PIN + #elif TEMP_SENSOR_0_IS_MAX6675 + #define MAX6675_CS_PIN MAX6675_SS_PIN + #endif +#endif + +#if PIN_EXISTS(MAX6675_SS2) + #if TEMP_SENSOR_1_IS_MAX31855 + #define MAX31855_CS2_PIN MAX6675_SS2_PIN + #elif TEMP_SENSOR_1_IS_MAX31865 + #define MAX31865_CS2_PIN MAX6675_SS2_PIN + #elif TEMP_SENSOR_1_IS_MAX6675 + #define MAX6675_CS2_PIN MAX6675_SS2_PIN + #endif +#endif + +#if PIN_EXISTS(MAX6675_DO) + #if HAS_MAX31855 + #define MAX31855_MISO_PIN MAX6675_DO_PIN + #elif HAS_MAX31865 + #define MAX31865_MISO_PIN MAX6675_DO_PIN + #elif HAS_MAX6675 + #define MAX6675_MISO_PIN MAX6675_DO_PIN + #endif +#endif + +#if PIN_EXISTS(MAX6675_SCK) + #if HAS_MAX31855 + #define MAX31855_SCK_PIN MAX6675_SCK_PIN + #elif HAS_MAX31865 + #define MAX31865_SCK_PIN MAX6675_SCK_PIN + #endif +#endif + +// Compatibility Layer for use when HAL manipulates PINS for MAX31855 and MAX6675 +#if PIN_EXISTS(MAX31855_CS) && !PIN_EXISTS(MAX6675_SS) + #define MAX6675_SS_PIN MAX31855_CS_PIN +#endif +#if PIN_EXISTS(MAX31855_CS2) && !PIN_EXISTS(MAX6675_SS2) + #define MAX6675_SS2_PIN MAX31855_CS2_PIN +#endif +#if PIN_EXISTS(MAX6675_CS) && !PIN_EXISTS(MAX6675_SS) + #define MAX6675_SS_PIN MAX6675_CS_PIN +#endif +#if PIN_EXISTS(MAX6675_CS2) && !PIN_EXISTS(MAX6675_SS2) + #define MAX6675_SS2_PIN MAX6675_CS2_PIN +#endif +#if PIN_EXISTS(MAX31855_MISO) && !PIN_EXISTS(MAX6675_DO) + #define MAX6675_DO_PIN MAX31855_MISO_PIN +#endif +#if PIN_EXISTS(MAX6675_MISO) && !PIN_EXISTS(MAX6675_DO) + #define MAX6675_DO_PIN MAX6675_MISO_PIN +#endif +#if PIN_EXISTS(MAX31855_SCK) && !PIN_EXISTS(MAX6675_SCK) + #define MAX6675_SCK_PIN MAX31855_SCK_PIN +#endif + +// +// User-defined thermocouple libraries +// +// Add LIB_MAX6675 / LIB_MAX31855 / LIB_MAX31865 to the build_flags +// to select a USER library for MAX6675, MAX31855, MAX31865 +// +#if BOTH(HAS_MAX6675, LIB_MAX6675) + #define LIB_USR_MAX6675 1 +#endif +#if BOTH(HAS_MAX31855, LIB_MAX31855) + #define LIB_USR_MAX31855 1 +#endif +#if HAS_MAX31865 + #if ENABLED(LIB_MAX31865) + #define LIB_USR_MAX31865 1 + #else + #define LIB_ADAFRUIT_MAX31865 1 + #endif +#endif + #if TEMP_SENSOR_2 == -4 #define TEMP_SENSOR_2_IS_AD8495 1 #elif TEMP_SENSOR_2 == -3 diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 5a4ed16744..edd76df3b7 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -47,41 +47,104 @@ #include "../lcd/extui/ui_api.h" #endif +// LIB_MAX31855 can be added to the build_flags in platformio.ini to use a user-defined library +#if LIB_USR_MAX31855 + #include + #if PIN_EXISTS(MAX31855_MISO) && PIN_EXISTS(MAX31855_SCK) + #define MAX31855_USES_SW_SPI 1 + #endif + #if TEMP_SENSOR_0_IS_MAX31855 && PIN_EXISTS(MAX31855_CS) + #define HAS_MAX31855_TEMP 1 + Adafruit_MAX31855 max31855_0 = Adafruit_MAX31855(MAX31855_CS_PIN + #if MAX31855_USES_SW_SPI + , MAX31855_MISO_PIN, MAX31855_SCK_PIN // For software SPI also set MISO/SCK + #endif + #if ENABLED(LARGE_PINMAP) + , HIGH + #endif + ); + #endif + #if TEMP_SENSOR_1_IS_MAX31855 && PIN_EXISTS(MAX31855_CS2) + #define HAS_MAX31855_TEMP 1 + Adafruit_MAX31855 max31855_1 = Adafruit_MAX31855(MAX31855_CS2_PIN + #if MAX31855_USES_SW_SPI + , MAX31855_MISO_PIN, MAX31855_SCK_PIN // For software SPI also set MISO/SCK + #endif + #if ENABLED(LARGE_PINMAP) + , HIGH + #endif + ); + #endif +#endif + +// LIB_MAX31865 can be added to the build_flags in platformio.ini to use a user-defined library. +// If LIB_MAX31865 is not on the build_flags then the Adafruit MAX31865 V1.1.0 library is used. #if HAS_MAX31865 #include - #if TEMP_SENSOR_0_IS_MAX31865 && !defined(MAX31865_CS_PIN) && PIN_EXISTS(MAX6675_SS) - #define MAX31865_CS_PIN MAX6675_SS_PIN - #endif - #if TEMP_SENSOR_1_IS_MAX31865 && !defined(MAX31865_CS2_PIN) && PIN_EXISTS(MAX6675_SS2) - #define MAX31865_CS2_PIN MAX6675_SS2_PIN - #endif #ifndef MAX31865_MOSI_PIN #define MAX31865_MOSI_PIN SD_MOSI_PIN #endif - #ifndef MAX31865_MISO_PIN - #define MAX31865_MISO_PIN MAX6675_DO_PIN - #endif - #ifndef MAX31865_SCK_PIN - #define MAX31865_SCK_PIN MAX6675_SCK_PIN + #if PIN_EXISTS(MAX31865_MISO) && PIN_EXISTS(MAX31865_SCK) + #define MAX31865_USES_SW_SPI 1 #endif #if TEMP_SENSOR_0_IS_MAX31865 && PIN_EXISTS(MAX31865_CS) #define HAS_MAX31865_TEMP 1 - Adafruit_MAX31865 max31865_0 = Adafruit_MAX31865(MAX31865_CS_PIN - #if MAX31865_CS_PIN != MAX6675_SS_PIN - , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK - #endif - ); + Adafruit_MAX31865 max31865_0 = Adafruit_MAX31865(MAX31865_CS_PIN + #if MAX31865_USES_SW_SPI && PIN_EXISTS(MAX31865_MOSI) + , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK + #endif + #if ENABLED(LARGE_PINMAP) + , HIGH + #endif + ); #endif #if TEMP_SENSOR_1_IS_MAX31865 && PIN_EXISTS(MAX31865_CS2) #define HAS_MAX31865_TEMP 1 Adafruit_MAX31865 max31865_1 = Adafruit_MAX31865(MAX31865_CS2_PIN - #if MAX31865_CS2_PIN != MAX6675_SS2_PIN - , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK + #if MAX31865_USES_SW_SPI && PIN_EXISTS(MAX31865_MOSI) + , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK + #endif + #if ENABLED(LARGE_PINMAP) + , HIGH #endif ); #endif #endif +// LIB_MAX6675 can be added to the build_flags in platformio.ini to use a user-defined library +#if LIB_USR_MAX6675 + #include + #if PIN_EXISTS(MAX6675_MISO) && PIN_EXISTS(MAX6675_SCK) + #define MAX6675_USES_SW_SPI 1 + #endif + #if TEMP_SENSOR_0_IS_MAX6675 && PIN_EXISTS(MAX6675_CS) + #define HAS_MAX6675_TEMP 1 + MAX6675 max6675_0 = MAX6675(MAX6675_CS_PIN + #if MAX6675_USES_SW_SPI + , MAX6675_MISO_PIN, MAX6675_SCK_PIN // For software SPI also set MISO/SCK + #endif + #if ENABLED(LARGE_PINMAP) + , HIGH + #endif + ); + #endif + #if TEMP_SENSOR_1_IS_MAX6675 && PIN_EXISTS(MAX6675_CS2) + #define HAS_MAX6675_TEMP 1 + MAX6675 max6675_1 = MAX6675(MAX6675_CS2_PIN + #if MAX6675_USES_SW_SPI + , MAX6675_MISO_PIN, MAX6675_SCK_PIN // For software SPI also set MISO/SCK + #endif + #if ENABLED(LARGE_PINMAP) + , HIGH + #endif + ); + #endif +#endif + +#if !HAS_MAX6675_TEMP && !HAS_MAX31855_TEMP && !HAS_MAX31865_TEMP + #define NO_THERMO_TEMPS 1 +#endif + #if (TEMP_SENSOR_0_IS_MAX_TC || TEMP_SENSOR_1_IS_MAX_TC) && PINS_EXIST(MAX6675_SCK, MAX6675_DO) && NO_THERMO_TEMPS #define THERMO_SEPARATE_SPI 1 #endif @@ -1718,9 +1781,38 @@ void Temperature::updateTemperaturesFromRawValues() { * The manager is implemented by periodic calls to manage_heater() */ void Temperature::init() { + // Init (and disable) SPI thermocouples + #if TEMP_SENSOR_0_IS_MAX6675 && PIN_EXISTS(MAX6675_CS) + OUT_WRITE(MAX6675_CS_PIN, HIGH); + #endif + #if TEMP_SENSOR_1_IS_MAX6675 && PIN_EXISTS(MAX6675_CS2) + OUT_WRITE(MAX6675_CS2_PIN, HIGH); + #endif + #if TEMP_SENSOR_0_IS_MAX6675 && PIN_EXISTS(MAX31855_CS) + OUT_WRITE(MAX31855_CS_PIN, HIGH); + #endif + #if TEMP_SENSOR_1_IS_MAX6675 && PIN_EXISTS(MAX31855_CS2) + OUT_WRITE(MAX31855_CS2_PIN, HIGH); + #endif + #if TEMP_SENSOR_0_IS_MAX6675 && PIN_EXISTS(MAX31865_CS) + OUT_WRITE(MAX31865_CS_PIN, HIGH); + #endif + #if TEMP_SENSOR_1_IS_MAX6675 && PIN_EXISTS(MAX31865_CS2) + OUT_WRITE(MAX31865_CS2_PIN, HIGH); + #endif - TERN_(TEMP_SENSOR_0_IS_MAX31865, max31865_0.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE - TERN_(TEMP_SENSOR_1_IS_MAX31865, max31865_1.begin(MAX31865_2WIRE)); + #if HAS_MAX31865_TEMP + TERN_(TEMP_SENSOR_0_IS_MAX31865, max31865_0.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE + TERN_(TEMP_SENSOR_1_IS_MAX31865, max31865_1.begin(MAX31865_2WIRE)); + #endif + #if HAS_MAX31855_TEMP + TERN_(TEMP_SENSOR_0_IS_MAX31855, max31855_0.begin()); + TERN_(TEMP_SENSOR_1_IS_MAX31855, max31855_1.begin()); + #endif + #if HAS_MAX6675_TEMP + TERN_(TEMP_SENSOR_0_IS_MAX6675, max6675_0.begin()); + TERN_(TEMP_SENSOR_1_IS_MAX6675, max6675_1.begin()); + #endif #if EARLY_WATCHDOG // Flag that the thermalManager should be running @@ -2234,7 +2326,7 @@ void Temperature::disable_all_heaters() { int Temperature::read_max_tc(TERN_(HAS_MULTI_MAX_TC, const uint8_t hindex/*=0*/)) { #define MAX6675_HEAT_INTERVAL 250UL - #if HAS_MAX31855 + #if HAS_MAX31855_TEMP static uint32_t max_tc_temp = 2000; #define MAX_TC_ERROR_MASK 7 #define MAX_TC_DISCARD_BITS 18 @@ -2284,65 +2376,91 @@ void Temperature::disable_all_heaters() { if (PENDING(ms, next_max_tc_ms[hindex])) return int(THERMO_TEMP(hindex)); next_max_tc_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; - #if HAS_MAX31865_TEMP - Adafruit_MAX31865 &maxref = THERMO_SEL(max31865_0, max31865_1); - const uint16_t max31865_ohms = (uint32_t(maxref.readRTD()) * THERMO_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1)) >> 16; - #endif - // // TODO: spiBegin, spiRec and spiInit doesn't work when soft spi is used. // - #if !THERMO_SEPARATE_SPI + #if !THERMO_SEPARATE_SPI && NO_THERMO_TEMPS spiBegin(); spiInit(MAX_TC_SPEED_BITS); #endif - MAX6675_WRITE(LOW); // enable TT_MAX6675 - DELAY_NS(100); // Ensure 100ns delay + #if NO_THERMO_TEMPS + MAX6675_WRITE(LOW); // enable TT_MAX6675 + DELAY_NS(100); // Ensure 100ns delay + #endif + + max_tc_temp = 0; // Read a big-endian temperature value - max_tc_temp = 0; - for (uint8_t i = sizeof(max_tc_temp); i--;) { - max_tc_temp |= TERN(THERMO_SEPARATE_SPI, max_tc_spi.receive(), spiRec()); - if (i > 0) max_tc_temp <<= 8; // shift left if not the last byte - } + #if NO_THERMO_TEMPS + for (uint8_t i = sizeof(max_tc_temp); i--;) { + max_tc_temp |= TERN(THERMO_SEPARATE_SPI, max_tc_spi.receive(), spiRec()); + if (i > 0) max_tc_temp <<= 8; // shift left if not the last byte + } + MAX6675_WRITE(HIGH); // disable TT_MAX6675 + #endif - MAX6675_WRITE(HIGH); // disable TT_MAX6675 + #if HAS_MAX31855_TEMP + Adafruit_MAX31855 &max855ref = THERMO_SEL(max31855_0, max31855_1); + max_tc_temp = max855ref.readRaw32(); + #endif - const uint8_t fault_31865 = TERN1(HAS_MAX31865_TEMP, maxref.readFault()); + #if HAS_MAX31865_TEMP + Adafruit_MAX31865 &max865ref = THERMO_SEL(max31865_0, max31865_1); + #if ENABLED(LIB_USR_MAX31865) + max_tc_temp = max865ref.readRTD_with_Fault(); + #endif + #endif - if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max_tc_temp & MAX_TC_ERROR_MASK) && fault_31865) { + #if HAS_MAX6675_TEMP + MAX6675 &max6675ref = THERMO_SEL(max6675_0, max6675_1); + max_tc_temp = max6675ref.readRaw16(); + #endif + + #if ENABLED(LIB_ADAFRUIT_MAX31865) + const uint8_t fault_31865 = max865ref.readFault() & 0x3FU; + #endif + + if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) + && TERN(LIB_ADAFRUIT_MAX31865, fault_31865, (max_tc_temp & MAX_TC_ERROR_MASK)) + ) { max_tc_errors[hindex]++; if (max_tc_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) { SERIAL_ERROR_START(); SERIAL_ECHOPGM("Temp measurement error! "); #if MAX_TC_ERROR_MASK == 7 - SERIAL_ECHOPGM("MAX31855 "); - if (max_tc_temp & 1) + SERIAL_ECHOPGM("MAX31855 Fault : (", max_tc_temp & 0x7, ") >> "); + if (max_tc_temp & 0x1) SERIAL_ECHOLNPGM("Open Circuit"); - else if (max_tc_temp & 2) + else if (max_tc_temp & 0x2) SERIAL_ECHOLNPGM("Short to GND"); - else if (max_tc_temp & 4) + else if (max_tc_temp & 0x4) SERIAL_ECHOLNPGM("Short to VCC"); - #elif HAS_MAX31865_TEMP + #elif HAS_MAX31865 + #if ENABLED(LIB_USR_MAX31865) + // At the present time we do not have the ability to set the MAX31865 HIGH threshold + // or thr LOW threshold, so no need to check for them, zero these bits out + const uint8_t fault_31865 = max865ref.readFault() & 0x3FU; + #endif + max865ref.clearFault(); if (fault_31865) { - maxref.clearFault(); - SERIAL_ECHOPAIR("MAX31865 Fault :(", fault_31865, ") >>"); + SERIAL_EOL(); + SERIAL_ECHOLNPAIR("\nMAX31865 Fault :(", fault_31865, ") >>"); if (fault_31865 & MAX31865_FAULT_HIGHTHRESH) SERIAL_ECHOLNPGM("RTD High Threshold"); - else if (fault_31865 & MAX31865_FAULT_LOWTHRESH) + if (fault_31865 & MAX31865_FAULT_LOWTHRESH) SERIAL_ECHOLNPGM("RTD Low Threshold"); - else if (fault_31865 & MAX31865_FAULT_REFINLOW) + if (fault_31865 & MAX31865_FAULT_REFINLOW) SERIAL_ECHOLNPGM("REFIN- > 0.85 x Bias"); - else if (fault_31865 & MAX31865_FAULT_REFINHIGH) + if (fault_31865 & MAX31865_FAULT_REFINHIGH) SERIAL_ECHOLNPGM("REFIN- < 0.85 x Bias - FORCE- open"); - else if (fault_31865 & MAX31865_FAULT_RTDINLOW) + if (fault_31865 & MAX31865_FAULT_RTDINLOW) SERIAL_ECHOLNPGM("REFIN- < 0.85 x Bias - FORCE- open"); - else if (fault_31865 & MAX31865_FAULT_OVUV) + if (fault_31865 & MAX31865_FAULT_OVUV) SERIAL_ECHOLNPGM("Under/Over voltage"); } #else - SERIAL_ECHOLNPGM("MAX6675"); + SERIAL_ECHOLNPGM("MAX6675 Open Circuit"); #endif // Thermocouple open @@ -2361,7 +2479,13 @@ void Temperature::disable_all_heaters() { #endif // Return the RTD resistance for MAX31865 for display in SHOW_TEMP_ADC_VALUES - TERN_(HAS_MAX31865_TEMP, max_tc_temp = max31865_ohms); + #if HAS_MAX31865_TEMP + #if ENABLED(LIB_ADAFRUIT_MAX31865) + max_tc_temp = (uint32_t(max865ref.readRTD()) * THERMO_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1)) >> 16; + #elif ENABLED(LIB_USR_MAX31865) + max_tc_temp = (uint32_t(max_tc_temp) * THERMO_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1)) >> 16; + #endif + #endif THERMO_TEMP(hindex) = max_tc_temp; @@ -3047,7 +3171,8 @@ void Temperature::tick() { SERIAL_ECHOPGM(" /"); SERIAL_PRINT(t, SFP); #if ENABLED(SHOW_TEMP_ADC_VALUES) - SERIAL_ECHOPAIR(" (", r * RECIPROCAL(OVERSAMPLENR)); + // Temperature MAX SPI boards do not have an OVERSAMPLENR defined + SERIAL_ECHOPAIR(" (", TERN(NO_THERMO_TEMPS, false, k == 'T') ? r : r * RECIPROCAL(OVERSAMPLENR)); SERIAL_CHAR(')'); #endif delay(2); diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index e5b78024cb..db9f85c742 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -22,6 +22,7 @@ #pragma once #define BOARD_INFO_NAME "BTT SKR V1.3" +#define LPC1768_IS_SKRV1_3 1 // // Trinamic Stallguard pins From c7efb2d964e8fd35170fe91de1b13789e62ddc3d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 7 Feb 2021 18:16:43 -0600 Subject: [PATCH 0998/1370] Update M808 comment --- Marlin/src/gcode/queue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index c483522cd7..c49247912c 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -610,7 +610,7 @@ void GCodeQueue::get_serial_commands() { if (!is_eol && sd_count) ++sd_count; // End of file with no newline if (!process_line_done(sd_input_state, command_buffer[index_w], sd_count)) { - // M808 S saves the sdpos of the next line. M808 loops to a new sdpos. + // M808 L saves the sdpos of the next line. M808 loops to a new sdpos. TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command_buffer[index_w])); // Put the new command into the buffer (no "ok" sent) From 9acd2e176d77d2e69a93e008c0e508f37787fc8f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 8 Feb 2021 21:27:00 -0600 Subject: [PATCH 0999/1370] Ender 3 V2 DWIN cleanup (#21026) --- Marlin/src/core/macros.h | 8 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 214 ++++++++++++++---------------- Marlin/src/lcd/dwin/e3v2/dwin.h | 12 +- 3 files changed, 110 insertions(+), 124 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 0112dbc736..16e18ac902 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -130,20 +130,20 @@ #define NOLESS(v, n) \ do{ \ - __typeof__(n) _n = (n); \ + __typeof__(v) _n = (n); \ if (_n > v) v = _n; \ }while(0) #define NOMORE(v, n) \ do{ \ - __typeof__(n) _n = (n); \ + __typeof__(v) _n = (n); \ if (_n < v) v = _n; \ }while(0) #define LIMIT(v, n1, n2) \ do{ \ - __typeof__(n1) _n1 = (n1); \ - __typeof__(n2) _n2 = (n2); \ + __typeof__(v) _n1 = (n1); \ + __typeof__(v) _n2 = (n2); \ if (_n1 > v) v = _n1; \ else if (_n2 < v) v = _n2; \ }while(0) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 55554a98cf..69889b6b06 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -191,16 +191,12 @@ constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; #endif -uint8_t Percentrecord = 0; -uint16_t remain_time = 0; +static uint8_t _card_percent = 0; +static uint16_t _remain_time = 0; #if ENABLED(PAUSE_HEAT) - #if HAS_HOTEND - uint16_t temphot = 0; - #endif - #if HAS_HEATED_BED - uint16_t tempbed = 0; - #endif + TERN_(HAS_HOTEND, uint16_t resume_hotend_temp = 0); + TERN_(HAS_HEATED_BED, uint16_t resume_bed_temp = 0); #endif #if HAS_ZOFFSET_ITEM @@ -1081,8 +1077,8 @@ void Draw_Printing_Screen() { void Draw_Print_ProgressBar() { DWIN_ICON_Show(ICON, ICON_Bar, 15, 93); - DWIN_Draw_Rectangle(1, BarFill_Color, 16 + Percentrecord * 240 / 100, 93, 256, 113); - DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Color_Bg_Black, 2, 117, 133, Percentrecord); + DWIN_Draw_Rectangle(1, BarFill_Color, 16 + _card_percent * 240 / 100, 93, 256, 113); + DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Color_Bg_Black, 2, 117, 133, _card_percent); DWIN_Draw_String(false, false, font8x16, Percent_Color, Color_Bg_Black, 133, 133, F("%")); } @@ -1094,9 +1090,9 @@ void Draw_Print_ProgressElapsed() { } void Draw_Print_ProgressRemain() { - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 176, 212, remain_time / 3600); + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 176, 212, _remain_time / 3600); DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 192, 212, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 200, 212, (remain_time % 3600) / 60); + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 200, 212, (_remain_time % 3600) / 60); } void Goto_PrintProcess() { @@ -1158,10 +1154,10 @@ inline ENCODER_DiffState get_encoder_state() { void HMI_Move_X() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_X_scale)) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_X_scaled)) { checkkey = AxisMove; EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scaled); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -1170,10 +1166,9 @@ void HMI_Move_X() { DWIN_UpdateLCD(); return; } - NOLESS(HMI_ValueStruct.Move_X_scale, (X_MIN_POS) * MINUNITMULT); - NOMORE(HMI_ValueStruct.Move_X_scale, (X_MAX_POS) * MINUNITMULT); - current_position.x = HMI_ValueStruct.Move_X_scale / MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + LIMIT(HMI_ValueStruct.Move_X_scaled, (X_MIN_POS) * MINUNITMULT, (X_MAX_POS) * MINUNITMULT); + current_position.x = HMI_ValueStruct.Move_X_scaled / MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(1), HMI_ValueStruct.Move_X_scaled); DWIN_UpdateLCD(); } } @@ -1181,10 +1176,10 @@ void HMI_Move_X() { void HMI_Move_Y() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Y_scale)) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Y_scaled)) { checkkey = AxisMove; EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scaled); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -1193,10 +1188,9 @@ void HMI_Move_Y() { DWIN_UpdateLCD(); return; } - NOLESS(HMI_ValueStruct.Move_Y_scale, (Y_MIN_POS) * MINUNITMULT); - NOMORE(HMI_ValueStruct.Move_Y_scale, (Y_MAX_POS) * MINUNITMULT); - current_position.y = HMI_ValueStruct.Move_Y_scale / MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + LIMIT(HMI_ValueStruct.Move_Y_scaled, (Y_MIN_POS) * MINUNITMULT, (Y_MAX_POS) * MINUNITMULT); + current_position.y = HMI_ValueStruct.Move_Y_scaled / MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(2), HMI_ValueStruct.Move_Y_scaled); DWIN_UpdateLCD(); } } @@ -1204,10 +1198,10 @@ void HMI_Move_Y() { void HMI_Move_Z() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scale)) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scaled)) { checkkey = AxisMove; EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scaled); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -1216,10 +1210,9 @@ void HMI_Move_Z() { DWIN_UpdateLCD(); return; } - NOLESS(HMI_ValueStruct.Move_Z_scale, Z_MIN_POS * MINUNITMULT); - NOMORE(HMI_ValueStruct.Move_Z_scale, Z_MAX_POS * MINUNITMULT); - current_position.z = HMI_ValueStruct.Move_Z_scale / MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + LIMIT(HMI_ValueStruct.Move_Z_scaled, Z_MIN_POS * MINUNITMULT, Z_MAX_POS * MINUNITMULT); + current_position.z = HMI_ValueStruct.Move_Z_scaled / MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scaled); DWIN_UpdateLCD(); } } @@ -1227,14 +1220,14 @@ void HMI_Move_Z() { #if HAS_HOTEND void HMI_Move_E() { - static float last_E_scale = 0; + static float last_E_scaled = 0; ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_E_scale)) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_E_scaled)) { checkkey = AxisMove; EncoderRate.enabled = false; - last_E_scale = HMI_ValueStruct.Move_E_scale; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + last_E_scaled = HMI_ValueStruct.Move_E_scaled; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scaled); if (!planner.is_full()) { planner.synchronize(); // Wait for planner moves to finish! planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); @@ -1242,12 +1235,12 @@ void HMI_Move_Z() { DWIN_UpdateLCD(); return; } - if ((HMI_ValueStruct.Move_E_scale - last_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scale = last_E_scale + (EXTRUDE_MAXLENGTH) * MINUNITMULT; - else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; - current_position.e = HMI_ValueStruct.Move_E_scale / MINUNITMULT; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + if ((HMI_ValueStruct.Move_E_scaled - last_E_scaled) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) + HMI_ValueStruct.Move_E_scaled = last_E_scaled + (EXTRUDE_MAXLENGTH) * MINUNITMULT; + else if ((last_E_scaled - HMI_ValueStruct.Move_E_scaled) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) + HMI_ValueStruct.Move_E_scaled = last_E_scaled - (EXTRUDE_MAXLENGTH) * MINUNITMULT; + current_position.e = HMI_ValueStruct.Move_E_scaled / MINUNITMULT; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scaled); DWIN_UpdateLCD(); } } @@ -1277,8 +1270,7 @@ void HMI_Move_Z() { DWIN_UpdateLCD(); return; } - NOLESS(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100); - NOMORE(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MAX) * 100); + LIMIT(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100, (Z_PROBE_OFFSET_RANGE_MAX) * 100); last_zoffset = dwin_zoffset; dwin_zoffset = HMI_ValueStruct.offset_value / 100.0f; #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) @@ -1326,8 +1318,7 @@ void HMI_Move_Z() { return; } // E_Temp limit - NOMORE(HMI_ValueStruct.E_Temp, MAX_E_TEMP); - NOLESS(HMI_ValueStruct.E_Temp, MIN_E_TEMP); + LIMIT(HMI_ValueStruct.E_Temp, MIN_E_TEMP, MAX_E_TEMP); // E_Temp value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } @@ -1370,8 +1361,7 @@ void HMI_Move_Z() { return; } // Bed_Temp limit - NOMORE(HMI_ValueStruct.Bed_Temp, BED_MAX_TARGET); - NOLESS(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP); + LIMIT(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP, BED_MAX_TARGET); // Bed_Temp value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } @@ -1415,8 +1405,7 @@ void HMI_Move_Z() { return; } // Fan_speed limit - NOMORE(HMI_ValueStruct.Fan_speed, FANON); - NOLESS(HMI_ValueStruct.Fan_speed, FANOFF); + LIMIT(HMI_ValueStruct.Fan_speed, FANOFF, FANON); // Fan_speed value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } @@ -1435,8 +1424,7 @@ void HMI_PrintSpeed() { return; } // print_speed limit - NOMORE(HMI_ValueStruct.print_speed, MAX_PRINT_SPEED); - NOLESS(HMI_ValueStruct.print_speed, MIN_PRINT_SPEED); + LIMIT(HMI_ValueStruct.print_speed, MIN_PRINT_SPEED, MAX_PRINT_SPEED); // print_speed value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); } @@ -1491,20 +1479,20 @@ void HMI_MaxAccelerationXYZE() { void HMI_MaxJerkXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk)) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk_scaled)) { checkkey = MaxJerk; EncoderRate.enabled = false; if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) - planner.set_max_jerk(HMI_flag.jerk_axis, HMI_ValueStruct.Max_Jerk / 10); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + planner.set_max_jerk(HMI_flag.jerk_axis, HMI_ValueStruct.Max_Jerk_scaled / 10); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk_scaled); return; } // MaxJerk limit if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); - NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXJERK) * MINUNITMULT); + NOMORE(HMI_ValueStruct.Max_Jerk_scaled, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Jerk_scaled, (MIN_MAXJERK) * MINUNITMULT); // MaxJerk value - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk_scaled); } } @@ -1513,43 +1501,41 @@ void HMI_MaxAccelerationXYZE() { void HMI_StepXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Step)) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Step_scaled)) { checkkey = Step; EncoderRate.enabled = false; if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) - planner.settings.axis_steps_per_mm[HMI_flag.step_axis] = HMI_ValueStruct.Max_Step / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + planner.settings.axis_steps_per_mm[HMI_flag.step_axis] = HMI_ValueStruct.Max_Step_scaled / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step_scaled); return; } // Step limit if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Step, 999.9 * MINUNITMULT); - NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); + NOMORE(HMI_ValueStruct.Max_Step_scaled, 999.9 * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Step_scaled, MIN_STEP); // Step value - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step_scaled); } } void update_variable() { - #if HAS_HOTEND - static float last_temp_hotend_target = 0, last_temp_hotend_current = 0; - #endif - #if HAS_HEATED_BED - static float last_temp_bed_target = 0, last_temp_bed_current = 0; - #endif - #if HAS_FAN - static uint8_t last_fan_speed = 0; - #endif + TERN_(HAS_HOTEND, static float last_temp_hotend_target = 0); + TERN_(HAS_HEATED_BED, static float last_temp_bed_target = 0); + TERN_(HAS_FAN, static uint8_t last_fan_speed = 0); /* Tune page temperature update */ if (checkkey == Tune) { #if HAS_HOTEND - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + last_temp_hotend_target = thermalManager.temp_hotend[0].target; + } #endif #if HAS_HEATED_BED - if (last_temp_bed_target != thermalManager.temp_bed.target) + if (last_temp_bed_target != thermalManager.temp_bed.target) { DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + last_temp_bed_target = thermalManager.temp_bed.target; + } #endif #if HAS_FAN if (last_fan_speed != thermalManager.fan_speed[0]) { @@ -1562,12 +1548,16 @@ void update_variable() { /* Temperature page temperature update */ if (checkkey == TemperatureID) { #if HAS_HOTEND - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_TEMP), thermalManager.temp_hotend[0].target); + last_temp_hotend_target = thermalManager.temp_hotend[0].target; + } #endif #if HAS_HEATED_BED - if (last_temp_bed_target != thermalManager.temp_bed.target) + if (last_temp_bed_target != thermalManager.temp_bed.target) { DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_BED), thermalManager.temp_bed.target); + last_temp_bed_target = thermalManager.temp_bed.target; + } #endif #if HAS_FAN if (last_fan_speed != thermalManager.fan_speed[0]) { @@ -1579,9 +1569,10 @@ void update_variable() { /* Bottom temperature update */ #if HAS_HOTEND - if (last_temp_hotend_current != thermalManager.temp_hotend[0].celsius) { + static float _hotendtemp = 0; + if (_hotendtemp != thermalManager.temp_hotend[0].celsius) { DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - last_temp_hotend_current = thermalManager.temp_hotend[0].celsius; + _hotendtemp = thermalManager.temp_hotend[0].celsius; } if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); @@ -1589,9 +1580,10 @@ void update_variable() { } #endif #if HAS_HEATED_BED - if (last_temp_bed_current != thermalManager.temp_bed.celsius) { + static float _bedtemp = 0; + if (_bedtemp != thermalManager.temp_bed.celsius) { DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, thermalManager.temp_bed.celsius); - last_temp_bed_current = thermalManager.temp_bed.celsius; + _bedtemp = thermalManager.temp_bed.celsius; } if (last_temp_bed_target != thermalManager.temp_bed.target) { DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); @@ -2135,13 +2127,11 @@ void HMI_Printing() { char cmd[40]; cmd[0] = '\0'; - #if ENABLED(PAUSE_HEAT) - #if HAS_HEATED_BED - if (tempbed) sprintf_P(cmd, PSTR("M190 S%i\n"), tempbed); - #endif - #if HAS_HOTEND - if (temphot) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), temphot); - #endif + #if BOTH(HAS_HOTEND, PAUSE_HEAT) + if (resume_hotend_temp) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), resume_hotend_temp); + #endif + #if BOTH(HAS_HEATED_BED, PAUSE_HEAT) + if (resume_bed_temp) sprintf_P(cmd, PSTR("M190 S%i\n"), resume_bed_temp); #endif strcat_P(cmd, M24_STR); @@ -2322,8 +2312,8 @@ void HMI_Prepare() { DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(2), current_position.y * MINUNITMULT); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(3), current_position.z * MINUNITMULT); #if HAS_HOTEND - HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + HMI_ValueStruct.Move_E_scaled = current_position.e * MINUNITMULT; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scaled); #endif break; case PREPARE_CASE_DISA: // Disable steppers @@ -2573,11 +2563,11 @@ void HMI_AxisMove() { if (HMI_flag.ETempTooLow_flag) { if (encoder_diffState == ENCODER_DIFF_ENTER) { HMI_flag.ETempTooLow_flag = false; - HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; + HMI_ValueStruct.Move_E_scaled = current_position.e * MINUNITMULT; Draw_Move_Menu(); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scaled); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scaled); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scaled); DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0); DWIN_UpdateLCD(); } @@ -2602,20 +2592,20 @@ void HMI_AxisMove() { break; case 1: // X axis move checkkey = Move_X; - HMI_ValueStruct.Move_X_scale = current_position.x * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + HMI_ValueStruct.Move_X_scaled = current_position.x * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scaled); EncoderRate.enabled = true; break; case 2: // Y axis move checkkey = Move_Y; - HMI_ValueStruct.Move_Y_scale = current_position.y * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + HMI_ValueStruct.Move_Y_scaled = current_position.y * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scaled); EncoderRate.enabled = true; break; case 3: // Z axis move checkkey = Move_Z; - HMI_ValueStruct.Move_Z_scale = current_position.z * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + HMI_ValueStruct.Move_Z_scaled = current_position.z * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scaled); EncoderRate.enabled = true; break; #if HAS_HOTEND @@ -2630,8 +2620,8 @@ void HMI_AxisMove() { } #endif checkkey = Extruder; - HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + HMI_ValueStruct.Move_E_scaled = current_position.e * MINUNITMULT; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scaled); EncoderRate.enabled = true; break; #endif @@ -3417,8 +3407,8 @@ void HMI_MaxAcceleration() { if (WITHIN(select_jerk.now, 1, 4)) { checkkey = MaxJerk_value; HMI_flag.jerk_axis = AxisEnum(select_jerk.now - 1); - HMI_ValueStruct.Max_Jerk = planner.max_jerk[HMI_flag.jerk_axis] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + HMI_ValueStruct.Max_Jerk_scaled = planner.max_jerk[HMI_flag.jerk_axis] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk_scaled); EncoderRate.enabled = true; } else { // Back @@ -3447,8 +3437,8 @@ void HMI_Step() { if (WITHIN(select_step.now, 1, 4)) { checkkey = Step_value; HMI_flag.step_axis = AxisEnum(select_step.now - 1); - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[HMI_flag.step_axis] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + HMI_ValueStruct.Max_Step_scaled = planner.settings.axis_steps_per_mm[HMI_flag.step_axis] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step_scaled); EncoderRate.enabled = true; } else { // Back @@ -3499,7 +3489,7 @@ void EachMomentUpdate() { planner.finish_and_disable(); // show percent bar and value - Percentrecord = 0; + _card_percent = 0; Draw_Print_ProgressBar(); // show print done confirm @@ -3517,12 +3507,8 @@ void EachMomentUpdate() { if (HMI_flag.pause_action && printingIsPaused() && !planner.has_blocks_queued()) { HMI_flag.pause_action = false; #if ENABLED(PAUSE_HEAT) - #if HAS_HEATED_BED - tempbed = thermalManager.temp_bed.target; - #endif - #if HAS_HOTEND - temphot = thermalManager.temp_hotend[0].target; - #endif + TERN_(HAS_HOTEND, resume_hotend_temp = thermalManager.temp_hotend[0].target); + TERN_(HAS_HEATED_BED, resume_bed_temp = thermalManager.temp_bed.target); thermalManager.disable_all_heaters(); #endif queue.inject_P(PSTR("G1 F1200 X0 Y0")); @@ -3534,7 +3520,7 @@ void EachMomentUpdate() { if (last_cardpercentValue != card_pct) { // print percent last_cardpercentValue = card_pct; if (card_pct) { - Percentrecord = card_pct; + _card_percent = card_pct; Draw_Print_ProgressBar(); } } @@ -3551,8 +3537,8 @@ void EachMomentUpdate() { // Estimate remaining time every 20 seconds static millis_t next_remain_time_update = 0; - if (Percentrecord > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag) { - remain_time = (elapsed.value - dwin_heat_time) / (Percentrecord * 0.01f) - (elapsed.value - dwin_heat_time); + if (_card_percent > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag) { + _remain_time = (elapsed.value - dwin_heat_time) / (_card_percent * 0.01f) - (elapsed.value - dwin_heat_time); next_remain_time_update += SEC_TO_MS(20); Draw_Print_ProgressRemain(); } diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 5656d67e9a..57f9873145 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -240,13 +240,13 @@ typedef struct { int16_t print_speed = 100; float Max_Feedspeed = 0; float Max_Acceleration = 0; - float Max_Jerk = 0; - float Max_Step = 0; - float Move_X_scale = 0; - float Move_Y_scale = 0; - float Move_Z_scale = 0; + float Max_Jerk_scaled = 0; + float Max_Step_scaled = 0; + float Move_X_scaled = 0; + float Move_Y_scaled = 0; + float Move_Z_scaled = 0; #if HAS_HOTEND - float Move_E_scale = 0; + float Move_E_scaled = 0; #endif float offset_value = 0; int8_t show_mode = 0; // -1: Temperature control 0: Printing temperature From 6320928795fe2ff241fb5e087c39a84e070e02ed Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 8 Feb 2021 21:31:26 -0600 Subject: [PATCH 1000/1370] Reheat bed first --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 69889b6b06..04171b9d79 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -2127,12 +2127,12 @@ void HMI_Printing() { char cmd[40]; cmd[0] = '\0'; - #if BOTH(HAS_HOTEND, PAUSE_HEAT) - if (resume_hotend_temp) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), resume_hotend_temp); - #endif #if BOTH(HAS_HEATED_BED, PAUSE_HEAT) if (resume_bed_temp) sprintf_P(cmd, PSTR("M190 S%i\n"), resume_bed_temp); #endif + #if BOTH(HAS_HOTEND, PAUSE_HEAT) + if (resume_hotend_temp) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), resume_hotend_temp); + #endif strcat_P(cmd, M24_STR); queue.inject(cmd); From 897291c470e6b39dd2ee3de152f4a6b330be1994 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Feb 2021 02:57:27 -0600 Subject: [PATCH 1001/1370] chmod and paths --- Marlin/src/gcode/bedlevel/G35.cpp | 0 buildroot/share/PlatformIO/scripts/mks_robin_mini.py | 0 buildroot/share/PlatformIO/scripts/mks_robin_nano.py | 0 buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp | 0 buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h | 0 buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h | 0 buildroot/share/PlatformIO/variants/CHITU_F103/variant.h | 0 .../share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp | 0 .../PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp | 0 .../share/PlatformIO/variants/megaextendedpins/pins_arduino.h | 0 buildroot/share/vscode/auto_build.py | 4 ++-- buildroot/share/vscode/create_custom_upload_command_CDC.py | 4 ++-- 12 files changed, 4 insertions(+), 4 deletions(-) mode change 100755 => 100644 Marlin/src/gcode/bedlevel/G35.cpp mode change 100755 => 100644 buildroot/share/PlatformIO/scripts/mks_robin_mini.py mode change 100755 => 100644 buildroot/share/PlatformIO/scripts/mks_robin_nano.py mode change 100755 => 100644 buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp mode change 100755 => 100644 buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h mode change 100755 => 100644 buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h mode change 100755 => 100644 buildroot/share/PlatformIO/variants/CHITU_F103/variant.h mode change 100755 => 100644 buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp mode change 100755 => 100644 buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp mode change 100755 => 100644 buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h b/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h b/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h b/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h old mode 100755 new mode 100644 diff --git a/buildroot/share/vscode/auto_build.py b/buildroot/share/vscode/auto_build.py index 5dd2d0d8a3..61cacca4d7 100644 --- a/buildroot/share/vscode/auto_build.py +++ b/buildroot/share/vscode/auto_build.py @@ -77,8 +77,8 @@ import os pwd = os.getcwd() # make sure we're executing from the correct directory level pwd = pwd.replace('\\', '/') -if 0 <= pwd.find('buildroot/share/atom'): - pwd = pwd[:pwd.find('buildroot/share/atom')] +if 0 <= pwd.find('buildroot/share/vscode'): + pwd = pwd[:pwd.find('buildroot/share/vscode')] os.chdir(pwd) print('pwd: ', pwd) diff --git a/buildroot/share/vscode/create_custom_upload_command_CDC.py b/buildroot/share/vscode/create_custom_upload_command_CDC.py index acfd1787fb..65edbd15b8 100644 --- a/buildroot/share/vscode/create_custom_upload_command_CDC.py +++ b/buildroot/share/vscode/create_custom_upload_command_CDC.py @@ -92,9 +92,9 @@ else: get_com_port('COM', 'Hardware ID:', 13) # avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' - avrdude_conf_path = 'buildroot\\share\\atom\\avrdude.conf' + avrdude_conf_path = 'buildroot\\share\\vscode\\avrdude.conf' - avrdude_exe_path = 'buildroot\\share\\atom\\avrdude_5.10.exe' + avrdude_exe_path = 'buildroot\\share\\vscode\\avrdude_5.10.exe' # source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' source_path = '.pio\\build\\' + env.get("PIOENV") + '\\firmware.hex' From 7361fbfe28cb3d739a5a92a6796821811745fcab Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@googlemail.com> Date: Fri, 12 Feb 2021 00:32:31 +0000 Subject: [PATCH 1002/1370] Improve probe preheat behavior (#21033) Co-authored-by: InsanityAutomation Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_LCD.h | 16 --------- Marlin/src/module/probe.cpp | 59 +++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 712ed39cf1..17f427a8dd 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -818,22 +818,6 @@ #define TOTAL_PROBING MULTIPLE_PROBING #endif #endif - #if ENABLED(PREHEAT_BEFORE_PROBING) - #ifndef PROBING_NOZZLE_TEMP - #define PROBING_NOZZLE_TEMP 0 - #endif - #ifndef PROBING_BED_TEMP - #define PROBING_BED_TEMP 0 - #endif - #endif - #if ENABLED(PREHEAT_BEFORE_LEVELING) - #ifndef LEVELING_NOZZLE_TEMP - #define LEVELING_NOZZLE_TEMP 0 - #endif - #ifndef LEVELING_BED_TEMP - #define LEVELING_BED_TEMP 0 - #endif - #endif #else // Clear probe pin settings when no probe is selected #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 925538ef83..8cda039db6 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -327,30 +327,61 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #if EITHER(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) + #if ENABLED(PREHEAT_BEFORE_PROBING) + #ifndef PROBING_NOZZLE_TEMP + #define PROBING_NOZZLE_TEMP 0 + #endif + #ifndef PROBING_BED_TEMP + #define PROBING_BED_TEMP 0 + #endif + #endif + #if ENABLED(PREHEAT_BEFORE_LEVELING) + #ifndef LEVELING_NOZZLE_TEMP + #define LEVELING_NOZZLE_TEMP 0 + #endif + #ifndef LEVELING_BED_TEMP + #define LEVELING_BED_TEMP 0 + #endif + #endif + /** - * Do preheating as required before leveling or probing + * Do preheating as required before leveling or probing. + * - If a preheat input is higher than the current target, raise the target temperature. + * - If a preheat input is higher than the current temperature, wait for stabilization. */ void Probe::preheat_for_probing(const uint16_t hotend_temp, const uint16_t bed_temp) { - #if PROBING_NOZZLE_TEMP || LEVELING_NOZZLE_TEMP + #if HAS_HOTEND && (PROBING_NOZZLE_TEMP || LEVELING_NOZZLE_TEMP) #define WAIT_FOR_NOZZLE_HEAT #endif - #if PROBING_BED_TEMP || LEVELING_BED_TEMP + #if HAS_HEATED_BED && (PROBING_BED_TEMP || LEVELING_BED_TEMP) #define WAIT_FOR_BED_HEAT #endif - const uint16_t hotendPreheat = TERN0(WAIT_FOR_NOZZLE_HEAT, thermalManager.degHotend(0) < hotend_temp) ? hotend_temp : 0, - bedPreheat = TERN0(WAIT_FOR_BED_HEAT, thermalManager.degBed() < bed_temp) ? bed_temp : 0; + DEBUG_ECHOPGM("Preheating "); - if (hotendPreheat) { - DEBUG_ECHOPAIR("hotend (", hotendPreheat, ") "); - if (bedPreheat) DEBUG_ECHOPGM("and "); - } - if (bedPreheat) DEBUG_ECHOPAIR("bed (", bedPreheat, ") "); + + #if ENABLED(WAIT_FOR_NOZZLE_HEAT) + const uint16_t hotendPreheat = hotend_temp > thermalManager.degTargetHotend(0) ? hotend_temp : 0; + if (hotendPreheat) { + DEBUG_ECHOPAIR("hotend (", hotendPreheat, ")"); + thermalManager.setTargetHotend(hotendPreheat, 0); + } + #elif ENABLED(WAIT_FOR_BED_HEAT) + constexpr uint16_t hotendPreheat = 0; + #endif + + #if ENABLED(WAIT_FOR_BED_HEAT) + const uint16_t bedPreheat = bed_temp > thermalManager.degTargetBed() ? bed_temp : 0; + if (bedPreheat) { + if (hotendPreheat) DEBUG_ECHOPGM(" and "); + DEBUG_ECHOPAIR("bed (", bedPreheat, ")"); + thermalManager.setTargetBed(bedPreheat); + } + #endif + DEBUG_EOL(); - TERN_(WAIT_FOR_NOZZLE_HEAT, if (hotendPreheat) thermalManager.setTargetHotend(hotendPreheat, 0)); - TERN_(WAIT_FOR_BED_HEAT, if (bedPreheat) thermalManager.setTargetBed(bedPreheat)); - TERN_(WAIT_FOR_NOZZLE_HEAT, if (hotendPreheat) thermalManager.wait_for_hotend(0)); - TERN_(WAIT_FOR_BED_HEAT, if (bedPreheat) thermalManager.wait_for_bed_heating()); + TERN_(WAIT_FOR_NOZZLE_HEAT, if (hotend_temp > thermalManager.degHotend(0) + (TEMP_WINDOW)) thermalManager.wait_for_hotend(0)); + TERN_(WAIT_FOR_BED_HEAT, if (bed_temp > thermalManager.degBed() + (TEMP_BED_WINDOW)) thermalManager.wait_for_bed_heating()); } #endif From 4d75c2e0f9e813effe59c2a36220037a0247a3f9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Feb 2021 03:52:21 -0600 Subject: [PATCH 1003/1370] Ender 3 V2 DWIN cleanup (#21061) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 599 ++++++++++++--------- Marlin/src/lcd/dwin/e3v2/dwin.h | 7 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 8 +- 3 files changed, 346 insertions(+), 268 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 04171b9d79..1f231954cc 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -98,6 +98,7 @@ #define PAUSE_HEAT #define USE_STRING_HEADINGS +//#define USE_STRING_TITLES #define DWIN_FONT_MENU font8x16 #define DWIN_FONT_STAT font10x20 @@ -136,9 +137,9 @@ #define UNITFDIGITS 1 #define MINUNITMULT pow(10, UNITFDIGITS) -#define ENCODER_WAIT 20 -#define DWIN_SCROLL_UPDATE_INTERVAL 2000 -#define DWIN_REMAIN_TIME_UPDATE_INTERVAL 20000 +#define ENCODER_WAIT_MS 20 +#define DWIN_SCROLL_UPDATE_INTERVAL SEC_TO_MS(2) +#define DWIN_REMAIN_TIME_UPDATE_INTERVAL SEC_TO_MS(20) constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other-than-Back TITLE_HEIGHT = 30, // Title bar height @@ -400,28 +401,28 @@ void ICON_Stop() { } } -inline void Clear_Title_Bar() { +void Clear_Title_Bar() { DWIN_Draw_Rectangle(1, Color_Bg_Blue, 0, 0, DWIN_WIDTH, 30); } -inline void Draw_Title(const char * const title) { +void Draw_Title(const char * const title) { DWIN_Draw_String(false, false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, (char*)title); } -inline void Draw_Title(const __FlashStringHelper * title) { +void Draw_Title(const __FlashStringHelper * title) { DWIN_Draw_String(false, false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, (char*)title); } -inline void Clear_Menu_Area() { +void Clear_Menu_Area() { DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y); } -inline void Clear_Main_Window() { +void Clear_Main_Window() { Clear_Title_Bar(); Clear_Menu_Area(); } -inline void Clear_Popup_Area() { +void Clear_Popup_Area() { Clear_Title_Bar(); DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); } @@ -430,30 +431,30 @@ void Draw_Popup_Bkgd_105() { DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 105, 258, 374); } -inline void Draw_More_Icon(const uint8_t line) { +void Draw_More_Icon(const uint8_t line) { DWIN_ICON_Show(ICON, ICON_More, 226, MBASE(line) - 3); } -inline void Draw_Menu_Cursor(const uint8_t line) { +void Draw_Menu_Cursor(const uint8_t line) { // DWIN_ICON_Show(ICON,ICON_Rectangle, 0, MBASE(line) - 18); DWIN_Draw_Rectangle(1, Rectangle_Color, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); } -inline void Erase_Menu_Cursor(const uint8_t line) { +void Erase_Menu_Cursor(const uint8_t line) { DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); } -inline void Move_Highlight(const int16_t from, const uint16_t newline) { +void Move_Highlight(const int16_t from, const uint16_t newline) { Erase_Menu_Cursor(newline - from); Draw_Menu_Cursor(newline); } -inline void Add_Menu_Line() { +void Add_Menu_Line() { Move_Highlight(1, MROWS); DWIN_Draw_Line(Line_Color, 16, MBASE(MROWS + 1) - 20, 256, MBASE(MROWS + 1) - 19); } -inline void Scroll_Menu(const uint8_t dir) { +void Scroll_Menu(const uint8_t dir) { DWIN_Frame_AreaMove(1, dir, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); switch (dir) { case DWIN_SCROLL_DOWN: Move_Highlight(-1, 0); break; @@ -465,22 +466,22 @@ inline uint16_t nr_sd_menu_items() { return card.get_num_Files() + !card.flag.workDirIsRoot; } -inline void Draw_Menu_Icon(const uint8_t line, const uint8_t icon) { +void Draw_Menu_Icon(const uint8_t line, const uint8_t icon) { DWIN_ICON_Show(ICON, icon, 26, MBASE(line) - 3); } -inline void Erase_Menu_Text(const uint8_t line) { +void Erase_Menu_Text(const uint8_t line) { DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); } -inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr) { +void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr) { if (label) DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, (char*)label); if (icon) Draw_Menu_Icon(line, icon); DWIN_Draw_Line(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); } // The "Back" label is always on the first line -inline void Draw_Back_Label() { +void Draw_Back_Label() { if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 129, 72, 156, 84, LBLX, MBASE(0)); else @@ -488,7 +489,7 @@ inline void Draw_Back_Label() { } // Draw "Back" line at the top -inline void Draw_Back_First(const bool is_sel=true) { +void Draw_Back_First(const bool is_sel=true) { Draw_Menu_Line(0, ICON_Back); Draw_Back_Label(); if (is_sel) Draw_Menu_Cursor(0); @@ -554,40 +555,61 @@ inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valr // Draw Menus // -inline void draw_move_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 69, 61, 102, 71, LBLX, line); // "Move" +void DWIN_Draw_Label(const uint16_t y, char *string) { + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, y, string); +} +void DWIN_Draw_Label(const uint16_t y, const __FlashStringHelper *title) { + DWIN_Draw_Label(y, (char*)title); } -inline void DWIN_Frame_TitleCopy(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { DWIN_Frame_AreaCopy(id, x1, y1, x2, y2, 14, 8); } +void draw_move_en(const uint16_t line) { + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(line, F("Move")); + #else + DWIN_Frame_AreaCopy(1, 69, 61, 102, 71, LBLX, line); // "Move" + #endif +} -inline void Item_Prepare_Move(const uint8_t row) { +void DWIN_Frame_TitleCopy(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { DWIN_Frame_AreaCopy(id, x1, y1, x2, y2, 14, 8); } + +void Item_Prepare_Move(const uint8_t row) { if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 159, 70, 200, 84, LBLX, MBASE(row)); else - draw_move_en(MBASE(row)); // "Move >" + draw_move_en(MBASE(row)); // "Move" Draw_Menu_Line(row, ICON_Axis); Draw_More_Icon(row); } -inline void Item_Prepare_Disable(const uint8_t row) { +void Item_Prepare_Disable(const uint8_t row) { if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 204, 70, 259, 82, LBLX, MBASE(row)); - else - DWIN_Frame_AreaCopy(1, 103, 59, 200, 74, LBLX, MBASE(row)); // "Disable Stepper" + else { + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(row), GET_TEXT_F(MSG_DISABLE_STEPPERS)); + #else + DWIN_Frame_AreaCopy(1, 103, 59, 200, 74, LBLX, MBASE(row)); // "Disable Stepper" + #endif + } Draw_Menu_Line(row, ICON_CloseMotor); } -inline void Item_Prepare_Home(const uint8_t row) { +void Item_Prepare_Home(const uint8_t row) { if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 0, 89, 41, 101, LBLX, MBASE(row)); - else - DWIN_Frame_AreaCopy(1, 202, 61, 271, 71, LBLX, MBASE(row)); // "Auto Home" + else { + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(row), GET_TEXT_F(MSG_AUTO_HOME)); + #else + DWIN_Frame_AreaCopy(1, 202, 61, 271, 71, LBLX, MBASE(row)); // "Auto Home" + #endif + } Draw_Menu_Line(row, ICON_Homing); } #if HAS_ZOFFSET_ITEM - inline void Item_Prepare_Offset(const uint8_t row) { + void Item_Prepare_Offset(const uint8_t row) { if (HMI_IsChinese()) { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); @@ -598,10 +620,18 @@ inline void Item_Prepare_Home(const uint8_t row) { } else { #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(row), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + #else + DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" + #endif DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else - DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(row), GET_TEXT_F(MSG_SET_HOME_OFFSETS)); + #else + DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "Set home offsets" + #endif #endif } Draw_Menu_Line(row, ICON_SetHome); @@ -610,52 +640,67 @@ inline void Item_Prepare_Home(const uint8_t row) { #endif #if HAS_HOTEND - inline void Item_Prepare_PLA(const uint8_t row) { + void Item_Prepare_PLA(const uint8_t row) { if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row)); } else { - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(row), F("Preheat " PREHEAT_1_LABEL)); + #else + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" + #endif } Draw_Menu_Line(row, ICON_PLAPreheat); } - inline void Item_Prepare_ABS(const uint8_t row) { + void Item_Prepare_ABS(const uint8_t row) { if (HMI_IsChinese()) { DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row)); } else { - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(row), F("Preheat " PREHEAT_2_LABEL)); + #else + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" + #endif } Draw_Menu_Line(row, ICON_ABSPreheat); } #endif #if HAS_PREHEAT - inline void Item_Prepare_Cool(const uint8_t row) { + void Item_Prepare_Cool(const uint8_t row) { if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); - else - DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" + else { + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(row), GET_TEXT_F(MSG_COOLDOWN)); + #else + DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" + #endif + } Draw_Menu_Line(row, ICON_Cool); } #endif -inline void Item_Prepare_Lang(const uint8_t row) { - if (HMI_IsChinese()) { +void Item_Prepare_Lang(const uint8_t row) { + if (HMI_IsChinese()) DWIN_Frame_AreaCopy(1, 239, 134, 266, 146, LBLX, MBASE(row)); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("CN")); - } else { - DWIN_Frame_AreaCopy(1, 0, 194, 121, 207, LBLX, MBASE(row)); // "Language selection" - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("EN")); + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(row), F("UI Language")); + #else + DWIN_Frame_AreaCopy(1, 0, 194, 121, 207, LBLX, MBASE(row)); // "Language selection" + #endif } + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), HMI_IsChinese() ? F("CN") : F("EN")); Draw_Menu_Icon(row, ICON_Language); } -inline void Draw_Prepare_Menu() { +void Draw_Prepare_Menu() { Clear_Main_Window(); const int16_t scroll = MROWS - index_prepare; // Scrolled-up lines @@ -692,7 +737,19 @@ inline void Draw_Prepare_Menu() { if (select_prepare.now) Draw_Menu_Cursor(PSCROL(select_prepare.now)); } -inline void Draw_Control_Menu() { +void Item_Control_Info(const uint16_t line) { + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, line); + else { + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(line, F("Info")); + #else + DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, line); + #endif + } +} + +void Draw_Control_Menu() { Clear_Main_Window(); #if CONTROL_CASE_TOTAL >= 6 @@ -717,36 +774,36 @@ inline void Draw_Control_Menu() { DWIN_Frame_AreaCopy(1, 174, 103, 229, 116, LBLX, CLINE(CONTROL_CASE_LOAD)); // Read Configuration DWIN_Frame_AreaCopy(1, 1, 118, 56, 131, LBLX, CLINE(CONTROL_CASE_RESET)); // Reset Configuration #endif - - if (CVISI(CONTROL_CASE_INFO)) - DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Info > } else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_CONTROL)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); - #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); - #endif - if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, CLINE(CONTROL_CASE_INFO), F("Info")); #else - DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control" + DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control" + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(CLINE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_Label(CLINE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_Label(CLINE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_Label(CLINE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_Label(CLINE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + #endif + #else DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > DWIN_Frame_AreaCopy(1, 84, 89, 128, 99, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX , CLINE(CONTROL_CASE_SAVE // "Store Configuration" + DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX , CLINE(CONTROL_CASE_SAVE)); // "Store Configuration" DWIN_Frame_AreaCopy(1, 26, 104, 57, 114, LBLX , CLINE(CONTROL_CASE_LOAD)); // "Read" DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 34, CLINE(CONTROL_CASE_LOAD)); // "Configuration" DWIN_Frame_AreaCopy(1, 59, 104, 93, 114, LBLX , CLINE(CONTROL_CASE_RESET)); // "Reset" DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 37, CLINE(CONTROL_CASE_RESET)); // "Configuration" #endif - if (CVISI(CONTROL_CASE_INFO)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(CONTROL_CASE_INFO)); // Info > #endif } + if (CVISI(CONTROL_CASE_INFO)) Item_Control_Info(CLINE(CONTROL_CASE_INFO)); + if (select_control.now && CVISI(select_control.now)) Draw_Menu_Cursor(CSCROL(select_control.now)); @@ -770,7 +827,7 @@ inline void Draw_Control_Menu() { if (CVISI(CONTROL_CASE_INFO)) Draw_More_Icon(CSCROL(i)); } -inline void Draw_Tune_Menu() { +void Draw_Tune_Menu() { Clear_Main_Window(); if (HMI_IsChinese()) { @@ -792,19 +849,22 @@ inline void Draw_Tune_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TUNE)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_SPEED), GET_TEXT_F(MSG_SPEED)); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - #endif - #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - #endif - #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); - #endif - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_ZOFF), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else DWIN_Frame_AreaCopy(1, 94, 2, 126, 12, 14, 9); + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(TUNE_CASE_SPEED), GET_TEXT_F(MSG_SPEED)); + #if HAS_HOTEND + DWIN_Draw_Label(MBASE(TUNE_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + #endif + #if HAS_HEATED_BED + DWIN_Draw_Label(MBASE(TUNE_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + #endif + #if HAS_FAN + DWIN_Draw_Label(MBASE(TUNE_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + DWIN_Draw_Label(MBASE(TUNE_CASE_ZOFF), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + #else DWIN_Frame_AreaCopy(1, 1, 179, 92, 190, LBLX, MBASE(TUNE_CASE_SPEED)); // Print speed #if HAS_HOTEND DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(TUNE_CASE_TEMP)); // Hotend... @@ -847,36 +907,36 @@ inline void Draw_Tune_Menu() { #endif } -inline void draw_max_en(const uint16_t line) { +void draw_max_en(const uint16_t line) { DWIN_Frame_AreaCopy(1, 245, 119, 269, 129, LBLX, line); // "Max" } -inline void draw_max_accel_en(const uint16_t line) { +void draw_max_accel_en(const uint16_t line) { draw_max_en(line); DWIN_Frame_AreaCopy(1, 1, 135, 79, 145, LBLX + 27, line); // "Acceleration" } -inline void draw_speed_en(const uint16_t inset, const uint16_t line) { +void draw_speed_en(const uint16_t inset, const uint16_t line) { DWIN_Frame_AreaCopy(1, 184, 119, 224, 132, LBLX + inset, line); // "Speed" } -inline void draw_jerk_en(const uint16_t line) { +void draw_jerk_en(const uint16_t line) { DWIN_Frame_AreaCopy(1, 64, 119, 106, 129, LBLX + 27, line); // "Jerk" } -inline void draw_steps_per_mm(const uint16_t line) { +void draw_steps_per_mm(const uint16_t line) { DWIN_Frame_AreaCopy(1, 1, 151, 101, 161, LBLX, line); // "Steps-per-mm" } -inline void say_x(const uint16_t inset, const uint16_t line) { +void say_x(const uint16_t inset, const uint16_t line) { DWIN_Frame_AreaCopy(1, 95, 104, 102, 114, LBLX + inset, line); // "X" } -inline void say_y(const uint16_t inset, const uint16_t line) { +void say_y(const uint16_t inset, const uint16_t line) { DWIN_Frame_AreaCopy(1, 104, 104, 110, 114, LBLX + inset, line); // "Y" } -inline void say_z(const uint16_t inset, const uint16_t line) { +void say_z(const uint16_t inset, const uint16_t line) { DWIN_Frame_AreaCopy(1, 112, 104, 120, 114, LBLX + inset, line); // "Z" } -inline void say_e(const uint16_t inset, const uint16_t line) { +void say_e(const uint16_t inset, const uint16_t line) { DWIN_Frame_AreaCopy(1, 237, 119, 244, 129, LBLX + inset, line); // "E" } -inline void Draw_Motion_Menu() { +void Draw_Motion_Menu() { Clear_Main_Window(); if (HMI_IsChinese()) { @@ -894,14 +954,17 @@ inline void Draw_Motion_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOTION)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_RATE), F("Feedrate")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_ACCEL), GET_TEXT_F(MSG_ACCELERATION)); - #if HAS_CLASSIC_JERK - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_JERK), GET_TEXT_F(MSG_JERK)); - #endif - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_STEPS), GET_TEXT_F(MSG_STEPS_PER_MM)); #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Motion" + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(MOTION_CASE_RATE), F("Feedrate")); + DWIN_Draw_Label(MBASE(MOTION_CASE_ACCEL), GET_TEXT_F(MSG_ACCELERATION)); + #if HAS_CLASSIC_JERK + DWIN_Draw_Label(MBASE(MOTION_CASE_JERK), GET_TEXT_F(MSG_JERK)); + #endif + DWIN_Draw_Label(MBASE(MOTION_CASE_STEPS), GET_TEXT_F(MSG_STEPS_PER_MM)); + #else draw_max_en(MBASE(MOTION_CASE_RATE)); draw_speed_en(27, MBASE(MOTION_CASE_RATE)); // "Max Speed" draw_max_accel_en(MBASE(MOTION_CASE_ACCEL)); // "Max Acceleration" #if HAS_CLASSIC_JERK @@ -959,7 +1022,7 @@ inline void Draw_Motion_Menu() { #endif -inline void Draw_Popup_Bkgd_60() { +void Draw_Popup_Bkgd_60() { DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 60, 258, 330); } @@ -1147,7 +1210,7 @@ inline ENCODER_DiffState get_encoder_state() { const millis_t ms = millis(); if (PENDING(ms, Encoder_ms)) return ENCODER_DIFF_NO; const ENCODER_DiffState state = Encoder_ReceiveAnalyze(); - if (state != ENCODER_DIFF_NO) Encoder_ms = ms + ENCODER_WAIT; + if (state != ENCODER_DIFF_NO) Encoder_ms = ms + ENCODER_WAIT_MS; return state; } @@ -1369,7 +1432,7 @@ void HMI_Move_Z() { #endif // HAS_HEATED_BED -#if HAS_PREHEAT +#if HAS_PREHEAT && HAS_FAN void HMI_FanSpeed() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); @@ -1411,7 +1474,7 @@ void HMI_Move_Z() { } } -#endif // HAS_PREHEAT +#endif // HAS_PREHEAT && HAS_FAN void HMI_PrintSpeed() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); @@ -1519,86 +1582,84 @@ void HMI_StepXYZE() { } void update_variable() { - TERN_(HAS_HOTEND, static float last_temp_hotend_target = 0); - TERN_(HAS_HEATED_BED, static float last_temp_bed_target = 0); - TERN_(HAS_FAN, static uint8_t last_fan_speed = 0); - - /* Tune page temperature update */ - if (checkkey == Tune) { - #if HAS_HOTEND - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); - last_temp_hotend_target = thermalManager.temp_hotend[0].target; - } - #endif - #if HAS_HEATED_BED - if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); - last_temp_bed_target = thermalManager.temp_bed.target; - } - #endif - #if HAS_FAN - if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); - last_fan_speed = thermalManager.fan_speed[0]; - } - #endif - } - - /* Temperature page temperature update */ - if (checkkey == TemperatureID) { - #if HAS_HOTEND - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_TEMP), thermalManager.temp_hotend[0].target); - last_temp_hotend_target = thermalManager.temp_hotend[0].target; - } - #endif - #if HAS_HEATED_BED - if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_BED), thermalManager.temp_bed.target); - last_temp_bed_target = thermalManager.temp_bed.target; - } - #endif - #if HAS_FAN - if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_FAN), thermalManager.fan_speed[0]); - last_fan_speed = thermalManager.fan_speed[0]; - } - #endif - } - - /* Bottom temperature update */ #if HAS_HOTEND static float _hotendtemp = 0; - if (_hotendtemp != thermalManager.temp_hotend[0].celsius) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - _hotendtemp = thermalManager.temp_hotend[0].celsius; - } - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); - last_temp_hotend_target = thermalManager.temp_hotend[0].target; - } + const bool _new_hotend_temp = _hotendtemp != thermalManager.temp_hotend[0].celsius; + if (_new_hotend_temp) _hotendtemp = thermalManager.temp_hotend[0].celsius; + static int16_t _hotendtarget = 0; + const bool _new_hotend_target = _hotendtarget != thermalManager.temp_hotend[0].target; + if (_new_hotend_target) _hotendtarget = thermalManager.temp_hotend[0].target; #endif #if HAS_HEATED_BED static float _bedtemp = 0; - if (_bedtemp != thermalManager.temp_bed.celsius) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, thermalManager.temp_bed.celsius); - _bedtemp = thermalManager.temp_bed.celsius; - } - if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); - last_temp_bed_target = thermalManager.temp_bed.target; - } + const bool _new_bed_temp = _bedtemp != thermalManager.temp_bed.celsius; + if (_new_bed_temp) _bedtemp = thermalManager.temp_bed.celsius; + static int16_t _bedtarget = 0; + const bool _new_bed_target = _bedtarget != thermalManager.temp_bed.target; + if (_new_bed_target) _bedtarget = thermalManager.temp_bed.target; #endif - static uint16_t last_speed = 0; - if (last_speed != feedrate_percentage) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); - last_speed = feedrate_percentage; + #if HAS_FAN + static uint8_t _fanspeed = 0; + const bool _new_fanspeed = _fanspeed != thermalManager.fan_speed[0]; + if (_new_fanspeed) _fanspeed = thermalManager.fan_speed[0]; + #endif + + if (checkkey == Tune) { + // Tune page temperature update + #if HAS_HOTEND + if (_new_hotend_target) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), _hotendtarget); + #endif + #if HAS_HEATED_BED + if (_new_bed_target) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), _bedtarget); + #endif + #if HAS_FAN + if (_new_fanspeed) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), _fanspeed); + #endif + } + else if (checkkey == TemperatureID) { + // Temperature page temperature update + #if HAS_HOTEND + if (_new_hotend_target) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_TEMP), _hotendtarget); + #endif + #if HAS_HEATED_BED + if (_new_bed_target) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_BED), _bedtarget); + #endif + #if HAS_FAN + if (_new_fanspeed) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_FAN), _fanspeed); + #endif + } + + // Bottom temperature update + + #if HAS_HOTEND + if (_new_hotend_temp) + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, _hotendtemp); + if (_new_hotend_target) + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, _hotendtarget); + #endif + + #if HAS_HEATED_BED + if (_new_bed_temp) + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, _bedtemp); + if (_new_bed_target) + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, _bedtarget); + #endif + + static int16_t _feedrate = 100; + if (_feedrate != feedrate_percentage) { + _feedrate = feedrate_percentage; + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, _feedrate); } #if HAS_ZOFFSET_ITEM if (last_zoffset != BABY_Z_VAR) { - DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178 + STAT_CHR_W, 429, BABY_Z_VAR * 100); last_zoffset = BABY_Z_VAR; + DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178 + STAT_CHR_W, 429, last_zoffset * 100); } #endif } @@ -1615,7 +1676,7 @@ void update_variable() { #define strcasecmp_P(a, b) strcasecmp((a), (b)) #endif -inline void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_LIMIT) { +void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_LIMIT) { char * const name = card.longest_filename(); size_t pos = strlen(name); // index of ending nul @@ -1638,7 +1699,7 @@ inline void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_ while (pos--) dst[pos] = src[pos]; } -inline void HMI_SDCardInit() { card.cdroot(); } +void HMI_SDCardInit() { card.cdroot(); } void MarlinUI::refresh() { /* Nothing to see here */ } @@ -1651,7 +1712,7 @@ void MarlinUI::refresh() { /* Nothing to see here */ } millis_t shift_ms; // = 0 // Init the shift name based on the highlighted item - inline void Init_Shift_Name() { + void Init_Shift_Name() { const bool is_subdir = !card.flag.workDirIsRoot; const int8_t filenum = select_file.now - 1 - is_subdir; // Skip "Back" and ".." const uint16_t fileCnt = card.get_num_Files(); @@ -1662,7 +1723,7 @@ void MarlinUI::refresh() { /* Nothing to see here */ } } } - inline void Init_SDItem_Shift() { + void Init_SDItem_Shift() { shift_amt = 0; shift_ms = select_file.now > 0 && strlen(shift_name) > MENU_CHAR_LIMIT ? millis() + 750UL : 0; @@ -1673,7 +1734,7 @@ void MarlinUI::refresh() { /* Nothing to see here */ } /** * Display an SD item, adding a CDUP for subfolders. */ -inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { +void Draw_SDItem(const uint16_t item, int16_t row=-1) { if (row < 0) row = item + 1 + MROWS - index_file; const bool is_subdir = !card.flag.workDirIsRoot; if (is_subdir && item == 0) { @@ -1701,7 +1762,7 @@ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { #if ENABLED(SCROLL_LONG_FILENAMES) - inline void Draw_SDItem_Shifted(int8_t &shift) { + void Draw_SDItem_Shifted(int8_t &shift) { // Limit to the number of chars past the cutoff const size_t len = strlen(shift_name); NOMORE(shift, _MAX(len - MENU_CHAR_LIMIT, 0U)); @@ -1722,7 +1783,7 @@ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { #endif // Redraw the first set of SD Files -inline void Redraw_SD_List() { +void Redraw_SD_List() { select_file.reset(); index_file = MROWS; @@ -1745,13 +1806,13 @@ inline void Redraw_SD_List() { bool DWIN_lcd_sd_status = false; -inline void SDCard_Up() { +void SDCard_Up() { card.cdup(); Redraw_SD_List(); DWIN_lcd_sd_status = false; // On next DWIN_Update } -inline void SDCard_Folder(char * const dirname) { +void SDCard_Folder(char * const dirname) { card.cd(dirname); Redraw_SD_List(); DWIN_lcd_sd_status = false; // On next DWIN_Update @@ -1764,7 +1825,7 @@ void HMI_SDCardUpdate() { if (HMI_flag.home_flag) return; if (DWIN_lcd_sd_status != card.isMounted()) { DWIN_lcd_sd_status = card.isMounted(); - // SERIAL_ECHOLNPAIR("HMI_SDCardUpdate: ", DWIN_lcd_sd_status); + //SERIAL_ECHOLNPAIR("HMI_SDCardUpdate: ", DWIN_lcd_sd_status); if (DWIN_lcd_sd_status) { if (checkkey == SelectFile) Redraw_SD_List(); @@ -1836,11 +1897,11 @@ void HMI_StartFrame(const bool with_update) { Draw_Status_Area(with_update); } -inline void Draw_Info_Menu() { +void Draw_Info_Menu() { Clear_Main_Window(); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, F(MACHINE_SIZE)); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, F(SHORT_BUILD_VERSION)); if (HMI_IsChinese()) { DWIN_Frame_TitleCopy(1, 30, 17, 57, 29); // "Info" @@ -1848,7 +1909,7 @@ inline void Draw_Info_Menu() { DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); DWIN_Frame_AreaCopy(1, 1, 164, 56, 176, 108, 175); DWIN_Frame_AreaCopy(1, 58, 164, 113, 176, 105, 248); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_C); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, F(CORP_WEBSITE_C)); } else { #ifdef USE_STRING_HEADINGS @@ -1860,7 +1921,7 @@ inline void Draw_Info_Menu() { DWIN_Frame_AreaCopy(1, 120, 150, 146, 161, 124, 102); DWIN_Frame_AreaCopy(1, 146, 151, 254, 161, 82, 175); DWIN_Frame_AreaCopy(1, 0, 165, 94, 175, 89, 248); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_E) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_E); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_E) * MENU_CHR_W) / 2, 268, F(CORP_WEBSITE_E)); } Draw_Back_First(); @@ -1870,7 +1931,7 @@ inline void Draw_Info_Menu() { } } -inline void Draw_Print_File_Menu() { +void Draw_Print_File_Menu() { Clear_Title_Bar(); if (HMI_IsChinese()) { @@ -2199,7 +2260,7 @@ void HMI_PauseOrStop() { DWIN_UpdateLCD(); } -inline void Draw_Move_Menu() { +void Draw_Move_Menu() { Clear_Main_Window(); if (HMI_IsChinese()) { @@ -2340,19 +2401,17 @@ void HMI_Prepare() { #endif break; #endif - #if HAS_HOTEND + #if HAS_PREHEAT case PREPARE_CASE_PLA: // PLA preheat - thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0); - thermalManager.setTargetBed(ui.material_preset[0].bed_temp); - thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed); + TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0)); + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(ui.material_preset[0].bed_temp)); + TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed)); break; case PREPARE_CASE_ABS: // ABS preheat - thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0); - thermalManager.setTargetBed(ui.material_preset[1].bed_temp); - thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed); + TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0)); + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(ui.material_preset[1].bed_temp)); + TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed)); break; - #endif - #if HAS_PREHEAT case PREPARE_CASE_COOL: // Cool TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); #if HAS_HOTEND || HAS_HEATED_BED @@ -2392,21 +2451,24 @@ void Draw_Temperature_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - #endif - #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - #endif - #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); - #endif - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_PLA), F("PLA Preheat Settings")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_ABS), F("ABS Preheat Settings")); - #endif #else DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "Temperature" + #endif + #ifdef USE_STRING_TITLES + #if HAS_HOTEND + DWIN_Draw_Label(MBASE(TEMP_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + #endif + #if HAS_HEATED_BED + DWIN_Draw_Label(MBASE(TEMP_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + #endif + #if HAS_FAN + DWIN_Draw_Label(MBASE(TEMP_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if HAS_HOTEND + DWIN_Draw_Label(MBASE(TEMP_CASE_PLA), F("PLA Preheat Settings")); + DWIN_Draw_Label(MBASE(TEMP_CASE_ABS), F("ABS Preheat Settings")); + #endif + #else #if HAS_HOTEND DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(TEMP_CASE_TEMP)); // Nozzle... DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(TEMP_CASE_TEMP)); // ...Temperature @@ -2472,10 +2534,7 @@ void HMI_Control() { Draw_More_Icon(CONTROL_CASE_MOVE + MROWS - index_control); // Motion > if (index_control > MROWS) { Draw_More_Icon(CONTROL_CASE_INFO + MROWS - index_control); // Info > - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, MBASE(CONTROL_CASE_INFO - 1)); - else - DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, MBASE(CONTROL_CASE_INFO - 1)); + Item_Control_Info(MBASE(CONTROL_CASE_INFO - 1)); } } else { @@ -2701,18 +2760,21 @@ void HMI_Temperature() { else { #ifdef USE_STRING_HEADINGS Draw_Title("PLA Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); - #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); - #endif - #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); - #endif - #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - #endif #else DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); + #if HAS_HEATED_BED + DWIN_Draw_Label(MBASE(PREHEAT_CASE_BED), F("Bed Temp")); + #endif + #if HAS_FAN + DWIN_Draw_Label(MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_Label(MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + #endif + #else DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp @@ -2777,18 +2839,21 @@ void HMI_Temperature() { else { #ifdef USE_STRING_HEADINGS Draw_Title("ABS Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); - #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); - #endif - #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); - #endif - #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - #endif #else DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "ABS Settings" + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); + #if HAS_HEATED_BED + DWIN_Draw_Label(MBASE(PREHEAT_CASE_BED), F("Bed Temp")); + #endif + #if HAS_FAN + DWIN_Draw_Label(MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_Label(MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + #endif + #else DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // ABS nozzle temp @@ -2833,7 +2898,7 @@ void HMI_Temperature() { DWIN_UpdateLCD(); } -inline void Draw_Max_Speed_Menu() { +void Draw_Max_Speed_Menu() { Clear_Main_Window(); if (HMI_IsChinese()) { @@ -2857,15 +2922,17 @@ inline void Draw_Max_Speed_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Feedrate X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Feedrate Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Feedrate Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Feedrate E")); - #endif #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Max Speed (mm/s)" - + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(1), F("Max Feedrate X")); + DWIN_Draw_Label(MBASE(2), F("Max Feedrate Y")); + DWIN_Draw_Label(MBASE(3), F("Max Feedrate Z")); + #if HAS_HOTEND + DWIN_Draw_Label(MBASE(4), F("Max Feedrate E")); + #endif + #else draw_max_en(MBASE(1)); // "Max" DWIN_Frame_AreaCopy(1, 184, 119, 234, 132, LBLX + 27, MBASE(1)); // "Speed X" @@ -2895,7 +2962,7 @@ inline void Draw_Max_Speed_Menu() { #endif } -inline void Draw_Max_Accel_Menu() { +void Draw_Max_Accel_Menu() { Clear_Main_Window(); if (HMI_IsChinese()) { @@ -2919,14 +2986,17 @@ inline void Draw_Max_Accel_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Accel X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Accel Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Accel Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Accel E")); - #endif #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Acceleration" + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(1), F("Max Accel X")); + DWIN_Draw_Label(MBASE(2), F("Max Accel Y")); + DWIN_Draw_Label(MBASE(3), F("Max Accel Z")); + #if HAS_HOTEND + DWIN_Draw_Label(MBASE(4), F("Max Accel E")); + #endif + #else draw_max_accel_en(MBASE(1)); say_x(108, MBASE(1)); // "Max Acceleration X" draw_max_accel_en(MBASE(2)); say_y(108, MBASE(2)); // "Max Acceleration Y" draw_max_accel_en(MBASE(3)); say_z(108, MBASE(3)); // "Max Acceleration Z" @@ -2947,7 +3017,7 @@ inline void Draw_Max_Accel_Menu() { } #if HAS_CLASSIC_JERK - inline void Draw_Max_Jerk_Menu() { + void Draw_Max_Jerk_Menu() { Clear_Main_Window(); if (HMI_IsChinese()) { @@ -2975,14 +3045,17 @@ inline void Draw_Max_Accel_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Jerk X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Jerk Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Jerk Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Jerk E")); - #endif #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk" + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(1), F("Max Jerk X")); + DWIN_Draw_Label(MBASE(2), F("Max Jerk Y")); + DWIN_Draw_Label(MBASE(3), F("Max Jerk Z")); + #if HAS_HOTEND + DWIN_Draw_Label(MBASE(4), F("Max Jerk E")); + #endif + #else draw_max_en(MBASE(1)); // "Max" draw_jerk_en(MBASE(1)); // "Jerk" draw_speed_en(72, MBASE(1)); // "Speed" @@ -3018,7 +3091,7 @@ inline void Draw_Max_Accel_Menu() { } #endif -inline void Draw_Steps_Menu() { +void Draw_Steps_Menu() { Clear_Main_Window(); if (HMI_IsChinese()) { @@ -3038,14 +3111,17 @@ inline void Draw_Steps_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Steps/mm X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Steps/mm Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Steps/mm Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Steps/mm E")); - #endif #else DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Steps per mm" + #endif + #ifdef USE_STRING_TITLES + DWIN_Draw_Label(MBASE(1), F("Steps/mm X")); + DWIN_Draw_Label(MBASE(2), F("Steps/mm Y")); + DWIN_Draw_Label(MBASE(3), F("Steps/mm Z")); + #if HAS_HOTEND + DWIN_Draw_Label(MBASE(4), F("Steps/mm E")); + #endif + #else draw_steps_per_mm(MBASE(1)); say_x(103, MBASE(1)); // "Steps-per-mm X" draw_steps_per_mm(MBASE(2)); say_y(103, MBASE(2)); // "Y" draw_steps_per_mm(MBASE(3)); say_z(103, MBASE(3)); // "Z" @@ -3539,7 +3615,7 @@ void EachMomentUpdate() { static millis_t next_remain_time_update = 0; if (_card_percent > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag) { _remain_time = (elapsed.value - dwin_heat_time) / (_card_percent * 0.01f) - (elapsed.value - dwin_heat_time); - next_remain_time_update += SEC_TO_MS(20); + next_remain_time_update += DWIN_REMAIN_TIME_UPDATE_INTERVAL; Draw_Print_ProgressRemain(); } } @@ -3602,6 +3678,7 @@ void EachMomentUpdate() { Draw_Status_Area(true); } #endif + DWIN_UpdateLCD(); } @@ -3642,7 +3719,7 @@ void DWIN_HandleScreen() { #if HAS_HEATED_BED case BedTemp: HMI_BedTemp(); break; #endif - #if HAS_PREHEAT + #if HAS_PREHEAT && HAS_FAN case FanSpeed: HMI_FanSpeed(); break; #endif case PrintSpeed: HMI_PrintSpeed(); break; diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 57f9873145..217127ed11 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -236,7 +236,7 @@ extern millis_t dwin_heat_time; typedef struct { TERN_(HAS_HOTEND, int16_t E_Temp = 0); TERN_(HAS_HEATED_BED, int16_t Bed_Temp = 0); - TERN_(HAS_PREHEAT, int16_t Fan_speed = 0); + TERN_(HAS_FAN, int16_t Fan_speed = 0); int16_t print_speed = 100; float Max_Feedspeed = 0; float Max_Acceleration = 0; @@ -270,10 +270,7 @@ typedef struct { #if HAS_LEVELING bool leveling_offset_flag:1; #endif - #if HAS_FAN - AxisEnum feedspeed_axis; - #endif - AxisEnum acc_axis, jerk_axis, step_axis; + AxisEnum feedspeed_axis, acc_axis, jerk_axis, step_axis; } HMI_Flag_t; extern HMI_value_t HMI_ValueStruct; diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 8b5b8562a2..88806bdb18 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -132,8 +132,12 @@ #define HEATER_0_PIN PA1 // HEATER1 #define HEATER_BED_PIN PA2 // HOT BED -#define FAN_PIN PA0 // FAN -#define FAN_SOFT_PWM +#ifndef FAN_PIN + #define FAN_PIN PA0 // FAN +#endif +#if PIN_EXISTS(FAN) + #define FAN_SOFT_PWM +#endif // // SD Card From 54f401506ba06ad9a8cc2cc26636865f05f29244 Mon Sep 17 00:00:00 2001 From: kpishere Date: Fri, 12 Feb 2021 05:42:31 -0500 Subject: [PATCH 1004/1370] Support SMART RAMPS 1.4 with Mega2560 (#21059) --- Marlin/src/pins/sam/pins_RAMPS_SMART.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h index 9b76ee290b..17dd32399a 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_SMART.h +++ b/Marlin/src/pins/sam/pins_RAMPS_SMART.h @@ -60,8 +60,8 @@ * (Search the web for "Arduino DUE Board Pinout" to see the correct header.) */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due' or 'Mega 2560' in 'Tools > Board.'" #endif #define BOARD_INFO_NAME "RAMPS-SMART" @@ -72,6 +72,18 @@ #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 +#define SDA_PIN 20 +#define SCL_PIN 21 + +// See EEPROM device datasheet for the following values. These are for 24xx256 +#define EEPROM_SERIAL_ADDR 0x50 // 7 bit i2c address (without R/W bit) +#define EEPROM_PAGE_SIZE 64 // page write buffer size +#define EEPROM_PAGE_WRITE_TIME 7 // page write time in milliseconds (docs say 5ms but that is too short) + +#define TWI_CLOCK_FREQ 400000 +#define EEPROM_ADDRSZ_BYTES TWI_MMR_IADRSZ_2_BYTE // TWI_MMR_IADRSZ_1_BYTE for 1 byte, or TWI_MMR_IADRSZ_2_BYTE for 2 byte +#define EEPROM_AVAILABLE EEPROM_I2C + #define RESET_PIN 42 // Resets the board if the jumper is attached // @@ -97,6 +109,7 @@ // // LCD / Controller // + // Support for AZSMZ 12864 LCD with SD Card 3D printer smart controller control panel #if ENABLED(AZSMZ_12864) #define BEEPER_PIN 66 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 65 From f740226a821cc17d075b537b76cd9c5cb7668e35 Mon Sep 17 00:00:00 2001 From: Jyers <76993396+Jyers@users.noreply.github.com> Date: Fri, 12 Feb 2021 05:55:06 -0500 Subject: [PATCH 1005/1370] Improved Ender 3 V2 display status area (#20983) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 145 +++++++++++++++++++++++------- 1 file changed, 111 insertions(+), 34 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 1f231954cc..d7af1208ad 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -138,6 +138,7 @@ #define MINUNITMULT pow(10, UNITFDIGITS) #define ENCODER_WAIT_MS 20 +#define DWIN_VAR_UPDATE_INTERVAL 1024 #define DWIN_SCROLL_UPDATE_INTERVAL SEC_TO_MS(2) #define DWIN_REMAIN_TIME_UPDATE_INTERVAL SEC_TO_MS(20) @@ -1581,6 +1582,41 @@ void HMI_StepXYZE() { } } +// Draw X, Y, Z and blink if in an un-homed or un-trusted state +void _update_axis_value(const AxisEnum axis, const uint16_t x, const uint16_t y, const bool blink, const bool force) { + const bool draw_qmark = axis_should_home(axis), + draw_empty = NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) && !draw_qmark && !axis_is_trusted(axis); + + // Check for a position change + static xyz_pos_t oldpos = { -1, -1, -1 }; + const float p = current_position[axis]; + const bool changed = oldpos[axis] != p; + if (changed) oldpos[axis] = p; + + if (force || changed || draw_qmark || draw_empty) { + if (blink && draw_qmark) + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, x, y, F("???.?")); + else if (blink && draw_empty) + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, x, y, F(" ")); + else + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, x, y, p * 10); + } +} + +void _draw_xyz_position(const bool force) { + //SERIAL_ECHOPGM("Draw XYZ:"); + static bool _blink = false; + const bool blink = !!(millis() & 0x400UL); + if (force || blink != _blink) { + _blink = blink; + //SERIAL_ECHOPGM(" (blink)"); + _update_axis_value(X_AXIS, 35, 459, blink, true); + _update_axis_value(Y_AXIS, 120, 459, blink, true); + _update_axis_value(Z_AXIS, 205, 459, blink, true); + } + //SERIAL_EOL(); +} + void update_variable() { #if HAS_HOTEND static float _hotendtemp = 0; @@ -1639,29 +1675,51 @@ void update_variable() { #if HAS_HOTEND if (_new_hotend_temp) - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, _hotendtemp); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 384, _hotendtemp); if (_new_hotend_target) - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, _hotendtarget); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, _hotendtarget); + + static int16_t _flow = planner.flow_percentage[0]; + if (_flow != planner.flow_percentage[0]) { + _flow = planner.flow_percentage[0]; + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 417, _flow); + } #endif #if HAS_HEATED_BED if (_new_bed_temp) - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, _bedtemp); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 417, _bedtemp); if (_new_bed_target) - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, _bedtarget); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, _bedtarget); #endif static int16_t _feedrate = 100; if (_feedrate != feedrate_percentage) { _feedrate = feedrate_percentage; - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, _feedrate); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 384, _feedrate); } - #if HAS_ZOFFSET_ITEM - if (last_zoffset != BABY_Z_VAR) { - last_zoffset = BABY_Z_VAR; - DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178 + STAT_CHR_W, 429, last_zoffset * 100); + + #if HAS_FAN + if (_fanspeed != thermalManager.fan_speed[0]) { + _fanspeed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 195 + 2 * STAT_CHR_W, 384, _fanspeed); } #endif + + static float _offset = 0; + if (BABY_Z_VAR != _offset) { + _offset = BABY_Z_VAR; + if (BABY_Z_VAR < 0) { + DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 2, 2, 207, 417, -_offset * 100); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, 205, 419, F("-")); + } + else { + DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 2, 2, 207, 417, _offset * 100); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, 205, 419, F(" ")); + } + } + + _draw_xyz_position(false); } /** @@ -1853,39 +1911,55 @@ void HMI_SDCardUpdate() { // void Draw_Status_Area(const bool with_update) { - // Clear the bottom area of the screen DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); - // - // Status Area - // #if HAS_HOTEND - DWIN_ICON_Show(ICON, ICON_HotendTemp, 13, 381); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); - #endif - #if HOTENDS > 1 - // DWIN_ICON_Show(ICON,ICON_HotendTemp, 13, 381); + DWIN_ICON_Show(ICON, ICON_HotendTemp, 10, 383); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 384, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.temp_hotend[0].target); + + DWIN_ICON_Show(ICON, ICON_StepE, 112, 417); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 417, planner.flow_percentage[0]); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 417, F("%")); #endif #if HAS_HEATED_BED - DWIN_ICON_Show(ICON, ICON_BedTemp, 158, 381); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, thermalManager.temp_bed.celsius); - DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); + DWIN_ICON_Show(ICON, ICON_BedTemp, 10, 416); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 417, thermalManager.temp_bed.celsius); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.temp_bed.target); #endif - DWIN_ICON_Show(ICON, ICON_Speed, 13, 429); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); - DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 33 + 5 * STAT_CHR_W + 2, 429, F("%")); + DWIN_ICON_Show(ICON, ICON_Speed, 113, 383); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 384, feedrate_percentage); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 384, F("%")); + + #if HAS_FAN + DWIN_ICON_Show(ICON, ICON_FanSpeed, 187, 383); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 195 + 2 * STAT_CHR_W, 384, thermalManager.fan_speed[0]); + #endif #if HAS_ZOFFSET_ITEM - DWIN_ICON_Show(ICON, ICON_Zoffset, 158, 428); - dwin_zoffset = BABY_Z_VAR; - DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178, 429, dwin_zoffset * 100); + DWIN_ICON_Show(ICON, ICON_Zoffset, 187, 416); #endif + if (BABY_Z_VAR < 0) { + DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 2, 2, 207, 417, -BABY_Z_VAR * 100); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, 205, 419, F("-")); + } + else { + DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 2, 2, 207, 417, BABY_Z_VAR * 100); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, 205, 419, F(" ")); + } + + DWIN_Draw_Rectangle(1, Line_Color, 0, 449, DWIN_WIDTH, 451); + + DWIN_ICON_Show(ICON, ICON_MaxSpeedX, 10, 456); + DWIN_ICON_Show(ICON, ICON_MaxSpeedY, 95, 456); + DWIN_ICON_Show(ICON, ICON_MaxSpeedZ, 180, 456); + _draw_xyz_position(true); + if (with_update) { DWIN_UpdateLCD(); delay(5); @@ -3546,14 +3620,17 @@ void DWIN_Update() { } void EachMomentUpdate() { - static millis_t next_rts_update_ms = 0; + static millis_t next_var_update_ms = 0, next_rts_update_ms = 0; + const millis_t ms = millis(); + if (ELAPSED(ms, next_var_update_ms)) { + next_var_update_ms = ms + DWIN_VAR_UPDATE_INTERVAL; + update_variable(); + } + if (PENDING(ms, next_rts_update_ms)) return; next_rts_update_ms = ms + DWIN_SCROLL_UPDATE_INTERVAL; - // variable update - update_variable(); - if (checkkey == PrintProcess) { // if print done if (HMI_flag.print_finish && !HMI_flag.done_confirm_flag) { From c0d1fd14f8f634caff5ee80e27711f0d98db85f1 Mon Sep 17 00:00:00 2001 From: kpishere Date: Fri, 12 Feb 2021 06:00:41 -0500 Subject: [PATCH 1006/1370] Fix AZSMZ_12864 on SMART RAMPS (#21056) --- Marlin/src/pins/ramps/pins_RAMPS.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 5bcd877dcd..3f22d2a539 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -307,6 +307,9 @@ * * Hardware serial communication ports. * If undefined software serial is used according to the pins below + * + * Serial2 -- AUX-4 Pin 18 (D16 TX2) and AUX-4 Pin 17 (D17 RX2) + * Serial1 -- Pins D18 and D19 are used for Z-MIN and Z-MAX */ //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 @@ -690,7 +693,9 @@ #elif ENABLED(AZSMZ_12864) // Pins only defined for RAMPS_SMART currently - #error "No pins defined for RAMPS with AZSMZ_12864." + #if DISABLED(IS_RAMPS_SMART) + #error "No pins defined for RAMPS with AZSMZ_12864." + #endif #elif IS_TFTGLCD_PANEL From 4316522146bd761e1ddc3a77972f615c2c37fd9c Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Fri, 12 Feb 2021 14:49:07 +0100 Subject: [PATCH 1007/1370] Improve Delay test report (#21047) --- Marlin/src/HAL/shared/Delay.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Marlin/src/HAL/shared/Delay.cpp b/Marlin/src/HAL/shared/Delay.cpp index 1ae1b3e381..8ff5a88c63 100644 --- a/Marlin/src/HAL/shared/Delay.cpp +++ b/Marlin/src/HAL/shared/Delay.cpp @@ -106,12 +106,14 @@ } #if ENABLED(MARLIN_DEV_MODE) - void dump_delay_accuracy_check() - { - auto report_call_time = [](PGM_P const name, const uint32_t cycles, const uint32_t total, const bool do_flush=true) { + void dump_delay_accuracy_check() { + auto report_call_time = [](PGM_P const name, PGM_P const unit, const uint32_t cycles, const uint32_t total, const bool do_flush=true) { SERIAL_ECHOPGM("Calling "); serialprintPGM(name); - SERIAL_ECHOLNPAIR(" for ", cycles, "cycles took: ", total, "cycles"); + SERIAL_ECHOLNPAIR(" for ", cycles); + serialprintPGM(unit); + SERIAL_ECHOLNPAIR(" took: ", total); + serialprintPGM(unit); if (do_flush) SERIAL_FLUSH(); }; @@ -123,41 +125,41 @@ constexpr uint32_t testValues[] = { 1, 5, 10, 20, 50, 100, 150, 200, 350, 500, 750, 1000 }; for (auto i : testValues) { s = micros(); DELAY_US(i); e = micros(); - report_call_time(PSTR("delay"), i, e - s); + report_call_time(PSTR("delay"), PSTR("us"), i, e - s); } if (HW_REG(_DWT_CTRL)) { for (auto i : testValues) { s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(i); e = HW_REG(_DWT_CYCCNT); - report_call_time(PSTR("delay"), i, e - s); + report_call_time(PSTR("runtime delay"), PSTR("cycles"), i, e - s); } // Measure the delay to call a real function compared to a function pointer s = HW_REG(_DWT_CYCCNT); delay_dwt(1); e = HW_REG(_DWT_CYCCNT); - report_call_time(PSTR("delay_dwt"), 1, e - s); + report_call_time(PSTR("delay_dwt"), PSTR("cycles"), 1, e - s); static PGMSTR(dcd, "DELAY_CYCLES directly "); s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES( 1); e = HW_REG(_DWT_CYCCNT); - report_call_time(dcd, 1, e - s, false); + report_call_time(dcd, PSTR("cycles"), 1, e - s, false); s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES( 5); e = HW_REG(_DWT_CYCCNT); - report_call_time(dcd, 5, e - s, false); + report_call_time(dcd, PSTR("cycles"), 5, e - s, false); s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(10); e = HW_REG(_DWT_CYCCNT); - report_call_time(dcd, 10, e - s, false); + report_call_time(dcd, PSTR("cycles"), 10, e - s, false); s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(20); e = HW_REG(_DWT_CYCCNT); - report_call_time(dcd, 20, e - s, false); + report_call_time(dcd, PSTR("cycles"), 20, e - s, false); s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(50); e = HW_REG(_DWT_CYCCNT); - report_call_time(dcd, 50, e - s, false); + report_call_time(dcd, PSTR("cycles"), 50, e - s, false); s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(100); e = HW_REG(_DWT_CYCCNT); - report_call_time(dcd, 100, e - s, false); + report_call_time(dcd, PSTR("cycles"), 100, e - s, false); s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(200); e = HW_REG(_DWT_CYCCNT); - report_call_time(dcd, 200, e - s, false); + report_call_time(dcd, PSTR("cycles"), 200, e - s, false); } } #endif // MARLIN_DEV_MODE From 92b5f06bf9b8d0af7680b8489c201d0d422ff2d8 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Fri, 12 Feb 2021 15:33:27 +0100 Subject: [PATCH 1008/1370] Use -g3 to include macros in debug symbols (#21052) --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 9239ace72c..c138a4a48c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -212,7 +212,7 @@ extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py -build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-constants +build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = # From 8bca8e5ba03f34cdf8a3a98a0f0fb614013d749f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Feb 2021 19:33:19 -0600 Subject: [PATCH 1009/1370] Minor serial code cleanup --- Marlin/src/HAL/AVR/MarlinSerial.cpp | 2 +- Marlin/src/core/serial.h | 3 +++ Marlin/src/core/serial_base.h | 12 ++++++------ Marlin/src/gcode/host/M118.cpp | 6 +----- Marlin/src/libs/autoreport.h | 3 ++- docs/Serial.md | 7 +++---- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 562a70ced7..81503e1fe9 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -566,7 +566,7 @@ ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) { MarlinSerial>::_tx_udr_empty_irq(); } -// Because of the template definition above, it's required to instantiate the template to have all method generated +// Because of the template definition above, it's required to instantiate the template to have all methods generated template class MarlinSerial< MarlinSerialCfg >; MSerialT customizedSerial1(MSerialT::HasEmergencyParser); diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index c422f8e25b..0fe8435789 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -62,6 +62,7 @@ typedef int8_t serial_index_t; #define SERIAL_ALL 0x7F #if HAS_MULTI_SERIAL #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) + #define _PORT_RESTORE(n,p) RESTORE(n) #define SERIAL_ASSERT(P) if(multiSerial.portMask!=(P)){ debugger(); } #ifdef SERIAL_CATCHALL typedef MultiSerial SerialOutputT; @@ -72,6 +73,7 @@ typedef int8_t serial_index_t; #define SERIAL_IMPL multiSerial #else #define _PORT_REDIRECT(n,p) NOOP + #define _PORT_RESTORE(n) NOOP #define SERIAL_ASSERT(P) NOOP #define SERIAL_IMPL MYSERIAL0 #endif @@ -79,6 +81,7 @@ typedef int8_t serial_index_t; #define SERIAL_OUT(WHAT, V...) (void)SERIAL_IMPL.WHAT(V) #define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) +#define PORT_RESTORE() _PORT_RESTORE(1) #define SERIAL_PORTMASK(P) _BV(P) // diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 81403b55f2..83b03cc7b6 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -29,7 +29,7 @@ #endif // flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. -CALL_IF_EXISTS_IMPL(void, flushTX ); +CALL_IF_EXISTS_IMPL(void, flushTX); CALL_IF_EXISTS_IMPL(bool, connected, true); // In order to catch usage errors in code, we make the base to encode number explicit @@ -42,14 +42,14 @@ enum class PrintBase { Bin = 2 }; -// A simple forward struct that prevent the compiler to select print(double, int) as a default overload for any type different than +// A simple forward struct that prevent the compiler to select print(double, int) as a default overload for any type different than // double or float. For double or float, a conversion exists so the call will be transparent struct EnsureDouble { double a; FORCE_INLINE operator double() { return a; } // If the compiler breaks on ambiguity here, it's likely because you're calling print(X, base) with X not a double or a float, and a // base that's not one of PrintBase's value. This exact code is made to detect such error, you NEED to set a base explicitely like this: - // SERIAL_PRINT(v, PrintBase::Hex) + // SERIAL_PRINT(v, PrintBase::Hex) FORCE_INLINE EnsureDouble(double a) : a(a) {} FORCE_INLINE EnsureDouble(float a) : a(a) {} }; @@ -147,13 +147,13 @@ struct SerialBase { else write('0'); } void printNumber(signed long n, const uint8_t base) { - if (base == 10 && n < 0) { + if (base == 10 && n < 0) { n = -n; // This works because all platforms Marlin's builds on are using 2-complement encoding for negative number // On such CPU, changing the sign of a number is done by inverting the bits and adding one, so if n = 0x80000000 = -2147483648 then // -n = 0x7FFFFFFF + 1 => 0x80000000 = 2147483648 (if interpreted as unsigned) or -2147483648 if interpreted as signed. // On non 2-complement CPU, there would be no possible representation for 2147483648. - write('-'); - } + write('-'); + } printNumber((unsigned long)n , base); } diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 73115d5c0a..ef3c293742 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -53,14 +53,10 @@ void GcodeSuite::M118() { } #if HAS_MULTI_SERIAL - const int8_t old_serial = multiSerial.portMask; - if (WITHIN(port, 0, NUM_SERIAL)) - multiSerial.portMask = port ? _BV(port - 1) : SERIAL_ALL; + PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? _BV(port - 1) : SERIAL_ALL) : multiSerial.portMask); #endif if (hasE) SERIAL_ECHO_START(); if (hasA) SERIAL_ECHOPGM("//"); SERIAL_ECHOLN(p); - - TERN_(HAS_MULTI_SERIAL, multiSerial.portMask = old_serial); } diff --git a/Marlin/src/libs/autoreport.h b/Marlin/src/libs/autoreport.h index 2c0a043fbf..232216578f 100644 --- a/Marlin/src/libs/autoreport.h +++ b/Marlin/src/libs/autoreport.h @@ -42,8 +42,9 @@ struct AutoReporter { const millis_t ms = millis(); if (ELAPSED(ms, next_report_ms)) { next_report_ms = ms + SEC_TO_MS(report_interval); - TERN_(HAS_MULTI_SERIAL, PORT_REDIRECT(report_port_mask)); + PORT_REDIRECT(report_port_mask); Helper::report(); + //PORT_RESTORE(); } } }; diff --git a/docs/Serial.md b/docs/Serial.md index 948e07b448..0db8175b3d 100644 --- a/docs/Serial.md +++ b/docs/Serial.md @@ -1,11 +1,10 @@ # Serial port architecture in Marlin -Marlin is targeting a pletora of different CPU architecture and platforms. Each of these platforms has its own serial interface. +Marlin is targeting a plethora of different CPU architecture and platforms. Each of these platforms has its own serial interface. While many provide a Arduino-like Serial class, it's not all of them, and the differences in the existing API create a very complex brain teaser for writing code that works more or less on each platform. Moreover, many platform have intrinsic needs about serial port (like forwarding the output on multiple serial port, providing a *serial-like* telnet server, mixing USB-based serial port with SD card emulation) that are difficult to handle cleanly in the other platform serial logic. - Starting with version `2.0.9`, Marlin provides a common interface for its serial needs. ## Common interface @@ -16,7 +15,7 @@ Any implementation will need to follow this interface for being used transparent The implementation was written to prioritize performance over abstraction, so the base interface is not using virtual inheritance to avoid the cost of virtual dispatching while calling methods. Instead, the Curiously Recurring Template Pattern (**CRTP**) is used so that, upon compilation, the interface abstraction does not incur a performance cost. -Because some platform do not follow the same interface, the missing method in the actual low-level implementation are detected via SFINAE and a wrapper is generated when such method are missing. See `CALL_IF_EXISTS` macro in `Marlin/src/core/macros.h` for the documentation of this technic. +Because some platform do not follow the same interface, the missing method in the actual low-level implementation are detected via SFINAE and a wrapper is generated when such method are missing. See the `CALL_IF_EXISTS` macro in `Marlin/src/core/macros.h` for documentation of this technique. ## Composing the desired feature The different specificities for each architecture are provided by composing the serial type based on desired functionality. @@ -32,7 +31,7 @@ Since all the types above are using CRTP, it's possible to combine them to get t This is easily done via type definition of the feature. For example, to present a serial interface that's outputting to 2 serial port, the first one being hooked at runtime and the second one connected to a runtime switchable telnet client, you'll declare the type to use as: -``` +```cpp typedef MultiSerial< RuntimeSerial, ConditionalSerial > Serial0Type; ``` From b95e60dbbd416745a69d6392737e31f5a9a06b4d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 13 Feb 2021 19:05:28 -0600 Subject: [PATCH 1010/1370] Update helpful links --- Marlin/Configuration.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index b28eb72cb0..428e899b33 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -42,15 +42,19 @@ //=========================================================================== /** - * Here are some standard links for getting your machine calibrated: + * Here are some useful links to help get your machine configured and calibrated: * - * https://reprap.org/wiki/Calibration - * https://youtu.be/wAL9d7FgInk - * http://calculator.josefprusa.cz - * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide - * https://www.thingiverse.com/thing:5573 - * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap - * https://www.thingiverse.com/thing:298812 + * Example Configs: https://github.com/MarlinFirmware/Configurations/branches/all + * + * Průša Calculator: https://blog.prusaprinters.org/calculator_3416/ + * + * Calibration Guides: https://reprap.org/wiki/Calibration + * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * https://youtu.be/wAL9d7FgInk + * + * Calibration Objects: https://www.thingiverse.com/thing:5573 + * https://www.thingiverse.com/thing:1278865 */ //=========================================================================== From 69fcd9210fb5d6c64e756f71a92be5a9c4df27db Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 13 Feb 2021 19:06:55 -0600 Subject: [PATCH 1011/1370] Allow mftest -t to select by number --- buildroot/share/git/mftest | 53 +++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/buildroot/share/git/mftest b/buildroot/share/git/mftest index 11d0ac3881..661566a88d 100755 --- a/buildroot/share/git/mftest +++ b/buildroot/share/git/mftest @@ -111,27 +111,28 @@ if ((REBUILD)); then fi case $TESTENV in - tree) pio run -d . -e include_tree ; exit 1 ;; - due) TESTENV='DUE' ;; - esp) TESTENV='esp32' ;; - lin*) TESTENV='linux_native' ;; -lpc?(8)) TESTENV='LPC1768' ;; - lpc9) TESTENV='LPC1769' ;; - m128) TESTENV='mega1280' ;; - m256) TESTENV='mega2560' ;; - mega) TESTENV='mega2560' ;; - stm) TESTENV='STM32F103RE' ;; - f1) TESTENV='STM32F103RE' ;; - f4) TESTENV='STM32F4' ;; - f7) TESTENV='STM32F7' ;; - s6) TESTENV='FYSETC_S6' ;; - teensy) TESTENV='teensy31' ;; - t31) TESTENV='teensy31' ;; - t32) TESTENV='teensy31' ;; - t35) TESTENV='teensy35' ;; - t36) TESTENV='teensy35' ;; - t40) TESTENV='teensy41' ;; - t41) TESTENV='teensy41' ;; + tree) pio run -d . -e include_tree ; exit 1 ;; + due) TESTENV='DUE' ;; + esp) TESTENV='esp32' ;; + lin*) TESTENV='linux_native' ;; +lp8|lpc8) TESTENV='LPC1768' ;; +lp9|lpc9) TESTENV='LPC1769' ;; + m128) TESTENV='mega1280' ;; + m256) TESTENV='mega2560' ;; + mega) TESTENV='mega2560' ;; + stm) TESTENV='STM32F103RE' ;; + f1) TESTENV='STM32F103RE' ;; + f4) TESTENV='STM32F4' ;; + f7) TESTENV='STM32F7' ;; + s6) TESTENV='FYSETC_S6' ;; + teensy) TESTENV='teensy31' ;; + t31) TESTENV='teensy31' ;; + t32) TESTENV='teensy31' ;; + t35) TESTENV='teensy35' ;; + t36) TESTENV='teensy35' ;; + t40) TESTENV='teensy41' ;; + t41) TESTENV='teensy41' ;; +[1-9][1-9]|[1-9]) TESTNUM=$TESTENV ; TESTENV=- ;; esac if ((AUTO_BUILD)); then @@ -217,8 +218,14 @@ if [[ $TESTENV == '-' ]]; then echo for (( ; ; )) do - read -p "Select a test to apply (1-$IND) : " NAMEIND - [[ -z "$NAMEIND" ]] && { errout "(canceled)" ; exit 1 ; } + if [[ $TESTNUM -gt 0 ]]; then + NAMEIND=$TESTNUM + else + read -p "Select a test to apply (1-$IND) : " NAMEIND + fi + [[ -z $NAMEIND ]] && { errout "(canceled)" ; exit 1 ; } + TESTENV=${NAMES[$NAMEIND-1]} + [[ $TESTNUM -gt 0 ]] && { echo "Preselected test $TESTNUM ... ($TESTENV)" ; TESTNUM='' ; } [[ $NAMEIND =~ $ISNUM ]] && ((NAMEIND >= 1 && NAMEIND <= IND)) && { TESTENV=${NAMES[$NAMEIND-1]} ; echo ; break ; } errout "Invalid selection." done From 8ec86b810d96e1692efa8253714957d3f95ae313 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sun, 14 Feb 2021 04:04:22 +0100 Subject: [PATCH 1012/1370] Don't create unused Serial Port instances (#21066) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/DUE/HAL.cpp | 19 +++++++++++++------ Marlin/src/HAL/DUE/HAL.h | 4 ++-- Marlin/src/HAL/SAMD51/HAL.cpp | 17 +++++++++++++++-- Marlin/src/HAL/SAMD51/HAL.h | 8 +++++++- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index 2ae70843f0..c15adee0c7 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -102,11 +102,18 @@ uint16_t HAL_adc_get_result() { return HAL_adc_result; } -// Forward the default serial port -DefaultSerial MSerial(false, Serial); - -DefaultSerial1 MSerial1(false, Serial1); -DefaultSerial2 MSerial2(false, Serial2); -DefaultSerial3 MSerial3(false, Serial3); +// Forward the default serial ports +#if ANY_SERIAL_IS(0) + DefaultSerial MSerial(false, Serial); +#endif +#if ANY_SERIAL_IS(1) + DefaultSerial1 MSerial1(false, Serial1); +#endif +#if ANY_SERIAL_IS(2) + DefaultSerial2 MSerial2(false, Serial2); +#endif +#if ANY_SERIAL_IS(3) + DefaultSerial3 MSerial3(false, Serial3); +#endif #endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 78c8a800b9..b1c6a38c0f 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -37,12 +37,12 @@ #include #include "../../core/serial_hook.h" -typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; -extern DefaultSerial MSerial; +typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; typedef ForwardSerial0Type< decltype(Serial1) > DefaultSerial1; typedef ForwardSerial0Type< decltype(Serial2) > DefaultSerial2; typedef ForwardSerial0Type< decltype(Serial3) > DefaultSerial3; +extern DefaultSerial MSerial; extern DefaultSerial1 MSerial1; extern DefaultSerial2 MSerial2; extern DefaultSerial3 MSerial3; diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index a413c4cd80..17e89c723f 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -25,8 +25,21 @@ #include #ifdef ADAFRUIT_GRAND_CENTRAL_M4 - DefaultSerial MSerial(false, Serial); - DefaultSerial1 MSerial1(false, Serial1); + #if ANY_SERIAL_IS(-1) + DefaultSerial MSerial(false, Serial); + #endif + #if ANY_SERIAL_IS(0) + DefaultSerial1 MSerial1(false, Serial1); + #endif + #if ANY_SERIAL_IS(1) + DefaultSerial2 MSerial2(false, Serial2); + #endif + #if ANY_SERIAL_IS(2) + DefaultSerial3 MSerial3(false, Serial3); + #endif + #if ANY_SERIAL_IS(3) + DefaultSerial4 MSerial4(false, Serial4); + #endif #endif // ------------------------ diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index f28583c771..7b272af842 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -33,9 +33,15 @@ // Serial ports typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; - extern DefaultSerial MSerial; typedef ForwardSerial0Type< decltype(Serial1) > DefaultSerial1; + typedef ForwardSerial0Type< decltype(Serial2) > DefaultSerial2; + typedef ForwardSerial0Type< decltype(Serial3) > DefaultSerial3; + typedef ForwardSerial0Type< decltype(Serial4) > DefaultSerial4; + extern DefaultSerial MSerial; extern DefaultSerial1 MSerial1; + extern DefaultSerial2 MSerial2; + extern DefaultSerial3 MSerial3; + extern DefaultSerial4 MSerial4; // MYSERIAL0 required before MarlinSerial includes! From 9c47a9256d6bf8962eae778705276378e48452b5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 13 Feb 2021 21:50:19 -0600 Subject: [PATCH 1013/1370] Coolant Control sanity-checks --- Marlin/src/inc/SanityCheck.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2ff5293de2..d5d94b178e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3239,6 +3239,12 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #undef _PIN_CONFLICT #endif +#if ENABLED(COOLANT_MIST) && !PIN_EXISTS(COOLANT_MIST) + #error "COOLANT_MIST requires COOLANT_MIST_PIN to be defined." +#elif ENABLED(COOLANT_FLOOD) && !PIN_EXISTS(COOLANT_FLOOD) + #error "COOLANT_FLOOD requires COOLANT_FLOOD_PIN to be defined." +#endif + #if NONE(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI) && ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD." #endif From f31a8f40864b9eccd2798c12741942f418cf130a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 13 Feb 2021 21:51:26 -0600 Subject: [PATCH 1014/1370] anet_et4_openblt.py => openblt.py --- buildroot/share/PlatformIO/scripts/generic_create_variant.py | 3 +++ .../PlatformIO/scripts/{anet_et4_openblt.py => openblt.py} | 0 platformio.ini | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) rename buildroot/share/PlatformIO/scripts/{anet_et4_openblt.py => openblt.py} (100%) diff --git a/buildroot/share/PlatformIO/scripts/generic_create_variant.py b/buildroot/share/PlatformIO/scripts/generic_create_variant.py index 0b82c69f5a..aa79d39b51 100644 --- a/buildroot/share/PlatformIO/scripts/generic_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/generic_create_variant.py @@ -1,3 +1,6 @@ +# +# Generate a generic variant +# import os,shutil from SCons.Script import DefaultEnvironment from platformio import util diff --git a/buildroot/share/PlatformIO/scripts/anet_et4_openblt.py b/buildroot/share/PlatformIO/scripts/openblt.py similarity index 100% rename from buildroot/share/PlatformIO/scripts/anet_et4_openblt.py rename to buildroot/share/PlatformIO/scripts/openblt.py diff --git a/platformio.ini b/platformio.ini index c138a4a48c..63933183a4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1280,7 +1280,7 @@ board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx board_build.ldscript = ldscript.ld board_build.firmware = firmware.srec -# Just anet_et4_openblt.py generates the file, not stm32_bootloader.py +# Just openblt.py (not stm32_bootloader.py) generates the file board_build.encrypt = Yes board_build.offset = 0x10000 board_upload.offset_address = 0x08010000 @@ -1290,7 +1290,7 @@ upload_protocol = jlink extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/anet_et4_openblt.py + buildroot/share/PlatformIO/scripts/openblt.py # # BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) From ba4ce638583489e003f1d6cfb9129d7610af3ddc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 14 Feb 2021 16:25:28 -0600 Subject: [PATCH 1015/1370] Fix a board comment --- Marlin/src/core/boards.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 0f076b1b2a..5a1df8bfa4 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -327,7 +327,7 @@ #define BOARD_LONGER3D_LK 4034 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 #define BOARD_CCROBOT_MEEB_3DP 4035 // ccrobot-online.com MEEB_3DP (STM32F103RC) #define BOARD_CHITU3D_V5 4036 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CHITU3D_V6 4037 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CHITU3D_V6 4037 // Chitu3D TronXY X5SA V6 Board #define BOARD_CREALITY_V4 4038 // Creality v4.x (STM32F103RE) #define BOARD_CREALITY_V427 4039 // Creality v4.2.7 (STM32F103RE) #define BOARD_CREALITY_V4210 4040 // Creality v4.2.10 (STM32F103RE) as found in the CR-30 From ca79af7a46a317f3ee7821889e8f12568f2ade13 Mon Sep 17 00:00:00 2001 From: InsanityAutomation Date: Wed, 10 Feb 2021 07:34:37 -0500 Subject: [PATCH 1016/1370] Use configuration website, fix edit color --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index d7af1208ad..367e86232c 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -88,11 +88,8 @@ #ifndef MACHINE_SIZE #define MACHINE_SIZE STRINGIFY(X_BED_SIZE) "x" STRINGIFY(Y_BED_SIZE) "x" STRINGIFY(Z_MAX_POS) #endif -#ifndef CORP_WEBSITE_C - #define CORP_WEBSITE_C "www.cxsw3d.com" -#endif -#ifndef CORP_WEBSITE_E - #define CORP_WEBSITE_E "www.creality.com" +#ifndef CORP_WEBSITE + #define CORP_WEBSITE WEBSITE_URL #endif #define PAUSE_HEAT @@ -1232,7 +1229,7 @@ void HMI_Move_X() { } LIMIT(HMI_ValueStruct.Move_X_scaled, (X_MIN_POS) * MINUNITMULT, (X_MAX_POS) * MINUNITMULT); current_position.x = HMI_ValueStruct.Move_X_scaled / MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(1), HMI_ValueStruct.Move_X_scaled); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(1), HMI_ValueStruct.Move_X_scaled); DWIN_UpdateLCD(); } } @@ -1254,7 +1251,7 @@ void HMI_Move_Y() { } LIMIT(HMI_ValueStruct.Move_Y_scaled, (Y_MIN_POS) * MINUNITMULT, (Y_MAX_POS) * MINUNITMULT); current_position.y = HMI_ValueStruct.Move_Y_scaled / MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(2), HMI_ValueStruct.Move_Y_scaled); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(2), HMI_ValueStruct.Move_Y_scaled); DWIN_UpdateLCD(); } } @@ -1276,7 +1273,7 @@ void HMI_Move_Z() { } LIMIT(HMI_ValueStruct.Move_Z_scaled, Z_MIN_POS * MINUNITMULT, Z_MAX_POS * MINUNITMULT); current_position.z = HMI_ValueStruct.Move_Z_scaled / MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scaled); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scaled); DWIN_UpdateLCD(); } } @@ -1304,7 +1301,7 @@ void HMI_Move_Z() { else if ((last_E_scaled - HMI_ValueStruct.Move_E_scaled) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) HMI_ValueStruct.Move_E_scaled = last_E_scaled - (EXTRUDE_MAXLENGTH) * MINUNITMULT; current_position.e = HMI_ValueStruct.Move_E_scaled / MINUNITMULT; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scaled); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scaled); DWIN_UpdateLCD(); } } @@ -1983,7 +1980,6 @@ void Draw_Info_Menu() { DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); DWIN_Frame_AreaCopy(1, 1, 164, 56, 176, 108, 175); DWIN_Frame_AreaCopy(1, 58, 164, 113, 176, 105, 248); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, F(CORP_WEBSITE_C)); } else { #ifdef USE_STRING_HEADINGS @@ -1995,8 +1991,8 @@ void Draw_Info_Menu() { DWIN_Frame_AreaCopy(1, 120, 150, 146, 161, 124, 102); DWIN_Frame_AreaCopy(1, 146, 151, 254, 161, 82, 175); DWIN_Frame_AreaCopy(1, 0, 165, 94, 175, 89, 248); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_E) * MENU_CHR_W) / 2, 268, F(CORP_WEBSITE_E)); } + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE) * MENU_CHR_W) / 2, 268, F(CORP_WEBSITE)); Draw_Back_First(); LOOP_L_N(i, 3) { From 10da0f92a038c9f31d683919784a5f1b281137e6 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sun, 14 Feb 2021 17:45:36 -0500 Subject: [PATCH 1017/1370] E3V2 DWIN live movement (#21035) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 78 +++++++++++-------------------- 1 file changed, 28 insertions(+), 50 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 367e86232c..5e7c1ef4c7 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1212,69 +1212,57 @@ inline ENCODER_DiffState get_encoder_state() { return state; } +void HMI_Plan_Move(const feedRate_t fr_mm_s) { + if (!planner.is_full()) { + planner.synchronize(); + planner.buffer_line(current_position, fr_mm_s, active_extruder); + DWIN_UpdateLCD(); + } +} + +void HMI_Move_Done(const AxisEnum axis) { + EncoderRate.enabled = false; + planner.synchronize(); + checkkey = AxisMove; + DWIN_UpdateLCD(); +} + void HMI_Move_X() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_X_scaled)) { - checkkey = AxisMove; - EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scaled); - if (!planner.is_full()) { - // Wait for planner moves to finish! - planner.synchronize(); - planner.buffer_line(current_position, homing_feedrate(X_AXIS), active_extruder); - } - DWIN_UpdateLCD(); - return; - } + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_X_scaled)) + return HMI_Move_Done(X_AXIS); LIMIT(HMI_ValueStruct.Move_X_scaled, (X_MIN_POS) * MINUNITMULT, (X_MAX_POS) * MINUNITMULT); current_position.x = HMI_ValueStruct.Move_X_scaled / MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(1), HMI_ValueStruct.Move_X_scaled); DWIN_UpdateLCD(); + HMI_Plan_Move(homing_feedrate(X_AXIS)); } } void HMI_Move_Y() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Y_scaled)) { - checkkey = AxisMove; - EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scaled); - if (!planner.is_full()) { - // Wait for planner moves to finish! - planner.synchronize(); - planner.buffer_line(current_position, homing_feedrate(Y_AXIS), active_extruder); - } - DWIN_UpdateLCD(); - return; - } + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Y_scaled)) + return HMI_Move_Done(Y_AXIS); LIMIT(HMI_ValueStruct.Move_Y_scaled, (Y_MIN_POS) * MINUNITMULT, (Y_MAX_POS) * MINUNITMULT); current_position.y = HMI_ValueStruct.Move_Y_scaled / MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(2), HMI_ValueStruct.Move_Y_scaled); DWIN_UpdateLCD(); + HMI_Plan_Move(homing_feedrate(Y_AXIS)); } } void HMI_Move_Z() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scaled)) { - checkkey = AxisMove; - EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scaled); - if (!planner.is_full()) { - // Wait for planner moves to finish! - planner.synchronize(); - planner.buffer_line(current_position, homing_feedrate(Z_AXIS), active_extruder); - } - DWIN_UpdateLCD(); - return; - } - LIMIT(HMI_ValueStruct.Move_Z_scaled, Z_MIN_POS * MINUNITMULT, Z_MAX_POS * MINUNITMULT); + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scaled)) + return HMI_Move_Done(Z_AXIS); + LIMIT(HMI_ValueStruct.Move_Z_scaled, (Z_MIN_POS) * MINUNITMULT, (Z_MAX_POS) * MINUNITMULT); current_position.z = HMI_ValueStruct.Move_Z_scaled / MINUNITMULT; DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(3), HMI_ValueStruct.Move_Z_scaled); DWIN_UpdateLCD(); + HMI_Plan_Move(homing_feedrate(Z_AXIS)); } } @@ -1285,24 +1273,14 @@ void HMI_Move_Z() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_E_scaled)) { - checkkey = AxisMove; - EncoderRate.enabled = false; last_E_scaled = HMI_ValueStruct.Move_E_scaled; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scaled); - if (!planner.is_full()) { - planner.synchronize(); // Wait for planner moves to finish! - planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); - } - DWIN_UpdateLCD(); - return; + return HMI_Move_Done(E_AXIS); } - if ((HMI_ValueStruct.Move_E_scaled - last_E_scaled) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scaled = last_E_scaled + (EXTRUDE_MAXLENGTH) * MINUNITMULT; - else if ((last_E_scaled - HMI_ValueStruct.Move_E_scaled) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scaled = last_E_scaled - (EXTRUDE_MAXLENGTH) * MINUNITMULT; + LIMIT(HMI_ValueStruct.Move_E_scaled, last_E_scaled - (EXTRUDE_MAXLENGTH) * MINUNITMULT, last_E_scaled + (EXTRUDE_MAXLENGTH) * MINUNITMULT); current_position.e = HMI_ValueStruct.Move_E_scaled / MINUNITMULT; DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, UNITFDIGITS, 216, MBASE(4), HMI_ValueStruct.Move_E_scaled); DWIN_UpdateLCD(); + HMI_Plan_Move(MMM_TO_MMS(FEEDRATE_E)); } } From 8a35c9a1a0c8b61e1e1c81188a3980d784d92e5c Mon Sep 17 00:00:00 2001 From: Steven Haigh Date: Mon, 15 Feb 2021 11:21:47 +1100 Subject: [PATCH 1018/1370] E3V2 Status Area followup (#21072) --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 5e7c1ef4c7..e046bb90f5 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1675,7 +1675,7 @@ void update_variable() { } #if HAS_FAN - if (_fanspeed != thermalManager.fan_speed[0]) { + if (_new_fanspeed) { _fanspeed = thermalManager.fan_speed[0]; DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 195 + 2 * STAT_CHR_W, 384, _fanspeed); } From ead41ac4910c1ea85a00a2f2bd0c1de57111239a Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 15 Feb 2021 23:42:33 +1300 Subject: [PATCH 1019/1370] Fix remaining time divide-by-zero (#21080) --- Marlin/src/lcd/marlinui.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 2e55c9ad1d..1c9e80c75e 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -248,7 +248,7 @@ public: static inline uint32_t _calculated_remaining_time() { const duration_t elapsed = print_job_timer.duration(); const progress_t progress = _get_progress(); - return elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + return progress ? elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress : 0; } #if ENABLED(USE_M73_REMAINING_TIME) static uint32_t remaining_time; From 38838538175f362c7969d00a6d1e9fcb5d0d7395 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 15 Feb 2021 11:45:38 +0100 Subject: [PATCH 1020/1370] Fix MMU2 compile error (#21065) --- Marlin/src/feature/mmu/mmu2.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index 1aa53ef5eb..7c3ab05851 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -287,9 +287,7 @@ void MMU2::mmu_loop() { else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) { // filament type int filament = cmd - MMU_CMD_F0; - DEBUG_ECHOPAIR("MMU <= F", filament, " "); - DEBUG_ECHO_F(cmd_arg, DEC); - DEBUG_EOL(); + DEBUG_ECHOLNPAIR("MMU <= F", filament, " ", cmd_arg); tx_printf_P(PSTR("F%d %d\n"), filament, cmd_arg); state = 3; // wait for response } From adbe1522566508e84a8ecf2b219c224da784e42b Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 16 Feb 2021 00:15:08 +1300 Subject: [PATCH 1021/1370] EXP headers for RAMPS 1.x (#21054) Co-authored-by: Scott Lahteine --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 124 +++++----- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 172 +++++++------- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 46 ++-- .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 56 ++--- Marlin/src/pins/ramps/pins_RAMPS.h | 216 ++++++++++-------- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 132 +++++------ .../pins/stm32f4/pins_FYSETC_CHEETAH_V20.h | 90 ++++---- 7 files changed, 436 insertions(+), 400 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index db9f85c742..89f0e17832 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -197,23 +197,23 @@ * EXP2 EXP1 */ -#define EXPA1_03_PIN P1_23 -#define EXPA1_04_PIN P1_22 -#define EXPA1_05_PIN P1_21 -#define EXPA1_06_PIN P1_20 -#define EXPA1_07_PIN P1_19 -#define EXPA1_08_PIN P1_18 -#define EXPA1_09_PIN P0_28 -#define EXPA1_10_PIN P1_30 +#define EXP1_03_PIN P1_23 +#define EXP1_04_PIN P1_22 +#define EXP1_05_PIN P1_21 +#define EXP1_06_PIN P1_20 +#define EXP1_07_PIN P1_19 +#define EXP1_08_PIN P1_18 +#define EXP1_09_PIN P0_28 +#define EXP1_10_PIN P1_30 -#define EXPA2_03_PIN -1 -#define EXPA2_04_PIN P1_31 -#define EXPA2_05_PIN P0_18 -#define EXPA2_06_PIN P3_25 -#define EXPA2_07_PIN P0_16 -#define EXPA2_08_PIN P3_26 -#define EXPA2_09_PIN P0_15 -#define EXPA2_10_PIN P0_17 +#define EXP2_03_PIN -1 +#define EXP2_04_PIN P1_31 +#define EXP2_05_PIN P0_18 +#define EXP2_06_PIN P3_25 +#define EXP2_07_PIN P0_16 +#define EXP2_08_PIN P3_26 +#define EXP2_09_PIN P0_15 +#define EXP2_10_PIN P0_17 #if HAS_WIRED_LCD #if ENABLED(ANET_FULL_GRAPHICS_LCD_ALT_WIRING) @@ -243,25 +243,25 @@ * LCD LCD */ - #define LCD_PINS_RS EXPA1_03_PIN + #define LCD_PINS_RS EXP1_03_PIN - #define BTN_EN1 EXPA1_06_PIN - #define BTN_EN2 EXPA1_04_PIN - #define BTN_ENC EXPA1_08_PIN + #define BTN_EN1 EXP1_06_PIN + #define BTN_EN2 EXP1_04_PIN + #define BTN_ENC EXP1_08_PIN - #define LCD_PINS_ENABLE EXPA1_05_PIN - #define LCD_PINS_D4 EXPA1_07_PIN + #define LCD_PINS_ENABLE EXP1_05_PIN + #define LCD_PINS_D4 EXP1_07_PIN #elif ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS EXPA1_04_PIN + #define LCD_PINS_RS EXP1_04_PIN - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN // (58) open-drain + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN + #define BTN_ENC EXP1_09_PIN // (58) open-drain - #define LCD_PINS_ENABLE EXPA1_03_PIN - #define LCD_PINS_D4 EXPA1_05_PIN + #define LCD_PINS_ENABLE EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN #elif HAS_ADC_BUTTONS @@ -270,60 +270,60 @@ #elif IS_TFTGLCD_PANEL #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS EXPA2_08_PIN + #define TFTGLCD_CS EXP2_08_PIN #endif - #define SD_DETECT_PIN EXPA2_04_PIN + #define SD_DETECT_PIN EXP2_04_PIN #else // !CR10_STOCKDISPLAY - #define LCD_PINS_RS EXPA1_07_PIN + #define LCD_PINS_RS EXP1_07_PIN - #define BTN_EN1 EXPA2_08_PIN // (31) J3-2 & AUX-4 - #define BTN_EN2 EXPA2_06_PIN // (33) J3-4 & AUX-4 - #define BTN_ENC EXPA1_09_PIN // (58) open-drain + #define BTN_EN1 EXP2_08_PIN // (31) J3-2 & AUX-4 + #define BTN_EN2 EXP2_06_PIN // (33) J3-4 & AUX-4 + #define BTN_ENC EXP1_09_PIN // (58) open-drain - #define LCD_PINS_ENABLE EXPA1_08_PIN - #define LCD_PINS_D4 EXPA1_06_PIN + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN - #define LCD_SDSS EXPA2_07_PIN // (16) J3-7 & AUX-4 - #define SD_DETECT_PIN EXPA2_04_PIN // (49) (NOT 5V tolerant) + #define LCD_SDSS EXP2_07_PIN // (16) J3-7 & AUX-4 + #define SD_DETECT_PIN EXP2_04_PIN // (49) (NOT 5V tolerant) #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS EXPA1_08_PIN - #define DOGLCD_A0 EXPA1_07_PIN - #define DOGLCD_SCK EXPA2_09_PIN - #define DOGLCD_MOSI EXPA2_05_PIN + #define DOGLCD_CS EXP1_08_PIN + #define DOGLCD_A0 EXP1_07_PIN + #define DOGLCD_SCK EXP2_09_PIN + #define DOGLCD_MOSI EXP2_05_PIN #define LCD_BACKLIGHT_PIN -1 #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems // results in LCD soft SPI mode 3, SD soft SPI mode 0 - #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. + #define LCD_RESET_PIN EXP1_06_PIN // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN EXPA1_05_PIN + #define RGB_LED_R_PIN EXP1_05_PIN #endif #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN EXPA1_04_PIN + #define RGB_LED_G_PIN EXP1_04_PIN #endif #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN EXPA1_03_PIN + #define RGB_LED_B_PIN EXP1_03_PIN #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN EXPA1_05_PIN + #define NEOPIXEL_PIN EXP1_05_PIN #endif #else // !FYSETC_MINI_12864 #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS EXPA1_05_PIN - #define DOGLCD_A0 EXPA1_04_PIN - #define DOGLCD_SCK EXPA2_09_PIN - #define DOGLCD_MOSI EXPA2_05_PIN + #define DOGLCD_CS EXP1_05_PIN + #define DOGLCD_A0 EXP1_04_PIN + #define DOGLCD_SCK EXP2_09_PIN + #define DOGLCD_MOSI EXP2_05_PIN #elif ENABLED(ENDER2_STOCKDISPLAY) @@ -339,21 +339,21 @@ * EXP1 */ - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN - #define DOGLCD_CS EXPA1_04_PIN - #define DOGLCD_A0 EXPA1_05_PIN - #define DOGLCD_SCK EXPA1_10_PIN - #define DOGLCD_MOSI EXPA1_03_PIN + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN + #define BTN_ENC EXP1_09_PIN + #define DOGLCD_CS EXP1_04_PIN + #define DOGLCD_A0 EXP1_05_PIN + #define DOGLCD_SCK EXP1_10_PIN + #define DOGLCD_MOSI EXP1_03_PIN #define FORCE_SOFT_SPI #define LCD_BACKLIGHT_PIN -1 #endif #if IS_ULTIPANEL - #define LCD_PINS_D5 EXPA1_05_PIN - #define LCD_PINS_D6 EXPA1_04_PIN - #define LCD_PINS_D7 EXPA1_03_PIN + #define LCD_PINS_D5 EXP1_05_PIN + #define LCD_PINS_D6 EXP1_04_PIN + #define LCD_PINS_D7 EXP1_03_PIN #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder @@ -376,7 +376,7 @@ #endif #if SD_CONNECTION_IS(LCD) - #define SD_SS_PIN EXPA2_07_PIN + #define SD_SS_PIN EXP2_07_PIN #endif /** diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index dfe86b12b7..c7555a779d 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -243,29 +243,29 @@ * EXP2 EXP1 */ -#define EXPA1_03_PIN P1_23 -#define EXPA1_04_PIN P1_22 -#define EXPA1_05_PIN P1_21 -#define EXPA1_06_PIN P1_20 -#define EXPA1_07_PIN P1_19 -#define EXPA1_08_PIN P1_18 -#define EXPA1_09_PIN P0_28 -#define EXPA1_10_PIN P1_30 +#define EXP1_03_PIN P1_23 +#define EXP1_04_PIN P1_22 +#define EXP1_05_PIN P1_21 +#define EXP1_06_PIN P1_20 +#define EXP1_07_PIN P1_19 +#define EXP1_08_PIN P1_18 +#define EXP1_09_PIN P0_28 +#define EXP1_10_PIN P1_30 -#define EXPA2_03_PIN -1 -#define EXPA2_04_PIN P1_31 -#define EXPA2_05_PIN P0_18 -#define EXPA2_06_PIN P3_25 -#define EXPA2_07_PIN P0_16 -#define EXPA2_08_PIN P3_26 -#define EXPA2_09_PIN P0_15 -#define EXPA2_10_PIN P0_17 +#define EXP2_03_PIN -1 +#define EXP2_04_PIN P1_31 +#define EXP2_05_PIN P0_18 +#define EXP2_06_PIN P3_25 +#define EXP2_07_PIN P0_16 +#define EXP2_08_PIN P3_26 +#define EXP2_09_PIN P0_15 +#define EXP2_10_PIN P0_17 // // SD Connection // #if SD_CONNECTION_IS(LCD) - #define SD_SS_PIN EXPA2_07_PIN + #define SD_SS_PIN EXP2_07_PIN #endif /** @@ -282,12 +282,12 @@ #if ENABLED(DWIN_CREALITY_LCD) // RET6 DWIN ENCODER LCD - #define BTN_ENC P1_20 - #define BTN_EN1 P1_23 - #define BTN_EN2 P1_22 + #define BTN_ENC P1_20 + #define BTN_EN1 P1_23 + #define BTN_EN2 P1_22 #ifndef BEEPER_PIN - #define BEEPER_PIN P1_21 + #define BEEPER_PIN P1_21 #undef SPEAKER #endif @@ -315,15 +315,15 @@ * LCD LCD */ - #define LCD_PINS_RS EXPA1_07_PIN + #define LCD_PINS_RS EXP1_07_PIN - #define BTN_EN1 EXPA1_05_PIN - #define BTN_EN2 EXPA1_04_PIN - #define BTN_ENC EXPA1_10_PIN + #define BTN_EN1 EXP1_05_PIN + #define BTN_EN2 EXP1_04_PIN + #define BTN_ENC EXP1_10_PIN - #define LCD_PINS_ENABLE EXPA1_08_PIN - #define LCD_PINS_D4 EXPA1_06_PIN - #define BEEPER_PIN EXPA1_03_PIN + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN + #define BEEPER_PIN EXP1_03_PIN #elif ENABLED(ANET_FULL_GRAPHICS_LCD) #error "CAUTION! ANET_FULL_GRAPHICS_LCD requires wiring modifications. See 'pins_BTT_SKR_V1_4.h' for details. Comment out this line to continue." @@ -349,26 +349,26 @@ * LCD LCD */ - #define LCD_PINS_RS EXPA1_03_PIN + #define LCD_PINS_RS EXP1_03_PIN - #define BTN_EN1 EXPA1_06_PIN - #define BTN_EN2 EXPA1_04_PIN - #define BTN_ENC EXPA1_08_PIN + #define BTN_EN1 EXP1_06_PIN + #define BTN_EN2 EXP1_04_PIN + #define BTN_ENC EXP1_08_PIN - #define LCD_PINS_ENABLE EXPA1_05_PIN - #define LCD_PINS_D4 EXPA1_07_PIN + #define LCD_PINS_ENABLE EXP1_05_PIN + #define LCD_PINS_D4 EXP1_07_PIN - #define BEEPER_PIN EXPA1_10_PIN + #define BEEPER_PIN EXP1_10_PIN #elif ENABLED(CR10_STOCKDISPLAY) - #define BTN_ENC EXPA1_09_PIN // (58) open-drain - #define LCD_PINS_RS EXPA1_04_PIN + #define BTN_ENC EXP1_09_PIN // (58) open-drain + #define LCD_PINS_RS EXP1_04_PIN - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN - #define LCD_PINS_ENABLE EXPA1_03_PIN - #define LCD_PINS_D4 EXPA1_05_PIN + #define LCD_PINS_ENABLE EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN #elif ENABLED(ENDER2_STOCKDISPLAY) @@ -383,36 +383,36 @@ * EXP1 */ - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN + #define BTN_ENC EXP1_09_PIN - #define DOGLCD_CS EXPA1_04_PIN - #define DOGLCD_A0 EXPA1_05_PIN - #define DOGLCD_SCK EXPA1_10_PIN - #define DOGLCD_MOSI EXPA1_03_PIN + #define DOGLCD_CS EXP1_04_PIN + #define DOGLCD_A0 EXP1_05_PIN + #define DOGLCD_SCK EXP1_10_PIN + #define DOGLCD_MOSI EXP1_03_PIN #define FORCE_SOFT_SPI #define LCD_BACKLIGHT_PIN -1 #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI - #define TFT_CS_PIN EXPA1_04_PIN - #define TFT_A0_PIN EXPA1_03_PIN - #define TFT_DC_PIN EXPA1_03_PIN - #define TFT_MISO_PIN EXPA2_10_PIN - #define TFT_BACKLIGHT_PIN EXPA1_08_PIN - #define TFT_RESET_PIN EXPA1_07_PIN + #define TFT_CS_PIN EXP1_04_PIN + #define TFT_A0_PIN EXP1_03_PIN + #define TFT_DC_PIN EXP1_03_PIN + #define TFT_MISO_PIN EXP2_10_PIN + #define TFT_BACKLIGHT_PIN EXP1_08_PIN + #define TFT_RESET_PIN EXP1_07_PIN #define LCD_USE_DMA_SPI - #define TOUCH_INT_PIN EXPA1_05_PIN - #define TOUCH_CS_PIN EXPA1_06_PIN + #define TOUCH_INT_PIN EXP1_05_PIN + #define TOUCH_CS_PIN EXP1_06_PIN #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 // SPI 1 - #define SD_SCK_PIN EXPA2_09_PIN - #define SD_MISO_PIN EXPA2_10_PIN - #define SD_MOSI_PIN EXPA2_05_PIN + #define SD_SCK_PIN EXP2_09_PIN + #define SD_MISO_PIN EXP2_10_PIN + #define SD_MOSI_PIN EXP2_05_PIN // Disable any LCD related PINs config #define LCD_PINS_ENABLE -1 @@ -423,72 +423,72 @@ #elif IS_TFTGLCD_PANEL #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS EXPA2_08_PIN + #define TFTGLCD_CS EXP2_08_PIN #endif - #define SD_DETECT_PIN EXPA2_04_PIN + #define SD_DETECT_PIN EXP2_04_PIN #else - #define BTN_ENC EXPA1_09_PIN // (58) open-drain - #define LCD_PINS_RS EXPA1_07_PIN + #define BTN_ENC EXP1_09_PIN // (58) open-drain + #define LCD_PINS_RS EXP1_07_PIN - #define BTN_EN1 EXPA2_08_PIN // (31) J3-2 & AUX-4 - #define BTN_EN2 EXPA2_06_PIN // (33) J3-4 & AUX-4 + #define BTN_EN1 EXP2_08_PIN // (31) J3-2 & AUX-4 + #define BTN_EN2 EXP2_06_PIN // (33) J3-4 & AUX-4 - #define LCD_PINS_ENABLE EXPA1_08_PIN - #define LCD_PINS_D4 EXPA1_06_PIN + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN - #define LCD_SDSS EXPA2_07_PIN // (16) J3-7 & AUX-4 + #define LCD_SDSS EXP2_07_PIN // (16) J3-7 & AUX-4 #if SD_CONNECTION_IS(LCD) - #define SD_DETECT_PIN EXPA2_04_PIN // (49) (NOT 5V tolerant) + #define SD_DETECT_PIN EXP2_04_PIN // (49) (NOT 5V tolerant) #endif #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS EXPA1_08_PIN - #define DOGLCD_A0 EXPA1_07_PIN - #define DOGLCD_SCK EXPA2_09_PIN - #define DOGLCD_MOSI EXPA2_05_PIN + #define DOGLCD_CS EXP1_08_PIN + #define DOGLCD_A0 EXP1_07_PIN + #define DOGLCD_SCK EXP2_09_PIN + #define DOGLCD_MOSI EXP2_05_PIN #define LCD_BACKLIGHT_PIN -1 #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems // results in LCD soft SPI mode 3, SD soft SPI mode 0 - #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. + #define LCD_RESET_PIN EXP1_06_PIN // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN EXPA1_05_PIN + #define RGB_LED_R_PIN EXP1_05_PIN #endif #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN EXPA1_04_PIN + #define RGB_LED_G_PIN EXP1_04_PIN #endif #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN EXPA1_03_PIN + #define RGB_LED_B_PIN EXP1_03_PIN #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN EXPA1_05_PIN + #define NEOPIXEL_PIN EXP1_05_PIN #endif #else // !FYSETC_MINI_12864 #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS EXPA1_05_PIN - #define DOGLCD_A0 EXPA1_04_PIN - #define DOGLCD_SCK EXPA2_09_PIN - #define DOGLCD_MOSI EXPA2_05_PIN + #define DOGLCD_CS EXP1_05_PIN + #define DOGLCD_A0 EXP1_04_PIN + #define DOGLCD_SCK EXP2_09_PIN + #define DOGLCD_MOSI EXP2_05_PIN #define FORCE_SOFT_SPI #endif #if IS_ULTIPANEL - #define LCD_PINS_D5 EXPA1_05_PIN - #define LCD_PINS_D6 EXPA1_04_PIN - #define LCD_PINS_D7 EXPA1_03_PIN + #define LCD_PINS_D5 EXP1_05_PIN + #define LCD_PINS_D6 EXP1_04_PIN + #define LCD_PINS_D7 EXP1_03_PIN #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define BTN_ENC_EN EXPA1_03_PIN // Detect the presence of the encoder + #define BTN_ENC_EN EXP1_03_PIN // Detect the presence of the encoder #endif #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 80d61d9c47..82799c1cd0 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -143,46 +143,46 @@ */ // M1 on Driver Expansion Module - #define E2_STEP_PIN EXPA2_05_PIN - #define E2_DIR_PIN EXPA2_06_PIN - #define E2_ENABLE_PIN EXPA2_04_PIN + #define E2_STEP_PIN EXP2_05_PIN + #define E2_DIR_PIN EXP2_06_PIN + #define E2_ENABLE_PIN EXP2_04_PIN #if !EXP_MOT_USE_EXP2_ONLY - #define E2_DIAG_PIN EXPA1_06_PIN - #define E2_CS_PIN EXPA1_05_PIN + #define E2_DIAG_PIN EXP1_06_PIN + #define E2_CS_PIN EXP1_05_PIN #if HAS_TMC_UART - #define E2_SERIAL_TX_PIN EXPA1_05_PIN - #define E2_SERIAL_RX_PIN EXPA1_05_PIN + #define E2_SERIAL_TX_PIN EXP1_05_PIN + #define E2_SERIAL_RX_PIN EXP1_05_PIN #endif #endif // M2 on Driver Expansion Module - #define E3_STEP_PIN EXPA2_08_PIN - #define E3_DIR_PIN EXPA2_07_PIN + #define E3_STEP_PIN EXP2_08_PIN + #define E3_DIR_PIN EXP2_07_PIN #if !EXP_MOT_USE_EXP2_ONLY - #define E3_ENABLE_PIN EXPA1_03_PIN - #define E3_DIAG_PIN EXPA1_08_PIN - #define E3_CS_PIN EXPA1_07_PIN + #define E3_ENABLE_PIN EXP1_03_PIN + #define E3_DIAG_PIN EXP1_08_PIN + #define E3_CS_PIN EXP1_07_PIN #if HAS_TMC_UART - #define E3_SERIAL_TX_PIN EXPA1_07_PIN - #define E3_SERIAL_RX_PIN EXPA1_07_PIN + #define E3_SERIAL_TX_PIN EXP1_07_PIN + #define E3_SERIAL_RX_PIN EXP1_07_PIN #endif #else - #define E3_ENABLE_PIN EXPA2_04_PIN + #define E3_ENABLE_PIN EXP2_04_PIN #endif // M3 on Driver Expansion Module - #define E4_STEP_PIN EXPA2_10_PIN - #define E4_DIR_PIN EXPA2_09_PIN + #define E4_STEP_PIN EXP2_10_PIN + #define E4_DIR_PIN EXP2_09_PIN #if !EXP_MOT_USE_EXP2_ONLY - #define E4_ENABLE_PIN EXPA1_04_PIN - #define E4_DIAG_PIN EXPA1_10_PIN - #define E4_CS_PIN EXPA1_09_PIN + #define E4_ENABLE_PIN EXP1_04_PIN + #define E4_DIAG_PIN EXP1_10_PIN + #define E4_CS_PIN EXP1_09_PIN #if HAS_TMC_UART - #define E4_SERIAL_TX_PIN EXPA1_09_PIN - #define E4_SERIAL_RX_PIN EXPA1_09_PIN + #define E4_SERIAL_TX_PIN EXP1_09_PIN + #define E4_SERIAL_RX_PIN EXP1_09_PIN #endif #else - #define E4_ENABLE_PIN EXPA2_04_PIN + #define E4_ENABLE_PIN EXP2_04_PIN #endif #endif // HAS_BTT_EXP_MOT diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 6e498ba6aa..7c63ba20be 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -190,51 +190,51 @@ * EXP */ -#define EXPA1_03_PIN P0_18 -#define EXPA1_04_PIN P0_17 -#define EXPA1_05_PIN P0_15 -#define EXPA1_06_PIN P0_20 -#define EXPA1_07_PIN -1 -#define EXPA1_08_PIN P0_19 -#define EXPA1_09_PIN P0_16 -#define EXPA1_10_PIN P2_08 +#define EXP1_03_PIN P0_18 +#define EXP1_04_PIN P0_17 +#define EXP1_05_PIN P0_15 +#define EXP1_06_PIN P0_20 +#define EXP1_07_PIN -1 +#define EXP1_08_PIN P0_19 +#define EXP1_09_PIN P0_16 +#define EXP1_10_PIN P2_08 #if HAS_WIRED_LCD #if ENABLED(CR10_STOCKDISPLAY) - #define BEEPER_PIN EXPA1_10_PIN + #define BEEPER_PIN EXP1_10_PIN - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN + #define BTN_ENC EXP1_09_PIN - #define LCD_PINS_RS EXPA1_04_PIN - #define LCD_PINS_ENABLE EXPA1_03_PIN - #define LCD_PINS_D4 EXPA1_05_PIN + #define LCD_PINS_RS EXP1_04_PIN + #define LCD_PINS_ENABLE EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_SKR_E3_TURBO.h' for details. Comment out this line to continue." - #define LCD_PINS_RS EXPA1_05_PIN - #define LCD_PINS_ENABLE EXPA1_09_PIN - #define LCD_PINS_D4 EXPA1_04_PIN - #define LCD_PINS_D5 EXPA1_06_PIN - #define LCD_PINS_D6 EXPA1_08_PIN - #define LCD_PINS_D7 EXPA1_10_PIN + #define LCD_PINS_RS EXP1_05_PIN + #define LCD_PINS_ENABLE EXP1_09_PIN + #define LCD_PINS_D4 EXP1_04_PIN + #define LCD_PINS_D5 EXP1_06_PIN + #define LCD_PINS_D6 EXP1_08_PIN + #define LCD_PINS_D7 EXP1_10_PIN #define ADC_KEYPAD_PIN P1_23 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN + #define BTN_ENC EXP1_09_PIN - #define DOGLCD_CS EXPA1_04_PIN - #define DOGLCD_A0 EXPA1_05_PIN - #define DOGLCD_SCK EXPA1_10_PIN - #define DOGLCD_MOSI EXPA1_03_PIN + #define DOGLCD_CS EXP1_04_PIN + #define DOGLCD_A0 EXP1_05_PIN + #define DOGLCD_SCK EXP1_10_PIN + #define DOGLCD_MOSI EXP1_03_PIN #define FORCE_SOFT_SPI #define LCD_BACKLIGHT_PIN -1 diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 3f22d2a539..fe416dfb68 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -124,14 +124,14 @@ #define X_DIR_PIN 55 #define X_ENABLE_PIN 38 #ifndef X_CS_PIN - #define X_CS_PIN 53 + #define X_CS_PIN EXP2_07_PIN #endif #define Y_STEP_PIN 60 #define Y_DIR_PIN 61 #define Y_ENABLE_PIN 56 #ifndef Y_CS_PIN - #define Y_CS_PIN 49 + #define Y_CS_PIN EXP2_04_PIN #endif #ifndef Z_STEP_PIN @@ -245,7 +245,7 @@ // // Misc. Functions // -#define SDSS 53 +#define SDSS EXP2_07_PIN #define LED_PIN 13 #ifndef FILWIDTH_PIN @@ -429,10 +429,57 @@ #define E_MUX2_PIN 44 // E1_CS_PIN #endif +// +// Aux 3 GND D52 D50 5V +// NC D53 D51 D49 + +// +// Aux 4 D16 D17 D23 D25 D27 D29 D31 D33 D35 D37 D39 D41 D43 D45 D47 D32 GND 5V +// + +/** + * LCD adapter. Please note: These comes in two variants. The socket keys can be + * on either side, and may be backwards on some boards / displays. + * _____ _____ + * D37 |10 9 | D35 (MISO) D50 |10 9 | D52 (SCK) + * D17 | 8 7 | D16 D31 | 8 7 | D53 + * D23 6 5 D25 D33 6 5 D51 (MOSI) + * D27 | 4 3 | D29 D49 | 4 3 | D41 + * GND | 2 1 | 5V GND | 2 1 | NC + * ----- ----- + * EXP1 EXP2 + */ + +#ifndef EXP1_03_PIN + #define EXP1_03_PIN 29 + #define EXP1_04_PIN 27 + #define EXP1_05_PIN 25 + #define EXP1_06_PIN 23 + #define EXP1_07_PIN 16 + #define EXP1_08_PIN 17 + #define EXP1_09_PIN 35 + #define EXP1_10_PIN 37 + + #define EXP2_03_PIN 41 + #define EXP2_04_PIN 49 + #define EXP2_05_PIN 51 + #define EXP2_06_PIN 33 + #define EXP2_07_PIN 53 + #define EXP2_08_PIN 31 + #define EXP2_09_PIN 52 + #define EXP2_10_PIN 50 +#endif + ////////////////////////// // LCDs and Controllers // ////////////////////////// +// GLCD features +// Uncomment screen orientation +//#define LCD_SCREEN_ROT_90 +//#define LCD_SCREEN_ROT_180 +//#define LCD_SCREEN_ROT_270 + #if HAS_WIRED_LCD // @@ -440,9 +487,9 @@ // #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock + #define LCD_PINS_RS EXP2_04_PIN // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE EXP2_05_PIN // SID (MOSI) + #define LCD_PINS_D4 EXP2_09_PIN // SCK (CLK) clock #elif BOTH(IS_NEWPANEL, PANEL_ONE) @@ -455,18 +502,18 @@ #elif ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS 33 + #define TFTGLCD_CS EXP2_06_PIN #else #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 25 + #define LCD_PINS_RS EXP1_04_PIN + #define LCD_PINS_ENABLE EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN #if !IS_NEWPANEL - #define BEEPER_PIN 37 + #define BEEPER_PIN EXP1_10_PIN #endif #elif ENABLED(ZONESTAR_LCD) @@ -482,25 +529,25 @@ #else #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) - #define LCD_PINS_DC 25 // Set as output on init - #define LCD_PINS_RS 27 // Pull low for 1s to init + #define LCD_PINS_DC EXP1_05_PIN // Set as output on init + #define LCD_PINS_RS EXP1_04_PIN // Pull low for 1s to init // DOGM SPI LCD Support #define DOGLCD_A0 LCD_PINS_DC - #define DOGLCD_CS 16 - #define DOGLCD_MOSI 17 - #define DOGLCD_SCK 23 + #define DOGLCD_CS EXP1_07_PIN + #define DOGLCD_MOSI EXP1_08_PIN + #define DOGLCD_SCK EXP1_06_PIN #else - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 + #define LCD_PINS_RS EXP1_07_PIN + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN + #define LCD_PINS_D5 EXP1_05_PIN + #define LCD_PINS_D6 EXP1_04_PIN #endif - #define LCD_PINS_D7 29 + #define LCD_PINS_D7 EXP1_03_PIN #if !IS_NEWPANEL - #define BEEPER_PIN 33 + #define BEEPER_PIN EXP2_06_PIN #endif #endif @@ -511,7 +558,7 @@ //#define SHIFT_CLK_PIN 38 //#define SHIFT_LD_PIN 42 //#define SHIFT_OUT_PIN 40 - //#define SHIFT_EN_PIN 17 + //#define SHIFT_EN_PIN EXP1_08_PIN #endif #endif @@ -527,22 +574,22 @@ #if IS_RRD_SC - #define BEEPER_PIN 37 + #define BEEPER_PIN EXP1_10_PIN #if ENABLED(CR10_STOCKDISPLAY) - #define BTN_EN1 17 - #define BTN_EN2 23 + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN #else - #define BTN_EN1 31 - #define BTN_EN2 33 + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN #endif - #define BTN_ENC 35 + #define BTN_ENC EXP1_09_PIN #ifndef SD_DETECT_PIN - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN EXP2_04_PIN #endif #ifndef KILL_PIN - #define KILL_PIN 41 + #define KILL_PIN EXP2_03_PIN #endif #if ENABLED(BQ_LCD_SMART_CONTROLLER) @@ -562,7 +609,7 @@ #define BTN_EN2 43 #define BTN_ENC 32 #define LCD_SDSS SDSS - #define KILL_PIN 41 + #define KILL_PIN EXP2_03_PIN #elif ENABLED(LCD_I2C_VIKI) @@ -571,7 +618,7 @@ #define BTN_ENC -1 #define LCD_SDSS SDSS - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN EXP2_04_PIN #elif ANY(VIKI2, miniVIKI) @@ -579,87 +626,81 @@ #define DOGLCD_A0 44 #define LCD_SCREEN_ROT_180 - #define BEEPER_PIN 33 + #define BEEPER_PIN EXP2_06_PIN #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 + #define STAT_LED_BLUE_PIN EXP1_09_PIN #define BTN_EN1 22 #define BTN_EN2 7 #define BTN_ENC 39 #define SD_DETECT_PIN -1 // Pin 49 for display SD interface, 72 for easy adapter board - #define KILL_PIN 31 + #define KILL_PIN EXP2_08_PIN #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 + #define DOGLCD_CS EXP1_03_PIN + #define DOGLCD_A0 EXP1_04_PIN - #define BEEPER_PIN 23 - #define LCD_BACKLIGHT_PIN 33 + #define BEEPER_PIN EXP1_06_PIN + #define LCD_BACKLIGHT_PIN EXP2_06_PIN - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 + #define BTN_EN1 EXP1_09_PIN + #define BTN_EN2 EXP1_10_PIN + #define BTN_ENC EXP2_08_PIN #define LCD_SDSS SDSS - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN EXP2_04_PIN + #define KILL_PIN EXP2_03_PIN #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) - #define BEEPER_PIN 37 - #define BTN_ENC 35 - #define SD_DETECT_PIN 49 + #define BEEPER_PIN EXP1_10_PIN + #define BTN_ENC EXP1_09_PIN + #define SD_DETECT_PIN EXP2_04_PIN #ifndef KILL_PIN - #define KILL_PIN 41 + #define KILL_PIN EXP2_03_PIN #endif #if ENABLED(MKS_MINI_12864) - #define DOGLCD_A0 27 - #define DOGLCD_CS 25 - - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 + #define DOGLCD_A0 EXP1_04_PIN + #define DOGLCD_CS EXP1_05_PIN // not connected to a pin #define LCD_BACKLIGHT_PIN -1 // 65 (MKS mini12864 can't adjust backlight by software!) - #define BTN_EN1 31 - #define BTN_EN2 33 + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN #elif ENABLED(FYSETC_MINI_12864) // From https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 - #define DOGLCD_A0 16 - #define DOGLCD_CS 17 + #define DOGLCD_A0 EXP1_07_PIN + #define DOGLCD_CS EXP1_08_PIN - #define BTN_EN1 33 - #define BTN_EN2 31 + #define BTN_EN1 EXP2_06_PIN + #define BTN_EN2 EXP2_08_PIN //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems // results in LCD soft SPI mode 3, SD soft SPI mode 0 - #define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. + #define LCD_RESET_PIN EXP1_06_PIN // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 25 + #define RGB_LED_R_PIN EXP1_05_PIN #endif #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 27 + #define RGB_LED_G_PIN EXP1_04_PIN #endif #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 29 + #define RGB_LED_B_PIN EXP1_03_PIN #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN 25 + #define NEOPIXEL_PIN EXP1_05_PIN #endif #endif @@ -673,17 +714,11 @@ #define DOGLCD_A0 44 #define DOGLCD_CS 66 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - #define BTN_EN1 40 #define BTN_EN2 63 #define BTN_ENC 59 - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN EXP2_04_PIN #define KILL_PIN 64 #elif ENABLED(ZONESTAR_LCD) @@ -699,27 +734,27 @@ #elif IS_TFTGLCD_PANEL - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN EXP2_04_PIN #else // Beeper on AUX-4 - #define BEEPER_PIN 33 + #define BEEPER_PIN EXP2_06_PIN // Buttons are directly attached to AUX-2 #if ENABLED(PANEL_ONE) #define BTN_EN1 59 // AUX2 PIN 3 #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 + #define BTN_ENC EXP2_04_PIN #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 + #define BTN_EN1 EXP1_10_PIN + #define BTN_EN2 EXP1_09_PIN + #define BTN_ENC EXP2_08_PIN #endif #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN EXP2_04_PIN + #define KILL_PIN EXP2_03_PIN #endif #endif @@ -746,7 +781,8 @@ #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_RAMPS.h' for details. Comment out this line to continue." - /** FYSETC TFT TFT81050 display pinout + /** + * FYSETC TFT-81050 display pinout * * Board Display * _____ _____ @@ -771,16 +807,16 @@ * EXP2-7 ----------- EXP1-4 * EXP2-8 ----------- EXP1-3 * EXP2-1 ----------- EXP1-2 - * EXP1-10 ----------- EXP1-1 + * EXP1-10 ---------- EXP1-1 * * NOTE: The MISO pin should not get a 5V signal. * To fix, insert a 1N4148 diode in the MISO line. */ - #define BEEPER_PIN 37 + #define BEEPER_PIN EXP1_10_PIN - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN EXP2_04_PIN - #define CLCD_MOD_RESET 31 - #define CLCD_SPI_CS 33 + #define CLCD_MOD_RESET EXP2_08_PIN + #define CLCD_SPI_CS EXP2_06_PIN #endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 549b578f42..28cfa74aaa 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -268,23 +268,23 @@ * EXP2 EXP1 */ -#define EXPA1_03_PIN PG7 -#define EXPA1_04_PIN PG6 -#define EXPA1_05_PIN PG3 -#define EXPA1_06_PIN PG2 -#define EXPA1_07_PIN PD10 -#define EXPA1_08_PIN PD11 -#define EXPA1_09_PIN PA8 -#define EXPA1_10_PIN PG4 +#define EXP1_03_PIN PG7 +#define EXP1_04_PIN PG6 +#define EXP1_05_PIN PG3 +#define EXP1_06_PIN PG2 +#define EXP1_07_PIN PD10 +#define EXP1_08_PIN PD11 +#define EXP1_09_PIN PA8 +#define EXP1_10_PIN PG4 -#define EXPA2_03_PIN -1 -#define EXPA2_04_PIN PF12 -#define EXPA2_05_PIN PB15 -#define EXPA2_06_PIN PF11 -#define EXPA2_07_PIN PB12 -#define EXPA2_08_PIN PG10 -#define EXPA2_09_PIN PB13 -#define EXPA2_10_PIN PB14 +#define EXP2_03_PIN -1 +#define EXP2_04_PIN PF12 +#define EXP2_05_PIN PB15 +#define EXP2_06_PIN PF11 +#define EXP2_07_PIN PB12 +#define EXP2_08_PIN PG10 +#define EXP2_09_PIN PB13 +#define EXP2_10_PIN PB14 // // Onboard SD card @@ -292,8 +292,8 @@ // #if SD_CONNECTION_IS(LCD) - #define SD_DETECT_PIN EXPA2_04_PIN - #define SDSS EXPA2_07_PIN + #define SD_DETECT_PIN EXP2_04_PIN + #define SDSS EXP2_07_PIN #elif SD_CONNECTION_IS(ONBOARD) @@ -325,36 +325,36 @@ */ // M1 on Driver Expansion Module - #define E3_STEP_PIN EXPA2_05_PIN - #define E3_DIR_PIN EXPA2_06_PIN - #define E3_ENABLE_PIN EXPA2_04_PIN - #define E3_DIAG_PIN EXPA1_06_PIN - #define E3_CS_PIN EXPA1_05_PIN + #define E3_STEP_PIN EXP2_05_PIN + #define E3_DIR_PIN EXP2_06_PIN + #define E3_ENABLE_PIN EXP2_04_PIN + #define E3_DIAG_PIN EXP1_06_PIN + #define E3_CS_PIN EXP1_05_PIN #if HAS_TMC_UART - #define E3_SERIAL_TX_PIN EXPA1_05_PIN - #define E3_SERIAL_RX_PIN EXPA1_05_PIN + #define E3_SERIAL_TX_PIN EXP1_05_PIN + #define E3_SERIAL_RX_PIN EXP1_05_PIN #endif // M2 on Driver Expansion Module - #define E4_STEP_PIN EXPA2_08_PIN - #define E4_DIR_PIN EXPA2_07_PIN - #define E4_ENABLE_PIN EXPA1_03_PIN - #define E4_DIAG_PIN EXPA1_08_PIN - #define E4_CS_PIN EXPA1_07_PIN + #define E4_STEP_PIN EXP2_08_PIN + #define E4_DIR_PIN EXP2_07_PIN + #define E4_ENABLE_PIN EXP1_03_PIN + #define E4_DIAG_PIN EXP1_08_PIN + #define E4_CS_PIN EXP1_07_PIN #if HAS_TMC_UART - #define E4_SERIAL_TX_PIN EXPA1_07_PIN - #define E4_SERIAL_RX_PIN EXPA1_07_PIN + #define E4_SERIAL_TX_PIN EXP1_07_PIN + #define E4_SERIAL_RX_PIN EXP1_07_PIN #endif // M3 on Driver Expansion Module - #define E5_STEP_PIN EXPA2_10_PIN - #define E5_DIR_PIN EXPA2_09_PIN - #define E5_ENABLE_PIN EXPA1_04_PIN - #define E5_DIAG_PIN EXPA1_10_PIN - #define E5_CS_PIN EXPA1_09_PIN + #define E5_STEP_PIN EXP2_10_PIN + #define E5_DIR_PIN EXP2_09_PIN + #define E5_ENABLE_PIN EXP1_04_PIN + #define E5_DIAG_PIN EXP1_10_PIN + #define E5_CS_PIN EXP1_09_PIN #if HAS_TMC_UART - #define E5_SERIAL_TX_PIN EXPA1_09_PIN - #define E5_SERIAL_RX_PIN EXPA1_09_PIN + #define E5_SERIAL_TX_PIN EXP1_09_PIN + #define E5_SERIAL_RX_PIN EXP1_09_PIN #endif #endif // BTT_MOTOR_EXPANSION @@ -365,23 +365,23 @@ #if IS_TFTGLCD_PANEL #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS EXPA2_08_PIN + #define TFTGLCD_CS EXP2_08_PIN #endif #elif HAS_WIRED_LCD - #define BEEPER_PIN EXPA1_10_PIN - #define BTN_ENC EXPA1_09_PIN + #define BEEPER_PIN EXP1_10_PIN + #define BTN_ENC EXP1_09_PIN #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS EXPA1_04_PIN + #define LCD_PINS_RS EXP1_04_PIN - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN - #define LCD_PINS_ENABLE EXPA1_03_PIN - #define LCD_PINS_D4 EXPA1_05_PIN + #define LCD_PINS_ENABLE EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN // CR10_STOCKDISPLAY default timing is too fast #undef BOARD_ST7920_DELAY_1 @@ -390,45 +390,45 @@ #elif ENABLED(MKS_MINI_12864) - #define DOGLCD_A0 EXPA1_04_PIN - #define DOGLCD_CS EXPA1_05_PIN - #define BTN_EN1 EXPA2_08_PIN - #define BTN_EN2 EXPA2_06_PIN + #define DOGLCD_A0 EXP1_04_PIN + #define DOGLCD_CS EXP1_05_PIN + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN #else - #define LCD_PINS_RS EXPA1_07_PIN + #define LCD_PINS_RS EXP1_07_PIN - #define BTN_EN1 EXPA2_08_PIN - #define BTN_EN2 EXPA2_06_PIN + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN - #define LCD_PINS_ENABLE EXPA1_08_PIN - #define LCD_PINS_D4 EXPA1_06_PIN + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS EXPA1_08_PIN - #define DOGLCD_A0 EXPA1_07_PIN + #define DOGLCD_CS EXP1_08_PIN + #define DOGLCD_A0 EXP1_07_PIN //#define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. + #define LCD_RESET_PIN EXP1_06_PIN // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN EXPA1_05_PIN + #define RGB_LED_R_PIN EXP1_05_PIN #endif #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN EXPA1_04_PIN + #define RGB_LED_G_PIN EXP1_04_PIN #endif #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN EXPA1_03_PIN + #define RGB_LED_B_PIN EXP1_03_PIN #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN EXPA1_05_PIN + #define NEOPIXEL_PIN EXP1_05_PIN #endif #endif // !FYSETC_MINI_12864 #if IS_ULTIPANEL - #define LCD_PINS_D5 EXPA1_05_PIN - #define LCD_PINS_D6 EXPA1_04_PIN - #define LCD_PINS_D7 EXPA1_03_PIN + #define LCD_PINS_D5 EXP1_05_PIN + #define LCD_PINS_D6 EXP1_04_PIN + #define LCD_PINS_D7 EXP1_03_PIN #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h index 18e689d1d9..ad43765135 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h @@ -161,38 +161,38 @@ * EXP3 */ -#define EXPA1_03_PIN PB7 -#define EXPA1_04_PIN PB6 -#define EXPA1_05_PIN PB14 -#define EXPA1_06_PIN PB13 -#define EXPA1_07_PIN PB12 -#define EXPA1_08_PIN PB15 -#define EXPA1_09_PIN PC12 -#define EXPA1_10_PIN PC9 +#define EXP1_03_PIN PB7 +#define EXP1_04_PIN PB6 +#define EXP1_05_PIN PB14 +#define EXP1_06_PIN PB13 +#define EXP1_07_PIN PB12 +#define EXP1_08_PIN PB15 +#define EXP1_09_PIN PC12 +#define EXP1_10_PIN PC9 -#define EXPA2_03_PIN -1 -#define EXPA2_04_PIN PC3 -#define EXPA2_05_PIN PA7 -#define EXPA2_06_PIN PC11 -#define EXPA2_07_PIN PA4 -#define EXPA2_08_PIN PC10 -#define EXPA2_09_PIN PA5 -#define EXPA2_10_PIN PA6 +#define EXP2_03_PIN -1 +#define EXP2_04_PIN PC3 +#define EXP2_05_PIN PA7 +#define EXP2_06_PIN PC11 +#define EXP2_07_PIN PA4 +#define EXP2_08_PIN PC10 +#define EXP2_09_PIN PA5 +#define EXP2_10_PIN PA6 #if HAS_WIRED_LCD - #define BEEPER_PIN EXPA1_10_PIN - #define BTN_ENC EXPA1_09_PIN + #define BEEPER_PIN EXP1_10_PIN + #define BTN_ENC EXP1_09_PIN #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS EXPA1_07_PIN + #define LCD_PINS_RS EXP1_07_PIN - #define BTN_EN1 EXPA2_08_PIN - #define BTN_EN2 EXPA2_06_PIN + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN - #define LCD_PINS_ENABLE EXPA1_08_PIN - #define LCD_PINS_D4 EXPA1_06_PIN + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN // CR10_STOCKDISPLAY default timing is too fast #undef BOARD_ST7920_DELAY_1 @@ -201,45 +201,45 @@ #elif ENABLED(MKS_MINI_12864) - #define DOGLCD_A0 EXPA1_04_PIN - #define DOGLCD_CS EXPA1_05_PIN - #define BTN_EN1 EXPA2_08_PIN - #define BTN_EN2 EXPA2_06_PIN + #define DOGLCD_A0 EXP1_04_PIN + #define DOGLCD_CS EXP1_05_PIN + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN #else - #define LCD_PINS_RS EXPA1_07_PIN + #define LCD_PINS_RS EXP1_07_PIN - #define BTN_EN1 EXPA2_06_PIN - #define BTN_EN2 EXPA2_08_PIN + #define BTN_EN1 EXP2_06_PIN + #define BTN_EN2 EXP2_08_PIN - #define LCD_PINS_ENABLE EXPA1_08_PIN - #define LCD_PINS_D4 EXPA1_06_PIN + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS EXPA1_08_PIN - #define DOGLCD_A0 EXPA1_07_PIN + #define DOGLCD_CS EXP1_08_PIN + #define DOGLCD_A0 EXP1_07_PIN //#define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. + #define LCD_RESET_PIN EXP1_06_PIN // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN EXPA1_05_PIN + #define RGB_LED_R_PIN EXP1_05_PIN #endif #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN EXPA1_04_PIN + #define RGB_LED_G_PIN EXP1_04_PIN #endif #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN EXPA1_03_PIN + #define RGB_LED_B_PIN EXP1_03_PIN #endif #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN EXPA1_05_PIN + #define NEOPIXEL_PIN EXP1_05_PIN #endif #endif // !FYSETC_MINI_12864 #if IS_ULTIPANEL - #define LCD_PINS_D5 EXPA1_05_PIN - #define LCD_PINS_D6 EXPA1_04_PIN - #define LCD_PINS_D7 EXPA1_03_PIN + #define LCD_PINS_D5 EXP1_05_PIN + #define LCD_PINS_D6 EXP1_04_PIN + #define LCD_PINS_D7 EXP1_03_PIN #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder @@ -265,7 +265,7 @@ #endif #if ENABLED(TOUCH_UI_FTDI_EVE) - #define BEEPER_PIN EXPA1_10_PIN - #define CLCD_MOD_RESET EXPA2_08_PIN - #define CLCD_SPI_CS EXPA2_06_PIN + #define BEEPER_PIN EXP1_10_PIN + #define CLCD_MOD_RESET EXP2_08_PIN + #define CLCD_SPI_CS EXP2_06_PIN #endif From c759b2d2a655886474092b48254ffb786610b6a3 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Mon, 15 Feb 2021 12:48:11 +0100 Subject: [PATCH 1022/1370] Script to download & build Configurations (#20992) Co-authored-by: Scott Lahteine --- buildroot/bin/build_all_examples | 62 +++++++++++++++++++++++++++++ buildroot/bin/build_example | 35 ++++++++++++++++ buildroot/{share/git => bin}/mftest | 0 3 files changed, 97 insertions(+) create mode 100755 buildroot/bin/build_all_examples create mode 100755 buildroot/bin/build_example rename buildroot/{share/git => bin}/mftest (100%) diff --git a/buildroot/bin/build_all_examples b/buildroot/bin/build_all_examples new file mode 100755 index 0000000000..29256de69c --- /dev/null +++ b/buildroot/bin/build_all_examples @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +echo "This script will attempt to build Marlin for all known configurations." +echo "In case of failure, the current configuration remains in your repository." +echo "To revert to your current version, run 'git checkout -f'." + +self=`basename "$0"` +HERE=`dirname "$0"` + +# Check dependencies +which curl 1>/dev/null 2>&1 || { echo "curl not found, please install it"; exit ; } +which git 1>/dev/null 2>&1 || { echo "git not found, please install it"; exit ; } +if [ -z "$1" ]; then + echo "" + echo "ERROR: " + echo " Expected parameter: $self base_branch [resume_point]" + echo " with:" + echo " base_branch The branch in the Configuration repository to use" + echo " resume_point If not empty, resume building from this board" + + exit +fi + +# Check if called in the right folder +if [ ! -e "Marlin/src" ]; then + echo "This script must be called from the root folder of a Marlin repository, please navigate to this folder and call:" + echo "buildroot/ci-check/$self $1" + exit +fi + +# Check if the current repository has unmerged changes +if [ -z "$2" ]; then + git diff --quiet || { echo "Your current repository is not clean. Either commit your change or stash them, and re-run this script"; exit ; } +else + echo "Resuming from $2" +fi + +TMPDIR=`mktemp -d` + +# Ok, let's do our stuff now +# First extract the current temporary folder +echo "Fetching configuration repository" +if [ ! -e "$TMPDIR/README.md" ]; then + git clone --single-branch --branch "$1" https://github.com/MarlinFirmware/Configurations.git "$TMPDIR" || { echo "Failed to clone the configuration repository"; exit ; } + rm -r $TMPDIR/.git +fi + +echo +echo "Start building now..." +echo "=====================" +shopt -s nullglob +for config in $TMPDIR/config/examples/*/; do + [ -d "${config}" ] || continue + base=`basename "$config"` + if [ ! -z "$2" ] && [ "$2" != "$base" ]; then + echo "Skipping $base..." + continue + fi + "$HERE/build_example" "internal" "$TMPDIR" "$base" || { echo "Failed to build $base"; exit ; } +done + +rm -r "$TMPDIR" diff --git a/buildroot/bin/build_example b/buildroot/bin/build_example new file mode 100755 index 0000000000..8f2d9d3c33 --- /dev/null +++ b/buildroot/bin/build_example @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +if [ "$1" != "internal" ]; then + echo "Don't call this script directly, use build_all_examples instead." + exit 1 +fi + +SED=$(which gsed || which sed) +HERE=`dirname "$0"` + +echo "Testing $3:" + +shopt -s nullglob +for sub in find $2/config/examples/$3 -type d; do + [[ -d $sub ]] || continue + base=`basename "$sub"` + + if [[ ! -f $sub/Configuration.h ]] && [[ ! -f $sub/Configuration_adv.h ]]; then + echo "No configuration files found in $sub" + continue + fi + + echo "Getting configuration files from $sub" + cp "$2/config/default"/*.h Marlin/ + cp "$sub"/Configuration.h Marlin/ 2>/dev/null + cp "$sub"/Configuration_adv.h Marlin/ 2>/dev/null + cp "$sub"/_Bootscreen.h Marlin/ 2>/dev/null + cp "$sub"/_Statusscreen.h Marlin/ 2>/dev/null + + echo "Building the firmware now..." + echo "$HERE/mftest" -a || exit 1 +done + +echo "Success" +exit 0 diff --git a/buildroot/share/git/mftest b/buildroot/bin/mftest similarity index 100% rename from buildroot/share/git/mftest rename to buildroot/bin/mftest From 3ca2195ed098b7d34002a5eb4e115b77d0a1fc23 Mon Sep 17 00:00:00 2001 From: jbuck2005 <59450931+jbuck2005@users.noreply.github.com> Date: Mon, 15 Feb 2021 07:03:44 -0500 Subject: [PATCH 1023/1370] Update platform ststm32 to 11.0 (#20928) --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 63933183a4..bcf90df0f2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -738,7 +738,7 @@ board = nxp_lpc1769 # HAL/STM32 Base Environment values # [common_stm32] -platform = ststm32@~10.0 +platform = ststm32@~11.0 build_flags = ${common.build_flags} -std=gnu++14 -DUSBCON -DUSBD_USE_CDC @@ -751,7 +751,7 @@ src_filter = ${common.default_src_filter} + + Date: Wed, 17 Feb 2021 11:59:38 +1300 Subject: [PATCH 1024/1370] Fix "BUTTON_CLICK redefined" warning (#21098) --- Marlin/src/lcd/buttons.h | 150 ++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 80 deletions(-) diff --git a/Marlin/src/lcd/buttons.h b/Marlin/src/lcd/buttons.h index 07a4524def..f39cb0a9aa 100644 --- a/Marlin/src/lcd/buttons.h +++ b/Marlin/src/lcd/buttons.h @@ -45,86 +45,6 @@ #define ENCODER_PHASE_3 1 #endif -#if EITHER(HAS_DIGITAL_BUTTONS, DWIN_CREALITY_LCD) - - // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) - #define BLEN_A 0 - #define BLEN_B 1 - - #define EN_A _BV(BLEN_A) - #define EN_B _BV(BLEN_B) - - #define _BUTTON_PRESSED(BN) !READ(BTN_##BN) - - #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS - #define BLEN_C 2 - #define EN_C _BV(BLEN_C) - #endif - - #if ENABLED(LCD_I2C_VIKI) - - #include - - #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) - - // button and encoder bit positions within 'buttons' - #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C - #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET) - #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET) - #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET) - #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET) - - #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used - #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name - #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented. - #else - #define BUTTON_CLICK() (buttons & (B_MI|B_RI)) - #endif - - // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin - - #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) - - #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later - - #define BUTTON_CLICK() (buttons & B_MI) - - #endif - - #endif - -#else - - #undef BUTTON_EXISTS - #define BUTTON_EXISTS(...) false - - // Dummy button, never pressed - #define _BUTTON_PRESSED(BN) false - - // Shift register bits correspond to buttons: - #define BL_LE 7 // Left - #define BL_UP 6 // Up - #define BL_MI 5 // Middle - #define BL_DW 4 // Down - #define BL_RI 3 // Right - #define BL_ST 2 // Red Button - #define B_LE _BV(BL_LE) - #define B_UP _BV(BL_UP) - #define B_MI _BV(BL_MI) - #define B_DW _BV(BL_DW) - #define B_RI _BV(BL_RI) - #define B_ST _BV(BL_ST) - - #ifndef BUTTON_CLICK - #define BUTTON_CLICK() (buttons & (B_MI|B_ST)) - #endif - -#endif - #if IS_RRW_KEYPAD #define BTN_OFFSET 0 // Bit offset into buttons for shift register values @@ -155,6 +75,76 @@ #endif #endif +#if EITHER(HAS_DIGITAL_BUTTONS, DWIN_CREALITY_LCD) + // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) + #define BLEN_A 0 + #define BLEN_B 1 + + #define EN_A _BV(BLEN_A) + #define EN_B _BV(BLEN_B) + + #define _BUTTON_PRESSED(BN) !READ(BTN_##BN) + + #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS + #define BLEN_C 2 + #define EN_C _BV(BLEN_C) + #endif + + #if ENABLED(LCD_I2C_VIKI) + #include + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + // button and encoder bit positions within 'buttons' + #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C + #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET) + #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET) + #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET) + #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET) + + #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used + #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name + #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented. + #else + #define BUTTON_CLICK() (buttons & (B_MI|B_RI)) + #endif + + // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update + + #elif ENABLED(LCD_I2C_PANELOLU2) + #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later + + #define BUTTON_CLICK() (buttons & B_MI) + #endif + #endif +#else + #undef BUTTON_EXISTS + #define BUTTON_EXISTS(...) false + + // Dummy button, never pressed + #define _BUTTON_PRESSED(BN) false + + // Shift register bits correspond to buttons: + #define BL_LE 7 // Left + #define BL_UP 6 // Up + #define BL_MI 5 // Middle + #define BL_DW 4 // Down + #define BL_RI 3 // Right + #define BL_ST 2 // Red Button + #define B_LE _BV(BL_LE) + #define B_UP _BV(BL_UP) + #define B_MI _BV(BL_MI) + #define B_DW _BV(BL_DW) + #define B_RI _BV(BL_RI) + #define B_ST _BV(BL_ST) + + #ifndef BUTTON_CLICK + #define BUTTON_CLICK() (buttons & (B_MI|B_ST)) + #endif +#endif + #ifndef EN_A #define EN_A 0 #endif From b4a3013c281e6b35b2a4be8904a0b1a288d71fd4 Mon Sep 17 00:00:00 2001 From: Allen Bauer Date: Tue, 16 Feb 2021 15:35:31 -0800 Subject: [PATCH 1025/1370] BTT002 pins for FYSETC mini12864 (#21096) --- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 126 ++++++++++++------ 1 file changed, 87 insertions(+), 39 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 939bc1eccd..bc69e1fd21 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -172,73 +172,121 @@ #define FAN_PIN PB8 // Fan1 #define FAN1_PIN PB9 // Fan0 +/** + * -----------------------------------BTT002 V1.0---------------------------------------- + * ------ ------ | + * PA3 | 1 2 | GND 5V | 1 2 | GND | + * NRESET | 3 4 | PC4 (SD_DET) (LCD_D7) PE13 | 3 4 | PE12 (LCD_D6) | + * (MOSI) PA7 | 5 6 | PB0 (BTN_EN2) (LCD_D5) PE11 | 5 6 | PE10 (LCD_D4) | + * (SD_SS) PA4 | 7 8 | PC5 (BTN_EN1) (LCD_RS) PE8 | 7 8 | PE9 (LCD_EN) | + * (SCK) PA5 | 9 10 | PA6 (MISO) (BTN_ENC) PB1 | 9 10 | PE7 (BEEPER) | + * ------ ------ | + * EXP2 EXP1 | + * -------------------------------------------------------------------------------------- + */ + +#define EXP1_03_PIN PE13 +#define EXP1_04_PIN PE12 +#define EXP1_05_PIN PE11 +#define EXP1_06_PIN PE10 +#define EXP1_07_PIN PE8 +#define EXP1_08_PIN PE9 +#define EXP1_09_PIN PB1 +#define EXP1_10_PIN PE7 + +#define EXP2_03_PIN -1 +#define EXP2_04_PIN PC4 +#define EXP2_05_PIN PA7 +#define EXP2_06_PIN PB0 +#define EXP2_07_PIN PA4 +#define EXP2_08_PIN PC5 +#define EXP2_09_PIN PA5 +#define EXP2_10_PIN PA6 + // HAL SPI1 pins #define CUSTOM_SPI_PINS #if ENABLED(CUSTOM_SPI_PINS) - #define SD_SCK_PIN PA5 // SPI1 SCLK - #define SD_SS_PIN PA4 // SPI1 SSEL - #define SD_MISO_PIN PA6 // SPI1 MISO - #define SD_MOSI_PIN PA7 // SPI1 MOSI + #define SD_SCK_PIN EXP2_09_PIN // SPI1 SCLK + #define SD_SS_PIN EXP2_07_PIN // SPI1 SSEL + #define SD_MISO_PIN EXP2_10_PIN // SPI1 MISO + #define SD_MOSI_PIN EXP2_05_PIN // SPI1 MOSI #endif -// -// Misc. Functions -// -#define SDSS PA4 - -/** - * -------------------------------------BTT002 V1.0-------------------------------------------- - * ----- ----- | - * PA3 | · · | GND 5V | · · | GND | - * NRESET | · · | PC4(SD_DET) (LCD_D7) PE13 | · · | PE12 (LCD_D6) | - * (MOSI)PA7 | · · | PB0(BTN_EN2) (LCD_D5) PE11 | · · | PE10 (LCD_D4) | - * (SD_SS)PA4 | · · | PC5(BTN_EN1) (LCD_RS) PE8 | · · | PE9 (LCD_EN) | - * (SCK)PA5 | · · | PA6(MISO) (BTN_ENC) PB1 | · · | PE7 (BEEPER) | - * ----- ----- | - * EXP2 EXP1 | - * -------------------------------------------------------------------------------------------- - */ +#define SDSS EXP2_07_PIN // // LCDs and Controllers // #if HAS_WIRED_LCD - #define BEEPER_PIN PE7 - #define BTN_ENC PB1 + #define BEEPER_PIN EXP1_10_PIN + #define BTN_ENC EXP1_09_PIN + + #define SD_DETECT_PIN EXP2_04_PIN #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS PE12 + #define LCD_PINS_RS EXP1_04_PIN - #define BTN_EN1 PE9 - #define BTN_EN2 PE10 + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN - #define LCD_PINS_ENABLE PE13 - #define LCD_PINS_D4 PE11 + #define LCD_PINS_ENABLE EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN + + #elif ENABLED(MKS_MINI_12864) + + #define DOGLCD_A0 EXP1_04_PIN + #define DOGLCD_CS EXP1_05_PIN + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN #else - #define LCD_PINS_RS PE8 + #define LCD_PINS_RS EXP1_07_PIN - #define BTN_EN1 PC5 - #define BTN_EN2 PB0 - #define SD_DETECT_PIN PC4 + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN - #define LCD_SDSS PA4 + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN - #define LCD_PINS_ENABLE PE9 - #define LCD_PINS_D4 PE10 + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS EXP1_08_PIN + #define DOGLCD_A0 EXP1_07_PIN + #define DOGLCD_MOSI EXP2_05_PIN + #define DOGLCD_MISO EXP2_10_PIN + #define DOGLCD_SCK EXP2_09_PIN + + #define LCD_BACKLIGHT_PIN -1 + + #define FORCE_SOFT_SPI + + #define LCD_RESET_PIN EXP1_06_PIN // Must be high or open for LCD to operate normally. + + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN EXP1_05_PIN + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN EXP1_04_PIN + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN EXP1_03_PIN + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN EXP1_05_PIN + #endif + #endif // !FYSETC_MINI_12864 #if IS_ULTIPANEL - #define LCD_PINS_D5 PE11 - #define LCD_PINS_D6 PE12 - #define LCD_PINS_D7 PE13 + #define LCD_PINS_D5 EXP1_05_PIN + #define LCD_PINS_D6 EXP1_04_PIN + #define LCD_PINS_D7 EXP1_03_PIN #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder #endif #endif - #endif // Alter timing for graphical display From 03396922abecd5c6cfee0bd0fe32a72c6f230d2e Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Wed, 17 Feb 2021 01:41:00 +0100 Subject: [PATCH 1026/1370] Fix/improve configs build script (#21086) --- Marlin/src/pins/pins.h | 2 + buildroot/bin/build_all_examples | 103 ++++++++++++++++++------------- buildroot/bin/build_example | 44 ++++++------- buildroot/bin/mftest | 3 +- 4 files changed, 83 insertions(+), 69 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 737c8869d1..62545037da 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -252,6 +252,8 @@ #include "mega/pins_WANHAO_ONEPLUS.h" // ATmega2560 env:mega2560 #elif MB(OVERLORD) #include "mega/pins_OVERLORD.h" // ATmega2560 env:mega2560 +#elif MB(HJC2560C_REV1) + #include "mega/pins_HJC2560C_REV1.h" // ATmega2560 env:mega2560 #elif MB(HJC2560C_REV2) #include "mega/pins_HJC2560C_REV2.h" // ATmega2560 env:mega2560 #elif MB(LEAPFROG_XEED2015) diff --git a/buildroot/bin/build_all_examples b/buildroot/bin/build_all_examples index 29256de69c..91870ab156 100755 --- a/buildroot/bin/build_all_examples +++ b/buildroot/bin/build_all_examples @@ -1,62 +1,81 @@ #!/usr/bin/env bash +# +# build_all_examples base_branch [resume_point] +# -echo "This script will attempt to build Marlin for all known configurations." -echo "In case of failure, the current configuration remains in your repository." -echo "To revert to your current version, run 'git checkout -f'." - -self=`basename "$0"` -HERE=`dirname "$0"` +GITREPO=https://github.com/MarlinFirmware/Configurations.git +STAT_FILE=./.pio/.buildall # Check dependencies -which curl 1>/dev/null 2>&1 || { echo "curl not found, please install it"; exit ; } -which git 1>/dev/null 2>&1 || { echo "git not found, please install it"; exit ; } -if [ -z "$1" ]; then - echo "" - echo "ERROR: " - echo " Expected parameter: $self base_branch [resume_point]" - echo " with:" - echo " base_branch The branch in the Configuration repository to use" - echo " resume_point If not empty, resume building from this board" +which curl 1>/dev/null 2>&1 || { echo "curl not found! Please install it."; exit ; } +which git 1>/dev/null 2>&1 || { echo "git not found! Please install it."; exit ; } +SED=$(command -v gsed 2>/dev/null || command -v sed 2>/dev/null) +[[ -z "$SED" ]] && { echo "No sed found, please install sed" ; exit 1 ; } + +SELF=`basename "$0"` +HERE=`dirname "$0"` + +# Check if called in the right location +[[ -e "Marlin/src" ]] || { echo -e "This script must be called from a Marlin working copy with:\n ./buildroot/bin/$SELF $1" ; exit ; } + +if [[ $# -lt 1 || $# -gt 2 ]]; then + echo "Usage: $SELF base_branch [resume_point] + base_branch - Configuration branch to download and build + resume_point - Configuration path to start from" exit fi -# Check if called in the right folder -if [ ! -e "Marlin/src" ]; then - echo "This script must be called from the root folder of a Marlin repository, please navigate to this folder and call:" - echo "buildroot/ci-check/$self $1" - exit +echo "This script downloads all Configurations and builds Marlin with each one." +echo "On failure the last-built configs will be left in your working copy." +echo "Restore your configs with 'git checkout -f' or 'git reset --hard HEAD'." + +# If -c is given start from the last attempted build +if [[ $1 == '-c' ]]; then + if [[ -f "$STAT_FILE" ]]; then + read BRANCH FIRST_CONF <"$STAT_FILE" + else + echo "Nothing to continue" + exit + fi +else + BRANCH=${1:-"import-2.0.x"} + FIRST_CONF=$2 fi # Check if the current repository has unmerged changes -if [ -z "$2" ]; then - git diff --quiet || { echo "Your current repository is not clean. Either commit your change or stash them, and re-run this script"; exit ; } +if [[ -z "$FIRST_CONF" ]]; then + git diff --quiet || { echo "The working copy is modified. Commit or stash changes before proceeding."; exit ; } else - echo "Resuming from $2" + echo "Resuming from $FIRST_CONF" fi -TMPDIR=`mktemp -d` +# Create a temporary folder inside .pio +TMP=./.pio/build-$BRANCH +[[ -d "$TMP" ]] || mkdir -p $TMP -# Ok, let's do our stuff now -# First extract the current temporary folder -echo "Fetching configuration repository" -if [ ! -e "$TMPDIR/README.md" ]; then - git clone --single-branch --branch "$1" https://github.com/MarlinFirmware/Configurations.git "$TMPDIR" || { echo "Failed to clone the configuration repository"; exit ; } - rm -r $TMPDIR/.git +# Download Configurations into the temporary folder +if [[ ! -e "$TMP/README.md" ]]; then + echo "Downloading Configurations from GitHub into $TMP" + git clone --depth=1 --single-branch --branch "$BRANCH" $GITREPO "$TMP" || { echo "Failed to clone the configuration repository"; exit ; } +else + echo "Using previously downloaded Configurations at $TMP" fi -echo -echo "Start building now..." -echo "=====================" +echo -e "Start building now...\n=====================" shopt -s nullglob -for config in $TMPDIR/config/examples/*/; do - [ -d "${config}" ] || continue - base=`basename "$config"` - if [ ! -z "$2" ] && [ "$2" != "$base" ]; then - echo "Skipping $base..." - continue - fi - "$HERE/build_example" "internal" "$TMPDIR" "$base" || { echo "Failed to build $base"; exit ; } +IFS=' +' +CONF_TREE=$( ls -d "$TMP"/config/examples/*/ "$TMP"/config/examples/*/*/ "$TMP"/config/examples/*/*/*/ "$TMP"/config/examples/*/*/*/*/ | grep -vE ".+\.(\w+)$" ) +for CONF in $CONF_TREE ; do + DIR=$( echo $CONF | sed "s|$TMP/config/examples/||" ) + [[ ! -z $FIRST_CONF ]] && [[ $FIRST_CONF != $DIR && "$FIRST_CONF/" != $DIR ]] && continue + unset FIRST_CONF + compgen -G "${CONF}Con*.h" > /dev/null || continue + echo -e "$BRANCH\n$DIR" >"$STAT_FILE" + "$HERE/build_example" "internal" "$TMP" "$DIR" || { echo "Failed to build $DIR"; exit ; } done -rm -r "$TMPDIR" +# Delete the temp folder and build state +[[ -e "$TMP/config/examples" ]] && rm -rf "$TMP" +rm "$STAT_FILE" diff --git a/buildroot/bin/build_example b/buildroot/bin/build_example index 8f2d9d3c33..3c19b7b626 100755 --- a/buildroot/bin/build_example +++ b/buildroot/bin/build_example @@ -1,35 +1,29 @@ #!/usr/bin/env bash +# +# build_example +# +# Usage: build_example internal config-home config-folder +# -if [ "$1" != "internal" ]; then - echo "Don't call this script directly, use build_all_examples instead." - exit 1 -fi - -SED=$(which gsed || which sed) -HERE=`dirname "$0"` +# Require 'internal' as the first argument +[[ "$1" == "internal" ]] || { echo "Don't call this script directly, use build_all_examples instead." ; exit 1 ; } echo "Testing $3:" -shopt -s nullglob -for sub in find $2/config/examples/$3 -type d; do - [[ -d $sub ]] || continue - base=`basename "$sub"` +SUB=$2/config/examples/$3 +[[ -d "$SUB" ]] || { echo "$SUB is not a good path" ; exit 1 ; } - if [[ ! -f $sub/Configuration.h ]] && [[ ! -f $sub/Configuration_adv.h ]]; then - echo "No configuration files found in $sub" - continue - fi +compgen -G "${SUB}Con*.h" > /dev/null || { echo "No configuration files found in $SUB" ; exit 1 ; } - echo "Getting configuration files from $sub" - cp "$2/config/default"/*.h Marlin/ - cp "$sub"/Configuration.h Marlin/ 2>/dev/null - cp "$sub"/Configuration_adv.h Marlin/ 2>/dev/null - cp "$sub"/_Bootscreen.h Marlin/ 2>/dev/null - cp "$sub"/_Statusscreen.h Marlin/ 2>/dev/null +echo "Getting configuration files from $SUB" +cp "$2/config/default"/*.h Marlin/ +cp "$SUB"/Configuration.h Marlin/ 2>/dev/null +cp "$SUB"/Configuration_adv.h Marlin/ 2>/dev/null +cp "$SUB"/_Bootscreen.h Marlin/ 2>/dev/null +cp "$SUB"/_Statusscreen.h Marlin/ 2>/dev/null - echo "Building the firmware now..." - echo "$HERE/mftest" -a || exit 1 -done +echo "Building the firmware now..." +HERE=`dirname "$0"` +$HERE/mftest -a || { echo "Failed"; exit 1; } echo "Success" -exit 0 diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 661566a88d..4626352f7a 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -6,7 +6,6 @@ # mftest [name] [index] [-y] Set config options and optionally build a test # -MFINFO=$(mfinfo) || exit 1 [[ -d Marlin/src ]] || { echo "Please 'cd' to the Marlin repo root." ; exit 1 ; } perror() { echo -e "$0: \033[0;31m$1 -- $2\033[0m" ; } @@ -37,7 +36,7 @@ env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 tee TESTPATH=buildroot/tests -STATE_FILE=$( echo ./.pio/.mftestrc ) +STATE_FILE="./.pio/.mftestrc" SED=$(which gsed || which sed) shopt -s extglob nocasematch From 27248161525a4e2c9256e99e5b533c09349fe4a4 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 17 Feb 2021 15:28:03 +1300 Subject: [PATCH 1027/1370] Swap Trigorilla Pro Z_MIN / MAX endstop pins (#21095) --- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index e09bbff324..ed70d8d28f 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -58,8 +58,12 @@ // #define X_STOP_PIN PG10 #define Y_STOP_PIN PA12 -#define Z_MAX_PIN PA14 -#define Z_MIN_PIN PA13 +#ifndef Z_MIN_PIN + #define Z_MIN_PIN PA14 +#endif +#ifndef Z_MAX_PIN + #define Z_MAX_PIN PA13 +#endif // // Steppers From 2e040d03dffac181def5a6962ec5826e6e0b6aee Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Tue, 16 Feb 2021 21:29:55 -0500 Subject: [PATCH 1028/1370] GT2560 v4.1B, YHCB2004 SPI character LCD (#21091) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 8 +++ Marlin/src/inc/Conditionals_LCD.h | 4 ++ Marlin/src/inc/SanityCheck.h | 5 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 4 ++ Marlin/src/lcd/HD44780/marlinui_HD44780.h | 5 ++ Marlin/src/pins/mega/pins_GT2560_V3.h | 69 +++++++++++++------ Marlin/src/pins/mega/pins_GT2560_V3_A20.h | 4 +- Marlin/src/pins/mega/pins_GT2560_V3_MC2.h | 6 +- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 3 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 3 +- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 6 +- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 5 +- platformio.ini | 1 + 14 files changed, 85 insertions(+), 40 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 428e899b33..3234a73eda 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1953,6 +1953,14 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// GT2560 (YHCB2004) LCD Display +// +// Requires Testato, Koepel softwarewire library and +// Andriy Golovnya's LiquidCrystal_AIP31068 library. +// +//#define YHCB2004 + // // Original RADDS LCD Display+Encoder+SDCardReader // http://doku.radds.org/dokumentation/lcd-display/ diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 17f427a8dd..7ac4fe4c31 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -50,6 +50,10 @@ #define MINIPANEL +#elif ENABLED(YHCB2004) + + #define IS_ULTIPANEL 1 + #elif ENABLED(CARTESIO_UI) #define DOGLCD diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d5d94b178e..c1b0290ac1 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2296,8 +2296,6 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if 1 < 0 \ + ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) \ + ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) \ - + ENABLED(ULTIPANEL) \ - + ENABLED(ULTRA_LCD) \ + (ENABLED(U8GLIB_SSD1306) && DISABLED(IS_U8GLIB_SSD1306)) \ + (ENABLED(MINIPANEL) && NONE(MKS_MINI_12864, ENDER2_STOCKDISPLAY)) \ + (ENABLED(MKS_MINI_12864) && DISABLED(MKS_LCD12864)) \ @@ -2346,6 +2344,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(U8GLIB_SH1106_EINSTART) \ + ENABLED(ULTI_CONTROLLER) \ + ENABLED(ULTIMAKERCONTROLLER) \ + + ENABLED(ULTIPANEL) \ + + ENABLED(ULTRA_LCD) \ + + ENABLED(YHCB2004) \ + ENABLED(ZONESTAR_LCD) #error "Please select only one LCD controller option." #endif diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 635751b3f5..15b3d8bfb3 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -93,6 +93,10 @@ LCD_CLASS lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); +#elif ENABLED(YHCB2004) + + LCD_CLASS lcd(YHCB2004_CLK, 20, 4, YHCB2004_MOSI, YHCB2004_MISO); // CLK, cols, rows, MOSI, MISO + #else // Standard direct-connected LCD implementations diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.h b/Marlin/src/lcd/HD44780/marlinui_HD44780.h index 604d26a029..62c0c76202 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.h +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.h @@ -90,6 +90,11 @@ #include #define LCD_CLASS LiquidCrystal_I2C +#elif ENABLED(YHCB2004) + + #include + #define LCD_CLASS LiquidCrystal_AIP31068_SPI + #else // Standard directly connected LCD implementations diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 606debd1b0..586b3b12ec 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -22,7 +22,7 @@ #pragma once /** - * GT2560 RevB + GT2560 V3.0 + GT2560 V3.1 + GT2560 V4.0 pin assignment + * Geeetech GT2560 RevB + GT2560 3.0/3.1 + GT2560 4.0/4.1 pin assignments */ #if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) @@ -30,13 +30,13 @@ #endif #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "GT2560 V3.0" + #define BOARD_INFO_NAME "GT2560 RevB/3.x/4.x" #endif // // Servos // -#define SERVO0_PIN 11 //13 untested 3Dtouch +#define SERVO0_PIN 11 // 13 untested 3Dtouch // // Limit Switches @@ -142,7 +142,10 @@ #define SDSS 53 #define LED_PIN 13 // Use 6 (case light) for external LED. 13 is internal (yellow) LED. #define PS_ON_PIN 12 -#define SUICIDE_PIN 54 // This pin must be enabled at boot to keep power flowing + +#if NUM_RUNOUT_SENSORS < 3 + #define SUICIDE_PIN 54 // This pin must be enabled at boot to keep power flowing +#endif #ifndef CASE_LIGHT_PIN #define CASE_LIGHT_PIN 6 // 21 @@ -153,26 +156,48 @@ // #define BEEPER_PIN 18 -#ifndef LCD_PINS_RS - #define LCD_PINS_RS 20 -#endif -#ifndef LCD_PINS_ENABLE - #define LCD_PINS_ENABLE 17 -#endif -#ifndef LCD_PINS_D4 - #define LCD_PINS_D4 16 -#endif -#ifndef LCD_PINS_D5 - #define LCD_PINS_D5 21 -#endif -#ifndef LCD_PINS_D6 - #define LCD_PINS_D6 5 -#endif -#ifndef LCD_PINS_D7 - #define LCD_PINS_D7 36 +#if ENABLED(YHCB2004) + #ifndef YHCB2004_SCK + #define YHCB2004_SCK 5 + #endif + #ifndef YHCB2004_MOSI + #define YHCB2004_MOSI 21 + #endif + #ifndef YHCB2004_MISO + #define YHCB2004_MISO 36 + #endif +#elif HAS_WIRED_LCD + #ifndef LCD_PINS_RS + #define LCD_PINS_RS 20 + #endif + #ifndef LCD_PINS_ENABLE + #define LCD_PINS_ENABLE 17 + #endif + #ifndef LCD_PINS_D4 + #define LCD_PINS_D4 16 + #endif + #ifndef LCD_PINS_D5 + #define LCD_PINS_D5 21 + #endif + #ifndef LCD_PINS_D6 + #define LCD_PINS_D6 5 + #endif + #ifndef LCD_PINS_D7 + #define LCD_PINS_D7 36 + #endif #endif -#if IS_NEWPANEL +#if ENABLED(YHCB2004) + #ifndef BTN_EN1 + #define BTN_EN1 16 + #endif + #ifndef BTN_EN2 + #define BTN_EN2 17 + #endif + #ifndef BTN_ENC + #define BTN_ENC 19 + #endif +#elif IS_NEWPANEL #ifndef BTN_EN1 #define BTN_EN1 42 #endif diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h index c445f5b241..986dd1cb04 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h @@ -22,7 +22,7 @@ #pragma once /** - * Geeetech A20M pin assignment + * Geeetech A20M board pin assignments */ #define LCD_PINS_RS 5 @@ -30,7 +30,7 @@ #define LCD_PINS_D4 21 #define LCD_PINS_D7 6 -#define SPEAKER // The speaker can produce tones +#define SPEAKER // The speaker can produce tones #if IS_NEWPANEL #define BTN_EN1 16 diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h b/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h index 26721df364..6b22b4139b 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h @@ -21,9 +21,9 @@ */ #pragma once -/***************************************************************** - * GT2560 V3.0 pin assignment (for Mecreator 2) - *****************************************************************/ +/** + * Geeetech GT2560 V 3.0 board pin assignments (for Mecreator 2) + */ #define BOARD_INFO_NAME "GT2560 V3.0 (MC2)" diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index d507d20ca7..dc4b78d9c1 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -22,7 +22,7 @@ #pragma once /** - * HJC2560-C Rev2.x pin assignments + * Geeetech HJC2560-C Rev 2.x board pin assignments */ #if NOT_TARGET(__AVR_ATmega2560__) diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index 5b97e7f202..f67dc85b40 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -22,8 +22,7 @@ #pragma once /** - * 24 May 2018 - @chepo for STM32F103VET6 - * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf + * Geeetech GTM32 Mini board pin assignments */ #if NOT_TARGET(__STM32F1__) diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 173eb67f0d..27b0362758 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -22,8 +22,7 @@ #pragma once /** - * 24 May 2018 - @chepo for STM32F103VET6 - * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf + * Geeetech GTM32 Mini A30 board pin assignments */ #if NOT_TARGET(__STM32F1__) diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index 5b97e7f202..d4ab2ff3e5 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -22,15 +22,15 @@ #pragma once /** - * 24 May 2018 - @chepo for STM32F103VET6 - * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf + * Geeetech GTM32 Pro VB/VD board pin assignments + * http://www.geeetech.com/wiki/index.php/File:Hardware_GTM32_PRO_VB.pdf */ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif -#define BOARD_INFO_NAME "GTM32 Pro VB" +#define BOARD_INFO_NAME "GTM32 Pro VB/VD" #define DEFAULT_MACHINE_NAME "STM32F103VET6" #define BOARD_NO_NATIVE_USB diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index b4a34a4b1e..8e96327816 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -22,15 +22,14 @@ #pragma once /** - * 24 May 2018 - @chepo for STM32F103VET6 - * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf + * Geeetech GTM32 Rev. B board pin assignments */ #if NOT_TARGET(__STM32F1__) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #endif -#define BOARD_INFO_NAME "GTM32 Pro VB" +#define BOARD_INFO_NAME "GTM32 Rev B" #define DEFAULT_MACHINE_NAME "M201" #define BOARD_NO_NATIVE_USB diff --git a/platformio.ini b/platformio.ini index bcf90df0f2..15fbf220d4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -219,6 +219,7 @@ lib_deps = # Feature Dependencies # [features] +YHCB2004 = red-scorp/LiquidCrystal_AIP31068@^1.0.4, red-scorp/SoftSPIB@^1.1.1 HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip src_filter=+ extra_scripts=download_mks_assets.py From 27721c564fab391b2f67b2fb34a6c5112de6fad4 Mon Sep 17 00:00:00 2001 From: jbuck2005 <59450931+jbuck2005@users.noreply.github.com> Date: Tue, 16 Feb 2021 21:30:54 -0500 Subject: [PATCH 1029/1370] Note FAN2_PIN silkscreen label (#21087) --- Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 28cfa74aaa..ab7f5126ff 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -243,7 +243,7 @@ #define HEATER_BED_PIN PD12 // Hotbed #define FAN_PIN PC8 // Fan0 #define FAN1_PIN PE5 // Fan1 -#define FAN2_PIN PE6 +#define FAN2_PIN PE6 // Fan2 #ifndef E0_AUTO_FAN_PIN #define E0_AUTO_FAN_PIN FAN1_PIN From a09d7a59b4d70f3171202bacff48db48553e39ff Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 16 Feb 2021 21:13:53 -0600 Subject: [PATCH 1030/1370] Fix IDEX broken endstop test (#21110) --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/module/endstops.h | 2 +- Marlin/src/module/motion.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 2de029a08b..12f85f7054 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -96,7 +96,7 @@ }; #endif - do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * home_dir(Y_AXIS), fr_mm_s); + do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * Y_HOME_DIR, fr_mm_s); endstops.validate_homing_move(); diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 05936a6bf3..c0cc9cdb8e 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -38,7 +38,7 @@ enum EndstopEnum : char { Z4_MIN, Z4_MAX }; -#define X_ENDSTOP (X_HOME_DIR < 0 ? X_MIN : X_MAX) +#define X_ENDSTOP (x_home_dir(active_extruder) < 0 ? X_MIN : X_MAX) #define Y_ENDSTOP (Y_HOME_DIR < 0 ? Y_MIN : Y_MAX) #define Z_ENDSTOP (Z_HOME_DIR < 0 ? TERN(HOMING_Z_WITH_PROBE, Z_MIN, Z_MIN_PROBE) : Z_MAX) diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 887da1aa18..328bfe018d 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -450,7 +450,7 @@ FORCE_INLINE void set_all_unhomed() { axis_homed = axis_tr FORCE_INLINE void set_duplication_enabled(const bool dupe) { extruder_duplication_enabled = dupe; } #endif - FORCE_INLINE int x_home_dir(const uint8_t) { return home_dir(X_AXIS); } + FORCE_INLINE int x_home_dir(const uint8_t) { return X_HOME_DIR; } #endif From 7e8b02145c093a9a3d0f304893706caeff0f6c34 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Tue, 16 Feb 2021 22:23:54 -0500 Subject: [PATCH 1031/1370] YHCB2004 followup (#21111) --- Marlin/src/pins/mega/pins_GT2560_V3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 586b3b12ec..66b2804ff6 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -157,8 +157,8 @@ #define BEEPER_PIN 18 #if ENABLED(YHCB2004) - #ifndef YHCB2004_SCK - #define YHCB2004_SCK 5 + #ifndef YHCB2004_CLK + #define YHCB2004_CLK 5 #endif #ifndef YHCB2004_MOSI #define YHCB2004_MOSI 21 From c4fcf8bfd70fea25d28fb8c7025b0f9c2496aaa5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Feb 2021 17:04:51 -0600 Subject: [PATCH 1032/1370] Fixes for MP_SCARA (#21113) Co-Authored-By: svsergo <52426708+svsergo@users.noreply.github.com> --- Marlin/src/module/scara.cpp | 111 ++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 61 deletions(-) diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index e4b2f0b75c..565a502d5b 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -47,19 +47,22 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { #if ENABLED(MORGAN_SCARA) // MORGAN_SCARA uses arm angles for AB home position - // SERIAL_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); + //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); inverse_kinematics(homeposition); forward_kinematics_SCARA(delta.a, delta.b); current_position[axis] = cartes[axis]; #else // MP_SCARA uses a Cartesian XY home position - // SERIAL_ECHOPGM("homeposition"); - // SERIAL_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); - current_position[axis] = homeposition[axis]; + //DEBUG_ECHOPGM("homeposition"); + //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); + delta.a = SCARA_OFFSET_THETA1; + delta.b = SCARA_OFFSET_THETA2; + forward_kinematics_SCARA(delta.a, delta.b); + current_position[axis] = cartes[axis]; #endif - // SERIAL_ECHOPGM("Cartesian"); - // SERIAL_ECHOLNPAIR_P(SP_X_LBL, current_position.x, SP_Y_LBL, current_position.y); + //DEBUG_ECHOPGM("Cartesian"); + //DEBUG_ECHOLNPAIR_P(SP_X_LBL, current_position.x, SP_Y_LBL, current_position.y); update_software_endstops(axis); } } @@ -75,14 +78,14 @@ void forward_kinematics_SCARA(const float &a, const float &b) { const float a_sin = sin(RADIANS(a)) * L1, a_cos = cos(RADIANS(a)) * L1, - b_sin = sin(RADIANS(b)) * L2, - b_cos = cos(RADIANS(b)) * L2; + b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, + b_cos = cos(RADIANS(b + TERN0(MP_SCARA, a))) * L2; cartes.set(a_cos + b_cos + scara_offset.x, // theta - a_sin + b_sin + scara_offset.y); // theta+phi + a_sin + b_sin + scara_offset.y); // phi /* - SERIAL_ECHOLNPAIR( + DEBUG_ECHOLNPAIR( "SCARA FK Angle a=", a, " b=", b, " a_sin=", a_sin, @@ -90,74 +93,60 @@ void forward_kinematics_SCARA(const float &a, const float &b) { " b_sin=", b_sin, " b_cos=", b_cos ); - SERIAL_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); + DEBUG_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); //*/ } +/** + * SCARA Inverse Kinematics. Results in 'delta'. + * + * See https://reprap.org/forum/read.php?185,283327 + * + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ void inverse_kinematics(const xyz_pos_t &raw) { + float C2, S2, SK1, SK2, THETA, PSI; - #if ENABLED(MORGAN_SCARA) - /** - * Morgan SCARA Inverse Kinematics. Results in 'delta'. - * - * See https://reprap.org/forum/read.php?185,283327 - * - * Maths and first version by QHARLEY. - * Integrated into Marlin and slightly restructured by Joachim Cerny. - */ - float C2, S2, SK1, SK2, THETA, PSI; + // Translate SCARA to standard XY with scaling factor + const xy_pos_t spos = raw - scara_offset; - // Translate SCARA to standard XY with scaling factor - const xy_pos_t spos = raw - scara_offset; + const float H2 = HYPOT2(spos.x, spos.y); + if (L1 == L2) + C2 = H2 / L1_2_2 - 1; + else + C2 = (H2 - (L1_2 + L2_2)) / (2.0f * L1 * L2); - const float H2 = HYPOT2(spos.x, spos.y); - if (L1 == L2) - C2 = H2 / L1_2_2 - 1; - else - C2 = (H2 - (L1_2 + L2_2)) / (2.0f * L1 * L2); + LIMIT(C2, -1, 1); - S2 = SQRT(1.0f - sq(C2)); + S2 = SQRT(1.0f - sq(C2)); - // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End - SK1 = L1 + L2 * C2; + // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End + SK1 = L1 + L2 * C2; - // Rotated Arm2 gives the distance from Arm1 to Arm2 - SK2 = L2 * S2; + // Rotated Arm2 gives the distance from Arm1 to Arm2 + SK2 = L2 * S2; - // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow - THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); + // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow + THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); - // Angle of Arm2 - PSI = ATAN2(S2, C2); + // Angle of Arm2 + PSI = ATAN2(S2, C2); - delta.set(DEGREES(THETA), DEGREES(THETA + PSI), raw.z); + delta.set(DEGREES(THETA), DEGREES(PSI + TERN0(MORGAN_SCARA, THETA)), raw.z); - /* - DEBUG_POS("SCARA IK", raw); - DEBUG_POS("SCARA IK", delta); - SERIAL_ECHOLNPAIR(" SCARA (x,y) ", sx, ",", sy, " C2=", C2, " S2=", S2, " Theta=", THETA, " Phi=", PHI); - //*/ - - #else // MP_SCARA - - const float x = raw.x, y = raw.y, c = HYPOT(x, y), - THETA3 = ATAN2(y, x), - THETA1 = THETA3 + ACOS((sq(c) + sq(L1) - sq(L2)) / (2.0f * c * L1)), - THETA2 = THETA3 - ACOS((sq(c) + sq(L2) - sq(L1)) / (2.0f * c * L2)); - - delta.set(DEGREES(THETA1), DEGREES(THETA2), raw.z); - - /* - DEBUG_POS("SCARA IK", raw); - DEBUG_POS("SCARA IK", delta); - SERIAL_ECHOLNPAIR(" SCARA (x,y) ", x, ",", y," Theta1=", THETA1, " Theta2=", THETA2); - //*/ - - #endif // MP_SCARA + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + DEBUG_ECHOLNPAIR(" SCARA (x,y) ", sx, ",", sy, " C2=", C2, " S2=", S2, " Theta=", THETA, " Psi=", PSI); + //*/ } void scara_report_positions() { - SERIAL_ECHOLNPAIR("SCARA Theta:", planner.get_axis_position_degrees(A_AXIS), " Psi+Theta:", planner.get_axis_position_degrees(B_AXIS)); + SERIAL_ECHOLNPAIR( + "SCARA Theta:", planner.get_axis_position_degrees(A_AXIS), + " Psi" TERN_(MORGAN_SCARA, "+Theta") ":", planner.get_axis_position_degrees(B_AXIS) + ); SERIAL_EOL(); } From bdb67b4397f648c012a87a0e741c69a19082c6e1 Mon Sep 17 00:00:00 2001 From: espr14 Date: Thu, 18 Feb 2021 06:22:29 +0100 Subject: [PATCH 1033/1370] Fix cleaning_buffer_counter check (#21115) --- Marlin/src/module/planner.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 541aed943e..7fcf37e044 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1690,13 +1690,15 @@ bool Planner::_buffer_steps(const xyze_long_t &target , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters ) { - // If we are cleaning, do not accept queuing of movements - if (cleaning_buffer_counter) return false; - // Wait for the next available block uint8_t next_buffer_head; block_t * const block = get_next_free_block(next_buffer_head); + // If we are cleaning, do not accept queuing of movements + // This must be after get_next_free_block() because it calls idle() + // where cleaning_buffer_counter can be changed + if (cleaning_buffer_counter) return false; + // Fill the block with the specified movement if (!_populate_block(block, false, target #if HAS_POSITION_FLOAT From 3f1a8c2a1c835c7a5a38f9b78c263d7aa9fb8f2e Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 21 Feb 2021 15:14:47 +1300 Subject: [PATCH 1034/1370] Fix G29 missing defines (#21145) Co-authored-by: ellensp --- Marlin/src/module/probe.cpp | 8 -------- Marlin/src/module/probe.h | 9 +++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 8cda039db6..6df115225e 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -335,14 +335,6 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #define PROBING_BED_TEMP 0 #endif #endif - #if ENABLED(PREHEAT_BEFORE_LEVELING) - #ifndef LEVELING_NOZZLE_TEMP - #define LEVELING_NOZZLE_TEMP 0 - #endif - #ifndef LEVELING_BED_TEMP - #define LEVELING_BED_TEMP 0 - #endif - #endif /** * Do preheating as required before leveling or probing. diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index d28cdff53a..c8b214370c 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -44,6 +44,15 @@ #define PROBE_TRIGGERED() (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) #endif +#if ENABLED(PREHEAT_BEFORE_LEVELING) + #ifndef LEVELING_NOZZLE_TEMP + #define LEVELING_NOZZLE_TEMP 0 + #endif + #ifndef LEVELING_BED_TEMP + #define LEVELING_BED_TEMP 0 + #endif +#endif + class Probe { public: From 61753bb5e3d9035182a4a0a214c3f0ebbd180023 Mon Sep 17 00:00:00 2001 From: kpishere Date: Sat, 20 Feb 2021 21:20:55 -0500 Subject: [PATCH 1035/1370] Fix SPI on SMART RAMPS with mega2560 (#21128) --- Marlin/src/lcd/dogm/marlinui_DOGM.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index e5229cd088..e5862d670f 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -88,7 +88,8 @@ #define SMART_RAMPS MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF) #define U8G_CLASS U8GLIB_64128N_2X_HAL // 4 stripes (HW-SPI) - #if SMART_RAMPS || DOGLCD_SCK != SD_SCK_PIN || DOGLCD_MOSI != SD_MOSI_PIN + + #if (SMART_RAMPS && defined(__SAM3X8E__)) || DOGLCD_SCK != SD_SCK_PIN || DOGLCD_MOSI != SD_MOSI_PIN #define FORCE_SOFT_SPI // SW-SPI #endif From dc11874abe4f683d3a436693c0ec5900c2c2afbc Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sun, 21 Feb 2021 03:22:20 +0100 Subject: [PATCH 1036/1370] Postmortem Debugging to serial port (#20492) --- Marlin/Configuration_adv.h | 7 + Marlin/src/HAL/AVR/inc/SanityCheck.h | 7 + Marlin/src/HAL/DUE/DebugMonitor.cpp | 342 ---------------- Marlin/src/HAL/DUE/HAL.cpp | 3 + Marlin/src/HAL/DUE/HAL_MinSerial.cpp | 91 +++++ Marlin/src/HAL/DUE/inc/SanityCheck.h | 2 +- Marlin/src/HAL/ESP32/inc/SanityCheck.h | 6 +- Marlin/src/HAL/LINUX/inc/SanityCheck.h | 6 +- Marlin/src/HAL/LPC1768/DebugMonitor.cpp | 322 --------------- Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp | 50 +++ Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 4 +- Marlin/src/HAL/LPC1768/main.cpp | 8 +- Marlin/src/HAL/STM32/HAL.cpp | 4 + Marlin/src/HAL/STM32/HAL_MinSerial.cpp | 152 +++++++ Marlin/src/HAL/STM32/inc/SanityCheck.h | 4 +- Marlin/src/HAL/STM32F1/HAL.cpp | 3 + Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp | 118 ++++++ Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 +- Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h | 6 +- Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h | 6 +- Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h | 6 +- Marlin/src/HAL/shared/HAL_MinSerial.cpp | 33 ++ Marlin/src/HAL/shared/HAL_MinSerial.h | 79 ++++ Marlin/src/HAL/shared/backtrace/backtrace.cpp | 28 +- Marlin/src/HAL/shared/backtrace/backtrace.h | 3 + .../src/HAL/shared/backtrace/unwmemaccess.cpp | 72 ++-- .../shared/cpu_exception/exception_arm.cpp | 379 ++++++++++++++++++ .../shared/cpu_exception/exception_hook.cpp | 28 ++ .../HAL/shared/cpu_exception/exception_hook.h | 54 +++ Marlin/src/MarlinCore.cpp | 3 + Marlin/src/gcode/gcode_d.cpp | 21 +- buildroot/share/PlatformIO/scripts/exc.S | 104 +++++ .../scripts/fix_framework_weakness.py | 29 ++ platformio.ini | 42 +- 34 files changed, 1286 insertions(+), 740 deletions(-) delete mode 100644 Marlin/src/HAL/DUE/DebugMonitor.cpp create mode 100644 Marlin/src/HAL/DUE/HAL_MinSerial.cpp delete mode 100644 Marlin/src/HAL/LPC1768/DebugMonitor.cpp create mode 100644 Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp create mode 100644 Marlin/src/HAL/STM32/HAL_MinSerial.cpp create mode 100644 Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp create mode 100644 Marlin/src/HAL/shared/HAL_MinSerial.cpp create mode 100644 Marlin/src/HAL/shared/HAL_MinSerial.h create mode 100644 Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp create mode 100644 Marlin/src/HAL/shared/cpu_exception/exception_hook.cpp create mode 100644 Marlin/src/HAL/shared/cpu_exception/exception_hook.h create mode 100644 buildroot/share/PlatformIO/scripts/exc.S create mode 100644 buildroot/share/PlatformIO/scripts/fix_framework_weakness.py diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f615a54671..987ac293b2 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3732,3 +3732,10 @@ // Enable Marlin dev mode which adds some special commands //#define MARLIN_DEV_MODE + +/** + * Postmortem Debugging captures misbehavior and outputs the CPU status and backtrace to serial. + * When running in the debugger it will break for debugging. This is useful to help understand + * a crash from a remote location. Requires ~400 bytes of SRAM and 5Kb of flash. + */ +//#define POSTMORTEM_DEBUGGING diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h index 731cf92865..51ba247953 100644 --- a/Marlin/src/HAL/AVR/inc/SanityCheck.h +++ b/Marlin/src/HAL/AVR/inc/SanityCheck.h @@ -56,3 +56,10 @@ #if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS) #error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue." #endif + +/** + * Postmortem debugging + */ +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not supported on AVR boards." +#endif diff --git a/Marlin/src/HAL/DUE/DebugMonitor.cpp b/Marlin/src/HAL/DUE/DebugMonitor.cpp deleted file mode 100644 index 79759151d8..0000000000 --- a/Marlin/src/HAL/DUE/DebugMonitor.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../core/macros.h" -#include "../../core/serial.h" - -#include "../shared/backtrace/unwinder.h" -#include "../shared/backtrace/unwmemaccess.h" - -#include - -// Debug monitor that dumps to the Programming port all status when -// an exception or WDT timeout happens - And then resets the board - -// All the Monitor routines must run with interrupts disabled and -// under an ISR execution context. That is why we cannot reuse the -// Serial interrupt routines or any C runtime, as we don't know the -// state we are when running them - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() __asm__ volatile("": : :"memory"); - -// (re)initialize UART0 as a monitor output to 250000,n,8,1 -static void TXBegin() { - - // Disable UART interrupt in NVIC - NVIC_DisableIRQ( UART_IRQn ); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); - - // Disable clock - pmc_disable_periph_clk( ID_UART ); - - // Configure PMC - pmc_enable_periph_clk( ID_UART ); - - // Disable PDC channel - UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; - - // Reset and disable receiver and transmitter - UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; - - // Configure mode: 8bit, No parity, 1 bit stop - UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; - - // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds - UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4)); - - // Enable receiver and transmitter - UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; -} - -// Send character through UART with no interrupts -static void TX(char c) { - while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); }; - UART->UART_THR = c; -} - -// Send String through UART -static void TX(const char* s) { - while (*s) TX(*s++); -} - -static void TXDigit(uint32_t d) { - if (d < 10) TX((char)(d+'0')); - else if (d < 16) TX((char)(d+'A'-10)); - else TX('?'); -} - -// Send Hex number thru UART -static void TXHex(uint32_t v) { - TX("0x"); - for (uint8_t i = 0; i < 8; i++, v <<= 4) - TXDigit((v >> 28) & 0xF); -} - -// Send Decimal number thru UART -static void TXDec(uint32_t v) { - if (!v) { - TX('0'); - return; - } - - char nbrs[14]; - char *p = &nbrs[0]; - while (v != 0) { - *p++ = '0' + (v % 10); - v /= 10; - } - do { - p--; - TX(*p); - } while (p != &nbrs[0]); -} - -// Dump a backtrace entry -static bool UnwReportOut(void* ctx, const UnwReport* bte) { - int* p = (int*)ctx; - - (*p)++; - TX('#'); TXDec(*p); TX(" : "); - TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); - TX('+'); TXDec(bte->address - bte->function); - TX(" PC:");TXHex(bte->address); TX('\n'); - return true; -} - -#ifdef UNW_DEBUG - void UnwPrintf(const char* format, ...) { - char dest[256]; - va_list argptr; - va_start(argptr, format); - vsprintf(dest, format, argptr); - va_end(argptr); - TX(&dest[0]); - } -#endif - -/* Table of function pointers for passing to the unwinder */ -static const UnwindCallbacks UnwCallbacks = { - UnwReportOut, - UnwReadW, - UnwReadH, - UnwReadB - #ifdef UNW_DEBUG - , UnwPrintf - #endif -}; - -/** - * HardFaultHandler_C: - * This is called from the HardFault_HandlerAsm with a pointer the Fault stack - * as the parameter. We can then read the values from the stack and place them - * into local variables for ease of reading. - * We then read the various Fault Status and Address Registers to help decode - * cause of the fault. - * The function ends with a BKPT instruction to force control back into the debugger - */ -extern "C" -void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { - - static const char* causestr[] = { - "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" - }; - - UnwindFrame btf; - - // Dump report to the Programming port (interrupts are DISABLED) - TXBegin(); - TX("\n\n## Software Fault detected ##\n"); - TX("Cause: "); TX(causestr[cause]); TX('\n'); - - TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); - TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); - TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); - TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); - TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); - TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); - TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); - TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); - - // Configurable Fault Status Register - // Consists of MMSR, BFSR and UFSR - TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); - - // Hard Fault Status Register - TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); - - // Debug Fault Status Register - TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); - - // Auxiliary Fault Status Register - TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); - - // Read the Fault Address Registers. These may not contain valid values. - // Check BFARVALID/MMARVALID to see if they are valid values - // MemManage Fault Address Register - TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); - - // Bus Fault Address Register - TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); - - TX("ExcLR: "); TXHex(lr); TX('\n'); - TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); - - btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer - btf.fp = btf.sp; - btf.lr = ((unsigned long)sp[5]); - btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it - - // Perform a backtrace - TX("\nBacktrace:\n\n"); - int ctr = 0; - UnwindStart(&btf, &UnwCallbacks, &ctr); - - // Disable all NVIC interrupts - NVIC->ICER[0] = 0xFFFFFFFF; - NVIC->ICER[1] = 0xFFFFFFFF; - - // Relocate VTOR table to default position - SCB->VTOR = 0; - - // Disable USB - otg_disable(); - - // Restart watchdog - WDT_Restart(WDT); - - // Reset controller - NVIC_SystemReset(); - for (;;) WDT_Restart(WDT); -} - -__attribute__((naked)) void NMI_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#0") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void HardFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#1") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void MemManage_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#2") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void BusFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#3") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void UsageFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#4") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void DebugMon_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#5") - A("b HardFault_HandlerC") - ); -} - -/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ -__attribute__((naked)) void WDT_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#6") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void RSTC_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#7") - A("b HardFault_HandlerC") - ); -} - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index c15adee0c7..034b86ccb0 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -40,6 +40,8 @@ uint16_t HAL_adc_result; // Public functions // ------------------------ +TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); + // HAL initialization task void HAL_init() { // Initialize the USB stack @@ -47,6 +49,7 @@ void HAL_init() { OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up #endif usb_task_init(); + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler } // HAL idle task diff --git a/Marlin/src/HAL/DUE/HAL_MinSerial.cpp b/Marlin/src/HAL/DUE/HAL_MinSerial.cpp new file mode 100644 index 0000000000..93c4ed67d6 --- /dev/null +++ b/Marlin/src/HAL/DUE/HAL_MinSerial.cpp @@ -0,0 +1,91 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +#include "../shared/HAL_MinSerial.h" + +#include + +static void TXBegin() { + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( UART_IRQn ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable clock + pmc_disable_periph_clk( ID_UART ); + + // Configure PMC + pmc_enable_periph_clk( ID_UART ); + + // Disable PDC channel + UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + // Reset and disable receiver and transmitter + UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; + + // Configure mode: 8bit, No parity, 1 bit stop + UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; + + // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds + UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4)); + + // Enable receiver and transmitter + UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; +} + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); +static void TX(char c) { + while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); }; + UART->UART_THR = c; +} + +void install_min_serial() { + HAL_min_serial_init = &TXBegin; + HAL_min_serial_out = &TX; +} + +#if DISABLED(DYNAMIC_VECTORTABLE) +extern "C" { + __attribute__((naked)) void JumpHandler_ASM() { + __asm__ __volatile__ ( + "b CommonHandler_ASM\n" + ); + } + void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler(); +} +#endif + +#endif // POSTMORTEM_DEBUGGING +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h index 26fb44f398..87b09cf292 100644 --- a/Marlin/src/HAL/DUE/inc/SanityCheck.h +++ b/Marlin/src/HAL/DUE/inc/SanityCheck.h @@ -57,5 +57,5 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on the DUE platform." #endif diff --git a/Marlin/src/HAL/ESP32/inc/SanityCheck.h b/Marlin/src/HAL/ESP32/inc/SanityCheck.h index f57a6c5910..8bbc68d871 100644 --- a/Marlin/src/HAL/ESP32/inc/SanityCheck.h +++ b/Marlin/src/HAL/ESP32/inc/SanityCheck.h @@ -30,9 +30,13 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on ESP32." #endif #if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT) #error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT." #endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on ESP32." +#endif diff --git a/Marlin/src/HAL/LINUX/inc/SanityCheck.h b/Marlin/src/HAL/LINUX/inc/SanityCheck.h index 84167c97a1..45bb2662ac 100644 --- a/Marlin/src/HAL/LINUX/inc/SanityCheck.h +++ b/Marlin/src/HAL/LINUX/inc/SanityCheck.h @@ -35,5 +35,9 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on LINUX." +#endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on LINUX." #endif diff --git a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp b/Marlin/src/HAL/LPC1768/DebugMonitor.cpp deleted file mode 100644 index 783b10cfac..0000000000 --- a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../core/macros.h" -#include "../../core/serial.h" -#include - -#include "../shared/backtrace/unwinder.h" -#include "../shared/backtrace/unwmemaccess.h" -#include "watchdog.h" -#include - - -// Debug monitor that dumps to the Programming port all status when -// an exception or WDT timeout happens - And then resets the board - -// All the Monitor routines must run with interrupts disabled and -// under an ISR execution context. That is why we cannot reuse the -// Serial interrupt routines or any C runtime, as we don't know the -// state we are when running them - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() __asm__ volatile("": : :"memory"); - -// (re)initialize UART0 as a monitor output to 250000,n,8,1 -static void TXBegin() { -} - -// Send character through UART with no interrupts -static void TX(char c) { - _DBC(c); -} - -// Send String through UART -static void TX(const char* s) { - while (*s) TX(*s++); -} - -static void TXDigit(uint32_t d) { - if (d < 10) TX((char)(d+'0')); - else if (d < 16) TX((char)(d+'A'-10)); - else TX('?'); -} - -// Send Hex number thru UART -static void TXHex(uint32_t v) { - TX("0x"); - for (uint8_t i = 0; i < 8; i++, v <<= 4) - TXDigit((v >> 28) & 0xF); -} - -// Send Decimal number thru UART -static void TXDec(uint32_t v) { - if (!v) { - TX('0'); - return; - } - - char nbrs[14]; - char *p = &nbrs[0]; - while (v != 0) { - *p++ = '0' + (v % 10); - v /= 10; - } - do { - p--; - TX(*p); - } while (p != &nbrs[0]); -} - -// Dump a backtrace entry -static bool UnwReportOut(void* ctx, const UnwReport* bte) { - int* p = (int*)ctx; - - (*p)++; - TX('#'); TXDec(*p); TX(" : "); - TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); - TX('+'); TXDec(bte->address - bte->function); - TX(" PC:");TXHex(bte->address); TX('\n'); - return true; -} - -#ifdef UNW_DEBUG - void UnwPrintf(const char* format, ...) { - char dest[256]; - va_list argptr; - va_start(argptr, format); - vsprintf(dest, format, argptr); - va_end(argptr); - TX(&dest[0]); - } -#endif - -/* Table of function pointers for passing to the unwinder */ -static const UnwindCallbacks UnwCallbacks = { - UnwReportOut, - UnwReadW, - UnwReadH, - UnwReadB - #ifdef UNW_DEBUG - ,UnwPrintf - #endif -}; - - -/** - * HardFaultHandler_C: - * This is called from the HardFault_HandlerAsm with a pointer the Fault stack - * as the parameter. We can then read the values from the stack and place them - * into local variables for ease of reading. - * We then read the various Fault Status and Address Registers to help decode - * cause of the fault. - * The function ends with a BKPT instruction to force control back into the debugger - */ -extern "C" -void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { - - static const char* causestr[] = { - "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" - }; - - UnwindFrame btf; - - // Dump report to the Programming port (interrupts are DISABLED) - TXBegin(); - TX("\n\n## Software Fault detected ##\n"); - TX("Cause: "); TX(causestr[cause]); TX('\n'); - - TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); - TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); - TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); - TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); - TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); - TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); - TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); - TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); - - // Configurable Fault Status Register - // Consists of MMSR, BFSR and UFSR - TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); - - // Hard Fault Status Register - TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); - - // Debug Fault Status Register - TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); - - // Auxiliary Fault Status Register - TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); - - // Read the Fault Address Registers. These may not contain valid values. - // Check BFARVALID/MMARVALID to see if they are valid values - // MemManage Fault Address Register - TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); - - // Bus Fault Address Register - TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); - - TX("ExcLR: "); TXHex(lr); TX('\n'); - TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); - - btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer - btf.fp = btf.sp; - btf.lr = ((unsigned long)sp[5]); - btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it - - // Perform a backtrace - TX("\nBacktrace:\n\n"); - int ctr = 0; - UnwindStart(&btf, &UnwCallbacks, &ctr); - - // Disable all NVIC interrupts - NVIC->ICER[0] = 0xFFFFFFFF; - NVIC->ICER[1] = 0xFFFFFFFF; - - // Relocate VTOR table to default position - SCB->VTOR = 0; - - // Clear cause of reset to prevent entering smoothie bootstrap - HAL_clear_reset_source(); - - // Restart watchdog - #if ENABLED(USE_WATCHDOG) - //WDT_Restart(WDT); - watchdog_init(); - #endif - - // Reset controller - NVIC_SystemReset(); - - // Nothing below here is compiled because NVIC_SystemReset loops forever - - for (;;) { TERN_(USE_WATCHDOG, watchdog_init()); } -} - -extern "C" { -__attribute__((naked)) void NMI_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#0") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void HardFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#1") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void MemManage_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#2") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void BusFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#3") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void UsageFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#4") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void DebugMon_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#5") - A("b HardFault_HandlerC") - ); -} - -/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ -__attribute__((naked)) void WDT_IRQHandler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#6") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void RSTC_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#7") - A("b HardFault_HandlerC") - ); -} -} -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp b/Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp new file mode 100644 index 0000000000..ab9af1fe00 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef TARGET_LPC1768 + +#include "HAL.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +#include "../shared/HAL_MinSerial.h" +#include + +static void TX(char c) { _DBC(c); } +void install_min_serial() { HAL_min_serial_out = &TX; } + +#if DISABLED(DYNAMIC_VECTORTABLE) +extern "C" { + __attribute__((naked)) void JumpHandler_ASM() { + __asm__ __volatile__ ( + "b CommonHandler_ASM\n" + ); + } + void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler(); +} +#endif + +#endif // POSTMORTEM_DEBUGGING +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 10d6737714..dda1c640fa 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -270,7 +270,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #endif #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on LPC176x." #elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." + #error "SERIAL_STATS_DROPPED_RX is not supported on LPX176x." #endif diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index 1fbeddd9ea..08fb1a1ed5 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -46,6 +46,8 @@ extern "C" { void SysTick_Callback() { disk_timerproc(); } +TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); + void HAL_init() { // Init LEDs @@ -123,9 +125,7 @@ void HAL_init() { delay(1000); // Give OS time to notice USB_Connect(true); - #if HAS_SD_HOST_DRIVE - MSC_SD_Init(0); // Enable USB SD card access - #endif + TERN_(HAS_SD_HOST_DRIVE, MSC_SD_Init(0)); // Enable USB SD card access const millis_t usb_timeout = millis() + 2000; while (!USB_Configuration && PENDING(millis(), usb_timeout)) { @@ -137,6 +137,8 @@ void HAL_init() { } HAL_timer_init(); + + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler } // HAL idle task diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index e694a16a82..5c7bc3a00b 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -57,6 +57,8 @@ uint16_t HAL_adc_result; // Public functions // ------------------------ +TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); + // HAL initialization task void HAL_init() { FastIO_init(); @@ -83,6 +85,8 @@ void HAL_init() { USB_Hook_init(); #endif + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler + #if HAS_SD_HOST_DRIVE MSC_SD_init(); // Enable USB SD card access #endif diff --git a/Marlin/src/HAL/STM32/HAL_MinSerial.cpp b/Marlin/src/HAL/STM32/HAL_MinSerial.cpp new file mode 100644 index 0000000000..823bb6e8f5 --- /dev/null +++ b/Marlin/src/HAL/STM32/HAL_MinSerial.cpp @@ -0,0 +1,152 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +#include "../shared/HAL_MinSerial.h" +#include "watchdog.h" + +/* Instruction Synchronization Barrier */ +#define isb() __asm__ __volatile__ ("isb" : : : "memory") + +/* Data Synchronization Barrier */ +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") + +// Dumb mapping over the registers of a USART device on STM32 +struct USARTMin { + volatile uint32_t SR; + volatile uint32_t DR; + volatile uint32_t BRR; + volatile uint32_t CR1; + volatile uint32_t CR2; +}; + +#if WITHIN(SERIAL_PORT, 1, 6) + // Depending on the CPU, the serial port is different for USART1 + static const uintptr_t regsAddr[] = { + TERN(STM32F1xx, 0x40013800, 0x40011000), // USART1 + 0x40004400, // USART2 + 0x40004800, // USART3 + 0x40004C00, // UART4_BASE + 0x40005000, // UART5_BASE + 0x40011400 // USART6 + }; + static USARTMin * regs = (USARTMin*)regsAddr[SERIAL_PORT - 1]; +#endif + +static void TXBegin() { + #if !WITHIN(SERIAL_PORT, 1, 6) + #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." + #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." + #else + // This is common between STM32F1/STM32F2 and STM32F4 + const int nvicUART[] = { /* NVIC_USART1 */ 37, /* NVIC_USART2 */ 38, /* NVIC_USART3 */ 39, /* NVIC_UART4 */ 52, /* NVIC_UART5 */ 53, /* NVIC_USART6 */ 71 }; + int nvicIndex = nvicUART[SERIAL_PORT - 1]; + + struct NVICMin { + volatile uint32_t ISER[32]; + volatile uint32_t ICER[32]; + }; + + NVICMin * nvicBase = (NVICMin*)0xE000E100; + nvicBase->ICER[nvicIndex / 32] |= _BV32(nvicIndex % 32); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + dsb(); + isb(); + + // Example for USART1 disable: (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) + // Too difficult to reimplement here, let's query the STM32duino macro here + #if SERIAL_PORT == 1 + __HAL_RCC_USART1_CLK_DISABLE(); + __HAL_RCC_USART1_CLK_ENABLE(); + #elif SERIAL_PORT == 2 + __HAL_RCC_USART2_CLK_DISABLE(); + __HAL_RCC_USART2_CLK_ENABLE(); + #elif SERIAL_PORT == 3 + __HAL_RCC_USART3_CLK_DISABLE(); + __HAL_RCC_USART3_CLK_ENABLE(); + #elif SERIAL_PORT == 4 + __HAL_RCC_UART4_CLK_DISABLE(); // BEWARE: UART4 and not USART4 here + __HAL_RCC_UART4_CLK_ENABLE(); + #elif SERIAL_PORT == 5 + __HAL_RCC_UART5_CLK_DISABLE(); // BEWARE: UART5 and not USART5 here + __HAL_RCC_UART5_CLK_ENABLE(); + #elif SERIAL_PORT == 6 + __HAL_RCC_USART6_CLK_DISABLE(); + __HAL_RCC_USART6_CLK_ENABLE(); + #endif + + uint32_t brr = regs->BRR; + regs->CR1 = 0; // Reset the USART + regs->CR2 = 0; // 1 stop bit + + // If we don't touch the BRR (baudrate register), we don't need to recompute. + regs->BRR = brr; + + regs->CR1 = _BV(3) | _BV(13); // 8 bits, no parity, 1 stop bit (TE | UE) + #endif +} + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); +static void TX(char c) { + #if WITHIN(SERIAL_PORT, 1, 6) + constexpr uint32_t usart_sr_txe = _BV(7); + while (!(regs->SR & usart_sr_txe)) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); + sw_barrier(); + } + regs->DR = c; + #else + // Let's hope a mystical guru will fix this, one day by writting interrupt-free USB CDC ACM code (or, at least, by polling the registers since interrupt will be queued but will never trigger) + // For now, it's completely lost to oblivion. + #endif +} + +void install_min_serial() { + HAL_min_serial_init = &TXBegin; + HAL_min_serial_out = &TX; +} + +#if DISABLED(DYNAMIC_VECTORTABLE) && DISABLED(STM32F0xx) // Cortex M0 can't jump to a symbol that's too far from the current function, so we work around this in exception_arm.cpp +extern "C" { + __attribute__((naked)) void JumpHandler_ASM() { + __asm__ __volatile__ ( + "b CommonHandler_ASM\n" + ); + } + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) NMI_Handler(); +} +#endif + +#endif // POSTMORTEM_DEBUGGING +#endif // ARDUINO_ARCH_STM32 diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 4df75a0505..7ee606af7f 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -47,9 +47,9 @@ #endif #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on STM32." #elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." + #error "SERIAL_STATS_DROPPED_RX is not supported on STM32." #endif #if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) && NOT_TARGET(STM32F4xx, STM32F1xx) diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 2f29b9b0e3..020c623b77 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -272,6 +272,8 @@ static void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { } } #endif +TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); + void HAL_init() { NVIC_SetPriorityGrouping(0x3); #if PIN_EXISTS(LED) @@ -287,6 +289,7 @@ void HAL_init() { delay(1000); // Give OS time to notice OUT_WRITE(USB_CONNECT_PIN, USB_CONNECT_INVERTING); #endif + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the minimal serial handler } // HAL idle task diff --git a/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp b/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp new file mode 100644 index 0000000000..e6b89f1105 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp @@ -0,0 +1,118 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +#include "../shared/HAL_MinSerial.h" +#include "watchdog.h" + +#include +#include +#include + +/* Instruction Synchronization Barrier */ +#define isb() __asm__ __volatile__ ("isb" : : : "memory") + +/* Data Synchronization Barrier */ +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") + +static void TXBegin() { + #if !WITHIN(SERIAL_PORT, 1, 6) + #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." + #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." + #else + // We use MYSERIAL0 here, so we need to figure out how to get the linked register + struct usart_dev* dev = MYSERIAL0.c_dev(); + + // Or use this if removing libmaple + // int irq = dev->irq_num; + // int nvicUART[] = { NVIC_USART1 /* = 37 */, NVIC_USART2 /* = 38 */, NVIC_USART3 /* = 39 */, NVIC_UART4 /* = 52 */, NVIC_UART5 /* = 53 */ }; + // Disabling irq means setting the bit in the NVIC ICER register located at + // Disable UART interrupt in NVIC + nvic_irq_disable(dev->irq_num); + + // Use this if removing libmaple + //NVIC_BASE->ICER[1] |= _BV(irq - 32); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + dsb(); + isb(); + + rcc_clk_disable(dev->clk_id); + rcc_clk_enable(dev->clk_id); + + usart_reg_map *regs = dev->regs; + regs->CR1 = 0; // Reset the USART + regs->CR2 = 0; // 1 stop bit + + // If we don't touch the BRR (baudrate register), we don't need to recompute. Else we would need to call + usart_set_baud_rate(dev, 0, BAUDRATE); + + regs->CR1 = (USART_CR1_TE | USART_CR1_UE); // 8 bits, no parity, 1 stop bit + #endif +} + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); +static void TX(char c) { + #if WITHIN(SERIAL_PORT, 1, 6) + struct usart_dev* dev = MYSERIAL0.c_dev(); + while (!(dev->regs->SR & USART_SR_TXE)) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); + sw_barrier(); + } + dev->regs->DR = c; + #endif +} + +void install_min_serial() { + HAL_min_serial_init = &TXBegin; + HAL_min_serial_out = &TX; +} + +#if DISABLED(DYNAMIC_VECTORTABLE) && DISABLED(STM32F0xx) // Cortex M0 can't branch to a symbol that's too far, so we have a specific hack for them +extern "C" { + __attribute__((naked)) void JumpHandler_ASM() { + __asm__ __volatile__ ( + "b CommonHandler_ASM\n" + ); + } + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_hardfault(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_busfault(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_usagefault(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_memmanage(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_nmi(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception7(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception8(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception9(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception10(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception13(); +} +#endif + +#endif // POSTMORTEM_DEBUGGING +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index 8d4c54ec0f..89ee66d646 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -34,9 +34,9 @@ #endif #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on the STM32F1 platform." #elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." + #error "SERIAL_STATS_DROPPED_RX is not supported on the STM32F1 platform." #endif #if ENABLED(NEOPIXEL_LED) diff --git a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h index 3932ee6a76..1efa76b1e9 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h @@ -34,5 +34,9 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on Teensy 3.1/3.2." +#endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on Teensy 3.1/3.2." #endif diff --git a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h index ee80e42696..eef2850550 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h @@ -34,5 +34,9 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on Teensy 3.5/3.6." +#endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on Teensy 3.5/3.6." #endif diff --git a/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h index fbfe7b0fc3..3d2668d749 100644 --- a/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h @@ -34,5 +34,9 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on Teensy 4.0/4.1." +#endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on Teensy 4.0/4.1." #endif diff --git a/Marlin/src/HAL/shared/HAL_MinSerial.cpp b/Marlin/src/HAL/shared/HAL_MinSerial.cpp new file mode 100644 index 0000000000..9dda5fdf8c --- /dev/null +++ b/Marlin/src/HAL/shared/HAL_MinSerial.cpp @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "HAL_MinSerial.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +void HAL_min_serial_init_default() {} +void HAL_min_serial_out_default(char ch) { SERIAL_CHAR(ch); } +void (*HAL_min_serial_init)() = &HAL_min_serial_init_default; +void (*HAL_min_serial_out)(char) = &HAL_min_serial_out_default; + +bool MinSerial::force_using_default_output = false; + +#endif diff --git a/Marlin/src/HAL/shared/HAL_MinSerial.h b/Marlin/src/HAL/shared/HAL_MinSerial.h new file mode 100644 index 0000000000..04643c1ab3 --- /dev/null +++ b/Marlin/src/HAL/shared/HAL_MinSerial.h @@ -0,0 +1,79 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../core/serial.h" +#include + +// Serial stuff here +// Inside an exception handler, the CPU state is not safe, we can't expect the handler to resume +// and the software to continue. UART communication can't rely on later callback/interrupt as it might never happen. +// So, you need to provide some method to send one byte to the usual UART with the interrupts disabled +// By default, the method uses SERIAL_CHAR but it's 100% guaranteed to break (couldn't be worse than nothing...)7 +extern void (*HAL_min_serial_init)(); +extern void (*HAL_min_serial_out)(char ch); + +struct MinSerial { + static bool force_using_default_output; + // Serial output + static void TX(char ch) { + if (force_using_default_output) + SERIAL_CHAR(ch); + else + HAL_min_serial_out(ch); + } + // Send String through UART + static void TX(const char* s) { while (*s) TX(*s++); } + // Send a digit through UART + static void TXDigit(uint32_t d) { + if (d < 10) TX((char)(d+'0')); + else if (d < 16) TX((char)(d+'A'-10)); + else TX('?'); + } + + // Send Hex number through UART + static void TXHex(uint32_t v) { + TX("0x"); + for (uint8_t i = 0; i < 8; i++, v <<= 4) + TXDigit((v >> 28) & 0xF); + } + + // Send Decimal number through UART + static void TXDec(uint32_t v) { + if (!v) { + TX('0'); + return; + } + + char nbrs[14]; + char *p = &nbrs[0]; + while (v != 0) { + *p++ = '0' + (v % 10); + v /= 10; + } + do { + p--; + TX(*p); + } while (p != &nbrs[0]); + } + static void init() { if (!force_using_default_output) HAL_min_serial_init(); } +}; diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index 4a8990c00b..8320f47509 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -25,7 +25,7 @@ #include "unwinder.h" #include "unwmemaccess.h" -#include "../../../core/serial.h" +#include "../HAL_MinSerial.h" #include // Dump a backtrace entry @@ -34,10 +34,12 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { (*p)++; - SERIAL_CHAR('#'); SERIAL_ECHO(*p); SERIAL_ECHOPGM(" : "); - SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, PrintBase::Hex); - SERIAL_CHAR('+'); SERIAL_ECHO(bte->address - bte->function); - SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address, PrintBase::Hex); SERIAL_CHAR('\n'); + const uint32_t a = bte->address, f = bte->function; + MinSerial::TX('#'); MinSerial::TXDec(*p); MinSerial::TX(" : "); + MinSerial::TX(bte->name?:"unknown"); MinSerial::TX('@'); MinSerial::TXHex(f); + MinSerial::TX('+'); MinSerial::TXDec(a - f); + MinSerial::TX(" PC:"); MinSerial::TXHex(a); + MinSerial::TX('\n'); return true; } @@ -48,7 +50,7 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { va_start(argptr, format); vsprintf(dest, format, argptr); va_end(argptr); - TX(&dest[0]); + MinSerial::TX(&dest[0]); } #endif @@ -63,10 +65,10 @@ static const UnwindCallbacks UnwCallbacks = { #endif }; +// Perform a backtrace to the serial port void backtrace() { - UnwindFrame btf; - uint32_t sp = 0, lr = 0, pc = 0; + unsigned long sp = 0, lr = 0, pc = 0; // Capture the values of the registers to perform the traceback __asm__ __volatile__ ( @@ -79,6 +81,12 @@ void backtrace() { :: ); + backtrace_ex(sp, lr, pc); +} + +void backtrace_ex(unsigned long sp, unsigned long lr, unsigned long pc) { + UnwindFrame btf; + // Fill the traceback structure btf.sp = sp; btf.fp = btf.sp; @@ -86,7 +94,7 @@ void backtrace() { btf.pc = pc | 1; // Force Thumb, as CORTEX only support it // Perform a backtrace - SERIAL_ERROR_MSG("Backtrace:"); + MinSerial::TX("Backtrace:"); int ctr = 0; UnwindStart(&btf, &UnwCallbacks, &ctr); } @@ -95,4 +103,4 @@ void backtrace() { void backtrace() {} -#endif +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.h b/Marlin/src/HAL/shared/backtrace/backtrace.h index fccadedaa5..5d2ba601a0 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.h +++ b/Marlin/src/HAL/shared/backtrace/backtrace.h @@ -23,3 +23,6 @@ // Perform a backtrace to the serial port void backtrace(); + +// Perform a backtrace to the serial port +void backtrace_ex(unsigned long sp, unsigned long lr, unsigned long pc); diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index 5ca46f9886..2bde1e208d 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -41,27 +41,16 @@ #define START_FLASH_ADDR 0x00000000 #define END_FLASH_ADDR 0x00080000 -#elif 0 - - // For STM32F103CBT6 - // SRAM (0x20000000 - 0x20005000) (20kb) - // FLASH (0x00000000 - 0x00020000) (128kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20005000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00020000 - #elif defined(__STM32F1__) || defined(STM32F1xx) || defined(STM32F0xx) // For STM32F103ZET6/STM32F103VET6/STM32F0xx // SRAM (0x20000000 - 0x20010000) (64kb) - // FLASH (0x00000000 - 0x00080000) (512kb) + // FLASH (0x08000000 - 0x08080000) (512kb) // #define START_SRAM_ADDR 0x20000000 #define END_SRAM_ADDR 0x20010000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00080000 + #define START_FLASH_ADDR 0x08000000 + #define END_FLASH_ADDR 0x08080000 #elif defined(STM32F4) || defined(STM32F4xx) @@ -142,20 +131,57 @@ #define START_FLASH_ADDR 0x00000000 #define END_FLASH_ADDR 0x00100000 +#else + // Generic ARM code, that's testing if an access to the given address would cause a fault or not + // It can't guarantee an address is in RAM or Flash only, but we usually don't care + + #define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. + #define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register + #define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid + #define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault + #define HW_REG(X) (*((volatile unsigned long *)(X))) + + static bool validate_addr(uint32_t read_address) { + bool works = true; + uint32_t intDisabled = 0; + // Read current interrupt state + __asm__ __volatile__ ("MRS %[result], PRIMASK\n\t" : [result]"=r"(intDisabled) :: ); // 0 is int enabled, 1 for disabled + + // Clear bus fault indicator first (write 1 to clear) + HW_REG(NVIC_FAULT_STAT) |= NVIC_FAULT_STAT_BFARV; + // Ignore bus fault interrupt + HW_REG(NVIC_CFG_CTRL) |= NVIC_CFG_CTRL_BFHFNMIGN; + // Disable interrupts if not disabled previously + if (!intDisabled) __asm__ __volatile__ ("CPSID f"); + // Probe address + *(volatile uint32_t*)read_address; + // Check if a fault happened + if ((HW_REG(NVIC_FAULT_STAT) & NVIC_FAULT_STAT_BFARV) != 0) + works = false; + // Enable interrupts again if previously disabled + if (!intDisabled) __asm__ __volatile__ ("CPSIE f"); + // Enable fault interrupt flag + HW_REG(NVIC_CFG_CTRL) &= ~NVIC_CFG_CTRL_BFHFNMIGN; + + return works; + } + #endif -static bool validate_addr(uint32_t addr) { +#ifdef START_SRAM_ADDR + static bool validate_addr(uint32_t addr) { - // Address must be in SRAM range - if (addr >= START_SRAM_ADDR && addr < END_SRAM_ADDR) - return true; + // Address must be in SRAM range + if (addr >= START_SRAM_ADDR && addr < END_SRAM_ADDR) + return true; - // Or in FLASH range - if (addr >= START_FLASH_ADDR && addr < END_FLASH_ADDR) - return true; + // Or in FLASH range + if (addr >= START_FLASH_ADDR && addr < END_FLASH_ADDR) + return true; - return false; -} + return false; + } +#endif bool UnwReadW(const uint32_t a, uint32_t *v) { if (!validate_addr(a)) diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp new file mode 100644 index 0000000000..090148683f --- /dev/null +++ b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp @@ -0,0 +1,379 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2020 Cyril Russo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/*************************************************************************** + * ARM CPU Exception handler + ***************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + + +/* + On ARM CPUs exception handling is quite powerful. + + By default, upon a crash, the CPU enters the handlers that have a higher priority than any other interrupts, + so, in effect, no (real) interrupt can "interrupt" the handler (it's acting like if interrupts were disabled). + + If the handler is not called as re-entrant (that is, if the crash is not happening inside an interrupt or an handler), + then it'll patch the return address to a dumping function (resume_from_fault) and save the crash state. + The CPU will exit the handler and, as such, re-allow the other interrupts, and jump to the dumping function. + In this function, the usual serial port (USB / HW) will be used to dump the crash (no special configuration required). + + The only case where it requires hardware UART is when it's crashing in an interrupt or a crash handler. + In that case, instead of returning to the resume_from_fault function (and thus, re-enabling interrupts), + it jumps to this function directly (so with interrupts disabled), after changing the behavior of the serial output + wrapper to use the HW uart (and in effect, calling MinSerial::init which triggers a warning if you are using + a USB serial port). + + In the case you have a USB serial port, this part will be disabled, and only that part (so that's the reason for + the warning). + This means that you can't have a crash report if the crash happens in an interrupt or an handler if you are using + a USB serial port since it's physically impossible. + You will get a crash report in all other cases. +*/ + +#include "exception_hook.h" +#include "../backtrace/backtrace.h" +#include "../HAL_MinSerial.h" + +#define HW_REG(X) (*((volatile unsigned long *)(X))) + +// Default function use the CPU VTOR register to get the vector table. +// Accessing the CPU VTOR register is done in assembly since it's the only way that's common to all current tool +unsigned long get_vtor() { return HW_REG(0xE000ED08); } // Even if it looks like an error, it is not an error +void * hook_get_hardfault_vector_address(unsigned vtor) { return (void*)(vtor + 0x03); } +void * hook_get_memfault_vector_address(unsigned vtor) { return (void*)(vtor + 0x04); } +void * hook_get_busfault_vector_address(unsigned vtor) { return (void*)(vtor + 0x05); } +void * hook_get_usagefault_vector_address(unsigned vtor) { return (void*)(vtor + 0x06); } +void * hook_get_reserved_vector_address(unsigned vtor) { return (void*)(vtor + 0x07); } + +// Common exception frame for ARM, should work for all ARM CPU +// Described here (modified for convenience): https://interrupt.memfault.com/blog/cortex-m-fault-debug +struct __attribute__((packed)) ContextStateFrame { + uint32_t r0; + uint32_t r1; + uint32_t r2; + uint32_t r3; + uint32_t r12; + uint32_t lr; + uint32_t pc; + uint32_t xpsr; +}; + +struct __attribute__((packed)) ContextSavedFrame { + uint32_t R0; + uint32_t R1; + uint32_t R2; + uint32_t R3; + uint32_t R12; + uint32_t LR; + uint32_t PC; + uint32_t XPSR; + + uint32_t CFSR; + uint32_t HFSR; + uint32_t DFSR; + uint32_t AFSR; + uint32_t MMAR; + uint32_t BFAR; + + uint32_t ESP; + uint32_t ELR; +}; + +#if DISABLED(STM32F0xx) + extern "C" + __attribute__((naked)) void CommonHandler_ASM() { + __asm__ __volatile__ ( + // Bit 2 of LR tells which stack pointer to use (either main or process, only main should be used anyway) + "tst lr, #4\n" + "ite eq\n" + "mrseq r0, msp\n" + "mrsne r0, psp\n" + // Save the LR in use when being interrupted + "mov r1, lr\n" + // Get the exception number from the ICSR register + "ldr r2, =0xE000ED00\n" + "ldr r2, [r2, #4]\n" + "b CommonHandler_C\n" + ); + } +#else // Cortex M0 does not support conditional mov and testing with a constant, so let's have a specific handler for it + extern "C" + __attribute__((naked)) void CommonHandler_ASM() { + __asm__ __volatile__ ( + ".syntax unified\n" + // Save the LR in use when being interrupted + "mov r1, lr\n" + // Get the exception number from the ICSR register + "ldr r2, =0xE000ED00\n" + "ldr r2, [r2, #4]\n" + "movs r0, #4\n" + "tst r1, r0\n" + "beq _MSP\n" + "mrs r0, psp\n" + "b CommonHandler_C\n" + "_MSP:\n" + "mrs r0, msp\n" + "b CommonHandler_C\n" + ); + } + + #if DISABLED(DYNAMIC_VECTORTABLE) // Cortex M0 requires the handler's address to be within 32kB to the actual function to be able to branch to it + extern "C" { + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_hardfault(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_busfault(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_usagefault(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_memmanage(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_nmi(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception7(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception8(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception9(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception10(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception13(); + } + //TODO When going off from libmaple, you'll need to replace those by the one from STM32/HAL_MinSerial.cpp + #endif +#endif + +// Must be a macro to avoid creating a function frame +#define HALT_IF_DEBUGGING() \ + do { \ + if (HW_REG(0xE000EDF0) & _BV(0)) { \ + __asm("bkpt 1"); \ + } \ +} while (0) + +// Resume from a fault (if possible) so we can still use interrupt based code for serial output +// In that case, we will not jump back to the faulty code, but instead to a dumping code and then a +// basic loop with watchdog calling or manual resetting +static ContextSavedFrame savedFrame; +static uint8_t lastCause; +bool resume_from_fault() { + static const char* causestr[] = { "Thread", "Rsvd", "NMI", "Hard", "Mem", "Bus", "Usage", "7", "8", "9", "10", "SVC", "Dbg", "13", "PendSV", "SysTk", "IRQ" }; + // Reinit the serial link (might only work if implemented in each of your boards) + MinSerial::init(); + + MinSerial::TX("\n\n## Software Fault detected ##\n"); + MinSerial::TX("Cause: "); MinSerial::TX(causestr[min(lastCause, (uint8_t)16)]); MinSerial::TX('\n'); + + MinSerial::TX("R0 : "); MinSerial::TXHex(savedFrame.R0); MinSerial::TX('\n'); + MinSerial::TX("R1 : "); MinSerial::TXHex(savedFrame.R1); MinSerial::TX('\n'); + MinSerial::TX("R2 : "); MinSerial::TXHex(savedFrame.R2); MinSerial::TX('\n'); + MinSerial::TX("R3 : "); MinSerial::TXHex(savedFrame.R3); MinSerial::TX('\n'); + MinSerial::TX("R12 : "); MinSerial::TXHex(savedFrame.R12); MinSerial::TX('\n'); + MinSerial::TX("LR : "); MinSerial::TXHex(savedFrame.LR); MinSerial::TX('\n'); + MinSerial::TX("PC : "); MinSerial::TXHex(savedFrame.PC); MinSerial::TX('\n'); + MinSerial::TX("PSR : "); MinSerial::TXHex(savedFrame.XPSR); MinSerial::TX('\n'); + + // Configurable Fault Status Register + // Consists of MMSR, BFSR and UFSR + MinSerial::TX("CFSR : "); MinSerial::TXHex(savedFrame.CFSR); MinSerial::TX('\n'); + + // Hard Fault Status Register + MinSerial::TX("HFSR : "); MinSerial::TXHex(savedFrame.HFSR); MinSerial::TX('\n'); + + // Debug Fault Status Register + MinSerial::TX("DFSR : "); MinSerial::TXHex(savedFrame.DFSR); MinSerial::TX('\n'); + + // Auxiliary Fault Status Register + MinSerial::TX("AFSR : "); MinSerial::TXHex(savedFrame.AFSR); MinSerial::TX('\n'); + + // Read the Fault Address Registers. These may not contain valid values. + // Check BFARVALID/MMARVALID to see if they are valid values + // MemManage Fault Address Register + MinSerial::TX("MMAR : "); MinSerial::TXHex(savedFrame.MMAR); MinSerial::TX('\n'); + + // Bus Fault Address Register + MinSerial::TX("BFAR : "); MinSerial::TXHex(savedFrame.BFAR); MinSerial::TX('\n'); + + MinSerial::TX("ExcLR: "); MinSerial::TXHex(savedFrame.ELR); MinSerial::TX('\n'); + MinSerial::TX("ExcSP: "); MinSerial::TXHex(savedFrame.ESP); MinSerial::TX('\n'); + + // The stack pointer is pushed by 8 words upon entering an exception, so we need to revert this + backtrace_ex(savedFrame.ESP + 8*4, savedFrame.LR, savedFrame.PC); + + // Call the last resort function here + hook_last_resort_func(); + + const uint32_t start = millis(), end = start + 100; // 100ms should be enough + // We need to wait for the serial buffers to be output but we don't know for how long + // So we'll just need to refresh the watchdog for a while and then stop for the system to reboot + uint32_t last = start; + while (PENDING(last, end)) { + watchdog_refresh(); + while (millis() == last) { /* nada */ } + last = millis(); + MinSerial::TX('.'); + } + + // Reset now by reinstantiating the bootloader's vector table + HW_REG(0xE000ED08) = 0; + // Restart watchdog + #if DISABLED(USE_WATCHDOG) + // No watchdog, let's perform ARMv7 reset instead by writing to AIRCR register with VECTKEY set to SYSRESETREQ + HW_REG(0xE000ED0C) = (HW_REG(0xE000ED0C) & 0x0000FFFF) | 0x05FA0004; + #endif + + while(1) {} // Bad luck, nothing worked +} + +// Make sure the compiler does not optimize the frame argument away +extern "C" +__attribute__((optimize("O0"))) +void CommonHandler_C(ContextStateFrame * frame, unsigned long lr, unsigned long cause) { + + // If you are using it'll stop here + HALT_IF_DEBUGGING(); + + // Save the state to backtrace later on (don't call memcpy here since the stack can be corrupted) + savedFrame.R0 = frame->r0; + savedFrame.R1 = frame->r1; + savedFrame.R2 = frame->r2; + savedFrame.R3 = frame->r3; + savedFrame.R12 = frame->r12; + savedFrame.LR = frame->lr; + savedFrame.PC = frame->pc; + savedFrame.XPSR= frame->xpsr; + lastCause = cause & 0x1FF; + + volatile uint32_t &CFSR = HW_REG(0xE000ED28); + savedFrame.CFSR = CFSR; + savedFrame.HFSR = HW_REG(0xE000ED2C); + savedFrame.DFSR = HW_REG(0xE000ED30); + savedFrame.AFSR = HW_REG(0xE000ED3C); + savedFrame.MMAR = HW_REG(0xE000ED34); + savedFrame.BFAR = HW_REG(0xE000ED38); + savedFrame.ESP = (unsigned long)frame; // Even on return, this should not be overwritten by the CPU + savedFrame.ELR = lr; + + // First check if we can resume from this exception to our own handler safely + // If we can, then we don't need to disable interrupts and the usual serial code + // can be used + + //const uint32_t non_usage_fault_mask = 0x0000FFFF; + //const bool non_usage_fault_occurred = (CFSR & non_usage_fault_mask) != 0; + // the bottom 8 bits of the xpsr hold the exception number of the + // executing exception or 0 if the processor is in Thread mode + const bool faulted_from_exception = ((frame->xpsr & 0xFF) != 0); + if (!faulted_from_exception) { // Not sure about the non_usage_fault, we want to try anyway, don't we ? && !non_usage_fault_occurred) + // Try to resume to our handler here + CFSR |= CFSR; // The ARM programmer manual says you must write to 1 all fault bits to clear them so this instruction is correct + // The frame will not be valid when returning anymore, let's clean it + savedFrame.CFSR = 0; + + frame->pc = (uint32_t)resume_from_fault; // Patch where to return to + frame->lr = 0xdeadbeef; // If our handler returns (it shouldn't), let's make it trigger an exception immediately + frame->xpsr = _BV(24); // Need to clean the PSR register to thumb II only + MinSerial::force_using_default_output = true; + return; // The CPU will resume in our handler hopefully, and we'll try to use default serial output + } + + // Sorry, we need to emergency code here since the fault is too dangerous to recover from + MinSerial::force_using_default_output = false; + resume_from_fault(); +} + +void hook_cpu_exceptions() { + #if ENABLED(DYNAMIC_VECTORTABLE) + // On ARM 32bits CPU, the vector table is like this: + // 0x0C => Hardfault + // 0x10 => MemFault + // 0x14 => BusFault + // 0x18 => UsageFault + + // Unfortunately, it's usually run from flash, and we can't write to flash here directly to hook our instruction + // We could set an hardware breakpoint, and hook on the fly when it's being called, but this + // is hard to get right and would probably break debugger when attached + + // So instead, we'll allocate a new vector table filled with the previous value except + // for the fault we are interested in. + // Now, comes the issue to figure out what is the current vector table size + // There is nothing telling us what is the vector table as it's per-cpu vendor specific. + // BUT: we are being called at the end of the setup, so we assume the setup is done + // Thus, we can read the current vector table until we find an address that's not in flash, and it would mark the + // end of the vector table (skipping the fist entry obviously) + // The position of the program in flash is expected to be at 0x08xxx xxxx on all known platform for ARM and the + // flash size is available via register 0x1FFFF7E0 on STM32 family, but it's not the case for all ARM boards + // (accessing this register might trigger a fault if it's not implemented). + + // So we'll simply mask the top 8 bits of the first handler as an hint of being in the flash or not -that's poor and will + // probably break if the flash happens to be more than 128MB, but in this case, we are not magician, we need help from outside. + + unsigned long * vecAddr = (unsigned long*)get_vtor(); + SERIAL_ECHO("Vector table addr: "); + SERIAL_PRINTLN(get_vtor(), HEX); + + #ifdef VECTOR_TABLE_SIZE + uint32_t vec_size = VECTOR_TABLE_SIZE; + alignas(128) static unsigned long vectable[VECTOR_TABLE_SIZE] ; + #else + #ifndef IS_IN_FLASH + #define IS_IN_FLASH(X) (((unsigned long)X & 0xFF000000) == 0x08000000) + #endif + + // When searching for the end of the vector table, this acts as a limit not to overcome + #ifndef VECTOR_TABLE_SENTINEL + #define VECTOR_TABLE_SENTINEL 80 + #endif + + // Find the vector table size + uint32_t vec_size = 1; + while (IS_IN_FLASH(vecAddr[vec_size]) && vec_size < VECTOR_TABLE_SENTINEL) + vec_size++; + + // We failed to find a valid vector table size, let's abort hooking up + if (vec_size == VECTOR_TABLE_SENTINEL) return; + // Poor method that's wasting RAM here, but allocating with malloc and alignment would be worst + // 128 bytes alignement is required for writing the VTOR register + alignas(128) static unsigned long vectable[VECTOR_TABLE_SENTINEL]; + + SERIAL_ECHO("Detected vector table size: "); + SERIAL_PRINTLN(vec_size, HEX); + #endif + + uint32_t defaultFaultHandler = vecAddr[(unsigned)7]; + // Copy the current vector table into the new table + for (uint32_t i = 0; i < vec_size; i++) { + vectable[i] = vecAddr[i]; + // Replace all default handler by our own handler + if (vectable[i] == defaultFaultHandler) + vectable[i] = (unsigned long)&CommonHandler_ASM; + } + + // Let's hook now with our functions + vectable[(unsigned long)hook_get_hardfault_vector_address(0)] = (unsigned long)&CommonHandler_ASM; + vectable[(unsigned long)hook_get_memfault_vector_address(0)] = (unsigned long)&CommonHandler_ASM; + vectable[(unsigned long)hook_get_busfault_vector_address(0)] = (unsigned long)&CommonHandler_ASM; + vectable[(unsigned long)hook_get_usagefault_vector_address(0)] = (unsigned long)&CommonHandler_ASM; + + // Finally swap with our own vector table + // This is supposed to be atomic, but let's do that with interrupt disabled + + HW_REG(0xE000ED08) = (unsigned long)vectable | _BV32(29); // 29th bit is for telling the CPU the table is now in SRAM (should be present already) + + SERIAL_ECHOLN("Installed fault handlers"); + #endif +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_hook.cpp b/Marlin/src/HAL/shared/cpu_exception/exception_hook.cpp new file mode 100644 index 0000000000..93e80f3e85 --- /dev/null +++ b/Marlin/src/HAL/shared/cpu_exception/exception_hook.cpp @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "exception_hook.h" + +void * __attribute__((weak)) hook_get_hardfault_vector_address(unsigned) { return 0; } +void * __attribute__((weak)) hook_get_memfault_vector_address(unsigned) { return 0; } +void * __attribute__((weak)) hook_get_busfault_vector_address(unsigned) { return 0; } +void * __attribute__((weak)) hook_get_usagefault_vector_address(unsigned) { return 0; } +void __attribute__((weak)) hook_last_resort_func() {} diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_hook.h b/Marlin/src/HAL/shared/cpu_exception/exception_hook.h new file mode 100644 index 0000000000..70d9434704 --- /dev/null +++ b/Marlin/src/HAL/shared/cpu_exception/exception_hook.h @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/* Here is the expected behavior of a system producing a CPU exception with this hook installed: + 1. Before the system is crashed + 1.1 Upon validation (not done yet in this code, but we could be using DEBUG flags here to allow/disallow hooking) + 1.2 Install the hook by overwriting the vector table exception handler with the hooked function + 2. Upon system crash (for example, by a dereference of a NULL pointer or anything else) + 2.1 The CPU triggers its exception and jump into the vector table for the exception type + 2.2 Instead of finding the default handler, it finds the updated pointer to our hook + 2.3 The CPU jumps into our hook function (likely a naked function to keep all information about crash point intact) + 2.4 The hook (naked) function saves the important registers (stack pointer, program counter, current mode) and jumps to a common exception handler (in C) + 2.5 The common exception handler dumps the registers on the serial link and perform a backtrace around the crashing point + 2.6 Once the backtrace is performed the last resort function is called (platform specific). + On some platform with a LCD screen, this might display the crash information as a QR code or as text for the + user to capture by taking a picture + 2.7 The CPU is reset and/or halted by triggering a debug breakpoint if a debugger is attached */ + +// Hook into CPU exception interrupt table to call the backtracing code upon an exception +// Most platform will simply do nothing here, but those who can will install/overwrite the default exception handler +// with a more performant exception handler +void hook_cpu_exceptions(); + +// Some platform might deal without a hard fault handler, in that case, return 0 in your platform here or skip implementing it +void * __attribute__((weak)) hook_get_hardfault_vector_address(unsigned base_address); +// Some platform might deal without a memory management fault handler, in that case, return 0 in your platform here or skip implementing it +void * __attribute__((weak)) hook_get_memfault_vector_address(unsigned base_address); +// Some platform might deal without a bus fault handler, in that case, return 0 in your platform here or skip implementing it +void * __attribute__((weak)) hook_get_busfault_vector_address(unsigned base_address); +// Some platform might deal without a usage fault handler, in that case, return 0 in your platform here or skip implementing it +void * __attribute__((weak)) hook_get_usagefault_vector_address(unsigned base_address); + +// Last resort function that can be called after the exception handler was called. +void __attribute__((weak)) hook_last_resort_func(); diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index b085e6145a..8aa6cdd6c8 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -36,6 +36,7 @@ #include "HAL/shared/Delay.h" #include "HAL/shared/esp_wifi.h" +#include "HAL/shared/cpu_exception/exception_hook.h" #ifdef ARDUINO #include @@ -935,6 +936,8 @@ void setup() { while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif + TERN_(DYNAMIC_VECTORTABLE, hook_cpu_exceptions()); // If supported, install Marlin exception handlers at runtime + SETUP_RUN(HAL_init()); // Init and disable SPI thermocouples; this is still needed diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 653ae6a553..805dcd52ce 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -152,8 +152,7 @@ NOMORE(len, FLASH_SIZE - addr); if (parser.seenval('X')) { // TODO: Write the hex bytes after the X - //while (len--) { - //} + //while (len--) {} } else { // while (len--) { @@ -180,7 +179,25 @@ for (int i = 10000; i--;) DELAY_US(1000UL); ENABLE_ISRS(); SERIAL_ECHOLNPGM("FAILURE: Watchdog did not trigger board reset."); + } break; + + #if ENABLED(POSTMORTEM_DEBUGGING) + case 451: { // Trigger all kind of faults to test exception catcher + SERIAL_ECHOLNPGM("Disabling heaters"); + thermalManager.disable_all_heaters(); + delay(1000); // Allow time to print + volatile uint8_t type[5] = { parser.byteval('T', 1) }; + + // The code below is obviously wrong and it's full of quirks to fool the compiler from optimizing away the code + switch (type[0]) { + case 1: default: *(int*)0 = 451; break; // Write at bad address + case 2: { volatile int a = 0; volatile int b = 452 / a; *(int*)&a = b; } break; // Divide by zero (some CPUs accept this, like ARM) + case 3: { *(uint32_t*)&type[1] = 453; volatile int a = *(int*)&type[1]; type[0] = a / 255; } break; // Unaligned access (some CPUs accept this) + case 4: { volatile void (*func)() = (volatile void (*)()) 0xE0000000; func(); } break; // Invalid instruction + } + break; } + #endif } } diff --git a/buildroot/share/PlatformIO/scripts/exc.S b/buildroot/share/PlatformIO/scripts/exc.S new file mode 100644 index 0000000000..1db462bb23 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/exc.S @@ -0,0 +1,104 @@ +/* ***************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * ****************************************************************************/ + +# On an exception, push a fake stack thread mode stack frame and redirect +# thread execution to a thread mode error handler + +# From RM008: +# The SP is decremented by eight words by the completion of the stack push. +# Figure 5-1 shows the contents of the stack after an exception pre-empts the +# current program flow. +# +# Old SP--> +# xPSR +# PC +# LR +# r12 +# r3 +# r2 +# r1 +# SP--> r0 + +.text +.globl __exc_nmi +.weak __exc_nmi +.globl __exc_hardfault +.weak __exc_hardfault +.globl __exc_memmanage +.weak __exc_memmanage +.globl __exc_busfault +.weak __exc_busfault +.globl __exc_usagefault +.weak __exc_usagefault + +.code 16 +.thumb_func +__exc_nmi: + mov r0, #1 + b __default_exc + +.thumb_func +__exc_hardfault: + mov r0, #2 + b __default_exc + +.thumb_func +__exc_memmanage: + mov r0, #3 + b __default_exc + +.thumb_func +__exc_busfault: + mov r0, #4 + b __default_exc + +.thumb_func +__exc_usagefault: + mov r0, #5 + b __default_exc + +.thumb_func +__default_exc: + ldr r2, NVIC_CCR @ Enable returning to thread mode even if there are + mov r1 ,#1 @ pending exceptions. See flag NONEBASETHRDENA. + str r1, [r2] + cpsid i @ Disable global interrupts + ldr r2, SYSTICK_CSR @ Disable systick handler + mov r1, #0 + str r1, [r2] + ldr r1, CPSR_MASK @ Set default CPSR + push {r1} + ldr r1, TARGET_PC @ Set target pc + push {r1} + sub sp, sp, #24 @ Don't care + ldr r1, EXC_RETURN @ Return to thread mode + mov lr, r1 + bx lr @ Exception exit + +.align 4 +CPSR_MASK: .word 0x61000000 +EXC_RETURN: .word 0xFFFFFFF9 +TARGET_PC: .word __error +NVIC_CCR: .word 0xE000ED14 @ NVIC configuration control register +SYSTICK_CSR: .word 0xE000E010 @ Systick control register diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py new file mode 100644 index 0000000000..94076cfbab --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -0,0 +1,29 @@ +from os.path import join, isfile +import shutil +from pprint import pprint + +Import("env") + +if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"): + FRAMEWORK_DIR = env.PioPlatform().get_package_dir("framework-arduinoststm32-maple") + patchflag_path = join(FRAMEWORK_DIR, ".exc-patching-done") + + # patch file only if we didn't do it before + if not isfile(patchflag_path): + print("Patching libmaple exception handlers") + original_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S") + backup_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S.bak") + src_file = join("buildroot", "share", "PlatformIO", "scripts", "exc.S") + + assert isfile(original_file) and isfile(src_file) + shutil.copyfile(original_file, backup_file) + shutil.copyfile(src_file, original_file); + + def _touch(path): + with open(path, "w") as fp: + fp.write("") + + env.Execute(lambda *args, **kwargs: _touch(patchflag_path)) + print("Done patching exception handler") + + print("Libmaple modified and ready for post mortem debugging") diff --git a/platformio.ini b/platformio.ini index 15fbf220d4..dd8a396849 100644 --- a/platformio.ini +++ b/platformio.ini @@ -64,6 +64,7 @@ default_src_filter = + - - + - - - - - - - - - + - - - - @@ -223,6 +224,8 @@ YHCB2004 = red-scorp/LiquidCrystal_AIP31068@^1.0.4, red-scorp/Sof HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip src_filter=+ extra_scripts=download_mks_assets.py +POSTMORTEM_DEBUGGING = src_filter=+ + + build_flags=-funwind-tables MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/master.zip HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 src_filter=+ + + + + @@ -637,14 +640,6 @@ platform = atmelsam extends = env:DUE board = dueUSB -[env:DUE_debug] -# Used when WATCHDOG_RESET_MANUAL is enabled -platform = atmelsam -extends = env:DUE -build_flags = ${common.build_flags} - -funwind-tables - -mpoke-function-name - # # Archim SAM # @@ -662,12 +657,6 @@ extra_scripts = ${common.extra_scripts} platform = ${common_DUE_archim.platform} extends = common_DUE_archim -# Used when WATCHDOG_RESET_MANUAL is enabled -[env:DUE_archim_debug] -platform = ${common_DUE_archim.platform} -extends = common_DUE_archim -build_flags = ${common_DUE_archim.build_flags} -funwind-tables -mpoke-function-name - ################################# # # # SAMD51 Architecture # @@ -763,6 +752,8 @@ lib_ignore = SPI, FreeRTOS701, FreeRTOS821 lib_deps = ${common.lib_deps} SoftwareSerialM platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/fix_framework_weakness.py # # STM32F103RC @@ -788,7 +779,7 @@ build_flags = ${common_stm32f1.build_flags} -DUSE_USB_COMPOSITE -DVECT_TAB_OFFSET=0x2000 -DGENERIC_BOOTLOADER -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py lib_deps = ${common.lib_deps} @@ -934,7 +925,7 @@ upload_protocol = serial platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 @@ -948,7 +939,7 @@ build_unflags = ${common_stm32f1.build_unflags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_mini.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE @@ -974,7 +965,7 @@ upload_protocol = jlink platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103ZE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin.py build_flags = ${common_stm32f1.build_flags} -DSS_TIMER=4 -DSTM32_XL_DENSITY @@ -1008,7 +999,7 @@ lib_deps = [env:mks_robin_pro] platform = ${common_stm32f1.platform} extends = env:mks_robin -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_pro.py # @@ -1017,7 +1008,7 @@ extra_scripts = ${common.extra_scripts} [env:trigorilla_pro] platform = ${common_stm32f1.platform} extends = env:mks_robin -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} # # MKS Robin E3D (STM32F103RCT6) and @@ -1041,7 +1032,7 @@ build_flags = ${common_stm32f1.build_flags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_e3p.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 @@ -1055,7 +1046,7 @@ upload_protocol = jlink platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_lite.py # @@ -1065,7 +1056,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_lite3.py # @@ -1075,7 +1066,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103ZE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py build_flags = ${common_stm32f1.build_flags} -DSTM32F1xx -DSTM32_XL_DENSITY @@ -1230,7 +1221,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/fly_mini.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 @@ -1557,7 +1548,6 @@ build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SE build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py - ################################# # # # Other Architectures # From a19c79d71400a9b9eb22e34372476fd3ce27362e Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sun, 21 Feb 2021 03:05:59 -0700 Subject: [PATCH 1037/1370] Enhance and fix FTDI Touch UI (#21148) --- .../ftdi_eve_touch_ui/language/language_en.h | 8 +- .../screens/bed_mesh_screen.cpp | 4 +- .../screens/cocoa_press_load_chocolate.cpp | 190 ++++++++++++++---- .../screens/cocoa_press_load_chocolate.h | 13 ++ .../screens/cocoa_press_main_menu.cpp | 51 +++-- .../screens/cocoa_press_move_e_screen.cpp | 12 +- .../screens/cocoa_press_preheat_menu.cpp | 16 +- .../screens/cocoa_press_preheat_screen.cpp | 24 +-- .../screens/cocoa_press_status_screen.cpp | 24 +-- .../screens/cocoa_press_ui.h | 13 +- .../confirm_user_request_alert_box.cpp | 6 + .../screens/move_axis_screen.cpp | 4 +- .../ftdi_eve_touch_ui/screens/screen_data.h | 1 + .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 2 + .../lib/ftdi_eve_touch_ui/screens/screens.h | 5 +- .../lib/ftdi_eve_touch_ui/theme/colors.h | 6 + 16 files changed, 272 insertions(+), 107 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index c898e7b737..e57858aa3f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -157,13 +157,13 @@ namespace Language_en { #ifdef TOUCH_UI_COCOA_PRESS PROGMEM Language_Str MSG_BODY = u8"Body"; - PROGMEM Language_Str MSG_INTERNAL = u8"Internal"; + PROGMEM Language_Str MSG_SELECT_CHOCOLATE_TYPE = u8"Select Chocolate Type"; PROGMEM Language_Str MSG_EXTERNAL = u8"External"; PROGMEM Language_Str MSG_CHOCOLATE = u8"Chocolate"; PROGMEM Language_Str MSG_UNLOAD_CARTRIDGE = u8"Unload Cartridge"; - PROGMEM Language_Str MSG_LOAD_CHOCOLATE = u8"Load Chocolate"; - PROGMEM Language_Str MSG_CARTRIDGE_IN = u8"Cartridge In"; - PROGMEM Language_Str MSG_CARTRIDGE_OUT = u8"Cartridge Out"; + PROGMEM Language_Str MSG_LOAD_UNLOAD = u8"Load/Unload"; + PROGMEM Language_Str MSG_FULL_LOAD = u8"Full Load"; + PROGMEM Language_Str MSG_FULL_UNLOAD = u8"Full Unload"; PROGMEM Language_Str MSG_PREHEAT_CHOCOLATE = u8"Preheat Chocolate"; PROGMEM Language_Str MSG_PREHEAT_FINISHED = u8"Preheat finished"; PROGMEM Language_Str MSG_PREHEAT = u8"Preheat"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index b62a9bf01b..6de573da8c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -271,7 +271,7 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { .cmd(CLEAR(true,true,true)); // Draw the shadow and tags - cmd.cmd(COLOR_RGB(0x444444)); + cmd.cmd(COLOR_RGB(Theme::bed_mesh_shadow_rgb)); BedMeshScreen::drawMesh(INSET_POS(MESH_POS), nullptr, USE_POINTS | USE_TAGS); cmd.cmd(COLOR_RGB(bg_text_enabled)); } @@ -282,6 +282,8 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { if (gotAllPoints) { drawHighlightedPointValue(); } + CommandProcessor cmd; + cmd.cmd(COLOR_RGB(Theme::bed_mesh_lines_rgb)); const float levelingProgress = sq(float(mydata.count) / GRID_MAX_POINTS); BedMeshScreen::drawMesh(INSET_POS(MESH_POS), ExtUI::getMeshArray(), USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (gotAllPoints ? USE_COLORS : 0), diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp index 23ad1b5da6..8b87c4ae41 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp @@ -27,69 +27,179 @@ #ifdef FTDI_COCOA_LOAD_CHOCOLATE_SCREEN +#include "../ftdi_eve_lib/extras/poly_ui.h" + +#include "cocoa_press_ui.h" + +#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) + +const uint8_t shadow_depth = 5; + using namespace ExtUI; using namespace FTDI; using namespace Theme; -#define GRID_COLS 2 -#define GRID_ROWS 6 +constexpr static LoadChocolateScreenData &mydata = screen_data.LoadChocolateScreen; -#define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) -#define DESCRIPTION_POS BTN_POS(1,2), BTN_SIZE(2,3) -#define CARTRIDGE_OUT_BTN_POS BTN_POS(1,5), BTN_SIZE(1,1) -#define CARTRIDGE_IN_BTN_POS BTN_POS(2,5), BTN_SIZE(1,1) -#define BACK_BTN_POS BTN_POS(1,6), BTN_SIZE(2,1) +void LoadChocolateScreen::draw_syringe(draw_mode_t what) { + #if ENABLED(COCOA_PRESS_CHOCOLATE_LEVEL_SENSOR) + const float fill_level = get_chocolate_fill_level(); + #else + constexpr float fill_level = 1.0f; + #endif -void LoadChocolateScreen::onRedraw(draw_mode_t what) { CommandProcessor cmd; + PolyUI ui(cmd, what); if (what & BACKGROUND) { - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0) - .font(font_large) - .text(TITLE_POS, GET_TEXT_F(MSG_LOAD_CHOCOLATE)); - draw_text_box(cmd, DESCRIPTION_POS, F( - "Drop your chocolate refill into the cartridge. " - "Press and hold the Cartridge Out button until " - "the plunger adapter is visible at the bottom of " - "the extruder. Securely attach a red plunger to " - "the plunger adapter and load the cartridge onto " - "the plunger. Press and hold Cartridge In button " - "until cartridge is fully loaded into the extruder, " - "and use the buttons to help follow the locking path " - "to lock"), - OPT_CENTERY, font_medium); + // Paint the shadow for the syringe + ui.color(shadow_rgb); + ui.shadow(POLY(syringe_outline), shadow_depth); } if (what & FOREGROUND) { - cmd.font(font_medium) - .colors(normal_btn) - .tag(2).button(CARTRIDGE_OUT_BTN_POS, GET_TEXT_F(MSG_CARTRIDGE_OUT)) - .tag(3).button(CARTRIDGE_IN_BTN_POS, GET_TEXT_F(MSG_CARTRIDGE_IN)) - .colors(action_btn) - .tag(1).button(BACK_BTN_POS, GET_TEXT_F(MSG_BACK)); + int16_t x, y, h, v; + + // Paint the syringe icon + ui.color(syringe_rgb); + ui.fill(POLY(syringe_outline)); + + ui.color(fluid_rgb); + ui.bounds(POLY(syringe_fluid), x, y, h, v); + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(SCISSOR_XY(x,y + v * (1.0 - fill_level))); + cmd.cmd(SCISSOR_SIZE(h, v * fill_level)); + ui.fill(POLY(syringe_fluid), false); + cmd.cmd(RESTORE_CONTEXT()); + + ui.color(stroke_rgb); + ui.fill(POLY(syringe)); } } +void LoadChocolateScreen::draw_buttons(draw_mode_t what) { + int16_t x, y, h, v; + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + cmd.font(font_medium).colors(normal_btn); + + ui.bounds(POLY(load_screen_unload_btn), x, y, h, v); + cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_FULL_UNLOAD)); + + ui.bounds(POLY(load_screen_load_btn), x, y, h, v); + cmd.tag(3).button(x, y, h, v, GET_TEXT_F(MSG_FULL_LOAD)); + + ui.bounds(POLY(load_screen_back_btn), x, y, h, v); + cmd.tag(1).colors(action_btn).button(x, y, h, v, GET_TEXT_F(MSG_BACK)); +} + +void LoadChocolateScreen::draw_text(draw_mode_t what) { + if (what & BACKGROUND) { + int16_t x, y, h, v; + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + cmd.font(font_medium).cmd(COLOR_RGB(bg_text_enabled)); + + ui.bounds(POLY(load_sreen_title), x, y, h, v); + cmd.tag(2).text(x, y, h, v, GET_TEXT_F(MSG_LOAD_UNLOAD)); + + ui.bounds(POLY(load_screen_increment), x, y, h, v); + cmd.tag(3).text(x, y, h, v, GET_TEXT_F(MSG_INCREMENT)); + } +} + +void LoadChocolateScreen::draw_arrows(draw_mode_t what) { + CommandProcessor cmd; + PolyUI ui(cmd, what); + + ui.button_fill (fill_rgb); + ui.button_stroke(stroke_rgb, 28); + ui.button_shadow(shadow_rgb, shadow_depth); + + constexpr uint8_t style = PolyUI::REGULAR; + + ui.button(4, POLY(load_screen_extrude), style); + ui.button(5, POLY(load_screen_retract), style); +} + +void LoadChocolateScreen::onEntry() { + mydata.repeat_tag = 0; +} + +void LoadChocolateScreen::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + draw_syringe(what); + draw_arrows(what); + draw_buttons(what); + draw_text(what); +} + +bool LoadChocolateScreen::onTouchStart(uint8_t) { + mydata.repeat_tag = 0; + return true; +} + bool LoadChocolateScreen::onTouchEnd(uint8_t tag) { using namespace ExtUI; switch (tag) { + case 2: + mydata.repeat_tag = (mydata.repeat_tag == 2) ? 0 : 2; + break; + case 3: + mydata.repeat_tag = (mydata.repeat_tag == 3) ? 0 : 3; + break; case 1: GOTO_PREVIOUS(); break; } return true; } +void LoadChocolateScreen::setManualFeedrateAndIncrement(float feedrate_mm_s, float &increment_mm) { + // Compute increment so feedrate so that the tool lags the adjuster when it is + // being held down, this allows enough margin for the planner to + // connect segments and even out the motion. + ExtUI::setFeedrate_mm_s(feedrate_mm_s); + increment_mm = feedrate_mm_s / ((TOUCH_REPEATS_PER_SECOND) * 0.80f); +} + bool LoadChocolateScreen::onTouchHeld(uint8_t tag) { if (ExtUI::isMoving()) return false; // Don't allow moves to accumulate - constexpr float increment = 0.25; - MoveAxisScreen::setManualFeedrate(E0, increment); + float increment; + setManualFeedrateAndIncrement(20, increment); #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); switch (tag) { - case 2: UI_DECREMENT_AXIS(E0); break; - case 3: UI_INCREMENT_AXIS(E0); break; + case 2: { + if (get_chocolate_fill_level() < 0.1) { + mydata.repeat_tag = 0; + return false; + } + UI_INCREMENT_AXIS(E0); + break; + } + case 3: { + if (get_chocolate_fill_level() > 0.9) { + mydata.repeat_tag = 0; + return false; + } + UI_DECREMENT_AXIS(E0); + break; + } + case 4: + UI_INCREMENT_AXIS(E0); + break; + case 5: + UI_DECREMENT_AXIS(E0); + break; default: return false; } #undef UI_DECREMENT_AXIS @@ -97,4 +207,14 @@ bool LoadChocolateScreen::onTouchHeld(uint8_t tag) { return false; } +void LoadChocolateScreen::onIdle() { + reset_menu_timeout(); + if (mydata.repeat_tag) onTouchHeld(mydata.repeat_tag); + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + if (!EventLoop::is_touch_held()) + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} #endif // FTDI_COCOA_LOAD_CHOCOLATE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h index 262a6c9802..582a62fe05 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h @@ -26,9 +26,22 @@ #define FTDI_COCOA_LOAD_CHOCOLATE_SCREEN #define FTDI_COCOA_LOAD_CHOCOLATE_SCREEN_CLASS LoadChocolateScreen +struct LoadChocolateScreenData { + uint8_t repeat_tag; +}; + class LoadChocolateScreen : public BaseScreen, public CachedScreen { + private: + static void setManualFeedrateAndIncrement(float feedrate_mm_s, float &increment); + static void draw_syringe(draw_mode_t what); + static void draw_arrows(draw_mode_t what); + static void draw_buttons(draw_mode_t what); + static void draw_text(draw_mode_t what); public: + static void onEntry(); + static void onIdle(); static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); static bool onTouchEnd(uint8_t tag); static bool onTouchHeld(uint8_t tag); }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp index 56981e3084..f35b3296d8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp @@ -29,17 +29,19 @@ using namespace FTDI; using namespace Theme; -#define GRID_ROWS 4 +#define GRID_ROWS 5 #define GRID_COLS 2 -#define MOVE_XYZ_POS BTN_POS(1,1), BTN_SIZE(1,1) +#define ZPROBE_ZOFFSET_POS BTN_POS(1,1), BTN_SIZE(1,1) +#define MOVE_XYZ_POS BTN_POS(1,2), BTN_SIZE(1,1) #define TEMPERATURE_POS BTN_POS(2,1), BTN_SIZE(1,1) -#define ZPROBE_ZOFFSET_POS BTN_POS(1,2), BTN_SIZE(1,1) #define MOVE_E_POS BTN_POS(2,2), BTN_SIZE(1,1) #define SPEED_POS BTN_POS(1,3), BTN_SIZE(1,1) #define ADVANCED_SETTINGS_POS BTN_POS(2,3), BTN_SIZE(1,1) -#define ABOUT_PRINTER_POS BTN_POS(1,4), BTN_SIZE(1,1) -#define BACK_POS BTN_POS(2,4), BTN_SIZE(1,1) +#define DISABLE_STEPPERS_POS BTN_POS(1,4), BTN_SIZE(1,1) +#define LEVELING_POS BTN_POS(2,4), BTN_SIZE(1,1) +#define ABOUT_PRINTER_POS BTN_POS(1,5), BTN_SIZE(1,1) +#define BACK_POS BTN_POS(2,5), BTN_SIZE(1,1) void MainMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { @@ -52,16 +54,19 @@ void MainMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(Theme::font_medium) - .tag(2).button(MOVE_XYZ_POS, GET_TEXT_F(MSG_XYZ_MOVE)) - .tag(3).button(TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .tag( 2).button(MOVE_XYZ_POS, GET_TEXT_F(MSG_XYZ_MOVE)) + .tag( 3).button(TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) .enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE)) - .tag(4).button(ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) - .tag(5).button(MOVE_E_POS, GET_TEXT_F(MSG_E_MOVE)) - .tag(6).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) - .tag(7).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .tag(8).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .tag( 4).button(ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) + .tag( 5).button(MOVE_E_POS, GET_TEXT_F(MSG_E_MOVE)) + .tag( 6).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) + .tag( 7).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag( 8).button(DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS)) + .enabled(HAS_LEVELING) + .tag( 9).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) + .tag(10).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) - .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } @@ -69,16 +74,20 @@ bool MainMenu::onTouchEnd(uint8_t tag) { using namespace ExtUI; switch (tag) { - case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; - case 2: GOTO_SCREEN(MoveXYZScreen); break; - case 3: GOTO_SCREEN(TemperatureScreen); break; + case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; + case 2: GOTO_SCREEN(MoveXYZScreen); break; + case 3: GOTO_SCREEN(TemperatureScreen); break; #if BOTH(HAS_LEVELING, HAS_BED_PROBE) - case 4: GOTO_SCREEN(ZOffsetScreen); break; + case 4: GOTO_SCREEN(ZOffsetScreen); break; #endif - case 5: GOTO_SCREEN(MoveEScreen); break; - case 6: GOTO_SCREEN(FeedratePercentScreen); break; - case 7: GOTO_SCREEN(AdvancedSettingsMenu); break; - case 8: GOTO_SCREEN(AboutScreen); break; + case 5: GOTO_SCREEN(MoveEScreen); break; + case 6: GOTO_SCREEN(FeedratePercentScreen); break; + case 7: GOTO_SCREEN(AdvancedSettingsMenu); break; + case 8: injectCommands_P(PSTR("M84")); break; + #if HAS_LEVELING + case 9: GOTO_SCREEN(LevelingMenu); break; + #endif + case 10: GOTO_SCREEN(AboutScreen); break; default: return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp index 10660736fa..d199b492e4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp @@ -30,6 +30,8 @@ using namespace FTDI; using namespace ExtUI; +constexpr static MoveAxisScreenData &mydata = screen_data.MoveAxisScreen; + void MoveEScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(1); @@ -37,15 +39,15 @@ void MoveEScreen::onRedraw(draw_mode_t what) { w.heading( GET_TEXT_F(MSG_E_MOVE)); w.color(Theme::e_axis); #if EXTRUDERS == 1 - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxis.e_rel[0], canMove(E0)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), mydata.e_rel[0], canMove(E0)); #elif HAS_MULTI_EXTRUDER - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxis.e_rel[0], canMove(E0)); - w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxis.e_rel[1], canMove(E1)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), mydata.e_rel[0], canMove(E0)); + w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), mydata.e_rel[1], canMove(E1)); #if EXTRUDERS > 2 - w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxis.e_rel[2], canMove(E2)); + w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), mydata.e_rel[2], canMove(E2)); #endif #if EXTRUDERS > 3 - w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxis.e_rel[3], canMove(E3)); + w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), mydata.e_rel[3], canMove(E3)); #endif #endif w.increments(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp index d515b2a27b..92d1522360 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp @@ -32,7 +32,7 @@ using namespace Theme; #define GRID_COLS 2 void PreheatMenu::onRedraw(draw_mode_t what) { - const int16_t w = has_extra_heater() ? BTN_W(1) : BTN_W(2); + const int16_t w = TERN0(COCOA_PRESS_EXTRA_HEATER, has_extra_heater() ? BTN_W(1) : BTN_W(2)); const int16_t h = BTN_H(1); if (what & BACKGROUND) { @@ -42,10 +42,12 @@ void PreheatMenu::onRedraw(draw_mode_t what) { .tag(0) .cmd(COLOR_RGB(bg_text_enabled)) .font(Theme::font_medium) - .text ( BTN_POS(1,1), w, h, GET_TEXT_F(MSG_INTERNAL)); - if (has_extra_heater()) { + .text( BTN_POS(1,1), w, h, GET_TEXT_F(MSG_SELECT_CHOCOLATE_TYPE)); + #if ENABLED(COCOA_PRESS_EXTRA_HEATER) + if (has_extra_heater()) { cmd.text( BTN_POS(2,1), w, h, GET_TEXT_F(MSG_EXTERNAL)); - } + } + #endif } if (what & FOREGROUND) { @@ -55,11 +57,13 @@ void PreheatMenu::onRedraw(draw_mode_t what) { .tag(2).button(BTN_POS(1,2), w, h, F("Dark Chocolate")) .tag(3).button(BTN_POS(1,3), w, h, F("Milk Chocolate")) .tag(4).button(BTN_POS(1,4), w, h, F("White Chocolate")); - if (has_extra_heater()) { + #if ENABLED(COCOA_PRESS_EXTRA_HEATER) + if (has_extra_heater()) { cmd.tag(5).button(BTN_POS(2,2), w, h, F("Dark Chocolate")) .tag(6).button(BTN_POS(2,3), w, h, F("Milk Chocolate")) .tag(7).button(BTN_POS(2,4), w, h, F("White Chocolate")); - } + } + #endif cmd.colors(action_btn) .tag(1) .button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp index abea9dcdfe..66256ab46f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp @@ -101,7 +101,7 @@ void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, progmem_st cmd.tag(0) .font(font_small); if (what & BACKGROUND) { - cmd.text( SUB_POS(1,1), SUB_SIZE(9,1), label) + cmd.text( SUB_POS(1,1), SUB_SIZE(9,1), label) .button(SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT); } @@ -126,20 +126,20 @@ void PreheatTimerScreen::onRedraw(draw_mode_t what) { draw_message(what); draw_time_remaining(what); draw_interaction_buttons(what); - draw_adjuster(what, 1, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0), NOZZLE_ADJ_POS); - draw_adjuster(what, 3, GET_TEXT_F(MSG_BODY), getTargetTemp_celsius(E1), BODY_ADJ_POS); - draw_adjuster(what, 5, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS); + draw_adjuster(what, 2, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0), NOZZLE_ADJ_POS); + draw_adjuster(what, 4, GET_TEXT_F(MSG_BODY), getTargetTemp_celsius(E1), BODY_ADJ_POS); + draw_adjuster(what, 6, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS); } bool PreheatTimerScreen::onTouchHeld(uint8_t tag) { - const float increment = (tag == 5 || tag == 6) ? 1 : 0.1; + const float increment = (tag == 6 || tag == 7) ? 1 : 0.1; switch (tag) { - case 1: UI_DECREMENT(TargetTemp_celsius, E0); break; - case 2: UI_INCREMENT(TargetTemp_celsius, E0); break; - case 3: UI_DECREMENT(TargetTemp_celsius, E1); break; - case 4: UI_INCREMENT(TargetTemp_celsius, E1); break; - case 5: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break; - case 6: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break; + case 2: UI_DECREMENT(TargetTemp_celsius, E0); break; + case 3: UI_INCREMENT(TargetTemp_celsius, E0); break; + case 4: UI_DECREMENT(TargetTemp_celsius, E1); break; + case 5: UI_INCREMENT(TargetTemp_celsius, E1); break; + case 6: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break; + case 7: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break; default: return false; } @@ -149,7 +149,7 @@ bool PreheatTimerScreen::onTouchHeld(uint8_t tag) { bool PreheatTimerScreen::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); return true; - default: break; + default: return current_screen.onTouchHeld(tag); } return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp index f7d44e2936..7caa9c7944 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -86,10 +86,8 @@ void StatusScreen::draw_temperature(draw_mode_t what) { int16_t x, y, h, v; if (what & BACKGROUND) { - cmd.cmd(COLOR_RGB(bg_color)); - cmd.cmd(COLOR_RGB(fluid_rgb)); - cmd.font(font_medium); + cmd.font(font_medium).tag(10); ui.bounds(POLY(chocolate_label), x, y, h, v); cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHOCOLATE)); @@ -119,7 +117,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { char str[15]; cmd.cmd(COLOR_RGB(fluid_rgb)); - cmd.font(font_large); + cmd.font(font_large).tag(10); format_temp(str, getActualTemp_celsius(E0)); ui.bounds(POLY(h0_temp), x, y, h, v); @@ -144,11 +142,8 @@ void StatusScreen::draw_temperature(draw_mode_t what) { } void StatusScreen::draw_syringe(draw_mode_t what) { - #if NUM_SERVOS < 2 - // Note, this requires a new pin 108 to be added to to access ADC9 - // "ArduinoAddons/arduino-1.8.5/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/variant.cpp" - const int val = analogRead(108); - const float fill_level = float(val) / 1024; + #if ENABLED(COCOA_PRESS_CHOCOLATE_LEVEL_SENSOR) + const float fill_level = get_chocolate_fill_level(); #else constexpr float fill_level = 1.0f; #endif @@ -192,15 +187,13 @@ void StatusScreen::draw_buttons(draw_mode_t what) { CommandProcessor cmd; PolyUI ui(cmd, what); - ui.bounds(POLY(unload_cartridge_btn), x, y, h, v); - cmd.font(font_medium).colors(normal_btn); - ui.bounds(POLY(unload_cartridge_btn), x, y, h, v); - cmd.tag(1).button(x, y, h, v, GET_TEXT_F(MSG_UNLOAD_CARTRIDGE)); + ui.bounds(POLY(park_btn), x, y, h, v); + cmd.tag(1).button(x, y, h, v, GET_TEXT_F(MSG_FILAMENT_PARK_ENABLED)); ui.bounds(POLY(load_chocolate_btn), x, y, h, v); - cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_LOAD_CHOCOLATE)); + cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_LOAD_UNLOAD)); ui.bounds(POLY(preheat_chocolate_btn), x, y, h, v); cmd.tag(3).button(x, y, h, v, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE)); @@ -242,7 +235,7 @@ bool StatusScreen::onTouchStart(uint8_t) { bool StatusScreen::onTouchEnd(uint8_t tag) { switch (tag) { - case 1: GOTO_SCREEN(UnloadCartridgeScreen); break; + case 1: SpinnerDialogBox::enqueueAndWait_P(F("G0 X0 Y0")); break; case 2: GOTO_SCREEN(LoadChocolateScreen); break; case 3: GOTO_SCREEN(PreheatMenu); break; case 4: GOTO_SCREEN(MainMenu); break; @@ -270,6 +263,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) { PUSH_SCREEN(StatusScreen); break; case 9: GOTO_SCREEN(FilesScreen); break; + case 10: GOTO_SCREEN(TemperatureScreen); break; default: return false; } // If a passcode is enabled, the LockScreen will prevent the diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h index 5cbaced7f6..f67961830f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** @@ -32,7 +32,7 @@ constexpr float y_max = 272.000000; const PROGMEM uint16_t syringe_outline[] = {0xED96, 0x14F0, 0xE65D, 0x10E9, 0xDED2, 0x0F9C, 0xD74B, 0x110E, 0xD01B, 0x1543, 0xCE80, 0x1836, 0xCE0A, 0x1C3A, 0xCE0F, 0x27AD, 0xCF0A, 0x2BD3, 0xD127, 0x2E5B, 0xD2A1, 0x2FF0, 0xD2A2, 0x9FC9, 0xD407, 0xA97A, 0xD7B9, 0xB10C, 0xD7BF, 0xBB58, 0xD978, 0xC2BE, 0xDD55, 0xC6EB, 0xDD58, 0xD159, 0xDE3B, 0xD3A8, 0xDFCF, 0xD3AF, 0xE0B8, 0xD04C, 0xE0B8, 0xC6EB, 0xE4A7, 0xC299, 0xE652, 0xBAF6, 0xE652, 0xB10C, 0xEA2E, 0xA8EA, 0xEB6C, 0x9E86, 0xEB6C, 0x2F58, 0xEF3C, 0x2B4E, 0xF003, 0x2583, 0xEFFD, 0x1AC2, 0xED96, 0x14F0, 0xED96, 0x14F0}; const PROGMEM uint16_t syringe_fluid[] = {0xDE73, 0x2512, 0xDA0C, 0x261D, 0xD5B8, 0x29A0, 0xD4AE, 0x2D87, 0xD4AE, 0x9F60, 0xD585, 0xA63B, 0xDE44, 0xA9DE, 0xE32A, 0xA942, 0xE7E3, 0xA6A5, 0xE930, 0xA342, 0xE95D, 0x9C1D, 0xE95B, 0x31B8, 0xE955, 0x2B63, 0xE867, 0x2A67, 0xE790, 0x28DE, 0xE342, 0x25CB, 0xDE73, 0x2512}; const PROGMEM uint16_t syringe[] = {0xED91, 0x1502, 0xE658, 0x10FB, 0xDECE, 0x0FAE, 0xD746, 0x1120, 0xD016, 0x1555, 0xCE7B, 0x1848, 0xCE05, 0x1C4D, 0xCE0A, 0x27BF, 0xCF05, 0x2BE5, 0xD122, 0x2E6E, 0xD29C, 0x3002, 0xD29D, 0x9FDB, 0xD402, 0xA98C, 0xD7B4, 0xB11F, 0xD7BA, 0xBB6A, 0xD973, 0xC2D1, 0xDD50, 0xC6FD, 0xDD53, 0xD16C, 0xDE36, 0xD3BA, 0xDFCA, 0xD3C2, 0xE0B3, 0xD05E, 0xE0B3, 0xC6FD, 0xE4A2, 0xC2AB, 0xE64D, 0xBB09, 0xE64D, 0xB11F, 0xEA29, 0xA8FC, 0xEB67, 0x9E98, 0xEB67, 0x2F6B, 0xEF37, 0x2B60, 0xEFFE, 0x2595, 0xEFF8, 0x1AD5, 0xED91, 0x1502, 0xED91, 0x1502, 0xFFFF, 0xD1CF, 0x1A7E, 0xD84F, 0x16DB, 0xDF19, 0x15A9, 0xE5E0, 0x16EA, 0xEC5B, 0x1AA4, 0xEC9D, 0x1D34, 0xEC9D, 0x20CC, 0xE5F1, 0x1D41, 0xDF02, 0x1C12, 0xD812, 0x1D41, 0xD166, 0x20CC, 0xD16C, 0x1B45, 0xD1CF, 0x1A7E, 0xFFFF, 0xE3BD, 0xACFD, 0xDE8E, 0xAF4F, 0xD988, 0xAC0F, 0xD7CC, 0xA8CD, 0xDD1C, 0xAAA9, 0xE287, 0xAA5B, 0xE655, 0xA8BE, 0xE3BD, 0xACFD, 0xFFFF, 0xE802, 0x2DC5, 0xE809, 0x343C, 0xE808, 0x9FC8, 0xE7E3, 0xA296, 0xE70D, 0xA4B1, 0xE2C9, 0xA70E, 0xDE4E, 0xA790, 0xD6A1, 0xA457, 0xD5FF, 0x9F2B, 0xD5FF, 0x2DFD, 0xD6B2, 0x2B72, 0xDA78, 0x2861, 0xDE9D, 0x276F, 0xE300, 0x2824, 0xE70D, 0x2B13, 0xE7FF, 0x2DB6, 0xE800, 0x2DC5, 0xE802, 0x2DC5, 0xFFFF, 0xE2ED, 0xBA8B, 0xE1CC, 0xBF52, 0xDF1C, 0xC165, 0xDC64, 0xBF99, 0xDB1B, 0xBAFF, 0xDB19, 0xB433, 0xDF04, 0xB552, 0xE2EF, 0xB438, 0xE2ED, 0xBA8B, 0xFFFF, 0xEC09, 0x2893, 0xE925, 0x2A08, 0xE57D, 0x261D, 0xE149, 0x246F, 0xDBDE, 0x24A0, 0xD6BC, 0x2795, 0xD484, 0x2A46, 0xD1C0, 0x2853, 0xD166, 0x251E, 0xD80D, 0x2151, 0xDF02, 0x200C, 0xE5F6, 0x2151, 0xEC9D, 0x251E, 0xEC09, 0x2893}; -const PROGMEM uint16_t unload_cartridge_btn[] = {0x0AAA, 0x0E1E, 0x57FF, 0x0E1E, 0x57FF, 0x33C3, 0x0AAA, 0x33C3, 0x0AAA, 0x0E1E}; +const PROGMEM uint16_t park_btn[] = {0x0AAA, 0x0E1E, 0x57FF, 0x0E1E, 0x57FF, 0x33C3, 0x0AAA, 0x33C3, 0x0AAA, 0x0E1E}; const PROGMEM uint16_t pause_btn[] = {0x47FF, 0xCA58, 0x7FFF, 0xCA58, 0x7FFF, 0xEFFE, 0x47FF, 0xEFFE, 0x47FF, 0xCA58}; const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAA, 0x3D2C, 0x57FF, 0x3D2C, 0x57FF, 0x62D2, 0x0AAA, 0x62D2, 0x0AAA, 0x3D2C}; const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAA, 0x6C3B, 0x57FF, 0x6C3B, 0x57FF, 0x91E0, 0x0AAA, 0x91E0, 0x0AAA, 0x6C3B}; @@ -49,6 +49,13 @@ const PROGMEM uint16_t h0_label[] = {0x62A9, 0x2A5A, 0x8FFE, 0x2A5A, 0x8FFE, 0x4 const PROGMEM uint16_t h0_temp[] = {0x62A9, 0x41E1, 0x8FFE, 0x41E1, 0x8FFE, 0x5968, 0x62A9, 0x5968, 0x62A9, 0x41E1}; const PROGMEM uint16_t h1_label[] = {0x8FFE, 0x2A5A, 0xBD53, 0x2A5A, 0xBD53, 0x41E1, 0x8FFE, 0x41E1, 0x8FFE, 0x2A5A}; const PROGMEM uint16_t h1_temp[] = {0x8FFE, 0x41E1, 0xBD53, 0x41E1, 0xBD53, 0x5968, 0x8FFE, 0x5968, 0x8FFE, 0x41E1}; -const PROGMEM uint16_t extrude_btn[] = {0xC859, 0xDD2B, 0xF5AE, 0xDD2B, 0xF5AE, 0xEFFE, 0xC859, 0xEFFE, 0xC859, 0xDD2B}; const PROGMEM uint16_t h2_label[] = {0x8FFE, 0x5E1D, 0xBD53, 0x5E1D, 0xBD53, 0x75A4, 0x8FFE, 0x75A4, 0x8FFE, 0x5E1D}; const PROGMEM uint16_t h2_temp[] = {0x8FFE, 0x75A4, 0xBD53, 0x75A4, 0xBD53, 0x8D2C, 0x8FFE, 0x8D2C, 0x8FFE, 0x75A4}; +const PROGMEM uint16_t extrude_btn[] = {0xC859, 0xDD2B, 0xF5AE, 0xDD2B, 0xF5AE, 0xEFFE, 0xC859, 0xEFFE, 0xC859, 0xDD2B}; +const PROGMEM uint16_t load_screen_extrude[] = {0x25FB, 0x89AE, 0x2F58, 0x89AE, 0x2F58, 0xAAF6, 0x3406, 0xAAF6, 0x2AAA, 0xBB9A, 0x214D, 0xAAF6, 0x25FB, 0xAAF6, 0x25FB, 0x89AE}; +const PROGMEM uint16_t load_screen_retract[] = {0x25FC, 0x790A, 0x2F58, 0x790A, 0x2F58, 0x57C2, 0x3406, 0x57C2, 0x2AAA, 0x471D, 0x214D, 0x57C2, 0x25FC, 0x57C2, 0x25FC, 0x790A}; +const PROGMEM uint16_t load_screen_back_btn[] = {0x1555, 0xCA58, 0xC553, 0xCA58, 0xC553, 0xEFFE, 0x1555, 0xEFFE, 0x1555, 0xCA58}; +const PROGMEM uint16_t load_screen_unload_btn[] = {0x4AAA, 0x8EBD, 0xC553, 0x8EBD, 0xC553, 0xB463, 0x4AAA, 0xB463, 0x4AAA, 0x8EBD}; +const PROGMEM uint16_t load_screen_load_btn[] = {0x4AAA, 0x5322, 0xC553, 0x5322, 0xC553, 0x78C7, 0x4AAA, 0x78C7, 0x4AAA, 0x5322}; +const PROGMEM uint16_t load_sreen_title[] = {0x4AAA, 0x1787, 0xC553, 0x1787, 0xC553, 0x3D2C, 0x4AAA, 0x3D2C, 0x4AAA, 0x1787}; +const PROGMEM uint16_t load_screen_increment[] = {0x1555, 0x2E1D, 0x3FFF, 0x2E1D, 0x3FFF, 0x3D2C, 0x1555, 0x3D2C, 0x1555, 0x2E1D}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index 957c95f047..e3892217a5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -50,6 +50,12 @@ bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { } } +void ConfirmUserRequestAlertBox::onIdle() { + if (!ExtUI::awaitingUserConfirm()) { + hide(); + } +} + void ConfirmUserRequestAlertBox::show(const char* msg) { drawMessage(msg); storeBackground(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index 5f5971458a..7edf8e1640 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -70,8 +70,8 @@ void MoveAxisScreen::onRedraw(draw_mode_t what) { } bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) { - #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); - #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); + #define UI_INCREMENT_AXIS(axis) setManualFeedrate(axis, increment); UI_INCREMENT(AxisPosition_mm, axis); + #define UI_DECREMENT_AXIS(axis) setManualFeedrate(axis, increment); UI_DECREMENT(AxisPosition_mm, axis); const float increment = getIncrement(); switch (tag) { case 2: UI_DECREMENT_AXIS(X); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index e725a23797..06368f0ce7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -58,6 +58,7 @@ union screen_data_t { DECL_DATA_IF_INCLUDED(FTDI_BED_MESH_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_STRESS_TEST_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_COCOA_LOAD_CHOCOLATE_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_NUDGE_NOZZLE_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_BASE_NUMERIC_ADJ_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_ALERT_DIALOG_BOX) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index ab3c3d7114..2c9d881173 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -98,6 +98,8 @@ SCREEN_TABLE { DECL_SCREEN_IF_INCLUDED(FTDI_BIO_PRINTING_DIALOG_BOX) DECL_SCREEN_IF_INCLUDED(FTDI_BIO_CONFIRMOME_XYZ) DECL_SCREEN_IF_INCLUDED(FTDI_BIO_CONFIRMOME_E) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_STATUS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_MAIN_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index a82d8988da..1574576fa1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -100,7 +100,6 @@ enum { #if ENABLED(TOUCH_UI_COCOA_PRESS) PREHEAT_MENU_CACHE, PREHEAT_TIMER_SCREEN_CACHE, - UNLOAD_CARTRIDGE_SCREEN_CACHE, LOAD_CHOCOLATE_SCREEN_CACHE, MOVE_XYZ_SCREEN_CACHE, MOVE_E_SCREEN_CACHE, @@ -145,11 +144,11 @@ enum { #elif ENABLED(TOUCH_UI_COCOA_PRESS) #include "cocoa_press_status_screen.h" #include "cocoa_press_main_menu.h" - #include "cocoa_press_advanced_settings.h" + #include "cocoa_press_advanced_settings_menu.h" #include "cocoa_press_preheat_menu.h" #include "cocoa_press_preheat_screen.h" - #include "cocoa_press_unload_cartridge.h" #include "cocoa_press_load_chocolate.h" + #include "move_axis_screen.h" #include "cocoa_press_move_xyz_screen.h" #include "cocoa_press_move_e_screen.h" #include "tune_menu.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h index cdcf00a21b..0fe83bce46 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -85,6 +85,9 @@ namespace Theme { constexpr uint32_t logo_bg_rgb = accent_color_1; constexpr uint32_t logo_fill_rgb = accent_color_0; constexpr uint32_t logo_stroke_rgb = accent_color_4; + + constexpr uint32_t bed_mesh_lines_rgb = 0xFFFFFF; + constexpr uint32_t bed_mesh_shadow_rgb = 0x444444; #elif ANY(TOUCH_UI_COCOA_THEME, TOUCH_UI_FROZEN_THEME) constexpr uint32_t theme_darkest = accent_color_1; constexpr uint32_t theme_dark = accent_color_4; @@ -102,6 +105,9 @@ namespace Theme { constexpr uint32_t logo_bg_rgb = accent_color_5; constexpr uint32_t logo_fill_rgb = accent_color_6; constexpr uint32_t logo_stroke_rgb = accent_color_2; + + constexpr uint32_t bed_mesh_lines_rgb = accent_color_6; + constexpr uint32_t bed_mesh_shadow_rgb = 0x444444; #else constexpr uint32_t theme_darkest = gray_color_1; constexpr uint32_t theme_dark = gray_color_2; From 1ab1c62f032dbe1976839b8af5d40a06ca9af5bc Mon Sep 17 00:00:00 2001 From: Marcio T Date: Mon, 22 Feb 2021 21:38:54 -0700 Subject: [PATCH 1038/1370] FTDI Touch UI followup (#21167) --- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h | 1 - Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 1574576fa1..61d702ebaf 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -175,7 +175,6 @@ enum { #include "change_filament_screen.h" #include "move_axis_screen.h" #include "steps_screen.h" -#include "stepper_current_screen.h" #include "feedrate_percent_screen.h" #include "max_velocity_screen.h" #include "max_acceleration_screen.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h index 0fe83bce46..1649675122 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -125,6 +125,9 @@ namespace Theme { constexpr uint32_t logo_bg_rgb = accent_color_4; constexpr uint32_t logo_fill_rgb = accent_color_3; constexpr uint32_t logo_stroke_rgb = 0x000000; + + constexpr uint32_t bed_mesh_lines_rgb = 0xFFFFFF; + constexpr uint32_t bed_mesh_shadow_rgb = 0x444444; #endif constexpr uint32_t shadow_rgb = gray_color_6; From 8fca59f63b833570706a948e1dd33fa687aa9255 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Feb 2021 16:08:00 -0600 Subject: [PATCH 1039/1370] G92, subcodes flag cleanup --- Marlin/src/gcode/geometry/G92.cpp | 79 +++++++++++++++++------------- Marlin/src/gcode/parser.cpp | 6 +-- Marlin/src/gcode/parser.h | 4 +- Marlin/src/inc/Conditionals_post.h | 2 +- 4 files changed, 52 insertions(+), 39 deletions(-) diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp index 1a0382ed7c..30620be6f9 100644 --- a/Marlin/src/gcode/geometry/G92.cpp +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -29,77 +29,90 @@ #endif /** - * G92: Set current position to given X Y Z E + * G92: Set the Current Position to the given X Y Z E values. + * + * Behind the scenes the G92 command may modify the Current Position + * or the Position Shift depending on settings and sub-commands. + * + * Since E has no Workspace Offset, it is always set directly. + * + * Without Workspace Offsets (e.g., with NO_WORKSPACE_OFFSETS): + * G92 : Set NATIVE Current Position to the given X Y Z E. + * + * Using Workspace Offsets (default Marlin behavior): + * G92 : Modify Workspace Offsets so the reported position shows the given X Y Z E. + * G92.1 : Zero XYZ Workspace Offsets (so the reported position = the native position). + * + * With POWER_LOSS_RECOVERY: + * G92.9 : Set NATIVE Current Position to the given X Y Z E. */ void GcodeSuite::G92() { - bool sync_E = false, sync_XYZ = false; + bool sync_E = false, sync_XYZE = false; - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES const uint8_t subcode_G92 = parser.subcode; #else constexpr uint8_t subcode_G92 = 0; #endif switch (subcode_G92) { - default: break; - #if ENABLED(CNC_COORDINATE_SYSTEMS) - case 1: { - // Zero the G92 values and restore current position - #if !IS_SCARA - LOOP_XYZ(i) if (position_shift[i]) { - position_shift[i] = 0; - update_workspace_offset((AxisEnum)i); - } - #endif // Not SCARA - } return; + default: return; // Ignore unknown G92.x + + #if ENABLED(CNC_COORDINATE_SYSTEMS) && !IS_SCARA + case 1: // G92.1 - Zero the Workspace Offset + LOOP_XYZ(i) if (position_shift[i]) { + position_shift[i] = 0; + update_workspace_offset((AxisEnum)i); + } + break; #endif + #if ENABLED(POWER_LOSS_RECOVERY) - case 9: { + case 9: // G92.9 - Set Current Position directly (like Marlin 1.0) LOOP_XYZE(i) { if (parser.seenval(axis_codes[i])) { + if (i == E_AXIS) sync_E = true; else sync_XYZE = true; current_position[i] = parser.value_axis_units((AxisEnum)i); - if (i == E_AXIS) sync_E = true; else sync_XYZ = true; } } - } break; + break; #endif - case 0: { + + case 0: LOOP_XYZE(i) { if (parser.seenval(axis_codes[i])) { - const float l = parser.value_axis_units((AxisEnum)i), - v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), - d = v - current_position[i]; + const float l = parser.value_axis_units((AxisEnum)i), // Given axis coordinate value, converted to millimeters + v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), // Axis position in NATIVE space (applying the existing offset) + d = v - current_position[i]; // How much is the current axis position altered by? if (!NEAR_ZERO(d)) { - #if IS_SCARA || !HAS_POSITION_SHIFT - if (i == E_AXIS) sync_E = true; else sync_XYZ = true; - current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior - #elif HAS_POSITION_SHIFT + #if HAS_POSITION_SHIFT && !IS_SCARA // When using workspaces... if (i == E_AXIS) { sync_E = true; - current_position.e = v; // When using coordinate spaces, only E is set directly + current_position.e = v; // ...E is still set directly } else { - position_shift[i] += d; // Other axes simply offset the coordinate space + position_shift[i] += d; // ...but other axes offset the workspace. update_workspace_offset((AxisEnum)i); } + #else // Without workspaces... + if (i == E_AXIS) sync_E = true; else sync_XYZE = true; + current_position[i] = v; // ...set Current Position directly (like Marlin 1.0) #endif } } } - } break; + break; } #if ENABLED(CNC_COORDINATE_SYSTEMS) - // Apply workspace offset to the active coordinate system + // Apply Workspace Offset to the active coordinate system if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) coordinate_system[active_coordinate_system] = position_shift; #endif - if (sync_XYZ) sync_plan_position(); + if (sync_XYZE) sync_plan_position(); else if (sync_E) sync_plan_position_e(); - #if DISABLED(DIRECT_STEPPING) - report_current_position(); - #endif + IF_DISABLED(DIRECT_STEPPING, report_current_position()); } diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 6408b2ce2d..ebe9d3b2cd 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -47,13 +47,13 @@ char *GCodeParser::command_ptr, char GCodeParser::command_letter; uint16_t GCodeParser::codenum; -#if ENABLED(USE_GCODE_SUBCODES) +#if USE_GCODE_SUBCODES uint8_t GCodeParser::subcode; #endif #if ENABLED(GCODE_MOTION_MODES) int16_t GCodeParser::motion_mode_codenum = -1; - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES uint8_t GCodeParser::motion_mode_subcode; #endif #endif @@ -189,7 +189,7 @@ void GCodeParser::parse(char *p) { } // Allow for decimal point in command - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES if (*p == '.') { p++; while (NUMERIC(*p)) diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index d60b21a906..5a31a9943e 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -85,13 +85,13 @@ public: *string_arg, // string of command line command_letter; // G, M, or T static uint16_t codenum; // 123 - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES static uint8_t subcode; // .1 #endif #if ENABLED(GCODE_MOTION_MODES) static int16_t motion_mode_codenum; - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES static uint8_t motion_mode_subcode; #endif FORCE_INLINE static void cancel_motion_mode() { motion_mode_codenum = -1; } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 949885eab7..f8360767d9 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2758,7 +2758,7 @@ // Add commands that need sub-codes to this list #if ANY(G38_PROBE_TARGET, CNC_COORDINATE_SYSTEMS, POWER_LOSS_RECOVERY) - #define USE_GCODE_SUBCODES + #define USE_GCODE_SUBCODES 1 #endif // Parking Extruder From dc0247c57e7bf3edf6cefed8620158a97151b84c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Feb 2021 16:09:54 -0600 Subject: [PATCH 1040/1370] Outdent UBL code --- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 408 +-- Marlin/src/feature/bedlevel/ubl/ubl.h | 460 +-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 3220 +++++++++---------- 3 files changed, 2044 insertions(+), 2044 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index ef3289f732..601f0ebb54 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -24,234 +24,234 @@ #if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../bedlevel.h" +#include "../bedlevel.h" - unified_bed_leveling ubl; +unified_bed_leveling ubl; - #include "../../../MarlinCore.h" - #include "../../../gcode/gcode.h" +#include "../../../MarlinCore.h" +#include "../../../gcode/gcode.h" - #include "../../../module/settings.h" - #include "../../../module/planner.h" - #include "../../../module/motion.h" - #include "../../../module/probe.h" +#include "../../../module/settings.h" +#include "../../../module/planner.h" +#include "../../../module/motion.h" +#include "../../../module/probe.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif + +#include "math.h" + +void unified_bed_leveling::echo_name() { SERIAL_ECHOPGM("Unified Bed Leveling"); } + +void unified_bed_leveling::report_current_mesh() { + if (!leveling_is_valid()) return; + SERIAL_ECHO_MSG(" G29 I999"); + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(" M421 I", x, " J", y); + SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); + serial_delay(75); // Prevent Printrun from exploding + } +} + +void unified_bed_leveling::report_state() { + echo_name(); + SERIAL_ECHO_TERNARY(planner.leveling_active, " System v" UBL_VERSION " ", "", "in", "active\n"); + serial_delay(50); +} + +int8_t unified_bed_leveling::storage_slot; + +float unified_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + +#define _GRIDPOS(A,N) (MESH_MIN_##A + N * (MESH_##A##_DIST)) + +const float +unified_bed_leveling::_mesh_index_to_xpos[GRID_MAX_POINTS_X] PROGMEM = ARRAY_N(GRID_MAX_POINTS_X, + _GRIDPOS(X, 0), _GRIDPOS(X, 1), _GRIDPOS(X, 2), _GRIDPOS(X, 3), + _GRIDPOS(X, 4), _GRIDPOS(X, 5), _GRIDPOS(X, 6), _GRIDPOS(X, 7), + _GRIDPOS(X, 8), _GRIDPOS(X, 9), _GRIDPOS(X, 10), _GRIDPOS(X, 11), + _GRIDPOS(X, 12), _GRIDPOS(X, 13), _GRIDPOS(X, 14), _GRIDPOS(X, 15) +), +unified_bed_leveling::_mesh_index_to_ypos[GRID_MAX_POINTS_Y] PROGMEM = ARRAY_N(GRID_MAX_POINTS_Y, + _GRIDPOS(Y, 0), _GRIDPOS(Y, 1), _GRIDPOS(Y, 2), _GRIDPOS(Y, 3), + _GRIDPOS(Y, 4), _GRIDPOS(Y, 5), _GRIDPOS(Y, 6), _GRIDPOS(Y, 7), + _GRIDPOS(Y, 8), _GRIDPOS(Y, 9), _GRIDPOS(Y, 10), _GRIDPOS(Y, 11), + _GRIDPOS(Y, 12), _GRIDPOS(Y, 13), _GRIDPOS(Y, 14), _GRIDPOS(Y, 15) +); + +volatile int16_t unified_bed_leveling::encoder_diff; + +unified_bed_leveling::unified_bed_leveling() { reset(); } + +void unified_bed_leveling::reset() { + const bool was_enabled = planner.leveling_active; + set_bed_leveling_enabled(false); + storage_slot = -1; + ZERO(z_values); #if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" + GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0); #endif + if (was_enabled) report_current_position(); +} - #include "math.h" +void unified_bed_leveling::invalidate() { + set_bed_leveling_enabled(false); + set_all_mesh_points_to_value(NAN); +} - void unified_bed_leveling::echo_name() { SERIAL_ECHOPGM("Unified Bed Leveling"); } +void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { + GRID_LOOP(x, y) { + z_values[x][y] = value; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, value)); + } +} - void unified_bed_leveling::report_current_mesh() { - if (!leveling_is_valid()) return; - SERIAL_ECHO_MSG(" G29 I999"); - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(" M421 I", x, " J", y); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); - serial_delay(75); // Prevent Printrun from exploding - } +#if ENABLED(OPTIMIZED_MESH_STORAGE) + + constexpr float mesh_store_scaling = 1000; + constexpr int16_t Z_STEPS_NAN = INT16_MAX; + + void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { + auto z_to_store = [](const float &z) { + if (isnan(z)) return Z_STEPS_NAN; + const int32_t z_scaled = TRUNC(z * mesh_store_scaling); + if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) + return Z_STEPS_NAN; // If Z is out of range, return our custom 'NaN' + return int16_t(z_scaled); + }; + GRID_LOOP(x, y) stored_values[x][y] = z_to_store(in_values[x][y]); } - void unified_bed_leveling::report_state() { - echo_name(); - SERIAL_ECHO_TERNARY(planner.leveling_active, " System v" UBL_VERSION " ", "", "in", "active\n"); - serial_delay(50); + void unified_bed_leveling::set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values) { + auto store_to_z = [](const int16_t z_scaled) { + return z_scaled == Z_STEPS_NAN ? NAN : z_scaled / mesh_store_scaling; + }; + GRID_LOOP(x, y) out_values[x][y] = store_to_z(stored_values[x][y]); } - int8_t unified_bed_leveling::storage_slot; +#endif // OPTIMIZED_MESH_STORAGE - float unified_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; +static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) { + SERIAL_ECHO_SP(sp); + SERIAL_CHAR('('); + if (x < 100) { SERIAL_CHAR(' '); if (x < 10) SERIAL_CHAR(' '); } + SERIAL_ECHO(x); + SERIAL_CHAR(','); + if (y < 100) { SERIAL_CHAR(' '); if (y < 10) SERIAL_CHAR(' '); } + SERIAL_ECHO(y); + SERIAL_CHAR(')'); + serial_delay(5); +} - #define _GRIDPOS(A,N) (MESH_MIN_##A + N * (MESH_##A##_DIST)) - - const float - unified_bed_leveling::_mesh_index_to_xpos[GRID_MAX_POINTS_X] PROGMEM = ARRAY_N(GRID_MAX_POINTS_X, - _GRIDPOS(X, 0), _GRIDPOS(X, 1), _GRIDPOS(X, 2), _GRIDPOS(X, 3), - _GRIDPOS(X, 4), _GRIDPOS(X, 5), _GRIDPOS(X, 6), _GRIDPOS(X, 7), - _GRIDPOS(X, 8), _GRIDPOS(X, 9), _GRIDPOS(X, 10), _GRIDPOS(X, 11), - _GRIDPOS(X, 12), _GRIDPOS(X, 13), _GRIDPOS(X, 14), _GRIDPOS(X, 15) - ), - unified_bed_leveling::_mesh_index_to_ypos[GRID_MAX_POINTS_Y] PROGMEM = ARRAY_N(GRID_MAX_POINTS_Y, - _GRIDPOS(Y, 0), _GRIDPOS(Y, 1), _GRIDPOS(Y, 2), _GRIDPOS(Y, 3), - _GRIDPOS(Y, 4), _GRIDPOS(Y, 5), _GRIDPOS(Y, 6), _GRIDPOS(Y, 7), - _GRIDPOS(Y, 8), _GRIDPOS(Y, 9), _GRIDPOS(Y, 10), _GRIDPOS(Y, 11), - _GRIDPOS(Y, 12), _GRIDPOS(Y, 13), _GRIDPOS(Y, 14), _GRIDPOS(Y, 15) - ); - - volatile int16_t unified_bed_leveling::encoder_diff; - - unified_bed_leveling::unified_bed_leveling() { reset(); } - - void unified_bed_leveling::reset() { - const bool was_enabled = planner.leveling_active; - set_bed_leveling_enabled(false); - storage_slot = -1; - ZERO(z_values); - #if ENABLED(EXTENSIBLE_UI) - GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0); - #endif - if (was_enabled) report_current_position(); - } - - void unified_bed_leveling::invalidate() { - set_bed_leveling_enabled(false); - set_all_mesh_points_to_value(NAN); - } - - void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { - GRID_LOOP(x, y) { - z_values[x][y] = value; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, value)); - } - } - - #if ENABLED(OPTIMIZED_MESH_STORAGE) - - constexpr float mesh_store_scaling = 1000; - constexpr int16_t Z_STEPS_NAN = INT16_MAX; - - void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { - auto z_to_store = [](const float &z) { - if (isnan(z)) return Z_STEPS_NAN; - const int32_t z_scaled = TRUNC(z * mesh_store_scaling); - if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) - return Z_STEPS_NAN; // If Z is out of range, return our custom 'NaN' - return int16_t(z_scaled); - }; - GRID_LOOP(x, y) stored_values[x][y] = z_to_store(in_values[x][y]); - } - - void unified_bed_leveling::set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values) { - auto store_to_z = [](const int16_t z_scaled) { - return z_scaled == Z_STEPS_NAN ? NAN : z_scaled / mesh_store_scaling; - }; - GRID_LOOP(x, y) out_values[x][y] = store_to_z(stored_values[x][y]); - } - - #endif // OPTIMIZED_MESH_STORAGE - - static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) { +static void serial_echo_column_labels(const uint8_t sp) { + SERIAL_ECHO_SP(7); + LOOP_L_N(i, GRID_MAX_POINTS_X) { + if (i < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(i); SERIAL_ECHO_SP(sp); - SERIAL_CHAR('('); - if (x < 100) { SERIAL_CHAR(' '); if (x < 10) SERIAL_CHAR(' '); } - SERIAL_ECHO(x); - SERIAL_CHAR(','); - if (y < 100) { SERIAL_CHAR(' '); if (y < 10) SERIAL_CHAR(' '); } - SERIAL_ECHO(y); - SERIAL_CHAR(')'); - serial_delay(5); + } + serial_delay(10); +} + +/** + * Produce one of these mesh maps: + * 0: Human-readable + * 1: CSV format for spreadsheet import + * 2: TODO: Display on Graphical LCD + * 4: Compact Human-Readable + */ +void unified_bed_leveling::display_map(const int map_type) { + const bool was = gcode.set_autoreport_paused(true); + + constexpr uint8_t eachsp = 1 + 6 + 1, // [-3.567] + twixt = eachsp * (GRID_MAX_POINTS_X) - 9 * 2; // Leading 4sp, Coordinates 9sp each + + const bool human = !(map_type & 0x3), csv = map_type == 1, lcd = map_type == 2, comp = map_type & 0x4; + + SERIAL_ECHOPGM("\nBed Topography Report"); + if (human) { + SERIAL_ECHOLNPGM(":\n"); + serial_echo_xy(4, MESH_MIN_X, MESH_MAX_Y); + serial_echo_xy(twixt, MESH_MAX_X, MESH_MAX_Y); + SERIAL_EOL(); + serial_echo_column_labels(eachsp - 2); + } + else { + SERIAL_ECHOPGM(" for "); + serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); } - static void serial_echo_column_labels(const uint8_t sp) { - SERIAL_ECHO_SP(7); + // Add XY probe offset from extruder because probe.probe_at_point() subtracts them when + // moving to the XY position to be measured. This ensures better agreement between + // the current Z position after G28 and the mesh values. + const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + probe.offset_xy); + + if (!lcd) SERIAL_EOL(); + for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { + + // Row Label (J index) + if (human) { + if (j < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(j); + SERIAL_ECHOPGM(" |"); + } + + // Row Values (I indexes) LOOP_L_N(i, GRID_MAX_POINTS_X) { - if (i < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(i); - SERIAL_ECHO_SP(sp); + + // Opening Brace or Space + const bool is_current = i == curr.x && j == curr.y; + if (human) SERIAL_CHAR(is_current ? '[' : ' '); + + // Z Value at current I, J + const float f = z_values[i][j]; + if (lcd) { + // TODO: Display on Graphical LCD + } + else if (isnan(f)) + serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); + else if (human || csv) { + if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) + SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits + } + if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); + + // Closing Brace or Space + if (human) SERIAL_CHAR(is_current ? ']' : ' '); + + SERIAL_FLUSHTX(); + idle_no_sleep(); } - serial_delay(10); - } - - /** - * Produce one of these mesh maps: - * 0: Human-readable - * 1: CSV format for spreadsheet import - * 2: TODO: Display on Graphical LCD - * 4: Compact Human-Readable - */ - void unified_bed_leveling::display_map(const int map_type) { - const bool was = gcode.set_autoreport_paused(true); - - constexpr uint8_t eachsp = 1 + 6 + 1, // [-3.567] - twixt = eachsp * (GRID_MAX_POINTS_X) - 9 * 2; // Leading 4sp, Coordinates 9sp each - - const bool human = !(map_type & 0x3), csv = map_type == 1, lcd = map_type == 2, comp = map_type & 0x4; - - SERIAL_ECHOPGM("\nBed Topography Report"); - if (human) { - SERIAL_ECHOLNPGM(":\n"); - serial_echo_xy(4, MESH_MIN_X, MESH_MAX_Y); - serial_echo_xy(twixt, MESH_MAX_X, MESH_MAX_Y); - SERIAL_EOL(); - serial_echo_column_labels(eachsp - 2); - } - else { - SERIAL_ECHOPGM(" for "); - serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); - } - - // Add XY probe offset from extruder because probe.probe_at_point() subtracts them when - // moving to the XY position to be measured. This ensures better agreement between - // the current Z position after G28 and the mesh values. - const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + probe.offset_xy); - if (!lcd) SERIAL_EOL(); - for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { - // Row Label (J index) - if (human) { - if (j < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(j); - SERIAL_ECHOPGM(" |"); - } - - // Row Values (I indexes) - LOOP_L_N(i, GRID_MAX_POINTS_X) { - - // Opening Brace or Space - const bool is_current = i == curr.x && j == curr.y; - if (human) SERIAL_CHAR(is_current ? '[' : ' '); - - // Z Value at current I, J - const float f = z_values[i][j]; - if (lcd) { - // TODO: Display on Graphical LCD - } - else if (isnan(f)) - serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); - else if (human || csv) { - if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) - SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits - } - if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); - - // Closing Brace or Space - if (human) SERIAL_CHAR(is_current ? ']' : ' '); - - SERIAL_FLUSHTX(); - idle_no_sleep(); - } - if (!lcd) SERIAL_EOL(); - - // A blank line between rows (unless compact) - if (j && human && !comp) SERIAL_ECHOLNPGM(" |"); - } - - if (human) { - serial_echo_column_labels(eachsp - 2); - SERIAL_EOL(); - serial_echo_xy(4, MESH_MIN_X, MESH_MIN_Y); - serial_echo_xy(twixt, MESH_MAX_X, MESH_MIN_Y); - SERIAL_EOL(); - SERIAL_EOL(); - } - - gcode.set_autoreport_paused(was); + // A blank line between rows (unless compact) + if (j && human && !comp) SERIAL_ECHOLNPGM(" |"); } - bool unified_bed_leveling::sanity_check() { - uint8_t error_flag = 0; - - if (settings.calc_num_meshes() < 1) { - SERIAL_ECHOLNPGM("?Mesh too big for EEPROM."); - error_flag++; - } - - return !!error_flag; + if (human) { + serial_echo_column_labels(eachsp - 2); + SERIAL_EOL(); + serial_echo_xy(4, MESH_MIN_X, MESH_MIN_Y); + serial_echo_xy(twixt, MESH_MAX_X, MESH_MIN_Y); + SERIAL_EOL(); + SERIAL_EOL(); } + gcode.set_autoreport_paused(was); +} + +bool unified_bed_leveling::sanity_check() { + uint8_t error_flag = 0; + + if (settings.calc_num_meshes() < 1) { + SERIAL_ECHOLNPGM("?Mesh too big for EEPROM."); + error_flag++; + } + + return !!error_flag; +} + #endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 876063c878..d5da43a6a2 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -46,275 +46,275 @@ struct mesh_index_pair; #endif class unified_bed_leveling { - private: +private: - static int g29_verbose_level, - g29_phase_value, - g29_repetition_cnt, - g29_storage_slot, - g29_map_type; - static bool g29_c_flag; - static float g29_card_thickness, - g29_constant; - static xy_pos_t g29_pos; - static xy_bool_t xy_seen; + static int g29_verbose_level, + g29_phase_value, + g29_repetition_cnt, + g29_storage_slot, + g29_map_type; + static bool g29_c_flag; + static float g29_card_thickness, + g29_constant; + static xy_pos_t g29_pos; + static xy_bool_t xy_seen; - #if HAS_BED_PROBE - static int g29_grid_size; - #endif + #if HAS_BED_PROBE + static int g29_grid_size; + #endif - #if IS_NEWPANEL - static void move_z_with_encoder(const float &multiplier); - static float measure_point_with_encoder(); - static float measure_business_card_thickness(); - static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; - static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; - #endif + #if IS_NEWPANEL + static void move_z_with_encoder(const float &multiplier); + static float measure_point_with_encoder(); + static float measure_business_card_thickness(); + static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; + static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; + #endif - static bool g29_parameter_parsing() _O0; - static void shift_mesh_height(); - static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; - static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); - static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); - static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); - static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { - return smart_fill_one(pos.x, pos.y, dir.x, dir.y); - } - static void smart_fill_mesh(); + static bool g29_parameter_parsing() _O0; + static void shift_mesh_height(); + static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; + static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); + static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); + static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); + static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { + return smart_fill_one(pos.x, pos.y, dir.x, dir.y); + } + static void smart_fill_mesh(); - #if ENABLED(UBL_DEVEL_DEBUGGING) - static void g29_what_command(); - static void g29_eeprom_dump(); - static void g29_compare_current_mesh_to_stored_mesh(); - #endif + #if ENABLED(UBL_DEVEL_DEBUGGING) + static void g29_what_command(); + static void g29_eeprom_dump(); + static void g29_compare_current_mesh_to_stored_mesh(); + #endif - public: +public: - static void echo_name(); - static void report_current_mesh(); - static void report_state(); - static void save_ubl_active_state_and_disable(); - static void restore_ubl_active_state_and_leave(); - static void display_map(const int) _O0; - static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; - static mesh_index_pair find_furthest_invalid_mesh_point() _O0; - static void reset(); - static void invalidate(); - static void set_all_mesh_points_to_value(const float value); - static void adjust_mesh_to_mean(const bool cflag, const float value); - static bool sanity_check(); + static void echo_name(); + static void report_current_mesh(); + static void report_state(); + static void save_ubl_active_state_and_disable(); + static void restore_ubl_active_state_and_leave(); + static void display_map(const int) _O0; + static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; + static mesh_index_pair find_furthest_invalid_mesh_point() _O0; + static void reset(); + static void invalidate(); + static void set_all_mesh_points_to_value(const float value); + static void adjust_mesh_to_mean(const bool cflag, const float value); + static bool sanity_check(); - static void G29() _O0; // O0 for no optimization - static void smart_fill_wlsf(const float &) _O2; // O2 gives smaller code than Os on A2560 + static void G29() _O0; // O0 for no optimization + static void smart_fill_wlsf(const float &) _O2; // O2 gives smaller code than Os on A2560 - static int8_t storage_slot; + static int8_t storage_slot; - static bed_mesh_t z_values; - #if ENABLED(OPTIMIZED_MESH_STORAGE) - static void set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values); - static void set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values); - #endif - static const float _mesh_index_to_xpos[GRID_MAX_POINTS_X], - _mesh_index_to_ypos[GRID_MAX_POINTS_Y]; + static bed_mesh_t z_values; + #if ENABLED(OPTIMIZED_MESH_STORAGE) + static void set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values); + static void set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values); + #endif + static const float _mesh_index_to_xpos[GRID_MAX_POINTS_X], + _mesh_index_to_ypos[GRID_MAX_POINTS_Y]; - #if HAS_LCD_MENU - static bool lcd_map_control; - static void steppers_were_disabled(); - #else - static inline void steppers_were_disabled() {} - #endif + #if HAS_LCD_MENU + static bool lcd_map_control; + static void steppers_were_disabled(); + #else + static inline void steppers_were_disabled() {} + #endif - static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time + static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time - unified_bed_leveling(); + unified_bed_leveling(); - FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } - static int8_t cell_index_x_raw(const float &x) { - return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)); + static int8_t cell_index_x_raw(const float &x) { + return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)); + } + + static int8_t cell_index_y_raw(const float &y) { + return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)); + } + + static int8_t cell_index_x_valid(const float &x) { + return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); + } + + static int8_t cell_index_y_valid(const float &y) { + return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); + } + + static int8_t cell_index_x(const float &x) { + return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); + } + + static int8_t cell_index_y(const float &y) { + return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); + } + + static inline xy_int8_t cell_indexes(const float &x, const float &y) { + return { cell_index_x(x), cell_index_y(y) }; + } + static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } + + static int8_t closest_x_index(const float &x) { + const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); + return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; + } + static int8_t closest_y_index(const float &y) { + const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); + return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; + } + static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { + return { closest_x_index(xy.x), closest_y_index(xy.y) }; + } + + /** + * z2 --| + * z0 | | + * | | + (z2-z1) + * z1 | | | + * ---+-------------+--------+-- --| + * a1 a0 a2 + * |<---delta_a---------->| + * + * calc_z0 is the basis for all the Mesh Based correction. It is used to + * find the expected Z Height at a position between two known Z-Height locations. + * + * It is fairly expensive with its 4 floating point additions and 2 floating point + * multiplications. + */ + FORCE_INLINE static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { + return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1); + } + + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + #define _UBL_OUTER_Z_RAISE UBL_Z_RAISE_WHEN_OFF_MESH + #else + #define _UBL_OUTER_Z_RAISE NAN + #endif + + /** + * z_correction_for_x_on_horizontal_mesh_line is an optimization for + * the case where the printer is making a vertical line that only crosses horizontal mesh lines. + */ + static inline float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) { + if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { + + if (DEBUGGING(LEVELING)) { + if (WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); + DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0, ",x1_i=", x1_i, ",yi=", yi, ")"); + } + + // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. + return _UBL_OUTER_Z_RAISE; } - static int8_t cell_index_y_raw(const float &y) { - return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)); + const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), + z1 = z_values[x1_i][yi]; + + return z1 + xratio * (z_values[_MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. + } + + // + // See comments above for z_correction_for_x_on_horizontal_mesh_line + // + static inline float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) { + if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { + + if (DEBUGGING(LEVELING)) { + if (WITHIN(xi, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); + DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0, ", xi=", xi, ", y1_i=", y1_i, ")"); + } + + // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. + return _UBL_OUTER_Z_RAISE; } - static int8_t cell_index_x_valid(const float &x) { - return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); - } + const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), + z1 = z_values[xi][y1_i]; - static int8_t cell_index_y_valid(const float &y) { - return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); - } + return z1 + yratio * (z_values[xi][_MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. + } - static int8_t cell_index_x(const float &x) { - return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); - } - - static int8_t cell_index_y(const float &y) { - return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); - } - - static inline xy_int8_t cell_indexes(const float &x, const float &y) { - return { cell_index_x(x), cell_index_y(y) }; - } - static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } - - static int8_t closest_x_index(const float &x) { - const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); - return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; - } - static int8_t closest_y_index(const float &y) { - const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); - return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; - } - static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { - return { closest_x_index(xy.x), closest_y_index(xy.y) }; - } + /** + * This is the generic Z-Correction. It works anywhere within a Mesh Cell. It first + * does a linear interpolation along both of the bounding X-Mesh-Lines to find the + * Z-Height at both ends. Then it does a linear interpolation of these heights based + * on the Y position within the cell. + */ + static float get_z_correction(const float &rx0, const float &ry0) { + const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped /** - * z2 --| - * z0 | | - * | | + (z2-z1) - * z1 | | | - * ---+-------------+--------+-- --| - * a1 a0 a2 - * |<---delta_a---------->| - * - * calc_z0 is the basis for all the Mesh Based correction. It is used to - * find the expected Z Height at a position between two known Z-Height locations. - * - * It is fairly expensive with its 4 floating point additions and 2 floating point - * multiplications. + * Check if the requested location is off the mesh. If so, and + * UBL_Z_RAISE_WHEN_OFF_MESH is specified, that value is returned. */ - FORCE_INLINE static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { - return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1); - } - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - #define _UBL_OUTER_Z_RAISE UBL_Z_RAISE_WHEN_OFF_MESH - #else - #define _UBL_OUTER_Z_RAISE NAN + if (!WITHIN(rx0, MESH_MIN_X, MESH_MAX_X) || !WITHIN(ry0, MESH_MIN_Y, MESH_MAX_Y)) + return UBL_Z_RAISE_WHEN_OFF_MESH; #endif - /** - * z_correction_for_x_on_horizontal_mesh_line is an optimization for - * the case where the printer is making a vertical line that only crosses horizontal mesh lines. - */ - static inline float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) { - if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { + const float z1 = calc_z0(rx0, + mesh_index_to_xpos(cx), z_values[cx][cy], + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); - if (DEBUGGING(LEVELING)) { - if (WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); - DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0, ",x1_i=", x1_i, ",yi=", yi, ")"); - } + const float z2 = calc_z0(rx0, + mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); - // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. - return _UBL_OUTER_Z_RAISE; - } + float z0 = calc_z0(ry0, + mesh_index_to_ypos(cy), z1, + mesh_index_to_ypos(cy + 1), z2); - const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), - z1 = z_values[x1_i][yi]; - - return z1 + xratio * (z_values[_MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array - // If it is, it is clamped to the last element of the - // z_values[][] array and no correction is applied. + if (DEBUGGING(MESH_ADJUST)) { + DEBUG_ECHOPAIR(" raw get_z_correction(", rx0); + DEBUG_CHAR(','); DEBUG_ECHO(ry0); + DEBUG_ECHOPAIR_F(") = ", z0, 6); + DEBUG_ECHOLNPAIR_F(" >>>---> ", z0, 6); } - // - // See comments above for z_correction_for_x_on_horizontal_mesh_line - // - static inline float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) { - if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { - - if (DEBUGGING(LEVELING)) { - if (WITHIN(xi, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); - DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0, ", xi=", xi, ", y1_i=", y1_i, ")"); - } - - // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. - return _UBL_OUTER_Z_RAISE; - } - - const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), - z1 = z_values[xi][y1_i]; - - return z1 + yratio * (z_values[xi][_MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array - // If it is, it is clamped to the last element of the - // z_values[][] array and no correction is applied. - } - - /** - * This is the generic Z-Correction. It works anywhere within a Mesh Cell. It first - * does a linear interpolation along both of the bounding X-Mesh-Lines to find the - * Z-Height at both ends. Then it does a linear interpolation of these heights based - * on the Y position within the cell. - */ - static float get_z_correction(const float &rx0, const float &ry0) { - const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped - - /** - * Check if the requested location is off the mesh. If so, and - * UBL_Z_RAISE_WHEN_OFF_MESH is specified, that value is returned. - */ - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - if (!WITHIN(rx0, MESH_MIN_X, MESH_MAX_X) || !WITHIN(ry0, MESH_MIN_Y, MESH_MAX_Y)) - return UBL_Z_RAISE_WHEN_OFF_MESH; - #endif - - const float z1 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][cy], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); - - const float z2 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); - - float z0 = calc_z0(ry0, - mesh_index_to_ypos(cy), z1, - mesh_index_to_ypos(cy + 1), z2); + if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN + z0 = 0.0; // in ubl.z_values[][] and propagate through the + // calculations. If our correction is NAN, we throw it out + // because part of the Mesh is undefined and we don't have the + // information we need to complete the height correction. if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPAIR(" raw get_z_correction(", rx0); - DEBUG_CHAR(','); DEBUG_ECHO(ry0); - DEBUG_ECHOPAIR_F(") = ", z0, 6); - DEBUG_ECHOLNPAIR_F(" >>>---> ", z0, 6); + DEBUG_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0); + DEBUG_CHAR(','); + DEBUG_ECHO(ry0); + DEBUG_CHAR(')'); + DEBUG_EOL(); } - - if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN - z0 = 0.0; // in ubl.z_values[][] and propagate through the - // calculations. If our correction is NAN, we throw it out - // because part of the Mesh is undefined and we don't have the - // information we need to complete the height correction. - - if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0); - DEBUG_CHAR(','); - DEBUG_ECHO(ry0); - DEBUG_CHAR(')'); - DEBUG_EOL(); - } - } - return z0; } - static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } + return z0; + } + static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } - static inline float mesh_index_to_xpos(const uint8_t i) { - return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); - } - static inline float mesh_index_to_ypos(const uint8_t i) { - return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); - } + static inline float mesh_index_to_xpos(const uint8_t i) { + return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); + } + static inline float mesh_index_to_ypos(const uint8_t i) { + return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); + } - #if UBL_SEGMENTED - static bool line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s); - #else - static void line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t e); - #endif + #if UBL_SEGMENTED + static bool line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s); + #else + static void line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t e); + #endif - static inline bool mesh_is_valid() { - GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false; - return true; - } + static inline bool mesh_is_valid() { + GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false; + return true; + } }; // class unified_bed_leveling diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 36acc96d6e..9bd7f63a7e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -24,1760 +24,1760 @@ #if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../bedlevel.h" +#include "../bedlevel.h" - #include "../../../MarlinCore.h" - #include "../../../HAL/shared/eeprom_api.h" - #include "../../../libs/hex_print.h" - #include "../../../module/settings.h" - #include "../../../lcd/marlinui.h" - #include "../../../module/stepper.h" - #include "../../../module/planner.h" - #include "../../../module/motion.h" - #include "../../../module/probe.h" - #include "../../../gcode/gcode.h" - #include "../../../libs/least_squares_fit.h" +#include "../../../MarlinCore.h" +#include "../../../HAL/shared/eeprom_api.h" +#include "../../../libs/hex_print.h" +#include "../../../module/settings.h" +#include "../../../lcd/marlinui.h" +#include "../../../module/stepper.h" +#include "../../../module/planner.h" +#include "../../../module/motion.h" +#include "../../../module/probe.h" +#include "../../../gcode/gcode.h" +#include "../../../libs/least_squares_fit.h" - #if HAS_MULTI_HOTEND - #include "../../../module/tool_change.h" - #endif +#if HAS_MULTI_HOTEND + #include "../../../module/tool_change.h" +#endif - #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) - #include "../../../core/debug_out.h" +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../../core/debug_out.h" - #if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" - #endif +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif - #include +#include - #define UBL_G29_P31 +#define UBL_G29_P31 - #if HAS_LCD_MENU +#if HAS_LCD_MENU - bool unified_bed_leveling::lcd_map_control = false; + bool unified_bed_leveling::lcd_map_control = false; - void unified_bed_leveling::steppers_were_disabled() { - if (lcd_map_control) { - lcd_map_control = false; - ui.defer_status_screen(false); - } + void unified_bed_leveling::steppers_were_disabled() { + if (lcd_map_control) { + lcd_map_control = false; + ui.defer_status_screen(false); } - - void ubl_map_screen(); - - #endif - - #define SIZE_OF_LITTLE_RAISE 1 - #define BIG_RAISE_NOT_NEEDED 0 - - int unified_bed_leveling::g29_verbose_level, - unified_bed_leveling::g29_phase_value, - unified_bed_leveling::g29_repetition_cnt, - unified_bed_leveling::g29_storage_slot = 0, - unified_bed_leveling::g29_map_type; - bool unified_bed_leveling::g29_c_flag; - float unified_bed_leveling::g29_card_thickness = 0, - unified_bed_leveling::g29_constant = 0; - xy_bool_t unified_bed_leveling::xy_seen; - xy_pos_t unified_bed_leveling::g29_pos; - - #if HAS_BED_PROBE - int unified_bed_leveling::g29_grid_size; - #endif - - /** - * G29: Unified Bed Leveling by Roxy - * - * Parameters understood by this leveling system: - * - * A Activate Activate the Unified Bed Leveling system. - * - * B # Business Use the 'Business Card' mode of the Manual Probe subsystem with P2. - * Note: A non-compressible Spark Gap feeler gauge is recommended over a business card. - * In this mode of G29 P2, a business or index card is used as a shim that the nozzle can - * grab onto as it is lowered. In principle, the nozzle-bed distance is the same when the - * same resistance is felt in the shim. You can omit the numerical value on first invocation - * of G29 P2 B to measure shim thickness. Subsequent use of 'B' will apply the previously- - * measured thickness by default. - * - * C Continue G29 P1 C continues the generation of a partially-constructed Mesh without invalidating - * previous measurements. - * - * C G29 P2 C tells the Manual Probe subsystem to not use the current nozzle - * location in its search for the closest unmeasured Mesh Point. Instead, attempt to - * start at one end of the uprobed points and Continue sequentially. - * - * G29 P3 C specifies the Constant for the fill. Otherwise, uses a "reasonable" value. - * - * C Current G29 Z C uses the Current location (instead of bed center or nearest edge). - * - * D Disable Disable the Unified Bed Leveling system. - * - * E Stow_probe Stow the probe after each sampled point. - * - * F # Fade Fade the amount of Mesh Based Compensation over a specified height. At the - * specified height, no correction is applied and natural printer kenimatics take over. If no - * number is specified for the command, 10mm is assumed to be reasonable. - * - * H # Height With P2, 'H' specifies the Height to raise the nozzle after each manual probe of the bed. - * If omitted, the nozzle will raise by Z_CLEARANCE_BETWEEN_PROBES. - * - * H # Offset With P4, 'H' specifies the Offset above the mesh height to place the nozzle. - * If omitted, Z_CLEARANCE_BETWEEN_PROBES will be used. - * - * I # Invalidate Invalidate the specified number of Mesh Points near the given 'X' 'Y'. If X or Y are omitted, - * the nozzle location is used. If no 'I' value is given, only the point nearest to the location - * is invalidated. Use 'T' to produce a map afterward. This command is useful to invalidate a - * portion of the Mesh so it can be adjusted using other UBL tools. When attempting to invalidate - * an isolated bad mesh point, the 'T' option shows the nozzle position in the Mesh with (#). You - * can move the nozzle around and use this feature to select the center of the area (or cell) to - * invalidate. - * - * J # Grid Perform a Grid Based Leveling of the current Mesh using a grid with n points on a side. - * Not specifying a grid size will invoke the 3-Point leveling function. - * - * L Load Load Mesh from the previously activated location in the EEPROM. - * - * L # Load Load Mesh from the specified location in the EEPROM. Set this location as activated - * for subsequent Load and Store operations. - * - * The P or Phase commands are used for the bulk of the work to setup a Mesh. In general, your Mesh will - * start off being initialized with a G29 P0 or a G29 P1. Further refinement of the Mesh happens with - * each additional Phase that processes it. - * - * P0 Phase 0 Zero Mesh Data and turn off the Mesh Compensation System. This reverts the - * 3D Printer to the same state it was in before the Unified Bed Leveling Compensation - * was turned on. Setting the entire Mesh to Zero is a special case that allows - * a subsequent G or T leveling operation for backward compatibility. - * - * P1 Phase 1 Invalidate entire Mesh and continue with automatic generation of the Mesh data using - * the Z-Probe. Usually the probe can't reach all areas that the nozzle can reach. For delta - * printers only the areas where the probe and nozzle can both reach will be automatically probed. - * - * Unreachable points will be handled in Phase 2 and Phase 3. - * - * Use 'C' to leave the previous mesh intact and automatically probe needed points. This allows you - * to invalidate parts of the Mesh but still use Automatic Probing. - * - * The 'X' and 'Y' parameters prioritize where to try and measure points. If omitted, the current - * probe position is used. - * - * Use 'T' (Topology) to generate a report of mesh generation. - * - * P1 will suspend Mesh generation if the controller button is held down. Note that you may need - * to press and hold the switch for several seconds if moves are underway. - * - * P2 Phase 2 Probe unreachable points. - * - * Use 'H' to set the height between Mesh points. If omitted, Z_CLEARANCE_BETWEEN_PROBES is used. - * Smaller values will be quicker. Move the nozzle down till it barely touches the bed. Make sure the - * nozzle is clean and unobstructed. Use caution and move slowly. This can damage your printer! - * (Uses SIZE_OF_LITTLE_RAISE mm if the nozzle is moving less than BIG_RAISE_NOT_NEEDED mm.) - * - * The 'H' value can be negative if the Mesh dips in a large area. Press and hold the - * controller button to terminate the current Phase 2 command. You can then re-issue "G29 P 2" - * with an 'H' parameter more suitable for the area you're manually probing. Note that the command - * tries to start in a corner of the bed where movement will be predictable. Override the distance - * calculation location with the X and Y parameters. You can print a Mesh Map (G29 T) to see where - * the mesh is invalidated and where the nozzle needs to move to complete the command. Use 'C' to - * indicate that the search should be based on the current position. - * - * The 'B' parameter for this command is described above. It places the manual probe subsystem into - * Business Card mode where the thickness of a business card is measured and then used to accurately - * set the nozzle height in all manual probing for the duration of the command. A Business card can - * be used, but you'll get better results with a flexible Shim that doesn't compress. This makes it - * easier to produce similar amounts of force and get more accurate measurements. Google if you're - * not sure how to use a shim. - * - * The 'T' (Map) parameter helps track Mesh building progress. - * - * NOTE: P2 requires an LCD controller! - * - * P3 Phase 3 Fill the unpopulated regions of the Mesh with a fixed value. There are two different paths to - * go down: - * - * - If a 'C' constant is specified, the closest invalid mesh points to the nozzle will be filled, - * and a repeat count can then also be specified with 'R'. - * - * - Leaving out 'C' invokes Smart Fill, which scans the mesh from the edges inward looking for - * invalid mesh points. Adjacent points are used to determine the bed slope. If the bed is sloped - * upward from the invalid point, it takes the value of the nearest point. If sloped downward, it's - * replaced by a value that puts all three points in a line. This version of G29 P3 is a quick, easy - * and (usually) safe way to populate unprobed mesh regions before continuing to G26 Mesh Validation - * Pattern. Note that this populates the mesh with unverified values. Pay attention and use caution. - * - * P4 Phase 4 Fine tune the Mesh. The Delta Mesh Compensation System assumes the existence of - * an LCD Panel. It is possible to fine tune the mesh without an LCD Panel using - * G42 and M421. See the UBL documentation for further details. - * - * Phase 4 is meant to be used with G26 Mesh Validation to fine tune the mesh by direct editing - * of Mesh Points. Raise and lower points to fine tune the mesh until it gives consistently reliable - * adhesion. - * - * P4 moves to the closest Mesh Point (and/or the given X Y), raises the nozzle above the mesh height - * by the given 'H' offset (or default 0), and waits while the controller is used to adjust the nozzle - * height. On click the displayed height is saved in the mesh. - * - * Start Phase 4 at a specific location with X and Y. Adjust a specific number of Mesh Points with - * the 'R' (Repeat) parameter. (If 'R' is left out, the whole matrix is assumed.) This command can be - * terminated early (e.g., after editing the area of interest) by pressing and holding the encoder button. - * - * The general form is G29 P4 [R points] [X position] [Y position] - * - * The H [offset] parameter is useful if a shim is used to fine-tune the mesh. For a 0.4mm shim the - * command would be G29 P4 H0.4. The nozzle is moved to the shim height, you adjust height to the shim, - * and on click the height minus the shim thickness will be saved in the mesh. - * - * !!Use with caution, as a very poor mesh could cause the nozzle to crash into the bed!! - * - * NOTE: P4 is not available unless you have LCD support enabled! - * - * P5 Phase 5 Find Mean Mesh Height and Standard Deviation. Typically, it is easier to use and - * work with the Mesh if it is Mean Adjusted. You can specify a C parameter to - * Correct the Mesh to a 0.00 Mean Height. Adding a C parameter will automatically - * execute a G29 P6 C . - * - * P6 Phase 6 Shift Mesh height. The entire Mesh's height is adjusted by the height specified - * with the C parameter. Being able to adjust the height of a Mesh is useful tool. It - * can be used to compensate for poorly calibrated Z-Probes and other errors. Ideally, - * you should have the Mesh adjusted for a Mean Height of 0.00 and the Z-Probe measuring - * 0.000 at the Z Home location. - * - * Q Test Load specified Test Pattern to assist in checking correct operation of system. This - * command is not anticipated to be of much value to the typical user. It is intended - * for developers to help them verify correct operation of the Unified Bed Leveling System. - * - * R # Repeat Repeat this command the specified number of times. If no number is specified the - * command will be repeated GRID_MAX_POINTS_X * GRID_MAX_POINTS_Y times. - * - * S Store Store the current Mesh in the Activated area of the EEPROM. It will also store the - * current state of the Unified Bed Leveling system in the EEPROM. - * - * S # Store Store the current Mesh at the specified location in EEPROM. Activate this location - * for subsequent Load and Store operations. Valid storage slot numbers begin at 0 and - * extend to a limit related to the available EEPROM storage. - * - * S -1 Store Print the current Mesh as G-code that can be used to restore the mesh anytime. - * - * T Topology Display the Mesh Map Topology. - * 'T' can be used alone (e.g., G29 T) or in combination with most of the other commands. - * This option works with all Phase commands (e.g., G29 P4 R 5 T X 50 Y100 C -.1 O) - * This parameter can also specify a Map Type. T0 (the default) is user-readable. T1 - * is suitable to paste into a spreadsheet for a 3D graph of the mesh. - * - * U Unlevel Perform a probe of the outer perimeter to assist in physically leveling unlevel beds. - * Only used for G29 P1 T U. This speeds up the probing of the edge of the bed. Useful - * when the entire bed doesn't need to be probed because it will be adjusted. - * - * V # Verbosity Set the verbosity level (0-4) for extra details. (Default 0) - * - * X # X Location for this command - * - * Y # Y Location for this command - * - * With UBL_DEVEL_DEBUGGING: - * - * K # Kompare Kompare current Mesh with stored Mesh #, replacing current Mesh with the result. - * This command literally performs a diff between two Meshes. - * - * Q-1 Dump EEPROM Dump the UBL contents stored in EEPROM as HEX format. Useful for developers to help - * verify correct operation of the UBL. - * - * W What? Display valuable UBL data. - * - * - * Release Notes: - * You MUST do M502, M500 to initialize the storage. Failure to do this will cause all - * kinds of problems. Enabling EEPROM Storage is required. - * - * When you do a G28 and G29 P1 to automatically build your first mesh, you are going to notice that - * UBL probes points increasingly further from the starting location. (The starting location defaults - * to the center of the bed.) In contrast, ABL and MBL follow a zigzag pattern. The spiral pattern is - * especially better for Delta printers, since it populates the center of the mesh first, allowing for - * a quicker test print to verify settings. You don't need to populate the entire mesh to use it. - * After all, you don't want to spend a lot of time generating a mesh only to realize the resolution - * or probe offsets are incorrect. Mesh-generation gathers points starting closest to the nozzle unless - * an (X,Y) coordinate pair is given. - * - * Unified Bed Leveling uses a lot of EEPROM storage to hold its data, and it takes some effort to get - * the mesh just right. To prevent this valuable data from being destroyed as the EEPROM structure - * evolves, UBL stores all mesh data at the end of EEPROM. - * - * UBL is founded on Edward Patel's Mesh Bed Leveling code. A big 'Thanks!' to him and the creators of - * 3-Point and Grid Based leveling. Combining their contributions we now have the functionality and - * features of all three systems combined. - */ - - void unified_bed_leveling::G29() { - - bool probe_deployed = false; - if (g29_parameter_parsing()) return; // Abort on parameter error - - const int8_t p_val = parser.intval('P', -1); - const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); - TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); - - // Check for commands that require the printer to be homed - if (may_move) { - planner.synchronize(); - // Send 'N' to force homing before G29 (internal only) - if (axes_should_home() || parser.seen('N')) gcode.home_all_axes(); - TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); - } - - // Invalidate Mesh Points. This command is a little bit asymmetrical because - // it directly specifies the repetition count and does not use the 'R' parameter. - if (parser.seen('I')) { - uint8_t cnt = 0; - g29_repetition_cnt = parser.has_value() ? parser.value_int() : 1; - if (g29_repetition_cnt >= GRID_MAX_POINTS) { - set_all_mesh_points_to_value(NAN); - } - else { - while (g29_repetition_cnt--) { - if (cnt > 20) { cnt = 0; idle(); } - const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); - const xy_int8_t &cpos = closest.pos; - if (cpos.x < 0) { - // No more REAL mesh points to invalidate, so we ASSUME the user - // meant to invalidate the ENTIRE mesh, which cannot be done with - // find_closest_mesh_point loop which only returns REAL points. - set_all_mesh_points_to_value(NAN); - SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); - break; // No more invalid Mesh Points to populate - } - z_values[cpos.x][cpos.y] = NAN; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, 0.0f)); - cnt++; - } - } - SERIAL_ECHOLNPGM("Locations invalidated.\n"); - } - - if (parser.seen('Q')) { - const int test_pattern = parser.has_value() ? parser.value_int() : -99; - if (!WITHIN(test_pattern, -1, 2)) { - SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n"); - return; - } - SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); - switch (test_pattern) { - - #if ENABLED(UBL_DEVEL_DEBUGGING) - case -1: - g29_eeprom_dump(); - break; - #endif - - case 0: - GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta - const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x, - p2 = 0.5f * (GRID_MAX_POINTS_Y) - y; - z_values[x][y] += 2.0f * HYPOT(p1, p2); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } - break; - - case 1: - LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised - z_values[x][x] += 9.999f; - z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(x, x, z_values[x][x]); - ExtUI::onMeshUpdate(x, (x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1), z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1]); - #endif - - } - break; - - case 2: - // Allow the user to specify the height because 10mm is a little extreme in some cases. - for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in - for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) { // the center of the bed - z_values[x][y] += parser.seen('C') ? g29_constant : 9.99f; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } - break; - } - } - - #if HAS_BED_PROBE - - if (parser.seen('J')) { - save_ubl_active_state_and_disable(); - tilt_mesh_based_on_probed_grid(g29_grid_size == 0); // Zero size does 3-Point - restore_ubl_active_state_and_leave(); - #if ENABLED(UBL_G29_J_RECENTER) - do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); - #endif - report_current_position(); - probe_deployed = true; - } - - #endif // HAS_BED_PROBE - - if (parser.seen('P')) { - if (WITHIN(g29_phase_value, 0, 1) && storage_slot == -1) { - storage_slot = 0; - SERIAL_ECHOLNPGM("Default storage slot 0 selected."); - } - - switch (g29_phase_value) { - case 0: - // - // Zero Mesh Data - // - reset(); - SERIAL_ECHOLNPGM("Mesh zeroed."); - break; - - #if HAS_BED_PROBE - - case 1: { - // - // Invalidate Entire Mesh and Automatically Probe Mesh in areas that can be reached by the probe - // - if (!parser.seen('C')) { - invalidate(); - SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); - } - if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR("Probing around (", g29_pos.x); - SERIAL_CHAR(','); - SERIAL_DECIMAL(g29_pos.y); - SERIAL_ECHOLNPGM(").\n"); - } - const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; - probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); - - report_current_position(); - probe_deployed = true; - } break; - - #endif // HAS_BED_PROBE - - case 2: { - #if HAS_LCD_MENU - // - // Manually Probe Mesh in areas that can't be reached by the probe - // - SERIAL_ECHOLNPGM("Manually probing unreachable points."); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - - if (parser.seen('C') && !xy_seen) { - - /** - * Use a good default location for the path. - * The flipped > and < operators in these comparisons is intentional. - * It should cause the probed points to follow a nice path on Cartesian printers. - * It may make sense to have Delta printers default to the center of the bed. - * Until that is decided, this can be forced with the X and Y parameters. - */ - g29_pos.set( - #if IS_KINEMATIC - X_HOME_POS, Y_HOME_POS - #else - probe.offset_xy.x > 0 ? X_BED_SIZE : 0, - probe.offset_xy.y < 0 ? Y_BED_SIZE : 0 - #endif - ); - } - - if (parser.seen('B')) { - g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); - if (ABS(g29_card_thickness) > 1.5f) { - SERIAL_ECHOLNPGM("?Error in Business Card measurement."); - return; - } - probe_deployed = true; - } - - if (!position_is_reachable(g29_pos)) { - SERIAL_ECHOLNPGM("XY outside printable radius."); - return; - } - - const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); - manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); - - SERIAL_ECHOLNPGM("G29 P2 finished."); - - report_current_position(); - - #else - - SERIAL_ECHOLNPGM("?P2 is only available when an LCD is present."); - return; - - #endif - } break; - - case 3: { - /** - * Populate invalid mesh areas. Proceed with caution. - * Two choices are available: - * - Specify a constant with the 'C' parameter. - * - Allow 'G29 P3' to choose a 'reasonable' constant. - */ - - if (g29_c_flag) { - if (g29_repetition_cnt >= GRID_MAX_POINTS) { - set_all_mesh_points_to_value(g29_constant); - } - else { - while (g29_repetition_cnt--) { // this only populates reachable mesh points near - const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); - const xy_int8_t &cpos = closest.pos; - if (cpos.x < 0) { - // No more REAL INVALID mesh points to populate, so we ASSUME - // user meant to populate ALL INVALID mesh points to value - GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; - break; // No more invalid Mesh Points to populate - } - else { - z_values[cpos.x][cpos.y] = g29_constant; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, g29_constant)); - } - } - } - } - else { - const float cvf = parser.value_float(); - switch ((int)TRUNC(cvf * 10.0f) - 30) { // 3.1 -> 1 - #if ENABLED(UBL_G29_P31) - case 1: { - - // P3.1 use least squares fit to fill missing mesh values - // P3.10 zero weighting for distance, all grid points equal, best fit tilted plane - // P3.11 10X weighting for nearest grid points versus farthest grid points - // P3.12 100X distance weighting - // P3.13 1000X distance weighting, approaches simple average of nearest points - - const float weight_power = (cvf - 3.10f) * 100.0f, // 3.12345 -> 2.345 - weight_factor = weight_power ? POW(10.0f, weight_power) : 0; - smart_fill_wlsf(weight_factor); - } - break; - #endif - case 0: // P3 or P3.0 - default: // and anything P3.x that's not P3.1 - smart_fill_mesh(); // Do a 'Smart' fill using nearby known values - break; - } - } - break; - } - - case 4: // Fine Tune (i.e., Edit) the Mesh - #if HAS_LCD_MENU - fine_tune_mesh(g29_pos, parser.seen('T')); - #else - SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); - return; - #endif - break; - - case 5: adjust_mesh_to_mean(g29_c_flag, g29_constant); break; - - case 6: shift_mesh_height(); break; - } - } - - #if ENABLED(UBL_DEVEL_DEBUGGING) - - // - // Much of the 'What?' command can be eliminated. But until we are fully debugged, it is - // good to have the extra information. Soon... we prune this to just a few items - // - if (parser.seen('W')) g29_what_command(); - - // - // When we are fully debugged, this may go away. But there are some valid - // use cases for the users. So we can wait and see what to do with it. - // - - if (parser.seen('K')) // Kompare Current Mesh Data to Specified Stored Mesh - g29_compare_current_mesh_to_stored_mesh(); - - #endif // UBL_DEVEL_DEBUGGING - - - // - // Load a Mesh from the EEPROM - // - - if (parser.seen('L')) { // Load Current Mesh Data - g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; - - int16_t a = settings.calc_num_meshes(); - - if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); - return; - } - - if (!WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); - return; - } - - settings.load_mesh(g29_storage_slot); - storage_slot = g29_storage_slot; - - SERIAL_ECHOLNPGM("Done."); - } - - // - // Store a Mesh in the EEPROM - // - - if (parser.seen('S')) { // Store (or Save) Current Mesh Data - g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; - - if (g29_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the - return report_current_mesh(); // host program to be saved on the user's computer - - int16_t a = settings.calc_num_meshes(); - - if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); - goto LEAVE; - } - - if (!WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); - goto LEAVE; - } - - settings.store_mesh(g29_storage_slot); - storage_slot = g29_storage_slot; - - SERIAL_ECHOLNPGM("Done."); - } - - if (parser.seen('T')) - display_map(g29_map_type); - - LEAVE: - - #if HAS_LCD_MENU - ui.reset_alert_level(); - ui.quick_feedback(); - ui.reset_status(); - ui.release(); - #endif - - #ifdef Z_PROBE_END_SCRIPT - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); - if (probe_deployed) { - planner.synchronize(); - gcode.process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT)); - } - #else - UNUSED(probe_deployed); - #endif - - TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index)); - return; } - void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { - float sum = 0; - int n = 0; - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - sum += z_values[x][y]; - n++; + void ubl_map_screen(); + +#endif + +#define SIZE_OF_LITTLE_RAISE 1 +#define BIG_RAISE_NOT_NEEDED 0 + +int unified_bed_leveling::g29_verbose_level, + unified_bed_leveling::g29_phase_value, + unified_bed_leveling::g29_repetition_cnt, + unified_bed_leveling::g29_storage_slot = 0, + unified_bed_leveling::g29_map_type; +bool unified_bed_leveling::g29_c_flag; +float unified_bed_leveling::g29_card_thickness = 0, + unified_bed_leveling::g29_constant = 0; +xy_bool_t unified_bed_leveling::xy_seen; +xy_pos_t unified_bed_leveling::g29_pos; + +#if HAS_BED_PROBE + int unified_bed_leveling::g29_grid_size; +#endif + +/** + * G29: Unified Bed Leveling by Roxy + * + * Parameters understood by this leveling system: + * + * A Activate Activate the Unified Bed Leveling system. + * + * B # Business Use the 'Business Card' mode of the Manual Probe subsystem with P2. + * Note: A non-compressible Spark Gap feeler gauge is recommended over a business card. + * In this mode of G29 P2, a business or index card is used as a shim that the nozzle can + * grab onto as it is lowered. In principle, the nozzle-bed distance is the same when the + * same resistance is felt in the shim. You can omit the numerical value on first invocation + * of G29 P2 B to measure shim thickness. Subsequent use of 'B' will apply the previously- + * measured thickness by default. + * + * C Continue G29 P1 C continues the generation of a partially-constructed Mesh without invalidating + * previous measurements. + * + * C G29 P2 C tells the Manual Probe subsystem to not use the current nozzle + * location in its search for the closest unmeasured Mesh Point. Instead, attempt to + * start at one end of the uprobed points and Continue sequentially. + * + * G29 P3 C specifies the Constant for the fill. Otherwise, uses a "reasonable" value. + * + * C Current G29 Z C uses the Current location (instead of bed center or nearest edge). + * + * D Disable Disable the Unified Bed Leveling system. + * + * E Stow_probe Stow the probe after each sampled point. + * + * F # Fade Fade the amount of Mesh Based Compensation over a specified height. At the + * specified height, no correction is applied and natural printer kenimatics take over. If no + * number is specified for the command, 10mm is assumed to be reasonable. + * + * H # Height With P2, 'H' specifies the Height to raise the nozzle after each manual probe of the bed. + * If omitted, the nozzle will raise by Z_CLEARANCE_BETWEEN_PROBES. + * + * H # Offset With P4, 'H' specifies the Offset above the mesh height to place the nozzle. + * If omitted, Z_CLEARANCE_BETWEEN_PROBES will be used. + * + * I # Invalidate Invalidate the specified number of Mesh Points near the given 'X' 'Y'. If X or Y are omitted, + * the nozzle location is used. If no 'I' value is given, only the point nearest to the location + * is invalidated. Use 'T' to produce a map afterward. This command is useful to invalidate a + * portion of the Mesh so it can be adjusted using other UBL tools. When attempting to invalidate + * an isolated bad mesh point, the 'T' option shows the nozzle position in the Mesh with (#). You + * can move the nozzle around and use this feature to select the center of the area (or cell) to + * invalidate. + * + * J # Grid Perform a Grid Based Leveling of the current Mesh using a grid with n points on a side. + * Not specifying a grid size will invoke the 3-Point leveling function. + * + * L Load Load Mesh from the previously activated location in the EEPROM. + * + * L # Load Load Mesh from the specified location in the EEPROM. Set this location as activated + * for subsequent Load and Store operations. + * + * The P or Phase commands are used for the bulk of the work to setup a Mesh. In general, your Mesh will + * start off being initialized with a G29 P0 or a G29 P1. Further refinement of the Mesh happens with + * each additional Phase that processes it. + * + * P0 Phase 0 Zero Mesh Data and turn off the Mesh Compensation System. This reverts the + * 3D Printer to the same state it was in before the Unified Bed Leveling Compensation + * was turned on. Setting the entire Mesh to Zero is a special case that allows + * a subsequent G or T leveling operation for backward compatibility. + * + * P1 Phase 1 Invalidate entire Mesh and continue with automatic generation of the Mesh data using + * the Z-Probe. Usually the probe can't reach all areas that the nozzle can reach. For delta + * printers only the areas where the probe and nozzle can both reach will be automatically probed. + * + * Unreachable points will be handled in Phase 2 and Phase 3. + * + * Use 'C' to leave the previous mesh intact and automatically probe needed points. This allows you + * to invalidate parts of the Mesh but still use Automatic Probing. + * + * The 'X' and 'Y' parameters prioritize where to try and measure points. If omitted, the current + * probe position is used. + * + * Use 'T' (Topology) to generate a report of mesh generation. + * + * P1 will suspend Mesh generation if the controller button is held down. Note that you may need + * to press and hold the switch for several seconds if moves are underway. + * + * P2 Phase 2 Probe unreachable points. + * + * Use 'H' to set the height between Mesh points. If omitted, Z_CLEARANCE_BETWEEN_PROBES is used. + * Smaller values will be quicker. Move the nozzle down till it barely touches the bed. Make sure the + * nozzle is clean and unobstructed. Use caution and move slowly. This can damage your printer! + * (Uses SIZE_OF_LITTLE_RAISE mm if the nozzle is moving less than BIG_RAISE_NOT_NEEDED mm.) + * + * The 'H' value can be negative if the Mesh dips in a large area. Press and hold the + * controller button to terminate the current Phase 2 command. You can then re-issue "G29 P 2" + * with an 'H' parameter more suitable for the area you're manually probing. Note that the command + * tries to start in a corner of the bed where movement will be predictable. Override the distance + * calculation location with the X and Y parameters. You can print a Mesh Map (G29 T) to see where + * the mesh is invalidated and where the nozzle needs to move to complete the command. Use 'C' to + * indicate that the search should be based on the current position. + * + * The 'B' parameter for this command is described above. It places the manual probe subsystem into + * Business Card mode where the thickness of a business card is measured and then used to accurately + * set the nozzle height in all manual probing for the duration of the command. A Business card can + * be used, but you'll get better results with a flexible Shim that doesn't compress. This makes it + * easier to produce similar amounts of force and get more accurate measurements. Google if you're + * not sure how to use a shim. + * + * The 'T' (Map) parameter helps track Mesh building progress. + * + * NOTE: P2 requires an LCD controller! + * + * P3 Phase 3 Fill the unpopulated regions of the Mesh with a fixed value. There are two different paths to + * go down: + * + * - If a 'C' constant is specified, the closest invalid mesh points to the nozzle will be filled, + * and a repeat count can then also be specified with 'R'. + * + * - Leaving out 'C' invokes Smart Fill, which scans the mesh from the edges inward looking for + * invalid mesh points. Adjacent points are used to determine the bed slope. If the bed is sloped + * upward from the invalid point, it takes the value of the nearest point. If sloped downward, it's + * replaced by a value that puts all three points in a line. This version of G29 P3 is a quick, easy + * and (usually) safe way to populate unprobed mesh regions before continuing to G26 Mesh Validation + * Pattern. Note that this populates the mesh with unverified values. Pay attention and use caution. + * + * P4 Phase 4 Fine tune the Mesh. The Delta Mesh Compensation System assumes the existence of + * an LCD Panel. It is possible to fine tune the mesh without an LCD Panel using + * G42 and M421. See the UBL documentation for further details. + * + * Phase 4 is meant to be used with G26 Mesh Validation to fine tune the mesh by direct editing + * of Mesh Points. Raise and lower points to fine tune the mesh until it gives consistently reliable + * adhesion. + * + * P4 moves to the closest Mesh Point (and/or the given X Y), raises the nozzle above the mesh height + * by the given 'H' offset (or default 0), and waits while the controller is used to adjust the nozzle + * height. On click the displayed height is saved in the mesh. + * + * Start Phase 4 at a specific location with X and Y. Adjust a specific number of Mesh Points with + * the 'R' (Repeat) parameter. (If 'R' is left out, the whole matrix is assumed.) This command can be + * terminated early (e.g., after editing the area of interest) by pressing and holding the encoder button. + * + * The general form is G29 P4 [R points] [X position] [Y position] + * + * The H [offset] parameter is useful if a shim is used to fine-tune the mesh. For a 0.4mm shim the + * command would be G29 P4 H0.4. The nozzle is moved to the shim height, you adjust height to the shim, + * and on click the height minus the shim thickness will be saved in the mesh. + * + * !!Use with caution, as a very poor mesh could cause the nozzle to crash into the bed!! + * + * NOTE: P4 is not available unless you have LCD support enabled! + * + * P5 Phase 5 Find Mean Mesh Height and Standard Deviation. Typically, it is easier to use and + * work with the Mesh if it is Mean Adjusted. You can specify a C parameter to + * Correct the Mesh to a 0.00 Mean Height. Adding a C parameter will automatically + * execute a G29 P6 C . + * + * P6 Phase 6 Shift Mesh height. The entire Mesh's height is adjusted by the height specified + * with the C parameter. Being able to adjust the height of a Mesh is useful tool. It + * can be used to compensate for poorly calibrated Z-Probes and other errors. Ideally, + * you should have the Mesh adjusted for a Mean Height of 0.00 and the Z-Probe measuring + * 0.000 at the Z Home location. + * + * Q Test Load specified Test Pattern to assist in checking correct operation of system. This + * command is not anticipated to be of much value to the typical user. It is intended + * for developers to help them verify correct operation of the Unified Bed Leveling System. + * + * R # Repeat Repeat this command the specified number of times. If no number is specified the + * command will be repeated GRID_MAX_POINTS_X * GRID_MAX_POINTS_Y times. + * + * S Store Store the current Mesh in the Activated area of the EEPROM. It will also store the + * current state of the Unified Bed Leveling system in the EEPROM. + * + * S # Store Store the current Mesh at the specified location in EEPROM. Activate this location + * for subsequent Load and Store operations. Valid storage slot numbers begin at 0 and + * extend to a limit related to the available EEPROM storage. + * + * S -1 Store Print the current Mesh as G-code that can be used to restore the mesh anytime. + * + * T Topology Display the Mesh Map Topology. + * 'T' can be used alone (e.g., G29 T) or in combination with most of the other commands. + * This option works with all Phase commands (e.g., G29 P4 R 5 T X 50 Y100 C -.1 O) + * This parameter can also specify a Map Type. T0 (the default) is user-readable. T1 + * is suitable to paste into a spreadsheet for a 3D graph of the mesh. + * + * U Unlevel Perform a probe of the outer perimeter to assist in physically leveling unlevel beds. + * Only used for G29 P1 T U. This speeds up the probing of the edge of the bed. Useful + * when the entire bed doesn't need to be probed because it will be adjusted. + * + * V # Verbosity Set the verbosity level (0-4) for extra details. (Default 0) + * + * X # X Location for this command + * + * Y # Y Location for this command + * + * With UBL_DEVEL_DEBUGGING: + * + * K # Kompare Kompare current Mesh with stored Mesh #, replacing current Mesh with the result. + * This command literally performs a diff between two Meshes. + * + * Q-1 Dump EEPROM Dump the UBL contents stored in EEPROM as HEX format. Useful for developers to help + * verify correct operation of the UBL. + * + * W What? Display valuable UBL data. + * + * + * Release Notes: + * You MUST do M502, M500 to initialize the storage. Failure to do this will cause all + * kinds of problems. Enabling EEPROM Storage is required. + * + * When you do a G28 and G29 P1 to automatically build your first mesh, you are going to notice that + * UBL probes points increasingly further from the starting location. (The starting location defaults + * to the center of the bed.) In contrast, ABL and MBL follow a zigzag pattern. The spiral pattern is + * especially better for Delta printers, since it populates the center of the mesh first, allowing for + * a quicker test print to verify settings. You don't need to populate the entire mesh to use it. + * After all, you don't want to spend a lot of time generating a mesh only to realize the resolution + * or probe offsets are incorrect. Mesh-generation gathers points starting closest to the nozzle unless + * an (X,Y) coordinate pair is given. + * + * Unified Bed Leveling uses a lot of EEPROM storage to hold its data, and it takes some effort to get + * the mesh just right. To prevent this valuable data from being destroyed as the EEPROM structure + * evolves, UBL stores all mesh data at the end of EEPROM. + * + * UBL is founded on Edward Patel's Mesh Bed Leveling code. A big 'Thanks!' to him and the creators of + * 3-Point and Grid Based leveling. Combining their contributions we now have the functionality and + * features of all three systems combined. + */ + +void unified_bed_leveling::G29() { + + bool probe_deployed = false; + if (g29_parameter_parsing()) return; // Abort on parameter error + + const int8_t p_val = parser.intval('P', -1); + const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); + TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); + + // Check for commands that require the printer to be homed + if (may_move) { + planner.synchronize(); + // Send 'N' to force homing before G29 (internal only) + if (axes_should_home() || parser.seen('N')) gcode.home_all_axes(); + TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); + } + + // Invalidate Mesh Points. This command is a little bit asymmetrical because + // it directly specifies the repetition count and does not use the 'R' parameter. + if (parser.seen('I')) { + uint8_t cnt = 0; + g29_repetition_cnt = parser.has_value() ? parser.value_int() : 1; + if (g29_repetition_cnt >= GRID_MAX_POINTS) { + set_all_mesh_points_to_value(NAN); + } + else { + while (g29_repetition_cnt--) { + if (cnt > 20) { cnt = 0; idle(); } + const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); + const xy_int8_t &cpos = closest.pos; + if (cpos.x < 0) { + // No more REAL mesh points to invalidate, so we ASSUME the user + // meant to invalidate the ENTIRE mesh, which cannot be done with + // find_closest_mesh_point loop which only returns REAL points. + set_all_mesh_points_to_value(NAN); + SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); + break; // No more invalid Mesh Points to populate + } + z_values[cpos.x][cpos.y] = NAN; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, 0.0f)); + cnt++; } + } + SERIAL_ECHOLNPGM("Locations invalidated.\n"); + } - const float mean = sum / n; + if (parser.seen('Q')) { + const int test_pattern = parser.has_value() ? parser.value_int() : -99; + if (!WITHIN(test_pattern, -1, 2)) { + SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n"); + return; + } + SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); + switch (test_pattern) { - // - // Sum the squares of difference from mean - // - float sum_of_diff_squared = 0; - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) - sum_of_diff_squared += sq(z_values[x][y] - mean); + #if ENABLED(UBL_DEVEL_DEBUGGING) + case -1: + g29_eeprom_dump(); + break; + #endif - SERIAL_ECHOLNPAIR("# of samples: ", n); - SERIAL_ECHOLNPAIR_F("Mean Mesh Height: ", mean, 6); - - const float sigma = SQRT(sum_of_diff_squared / (n + 1)); - SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); - - if (cflag) - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - z_values[x][y] -= mean + value; + case 0: + GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta + const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x, + p2 = 0.5f * (GRID_MAX_POINTS_Y) - y; + z_values[x][y] += 2.0f * HYPOT(p1, p2); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } - } + break; - void unified_bed_leveling::shift_mesh_height() { - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - z_values[x][y] += g29_constant; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } + case 1: + LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised + z_values[x][x] += 9.999f; + z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(x, x, z_values[x][x]); + ExtUI::onMeshUpdate(x, (x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1), z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1]); + #endif + + } + break; + + case 2: + // Allow the user to specify the height because 10mm is a little extreme in some cases. + for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in + for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) { // the center of the bed + z_values[x][y] += parser.seen('C') ? g29_constant : 9.99f; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + break; + } } #if HAS_BED_PROBE - /** - * Probe all invalidated locations of the mesh that can be reached by the probe. - * This attempts to fill in locations closest to the nozzle's start location first. - */ - void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &nearby, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { - probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW - - TERN_(HAS_LCD_MENU, ui.capture()); - - save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained - uint8_t count = GRID_MAX_POINTS; - - mesh_index_pair best; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); - do { - if (do_ubl_mesh_map) display_map(g29_map_type); - - const int point_num = (GRID_MAX_POINTS) - count + 1; - SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); - - #if HAS_LCD_MENU - if (ui.button_pressed()) { - ui.quick_feedback(false); // Preserve button state for click-and-hold - SERIAL_ECHOLNPGM("\nMesh only partially populated.\n"); - ui.wait_for_release(); - ui.quick_feedback(); - ui.release(); - probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW - return restore_ubl_active_state_and_leave(); - } - #endif - - best = do_furthest - ? find_furthest_invalid_mesh_point() - : find_closest_mesh_point_of_type(INVALID, nearby, true); - - if (best.pos.x >= 0) { // mesh point found and is reachable by probe - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); - const float measured_z = probe.probe_at_point( - best.meshpos(), - stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level - ); - z_values[best.pos.x][best.pos.y] = measured_z; - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_FINISH); - ExtUI::onMeshUpdate(best.pos, measured_z); - #endif - } - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - - } while (best.pos.x >= 0 && --count); - - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_FINISH)); - - // Release UI during stow to allow for PAUSE_BEFORE_DEPLOY_STOW - TERN_(HAS_LCD_MENU, ui.release()); - probe.stow(); - TERN_(HAS_LCD_MENU, ui.capture()); - - probe.move_z_after_probing(); + if (parser.seen('J')) { + save_ubl_active_state_and_disable(); + tilt_mesh_based_on_probed_grid(g29_grid_size == 0); // Zero size does 3-Point restore_ubl_active_state_and_leave(); - - do_blocking_move_to_xy( - constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), - constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) - ); + #if ENABLED(UBL_G29_J_RECENTER) + do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); + #endif + report_current_position(); + probe_deployed = true; } #endif // HAS_BED_PROBE - #if HAS_LCD_MENU - - typedef void (*clickFunc_t)(); - - bool click_and_hold(const clickFunc_t func=nullptr) { - if (ui.button_pressed()) { - ui.quick_feedback(false); // Preserve button state for click-and-hold - const millis_t nxt = millis() + 1500UL; - while (ui.button_pressed()) { // Loop while the encoder is pressed. Uses hardware flag! - idle(); // idle, of course - if (ELAPSED(millis(), nxt)) { // After 1.5 seconds - ui.quick_feedback(); - if (func) (*func)(); - ui.wait_for_release(); - return true; - } - } - } - serial_delay(15); - return false; + if (parser.seen('P')) { + if (WITHIN(g29_phase_value, 0, 1) && storage_slot == -1) { + storage_slot = 0; + SERIAL_ECHOLNPGM("Default storage slot 0 selected."); } - void unified_bed_leveling::move_z_with_encoder(const float &multiplier) { - ui.wait_for_release(); - while (!ui.button_pressed()) { - idle(); - gcode.reset_stepper_timeout(); // Keep steppers powered - if (encoder_diff) { - do_blocking_move_to_z(current_position.z + float(encoder_diff) * multiplier); - encoder_diff = 0; - } - } - } + switch (g29_phase_value) { + case 0: + // + // Zero Mesh Data + // + reset(); + SERIAL_ECHOLNPGM("Mesh zeroed."); + break; - float unified_bed_leveling::measure_point_with_encoder() { - KEEPALIVE_STATE(PAUSED_FOR_USER); - move_z_with_encoder(0.01f); - return current_position.z; - } - - static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } - - float unified_bed_leveling::measure_business_card_thickness() { - ui.capture(); - save_ubl_active_state_and_disable(); // Disable bed level correction for probing - - do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), MANUAL_PROBE_START_Z); - //, _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f); - planner.synchronize(); - - SERIAL_ECHOPGM("Place shim under nozzle"); - LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); - ui.return_to_status(); - echo_and_take_a_measurement(); - - const float z1 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position.z + SIZE_OF_LITTLE_RAISE); - planner.synchronize(); - - SERIAL_ECHOPGM("Remove shim"); - LCD_MESSAGEPGM(MSG_UBL_BC_REMOVE); - echo_and_take_a_measurement(); - - const float z2 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES); - - const float thickness = ABS(z1 - z2); - - if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); - SERIAL_ECHOLNPGM("mm thick."); - } - - restore_ubl_active_state_and_leave(); - - return thickness; - } - - void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { - ui.capture(); - - save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained - do_blocking_move_to_xy_z(current_position, z_clearance); - - ui.return_to_status(); - - mesh_index_pair location; - const xy_int8_t &lpos = location.pos; - do { - location = find_closest_mesh_point_of_type(INVALID, pos); - // It doesn't matter if the probe can't reach the NAN location. This is a manual probe. - if (!location.valid()) continue; - - const xyz_pos_t ppos = { - mesh_index_to_xpos(lpos.x), - mesh_index_to_ypos(lpos.y), - Z_CLEARANCE_BETWEEN_PROBES - }; - - if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) - - LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT); - - do_blocking_move_to(ppos); - do_z_clearance(z_clearance); - - KEEPALIVE_STATE(PAUSED_FOR_USER); - ui.capture(); - - if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing - - serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); - - const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step - //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click - - move_z_with_encoder(z_step); - - if (click_and_hold()) { - SERIAL_ECHOLNPGM("\nMesh only partially populated."); - do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); - return restore_ubl_active_state_and_leave(); - } - - z_values[lpos.x][lpos.y] = current_position.z - thick; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); - - if (g29_verbose_level > 2) - SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (location.valid()); - - if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing - - restore_ubl_active_state_and_leave(); - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); - } - - inline void set_message_with_feedback(PGM_P const msg_P) { - ui.set_status_P(msg_P); - ui.quick_feedback(); - } - - void abort_fine_tune() { - ui.return_to_status(); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); - } - - void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { - if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified - g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. - - #if ENABLED(UBL_MESH_EDIT_MOVES_Z) - const float h_offset = parser.seenval('H') ? parser.value_linear_units() : MANUAL_PROBE_START_Z; - if (!WITHIN(h_offset, 0, 10)) { - SERIAL_ECHOLNPGM("Offset out of bounds. (0 to 10mm)\n"); - return; - } - #endif - - mesh_index_pair location; - - if (!position_is_reachable(pos)) { - SERIAL_ECHOLNPGM("(X,Y) outside printable radius."); - return; - } - - save_ubl_active_state_and_disable(); - - LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); - ui.capture(); // Take over control of the LCD encoder - - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance - - MeshFlags done_flags{0}; - const xy_int8_t &lpos = location.pos; - - #if IS_TFTGLCD_PANEL - lcd_mesh_edit_setup(0); // Change current screen before calling ui.ubl_plot - safe_delay(50); - #endif - - do { - location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags); - - if (lpos.x < 0) break; // Stop when there are no more reachable points - - done_flags.mark(lpos); // Mark this location as 'adjusted' so a new - // location is used on the next loop - const xyz_pos_t raw = { - mesh_index_to_xpos(lpos.x), - mesh_index_to_ypos(lpos.y), - Z_CLEARANCE_BETWEEN_PROBES - }; - - if (!position_is_reachable(raw)) break; // SHOULD NOT OCCUR (find_closest_mesh_point_of_type only returns reachable) - - do_blocking_move_to(raw); // Move the nozzle to the edit point with probe clearance - - TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset before editing - - KEEPALIVE_STATE(PAUSED_FOR_USER); - - if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point - - #if IS_TFTGLCD_PANEL - ui.ubl_plot(lpos.x, lpos.y); // update plot screen - #endif - - ui.refresh(); - - float new_z = z_values[lpos.x][lpos.y]; - if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 - new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place - - lcd_mesh_edit_setup(new_z); - - SET_SOFT_ENDSTOP_LOOSE(true); - - do { - idle(); - new_z = lcd_mesh_edit(); - TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (!ui.button_pressed()); - - SET_SOFT_ENDSTOP_LOOSE(false); - - if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status - - if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing - - z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, new_z)); - - serial_delay(20); // No switch noise - ui.refresh(); - - } while (lpos.x >= 0 && --g29_repetition_cnt > 0); - - if (do_ubl_mesh_map) display_map(g29_map_type); - restore_ubl_active_state_and_leave(); - - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); - - LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH); - SERIAL_ECHOLNPGM("Done Editing Mesh"); - - if (lcd_map_control) - ui.goto_screen(ubl_map_screen); - else - ui.return_to_status(); - } - - #endif // HAS_LCD_MENU - - bool unified_bed_leveling::g29_parameter_parsing() { - bool err_flag = false; - - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29))); - - g29_constant = 0; - g29_repetition_cnt = 0; - - if (parser.seen('R')) { - g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; - NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); - if (g29_repetition_cnt < 1) { - SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); - return UBL_ERR; - } - } - - g29_verbose_level = parser.seen('V') ? parser.value_int() : 0; - if (!WITHIN(g29_verbose_level, 0, 4)) { - SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n"); - err_flag = true; - } - - if (parser.seen('P')) { - const int pv = parser.value_int(); - #if !HAS_BED_PROBE - if (pv == 1) { - SERIAL_ECHOLNPGM("G29 P1 requires a probe.\n"); - err_flag = true; - } - else - #endif - { - g29_phase_value = pv; - if (!WITHIN(g29_phase_value, 0, 6)) { - SERIAL_ECHOLNPGM("?(P)hase value invalid (0-6).\n"); - err_flag = true; - } - } - } - - if (parser.seen('J')) { #if HAS_BED_PROBE - g29_grid_size = parser.has_value() ? parser.value_int() : 0; - if (g29_grid_size && !WITHIN(g29_grid_size, 2, 9)) { - SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); - err_flag = true; + + case 1: { + // + // Invalidate Entire Mesh and Automatically Probe Mesh in areas that can be reached by the probe + // + if (!parser.seen('C')) { + invalidate(); + SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); + } + if (g29_verbose_level > 1) { + SERIAL_ECHOPAIR("Probing around (", g29_pos.x); + SERIAL_CHAR(','); + SERIAL_DECIMAL(g29_pos.y); + SERIAL_ECHOLNPGM(").\n"); + } + const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; + probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); + + report_current_position(); + probe_deployed = true; + } break; + + #endif // HAS_BED_PROBE + + case 2: { + #if HAS_LCD_MENU + // + // Manually Probe Mesh in areas that can't be reached by the probe + // + SERIAL_ECHOLNPGM("Manually probing unreachable points."); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + + if (parser.seen('C') && !xy_seen) { + + /** + * Use a good default location for the path. + * The flipped > and < operators in these comparisons is intentional. + * It should cause the probed points to follow a nice path on Cartesian printers. + * It may make sense to have Delta printers default to the center of the bed. + * Until that is decided, this can be forced with the X and Y parameters. + */ + g29_pos.set( + #if IS_KINEMATIC + X_HOME_POS, Y_HOME_POS + #else + probe.offset_xy.x > 0 ? X_BED_SIZE : 0, + probe.offset_xy.y < 0 ? Y_BED_SIZE : 0 + #endif + ); + } + + if (parser.seen('B')) { + g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); + if (ABS(g29_card_thickness) > 1.5f) { + SERIAL_ECHOLNPGM("?Error in Business Card measurement."); + return; + } + probe_deployed = true; + } + + if (!position_is_reachable(g29_pos)) { + SERIAL_ECHOLNPGM("XY outside printable radius."); + return; + } + + const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); + manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); + + SERIAL_ECHOLNPGM("G29 P2 finished."); + + report_current_position(); + + #else + + SERIAL_ECHOLNPGM("?P2 is only available when an LCD is present."); + return; + + #endif + } break; + + case 3: { + /** + * Populate invalid mesh areas. Proceed with caution. + * Two choices are available: + * - Specify a constant with the 'C' parameter. + * - Allow 'G29 P3' to choose a 'reasonable' constant. + */ + + if (g29_c_flag) { + if (g29_repetition_cnt >= GRID_MAX_POINTS) { + set_all_mesh_points_to_value(g29_constant); + } + else { + while (g29_repetition_cnt--) { // this only populates reachable mesh points near + const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); + const xy_int8_t &cpos = closest.pos; + if (cpos.x < 0) { + // No more REAL INVALID mesh points to populate, so we ASSUME + // user meant to populate ALL INVALID mesh points to value + GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; + break; // No more invalid Mesh Points to populate + } + else { + z_values[cpos.x][cpos.y] = g29_constant; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, g29_constant)); + } + } + } } - #else - SERIAL_ECHOLNPGM("G29 J action requires a probe.\n"); - err_flag = true; - #endif - } + else { + const float cvf = parser.value_float(); + switch ((int)TRUNC(cvf * 10.0f) - 30) { // 3.1 -> 1 + #if ENABLED(UBL_G29_P31) + case 1: { - xy_seen.x = parser.seenval('X'); - float sx = xy_seen.x ? parser.value_float() : current_position.x; - xy_seen.y = parser.seenval('Y'); - float sy = xy_seen.y ? parser.value_float() : current_position.y; + // P3.1 use least squares fit to fill missing mesh values + // P3.10 zero weighting for distance, all grid points equal, best fit tilted plane + // P3.11 10X weighting for nearest grid points versus farthest grid points + // P3.12 100X distance weighting + // P3.13 1000X distance weighting, approaches simple average of nearest points - if (xy_seen.x != xy_seen.y) { - SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); - err_flag = true; - } - - // If X or Y are not valid, use center of the bed values - if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; - if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; - - if (err_flag) return UBL_ERR; - - g29_pos.set(sx, sy); - - /** - * Activate or deactivate UBL - * Note: UBL's G29 restores the state set here when done. - * Leveling is being enabled here with old data, possibly - * none. Error handling should disable for safety... - */ - if (parser.seen('A')) { - if (parser.seen('D')) { - SERIAL_ECHOLNPGM("?Can't activate and deactivate at the same time.\n"); - return UBL_ERR; - } - set_bed_leveling_enabled(true); - report_state(); - } - else if (parser.seen('D')) { - set_bed_leveling_enabled(false); - report_state(); - } - - // Set global 'C' flag and its value - if ((g29_c_flag = parser.seen('C'))) - g29_constant = parser.value_float(); - - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - if (parser.seenval('F')) { - const float fh = parser.value_float(); - if (!WITHIN(fh, 0, 100)) { - SERIAL_ECHOLNPGM("?(F)ade height for Bed Level Correction not plausible.\n"); - return UBL_ERR; + const float weight_power = (cvf - 3.10f) * 100.0f, // 3.12345 -> 2.345 + weight_factor = weight_power ? POW(10.0f, weight_power) : 0; + smart_fill_wlsf(weight_factor); + } + break; + #endif + case 0: // P3 or P3.0 + default: // and anything P3.x that's not P3.1 + smart_fill_mesh(); // Do a 'Smart' fill using nearby known values + break; + } } - set_z_fade_height(fh); + break; } - #endif - g29_map_type = parser.intval('T'); - if (!WITHIN(g29_map_type, 0, 2)) { - SERIAL_ECHOLNPGM("Invalid map type.\n"); - return UBL_ERR; + case 4: // Fine Tune (i.e., Edit) the Mesh + #if HAS_LCD_MENU + fine_tune_mesh(g29_pos, parser.seen('T')); + #else + SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); + return; + #endif + break; + + case 5: adjust_mesh_to_mean(g29_c_flag, g29_constant); break; + + case 6: shift_mesh_height(); break; } - return UBL_OK; } - static uint8_t ubl_state_at_invocation = 0; - #if ENABLED(UBL_DEVEL_DEBUGGING) - static uint8_t ubl_state_recursion_chk = 0; + + // + // Much of the 'What?' command can be eliminated. But until we are fully debugged, it is + // good to have the extra information. Soon... we prune this to just a few items + // + if (parser.seen('W')) g29_what_command(); + + // + // When we are fully debugged, this may go away. But there are some valid + // use cases for the users. So we can wait and see what to do with it. + // + + if (parser.seen('K')) // Kompare Current Mesh Data to Specified Stored Mesh + g29_compare_current_mesh_to_stored_mesh(); + + #endif // UBL_DEVEL_DEBUGGING + + + // + // Load a Mesh from the EEPROM + // + + if (parser.seen('L')) { // Load Current Mesh Data + g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + + int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + return; + } + + if (!WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + return; + } + + settings.load_mesh(g29_storage_slot); + storage_slot = g29_storage_slot; + + SERIAL_ECHOLNPGM("Done."); + } + + // + // Store a Mesh in the EEPROM + // + + if (parser.seen('S')) { // Store (or Save) Current Mesh Data + g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + + if (g29_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the + return report_current_mesh(); // host program to be saved on the user's computer + + int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + goto LEAVE; + } + + if (!WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + goto LEAVE; + } + + settings.store_mesh(g29_storage_slot); + storage_slot = g29_storage_slot; + + SERIAL_ECHOLNPGM("Done."); + } + + if (parser.seen('T')) + display_map(g29_map_type); + + LEAVE: + + #if HAS_LCD_MENU + ui.reset_alert_level(); + ui.quick_feedback(); + ui.reset_status(); + ui.release(); #endif - void unified_bed_leveling::save_ubl_active_state_and_disable() { - #if ENABLED(UBL_DEVEL_DEBUGGING) - ubl_state_recursion_chk++; - if (ubl_state_recursion_chk != 1) { - SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR))); - return; - } - #endif - ubl_state_at_invocation = planner.leveling_active; - set_bed_leveling_enabled(false); - } - - void unified_bed_leveling::restore_ubl_active_state_and_leave() { - TERN_(HAS_LCD_MENU, ui.release()); - #if ENABLED(UBL_DEVEL_DEBUGGING) - if (--ubl_state_recursion_chk) { - SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR))); - return; - } - #endif - set_bed_leveling_enabled(ubl_state_at_invocation); - } - - mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { - - bool found_a_NAN = false, found_a_real = false; - - mesh_index_pair farthest { -1, -1, -99999.99 }; - - GRID_LOOP(i, j) { - if (!isnan(z_values[i][j])) continue; // Skip valid mesh points - - // Skip unreachable points - if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) - continue; - - found_a_NAN = true; - - xy_int8_t nearby { -1, -1 }; - float d1, d2 = 99999.9f; - GRID_LOOP(k, l) { - if (isnan(z_values[k][l])) continue; - - found_a_real = true; - - // Add in a random weighting factor that scrambles the probing of the - // last half of the mesh (when every unprobed mesh point is one index - // from a probed location). - - d1 = HYPOT(i - k, j - l) + (1.0f / ((millis() % 47) + 13)); - - if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) - d2 = d1; - nearby.set(i, j); - } - } - - // - // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) - // - - if (found_a_real && nearby.x >= 0 && d2 > farthest.distance) { - farthest.pos = nearby; // Found an invalid location farther from the defined mesh point - farthest.distance = d2; - } - } // GRID_LOOP - - if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing - farthest.pos.set((GRID_MAX_POINTS_X) / 2, (GRID_MAX_POINTS_Y) / 2); - farthest.distance = 1; + #ifdef Z_PROBE_END_SCRIPT + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); + if (probe_deployed) { + planner.synchronize(); + gcode.process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT)); } - return farthest; - } + #else + UNUSED(probe_deployed); + #endif - mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { - mesh_index_pair closest; - closest.invalidate(); - closest.distance = -99999.9f; + TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index)); + return; +} - // Get the reference position, either nozzle or probe - const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; +void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { + float sum = 0; + int n = 0; + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + sum += z_values[x][y]; + n++; + } - float best_so_far = 99999.99f; + const float mean = sum / n; - GRID_LOOP(i, j) { - if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) - || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) - ) { - // Found a Mesh Point of the specified type! - const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + // + // Sum the squares of difference from mean + // + float sum_of_diff_squared = 0; + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) + sum_of_diff_squared += sq(z_values[x][y] - mean); - // If using the probe as the reference there are some unreachable locations. - // Also for round beds, there are grid points outside the bed the nozzle can't reach. - // Prune them from the list and ignore them till the next Phase (manual nozzle probing). + SERIAL_ECHOLNPAIR("# of samples: ", n); + SERIAL_ECHOLNPAIR_F("Mean Mesh Height: ", mean, 6); - if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) - continue; + const float sigma = SQRT(sum_of_diff_squared / (n + 1)); + SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); - // Reachable. Check if it's the best_so_far location to the nozzle. - - const xy_pos_t diff = current_position - mpos; - const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; - - // factor in the distance from the current location for the normal case - // so the nozzle isn't running all over the bed. - if (distance < best_so_far) { - best_so_far = distance; // Found a closer location with the desired value type. - closest.pos.set(i, j); - closest.distance = best_so_far; - } + if (cflag) + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + z_values[x][y] -= mean + value; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } - } // GRID_LOOP +} - return closest; +void unified_bed_leveling::shift_mesh_height() { + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + z_values[x][y] += g29_constant; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } +} + +#if HAS_BED_PROBE + /** + * Probe all invalidated locations of the mesh that can be reached by the probe. + * This attempts to fill in locations closest to the nozzle's start location first. + */ + void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &nearby, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { + probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW + + TERN_(HAS_LCD_MENU, ui.capture()); + + save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained + uint8_t count = GRID_MAX_POINTS; + + mesh_index_pair best; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); + do { + if (do_ubl_mesh_map) display_map(g29_map_type); + + const int point_num = (GRID_MAX_POINTS) - count + 1; + SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); + + #if HAS_LCD_MENU + if (ui.button_pressed()) { + ui.quick_feedback(false); // Preserve button state for click-and-hold + SERIAL_ECHOLNPGM("\nMesh only partially populated.\n"); + ui.wait_for_release(); + ui.quick_feedback(); + ui.release(); + probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW + return restore_ubl_active_state_and_leave(); + } + #endif + + best = do_furthest + ? find_furthest_invalid_mesh_point() + : find_closest_mesh_point_of_type(INVALID, nearby, true); + + if (best.pos.x >= 0) { // mesh point found and is reachable by probe + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); + const float measured_z = probe.probe_at_point( + best.meshpos(), + stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level + ); + z_values[best.pos.x][best.pos.y] = measured_z; + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_FINISH); + ExtUI::onMeshUpdate(best.pos, measured_z); + #endif + } + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + + } while (best.pos.x >= 0 && --count); + + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_FINISH)); + + // Release UI during stow to allow for PAUSE_BEFORE_DEPLOY_STOW + TERN_(HAS_LCD_MENU, ui.release()); + probe.stow(); + TERN_(HAS_LCD_MENU, ui.capture()); + + probe.move_z_after_probing(); + + restore_ubl_active_state_and_leave(); + + do_blocking_move_to_xy( + constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), + constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) + ); } - /** - * 'Smart Fill': Scan from the outward edges of the mesh towards the center. - * If an invalid location is found, use the next two points (if valid) to - * calculate a 'reasonable' value for the unprobed mesh point. - */ +#endif // HAS_BED_PROBE - bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { - const float v = z_values[x][y]; - if (isnan(v)) { // A NAN... - const int8_t dx = x + xdir, dy = y + ydir; - const float v1 = z_values[dx][dy]; - if (!isnan(v1)) { // ...next to a pair of real values? - const float v2 = z_values[dx + xdir][dy + ydir]; - if (!isnan(v2)) { - z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); +#if HAS_LCD_MENU + + typedef void (*clickFunc_t)(); + + bool click_and_hold(const clickFunc_t func=nullptr) { + if (ui.button_pressed()) { + ui.quick_feedback(false); // Preserve button state for click-and-hold + const millis_t nxt = millis() + 1500UL; + while (ui.button_pressed()) { // Loop while the encoder is pressed. Uses hardware flag! + idle(); // idle, of course + if (ELAPSED(millis(), nxt)) { // After 1.5 seconds + ui.quick_feedback(); + if (func) (*func)(); + ui.wait_for_release(); return true; } } } + serial_delay(15); return false; } - typedef struct { uint8_t sx, ex, sy, ey; bool yfirst; } smart_fill_info; - - void unified_bed_leveling::smart_fill_mesh() { - static const smart_fill_info - info0 PROGMEM = { 0, GRID_MAX_POINTS_X, 0, GRID_MAX_POINTS_Y - 2, false }, // Bottom of the mesh looking up - info1 PROGMEM = { 0, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y - 1, 0, false }, // Top of the mesh looking down - info2 PROGMEM = { 0, GRID_MAX_POINTS_X - 2, 0, GRID_MAX_POINTS_Y, true }, // Left side of the mesh looking right - info3 PROGMEM = { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true }; // Right side of the mesh looking left - static const smart_fill_info * const info[] PROGMEM = { &info0, &info1, &info2, &info3 }; - - LOOP_L_N(i, COUNT(info)) { - const smart_fill_info *f = (smart_fill_info*)pgm_read_ptr(&info[i]); - const int8_t sx = pgm_read_byte(&f->sx), sy = pgm_read_byte(&f->sy), - ex = pgm_read_byte(&f->ex), ey = pgm_read_byte(&f->ey); - if (pgm_read_byte(&f->yfirst)) { - const int8_t dir = ex > sx ? 1 : -1; - for (uint8_t y = sy; y != ey; ++y) - for (uint8_t x = sx; x != ex; x += dir) - if (smart_fill_one(x, y, dir, 0)) break; - } - else { - const int8_t dir = ey > sy ? 1 : -1; - for (uint8_t x = sx; x != ex; ++x) - for (uint8_t y = sy; y != ey; y += dir) - if (smart_fill_one(x, y, 0, dir)) break; + void unified_bed_leveling::move_z_with_encoder(const float &multiplier) { + ui.wait_for_release(); + while (!ui.button_pressed()) { + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + if (encoder_diff) { + do_blocking_move_to_z(current_position.z + float(encoder_diff) * multiplier); + encoder_diff = 0; } } } - #if HAS_BED_PROBE + float unified_bed_leveling::measure_point_with_encoder() { + KEEPALIVE_STATE(PAUSED_FOR_USER); + move_z_with_encoder(0.01f); + return current_position.z; + } - //#define VALIDATE_MESH_TILT + static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } - #include "../../../libs/vector_3.h" + float unified_bed_leveling::measure_business_card_thickness() { + ui.capture(); + save_ubl_active_state_and_disable(); // Disable bed level correction for probing - void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { - const float x_min = probe.min_x(), x_max = probe.max_x(), - y_min = probe.min_y(), y_max = probe.max_y(), - dx = (x_max - x_min) / (g29_grid_size - 1), - dy = (y_max - y_min) / (g29_grid_size - 1); + do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), MANUAL_PROBE_START_Z); + //, _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f); + planner.synchronize(); - xy_float_t points[3]; - probe.get_three_points(points); + SERIAL_ECHOPGM("Place shim under nozzle"); + LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); + ui.return_to_status(); + echo_and_take_a_measurement(); - float measured_z; - bool abort_flag = false; + const float z1 = measure_point_with_encoder(); + do_blocking_move_to_z(current_position.z + SIZE_OF_LITTLE_RAISE); + planner.synchronize(); - #ifdef VALIDATE_MESH_TILT - float z1, z2, z3; // Needed for algorithm validation below + SERIAL_ECHOPGM("Remove shim"); + LCD_MESSAGEPGM(MSG_UBL_BC_REMOVE); + echo_and_take_a_measurement(); + + const float z2 = measure_point_with_encoder(); + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES); + + const float thickness = ABS(z1 - z2); + + if (g29_verbose_level > 1) { + SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); + SERIAL_ECHOLNPGM("mm thick."); + } + + restore_ubl_active_state_and_leave(); + + return thickness; + } + + void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { + ui.capture(); + + save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained + do_blocking_move_to_xy_z(current_position, z_clearance); + + ui.return_to_status(); + + mesh_index_pair location; + const xy_int8_t &lpos = location.pos; + do { + location = find_closest_mesh_point_of_type(INVALID, pos); + // It doesn't matter if the probe can't reach the NAN location. This is a manual probe. + if (!location.valid()) continue; + + const xyz_pos_t ppos = { + mesh_index_to_xpos(lpos.x), + mesh_index_to_ypos(lpos.y), + Z_CLEARANCE_BETWEEN_PROBES + }; + + if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) + + LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT); + + do_blocking_move_to(ppos); + do_z_clearance(z_clearance); + + KEEPALIVE_STATE(PAUSED_FOR_USER); + ui.capture(); + + if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + + serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); + + const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step + //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click + + move_z_with_encoder(z_step); + + if (click_and_hold()) { + SERIAL_ECHOLNPGM("\nMesh only partially populated."); + do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); + return restore_ubl_active_state_and_leave(); + } + + z_values[lpos.x][lpos.y] = current_position.z - thick; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); + + if (g29_verbose_level > 2) + SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } while (location.valid()); + + if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + + restore_ubl_active_state_and_leave(); + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); + } + + inline void set_message_with_feedback(PGM_P const msg_P) { + ui.set_status_P(msg_P); + ui.quick_feedback(); + } + + void abort_fine_tune() { + ui.return_to_status(); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); + } + + void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { + if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified + g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. + + #if ENABLED(UBL_MESH_EDIT_MOVES_Z) + const float h_offset = parser.seenval('H') ? parser.value_linear_units() : MANUAL_PROBE_START_Z; + if (!WITHIN(h_offset, 0, 10)) { + SERIAL_ECHOLNPGM("Offset out of bounds. (0 to 10mm)\n"); + return; + } + #endif + + mesh_index_pair location; + + if (!position_is_reachable(pos)) { + SERIAL_ECHOLNPGM("(X,Y) outside printable radius."); + return; + } + + save_ubl_active_state_and_disable(); + + LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); + ui.capture(); // Take over control of the LCD encoder + + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance + + MeshFlags done_flags{0}; + const xy_int8_t &lpos = location.pos; + + #if IS_TFTGLCD_PANEL + lcd_mesh_edit_setup(0); // Change current screen before calling ui.ubl_plot + safe_delay(50); + #endif + + do { + location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags); + + if (lpos.x < 0) break; // Stop when there are no more reachable points + + done_flags.mark(lpos); // Mark this location as 'adjusted' so a new + // location is used on the next loop + const xyz_pos_t raw = { + mesh_index_to_xpos(lpos.x), + mesh_index_to_ypos(lpos.y), + Z_CLEARANCE_BETWEEN_PROBES + }; + + if (!position_is_reachable(raw)) break; // SHOULD NOT OCCUR (find_closest_mesh_point_of_type only returns reachable) + + do_blocking_move_to(raw); // Move the nozzle to the edit point with probe clearance + + TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset before editing + + KEEPALIVE_STATE(PAUSED_FOR_USER); + + if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point + + #if IS_TFTGLCD_PANEL + ui.ubl_plot(lpos.x, lpos.y); // update plot screen #endif - struct linear_fit_data lsf_results; - incremental_LSF_reset(&lsf_results); + ui.refresh(); - if (do_3_pt_leveling) { - SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + float new_z = z_values[lpos.x][lpos.y]; + if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 + new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place - measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); + lcd_mesh_edit_setup(new_z); + + SET_SOFT_ENDSTOP_LOOSE(true); + + do { + idle(); + new_z = lcd_mesh_edit(); + TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } while (!ui.button_pressed()); + + SET_SOFT_ENDSTOP_LOOSE(false); + + if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status + + if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing + + z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, new_z)); + + serial_delay(20); // No switch noise + ui.refresh(); + + } while (lpos.x >= 0 && --g29_repetition_cnt > 0); + + if (do_ubl_mesh_map) display_map(g29_map_type); + restore_ubl_active_state_and_leave(); + + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); + + LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH); + SERIAL_ECHOLNPGM("Done Editing Mesh"); + + if (lcd_map_control) + ui.goto_screen(ubl_map_screen); + else + ui.return_to_status(); + } + +#endif // HAS_LCD_MENU + +bool unified_bed_leveling::g29_parameter_parsing() { + bool err_flag = false; + + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29))); + + g29_constant = 0; + g29_repetition_cnt = 0; + + if (parser.seen('R')) { + g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; + NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); + if (g29_repetition_cnt < 1) { + SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); + return UBL_ERR; + } + } + + g29_verbose_level = parser.seen('V') ? parser.value_int() : 0; + if (!WITHIN(g29_verbose_level, 0, 4)) { + SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n"); + err_flag = true; + } + + if (parser.seen('P')) { + const int pv = parser.value_int(); + #if !HAS_BED_PROBE + if (pv == 1) { + SERIAL_ECHOLNPGM("G29 P1 requires a probe.\n"); + err_flag = true; + } + else + #endif + { + g29_phase_value = pv; + if (!WITHIN(g29_phase_value, 0, 6)) { + SERIAL_ECHOLNPGM("?(P)hase value invalid (0-6).\n"); + err_flag = true; + } + } + } + + if (parser.seen('J')) { + #if HAS_BED_PROBE + g29_grid_size = parser.has_value() ? parser.value_int() : 0; + if (g29_grid_size && !WITHIN(g29_grid_size, 2, 9)) { + SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); + err_flag = true; + } + #else + SERIAL_ECHOLNPGM("G29 J action requires a probe.\n"); + err_flag = true; + #endif + } + + xy_seen.x = parser.seenval('X'); + float sx = xy_seen.x ? parser.value_float() : current_position.x; + xy_seen.y = parser.seenval('Y'); + float sy = xy_seen.y ? parser.value_float() : current_position.y; + + if (xy_seen.x != xy_seen.y) { + SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); + err_flag = true; + } + + // If X or Y are not valid, use center of the bed values + if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; + if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; + + if (err_flag) return UBL_ERR; + + g29_pos.set(sx, sy); + + /** + * Activate or deactivate UBL + * Note: UBL's G29 restores the state set here when done. + * Leveling is being enabled here with old data, possibly + * none. Error handling should disable for safety... + */ + if (parser.seen('A')) { + if (parser.seen('D')) { + SERIAL_ECHOLNPGM("?Can't activate and deactivate at the same time.\n"); + return UBL_ERR; + } + set_bed_leveling_enabled(true); + report_state(); + } + else if (parser.seen('D')) { + set_bed_leveling_enabled(false); + report_state(); + } + + // Set global 'C' flag and its value + if ((g29_c_flag = parser.seen('C'))) + g29_constant = parser.value_float(); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (parser.seenval('F')) { + const float fh = parser.value_float(); + if (!WITHIN(fh, 0, 100)) { + SERIAL_ECHOLNPGM("?(F)ade height for Bed Level Correction not plausible.\n"); + return UBL_ERR; + } + set_z_fade_height(fh); + } + #endif + + g29_map_type = parser.intval('T'); + if (!WITHIN(g29_map_type, 0, 2)) { + SERIAL_ECHOLNPGM("Invalid map type.\n"); + return UBL_ERR; + } + return UBL_OK; +} + +static uint8_t ubl_state_at_invocation = 0; + +#if ENABLED(UBL_DEVEL_DEBUGGING) + static uint8_t ubl_state_recursion_chk = 0; +#endif + +void unified_bed_leveling::save_ubl_active_state_and_disable() { + #if ENABLED(UBL_DEVEL_DEBUGGING) + ubl_state_recursion_chk++; + if (ubl_state_recursion_chk != 1) { + SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR))); + return; + } + #endif + ubl_state_at_invocation = planner.leveling_active; + set_bed_leveling_enabled(false); +} + +void unified_bed_leveling::restore_ubl_active_state_and_leave() { + TERN_(HAS_LCD_MENU, ui.release()); + #if ENABLED(UBL_DEVEL_DEBUGGING) + if (--ubl_state_recursion_chk) { + SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR))); + return; + } + #endif + set_bed_leveling_enabled(ubl_state_at_invocation); +} + +mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { + + bool found_a_NAN = false, found_a_real = false; + + mesh_index_pair farthest { -1, -1, -99999.99 }; + + GRID_LOOP(i, j) { + if (!isnan(z_values[i][j])) continue; // Skip valid mesh points + + // Skip unreachable points + if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) + continue; + + found_a_NAN = true; + + xy_int8_t nearby { -1, -1 }; + float d1, d2 = 99999.9f; + GRID_LOOP(k, l) { + if (isnan(z_values[k][l])) continue; + + found_a_real = true; + + // Add in a random weighting factor that scrambles the probing of the + // last half of the mesh (when every unprobed mesh point is one index + // from a probed location). + + d1 = HYPOT(i - k, j - l) + (1.0f / ((millis() % 47) + 13)); + + if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) + d2 = d1; + nearby.set(i, j); + } + } + + // + // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) + // + + if (found_a_real && nearby.x >= 0 && d2 > farthest.distance) { + farthest.pos = nearby; // Found an invalid location farther from the defined mesh point + farthest.distance = d2; + } + } // GRID_LOOP + + if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing + farthest.pos.set((GRID_MAX_POINTS_X) / 2, (GRID_MAX_POINTS_Y) / 2); + farthest.distance = 1; + } + return farthest; +} + +mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { + mesh_index_pair closest; + closest.invalidate(); + closest.distance = -99999.9f; + + // Get the reference position, either nozzle or probe + const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; + + float best_so_far = 99999.99f; + + GRID_LOOP(i, j) { + if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) + || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) + ) { + // Found a Mesh Point of the specified type! + const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + + // If using the probe as the reference there are some unreachable locations. + // Also for round beds, there are grid points outside the bed the nozzle can't reach. + // Prune them from the list and ignore them till the next Phase (manual nozzle probing). + + if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) + continue; + + // Reachable. Check if it's the best_so_far location to the nozzle. + + const xy_pos_t diff = current_position - mpos; + const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; + + // factor in the distance from the current location for the normal case + // so the nozzle isn't running all over the bed. + if (distance < best_so_far) { + best_so_far = distance; // Found a closer location with the desired value type. + closest.pos.set(i, j); + closest.distance = best_so_far; + } + } + } // GRID_LOOP + + return closest; +} + +/** + * 'Smart Fill': Scan from the outward edges of the mesh towards the center. + * If an invalid location is found, use the next two points (if valid) to + * calculate a 'reasonable' value for the unprobed mesh point. + */ + +bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { + const float v = z_values[x][y]; + if (isnan(v)) { // A NAN... + const int8_t dx = x + xdir, dy = y + ydir; + const float v1 = z_values[dx][dy]; + if (!isnan(v1)) { // ...next to a pair of real values? + const float v2 = z_values[dx + xdir][dy + ydir]; + if (!isnan(v2)) { + z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + return true; + } + } + } + return false; +} + +typedef struct { uint8_t sx, ex, sy, ey; bool yfirst; } smart_fill_info; + +void unified_bed_leveling::smart_fill_mesh() { + static const smart_fill_info + info0 PROGMEM = { 0, GRID_MAX_POINTS_X, 0, GRID_MAX_POINTS_Y - 2, false }, // Bottom of the mesh looking up + info1 PROGMEM = { 0, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y - 1, 0, false }, // Top of the mesh looking down + info2 PROGMEM = { 0, GRID_MAX_POINTS_X - 2, 0, GRID_MAX_POINTS_Y, true }, // Left side of the mesh looking right + info3 PROGMEM = { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true }; // Right side of the mesh looking left + static const smart_fill_info * const info[] PROGMEM = { &info0, &info1, &info2, &info3 }; + + LOOP_L_N(i, COUNT(info)) { + const smart_fill_info *f = (smart_fill_info*)pgm_read_ptr(&info[i]); + const int8_t sx = pgm_read_byte(&f->sx), sy = pgm_read_byte(&f->sy), + ex = pgm_read_byte(&f->ex), ey = pgm_read_byte(&f->ey); + if (pgm_read_byte(&f->yfirst)) { + const int8_t dir = ex > sx ? 1 : -1; + for (uint8_t y = sy; y != ey; ++y) + for (uint8_t x = sx; x != ex; x += dir) + if (smart_fill_one(x, y, dir, 0)) break; + } + else { + const int8_t dir = ey > sy ? 1 : -1; + for (uint8_t x = sx; x != ex; ++x) + for (uint8_t y = sy; y != ey; y += dir) + if (smart_fill_one(x, y, 0, dir)) break; + } + } +} + +#if HAS_BED_PROBE + + //#define VALIDATE_MESH_TILT + + #include "../../../libs/vector_3.h" + + void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { + const float x_min = probe.min_x(), x_max = probe.max_x(), + y_min = probe.min_y(), y_max = probe.max_y(), + dx = (x_max - x_min) / (g29_grid_size - 1), + dy = (y_max - y_min) / (g29_grid_size - 1); + + xy_float_t points[3]; + probe.get_three_points(points); + + float measured_z; + bool abort_flag = false; + + #ifdef VALIDATE_MESH_TILT + float z1, z2, z3; // Needed for algorithm validation below + #endif + + struct linear_fit_data lsf_results; + incremental_LSF_reset(&lsf_results); + + if (do_3_pt_leveling) { + SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + + measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); + if (isnan(measured_z)) + abort_flag = true; + else { + measured_z -= get_z_correction(points[0]); + #ifdef VALIDATE_MESH_TILT + z1 = measured_z; + #endif + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); + } + incremental_LSF(&lsf_results, points[0], measured_z); + } + + if (!abort_flag) { + SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + + measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); + #ifdef VALIDATE_MESH_TILT + z2 = measured_z; + #endif if (isnan(measured_z)) abort_flag = true; else { - measured_z -= get_z_correction(points[0]); - #ifdef VALIDATE_MESH_TILT - z1 = measured_z; - #endif + measured_z -= get_z_correction(points[1]); if (g29_verbose_level > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, points[0], measured_z); - } - - if (!abort_flag) { - SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - - measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); - #ifdef VALIDATE_MESH_TILT - z2 = measured_z; - #endif - if (isnan(measured_z)) - abort_flag = true; - else { - measured_z -= get_z_correction(points[1]); - if (g29_verbose_level > 3) { - serial_spaces(16); - SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); - } - incremental_LSF(&lsf_results, points[1], measured_z); - } - } - - if (!abort_flag) { - SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - - measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); - #ifdef VALIDATE_MESH_TILT - z3 = measured_z; - #endif - if (isnan(measured_z)) - abort_flag = true; - else { - measured_z -= get_z_correction(points[2]); - if (g29_verbose_level > 3) { - serial_spaces(16); - SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); - } - incremental_LSF(&lsf_results, points[2], measured_z); - } - } - - probe.stow(); - probe.move_z_after_probing(); - - if (abort_flag) { - SERIAL_ECHOLNPGM("?Error probing point. Aborting operation."); - return; + incremental_LSF(&lsf_results, points[1], measured_z); } } - else { // !do_3_pt_leveling - bool zig_zag = false; + if (!abort_flag) { + SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - const uint16_t total_points = sq(g29_grid_size); - uint16_t point_num = 1; - - xy_pos_t rpos; - LOOP_L_N(ix, g29_grid_size) { - rpos.x = x_min + ix * dx; - LOOP_L_N(iy, g29_grid_size) { - rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); - - if (!abort_flag) { - SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); - - measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling - - abort_flag = isnan(measured_z); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - const xy_pos_t lpos = rpos.asLogical(); - DEBUG_CHAR('('); - DEBUG_ECHO_F(rpos.x, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(rpos.y, 7); - DEBUG_ECHOPAIR_F(") logical: (", lpos.x, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(lpos.y, 7); - DEBUG_ECHOPAIR_F(") measured: ", measured_z, 7); - DEBUG_ECHOPAIR_F(" correction: ", get_z_correction(rpos), 7); - } - #endif - - measured_z -= get_z_correction(rpos) /* + probe.offset.z */ ; - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); - - if (g29_verbose_level > 3) { - serial_spaces(16); - SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); - } - incremental_LSF(&lsf_results, rpos, measured_z); - } - - point_num++; + measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); + #ifdef VALIDATE_MESH_TILT + z3 = measured_z; + #endif + if (isnan(measured_z)) + abort_flag = true; + else { + measured_z -= get_z_correction(points[2]); + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - - zig_zag ^= true; + incremental_LSF(&lsf_results, points[2], measured_z); } } + probe.stow(); probe.move_z_after_probing(); - if (abort_flag || finish_incremental_LSF(&lsf_results)) { - SERIAL_ECHOPGM("Could not complete LSF!"); + if (abort_flag) { + SERIAL_ECHOLNPGM("?Error probing point. Aborting operation."); return; } + } + else { // !do_3_pt_leveling - vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); + bool zig_zag = false; - if (g29_verbose_level > 2) { - SERIAL_ECHOPAIR_F("bed plane normal = [", normal.x, 7); - SERIAL_CHAR(','); - SERIAL_ECHO_F(normal.y, 7); - SERIAL_CHAR(','); - SERIAL_ECHO_F(normal.z, 7); - SERIAL_ECHOLNPGM("]"); - } + const uint16_t total_points = sq(g29_grid_size); + uint16_t point_num = 1; - matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); + xy_pos_t rpos; + LOOP_L_N(ix, g29_grid_size) { + rpos.x = x_min + ix * dx; + LOOP_L_N(iy, g29_grid_size) { + rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); - GRID_LOOP(i, j) { - float mx = mesh_index_to_xpos(i), - my = mesh_index_to_ypos(j), - mz = z_values[i][j]; + if (!abort_flag) { + SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR_F("before rotation = [", mx, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(my, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(mz, 7); - DEBUG_ECHOPGM("] ---> "); - DEBUG_DELAY(20); + measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling + + abort_flag = isnan(measured_z); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + const xy_pos_t lpos = rpos.asLogical(); + DEBUG_CHAR('('); + DEBUG_ECHO_F(rpos.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(rpos.y, 7); + DEBUG_ECHOPAIR_F(") logical: (", lpos.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(lpos.y, 7); + DEBUG_ECHOPAIR_F(") measured: ", measured_z, 7); + DEBUG_ECHOPAIR_F(" correction: ", get_z_correction(rpos), 7); + } + #endif + + measured_z -= get_z_correction(rpos) /* + probe.offset.z */ ; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); + + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); + } + incremental_LSF(&lsf_results, rpos, measured_z); + } + + point_num++; } - apply_rotation_xyz(rotation, mx, my, mz); - - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(my, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(mz, 7); - DEBUG_ECHOLNPGM("]"); - DEBUG_DELAY(20); - } - - z_values[i][j] = mz - lsf_results.D; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, z_values[i][j])); + zig_zag ^= true; } + } + probe.stow(); + probe.move_z_after_probing(); + + if (abort_flag || finish_incremental_LSF(&lsf_results)) { + SERIAL_ECHOPGM("Could not complete LSF!"); + return; + } + + vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); + + if (g29_verbose_level > 2) { + SERIAL_ECHOPAIR_F("bed plane normal = [", normal.x, 7); + SERIAL_CHAR(','); + SERIAL_ECHO_F(normal.y, 7); + SERIAL_CHAR(','); + SERIAL_ECHO_F(normal.z, 7); + SERIAL_ECHOLNPGM("]"); + } + + matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); + + GRID_LOOP(i, j) { + float mx = mesh_index_to_xpos(i), + my = mesh_index_to_ypos(j), + mz = z_values[i][j]; if (DEBUGGING(LEVELING)) { - rotation.debug(PSTR("rotation matrix:\n")); - DEBUG_ECHOPAIR_F("LSF Results A=", lsf_results.A, 7); - DEBUG_ECHOPAIR_F(" B=", lsf_results.B, 7); - DEBUG_ECHOLNPAIR_F(" D=", lsf_results.D, 7); - DEBUG_DELAY(55); + DEBUG_ECHOPAIR_F("before rotation = [", mx, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(my, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(mz, 7); + DEBUG_ECHOPGM("] ---> "); + DEBUG_DELAY(20); + } - DEBUG_ECHOPAIR_F("bed plane normal = [", normal.x, 7); + apply_rotation_xyz(rotation, mx, my, mz); + + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(normal.y, 7); + DEBUG_ECHO_F(my, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(normal.z, 7); + DEBUG_ECHO_F(mz, 7); DEBUG_ECHOLNPGM("]"); - DEBUG_EOL(); - - /** - * Use the code below to check the validity of the mesh tilting algorithm. - * 3-Point Mesh Tilt uses the same algorithm as grid-based tilting, but only - * three points are used in the calculation. This guarantees that each probed point - * has an exact match when get_z_correction() for that location is calculated. - * The Z error between the probed point locations and the get_z_correction() - * numbers for those locations should be 0. - */ - #ifdef VALIDATE_MESH_TILT - auto d_from = []{ DEBUG_ECHOPGM("D from "); }; - auto normed = [&](const xy_pos_t &pos, const float &zadd) { - return normal.x * pos.x + normal.y * pos.y + zadd; - }; - auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { - d_from(); serialprintPGM(pre); - DEBUG_ECHO_F(normed(pos, zadd), 6); - DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); - }; - debug_pt(PSTR("1st point: "), probe_pt[0], normal.z * z1); - debug_pt(PSTR("2nd point: "), probe_pt[1], normal.z * z2); - debug_pt(PSTR("3rd point: "), probe_pt[2], normal.z * z3); - d_from(); DEBUG_ECHOPGM("safe home with Z="); - DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_homing_xy, 0), 6); - d_from(); DEBUG_ECHOPGM("safe home with Z="); - DEBUG_ECHOLNPAIR_F("mesh value ", normed(safe_homing_xy, get_z_correction(safe_homing_xy)), 6); - DEBUG_ECHOPAIR(" Z error = (", Z_SAFE_HOMING_X_POINT, ",", Z_SAFE_HOMING_Y_POINT); - DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(safe_homing_xy), 6); - #endif - } // DEBUGGING(LEVELING) + DEBUG_DELAY(20); + } + z_values[i][j] = mz - lsf_results.D; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, z_values[i][j])); } - #endif // HAS_BED_PROBE + if (DEBUGGING(LEVELING)) { + rotation.debug(PSTR("rotation matrix:\n")); + DEBUG_ECHOPAIR_F("LSF Results A=", lsf_results.A, 7); + DEBUG_ECHOPAIR_F(" B=", lsf_results.B, 7); + DEBUG_ECHOLNPAIR_F(" D=", lsf_results.D, 7); + DEBUG_DELAY(55); - #if ENABLED(UBL_G29_P31) - void unified_bed_leveling::smart_fill_wlsf(const float &weight_factor) { + DEBUG_ECHOPAIR_F("bed plane normal = [", normal.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(normal.y, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(normal.z, 7); + DEBUG_ECHOLNPGM("]"); + DEBUG_EOL(); - // For each undefined mesh point, compute a distance-weighted least squares fit - // from all the originally populated mesh points, weighted toward the point - // being extrapolated so that nearby points will have greater influence on - // the point being extrapolated. Then extrapolate the mesh point from WLSF. + /** + * Use the code below to check the validity of the mesh tilting algorithm. + * 3-Point Mesh Tilt uses the same algorithm as grid-based tilting, but only + * three points are used in the calculation. This guarantees that each probed point + * has an exact match when get_z_correction() for that location is calculated. + * The Z error between the probed point locations and the get_z_correction() + * numbers for those locations should be 0. + */ + #ifdef VALIDATE_MESH_TILT + auto d_from = []{ DEBUG_ECHOPGM("D from "); }; + auto normed = [&](const xy_pos_t &pos, const float &zadd) { + return normal.x * pos.x + normal.y * pos.y + zadd; + }; + auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { + d_from(); serialprintPGM(pre); + DEBUG_ECHO_F(normed(pos, zadd), 6); + DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); + }; + debug_pt(PSTR("1st point: "), probe_pt[0], normal.z * z1); + debug_pt(PSTR("2nd point: "), probe_pt[1], normal.z * z2); + debug_pt(PSTR("3rd point: "), probe_pt[2], normal.z * z3); + d_from(); DEBUG_ECHOPGM("safe home with Z="); + DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_homing_xy, 0), 6); + d_from(); DEBUG_ECHOPGM("safe home with Z="); + DEBUG_ECHOLNPAIR_F("mesh value ", normed(safe_homing_xy, get_z_correction(safe_homing_xy)), 6); + DEBUG_ECHOPAIR(" Z error = (", Z_SAFE_HOMING_X_POINT, ",", Z_SAFE_HOMING_Y_POINT); + DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(safe_homing_xy), 6); + #endif + } // DEBUGGING(LEVELING) - static_assert((GRID_MAX_POINTS_Y) <= 16, "GRID_MAX_POINTS_Y too big"); - uint16_t bitmap[GRID_MAX_POINTS_X] = { 0 }; - struct linear_fit_data lsf_results; + } - SERIAL_ECHOPGM("Extrapolating mesh..."); +#endif // HAS_BED_PROBE - const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); +#if ENABLED(UBL_G29_P31) + void unified_bed_leveling::smart_fill_wlsf(const float &weight_factor) { - GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); + // For each undefined mesh point, compute a distance-weighted least squares fit + // from all the originally populated mesh points, weighted toward the point + // being extrapolated so that nearby points will have greater influence on + // the point being extrapolated. Then extrapolate the mesh point from WLSF. - xy_pos_t ppos; - LOOP_L_N(ix, GRID_MAX_POINTS_X) { - ppos.x = mesh_index_to_xpos(ix); - LOOP_L_N(iy, GRID_MAX_POINTS_Y) { - ppos.y = mesh_index_to_ypos(iy); - if (isnan(z_values[ix][iy])) { - // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. - incremental_LSF_reset(&lsf_results); - xy_pos_t rpos; - LOOP_L_N(jx, GRID_MAX_POINTS_X) { - rpos.x = mesh_index_to_xpos(jx); - LOOP_L_N(jy, GRID_MAX_POINTS_Y) { - if (TEST(bitmap[jx], jy)) { - rpos.y = mesh_index_to_ypos(jy); - const float rz = z_values[jx][jy], - w = 1.0f + weight_scaled / (rpos - ppos).magnitude(); - incremental_WLSF(&lsf_results, rpos, rz, w); - } + static_assert((GRID_MAX_POINTS_Y) <= 16, "GRID_MAX_POINTS_Y too big"); + uint16_t bitmap[GRID_MAX_POINTS_X] = { 0 }; + struct linear_fit_data lsf_results; + + SERIAL_ECHOPGM("Extrapolating mesh..."); + + const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); + + GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); + + xy_pos_t ppos; + LOOP_L_N(ix, GRID_MAX_POINTS_X) { + ppos.x = mesh_index_to_xpos(ix); + LOOP_L_N(iy, GRID_MAX_POINTS_Y) { + ppos.y = mesh_index_to_ypos(iy); + if (isnan(z_values[ix][iy])) { + // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. + incremental_LSF_reset(&lsf_results); + xy_pos_t rpos; + LOOP_L_N(jx, GRID_MAX_POINTS_X) { + rpos.x = mesh_index_to_xpos(jx); + LOOP_L_N(jy, GRID_MAX_POINTS_Y) { + if (TEST(bitmap[jx], jy)) { + rpos.y = mesh_index_to_ypos(jy); + const float rz = z_values[jx][jy], + w = 1.0f + weight_scaled / (rpos - ppos).magnitude(); + incremental_WLSF(&lsf_results, rpos, rz, w); } } - if (finish_incremental_LSF(&lsf_results)) { - SERIAL_ECHOLNPGM("Insufficient data"); - return; - } - const float ez = -lsf_results.D - lsf_results.A * ppos.x - lsf_results.B * ppos.y; - z_values[ix][iy] = ez; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, z_values[ix][iy])); - idle(); // housekeeping } + if (finish_incremental_LSF(&lsf_results)) { + SERIAL_ECHOLNPGM("Insufficient data"); + return; + } + const float ez = -lsf_results.D - lsf_results.A * ppos.x - lsf_results.B * ppos.y; + z_values[ix][iy] = ez; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, z_values[ix][iy])); + idle(); // housekeeping } } - - SERIAL_ECHOLNPGM("done"); } - #endif // UBL_G29_P31 - #if ENABLED(UBL_DEVEL_DEBUGGING) - /** - * Much of the 'What?' command can be eliminated. But until we are fully debugged, it is - * good to have the extra information. Soon... we prune this to just a few items - */ - void unified_bed_leveling::g29_what_command() { - report_state(); + SERIAL_ECHOLNPGM("done"); + } +#endif // UBL_G29_P31 - if (storage_slot == -1) - SERIAL_ECHOPGM("No Mesh Loaded."); - else - SERIAL_ECHOPAIR("Mesh ", storage_slot, " Loaded."); - SERIAL_EOL(); +#if ENABLED(UBL_DEVEL_DEBUGGING) + /** + * Much of the 'What?' command can be eliminated. But until we are fully debugged, it is + * good to have the extra information. Soon... we prune this to just a few items + */ + void unified_bed_leveling::g29_what_command() { + report_state(); + + if (storage_slot == -1) + SERIAL_ECHOPGM("No Mesh Loaded."); + else + SERIAL_ECHOPAIR("Mesh ", storage_slot, " Loaded."); + SERIAL_EOL(); + serial_delay(50); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); + #endif + + adjust_mesh_to_mean(g29_c_flag, g29_constant); + + #if HAS_BED_PROBE + SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe.offset.z, 7); + #endif + + SERIAL_ECHOLNPAIR("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MIN_Y " STRINGIFY(MESH_MIN_Y) "=", MESH_MIN_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MAX_X " STRINGIFY(MESH_MAX_X) "=", MESH_MAX_X); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MAX_Y " STRINGIFY(MESH_MAX_Y) "=", MESH_MAX_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_X ", GRID_MAX_POINTS_X); serial_delay(50); + SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_Y ", GRID_MAX_POINTS_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_X_DIST ", MESH_X_DIST); + SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); serial_delay(50); + + SERIAL_ECHOPGM("X-Axis Mesh Points at: "); + LOOP_L_N(i, GRID_MAX_POINTS_X) { + SERIAL_ECHO_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3); + SERIAL_ECHOPGM(" "); + serial_delay(25); + } + SERIAL_EOL(); + + SERIAL_ECHOPGM("Y-Axis Mesh Points at: "); + LOOP_L_N(i, GRID_MAX_POINTS_Y) { + SERIAL_ECHO_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3); + SERIAL_ECHOPGM(" "); + serial_delay(25); + } + SERIAL_EOL(); + + #if HAS_KILL + SERIAL_ECHOLNPAIR("Kill pin on :", KILL_PIN, " state:", kill_state()); + #endif + + SERIAL_EOL(); + serial_delay(50); + + #if ENABLED(UBL_DEVEL_DEBUGGING) + SERIAL_ECHOLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation, "\nubl_state_recursion_chk :", ubl_state_recursion_chk); serial_delay(50); - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); - #endif - - adjust_mesh_to_mean(g29_c_flag, g29_constant); - - #if HAS_BED_PROBE - SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe.offset.z, 7); - #endif - - SERIAL_ECHOLNPAIR("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MIN_Y " STRINGIFY(MESH_MIN_Y) "=", MESH_MIN_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MAX_X " STRINGIFY(MESH_MAX_X) "=", MESH_MAX_X); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MAX_Y " STRINGIFY(MESH_MAX_Y) "=", MESH_MAX_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_X ", GRID_MAX_POINTS_X); serial_delay(50); - SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_Y ", GRID_MAX_POINTS_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_X_DIST ", MESH_X_DIST); - SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); serial_delay(50); - - SERIAL_ECHOPGM("X-Axis Mesh Points at: "); - LOOP_L_N(i, GRID_MAX_POINTS_X) { - SERIAL_ECHO_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3); - SERIAL_ECHOPGM(" "); - serial_delay(25); - } - SERIAL_EOL(); - - SERIAL_ECHOPGM("Y-Axis Mesh Points at: "); - LOOP_L_N(i, GRID_MAX_POINTS_Y) { - SERIAL_ECHO_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3); - SERIAL_ECHOPGM(" "); - serial_delay(25); - } - SERIAL_EOL(); - - #if HAS_KILL - SERIAL_ECHOLNPAIR("Kill pin on :", KILL_PIN, " state:", kill_state()); - #endif - - SERIAL_EOL(); + SERIAL_ECHOLNPAIR("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); serial_delay(50); - #if ENABLED(UBL_DEVEL_DEBUGGING) - SERIAL_ECHOLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation, "\nubl_state_recursion_chk :", ubl_state_recursion_chk); - serial_delay(50); + SERIAL_ECHOLNPAIR("sizeof(ubl) : ", sizeof(ubl)); SERIAL_EOL(); + SERIAL_ECHOLNPAIR("z_value[][] size: ", sizeof(z_values)); SERIAL_EOL(); + serial_delay(25); - SERIAL_ECHOLNPAIR("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); - serial_delay(50); + SERIAL_ECHOLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); + serial_delay(50); - SERIAL_ECHOLNPAIR("sizeof(ubl) : ", sizeof(ubl)); SERIAL_EOL(); - SERIAL_ECHOLNPAIR("z_value[][] size: ", sizeof(z_values)); SERIAL_EOL(); - serial_delay(25); + SERIAL_ECHOLNPAIR("EEPROM can hold ", settings.calc_num_meshes(), " meshes.\n"); + serial_delay(25); + #endif // UBL_DEVEL_DEBUGGING - SERIAL_ECHOLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); - serial_delay(50); - - SERIAL_ECHOLNPAIR("EEPROM can hold ", settings.calc_num_meshes(), " meshes.\n"); - serial_delay(25); - #endif // UBL_DEVEL_DEBUGGING - - if (!sanity_check()) { - echo_name(); - SERIAL_ECHOLNPGM(" sanity checks passed."); - } + if (!sanity_check()) { + echo_name(); + SERIAL_ECHOLNPGM(" sanity checks passed."); } + } - /** - * When we are fully debugged, the EEPROM dump command will get deleted also. But - * right now, it is good to have the extra information. Soon... we prune this. - */ - void unified_bed_leveling::g29_eeprom_dump() { - uint8_t cccc; + /** + * When we are fully debugged, the EEPROM dump command will get deleted also. But + * right now, it is good to have the extra information. Soon... we prune this. + */ + void unified_bed_leveling::g29_eeprom_dump() { + uint8_t cccc; - SERIAL_ECHO_MSG("EEPROM Dump:"); - persistentStore.access_start(); - for (uint16_t i = 0; i < persistentStore.capacity(); i += 16) { - if (!(i & 0x3)) idle(); - print_hex_word(i); - SERIAL_ECHOPGM(": "); - for (uint16_t j = 0; j < 16; j++) { - persistentStore.read_data(i + j, &cccc, sizeof(uint8_t)); - print_hex_byte(cccc); - SERIAL_CHAR(' '); - } - SERIAL_EOL(); + SERIAL_ECHO_MSG("EEPROM Dump:"); + persistentStore.access_start(); + for (uint16_t i = 0; i < persistentStore.capacity(); i += 16) { + if (!(i & 0x3)) idle(); + print_hex_word(i); + SERIAL_ECHOPGM(": "); + for (uint16_t j = 0; j < 16; j++) { + persistentStore.read_data(i + j, &cccc, sizeof(uint8_t)); + print_hex_byte(cccc); + SERIAL_CHAR(' '); } SERIAL_EOL(); - persistentStore.access_finish(); + } + SERIAL_EOL(); + persistentStore.access_finish(); + } + + /** + * When we are fully debugged, this may go away. But there are some valid + * use cases for the users. So we can wait and see what to do with it. + */ + void unified_bed_leveling::g29_compare_current_mesh_to_stored_mesh() { + const int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + return; } - /** - * When we are fully debugged, this may go away. But there are some valid - * use cases for the users. So we can wait and see what to do with it. - */ - void unified_bed_leveling::g29_compare_current_mesh_to_stored_mesh() { - const int16_t a = settings.calc_num_meshes(); - - if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); - return; - } - - if (!parser.has_value() || !WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); - return; - } - - g29_storage_slot = parser.value_int(); - - float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - settings.load_mesh(g29_storage_slot, &tmp_z_values); - - SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); - - GRID_LOOP(x, y) { - z_values[x][y] -= tmp_z_values[x][y]; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } + if (!parser.has_value() || !WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + return; } - #endif // UBL_DEVEL_DEBUGGING + g29_storage_slot = parser.value_int(); + + float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + settings.load_mesh(g29_storage_slot, &tmp_z_values); + + SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); + + GRID_LOOP(x, y) { + z_values[x][y] -= tmp_z_values[x][y]; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + } + +#endif // UBL_DEVEL_DEBUGGING #endif // AUTO_BED_LEVELING_UBL From c051a2ecaeb37df8f5dd76e3feb71bdb3f7f66fc Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 24 Feb 2021 02:13:24 +0000 Subject: [PATCH 1041/1370] Fix Chiron TFT serial comms (#21152) --- Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 6 +++--- .../sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 61057b5b10..c50de1c0a1 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -292,7 +292,7 @@ namespace Anycubic { #if ACDEBUG(AC_SOME) serialprintPGM(str); #endif - while (const char c = pgm_read_byte(str++)) TFTSer.print(c); + while (const char c = pgm_read_byte(str++)) TFTSer.write(c); } void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { @@ -305,7 +305,7 @@ namespace Anycubic { SERIAL_EOL(); #endif } - TFTSer.println(""); + TFTSer.println(); } bool ChironTFT::ReadTFTCommand() { @@ -840,7 +840,7 @@ namespace Anycubic { // Ignore request if printing //if (isPrinting()) break; //injectCommands_P(PSTR("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000")); - //TFTSer.println(""); + //TFTSer.println(); } break; // A33 firmware info request seet PanelInfo() diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index 9c7b5001c0..4ab1a6b8f9 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -984,7 +984,7 @@ uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbyt //bool direction = bmReqType & 0x80; //request direction, IN or OUT uint8_t rcode = 0; - // Serial.println(""); + //Serial.println(); UHS_EpInfo *pep = ctrlReqOpen(addr, Request, dataptr); if(!pep) { HOST_DEBUG("ctrlReq1: ERROR_NULL_EPINFO addr: %d\r\n", addr); From 8d05a823e96fe43209243591739eca106296fadb Mon Sep 17 00:00:00 2001 From: Ken Sanislo Date: Wed, 24 Feb 2021 16:26:51 -0800 Subject: [PATCH 1042/1370] Chamber Heater PID (#21156) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 55 ++- Marlin/Configuration_adv.h | 17 +- Marlin/src/core/language.h | 2 +- .../src/feature/leds/printer_event_leds.cpp | 13 + Marlin/src/feature/leds/printer_event_leds.h | 7 +- Marlin/src/gcode/config/M309.cpp | 48 +++ Marlin/src/gcode/gcode.cpp | 4 + Marlin/src/gcode/gcode.h | 3 + Marlin/src/gcode/temp/M303.cpp | 37 +- Marlin/src/inc/Conditionals_post.h | 21 +- Marlin/src/inc/SanityCheck.h | 7 + Marlin/src/lcd/menu/menu_advanced.cpp | 79 ++-- Marlin/src/module/settings.cpp | 61 ++- Marlin/src/module/temperature.cpp | 380 ++++++++++-------- Marlin/src/module/temperature.h | 21 +- 15 files changed, 519 insertions(+), 236 deletions(-) create mode 100644 Marlin/src/gcode/config/M309.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 3234a73eda..1c98168236 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -447,6 +447,10 @@ #define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer #define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191 +#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + // Below this temperature the heater will be switched off // because it probably indicates a broken thermistor wire. #define HEATER_0_MINTEMP 5 @@ -458,6 +462,7 @@ #define HEATER_6_MINTEMP 5 #define HEATER_7_MINTEMP 5 #define BED_MINTEMP 5 +#define CHAMBER_MINTEMP 5 // Above this temperature the heater will be switched off. // This can protect components from overheating, but NOT from shorts and failures. @@ -471,6 +476,7 @@ #define HEATER_6_MAXTEMP 275 #define HEATER_7_MAXTEMP 275 #define BED_MAXTEMP 150 +#define CHAMBER_MAXTEMP 60 //=========================================================================== //============================= PID Settings ================================ @@ -544,7 +550,52 @@ // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. #endif // PIDTEMPBED -#if EITHER(PIDTEMP, PIDTEMPBED) +//=========================================================================== +//==================== PID > Chamber Temperature Control ==================== +//=========================================================================== + +/** + * PID Chamber Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and CHAMBER_LIMIT_SWITCHING will enable + * hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 200W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use chamber PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPCHAMBER + +//#define CHAMBER_LIMIT_SWITCHING + +/** + * Max Chamber Power + * Applies to all forms of chamber control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the chamber heater that acts like a divider + * so don't use it unless you are OK with PWM on your heater. (See the comment on enabling PIDTEMPCHAMBER) + */ +#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current + +#if ENABLED(PIDTEMPCHAMBER) + #define MIN_CHAMBER_POWER 0 + //#define PID_CHAMBER_DEBUG // Sends debug data to the serial port. + + // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element + // and placed inside the small Creality printer enclosure tent. + // + #define DEFAULT_chamberKp 37.04 + #define DEFAULT_chamberKi 1.40 + #define DEFAULT_chamberKd 655.17 + // M309 P37.04 I1.04 D655.17 + + // FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles. +#endif // PIDTEMPCHAMBER + +#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) //#define PID_DEBUG // Sends debug data to the serial port. Use 'M303 D' to toggle activation. //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay @@ -1624,11 +1675,13 @@ #define PREHEAT_1_LABEL "PLA" #define PREHEAT_1_TEMP_HOTEND 180 #define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_TEMP_CHAMBER 35 #define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 #define PREHEAT_2_LABEL "ABS" #define PREHEAT_2_TEMP_HOTEND 240 #define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_TEMP_CHAMBER 35 #define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 /** diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 987ac293b2..50f17d1b9e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -143,12 +143,19 @@ // // Heated Chamber options // +#if DISABLED(PIDTEMPCHAMBER) + #define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #if ENABLED(CHAMBER_LIMIT_SWITCHING) + #define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS + #endif +#endif + #if TEMP_SENSOR_CHAMBER - #define CHAMBER_MINTEMP 5 - #define CHAMBER_MAXTEMP 60 - #define TEMP_CHAMBER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target - //#define CHAMBER_LIMIT_SWITCHING - //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin + // Make sure you define where your heater is connected, the following works on a BTT SKR 1.4 Turbo + // using the secondary tool heater output. (FAN1 by default). + //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (SKR 1.4 Turbo specific) + //#define HEATER_CHAMBER_PIN P2_04 // Chamber heater on/off pin (HE1 connector on SKR 1.4 Turbo) + //#define HEATER_CHAMBER_INVERTING false //#define CHAMBER_FAN // Enable a fan on the chamber diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 923ad903cb..6024e9be3e 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -221,7 +221,7 @@ // temperature.cpp strings #define STR_PID_AUTOTUNE_START "PID Autotune start" -#define STR_PID_BAD_EXTRUDER_NUM "PID Autotune failed! Bad extruder number" +#define STR_PID_BAD_HEATER_ID "PID Autotune failed! Bad heater id" #define STR_PID_TEMP_TOO_HIGH "PID Autotune failed! Temperature too high" #define STR_PID_TIMEOUT "PID Autotune failed! timeout" #define STR_BIAS " bias: " diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index 3a6b91a258..32c6862704 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -77,6 +77,19 @@ PrinterEventLEDs printerEventLEDs; pel_set_rgb(red, 0, 255); } } + +#endif + +#if HAS_HEATED_CHAMBER + + void PrinterEventLEDs::onChamberHeating(const float &start, const float ¤t, const float &target) { + const uint8_t green = pel_intensity(start, current, target); + if (green != old_intensity) { + old_intensity = green; + pel_set_rgb(255, green, 255); + } + } + #endif #endif // PRINTER_EVENT_LEDS diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index 86ec292aa3..668c9c969b 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -55,7 +55,12 @@ public: static void onBedHeating(const float &start, const float ¤t, const float &target); #endif - #if HAS_TEMP_HOTEND || HAS_HEATED_BED + #if HAS_HEATED_CHAMBER + static inline LEDColor onChamberHeatingStart() { old_intensity = 127; return leds.get_color(); } + static void onChamberHeating(const float &start, const float ¤t, const float &target); + #endif + + #if HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER static inline void onHeatingDone() { leds.set_white(); } static inline void onPidTuningDone(LEDColor c) { leds.set_color(c); } #endif diff --git a/Marlin/src/gcode/config/M309.cpp b/Marlin/src/gcode/config/M309.cpp new file mode 100644 index 0000000000..2247481b25 --- /dev/null +++ b/Marlin/src/gcode/config/M309.cpp @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PIDTEMPCHAMBER) + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M309 - Set and/or Report the current Chamber PID values + * + * P - Set the P value + * I - Set the I value + * D - Set the D value + */ +void GcodeSuite::M309() { + if (parser.seen('P')) thermalManager.temp_chamber.pid.Kp = parser.value_float(); + if (parser.seen('I')) thermalManager.temp_chamber.pid.Ki = scalePID_i(parser.value_float()); + if (parser.seen('D')) thermalManager.temp_chamber.pid.Kd = scalePID_d(parser.value_float()); + + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(" p:", thermalManager.temp_chamber.pid.Kp, + " i:", unscalePID_i(thermalManager.temp_chamber.pid.Ki), + " d:", unscalePID_d(thermalManager.temp_chamber.pid.Kd)); +} + +#endif // PIDTEMPCHAMBER diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 77ac1fbff8..a410ad90a4 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -682,6 +682,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 304: M304(); break; // M304: Set bed PID parameters #endif + #if ENABLED(PIDTEMPCHAMBER) + case 309: M309(); break; // M309: Set chamber PID parameters + #endif + #if ENABLED(PHOTO_GCODE) case 240: M240(); break; // M240: Trigger a camera #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7fd8d6904a..123b648f90 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -197,6 +197,7 @@ * M303 - PID relay autotune S sets the target temperature. Default 150C. (Requires PIDTEMP) * M304 - Set bed PID parameters P I and D. (Requires PIDTEMPBED) * M305 - Set user thermistor parameters R T and P. (Requires TEMP_SENSOR_x 1000) + * M309 - Set chamber PID parameters P I and D. (Requires PIDTEMPCHAMBER) * M350 - Set microstepping mode. (Requires digital microstepping pins.) * M351 - Toggle MS1 MS2 pins directly. (Requires digital microstepping pins.) * M355 - Set Case Light on/off and set brightness. (Requires CASE_LIGHT_PIN) @@ -711,6 +712,8 @@ private: TERN_(HAS_USER_THERMISTORS, static void M305()); + TERN_(PIDTEMPCHAMBER, static void M309()); + #if HAS_MICROSTEPS static void M350(); static void M351(); diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index a066ddc88d..159a52bf26 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -40,19 +40,15 @@ * C Number of times to repeat the procedure. (Minimum: 3, Default: 5) * U Flag to apply the result to the current PID values * - * With PID_DEBUG: + * With PID_DEBUG, PID_BED_DEBUG, or PID_CHAMBER_DEBUG: * D Toggle PID debugging and EXIT without further action. */ -#if ENABLED(PID_DEBUG) - bool pid_debug_flag = 0; -#endif - void GcodeSuite::M303() { - #if ENABLED(PID_DEBUG) + #if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) if (parser.seen('D')) { - pid_debug_flag = !pid_debug_flag; + thermalManager.pid_debug_flag ^= true; SERIAL_ECHO_START(); SERIAL_ECHOPGM("PID Debug "); serialprintln_onoff(pid_debug_flag); @@ -60,25 +56,34 @@ void GcodeSuite::M303() { } #endif - #define SI TERN(PIDTEMPBED, H_BED, H_E0) - #define EI TERN(PIDTEMP, HOTENDS - 1, H_BED) - const heater_id_t e = (heater_id_t)parser.intval('E'); - if (!WITHIN(e, SI, EI)) { - SERIAL_ECHOLNPGM(STR_PID_BAD_EXTRUDER_NUM); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_EXTRUDER_NUM)); - return; + const heater_id_t hid = (heater_id_t)parser.intval('E'); + int16_t default_temp; + switch (hid) { + #if ENABLED(PIDTEMP) + case 0 ... HOTENDS - 1: default_temp = PREHEAT_1_TEMP_HOTEND; break; + #endif + #if ENABLED(PIDTEMPBED) + case H_BED: default_temp = PREHEAT_1_TEMP_BED; break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case H_CHAMBER: default_temp = PREHEAT_1_TEMP_CHAMBER; break; + #endif + default: + SERIAL_ECHOLNPGM(STR_PID_BAD_HEATER_ID); + TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_EXTRUDER_NUM)); + return; } + const int16_t temp = parser.celsiusval('S', default_temp); const int c = parser.intval('C', 5); const bool u = parser.boolval('U'); - const int16_t temp = parser.celsiusval('S', e < 0 ? PREHEAT_1_TEMP_BED : PREHEAT_1_TEMP_HOTEND); #if DISABLED(BUSY_WHILE_HEATING) KEEPALIVE_STATE(NOT_BUSY); #endif LCD_MESSAGEPGM(MSG_PID_AUTOTUNE); - thermalManager.PID_autotune(temp, e, c, u); + thermalManager.PID_autotune(temp, hid, c, u); ui.reset_status(); } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index f8360767d9..585d48de8c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1992,27 +1992,31 @@ #define BED_OVERSHOOT 10 #endif #define BED_MAX_TARGET (BED_MAXTEMP - (BED_OVERSHOOT)) +#else + #undef PIDTEMPBED #endif + #if HAS_HEATED_BED || HAS_TEMP_CHAMBER #define BED_OR_CHAMBER 1 #endif #if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE #define HAS_TEMP_SENSOR 1 #endif + #if HAS_TEMP_CHAMBER && PIN_EXISTS(HEATER_CHAMBER) #define HAS_HEATED_CHAMBER 1 + #ifndef CHAMBER_OVERSHOOT + #define CHAMBER_OVERSHOOT 10 + #endif + #define CHAMBER_MAX_TARGET (CHAMBER_MAXTEMP - (CHAMBER_OVERSHOOT)) +#else + #undef PIDTEMPCHAMBER #endif // PID heating -#if !HAS_HEATED_BED - #undef PIDTEMPBED -#endif -#if EITHER(PIDTEMP, PIDTEMPBED) +#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) #define HAS_PID_HEATING 1 #endif -#if BOTH(PIDTEMP, PIDTEMPBED) - #define HAS_PID_FOR_BOTH 1 -#endif // Thermal protection #if BOTH(HAS_HEATED_BED, THERMAL_PROTECTION_BED) @@ -2346,6 +2350,9 @@ * Heated chamber requires settings */ #if HAS_HEATED_CHAMBER + #ifndef MIN_CHAMBER_POWER + #define MIN_CHAMBER_POWER 0 + #endif #ifndef MAX_CHAMBER_POWER #define MAX_CHAMBER_POWER 255 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c1b0290ac1..ba69b4792e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1203,6 +1203,13 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED." #endif +/** + * Chamber Heating Options - PID vs Limit Switching + */ +#if BOTH(PIDTEMPCHAMBER, CHAMBER_LIMIT_SWITCHING) + #error "To use CHAMBER_LIMIT_SWITCHING you must disable PIDTEMPCHAMBER." +#endif + /** * Kinematics */ diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index cb7827168b..aab93c3bdd 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -177,18 +177,25 @@ void menu_backlash(); #if ENABLED(PIDTEMPBED) int16_t autotune_temp_bed = PREHEAT_1_TEMP_BED; #endif + #if ENABLED(PIDTEMPCHAMBER) + int16_t autotune_temp_chamber = PREHEAT_1_TEMP_CHAMBER; + #endif #include "../../gcode/queue.h" - void _lcd_autotune(const int16_t e) { + void _lcd_autotune(const heater_id_t hid) { char cmd[30]; - sprintf_P(cmd, PSTR("M303 U1 E%i S%i"), e, - #if HAS_PID_FOR_BOTH - e < 0 ? autotune_temp_bed : autotune_temp[e] - #else - TERN(PIDTEMPBED, autotune_temp_bed, autotune_temp[e]) + int16_t tune_temp; + switch (hid) { + #if ENABLED(PIDTEMPBED) + case H_BED: tune_temp = autotune_temp_bed; break; #endif - ); + #if ENABLED(PIDTEMPCHAMBER) + case H_CHAMBER: tune_temp = autotune_temp_chamber; break; + #endif + default: tune_temp = autotune_temp[hid]; break; + } + sprintf_P(cmd, PSTR("M303 U1 E%i S%i"), hid, tune_temp); queue.inject(cmd); ui.return_to_status(); } @@ -225,7 +232,7 @@ void menu_backlash(); #if ENABLED(PID_AUTOTUNE_MENU) #define DEFINE_PIDTEMP_FUNCS(N) \ _DEFINE_PIDTEMP_BASE_FUNCS(N); \ - void lcd_autotune_callback_E##N() { _lcd_autotune(N); } + void lcd_autotune_callback_E##N() { _lcd_autotune(heater_id_t(N)); } #else #define DEFINE_PIDTEMP_FUNCS(N) _DEFINE_PIDTEMP_BASE_FUNCS(N); #endif @@ -269,56 +276,70 @@ void menu_backlash(); // #if ENABLED(PID_EDIT_MENU) - #define __PID_BASE_MENU_ITEMS(N) \ - raw_Ki = unscalePID_i(TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Ki, PID_PARAM(Ki, N))); \ - raw_Kd = unscalePID_d(TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kd, PID_PARAM(Kd, N))); \ - EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kp, PID_PARAM(Kp, N)), 1, 9990); \ + #define _PID_EDIT_ITEMS_TMPL(N,T) \ + raw_Ki = unscalePID_i(T.pid.Ki); \ + raw_Kd = unscalePID_d(T.pid.Kd); \ + EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &T.pid.Kp, 1, 9990); \ + EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \ + EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); }) + + #define __PID_HOTEND_MENU_ITEMS(N) \ + raw_Ki = unscalePID_i(PID_PARAM(Ki, N)); \ + raw_Kd = unscalePID_d(PID_PARAM(Kd, N)); \ + EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &PID_PARAM(Kp, N), 1, 9990); \ EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \ EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); }) #if ENABLED(PID_EXTRUSION_SCALING) - #define _PID_BASE_MENU_ITEMS(N) \ - __PID_BASE_MENU_ITEMS(N); \ + #define _PID_HOTEND_MENU_ITEMS(N) \ + __PID_HOTEND_MENU_ITEMS(N); \ EDIT_ITEM_N(float4, N, MSG_PID_C_E, &PID_PARAM(Kc, N), 1, 9990) #else - #define _PID_BASE_MENU_ITEMS(N) __PID_BASE_MENU_ITEMS(N) + #define _PID_HOTEND_MENU_ITEMS(N) __PID_HOTEND_MENU_ITEMS(N) #endif #if ENABLED(PID_FAN_SCALING) - #define _PID_EDIT_MENU_ITEMS(N) \ - _PID_BASE_MENU_ITEMS(N); \ + #define _HOTEND_PID_EDIT_MENU_ITEMS(N) \ + _PID_HOTEND_MENU_ITEMS(N); \ EDIT_ITEM_N(float4, N, MSG_PID_F_E, &PID_PARAM(Kf, N), 1, 9990) #else - #define _PID_EDIT_MENU_ITEMS(N) _PID_BASE_MENU_ITEMS(N) + #define _HOTEND_PID_EDIT_MENU_ITEMS(N) _PID_HOTEND_MENU_ITEMS(N) #endif #else - #define _PID_EDIT_MENU_ITEMS(N) NOOP + #define _HOTEND_PID_EDIT_MENU_ITEMS(N) NOOP #endif #if ENABLED(PID_AUTOTUNE_MENU) - #define PID_EDIT_MENU_ITEMS(N) \ - _PID_EDIT_MENU_ITEMS(N); \ - EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.heater_maxtemp[N] - HOTEND_OVERSHOOT, []{ _lcd_autotune(MenuItemBase::itemIndex); }); + #define HOTEND_PID_EDIT_MENU_ITEMS(N) \ + _HOTEND_PID_EDIT_MENU_ITEMS(N); \ + EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.heater_maxtemp[N] - HOTEND_OVERSHOOT, []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); }); #else - #define PID_EDIT_MENU_ITEMS(N) _PID_EDIT_MENU_ITEMS(N); + #define HOTEND_PID_EDIT_MENU_ITEMS(N) _HOTEND_PID_EDIT_MENU_ITEMS(N); #endif - PID_EDIT_MENU_ITEMS(0); + HOTEND_PID_EDIT_MENU_ITEMS(0); #if ENABLED(PID_PARAMS_PER_HOTEND) - REPEAT_S(1, HOTENDS, PID_EDIT_MENU_ITEMS) + REPEAT_S(1, HOTENDS, HOTEND_PID_EDIT_MENU_ITEMS) #endif #if ENABLED(PIDTEMPBED) #if ENABLED(PID_EDIT_MENU) - #define PID_BED_MENU_SECTION - __PID_BASE_MENU_ITEMS(-1); - #undef PID_BED_MENU_SECTION + _PID_EDIT_ITEMS_TMPL(H_BED, thermalManager.temp_bed); #endif #if ENABLED(PID_AUTOTUNE_MENU) - EDIT_ITEM_FAST_N(int3, -1, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAX_TARGET, []{ _lcd_autotune(-1); }); + EDIT_ITEM_FAST_N(int3, H_BED, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAX_TARGET, []{ _lcd_autotune(H_BED); }); + #endif + #endif + + #if ENABLED(PIDTEMPCHAMBER) + #if ENABLED(PID_EDIT_MENU) + _PID_EDIT_ITEMS_TMPL(H_CHAMBER, thermalManager.temp_chamber); + #endif + #if ENABLED(PID_AUTOTUNE_MENU) + EDIT_ITEM_FAST_N(int3, H_CHAMBER, MSG_PID_AUTOTUNE_E, &autotune_temp_chamber, PREHEAT_1_TEMP_CHAMBER, CHAMBER_MAX_TARGET, []{ _lcd_autotune(H_CHAMBER); }); #endif #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 7fb378191e..f4b4bf0b8b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -318,6 +318,11 @@ typedef struct SettingsDataStruct { // PID_t bedPID; // M304 PID / M303 E-1 U + // + // PIDTEMPCHAMBER + // + PID_t chamberPID; // M309 PID / M303 E-2 U + // // User-defined Thermistors // @@ -926,6 +931,25 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(bed_pid); } + // + // PIDTEMPCHAMBER + // + { + _FIELD_TEST(chamberPID); + + const PID_t chamber_pid = { + #if DISABLED(PIDTEMPCHAMBER) + NAN, NAN, NAN + #else + // Store the unscaled PID values + thermalManager.temp_chamber.pid.Kp, + unscalePID_i(thermalManager.temp_chamber.pid.Ki), + unscalePID_d(thermalManager.temp_chamber.pid.Kd) + #endif + }; + EEPROM_WRITE(chamber_pid); + } + // // User-defined Thermistors // @@ -1787,6 +1811,22 @@ void MarlinSettings::postprocess() { #endif } + // + // Heated Chamber PID + // + { + PID_t pid; + EEPROM_READ(pid); + #if ENABLED(PIDTEMPCHAMBER) + if (!validating && !isnan(pid.Kp)) { + // Scale PID values since EEPROM values are unscaled + thermalManager.temp_chamber.pid.Kp = pid.Kp; + thermalManager.temp_chamber.pid.Ki = scalePID_i(pid.Ki); + thermalManager.temp_chamber.pid.Kd = scalePID_d(pid.Kd); + } + #endif + } + // // User-defined Thermistors // @@ -2811,6 +2851,16 @@ void MarlinSettings::reset() { thermalManager.temp_bed.pid.Kd = scalePID_d(DEFAULT_bedKd); #endif + // + // Heated Chamber PID + // + + #if ENABLED(PIDTEMPCHAMBER) + thermalManager.temp_chamber.pid.Kp = DEFAULT_chamberKp; + thermalManager.temp_chamber.pid.Ki = scalePID_i(DEFAULT_chamberKi); + thermalManager.temp_chamber.pid.Kd = scalePID_d(DEFAULT_chamberKd); + #endif + // // User-Defined Thermistors // @@ -3386,7 +3436,16 @@ void MarlinSettings::reset() { ); #endif - #endif // PIDTEMP || PIDTEMPBED + #if ENABLED(PIDTEMPCHAMBER) + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR( + " M309 P", thermalManager.temp_chamber.pid.Kp + , " I", unscalePID_i(thermalManager.temp_chamber.pid.Ki) + , " D", unscalePID_d(thermalManager.temp_chamber.pid.Kd) + ); + #endif + + #endif // PIDTEMP || PIDTEMPBED || PIDTEMPCHAMBER #if HAS_USER_THERMISTORS CONFIG_ECHO_HEADING("User thermistors:"); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index edd76df3b7..58b0a965c9 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -371,10 +371,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #ifdef CHAMBER_MAXTEMP int16_t Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; #endif - #if WATCH_CHAMBER - chamber_watch_t Temperature::watch_chamber{0}; - #endif - millis_t Temperature::next_chamber_check_ms; + TERN_(WATCH_CHAMBER, chamber_watch_t Temperature::watch_chamber{0}); + IF_DISABLED(PIDTEMPCHAMBER, millis_t Temperature::next_chamber_check_ms); #endif // HAS_HEATED_CHAMBER #endif // HAS_TEMP_CHAMBER @@ -382,11 +380,6 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, probe_info_t Temperature::temp_probe; // = { 0 } #endif -// Initialized by settings.load() -#if ENABLED(PIDTEMP) - //hotend_pid_t Temperature::pid[HOTENDS]; -#endif - #if ENABLED(PREVENT_COLD_EXTRUSION) bool Temperature::allow_cold_extrude = false; int16_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP; @@ -485,41 +478,44 @@ volatile bool Temperature::raw_temps_ready = false; millis_t next_temp_ms = millis(), t1 = next_temp_ms, t2 = next_temp_ms; long t_high = 0, t_low = 0; - long bias, d; PID_t tune_pid = { 0, 0, 0 }; float maxT = 0, minT = 10000; const bool isbed = (heater_id == H_BED); + const bool ischamber = (heater_id == H_CHAMBER); - #if HAS_PID_FOR_BOTH - #define GHV(B,H) (isbed ? (B) : (H)) - #define SHV(B,H) do{ if (isbed) temp_bed.soft_pwm_amount = B; else temp_hotend[heater_id].soft_pwm_amount = H; }while(0) - #define ONHEATINGSTART() (isbed ? printerEventLEDs.onBedHeatingStart() : printerEventLEDs.onHotendHeatingStart()) - #define ONHEATING(S,C,T) (isbed ? printerEventLEDs.onBedHeating(S,C,T) : printerEventLEDs.onHotendHeating(S,C,T)) - #elif ENABLED(PIDTEMPBED) - #define GHV(B,H) B - #define SHV(B,H) (temp_bed.soft_pwm_amount = B) - #define ONHEATINGSTART() printerEventLEDs.onBedHeatingStart() - #define ONHEATING(S,C,T) printerEventLEDs.onBedHeating(S,C,T) + #if ENABLED(PIDTEMPCHAMBER) + #define C_TERN(T,A,B) ((T) ? (A) : (B)) #else - #define GHV(B,H) H - #define SHV(B,H) (temp_hotend[heater_id].soft_pwm_amount = H) - #define ONHEATINGSTART() printerEventLEDs.onHotendHeatingStart() - #define ONHEATING(S,C,T) printerEventLEDs.onHotendHeating(S,C,T) + #define C_TERN(T,A,B) (B) #endif - #define WATCH_PID BOTH(WATCH_BED, PIDTEMPBED) || BOTH(WATCH_HOTENDS, PIDTEMP) + #if ENABLED(PIDTEMPBED) + #define B_TERN(T,A,B) ((T) ? (A) : (B)) + #else + #define B_TERN(T,A,B) (B) + #endif + #define GHV(C,B,H) C_TERN(ischamber, C, B_TERN(isbed, B, H)) + #define SHV(V) C_TERN(ischamber, temp_chamber.soft_pwm_amount = V, B_TERN(isbed, temp_bed.soft_pwm_amount = V, temp_hotend[heater_id].soft_pwm_amount = V)) + #define ONHEATINGSTART() C_TERN(ischamber, printerEventLEDs.onChamberHeatingStart(), B_TERN(isbed, printerEventLEDs.onBedHeatingStart(), printerEventLEDs.onHotendHeatingStart())) + #define ONHEATING(S,C,T) C_TERN(ischamber, printerEventLEDs.onChamberHeating(S,C,T), B_TERN(isbed, printerEventLEDs.onBedHeating(S,C,T), printerEventLEDs.onHotendHeating(S,C,T))) + + #define WATCH_PID BOTH(WATCH_CHAMBER, PIDTEMPCHAMBER) || BOTH(WATCH_BED, PIDTEMPBED) || BOTH(WATCH_HOTENDS, PIDTEMP) #if WATCH_PID - #if ALL(THERMAL_PROTECTION_HOTENDS, PIDTEMP, THERMAL_PROTECTION_BED, PIDTEMPBED) - #define GTV(B,H) (isbed ? (B) : (H)) - #elif BOTH(THERMAL_PROTECTION_HOTENDS, PIDTEMP) - #define GTV(B,H) (H) + #if BOTH(THERMAL_PROTECTION_CHAMBER, PIDTEMPCHAMBER) + #define C_GTV(T,A,B) ((T) ? (A) : (B)) #else - #define GTV(B,H) (B) + #define C_GTV(T,A,B) (B) #endif - const uint16_t watch_temp_period = GTV(WATCH_BED_TEMP_PERIOD, WATCH_TEMP_PERIOD); - const uint8_t watch_temp_increase = GTV(WATCH_BED_TEMP_INCREASE, WATCH_TEMP_INCREASE); - const float watch_temp_target = target - float(watch_temp_increase + GTV(TEMP_BED_HYSTERESIS, TEMP_HYSTERESIS) + 1); + #if BOTH(THERMAL_PROTECTION_BED, PIDTEMPBED) + #define B_GTV(T,A,B) ((T) ? (A) : (B)) + #else + #define B_GTV(T,A,B) (B) + #endif + #define GTV(C,B,H) C_GTV(ischamber, C, B_GTV(isbed, B, H)) + const uint16_t watch_temp_period = GTV(WATCH_CHAMBER_TEMP_PERIOD, WATCH_BED_TEMP_PERIOD, WATCH_TEMP_PERIOD); + const uint8_t watch_temp_increase = GTV(WATCH_CHAMBER_TEMP_INCREASE, WATCH_BED_TEMP_INCREASE, WATCH_TEMP_INCREASE); + const float watch_temp_target = target - float(watch_temp_increase + GTV(TEMP_CHAMBER_HYSTERESIS, TEMP_BED_HYSTERESIS, TEMP_HYSTERESIS) + 1); millis_t temp_change_ms = next_temp_ms + SEC_TO_MS(watch_temp_period); float next_watch_temp = 0.0; bool heated = false; @@ -527,7 +523,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_AUTO_FAN, next_auto_fan_check_ms = next_temp_ms + 2500UL); - if (target > GHV(BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { + if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); return; @@ -538,10 +534,11 @@ volatile bool Temperature::raw_temps_ready = false; disable_all_heaters(); TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); - SHV(bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1); + long bias = GHV(MAX_CHAMBER_POWER, MAX_BED_POWER, PID_MAX) >> 1, d = bias; + SHV(bias); #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); + const float start_temp = GHV(temp_chamber.celsius, temp_bed.celsius, temp_hotend[heater_id].celsius); LEDColor color = ONHEATINGSTART(); #endif @@ -557,7 +554,7 @@ volatile bool Temperature::raw_temps_ready = false; updateTemperaturesFromRawValues(); // Get the current temperature and constrain it - current_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); + current_temp = GHV(temp_chamber.celsius, temp_bed.celsius, temp_hotend[heater_id].celsius); NOLESS(maxT, current_temp); NOMORE(minT, current_temp); @@ -572,67 +569,46 @@ volatile bool Temperature::raw_temps_ready = false; } #endif - if (heating && current_temp > target) { - if (ELAPSED(ms, t2 + 5000UL)) { - heating = false; - SHV((bias - d) >> 1, (bias - d) >> 1); - t1 = ms; - t_high = t1 - t2; - maxT = target; - } + if (heating && current_temp > target && ELAPSED(ms, t2 + 5000UL)) { + heating = false; + SHV((bias - d) >> 1); + t1 = ms; + t_high = t1 - t2; + maxT = target; } - if (!heating && current_temp < target) { - if (ELAPSED(ms, t1 + 5000UL)) { - heating = true; - t2 = ms; - t_low = t2 - t1; - if (cycles > 0) { - const long max_pow = GHV(MAX_BED_POWER, PID_MAX); - bias += (d * (t_high - t_low)) / (t_low + t_high); - LIMIT(bias, 20, max_pow - 20); - d = (bias > max_pow >> 1) ? max_pow - 1 - bias : bias; + if (!heating && current_temp < target && ELAPSED(ms, t1 + 5000UL)) { + heating = true; + t2 = ms; + t_low = t2 - t1; + if (cycles > 0) { + const long max_pow = GHV(MAX_CHAMBER_POWER, MAX_BED_POWER, PID_MAX); + bias += (d * (t_high - t_low)) / (t_low + t_high); + LIMIT(bias, 20, max_pow - 20); + d = (bias > max_pow >> 1) ? max_pow - 1 - bias : bias; - SERIAL_ECHOPAIR(STR_BIAS, bias, STR_D_COLON, d, STR_T_MIN, minT, STR_T_MAX, maxT); - if (cycles > 2) { - const float Ku = (4.0f * d) / (float(M_PI) * (maxT - minT) * 0.5f), - Tu = float(t_low + t_high) * 0.001f, - pf = isbed ? 0.2f : 0.6f, - df = isbed ? 1.0f / 3.0f : 1.0f / 8.0f; + SERIAL_ECHOPAIR(STR_BIAS, bias, STR_D_COLON, d, STR_T_MIN, minT, STR_T_MAX, maxT); + if (cycles > 2) { + const float Ku = (4.0f * d) / (float(M_PI) * (maxT - minT) * 0.5f), + Tu = float(t_low + t_high) * 0.001f, + pf = ischamber ? 0.2f : (isbed ? 0.2f : 0.6f), + df = ischamber ? 1.0f / 3.0f : (isbed ? 1.0f / 3.0f : 1.0f / 8.0f); - SERIAL_ECHOPAIR(STR_KU, Ku, STR_TU, Tu); - if (isbed) { // Do not remove this otherwise PID autotune won't work right for the bed! - tune_pid.Kp = Ku * 0.2f; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOLNPGM("\n" " No overshoot"); // Works far better for the bed. Classic and some have bad ringing. - SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); - } - else { - tune_pid.Kp = Ku * pf; - tune_pid.Kd = tune_pid.Kp * Tu * df; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - SERIAL_ECHOLNPGM("\n" STR_CLASSIC_PID); - SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); - } + tune_pid.Kp = Ku * pf; + tune_pid.Ki = tune_pid.Kp * 2.0f / Tu; + tune_pid.Kd = tune_pid.Kp * Tu * df; - /** - tune_pid.Kp = 0.33 * Ku; - tune_pid.Ki = tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOLNPGM(" Some overshoot"); - SERIAL_ECHOLNPAIR(" Kp: ", tune_pid.Kp, " Ki: ", tune_pid.Ki, " Kd: ", tune_pid.Kd, " No overshoot"); - tune_pid.Kp = 0.2 * Ku; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOPAIR(" Kp: ", tune_pid.Kp, " Ki: ", tune_pid.Ki, " Kd: ", tune_pid.Kd); - */ - } + SERIAL_ECHOLNPAIR(STR_KU, Ku, STR_TU, Tu); + if (ischamber || isbed) + SERIAL_ECHOLNPGM(" No overshoot"); + else + SERIAL_ECHOLNPGM(STR_CLASSIC_PID); + SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); } - SHV((bias + d) >> 1, (bias + d) >> 1); - cycles++; - minT = target; } + SHV((bias + d) >> 1); + cycles++; + minT = target; } } @@ -649,14 +625,14 @@ volatile bool Temperature::raw_temps_ready = false; // Report heater states every 2 seconds if (ELAPSED(ms, next_temp_ms)) { #if HAS_TEMP_SENSOR - print_heater_states(isbed ? active_extruder : heater_id); + print_heater_states(ischamber ? active_extruder : (isbed ? active_extruder : heater_id)); SERIAL_EOL(); #endif next_temp_ms = ms + 2000UL; // Make sure heating is actually working #if WATCH_PID - if (BOTH(WATCH_BED, WATCH_HOTENDS) || isbed == DISABLED(WATCH_HOTENDS)) { + if (BOTH(WATCH_BED, WATCH_HOTENDS) || isbed == DISABLED(WATCH_HOTENDS) || ischamber == DISABLED(WATCH_HOTENDS)) { if (!heated) { // If not yet reached target... if (current_temp > next_watch_temp) { // Over the watch temp? next_watch_temp = current_temp + watch_temp_increase; // - set the next temp to watch for @@ -686,43 +662,47 @@ volatile bool Temperature::raw_temps_ready = false; if (cycles > ncycles && cycles > 2) { SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_FINISHED); - #if HAS_PID_FOR_BOTH - const char * const estring = GHV(PSTR("bed"), NUL_STR); + #if EITHER(PIDTEMPBED, PIDTEMPCHAMBER) + PGM_P const estring = GHV(PSTR("chamber"), PSTR("bed"), NUL_STR); say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); - #elif ENABLED(PIDTEMP) + #else say_default_(); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); say_default_(); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); say_default_(); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); - #else - say_default_(); SERIAL_ECHOLNPAIR("bedKp ", tune_pid.Kp); - say_default_(); SERIAL_ECHOLNPAIR("bedKi ", tune_pid.Ki); - say_default_(); SERIAL_ECHOLNPAIR("bedKd ", tune_pid.Kd); #endif - #define _SET_BED_PID() do { \ - temp_bed.pid.Kp = tune_pid.Kp; \ - temp_bed.pid.Ki = scalePID_i(tune_pid.Ki); \ - temp_bed.pid.Kd = scalePID_d(tune_pid.Kd); \ - }while(0) + auto _set_hotend_pid = [](const uint8_t e, const PID_t &in_pid) { + #if ENABLED(PIDTEMP) + PID_PARAM(Kp, e) = in_pid.Kp; + PID_PARAM(Ki, e) = scalePID_i(in_pid.Ki); + PID_PARAM(Kd, e) = scalePID_d(in_pid.Kd); + updatePID(); + #else + UNUSED(e); UNUSED(in_pid); + #endif + }; - #define _SET_EXTRUDER_PID() do { \ - PID_PARAM(Kp, heater_id) = tune_pid.Kp; \ - PID_PARAM(Ki, heater_id) = scalePID_i(tune_pid.Ki); \ - PID_PARAM(Kd, heater_id) = scalePID_d(tune_pid.Kd); \ - updatePID(); }while(0) + #if ENABLED(PIDTEMPBED) + auto _set_bed_pid = [](const PID_t &in_pid) { + temp_bed.pid.Kp = in_pid.Kp; + temp_bed.pid.Ki = scalePID_i(in_pid.Ki); + temp_bed.pid.Kd = scalePID_d(in_pid.Kd); + }; + #endif + + #if ENABLED(PIDTEMPCHAMBER) + auto _set_chamber_pid = [](const PID_t &in_pid) { + temp_chamber.pid.Kp = in_pid.Kp; + temp_chamber.pid.Ki = scalePID_i(in_pid.Ki); + temp_chamber.pid.Kd = scalePID_d(in_pid.Kd); + }; + #endif // Use the result? (As with "M303 U1") - if (set_result) { - #if HAS_PID_FOR_BOTH - if (isbed) _SET_BED_PID(); else _SET_EXTRUDER_PID(); - #elif ENABLED(PIDTEMP) - _SET_EXTRUDER_PID(); - #else - _SET_BED_PID(); - #endif - } + if (set_result) + GHV(_set_chamber_pid(tune_pid), _set_bed_pid(tune_pid), _set_hotend_pid(heater_id, tune_pid)); TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(color)); @@ -939,10 +919,11 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { _temp_error(heater_id, PSTR(STR_T_MINTEMP), GET_TEXT(MSG_ERR_MINTEMP)); } +#if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) + bool Temperature::pid_debug_flag; // = 0 +#endif + #if HAS_HOTEND - #if ENABLED(PID_DEBUG) - extern bool pid_debug_flag; - #endif float Temperature::get_pid_output_hotend(const uint8_t E_NAME) { const uint8_t ee = HOTEND_INDEX; @@ -1023,23 +1004,18 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { #if ENABLED(PID_DEBUG) if (ee == active_extruder && pid_debug_flag) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(STR_PID_DEBUG, ee, STR_PID_DEBUG_INPUT, temp_hotend[ee].celsius, STR_PID_DEBUG_OUTPUT, pid_output); - #if DISABLED(PID_OPENLOOP) - { - SERIAL_ECHOPAIR( - STR_PID_DEBUG_PTERM, work_pid[ee].Kp, - STR_PID_DEBUG_ITERM, work_pid[ee].Ki, - STR_PID_DEBUG_DTERM, work_pid[ee].Kd + SERIAL_ECHO_MSG(STR_PID_DEBUG, ee, STR_PID_DEBUG_INPUT, temp_hotend[ee].celsius, STR_PID_DEBUG_OUTPUT, pid_output + #if DISABLED(PID_OPENLOOP) + , STR_PID_DEBUG_PTERM, work_pid[ee].Kp + , STR_PID_DEBUG_ITERM, work_pid[ee].Ki + , STR_PID_DEBUG_DTERM, work_pid[ee].Kd #if ENABLED(PID_EXTRUSION_SCALING) , STR_PID_DEBUG_CTERM, work_pid[ee].Kc #endif - ); - } - #endif - SERIAL_EOL(); + #endif + ); } - #endif // PID_DEBUG + #endif #else // No PID enabled @@ -1099,13 +1075,76 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { #endif // PID_OPENLOOP #if ENABLED(PID_BED_DEBUG) + if (pid_debug_flag) { + SERIAL_ECHO_MSG( + " PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output + #if DISABLED(PID_OPENLOOP) + , STR_PID_DEBUG_PTERM, work_pid.Kp + , STR_PID_DEBUG_ITERM, work_pid.Ki + , STR_PID_DEBUG_DTERM, work_pid.Kd + #endif + ); + } + #endif + + return pid_output; + } + +#endif // PIDTEMPBED + +#if ENABLED(PIDTEMPCHAMBER) + + float Temperature::get_pid_output_chamber() { + + #if DISABLED(PID_OPENLOOP) + + static PID_t work_pid{0}; + static float temp_iState = 0, temp_dState = 0; + static bool pid_reset = true; + float pid_output = 0; + const float max_power_over_i_gain = float(MAX_CHAMBER_POWER) / temp_chamber.pid.Ki - float(MIN_CHAMBER_POWER), + pid_error = temp_chamber.target - temp_chamber.celsius; + + if (!temp_chamber.target || pid_error < -(PID_FUNCTIONAL_RANGE)) { + pid_output = 0; + pid_reset = true; + } + else if (pid_error > PID_FUNCTIONAL_RANGE) { + pid_output = MAX_CHAMBER_POWER; + pid_reset = true; + } + else { + if (pid_reset) { + temp_iState = 0.0; + work_pid.Kd = 0.0; + pid_reset = false; + } + + temp_iState = constrain(temp_iState + pid_error, 0, max_power_over_i_gain); + + work_pid.Kp = temp_chamber.pid.Kp * pid_error; + work_pid.Ki = temp_chamber.pid.Ki * temp_iState; + work_pid.Kd = work_pid.Kd + PID_K2 * (temp_chamber.pid.Kd * (temp_dState - temp_chamber.celsius) - work_pid.Kd); + + temp_dState = temp_chamber.celsius; + + pid_output = constrain(work_pid.Kp + work_pid.Ki + work_pid.Kd + float(MIN_CHAMBER_POWER), 0, MAX_CHAMBER_POWER); + } + + #else // PID_OPENLOOP + + const float pid_output = constrain(temp_chamber.target, 0, MAX_CHAMBER_POWER); + + #endif // PID_OPENLOOP + + #if ENABLED(PID_CHAMBER_DEBUG) { SERIAL_ECHO_MSG( - " PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output, + " PID_CHAMBER_DEBUG : Input ", temp_chamber.celsius, " Output ", pid_output #if DISABLED(PID_OPENLOOP) - STR_PID_DEBUG_PTERM, work_pid.Kp, - STR_PID_DEBUG_ITERM, work_pid.Ki, - STR_PID_DEBUG_DTERM, work_pid.Kd, + , STR_PID_DEBUG_PTERM, work_pid.Kp + , STR_PID_DEBUG_ITERM, work_pid.Ki + , STR_PID_DEBUG_DTERM, work_pid.Kd #endif ); } @@ -1114,7 +1153,7 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { return pid_output; } -#endif // PIDTEMPBED +#endif // PIDTEMPCHAMBER /** * Manage heating activities for extruder hot-ends and a heated bed @@ -1363,42 +1402,47 @@ void Temperature::manage_heater() { } #endif + + + + #if ENABLED(PIDTEMPCHAMBER) + // PIDTEMPCHAMBER doens't support a CHAMBER_VENT yet. + temp_chamber.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; + #else if (ELAPSED(ms, next_chamber_check_ms)) { next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { - if (flag_chamber_excess_heat) { - temp_chamber.soft_pwm_amount = 0; - #if ENABLED(CHAMBER_VENT) - if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); - #endif + if (flag_chamber_excess_heat) { + temp_chamber.soft_pwm_amount = 0; + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); + #endif + } + else { + #if ENABLED(CHAMBER_LIMIT_SWITCHING) + if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) + temp_chamber.soft_pwm_amount = 0; + else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS)) + temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1; + #else + temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0; + #endif + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0); + #endif + } } else { - #if ENABLED(CHAMBER_LIMIT_SWITCHING) - if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) - temp_chamber.soft_pwm_amount = 0; - else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS)) - temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1; - #else - temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0; - #endif - #if ENABLED(CHAMBER_VENT) - if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0); - #endif + temp_chamber.soft_pwm_amount = 0; + WRITE_HEATER_CHAMBER(LOW); } - } - else { - temp_chamber.soft_pwm_amount = 0; - WRITE_HEATER_CHAMBER(LOW); - } - #if ENABLED(THERMAL_PROTECTION_CHAMBER) - tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); - #endif - } - - // TODO: Implement true PID pwm - //temp_bed.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; + } + #if ENABLED(THERMAL_PROTECTION_CHAMBER) + tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); + #endif + #endif #endif // HAS_HEATED_CHAMBER diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 75da232874..1019c10fad 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -210,7 +210,11 @@ struct PIDHeaterInfo : public HeaterInfo { typedef temp_info_t probe_info_t; #endif #if HAS_HEATED_CHAMBER - typedef heater_info_t chamber_info_t; + #if ENABLED(PIDTEMPCHAMBER) + typedef struct PIDHeaterInfo chamber_info_t; + #else + typedef heater_info_t chamber_info_t; + #endif #elif HAS_TEMP_CHAMBER typedef temp_info_t chamber_info_t; #endif @@ -415,7 +419,7 @@ class Temperature { #if HAS_HEATED_CHAMBER TERN_(WATCH_CHAMBER, static chamber_watch_t watch_chamber); - static millis_t next_chamber_check_ms; + TERN(PIDTEMPCHAMBER,,static millis_t next_chamber_check_ms); #ifdef CHAMBER_MINTEMP static int16_t mintemp_raw_CHAMBER; #endif @@ -751,6 +755,11 @@ class Temperature { * Perform auto-tuning for hotend or bed in response to M303 */ #if HAS_PID_HEATING + + #if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) + static bool pid_debug_flag; + #endif + static void PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); #if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) @@ -826,11 +835,9 @@ class Temperature { static void checkExtruderAutoFans(); - static float get_pid_output_hotend(const uint8_t e); - - TERN_(PIDTEMPBED, static float get_pid_output_bed()); - - TERN_(HAS_HEATED_CHAMBER, static float get_pid_output_chamber()); + TERN_(HAS_HOTEND, static float get_pid_output_hotend(const uint8_t e)); + TERN_(PIDTEMPBED, static float get_pid_output_bed()); + TERN_(PIDTEMPCHAMBER, static float get_pid_output_chamber()); static void _temp_error(const heater_id_t e, PGM_P const serial_msg, PGM_P const lcd_msg); static void min_temp_error(const heater_id_t e); From e9d62822bd2b3e8625911e7d982c1e7ee1d3aff7 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 24 Feb 2021 21:36:55 -0300 Subject: [PATCH 1043/1370] Fix MKS Robin Nano V3 I2C pins (#21174) --- .../share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h | 8 ++++++-- platformio.ini | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h index b53ad32d0f..94fa79c065 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h @@ -143,8 +143,12 @@ extern "C" { #define PIN_SPI_SCK PA5 // I2C definitions -#define PIN_WIRE_SDA PB9 -#define PIN_WIRE_SCL PB8 +#ifndef PIN_WIRE_SDA + #define PIN_WIRE_SDA PB9 +#endif +#ifndef PIN_WIRE_SCL + #define PIN_WIRE_SCL PB8 +#endif // Timer Definitions // Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin diff --git a/platformio.ini b/platformio.ini index dd8a396849..d2ed8a4a5a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1486,7 +1486,7 @@ extra_scripts = ${common.extra_scripts} [env:mks_robin_nano_v3] platform = ${common_stm32.platform} extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC +build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 board = genericSTM32F407VGT6 board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx @@ -1509,6 +1509,7 @@ extra_scripts = ${common.extra_scripts} extends = env:mks_robin_nano_v3 platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} + -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 -DUSBCON -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 @@ -1525,6 +1526,7 @@ extends = env:mks_robin_nano_v3 platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC build_flags = ${stm32_flash_drive.build_flags} + -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 -DUSBCON -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 From 7cb286bb6e28fec1e202a6e0b4b77204e58802c4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 00:56:15 -0600 Subject: [PATCH 1044/1370] Expose more env builds in PlatformIO extension --- Marlin/src/pins/pins.h | 2 +- platformio.ini | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 62545037da..f5b80fd4d0 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -603,7 +603,7 @@ #elif MB(MKS_ROBIN_PRO_V2) #include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2 #elif MB(MKS_ROBIN_NANO_V3) - #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 env:mks_robin_nano_v3_usb_flash_drive + #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 env:mks_robin_nano_v3_usb_flash_drive env:mks_robin_nano_v3_usb_flash_drive_msc #elif MB(ANET_ET4) #include "stm32f4/pins_ANET_ET4.h" // STM32F4 env:Anet_ET4_OpenBLT #elif MB(ANET_ET4P) diff --git a/platformio.ini b/platformio.ini index d2ed8a4a5a..5b2e5cd3bd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1376,6 +1376,7 @@ build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUS # Lerdge X # [env:LERDGEX] +platform = ${lerdge_common.platform} extends = lerdge_common board_build.firmware = Lerdge_X_firmware_force.bin @@ -1383,6 +1384,7 @@ board_build.firmware = Lerdge_X_firmware_force.bin # Lerdge X with USB Flash Drive Support # [env:LERDGEX_usb_flash_drive] +platform = ${LERDGEX.platform} extends = LERDGEX platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1391,6 +1393,7 @@ build_flags = ${stm32_flash_drive.build_flags} # Lerdge S # [env:LERDGES] +platform = ${lerdge_common.platform} extends = lerdge_common board_build.firmware = Lerdge_firmware_force.bin @@ -1398,6 +1401,7 @@ board_build.firmware = Lerdge_firmware_force.bin # Lerdge S with USB Flash Drive Support # [env:LERDGES_usb_flash_drive] +platform = ${LERDGES.platform} extends = LERDGES platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1406,6 +1410,7 @@ build_flags = ${stm32_flash_drive.build_flags} # Lerdge K # [env:LERDGEK] +platform = ${lerdge_common.platform} extends = lerdge_common board_build.firmware = Lerdge_K_firmware_force.bin build_flags = ${lerdge_common.build_flags} @@ -1415,6 +1420,7 @@ build_flags = ${lerdge_common.build_flags} # Lerdge K with USB Flash Drive Support # [env:LERDGEK_usb_flash_drive] +platform = ${LERDGEK.platform} extends = LERDGEK platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1480,13 +1486,19 @@ extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py +# +# This SPI is used by Robin Nano V3 +# +[stm32f4_I2C1] +build_flags = -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 + # # MKS Robin Nano V3 # [env:mks_robin_nano_v3] platform = ${common_stm32.platform} extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 +build_flags = ${common_stm32.build_flags} ${stm32f4_I2C1.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC board = genericSTM32F407VGT6 board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx @@ -1508,8 +1520,7 @@ extra_scripts = ${common.extra_scripts} [env:mks_robin_nano_v3_usb_flash_drive] extends = env:mks_robin_nano_v3 platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} - -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 +build_flags = ${stm32_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} -DUSBCON -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 @@ -1522,11 +1533,11 @@ build_flags = ${stm32_flash_drive.build_flags} # Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged # [env:mks_robin_nano_v3_usb_flash_drive_msc] +platform = ${common_stm32.platform} extends = env:mks_robin_nano_v3 platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} - -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 +build_flags = ${stm32_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} -DUSBCON -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 From 73332f4df1c88944e5b9ebc9a0c9e2abcb617035 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Thu, 25 Feb 2021 08:23:29 +0100 Subject: [PATCH 1045/1370] Combined LPC / Serial fixes (#21178) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/DUE/MarlinSerialUSB.cpp | 11 ++-- Marlin/src/HAL/DUE/MarlinSerialUSB.h | 2 +- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 42 ++++++++++--- Marlin/src/HAL/LPC1768/MarlinSerial.h | 16 +++-- Marlin/src/HAL/LPC1768/usb_serial.cpp | 4 +- Marlin/src/HAL/shared/Delay.cpp | 4 +- Marlin/src/core/serial.h | 1 - Marlin/src/core/serial_base.h | 2 +- Marlin/src/core/serial_hook.h | 80 +++++++++++++------------ Marlin/src/gcode/queue.cpp | 40 ++++++------- docs/Serial.md | 17 +++++- 11 files changed, 132 insertions(+), 87 deletions(-) diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp index a04993ca35..fca677c798 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp @@ -92,12 +92,11 @@ int MarlinSerialUSB::read() { return c; } -bool MarlinSerialUSB::available() { - /* If Pending chars */ - return pending_char >= 0 || - /* or USB CDC enumerated and configured on the PC side and some - bytes where sent to us */ - (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready()); +int MarlinSerialUSB::available() { + if (pending_char > 0) return pending_char; + return pending_char == 0 || + // or USB CDC enumerated and configured on the PC side and some bytes where sent to us */ + (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready()); } void MarlinSerialUSB::flush() { } diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h index 5281a006b1..f9cea29869 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.h @@ -39,7 +39,7 @@ struct MarlinSerialUSB { int peek(); int read(); void flush(); - bool available(); + int available(); size_t write(const uint8_t c); #if ENABLED(SERIAL_STATS_DROPPED_RX) diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index c636a40a12..b0dfc0ae90 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -25,20 +25,46 @@ #include "MarlinSerial.h" #if ANY_SERIAL_IS(0) - MSerialT MSerial(true, LPC_UART0); - extern "C" void UART0_IRQHandler() { MSerial.IRQHandler(); } + MarlinSerial _MSerial(LPC_UART0); + MSerialT MSerial(true, _MSerial); + extern "C" void UART0_IRQHandler() { _MSerial.IRQHandler(); } #endif #if ANY_SERIAL_IS(1) - MSerialT MSerial1(true, (LPC_UART_TypeDef *) LPC_UART1); - extern "C" void UART1_IRQHandler() { MSerial1.IRQHandler(); } + MarlinSerial _MSerial1((LPC_UART_TypeDef *) LPC_UART1); + MSerialT MSerial1(true, _MSerial1); + extern "C" void UART1_IRQHandler() { _MSerial1.IRQHandler(); } #endif #if ANY_SERIAL_IS(2) - MSerialT MSerial2(true, LPC_UART2); - extern "C" void UART2_IRQHandler() { MSerial2.IRQHandler(); } + MarlinSerial _MSerial2(LPC_UART2); + MSerialT MSerial2(true, _MSerial2); + extern "C" void UART2_IRQHandler() { _MSerial2.IRQHandler(); } #endif #if ANY_SERIAL_IS(3) - MSerialT MSerial3(true, LPC_UART3); - extern "C" void UART3_IRQHandler() { MSerial3.IRQHandler(); } + MarlinSerial _MSerial3(LPC_UART3); + MSerialT MSerial3(true, _MSerial3); + extern "C" void UART3_IRQHandler() { _MSerial3.IRQHandler(); } +#endif + +#if ENABLED(EMERGENCY_PARSER) + + bool MarlinSerial::recv_callback(const char c) { + // Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro) + if (false) {} + #if ANY_SERIAL_IS(0) + else if (this == &_MSerial) emergency_parser.update(MSerial.emergency_state, c); + #endif + #if ANY_SERIAL_IS(1) + else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c); + #endif + #if ANY_SERIAL_IS(2) + else if (this == &_MSerial2) emergency_parser.update(MSerial2.emergency_state, c); + #endif + #if ANY_SERIAL_IS(3) + else if (this == &_MSerial3) emergency_parser.update(MSerial3.emergency_state, c); + #endif + return true; + } + #endif #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h index de0f62f006..35c9362b9f 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.h +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.h @@ -47,15 +47,21 @@ public: void end() {} #if ENABLED(EMERGENCY_PARSER) - bool recv_callback(const char c) override { - emergency_parser.update(static_cast *>(this)->emergency_state, c); - return true; // do not discard character - } + bool recv_callback(const char c) override; #endif }; -typedef Serial0Type MSerialT; +// On LPC176x framework, HardwareSerial does not implement the same interface as Arduino's Serial, so overloads +// of 'available' and 'read' method are not used in this multiple inheritance scenario. +// Instead, use a ForwardSerial here that adapts the interface. +typedef ForwardSerial0Type MSerialT; extern MSerialT MSerial; extern MSerialT MSerial1; extern MSerialT MSerial2; extern MSerialT MSerial3; + +// Consequently, we can't use a RuntimeSerial either. The workaround would be to use a RuntimeSerial> type here +// Right now, let's ignore this until it's actually required. +#if ENABLED(SERIAL_RUNTIME_HOOK) + #error "SERIAL_RUNTIME_HOOK is not yet supported for LPC176x." +#endif diff --git a/Marlin/src/HAL/LPC1768/usb_serial.cpp b/Marlin/src/HAL/LPC1768/usb_serial.cpp index d225ce4188..3c1fce54f9 100644 --- a/Marlin/src/HAL/LPC1768/usb_serial.cpp +++ b/Marlin/src/HAL/LPC1768/usb_serial.cpp @@ -29,8 +29,8 @@ EmergencyParser::State emergency_state; -bool CDC_RecvCallback(const char buffer) { - emergency_parser.update(emergency_state, buffer); +bool CDC_RecvCallback(const char c) { + emergency_parser.update(emergency_state, c); return true; } diff --git a/Marlin/src/HAL/shared/Delay.cpp b/Marlin/src/HAL/shared/Delay.cpp index 8ff5a88c63..8a021a2155 100644 --- a/Marlin/src/HAL/shared/Delay.cpp +++ b/Marlin/src/HAL/shared/Delay.cpp @@ -51,7 +51,7 @@ // Use hardware cycle counter instead, it's much safer void delay_dwt(uint32_t count) { // Reuse the ASM_CYCLES_PER_ITERATION variable to avoid wasting another useless variable - register uint32_t start = HW_REG(_DWT_CYCCNT) - ASM_CYCLES_PER_ITERATION, elapsed; + uint32_t start = HW_REG(_DWT_CYCCNT) - ASM_CYCLES_PER_ITERATION, elapsed; do { elapsed = HW_REG(_DWT_CYCCNT) - start; } while (elapsed < count); @@ -114,7 +114,7 @@ serialprintPGM(unit); SERIAL_ECHOLNPAIR(" took: ", total); serialprintPGM(unit); - if (do_flush) SERIAL_FLUSH(); + if (do_flush) SERIAL_FLUSHTX(); }; uint32_t s, e; diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 0fe8435789..f5c02f50b6 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -58,7 +58,6 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // -typedef int8_t serial_index_t; #define SERIAL_ALL 0x7F #if HAS_MULTI_SERIAL #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 83b03cc7b6..418bb557e7 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -79,7 +79,7 @@ struct SerialBase { void end() { static_cast(this)->end(); } /** Check for available data from the port @param index The port index, usually 0 */ - bool available(uint8_t index = 0) { return static_cast(this)->available(index); } + int available(uint8_t index = 0) { return static_cast(this)->available(index); } /** Read a value from the port @param index The port index, usually 0 */ int read(uint8_t index = 0) { return static_cast(this)->read(index); } diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index ad8ec12b6e..afd43892c7 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -24,6 +24,9 @@ #include "macros.h" #include "serial_base.h" +// Used in multiple places +typedef int8_t serial_index_t; + // The most basic serial class: it dispatch to the base serial class with no hook whatsoever. This will compile to nothing but the base serial class template struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { @@ -35,10 +38,11 @@ struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { void msgDone() {} - bool available(uint8_t index) { return index == 0 && SerialT::available(); } - int read(uint8_t index) { return index == 0 ? SerialT::read() : -1; } - bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } - void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + // We don't care about indices here, since if one can call us, it's the right index anyway + int available(uint8_t) { return (int)SerialT::available(); } + int read(uint8_t) { return (int)SerialT::read(); } + bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } // We have 2 implementation of the same method in both base class, let's say which one we want using SerialT::available; @@ -65,18 +69,19 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial > { bool & condition; SerialT & out; NO_INLINE size_t write(uint8_t c) { if (condition) return out.write(c); return 0; } - void flush() { if (condition) out.flush(); } - void begin(long br) { out.begin(br); } - void end() { out.end(); } + void flush() { if (condition) out.flush(); } + void begin(long br) { out.begin(br); } + void end() { out.end(); } void msgDone() {} - bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } - void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } + void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + + int available(uint8_t ) { return (int)out.available(); } + int read(uint8_t ) { return (int)out.read(); } + int available() { return (int)out.available(); } + int read() { return (int)out.read(); } - bool available(uint8_t index) { return index == 0 && out.available(); } - int read(uint8_t index) { return index == 0 ? out.read() : -1; } - using BaseClassT::available; - using BaseClassT::read; ConditionalSerial(bool & conditionVariable, SerialT & out, const bool e) : BaseClassT(e), condition(conditionVariable), out(out) {} }; @@ -97,10 +102,10 @@ struct ForwardSerial : public SerialBase< ForwardSerial > { bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - bool available(uint8_t index) { return index == 0 && out.available(); } - int read(uint8_t index) { return index == 0 ? out.read() : -1; } - bool available() { return out.available(); } - int read() { return out.read(); } + int available(uint8_t) { return (int)out.available(); } + int read(uint8_t) { return (int)out.read(); } + int available() { return (int)out.available(); } + int read() { return (int)out.read(); } ForwardSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} }; @@ -125,8 +130,8 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria if (eofHook) eofHook(userPointer); } - bool available(uint8_t index) { return index == 0 && SerialT::available(); } - int read(uint8_t index) { return index == 0 ? SerialT::read() : -1; } + int available(uint8_t) { return (int)SerialT::available(); } + int read(uint8_t) { return (int)SerialT::read(); } using SerialT::available; using SerialT::read; using SerialT::flush; @@ -157,21 +162,22 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria // Forward constructor template - RuntimeSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...) {} + RuntimeSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...), writeHook(0), eofHook(0), userPointer(0) {} }; // A class that's duplicating its output conditionally to 2 serial interface -template -struct MultiSerial : public SerialBase< MultiSerial > { - typedef SerialBase< MultiSerial > BaseClassT; +template +struct MultiSerial : public SerialBase< MultiSerial > { + typedef SerialBase< MultiSerial > BaseClassT; uint8_t portMask; Serial0T & serial0; Serial1T & serial1; enum Masks { - FirstOutputMask = (1 << offset), - SecondOutputMask = (1 << (offset + 1)), + UsageMask = ((1 << step) - 1), // A bit mask containing as many bits as step + FirstOutputMask = (UsageMask << offset), + SecondOutputMask = (UsageMask << (offset + step)), AllMask = FirstOutputMask | SecondOutputMask, }; @@ -185,19 +191,19 @@ struct MultiSerial : public SerialBase< MultiSerial if (portMask & FirstOutputMask) serial0.msgDone(); if (portMask & SecondOutputMask) serial1.msgDone(); } - bool available(uint8_t index) { - switch(index) { - case 0 + offset: return serial0.available(); - case 1 + offset: return serial1.available(); - default: return false; - } + int available(uint8_t index) { + if (index >= 0 + offset && index < step + offset) + return serial0.available(index); + else if (index >= step + offset && index < 2 * step + offset) + return serial1.available(index); + return false; } - NO_INLINE int read(uint8_t index) { - switch(index) { - case 0 + offset: return serial0.read(); - case 1 + offset: return serial1.read(); - default: return -1; - } + int read(uint8_t index) { + if (index >= 0 + offset && index < step + offset) + return serial0.read(index); + else if (index >= step + offset && index < 2 * step + offset) + return serial1.read(index); + return -1; } void begin(const long br) { if (portMask & FirstOutputMask) serial0.begin(br); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index c49247912c..8c9e9afdc1 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -63,6 +63,10 @@ GCodeQueue queue; // Frequently used G-code strings PGMSTR(G28_STR, "G28"); +#if NO_TIMEOUTS > 0 + static millis_t last_command_time = 0; +#endif + /** * GCode line number handling. Hosts may opt to include line numbers when * sending commands to Marlin, and lines will be checked for sequentiality. @@ -288,6 +292,10 @@ void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { * B Block queue space remaining */ void GCodeQueue::ok_to_send() { + #if NO_TIMEOUTS > 0 + // Start counting from the last command's execution + last_command_time = millis(); + #endif #if HAS_MULTI_SERIAL const serial_index_t serial_ind = command_port(); if (serial_ind < 0) return; @@ -324,28 +332,19 @@ void GCodeQueue::flush_and_request_resend() { ok_to_send(); } -inline bool serial_data_available() { - byte data_available = 0; - if (MYSERIAL0.available()) data_available++; - #ifdef SERIAL_PORT_2 - const bool port2_open = TERN1(HAS_ETHERNET, ethernet.have_telnet_client); - if (port2_open && MYSERIAL1.available()) data_available++; - #endif - return data_available > 0; + +// Multiserial already handle the dispatch to/from multiple port by itself +inline bool serial_data_available(uint8_t index = SERIAL_ALL) { + if (index == SERIAL_ALL) { + for (index = 0; index < NUM_SERIAL; index++) { + if (SERIAL_IMPL.available(index) > 0) return true; + } + return false; + } + return SERIAL_IMPL.available(index) > 0; } -inline int read_serial(const uint8_t index) { - switch (index) { - case 0: return MYSERIAL0.read(); - case 1: { - #if HAS_MULTI_SERIAL - const bool port2_open = TERN1(HAS_ETHERNET, ethernet.have_telnet_client); - if (port2_open) return MYSERIAL1.read(); - #endif - } - default: return -1; - } -} +inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command @@ -460,7 +459,6 @@ void GCodeQueue::get_serial_commands() { // If the command buffer is empty for too long, // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 - static millis_t last_command_time = 0; const millis_t ms = millis(); if (length == 0 && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); diff --git a/docs/Serial.md b/docs/Serial.md index 0db8175b3d..b4079d765f 100644 --- a/docs/Serial.md +++ b/docs/Serial.md @@ -30,14 +30,25 @@ In the `Marlin/src/core/serial_hook.h` file, the different serial feature are de Since all the types above are using CRTP, it's possible to combine them to get the appropriate functionality. This is easily done via type definition of the feature. -For example, to present a serial interface that's outputting to 2 serial port, the first one being hooked at runtime and the second one connected to a runtime switchable telnet client, you'll declare the type to use as: +For example, to create a single serial interface with 2 serial outputs (one enabled at runtime and the other switchable): ```cpp typedef MultiSerial< RuntimeSerial, ConditionalSerial > Serial0Type; ``` +To send the same output to 4 serial ports you could nest `MultiSerial` like this: +```cpp +typedef MultiSerial< MultiSerial< BaseSerial, BaseSerial >, MultiSerial< BaseSerial, BaseSerial, 2, 1>, 0, 2> Serial0Type; +``` +The magical numbers here are the step and offset for computing the serial port. Simplifying the above monster a bit: +```cpp +MS< A = MS, B=MS, offset=0, step=2> +``` +This means that the underlying multiserial A (with output to `a,b`) is available from offset = 0 to offset + step = 1 (default value). +The multiserial B (with output to `c,d`) is available from offset = 2 (the next step from the root multiserial) to offset + step = 3. +In practice, the root multiserial will redirect any index/mask `offset` to `offset + step - 1` to its first leaf, and any index/mask `offset + step` to `offset + 2*step - 1` to its second leaf. + ## Emergency parser -By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it. -Because of this condition, all underlying type takes a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used. +By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it. Because of this condition, all underlying types take a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used. ## SERIAL macros The following macros are defined (in `serial.h`) to output data to the serial ports: From b33afb790e460333033b9da65a0f765f8e4125d6 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Thu, 25 Feb 2021 08:26:56 +0100 Subject: [PATCH 1046/1370] Let libmaple accept RX/TX_BUFFER_SIZE (#21177) --- .../PlatformIO/scripts/fix_framework_weakness.py | 12 ++++++++++++ platformio.ini | 12 ++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py index 94076cfbab..4944c0003b 100644 --- a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -27,3 +27,15 @@ if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"): print("Done patching exception handler") print("Libmaple modified and ready for post mortem debugging") + +rxBuf = env["MARLIN_FEATURES"]["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +txBuf = env["MARLIN_FEATURES"]["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +if int(rxBuf) < 64: + rxBuf = "64" + +if int(txBuf) < 64: + txBuf = "64" + +build_flags = env.get('BUILD_FLAGS') +build_flags.append("-DUSART_RX_BUF_SIZE=" + rxBuf + " -DUSART_TX_BUF_SIZE=" + txBuf) +env.Replace(BUILD_FLAGS=build_flags) diff --git a/platformio.ini b/platformio.ini index 5b2e5cd3bd..fab20018d9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -753,7 +753,7 @@ lib_deps = ${common.lib_deps} SoftwareSerialM platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} - buildroot/share/PlatformIO/scripts/fix_framework_weakness.py + pre:buildroot/share/PlatformIO/scripts/fix_framework_weakness.py # # STM32F103RC @@ -795,7 +795,7 @@ upload_protocol = dfu [env:STM32F103RC_fysetc] platform = ${common_stm32f1.platform} extends = env:STM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 lib_ldf_mode = chain @@ -819,7 +819,7 @@ upload_protocol = serial [env:STM32F103RC_btt] platform = ${common_stm32f1.platform} extends = env:STM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 @@ -861,7 +861,7 @@ monitor_speed = 115200 [env:STM32F103RE_btt] platform = ${common_stm32f1.platform} extends = env:STM32F103RE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 debug_tool = stlink @@ -951,7 +951,7 @@ build_flags = ${common_stm32f1.build_flags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_nano35.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 @@ -1019,7 +1019,7 @@ platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC platform_packages = tool-stm32duino -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_e3.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 From 088b5cfec240f04f3073dd58ac9394c568d06dfe Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 25 Feb 2021 07:38:01 +0000 Subject: [PATCH 1047/1370] Fix Anycubic Chiron TFT SD menu (#21183) --- Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp | 2 +- Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp index 19f8ec81bc..7d813a6ab0 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -114,7 +114,7 @@ namespace Anycubic { } else { // Logical Name - TFTSer.print("/"); + TFTSer.write('/'); if (folderdepth > 0) TFTSer.print(currentfoldername); TFTSer.println(filelist.shortFilename()); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index c50de1c0a1..37f3c4e320 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -578,8 +578,8 @@ namespace Anycubic { case 15: // A15 Resuming from outage if (printer_state == AC_printer_resuming_from_power_outage) { // Need to home here to restore the Z position - injectCommands(AC_cmnd_power_loss_recovery); - injectCommands("M1000"); // home and start recovery + injectCommands_P(AC_cmnd_power_loss_recovery); + injectCommands_P(PSTR("M1000")); // home and start recovery } break; From ac5f2a93005816c8c40fc376286c88a4d0756ac0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 01:56:11 -0600 Subject: [PATCH 1048/1370] Update BLTOUCH_HS_MODE comment --- Marlin/Configuration_adv.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 50f17d1b9e..7ec81c6675 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -743,8 +743,8 @@ /** * Use "HIGH SPEED" mode for probing. * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. - * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function - * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state. + * This feature was designed for Deltabots with very fast Z moves; however, higher speed Cartesians + * might be able to use it. If the machine can't raise Z fast enough the BLTouch may go into ALARM. */ //#define BLTOUCH_HS_MODE From 19c38f1a8a8b637f43cd86490f2cb626c5d6b1bf Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Thu, 25 Feb 2021 11:35:18 +0100 Subject: [PATCH 1049/1370] Add BOARD_PREINIT (for Longer3D open drain pins) (#21159) --- Marlin/src/MarlinCore.cpp | 3 +++ Marlin/src/module/temperature.cpp | 6 +++--- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 13 +++++++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8aa6cdd6c8..d523882d41 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -870,6 +870,9 @@ inline void tmc_standby_setup() { * • Max7219 */ void setup() { + #ifdef BOARD_PREINIT + BOARD_PREINIT(); // Low-level init (before serial init) + #endif tmc_standby_setup(); // TMC Low Power Standby pins must be set early or they're not usable diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 58b0a965c9..a220386b9e 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1793,7 +1793,7 @@ void Temperature::updateTemperaturesFromRawValues() { #endif // Init fans according to whether they're native PWM or Software PWM -#ifdef ALFAWISE_UX0 +#ifdef BOARD_OPENDRAIN_MOSFETS #define _INIT_SOFT_FAN(P) OUT_WRITE_OD(P, FAN_INVERTING ? LOW : HIGH) #else #define _INIT_SOFT_FAN(P) OUT_WRITE(P, FAN_INVERTING ? LOW : HIGH) @@ -1886,7 +1886,7 @@ void Temperature::init() { #endif #if HAS_HEATER_0 - #ifdef ALFAWISE_UX0 + #ifdef BOARD_OPENDRAIN_MOSFETS OUT_WRITE_OD(HEATER_0_PIN, HEATER_0_INVERTING); #else OUT_WRITE(HEATER_0_PIN, HEATER_0_INVERTING); @@ -1916,7 +1916,7 @@ void Temperature::init() { #endif #if HAS_HEATED_BED - #ifdef ALFAWISE_UX0 + #ifdef BOARD_OPENDRAIN_MOSFETS OUT_WRITE_OD(HEATER_BED_PIN, HEATER_BED_INVERTING); #else OUT_WRITE(HEATER_BED_PIN, HEATER_BED_INVERTING); diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 33f995dcae..fa708b248e 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -29,7 +29,6 @@ #endif #define BOARD_INFO_NAME "Longer3D" -#define ALFAWISE_UX0 // Common to all Longer3D STM32F1 boards (used for Open drain mosfets) #define BOARD_NO_NATIVE_USB @@ -92,10 +91,20 @@ #define FAN_MAX_PWM 255 //#define BEEPER_PIN PD13 // pin 60 (Servo PWM output 5V/GND on Board V0G+) made for BL-Touch sensor - // Can drive a PC Buzzer, if connected between PWM and 5V pins + // Can drive a PC Buzzer, if connected between PWM and 5V pins #define LED_PIN PC2 // pin 17 +// Longer3D board mosfets are passing by default +// Avoid nozzle heat and fan start before serial init +#define BOARD_OPENDRAIN_MOSFETS + +#define BOARD_PREINIT() { \ + OUT_WRITE_OD(HEATER_0_PIN, 0); \ + OUT_WRITE_OD(HEATER_BED_PIN, 0); \ + OUT_WRITE_OD(FAN_PIN, 0); \ +} + // // PWM for a servo probe // Other servo devices are not supported on this board! From e6bf89e82b93f0db21d714a526bc183a9a7d4cd3 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Thu, 25 Feb 2021 10:49:34 +0000 Subject: [PATCH 1050/1370] Allow Zero Endstops (e.g., for CNC) (#21120) Co-authored-by: Scott Lahteine --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 4 +- Marlin/src/gcode/bedlevel/G26.cpp | 22 +- Marlin/src/gcode/calibrate/M48.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 7 + Marlin/src/inc/SanityCheck.h | 64 +- Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 12 +- Marlin/src/module/motion.cpp | 1313 +++++++++---------- Marlin/src/module/motion.h | 69 +- Marlin/src/module/planner.h | 8 +- Marlin/src/module/probe.h | 8 +- buildroot/tests/teensy31-tests | 8 + 11 files changed, 778 insertions(+), 739 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 9bd7f63a7e..6ceb571ee2 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -1118,8 +1118,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { } // If X or Y are not valid, use center of the bed values - if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; - if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; + if (!COORDINATE_OKAY(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; + if (!COORDINATE_OKAY(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; if (err_flag) return UBL_ERR; diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 9e3cad34f2..ed29959055 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -319,9 +319,13 @@ inline bool look_for_lines_to_connect() { s.x = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge e.x = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge - LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); - s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); + #if HAS_ENDSTOPS + LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); + s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); + #else + s.y = e.y = _GET_MESH_Y(j); + #endif if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) print_line_from_here_to_there(s, e); @@ -339,9 +343,13 @@ inline bool look_for_lines_to_connect() { s.y = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge e.y = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge - s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); - LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + #if HAS_ENDSTOPS + s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + #else + s.x = e.x = _GET_MESH_X(i); + #endif if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) print_line_from_here_to_there(s, e); @@ -826,7 +834,7 @@ void GcodeSuite::G26() { #if IS_KINEMATIC // Check to make sure this segment is entirely on the bed, skip if not. if (!position_is_reachable(p) || !position_is_reachable(q)) continue; - #else + #elif HAS_ENDSTOPS LIMIT(p.x, X_MIN_POS + 1, X_MAX_POS - 1); // Prevent hitting the endstops LIMIT(p.y, Y_MIN_POS + 1, Y_MAX_POS - 1); LIMIT(q.x, X_MIN_POS + 1, X_MAX_POS - 1); diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 63d2370697..0c6176173c 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -202,7 +202,7 @@ void GcodeSuite::M48() { if (verbose_level > 3) SERIAL_ECHOLNPAIR_P(PSTR("Moving inward: X"), next_pos.x, SP_Y_STR, next_pos.y); } - #else + #elif HAS_ENDSTOPS // For a rectangular bed just keep the probe in bounds LIMIT(next_pos.x, X_MIN_POS, X_MAX_POS); LIMIT(next_pos.y, Y_MIN_POS, Y_MAX_POS); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 7ac4fe4c31..cff1424eb3 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1195,3 +1195,10 @@ #define TOUCH_ORIENTATION TOUCH_LANDSCAPE #endif #endif + +#if ANY(USE_XMIN_PLUG, USE_YMIN_PLUG, USE_ZMIN_PLUG, USE_XMAX_PLUG, USE_YMAX_PLUG, USE_ZMAX_PLUG) + #define HAS_ENDSTOPS 1 + #define COORDINATE_OKAY(N,L,H) WITHIN(N,L,H) +#else + #define COORDINATE_OKAY(N,L,H) true +#endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ba69b4792e..d6d2a600a0 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2016,39 +2016,41 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal && !(ENABLED(A##_MULTI_ENDSTOPS) && WITHIN(A##2_USE_ENDSTOP, _##P##MAX_, _##P##MIN_)) ) #define _AXIS_PLUG_UNUSED_TEST(A) (_PLUG_UNUSED_TEST(A,X) && _PLUG_UNUSED_TEST(A,Y) && _PLUG_UNUSED_TEST(A,Z)) -// At least 3 endstop plugs must be used -#if _AXIS_PLUG_UNUSED_TEST(X) - #error "You must enable USE_XMIN_PLUG or USE_XMAX_PLUG." -#endif -#if _AXIS_PLUG_UNUSED_TEST(Y) - #error "You must enable USE_YMIN_PLUG or USE_YMAX_PLUG." -#endif -#if _AXIS_PLUG_UNUSED_TEST(Z) - #error "You must enable USE_ZMIN_PLUG or USE_ZMAX_PLUG." -#endif - -// Delta and Cartesian use 3 homing endstops -#if NONE(IS_SCARA, SPI_ENDSTOPS) - #if X_HOME_DIR < 0 && DISABLED(USE_XMIN_PLUG) - #error "Enable USE_XMIN_PLUG when homing X to MIN." - #elif X_HOME_DIR > 0 && DISABLED(USE_XMAX_PLUG) - #error "Enable USE_XMAX_PLUG when homing X to MAX." - #elif Y_HOME_DIR < 0 && DISABLED(USE_YMIN_PLUG) - #error "Enable USE_YMIN_PLUG when homing Y to MIN." - #elif Y_HOME_DIR > 0 && DISABLED(USE_YMAX_PLUG) - #error "Enable USE_YMAX_PLUG when homing Y to MAX." +// A machine with endstops must have a minimum of 3 +#if HAS_ENDSTOPS + #if _AXIS_PLUG_UNUSED_TEST(X) + #error "You must enable USE_XMIN_PLUG or USE_XMAX_PLUG." + #endif + #if _AXIS_PLUG_UNUSED_TEST(Y) + #error "You must enable USE_YMIN_PLUG or USE_YMAX_PLUG." + #endif + #if _AXIS_PLUG_UNUSED_TEST(Z) + #error "You must enable USE_ZMIN_PLUG or USE_ZMAX_PLUG." #endif -#endif -// Z homing direction and plug usage flags -#if Z_HOME_DIR < 0 && NONE(USE_ZMIN_PLUG, HOMING_Z_WITH_PROBE) - #error "Enable USE_ZMIN_PLUG when homing Z to MIN." -#elif Z_HOME_DIR > 0 && ENABLED(USE_PROBE_FOR_Z_HOMING) - #error "Z_HOME_DIR must be -1 when homing Z with the probe." -#elif BOTH(HOMING_Z_WITH_PROBE, Z_MULTI_ENDSTOPS) - #error "Z_MULTI_ENDSTOPS is incompatible with USE_PROBE_FOR_Z_HOMING." -#elif Z_HOME_DIR > 0 && DISABLED(USE_ZMAX_PLUG) - #error "Enable USE_ZMAX_PLUG when homing Z to MAX." + // Delta and Cartesian use 3 homing endstops + #if NONE(IS_SCARA, SPI_ENDSTOPS) + #if X_HOME_DIR < 0 && DISABLED(USE_XMIN_PLUG) + #error "Enable USE_XMIN_PLUG when homing X to MIN." + #elif X_HOME_DIR > 0 && DISABLED(USE_XMAX_PLUG) + #error "Enable USE_XMAX_PLUG when homing X to MAX." + #elif Y_HOME_DIR < 0 && DISABLED(USE_YMIN_PLUG) + #error "Enable USE_YMIN_PLUG when homing Y to MIN." + #elif Y_HOME_DIR > 0 && DISABLED(USE_YMAX_PLUG) + #error "Enable USE_YMAX_PLUG when homing Y to MAX." + #endif + #endif + + // Z homing direction and plug usage flags + #if Z_HOME_DIR < 0 && NONE(USE_ZMIN_PLUG, HOMING_Z_WITH_PROBE) + #error "Enable USE_ZMIN_PLUG when homing Z to MIN." + #elif Z_HOME_DIR > 0 && ENABLED(USE_PROBE_FOR_Z_HOMING) + #error "Z_HOME_DIR must be -1 when homing Z with the probe." + #elif BOTH(HOMING_Z_WITH_PROBE, Z_MULTI_ENDSTOPS) + #error "Z_MULTI_ENDSTOPS is incompatible with USE_PROBE_FOR_Z_HOMING." + #elif Z_HOME_DIR > 0 && DISABLED(USE_ZMAX_PLUG) + #error "Enable USE_ZMAX_PLUG when homing Z to MAX." + #endif #endif #if BOTH(HOME_Z_FIRST, USE_PROBE_FOR_Z_HOMING) diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index 7d36a02d67..0358f3f59a 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -446,10 +446,8 @@ uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_in position_max = X_center + displacement; echo_min_max('X', position_min, position_max); if (false - #ifdef X_MIN_POS + #if HAS_ENDSTOPS || position_min < (X_MIN_POS) - #endif - #ifdef X_MAX_POS || position_max > (X_MAX_POS) #endif ) { @@ -463,10 +461,8 @@ uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_in position_max = Y_center + displacement; echo_min_max('Y', position_min, position_max); if (false - #ifdef Y_MIN_POS + #if HAS_ENDSTOPS || position_min < (Y_MIN_POS) - #endif - #ifdef Y_MAX_POS || position_max > (Y_MAX_POS) #endif ) { @@ -480,10 +476,8 @@ uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_in position_max = Z_center + displacement; echo_min_max('Z', position_min, position_max); if (false - #ifdef Z_MIN_POS + #if HAS_ENDSTOPS || position_min < (Z_MIN_POS) - #endif - #ifdef Z_MAX_POS || position_max > (Z_MAX_POS) #endif ) { diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 8dc84c33d6..10d3585a73 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -74,17 +74,6 @@ #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" -/** - * axis_homed - * Flags that each linear axis was homed. - * XYZ on cartesian, ABC on delta, ABZ on SCARA. - * - * axis_trusted - * Flags that the position is trusted in each linear axis. Set when homed. - * Cleared whenever a stepper powers off, potentially losing its position. - */ -uint8_t axis_homed, axis_trusted; // = 0 - // Relative Mode. Enable with G91, disable with G90. bool relative_mode; // = false; @@ -1122,262 +1111,692 @@ void prepare_line_to_destination() { current_position = destination; } -uint8_t axes_should_home(uint8_t axis_bits/*=0x07*/) { - #define SHOULD_HOME(A) TERN(HOME_AFTER_DEACTIVATE, axis_is_trusted, axis_was_homed)(A) - // Clear test bits that are trusted - if (TEST(axis_bits, X_AXIS) && SHOULD_HOME(X_AXIS)) CBI(axis_bits, X_AXIS); - if (TEST(axis_bits, Y_AXIS) && SHOULD_HOME(Y_AXIS)) CBI(axis_bits, Y_AXIS); - if (TEST(axis_bits, Z_AXIS) && SHOULD_HOME(Z_AXIS)) CBI(axis_bits, Z_AXIS); - return axis_bits; -} +#if HAS_ENDSTOPS -bool homing_needed_error(uint8_t axis_bits/*=0x07*/) { - if ((axis_bits = axes_should_home(axis_bits))) { - PGM_P home_first = GET_TEXT(MSG_HOME_FIRST); - char msg[strlen_P(home_first)+1]; - sprintf_P(msg, home_first, - TEST(axis_bits, X_AXIS) ? "X" : "", - TEST(axis_bits, Y_AXIS) ? "Y" : "", - TEST(axis_bits, Z_AXIS) ? "Z" : "" - ); - SERIAL_ECHO_START(); - SERIAL_ECHOLN(msg); - TERN_(HAS_DISPLAY, ui.set_status(msg)); - return true; + uint8_t axis_homed, axis_trusted; // = 0 + + uint8_t axes_should_home(uint8_t axis_bits/*=0x07*/) { + #define SHOULD_HOME(A) TERN(HOME_AFTER_DEACTIVATE, axis_is_trusted, axis_was_homed)(A) + // Clear test bits that are trusted + if (TEST(axis_bits, X_AXIS) && SHOULD_HOME(X_AXIS)) CBI(axis_bits, X_AXIS); + if (TEST(axis_bits, Y_AXIS) && SHOULD_HOME(Y_AXIS)) CBI(axis_bits, Y_AXIS); + if (TEST(axis_bits, Z_AXIS) && SHOULD_HOME(Z_AXIS)) CBI(axis_bits, Z_AXIS); + return axis_bits; } - return false; -} -/** - * Homing bump feedrate (mm/s) - */ -feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); - #endif - static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; - uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); - if (hbd < 1) { - hbd = 10; - SERIAL_ECHO_MSG("Warning: Homing Bump Divisor < 1"); + bool homing_needed_error(uint8_t axis_bits/*=0x07*/) { + if ((axis_bits = axes_should_home(axis_bits))) { + PGM_P home_first = GET_TEXT(MSG_HOME_FIRST); + char msg[strlen_P(home_first)+1]; + sprintf_P(msg, home_first, + TEST(axis_bits, X_AXIS) ? "X" : "", + TEST(axis_bits, Y_AXIS) ? "Y" : "", + TEST(axis_bits, Z_AXIS) ? "Z" : "" + ); + SERIAL_ECHO_START(); + SERIAL_ECHOLN(msg); + TERN_(HAS_DISPLAY, ui.set_status(msg)); + return true; + } + return false; } - return homing_feedrate(axis) / float(hbd); -} -#if ENABLED(SENSORLESS_HOMING) /** - * Set sensorless homing if the axis has it, accounting for Core Kinematics. + * Homing bump feedrate (mm/s) */ - sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis) { - sensorless_t stealth_states { false }; - - switch (axis) { - default: break; - #if X_SENSORLESS - case X_AXIS: - stealth_states.x = tmc_enable_stallguard(stepperX); - #if AXIS_HAS_STALLGUARD(X2) - stealth_states.x2 = tmc_enable_stallguard(stepperX2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS - stealth_states.y = tmc_enable_stallguard(stepperY); - #elif CORE_IS_XZ && Z_SENSORLESS - stealth_states.z = tmc_enable_stallguard(stepperZ); - #endif - break; - #endif - #if Y_SENSORLESS - case Y_AXIS: - stealth_states.y = tmc_enable_stallguard(stepperY); - #if AXIS_HAS_STALLGUARD(Y2) - stealth_states.y2 = tmc_enable_stallguard(stepperY2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS - stealth_states.x = tmc_enable_stallguard(stepperX); - #elif CORE_IS_YZ && Z_SENSORLESS - stealth_states.z = tmc_enable_stallguard(stepperZ); - #endif - break; - #endif - #if Z_SENSORLESS - case Z_AXIS: - stealth_states.z = tmc_enable_stallguard(stepperZ); - #if AXIS_HAS_STALLGUARD(Z2) - stealth_states.z2 = tmc_enable_stallguard(stepperZ2); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - stealth_states.z3 = tmc_enable_stallguard(stepperZ3); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - stealth_states.z4 = tmc_enable_stallguard(stepperZ4); - #endif - #if CORE_IS_XZ && X_SENSORLESS - stealth_states.x = tmc_enable_stallguard(stepperX); - #elif CORE_IS_YZ && Y_SENSORLESS - stealth_states.y = tmc_enable_stallguard(stepperY); - #endif - break; - #endif - } - - #if ENABLED(SPI_ENDSTOPS) - switch (axis) { - case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; - case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = true; break; - case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = true; break; - default: break; - } + feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); #endif - - TERN_(IMPROVE_HOMING_RELIABILITY, sg_guard_period = millis() + default_sg_guard_duration); - - return stealth_states; - } - - void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth) { - switch (axis) { - default: break; - #if X_SENSORLESS - case X_AXIS: - tmc_disable_stallguard(stepperX, enable_stealth.x); - #if AXIS_HAS_STALLGUARD(X2) - tmc_disable_stallguard(stepperX2, enable_stealth.x2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS - tmc_disable_stallguard(stepperY, enable_stealth.y); - #elif CORE_IS_XZ && Z_SENSORLESS - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #endif - break; - #endif - #if Y_SENSORLESS - case Y_AXIS: - tmc_disable_stallguard(stepperY, enable_stealth.y); - #if AXIS_HAS_STALLGUARD(Y2) - tmc_disable_stallguard(stepperY2, enable_stealth.y2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS - tmc_disable_stallguard(stepperX, enable_stealth.x); - #elif CORE_IS_YZ && Z_SENSORLESS - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #endif - break; - #endif - #if Z_SENSORLESS - case Z_AXIS: - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #if AXIS_HAS_STALLGUARD(Z2) - tmc_disable_stallguard(stepperZ2, enable_stealth.z2); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - tmc_disable_stallguard(stepperZ3, enable_stealth.z3); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - tmc_disable_stallguard(stepperZ4, enable_stealth.z4); - #endif - #if CORE_IS_XZ && X_SENSORLESS - tmc_disable_stallguard(stepperX, enable_stealth.x); - #elif CORE_IS_YZ && Y_SENSORLESS - tmc_disable_stallguard(stepperY, enable_stealth.y); - #endif - break; - #endif + static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; + uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); + if (hbd < 1) { + hbd = 10; + SERIAL_ECHO_MSG("Warning: Homing Bump Divisor < 1"); } - - #if ENABLED(SPI_ENDSTOPS) - switch (axis) { - case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; - case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = false; break; - case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = false; break; - default: break; - } - #endif + return homing_feedrate(axis) / float(hbd); } -#endif // SENSORLESS_HOMING - -/** - * Home an individual linear axis - */ -void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0, const bool final_approach=true) { - DEBUG_SECTION(log_move, "do_homing_move", DEBUGGING(LEVELING)); - - const feedRate_t home_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); - - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("...(", AS_CHAR(axis_codes[axis]), ", ", distance, ", "); - if (fr_mm_s) - DEBUG_ECHO(fr_mm_s); - else - DEBUG_ECHOPAIR("[", home_fr_mm_s, "]"); - DEBUG_ECHOLNPGM(")"); - } - - // Only do some things when moving towards an endstop - const int8_t axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) - ? x_home_dir(active_extruder) : home_dir(axis); - const bool is_home_dir = (axis_home_dir > 0) == (distance > 0); - #if ENABLED(SENSORLESS_HOMING) - sensorless_t stealth_states; - #endif + /** + * Set sensorless homing if the axis has it, accounting for Core Kinematics. + */ + sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis) { + sensorless_t stealth_states { false }; - if (is_home_dir) { + switch (axis) { + default: break; + #if X_SENSORLESS + case X_AXIS: + stealth_states.x = tmc_enable_stallguard(stepperX); + #if AXIS_HAS_STALLGUARD(X2) + stealth_states.x2 = tmc_enable_stallguard(stepperX2); + #endif + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS + stealth_states.y = tmc_enable_stallguard(stepperY); + #elif CORE_IS_XZ && Z_SENSORLESS + stealth_states.z = tmc_enable_stallguard(stepperZ); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + stealth_states.y = tmc_enable_stallguard(stepperY); + #if AXIS_HAS_STALLGUARD(Y2) + stealth_states.y2 = tmc_enable_stallguard(stepperY2); + #endif + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS + stealth_states.x = tmc_enable_stallguard(stepperX); + #elif CORE_IS_YZ && Z_SENSORLESS + stealth_states.z = tmc_enable_stallguard(stepperZ); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + stealth_states.z = tmc_enable_stallguard(stepperZ); + #if AXIS_HAS_STALLGUARD(Z2) + stealth_states.z2 = tmc_enable_stallguard(stepperZ2); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + stealth_states.z3 = tmc_enable_stallguard(stepperZ3); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + stealth_states.z4 = tmc_enable_stallguard(stepperZ4); + #endif + #if CORE_IS_XZ && X_SENSORLESS + stealth_states.x = tmc_enable_stallguard(stepperX); + #elif CORE_IS_YZ && Y_SENSORLESS + stealth_states.y = tmc_enable_stallguard(stepperY); + #endif + break; + #endif + } - if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) { - #if ALL(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) - // Wait for bed to heat back up between probing points - thermalManager.wait_for_bed_heating(); + #if ENABLED(SPI_ENDSTOPS) + switch (axis) { + case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; + case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = true; break; + case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = true; break; + default: break; + } #endif - TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_probing_paused(true)); + TERN_(IMPROVE_HOMING_RELIABILITY, sg_guard_period = millis() + default_sg_guard_duration); + + return stealth_states; } - // Disable stealthChop if used. Enable diag1 pin on driver. - TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); - } + void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth) { + switch (axis) { + default: break; + #if X_SENSORLESS + case X_AXIS: + tmc_disable_stallguard(stepperX, enable_stealth.x); + #if AXIS_HAS_STALLGUARD(X2) + tmc_disable_stallguard(stepperX2, enable_stealth.x2); + #endif + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS + tmc_disable_stallguard(stepperY, enable_stealth.y); + #elif CORE_IS_XZ && Z_SENSORLESS + tmc_disable_stallguard(stepperZ, enable_stealth.z); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + tmc_disable_stallguard(stepperY, enable_stealth.y); + #if AXIS_HAS_STALLGUARD(Y2) + tmc_disable_stallguard(stepperY2, enable_stealth.y2); + #endif + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS + tmc_disable_stallguard(stepperX, enable_stealth.x); + #elif CORE_IS_YZ && Z_SENSORLESS + tmc_disable_stallguard(stepperZ, enable_stealth.z); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + tmc_disable_stallguard(stepperZ, enable_stealth.z); + #if AXIS_HAS_STALLGUARD(Z2) + tmc_disable_stallguard(stepperZ2, enable_stealth.z2); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + tmc_disable_stallguard(stepperZ3, enable_stealth.z3); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + tmc_disable_stallguard(stepperZ4, enable_stealth.z4); + #endif + #if CORE_IS_XZ && X_SENSORLESS + tmc_disable_stallguard(stepperX, enable_stealth.x); + #elif CORE_IS_YZ && Y_SENSORLESS + tmc_disable_stallguard(stepperY, enable_stealth.y); + #endif + break; + #endif + } - #if IS_SCARA - // Tell the planner the axis is at 0 - current_position[axis] = 0; - sync_plan_position(); - current_position[axis] = distance; - line_to_current_position(home_fr_mm_s); - #else - // Get the ABC or XYZ positions in mm - abce_pos_t target = planner.get_axis_positions_mm(); + #if ENABLED(SPI_ENDSTOPS) + switch (axis) { + case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; + case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = false; break; + case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = false; break; + default: break; + } + #endif + } - target[axis] = 0; // Set the single homing axis to 0 - planner.set_machine_position_mm(target); // Update the machine position + #endif // SENSORLESS_HOMING - #if HAS_DIST_MM_ARG - const xyze_float_t cart_dist_mm{0}; + /** + * Home an individual linear axis + */ + void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0, const bool final_approach=true) { + DEBUG_SECTION(log_move, "do_homing_move", DEBUGGING(LEVELING)); + + const feedRate_t home_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); + + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOPAIR("...(", AS_CHAR(axis_codes[axis]), ", ", distance, ", "); + if (fr_mm_s) + DEBUG_ECHO(fr_mm_s); + else + DEBUG_ECHOPAIR("[", home_fr_mm_s, "]"); + DEBUG_ECHOLNPGM(")"); + } + + // Only do some things when moving towards an endstop + const int8_t axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) + ? x_home_dir(active_extruder) : home_dir(axis); + const bool is_home_dir = (axis_home_dir > 0) == (distance > 0); + + #if ENABLED(SENSORLESS_HOMING) + sensorless_t stealth_states; #endif - // Set delta/cartesian axes directly - target[axis] = distance; // The move will be towards the endstop - planner.buffer_segment(target + if (is_home_dir) { + + if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) { + #if ALL(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) + // Wait for bed to heat back up between probing points + thermalManager.wait_for_bed_heating(); + #endif + + TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_probing_paused(true)); + } + + // Disable stealthChop if used. Enable diag1 pin on driver. + TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); + } + + #if IS_SCARA + // Tell the planner the axis is at 0 + current_position[axis] = 0; + sync_plan_position(); + current_position[axis] = distance; + line_to_current_position(home_fr_mm_s); + #else + // Get the ABC or XYZ positions in mm + abce_pos_t target = planner.get_axis_positions_mm(); + + target[axis] = 0; // Set the single homing axis to 0 + planner.set_machine_position_mm(target); // Update the machine position + #if HAS_DIST_MM_ARG - , cart_dist_mm + const xyze_float_t cart_dist_mm{0}; #endif - , home_fr_mm_s, active_extruder - ); + + // Set delta/cartesian axes directly + target[axis] = distance; // The move will be towards the endstop + planner.buffer_segment(target + #if HAS_DIST_MM_ARG + , cart_dist_mm + #endif + , home_fr_mm_s, active_extruder + ); + #endif + + planner.synchronize(); + + if (is_home_dir) { + + #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING + if (axis == Z_AXIS && final_approach) probe.set_probing_paused(false); + #endif + + endstops.validate_homing_move(); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + TERN_(SENSORLESS_HOMING, end_sensorless_homing_per_axis(axis, stealth_states)); + } + } + + /** + * Set an axis to be unhomed. (Unless we are on a machine - e.g. a cheap Chinese CNC machine - + * that has no endstops. Such machines should always be considered to be in a "known" and + * "trusted" position). + */ + void set_axis_never_homed(const AxisEnum axis) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); + + set_axis_untrusted(axis); + set_axis_unhomed(axis); + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); + + TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); + } + + #if ENABLED(TMC_HOME_PHASE) + /** + * Move the axis back to its home_phase if set and driver is capable (TMC) + * + * Improves homing repeatability by homing to stepper coil's nearest absolute + * phase position. Trinamic drivers use a stepper phase table with 1024 values + * spanning 4 full steps with 256 positions each (ergo, 1024 positions). + */ + void backout_to_tmc_homing_phase(const AxisEnum axis) { + const xyz_long_t home_phase = TMC_HOME_PHASE; + + // check if home phase is disabled for this axis. + if (home_phase[axis] < 0) return; + + int16_t phasePerUStep, // TMC µsteps(phase) per Marlin µsteps + phaseCurrent, // The TMC µsteps(phase) count of the current position + effectorBackoutDir, // Direction in which the effector mm coordinates move away from endstop. + stepperBackoutDir; // Direction in which the TMC µstep count(phase) move away from endstop. + + #define PHASE_PER_MICROSTEP(N) (256 / _MAX(1, N##_MICROSTEPS)) + + switch (axis) { + #ifdef X_MICROSTEPS + case X_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(X); + phaseCurrent = stepperX.get_microstep_counter(); + effectorBackoutDir = -X_HOME_DIR; + stepperBackoutDir = INVERT_X_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + #ifdef Y_MICROSTEPS + case Y_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(Y); + phaseCurrent = stepperY.get_microstep_counter(); + effectorBackoutDir = -Y_HOME_DIR; + stepperBackoutDir = INVERT_Y_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + #ifdef Z_MICROSTEPS + case Z_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(Z); + phaseCurrent = stepperZ.get_microstep_counter(); + effectorBackoutDir = -Z_HOME_DIR; + stepperBackoutDir = INVERT_Z_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + default: return; + } + + // Phase distance to nearest home phase position when moving in the backout direction from endstop(may be negative). + int16_t phaseDelta = (home_phase[axis] - phaseCurrent) * stepperBackoutDir; + + // Check if home distance within endstop assumed repeatability noise of .05mm and warn. + if (ABS(phaseDelta) * planner.steps_to_mm[axis] / phasePerUStep < 0.05f) + SERIAL_ECHOLNPAIR("Selected home phase ", home_phase[axis], + " too close to endstop trigger phase ", phaseCurrent, + ". Pick a different phase for ", axis_codes[axis]); + + // Skip to next if target position is behind current. So it only moves away from endstop. + if (phaseDelta < 0) phaseDelta += 1024; + + // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm + const float mmDelta = int16_t(phaseDelta / phasePerUStep) * effectorBackoutDir * planner.steps_to_mm[axis]; + + // Optional debug messages + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOLNPAIR( + "Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent, + " Delta:", phaseDelta, " Distance:", mmDelta + ); + } + + if (mmDelta != 0) { + // Retrace by the amount computed in mmDelta. + do_homing_move(axis, mmDelta, get_homing_bump_feedrate(axis)); + } + } #endif - planner.synchronize(); + /** + * Home an individual "raw axis" to its endstop. + * This applies to XYZ on Cartesian and Core robots, and + * to the individual ABC steppers on DELTA and SCARA. + * + * At the end of the procedure the axis is marked as + * homed and the current position of that axis is updated. + * Kinematic robots should wait till all axes are homed + * before updating the current position. + */ - if (is_home_dir) { + void homeaxis(const AxisEnum axis) { - #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING - if (axis == Z_AXIS && final_approach) probe.set_probing_paused(false); + #if IS_SCARA + // Only Z homing (with probe) is permitted + if (axis != Z_AXIS) { BUZZ(100, 880); return; } + #else + #define _CAN_HOME(A) (axis == _AXIS(A) && ( \ + ENABLED(A##_SPI_SENSORLESS) \ + || (_AXIS(A) == Z_AXIS && ENABLED(HOMING_Z_WITH_PROBE)) \ + || (A##_MIN_PIN > -1 && A##_HOME_DIR < 0) \ + || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0) \ + )) + if (!_CAN_HOME(X) && !_CAN_HOME(Y) && !_CAN_HOME(Z)) return; #endif - endstops.validate_homing_move(); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> homeaxis(", axis_codes[axis], ")"); - // Re-enable stealthChop if used. Disable diag1 pin on driver. - TERN_(SENSORLESS_HOMING, end_sensorless_homing_per_axis(axis, stealth_states)); - } -} + const int axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) + ? x_home_dir(active_extruder) : home_dir(axis); + + // + // Homing Z with a probe? Raise Z (maybe) and deploy the Z probe. + // + if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && probe.deploy())) + return; + + // Set flags for X, Y, Z motor locking + #if HAS_EXTRA_ENDSTOPS + switch (axis) { + TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) + TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) + TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) + stepper.set_separate_multi_axis(true); + default: break; + } + #endif + + // + // Deploy BLTouch or tare the probe just before probing + // + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS) { + if (TERN0(BLTOUCH, bltouch.deploy())) return; // BLTouch was deployed above, but get the alarm state. + if (TERN0(PROBE_TARE, probe.tare())) return; + } + #endif + + // + // Back away to prevent an early X/Y sensorless trigger + // + #if DISABLED(DELTA) && defined(SENSORLESS_BACKOFF_MM) + const xy_float_t backoff = SENSORLESS_BACKOFF_MM; + if ((TERN0(X_SENSORLESS, axis == X_AXIS) || TERN0(Y_SENSORLESS, axis == Y_AXIS)) && backoff[axis]) { + const float backoff_length = -ABS(backoff[axis]) * axis_home_dir; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Sensorless backoff: ", backoff_length, "mm"); + do_homing_move(axis, backoff_length, homing_feedrate(axis)); + } + #endif + + // Determine if a homing bump will be done and the bumps distance + // When homing Z with probe respect probe clearance + const bool use_probe_bump = TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && home_bump_mm(Z_AXIS)); + const float bump = axis_home_dir * ( + use_probe_bump ? _MAX(TERN0(HOMING_Z_WITH_PROBE, Z_CLEARANCE_BETWEEN_PROBES), home_bump_mm(Z_AXIS)) : home_bump_mm(axis) + ); + + // + // Fast move towards endstop until triggered + // + const float move_length = 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Home Fast: ", move_length, "mm"); + do_homing_move(axis, move_length, 0.0, !use_probe_bump); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) + if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) + #endif + + // If a second homing move is configured... + if (bump) { + // Move away from the endstop by the axis HOMING_BUMP_MM + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); + do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0, false); + + #if ENABLED(DETECT_BROKEN_ENDSTOP) + // Check for a broken endstop + EndstopEnum es; + switch (axis) { + default: + case X_AXIS: es = X_ENDSTOP; break; + case Y_AXIS: es = Y_ENDSTOP; break; + case Z_AXIS: es = Z_ENDSTOP; break; + } + if (TEST(endstops.state(), es)) { + SERIAL_ECHO_MSG("Bad ", axis_codes[axis], " Endstop?"); + kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); + } + #endif + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) + if (axis == Z_AXIS && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) + #endif + + // Slow move towards endstop until triggered + const float rebump = bump * 2; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Re-bump: ", rebump, "mm"); + do_homing_move(axis, rebump, get_homing_bump_feedrate(axis), true); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) + if (axis == Z_AXIS) bltouch.stow(); // The final STOW + #endif + } + + #if HAS_EXTRA_ENDSTOPS + const bool pos_dir = axis_home_dir > 0; + #if ENABLED(X_DUAL_ENDSTOPS) + if (axis == X_AXIS) { + const float adj = ABS(endstops.x2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.x2_endstop_adj > 0) : (endstops.x2_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_x_lock(false); + stepper.set_x2_lock(false); + } + } + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + if (axis == Y_AXIS) { + const float adj = ABS(endstops.y2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.y2_endstop_adj > 0) : (endstops.y2_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_y_lock(false); + stepper.set_y2_lock(false); + } + } + #endif + + #if ENABLED(Z_MULTI_ENDSTOPS) + if (axis == Z_AXIS) { + + #if NUM_Z_STEPPER_DRIVERS == 2 + + const float adj = ABS(endstops.z2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.z2_endstop_adj > 0) : (endstops.z2_endstop_adj < 0)) stepper.set_z1_lock(true); else stepper.set_z2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_z1_lock(false); + stepper.set_z2_lock(false); + } + + #else + + // Handy arrays of stepper lock function pointers + + typedef void (*adjustFunc_t)(const bool); + + adjustFunc_t lock[] = { + stepper.set_z1_lock, stepper.set_z2_lock, stepper.set_z3_lock + #if NUM_Z_STEPPER_DRIVERS >= 4 + , stepper.set_z4_lock + #endif + }; + float adj[] = { + 0, endstops.z2_endstop_adj, endstops.z3_endstop_adj + #if NUM_Z_STEPPER_DRIVERS >= 4 + , endstops.z4_endstop_adj + #endif + }; + + adjustFunc_t tempLock; + float tempAdj; + + // Manual bubble sort by adjust value + if (adj[1] < adj[0]) { + tempLock = lock[0], tempAdj = adj[0]; + lock[0] = lock[1], adj[0] = adj[1]; + lock[1] = tempLock, adj[1] = tempAdj; + } + if (adj[2] < adj[1]) { + tempLock = lock[1], tempAdj = adj[1]; + lock[1] = lock[2], adj[1] = adj[2]; + lock[2] = tempLock, adj[2] = tempAdj; + } + #if NUM_Z_STEPPER_DRIVERS >= 4 + if (adj[3] < adj[2]) { + tempLock = lock[2], tempAdj = adj[2]; + lock[2] = lock[3], adj[2] = adj[3]; + lock[3] = tempLock, adj[3] = tempAdj; + } + if (adj[2] < adj[1]) { + tempLock = lock[1], tempAdj = adj[1]; + lock[1] = lock[2], adj[1] = adj[2]; + lock[2] = tempLock, adj[2] = tempAdj; + } + #endif + if (adj[1] < adj[0]) { + tempLock = lock[0], tempAdj = adj[0]; + lock[0] = lock[1], adj[0] = adj[1]; + lock[1] = tempLock, adj[1] = tempAdj; + } + + if (pos_dir) { + // normalize adj to smallest value and do the first move + (*lock[0])(true); + do_homing_move(axis, adj[1] - adj[0]); + // lock the second stepper for the final correction + (*lock[1])(true); + do_homing_move(axis, adj[2] - adj[1]); + #if NUM_Z_STEPPER_DRIVERS >= 4 + // lock the third stepper for the final correction + (*lock[2])(true); + do_homing_move(axis, adj[3] - adj[2]); + #endif + } + else { + #if NUM_Z_STEPPER_DRIVERS >= 4 + (*lock[3])(true); + do_homing_move(axis, adj[2] - adj[3]); + #endif + (*lock[2])(true); + do_homing_move(axis, adj[1] - adj[2]); + (*lock[1])(true); + do_homing_move(axis, adj[0] - adj[1]); + } + + stepper.set_z1_lock(false); + stepper.set_z2_lock(false); + stepper.set_z3_lock(false); + #if NUM_Z_STEPPER_DRIVERS >= 4 + stepper.set_z4_lock(false); + #endif + + #endif + } + #endif + + // Reset flags for X, Y, Z motor locking + switch (axis) { + default: break; + TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) + TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) + TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) + stepper.set_separate_multi_axis(false); + } + #endif + + #ifdef TMC_HOME_PHASE + // move back to homing phase if configured and capable + backout_to_tmc_homing_phase(axis); + #endif + + #if IS_SCARA + + set_axis_is_at_home(axis); + sync_plan_position(); + + #elif ENABLED(DELTA) + + // Delta has already moved all three towers up in G28 + // so here it re-homes each tower in turn. + // Delta homing treats the axes as normal linear axes. + + const float adjDistance = delta_endstop_adj[axis], + minDistance = (MIN_STEPS_PER_SEGMENT) * planner.steps_to_mm[axis]; + + // Retrace by the amount specified in delta_endstop_adj if more than min steps. + if (adjDistance * (Z_HOME_DIR) < 0 && ABS(adjDistance) > minDistance) { // away from endstop, more than min distance + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("adjDistance:", adjDistance); + do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis)); + } + + #else // CARTESIAN / CORE / MARKFORGED_XY + + set_axis_is_at_home(axis); + sync_plan_position(); + + destination[axis] = current_position[axis]; + + if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); + + #endif + + // Put away the Z probe + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS && probe.stow()) return; + #endif + + #if DISABLED(DELTA) && defined(HOMING_BACKOFF_POST_MM) + const xyz_float_t endstop_backoff = HOMING_BACKOFF_POST_MM; + if (endstop_backoff[axis]) { + current_position[axis] -= ABS(endstop_backoff[axis]) * axis_home_dir; + line_to_current_position( + #if HOMING_Z_WITH_PROBE + (axis == Z_AXIS) ? z_probe_fast_mm_s : + #endif + homing_feedrate(axis) + ); + + #if ENABLED(SENSORLESS_HOMING) + planner.synchronize(); + if (false + #if EITHER(IS_CORE, MARKFORGED_XY) + || axis != NORMAL_AXIS + #endif + ) safe_delay(200); // Short delay to allow belts to spring back + #endif + } + #endif + + // Clear retracted status if homing the Z axis + #if ENABLED(FWRETRACT) + if (axis == Z_AXIS) fwretract.current_hop = 0.0; + #endif + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< homeaxis(", axis_codes[axis], ")"); + + } // homeaxis() + +#endif // HAS_ENDSTOPS /** * Set an axis' current position to its home position (after homing). @@ -1455,428 +1874,6 @@ void set_axis_is_at_home(const AxisEnum axis) { } } -/** - * Set an axis to be unhomed. - */ -void set_axis_never_homed(const AxisEnum axis) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); - - set_axis_untrusted(axis); - set_axis_unhomed(axis); - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); - - TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); -} - -#ifdef TMC_HOME_PHASE - /** - * Move the axis back to its home_phase if set and driver is capable (TMC) - * - * Improves homing repeatability by homing to stepper coil's nearest absolute - * phase position. Trinamic drivers use a stepper phase table with 1024 values - * spanning 4 full steps with 256 positions each (ergo, 1024 positions). - */ - void backout_to_tmc_homing_phase(const AxisEnum axis) { - const xyz_long_t home_phase = TMC_HOME_PHASE; - - // check if home phase is disabled for this axis. - if (home_phase[axis] < 0) return; - - int16_t phasePerUStep, // TMC µsteps(phase) per Marlin µsteps - phaseCurrent, // The TMC µsteps(phase) count of the current position - effectorBackoutDir, // Direction in which the effector mm coordinates move away from endstop. - stepperBackoutDir; // Direction in which the TMC µstep count(phase) move away from endstop. - - #define PHASE_PER_MICROSTEP(N) (256 / _MAX(1, N##_MICROSTEPS)) - - switch (axis) { - #ifdef X_MICROSTEPS - case X_AXIS: - phasePerUStep = PHASE_PER_MICROSTEP(X); - phaseCurrent = stepperX.get_microstep_counter(); - effectorBackoutDir = -X_HOME_DIR; - stepperBackoutDir = INVERT_X_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - #ifdef Y_MICROSTEPS - case Y_AXIS: - phasePerUStep = PHASE_PER_MICROSTEP(Y); - phaseCurrent = stepperY.get_microstep_counter(); - effectorBackoutDir = -Y_HOME_DIR; - stepperBackoutDir = INVERT_Y_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - #ifdef Z_MICROSTEPS - case Z_AXIS: - phasePerUStep = PHASE_PER_MICROSTEP(Z); - phaseCurrent = stepperZ.get_microstep_counter(); - effectorBackoutDir = -Z_HOME_DIR; - stepperBackoutDir = INVERT_Z_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - default: return; - } - - // Phase distance to nearest home phase position when moving in the backout direction from endstop(may be negative). - int16_t phaseDelta = (home_phase[axis] - phaseCurrent) * stepperBackoutDir; - - // Check if home distance within endstop assumed repeatability noise of .05mm and warn. - if (ABS(phaseDelta) * planner.steps_to_mm[axis] / phasePerUStep < 0.05f) - SERIAL_ECHOLNPAIR("Selected home phase ", home_phase[axis], - " too close to endstop trigger phase ", phaseCurrent, - ". Pick a different phase for ", axis_codes[axis]); - - // Skip to next if target position is behind current. So it only moves away from endstop. - if (phaseDelta < 0) phaseDelta += 1024; - - // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm - const float mmDelta = int16_t(phaseDelta / phasePerUStep) * effectorBackoutDir * planner.steps_to_mm[axis]; - - // Optional debug messages - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR( - "Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent, - " Delta:", phaseDelta, " Distance:", mmDelta - ); - } - - if (mmDelta != 0) { - // Retrace by the amount computed in mmDelta. - do_homing_move(axis, mmDelta, get_homing_bump_feedrate(axis)); - } - } -#endif - -/** - * Home an individual "raw axis" to its endstop. - * This applies to XYZ on Cartesian and Core robots, and - * to the individual ABC steppers on DELTA and SCARA. - * - * At the end of the procedure the axis is marked as - * homed and the current position of that axis is updated. - * Kinematic robots should wait till all axes are homed - * before updating the current position. - */ - -void homeaxis(const AxisEnum axis) { - - #if IS_SCARA - // Only Z homing (with probe) is permitted - if (axis != Z_AXIS) { BUZZ(100, 880); return; } - #else - #define _CAN_HOME(A) (axis == _AXIS(A) && ( \ - ENABLED(A##_SPI_SENSORLESS) \ - || (_AXIS(A) == Z_AXIS && ENABLED(HOMING_Z_WITH_PROBE)) \ - || (A##_MIN_PIN > -1 && A##_HOME_DIR < 0) \ - || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0) \ - )) - if (!_CAN_HOME(X) && !_CAN_HOME(Y) && !_CAN_HOME(Z)) return; - #endif - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> homeaxis(", axis_codes[axis], ")"); - - const int axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) - ? x_home_dir(active_extruder) : home_dir(axis); - - // - // Homing Z with a probe? Raise Z (maybe) and deploy the Z probe. - // - if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && probe.deploy())) - return; - - // Set flags for X, Y, Z motor locking - #if HAS_EXTRA_ENDSTOPS - switch (axis) { - TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) - TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) - TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) - stepper.set_separate_multi_axis(true); - default: break; - } - #endif - - // - // Deploy BLTouch or tare the probe just before probing - // - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS) { - if (TERN0(BLTOUCH, bltouch.deploy())) return; // BLTouch was deployed above, but get the alarm state. - if (TERN0(PROBE_TARE, probe.tare())) return; - } - #endif - - // - // Back away to prevent an early X/Y sensorless trigger - // - #if DISABLED(DELTA) && defined(SENSORLESS_BACKOFF_MM) - const xy_float_t backoff = SENSORLESS_BACKOFF_MM; - if ((TERN0(X_SENSORLESS, axis == X_AXIS) || TERN0(Y_SENSORLESS, axis == Y_AXIS)) && backoff[axis]) { - const float backoff_length = -ABS(backoff[axis]) * axis_home_dir; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Sensorless backoff: ", backoff_length, "mm"); - do_homing_move(axis, backoff_length, homing_feedrate(axis)); - } - #endif - - // Determine if a homing bump will be done and the bumps distance - // When homing Z with probe respect probe clearance - const bool use_probe_bump = TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && home_bump_mm(Z_AXIS)); - const float bump = axis_home_dir * ( - use_probe_bump ? _MAX(TERN0(HOMING_Z_WITH_PROBE, Z_CLEARANCE_BETWEEN_PROBES), home_bump_mm(Z_AXIS)) : home_bump_mm(axis) - ); - - // - // Fast move towards endstop until triggered - // - const float move_length = 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Home Fast: ", move_length, "mm"); - do_homing_move(axis, move_length, 0.0, !use_probe_bump); - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) - if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) - #endif - - // If a second homing move is configured... - if (bump) { - // Move away from the endstop by the axis HOMING_BUMP_MM - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); - do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0, false); - - #if ENABLED(DETECT_BROKEN_ENDSTOP) - // Check for a broken endstop - EndstopEnum es; - switch (axis) { - default: - case X_AXIS: es = X_ENDSTOP; break; - case Y_AXIS: es = Y_ENDSTOP; break; - case Z_AXIS: es = Z_ENDSTOP; break; - } - if (TEST(endstops.state(), es)) { - SERIAL_ECHO_MSG("Bad ", axis_codes[axis], " Endstop?"); - kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); - } - #endif - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) - if (axis == Z_AXIS && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) - #endif - - // Slow move towards endstop until triggered - const float rebump = bump * 2; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Re-bump: ", rebump, "mm"); - do_homing_move(axis, rebump, get_homing_bump_feedrate(axis), true); - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) - if (axis == Z_AXIS) bltouch.stow(); // The final STOW - #endif - } - - #if HAS_EXTRA_ENDSTOPS - const bool pos_dir = axis_home_dir > 0; - #if ENABLED(X_DUAL_ENDSTOPS) - if (axis == X_AXIS) { - const float adj = ABS(endstops.x2_endstop_adj); - if (adj) { - if (pos_dir ? (endstops.x2_endstop_adj > 0) : (endstops.x2_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - stepper.set_x_lock(false); - stepper.set_x2_lock(false); - } - } - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - if (axis == Y_AXIS) { - const float adj = ABS(endstops.y2_endstop_adj); - if (adj) { - if (pos_dir ? (endstops.y2_endstop_adj > 0) : (endstops.y2_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - stepper.set_y_lock(false); - stepper.set_y2_lock(false); - } - } - #endif - - #if ENABLED(Z_MULTI_ENDSTOPS) - if (axis == Z_AXIS) { - - #if NUM_Z_STEPPER_DRIVERS == 2 - - const float adj = ABS(endstops.z2_endstop_adj); - if (adj) { - if (pos_dir ? (endstops.z2_endstop_adj > 0) : (endstops.z2_endstop_adj < 0)) stepper.set_z1_lock(true); else stepper.set_z2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - stepper.set_z1_lock(false); - stepper.set_z2_lock(false); - } - - #else - - // Handy arrays of stepper lock function pointers - - typedef void (*adjustFunc_t)(const bool); - - adjustFunc_t lock[] = { - stepper.set_z1_lock, stepper.set_z2_lock, stepper.set_z3_lock - #if NUM_Z_STEPPER_DRIVERS >= 4 - , stepper.set_z4_lock - #endif - }; - float adj[] = { - 0, endstops.z2_endstop_adj, endstops.z3_endstop_adj - #if NUM_Z_STEPPER_DRIVERS >= 4 - , endstops.z4_endstop_adj - #endif - }; - - adjustFunc_t tempLock; - float tempAdj; - - // Manual bubble sort by adjust value - if (adj[1] < adj[0]) { - tempLock = lock[0], tempAdj = adj[0]; - lock[0] = lock[1], adj[0] = adj[1]; - lock[1] = tempLock, adj[1] = tempAdj; - } - if (adj[2] < adj[1]) { - tempLock = lock[1], tempAdj = adj[1]; - lock[1] = lock[2], adj[1] = adj[2]; - lock[2] = tempLock, adj[2] = tempAdj; - } - #if NUM_Z_STEPPER_DRIVERS >= 4 - if (adj[3] < adj[2]) { - tempLock = lock[2], tempAdj = adj[2]; - lock[2] = lock[3], adj[2] = adj[3]; - lock[3] = tempLock, adj[3] = tempAdj; - } - if (adj[2] < adj[1]) { - tempLock = lock[1], tempAdj = adj[1]; - lock[1] = lock[2], adj[1] = adj[2]; - lock[2] = tempLock, adj[2] = tempAdj; - } - #endif - if (adj[1] < adj[0]) { - tempLock = lock[0], tempAdj = adj[0]; - lock[0] = lock[1], adj[0] = adj[1]; - lock[1] = tempLock, adj[1] = tempAdj; - } - - if (pos_dir) { - // normalize adj to smallest value and do the first move - (*lock[0])(true); - do_homing_move(axis, adj[1] - adj[0]); - // lock the second stepper for the final correction - (*lock[1])(true); - do_homing_move(axis, adj[2] - adj[1]); - #if NUM_Z_STEPPER_DRIVERS >= 4 - // lock the third stepper for the final correction - (*lock[2])(true); - do_homing_move(axis, adj[3] - adj[2]); - #endif - } - else { - #if NUM_Z_STEPPER_DRIVERS >= 4 - (*lock[3])(true); - do_homing_move(axis, adj[2] - adj[3]); - #endif - (*lock[2])(true); - do_homing_move(axis, adj[1] - adj[2]); - (*lock[1])(true); - do_homing_move(axis, adj[0] - adj[1]); - } - - stepper.set_z1_lock(false); - stepper.set_z2_lock(false); - stepper.set_z3_lock(false); - #if NUM_Z_STEPPER_DRIVERS >= 4 - stepper.set_z4_lock(false); - #endif - - #endif - } - #endif - - // Reset flags for X, Y, Z motor locking - switch (axis) { - default: break; - TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) - TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) - TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) - stepper.set_separate_multi_axis(false); - } - #endif - - #ifdef TMC_HOME_PHASE - // move back to homing phase if configured and capable - backout_to_tmc_homing_phase(axis); - #endif - - #if IS_SCARA - - set_axis_is_at_home(axis); - sync_plan_position(); - - #elif ENABLED(DELTA) - - // Delta has already moved all three towers up in G28 - // so here it re-homes each tower in turn. - // Delta homing treats the axes as normal linear axes. - - const float adjDistance = delta_endstop_adj[axis], - minDistance = (MIN_STEPS_PER_SEGMENT) * planner.steps_to_mm[axis]; - - // Retrace by the amount specified in delta_endstop_adj if more than min steps. - if (adjDistance * (Z_HOME_DIR) < 0 && ABS(adjDistance) > minDistance) { // away from endstop, more than min distance - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("adjDistance:", adjDistance); - do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis)); - } - - #else // CARTESIAN / CORE / MARKFORGED_XY - - set_axis_is_at_home(axis); - sync_plan_position(); - - destination[axis] = current_position[axis]; - - if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); - - #endif - - // Put away the Z probe - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS && probe.stow()) return; - #endif - - #if DISABLED(DELTA) && defined(HOMING_BACKOFF_POST_MM) - const xyz_float_t endstop_backoff = HOMING_BACKOFF_POST_MM; - if (endstop_backoff[axis]) { - current_position[axis] -= ABS(endstop_backoff[axis]) * axis_home_dir; - line_to_current_position( - #if HOMING_Z_WITH_PROBE - (axis == Z_AXIS) ? z_probe_fast_mm_s : - #endif - homing_feedrate(axis) - ); - - #if ENABLED(SENSORLESS_HOMING) - planner.synchronize(); - if (false - #if EITHER(IS_CORE, MARKFORGED_XY) - || axis != NORMAL_AXIS - #endif - ) safe_delay(200); // Short delay to allow belts to spring back - #endif - } - #endif - - // Clear retracted status if homing the Z axis - #if ENABLED(FWRETRACT) - if (axis == Z_AXIS) fwretract.current_hop = 0.0; - #endif - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< homeaxis(", axis_codes[axis], ")"); - -} // homeaxis() - #if HAS_WORKSPACE_OFFSET void update_workspace_offset(const AxisEnum axis) { workspace_offset[axis] = home_offset[axis] + position_shift[axis]; @@ -1893,4 +1890,4 @@ void homeaxis(const AxisEnum axis) { home_offset[axis] = v; update_workspace_offset(axis); } -#endif // HAS_M206_COMMAND +#endif diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 328bfe018d..2a23636d71 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -284,27 +284,51 @@ void do_z_clearance(const float &zclear, const bool z_trusted=true, const bool r * Homing and Trusted Axes */ constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); -extern uint8_t axis_homed, axis_trusted; -void homeaxis(const AxisEnum axis); void set_axis_is_at_home(const AxisEnum axis); -void set_axis_never_homed(const AxisEnum axis); -uint8_t axes_should_home(uint8_t axis_bits=0x07); -bool homing_needed_error(uint8_t axis_bits=0x07); -FORCE_INLINE bool axis_was_homed(const AxisEnum axis) { return TEST(axis_homed, axis); } -FORCE_INLINE bool axis_is_trusted(const AxisEnum axis) { return TEST(axis_trusted, axis); } -FORCE_INLINE bool axis_should_home(const AxisEnum axis) { return (axes_should_home() & _BV(axis)) != 0; } -FORCE_INLINE bool no_axes_homed() { return !axis_homed; } -FORCE_INLINE bool all_axes_homed() { return xyz_bits == (axis_homed & xyz_bits); } -FORCE_INLINE bool homing_needed() { return !all_axes_homed(); } -FORCE_INLINE bool all_axes_trusted() { return xyz_bits == (axis_trusted & xyz_bits); } -FORCE_INLINE void set_axis_homed(const AxisEnum axis) { SBI(axis_homed, axis); } -FORCE_INLINE void set_axis_unhomed(const AxisEnum axis) { CBI(axis_homed, axis); } -FORCE_INLINE void set_axis_trusted(const AxisEnum axis) { SBI(axis_trusted, axis); } -FORCE_INLINE void set_axis_untrusted(const AxisEnum axis) { CBI(axis_trusted, axis); } -FORCE_INLINE void set_all_homed() { axis_homed = axis_trusted = xyz_bits; } -FORCE_INLINE void set_all_unhomed() { axis_homed = axis_trusted = 0; } +#if HAS_ENDSTOPS + /** + * axis_homed + * Flags that each linear axis was homed. + * XYZ on cartesian, ABC on delta, ABZ on SCARA. + * + * axis_trusted + * Flags that the position is trusted in each linear axis. Set when homed. + * Cleared whenever a stepper powers off, potentially losing its position. + */ + extern uint8_t axis_homed, axis_trusted; + void homeaxis(const AxisEnum axis); + void set_axis_never_homed(const AxisEnum axis); + uint8_t axes_should_home(uint8_t axis_bits=0x07); + bool homing_needed_error(uint8_t axis_bits=0x07); + FORCE_INLINE void set_axis_unhomed(const AxisEnum axis) { CBI(axis_homed, axis); } + FORCE_INLINE void set_axis_untrusted(const AxisEnum axis) { CBI(axis_trusted, axis); } + FORCE_INLINE void set_all_unhomed() { axis_homed = axis_trusted = 0; } + FORCE_INLINE void set_axis_homed(const AxisEnum axis) { SBI(axis_homed, axis); } + FORCE_INLINE void set_axis_trusted(const AxisEnum axis) { SBI(axis_trusted, axis); } + FORCE_INLINE void set_all_homed() { axis_homed = axis_trusted = xyz_bits; } +#else + constexpr uint8_t axis_homed = xyz_bits, axis_trusted = xyz_bits; // Zero-endstop machines are always homed and trusted + FORCE_INLINE void homeaxis(const AxisEnum axis) {} + FORCE_INLINE void set_axis_never_homed(const AxisEnum) {} + FORCE_INLINE uint8_t axes_should_home(uint8_t=0x07) { return false; } + FORCE_INLINE bool homing_needed_error(uint8_t=0x07) { return false; } + FORCE_INLINE void set_axis_unhomed(const AxisEnum axis) {} + FORCE_INLINE void set_axis_untrusted(const AxisEnum axis) {} + FORCE_INLINE void set_all_unhomed() {} + FORCE_INLINE void set_axis_homed(const AxisEnum axis) {} + FORCE_INLINE void set_axis_trusted(const AxisEnum axis) {} + FORCE_INLINE void set_all_homed() {} +#endif + +FORCE_INLINE bool axis_was_homed(const AxisEnum axis) { return TEST(axis_homed, axis); } +FORCE_INLINE bool axis_is_trusted(const AxisEnum axis) { return TEST(axis_trusted, axis); } +FORCE_INLINE bool axis_should_home(const AxisEnum axis) { return (axes_should_home() & _BV(axis)) != 0; } +FORCE_INLINE bool no_axes_homed() { return !axis_homed; } +FORCE_INLINE bool all_axes_homed() { return xyz_bits == (axis_homed & xyz_bits); } +FORCE_INLINE bool homing_needed() { return !all_axes_homed(); } +FORCE_INLINE bool all_axes_trusted() { return xyz_bits == (axis_trusted & xyz_bits); } #if ENABLED(NO_MOTION_BEFORE_HOMING) #define MOTION_CONDITIONS (IsRunning() && !homing_needed_error()) @@ -360,7 +384,6 @@ FORCE_INLINE void set_all_unhomed() { axis_homed = axis_tr /** * position_is_reachable family of functions */ - #if IS_KINEMATIC // (DELTA or SCARA) #if HAS_SCARA_OFFSET @@ -390,14 +413,14 @@ FORCE_INLINE void set_all_unhomed() { axis_homed = axis_tr // Return true if the given position is within the machine bounds. inline bool position_is_reachable(const float &rx, const float &ry) { - if (!WITHIN(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop)) return false; + if (!COORDINATE_OKAY(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop)) return false; #if ENABLED(DUAL_X_CARRIAGE) if (active_extruder) - return WITHIN(rx, X2_MIN_POS - fslop, X2_MAX_POS + fslop); + return COORDINATE_OKAY(rx, X2_MIN_POS - fslop, X2_MAX_POS + fslop); else - return WITHIN(rx, X1_MIN_POS - fslop, X1_MAX_POS + fslop); + return COORDINATE_OKAY(rx, X1_MIN_POS - fslop, X1_MAX_POS + fslop); #else - return WITHIN(rx, X_MIN_POS - fslop, X_MAX_POS + fslop); + return COORDINATE_OKAY(rx, X_MIN_POS - fslop, X_MAX_POS + fslop); #endif } inline bool position_is_reachable(const xy_pos_t &pos) { return position_is_reachable(pos.x, pos.y); } diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index cd906c5d13..b7ff0ee932 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -564,10 +564,10 @@ class Planner { #if ENABLED(SKEW_CORRECTION) FORCE_INLINE static void skew(float &cx, float &cy, const float &cz) { - if (WITHIN(cx, X_MIN_POS + 1, X_MAX_POS) && WITHIN(cy, Y_MIN_POS + 1, Y_MAX_POS)) { + if (COORDINATE_OKAY(cx, X_MIN_POS + 1, X_MAX_POS) && COORDINATE_OKAY(cy, Y_MIN_POS + 1, Y_MAX_POS)) { const float sx = cx - cy * skew_factor.xy - cz * (skew_factor.xz - (skew_factor.xy * skew_factor.yz)), sy = cy - cz * skew_factor.yz; - if (WITHIN(sx, X_MIN_POS, X_MAX_POS) && WITHIN(sy, Y_MIN_POS, Y_MAX_POS)) { + if (COORDINATE_OKAY(sx, X_MIN_POS, X_MAX_POS) && COORDINATE_OKAY(sy, Y_MIN_POS, Y_MAX_POS)) { cx = sx; cy = sy; } } @@ -575,10 +575,10 @@ class Planner { FORCE_INLINE static void skew(xyz_pos_t &raw) { skew(raw.x, raw.y, raw.z); } FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) { - if (WITHIN(cx, X_MIN_POS, X_MAX_POS) && WITHIN(cy, Y_MIN_POS, Y_MAX_POS)) { + if (COORDINATE_OKAY(cx, X_MIN_POS, X_MAX_POS) && COORDINATE_OKAY(cy, Y_MIN_POS, Y_MAX_POS)) { const float sx = cx + cy * skew_factor.xy + cz * skew_factor.xz, sy = cy + cz * skew_factor.yz; - if (WITHIN(sx, X_MIN_POS, X_MAX_POS) && WITHIN(sy, Y_MIN_POS, Y_MAX_POS)) { + if (COORDINATE_OKAY(sx, X_MIN_POS, X_MAX_POS) && COORDINATE_OKAY(sy, Y_MIN_POS, Y_MAX_POS)) { cx = sx; cy = sy; } } diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index c8b214370c..6b3d990859 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -92,8 +92,8 @@ public: */ static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) - && WITHIN(rx, min_x() - fslop, max_x() + fslop) - && WITHIN(ry, min_y() - fslop, max_y() + fslop); + && COORDINATE_OKAY(rx, min_x() - fslop, max_x() + fslop) + && COORDINATE_OKAY(ry, min_y() - fslop, max_y() + fslop); } #endif @@ -206,8 +206,8 @@ public: #if IS_KINEMATIC return HYPOT2(x, y) <= sq(probe_radius(default_probe_xy_offset)); #else - return WITHIN(x, _min_x(default_probe_xy_offset) - fslop, _max_x(default_probe_xy_offset) + fslop) - && WITHIN(y, _min_y(default_probe_xy_offset) - fslop, _max_y(default_probe_xy_offset) + fslop); + return COORDINATE_OKAY(x, _min_x(default_probe_xy_offset) - fslop, _max_x(default_probe_xy_offset) + fslop) + && COORDINATE_OKAY(y, _min_y(default_probe_xy_offset) - fslop, _max_y(default_probe_xy_offset) + fslop); #endif } diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31-tests index 448a8860c7..cf01d27461 100755 --- a/buildroot/tests/teensy31-tests +++ b/buildroot/tests/teensy31-tests @@ -10,6 +10,14 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY31_32 exec_test $1 $2 "Teensy3.1 with default config" "$3" +# +# Zero endstops, as with a CNC +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY31_32 +opt_disable USE_XMIN_PLUG USE_YMIN_PLUG USE_ZMIN_PLUG +exec_test $1 $2 "Teensy3.1 with Zero Endstops" "$3" + # # Test many features together # From 362776c38de7ba8740d221c18f06332d6ae4e85d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 05:15:49 -0600 Subject: [PATCH 1051/1370] Tweak case light comment --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7ec81c6675..758639cfc0 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -522,7 +522,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) - //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm + //#define CASE_LIGHT_MAX_PWM 128 // Limit PWM duty cycle (0-255) //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light, requires NEOPIXEL_LED. From b71af6a50f179fbe6a0cd1d84896f9740bad2720 Mon Sep 17 00:00:00 2001 From: Katelyn Schiesser Date: Thu, 25 Feb 2021 06:14:24 -0800 Subject: [PATCH 1052/1370] Use 'H' value for UBL G29 z-clearance (#21114) --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 6ceb571ee2..044f6b610c 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -892,7 +892,7 @@ void unified_bed_leveling::shift_mesh_height() { const xyz_pos_t ppos = { mesh_index_to_xpos(lpos.x), mesh_index_to_ypos(lpos.y), - Z_CLEARANCE_BETWEEN_PROBES + z_clearance }; if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) @@ -907,7 +907,14 @@ void unified_bed_leveling::shift_mesh_height() { if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing - serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); + if (parser.seen('B')) { + serialprintPGM(GET_TEXT(MSG_UBL_BC_INSERT)); + LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); + } + else { + serialprintPGM(GET_TEXT(MSG_UBL_BC_INSERT2)); + LCD_MESSAGEPGM(MSG_UBL_BC_INSERT2); + } const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click From f3d15b995c81739ebfb4b55eab91d3af9292aa44 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 26 Feb 2021 03:15:55 +1300 Subject: [PATCH 1053/1370] Preflight checks for PlatformIO builds (#21068) Co-authored-by: Alexander D. Kanevskiy --- Marlin/src/pins/pins.h | 6 +- Marlin/src/pins/ramps/pins_ZRIB_V52.h | 1 + .../PlatformIO/scripts/common-dependencies.py | 11 ---- .../PlatformIO/scripts/preflight-checks.py | 62 +++++++++++++++++++ buildroot/tests/mega1280-tests | 4 +- platformio.ini | 1 + 6 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 buildroot/share/PlatformIO/scripts/preflight-checks.py diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index f5b80fd4d0..8f0215d4c8 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -481,9 +481,9 @@ #elif MB(MKS_ROBIN_MINI) #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini #elif MB(MKS_ROBIN_NANO) - #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano35 + #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano35 env:mks_robin_nano35_stm32 #elif MB(MKS_ROBIN_NANO_V2) - #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano35 + #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano35 env:mks_robin_nano35_stm32 #elif MB(MKS_ROBIN_LITE) #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite #elif MB(MKS_ROBIN_LITE3) @@ -513,7 +513,7 @@ #elif MB(BTT_SKR_E3_DIP) #include "stm32f1/pins_BTT_SKR_E3_DIP.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB #elif MB(BTT_SKR_CR6) - #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RC_btt_512K_USB + #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB #elif MB(JGAURORA_A5S_A1) #include "stm32f1/pins_JGAURORA_A5S_A1.h" // STM32F1 env:jgaurora_a5s_a1 #elif MB(FYSETC_AIO_II) diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V52.h b/Marlin/src/pins/ramps/pins_ZRIB_V52.h index 983c840bbc..f4db07ef8d 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V52.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V52.h @@ -46,6 +46,7 @@ #define E2_STEP_PIN 4 #define E2_DIR_PIN 5 #define E2_ENABLE_PIN 22 +#define HEATER_1_PIN 7 #include "pins_MKS_BASE_common.h" diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 4500f529a6..30e168d83f 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -312,16 +312,6 @@ def MarlinFeatureIsEnabled(env, feature): return some_on -# -# Check for Configfiles in two common incorrect places -# -def check_configfile_locations(): - for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: - for f in [ "Configuration.h", "Configuration_adv.h" ]: - if os.path.isfile(os.path.join(p, f)): - err = 'ERROR: Config files found in directory ' + str(p) + '. Please move them into the Marlin subdirectory.' - raise SystemExit(err) - # # Add a method for other PIO scripts to query enabled features # @@ -330,6 +320,5 @@ env.AddMethod(MarlinFeatureIsEnabled) # # Add dependencies for enabled Marlin features # -check_configfile_locations() apply_features_config() force_ignore_unused_libs() diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py new file mode 100644 index 0000000000..14807d954a --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -0,0 +1,62 @@ +# +# preflight-checks.py +# Script to check for common issues prior to compiling +# +import os +import re +Import("env") + +def get_envs_for_board(board): + if board.startswith("BOARD_"): + board = board[6:] + with open(os.path.join("Marlin", "src", "pins", "pins.h"),"r") as f: + board_found = "" + r=re.compile(r"if\s+MB\((.+)\)") + for line in f.readlines(): + mbs = r.findall(line) + if mbs: + board_found = board if board in re.split(r",\s*", mbs[0]) else "" + if board_found and "#include " in line and "env:" in line: + return re.findall(r"env:\w+", line) + return [] + +def check_envs(build_env, base_envs, config): + if build_env in base_envs: + return True + ext = config.get(build_env, 'extends', default=None) + if ext: + for ext_env in ext: + if check_envs(ext_env, base_envs, config): + return True + return False + +# Sanity checks: +if 'PIOENV' not in env: + raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") + +if 'MARLIN_FEATURES' not in env: + raise SystemExit("Error: this script should be used after common Marlin scripts") + +if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: + raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") + +build_env = env['PIOENV'] +motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] +base_envs = get_envs_for_board(motherboard) +config = env.GetProjectConfig() +result = check_envs("env:"+build_env, base_envs, config) + +if not result: + err = "Error: your selected build environment '%s' is not compatible with MOTHERBOARD=%s in Configuration.h. " \ + "Please use one of compatible build environments for this board: %s" % \ + (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) + raise SystemExit(err) + +# +# Check for Config files in two common incorrect places +# +for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p + raise SystemExit(err) diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index ac1b5f692d..9110e9feb6 100755 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -33,13 +33,13 @@ exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, Power Monitor, and LCD # Test DUAL_X_CARRIAGE # restore_configs -opt_set MOTHERBOARD BOARD_TT_OSCAR +opt_set MOTHERBOARD BOARD_ZRIB_V52 opt_set LCD_LANGUAGE pt opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 1 opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD opt_set REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 -exec_test $1 $2 "TT Oscar | DUAL_X_CARRIAGE" "$3" +exec_test $1 $2 "ZRIB_V52 | DUAL_X_CARRIAGE" "$3" # # Delta Config (generic) + Probeless diff --git a/platformio.ini b/platformio.ini index fab20018d9..c03b224533 100644 --- a/platformio.ini +++ b/platformio.ini @@ -212,6 +212,7 @@ default_src_filter = + - - + extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py + pre:buildroot/share/PlatformIO/scripts/preflight-checks.py post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = From 7240c2172bec3e800ce004c886f8535d41afdbc3 Mon Sep 17 00:00:00 2001 From: Katelyn Schiesser Date: Thu, 25 Feb 2021 06:28:27 -0800 Subject: [PATCH 1054/1370] PROBING_HEATERS_OFF sub-option WAIT_FOR_HOTEND (#20835) --- Marlin/Configuration.h | 1 + Marlin/src/module/motion.cpp | 7 ++++++- Marlin/src/module/probe.cpp | 4 ++++ Marlin/src/module/temperature.cpp | 11 +++++++++++ Marlin/src/module/temperature.h | 4 ++++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1c98168236..ea3385356a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1139,6 +1139,7 @@ //#define PROBING_HEATERS_OFF // Turn heaters off when probing #if ENABLED(PROBING_HEATERS_OFF) //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) + //#define WAIT_FOR_HOTEND // Wait for hotend to heat back up between probes (to improve accuracy & prevent cold extrude) #endif //#define PROBING_FANS_OFF // Turn fans off when probing //#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 10d3585a73..55973185ee 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1318,11 +1318,16 @@ void prepare_line_to_destination() { if (is_home_dir) { if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) { - #if ALL(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) + #if BOTH(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) // Wait for bed to heat back up between probing points thermalManager.wait_for_bed_heating(); #endif + #if BOTH(HAS_HOTEND, WAIT_FOR_HOTEND) + // Wait for the hotend to heat back up between probing points + thermalManager.wait_for_hotend_heating(active_extruder); + #endif + TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_probing_paused(true)); } diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 6df115225e..e59e514a06 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -478,6 +478,10 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { thermalManager.wait_for_bed_heating(); #endif + #if BOTH(HAS_TEMP_HOTEND, WAIT_FOR_HOTEND) + thermalManager.wait_for_hotend_heating(active_extruder); + #endif + if (TERN0(BLTOUCH_SLOW_MODE, bltouch.deploy())) return true; // Deploy in LOW SPEED MODE on every probe action // Disable stealthChop if used. Enable diag1 pin on driver. diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a220386b9e..e85e48c2d4 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -3447,6 +3447,17 @@ void Temperature::tick() { return false; } + #if ENABLED(WAIT_FOR_HOTEND) + void Temperature::wait_for_hotend_heating(const uint8_t target_extruder) { + if (isHeatingHotend(target_extruder)) { + SERIAL_ECHOLNPGM("Wait for hotend heating..."); + LCD_MESSAGEPGM(MSG_HEATING); + wait_for_hotend(target_extruder); + ui.reset_status(); + } + } + #endif + #endif // HAS_TEMP_HOTEND #if HAS_HEATED_BED diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 1019c10fad..5f5a076911 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -630,6 +630,10 @@ class Temperature { , const bool click_to_cancel=false #endif ); + + #if ENABLED(WAIT_FOR_HOTEND) + static void wait_for_hotend_heating(const uint8_t target_extruder); + #endif #endif FORCE_INLINE static bool still_heating(const uint8_t e) { From 00ceeeae7a083de25c24c27d1e03bb18c25f345d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 09:14:24 -0600 Subject: [PATCH 1055/1370] Eryone Thinker V2 (#21190) Co-Authored-By: Bryan Joshua Pedini --- Marlin/Makefile | 2 + Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/rambo/pins_RAMBO.h | 32 ++++++++--- Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h | 60 ++++++++++++++++++++ 5 files changed, 89 insertions(+), 8 deletions(-) create mode 100755 Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h diff --git a/Marlin/Makefile b/Marlin/Makefile index 49cb960b92..19c2d0b329 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -323,6 +323,8 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1203) else ifeq ($(HARDWARE_MOTHERBOARD),1204) # abee Scoovo X9H else ifeq ($(HARDWARE_MOTHERBOARD),1205) +# Rambo ThinkerV2 +else ifeq ($(HARDWARE_MOTHERBOARD),1206) # # Other ATmega1280, ATmega2560 diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 5a1df8bfa4..cfde52ddb9 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -126,6 +126,7 @@ #define BOARD_EINSY_RAMBO 1203 // Einsy Rambo #define BOARD_EINSY_RETRO 1204 // Einsy Retro #define BOARD_SCOOVO_X9H 1205 // abee Scoovo X9H +#define BOARD_RAMBO_THINKERV2 1206 // ThinkerV2 // // Other ATmega1280, ATmega2560 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 8f0215d4c8..11b42b1c32 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -207,6 +207,8 @@ #include "rambo/pins_EINSY_RETRO.h" // ATmega2560 env:rambo #elif MB(SCOOVO_X9H) #include "rambo/pins_SCOOVO_X9H.h" // ATmega2560 env:rambo +#elif MB(RAMBO_THINKERV2) + #include "rambo/pins_RAMBO_THINKERV2.h" // ATmega2560 env:rambo // // Other ATmega1280, ATmega2560 diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index be2317b146..65fc4b5af8 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -45,14 +45,20 @@ #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif -#define BOARD_INFO_NAME "Rambo" +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Rambo" +#endif // // Servos // -#define SERVO0_PIN 22 // Motor header MX1 +#ifndef SERVO0_PIN + #define SERVO0_PIN 22 // Motor header MX1 +#endif #define SERVO1_PIN 23 // Motor header MX2 -#define SERVO2_PIN 24 // Motor header MX3 +#ifndef SERVO2_PIN + #define SERVO2_PIN 24 // Motor header MX3 +#endif #define SERVO3_PIN 5 // PWM header pin 5 // @@ -62,7 +68,9 @@ #define X_MAX_PIN 24 #define Y_MIN_PIN 11 #define Y_MAX_PIN 23 -#define Z_MIN_PIN 10 +#ifndef Z_MIN_PIN + #define Z_MIN_PIN 10 +#endif #define Z_MAX_PIN 30 // @@ -135,8 +143,12 @@ #ifndef FAN_PIN #define FAN_PIN 8 #endif -#define FAN1_PIN 6 -#define FAN2_PIN 2 +#ifndef FAN1_PIN + #define FAN1_PIN 6 +#endif +#ifndef FAN2_PIN + #define FAN2_PIN 2 +#endif // // Misc. Functions @@ -220,8 +232,12 @@ #define BEEPER_PIN 79 // AUX-4 // AUX-2 - #define BTN_EN1 76 - #define BTN_EN2 77 + #ifndef BTN_EN1 + #define BTN_EN1 76 + #endif + #ifndef BTN_EN2 + #define BTN_EN2 77 + #endif #define BTN_ENC 78 #define SD_DETECT_PIN 81 diff --git a/Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h b/Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h new file mode 100755 index 0000000000..278a5bf0b4 --- /dev/null +++ b/Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h @@ -0,0 +1,60 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Rambo ThinkerV2 pin assignments + */ + +#define BOARD_INFO_NAME "Rambo ThinkerV2" + +#define SERVO0_PIN 4 // Motor header MX1 +#define SERVO2_PIN -1 // Motor header MX3 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 10 +#endif + +// Support BLTouch and fixed probes +#if ENABLED(BLTOUCH) + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define Z_MIN_PIN 22 + #elif !defined(Z_MIN_PROBE_PIN) + #define Z_MIN_PROBE_PIN 22 + #endif +#elif ENABLED(FIX_MOUNTED_PROBE) + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define Z_MIN_PIN 4 + #elif !defined(Z_MIN_PROBE_PIN) + #define Z_MIN_PROBE_PIN 4 + #endif +#endif + +// Eryone has the fan pins reversed +#define FAN1_PIN 2 +#define FAN2_PIN 6 + +// Encoder +#define BTN_EN1 64 +#define BTN_EN2 63 + +#include "pins_RAMBO.h" From 5fdab77cc22fdf4610f6e0f4ade64565522283ab Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Thu, 25 Feb 2021 16:21:17 +0100 Subject: [PATCH 1056/1370] Fix LEVEL_CORNERS_USE_PROBE with BLTOUCH_HS_MODE (#21161) --- Marlin/src/lcd/menu/menu_bed_corners.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 751be18600..505b31876a 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -269,12 +269,13 @@ static inline void _lcd_level_bed_corners_get_next_position() { do { ui.refresh(LCDVIEW_REDRAW_NOW); _lcd_draw_probing(); // update screen with # of good points - do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // clearance + do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP + TERN0(BLTOUCH_HS_MODE, 7)); // clearance _lcd_level_bed_corners_get_next_position(); // Select next corner coordinates current_position -= probe.offset_xy; // Account for probe offsets do_blocking_move_to_xy(current_position); // Goto corner + TERN_(BLTOUCH_HS_MODE, bltouch.deploy()); // Deploy in HIGH SPEED MODE if (!_lcd_level_bed_corners_probe()) { // Probe down to tolerance if (_lcd_level_bed_corners_raise()) { // Prompt user to raise bed if needed #if ENABLED(LEVEL_CORNERS_VERIFY_RAISED) // Verify @@ -295,6 +296,9 @@ static inline void _lcd_level_bed_corners_get_next_position() { } while (good_points < nr_edge_points); // loop until all points within tolerance + TERN_(BLTOUCH_HS_MODE, do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP)); // Do clearance in HIGH SPEED MODE at the very end + TERN_(BLTOUCH_HS_MODE, bltouch.stow()); // Stow in HIGH SPEED MODE at the very end + ui.goto_screen(_lcd_draw_level_prompt); // prompt for bed leveling ui.set_selection(true); } From 52c539ecedd02922d2a26d8a7b76b68fe8ccdc0f Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 25 Feb 2021 12:23:30 -0300 Subject: [PATCH 1057/1370] Zero Endstops followup (#21188) --- Marlin/src/module/motion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 55973185ee..e2613b0185 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1393,7 +1393,7 @@ void prepare_line_to_destination() { TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); } - #if ENABLED(TMC_HOME_PHASE) + #ifdef TMC_HOME_PHASE /** * Move the axis back to its home_phase if set and driver is capable (TMC) * From fc09581aa39279ebac8c7467b175436b592c2712 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Thu, 25 Feb 2021 17:09:00 +0100 Subject: [PATCH 1058/1370] Combine Z_AFTER_DEACTIVATE with UNKNOWN_Z_NO_RAISE (#20444) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 9 +++++++-- Marlin/Configuration_adv.h | 3 --- Marlin/src/gcode/calibrate/G28.cpp | 6 ++---- Marlin/src/inc/SanityCheck.h | 4 ++++ Marlin/src/module/motion.cpp | 13 +++++++++---- Marlin/src/module/motion.h | 2 +- Marlin/src/module/probe.cpp | 9 +-------- Marlin/src/module/probe.h | 4 ++-- Marlin/src/module/stepper/indirection.h | 4 ++-- buildroot/tests/STM32F103RC_btt-tests | 2 +- 10 files changed, 29 insertions(+), 27 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ea3385356a..b50c884b7e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -569,7 +569,6 @@ * the issues involved, don't use chamber PID until someone else verifies that your hardware works. */ //#define PIDTEMPCHAMBER - //#define CHAMBER_LIMIT_SWITCHING /** @@ -1196,7 +1195,13 @@ //#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed. Also enable HOME_AFTER_DEACTIVATE for extra safety. //#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated. Also enable NO_MOTION_BEFORE_HOMING for extra safety. -//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +/** + * Set Z_IDLE_HEIGHT if the Z-Axis moves on its own when steppers are disabled. + * - Use a low value (i.e., Z_MIN_POS) if the nozzle falls down to the bed. + * - Use a large value (i.e., Z_MAX_POS) if the bed falls down, away from the nozzle. + */ +//#define Z_IDLE_HEIGHT Z_HOME_POS //#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ... // Be sure to have this much clearance over your Z_MAX_POS to prevent grinding. diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 758639cfc0..d545869988 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -869,9 +869,6 @@ #define DISABLE_INACTIVE_Z true // Set 'false' if the nozzle could fall onto your printed part! #define DISABLE_INACTIVE_E true -// If the Nozzle or Bed falls when the Z stepper is disabled, set its resting position here. -//#define Z_AFTER_DEACTIVATE Z_HOME_POS - // Default Minimum Feedrates for printing and travel moves #define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. #define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 12f85f7054..c26340f1ab 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -326,14 +326,12 @@ void GcodeSuite::G28() { #endif - const float z_homing_height = TERN1(UNKNOWN_Z_NO_RAISE, axis_is_trusted(Z_AXIS)) - ? (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) - : 0; + const float z_homing_height = parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT; if (z_homing_height && (doX || doY || TERN0(Z_SAFE_HOMING, doZ))) { // Raise Z before homing any other axes and z is not already high enough (never lower z) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); - do_z_clearance(z_homing_height, axis_is_trusted(Z_AXIS), DISABLED(UNKNOWN_Z_NO_RAISE)); + do_z_clearance(z_homing_height); } #if ENABLED(QUICK_HOME) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d6d2a600a0..210848d80b 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -539,6 +539,10 @@ #endif #elif defined(ASSISTED_TRAMMING_MENU_ITEM) #error "ASSISTED_TRAMMING_MENU_ITEM is deprecated and should be removed." +#elif defined(UNKNOWN_Z_NO_RAISE) + #error "UNKNOWN_Z_NO_RAISE is replaced by setting Z_IDLE_HEIGHT to Z_MAX_POS." +#elif defined(Z_AFTER_DEACTIVATE) + #error "Z_AFTER_DEACTIVATE is replaced by Z_IDLE_HEIGHT." #endif /** diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index e2613b0185..3e79e7dabf 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -83,7 +83,13 @@ bool relative_mode; // = false; * Used by 'line_to_current_position' to do a move after changing it. * Used by 'sync_plan_position' to update 'planner.position'. */ -xyze_pos_t current_position = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; +xyze_pos_t current_position = { X_HOME_POS, Y_HOME_POS, + #ifdef Z_IDLE_HEIGHT + Z_IDLE_HEIGHT + #else + Z_HOME_POS + #endif +}; /** * Cartesian Destination @@ -494,9 +500,8 @@ void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRat do_blocking_move_to(raw.x, raw.y, z, fr_mm_s); } -void do_z_clearance(const float &zclear, const bool z_trusted/*=true*/, const bool raise_on_untrusted/*=true*/, const bool lower_allowed/*=false*/) { - const bool rel = raise_on_untrusted && !z_trusted; - float zdest = zclear + (rel ? current_position.z : 0.0f); +void do_z_clearance(const float &zclear, const bool lower_allowed/*=false*/) { + float zdest = zclear; if (!lower_allowed) NOLESS(zdest, current_position.z); do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), TERN(HAS_BED_PROBE, z_probe_fast_mm_s, homing_feedrate(Z_AXIS))); } diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 2a23636d71..c8fb2c639b 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -278,7 +278,7 @@ void remember_feedrate_and_scaling(); void remember_feedrate_scaling_off(); void restore_feedrate_and_scaling(); -void do_z_clearance(const float &zclear, const bool z_trusted=true, const bool raise_on_untrusted=true, const bool lower_allowed=false); +void do_z_clearance(const float &zclear, const bool lower_allowed=false); /** * Homing and Trusted Axes diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index e59e514a06..d29123bf4d 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -401,14 +401,7 @@ bool Probe::set_deployed(const bool deploy) { constexpr bool z_raise_wanted = true; #endif - // For beds that fall when Z is powered off only raise for trusted Z - #if ENABLED(UNKNOWN_Z_NO_RAISE) - const bool z_is_trusted = axis_is_trusted(Z_AXIS); - #else - constexpr float z_is_trusted = true; - #endif - - if (z_is_trusted && z_raise_wanted) + if (z_raise_wanted) do_z_raise(_MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 6b3d990859..df7bdd23a1 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -100,7 +100,7 @@ public: static void move_z_after_probing() { #ifdef Z_AFTER_PROBING - do_z_clearance(Z_AFTER_PROBING, true, true, true); // Move down still permitted + do_z_clearance(Z_AFTER_PROBING, true); // Move down still permitted #endif } static float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); @@ -120,7 +120,7 @@ public: static void move_z_after_homing() { #ifdef Z_AFTER_HOMING - do_z_clearance(Z_AFTER_HOMING, true, true, true); + do_z_clearance(Z_AFTER_HOMING, true); #elif BOTH(Z_AFTER_PROBING, HAS_BED_PROBE) move_z_after_probing(); #endif diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 4346e9d6cc..e72d793ca6 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -862,8 +862,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define ENABLE_AXIS_Z() if (SHOULD_ENABLE(z)) { ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); AFTER_CHANGE(z, true); } #define DISABLE_AXIS_Z() if (SHOULD_DISABLE(z)) { DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); AFTER_CHANGE(z, false); set_axis_untrusted(Z_AXIS); Z_RESET(); } -#ifdef Z_AFTER_DEACTIVATE - #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; sync_plan_position(); }while(0) +#ifdef Z_IDLE_HEIGHT + #define Z_RESET() do{ current_position.z = Z_IDLE_HEIGHT; sync_plan_position(); }while(0) #else #define Z_RESET() #endif diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests index 0084f59a0c..f500b76315 100755 --- a/buildroot/tests/STM32F103RC_btt-tests +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -17,7 +17,7 @@ opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2209 opt_set Z_DRIVER_TYPE TMC2209 opt_set E0_DRIVER_TYPE TMC2209 -opt_enable PINS_DEBUGGING +opt_enable PINS_DEBUGGING Z_IDLE_HEIGHT exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" From 13dee4d059a27dc2208939d5c657024094decd23 Mon Sep 17 00:00:00 2001 From: Vi B-P Date: Thu, 25 Feb 2021 11:23:17 -0500 Subject: [PATCH 1059/1370] Preheat Menu shortcut option (#20350) --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/inc/Conditionals_post.h | 4 ++++ Marlin/src/lcd/menu/menu_main.cpp | 8 ++++++++ Marlin/src/lcd/menu/menu_temperature.cpp | 22 +++++++++++++++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d545869988..0431b002f3 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1147,6 +1147,9 @@ #endif #endif + // Insert a menu for preheating at the top level to allow for quick access + //#define PREHEAT_SHORTCUT_MENU_ITEM + #endif // HAS_LCD_MENU #if HAS_DISPLAY diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 585d48de8c..6de98e2a0e 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2380,6 +2380,10 @@ #endif #endif +#if !PREHEAT_COUNT + #undef PREHEAT_SHORTCUT_MENU_ITEM +#endif + /** * Up to 3 PWM fans */ diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 878ac83a5a..1e864e35be 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -97,6 +97,10 @@ void menu_configuration(); void menu_spindle_laser(); #endif +#if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM) + void menu_preheat_only(); +#endif + #if HAS_MULTI_LANGUAGE void menu_language(); #endif @@ -177,6 +181,10 @@ void menu_main() { ACTION_ITEM(MSG_HOST_START_PRINT, host_action_start); #endif + #if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM) + SUBMENU(MSG_PREHEAT_CUSTOM, menu_preheat_only); + #endif + SUBMENU(MSG_MOTION, menu_motion); } diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 01c1f8f547..f347efe6db 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -226,7 +226,7 @@ void menu_temperature() { #if PREHEAT_COUNT // - // Preheat for Materials 1 to 5 + // Preheat for all Materials // LOOP_L_N(m, PREHEAT_COUNT) { editable.int8 = m; @@ -249,4 +249,24 @@ void menu_temperature() { END_MENU(); } +#if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM) + + void menu_preheat_only() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + LOOP_L_N(m, PREHEAT_COUNT) { + editable.int8 = m; + #if HOTENDS > 1 || HAS_HEATED_BED + SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); + #else + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); + #endif + } + + END_MENU(); + } + +#endif + #endif // HAS_LCD_MENU && HAS_TEMPERATURE From adf26fd69ecea53252cfe8d2e4600431c4cf0eb9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 10:24:58 -0600 Subject: [PATCH 1060/1370] Chamber followup --- Marlin/Configuration_adv.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0431b002f3..2846f9a675 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -151,12 +151,9 @@ #endif #if TEMP_SENSOR_CHAMBER - // Make sure you define where your heater is connected, the following works on a BTT SKR 1.4 Turbo - // using the secondary tool heater output. (FAN1 by default). - //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (SKR 1.4 Turbo specific) - //#define HEATER_CHAMBER_PIN P2_04 // Chamber heater on/off pin (HE1 connector on SKR 1.4 Turbo) - + //#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug) //#define HEATER_CHAMBER_INVERTING false + //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug) //#define CHAMBER_FAN // Enable a fan on the chamber #if ENABLED(CHAMBER_FAN) From 532dbb80641ab1c3e11226dc7f3e9e29a0c3daee Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Fri, 26 Feb 2021 23:54:46 +0100 Subject: [PATCH 1061/1370] Fix and improve G-code queue (#21122) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 6 + Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/core/bug_on.h | 37 ++ Marlin/src/core/language.h | 1 + Marlin/src/core/macros.h | 25 ++ Marlin/src/core/serial.cpp | 4 + Marlin/src/core/serial.h | 17 +- Marlin/src/feature/meatpack.cpp | 10 +- Marlin/src/feature/meatpack.h | 59 ++- Marlin/src/gcode/calibrate/M100.cpp | 78 ++-- Marlin/src/gcode/gcode.cpp | 27 +- Marlin/src/gcode/host/M110.cpp | 2 +- Marlin/src/gcode/host/M118.cpp | 4 +- Marlin/src/gcode/queue.cpp | 366 ++++++++---------- Marlin/src/gcode/queue.h | 99 +++-- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 4 +- docs/Queue.md | 59 +++ 20 files changed, 498 insertions(+), 308 deletions(-) create mode 100644 Marlin/src/core/bug_on.h create mode 100644 docs/Queue.md diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 2846f9a675..0cb78731eb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2016,6 +2016,12 @@ //#define SERIAL_STATS_DROPPED_RX #endif +// Monitor RX buffer usage +// Dump an error to the serial port if the serial receive buffer overflows. +// If you see these errors, increase the RX_BUFFER_SIZE value. +// Not supported on all platforms. +//#define RX_BUFFER_MONITOR + /** * Emergency Command Parser * diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index d523882d41..ad99a06eff 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -407,7 +407,7 @@ void startOrResumeJob() { */ inline void manage_inactivity(const bool ignore_stepper_queue=false) { - if (queue.length < BUFSIZE) queue.get_available_commands(); + queue.get_available_commands(); const millis_t ms = millis(); diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h new file mode 100644 index 0000000000..8869be8d28 --- /dev/null +++ b/Marlin/src/core/bug_on.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Copyright (c) 2021 X-Ryl669 [https://blog.cyril.by] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// We need SERIAL_ECHOPAIR and macros.h +#include "serial.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + // Useful macro for stopping the CPU on an unexpected condition + // This is used like SERIAL_ECHOPAIR, that is: a key-value call of the local variables you want + // to dump to the serial port before stopping the CPU. + #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) +#elif ENABLED(MARLIN_DEV_MODE) + // Don't stop the CPU here, but at least dump the bug on the serial port + #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": BUG!\n"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) +#else + // Release mode, let's ignore the bug + #define BUG_ON(V...) NOOP +#endif diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 6024e9be3e..c9c3fd0153 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -131,6 +131,7 @@ #define STR_WATCHDOG_FIRED "Watchdog timeout. Reset required." #define STR_ERR_KILLED "Printer halted. kill() called!" #define STR_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define STR_ERR_SERIAL_MISMATCH "Serial status mismatch" #define STR_BUSY_PROCESSING "busy: processing" #define STR_BUSY_PAUSED_FOR_USER "busy: paused for user" #define STR_BUSY_PAUSED_FOR_INPUT "busy: paused for input" diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 16e18ac902..9b07af3618 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -349,6 +349,31 @@ #define CALL_IF_EXISTS(Return, That, Method, ...) \ static_cast(Private::Call_ ## Method(That, ##__VA_ARGS__)) + // Compile-time string manipulation + namespace CompileTimeString { + // Simple compile-time parser to find the position of the end of a string + constexpr const char* findStringEnd(const char *str) { + return *str ? findStringEnd(str + 1) : str; + } + + // Check whether a string contains a slash + constexpr bool containsSlash(const char *str) { + return *str == '/' ? true : (*str ? containsSlash(str + 1) : false); + } + // Find the last position of the slash + constexpr const char* findLastSlashPos(const char* str) { + return *str == '/' ? (str + 1) : findLastSlashPos(str - 1); + } + // Compile-time evaluation of the last part of a file path + // Typically used to shorten the path to file in compiled strings + // CompileTimeString::baseName(__FILE__) returns "macros.h" and not /path/to/Marlin/src/core/macros.h + constexpr const char* baseName(const char* str) { + return containsSlash(str) ? findLastSlashPos(findStringEnd(str)) : str; + } + } + + #define ONLY_FILENAME CompileTimeString::baseName(__FILE__) + #else #define MIN_2(a,b) ((a)<(b)?(a):(b)) diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 31f6d67e32..01f850ba56 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -52,6 +52,10 @@ PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMST #endif #endif +#if ENABLED(MEATPACK) + MeatpackSerial mpSerial(false, _SERIAL_IMPL); +#endif + void serialprintPGM(PGM_P str) { while (const char c = pgm_read_byte(str++)) SERIAL_CHAR(c); } diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index f5c02f50b6..ec955a8dea 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -24,6 +24,10 @@ #include "../inc/MarlinConfig.h" #include "serial_hook.h" +#if ENABLED(MEATPACK) + #include "../feature/meatpack.h" +#endif + // Commonly-used strings in serial output extern const char NUL_STR[], SP_P_STR[], SP_T_STR[], X_STR[], Y_STR[], Z_STR[], E_STR[], @@ -69,12 +73,19 @@ extern uint8_t marlin_debug_flags; typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; #endif extern SerialOutputT multiSerial; - #define SERIAL_IMPL multiSerial + #define _SERIAL_IMPL multiSerial #else #define _PORT_REDIRECT(n,p) NOOP #define _PORT_RESTORE(n) NOOP #define SERIAL_ASSERT(P) NOOP - #define SERIAL_IMPL MYSERIAL0 + #define _SERIAL_IMPL MYSERIAL0 +#endif + +#if ENABLED(MEATPACK) + extern MeatpackSerial mpSerial; + #define SERIAL_IMPL mpSerial +#else + #define SERIAL_IMPL _SERIAL_IMPL #endif #define SERIAL_OUT(WHAT, V...) (void)SERIAL_IMPL.WHAT(V) @@ -294,7 +305,7 @@ void serialprintPGM(PGM_P str); #endif #define SERIAL_ECHOPGM_P(P) (serialprintPGM(P)) -#define SERIAL_ECHOLNPGM_P(P) (serialprintPGM(P "\n")) +#define SERIAL_ECHOLNPGM_P(P) do{ serialprintPGM(P); SERIAL_EOL(); }while(0) #define SERIAL_ECHOPGM(S) (serialprintPGM(PSTR(S))) #define SERIAL_ECHOLNPGM(S) (serialprintPGM(PSTR(S "\n"))) diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index cd6d8ce6b9..cb3979ea0a 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -110,7 +110,7 @@ void MeatPack::handle_rx_char_inner(const uint8_t c) { if (TEST(state, MPConfig_Bit_Active)) { // Is MeatPack active? if (!full_char_count) { // No literal characters to fetch? uint8_t buf[2] = { 0, 0 }; - register const uint8_t res = unpack_chars(c, buf); // Decode the byte into one or two characters. + const uint8_t res = unpack_chars(c, buf); // Decode the byte into one or two characters. if (res & kFirstCharIsLiteral) { // The 1st character couldn't be packed. ++full_char_count; // So the next stream byte is a full character. if (res & kSecondCharIsLiteral) ++full_char_count; // The 2nd character couldn't be packed. Another stream byte is a full character. @@ -147,9 +147,7 @@ void MeatPack::handle_output_char(const uint8_t c) { #if ENABLED(MP_DEBUG) if (chars_decoded < 1024) { ++chars_decoded; - DEBUG_ECHOPGM("RB: "); - MYSERIAL.print((char)c); - DEBUG_EOL(); + DEBUG_ECHOLNPAIR("RB: ", AS_CHAR(c)); } #endif } @@ -200,7 +198,7 @@ void MeatPack::handle_rx_char(const uint8_t c, const serial_index_t serial_ind) } if (cmd_is_next) { // Were two command bytes received? - PORT_REDIRECT(serial_ind); + PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); handle_command((MeatPack_Command)c); // Then the byte is a MeatPack command cmd_is_next = false; return; @@ -219,7 +217,7 @@ uint8_t MeatPack::get_result_char(char* const __restrict out) { if (char_out_count) { res = char_out_count; char_out_count = 0; - for (register uint8_t i = 0; i < res; ++i) + for (uint8_t i = 0; i < res; ++i) out[i] = (char)char_out_buf[i]; } return res; diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h index 2641130bd8..e30a5ac979 100644 --- a/Marlin/src/feature/meatpack.h +++ b/Marlin/src/feature/meatpack.h @@ -49,6 +49,7 @@ #pragma once #include +#include "../core/serial_hook.h" /** * Commands sent to MeatPack to control its behavior. @@ -78,8 +79,6 @@ enum MeatPack_ConfigStateBits : uint8_t { }; class MeatPack { -private: - friend class GCodeQueue; // Utility definitions static const uint8_t kCommandByte = 0b11111111, @@ -99,6 +98,7 @@ private: char_out_count; // Stores number of characters to be read out. static uint8_t char_out_buf[2]; // Output buffer for caching up to 2 characters +public: // Pass in a character rx'd by SD card or serial. Automatically parses command/ctrl sequences, // and will control state internally. static void handle_rx_char(const uint8_t c, const serial_index_t serial_ind); @@ -113,7 +113,6 @@ private: static void reset_state(); static void report_state(); - static uint8_t unpacked_char(register const uint8_t in); static uint8_t unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out); static void handle_command(const MeatPack_Command c); static void handle_output_char(const uint8_t c); @@ -121,3 +120,57 @@ private: }; extern MeatPack meatpack; + +// Implement the MeatPack serial class so it's transparent to rest of the code +template +struct MeatpackSerial : public SerialBase > { + typedef SerialBase< MeatpackSerial > BaseClassT; + + SerialT & out; + + char serialBuffer[2]; + uint8_t charCount; + uint8_t readIndex; + + NO_INLINE size_t write(uint8_t c) { return out.write(c); } + void flush() { out.flush(); } + void begin(long br) { out.begin(br); readIndex = 0; } + void end() { out.end(); } + + void msgDone() { out.msgDone(); } + // Existing instances implement Arduino's operator bool, so use that if it's available + bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } + void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + + int available(uint8_t index) { + // There is a potential issue here with multiserial, since it'll return its decoded buffer whatever the serial index here. + // So, instead of doing MeatpackSerial> we should do MultiSerial, MeatpackSerial<...>> + // TODO, let's fix this later on + + if (charCount) return charCount; // The buffer still has data + if (out.available(index) <= 0) return 0; // No data to read + + // Don't read in read method, instead do it here, so we can make progress in the read method + const int r = out.read(index); + if (r == -1) return 0; // This is an error from the underlying serial code + meatpack.handle_rx_char((uint8_t)r, index); + charCount = meatpack.get_result_char(serialBuffer); + readIndex = 0; + + return charCount; + } + + int readImpl(const uint8_t index) { + // Not enough char to make progress? + if (charCount == 0 && available(index) == 0) return -1; + + charCount--; + return serialBuffer[readIndex++]; + } + + int read(uint8_t index) { return readImpl(index); } + int available() { return available(0); } + int read() { return readImpl(0); } + + MeatpackSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} +}; diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index 9ac2380e79..ee572e033d 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -51,7 +51,7 @@ * Also, there are two support functions that can be called from a developer's C code. * * uint16_t check_for_free_memory_corruption(PGM_P const free_memory_start); - * void M100_dump_routine(PGM_P const title, const char * const start, const char * const end); + * void M100_dump_routine(PGM_P const title, const char * const start, const uintptr_t size); * * Initial version by Roxy-3D */ @@ -151,7 +151,7 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { * the block. If so, it may indicate memory corruption due to a bad pointer. * Unexpected bytes are flagged in the right column. */ - inline void dump_free_memory(char *start_free_memory, char *end_free_memory) { + void dump_free_memory(char *start_free_memory, char *end_free_memory) { // // Start and end the dump on a nice 16 byte boundary // (even though the values are not 16-byte aligned). @@ -182,12 +182,12 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { } } - void M100_dump_routine(PGM_P const title, const char * const start, const char * const end) { - serialprintPGM(title); - SERIAL_EOL(); + void M100_dump_routine(PGM_P const title, const char * const start, const uintptr_t size) { + SERIAL_ECHOLNPGM_P(title); // // Round the start and end locations to produce full lines of output // + const char * const end = start + size - 1; dump_free_memory( (char*)(uintptr_t(uint32_t(start) & ~0xFUL)), // Align to 16-byte boundary (char*)(uintptr_t(uint32_t(end) | 0xFUL)) // Align end_free_memory to the 15th byte (at or above end_free_memory) @@ -197,27 +197,27 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { #endif // M100_FREE_MEMORY_DUMPER inline int check_for_free_memory_corruption(PGM_P const title) { - serialprintPGM(title); + SERIAL_ECHOPGM_P(title); char *start_free_memory = free_memory_start, *end_free_memory = free_memory_end; int n = end_free_memory - start_free_memory; - SERIAL_ECHOPAIR("\nfmc() n=", n); - SERIAL_ECHOPAIR("\nfree_memory_start=", hex_address(free_memory_start)); - SERIAL_ECHOLNPAIR(" end_free_memory=", hex_address(end_free_memory)); + SERIAL_ECHOLNPAIR("\nfmc() n=", n, + "\nfree_memory_start=", hex_address(free_memory_start), + " end=", hex_address(end_free_memory)); if (end_free_memory < start_free_memory) { SERIAL_ECHOPGM(" end_free_memory < Heap "); - // SET_INPUT_PULLUP(63); // if the developer has a switch wired up to their controller board - // safe_delay(5); // this code can be enabled to pause the display as soon as the - // while ( READ(63)) // malfunction is detected. It is currently defaulting to a switch - // idle(); // being on pin-63 which is unassigend and available on most controller - // safe_delay(20); // boards. - // while ( !READ(63)) - // idle(); + //SET_INPUT_PULLUP(63); // if the developer has a switch wired up to their controller board + //safe_delay(5); // this code can be enabled to pause the display as soon as the + //while ( READ(63)) // malfunction is detected. It is currently defaulting to a switch + // idle(); // being on pin-63 which is unassigend and available on most controller + //safe_delay(20); // boards. + //while ( !READ(63)) + // idle(); serial_delay(20); #if ENABLED(M100_FREE_MEMORY_DUMPER) - M100_dump_routine(PSTR(" Memory corruption detected with end_free_memory 8) { - // SERIAL_ECHOPAIR("Found ", j); - // SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(start_free_memory + i)); + //SERIAL_ECHOPAIR("Found ", j); + //SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(start_free_memory + i)); i += j; block_cnt++; - SERIAL_ECHOPAIR(" (", block_cnt); - SERIAL_ECHOPAIR(") found=", j); - SERIAL_ECHOLNPGM(" "); + SERIAL_ECHOLNPAIR(" (", block_cnt, ") found=", j); } } } @@ -269,8 +267,7 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ if (*addr == TEST_BYTE) { const int32_t j = count_test_bytes(addr); if (j > 8) { - SERIAL_ECHOPAIR("Found ", j); - SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(addr)); + SERIAL_ECHOLNPAIR("Found ", j, " bytes free at ", hex_address(addr)); if (j > max_cnt) { max_cnt = j; max_addr = addr; @@ -280,11 +277,10 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ } } } - if (block_cnt > 1) { - SERIAL_ECHOLNPGM("\nMemory Corruption detected in free memory area."); - SERIAL_ECHOPAIR("\nLargest free block is ", max_cnt); - SERIAL_ECHOLNPAIR(" bytes at ", hex_address(max_addr)); - } + if (block_cnt > 1) SERIAL_ECHOLNPAIR( + "\nMemory Corruption detected in free memory area." + "\nLargest free block is ", max_cnt, " bytes at ", hex_address(max_addr) + ); SERIAL_ECHOLNPAIR("check_for_free_memory_corruption() = ", check_for_free_memory_corruption(PSTR("M100 F "))); } @@ -294,12 +290,12 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ * Corrupt locations in the free memory pool and report the corrupt addresses. * This is useful to check the correctness of the M100 D and the M100 F commands. */ - inline void corrupt_free_memory(char *start_free_memory, const uint32_t size) { + inline void corrupt_free_memory(char *start_free_memory, const uintptr_t size) { start_free_memory += 8; const uint32_t near_top = top_of_stack() - start_free_memory - 250, // -250 to avoid interrupt activity that's altered the stack. j = near_top / (size + 1); - SERIAL_ECHOLNPGM("Corrupting free memory block.\n"); + SERIAL_ECHOLNPGM("Corrupting free memory block."); for (uint32_t i = 1; i <= size; i++) { char * const addr = start_free_memory + i * j; *addr = i; @@ -322,8 +318,8 @@ inline void init_free_memory(char *start_free_memory, int32_t size) { return; } - start_free_memory += 8; // move a few bytes away from the heap just because we don't want - // to be altering memory that close to it. + start_free_memory += 8; // move a few bytes away from the heap just because we + // don't want to be altering memory that close to it. memset(start_free_memory, TEST_BYTE, size); SERIAL_ECHO(size); @@ -342,16 +338,16 @@ inline void init_free_memory(char *start_free_memory, int32_t size) { * M100: Free Memory Check */ void GcodeSuite::M100() { - char *sp = top_of_stack(); if (!free_memory_end) free_memory_end = sp - MEMORY_END_CORRECTION; - SERIAL_ECHOPAIR("\nbss_end : ", hex_address(end_bss)); - if (heaplimit) SERIAL_ECHOPAIR("\n__heaplimit : ", hex_address(heaplimit)); - SERIAL_ECHOPAIR("\nfree_memory_start : ", hex_address(free_memory_start)); + SERIAL_ECHOPAIR("\nbss_end : ", hex_address(end_bss)); + if (heaplimit) SERIAL_ECHOPAIR("\n__heaplimit : ", hex_address(heaplimit)); + SERIAL_ECHOPAIR("\nfree_memory_start : ", hex_address(free_memory_start)); if (stacklimit) SERIAL_ECHOPAIR("\n__stacklimit : ", hex_address(stacklimit)); - SERIAL_ECHOPAIR("\nfree_memory_end : ", hex_address(free_memory_end)); - if (MEMORY_END_CORRECTION) SERIAL_ECHOPAIR("\nMEMORY_END_CORRECTION: ", MEMORY_END_CORRECTION); - SERIAL_ECHOLNPAIR("\nStack Pointer : ", hex_address(sp)); + SERIAL_ECHOPAIR("\nfree_memory_end : ", hex_address(free_memory_end)); + if (MEMORY_END_CORRECTION) + SERIAL_ECHOPAIR("\nMEMORY_END_CORRECTION : ", MEMORY_END_CORRECTION); + SERIAL_ECHOLNPAIR("\nStack Pointer : ", hex_address(sp)); // Always init on the first invocation of M100 static bool m100_not_initialized = true; @@ -369,10 +365,8 @@ void GcodeSuite::M100() { return free_memory_pool_report(free_memory_start, free_memory_end - free_memory_start); #if ENABLED(M100_FREE_MEMORY_CORRUPTOR) - if (parser.seen('C')) return corrupt_free_memory(free_memory_start, parser.value_int()); - #endif } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index a410ad90a4..d7535dd4ff 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -260,13 +260,6 @@ void GcodeSuite::dwell(millis_t time) { #endif // HAS_LEVELING && G29_RETRY_AND_RECOVER -// -// Placeholders for non-migrated codes -// -#if ENABLED(M100_FREE_MEMORY_WATCHER) - extern void M100_dump_routine(PGM_P const title, const char * const start, const char * const end); -#endif - /** * Process the parsed command and dispatch it to its handler */ @@ -994,30 +987,32 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { SERIAL_OUT(msgDone); // Call the msgDone serial hook to signal command processing done } +#if ENABLED(M100_FREE_MEMORY_DUMPER) + void M100_dump_routine(PGM_P const title, const char * const start, const uintptr_t size); +#endif + /** * Process a single command and dispatch it to its handler * This is called from the main loop() */ void GcodeSuite::process_next_command() { - char * const current_command = queue.command_buffer[queue.index_r]; + GCodeQueue::CommandLine &command = queue.ring_buffer.peek_next_command(); - PORT_REDIRECT(SERIAL_PORTMASK(queue.port[queue.index_r])); + PORT_REDIRECT(SERIAL_PORTMASK(command.port)); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.queue_index_r = queue.index_r; - #endif + TERN_(POWER_LOSS_RECOVERY, recovery.queue_index_r = queue.ring_buffer.index_r); if (DEBUGGING(ECHO)) { SERIAL_ECHO_START(); - SERIAL_ECHOLN(current_command); + SERIAL_ECHOLN(command.buffer); #if ENABLED(M100_FREE_MEMORY_DUMPER) - SERIAL_ECHOPAIR("slot:", queue.index_r); - M100_dump_routine(PSTR(" Command Queue:"), &queue.command_buffer[0][0], &queue.command_buffer[BUFSIZE - 1][MAX_CMD_SIZE - 1]); + SERIAL_ECHOPAIR("slot:", queue.ring_buffer.index_r); + M100_dump_routine(PSTR(" Command Queue:"), (const char*)&queue.ring_buffer, sizeof(queue.ring_buffer)); #endif } // Parse the next command in the queue - parser.parse(current_command); + parser.parse(command.buffer); process_parsed_command(); } diff --git a/Marlin/src/gcode/host/M110.cpp b/Marlin/src/gcode/host/M110.cpp index b12b38ea0f..2634b19897 100644 --- a/Marlin/src/gcode/host/M110.cpp +++ b/Marlin/src/gcode/host/M110.cpp @@ -29,6 +29,6 @@ void GcodeSuite::M110() { if (parser.seenval('N')) - queue.last_N[queue.command_port()] = parser.value_long(); + queue.set_current_line_number(parser.value_long()); } diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index ef3c293742..9982492f93 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -52,9 +52,7 @@ void GcodeSuite::M118() { while (*p == ' ') ++p; } - #if HAS_MULTI_SERIAL - PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? _BV(port - 1) : SERIAL_ALL) : multiSerial.portMask); - #endif + PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? SERIAL_PORTMASK(port - 1) : SERIAL_ALL) : multiSerial.portMask); if (hasE) SERIAL_ECHO_START(); if (hasA) SERIAL_ECHOPGM("//"); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 8c9e9afdc1..f28c0586d9 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -35,6 +35,7 @@ GCodeQueue queue; #include "../module/planner.h" #include "../module/temperature.h" #include "../MarlinCore.h" +#include "../core/bug_on.h" #if ENABLED(PRINTER_EVENT_LEDS) #include "../feature/leds/printer_event_leds.h" @@ -48,10 +49,6 @@ GCodeQueue queue; #include "../feature/binary_stream.h" #endif -#if ENABLED(MEATPACK) - #include "../feature/meatpack.h" -#endif - #if ENABLED(POWER_LOSS_RECOVERY) #include "../feature/powerloss.h" #endif @@ -67,44 +64,17 @@ PGMSTR(G28_STR, "G28"); static millis_t last_command_time = 0; #endif -/** - * GCode line number handling. Hosts may opt to include line numbers when - * sending commands to Marlin, and lines will be checked for sequentiality. - * M110 N sets the current line number. - */ -long GCodeQueue::last_N[NUM_SERIAL]; +GCodeQueue::SerialState GCodeQueue::serial_state[NUM_SERIAL] = { 0 }; +GCodeQueue::RingBuffer GCodeQueue::ring_buffer = { 0 }; -/** - * GCode Command Queue - * A simple ring buffer of BUFSIZE command strings. - * - * Commands are copied into this buffer by the command injectors - * (immediate, serial, sd card) and they are processed sequentially by - * the main loop. The gcode.process_next_command method parses the next - * command and hands off execution to individual handler functions. - */ -uint8_t GCodeQueue::length = 0, // Count of commands in the queue - GCodeQueue::index_r = 0, // Ring buffer read position - GCodeQueue::index_w = 0; // Ring buffer write position - -char GCodeQueue::command_buffer[BUFSIZE][MAX_CMD_SIZE]; - -/* - * The port that the command was received on - */ -#if HAS_MULTI_SERIAL - serial_index_t GCodeQueue::port[BUFSIZE]; +#if NO_TIMEOUTS > 0 + static millis_t last_command_time = 0; #endif /** * Serial command injection */ -// Number of characters read in the current line of serial input -static int serial_count[NUM_SERIAL] = { 0 }; - -bool send_ok[BUFSIZE]; - /** * Next Injected PROGMEM Command pointer. (nullptr == empty) * Internal commands are enqueued ahead of serial / SD commands. @@ -116,38 +86,16 @@ PGM_P GCodeQueue::injected_commands_P; // = nullptr */ char GCodeQueue::injected_commands[64]; // = { 0 } -GCodeQueue::GCodeQueue() { - // Send "ok" after commands by default - LOOP_L_N(i, COUNT(send_ok)) send_ok[i] = true; -} -/** - * Check whether there are any commands yet to be executed - */ -bool GCodeQueue::has_commands_queued() { - return queue.length || injected_commands_P || injected_commands[0]; -} - -/** - * Clear the Marlin command queue - */ -void GCodeQueue::clear() { - index_r = index_w = length = 0; -} - -/** - * Once a new command is in the ring buffer, call this to commit it - */ -void GCodeQueue::_commit_command(bool say_ok +void GCodeQueue::RingBuffer::commit_command(bool skip_ok #if HAS_MULTI_SERIAL , serial_index_t serial_ind/*=-1*/ #endif ) { - send_ok[index_w] = say_ok; - TERN_(HAS_MULTI_SERIAL, port[index_w] = serial_ind); + commands[index_w].skip_ok = skip_ok; + TERN_(HAS_MULTI_SERIAL, commands[index_w].port = serial_ind); TERN_(POWER_LOSS_RECOVERY, recovery.commit_sdpos(index_w)); - if (++index_w >= BUFSIZE) index_w = 0; - length++; + advance_pos(index_w, 1); } /** @@ -155,14 +103,14 @@ void GCodeQueue::_commit_command(bool say_ok * Return true if the command was successfully added. * Return false for a full buffer, or if the 'command' is a comment. */ -bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/ +bool GCodeQueue::RingBuffer::enqueue(const char* cmd, bool skip_ok/*=true*/ #if HAS_MULTI_SERIAL , serial_index_t serial_ind/*=-1*/ #endif ) { if (*cmd == ';' || length >= BUFSIZE) return false; - strcpy(command_buffer[index_w], cmd); - _commit_command(say_ok + strcpy(commands[index_w].buffer, cmd); + commit_command(skip_ok #if HAS_MULTI_SERIAL , serial_ind #endif @@ -175,14 +123,11 @@ bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/ * Return true if the command was consumed */ bool GCodeQueue::enqueue_one(const char* cmd) { - - //SERIAL_ECHOPGM("enqueue_one(\""); - //SERIAL_ECHO(cmd); - //SERIAL_ECHOPGM("\") \n"); + //SERIAL_ECHOLNPAIR("enqueue_one(\"", cmd, "\")"); if (*cmd == 0 || ISEOL(*cmd)) return true; - if (_enqueue(cmd)) { + if (ring_buffer.enqueue(cmd)) { SERIAL_ECHO_MSG(STR_ENQUEUEING, cmd, "\""); return true; } @@ -260,7 +205,7 @@ bool GCodeQueue::enqueue_one_P(PGM_P const pgcode) { char cmd[i + 1]; memcpy_P(cmd, p, i); cmd[i] = '\0'; - return _enqueue(cmd); + return ring_buffer.enqueue(cmd); } /** @@ -291,20 +236,21 @@ void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { * P Planner space remaining * B Block queue space remaining */ -void GCodeQueue::ok_to_send() { +void GCodeQueue::RingBuffer::ok_to_send() { #if NO_TIMEOUTS > 0 // Start counting from the last command's execution last_command_time = millis(); #endif + CommandLine &command = commands[index_r]; #if HAS_MULTI_SERIAL - const serial_index_t serial_ind = command_port(); + const serial_index_t serial_ind = command.port; if (serial_ind < 0) return; PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif - if (!send_ok[index_r]) return; + if (command.skip_ok) return; SERIAL_ECHOPGM(STR_OK); #if ENABLED(ADVANCED_OK) - char* p = command_buffer[index_r]; + char* p = command.buffer; if (*p == 'N') { SERIAL_CHAR(' ', *p++); while (NUMERIC_SIGNED(*p)) @@ -321,27 +267,40 @@ void GCodeQueue::ok_to_send() { * indicate that a command needs to be re-sent. */ void GCodeQueue::flush_and_request_resend() { - const serial_index_t serial_ind = command_port(); + const serial_index_t serial_ind = ring_buffer.command_port(); #if HAS_MULTI_SERIAL if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif SERIAL_FLUSH(); SERIAL_ECHOPGM(STR_RESEND); - SERIAL_ECHOLN(last_N[serial_ind] + 1); - ok_to_send(); + SERIAL_ECHOLN(serial_state[serial_ind].last_N + 1); } - // Multiserial already handle the dispatch to/from multiple port by itself inline bool serial_data_available(uint8_t index = SERIAL_ALL) { if (index == SERIAL_ALL) { for (index = 0; index < NUM_SERIAL; index++) { - if (SERIAL_IMPL.available(index) > 0) return true; + const int a = SERIAL_IMPL.available(index); + #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) + if (a > RX_BUFFER_SIZE - 2) { + PORT_REDIRECT(SERIAL_PORTMASK(index)); + SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a); + } + #endif + if (a > 0) return true; } return false; } - return SERIAL_IMPL.available(index) > 0; + const int a = SERIAL_IMPL.available(index); + #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) + if (a > RX_BUFFER_SIZE - 2) { + PORT_REDIRECT(SERIAL_PORTMASK(index)); + SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a); + } + #endif + + return a > 0; } inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } @@ -349,11 +308,11 @@ inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command SERIAL_ERROR_START(); - serialprintPGM(err); - SERIAL_ECHOLN(last_N[serial_ind]); - while (read_serial(serial_ind) != -1); // Clear out the RX buffer + SERIAL_ECHOPGM_P(err); + SERIAL_ECHOLN(serial_state[serial_ind].last_N); + while (read_serial(serial_ind) != -1) { /* nada */ } // Clear out the RX buffer. Why don't use flush here ? flush_and_request_resend(); - serial_count[serial_ind] = 0; + serial_state[serial_ind].count = 0; } FORCE_INLINE bool is_M29(const char * const cmd) { // matches "M29" & "M29 ", but not "M290", etc @@ -440,10 +399,6 @@ inline bool process_line_done(uint8_t &sis, char (&buff)[MAX_CMD_SIZE], int &ind * left on the serial port. */ void GCodeQueue::get_serial_commands() { - static char serial_line_buffer[NUM_SERIAL][MAX_CMD_SIZE]; - - static uint8_t serial_input_state[NUM_SERIAL] = { PS_NORMAL }; - #if ENABLED(BINARY_FILE_TRANSFER) if (card.flag.binary_mode) { /** @@ -451,7 +406,7 @@ void GCodeQueue::get_serial_commands() { * receive buffer (which limits the packet size to MAX_CMD_SIZE). * The receive buffer also limits the packet size for reliable transmission. */ - binaryStream[card.transfer_port_index].receive(serial_line_buffer[card.transfer_port_index]); + binaryStream[card.transfer_port_index].receive(serial_state[card.transfer_port_index].line_buffer); return; } #endif @@ -460,122 +415,140 @@ void GCodeQueue::get_serial_commands() { // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 const millis_t ms = millis(); - if (length == 0 && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + if (ring_buffer.empty() && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); last_command_time = ms; } #endif - /** - * Loop while serial characters are incoming and the queue is not full - */ - while (length < BUFSIZE && serial_data_available()) { + // Loop while serial characters are incoming and the queue is not full + for (bool hadData = true; hadData;) { + // Unless a serial port has data, this will exit on next iteration + hadData = false; + LOOP_L_N(p, NUM_SERIAL) { + // Check if the queue is full and exit if it is. + if (ring_buffer.full()) return; + + // No data for this port ? Skip it + if (!serial_data_available(p)) continue; + + // Ok, we have some data to process, let's make progress here + hadData = true; const int c = read_serial(p); - if (c < 0) continue; + if (c < 0) { + // This should never happen, let's log it + PORT_REDIRECT(SERIAL_PORTMASK(p)); // Reply to the serial port that sent the command + // Crash here to get more information why it failed + BUG_ON("SP available but read -1"); + SERIAL_ERROR_MSG(STR_ERR_SERIAL_MISMATCH); + SERIAL_FLUSH(); + continue; + } - #if ENABLED(MEATPACK) - meatpack.handle_rx_char(uint8_t(c), p); - char c_res[2] = { 0, 0 }; - const uint8_t char_count = meatpack.get_result_char(c_res); - #else - constexpr uint8_t char_count = 1; - #endif + const char serial_char = (char)c; + SerialState &serial = serial_state[p]; - LOOP_L_N(char_index, char_count) { - const char serial_char = TERN(MEATPACK, c_res[char_index], c); + if (ISEOL(serial_char)) { - if (ISEOL(serial_char)) { + // Reset our state, continue if the line was empty + if (process_line_done(serial.input_state, serial.line_buffer, serial.count)) + continue; - // Reset our state, continue if the line was empty - if (process_line_done(serial_input_state[p], serial_line_buffer[p], serial_count[p])) - continue; + char* command = serial.line_buffer; - char* command = serial_line_buffer[p]; + while (*command == ' ') command++; // Skip leading spaces + char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line - while (*command == ' ') command++; // Skip leading spaces - char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line + if (npos) { - if (npos) { + const bool M110 = !!strstr_P(command, PSTR("M110")); - const bool M110 = !!strstr_P(command, PSTR("M110")); - - if (M110) { - char* n2pos = strchr(command + 4, 'N'); - if (n2pos) npos = n2pos; - } - - const long gcode_N = strtol(npos + 1, nullptr, 10); - - if (gcode_N != last_N[p] + 1 && !M110) - return gcode_line_error(PSTR(STR_ERR_LINE_NO), p); - - char *apos = strrchr(command, '*'); - if (apos) { - uint8_t checksum = 0, count = uint8_t(apos - command); - while (count) checksum ^= command[--count]; - if (strtol(apos + 1, nullptr, 10) != checksum) - return gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), p); - } - else - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); - - last_N[p] = gcode_N; - } - #if ENABLED(SDSUPPORT) - // Pronterface "M29" and "M29 " has no line number - else if (card.flag.saving && !is_M29(command)) - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); - #endif - - // - // Movement commands give an alert when the machine is stopped - // - - if (IsStopped()) { - char* gpos = strchr(command, 'G'); - if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { - case 0: case 1: - #if ENABLED(ARC_SUPPORT) - case 2: case 3: - #endif - #if ENABLED(BEZIER_CURVE_SUPPORT) - case 5: - #endif - PORT_REDIRECT(SERIAL_PORTMASK(p)); // Reply to the serial port that sent the command - SERIAL_ECHOLNPGM(STR_ERR_STOPPED); - LCD_MESSAGEPGM(MSG_STOPPED); - break; - } - } + if (M110) { + char* n2pos = strchr(command + 4, 'N'); + if (n2pos) npos = n2pos; } - #if DISABLED(EMERGENCY_PARSER) - // Process critical commands early - if (command[0] == 'M') switch (command[3]) { - case '8': if (command[2] == '0' && command[1] == '1') { wait_for_heatup = false; TERN_(HAS_LCD_MENU, wait_for_user = false); } break; - case '2': if (command[2] == '1' && command[1] == '1') kill(M112_KILL_STR, nullptr, true); break; - case '0': if (command[1] == '4' && command[2] == '1') quickstop_stepper(); break; + const long gcode_N = strtol(npos + 1, nullptr, 10); + + if (gcode_N != serial.last_N + 1 && !M110) { + // In case of error on a serial port, don't prevent other serial port from making progress + gcode_line_error(PSTR(STR_ERR_LINE_NO), p); + break; + } + + char *apos = strrchr(command, '*'); + if (apos) { + uint8_t checksum = 0, count = uint8_t(apos - command); + while (count) checksum ^= command[--count]; + if (strtol(apos + 1, nullptr, 10) != checksum) { + // In case of error on a serial port, don't prevent other serial port from making progress + gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), p); + break; } - #endif + } + else { + // In case of error on a serial port, don't prevent other serial port from making progress + gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); + break; + } - #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 - last_command_time = ms; - #endif - - // Add the command to the queue - _enqueue(serial_line_buffer[p], true - #if HAS_MULTI_SERIAL - , p - #endif - ); + serial.last_N = gcode_N; } - else - process_stream_char(serial_char, serial_input_state[p], serial_line_buffer[p], serial_count[p]); + #if ENABLED(SDSUPPORT) + // Pronterface "M29" and "M29 " has no line number + else if (card.flag.saving && !is_M29(command)) { + gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); + break; + } + #endif - } // char_count loop + // + // Movement commands give an alert when the machine is stopped + // + + if (IsStopped()) { + char* gpos = strchr(command, 'G'); + if (gpos) { + switch (strtol(gpos + 1, nullptr, 10)) { + case 0: case 1: + #if ENABLED(ARC_SUPPORT) + case 2: case 3: + #endif + #if ENABLED(BEZIER_CURVE_SUPPORT) + case 5: + #endif + PORT_REDIRECT(SERIAL_PORTMASK(p)); // Reply to the serial port that sent the command + SERIAL_ECHOLNPGM(STR_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + break; + } + } + } + + #if DISABLED(EMERGENCY_PARSER) + // Process critical commands early + if (command[0] == 'M') switch (command[3]) { + case '8': if (command[2] == '0' && command[1] == '1') { wait_for_heatup = false; TERN_(HAS_LCD_MENU, wait_for_user = false); } break; + case '2': if (command[2] == '1' && command[1] == '1') kill(M112_KILL_STR, nullptr, true); break; + case '0': if (command[1] == '4' && command[2] == '1') quickstop_stepper(); break; + } + #endif + + #if NO_TIMEOUTS > 0 + last_command_time = ms; + #endif + + // Add the command to the queue + ring_buffer.enqueue(serial.line_buffer, false + #if HAS_MULTI_SERIAL + , p + #endif + ); + } + else + process_stream_char(serial_char, serial.input_state, serial.line_buffer, serial.count); } // NUM_SERIAL loop } // queue has space, serial has data @@ -595,33 +568,35 @@ void GCodeQueue::get_serial_commands() { if (!IS_SD_PRINTING()) return; int sd_count = 0; - while (length < BUFSIZE && !card.eof()) { + while (!ring_buffer.full() && !card.eof()) { const int16_t n = card.get(); const bool card_eof = card.eof(); if (n < 0 && !card_eof) { SERIAL_ERROR_MSG(STR_SD_ERR_READ); continue; } + CommandLine &command = ring_buffer.commands[ring_buffer.index_w]; const char sd_char = (char)n; const bool is_eol = ISEOL(sd_char); if (is_eol || card_eof) { + // Reset stream state, terminate the buffer, and commit a non-empty command if (!is_eol && sd_count) ++sd_count; // End of file with no newline - if (!process_line_done(sd_input_state, command_buffer[index_w], sd_count)) { + if (!process_line_done(sd_input_state, command.buffer, sd_count)) { // M808 L saves the sdpos of the next line. M808 loops to a new sdpos. - TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command_buffer[index_w])); + TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command.buffer)); // Put the new command into the buffer (no "ok" sent) - _commit_command(false); + ring_buffer.commit_command(true); - // Prime Power-Loss Recovery for the NEXT _commit_command + // Prime Power-Loss Recovery for the NEXT commit_command TERN_(POWER_LOSS_RECOVERY, recovery.cmd_sdpos = card.getIndex()); } if (card.eof()) card.fileHasFinished(); // Handle end of file reached } else - process_stream_char(sd_char, sd_input_state, command_buffer[index_w], sd_count); + process_stream_char(sd_char, sd_input_state, command.buffer, sd_count); } } @@ -634,6 +609,7 @@ void GCodeQueue::get_serial_commands() { * - The SD card file being actively printed */ void GCodeQueue::get_available_commands() { + if (ring_buffer.full()) return; get_serial_commands(); @@ -649,13 +625,13 @@ void GCodeQueue::advance() { if (process_injected_command_P() || process_injected_command()) return; // Return if the G-code buffer is empty - if (!length) return; + if (ring_buffer.empty()) return; #if ENABLED(SDSUPPORT) if (card.flag.saving) { - char* command = command_buffer[index_r]; - if (is_M29(command)) { + char * const cmd = ring_buffer.peek_next_command_string(); + if (is_M29(cmd)) { // M29 closes the file card.closefile(); SERIAL_ECHOLNPGM(STR_FILE_SAVED); @@ -673,7 +649,7 @@ void GCodeQueue::advance() { } else { // Write the string from the read buffer to SD - card.write_command(command); + card.write_command(cmd); if (card.flag.logging) gcode.process_next_command(); // The card is saving because it's logging else @@ -690,7 +666,5 @@ void GCodeQueue::advance() { #endif // SDSUPPORT // The queue may be reset by a command handler or by code invoked by idle() within a handler - --length; - if (++index_r >= BUFSIZE) index_r = 0; - + ring_buffer.advance_pos(ring_buffer.index_r, -1); } diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index d677146a7d..778f9a7f67 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -31,41 +31,84 @@ class GCodeQueue { public: /** - * GCode line number handling. Hosts may include line numbers when sending - * commands to Marlin, and lines will be checked for sequentiality. - * M110 N sets the current line number. + * The buffers per serial port. */ + struct SerialState { + /** + * GCode line number handling. Hosts may include line numbers when sending + * commands to Marlin, and lines will be checked for sequentiality. + * M110 N sets the current line number. + */ + long last_N; + int count; //!< Number of characters read in the current line of serial input + char line_buffer[MAX_CMD_SIZE]; //!< The current line accumulator + uint8_t input_state; //!< The input state + }; - static long last_N[NUM_SERIAL]; + static SerialState serial_state[NUM_SERIAL]; //!< Serial states for each serial port /** * GCode Command Queue - * A simple ring buffer of BUFSIZE command strings. + * A simple (circular) ring buffer of BUFSIZE command strings. * * Commands are copied into this buffer by the command injectors * (immediate, serial, sd card) and they are processed sequentially by * the main loop. The gcode.process_next_command method parses the next * command and hands off execution to individual handler functions. */ - static uint8_t length, // Count of commands in the queue - index_r; // Ring buffer read position - - static char command_buffer[BUFSIZE][MAX_CMD_SIZE]; + struct CommandLine { + char buffer[MAX_CMD_SIZE]; //!< The command buffer + bool skip_ok; //!< Skip sending ok when command is processed? + TERN_(HAS_MULTI_SERIAL, serial_index_t port); //!< Serial port the command was received on + }; /** - * The port that the command was received on + * A handy ring buffer type */ - #if HAS_MULTI_SERIAL - static serial_index_t port[BUFSIZE]; - #endif - static inline serial_index_t command_port() { return TERN0(HAS_MULTI_SERIAL, port[index_r]); } + struct RingBuffer { + uint8_t length, //!< Number of commands in the queue + index_r, //!< Ring buffer's read position + index_w; //!< Ring buffer's write position + CommandLine commands[BUFSIZE]; //!< The ring buffer of commands - GCodeQueue(); + inline serial_index_t command_port() const { return TERN0(HAS_MULTI_SERIAL, commands[index_r].port); } + + inline void clear() { length = index_r = index_w = 0; } + + void advance_pos(uint8_t &p, const int inc) { if (++p >= BUFSIZE) p = 0; length += inc; } + + void commit_command(bool skip_ok + #if HAS_MULTI_SERIAL + , serial_index_t serial_ind=-1 + #endif + ); + + bool enqueue(const char* cmd, bool skip_ok = true + #if HAS_MULTI_SERIAL + , serial_index_t serial_ind=-1 + #endif + ); + + void ok_to_send(); + + inline bool full(uint8_t cmdCount=1) const { return length > (BUFSIZE - cmdCount); } + + inline bool empty() const { return length == 0; } + + inline CommandLine& peek_next_command() { return commands[index_r]; } + + inline char* peek_next_command_string() { return peek_next_command().buffer; } + }; + + /** + * The ring buffer of commands + */ + static RingBuffer ring_buffer; /** * Clear the Marlin command queue */ - static void clear(); + static void clear() { ring_buffer.clear(); } /** * Next Injected Command (PROGMEM) pointer. (nullptr == empty) @@ -112,7 +155,7 @@ public: /** * Check whether there are any commands yet to be executed */ - static bool has_commands_queued(); + static bool has_commands_queued() { return ring_buffer.length || injected_commands_P || injected_commands[0]; } /** * Get the next command in the queue, optionally log it to SD, then dispatch it @@ -136,7 +179,7 @@ public: * P Planner space remaining * B Block queue space remaining */ - static void ok_to_send(); + static inline void ok_to_send() { ring_buffer.ok_to_send(); } /** * Clear the serial line and request a resend of @@ -144,9 +187,12 @@ public: */ static void flush_and_request_resend(); -private: + /** + * (Re)Set the current line number for the last received command + */ + static inline void set_current_line_number(long n) { serial_state[ring_buffer.command_port()].last_N = n; } - static uint8_t index_w; // Ring buffer write position +private: static void get_serial_commands(); @@ -154,18 +200,6 @@ private: static void get_sdcard_commands(); #endif - static void _commit_command(bool say_ok - #if HAS_MULTI_SERIAL - , serial_index_t serial_ind=-1 - #endif - ); - - static bool _enqueue(const char* cmd, bool say_ok=false - #if HAS_MULTI_SERIAL - , serial_index_t serial_ind=-1 - #endif - ); - // Process the next "immediate" command (PROGMEM) static bool process_injected_command_P(); @@ -180,6 +214,7 @@ private: static void gcode_line_error(PGM_P const err, const serial_index_t serial_ind); + friend class GcodeSuite; }; extern GCodeQueue queue; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 2cf6f05a99..6e0d7814d0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -162,7 +162,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { draw_return_ui(); break; case GCodeCommand: - if (queue.length <= (BUFSIZE - 3)) { + if (!queue.ring_buffer.full(3)) { // Hook anything that goes to the serial port MYSERIAL0.setHook(lv_serial_capt_hook, lv_eom_hook, 0); queue.enqueue_one_now(ret_ta_txt); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 495acda06b..dbeb3796e0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -46,7 +46,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_M_POINT1 ... ID_M_POINT5: - if (queue.length == 0) { + if (queue.ring_buffer.empty()) { if (uiCfg.leveling_first_time) { uiCfg.leveling_first_time = false; queue.inject_P(G28_STR); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 1c07583d53..2dec548af0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -54,7 +54,7 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { char str_1[16]; if (event != LV_EVENT_RELEASED) return; - if (queue.length <= (BUFSIZE - 3)) { + if (!queue.ring_buffer.full(3)) { bool do_inject = true; float dist = uiCfg.move_dist; switch (obj->mks_obj_id) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 71cdb0f7d4..5622956579 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1613,7 +1613,7 @@ void wifi_rcv_handle() { if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); getDataF = 1; } - if (need_ok_later && (queue.length < BUFSIZE)) { + if (need_ok_later && !queue.ring_buffer.full()) { need_ok_later = false; send_to_wifi((uint8_t *)"ok\r\n", strlen("ok\r\n")); } @@ -1772,7 +1772,7 @@ void get_wifi_commands() { static int wifi_read_count = 0; if (espGcodeFifo.wait_tick > 5) { - while ((queue.length < BUFSIZE) && (espGcodeFifo.r != espGcodeFifo.w)) { + while (!queue.ring_buffer.full() && (espGcodeFifo.r != espGcodeFifo.w)) { espGcodeFifo.wait_tick = 0; diff --git a/docs/Queue.md b/docs/Queue.md new file mode 100644 index 0000000000..bce68b0551 --- /dev/null +++ b/docs/Queue.md @@ -0,0 +1,59 @@ +# Marlin's command queue concept + +Marlin Firmware processes G-code commands as they arrive from multiple sources, including the SD card and one or more serial ports such as USB-connected hosts, WiFi, Bluetooth, and so on. + +Marlin is also continuously processing the commands at the front of the queue, converting them into signals for many physical actuators such as motors, heaters, lasers, and RGB LEDs. + +The firmware needs to maintain continuity and timing so the command senders remain unblocked, while still performing physical movements and other actions in real-time, respecting the physical limits of stepper motors and other peripherals. + +To keep things flowing Marlin feeds a single queue of G-code commands from all inputs, inserting them in the order received. Movement commands immediately go into the Planner Buffer, if there is room. The buffering of a move is considered the completion of the command, so if a non-movement command has to occur after a move is done, and not just after a move is buffered, then there has to be an `M400` to wait for the Planner Buffer to finish. + +Whenever the command queue gets full the sender needs to wait for space to open up, and the host may need to re-send the last command again. Marlin does some handshaking to keep the host informed during a print job, described below. + +An opposite problem called "planner starvation" occurs when Marlin receives many short and fast moves in a row so the Planner Buffer gets completed very quickly. In this case the host can't send commands fast enough to prevent the Planner Buffer from emptying out. Planner starvation causes obvious stuttering and is commonly seen on overloaded deltabots during small curves. Marlin has strategies to mitigate this issue, but sometimes a model has to be re-sliced (or the G-code has to be post-processed with Arc Welder) just to stay within the machine's inherent limits. + +Here's a basic flowchart of Marlin command processing: +``` ++------+ Marlin's GCodeQueue +| | +--------------------------------------+ +-----------+ +| Host | | SerialState RingBuffer | | | +| | Marlin | NUM_SERIAL BUF_SIZE | | Marlin | ++--+---+ R/TX_BUFFER_SIZE | +---+ +------------------+ | | | + | +------------+ | | | | | | | GCode | + | | | | | | | MAX_CMD_SIZE +-+-----> processor | + | | Platform | | | | On EOL | +--------------+ | r_pos | | + +-------------> serial's +-----------> +--------> | G-code | | | +-----------+ + | buffer | | | | w_pos | | command | | | + | | | | | | | line | | | + +------------+ | +---+ | +--------------+ | | + | Line buffer | x BUF_SIZE | | + | | | | + | | | | + | | | | + | | | | + | +------------------+ | + | | + | | + | | + +--------------------------------------+ +``` + +Marlin is a single-threaded application with a main `loop()` that manages the command queue and an `idle()` routine that manages the hardware. The command queue is handled in two stages: +1. The `idle()` routine reads all inputs and attempts to enqueue any completed command lines. +2. The main `loop()` gets the command at the front the G-code queue (if any) and runs it. Each G-code command blocks the main loop, preventing the queue from advancing until it returns. To keep essential tasks and the UI running, any commands that run a long process need to call `idle()` frequently. + +## Synchronization + +To maintain synchronization Marlin replies "`ok`" to the host as soon as the command has been enqueued. This lets the host know that it can send another command, and well-behaved hosts will wait for this message. With `ADVANCED_OK` enabled the `ok` message includes extra information (such as the number of slots left in the queue). + +If no data is available on the serial buffer, Marlin can be configured to periodically send a "`wait`" message to the host. This was the only method of "host keepalive" provided in Marlin 1.0, but today the better options are `HOST_KEEPALIVE` and `ADVANCED_OK`. + +## Limitation of the design + +Some limitations to the design are evident: +1. Whenever the G-code processor is busy processing a command, the G-code queue cannot advance. +2. A long command like `G29` causes commands to pile up and to fill the queue, making the host wait. +3. Each serial input requires a buffer large enough for a complete G-code line. This is set by `MAX_CMD_SIZE` with a default value of 96. +4. Since serial buffer sizes are likely used as ring buffers themselves, as an optimization their sizes must be a power of 2 (64 or 128 bytes recommended). +5. If a host sends too much G-code at once it can saturate the `GCodeQueue`. This doesn't do anything to improve the processing rate of Marlin since only one command can be dispatched per loop iteration. +6. With the previous point in mind, it's clear that the longstanding wisdom that you don't need a large `BUF_SIZE` is not just apocryphal. The default value of 4 is typically just fine for a single serial port. (And, if you decide to send a `G25` to pause the machine, the wait will be much shorter!) From c9d757fc0e81841b34c428baa7950af4225b9c8d Mon Sep 17 00:00:00 2001 From: ldursw <37294448+ldursw@users.noreply.github.com> Date: Fri, 26 Feb 2021 20:01:11 -0300 Subject: [PATCH 1062/1370] Init (stow) BLTouch before X/Y homing (#21192) --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index c26340f1ab..a2de1dfe38 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -332,6 +332,7 @@ void GcodeSuite::G28() { // Raise Z before homing any other axes and z is not already high enough (never lower z) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); do_z_clearance(z_homing_height); + TERN_(BLTOUCH, bltouch.init()); } #if ENABLED(QUICK_HOME) @@ -384,7 +385,6 @@ void GcodeSuite::G28() { stepper.set_separate_multi_axis(false); #endif - TERN_(BLTOUCH, bltouch.init()); TERN(Z_SAFE_HOMING, home_z_safely(), homeaxis(Z_AXIS)); probe.move_z_after_homing(); } From 3a5ac12321a2b92c8638d22b9cc141a66a1b0fa7 Mon Sep 17 00:00:00 2001 From: Fabio Viappiani Date: Sat, 27 Feb 2021 00:10:50 +0100 Subject: [PATCH 1063/1370] Fix M355 with NEOPIXEL (#21200) --- Marlin/src/gcode/feature/caselight/M355.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index 12ae5cff1d..6634a90f46 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -60,12 +60,10 @@ void GcodeSuite::M355() { if (!caselight.on) SERIAL_ECHOLNPGM(STR_OFF); else { - #if CASELIGHT_USES_BRIGHTNESS - if (PWM_PIN(CASE_LIGHT_PIN)) { - SERIAL_ECHOLN(int(caselight.brightness)); - return; - } - #endif + if (TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN)))) { + SERIAL_ECHOLN(int(caselight.brightness)); + return; + } SERIAL_ECHOLNPGM(STR_ON); } } From 94d16372218af606f5718d5690af2e6c72fc5077 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 26 Feb 2021 20:33:34 -0300 Subject: [PATCH 1064/1370] More LERDGE envs followup (#21205) --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index c03b224533..1d2ef0e03b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1385,7 +1385,7 @@ board_build.firmware = Lerdge_X_firmware_force.bin # Lerdge X with USB Flash Drive Support # [env:LERDGEX_usb_flash_drive] -platform = ${LERDGEX.platform} +platform = ${env:LERDGEX.platform} extends = LERDGEX platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1402,7 +1402,7 @@ board_build.firmware = Lerdge_firmware_force.bin # Lerdge S with USB Flash Drive Support # [env:LERDGES_usb_flash_drive] -platform = ${LERDGES.platform} +platform = ${env:LERDGES.platform} extends = LERDGES platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1421,7 +1421,7 @@ build_flags = ${lerdge_common.build_flags} # Lerdge K with USB Flash Drive Support # [env:LERDGEK_usb_flash_drive] -platform = ${LERDGEK.platform} +platform = ${env:LERDGEK.platform} extends = LERDGEK platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} From b428a53b7ae680e103b084875e1043c4b832a2c4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 26 Feb 2021 20:36:22 -0300 Subject: [PATCH 1065/1370] Fix GTR / SKR PRO + USB Flash Drive build (#21197) --- .../BIGTREE_GTR_V1_0_usb_flash_drive-tests | 47 +++++++++++++++++++ platformio.ini | 6 ++- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100755 buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests diff --git a/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests new file mode 100755 index 0000000000..0504fc1da9 --- /dev/null +++ b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# +# Build tests for BigTreeTech GTR 1.0 +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 +opt_set SERIAL_PORT 3 +opt_set EXTRUDERS 8 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 1 +opt_set TEMP_SENSOR_3 1 +opt_set TEMP_SENSOR_4 1 +opt_set TEMP_SENSOR_5 1 +opt_set TEMP_SENSOR_6 1 +opt_set TEMP_SENSOR_7 1 +opt_set SDSUPPORT +opt_set USB_FLASH_DRIVE_SUPPORT +opt_set USE_OTG_USB_HOST +# Not necessary to enable auto-fan for all extruders to hit problematic code paths +opt_set E0_AUTO_FAN_PIN PC10 +opt_set E1_AUTO_FAN_PIN PC11 +opt_set E2_AUTO_FAN_PIN PC12 +opt_set X_DRIVER_TYPE TMC2208 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set NEOPIXEL_PIN PF13 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING +opt_enable FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE +opt_set FIL_RUNOUT_PIN 3 +opt_set FIL_RUNOUT2_PIN 4 +opt_set FIL_RUNOUT3_PIN 5 +opt_set FIL_RUNOUT4_PIN 6 +opt_set FIL_RUNOUT5_PIN 7 +opt_set FIL_RUNOUT6_PIN 8 +opt_set FIL_RUNOUT7_PIN 9 +opt_set FIL_RUNOUT8_PIN 10 +opt_set FIL_RUNOUT4_STATE HIGH +opt_enable FIL_RUNOUT4_PULLUP +opt_set FIL_RUNOUT8_STATE HIGH +opt_enable FIL_RUNOUT8_PULLUP +exec_test $1 $2 "BigTreeTech GTR + OTG USB Flash Drive + Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" "$3" + +# clean up +restore_configs diff --git a/platformio.ini b/platformio.ini index 1d2ef0e03b..b35cd878d0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1316,7 +1316,9 @@ build_flags = ${common_stm32.build_flags} [env:BIGTREE_SKR_PRO_usb_flash_drive] extends = env:BIGTREE_SKR_PRO platform_packages = ${stm32_flash_drive.platform_packages} +build_unflags = -DUSBCON -DUSBD_USE_CDC build_flags = ${stm32_flash_drive.build_flags} + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 # # Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) @@ -1336,7 +1338,9 @@ build_flags = ${common_stm32.build_flags} [env:BIGTREE_GTR_V1_0_usb_flash_drive] extends = env:BIGTREE_GTR_V1_0 platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} +build_unflags = -DUSBCON -DUSBD_USE_CDC +build_flags = ${stm32_flash_drive.build_flags} + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 # # BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) From 80aac1b711d70cd63fb348983c6747201c3dd959 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sat, 27 Feb 2021 00:59:28 +0100 Subject: [PATCH 1066/1370] Make F_CPU a compile-time constant (#21051) --- Marlin/src/HAL/STM32/HAL.cpp | 6 ++++++ Marlin/src/HAL/STM32/inc/Conditionals_adv.h | 6 ++++++ .../share/PlatformIO/scripts/common-cxxflags.py | 13 +++++++++++++ 3 files changed, 25 insertions(+) diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index 5c7bc3a00b..4b530cc738 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -63,6 +63,12 @@ TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); void HAL_init() { FastIO_init(); + // Ensure F_CPU is a constant expression. + // If the compiler breaks here, it means that delay code that should compute at compile time will not work. + // So better safe than sorry here. + constexpr int cpuFreq = F_CPU; + UNUSED(cpuFreq); + #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) && (defined(SDSS) && SDSS != -1) OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up #endif diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h index 672d405d6b..9c9a7014c7 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h @@ -24,3 +24,9 @@ #if defined(USBD_USE_CDC_MSC) && DISABLED(NO_SD_HOST_DRIVE) #define HAS_SD_HOST_DRIVE 1 #endif + +// Fix F_CPU not being a compile-time constant in STSTM32 framework +#ifdef BOARD_F_CPU + #undef F_CPU + #define F_CPU BOARD_F_CPU +#endif diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index a0a3b45043..ed863a917a 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -11,6 +11,13 @@ env.Append(CXXFLAGS=[ #"-Wno-sign-compare" ]) +# +# Add CPU frequency as a compile time constant instead of a runtime variable +# +def add_cpu_freq(): + if 'BOARD_F_CPU' in env: + env['BUILD_FLAGS'].append('-DBOARD_F_CPU=' + env['BOARD_F_CPU']) + # Useful for JTAG debugging # # It will separe release and debug build folders. @@ -20,3 +27,9 @@ env.Append(CXXFLAGS=[ # if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' + +# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns +# to CPU cycles, this adds overhead preventing small delay (in the order of less than +# 30 cycles) to be generated correctly. By using a compile time constant instead +# the compiler will perform the computation and this overhead will be avoided +add_cpu_freq() From 653608e9314ad668f6246d4b9ab7e834b6adb1c7 Mon Sep 17 00:00:00 2001 From: "Alexander D. Kanevskiy" Date: Sat, 27 Feb 2021 02:03:11 +0200 Subject: [PATCH 1067/1370] Fix preflight complex extend handling (#21191) --- .../PlatformIO/scripts/preflight-checks.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 14807d954a..c20e5cb7a8 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -1,6 +1,6 @@ # # preflight-checks.py -# Script to check for common issues prior to compiling +# Check for common issues prior to compiling # import os import re @@ -25,9 +25,12 @@ def check_envs(build_env, base_envs, config): return True ext = config.get(build_env, 'extends', default=None) if ext: - for ext_env in ext: - if check_envs(ext_env, base_envs, config): - return True + if isinstance(ext, str): + return check_envs(ext, base_envs, config) + elif isinstance(ext, list): + for ext_env in ext: + if check_envs(ext_env, base_envs, config): + return True return False # Sanity checks: @@ -56,7 +59,7 @@ if not result: # Check for Config files in two common incorrect places # for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: - for f in [ "Configuration.h", "Configuration_adv.h" ]: - if os.path.isfile(os.path.join(p, f)): - err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p - raise SystemExit(err) + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p + raise SystemExit(err) From e1283b8a86c20c2f8f67e6f6428c1f53ae71048f Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sat, 27 Feb 2021 20:13:04 +0100 Subject: [PATCH 1068/1370] G-code Queue followup (#21214) --- Marlin/src/gcode/sd/M28_M29.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/sd/M28_M29.cpp b/Marlin/src/gcode/sd/M28_M29.cpp index 6f3f2450a1..f34edb6f7c 100644 --- a/Marlin/src/gcode/sd/M28_M29.cpp +++ b/Marlin/src/gcode/sd/M28_M29.cpp @@ -49,7 +49,7 @@ void GcodeSuite::M28() { // Binary transfer mode if ((card.flag.binary_mode = binary_mode)) { SERIAL_ECHO_MSG("Switching to Binary Protocol"); - TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.port[queue.index_r]); + TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.ring_buffer.command_port()); } else card.openFileWrite(p); From 3f9fe2dac47abcf794c48f153f73fd25d144b935 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sat, 27 Feb 2021 20:16:33 +0100 Subject: [PATCH 1069/1370] Fix G-code Queue merge (#21213) --- Marlin/src/gcode/queue.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index f28c0586d9..7ce8211484 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -60,10 +60,6 @@ GCodeQueue queue; // Frequently used G-code strings PGMSTR(G28_STR, "G28"); -#if NO_TIMEOUTS > 0 - static millis_t last_command_time = 0; -#endif - GCodeQueue::SerialState GCodeQueue::serial_state[NUM_SERIAL] = { 0 }; GCodeQueue::RingBuffer GCodeQueue::ring_buffer = { 0 }; From 68e50a725a1464577a1b387822462fe67075d40a Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 27 Feb 2021 20:23:00 +0100 Subject: [PATCH 1070/1370] [SMUFF] Use EXTRUDERS for extended commands (#21212) --- Marlin/src/feature/mmu/mmu2.cpp | 32 +++++--------------- Marlin/src/gcode/feature/prusa_MMU2/M403.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index 7c3ab05851..a1bec36e45 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -62,29 +62,13 @@ MMU2 mmu2; #endif #define MMU_CMD_NONE 0 -#define MMU_CMD_T0 0x10 -#define MMU_CMD_T1 0x11 -#define MMU_CMD_T2 0x12 -#define MMU_CMD_T3 0x13 -#define MMU_CMD_T4 0x14 -#define MMU_CMD_L0 0x20 -#define MMU_CMD_L1 0x21 -#define MMU_CMD_L2 0x22 -#define MMU_CMD_L3 0x23 -#define MMU_CMD_L4 0x24 +#define MMU_CMD_T0 0x10 // up to supported filaments +#define MMU_CMD_L0 0x20 // up to supported filaments #define MMU_CMD_C0 0x30 #define MMU_CMD_U0 0x40 -#define MMU_CMD_E0 0x50 -#define MMU_CMD_E1 0x51 -#define MMU_CMD_E2 0x52 -#define MMU_CMD_E3 0x53 -#define MMU_CMD_E4 0x54 +#define MMU_CMD_E0 0x50 // up to supported filaments #define MMU_CMD_R0 0x60 -#define MMU_CMD_F0 0x70 -#define MMU_CMD_F1 0x71 -#define MMU_CMD_F2 0x72 -#define MMU_CMD_F3 0x73 -#define MMU_CMD_F4 0x74 +#define MMU_CMD_F0 0x70 // up to supported filaments #define MMU_REQUIRED_FW_BUILDNR TERN(MMU2_MODE_12V, 132, 126) @@ -243,7 +227,7 @@ void MMU2::mmu_loop() { case 1: if (cmd) { - if (WITHIN(cmd, MMU_CMD_T0, MMU_CMD_T4)) { + if (WITHIN(cmd, MMU_CMD_T0, MMU_CMD_T0 + EXTRUDERS - 1)) { // tool change int filament = cmd - MMU_CMD_T0; DEBUG_ECHOLNPAIR("MMU <= T", filament); @@ -251,7 +235,7 @@ void MMU2::mmu_loop() { TERN_(MMU_EXTRUDER_SENSOR, mmu_idl_sens = 1); // enable idler sensor, if any state = 3; // wait for response } - else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L4)) { + else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L0 + EXTRUDERS - 1)) { // load int filament = cmd - MMU_CMD_L0; DEBUG_ECHOLNPAIR("MMU <= L", filament); @@ -271,7 +255,7 @@ void MMU2::mmu_loop() { MMU2_COMMAND("U0"); state = 3; // wait for response } - else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) { + else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E0 + EXTRUDERS - 1)) { // eject filament int filament = cmd - MMU_CMD_E0; DEBUG_ECHOLNPAIR("MMU <= E", filament); @@ -284,7 +268,7 @@ void MMU2::mmu_loop() { MMU2_COMMAND("R0"); state = 3; // wait for response } - else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) { + else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F0 + EXTRUDERS - 1)) { // filament type int filament = cmd - MMU_CMD_F0; DEBUG_ECHOLNPAIR("MMU <= F", filament, " ", cmd_arg); diff --git a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp index 31d076337a..bca2013e88 100644 --- a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp +++ b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp @@ -40,7 +40,7 @@ void GcodeSuite::M403() { int8_t index = parser.intval('E', -1), type = parser.intval('F', -1); - if (WITHIN(index, 0, 4) && WITHIN(type, 0, 2)) + if (WITHIN(index, 0, EXTRUDERS - 1) && WITHIN(type, 0, 2)) mmu2.set_filament_type(index, type); else SERIAL_ECHO_MSG("M403 - bad arguments."); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index cff1424eb3..3e20bb90c0 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -513,7 +513,7 @@ #define HAS_PRUSA_MMU2 1 #define HAS_PRUSA_MMU2S 1 #endif - #if MMU_MODEL >= SMUFF_EMU_MMU2 + #if MMU_MODEL == SMUFF_EMU_MMU2 || MMU_MODEL == SMUFF_EMU_MMU2S #define HAS_SMUFF 1 #endif #endif From 130dfbe11c77ee643d7c6636aaf157f0fa17559b Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 27 Feb 2021 20:24:36 +0100 Subject: [PATCH 1071/1370] [SAMD51] Postmortem Debugging not implemented (#21211) --- Marlin/src/HAL/SAMD51/inc/SanityCheck.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h index 5d610acac8..2a4bde98e6 100644 --- a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h +++ b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h @@ -50,3 +50,7 @@ #if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on SAMD51." #endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on AGCM4." +#endif From fff95b71730594e712bf8665cac3a28a883c81ce Mon Sep 17 00:00:00 2001 From: Arjan Mels <43108771+arjanmels@users.noreply.github.com> Date: Sat, 27 Feb 2021 20:32:57 +0100 Subject: [PATCH 1072/1370] Fix M876 when called from EP (#21210) --- Marlin/src/feature/host_actions.cpp | 14 -------------- Marlin/src/feature/pause.cpp | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index c194fb7a5b..77e4f3b9da 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -143,24 +143,16 @@ void host_action(PGM_P const pstr, const bool eol) { // - Dismissal of info // void host_response_handler(const uint8_t response) { - #ifdef DEBUG_HOST_ACTIONS - static PGMSTR(m876_prefix, "M876 Handle Re"); - serialprintPGM(m876_prefix); SERIAL_ECHOLNPAIR("ason: ", host_prompt_reason); - serialprintPGM(m876_prefix); SERIAL_ECHOLNPAIR("sponse: ", response); - #endif - PGM_P msg = PSTR("UNKNOWN STATE"); const PromptReason hpr = host_prompt_reason; host_prompt_reason = PROMPT_NOT_DEFINED; // Reset now ahead of logic switch (hpr) { case PROMPT_FILAMENT_RUNOUT: - msg = PSTR("FILAMENT_RUNOUT"); switch (response) { case 0: // "Purge More" button #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more) #endif - filament_load_host_prompt(); // Initiate another host prompt. (NOTE: The loop in load_filament may also do this!) break; case 1: // "Continue" / "Disable Runout" button @@ -178,23 +170,17 @@ void host_action(PGM_P const pstr, const bool eol) { break; case PROMPT_USER_CONTINUE: TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); - msg = PSTR("FILAMENT_RUNOUT_CONTINUE"); break; case PROMPT_PAUSE_RESUME: - msg = PSTR("LCD_PAUSE_RESUME"); #if BOTH(ADVANCED_PAUSE_FEATURE, SDSUPPORT) extern const char M24_STR[]; queue.inject_P(M24_STR); #endif break; case PROMPT_INFO: - msg = PSTR("GCODE_INFO"); break; default: break; } - SERIAL_ECHOPGM("M876 Responding PROMPT_"); - serialprintPGM(msg); - SERIAL_EOL(); } #endif // HOST_PROMPT_SUPPORT diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 012e6c6e50..e0b4f88f9b 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -259,7 +259,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l unscaled_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE); } - TERN_(HOST_PROMPT_SUPPORT, filament_load_host_prompt()); // Initiate another host prompt. (NOTE: host_response_handler may also do this!) + TERN_(HOST_PROMPT_SUPPORT, filament_load_host_prompt()); // Initiate another host prompt. #if HAS_LCD_MENU if (show_lcd) { From d20375c185feddcb5635c86b3ec8a8fb683af9e3 Mon Sep 17 00:00:00 2001 From: Kachidoki Date: Sat, 27 Feb 2021 20:45:12 +0100 Subject: [PATCH 1073/1370] Duplicate fan speed in M106/7 IDEX Duplication Mode (#21208) --- Marlin/src/gcode/temp/M106_M107.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index 9c70f1ebc7..b7d64c99ea 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -81,6 +81,9 @@ void GcodeSuite::M106() { // Set speed, with constraint thermalManager.set_fan_speed(pfan, speed); + + if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating + thermalManager.set_fan_speed(1 - pfan, speed); } } @@ -88,8 +91,13 @@ void GcodeSuite::M106() { * M107: Fan Off */ void GcodeSuite::M107() { - const uint8_t p = parser.byteval('P', _ALT_P); - thermalManager.set_fan_speed(p, 0); + const uint8_t pfan = parser.byteval('P', _ALT_P); + if (pfan < _CNT_P) { + thermalManager.set_fan_speed(pfan, 0); + + if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating + thermalManager.set_fan_speed(1 - pfan, 0); + } } #endif // HAS_FAN From 124fb331cc93985d84775bb3eca09aa4cfd8e9d0 Mon Sep 17 00:00:00 2001 From: Evgeny Z Date: Sat, 27 Feb 2021 22:50:44 +0300 Subject: [PATCH 1074/1370] Apply AUTO_POWER_CONTROL later in setup() (#21193) Co-authored-by: Scott Lahteine --- Marlin/src/MarlinCore.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index ad99a06eff..aa92c99940 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -915,12 +915,6 @@ void setup() { OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); #endif - #if ENABLED(PSU_CONTROL) - SETUP_LOG("PSU_CONTROL"); - powersupply_on = ENABLED(PSU_DEFAULT_OFF); - if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); - #endif - #if EITHER(DISABLE_DEBUG, DISABLE_JTAG) // Disable any hardware debug to free up pins for IO #if ENABLED(DISABLE_DEBUG) && defined(JTAGSWD_DISABLE) @@ -951,10 +945,6 @@ void setup() { OUT_WRITE(MAX6675_SS2_PIN, HIGH); // Disable #endif - #if HAS_L64XX - SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers - #endif - #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Put Smart Effector into NORMAL mode #endif @@ -963,10 +953,20 @@ void setup() { SETUP_RUN(runout.setup()); #endif + #if ENABLED(PSU_CONTROL) + SETUP_LOG("PSU_CONTROL"); + powersupply_on = ENABLED(PSU_DEFAULT_OFF); + if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); + #endif + #if ENABLED(POWER_LOSS_RECOVERY) SETUP_RUN(recovery.setup()); #endif + #if HAS_L64XX + SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers + #endif + #if HAS_TMC220x SETUP_RUN(tmc_serial_begin()); #endif From 971fb8729a5351b692c56b0c6245bdf2567679d7 Mon Sep 17 00:00:00 2001 From: jbuck2005 <59450931+jbuck2005@users.noreply.github.com> Date: Sat, 27 Feb 2021 16:54:43 -0500 Subject: [PATCH 1075/1370] SPEED => FEEDRATE (#21217) --- Marlin/Configuration.h | 6 +++--- Marlin/Configuration_adv.h | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 4 ++-- Marlin/src/inc/SanityCheck.h | 8 +++++++- Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 2 +- Marlin/src/module/motion.cpp | 6 +++--- Marlin/src/module/motion.h | 6 +++--- Marlin/src/module/probe.cpp | 4 ++-- 10 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index b50c884b7e..34f47bf485 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1047,13 +1047,13 @@ #define PROBING_MARGIN 10 // X and Y axis travel speed (mm/min) between probes -#define XY_PROBE_SPEED (133*60) +#define XY_PROBE_FEEDRATE (133*60) // Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) -#define Z_PROBE_SPEED_FAST (4*60) +#define Z_PROBE_FEEDRATE_FAST (4*60) // Feedrate (mm/min) for the "accurate" probe of each point -#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) +#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2) /** * Probe Activation Switch diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0cb78731eb..2fbcf259f6 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -924,7 +924,7 @@ // increments while checking for the contact to be broken. #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) - #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/min) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_FEEDRATE_SLOW // (mm/min) #endif #endif #endif diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index b1e9fcedaa..233e7f7415 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -359,7 +359,7 @@ G29_TYPE GcodeSuite::G29() { #if ABL_GRID - xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_SPEED)); + xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_FEEDRATE)); const float x_min = probe.min_x(), x_max = probe.max_x(), y_min = probe.min_y(), y_max = probe.max_y(); diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 6de98e2a0e..c800a52fb8 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2479,8 +2479,8 @@ #ifndef Z_PROBE_OFFSET_RANGE_MAX #define Z_PROBE_OFFSET_RANGE_MAX 20 #endif - #ifndef XY_PROBE_SPEED - #define XY_PROBE_SPEED ((homing_feedrate_mm_m.x + homing_feedrate_mm_m.y) / 2) + #ifndef XY_PROBE_FEEDRATE + #define XY_PROBE_FEEDRATE ((homing_feedrate_mm_m.x + homing_feedrate_mm_m.y) / 2) #endif #ifndef NOZZLE_TO_PROBE_OFFSET #define NOZZLE_TO_PROBE_OFFSET { 0, 0, 0 } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 210848d80b..f606ea5d9a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -131,7 +131,13 @@ #elif defined(DEFAULT_XYJERK) #error "DEFAULT_XYJERK is deprecated. Use DEFAULT_XJERK and DEFAULT_YJERK instead." #elif defined(XY_TRAVEL_SPEED) - #error "XY_TRAVEL_SPEED is deprecated. Use XY_PROBE_SPEED instead." + #error "XY_TRAVEL_SPEED is now XY_PROBE_FEEDRATE." +#elif defined(XY_PROBE_SPEED) + #error "XY_PROBE_SPEED is now XY_PROBE_FEEDRATE." +#elif defined(Z_PROBE_SPEED_FAST) + #error "Z_PROBE_SPEED_FAST is now Z_PROBE_FEEDRATE_FAST." +#elif defined(Z_PROBE_SPEED_SLOW) + #error "Z_PROBE_SPEED_SLOW is now Z_PROBE_FEEDRATE_SLOW." #elif defined(PROBE_SERVO_DEACTIVATION_DELAY) #error "PROBE_SERVO_DEACTIVATION_DELAY is deprecated. Use DEACTIVATE_SERVOS_AFTER_MOVE instead." #elif defined(SERVO_DEACTIVATION_DELAY) diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 505b31876a..0dae8dbf41 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -224,7 +224,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { bool _lcd_level_bed_corners_probe(bool verify=false) { if (verify) do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // do clearance if needed TERN_(BLTOUCH_SLOW_MODE, bltouch.deploy()); // Deploy in LOW SPEED MODE on every probe action - do_blocking_move_to_z(last_z - LEVEL_CORNERS_PROBE_TOLERANCE, MMM_TO_MMS(Z_PROBE_SPEED_SLOW)); // Move down to lower tolerance + do_blocking_move_to_z(last_z - LEVEL_CORNERS_PROBE_TOLERANCE, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW)); // Move down to lower tolerance if (TEST(endstops.trigger_state(), TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN, Z_MIN_PROBE))) { // check if probe triggered endstops.hit_on_purpose(); set_current_from_steppers_for_axis(Z_AXIS); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 2f0c37b433..3b3fa0fd2a 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -145,7 +145,7 @@ void prepare_for_probe_offset_wizard() { // Move Nozzle to Probing/Homing Position ui.wait_for_move = true; current_position += probe.offset_xy; - line_to_current_position(MMM_TO_MMS(XY_PROBE_SPEED)); + line_to_current_position(MMM_TO_MMS(XY_PROBE_FEEDRATE)); ui.synchronize(GET_TEXT(MSG_PROBE_WIZARD_MOVING)); ui.wait_for_move = false; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 3e79e7dabf..580700bfe2 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -180,7 +180,7 @@ xyz_pos_t cartes; #endif #if HAS_ABL_NOT_UBL - feedRate_t xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); + feedRate_t xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_FEEDRATE); #endif /** @@ -1151,7 +1151,7 @@ void prepare_line_to_destination() { */ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); + if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW); #endif static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); @@ -1569,7 +1569,7 @@ void prepare_line_to_destination() { if (bump) { // Move away from the endstop by the axis HOMING_BUMP_MM if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); - do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0, false); + do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST) : 0, false); #if ENABLED(DETECT_BROKEN_ENDSTOP) // Check for a broken endstop diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index c8fb2c639b..2595084b4a 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -59,13 +59,13 @@ extern xyz_pos_t cartes; #if HAS_ABL_NOT_UBL extern feedRate_t xy_probe_feedrate_mm_s; #define XY_PROBE_FEEDRATE_MM_S xy_probe_feedrate_mm_s -#elif defined(XY_PROBE_SPEED) - #define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_SPEED) +#elif defined(XY_PROBE_FEEDRATE) + #define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_FEEDRATE) #else #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() #endif -constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_SPEED_FAST); +constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST); /** * Feed rates are often configured with mm/m diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d29123bf4d..d7fafc8932 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -619,7 +619,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { // Raise to give the probe clearance do_blocking_move_to_z(current_position.z + Z_CLEARANCE_MULTI_PROBE, z_probe_fast_mm_s); - #elif Z_PROBE_SPEED_FAST != Z_PROBE_SPEED_SLOW + #elif Z_PROBE_FEEDRATE_FAST != Z_PROBE_FEEDRATE_SLOW // If the nozzle is well over the travel height then // move down quickly before doing the slow probe @@ -650,7 +650,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { if (TERN0(PROBE_TARE, tare())) return true; // Probe downward slowly to find the bed - if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_SLOW), + if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW), sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return NAN; TERN_(MEASURE_BACKLASH_WHEN_PROBING, backlash.measure_with_probe()); From 6183cd07312abd419208d7730df6683ae415563b Mon Sep 17 00:00:00 2001 From: LinFor Date: Sun, 28 Feb 2021 01:06:48 +0300 Subject: [PATCH 1076/1370] RGB Caselight (#20341) --- Marlin/Configuration.h | 1 + Marlin/Configuration_adv.h | 13 +++++++++---- Marlin/src/MarlinCore.cpp | 5 +---- Marlin/src/feature/caselight.cpp | 22 +++++++++++++++------- Marlin/src/feature/caselight.h | 26 ++++++++++++++++---------- Marlin/src/feature/leds/leds.cpp | 22 +++++++++++++++------- Marlin/src/feature/leds/leds.h | 2 ++ Marlin/src/feature/leds/neopixel.cpp | 2 +- Marlin/src/gcode/host/M115.cpp | 2 +- Marlin/src/inc/Conditionals_adv.h | 9 +++++++++ Marlin/src/inc/SanityCheck.h | 6 ++++-- Marlin/src/lcd/menu/menu_led.cpp | 11 +++++++---- Marlin/src/pins/pins_postprocess.h | 4 ++++ buildroot/tests/DUE-tests | 2 +- 14 files changed, 86 insertions(+), 41 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 34f47bf485..c813093554 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2650,6 +2650,7 @@ // Use a single NeoPixel LED for static (background) lighting //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W + //#define NEOPIXEL_BKGD_ALWAYS_ON // Keep the backlight on when other NeoPixels are off #endif /** diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 2fbcf259f6..76a6a0bb58 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -519,12 +519,17 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_MAX_PWM 128 // Limit PWM duty cycle (0-255) //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu - //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. - //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light, requires NEOPIXEL_LED. - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #if ENABLED(NEOPIXEL_LED) + //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light + #endif + #if EITHER(RGB_LED, RGBW_LED) + //#define CASE_LIGHT_USE_RGB_LED // Use RGB / RGBW LED as case light + #endif + #if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED) + #define CASE_LIGHT_DEFAULT_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } #endif #endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index aa92c99940..723276da24 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1136,10 +1136,7 @@ void setup() { #endif #if ENABLED(CASE_LIGHT_ENABLE) - #if DISABLED(CASE_LIGHT_USE_NEOPIXEL) - if (PWM_PIN(CASE_LIGHT_PIN)) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN); - #endif - SETUP_RUN(caselight.update_brightness()); + SETUP_RUN(caselight.init()); #endif #if HAS_PRUSA_MMU1 diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index 0eba102a04..d4cc6b1504 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -28,6 +28,10 @@ CaseLight caselight; +#if CASE_LIGHT_IS_COLOR_LED + #include "leds/leds.h" +#endif + #if CASELIGHT_USES_BRIGHTNESS && !defined(CASE_LIGHT_DEFAULT_BRIGHTNESS) #define CASE_LIGHT_DEFAULT_BRIGHTNESS 0 // For use on PWM pin as non-PWM just sets a default #endif @@ -38,10 +42,10 @@ CaseLight caselight; bool CaseLight::on = CASE_LIGHT_DEFAULT_ON; -#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) +#if CASE_LIGHT_IS_COLOR_LED LEDColor CaseLight::color = - #ifdef CASE_LIGHT_NEOPIXEL_COLOR - CASE_LIGHT_NEOPIXEL_COLOR + #ifdef CASE_LIGHT_DEFAULT_COLOR + CASE_LIGHT_DEFAULT_COLOR #else { 255, 255, 255, 255 } #endif @@ -71,17 +75,17 @@ void CaseLight::update(const bool sflag) { const uint8_t i = on ? brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; #endif - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #if CASE_LIGHT_IS_COLOR_LED leds.set_color( MakeLEDColor(color.r, color.g, color.b, color.w, n10ct), false ); - #else // !CASE_LIGHT_USE_NEOPIXEL + #else // !CASE_LIGHT_IS_COLOR_LED #if CASELIGHT_USES_BRIGHTNESS - if (PWM_PIN(CASE_LIGHT_PIN)) + if (pin_is_pwm()) analogWrite(pin_t(CASE_LIGHT_PIN), ( #if CASE_LIGHT_MAX_PWM == 255 n10ct @@ -96,7 +100,11 @@ void CaseLight::update(const bool sflag) { WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); } - #endif // !CASE_LIGHT_USE_NEOPIXEL + #endif // !CASE_LIGHT_IS_COLOR_LED + + #if ENABLED(CASE_LIGHT_USE_RGB_LED) + if (leds.lights_on) leds.update(); else leds.set_off(); + #endif } #endif // CASE_LIGHT_ENABLE diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index 2198c85f2a..25bcb486fa 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -21,10 +21,10 @@ */ #pragma once -#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" -#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - #include "leds/leds.h" +#if CASE_LIGHT_IS_COLOR_LED + #include "leds/leds.h" // for LEDColor #endif #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) || ENABLED(CASE_LIGHT_USE_NEOPIXEL) @@ -33,19 +33,25 @@ class CaseLight { public: - #if CASELIGHT_USES_BRIGHTNESS - static uint8_t brightness; - #endif static bool on; + TERN_(CASELIGHT_USES_BRIGHTNESS, static uint8_t brightness); + + static bool pin_is_pwm() { return TERN0(NEED_CASE_LIGHT_PIN, PWM_PIN(CASE_LIGHT_PIN)); } + static bool has_brightness() { return TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, pin_is_pwm())); } + + static void init() { + #if NEED_CASE_LIGHT_PIN + if (pin_is_pwm()) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN); + #endif + update_brightness(); + } static void update(const bool sflag); static inline void update_brightness() { update(false); } - static inline void update_enabled() { update(true); } + static inline void update_enabled() { update(true); } private: - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - static LEDColor color; - #endif + TERN_(CASE_LIGHT_IS_COLOR_LED, static LEDColor color); }; extern CaseLight caselight; diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index c8cbdec33b..ef0561a435 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -42,6 +42,10 @@ #include "pca9533.h" #endif +#if ENABLED(CASE_LIGHT_USE_RGB_LED) + #include "../../feature/caselight.h" +#endif + #if ENABLED(LED_COLOR_PRESETS) const LEDColor LEDLights::defaultLEDColor = MakeLEDColor( LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, @@ -85,8 +89,11 @@ void LEDLights::set_color(const LEDColor &incol #ifdef NEOPIXEL_BKGD_LED_INDEX if (NEOPIXEL_BKGD_LED_INDEX == nextLed) { - if (++nextLed >= neo.pixels()) nextLed = 0; - return; + neo.set_color_background(); + if (++nextLed >= neo.pixels()) { + nextLed = 0; + return; + } } #endif @@ -114,12 +121,13 @@ void LEDLights::set_color(const LEDColor &incol // This variant uses 3-4 separate pins for the RGB(W) components. // If the pins can do PWM then their intensity will be set. - #define UPDATE_RGBW(C,c) do { \ - if (PWM_PIN(RGB_LED_##C##_PIN)) \ - analogWrite(pin_t(RGB_LED_##C##_PIN), incol.c); \ - else \ - WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); \ + #define _UPDATE_RGBW(C,c) do { \ + if (PWM_PIN(RGB_LED_##C##_PIN)) \ + analogWrite(pin_t(RGB_LED_##C##_PIN), c); \ + else \ + WRITE(RGB_LED_##C##_PIN, c ? HIGH : LOW); \ }while(0) + #define UPDATE_RGBW(C,c) _UPDATE_RGBW(C, TERN1(CASE_LIGHT_USE_RGB_LED, caselight.on) ? incol.c : 0) UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b); #if ENABLED(RGBW_LED) UPDATE_RGBW(W,w); diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index d41c61144a..c34eb57f44 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -194,6 +194,8 @@ public: #if ENABLED(LED_CONTROL_MENU) static void toggle(); // swap "off" with color + #endif + #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_USE_RGB_LED) static inline void update() { set_color(color); } #endif diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 27bbeb348c..6f5ea0540a 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -60,7 +60,7 @@ void Marlin_NeoPixel::set_color(const uint32_t color) { else { for (uint16_t i = 0; i < pixels(); ++i) { #ifdef NEOPIXEL_BKGD_LED_INDEX - if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) { + if (i == NEOPIXEL_BKGD_LED_INDEX && TERN(ENABLED(NEOPIXEL_BKGD_ALWAYS_ON), true, color != 0x000000)) { set_color_background(); continue; } diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 0501f3f60b..40fdbd6d3a 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -106,7 +106,7 @@ void GcodeSuite::M115() { // TOGGLE_LIGHTS (M355) cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(CASE_LIGHT_ENABLE)); - cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN))))); + cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, caselight.has_brightness())); // EMERGENCY_PARSER (M108, M112, M410, M876) cap_line(PSTR("EMERGENCY_PARSER"), ENABLED(EMERGENCY_PARSER)); diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index c2ba04f0bc..b8464df3dd 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -506,6 +506,15 @@ #define NEED_HEX_PRINT 1 #endif +// Flags for Case Light having a color property or a single pin +#if ENABLED(CASE_LIGHT_ENABLE) + #if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED) + #define CASE_LIGHT_IS_COLOR_LED 1 + #else + #define NEED_CASE_LIGHT_PIN 1 + #endif +#endif + // Flag whether least_squares_fit.cpp is used #if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) #define NEED_LSF 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index f606ea5d9a..9dc64e6bf5 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -437,6 +437,8 @@ #error "DUAL_NOZZLE_DUPLICATION_MODE is now MULTI_NOZZLE_DUPLICATION." #elif defined(MENU_ITEM_CASE_LIGHT) #error "MENU_ITEM_CASE_LIGHT is now CASE_LIGHT_MENU." +#elif defined(CASE_LIGHT_NEOPIXEL_COLOR) + #error "CASE_LIGHT_NEOPIXEL_COLOR is now CASE_LIGHT_DEFAULT_COLOR." #elif defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) #error "ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED is now SD_ABORT_ON_ENDSTOP_HIT." #elif defined(LPC_SD_LCD) || defined(LPC_SD_ONBOARD) || defined(LPC_SD_CUSTOM_CABLE) @@ -1704,9 +1706,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Case Light requirements */ -#if ENABLED(CASE_LIGHT_ENABLE) +#if NEED_CASE_LIGHT_PIN #if !PIN_EXISTS(CASE_LIGHT) - #error "CASE_LIGHT_ENABLE requires CASE_LIGHT_PIN to be defined." + #error "CASE_LIGHT_ENABLE requires CASE_LIGHT_PIN, CASE_LIGHT_USE_NEOPIXEL, or CASE_LIGHT_USE_RGB_LED." #elif CASE_LIGHT_PIN == FAN_PIN #error "CASE_LIGHT_PIN conflicts with FAN_PIN. Resolve before continuing." #endif diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index de57502788..5ab5e8a9d8 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -105,12 +105,14 @@ #if ENABLED(CASE_LIGHT_MENU) #include "../../feature/caselight.h" + #define CASELIGHT_TOGGLE_ITEM() EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled) + #if CASELIGHT_USES_BRIGHTNESS void menu_case_light() { START_MENU(); BACK_ITEM(MSG_CONFIGURATION); EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &caselight.brightness, 0, 255, caselight.update_brightness, true); - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); + CASELIGHT_TOGGLE_ITEM(); END_MENU(); } #endif @@ -155,13 +157,14 @@ void menu_led() { // Set Case light on/off/brightness // #if ENABLED(CASE_LIGHT_MENU) - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - if (TERN1(CASE_LIGHT_USE_NEOPIXEL, PWM_PIN(CASE_LIGHT_PIN))) + #if CASELIGHT_USES_BRIGHTNESS + if (caselight.has_brightness()) SUBMENU(MSG_CASE_LIGHT, menu_case_light); else #endif - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); + CASELIGHT_TOGGLE_ITEM(); #endif + END_MENU(); } diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index de70248d4d..d37dd4352a 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -876,5 +876,9 @@ #undef BOARD_ST7920_DELAY_3 #endif +#if !NEED_CASE_LIGHT_PIN + #undef CASE_LIGHT_PIN +#endif + #undef HAS_FREE_AUX2_PINS #undef DIAG_REMAPPED diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index d4c49a3185..1e22ba3370 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -18,7 +18,7 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD REPORT_TRAMMING_MM ASSISTED_TRAMMING_WAIT_POSITION \ EEPROM_SETTINGS SDSUPPORT BINARY_FILE_TRANSFER \ BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ - NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ + NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_USE_RGB_LED CASE_LIGHT_MENU \ NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_DISTANCE_MM FILAMENT_RUNOUT_SENSOR \ AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE CALIBRATION_GCODE \ From 5aa9cc82a8a016fc76f2d9980674705ca14b69b9 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Sun, 28 Feb 2021 07:35:32 +0800 Subject: [PATCH 1077/1370] MKS H43 controller (#20609) --- Marlin/Configuration.h | 1 + Marlin/Configuration_adv.h | 6 +- Marlin/src/HAL/STM32/eeprom_flash.cpp | 2 +- .../shared/cpu_exception/exception_arm.cpp | 2 +- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 8 +- Marlin/src/MarlinCore.cpp | 5 + Marlin/src/gcode/sd/M24_M25.cpp | 15 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/lcd/extui/dgus_lcd.cpp | 7 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 38 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 7 +- .../src/lcd/extui/lib/dgus/DGUSDisplayDef.h | 11 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 560 +---- .../lcd/extui/lib/dgus/DGUSScreenHandler.h | 224 +- .../lib/dgus/fysetc/DGUSScreenHandler.cpp | 418 ++++ .../extui/lib/dgus/fysetc/DGUSScreenHandler.h | 240 ++ .../lib/dgus/hiprecy/DGUSScreenHandler.cpp | 418 ++++ .../lib/dgus/hiprecy/DGUSScreenHandler.h | 240 ++ .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 795 +++++++ .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 908 +++++++ .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 2109 +++++++++++++++++ .../extui/lib/dgus/mks/DGUSScreenHandler.h | 307 +++ .../extui/lib/dgus/origin/DGUSDisplayDef.cpp | 6 +- .../lib/dgus/origin/DGUSScreenHandler.cpp | 418 ++++ .../extui/lib/dgus/origin/DGUSScreenHandler.h | 240 ++ .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 + .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 14 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 12 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 8 +- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 2 + platformio.ini | 5 + 33 files changed, 6314 insertions(+), 720 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h create mode 100644 Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h create mode 100644 Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h create mode 100644 Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h create mode 100644 Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c813093554..79b7f9dffa 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2349,6 +2349,7 @@ //#define DGUS_LCD_UI_ORIGIN //#define DGUS_LCD_UI_FYSETC //#define DGUS_LCD_UI_HIPRECY +//#define DGUS_LCD_UI_MKS // // Touch-screen LCD for Malyan M200/M300 printers diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 76a6a0bb58..0e1cbd9a35 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1517,12 +1517,12 @@ #define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates - #if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) + #if ANY(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS, DGUS_LCD_UI_HIPRECY) #define DGUS_PRINT_FILENAME // Display the filename during printing #define DGUS_PREHEAT_UI // Display a preheat screen during heatup - #if ENABLED(DGUS_LCD_UI_FYSETC) - //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for UI_FYSETC + #if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS) + //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for FYSETC and MKS #else #define DGUS_UI_MOVE_DIS_OPTION // Enabled by default for UI_HIPRECY #endif diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index 633a286dc8..5862090f1b 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -48,7 +48,7 @@ #include "stm32_def.h" #define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) - #include "src/core/debug_out.h" + #include "../../core/debug_out.h" #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE 0x1000 // 4KB diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp index 090148683f..ae9600038a 100644 --- a/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp +++ b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp @@ -283,7 +283,7 @@ void CommonHandler_C(ContextStateFrame * frame, unsigned long lr, unsigned long savedFrame.CFSR = 0; frame->pc = (uint32_t)resume_from_fault; // Patch where to return to - frame->lr = 0xdeadbeef; // If our handler returns (it shouldn't), let's make it trigger an exception immediately + frame->lr = 0xDEADBEEF; // If our handler returns (it shouldn't), let's make it trigger an exception immediately frame->xpsr = _BV(24); // Need to clean the PSR register to thumb II only MinSerial::force_using_default_output = true; return; // The CPU will resume in our handler hopefully, and we'll try to use default serial output diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index cc22bf7d98..da70af2772 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -32,7 +32,13 @@ #include "eeprom_if.h" #include -void eeprom_init() { Wire.begin(); } +void eeprom_init() { + Wire.begin( + #if PINS_EXIST(I2C_SCL, I2C_SDA) + uint8_t(I2C_SDA_PIN), uint8_t(I2C_SCL_PIN) + #endif + ); +} #if ENABLED(USE_SHARED_EEPROM) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 723276da24..4643328401 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -231,6 +231,10 @@ #include "feature/password/password.h" #endif +#if ENABLED(DGUS_LCD_UI_MKS) + #include "lcd/extui/lib/dgus/DGUSScreenHandler.h" +#endif + PGMSTR(M112_KILL_STR, "M112 Shutdown"); MarlinState marlin_state = MF_INITIALIZING; @@ -388,6 +392,7 @@ void startOrResumeJob() { if (queue.enqueue_one_P(PSTR("M1001"))) { marlin_state = MF_RUNNING; TERN_(PASSWORD_AFTER_SD_PRINT_END, password.lock_machine()); + TERN_(DGUS_LCD_UI_MKS, ScreenHandler.SDPrintingFinished()); } } diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp index 611ba17c55..8fb529dcaa 100644 --- a/Marlin/src/gcode/sd/M24_M25.cpp +++ b/Marlin/src/gcode/sd/M24_M25.cpp @@ -41,6 +41,10 @@ #include "../../feature/powerloss.h" #endif +#if ENABLED(DGUS_LCD_UI_MKS) + #include "../../lcd/extui/lib/dgus/DGUSDisplayDef.h" +#endif + #include "../../MarlinCore.h" // for startOrResumeJob /** @@ -48,6 +52,11 @@ */ void GcodeSuite::M24() { + #if ENABLED(DGUS_LCD_UI_MKS) + if ((print_job_timer.isPaused() || print_job_timer.isRunning()) && !parser.seen("ST")) + MKS_resume_print_move(); + #endif + #if ENABLED(POWER_LOSS_RECOVERY) if (parser.seenval('S')) card.setIndex(parser.value_long()); if (parser.seenval('T')) print_job_timer.resume(parser.value_long()); @@ -98,9 +107,9 @@ void GcodeSuite::M25() { print_job_timer.pause(); - #if DISABLED(DWIN_CREALITY_LCD) - ui.reset_status(); - #endif + TERN_(DGUS_LCD_UI_MKS, MKS_pause_print_move()); + + IF_DISABLED(DWIN_CREALITY_LCD, ui.reset_status()); #if ENABLED(HOST_ACTION_COMMANDS) TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("Pause SD"), PSTR("Resume"))); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 3e20bb90c0..c8b683ecf9 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -451,7 +451,7 @@ #endif // Aliases for LCD features -#if ANY(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) +#if ANY(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY,DGUS_LCD_UI_MKS) #define HAS_DGUS_LCD 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9dc64e6bf5..b6678a4bcb 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2324,7 +2324,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + (DISABLED(IS_LEGACY_TFT) && ENABLED(TFT_GENERIC)) \ + (ENABLED(IS_LEGACY_TFT) && COUNT_ENABLED(TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI)) \ + COUNT_ENABLED(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, ANYCUBIC_TFT35) \ - + COUNT_ENABLED(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) \ + + COUNT_ENABLED(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY,DGUS_LCD_UI_MKS) \ + COUNT_ENABLED(ENDER2_STOCKDISPLAY, CR10_STOCKDISPLAY, DWIN_CREALITY_LCD) \ + COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) \ + COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \ diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index 9fcb6c8d13..9e6ca1b64c 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -21,9 +21,7 @@ */ /** - * dgus_lcd.cpp - * - * DGUS implementation for Marlin by coldtobi, Feb-May 2019 + * lcd/extui/dgus_lcd.cpp */ #include "../../inc/MarlinConfigPre.h" @@ -125,11 +123,10 @@ namespace ExtUI { #if ENABLED(POWER_LOSS_RECOVERY) void onPowerLossResume() { // Called on resume from power-loss - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POWER_LOSS); + IF_DISABLED(DGUS_LCD_UI_MKS, ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POWER_LOSS)); } #endif - #if HAS_PID_HEATING void onPidTuning(const result_t rst) { // Called for temperature PID tuning result diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index c7cd76733f..702c5cc47e 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -20,14 +20,12 @@ * */ -/* DGUS implementation written by coldtobi in 2019 for Marlin */ - #include "../../../../inc/MarlinConfigPre.h" #if HAS_DGUS_LCD #if HOTENDS > 2 - #error "More than 2 hotends not implemented on the Display UI design." + #warning "More than 2 hotends not implemented on DGUS Display UI." #endif #include "../../ui_api.h" @@ -46,6 +44,8 @@ #include "DGUSVPVariable.h" #include "DGUSDisplayDef.h" +DGUSDisplay dgusdisplay; + // Preamble... 2 Bytes, usually 0x5A 0xA5, but configurable constexpr uint8_t DGUS_HEADER1 = 0x5A; constexpr uint8_t DGUS_HEADER2 = 0xA5; @@ -62,8 +62,10 @@ void DGUSDisplay::InitDisplay() { #define LCD_BAUDRATE 115200 #endif LCD_SERIAL.begin(LCD_BAUDRATE); - if (TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) - RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); + #if BOTH(DGUS_LCD_UI_MKS, POWER_LOSS_RECOVERY) + if (!recovery.valid()) delay(LOGO_TIME_DELAY); + #endif + RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); } void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { @@ -82,12 +84,12 @@ void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t values } void DGUSDisplay::WriteVariable(uint16_t adr, uint16_t value) { - value = (value & 0xffU) << 8U | (value >> 8U); + value = (value & 0xFFU) << 8U | (value >> 8U); WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); } void DGUSDisplay::WriteVariable(uint16_t adr, int16_t value) { - value = (value & 0xffU) << 8U | (value >> 8U); + value = (value & 0xFFU) << 8U | (value >> 8U); WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); } @@ -99,15 +101,21 @@ void DGUSDisplay::WriteVariable(uint16_t adr, int8_t value) { WriteVariable(adr, static_cast(&value), sizeof(int8_t)); } +#if ENABLED(DGUS_LCD_UI_MKS) + void DGUSDisplay::MKS_WriteVariable(uint16_t adr, uint8_t value) { + WriteVariable(adr, static_cast(&value), sizeof(uint8_t)); + } +#endif + void DGUSDisplay::WriteVariable(uint16_t adr, long value) { - union { long l; char lb[4]; } endian; - char tmp[4]; - endian.l = value; - tmp[0] = endian.lb[3]; - tmp[1] = endian.lb[2]; - tmp[2] = endian.lb[1]; - tmp[3] = endian.lb[0]; - WriteVariable(adr, static_cast(&tmp), sizeof(long)); + union { long l; char lb[4]; } endian; + char tmp[4]; + endian.l = value; + tmp[0] = endian.lb[3]; + tmp[1] = endian.lb[2]; + tmp[2] = endian.lb[1]; + tmp[3] = endian.lb[0]; + WriteVariable(adr, static_cast(&tmp), sizeof(long)); } void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index 88c119566c..6e0ee3053f 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -21,7 +21,9 @@ */ #pragma once -/* DGUS implementation written by coldtobi in 2019 for Marlin */ +/** + * lcd/extui/lib/dgus/DGUSDisplay.h + */ #include "../../../../inc/MarlinConfigPre.h" @@ -34,6 +36,7 @@ enum DGUSLCD_Screens : uint8_t; +//#define DEBUG_DGUSLCD #define DEBUG_OUT ENABLED(DEBUG_DGUSLCD) #include "../../../../core/debug_out.h" @@ -60,6 +63,8 @@ public: static void WriteVariable(uint16_t adr, uint8_t value); static void WriteVariable(uint16_t adr, int8_t value); static void WriteVariable(uint16_t adr, long value); + static void MKS_WriteVariable(uint16_t adr, uint8_t value); + // Utility functions for bridging ui_api and dbus template diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h index b34a04875d..0b68943593 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h @@ -21,15 +21,16 @@ */ #pragma once -/* DGUS implementation written by coldtobi in 2019 for Marlin */ +/** + * lcd/extui/lib/dgus/DGUSDisplayDef.h + * Defines the interaction between Marlin and the display firmware + */ #include "DGUSVPVariable.h" #include -// This file defines the interaction between Marlin and the display firmware. - -// information on which screen which VP is displayed +// Information on which screen which VP is displayed. // As this is a sparse table, two arrays are needed: // one to list the VPs of one screen and one to map screens to the lists. // (Strictly this would not be necessary, but allows to only send data the display needs and reducing load on Marlin) @@ -47,6 +48,8 @@ extern const struct DGUS_VP_Variable ListOfVP[]; #if ENABLED(DGUS_LCD_UI_ORIGIN) #include "origin/DGUSDisplayDef.h" +#elif ENABLED(DGUS_LCD_UI_MKS) + #include "mks/DGUSDisplayDef.h" #elif ENABLED(DGUS_LCD_UI_FYSETC) #include "fysetc/DGUSDisplayDef.h" #elif ENABLED(DGUS_LCD_UI_HIPRECY) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 77feacf4a9..9b0c329de2 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -25,46 +25,42 @@ #if HAS_DGUS_LCD #include "DGUSScreenHandler.h" -#include "DGUSDisplay.h" -#include "DGUSVPVariable.h" -#include "DGUSDisplayDef.h" -#include "../../ui_api.h" #include "../../../../MarlinCore.h" +#include "../../../../gcode/queue.h" +#include "../../../../libs/duration_t.h" +#include "../../../../module/settings.h" #include "../../../../module/temperature.h" #include "../../../../module/motion.h" -#include "../../../../gcode/queue.h" #include "../../../../module/planner.h" -#include "../../../../sd/cardreader.h" -#include "../../../../libs/duration_t.h" #include "../../../../module/printcounter.h" +#include "../../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif +DGUSScreenHandler ScreenHandler; + uint16_t DGUSScreenHandler::ConfirmVP; -#if ENABLED(SDSUPPORT) - int16_t DGUSScreenHandler::top_file = 0; - int16_t DGUSScreenHandler::file_to_print = 0; - static ExtUI::FileList filelist; -#endif - -void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; - -//DGUSScreenHandler ScreenHandler; - DGUSLCD_Screens DGUSScreenHandler::current_screen; DGUSLCD_Screens DGUSScreenHandler::past_screens[NUM_PAST_SCREENS]; uint8_t DGUSScreenHandler::update_ptr; uint16_t DGUSScreenHandler::skipVP; bool DGUSScreenHandler::ScreenComplete; -//DGUSDisplay dgusdisplay; +void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; -// endianness swap -uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); } +#if ENABLED(SDSUPPORT) + int16_t DGUSScreenHandler::top_file = 0, + DGUSScreenHandler::file_to_print = 0; + static ExtUI::FileList filelist; +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + filament_data_t filament_data; +#endif void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { DGUS_VP_Variable ramcopy; @@ -87,14 +83,12 @@ void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, con } void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1, bool l2, bool l3, bool l4) { - if (current_screen == DGUSLCD_SCREEN_CONFIRM) { - // Already showing a pop up, so we need to cancel that first. + if (current_screen == DGUSLCD_SCREEN_CONFIRM) // Already showing a pop up, so we need to cancel that first. PopToOldScreen(); - } ConfirmVP = VP; sendinfoscreen(line1, line2, line3, line4, l1, l2, l3, l4); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_CONFIRM); + GotoScreen(DGUSLCD_SCREEN_CONFIRM); } void DGUSScreenHandler::setstatusmessage(const char *msg) { @@ -130,7 +124,7 @@ void DGUSScreenHandler::DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); - uint16_t tmp = *(uint8_t *) var.memadr +1 ; // +1 -> avoid rounding issues for the display. + uint16_t tmp = *(uint8_t *) var.memadr + 1; // +1 -> avoid rounding issues for the display. tmp = map(tmp, 0, 255, 0, 100); dgusdisplay.WriteVariable(var.VP, tmp); } @@ -157,7 +151,9 @@ void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr) { if (var.memadr) { uint16_t value = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("FAN value get:", value); *(uint8_t*)var.memadr = map(constrain(value, 0, 100), 0, 100, 0, 255); + DEBUG_ECHOLNPAIR("FAN value change:", *(uint8_t*)var.memadr); } } @@ -234,6 +230,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { // Send fan status value to the display. #if HAS_FAN + void DGUSScreenHandler::DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { DEBUG_ECHOPAIR(" DGUSLCD_SendFanStatusToDisplay ", var.VP); @@ -243,6 +240,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { dgusdisplay.WriteVariable(var.VP, data_to_send); } } + #endif // Send heater status value to the display. @@ -257,6 +255,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) } #if ENABLED(DGUS_UI_WAITING) + void DGUSScreenHandler::DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var) { // In FYSETC UI design there are 10 statuses to loop static uint16_t period = 0; @@ -270,6 +269,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) period = 0; } } + #endif #if ENABLED(SDSUPPORT) @@ -319,7 +319,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) DEBUG_ECHOPAIR("new topfile adjusted:", top_file); } else if (!filelist.isAtRootDir()) { - filelist.upDir(); + IF_DISABLED(DGUS_LCD_UI_MKS, filelist.upDir()); top_file = 0; ForceCompleteUpdate(); } @@ -327,54 +327,6 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) if (old_top != top_file) ForceCompleteUpdate(); } - void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; - if (touched_nr > filelist.count()) return; - if (!filelist.seek(touched_nr)) return; - if (filelist.isDir()) { - filelist.changeDir(filelist.filename()); - top_file = 0; - ForceCompleteUpdate(); - return; - } - - #if ENABLED(DGUS_PRINT_FILENAME) - // Send print filename - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); - #endif - - // Setup Confirmation screen - file_to_print = touched_nr; - HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); - } - - void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { - if (!filelist.seek(file_to_print)) return; - ExtUI::printFile(filelist.shortFilename()); - ScreenHandler.GotoScreen( - #if ENABLED(DGUS_LCD_UI_ORIGIN) - DGUSLCD_SCREEN_STATUS - #else - DGUSLCD_SCREEN_SDPRINTMANIPULATION - #endif - ); - } - - void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { - if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. - switch (swap16(*(uint16_t*)val_ptr)) { - case 0: // Resume - if (ExtUI::isPrintingFromMediaPaused()) ExtUI::resumePrint(); - break; - case 1: // Pause - if (!ExtUI::isPrintingFromMediaPaused()) ExtUI::pausePrint(); - break; - case 2: // Abort - ScreenHandler.HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); - break; - } - } - void DGUSScreenHandler::DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr) { ExtUI::stopPrint(); GotoScreen(DGUSLCD_SCREEN_MAIN); @@ -385,36 +337,11 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) GotoScreen(DGUSLCD_SCREEN_SDPRINTTUNE); } - void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { - uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; - if (target_line > DGUS_SD_FILESPERSCREEN) return; - char tmpfilename[VP_SD_FileName_LEN + 1] = ""; - var.memadr = (void*)tmpfilename; - if (filelist.seek(top_file + target_line)) - snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); - DGUSLCD_SendStringToDisplay(var); - } - - void DGUSScreenHandler::SDCardInserted() { - top_file = 0; - filelist.refresh(); - auto cs = ScreenHandler.getCurrentScreen(); - if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDFILELIST); - } - - void DGUSScreenHandler::SDCardRemoved() { - if (current_screen == DGUSLCD_SCREEN_SDFILELIST - || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) - || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION - ) ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN); - } - void DGUSScreenHandler::SDCardError() { DGUSScreenHandler::SDCardRemoved(); - ScreenHandler.sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), nullptr, true, true, true, true); - ScreenHandler.SetupConfirmAction(nullptr); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), nullptr, true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); } #endif // SDSUPPORT @@ -428,7 +355,7 @@ void DGUSScreenHandler::ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) const uint16_t* DGUSLCD_FindScreenVPMapList(uint8_t screen) { const uint16_t *ret; const struct VPMapping *map = VPMap; - while (ret = (uint16_t*) pgm_read_ptr(&(map->VPList))) { + while ((ret = (uint16_t*) pgm_read_ptr(&(map->VPList)))) { if (pgm_read_byte(&(map->screen)) == screen) return ret; map++; } @@ -455,31 +382,9 @@ void DGUSScreenHandler::ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ } } -void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { - uint8_t *tmp = (uint8_t*)val_ptr; - - // The keycode in target is coded as , so 0x0100A means - // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, - // meaning "return to previous screen" - DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; - - if (target == DGUSLCD_SCREEN_POPUP) { - // special handling for popup is to return to previous menu - if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); - PopToOldScreen(); - return; - } - - UpdateNewScreen(target); - - #ifdef DEBUG_DGUSLCD - if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); - #endif -} - void DGUSScreenHandler::HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr) { thermalManager.disable_all_heaters(); - ScreenHandler.ForceCompleteUpdate(); // hint to send all data. + ForceCompleteUpdate(); // hint to send all data. } void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { @@ -498,7 +403,7 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va case VP_T_E1_Set: thermalManager.setTargetHotend(newvalue, 1); acceptedvalue = thermalManager.temp_hotend[1].target; - break; + break; #endif #if HAS_HEATED_BED case VP_T_Bed_Set: @@ -510,7 +415,7 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va // reply to display the new value to update the view if the new value was rejected by the Thermal Manager. if (newvalue != acceptedvalue && var.send_to_display_handler) var.send_to_display_handler(var); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) { @@ -528,7 +433,7 @@ void DGUSScreenHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_p } planner.set_flow(target_extruder, newvalue); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel #else UNUSED(var); UNUSED(val_ptr); #endif @@ -563,97 +468,6 @@ void DGUSScreenHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr } #endif -void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleManualMove"); - - int16_t movevalue = swap16(*(uint16_t*)val_ptr); - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - if (movevalue) { - const uint16_t choice = *(uint16_t*)var.memadr; - movevalue = movevalue < 0 ? -choice : choice; - } - #endif - char axiscode; - unsigned int speed = 1500; //FIXME: get default feedrate for manual moves, dont hardcode. - - switch (var.VP) { - default: return; - - case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; - break; - - case VP_MOVE_Y: - axiscode = 'Y'; - if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; - break; - - case VP_MOVE_Z: - axiscode = 'Z'; - speed = 300; // default to 5mm/s - if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; - break; - - case VP_HOME_ALL: // only used for homing - axiscode = '\0'; - movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. - break; - } - - if (!movevalue) { - // homing - DEBUG_ECHOPAIR(" homing ", axiscode); - char buf[6] = "G28 X"; - buf[4] = axiscode; - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); - //DEBUG_ECHOLNPGM(" ✓"); - ScreenHandler.ForceCompleteUpdate(); - return; - } - else { - //movement - DEBUG_ECHOPAIR(" move ", axiscode); - bool old_relative_mode = relative_mode; - if (!relative_mode) { - //DEBUG_ECHOPGM(" G91"); - queue.enqueue_now_P(PSTR("G91")); - //DEBUG_ECHOPGM(" ✓ "); - } - char buf[32]; // G1 X9999.99 F12345 - unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); - char sign[]="\0"; - int16_t value = movevalue / 100; - if (movevalue < 0) { value = -value; sign[0] = '-'; } - int16_t fraction = ABS(movevalue) % 100; - snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); - //DEBUG_ECHOLNPGM(" ✓ "); - if (backup_speed != speed) { - snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); - queue.enqueue_one_now(buf); - //DEBUG_ECHOPAIR(" ", buf); - } - //while (!enqueue_and_echo_command(buf)) idle(); - //DEBUG_ECHOLNPGM(" ✓ "); - if (!old_relative_mode) { - //DEBUG_ECHOPGM("G90"); - queue.enqueue_now_P(PSTR("G90")); - //DEBUG_ECHOPGM(" ✓ "); - } - } - - ScreenHandler.ForceCompleteUpdate(); - DEBUG_ECHOLNPGM("manmv done."); - return; - - cannotmove: - DEBUG_ECHOLNPAIR(" cannot move ", axiscode); - return; -} - void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleMotorLockUnlock"); @@ -665,22 +479,6 @@ void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_p queue.enqueue_one_now(buf); } -#if ENABLED(POWER_LOSS_RECOVERY) - - void DGUSScreenHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t value = swap16(*(uint16_t*)val_ptr); - if (value) { - queue.inject_P(PSTR("M1000")); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); - } - else { - recovery.cancel(); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_STATUS); - } - } - -#endif - void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleSettings"); uint16_t value = swap16(*(uint16_t*)val_ptr); @@ -688,10 +486,11 @@ void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { default: break; case 1: TERN_(PRINTCOUNTER, print_job_timer.initStats()); - queue.inject_P(PSTR("M502\nM500")); + settings.reset(); + settings.save(); break; - case 2: queue.inject_P(PSTR("M501")); break; - case 3: queue.inject_P(PSTR("M500")); break; + case 2: settings.load(); break; + case 3: settings.save(); break; } } @@ -700,7 +499,7 @@ void DGUSScreenHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ uint16_t value_raw = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw/10; + float value = (float)value_raw / 10; ExtUI::axis_t axis; switch (var.VP) { case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; @@ -711,7 +510,7 @@ void DGUSScreenHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ DEBUG_ECHOLNPAIR_F("value:", value); ExtUI::setAxisSteps_per_mm(value, axis); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel return; } @@ -720,56 +519,24 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo uint16_t value_raw = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw/10; + float value = (float)value_raw / 10; ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HOTENDS >= 1 - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; - #endif - #if HOTENDS >= 2 - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; - #endif + #if HOTENDS >= 1 + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HOTENDS >= 2 + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #endif } DEBUG_ECHOLNPAIR_F("value:", value); - ExtUI::setAxisSteps_per_mm(value,extruder); + ExtUI::setAxisSteps_per_mm(value, extruder); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } #if HAS_PID_HEATING - void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR("V1:", rawvalue); - float value = (float)rawvalue / 10; - DEBUG_ECHOLNPAIR("V2:", value); - float newvalue = 0; - - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_PID_P: newvalue = value; break; - case VP_E0_PID_I: newvalue = scalePID_i(value); break; - case VP_E0_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HOTENDS >= 2 - case VP_E1_PID_P: newvalue = value; break; - case VP_E1_PID_I: newvalue = scalePID_i(value); break; - case VP_E1_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HAS_HEATED_BED - case VP_BED_PID_P: newvalue = value; break; - case VP_BED_PID_I: newvalue = scalePID_i(value); break; - case VP_BED_PID_D: newvalue = scalePID_d(value); break; - #endif - } - - DEBUG_ECHOLNPAIR_F("V3:", newvalue); - *(float *)var.memadr = newvalue; - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - } - void DGUSScreenHandler::HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandlePIDAutotune"); @@ -777,23 +544,23 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo switch (var.VP) { default: break; - #if ENABLED(PIDTEMP) - #if HOTENDS >= 1 - case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 - sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E0); + #if ENABLED(PIDTEMP) + #if HOTENDS >= 1 + case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 + sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E0); + break; + #endif + #if HOTENDS >= 2 + case VP_PID_AUTOTUNE_E1: + sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E1); + break; + #endif + #endif + #if ENABLED(PIDTEMPBED) + case VP_PID_AUTOTUNE_BED: + sprintf_P(buf, PSTR("M303 E-1 C5 S70 U1")); break; #endif - #if HOTENDS >= 2 - case VP_PID_AUTOTUNE_E1: - sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E1); - break; - #endif - #endif - #if ENABLED(PIDTEMPBED) - case VP_PID_AUTOTUNE_BED: - sprintf(buf, "M303 E-1 C5 S70 U1"); - break; - #endif } if (buf[0]) queue.enqueue_one_now(buf); @@ -803,7 +570,7 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo GotoScreen(DGUSLCD_SCREEN_WAITING); #endif } -#endif +#endif // HAS_PID_HEATING #if HAS_BED_PROBE void DGUSScreenHandler::HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr) { @@ -811,19 +578,7 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo const float offset = float(int16_t(swap16(*(uint16_t*)val_ptr))) / 100.0f; ExtUI::setZOffset_mm(offset); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; - } -#endif - -#if ENABLED(BABYSTEPPING) - void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); - - int16_t flag = swap16(*(uint16_t*)val_ptr); - int16_t steps = flag ? -20 : 20; - ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); - ScreenHandler.ForceCompleteUpdate(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel return; } #endif @@ -849,8 +604,8 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr #if HOTENDS >= 3 case VP_E2_CONTROL: #endif - preheat_temp = PREHEAT_1_TEMP_HOTEND; - break; + preheat_temp = PREHEAT_1_TEMP_HOTEND; + break; case VP_BED_CONTROL: preheat_temp = PREHEAT_1_TEMP_BED; @@ -900,149 +655,49 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr switch (var.VP) { default: return; - #if HOTENDS >= 1 - case VP_E0_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 0); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 1); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif + #if HOTENDS >= 1 + case VP_E0_BED_PREHEAT: + thermalManager.setTargetHotend(e_temp, 0); + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_BED_PREHEAT: + thermalManager.setTargetHotend(e_temp, 1); + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); + break; + #endif } // Go to the preheat screen to show the heating progress GotoScreen(DGUSLCD_SCREEN_PREHEAT); } -#endif +#endif // DGUS_PREHEAT_UI -#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) +#if ENABLED(POWER_LOSS_RECOVERY) - typedef struct { - ExtUI::extruder_t extruder; // which extruder to operate - uint8_t action; // load or unload - bool heated; // heating done ? - float purge_length; // the length to extrude before unload, prevent filament jam - } filament_data_t; - - static filament_data_t filament_data; - - void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleFilamentOption"); - - uint8_t e_temp = 0; - filament_data.heated = false; - uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); - if (preheat_option <= 8) // Load filament type - filament_data.action = 1; - else if (preheat_option >= 10) { // Unload filament type - preheat_option -= 10; - filament_data.action = 2; - filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + void DGUSScreenHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value = swap16(*(uint16_t*)val_ptr); + if (value) { + queue.inject_P(PSTR("M1000")); + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), 32, true); + GotoScreen(PLR_SCREEN_RECOVER); } - else // Cancel filament operation - filament_data.action = 0; - - switch (preheat_option) { - case 0: // Load PLA - #ifdef PREHEAT_1_TEMP_HOTEND - e_temp = PREHEAT_1_TEMP_HOTEND; - #endif - break; - case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); - break; - case 2: // Load PET - #ifdef PREHEAT_3_TEMP_HOTEND - e_temp = PREHEAT_3_TEMP_HOTEND; - #endif - break; - case 3: // Load FLEX - #ifdef PREHEAT_4_TEMP_HOTEND - e_temp = PREHEAT_4_TEMP_HOTEND; - #endif - break; - case 9: // Cool down - default: - e_temp = 0; - break; - } - - if (filament_data.action == 0) { // Go back to utility screen - #if HOTENDS >= 1 - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); - #endif - #if HOTENDS >= 2 - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); - #endif - GotoScreen(DGUSLCD_SCREEN_UTILITY); - } - else { // Go to the preheat screen to show the heating progress - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - } - GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + else { + recovery.cancel(); + GotoScreen(PLR_SCREEN_CANCEL); } } - void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { - DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); - if (filament_data.action <= 0) return; - - // If we close to the target temperature, we can start load or unload the filament - if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ - thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { - float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; - - if (filament_data.action == 1) { // load filament - if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); - filament_data.heated = true; - } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder)+movevalue; - } - else { // unload filament - if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); - filament_data.heated = true; - } - // Before unloading extrude to prevent jamming - if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; - filament_data.purge_length -= movevalue; - } - else - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; - } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); - } - } #endif void DGUSScreenHandler::UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup) { DEBUG_ECHOLNPAIR("SetNewScreen: ", newscreen); - if (!popup) { memmove(&past_screens[1], &past_screens[0], sizeof(past_screens) - 1); past_screens[0] = current_screen; } - current_screen = newscreen; skipVP = 0; ForceCompleteUpdate(); @@ -1062,7 +717,7 @@ void DGUSScreenHandler::UpdateScreenVPData() { if (!VPList) { DEBUG_ECHOLNPAIR(" NO SCREEN FOR: ", current_screen); ScreenComplete = true; - return; // nothing to do, likely a bug or boring screen. + return; // nothing to do, likely a bug or boring screen. } // Round-robin updating of all VPs. @@ -1076,14 +731,14 @@ void DGUSScreenHandler::UpdateScreenVPData() { update_ptr = 0; DEBUG_ECHOLNPGM(" UpdateScreenVPData done"); ScreenComplete = true; - return; // Screen completed. + return; // Screen completed. } if (VP == skipVP) { skipVP = 0; continue; } DGUS_VP_Variable rcpy; if (populate_VPVar(VP, &rcpy)) { - uint8_t expected_tx = 6 + rcpy.size; // expected overhead is 6 bytes + payload. + uint8_t expected_tx = 6 + rcpy.size; // expected overhead is 6 bytes + payload. // Send the VP to the display, but try to avoid overrunning the Tx Buffer. // But send at least one VP, to avoid getting stalled. if (rcpy.send_to_display_handler && (!sent_one || expected_tx <= dgusdisplay.GetFreeTxBuffer())) { @@ -1092,11 +747,11 @@ void DGUSScreenHandler::UpdateScreenVPData() { rcpy.send_to_display_handler(rcpy); } else { - //auto x=dgusdisplay.GetFreeTxBuffer(); + // auto x=dgusdisplay.GetFreeTxBuffer(); //DEBUG_ECHOLNPAIR(" tx almost full: ", x); //DEBUG_ECHOPAIR(" update_ptr ", update_ptr); ScreenComplete = false; - return; // please call again! + return; // please call again! } } @@ -1108,29 +763,6 @@ void DGUSScreenHandler::GotoScreen(DGUSLCD_Screens screen, bool ispopup) { UpdateNewScreen(screen, ispopup); } -bool DGUSScreenHandler::loop() { - dgusdisplay.loop(); - - const millis_t ms = millis(); - static millis_t next_event_ms = 0; - - if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { - next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - UpdateScreenVPData(); - } - - #if ENABLED(SHOW_BOOTSCREEN) - static bool booted = false; - if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) - booted = true; - if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) { - booted = true; - GotoScreen(DGUSLCD_SCREEN_MAIN); - } - #endif - return IsScreenComplete(); -} - void DGUSDisplay::RequestScreen(DGUSLCD_Screens screen) { DEBUG_ECHOLNPAIR("GotoScreen ", screen); const unsigned char gotoscreen[] = { 0x5A, 0x01, (unsigned char) (screen >> 8U), (unsigned char) (screen & 0xFFU) }; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h index df738dbfd1..21e25b3b88 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h @@ -21,212 +21,38 @@ */ #pragma once -#include "DGUSDisplay.h" -#include "DGUSVPVariable.h" +/** + * lcd/extui/lib/dgus/DGUSScreenHandler.h + */ -#include "../../../../inc/MarlinConfig.h" +#include "../../../../inc/MarlinConfigPre.h" -enum DGUSLCD_Screens : uint8_t; +#include "../../ui_api.h" -class DGUSScreenHandler { -public: - DGUSScreenHandler() = default; +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - static bool loop(); + typedef struct { + ExtUI::extruder_t extruder; // which extruder to operate + uint8_t action; // load or unload + bool heated; // heating done ? + float purge_length; // the length to extrude before unload, prevent filament jam + } filament_data_t; - /// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen - /// The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + extern filament_data_t filament_data; - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); +#endif - /// "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); - /// The same for messages from Flash - static void setstatusmessagePGM(PGM_P const msg); - // Callback for VP "Display wants to change screen on idle printer" - static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); - // Callback for VP "Screen has been changed" - static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); - // Callback for VP "All Heaters Off" - static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); - // Hook for "Change this temperature" - static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); - // Hook for "Change Flowrate" - static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - // Hook for manual move option - static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for manual move. - static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); - // Hook for manual extrude. - static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); - // Hook for motor lock and unlook - static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(POWER_LOSS_RECOVERY) - // Hook for power loss recovery. - static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for settings - static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); - static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); - static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); - #if HAS_PID_HEATING - // Hook for "Change this temperature PID para" - static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); - // Hook for PID autotune - static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if HAS_BED_PROBE - // Hook for "Change probe offset z" - static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if ENABLED(BABYSTEPPING) - // Hook for live z adjust action - static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if HAS_FAN - // Hook for fan control - static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for heater control - static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(DGUS_PREHEAT_UI) - // Hook for preheat - static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - // Hook for filament load and unload filament option - static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); - // Hook for filament load and unload - static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); - #endif +// endianness swap +inline uint16_t swap16(const uint16_t value) { return (value & 0xFFU) << 8U | (value >> 8U); } - #if ENABLED(SDSUPPORT) - // Callback for VP "Display wants to change screen when there is a SD card" - static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); - /// Scroll buttons on the file listing screen. - static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); - /// File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); - /// start print after confirmation received. - static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); - /// User hit the pause, resume or abort button. - static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); - /// User confirmed the abort action - static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); - /// User hit the tune button - static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); - /// Send a single filename to the display. - static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); - /// Marlin informed us that a new SD has been inserted. - static void SDCardInserted(); - /// Marlin informed us that the SD Card has been removed(). - static void SDCardRemoved(); - /// Marlin informed us about a bad SD Card. - static void SDCardError(); - #endif - - // OK Button the Confirm screen. - static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); - - // Update data after went to new screen (by display or by GotoScreen) - // remember: store the last-displayed screen, so it can get returned to. - // (e.g for pop up messages) - static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); - - // Recall the remembered screen. - static void PopToOldScreen(); - - // Make the display show the screen and update all VPs in it. - static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); - - static void UpdateScreenVPData(); - - // Helpers to convert and transfer data to the display. - static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); - static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); - static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); - #if ENABLED(PRINTCOUNTER) - static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); - #endif - #if HAS_FAN - static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); - #endif - static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); - #if ENABLED(DGUS_UI_WAITING) - static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); - #endif - - /// Send a value from 0..100 to a variable with a range from 0..255 - static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); - - template - static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { - if (!var.memadr) return; - union { unsigned char tmp[sizeof(T)]; T t; } x; - unsigned char *ptr = (unsigned char*)val_ptr; - LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; - *(T*)var.memadr = x.t; - } - - /// Send a float value to the display. - /// Display will get a 4-byte integer scaled to the number of digits: - /// Tell the display the number of digits and it cheats by displaying a dot between... - template - static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - float f = *(float *)var.memadr; - f *= cpow(10, decimals); - dgusdisplay.WriteVariable(var.VP, (long)f); - } - } - - /// Send a float value to the display. - /// Display will get a 2-byte integer scaled to the number of digits: - /// Tell the display the number of digits and it cheats by displaying a dot between... - template - static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - float f = *(float *)var.memadr; - DEBUG_ECHOLNPAIR_F(" >> ", f, 6); - f *= cpow(10, decimals); - dgusdisplay.WriteVariable(var.VP, (int16_t)f); - } - } - - /// Force an update of all VP on the current screen. - static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } - /// Has all VPs sent to the screen - static inline bool IsScreenComplete() { return ScreenComplete; } - - static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } - - static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } - -private: - static DGUSLCD_Screens current_screen; ///< currently on screen - static constexpr uint8_t NUM_PAST_SCREENS = 4; - static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; ///< LIFO with past screens for the "back" button. - - static uint8_t update_ptr; ///< Last sent entry in the VPList for the actual screen. - static uint16_t skipVP; ///< When updating the screen data, skip this one, because the user is interacting with it. - static bool ScreenComplete; ///< All VPs sent to screen? - - static uint16_t ConfirmVP; ///< context for confirm screen (VP that will be emulated-sent on "OK"). - - #if ENABLED(SDSUPPORT) - static int16_t top_file; ///< file on top of file chooser - static int16_t file_to_print; ///< touched file to be confirmed - #endif - - static void (*confirm_action_cb)(); -}; +#if ENABLED(DGUS_LCD_UI_ORIGIN) + #include "origin/DGUSScreenHandler.h" +#elif ENABLED(DGUS_LCD_UI_MKS) + #include "mks/DGUSScreenHandler.h" +#elif ENABLED(DGUS_LCD_UI_FYSETC) + #include "fysetc/DGUSScreenHandler.h" +#elif ENABLED(DGUS_LCD_UI_HIPRECY) + #include "hiprecy/DGUSScreenHandler.h" +#endif extern DGUSScreenHandler ScreenHandler; diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp new file mode 100644 index 0000000000..c43243b39d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp @@ -0,0 +1,418 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_FYSETC) + +#include "../DGUSScreenHandler.h" + +#include "../../../../../MarlinCore.h" +#include "../../../../../gcode/queue.h" +#include "../../../../../libs/duration_t.h" +#include "../../../../../module/settings.h" +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" +#include "../../../../../module/printcounter.h" +#include "../../../../../sd/cardreader.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr)) return; + + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + + HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: { // Resume + if (ExtUI::isPrintingFromMediaPaused()) { + ExtUI::resumePrint(); + } + } break; + + case 1: // Pause + + GotoScreen(MKSLCD_SCREEN_PAUSE); + if (!ExtUI::isPrintingFromMediaPaused()) { + ExtUI::pausePrint(); + //ExtUI::mks_pausePrint(); + } + break; + case 2: // Abort + HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + + if (filelist.seek(top_file + target_line)) { + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); // snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s"), filelist.filename()); + } + DGUSLCD_SendStringToDisplay(var); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) GotoScreen(DGUSLCD_SCREEN_MAIN); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + DEBUG_ECHOLNPAIR("\n DEBUG target", target); + + if (target == DGUSLCD_SCREEN_POPUP) { + // Special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + if (movevalue) { + const uint16_t choice = *(uint16_t*)var.memadr; + movevalue = movevalue < 0 ? -choice : choice; + } + #endif + char axiscode; + unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { + default: return; + + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_HOME_ALL: // only used for homing + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + break; + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + char buf[6] = "G28 X"; + buf[4] = axiscode; + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ForceCompleteUpdate(); + return; + } + else { + // movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓ "); + if (backup_speed != speed) { + snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + queue.enqueue_one_now(buf); + //DEBUG_ECHOPAIR(" ", buf); + } + // while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } +#endif // HAS_PID_HEATING + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + int16_t flag = swap16(*(uint16_t*)val_ptr), + steps = flag ? -20 : 20; + ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); + ForceCompleteUpdate(); + } +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) { // Load filament type + filament_data.action = 1; + } + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else { // Cancel filament operation + filament_data.action = 0; + } + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif // DGUS_FILAMENT_LOADUNLOAD + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + + if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + booted = true; + + if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) + booted = true; + #endif + return IsScreenComplete(); +} + +#endif // DGUS_LCD_UI_FYSETC diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h new file mode 100644 index 0000000000..28ab952e53 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h @@ -0,0 +1,240 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../DGUSDisplay.h" +#include "../DGUSVPVariable.h" +#include "../DGUSDisplayDef.h" + +#include "../../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + // The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + // "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + // The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + // Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + // start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + // User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + // User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + // User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + // Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + // Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + // Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + // Marlin informed us about a bad SD Card. + static void SDCardError(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + // Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + // Send a float value to the display. + // Display will get a 4-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + // Send a float value to the display. + // Display will get a 2-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + // Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + // Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; //< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; //< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; //< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; //< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; //< All VPs sent to screen? + + static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; //< file on top of file chooser + static int16_t file_to_print; //< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +#if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS +#endif diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp new file mode 100644 index 0000000000..90cfae7f09 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp @@ -0,0 +1,418 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_HYPRECY) + +#include "../DGUSScreenHandler.h" + +#include "../../../../../MarlinCore.h" +#include "../../../../../gcode/queue.h" +#include "../../../../../libs/duration_t.h" +#include "../../../../../module/settings.h" +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" +#include "../../../../../module/printcounter.h" +#include "../../../../../sd/cardreader.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr)) return; + + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + + HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: { // Resume + if (ExtUI::isPrintingFromMediaPaused()) { + ExtUI::resumePrint(); + } + } break; + + case 1: // Pause + + GotoScreen(MKSLCD_SCREEN_PAUSE); + if (!ExtUI::isPrintingFromMediaPaused()) { + ExtUI::pausePrint(); + //ExtUI::mks_pausePrint(); + } + break; + case 2: // Abort + HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + + if (filelist.seek(top_file + target_line)) { + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); // snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s"), filelist.filename()); + } + DGUSLCD_SendStringToDisplay(var); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) GotoScreen(DGUSLCD_SCREEN_MAIN); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + DEBUG_ECHOLNPAIR("\n DEBUG target", target); + + if (target == DGUSLCD_SCREEN_POPUP) { + // Special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + if (movevalue) { + const uint16_t choice = *(uint16_t*)var.memadr; + movevalue = movevalue < 0 ? -choice : choice; + } + #endif + char axiscode; + unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { + default: return; + + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_HOME_ALL: // only used for homing + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + break; + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + char buf[6] = "G28 X"; + buf[4] = axiscode; + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ForceCompleteUpdate(); + return; + } + else { + // movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓ "); + if (backup_speed != speed) { + snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + queue.enqueue_one_now(buf); + //DEBUG_ECHOPAIR(" ", buf); + } + // while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } +#endif // HAS_PID_HEATING + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + int16_t flag = swap16(*(uint16_t*)val_ptr), + steps = flag ? -20 : 20; + ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); + ForceCompleteUpdate(); + } +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) { // Load filament type + filament_data.action = 1; + } + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else { // Cancel filament operation + filament_data.action = 0; + } + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif // DGUS_FILAMENT_LOADUNLOAD + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + + if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + booted = true; + + if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) + booted = true; + #endif + return IsScreenComplete(); +} + +#endif // DGUS_LCD_UI_HYPRECY diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h new file mode 100644 index 0000000000..28ab952e53 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h @@ -0,0 +1,240 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../DGUSDisplay.h" +#include "../DGUSVPVariable.h" +#include "../DGUSDisplayDef.h" + +#include "../../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + // The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + // "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + // The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + // Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + // start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + // User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + // User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + // User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + // Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + // Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + // Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + // Marlin informed us about a bad SD Card. + static void SDCardError(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + // Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + // Send a float value to the display. + // Display will get a 4-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + // Send a float value to the display. + // Display will get a 2-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + // Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + // Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; //< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; //< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; //< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; //< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; //< All VPs sent to screen? + + static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; //< file on top of file chooser + static int16_t file_to_print; //< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +#if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS +#endif diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp new file mode 100644 index 0000000000..14b7394aaa --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -0,0 +1,795 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_MKS) + +#include "DGUSDisplayDef.h" +#include "../DGUSDisplay.h" +#include "../DGUSScreenHandler.h" + +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" + +#include "../../../ui_api.h" +#include "../../../../marlinui.h" + +#if ENABLED(HAS_STEALTHCHOP) + #include "../../../../module/stepper/trinamic.h" +#endif + +#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + uint16_t distanceToMove = 10; +#endif + +uint16_t distanceMove = 1; +float distanceFilament = 10; +uint16_t FilamentSpeed = 25; +float ZOffset_distance = 0.1; +float mesh_adj_distance = 0.1; +float Z_distance = 0.1; + +int16_t level_1_x_point = 20; +int16_t level_1_y_point = 20; + +int16_t level_2_x_point = 20; +int16_t level_2_y_point = 20; + +int16_t level_3_x_point = 20; +int16_t level_3_y_point = 20; + +int16_t level_4_x_point = 20; +int16_t level_4_y_point = 20; +int16_t level_5_x_point = X_MAX_POS / 2; +int16_t level_5_y_point = Y_MAX_POS / 2; + +uint16_t tim_h; +uint16_t tim_m; +uint16_t tim_s; + +uint16_t x_park_pos = 20; +uint16_t y_park_pos = 20; +uint16_t z_park_pos = 10; + +xyz_pos_t position_before_pause; + +void MKS_pause_print_move() { + planner.synchronize(); + position_before_pause = current_position; + do_blocking_move_to(X_MIN_POS + x_park_pos, Y_MIN_POS + y_park_pos, current_position.z + z_park_pos); +} + +void MKS_resume_print_move() { do_blocking_move_to(position_before_pause); } + +uint16_t min_ex_temp = 0; + +float z_offset_add = 0; + +#if ENABLED(SENSORLESS_HOMING) + uint16_t tmc_x_step = 0; + uint16_t tmc_y_step = 0; + uint16_t tmc_z_step = 0; +#else + uint16_t tmc_x_step = 0; + uint16_t tmc_y_step = 0; + uint16_t tmc_z_step = 0; +#endif + +uint16_t lcd_default_light = 50; + +EX_FILAMENT_DEF ex_filament; +RUNOUT_MKS_DEF runout_mks; +NOZZLE_PARK_DEF nozzle_park_mks; + +const uint16_t VPList_Boot[] PROGMEM = { + VP_MARLIN_VERSION, + 0x0000 +}; + +#define MKSLIST_E_ITEM(N) VP_T_E##N##_Is, VP_T_E##N##_Set, + +const uint16_t VPList_Main[] PROGMEM = { + // VP_M117, for completeness, but it cannot be auto-uploaded. + #if HOTENDS >= 1 + MKSLIST_E_ITEM(0) VP_E0_STATUS, + #endif + #if HOTENDS >= 2 + MKSLIST_E_ITEM(1) + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, VP_BED_STATUS, + #endif + #if HAS_FAN + VP_Fan0_Percentage, VP_FAN0_STATUS, + #endif + VP_XPos, VP_YPos, VP_ZPos, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + VP_PrintProgress_Percentage, + #endif + 0x0000 +}; + +const uint16_t MKSList_Home[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // Language + // VP_HOME_Dis, + + 0x0000 +}; + +const uint16_t MKSList_Setting[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // Language + VP_Setting_Dis, + 0x0000 +}; + +const uint16_t MKSList_Tool[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // Language + VP_Tool_Dis, + // LCD BLK + VP_LCD_BLK, + 0x0000 +}; + +const uint16_t MKSList_EXTRUE[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + VP_Filament_distance, + VP_Filament_speed, + + 0x0000 +}; + +const uint16_t MKSList_LEVEL[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + 0x0000 +}; + +const uint16_t MKSList_MOVE[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + 0x0000 +}; + +const uint16_t MKSList_Print[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // Print Percent + VP_PrintProgress_Percentage, + + VP_PrintTime, + + VP_Flowrate_E0, + VP_Flowrate_E1, + VP_Feedrate_Percentage, + + VP_PrintTime_H, + VP_PrintTime_M, + VP_PrintTime_S, + + VP_XPos, + VP_YPos, + VP_ZPos, + + 0x0000 +}; + +const uint16_t MKSList_SD_File[] PROGMEM = { + VP_SD_FileName0, VP_SD_FileName1, + VP_SD_FileName2, VP_SD_FileName3, + VP_SD_FileName4, VP_SD_FileName5, + VP_SD_FileName6, VP_SD_FileName7, + VP_SD_FileName8, VP_SD_FileName9, + + 0x0000 +}; + +const uint16_t MKSList_TempOnly[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // LCD BLK + VP_LCD_BLK, + 0x0000 +}; + +const uint16_t MKSList_Pluse[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // Pluse + VP_X_STEP_PER_MM, + VP_Y_STEP_PER_MM, + VP_Z_STEP_PER_MM, + VP_E0_STEP_PER_MM, + VP_E1_STEP_PER_MM, + + 0x0000 +}; + +const uint16_t MKSList_MaxSpeed[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // Pluse + VP_X_MAX_SPEED, + VP_Y_MAX_SPEED, + VP_Z_MAX_SPEED, + VP_E0_MAX_SPEED, + VP_E1_MAX_SPEED, + + 0x0000 +}; + +const uint16_t MKSList_MaxAcc[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // ACC + VP_ACC_SPEED, + VP_X_ACC_MAX_SPEED, + VP_Y_ACC_MAX_SPEED, + VP_Z_ACC_MAX_SPEED, + VP_E0_ACC_MAX_SPEED, + VP_E1_ACC_MAX_SPEED, + + 0x0000 +}; + +const uint16_t MKSList_PID[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // PID + VP_E0_PID_P, + VP_E0_PID_I, + VP_E0_PID_D, + + 0x0000 +}; + +const uint16_t MKSList_Level_Point[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // Level Point + VP_Level_Point_One_X, + VP_Level_Point_One_Y, + VP_Level_Point_Two_X, + VP_Level_Point_Two_Y, + VP_Level_Point_Three_X, + VP_Level_Point_Three_Y, + VP_Level_Point_Four_X, + VP_Level_Point_Four_Y, + VP_Level_Point_Five_X, + VP_Level_Point_Five_Y, + + 0x0000 +}; + +const uint16_t MKSList_Level_PrintConfig[] PROGMEM = { + VP_T_E0_Set, + VP_T_E1_Set, + VP_T_Bed_Set, + VP_Flowrate_E0, + VP_Flowrate_E1, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + + 0x0000 +}; + +const uint16_t MKSList_PrintPauseConfig[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + + VP_X_PARK_POS, + VP_Y_PARK_POS, + VP_Z_PARK_POS, + + 0x0000 +}; + +const uint16_t MKSList_MotoConfig[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + + VP_TRAVEL_SPEED, + VP_FEEDRATE_MIN_SPEED, + VP_T_F_SPEED, + + 0x0000 +}; + +const uint16_t MKSList_EX_Config[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + VP_MIN_EX_T,VP_Min_EX_T_E, + 0x0000 +}; + +const uint16_t MKSTMC_Config[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + VP_MIN_EX_T, + + VP_TMC_X_STEP, + VP_TMC_Y_STEP, + VP_TMC_Z_STEP, + VP_TMC_X1_Current, + VP_TMC_Y1_Current, + VP_TMC_X_Current, + VP_TMC_Y_Current, + VP_TMC_Z_Current, + VP_TMC_E0_Current, + VP_TMC_E1_Current, + VP_TMC_Z1_Current, + + 0x0000 +}; + +const uint16_t MKSAuto_Level[] PROGMEM = { + VP_MESH_LEVEL_POINT_DIS, + VP_ZPos, + 0x0000 +}; + +const uint16_t MKSOffset_Config[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + VP_OFFSET_X, + VP_OFFSET_Y, + VP_OFFSET_Z, + 0x0000 +}; + +const uint16_t MKSBabyStep[] PROGMEM = { + VP_ZOffset_DE_DIS, + 0x0000 +}; + +const uint16_t MKSList_About[] PROGMEM = { + // Marlin version + VP_MARLIN_VERSION, + // H43 Version + VP_MKS_H43_VERSION, + VP_MKS_H43_UpdataVERSION, + 0x0000 +}; + +// Page data updata +const struct VPMapping VPMap[] PROGMEM = { + { MKSLCD_SCREEN_BOOT, VPList_Boot }, // Boot Page to show logo 0 + { MKSLCD_SCREEN_HOME, MKSList_Home }, // Home, Page 1 + { MKSLCD_SCREEN_SETTING, MKSList_Setting }, // Setting, Page 2 + { MKSLCD_SCREEM_TOOL, MKSList_Tool }, // Page 3 + { MKSLCD_SCREEN_EXTRUDE_P1, MKSList_EXTRUE }, // Page 4 + { MKSLCD_SCREEN_EXTRUDE_P2, MKSList_EXTRUE }, // Page 11 + { MKSLCD_PAUSE_SETTING_EX, MKSList_EXTRUE }, // Page 57 + { MKSLCD_PAUSE_SETTING_EX2, MKSList_EXTRUE }, // Page 61 + { MKSLCD_SCREEN_LEVEL, MKSList_LEVEL }, // Page 5 + { MKSLCD_SCREEN_MOVE, MKSList_MOVE }, // Page 6 + { MKSLCD_SCREEN_PRINT, MKSList_Print }, // Page 7 + { MKSLCD_SCREEN_PAUSE, MKSList_Print }, // Page 26 + { MKSLCD_SCREEN_CHOOSE_FILE, MKSList_SD_File }, // Page 15 + { MKSLCD_SCREEN_MOTOR_PLUSE, MKSList_Pluse }, // Page 51 + { MKSLCD_SCREEN_MOTOR_SPEED, MKSList_MaxSpeed }, // Page 55 + { MKSLCD_SCREEN_MOTOR_ACC_MAX, MKSList_MaxAcc }, // Page 53 + { MKSLCD_SCREEN_LEVEL_DATA, MKSList_Level_Point }, // Page 48 + { MKSLCD_PrintPause_SET, MKSList_PrintPauseConfig }, // Page 49 + { MKSLCD_FILAMENT_DATA, MKSList_SD_File }, // Page 50 + { MKSLCD_SCREEN_Config, MKSList_TempOnly }, // Page 46 + { MKSLCD_SCREEN_Config_MOTOR, MKSList_MotoConfig }, // Page 47 + { MKSLCD_PID, MKSList_PID }, // Page 56 + { MKSLCD_ABOUT, MKSList_About }, // Page 36 + { MKSLCD_SCREEN_PRINT_CONFIG, MKSList_Level_PrintConfig }, // Page 60 + { MKSLCD_SCREEN_EX_CONFIG, MKSList_EX_Config }, // Page 65 + { MKSLCD_SCREEN_TMC_Config, MKSTMC_Config }, // Page 70 + { MKSLCD_AUTO_LEVEL, MKSAuto_Level }, // Page 73 + { MKSLCD_Screen_Offset_Config, MKSOffset_Config }, // Page 30 + { MKSLCD_Screen_PMove, MKSList_MOVE }, // Page 64 + { MKSLCD_Screen_Baby, MKSBabyStep }, // Page 71 + //{ MKSLCD_SCREEN_LEVEL_DATA, MKSList_SD_File}, + //{ MKSLCD_SCREEN_HOME, VPList_Boot }, + { 0, nullptr } // List is terminated with an nullptr as table entry. +}; + +const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; +const char H43Version[] PROGMEM = "MKS H43_V1.30"; +const char Updata_Time[] PROGMEM = STRING_DISTRIBUTION_DATE; + +// Helper to define a DGUS_VP_Variable for common use cases. +#define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR) \ + { \ + .VP = VPADR, .memadr = VPADRVAR, .size = sizeof(VPADRVAR), \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR \ + } + +// Helper to define a DGUS_VP_Variable when the sizeo of the var cannot be determined automaticalyl (eg. a string) +#define VPHELPER_STR(VPADR, VPADRVAR, STRLEN, RXFPTR, TXFPTR) \ + { \ + .VP = VPADR, .memadr = VPADRVAR, .size = STRLEN, \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR \ + } + +const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { + // Helper to detect touch events + VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + #endif + VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + + // Back Button + VPHELPER(VP_BACK_PAGE, nullptr, &ScreenHandler.ScreenBackChange, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), + + VPHELPER(VP_MOVE_X, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, &ScreenHandler.HandleManualMove, nullptr), + + VPHELPER(VP_X_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_Y_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_Z_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), + + VPHELPER(VP_MOVE_DISTANCE, &distanceMove, &ScreenHandler.GetManualMovestep, nullptr), + + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_LEVEL_POINT, nullptr, &ScreenHandler.ManualAssistLeveling, nullptr), + + #if ENABLED(POWER_LOSS_RECOVERY) + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), + #endif + VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), + #if ENABLED(SINGLE_Z_CALIBRATION) + VPHELPER(VP_Z_CALIBRATE, nullptr, &ScreenHandler.HandleZCalibration, nullptr), + #endif + #if ENABLED(FIRST_LAYER_CAL) + VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &ScreenHandler.HandleFirstLayerCal, nullptr), + #endif + {.VP = VP_MARLIN_VERSION, .memadr = (void *)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr + {.VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay}, + {.VP = VP_MKS_H43_VERSION, .memadr = (void *)H43Version, .size = VP_MKS_H43_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + {.VP = VP_MKS_H43_UpdataVERSION, .memadr = (void *)Updata_Time, .size = VP_MKS_H43_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + + // Temperature Data + #if HOTENDS >= 1 + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), + #if ENABLED(DGUS_PREHEAT_UI) + VPHELPER(VP_E0_BED_PREHEAT, nullptr, &ScreenHandler.HandlePreheat, nullptr), + #endif + #if ENABLED(PIDTEMP) + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + VPHELPER(VP_LOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentLoad, nullptr), + VPHELPER(VP_UNLOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentUnLoad, nullptr), + VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #endif + + #if HOTENDS >= 2 + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), + + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + + #if ENABLED(PIDTEMP) + VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), + #endif + + VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), + #endif + + #if HAS_HEATED_BED + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), + #if ENABLED(PIDTEMPBED) + VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), + #endif + #endif + + // Fan Data + #if HAS_FAN + #define FAN_VPHELPER(N) \ + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_SetUint8, &ScreenHandler.DGUSLCD_SendFanToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &ScreenHandler.HandleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &ScreenHandler.DGUSLCD_SendFanStatusToDisplay), + REPEAT(FAN_COUNT, FAN_VPHELPER) + #endif + + // Feedrate + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + // Position Data + VPHELPER(VP_XPos, ¤t_position.x, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + + // Level Point Set + VPHELPER(VP_Level_Point_One_X, &level_1_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_One_Y, &level_1_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_X, &level_2_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_Y, &level_2_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_X, &level_3_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_Y, &level_3_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_X, &level_4_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_Y, &level_4_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_X, &level_5_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_Y, &level_5_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + // Print Progress + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay), + + //LCD Control + VPHELPER(VP_LCD_BLK, &lcd_default_light, &ScreenHandler.LCD_BLK_Adjust, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + // Print Time + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay_MKS), + + #if ENABLED(PRINTCOUNTER) + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintAccTimeToDisplay), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintsTotalToDisplay), + #endif + + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + + VPHELPER(VP_X_MAX_SPEED, &planner.settings.max_feedrate_mm_s[X_AXIS], ScreenHandler.HandleMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Y_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Y_AXIS], ScreenHandler.HandleMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Z_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Z_AXIS], ScreenHandler.HandleMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + + #if HOTENDS >= 1 + VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E0_AXIS], ScreenHandler.HandleExtruderMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + #endif + #if HOTENDS >= 2 + VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E1_AXIS], ScreenHandler.HandleExtruderMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + #endif + + VPHELPER(VP_X_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[X_AXIS], ScreenHandler.HandleMaxAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Y_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Y_AXIS], ScreenHandler.HandleMaxAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Z_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Z_AXIS], ScreenHandler.HandleMaxAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + #if HOTENDS >= 1 + VPHELPER(VP_E0_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E0_AXIS], ScreenHandler.HandleExtruderAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if HOTENDS >= 2 + VPHELPER(VP_E1_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E1_AXIS], ScreenHandler.HandleExtruderAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + + VPHELPER(VP_TRAVEL_SPEED, (uint16_t *)&planner.settings.travel_acceleration, ScreenHandler.HandleTravelAccChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_FEEDRATE_MIN_SPEED, (uint16_t *)&planner.settings.min_feedrate_mm_s, ScreenHandler.HandleFeedRateMinChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_T_F_SPEED, (uint16_t *)&planner.settings.min_travel_feedrate_mm_s, ScreenHandler.HandleMin_T_F_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_ACC_SPEED, (uint16_t *)&planner.settings.acceleration, ScreenHandler.HandleAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + VPHELPER(VP_X_PARK_POS, &x_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Y_PARK_POS, &y_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Z_PARK_POS, &z_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MIN_EX_T, &thermalManager.extrude_min_temp, ScreenHandler.HandleGetExMinTemp_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + #if ENABLED(SENSORLESS_HOMING) // TMC SENSORLESS Setting + #if AXIS_HAS_STEALTHCHOP(X) + VPHELPER(VP_TMC_X_STEP, &tmc_x_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + VPHELPER(VP_TMC_Y_STEP, &tmc_y_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + VPHELPER(VP_TMC_Z_STEP, &tmc_z_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + #endif + #endif + + #if HAS_TRINAMIC_CONFIG // TMC Current Setting + #if AXIS_IS_TMC(X) + VPHELPER(VP_TMC_X_Current, &stepperX.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(Y) + VPHELPER(VP_TMC_Y_Current, &stepperY.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(Z) + VPHELPER(VP_TMC_Z_Current, &stepperZ.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(E0) + VPHELPER(VP_TMC_E0_Current, &stepperE0.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(E1) + VPHELPER(VP_TMC_E1_Current, &stepperE1.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(X2) + VPHELPER(VP_TMC_X1_Current, &stepperX2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(Y2) + VPHELPER(VP_TMC_Y1_Current, &stepperY2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(Z2) + VPHELPER(VP_TMC_Z1_Current, &stepperZ2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #endif + + VPHELPER(VP_EEPROM_CTRL, nullptr, ScreenHandler.EEPROM_CTRL, nullptr), + VPHELPER(VP_LEVEL_BUTTON, nullptr, ScreenHandler.Level_Ctrl_MKS, nullptr), + VPHELPER(VP_LANGUAGE_CHANGE, nullptr, ScreenHandler.LanguageChange_MKS, nullptr), + + //VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + + VPHELPER(VP_SD_Print_LiveAdjustZ_Confirm, nullptr, ScreenHandler.ZoffsetConfirm, nullptr), + + VPHELPER(VP_ZOffset_Distance,nullptr ,ScreenHandler.GetZoffsetDistance, nullptr), + VPHELPER(VP_MESH_LEVEL_ADJUST, nullptr, ScreenHandler.MeshLevelDistanceConfig, nullptr), + VPHELPER(VP_MESH_LEVEL_POINT,nullptr, ScreenHandler.MeshLevel,nullptr), + VPHELPER(VP_Min_EX_T_E, &thermalManager.extrude_min_temp, &ScreenHandler.GetMinExtrudeTemp, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_AutoTurnOffSw, nullptr, &ScreenHandler.GetTurnOffCtrl, nullptr), + + #if HOTENDS >= 1 + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + #endif + #if HOTENDS >= 2 + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + #endif + + + // SDCard File listing + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName5, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName6, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName7, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName8, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName9, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, ScreenHandler.DGUSLCD_SD_ResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), + #if ENABLED(BABYSTEPPING) + VPHELPER(VP_SD_Print_LiveAdjustZ,nullptr, ScreenHandler.HandleLiveAdjustZ, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_ZOffset_DE_DIS,&z_offset_add,nullptr, &ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + #endif + #if HAS_BED_PROBE + VPHELPER(VP_OFFSET_X, &probe.offset.x, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Y, &probe.offset.y, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Z, &probe.offset.z, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + #endif + #endif + + #if ENABLED(DGUS_UI_WAITING) + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), + #endif + + // Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content. + //{.VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + //{.VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + //{.VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + //{.VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + + {.VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay_Language_MKS}, + {.VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay_Language_MKS}, + {.VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay_Language_MKS}, + {.VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay_Language_MKS}, + + VPHELPER(0, 0, 0, 0) // must be last entry. +}; + +#endif // DGUS_LCD_UI_MKS diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h new file mode 100644 index 0000000000..47695edf0f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -0,0 +1,908 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../DGUSDisplayDef.h" + +//#define USE_MKS_GREEN_UI +//#define DGUS_MKS_RUNOUT_SENSOR + +#define LOGO_TIME_DELAY TERN(USE_MKS_GREEN_UI, 5000, 1500) + +#if ENABLED(DGUS_MKS_RUNOUT_SENSOR) + #define MT_DET_1_PIN 1 + #define MT_DET_2_PIN 2 + #define MT_DET_PIN_INVERTING false +#endif + +#define MKS_FINSH + +extern uint16_t distanceMove; +extern float distanceFilament; +extern uint16_t FilamentSpeed; +extern float ZOffset_distance; +extern float mesh_adj_distance; +extern float Z_distance; + +extern int16_t level_1_x_point; +extern int16_t level_1_y_point; +extern int16_t level_2_x_point; +extern int16_t level_2_y_point; +extern int16_t level_3_x_point; +extern int16_t level_3_y_point; +extern int16_t level_4_x_point; +extern int16_t level_4_y_point; +extern int16_t level_5_x_point; +extern int16_t level_5_y_point; + +extern uint16_t tim_h; +extern uint16_t tim_m; +extern uint16_t tim_s; + +extern uint16_t x_park_pos; +extern uint16_t y_park_pos; +extern uint16_t z_park_pos; + +extern xyz_pos_t position_before_pause; +void MKS_pause_print_move(); +void MKS_resume_print_move(); + +extern uint16_t min_ex_temp; + +extern float z_offset_add; + +extern uint16_t tmc_x_step; +extern uint16_t tmc_y_step; +extern uint16_t tmc_z_step; + +extern uint16_t lcd_default_light; + +#if AXIS_HAS_STEALTHCHOP(X) + extern uint16_t tmc_x_current; +#endif +#if AXIS_HAS_STEALTHCHOP(Y) + extern uint16_t tmc_y_current; +#endif +#if AXIS_HAS_STEALTHCHOP(Z) + extern uint16_t tmc_z_current; +#endif +#if AXIS_HAS_STEALTHCHOP(E0) + extern uint16_t tmc_e0_current; +#endif +#if AXIS_HAS_STEALTHCHOP(E1) + extern uint16_t tmc_e1_current; +#endif + +typedef enum { + EX_HEATING, + EX_HEAT_STARUS, + EX_CHANGING, + EX_CHANGE_STATUS, + EX_NONE, +} EX_STATUS_DEF; + +typedef struct { + //uint8_t ex_change_flag:1; + //uint8_t ex_heat_flag:1; + uint8_t ex_load_unload_flag:1; //0:unload 1:load + EX_STATUS_DEF ex_status; + uint32_t ex_tick_start; + uint32_t ex_tick_end; + uint32_t ex_speed; + uint32_t ex_length; + uint32_t ex_need_time; +} EX_FILAMENT_DEF; + +extern EX_FILAMENT_DEF ex_filament; + +typedef enum { + UNRUNOUT_STATUS, + RUNOUT_STATUS, + RUNOUT_WAITTING_STATUS, + RUNOUT_BEGIN_STATUS, +} RUNOUT_MKS_STATUS_DEF; + +typedef struct { + RUNOUT_MKS_STATUS_DEF runout_status; + uint8_t pin_status; + uint8_t de_count; + uint8_t de_times; +} RUNOUT_MKS_DEF; + +extern RUNOUT_MKS_DEF runout_mks; + +typedef struct { + uint8_t print_pause_start_flag:1; + uint8_t runout_flag:1; + bool blstatus; + uint16_t x_pos; + uint16_t y_pos; + uint16_t z_pos; +} NOZZLE_PARK_DEF; + +extern NOZZLE_PARK_DEF nozzle_park_mks; + +enum DGUSLCD_Screens : uint8_t { + #if ENABLED(USE_MKS_GREEN_UI) + + DGUSLCD_SCREEN_BOOT = 33, + DGUSLCD_SCREEN_MAIN = 60, + DGUSLCD_SCREEN_STATUS = 60, + DGUSLCD_SCREEN_STATUS2 = 60, + DGUSLCD_SCREEN_PREHEAT = 18, + DGUSLCD_SCREEN_POWER_LOSS = 100, + DGUSLCD_SCREEN_MANUALMOVE = 192, + DGUSLCD_SCREEN_UTILITY = 120, + DGUSLCD_SCREEN_FILAMENT_UNLOADING = 158, + DGUSLCD_SCREEN_SDFILELIST = 15, + DGUSLCD_SCREEN_SDPRINTMANIPULATION = 15, + DGUSLCD_SCREEN_SDPRINTTUNE = 17, + + MKSLCD_SCREEN_BOOT = 33, + MKSLCD_SCREEN_HOME = 60, // MKS main page + MKSLCD_SCREEN_SETTING = 62, // MKS Setting page / no wifi whit + MKSLCD_SCREEM_TOOL = 64, // MKS Tool page + MKSLCD_SCREEN_EXTRUDE_P1 = 75, + MKSLCD_SCREEN_EXTRUDE_P2 = 77, + MKSLCD_SCREEN_LEVEL = 73, + MKSLCD_AUTO_LEVEL = 81, + MKSLCD_SCREEN_MOVE = 66, + MKSLCD_SCREEN_PRINT = 68, + MKSLCD_SCREEN_PAUSE = 70, + MKSLCD_SCREEN_CHOOSE_FILE = 87, + MKSLCD_SCREEN_NO_CHOOSE_FILE = 88, + MKSLCD_SCREEN_Config = 101, + MKSLCD_SCREEN_Config_MOTOR = 103, + MKSLCD_SCREEN_MOTOR_PLUSE = 104, + MKSLCD_SCREEN_MOTOR_SPEED = 102, + MKSLCD_SCREEN_MOTOR_ACC_MAX = 105, + MKSLCD_SCREEN_PRINT_CONFIG = 72, + MKSLCD_SCREEN_LEVEL_DATA = 106, + MKSLCD_PrintPause_SET = 107, + //MKSLCD_FILAMENT_DATA = 50, + MKSLCD_ABOUT = 83, + MKSLCD_PID = 108, + MKSLCD_PAUSE_SETTING_MOVE = 98, + MKSLCD_PAUSE_SETTING_EX = 96, + MKSLCD_PAUSE_SETTING_EX2 = 97, + MKSLCD_SCREEN_PRINT_CONFIRM = 94, + MKSLCD_SCREEN_EX_CONFIG = 112, + MKSLCD_SCREEN_EEP_Config = 89, + MKSLCD_SCREEN_PrintDone = 92, + MKSLCD_SCREEN_TMC_Config = 111, + MKSLCD_Screen_Offset_Config = 109, + MKSLCD_Screen_PMove = 98, + MKSLCD_Screen_Baby = 79, + + #else + + DGUSLCD_SCREEN_BOOT = 120, + DGUSLCD_SCREEN_MAIN = 1, + + DGUSLCD_SCREEN_STATUS = 1, + DGUSLCD_SCREEN_STATUS2 = 1, + DGUSLCD_SCREEN_PREHEAT = 18, + DGUSLCD_SCREEN_POWER_LOSS = 100, + DGUSLCD_SCREEN_MANUALMOVE = 192, + DGUSLCD_SCREEN_UTILITY = 120, + DGUSLCD_SCREEN_FILAMENT_UNLOADING = 158, + DGUSLCD_SCREEN_SDFILELIST = 15, + DGUSLCD_SCREEN_SDPRINTMANIPULATION = 15, + DGUSLCD_SCREEN_SDPRINTTUNE = 17, + + MKSLCD_SCREEN_BOOT = 0, + MKSLCD_SCREEN_HOME = 1, // MKS main page + MKSLCD_SCREEN_SETTING = 2, // MKS Setting page / no wifi whit + MKSLCD_SCREEM_TOOL = 3, // MKS Tool page + MKSLCD_SCREEN_EXTRUDE_P1 = 4, + MKSLCD_SCREEN_EXTRUDE_P2 = 11, + MKSLCD_SCREEN_LEVEL = 5, + MKSLCD_AUTO_LEVEL = 73, + MKSLCD_SCREEN_LEVEL_PRESS = 9, + MKSLCD_SCREEN_MOVE = 6, + MKSLCD_SCREEN_PRINT = 7, + MKSLCD_SCREEN_PRINT_PRESS = 13, + MKSLCD_SCREEN_PAUSE = 26, + MKSLCD_SCREEN_PAUSE_PRESS = 26, + MKSLCD_SCREEN_CHOOSE_FILE = 15, + MKSLCD_SCREEN_NO_CHOOSE_FILE = 17, + MKSLCD_SCREEN_Config = 46, + MKSLCD_SCREEN_Config_MOTOR = 47, + MKSLCD_SCREEN_MOTOR_PLUSE = 51, + MKSLCD_SCREEN_MOTOR_SPEED = 55, + MKSLCD_SCREEN_MOTOR_ACC_MAX = 53, + MKSLCD_SCREEN_PRINT_CONFIG = 60, + MKSLCD_SCREEN_LEVEL_DATA = 48, + MKSLCD_PrintPause_SET = 49, + MKSLCD_FILAMENT_DATA = 50, + MKSLCD_ABOUT = 36, + MKSLCD_PID = 56, + MKSLCD_PAUSE_SETTING_MOVE = 58, + MKSLCD_PAUSE_SETTING_EX = 57, + MKSLCD_PAUSE_SETTING_EX2 = 61, + MKSLCD_SCREEN_NO_FILE = 42, + MKSLCD_SCREEN_PRINT_CONFIRM = 43, + MKSLCD_SCREEN_EX_CONFIG = 65, + MKSLCD_SCREEN_EEP_Config = 20, + MKSLCD_SCREEN_PrintDone = 25, + MKSLCD_SCREEN_TMC_Config = 70, + MKSLCD_Screen_Offset_Config = 30, + MKSLCD_Screen_PMove = 64, + MKSLCD_Screen_Baby = 71, + + #endif + + DGUSLCD_SCREEN_CONFIRM = 240, + DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUSLCD_SCREEN_WAITING = 251, + DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUSLDC_SCREEN_UNUSED = 255 +}; + +// Display Memory layout used (T5UID) +// Except system variables this is arbitrary, just to organize stuff.... + +// 0x0000 .. 0x0FFF -- System variables and reserved by the display +// 0x1000 .. 0x1FFF -- Variables to never change location, regardless of UI Version +// 0x2000 .. 0x2FFF -- Controls (VPs that will trigger some action) +// 0x3000 .. 0x4FFF -- Marlin Data to be displayed +// 0x5000 .. -- SPs (if we want to modify display elements, e.g change color or like) -- currently unused + +// As there is plenty of space (at least most displays have >8k RAM), we do not pack them too tight, +// so that we can keep variables nicely together in the address space. + +// UI Version always on 0x1000...0x1002 so that the firmware can check this and bail out. + +// constexpr uint16_t VP_UI_VERSION_MAJOR = 0x1000; // Major -- incremented when incompatible +// constexpr uint16_t VP_UI_VERSION_MINOR = 0x1001; // Minor -- incremented on new features, but compatible +// constexpr uint16_t VP_UI_VERSION_PATCH = 0x1002; // Patch -- fixed which do not change functionality. +// constexpr uint16_t VP_UI_FLAVOUR = 0x1010; // lets reserve 16 bytes here to determine if UI is suitable for this Marlin. tbd. + +// Storage space for the Killscreen messages. 0x1100 - 0x1200 . Reused for the popup. +// constexpr uint16_t VP_MSGSTR1 = 0x1100; +// constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... +// constexpr uint16_t VP_MSGSTR2 = 0x1140; +// constexpr uint8_t VP_MSGSTR2_LEN = 0x20; +// constexpr uint16_t VP_MSGSTR3 = 0x1180; +// constexpr uint8_t VP_MSGSTR3_LEN = 0x20; +// constexpr uint16_t VP_MSGSTR4 = 0x11C0; +// constexpr uint8_t VP_MSGSTR4_LEN = 0x20; + +// Screenchange request for screens that only make sense when printer is idle. +// e.g movement is only allowed if printer is not printing. +// Marlin must confirm by setting the screen manually. +// constexpr uint16_t VP_SCREENCHANGE_ASK = 0x2000; +// constexpr uint16_t VP_SCREENCHANGE = 0x2001; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. +// constexpr uint16_t VP_TEMP_ALL_OFF = 0x2002; // Turn all heaters off. Value arbitrary ;)= +// constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x2003; // "Print" Button touched -- go only there if there is an SD Card. +// constexpr uint16_t VP_CONFIRMED = 0x2010; // OK on confirm screen. + +// // Buttons on the SD-Card File listing. +// constexpr uint16_t VP_SD_ScrollEvent = 0x2020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down +// constexpr uint16_t VP_SD_FileSelected = 0x2022; // Number of file field selected. +// constexpr uint16_t VP_SD_FileSelectConfirm = 0x2024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) + +// constexpr uint16_t VP_SD_ResumePauseAbort = 0x2026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints +// constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmation (virtual, will be injected by the confirm dialog) +// constexpr uint16_t VP_SD_Print_Setting = 0x2040; +// constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x2050; // Data: 0 down, 1 up + +// Controls for movement (we can't use the incremental / decremental feature of the display at this feature works only with 16 bit values +// (which would limit us to 655.35mm, which is likely not a problem for common setups, but i don't want to rule out hangprinters support) +// A word about the coding: The VP will be per axis and the return code will be an signed 16 bit value in 0.01 mm resolution, telling us +// the relative travel amount t he user wants to do. So eg. if the display sends us VP=2100 with value 100, the user wants us to move X by +1 mm. +// constexpr uint16_t VP_MOVE_X = 0x2100; +// constexpr uint16_t VP_MOVE_Y = 0x2102; +// constexpr uint16_t VP_MOVE_Z = 0x2104; +// constexpr uint16_t VP_MOVE_E0 = 0x2110; +// constexpr uint16_t VP_MOVE_E1 = 0x2112; +// //constexpr uint16_t VP_MOVE_E2 = 0x2114; +// //constexpr uint16_t VP_MOVE_E3 = 0x2116; +// //constexpr uint16_t VP_MOVE_E4 = 0x2118; +// //constexpr uint16_t VP_MOVE_E5 = 0x211A; +// constexpr uint16_t VP_HOME_ALL = 0x2120; +// constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; +// constexpr uint16_t VP_XYZ_HOME = 0x2132; + +// Power loss recovery +// constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; + +// // Fan Control Buttons , switch between "off" and "on" +// constexpr uint16_t VP_FAN0_CONTROL = 0x2200; +// constexpr uint16_t VP_FAN1_CONTROL = 0x2202; +// constexpr uint16_t VP_FAN2_CONTROL = 0x2204; +// constexpr uint16_t VP_FAN3_CONTROL = 0x2206; + +// // Heater Control Buttons , triged between "cool down" and "heat PLA" state +// constexpr uint16_t VP_E0_CONTROL = 0x2210; +// constexpr uint16_t VP_E1_CONTROL = 0x2212; +// //constexpr uint16_t VP_E2_CONTROL = 0x2214; +// //constexpr uint16_t VP_E3_CONTROL = 0x2216; +// //constexpr uint16_t VP_E4_CONTROL = 0x2218; +// //constexpr uint16_t VP_E5_CONTROL = 0x221A; +// constexpr uint16_t VP_BED_CONTROL = 0x221C; + +// // Preheat +// constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; +// constexpr uint16_t VP_E1_BED_PREHEAT = 0x2222; +// //constexpr uint16_t VP_E2_BED_PREHEAT = 0x2224; +// //constexpr uint16_t VP_E3_BED_PREHEAT = 0x2226; +// //constexpr uint16_t VP_E4_BED_PREHEAT = 0x2228; +// //constexpr uint16_t VP_E5_BED_PREHEAT = 0x222A; + +// // Filament load and unload +// // constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; +// // constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; + +// // Settings store , reset + +// // PID autotune +// constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x2410; +// constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x2412; +// //constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x2414; +// //constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x2416; +// //constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x2418; +// //constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x241A; +// constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x2420; +// // Calibrate Z +// constexpr uint16_t VP_Z_CALIBRATE = 0x2430; + +// First layer cal +// constexpr uint16_t VP_Z_FIRST_LAYER_CAL = 0x2500; // Data: 0 - Cancel first layer cal progress, >0 filament type have loaded + +// Firmware version on the boot screen. +// constexpr uint16_t VP_MARLIN_VERSION = 0x3000; +// constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + +// Place for status messages. +constexpr uint16_t VP_M117 = 0x7020; +constexpr uint8_t VP_M117_LEN = 0x20; + +// // Temperatures. +// constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer +// constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer +// constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer +// // reserved to support up to 6 Extruders: +// constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer +// constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer +// constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer +// constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer +// constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer +// constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer +// constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer +// constexpr uint16_t VP_T_E5_Is = 0x3074; // 4 Byte Integer +// constexpr uint16_t VP_T_E5_Set = 0x3076; // 2 Byte Integer +// constexpr uint16_t VP_T_E6_Is = 0x3078; // 4 Byte Integer +// constexpr uint16_t VP_T_E6_Set = 0x307A; // 2 Byte Integer +// constexpr uint16_t VP_T_E7_Is = 0x3078; // 4 Byte Integer +// constexpr uint16_t VP_T_E7_Set = 0x307A; // 2 Byte Integer + + +// constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer +// constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer + +// constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer +// constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer +// // reserved for up to 6 Extruders: +// constexpr uint16_t VP_Flowrate_E2 = 0x3094; +// constexpr uint16_t VP_Flowrate_E3 = 0x3096; +// constexpr uint16_t VP_Flowrate_E4 = 0x3098; +// constexpr uint16_t VP_Flowrate_E5 = 0x309A; + +// constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100) +// constexpr uint16_t VP_Fan1_Percentage = 0x3102; // 2 Byte Integer (0..100) +// constexpr uint16_t VP_Fan2_Percentage = 0x3104; // 2 Byte Integer (0..100) +// constexpr uint16_t VP_Fan3_Percentage = 0x3106; // 2 Byte Integer (0..100) +// constexpr uint16_t VP_Feedrate_Percentage = 0x3108; // 2 Byte Integer (0..100) + +// Actual Position +// constexpr uint16_t VP_XPos = 0x3110; // 4 Byte Fixed point number; format xxx.yy +// constexpr uint16_t VP_YPos = 0x3112; // 4 Byte Fixed point number; format xxx.yy +// constexpr uint16_t VP_ZPos = 0x3114; // 4 Byte Fixed point number; format xxx.yy +// constexpr uint16_t VP_EPos = 0x3120; // 4 Byte Fixed point number; format xxx.yy + +// constexpr uint16_t VP_PrintProgress_Percentage = 0x3130; // 2 Byte Integer (0..100) + +// constexpr uint16_t VP_PrintTime = 0x3140; +// constexpr uint16_t VP_PrintTime_LEN = 32; + +// constexpr uint16_t VP_PrintAccTime = 0x3160; +// constexpr uint16_t VP_PrintAccTime_LEN = 32; + +// constexpr uint16_t VP_PrintsTotal = 0x3180; +// constexpr uint16_t VP_PrintsTotal_LEN = 16; + +// // SDCard File Listing +// constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. +// constexpr uint16_t DGUS_SD_FILESPERSCREEN = 8; // FIXME move that info to the display and read it from there. +// constexpr uint16_t VP_SD_FileName0 = 0x3200; +// constexpr uint16_t VP_SD_FileName1 = 0x3220; +// constexpr uint16_t VP_SD_FileName2 = 0x3240; +// constexpr uint16_t VP_SD_FileName3 = 0x3260; +// constexpr uint16_t VP_SD_FileName4 = 0x3280; +// constexpr uint16_t VP_SD_FileName5 = 0x32A0; +// constexpr uint16_t VP_SD_FileName6 = 0x32C0; +// constexpr uint16_t VP_SD_FileName7 = 0x32E0; + +// Heater status +constexpr uint16_t VP_E0_STATUS = 0x3410; +constexpr uint16_t VP_E1_STATUS = 0x3412; +//constexpr uint16_t VP_E2_STATUS = 0x3414; +//constexpr uint16_t VP_E3_STATUS = 0x3416; +//constexpr uint16_t VP_E4_STATUS = 0x3418; +//constexpr uint16_t VP_E5_STATUS = 0x341A; +constexpr uint16_t VP_MOVE_OPTION = 0x3500; + +// // PIDs +// constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 +// constexpr uint16_t VP_E0_PID_I = 0x3702; +// constexpr uint16_t VP_E0_PID_D = 0x3704; +// constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , 2 byte unsigned int , 0~1638.4 +// constexpr uint16_t VP_E1_PID_I = 0x3708; +// constexpr uint16_t VP_E1_PID_D = 0x370A; +// constexpr uint16_t VP_BED_PID_P = 0x3710; +// constexpr uint16_t VP_BED_PID_I = 0x3712; +// constexpr uint16_t VP_BED_PID_D = 0x3714; + +// Wating screen status +constexpr uint16_t VP_WAITING_STATUS = 0x3800; + +// SPs for certain variables... +// located at 0x5000 and up +// Not used yet! +// This can be used e.g to make controls / data display invisible +constexpr uint16_t SP_T_E0_Is = 0x5000; +constexpr uint16_t SP_T_E0_Set = 0x5010; +constexpr uint16_t SP_T_E1_Is = 0x5020; +constexpr uint16_t SP_T_Bed_Is = 0x5030; +constexpr uint16_t SP_T_Bed_Set = 0x5040; + +/************************************************************************************************************************* + ************************************************************************************************************************* + * DGUS for MKS Mem layout + ************************************************************************************************************************ + ************************************************************************************************************************/ + +#if ENABLED(MKS_FINSH) + /* -------------------------------0x1000-0x1FFF------------------------------- */ + constexpr uint16_t VP_MSGSTR1 = 0x1100; + constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... + constexpr uint16_t VP_MSGSTR2 = 0x1140; + constexpr uint8_t VP_MSGSTR2_LEN = 0x20; + constexpr uint16_t VP_MSGSTR3 = 0x1180; + constexpr uint8_t VP_MSGSTR3_LEN = 0x20; + constexpr uint16_t VP_MSGSTR4 = 0x11C0; + constexpr uint8_t VP_MSGSTR4_LEN = 0x20; + + constexpr uint16_t VP_MARLIN_VERSION = 0x1A00; + constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + + + constexpr uint16_t VP_SCREENCHANGE_ASK = 0x1500; + constexpr uint16_t VP_SCREENCHANGE = 0x1501; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. + constexpr uint16_t VP_TEMP_ALL_OFF = 0x1502; // Turn all heaters off. Value arbitrary ;)= + constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x1503; // "Print" Button touched -- go only there if there is an SD Card. + constexpr uint16_t VP_CONFIRMED = 0x1510; // OK on confirm screen. + + constexpr uint16_t VP_BACK_PAGE = 0x1600; + constexpr uint16_t VP_SETTINGS = 0x1620; + // Power loss recovery + constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x1680; + /* -------------------------------0x2000-0x2FFF------------------------------- */ + // Temperatures. + constexpr uint16_t VP_T_E0_Is = 0x2000; // 4 Byte Integer + constexpr uint16_t VP_T_E0_Set = 0x2004; // 2 Byte Integer + constexpr uint16_t VP_T_E1_Is = 0x2008; // 4 Byte Integer + constexpr uint16_t VP_T_E1_Set = 0x200B; // 2 Byte Integer + constexpr uint16_t VP_T_E2_Is = 0x2010; // 4 Byte Integer + constexpr uint16_t VP_T_E2_Set = 0x2014; // 2 Byte Integer + constexpr uint16_t VP_T_E3_Is = 0x2018; // 4 Byte Integer + constexpr uint16_t VP_T_E3_Set = 0x201B; // 2 Byte Integer + constexpr uint16_t VP_T_E4_Is = 0x2020; // 4 Byte Integer + constexpr uint16_t VP_T_E4_Set = 0x2024; // 2 Byte Integer + constexpr uint16_t VP_T_E5_Is = 0x2028; // 4 Byte Integer + constexpr uint16_t VP_T_E5_Set = 0x202B; // 2 Byte Integer + constexpr uint16_t VP_T_E6_Is = 0x2030; // 4 Byte Integer + constexpr uint16_t VP_T_E6_Set = 0x2034; // 2 Byte Integer + constexpr uint16_t VP_T_E7_Is = 0x2038; // 4 Byte Integer + constexpr uint16_t VP_T_E7_Set = 0x203B; // 2 Byte Integer + + constexpr uint16_t VP_T_Bed_Is = 0x2040; // 4 Byte Integer + constexpr uint16_t VP_T_Bed_Set = 0x2044; // 2 Byte Integer + + constexpr uint16_t VP_Min_EX_T_E = 0x2100; + + constexpr uint16_t VP_Flowrate_E0 = 0x2200; // 2 Byte Integer + constexpr uint16_t VP_Flowrate_E1 = 0x2202; // 2 Byte Integer + constexpr uint16_t VP_Flowrate_E2 = 0x2204; + constexpr uint16_t VP_Flowrate_E3 = 0x2206; + constexpr uint16_t VP_Flowrate_E4 = 0x2208; + constexpr uint16_t VP_Flowrate_E5 = 0x220A; + constexpr uint16_t VP_Flowrate_E6 = 0x220C; + constexpr uint16_t VP_Flowrate_E7 = 0x220E; + + // Move + constexpr uint16_t VP_MOVE_X = 0x2300; + constexpr uint16_t VP_MOVE_Y = 0x2302; + constexpr uint16_t VP_MOVE_Z = 0x2304; + constexpr uint16_t VP_MOVE_E0 = 0x2310; + constexpr uint16_t VP_MOVE_E1 = 0x2312; + constexpr uint16_t VP_MOVE_E2 = 0x2314; + constexpr uint16_t VP_MOVE_E3 = 0x2316; + constexpr uint16_t VP_MOVE_E4 = 0x2318; + constexpr uint16_t VP_MOVE_E5 = 0x231A; + constexpr uint16_t VP_MOVE_E6 = 0x231C; + constexpr uint16_t VP_MOVE_E7 = 0x231E; + constexpr uint16_t VP_HOME_ALL = 0x2320; + constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2330; + constexpr uint16_t VP_MOVE_DISTANCE = 0x2334; + constexpr uint16_t VP_X_HOME = 0x2336; + constexpr uint16_t VP_Y_HOME = 0x2338; + constexpr uint16_t VP_Z_HOME = 0x233A; + + // Fan Control Buttons , switch between "off" and "on" + constexpr uint16_t VP_FAN0_CONTROL = 0x2350; + constexpr uint16_t VP_FAN1_CONTROL = 0x2352; + constexpr uint16_t VP_FAN2_CONTROL = 0x2354; + constexpr uint16_t VP_FAN3_CONTROL = 0x2356; + constexpr uint16_t VP_FAN4_CONTROL = 0x2358; + constexpr uint16_t VP_FAN5_CONTROL = 0x235A; + + constexpr uint16_t VP_LANGUAGE_CHANGE = 0x2380; + constexpr uint16_t VP_LANGUAGE_CHANGE1 = 0x2382; + constexpr uint16_t VP_LANGUAGE_CHANGE2 = 0x2384; + constexpr uint16_t VP_LANGUAGE_CHANGE3 = 0x2386; + constexpr uint16_t VP_LANGUAGE_CHANGE4 = 0x2388; + constexpr uint16_t VP_LANGUAGE_CHANGE5 = 0x238A; + + // LEVEL + constexpr uint16_t VP_LEVEL_POINT = 0x2400; + constexpr uint16_t VP_MESH_LEVEL_POINT = 0x2410; + constexpr uint16_t VP_MESH_LEVEL_ADJUST = 0x2412; + constexpr uint16_t VP_MESH_LEVEL_DIP = 0x2414; + constexpr uint16_t VP_MESH_LEVEL_POINT_X = 0x2416; + constexpr uint16_t VP_MESH_LEVEL_POINT_Y = 0x2418; + constexpr uint16_t VP_LEVEL_BUTTON = 0x2420; + constexpr uint16_t VP_MESH_LEVEL_POINT_DIS = 0x2422; + constexpr uint16_t VP_MESH_LEVEL_BACK = 0x2424; + + constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2500; + constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2504; + constexpr uint16_t VP_LOAD_Filament = 0x2508; + // constexpr uint16_t VP_LOAD_UNLOAD_Cancle = 0x250A; + constexpr uint16_t VP_UNLOAD_Filament = 0x250B; + constexpr uint16_t VP_Filament_distance = 0x2600; + constexpr uint16_t VP_Filament_speed = 0x2604; + constexpr uint16_t VP_MIN_EX_T = 0x2606; + + constexpr uint16_t VP_E1_Filament_distance = 0x2614; + constexpr uint16_t VP_E1_Filament_speed = 0x2616; + constexpr uint16_t VP_E1_MIN_EX_T = 0x2618; + + constexpr uint16_t VP_Fan0_Percentage = 0x2700; // 2 Byte Integer (0..100) + constexpr uint16_t VP_Fan1_Percentage = 0x2702; // 2 Byte Integer (0..100) + constexpr uint16_t VP_Fan2_Percentage = 0x2704; // 2 Byte Integer (0..100) + constexpr uint16_t VP_Fan3_Percentage = 0x2706; // 2 Byte Integer (0..100) + constexpr uint16_t VP_Feedrate_Percentage = 0x2708; // 2 Byte Integer (0..100) + + // Fan status + constexpr uint16_t VP_FAN0_STATUS = 0x2710; + constexpr uint16_t VP_FAN1_STATUS = 0x2712; + constexpr uint16_t VP_FAN2_STATUS = 0x2714; + constexpr uint16_t VP_FAN3_STATUS = 0x2716; + + // Step per mm + constexpr uint16_t VP_X_STEP_PER_MM = 0x2900; // at the moment , 2 byte unsigned int , 0~1638.4 + constexpr uint16_t VP_Y_STEP_PER_MM = 0x2904; + constexpr uint16_t VP_Z_STEP_PER_MM = 0x2908; + constexpr uint16_t VP_E0_STEP_PER_MM = 0x2910; + constexpr uint16_t VP_E1_STEP_PER_MM = 0x2912; + constexpr uint16_t VP_E2_STEP_PER_MM = 0x2914; + constexpr uint16_t VP_E3_STEP_PER_MM = 0x2916; + constexpr uint16_t VP_E4_STEP_PER_MM = 0x2918; + constexpr uint16_t VP_E5_STEP_PER_MM = 0x291A; + constexpr uint16_t VP_E6_STEP_PER_MM = 0x291C; + constexpr uint16_t VP_E7_STEP_PER_MM = 0x291E; + + constexpr uint16_t VP_X_MAX_SPEED = 0x2A00; + constexpr uint16_t VP_Y_MAX_SPEED = 0x2A04; + constexpr uint16_t VP_Z_MAX_SPEED = 0x2A08; + constexpr uint16_t VP_E0_MAX_SPEED = 0x2A0C; + constexpr uint16_t VP_E1_MAX_SPEED = 0x2A10; + + constexpr uint16_t VP_X_ACC_MAX_SPEED = 0x2A28; + constexpr uint16_t VP_Y_ACC_MAX_SPEED = 0x2A2C; + constexpr uint16_t VP_Z_ACC_MAX_SPEED = 0x2A30; + constexpr uint16_t VP_E0_ACC_MAX_SPEED = 0x2A34; + constexpr uint16_t VP_E1_ACC_MAX_SPEED = 0x2A38; + + constexpr uint16_t VP_TRAVEL_SPEED = 0x2A3C; + constexpr uint16_t VP_FEEDRATE_MIN_SPEED = 0x2A40; + constexpr uint16_t VP_T_F_SPEED = 0x2A44; + constexpr uint16_t VP_ACC_SPEED = 0x2A48; + + /* -------------------------------0x3000-0x3FFF------------------------------- */ + // Buttons on the SD-Card File listing. + constexpr uint16_t VP_SD_ScrollEvent = 0x3020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down + constexpr uint16_t VP_SD_FileSelected = 0x3022; // Number of file field selected. + constexpr uint16_t VP_SD_FileSelectConfirm = 0x3024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) + constexpr uint16_t VP_SD_ResumePauseAbort = 0x3026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints + constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x3028; // Abort print confirmation (virtual, will be injected by the confirm dialog) + constexpr uint16_t VP_SD_Print_Setting = 0x3040; + constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x3050; // Data: 0 down, 1 up + constexpr uint16_t VP_SD_Print_LiveAdjustZ_Confirm = 0x3060; + constexpr uint16_t VP_ZOffset_Distance = 0x3070; + constexpr uint16_t VP_ZOffset_DE_DIS = 0x3080; + // SDCard File Listing + constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. + constexpr uint16_t DGUS_SD_FILESPERSCREEN = 10; // FIXME move that info to the display and read it from there. + constexpr uint16_t VP_SD_FileName0 = 0x3100; + constexpr uint16_t VP_SD_FileName1 = 0x3120; + constexpr uint16_t VP_SD_FileName2 = 0x3140; + constexpr uint16_t VP_SD_FileName3 = 0x3160; + constexpr uint16_t VP_SD_FileName4 = 0x3180; + constexpr uint16_t VP_SD_FileName5 = 0x31A0; + constexpr uint16_t VP_SD_FileName6 = 0x31C0; + constexpr uint16_t VP_SD_FileName7 = 0x31E0; + constexpr uint16_t VP_SD_FileName8 = 0x3200; + constexpr uint16_t VP_SD_FileName9 = 0x3220; + + constexpr uint16_t VP_SD_Print_ProbeOffsetZ = 0x32A0; + constexpr uint16_t VP_SD_Print_Baby = 0x32B0; + constexpr uint16_t VP_SD_Print_Filename = 0x32C0; + + // X Y Z Point + constexpr uint16_t VP_XPos = 0x3300; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_YPos = 0x3302; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_ZPos = 0x3304; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_EPos = 0x3306; // 4 Byte Fixed point number; format xxx.yy + + // Print + constexpr uint16_t VP_PrintProgress_Percentage = 0x3330; // 2 Byte Integer (0..100) + constexpr uint16_t VP_PrintTime = 0x3340; + constexpr uint16_t VP_PrintTime_LEN = 32; + constexpr uint16_t VP_PrintAccTime = 0x3360; + constexpr uint16_t VP_PrintAccTime_LEN = 32; + constexpr uint16_t VP_PrintsTotal = 0x3380; + constexpr uint16_t VP_PrintsTotal_LEN = 16; + + constexpr uint16_t VP_File_Pictutr0 = 0x3400; + constexpr uint16_t VP_File_Pictutr1 = 0x3402; + constexpr uint16_t VP_File_Pictutr2 = 0x3404; + constexpr uint16_t VP_File_Pictutr3 = 0x3406; + constexpr uint16_t VP_File_Pictutr4 = 0x3408; + constexpr uint16_t VP_File_Pictutr5 = 0x340A; + constexpr uint16_t VP_File_Pictutr6 = 0x340C; + constexpr uint16_t VP_File_Pictutr7 = 0x340E; + constexpr uint16_t VP_File_Pictutr8 = 0x3410; + constexpr uint16_t VP_File_Pictutr9 = 0x3412; + + constexpr uint16_t VP_BED_STATUS = 0x341C; + + constexpr uint16_t VP_TMC_X_STEP = 0x3430; + constexpr uint16_t VP_TMC_Y_STEP = 0x3432; + constexpr uint16_t VP_TMC_Z_STEP = 0x3434; + + constexpr uint16_t VP_TMC_X1_Current = 0x3436; + constexpr uint16_t VP_TMC_Y1_Current = 0x3438; + constexpr uint16_t VP_TMC_X_Current = 0x343A; + constexpr uint16_t VP_TMC_Y_Current = 0x343C; + constexpr uint16_t VP_TMC_Z_Current = 0x343E; + constexpr uint16_t VP_TMC_E0_Current = 0x3440; + constexpr uint16_t VP_TMC_E1_Current = 0x3442; + constexpr uint16_t VP_TMC_Z1_Current = 0x3444; + + + constexpr uint16_t VP_PrintTime_H = 0x3500; + constexpr uint16_t VP_PrintTime_M = 0x3502; + constexpr uint16_t VP_PrintTime_S = 0x3504; + + // PIDs + constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 + constexpr uint16_t VP_E0_PID_I = 0x3702; + constexpr uint16_t VP_E0_PID_D = 0x3704; + constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , 2 byte unsigned int , 0~1638.4 + constexpr uint16_t VP_E1_PID_I = 0x3708; + constexpr uint16_t VP_E1_PID_D = 0x370A; + constexpr uint16_t VP_BED_PID_P = 0x3710; + constexpr uint16_t VP_BED_PID_I = 0x3712; + constexpr uint16_t VP_BED_PID_D = 0x3714; + + constexpr uint16_t VP_EEPROM_CTRL = 0x3720; + + constexpr uint16_t VP_OFFSET_X = 0x3724; + constexpr uint16_t VP_OFFSET_Y = 0x3728; + constexpr uint16_t VP_OFFSET_Z = 0x372B; + + // PID autotune + constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x3800; + constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x3802; + constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x3804; + constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x3806; + constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x3808; + constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x380A; + constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x380C; + // Calibrate Z + constexpr uint16_t VP_Z_CALIBRATE = 0x3810; + + constexpr uint16_t VP_AutoTurnOffSw = 0x3812; + constexpr uint16_t VP_LCD_BLK = 0x3814; + + constexpr uint16_t VP_X_PARK_POS = 0x3900; + constexpr uint16_t VP_Y_PARK_POS = 0x3902; + constexpr uint16_t VP_Z_PARK_POS = 0x3904; + + /* -------------------------------0x4000-0x4FFF------------------------------- */ + // Heater Control Buttons , triged between "cool down" and "heat PLA" state + constexpr uint16_t VP_E0_CONTROL = 0x4010; + constexpr uint16_t VP_E1_CONTROL = 0x4012; + //constexpr uint16_t VP_E2_CONTROL = 0x2214; + //constexpr uint16_t VP_E3_CONTROL = 0x2216; + //constexpr uint16_t VP_E4_CONTROL = 0x2218; + //constexpr uint16_t VP_E5_CONTROL = 0x221A; + constexpr uint16_t VP_BED_CONTROL = 0x401C; + + // Preheat + constexpr uint16_t VP_E0_BED_PREHEAT = 0x4020; + constexpr uint16_t VP_E1_BED_PREHEAT = 0x4022; + //constexpr uint16_t VP_E2_BED_PREHEAT = 0x4024; + //constexpr uint16_t VP_E3_BED_PREHEAT = 0x4026; + //constexpr uint16_t VP_E4_BED_PREHEAT = 0x4028; + //constexpr uint16_t VP_E5_BED_PREHEAT = 0x402A; + + // Filament load and unload + // constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x4030; + // constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x4032; + + // Settings store , reset + + // Level data + constexpr uint16_t VP_Level_Point_One_X = 0x4100; + constexpr uint16_t VP_Level_Point_One_Y = 0x4102; + constexpr uint16_t VP_Level_Point_Two_X = 0x4104; + constexpr uint16_t VP_Level_Point_Two_Y = 0x4106; + constexpr uint16_t VP_Level_Point_Three_X = 0x4108; + constexpr uint16_t VP_Level_Point_Three_Y = 0x410A; + constexpr uint16_t VP_Level_Point_Four_X = 0x410C; + constexpr uint16_t VP_Level_Point_Four_Y = 0x410E; + constexpr uint16_t VP_Level_Point_Five_X = 0x4110; + constexpr uint16_t VP_Level_Point_Five_Y = 0x4112; + + + /* H43 Version */ + constexpr uint16_t VP_MKS_H43_VERSION = 0x4A00; // MKS H43 V1.0.0 + constexpr uint16_t VP_MKS_H43_VERSION_LEN = 16; + constexpr uint16_t VP_MKS_H43_UpdataVERSION = 0x4A10; // MKS H43 V1.0.0 + constexpr uint16_t VP_MKS_H43_UpdataVERSION_LEN = 16; + + /* -------------------------------0x5000-0xFFFF------------------------------- */ + constexpr uint16_t VP_HOME_Dis = 0x5000; + constexpr uint16_t VP_Setting_Dis = 0x5010; + constexpr uint16_t VP_Tool_Dis = 0x5020; + constexpr uint16_t VP_Printing_Dis = 0x5030; + + constexpr uint16_t VP_Language_Dis = 0x5080; + constexpr uint16_t VP_LossPoint_Dis = 0x5090; + + constexpr uint16_t VP_PrintPauseConfig_Dis = 0x5120; + constexpr uint16_t VP_MotorPluse_Dis = 0x5140; + constexpr uint16_t VP_MotorMaxSpeed_Dis = 0x5150; + constexpr uint16_t VP_MotorMaxAcc_Dis = 0x5160; + + constexpr uint16_t VP_X_Pluse_Dis = 0x5170; + constexpr uint16_t VP_Y_Pluse_Dis = 0x5180; + constexpr uint16_t VP_Z_Pluse_Dis = 0x5190; + constexpr uint16_t VP_E0_Pluse_Dis = 0x51A0; + constexpr uint16_t VP_E1_Pluse_Dis = 0x51B0; + + constexpr uint16_t VP_X_Max_Speed_Dis = 0x5280; + constexpr uint16_t VP_Y_Max_Speed_Dis = 0x5290; + constexpr uint16_t VP_Z_Max_Speed_Dis = 0x52A0; + constexpr uint16_t VP_E0_Max_Speed_Dis = 0x52B0; + constexpr uint16_t VP_E1_Max_Speed_Dis = 0x52C0; + + constexpr uint16_t VP_X_Max_Acc_Speed_Dis = 0x51E0; + constexpr uint16_t VP_Y_Max_Acc_Speed_Dis = 0x51F0; + constexpr uint16_t VP_Z_Max_Acc_Speed_Dis = 0x5200; + constexpr uint16_t VP_E0_Max_Acc_Speed_Dis = 0x5210; + constexpr uint16_t VP_E1_Max_Acc_Speed_Dis = 0x5220; + + + constexpr uint16_t VP_PrintTime_Dis = 0x5470; + constexpr uint16_t VP_E0_Temp_Dis = 0x5310; + constexpr uint16_t VP_E1_Temp_Dis = 0x5320; + constexpr uint16_t VP_HB_Temp_Dis = 0x5330; + constexpr uint16_t VP_Feedrate_Dis = 0x5350; + constexpr uint16_t VP_PrintAcc_Dis = 0x5340; + constexpr uint16_t VP_Fan_Speed_Dis = 0x5360; + + constexpr uint16_t VP_Min_Ex_Temp_Dis = 0x5380; + + + constexpr uint16_t VP_X_PARK_POS_Dis = 0x53E0; + constexpr uint16_t VP_Y_PARK_POS_Dis = 0x53F0; + constexpr uint16_t VP_Z_PARK_POS_Dis = 0x5400; + + + constexpr uint16_t VP_TravelAcc_Dis = 0x5440; + constexpr uint16_t VP_FeedRateMin_Dis = 0x5450; + constexpr uint16_t VP_TravelFeeRateMin_Dis = 0x5460; + constexpr uint16_t VP_ACC_Dis = 0x5480; + + constexpr uint16_t VP_Extrusion_Dis = 0x5230; + constexpr uint16_t VP_HeatBed_Dis = 0x5240; + + constexpr uint16_t VP_Printting_Dis = 0x5430; + constexpr uint16_t VP_FactoryDefaults_Dis = 0x54C0; + constexpr uint16_t VP_StoreSetting_Dis = 0x54B0; + constexpr uint16_t VP_Info_EEPROM_2_Dis = 0x54D0; + constexpr uint16_t VP_Info_EEPROM_1_Dis = 0x54E0; + + constexpr uint16_t VP_AutoLevel_1_Dis = 0x55F0; + + constexpr uint16_t VP_TMC_X_Step_Dis = 0x5530; + constexpr uint16_t VP_TMC_Y_Step_Dis = 0x5540; + constexpr uint16_t VP_TMC_Z_Step_Dis = 0x5550; + constexpr uint16_t VP_TMC_X1_Current_Dis = 0x5560; + constexpr uint16_t VP_TMC_Y1_Current_Dis = 0x5570; + constexpr uint16_t VP_TMC_X_Current_Dis = 0x5580; + constexpr uint16_t VP_TMC_Y_Current_Dis = 0x5590; + constexpr uint16_t VP_TMC_Z_Current_Dis = 0x55A0; + constexpr uint16_t VP_TMC_E0_Current_Dis = 0x55B0; + constexpr uint16_t VP_TMC_E1_Current_Dis = 0x55C0; + constexpr uint16_t VP_TMC_Z1_Current_Dis = 0x55E0; + + constexpr uint16_t VP_AutoLEVEL_INFO1 = 0x5600; + constexpr uint16_t VP_EX_TEMP_INFO1_Dis = 0x5610; + constexpr uint16_t VP_EX_TEMP_INFO2_Dis = 0x5620; + constexpr uint16_t VP_EX_TEMP_INFO3_Dis = 0x5630; + constexpr uint16_t VP_LCD_BLK_Dis = 0x56A0; + constexpr uint16_t VP_Info_PrinfFinsh_1_Dis = 0x5C00; + constexpr uint16_t VP_Info_PrinfFinsh_2_Dis = 0x5C10; + + constexpr uint16_t VP_Length_Dis = 0x5B00; + + constexpr uint16_t VP_PrintConfrim_Info_Dis = 0x5B90; + constexpr uint16_t VP_StopPrintConfrim_Info_Dis = 0x5B80; + + constexpr uint16_t VP_Point_One_Dis = 0x5BA0; + constexpr uint16_t VP_Point_Two_Dis = 0x5BB0; + constexpr uint16_t VP_Point_Three_Dis = 0x5BC0; + constexpr uint16_t VP_Point_Four_Dis = 0x5BD0; + constexpr uint16_t VP_Point_Five_Dis = 0x5BE0; + + constexpr uint16_t VP_Print_Dis = 0x5250; + + constexpr uint16_t VP_About_Dis = 0x5A00; + constexpr uint16_t VP_Config_Dis = 0x5A10; + constexpr uint16_t VP_Filament_Dis = 0x5A20; + constexpr uint16_t VP_Move_Dis = 0x5A30; + constexpr uint16_t VP_Level_Dis = 0x5A50; + constexpr uint16_t VP_Speed_Dis = 0x5A70; + constexpr uint16_t VP_InOut_Dis = 0x5A80; + + constexpr uint16_t VP_MotorConfig_Dis = 0x5100; + constexpr uint16_t VP_LevelConfig_Dis = 0x5110; + constexpr uint16_t VP_Advance_Dis = 0x5130; + constexpr uint16_t VP_TemperatureConfig_Dis = 0x5390; + +#endif // MKS_FINSH diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp new file mode 100644 index 0000000000..0fef87b64c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -0,0 +1,2109 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_MKS) + +#include "../DGUSScreenHandler.h" + +#include "../../../../../MarlinCore.h" +#include "../../../../../gcode/queue.h" +#include "../../../../../libs/duration_t.h" +#include "../../../../../module/settings.h" +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" +#include "../../../../../module/printcounter.h" +#include "../../../../../sd/cardreader.h" + +#include "../../../../../gcode/gcode.h" +#include "../../../../../pins/pins.h" +#include "../../../../../libs/nozzle.h" +#if ENABLED(HAS_STEALTHCHOP) + #include "../../../../../module/stepper/trinamic.h" + #include "../../../../../module/stepper/indirection.h" +#endif +#include "../../../../../module/probe.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../../feature/powerloss.h" +#endif + +bool DGUSAutoTurnOff = false; +uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS + +// endianness swap +uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } + +void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4) { + dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR3, line3, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR4, line4, 32, true); +} + +void DGUSScreenHandler::sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) { + dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR3, line3, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR4, line4, 32, true); +} + +void DGUSScreenHandler::sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4, uint16_t language) { + if (language == MKS_English) + DGUSScreenHandler::sendinfoscreen_en_mks((char *)line1, (char *)line2, (char *)line3, (char *)line4); + else if (language == MKS_SimpleChinese) + DGUSScreenHandler::sendinfoscreen_ch_mks((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); +} + +void DGUSScreenHandler::DGUSLCD_SendFanToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); + //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); + uint16_t tmp = *(uint8_t *) var.memadr; // +1 -> avoid rounding issues for the display. + // tmp = map(tmp, 0, 255, 0, 100); + dgusdisplay.WriteVariable(var.VP, tmp); + } +} + +void DGUSScreenHandler::DGUSLCD_SendBabyStepToDisplay_MKS(DGUS_VP_Variable &var) { + float value = current_position.z; + DEBUG_ECHOLNPAIR_F(" >> ", value, 6); + value *= cpow(10, 2); + dgusdisplay.WriteVariable(VP_SD_Print_Baby, (uint16_t)value); +} + +void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay_MKS(DGUS_VP_Variable &var) { + duration_t elapsed = print_job_timer.duration(); + uint32_t time = elapsed.value; + dgusdisplay.WriteVariable(VP_PrintTime_H, uint16_t(time / 3600)); + dgusdisplay.WriteVariable(VP_PrintTime_M, uint16_t(time % 3600 / 60)); + dgusdisplay.WriteVariable(VP_PrintTime_S, uint16_t((time % 3600) % 60)); +} + +void DGUSScreenHandler::DGUSLCD_SetUint8(DGUS_VP_Variable &var, void *val_ptr) { + if (var.memadr) { + uint16_t value = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("FAN value get:", value); + *(uint8_t*)var.memadr = map(constrain(value, 0, 255), 0, 255, 0, 255); + DEBUG_ECHOLNPAIR("FAN value change:", *(uint8_t*)var.memadr); + } +} + +void DGUSScreenHandler::DGUSLCD_SendGbkToDisplay(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); + uint16_t *tmp = (uint16_t*) var.memadr; + dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); +} + +void DGUSScreenHandler::DGUSLCD_SendStringToDisplay_Language_MKS(DGUS_VP_Variable &var) { + if (DGUSLanguageSwitch == MKS_English) { + char *tmp = (char*) var.memadr; + dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + uint16_t *tmp = (uint16_t *)var.memadr; + dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); + } +} + +void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { + #if ENABLED(SENSORLESS_HOMING) + #if AXIS_HAS_STEALTHCHOP(X) + tmc_x_step = stepperX.homing_threshold(); + dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_y_step = stepperY.homing_threshold(); + dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_z_step = stepperZ.homing_threshold(); + dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + #endif + #endif +} + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr != 0x0F && touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr) && touched_nr != 0x0F) return; + + if (touched_nr == 0x0F) { + if (filelist.isAtRootDir()) + GotoScreen(DGUSLCD_SCREEN_MAIN); + else + filelist.upDir(); + return; + } + + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + GotoScreen(MKSLCD_SCREEN_PRINT_CONFIRM); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + GotoScreen(MKSLCD_SCREEN_PRINT); + z_offset_add = 0; + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: { // Resume + + auto cs = getCurrentScreen(); + if (runout_mks.runout_status != RUNOUT_WAITTING_STATUS && runout_mks.runout_status != UNRUNOUT_STATUS) { + if (cs == MKSLCD_SCREEN_PRINT || cs == MKSLCD_SCREEN_PAUSE) + GotoScreen(MKSLCD_SCREEN_PAUSE); + return; + } + else + runout_mks.runout_status = UNRUNOUT_STATUS; + + GotoScreen(MKSLCD_SCREEN_PRINT); + + if (ExtUI::isPrintingFromMediaPaused()) { + nozzle_park_mks.print_pause_start_flag = 0; + nozzle_park_mks.blstatus = true; + ExtUI::resumePrint(); + } + } break; + + case 1: // Pause + + GotoScreen(MKSLCD_SCREEN_PAUSE); + if (!ExtUI::isPrintingFromMediaPaused()) { + nozzle_park_mks.print_pause_start_flag = 1; + nozzle_park_mks.blstatus = true; + ExtUI::pausePrint(); + //ExtUI::mks_pausePrint(); + } + break; + case 2: // Abort + HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + + uint16_t dir_icon_val = 25; + if (filelist.seek(top_file + target_line)) { + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); // snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s"), filelist.filename()); + dir_icon_val = filelist.isDir() ? 0 : 1; + } + DGUSLCD_SendStringToDisplay(var); + + dgusdisplay.WriteVariable(VP_File_Pictutr0 + target_line * 2, dir_icon_val); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + GotoScreen(MKSLCD_SCREEN_CHOOSE_FILE); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) filelist.refresh(); + } + + void DGUSScreenHandler::SDPrintingFinished() { + if (DGUSAutoTurnOff) { + while (queue.length) queue.advance(); + gcode.process_subcommands_now_P(PSTR("M81")); + } + GotoScreen(MKSLCD_SCREEN_PrintDone); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + DEBUG_ECHOLNPAIR("\n DEBUG target", target); + + // when the dgus had reboot, it will enter the DGUSLCD_SCREEN_MAIN page, + // so user can change any page to use this function, an it will check + // if robin nano is printing. when it is, dgus will enter the printing + // page to continue print; + // + //if (print_job_timer.isRunning() || print_job_timer.isPaused()) { + // if (target == MKSLCD_PAUSE_SETTING_MOVE || target == MKSLCD_PAUSE_SETTING_EX + // || target == MKSLCD_SCREEN_PRINT || target == MKSLCD_SCREEN_PAUSE + // ) { + // } + // else + // GotoScreen(MKSLCD_SCREEN_PRINT); + // return; + //} + + if (target == DGUSLCD_SCREEN_POPUP) { + SetupConfirmAction(ExtUI::setUserConfirmed); + + // Special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::ScreenBackChange(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t target = swap16(*(uint16_t *)val_ptr); + DEBUG_ECHOLNPAIR(" back = 0x%x", target); + switch (target) { + } +} + +void DGUSScreenHandler::ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) { + settings.save(); + if (print_job_timer.isRunning()) + GotoScreen(MKSLCD_SCREEN_PRINT); + else if (print_job_timer.isPaused) + GotoScreen(MKSLCD_SCREEN_PAUSE); +} + +void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("ctrl turn off\n"); + uint16_t value = swap16(*(uint16_t *)val_ptr); + switch (value) { + case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; + default: break; + } +} + +void DGUSScreenHandler::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("MinExtrudeTempChange DistanceChange"); + uint16_t value = swap16(*(uint16_t *)val_ptr); + thermalManager.extrude_min_temp = value; + min_ex_temp = value; + settings.save(); +} + +void DGUSScreenHandler::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("Zoffset DistanceChange"); + uint16_t value = swap16(*(uint16_t *)val_ptr); + float val_distance = 0; + switch (value) { + case 0: val_distance = 0.01; break; + case 1: val_distance = 0.1; break; + case 2: val_distance = 0.5; break; + case 3: val_distance = 1; break; + default: val_distance = 0.01; break; + } + ZOffset_distance = val_distance; +} + +void DGUSScreenHandler::GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("\nMove DistanceChange"); + *(uint16_t *)var.memadr = swap16(*(uint16_t *)val_ptr); +} + +void DGUSScreenHandler::EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t eep_flag = swap16(*(uint16_t *)val_ptr); + switch (eep_flag) { + case 0: + settings.save(); + settings.load(); // load eeprom data to check the data is right + GotoScreen(MKSLCD_SCREEN_EEP_Config); + break; + + case 1: + settings.reset(); + GotoScreen(MKSLCD_SCREEN_EEP_Config); + break; + + default: break; + } +} + +void DGUSScreenHandler::Z_offset_select(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t z_value = swap16(*(uint16_t *)val_ptr); + switch (z_value) { + case 0: Z_distance = 0.01; break; + case 1: Z_distance = 0.1; break; + case 2: Z_distance = 0.5; break; + default: Z_distance = 1; break; + } +} + +void DGUSScreenHandler::GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr) { + + #if ENABLED(HAS_BED_PROBE) + int32_t value = swap32(*(int32_t *)val_ptr); + float Offset = value / 100.0f; + DEBUG_ECHOLNPAIR_F("\nget int6 offset >> ", value, 6); + #endif + + switch (var.VP) { + case VP_OFFSET_X: TERN_(HAS_BED_PROBE, probe.offset.x = Offset); break; + case VP_OFFSET_Y: TERN_(HAS_BED_PROBE, probe.offset.y = Offset); break; + case VP_OFFSET_Z: TERN_(HAS_BED_PROBE, probe.offset.z = Offset); break; + default: break; + } + settings.save(); +} + +void DGUSScreenHandler::LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t lag_flag = swap16(*(uint16_t *)val_ptr); + switch (lag_flag) { + case MKS_SimpleChinese: + DGUS_LanguageDisplay(MKS_SimpleChinese); + DGUSLanguageSwitch = MKS_SimpleChinese; + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_Choose); + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_NoChoose); + settings.save(); + break; + case MKS_English: + DGUS_LanguageDisplay(MKS_English); + DGUSLanguageSwitch = MKS_English; + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_NoChoose); + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_Choose); + settings.save(); + break; + default: break; + } +} + +#if ENABLED(MESH_BED_LEVELING) + uint8_t mesh_point_count = GRID_MAX_POINTS; +#endif + +void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t lev_but = swap16(*(uint16_t *)val_ptr); + #if ENABLED(MESH_BED_LEVELING) + auto cs = getCurrentScreen(); + #endif + switch (lev_but) { + case 0: + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + static uint8_t a_first_level = 1; + if (a_first_level == 1) { + a_first_level = 0; + queue.enqueue_now_P(G28_STR); + } + queue.enqueue_now_P(PSTR("G29")); + + #elif ENABLED(MESH_BED_LEVELING) + + mesh_point_count = GRID_MAX_POINTS; + + if (DGUSLanguageSwitch == MKS_English) { + const char level_buf_en[] = "Start Level"; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en, 32, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + const uint16_t level_buf_ch[] = {0xAABF, 0xBCCA, 0xF7B5, 0xBDC6, 0x2000}; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch, 32, true); + } + + cs = getCurrentScreen(); + if (cs != MKSLCD_AUTO_LEVEL) GotoScreen(MKSLCD_AUTO_LEVEL); + + #else + + GotoScreen(MKSLCD_SCREEN_LEVEL); + + #endif + break; + + case 1: + soft_endstop._enabled = true; + GotoScreen(MKSLCD_SCREEM_TOOL); + break; + + default: break; + } +} + +void DGUSScreenHandler::MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t mesh_dist = swap16(*(uint16_t *)val_ptr); + switch (mesh_dist) { + case 0: mesh_adj_distance = 0.01; break; + case 1: mesh_adj_distance = 0.1; break; + case 2: mesh_adj_distance = 1; break; + default: mesh_adj_distance = 0.1; break; + } +} + +void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { + #if ENABLED(MESH_BED_LEVELING) + uint16_t mesh_value = swap16(*(uint16_t *)val_ptr); + // static uint8_t a_first_level = 1; + char cmd_buf[30]; + float offset = mesh_adj_distance; + int16_t integer, Deci, Deci2; + // float f3 = current_position.z; + // float f4 = current_position.z; + switch (mesh_value) { + case 0: + offset = mesh_adj_distance; + integer = offset; // get int + Deci = (offset * 100); + Deci = Deci % 100; + Deci2 = offset * 100; + Deci2 = Deci2 % 10; + soft_endstop._enabled = false; + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(cmd_buf, 30, PSTR("G1 Z%d.%d%d"), integer, Deci, Deci2); + queue.enqueue_one_now(cmd_buf); + queue.enqueue_now_P(PSTR("G90")); + //soft_endstop._enabled = true; + break; + + case 1: + offset = mesh_adj_distance; + integer = offset; // get int + Deci = (offset * 100); + Deci = Deci % 100; + Deci2 = offset * 100; + Deci2 = Deci2 % 10; + soft_endstop._enabled = false; + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(cmd_buf, 30, PSTR("G1 Z-%d.%d%d"), integer, Deci, Deci2); + queue.enqueue_one_now(cmd_buf); + queue.enqueue_now_P(PSTR("G90")); + break; + + case 2: + if (mesh_point_count == GRID_MAX_POINTS) { // 第1个点 + queue.enqueue_now_P(PSTR("G29S1")); + mesh_point_count--; + + if (DGUSLanguageSwitch == MKS_English) { + const char level_buf_en1[] = "Next Point"; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en1, 32, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + const uint16_t level_buf_ch1[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch1, 32, true); + } + } + else if (mesh_point_count > 1) { // 倒数第二个点 + queue.enqueue_now_P(PSTR("G29S2")); + mesh_point_count--; + if (DGUSLanguageSwitch == MKS_English) { + const char level_buf_en2[] = "Next Point"; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + const uint16_t level_buf_ch2[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); + } + } + else if (mesh_point_count == 1) { + queue.enqueue_now_P(PSTR("G29S2")); + mesh_point_count--; + if (DGUSLanguageSwitch == MKS_English) { + const char level_buf_en2[] = "Level Finsh"; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + const uint16_t level_buf_ch2[] = {0xF7B5, 0xBDC6, 0xEACD, 0xC9B3, 0x2000}; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); + } + settings.save(); + } + else if (mesh_point_count == 0) { + + mesh_point_count = GRID_MAX_POINTS; + soft_endstop._enabled = true; + settings.save(); + GotoScreen(MKSLCD_SCREEM_TOOL); + } + break; + + default: + break; + } + #endif // MESH_BED_LEVELING +} + +void DGUSScreenHandler::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { + + uint16_t lcd_value = swap16(*(uint16_t *)val_ptr); + + if(lcd_value > 100) lcd_value = 100; + else if(lcd_value < 10) lcd_value = 10; + + lcd_default_light = lcd_value; + + const uint16_t lcd_data[2] = {lcd_default_light, lcd_default_light}; + dgusdisplay.WriteVariable(0x0082, &lcd_data, 5, true); +} + +void DGUSScreenHandler::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr) { + int16_t point_value = swap16(*(uint16_t *)val_ptr); + + int16_t level_x_pos, level_y_pos; + char buf_level[32] = {0}; + unsigned int level_speed = 1500; + static bool first_level_flag = false; + + if (!first_level_flag) + queue.enqueue_now_P(G28_STR); + + switch (point_value) { + case 0x0001: + if (first_level_flag) + queue.enqueue_now_P(G28_STR); + queue.enqueue_now_P(PSTR("G1 Z10")); + //level_x_pos = X_MIN_POS + 20; + //level_y_pos = Y_MIN_POS + 20; + level_x_pos = X_MIN_POS + abs(level_1_x_point); + level_y_pos = Y_MIN_POS + abs(level_1_y_point); + + memset(buf_level, 0, sizeof(buf_level)); + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + queue.enqueue_now_P(PSTR("G28 Z")); + break; + case 0x0002: + queue.enqueue_now_P(PSTR("G1 Z10")); + + //level_x_pos = X_MAX_POS - 20; + //level_y_pos = Y_MIN_POS + 20; + + level_x_pos = X_MAX_POS - abs(level_2_x_point); + level_y_pos = Y_MIN_POS + abs(level_2_y_point); + + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + //queue.enqueue_now_P(PSTR("G28Z")); + queue.enqueue_now_P(PSTR("G1 Z-10")); + break; + case 0x0003: + queue.enqueue_now_P(PSTR("G1 Z10")); + + //level_x_pos = X_MAX_POS - 20; + //level_y_pos = Y_MAX_POS - 20; + + level_x_pos = X_MAX_POS - abs(level_3_x_point); + level_y_pos = Y_MAX_POS - abs(level_3_y_point); + + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + //sprintf_P(buf_level, PSTR("G28 Z")); + queue.enqueue_now_P(PSTR("G1 Z-10")); + break; + case 0x0004: + queue.enqueue_now_P(PSTR("G1 Z10")); + + //level_x_pos = X_MIN_POS + 20; + //level_y_pos = Y_MAX_POS - 20; + level_x_pos = X_MIN_POS + abs(level_4_x_point); + level_y_pos = Y_MAX_POS - abs(level_4_y_point); + + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + //sprintf_P(buf_level, PSTR("G28 Z")); + queue.enqueue_now_P(PSTR("G1 Z-10")); + break; + case 0x0005: + queue.enqueue_now_P(PSTR("G1 Z10")); + //level_x_pos = (uint16_t)(X_MAX_POS / 2); + //level_y_pos = (uint16_t)(Y_MAX_POS / 2); + level_x_pos = abs(level_5_x_point); + level_y_pos = abs(level_5_y_point); + + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + queue.enqueue_now_P(PSTR("G1 Z-10")); + break; + } + + // Only once + first_level_flag = true; +} + +#define mks_min(a, b) ((a) < (b)) ? (a) : (b) +#define mks_max(a, b) ((a) > (b)) ? (a) : (b) +void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { + #if EITHER(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) + uint16_t tmc_value = swap16(*(uint16_t*)val_ptr); + #endif + + switch (var.VP) { + case VP_TMC_X_STEP: + #if USE_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(X) + stepperX.homing_threshold(mks_min(tmc_value, 255)); + settings.save(); + //tmc_x_step = stepperX.homing_threshold(); + #endif + #endif + break; + case VP_TMC_Y_STEP: + #if USE_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(Y) + stepperY.homing_threshold(mks_min(tmc_value, 255)); + settings.save(); + //tmc_y_step = stepperY.homing_threshold(); + #endif + #endif + break; + case VP_TMC_Z_STEP: + #if USE_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(Z) + stepperZ.homing_threshold(mks_min(tmc_value, 255)); + settings.save(); + //tmc_z_step = stepperZ.homing_threshold(); + #endif + #endif + break; + case VP_TMC_X_Current: + #if AXIS_IS_TMC(X) + stepperX.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_X1_Current: + #if AXIS_IS_TMC(X2) + stepperX2.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_Y_Current: + #if AXIS_IS_TMC(Y) + stepperY.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_Y1_Current: + #if AXIS_IS_TMC(X2) + stepperY2.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_Z_Current: + #if AXIS_IS_TMC(Z) + stepperZ.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_Z1_Current: + #if AXIS_IS_TMC(Z2) + stepperZ2.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_E0_Current: + #if AXIS_IS_TMC(E0) + stepperE0.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_E1_Current: + #if AXIS_IS_TMC(E1) + stepperE1.rms_current(tmc_value); + settings.save(); + #endif + break; + + default: + break; + } + #if USE_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(X) + tmc_x_step = stepperX.homing_threshold(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_y_step = stepperY.homing_threshold(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_z_step = stepperZ.homing_threshold(); + #endif + #endif +} + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + + // Choose Move distance + if (distanceMove == 0x01) distanceMove = 10; + else if (distanceMove == 0x02) distanceMove = 100; + else if (distanceMove == 0x03) distanceMove = 1000; + + DEBUG_ECHOLNPAIR("QUEUE LEN:", queue.length); + + if (!print_job_timer.isPaused() && queue.length >= BUFSIZE) + return; + + char axiscode; + unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { // switch X Y Z or Home + default: return; + case VP_MOVE_X: + DEBUG_ECHOLNPGM("X Move"); + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + DEBUG_ECHOLNPGM("Y Move"); + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + DEBUG_ECHOLNPGM("Z Move"); + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_MOTOR_LOCK_UNLOK: + DEBUG_ECHOLNPGM("Motor Unlock"); + movevalue = 5; + axiscode = '\0'; + // return ; + break; + + case VP_HOME_ALL: // only used for homing + DEBUG_ECHOLNPGM("Home all"); + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + //return; + break; + + case VP_X_HOME: + DEBUG_ECHOLNPGM("X Home"); + axiscode = 'X'; + movevalue = 0; + break; + + case VP_Y_HOME: + DEBUG_ECHOLNPGM("Y Home"); + axiscode = 'Y'; + movevalue = 0; + break; + + case VP_Z_HOME: + DEBUG_ECHOLNPGM("Z Home"); + axiscode = 'Z'; + movevalue = 0; + break; + } + + DEBUG_ECHOPAIR("movevalue = ", movevalue); + if (movevalue != 0 && movevalue != 5) { // get move distance + switch (movevalue) { + case 0x0001: movevalue = distanceMove; break; + case 0x0002: movevalue = -distanceMove; break; + default: movevalue = 0; break; + } + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + // char buf[6] = "G28 X"; + // buf[4] = axiscode; + + char buf[6]; + sprintf(buf,"G28 %c",axiscode); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ForceCompleteUpdate(); + return; + } + else if (movevalue == 5) { + DEBUG_ECHOPAIR("send M84"); + char buf[6]; + snprintf_P(buf,6,PSTR("M84 %c"),axiscode); + queue.enqueue_one_now(buf); + ForceCompleteUpdate(); + return; + } + else { + // movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + // unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + queue.enqueue_one_now(buf); + + //if (backup_speed != speed) { + // snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + // queue.enqueue_one_now(buf); + // //DEBUG_ECHOPAIR(" ", buf); + //} + + //while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + //queue.enqueue_now_P(PSTR("G90")); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +void DGUSScreenHandler::GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr) { + int16_t value_pos = swap16(*(int16_t*)val_ptr); + + switch (var.VP) { + case VP_X_PARK_POS: x_park_pos = value_pos; break; + case VP_Y_PARK_POS: y_park_pos = value_pos; break; + case VP_Z_PARK_POS: z_park_pos = value_pos; break; + default: break; + } + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + + int16_t value_raw = swap16(*(int16_t*)val_ptr); + + DEBUG_ECHOLNPAIR_F("value:", value_raw); + + *(int16_t*)var.memadr = value_raw; + + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::axis_t axis; + switch (var.VP) { + case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; + case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; + case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; + default: return; + } + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::setAxisSteps_per_mm(value, axis); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleStepPerMMExtruderChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::extruder_t extruder; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HOTENDS >= 2 + #endif + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + } + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::setAxisSteps_per_mm(value, extruder); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::axis_t axis; + switch (var.VP) { + case VP_X_MAX_SPEED: axis = ExtUI::axis_t::X; break; + case VP_Y_MAX_SPEED: axis = ExtUI::axis_t::Y; break; + case VP_Z_MAX_SPEED: axis = ExtUI::axis_t::Z; break; + default: return; + } + DEBUG_ECHOLNPAIR_F("value:", value); + // ExtUI::setAxisSteps_per_mm(value,extruder); + ExtUI::setAxisMaxFeedrate_mm_s(value, axis); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxFeedrate_mm_s(axis)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::extruder_t extruder; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_MAX_SPEED: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HOTENDS >= 2 + #endif + case VP_E1_MAX_SPEED: extruder = ExtUI::extruder_t::E1; break; + } + DEBUG_ECHOLNPAIR_F("value:", value); + // ExtUI::setAxisSteps_per_mm(value,extruder); + ExtUI::setAxisMaxFeedrate_mm_s(value, extruder); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxFeedrate_mm_s(extruder)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::axis_t axis; + switch (var.VP) { + case VP_X_ACC_MAX_SPEED: axis = ExtUI::axis_t::X; break; + case VP_Y_ACC_MAX_SPEED: axis = ExtUI::axis_t::Y; break; + case VP_Z_ACC_MAX_SPEED: axis = ExtUI::axis_t::Z; break; + default: return; + } + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::setAxisMaxAcceleration_mm_s2(value, axis); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxAcceleration_mm_s2(axis)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::extruder_t extruder; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E0; settings.load(); break; + #endif + #if HOTENDS >= 2 + #endif + case VP_E1_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E1; settings.load(); break; + } + DEBUG_ECHOLNPAIR_F("value:", value); + // ExtUI::setAxisSteps_per_mm(value,extruder); + ExtUI::setAxisMaxAcceleration_mm_s2(value, extruder); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxAcceleration_mm_s2(extruder)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleTravelAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_travel = swap16(*(uint16_t*)val_ptr); + float value = (float)value_travel; + planner.settings.travel_acceleration = value; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleFeedRateMinChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_t = swap16(*(uint16_t*)val_ptr); + float value = (float)value_t; + planner.settings.min_feedrate_mm_s = value; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleMin_T_F_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_t_f = swap16(*(uint16_t*)val_ptr); + float value = (float)value_t_f; + planner.settings.min_travel_feedrate_mm_s = value; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_acc = swap16(*(uint16_t*)val_ptr); + float value = (float)value_acc; + planner.settings.acceleration = value; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleGetExMinTemp_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_ex_min_temp = swap16(*(uint16_t*)val_ptr); + thermalManager.extrude_min_temp = value_ex_min_temp; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } +#endif // HAS_PID_HEATING + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + char babystep_buf[30]; + float step = ZOffset_distance; + + uint16_t flag = swap16(*(uint16_t*)val_ptr); + switch (flag) { + case 0: + if (step == 0.01) + queue.inject_P(PSTR("M290 Z-0.01")); + else if (step == 0.1) + queue.inject_P(PSTR("M290 Z-0.1")); + else if (step == 0.5) + queue.inject_P(PSTR("M290 Z-0.5")); + else if (step == 1) + queue.inject_P(PSTR("M290 Z-1")); + else + queue.inject_P(PSTR("M290 Z-0.01")); + + z_offset_add = z_offset_add - ZOffset_distance; + break; + + case 1: + if (step == 0.01) + queue.inject_P(PSTR("M290 Z0.01")); + else if (step == 0.1) + queue.inject_P(PSTR("M290 Z0.1")); + else if (step == 0.5) + queue.inject_P(PSTR("M290 Z0.5")); + else if (step == 1) + queue.inject_P(PSTR("M290 Z1")); + else + queue.inject_P(PSTR("M290 Z-0.01")); + + z_offset_add = z_offset_add + ZOffset_distance; + break; + + default: + break; + } + ForceCompleteUpdate(); + } +#endif // BABYSTEPPING + +void DGUSScreenHandler::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleGetFilament"); + + uint16_t value_len = swap16(*(uint16_t*)val_ptr); + + float value = (float)value_len; + + DEBUG_ECHOLNPAIR_F("Get Filament len value:", value); + distanceFilament = value; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleGetFilamentSpeed"); + + uint16_t value_len = swap16(*(uint16_t*)val_ptr); + + DEBUG_ECHOLNPAIR_F("FilamentSpeed value:", value_len); + + FilamentSpeed = value_len; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("Load Filament"); + char buf[40]; + + uint16_t val_t = swap16(*(uint16_t*)val_ptr); + + switch (val_t) { + case 0: + #if HOTENDS >= 1 + if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T0")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + break; + + case 1: + #if HOTENDS >= 2 + if (thermalManager.temp_hotend[1].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[1].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T1")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + #if ENABLED(SINGLENOZZLE) + if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T1")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + break; + + default: + break; + } +} + +void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("UnLoad Filament"); + char buf[40]; + uint16_t val_t = swap16(*(uint16_t*)val_ptr); + switch (val_t) { + case 0: + #if HOTENDS >= 1 + if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T0")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + break; + case 1: + #if HOTENDS >= 2 + if (thermalManager.temp_hotend[1].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[1].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T1")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + + #if ENABLED(SINGLENOZZLE) + if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T1")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + break; + } +} + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) { // Load filament type + filament_data.action = 1; + } + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else { // Cancel filament operation + filament_data.action = 0; + } + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif // DGUS_FILAMENT_LOADUNLOAD + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + static uint8_t language_times = 2; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + if (language_times != 0) { + LanguagePInit(); + DGUS_LanguageDisplay(DGUSLanguageSwitch); + language_times--; + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) { + booted = true; + #if ANY_AXIS_HAS(STEALTHCHOP) + #if AXIS_HAS_STEALTHCHOP(X) + tmc_x_step = stepperX.homing_threshold(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_y_step = stepperY.homing_threshold(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_z_step = stepperZ.homing_threshold(); + #endif + #endif + + if (min_ex_temp != 0) + thermalManager.extrude_min_temp = min_ex_temp; + + DGUS_ExtrudeLoadInit(); + + TERN_(DGUS_MKS_RUNOUT_SENSOR, DGUS_RunoutInit()); + + if (TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + GotoScreen(DGUSLCD_SCREEN_POWER_LOSS); + else + GotoScreen(DGUSLCD_SCREEN_MAIN); + } + + #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) + if (booted && (IS_SD_PRINTING() || IS_SD_PAUSED())) + DGUS_Runout_Idle(); + #endif + #endif // SHOW_BOOTSCREEN + + return IsScreenComplete(); +} + +void DGUSScreenHandler::LanguagePInit() { + switch (DGUSLanguageSwitch) { + case MKS_SimpleChinese: + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_Choose); + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_NoChoose); + break; + case MKS_English: + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_NoChoose); + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_Choose); + break; + default: + break; + } +} + +void DGUSScreenHandler::DGUS_ExtrudeLoadInit(void) { + ex_filament.ex_length = distanceFilament; + ex_filament.ex_load_unload_flag = 0; + ex_filament.ex_need_time = FilamentSpeed; + ex_filament.ex_speed = 0; + ex_filament.ex_status = EX_NONE; + ex_filament.ex_tick_end = 0; + ex_filament.ex_tick_start = 0; +} + +void DGUSScreenHandler::DGUS_RunoutInit(void) { + #if PIN_EXISTS(MT_DET_1) + pinMode(MT_DET_1_PIN, INPUT_PULLUP); + #endif + runout_mks.de_count = 0; + runout_mks.de_times = 10; + runout_mks.pin_status = 1; + runout_mks.runout_status = UNRUNOUT_STATUS; +} + +void DGUSScreenHandler::DGUS_Runout_Idle(void) { + #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) + // scanf runout pin + switch (runout_mks.runout_status) { + + case RUNOUT_STATUS: + runout_mks.runout_status = RUNOUT_BEGIN_STATUS; + queue.inject_P(PSTR("M25")); + GotoScreen(MKSLCD_SCREEN_PAUSE); + + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please change filament!"), nullptr, true, true, true, true); + // SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + break; + + case UNRUNOUT_STATUS: + if (READ(MT_DET_1_PIN) == LOW) + runout_mks.runout_status = RUNOUT_STATUS; + break; + + case RUNOUT_BEGIN_STATUS: + if (READ(MT_DET_1_PIN) == HIGH) + runout_mks.runout_status = RUNOUT_WAITTING_STATUS; + break; + + case RUNOUT_WAITTING_STATUS: + if (READ(MT_DET_1_PIN) == LOW) + runout_mks.runout_status = RUNOUT_BEGIN_STATUS; + break; + + default: break; + } + #endif +} + +void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { + if (var == MKS_English) { + const char home_buf_en[] = "Home"; + dgusdisplay.WriteVariable(VP_HOME_Dis, home_buf_en, 32, true); + + const char setting_buf_en[] = "Setting"; + dgusdisplay.WriteVariable(VP_Setting_Dis, setting_buf_en, 32, true); + + const char Tool_buf_en[] = "Tool"; + dgusdisplay.WriteVariable(VP_Tool_Dis, Tool_buf_en, 32, true); + + const char Print_buf_en[] = "Print"; + dgusdisplay.WriteVariable(VP_Print_Dis, Print_buf_en, 32, true); + + const char Language_buf_en[] = "Language"; + dgusdisplay.WriteVariable(VP_Language_Dis, Language_buf_en, 32, true); + + const char About_buf_en[] = "About"; + dgusdisplay.WriteVariable(VP_About_Dis, About_buf_en, 32, true); + + const char Config_buf_en[] = "Config"; + dgusdisplay.WriteVariable(VP_Config_Dis, Config_buf_en, 32, true); + + const char MotorConfig_buf_en[] = "MotorConfig"; + dgusdisplay.WriteVariable(VP_MotorConfig_Dis, MotorConfig_buf_en, 32, true); + + const char LevelConfig_buf_en[] = "LevelConfig"; + dgusdisplay.WriteVariable(VP_LevelConfig_Dis, LevelConfig_buf_en, 32, true); + + const char TemperatureConfig_buf_en[] = "Temperature"; + dgusdisplay.WriteVariable(VP_TemperatureConfig_Dis, TemperatureConfig_buf_en, 32, true); + + const char Advance_buf_en[] = "Advance"; + dgusdisplay.WriteVariable(VP_Advance_Dis, Advance_buf_en, 32, true); + + const char Filament_buf_en[] = "Extrude"; + dgusdisplay.WriteVariable(VP_Filament_Dis, Filament_buf_en, 32, true); + + const char Move_buf_en[] = "Move"; + dgusdisplay.WriteVariable(VP_Move_Dis, Move_buf_en, 32, true); + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + const char Level_buf_en[] = "AutoLevel"; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_en, 32, true); + #elif ENABLED(MESH_BED_LEVELING) + const char Level_buf_en[] = "MeshLevel"; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_en, 32, true); + #else + const char Level_buf_en[] = "Level"; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_en, 32, true); + #endif + + const char MotorPluse_buf_en[] = "MotorPluse"; + dgusdisplay.WriteVariable(VP_MotorPluse_Dis, MotorPluse_buf_en, 32, true); + + const char MotorMaxSpeed_buf_en[] = "MotorMaxSpeed"; + dgusdisplay.WriteVariable(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_en, 32, true); + + const char MotorMaxAcc_buf_en[] = "MotorAcc"; + dgusdisplay.WriteVariable(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_en, 32, true); + + const char TravelAcc_buf_en[] = "TravelAcc"; + dgusdisplay.WriteVariable(VP_TravelAcc_Dis, TravelAcc_buf_en, 32, true); + + const char FeedRateMin_buf_en[] = "FeedRateMin"; + dgusdisplay.WriteVariable(VP_FeedRateMin_Dis, FeedRateMin_buf_en, 32, true); + + const char TravelFeeRateMin_buf_en[] = "TravelFeedRateMin"; + dgusdisplay.WriteVariable(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_en, 32, true); + + const char Acc_buf_en[] = "Acc"; + dgusdisplay.WriteVariable(VP_ACC_Dis, Acc_buf_en, 32, true); + + const char Point_One_buf_en[] = "Point_First"; + dgusdisplay.WriteVariable(VP_Point_One_Dis, Point_One_buf_en, 32, true); + + const char Point_Two_buf_en[] = "Point_Second"; + dgusdisplay.WriteVariable(VP_Point_Two_Dis, Point_Two_buf_en, 32, true); + + const char Point_Three_buf_en[] = "Point_Third"; + dgusdisplay.WriteVariable(VP_Point_Three_Dis, Point_Three_buf_en, 32, true); + + const char Point_Four_buf_en[] = "Point_Fourth"; + dgusdisplay.WriteVariable(VP_Point_Four_Dis, Point_Four_buf_en, 32, true); + + const char Point_Five_buf_en[] = "Point_Fifth"; + dgusdisplay.WriteVariable(VP_Point_Five_Dis, Point_Five_buf_en, 32, true); + + const char Extrusion_buf_en[] = "Extrusion"; + dgusdisplay.WriteVariable(VP_Extrusion_Dis, Extrusion_buf_en, 32, true); + + const char HeatBed_buf_en[] = "HeatBed"; + dgusdisplay.WriteVariable(VP_HeatBed_Dis, HeatBed_buf_en, 32, true); + + const char FactoryDefaults_buf_en[] = "FactoryDefaults"; + dgusdisplay.WriteVariable(VP_FactoryDefaults_Dis, FactoryDefaults_buf_en, 32, true); + + const char StoreSetting_buf_en[] = "StoreSetting"; + dgusdisplay.WriteVariable(VP_StoreSetting_Dis, StoreSetting_buf_en, 32, true); + + const char PrintPauseConfig_buf_en[] = "PrintPauseConfig"; + dgusdisplay.WriteVariable(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_en, 32, true); + + const char X_Pluse_buf_en[] = "X_Pluse"; + dgusdisplay.WriteVariable(VP_X_Pluse_Dis, X_Pluse_buf_en, 32, true); + + const char Y_Pluse_buf_en[] = "Y_Pluse"; + dgusdisplay.WriteVariable(VP_Y_Pluse_Dis, Y_Pluse_buf_en, 32, true); + + const char Z_Pluse_buf_en[] = "Z_Pluse"; + dgusdisplay.WriteVariable(VP_Z_Pluse_Dis, Z_Pluse_buf_en, 32, true); + + const char E0_Pluse_buf_en[] = "E0_Pluse"; + dgusdisplay.WriteVariable(VP_E0_Pluse_Dis, E0_Pluse_buf_en, 32, true); + + const char E1_Pluse_buf_en[] = "E1_Pluse"; + dgusdisplay.WriteVariable(VP_E1_Pluse_Dis, E1_Pluse_buf_en, 32, true); + + const char X_Max_Speed_buf_en[] = "X_Max_Speed"; + dgusdisplay.WriteVariable(VP_X_Max_Speed_Dis, X_Max_Speed_buf_en, 32, true); + + const char Y_Max_Speed_buf_en[] = "Y_Max_Speed"; + dgusdisplay.WriteVariable(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_en, 32, true); + + const char Z_Max_Speed_buf_en[] = "Z_Max_Speed"; + dgusdisplay.WriteVariable(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_en, 32, true); + + const char E0_Max_Speed_buf_en[] = "E0_Max_Speed"; + dgusdisplay.WriteVariable(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_en, 32, true); + + const char E1_Max_Speed_buf_en[] = "E1_Max_Speed"; + dgusdisplay.WriteVariable(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_en, 32, true); + + const char X_Max_Acc_Speed_buf_en[] = "X_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_X_Max_Acc_Speed_Dis, X_Max_Acc_Speed_buf_en, 32, true); + + const char Y_Max_Acc_Speed_buf_en[] = "Y_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_Y_Max_Acc_Speed_Dis, Y_Max_Acc_Speed_buf_en, 32, true); + + const char Z_Max_Acc_Speed_buf_en[] = "Z_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_Z_Max_Acc_Speed_Dis, Z_Max_Acc_Speed_buf_en, 32, true); + + const char E0_Max_Acc_Speed_buf_en[] = "E0_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_E0_Max_Acc_Speed_Dis, E0_Max_Acc_Speed_buf_en, 32, true); + + const char E1_Max_Acc_Speed_buf_en[] = "E1_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_E1_Max_Acc_Speed_Dis, E1_Max_Acc_Speed_buf_en, 32, true); + + const char X_PARK_POS_buf_en[] = "X_PARK_POS"; + dgusdisplay.WriteVariable(VP_X_PARK_POS_Dis, X_PARK_POS_buf_en, 32, true); + + const char Y_PARK_POS_buf_en[] = "Y_PARK_POS"; + dgusdisplay.WriteVariable(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_en, 32, true); + + const char Z_PARK_POS_buf_en[] = "Z_PARK_POS"; + dgusdisplay.WriteVariable(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_en, 32, true); + + const char Length_buf_en[] = "Length"; + dgusdisplay.WriteVariable(VP_Length_Dis, Length_buf_en, 32, true); + + const char Speed_buf_en[] = "Speed"; + dgusdisplay.WriteVariable(VP_Speed_Dis, Speed_buf_en, 32, true); + + const char InOut_buf_en[] = "InOut"; + dgusdisplay.WriteVariable(VP_InOut_Dis, InOut_buf_en, 32, true); + + const char PrintTimet_buf_en[] = "PrintTime"; + dgusdisplay.WriteVariable(VP_PrintTime_Dis, PrintTimet_buf_en, 32, true); + + const char E0_Temp_buf_en[] = "E0_Temp"; + dgusdisplay.WriteVariable(VP_E0_Temp_Dis, E0_Temp_buf_en, 32, true); + + const char E1_Temp_buf_en[] = "E1_Temp"; + dgusdisplay.WriteVariable(VP_E1_Temp_Dis, E1_Temp_buf_en, 32, true); + + const char HB_Temp_buf_en[] = "HB_Temp"; + dgusdisplay.WriteVariable(VP_HB_Temp_Dis, HB_Temp_buf_en, 32, true); + + const char Feedrate_buf_en[] = "Feedrate"; + dgusdisplay.WriteVariable(VP_Feedrate_Dis, Feedrate_buf_en, 32, true); + + const char PrintAcc_buf_en[] = "PrintSpeed"; + dgusdisplay.WriteVariable(VP_PrintAcc_Dis, PrintAcc_buf_en, 32, true); + + const char FAN_Speed_buf_en[] = "FAN_Speed"; + dgusdisplay.WriteVariable(VP_FAN_Speed_Dis, FAN_Speed_buf_en, 32, true); + + const char Printing_buf_en[] = "Printing"; + dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_en, 32, true); + + const char Info_EEPROM_1_buf_en[] = "Store setting?"; + dgusdisplay.WriteVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_en, 32, true); + + const char Info_EEPROM_2_buf_en[] = "Revert setting?"; + dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en, 32, true); + + const char Info_PrinfFinsh_1_buf_en[] = "Print Done"; + dgusdisplay.WriteVariable(VP_Info_PrinfFinsh_1_Dis, Info_PrinfFinsh_1_buf_en, 32, true); + + const char TMC_X_Step_buf_en[] = "X_SenSitivity"; + dgusdisplay.WriteVariable(VP_TMC_X_Step_Dis, TMC_X_Step_buf_en, 32, true); + + const char TMC_Y_Step_buf_en[] = "Y_SenSitivity"; + dgusdisplay.WriteVariable(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_en, 32, true); + + const char TMC_Z_Step_buf_en[] = "Z_SenSitivity"; + dgusdisplay.WriteVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_en, 32, true); + + const char TMC_X_Current_buf_en[] = "X_Current"; + dgusdisplay.WriteVariable(VP_TMC_X_Current_Dis, TMC_X_Current_buf_en, 32, true); + + const char TMC_Y_Current_buf_en[] = "Y_Current"; + dgusdisplay.WriteVariable(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_en, 32, true); + + const char TMC_Z_Current_buf_en[] = "Z_Current"; + dgusdisplay.WriteVariable(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_en, 32, true); + + const char TMC_E0_Current_buf_en[] = "E0_Current"; + dgusdisplay.WriteVariable(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_en, 32, true); + + const char TMC_X1_Current_buf_en[] = "X1_Current"; + dgusdisplay.WriteVariable(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_en, 32, true); + + const char TMC_Y1_Current_buf_en[] = "Y1_Current"; + dgusdisplay.WriteVariable(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_en, 32, true); + + const char TMC_Z1_Current_buf_en[] = "Z1_Current"; + dgusdisplay.WriteVariable(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_en, 32, true); + + const char TMC_E1_Current_buf_en[] = "E1_Current"; + dgusdisplay.WriteVariable(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_en, 32, true); + + const char Min_Ex_Temp_buf_en[] = "Min_Ex_Temp"; + dgusdisplay.WriteVariable(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_en, 32, true); + + const char AutoLEVEL_INFO1_buf_en[] = "Please Press Button!"; + dgusdisplay.WriteVariable(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_en, 32, true); + + const char EX_TEMP_INFO2_buf_en[] = "Please wait a monent"; + dgusdisplay.WriteVariable(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_en, 32, true); + + const char EX_TEMP_INFO3_buf_en[] = "Cancle"; + dgusdisplay.WriteVariable(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_en, 32, true); + + const char PrintConfrim_Info_buf_en[] = "Start Print?"; + dgusdisplay.WriteVariable(VP_PrintConfrim_Info_Dis, PrintConfrim_Info_buf_en, 32, true); + + const char StopPrintConfrim_Info_buf_en[] = "Stop Print?"; + dgusdisplay.WriteVariable(VP_StopPrintConfrim_Info_Dis, StopPrintConfrim_Info_buf_en, 32, true); + + const char Printting_buf_en[] = "Printing"; + dgusdisplay.WriteVariable(VP_Printting_Dis, Printting_buf_en, 32, true); + + const char LCD_BLK_buf_en[] = "Backlight"; + dgusdisplay.WriteVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_en, 32, true); + } + else if (var == MKS_SimpleChinese) { + uint16_t home_buf_ch[] = { 0xF7D6, 0xB3D2 }; + dgusdisplay.WriteVariable(VP_HOME_Dis, home_buf_ch, 4, true); + + const uint16_t Setting_Dis[] = { 0xE8C9, 0xC3D6, 0x2000, 0x2000, 0x2000 }; + dgusdisplay.WriteVariable(VP_Setting_Dis, Setting_Dis, 7, true); + + const uint16_t Tool_Dis[] = { 0xA4B9, 0xDFBE }; + dgusdisplay.WriteVariable(VP_Tool_Dis, Tool_Dis, 4, true); + + const uint16_t Print_buf_ch[] = { 0xF2B4, 0xA1D3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Print_Dis, Print_buf_ch, 6, true); + + const uint16_t Language_buf_ch[] = { 0xEFD3, 0xD4D1, 0x2000, 0x2000 }; + dgusdisplay.WriteVariable(VP_Language_Dis, Language_buf_ch, 8, true); + + const uint16_t About_buf_ch[] = { 0xD8B9, 0xDAD3, 0x2000 }; + dgusdisplay.WriteVariable(VP_About_Dis, About_buf_ch, 6, true); + + const uint16_t Config_buf_ch[] = { 0xE4C5, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Config_Dis, Config_buf_ch, 6, true); + + const uint16_t MotorConfig_buf_ch[] = { 0xE7B5, 0xFABB, 0xE4C5, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_MotorConfig_Dis, MotorConfig_buf_ch, 12, true); + + const uint16_t LevelConfig_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_LevelConfig_Dis, LevelConfig_buf_ch, 32, true); + + const uint16_t TemperatureConfig_buf_ch[] = { 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TemperatureConfig_Dis, TemperatureConfig_buf_ch, 11, true); + + const uint16_t Advance_buf_ch[] = { 0xDFB8, 0xB6BC, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Advance_Dis, Advance_buf_ch, 16, true); + + const uint16_t Filament_buf_ch[] = { 0xB7BC, 0xF6B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Filament_Dis, Filament_buf_ch, 8, true); + + const uint16_t Move_buf_ch[] = { 0xC6D2, 0xAFB6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Move_Dis, Move_buf_ch, 4, true); + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + const uint16_t Level_buf_ch[] = { 0xD4D7, 0xAFB6, 0xF7B5, 0xBDC6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_ch, 32, true); + #elif ENABLED(MESH_BED_LEVELING) + const uint16_t Level_buf_ch[] = { 0xF8CD, 0xF1B8, 0xF7B5, 0xBDC6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_ch, 32, true); + #else + const uint16_t Level_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_ch, 32, true); + #endif + + const uint16_t MotorPluse_buf_ch[] = { 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_MotorPluse_Dis, MotorPluse_buf_ch, 16, true); + + const uint16_t MotorMaxSpeed_buf_ch[] = { 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_ch, 16, true); + + const uint16_t MotorMaxAcc_buf_ch[] = { 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_ch, 16, true); + + const uint16_t TravelAcc_buf_ch[] = { 0xD5BF, 0xD0D0, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TravelAcc_Dis, TravelAcc_buf_ch, 16, true); + + const uint16_t FeedRateMin_buf_ch[] = { 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_FeedRateMin_Dis, FeedRateMin_buf_ch, 12, true); + + const uint16_t TravelFeeRateMin_buf_ch[] = { 0xD5BF, 0xD0D0, 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_ch, 24, true); + + const uint16_t Acc_buf_ch[] = { 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_ACC_Dis, Acc_buf_ch, 16, true); + + const uint16_t Point_One_buf_ch[] = { 0xDAB5, 0xBBD2, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_One_Dis, Point_One_buf_ch, 12, true); + + const uint16_t Point_Two_buf_ch[] = { 0xDAB5, 0xFEB6, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_Two_Dis, Point_Two_buf_ch, 12, true); + + const uint16_t Point_Three_buf_ch[] = { 0xDAB5, 0xFDC8, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_Three_Dis, Point_Three_buf_ch, 12, true); + + const uint16_t Point_Four_buf_ch[] = { 0xDAB5, 0xC4CB, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_Four_Dis, Point_Four_buf_ch, 12, true); + + const uint16_t Point_Five_buf_ch[] = { 0xDAB5, 0xE5CE, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_Five_Dis, Point_Five_buf_ch, 12, true); + + const uint16_t Extrusion_buf_ch[] = { 0xB7BC, 0xF6B3, 0xB7CD, 0x2000 }; + dgusdisplay.WriteVariable(VP_Extrusion_Dis, Extrusion_buf_ch, 12, true); + + const uint16_t HeatBed_buf_ch[] = { 0xC8C8, 0xB2B4, 0x2000 }; + dgusdisplay.WriteVariable(VP_HeatBed_Dis, HeatBed_buf_ch, 12, true); + + const uint16_t FactoryDefaults_buf_ch[] = { 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_FactoryDefaults_Dis, FactoryDefaults_buf_ch, 16, true); + + const uint16_t StoreSetting_buf_ch[] = { 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_StoreSetting_Dis, StoreSetting_buf_ch, 16, true); + + const uint16_t PrintPauseConfig_buf_ch[] = { 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_ch, 32, true); + + const uint16_t X_Pluse_buf_ch[] = { 0x2058, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_X_Pluse_Dis, X_Pluse_buf_ch, 16, true); + + const uint16_t Y_Pluse_buf_ch[] = { 0x2059, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Y_Pluse_Dis, Y_Pluse_buf_ch, 16, true); + + const uint16_t Z_Pluse_buf_ch[] = { 0x205A, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Z_Pluse_Dis, Z_Pluse_buf_ch, 16, true); + + const uint16_t E0_Pluse_buf_ch[] = { 0x3045, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_E0_Pluse_Dis, E0_Pluse_buf_ch, 16, true); + + const uint16_t E1_Pluse_buf_ch[] = { 0x3145, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_E1_Pluse_Dis, E1_Pluse_buf_ch, 16, true); + + const uint16_t X_Max_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_X_Max_Speed_Dis, X_Max_Speed_buf_ch, 16, true); + + const uint16_t Y_Max_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_ch, 16, true); + + const uint16_t Z_Max_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_ch, 16, true); + + const uint16_t E0_Max_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_ch, 16, true); + + const uint16_t E1_Max_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_ch, 16, true); + + const uint16_t X_Max_Acc_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_X_Max_Acc_Speed_Dis, X_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t Y_Max_Acc_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Y_Max_Acc_Speed_Dis, Y_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t Z_Max_Acc_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Z_Max_Acc_Speed_Dis, Z_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t E0_Max_Acc_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E0_Max_Acc_Speed_Dis, E0_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t E1_Max_Acc_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E1_Max_Acc_Speed_Dis, E1_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t X_PARK_POS_buf_ch[] = { 0x2058, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_X_PARK_POS_Dis, X_PARK_POS_buf_ch, 16, true); + + const uint16_t Y_PARK_POS_buf_ch[] = { 0x2059, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_ch, 16, true); + + const uint16_t Z_PARK_POS_buf_ch[] = { 0x205A, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_ch, 16, true); + + const uint16_t Length_buf_ch[] = { 0xBDB2, 0xA4B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Length_Dis, Length_buf_ch, 8, true); + + const uint16_t Speed_buf_ch[] = { 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Speed_Dis, Speed_buf_ch, 8, true); + + const uint16_t InOut_buf_ch[] = { 0xF8BD, 0xF6B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_InOut_Dis, InOut_buf_ch, 8, true); + + const uint16_t PrintTimet_buf_en[] = { 0xF2B4, 0xA1D3, 0xB1CA, 0xE4BC, 0x2000 }; + dgusdisplay.WriteVariable(VP_PrintTime_Dis, PrintTimet_buf_en, 16, true); + + const uint16_t E0_Temp_buf_ch[] = { 0x3045, 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E0_Temp_Dis, E0_Temp_buf_ch, 16, true); + + const uint16_t E1_Temp_buf_ch[] = { 0x3145, 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E1_Temp_Dis, E1_Temp_buf_ch, 16, true); + + const uint16_t HB_Temp_buf_ch[] = { 0xC8C8, 0xB2B4, 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_HB_Temp_Dis, HB_Temp_buf_ch, 16, true); + + const uint16_t Feedrate_buf_ch[] = { 0xB7BC, 0xF6B3, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Feedrate_Dis, Feedrate_buf_ch, 16, true); + + const uint16_t PrintAcc_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_PrintAcc_Dis, PrintAcc_buf_ch, 16, true); + + const uint16_t FAN_Speed_buf_ch[] = { 0xE7B7, 0xC8C9, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_FAN_Speed_Dis, FAN_Speed_buf_ch, 16, true); + + const uint16_t Printing_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_ch, 16, true); + + const uint16_t Info_EEPROM_1_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_ch, 32, true); + + const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32, true); + + const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_X_Step_Dis, TMC_X_Step_buf_ch, 16, true); + + const uint16_t TMC_Y_Step_buf_ch[] = { 0x2059, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_ch, 16, true); + + const uint16_t TMC_Z_Step_buf_ch[] = { 0x205A, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_ch, 16, true); + + const uint16_t Info_PrinfFinsh_1_buf_ch[] = { 0xF2B4, 0xA1D3, 0xEACD, 0xC9B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Info_PrinfFinsh_1_Dis, Info_PrinfFinsh_1_buf_ch, 32, true); + + const uint16_t TMC_X_Current_buf_ch[] = { 0x2058, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_X_Current_Dis, TMC_X_Current_buf_ch, 16, true); + + const uint16_t TMC_Y_Current_buf_ch[] = { 0x2059, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_ch, 16, true); + + const uint16_t TMC_Z_Current_buf_ch[] = { 0x205A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_ch, 16, true); + + const uint16_t TMC_E0_Current_buf_ch[] = { 0x3045, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_ch, 16, true); + + const uint16_t TMC_X1_Current_buf_ch[] = { 0x3158, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_ch, 16, true); + + const uint16_t TMC_Y1_Current_buf_ch[] = { 0x3159, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_ch, 16, true); + + const uint16_t TMC_Z1_Current_buf_ch[] = { 0x315A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_ch, 16, true); + + const uint16_t TMC_E1_Current_buf_ch[] = { 0x3145, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_ch, 16, true); + + const uint16_t Min_Ex_Temp_buf_ch[] = { 0xEED7, 0xA1D0, 0xB7BC, 0xF6B3, 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_ch, 32, true); + + const uint16_t AutoLEVEL_INFO1_buf_ch[] = { 0xEBC7, 0xB4B0, 0xC2CF, 0xB4B0, 0xA5C5, 0x2000 }; + dgusdisplay.WriteVariable(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_ch, 32, true); + + const uint16_t EX_TEMP_INFO2_buf_ch[] = { 0xEBC7, 0xD4C9, 0xC8B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_ch, 32, true); + + const uint16_t EX_TEMP_INFO3_buf_ch[] = { 0xA1C8, 0xFBCF, 0xD3BC, 0xC8C8, 0x2000 }; + dgusdisplay.WriteVariable(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_ch, 32, true); + + const uint16_t PrintConfrim_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xAABF, 0xBCCA, 0xF2B4, 0xA1D3, 0x2000 }; + dgusdisplay.WriteVariable(VP_PrintConfrim_Info_Dis, PrintConfrim_Info_buf_ch, 32, true); + + const uint16_t StopPrintConfrim_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3CD, 0xB9D6, 0xF2B4, 0xA1D3, 0x2000 }; + dgusdisplay.WriteVariable(VP_StopPrintConfrim_Info_Dis, StopPrintConfrim_Info_buf_ch, 32, true); + + const uint16_t Printting_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Printting_Dis, Printting_buf_ch, 32, true); + + const uint16_t LCD_BLK_buf_ch[] = { 0xB3B1, 0xE2B9, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_ch, 32, true); + } +} + +#endif // DGUS_LCD_UI_MKS diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h new file mode 100644 index 0000000000..4d6e985d84 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -0,0 +1,307 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../DGUSDisplay.h" +#include "../DGUSVPVariable.h" +#include "../DGUSDisplayDef.h" + +#include "../../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + // The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4); + static void sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) ; + static void sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4,uint16_t language); + + // "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + // The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + + static void ScreenBackChange(DGUS_VP_Variable &var, void *val_ptr); + + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + + static void EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr); + static void LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr); + static void Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void MeshLevel(DGUS_VP_Variable &var, void *val_ptr); + static void MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr); + static void ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr); + static void ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr); + static void Z_offset_select(DGUS_VP_Variable &var, void *val_ptr); + static void GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr); + static void GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr); + static void GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr); + static void GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleGetExMinTemp_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void DGUS_LanguageDisplay(uint8_t var); + static void TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr); + static void GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr); + static void LanguagePInit(void); + static void DGUS_Runout_Idle(void); + static void DGUS_RunoutInit(void); + static void DGUS_ExtrudeLoadInit(void); + static void LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr); + + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + + static void HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleTravelAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleFeedRateMinChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleMin_T_F_MKS(DGUS_VP_Variable &var, void *val_ptr); + + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + + static void MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr); + static void MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr); + static void MKS_LOAD_UNLOAD_IDLE(); + static void MKS_LOAD_Cancle(DGUS_VP_Variable &var, void *val_ptr); + static void GetManualFilament(DGUS_VP_Variable &var, void *val_ptr); + static void GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + // Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + // start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + // User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + // User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + // User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + // Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + // Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + // Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + // Marlin informed us about a bad SD Card. + static void SDCardError(); + // Marlin informed us about SD print completion. + static void SDPrintingFinished(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + + static void DGUSLCD_SendPrintTimeToDisplay_MKS(DGUS_VP_Variable &var); + static void DGUSLCD_SendBabyStepToDisplay_MKS(DGUS_VP_Variable &var); + static void DGUSLCD_SendFanToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendGbkToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay_Language_MKS(DGUS_VP_Variable &var); + static void DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var); + + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + // Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + static void DGUSLCD_SetUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + // Send a float value to the display. + // Display will get a 4-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + // Send a float value to the display. + // Display will get a 2-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + // Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + // Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; //< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; //< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; //< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; //< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; //< All VPs sent to screen? + + static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; //< file on top of file chooser + static int16_t file_to_print; //< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +#define MKS_Language_Choose 0x00 +#define MKS_Language_NoChoose 0x01 + +#define MKS_SimpleChinese 0 +#define MKS_English 1 +extern uint8_t DGUSLanguageSwitch; +extern bool DGUSAutoTurnOff; + +#if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_SCREEN_RECOVER MKSLCD_SCREEN_PRINT + #define PLR_SCREEN_CANCEL MKSLCD_SCREEN_HOME +#endif diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index 28e66e5d7c..8d89de3e33 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -20,7 +20,9 @@ * */ -/* DGUS implementation written by coldtobi in 2019 for Marlin */ +/** + * lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp + */ #include "../../../../../inc/MarlinConfigPre.h" @@ -87,7 +89,7 @@ const uint16_t VPList_Status[] PROGMEM = { }; const uint16_t VPList_Status2[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded */ + // VP_M117, for completeness, but it cannot be auto-uploaded #if HOTENDS >= 1 VP_Flowrate_E0, #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp new file mode 100644 index 0000000000..f1d91371c2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp @@ -0,0 +1,418 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_ORIGIN) + +#include "../DGUSScreenHandler.h" + +#include "../../../../../MarlinCore.h" +#include "../../../../../gcode/queue.h" +#include "../../../../../libs/duration_t.h" +#include "../../../../../module/settings.h" +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" +#include "../../../../../module/printcounter.h" +#include "../../../../../sd/cardreader.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr)) return; + + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + + HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + GotoScreen(DGUSLCD_SCREEN_STATUS); + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: { // Resume + if (ExtUI::isPrintingFromMediaPaused()) { + ExtUI::resumePrint(); + } + } break; + + case 1: // Pause + + GotoScreen(MKSLCD_SCREEN_PAUSE); + if (!ExtUI::isPrintingFromMediaPaused()) { + ExtUI::pausePrint(); + //ExtUI::mks_pausePrint(); + } + break; + case 2: // Abort + HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + + if (filelist.seek(top_file + target_line)) { + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); // snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s"), filelist.filename()); + } + DGUSLCD_SendStringToDisplay(var); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) GotoScreen(DGUSLCD_SCREEN_MAIN); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + DEBUG_ECHOLNPAIR("\n DEBUG target", target); + + if (target == DGUSLCD_SCREEN_POPUP) { + // Special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + if (movevalue) { + const uint16_t choice = *(uint16_t*)var.memadr; + movevalue = movevalue < 0 ? -choice : choice; + } + #endif + char axiscode; + unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { + default: return; + + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_HOME_ALL: // only used for homing + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + break; + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + char buf[6] = "G28 X"; + buf[4] = axiscode; + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ForceCompleteUpdate(); + return; + } + else { + // movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓ "); + if (backup_speed != speed) { + snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + queue.enqueue_one_now(buf); + //DEBUG_ECHOPAIR(" ", buf); + } + // while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } +#endif // HAS_PID_HEATING + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + int16_t flag = swap16(*(uint16_t*)val_ptr), + steps = flag ? -20 : 20; + ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); + ForceCompleteUpdate(); + } +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) { // Load filament type + filament_data.action = 1; + } + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else { // Cancel filament operation + filament_data.action = 0; + } + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif // DGUS_FILAMENT_LOADUNLOAD + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + + if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + booted = true; + + if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) + booted = true; + #endif + return IsScreenComplete(); +} + +#endif // DGUS_LCD_UI_ORIGIN diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h new file mode 100644 index 0000000000..28ab952e53 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h @@ -0,0 +1,240 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../DGUSDisplay.h" +#include "../DGUSVPVariable.h" +#include "../DGUSDisplayDef.h" + +#include "../../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + // The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + // "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + // The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + // Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + // start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + // User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + // User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + // User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + // Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + // Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + // Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + // Marlin informed us about a bad SD Card. + static void SDCardError(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + // Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + // Send a float value to the display. + // Display will get a 4-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + // Send a float value to the display. + // Display will get a 2-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + // Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + // Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; //< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; //< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; //< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; //< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; //< All VPs sent to screen? + + static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; //< file on top of file chooser + static int16_t file_to_print; //< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +#if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index dbeb3796e0..039591b03e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -29,6 +29,8 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" +extern const char G28_STR[]; + extern lv_group_t *g; static lv_obj_t *scr; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 2dec548af0..34c7161300 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -38,8 +38,6 @@ static lv_task_t *updatePosTask; static char cur_label = 'Z'; static float cur_pos = 0; -void disp_cur_pos(); - enum { ID_M_X_P = 1, ID_M_X_N, @@ -51,6 +49,12 @@ enum { ID_M_RETURN }; +void disp_cur_pos() { + char str_1[16]; + sprintf_P(public_buf_l, PSTR("%c:%s mm"), cur_label, dtostrf(cur_pos, 1, 1, str_1)); + if (labelP) lv_label_set_text(labelP, public_buf_l); +} + static void event_handler(lv_obj_t *obj, lv_event_t event) { char str_1[16]; if (event != LV_EVENT_RELEASED) return; @@ -125,12 +129,6 @@ void lv_draw_move_motor() { disp_cur_pos(); } -void disp_cur_pos() { - char str_1[16]; - sprintf_P(public_buf_l, PSTR("%c:%s mm"), cur_label, dtostrf(cur_pos, 1, 1, str_1)); - if (labelP) lv_label_set_text(labelP, public_buf_l); -} - void disp_move_dist() { if ((int)(10 * uiCfg.move_dist) == 1) lv_imgbtn_set_src_both(buttonV, "F:/bmp_step_move0_1.bin"); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 97200efb08..047a6cdb70 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -152,9 +152,9 @@ void lv_draw_ready_print() { limit_info = lv_label_create_empty(scr); lv_style_copy(&limit_style, &lv_style_scr); - limit_style.body.main_color.full = 0X0000; - limit_style.body.grad_color.full = 0X0000; - limit_style.text.color.full = 0Xffff; + limit_style.body.main_color.full = 0x0000; + limit_style.body.grad_color.full = 0x0000; + limit_style.text.color.full = 0xffff; lv_obj_set_style(limit_info, &limit_style); lv_obj_set_pos(limit_info, 20, 120); @@ -163,9 +163,9 @@ void lv_draw_ready_print() { det_info = lv_label_create_empty(scr); lv_style_copy(&det_style, &lv_style_scr); - det_style.body.main_color.full = 0X0000; - det_style.body.grad_color.full = 0X0000; - det_style.text.color.full = 0Xffff; + det_style.body.main_color.full = 0x0000; + det_style.body.grad_color.full = 0x0000; + det_style.text.color.full = 0xffff; lv_obj_set_style(det_info, &det_style); lv_obj_set_pos(det_info, 20, 145); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 0abfd7834a..19c93468e4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -116,7 +116,7 @@ #endif // Flash flag -#define REFLSHE_FLGA_ADD (0X800000-32) +#define REFLSHE_FLGA_ADD (0x800000-32) // SD card information first addr #define VAR_INF_ADDR 0x000000 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 5622956579..02ca16e007 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1231,13 +1231,13 @@ void utf8_2_unicode(uint8_t *source, uint8_t Len) { while (1) { char_byte_num = source[i] & 0xF0; - if (source[i] < 0X80) { + if (source[i] < 0x80) { //ASCII --1byte FileName_unicode[char_i] = source[i]; i += 1; char_i += 1; } - else if (char_byte_num == 0XC0 || char_byte_num == 0XD0) { + else if (char_byte_num == 0xC0 || char_byte_num == 0xD0) { //--2byte u16_h = (((uint16_t)source[i] << 8) & 0x1F00) >> 2; u16_l = ((uint16_t)source[i + 1] & 0x003F); @@ -1247,7 +1247,7 @@ void utf8_2_unicode(uint8_t *source, uint8_t Len) { i += 2; char_i += 2; } - else if (char_byte_num == 0XE0) { + else if (char_byte_num == 0xE0) { //--3byte u16_h = (((uint16_t)source[i] << 8) & 0x0F00) << 4; u16_m = (((uint16_t)source[i + 1] << 8) & 0x3F00) >> 2; @@ -1258,7 +1258,7 @@ void utf8_2_unicode(uint8_t *source, uint8_t Len) { i += 3; char_i += 2; } - else if (char_byte_num == 0XF0) { + else if (char_byte_num == 0xF0) { //--4byte i += 4; //char_i += 3; diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index 49ee420aae..a01081a7df 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -42,6 +42,8 @@ //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#define I2C_SCL_PIN PB6 +#define I2C_SDA_PIN PB7 // // Release PB4 (Z_DIR_PIN) from JTAG NRST role diff --git a/platformio.ini b/platformio.ini index b35cd878d0..a63ee9f96a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -53,6 +53,7 @@ default_src_filter = + - - + - - - - + - - - - - - - @@ -287,6 +288,10 @@ HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_CHIRON = src_filter=+ + ANYCUBIC_LCD_I3MEGA = src_filter=+ + HAS_DGUS_LCD = src_filter=+ + +DGUS_LCD_UI_FYSETC = src_filter=+ +DGUS_LCD_UI_HIPRECY = src_filter=+ +DGUS_LCD_UI_MKS = src_filter=+ +DGUS_LCD_UI_ORIGIN = src_filter=+ TOUCH_UI_FTDI_EVE = src_filter=+ EXTUI_EXAMPLE = src_filter=+ MALYAN_LCD = src_filter=+ From 8eedec04a1f2db6fe4477561904538b03a2b87d7 Mon Sep 17 00:00:00 2001 From: RudolphRiedel <31180093+RudolphRiedel@users.noreply.github.com> Date: Sun, 28 Feb 2021 02:39:32 +0100 Subject: [PATCH 1078/1370] Two additional EVE displays (#18839) --- Marlin/Configuration_adv.h | 2 + .../ftdi_eve_lib/basic/boards.h | 99 ++++++++++++++++++- .../ftdi_eve_lib/basic/commands.cpp | 43 +++++--- .../ftdi_eve_lib/basic/resolutions.h | 57 +++++++---- 4 files changed, 163 insertions(+), 38 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0e1cbd9a35..f23ca2980d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1565,6 +1565,8 @@ //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI //#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480) + //#define LCD_EVE3_50G // Matrix Orbital 5.0", 800x480, BT815 + //#define LCD_EVE2_50G // Matrix Orbital 5.0", 800x480, FT813 // Correct the resolution if not using the stock TFT panel. //#define TOUCH_UI_320x240 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h index 6bb920885a..19f926d8e0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h @@ -112,7 +112,7 @@ } /** - * Settings for the 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) + * Settings for the 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) * https://4dsystems.com.au/4dlcd-ft843 * Datasheet: * https://4dsystems.com.au/mwdownloads/download/link/id/52/ @@ -177,8 +177,105 @@ constexpr uint8_t CSpread = 0; constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ } + +/** + * Settings for EVE3-50G - Matrix Orbital 5.0" 800x480, BT815 + * https://www.matrixorbital.com/ftdi-eve/eve-bt815-bt816/eve3-50g + * use for example with: https://github.com/RudolphRiedel/EVE_display-adapter + */ +#elif defined(LCD_EVE3_50G) + #if !HAS_RESOLUTION + #define TOUCH_UI_800x480 + #define TOUCH_UI_800x480_GENERIC // use more common timing parameters as the original set + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 810 + #endif + namespace FTDI { + IS_FT810 + constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = false; + constexpr bool GPIO_1_Audio_Shutdown = false; + #define USE_GT911 // this display uses an alternative touch-controller and we need to tell the init function to switch + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 1; + constexpr uint8_t Pclkpol = 1; + constexpr uint16_t touch_threshold = 1200; /* touch-sensitivity */ + + constexpr uint32_t default_transform_a = 0x000109E4; + constexpr uint32_t default_transform_b = 0x000007A6; + constexpr uint32_t default_transform_c = 0xFFEC1EBA; + constexpr uint32_t default_transform_d = 0x0000072C; + constexpr uint32_t default_transform_e = 0x0001096A; + constexpr uint32_t default_transform_f = 0xFFF469CF; + } + +/** + * Settings for EVE2-50G - Matrix Orbital 5.0" 800x480, FT813 + * https://www.matrixorbital.com/ftdi-eve/eve-bt815-bt816/eve3-50g + * use for example with: https://github.com/RudolphRiedel/EVE_display-adapter + */ +#elif defined(LCD_EVE2_50G) + #if !HAS_RESOLUTION + #define TOUCH_UI_800x480 + #define TOUCH_UI_800x480_GENERIC // use more common timing parameters as the original set + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 810 + #endif + namespace FTDI { + IS_FT810 + constexpr bool Use_Crystal = false; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = false; + constexpr bool GPIO_1_Audio_Shutdown = false; + #define PATCH_GT911 // this display uses an alternative touch-controller and we need to tell the init function to patch the FT813 for it + constexpr uint8_t Pclkpol = 1; + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 1; + constexpr uint16_t touch_threshold = 1200; /* touch-sensitivity */ + + constexpr uint32_t default_transform_a = 0x000109E4; + constexpr uint32_t default_transform_b = 0x000007A6; + constexpr uint32_t default_transform_c = 0xFFEC1EBA; + constexpr uint32_t default_transform_d = 0x0000072C; + constexpr uint32_t default_transform_e = 0x0001096A; + constexpr uint32_t default_transform_f = 0xFFF469CF; + } + #else #error "Unknown or no TOUCH_UI_FTDI_EVE board specified. To add a new board, modify this file." #endif + + +/* this data is used to patch FT813 displays that use a GT911 as a touch-controller */ +#ifdef PATCH_GT911 + constexpr PROGMEM unsigned char GT911_data[] = { + 26,255,255,255,32,32,48,0,4,0,0,0,2,0,0,0, + 34,255,255,255,0,176,48,0,120,218,237,84,221,111,84,69,20,63,51,179,93,160,148,101,111,76,5,44,141,123,111,161,11,219,154,16,9,16,17,229,156,75,26,11,13,21,227,3,16,252,184,179, + 45,219,143,45,41,125,144,72,67,100,150,71,189,113,18,36,17,165,100,165,198,16,32,17,149,196,240,128,161,16,164,38,54,240,0,209,72,130,15,38,125,48,66,82,30,76,19,31,172,103,46, + 139,24,255,4,227,157,204,156,51,115,102,206,231,239,220,5,170,94,129,137,75,194,216,98,94,103,117,115,121,76,131,177,125,89,125,82,123,60,243,58,142,242,204,185,243,188,118,156, + 227,155,203,238,238,195,251,205,229,71,92,28,169,190,184,84,143,113,137,53,244,103,181,237,87,253,113,137,233,48,12,198,165,181,104,139,25,84,253,155,114,74,191,0,54,138,163, + 12,62,131,207,129,23,217,34,91,31,128,65,246,163,175,213,8,147,213,107,35,203,94,108,3,111,40,171,83,24,15,165,177,222,116,97,23,188,140,206,150,42,102,181,87,78,86,182,170,134, + 215,241,121,26,243,252,2,76,115,217,139,222,206,173,136,132,81,61,35,185,39,113,23,46,199,76,178,54,151,183,224,0,40,189,28,149,182,58,131,79,152,30,76,34,98,234,162,216,133,141, + 102,39,170,40,192,101,53,201,146,191,37,77,44,177,209,74,211,5,206,187,5,6,216,47,53,96,123,22,50,103,251,192,84,17,74,227,185,56,106,51,91,161,96,182,163,48,171,141,139,65,152, + 66,66,11,102,43,158,75,36,80,147,184,147,139,112,17,235,216,103,111,239,245,92,10,175,194,40,44,58,125,5,59,112,50,103,245,4,78,192,5,156,194,51,60,191,134,75,110,173,237,46,192, + 121,156,192,115,184,218,120,67,63,115,46,11,102,10,97,232,50,235,114,182,148,118,178,41,188,12,135,77,202,124,12,96,238,35,161,234,189,129,23,249,212,139,230,25,53,48,205,52,93, + 163,117,53,154,170,81,85,163,178,70,69,66,167,241,14,46,241,1,226,136,152,179,197,59,184,148,254,49,132,48,15,176,137,192,76,131,196,105,104,162,86,81,160,165,255,26,173,162,137, + 86,145,210,183,192,55,175,194,211,60,91,120,230,184,174,27,41,131,155,40,224,29,87,179,232,16,55,55,7,165,147,81,23,165,49,101,54,224,75,180,81,108,18,29,226,69,225,110,175,224, + 42,212,25,47,130,193,110,234,192,215,252,56,74,162,24,46,251,174,54,106,68,245,14,9,155,160,22,120,207,104,240,29,90,178,140,28,24,220,47,166,112,61,251,208,192,111,56,239,238, + 93,255,251,62,99,32,193,75,61,190,235,123,229,110,218,194,85,79,225,59,98,20,238,227,235,220,11,221,149,25,180,116,194,159,111,96,192,24,213,59,139,179,156,215,69,230,19,24,35, + 135,117,206,171,206,162,67,129,234,61,235,11,104,103,84,64,223,167,254,40,163,101,92,84,43,150,46,249,219,205,7,116,11,91,104,61,57,75,223,8,48,25,28,119,252,222,113,49,86,249, + 74,180,211,156,181,61,215,168,157,7,251,199,150,242,250,91,58,132,94,121,7,53,151,139,98,6,165,153,69,214,32,110,211,100,101,31,89,45,81,98,23,205,205,197,209,109,186,198,35, + 141,191,249,25,60,132,223,153,251,98,20,239,146,139,20,217,250,41,250,137,58,177,90,57,79,51,108,233,20,253,194,187,49,222,205,114,141,96,48,175,219,107,54,111,138,22,154,103, + 108,79,58,252,179,178,79,164,195,2,153,36,39,170,199,201,167,197,85,106,8,59,177,81,46,56,2,230,75,114,17,55,112,188,65,208,137,77,114,10,115,55,58,208,197,173,122,87,6,140, + 110,42,208,124,163,70,108,241,104,18,245,98,214,187,134,53,42,221,22,182,133,211,116,148,177,194,209,192,85,90,199,58,55,203,2,229,19,137,187,161,228,154,112,203,145,125,244, + 188,220,118,228,41,201,181,41,195,144,215,183,51,80,250,21,217,16,217,200,235,109,227,188,122,218,142,60,170,224,112,240,184,130,229,224,113,5,223,148,163,80,165,183,130,187, + 132,116,64,238,161,85,220,115,139,205,98,227,244,29,102,125,7,37,243,123,223,11,26,92,63,243,116,61,191,138,123,244,160,84,186,74,31,5,174,247,119,135,199,248,253,135,242,97, + 102,145,190,144,14,85,238,221,231,193,158,48,205,25,120,248,15,220,29,158,9,70,185,30,103,229,33,254,23,237,160,172,62,193,90,222,224,232,14,200,56,90,104,142,227,120,110,6, + 21,211,203,65,150,99,151,220,247,87,164,50,159,49,239,234,58,142,0,109,108,123,18,79,227,36,100,248,222,205,96,127,120,26,171,228,69,63,36,17,252,200,17,116,242,187,227,88,143, + 247,2,75,191,6,130,59,188,11,55,240,31,243,122,152,226,183,207,154,73,188,39,219,43,105,222,87,41,143,141,140,175,73,112,184,252,61,184,16,90,250,35,168,82,119,176,57,116,94, + 200,150,22,190,179,44,104,12,235,84,149,102,252,89,154,193,99,228,106,242,125,248,64,194,255,223,127,242,83,11,255,2,70,214,226,128,0,0 + }; +#endif // PATCH_GT911 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index 77d870fd4c..736809323b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -1073,37 +1073,48 @@ void CLCD::init() { for (counter = 0; counter < 250; counter++) { uint8_t device_id = mem_read_8(REG::ID); // Read Device ID, Should Be 0x7C; if (device_id == 0x7C) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("FTDI chip initialized"); - #endif + if (ENABLED(TOUCH_UI_DEBUG)) SERIAL_ECHO_MSG("FTDI chip initialized "); break; } else delay(1); - if (counter == 249) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("Timeout waiting for device ID, should be 124, got ", device_id); - #endif - } + if (TERN0(TOUCH_UI_DEBUG, counter > 248)) + SERIAL_ECHO_MSG("Timeout waiting for device ID, should be 124, got ", device_id); } - /* make sure that all units are in working conditions, usually the touch-controller needs a little more time */ + /* Ensure all units are in working condition, usually the touch-controller needs a little more time */ for (counter = 0; counter < 100; counter++) { uint8_t reset_status = mem_read_8(REG::CPURESET) & 0x03; if (reset_status == 0x00) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("FTDI chip all units running "); - #endif + if (ENABLED(TOUCH_UI_DEBUG)) SERIAL_ECHO_MSG("FTDI chip all units running "); break; } else delay(1); - if (ENABLED(TOUCH_UI_DEBUG) && counter == 99) + if (TERN0(TOUCH_UI_DEBUG, counter > 98)) SERIAL_ECHO_MSG("Timeout waiting for reset status. Should be 0x00, got ", reset_status); } + #if ENABLED(USE_GT911) /* switch BT815 to use Goodix GT911 touch controller */ + mem_write_32(REG::TOUCH_CONFIG, 0x000005D1); + #endif + + #if ENABLED(PATCH_GT911) /* patch FT813 use Goodix GT911 touch controller */ + mem_write_pgm(REG::CMDB_WRITE, GT911_data, sizeof(GT911_data)); /* write binary blob to command-fifo */ + delay(10); + mem_write_8(REG::TOUCH_OVERSAMPLE, 0x0F); /* setup oversample to 0x0f as "hidden" in binary-blob for AN_336 */ + mem_write_16(REG::TOUCH_CONFIG, 0x05d0); /* write magic cookie as requested by AN_336 */ + + /* specific to the EVE2 modules from Matrix-Orbital we have to use GPIO3 to reset GT911 */ + mem_write_16(REG::GPIOX_DIR,0x8008); /* Reset-Value is 0x8000, adding 0x08 sets GPIO3 to output, default-value for REG_GPIOX is 0x8000 -> Low output on GPIO3 */ + delay(1); /* wait more than 100µs */ + mem_write_8(REG::CPURESET, 0x00); /* clear all resets */ + delay(56); /* wait more than 55ms */ + mem_write_16(REG::GPIOX_DIR,0x8000); /* setting GPIO3 back to input */ + #endif + mem_write_8(REG::PWM_DUTY, 0); // turn off Backlight, Frequency already is set to 250Hz default /* Configure the FT8xx Registers */ @@ -1140,13 +1151,13 @@ void CLCD::init() { if (GPIO_1_Audio_Shutdown) { mem_write_8(REG::GPIO_DIR, GPIO_DISP | GPIO_GP1); mem_write_8(REG::GPIO, GPIO_DISP | GPIO_GP1); - } else if (GPIO_0_Audio_Enable) { + } + else if (GPIO_0_Audio_Enable) { mem_write_8(REG::GPIO_DIR, GPIO_DISP | GPIO_GP0); mem_write_8(REG::GPIO, GPIO_DISP | GPIO_GP0); } - else { + else mem_write_8(REG::GPIO, GPIO_DISP); /* REG::GPIO_DIR is set to output for GPIO_DISP by default */ - } mem_write_8(REG::PCLK, Pclk); // Turns on Clock by setting PCLK Register to the value necessary for the module diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h index 5b29816429..0c600fa0a5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h @@ -43,7 +43,7 @@ constexpr uint16_t Vsync0 = tvfp - 1; \ constexpr uint16_t Vsync1 = tvfp + tvpw - 1; \ static_assert(thfp + thb + Hsize == th, "Mismatch in display th"); \ - static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv"); + static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv") #if ENABLED(TOUCH_UI_320x240) namespace FTDI { @@ -85,7 +85,7 @@ constexpr uint16_t tvb = 2; // VS Back porch (blanking) constexpr uint16_t tvpw = 10; // VS pulse width - COMPUTE_REGS_FROM_DATASHEET + COMPUTE_REGS_FROM_DATASHEET; constexpr uint32_t default_transform_a = 0x00008100; constexpr uint32_t default_transform_b = 0x00000000; @@ -97,29 +97,44 @@ #elif defined(TOUCH_UI_800x480) namespace FTDI { - constexpr uint8_t Pclk = 3; - constexpr uint8_t Pclkpol = 1; - constexpr uint16_t Hsize = 800; - constexpr uint16_t Vsize = 480; + #if defined(TOUCH_UI_800x480_GENERIC) + constexpr uint8_t Pclk = 2; + constexpr uint16_t Hsize = 800; + constexpr uint16_t Vsize = 480; - constexpr uint16_t th = 1056; // One horizontal line - constexpr uint16_t thfp = 210; // HS Front porch - constexpr uint16_t thb = 46; // HS Back porch (blanking) - constexpr uint16_t thpw = 23; // HS pulse width + constexpr uint16_t Vsync0 = 0; + constexpr uint16_t Vsync1 = 3; + constexpr uint16_t Voffset = 32; + constexpr uint16_t Vcycle = 525; + constexpr uint16_t Hsync0 = 0; + constexpr uint16_t Hsync1 = 48; + constexpr uint16_t Hoffset = 88; + constexpr uint16_t Hcycle = 928; + #else + constexpr uint8_t Pclk = 3; + constexpr uint8_t Pclkpol = 1; + constexpr uint16_t Hsize = 800; + constexpr uint16_t Vsize = 480; - constexpr uint16_t tv = 525; // Vertical period time - constexpr uint16_t tvfp = 22; // VS Front porch - constexpr uint16_t tvb = 23; // VS Back porch (blanking) - constexpr uint16_t tvpw = 10; // VS pulse width + constexpr uint16_t th = 1056; // One horizontal line + constexpr uint16_t thfp = 210; // HS Front porch + constexpr uint16_t thb = 46; // HS Back porch (blanking) + constexpr uint16_t thpw = 23; // HS pulse width - COMPUTE_REGS_FROM_DATASHEET + constexpr uint16_t tv = 525; // Vertical period time + constexpr uint16_t tvfp = 22; // VS Front porch + constexpr uint16_t tvb = 23; // VS Back porch (blanking) + constexpr uint16_t tvpw = 10; // VS pulse width - constexpr uint32_t default_transform_a = 0x0000D8B9; - constexpr uint32_t default_transform_b = 0x00000124; - constexpr uint32_t default_transform_c = 0xFFE23926; - constexpr uint32_t default_transform_d = 0xFFFFFF51; - constexpr uint32_t default_transform_e = 0xFFFF7E4F; - constexpr uint32_t default_transform_f = 0x01F0AF70; + COMPUTE_REGS_FROM_DATASHEET; + + constexpr uint32_t default_transform_a = 0x0000D8B9; + constexpr uint32_t default_transform_b = 0x00000124; + constexpr uint32_t default_transform_c = 0xFFE23926; + constexpr uint32_t default_transform_d = 0xFFFFFF51; + constexpr uint32_t default_transform_e = 0xFFFF7E4F; + constexpr uint32_t default_transform_f = 0x01F0AF70; + #endif } #else From 334bafc9c1507cfd7120eebdf6fd243f89242606 Mon Sep 17 00:00:00 2001 From: ldursw <37294448+ldursw@users.noreply.github.com> Date: Sun, 28 Feb 2021 01:32:34 -0300 Subject: [PATCH 1079/1370] ST STM32 platform version 12 (#21219) --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index a63ee9f96a..12f709bc70 100644 --- a/platformio.ini +++ b/platformio.ini @@ -734,7 +734,7 @@ board = nxp_lpc1769 # HAL/STM32 Base Environment values # [common_stm32] -platform = ststm32@~11.0 +platform = ststm32@~12.0 build_flags = ${common.build_flags} -std=gnu++14 -DUSBCON -DUSBD_USE_CDC @@ -747,7 +747,7 @@ src_filter = ${common.default_src_filter} + + Date: Sat, 27 Feb 2021 16:26:49 -0600 Subject: [PATCH 1080/1370] whitespace --- Marlin/src/HAL/STM32/HAL.cpp | 2 +- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 4 ++-- platformio.ini | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index 4b530cc738..d13be1a21a 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -63,7 +63,7 @@ TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); void HAL_init() { FastIO_init(); - // Ensure F_CPU is a constant expression. + // Ensure F_CPU is a constant expression. // If the compiler breaks here, it means that delay code that should compute at compile time will not work. // So better safe than sorry here. constexpr int cpuFreq = F_CPU; diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index ed863a917a..5c2bde7700 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -28,8 +28,8 @@ def add_cpu_freq(): if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' -# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns -# to CPU cycles, this adds overhead preventing small delay (in the order of less than +# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns +# to CPU cycles, this adds overhead preventing small delay (in the order of less than # 30 cycles) to be generated correctly. By using a compile time constant instead # the compiler will perform the computation and this overhead will be avoided add_cpu_freq() diff --git a/platformio.ini b/platformio.ini index 12f709bc70..2c011a9e87 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1344,7 +1344,7 @@ build_flags = ${common_stm32.build_flags} extends = env:BIGTREE_GTR_V1_0 platform_packages = ${stm32_flash_drive.platform_packages} build_unflags = -DUSBCON -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} +build_flags = ${stm32_flash_drive.build_flags} -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 # From 3f34916c57988429c503b7b17e59c147968ca7e6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 27 Feb 2021 22:38:57 -0600 Subject: [PATCH 1081/1370] Tweaks to build scripts --- Marlin/src/HAL/LPC1768/upload_extra_script.py | 7 ++----- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py | 2 +- .../share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py | 3 +++ .../share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py | 3 +++ buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py | 3 +++ .../scripts/{creality.py => STM32F103RET6_creality.py} | 3 +++ .../share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py | 3 +++ buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py | 4 ++++ .../share/PlatformIO/scripts/STM32F1_create_variant.py | 3 +++ .../scripts/{STEVAL__F401XX.py => STM32F401VE_STEVAL.py} | 4 ++++ buildroot/share/PlatformIO/scripts/add_nanolib.py | 3 +++ buildroot/share/PlatformIO/scripts/chitu_crypt.py | 9 +++++---- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 4 ++-- .../share/PlatformIO/scripts/common-dependencies.py | 4 +--- .../scripts/copy_marlin_variant_to_framework.py | 3 +++ .../share/PlatformIO/scripts/download_mks_assets.py | 9 ++++----- .../share/PlatformIO/scripts/fix_framework_weakness.py | 3 +++ buildroot/share/PlatformIO/scripts/fly_mini.py | 4 ++++ buildroot/share/PlatformIO/scripts/lerdge.py | 4 ++++ buildroot/share/PlatformIO/scripts/preflight-checks.py | 3 +-- buildroot/share/PlatformIO/scripts/random-bin.py | 4 ++++ buildroot/share/PlatformIO/scripts/stm32_bootloader.py | 3 +++ buildroot/share/scripts/config-labels.py | 3 +-- buildroot/share/scripts/createTemperatureLookupMarlin.py | 3 +-- buildroot/share/vscode/auto_build.py | 3 +-- .../share/vscode/create_custom_upload_command_CDC.py | 6 ++---- .../share/vscode/create_custom_upload_command_DFU.py | 3 +-- platformio.ini | 8 +++++--- 28 files changed, 77 insertions(+), 37 deletions(-) rename buildroot/share/PlatformIO/scripts/{creality.py => STM32F103RET6_creality.py} (94%) rename buildroot/share/PlatformIO/scripts/{STEVAL__F401XX.py => STM32F401VE_STEVAL.py} (81%) diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py index 1daaa883ed..5967a9970f 100755 --- a/Marlin/src/HAL/LPC1768/upload_extra_script.py +++ b/Marlin/src/HAL/LPC1768/upload_extra_script.py @@ -8,9 +8,7 @@ from __future__ import print_function target_filename = "FIRMWARE.CUR" target_drive = "REARM" -import os -import getpass -import platform +import os,getpass,platform current_OS = platform.system() Import("env") @@ -33,9 +31,8 @@ try: # # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' # Windows - doesn't care about the disk's name, only cares about the drive letter - import subprocess + import subprocess,string from ctypes import windll - import string # getting list of drives # https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py index c6eba3946c..aa702ca4b4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py @@ -16,7 +16,7 @@ # location: . from __future__ import print_function -import argparse, re, sys +import argparse,re,sys usage = ''' This program extracts line segments from a SVG file and writes diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py index 547d80ace5..6d7f21942e 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py @@ -1,3 +1,6 @@ +# +# STM32F103RC_MEEB_3DP.py +# try: import configparser except ImportError: diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py index 497a035fdf..7e9dc676b6 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py @@ -1,3 +1,6 @@ +# +# STM32F103RC_SKR_MINI.py +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py index b69f62578b..1a7cc34edb 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py @@ -1,3 +1,6 @@ +# +# STM32F103RC_fysetc.py +# import os from os.path import join from os.path import expandvars diff --git a/buildroot/share/PlatformIO/scripts/creality.py b/buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py similarity index 94% rename from buildroot/share/PlatformIO/scripts/creality.py rename to buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py index b9d7d7039b..e3ef98b03f 100644 --- a/buildroot/share/PlatformIO/scripts/creality.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py @@ -1,3 +1,6 @@ +# +# STM32F103RET6_creality.py +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py b/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py index ecdd57f594..06e586f7f8 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py @@ -1,3 +1,6 @@ +# +# STM32F103RE_SKR_E3_DIP.py +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py index ece47ed096..bbdfcd93b7 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py @@ -1,3 +1,7 @@ +# +# STM32F103VE_longer.py +# Customizations for env:STM32F103VE_longer +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py index 4849f59ceb..0ba5d71f26 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py @@ -1,3 +1,6 @@ +# +# STM32F1_create_variant.py +# import os,shutil from SCons.Script import DefaultEnvironment from platformio import util diff --git a/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py b/buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py similarity index 81% rename from buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py rename to buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py index 580529c9c1..ffd5bcd42d 100644 --- a/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py +++ b/buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py @@ -1,3 +1,7 @@ +# +# STM32F401VE_STEVAL.py +# Customizations for env:STM32F401VE_STEVAL +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/add_nanolib.py b/buildroot/share/PlatformIO/scripts/add_nanolib.py index 102b4b9bb0..3b74b0d271 100644 --- a/buildroot/share/PlatformIO/scripts/add_nanolib.py +++ b/buildroot/share/PlatformIO/scripts/add_nanolib.py @@ -1,2 +1,5 @@ +# +# add_nanolib.py +# Import("env") env.Append(LINKFLAGS=["--specs=nano.specs"]) diff --git a/buildroot/share/PlatformIO/scripts/chitu_crypt.py b/buildroot/share/PlatformIO/scripts/chitu_crypt.py index aa675878e7..3d4854b51f 100644 --- a/buildroot/share/PlatformIO/scripts/chitu_crypt.py +++ b/buildroot/share/PlatformIO/scripts/chitu_crypt.py @@ -1,8 +1,9 @@ +# +# chitu_crypt.py +# Customizations for Chitu boards +# Import("env") -import os -import random -import struct -import uuid +import os,random,struct,uuid # Relocate firmware from 0x08000000 to 0x08008800 env['CPPDEFINES'].remove(("VECT_TAB_ADDR", "0x8000000")) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 5c2bde7700..ed863a917a 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -28,8 +28,8 @@ def add_cpu_freq(): if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' -# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns -# to CPU cycles, this adds overhead preventing small delay (in the order of less than +# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns +# to CPU cycles, this adds overhead preventing small delay (in the order of less than # 30 cycles) to be generated correctly. By using a compile time constant instead # the compiler will perform the computation and this overhead will be avoided add_cpu_freq() diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 30e168d83f..3844d8298a 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -2,9 +2,7 @@ # common-dependencies.py # Convenience script to check dependencies and add libs and sources for Marlin Enabled Features # -import subprocess -import os -import re +import subprocess,os,re try: import configparser except ImportError: diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index f7d3f0d03a..7ea7ac57f3 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -1,3 +1,6 @@ +# +# copy_marlin_variant_to_framework.py +# import os,shutil from SCons.Script import DefaultEnvironment from platformio import util diff --git a/buildroot/share/PlatformIO/scripts/download_mks_assets.py b/buildroot/share/PlatformIO/scripts/download_mks_assets.py index ae2ce467e8..33acab9e12 100644 --- a/buildroot/share/PlatformIO/scripts/download_mks_assets.py +++ b/buildroot/share/PlatformIO/scripts/download_mks_assets.py @@ -1,9 +1,8 @@ +# +# download_mks_assets.py +# Import("env") -import os -import requests -import zipfile -import tempfile -import shutil +import os,requests,zipfile,tempfile,shutil url = "https://github.com/makerbase-mks/Mks-Robin-Nano-Marlin2.0-Firmware/archive/master.zip" zip_path = os.path.join(env.Dictionary("PROJECT_LIBDEPS_DIR"), "mks-assets.zip") diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py index 4944c0003b..c7bc45aba9 100644 --- a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -1,3 +1,6 @@ +# +# fix_framework_weakness.py +# from os.path import join, isfile import shutil from pprint import pprint diff --git a/buildroot/share/PlatformIO/scripts/fly_mini.py b/buildroot/share/PlatformIO/scripts/fly_mini.py index 34d132958d..9c5df359ad 100644 --- a/buildroot/share/PlatformIO/scripts/fly_mini.py +++ b/buildroot/share/PlatformIO/scripts/fly_mini.py @@ -1,3 +1,7 @@ +# +# fly_mini.py +# Customizations for env:FLY_MINI +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/lerdge.py b/buildroot/share/PlatformIO/scripts/lerdge.py index fd934a1278..ff4f5e446b 100644 --- a/buildroot/share/PlatformIO/scripts/lerdge.py +++ b/buildroot/share/PlatformIO/scripts/lerdge.py @@ -1,3 +1,7 @@ +# +# lerdge.py +# Customizations for Lerdge build environments +# import os,sys Import("env") diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index c20e5cb7a8..c9bbb42ab9 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -2,8 +2,7 @@ # preflight-checks.py # Check for common issues prior to compiling # -import os -import re +import os,re Import("env") def get_envs_for_board(board): diff --git a/buildroot/share/PlatformIO/scripts/random-bin.py b/buildroot/share/PlatformIO/scripts/random-bin.py index 4d7ca5dc09..c03b863448 100644 --- a/buildroot/share/PlatformIO/scripts/random-bin.py +++ b/buildroot/share/PlatformIO/scripts/random-bin.py @@ -1,3 +1,7 @@ +# +# random-bin.py +# Set a unique firmware name based on current date and time +# Import("env") from datetime import datetime diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py index 7f49ea0e66..bbec61750c 100644 --- a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py +++ b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py @@ -1,3 +1,6 @@ +# +# stm32_bootloader.py +# import os,sys,shutil Import("env") diff --git a/buildroot/share/scripts/config-labels.py b/buildroot/share/scripts/config-labels.py index 267aa2d273..700604e452 100755 --- a/buildroot/share/scripts/config-labels.py +++ b/buildroot/share/scripts/config-labels.py @@ -22,8 +22,7 @@ # 2020-06-05 SRL style tweaks #----------------------------------- # -import sys -import os +import sys,os from pathlib import Path from distutils.dir_util import copy_tree # for copy_tree, because shutil.copytree can't handle existing files, dirs diff --git a/buildroot/share/scripts/createTemperatureLookupMarlin.py b/buildroot/share/scripts/createTemperatureLookupMarlin.py index b2d8964f55..b3343de1a0 100755 --- a/buildroot/share/scripts/createTemperatureLookupMarlin.py +++ b/buildroot/share/scripts/createTemperatureLookupMarlin.py @@ -22,8 +22,7 @@ from __future__ import print_function from __future__ import division from math import * -import sys -import getopt +import sys,getopt "Constants" ZERO = 273.15 # zero point of Kelvin scale diff --git a/buildroot/share/vscode/auto_build.py b/buildroot/share/vscode/auto_build.py index 61cacca4d7..ac8432729f 100644 --- a/buildroot/share/vscode/auto_build.py +++ b/buildroot/share/vscode/auto_build.py @@ -72,8 +72,7 @@ from __future__ import print_function from __future__ import division -import sys -import os +import sys,os pwd = os.getcwd() # make sure we're executing from the correct directory level pwd = pwd.replace('\\', '/') diff --git a/buildroot/share/vscode/create_custom_upload_command_CDC.py b/buildroot/share/vscode/create_custom_upload_command_CDC.py index 65edbd15b8..4662dd26cb 100644 --- a/buildroot/share/vscode/create_custom_upload_command_CDC.py +++ b/buildroot/share/vscode/create_custom_upload_command_CDC.py @@ -13,11 +13,9 @@ from __future__ import print_function from __future__ import division -import subprocess -import os -import sys +import subprocess,os,sys,platform from SCons.Script import DefaultEnvironment -import platform + current_OS = platform.system() env = DefaultEnvironment() diff --git a/buildroot/share/vscode/create_custom_upload_command_DFU.py b/buildroot/share/vscode/create_custom_upload_command_DFU.py index 9082699bf4..562e284e63 100644 --- a/buildroot/share/vscode/create_custom_upload_command_DFU.py +++ b/buildroot/share/vscode/create_custom_upload_command_DFU.py @@ -9,8 +9,7 @@ # Will continue on if a COM port isn't found so that the compilation can be done. # -import os -import sys +import os,sys from SCons.Script import DefaultEnvironment import platform current_OS = platform.system() diff --git a/platformio.ini b/platformio.ini index 2c011a9e87..7ddd832f8e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1155,7 +1155,7 @@ extends = env:STM32F103RE build_flags = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4 extra_scripts = ${env:STM32F103RE.extra_scripts} pre:buildroot/share/PlatformIO/scripts/random-bin.py - buildroot/share/PlatformIO/scripts/creality.py + buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py debug_tool = jlink upload_protocol = jlink @@ -1194,7 +1194,7 @@ build_flags = ${common_stm32.build_flags} -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py + buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py # # STM32F401RC @@ -1569,7 +1569,9 @@ board_build.ldscript = ldscript.ld board_build.offset = 0x10000 build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py ################################# # # From 4343de3ee2cfae6d885746716ca4f200794c474f Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sun, 28 Feb 2021 05:41:16 +0100 Subject: [PATCH 1082/1370] [SAMD51] Respect serial buffer size (#21194) --- .../scripts/SAMD51_grandcentral_m4.py | 18 ++++++++++++++++++ platformio.ini | 2 ++ 2 files changed, 20 insertions(+) create mode 100644 buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py diff --git a/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py new file mode 100644 index 0000000000..05dc444bda --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py @@ -0,0 +1,18 @@ +# +# SAMD51_grandcentral_m4.py +# Customizations for env:SAMD51_grandcentral_m4 +# +from os.path import join, isfile +import shutil +from pprint import pprint + +Import("env") + +rxBuf = env["MARLIN_FEATURES"]["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +txBuf = env["MARLIN_FEATURES"]["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" + +serialBuf = str(max(int(rxBuf), int(txBuf), 350)) + +build_flags = env.get('BUILD_FLAGS') +build_flags.append("-DSERIAL_BUFFER_SIZE=" + serialBuf) +env.Replace(BUILD_FLAGS=build_flags) diff --git a/platformio.ini b/platformio.ini index 7ddd832f8e..157b3d6201 100644 --- a/platformio.ini +++ b/platformio.ini @@ -681,6 +681,8 @@ src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} SoftwareSerialM Adafruit SPIFlash +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py custom_marlin.SDSUPPORT = SdFat - Adafruit Fork debug_tool = jlink From 0a097b7a1e709bdae6d56203adb70edb26862c39 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 27 Feb 2021 23:51:56 -0600 Subject: [PATCH 1083/1370] Tweaks to build scripts --- .../share/PlatformIO/scripts/SAMD51_grandcentral_m4.py | 5 +++-- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 4 ++-- .../share/PlatformIO/scripts/fix_framework_weakness.py | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py index 05dc444bda..9e37024d11 100644 --- a/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py +++ b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py @@ -8,8 +8,9 @@ from pprint import pprint Import("env") -rxBuf = env["MARLIN_FEATURES"]["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" -txBuf = env["MARLIN_FEATURES"]["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +mf = env["MARLIN_FEATURES"] +rxBuf = mf["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in mf else "0" +txBuf = mf["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in mf else "0" serialBuf = str(max(int(rxBuf), int(txBuf), 350)) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index ed863a917a..5c2bde7700 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -28,8 +28,8 @@ def add_cpu_freq(): if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' -# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns -# to CPU cycles, this adds overhead preventing small delay (in the order of less than +# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns +# to CPU cycles, this adds overhead preventing small delay (in the order of less than # 30 cycles) to be generated correctly. By using a compile time constant instead # the compiler will perform the computation and this overhead will be avoided add_cpu_freq() diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py index c7bc45aba9..29705de442 100644 --- a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -31,11 +31,11 @@ if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"): print("Libmaple modified and ready for post mortem debugging") -rxBuf = env["MARLIN_FEATURES"]["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" -txBuf = env["MARLIN_FEATURES"]["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +mf = env["MARLIN_FEATURES"] +rxBuf = mf["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in mf else "0" +txBuf = mf["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in mf else "0" if int(rxBuf) < 64: rxBuf = "64" - if int(txBuf) < 64: txBuf = "64" From e4a67c849643aff28ad14dc61a5e8bf69ca42701 Mon Sep 17 00:00:00 2001 From: Fabio Viappiani Date: Sun, 28 Feb 2021 23:09:15 +0100 Subject: [PATCH 1084/1370] Fix TERN typo (#21229) --- Marlin/src/feature/leds/neopixel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 6f5ea0540a..bdd22837ad 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -60,7 +60,7 @@ void Marlin_NeoPixel::set_color(const uint32_t color) { else { for (uint16_t i = 0; i < pixels(); ++i) { #ifdef NEOPIXEL_BKGD_LED_INDEX - if (i == NEOPIXEL_BKGD_LED_INDEX && TERN(ENABLED(NEOPIXEL_BKGD_ALWAYS_ON), true, color != 0x000000)) { + if (i == NEOPIXEL_BKGD_LED_INDEX && TERN(NEOPIXEL_BKGD_ALWAYS_ON, true, color != 0x000000)) { set_color_background(); continue; } From 043bd34e2bcb5e2dbac750d6dc07e6cff3889ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Morav=C4=8D=C3=ADk?= Date: Sun, 28 Feb 2021 23:12:27 +0100 Subject: [PATCH 1085/1370] Update Slovak language (#21224) --- Marlin/src/lcd/language/language_sk.h | 29 +++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 1900f53719..a9df28382e 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -30,6 +30,13 @@ * * Translated by Michal HoleÅ¡, Farma MaM * https://www.facebook.com/farmamam + * + * Substitutions are applied for the following characters when used + * in menu items that call lcd_put_u8str_ind_P with an index: + * + * = displays '0'....'10' for indexes 0 - 10 + * ~ displays '1'....'11' for indexes 0 - 10 + * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) */ #define DISPLAY_CHARSET_ISO10646_SK @@ -37,7 +44,7 @@ namespace Language_sk { using namespace Language_en; // Inherit undefined strings from English constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Slovak"); + PROGMEM Language_Str LANGUAGE = _UxGT("SlovenÄina"); PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pripravená."); PROGMEM Language_Str MSG_YES = _UxGT("ÃNO"); @@ -100,12 +107,19 @@ namespace Language_sk { #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Vlastná teplota"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("SchladiÅ¥"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Nastavenie lasera"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon lasera"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Nastavenie vretena"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon lasera"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Výkon vretena"); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Prepnúť laser"); + PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Test. impulz ms"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("VystreliÅ¥ impulz"); + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Prepnúť vreteno"); + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Dopredný chod"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spätný chod"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnúť napájanie"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Vypnúť napájanie"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("VytlaÄiÅ¥ (extr.)"); @@ -114,6 +128,10 @@ namespace Language_sk { PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Vyrovnanie podložky"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("VyrovnaÅ¥ podložku"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("VyrovnaÅ¥ rohy"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Zdvyhnite podl., kým sa nezopne sonda"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Rohy sú vrámci odchyl. Vyrovnajte podl."); + PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Dobré body: "); + PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Posl. Z: "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("ÄŽalší roh"); PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor sieÅ¥e bodov"); PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("UpraviÅ¥ sieÅ¥ bodov"); @@ -247,6 +265,9 @@ namespace Language_sk { PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunúť o 0,1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunúť o 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunúť o 10mm"); + PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Posunúť o 0,001in"); + PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Posunúť o 0,01in"); + PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Posunúť o 0,1in"); PROGMEM Language_Str MSG_SPEED = _UxGT("RýchlosÅ¥"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); @@ -355,11 +376,13 @@ namespace Language_sk { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Hotovo"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Naspäť"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("PokraÄovaÅ¥"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("PreskoÄiÅ¥"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Pozastavujem..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("PozastaviÅ¥ tlaÄ"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("ObnoviÅ¥ tlaÄ"); PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("SpustiÅ¥ z hosta"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("ZastaviÅ¥ tlaÄ"); + PROGMEM Language_Str MSG_END_LOOPS = _UxGT("Koniec opak. sluÄ."); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("TlaÄím objekt"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("ZruÅ¡iÅ¥ objekt"); PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("ZruÅ¡iÅ¥ objekt ="); @@ -649,6 +672,8 @@ namespace Language_sk { PROGMEM Language_Str MSG_REHEATING = _UxGT("Zohrievanie..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Sprievodca sondy Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Referencia Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Presúvam na pozíciu"); PROGMEM Language_Str MSG_SOUND = _UxGT("Zvuk"); From fbb30a25701e800deee1ca8296225712bca615af Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 28 Feb 2021 19:43:46 -0600 Subject: [PATCH 1086/1370] Serial macros cleanup --- Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp | 7 +++---- Marlin/src/HAL/shared/Delay.cpp | 11 ++++------- Marlin/src/MarlinCore.cpp | 5 ++--- Marlin/src/core/debug_out.h | 4 ++-- Marlin/src/core/debug_section.h | 4 ++-- Marlin/src/core/utility.cpp | 6 +++--- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 4 ++-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 6 +++--- Marlin/src/feature/host_actions.cpp | 9 ++++----- Marlin/src/feature/max7219.cpp | 2 +- Marlin/src/feature/meatpack.cpp | 2 +- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/feature/probe_temp_comp.cpp | 2 +- Marlin/src/feature/runout.h | 8 +++----- Marlin/src/feature/tmc_util.cpp | 6 +++--- Marlin/src/feature/twibus.cpp | 4 ++-- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/gcode/calibrate/G33.cpp | 6 +++--- Marlin/src/gcode/calibrate/M852.cpp | 2 +- Marlin/src/gcode/config/M217.cpp | 2 +- Marlin/src/gcode/config/M302.cpp | 2 +- Marlin/src/gcode/config/M43.cpp | 2 +- Marlin/src/gcode/control/M111.cpp | 2 +- Marlin/src/gcode/control/M80_M81.cpp | 2 +- Marlin/src/gcode/feature/L6470/M122.cpp | 12 ++++++------ Marlin/src/gcode/feature/L6470/M906.cpp | 2 +- Marlin/src/gcode/feature/powerloss/M1000.cpp | 2 +- Marlin/src/gcode/feature/powerloss/M413.cpp | 4 ++-- Marlin/src/gcode/feature/trinamic/M569.cpp | 3 +-- Marlin/src/gcode/geometry/G17-G19.cpp | 2 +- Marlin/src/gcode/host/M115.cpp | 4 ++-- Marlin/src/gcode/host/M360.cpp | 5 ++--- Marlin/src/gcode/queue.cpp | 3 +-- .../src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 8 ++++---- Marlin/src/libs/stopwatch.cpp | 2 +- Marlin/src/libs/vector_3.cpp | 7 ++----- Marlin/src/module/endstops.cpp | 5 ++--- Marlin/src/module/planner.cpp | 2 +- Marlin/src/module/printcounter.cpp | 6 +++--- Marlin/src/module/probe.cpp | 5 ++--- Marlin/src/module/settings.cpp | 12 ++++++------ Marlin/src/module/temperature.cpp | 10 +++++----- Marlin/src/pins/pinsDebug.h | 10 +++++----- Marlin/src/sd/cardreader.cpp | 4 ++-- 48 files changed, 101 insertions(+), 117 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp index b97b161dc9..70395251df 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp @@ -83,14 +83,13 @@ bool PersistentStore::access_finish() { static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) { PGM_P const rw_str = write ? PSTR("write") : PSTR("read"); SERIAL_CHAR(' '); - serialprintPGM(rw_str); + SERIAL_ECHOPGM_P(rw_str); SERIAL_ECHOLNPAIR("_data(", pos, ",", value, ",", size, ", ...)"); if (total) { SERIAL_ECHOPGM(" f_"); - serialprintPGM(rw_str); + SERIAL_ECHOPGM_P(rw_str); SERIAL_ECHOPAIR("()=", s, "\n size=", size, "\n bytes_"); - serialprintPGM(write ? PSTR("written=") : PSTR("read=")); - SERIAL_ECHOLN(total); + SERIAL_ECHOLNPAIR_P(write ? PSTR("written=") : PSTR("read="), total); } else SERIAL_ECHOLNPAIR(" f_lseek()=", s); diff --git a/Marlin/src/HAL/shared/Delay.cpp b/Marlin/src/HAL/shared/Delay.cpp index 8a021a2155..129698fd30 100644 --- a/Marlin/src/HAL/shared/Delay.cpp +++ b/Marlin/src/HAL/shared/Delay.cpp @@ -109,11 +109,11 @@ void dump_delay_accuracy_check() { auto report_call_time = [](PGM_P const name, PGM_P const unit, const uint32_t cycles, const uint32_t total, const bool do_flush=true) { SERIAL_ECHOPGM("Calling "); - serialprintPGM(name); + SERIAL_ECHOPGM_P(name); SERIAL_ECHOLNPAIR(" for ", cycles); - serialprintPGM(unit); + SERIAL_ECHOPGM_P(unit); SERIAL_ECHOLNPAIR(" took: ", total); - serialprintPGM(unit); + SERIAL_ECHOPGM_P(unit); if (do_flush) SERIAL_FLUSHTX(); }; @@ -169,10 +169,7 @@ void calibrate_delay_loop() {} #if ENABLED(MARLIN_DEV_MODE) - void dump_delay_accuracy_check() { - static PGMSTR(none, "N/A on this platform"); - serialprintPGM(none); - } + void dump_delay_accuracy_check() { SERIAL_ECHOPGM_P(PSTR("N/A on this platform")); } #endif #endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 4643328401..751d098606 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -885,8 +885,7 @@ void setup() { auto log_current_ms = [&](PGM_P const msg) { SERIAL_ECHO_START(); SERIAL_CHAR('['); SERIAL_ECHO(millis()); SERIAL_ECHOPGM("] "); - serialprintPGM(msg); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(msg); }; #define SETUP_LOG(M) log_current_ms(PSTR(M)) #else @@ -1003,7 +1002,7 @@ void setup() { if (mcu & RST_SOFTWARE) SERIAL_ECHOLNPGM(STR_SOFTWARE_RESET); HAL_clear_reset_source(); - serialprintPGM(GET_TEXT(MSG_MARLIN)); + SERIAL_ECHOPGM_P(GET_TEXT(MSG_MARLIN)); SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); SERIAL_EOL(); diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index 6ae1b9d8bb..d93decf7ac 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -59,7 +59,7 @@ #include "debug_section.h" #define DEBUG_SECTION(N,S,D) SectionLog N(PSTR(S),D) - #define DEBUG_PRINT_P(P) serialprintPGM(P) + #define DEBUG_ECHOPGM_P(P) SERIAL_ECHOPGM_P(P) #define DEBUG_ECHO_START SERIAL_ECHO_START #define DEBUG_ERROR_START SERIAL_ERROR_START #define DEBUG_CHAR SERIAL_CHAR @@ -89,7 +89,7 @@ #else #define DEBUG_SECTION(...) NOOP - #define DEBUG_PRINT_P(P) NOOP + #define DEBUG_ECHOPGM_P(P) NOOP #define DEBUG_ECHO_START() NOOP #define DEBUG_ERROR_START() NOOP #define DEBUG_CHAR(...) NOOP diff --git a/Marlin/src/core/debug_section.h b/Marlin/src/core/debug_section.h index 7f39bc7424..2862d35af1 100644 --- a/Marlin/src/core/debug_section.h +++ b/Marlin/src/core/debug_section.h @@ -38,10 +38,10 @@ private: bool debug; void echo_msg(PGM_P const pre) { - serialprintPGM(pre); + SERIAL_ECHOPGM_P(pre); if (the_msg) { SERIAL_CHAR(' '); - serialprintPGM(the_msg); + SERIAL_ECHOPGM_P(the_msg); } SERIAL_CHAR(' '); print_xyz(current_position); diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index f999568167..3d7897f95a 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -92,9 +92,9 @@ void safe_delay(millis_t ms) { SERIAL_ECHOPGM(" (Aligned With"); if (probe.offset_xy.y > 0) - serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Distal") : PSTR("-Back")); + SERIAL_ECHOPGM_P(ENABLED(IS_SCARA) ? PSTR("-Distal") : PSTR("-Back")); else if (probe.offset_xy.y < 0) - serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Proximal") : PSTR("-Front")); + SERIAL_ECHOPGM_P(ENABLED(IS_SCARA) ? PSTR("-Proximal") : PSTR("-Front")); else if (probe.offset_xy.x != 0) SERIAL_ECHOPGM("-Center"); @@ -102,7 +102,7 @@ void safe_delay(millis_t ms) { #endif - serialprintPGM(probe.offset.z < 0 ? PSTR("Below") : probe.offset.z > 0 ? PSTR("Above") : PSTR("Same Z as")); + SERIAL_ECHOPGM_P(probe.offset.z < 0 ? PSTR("Below") : probe.offset.z > 0 ? PSTR("Above") : PSTR("Same Z as")); SERIAL_ECHOLNPGM(" Nozzle)"); #endif diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 601f0ebb54..05b96daefa 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -181,7 +181,7 @@ void unified_bed_leveling::display_map(const int map_type) { } else { SERIAL_ECHOPGM(" for "); - serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); + SERIAL_ECHOPGM_P(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); } // Add XY probe offset from extruder because probe.probe_at_point() subtracts them when @@ -212,7 +212,7 @@ void unified_bed_leveling::display_map(const int map_type) { // TODO: Display on Graphical LCD } else if (isnan(f)) - serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); + SERIAL_ECHOPGM_P(human ? PSTR(" . ") : PSTR("NAN")); else if (human || csv) { if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 044f6b610c..8c70feb661 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -908,11 +908,11 @@ void unified_bed_leveling::shift_mesh_height() { if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing if (parser.seen('B')) { - serialprintPGM(GET_TEXT(MSG_UBL_BC_INSERT)); + SERIAL_ECHOPGM_P(GET_TEXT(MSG_UBL_BC_INSERT)); LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); } else { - serialprintPGM(GET_TEXT(MSG_UBL_BC_INSERT2)); + SERIAL_ECHOPGM_P(GET_TEXT(MSG_UBL_BC_INSERT2)); LCD_MESSAGEPGM(MSG_UBL_BC_INSERT2); } @@ -1576,7 +1576,7 @@ void unified_bed_leveling::smart_fill_mesh() { return normal.x * pos.x + normal.y * pos.y + zadd; }; auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { - d_from(); serialprintPGM(pre); + d_from(); SERIAL_ECHOPGM_P(pre); DEBUG_ECHO_F(normed(pos, zadd), 6); DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); }; diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index 77e4f3b9da..2a0b3dc3d5 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -40,7 +40,7 @@ void host_action(PGM_P const pstr, const bool eol) { PORT_REDIRECT(SERIAL_ALL); SERIAL_ECHOPGM("//action:"); - serialprintPGM(pstr); + SERIAL_ECHOPGM_P(pstr); if (eol) SERIAL_EOL(); } @@ -86,14 +86,13 @@ void host_action(PGM_P const pstr, const bool eol) { void host_action_notify_P(PGM_P const message) { PORT_REDIRECT(SERIAL_ALL); host_action(PSTR("notification "), false); - serialprintPGM(message); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(message); } void host_action_prompt(PGM_P const ptype, const bool eol=true) { PORT_REDIRECT(SERIAL_ALL); host_action(PSTR("prompt_"), false); - serialprintPGM(ptype); + SERIAL_ECHOPGM_P(ptype); if (eol) SERIAL_EOL(); } @@ -101,7 +100,7 @@ void host_action(PGM_P const pstr, const bool eol) { host_action_prompt(ptype, false); PORT_REDIRECT(SERIAL_ALL); SERIAL_CHAR(' '); - serialprintPGM(pstr); + SERIAL_ECHOPGM_P(pstr); if (extra_char != '\0') SERIAL_CHAR(extra_char); SERIAL_EOL(); } diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index ebcb56490d..d7433cb7d9 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -127,7 +127,7 @@ uint8_t Max7219::suspended; // = 0; void Max7219::error(const char * const func, const int32_t v1, const int32_t v2/*=-1*/) { #if ENABLED(MAX7219_ERRORS) SERIAL_ECHOPGM("??? Max7219::"); - serialprintPGM(func); + SERIAL_ECHOPGM_P(func); SERIAL_CHAR('('); SERIAL_ECHO(v1); if (v2 > 0) SERIAL_ECHOPAIR(", ", v2); diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index cb3979ea0a..7e81dbed79 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -179,7 +179,7 @@ void MeatPack::report_state() { SERIAL_ECHOPGM("[MP] "); SERIAL_ECHOPGM(MeatPack_ProtocolVersion " "); serialprint_onoff(TEST(state, MPConfig_Bit_Active)); - serialprintPGM(TEST(state, MPConfig_Bit_NoSpaces) ? PSTR(" NSP\n") : PSTR(" ESP\n")); + SERIAL_ECHOPGM_P(TEST(state, MPConfig_Bit_NoSpaces) ? PSTR(" NSP\n") : PSTR(" ESP\n")); } /** diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index e0b4f88f9b..c1f951e764 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -460,7 +460,7 @@ void show_continue_prompt(const bool is_reload) { ui.pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING); SERIAL_ECHO_START(); - serialprintPGM(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); + SERIAL_ECHOPGM_P(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); } void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) { diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 46b94dbc11..1b1f2bd681 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -531,7 +531,7 @@ void PrintJobRecovery::resume() { #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) void PrintJobRecovery::debug(PGM_P const prefix) { - DEBUG_PRINT_P(prefix); + DEBUG_ECHOPGM_P(prefix); DEBUG_ECHOLNPAIR(" Job Recovery Info...\nvalid_head:", info.valid_head, " valid_foot:", info.valid_foot); if (info.valid_head) { if (info.valid_head == info.valid_foot) { diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index af8039d8b1..8fdf160d0f 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -73,7 +73,7 @@ void ProbeTempComp::print_offsets() { LOOP_L_N(s, TSI_COUNT) { float temp = cali_info[s].start_temp; for (int16_t i = -1; i < cali_info[s].measurements; ++i) { - serialprintPGM(s == TSI_BED ? PSTR("Bed") : + SERIAL_ECHOPGM_P(s == TSI_BED ? PSTR("Bed") : #if ENABLED(USE_TEMP_EXT_COMPENSATION) s == TSI_EXT ? PSTR("Extruder") : #endif diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 60154c5e43..ecf47b22c2 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -287,7 +287,7 @@ class FilamentSensorBase { if (out != was_out) { was_out = out; SERIAL_ECHOPGM("Filament "); - serialprintPGM(out ? PSTR("OUT\n") : PSTR("IN\n")); + SERIAL_ECHOPGM_P(out ? PSTR("OUT\n") : PSTR("IN\n")); } #endif } @@ -320,10 +320,8 @@ class FilamentSensorBase { const millis_t ms = millis(); if (ELAPSED(ms, t)) { t = millis() + 1000UL; - LOOP_L_N(i, EXTRUDERS) { - serialprintPGM(i ? PSTR(", ") : PSTR("Remaining mm: ")); - SERIAL_ECHO(runout_mm_countdown[i]); - } + LOOP_L_N(i, EXTRUDERS) + SERIAL_ECHOPAIR_P(i ? PSTR(", ") : PSTR("Remaining mm: "), runout_mm_countdown[i]); SERIAL_EOL(); } #endif diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index a16af31e55..a4f71414a6 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -546,7 +546,7 @@ }; template - static void print_vsense(TMC &st) { serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); } + static void print_vsense(TMC &st) { SERIAL_ECHOPGM_P(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); } #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130) static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { @@ -717,7 +717,7 @@ SERIAL_ECHO(st.cs()); SERIAL_ECHOPGM("/31"); break; - case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break; + case TMC_VSENSE: SERIAL_ECHOPGM_P(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break; case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; //case TMC_OTPW: serialprint_truefalse(st.otpw()); break; //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; @@ -1208,7 +1208,7 @@ static bool test_connection(TMC &st) { case 1: stat = PSTR("HIGH"); break; case 2: stat = PSTR("LOW"); break; } - serialprintPGM(stat); + SERIAL_ECHOPGM_P(stat); SERIAL_EOL(); return test_result; diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp index 855a3188d1..755224544c 100644 --- a/Marlin/src/feature/twibus.cpp +++ b/Marlin/src/feature/twibus.cpp @@ -83,7 +83,7 @@ void TWIBus::send() { // static void TWIBus::echoprefix(uint8_t bytes, const char pref[], uint8_t adr) { SERIAL_ECHO_START(); - serialprintPGM(pref); + SERIAL_ECHOPGM_P(pref); SERIAL_ECHOPAIR(": from:", adr, " bytes:", bytes, " data:"); } @@ -172,7 +172,7 @@ void TWIBus::flush() { // static void TWIBus::prefix(const char func[]) { SERIAL_ECHOPGM("TWIBus::"); - serialprintPGM(func); + SERIAL_ECHOPGM_P(func); SERIAL_ECHOPGM(": "); } void TWIBus::debug(const char func[], uint32_t adr) { diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 5195ff87c0..88f02e6de2 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -114,7 +114,7 @@ void GcodeSuite::G35() { if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("Probing point ", i, " ("); - DEBUG_PRINT_P((char *)pgm_read_ptr(&tramming_point_name[i])); + DEBUG_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i])); DEBUG_CHAR(')'); DEBUG_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y, SP_Z_STR, z_probed_height); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 233e7f7415..e642c1ccf2 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -786,7 +786,7 @@ G29_TYPE GcodeSuite::G29() { float min_diff = 999; auto print_topo_map = [&](PGM_P const title, const bool get_min) { - serialprintPGM(title); + SERIAL_ECHOPGM_P(title); for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) { LOOP_L_N(xx, abl_grid_points.x) { const int ind = indexIntoAB[xx][yy]; diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index a2de1dfe38..430daf6ba2 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -259,7 +259,7 @@ void GcodeSuite::G28() { #if HAS_HOMING_CURRENT auto debug_current = [](PGM_P const s, const int16_t a, const int16_t b){ - serialprintPGM(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b); + DEBUG_ECHOPGM_P(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b); }; #if HAS_CURRENT_HOME(X) const int16_t tmc_save_current_X = stepperX.getMilliamps(); diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 77cc45771c..5530bc7089 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -93,7 +93,7 @@ void ac_cleanup(TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index)) { void print_signed_float(PGM_P const prefix, const float &f) { SERIAL_ECHOPGM(" "); - serialprintPGM(prefix); + SERIAL_ECHOPGM_P(prefix); SERIAL_CHAR(':'); if (f >= 0) SERIAL_CHAR('+'); SERIAL_ECHO_F(f, 2); @@ -449,7 +449,7 @@ void GcodeSuite::G33() { // Report settings PGM_P const checkingac = PSTR("Checking... AC"); - serialprintPGM(checkingac); + SERIAL_ECHOPGM_P(checkingac); if (verbose_level == 0) SERIAL_ECHOPGM(" (DRY-RUN)"); SERIAL_EOL(); ui.set_status_P(checkingac); @@ -625,7 +625,7 @@ void GcodeSuite::G33() { } else { // dry run PGM_P const enddryrun = PSTR("End DRY-RUN"); - serialprintPGM(enddryrun); + SERIAL_ECHOPGM_P(enddryrun); SERIAL_ECHO_SP(35); SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3); diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp index b60f41748f..e52f03b86c 100644 --- a/Marlin/src/gcode/calibrate/M852.cpp +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -93,7 +93,7 @@ void GcodeSuite::M852() { if (!ijk) { SERIAL_ECHO_START(); - serialprintPGM(GET_TEXT(MSG_SKEW_FACTOR)); + SERIAL_ECHOPGM_P(GET_TEXT(MSG_SKEW_FACTOR)); SERIAL_ECHOPAIR_F(" XY: ", planner.skew_factor.xy, 6); #if ENABLED(SKEW_CORRECTION_FOR_Z) SERIAL_ECHOPAIR_F(" XZ: ", planner.skew_factor.xz, 6); diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index ebe1dbc03c..2035ae55ab 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -36,7 +36,7 @@ void M217_report(const bool eeprom=false) { #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - serialprintPGM(eeprom ? PSTR(" M217") : PSTR("Toolchange:")); + SERIAL_ECHOPGM_P(eeprom ? PSTR(" M217") : PSTR("Toolchange:")); SERIAL_ECHOPAIR(" S", LINEAR_UNIT(toolchange_settings.swap_length)); SERIAL_ECHOPAIR_P(SP_B_STR, LINEAR_UNIT(toolchange_settings.extra_resume), SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime), diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp index afdc6c9e85..e3ce5a10ef 100644 --- a/Marlin/src/gcode/config/M302.cpp +++ b/Marlin/src/gcode/config/M302.cpp @@ -55,7 +55,7 @@ void GcodeSuite::M302() { // Report current state SERIAL_ECHO_START(); SERIAL_ECHOPGM("Cold extrudes are "); - serialprintPGM(thermalManager.allow_cold_extrude ? PSTR("en") : PSTR("dis")); + SERIAL_ECHOPGM_P(thermalManager.allow_cold_extrude ? PSTR("en") : PSTR("dis")); SERIAL_ECHOLNPAIR("abled (min temp ", thermalManager.extrude_min_temp, "C)"); } } diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index 42a74fb54f..4009721a57 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -303,7 +303,7 @@ void GcodeSuite::M43() { if (parser.seen('E')) { endstops.monitor_flag = parser.value_bool(); SERIAL_ECHOPGM("endstop monitor "); - serialprintPGM(endstops.monitor_flag ? PSTR("en") : PSTR("dis")); + SERIAL_ECHOPGM_P(endstops.monitor_flag ? PSTR("en") : PSTR("dis")); SERIAL_ECHOLNPGM("abled"); return; } diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp index 38cb065322..8e677080e0 100644 --- a/Marlin/src/gcode/control/M111.cpp +++ b/Marlin/src/gcode/control/M111.cpp @@ -49,7 +49,7 @@ void GcodeSuite::M111() { LOOP_L_N(i, COUNT(debug_strings)) { if (TEST(marlin_debug_flags, i)) { if (comma++) SERIAL_CHAR(','); - serialprintPGM((char*)pgm_read_ptr(&debug_strings[i])); + SERIAL_ECHOPGM_P((char*)pgm_read_ptr(&debug_strings[i])); } } } diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 394b06d8ac..1b5ea2f7ef 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -56,7 +56,7 @@ // S: Report the current power supply state and exit if (parser.seen('S')) { - serialprintPGM(powersupply_on ? PSTR("PS:1\n") : PSTR("PS:0\n")); + SERIAL_ECHOPGM_P(powersupply_on ? PSTR("PS:1\n") : PSTR("PS:0\n")); return; } diff --git a/Marlin/src/gcode/feature/L6470/M122.cpp b/Marlin/src/gcode/feature/L6470/M122.cpp index d2b7f73997..cfac427642 100644 --- a/Marlin/src/gcode/feature/L6470/M122.cpp +++ b/Marlin/src/gcode/feature/L6470/M122.cpp @@ -41,16 +41,16 @@ inline void L6470_say_status(const L64XX_axis_t axis) { SERIAL_ECHO(temp_buf); print_bin(sh.STATUS_AXIS_RAW); switch (sh.STATUS_AXIS_LAYOUT) { - case L6470_STATUS_LAYOUT: serialprintPGM(PSTR(" L6470")); break; - case L6474_STATUS_LAYOUT: serialprintPGM(PSTR(" L6474")); break; - case L6480_STATUS_LAYOUT: serialprintPGM(PSTR(" L6480/powerSTEP01")); break; + case L6470_STATUS_LAYOUT: SERIAL_ECHOPGM(" L6470"); break; + case L6474_STATUS_LAYOUT: SERIAL_ECHOPGM(" L6474"); break; + case L6480_STATUS_LAYOUT: SERIAL_ECHOPGM(" L6480/powerSTEP01"); break; } #endif SERIAL_ECHOPGM("\n...OUTPUT: "); - serialprintPGM(sh.STATUS_AXIS & STATUS_HIZ ? PSTR("OFF") : PSTR("ON ")); + SERIAL_ECHOPGM_P(sh.STATUS_AXIS & STATUS_HIZ ? PSTR("OFF") : PSTR("ON ")); SERIAL_ECHOPGM(" BUSY: "); echo_yes_no((sh.STATUS_AXIS & STATUS_BUSY) == 0); SERIAL_ECHOPGM(" DIR: "); - serialprintPGM((((sh.STATUS_AXIS & STATUS_DIR) >> 4) ^ L64xxManager.index_to_dir[axis]) ? PSTR("FORWARD") : PSTR("REVERSE")); + SERIAL_ECHOPGM_P((((sh.STATUS_AXIS & STATUS_DIR) >> 4) ^ L64xxManager.index_to_dir[axis]) ? PSTR("FORWARD") : PSTR("REVERSE")); if (sh.STATUS_AXIS_LAYOUT == L6480_STATUS_LAYOUT) { SERIAL_ECHOPGM(" Last Command: "); if (sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD) SERIAL_ECHOPGM("VALID"); @@ -67,7 +67,7 @@ inline void L6470_say_status(const L64XX_axis_t axis) { SERIAL_ECHOPGM(" Last Command: "); if (!(sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD)) SERIAL_ECHOPGM("IN"); SERIAL_ECHOPGM("VALID "); - serialprintPGM(sh.STATUS_AXIS & sh.STATUS_AXIS_NOTPERF_CMD ? PSTR("COMPLETED ") : PSTR("Not PERFORMED")); + SERIAL_ECHOPGM_P(sh.STATUS_AXIS & sh.STATUS_AXIS_NOTPERF_CMD ? PSTR("COMPLETED ") : PSTR("Not PERFORMED")); SERIAL_ECHOPAIR("\n...THERMAL: ", !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_SD) ? "SHUTDOWN " : !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_WRN) ? "WARNING " : "OK "); } SERIAL_ECHOPGM(" OVERCURRENT:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_OCD) == 0); diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp index 7bd446a1ab..3638fae45b 100644 --- a/Marlin/src/gcode/feature/L6470/M906.cpp +++ b/Marlin/src/gcode/feature/L6470/M906.cpp @@ -132,7 +132,7 @@ void L64XX_report_current(L64XX &motor, const L64XX_axis_t axis) { SERIAL_ECHOPAIR("...MicroSteps: ", MicroSteps, " ADC_OUT: ", L6470_ADC_out); SERIAL_ECHOPGM(" Vs_compensation: "); - serialprintPGM((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_EN_VSCOMP) ? PSTR("ENABLED ") : PSTR("DISABLED")); + SERIAL_ECHOPGM_P((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_EN_VSCOMP) ? PSTR("ENABLED ") : PSTR("DISABLED")); SERIAL_ECHOLNPAIR(" Compensation coefficient: ~", comp_coef * 0.01f); SERIAL_ECHOPAIR("...KVAL_HOLD: ", motor.GetParam(L6470_KVAL_HOLD), diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index 14c92531fa..a31b7732f4 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -40,7 +40,7 @@ void menu_job_recovery(); inline void plr_error(PGM_P const prefix) { #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) DEBUG_ECHO_START(); - serialprintPGM(prefix); + DEBUG_ECHOPGM_P(prefix); DEBUG_ECHOLNPGM(" Job Recovery Data"); #else UNUSED(prefix); diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp index 64573e5dff..e6e3ac3b3c 100644 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ b/Marlin/src/gcode/feature/powerloss/M413.cpp @@ -54,8 +54,8 @@ void GcodeSuite::M413() { #if PIN_EXISTS(POWER_LOSS) if (parser.seen('O')) recovery._outage(); #endif - if (parser.seen('E')) serialprintPGM(recovery.exists() ? PSTR("PLR Exists\n") : PSTR("No PLR\n")); - if (parser.seen('V')) serialprintPGM(recovery.valid() ? PSTR("Valid\n") : PSTR("Invalid\n")); + if (parser.seen('E')) SERIAL_ECHOPGM_P(recovery.exists() ? PSTR("PLR Exists\n") : PSTR("No PLR\n")); + if (parser.seen('V')) SERIAL_ECHOPGM_P(recovery.valid() ? PSTR("Valid\n") : PSTR("Invalid\n")); #endif } diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp index 6b379f1190..a92812004f 100644 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -32,8 +32,7 @@ template void tmc_say_stealth_status(TMC &st) { st.printLabel(); SERIAL_ECHOPGM(" driver mode:\t"); - serialprintPGM(st.get_stealthChop() ? PSTR("stealthChop") : PSTR("spreadCycle")); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(st.get_stealthChop() ? PSTR("stealthChop") : PSTR("spreadCycle")); } template void tmc_set_stealthChop(TMC &st, const bool enable) { diff --git a/Marlin/src/gcode/geometry/G17-G19.cpp b/Marlin/src/gcode/geometry/G17-G19.cpp index 7510eaba8c..0154598ccb 100644 --- a/Marlin/src/gcode/geometry/G17-G19.cpp +++ b/Marlin/src/gcode/geometry/G17-G19.cpp @@ -29,7 +29,7 @@ inline void report_workspace_plane() { SERIAL_ECHO_START(); SERIAL_ECHOPGM("Workspace Plane "); - serialprintPGM( + SERIAL_ECHOPGM_P( gcode.workspace_plane == GcodeSuite::PLANE_YZ ? PSTR("YZ\n") : gcode.workspace_plane == GcodeSuite::PLANE_ZX ? PSTR("ZX\n") : PSTR("XY\n") diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 40fdbd6d3a..ac712aea07 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -34,8 +34,8 @@ #if ENABLED(EXTENDED_CAPABILITIES_REPORT) static void cap_line(PGM_P const name, bool ena=false) { SERIAL_ECHOPGM("Cap:"); - serialprintPGM(name); - SERIAL_CHAR(':', ena ? '1' : '0'); + SERIAL_ECHOPGM_P(name); + SERIAL_CHAR(':', '0' + ena); SERIAL_EOL(); } #endif diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index b0bd4a3b8e..50a4e45426 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -34,10 +34,9 @@ static void config_prefix(PGM_P const name, PGM_P const pref=nullptr, const int8_t ind=-1) { SERIAL_ECHOPGM("Config:"); - if (pref) serialprintPGM(pref); + if (pref) SERIAL_ECHOPGM_P(pref); if (ind >= 0) { SERIAL_ECHO(ind); SERIAL_CHAR(':'); } - serialprintPGM(name); - SERIAL_CHAR(':'); + SERIAL_ECHOPAIR_P(name, AS_CHAR(':')); } static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr, const int8_t ind=-1) { config_prefix(name, pref, ind); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 7ce8211484..ebf95f86c6 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -304,8 +304,7 @@ inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command SERIAL_ERROR_START(); - SERIAL_ECHOPGM_P(err); - SERIAL_ECHOLN(serial_state[serial_ind].last_N); + SERIAL_ECHOLNPAIR_P(err, serial_state[serial_ind].last_N); while (read_serial(serial_ind) != -1) { /* nada */ } // Clear out the RX buffer. Why don't use flush here ? flush_and_request_resend(); serial_state[serial_ind].count = 0; diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 37f3c4e320..fd91138a4f 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -290,7 +290,7 @@ namespace Anycubic { void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEN string to the panel #if ACDEBUG(AC_SOME) - serialprintPGM(str); + SERIAL_ECHOPGM_P(str); #endif while (const char c = pgm_read_byte(str++)) TFTSer.write(c); } diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index 0358f3f59a..d079e0b4b3 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -37,8 +37,6 @@ L64XX_Marlin L64xxManager; #include "../../module/planner.h" #include "../../HAL/shared/Delay.h" -void echo_yes_no(const bool yes) { serialprintPGM(yes ? PSTR(" YES") : PSTR(" NO ")); } - static const char str_X[] PROGMEM = "X ", str_Y[] PROGMEM = "Y ", str_Z[] PROGMEM = "Z ", str_X2[] PROGMEM = "X2", str_Y2[] PROGMEM = "Y2", str_Z2[] PROGMEM = "Z2", str_Z3[] PROGMEM = "Z3", str_Z4[] PROGMEM = "Z4", @@ -56,6 +54,8 @@ PGM_P const L64XX_Marlin::index_to_axis[] PROGMEM = { #define DEBUG_OUT ENABLED(L6470_CHITCHAT) #include "../../core/debug_out.h" +void echo_yes_no(const bool yes) { DEBUG_ECHOPGM_P(yes ? PSTR(" YES") : PSTR(" NO ")); UNUSED(yes); } + uint8_t L64XX_Marlin::dir_commands[MAX_L64XX]; // array to hold direction command for each driver const uint8_t L64XX_Marlin::index_to_dir[MAX_L64XX] = { @@ -375,7 +375,7 @@ inline void echo_min_max(const char a, const float &min, const float &max) { } inline void echo_oct_used(const float &oct, const uint8_t stall) { DEBUG_ECHOPAIR("over_current_threshold used : ", oct); - serialprintPGM(stall ? PSTR(" (Stall") : PSTR(" (OCD")); + DEBUG_ECHOPGM_P(stall ? PSTR(" (Stall") : PSTR(" (OCD")); DEBUG_ECHOLNPGM(" threshold)"); } inline void err_out_of_bounds() { DEBUG_ECHOLNPGM("Test aborted - motion out of bounds"); } @@ -652,7 +652,7 @@ void L64XX_Marlin::say_axis(const L64XX_axis_t axis, const uint8_t label/*=true* ) { say_axis(axis); DEBUG_ECHOPGM(" THERMAL: "); - serialprintPGM((status & _status_axis_th_sd) ? PSTR("SHUTDOWN") : (status & _status_axis_th_wrn) ? PSTR("WARNING ") : PSTR("OK ")); + DEBUG_ECHOPGM_P((status & _status_axis_th_sd) ? PSTR("SHUTDOWN") : (status & _status_axis_th_wrn) ? PSTR("WARNING ") : PSTR("OK ")); DEBUG_ECHOPGM(" OVERCURRENT: "); echo_yes_no((status & _status_axis_ocd) != 0); if (!(_status_axis_layout == L6474_STATUS_LAYOUT)) { // L6474 doesn't have these bits diff --git a/Marlin/src/libs/stopwatch.cpp b/Marlin/src/libs/stopwatch.cpp index 601efe5517..adfaa3b043 100644 --- a/Marlin/src/libs/stopwatch.cpp +++ b/Marlin/src/libs/stopwatch.cpp @@ -98,7 +98,7 @@ millis_t Stopwatch::duration() { void Stopwatch::debug(const char func[]) { if (DEBUGGING(INFO)) { SERIAL_ECHOPGM("Stopwatch::"); - serialprintPGM(func); + SERIAL_ECHOPGM_P(func); SERIAL_ECHOLNPGM("()"); } } diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index 6f87a523e0..0ef29f33bd 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -77,7 +77,7 @@ void vector_3::apply_rotation(const matrix_3x3 &matrix) { } void vector_3::debug(PGM_P const title) { - serialprintPGM(title); + SERIAL_ECHOPGM_P(title); SERIAL_ECHOPAIR_F_P(SP_X_STR, x, 6); SERIAL_ECHOPAIR_F_P(SP_Y_STR, y, 6); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z, 6); @@ -139,10 +139,7 @@ matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) { } void matrix_3x3::debug(PGM_P const title) { - if (title) { - serialprintPGM(title); - SERIAL_EOL(); - } + if (title) SERIAL_ECHOLNPGM_P(title); LOOP_L_N(i, 3) { LOOP_L_N(j, 3) { if (vectors[i][j] >= 0.0) SERIAL_CHAR('+'); diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index b9d2c1cdf5..9550799a2d 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -405,10 +405,9 @@ void Endstops::event_handler() { } static void print_es_state(const bool is_hit, PGM_P const label=nullptr) { - if (label) serialprintPGM(label); + if (label) SERIAL_ECHOPGM_P(label); SERIAL_ECHOPGM(": "); - serialprintPGM(is_hit ? PSTR(STR_ENDSTOP_HIT) : PSTR(STR_ENDSTOP_OPEN)); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(is_hit ? PSTR(STR_ENDSTOP_HIT) : PSTR(STR_ENDSTOP_OPEN)); } void _O2 Endstops::report_states() { diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 7fcf37e044..dd87a0d24d 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2973,7 +2973,7 @@ inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_n if (before != val) { SERIAL_CHAR(axis_codes[lim_axis]); SERIAL_ECHOPGM(" Max "); - serialprintPGM(setting_name); + SERIAL_ECHOPGM_P(setting_name); SERIAL_ECHOLNPAIR(" limited to ", val); } } diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 45072c8f01..1caaee352a 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -118,7 +118,7 @@ void PrintCounter::initStats() { inline bool _service_warn(const char * const msg) { _print_divider(); SERIAL_ECHO_START(); - serialprintPGM(msg); + SERIAL_ECHOPGM_P(msg); SERIAL_ECHOLNPGM("!"); _print_divider(); return true; @@ -177,7 +177,7 @@ void PrintCounter::saveStats() { #if HAS_SERVICE_INTERVALS inline void _service_when(char buffer[], const char * const msg, const uint32_t when) { SERIAL_ECHOPGM(STR_STATS); - serialprintPGM(msg); + SERIAL_ECHOPGM_P(msg); SERIAL_ECHOLNPAIR(" in ", duration_t(when).toString(buffer)); } #endif @@ -339,7 +339,7 @@ void PrintCounter::reset() { void PrintCounter::debug(const char func[]) { if (DEBUGGING(INFO)) { SERIAL_ECHOPGM("PrintCounter::"); - serialprintPGM(func); + SERIAL_ECHOPGM_P(func); SERIAL_ECHOLNPGM("()"); } } diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d7fafc8932..7dcf1dff31 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -279,8 +279,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { PGM_P const ds_str = deploy ? GET_TEXT(MSG_MANUAL_DEPLOY) : GET_TEXT(MSG_MANUAL_STOW); ui.return_to_status(); // To display the new status message ui.set_status_P(ds_str, 99); - serialprintPGM(ds_str); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(ds_str); TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), CONTINUE_STR)); TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Stow Probe"))); @@ -586,7 +585,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { early_fail = (scheck && current_position.z > -offset.z + clearance); // Probe triggered too high? #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING) && (probe_fail || early_fail)) { - DEBUG_PRINT_P(plbl); + DEBUG_ECHOPGM_P(plbl); DEBUG_ECHOPGM(" Probe fail! -"); if (probe_fail) DEBUG_ECHOPGM(" No trigger."); if (early_fail) DEBUG_ECHOPGM(" Triggered early."); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index f4b4bf0b8b..d78d97e688 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2990,7 +2990,7 @@ void MarlinSettings::reset() { if (!repl) { SERIAL_ECHO_START(); SERIAL_ECHOPGM("; "); - serialprintPGM(pstr); + SERIAL_ECHOPGM_P(pstr); if (eol) SERIAL_EOL(); } } @@ -3007,7 +3007,7 @@ void MarlinSettings::reset() { SERIAL_ECHOPGM(" M569 S1"); if (etc) { SERIAL_CHAR(' '); - serialprintPGM(etc); + SERIAL_ECHOPGM_P(etc); } if (newLine) SERIAL_EOL(); } @@ -3025,7 +3025,7 @@ void MarlinSettings::reset() { #endif inline void say_units(const bool colon) { - serialprintPGM( + SERIAL_ECHOPGM_P( #if ENABLED(INCH_MODE_SUPPORT) parser.linear_unit_factor != 1.0 ? PSTR(" (in)") : #endif @@ -3066,7 +3066,7 @@ void MarlinSettings::reset() { SERIAL_ECHOPGM(" M149 "); SERIAL_CHAR(parser.temp_units_code()); SERIAL_ECHOPGM(" ; Units in "); - serialprintPGM(parser.temp_units_name()); + SERIAL_ECHOPGM_P(parser.temp_units_name()); #else SERIAL_ECHOLNPGM(" M149 C ; Units in Celsius"); #endif @@ -3254,12 +3254,12 @@ void MarlinSettings::reset() { LOOP_L_N(py, GRID_MAX_POINTS_Y) { LOOP_L_N(px, GRID_MAX_POINTS_X) { CONFIG_ECHO_START(); - SERIAL_ECHOPAIR_P(PSTR(" G29 S3 I"), px, PSTR(" J"), py); + SERIAL_ECHOPAIR(" G29 S3 I", px, " J", py); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(mbl.z_values[px][py]), 5); } } CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_F_P(PSTR(" G29 S4 Z"), LINEAR_UNIT(mbl.z_offset), 5); + SERIAL_ECHOLNPAIR_F(" G29 S4 Z", LINEAR_UNIT(mbl.z_offset), 5); } #elif ENABLED(AUTO_BED_LEVELING_UBL) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index e85e48c2d4..be98972b77 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -664,9 +664,9 @@ volatile bool Temperature::raw_temps_ready = false; #if EITHER(PIDTEMPBED, PIDTEMPCHAMBER) PGM_P const estring = GHV(PSTR("chamber"), PSTR("bed"), NUL_STR); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); + say_default_(); SERIAL_ECHOPGM_P(estring); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); + say_default_(); SERIAL_ECHOPGM_P(estring); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); + say_default_(); SERIAL_ECHOPGM_P(estring); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); #else say_default_(); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); say_default_(); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); @@ -868,7 +868,7 @@ void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_ms if (IsRunning() && TERN1(BOGUS_TEMPERATURE_GRACE_PERIOD, killed == 2)) { SERIAL_ERROR_START(); - serialprintPGM(serial_msg); + SERIAL_ECHOPGM_P(serial_msg); SERIAL_ECHOPGM(STR_STOPPED_HEATER); if (heater_id >= 0) SERIAL_ECHO(heater_id); @@ -1532,7 +1532,7 @@ void Temperature::manage_heater() { SERIAL_ECHOPAIR_F_P(SP_B_STR, t.beta, 1); SERIAL_ECHOPAIR_F_P(SP_C_STR, t.sh_c_coeff, 9); SERIAL_ECHOPGM(" ; "); - serialprintPGM( + SERIAL_ECHOPGM_P( TERN_(TEMP_SENSOR_0_IS_CUSTOM, t_index == CTI_HOTEND_0 ? PSTR("HOTEND 0") :) TERN_(TEMP_SENSOR_1_IS_CUSTOM, t_index == CTI_HOTEND_1 ? PSTR("HOTEND 1") :) TERN_(TEMP_SENSOR_2_IS_CUSTOM, t_index == CTI_HOTEND_2 ? PSTR("HOTEND 2") :) diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index 5f153cfa2b..e2e56081b7 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -238,7 +238,7 @@ const PinInfo pin_array[] PROGMEM = { #endif static void print_input_or_output(const bool isout) { - serialprintPGM(isout ? PSTR("Output = ") : PSTR("Input = ")); + SERIAL_ECHOPGM_P(isout ? PSTR("Output = ") : PSTR("Input = ")); } // pretty report with PWM info @@ -266,8 +266,8 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e LOOP_L_N(x, COUNT(pin_array)) { // scan entire array and report all instances of this pin if (GET_ARRAY_PIN(x) == pin) { if (!found) { // report digital and analog pin number only on the first time through - if (start_string) serialprintPGM(start_string); - serialprintPGM(PSTR("PIN: ")); + if (start_string) SERIAL_ECHOPGM_P(start_string); + SERIAL_ECHOPGM("PIN: "); PRINT_PIN(pin); PRINT_PORT(pin); if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) { @@ -317,8 +317,8 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e } // end of for loop if (!found) { - if (start_string) serialprintPGM(start_string); - serialprintPGM(PSTR("PIN: ")); + if (start_string) SERIAL_ECHOPGM_P(start_string); + SERIAL_ECHOPGM("PIN: "); PRINT_PIN(pin); PRINT_PORT(pin); if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) { diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index fd26bdd671..c973ba5945 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -552,7 +552,7 @@ void announceOpen(const uint8_t doing, const char * const path) { PORT_REDIRECT(SERIAL_ALL); SERIAL_ECHO_START(); SERIAL_ECHOPGM("Now "); - serialprintPGM(doing == 1 ? PSTR("doing") : PSTR("fresh")); + SERIAL_ECHOPGM_P(doing == 1 ? PSTR("doing") : PSTR("fresh")); SERIAL_ECHOLNPAIR(" file: ", path); } } @@ -1251,7 +1251,7 @@ void CardReader::fileHasFinished() { removeFile(recovery.filename); #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) SERIAL_ECHOPGM("Power-loss file delete"); - serialprintPGM(jobRecoverFileExists() ? PSTR(" failed.\n") : PSTR("d.\n")); + SERIAL_ECHOPGM_P(jobRecoverFileExists() ? PSTR(" failed.\n") : PSTR("d.\n")); #endif } } From fd5f1f1f5d3a25f73105c35eb3eaaac73d868e7e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 28 Feb 2021 19:50:17 -0600 Subject: [PATCH 1087/1370] Filament sensor cleanup --- Marlin/src/feature/pause.cpp | 6 +----- Marlin/src/feature/runout.cpp | 6 +----- Marlin/src/feature/runout.h | 12 ++++++------ Marlin/src/gcode/feature/pause/M600.cpp | 2 +- Marlin/src/inc/Conditionals_adv.h | 3 +++ Marlin/src/lcd/extui/ui_api.cpp | 8 ++++++-- Marlin/src/lcd/extui/ui_api.h | 1 + Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index c1f951e764..a6a28925ed 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -192,11 +192,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = true; // LCD click or M108 will clear this #if ENABLED(HOST_PROMPT_SUPPORT) - const char tool = '0' - #if NUM_RUNOUT_SENSORS > 1 - + active_extruder - #endif - ; + const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, active_extruder); host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Load Filament T"), tool, CONTINUE_STR); #endif diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index be769d2dc8..17d2c74003 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -88,11 +88,7 @@ void event_filament_runout() { TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getActiveTool())); #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS) - const char tool = '0' - #if NUM_RUNOUT_SENSORS > 1 - + active_extruder - #endif - ; + const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, active_extruder); #endif //action:out_of_filament diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index ecf47b22c2..d253071ef4 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -230,7 +230,7 @@ class FilamentSensorBase { change = old_state ^ new_state; old_state = new_state; - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) if (change) { SERIAL_ECHOPGM("Motion detected:"); LOOP_L_N(e, NUM_RUNOUT_SENSORS) @@ -266,12 +266,12 @@ class FilamentSensorBase { private: static inline bool poll_runout_state(const uint8_t extruder) { const uint8_t runout_states = poll_runout_states(); - #if NUM_RUNOUT_SENSORS == 1 - UNUSED(extruder); - #else + #if MULTI_FILAMENT_SENSOR if ( !TERN0(DUAL_X_CARRIAGE, idex_is_duplicating()) && !TERN0(MULTI_NOZZLE_DUPLICATION, extruder_duplication_enabled) ) return TEST(runout_states, extruder); // A specific extruder ran out + #else + UNUSED(extruder); #endif return !!runout_states; // Any extruder ran out } @@ -282,7 +282,7 @@ class FilamentSensorBase { static inline void run() { const bool out = poll_runout_state(active_extruder); if (!out) filament_present(active_extruder); - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) static bool was_out = false; if (out != was_out) { was_out = out; @@ -315,7 +315,7 @@ class FilamentSensorBase { } static inline void run() { - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) static millis_t t = 0; const millis_t ms = millis(); if (ELAPSED(ms, t)) { diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 1c282f2052..1033025fe3 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -83,7 +83,7 @@ void GcodeSuite::M600() { int8_t DXC_ext = target_extruder; if (!parser.seen('T')) { // If no tool index is specified, M600 was (probably) sent in response to filament runout. // In this case, for duplicating modes set DXC_ext to the extruder that ran out. - #if HAS_FILAMENT_SENSOR && NUM_RUNOUT_SENSORS > 1 + #if MULTI_FILAMENT_SENSOR if (idex_is_duplicating()) DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT2_STATE) ? 1 : 0; #else diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index b8464df3dd..4738cda20a 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -128,6 +128,9 @@ #if ENABLED(FILAMENT_RUNOUT_SENSOR) #define HAS_FILAMENT_SENSOR 1 + #if NUM_RUNOUT_SENSORS > 1 + #define MULTI_FILAMENT_SENSOR 1 + #endif #ifdef FILAMENT_RUNOUT_DISTANCE_MM #define HAS_FILAMENT_RUNOUT_DISTANCE 1 #endif diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index d1ffb4c437..7c178a0339 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -340,8 +340,10 @@ namespace ExtUI { #endif } - extruder_t getActiveTool() { - switch (active_extruder) { + extruder_t getTool(const uint8_t extruder) { + switch (extruder) { + case 7: return E7; + case 6: return E6; case 5: return E5; case 4: return E4; case 3: return E3; @@ -351,6 +353,8 @@ namespace ExtUI { } } + extruder_t getActiveTool() { return getTool(active_extruder); } + bool isMoving() { return planner.has_blocks_queued(); } bool canMove(const axis_t axis) { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index bfd658b0d9..4214ba5821 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -215,6 +215,7 @@ namespace ExtUI { void setAxisMaxJerk_mm_s(const float, const extruder_t); #endif + extruder_t getTool(const uint8_t extruder); extruder_t getActiveTool(); void setActiveTool(const extruder_t, bool no_move); diff --git a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h index 1dc898e6ca..05de208ca1 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h @@ -35,7 +35,7 @@ #define MOSFET_D_PIN 7 #define FIL_RUNOUT_PIN 2 -#if NUM_RUNOUT_SENSORS > 1 +#if NUM_RUNOUT_SENSORS >= 2 #define FIL_RUNOUT2_PIN 15 // Creality CR-X can use dual runout sensors #endif From 2d4a1cd428896e6ff64097d372dc6bbf49d622a6 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 1 Mar 2021 03:16:22 +0100 Subject: [PATCH 1088/1370] Filament Runout handling for Mixing Extruder (#20327) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 7 ++- Marlin/src/feature/runout.cpp | 30 +++++++--- Marlin/src/feature/runout.h | 96 +++++++++++++++++++++++-------- Marlin/src/inc/Conditionals_adv.h | 3 + Marlin/src/inc/SanityCheck.h | 32 +++++------ Marlin/src/module/endstops.cpp | 32 +++++------ buildroot/tests/mega2560-tests | 8 ++- 7 files changed, 139 insertions(+), 69 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 79b7f9dffa..46b70eb72d 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1278,6 +1278,8 @@ #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + //#define WATCH_ALL_RUNOUT_SENSORS // Execute runout script on any triggering sensor, not only for the active extruder. + // This is automatically enabled for MIXING_EXTRUDERs. // Override individually if the runout sensors vary //#define FIL_RUNOUT1_STATE LOW @@ -1312,8 +1314,9 @@ //#define FIL_RUNOUT8_PULLUP //#define FIL_RUNOUT8_PULLDOWN - // Set one or more commands to execute on filament runout. - // (After 'M412 H' Marlin will ask the host to handle the process.) + // Commands to execute on filament runout. + // With multiple runout sensors use the %c placeholder for the current tool in commands (e.g., "M600 T%c") + // NOTE: After 'M412 H1' the host handles filament runout and this script does not apply. #define FILAMENT_RUNOUT_SCRIPT "M600" // After a runout is detected, continue printing this length of filament diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 17d2c74003..531ca1081f 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -47,12 +47,12 @@ bool FilamentMonitorBase::enabled = true, #if HAS_FILAMENT_RUNOUT_DISTANCE float RunoutResponseDelayed::runout_distance_mm = FILAMENT_RUNOUT_DISTANCE_MM; - volatile float RunoutResponseDelayed::runout_mm_countdown[EXTRUDERS]; + volatile float RunoutResponseDelayed::runout_mm_countdown[NUM_RUNOUT_SENSORS]; #if ENABLED(FILAMENT_MOTION_SENSOR) uint8_t FilamentSensorEncoder::motion_detected; #endif #else - int8_t RunoutResponseDebounced::runout_count; // = 0 + int8_t RunoutResponseDebounced::runout_count[NUM_RUNOUT_SENSORS]; // = 0 #endif // @@ -70,7 +70,7 @@ bool FilamentMonitorBase::enabled = true, #include "../lcd/extui/ui_api.h" #endif -void event_filament_runout() { +void event_filament_runout(const uint8_t extruder) { if (did_pause_print) return; // Action already in progress. Purge triggered repeated runout. @@ -85,10 +85,10 @@ void event_filament_runout() { } #endif - TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getActiveTool())); + TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getTool(extruder))); - #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS) - const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, active_extruder); + #if ANY(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS, MULTI_FILAMENT_SENSOR) + const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, extruder); #endif //action:out_of_filament @@ -124,8 +124,22 @@ void event_filament_runout() { SERIAL_EOL(); #endif // HOST_ACTION_COMMANDS - if (run_runout_script) - queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); + if (run_runout_script) { + #if MULTI_FILAMENT_SENSOR + char script[strlen(FILAMENT_RUNOUT_SCRIPT) + 1]; + sprintf_P(script, PSTR(FILAMENT_RUNOUT_SCRIPT), tool); + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + SERIAL_ECHOLNPAIR("Runout Command: ", script); + #endif + queue.inject(script); + #else + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + SERIAL_ECHOPGM("Runout Command: "); + SERIAL_ECHOLNPGM(FILAMENT_RUNOUT_SCRIPT); + #endif + queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); + #endif + } } #endif // HAS_FILAMENT_SENSOR diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index d253071ef4..34ae67899b 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -43,7 +43,7 @@ #define FILAMENT_RUNOUT_THRESHOLD 5 #endif -void event_filament_runout(); +void event_filament_runout(const uint8_t extruder); template class TFilamentMonitor; @@ -119,11 +119,41 @@ class TFilamentMonitor : public FilamentMonitorBase { TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, cli()); // Prevent RunoutResponseDelayed::block_completed from accumulating here response.run(); sensor.run(); - const bool ran_out = response.has_run_out(); + const uint8_t runout_flags = response.has_run_out(); TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, sei()); + #if MULTI_FILAMENT_SENSOR + #if ENABLED(WATCH_ALL_RUNOUT_SENSORS) + const bool ran_out = !!runout_flags; // any sensor triggers + uint8_t extruder = 0; + if (ran_out) { + uint8_t bitmask = runout_flags; + while (!(bitmask & 1)) { + bitmask >>= 1; + extruder++; + } + } + #else + const bool ran_out = TEST(runout_flags, active_extruder); // suppress non active extruders + uint8_t extruder = active_extruder; + #endif + #else + const bool ran_out = !!runout_flags; + uint8_t extruder = active_extruder; + #endif + + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + if (runout_flags) { + SERIAL_ECHOPGM("Runout Sensors: "); + LOOP_L_N(i, 8) SERIAL_ECHO('0' + TEST(runout_flags, i)); + SERIAL_ECHOPAIR(" -> ", extruder); + if (ran_out) SERIAL_ECHOPGM(" RUN OUT"); + SERIAL_EOL(); + } + #endif + if (ran_out) { filament_ran_out = true; - event_filament_runout(); + event_filament_runout(extruder); planner.synchronize(); } } @@ -280,16 +310,17 @@ class FilamentSensorBase { static inline void block_completed(const block_t* const) {} static inline void run() { - const bool out = poll_runout_state(active_extruder); - if (!out) filament_present(active_extruder); - #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) - static bool was_out = false; - if (out != was_out) { - was_out = out; - SERIAL_ECHOPGM("Filament "); - SERIAL_ECHOPGM_P(out ? PSTR("OUT\n") : PSTR("IN\n")); - } - #endif + LOOP_L_N(s, NUM_RUNOUT_SENSORS) { + const bool out = poll_runout_state(s); + if (!out) filament_present(s); + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + static uint8_t was_out; // = 0 + if (out != TEST(was_out, s)) { + TBI(was_out, s); + SERIAL_ECHOLNPAIR_P(PSTR("Filament Sensor "), '0' + s, out ? PSTR(" OUT") : PSTR(" IN")); + } + #endif + } } }; @@ -305,13 +336,13 @@ class FilamentSensorBase { // during a runout condition. class RunoutResponseDelayed { private: - static volatile float runout_mm_countdown[EXTRUDERS]; + static volatile float runout_mm_countdown[NUM_RUNOUT_SENSORS]; public: static float runout_distance_mm; static inline void reset() { - LOOP_L_N(i, EXTRUDERS) filament_present(i); + LOOP_L_N(i, NUM_RUNOUT_SENSORS) filament_present(i); } static inline void run() { @@ -320,15 +351,17 @@ class FilamentSensorBase { const millis_t ms = millis(); if (ELAPSED(ms, t)) { t = millis() + 1000UL; - LOOP_L_N(i, EXTRUDERS) + LOOP_L_N(i, NUM_RUNOUT_SENSORS) SERIAL_ECHOPAIR_P(i ? PSTR(", ") : PSTR("Remaining mm: "), runout_mm_countdown[i]); SERIAL_EOL(); } #endif } - static inline bool has_run_out() { - return runout_mm_countdown[active_extruder] < 0; + static inline uint8_t has_run_out() { + uint8_t runout_flags = 0; + LOOP_L_N(i, NUM_RUNOUT_SENSORS) if (runout_mm_countdown[i] < 0) SBI(runout_flags, i); + return runout_flags; } static inline void filament_present(const uint8_t extruder) { @@ -353,13 +386,28 @@ class FilamentSensorBase { class RunoutResponseDebounced { private: static constexpr int8_t runout_threshold = FILAMENT_RUNOUT_THRESHOLD; - static int8_t runout_count; + static int8_t runout_count[NUM_RUNOUT_SENSORS]; + public: - static inline void reset() { runout_count = runout_threshold; } - static inline void run() { if (runout_count >= 0) runout_count--; } - static inline bool has_run_out() { return runout_count < 0; } - static inline void block_completed(const block_t* const) { } - static inline void filament_present(const uint8_t) { runout_count = runout_threshold; } + static inline void reset() { + LOOP_L_N(i, NUM_RUNOUT_SENSORS) filament_present(i); + } + + static inline void run() { + LOOP_L_N(i, NUM_RUNOUT_SENSORS) if (runout_count[i] >= 0) runout_count[i]--; + } + + static inline uint8_t has_run_out() { + uint8_t runout_flags = 0; + LOOP_L_N(i, NUM_RUNOUT_SENSORS) if (runout_count[i] < 0) SBI(runout_flags, i); + return runout_flags; + } + + static inline void block_completed(const block_t* const) { } + + static inline void filament_present(const uint8_t extruder) { + runout_count[extruder] = runout_threshold; + } }; #endif // !HAS_FILAMENT_RUNOUT_DISTANCE diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 4738cda20a..43f20b6dfd 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -134,6 +134,9 @@ #ifdef FILAMENT_RUNOUT_DISTANCE_MM #define HAS_FILAMENT_RUNOUT_DISTANCE 1 #endif + #if ENABLED(MIXING_EXTRUDER) + #define WATCH_ALL_RUNOUT_SENSORS + #endif #endif // Let SD_FINISHED_RELEASECOMMAND stand in for SD_FINISHED_STEPPERRELEASE diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b6678a4bcb..6581f629b0 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -823,26 +823,24 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if HAS_FILAMENT_SENSOR #if !PIN_EXISTS(FIL_RUNOUT) #error "FILAMENT_RUNOUT_SENSOR requires FIL_RUNOUT_PIN." - #elif NUM_RUNOUT_SENSORS > E_STEPPERS - #if HAS_PRUSA_MMU2 + #elif HAS_PRUSA_MMU2 && NUM_RUNOUT_SENSORS != 1 #error "NUM_RUNOUT_SENSORS must be 1 with MMU2 / MMU2S." - #else - #error "NUM_RUNOUT_SENSORS cannot exceed the number of E steppers." - #endif - #elif NUM_RUNOUT_SENSORS >= 2 && !PIN_EXISTS(FIL_RUNOUT2) - #error "FIL_RUNOUT2_PIN is required with NUM_RUNOUT_SENSORS >= 2." - #elif NUM_RUNOUT_SENSORS >= 3 && !PIN_EXISTS(FIL_RUNOUT3) - #error "FIL_RUNOUT3_PIN is required with NUM_RUNOUT_SENSORS >= 3." - #elif NUM_RUNOUT_SENSORS >= 4 && !PIN_EXISTS(FIL_RUNOUT4) - #error "FIL_RUNOUT4_PIN is required with NUM_RUNOUT_SENSORS >= 4." - #elif NUM_RUNOUT_SENSORS >= 5 && !PIN_EXISTS(FIL_RUNOUT5) - #error "FIL_RUNOUT5_PIN is required with NUM_RUNOUT_SENSORS >= 5." - #elif NUM_RUNOUT_SENSORS >= 6 && !PIN_EXISTS(FIL_RUNOUT6) - #error "FIL_RUNOUT6_PIN is required with NUM_RUNOUT_SENSORS >= 6." - #elif NUM_RUNOUT_SENSORS >= 7 && !PIN_EXISTS(FIL_RUNOUT7) - #error "FIL_RUNOUT7_PIN is required with NUM_RUNOUT_SENSORS >= 7." + #elif NUM_RUNOUT_SENSORS != 1 && NUM_RUNOUT_SENSORS != E_STEPPERS + #error "NUM_RUNOUT_SENSORS must be either 1 or number of E steppers." #elif NUM_RUNOUT_SENSORS >= 8 && !PIN_EXISTS(FIL_RUNOUT8) #error "FIL_RUNOUT8_PIN is required with NUM_RUNOUT_SENSORS >= 8." + #elif NUM_RUNOUT_SENSORS >= 7 && !PIN_EXISTS(FIL_RUNOUT7) + #error "FIL_RUNOUT7_PIN is required with NUM_RUNOUT_SENSORS >= 7." + #elif NUM_RUNOUT_SENSORS >= 6 && !PIN_EXISTS(FIL_RUNOUT6) + #error "FIL_RUNOUT6_PIN is required with NUM_RUNOUT_SENSORS >= 6." + #elif NUM_RUNOUT_SENSORS >= 5 && !PIN_EXISTS(FIL_RUNOUT5) + #error "FIL_RUNOUT5_PIN is required with NUM_RUNOUT_SENSORS >= 5." + #elif NUM_RUNOUT_SENSORS >= 4 && !PIN_EXISTS(FIL_RUNOUT4) + #error "FIL_RUNOUT4_PIN is required with NUM_RUNOUT_SENSORS >= 4." + #elif NUM_RUNOUT_SENSORS >= 3 && !PIN_EXISTS(FIL_RUNOUT3) + #error "FIL_RUNOUT3_PIN is required with NUM_RUNOUT_SENSORS >= 3." + #elif NUM_RUNOUT_SENSORS >= 2 && !PIN_EXISTS(FIL_RUNOUT2) + #error "FIL_RUNOUT2_PIN is required with NUM_RUNOUT_SENSORS >= 2." #elif BOTH(FIL_RUNOUT1_PULLUP, FIL_RUNOUT1_PULLDOWN) #error "You can't enable FIL_RUNOUT1_PULLUP and FIL_RUNOUT1_PULLDOWN at the same time." #elif BOTH(FIL_RUNOUT2_PULLUP, FIL_RUNOUT2_PULLDOWN) diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 9550799a2d..4192b444bb 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -468,24 +468,22 @@ void _O2 Endstops::report_states() { #if HAS_CUSTOM_PROBE_PIN print_es_state(PROBE_TRIGGERED(), PSTR(STR_Z_PROBE)); #endif - #if HAS_FILAMENT_SENSOR - #if NUM_RUNOUT_SENSORS == 1 - print_es_state(READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); - #else - #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; state = FIL_RUNOUT##N##_STATE; break; - LOOP_S_LE_N(i, 1, NUM_RUNOUT_SENSORS) { - pin_t pin; - uint8_t state; - switch (i) { - default: continue; - REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _CASE_RUNOUT) - } - SERIAL_ECHOPGM(STR_FILAMENT_RUNOUT_SENSOR); - if (i > 1) SERIAL_CHAR(' ', '0' + i); - print_es_state(extDigitalRead(pin) != state); + #if MULTI_FILAMENT_SENSOR + #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; state = FIL_RUNOUT##N##_STATE; break; + LOOP_S_LE_N(i, 1, NUM_RUNOUT_SENSORS) { + pin_t pin; + uint8_t state; + switch (i) { + default: continue; + REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _CASE_RUNOUT) } - #undef _CASE_RUNOUT - #endif + SERIAL_ECHOPGM(STR_FILAMENT_RUNOUT_SENSOR); + if (i > 1) SERIAL_CHAR(' ', '0' + i); + print_es_state(extDigitalRead(pin) != state); + } + #undef _CASE_RUNOUT + #elif HAS_FILAMENT_SENSOR + print_es_state(READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); #endif TERN_(BLTOUCH, bltouch._reset_SW_mode()); diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index aef2b8756a..d74aa30f88 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -94,8 +94,14 @@ restore_configs opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO opt_set LCD_LANGUAGE el_gr opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY \ - USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z + USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z \ + FILAMENT_RUNOUT_SENSOR ADVANCED_PAUSE_FEATURE NOZZLE_PARK_FEATURE opt_set MIXING_STEPPERS 5 +opt_set NUM_RUNOUT_SENSORS E_STEPPERS +opt_set FIL_RUNOUT2_PIN 16 +opt_set FIL_RUNOUT3_PIN 17 +opt_set FIL_RUNOUT4_PIN 4 +opt_set FIL_RUNOUT5_PIN 5 opt_set LCD_LANGUAGE ru exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" From 4e6ed4319845e0cea4e1a3af2baa66272e95b563 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sun, 28 Feb 2021 19:52:59 -0700 Subject: [PATCH 1089/1370] Minor FTDI EVE Touch UI fixes (#21232) --- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 2 +- .../ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp | 2 +- .../ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h | 2 +- .../ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp | 5 ++--- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp | 1 + 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 0fef87b64c..6cbc534110 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -20,7 +20,7 @@ * */ -#include "../../../../inc/MarlinConfigPre.h" +#include "../../../../../inc/MarlinConfigPre.h" #if ENABLED(DGUS_LCD_UI_MKS) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp index 8b87c4ae41..d9c01366b9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp @@ -187,7 +187,7 @@ bool LoadChocolateScreen::onTouchHeld(uint8_t tag) { break; } case 3: { - if (get_chocolate_fill_level() > 0.9) { + if (get_chocolate_fill_level() > 0.75) { mydata.repeat_tag = 0; return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h index 582a62fe05..819464495b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h @@ -32,12 +32,12 @@ struct LoadChocolateScreenData { class LoadChocolateScreen : public BaseScreen, public CachedScreen { private: - static void setManualFeedrateAndIncrement(float feedrate_mm_s, float &increment); static void draw_syringe(draw_mode_t what); static void draw_arrows(draw_mode_t what); static void draw_buttons(draw_mode_t what); static void draw_text(draw_mode_t what); public: + static void setManualFeedrateAndIncrement(float feedrate_mm_s, float &increment); static void onEntry(); static void onIdle(); static void onRedraw(draw_mode_t); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp index d199b492e4..2621ef64fe 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp @@ -34,7 +34,7 @@ constexpr static MoveAxisScreenData &mydata = screen_data.MoveAxisScreen; void MoveEScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(1); + w.precision(1, DEFAULT_MIDRANGE); w.units(GET_TEXT_F(MSG_UNITS_MM)); w.heading( GET_TEXT_F(MSG_E_MOVE)); w.color(Theme::e_axis); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp index 7caa9c7944..5a0fe485f8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -235,7 +235,7 @@ bool StatusScreen::onTouchStart(uint8_t) { bool StatusScreen::onTouchEnd(uint8_t tag) { switch (tag) { - case 1: SpinnerDialogBox::enqueueAndWait_P(F("G0 X0 Y0")); break; + case 1: SpinnerDialogBox::enqueueAndWait_P(F("G28 O\nG27")); break; case 2: GOTO_SCREEN(LoadChocolateScreen); break; case 3: GOTO_SCREEN(PreheatMenu); break; case 4: GOTO_SCREEN(MainMenu); break; @@ -274,8 +274,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) { bool StatusScreen::onTouchHeld(uint8_t tag) { if (tag == 8 && !ExtUI::isMoving()) { - increment = 0.05; - MoveAxisScreen::setManualFeedrate(E0, increment); + LoadChocolateScreen::setManualFeedrateAndIncrement(1, increment); UI_INCREMENT(AxisPosition_mm, E0); current_screen.onRefresh(); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 2c9d881173..889ed734cc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -100,6 +100,7 @@ SCREEN_TABLE { DECL_SCREEN_IF_INCLUDED(FTDI_BIO_CONFIRMOME_E) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_STATUS_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_MAIN_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_ADVANCED_SETTINGS_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN) From 854ab04ee448f275ccd1b3d3a477210e4b0de91e Mon Sep 17 00:00:00 2001 From: Ilya Date: Sun, 28 Feb 2021 23:33:07 -0800 Subject: [PATCH 1090/1370] Default microsteps to axis first stepper (#21230) --- Marlin/Configuration_adv.h | 228 ++++++++++++++++++------------------- 1 file changed, 114 insertions(+), 114 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f23ca2980d..b1d8be1069 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2244,7 +2244,7 @@ #if AXIS_DRIVER_TYPE_X2(TMC26X) #define X2_MAX_CURRENT 1000 #define X2_SENSE_RESISTOR 91 - #define X2_MICROSTEPS 16 + #define X2_MICROSTEPS X_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_Y(TMC26X) @@ -2256,7 +2256,7 @@ #if AXIS_DRIVER_TYPE_Y2(TMC26X) #define Y2_MAX_CURRENT 1000 #define Y2_SENSE_RESISTOR 91 - #define Y2_MICROSTEPS 16 + #define Y2_MICROSTEPS Y_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_Z(TMC26X) @@ -2268,19 +2268,19 @@ #if AXIS_DRIVER_TYPE_Z2(TMC26X) #define Z2_MAX_CURRENT 1000 #define Z2_SENSE_RESISTOR 91 - #define Z2_MICROSTEPS 16 + #define Z2_MICROSTEPS Z_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_Z3(TMC26X) #define Z3_MAX_CURRENT 1000 #define Z3_SENSE_RESISTOR 91 - #define Z3_MICROSTEPS 16 + #define Z3_MICROSTEPS Z_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_Z4(TMC26X) #define Z4_MAX_CURRENT 1000 #define Z4_SENSE_RESISTOR 91 - #define Z4_MICROSTEPS 16 + #define Z4_MICROSTEPS Z_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E0(TMC26X) @@ -2292,43 +2292,43 @@ #if AXIS_DRIVER_TYPE_E1(TMC26X) #define E1_MAX_CURRENT 1000 #define E1_SENSE_RESISTOR 91 - #define E1_MICROSTEPS 16 + #define E1_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E2(TMC26X) #define E2_MAX_CURRENT 1000 #define E2_SENSE_RESISTOR 91 - #define E2_MICROSTEPS 16 + #define E2_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E3(TMC26X) #define E3_MAX_CURRENT 1000 #define E3_SENSE_RESISTOR 91 - #define E3_MICROSTEPS 16 + #define E3_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E4(TMC26X) #define E4_MAX_CURRENT 1000 #define E4_SENSE_RESISTOR 91 - #define E4_MICROSTEPS 16 + #define E4_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E5(TMC26X) #define E5_MAX_CURRENT 1000 #define E5_SENSE_RESISTOR 91 - #define E5_MICROSTEPS 16 + #define E5_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E6(TMC26X) #define E6_MAX_CURRENT 1000 #define E6_SENSE_RESISTOR 91 - #define E6_MICROSTEPS 16 + #define E6_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E7(TMC26X) #define E7_MAX_CURRENT 1000 #define E7_SENSE_RESISTOR 91 - #define E7_MICROSTEPS 16 + #define E7_MICROSTEPS E0_MICROSTEPS #endif #endif // TMC26X @@ -2373,7 +2373,7 @@ #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_CURRENT_HOME X2_CURRENT - #define X2_MICROSTEPS 16 + #define X2_MICROSTEPS X_MICROSTEPS #define X2_RSENSE 0.11 #define X2_CHAIN_POS -1 //#define X2_INTERPOLATE true @@ -2391,7 +2391,7 @@ #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_CURRENT_HOME Y2_CURRENT - #define Y2_MICROSTEPS 16 + #define Y2_MICROSTEPS Y_MICROSTEPS #define Y2_RSENSE 0.11 #define Y2_CHAIN_POS -1 //#define Y2_INTERPOLATE true @@ -2409,7 +2409,7 @@ #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_CURRENT_HOME Z2_CURRENT - #define Z2_MICROSTEPS 16 + #define Z2_MICROSTEPS Z_MICROSTEPS #define Z2_RSENSE 0.11 #define Z2_CHAIN_POS -1 //#define Z2_INTERPOLATE true @@ -2418,7 +2418,7 @@ #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_CURRENT_HOME Z3_CURRENT - #define Z3_MICROSTEPS 16 + #define Z3_MICROSTEPS Z_MICROSTEPS #define Z3_RSENSE 0.11 #define Z3_CHAIN_POS -1 //#define Z3_INTERPOLATE true @@ -2427,7 +2427,7 @@ #if AXIS_IS_TMC(Z4) #define Z4_CURRENT 800 #define Z4_CURRENT_HOME Z4_CURRENT - #define Z4_MICROSTEPS 16 + #define Z4_MICROSTEPS Z_MICROSTEPS #define Z4_RSENSE 0.11 #define Z4_CHAIN_POS -1 //#define Z4_INTERPOLATE true @@ -2443,7 +2443,7 @@ #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 - #define E1_MICROSTEPS 16 + #define E1_MICROSTEPS E0_MICROSTEPS #define E1_RSENSE 0.11 #define E1_CHAIN_POS -1 //#define E1_INTERPOLATE true @@ -2451,7 +2451,7 @@ #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 - #define E2_MICROSTEPS 16 + #define E2_MICROSTEPS E0_MICROSTEPS #define E2_RSENSE 0.11 #define E2_CHAIN_POS -1 //#define E2_INTERPOLATE true @@ -2459,7 +2459,7 @@ #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 - #define E3_MICROSTEPS 16 + #define E3_MICROSTEPS E0_MICROSTEPS #define E3_RSENSE 0.11 #define E3_CHAIN_POS -1 //#define E3_INTERPOLATE true @@ -2467,7 +2467,7 @@ #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 - #define E4_MICROSTEPS 16 + #define E4_MICROSTEPS E0_MICROSTEPS #define E4_RSENSE 0.11 #define E4_CHAIN_POS -1 //#define E4_INTERPOLATE true @@ -2475,7 +2475,7 @@ #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 - #define E5_MICROSTEPS 16 + #define E5_MICROSTEPS E0_MICROSTEPS #define E5_RSENSE 0.11 #define E5_CHAIN_POS -1 //#define E5_INTERPOLATE true @@ -2483,7 +2483,7 @@ #if AXIS_IS_TMC(E6) #define E6_CURRENT 800 - #define E6_MICROSTEPS 16 + #define E6_MICROSTEPS E0_MICROSTEPS #define E6_RSENSE 0.11 #define E6_CHAIN_POS -1 //#define E6_INTERPOLATE true @@ -2491,7 +2491,7 @@ #if AXIS_IS_TMC(E7) #define E7_CURRENT 800 - #define E7_MICROSTEPS 16 + #define E7_MICROSTEPS E0_MICROSTEPS #define E7_RSENSE 0.11 #define E7_CHAIN_POS -1 //#define E7_INTERPOLATE true @@ -2766,138 +2766,138 @@ #endif #if AXIS_IS_L64XX(X2) - #define X2_MICROSTEPS 128 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 - #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS -1 - #define X2_SLEW_RATE 1 + #define X2_MICROSTEPS X_MICROSTEPS + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + #define X2_MAX_VOLTAGE 127 + #define X2_CHAIN_POS -1 + #define X2_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Y) - #define Y_MICROSTEPS 128 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 - #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS -1 - #define Y_SLEW_RATE 1 + #define Y_MICROSTEPS 128 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + #define Y_MAX_VOLTAGE 127 + #define Y_CHAIN_POS -1 + #define Y_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Y2) - #define Y2_MICROSTEPS 128 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 - #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS -1 - #define Y2_SLEW_RATE 1 + #define Y2_MICROSTEPS Y_MICROSTEPS + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + #define Y2_MAX_VOLTAGE 127 + #define Y2_CHAIN_POS -1 + #define Y2_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Z) - #define Z_MICROSTEPS 128 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 - #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS -1 - #define Z_SLEW_RATE 1 + #define Z_MICROSTEPS 128 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + #define Z_MAX_VOLTAGE 127 + #define Z_CHAIN_POS -1 + #define Z_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Z2) - #define Z2_MICROSTEPS 128 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 - #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS -1 - #define Z2_SLEW_RATE 1 + #define Z2_MICROSTEPS Z_MICROSTEPS + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + #define Z2_MAX_VOLTAGE 127 + #define Z2_CHAIN_POS -1 + #define Z2_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Z3) - #define Z3_MICROSTEPS 128 - #define Z3_OVERCURRENT 2000 - #define Z3_STALLCURRENT 1500 - #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS -1 - #define Z3_SLEW_RATE 1 + #define Z3_MICROSTEPS Z_MICROSTEPS + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + #define Z3_MAX_VOLTAGE 127 + #define Z3_CHAIN_POS -1 + #define Z3_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Z4) - #define Z4_MICROSTEPS 128 - #define Z4_OVERCURRENT 2000 - #define Z4_STALLCURRENT 1500 - #define Z4_MAX_VOLTAGE 127 - #define Z4_CHAIN_POS -1 - #define Z4_SLEW_RATE 1 + #define Z4_MICROSTEPS Z_MICROSTEPS + #define Z4_OVERCURRENT 2000 + #define Z4_STALLCURRENT 1500 + #define Z4_MAX_VOLTAGE 127 + #define Z4_CHAIN_POS -1 + #define Z4_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E0) - #define E0_MICROSTEPS 128 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 - #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS -1 - #define E0_SLEW_RATE 1 + #define E0_MICROSTEPS 128 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + #define E0_MAX_VOLTAGE 127 + #define E0_CHAIN_POS -1 + #define E0_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E1) - #define E1_MICROSTEPS 128 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 - #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS -1 - #define E1_SLEW_RATE 1 + #define E1_MICROSTEPS E0_MICROSTEPS + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + #define E1_MAX_VOLTAGE 127 + #define E1_CHAIN_POS -1 + #define E1_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E2) - #define E2_MICROSTEPS 128 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 - #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS -1 - #define E2_SLEW_RATE 1 + #define E2_MICROSTEPS E0_MICROSTEPS + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + #define E2_MAX_VOLTAGE 127 + #define E2_CHAIN_POS -1 + #define E2_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E3) - #define E3_MICROSTEPS 128 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 - #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS -1 - #define E3_SLEW_RATE 1 + #define E3_MICROSTEPS E0_MICROSTEPS + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + #define E3_MAX_VOLTAGE 127 + #define E3_CHAIN_POS -1 + #define E3_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E4) - #define E4_MICROSTEPS 128 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 - #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS -1 - #define E4_SLEW_RATE 1 + #define E4_MICROSTEPS E0_MICROSTEPS + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + #define E4_MAX_VOLTAGE 127 + #define E4_CHAIN_POS -1 + #define E4_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E5) - #define E5_MICROSTEPS 128 - #define E5_OVERCURRENT 2000 - #define E5_STALLCURRENT 1500 - #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS -1 - #define E5_SLEW_RATE 1 + #define E5_MICROSTEPS E0_MICROSTEPS + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 + #define E5_MAX_VOLTAGE 127 + #define E5_CHAIN_POS -1 + #define E5_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E6) - #define E6_MICROSTEPS 128 - #define E6_OVERCURRENT 2000 - #define E6_STALLCURRENT 1500 - #define E6_MAX_VOLTAGE 127 - #define E6_CHAIN_POS -1 - #define E6_SLEW_RATE 1 + #define E6_MICROSTEPS E0_MICROSTEPS + #define E6_OVERCURRENT 2000 + #define E6_STALLCURRENT 1500 + #define E6_MAX_VOLTAGE 127 + #define E6_CHAIN_POS -1 + #define E6_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E7) - #define E7_MICROSTEPS 128 - #define E7_OVERCURRENT 2000 - #define E7_STALLCURRENT 1500 - #define E7_MAX_VOLTAGE 127 - #define E7_CHAIN_POS -1 - #define E7_SLEW_RATE 1 + #define E7_MICROSTEPS E0_MICROSTEPS + #define E7_OVERCURRENT 2000 + #define E7_STALLCURRENT 1500 + #define E7_MAX_VOLTAGE 127 + #define E7_CHAIN_POS -1 + #define E7_SLEW_RATE 1 #endif /** From c8cd824be2984397118d0b3baca6d7cde157711b Mon Sep 17 00:00:00 2001 From: Nick Date: Mon, 1 Mar 2021 10:23:10 +0000 Subject: [PATCH 1091/1370] Safe Z homing for Power Loss Recovery (#16909) --- Marlin/Configuration_adv.h | 7 ++++++- Marlin/src/feature/powerloss.cpp | 17 ++++++++++++----- Marlin/src/inc/SanityCheck.h | 18 +++++++++++------- Marlin/src/module/probe.cpp | 8 ++++---- Marlin/src/module/probe.h | 2 +- buildroot/tests/rambo-tests | 8 +++++--- 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b1d8be1069..9032f4d2d8 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1256,7 +1256,6 @@ #if ENABLED(POWER_LOSS_RECOVERY) #define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) //#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss - //#define POWER_LOSS_RECOVER_ZHOME // Z homing is needed for proper recovery. 99.9% of the time this should be disabled! //#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss @@ -1268,6 +1267,12 @@ // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, // especially with "vase mode" printing. Set too high and vases cannot be continued. #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + + // Enable if Z homing is needed for proper recovery. 99.9% of the time this should be disabled! + //#define POWER_LOSS_RECOVER_ZHOME + #if ENABLED(POWER_LOSS_RECOVER_ZHOME) + //#define POWER_LOSS_ZHOME_POS { 0, 0 } // Safe XY position to home Z while avoiding objects on the bed + #endif #endif /** diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 1b1f2bd681..7413b5bd56 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -384,18 +384,25 @@ void PrintJobRecovery::resume() { // Home safely with no Z raise gcode.process_subcommands_now_P(PSTR( "G28R0" // No raise during G28 - #if IS_CARTESIAN && DISABLED(POWER_LOSS_RECOVER_ZHOME) + #if IS_CARTESIAN && (DISABLED(POWER_LOSS_RECOVER_ZHOME) || defined(POWER_LOSS_ZHOME_POS)) "XY" // Don't home Z on Cartesian unless overridden #endif )); #endif - // Pretend that all axes are homed + #ifdef POWER_LOSS_ZHOME_POS + // If defined move to a safe Z homing position that avoids the print + constexpr xy_pos_t homepos = POWER_LOSS_ZHOME_POS; + sprintf_P(cmd, PSTR("G1 X%s Y%s F1000\nG28Z", dtostrf(homepos.x, 1, 3, str_1), dtostrf(homepos.y, 1, 3, str_2))); + gcode.process_subcommands_now(cmd); + #endif + + // Ensure that all axes are marked as homed set_all_homed(); #if ENABLED(POWER_LOSS_RECOVER_ZHOME) - // Z has been homed so restore Z to ZsavedPos + POWER_LOSS_ZRAISE + // Now move to ZsavedPos + POWER_LOSS_ZRAISE sprintf_P(cmd, PSTR("G1 F500 Z%s"), dtostrf(info.current_position.z + POWER_LOSS_ZRAISE, 1, 3, str_1)); gcode.process_subcommands_now(cmd); #endif @@ -467,7 +474,7 @@ void PrintJobRecovery::resume() { // Additional purge if configured #if POWER_LOSS_PURGE_LEN - sprintf_P(cmd, PSTR("G1 E%d F200"), (POWER_LOSS_PURGE_LEN) + (POWER_LOSS_RETRACT_LEN)); + sprintf_P(cmd, PSTR("G1 E%d F3000"), (POWER_LOSS_PURGE_LEN) + (POWER_LOSS_RETRACT_LEN)); gcode.process_subcommands_now(cmd); #endif @@ -485,7 +492,7 @@ void PrintJobRecovery::resume() { // Move back to the saved Z dtostrf(info.current_position.z, 1, 3, str_1); #if Z_HOME_DIR > 0 || ENABLED(POWER_LOSS_RECOVER_ZHOME) - sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1); + sprintf_P(cmd, PSTR("G1 Z%s F500"), str_1); #else gcode.process_subcommands_now_P(PSTR("G1 Z0 F200")); sprintf_P(cmd, PSTR("G92.9 Z%s"), str_1); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6581f629b0..3f7931e0b6 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1641,7 +1641,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Allen Key * Deploying the Allen Key probe uses big moves in z direction. Too dangerous for an unhomed z-axis. */ -#if BOTH(Z_PROBE_ALLEN_KEY, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && (Z_HOME_DIR < 0) +#if BOTH(Z_PROBE_ALLEN_KEY, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && Z_HOME_DIR < 0 #error "You can't home to a Z min endstop with a Z_PROBE_ALLEN_KEY." #endif @@ -2913,12 +2913,16 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif -#if ENABLED(BACKUP_POWER_SUPPLY) && !PIN_EXISTS(POWER_LOSS) - #error "BACKUP_POWER_SUPPLY requires a POWER_LOSS_PIN." -#endif - -#if BOTH(POWER_LOSS_PULLUP, POWER_LOSS_PULLDOWN) - #error "You can't enable POWER_LOSS_PULLUP and POWER_LOSS_PULLDOWN at the same time." +#if ENABLED(POWER_LOSS_RECOVERY) + #if ENABLED(BACKUP_POWER_SUPPLY) && !PIN_EXISTS(POWER_LOSS) + #error "BACKUP_POWER_SUPPLY requires a POWER_LOSS_PIN." + #elif BOTH(POWER_LOSS_RECOVER_ZHOME, Z_SAFE_HOMING) + #error "POWER_LOSS_RECOVER_ZHOME cannot be used with Z_SAFE_HOMING." + #elif BOTH(POWER_LOSS_PULLUP, POWER_LOSS_PULLDOWN) + #error "You can't enable POWER_LOSS_PULLUP and POWER_LOSS_PULLDOWN at the same time." + #elif BOTH(IS_CARTESIAN, POWER_LOSS_RECOVER_ZHOME) && Z_HOME_DIR < 0 && !defined(POWER_LOSS_ZHOME_POS) + #error "POWER_LOSS_RECOVER_ZHOME requires POWER_LOSS_ZHOME_POS for a Cartesian that homes to ZMIN." + #endif #endif #if ENABLED(Z_STEPPER_AUTO_ALIGN) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 7dcf1dff31..7333aaa748 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -340,7 +340,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { * - If a preheat input is higher than the current target, raise the target temperature. * - If a preheat input is higher than the current temperature, wait for stabilization. */ - void Probe::preheat_for_probing(const uint16_t hotend_temp, const uint16_t bed_temp) { + void Probe::preheat_for_probing(const int16_t hotend_temp, const int16_t bed_temp) { #if HAS_HOTEND && (PROBING_NOZZLE_TEMP || LEVELING_NOZZLE_TEMP) #define WAIT_FOR_NOZZLE_HEAT #endif @@ -351,17 +351,17 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { DEBUG_ECHOPGM("Preheating "); #if ENABLED(WAIT_FOR_NOZZLE_HEAT) - const uint16_t hotendPreheat = hotend_temp > thermalManager.degTargetHotend(0) ? hotend_temp : 0; + const int16_t hotendPreheat = hotend_temp > thermalManager.degTargetHotend(0) ? hotend_temp : 0; if (hotendPreheat) { DEBUG_ECHOPAIR("hotend (", hotendPreheat, ")"); thermalManager.setTargetHotend(hotendPreheat, 0); } #elif ENABLED(WAIT_FOR_BED_HEAT) - constexpr uint16_t hotendPreheat = 0; + constexpr int16_t hotendPreheat = 0; #endif #if ENABLED(WAIT_FOR_BED_HEAT) - const uint16_t bedPreheat = bed_temp > thermalManager.degTargetBed() ? bed_temp : 0; + const int16_t bedPreheat = bed_temp > thermalManager.degTargetBed() ? bed_temp : 0; if (bedPreheat) { if (hotendPreheat) DEBUG_ECHOPGM(" and "); DEBUG_ECHOPAIR("bed (", bedPreheat, ")"); diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index df7bdd23a1..b54bf00f00 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -61,7 +61,7 @@ public: static xyz_pos_t offset; #if EITHER(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) - static void preheat_for_probing(const uint16_t hotend_temp, const uint16_t bed_temp); + static void preheat_for_probing(const int16_t hotend_temp, const int16_t bed_temp); #endif static bool set_deployed(const bool deploy); diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index d471f4201c..02ecf5d3fc 100755 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -22,9 +22,11 @@ opt_add TEMP_CHAMBER_PIN 3 opt_add HEATER_CHAMBER_PIN 45 opt_set GRID_MAX_POINTS_X 16 opt_set FANMUX0_PIN 53 -opt_disable USE_WATCHDOG +opt_set Z_HOME_DIR 1 +opt_enable USE_ZMAX_PLUG +opt_disable USE_ZMIN_PLUG Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN USE_WATCHDOG opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ + FIX_MOUNTED_PROBE CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ @@ -38,7 +40,7 @@ opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ FWRETRACT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ - PSU_CONTROL AUTO_POWER_CONTROL POWER_LOSS_RECOVERY POWER_LOSS_PIN POWER_LOSS_STATE \ + PSU_CONTROL AUTO_POWER_CONTROL POWER_LOSS_RECOVERY POWER_LOSS_PIN POWER_LOSS_STATE POWER_LOSS_RECOVER_ZHOME \ SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL opt_add DEBUG_POWER_LOSS_RECOVERY From c6e82160e41196d6ca679a5dd89b777423f15548 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 06:03:36 -0600 Subject: [PATCH 1092/1370] POWER_LOSS_ZHOME_POS followup --- Marlin/src/feature/powerloss.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 7413b5bd56..1bb3a7e915 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -393,8 +393,8 @@ void PrintJobRecovery::resume() { #ifdef POWER_LOSS_ZHOME_POS // If defined move to a safe Z homing position that avoids the print - constexpr xy_pos_t homepos = POWER_LOSS_ZHOME_POS; - sprintf_P(cmd, PSTR("G1 X%s Y%s F1000\nG28Z", dtostrf(homepos.x, 1, 3, str_1), dtostrf(homepos.y, 1, 3, str_2))); + constexpr xy_pos_t p = POWER_LOSS_ZHOME_POS; + sprintf_P(cmd, PSTR("G1 X%s Y%s F1000\nG28Z"), dtostrf(p.x, 1, 3, str_1), dtostrf(p.y, 1, 3, str_2)); gcode.process_subcommands_now(cmd); #endif From 7eace53eb703bad12c8a82e7602e7ed782b46340 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 06:15:06 -0600 Subject: [PATCH 1093/1370] Fewer warnings --- Marlin/src/HAL/LPC1768/inc/Conditionals_post.h | 1 - Marlin/src/module/printcounter.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h index 94e4ce1341..be574a96e4 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h @@ -30,6 +30,5 @@ // LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785) // TODO: Which other boards are incompatible? #if defined(MCU_LPC1768) && PRINTCOUNTER_SAVE_INTERVAL > 0 - #warning "To prevent step loss, motion will pause for PRINTCOUNTER auto-save." #define PRINTCOUNTER_SYNC 1 #endif diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 1caaee352a..2728b8d5a9 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -43,6 +43,7 @@ Stopwatch print_job_timer; // Global Print Job Timer instance #if PRINTCOUNTER_SYNC #include "../module/planner.h" + #warning "To prevent step loss, motion will pause for PRINTCOUNTER auto-save." #endif // Service intervals From f3db2551a6c1b32ba4a694f2ff81e23ba298165c Mon Sep 17 00:00:00 2001 From: MoellerDi Date: Mon, 1 Mar 2021 15:03:41 +0100 Subject: [PATCH 1094/1370] G-code Digital Buttons (#18389) Co-Authored-By: android444 <24375898+android444@users.noreply.github.com> Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 31 ++++++ Marlin/src/MarlinCore.cpp | 179 ++++++++++++++++++++++++++++++- Marlin/src/pins/pinsDebug_list.h | 75 +++++++++++++ 3 files changed, 284 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 9032f4d2d8..8bbc50bee4 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3369,6 +3369,37 @@ #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro #endif +/** + * User-defined buttons to run custom G-code. + * Up to 25 may be defined. + */ +//#define CUSTOM_USER_BUTTONS +#if ENABLED(CUSTOM_USER_BUTTONS) + //#define BUTTON1_PIN -1 + #if PIN_EXISTS(BUTTON1_PIN) + #define BUTTON1_HIT_STATE LOW // State of the triggered button. NC=LOW. NO=HIGH. + #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing? + #define BUTTON1_GCODE "G28" + #define BUTTON1_DESC "Homing" // Optional string to set the LCD status + #endif + + //#define BUTTON2_PIN -1 + #if PIN_EXISTS(BUTTON2_PIN) + #define BUTTON2_HIT_STATE LOW + #define BUTTON2_WHEN_PRINTING false + #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + #define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL + #endif + + //#define BUTTON3_PIN -1 + #if PIN_EXISTS(BUTTON3_PIN) + #define BUTTON3_HIT_STATE LOW + #define BUTTON3_WHEN_PRINTING false + #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + #define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL + #endif +#endif + /** * User-defined menu items to run custom G-code. * Up to 25 may be defined, but the actual number is LCD-dependent. diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 751d098606..689650c6ab 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -406,6 +406,7 @@ void startOrResumeJob() { * - Check if CHDK_PIN needs to go LOW * - Check for KILL button held down * - Check for HOME button held down + * - Check for CUSTOM USER button held down * - Check if cooling fan needs to be switched on * - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT) * - Pulse FET_SAFETY_PIN if it exists @@ -498,6 +499,102 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { } #endif + #if ENABLED(CUSTOM_USER_BUTTONS) + // Handle a custom user button if defined + const bool printer_not_busy = !printingIsActive(); + #define HAS_CUSTOM_USER_BUTTON(N) (PIN_EXISTS(BUTTON##N) && defined(BUTTON##N##_HIT_STATE) && defined(BUTTON##N##_GCODE) && defined(BUTTON##N##_DESC)) + #define CHECK_CUSTOM_USER_BUTTON(N) do{ \ + constexpr millis_t CUB_DEBOUNCE_DELAY_##N = 250UL; \ + static millis_t next_cub_ms_##N; \ + if (BUTTON##N##_HIT_STATE == READ(BUTTON##N##_PIN) \ + && (ENABLED(BUTTON##N##_WHEN_PRINTING) || printer_not_busy)) { \ + const millis_t ms = millis(); \ + if (ELAPSED(ms, next_cub_ms_##N)) { \ + next_cub_ms_##N = ms + CUB_DEBOUNCE_DELAY_##N; \ + if (strlen(BUTTON##N##_DESC)) \ + LCD_MESSAGEPGM_P(PSTR(BUTTON##N##_DESC)); \ + queue.inject_P(PSTR(BUTTON##N##_GCODE)); \ + } \ + } \ + }while(0) + + #if HAS_CUSTOM_USER_BUTTON(1) + CHECK_CUSTOM_USER_BUTTON(1); + #endif + #if HAS_CUSTOM_USER_BUTTON(2) + CHECK_CUSTOM_USER_BUTTON(2); + #endif + #if HAS_CUSTOM_USER_BUTTON(3) + CHECK_CUSTOM_USER_BUTTON(3); + #endif + #if HAS_CUSTOM_USER_BUTTON(4) + CHECK_CUSTOM_USER_BUTTON(4); + #endif + #if HAS_CUSTOM_USER_BUTTON(5) + CHECK_CUSTOM_USER_BUTTON(5); + #endif + #if HAS_CUSTOM_USER_BUTTON(6) + CHECK_CUSTOM_USER_BUTTON(6); + #endif + #if HAS_CUSTOM_USER_BUTTON(7) + CHECK_CUSTOM_USER_BUTTON(7); + #endif + #if HAS_CUSTOM_USER_BUTTON(8) + CHECK_CUSTOM_USER_BUTTON(8); + #endif + #if HAS_CUSTOM_USER_BUTTON(9) + CHECK_CUSTOM_USER_BUTTON(9); + #endif + #if HAS_CUSTOM_USER_BUTTON(10) + CHECK_CUSTOM_USER_BUTTON(10); + #endif + #if HAS_CUSTOM_USER_BUTTON(11) + CHECK_CUSTOM_USER_BUTTON(11); + #endif + #if HAS_CUSTOM_USER_BUTTON(12) + CHECK_CUSTOM_USER_BUTTON(12); + #endif + #if HAS_CUSTOM_USER_BUTTON(13) + CHECK_CUSTOM_USER_BUTTON(13); + #endif + #if HAS_CUSTOM_USER_BUTTON(14) + CHECK_CUSTOM_USER_BUTTON(14); + #endif + #if HAS_CUSTOM_USER_BUTTON(15) + CHECK_CUSTOM_USER_BUTTON(15); + #endif + #if HAS_CUSTOM_USER_BUTTON(16) + CHECK_CUSTOM_USER_BUTTON(16); + #endif + #if HAS_CUSTOM_USER_BUTTON(17) + CHECK_CUSTOM_USER_BUTTON(17); + #endif + #if HAS_CUSTOM_USER_BUTTON(18) + CHECK_CUSTOM_USER_BUTTON(18); + #endif + #if HAS_CUSTOM_USER_BUTTON(19) + CHECK_CUSTOM_USER_BUTTON(19); + #endif + #if HAS_CUSTOM_USER_BUTTON(20) + CHECK_CUSTOM_USER_BUTTON(20); + #endif + #if HAS_CUSTOM_USER_BUTTON(21) + CHECK_CUSTOM_USER_BUTTON(21); + #endif + #if HAS_CUSTOM_USER_BUTTON(22) + CHECK_CUSTOM_USER_BUTTON(22); + #endif + #if HAS_CUSTOM_USER_BUTTON(23) + CHECK_CUSTOM_USER_BUTTON(23); + #endif + #if HAS_CUSTOM_USER_BUTTON(24) + CHECK_CUSTOM_USER_BUTTON(24); + #endif + #if HAS_CUSTOM_USER_BUTTON(25) + CHECK_CUSTOM_USER_BUTTON(25); + #endif + #endif + TERN_(USE_CONTROLLER_FAN, controllerFan.update()); // Check if fan should be turned on to cool stepper drivers down TERN_(AUTO_POWER_CONTROL, powerManager.check()); @@ -857,7 +954,7 @@ inline void tmc_standby_setup() { /** * Marlin entry-point: Set up before the program loop - * - Set up the kill pin, filament runout, power hold + * - Set up the kill pin, filament runout, power hold, custom user buttons * - Start the serial port * - Print startup messages and diagnostics * - Get EEPROM or default settings @@ -1131,6 +1228,86 @@ void setup() { SET_INPUT_PULLUP(HOME_PIN); #endif + #if ENABLED(CUSTOM_USER_BUTTONS) + #define INIT_CUSTOM_USER_BUTTON_PIN(N) do{ SET_INPUT(BUTTON##N##_PIN); WRITE(BUTTON##N##_PIN, !BUTTON##N##_HIT_STATE); }while(0) + + #if HAS_CUSTOM_USER_BUTTON(1) + INIT_CUSTOM_USER_BUTTON_PIN(1); + #endif + #if HAS_CUSTOM_USER_BUTTON(2) + INIT_CUSTOM_USER_BUTTON_PIN(2); + #endif + #if HAS_CUSTOM_USER_BUTTON(3) + INIT_CUSTOM_USER_BUTTON_PIN(3); + #endif + #if HAS_CUSTOM_USER_BUTTON(4) + INIT_CUSTOM_USER_BUTTON_PIN(4); + #endif + #if HAS_CUSTOM_USER_BUTTON(5) + INIT_CUSTOM_USER_BUTTON_PIN(5); + #endif + #if HAS_CUSTOM_USER_BUTTON(6) + INIT_CUSTOM_USER_BUTTON_PIN(6); + #endif + #if HAS_CUSTOM_USER_BUTTON(7) + INIT_CUSTOM_USER_BUTTON_PIN(7); + #endif + #if HAS_CUSTOM_USER_BUTTON(8) + INIT_CUSTOM_USER_BUTTON_PIN(8); + #endif + #if HAS_CUSTOM_USER_BUTTON(9) + INIT_CUSTOM_USER_BUTTON_PIN(9); + #endif + #if HAS_CUSTOM_USER_BUTTON(10) + INIT_CUSTOM_USER_BUTTON_PIN(10); + #endif + #if HAS_CUSTOM_USER_BUTTON(11) + INIT_CUSTOM_USER_BUTTON_PIN(11); + #endif + #if HAS_CUSTOM_USER_BUTTON(12) + INIT_CUSTOM_USER_BUTTON_PIN(12); + #endif + #if HAS_CUSTOM_USER_BUTTON(13) + INIT_CUSTOM_USER_BUTTON_PIN(13); + #endif + #if HAS_CUSTOM_USER_BUTTON(14) + INIT_CUSTOM_USER_BUTTON_PIN(14); + #endif + #if HAS_CUSTOM_USER_BUTTON(15) + INIT_CUSTOM_USER_BUTTON_PIN(15); + #endif + #if HAS_CUSTOM_USER_BUTTON(16) + INIT_CUSTOM_USER_BUTTON_PIN(16); + #endif + #if HAS_CUSTOM_USER_BUTTON(17) + INIT_CUSTOM_USER_BUTTON_PIN(17); + #endif + #if HAS_CUSTOM_USER_BUTTON(18) + INIT_CUSTOM_USER_BUTTON_PIN(18); + #endif + #if HAS_CUSTOM_USER_BUTTON(19) + INIT_CUSTOM_USER_BUTTON_PIN(19); + #endif + #if HAS_CUSTOM_USER_BUTTON(20) + INIT_CUSTOM_USER_BUTTON_PIN(20); + #endif + #if HAS_CUSTOM_USER_BUTTON(21) + INIT_CUSTOM_USER_BUTTON_PIN(21); + #endif + #if HAS_CUSTOM_USER_BUTTON(22) + INIT_CUSTOM_USER_BUTTON_PIN(22); + #endif + #if HAS_CUSTOM_USER_BUTTON(23) + INIT_CUSTOM_USER_BUTTON_PIN(23); + #endif + #if HAS_CUSTOM_USER_BUTTON(24) + INIT_CUSTOM_USER_BUTTON_PIN(24); + #endif + #if HAS_CUSTOM_USER_BUTTON(25) + INIT_CUSTOM_USER_BUTTON_PIN(25); + #endif + #endif + #if PIN_EXISTS(STAT_LED_RED) OUT_WRITE(STAT_LED_RED_PIN, LOW); // OFF #endif diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 79a67c34f8..42095fa926 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -183,6 +183,81 @@ #if PIN_EXISTS(JOY_EN) REPORT_NAME_DIGITAL(__LINE__, JOY_EN_PIN) #endif +#if PIN_EXISTS(BUTTON1) + REPORT_NAME_DIGITAL(__LINE__, BUTTON1_PIN) +#endif +#if PIN_EXISTS(BUTTON2) + REPORT_NAME_DIGITAL(__LINE__, BUTTON2_PIN) +#endif +#if PIN_EXISTS(BUTTON3) + REPORT_NAME_DIGITAL(__LINE__, BUTTON3_PIN) +#endif +#if PIN_EXISTS(BUTTON4) + REPORT_NAME_DIGITAL(__LINE__, BUTTON4_PIN) +#endif +#if PIN_EXISTS(BUTTON5) + REPORT_NAME_DIGITAL(__LINE__, BUTTON5_PIN) +#endif +#if PIN_EXISTS(BUTTON6) + REPORT_NAME_DIGITAL(__LINE__, BUTTON6_PIN) +#endif +#if PIN_EXISTS(BUTTON7) + REPORT_NAME_DIGITAL(__LINE__, BUTTON7_PIN) +#endif +#if PIN_EXISTS(BUTTON8) + REPORT_NAME_DIGITAL(__LINE__, BUTTON8_PIN) +#endif +#if PIN_EXISTS(BUTTON9) + REPORT_NAME_DIGITAL(__LINE__, BUTTON9_PIN) +#endif +#if PIN_EXISTS(BUTTON10) + REPORT_NAME_DIGITAL(__LINE__, BUTTON10_PIN) +#endif +#if PIN_EXISTS(BUTTON11) + REPORT_NAME_DIGITAL(__LINE__, BUTTON11_PIN) +#endif +#if PIN_EXISTS(BUTTON12) + REPORT_NAME_DIGITAL(__LINE__, BUTTON12_PIN) +#endif +#if PIN_EXISTS(BUTTON13) + REPORT_NAME_DIGITAL(__LINE__, BUTTON13_PIN) +#endif +#if PIN_EXISTS(BUTTON14) + REPORT_NAME_DIGITAL(__LINE__, BUTTON14_PIN) +#endif +#if PIN_EXISTS(BUTTON15) + REPORT_NAME_DIGITAL(__LINE__, BUTTON15_PIN) +#endif +#if PIN_EXISTS(BUTTON16) + REPORT_NAME_DIGITAL(__LINE__, BUTTON16_PIN) +#endif +#if PIN_EXISTS(BUTTON17) + REPORT_NAME_DIGITAL(__LINE__, BUTTON17_PIN) +#endif +#if PIN_EXISTS(BUTTON18) + REPORT_NAME_DIGITAL(__LINE__, BUTTON18_PIN) +#endif +#if PIN_EXISTS(BUTTON19) + REPORT_NAME_DIGITAL(__LINE__, BUTTON19_PIN) +#endif +#if PIN_EXISTS(BUTTON20) + REPORT_NAME_DIGITAL(__LINE__, BUTTON20_PIN) +#endif +#if PIN_EXISTS(BUTTON21) + REPORT_NAME_DIGITAL(__LINE__, BUTTON21_PIN) +#endif +#if PIN_EXISTS(BUTTON22) + REPORT_NAME_DIGITAL(__LINE__, BUTTON22_PIN) +#endif +#if PIN_EXISTS(BUTTON23) + REPORT_NAME_DIGITAL(__LINE__, BUTTON23_PIN) +#endif +#if PIN_EXISTS(BUTTON24) + REPORT_NAME_DIGITAL(__LINE__, BUTTON24_PIN) +#endif +#if PIN_EXISTS(BUTTON25) + REPORT_NAME_DIGITAL(__LINE__, BUTTON25_PIN) +#endif #if PIN_EXISTS(CASE_LIGHT) REPORT_NAME_DIGITAL(__LINE__, CASE_LIGHT_PIN) #endif From b71f1e1edd44af5f199088a056c11ae48fcd02bd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 05:48:39 -0600 Subject: [PATCH 1095/1370] Better mftest order --- Marlin/src/pins/pins.h | 96 +++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 11b42b1c32..78aeaf0660 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -70,32 +70,32 @@ // #if MB(RAMPS_OLD) - #include "ramps/pins_RAMPS_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS_OLD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RAMPS_13_EFB, RAMPS_13_EEB, RAMPS_13_EFF, RAMPS_13_EEF, RAMPS_13_SF) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS_13.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RAMPS_14_EFB, RAMPS_14_EEB, RAMPS_14_EFF, RAMPS_14_EEF, RAMPS_14_SF) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RAMPS_PLUS_EFB, RAMPS_PLUS_EEB, RAMPS_PLUS_EFF, RAMPS_PLUS_EEF, RAMPS_PLUS_SF) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS_PLUS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 // // RAMPS Derivatives - ATmega1280, ATmega2560 // #elif MB(3DRAG) - #include "ramps/pins_3DRAG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_3DRAG.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8200) - #include "ramps/pins_K8200.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_K8200.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8400) - #include "ramps/pins_K8400.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_K8400.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8600) - #include "ramps/pins_K8600.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_K8600.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8800) - #include "ramps/pins_K8800.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_K8800.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(BAM_DICE) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(BAM_DICE_DUE) - #include "ramps/pins_BAM_DICE_DUE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_BAM_DICE_DUE.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MKS_BASE) #include "ramps/pins_MKS_BASE_10.h" // ATmega2560 env:mega2560 #elif MB(MKS_BASE_14) @@ -107,27 +107,27 @@ #elif MB(MKS_BASE_HEROIC) #include "ramps/pins_MKS_BASE_HEROIC.h" // ATmega2560 env:mega2560 #elif MB(MKS_GEN_13) - #include "ramps/pins_MKS_GEN_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_MKS_GEN_13.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MKS_GEN_L) - #include "ramps/pins_MKS_GEN_L.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_MKS_GEN_L.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(KFB_2) #include "ramps/pins_BIQU_KFB_2.h" // ATmega2560 env:mega2560 #elif MB(ZRIB_V20) - #include "ramps/pins_ZRIB_V20.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_ZRIB_V20.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ZRIB_V52) - #include "ramps/pins_ZRIB_V52.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_ZRIB_V52.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(FELIX2) - #include "ramps/pins_FELIX2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_FELIX2.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RIGIDBOARD) - #include "ramps/pins_RIGIDBOARD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RIGIDBOARD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RIGIDBOARD_V2) - #include "ramps/pins_RIGIDBOARD_V2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RIGIDBOARD_V2.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(SAINSMART_2IN1) - #include "ramps/pins_SAINSMART_2IN1.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_SAINSMART_2IN1.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ULTIMAKER) - #include "ramps/pins_ULTIMAKER.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_ULTIMAKER.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ULTIMAKER_OLD) - #include "ramps/pins_ULTIMAKER_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_ULTIMAKER_OLD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(AZTEEG_X3) #include "ramps/pins_AZTEEG_X3.h" // ATmega2560 env:mega2560 #elif MB(AZTEEG_X3_PRO) @@ -215,13 +215,13 @@ // #elif MB(CNCONTROLS_11) - #include "mega/pins_CNCONTROLS_11.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_CNCONTROLS_11.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(CNCONTROLS_12) - #include "mega/pins_CNCONTROLS_12.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_CNCONTROLS_12.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(CNCONTROLS_15) - #include "mega/pins_CNCONTROLS_15.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_CNCONTROLS_15.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MIGHTYBOARD_REVE) - #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext + #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega2560, ATmega1280 env:mega2560ext env:mega1280 #elif MB(CHEAPTRONIC) #include "mega/pins_CHEAPTRONIC.h" // ATmega2560 env:mega2560 #elif MB(CHEAPTRONIC_V2) @@ -235,13 +235,13 @@ #elif MB(ELEFU_3) #include "mega/pins_ELEFU_3.h" // ATmega2560 env:mega2560 #elif MB(LEAPFROG) - #include "mega/pins_LEAPFROG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_LEAPFROG.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MEGACONTROLLER) #include "mega/pins_MEGACONTROLLER.h" // ATmega2560 env:mega2560 #elif MB(GT2560_REV_A) - #include "mega/pins_GT2560_REV_A.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_GT2560_REV_A.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(GT2560_REV_A_PLUS) - #include "mega/pins_GT2560_REV_A_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_GT2560_REV_A_PLUS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(GT2560_V3) #include "mega/pins_GT2560_V3.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V3_MC2) @@ -249,7 +249,7 @@ #elif MB(GT2560_V3_A20) #include "mega/pins_GT2560_V3_A20.h" // ATmega2560 env:mega2560 #elif MB(EINSTART_S) - #include "mega/pins_EINSTART-S.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext + #include "mega/pins_EINSTART-S.h" // ATmega2560, ATmega1280 env:mega2560ext env:mega1280 #elif MB(WANHAO_ONEPLUS) #include "mega/pins_WANHAO_ONEPLUS.h" // ATmega2560 env:mega2560 #elif MB(OVERLORD) @@ -281,27 +281,27 @@ // #elif MB(SANGUINOLOLU_11) - #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(SANGUINOLOLU_12) - #include "sanguino/pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI) - #include "sanguino/pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI_V2) - #include "sanguino/pins_MELZI_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI_V2.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI_MAKR3D) - #include "sanguino/pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI_CREALITY) - #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi env:melzi_optimized env:melzi_optiboot env:melzi_optiboot_optimized + #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi_optiboot_optimized env:melzi_optiboot env:melzi_optimized env:melzi #elif MB(MELZI_MALYAN) - #include "sanguino/pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI_TRONXY) - #include "sanguino/pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(STB_11) - #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(AZTEEG_X1) - #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(ZMIB_V2) - #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p // // Other ATmega644P, ATmega644, ATmega1284P @@ -310,19 +310,19 @@ #elif MB(GEN3_MONOLITHIC) #include "sanguino/pins_GEN3_MONOLITHIC.h" // ATmega644P env:sanguino644p #elif MB(GEN3_PLUS) - #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN6) - #include "sanguino/pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN6_DELUXE) - #include "sanguino/pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN7_CUSTOM) - #include "sanguino/pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN7_12) - #include "sanguino/pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN7_13) - #include "sanguino/pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN7_14) - #include "sanguino/pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(OMCA_A) #include "sanguino/pins_OMCA_A.h" // ATmega644 env:sanguino644p #elif MB(OMCA) @@ -330,7 +330,7 @@ #elif MB(ANET_10) #include "sanguino/pins_ANET_10.h" // ATmega1284P env:sanguino1284p env:sanguino1284p_optimized #elif MB(SETHI) - #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p // // Teensyduino - AT90USB1286, AT90USB1286P From ef57a3e5851e1120b1c98a8f92d98ee904eaf1fd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 05:39:31 -0600 Subject: [PATCH 1096/1370] build_all_examples -c -s, silent mftest --- buildroot/bin/build_all_examples | 36 +++++++++++++++++++++++++------- buildroot/bin/build_example | 2 +- buildroot/bin/mftest | 6 +++--- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/buildroot/bin/build_all_examples b/buildroot/bin/build_all_examples index 91870ab156..bce95dce88 100755 --- a/buildroot/bin/build_all_examples +++ b/buildroot/bin/build_all_examples @@ -30,24 +30,37 @@ echo "This script downloads all Configurations and builds Marlin with each one." echo "On failure the last-built configs will be left in your working copy." echo "Restore your configs with 'git checkout -f' or 'git reset --hard HEAD'." +unset BRANCH +unset FIRST_CONF +if [[ -f "$STAT_FILE" ]]; then + IFS='*' read BRANCH FIRST_CONF <"$STAT_FILE" +fi + # If -c is given start from the last attempted build if [[ $1 == '-c' ]]; then - if [[ -f "$STAT_FILE" ]]; then - read BRANCH FIRST_CONF <"$STAT_FILE" - else + if [[ -z $BRANCH || -z $FIRST_CONF ]]; then echo "Nothing to continue" exit fi +elif [[ $1 == '-s' ]]; then + if [[ -n $BRANCH && -n $FIRST_CONF ]]; then + SKIP_CONF=1 + else + echo "Nothing to skip" + exit + fi else BRANCH=${1:-"import-2.0.x"} FIRST_CONF=$2 fi # Check if the current repository has unmerged changes -if [[ -z "$FIRST_CONF" ]]; then - git diff --quiet || { echo "The working copy is modified. Commit or stash changes before proceeding."; exit ; } -else +if [[ $SKIP_CONF ]]; then + echo "Skipping $FIRST_CONF" +elif [[ $FIRST_CONF ]]; then echo "Resuming from $FIRST_CONF" +else + git diff --quiet || { echo "The working copy is modified. Commit or stash changes before proceeding."; exit ; } fi # Create a temporary folder inside .pio @@ -67,12 +80,19 @@ shopt -s nullglob IFS=' ' CONF_TREE=$( ls -d "$TMP"/config/examples/*/ "$TMP"/config/examples/*/*/ "$TMP"/config/examples/*/*/*/ "$TMP"/config/examples/*/*/*/*/ | grep -vE ".+\.(\w+)$" ) +DOSKIP=0 for CONF in $CONF_TREE ; do + # Get a config's directory name DIR=$( echo $CONF | sed "s|$TMP/config/examples/||" ) - [[ ! -z $FIRST_CONF ]] && [[ $FIRST_CONF != $DIR && "$FIRST_CONF/" != $DIR ]] && continue + # If looking for a config, skip others + [[ $FIRST_CONF ]] && [[ $FIRST_CONF != $DIR && "$FIRST_CONF/" != $DIR ]] && continue + # Once found, stop looking unset FIRST_CONF + # If skipping, don't build the found one + [[ $SKIP_CONF ]] && { unset SKIP_CONF ; continue ; } + # ...if skipping, don't build this one compgen -G "${CONF}Con*.h" > /dev/null || continue - echo -e "$BRANCH\n$DIR" >"$STAT_FILE" + echo "${BRANCH}*${DIR}" >"$STAT_FILE" "$HERE/build_example" "internal" "$TMP" "$DIR" || { echo "Failed to build $DIR"; exit ; } done diff --git a/buildroot/bin/build_example b/buildroot/bin/build_example index 3c19b7b626..8ebb58f972 100755 --- a/buildroot/bin/build_example +++ b/buildroot/bin/build_example @@ -24,6 +24,6 @@ cp "$SUB"/_Statusscreen.h Marlin/ 2>/dev/null echo "Building the firmware now..." HERE=`dirname "$0"` -$HERE/mftest -a || { echo "Failed"; exit 1; } +$HERE/mftest -a -n1 || { echo "Failed"; exit 1; } echo "Success" diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 4626352f7a..00f7a2e7e0 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -105,7 +105,7 @@ if ((REBUILD)); then # Build with the last-built env [[ -f "$STATE_FILE" ]] || { errout "No previous (-r) build state found." ; exit 1 ; } read TESTENV <"$STATE_FILE" - pio run -d . -e $TESTENV + pio run -s -d . -e $TESTENV exit fi @@ -192,7 +192,7 @@ if ((AUTO_BUILD)); then pio run -t upload -e $TARGET else echo "Building environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -e $TARGET + pio run -s -e $TARGET fi exit fi @@ -307,6 +307,6 @@ fi [[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && { ((USE_MAKE)) && make tests-single-local TEST_TARGET=$TESTENV ONLY_TEST=$CHOICE - ((USE_MAKE)) || pio run -d . -e $TESTENV + ((USE_MAKE)) || pio run -s -d . -e $TESTENV echo "$TESTENV" >"$STATE_FILE" } From be8b5472615daad6a53694eb215e46c7a9377303 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 07:10:00 -0600 Subject: [PATCH 1097/1370] Fix some config builds --- Marlin/src/gcode/feature/caselight/M355.cpp | 10 ++++++---- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/motion.h | 4 +++- Marlin/src/pins/pins.h | 2 +- .../share/PlatformIO/scripts/STM32F103VE_longer.py | 1 - 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index 6634a90f46..b0d94e7cd8 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -60,10 +60,12 @@ void GcodeSuite::M355() { if (!caselight.on) SERIAL_ECHOLNPGM(STR_OFF); else { - if (TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN)))) { - SERIAL_ECHOLN(int(caselight.brightness)); - return; - } + #if CASELIGHT_USES_BRIGHTNESS + if (TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN))) { + SERIAL_ECHOLN(int(caselight.brightness)); + return; + } + #endif SERIAL_ECHOLNPGM(STR_ON); } } diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 580700bfe2..6fff80ff74 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1569,7 +1569,7 @@ void prepare_line_to_destination() { if (bump) { // Move away from the endstop by the axis HOMING_BUMP_MM if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); - do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST) : 0, false); + do_homing_move(axis, -bump, TERN(HOMING_Z_WITH_PROBE, (axis == Z_AXIS ? z_probe_fast_mm_s : 0), 0), false); #if ENABLED(DETECT_BROKEN_ENDSTOP) // Check for a broken endstop diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 2595084b4a..f784c7bf80 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -65,7 +65,9 @@ extern xyz_pos_t cartes; #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() #endif -constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST); +#if HAS_BED_PROBE + constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST); +#endif /** * Feed rates are often configured with mm/m diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 78aeaf0660..b8cf695fb5 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -255,7 +255,7 @@ #elif MB(OVERLORD) #include "mega/pins_OVERLORD.h" // ATmega2560 env:mega2560 #elif MB(HJC2560C_REV1) - #include "mega/pins_HJC2560C_REV1.h" // ATmega2560 env:mega2560 + #include "mega/pins_HJC2560C_REV2.h" // ATmega2560 env:mega2560 #elif MB(HJC2560C_REV2) #include "mega/pins_HJC2560C_REV2.h" // ATmega2560 env:mega2560 #elif MB(LEAPFROG_XEED2015) diff --git a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py index bbdfcd93b7..321dd01b8d 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py @@ -18,7 +18,6 @@ for i, flag in enumerate(env["LINKFLAGS"]): elif flag == "-T": env["LINKFLAGS"][i + 1] = custom_ld_script - # Rename ${PROGNAME}.bin and save it as 'project.bin' (No encryption on the Longer3D) def encrypt(source, target, env): firmware = open(target[0].path, "rb") From 92da7659f496afb036de67733d5ff50f0b77b23e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 19:39:43 -0600 Subject: [PATCH 1098/1370] Trust XY after Quiet Probing short sleep (#21237) --- Marlin/src/module/probe.cpp | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 7333aaa748..28c89e7a00 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -238,20 +238,32 @@ xyz_pos_t Probe::offset; // Initialized by settings.load() #if HAS_QUIET_PROBING - void Probe::set_probing_paused(const bool p) { - TERN_(PROBING_HEATERS_OFF, thermalManager.pause(p)); - TERN_(PROBING_FANS_OFF, thermalManager.set_fans_paused(p)); + #ifndef DELAY_BEFORE_PROBING + #define DELAY_BEFORE_PROBING 25 + #endif + + void Probe::set_probing_paused(const bool dopause) { + TERN_(PROBING_HEATERS_OFF, thermalManager.pause(dopause)); + TERN_(PROBING_FANS_OFF, thermalManager.set_fans_paused(dopause)); #if ENABLED(PROBING_STEPPERS_OFF) - disable_e_steppers(); - #if NONE(DELTA, HOME_AFTER_DEACTIVATE) - DISABLE_AXIS_X(); DISABLE_AXIS_Y(); - #endif + IF_DISABLED(DELTA, static uint8_t old_trusted); + if (dopause) { + #if DISABLED(DELTA) + old_trusted = axis_trusted; + DISABLE_AXIS_X(); + DISABLE_AXIS_Y(); + #endif + disable_e_steppers(); + } + else { + #if DISABLED(DELTA) + if (TEST(old_trusted, X_AXIS)) ENABLE_AXIS_X(); + if (TEST(old_trusted, Y_AXIS)) ENABLE_AXIS_Y(); + #endif + axis_trusted = old_trusted; + } #endif - if (p) safe_delay(25 - #if DELAY_BEFORE_PROBING > 25 - - 25 + DELAY_BEFORE_PROBING - #endif - ); + if (dopause) safe_delay(_MAX(DELAY_BEFORE_PROBING, 25)); } #endif // HAS_QUIET_PROBING From 0e61b4a98240848c00e99b2c7007cfbe00bf65ce Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Wed, 3 Mar 2021 10:58:42 +0800 Subject: [PATCH 1099/1370] Fix MKS H43 compile (#21240) --- .../lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 16 ++++++++++++---- .../lcd/extui/lib/dgus/mks/DGUSScreenHandler.h | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 6cbc534110..bdd702b1d7 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -49,12 +49,18 @@ #include "../../../../../feature/powerloss.h" #endif +#if ENABLED(SDSUPPORT) + static ExtUI::FileList filelist; +#endif + bool DGUSAutoTurnOff = false; uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS // endianness swap uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } +#if 0 + void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4) { dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); @@ -76,6 +82,8 @@ void DGUSScreenHandler::sendinfoscreen_mks(const void* line1, const void* line2, DGUSScreenHandler::sendinfoscreen_ch_mks((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); } +#endif + void DGUSScreenHandler::DGUSLCD_SendFanToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); @@ -256,7 +264,7 @@ void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { void DGUSScreenHandler::SDPrintingFinished() { if (DGUSAutoTurnOff) { - while (queue.length) queue.advance(); + while(!queue.ring_buffer.empty()) queue.advance(); gcode.process_subcommands_now_P(PSTR("M81")); } GotoScreen(MKSLCD_SCREEN_PrintDone); @@ -786,7 +794,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPAIR("QUEUE LEN:", queue.length); - if (!print_job_timer.isPaused() && queue.length >= BUFSIZE) + if (!print_job_timer.isPaused() && queue.ring_buffer.full(1)) return; char axiscode; @@ -1778,7 +1786,7 @@ void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { dgusdisplay.WriteVariable(VP_PrintAcc_Dis, PrintAcc_buf_en, 32, true); const char FAN_Speed_buf_en[] = "FAN_Speed"; - dgusdisplay.WriteVariable(VP_FAN_Speed_Dis, FAN_Speed_buf_en, 32, true); + dgusdisplay.WriteVariable(VP_Fan_Speed_Dis, FAN_Speed_buf_en, 32, true); const char Printing_buf_en[] = "Printing"; dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_en, 32, true); @@ -2033,7 +2041,7 @@ void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { dgusdisplay.WriteVariable(VP_PrintAcc_Dis, PrintAcc_buf_ch, 16, true); const uint16_t FAN_Speed_buf_ch[] = { 0xE7B7, 0xC8C9, 0xD9CB, 0xC8B6, 0x2000 }; - dgusdisplay.WriteVariable(VP_FAN_Speed_Dis, FAN_Speed_buf_ch, 16, true); + dgusdisplay.WriteVariable(VP_Fan_Speed_Dis, FAN_Speed_buf_ch, 16, true); const uint16_t Printing_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_ch, 16, true); diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index 4d6e985d84..15e232e413 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -41,9 +41,11 @@ public: static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + #if 0 static void sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4); static void sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) ; static void sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4,uint16_t language); + #endif // "M117" Message -- msg is a RAM ptr. static void setstatusmessage(const char* msg); From c4fe07275197f758e05e85170cb2ca140e4e7dc5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 00:15:56 -0600 Subject: [PATCH 1100/1370] Improve opt_set (etc.) used for tests --- buildroot/bin/opt_enable | 4 +- buildroot/bin/opt_set | 14 ++-- buildroot/bin/pins_set | 2 +- buildroot/tests/ARMED-tests | 3 +- buildroot/tests/BIGTREE_BTT002-tests | 8 +- buildroot/tests/BIGTREE_GTR_V1_0-tests | 58 ++++---------- .../BIGTREE_GTR_V1_0_usb_flash_drive-tests | 45 +++-------- buildroot/tests/BIGTREE_SKR_PRO-tests | 25 ++---- buildroot/tests/DUE-tests | 27 +++---- buildroot/tests/FLYF407ZG-tests | 5 +- buildroot/tests/FYSETC_F6-tests | 41 ++++------ buildroot/tests/FYSETC_S6-tests | 3 +- buildroot/tests/LERDGEX-tests | 3 +- buildroot/tests/LPC1768-tests | 23 +++--- buildroot/tests/LPC1769-tests | 18 ++--- buildroot/tests/NUCLEO_F767ZI-tests | 5 +- buildroot/tests/SAMD51_grandcentral_m4-tests | 22 ++---- buildroot/tests/STM32F070CB_malyan-tests | 3 +- buildroot/tests/STM32F103RC_btt-tests | 9 +-- buildroot/tests/STM32F103RC_btt_USB-tests | 4 +- buildroot/tests/STM32F103RC_meeb-tests | 9 +-- buildroot/tests/STM32F103RE-tests | 4 +- buildroot/tests/STM32F103RET6_creality-tests | 7 +- buildroot/tests/STM32F103RE_btt-tests | 10 +-- buildroot/tests/STM32F103RE_btt_USB-tests | 9 +-- buildroot/tests/STM32F401VE_STEVAL-tests | 3 +- buildroot/tests/esp32-tests | 23 ++---- buildroot/tests/linux_native-tests | 3 +- buildroot/tests/mega1280-tests | 16 ++-- buildroot/tests/mega2560-tests | 77 +++++-------------- buildroot/tests/mks_robin_lite-tests | 6 +- buildroot/tests/mks_robin_mini-tests | 4 +- buildroot/tests/mks_robin_nano35-tests | 4 +- buildroot/tests/mks_robin_nano35_stm32-tests | 4 +- buildroot/tests/mks_robin_pro-tests | 12 ++- buildroot/tests/rambo-tests | 71 +++++++---------- buildroot/tests/rumba32-tests | 18 ++--- buildroot/tests/sanguino1284p-tests | 6 +- buildroot/tests/teensy31-tests | 9 +-- buildroot/tests/teensy35-tests | 45 ++++------- buildroot/tests/teensy41-tests | 42 ++++------ 41 files changed, 229 insertions(+), 475 deletions(-) diff --git a/buildroot/bin/opt_enable b/buildroot/bin/opt_enable index 96686d6c68..fdcb5dae2d 100755 --- a/buildroot/bin/opt_enable +++ b/buildroot/bin/opt_enable @@ -7,7 +7,7 @@ SED=$(which gsed || which sed) for opt in "$@" ; do # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || (echo "ERROR: opt_enable Can't find ${opt}" >&2 && exit 9) done diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set index a646e09ae7..2a7a676cdc 100755 --- a/buildroot/bin/opt_set +++ b/buildroot/bin/opt_set @@ -5,8 +5,12 @@ set -e SED=$(which gsed || which sed) -# Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 -eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || -eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || -eval "echo '#define ${@}' >>Marlin/Configuration_adv.h" || -(echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) +ARGC=$# +while [[ $# > 1 ]]; do + # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 + eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + eval "echo '#define ${1} ${2}' >>Marlin/Configuration.h" || + (echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) + shift 2 +done diff --git a/buildroot/bin/pins_set b/buildroot/bin/pins_set index 87a8692aa2..860c64940f 100755 --- a/buildroot/bin/pins_set +++ b/buildroot/bin/pins_set @@ -7,5 +7,5 @@ PIN=$2 VAL=$3 SED=$(which gsed || which sed) -eval "${SED} -i '/\(\/\/\)*\(#define \+${PIN}\b\).*$/{s//\2 ${VAL}/;h};\${x;/./{x;q0};x;q9}' Marlin/src/pins/$DIR/pins_${NAM}.h" || +eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \+${PIN}\b\).*$/{s//\2 ${VAL}/;h};\${x;/./{x;q0};x;q9}' Marlin/src/pins/$DIR/pins_${NAM}.h" || (echo "ERROR: pins_set Can't find ${PIN}" >&2 && exit 9) diff --git a/buildroot/tests/ARMED-tests b/buildroot/tests/ARMED-tests index 6aa1308ca4..8764d47e84 100755 --- a/buildroot/tests/ARMED-tests +++ b/buildroot/tests/ARMED-tests @@ -11,8 +11,7 @@ set -e # restore_configs use_example_configs ArmEd -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 +opt_set X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" "$3" # clean up diff --git a/buildroot/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002-tests index 90e033e969..ba13e3eafd 100755 --- a/buildroot/tests/BIGTREE_BTT002-tests +++ b/buildroot/tests/BIGTREE_BTT002-tests @@ -10,10 +10,10 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 -opt_set SERIAL_PORT 1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 \ + SERIAL_PORT 1 \ + X_DRIVER_TYPE TMC2209 \ + Y_DRIVER_TYPE TMC2130 exec_test $1 $2 "BigTreeTech BTT002 Default Configuration plus TMC steppers" "$3" # clean up diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests index adc850db03..95a1e0acac 100755 --- a/buildroot/tests/BIGTREE_GTR_V1_0-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0-tests @@ -7,54 +7,24 @@ set -e restore_configs -opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 8 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 -opt_set TEMP_SENSOR_5 1 -opt_set TEMP_SENSOR_6 1 -opt_set TEMP_SENSOR_7 1 +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ + EXTRUDERS 8 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 TEMP_SENSOR_5 1 TEMP_SENSOR_6 1 TEMP_SENSOR_7 1 # Not necessary to enable auto-fan for all extruders to hit problematic code paths -opt_set E0_AUTO_FAN_PIN PC10 -opt_set E1_AUTO_FAN_PIN PC11 -opt_set E2_AUTO_FAN_PIN PC12 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set NEOPIXEL_PIN PF13 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING -opt_enable FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE -opt_set FIL_RUNOUT_PIN 3 -opt_set FIL_RUNOUT2_PIN 4 -opt_set FIL_RUNOUT3_PIN 5 -opt_set FIL_RUNOUT4_PIN 6 -opt_set FIL_RUNOUT5_PIN 7 -opt_set FIL_RUNOUT6_PIN 8 -opt_set FIL_RUNOUT7_PIN 9 -opt_set FIL_RUNOUT8_PIN 10 -opt_set FIL_RUNOUT4_STATE HIGH -opt_enable FIL_RUNOUT4_PULLUP -opt_set FIL_RUNOUT8_STATE HIGH -opt_enable FIL_RUNOUT8_PULLUP -exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" "$3" +opt_set E0_AUTO_FAN_PIN PC10 E1_AUTO_FAN_PIN PC11 E2_AUTO_FAN_PIN PC12 NEOPIXEL_PIN PF13 \ + X_DRIVER_TYPE TMC2208 Y_DRIVER_TYPE TMC2130 \ + FIL_RUNOUT_PIN 3 FIL_RUNOUT2_PIN 4 FIL_RUNOUT3_PIN 5 FIL_RUNOUT4_PIN 6 FIL_RUNOUT5_PIN 7 FIL_RUNOUT6_PIN 8 FIL_RUNOUT7_PIN 9 FIL_RUNOUT8_PIN 10 \ + FIL_RUNOUT4_STATE HIGH FIL_RUNOUT8_STATE HIGH +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE \ + FILAMENT_RUNOUT_SENSOR FIL_RUNOUT4_PULLUP FIL_RUNOUT8_PULLUP +exec_test $1 $2 "BigTreeTech GTR | 8 Extruders | Auto-Fan | Mixed TMC Drivers | Runout Sensors w/ distinct states" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 6 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 -opt_set TEMP_SENSOR_5 1 -opt_set NUM_Z_STEPPER_DRIVERS 3 -opt_set DEFAULT_Kp_LIST "{ 22.2, 20.0, 21.0, 19.0, 18.0, 17.0 }" -opt_set DEFAULT_Ki_LIST "{ 1.08 }" -opt_set DEFAULT_Kd_LIST "{ 114.0, 112.0, 110.0, 108.0 }" +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ + EXTRUDERS 6 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 TEMP_SENSOR_5 1 \ + NUM_Z_STEPPER_DRIVERS 3 \ + DEFAULT_Kp_LIST '{ 22.2, 20.0, 21.0, 19.0, 18.0, 17.0 }' DEFAULT_Ki_LIST '{ 1.08 }' DEFAULT_Kd_LIST '{ 114.0, 112.0, 110.0, 108.0 }' opt_enable TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_MIGRATION_FEATURE TOOLCHANGE_FS_INIT_BEFORE_SWAP TOOLCHANGE_FS_PRIME_FIRST_USED PID_PARAMS_PER_HOTEND -exec_test $1 $2 "BigTreeTech GTR 6 Extruders Triple Z" "$3" +exec_test $1 $2 "BigTreeTech GTR | 6 Extruders | Triple Z" "$3" # clean up restore_configs diff --git a/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests index 0504fc1da9..197ece5dfd 100755 --- a/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests @@ -7,41 +7,18 @@ set -e restore_configs -opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 -opt_set SERIAL_PORT 3 -opt_set EXTRUDERS 8 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 -opt_set TEMP_SENSOR_5 1 -opt_set TEMP_SENSOR_6 1 -opt_set TEMP_SENSOR_7 1 -opt_set SDSUPPORT -opt_set USB_FLASH_DRIVE_SUPPORT -opt_set USE_OTG_USB_HOST +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT 3 \ + EXTRUDERS 8 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 TEMP_SENSOR_5 1 TEMP_SENSOR_6 1 TEMP_SENSOR_7 1 +opt_enable SDSUPPORT USB_FLASH_DRIVE_SUPPORT USE_OTG_USB_HOST \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING \ + FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE # Not necessary to enable auto-fan for all extruders to hit problematic code paths -opt_set E0_AUTO_FAN_PIN PC10 -opt_set E1_AUTO_FAN_PIN PC11 -opt_set E2_AUTO_FAN_PIN PC12 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set NEOPIXEL_PIN PF13 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING -opt_enable FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE -opt_set FIL_RUNOUT_PIN 3 -opt_set FIL_RUNOUT2_PIN 4 -opt_set FIL_RUNOUT3_PIN 5 -opt_set FIL_RUNOUT4_PIN 6 -opt_set FIL_RUNOUT5_PIN 7 -opt_set FIL_RUNOUT6_PIN 8 -opt_set FIL_RUNOUT7_PIN 9 -opt_set FIL_RUNOUT8_PIN 10 -opt_set FIL_RUNOUT4_STATE HIGH -opt_enable FIL_RUNOUT4_PULLUP -opt_set FIL_RUNOUT8_STATE HIGH -opt_enable FIL_RUNOUT8_PULLUP -exec_test $1 $2 "BigTreeTech GTR + OTG USB Flash Drive + Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" "$3" +opt_set E0_AUTO_FAN_PIN PC10 E1_AUTO_FAN_PIN PC11 E2_AUTO_FAN_PIN PC12 NEOPIXEL_PIN PF13 \ + X_DRIVER_TYPE TMC2208 Y_DRIVER_TYPE TMC2130 \ + FIL_RUNOUT_PIN 3 FIL_RUNOUT2_PIN 4 FIL_RUNOUT3_PIN 5 FIL_RUNOUT4_PIN 6 FIL_RUNOUT5_PIN 7 FIL_RUNOUT6_PIN 8 FIL_RUNOUT7_PIN 9 FIL_RUNOUT8_PIN 10 \ + FIL_RUNOUT4_STATE HIGH FIL_RUNOUT8_STATE HIGH +opt_enable FIL_RUNOUT4_PULLUP FIL_RUNOUT8_PULLUP +exec_test $1 $2 "GTT GTR | OTG USB Flash Drive | 8 Extruders | Auto-Fan | Mixed TMC Drivers | Runout Sensors (distinct)" "$3" # clean up restore_configs diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests index 8dc433deb2..74020c1b27 100755 --- a/buildroot/tests/BIGTREE_SKR_PRO-tests +++ b/buildroot/tests/BIGTREE_SKR_PRO-tests @@ -10,31 +10,22 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 -opt_set SERIAL_PORT 1 +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT 1 exec_test $1 $2 "BigTreeTech SKR Pro Default Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 3 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set E0_AUTO_FAN_PIN PC10 -opt_set E1_AUTO_FAN_PIN PC11 -opt_set E2_AUTO_FAN_PIN PC12 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ + EXTRUDERS 3 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 \ + E0_AUTO_FAN_PIN PC10 E1_AUTO_FAN_PIN PC11 E2_AUTO_FAN_PIN PC12 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING PINS_DEBUGGING exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ + CUTTER_POWER_UNIT PERCENT \ + SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER -opt_set CUTTER_POWER_UNIT PERCENT -opt_add SPINDLE_LASER_PWM_PIN HEATER_1_PIN -opt_add SPINDLE_LASER_ENA_PIN HEATER_2_PIN exec_test $1 $2 "Laser, LCD, PERCENT power unit" "$3" # clean up diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 1e22ba3370..d1601edf5a 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -7,12 +7,12 @@ set -e restore_configs -opt_set LCD_LANGUAGE bg -opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB -opt_set TEMP_SENSOR_0 -2 -opt_set TEMP_SENSOR_BED 2 -opt_set GRID_MAX_POINTS_X 16 -opt_set FANMUX0_PIN 53 +opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB \ + LCD_LANGUAGE bg \ + TEMP_SENSOR_0 -2 TEMP_SENSOR_BED 2 \ + GRID_MAX_POINTS_X 16 \ + E0_AUTO_FAN_PIN 8 FANMUX0_PIN 53 EXTRUDER_AUTO_FAN_SPEED 100 \ + TEMP_SENSOR_CHAMBER 3 TEMP_CHAMBER_PIN 6 HEATER_CHAMBER_PIN 45 opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING \ ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD REPORT_TRAMMING_MM ASSISTED_TRAMMING_WAIT_POSITION \ @@ -28,23 +28,17 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ PIDTEMPBED SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER \ PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL \ EXTENSIBLE_UI -opt_add EXTUI_EXAMPLE -opt_set E0_AUTO_FAN_PIN 8 -opt_set EXTRUDER_AUTO_FAN_SPEED 100 -opt_set TEMP_SENSOR_CHAMBER 3 -opt_add TEMP_CHAMBER_PIN 6 -opt_set HEATER_CHAMBER_PIN 45 +opt_add EXTUI_EXAMPLE exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." "$3" # # RADDS with BLTouch, ABL(B), 3 x Z auto-align # restore_configs -opt_set MOTHERBOARD BOARD_RADDS +opt_set MOTHERBOARD BOARD_RADDS NUM_Z_STEPPER_DRIVERS 3 opt_enable USE_XMAX_PLUG USE_YMAX_PLUG ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ Z_STEPPER_AUTO_ALIGN Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS Z_SAFE_HOMING #TOUCH_UI_FTDI_EVE LCD_ALEPHOBJECTS_CLCD_UI OTHER_PIN_LAYOUT -opt_set NUM_Z_STEPPER_DRIVERS 3 pins_set ramps/RAMPS X_MAX_PIN -1 pins_set ramps/RAMPS Y_MAX_PIN -1 exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" "$3" @@ -53,9 +47,6 @@ exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" # Test SWITCHING_EXTRUDER # restore_configs -opt_set LCD_LANGUAGE fi -opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF -opt_set EXTRUDERS 2 -opt_set NUM_SERVOS 1 +opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF LCD_LANGUAGE fi EXTRUDERS 2 NUM_SERVOS 1 opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER BEEP_ON_FEEDRATE_CHANGE POWER_LOSS_RECOVERY exec_test $1 $2 "RAMPS4DUE_EEF with SWITCHING_EXTRUDER, POWER_LOSS_RECOVERY" "$3" diff --git a/buildroot/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG-tests index 2c915eb48b..22dd3488c8 100755 --- a/buildroot/tests/FLYF407ZG-tests +++ b/buildroot/tests/FLYF407ZG-tests @@ -8,10 +8,7 @@ set -e # Build examples restore_configs -opt_set MOTHERBOARD BOARD_FLYF407ZG -opt_set SERIAL_PORT -1 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_FLYF407ZG SERIAL_PORT -1 X_DRIVER_TYPE TMC2208 Y_DRIVER_TYPE TMC2130 exec_test $1 $2 "FLYF407ZG Default Config with mixed TMC Drivers" "$3" # cleanup diff --git a/buildroot/tests/FYSETC_F6-tests b/buildroot/tests/FYSETC_F6-tests index e1eb6684a5..3fe59d59a1 100755 --- a/buildroot/tests/FYSETC_F6-tests +++ b/buildroot/tests/FYSETC_F6-tests @@ -18,34 +18,24 @@ exec_test $1 $2 "FYSETC F6 1.3 with DGUS" "$3" # Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 # use_example_configs delta/generic -opt_set MOTHERBOARD BOARD_FYSETC_F6_13 +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 \ + LCD_LANGUAGE ko_KR \ + X_DRIVER_TYPE L6470 Y_DRIVER_TYPE L6470 Z_DRIVER_TYPE L6470 \ + L6470_CHAIN_SCK_PIN 53 L6470_CHAIN_MISO_PIN 49 L6470_CHAIN_MOSI_PIN 40 L6470_CHAIN_SS_PIN 42 \ + 'ENABLE_RESET_L64XX_CHIPS(V)' NOOP opt_enable RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS EEPROM_CHITCHAT \ Z_PROBE_ALLEN_KEY AUTO_BED_LEVELING_UBL \ OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU -opt_set LCD_LANGUAGE ko_KR -opt_set X_DRIVER_TYPE L6470 -opt_set Y_DRIVER_TYPE L6470 -opt_set Z_DRIVER_TYPE L6470 -opt_add L6470_CHAIN_SCK_PIN 53 -opt_add L6470_CHAIN_MISO_PIN 49 -opt_add L6470_CHAIN_MOSI_PIN 40 -opt_add L6470_CHAIN_SS_PIN 42 -opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." "$3" # # Test mixed TMC config # restore_configs -opt_set MOTHERBOARD BOARD_FYSETC_F6_13 -opt_set LCD_LANGUAGE vi -opt_set LCD_LANGUAGE_2 fr -opt_set X_DRIVER_TYPE TMC2160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set Z_DRIVER_TYPE TMC2208_STANDALONE -opt_set E0_DRIVER_TYPE TMC2130 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 \ + LCD_LANGUAGE vi LCD_LANGUAGE_2 fr \ + X_DRIVER_TYPE TMC2160 Y_DRIVER_TYPE TMC5160 Z_DRIVER_TYPE TMC2208_STANDALONE E0_DRIVER_TYPE TMC2130 \ + X_MIN_ENDSTOP_INVERTING true Y_MIN_ENDSTOP_INVERTING true opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE \ MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD \ @@ -63,17 +53,14 @@ exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" "$3" # SCARA with Mixed TMC # use_example_configs SCARA/Morgan -opt_set MOTHERBOARD BOARD_FYSETC_F6_13 -opt_set LCD_LANGUAGE es +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 \ + LCD_LANGUAGE es \ + X_MAX_ENDSTOP_INVERTING false \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2130_STANDALONE E0_DRIVER_TYPE TMC2660 \ + X_HARDWARE_SERIAL Serial2 opt_enable USE_ZMIN_PLUG FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR PAUSE_BEFORE_DEPLOY_STOW \ FYSETC_242_OLED_12864 EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL Z_SAFE_HOMING \ STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD SENSORLESS_HOMING SQUARE_WAVE_STEPPING -opt_set X_MAX_ENDSTOP_INVERTING false -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130_STANDALONE -opt_set E0_DRIVER_TYPE TMC2660 -opt_add X_HARDWARE_SERIAL Serial2 exec_test $1 $2 "FYSETC_F6 | SCARA | Mixed TMC | EEPROM" "$3" # clean up diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6-tests index c7f7a16bbd..ce5442c376 100755 --- a/buildroot/tests/FYSETC_S6-tests +++ b/buildroot/tests/FYSETC_S6-tests @@ -10,8 +10,7 @@ set -e restore_configs use_example_configs FYSETC/S6 opt_enable MEATPACK -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2130 exec_test $1 $2 "FYSETC S6 Example" "$3" # cleanup diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX-tests index 7fcdb2684f..cf7dfebfea 100755 --- a/buildroot/tests/LERDGEX-tests +++ b/buildroot/tests/LERDGEX-tests @@ -10,8 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_LERDGE_X -opt_set SERIAL_PORT 1 +opt_set MOTHERBOARD BOARD_LERDGE_X SERIAL_PORT 1 exec_test $1 $2 "LERDGE X with Default Configuration" "$3" # clean up diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests index 27d2fbf3ff..a6829e85ea 100755 --- a/buildroot/tests/LPC1768-tests +++ b/buildroot/tests/LPC1768-tests @@ -14,9 +14,8 @@ set -e #exec_test $1 $2 "Default Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB +opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB NEOPIXEL_PIN P1_16 opt_enable VIKI2 SDSUPPORT SDCARD_READONLY SERIAL_PORT_2 NEOPIXEL_LED -opt_set NEOPIXEL_PIN P1_16 exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), NeoPixel" "$3" #restore_configs @@ -24,19 +23,18 @@ exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), N #exec_test $1 $2 "MKS SBASE Example Config" "$3" restore_configs -opt_set MOTHERBOARD BOARD_MKS_SBASE -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_set NUM_SERVOS 2 -opt_set SERVO_DELAY "{ 300, 300 }" +opt_set MOTHERBOARD BOARD_MKS_SBASE \ + EXTRUDERS 2 TEMP_SENSOR_1 1 \ + NUM_SERVOS 2 SERVO_DELAY '{ 300, 300 }' opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR ULTIMAKERCONTROLLER exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE" "$3" restore_configs -opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 -1 -opt_set TEMP_SENSOR_BED 5 +opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB \ + EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ + GRID_MAX_POINTS_X 16 \ + NOZZLE_TO_PROBE_OFFSET '{ 0, 0, 0 }' \ + NOZZLE_CLEAN_MIN_TEMP 170 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING SOUND_MENU_ITEM \ NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR PREHEAT_BEFORE_LEVELING G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ @@ -46,9 +44,6 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO HOST_KEEPALIVE_FEATURE HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \ SDSUPPORT SDCARD_SORT_ALPHA AUTO_REPORT_SD_STATUS EMERGENCY_PARSER -opt_set GRID_MAX_POINTS_X 16 -opt_set NOZZLE_TO_PROBE_OFFSET "{ 0, 0, 0 }" -opt_set NOZZLE_CLEAN_MIN_TEMP 170 exec_test $1 $2 "Re-ARM with NOZZLE_AS_PROBE and many features." "$3" # clean up diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index 0a61d42800..5ca7114543 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -13,17 +13,15 @@ use_example_configs Azteeg/X5GT exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 -1 -opt_set TEMP_SENSOR_BED 5 +opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD \ + EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ + GRID_MAX_POINTS_X 16 opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET LEVEL_CORNERS_USE_PROBE LEVEL_CORNERS_VERIFY_RAISED \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER -opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI and many features" "$3" #restore_configs @@ -36,17 +34,13 @@ exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI and many features" "$3" # SD_ABORT_ON_ENDSTOP_HIT ADVANCED_OK GCODE_MACROS \ # VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS \ # EXTRA_FAN_SPEED FWRETRACT MENU_ADDAUTOSTART SDCARD_SORT_ALPHA -#opt_set FAN_MIN_PWM 50 -#opt_set FAN_KICKSTART_TIME 100 -#opt_set XY_FREQUENCY_LIMIT 15 +#opt_set FAN_MIN_PWM 50 FAN_KICKSTART_TIME 100 XY_FREQUENCY_LIMIT 15 #exec_test $1 $2 "Azteeg X5 MINI WIFI Many less common options" "$3" restore_configs use_example_configs delta/generic -opt_set MOTHERBOARD BOARD_COHESION3D_REMIX -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_COHESION3D_REMIX \ + X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2130 opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT MECHANICAL_GANTRY_CALIBRATION \ TMC_USE_SW_SPI MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z HYBRID_THRESHOLD \ SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \ diff --git a/buildroot/tests/NUCLEO_F767ZI-tests b/buildroot/tests/NUCLEO_F767ZI-tests index bd5ca86970..9e23246606 100755 --- a/buildroot/tests/NUCLEO_F767ZI-tests +++ b/buildroot/tests/NUCLEO_F767ZI-tests @@ -10,11 +10,8 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_NUCLEO_F767ZI -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_NUCLEO_F767ZI SERIAL_PORT -1 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2208 opt_enable BLTOUCH Z_SAFE_HOMING SPEAKER SOFTWARE_DRIVER_ENABLE -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "Mixed timer usage" "$3" # clean up diff --git a/buildroot/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4-tests index a98929520e..92a62c9d37 100755 --- a/buildroot/tests/SAMD51_grandcentral_m4-tests +++ b/buildroot/tests/SAMD51_grandcentral_m4-tests @@ -10,20 +10,14 @@ set -e # Build with the default configurations # restore_configs -opt_set SERIAL_PORT -1 -opt_set MOTHERBOARD BOARD_AGCM4_RAMPS_144 -opt_set TEMP_SENSOR_0 11 -opt_set TEMP_SENSOR_BED 11 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set Z2_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 -opt_set RESTORE_LEVELING_AFTER_G28 false -opt_set LCD_LANGUAGE it -opt_set NUM_Z_STEPPER_DRIVERS 2 -opt_set HOMING_BUMP_MM "{ 0, 0, 0 }" -opt_set SDCARD_CONNECTION LCD +opt_set MOTHERBOARD BOARD_AGCM4_RAMPS_144 SERIAL_PORT -1 \ + TEMP_SENSOR_0 11 TEMP_SENSOR_BED 11 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 Z2_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 \ + RESTORE_LEVELING_AFTER_G28 false \ + LCD_LANGUAGE it \ + SDCARD_CONNECTION LCD \ + NUM_Z_STEPPER_DRIVERS 2 \ + HOMING_BUMP_MM '{ 0, 0, 0 }' opt_enable ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION BLTOUCH Z_MIN_PROBE_REPEATABILITY_TEST \ FILAMENT_RUNOUT_SENSOR G26_MESH_VALIDATION MESH_EDIT_GFX_OVERLAY Z_SAFE_HOMING \ EEPROM_SETTINGS NOZZLE_PARK_FEATURE SDSUPPORT SD_CHECK_AND_RETRY \ diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan-tests index eeec7e9b1f..060d707b04 100755 --- a/buildroot/tests/STM32F070CB_malyan-tests +++ b/buildroot/tests/STM32F070CB_malyan-tests @@ -7,8 +7,7 @@ set -e restore_configs -opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 SERIAL_PORT -1 exec_test $1 $2 "Malyan M200 v2 Default Config" "$3" # cleanup diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests index f500b76315..e76060aee8 100755 --- a/buildroot/tests/STM32F103RC_btt-tests +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -10,13 +10,8 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 +opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 SERIAL_PORT 1 SERIAL_PORT_2 -1 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 opt_enable PINS_DEBUGGING Z_IDLE_HEIGHT exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" diff --git a/buildroot/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB-tests index d752c87d18..8381de0ea6 100755 --- a/buildroot/tests/STM32F103RC_btt_USB-tests +++ b/buildroot/tests/STM32F103RC_btt_USB-tests @@ -10,9 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 +opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 SERIAL_PORT 1 SERIAL_PORT_2 -1 exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - Basic Configuration" "$3" # clean up diff --git a/buildroot/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb-tests index 4fcb6e8118..3a191b4e7e 100755 --- a/buildroot/tests/STM32F103RC_meeb-tests +++ b/buildroot/tests/STM32F103RC_meeb-tests @@ -10,13 +10,8 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_CCROBOT_MEEB_3DP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2208 -opt_set Z_DRIVER_TYPE TMC2208 -opt_set E0_DRIVER_TYPE TMC2208 +opt_set MOTHERBOARD BOARD_CCROBOT_MEEB_3DP SERIAL_PORT 1 SERIAL_PORT_2 -1 \ + X_DRIVER_TYPE TMC2208 Y_DRIVER_TYPE TMC2208 Z_DRIVER_TYPE TMC2208 E0_DRIVER_TYPE TMC2208 exec_test $1 $2 "MEEB_3DP - Basic Config with TMC2208 SW Serial" "$3" # clean up diff --git a/buildroot/tests/STM32F103RE-tests b/buildroot/tests/STM32F103RE-tests index 909c362d06..426f87d21b 100755 --- a/buildroot/tests/STM32F103RE-tests +++ b/buildroot/tests/STM32F103RE-tests @@ -10,9 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_STM32F103RE -opt_set EXTRUDERS 2 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_STM32F103RE SERIAL_PORT -1 EXTRUDERS 2 opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT \ PAREN_COMMENTS GCODE_MOTION_MODES SINGLENOZZLE TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_PARK \ BAUD_RATE_GCODE GCODE_MACROS NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests index 199bd6a9c2..ef020a33f1 100755 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -19,11 +19,10 @@ opt_add SDCARD_EEPROM_EMULATION exec_test $1 $2 "Ender 3 v2, SD EEPROM, w/o CLASSIC_JERK" "$3" restore_configs -opt_set SERIAL_PORT 1 -opt_set MOTHERBOARD BOARD_CREALITY_V452 +opt_set MOTHERBOARD BOARD_CREALITY_V452 SERIAL_PORT 1 opt_disable NOZZLE_TO_PROBE_OFFSET -opt_enable NOZZLE_AS_PROBE Z_SAFE_HOMING Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN -opt_enable PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE +opt_enable NOZZLE_AS_PROBE Z_SAFE_HOMING Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN \ + PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE exec_test $1 $2 "Creality V4.5.2 PROBE_ACTIVATION_SWITCH, Probe Tare" "$3" # clean up diff --git a/buildroot/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt-tests index ab8681c7f5..97d7ffec4b 100755 --- a/buildroot/tests/STM32F103RE_btt-tests +++ b/buildroot/tests/STM32F103RE_btt-tests @@ -10,12 +10,10 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Config with mixed TMC Drivers" "$3" +opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP \ + SERIAL_PORT 1 SERIAL_PORT_2 -1 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 +exec_test $1 $2 "BTT SKR E3 DIP 1.0 | Mixed TMC Drivers" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB-tests index 43162b68a4..c63a90e436 100755 --- a/buildroot/tests/STM32F103RE_btt_USB-tests +++ b/buildroot/tests/STM32F103RE_btt_USB-tests @@ -10,16 +10,11 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 +opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP SERIAL_PORT 1 SERIAL_PORT_2 -1 exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_CR6 -opt_set SERIAL_PORT -1 -opt_set SERIAL_PORT_2 2 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_BTT_SKR_CR6 SERIAL_PORT -1 SERIAL_PORT_2 2 TEMP_SENSOR_BED 1 opt_enable CR10_STOCKDISPLAY \ NOZZLE_AS_PROBE Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN Z_SAFE_HOMING \ PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE \ diff --git a/buildroot/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL-tests index d7c90e7907..1704f3d2f0 100755 --- a/buildroot/tests/STM32F401VE_STEVAL-tests +++ b/buildroot/tests/STM32F401VE_STEVAL-tests @@ -8,8 +8,7 @@ set -e # Build examples restore_configs -opt_set MOTHERBOARD BOARD_STEVAL_3DP001V1 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_STEVAL_3DP001V1 SERIAL_PORT -1 exec_test $1 $2 "STM32F401VE_STEVAL Default Config" "$3" # cleanup diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32-tests index 310eea298e..a0f79107cf 100755 --- a/buildroot/tests/esp32-tests +++ b/buildroot/tests/esp32-tests @@ -10,30 +10,19 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 +opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 TX_BUFFER_SIZE 64 \ + WIFI_SSID '"ssid"' WIFI_PWD '"password"' opt_enable WIFISUPPORT WEBSUPPORT GCODE_MACROS BAUD_RATE_GCODE M115_GEOMETRY_REPORT REPETIER_GCODE_M360 -opt_add WIFI_SSID "\"ssid\"" -opt_add WIFI_PWD "\"password\"" -opt_set TX_BUFFER_SIZE 64 exec_test $1 $2 "ESP32 with WIFISUPPORT and WEBSUPPORT" "$3" # # Build with TMC drivers using hardware serial # restore_configs -opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2208 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 -opt_set X_HARDWARE_SERIAL Serial1 -opt_set Y_HARDWARE_SERIAL Serial1 -opt_set Z_HARDWARE_SERIAL Serial1 -opt_set E0_HARDWARE_SERIAL Serial1 -opt_set X_SLAVE_ADDRESS 0 -opt_set Y_SLAVE_ADDRESS 1 -opt_set Z_SLAVE_ADDRESS 2 -opt_set E0_SLAVE_ADDRESS 3 +opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2208 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 \ + X_HARDWARE_SERIAL Serial1 Y_HARDWARE_SERIAL Serial1 Z_HARDWARE_SERIAL Serial1 E0_HARDWARE_SERIAL Serial1 \ + X_SLAVE_ADDRESS 0 Y_SLAVE_ADDRESS 1 Z_SLAVE_ADDRESS 2 E0_SLAVE_ADDRESS 3 opt_enable HOTEND_IDLE_TIMEOUT SOFTWARE_DRIVER_ENABLE exec_test $1 $2 "ESP32, TMC HW Serial, Hotend Idle" "$3" diff --git a/buildroot/tests/linux_native-tests b/buildroot/tests/linux_native-tests index 711691fb9d..0153687eac 100755 --- a/buildroot/tests/linux_native-tests +++ b/buildroot/tests/linux_native-tests @@ -10,8 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_LINUX_RAMPS -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_LINUX_RAMPS TEMP_SENSOR_BED 1 opt_enable PIDTEMPBED EEPROM_SETTINGS BAUD_RATE_GCODE exec_test $1 $2 "Linux with EEPROM" "$3" diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index 9110e9feb6..8b16b1dbc8 100755 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -16,29 +16,25 @@ set -e # Test MESH_BED_LEVELING feature, with LCD # restore_configs -opt_set LCD_LANGUAGE an +opt_set LCD_LANGUAGE an \ + POWER_MONITOR_CURRENT_PIN 14 POWER_MONITOR_VOLTAGE_PIN 15 \ + CLOSED_LOOP_ENABLE_PIN 44 CLOSED_LOOP_MOVE_COMPLETE_PIN 45 opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING \ EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ SENSORLESS_BACKOFF_MM HOMING_BACKOFF_POST_MM HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ G26_MESH_VALIDATION MESH_EDIT_MENU GCODE_QUOTED_STRINGS \ EXTERNAL_CLOSED_LOOP_CONTROLLER POWER_MONITOR_CURRENT POWER_MONITOR_VOLTAGE -opt_set POWER_MONITOR_CURRENT_PIN 14 -opt_set POWER_MONITOR_VOLTAGE_PIN 15 -opt_set CLOSED_LOOP_ENABLE_PIN 44 -opt_set CLOSED_LOOP_MOVE_COMPLETE_PIN 45 exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, Power Monitor, and LCD" "$3" # # Test DUAL_X_CARRIAGE # restore_configs -opt_set MOTHERBOARD BOARD_ZRIB_V52 -opt_set LCD_LANGUAGE pt -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 +opt_set MOTHERBOARD BOARD_ZRIB_V52 \ + LCD_LANGUAGE pt REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 \ + EXTRUDERS 2 TEMP_SENSOR_1 1 opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD -opt_set REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 exec_test $1 $2 "ZRIB_V52 | DUAL_X_CARRIAGE" "$3" # diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index d74aa30f88..d961ab4eff 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -16,17 +16,10 @@ set -e # Test a probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders # use_example_configs AnimationExample -opt_set SHOW_CUSTOM_BOOTSCREEN -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE fr -opt_set EXTRUDERS 5 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 5 -opt_set TEMP_SENSOR_3 20 -opt_set TEMP_SENSOR_4 1000 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE fr \ + EXTRUDERS 5 TEMP_SENSOR_1 1 TEMP_SENSOR_2 5 TEMP_SENSOR_3 20 TEMP_SENSOR_4 1000 TEMP_SENSOR_BED 1 opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT AUTO_REPORT_SD_STATUS SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ @@ -38,26 +31,18 @@ exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE ..." # Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language # use_example_configs AnimationExample -opt_set SHOW_CUSTOM_BOOTSCREEN -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE fr -opt_set EXTRUDERS 5 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 5 -opt_set TEMP_SENSOR_3 20 -opt_set TEMP_SENSOR_4 1000 -opt_set TEMP_SENSOR_BED 1 -opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ - SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS NO_SD_AUTOSTART \ +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE jp_kana \ + EXTRUDERS 5 TEMP_SENSOR_1 1 TEMP_SENSOR_2 5 TEMP_SENSOR_3 20 TEMP_SENSOR_4 1000 TEMP_SENSOR_BED 1 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ + LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES \ + SDSUPPORT SDCARD_SORT_ALPHA NO_SD_AUTOSTART USB_FLASH_DRIVE_SUPPORT CANCEL_OBJECTS \ + Z_PROBE_SLED AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ - LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ - BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ - Z_PROBE_SLED SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE -opt_set LCD_LANGUAGE jp_kana + NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ + SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL opt_disable SEGMENT_LEVELED_MOVES -opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL M114_DETAIL exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." "$3" @@ -65,25 +50,16 @@ exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sle # 5 runout sensors with distinct states # restore_configs -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set EXTRUDERS 5 -opt_set NUM_SERVOS 1 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO NUM_SERVOS 1 \ + EXTRUDERS 5 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 \ + NUM_RUNOUT_SENSORS 5 FIL_RUNOUT2_PIN 44 FIL_RUNOUT3_PIN 45 FIL_RUNOUT4_PIN 46 FIL_RUNOUT5_PIN 47 \ + FIL_RUNOUT3_STATE HIGH opt_enable VIKI2 BOOT_MARLIN_LOGO_ANIMATED SDSUPPORT AUTO_REPORT_SD_STATUS \ Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE \ EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULLUP -opt_set NUM_RUNOUT_SENSORS 5 -opt_set FIL_RUNOUT2_PIN 44 -opt_set FIL_RUNOUT3_PIN 45 -opt_set FIL_RUNOUT3_STATE HIGH -opt_set FIL_RUNOUT4_PIN 46 -opt_set FIL_RUNOUT5_PIN 47 exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" "$3" @@ -91,27 +67,19 @@ exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" "$3" # Mixing Extruder with 5 steppers, Greek # restore_configs -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE el_gr +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO MIXING_STEPPERS 5 LCD_LANGUAGE ru \ + NUM_RUNOUT_SENSORS E_STEPPERS FIL_RUNOUT2_PIN 16 FIL_RUNOUT3_PIN 17 FIL_RUNOUT4_PIN 4 FIL_RUNOUT5_PIN 5 opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY \ USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z \ FILAMENT_RUNOUT_SENSOR ADVANCED_PAUSE_FEATURE NOZZLE_PARK_FEATURE -opt_set MIXING_STEPPERS 5 -opt_set NUM_RUNOUT_SENSORS E_STEPPERS -opt_set FIL_RUNOUT2_PIN 16 -opt_set FIL_RUNOUT3_PIN 17 -opt_set FIL_RUNOUT4_PIN 4 -opt_set FIL_RUNOUT5_PIN 5 -opt_set LCD_LANGUAGE ru exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" # # Test SPEAKER with BOARD_BQ_ZUM_MEGA_3D and BQ_LCD_SMART_CONTROLLER # #restore_configs -#opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D -#opt_set LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 -#opt_set LCD_FEEDBACK_FREQUENCY_HZ 100 +#opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D \ +# LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 LCD_FEEDBACK_FREQUENCY_HZ 100 #opt_enable BQ_LCD_SMART_CONTROLLER SPEAKER # @@ -153,10 +121,7 @@ exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" # #restore_configs #opt_enable G3D_PANEL SDSUPPORT SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES -#opt_set SDSORT_GCODE true -#opt_set SDSORT_USES_RAM true -#opt_set SDSORT_USES_STACK true -#opt_set SDSORT_CACHE_NAMES true +#opt_set SDSORT_GCODE true SDSORT_USES_RAM true SDSORT_USES_STACK true SDSORT_CACHE_NAMES true #exec_test $1 $2 "Stuff" "$3" # # REPRAPWORLD_KEYPAD diff --git a/buildroot/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite-tests index c4be4f206d..49ef004871 100755 --- a/buildroot/tests/mks_robin_lite-tests +++ b/buildroot/tests/mks_robin_lite-tests @@ -7,10 +7,8 @@ set -e restore_configs -opt_set MOTHERBOARD BOARD_MKS_ROBIN_LITE -opt_set SERIAL_PORT 1 -opt_enable EEPROM_SETTINGS -opt_enable SDSUPPORT +opt_set MOTHERBOARD BOARD_MKS_ROBIN_LITE SERIAL_PORT 1 +opt_enable EEPROM_SETTINGS SDSUPPORT exec_test $1 $2 "Default Configuration with Fallback SD EEPROM" "$3" # cleanup diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests index 6675634f30..29baee8818 100755 --- a/buildroot/tests/mks_robin_mini-tests +++ b/buildroot/tests/mks_robin_mini-tests @@ -8,9 +8,7 @@ set -e use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_MINI -opt_set EXTRUDERS 1 -opt_set TEMP_SENSOR_1 0 +opt_set MOTHERBOARD BOARD_MKS_ROBIN_MINI EXTRUDERS 1 TEMP_SENSOR_1 0 exec_test $1 $2 "MKS Robin mini" "$3" # cleanup diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index 6e2f9f1b0c..7ab592aaa3 100755 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -49,11 +49,9 @@ exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3" # (Robin v2 nano has no FSMC interface) # use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2209 exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3" # diff --git a/buildroot/tests/mks_robin_nano35_stm32-tests b/buildroot/tests/mks_robin_nano35_stm32-tests index 696fb94069..0891744692 100755 --- a/buildroot/tests/mks_robin_nano35_stm32-tests +++ b/buildroot/tests/mks_robin_nano35_stm32-tests @@ -58,11 +58,9 @@ exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3" # (Robin v2 nano has no FSMC interface) # # use_example_configs Mks/Robin -# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 # opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 # opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 -# opt_set X_DRIVER_TYPE TMC2209 -# opt_set Y_DRIVER_TYPE TMC2209 # exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3" # cleanup diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests index 3503d0ce1f..4b38ab97b6 100755 --- a/buildroot/tests/mks_robin_pro-tests +++ b/buildroot/tests/mks_robin_pro-tests @@ -8,13 +8,11 @@ set -e use_example_configs Mks/Robin_Pro opt_enable EMERGENCY_PARSER -opt_set SERIAL_PORT 3 -opt_disable SERIAL_PORT_2 -opt_set SDCARD_CONNECTION LCD -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set TEMP_SENSOR_BED 1 -opt_disable THERMAL_PROTECTION_HOTENDS +opt_set SERIAL_PORT 3 \ + SDCARD_CONNECTION LCD \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 \ + TEMP_SENSOR_BED 1 +opt_disable SERIAL_PORT_2 THERMAL_PROTECTION_HOTENDS exec_test $1 $2 "MKS Robin Pro, TMC Drivers, no thermal protection" "$3" # cleanup diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 02ecf5d3fc..5da4eed9b4 100755 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -10,22 +10,14 @@ set -e # Lots of options - Formerly the first Mega2560 test # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 -2 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_BED 2 -opt_set TEMP_SENSOR_PROBE 1 -opt_add TEMP_PROBE_PIN 12 -opt_set TEMP_SENSOR_CHAMBER 3 -opt_add TEMP_CHAMBER_PIN 3 -opt_add HEATER_CHAMBER_PIN 45 -opt_set GRID_MAX_POINTS_X 16 -opt_set FANMUX0_PIN 53 -opt_set Z_HOME_DIR 1 -opt_enable USE_ZMAX_PLUG +opt_set MOTHERBOARD BOARD_RAMBO \ + EXTRUDERS 2 TEMP_SENSOR_0 -2 TEMP_SENSOR_1 1 TEMP_SENSOR_BED 2 \ + TEMP_SENSOR_PROBE 1 TEMP_PROBE_PIN 12 \ + TEMP_SENSOR_CHAMBER 3 TEMP_CHAMBER_PIN 3 HEATER_CHAMBER_PIN 45 \ + Z_HOME_DIR 1 GRID_MAX_POINTS_X 16 \ + FANMUX0_PIN 53 opt_disable USE_ZMIN_PLUG Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN USE_WATCHDOG -opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ +opt_enable USE_ZMAX_PLUG REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ FIX_MOUNTED_PROBE CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ @@ -50,12 +42,10 @@ exec_test $1 $2 "RAMBO | EXTRUDERS 2 | CHAR LCD + SD | FIX Probe | ABL-Linear | # Full size Rambo Dual Endstop CNC # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set EXTRUDERS 0 -opt_set TEMP_SENSOR_0 999 -opt_set DUMMY_THERMISTOR_999_VALUE 170 -opt_set DIGIPOT_MOTOR_CURRENT '{ 120, 120, 120, 120, 120 }' -opt_set LEVEL_CORNERS_LEVELING_ORDER '{ LF, RF }' +opt_set MOTHERBOARD BOARD_RAMBO \ + EXTRUDERS 0 TEMP_SENSOR_0 999 DUMMY_THERMISTOR_999_VALUE 170 \ + DIGIPOT_MOTOR_CURRENT '{ 120, 120, 120, 120, 120 }' \ + LEVEL_CORNERS_LEVELING_ORDER '{ LF, RF }' opt_enable USE_XMAX_PLUG USE_YMAX_PLUG USE_ZMAX_PLUG \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER REVERSE_ENCODER_DIRECTION SDSUPPORT EEPROM_SETTINGS \ S_CURVE_ACCELERATION X_DUAL_STEPPER_DRIVERS X_DUAL_ENDSTOPS Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS \ @@ -68,9 +58,7 @@ exec_test $1 $2 "Rambo CNC Configuration" "$3" # Rambo heated bed only # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set EXTRUDERS 0 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 0 TEMP_SENSOR_BED 1 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER exec_test $1 $2 "Rambo heated bed only" "$3" @@ -78,18 +66,18 @@ exec_test $1 $2 "Rambo heated bed only" "$3" # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_EINSY_RAMBO -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130 -opt_set E0_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_EINSY_RAMBO \ + X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2130 E0_DRIVER_TYPE TMC2130 exec_test $1 $2 "Einsy RAMBo with TMC2130" "$3" # # Test MINIRAMBO with PWM_MOTOR_CURRENT and many features # restore_configs -opt_set MOTHERBOARD BOARD_MINIRAMBO +opt_set MOTHERBOARD BOARD_MINIRAMBO \ + CONTROLLERFAN_SPEED_IDLE 128 \ + PWM_MOTOR_CURRENT '{ 1300, 1300, 1250 }' \ + I2C_SLAVE_ADDRESS 63 opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ SDSUPPORT PCA9632 SOUND_MENU_ITEM GCODE_REPEAT_MARKERS \ AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ @@ -98,23 +86,23 @@ opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CO NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE \ ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES \ PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL -opt_set CONTROLLERFAN_SPEED_IDLE 128 opt_add M100_FREE_MEMORY_DUMPER opt_add M100_FREE_MEMORY_CORRUPTOR -opt_set PWM_MOTOR_CURRENT "{ 1300, 1300, 1250 }" -opt_set I2C_SLAVE_ADDRESS 63 exec_test $1 $2 "MINIRAMBO | RRDGFSC | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." "$3" # # Test many less common options # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set TEMP_SENSOR_0 -2 -opt_set DIGIPOT_I2C_NUM_CHANNELS 5 -opt_set LCD_LANGUAGE it -opt_set MIXING_STEPPERS 2 -opt_set SERVO_DELAY "{ 300, 300, 300 }" +opt_set MOTHERBOARD BOARD_RAMBO \ + TEMP_SENSOR_0 -2 \ + DIGIPOT_I2C_NUM_CHANNELS 5 \ + LCD_LANGUAGE it \ + MIXING_STEPPERS 2 \ + SERVO_DELAY '{ 300, 300, 300 }' \ + CONTROLLER_FAN_PIN X_MAX_PIN FILWIDTH_PIN 5 \ + FAN_MIN_PWM 50 FAN_KICKSTART_TIME 100 \ + XY_FREQUENCY_LIMIT 15 opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ BABYSTEPPING BABYSTEP_DISPLAY_TOTAL FILAMENT_LCD_DISPLAY \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER MENU_ADDAUTOSTART SDSUPPORT SDCARD_SORT_ALPHA \ @@ -124,11 +112,6 @@ opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ SD_ABORT_ON_ENDSTOP_HIT HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT ADVANCED_OK M114_DETAIL \ VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS EXTRA_FAN_SPEED FWRETRACT \ USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_USE_Z_ONLY -opt_set CONTROLLER_FAN_PIN X_MAX_PIN -opt_set FAN_MIN_PWM 50 -opt_set FAN_KICKSTART_TIME 100 -opt_set XY_FREQUENCY_LIMIT 15 -opt_add FILWIDTH_PIN 5 exec_test $1 $2 "Rambo | CoreXY, Gradient Mix | Endstop Int. | Home Y > X | FW Retract ..." "$3" # clean up diff --git a/buildroot/tests/rumba32-tests b/buildroot/tests/rumba32-tests index 20a640efed..f26af33610 100755 --- a/buildroot/tests/rumba32-tests +++ b/buildroot/tests/rumba32-tests @@ -8,31 +8,23 @@ set -e # Build examples restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_V1_0 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_RUMBA32_V1_0 SERIAL_PORT -1 \ + TEMP_SENSOR_BED 1 X_DRIVER_TYPE TMC2130 opt_disable PIDTEMP opt_enable PIDTEMPBED -opt_set TEMP_SENSOR_BED 1 opt_disable THERMAL_PROTECTION_BED -opt_set X_DRIVER_TYPE TMC2130 exec_test $1 $2 "RUMBA32 V1.0 with TMC2130, PID Bed, and bed thermal protection disabled" "$3" # Build examples restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_V1_1 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_RUMBA32_V1_1 SERIAL_PORT -1 \ + TEMP_SENSOR_BED 1 X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 opt_enable PIDTEMPBED EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -opt_set TEMP_SENSOR_BED 1 -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "RUMBA32 V1.1 with TMC2130, TMC2208, PID Bed, EEPROM settings, and graphic LCD controller" "$3" # Build examples restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_MKS -opt_set SERIAL_PORT -1 -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 +opt_set MOTHERBOARD BOARD_RUMBA32_MKS SERIAL_PORT -1 X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "RUMBA32 MKS Default Config with Mixed TMC Drivers" "$3" # cleanup diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests index 55cdf418da..7c2aa61f69 100755 --- a/buildroot/tests/sanguino1284p-tests +++ b/buildroot/tests/sanguino1284p-tests @@ -10,10 +10,10 @@ set -e # Start with default configurations... # restore_configs -opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 -opt_set LCD_LANGUAGE de +opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 \ + LCD_LANGUAGE de \ + CONTROLLER_FAN_PIN 27 opt_enable MINIPANEL USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE -opt_set CONTROLLER_FAN_PIN 27 exec_test $1 $2 "Default Configuration | MINIPANAL | CONTROLLER_FAN" "$3" # diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31-tests index cf01d27461..10dde2be99 100755 --- a/buildroot/tests/teensy31-tests +++ b/buildroot/tests/teensy31-tests @@ -22,9 +22,10 @@ exec_test $1 $2 "Teensy3.1 with Zero Endstops" "$3" # Test many features together # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY31_32 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_TEENSY31_32 \ + TEMP_SENSOR_0 1 TEMP_SENSOR_BED 1 \ + I2C_SLAVE_ADDRESS 63 \ + GRID_MAX_POINTS_X 16 opt_enable EEPROM_SETTINGS FILAMENT_WIDTH_SENSOR CALIBRATION_GCODE BAUD_RATE_GCODE \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR DEBUG_LEVELING_FEATURE Z_MIN_PROBE_REPEATABILITY_TEST \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET PRINTCOUNTER SLOW_PWM_HEATERS PIDTEMPBED \ @@ -33,6 +34,4 @@ opt_enable EEPROM_SETTINGS FILAMENT_WIDTH_SENSOR CALIBRATION_GCODE BAUD_RATE_GCO ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \ PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Teensy3.1 with many features" "$3" diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests index 79998a26d3..c4d007cd62 100755 --- a/buildroot/tests/teensy35-tests +++ b/buildroot/tests/teensy35-tests @@ -14,11 +14,10 @@ exec_test $1 $2 "Teensy3.5 with default config" "$3" # Test as many features together as possible # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_1 5 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_TEENSY35_36 \ + EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ + I2C_SLAVE_ADDRESS 63 \ + GRID_MAX_POINTS_X 16 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE SOUND_MENU_ITEM \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ @@ -27,8 +26,6 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT ADVANCED_PAUSE_FEATURE ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES PARK_HEAD_ON_PAUSE \ PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Teensy3.5 with many features" "$3" # @@ -43,10 +40,9 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # Test a Servo Probe # # restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY35_36 +# opt_set MOTHERBOARD BOARD_TEENSY35_36 NUM_SERVOS 1 # opt_enable Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE \ # AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS -# opt_set NUM_SERVOS 1 # exec_test $1 $2 "Servo Probe" # # ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES @@ -59,28 +55,23 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # Test MAGNETIC_PARKING_EXTRUDER with LCD # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_enable MAGNETIC_PARKING_EXTRUDER ULTIMAKERCONTROLLER +opt_set MOTHERBOARD BOARD_TEENSY35_36 EXTRUDERS 2 TEMP_SENSOR_1 1 SOL0_PIN 29 +opt_enable PARKING_EXTRUDER ULTIMAKERCONTROLLER exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" "$3" # # Mixing Extruder # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_set MOTHERBOARD BOARD_TEENSY35_36 MIXING_STEPPERS 2 opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -opt_set MIXING_STEPPERS 2 exec_test $1 $2 "Mixing Extruder" "$3" # # Test SWITCHING_EXTRUDER # # restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY35_36 -# opt_set EXTRUDERS 2 -# opt_set NUM_SERVOS 1 +# opt_set MOTHERBOARD BOARD_TEENSY35_36 EXTRUDERS 2 NUM_SERVOS 1 # opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER # exec_test $1 $2 "SWITCHING_EXTRUDER" @@ -88,15 +79,11 @@ exec_test $1 $2 "Mixing Extruder" "$3" # Enable COREXY # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable COREXY -opt_set X_DRIVER_TYPE TMC5160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true -opt_add X_CS_PIN 46 -opt_add Y_CS_PIN 47 -opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +opt_set MOTHERBOARD BOARD_TEENSY35_36 \ + X_DRIVER_TYPE TMC5160 Y_DRIVER_TYPE TMC5160 \ + X_MIN_ENDSTOP_INVERTING true Y_MIN_ENDSTOP_INVERTING true \ + X_CS_PIN 46 Y_CS_PIN 47 +opt_enable COREXY USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING exec_test $1 $2 "Teensy 3.5/3.6 COREXY" "$3" # @@ -111,11 +98,9 @@ exec_test $1 $2 "Teensy 3.5/3.6 COREXZ" "$3" # Enable Dual Z with Dual Z endstops # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_set NUM_Z_STEPPER_DRIVERS 2 +opt_set MOTHERBOARD BOARD_TEENSY35_36 NUM_Z_STEPPER_DRIVERS 2 Z2_MAX_PIN 2 opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG pins_set ramps/RAMPS X_MAX_PIN -1 -opt_add Z2_MAX_PIN 2 exec_test $1 $2 "Dual Z with Dual Z endstops" "$3" # Clean up diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests index 6829045496..6074b5dc5f 100755 --- a/buildroot/tests/teensy41-tests +++ b/buildroot/tests/teensy41-tests @@ -14,11 +14,10 @@ exec_test $1 $2 "Teensy4.1 with default config" "$3" # Test as many features together as possible # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_1 5 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_TEENSY41 \ + EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ + I2C_SLAVE_ADDRESS 63 \ + GRID_MAX_POINTS_X 16 opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ @@ -28,8 +27,6 @@ opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT opt_add EXTUI_EXAMPLE -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Teensy4.1 with many features" "$3" # @@ -60,10 +57,8 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # Test MAGNETIC_PARKING_EXTRUDER with no LCD # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_set SERIAL_PORT_2 -2 +opt_set MOTHERBOARD BOARD_TEENSY41 SERIAL_PORT_2 -2 \ + EXTRUDERS 2 TEMP_SENSOR_1 1 opt_enable EEPROM_SETTINGS MAGNETIC_PARKING_EXTRUDER exec_test $1 $2 "Ethernet, EEPROM, Magnetic Parking Extruder, No LCD" "$3" @@ -71,18 +66,15 @@ exec_test $1 $2 "Ethernet, EEPROM, Magnetic Parking Extruder, No LCD" "$3" # Mixing Extruder # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 +opt_set MOTHERBOARD BOARD_TEENSY41 MIXING_STEPPERS 2 opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL -opt_set MIXING_STEPPERS 2 exec_test $1 $2 "Mixing Extruder" "$3" # # Test SWITCHING_EXTRUDER # # restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY41 -# opt_set EXTRUDERS 2 -# opt_set NUM_SERVOS 1 +# opt_set MOTHERBOARD BOARD_TEENSY41 EXTRUDERS 2 NUM_SERVOS 1 # opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER # exec_test $1 $2 "SWITCHING_EXTRUDER" "$3" @@ -90,15 +82,11 @@ exec_test $1 $2 "Mixing Extruder" "$3" # Enable COREXY # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable COREXY -opt_set X_DRIVER_TYPE TMC5160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true -opt_add X_CS_PIN 46 -opt_add Y_CS_PIN 47 -opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +opt_set MOTHERBOARD BOARD_TEENSY41 \ + X_DRIVER_TYPE TMC5160 Y_DRIVER_TYPE TMC5160 \ + X_MIN_ENDSTOP_INVERTING true Y_MIN_ENDSTOP_INVERTING true \ + X_CS_PIN 46 Y_CS_PIN 47 +opt_enable COREXY USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING exec_test $1 $2 "Teensy 4.0/4.1 COREXY" "$3" # @@ -113,11 +101,9 @@ exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" "$3" # Enable Dual Z with Dual Z endstops # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 +opt_set MOTHERBOARD BOARD_TEENSY41 NUM_Z_STEPPER_DRIVERS 2 Z2_MAX_PIN 2 opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG -opt_set NUM_Z_STEPPER_DRIVERS 2 pins_set ramps/RAMPS X_MAX_PIN -1 -opt_add Z2_MAX_PIN 2 exec_test $1 $2 "Dual Z with Dual Z endstops" "$3" # Clean up From 3c86eb18a5965cb491774b1fb5e7d745d9c48946 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 00:11:50 -0600 Subject: [PATCH 1101/1370] misc. cleanup --- Marlin/src/HAL/STM32/tft/tft_spi.cpp | 6 +++--- Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 4 ++-- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp | 6 ++++-- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp index 3cb797d5f2..32af67d158 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -207,12 +207,12 @@ void TFT_SPI::Transmit(uint16_t Data) { while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {} if (TFT_MISO_PIN != TFT_MOSI_PIN) - __HAL_SPI_CLEAR_OVRFLAG(&SPIx); /* Clear overrun flag in 2 Lines communication mode because received is not read */ + __HAL_SPI_CLEAR_OVRFLAG(&SPIx); // Clear overrun flag in 2 Lines communication mode because received is not read } void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { // Wait last dma finish, to start another - while(isBusy()) { } + while (isBusy()) { /* nada */ } DMAtx.Init.MemInc = MemoryIncrease; HAL_DMA_Init(&DMAtx); @@ -225,7 +225,7 @@ void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Coun HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(SPIx.Instance->DR), Count); __HAL_SPI_ENABLE(&SPIx); - SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ + SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); // Enable Tx DMA Request HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); Abort(); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index fd91138a4f..97149a407e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -310,7 +310,7 @@ namespace Anycubic { bool ChironTFT::ReadTFTCommand() { bool command_ready = false; - while(TFTSer.available() > 0 && command_len < MAX_CMND_LEN) { + while (TFTSer.available() > 0 && command_len < MAX_CMND_LEN) { panel_command[command_len] = TFTSer.read(); if (panel_command[command_len] == '\n') { command_ready = true; @@ -338,7 +338,7 @@ namespace Anycubic { int8_t ChironTFT::Findcmndpos(const char * buff, char q) { int8_t pos = 0; - do { if (buff[pos] == q) return pos; } while(++pos < MAX_CMND_LEN); + do { if (buff[pos] == q) return pos; } while (++pos < MAX_CMND_LEN); return -1; } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index bdd702b1d7..9fc56acf10 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -264,7 +264,7 @@ void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { void DGUSScreenHandler::SDPrintingFinished() { if (DGUSAutoTurnOff) { - while(!queue.ring_buffer.empty()) queue.advance(); + while (!queue.ring_buffer.empty()) queue.advance(); gcode.process_subcommands_now_P(PSTR("M81")); } GotoScreen(MKSLCD_SCREEN_PrintDone); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 0a8f81ea86..d32851f761 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -66,8 +66,10 @@ uint8_t sel_id = 0; //root2.rewind(); //SERIAL_ECHOLN(list_file.curDirPath); - if (curDirLever != 0) card.cd(list_file.curDirPath); - else card.cdroot(); // while(card.cdup()); + if (curDirLever != 0) + card.cd(list_file.curDirPath); + else + card.cdroot(); const uint16_t fileCnt = card.get_num_Files(); diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 95e64a0d82..79bedb9ea5 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -476,7 +476,7 @@ void ubl_map_screen() { if (position_is_reachable(xy)) break; // Found a valid point ui.encoderPosition += step_dir; // Test the next point #endif - } while(ENABLED(IS_KINEMATIC)); + } while (ENABLED(IS_KINEMATIC)); // Determine number of points to edit #if IS_KINEMATIC From 864d27d46079bb002a5ead776e056b48cf843f63 Mon Sep 17 00:00:00 2001 From: Axel Date: Wed, 3 Mar 2021 20:46:32 -0300 Subject: [PATCH 1102/1370] TPARA - 3DOF robot arm IK (#21005) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 13 +- Marlin/src/core/macros.h | 1 + Marlin/src/gcode/calibrate/G28.cpp | 10 +- Marlin/src/gcode/calibrate/M665.cpp | 26 +-- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/Conditionals_post.h | 4 +- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/module/delta.cpp | 12 +- Marlin/src/module/motion.cpp | 19 +- Marlin/src/module/motion.h | 14 ++ Marlin/src/module/scara.cpp | 272 +++++++++++++++++++++------- Marlin/src/module/scara.h | 25 ++- 12 files changed, 285 insertions(+), 117 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 46b70eb72d..018c171665 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -58,18 +58,13 @@ */ //=========================================================================== -//============================= DELTA Printer =============================== +//========================== DELTA / SCARA / TPARA ========================== //=========================================================================== -// For a Delta printer, start with one of the configuration files in the config/examples/delta directory -// from https://github.com/MarlinFirmware/Configurations/branches/all and customize for your machine. // - -//=========================================================================== -//============================= SCARA Printer =============================== -//=========================================================================== -// For a SCARA printer, start with one of the configuration files in the config/examples/SCARA directory -// from https://github.com/MarlinFirmware/Configurations/branches/all and customize for your machine. +// Download configurations from the link above and customize for your machine. +// Examples are located in config/examples/delta, .../SCARA, and .../TPARA. // +//=========================================================================== // @section info diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 9b07af3618..d7043ba523 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -104,6 +104,7 @@ #define RADIANS(d) ((d)*float(M_PI)/180.0f) #define DEGREES(r) ((r)*180.0f/float(M_PI)) #define HYPOT2(x,y) (sq(x)+sq(y)) +#define NORMSQ(x,y,z) (sq(x)+sq(y)+sq(z)) #define CIRCLE_AREA(R) (float(M_PI) * sq(float(R))) #define CIRCLE_CIRC(R) (2 * float(M_PI) * float(R)) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 430daf6ba2..9470678872 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -311,7 +311,13 @@ void GcodeSuite::G28() { TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); - #else // NOT DELTA + #elif ENABLED(AXEL_TPARA) + + constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a TPARA + + home_TPARA(); + + #else const bool homeZ = parser.seen('Z'), needX = homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(X_AXIS))), @@ -392,7 +398,7 @@ void GcodeSuite::G28() { sync_plan_position(); - #endif // !DELTA (G28) + #endif /** * Preserve DXC mode across a G28 for IDEX printers in DXC_DUPLICATION_MODE. diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp index 557204cc11..3eac54f266 100644 --- a/Marlin/src/gcode/calibrate/M665.cpp +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -40,21 +40,21 @@ * X = Alpha (Tower 1) angle trim * Y = Beta (Tower 2) angle trim * Z = Gamma (Tower 3) angle trim - * A = Alpha (Tower 1) digonal rod trim - * B = Beta (Tower 2) digonal rod trim - * C = Gamma (Tower 3) digonal rod trim + * A = Alpha (Tower 1) diagonal rod trim + * B = Beta (Tower 2) diagonal rod trim + * C = Gamma (Tower 3) diagonal rod trim */ void GcodeSuite::M665() { - if (parser.seen('H')) delta_height = parser.value_linear_units(); - if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); - if (parser.seen('R')) delta_radius = parser.value_linear_units(); - if (parser.seen('S')) delta_segments_per_second = parser.value_float(); - if (parser.seen('X')) delta_tower_angle_trim.a = parser.value_float(); - if (parser.seen('Y')) delta_tower_angle_trim.b = parser.value_float(); - if (parser.seen('Z')) delta_tower_angle_trim.c = parser.value_float(); - if (parser.seen('A')) delta_diagonal_rod_trim.a = parser.value_float(); - if (parser.seen('B')) delta_diagonal_rod_trim.b = parser.value_float(); - if (parser.seen('C')) delta_diagonal_rod_trim.c = parser.value_float(); + if (parser.seenval('H')) delta_height = parser.value_linear_units(); + if (parser.seenval('L')) delta_diagonal_rod = parser.value_linear_units(); + if (parser.seenval('R')) delta_radius = parser.value_linear_units(); + if (parser.seenval('S')) delta_segments_per_second = parser.value_float(); + if (parser.seenval('X')) delta_tower_angle_trim.a = parser.value_float(); + if (parser.seenval('Y')) delta_tower_angle_trim.b = parser.value_float(); + if (parser.seenval('Z')) delta_tower_angle_trim.c = parser.value_float(); + if (parser.seenval('A')) delta_diagonal_rod_trim.a = parser.value_float(); + if (parser.seenval('B')) delta_diagonal_rod_trim.b = parser.value_float(); + if (parser.seenval('C')) delta_diagonal_rod_trim.c = parser.value_float(); recalc_delta_settings(); } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index c8b683ecf9..4931c767b8 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -924,7 +924,7 @@ #define NORMAL_AXIS Z_AXIS #endif -#if ENABLED(MORGAN_SCARA) +#if EITHER(MORGAN_SCARA, AXEL_TPARA) #define IS_SCARA 1 #define IS_KINEMATIC 1 #elif ENABLED(DELTA) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index c800a52fb8..be04341200 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -143,7 +143,9 @@ */ #if IS_SCARA #undef SLOWDOWN - #define QUICK_HOME + #if DISABLED(AXEL_TPARA) + #define QUICK_HOME + #endif #define SCARA_PRINTABLE_RADIUS (SCARA_LINKAGE_1 + SCARA_LINKAGE_2) #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 3f7931e0b6..ca09fad054 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1227,8 +1227,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Allow only one kinematic type to be defined */ -#if MANY(DELTA, MORGAN_SCARA, COREXY, COREXZ, COREYZ, COREYX, COREZX, COREZY, MARKFORGED_XY) - #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." +#if MANY(DELTA, MORGAN_SCARA, AXEL_TPARA, COREXY, COREXZ, COREYZ, COREYX, COREZX, COREZY, MARKFORGED_XY) + #error "Please enable only one of DELTA, MORGAN_SCARA, AXEL_TPARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." #endif /** diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 93238a69e3..565c676823 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -242,9 +242,9 @@ void home_delta() { // Disable stealthChop if used. Enable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); - TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); - TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); + TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); + TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); + TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); #endif // Move all carriages together linearly until an endstop is hit. @@ -254,9 +254,9 @@ void home_delta() { // Re-enable stealthChop if used. Disable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); - TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); - TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); + TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); + TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); + TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); #endif endstops.validate_homing_move(); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 6fff80ff74..7b4d1e36b3 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -267,11 +267,15 @@ void get_cartesian_from_steppers() { #else #if IS_SCARA forward_kinematics_SCARA( - planner.get_axis_position_degrees(A_AXIS), - planner.get_axis_position_degrees(B_AXIS) + planner.get_axis_position_degrees(A_AXIS) + , planner.get_axis_position_degrees(B_AXIS) + #if ENABLED(AXEL_TPARA) + , planner.get_axis_position_degrees(C_AXIS) + #endif ); #else - cartes.set(planner.get_axis_position_mm(X_AXIS), planner.get_axis_position_mm(Y_AXIS)); + cartes.x = planner.get_axis_position_mm(X_AXIS); + cartes.y = planner.get_axis_position_mm(Y_AXIS); #endif cartes.z = planner.get_axis_position_mm(Z_AXIS); #endif @@ -1340,7 +1344,7 @@ void prepare_line_to_destination() { TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); } - #if IS_SCARA + #if EITHER(MORGAN_SCARA, MP_SCARA) // Tell the planner the axis is at 0 current_position[axis] = 0; sync_plan_position(); @@ -1490,7 +1494,7 @@ void prepare_line_to_destination() { void homeaxis(const AxisEnum axis) { - #if IS_SCARA + #if EITHER(MORGAN_SCARA, MP_SCARA) // Only Z homing (with probe) is permitted if (axis != Z_AXIS) { BUZZ(100, 880); return; } #else @@ -1732,7 +1736,8 @@ void prepare_line_to_destination() { TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) stepper.set_separate_multi_axis(false); } - #endif + + #endif // HAS_EXTRA_ENDSTOPS #ifdef TMC_HOME_PHASE // move back to homing phase if configured and capable @@ -1839,7 +1844,7 @@ void set_axis_is_at_home(const AxisEnum axis) { } #endif - #if ENABLED(MORGAN_SCARA) + #if EITHER(MORGAN_SCARA, AXEL_TPARA) scara_set_axis_is_at_home(axis); #elif ENABLED(DELTA) current_position[axis] = (axis == Z_AXIS) ? delta_height - TERN0(HAS_BED_PROBE, probe.offset.z) : base_home_pos(axis); diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index f784c7bf80..0328d015a4 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -395,8 +395,21 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == // Return true if the given point is within the printable area inline bool position_is_reachable(const float &rx, const float &ry, const float inset=0) { #if ENABLED(DELTA) + return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset + fslop); + + #elif ENABLED(AXEL_TPARA) + + const float R2 = HYPOT2(rx - TPARA_OFFSET_X, ry - TPARA_OFFSET_Y); + return ( + R2 <= sq(L1 + L2) - inset + #if MIDDLE_DEAD_ZONE_R > 0 + && R2 >= sq(float(MIDDLE_DEAD_ZONE_R)) + #endif + ); + #elif IS_SCARA + const float R2 = HYPOT2(rx - SCARA_OFFSET_X, ry - SCARA_OFFSET_Y); return ( R2 <= sq(L1 + L2) - inset @@ -404,6 +417,7 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == && R2 >= sq(float(MIDDLE_DEAD_ZONE_R)) #endif ); + #endif } diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 565a502d5b..a8a3acf0f8 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -32,26 +32,29 @@ #include "motion.h" #include "planner.h" -float delta_segments_per_second = SCARA_SEGMENTS_PER_SECOND; +#if ENABLED(AXEL_TPARA) + // For homing, as in delta + #include "planner.h" + #include "endstops.h" + #include "../lcd/marlinui.h" + #include "../MarlinCore.h" +#endif + +float delta_segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SEGMENTS_PER_SECOND); void scara_set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) current_position.z = Z_HOME_POS; else { - - /** - * SCARA homes XY at the same time - */ xyz_pos_t homeposition; LOOP_XYZ(i) homeposition[i] = base_home_pos((AxisEnum)i); - #if ENABLED(MORGAN_SCARA) // MORGAN_SCARA uses arm angles for AB home position //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); inverse_kinematics(homeposition); forward_kinematics_SCARA(delta.a, delta.b); current_position[axis] = cartes[axis]; - #else + #elif ENABLED(MP_SCARA) // MP_SCARA uses a Cartesian XY home position //DEBUG_ECHOPGM("homeposition"); //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); @@ -59,6 +62,12 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { delta.b = SCARA_OFFSET_THETA2; forward_kinematics_SCARA(delta.a, delta.b); current_position[axis] = cartes[axis]; + #elif ENABLED(AXEL_TPARA) + //DEBUG_ECHOPGM("homeposition"); + //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y, SP_Z_LBL, homeposition.z); + inverse_kinematics(homeposition); + forward_kinematics_TPARA(delta.a, delta.b, delta.c); + current_position[axis] = cartes[axis]; #endif //DEBUG_ECHOPGM("Cartesian"); @@ -67,85 +76,210 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { } } -static constexpr xy_pos_t scara_offset = { SCARA_OFFSET_X, SCARA_OFFSET_Y }; +#if EITHER(MORGAN_SCARA, MP_SCARA) -/** - * Morgan SCARA Forward Kinematics. Results in 'cartes'. - * Maths and first version by QHARLEY. - * Integrated into Marlin and slightly restructured by Joachim Cerny. - */ -void forward_kinematics_SCARA(const float &a, const float &b) { + static constexpr xy_pos_t scara_offset = { SCARA_OFFSET_X, SCARA_OFFSET_Y }; - const float a_sin = sin(RADIANS(a)) * L1, - a_cos = cos(RADIANS(a)) * L1, - b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, - b_cos = cos(RADIANS(b + TERN0(MP_SCARA, a))) * L2; + /** + * Morgan SCARA Forward Kinematics. Results in 'cartes'. + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ + void forward_kinematics_SCARA(const float &a, const float &b) { + const float a_sin = sin(RADIANS(a)) * L1, + a_cos = cos(RADIANS(a)) * L1, + b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, + b_cos = cos(RADIANS(b + TERN0(MP_SCARA, a))) * L2; - cartes.set(a_cos + b_cos + scara_offset.x, // theta - a_sin + b_sin + scara_offset.y); // phi + cartes.x = a_cos + b_cos + scara_offset.x; // theta + cartes.y = a_sin + b_sin + scara_offset.y; // phi - /* - DEBUG_ECHOLNPAIR( - "SCARA FK Angle a=", a, - " b=", b, - " a_sin=", a_sin, - " a_cos=", a_cos, - " b_sin=", b_sin, - " b_cos=", b_cos - ); - DEBUG_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); - //*/ -} + /* + DEBUG_ECHOLNPAIR( + "SCARA FK Angle a=", a, + " b=", b, + " a_sin=", a_sin, + " a_cos=", a_cos, + " b_sin=", b_sin, + " b_cos=", b_cos + ); + DEBUG_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); + //*/ + } -/** - * SCARA Inverse Kinematics. Results in 'delta'. - * - * See https://reprap.org/forum/read.php?185,283327 - * - * Maths and first version by QHARLEY. - * Integrated into Marlin and slightly restructured by Joachim Cerny. - */ -void inverse_kinematics(const xyz_pos_t &raw) { - float C2, S2, SK1, SK2, THETA, PSI; + /** + * Morgan SCARA Inverse Kinematics. Results are stored in 'delta'. + * + * See https://reprap.org/forum/read.php?185,283327 + * + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ + void inverse_kinematics(const xyz_pos_t &raw) { + float C2, S2, SK1, SK2, THETA, PSI; - // Translate SCARA to standard XY with scaling factor - const xy_pos_t spos = raw - scara_offset; + // Translate SCARA to standard XY with scaling factor + const xy_pos_t spos = raw - scara_offset; - const float H2 = HYPOT2(spos.x, spos.y); - if (L1 == L2) - C2 = H2 / L1_2_2 - 1; - else - C2 = (H2 - (L1_2 + L2_2)) / (2.0f * L1 * L2); + const float H2 = HYPOT2(spos.x, spos.y); + if (L1 == L2) + C2 = H2 / L1_2_2 - 1; + else + C2 = (H2 - (L1_2 + L2_2)) / (2.0f * L1 * L2); - LIMIT(C2, -1, 1); + LIMIT(C2, -1, 1); - S2 = SQRT(1.0f - sq(C2)); + S2 = SQRT(1.0f - sq(C2)); - // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End - SK1 = L1 + L2 * C2; + // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End + SK1 = L1 + L2 * C2; - // Rotated Arm2 gives the distance from Arm1 to Arm2 - SK2 = L2 * S2; + // Rotated Arm2 gives the distance from Arm1 to Arm2 + SK2 = L2 * S2; - // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow - THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); + // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow + THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); - // Angle of Arm2 - PSI = ATAN2(S2, C2); + // Angle of Arm2 + PSI = ATAN2(S2, C2); - delta.set(DEGREES(THETA), DEGREES(PSI + TERN0(MORGAN_SCARA, THETA)), raw.z); + delta.set(DEGREES(THETA), DEGREES(PSI + TERN0(MORGAN_SCARA, THETA)), raw.z); - /* - DEBUG_POS("SCARA IK", raw); - DEBUG_POS("SCARA IK", delta); - DEBUG_ECHOLNPAIR(" SCARA (x,y) ", sx, ",", sy, " C2=", C2, " S2=", S2, " Theta=", THETA, " Psi=", PSI); - //*/ -} + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + DEBUG_ECHOLNPAIR(" SCARA (x,y) ", sx, ",", sy, " C2=", C2, " S2=", S2, " Theta=", THETA, " Psi=", PSI); + //*/ + } + +#elif ENABLED(MP_SCARA) + + void inverse_kinematics(const xyz_pos_t &raw) { + const float x = raw.x, y = raw.y, c = HYPOT(x, y), + THETA3 = ATAN2(y, x), + THETA1 = THETA3 + ACOS((sq(c) + sq(L1) - sq(L2)) / (2.0f * c * L1)), + THETA2 = THETA3 - ACOS((sq(c) + sq(L2) - sq(L1)) / (2.0f * c * L2)); + + delta.set(DEGREES(THETA1), DEGREES(THETA2), raw.z); + + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + SERIAL_ECHOLNPAIR(" SCARA (x,y) ", x, ",", y," Theta1=", THETA1, " Theta2=", THETA2); + //*/ + } + +#elif ENABLED(AXEL_TPARA) + + static constexpr xyz_pos_t robot_offset = { TPARA_OFFSET_X, TPARA_OFFSET_Y, TPARA_OFFSET_Z }; + + // Convert ABC inputs in degrees to XYZ outputs in mm + void forward_kinematics_TPARA(const float &a, const float &b, const float &c) { + const float w = c - b, + r = L1 * cos(RADIANS(b)) + L2 * sin(RADIANS(w - (90 - b))), + x = r * cos(RADIANS(a)), + y = r * sin(RADIANS(a)), + rho2 = L1_2 + L2_2 - 2.0f * L1 * L2 * cos(RADIANS(w)); + + cartes = robot_offset + xyz_pos_t({ x, y, SQRT(rho2 - x * x - y * y) }); + } + + // Home YZ together, then X (or all at once). Based on quick_home_xy & home_delta + void home_TPARA() { + // Init the current position of all carriages to 0,0,0 + current_position.reset(); + destination.reset(); + sync_plan_position(); + + // Disable stealthChop if used. Enable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); + TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); + TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); + #endif + + // const int x_axis_home_dir = x_home_dir(active_extruder); + + // const xy_pos_t pos { max_length(X_AXIS) , max_length(Y_AXIS) }; + // const float mlz = max_length(X_AXIS), + + // Move all carriages together linearly until an endstop is hit. + //do_blocking_move_to_xy_z(pos, mlz, homing_feedrate(Z_AXIS)); + + current_position.x = 0 ; + current_position.y = 0 ; + current_position.z = max_length(Z_AXIS) ; + line_to_current_position(homing_feedrate(Z_AXIS)); + planner.synchronize(); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); + TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); + TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); + #endif + + endstops.validate_homing_move(); + + // At least one motor has reached its endstop. + // Now re-home each motor separately. + homeaxis(A_AXIS); + homeaxis(C_AXIS); + homeaxis(B_AXIS); + + + // Set all carriages to their home positions + // Do this here all at once for Delta, because + // XYZ isn't ABC. Applying this per-tower would + // give the impression that they are the same. + LOOP_XYZ(i) set_axis_is_at_home((AxisEnum)i); + + sync_plan_position(); + } + + void inverse_kinematics(const xyz_pos_t &raw) { + const xyz_pos_t spos = raw - robot_offset; + + const float RXY = SQRT(HYPOT2(spos.x, spos.y)), + RHO2 = NORMSQ(spos.x, spos.y, spos.z), + //RHO = SQRT(RHO2), + LSS = L1_2 + L2_2, + LM = 2.0f * L1 * L2, + + CG = (LSS - RHO2) / LM, + SG = SQRT(1 - POW(CG, 2)), // Method 2 + K1 = L1 - L2 * CG, + K2 = L2 * SG, + + // Angle of Body Joint + THETA = ATAN2(spos.y, spos.x), + + // Angle of Elbow Joint + //GAMMA = ACOS(CG), + GAMMA = ATAN2(SG, CG), // Method 2 + + // Angle of Shoulder Joint, elevation angle measured from horizontal (r+) + //PHI = asin(spos.z/RHO) + asin(L2 * sin(GAMMA) / RHO), + PHI = ATAN2(spos.z, RXY) + ATAN2(K2, K1), // Method 2 + + // Elbow motor angle measured from horizontal, same frame as shoulder (r+) + PSI = PHI + GAMMA; + + delta.set(DEGREES(THETA), DEGREES(PHI), DEGREES(PSI)); + + //SERIAL_ECHOLNPAIR(" SCARA (x,y,z) ", spos.x , ",", spos.y, ",", spos.z, " Rho=", RHO, " Rho2=", RHO2, " Theta=", THETA, " Phi=", PHI, " Psi=", PSI, " Gamma=", GAMMA); + } + +#endif void scara_report_positions() { - SERIAL_ECHOLNPAIR( - "SCARA Theta:", planner.get_axis_position_degrees(A_AXIS), - " Psi" TERN_(MORGAN_SCARA, "+Theta") ":", planner.get_axis_position_degrees(B_AXIS) + SERIAL_ECHOLNPAIR("SCARA Theta:", planner.get_axis_position_degrees(A_AXIS) + #if ENABLED(AXEL_TPARA) + , " Phi:", planner.get_axis_position_degrees(B_AXIS) + , " Psi:", planner.get_axis_position_degrees(C_AXIS) + #else + , " Psi" TERN_(MORGAN_SCARA, "+Theta") ":", planner.get_axis_position_degrees(B_AXIS) + #endif ); SERIAL_EOL(); } diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index e2acaf3082..d462842b57 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -29,14 +29,25 @@ extern float delta_segments_per_second; -// Float constants for SCARA calculations -float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, - L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, - L2_2 = sq(float(L2)); +#if ENABLED(AXEL_TPARA) -void scara_set_axis_is_at_home(const AxisEnum axis); + float constexpr L1 = TPARA_LINKAGE_1, L2 = TPARA_LINKAGE_2, // Float constants for Robot arm calculations + L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, + L2_2 = sq(float(L2)); + + void forward_kinematics_TPARA(const float &a, const float &b, const float &c); + void home_TPARA(); + +#else + + float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, // Float constants for SCARA calculations + L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, + L2_2 = sq(float(L2)); + + void forward_kinematics_SCARA(const float &a, const float &b); + +#endif void inverse_kinematics(const xyz_pos_t &raw); -void forward_kinematics_SCARA(const float &a, const float &b); - +void scara_set_axis_is_at_home(const AxisEnum axis); void scara_report_positions(); From d61e7dd68559d93de56e74b5cc5241193d4194a7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 17:57:24 -0600 Subject: [PATCH 1103/1370] TPARA followup --- Marlin/src/gcode/scara/M360-M364.cpp | 2 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/delta.h | 6 ++--- Marlin/src/module/motion.cpp | 6 ++--- Marlin/src/module/scara.cpp | 37 ++++++++++++++-------------- Marlin/src/module/scara.h | 4 +-- 6 files changed, 29 insertions(+), 28 deletions(-) diff --git a/Marlin/src/gcode/scara/M360-M364.cpp b/Marlin/src/gcode/scara/M360-M364.cpp index 562beee4f9..f32fa09de0 100644 --- a/Marlin/src/gcode/scara/M360-M364.cpp +++ b/Marlin/src/gcode/scara/M360-M364.cpp @@ -31,7 +31,7 @@ inline bool SCARA_move_to_cal(const uint8_t delta_a, const uint8_t delta_b) { if (IsRunning()) { - forward_kinematics_SCARA(delta_a, delta_b); + forward_kinematics(delta_a, delta_b); do_blocking_move_to_xy(cartes); return true; } diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 565c676823..9857b89bf3 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -177,7 +177,7 @@ float delta_safe_distance_from_top() { * * The result is stored in the cartes[] array. */ -void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) { +void forward_kinematics(const float &z1, const float &z2, const float &z3) { // Create a vector in old coordinates along x axis of new coordinate const float p12[3] = { delta_tower[B_AXIS].x - delta_tower[A_AXIS].x, delta_tower[B_AXIS].y - delta_tower[A_AXIS].y, z2 - z1 }, diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index 5e9a78bd86..a974da97c8 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -120,10 +120,10 @@ float delta_safe_distance_from_top(); * * The result is stored in the cartes[] array. */ -void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3); +void forward_kinematics(const float &z1, const float &z2, const float &z3); -FORCE_INLINE void forward_kinematics_DELTA(const abc_float_t &point) { - forward_kinematics_DELTA(point.a, point.b, point.c); +FORCE_INLINE void forward_kinematics(const abc_float_t &point) { + forward_kinematics(point.a, point.b, point.c); } void home_delta(); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 7b4d1e36b3..024f28dc9f 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -263,10 +263,10 @@ void sync_plan_position_e() { planner.set_e_position_mm(current_position.e); } */ void get_cartesian_from_steppers() { #if ENABLED(DELTA) - forward_kinematics_DELTA(planner.get_axis_positions_mm()); + forward_kinematics(planner.get_axis_positions_mm()); #else #if IS_SCARA - forward_kinematics_SCARA( + forward_kinematics( planner.get_axis_position_degrees(A_AXIS) , planner.get_axis_position_degrees(B_AXIS) #if ENABLED(AXEL_TPARA) @@ -949,7 +949,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { float x_home_pos(const uint8_t extruder) { if (extruder == 0) - return base_home_pos(X_AXIS); + return X_HOME_POS; else /** * In dual carriage mode the extruder offset provides an override of the diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index a8a3acf0f8..7586b8136f 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -33,10 +33,7 @@ #include "planner.h" #if ENABLED(AXEL_TPARA) - // For homing, as in delta - #include "planner.h" #include "endstops.h" - #include "../lcd/marlinui.h" #include "../MarlinCore.h" #endif @@ -46,30 +43,35 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) current_position.z = Z_HOME_POS; else { - xyz_pos_t homeposition; - LOOP_XYZ(i) homeposition[i] = base_home_pos((AxisEnum)i); #if ENABLED(MORGAN_SCARA) // MORGAN_SCARA uses arm angles for AB home position + ab_float_t homeposition = { SCARA_OFFSET_THETA1, SCARA_OFFSET_THETA2 }; //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); - inverse_kinematics(homeposition); - forward_kinematics_SCARA(delta.a, delta.b); - current_position[axis] = cartes[axis]; #elif ENABLED(MP_SCARA) // MP_SCARA uses a Cartesian XY home position + xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; //DEBUG_ECHOPGM("homeposition"); //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); - delta.a = SCARA_OFFSET_THETA1; - delta.b = SCARA_OFFSET_THETA2; - forward_kinematics_SCARA(delta.a, delta.b); - current_position[axis] = cartes[axis]; #elif ENABLED(AXEL_TPARA) + xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; //DEBUG_ECHOPGM("homeposition"); //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y, SP_Z_LBL, homeposition.z); - inverse_kinematics(homeposition); - forward_kinematics_TPARA(delta.a, delta.b, delta.c); - current_position[axis] = cartes[axis]; #endif + #if ENABLED(MORGAN_SCARA) + delta = homeposition; + #else + inverse_kinematics(homeposition); + #endif + + #if EITHER(MORGAN_SCARA, MP_SCARA) + forward_kinematics(delta.a, delta.b); + #elif ENABLED(AXEL_TPARA) + forward_kinematics(delta.a, delta.b, delta.c); + #endif + + current_position[axis] = cartes[axis]; + //DEBUG_ECHOPGM("Cartesian"); //DEBUG_ECHOLNPAIR_P(SP_X_LBL, current_position.x, SP_Y_LBL, current_position.y); update_software_endstops(axis); @@ -85,7 +87,7 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. */ - void forward_kinematics_SCARA(const float &a, const float &b) { + void forward_kinematics(const float &a, const float &b) { const float a_sin = sin(RADIANS(a)) * L1, a_cos = cos(RADIANS(a)) * L1, b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, @@ -174,7 +176,7 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { static constexpr xyz_pos_t robot_offset = { TPARA_OFFSET_X, TPARA_OFFSET_Y, TPARA_OFFSET_Z }; // Convert ABC inputs in degrees to XYZ outputs in mm - void forward_kinematics_TPARA(const float &a, const float &b, const float &c) { + void forward_kinematics(const float &a, const float &b, const float &c) { const float w = c - b, r = L1 * cos(RADIANS(b)) + L2 * sin(RADIANS(w - (90 - b))), x = r * cos(RADIANS(a)), @@ -227,7 +229,6 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { homeaxis(C_AXIS); homeaxis(B_AXIS); - // Set all carriages to their home positions // Do this here all at once for Delta, because // XYZ isn't ABC. Applying this per-tower would diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index d462842b57..5549e506b0 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -35,7 +35,7 @@ extern float delta_segments_per_second; L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, L2_2 = sq(float(L2)); - void forward_kinematics_TPARA(const float &a, const float &b, const float &c); + void forward_kinematics(const float &a, const float &b, const float &c); void home_TPARA(); #else @@ -44,7 +44,7 @@ extern float delta_segments_per_second; L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, L2_2 = sq(float(L2)); - void forward_kinematics_SCARA(const float &a, const float &b); + void forward_kinematics(const float &a, const float &b); #endif From 99eedf77b5ffd898d903f3cfed47c47043be330a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 20:41:58 -0600 Subject: [PATCH 1104/1370] Fix teensy35 tests --- buildroot/tests/teensy35-tests | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests index c4d007cd62..c9731665c5 100755 --- a/buildroot/tests/teensy35-tests +++ b/buildroot/tests/teensy35-tests @@ -55,9 +55,9 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # Test MAGNETIC_PARKING_EXTRUDER with LCD # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 EXTRUDERS 2 TEMP_SENSOR_1 1 SOL0_PIN 29 +opt_set MOTHERBOARD BOARD_TEENSY35_36 EXTRUDERS 2 TEMP_SENSOR_1 1 SOL0_PIN 29 EXTRUDERS 2 opt_enable PARKING_EXTRUDER ULTIMAKERCONTROLLER -exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" "$3" +exec_test $1 $2 "PARKING_EXTRUDER with LCD" "$3" # # Mixing Extruder From ee74cee5d468965b4ffaad8a181a140672ce16c9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 20:48:05 -0600 Subject: [PATCH 1105/1370] Parking Extruder solenoid fix/cleanup --- Marlin/src/module/tool_change.h | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 4f88ca7432..5361451c82 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -21,8 +21,7 @@ */ #pragma once -#include "../inc/MarlinConfigPre.h" -#include "../core/types.h" +#include "../inc/MarlinConfig.h" //#define DEBUG_TOOLCHANGE_MIGRATION_FEATURE @@ -80,11 +79,7 @@ #if ENABLED(PARKING_EXTRUDER) - #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) - #define PE_MAGNET_ON_STATE !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE - #else - #define PE_MAGNET_ON_STATE PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE - #endif + #define PE_MAGNET_ON_STATE TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, !)PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE void pe_solenoid_set_pin_state(const uint8_t extruder_num, const uint8_t state); From c8b73b00be179911d304f6146e58dcfabebf318d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 20:48:58 -0600 Subject: [PATCH 1106/1370] Update some py scripts --- .../PlatformIO/scripts/fysetc_cheetah_v20.py | 4 ++ .../PlatformIO/scripts/preflight-checks.py | 68 +++++++++---------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py b/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py index 10471d3753..f36d51f972 100644 --- a/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py +++ b/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py @@ -1,3 +1,7 @@ +# +# STM32F401VE_STEVAL.py +# Customizations for env:STM32F401VE_STEVAL +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index c9bbb42ab9..4c8a00e74c 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -6,41 +6,41 @@ import os,re Import("env") def get_envs_for_board(board): - if board.startswith("BOARD_"): - board = board[6:] - with open(os.path.join("Marlin", "src", "pins", "pins.h"),"r") as f: - board_found = "" - r=re.compile(r"if\s+MB\((.+)\)") - for line in f.readlines(): - mbs = r.findall(line) - if mbs: - board_found = board if board in re.split(r",\s*", mbs[0]) else "" - if board_found and "#include " in line and "env:" in line: - return re.findall(r"env:\w+", line) - return [] + if board.startswith("BOARD_"): + board = board[6:] + with open(os.path.join("Marlin", "src", "pins", "pins.h"),"r") as f: + board_found = "" + r=re.compile(r"if\s+MB\((.+)\)") + for line in f.readlines(): + mbs = r.findall(line) + if mbs: + board_found = board if board in re.split(r",\s*", mbs[0]) else "" + if board_found and "#include " in line and "env:" in line: + return re.findall(r"env:\w+", line) + return [] def check_envs(build_env, base_envs, config): - if build_env in base_envs: - return True - ext = config.get(build_env, 'extends', default=None) - if ext: - if isinstance(ext, str): - return check_envs(ext, base_envs, config) - elif isinstance(ext, list): - for ext_env in ext: - if check_envs(ext_env, base_envs, config): - return True - return False + if build_env in base_envs: + return True + ext = config.get(build_env, 'extends', default=None) + if ext: + if isinstance(ext, str): + return check_envs(ext, base_envs, config) + elif isinstance(ext, list): + for ext_env in ext: + if check_envs(ext_env, base_envs, config): + return True + return False # Sanity checks: if 'PIOENV' not in env: - raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") + raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") if 'MARLIN_FEATURES' not in env: - raise SystemExit("Error: this script should be used after common Marlin scripts") + raise SystemExit("Error: this script should be used after common Marlin scripts") if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: - raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") + raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") build_env = env['PIOENV'] motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] @@ -49,16 +49,16 @@ config = env.GetProjectConfig() result = check_envs("env:"+build_env, base_envs, config) if not result: - err = "Error: your selected build environment '%s' is not compatible with MOTHERBOARD=%s in Configuration.h. " \ - "Please use one of compatible build environments for this board: %s" % \ - (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) - raise SystemExit(err) + err = "Error: your selected build environment '%s' is not compatible with MOTHERBOARD=%s in Configuration.h. " \ + "Please use one of compatible build environments for this board: %s" % \ + (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) + raise SystemExit(err) # # Check for Config files in two common incorrect places # for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: - for f in [ "Configuration.h", "Configuration_adv.h" ]: - if os.path.isfile(os.path.join(p, f)): - err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p - raise SystemExit(err) + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p + raise SystemExit(err) From d5b09fdbf5d349c07612f6bfe8006f2fd2da1f06 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Mar 2021 03:21:15 -0600 Subject: [PATCH 1107/1370] MK2_MULTIPLEXER dependency --- platformio.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio.ini b/platformio.ini index 157b3d6201..aad59362cc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -111,6 +111,7 @@ default_src_filter = + - - + - - - - + - - - - - - - @@ -342,6 +343,7 @@ POWER_LOSS_RECOVERY = src_filter=+ + + HAS_FILAMENT_SENSOR = src_filter=+ + (EXT|MANUAL)_SOLENOID.* = src_filter=+ + +MK2_MULTIPLEXER = src_filter=+ HAS_CUTTER = src_filter=+ + EXPERIMENTAL_I2CBUS = src_filter=+ + MECHANICAL_GANTRY_CAL.+ = src_filter=+ From f187a5304b4b610810c9ee7704769b1404d610b5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Mar 2021 03:15:32 -0600 Subject: [PATCH 1108/1370] Implement G42, after all --- Marlin/src/gcode/gcode.cpp | 4 ++++ Marlin/src/gcode/gcode_d.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index d7535dd4ff..428caa5a15 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -364,6 +364,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { break; #endif + #if HAS_MESH + case 42: G42(); break; // G42: Coordinated move to a mesh point + #endif + #if ENABLED(CNC_COORDINATE_SYSTEMS) case 53: G53(); break; // G53: (prefix) Apply native workspace case 54: G54(); break; // G54: Switch to Workspace 1 diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 805dcd52ce..a683a330f1 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -165,7 +165,7 @@ case 6: // D6 Check delay loop accuracy dump_delay_accuracy_check(); - break; + break; case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) SERIAL_ECHOLNPGM("Disabling heaters and attempting to trigger Watchdog"); From c90927cf54203ee4ffcd1623fbbd6432d3feb854 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 4 Mar 2021 01:32:02 -0800 Subject: [PATCH 1109/1370] SMUFF => SMuFF (#21243) --- Marlin/Configuration.h | 4 ++-- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 018c171665..90ab4d58af 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -163,8 +163,8 @@ * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) * PRUSA_MMU2 : Průša MMU2 * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) - * SMUFF_EMU_MMU2 : Technik Gegg SMUFF (Průša MMU2 emulation mode) - * SMUFF_EMU_MMU2S : Technik Gegg SMUFF (Průša MMU2S emulation mode) + * SMUFF_EMU_MMU2 : Technik Gegg SMuFF (Průša MMU2 emulation mode) + * SMUFF_EMU_MMU2S : Technik Gegg SMuFF (Průša MMU2S emulation mode) * * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. * See additional options in Configuration_adv.h. diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 4931c767b8..e5f7441e77 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -575,7 +575,7 @@ #undef DISABLE_INACTIVE_EXTRUDER #endif -// Průša MMU1, MMU 2.0, MMUS 2.0 and SMUFF force SINGLENOZZLE +// Průša MMU1, MMU 2.0, MMUS 2.0 and SMuFF force SINGLENOZZLE #if HAS_MMU #define SINGLENOZZLE #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ca09fad054..4da25d0916 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -919,7 +919,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif /** - * Multi-Material-Unit 2 / SMUFF requirements + * Multi-Material-Unit 2 / SMuFF requirements */ #if HAS_PRUSA_MMU2 #if EXTRUDERS != 5 From 8a3d0b23cf410c5d8ff6e8690af7b0b48b71a1e0 Mon Sep 17 00:00:00 2001 From: Oleksii Zelivianskyi <50808386+alexeyzel@users.noreply.github.com> Date: Thu, 4 Mar 2021 11:33:02 +0200 Subject: [PATCH 1110/1370] Correct fan pins for MKS Robin Nano v3 (#21238) --- Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index a01081a7df..8308f3998f 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -165,8 +165,8 @@ #define HEATER_1_PIN PB0 // HEATER2 #define HEATER_BED_PIN PA0 // HOT BED -#define FAN_PIN PB1 // FAN -#define FAN1_PIN PC14 // FAN1 +#define FAN_PIN PC14 // FAN +#define FAN1_PIN PB1 // FAN1 // // Thermocouples From 10ec13b2c32f6b6920b244a5e972d4fcd2348fa4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Mar 2021 16:36:44 -0600 Subject: [PATCH 1111/1370] Remove extra G42 --- Marlin/src/gcode/gcode.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 428caa5a15..e9a6d4aa2a 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -396,10 +396,6 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 92: G92(); break; // G92: Set current axis position(s) - #if HAS_MESH - case 42: G42(); break; // G42: Coordinated move to a mesh point - #endif - #if ENABLED(CALIBRATION_GCODE) case 425: G425(); break; // G425: Perform calibration with calibration cube #endif From 6cfd190107e5a4aa3ad07dc1049b0bae1a101ce5 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Fri, 5 Mar 2021 00:34:38 +0100 Subject: [PATCH 1112/1370] Followup to MP_SCARA/TPARA patches (#21248) --- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 2 +- Marlin/src/gcode/calibrate/M665.cpp | 4 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/delta.h | 2 +- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/scara.cpp | 101 +++++++++++------- Marlin/src/module/scara.h | 2 +- Marlin/src/module/settings.cpp | 12 +-- 8 files changed, 74 insertions(+), 53 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 8b7cd15a3c..33b4f03ac2 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -335,7 +335,7 @@ #if IS_KINEMATIC const float seconds = cart_xy_mm / scaled_fr_mm_s; // Duration of XY move at requested rate - uint16_t segments = LROUND(delta_segments_per_second * seconds), // Preferred number of segments for distance @ feedrate + uint16_t segments = LROUND(segments_per_second * seconds), // Preferred number of segments for distance @ feedrate seglimit = LROUND(cart_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Number of segments at minimum segment length NOMORE(segments, seglimit); // Limit to minimum segment length (fewer segments) #else diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp index 3eac54f266..0d0c4146d9 100644 --- a/Marlin/src/gcode/calibrate/M665.cpp +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -48,7 +48,7 @@ if (parser.seenval('H')) delta_height = parser.value_linear_units(); if (parser.seenval('L')) delta_diagonal_rod = parser.value_linear_units(); if (parser.seenval('R')) delta_radius = parser.value_linear_units(); - if (parser.seenval('S')) delta_segments_per_second = parser.value_float(); + if (parser.seenval('S')) segments_per_second = parser.value_float(); if (parser.seenval('X')) delta_tower_angle_trim.a = parser.value_float(); if (parser.seenval('Y')) delta_tower_angle_trim.b = parser.value_float(); if (parser.seenval('Z')) delta_tower_angle_trim.c = parser.value_float(); @@ -76,7 +76,7 @@ * B, T, and Y are all aliases for the elbow angle */ void GcodeSuite::M665() { - if (parser.seenval('S')) delta_segments_per_second = parser.value_float(); + if (parser.seenval('S')) segments_per_second = parser.value_float(); #if HAS_SCARA_OFFSET diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 9857b89bf3..a1676b3ba3 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -54,7 +54,7 @@ float delta_height; abc_float_t delta_endstop_adj{0}; float delta_radius, delta_diagonal_rod, - delta_segments_per_second; + segments_per_second; abc_float_t delta_tower_angle_trim; xy_float_t delta_tower[ABC]; abc_float_t delta_diagonal_rod_2_tower; diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index a974da97c8..9caec53028 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -32,7 +32,7 @@ extern float delta_height; extern abc_float_t delta_endstop_adj; extern float delta_radius, delta_diagonal_rod, - delta_segments_per_second; + segments_per_second; extern abc_float_t delta_tower_angle_trim; extern xy_float_t delta_tower[ABC]; extern abc_float_t delta_diagonal_rod_2_tower; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 024f28dc9f..2f4f5e283a 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -763,7 +763,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { // The number of segments-per-second times the duration // gives the number of segments - uint16_t segments = delta_segments_per_second * seconds; + uint16_t segments = segments_per_second * seconds; // For SCARA enforce a minimum segment size #if IS_SCARA diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 7586b8136f..1767e230c1 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -37,46 +37,7 @@ #include "../MarlinCore.h" #endif -float delta_segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SEGMENTS_PER_SECOND); - -void scara_set_axis_is_at_home(const AxisEnum axis) { - if (axis == Z_AXIS) - current_position.z = Z_HOME_POS; - else { - #if ENABLED(MORGAN_SCARA) - // MORGAN_SCARA uses arm angles for AB home position - ab_float_t homeposition = { SCARA_OFFSET_THETA1, SCARA_OFFSET_THETA2 }; - //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); - #elif ENABLED(MP_SCARA) - // MP_SCARA uses a Cartesian XY home position - xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; - //DEBUG_ECHOPGM("homeposition"); - //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); - #elif ENABLED(AXEL_TPARA) - xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; - //DEBUG_ECHOPGM("homeposition"); - //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y, SP_Z_LBL, homeposition.z); - #endif - - #if ENABLED(MORGAN_SCARA) - delta = homeposition; - #else - inverse_kinematics(homeposition); - #endif - - #if EITHER(MORGAN_SCARA, MP_SCARA) - forward_kinematics(delta.a, delta.b); - #elif ENABLED(AXEL_TPARA) - forward_kinematics(delta.a, delta.b, delta.c); - #endif - - current_position[axis] = cartes[axis]; - - //DEBUG_ECHOPGM("Cartesian"); - //DEBUG_ECHOLNPAIR_P(SP_X_LBL, current_position.x, SP_Y_LBL, current_position.y); - update_software_endstops(axis); - } -} +float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SEGMENTS_PER_SECOND); #if EITHER(MORGAN_SCARA, MP_SCARA) @@ -109,6 +70,27 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { //*/ } +#endif + +#if ENABLED(MORGAN_SCARA) + + void scara_set_axis_is_at_home(const AxisEnum axis) { + if (axis == Z_AXIS) + current_position.z = Z_HOME_POS; + else { + // MORGAN_SCARA uses a Cartesian XY home position + xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; + //DEBUG_ECHOLNPAIR_P(PSTR("homeposition X"), homeposition.x, SP_Y_LBL, homeposition.y); + + delta = homeposition; + forward_kinematics(delta.a, delta.b); + current_position[axis] = cartes[axis]; + + //DEBUG_ECHOLNPAIR_P(PSTR("Cartesian X"), current_position.x, SP_Y_LBL, current_position.y); + update_software_endstops(axis); + } + } + /** * Morgan SCARA Inverse Kinematics. Results are stored in 'delta'. * @@ -156,6 +138,29 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { #elif ENABLED(MP_SCARA) + void scara_set_axis_is_at_home(const AxisEnum axis) { + if (axis == Z_AXIS) + current_position.z = Z_HOME_POS; + else { + // MP_SCARA uses arm angles for AB home position + #ifndef SCARA_OFFSET_THETA1 + #define SCARA_OFFSET_THETA1 12 // degrees + #endif + #ifndef SCARA_OFFSET_THETA2 + #define SCARA_OFFSET_THETA2 131 // degrees + #endif + ab_float_t homeposition = { SCARA_OFFSET_THETA1, SCARA_OFFSET_THETA2 }; + //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); + + inverse_kinematics(homeposition); + forward_kinematics(delta.a, delta.b); + current_position[axis] = cartes[axis]; + + //DEBUG_ECHOLNPAIR_P(PSTR("Cartesian X"), current_position.x, SP_Y_LBL, current_position.y); + update_software_endstops(axis); + } + } + void inverse_kinematics(const xyz_pos_t &raw) { const float x = raw.x, y = raw.y, c = HYPOT(x, y), THETA3 = ATAN2(y, x), @@ -175,6 +180,22 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { static constexpr xyz_pos_t robot_offset = { TPARA_OFFSET_X, TPARA_OFFSET_Y, TPARA_OFFSET_Z }; + void scara_set_axis_is_at_home(const AxisEnum axis) { + if (axis == Z_AXIS) + current_position.z = Z_HOME_POS; + else { + xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; + //DEBUG_ECHOLNPAIR_P(PSTR("homeposition X"), homeposition.x, SP_Y_LBL, homeposition.y, SP_Z_LBL, homeposition.z); + + inverse_kinematics(homeposition); + forward_kinematics(delta.a, delta.b, delta.c); + current_position[axis] = cartes[axis]; + + //DEBUG_ECHOLNPAIR_P(PSTR("Cartesian X"), current_position.x, SP_Y_LBL, current_position.y); + update_software_endstops(axis); + } + } + // Convert ABC inputs in degrees to XYZ outputs in mm void forward_kinematics(const float &a, const float &b, const float &c) { const float w = c - b, diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index 5549e506b0..d24a4110fd 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -27,7 +27,7 @@ #include "../core/macros.h" -extern float delta_segments_per_second; +extern float segments_per_second; #if ENABLED(AXEL_TPARA) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d78d97e688..c82ed0eb8f 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -279,7 +279,7 @@ typedef struct SettingsDataStruct { abc_float_t delta_endstop_adj; // M666 X Y Z float delta_radius, // M665 R delta_diagonal_rod, // M665 L - delta_segments_per_second; // M665 S + segments_per_second; // M665 S abc_float_t delta_tower_angle_trim, // M665 X Y Z delta_diagonal_rod_trim; // M665 A B C #elif HAS_EXTRA_ENDSTOPS @@ -840,7 +840,7 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(delta_endstop_adj); // 3 floats EEPROM_WRITE(delta_radius); // 1 float EEPROM_WRITE(delta_diagonal_rod); // 1 float - EEPROM_WRITE(delta_segments_per_second); // 1 float + EEPROM_WRITE(segments_per_second); // 1 float EEPROM_WRITE(delta_tower_angle_trim); // 3 floats EEPROM_WRITE(delta_diagonal_rod_trim); // 3 floats @@ -1721,7 +1721,7 @@ void MarlinSettings::postprocess() { EEPROM_READ(delta_endstop_adj); // 3 floats EEPROM_READ(delta_radius); // 1 float EEPROM_READ(delta_diagonal_rod); // 1 float - EEPROM_READ(delta_segments_per_second); // 1 float + EEPROM_READ(segments_per_second); // 1 float EEPROM_READ(delta_tower_angle_trim); // 3 floats EEPROM_READ(delta_diagonal_rod_trim); // 3 floats @@ -2711,7 +2711,7 @@ void MarlinSettings::reset() { delta_endstop_adj = adj; delta_radius = DELTA_RADIUS; delta_diagonal_rod = DELTA_DIAGONAL_ROD; - delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND; + segments_per_second = DELTA_SEGMENTS_PER_SECOND; delta_tower_angle_trim = dta; delta_diagonal_rod_trim = ddr; #endif @@ -3320,7 +3320,7 @@ void MarlinSettings::reset() { CONFIG_ECHO_HEADING("SCARA settings: S P T"); CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR_P( - PSTR(" M665 S"), delta_segments_per_second + PSTR(" M665 S"), segments_per_second , SP_P_STR, scara_home_offset.a , SP_T_STR, scara_home_offset.b , SP_Z_STR, LINEAR_UNIT(scara_home_offset.z) @@ -3342,7 +3342,7 @@ void MarlinSettings::reset() { PSTR(" M665 L"), LINEAR_UNIT(delta_diagonal_rod) , PSTR(" R"), LINEAR_UNIT(delta_radius) , PSTR(" H"), LINEAR_UNIT(delta_height) - , PSTR(" S"), delta_segments_per_second + , PSTR(" S"), segments_per_second , SP_X_STR, LINEAR_UNIT(delta_tower_angle_trim.a) , SP_Y_STR, LINEAR_UNIT(delta_tower_angle_trim.b) , SP_Z_STR, LINEAR_UNIT(delta_tower_angle_trim.c) From 5a01cdb81c988209a661b8594cba10b2e14e5889 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 4 Mar 2021 20:39:08 -0300 Subject: [PATCH 1113/1370] Fix multi-serial CRC error crash (#21249) --- Marlin/src/gcode/control/M999.cpp | 2 +- Marlin/src/gcode/queue.cpp | 5 ++--- Marlin/src/gcode/queue.h | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp index 7487b4cf6e..b7219673a3 100644 --- a/Marlin/src/gcode/control/M999.cpp +++ b/Marlin/src/gcode/control/M999.cpp @@ -41,5 +41,5 @@ void GcodeSuite::M999() { if (parser.boolval('S')) return; - queue.flush_and_request_resend(); + queue.flush_and_request_resend(queue.ring_buffer.command_port()); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index ebf95f86c6..93deac0566 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -262,8 +262,7 @@ void GCodeQueue::RingBuffer::ok_to_send() { * Send a "Resend: nnn" message to the host to * indicate that a command needs to be re-sent. */ -void GCodeQueue::flush_and_request_resend() { - const serial_index_t serial_ind = ring_buffer.command_port(); +void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) { #if HAS_MULTI_SERIAL if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command @@ -306,7 +305,7 @@ void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_i SERIAL_ERROR_START(); SERIAL_ECHOLNPAIR_P(err, serial_state[serial_ind].last_N); while (read_serial(serial_ind) != -1) { /* nada */ } // Clear out the RX buffer. Why don't use flush here ? - flush_and_request_resend(); + flush_and_request_resend(serial_ind); serial_state[serial_ind].count = 0; } diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 778f9a7f67..7bc3bfdbe5 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -185,7 +185,7 @@ public: * Clear the serial line and request a resend of * the next expected line number. */ - static void flush_and_request_resend(); + static void flush_and_request_resend(const serial_index_t serial_ind); /** * (Re)Set the current line number for the last received command From 7c37a828219d7ba809f889beaf4713a472420268 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 5 Mar 2021 04:30:52 -0600 Subject: [PATCH 1114/1370] Tweak tests, consolidate pins target validation (#21254) --- Marlin/src/pins/esp32/env_validate.h | 26 ++++++++++++ Marlin/src/pins/esp32/pins_E4D.h | 6 +-- Marlin/src/pins/esp32/pins_ESP32.h | 4 +- Marlin/src/pins/esp32/pins_FYSETC_E4.h | 6 +-- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 6 +-- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 6 +-- Marlin/src/pins/lpc1768/env_validate.h | 30 +++++++++++++ Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h | 4 +- Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 4 +- Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 4 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 6 +-- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 8 +--- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 4 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 6 +-- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 4 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 4 +- Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h | 4 +- Marlin/src/pins/lpc1769/env_validate.h | 26 ++++++++++++ Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h | 4 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 5 +-- .../pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h | 6 +-- .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 2 + .../pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h | 2 +- .../src/pins/lpc1769/pins_COHESION3D_MINI.h | 4 +- .../src/pins/lpc1769/pins_COHESION3D_REMIX.h | 4 +- Marlin/src/pins/lpc1769/pins_FLY_CDY.h | 4 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN.h | 6 +-- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 4 +- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 4 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 4 +- Marlin/src/pins/mega/env_validate.h | 30 +++++++++++++ Marlin/src/pins/mega/pins_CHEAPTRONIC.h | 4 +- Marlin/src/pins/mega/pins_CHEAPTRONICv2.h | 4 +- Marlin/src/pins/mega/pins_CNCONTROLS_11.h | 5 +-- Marlin/src/pins/mega/pins_CNCONTROLS_12.h | 5 +-- Marlin/src/pins/mega/pins_CNCONTROLS_15.h | 5 +-- Marlin/src/pins/mega/pins_EINSTART-S.h | 5 +-- Marlin/src/pins/mega/pins_ELEFU_3.h | 4 +- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 5 +-- Marlin/src/pins/mega/pins_GT2560_V3.h | 5 +-- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 4 +- Marlin/src/pins/mega/pins_INTAMSYS40.h | 4 +- Marlin/src/pins/mega/pins_LEAPFROG.h | 5 +-- Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h | 4 +- Marlin/src/pins/mega/pins_MEGACONTROLLER.h | 6 +-- Marlin/src/pins/mega/pins_MEGATRONICS.h | 4 +- Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 4 +- Marlin/src/pins/mega/pins_MEGATRONICS_3.h | 4 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 5 +-- Marlin/src/pins/mega/pins_OVERLORD.h | 6 +-- Marlin/src/pins/mega/pins_PICA.h | 6 +-- Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h | 4 +- Marlin/src/pins/pins.h | 2 +- Marlin/src/pins/pinsDebug.h | 4 +- Marlin/src/pins/rambo/env_validate.h | 26 ++++++++++++ Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 4 +- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 4 +- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 4 +- Marlin/src/pins/rambo/pins_RAMBO.h | 4 +- Marlin/src/pins/rambo/pins_SCOOVO_X9H.h | 4 +- Marlin/src/pins/ramps/env_validate.h | 35 ++++++++++++++++ Marlin/src/pins/ramps/pins_AZTEEG_X3.h | 7 ++-- Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h | 7 ++-- Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h | 5 +-- .../src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 5 +-- Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h | 7 ++-- .../src/pins/ramps/pins_FORMBOT_TREX2PLUS.h | 7 ++-- Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h | 7 ++-- Marlin/src/pins/ramps/pins_K8800.h | 4 +- Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h | 10 ++--- Marlin/src/pins/ramps/pins_RAMPS.h | 13 +----- Marlin/src/pins/ramps/pins_RAMPS_OLD.h | 4 +- Marlin/src/pins/ramps/pins_RAMPS_PLUS.h | 4 +- Marlin/src/pins/ramps/pins_RAMPS_S_12.h | 7 +--- Marlin/src/pins/ramps/pins_RUMBA.h | 7 ++-- Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h | 7 ++-- Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h | 7 ++-- Marlin/src/pins/ramps/pins_TT_OSCAR.h | 4 +- Marlin/src/pins/ramps/pins_ULTIMAIN_2.h | 5 +-- Marlin/src/pins/ramps/pins_ULTIMAKER.h | 4 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 4 +- Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h | 7 ++-- Marlin/src/pins/sam/env_validate.h | 33 +++++++++++++++ Marlin/src/pins/sam/pins_ADSK.h | 6 +-- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 4 +- Marlin/src/pins/sam/pins_CNCONTROLS_15D.h | 4 +- Marlin/src/pins/sam/pins_DUE3DOM.h | 4 +- Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 4 +- Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 4 +- Marlin/src/pins/sam/pins_RADDS.h | 4 +- Marlin/src/pins/sam/pins_RAMPS4DUE.h | 7 +--- Marlin/src/pins/sam/pins_RAMPS_DUO.h | 7 +--- Marlin/src/pins/sam/pins_RAMPS_FD_V1.h | 4 +- Marlin/src/pins/sam/pins_RAMPS_SMART.h | 6 +-- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 4 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 4 +- Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h | 4 +- Marlin/src/pins/sanguino/env_validate.h | 42 +++++++++++++++++++ .../src/pins/sanguino/pins_GEN3_MONOLITHIC.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN3_PLUS.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN6.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN7_12.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN7_14.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h | 5 +-- Marlin/src/pins/sanguino/pins_OMCA_A.h | 2 +- .../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 5 +-- Marlin/src/pins/sanguino/pins_SETHI.h | 5 +-- Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 5 +-- Marlin/src/pins/stm32f1/env_validate.h | 26 ++++++++++++ Marlin/src/pins/stm32f1/pins_BEAST.h | 4 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 4 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 6 +-- Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h | 6 +-- Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h | 4 +- Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 4 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 4 +- .../pins/stm32f1/pins_FYSETC_CHEETAH_V12.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 4 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 6 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 6 +-- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 6 +-- .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 6 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 6 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 6 +-- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 4 +- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 6 +-- Marlin/src/pins/stm32f4/env_validate.h | 28 +++++++++++++ Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 8 ++-- Marlin/src/pins/stm32f4/pins_ARMED.h | 6 +-- .../src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 7 ++-- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 6 +-- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 6 +-- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 4 +- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 7 ++-- .../pins/stm32f4/pins_FYSETC_CHEETAH_V20.h | 4 +- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 6 +-- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 7 ++-- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 7 ++-- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 7 ++-- Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h | 6 +-- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 7 ++-- .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 7 ++-- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 6 +-- .../src/pins/stm32f4/pins_STEVAL_3DP001V1.h | 4 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 7 ++-- Marlin/src/pins/teensy2/env_validate.h | 28 +++++++++++++ Marlin/src/pins/teensy2/pins_5DPRINT.h | 4 +- Marlin/src/pins/teensy2/pins_BRAINWAVE.h | 2 +- Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h | 4 +- Marlin/src/pins/teensy2/pins_PRINTRBOARD.h | 4 +- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 4 +- Marlin/src/pins/teensy2/pins_SAV_MKI.h | 4 +- Marlin/src/pins/teensy2/pins_TEENSY2.h | 4 +- Marlin/src/pins/teensy2/pins_TEENSYLU.h | 3 ++ buildroot/bin/mftest | 11 +++-- buildroot/{tests => bin}/run_tests | 16 +++---- .../scripts/common-dependencies-post.py | 16 ------- .../PlatformIO/scripts/preflight-checks.py | 3 +- buildroot/tests/{ARMED-tests => ARMED} | 0 .../{BIGTREE_BTT002-tests => BIGTREE_BTT002} | 0 ...IGTREE_GTR_V1_0-tests => BIGTREE_GTR_V1_0} | 0 ...tests => BIGTREE_GTR_V1_0_usb_flash_drive} | 0 ...{BIGTREE_SKR_PRO-tests => BIGTREE_SKR_PRO} | 0 buildroot/tests/{DUE-tests => DUE} | 0 .../tests/{DUE_archim-tests => DUE_archim} | 0 .../tests/{FLYF407ZG-tests => FLYF407ZG} | 0 .../tests/{FYSETC_F6-tests => FYSETC_F6} | 0 .../tests/{FYSETC_S6-tests => FYSETC_S6} | 0 buildroot/tests/{LERDGEX-tests => LERDGEX} | 0 buildroot/tests/{LPC1768-tests => LPC1768} | 0 buildroot/tests/{LPC1769-tests => LPC1769} | 0 .../{NUCLEO_F767ZI-tests => NUCLEO_F767ZI} | 0 .../tests/{REMRAM_V1-tests => REMRAM_V1} | 0 ...entral_m4-tests => SAMD51_grandcentral_m4} | 0 ...F070CB_malyan-tests => STM32F070CB_malyan} | 0 ...F070RB_malyan-tests => STM32F070RB_malyan} | 0 ...F103CB_malyan-tests => STM32F103CB_malyan} | 0 ...{STM32F103RC_btt-tests => STM32F103RC_btt} | 0 ...03RC_btt_USB-tests => STM32F103RC_btt_USB} | 0 ...F103RC_fysetc-tests => STM32F103RC_fysetc} | 0 ...TM32F103RC_meeb-tests => STM32F103RC_meeb} | 0 .../tests/{STM32F103RE-tests => STM32F103RE} | 0 ..._creality-tests => STM32F103RET6_creality} | 0 ...{STM32F103RE_btt-tests => STM32F103RE_btt} | 0 ...03RE_btt_USB-tests => STM32F103RE_btt_USB} | 0 ...F103VE_longer-tests => STM32F103VE_longer} | 0 ...F401VE_STEVAL-tests => STM32F401VE_STEVAL} | 0 ...32F407VE_black-tests => STM32F407VE_black} | 0 ...{at90usb1286_cdc-tests => at90usb1286_cdc} | 0 ...{at90usb1286_dfu-tests => at90usb1286_dfu} | 0 buildroot/tests/{esp32-tests => esp32} | 0 ...{jgaurora_a5s_a1-tests => jgaurora_a5s_a1} | 0 .../{linux_native-tests => linux_native} | 0 .../tests/{malyan_M300-tests => malyan_M300} | 0 buildroot/tests/{mega1280-tests => mega1280} | 0 buildroot/tests/{mega2560-tests => mega2560} | 0 .../tests/{mks_robin-tests => mks_robin} | 0 .../{mks_robin_lite-tests => mks_robin_lite} | 0 .../{mks_robin_mini-tests => mks_robin_mini} | 0 ...ks_robin_nano35-tests => mks_robin_nano35} | 0 ...o35_stm32-tests => mks_robin_nano35_stm32} | 0 .../{mks_robin_pro-tests => mks_robin_pro} | 0 ...{mks_robin_stm32-tests => mks_robin_stm32} | 0 buildroot/tests/{rambo-tests => rambo} | 0 buildroot/tests/{rumba32-tests => rumba32} | 0 .../{sanguino1284p-tests => sanguino1284p} | 0 .../{sanguino644p-tests => sanguino644p} | 0 buildroot/tests/{teensy31-tests => teensy31} | 0 buildroot/tests/{teensy35-tests => teensy35} | 0 buildroot/tests/{teensy41-tests => teensy41} | 0 platformio.ini | 7 +++- 220 files changed, 631 insertions(+), 509 deletions(-) create mode 100644 Marlin/src/pins/esp32/env_validate.h create mode 100644 Marlin/src/pins/lpc1768/env_validate.h create mode 100644 Marlin/src/pins/lpc1769/env_validate.h create mode 100644 Marlin/src/pins/mega/env_validate.h create mode 100644 Marlin/src/pins/rambo/env_validate.h create mode 100644 Marlin/src/pins/ramps/env_validate.h create mode 100644 Marlin/src/pins/sam/env_validate.h create mode 100644 Marlin/src/pins/sanguino/env_validate.h create mode 100644 Marlin/src/pins/stm32f1/env_validate.h create mode 100644 Marlin/src/pins/stm32f4/env_validate.h create mode 100644 Marlin/src/pins/teensy2/env_validate.h rename buildroot/{tests => bin}/run_tests (79%) delete mode 100644 buildroot/share/PlatformIO/scripts/common-dependencies-post.py rename buildroot/tests/{ARMED-tests => ARMED} (100%) rename buildroot/tests/{BIGTREE_BTT002-tests => BIGTREE_BTT002} (100%) rename buildroot/tests/{BIGTREE_GTR_V1_0-tests => BIGTREE_GTR_V1_0} (100%) rename buildroot/tests/{BIGTREE_GTR_V1_0_usb_flash_drive-tests => BIGTREE_GTR_V1_0_usb_flash_drive} (100%) rename buildroot/tests/{BIGTREE_SKR_PRO-tests => BIGTREE_SKR_PRO} (100%) rename buildroot/tests/{DUE-tests => DUE} (100%) rename buildroot/tests/{DUE_archim-tests => DUE_archim} (100%) rename buildroot/tests/{FLYF407ZG-tests => FLYF407ZG} (100%) rename buildroot/tests/{FYSETC_F6-tests => FYSETC_F6} (100%) rename buildroot/tests/{FYSETC_S6-tests => FYSETC_S6} (100%) rename buildroot/tests/{LERDGEX-tests => LERDGEX} (100%) rename buildroot/tests/{LPC1768-tests => LPC1768} (100%) rename buildroot/tests/{LPC1769-tests => LPC1769} (100%) rename buildroot/tests/{NUCLEO_F767ZI-tests => NUCLEO_F767ZI} (100%) rename buildroot/tests/{REMRAM_V1-tests => REMRAM_V1} (100%) rename buildroot/tests/{SAMD51_grandcentral_m4-tests => SAMD51_grandcentral_m4} (100%) rename buildroot/tests/{STM32F070CB_malyan-tests => STM32F070CB_malyan} (100%) rename buildroot/tests/{STM32F070RB_malyan-tests => STM32F070RB_malyan} (100%) rename buildroot/tests/{STM32F103CB_malyan-tests => STM32F103CB_malyan} (100%) rename buildroot/tests/{STM32F103RC_btt-tests => STM32F103RC_btt} (100%) rename buildroot/tests/{STM32F103RC_btt_USB-tests => STM32F103RC_btt_USB} (100%) rename buildroot/tests/{STM32F103RC_fysetc-tests => STM32F103RC_fysetc} (100%) rename buildroot/tests/{STM32F103RC_meeb-tests => STM32F103RC_meeb} (100%) rename buildroot/tests/{STM32F103RE-tests => STM32F103RE} (100%) rename buildroot/tests/{STM32F103RET6_creality-tests => STM32F103RET6_creality} (100%) rename buildroot/tests/{STM32F103RE_btt-tests => STM32F103RE_btt} (100%) rename buildroot/tests/{STM32F103RE_btt_USB-tests => STM32F103RE_btt_USB} (100%) rename buildroot/tests/{STM32F103VE_longer-tests => STM32F103VE_longer} (100%) rename buildroot/tests/{STM32F401VE_STEVAL-tests => STM32F401VE_STEVAL} (100%) rename buildroot/tests/{STM32F407VE_black-tests => STM32F407VE_black} (100%) rename buildroot/tests/{at90usb1286_cdc-tests => at90usb1286_cdc} (100%) rename buildroot/tests/{at90usb1286_dfu-tests => at90usb1286_dfu} (100%) rename buildroot/tests/{esp32-tests => esp32} (100%) rename buildroot/tests/{jgaurora_a5s_a1-tests => jgaurora_a5s_a1} (100%) rename buildroot/tests/{linux_native-tests => linux_native} (100%) rename buildroot/tests/{malyan_M300-tests => malyan_M300} (100%) rename buildroot/tests/{mega1280-tests => mega1280} (100%) rename buildroot/tests/{mega2560-tests => mega2560} (100%) rename buildroot/tests/{mks_robin-tests => mks_robin} (100%) rename buildroot/tests/{mks_robin_lite-tests => mks_robin_lite} (100%) rename buildroot/tests/{mks_robin_mini-tests => mks_robin_mini} (100%) rename buildroot/tests/{mks_robin_nano35-tests => mks_robin_nano35} (100%) rename buildroot/tests/{mks_robin_nano35_stm32-tests => mks_robin_nano35_stm32} (100%) rename buildroot/tests/{mks_robin_pro-tests => mks_robin_pro} (100%) rename buildroot/tests/{mks_robin_stm32-tests => mks_robin_stm32} (100%) rename buildroot/tests/{rambo-tests => rambo} (100%) rename buildroot/tests/{rumba32-tests => rumba32} (100%) rename buildroot/tests/{sanguino1284p-tests => sanguino1284p} (100%) rename buildroot/tests/{sanguino644p-tests => sanguino644p} (100%) rename buildroot/tests/{teensy31-tests => teensy31} (100%) rename buildroot/tests/{teensy35-tests => teensy35} (100%) rename buildroot/tests/{teensy41-tests => teensy41} (100%) diff --git a/Marlin/src/pins/esp32/env_validate.h b/Marlin/src/pins/esp32/env_validate.h new file mode 100644 index 0000000000..ce14c33414 --- /dev/null +++ b/Marlin/src/pins/esp32/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(ARDUINO_ARCH_ESP32) + #error "Oops! Select an ESP32 board in 'Tools > Board.'" +#endif diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index 4a5a2bf9b0..9e28af2190 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -27,9 +27,9 @@ * for more info check https://atbox.tech/ and join to Facebook page E4d@box. */ -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if EXTRUDERS > 1 || E_STEPPERS > 1 #error "E4d@box only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 #error "E4d@box only supports one hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/esp32/pins_ESP32.h b/Marlin/src/pins/esp32/pins_ESP32.h index d54a92b9c4..6578770ba0 100644 --- a/Marlin/src/pins/esp32/pins_ESP32.h +++ b/Marlin/src/pins/esp32/pins_ESP32.h @@ -25,9 +25,7 @@ * Espressif ESP32 (Tensilica Xtensa LX6) pin assignments */ -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - "Oops! Select an ESP32 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Espressif ESP32" diff --git a/Marlin/src/pins/esp32/pins_FYSETC_E4.h b/Marlin/src/pins/esp32/pins_FYSETC_E4.h index 50a8587b1e..7dd7f94ae5 100644 --- a/Marlin/src/pins/esp32/pins_FYSETC_E4.h +++ b/Marlin/src/pins/esp32/pins_FYSETC_E4.h @@ -27,9 +27,9 @@ * Supports 4 stepper drivers, heated bed, single hotend. */ -#ifndef ARDUINO_ARCH_ESP32 - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if EXTRUDERS > 1 || E_STEPPERS > 1 #error "FYSETC E4 only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 #error "FYSETC E4 only supports one hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index fe67f75372..38f43b53d3 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -27,9 +27,9 @@ * Supports 4 stepper drivers, heated bed, single hotend. */ -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if EXTRUDERS > 1 || E_STEPPERS > 1 #error "MRR ESPA only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 #error "MRR ESPA only supports one hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index 3f9a6a0af3..f156efd2e8 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -28,9 +28,9 @@ * single hotend, and LCD controller. */ -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if EXTRUDERS > 2 || E_STEPPERS > 2 #error "MRR ESPE only supports two E Steppers. Comment out this line to continue." #elif HOTENDS > 1 #error "MRR ESPE only supports one hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/lpc1768/env_validate.h b/Marlin/src/pins/lpc1768/env_validate.h new file mode 100644 index 0000000000..adb3ea938d --- /dev/null +++ b/Marlin/src/pins/lpc1768/env_validate.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if ENABLED(REQUIRE_LPC1769) && NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#elif DISABLED(REQUIRE_LPC1769) && NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#undef REQUIRE_LPC1769 diff --git a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h index 70682ad151..0760eee0ab 100644 --- a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h +++ b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h @@ -25,9 +25,7 @@ * AZSMZ MINI pin assignments */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "AZSMZ MINI" diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h index 5ac119f398..10a610ff95 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -29,9 +29,7 @@ * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "BIQU Thunder B300 V1.0" diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index 3b2137b400..f94381e13a 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -29,9 +29,7 @@ * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "BIQU BQ111-A4" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index c7555a779d..c555ef7863 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -21,14 +21,12 @@ */ #pragma once +#include "env_validate.h" + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "BTT SKR V1.4" #endif -#ifndef BOARD_CUSTOM_BUILD_FLAGS - #define BOARD_CUSTOM_BUILD_FLAGS -DLPC_PINCFG_UART3_P4_28 -#endif - // // SD Connection // diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 82799c1cd0..98e4f8ee26 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -21,13 +21,7 @@ */ #pragma once -#if ENABLED(SKR_HAS_LPC1769) - #if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." - #endif -#elif NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" // If you have the Big tree tech driver expansion module, enable HAS_BTT_EXP_MOT // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 1970c0c479..0df8b10292 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GMARSH X6 REV1" diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index fbddc66e7c..71d7ad3037 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -25,11 +25,7 @@ * MKS SBASE pin assignments */ -#if defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#elif !defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "MKS SBASE" diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index b919ecad85..40fac4e7fa 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -25,9 +25,7 @@ * MKS SGEN-L pin assignments */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "MKS SGen-L" #define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN_L" diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 65840308ca..83fcf36e4e 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -35,9 +35,7 @@ // Numbers in parentheses () are the corresponding mega2560 pin numbers -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Re-ARM RAMPS 1.4" diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h index 700e79de9c..29fe3b528c 100644 --- a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h +++ b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h @@ -25,9 +25,7 @@ * Selena Compact pin assignments */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Selena Compact" #define BOARD_WEBSITE_URL "github.com/Ales2-k/Selena" diff --git a/Marlin/src/pins/lpc1769/env_validate.h b/Marlin/src/pins/lpc1769/env_validate.h new file mode 100644 index 0000000000..2e2b63d520 --- /dev/null +++ b/Marlin/src/pins/lpc1769/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h index adf9085262..7ce78ad283 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h @@ -25,9 +25,7 @@ * Azteeg X5 GT pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Azteeg X5 GT" #define BOARD_WEBSITE_URL "tinyurl.com/yx8tdqa3" diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index fdd64878fb..80a91d2cbc 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -24,10 +24,7 @@ /** * Azteeg X5 MINI pin assignments */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Azteeg X5 MINI" diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h index 99ff0fd25a..086bacbac0 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h @@ -22,12 +22,10 @@ #pragma once /** - * Azteeg X5 MINI pin assignments + * Azteeg X5 MINI WIFI pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Azteeg X5 MINI WIFI" diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 7c63ba20be..2e1e02f991 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -21,6 +21,8 @@ */ #pragma once +#include "env_validate.h" + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "BTT SKR E3 Turbo" #endif diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h index a751286e3a..5af1dfec3f 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h @@ -22,9 +22,9 @@ #pragma once #define BOARD_INFO_NAME "BTT SKR V1.4 TURBO" -#define SKR_HAS_LPC1769 // // Include SKR 1.4 pins // +#define REQUIRE_LPC1769 #include "../lpc1768/pins_BTT_SKR_V1_4.h" diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h index d66ffbe4e5..237dfaec36 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h @@ -25,9 +25,7 @@ * Cohesion3D Mini pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Cohesion3D Mini" diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h index edf13cee29..57b4521453 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -25,9 +25,7 @@ * Cohesion3D ReMix pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Cohesion3D ReMix" diff --git a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h index 3982d76a01..b90443403c 100644 --- a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h +++ b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "FLY-CDY" #define BOARD_WEBSITE_URL "github.com/FLYmaker/FLY-CDY" diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index d67549997b..ddfee63cd0 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -28,14 +28,10 @@ * https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20PIN.pdf */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - #define BOARD_INFO_NAME "MKS SGen" #define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN" -#define MKS_HAS_LPC1769 +#define REQUIRE_LPC1769 #include "../lpc1768/pins_MKS_SBASE.h" #if HAS_TMC_UART diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index abf5be3c89..a616079403 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -25,9 +25,7 @@ * MKS SGen pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "MKS SGEN_L V2" #define BOARD_WEBSITE_URL "github.com/makerbase-mks" diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index c5ce3f8795..f7bc9602d7 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -25,9 +25,7 @@ * Smoothieboard pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Smoothieboard" #define BOARD_WEBSITE_URL "smoothieware.org/smoothieboard" diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index d4f3e5bc21..4d725bc7d1 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -25,9 +25,7 @@ * TH3D EZBoard pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "TH3D EZBoard" #define BOARD_WEBSITE_URL "th3dstudio.com" diff --git a/Marlin/src/pins/mega/env_validate.h b/Marlin/src/pins/mega/env_validate.h new file mode 100644 index 0000000000..fe4a39a612 --- /dev/null +++ b/Marlin/src/pins/mega/env_validate.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if ENABLED(ALLOW_MEGA1280) && NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560 or 1280' in 'Tools > Board.'" +#elif NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#undef ALLOW_MEGA1280 diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h index 98427d9e59..8bcb263bc1 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h @@ -25,9 +25,7 @@ * Cheaptronic v1.0 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Cheaptronic v1.0" // diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h index 3f18bc8bbe..01438975b9 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h @@ -27,9 +27,7 @@ * www.reprapobchod.cz */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Cheaptronic v2.0" diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h index f80e6144ce..6f9e5e8e6c 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h @@ -25,9 +25,8 @@ * CartesioV11 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "CN Controls V11" diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h index 540f5c29f5..f1200e0901 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h @@ -25,9 +25,8 @@ * CartesioV12 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "CN Controls V12" diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h index 8bafbdf000..6de3b7172e 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h @@ -25,9 +25,8 @@ * CNControls V15 for HMS434 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "CN Controls V15" diff --git a/Marlin/src/pins/mega/pins_EINSTART-S.h b/Marlin/src/pins/mega/pins_EINSTART-S.h index 40d65c353e..d42efe7361 100644 --- a/Marlin/src/pins/mega/pins_EINSTART-S.h +++ b/Marlin/src/pins/mega/pins_EINSTART-S.h @@ -26,9 +26,8 @@ * PCB Silkscreen: 3DPrinterCon_v3.5 */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "Einstart-S" diff --git a/Marlin/src/pins/mega/pins_ELEFU_3.h b/Marlin/src/pins/mega/pins_ELEFU_3.h index af93c408a2..f5e146cff9 100644 --- a/Marlin/src/pins/mega/pins_ELEFU_3.h +++ b/Marlin/src/pins/mega/pins_ELEFU_3.h @@ -25,9 +25,7 @@ * Elefu RA Board Pin Assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Elefu Ra v3" diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index dcd829f7a7..2fb43a299f 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -27,9 +27,8 @@ * Richard Smith */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "GT2560 Rev.A" diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 66b2804ff6..65642464d9 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -25,9 +25,8 @@ * Geeetech GT2560 RevB + GT2560 3.0/3.1 + GT2560 4.0/4.1 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "GT2560 RevB/3.x/4.x" diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index dc4b78d9c1..27ec998891 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -25,9 +25,7 @@ * Geeetech HJC2560-C Rev 2.x board pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "ADIMLab Gantry v2" #define BOARD_INFO_NAME "HJC2560-C" diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h index be5f461dda..2e2a9b85db 100644 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -27,9 +27,7 @@ * 2208 version exists and may or may not work */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Intamsys 4.0" diff --git a/Marlin/src/pins/mega/pins_LEAPFROG.h b/Marlin/src/pins/mega/pins_LEAPFROG.h index 9e6802b24b..4700fd6729 100644 --- a/Marlin/src/pins/mega/pins_LEAPFROG.h +++ b/Marlin/src/pins/mega/pins_LEAPFROG.h @@ -25,9 +25,8 @@ * Leapfrog Driver board pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "Leapfrog" diff --git a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h index 9c316aa759..af5cfd6a2e 100644 --- a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h +++ b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h @@ -29,9 +29,7 @@ * printer models. As such this file is currently specific to the Xeed. */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Leapfrog Xeed 2015" diff --git a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h index 938ad82eff..69c60b29ec 100644 --- a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h +++ b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h @@ -25,12 +25,12 @@ * Mega controller pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Mega Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif +#include "env_validate.h" + #define BOARD_INFO_NAME "Mega Controller" // diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index f813366a14..0308175b2a 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -25,9 +25,7 @@ * MegaTronics pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Megatronics" // diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index ef4605edd4..e527035910 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -25,9 +25,7 @@ * MegaTronics v2.0 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Megatronics v2.0" // diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h index 9f85d46a54..5dea438d70 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h @@ -25,9 +25,7 @@ * MegaTronics v3.0 / v3.1 / v3.2 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #if MB(MEGATRONICS_32) #define BOARD_INFO_NAME "Megatronics v3.2" diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index b260a27867..2531f10a7a 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -37,9 +37,8 @@ * number (B5) agrees with the schematic but B5 is assigned to logical pin 11. */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "Mightyboard" #define DEFAULT_MACHINE_NAME "MB Replicator" diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h index 18bb1f27bf..161820b67a 100644 --- a/Marlin/src/pins/mega/pins_OVERLORD.h +++ b/Marlin/src/pins/mega/pins_OVERLORD.h @@ -25,12 +25,12 @@ * Dreammaker Overlord v1.1 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Overlord Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif +#include "env_validate.h" + #define BOARD_INFO_NAME "OVERLORD" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h index ff4d3e834d..81f6319377 100644 --- a/Marlin/src/pins/mega/pins_PICA.h +++ b/Marlin/src/pins/mega/pins_PICA.h @@ -29,6 +29,8 @@ * Applies to PICA, PICA_REVB */ +#include "env_validate.h" + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "PICA" #endif @@ -42,10 +44,6 @@ AD12 = 66; AD13 = 67; AD14 = 68; AD15 = 69; */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." -#endif - // // Servos // diff --git a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h index 715e823393..503dd9ec81 100644 --- a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h +++ b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h @@ -25,9 +25,7 @@ * Wanhao 0ne+ pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Wanhao i3 Mini 0ne+" #define DEFAULT_MACHINE_NAME "i3 Mini" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index b8cf695fb5..55240021fa 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -378,7 +378,7 @@ #elif MB(BTT_SKR_V1_3) #include "lpc1768/pins_BTT_SKR_V1_3.h" // LPC1768 env:LPC1768 #elif MB(BTT_SKR_V1_4) - #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768_btt_skr_v1_4 // // LPC1769 ARM Cortex M3 diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index e2e56081b7..72e31b7b25 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -41,7 +41,7 @@ #define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) #include "pinsDebug_list.h" -#line 46 +#line 45 // manually add pins that have names that are macros which don't play well with these macros #if ANY(AVR_ATmega2560_FAMILY, AVR_ATmega1284_FAMILY, ARDUINO_ARCH_SAM, TARGET_LPC1768) @@ -227,7 +227,7 @@ const PinInfo pin_array[] PROGMEM = { #endif #include "pinsDebug_list.h" - #line 172 + #line 231 }; diff --git a/Marlin/src/pins/rambo/env_validate.h b/Marlin/src/pins/rambo/env_validate.h new file mode 100644 index 0000000000..84cf8392cd --- /dev/null +++ b/Marlin/src/pins/rambo/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" +#endif diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 2ca2cc9c8d..7b05d454af 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -25,9 +25,7 @@ * Einsy-Rambo pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Einsy Rambo" diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index a6a4b65e05..ee537495ea 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -25,9 +25,7 @@ * Einsy-Retro pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Einsy Retro" diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index 4dcf35827c..ec44cc3b36 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -25,9 +25,7 @@ * Mini-RAMBo pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'RAMBo' in 'Tools > Board' or the Mega2560 environment in PlatformIO." -#endif +#include "env_validate.h" #if MB(MINIRAMBO_10A) #define BOARD_INFO_NAME "Mini RAMBo 1.0a" diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 65fc4b5af8..5d6f9c1fd0 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -41,9 +41,7 @@ * Rambo pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Rambo" diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h index 5680b00df6..c2a691a3b7 100644 --- a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h +++ b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h @@ -25,9 +25,7 @@ * Rambo pin assignments MODIFIED FOR Scoovo X9H ************************************************/ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_target.h" #define BOARD_INFO_NAME "Scoovo X9H" diff --git a/Marlin/src/pins/ramps/env_validate.h b/Marlin/src/pins/ramps/env_validate.h new file mode 100644 index 0000000000..6006a78f01 --- /dev/null +++ b/Marlin/src/pins/ramps/env_validate.h @@ -0,0 +1,35 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if ENABLED(ALLOW_SAM3X8E) + #if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" + #endif +#elif ENABLED(REQUIRE_MEGA2560) && NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif DISABLED(REQUIRE_MEGA2560) && NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560 or 1280' in 'Tools > Board.'" +#endif + +#undef ALLOW_SAM3X8E +#undef REQUIRE_MEGA2560 diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h index 6ddd2a5165..07af61e693 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h @@ -25,9 +25,10 @@ * AZTEEG_X3 Arduino Mega with RAMPS v1.4 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Azteeg X3 supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h index 9ba6a0c1ac..c2896146e6 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -25,9 +25,10 @@ * AZTEEG_X3_PRO (Arduino Mega) pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 5 || E_STEPPERS > 5 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 5 || E_STEPPERS > 5 #error "Azteeg X3 Pro supports up to 5 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h index f120e9c44f..99cf484de7 100644 --- a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h +++ b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h @@ -25,9 +25,8 @@ * bq ZUM Mega 3D board definition */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define REQUIRE_MEGA2560 +#include "env_validate.h" #define BOARD_INFO_NAME "ZUM Mega 3D" diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h index 93ec3d6070..1a4b83f02d 100644 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -25,9 +25,8 @@ * Wanhao Duplicator i3 Plus pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define REQUIRE_MEGA2560 +#include "env_validate.h" #define BOARD_INFO_NAME "Duplicator i3 Plus" diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h index 5b724787e9..383501caaa 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h @@ -25,9 +25,10 @@ * Formbot Raptor pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "Formbot supports up to 3 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h index 81b6ea16d7..ac0b7428f4 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h @@ -25,9 +25,10 @@ * Formbot pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h index a97b0d2d12..76a9fbe628 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h @@ -25,9 +25,10 @@ * Formbot pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h index 5388c9621d..9bc74943b4 100644 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -25,9 +25,7 @@ * Velleman K8800 (Vertex) */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "K8800" #define DEFAULT_MACHINE_NAME "Vertex Delta" diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h index 6fcb7b94e0..2fd599e619 100644 --- a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h @@ -25,9 +25,10 @@ * Longer3D LK1/LK4/LK5 Pro board pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "Longer3D LGT KIT V1.0 board only supports one hotend / E-stepper. Comment out this line to continue." #endif @@ -42,9 +43,6 @@ #warning "Serial 3 is originally reserved to Y limit switches. Hardware changes are required to use it." #endif -// Custom flags and defines for the build -//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ - #define BOARD_INFO_NAME "LGT KIT V1.0" // diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index fe416dfb68..f56a9ec38e 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -45,18 +45,7 @@ * 7 | 11 */ -#ifdef TARGET_LPC1768 - #error "Oops! Set MOTHERBOARD to an LPC1768-based board when building for LPC1768." -#elif defined(__STM32F1__) - #error "Oops! Set MOTHERBOARD to an STM32F1-based board when building for STM32F1." -#endif - -#if NOT_TARGET(IS_RAMPS_SMART, IS_RAMPS_DUO, IS_RAMPS4DUE, TARGET_LPC1768, __AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' (or other appropriate target) in 'Tools > Board.'" -#endif - -// Custom flags and defines for the build -//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS 1.4" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h index 6d2dad2314..a43ee3c6ca 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h @@ -25,9 +25,7 @@ * Arduino Mega with RAMPS v1.0, v1.1, v1.2 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RAMPS <1.2" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h index 23b1dfa346..43a769b34d 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -37,9 +37,7 @@ * RAMPS_PLUS_SF (Spindle, Controller Fan) */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RAMPS 1.4 Plus" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h index 1bcf310bc1..62b6e3ff94 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h @@ -34,12 +34,7 @@ * Other pins_MYBOARD.h files may override these defaults */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -// Custom flags and defines for the build -//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS S 1.2" diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h index 4af49d9164..942afafd7a 100644 --- a/Marlin/src/pins/ramps/pins_RUMBA.h +++ b/Marlin/src/pins/ramps/pins_RUMBA.h @@ -25,9 +25,10 @@ * RUMBA pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA supports up to 3 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h index 84e7e31126..53e419af00 100644 --- a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h +++ b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h @@ -25,9 +25,10 @@ * Tenlog pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Tenlog supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h index f342eff8aa..ffe6d56eb8 100644 --- a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h +++ b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h @@ -25,9 +25,10 @@ * Arduino Mega for Tronxy X5S-2E, etc. */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "TRONXY-V3-1.0 supports only 2 hotends/E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index ca402553e1..18d0f1770e 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -20,9 +20,7 @@ * */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #if HOTENDS > 5 || E_STEPPERS > 5 #error "TTOSCAR supports up to 5 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index 211caddba0..128f1974e0 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -33,9 +33,8 @@ * case light */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define REQUIRE_MEGA2560 +#include "env_validate.h" #define BOARD_INFO_NAME "Ultimaker 2.x" #define DEFAULT_MACHINE_NAME "Ultimaker" diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index 22c7fd95b4..0bc04d962a 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -33,9 +33,7 @@ * case light */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Ultimaker" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index 37c28ece4c..091356a11f 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -60,9 +60,7 @@ //#define BOARD_REV_1_0 //#define BOARD_REV_1_5 -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifdef BOARD_REV_1_1_TO_1_3 #define BOARD_INFO_NAME "Ultimaker 1.1-1.3" diff --git a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h index 096d970871..26ad5fd658 100644 --- a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h +++ b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h @@ -25,9 +25,10 @@ * Z-Bolt X Series board – based on Arduino Mega2560 */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 4 || E_STEPPERS > 4 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 4 || E_STEPPERS > 4 #error "Z-Bolt X Series board supports up to 4 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/sam/env_validate.h b/Marlin/src/pins/sam/env_validate.h new file mode 100644 index 0000000000..09bcd13649 --- /dev/null +++ b/Marlin/src/pins/sam/env_validate.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if BOTH(ALLOW_MEGA1280, ALLOW_MEGA2560) && NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" +#elif ENABLED(ALLOW_MEGA2560) && NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" +#elif ENABLED(ALLOW_MEGA1280) && NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#undef ALLOW_MEGA1280 +#undef ALLOW_MEGA2560 diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h index b0e171cf17..9026ca7771 100644 --- a/Marlin/src/pins/sam/pins_ADSK.h +++ b/Marlin/src/pins/sam/pins_ADSK.h @@ -27,9 +27,9 @@ #define BOARD_INFO_NAME "ADSK" -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#define ALLOW_MEGA2560 +#include "env_validate.h" /* CNC shield modifications: FROM THE BOTTOM CUT THE 5V PIN THAT GOES TO ARDUINO!!! diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index b01d1aafdf..c273edfc6b 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -26,9 +26,7 @@ * https://reprap.org/wiki/Alligator_Board */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Alligator Board R2" diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h index 5bf31450b7..a63c337880 100644 --- a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h +++ b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h @@ -24,9 +24,7 @@ * CNControls V15 for HMS434 with DUE pin assignments */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "CN Controls V15D" diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index 90d6bdc340..4ebece58e4 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -25,9 +25,7 @@ * DUE3DOM pin assignments */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "DUE3DOM" diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 5a205423ed..dd8f263676 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -25,9 +25,7 @@ * DUE3DOM MINI pin assignments */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "DUE3DOM MINI" diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index 424d858a85..874950f34b 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -25,9 +25,7 @@ * PRINTRBOARD_G2 */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Printrboard G2" diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index 7b9c7f1b28..7b0ec5ab68 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -25,9 +25,7 @@ * RADDS */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RADDS" diff --git a/Marlin/src/pins/sam/pins_RAMPS4DUE.h b/Marlin/src/pins/sam/pins_RAMPS4DUE.h index 54548333b5..6d9d06a175 100644 --- a/Marlin/src/pins/sam/pins_RAMPS4DUE.h +++ b/Marlin/src/pins/sam/pins_RAMPS4DUE.h @@ -39,14 +39,9 @@ * A15 | NC */ -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - +#define ALLOW_SAM3X8E #define BOARD_INFO_NAME "RAMPS4DUE" -#define IS_RAMPS4DUE - // // Temperature Sensors // diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h index d2ab5c96b2..b1a6680c50 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -43,14 +43,9 @@ * A15 | A11 */ -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - #define BOARD_INFO_NAME "RAMPS Duo" -#define IS_RAMPS_DUO - +#define ALLOW_SAM3X8E #include "../ramps/pins_RAMPS.h" // diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h index 80e8f0dc7e..e4c53530f7 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -28,9 +28,7 @@ * Use 4k7 thermistor tables */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS-FD v1" diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h index 17dd32399a..3882dfb944 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_SMART.h +++ b/Marlin/src/pins/sam/pins_RAMPS_SMART.h @@ -60,12 +60,8 @@ * (Search the web for "Arduino DUE Board Pinout" to see the correct header.) */ -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due' or 'Mega 2560' in 'Tools > Board.'" -#endif - #define BOARD_INFO_NAME "RAMPS-SMART" -#define IS_RAMPS_SMART +#define ALLOW_SAM3X8E #include "../ramps/pins_RAMPS.h" // I2C EEPROM with 4K of space diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 6a283401f4..908bbc6b22 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -32,9 +32,7 @@ * | */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RuRAMPS4Due v1.1" diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 6ec10f64af..3e73c33acb 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -32,9 +32,7 @@ * | */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RuRAMPS4Due v1.3" diff --git a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h index ea096187f7..e567b0f5e1 100644 --- a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h +++ b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h @@ -26,9 +26,7 @@ * https://reprapworld.com/documentation/datasheet_ultratronics10_05.pdf */ -#if NOT_TARGET(ARDUINO_ARCH_SAM) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Ultratronics v1.0" diff --git a/Marlin/src/pins/sanguino/env_validate.h b/Marlin/src/pins/sanguino/env_validate.h new file mode 100644 index 0000000000..d229b6f102 --- /dev/null +++ b/Marlin/src/pins/sanguino/env_validate.h @@ -0,0 +1,42 @@ + /** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if ENABLED(ALLOW_MEGA644) + #if NOT_TARGET(__AVR_ATmega644__, __AVR_ATmega644P__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" + #endif +#elif ENABLED(ALLOW_MEGA644P) + #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" + #endif +#elif ENABLED(REQUIRE_MEGA644P) + #if NOT_TARGET(__AVR_ATmega644P__) + #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega644P' in 'Tools > Processor.'" + #endif +#elif NOT_TARGET(__AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega1284P' in 'Tools > Processor.' (For PlatformIO, use 'melzi' or 'melzi_optiboot.')" +#endif + +#undef ALLOW_MEGA644 +#undef ALLOW_MEGA644P +#undef REQUIRE_MEGA644P diff --git a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h index 29905c1089..1343739a11 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h @@ -48,9 +48,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__) - #error "Oops! Select 'Sanguino' in 'Tools > Board.'" -#endif +#define REQUIRE_MEGA644P +#include "env_validate.h" #define BOARD_INFO_NAME "Gen3 Monolithic" #define DEBUG_PIN 0 diff --git a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h index 33fc233f7a..7cab1bd762 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h @@ -48,9 +48,8 @@ * Once installed select the SANGUINO board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644P +#include "env_validate.h" #define BOARD_INFO_NAME "Gen3+" diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h index bfca8e90d9..51e8200b95 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6.h +++ b/Marlin/src/pins/sanguino/pins_GEN6.h @@ -50,9 +50,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644P +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Gen6" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h index 9db7d7214a..0834da78c4 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_12.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_12.h @@ -50,9 +50,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644 +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Gen7 v1.1 / 1.2" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h index 66dba533e9..97bfdd28a7 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_14.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h @@ -50,9 +50,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644 +#include "env_validate.h" #define BOARD_INFO_NAME "Gen7 v1.4" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h index 0c4871fb27..6d7678e6e3 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h @@ -53,9 +53,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644 +#include "env_validate.h" #define BOARD_INFO_NAME "Gen7 Custom" diff --git a/Marlin/src/pins/sanguino/pins_OMCA_A.h b/Marlin/src/pins/sanguino/pins_OMCA_A.h index 7707320519..a3ceb76a0d 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA_A.h +++ b/Marlin/src/pins/sanguino/pins_OMCA_A.h @@ -74,7 +74,7 @@ */ #if NOT_TARGET(__AVR_ATmega644__) - #error "Oops! Select 'Sanguino' in 'Tools > Board' and ATmega644 in 'Tools > Processor.'" + #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega644' in 'Tools > Processor.'" #endif #define BOARD_INFO_NAME "Alpha OMCA" diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index af27159936..d79ad7a3dd 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -50,9 +50,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644P +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Sanguinololu <1.2" diff --git a/Marlin/src/pins/sanguino/pins_SETHI.h b/Marlin/src/pins/sanguino/pins_SETHI.h index dc2133e441..a2240b385b 100644 --- a/Marlin/src/pins/sanguino/pins_SETHI.h +++ b/Marlin/src/pins/sanguino/pins_SETHI.h @@ -49,9 +49,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644 +#include "env_validate.h" #define BOARD_INFO_NAME "Sethi 3D_1" diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index d064d80132..0265ae0a64 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -21,9 +21,8 @@ */ #pragma once -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644P +#include "env_validate.h" #define BOARD_INFO_NAME "Zonestar ZMIB_V2" #define BOARD_WEBSITE_URL "www.aliexpress.com/item/32957490744.html" diff --git a/Marlin/src/pins/stm32f1/env_validate.h b/Marlin/src/pins/stm32f1/env_validate.h new file mode 100644 index 0000000000..62ccf7edcc --- /dev/null +++ b/Marlin/src/pins/stm32f1/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif diff --git a/Marlin/src/pins/stm32f1/pins_BEAST.h b/Marlin/src/pins/stm32f1/pins_BEAST.h index bf2cf6463a..05f77f1029 100644 --- a/Marlin/src/pins/stm32f1/pins_BEAST.h +++ b/Marlin/src/pins/stm32f1/pins_BEAST.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 21017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h index 73a18faf05..e76c77e706 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h @@ -28,9 +28,7 @@ #define DEFAULT_MACHINE_NAME "Creality3D" #define BOARD_INFO_NAME "BTT SKR CR-6" -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" // // Release PB4 (Z_STEP_PIN) from JTAG NRST role diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index bb6f571924..dd6edf9024 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 2017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index c90ae84acb..d25a1f34f9 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 2017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 96cf36629a..5afa653117 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 2017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 88806bdb18..733e24cfac 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -24,9 +24,9 @@ * Creality 4.2.x (STM32F103RET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "Creality V4 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h index 025e68d4da..6585d40d45 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h @@ -24,9 +24,9 @@ * CREALITY 4.2.10 (STM32F103) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h index f2be289530..c73c92080e 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h @@ -24,9 +24,7 @@ * Creality v4.5.2 and v4.5.3 (STM32F103RET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "Creality3D" diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index 2278d55870..b94ec0c7f3 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "FLY_MINI" #define BOARD_WEBSITE_URL "github.com/FLYmaker" diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index 3919723f37..7ffe67c4f8 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "FYSETC AIO II" #define BOARD_WEBSITE_URL "fysetc.com" diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index c978092ab2..552ad9ac57 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "3D Printer" diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h index 65b16755ca..ba35265d10 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #include "pins_FYSETC_CHEETAH.h" diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index f67dc85b40..4edd67a14d 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -25,9 +25,7 @@ * Geeetech GTM32 Mini board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GTM32 Pro VB" #define DEFAULT_MACHINE_NAME "STM32F103VET6" diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 27b0362758..f346c3a9fd 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -25,9 +25,7 @@ * Geeetech GTM32 Mini A30 board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GTM32 Pro VB" #define DEFAULT_MACHINE_NAME "STM32F103VET6" diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index d4ab2ff3e5..18156fc0ff 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -26,9 +26,7 @@ * http://www.geeetech.com/wiki/index.php/File:Hardware_GTM32_PRO_VB.pdf */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GTM32 Pro VB/VD" #define DEFAULT_MACHINE_NAME "STM32F103VET6" diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index 8e96327816..865de809e2 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -25,9 +25,7 @@ * Geeetech GTM32 Rev. B board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GTM32 Rev B" #define DEFAULT_MACHINE_NAME "M201" diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index 4f02b0e23c..9f08f18bf7 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -28,9 +28,9 @@ * Pin assignments for 32-bit JGAurora A5S & A1 */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "JGAurora A5S A1 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 3118a521bb..14664bda39 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -25,9 +25,9 @@ * MKS Robin nano (STM32F130VET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin E3P only supports one hotend / E-stepper. Comment out this line to continue." #elif HAS_FSMC_TFT #error "MKS Robin E3P doesn't support FSMC-based TFT displays." diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index c4a7e9f408..da7bdc79e5 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -25,9 +25,7 @@ * MKS Robin E3 & E3D (STM32F103RCT6) common board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_NO_NATIVE_USB diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index 13c2d41d57..fad36e8384 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin Lite only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index f814052fa8..73fefddf8f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -25,9 +25,9 @@ * MKS Robin Lite 3 (STM32F103RCT6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin Lite3 supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index b3cfe5b6ba..be23394af7 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -25,9 +25,9 @@ * MKS Robin mini (STM32F130VET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin mini only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 39676bf9d7..10e1633124 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -25,9 +25,9 @@ * MKS Robin pro (STM32F103ZET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "MKS Robin pro supports up to 3 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index d666755c6f..c08b707d7e 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 21017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index 4f8183caf4..d25ca1bd2e 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 21017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index ed70d8d28f..dc603cda54 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -28,9 +28,9 @@ * https://github.com/MarlinFirmware/Marlin/files/3401484/x5sa-main_board-2.pdf */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Trigorilla Pro supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/env_validate.h b/Marlin/src/pins/stm32f4/env_validate.h new file mode 100644 index 0000000000..c01401f06c --- /dev/null +++ b/Marlin/src/pins/stm32f4/env_validate.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(STM32F4) && (DISABLED(ALLOW_STM32DUINO) || NOT_TARGET(STM32F4xx)) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#endif + +#undef ALLOW_STM32DUINO diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h index 487080f46b..1e1f5251c1 100644 --- a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h @@ -22,9 +22,11 @@ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "Anet ET4 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h index db57db14d5..a67af089f2 100644 --- a/Marlin/src/pins/stm32f4/pins_ARMED.h +++ b/Marlin/src/pins/stm32f4/pins_ARMED.h @@ -24,9 +24,9 @@ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Arm'ed supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index c2ad907e04..d8a83bef3a 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -27,9 +27,10 @@ * Shield - https://github.com/jmz52/Hardware */ -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Black STM32F4VET6 supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index bc69e1fd21..6029031a63 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "BIGTREE BTT002 V1.0 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index cd9d60d2f0..6c59f27c5e 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 8 || E_STEPPERS > 8 +#include "env_validate.h" + +#if HOTENDS > 8 || E_STEPPERS > 8 #error "BIGTREE GTR V1.0 supports up to 8 hotends / E-steppers." #elif HOTENDS > MAX_E_STEPPERS || E_STEPPERS > MAX_E_STEPPERS #error "Marlin extruder/hotends limit! Increase MAX_E_STEPPERS to continue." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index ab7f5126ff..863429f2a2 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#endif +#include "env_validate.h" // BigTreeTech driver expansion module https://bit.ly/3ptRRoj //#define BTT_MOTOR_EXPANSION diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 7965d262c3..34124a9b02 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -21,9 +21,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 6 || E_STEPPERS > 6 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 6 || E_STEPPERS > 6 #error "FLYF407ZG supports up to 6 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h index ad43765135..ef1c14aae0 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "3D Printer" diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index a280775646..d617087e9d 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA32 supports up to 3 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index bf6df03562..fad8d2059e 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -18,9 +18,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "LERDGE K supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index c6cfa98831..105d0d6f60 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -18,9 +18,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "LERDGE S supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 606d932c57..974392373f 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -18,9 +18,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "LERDGE X only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h index c2f5f324ba..589300f341 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "MKS_ROBIN2 supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index 8308f3998f..f9e85c4919 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -21,9 +21,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin Nano V3 supports up to 2 hotends / E-steppers." #elif HAS_FSMC_TFT #error "MKS Robin Nano V3 doesn't support FSMC-based TFT displays." diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index 5533e35f07..f2ddfc2b52 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -21,9 +21,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin Nano V3 supports up to 1 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 2a0cfa897c..be6e4f8a34 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -25,9 +25,9 @@ * Common pin assignments for all RUMBA32 boards */ -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA32 boards support up to 3 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h index 25679517c2..dc02fd02ea 100644 --- a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h +++ b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h @@ -40,9 +40,7 @@ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifndef MACHINE_NAME #define MACHINE_NAME "STEVAL-3DP001V1" diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index 1135af847f..9d122c2642 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -21,9 +21,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "STM32F4 supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/teensy2/env_validate.h b/Marlin/src/pins/teensy2/env_validate.h new file mode 100644 index 0000000000..5f0ea4f3b6 --- /dev/null +++ b/Marlin/src/pins/teensy2/env_validate.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(__AVR_AT90USB1286__) && (DISABLED(ALLOW_AT90USB1286P) || NOT_TARGET(__AVR_AT90USB1286P__)) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#undef ALLOW_AT90USB1286P diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h index 908e12e0ba..6e1f9c0217 100644 --- a/Marlin/src/pins/teensy2/pins_5DPRINT.h +++ b/Marlin/src/pins/teensy2/pins_5DPRINT.h @@ -68,9 +68,7 @@ * https://bitbucket.org/makible/5dprint-d8-controller-board */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "Makibox" #define BOARD_INFO_NAME "5DPrint D8" diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h index 97d210a0f8..cdcc249c00 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h @@ -69,7 +69,7 @@ */ #if NOT_TARGET(__AVR_AT90USB646__) - #error "Oops! Select 'AT90USB646_TEENSYPP' in 'Tools > Board.'" + #error "Oops! Select 'Brainwave' in 'Tools > Board.'" #endif #define BOARD_INFO_NAME "Brainwave" diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h index e41fcaab94..319130ef96 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h @@ -75,9 +75,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Brainwave Pro" diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index 2401c976f1..7b3685d08e 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -62,9 +62,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Printrboard" diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index d4f9fc7641..0e6842125e 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -63,9 +63,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #if !defined(__MARLIN_DEPS__) && !defined(USBCON) #error "USBCON should be defined by the platform for this board." diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h index bcc456c16e..cdba535090 100644 --- a/Marlin/src/pins/teensy2/pins_SAV_MKI.h +++ b/Marlin/src/pins/teensy2/pins_SAV_MKI.h @@ -62,9 +62,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "SAV MkI" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME diff --git a/Marlin/src/pins/teensy2/pins_TEENSY2.h b/Marlin/src/pins/teensy2/pins_TEENSY2.h index d43e39b09a..efb409bf32 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSY2.h +++ b/Marlin/src/pins/teensy2/pins_TEENSY2.h @@ -107,9 +107,7 @@ * E DIR 35 a7 a3 31 Y DIR */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Teensy++2.0" diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index 54cee137ad..f551d802cf 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -72,6 +72,9 @@ * The pin assignments in this file match the silkscreen. */ +#define ALLOW_AT90USB1286P +#include "env_validate.h" + #if NOT_TARGET(__AVR_AT90USB1286__, __AVR_AT90USB1286P__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 00f7a2e7e0..d769ff8cb8 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -21,7 +21,7 @@ Usage: mftest [-t|--env=] [-n|--num=] [-m|--make] [-y|--build=] OPTIONS -t --env The environment of the test to apply / run. (As named in platformio.ini.) - -n --num The index of the test to run. (In *-tests file order.) + -n --num The index of the test to run. (In file order.) -m --make Use the make / Docker method for the build. -y --build Skip 'Do you want to build this test?' and assume YES. -h --help Print this help. @@ -204,11 +204,10 @@ fi if [[ $TESTENV == '-' ]]; then IND=0 NAMES=() - for FILE in $( ls -1 $TESTPATH/*-tests ) + for FILE in $( ls -1 $TESTPATH/* ) do let IND++ - TNAME=${FILE/-tests/} - TNAME=${TNAME/$TESTPATH\//} + TNAME=${FILE/$TESTPATH\//} NAMES+=($TNAME) (( IND < 10 )) && echo -n " " echo " $IND) $TNAME" @@ -231,7 +230,7 @@ if [[ $TESTENV == '-' ]]; then fi # Get the contents of the test file -OUT=$( cat $TESTPATH/$TESTENV-tests 2>/dev/null ) || { errout "Can't find test '$TESTENV'." ; exit 1 ; } +OUT=$( cat $TESTPATH/$TESTENV 2>/dev/null ) || { errout "Can't find test '$TESTENV'." ; exit 1 ; } # Count up the number of tests TESTCOUNT=$( awk "/$ISEXEC/{a++}END{print a}" <<<"$OUT" ) @@ -297,7 +296,7 @@ echo "$OUT" | { echo -ne "\033[0m" # Make clear it's a TEST -opt_set CUSTOM_MACHINE_NAME "\"$TESTENV-tests ($CHOICE)\"" +opt_set CUSTOM_MACHINE_NAME "\"Test $TESTENV ($CHOICE)\"" # Build the test too? if [[ -z "$BUILD_YES" ]]; then diff --git a/buildroot/tests/run_tests b/buildroot/bin/run_tests similarity index 79% rename from buildroot/tests/run_tests rename to buildroot/bin/run_tests index c4286f4695..26284fa693 100755 --- a/buildroot/tests/run_tests +++ b/buildroot/bin/run_tests @@ -2,8 +2,9 @@ # # run_tests # -export PATH="$PATH:$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" -export PATH="$PATH:./buildroot/bin" +HERE="$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" +TESTS="$HERE/../tests" +export PATH="$HERE:$TESTS:$PATH" # exit on first failure set -e @@ -40,10 +41,9 @@ export -f exec_test printf "Running \033[0;32m$2\033[0m Tests\n" if [[ $2 = "ALL" ]]; then - dir_list=("$(dirname "${BASH_SOURCE[0]}")"/*) - declare -a tests=(${dir_list[@]/*run_tests/}) + tests=("$TESTS"/*) for f in "${tests[@]}"; do - testenv=$(basename $f | cut -d"-" -f1) + testenv=$(basename $f) printf "Running \033[0;32m$f\033[0m Tests\n" exec_test $1 "$testenv --target clean" "Setup Build Environment" if [[ $GIT_RESET_HARD == "true" ]]; then @@ -58,16 +58,16 @@ else # If the test name is 1 or 2 digits, treat it as an index if [[ "$test_name" =~ ^[0-9][0-9]?$ ]] ; then # Find the test name that corresponds to that index - test_name="$(cat buildroot/tests/$2-tests | grep -e '^exec_test' | sed -n "$3p" | sed "s/.*\$1 \$2 \"\([^\"]*\).*/\1/g")" + test_name="$(cat $TESTS/$2 | grep -e '^exec_test' | sed -n "$3p" | sed "s/.*\$1 \$2 \"\([^\"]*\).*/\1/g")" if [[ -z "$test_name" ]] ; then # Fail if none matches - printf "\033[0;31mCould not find test \033[0m#$3\033[0;31m in \033[0mbuildroot/tests/$2-tests\n" + printf "\033[0;31mCould not find test \033[0m#$3\033[0;31m in \033[0mbuildroot/tests/$2\n" exit 1 else printf "\033[0;32mMatching test \033[0m#$3\033[0;32m: '\033[0m$test_name\033[0;32m'\n" fi fi - $2-tests $1 $2 "$test_name" + $TESTS/$2 $1 $2 "$test_name" if [[ $GIT_RESET_HARD == "true" ]]; then git reset --hard HEAD else diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py deleted file mode 100644 index 2b1b948119..0000000000 --- a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py +++ /dev/null @@ -1,16 +0,0 @@ -# -# common-dependencies-post.py -# Convenience script to add build flags for Marlin Enabled Features -# - -Import("env") -Import("projenv") - -def apply_board_build_flags(): - if not 'BOARD_CUSTOM_BUILD_FLAGS' in env['MARLIN_FEATURES']: - return - projenv.Append(CCFLAGS=env['MARLIN_FEATURES']['BOARD_CUSTOM_BUILD_FLAGS'].split()) - -# We need to add the board build flags in a post script -# so the platform build script doesn't overwrite the custom CCFLAGS -apply_board_build_flags() diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 4c8a00e74c..969a82aad2 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -49,8 +49,7 @@ config = env.GetProjectConfig() result = check_envs("env:"+build_env, base_envs, config) if not result: - err = "Error: your selected build environment '%s' is not compatible with MOTHERBOARD=%s in Configuration.h. " \ - "Please use one of compatible build environments for this board: %s" % \ + err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) raise SystemExit(err) diff --git a/buildroot/tests/ARMED-tests b/buildroot/tests/ARMED similarity index 100% rename from buildroot/tests/ARMED-tests rename to buildroot/tests/ARMED diff --git a/buildroot/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002 similarity index 100% rename from buildroot/tests/BIGTREE_BTT002-tests rename to buildroot/tests/BIGTREE_BTT002 diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0 similarity index 100% rename from buildroot/tests/BIGTREE_GTR_V1_0-tests rename to buildroot/tests/BIGTREE_GTR_V1_0 diff --git a/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive similarity index 100% rename from buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests rename to buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO similarity index 100% rename from buildroot/tests/BIGTREE_SKR_PRO-tests rename to buildroot/tests/BIGTREE_SKR_PRO diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE similarity index 100% rename from buildroot/tests/DUE-tests rename to buildroot/tests/DUE diff --git a/buildroot/tests/DUE_archim-tests b/buildroot/tests/DUE_archim similarity index 100% rename from buildroot/tests/DUE_archim-tests rename to buildroot/tests/DUE_archim diff --git a/buildroot/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG similarity index 100% rename from buildroot/tests/FLYF407ZG-tests rename to buildroot/tests/FLYF407ZG diff --git a/buildroot/tests/FYSETC_F6-tests b/buildroot/tests/FYSETC_F6 similarity index 100% rename from buildroot/tests/FYSETC_F6-tests rename to buildroot/tests/FYSETC_F6 diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6 similarity index 100% rename from buildroot/tests/FYSETC_S6-tests rename to buildroot/tests/FYSETC_S6 diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX similarity index 100% rename from buildroot/tests/LERDGEX-tests rename to buildroot/tests/LERDGEX diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768 similarity index 100% rename from buildroot/tests/LPC1768-tests rename to buildroot/tests/LPC1768 diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769 similarity index 100% rename from buildroot/tests/LPC1769-tests rename to buildroot/tests/LPC1769 diff --git a/buildroot/tests/NUCLEO_F767ZI-tests b/buildroot/tests/NUCLEO_F767ZI similarity index 100% rename from buildroot/tests/NUCLEO_F767ZI-tests rename to buildroot/tests/NUCLEO_F767ZI diff --git a/buildroot/tests/REMRAM_V1-tests b/buildroot/tests/REMRAM_V1 similarity index 100% rename from buildroot/tests/REMRAM_V1-tests rename to buildroot/tests/REMRAM_V1 diff --git a/buildroot/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4 similarity index 100% rename from buildroot/tests/SAMD51_grandcentral_m4-tests rename to buildroot/tests/SAMD51_grandcentral_m4 diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan similarity index 100% rename from buildroot/tests/STM32F070CB_malyan-tests rename to buildroot/tests/STM32F070CB_malyan diff --git a/buildroot/tests/STM32F070RB_malyan-tests b/buildroot/tests/STM32F070RB_malyan similarity index 100% rename from buildroot/tests/STM32F070RB_malyan-tests rename to buildroot/tests/STM32F070RB_malyan diff --git a/buildroot/tests/STM32F103CB_malyan-tests b/buildroot/tests/STM32F103CB_malyan similarity index 100% rename from buildroot/tests/STM32F103CB_malyan-tests rename to buildroot/tests/STM32F103CB_malyan diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt similarity index 100% rename from buildroot/tests/STM32F103RC_btt-tests rename to buildroot/tests/STM32F103RC_btt diff --git a/buildroot/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB similarity index 100% rename from buildroot/tests/STM32F103RC_btt_USB-tests rename to buildroot/tests/STM32F103RC_btt_USB diff --git a/buildroot/tests/STM32F103RC_fysetc-tests b/buildroot/tests/STM32F103RC_fysetc similarity index 100% rename from buildroot/tests/STM32F103RC_fysetc-tests rename to buildroot/tests/STM32F103RC_fysetc diff --git a/buildroot/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb similarity index 100% rename from buildroot/tests/STM32F103RC_meeb-tests rename to buildroot/tests/STM32F103RC_meeb diff --git a/buildroot/tests/STM32F103RE-tests b/buildroot/tests/STM32F103RE similarity index 100% rename from buildroot/tests/STM32F103RE-tests rename to buildroot/tests/STM32F103RE diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality similarity index 100% rename from buildroot/tests/STM32F103RET6_creality-tests rename to buildroot/tests/STM32F103RET6_creality diff --git a/buildroot/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt similarity index 100% rename from buildroot/tests/STM32F103RE_btt-tests rename to buildroot/tests/STM32F103RE_btt diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB similarity index 100% rename from buildroot/tests/STM32F103RE_btt_USB-tests rename to buildroot/tests/STM32F103RE_btt_USB diff --git a/buildroot/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer similarity index 100% rename from buildroot/tests/STM32F103VE_longer-tests rename to buildroot/tests/STM32F103VE_longer diff --git a/buildroot/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL similarity index 100% rename from buildroot/tests/STM32F401VE_STEVAL-tests rename to buildroot/tests/STM32F401VE_STEVAL diff --git a/buildroot/tests/STM32F407VE_black-tests b/buildroot/tests/STM32F407VE_black similarity index 100% rename from buildroot/tests/STM32F407VE_black-tests rename to buildroot/tests/STM32F407VE_black diff --git a/buildroot/tests/at90usb1286_cdc-tests b/buildroot/tests/at90usb1286_cdc similarity index 100% rename from buildroot/tests/at90usb1286_cdc-tests rename to buildroot/tests/at90usb1286_cdc diff --git a/buildroot/tests/at90usb1286_dfu-tests b/buildroot/tests/at90usb1286_dfu similarity index 100% rename from buildroot/tests/at90usb1286_dfu-tests rename to buildroot/tests/at90usb1286_dfu diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32 similarity index 100% rename from buildroot/tests/esp32-tests rename to buildroot/tests/esp32 diff --git a/buildroot/tests/jgaurora_a5s_a1-tests b/buildroot/tests/jgaurora_a5s_a1 similarity index 100% rename from buildroot/tests/jgaurora_a5s_a1-tests rename to buildroot/tests/jgaurora_a5s_a1 diff --git a/buildroot/tests/linux_native-tests b/buildroot/tests/linux_native similarity index 100% rename from buildroot/tests/linux_native-tests rename to buildroot/tests/linux_native diff --git a/buildroot/tests/malyan_M300-tests b/buildroot/tests/malyan_M300 similarity index 100% rename from buildroot/tests/malyan_M300-tests rename to buildroot/tests/malyan_M300 diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280 similarity index 100% rename from buildroot/tests/mega1280-tests rename to buildroot/tests/mega1280 diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560 similarity index 100% rename from buildroot/tests/mega2560-tests rename to buildroot/tests/mega2560 diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin similarity index 100% rename from buildroot/tests/mks_robin-tests rename to buildroot/tests/mks_robin diff --git a/buildroot/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite similarity index 100% rename from buildroot/tests/mks_robin_lite-tests rename to buildroot/tests/mks_robin_lite diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini similarity index 100% rename from buildroot/tests/mks_robin_mini-tests rename to buildroot/tests/mks_robin_mini diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35 similarity index 100% rename from buildroot/tests/mks_robin_nano35-tests rename to buildroot/tests/mks_robin_nano35 diff --git a/buildroot/tests/mks_robin_nano35_stm32-tests b/buildroot/tests/mks_robin_nano35_stm32 similarity index 100% rename from buildroot/tests/mks_robin_nano35_stm32-tests rename to buildroot/tests/mks_robin_nano35_stm32 diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro similarity index 100% rename from buildroot/tests/mks_robin_pro-tests rename to buildroot/tests/mks_robin_pro diff --git a/buildroot/tests/mks_robin_stm32-tests b/buildroot/tests/mks_robin_stm32 similarity index 100% rename from buildroot/tests/mks_robin_stm32-tests rename to buildroot/tests/mks_robin_stm32 diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo similarity index 100% rename from buildroot/tests/rambo-tests rename to buildroot/tests/rambo diff --git a/buildroot/tests/rumba32-tests b/buildroot/tests/rumba32 similarity index 100% rename from buildroot/tests/rumba32-tests rename to buildroot/tests/rumba32 diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p similarity index 100% rename from buildroot/tests/sanguino1284p-tests rename to buildroot/tests/sanguino1284p diff --git a/buildroot/tests/sanguino644p-tests b/buildroot/tests/sanguino644p similarity index 100% rename from buildroot/tests/sanguino644p-tests rename to buildroot/tests/sanguino644p diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31 similarity index 100% rename from buildroot/tests/teensy31-tests rename to buildroot/tests/teensy31 diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35 similarity index 100% rename from buildroot/tests/teensy35-tests rename to buildroot/tests/teensy35 diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41 similarity index 100% rename from buildroot/tests/teensy41-tests rename to buildroot/tests/teensy41 diff --git a/platformio.ini b/platformio.ini index aad59362cc..74452754ad 100644 --- a/platformio.ini +++ b/platformio.ini @@ -215,7 +215,6 @@ extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py pre:buildroot/share/PlatformIO/scripts/preflight-checks.py - post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = @@ -728,6 +727,12 @@ platform = ${common_LPC.platform} extends = common_LPC board = nxp_lpc1769 +# BTT SKR 1.4 needs a UART3 tweak +[env:LPC1768_btt_skr_v1_4] +platform = ${LPC1768.platform} +extends = env:LPC1768 +build_flags = ${env:LPC1768.build_flags} -DLPC_PINCFG_UART3_P4_28 + ################################# # # # STM32 Architecture # From 35355d1f1b88d9e4304916730839e5dc9347c902 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 5 Mar 2021 23:53:44 -0800 Subject: [PATCH 1115/1370] Tweak/Consolidate followup (#21261) --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 74452754ad..0ed883ba0d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -729,7 +729,7 @@ board = nxp_lpc1769 # BTT SKR 1.4 needs a UART3 tweak [env:LPC1768_btt_skr_v1_4] -platform = ${LPC1768.platform} +platform = ${env:LPC1768.platform} extends = env:LPC1768 build_flags = ${env:LPC1768.build_flags} -DLPC_PINCFG_UART3_P4_28 From 34b76c6f8047cff871d08132b104f1e46929bc05 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sat, 6 Mar 2021 08:56:43 +0100 Subject: [PATCH 1116/1370] Link to bugfix tree (#21263) --- config/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/README.md b/config/README.md index b5013627ea..4bd6ab851e 100644 --- a/config/README.md +++ b/config/README.md @@ -2,7 +2,7 @@ Marlin configurations for specific machines are now maintained in their own repository at: -## https://github.com/MarlinFirmware/Configurations +## https://github.com/MarlinFirmware/Configurations/tree/bugfix-2.0.x Configuration files for use with the nightly `bugfix-2.0.x` branch can be downloaded from: From 74457dc989bd3adcf5ff707b83aa4e9caead86e9 Mon Sep 17 00:00:00 2001 From: "Zs.Antal" <45710979+AntoszHUN@users.noreply.github.com> Date: Sat, 6 Mar 2021 09:00:10 +0100 Subject: [PATCH 1117/1370] Update Hungarian language (#21266) --- Marlin/src/lcd/language/language_hu.h | 403 ++++++++++++++------------ 1 file changed, 214 insertions(+), 189 deletions(-) diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index c5cd845c27..e29b75fb35 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -27,14 +27,12 @@ * LCD Menü Ãœzenetek. Lásd még https://marlinfw.org/docs/development/lcd_language.html * Marlin 2.0.x bugfix Magyar fordítása. A fordítást folyamatosan javítom és frissítem. * A Magyar fordítást készítette: AntoszHUN - * - * + * A Fordítás utolsó frissítése: 2021.03.06. - 08:00 */ namespace Language_hu { using namespace Language_en; // A fordítás az örökölt Amerikai Angol (English) karakterláncokat használja. - constexpr uint8_t CHARSIZE = 2; PROGMEM Language_Str LANGUAGE = _UxGT("Magyar"); @@ -44,8 +42,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_NO = _UxGT("NEM"); PROGMEM Language_Str MSG_BACK = _UxGT("Vissza"); PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Megszakítás..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló Behelyezve"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló Eltávolítva"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló behelyezve"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló eltávolítva"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra"); PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD-Kártya hiba"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba"); @@ -53,31 +51,34 @@ namespace Language_hu { PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba"); PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Túlfolyás"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Végállás"); // Maximum 8 karakter - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. Végállás"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. végállás"); PROGMEM Language_Str MSG_MAIN = _UxGT(""); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További Beállítások"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További beállítások"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguráció"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoinditás"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Fájl auto. futtatás"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("XYZ Auto kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("X-Y-Z Auto kezdöpont"); PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Kezdöpont"); PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Kezdöpont"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Kezdöpont"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Igazítás"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Elektromos segéd"); PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Ismétlés: %i"); PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Pontosság csökken!"); PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Pontosság elérve"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Kezdöpont"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("X-Y-Z Kezdöpont"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez."); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö Pont"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Szintezés Kész!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Szint Csökkentés"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö pont"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Szintezés kész!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Szint csökkentés"); PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Kezdöpont eltolás"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Eltolás beállítva."); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Eredeti Be"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Elektromos segéd"); + PROGMEM Language_Str MSG_TRAMMING_WIZARD = _UxGT("Elektromos varázsló"); + PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Eredeti választása"); + PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Utolsó érték "); #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Fütés ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Fütés ") PREHEAT_1_LABEL " ~"; @@ -95,36 +96,43 @@ namespace Language_hu { PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Fütés $ Ãgy"); PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Fütés $ Beáll"); #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Egyedi Elömelegítés"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Egyedi elömelegítés"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Visszahütés"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer Vezérlés"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lézer Ki"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lézer Be"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer Teljesítmény"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó Vezérlés"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Orsó Ki"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Orsó Be"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó Teljesítmény"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó Hátra"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer vezérlés"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó vezérlés"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer telj."); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó telj."); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Lézer váltás"); + PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Impulzus teszt ms"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Tűz impulzus"); + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Orsóváltás"); + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Orsó elÅ‘re"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó hátra"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bekapcsolás"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Kikapcsolás"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudál"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Adagol"); PROGMEM Language_Str MSG_RETRACT = _UxGT("Visszahúz"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Tengelyek Mozgatása"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ãgy Szintezés"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Tengelyek mozgatása"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ãgy szintezés"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ãgy szintezése"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Sarok szint"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Ãgy emelése a szonda váltásig"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Minden sarok tolerancián belül. Szint jó"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Jó pontok: "); + PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Utolsó Z: "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Következö sarok"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Háló Szerkesztö"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Háló Szerkesztése"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Háló Szerk. Ãllj"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Háló szerkesztö"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Háló szerkesztése"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Háló szerk. állj"); PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Próbapont"); PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Érték"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni parancs"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Teszt"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe teszt"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Pont"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Szonda határon kívül"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Eltérés"); @@ -134,6 +142,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Teljes felügyelet"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("X-Hézag másolása"); PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. fúvóka X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. fúvóka Y"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fúvóka Z"); @@ -146,75 +155,75 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mérés"); PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Ãœres ágyat mérj"); PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Továbblépés"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL Aktivál"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL Deaktivál"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ãgy Höfok"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Ãgy Höfok"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fúvóka Höfok"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fúvóka Höfok"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Háló Szerkesztés"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni Háló Szerkesztés"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított Háló"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló Kész"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni Háló Építés"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló Építés"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló Építés ($)"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL Aktívál"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL Deaktívál"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ãgy höfok"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Ãgy höfok"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fúvóka höfok"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fúvóka höfok"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Háló szerkesztés"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni háló szerkesztés"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított háló"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló kész"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni háló építés"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló építés"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló építés ($)"); PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg háló építés"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Háló magasság állítás"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Magasság összege"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló Elfogadás"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló Elfogadás ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi Háló Elfogadása"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ãgy Fűtés"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka Fűtés"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló elfogadás"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló elfogadás ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi háló elfogadása"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ãgy fűtés"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka fűtés"); PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Kézi alapozás..."); PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fix hosszúságú alap"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Alapozás Kész"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Alapozás kész"); PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Törölve"); PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Kilépö G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ãgy Háló Folyt."); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Háló Szintezés"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Pontos Szintezés"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rács Szintezés"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Háló Szint"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ãgy háló folyt."); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Háló szintezés"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Pontos szintezés"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rács szintezés"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Háló szint"); PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Oldal pontok"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Térkép Típus"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Háló Térkép Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató Backup Ki"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Infó Kimenet"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési Költség"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi Kitöltés"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Okos Kitöltés"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Háló Kitöltés"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Minden Érvénytelen"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Közelebbi Érvénytelen"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Mindet Finomhangolja"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Közelebbi Finomhangolása"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Háló Tárolás"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memória Foglalat"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ãgy háló Betöltés"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Ãgy háló Mentés"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Háló %i Betöltve"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Háló %i Mentve"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Térkép típus"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Háló térkép kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató bizt.mentés"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Infó kimenet"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési költség"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi kitöltés"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Okos kitöltés"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Háló kitöltés"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Minden érvénytelen"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Közelebbi érvénytelen"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Mindet finomhangolja"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Közelebbi finomhangolása"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Háló tárolás"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memória foglalat"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ãgy háló betöltés"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Ãgy háló mentés"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Háló %i betöltve"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Háló %i mentve"); PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nincs tároló"); PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL Mentés"); PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL Visszaáll"); PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Eltolás: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Eltolás Leállítva"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl Lépésre UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg Háló Készítés"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens Kitöltés"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Háló Érvényesítés"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Minden Finomítása"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Háló Érvényesítés"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden Finomítása"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Ãgy Háló Mentése"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Eltolás leállítva"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl lépésre UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg háló készítés"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens kitöltés"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Háló érvényesítés"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Minden finomítása"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Háló érvényesítés"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden finomítása"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Ãgy háló mentése"); PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Vezérlés"); PROGMEM Language_Str MSG_LEDS = _UxGT("Világítás"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Beállított Színek"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Beállított színek"); PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Piros"); PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Narancs"); PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Sárga"); @@ -225,14 +234,14 @@ namespace Language_hu { PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Fehér"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték"); PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Csatorna ="); - PROGMEM Language_Str MSG_LEDS2 = _UxGT("LEDek #2"); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("LED-ek #2"); PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Fény #2 Megadott"); PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("FényerÅ‘"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni Szín"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zöld Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Kék Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Fehér Intenzitás"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni szín"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zöld intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Kék intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Fehér intenzitás"); PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Fényerö"); PROGMEM Language_Str MSG_MOVING = _UxGT("Mozgás..."); @@ -243,27 +252,30 @@ namespace Language_hu { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mozgás %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mozgás %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mozgás 10mm"); + PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Mozgás 0.001mm"); + PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Mozgás 0.01mm"); + PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_SPEED = _UxGT("Sebesség"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Z ágy"); PROGMEM Language_Str MSG_NOZZLE = _UxGT("Fúvóka"); PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Fúvóka ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Fej Parkolva"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Fej Készenlétbe"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Fej parkolva"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Fej készenlétbe"); PROGMEM Language_Str MSG_BED = _UxGT("Ãgy"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Burkolat"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Hütés sebesség"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Hütés sebesség ="); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Tárolt Hütés ="); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Tárolt hütés ="); PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra hütés sebesség"); PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra hütés sebesség ="); PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Hűtésvezérlés"); PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Alapjárat"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus Mód"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív Sebesség"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus mód"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív sebesség"); PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Készenlét"); PROGMEM Language_Str MSG_FLOW = _UxGT("Folyás"); PROGMEM Language_Str MSG_FLOW_N = _UxGT("Folyás ~"); @@ -271,13 +283,13 @@ namespace Language_hu { PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Minimum"); PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Maximum"); PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Tényezö"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Automata Höfok"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Automata höfok"); PROGMEM Language_Str MSG_LCD_ON = _UxGT("Be"); PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Ki"); PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Hangolás"); PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Hangolás *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID hangolás kész"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz Adagoló."); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID Hangolás kész"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz adagoló."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Hangolási hiba. Magas hömérséklet."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Hangolási hiba! Idötúllépés."); PROGMEM Language_Str MSG_SELECT = _UxGT("Kiválaszt"); @@ -288,25 +300,25 @@ namespace Language_hu { PROGMEM Language_Str MSG_VB_JERK = LCD_STR_B _UxGT(" Ránt. Seb."); PROGMEM Language_Str MSG_VC_JERK = LCD_STR_C _UxGT(" Ránt. Seb."); PROGMEM Language_Str MSG_VE_JERK = _UxGT("E Ránt. Seb."); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Csomopont Eltérés"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Csomopont eltérés"); PROGMEM Language_Str MSG_VELOCITY = _UxGT("Sebesség"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Max Sebesség ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Max Sebesség ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Max Sebesség ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Max Sebesség ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Max Sebesség *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Min Sebesség"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Min Utazó.seb."); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Max sebesség ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Max sebesség ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Max sebesség ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Max sebesség ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Max sebesség *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("Min sebesség"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Min utazó.seb."); PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Gyorsulás"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max Gyors. ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max Gyors. ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max Gyors. ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max Gyors. ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Max Gyorsulás *"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max gyors. ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max gyors. ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max gyors. ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max gyors. ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Max gyorsulás *"); PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Visszahúzás"); PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Utazás"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Max Frekvencia"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min Elötolás"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Max frekvencia"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min elötolás"); PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Lépés/mm"); PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" lépés/mm"); PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" lépés/mm"); @@ -325,7 +337,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Betöltés mm"); PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Haladó K"); PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Haladó K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontraszt"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Kontraszt"); PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Mentés EEPROM"); PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Betöltés EEPROM"); PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Alapértelmezett"); @@ -333,9 +345,9 @@ namespace Language_hu { PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Hiba: EEPROM CRC"); PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM Index"); PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM Verzió"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Beállítások Mentve"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Tároló Frissítés"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Nyomtató Újraindítása"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Beállítások mentve"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Tároló frissítés"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Nyomtató újraindítása"); PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés"); PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); PROGMEM Language_Str MSG_PREPARE = _UxGT("Vezérlés"); @@ -344,7 +356,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_CURRENT = _UxGT("Jelenlegi"); PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Feszültség"); PROGMEM Language_Str MSG_POWER = _UxGT("Energia"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Nyomtatás Indítása"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Nyomtatás indítása"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Tovább"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Kezdet"); PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Ãllj"); @@ -355,23 +367,25 @@ namespace Language_hu { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Kész"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Vissza"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Folytatás"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("Kihagy"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Szüneteltetve..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Nyomtatás Szünetelés"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Nyomtatás szünetelés"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nyomtatás folytatása"); PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Hoszt indítás"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Nyomtatás leállítása"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objektum Nyomtatása"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objektum Törlése"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objektum Törlése ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kiesés Helyreáll."); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Nyomtatás Tárolóról"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nincs Tároló"); + PROGMEM Language_Str MSG_END_LOOPS = _UxGT("Hurok ismétlés vége"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objektum nyomtatása"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objektum törlése"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objektum törlése ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kiesés helyreáll."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Nyomtatás tárolóról"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nincs tároló"); PROGMEM Language_Str MSG_DWELL = _UxGT("Alvás..."); PROGMEM Language_Str MSG_USERWAIT = _UxGT("Katt a folytatáshoz..."); PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Nyomtatás szünetelve"); PROGMEM Language_Str MSG_PRINTING = _UxGT("Nyomtatás..."); PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Nyomtatás leállítva"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Nyomtatás Kész"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Nyomtatás kész"); PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Nincs mozgás."); PROGMEM Language_Str MSG_KILLED = _UxGT("HALOTT! "); PROGMEM Language_Str MSG_STOPPED = _UxGT("MEGÃLLT! "); @@ -381,25 +395,25 @@ namespace Language_hu { PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVisszah."); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás Távolság"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Csere"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási Távolság"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Visszahúzás V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S Vissza.h V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto Visszah."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás távolság"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra csere"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási távolság"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Szerszámcsere"); PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Emelés"); PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Fösebesség"); PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. Sebesség"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej Parkolás"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszahúzás Sebesség"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej parkolás"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszav.visszah. sebesség"); PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN Sebesség"); PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("FAN idö"); PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto BE"); PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto KI"); PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Szerszámcsere"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata Csere"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Utolsó Adagoló"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata csere"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Utolsó adagoló"); PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Csere *"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Szál csere"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Szál csere *"); @@ -407,12 +421,12 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Szál betöltés *"); PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Szál eltávolítás"); PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Szál eltávolítás *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Mindet Eltávolít"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Mindet eltávolít"); PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Tároló"); PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Tároló csere"); PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Tároló Kiadása"); PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z szonda tálcán kivül"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Ferdeség Faktor"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Ferdeség faktor"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Önteszt"); PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Visszaállítás"); @@ -428,16 +442,16 @@ namespace Language_hu { PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Teszt"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Eltolás teszt"); PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Használ"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Használ"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Elhelyezés"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s Kell"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda Eltolások"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Szonda X Eltolás"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Szonda Y Eltolás"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Szonda Z Eltolás"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI használ"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe használ"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe elhelyezés"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s kell"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda eltolások"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X Szonda eltolás"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y Szonda eltolás"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Szonda eltolás"); PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fúvóka az ágyhoz"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikrolépés X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y"); @@ -464,31 +478,31 @@ namespace Language_hu { PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Szonda hütése..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kamra fütés..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kamra hütés..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibráció"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibráció"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("X Kalibrálás"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Y Kalibrálás"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Z Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Beállítások"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibráció"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Magasság Kalib."); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Szonda Eltolás"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rúd"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ kalibrálás"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta beállítások"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibráció"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta magasság kalib."); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Eltolás"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag rúd"); PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Magasság"); PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Sugár"); PROGMEM Language_Str MSG_INFO_MENU = _UxGT("A Nyomtatóról"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Nyomtató Infó"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Pontos Szintezés"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineáris Szintezés"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineáris Szintezés"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Egységes Ãgy Szintezés"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Háló Szintezés"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Nyomtató infó"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Pontos szintezés"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineáris szintezés"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineáris szintezés"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Egységes ágy szintezés"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Háló szintezés"); PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statisztikák"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Alaplap Infó"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Alaplap infó"); PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termisztorok"); PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Adagolók"); PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Ãtviteli sebesség"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI"); PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE"); PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend üresjárati idök."); @@ -498,7 +512,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("HELYTELEN NYOMTATÓ"); #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatás Számláló"); + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatás számláló"); PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Befejezett"); PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Összes nyomtatási idö"); PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Leghosszabb munkaidö"); @@ -511,16 +525,16 @@ namespace Language_hu { PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Kiadott"); #endif - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Höfok"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Höfok"); + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min höfok"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max höfok"); PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Meghajtási Erö"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Meghajtási erö"); PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Meghajtó %"); PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Meghajtó %"); PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Meghajtó %"); PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Meghajtó %"); PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CSATLAKOZÃSI HIBA"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Ãrása"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM írása"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("NYOMTATÓSZÃL CSERE"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("NYOMTATÃS SZÃœNETEL"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("SZÃL BETÖLTÉS"); @@ -529,22 +543,22 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Tisztítsd meg"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Folytatás"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fúvóka: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Túlfutás Szenzor"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás Táv. mm"); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Túlfutás szenzor"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás táv. mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Tájolási hiba"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Szondázás hiba"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SZÃLVÃLASZTÃS"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Szoftver Feltöltése!"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Szoftver feltöltése!"); PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Figyelmeztetés."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Nyomtatás Folytatása"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Nyomtatás folytatása"); PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Folytatás..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál Betöltése"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Összes Betöltése"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fúvóka Betöltése"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál Kiadása"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál Kiadása ~"); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál betöltése"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Összes betöltése"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fúvóka betöltése"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál kiadása"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál kiadása ~"); PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Kiadja a szálat"); PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Szál betölt. %i..."); PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Szál kiadás...."); @@ -559,11 +573,11 @@ namespace Language_hu { PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Összetevö ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Keverö"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Színátm."); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Teljes Színátm."); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Váltás Keverésre"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciklikus Keverés"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Színátm. Keverés"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Fordított Színátm."); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Teljes színátm."); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Váltás keverésre"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciklikus keverés"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Színátm. keverés"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Fordított színátm."); PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktív V-szerszám"); PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Kezdés V-szerszám"); PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Vége V-szerszám"); @@ -591,7 +605,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Jelszó törlése"); PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("A jelszó "); PROGMEM Language_Str MSG_START_OVER = _UxGT("Újrakezdés"); - PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Mentse el!"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Mentsd el!"); PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Jelszó törölve"); // @@ -613,7 +627,7 @@ namespace Language_hu { #else PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Katt a folytatáshoz")); PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek Várj...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek várj...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Behelyez majd katt")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fűtéshez")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fűtés...")); @@ -625,10 +639,10 @@ namespace Language_hu { #endif PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Meghajtók"); PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Meghajtó áram"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrid Küszöbérték"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Motoros Kezdöpont"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Léptetö Mód"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Mód"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrid küszöbérték"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Motoros kezdöpont"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Léptetö mód"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop mód"); PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Újraindítás"); PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" be:"); PROGMEM Language_Str MSG_BACKLASH = _UxGT("Holtjáték"); @@ -649,6 +663,17 @@ namespace Language_hu { PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafűtés..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Szonda varázsló"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Z Referencia mérés"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Menjen a próba pontra"); + + PROGMEM Language_Str MSG_SOUND = _UxGT("Hang"); + + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Bal felsö"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Bal alsó"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Jobb felsö"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Jobb alsó"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrálás befejezve"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Kalibrálási hiba"); } #if FAN_COUNT == 1 From 6c6beeee70393a0e82125b80cc89ba578dc5fe2c Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 6 Mar 2021 01:50:26 -0800 Subject: [PATCH 1118/1370] Pins/tests followup (#21268) Missing commit from #21254 Co-authored-by: Scott Lahteine --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 4 ++++ Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h | 3 +++ Marlin/src/pins/ramps/pins_RAMPS.h | 3 +++ Marlin/src/pins/ramps/pins_RAMPS_S_12.h | 3 +++ .../scripts/common-dependencies-post.py | 16 ++++++++++++++++ platformio.ini | 7 +------ 6 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 buildroot/share/PlatformIO/scripts/common-dependencies-post.py diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index c555ef7863..94165d3948 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -27,6 +27,10 @@ #define BOARD_INFO_NAME "BTT SKR V1.4" #endif +#ifndef BOARD_CUSTOM_BUILD_FLAGS + #define BOARD_CUSTOM_BUILD_FLAGS -DLPC_PINCFG_UART3_P4_28 +#endif + // // SD Connection // diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h index 2fd599e619..5ff3b366be 100644 --- a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h @@ -43,6 +43,9 @@ #warning "Serial 3 is originally reserved to Y limit switches. Hardware changes are required to use it." #endif +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + #define BOARD_INFO_NAME "LGT KIT V1.0" // diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index f56a9ec38e..805c92d71a 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -47,6 +47,9 @@ #include "env_validate.h" +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS 1.4" #endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h index 62b6e3ff94..e1ba91cde8 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h @@ -36,6 +36,9 @@ #include "env_validate.h" +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS S 1.2" #endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py new file mode 100644 index 0000000000..2b1b948119 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py @@ -0,0 +1,16 @@ +# +# common-dependencies-post.py +# Convenience script to add build flags for Marlin Enabled Features +# + +Import("env") +Import("projenv") + +def apply_board_build_flags(): + if not 'BOARD_CUSTOM_BUILD_FLAGS' in env['MARLIN_FEATURES']: + return + projenv.Append(CCFLAGS=env['MARLIN_FEATURES']['BOARD_CUSTOM_BUILD_FLAGS'].split()) + +# We need to add the board build flags in a post script +# so the platform build script doesn't overwrite the custom CCFLAGS +apply_board_build_flags() diff --git a/platformio.ini b/platformio.ini index 0ed883ba0d..aad59362cc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -215,6 +215,7 @@ extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py pre:buildroot/share/PlatformIO/scripts/preflight-checks.py + post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = @@ -727,12 +728,6 @@ platform = ${common_LPC.platform} extends = common_LPC board = nxp_lpc1769 -# BTT SKR 1.4 needs a UART3 tweak -[env:LPC1768_btt_skr_v1_4] -platform = ${env:LPC1768.platform} -extends = env:LPC1768 -build_flags = ${env:LPC1768.build_flags} -DLPC_PINCFG_UART3_P4_28 - ################################# # # # STM32 Architecture # From 423c4e4636b271dc3ea1ec66dfcb2fc8025bc451 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 6 Mar 2021 06:57:51 -0600 Subject: [PATCH 1119/1370] Pins/tests followup --- Marlin/src/pins/pins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 55240021fa..b8cf695fb5 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -378,7 +378,7 @@ #elif MB(BTT_SKR_V1_3) #include "lpc1768/pins_BTT_SKR_V1_3.h" // LPC1768 env:LPC1768 #elif MB(BTT_SKR_V1_4) - #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768_btt_skr_v1_4 + #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768 // // LPC1769 ARM Cortex M3 From 05a124930ea97bf7e0f5d52d2b1707882ac76fab Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 7 Mar 2021 02:19:15 +1300 Subject: [PATCH 1120/1370] Fix Creality DWIN - Broken (bool)Serial ? (#21272) Co-authored-by: ellensp --- Marlin/src/lcd/dwin/dwin_lcd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 1978c6a4f8..59bc46925a 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -95,7 +95,7 @@ bool DWIN_Handshake(void) { #endif LCD_SERIAL.begin(LCD_BAUDRATE); const millis_t serial_connect_timeout = millis() + 1000UL; - while (!LCD_SERIAL && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + while (!LCD_SERIAL.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } size_t i = 0; DWIN_Byte(i, 0x00); From 5b586ea4d8dbd7f44589ec580fd55a1ef6edffe8 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Sat, 6 Mar 2021 23:04:05 +0800 Subject: [PATCH 1121/1370] MKS H43 fixup (#21267) Co-authored-by: makerbase <4164049@qq.com> Co-authored-by: MKS-Sean <56996910+MKS-Sean@users.noreply.github.com> Co-authored-by: Scott Lahteine --- Marlin/src/gcode/queue.cpp | 8 +++ Marlin/src/gcode/queue.h | 9 ++- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 9 ++- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 2 +- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 6 +- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 48 +++++++------- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 22 +++---- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 18 ++--- .../extui/lib/mks_ui/draw_filament_change.cpp | 34 +++++----- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 65 +++++++++---------- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 8 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 6 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 14 ++-- 17 files changed, 139 insertions(+), 122 deletions(-) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 93deac0566..136293fd34 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -610,6 +610,14 @@ void GCodeQueue::get_available_commands() { TERN_(SDSUPPORT, get_sdcard_commands()); } +/** + * Run the entire queue in-place. Blocks SD completion/abort until complete. + */ +void GCodeQueue::exhaust() { + while (ring_buffer.occupied()) advance(); + planner.synchronize(); +} + /** * Get the next command in the queue, optionally log it to SD, then dispatch it */ diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 7bc3bfdbe5..4757b8c37e 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -93,7 +93,9 @@ public: inline bool full(uint8_t cmdCount=1) const { return length > (BUFSIZE - cmdCount); } - inline bool empty() const { return length == 0; } + inline bool occupied() const { return length != 0; } + + inline bool empty() const { return !occupied(); } inline CommandLine& peek_next_command() { return commands[index_r]; } @@ -162,6 +164,11 @@ public: */ static void advance(); + /** + * Run the entire queue in-place + */ + static void exhaust(); + /** * Add to the circular command queue the next command from: * - The command-injection queue (injected_commands_P) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 9b0c329de2..180c895809 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -395,20 +395,23 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va default: return; #if HOTENDS >= 1 case VP_T_E0_Set: + NOMORE(newvalue, HEATER_0_MAXTEMP); thermalManager.setTargetHotend(newvalue, 0); - acceptedvalue = thermalManager.temp_hotend[0].target; + acceptedvalue = thermalManager.degTargetHotend(0); break; #endif #if HOTENDS >= 2 case VP_T_E1_Set: + NOMORE(newvalue, HEATER_1_MAXTEMP); thermalManager.setTargetHotend(newvalue, 1); - acceptedvalue = thermalManager.temp_hotend[1].target; + acceptedvalue = thermalManager.degTargetHotend(1); break; #endif #if HAS_HEATED_BED case VP_T_Bed_Set: + NOMORE(newvalue, BED_MAXTEMP); thermalManager.setTargetBed(newvalue); - acceptedvalue = thermalManager.temp_bed.target; + acceptedvalue = thermalManager.degTargetBed(); break; #endif } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 14b7394aaa..bfa518446d 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -75,7 +75,7 @@ uint16_t z_park_pos = 10; xyz_pos_t position_before_pause; void MKS_pause_print_move() { - planner.synchronize(); + queue.exhaust(); position_before_pause = current_position; do_blocking_move_to(X_MIN_POS + x_park_pos, Y_MIN_POS + y_park_pos, current_position.z + z_park_pos); } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h index 47695edf0f..c8915a3d25 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -23,10 +23,10 @@ #include "../DGUSDisplayDef.h" -//#define USE_MKS_GREEN_UI +#define USE_MKS_GREEN_UI //#define DGUS_MKS_RUNOUT_SENSOR -#define LOGO_TIME_DELAY TERN(USE_MKS_GREEN_UI, 5000, 1500) +#define LOGO_TIME_DELAY TERN(USE_MKS_GREEN_UI, 8000, 1500) #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) #define MT_DET_1_PIN 1 @@ -178,7 +178,7 @@ enum DGUSLCD_Screens : uint8_t { MKSLCD_SCREEN_PRINT_CONFIG = 72, MKSLCD_SCREEN_LEVEL_DATA = 106, MKSLCD_PrintPause_SET = 107, - //MKSLCD_FILAMENT_DATA = 50, + MKSLCD_FILAMENT_DATA = 50, MKSLCD_ABOUT = 83, MKSLCD_PID = 108, MKSLCD_PAUSE_SETTING_MOVE = 98, diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 9fc56acf10..577171a135 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -39,6 +39,7 @@ #include "../../../../../gcode/gcode.h" #include "../../../../../pins/pins.h" #include "../../../../../libs/nozzle.h" + #if ENABLED(HAS_STEALTHCHOP) #include "../../../../../module/stepper/trinamic.h" #include "../../../../../module/stepper/indirection.h" @@ -60,7 +61,6 @@ uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } #if 0 - void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4) { dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); @@ -264,7 +264,7 @@ void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { void DGUSScreenHandler::SDPrintingFinished() { if (DGUSAutoTurnOff) { - while (!queue.ring_buffer.empty()) queue.advance(); + queue.exhaust(); gcode.process_subcommands_now_P(PSTR("M81")); } GotoScreen(MKSLCD_SCREEN_PrintDone); @@ -465,7 +465,6 @@ void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { cs = getCurrentScreen(); if (cs != MKSLCD_AUTO_LEVEL) GotoScreen(MKSLCD_AUTO_LEVEL); - #else GotoScreen(MKSLCD_SCREEN_LEVEL); @@ -499,14 +498,15 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { char cmd_buf[30]; float offset = mesh_adj_distance; int16_t integer, Deci, Deci2; - // float f3 = current_position.z; - // float f4 = current_position.z; + + if (!queue.ring_buffer.empty()) return; + switch (mesh_value) { case 0: offset = mesh_adj_distance; integer = offset; // get int - Deci = (offset * 100); - Deci = Deci % 100; + Deci = (offset * 10); + Deci = Deci % 10; Deci2 = offset * 100; Deci2 = Deci2 % 10; soft_endstop._enabled = false; @@ -520,8 +520,8 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { case 1: offset = mesh_adj_distance; integer = offset; // get int - Deci = (offset * 100); - Deci = Deci % 100; + Deci = (offset * 10); + Deci = Deci % 10; Deci2 = offset * 100; Deci2 = Deci2 % 10; soft_endstop._enabled = false; @@ -589,8 +589,8 @@ void DGUSScreenHandler::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { uint16_t lcd_value = swap16(*(uint16_t *)val_ptr); - if(lcd_value > 100) lcd_value = 100; - else if(lcd_value < 10) lcd_value = 10; + if (lcd_value > 100) lcd_value = 100; + else if (lcd_value < 10) lcd_value = 10; lcd_default_light = lcd_value; @@ -794,7 +794,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPAIR("QUEUE LEN:", queue.length); - if (!print_job_timer.isPaused() && queue.ring_buffer.full(1)) + if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) return; char axiscode; @@ -1249,8 +1249,8 @@ void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { switch (val_t) { case 0: #if HOTENDS >= 1 - if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1268,8 +1268,8 @@ void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { case 1: #if HOTENDS >= 2 - if (thermalManager.temp_hotend[1].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[1].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(1) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(1) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1284,8 +1284,8 @@ void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { } #endif #if ENABLED(SINGLENOZZLE) - if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1313,8 +1313,8 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) switch (val_t) { case 0: #if HOTENDS >= 1 - if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1331,8 +1331,8 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) break; case 1: #if HOTENDS >= 2 - if (thermalManager.temp_hotend[1].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[1].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(1) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(1) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1348,8 +1348,8 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) #endif #if ENABLED(SINGLENOZZLE) - if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 6130e92224..5d02f79fd1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -191,7 +191,7 @@ static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { TERN_(ADVANCED_PAUSE_FEATURE, pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT); } else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT, TYPE_FILAMENT_HEAT_LOAD_COMPLETED, TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak; + thermalManager.setTargetHotend(uiCfg.hotendTargetTempBak, uiCfg.extruderIndex); clear_cur_ui(); draw_return_ui(); } @@ -204,7 +204,7 @@ static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { uiCfg.filament_loading_time_cnt = 0; uiCfg.filament_unloading_time_flg = false; uiCfg.filament_unloading_time_cnt = 0; - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + thermalManager.setTargetHotend(uiCfg.hotendTargetTempBak, uiCfg.extruderIndex); clear_cur_ui(); draw_return_ui(); } @@ -479,9 +479,9 @@ void lv_draw_dialog(uint8_t type) { void filament_sprayer_temp() { char buf[20] = {0}; - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); - strcpy(public_buf_l, uiCfg.curSprayerChoose < 1 ? extrude_menu.ext1 : extrude_menu.ext2); + strcpy(public_buf_l, uiCfg.extruderIndex < 1 ? extrude_menu.ext1 : extrude_menu.ext2); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); lv_label_set_text(tempText1, public_buf_l); @@ -500,7 +500,7 @@ void filament_dialog_handle() { planner.synchronize(); uiCfg.filament_loading_time_flg = true; uiCfg.filament_loading_time_cnt = 0; - sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E%d F%d\nG90"), uiCfg.curSprayerChoose, gCfgItems.filamentchange_load_length, gCfgItems.filamentchange_load_speed); + sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E%d F%d\nG90"), uiCfg.extruderIndex, gCfgItems.filamentchange_load_length, gCfgItems.filamentchange_load_speed); queue.inject(public_buf_m); } if (uiCfg.filament_heat_completed_unload) { @@ -510,13 +510,13 @@ void filament_dialog_handle() { planner.synchronize(); uiCfg.filament_unloading_time_flg = true; uiCfg.filament_unloading_time_cnt = 0; - sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E-%d F%d\nG90"), uiCfg.curSprayerChoose, gCfgItems.filamentchange_unload_length, gCfgItems.filamentchange_unload_speed); + sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E-%d F%d\nG90"), uiCfg.extruderIndex, gCfgItems.filamentchange_unload_length, gCfgItems.filamentchange_unload_speed); queue.inject(public_buf_m); } - if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) - && (uiCfg.filament_load_heat_flg) + if ( ((abs((int)((int)thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temper)) <= 1) + || ((int)thermalManager.degHotend(uiCfg.extruderIndex) > gCfgItems.filament_limit_temper)) + && uiCfg.filament_load_heat_flg ) { uiCfg.filament_load_heat_flg = false; lv_clear_dialog(); @@ -529,8 +529,8 @@ void filament_dialog_handle() { lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED); } - if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) + if (((abs((int)((int)thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temper)) <= 1) + || ((int)thermalManager.degHotend(uiCfg.extruderIndex) > gCfgItems.filament_limit_temper)) && uiCfg.filament_unload_heat_flg ) { uiCfg.filament_unload_heat_flg = false; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index b9af6d33a8..43ed214199 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_E_ADD: - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { + if (thermalManager.degHotend(uiCfg.extruderIndex) >= EXTRUDE_MINTEMP) { sprintf_P((char *)public_buf_l, PSTR("G91\nG1 E%d F%d\nG90"), uiCfg.extruStep, 60 * uiCfg.extruSpeed); queue.inject(public_buf_l); extrudeAmount += uiCfg.extruStep; @@ -62,7 +62,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } break; case ID_E_DEC: - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { + if (thermalManager.degHotend(uiCfg.extruderIndex) >= EXTRUDE_MINTEMP) { sprintf_P((char *)public_buf_l, PSTR("G91\nG1 E%d F%d\nG90"), 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); queue.enqueue_one_now(public_buf_l); extrudeAmount -= uiCfg.extruStep; @@ -71,17 +71,17 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_E_TYPE: if (ENABLED(HAS_MULTI_EXTRUDER)) { - if (uiCfg.curSprayerChoose == 0) { - uiCfg.curSprayerChoose = 1; + if (uiCfg.extruderIndex == 0) { + uiCfg.extruderIndex = 1; queue.inject_P(PSTR("T1")); } else { - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; queue.inject_P(PSTR("T0")); } } else - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; extrudeAmount = 0; disp_hotend_temp(); @@ -153,7 +153,7 @@ void lv_draw_extrusion() { } void disp_ext_type() { - if (uiCfg.curSprayerChoose == 1) { + if (uiCfg.extruderIndex == 1) { lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, extrude_menu.ext2); @@ -195,7 +195,7 @@ void disp_ext_speed() { void disp_hotend_temp() { char buf[20] = {0}; - sprintf(buf, extrude_menu.temp_value, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + sprintf(buf, extrude_menu.temp_value, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, extrude_menu.temper_text); strcat(public_buf_l, buf); lv_label_set_text(tempText, public_buf_l); @@ -213,7 +213,7 @@ void disp_extru_amount() { sprintf(buf1, extrude_menu.count_value_cm, extrudeAmount / 10); else sprintf(buf1, extrude_menu.count_value_m, extrudeAmount / 1000); - strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? extrude_menu.ext1 : extrude_menu.ext2); + strcat(public_buf_l, uiCfg.extruderIndex == 0 ? extrude_menu.ext1 : extrude_menu.ext2); strcat(public_buf_l, buf1); lv_label_set_text(ExtruText, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index cff99119e8..e12a4b82cf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -50,25 +50,25 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_FILAMNT_IN: uiCfg.filament_load_heat_flg = true; - if ((abs(thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius) <= 1) - || (gCfgItems.filament_limit_temper <= thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) { + if ((abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1) + || (gCfgItems.filament_limit_temper <= thermalManager.degHotend(uiCfg.extruderIndex))) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } else { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temper) { + thermalManager.setTargetHotend(gCfgItems.filament_limit_temper, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } } break; case ID_FILAMNT_OUT: uiCfg.filament_unload_heat_flg = true; - if ((thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > 0) - && ((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= gCfgItems.filament_limit_temper)) + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) + && ((abs((int)((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1) + || ((int)thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temper)) ) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); @@ -76,28 +76,28 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { else { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temper) { + thermalManager.setTargetHotend(gCfgItems.filament_limit_temper, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } filament_sprayer_temp(); } break; case ID_FILAMNT_TYPE: #if HAS_MULTI_EXTRUDER - uiCfg.curSprayerChoose = !uiCfg.curSprayerChoose; + uiCfg.extruderIndex = !uiCfg.extruderIndex; #endif disp_filament_type(); break; case ID_FILAMNT_RETURN: #if HAS_MULTI_EXTRUDER if (uiCfg.print_state != IDLE && uiCfg.print_state != REPRINTED) - gcode.process_subcommands_now_P(uiCfg.curSprayerChoose_bak == 1 ? PSTR("T1") : PSTR("T0")); + gcode.process_subcommands_now_P(uiCfg.extruderIndexBak == 1 ? PSTR("T1") : PSTR("T0")); #endif feedrate_mm_s = (float)uiCfg.moveSpeed_bak; if (uiCfg.print_state == PAUSED) planner.set_e_position_mm((destination.e = current_position.e = uiCfg.current_e_position_bak)); - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + thermalManager.setTargetHotend(uiCfg.hotendTargetTempBak, uiCfg.extruderIndex); clear_cur_ui(); draw_return_ui(); @@ -132,7 +132,7 @@ void lv_draw_filament_change() { } void disp_filament_type() { - if (uiCfg.curSprayerChoose == 1) { + if (uiCfg.extruderIndex == 1) { lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext2); @@ -153,8 +153,8 @@ void disp_filament_temp() { public_buf_l[0] = '\0'; - strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index eb4b370838..cd77db8ae1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -66,7 +66,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_O_FILAMENT: #if HAS_MULTI_EXTRUDER - uiCfg.curSprayerChoose_bak = active_extruder; + uiCfg.extruderIndexBak = active_extruder; #endif if (uiCfg.print_state == WORKING) { #if ENABLED(SDSUPPORT) @@ -76,7 +76,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { #endif } uiCfg.moveSpeed_bak = (uint16_t)feedrate_mm_s; - uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[active_extruder].target; + uiCfg.hotendTargetTempBak = thermalManager.degTargetHotend(active_extruder); lv_clear_operation(); lv_draw_filament_change(); break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index f2fda3a286..73a0808e9c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -48,47 +48,46 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { - case ID_P_ADD: + case ID_P_ADD: { if (uiCfg.curTempType == 0) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target += uiCfg.stepHeat; - if (uiCfg.curSprayerChoose == 0) { - if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - } - } + int16_t max_target; + thermalManager.temp_hotend[uiCfg.extruderIndex].target += uiCfg.stepHeat; + if (uiCfg.extruderIndex == 0) + max_target = HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); #if HAS_MULTI_HOTEND - else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - } + else + max_target = HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); #endif - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) > max_target) + thermalManager.setTargetHotend(max_target, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } #if HAS_HEATED_BED else { + constexpr int16_t max_target = BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); thermalManager.temp_bed.target += uiCfg.stepHeat; - if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { - thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); - } + if (thermalManager.degTargetBed() > max_target) + thermalManager.setTargetBed(max_target); thermalManager.start_watching_bed(); } #endif disp_desire_temp(); - break; + } break; + case ID_P_DEC: if (uiCfg.curTempType == 0) { - if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > uiCfg.stepHeat) - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target -= uiCfg.stepHeat; + if ((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) > uiCfg.stepHeat) + thermalManager.temp_hotend[uiCfg.extruderIndex].target -= uiCfg.stepHeat; else - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = 0; - - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + thermalManager.setTargetHotend(0, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } #if HAS_HEATED_BED else { if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) thermalManager.temp_bed.target -= uiCfg.stepHeat; else - thermalManager.temp_bed.target = 0; + thermalManager.setTargetBed(0); thermalManager.start_watching_bed(); } @@ -98,20 +97,20 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_P_TYPE: if (uiCfg.curTempType == 0) { if (ENABLED(HAS_MULTI_EXTRUDER)) { - if (uiCfg.curSprayerChoose == 0) { - uiCfg.curSprayerChoose = 1; + if (uiCfg.extruderIndex == 0) { + uiCfg.extruderIndex = 1; } - else if (uiCfg.curSprayerChoose == 1) { + else if (uiCfg.extruderIndex == 1) { if (TEMP_SENSOR_BED != 0) { uiCfg.curTempType = 1; } else { uiCfg.curTempType = 0; - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; } } } - else if (uiCfg.curSprayerChoose == 0) { + else if (uiCfg.extruderIndex == 0) { if (TEMP_SENSOR_BED != 0) uiCfg.curTempType = 1; else @@ -119,7 +118,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } else if (uiCfg.curTempType == 1) { - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; uiCfg.curTempType = 0; } disp_temp_type(); @@ -135,8 +134,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_P_OFF: if (uiCfg.curTempType == 0) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = 0; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + thermalManager.setTargetHotend(0, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } #if HAS_HEATED_BED else { @@ -186,7 +185,7 @@ void lv_draw_preHeat() { void disp_temp_type() { if (uiCfg.curTempType == 0) { - if (uiCfg.curSprayerChoose == 1) { + if (uiCfg.extruderIndex == 1) { lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext2); @@ -217,13 +216,13 @@ void disp_desire_temp() { public_buf_l[0] = '\0'; if (uiCfg.curTempType == 0) { - strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); } #if HAS_HEATED_BED else { strcat(public_buf_l, preheat_menu.hotbed); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); } #endif strcat_P(public_buf_l, PSTR(": ")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 782ce21992..2cc6d19cc5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -203,11 +203,11 @@ void lv_draw_printing() { } void disp_ext_temp() { - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target); + sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target); + sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2, public_buf_l); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 047a6cdb70..7554f746ca 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -98,10 +98,10 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.temp_hotend[0].celsius); + sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.degHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND - sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.temp_hotend[1].celsius); + sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.degHotend(1)); lv_label_set_text(e2, buf); #endif #if HAS_HEATED_BED @@ -133,12 +133,12 @@ void lv_draw_ready_print() { #if 1 e1 = lv_label_create_empty(scr); lv_obj_set_pos(e1, 20, 20); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[0].celsius); + sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND e2 = lv_label_create_empty(scr); lv_obj_set_pos(e2, 20, 45); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[1].celsius); + sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(1)); lv_label_set_text(e2, buf); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index aa6d3869a6..8e9e5d59fa 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -68,7 +68,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { #endif break; case ID_T_FILAMENT: - uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; + uiCfg.hotendTargetTempBak = thermalManager.degTargetHotend(uiCfg.extruderIndex); lv_draw_filament_change(); break; case ID_T_MORE: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 9d13ca3120..9b7fea0a45 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -179,7 +179,7 @@ void gCfgItems_init() { void ui_cfg_init() { uiCfg.curTempType = 0; - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; uiCfg.stepHeat = 10; uiCfg.leveling_first_time = false; uiCfg.para_ui_page = false; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 34c6b1f254..4b0ce2b4d8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -211,9 +211,9 @@ typedef struct { typedef struct { uint8_t curTempType:1, - curSprayerChoose:3, + extruderIndex:3, stepHeat:4, - curSprayerChoose_bak:4; + extruderIndexBak:4; bool leveling_first_time:1, para_ui_page:1, configWifi:1, @@ -246,7 +246,7 @@ typedef struct { filament_loading_time_cnt, filament_unloading_time_cnt; float move_dist; - float desireSprayerTempBak; + float hotendTargetTempBak; float current_x_position_bak, current_y_position_bak, current_z_position_bak, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 02ca16e007..ddf7173297 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -885,9 +885,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { char *outBuf = (char *)tempBuf; char str_1[16], tbuf[34]; - dtostrf(thermalManager.temp_hotend[0].celsius, 1, 1, tbuf); + dtostrf(thermalManager.degHotend(0), 1, 1, tbuf); strcat_P(tbuf, PSTR(" /")); - strcat(tbuf, dtostrf(thermalManager.temp_hotend[0].target, 1, 1, str_1)); + strcat(tbuf, dtostrf(thermalManager.degTargetHotend(0), 1, 1, str_1)); const int tlen = strlen(tbuf); @@ -912,9 +912,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcat_P(outBuf, PSTR(" T1:")); outBuf += 4; #if HAS_MULTI_HOTEND - strcat(outBuf, dtostrf(thermalManager.temp_hotend[1].celsius, 1, 1, str_1)); + strcat(outBuf, dtostrf(thermalManager.degHotend(1), 1, 1, str_1)); strcat_P(outBuf, PSTR(" /")); - strcat(outBuf, dtostrf(thermalManager.temp_hotend[1].target, 1, 1, str_1)); + strcat(outBuf, dtostrf(thermalManager.degTargetHotend(1), 1, 1, str_1)); #else strcat_P(outBuf, PSTR("0 /0")); #endif @@ -924,15 +924,15 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } else { sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), - (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, + (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0), #if HAS_HEATED_BED (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target, #else 0, 0, #endif - (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, + (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0), #if HAS_MULTI_HOTEND - (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target + (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1) #else 0, 0 #endif From 95136abc47919a272541f3e5402093ee09223ba9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 6 Mar 2021 10:16:18 -0600 Subject: [PATCH 1122/1370] Fix DGUS include paths Followup to #20609 --- Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp index c43243b39d..5497dd53cc 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp @@ -37,7 +37,7 @@ #include "../../../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" + #include "../../../../../feature/powerloss.h" #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp index 90cfae7f09..c170c288aa 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp @@ -37,7 +37,7 @@ #include "../../../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" + #include "../../../../../feature/powerloss.h" #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp index f1d91371c2..ff924f4061 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp @@ -37,7 +37,7 @@ #include "../../../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" + #include "../../../../../feature/powerloss.h" #endif #if ENABLED(SDSUPPORT) From db4d9b7fcfadcb5d9a797e8421530e1c33e75e57 Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Sat, 6 Mar 2021 14:13:28 -0600 Subject: [PATCH 1123/1370] Cooler (for Laser) - M143, M193 (#21255) --- Marlin/Configuration.h | 4 + Marlin/Configuration_adv.h | 44 +++ Marlin/src/HAL/AVR/fastio.h | 2 +- Marlin/src/HAL/ESP32/HAL.cpp | 1 + Marlin/src/HAL/SAMD51/HAL.cpp | 14 + Marlin/src/HAL/STM32F1/HAL.cpp | 9 + Marlin/src/HAL/STM32F1/msc_sd.cpp | 35 +- Marlin/src/core/language.h | 2 + Marlin/src/feature/cooler.cpp | 37 ++ Marlin/src/feature/cooler.h | 50 +++ Marlin/src/feature/power.cpp | 7 + Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 11 - Marlin/src/gcode/gcode.cpp | 5 + Marlin/src/gcode/gcode.h | 7 + Marlin/src/gcode/host/M115.cpp | 3 + Marlin/src/gcode/temp/M140_M190.cpp | 11 - Marlin/src/gcode/temp/M141_M191.cpp | 12 - Marlin/src/gcode/temp/M143_M193.cpp | 67 ++++ Marlin/src/inc/Conditionals_adv.h | 4 + Marlin/src/inc/Conditionals_post.h | 60 ++- Marlin/src/inc/SanityCheck.h | 4 + Marlin/src/lcd/dogm/dogm_Statusscreen.h | 58 +++ Marlin/src/lcd/dogm/status/cooler.h | 70 ++++ Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 35 +- Marlin/src/lcd/extui/ui_api.cpp | 26 +- Marlin/src/lcd/extui/ui_api.h | 2 +- Marlin/src/lcd/language/language_en.h | 6 + Marlin/src/lcd/menu/menu_info.cpp | 10 + Marlin/src/lcd/menu/menu_temperature.cpp | 23 +- Marlin/src/lcd/tft/tft_color.h | 3 + Marlin/src/lcd/tft/touch.cpp | 6 + Marlin/src/lcd/tft/ui_320x240.cpp | 13 + Marlin/src/lcd/tft/ui_480x320.cpp | 6 + Marlin/src/lcd/tft/ui_common.h | 4 + Marlin/src/module/temperature.cpp | 380 +++++++++++++++++-- Marlin/src/module/temperature.h | 75 +++- Marlin/src/module/thermistor/thermistors.h | 21 +- Marlin/src/pins/pinsDebug_list.h | 6 + Marlin/src/pins/sensitive_pins.h | 20 +- buildroot/tests/BIGTREE_SKR_PRO | 11 +- platformio.ini | 2 + 41 files changed, 1041 insertions(+), 125 deletions(-) create mode 100644 Marlin/src/feature/cooler.cpp create mode 100644 Marlin/src/feature/cooler.h create mode 100644 Marlin/src/gcode/temp/M143_M193.cpp create mode 100644 Marlin/src/lcd/dogm/status/cooler.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 90ab4d58af..7b0023a564 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -329,8 +329,10 @@ #define AUTO_POWER_E_FANS #define AUTO_POWER_CONTROLLERFAN #define AUTO_POWER_CHAMBER_FAN + #define AUTO_POWER_COOLER_FAN //#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU if any extruder is over this temperature //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU if the chamber is over this temperature + //#define AUTO_POWER_COOLER_TEMP 26 // (°C) Turn on PSU if the cooler is over this temperature #define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration //#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time. #endif @@ -418,6 +420,7 @@ #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_PROBE 0 #define TEMP_SENSOR_CHAMBER 0 +#define TEMP_SENSOR_COOLER 0 // Dummy thermistor constant temperature readings, for use with 998 and 999 #define DUMMY_THERMISTOR_998_VALUE 25 @@ -636,6 +639,7 @@ #define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders #define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed #define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber +#define THERMAL_PROTECTION_COOLER // Enable thermal protection for the laser cooling //=========================================================================== //============================= Mechanical Settings ========================= diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8bbc50bee4..3168e9a001 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -113,6 +113,12 @@ #define CHAMBER_BETA 3950 // Beta value #endif +#if TEMP_SENSOR_COOLER == 1000 + #define COOLER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define COOLER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define COOLER_BETA 3950 // Beta value +#endif + #if TEMP_SENSOR_PROBE == 1000 #define PROBE_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor #define PROBE_RESISTANCE_25C_OHMS 100000 // Resistance at 25C @@ -179,6 +185,25 @@ #endif #endif +// +// Laser Cooler options +// +#if TEMP_SENSOR_COOLER + #define COOLER_MINTEMP 8 // (°C) + #define COOLER_MAXTEMP 26 // (°C) + #define COOLER_DEFAULT_TEMP 16 // (°C) + #define TEMP_COOLER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target + #define COOLER_PIN 8 // Laser cooler on/off pin used to control power to the cooling element e.g. TEC, External chiller via relay + #define COOLER_INVERTING false + #define TEMP_COOLER_PIN 15 // Laser/Cooler temperature sensor pin. ADC is required. + #define COOLER_FAN // Enable a fan on the cooler, Fan# 0,1,2,3 etc. + #define COOLER_FAN_INDEX 0 // FAN number 0, 1, 2 etc. e.g. + #if ENABLED(COOLER_FAN) + #define COOLER_FAN_BASE 100 // Base Cooler fan PWM (0-255); turns on when Cooler temperature is above the target + #define COOLER_FAN_FACTOR 25 // PWM increase per °C above target + #endif +#endif + /** * Thermal Protection provides additional protection to your printer from damage * and fire. Marlin always includes safe min and max temperature ranges which @@ -248,6 +273,20 @@ #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius #endif +/** + * Thermal Protection parameters for the laser cooler. + */ +#if ENABLED(THERMAL_PROTECTION_COOLER) + #define THERMAL_PROTECTION_COOLER_PERIOD 10 // Seconds + #define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // Degrees Celsius + + /** + * Laser cooling watch settings (M143/M193). + */ + #define WATCH_COOLER_TEMP_PERIOD 60 // Seconds + #define WATCH_COOLER_TEMP_INCREASE 3 // Degrees Celsius +#endif + #if ENABLED(PIDTEMP) // Add an experimental additional term to the heater power, proportional to the extrusion speed. // A well-chosen Kc value should add just enough power to melt the increased material volume. @@ -493,11 +532,15 @@ #define E6_AUTO_FAN_PIN -1 #define E7_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 +#define COOLER_AUTO_FAN_PIN -1 +#define COOLER_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed #define CHAMBER_AUTO_FAN_TEMPERATURE 30 #define CHAMBER_AUTO_FAN_SPEED 255 +#define COOLER_AUTO_FAN_TEMPERATURE 18 +#define COOLER_AUTO_FAN_SPEED 255 /** * Part-Cooling Fan Multiplexer @@ -1495,6 +1538,7 @@ #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating //#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active + //#define STATUS_COOLER_ANIM // Use a second bitmap to indicate laser cooling //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames diff --git a/Marlin/src/HAL/AVR/fastio.h b/Marlin/src/HAL/AVR/fastio.h index dd01634661..cf704179c8 100644 --- a/Marlin/src/HAL/AVR/fastio.h +++ b/Marlin/src/HAL/AVR/fastio.h @@ -285,7 +285,7 @@ enum ClockSource2 : char { */ // Determine which harware PWMs are already in use -#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN) +#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN) #if PIN_EXISTS(CONTROLLER_FAN) #define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN) #else diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index fb5f531b22..ab28595071 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -185,6 +185,7 @@ void HAL_adc_init() { TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db)); TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db)); TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db)); // Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail. diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 17e89c723f..4a6100b96b 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -57,6 +57,7 @@ #define GET_PROBE_ADC() TERN(HAS_TEMP_PROBE, PIN_TO_ADC(TEMP_PROBE_PIN), -1) #define GET_BED_ADC() TERN(HAS_TEMP_ADC_BED, PIN_TO_ADC(TEMP_BED_PIN), -1) #define GET_CHAMBER_ADC() TERN(HAS_TEMP_ADC_CHAMBER, PIN_TO_ADC(TEMP_CHAMBER_PIN), -1) +#define GET_COOLER_ADC() TERN(HAS_TEMP_ADC_COOLER, PIN_TO_ADC(TEMP_COOLER_PIN), -1) #define GET_FILAMENT_WIDTH_ADC() TERN(FILAMENT_WIDTH_SENSOR, PIN_TO_ADC(FILWIDTH_PIN), -1) #define GET_BUTTONS_ADC() TERN(HAS_ADC_BUTTONS, PIN_TO_ADC(ADC_KEYPAD_PIN), -1) @@ -66,6 +67,7 @@ || GET_PROBE_ADC() == n \ || GET_BED_ADC() == n \ || GET_CHAMBER_ADC() == n \ + || GET_COOLER_ADC() == n \ || GET_FILAMENT_WIDTH_ADC() == n \ || GET_BUTTONS_ADC() == n \ ) @@ -144,6 +146,9 @@ uint16_t HAL_adc_result; #if GET_CHAMBER_ADC() == 0 TEMP_CHAMBER_PIN, #endif + #if GET_COOLER_ADC() == 0 + TEMP_COOLER_PIN, + #endif #if GET_FILAMENT_WIDTH_ADC() == 0 FILWIDTH_PIN, #endif @@ -184,6 +189,9 @@ uint16_t HAL_adc_result; #if GET_CHAMBER_ADC() == 1 TEMP_CHAMBER_PIN, #endif + #if GET_COOLER_ADC() == 1 + TEMP_COOLER_PIN, + #endif #if GET_FILAMENT_WIDTH_ADC() == 1 FILWIDTH_PIN, #endif @@ -232,6 +240,9 @@ uint16_t HAL_adc_result; #if GET_CHAMBER_ADC() == 0 { PIN_TO_INPUTCTRL(TEMP_CHAMBER_PIN) }, #endif + #if GET_COOLER_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_COOLER_PIN) }, + #endif #if GET_FILAMENT_WIDTH_ADC() == 0 { PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, #endif @@ -281,6 +292,9 @@ uint16_t HAL_adc_result; #if GET_CHAMBER_ADC() == 1 { PIN_TO_INPUTCTRL(TEMP_CHAMBER_PIN) }, #endif + #if GET_COOLER_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_COOLER_PIN) }, + #endif #if GET_FILAMENT_WIDTH_ADC() == 1 { PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 020c623b77..182d9401c1 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -132,6 +132,9 @@ const uint8_t adc_pins[] = { #if HAS_TEMP_CHAMBER TEMP_CHAMBER_PIN, #endif + #if HAS_TEMP_COOLER + TEMP_COOLER_PIN, + #endif #if HAS_TEMP_ADC_1 TEMP_1_PIN, #endif @@ -189,6 +192,9 @@ enum TempPinIndex : char { #if HAS_TEMP_CHAMBER TEMP_CHAMBER, #endif + #if HAS_TEMP_COOLER + TEMP_COOLER_PIN, + #endif #if HAS_TEMP_ADC_1 TEMP_1, #endif @@ -385,6 +391,9 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { #if HAS_TEMP_CHAMBER case TEMP_CHAMBER_PIN: pin_index = TEMP_CHAMBER; break; #endif + #if HAS_TEMP_COOLER + case TEMP_COOLER_PIN: pin_index = TEMP_COOLER; break; + #endif #if HAS_TEMP_ADC_1 case TEMP_1_PIN: pin_index = TEMP_1; break; #endif diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index a916184999..1e2fe88174 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -43,26 +43,27 @@ Serial0Type MarlinCompositeSerial(true); #if ENABLED(EMERGENCY_PARSER) -// The original callback is not called (no way to retrieve address). -// That callback detects a special STM32 reset sequence: this functionality is not essential -// as M997 achieves the same. -void my_rx_callback(unsigned int, void*) { - // max length of 16 is enough to contain all emergency commands - uint8 buf[16]; + // The original callback is not called (no way to retrieve address). + // That callback detects a special STM32 reset sequence: this functionality is not essential + // as M997 achieves the same. + void my_rx_callback(unsigned int, void*) { + // max length of 16 is enough to contain all emergency commands + uint8 buf[16]; - //rx is usbSerialPart.endpoints[2] - uint16 len = usb_get_ep_rx_count(usbSerialPart.endpoints[2].address); - uint32 total = composite_cdcacm_data_available(); + //rx is usbSerialPart.endpoints[2] + uint16 len = usb_get_ep_rx_count(usbSerialPart.endpoints[2].address); + uint32 total = composite_cdcacm_data_available(); - if (len == 0 || total == 0 || !WITHIN(total, len, COUNT(buf))) - return; + if (len == 0 || total == 0 || !WITHIN(total, len, COUNT(buf))) + return; - // cannot get character by character due to bug in composite_cdcacm_peek_ex - len = composite_cdcacm_peek(buf, total); + // cannot get character by character due to bug in composite_cdcacm_peek_ex + len = composite_cdcacm_peek(buf, total); + + for (uint32 i = 0; i < len; i++) + emergency_parser.update(MarlinCompositeSerial.emergency_state, buf[i+total-len]); + } - for (uint32 i = 0; i < len; i++) - emergency_parser.update(MarlinCompositeSerial.emergency_state, buf[i+total-len]); -} #endif void MSC_SD_init() { @@ -87,7 +88,7 @@ void MSC_SD_init() { MarlinCompositeSerial.registerComponent(); USBComposite.begin(); #if ENABLED(EMERGENCY_PARSER) - composite_cdcacm_set_hooks(USBHID_CDCACM_HOOK_RX, my_rx_callback); + composite_cdcacm_set_hooks(USBHID_CDCACM_HOOK_RX, my_rx_callback); #endif } diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index c9c3fd0153..71e8ea524c 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -247,6 +247,8 @@ #define STR_HEATER_BED "bed" #define STR_HEATER_CHAMBER "chamber" +#define STR_COOLER "cooler" +#define STR_LASER_TEMP "laser temperature" #define STR_STOPPED_HEATER ", system stopped! Heater_ID: " #define STR_REDUNDANCY "Heater switched off. Temperature difference between temp sensors is too high !" diff --git a/Marlin/src/feature/cooler.cpp b/Marlin/src/feature/cooler.cpp new file mode 100644 index 0000000000..03640df487 --- /dev/null +++ b/Marlin/src/feature/cooler.cpp @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_COOLER + +#include "cooler.h" +Cooler cooler; + +uint16_t Cooler::flowrate; // Flow meter reading in liters, 0 will result in shutdown if equiped +uint8_t Cooler::mode = 0; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling +uint16_t Cooler::capacity; // Cooling capacity in watts +uint16_t Cooler::load; // Cooling load in watts +bool Cooler::flowmeter = false; +bool Cooler::state = false; // on = true, off = false + +#endif diff --git a/Marlin/src/feature/cooler.h b/Marlin/src/feature/cooler.h new file mode 100644 index 0000000000..42a95ccb63 --- /dev/null +++ b/Marlin/src/feature/cooler.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +#define _MSG_COOLER(M) MSG_COOLER_##M +#define MSG_COOLER(M) _MSG_COOLER(M) + +// Cooling device + +class Cooler { +public: + static uint16_t flowrate; // Flow meter reading in liters, 0 will result in shutdown if equiped + static uint8_t mode; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling + static uint16_t capacity; // Cooling capacity in watts + static uint16_t load; // Cooling load in watts + static bool flowmeter; + static bool state; // on = true, off = false + + static bool is_enabled() { return state; } + static void enable() { state = true; } + static void disable() { state = false; } + static void set_mode(const uint8_t m) { mode = m; } + static void set_flowmeter(const bool sflag) { flowmeter = sflag; } + static uint16_t get_flowrate() { return flowrate; } + static void update_flowrate(uint16_t flow) { flowrate = flow; } + //static void init() { set_state(false); } +}; + +extern Cooler cooler; diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index d22247b46d..8ab49de2bd 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -61,6 +61,9 @@ bool Power::is_power_needed() { if (TERN0(AUTO_POWER_CHAMBER_FAN, thermalManager.chamberfan_speed)) return true; + if (TERN0(AUTO_POWER_COOLER_FAN, thermalManager.coolerfan_speed)) + return true; + // If any of the drivers or the bed are enabled... if (X_ENABLE_READ() == X_ENABLE_ON || Y_ENABLE_READ() == Y_ENABLE_ON || Z_ENABLE_READ() == Z_ENABLE_ON #if HAS_X2_ENABLE @@ -89,6 +92,10 @@ bool Power::is_power_needed() { if (thermalManager.degChamber() >= AUTO_POWER_CHAMBER_TEMP) return true; #endif + #if HAS_COOLER && AUTO_POWER_COOLER_TEMP + if (thermalManager.degCooler() >= AUTO_POWER_COOLER_TEMP) return true; + #endif + return false; } diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 5d0bb0dc1e..8cfe6fee7b 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -36,17 +36,7 @@ #include "../../module/temperature.h" #include "../../module/probe.h" #include "../../feature/probe_temp_comp.h" - #include "../../lcd/marlinui.h" -#include "../../MarlinCore.h" // for wait_for_heatup, idle() - -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENTS_LEDS) - #include "../../feature/leds/leds.h" -#endif /** * G76: calibrate probe and/or bed temperature offsets @@ -173,7 +163,6 @@ void GcodeSuite::G76() { remember_feedrate_scaling_off(); - /****************************************** * Calibrate bed temperature offsets ******************************************/ diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index e9a6d4aa2a..34b8d767d1 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -539,6 +539,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 191: M191(); break; // M191: Wait for chamber temperature to reach target #endif + #if HAS_COOLER + case 143: M143(); break; // M143: Set cooler temperature + case 193: M193(); break; // M193: Wait for cooler temperature to reach target + #endif + #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) case 155: M155(); break; // M155: Set temperature auto-report interval #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 123b648f90..52570ff83f 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -153,6 +153,7 @@ * M129 - EtoP Closed. (Requires BARICUDA) * M140 - Set bed target temp. S * M141 - Set heated chamber target temp. S (Requires a chamber heater) + * M143 - Set cooler target temp. S (Requires a laser cooling device) * M145 - Set heatup values for materials on the LCD. H B F for S (0=PLA, 1=ABS) * M149 - Set temperature units. (Requires TEMPERATURE_UNITS_SUPPORT) * M150 - Set Status LED Color as R U B W P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, PCA9533, or PCA9632). @@ -163,6 +164,7 @@ * M166 - Set the Gradient Mix for the mixing extruder. (Requires GRADIENT_MIX) * M190 - S Wait for bed current temp to reach target temp. ** Wait only when heating! ** * R Wait for bed current temp to reach target temp. ** Wait for heating or cooling. ** + * M193 - R Wait for cooler temp to reach target temp. ** Wait for cooling. ** * M200 - Set filament diameter, D, setting E axis units to cubic. (Use S0 to revert to linear units.) * M201 - Set max acceleration in units/s^2 for print moves: "M201 X Y Z E" * M202 - Set max acceleration in units/s^2 for travel moves: "M202 X Y Z E" ** UNUSED IN MARLIN! ** @@ -632,6 +634,11 @@ private: static void M191(); #endif + #if HAS_COOLER + static void M143(); + static void M193(); + #endif + #if PREHEAT_COUNT static void M145(); #endif diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index ac712aea07..316abc3048 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -141,6 +141,9 @@ void GcodeSuite::M115() { // CHAMBER_TEMPERATURE (M141, M191) cap_line(PSTR("CHAMBER_TEMPERATURE"), ENABLED(HAS_HEATED_CHAMBER)); + // COOLER_TEMPERATURE (M143, M193) + cap_line(PSTR("COOLER_TEMPERATURE"), ENABLED(HAS_COOLER)); + // MEATPACK Compresson cap_line(PSTR("MEATPACK"), ENABLED(MEATPACK)); diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index d684127fe1..9a1a0287d9 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -32,19 +32,8 @@ #include "../gcode.h" #include "../../module/temperature.h" -#include "../../module/motion.h" #include "../../lcd/marlinui.h" -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENT_LEDS) - #include "../../feature/leds/leds.h" -#endif - -#include "../../MarlinCore.h" // for wait_for_heatup, idle, startOrResumeJob - /** * M140: Set bed temperature * diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp index 17eb71eada..ed7637c92a 100644 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ b/Marlin/src/gcode/temp/M141_M191.cpp @@ -32,20 +32,8 @@ #include "../gcode.h" #include "../../module/temperature.h" - -#include "../../module/motion.h" #include "../../lcd/marlinui.h" -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENT_LEDS) - #include "../../feature/leds/leds.h" -#endif - -#include "../../MarlinCore.h" // for wait_for_heatup, idle, startOrResumeJob - /** * M141: Set chamber temperature */ diff --git a/Marlin/src/gcode/temp/M143_M193.cpp b/Marlin/src/gcode/temp/M143_M193.cpp new file mode 100644 index 0000000000..aef4350e60 --- /dev/null +++ b/Marlin/src/gcode/temp/M143_M193.cpp @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * gcode/temp/M143_M193.cpp + * + * Laser Cooler target temperature control + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_COOLER + +#include "../../feature/cooler.h" +extern Cooler cooler; + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../lcd/marlinui.h" + +/** + * M143: Set cooler temperature + */ +void GcodeSuite::M143() { + if (DEBUGGING(DRYRUN)) return; + if (parser.seenval('S')) { + thermalManager.setTargetCooler(parser.value_celsius()); + parser.value_celsius() ? cooler.enable() : cooler.disable(); + } +} + +/** + * M193: Sxxx Wait for laser current temp to reach target temp. Waits only when cooling. + */ +void GcodeSuite::M193() { + if (DEBUGGING(DRYRUN)) return; + + if (parser.seenval('S')) { + cooler.enable(); + thermalManager.setTargetCooler(parser.value_celsius()); + if (thermalManager.isLaserCooling()) { + ui.set_status_P(GET_TEXT(MSG_LASER_COOLING)); + thermalManager.wait_for_cooler(true); + } + } +} + +#endif // HAS_COOLER diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 43f20b6dfd..00b9b1faef 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -114,6 +114,10 @@ #undef THERMAL_PROTECTION_CHAMBER #endif +#if TEMP_SENSOR_COOLER == 0 + #undef THERMAL_PROTECTION_COOLER +#endif + #if ENABLED(MIXING_EXTRUDER) && (ENABLED(RETRACT_SYNC_MIXING) || BOTH(FILAMENT_LOAD_UNLOAD_GCODES, FILAMENT_UNLOAD_ALL_EXTRUDERS)) #define HAS_MIXER_SYNC_CHANNEL 1 #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index be04341200..e8ed0d5a91 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -399,7 +399,7 @@ * Temp Sensor defines */ -#define ANY_TEMP_SENSOR_IS(n) (TEMP_SENSOR_0 == (n) || TEMP_SENSOR_1 == (n) || TEMP_SENSOR_2 == (n) || TEMP_SENSOR_3 == (n) || TEMP_SENSOR_4 == (n) || TEMP_SENSOR_5 == (n) || TEMP_SENSOR_6 == (n) || TEMP_SENSOR_7 == (n) || TEMP_SENSOR_BED == (n) || TEMP_SENSOR_PROBE == (n) || TEMP_SENSOR_CHAMBER == (n)) +#define ANY_TEMP_SENSOR_IS(n) (TEMP_SENSOR_0 == (n) || TEMP_SENSOR_1 == (n) || TEMP_SENSOR_2 == (n) || TEMP_SENSOR_3 == (n) || TEMP_SENSOR_4 == (n) || TEMP_SENSOR_5 == (n) || TEMP_SENSOR_6 == (n) || TEMP_SENSOR_7 == (n) || TEMP_SENSOR_BED == (n) || TEMP_SENSOR_PROBE == (n) || TEMP_SENSOR_CHAMBER == (n) || TEMP_SENSOR_COOLER == (n)) #if ANY_TEMP_SENSOR_IS(1000) #define HAS_USER_THERMISTORS 1 @@ -744,6 +744,27 @@ #undef CHAMBER_MAXTEMP #endif +#if TEMP_SENSOR_COOLER == -4 + #define COOLER_USES_AD8495 1 +#elif TEMP_SENSOR_COOLER == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_COOLER." +#elif TEMP_SENSOR_COOLER == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_COOLER." +#elif TEMP_SENSOR_COOLER == -1 + #define COOLER_USES_AD595 1 +#elif TEMP_SENSOR_COOLER > 0 + #define TEMP_SENSOR_COOLER_THERMISTOR_ID TEMP_SENSOR_COOLER + #define TEMP_SENSOR_COOLER_IS_THERMISTOR 1 + #if TEMP_SENSOR_COOLER == 1000 + #define COOLER_USER_THERMISTOR 1 + #elif TEMP_SENSOR_COOLER == 998 || TEMP_SENSOR_COOLER == 999 + #define COOLER_DUMMY_THERMISTOR 1 + #endif +#else + #undef COOLER_MINTEMP + #undef COOLER_MAXTEMP +#endif + #if TEMP_SENSOR_PROBE == -4 #define TEMP_SENSOR_PROBE_IS_AD8495 1 #elif TEMP_SENSOR_PROBE == -3 @@ -1928,6 +1949,9 @@ #if HAS_ADC_TEST(CHAMBER) #define HAS_TEMP_ADC_CHAMBER 1 #endif +#if HAS_ADC_TEST(COOLER) + #define HAS_TEMP_ADC_COOLER 1 +#endif #define HAS_TEMP(N) ANY(HAS_TEMP_ADC_##N, TEMP_SENSOR_##N##_IS_MAX_TC, TEMP_SENSOR_##N##_IS_DUMMY) #if HAS_HOTEND && HAS_TEMP(0) @@ -1942,6 +1966,9 @@ #if HAS_TEMP(CHAMBER) #define HAS_TEMP_CHAMBER 1 #endif +#if HAS_TEMP(COOLER) + #define HAS_TEMP_COOLER 1 +#endif #if ENABLED(JOYSTICK) #if PIN_EXISTS(JOY_X) @@ -2001,7 +2028,10 @@ #if HAS_HEATED_BED || HAS_TEMP_CHAMBER #define BED_OR_CHAMBER 1 #endif -#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE +#if HAS_TEMP_COOLER && PIN_EXISTS(COOLER) + #define HAS_COOLER 1 +#endif +#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE || HAS_TEMP_COOLER #define HAS_TEMP_SENSOR 1 #endif @@ -2033,9 +2063,13 @@ #if BOTH(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER) && WATCH_CHAMBER_TEMP_PERIOD > 0 #define WATCH_CHAMBER 1 #endif +#if BOTH(HAS_COOLER, THERMAL_PROTECTION_COOLER) && WATCH_COOLER_TEMP_PERIOD > 0 + #define WATCH_COOLER 1 +#endif #if (ENABLED(THERMAL_PROTECTION_HOTENDS) || !EXTRUDERS) \ && (ENABLED(THERMAL_PROTECTION_BED) || !HAS_HEATED_BED) \ - && (ENABLED(THERMAL_PROTECTION_CHAMBER) || !HAS_HEATED_CHAMBER) + && (ENABLED(THERMAL_PROTECTION_CHAMBER) || !HAS_HEATED_CHAMBER) \ + && (ENABLED(THERMAL_PROTECTION_COOLER) || !HAS_COOLER) #define THERMALLY_SAFE 1 #endif @@ -2067,8 +2101,11 @@ #if HAS_TEMP_CHAMBER && PIN_EXISTS(CHAMBER_AUTO_FAN) #define HAS_AUTO_CHAMBER_FAN 1 #endif +#if HAS_TEMP_COOLER && PIN_EXISTS(COOLER_AUTO_FAN) + #define HAS_AUTO_COOLER_FAN 1 +#endif -#if ANY(HAS_AUTO_FAN_0, HAS_AUTO_FAN_1, HAS_AUTO_FAN_2, HAS_AUTO_FAN_3, HAS_AUTO_FAN_4, HAS_AUTO_FAN_5, HAS_AUTO_FAN_6, HAS_AUTO_FAN_7, HAS_AUTO_CHAMBER_FAN) +#if ANY(HAS_AUTO_FAN_0, HAS_AUTO_FAN_1, HAS_AUTO_FAN_2, HAS_AUTO_FAN_3, HAS_AUTO_FAN_4, HAS_AUTO_FAN_5, HAS_AUTO_FAN_6, HAS_AUTO_FAN_7, HAS_AUTO_CHAMBER_FAN, HAS_AUTO_COOLER_FAN) #define HAS_AUTO_FAN 1 #endif #define _FANOVERLAP(A,B) (A##_AUTO_FAN_PIN == E##B##_AUTO_FAN_PIN) @@ -2364,7 +2401,20 @@ #define WRITE_HEATER_CHAMBER(v) WRITE(HEATER_CHAMBER_PIN, (v) ^ HEATER_CHAMBER_INVERTING) #endif -#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER +/** + * Laser Cooling requires settings + */ +#if HAS_COOLER + #ifndef MAX_COOLER_POWER + #define MAX_COOLER_POWER 255 + #endif + #ifndef COOLER_INVERTING + #define COOLER_INVERTING true + #endif + #define WRITE_HEATER_COOLER(v) WRITE(COOLER_PIN, (v) ^ COOLER_INVERTING) +#endif + +#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER || HAS_COOLER #define HAS_TEMPERATURE 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 4da25d0916..cd9ca84385 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1876,6 +1876,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN." #endif +#if TEMP_SENSOR_COOLER && !(PIN_EXISTS(TEMP_COOLER) && ENABLED(LASER_FEATURE)) + #error "TEMP_SENSOR_COOLER requires LASER_FEATURE and TEMP_COOLER_PIN." +#endif + #if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2)) #error "CHAMBER_FAN_MODE must be between 0 and 2." #endif diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 61fee3e048..d0dc288613 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -78,6 +78,16 @@ #define STATUS_CUTTER_WIDTH 0 #endif +// +// Laser Cooler +// +#if !STATUS_COOLER_WIDTH && HAS_COOLER + #include "status/cooler.h" +#endif +#ifndef STATUS_COOLER_WIDTH + #define STATUS_COOLER_WIDTH 0 +#endif + // // Bed // @@ -498,6 +508,47 @@ #endif +// +// Cooler Bitmap Properties +// +#ifndef STATUS_COOLER_BYTEWIDTH + #define STATUS_COOLER_BYTEWIDTH BW(STATUS_COOLER_WIDTH) +#endif +#if STATUS_COOLER_WIDTH + + #ifndef STATUS_COOLER_X + #define STATUS_COOLER_X (LCD_PIXEL_WIDTH - (STATUS_COOLER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) + #endif + + #ifndef STATUS_COOLER_HEIGHT + #ifdef STATUS_COOLER_ANIM + #define STATUS_COOLER_HEIGHT(S) ((S) ? sizeof(status_cooler_on_bmp) / (STATUS_COOLER_BYTEWIDTH) : sizeof(status_cooler_bmp) / (STATUS_COOLER_BYTEWIDTH)) + #else + #define STATUS_COOLER_HEIGHT(S) (sizeof(status_cooler_bmp) / (STATUS_COOLER_BYTEWIDTH)) + #endif + #endif + + #ifndef STATUS_COOLER_Y + #define STATUS_COOLER_Y(S) (18 - STATUS_COOLER_HEIGHT(S)) + #endif + + #ifndef STATUS_COOLER_TEXT_X + #define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 8) + #endif + + static_assert( + sizeof(status_cooler_bmp) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(0)), + "Status cooler bitmap (status_cooler_bmp) dimensions don't match data." + ); + #ifdef STATUS_COOLER_ANIM + static_assert( + sizeof(status_cooler_on_bmp) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(1)), + "Status cooler bitmap (status_cooler_on_bmp) dimensions don't match data." + ); + #endif + +#endif + // // Bed Bitmap Properties // @@ -585,6 +636,10 @@ #if HAS_CUTTER && !DO_DRAW_BED #define DO_DRAW_CUTTER 1 #endif +#if HAS_COOLER + #define DO_DRAW_COOLER 1 +#endif + #if HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4 #define DO_DRAW_CHAMBER 1 #endif @@ -603,6 +658,9 @@ #if BOTH(DO_DRAW_CUTTER, STATUS_CUTTER_ANIM) #define ANIM_CUTTER 1 #endif +#if BOTH(DO_DRAW_COOLER, STATUS_COOLER_ANIM) + #define ANIM_COOLER 1 +#endif #if ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER #define ANIM_HBCC 1 #endif diff --git a/Marlin/src/lcd/dogm/status/cooler.h b/Marlin/src/lcd/dogm/status/cooler.h new file mode 100644 index 0000000000..4e59e237a2 --- /dev/null +++ b/Marlin/src/lcd/dogm/status/cooler.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +// +// lcd/dogm/status/cooler.h - Status Screen Laser Cooler bitmaps +// + +#define STATUS_COOLER_WIDTH 16 + +#ifdef STATUS_COOLER_ANIM + + const unsigned char status_cooler_on_bmp[] PROGMEM = { + B00010000,B00001000, + B00010010,B01001001, + B01010100,B00101010, + B00111000,B00011100, + B11111110,B11111111, + B00111000,B00011100, + B01010100,B00101010, + B10010000,B10001001, + B00010000,B10000000, + B00000100,B10010000, + B00000010,B10100000, + B00000001,B11000000, + B00011111,B11111100, + B00000001,B11000000, + B00000010,B10100000, + B00000100,B10010000 + }; + +#endif + +const unsigned char status_cooler_bmp[] PROGMEM = { + B00010000,B00001000, + B00010010,B01001001, + B01010100,B00101010, + B00101000,B00010100, + B11000111,B01100011, + B00101000,B00010100, + B01010100,B00101010, + B10010000,B10001001, + B00010000,B10000000, + B00000100,B10010000, + B00000010,B10100000, + B00000001,B01000000, + B00011110,B00111100, + B00000001,B01000000, + B00000010,B10100000, + B00000100,B10010000 +}; diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 8ae6ab6627..892ab5218b 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -86,6 +86,7 @@ HEATBIT_HOTEND, HEATBIT_BED = HOTENDS, HEATBIT_CHAMBER, + HEATBIT_COOLER, HEATBIT_CUTTER }; IF<(HEATBIT_CUTTER > 7), uint16_t, uint8_t>::type heat_bits; @@ -111,6 +112,11 @@ #else #define CUTTER_ALT() false #endif +#if ANIM_COOLER + #define COOLER_ALT(N) TEST(heat_bits, HEATBIT_COOLER) +#else + #define COOLER_ALT() false +#endif #if DO_DRAW_HOTENDS #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) @@ -361,18 +367,22 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons #endif // DO_DRAW_BED #if DO_DRAW_CHAMBER - FORCE_INLINE void _draw_chamber_status() { #if HAS_HEATED_CHAMBER if (PAGE_UNDER(7)) _draw_centered_temp(thermalManager.degTargetChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 7); #endif - if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) _draw_centered_temp(thermalManager.degChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 28); } +#endif -#endif // DO_DRAW_CHAMBER +#if DO_DRAW_COOLER + FORCE_INLINE void _draw_cooler_status() { + if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) + _draw_centered_temp(thermalManager.degCooler(), STATUS_COOLER_TEXT_X, 28); + } +#endif // // Before homing, blink '123' <-> '???'. @@ -447,6 +457,9 @@ void MarlinUI::draw_status_screen() { #if DO_DRAW_CHAMBER && HAS_HEATED_CHAMBER if (thermalManager.isHeatingChamber()) SBI(new_bits, HEATBIT_CHAMBER); #endif + #if DO_DRAW_COOLER && HAS_COOLER + if (thermalManager.isLaserCooling()) SBI(new_bits, HEATBIT_COOLER); + #endif if (TERN0(ANIM_CUTTER, cutter.enabled())) SBI(new_bits, HEATBIT_CUTTER); heat_bits = new_bits; #endif @@ -631,12 +644,28 @@ void MarlinUI::draw_status_screen() { } #endif + // Laser Cooler + #if DO_DRAW_COOLER + #if ANIM_COOLER + #define COOLER_BITMAP(S) ((S) ? status_cooler_bmp : status_cooler_on_bmp) + #else + #define COOLER_BITMAP(S) status_cooler_bmp + #endif + const uint8_t coolery = STATUS_COOLER_Y(COOLER_ALT()), + coolerh = STATUS_COOLER_HEIGHT(COOLER_ALT()); + if (PAGE_CONTAINS(coolery, coolery + coolerh - 1)) + u8g.drawBitmapP(STATUS_COOLER_X, coolery, STATUS_COOLER_BYTEWIDTH, coolerh, COOLER_BITMAP(COOLER_ALT())); + #endif + // Heated Bed TERN_(DO_DRAW_BED, _draw_bed_status(blink)); // Heated Chamber TERN_(DO_DRAW_CHAMBER, _draw_chamber_status()); + // Cooler + TERN_(DO_DRAW_COOLER, _draw_cooler_status()); + // Fan, if a bitmap was provided #if DO_DRAW_FAN if (PAGE_CONTAINS(STATUS_FAN_TEXT_Y - INFO_FONT_ASCENT, STATUS_FAN_TEXT_Y - 1)) { diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 7c178a0339..c5c35321ca 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -176,6 +176,7 @@ namespace ExtUI { case BED: thermalManager.reset_bed_idle_timer(); return; #endif TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return); // Chamber has no idle timer + TERN_(HAS_COOLER, case COOLER: return); // Cooler has no idle timer default: TERN_(HAS_HOTEND, thermalManager.reset_hotend_idle_timer(heater - H0)); break; @@ -904,22 +905,23 @@ namespace ExtUI { value *= TOUCH_UI_LCD_TEMP_SCALING; #endif enableHeater(heater); - #if HAS_HEATED_CHAMBER - if (heater == CHAMBER) - thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAXTEMP - 10))); - else - #endif - #if HAS_HEATED_BED - if (heater == BED) - thermalManager.setTargetBed(LROUND(constrain(value, 0, BED_MAX_TARGET))); - else - #endif - { + switch (heater) { + #if HAS_HEATED_CHAMBER + case CHAMBER: thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAXTEMP - 10))); break; + #endif + #if HAS_COOLER + case COOLER: thermalManager.setTargetCooler(LROUND(constrain(value, 0, COOLER_MAXTEMP))); break; + #endif + #if HAS_HEATED_BED + case BED: thermalManager.setTargetBed(LROUND(constrain(value, 0, BED_MAX_TARGET))); break; + #endif + default: { #if HAS_HOTEND const int16_t e = heater - H0; thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); #endif - } + } break; + } } void setTargetTemp_celsius(float value, const extruder_t extruder) { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 4214ba5821..a6cfb82b88 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -55,7 +55,7 @@ namespace ExtUI { enum axis_t : uint8_t { X, Y, Z, X2, Y2, Z2, Z3, Z4 }; enum extruder_t : uint8_t { E0, E1, E2, E3, E4, E5, E6, E7 }; - enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER }; + enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER, COOLER }; enum fan_t : uint8_t { FAN0, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7 }; enum result_t : uint8_t { PID_BAD_EXTRUDER_NUM, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, PID_DONE }; diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index b17e81d831..72f262c687 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -276,6 +276,9 @@ namespace Language_en { PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Nozzle Standby"); PROGMEM Language_Str MSG_BED = _UxGT("Bed"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); + PROGMEM Language_Str MSG_COOLER = _UxGT("Laser Coolant"); + PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Toggle Cooler"); + PROGMEM Language_Str MSG_LASER = _UxGT("Laser"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Speed"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Speed ~"); PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Stored Fan ~"); @@ -482,6 +485,8 @@ namespace Language_en { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_COOLER = _UxGT("Cooler Runaway"); + PROGMEM Language_Str MSG_COOLING_FAILED = _UxGT("Cooling Failed"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); @@ -497,6 +502,7 @@ namespace Language_en { PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Probe Cooling..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chamber Heating..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling..."); + PROGMEM Language_Str MSG_LASER_COOLING = _UxGT("Laser Cooling..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrate X"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrate Y"); diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index a4cbc31d8b..d00909c7b3 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -195,6 +195,16 @@ void menu_info_thermistors() { STATIC_ITEM(TERN(WATCH_CHAMBER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); #endif + #if HAS_COOLER + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_COOLER + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR("COOL: " THERMISTOR_NAME), SS_INVERT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(COOLER_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(COOLER_MAXTEMP), SS_LEFT); + STATIC_ITEM(TERN(WATCH_COOLER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); + #endif + END_SCREEN(); } diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index f347efe6db..3a9906ddeb 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -35,6 +35,10 @@ #include "../../module/motion.h" #endif +#if HAS_COOLER + #include "../../feature/cooler.h" +#endif + #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) #include "../../module/tool_change.h" #endif @@ -68,6 +72,10 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #if HAS_HEATED_BED inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } #endif + #if HAS_COOLER + inline void _precool_laser(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } + void do_precool_laser_m() { _precool_laser(editable.int8, thermalManager.temp_cooler.target); } + #endif #if HAS_TEMP_HOTEND && HAS_HEATED_BED inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } @@ -143,6 +151,10 @@ void menu_temperature() { #endif #endif + #if HAS_COOLER + if (thermalManager.temp_cooler.target == 0) thermalManager.temp_cooler.target = COOLER_DEFAULT_TEMP; + #endif + START_MENU(); BACK_ITEM(MSG_MAIN); @@ -176,6 +188,15 @@ void menu_temperature() { EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); #endif + // + // Cooler: + // + #if HAS_COOLER + editable.state = cooler.is_enabled(); + EDIT_ITEM(bool, MSG_COOLER(TOGGLE), &cooler.state, []{ if (editable.state) cooler.disable(); else cooler.enable(); }); + EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MINTEMP + 2, COOLER_MAXTEMP - 2, thermalManager.start_watching_cooler); + #endif + // // Fan Speed: // @@ -232,7 +253,7 @@ void menu_temperature() { editable.int8 = m; #if HOTENDS > 1 || HAS_HEATED_BED SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); - #else + #elif HAS_HOTEND ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); #endif } diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h index a72a079f6e..d060d3209d 100644 --- a/Marlin/src/lcd/tft/tft_color.h +++ b/Marlin/src/lcd/tft/tft_color.h @@ -94,6 +94,9 @@ #ifndef COLOR_CHAMBER #define COLOR_CHAMBER COLOR_DARK_ORANGE #endif +#ifndef COLOR_COOLER + #define COLOR_COOLER COLOR_DARK_ORANGE +#endif #ifndef COLOR_FAN #define COLOR_FAN COLOR_AQUA #endif diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 7a45851a5d..29dd088c99 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -202,6 +202,12 @@ void Touch::touch(touch_control_t *control) { MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); } #endif + #if HAS_COOLER + else if (heater == H_COOLER) { + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_COOLER), &thermalManager.temp_cooler.target, 0, COOLER_MAXTEMP - 8, thermalManager.start_watching_cooler); + } + #endif + break; case FAN: ui.clear_lcd(); diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index eadd09ef27..fb82188645 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -136,6 +136,12 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { #endif } #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + currentTemperature = thermalManager.degCooler(); + targetTemperature = TERN(HAS_COOLER, thermalManager.degTargetCooler(), ABSOLUTE_ZERO); + } + #endif else return; TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 64, 100, Heater)); @@ -159,6 +165,13 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { image = targetTemperature > 0 ? imgChamberHeated : imgChamber; } #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + if (currentTemperature <= 26) Color = COLOR_COLD; + if (currentTemperature > 26) Color = COLOR_RED; + image = targetTemperature > 26 ? imgCoolerHot : imgCooler; + } + #endif tft.add_image(0, 18, image, Color); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 5000aedc39..164785a229 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -136,6 +136,12 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { #endif } #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + currentTemperature = thermalManager.degCooler(); + targetTemperature = TERN(HAS_COOLER, thermalManager.degTargetCooler(), ABSOLUTE_ZERO); + } + #endif else return; TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, Heater)); diff --git a/Marlin/src/lcd/tft/ui_common.h b/Marlin/src/lcd/tft/ui_common.h index d40e471171..d43de1d43b 100644 --- a/Marlin/src/lcd/tft/ui_common.h +++ b/Marlin/src/lcd/tft/ui_common.h @@ -62,6 +62,10 @@ void menu_item(const uint8_t row, bool sel = false); #define ITEM_CHAMBER 2 #define ITEM_FAN 3 #define ITEMS_COUNT 4 +#elif HAS_TEMP_COOLER + #define ITEM_COOLER 0 + #define ITEM_FAN 1 + #define ITEMS_COUNT 2 #elif HOTENDS > 1 #define ITEM_E0 0 #define ITEM_E1 1 diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index be98972b77..a1d5745de4 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -35,6 +35,11 @@ #include "endstops.h" #include "planner.h" +#if HAS_COOLER + #include "../feature/cooler.h" + #include "../feature/spindle_laser.h" +#endif + #if ENABLED(EMERGENCY_PARSER) #include "motion.h" #endif @@ -232,8 +237,13 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #else #define _CHAMBER_PSTR(h) #endif +#if HAS_COOLER + #define _COOLER_PSTR(h) (h) == H_COOLER ? GET_TEXT(MSG_COOLER) : +#else + #define _COOLER_PSTR(h) +#endif #define _E_PSTR(h,N) ((HOTENDS) > N && (h) == N) ? PSTR(LCD_STR_E##N) : -#define HEATER_PSTR(h) _BED_PSTR(h) _CHAMBER_PSTR(h) _E_PSTR(h,1) _E_PSTR(h,2) _E_PSTR(h,3) _E_PSTR(h,4) _E_PSTR(h,5) PSTR(LCD_STR_E0) +#define HEATER_PSTR(h) _BED_PSTR(h) _CHAMBER_PSTR(h) _COOLER_PSTR(h) _E_PSTR(h,1) _E_PSTR(h,2) _E_PSTR(h,3) _E_PSTR(h,4) _E_PSTR(h,5) PSTR(LCD_STR_E0) // public: @@ -254,6 +264,9 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, uint8_t Temperature::chamberfan_speed; // = 0 #endif +#if ENABLED(AUTO_POWER_COOLER_FAN) + uint8_t Temperature::coolerfan_speed; // = 0 +#endif #if HAS_FAN uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 } @@ -355,14 +368,11 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } IF_DISABLED(PIDTEMPBED, millis_t Temperature::next_bed_check_ms); -#endif // HAS_HEATED_BED +#endif #if HAS_TEMP_CHAMBER chamber_info_t Temperature::temp_chamber; // = { 0 } #if HAS_HEATED_CHAMBER - int16_t fan_chamber_pwm; - bool flag_chamber_off; - bool flag_chamber_excess_heat = false; millis_t next_cool_check_ms_2 = 0; float old_temp = 9999; #ifdef CHAMBER_MINTEMP @@ -373,8 +383,27 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif TERN_(WATCH_CHAMBER, chamber_watch_t Temperature::watch_chamber{0}); IF_DISABLED(PIDTEMPCHAMBER, millis_t Temperature::next_chamber_check_ms); - #endif // HAS_HEATED_CHAMBER -#endif // HAS_TEMP_CHAMBER + #endif +#endif + +#if HAS_TEMP_COOLER + cooler_info_t Temperature::temp_cooler; // = { 0 } + #if HAS_COOLER + bool flag_cooler_state; + //bool flag_cooler_excess = false; + float previous_temp = 9999; + #ifdef COOLER_MINTEMP + int16_t Temperature::mintemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_LO_TEMP; + #endif + #ifdef COOLER_MAXTEMP + int16_t Temperature::maxtemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_HI_TEMP; + #endif + #if WATCH_COOLER + cooler_watch_t Temperature::watch_cooler{0}; + #endif + millis_t Temperature::next_cooler_check_ms, Temperature::cooler_fan_flush_ms; + #endif +#endif #if HAS_TEMP_PROBE probe_info_t Temperature::temp_probe; // = { 0 } @@ -744,6 +773,9 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { #if HAS_HEATED_CHAMBER case H_CHAMBER: return temp_chamber.soft_pwm_amount; #endif + #if HAS_COOLER + case H_COOLER: return temp_cooler.soft_pwm_amount; + #endif default: return TERN0(HAS_HOTEND, temp_hotend[heater_id].soft_pwm_amount); } @@ -779,6 +811,11 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { SBI(fanState, pgm_read_byte(&fanBit[CHAMBER_FAN_INDEX])); #endif + #if HAS_AUTO_COOLER_FAN + if (temp_cooler.celsius >= COOLER_AUTO_FAN_TEMPERATURE) + SBI(fanState, pgm_read_byte(&fanBit[COOLER_FAN_INDEX])); + #endif + #define _UPDATE_AUTO_FAN(P,D,A) do{ \ if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ analogWrite(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ @@ -874,6 +911,8 @@ void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_ms SERIAL_ECHO(heater_id); else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) SERIAL_ECHOPGM(STR_HEATER_CHAMBER); + else if (TERN0(HAS_COOLER, heater_id == H_COOLER)) + SERIAL_ECHOPGM(STR_COOLER); else SERIAL_ECHOPGM(STR_HEATER_BED); SERIAL_EOL(); @@ -1347,11 +1386,18 @@ void Temperature::manage_heater() { } #endif + #if EITHER(CHAMBER_FAN, CHAMBER_VENT) || DISABLED(PIDTEMPCHAMBER) + static bool flag_chamber_excess_heat; // = false; + #endif + #if EITHER(CHAMBER_FAN, CHAMBER_VENT) + static bool flag_chamber_off; // = false + if (temp_chamber.target > CHAMBER_MINTEMP) { flag_chamber_off = false; #if ENABLED(CHAMBER_FAN) + int16_t fan_chamber_pwm; #if CHAMBER_FAN_MODE == 0 fan_chamber_pwm = CHAMBER_FAN_BASE; #elif CHAMBER_FAN_MODE == 1 @@ -1376,7 +1422,8 @@ void Temperature::manage_heater() { // Open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds if the // temperature didn't drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) { - if (old_temp - temp_chamber.celsius < float(MIN_COOLING_SLOPE_DEG_CHAMBER_VENT)) flag_chamber_excess_heat = true; //the bed is heating the chamber too much + if (temp_chamber.celsius - old_temp > MIN_COOLING_SLOPE_DEG_CHAMBER_VENT) + flag_chamber_excess_heat = true; // the bed is heating the chamber too much next_cool_check_ms_2 = ms + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_CHAMBER_VENT); old_temp = temp_chamber.celsius; } @@ -1385,9 +1432,8 @@ void Temperature::manage_heater() { next_cool_check_ms_2 = 0; old_temp = 9999; } - if (flag_chamber_excess_heat && (temp_chamber.celsius - temp_chamber.target <= -LOW_EXCESS_HEAT_LIMIT) ) { + if (flag_chamber_excess_heat && (temp_chamber.target - temp_chamber.celsius >= LOW_EXCESS_HEAT_LIMIT)) flag_chamber_excess_heat = false; - } #endif } else if (!flag_chamber_off) { @@ -1402,17 +1448,14 @@ void Temperature::manage_heater() { } #endif - - - #if ENABLED(PIDTEMPCHAMBER) // PIDTEMPCHAMBER doens't support a CHAMBER_VENT yet. temp_chamber.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; #else - if (ELAPSED(ms, next_chamber_check_ms)) { - next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; + if (ELAPSED(ms, next_chamber_check_ms)) { + next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; - if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { + if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { if (flag_chamber_excess_heat) { temp_chamber.soft_pwm_amount = 0; #if ENABLED(CHAMBER_VENT) @@ -1437,7 +1480,6 @@ void Temperature::manage_heater() { temp_chamber.soft_pwm_amount = 0; WRITE_HEATER_CHAMBER(LOW); } - } #if ENABLED(THERMAL_PROTECTION_CHAMBER) tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); @@ -1446,6 +1488,66 @@ void Temperature::manage_heater() { #endif // HAS_HEATED_CHAMBER + #if HAS_COOLER + + #ifndef COOLER_CHECK_INTERVAL + #define COOLER_CHECK_INTERVAL 2000UL + #endif + + #if ENABLED(THERMAL_PROTECTION_COOLER) + if (degCooler() > COOLER_MAXTEMP) max_temp_error(H_COOLER); + #endif + + #if WATCH_COOLER + // Make sure temperature is decreasing + if (watch_cooler.elapsed(ms)) { // Time to check the cooler? + if (degCooler() > watch_cooler.target) // Failed to decrease enough? + _temp_error(H_COOLER, GET_TEXT(MSG_COOLING_FAILED), GET_TEXT(MSG_COOLING_FAILED)); + else + start_watching_cooler(); // Start again if the target is still far off + } + #endif + + static bool flag_cooler_state; // = false + + if (cooler.is_enabled()) { + flag_cooler_state = true; // used to allow M106 fan control when cooler is disabled + if (temp_cooler.target == 0) temp_cooler.target = COOLER_MINTEMP; + if (ELAPSED(ms, next_cooler_check_ms)) { + next_cooler_check_ms = ms + COOLER_CHECK_INTERVAL; + if (temp_cooler.celsius > temp_cooler.target) { + temp_cooler.soft_pwm_amount = temp_cooler.celsius > temp_cooler.target ? MAX_COOLER_POWER : 0; + flag_cooler_state = temp_cooler.soft_pwm_amount > 0 ? true : false; // used to allow M106 fan control when cooler is disabled + #if ENABLED(COOLER_FAN) + int16_t fan_cooler_pwm = (COOLER_FAN_BASE) + (COOLER_FAN_FACTOR) * ABS(temp_cooler.celsius - temp_cooler.target); + NOMORE(fan_cooler_pwm, 255); + set_fan_speed(COOLER_FAN_INDEX, fan_cooler_pwm); // Set cooler fan pwm + cooler_fan_flush_ms = ms + 5000; + #endif + } + else { + temp_cooler.soft_pwm_amount = 0; + #if ENABLED(COOLER_FAN) + set_fan_speed(COOLER_FAN_INDEX, temp_cooler.celsius > temp_cooler.target - 2 ? COOLER_FAN_BASE : 0); + #endif + WRITE_HEATER_COOLER(LOW); + } + } + } + else { + temp_cooler.soft_pwm_amount = 0; + if (flag_cooler_state) { + flag_cooler_state = false; + thermalManager.set_fan_speed(COOLER_FAN_INDEX, 0); + } + WRITE_HEATER_COOLER(LOW); + } + + #if ENABLED(THERMAL_PROTECTION_COOLER) + tr_state_machine[RUNAWAY_IND_COOLER].run(temp_cooler.celsius, temp_cooler.target, H_COOLER, THERMAL_PROTECTION_COOLER_PERIOD, THERMAL_PROTECTION_COOLER_HYSTERESIS); + #endif + #endif // HAS_COOLER + UNUSED(ms); } @@ -1510,6 +1612,9 @@ void Temperature::manage_heater() { #if TEMP_SENSOR_CHAMBER_IS_CUSTOM { true, 0, 0, CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS, 0, 0, CHAMBER_BETA, 0 } #endif + #if TEMP_SENSOR_COOLER_IS_CUSTOM + { true, 0, 0, COOLER_PULLUP_RESISTOR_OHMS, COOLER_RESISTANCE_25C_OHMS, 0, 0, COOLER_BETA, 0 } + #endif #if TEMP_SENSOR_PROBE_IS_CUSTOM { true, 0, 0, PROBE_PULLUP_RESISTOR_OHMS, PROBE_RESISTANCE_25C_OHMS, 0, 0, PROBE_BETA, 0 } #endif @@ -1543,6 +1648,7 @@ void Temperature::manage_heater() { TERN_(TEMP_SENSOR_7_IS_CUSTOM, t_index == CTI_HOTEND_7 ? PSTR("HOTEND 7") :) TERN_(TEMP_SENSOR_BED_IS_CUSTOM, t_index == CTI_BED ? PSTR("BED") :) TERN_(TEMP_SENSOR_CHAMBER_IS_CUSTOM, t_index == CTI_CHAMBER ? PSTR("CHAMBER") :) + TERN_(TEMP_SENSOR_COOLER_IS_CUSTOM, t_index == CTI_COOLER ? PSTR("COOLER") :) TERN_(TEMP_SENSOR_PROBE_IS_CUSTOM, t_index == CTI_PROBE ? PSTR("PROBE") :) nullptr ); @@ -1706,7 +1812,6 @@ void Temperature::manage_heater() { #endif // HAS_HOTEND #if HAS_HEATED_BED - // Derived from RepRap FiveD extruder::getTemperature() // For bed temperature measurement. float Temperature::analog_to_celsius_bed(const int raw) { #if TEMP_SENSOR_BED_IS_CUSTOM @@ -1725,7 +1830,6 @@ void Temperature::manage_heater() { #endif // HAS_HEATED_BED #if HAS_TEMP_CHAMBER - // Derived from RepRap FiveD extruder::getTemperature() // For chamber temperature measurement. float Temperature::analog_to_celsius_chamber(const int raw) { #if TEMP_SENSOR_CHAMBER_IS_CUSTOM @@ -1743,8 +1847,25 @@ void Temperature::manage_heater() { } #endif // HAS_TEMP_CHAMBER +#if HAS_TEMP_COOLER + // For cooler temperature measurement. + float Temperature::analog_to_celsius_cooler(const int raw) { + #if TEMP_SENSOR_COOLER_IS_CUSTOM + return user_thermistor_to_deg_c(CTI_COOLER, raw); + #elif TEMP_SENSOR_COOLER_IS_THERMISTOR + SCAN_THERMISTOR_TABLE(TEMPTABLE_COOLER, TEMPTABLE_COOLER_LEN); + #elif TEMP_SENSOR_COOLER_IS_AD595 + return TEMP_AD595(raw); + #elif TEMP_SENSOR_COOLER_IS_AD8495 + return TEMP_AD8495(raw); + #else + UNUSED(raw); + return 0; + #endif + } +#endif // HAS_TEMP_COOLER + #if HAS_TEMP_PROBE - // Derived from RepRap FiveD extruder::getTemperature() // For probe temperature measurement. float Temperature::analog_to_celsius_probe(const int raw) { #if TEMP_SENSOR_PROBE_IS_CUSTOM @@ -1776,6 +1897,7 @@ void Temperature::updateTemperaturesFromRawValues() { #endif TERN_(HAS_HEATED_BED, temp_bed.celsius = analog_to_celsius_bed(temp_bed.raw)); TERN_(HAS_TEMP_CHAMBER, temp_chamber.celsius = analog_to_celsius_chamber(temp_chamber.raw)); + TERN_(HAS_TEMP_COOLER, temp_cooler.celsius = analog_to_celsius_cooler(temp_cooler.raw)); TERN_(HAS_TEMP_PROBE, temp_probe.celsius = analog_to_celsius_probe(temp_probe.raw)); TERN_(TEMP_SENSOR_1_AS_REDUNDANT, redundant_temperature = analog_to_celsius_hotend(redundant_temperature_raw, 1)); TERN_(FILAMENT_WIDTH_SENSOR, filwidth.update_measured_mm()); @@ -1927,6 +2049,10 @@ void Temperature::init() { OUT_WRITE(HEATER_CHAMBER_PIN, HEATER_CHAMBER_INVERTING); #endif + #if HAS_COOLER + OUT_WRITE(COOLER_PIN, COOLER_INVERTING); + #endif + #if HAS_FAN0 INIT_FAN_PIN(FAN_PIN); #endif @@ -2001,6 +2127,9 @@ void Temperature::init() { #if HAS_TEMP_ADC_CHAMBER HAL_ANALOG_SELECT(TEMP_CHAMBER_PIN); #endif + #if HAS_TEMP_ADC_COOLER + HAL_ANALOG_SELECT(TEMP_COOLER_PIN); + #endif #if HAS_TEMP_ADC_PROBE HAL_ANALOG_SELECT(TEMP_PROBE_PIN); #endif @@ -2137,6 +2266,15 @@ void Temperature::init() { #endif #endif + #if HAS_COOLER + #ifdef COOLER_MINTEMP + while (analog_to_celsius_cooler(mintemp_raw_COOLER) > COOLER_MINTEMP) mintemp_raw_COOLER += TEMPDIR(COOLER) * (OVERSAMPLENR); + #endif + #ifdef COOLER_MAXTEMP + while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR); + #endif + #endif + TERN_(PROBING_HEATERS_OFF, paused = false); } @@ -2174,6 +2312,17 @@ void Temperature::init() { } #endif +#if WATCH_COOLER + /** + * Start Cooling Sanity Check for cooler that is above + * its target temperature by a configurable margin. + * This is called when the temperature is set. (M143, M193) + */ + void Temperature::start_watching_cooler() { + watch_cooler.restart(degCooler(), degTargetCooler()); + } +#endif + #if HAS_THERMAL_PROTECTION Temperature::tr_state_machine_t Temperature::tr_state_machine[NR_HEATER_RUNAWAY]; // = { { TRInactive, 0 } }; @@ -2301,10 +2450,18 @@ void Temperature::disable_all_heaters() { temp_chamber.soft_pwm_amount = 0; WRITE_HEATER_CHAMBER(LOW); #endif + + #if HAS_COOLER + setTargetCooler(0); + temp_cooler.soft_pwm_amount = 0; + WRITE_HEATER_COOLER(LOW); + #endif } #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "printcounter.h" + bool Temperature::auto_job_over_threshold() { #if HAS_HOTEND HOTEND_LOOP() if (degTargetHotend(e) > (EXTRUDE_MINTEMP) / 2) return true; @@ -2564,6 +2721,7 @@ void Temperature::update_raw_temperatures() { TERN_(HAS_TEMP_ADC_BED, temp_bed.update()); TERN_(HAS_TEMP_ADC_CHAMBER, temp_chamber.update()); TERN_(HAS_TEMP_ADC_PROBE, temp_probe.update()); + TERN_(HAS_TEMP_ADC_COOLER, temp_cooler.update()); TERN_(HAS_JOY_ADC_X, joystick.x.update()); TERN_(HAS_JOY_ADC_Y, joystick.y.update()); @@ -2588,6 +2746,7 @@ void Temperature::readings_ready() { TERN_(HAS_HEATED_BED, temp_bed.reset()); TERN_(HAS_TEMP_CHAMBER, temp_chamber.reset()); TERN_(HAS_TEMP_PROBE, temp_probe.reset()); + TERN_(HAS_TEMP_COOLER, temp_cooler.reset()); TERN_(HAS_JOY_ADC_X, joystick.x.reset()); TERN_(HAS_JOY_ADC_Y, joystick.y.reset()); @@ -2650,6 +2809,18 @@ void Temperature::readings_ready() { if (CHAMBERCMP(temp_chamber.raw, maxtemp_raw_CHAMBER)) max_temp_error(H_CHAMBER); if (chamber_on && CHAMBERCMP(mintemp_raw_CHAMBER, temp_chamber.raw)) min_temp_error(H_CHAMBER); #endif + + #if BOTH(HAS_COOLER, THERMAL_PROTECTION_COOLER) + #if TEMPDIR(COOLER) < 0 + #define COOLERCMP(A,B) ((A)<(B)) + #else + #define COOLERCMP(A,B) ((A)>(B)) + #endif + if (cutter.unitPower > 0) { + if (COOLERCMP(temp_cooler.raw, maxtemp_raw_COOLER)) max_temp_error(H_COOLER); + } + if (COOLERCMP(mintemp_raw_COOLER, temp_cooler.raw)) min_temp_error(H_COOLER); + #endif } /** @@ -2735,11 +2906,15 @@ void Temperature::tick() { static SoftPWM soft_pwm_chamber; #endif + #if HAS_COOLER + static SoftPWM soft_pwm_cooler; + #endif + #define WRITE_FAN(n, v) WRITE(FAN##n##_PIN, (v) ^ FAN_INVERTING) #if DISABLED(SLOW_PWM_HEATERS) - #if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_HEATED_CHAMBER, FAN_SOFT_PWM) + #if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_HEATED_CHAMBER, HAS_COOLER, FAN_SOFT_PWM) constexpr uint8_t pwm_mask = TERN0(SOFT_PWM_DITHER, _BV(SOFT_PWM_SCALE) - 1); #define _PWM_MOD(N,S,T) do{ \ const bool on = S.add(pwm_mask, T.soft_pwm_amount); \ @@ -2766,6 +2941,10 @@ void Temperature::tick() { _PWM_MOD(CHAMBER,soft_pwm_chamber,temp_chamber); #endif + #if HAS_COOLER + _PWM_MOD(COOLER,soft_pwm_cooler,temp_cooler); + #endif + #if ENABLED(FAN_SOFT_PWM) #define _FAN_PWM(N) do{ \ uint8_t &spcf = soft_pwm_count_fan[N]; \ @@ -2813,6 +2992,10 @@ void Temperature::tick() { _PWM_LOW(CHAMBER, soft_pwm_chamber); #endif + #if HAS_COOLER + _PWM_LOW(COOLER, soft_pwm_cooler); + #endif + #if ENABLED(FAN_SOFT_PWM) #if HAS_FAN0 if (soft_pwm_count_fan[0] <= pwm_count_tmp) WRITE_FAN(0, LOW); @@ -2879,6 +3062,10 @@ void Temperature::tick() { _SLOW_PWM(CHAMBER, soft_pwm_chamber, temp_chamber); #endif + #if HAS_COOLER + _SLOW_PWM(COOLER, soft_pwm_cooler, temp_cooler); + #endif + } // slow_pwm_count == 0 #if HAS_HOTEND @@ -2894,6 +3081,10 @@ void Temperature::tick() { _PWM_OFF(CHAMBER, soft_pwm_chamber); #endif + #if HAS_COOLER + _PWM_OFF(COOLER, soft_pwm_cooler, temp_cooler); + #endif + #if ENABLED(FAN_SOFT_PWM) if (pwm_count_tmp >= 127) { pwm_count_tmp = 0; @@ -2973,6 +3164,7 @@ void Temperature::tick() { #endif TERN_(HAS_HEATED_BED, soft_pwm_bed.dec()); TERN_(HAS_HEATED_CHAMBER, soft_pwm_chamber.dec()); + TERN_(HAS_COOLER, soft_pwm_cooler.dec()); } #endif // SLOW_PWM_HEATERS @@ -3040,6 +3232,11 @@ void Temperature::tick() { case MeasureTemp_CHAMBER: ACCUMULATE_ADC(temp_chamber); break; #endif + #if HAS_TEMP_ADC_COOLER + case PrepareTemp_COOLER: HAL_START_ADC(TEMP_COOLER_PIN); break; + case MeasureTemp_COOLER: ACCUMULATE_ADC(temp_cooler); break; + #endif + #if HAS_TEMP_ADC_PROBE case PrepareTemp_PROBE: HAL_START_ADC(TEMP_PROBE_PIN); break; case MeasureTemp_PROBE: ACCUMULATE_ADC(temp_probe); break; @@ -3183,22 +3380,24 @@ void Temperature::tick() { ) { char k; switch (e) { + default: + #if HAS_TEMP_HOTEND + k = 'T'; break; + #endif + #if HAS_TEMP_BED + case H_BED: k = 'B'; break; + #endif #if HAS_TEMP_CHAMBER case H_CHAMBER: k = 'C'; break; #endif #if HAS_TEMP_PROBE case H_PROBE: k = 'P'; break; #endif - #if HAS_TEMP_HOTEND - default: k = 'T'; break; - #if HAS_HEATED_BED - case H_BED: k = 'B'; break; - #endif - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - case H_REDUNDANT: k = 'R'; break; - #endif - #elif HAS_HEATED_BED - default: k = 'B'; break; + #if HAS_TEMP_COOLER + case H_COOLER: k = 'L'; break; + #endif + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + case H_REDUNDANT: k = 'R'; break; #endif } SERIAL_CHAR(' ', k); @@ -3251,18 +3450,21 @@ void Temperature::tick() { ); #endif #if HAS_TEMP_CHAMBER - print_heater_state(degChamber() - #if HAS_HEATED_CHAMBER - , degTargetChamber() - #else - , 0 - #endif + print_heater_state(degChamber(), TERN0(HAS_HEATED_CHAMBER, degTargetChamber()) #if ENABLED(SHOW_TEMP_ADC_VALUES) , rawChamberTemp() #endif , H_CHAMBER ); - #endif + #endif // HAS_TEMP_CHAMBER + #if HAS_TEMP_COOLER + print_heater_state(degCooler(), TERN0(HAS_COOLER, degTargetCooler()) + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , rawCoolerTemp() + #endif + , H_COOLER + ); + #endif // HAS_TEMP_COOLER #if HAS_TEMP_PROBE print_heater_state(degProbe(), 0 #if ENABLED(SHOW_TEMP_ADC_VALUES) @@ -3286,6 +3488,9 @@ void Temperature::tick() { #if HAS_HEATED_CHAMBER SERIAL_ECHOPAIR(" C@:", getHeaterPower(H_CHAMBER)); #endif + #if HAS_COOLER + SERIAL_ECHOPAIR(" C@:", getHeaterPower(H_COOLER)); + #endif #if HAS_MULTI_HOTEND HOTEND_LOOP() { SERIAL_ECHOPAIR(" @", e); @@ -3759,4 +3964,103 @@ void Temperature::tick() { #endif // HAS_HEATED_CHAMBER + #if HAS_COOLER + + #ifndef MIN_COOLING_SLOPE_DEG_COOLER + #define MIN_COOLING_SLOPE_DEG_COOLER 1.50 + #endif + #ifndef MIN_COOLING_SLOPE_TIME_COOLER + #define MIN_COOLING_SLOPE_TIME_COOLER 120 + #endif + + bool Temperature::wait_for_cooler(const bool no_wait_for_cooling/*=true*/) { + + #if TEMP_COOLER_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + bool first_loop = true; + // Loop until the temperature has stabilized + #define TEMP_COOLER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME))) + #else + // Loop until the temperature is very close target + #define TEMP_COOLER_CONDITIONS (wants_to_cool ? isLaserHeating() : isLaserCooling()) + #endif + + #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + bool wants_to_cool = false; + float target_temp = -1, previous_temp = 9999; + millis_t now, next_temp_ms = 0, next_cooling_check_ms = 0; + wait_for_heatup = true; + do { + // Target temperature might be changed during the loop + if (target_temp != degTargetCooler()) { + wants_to_cool = isLaserHeating(); + target_temp = degTargetCooler(); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + if (ELAPSED(now, next_temp_ms)) { // Print Temp Reading every 1 second while heating up. + next_temp_ms = now + 1000UL; + print_heater_states(active_extruder); + #if TEMP_COOLER_RESIDENCY_TIME > 0 + SERIAL_ECHOPGM(" W:"); + if (residency_start_ms) + SERIAL_ECHO(long((SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_CHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + + const float current_temp = degCooler(); + + #if TEMP_COOLER_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + if (!residency_start_ms) { + // Start the TEMP_COOLER_RESIDENCY_TIME timer when we reach target temp for the first time. + if (temp_diff < TEMP_COOLER_WINDOW) + residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME) / 3 : 0); + } + else if (temp_diff > TEMP_COOLER_HYSTERESIS) { + // Restart the timer whenever the temperature falls outside the hysteresis. + residency_start_ms = now; + } + + first_loop = false; + #endif // TEMP_COOLER_RESIDENCY_TIME > 0 + + if (wants_to_cool) { + // Break after MIN_COOLING_SLOPE_TIME_CHAMBER seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER + if (!next_cooling_check_ms || ELAPSED(now, next_cooling_check_ms)) { + if (previous_temp - current_temp < float(MIN_COOLING_SLOPE_DEG_COOLER)) break; + next_cooling_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_COOLER); + previous_temp = current_temp; + } + } + + } while (wait_for_heatup && TEMP_COOLER_CONDITIONS); + + // Prevent a wait-forever situation if R is misused i.e. M191 R0 + if (wait_for_heatup) { + wait_for_heatup = false; + ui.reset_status(); + return true; + } + + return false; + } + + #endif // HAS_COOLER + #endif // HAS_TEMP_SENSOR diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 5f5a076911..e69183f6f5 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -44,10 +44,10 @@ #define HOTEND_INDEX TERN(HAS_MULTI_HOTEND, e, 0) #define E_NAME TERN_(HAS_MULTI_HOTEND, e) -// Heater identifiers. Positive values are hotends. Negative values are other heaters. +// Element identifiers. Positive values are hotends. Negative values are other heaters or coolers. typedef enum : int8_t { - INDEX_NONE = -5, - H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED, + INDEX_NONE = -6, + H_COOLER, H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED, H_E0, H_E1, H_E2, H_E3, H_E4, H_E5, H_E6, H_E7 } heater_id_t; @@ -99,6 +99,9 @@ enum ADCSensorState : char { #if HAS_TEMP_ADC_CHAMBER PrepareTemp_CHAMBER, MeasureTemp_CHAMBER, #endif + #if HAS_TEMP_ADC_COOLER + PrepareTemp_COOLER, MeasureTemp_COOLER, + #endif #if HAS_TEMP_ADC_PROBE PrepareTemp_PROBE, MeasureTemp_PROBE, #endif @@ -218,6 +221,9 @@ struct PIDHeaterInfo : public HeaterInfo { #elif HAS_TEMP_CHAMBER typedef temp_info_t chamber_info_t; #endif +#if EITHER(HAS_COOLER, HAS_TEMP_COOLER) + typedef heater_info_t cooler_info_t; +#endif // Heater watch handling template @@ -249,6 +255,9 @@ struct HeaterWatch { #if WATCH_CHAMBER typedef struct HeaterWatch chamber_watch_t; #endif +#if WATCH_COOLER + typedef struct HeaterWatch cooler_watch_t; +#endif // Temperature sensor read value ranges typedef struct { int16_t raw_min, raw_max; } raw_range_t; @@ -288,6 +297,9 @@ typedef struct { int16_t raw_min, raw_max, mintemp, maxtemp; } temp_range_t; #if TEMP_SENSOR_CHAMBER_IS_CUSTOM CTI_CHAMBER, #endif + #if COOLER_USER_THERMISTOR + CTI_COOLER, + #endif USER_THERMISTORS }; @@ -316,9 +328,11 @@ class Temperature { TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); TERN_(HAS_TEMP_CHAMBER, static chamber_info_t temp_chamber); + TERN_(HAS_TEMP_COOLER, static cooler_info_t temp_cooler); TERN_(AUTO_POWER_E_FANS, static uint8_t autofan_speed[HOTENDS]); TERN_(AUTO_POWER_CHAMBER_FAN, static uint8_t chamberfan_speed); + TERN_(AUTO_POWER_COOLER_FAN, static uint8_t coolerfan_speed); #if ENABLED(FAN_SOFT_PWM) static uint8_t soft_pwm_amount_fan[FAN_COUNT], @@ -428,6 +442,17 @@ class Temperature { #endif #endif + #if HAS_COOLER + TERN_(WATCH_COOLER, static cooler_watch_t watch_cooler); + static millis_t next_cooler_check_ms, cooler_fan_flush_ms; + #ifdef COOLER_MINTEMP + static int16_t mintemp_raw_COOLER; + #endif + #ifdef COOLER_MAXTEMP + static int16_t maxtemp_raw_COOLER; + #endif + #endif + #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED static uint8_t consecutive_low_temperature_error[HOTENDS]; #endif @@ -492,7 +517,6 @@ class Temperature { #if HAS_HOTEND static float analog_to_celsius_hotend(const int raw, const uint8_t e); #endif - #if HAS_HEATED_BED static float analog_to_celsius_bed(const int raw); #endif @@ -502,6 +526,9 @@ class Temperature { #if HAS_TEMP_CHAMBER static float analog_to_celsius_chamber(const int raw); #endif + #if HAS_TEMP_COOLER + static float analog_to_celsius_cooler(const int raw); + #endif #if HAS_FAN @@ -737,6 +764,38 @@ class Temperature { } #endif + #if HAS_TEMP_COOLER + #if ENABLED(SHOW_TEMP_ADC_VALUES) + FORCE_INLINE static int16_t rawCoolerTemp() { return temp_cooler.raw; } + #endif + FORCE_INLINE static float degCooler() { return temp_cooler.celsius; } + #if HAS_COOLER + FORCE_INLINE static int16_t degTargetCooler() { return temp_cooler.target; } + FORCE_INLINE static bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } + FORCE_INLINE static bool isLaserCooling() { return temp_cooler.target < temp_cooler.celsius; } + static bool wait_for_cooler(const bool no_wait_for_cooling=true); + #endif + #endif + + #if WATCH_COOLER + static void start_watching_cooler(); + #else + static inline void start_watching_cooler() {} + #endif + + #if HAS_COOLER + static void setTargetCooler(const int16_t celsius) { + temp_cooler.target = + #ifdef COOLER_MAXTEMP + _MIN(celsius, COOLER_MAXTEMP - 10) + #else + celsius + #endif + ; + start_watching_cooler(); + } + #endif + /** * The software PWM power for a heater */ @@ -847,7 +906,7 @@ class Temperature { static void min_temp_error(const heater_id_t e); static void max_temp_error(const heater_id_t e); - #define HAS_THERMAL_PROTECTION ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER, HAS_THERMALLY_PROTECTED_BED) + #define HAS_THERMAL_PROTECTION ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER, HAS_THERMALLY_PROTECTED_BED, THERMAL_PROTECTION_COOLER) #if HAS_THERMAL_PROTECTION @@ -863,6 +922,9 @@ class Temperature { #if ENABLED(THERMAL_PROTECTION_CHAMBER) RUNAWAY_IND_CHAMBER, #endif + #if ENABLED(THERMAL_PROTECTION_COOLER) + RUNAWAY_IND_COOLER, + #endif NR_HEATER_RUNAWAY }; #undef _ENUM_FOR_E @@ -872,6 +934,9 @@ class Temperature { #if HAS_THERMALLY_PROTECTED_CHAMBER if (heater_id == H_CHAMBER) return RUNAWAY_IND_CHAMBER; #endif + #if HAS_THERMALLY_PROTECTED_CHAMBER + if (heater_id == H_COOLER) return RUNAWAY_IND_COOLER; + #endif #if HAS_THERMALLY_PROTECTED_BED if (heater_id == H_BED) return RUNAWAY_IND_BED; #endif diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 77fc50c8d3..f0ec289dfe 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -42,7 +42,7 @@ #define OV_SCALE(N) (N) #define OV(N) int16_t(OV_SCALE(N) * (OVERSAMPLENR) * (THERMISTOR_TABLE_SCALE)) -#define ANY_THERMISTOR_IS(n) (TEMP_SENSOR_0_THERMISTOR_ID == n || TEMP_SENSOR_1_THERMISTOR_ID == n || TEMP_SENSOR_2_THERMISTOR_ID == n || TEMP_SENSOR_3_THERMISTOR_ID == n || TEMP_SENSOR_4_THERMISTOR_ID == n || TEMP_SENSOR_5_THERMISTOR_ID == n || TEMP_SENSOR_6_THERMISTOR_ID == n || TEMP_SENSOR_7_THERMISTOR_ID == n || TEMP_SENSOR_BED_THERMISTOR_ID == n || TEMP_SENSOR_CHAMBER_THERMISTOR_ID == n || TEMP_SENSOR_PROBE_THERMISTOR_ID == n) +#define ANY_THERMISTOR_IS(n) (TEMP_SENSOR_0_THERMISTOR_ID == n || TEMP_SENSOR_1_THERMISTOR_ID == n || TEMP_SENSOR_2_THERMISTOR_ID == n || TEMP_SENSOR_3_THERMISTOR_ID == n || TEMP_SENSOR_4_THERMISTOR_ID == n || TEMP_SENSOR_5_THERMISTOR_ID == n || TEMP_SENSOR_6_THERMISTOR_ID == n || TEMP_SENSOR_7_THERMISTOR_ID == n || TEMP_SENSOR_BED_THERMISTOR_ID == n || TEMP_SENSOR_CHAMBER_THERMISTOR_ID == n || TEMP_SENSOR_COOLER_THERMISTOR_ID == n || TEMP_SENSOR_PROBE_THERMISTOR_ID == n) typedef struct { int16_t value, celsius; } temp_entry_t; @@ -303,6 +303,14 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #define TEMPTABLE_CHAMBER_LEN 0 #endif +#ifdef TEMP_SENSOR_COOLER_THERMISTOR_ID + #define TEMPTABLE_COOLER TT_NAME(TEMP_SENSOR_COOLER_THERMISTOR_ID) + #define TEMPTABLE_COOLER_LEN COUNT(TEMPTABLE_COOLER) +#elif TEMP_SENSOR_COOLER_IS_THERMISTOR + #error "No cooler thermistor table specified" +#else + #define TEMPTABLE_COOLER_LEN 0 +#endif #ifdef TEMP_SENSOR_PROBE_THERMISTOR_ID #define TEMPTABLE_PROBE TT_NAME(TEMP_SENSOR_PROBE_THERMISTOR_ID) #define TEMPTABLE_PROBE_LEN COUNT(TEMPTABLE_PROBE) @@ -319,7 +327,7 @@ static_assert( && TEMPTABLE_4_LEN < 256 && TEMPTABLE_5_LEN < 256 && TEMPTABLE_6_LEN < 256 && TEMPTABLE_7_LEN < 256 && TEMPTABLE_BED_LEN < 256 && TEMPTABLE_CHAMBER_LEN < 256 - && TEMPTABLE_PROBE_LEN < 256, + && TEMPTABLE_COOLER_LEN < 256 && TEMPTABLE_PROBE_LEN < 256, "Temperature conversion tables over 255 entries need special consideration." ); @@ -495,6 +503,15 @@ static_assert( #define TEMP_SENSOR_CHAMBER_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif +#ifndef TEMP_SENSOR_COOLER_RAW_HI_TEMP + #if TT_REVRAW(COOLER) + #define TEMP_SENSOR_COOLER_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_COOLER_RAW_LO_TEMP 0 + #else + #define TEMP_SENSOR_COOLER_RAW_HI_TEMP 0 + #define TEMP_SENSOR_COOLER_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif #ifndef TEMP_SENSOR_PROBE_RAW_HI_TEMP #if TT_REVRAW(PROBE) #define TEMP_SENSOR_PROBE_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 42095fa926..51a00630a4 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -91,6 +91,9 @@ #if PIN_EXISTS(TEMP_CHAMBER) && ANALOG_OK(TEMP_CHAMBER_PIN) REPORT_NAME_ANALOG(__LINE__, TEMP_CHAMBER_PIN) #endif +#if PIN_EXISTS(TEMP_COOLER) && ANALOG_OK(TEMP_COOLER_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_COOLER_PIN) +#endif #if PIN_EXISTS(ADC_KEYPAD) && ANALOG_OK(ADC_KEYPAD_PIN) REPORT_NAME_ANALOG(__LINE__, ADC_KEYPAD_PIN) #endif @@ -706,6 +709,9 @@ #if PIN_EXISTS(HEATER_CHAMBER) REPORT_NAME_DIGITAL(__LINE__, HEATER_CHAMBER_PIN) #endif +#if PIN_EXISTS(COOLER) + REPORT_NAME_DIGITAL(__LINE__, COOLER_PIN) +#endif #if PIN_EXISTS(HOME) REPORT_NAME_DIGITAL(__LINE__, HOME_PIN) #endif diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h index d7eb187245..b8be00bddd 100644 --- a/Marlin/src/pins/sensitive_pins.h +++ b/Marlin/src/pins/sensitive_pins.h @@ -676,6 +676,24 @@ #define _CHAMBER_FAN #endif +#if TEMP_SENSOR_COOLER && PIN_EXISTS(TEMP_COOLER) + #define _COOLER_TEMP analogInputToDigitalPin(TEMP_COOLER_PIN), +#else + #define _COOLER_TEMP +#endif + +#if TEMP_SENSOR_COOLER && PIN_EXISTS(COOLER) + #define _COOLER COOLER_PIN, +#else + #define _COOLER +#endif + +#if TEMP_SENSOR_COOLER && PINS_EXIST(TEMP_COOLER, COOLER_AUTO_FAN) + #define _COOLER_FAN COOLER_AUTO_FAN_PIN, +#else + #define _COOLER_FAN +#endif + #ifndef HAL_SENSITIVE_PINS #define HAL_SENSITIVE_PINS #endif @@ -685,5 +703,5 @@ _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS _E6_PINS _E7_PINS \ _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS _H6_PINS _H7_PINS \ _PS_ON _FAN0 _FAN1 _FAN2 _FAN3 _FAN4 _FAN5 _FAN6 _FAN7 _FANC \ - _BED_PINS _CHAMBER_TEMP _CHAMBER_HEATER _CHAMBER_FAN HAL_SENSITIVE_PINS \ + _BED_PINS _COOLER _CHAMBER_TEMP _CHAMBER_HEATER _CHAMBER_FAN HAL_SENSITIVE_PINS \ } diff --git a/buildroot/tests/BIGTREE_SKR_PRO b/buildroot/tests/BIGTREE_SKR_PRO index 74020c1b27..025d8cbce8 100755 --- a/buildroot/tests/BIGTREE_SKR_PRO +++ b/buildroot/tests/BIGTREE_SKR_PRO @@ -11,7 +11,7 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT 1 -exec_test $1 $2 "BigTreeTech SKR Pro Default Configuration" "$3" +exec_test $1 $2 "BigTreeTech SKR Pro | Default Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ @@ -19,14 +19,15 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ E0_AUTO_FAN_PIN PC10 E1_AUTO_FAN_PIN PC11 E2_AUTO_FAN_PIN PC12 \ X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING PINS_DEBUGGING -exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" "$3" +exec_test $1 $2 "BigTreeTech SKR Pro | 3 Extruders | Auto-Fan | BLTOUCH | Mixed TMC" "$3" restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ CUTTER_POWER_UNIT PERCENT \ - SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN -opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER -exec_test $1 $2 "Laser, LCD, PERCENT power unit" "$3" + SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN \ + TEMP_SENSOR_COOLER 1000 TEMP_COOLER_PIN PD13 +opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER +exec_test $1 $2 "BigTreeTech SKR Pro | Laser (Percent) | Cooling | LCD" "$3" # clean up restore_configs diff --git a/platformio.ini b/platformio.ini index aad59362cc..d26b2a37ea 100644 --- a/platformio.ini +++ b/platformio.ini @@ -196,6 +196,7 @@ default_src_filter = + - - + - - - + - - - - @@ -406,6 +407,7 @@ SDSUPPORT = src_filter=+ + GCODE_REPEAT_MARKERS = src_filter=+ + HAS_EXTRUDERS = src_filter=+ + +HAS_COOLER = src_filter=- AUTO_REPORT_TEMPERATURES = src_filter=+ INCH_MODE_SUPPORT = src_filter=+ TEMPERATURE_UNITS_SUPPORT = src_filter=+ From 6ee61c8380837340a8ab83edf1aa48f7f6d0a1b4 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 7 Mar 2021 16:43:43 +1300 Subject: [PATCH 1124/1370] Update obsolete debug define (#21276) --- Marlin/src/core/debug_out.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index d93decf7ac..a7dc32622d 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -27,7 +27,7 @@ // #undef DEBUG_SECTION -#undef DEBUG_PRINT_P +#undef DEBUG_ECHOPGM_P #undef DEBUG_ECHO_START #undef DEBUG_ERROR_START #undef DEBUG_CHAR From d4a601457840af4ad4eb5c97ab95c73e05461571 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 6 Mar 2021 20:55:37 -0800 Subject: [PATCH 1125/1370] Extend Heater Overshoot Options (#21273) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 7b0023a564..1098351d4e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -476,6 +476,15 @@ #define BED_MAXTEMP 150 #define CHAMBER_MAXTEMP 60 +/** + * Thermal Overshoot + * During heatup (and printing) the temperature can often "overshoot" the target by many degrees + * (especially before PID tuning). Setting the target temperature too close to MAXTEMP guarantees + * a MAXTEMP shutdown! Use these values to forbid temperatures being set too close to MAXTEMP. + */ +#define HOTEND_OVERSHOOT 15 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT +#define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT + //=========================================================================== //============================= PID Settings ================================ //=========================================================================== From b80ec493ede395bfda160abebbb559b8f149c813 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 8 Mar 2021 17:06:33 +1300 Subject: [PATCH 1126/1370] M303 followup (#21282) Followup to f2ed18d150 --- Marlin/src/gcode/temp/M303.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 159a52bf26..0934e04e75 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -51,7 +51,7 @@ void GcodeSuite::M303() { thermalManager.pid_debug_flag ^= true; SERIAL_ECHO_START(); SERIAL_ECHOPGM("PID Debug "); - serialprintln_onoff(pid_debug_flag); + serialprintln_onoff(thermalManager.pid_debug_flag); return; } #endif From 7a5a6ca53fbd1b46eca32e1e4050228db887d14b Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 8 Mar 2021 04:11:37 -0300 Subject: [PATCH 1127/1370] Fix Host Keepalive serial target (#21283) Co-authored-by: Scott Lahteine --- .../src/HAL/ESP32/FlushableHardwareSerial.h | 6 ++--- Marlin/src/core/serial.h | 2 +- Marlin/src/core/serial_hook.h | 2 +- Marlin/src/gcode/gcode.cpp | 1 + Marlin/src/gcode/queue.cpp | 26 +++++++------------ platformio.ini | 6 ++--- 6 files changed, 17 insertions(+), 26 deletions(-) diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h index 27df0be4b6..d2762c0efa 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h @@ -21,9 +21,9 @@ */ #pragma once -#ifdef ARDUINO_ARCH_ESP32 - #include + +#include "../shared/Marduino.h" #include "../../core/serial_hook.h" class FlushableHardwareSerial : public HardwareSerial { @@ -32,5 +32,3 @@ public: }; extern Serial0Type flushableSerial; - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index ec955a8dea..f76f0e32f5 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -62,7 +62,7 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // -#define SERIAL_ALL 0x7F +#define SERIAL_ALL 0xFF #if HAS_MULTI_SERIAL #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) #define _PORT_RESTORE(n,p) RESTORE(n) diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index afd43892c7..dc2da13501 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -165,7 +165,7 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria RuntimeSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...), writeHook(0), eofHook(0), userPointer(0) {} }; -// A class that's duplicating its output conditionally to 2 serial interface +// A class that duplicates its output conditionally to 2 serial interfaces template struct MultiSerial : public SerialBase< MultiSerial > { typedef SerialBase< MultiSerial > BaseClassT; diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 34b8d767d1..5f30064b11 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1067,6 +1067,7 @@ void GcodeSuite::process_subcommands_now(char * gcode) { static millis_t next_busy_signal_ms = 0; if (!autoreport_paused && host_keepalive_interval && busy_state != NOT_BUSY) { if (PENDING(ms, next_busy_signal_ms)) return; + PORT_REDIRECT(SERIAL_ALL); switch (busy_state) { case IN_HANDLER: case IN_PROCESS: diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 136293fd34..9b69f9f1fc 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -272,21 +272,7 @@ void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) { SERIAL_ECHOLN(serial_state[serial_ind].last_N + 1); } -// Multiserial already handle the dispatch to/from multiple port by itself -inline bool serial_data_available(uint8_t index = SERIAL_ALL) { - if (index == SERIAL_ALL) { - for (index = 0; index < NUM_SERIAL; index++) { - const int a = SERIAL_IMPL.available(index); - #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) - if (a > RX_BUFFER_SIZE - 2) { - PORT_REDIRECT(SERIAL_PORTMASK(index)); - SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a); - } - #endif - if (a > 0) return true; - } - return false; - } +inline bool serial_data_available(uint8_t index) { const int a = SERIAL_IMPL.available(index); #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) if (a > RX_BUFFER_SIZE - 2) { @@ -294,10 +280,16 @@ inline bool serial_data_available(uint8_t index = SERIAL_ALL) { SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a); } #endif - return a > 0; } +// Multiserial already handles dispatch to/from multiple ports +inline bool any_serial_data_available() { + LOOP_L_N(p, NUM_SERIAL) + if (serial_data_available(p)) + return true; +} + inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { @@ -409,7 +401,7 @@ void GCodeQueue::get_serial_commands() { // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 const millis_t ms = millis(); - if (ring_buffer.empty() && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); last_command_time = ms; } diff --git a/platformio.ini b/platformio.ini index d26b2a37ea..b8235c84fd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -424,9 +424,9 @@ HAS_SERVOS = src_filter=+ + HAS_MICROSTEPS = src_filter=+ (ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer - ESP3DLib=https://github.com/luc-github/ESP3DLib.git - arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git - ESP32SSDP=https://github.com/luc-github/ESP32SSDP.git + ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/master.zip + arduinoWebSockets=links2004/WebSockets@2.3.4 + luc-github/ESP32SSDP@^1.1.1 lib_ignore=ESPAsyncTCP # From b680ddc66cc160898bb11ce1caa0bf9fbd32921d Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 8 Mar 2021 23:14:18 +1300 Subject: [PATCH 1128/1370] CUSTOM_USER_BUTTONS followup (#21284) Followup to #18389 --- Marlin/Configuration_adv.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 3168e9a001..868b0c239a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3420,7 +3420,7 @@ //#define CUSTOM_USER_BUTTONS #if ENABLED(CUSTOM_USER_BUTTONS) //#define BUTTON1_PIN -1 - #if PIN_EXISTS(BUTTON1_PIN) + #if PIN_EXISTS(BUTTON1) #define BUTTON1_HIT_STATE LOW // State of the triggered button. NC=LOW. NO=HIGH. #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing? #define BUTTON1_GCODE "G28" @@ -3428,7 +3428,7 @@ #endif //#define BUTTON2_PIN -1 - #if PIN_EXISTS(BUTTON2_PIN) + #if PIN_EXISTS(BUTTON2) #define BUTTON2_HIT_STATE LOW #define BUTTON2_WHEN_PRINTING false #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) @@ -3436,7 +3436,7 @@ #endif //#define BUTTON3_PIN -1 - #if PIN_EXISTS(BUTTON3_PIN) + #if PIN_EXISTS(BUTTON3) #define BUTTON3_HIT_STATE LOW #define BUTTON3_WHEN_PRINTING false #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) From 7f3208ba794fba3edafc111330dbf37d2536a84c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 8 Mar 2021 22:59:35 -0300 Subject: [PATCH 1129/1370] Host Keepalive followup (#21290) Followup to #21283 Co-authored-by: Scott Lahteine --- Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp index cc5a4fc476..9e2f4c1d96 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp @@ -20,11 +20,10 @@ * */ -#include "FlushableHardwareSerial.h" - #ifdef ARDUINO_ARCH_ESP32 +#include "FlushableHardwareSerial.h" Serial0Type flushableSerial(false, 0); -#endif // ARDUINO_ARCH_ESP32 +#endif From 6652c7c4358093ddc228fe23c75d8aea7be9f374 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Tue, 9 Mar 2021 10:20:37 +0100 Subject: [PATCH 1130/1370] Distinguish serial index from mask (#21287) --- Marlin/src/core/serial.h | 31 +++-- Marlin/src/core/serial_base.h | 23 +++- Marlin/src/core/serial_hook.h | 106 ++++++++++-------- Marlin/src/feature/host_actions.cpp | 10 +- Marlin/src/feature/meatpack.h | 24 ++-- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/host/M118.cpp | 2 +- Marlin/src/gcode/queue.cpp | 14 +-- Marlin/src/gcode/queue.h | 6 +- Marlin/src/gcode/sd/M1001.cpp | 2 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 6 +- Marlin/src/libs/autoreport.h | 4 +- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 4 +- 14 files changed, 135 insertions(+), 101 deletions(-) diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index f76f0e32f5..57e9636be0 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -62,37 +62,36 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // -#define SERIAL_ALL 0xFF #if HAS_MULTI_SERIAL - #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) - #define _PORT_RESTORE(n,p) RESTORE(n) - #define SERIAL_ASSERT(P) if(multiSerial.portMask!=(P)){ debugger(); } + #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) + #define _PORT_RESTORE(n,p) RESTORE(n) + #define SERIAL_ASSERT(P) if(multiSerial.portMask!=(P)){ debugger(); } #ifdef SERIAL_CATCHALL typedef MultiSerial SerialOutputT; #else - typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; + typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; #endif - extern SerialOutputT multiSerial; - #define _SERIAL_IMPL multiSerial + extern SerialOutputT multiSerial; + #define _SERIAL_IMPL multiSerial #else - #define _PORT_REDIRECT(n,p) NOOP - #define _PORT_RESTORE(n) NOOP - #define SERIAL_ASSERT(P) NOOP - #define _SERIAL_IMPL MYSERIAL0 + #define _PORT_REDIRECT(n,p) NOOP + #define _PORT_RESTORE(n) NOOP + #define SERIAL_ASSERT(P) NOOP + #define _SERIAL_IMPL MYSERIAL0 #endif #if ENABLED(MEATPACK) extern MeatpackSerial mpSerial; - #define SERIAL_IMPL mpSerial + #define SERIAL_IMPL mpSerial #else - #define SERIAL_IMPL _SERIAL_IMPL + #define SERIAL_IMPL _SERIAL_IMPL #endif #define SERIAL_OUT(WHAT, V...) (void)SERIAL_IMPL.WHAT(V) -#define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) -#define PORT_RESTORE() _PORT_RESTORE(1) -#define SERIAL_PORTMASK(P) _BV(P) +#define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) +#define PORT_RESTORE() _PORT_RESTORE(1) +#define SERIAL_PORTMASK(P) SerialMask::from(P) // // SERIAL_CHAR - Print one or more individual chars diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 418bb557e7..f8fe3a181d 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -22,12 +22,29 @@ #pragma once #include "../inc/MarlinConfigPre.h" -#include "macros.h" #if ENABLED(EMERGENCY_PARSER) #include "../feature/e_parser.h" #endif +// Used in multiple places +// You can build it but not manipulate it. +// There are only few places where it's required to access the underlying member: GCodeQueue, SerialMask and MultiSerial +struct serial_index_t { + // A signed index, where -1 is a special case meaning no action (neither output or input) + int8_t index; + + // Check if the index is within the range [a ... b] + constexpr inline bool within(const int8_t a, const int8_t b) const { return WITHIN(index, a, b); } + constexpr inline bool valid() const { return WITHIN(index, 0, 7); } // At most, 8 bits + + // Construction is either from an index + constexpr serial_index_t(const int8_t index) : index(index) {} + + // Default to "no index" + constexpr serial_index_t() : index(-1) {} +}; + // flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. CALL_IF_EXISTS_IMPL(void, flushTX); CALL_IF_EXISTS_IMPL(bool, connected, true); @@ -79,10 +96,10 @@ struct SerialBase { void end() { static_cast(this)->end(); } /** Check for available data from the port @param index The port index, usually 0 */ - int available(uint8_t index = 0) { return static_cast(this)->available(index); } + int available(serial_index_t index = 0) { return static_cast(this)->available(index); } /** Read a value from the port @param index The port index, usually 0 */ - int read(uint8_t index = 0) { return static_cast(this)->read(index); } + int read(serial_index_t index = 0) { return static_cast(this)->read(index); } // Check if the serial port is connected (usually bypassed) bool connected() { return static_cast(this)->connected(); } // Redirect flush diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index dc2da13501..5e81e9e0e4 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -21,11 +21,32 @@ */ #pragma once -#include "macros.h" #include "serial_base.h" -// Used in multiple places -typedef int8_t serial_index_t; +// A mask containing a bitmap of the serial port to act upon +// This is written to ensure a serial index is never used as a serial mask +class SerialMask { + uint8_t mask; + + // This constructor is private to ensure you can't convert an index to a mask + // The compiler will stop here if you are mixing index and mask in your code. + // If you need to, you'll have to use the explicit static "from" method here + SerialMask(const serial_index_t); + +public: + inline constexpr bool enabled(const SerialMask PortMask) const { return mask & PortMask.mask; } + inline constexpr SerialMask combine(const SerialMask other) const { return SerialMask(mask | other.mask); } + inline constexpr SerialMask operator<< (const int offset) const { return SerialMask(mask << offset); } + static inline SerialMask from(const serial_index_t index) { + if (index.valid()) return SerialMask(_BV(index.index)); + return SerialMask(0); // A invalid index mean no output + } + + constexpr SerialMask(const uint8_t mask) : mask(mask) {} + constexpr SerialMask(const SerialMask & other) : mask(other.mask) {} // Can't use = default here since not all framework support this + + static constexpr uint8_t All = 0xFF; +}; // The most basic serial class: it dispatch to the base serial class with no hook whatsoever. This will compile to nothing but the base serial class template @@ -39,10 +60,10 @@ struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { void msgDone() {} // We don't care about indices here, since if one can call us, it's the right index anyway - int available(uint8_t) { return (int)SerialT::available(); } - int read(uint8_t) { return (int)SerialT::read(); } - bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } - void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + int available(serial_index_t) { return (int)SerialT::available(); } + int read(serial_index_t) { return (int)SerialT::read(); } + bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } // We have 2 implementation of the same method in both base class, let's say which one we want using SerialT::available; @@ -77,11 +98,10 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial > { bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - int available(uint8_t ) { return (int)out.available(); } - int read(uint8_t ) { return (int)out.read(); } - int available() { return (int)out.available(); } - int read() { return (int)out.read(); } - + int available(serial_index_t ) { return (int)out.available(); } + int read(serial_index_t ) { return (int)out.read(); } + int available() { return (int)out.available(); } + int read() { return (int)out.read(); } ConditionalSerial(bool & conditionVariable, SerialT & out, const bool e) : BaseClassT(e), condition(conditionVariable), out(out) {} }; @@ -102,8 +122,8 @@ struct ForwardSerial : public SerialBase< ForwardSerial > { bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - int available(uint8_t) { return (int)out.available(); } - int read(uint8_t) { return (int)out.read(); } + int available(serial_index_t) { return (int)out.available(); } + int read(serial_index_t) { return (int)out.read(); } int available() { return (int)out.available(); } int read() { return (int)out.read(); } @@ -130,8 +150,8 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria if (eofHook) eofHook(userPointer); } - int available(uint8_t) { return (int)SerialT::available(); } - int read(uint8_t) { return (int)SerialT::read(); } + int available(serial_index_t) { return (int)SerialT::available(); } + int read(serial_index_t) { return (int)SerialT::read(); } using SerialT::available; using SerialT::read; using SerialT::flush; @@ -170,53 +190,51 @@ template > { typedef SerialBase< MultiSerial > BaseClassT; - uint8_t portMask; + SerialMask portMask; Serial0T & serial0; Serial1T & serial1; - enum Masks { - UsageMask = ((1 << step) - 1), // A bit mask containing as many bits as step - FirstOutputMask = (UsageMask << offset), - SecondOutputMask = (UsageMask << (offset + step)), - AllMask = FirstOutputMask | SecondOutputMask, - }; + static constexpr uint8_t Usage = ((1 << step) - 1); // A bit mask containing as many bits as step + static constexpr uint8_t FirstOutput = (Usage << offset); + static constexpr uint8_t SecondOutput = (Usage << (offset + step)); + static constexpr uint8_t Both = FirstOutput | SecondOutput; NO_INLINE size_t write(uint8_t c) { size_t ret = 0; - if (portMask & FirstOutputMask) ret = serial0.write(c); - if (portMask & SecondOutputMask) ret = serial1.write(c) | ret; + if (portMask.enabled(FirstOutput)) ret = serial0.write(c); + if (portMask.enabled(SecondOutput)) ret = serial1.write(c) | ret; return ret; } NO_INLINE void msgDone() { - if (portMask & FirstOutputMask) serial0.msgDone(); - if (portMask & SecondOutputMask) serial1.msgDone(); + if (portMask.enabled(FirstOutput)) serial0.msgDone(); + if (portMask.enabled(SecondOutput)) serial1.msgDone(); } - int available(uint8_t index) { - if (index >= 0 + offset && index < step + offset) + int available(serial_index_t index) { + if (index.within(0 + offset, step + offset - 1)) return serial0.available(index); - else if (index >= step + offset && index < 2 * step + offset) + else if (index.within(step + offset, 2 * step + offset - 1)) return serial1.available(index); return false; } - int read(uint8_t index) { - if (index >= 0 + offset && index < step + offset) + int read(serial_index_t index) { + if (index.within(0 + offset, step + offset - 1)) return serial0.read(index); - else if (index >= step + offset && index < 2 * step + offset) + else if (index.within(step + offset, 2 * step + offset - 1)) return serial1.read(index); return -1; } void begin(const long br) { - if (portMask & FirstOutputMask) serial0.begin(br); - if (portMask & SecondOutputMask) serial1.begin(br); + if (portMask.enabled(FirstOutput)) serial0.begin(br); + if (portMask.enabled(SecondOutput)) serial1.begin(br); } void end() { - if (portMask & FirstOutputMask) serial0.end(); - if (portMask & SecondOutputMask) serial1.end(); + if (portMask.enabled(FirstOutput)) serial0.end(); + if (portMask.enabled(SecondOutput)) serial1.end(); } bool connected() { bool ret = true; - if (portMask & FirstOutputMask) ret = CALL_IF_EXISTS(bool, &serial0, connected); - if (portMask & SecondOutputMask) ret = ret && CALL_IF_EXISTS(bool, &serial1, connected); + if (portMask.enabled(FirstOutput)) ret = CALL_IF_EXISTS(bool, &serial0, connected); + if (portMask.enabled(SecondOutput)) ret = ret && CALL_IF_EXISTS(bool, &serial1, connected); return ret; } @@ -225,15 +243,15 @@ struct MultiSerial : public SerialBase< MultiSerial> { uint8_t charCount; uint8_t readIndex; - NO_INLINE size_t write(uint8_t c) { return out.write(c); } - void flush() { out.flush(); } - void begin(long br) { out.begin(br); readIndex = 0; } - void end() { out.end(); } + NO_INLINE size_t write(uint8_t c) { return out.write(c); } + void flush() { out.flush(); } + void begin(long br) { out.begin(br); readIndex = 0; } + void end() { out.end(); } - void msgDone() { out.msgDone(); } + void msgDone() { out.msgDone(); } // Existing instances implement Arduino's operator bool, so use that if it's available - bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } - void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } + void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - int available(uint8_t index) { + int available(serial_index_t index) { // There is a potential issue here with multiserial, since it'll return its decoded buffer whatever the serial index here. // So, instead of doing MeatpackSerial> we should do MultiSerial, MeatpackSerial<...>> // TODO, let's fix this later on @@ -160,7 +160,7 @@ struct MeatpackSerial : public SerialBase > { return charCount; } - int readImpl(const uint8_t index) { + int readImpl(const serial_index_t index) { // Not enough char to make progress? if (charCount == 0 && available(index) == 0) return -1; @@ -168,9 +168,9 @@ struct MeatpackSerial : public SerialBase > { return serialBuffer[readIndex++]; } - int read(uint8_t index) { return readImpl(index); } - int available() { return available(0); } - int read() { return readImpl(0); } + int read(serial_index_t index) { return readImpl(index); } + int available() { return available(0); } + int read() { return readImpl(0); } MeatpackSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} }; diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 5f30064b11..4e324e7892 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1067,7 +1067,7 @@ void GcodeSuite::process_subcommands_now(char * gcode) { static millis_t next_busy_signal_ms = 0; if (!autoreport_paused && host_keepalive_interval && busy_state != NOT_BUSY) { if (PENDING(ms, next_busy_signal_ms)) return; - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); switch (busy_state) { case IN_HANDLER: case IN_PROCESS: diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 9982492f93..d6e591add9 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -52,7 +52,7 @@ void GcodeSuite::M118() { while (*p == ' ') ++p; } - PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? SERIAL_PORTMASK(port - 1) : SERIAL_ALL) : multiSerial.portMask); + PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? SERIAL_PORTMASK(port - 1) : SerialMask::All) : multiSerial.portMask); if (hasE) SERIAL_ECHO_START(); if (hasA) SERIAL_ECHOPGM("//"); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 9b69f9f1fc..a764d80eca 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -240,7 +240,7 @@ void GCodeQueue::RingBuffer::ok_to_send() { CommandLine &command = commands[index_r]; #if HAS_MULTI_SERIAL const serial_index_t serial_ind = command.port; - if (serial_ind < 0) return; + if (!serial_ind.valid()) return; // Optimization here, skip processing if it's not going anywhere PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif if (command.skip_ok) return; @@ -264,15 +264,15 @@ void GCodeQueue::RingBuffer::ok_to_send() { */ void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) { #if HAS_MULTI_SERIAL - if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive + if (!serial_ind.valid()) return; // Optimization here, skip if the command came from SD or Flash Drive PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif SERIAL_FLUSH(); SERIAL_ECHOPGM(STR_RESEND); - SERIAL_ECHOLN(serial_state[serial_ind].last_N + 1); + SERIAL_ECHOLN(serial_state[serial_ind.index].last_N + 1); } -inline bool serial_data_available(uint8_t index) { +inline bool serial_data_available(serial_index_t index) { const int a = SERIAL_IMPL.available(index); #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) if (a > RX_BUFFER_SIZE - 2) { @@ -290,15 +290,15 @@ inline bool any_serial_data_available() { return true; } -inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } +inline int read_serial(const serial_index_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR_P(err, serial_state[serial_ind].last_N); + SERIAL_ECHOLNPAIR_P(err, serial_state[serial_ind.index].last_N); while (read_serial(serial_ind) != -1) { /* nada */ } // Clear out the RX buffer. Why don't use flush here ? flush_and_request_resend(serial_ind); - serial_state[serial_ind].count = 0; + serial_state[serial_ind.index].count = 0; } FORCE_INLINE bool is_M29(const char * const cmd) { // matches "M29" & "M29 ", but not "M290", etc diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 4757b8c37e..8e87d114eb 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -79,13 +79,13 @@ public: void commit_command(bool skip_ok #if HAS_MULTI_SERIAL - , serial_index_t serial_ind=-1 + , serial_index_t serial_ind = serial_index_t() #endif ); bool enqueue(const char* cmd, bool skip_ok = true #if HAS_MULTI_SERIAL - , serial_index_t serial_ind=-1 + , serial_index_t serial_ind = serial_index_t() #endif ); @@ -197,7 +197,7 @@ public: /** * (Re)Set the current line number for the last received command */ - static inline void set_current_line_number(long n) { serial_state[ring_buffer.command_port()].last_N = n; } + static inline void set_current_line_number(long n) { serial_state[ring_buffer.command_port().index].last_N = n; } private: diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 1cf700ae26..415fbb6fa7 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -82,7 +82,7 @@ void GcodeSuite::M1001() { // Announce SD file completion { - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); SERIAL_ECHOLNPGM(STR_FILE_PRINTED); } diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 180c895809..93a7de14a1 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -395,21 +395,21 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va default: return; #if HOTENDS >= 1 case VP_T_E0_Set: - NOMORE(newvalue, HEATER_0_MAXTEMP); + NOMORE(newvalue, (uint16_t)HEATER_0_MAXTEMP); thermalManager.setTargetHotend(newvalue, 0); acceptedvalue = thermalManager.degTargetHotend(0); break; #endif #if HOTENDS >= 2 case VP_T_E1_Set: - NOMORE(newvalue, HEATER_1_MAXTEMP); + NOMORE(newvalue, (uint16_t)HEATER_1_MAXTEMP); thermalManager.setTargetHotend(newvalue, 1); acceptedvalue = thermalManager.degTargetHotend(1); break; #endif #if HAS_HEATED_BED case VP_T_Bed_Set: - NOMORE(newvalue, BED_MAXTEMP); + NOMORE(newvalue, (uint16_t)BED_MAXTEMP); thermalManager.setTargetBed(newvalue); acceptedvalue = thermalManager.degTargetBed(); break; diff --git a/Marlin/src/libs/autoreport.h b/Marlin/src/libs/autoreport.h index 232216578f..a6bc5adbf7 100644 --- a/Marlin/src/libs/autoreport.h +++ b/Marlin/src/libs/autoreport.h @@ -28,8 +28,8 @@ struct AutoReporter { millis_t next_report_ms; uint8_t report_interval; #if HAS_MULTI_SERIAL - serial_index_t report_port_mask; - AutoReporter() : report_port_mask(SERIAL_ALL) {} + SerialMask report_port_mask; + AutoReporter() : report_port_mask(SerialMask::All) {} #endif inline void set_interval(uint8_t seconds, const uint8_t limit=60) { diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a1d5745de4..a000a31de7 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -329,7 +329,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, */ void Temperature::report_fan_speed(const uint8_t target) { if (target >= FAN_COUNT) return; - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); SERIAL_ECHOLNPAIR("M106 P", target, " S", fan_speed[target]); } #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index c973ba5945..fac14e72a7 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -549,7 +549,7 @@ void openFailed(const char * const fname) { void announceOpen(const uint8_t doing, const char * const path) { if (doing) { - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); SERIAL_ECHO_START(); SERIAL_ECHOPGM("Now "); SERIAL_ECHOPGM_P(doing == 1 ? PSTR("doing") : PSTR("fresh")); @@ -615,7 +615,7 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* sdpos = 0; { // Don't remove this block, as the PORT_REDIRECT is a RAII - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); SERIAL_ECHOLNPAIR(STR_SD_FILE_OPENED, fname, STR_SD_SIZE, filesize); SERIAL_ECHOLNPGM(STR_SD_FILE_SELECTED); } From 6c704021617d84665930df136e5d70afd855f9d5 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 10 Mar 2021 00:06:00 +0100 Subject: [PATCH 1131/1370] Fix LPC + TMC boot loop (#21298) --- Marlin/src/MarlinCore.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 689650c6ab..bce091da5f 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1053,6 +1053,10 @@ void setup() { #if HAS_FILAMENT_SENSOR SETUP_RUN(runout.setup()); #endif + + #if HAS_TMC220x + SETUP_RUN(tmc_serial_begin()); + #endif #if ENABLED(PSU_CONTROL) SETUP_LOG("PSU_CONTROL"); @@ -1068,10 +1072,6 @@ void setup() { SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers #endif - #if HAS_TMC220x - SETUP_RUN(tmc_serial_begin()); - #endif - #if HAS_STEPPER_RESET SETUP_RUN(disableStepperDrivers()); #endif From 0e1a1959deb6f892e547c7ce5ab5e044ea1db38b Mon Sep 17 00:00:00 2001 From: Victor Mateus Oliveira Date: Tue, 9 Mar 2021 20:21:49 -0300 Subject: [PATCH 1132/1370] fix meat pack internal buffer for multi serial --- Marlin/src/gcode/queue.cpp | 1 + Marlin/src/gcode/sd/M28_M29.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index a764d80eca..0f4169a2c4 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -288,6 +288,7 @@ inline bool any_serial_data_available() { LOOP_L_N(p, NUM_SERIAL) if (serial_data_available(p)) return true; + return false; } inline int read_serial(const serial_index_t index) { return SERIAL_IMPL.read(index); } diff --git a/Marlin/src/gcode/sd/M28_M29.cpp b/Marlin/src/gcode/sd/M28_M29.cpp index f34edb6f7c..373938d99b 100644 --- a/Marlin/src/gcode/sd/M28_M29.cpp +++ b/Marlin/src/gcode/sd/M28_M29.cpp @@ -49,7 +49,7 @@ void GcodeSuite::M28() { // Binary transfer mode if ((card.flag.binary_mode = binary_mode)) { SERIAL_ECHO_MSG("Switching to Binary Protocol"); - TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.ring_buffer.command_port()); + TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.ring_buffer.command_port().index); } else card.openFileWrite(p); From 01f3dc6d41bbcc11441f8bfc6e4d33dddcfdf99a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 11:31:32 -0600 Subject: [PATCH 1133/1370] Add binary file transfer test --- buildroot/tests/mks_robin_nano35 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildroot/tests/mks_robin_nano35 b/buildroot/tests/mks_robin_nano35 index 7ab592aaa3..c54cd36655 100755 --- a/buildroot/tests/mks_robin_nano35 +++ b/buildroot/tests/mks_robin_nano35 @@ -42,7 +42,8 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 -exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3" +opt_enable BINARY_FILE_TRANSFER +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI + BINARY_FILE_TRANSFER" "$3" # # MKS Robin v2 nano LVGL SPI + TMC From e1cca6d97b19b624395ea25f646c219572ceda6a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 11:33:29 -0600 Subject: [PATCH 1134/1370] Fix serial index types --- Marlin/src/feature/binary_stream.h | 4 ++-- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 2 +- Marlin/src/sd/cardreader.h | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index d092b7152f..80f26cc7ce 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -29,11 +29,11 @@ #include "../libs/heatshrink/heatshrink_decoder.h" #endif -inline bool bs_serial_data_available(const uint8_t index) { +inline bool bs_serial_data_available(const serial_index_t index) { return SERIAL_IMPL.available(index); } -inline int bs_read_serial(const uint8_t index) { +inline int bs_read_serial(const serial_index_t index) { return SERIAL_IMPL.read(index); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 0f4169a2c4..4f676eaeb3 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -393,7 +393,7 @@ void GCodeQueue::get_serial_commands() { * receive buffer (which limits the packet size to MAX_CMD_SIZE). * The receive buffer also limits the packet size for reliable transmission. */ - binaryStream[card.transfer_port_index].receive(serial_state[card.transfer_port_index].line_buffer); + binaryStream[card.transfer_port_index.index].receive(serial_state[card.transfer_port_index.index].line_buffer); return; } #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index fac14e72a7..a3e0577031 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -70,7 +70,7 @@ char CardReader::filename[FILENAME_LENGTH], CardReader::longFilename[LONG_FILENA IF_DISABLED(NO_SD_AUTOSTART, uint8_t CardReader::autofile_index); // = 0 #if BOTH(HAS_MULTI_SERIAL, BINARY_FILE_TRANSFER) - int8_t CardReader::transfer_port_index; + serial_index_t CardReader::transfer_port_index; #endif // private: diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 0a89bbba78..f823b79e7a 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -72,9 +72,9 @@ public: // Fast! binary file transfer #if ENABLED(BINARY_FILE_TRANSFER) #if HAS_MULTI_SERIAL - static int8_t transfer_port_index; + static serial_index_t transfer_port_index; #else - static constexpr int8_t transfer_port_index = 0; + static constexpr serial_index_t transfer_port_index = 0; #endif #endif From 46246c8db6b42d48aa1452866e2f326abb21bed7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 11:35:19 -0600 Subject: [PATCH 1135/1370] Clean up spaces and words --- Marlin/src/MarlinCore.cpp | 10 +++++----- Marlin/src/gcode/host/M115.cpp | 2 +- Marlin/src/gcode/queue.cpp | 18 ++++++++++-------- Marlin/src/inc/SanityCheck.h | 3 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 18 +++++++++--------- 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index bce091da5f..e1756af511 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -990,14 +990,14 @@ void setup() { #endif #define SETUP_RUN(C) do{ SETUP_LOG(STRINGIFY(C)); C; }while(0) - MYSERIAL0.begin(BAUDRATE); + MYSERIAL1.begin(BAUDRATE); millis_t serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL0.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #if HAS_MULTI_SERIAL && !HAS_ETHERNET - MYSERIAL1.begin(BAUDRATE); + MYSERIAL2.begin(BAUDRATE); serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + while (!MYSERIAL2.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif SERIAL_ECHOLNPGM("start"); @@ -1053,7 +1053,7 @@ void setup() { #if HAS_FILAMENT_SENSOR SETUP_RUN(runout.setup()); #endif - + #if HAS_TMC220x SETUP_RUN(tmc_serial_begin()); #endif diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 316abc3048..4b7b268688 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -144,7 +144,7 @@ void GcodeSuite::M115() { // COOLER_TEMPERATURE (M143, M193) cap_line(PSTR("COOLER_TEMPERATURE"), ENABLED(HAS_COOLER)); - // MEATPACK Compresson + // MEATPACK Compression cap_line(PSTR("MEATPACK"), ENABLED(MEATPACK)); // Machine Geometry diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 4f676eaeb3..6b48000248 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -272,7 +272,7 @@ void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) { SERIAL_ECHOLN(serial_state[serial_ind.index].last_N + 1); } -inline bool serial_data_available(serial_index_t index) { +static bool serial_data_available(serial_index_t index) { const int a = SERIAL_IMPL.available(index); #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) if (a > RX_BUFFER_SIZE - 2) { @@ -283,13 +283,15 @@ inline bool serial_data_available(serial_index_t index) { return a > 0; } -// Multiserial already handles dispatch to/from multiple ports -inline bool any_serial_data_available() { - LOOP_L_N(p, NUM_SERIAL) - if (serial_data_available(p)) - return true; - return false; -} +#if NO_TIMEOUTS > 0 + // Multiserial already handles dispatch to/from multiple ports + static bool any_serial_data_available() { + LOOP_L_N(p, NUM_SERIAL) + if (serial_data_available(p)) + return true; + return false; + } +#endif inline int read_serial(const serial_index_t index) { return SERIAL_IMPL.read(index); } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index cd9ca84385..8c92cf2c63 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3337,12 +3337,11 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif - /** * Sanity Check for MEATPACK and BINARY_FILE_TRANSFER Features */ #if BOTH(MEATPACK, BINARY_FILE_TRANSFER) - #error "Either enable MEATPACK or enable BINARY_FILE_TRANSFER." + #error "Either enable MEATPACK or BINARY_FILE_TRANSFER, not both." #endif /** diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 99e0f0be2a..b9f1074c7a 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -237,7 +237,7 @@ * This board does not have dedicated TMC UART pins. Custom wiring is needed. * You may uncomment one of the options below, or add it to your Configuration.h. * - * When using up to four TMC2209 drivers, hardware serial is recommented on + * When using up to four TMC2209 drivers, hardware serial is recommended on * MSerial0 or MSerial1. * * When using TMC2208 or more than four drivers, SoftwareSerial will be needed, @@ -246,14 +246,14 @@ //#define TMC_HARDWARE_SERIAL #if ENABLED(TMC_HARDWARE_SERIAL) - #define X_HARDWARE_SERIAL MSerial0 - #define X2_HARDWARE_SERIAL MSerial0 - #define Y_HARDWARE_SERIAL MSerial0 - #define Y2_HARDWARE_SERIAL MSerial0 - #define Z_HARDWARE_SERIAL MSerial0 - #define Z2_HARDWARE_SERIAL MSerial0 - #define E0_HARDWARE_SERIAL MSerial0 - #define E1_HARDWARE_SERIAL MSerial0 + #define X_HARDWARE_SERIAL MSerial0 + #define X2_HARDWARE_SERIAL MSerial0 + #define Y_HARDWARE_SERIAL MSerial0 + #define Y2_HARDWARE_SERIAL MSerial0 + #define Z_HARDWARE_SERIAL MSerial0 + #define Z2_HARDWARE_SERIAL MSerial0 + #define E0_HARDWARE_SERIAL MSerial0 + #define E1_HARDWARE_SERIAL MSerial0 #endif //#define TMC_SOFTWARE_SERIAL From b713ca26387348acb70fdd0c211a3b7bf6cd9886 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 12:05:05 -0600 Subject: [PATCH 1136/1370] Number serial from 1 to match settings --- Marlin/src/HAL/AVR/HAL.cpp | 2 +- Marlin/src/HAL/AVR/HAL.h | 12 +++---- Marlin/src/HAL/AVR/MarlinSerial.h | 10 +++--- Marlin/src/HAL/DUE/HAL.cpp | 8 ++--- Marlin/src/HAL/DUE/HAL.h | 27 +++++++-------- Marlin/src/HAL/DUE/MarlinSerial.h | 4 +-- Marlin/src/HAL/DUE/MarlinSerialUSB.h | 2 +- .../src/HAL/ESP32/FlushableHardwareSerial.cpp | 2 +- .../src/HAL/ESP32/FlushableHardwareSerial.h | 2 +- Marlin/src/HAL/ESP32/HAL.cpp | 2 +- Marlin/src/HAL/ESP32/HAL.h | 10 +++--- Marlin/src/HAL/ESP32/WebSocketSerial.h | 2 +- Marlin/src/HAL/LINUX/HAL.h | 2 +- Marlin/src/HAL/LINUX/include/serial.h | 2 +- Marlin/src/HAL/LINUX/main.cpp | 4 +-- Marlin/src/HAL/LPC1768/HAL.cpp | 2 +- Marlin/src/HAL/LPC1768/HAL.h | 13 ++++--- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 4 +-- Marlin/src/HAL/LPC1768/MarlinSerial.h | 4 +-- Marlin/src/HAL/SAMD51/HAL.cpp | 10 +++--- Marlin/src/HAL/SAMD51/HAL.h | 34 +++++++++---------- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h | 2 +- Marlin/src/HAL/STM32/HAL.cpp | 2 +- Marlin/src/HAL/STM32/HAL.h | 16 ++++----- Marlin/src/HAL/STM32/MarlinSerial.h | 2 +- Marlin/src/HAL/STM32F1/HAL.cpp | 4 +-- Marlin/src/HAL/STM32F1/HAL.h | 14 ++++---- Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp | 6 ++-- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 6 ++-- Marlin/src/HAL/STM32F1/MarlinSerial.h | 2 +- Marlin/src/HAL/STM32F1/msc_sd.cpp | 2 +- Marlin/src/HAL/STM32F1/msc_sd.h | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.h | 11 +++--- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 11 +++--- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY40_41/HAL.h | 17 +++++----- Marlin/src/core/serial.cpp | 6 ++-- Marlin/src/core/serial.h | 8 ++--- Marlin/src/core/serial_hook.h | 6 ++-- Marlin/src/feature/ethernet.cpp | 2 +- Marlin/src/gcode/config/M575.cpp | 4 +-- Marlin/src/gcode/control/M111.cpp | 8 ++--- Marlin/src/gcode/queue.cpp | 4 +-- .../src/lcd/extui/lib/mks_ui/draw_gcode.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 2 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 4 +-- .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/settings.h | 2 +- docs/Serial.md | 4 +-- 51 files changed, 155 insertions(+), 160 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp index 4c45a5d78e..cfa9e47f18 100644 --- a/Marlin/src/HAL/AVR/HAL.cpp +++ b/Marlin/src/HAL/AVR/HAL.cpp @@ -25,7 +25,7 @@ #include "HAL.h" #ifdef USBCON - DefaultSerial MSerial(false, Serial); + DefaultSerial1 MSerial0(false, Serial); #ifdef BLUETOOTH BTSerial btSerial(false, bluetoothSerial); #endif diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 5e22ac0836..f6adf1bd31 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -83,25 +83,25 @@ typedef int8_t pin_t; // Serial ports #ifdef USBCON #include "../../core/serial_hook.h" - typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; - extern DefaultSerial MSerial; + typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1; + extern DefaultSerial1 MSerial0; #ifdef BLUETOOTH - typedef ForwardSerial0Type< decltype(bluetoothSerial) > BTSerial; + typedef ForwardSerial1Class< decltype(bluetoothSerial) > BTSerial; extern BTSerial btSerial; #endif - #define MYSERIAL0 TERN(BLUETOOTH, btSerial, MSerial) + #define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0) #else #if !WITHIN(SERIAL_PORT, -1, 3) #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif - #define MYSERIAL0 customizedSerial1 + #define MYSERIAL1 customizedSerial1 #ifdef SERIAL_PORT_2 #if !WITHIN(SERIAL_PORT_2, -1, 3) #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif - #define MYSERIAL1 customizedSerial2 + #define MYSERIAL2 customizedSerial2 #endif #endif diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 9abc3dbed0..ab49e9440a 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -238,11 +238,11 @@ static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); }; - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT; + typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT; extern MSerialT customizedSerial1; #ifdef SERIAL_PORT_2 - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT2; + typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT2; extern MSerialT2 customizedSerial2; #endif @@ -262,7 +262,7 @@ static constexpr bool RX_OVERRUNS = false; }; - typedef Serial0Type< MarlinSerial< MMU2SerialCfg > > MSerialT3; + typedef Serial1Class< MarlinSerial< MMU2SerialCfg > > MSerialT3; extern MSerialT3 mmuSerial; #endif @@ -292,12 +292,12 @@ }; - typedef Serial0Type< MarlinSerial< LCDSerialCfg > > MSerialT4; + typedef Serial1Class< MarlinSerial< LCDSerialCfg > > MSerialT4; extern MSerialT4 lcdSerial; #endif // Use the UART for Bluetooth in AT90USB configurations #if defined(USBCON) && ENABLED(BLUETOOTH) - typedef Serial0Type MSerialT5; + typedef Serial1Class MSerialT5; extern MSerialT5 bluetoothSerial; #endif diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index 034b86ccb0..0e4caa47ac 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -107,16 +107,16 @@ uint16_t HAL_adc_get_result() { // Forward the default serial ports #if ANY_SERIAL_IS(0) - DefaultSerial MSerial(false, Serial); + DefaultSerial1 MSerial0(false, Serial); #endif #if ANY_SERIAL_IS(1) - DefaultSerial1 MSerial1(false, Serial1); + DefaultSerial2 MSerial1(false, Serial1); #endif #if ANY_SERIAL_IS(2) - DefaultSerial2 MSerial2(false, Serial2); + DefaultSerial3 MSerial2(false, Serial2); #endif #if ANY_SERIAL_IS(3) - DefaultSerial3 MSerial3(false, Serial3); + DefaultSerial4 MSerial3(false, Serial3); #endif #endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index b1c6a38c0f..095538f6a6 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -38,33 +38,32 @@ #include "../../core/serial_hook.h" -typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; -typedef ForwardSerial0Type< decltype(Serial1) > DefaultSerial1; -typedef ForwardSerial0Type< decltype(Serial2) > DefaultSerial2; -typedef ForwardSerial0Type< decltype(Serial3) > DefaultSerial3; -extern DefaultSerial MSerial; -extern DefaultSerial1 MSerial1; -extern DefaultSerial2 MSerial2; -extern DefaultSerial3 MSerial3; +typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1; +typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2; +typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3; +typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4; +extern DefaultSerial1 MSerial0; +extern DefaultSerial2 MSerial1; +extern DefaultSerial3 MSerial2; +extern DefaultSerial4 MSerial3; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial -// Define MYSERIAL0/1 before MarlinSerial includes! +// Define MYSERIAL1/2 before MarlinSerial includes! #if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER) - #define MYSERIAL0 customizedSerial1 + #define MYSERIAL1 customizedSerial1 #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER) - #define MYSERIAL1 customizedSerial2 + #define MYSERIAL2 customizedSerial2 #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h index 7fc21264bb..e74d234b4a 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.h +++ b/Marlin/src/HAL/DUE/MarlinSerial.h @@ -141,11 +141,11 @@ struct MarlinSerialCfg { }; #if SERIAL_PORT >= 0 - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT; + typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT; extern MSerialT customizedSerial1; #endif #if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT2; + typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT2; extern MSerialT2 customizedSerial2; #endif diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h index f9cea29869..4c299dced5 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.h @@ -50,7 +50,7 @@ struct MarlinSerialUSB { FORCE_INLINE int rxMaxEnqueued() { return 0; } #endif }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; #if SERIAL_PORT == -1 extern MSerialT customizedSerial1; diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp index 9e2f4c1d96..145662215a 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp @@ -24,6 +24,6 @@ #include "FlushableHardwareSerial.h" -Serial0Type flushableSerial(false, 0); +Serial1Class flushableSerial(false, 0); #endif diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h index d2762c0efa..012dda8626 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h @@ -31,4 +31,4 @@ public: FlushableHardwareSerial(int uart_nr) : HardwareSerial(uart_nr) {} }; -extern Serial0Type flushableSerial; +extern Serial1Class flushableSerial; diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index ab28595071..365706c3e2 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -41,7 +41,7 @@ #endif #if ENABLED(ESP3D_WIFISUPPORT) - DefaultSerial MSerial(false, Serial2Socket); + DefaultSerial1 MSerial0(false, Serial2Socket); #endif // ------------------------ diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 4d1db571d0..9258f97702 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -51,15 +51,15 @@ extern portMUX_TYPE spinlock; -#define MYSERIAL0 flushableSerial +#define MYSERIAL1 flushableSerial #if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) #if ENABLED(ESP3D_WIFISUPPORT) - typedef ForwardSerial0Type< decltype(Serial2Socket) > DefaultSerial; - extern DefaultSerial MSerial; - #define MYSERIAL1 MSerial + typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1; + extern DefaultSerial1 MSerial0; + #define MYSERIAL2 MSerial0 #else - #define MYSERIAL1 webSocketSerial + #define MYSERIAL2 webSocketSerial #endif #endif diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.h b/Marlin/src/HAL/ESP32/WebSocketSerial.h index c68792c8c1..924d36f15c 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.h +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.h @@ -81,5 +81,5 @@ public: #endif }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; extern MSerialT webSocketSerial; diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index e4f4dd3fc3..f21e3e2c65 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -61,7 +61,7 @@ uint8_t _getc(); #define SHARED_SERVOS HAS_SERVOS extern MSerialT usb_serial; -#define MYSERIAL0 usb_serial +#define MYSERIAL1 usb_serial #define ST7920_DELAY_1 DELAY_NS(600) #define ST7920_DELAY_2 DELAY_NS(750) diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h index 2585be25bf..ebae066c3a 100644 --- a/Marlin/src/HAL/LINUX/include/serial.h +++ b/Marlin/src/HAL/LINUX/include/serial.h @@ -115,4 +115,4 @@ struct HalSerial { volatile bool host_connected; }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp index c409a83e5d..31f6de98ee 100644 --- a/Marlin/src/HAL/LINUX/main.cpp +++ b/Marlin/src/HAL/LINUX/main.cpp @@ -105,8 +105,8 @@ int main() { std::thread write_serial (write_serial_thread); std::thread read_serial (read_serial_thread); - #ifdef MYSERIAL0 - MYSERIAL0.begin(BAUDRATE); + #ifdef MYSERIAL1 + MYSERIAL1.begin(BAUDRATE); SERIAL_ECHOLNPGM("x86_64 Initialized"); SERIAL_FLUSHTX(); #endif diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index 26a2c0e7db..442c41afe7 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -29,7 +29,7 @@ #include "watchdog.h" #endif -DefaultSerial USBSerial(false, UsbSerial); +DefaultSerial1 USBSerial(false, UsbSerial); uint32_t HAL_adc_reading = 0; diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 1dc4fe6ff9..58f9cb71fb 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -60,26 +60,25 @@ extern "C" volatile uint32_t _millis; #define ST7920_DELAY_3 DELAY_NS(750) #endif -typedef ForwardSerial0Type< decltype(UsbSerial) > DefaultSerial; -extern DefaultSerial USBSerial; +typedef ForwardSerial1Class< decltype(UsbSerial) > DefaultSerial1; +extern DefaultSerial1 USBSerial; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 USBSerial + #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 USBSerial + #define MYSERIAL2 USBSerial #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index b0dfc0ae90..be42c7f960 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -26,7 +26,7 @@ #if ANY_SERIAL_IS(0) MarlinSerial _MSerial(LPC_UART0); - MSerialT MSerial(true, _MSerial); + MSerialT MSerial0(true, _MSerial); extern "C" void UART0_IRQHandler() { _MSerial.IRQHandler(); } #endif #if ANY_SERIAL_IS(1) @@ -51,7 +51,7 @@ // Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro) if (false) {} #if ANY_SERIAL_IS(0) - else if (this == &_MSerial) emergency_parser.update(MSerial.emergency_state, c); + else if (this == &_MSerial) emergency_parser.update(MSerial0.emergency_state, c); #endif #if ANY_SERIAL_IS(1) else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c); diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h index 35c9362b9f..489bd8cc6c 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.h +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.h @@ -54,8 +54,8 @@ public: // On LPC176x framework, HardwareSerial does not implement the same interface as Arduino's Serial, so overloads // of 'available' and 'read' method are not used in this multiple inheritance scenario. // Instead, use a ForwardSerial here that adapts the interface. -typedef ForwardSerial0Type MSerialT; -extern MSerialT MSerial; +typedef ForwardSerial1Class MSerialT; +extern MSerialT MSerial0; extern MSerialT MSerial1; extern MSerialT MSerial2; extern MSerialT MSerial3; diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 4a6100b96b..8dd2fefd0a 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -26,19 +26,19 @@ #ifdef ADAFRUIT_GRAND_CENTRAL_M4 #if ANY_SERIAL_IS(-1) - DefaultSerial MSerial(false, Serial); + DefaultSerial1 MSerial0(false, Serial); #endif #if ANY_SERIAL_IS(0) - DefaultSerial1 MSerial1(false, Serial1); + DefaultSerial2 MSerial1(false, Serial1); #endif #if ANY_SERIAL_IS(1) - DefaultSerial2 MSerial2(false, Serial2); + DefaultSerial3 MSerial2(false, Serial2); #endif #if ANY_SERIAL_IS(2) - DefaultSerial3 MSerial3(false, Serial3); + DefaultSerial4 MSerial3(false, Serial3); #endif #if ANY_SERIAL_IS(3) - DefaultSerial4 MSerial4(false, Serial4); + DefaultSerial5 MSerial4(false, Serial4); #endif #endif diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index 7b272af842..de72c476e4 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -32,36 +32,36 @@ #include "MarlinSerial_AGCM4.h" // Serial ports - typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; - typedef ForwardSerial0Type< decltype(Serial1) > DefaultSerial1; - typedef ForwardSerial0Type< decltype(Serial2) > DefaultSerial2; - typedef ForwardSerial0Type< decltype(Serial3) > DefaultSerial3; - typedef ForwardSerial0Type< decltype(Serial4) > DefaultSerial4; - extern DefaultSerial MSerial; - extern DefaultSerial1 MSerial1; - extern DefaultSerial2 MSerial2; - extern DefaultSerial3 MSerial3; - extern DefaultSerial4 MSerial4; + typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1; + typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2; + typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3; + typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4; + typedef ForwardSerial1Class< decltype(Serial4) > DefaultSerial5; + extern DefaultSerial1 MSerial0; + extern DefaultSerial2 MSerial1; + extern DefaultSerial3 MSerial2; + extern DefaultSerial4 MSerial3; + extern DefaultSerial5 MSerial4; - // MYSERIAL0 required before MarlinSerial includes! + // MYSERIAL1 required before MarlinSerial includes! #define __MSERIAL(X) MSerial##X #define _MSERIAL(X) __MSERIAL(X) #define MSERIAL(X) _MSERIAL(INCREMENT(X)) #if SERIAL_PORT == -1 - #define MYSERIAL0 MSerial + #define MYSERIAL1 MSerial0 #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 MSerial + #define MYSERIAL2 MSerial0 #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif @@ -69,7 +69,7 @@ #ifdef MMU2_SERIAL_PORT #if MMU2_SERIAL_PORT == -1 - #define MMU2_SERIAL MSerial + #define MMU2_SERIAL MSerial0 #elif WITHIN(MMU2_SERIAL_PORT, 0, 3) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else @@ -79,7 +79,7 @@ #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL MSerial + #define LCD_SERIAL MSerial0 #elif WITHIN(LCD_SERIAL_PORT, 0, 3) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h index b7293415d1..ac5a379398 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h @@ -22,7 +22,7 @@ #include "../../core/serial_hook.h" -typedef Serial0Type UartT; +typedef Serial1Class UartT; extern UartT Serial2; extern UartT Serial3; diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index d13be1a21a..c66f061d91 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -29,7 +29,7 @@ #include "../shared/Delay.h" #ifdef USBCON - DefaultSerial MSerial(false, SerialUSB); + DefaultSerial1 MSerial0(false, SerialUSB); #endif #if ENABLED(SRAM_EEPROM_EMULATION) diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index be0cc30962..ad3a9963d7 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -40,8 +40,8 @@ #ifdef USBCON #include #include "../../core/serial_hook.h" - typedef ForwardSerial0Type< decltype(SerialUSB) > DefaultSerial; - extern DefaultSerial MSerial; + typedef ForwardSerial1Class< decltype(SerialUSB) > DefaultSerial1; + extern DefaultSerial1 MSerial0; #endif // ------------------------ @@ -51,18 +51,18 @@ #define MSERIAL(X) _MSERIAL(X) #if SERIAL_PORT == -1 - #define MYSERIAL0 MSerial + #define MYSERIAL1 MSerial0 #elif WITHIN(SERIAL_PORT, 1, 6) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 MSerial + #define MYSERIAL2 MSerial0 #elif WITHIN(SERIAL_PORT_2, 1, 6) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be -1 or from 1 to 6. Please update your configuration." #endif @@ -70,7 +70,7 @@ #ifdef MMU2_SERIAL_PORT #if MMU2_SERIAL_PORT == -1 - #define MMU2_SERIAL MSerial + #define MMU2_SERIAL MSerial0 #elif WITHIN(MMU2_SERIAL_PORT, 1, 6) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else @@ -80,7 +80,7 @@ #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL MSerial + #define LCD_SERIAL MSerial0 #elif WITHIN(LCD_SERIAL_PORT, 1, 6) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h index 8cc4f0dd4c..7b0529cfd2 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -42,7 +42,7 @@ protected: usart_rx_callback_t _rx_callback; }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; extern MSerialT MSerial1; extern MSerialT MSerial2; extern MSerialT MSerial3; diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 182d9401c1..40452b5d70 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -84,7 +84,7 @@ #if defined(SERIAL_USB) && !HAS_SD_HOST_DRIVE USBSerial SerialUSB; - DefaultSerial MSerial(true, SerialUSB); + DefaultSerial1 MSerial0(true, SerialUSB); #if ENABLED(EMERGENCY_PARSER) #include "../libmaple/usb/stm32f1/usb_reg_map.h" @@ -107,7 +107,7 @@ len = usb_cdcacm_peek(buf, total); for (uint32 i = 0; i < len; i++) - emergency_parser.update(MSerial.emergency_state, buf[i + total - len]); + emergency_parser.update(MSerial0.emergency_state, buf[i + total - len]); } #endif #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 30bf60b6e8..4656583590 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -61,11 +61,11 @@ #endif #ifdef SERIAL_USB - typedef ForwardSerial0Type< USBSerial > DefaultSerial; - extern DefaultSerial MSerial; + typedef ForwardSerial1Class< USBSerial > DefaultSerial1; + extern DefaultSerial1 MSerial0; #if !HAS_SD_HOST_DRIVE - #define UsbSerial MSerial + #define UsbSerial MSerial0 #else #define UsbSerial MarlinCompositeSerial #endif @@ -81,9 +81,9 @@ #endif #if SERIAL_PORT == -1 - #define MYSERIAL0 UsbSerial + #define MYSERIAL1 UsbSerial #elif WITHIN(SERIAL_PORT, 1, NUM_UARTS) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #elif NUM_UARTS == 5 #error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." #else @@ -92,9 +92,9 @@ #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 UsbSerial + #define MYSERIAL2 UsbSerial #elif WITHIN(SERIAL_PORT_2, 1, NUM_UARTS) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #elif NUM_UARTS == 5 #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration." #else diff --git a/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp b/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp index e6b89f1105..2cb75bb1e9 100644 --- a/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp @@ -44,8 +44,8 @@ static void TXBegin() { #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." #else - // We use MYSERIAL0 here, so we need to figure out how to get the linked register - struct usart_dev* dev = MYSERIAL0.c_dev(); + // We use MYSERIAL1 here, so we need to figure out how to get the linked register + struct usart_dev* dev = MYSERIAL1.c_dev(); // Or use this if removing libmaple // int irq = dev->irq_num; @@ -80,7 +80,7 @@ static void TXBegin() { #define sw_barrier() __asm__ volatile("": : :"memory"); static void TX(char c) { #if WITHIN(SERIAL_PORT, 1, 6) - struct usart_dev* dev = MYSERIAL0.c_dev(); + struct usart_dev* dev = MYSERIAL1.c_dev(); while (!(dev->regs->SR & USART_SR_TXE)) { TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); sw_barrier(); diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index c404e81b35..a46e3ab3ab 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -134,12 +134,12 @@ constexpr bool IsSerialClassAllowed(const HardwareSerial&) { return false; } // If you encounter this error, replace SerialX with MSerialX, for example MSerial3. // Non-TMC ports were already validated in HAL.h, so do not require verbose error messages. -#ifdef MYSERIAL0 - CHECK_CFG_SERIAL(MYSERIAL0); -#endif #ifdef MYSERIAL1 CHECK_CFG_SERIAL(MYSERIAL1); #endif +#ifdef MYSERIAL2 + CHECK_CFG_SERIAL(MYSERIAL2); +#endif #ifdef LCD_SERIAL CHECK_CFG_SERIAL(LCD_SERIAL); #endif diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index 692e97e618..dda32fe7a2 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -47,7 +47,7 @@ struct MarlinSerial : public HardwareSerial { #endif }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; extern MSerialT MSerial1; extern MSerialT MSerial2; diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index 1e2fe88174..7725b2c324 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -24,7 +24,7 @@ #define PRODUCT_ID 0x29 USBMassStorage MarlinMSC; -Serial0Type MarlinCompositeSerial(true); +Serial1Class MarlinCompositeSerial(true); #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h index 151287f7a7..f4636bdff7 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.h +++ b/Marlin/src/HAL/STM32F1/msc_sd.h @@ -21,6 +21,6 @@ #include "../../core/serial_hook.h" extern USBMassStorage MarlinMSC; -extern Serial0Type MarlinCompositeSerial; +extern Serial1Class MarlinCompositeSerial; void MSC_SD_init(); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index 51636d29bf..8a13f1d884 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -31,7 +31,7 @@ #include -DefaultSerial MSerial(false); +DefaultSerial1 MSerial0(false); USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result; diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 5273b38637..cd1c334899 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -51,19 +51,18 @@ #endif #include "../../core/serial_hook.h" -typedef Serial0Type DefaultSerial; -extern DefaultSerial MSerial; -typedef ForwardSerial0Type USBSerialType; +typedef Serial1Class DefaultSerial1; +extern DefaultSerial1 MSerial0; +typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 USBSerial + #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #endif #define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index 547681de5f..fe2f79f415 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -31,7 +31,7 @@ #include -DefaultSerial MSerial(false); +DefaultSerial1 MSerial0(false); USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result, HAL_adc_select; diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 94c514bf62..48fee6b9a9 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -54,19 +54,18 @@ #endif #include "../../core/serial_hook.h" -typedef Serial0Type DefaultSerial; -extern DefaultSerial MSerial; -typedef ForwardSerial0Type USBSerialType; +typedef Serial1Class DefaultSerial1; +extern DefaultSerial1 MSerial0; +typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 USBSerial + #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #endif #define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index 26449d7eb2..0fde9da537 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -32,7 +32,7 @@ #include -DefaultSerial MSerial(false); +DefaultSerial1 MSerial0(false); USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result, HAL_adc_select; diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 6aa1e521a4..03a12e1b92 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -56,30 +56,29 @@ #endif #include "../../core/serial_hook.h" -typedef Serial0Type DefaultSerial; -extern DefaultSerial MSerial; -typedef ForwardSerial0Type USBSerialType; +typedef Serial1Class DefaultSerial1; +extern DefaultSerial1 MSerial0; +typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB + #define MYSERIAL1 SerialUSB #elif WITHIN(SERIAL_PORT, 0, 8) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 usbSerial + #define MYSERIAL2 usbSerial #elif SERIAL_PORT_2 == -2 - #define MYSERIAL1 ethernet.telnetClient + #define MYSERIAL2 ethernet.telnetClient #elif WITHIN(SERIAL_PORT_2, 0, 8) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -2 to 8. Please update your configuration." #endif diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 01f850ba56..326baf0c54 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -43,12 +43,12 @@ PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMST #else #if HAS_ETHERNET // Runtime checking of the condition variable - ConditionalSerial serialOut1(ethernet.have_telnet_client, MYSERIAL1, false); // Takes reference here + ConditionalSerial serialOut2(ethernet.have_telnet_client, MYSERIAL2, false); // Takes reference here #else // Don't pay for runtime checking a true variable, instead use the output directly - #define serialOut1 MYSERIAL1 + #define serialOut2 MYSERIAL2 #endif - SerialOutputT multiSerial(MYSERIAL0, serialOut1); + SerialOutputT multiSerial(MYSERIAL1, serialOut2); #endif #endif diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 57e9636be0..87c2a390db 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -69,15 +69,15 @@ extern uint8_t marlin_debug_flags; #ifdef SERIAL_CATCHALL typedef MultiSerial SerialOutputT; #else - typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; + typedef MultiSerial, decltype(MYSERIAL2)), 0> SerialOutputT; #endif - extern SerialOutputT multiSerial; - #define _SERIAL_IMPL multiSerial + extern SerialOutputT multiSerial; + #define _SERIAL_IMPL multiSerial #else #define _PORT_REDIRECT(n,p) NOOP #define _PORT_RESTORE(n) NOOP #define SERIAL_ASSERT(P) NOOP - #define _SERIAL_IMPL MYSERIAL0 + #define _SERIAL_IMPL MYSERIAL1 #endif #if ENABLED(MEATPACK) diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index 5e81e9e0e4..c687891fb4 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -257,8 +257,8 @@ struct MultiSerial : public SerialBase< MultiSerial, ConditionalSerial > Serial0Type; +typedef MultiSerial< RuntimeSerial, ConditionalSerial > Serial1Class; ``` To send the same output to 4 serial ports you could nest `MultiSerial` like this: ```cpp -typedef MultiSerial< MultiSerial< BaseSerial, BaseSerial >, MultiSerial< BaseSerial, BaseSerial, 2, 1>, 0, 2> Serial0Type; +typedef MultiSerial< MultiSerial< BaseSerial, BaseSerial >, MultiSerial< BaseSerial, BaseSerial, 2, 1>, 0, 2> Serial1Class; ``` The magical numbers here are the step and offset for computing the serial port. Simplifying the above monster a bit: ```cpp From 633491833cf3df2ea2ecd9545bb33172e93ca12e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 12:05:27 -0600 Subject: [PATCH 1137/1370] Update MEATPACK test --- buildroot/tests/FYSETC_S6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/tests/FYSETC_S6 b/buildroot/tests/FYSETC_S6 index ce5442c376..4794e11354 100755 --- a/buildroot/tests/FYSETC_S6 +++ b/buildroot/tests/FYSETC_S6 @@ -9,7 +9,7 @@ set -e # Build examples restore_configs use_example_configs FYSETC/S6 -opt_enable MEATPACK +opt_enable MEATPACK_ON_SERIAL_PORT_1 opt_set Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2130 exec_test $1 $2 "FYSETC S6 Example" "$3" From 5c0f90994908746ba92f67f6e2aa67f261c04028 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 12:35:26 -0600 Subject: [PATCH 1138/1370] Tricked-out declaration --- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 7 ++++++- Marlin/src/HAL/TEENSY35_36/HAL.h | 10 ++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index fe2f79f415..8640bdfe00 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -31,7 +31,12 @@ #include -DefaultSerial1 MSerial0(false); +#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false) +#define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) +#if WITHIN(SERIAL_PORT, 0, 3) + IMPLEMENT_SERIAL(SERIAL_PORT); +#endif + USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result, HAL_adc_select; diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 48fee6b9a9..e769454b3f 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -54,8 +54,13 @@ #endif #include "../../core/serial_hook.h" -typedef Serial1Class DefaultSerial1; -extern DefaultSerial1 MSerial0; + +#define Serial0 Serial +#define _DECLARE_SERIAL(X) \ + typedef Serial1Class DefaultSerial##X; \ + extern DefaultSerial##X MSerial##X +#define DECLARE_SERIAL(X) _DECLARE_SERIAL(X) + typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; @@ -66,6 +71,7 @@ extern USBSerialType USBSerial; #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL1 MSERIAL(SERIAL_PORT) + DECLARE_SERIAL(SERIAL_PORT); #endif #define HAL_SERVO_LIB libServo From 242ef2b2b4f02740e95cb518c0d084e1c2bcce7e Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Wed, 10 Mar 2021 21:22:20 +0100 Subject: [PATCH 1139/1370] Fix MeatPack with per-serial-port instances (#21306) --- Marlin/Configuration_adv.h | 4 ++- Marlin/src/core/serial.cpp | 29 ++++++++-------- Marlin/src/core/serial.h | 56 +++++++++++++++++++++++------- Marlin/src/feature/meatpack.cpp | 12 ++----- Marlin/src/feature/meatpack.h | 39 ++++++++++----------- Marlin/src/gcode/host/M115.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 4 +++ Marlin/src/inc/SanityCheck.h | 6 ++-- platformio.ini | 2 +- 9 files changed, 90 insertions(+), 64 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 868b0c239a..9ab3e2d044 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3373,7 +3373,9 @@ //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters #endif -//#define MEATPACK // Support for MeatPack G-code compression (https://github.com/scottmudge/OctoPrint-MeatPack) +// Support for MeatPack G-code compression (https://github.com/scottmudge/OctoPrint-MeatPack) +//#define MEATPACK_ON_SERIAL_PORT_1 +//#define MEATPACK_ON_SERIAL_PORT_2 //#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 326baf0c54..dcbfd608bf 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -37,23 +37,22 @@ PGMSTR(SP_A_STR, " A"); PGMSTR(SP_B_STR, " B"); PGMSTR(SP_C_STR, " C"); PGMSTR(SP_X_STR, " X"); PGMSTR(SP_Y_STR, " Y"); PGMSTR(SP_Z_STR, " Z"); PGMSTR(SP_E_STR, " E"); PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMSTR(SP_E_LBL, " E:"); -#if HAS_MULTI_SERIAL - #ifdef SERIAL_CATCHALL - SerialOutputT multiSerial(MYSERIAL, SERIAL_CATCHALL); - #else - #if HAS_ETHERNET - // Runtime checking of the condition variable - ConditionalSerial serialOut2(ethernet.have_telnet_client, MYSERIAL2, false); // Takes reference here - #else - // Don't pay for runtime checking a true variable, instead use the output directly - #define serialOut2 MYSERIAL2 - #endif - SerialOutputT multiSerial(MYSERIAL1, serialOut2); - #endif +// Hook Meatpack if it's enabled on the first leaf +#if ENABLED(MEATPACK_ON_SERIAL_PORT_1) + SerialLeafT1 mpSerial1(false, _SERIAL_LEAF_1); +#endif +#if ENABLED(MEATPACK_ON_SERIAL_PORT_2) + SerialLeafT2 mpSerial2(false, _SERIAL_LEAF_2); #endif -#if ENABLED(MEATPACK) - MeatpackSerial mpSerial(false, _SERIAL_IMPL); +// Step 2: For multiserial, handle the second serial port as well +#if HAS_MULTI_SERIAL + #if HAS_ETHERNET + // We need a definition here + SerialLeafT2 msSerial2(ethernet.have_telnet_client, MYSERIAL2, false); + #endif + + SerialOutputT multiSerial(SERIAL_LEAF_1, SERIAL_LEAF_2); #endif void serialprintPGM(PGM_P str) { diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 87c2a390db..2f23e4e3c2 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -24,7 +24,7 @@ #include "../inc/MarlinConfig.h" #include "serial_hook.h" -#if ENABLED(MEATPACK) +#if HAS_MEATPACK #include "../feature/meatpack.h" #endif @@ -62,29 +62,59 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // +// Step 1: Find what's the first serial leaf +#if BOTH(HAS_MULTI_SERIAL, SERIAL_CATCHALL) + #define _SERIAL_LEAF_1 MYSERIAL +#else + #define _SERIAL_LEAF_1 MYSERIAL1 +#endif + +// Hook Meatpack if it's enabled on the first leaf +#if ENABLED(MEATPACK_ON_SERIAL_PORT_1) + typedef MeatpackSerial SerialLeafT1; + extern SerialLeafT1 mpSerial1; + #define SERIAL_LEAF_1 mpSerial1 +#else + #define SERIAL_LEAF_1 _SERIAL_LEAF_1 +#endif + +// Step 2: For multiserial, handle the second serial port as well #if HAS_MULTI_SERIAL #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) #define _PORT_RESTORE(n,p) RESTORE(n) #define SERIAL_ASSERT(P) if(multiSerial.portMask!=(P)){ debugger(); } + // If we have a catchall, use that directly #ifdef SERIAL_CATCHALL - typedef MultiSerial SerialOutputT; + #define _SERIAL_LEAF_2 SERIAL_CATCHALL #else - typedef MultiSerial, decltype(MYSERIAL2)), 0> SerialOutputT; + #if HAS_ETHERNET + // We need to create an instance here + typedef ConditionalSerial SerialLeafT2; + extern SerialLeafT2 msSerial2; + #define _SERIAL_LEAF_2 msSerial2 + #else + // Don't create a useless instance here, directly use the existing instance + #define _SERIAL_LEAF_2 MYSERIAL2 + #endif #endif - extern SerialOutputT multiSerial; - #define _SERIAL_IMPL multiSerial + + // Hook Meatpack if it's enabled on the second leaf + #if ENABLED(MEATPACK_ON_SERIAL_PORT_2) + typedef MeatpackSerial SerialLeafT2; + extern SerialLeafT2 mpSerial2; + #define SERIAL_LEAF_2 mpSerial2 + #else + #define SERIAL_LEAF_2 _SERIAL_LEAF_2 + #endif + + typedef MultiSerial SerialOutputT; + extern SerialOutputT multiSerial; + #define SERIAL_IMPL multiSerial #else #define _PORT_REDIRECT(n,p) NOOP #define _PORT_RESTORE(n) NOOP #define SERIAL_ASSERT(P) NOOP - #define _SERIAL_IMPL MYSERIAL1 -#endif - -#if ENABLED(MEATPACK) - extern MeatpackSerial mpSerial; - #define SERIAL_IMPL mpSerial -#else - #define SERIAL_IMPL _SERIAL_IMPL + #define SERIAL_IMPL SERIAL_LEAF_1 #endif #define SERIAL_OUT(WHAT, V...) (void)SERIAL_IMPL.WHAT(V) diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 7e81dbed79..178831c9bb 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -39,7 +39,7 @@ #include "../inc/MarlinConfig.h" -#if ENABLED(MEATPACK) +#if HAS_MEATPACK #include "meatpack.h" MeatPack meatpack; @@ -50,14 +50,6 @@ MeatPack meatpack; #define DEBUG_OUT ENABLED(MP_DEBUG) #include "../core/debug_out.h" -bool MeatPack::cmd_is_next = false; // A command is pending -uint8_t MeatPack::state = 0; // Configuration state OFF -uint8_t MeatPack::second_char = 0; // The unpacked 2nd character from an out-of-sequence packed pair -uint8_t MeatPack::cmd_count = 0, // Counts how many command bytes are received (need 2) - MeatPack::full_char_count = 0, // Counts how many full-width characters are to be received - MeatPack::char_out_count = 0; // Stores number of characters to be read out. -uint8_t MeatPack::char_out_buf[2]; // Output buffer for caching up to 2 characters - // The 15 most-common characters used in G-code, ~90-95% of all G-code uses these characters // Stored in SRAM for performance. uint8_t meatPackLookupTable[16] = { @@ -223,4 +215,4 @@ uint8_t MeatPack::get_result_char(char* const __restrict out) { return res; } -#endif // MEATPACK +#endif // HAS_MEATPACK diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h index 96004cfeaf..80f4570e03 100644 --- a/Marlin/src/feature/meatpack.h +++ b/Marlin/src/feature/meatpack.h @@ -90,18 +90,18 @@ class MeatPack { static const uint8_t kSpaceCharIdx = 11; static const char kSpaceCharReplace = 'E'; - static bool cmd_is_next; // A command is pending - static uint8_t state; // Configuration state - static uint8_t second_char; // Buffers a character if dealing with out-of-sequence pairs - static uint8_t cmd_count, // Counter of command bytes received (need 2) - full_char_count, // Counter for full-width characters to be received - char_out_count; // Stores number of characters to be read out. - static uint8_t char_out_buf[2]; // Output buffer for caching up to 2 characters + bool cmd_is_next; // A command is pending + uint8_t state; // Configuration state + uint8_t second_char; // Buffers a character if dealing with out-of-sequence pairs + uint8_t cmd_count, // Counter of command bytes received (need 2) + full_char_count, // Counter for full-width characters to be received + char_out_count; // Stores number of characters to be read out. + uint8_t char_out_buf[2]; // Output buffer for caching up to 2 characters public: // Pass in a character rx'd by SD card or serial. Automatically parses command/ctrl sequences, // and will control state internally. - static void handle_rx_char(const uint8_t c, const serial_index_t serial_ind); + void handle_rx_char(const uint8_t c, const serial_index_t serial_ind); /** * After passing in rx'd char using above method, call this to get characters out. @@ -109,24 +109,25 @@ public: * @param out [in] Output pointer for unpacked/processed data. * @return Number of characters returned. Range from 0 to 2. */ - static uint8_t get_result_char(char* const __restrict out); + uint8_t get_result_char(char* const __restrict out); - static void reset_state(); - static void report_state(); - static uint8_t unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out); - static void handle_command(const MeatPack_Command c); - static void handle_output_char(const uint8_t c); - static void handle_rx_char_inner(const uint8_t c); + void reset_state(); + void report_state(); + uint8_t unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out); + void handle_command(const MeatPack_Command c); + void handle_output_char(const uint8_t c); + void handle_rx_char_inner(const uint8_t c); + + MeatPack() : cmd_is_next(false), state(0), second_char(0), cmd_count(0), full_char_count(0), char_out_count(0) {} }; -extern MeatPack meatpack; - // Implement the MeatPack serial class so it's transparent to rest of the code template struct MeatpackSerial : public SerialBase > { typedef SerialBase< MeatpackSerial > BaseClassT; SerialT & out; + MeatPack meatpack; char serialBuffer[2]; uint8_t charCount; @@ -143,10 +144,6 @@ struct MeatpackSerial : public SerialBase > { void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } int available(serial_index_t index) { - // There is a potential issue here with multiserial, since it'll return its decoded buffer whatever the serial index here. - // So, instead of doing MeatpackSerial> we should do MultiSerial, MeatpackSerial<...>> - // TODO, let's fix this later on - if (charCount) return charCount; // The buffer still has data if (out.available(index) <= 0) return 0; // No data to read diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 4b7b268688..cd6fcbaf86 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -145,7 +145,7 @@ void GcodeSuite::M115() { cap_line(PSTR("COOLER_TEMPERATURE"), ENABLED(HAS_COOLER)); // MEATPACK Compression - cap_line(PSTR("MEATPACK"), ENABLED(MEATPACK)); + cap_line(PSTR("MEATPACK"), ENABLED(HAS_MEATPACK)); // Machine Geometry #if ENABLED(M115_GEOMETRY_REPORT) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index e8ed0d5a91..7dc75db1c2 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2912,3 +2912,7 @@ #elif NUM_SERIAL > 1 #define HAS_MULTI_SERIAL 1 #endif + +#if ENABLED(MEATPACK_ON_SERIAL_PORT_1) || BOTH(HAS_MULTI_SERIAL, MEATPACK_ON_SERIAL_PORT_2) + #define HAS_MEATPACK 1 +#endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 8c92cf2c63..6802bff1dd 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -551,6 +551,8 @@ #error "UNKNOWN_Z_NO_RAISE is replaced by setting Z_IDLE_HEIGHT to Z_MAX_POS." #elif defined(Z_AFTER_DEACTIVATE) #error "Z_AFTER_DEACTIVATE is replaced by Z_IDLE_HEIGHT." +#elif defined(MEATPACK) + #error "MEATPACK is now enabled with MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2, etc." #endif /** @@ -3340,8 +3342,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) /** * Sanity Check for MEATPACK and BINARY_FILE_TRANSFER Features */ -#if BOTH(MEATPACK, BINARY_FILE_TRANSFER) - #error "Either enable MEATPACK or BINARY_FILE_TRANSFER, not both." +#if BOTH(HAS_MEATPACK, BINARY_FILE_TRANSFER) + #error "Either enable MEATPACK_ON_SERIAL_PORT_* or BINARY_FILE_TRANSFER, not both." #endif /** diff --git a/platformio.ini b/platformio.ini index b8235c84fd..3b1604a296 100644 --- a/platformio.ini +++ b/platformio.ini @@ -332,7 +332,7 @@ PCA9632 = src_filter=+ PRINTER_EVENT_LEDS = src_filter=+ TEMP_STAT_LEDS = src_filter=+ MAX7219_DEBUG = src_filter=+ + -MEATPACK = src_filter=+ +HAS_MEATPACK = src_filter=+ MIXING_EXTRUDER = src_filter=+ + HAS_PRUSA_MMU1 = src_filter=+ HAS_PRUSA_MMU2 = src_filter=+ + From f332cca4a78cf045f3795e28e586597f5039782d Mon Sep 17 00:00:00 2001 From: Cal1sto <47449942+Cal1sto@users.noreply.github.com> Date: Wed, 10 Mar 2021 21:37:22 +0100 Subject: [PATCH 1140/1370] Fix TouchMI stow in G34 (#21291) --- Marlin/src/gcode/calibrate/G34_M422.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 50476e8e7c..bee6aaedeb 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -410,9 +410,9 @@ void GcodeSuite::G34() { SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); } - // Stow the probe, as the last call to probe.probe_at_point(...) left - // the probe deployed if it was successful. - probe.stow(); + // Stow the probe because the last call to probe.probe_at_point(...) + // leaves the probe deployed when it's successful. + IF_DISABLED(TOUCH_MI_PROBE, probe.stow()); #if ENABLED(HOME_AFTER_G34) // After this operation the z position needs correction From a729999f559c65f9e56941c48cc141df846b493a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 10 Mar 2021 12:57:54 -0800 Subject: [PATCH 1141/1370] Fix LERDGE 'extends' env references (#21305) Co-authored-by: Scott Lahteine --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 3b1604a296..11dcecfc99 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1401,7 +1401,7 @@ board_build.firmware = Lerdge_X_firmware_force.bin # [env:LERDGEX_usb_flash_drive] platform = ${env:LERDGEX.platform} -extends = LERDGEX +extends = env:LERDGEX platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1418,7 +1418,7 @@ board_build.firmware = Lerdge_firmware_force.bin # [env:LERDGES_usb_flash_drive] platform = ${env:LERDGES.platform} -extends = LERDGES +extends = env:LERDGES platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1437,7 +1437,7 @@ build_flags = ${lerdge_common.build_flags} # [env:LERDGEK_usb_flash_drive] platform = ${env:LERDGEK.platform} -extends = LERDGEK +extends = env:LERDGEK platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} From 059e6514cac69cb7a33b6fe71fc8f0130cff5e9d Mon Sep 17 00:00:00 2001 From: Evgeny Z Date: Thu, 11 Mar 2021 00:02:29 +0300 Subject: [PATCH 1142/1370] Lerdge-K TMC 2208/9 UART pins (#21299) --- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 44 +++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index fad8d2059e..1bc7bbc99e 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -96,6 +96,50 @@ // #define E1_CS_PIN PE4 //#endif +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + */ + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN PB2 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN PB2 + #endif + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN PE2 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN PE2 + #endif + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN PE3 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN PE3 + #endif + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN PE4 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN PE4 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN PE1 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN PE1 + #endif + #ifndef EX_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN PE0 + #endif + #ifndef EX_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN PE0 + #endif + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + // // Temperature Sensors // From 894688c547c5a7f880bca628dfe235967134e230 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 11 Mar 2021 11:02:35 +1300 Subject: [PATCH 1143/1370] Fix password menu stickiness before first auth (#21295) --- Marlin/src/feature/password/password.cpp | 11 +++++++---- Marlin/src/feature/password/password.h | 4 ++-- Marlin/src/lcd/menu/menu_password.cpp | 13 +++++++++---- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Marlin/src/feature/password/password.cpp b/Marlin/src/feature/password/password.cpp index 90bb647118..4e841c243c 100644 --- a/Marlin/src/feature/password/password.cpp +++ b/Marlin/src/feature/password/password.cpp @@ -31,7 +31,7 @@ Password password; // public: -bool Password::is_set, Password::is_locked; +bool Password::is_set, Password::is_locked, Password::did_first_run; // = false uint32_t Password::value, Password::value_entry; // @@ -47,11 +47,14 @@ void Password::lock_machine() { // Authentication check // void Password::authentication_check() { - if (value_entry == value) + if (value_entry == value) { is_locked = false; - else + did_first_run = true; + } + else { + is_locked = true; SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); - + } TERN_(HAS_LCD_MENU, authentication_done()); } diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h index 1382d6df40..829d222e20 100644 --- a/Marlin/src/feature/password/password.h +++ b/Marlin/src/feature/password/password.h @@ -25,10 +25,10 @@ class Password { public: - static bool is_set, is_locked; + static bool is_set, is_locked, did_first_run; static uint32_t value, value_entry; - Password() { is_locked = false; } + Password() {} static void lock_machine(); static void authentication_check(); diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp index 80c5c3dc66..590ce48d59 100644 --- a/Marlin/src/lcd/menu/menu_password.cpp +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -44,12 +44,18 @@ static uint8_t digit_no; // Screen for both editing and setting the password // void Password::menu_password_entry() { + ui.defer_status_screen(!did_first_run); // No timeout to status before first auth + START_MENU(); // "Login" or "New Code" STATIC_ITEM_P(authenticating ? GET_TEXT(MSG_LOGIN_REQUIRED) : GET_TEXT(MSG_EDIT_PASSWORD), SS_CENTER|SS_INVERT); - STATIC_ITEM_P(NUL_STR, SS_CENTER|SS_INVERT, string); + STATIC_ITEM_P(NUL_STR, SS_CENTER, string); + + #if HAS_MARLINUI_U8GLIB + STATIC_ITEM_P(NUL_STR, SS_CENTER, ""); + #endif // Make the digit edit item look like a sub-menu PGM_P const label = GET_TEXT(MSG_ENTER_DIGIT); @@ -57,7 +63,7 @@ void Password::menu_password_entry() { MENU_ITEM_ADDON_START(utf8_strlen_P(label) + 1); lcd_put_wchar(' '); lcd_put_wchar('1' + digit_no); - SETCURSOR_X(LCD_WIDTH - 1); + SETCURSOR_X(LCD_WIDTH - 2); lcd_put_wchar('>'); MENU_ITEM_ADDON_END(); @@ -104,7 +110,7 @@ void Password::screen_password_entry() { value_entry = 0; digit_no = 0; editable.uint8 = 0; - memset(string, '-', PASSWORD_LENGTH); + memset(string, '_', PASSWORD_LENGTH); string[PASSWORD_LENGTH] = '\0'; menu_password_entry(); } @@ -120,7 +126,6 @@ void Password::authenticate_user(const screenFunc_t in_succ_scr, const screenFun if (is_set) { authenticating = true; ui.goto_screen(screen_password_entry); - ui.defer_status_screen(); ui.update(); } else { From d81838e9fa5669984c4364a90680da1b49649d11 Mon Sep 17 00:00:00 2001 From: Evgeny Z Date: Fri, 12 Mar 2021 05:12:24 +0300 Subject: [PATCH 1144/1370] =?UTF-8?q?Lerdge-X=20I=C2=B2C=20EEPROM=20pins,?= =?UTF-8?q?=20size=20(#21322)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 974392373f..3a9c286e00 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -32,6 +32,9 @@ #define TEMP_TIMER 2 #define I2C_EEPROM +#define I2C_SCL_PIN PB8 +#define I2C_SDA_PIN PB9 +#define MARLIN_EEPROM_SIZE 0x10000 // FM24CL64 F-RAM 64K (8Kx8) // USB Flash Drive support #define HAS_OTG_USB_HOST_SUPPORT From 59a9be5f5a3a4818943e12100fe352faffa31ac7 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Fri, 12 Mar 2021 12:25:30 +0100 Subject: [PATCH 1145/1370] Undef unused 2nd serial option(s) (#21331) Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_post.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 7dc75db1c2..a6567e9714 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2913,6 +2913,9 @@ #define HAS_MULTI_SERIAL 1 #endif -#if ENABLED(MEATPACK_ON_SERIAL_PORT_1) || BOTH(HAS_MULTI_SERIAL, MEATPACK_ON_SERIAL_PORT_2) +#if !HAS_MULTI_SERIAL + #undef MEATPACK_ON_SERIAL_PORT_2 +#endif +#if EITHER(MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2) #define HAS_MEATPACK 1 #endif From ead6d99069bdc533468ebd8a75043ee3e02f8ce3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 06:54:42 -0600 Subject: [PATCH 1146/1370] Clean up, optimize ExtUI/TFT code (#21333) --- Marlin/src/feature/bedlevel/bedlevel.cpp | 2 +- Marlin/src/feature/bedlevel/bedlevel.h | 2 +- Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 8 +- Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp | 6 +- Marlin/src/lcd/extui/dgus_lcd.cpp | 10 +- Marlin/src/lcd/extui/example.cpp | 8 +- .../lib/anycubic_chiron/FileNavigator.cpp | 2 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 5 +- .../extui/lib/anycubic_chiron/chiron_tft.h | 67 ++--- .../lib/anycubic_chiron/chiron_tft_defs.h | 4 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 232 +++++++++--------- .../lib/anycubic_i3mega/anycubic_i3mega_lcd.h | 78 +++--- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- .../screens/bed_mesh_screen.h | 2 +- .../screens/stress_test_screen.cpp | 4 +- .../screens/temperature_screen.cpp | 7 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 135 +++++----- Marlin/src/lcd/extui/ui_api.h | 73 +++--- Marlin/src/sd/cardreader.h | 2 - 20 files changed, 319 insertions(+), 332 deletions(-) diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 2ad4ffecaf..3680fbac05 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -98,7 +98,7 @@ TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved( #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float zfh, const bool do_report/*=true*/) { + void set_z_fade_height(const float &zfh, const bool do_report/*=true*/) { if (planner.z_fade_height == zfh) return; diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index a33f08ad0e..3e89a08802 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -38,7 +38,7 @@ void set_bed_leveling_enabled(const bool enable=true); void reset_bed_level(); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float zfh, const bool do_report=true); + void set_z_fade_height(const float &zfh, const bool do_report=true); #endif #if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index 06baa4c19d..a424327b08 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -74,7 +74,7 @@ namespace ExtUI { // into buff. // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } @@ -84,7 +84,7 @@ namespace ExtUI { // from buff // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } @@ -101,12 +101,12 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { // Called when any mesh points are updated //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { // Called to indicate a special condition //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " state:", state); } diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp index e2bd96068c..939199db93 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp @@ -65,7 +65,7 @@ namespace ExtUI { // into buff. // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } @@ -75,7 +75,7 @@ namespace ExtUI { // from buff // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } @@ -93,7 +93,7 @@ namespace ExtUI { void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { // Called when any mesh points are updated } #endif diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index 9e6ca1b64c..273a8d2d2a 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -61,7 +61,7 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { if (msg) { ScreenHandler.sendinfoscreen(PSTR("Please confirm."), nullptr, msg, nullptr, true, true, false, true); - ScreenHandler.SetupConfirmAction(ExtUI::setUserConfirmed); + ScreenHandler.SetupConfirmAction(setUserConfirmed); ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); } else if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_POPUP ) { @@ -84,7 +84,7 @@ namespace ExtUI { // into buff. // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } @@ -94,7 +94,7 @@ namespace ExtUI { // from buff // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } @@ -111,11 +111,11 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { // Called when any mesh points are updated } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { // Called to indicate a special condition } #endif diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp index dd4b3312eb..415d381dd6 100644 --- a/Marlin/src/lcd/extui/example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -70,7 +70,7 @@ namespace ExtUI { // into buff. // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } @@ -80,7 +80,7 @@ namespace ExtUI { // from buff // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } @@ -97,11 +97,11 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { // Called when any mesh points are updated } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { // Called to indicate a special condition } #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp index 7d813a6ab0..25847ae96c 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -73,7 +73,7 @@ namespace Anycubic { // Each time we change folder we reset the file index to 0 and keep track // of the current position as the TFT panel isnt aware of folders trees. if (index > 0) { - --currentindex; // go back a file to take account off the .. we added to the root. + --currentindex; // go back a file to take account of the .. added to the root. if (index > lastindex) currentindex += files; else diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 97149a407e..aa78fcb539 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -288,7 +288,7 @@ namespace Anycubic { SERIAL_ECHOLNPGM("Select SD file then press resume"); } - void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEN string to the panel + void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEM string to the panel #if ACDEBUG(AC_SOME) SERIAL_ECHOPGM_P(str); #endif @@ -880,6 +880,7 @@ namespace Anycubic { } break; } } -} // namespace + +} // Anycubic #endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h index 267f2fe978..e7bbd3cbbf 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h @@ -32,46 +32,49 @@ #include "chiron_tft_defs.h" #include "../../../../inc/MarlinConfigPre.h" #include "../../ui_api.h" + namespace Anycubic { class ChironTFT { - static printer_state_t printer_state; - static paused_state_t pause_state; - static heater_state_t hotend_state; - static heater_state_t hotbed_state; - static xy_uint8_t selectedmeshpoint; - static char panel_command[MAX_CMND_LEN]; - static uint8_t command_len; - static char selectedfile[MAX_PATH_LEN]; - static float live_Zoffset; - static file_menu_t file_menu; + private: + static printer_state_t printer_state; + static paused_state_t pause_state; + static heater_state_t hotend_state; + static heater_state_t hotbed_state; + static xy_uint8_t selectedmeshpoint; + static char panel_command[MAX_CMND_LEN]; + static uint8_t command_len; + static char selectedfile[MAX_PATH_LEN]; + static float live_Zoffset; + static file_menu_t file_menu; + public: ChironTFT(); - void Startup(); - void IdleLoop(); - void PrinterKilled(PGM_P,PGM_P); - void MediaEvent(media_event_t); - void TimerEvent(timer_event_t); - void FilamentRunout(); - void ConfirmationRequest(const char * const ); - void StatusChange(const char * const ); - void PowerLossRecovery(); + static void Startup(); + static void IdleLoop(); + static void PrinterKilled(PGM_P,PGM_P); + static void MediaEvent(media_event_t); + static void TimerEvent(timer_event_t); + static void FilamentRunout(); + static void ConfirmationRequest(const char * const ); + static void StatusChange(const char * const ); + static void PowerLossRecovery(); private: - void SendtoTFT(PGM_P); - void SendtoTFTLN(PGM_P); - bool ReadTFTCommand(); - int8_t Findcmndpos(const char *, char); - void CheckHeaters(); - void SendFileList(int8_t); - void SelectFile(); - void InjectCommandandWait(PGM_P); - void ProcessPanelRequest(); - void PanelInfo(uint8_t); - void PanelAction(uint8_t); - void PanelProcess(uint8_t); + static void SendtoTFT(PGM_P); + static void SendtoTFTLN(PGM_P); + static bool ReadTFTCommand(); + static int8_t Findcmndpos(const char *, char); + static void CheckHeaters(); + static void SendFileList(int8_t); + static void SelectFile(); + static void InjectCommandandWait(PGM_P); + static void ProcessPanelRequest(); + static void PanelInfo(uint8_t); + static void PanelAction(uint8_t); + static void PanelProcess(uint8_t); }; extern ChironTFT Chiron; -} +} // Anycubic diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h index 7012e98d92..3087d83801 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -109,6 +109,7 @@ #define AC_cmnd_power_loss_recovery PSTR("G28XYR5\nG28Z") // Lift, home X and Y then home Z when in 'safe' position namespace Anycubic { + enum heater_state_t : uint8_t { AC_heater_off, AC_heater_temp_set, @@ -148,4 +149,5 @@ namespace Anycubic { AC_menu_change_to_file, AC_menu_change_to_command }; -} + +} // Anycubic diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index a990c4c640..95b07f5c68 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -2,7 +2,7 @@ * anycubic_i3mega_lcd.cpp --- Support for Anycubic i3 Mega TFT * Created by Christian Hopp on 09.12.17. * Improved by David Ramiro - * Converted to ext_iu by John BouAntoun 21 June 2020 + * Converted to ExtUI by John BouAntoun 21 June 2020 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -32,44 +32,46 @@ #include "../../../../inc/MarlinConfig.h" // command sending macro's with debugging capability -#define SEND_PGM(x) send_P(PSTR(x)) -#define SENDLINE_PGM(x) sendLine_P(PSTR(x)) -#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i16tostr3rj(y))) -#define SEND(x) send(x) -#define SENDLINE(x) sendLine(x) +#define SEND_PGM(x) send_P(PSTR(x)) +#define SENDLINE_PGM(x) sendLine_P(PSTR(x)) +#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i16tostr3rj(y))) +#define SEND(x) send(x) +#define SENDLINE(x) sendLine(x) #if ENABLED(ANYCUBIC_LCD_DEBUG) - #define SENDLINE_DBG_PGM(x,y) (sendLine_P(PSTR(x)), SERIAL_ECHOLNPGM(y)) - #define SENDLINE_DBG_PGM_VAL(x,y,z) (sendLine_P(PSTR(x)), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) + #define SENDLINE_DBG_PGM(x,y) (sendLine_P(PSTR(x)), SERIAL_ECHOLNPGM(y)) + #define SENDLINE_DBG_PGM_VAL(x,y,z) (sendLine_P(PSTR(x)), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) #else - #define SENDLINE_DBG_PGM(x,y) sendLine_P(PSTR(x)) - #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) + #define SENDLINE_DBG_PGM(x,y) sendLine_P(PSTR(x)) + #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) #endif AnycubicTFTClass AnycubicTFT; -static void sendNewLine(void) { - LCD_SERIAL.write('\r'); - LCD_SERIAL.write('\n'); -} +char AnycubicTFTClass::TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; +int AnycubicTFTClass::TFTbuflen = 0, + AnycubicTFTClass::TFTbufindr = 0, + AnycubicTFTClass::TFTbufindw = 0; +char AnycubicTFTClass::serial3_char; +int AnycubicTFTClass::serial3_count = 0; +char* AnycubicTFTClass::TFTstrchr_pointer; +uint8_t AnycubicTFTClass::SpecialMenu = false; +AnycubicMediaPrintState AnycubicTFTClass::mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; +AnycubicMediaPauseState AnycubicTFTClass::mediaPauseState = AMPAUSESTATE_NOT_PAUSED; -static void send(const char *str) { - LCD_SERIAL.print(str); -} - -static void sendLine(const char *str) { - send(str); - sendNewLine(); -} +char AnycubicTFTClass::SelectedDirectory[30]; +char AnycubicTFTClass::SelectedFile[FILENAME_LENGTH]; +// Serial helpers +static void sendNewLine(void) { LCD_SERIAL.write('\r'); LCD_SERIAL.write('\n'); } +static void send(const char *str) { LCD_SERIAL.print(str); } static void send_P(PGM_P str) { while (const char c = pgm_read_byte(str++)) LCD_SERIAL.write(c); } +static void sendLine(const char *str) { send(str); sendNewLine(); } +static void sendLine_P(PGM_P str) { send_P(str); sendNewLine(); } -static void sendLine_P(PGM_P str) { - send_P(str); - sendNewLine(); -} +using namespace ExtUI; AnycubicTFTClass::AnycubicTFTClass() {} @@ -80,7 +82,7 @@ void AnycubicTFTClass::OnSetup() { LCD_SERIAL.begin(LCD_BAUDRATE); SENDLINE_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset - ExtUI::delay_ms(10); + delay_ms(10); // initialise the state of the key pins running on the tft #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) @@ -95,13 +97,13 @@ void AnycubicTFTClass::OnSetup() { // DoSDCardStateCheck(); SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready - ExtUI::delay_ms(10); + delay_ms(10); DoFilamentRunoutCheck(); SelectedFile[0] = 0; #if ENABLED(STARTUP_CHIME) - ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); + injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); #endif #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished startup"); @@ -119,8 +121,8 @@ void AnycubicTFTClass::OnCommandScan() { #endif mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status - ExtUI::delay_ms(200); + injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status + delay_ms(200); // tell printer to release resources of print to indicate it is done SENDLINE_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); } @@ -224,8 +226,8 @@ bool AnycubicTFTClass::CodeSeen(char code) { } bool AnycubicTFTClass::IsNozzleHomed() { - const float xPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::X); - const float yPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::Y); + const float xPosition = getAxisPosition_mm((axis_t) X); + const float yPosition = getAxisPosition_mm((axis_t) Y); return WITHIN(xPosition, X_MIN_POS - 0.1, X_MIN_POS + 0.1) && WITHIN(yPosition, Y_MIN_POS - 0.1, Y_MIN_POS + 0.1); } @@ -246,48 +248,48 @@ void AnycubicTFTClass::HandleSpecialMenu() { switch (SelectedDirectory[2]) { case '1': // "<01ZUp0.1>" SERIAL_ECHOLNPGM("Special Menu: Z Up 0.1"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); + injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); break; case '2': // "<02ZUp0.02>" SERIAL_ECHOLNPGM("Special Menu: Z Up 0.02"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); + injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); break; case '3': // "<03ZDn0.02>" SERIAL_ECHOLNPGM("Special Menu: Z Down 0.02"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); + injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); break; case '4': // "<04ZDn0.1>" SERIAL_ECHOLNPGM("Special Menu: Z Down 0.1"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); + injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); break; case '5': // "<05PrehtBed>" SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - ExtUI::injectCommands_P(PSTR("M140 S65")); + injectCommands_P(PSTR("M140 S65")); break; case '6': // "<06SMeshLvl>" SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); - ExtUI::injectCommands_P(PSTR("G29S1")); + injectCommands_P(PSTR("G29S1")); break; case '7': // "<07MeshNPnt>" SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); - ExtUI::injectCommands_P(PSTR("G29S2")); + injectCommands_P(PSTR("G29S2")); break; case '8': // "<08HtEndPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); // need to dwell for half a second to give the fan a chance to start before the pid tuning starts - ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); break; case '9': // "<09HtBedPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); break; default: @@ -299,12 +301,12 @@ void AnycubicTFTClass::HandleSpecialMenu() { switch (SelectedDirectory[2]) { case '0': // "<10FWDeflts>" SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); + injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); break; case '1': // "<11SvEEPROM>" SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); + injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); break; default: @@ -316,38 +318,38 @@ void AnycubicTFTClass::HandleSpecialMenu() { switch (SelectedDirectory[2]) { case '1': // "<01PrehtBed>" SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - ExtUI::injectCommands_P(PSTR("M140 S65")); + injectCommands_P(PSTR("M140 S65")); break; case '2': // "<02ABL>" SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); - ExtUI::injectCommands_P(PSTR("G29N")); + injectCommands_P(PSTR("G29N")); break; case '3': // "<03HtendPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); // need to dwell for half a second to give the fan a chance to start before the pid tuning starts - ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); break; case '4': // "<04HtbedPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); break; case '5': // "<05FWDeflts>" SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); + injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); break; case '6': // "<06SvEEPROM>" SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); + injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); break; case '7': // <07SendM108> SERIAL_ECHOLNPGM("Special Menu: Send User Confirmation"); - ExtUI::injectCommands_P(PSTR("M108")); + injectCommands_P(PSTR("M108")); break; default: @@ -373,11 +375,11 @@ void AnycubicTFTClass::RenderCurrentFileList() { uint16_t selectedNumber = 0; SelectedDirectory[0] = 0; SelectedFile[0] = 0; - ExtUI::FileList currentFileList; + FileList currentFileList; SENDLINE_PGM("FN "); // Filelist start - if (!ExtUI::isMediaInserted() && !SpecialMenu) { + if (!isMediaInserted() && !SpecialMenu) { SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); SENDLINE_PGM(""); @@ -462,7 +464,7 @@ void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { } void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { - ExtUI::FileList currentFileList; + FileList currentFileList; uint16_t cnt = selectedNumber; uint16_t max_files; uint16_t dir_files = currentFileList.count(); @@ -514,7 +516,7 @@ void AnycubicTFTClass::OnPrintTimerStarted() { void AnycubicTFTClass::OnPrintTimerPaused() { #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) { + if (isPrintingFromMedia()) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKING; } @@ -558,38 +560,38 @@ void AnycubicTFTClass::GetCommandFromTFT() { switch (a_command) { case 0: { // A0 GET HOTEND TEMP - float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + float hotendActualTemp = getActualTemp_celsius((extruder_t) (extruder_t) E0); SEND_PGM_VAL("A0V ", int(hotendActualTemp + 0.5)); } break; case 1: { // A1 GET HOTEND TARGET TEMP - float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + float hotendTargetTemp = getTargetTemp_celsius((extruder_t) (extruder_t) E0); SEND_PGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); } break; case 2: { // A2 GET HOTBED TEMP - float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); + float heatedBedActualTemp = getActualTemp_celsius((heater_t) BED); SEND_PGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); } break; case 3: { // A3 GET HOTBED TARGET TEMP - float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); + float heatedBedTargetTemp = getTargetTemp_celsius((heater_t) BED); SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); } break; case 4: { // A4 GET FAN SPEED - float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); + float fanPercent = getActualFan_percent(FAN0); fanPercent = constrain(fanPercent, 0, 100); SEND_PGM_VAL("A4V ", int(fanPercent)); } break; case 5: { // A5 GET CURRENT COORDINATE - const float xPosition = ExtUI::getAxisPosition_mm(ExtUI::X), - yPosition = ExtUI::getAxisPosition_mm(ExtUI::Y), - zPosition = ExtUI::getAxisPosition_mm(ExtUI::Z); + const float xPosition = getAxisPosition_mm(X), + yPosition = getAxisPosition_mm(Y), + zPosition = getAxisPosition_mm(Z); SEND_PGM("A5V X: "); LCD_SERIAL.print(xPosition); SEND_PGM( " Y: "); LCD_SERIAL.print(yPosition); SEND_PGM( " Z: "); LCD_SERIAL.print(zPosition); @@ -598,10 +600,10 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 6: // A6 GET SD CARD PRINTING STATUS #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) { + if (isPrintingFromMedia()) { SEND_PGM("A6V "); - if (ExtUI::isMediaInserted()) - SENDLINE(ui8tostr3rj(ExtUI::getProgress_percent())); + if (isMediaInserted()) + SENDLINE(ui8tostr3rj(getProgress_percent())); else SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); } @@ -611,7 +613,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 7: { // A7 GET PRINTING TIME - const uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); + const uint32_t elapsedSeconds = getProgress_seconds_elapsed(); SEND_PGM("A7V "); if (elapsedSeconds != 0) { // print time const uint32_t elapsedMinutes = elapsedSeconds / 60; @@ -634,14 +636,14 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 9: // A9 pause sd print #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) + if (isPrintingFromMedia()) PausePrint(); #endif break; case 10: // A10 resume sd print #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMediaPaused()) + if (isPrintingFromMediaPaused()) ResumePrint(); #endif break; @@ -656,7 +658,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 13: // A13 SELECTION FILE #if ENABLED(SDSUPPORT) - if (ExtUI::isMediaInserted()) { + if (isMediaInserted()) { starpos = (strchr(TFTstrchr_pointer + 4, '*')); if (TFTstrchr_pointer[4] == '/') { strcpy(SelectedDirectory, TFTstrchr_pointer + 5); @@ -685,7 +687,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 14: // A14 START PRINTING #if ENABLED(SDSUPPORT) - if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) + if (!isPrinting() && strlen(SelectedFile) > 0) StartPrint(); #endif break; @@ -698,13 +700,13 @@ void AnycubicTFTClass::GetCommandFromTFT() { unsigned int tempvalue; if (CodeSeen('S')) { tempvalue = constrain(CodeValue(), 0, 275); - ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + setTargetTemp_celsius(tempvalue, (extruder_t) E0); } - else if (CodeSeen('C') && !ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + else if (CodeSeen('C') && !isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS tempvalue = constrain(CodeValue(), 0, 275); - ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + setTargetTemp_celsius(tempvalue, (extruder_t) E0); } } break; @@ -713,7 +715,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { unsigned int tempbed; if (CodeSeen('S')) { tempbed = constrain(CodeValue(), 0, 100); - ExtUI::setTargetTemp_celsius(tempbed, (ExtUI::heater_t)ExtUI::BED); + setTargetTemp_celsius(tempbed, (heater_t)BED); } } break; @@ -723,18 +725,18 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (CodeSeen('S')) { fanPercent = CodeValue(); fanPercent = constrain(fanPercent, 0, 100); - ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + setTargetFan_percent(fanPercent, FAN0); } else fanPercent = 100; - ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + setTargetFan_percent(fanPercent, FAN0); SENDLINE_PGM(""); } break; case 19: // A19 stop stepper drivers - sent on stop extrude command and on turn motors off command - if (!ExtUI::isPrinting()) { + if (!isPrinting()) { quickstop_stepper(); disable_all_steppers(); } @@ -750,23 +752,23 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 21: // A21 all home - if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (!isPrinting() && !isPrintingFromMediaPaused()) { if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { if (CodeSeen('X')) - ExtUI::injectCommands_P(PSTR("G28X")); + injectCommands_P(PSTR("G28X")); if (CodeSeen('Y')) - ExtUI::injectCommands_P(PSTR("G28Y")); + injectCommands_P(PSTR("G28Y")); if (CodeSeen('Z')) - ExtUI::injectCommands_P(PSTR("G28Z")); + injectCommands_P(PSTR("G28Z")); } else if (CodeSeen('C')) { - ExtUI::injectCommands_P(G28_STR); + injectCommands_P(G28_STR); } } break; case 22: // A22 move X/Y/Z or extrude - if (!ExtUI::isPrinting()) { + if (!isPrinting()) { float coorvalue; unsigned int movespeed = 0; char commandStr[30]; @@ -819,38 +821,38 @@ void AnycubicTFTClass::GetCommandFromTFT() { SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); SERIAL_ECHOLN(fullCommandStr); #endif - ExtUI::injectCommands(fullCommandStr); + injectCommands(fullCommandStr); } } SENDLINE_PGM(""); break; case 23: // A23 preheat pla - if (!ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + if (!isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (heater_t) BED); + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (extruder_t) E0); SENDLINE_PGM("OK"); } break; case 24:// A24 preheat abs - if (!ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + if (!isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (heater_t) BED); + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (extruder_t) E0); SENDLINE_PGM("OK"); } break; case 25: // A25 cool down - if (!ExtUI::isPrinting()) { - ExtUI::setTargetTemp_celsius(0, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(0, (ExtUI::extruder_t) ExtUI::E0); + if (!isPrinting()) { + setTargetTemp_celsius(0, (heater_t) BED); + setTargetTemp_celsius(0, (extruder_t) E0); SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down } @@ -858,9 +860,9 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 26: // A26 refresh SD #if ENABLED(SDSUPPORT) - if (ExtUI::isMediaInserted()) { + if (isMediaInserted()) { if (strlen(SelectedDirectory) > 0) { - ExtUI::FileList currentFileList; + FileList currentFileList; if ((SelectedDirectory[0] == '.') && (SelectedDirectory[1] == '.')) { currentFileList.upDir(); } @@ -914,7 +916,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { void AnycubicTFTClass::DoSDCardStateCheck() { #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - bool isInserted = ExtUI::isMediaInserted(); + bool isInserted = isMediaInserted(); if (isInserted) SENDLINE_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); else @@ -925,12 +927,12 @@ void AnycubicTFTClass::DoSDCardStateCheck() { void AnycubicTFTClass::DoFilamentRunoutCheck() { #if ENABLED(FILAMENT_RUNOUT_SENSOR) - // NOTE: ExtUI::getFilamentRunoutState() only returns the runout state if the job is printing + // NOTE: getFilamentRunoutState() only returns the runout state if the job is printing // we want to actually check the status of the pin here, regardless of printstate if (READ(FIL_RUNOUT1_PIN)) { if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) { // play tone to indicate filament is out - ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); + injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); // tell the user that the filament has run out and wait SENDLINE_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); @@ -944,30 +946,30 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { void AnycubicTFTClass::StartPrint() { #if ENABLED(SDSUPPORT) - if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { + if (!isPrinting() && strlen(SelectedFile) > 0) { #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); - SERIAL_ECHO(ExtUI::isPrinting()); + SERIAL_ECHO(isPrinting()); SERIAL_ECHOPGM(" "); SERIAL_ECHOLN(SelectedFile); #endif mediaPrintingState = AMPRINTSTATE_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::printFile(SelectedFile); + printFile(SelectedFile); } #endif // SDUPPORT } void AnycubicTFTClass::PausePrint() { #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { + if (isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state SENDLINE_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause // for some reason pausing the print doesn't retract the extruder so force a manual one here - ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); - ExtUI::pausePrint(); + injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); + pausePrint(); } #endif } @@ -996,14 +998,14 @@ void AnycubicTFTClass::ResumePrint() { // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause // reheat the nozzle - ExtUI::setUserConfirmed(); + setUserConfirmed(); } else { mediaPrintingState = AMPRINTSTATE_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; SENDLINE_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now - ExtUI::resumePrint(); + resumePrint(); } #endif } @@ -1015,8 +1017,8 @@ void AnycubicTFTClass::StopPrint() { SENDLINE_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); // for some reason stopping the print doesn't retract the extruder so force a manual one here - ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); - ExtUI::stopPrint(); + injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); + stopPrint(); #endif } diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h index 59050acccb..e34cb2fe69 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h @@ -2,7 +2,7 @@ * anycubic_i3mega_lcd.h --- Support for Anycubic i3 Mega TFT * Created by Christian Hopp on 09.12.17. * Improved by David Ramiro - * Converted to ext_iu by John BouAntoun 21 June 2020 + * Converted to ExtUI by John BouAntoun 21 June 2020 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -48,49 +48,47 @@ enum AnycubicMediaPauseState { class AnycubicTFTClass { public: AnycubicTFTClass(); - void OnSetup(); - void OnCommandScan(); - void OnKillTFT(); - void OnSDCardStateChange(bool); - void OnSDCardError(); - void OnFilamentRunout(); - void OnUserConfirmRequired(const char *); - void OnPrintTimerStarted(); - void OnPrintTimerPaused(); - void OnPrintTimerStopped(); + static void OnSetup(); + static void OnCommandScan(); + static void OnKillTFT(); + static void OnSDCardStateChange(bool); + static void OnSDCardError(); + static void OnFilamentRunout(); + static void OnUserConfirmRequired(const char *); + static void OnPrintTimerStarted(); + static void OnPrintTimerPaused(); + static void OnPrintTimerStopped(); private: - char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; - int TFTbuflen=0; - int TFTbufindr = 0; - int TFTbufindw = 0; - char serial3_char; - int serial3_count = 0; - char *TFTstrchr_pointer; - uint8_t SpecialMenu = false; - AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + static char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; + static int TFTbuflen, TFTbufindr, TFTbufindw; + static char serial3_char; + static int serial3_count; + static char *TFTstrchr_pointer; + static uint8_t SpecialMenu; + static AnycubicMediaPrintState mediaPrintingState; + static AnycubicMediaPauseState mediaPauseState; - float CodeValue(); - bool CodeSeen(char); - bool IsNozzleHomed(); - void RenderCurrentFileList(); - void RenderSpecialMenu(uint16_t); - void RenderCurrentFolder(uint16_t); - void GetCommandFromTFT(); - void CheckSDCardChange(); - void CheckPauseState(); - void CheckPrintCompletion(); - void HandleSpecialMenu(); - void DoSDCardStateCheck(); - void DoFilamentRunoutCheck(); - void StartPrint(); - void PausePrint(); - void ResumePrint(); - void StopPrint(); + static float CodeValue(); + static bool CodeSeen(char); + static bool IsNozzleHomed(); + static void RenderCurrentFileList(); + static void RenderSpecialMenu(uint16_t); + static void RenderCurrentFolder(uint16_t); + static void GetCommandFromTFT(); + static void CheckSDCardChange(); + static void CheckPauseState(); + static void CheckPrintCompletion(); + static void HandleSpecialMenu(); + static void DoSDCardStateCheck(); + static void DoFilamentRunoutCheck(); + static void StartPrint(); + static void PausePrint(); + static void ResumePrint(); + static void StopPrint(); - char SelectedDirectory[30]; - char SelectedFile[FILENAME_LENGTH]; + static char SelectedDirectory[30]; + static char SelectedFile[FILENAME_LENGTH]; }; extern AnycubicTFTClass AnycubicTFT; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index fc9b5d0a70..902ede025c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -140,7 +140,7 @@ namespace ExtUI { #if HAS_LEVELING && HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t x, const int8_t y, const float val) { + void onMeshUpdate(const int8_t x, const int8_t y, const float &val) { BedMeshScreen::onMeshUpdate(x, y, val); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h index 7aac484cb6..de72d863ae 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h @@ -51,7 +51,7 @@ class BedMeshScreen : public BaseScreen, public CachedScreen 0 ? CEIL(steps) : FLOOR(steps); } - #endif + + #endif // BABYSTEPPING float getZOffset_mm() { return (0.0f @@ -754,7 +744,7 @@ namespace ExtUI { ); } - void setZOffset_mm(const float value) { + void setZOffset_mm(const float &value) { #if HAS_BED_PROBE if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) probe.offset.z = value; @@ -772,7 +762,7 @@ namespace ExtUI { return hotend_offset[extruder - E0][axis]; } - void setNozzleOffset_mm(const float value, const axis_t axis, const extruder_t extruder) { + void setNozzleOffset_mm(const float &value, const axis_t axis, const extruder_t extruder) { if (extruder - E0 >= HOTENDS) return; hotend_offset[extruder - E0][axis] = value; } @@ -790,25 +780,21 @@ namespace ExtUI { #endif // HAS_HOTEND_OFFSET #if HAS_BED_PROBE - float getProbeOffset_mm(const axis_t axis) { - return probe.offset.pos[axis]; - } - void setProbeOffset_mm(const float val, const axis_t axis) { - probe.offset.pos[axis] = val; - } + float getProbeOffset_mm(const axis_t axis) { return probe.offset.pos[axis]; } + void setProbeOffset_mm(const float &val, const axis_t axis) { probe.offset.pos[axis] = val; } #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t axis) { return backlash.distance_mm[axis]; } - void setAxisBacklash_mm(const float value, const axis_t axis) + void setAxisBacklash_mm(const float &value, const axis_t axis) { backlash.distance_mm[axis] = constrain(value,0,5); } float getBacklashCorrection_percent() { return ui8_to_percent(backlash.correction); } - void setBacklashCorrection_percent(const float value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } + void setBacklashCorrection_percent(const float &value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } #ifdef BACKLASH_SMOOTHING_MM float getBacklashSmoothing_mm() { return backlash.smoothing_mm; } - void setBacklashSmoothing_mm(const float value) { backlash.smoothing_mm = constrain(value, 0, 999); } + void setBacklashSmoothing_mm(const float &value) { backlash.smoothing_mm = constrain(value, 0, 999); } #endif #endif @@ -824,7 +810,7 @@ namespace ExtUI { #if HAS_MESH bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } - void setMeshPoint(const xy_uint8_t &pos, const float zoff) { + void setMeshPoint(const xy_uint8_t &pos, const float &zoff) { if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { Z_VALUES(pos.x, pos.y) = zoff; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); @@ -838,6 +824,7 @@ namespace ExtUI { #endif #if ENABLED(PRINTCOUNTER) + char* getFailedPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().totalPrints - print_job_timer.getStats().finishedPrints)); return buffer; } char* getTotalPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().totalPrints)); return buffer; } char* getFinishedPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().finishedPrints)); return buffer; } char* getTotalPrintTime_str(char buffer[21]) { return duration_t(print_job_timer.getStats().printTime).toString(buffer); } @@ -856,14 +843,14 @@ namespace ExtUI { float getPIDValues_Ki(const extruder_t tool) { return unscalePID_i(PID_PARAM(Ki, tool)); } float getPIDValues_Kd(const extruder_t tool) { return unscalePID_d(PID_PARAM(Kd, tool)); } - void setPIDValues(const float p, const float i, const float d, extruder_t tool) { + void setPIDValues(const float &p, const float &i, const float &d, extruder_t tool) { thermalManager.temp_hotend[tool].pid.Kp = p; thermalManager.temp_hotend[tool].pid.Ki = scalePID_i(i); thermalManager.temp_hotend[tool].pid.Kd = scalePID_d(d); thermalManager.updatePID(); } - void startPIDTune(const float temp, extruder_t tool) { + void startPIDTune(const float &temp, extruder_t tool) { thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true); } #endif @@ -873,14 +860,14 @@ namespace ExtUI { float getBedPIDValues_Ki() { return unscalePID_i(thermalManager.temp_bed.pid.Ki); } float getBedPIDValues_Kd() { return unscalePID_d(thermalManager.temp_bed.pid.Kd); } - void setBedPIDValues(const float p, const float i, const float d) { + void setBedPIDValues(const float &p, const float &i, const float &d) { thermalManager.temp_bed.pid.Kp = p; thermalManager.temp_bed.pid.Ki = scalePID_i(i); thermalManager.temp_bed.pid.Kd = scalePID_d(d); thermalManager.updatePID(); } - void startBedPIDTune(const float temp) { + void startBedPIDTune(const float &temp) { thermalManager.PID_autotune(temp, H_BED, 4, true); } #endif @@ -900,7 +887,8 @@ namespace ExtUI { return firmware_name; } - void setTargetTemp_celsius(float value, const heater_t heater) { + void setTargetTemp_celsius(const float &inval, const heater_t heater) { + float value = inval; #ifdef TOUCH_UI_LCD_TEMP_SCALING value *= TOUCH_UI_LCD_TEMP_SCALING; #endif @@ -924,7 +912,8 @@ namespace ExtUI { } } - void setTargetTemp_celsius(float value, const extruder_t extruder) { + void setTargetTemp_celsius(const float &inval, const extruder_t extruder) { + float value = inval; #ifdef TOUCH_UI_LCD_TEMP_SCALING value *= TOUCH_UI_LCD_TEMP_SCALING; #endif @@ -935,7 +924,7 @@ namespace ExtUI { #endif } - void setTargetFan_percent(const float value, const fan_t fan) { + void setTargetFan_percent(const float &value, const fan_t fan) { #if HAS_FAN if (fan < FAN_COUNT) thermalManager.set_fan_speed(fan - FAN0, map(constrain(value, 0, 100), 0, 100, 0, 255)); @@ -945,25 +934,27 @@ namespace ExtUI { #endif } - void setFeedrate_percent(const float value) { - feedrate_percentage = constrain(value, 10, 500); + void setFeedrate_percent(const float &value) { feedrate_percentage = constrain(value, 10, 500); } + + void coolDown() { + #if HAS_HOTEND + HOTEND_LOOP() thermalManager.setTargetHotend(0, e); + #endif + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(0)); + TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); } - bool awaitingUserConfirm() { - return wait_for_user; - } + bool awaitingUserConfirm() { return wait_for_user; } - void setUserConfirmed() { - TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); - } + void setUserConfirmed() { TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); } void printFile(const char *filename) { UNUSED(filename); - IFSD(card.openAndPrintFile(filename), NOOP); + TERN_(SDSUPPORT, card.openAndPrintFile(filename)); } bool isPrintingFromMediaPaused() { - return IFSD(isPrintingFromMedia() && !IS_SD_PRINTING(), false); + return TERN0(SDSUPPORT, isPrintingFromMedia() && !IS_SD_PRINTING()); } bool isPrintingFromMedia() { @@ -978,16 +969,14 @@ namespace ExtUI { } bool isPrinting() { - return (commandsInQueue() || isPrintingFromMedia() || IFSD(IS_SD_PRINTING(), false)) || print_job_timer.isRunning() || print_job_timer.isPaused(); + return (commandsInQueue() || isPrintingFromMedia() || TERN0(SDSUPPORT, IS_SD_PRINTING())) || print_job_timer.isRunning() || print_job_timer.isPaused(); } bool isPrintingPaused() { return isPrinting() && (isPrintingFromMediaPaused() || print_job_timer.isPaused()); } - bool isMediaInserted() { - return IFSD(IS_SD_INSERTED() && card.isMounted(), false); - } + bool isMediaInserted() { return TERN0(SDSUPPORT, IS_SD_INSERTED() && card.isMounted()); } void pausePrint() { ui.pause_print(); } void resumePrint() { ui.resume_print(); } @@ -1022,27 +1011,27 @@ namespace ExtUI { } const char* FileList::filename() { - return IFSD(card.longest_filename(), ""); + return TERN(SDSUPPORT, card.longest_filename(), ""); } const char* FileList::shortFilename() { - return IFSD(card.filename, ""); + return TERN(SDSUPPORT, card.filename, ""); } const char* FileList::longFilename() { - return IFSD(card.longFilename, ""); + return TERN(SDSUPPORT, card.longFilename, ""); } bool FileList::isDir() { - return IFSD(card.flag.filenameIsDir, false); + return TERN0(SDSUPPORT, card.flag.filenameIsDir); } uint16_t FileList::count() { - return IFSD((num_files = (num_files == 0xFFFF ? card.get_num_Files() : num_files)), 0); + return TERN0(SDSUPPORT, (num_files = (num_files == 0xFFFF ? card.get_num_Files() : num_files))); } bool FileList::isAtRootDir() { - return IFSD(card.flag.workDirIsRoot, true); + return TERN1(SDSUPPORT, card.flag.workDirIsRoot); } void FileList::upDir() { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index a6cfb82b88..701bf9eb54 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -102,11 +102,11 @@ namespace ExtUI { #if HAS_TRINAMIC_CONFIG float getAxisCurrent_mA(const axis_t); float getAxisCurrent_mA(const extruder_t); - void setAxisCurrent_mA(const float, const axis_t); - void setAxisCurrent_mA(const float, const extruder_t); + void setAxisCurrent_mA(const float&, const axis_t); + void setAxisCurrent_mA(const float&, const extruder_t); int getTMCBumpSensitivity(const axis_t); - void setTMCBumpSensitivity(const float, const axis_t); + void setTMCBumpSensitivity(const float&, const axis_t); #endif float getActualTemp_celsius(const heater_t); @@ -150,10 +150,10 @@ namespace ExtUI { #if HAS_MESH bed_mesh_t& getMeshArray(); float getMeshPoint(const xy_uint8_t &pos); - void setMeshPoint(const xy_uint8_t &pos, const float zval); + void setMeshPoint(const xy_uint8_t &pos, const float &zval); void onMeshLevelingStart(); - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval); - inline void onMeshUpdate(const xy_int8_t &pos, const float zval) { onMeshUpdate(pos.x, pos.y, zval); } + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval); + inline void onMeshUpdate(const xy_int8_t &pos, const float &zval) { onMeshUpdate(pos.x, pos.y, zval); } typedef enum : uint8_t { MESH_START, // Prior to start of probe @@ -178,41 +178,42 @@ namespace ExtUI { char* getFilamentUsed_str(char buffer[21]); #endif - void setTargetTemp_celsius(const float, const heater_t); - void setTargetTemp_celsius(const float, const extruder_t); - void setTargetFan_percent(const float, const fan_t); - void setAxisPosition_mm(const float, const axis_t, const feedRate_t=0); - void setAxisPosition_mm(const float, const extruder_t, const feedRate_t=0); - void setAxisSteps_per_mm(const float, const axis_t); - void setAxisSteps_per_mm(const float, const extruder_t); + void setTargetTemp_celsius(const float&, const heater_t); + void setTargetTemp_celsius(const float&, const extruder_t); + void setTargetFan_percent(const float&, const fan_t); + void coolDown(); + void setAxisPosition_mm(const float&, const axis_t, const feedRate_t=0); + void setAxisPosition_mm(const float&, const extruder_t, const feedRate_t=0); + void setAxisSteps_per_mm(const float&, const axis_t); + void setAxisSteps_per_mm(const float&, const extruder_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const axis_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const extruder_t); - void setAxisMaxAcceleration_mm_s2(const float, const axis_t); - void setAxisMaxAcceleration_mm_s2(const float, const extruder_t); + void setAxisMaxAcceleration_mm_s2(const float&, const axis_t); + void setAxisMaxAcceleration_mm_s2(const float&, const extruder_t); void setFeedrate_mm_s(const feedRate_t); void setMinFeedrate_mm_s(const feedRate_t); void setMinTravelFeedrate_mm_s(const feedRate_t); - void setPrintingAcceleration_mm_s2(const float); - void setRetractAcceleration_mm_s2(const float); - void setTravelAcceleration_mm_s2(const float); - void setFeedrate_percent(const float); + void setPrintingAcceleration_mm_s2(const float&); + void setRetractAcceleration_mm_s2(const float&); + void setTravelAcceleration_mm_s2(const float&); + void setFeedrate_percent(const float&); void setFlow_percent(const int16_t, const extruder_t); bool awaitingUserConfirm(); void setUserConfirmed(); #if ENABLED(LIN_ADVANCE) float getLinearAdvance_mm_mm_s(const extruder_t); - void setLinearAdvance_mm_mm_s(const float, const extruder_t); + void setLinearAdvance_mm_mm_s(const float&, const extruder_t); #endif #if HAS_JUNCTION_DEVIATION float getJunctionDeviation_mm(); - void setJunctionDeviation_mm(const float); + void setJunctionDeviation_mm(const float&); #else float getAxisMaxJerk_mm_s(const axis_t); float getAxisMaxJerk_mm_s(const extruder_t); - void setAxisMaxJerk_mm_s(const float, const axis_t); - void setAxisMaxJerk_mm_s(const float, const extruder_t); + void setAxisMaxJerk_mm_s(const float&, const axis_t); + void setAxisMaxJerk_mm_s(const float&, const extruder_t); #endif extruder_t getTool(const uint8_t extruder); @@ -220,7 +221,7 @@ namespace ExtUI { void setActiveTool(const extruder_t, bool no_move); #if ENABLED(BABYSTEPPING) - int16_t mmToWholeSteps(const float mm, const axis_t axis); + int16_t mmToWholeSteps(const float& mm, const axis_t axis); bool babystepAxis_steps(const int16_t steps, const axis_t axis); void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles); @@ -228,28 +229,28 @@ namespace ExtUI { #if HAS_HOTEND_OFFSET float getNozzleOffset_mm(const axis_t, const extruder_t); - void setNozzleOffset_mm(const float, const axis_t, const extruder_t); + void setNozzleOffset_mm(const float&, const axis_t, const extruder_t); void normalizeNozzleOffset(const axis_t axis); #endif float getZOffset_mm(); - void setZOffset_mm(const float); + void setZOffset_mm(const float&); #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t); - void setProbeOffset_mm(const float, const axis_t); + void setProbeOffset_mm(const float&, const axis_t); #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t); - void setAxisBacklash_mm(const float, const axis_t); + void setAxisBacklash_mm(const float&, const axis_t); float getBacklashCorrection_percent(); - void setBacklashCorrection_percent(const float); + void setBacklashCorrection_percent(const float&); #ifdef BACKLASH_SMOOTHING_MM float getBacklashSmoothing_mm(); - void setBacklashSmoothing_mm(const float); + void setBacklashSmoothing_mm(const float&); #endif #endif @@ -261,7 +262,7 @@ namespace ExtUI { #if HAS_FILAMENT_RUNOUT_DISTANCE float getFilamentRunoutDistance_mm(); - void setFilamentRunoutDistance_mm(const float); + void setFilamentRunoutDistance_mm(const float&); #endif #endif @@ -271,7 +272,7 @@ namespace ExtUI { #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) float getCaseLightBrightness_percent(); - void setCaseLightBrightness_percent(const float); + void setCaseLightBrightness_percent(const float&); #endif #endif @@ -279,16 +280,16 @@ namespace ExtUI { float getPIDValues_Kp(const extruder_t); float getPIDValues_Ki(const extruder_t); float getPIDValues_Kd(const extruder_t); - void setPIDValues(const float, const float, const float, extruder_t); - void startPIDTune(const float, extruder_t); + void setPIDValues(const float&, const float&, const float&, extruder_t); + void startPIDTune(const float&, extruder_t); #endif #if ENABLED(PIDTEMPBED) float getBedPIDValues_Kp(); float getBedPIDValues_Ki(); float getBedPIDValues_Kd(); - void setBedPIDValues(const float, const float, const float); - void startBedPIDTune(const float); + void setBedPIDValues(const float&, const float&, const float&); + void startBedPIDTune(const float&); #endif /** diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index f823b79e7a..4399d9a4b6 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -23,8 +23,6 @@ #include "../inc/MarlinConfig.h" -#define IFSD(A,B) TERN(SDSUPPORT,A,B) - #if ENABLED(SDSUPPORT) extern const char M23_STR[], M24_STR[]; From b6169a957d8b003553fb7ea889bbfaffd2f7813f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 07:14:33 -0600 Subject: [PATCH 1147/1370] Fix MarlinSerial typo --- Marlin/src/HAL/AVR/MarlinSerial.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index ab49e9440a..d34408b165 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -287,7 +287,7 @@ #else static constexpr unsigned int RX_SIZE = 64; static constexpr unsigned int TX_SIZE = 128; - static constexpr bool RX_OVERRUNS = false + static constexpr bool RX_OVERRUNS = false; #endif }; From 166d4a26f34d45a211e947d279e9f23c6d2f3c96 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 08:34:22 -0600 Subject: [PATCH 1148/1370] Pause SD queue early on M25 (#21317) --- Marlin/src/gcode/host/M115.cpp | 3 +++ Marlin/src/gcode/queue.cpp | 8 +++++++- Marlin/src/gcode/sd/M24_M25.cpp | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index cd6fcbaf86..a518e68cf5 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -120,6 +120,9 @@ void GcodeSuite::M115() { // REPEAT (M808) cap_line(PSTR("REPEAT"), ENABLED(GCODE_REPEAT_MARKERS)); + // SD_WRITE (M928, M28, M29) + cap_line(PSTR("SD_WRITE"), ENABLED(SDSUPPORT) && DISABLED(SDCARD_READONLY)); + // AUTOREPORT_SD_STATUS (M27 extension) cap_line(PSTR("AUTOREPORT_SD_STATUS"), ENABLED(AUTO_REPORT_SD_STATUS)); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index b093184c91..7845b01ad6 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -567,7 +567,6 @@ void GCodeQueue::get_serial_commands() { const bool is_eol = ISEOL(sd_char); if (is_eol || card_eof) { - // Reset stream state, terminate the buffer, and commit a non-empty command if (!is_eol && sd_count) ++sd_count; // End of file with no newline if (!process_line_done(sd_input_state, command.buffer, sd_count)) { @@ -575,6 +574,13 @@ void GCodeQueue::get_serial_commands() { // M808 L saves the sdpos of the next line. M808 loops to a new sdpos. TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command.buffer)); + #if DISABLED(PARK_HEAD_ON_PAUSE) + // When M25 is non-blocking it can still suspend SD commands + // Otherwise the M125 handler needs to know SD printing is active + if (command.buffer[0] == 'M' && command.buffer[1] == '2' && command.buffer[2] == '5' && !NUMERIC(command.buffer[3])) + card.pauseSDPrint(); + #endif + // Put the new command into the buffer (no "ok" sent) ring_buffer.commit_command(true); diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp index 8fb529dcaa..1c98791bce 100644 --- a/Marlin/src/gcode/sd/M24_M25.cpp +++ b/Marlin/src/gcode/sd/M24_M25.cpp @@ -87,6 +87,10 @@ void GcodeSuite::M24() { /** * M25: Pause SD Print + * + * With PARK_HEAD_ON_PAUSE: + * Invoke M125 to store the current position and move to the park + * position. M24 will move the head back before resuming the print. */ void GcodeSuite::M25() { From 7fb04b3656207a3e02bb0e9635d1f191d38f1d0f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 6 Mar 2021 01:09:13 -0600 Subject: [PATCH 1149/1370] MarlinSerial cleanup --- Marlin/src/HAL/AVR/MarlinSerial.h | 33 +++++++++++-------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index d34408b165..31bbaaa531 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -252,13 +252,13 @@ template struct MMU2SerialCfg { static constexpr int PORT = serial; + static constexpr unsigned int RX_SIZE = 32; + static constexpr unsigned int TX_SIZE = 32; static constexpr bool XONOFF = false; static constexpr bool EMERGENCYPARSER = false; static constexpr bool DROPPED_RX = false; static constexpr bool RX_FRAMING_ERRORS = false; static constexpr bool MAX_RX_QUEUED = false; - static constexpr unsigned int RX_SIZE = 32; - static constexpr unsigned int TX_SIZE = 32; static constexpr bool RX_OVERRUNS = false; }; @@ -270,28 +270,17 @@ template struct LCDSerialCfg { - static constexpr int PORT = serial; - static constexpr bool XONOFF = false; - static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); - static constexpr bool DROPPED_RX = false; - static constexpr bool RX_FRAMING_ERRORS = false; - static constexpr bool MAX_RX_QUEUED = false; - #if HAS_DGUS_LCD - static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE; - static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE; - static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); - #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - static constexpr unsigned int RX_SIZE = 64; - static constexpr unsigned int TX_SIZE = 128; - static constexpr bool RX_OVERRUNS = false; - #else - static constexpr unsigned int RX_SIZE = 64; - static constexpr unsigned int TX_SIZE = 128; - static constexpr bool RX_OVERRUNS = false; - #endif + static constexpr int PORT = serial; + static constexpr unsigned int RX_SIZE = TERN(HAS_DGUS_LCD, DGUS_RX_BUFFER_SIZE, 64); + static constexpr unsigned int TX_SIZE = TERN(HAS_DGUS_LCD, DGUS_TX_BUFFER_SIZE, 128); + static constexpr bool XONOFF = false; + static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); + static constexpr bool DROPPED_RX = false; + static constexpr bool RX_FRAMING_ERRORS = false; + static constexpr bool MAX_RX_QUEUED = false; + static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS); }; - typedef Serial1Class< MarlinSerial< LCDSerialCfg > > MSerialT4; extern MSerialT4 lcdSerial; #endif From 2480c82d76d58bf45b16e288501ba16146249fe5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 09:25:41 -0600 Subject: [PATCH 1150/1370] Add M207/8/9 reporting (#21335) --- Marlin/src/feature/fwretract.cpp | 76 +++++++++++++++++++ Marlin/src/feature/fwretract.h | 9 +++ .../src/gcode/feature/fwretract/M207-M209.cpp | 36 ++------- Marlin/src/gcode/geometry/M206_M428.cpp | 4 +- Marlin/src/module/settings.cpp | 27 +------ 5 files changed, 98 insertions(+), 54 deletions(-) diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index 2a71af11d6..4e57ba0150 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -36,6 +36,8 @@ FWRetract fwretract; // Single instance - this calls the constructor #include "../module/planner.h" #include "../module/stepper.h" +#include "../gcode/parser.h" + #if ENABLED(RETRACT_SYNC_MIXING) #include "mixing.h" #endif @@ -198,4 +200,78 @@ void FWRetract::retract(const bool retracting //*/ } +//extern const char SP_Z_STR[]; + +/** + * M207: Set firmware retraction values + * + * S[+units] retract_length + * W[+units] swap_retract_length (multi-extruder) + * F[units/min] retract_feedrate_mm_s + * Z[units] retract_zraise + */ +void FWRetract::M207() { + if (!parser.seen("FSWZ")) return M207_report(); + if (parser.seen('S')) settings.retract_length = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) settings.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('Z')) settings.retract_zraise = parser.value_linear_units(); + if (parser.seen('W')) settings.swap_retract_length = parser.value_axis_units(E_AXIS); +} + +void FWRetract::M207_report(const bool forReplay/*=false*/) { + if (!forReplay) { SERIAL_ECHO_MSG("; Retract: S F Z"); SERIAL_ECHO_START(); } + SERIAL_ECHOLNPAIR_P( + PSTR(" M207 S"), LINEAR_UNIT(settings.retract_length) + , PSTR(" W"), LINEAR_UNIT(settings.swap_retract_length) + , PSTR(" F"), LINEAR_UNIT(MMS_TO_MMM(settings.retract_feedrate_mm_s)) + , SP_Z_STR, LINEAR_UNIT(settings.retract_zraise) + ); +} + +/** + * M208: Set firmware un-retraction values + * + * S[+units] retract_recover_extra (in addition to M207 S*) + * W[+units] swap_retract_recover_extra (multi-extruder) + * F[units/min] retract_recover_feedrate_mm_s + * R[units/min] swap_retract_recover_feedrate_mm_s + */ +void FWRetract::M208() { + if (!parser.seen("FSRW")) return M208_report(); + if (parser.seen('S')) settings.retract_recover_extra = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) settings.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('R')) settings.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('W')) settings.swap_retract_recover_extra = parser.value_axis_units(E_AXIS); +} + +void FWRetract::M208_report(const bool forReplay/*=false*/) { + if (!forReplay) { SERIAL_ECHO_MSG("; Recover: S F"); SERIAL_ECHO_START(); } + SERIAL_ECHOLNPAIR( + " M208 S", LINEAR_UNIT(settings.retract_recover_extra) + , " W", LINEAR_UNIT(settings.swap_retract_recover_extra) + , " F", LINEAR_UNIT(MMS_TO_MMM(settings.retract_recover_feedrate_mm_s)) + ); +} + +#if ENABLED(FWRETRACT_AUTORETRACT) + + /** + * M209: Enable automatic retract (M209 S1) + * For slicers that don't support G10/11, reversed extrude-only + * moves will be classified as retraction. + */ + void FWRetract::M209() { + if (!parser.seen('S')) return M209_report(); + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) + enable_autoretract(parser.value_bool()); + } + + void FWRetract::M209_report(const bool forReplay/*=false*/) { + if (!forReplay) { SERIAL_ECHO_MSG("; Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); SERIAL_ECHO_START(); } + SERIAL_ECHOLNPAIR(" M209 S", autoretract_enabled); + } + +#endif // FWRETRACT_AUTORETRACT + + #endif // FWRETRACT diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h index 134851965d..4fa64ad83b 100644 --- a/Marlin/src/feature/fwretract.h +++ b/Marlin/src/feature/fwretract.h @@ -79,6 +79,15 @@ public: , bool swapping = false #endif ); + + static void M207(); + static void M207_report(const bool forReplay=false); + static void M208(); + static void M208_report(const bool forReplay=false); + #if ENABLED(FWRETRACT_AUTORETRACT) + static void M209(); + static void M209_report(const bool forReplay=false); + #endif }; extern FWRetract fwretract; diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp index 538f16cde6..5793d73f94 100644 --- a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp +++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp @@ -29,46 +29,24 @@ /** * M207: Set firmware retraction values - * - * S[+units] retract_length - * W[+units] swap_retract_length (multi-extruder) - * F[units/min] retract_feedrate_mm_s - * Z[units] retract_zraise */ -void GcodeSuite::M207() { - if (parser.seen('S')) fwretract.settings.retract_length = parser.value_axis_units(E_AXIS); - if (parser.seen('F')) fwretract.settings.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('Z')) fwretract.settings.retract_zraise = parser.value_linear_units(); - if (parser.seen('W')) fwretract.settings.swap_retract_length = parser.value_axis_units(E_AXIS); -} +void GcodeSuite::M207() { fwretract.M207(); } /** * M208: Set firmware un-retraction values - * - * S[+units] retract_recover_extra (in addition to M207 S*) - * W[+units] swap_retract_recover_extra (multi-extruder) - * F[units/min] retract_recover_feedrate_mm_s - * R[units/min] swap_retract_recover_feedrate_mm_s */ -void GcodeSuite::M208() { - if (parser.seen('S')) fwretract.settings.retract_recover_extra = parser.value_axis_units(E_AXIS); - if (parser.seen('F')) fwretract.settings.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('R')) fwretract.settings.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('W')) fwretract.settings.swap_retract_recover_extra = parser.value_axis_units(E_AXIS); -} +void GcodeSuite::M208() { fwretract.M208(); } #if ENABLED(FWRETRACT_AUTORETRACT) /** * M209: Enable automatic retract (M209 S1) - * For slicers that don't support G10/11, reversed extrude-only - * moves will be classified as retraction. + * + * For slicers that don't support G10/11, reversed + * extruder-only moves can be classified as retraction. */ - void GcodeSuite::M209() { - if (MIN_AUTORETRACT <= MAX_AUTORETRACT && parser.seen('S')) - fwretract.enable_autoretract(parser.value_bool()); - } + void GcodeSuite::M209() { fwretract.M209(); } -#endif // FWRETRACT_AUTORETRACT +#endif #endif // FWRETRACT diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index 2a2cdb16ff..ac2420fcc3 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -30,7 +30,7 @@ #include "../../libs/buzzer.h" #include "../../MarlinCore.h" -void m206_report() { +void M206_report() { SERIAL_ECHOLNPAIR_P(PSTR("M206 X"), home_offset.x, SP_Y_STR, home_offset.y, SP_Z_STR, home_offset.z); } @@ -52,7 +52,7 @@ void GcodeSuite::M206() { #endif if (!parser.seen("XYZ")) - m206_report(); + M206_report(); else report_current_position(); } diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c82ed0eb8f..d38ad51934 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3466,29 +3466,10 @@ void MarlinSettings::reset() { #endif #if ENABLED(FWRETRACT) - - CONFIG_ECHO_HEADING("Retract: S F Z"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M207 S"), LINEAR_UNIT(fwretract.settings.retract_length) - , PSTR(" W"), LINEAR_UNIT(fwretract.settings.swap_retract_length) - , PSTR(" F"), LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_feedrate_mm_s)) - , SP_Z_STR, LINEAR_UNIT(fwretract.settings.retract_zraise) - ); - - CONFIG_ECHO_HEADING("Recover: S F"); - CONFIG_ECHO_MSG( - " M208 S", LINEAR_UNIT(fwretract.settings.retract_recover_extra) - , " W", LINEAR_UNIT(fwretract.settings.swap_retract_recover_extra) - , " F", LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_recover_feedrate_mm_s)) - ); - - #if ENABLED(FWRETRACT_AUTORETRACT) - CONFIG_ECHO_HEADING("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); - CONFIG_ECHO_MSG(" M209 S", fwretract.autoretract_enabled); - #endif - - #endif // FWRETRACT + fwretract.M207_report(forReplay); + fwretract.M208_report(forReplay); + TERN_(FWRETRACT_AUTORETRACT, fwretract.M209_report(forReplay)); + #endif /** * Probe Offset From 09233129a833a3a0a4a56b1d182c3cebe4ebbe44 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 07:34:44 -0600 Subject: [PATCH 1151/1370] Tweak opt_set, opt_enable --- buildroot/bin/opt_enable | 4 ++-- buildroot/bin/opt_set | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildroot/bin/opt_enable b/buildroot/bin/opt_enable index fdcb5dae2d..9161299b6e 100755 --- a/buildroot/bin/opt_enable +++ b/buildroot/bin/opt_enable @@ -7,7 +7,7 @@ SED=$(which gsed || which sed) for opt in "$@" ; do # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + eval "${SED} -i '/^\([[:blank:]]*\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/^\([[:blank:]]*\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || (echo "ERROR: opt_enable Can't find ${opt}" >&2 && exit 9) done diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set index 2a7a676cdc..2e63790c69 100755 --- a/buildroot/bin/opt_set +++ b/buildroot/bin/opt_set @@ -8,8 +8,8 @@ SED=$(which gsed || which sed) ARGC=$# while [[ $# > 1 ]]; do # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + eval "${SED} -i '/^\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\1\3\4 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/^\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\1\3\4 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || eval "echo '#define ${1} ${2}' >>Marlin/Configuration.h" || (echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) shift 2 From 0c3eb04a37ce2cae46b0b2ae2ba058f89166d27d Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 13 Mar 2021 08:01:02 -0300 Subject: [PATCH 1152/1370] No extra build folder for st/jlink upload (#21341) --- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 5c2bde7700..36704af283 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -22,10 +22,9 @@ def add_cpu_freq(): # # It will separe release and debug build folders. # It useful when we need keep two live versions: one debug, for debugging, -# other release, for flashing. +# other release, for flashing (when upload is not done automatically by jlink/stlink). # Without this, PIO will recompile everything twice for any small change. -# -if env.GetBuildType() == "debug": +if env.GetBuildType() == "debug" and env.get('UPLOAD_PROTOCOL') not in ['jlink', 'stlink']: env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' # On some platform, F_CPU is a runtime variable. Since it's used to convert from ns From f36eb4646b23e65e36f0b476bed0177d6230d06d Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 13 Mar 2021 08:37:49 -0500 Subject: [PATCH 1153/1370] Custom menu items confirm option (#21338) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 8 +++++++- Marlin/src/lcd/menu/menu_custom.cpp | 15 ++++++++++++++- Marlin/src/lcd/menu/menu_main.cpp | 12 +++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 9ab3e2d044..fb1f79b230 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3455,22 +3455,28 @@ //#define CUSTOM_USER_MENU_TITLE "Custom Commands" #define USER_SCRIPT_DONE "M117 User Script Done" #define USER_SCRIPT_AUDIBLE_FEEDBACK - //#define USER_SCRIPT_RETURN // Return to status screen after a script + //#define USER_SCRIPT_RETURN // Return to status screen after a script + #define CUSTOM_MENU_ONLY_IDLE // Only show custom menu when the machine is idle #define USER_DESC_1 "Home & UBL Info" #define USER_GCODE_1 "G28\nG29W" + //#define USER_CONFIRM_1 // Show a confirmation dialog before this action #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + //#define USER_CONFIRM_2 #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + //#define USER_CONFIRM_3 #define USER_DESC_4 "Heat Bed/Home/Level" #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + //#define USER_CONFIRM_4 #define USER_DESC_5 "Home & Info" #define USER_GCODE_5 "G28\nM503" + //#define USER_CONFIRM_5 #endif /** diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp index f3f946883f..cc1a8a6e80 100644 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ b/Marlin/src/lcd/menu/menu_custom.cpp @@ -46,7 +46,20 @@ void _lcd_user_gcode(PGM_P const cmd) { void menu_user() { START_MENU(); BACK_ITEM(MSG_MAIN); - #define USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); }); + + #define GCODE_LAMBDA(N) []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); } + #define _USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), GCODE_LAMBDA(N)); + #define _USER_ITEM_CONFIRM(N) \ + SUBMENU_P(PSTR(USER_DESC_##N), []{ \ + MenuItem_confirm::confirm_screen( \ + GCODE_LAMBDA(N), \ + ui.goto_previous_screen, \ + PSTR(USER_DESC_##N "?") \ + ); \ + }) + + #define USER_ITEM(N) do{ if (ENABLED(USER_CONFIRM_##N)) _USER_ITEM_CONFIRM(N); else _USER_ITEM(N); }while(0) + #if HAS_USER_ITEM(1) USER_ITEM(1); #endif diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 1e864e35be..d19e236a84 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -211,11 +211,13 @@ void menu_main() { SUBMENU(MSG_CONFIGURATION, menu_configuration); #if ENABLED(CUSTOM_USER_MENUS) - #ifdef CUSTOM_USER_MENU_TITLE - SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); - #else - SUBMENU(MSG_USER_MENU, menu_user); - #endif + if (TERN1(CUSTOM_MENU_ONLY_IDLE, !busy)) { + #ifdef CUSTOM_USER_MENU_TITLE + SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); + #else + SUBMENU(MSG_USER_MENU, menu_user); + #endif + } #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) From e5ab4a7283b485ee465fcecf67679a86fc66c576 Mon Sep 17 00:00:00 2001 From: XDA-Bam <1209896+XDA-Bam@users.noreply.github.com> Date: Sun, 14 Mar 2021 17:42:25 +0100 Subject: [PATCH 1154/1370] Update display timing for SKR Pro (#21346) --- Marlin/src/pins/sanguino/pins_MELZI_V2.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h index 275498d558..e0369923c7 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_V2.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_V2.h @@ -29,7 +29,7 @@ #define BOARD_ST7920_DELAY_1 DELAY_NS(0) #endif #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(188) + #define BOARD_ST7920_DELAY_2 DELAY_NS(400) #endif #ifndef BOARD_ST7920_DELAY_3 #define BOARD_ST7920_DELAY_3 DELAY_NS(0) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 863429f2a2..01ba3d72f6 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -441,10 +441,10 @@ // Alter timing for graphical display #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #define BOARD_ST7920_DELAY_2 DELAY_NS(90) #endif #ifndef BOARD_ST7920_DELAY_3 #define BOARD_ST7920_DELAY_3 DELAY_NS(600) From b644aca98c637ab12ffa8ec2dc5f63d58ca7f251 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 14 Mar 2021 11:43:20 -0500 Subject: [PATCH 1155/1370] Fix small wired EEPROM (#21337) Co-Authored-By: jafal99 <26922965+jafal99@users.noreply.github.com> --- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index da70af2772..299bc34c49 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -51,6 +51,18 @@ void eeprom_init() { static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRESS); +void _beginTransmission(const uint16_t memoryAddress) { + if (MARLIN_EEPROM_SIZE > 0x4000) { // Use two-byte addressing for EEPROMs >16kb + Wire.beginTransmission(eeprom_device_address); + Wire.write(memoryAddress >> 8); // Address High Byte + } + else { + const uint8_t addr = eeprom_device_address | byte((memoryAddress >> 8) & 0x07); + Wire.beginTransmission(addr); + } + Wire.write(memoryAddress & 0xFF); // Address Low Byte (or only byte for chips <= 16Kb like 24C02/04/08/16) +} + // ------------------------ // Public functions // ------------------------ @@ -58,9 +70,7 @@ static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRE void eeprom_write_byte(uint8_t *pos, unsigned char value) { const unsigned eeprom_address = (unsigned)pos; - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB + _beginTransmission(eeprom_address); Wire.write(value); Wire.endTransmission(); @@ -72,11 +82,12 @@ void eeprom_write_byte(uint8_t *pos, unsigned char value) { uint8_t eeprom_read_byte(uint8_t *pos) { const unsigned eeprom_address = (unsigned)pos; - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB + _beginTransmission(eeprom_address); Wire.endTransmission(); - Wire.requestFrom(eeprom_device_address, (byte)1); + + // For EEPROMs <=16Kb the lower address bits are used for 2Kb page address + const int addr = eeprom_device_address | (MARLIN_EEPROM_SIZE <= 0x4000 ? byte((eeprom_address >> 8) & 0x07) : byte(0)); + Wire.requestFrom(addr, byte(1)); return Wire.available() ? Wire.read() : 0xFF; } From f6f5ed166fd625475c3262a497be66cf58643fbf Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sun, 14 Mar 2021 18:11:11 +0100 Subject: [PATCH 1156/1370] Fix build with Meatpack only on 2nd port (#21336) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/HAL.h | 6 ----- Marlin/src/feature/meatpack.cpp | 1 - Marlin/src/inc/Conditionals_LCD.h | 26 ++++++++++++++----- Marlin/src/inc/Conditionals_adv.h | 7 +++++ Marlin/src/inc/Conditionals_post.h | 13 ---------- .../PlatformIO/scripts/common-dependencies.h | 2 -- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index 9eefda8fb1..0cd836af2b 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -29,12 +29,6 @@ #include HAL_PATH(.,HAL.h) -#ifdef SERIAL_PORT_2 - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 -#endif - #define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) #ifndef I2C_ADDRESS diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 178831c9bb..44567ac482 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -42,7 +42,6 @@ #if HAS_MEATPACK #include "meatpack.h" -MeatPack meatpack; #define MeatPack_ProtocolVersion "PV01" //#define MP_DEBUG diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index e5f7441e77..b9b86a7bf3 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -654,13 +654,6 @@ #define UNUSED_E(E) UNUSED(E) #endif -#if ENABLED(DWIN_CREALITY_LCD) - #define SERIAL_CATCHALL 0 - #ifndef LCD_SERIAL_PORT - #define LCD_SERIAL_PORT 3 // Creality 4.x board - #endif -#endif - /** * The BLTouch Probe emulates a servo probe * and uses "special" angles for its state. @@ -950,6 +943,18 @@ #define HAS_CLASSIC_E_JERK 1 #endif +// +// Serial Port Info +// +#ifdef SERIAL_PORT_2 + #define NUM_SERIAL 2 + #define HAS_MULTI_SERIAL 1 +#elif defined(SERIAL_PORT) + #define NUM_SERIAL 1 +#else + #define NUM_SERIAL 0 + #undef BAUD_RATE_GCODE +#endif #if SERIAL_PORT == -1 || SERIAL_PORT_2 == -1 #define HAS_USB_SERIAL 1 #endif @@ -957,6 +962,13 @@ #define HAS_ETHERNET 1 #endif +#if ENABLED(DWIN_CREALITY_LCD) + #define SERIAL_CATCHALL 0 + #ifndef LCD_SERIAL_PORT + #define LCD_SERIAL_PORT 3 // Creality 4.x board + #endif +#endif + // Fallback Stepper Driver types that don't depend on Configuration_adv.h #ifndef X_DRIVER_TYPE #define X_DRIVER_TYPE A4988 diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 00b9b1faef..490766bd7a 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -542,3 +542,10 @@ #else #define HAS_USER_ITEM(N) 0 #endif + +#if !HAS_MULTI_SERIAL + #undef MEATPACK_ON_SERIAL_PORT_2 +#endif +#if EITHER(MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2) + #define HAS_MEATPACK 1 +#endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index a6567e9714..fb06a7a3f3 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2906,16 +2906,3 @@ #if BUTTONS_EXIST(EN1, EN2, ENC) #define HAS_ROTARY_ENCODER 1 #endif - -#if !NUM_SERIAL - #undef BAUD_RATE_GCODE -#elif NUM_SERIAL > 1 - #define HAS_MULTI_SERIAL 1 -#endif - -#if !HAS_MULTI_SERIAL - #undef MEATPACK_ON_SERIAL_PORT_2 -#endif -#if EITHER(MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2) - #define HAS_MEATPACK 1 -#endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index ed2f46abae..03fae56fdb 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -26,8 +26,6 @@ * Used by common-dependencies.py */ -#define NUM_SERIAL 1 // Normally provided by HAL/HAL.h - #include "../../../../Marlin/src/inc/MarlinConfig.h" // From 0d04dcd9aedc0e8648c62b5cbffc52deb3828028 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 14 Mar 2021 14:14:09 -0300 Subject: [PATCH 1157/1370] Script to generate Marlin TFT Images (#21340) --- buildroot/share/scripts/gen-tft-image.py | 64 ++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 buildroot/share/scripts/gen-tft-image.py diff --git a/buildroot/share/scripts/gen-tft-image.py b/buildroot/share/scripts/gen-tft-image.py new file mode 100644 index 0000000000..d89245fea4 --- /dev/null +++ b/buildroot/share/scripts/gen-tft-image.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# +# Marlin 3D Printer Firmware +# Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +# +# Based on Sprinter and grbl. +# Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Generate Marlin TFT Images from bitmaps/PNG/JPG + +import sys,re,struct +from PIL import Image,ImageDraw + +def image2bin(image, output_file): + if output_file.endswith(('.c', '.cpp')): + f = open(output_file, 'wt') + is_cpp = True + f.write("const uint16_t image[%d] = {\n" % (image.size[1] * image.size[0])) + else: + f = open(output_file, 'wb') + is_cpp = False + pixs = image.load() + for y in range(image.size[1]): + for x in range(image.size[0]): + R = pixs[x, y][0] >> 3 + G = pixs[x, y][1] >> 2 + B = pixs[x, y][2] >> 3 + rgb = (R << 11) | (G << 5) | B + if is_cpp: + strHex = '0x{0:04X}, '.format(rgb) + f.write(strHex) + else: + f.write(struct.pack("B", (rgb & 0xFF))) + f.write(struct.pack("B", (rgb >> 8) & 0xFF)) + if is_cpp: + f.write("\n") + if is_cpp: + f.write("};\n") + f.close() + +if len(sys.argv) <= 2: + print("Utility to export a image in Marlin TFT friendly format.") + print("It will dump a raw bin RGB565 image or create a CPP file with an array of 16 bit image pixels.") + print("Usage: gen-tft-image.py INPUT_IMAGE.(png|bmp|jpg) OUTPUT_FILE.(cpp|bin)") + print("Author: rhapsodyv") + exit(1) + +output_img = sys.argv[2] +img = Image.open(sys.argv[1]) +image2bin(img, output_img) From 35c32602f499532789921558aff0ee5a4abbbeb6 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Mon, 15 Mar 2021 02:23:41 +0100 Subject: [PATCH 1158/1370] Teensy USB / serial followup (#21316) --- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 6 +++++- Marlin/src/HAL/TEENSY31_32/HAL.h | 10 ++++++++-- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 2 +- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 6 +++++- Marlin/src/HAL/TEENSY40_41/HAL.h | 9 +++++++-- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index 8a13f1d884..7b7202547a 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -31,7 +31,11 @@ #include -DefaultSerial1 MSerial0(false); +#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) +#define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) +#if WITHIN(SERIAL_PORT, 0, 3) + IMPLEMENT_SERIAL(SERIAL_PORT); +#endif USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result; diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index cd1c334899..bbfc50a36f 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -51,8 +51,13 @@ #endif #include "../../core/serial_hook.h" -typedef Serial1Class DefaultSerial1; -extern DefaultSerial1 MSerial0; + +#define Serial0 Serial +#define _DECLARE_SERIAL(X) \ + typedef ForwardSerial1Class DefaultSerial##X; \ + extern DefaultSerial##X MSerial##X +#define DECLARE_SERIAL(X) _DECLARE_SERIAL(X) + typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; @@ -62,6 +67,7 @@ extern USBSerialType USBSerial; #if SERIAL_PORT == -1 #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) + DECLARE_SERIAL(SERIAL_PORT); #define MYSERIAL1 MSERIAL(SERIAL_PORT) #endif diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index 8640bdfe00..5d808cd19b 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -31,7 +31,7 @@ #include -#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false) +#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) #define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) #if WITHIN(SERIAL_PORT, 0, 3) IMPLEMENT_SERIAL(SERIAL_PORT); diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index e769454b3f..5b120d852d 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -57,7 +57,7 @@ #define Serial0 Serial #define _DECLARE_SERIAL(X) \ - typedef Serial1Class DefaultSerial##X; \ + typedef ForwardSerial1Class DefaultSerial##X; \ extern DefaultSerial##X MSerial##X #define DECLARE_SERIAL(X) _DECLARE_SERIAL(X) diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index 0fde9da537..1eab3d837e 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -32,7 +32,11 @@ #include -DefaultSerial1 MSerial0(false); +#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) +#define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) +#if WITHIN(SERIAL_PORT, 0, 3) + IMPLEMENT_SERIAL(SERIAL_PORT); +#endif USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result, HAL_adc_select; diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 03a12e1b92..ce985dadb9 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -56,8 +56,12 @@ #endif #include "../../core/serial_hook.h" -typedef Serial1Class DefaultSerial1; -extern DefaultSerial1 MSerial0; +#define Serial0 Serial +#define _DECLARE_SERIAL(X) \ + typedef ForwardSerial1Class DefaultSerial##X; \ + extern DefaultSerial##X MSerial##X +#define DECLARE_SERIAL(X) _DECLARE_SERIAL(X) + typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; @@ -67,6 +71,7 @@ extern USBSerialType USBSerial; #if SERIAL_PORT == -1 #define MYSERIAL1 SerialUSB #elif WITHIN(SERIAL_PORT, 0, 8) + DECLARE_SERIAL(SERIAL_PORT); #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." From a2d2e19f84042e4941cc21f37c9b8d9ba71d6049 Mon Sep 17 00:00:00 2001 From: "K.3D" <40525619+KA8888@users.noreply.github.com> Date: Mon, 15 Mar 2021 17:02:40 +0100 Subject: [PATCH 1159/1370] KRATOS32 / K.32 board and LCD controllers (#21334) --- Marlin/Configuration.h | 16 ++- Marlin/src/core/boards.h | 1 + Marlin/src/inc/Conditionals_LCD.h | 8 +- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.h | 5 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/sam/pins_KRATOS32.h | 179 ++++++++++++++++++++++++++ 8 files changed, 208 insertions(+), 9 deletions(-) create mode 100644 Marlin/src/pins/sam/pins_KRATOS32.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1098351d4e..726ff1ec0b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2181,6 +2181,11 @@ // //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +// +// K.3D Full Graphic Smart Controller +// +//#define K3D_FULL_GRAPHIC_SMART_CONTROLLER + // // ReprapWorld Graphical LCD // https://reprapworld.com/?products_details&products_id/1218 @@ -2318,7 +2323,7 @@ //#define OLED_PANEL_TINYBOY2 // -// MKS OLED 1.3" 128×64 FULL GRAPHICS CONTROLLER +// MKS OLED 1.3" 128×64 Full Graphics Controller // https://reprap.org/wiki/MKS_12864OLED // // Tiny, but very sharp OLED display @@ -2327,7 +2332,7 @@ //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller // -// Zonestar OLED 128×64 FULL GRAPHICS CONTROLLER +// Zonestar OLED 128×64 Full Graphics Controller // //#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller //#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default) @@ -2344,10 +2349,15 @@ //#define OVERLORD_OLED // -// FYSETC OLED 2.42" 128×64 FULL GRAPHICS CONTROLLER with WS2812 RGB +// FYSETC OLED 2.42" 128×64 Full Graphics Controller with WS2812 RGB // Where to find : https://www.aliexpress.com/item/4000345255731.html //#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller +// +// K.3D SSD1309 OLED 2.42" 128×64 Full Graphics Controller +// +//#define K3D_242_OLED_CONTROLLER // Software SPI + //============================================================================= //========================== Extensible UI Displays =========================== //============================================================================= diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index cfde52ddb9..f0d967c763 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -279,6 +279,7 @@ #define BOARD_ARCHIM2 3024 // UltiMachine Archim2 (with TMC2130 drivers) #define BOARD_ALLIGATOR 3025 // Alligator Board R2 #define BOARD_CNCONTROLS_15D 3026 // Cartesio CN Controls V15 on DUE +#define BOARD_KRATOS32 3027 // K.3D Kratos32 (Arduino Due Shield) // // SAM3X8C ARM Cortex M3 diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index b9b86a7bf3..fc7eec84ee 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -229,14 +229,18 @@ #define BOARD_ST7920_DELAY_2 DELAY_NS(125) #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#elif ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING, BQ_LCD_SMART_CONTROLLER) +#elif ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING, BQ_LCD_SMART_CONTROLLER, K3D_FULL_GRAPHIC_SMART_CONTROLLER) #define IS_RRD_FG_SC 1 #elif ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - // RepRapDiscount LCD or Graphical LCD with rotary click encoder + #define IS_RRD_SC 1 // RepRapDiscount LCD or Graphical LCD with rotary click encoder + +#elif ENABLED(K3D_242_OLED_CONTROLLER) + #define IS_RRD_SC 1 + #define U8GLIB_SSD1309 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6802bff1dd..5302aac208 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2372,7 +2372,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(ULTIPANEL) \ + ENABLED(ULTRA_LCD) \ + ENABLED(YHCB2004) \ - + ENABLED(ZONESTAR_LCD) + + ENABLED(ZONESTAR_LCD) \ + + ENABLED(K3D_FULL_GRAPHIC_SMART_CONTROLLER) \ + + ENABLED(K3D_242_OLED_CONTROLLER) #error "Please select only one LCD controller option." #endif diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index d2b1ce7740..7334ba5f26 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -256,7 +256,7 @@ void MarlinUI::init_lcd() { OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away #endif - #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED, K3D_242_OLED_CONTROLLER) SET_OUTPUT(LCD_PINS_DC); #ifndef LCD_RESET_PIN #define LCD_RESET_PIN LCD_PINS_RS diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index e5862d670f..e3ceb63f96 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -123,9 +123,10 @@ #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes #endif -#elif ENABLED(FYSETC_242_OLED_12864) +#elif EITHER(FYSETC_242_OLED_12864, K3D_242_OLED_CONTROLLER) - // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER + // FYSETC OLED 2.42" 128 × 64 Full Graphics Controller + // or K3D OLED 2.42" 128 × 64 Full Graphics Controller #define FORCE_SOFT_SPI // SW-SPI diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index b8cf695fb5..58a87f2313 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -447,6 +447,8 @@ #include "sam/pins_PRINTRBOARD_G2.h" // SAM3X8C env:DUE_USB #elif MB(CNCONTROLS_15D) #include "sam/pins_CNCONTROLS_15D.h" // SAM3X8E env:DUE env:DUE_USB +#elif MB(KRATOS32) + #include "sam/pins_KRATOS32.h" // SAM3X8E env:DUE env:DUE_USB // // STM32 ARM Cortex-M0 diff --git a/Marlin/src/pins/sam/pins_KRATOS32.h b/Marlin/src/pins/sam/pins_KRATOS32.h new file mode 100644 index 0000000000..f429e56347 --- /dev/null +++ b/Marlin/src/pins/sam/pins_KRATOS32.h @@ -0,0 +1,179 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * KRATOS32 + */ + +#include "env_validate.h" + +#define BOARD_INFO_NAME "K.3D KRATOS32" + +// +// EEPROM +// +#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) + #define I2C_EEPROM + #define MARLIN_EEPROM_SIZE 0x1F400 // 16KB +#endif + +// +// Servos +// +#define SERVO0_PIN 6 +#define SERVO1_PIN 5 +#define SERVO2_PIN 39 +#define SERVO3_PIN 40 // CAMERA_PIN (extended to the top of the LCD module) +#define SERVO4_PIN 45 // FIL_RUNOUT_PIN + +// +// Limit Switches +// +#define X_MIN_PIN 28 +#define X_MAX_PIN 34 +#define Y_MIN_PIN 30 +#define Y_MAX_PIN 36 +#define Z_MIN_PIN 32 +#define Z_MAX_PIN 38 + +// +// Steppers +// +#define X_STEP_PIN 24 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 26 +#ifndef X_CS_PIN + #define X_CS_PIN 25 +#endif + +#define Y_STEP_PIN 17 +#define Y_DIR_PIN 16 +#define Y_ENABLE_PIN 22 +#ifndef Y_CS_PIN + #define Y_CS_PIN 27 +#endif + +#define Z_STEP_PIN 2 +#define Z_DIR_PIN 3 +#define Z_ENABLE_PIN 15 +#ifndef Z_CS_PIN + #define Z_CS_PIN 29 +#endif + +#define E0_STEP_PIN 61 +#define E0_DIR_PIN 60 +#define E0_ENABLE_PIN 62 +#ifndef E0_CS_PIN + #define E0_CS_PIN 31 +#endif + +#define E1_STEP_PIN 64 +#define E1_DIR_PIN 63 +#define E1_ENABLE_PIN 65 +#ifndef E1_CS_PIN + #define E1_CS_PIN 37 +#endif + +#define E2_STEP_PIN 68 +#define E2_DIR_PIN 67 +#define E2_ENABLE_PIN 69 +#ifndef E2_CS_PIN + #define E2_CS_PIN 35 +#endif + +#define E3_STEP_PIN 51 +#define E3_DIR_PIN 53 +#define E3_ENABLE_PIN 49 +#ifndef E3_CS_PIN + #define E3_CS_PIN 33 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_2_PIN 2 // Analog Input +#define TEMP_3_PIN 3 // Analog Input +#define TEMP_BED_PIN 4 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_3_PIN 10 +#define HEATER_BED_PIN 7 // BED + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#define FAN1_PIN 8 + +// +// Misc. Functions +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 45 // SERVO4_PIN +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 59 +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #define BTN_EN1 48 + #define BTN_EN2 50 + #define BTN_ENC 46 + + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #define BEEPER_PIN 41 + #define KILL_PIN 66 + + #if IS_RRD_FG_SC + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + + #define BTN_BACK 52 + + #elif ENABLED(K3D_242_OLED_CONTROLLER) + + #define LCD_PINS_DC 44 + #define LCD_PINS_RS 42 + #define DOGLCD_CS 52 + #define DOGLCD_MOSI 43 + #define DOGLCD_SCK 47 + #define DOGLCD_A0 LCD_PINS_DC + + #endif + +#endif // HAS_WIRED_LCD From f5d612b21394a19398eb15db1b5a7d48085041ab Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 16 Mar 2021 17:33:10 -0500 Subject: [PATCH 1160/1370] Detect extra ENVS in preflight checks (#21361) --- .../PlatformIO/scripts/preflight-checks.py | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 969a82aad2..4499c2bfdc 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -2,33 +2,34 @@ # preflight-checks.py # Check for common issues prior to compiling # -import os,re +import os,re,sys Import("env") -def get_envs_for_board(board): - if board.startswith("BOARD_"): - board = board[6:] - with open(os.path.join("Marlin", "src", "pins", "pins.h"),"r") as f: - board_found = "" - r=re.compile(r"if\s+MB\((.+)\)") - for line in f.readlines(): +def get_envs_for_board(board, envregex): + with open(os.path.join("Marlin", "src", "pins", "pins.h"), "r") as file: + r = re.compile(r"if\s+MB\((.+)\)") + if board.startswith("BOARD_"): + board = board[6:] + + for line in file: mbs = r.findall(line) - if mbs: - board_found = board if board in re.split(r",\s*", mbs[0]) else "" - if board_found and "#include " in line and "env:" in line: - return re.findall(r"env:\w+", line) + if mbs and board in re.split(r",\s*", mbs[0]): + line = file.readline() + found_envs = re.match(r"\s*#include .+" + envregex, line) + if found_envs: + return re.findall(envregex + r"(\w+)", line) return [] -def check_envs(build_env, base_envs, config): - if build_env in base_envs: +def check_envs(build_env, board_envs, config): + if build_env in board_envs: return True ext = config.get(build_env, 'extends', default=None) if ext: if isinstance(ext, str): - return check_envs(ext, base_envs, config) + return check_envs(ext, board_envs, config) elif isinstance(ext, list): for ext_env in ext: - if check_envs(ext_env, base_envs, config): + if check_envs(ext_env, board_envs, config): return True return False @@ -42,15 +43,24 @@ if 'MARLIN_FEATURES' not in env: if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") +if sys.platform == 'win32': + osregex = r"(?:env|win):" +elif sys.platform == 'darwin': + osregex = r"(?:env|mac|uni):" +elif sys.platform == 'linux': + osregex = r"(?:env|lin|uni):" +else: + osregex = r"(?:env):" + build_env = env['PIOENV'] motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] -base_envs = get_envs_for_board(motherboard) +board_envs = get_envs_for_board(motherboard, osregex) config = env.GetProjectConfig() -result = check_envs("env:"+build_env, base_envs, config) +result = check_envs(build_env, board_envs, config) if not result: err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ - (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) + (build_env, motherboard, ",".join([e[4:] for e in board_envs if re.match(r"^" + osregex, e)])) raise SystemExit(err) # From 86a8e8970a78a307351c6a2a9d47a9862e73a357 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 02:39:26 -0500 Subject: [PATCH 1161/1370] mftest: usage with error --- buildroot/bin/mftest | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index d769ff8cb8..4cecf4f3a5 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -30,7 +30,6 @@ OPTIONS -v --verbose Extra output for debugging. env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41 - " } @@ -58,47 +57,48 @@ while getopts 'abhmruvyn:t:-:' OFLAG; do h) EXIT_USAGE=1 ;; m) USE_MAKE=1 ; bugout "Using make with Docker..." ;; n) case "$OPTARG" in - *[!0-9]*) perror "option requires a number" $OFLAG ; EXIT_USAGE=1 ;; + *[!0-9]*) perror "option requires a number" $OFLAG ; EXIT_USAGE=2 ;; *) CHOICE="$OPTARG" ; bugout "Got a number: $CHOICE" ;; esac ;; - r) REBUILD=1 ; bugout "Rebuilding previous..." ;; + r) REBUILD=1 ; bugout "Rebuilding previous..." ;; t) TESTENV="$OPTARG" ; bugout "Got a target: $TESTENV" ;; - u) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; + u) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; v) DEBUG=1 ; bugout "Debug ON" ;; - y) BUILD_YES='Y' ; bugout "Build will initiate..." ;; + y) BUILD_YES='Y' ; bugout "Build will initiate..." ;; -) IFS="=" read -r ONAM OVAL <<< "$OPTARG" case "$ONAM" in help) [[ -z "$OVAL" ]] || perror "option can't take value $OVAL" $ONAM ; EXIT_USAGE=1 ;; autobuild) AUTO_BUILD=1 ; bugout "Auto-Build target..." ;; autoupload) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; env) case "$OVAL" in - '') perror "option requires a value" $ONAM ; EXIT_USAGE=1 ;; + '') perror "option requires a value" $ONAM ; EXIT_USAGE=2 ;; *) TESTENV="$OVAL" ; bugout "Got a target: $TESTENV" ;; esac ;; num) case "$OVAL" in [0-9]+) CHOICE="$OVAL" ; bugout "Got a number: $CHOICE" ;; - *) perror "option requires a value" $ONAM ; EXIT_USAGE=1 ;; + *) perror "option requires a value" $ONAM ; EXIT_USAGE=2 ;; esac ;; - rebuild) REBUILD=1 ; bugout "Rebuilding previous..." ;; - make) USE_MAKE=1 ; bugout "Using make with Docker..." ;; -debug|verbose) DEBUG=1 ; bugout "Debug ON" ;; + rebuild) REBUILD=1 ; bugout "Rebuilding previous..." ;; + make) USE_MAKE=1 ; bugout "Using make with Docker..." ;; +debug|verbose) DEBUG=1 ; bugout "Debug ON" ;; build) case "$OVAL" in ''|y|yes) BUILD_YES='Y' ;; n|no) BUILD_YES='N' ;; - *) perror "option value must be y, n, yes, or no" $ONAM ; EXIT_USAGE=1 ;; + *) perror "option value must be y, n, yes, or no" $ONAM ; EXIT_USAGE=2 ;; esac bugout "Build will initiate? ($BUILD_YES)" ;; - *) perror "Unknown flag" "$OPTARG" ; EXIT_USAGE=1 ;; + *) perror "Unknown flag" "$OPTARG" ; EXIT_USAGE=2 ;; esac ;; + *) EXIT_USAGE=2 ;; esac done -((EXIT_USAGE)) && { usage ; exit 1 ; } +((EXIT_USAGE)) && { usage ; let EXIT_USAGE-- ; exit $EXIT_USAGE ; } if ((REBUILD)); then bugout "Rebuilding previous..." From 3bbcfb0185dcb6dce7d342932f0a84b25cd80392 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 19:24:07 -0500 Subject: [PATCH 1162/1370] Update setup() description --- Marlin/src/MarlinCore.cpp | 116 +++++++++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 27 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e1756af511..158f9e227a 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -953,23 +953,92 @@ inline void tmc_standby_setup() { } /** - * Marlin entry-point: Set up before the program loop - * - Set up the kill pin, filament runout, power hold, custom user buttons - * - Start the serial port + * Marlin Firmware entry-point. Abandon Hope All Ye Who Enter Here. + * Setup before the program loop: + * + * - Call any special pre-init set for the board + * - Put TMC drivers into Low Power Standby mode + * - Init the serial ports (so setup can be debugged) + * - Set up the kill and suicide pins + * - Prepare (disable) board JTAG and Debug ports + * - Init serial for a connected MKS TFT with WiFi + * - Install Marlin custom Exception Handlers, if set. + * - Init Marlin's HAL interfaces (for SPI, i2c, etc.) + * - Init some optional hardware and features: + * • MAX Thermocouple pins + * • Duet Smart Effector + * • Filament Runout Sensor + * • TMC220x Stepper Drivers (Serial) + * • PSU control + * • Power-loss Recovery + * • L64XX Stepper Drivers (SPI) + * • Stepper Driver Reset: DISABLE + * • TMC Stepper Drivers (SPI) + * • Run BOARD_INIT if defined + * • ESP WiFi + * - Get the Reset Reason and report it * - Print startup messages and diagnostics - * - Get EEPROM or default settings - * - Initialize managers for: - * • temperature - * • planner - * • watchdog - * • stepper - * • photo pin - * • servos - * • LCD controller - * • Digipot I2C - * • Z probe sled - * • status LEDs - * • Max7219 + * - Calibrate the HAL DELAY for precise timing + * - Init the buzzer, possibly a custom timer + * - Init more optional hardware: + * • Color LED illumination + * • Neopixel illumination + * • Controller Fan + * • Creality DWIN LCD (show boot image) + * • Tare the Probe if possible + * - Mount the (most likely external) SD Card + * - Load settings from EEPROM (or use defaults) + * - Init the Ethernet Port + * - Init Touch Buttons (for emulated DOGLCD) + * - Adjust the (certainly wrong) current position by the home offset + * - Init the Planner::position (steps) based on current (native) position + * - Initialize more managers and peripherals: + * • Temperatures + * • Print Job Timer + * • Endstops and Endstop Interrupts + * • Stepper ISR - Kind of Important! + * • Servos + * • Servo-based Probe + * • Photograph Pin + * • Laser/Spindle tool Power / PWM + * • Coolant Control + * • Bed Probe + * • Stepper Driver Reset: ENABLE + * • Digipot I2C - Stepper driver current control + * • Stepper DAC - Stepper driver current control + * • Solenoid (probe, or for other use) + * • Home Pin + * • Custom User Buttons + * • Red/Blue Status LEDs + * • Case Light + * • Prusa MMU filament changer + * • Fan Multiplexer + * • Mixing Extruder + * • BLTouch Probe + * • I2C Position Encoders + * • Custom I2C Bus handlers + * • Enhanced tools or extruders: + * • Switching Extruder + * • Switching Nozzle + * • Parking Extruder + * • Magnetic Parking Extruder + * • Switching Toolhead + * • Electromagnetic Switching Toolhead + * • Watchdog Timer - Also Kind of Important! + * • Closed Loop Controller + * - Run Startup Commands, if defined + * - Tell host to close Host Prompts + * - Test Trinamic driver connections + * - Init Prusa MMU2 filament changer + * - Init and test BL24Cxx EEPROM + * - Init Creality DWIN encoder, show faux progress bar + * - Reset Status Message / Show Service Messages + * - Init MAX7219 LED Matrix + * - Init Direct Stepping (Klipper-style motion control) + * - Init TFT LVGL UI (with 3D Graphics) + * - Apply Password Lock - Hold for Authentication + * - Open Touch Screen Calibration screen, if not calibrated + * - Set Marlin to RUNNING State */ void setup() { #ifdef BOARD_PREINIT @@ -1311,7 +1380,6 @@ void setup() { #if PIN_EXISTS(STAT_LED_RED) OUT_WRITE(STAT_LED_RED_PIN, LOW); // OFF #endif - #if PIN_EXISTS(STAT_LED_BLUE) OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // OFF #endif @@ -1364,19 +1432,13 @@ void setup() { #endif #endif - #if ENABLED(MAGNETIC_PARKING_EXTRUDER) - SETUP_RUN(mpe_settings_init()); - #endif - #if ENABLED(PARKING_EXTRUDER) SETUP_RUN(pe_solenoid_init()); - #endif - - #if ENABLED(SWITCHING_TOOLHEAD) + #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) + SETUP_RUN(mpe_settings_init()); + #elif ENABLED(SWITCHING_TOOLHEAD) SETUP_RUN(swt_init()); - #endif - - #if ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) SETUP_RUN(est_init()); #endif From e0711d87a08b6b11349ee7cf2ff101a8f9bc25bb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 19:23:36 -0500 Subject: [PATCH 1163/1370] Un-pause fans on STOP --- Marlin/src/MarlinCore.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 158f9e227a..26ca8305f4 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -889,8 +889,8 @@ void stop() { print_job_timer.stop(); - #if ENABLED(PROBING_FANS_OFF) - if (thermalManager.fans_paused) thermalManager.set_fans_paused(false); // put things back the way they were + #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) + thermalManager.set_fans_paused(false); // Un-pause fans for safety #endif if (IsRunning()) { From 7973b954b4689dc6c89b842a29f8bd6c3fb3be1b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 16 Mar 2021 15:12:28 -0500 Subject: [PATCH 1164/1370] E1+ Autotemp and Planner comments --- Marlin/src/lcd/extui/ui_api.cpp | 2 - Marlin/src/module/planner.cpp | 171 +++++++++++++++++++------------- Marlin/src/module/planner.h | 35 +++++-- 3 files changed, 131 insertions(+), 77 deletions(-) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index d83b921648..97d4ec2b08 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -587,13 +587,11 @@ namespace ExtUI { void setAxisMaxAcceleration_mm_s2(const float &value, const axis_t axis) { planner.set_max_acceleration(axis, value); - planner.reset_acceleration_rates(); } void setAxisMaxAcceleration_mm_s2(const float &value, const extruder_t extruder) { UNUSED_E(extruder); planner.set_max_acceleration(E_AXIS_N(extruder - E0), value); - planner.reset_acceleration_rates(); } #if HAS_FILAMENT_SENSOR diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index dd87a0d24d..c60e9f6cd3 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1248,32 +1248,6 @@ void Planner::recalculate() { recalculate_trapezoids(); } -#if ENABLED(AUTOTEMP) - - void Planner::getHighESpeed() { - static float oldt = 0; - - if (!autotemp_enabled) return; - if (thermalManager.degTargetHotend(0) + 2 < autotemp_min) return; // probably temperature set to zero. - - float high = 0.0; - for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { - block_t* block = &block_buffer[b]; - if (block->steps.x || block->steps.y || block->steps.z) { - const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; - NOLESS(high, se); - } - } - - float t = autotemp_min + high * autotemp_factor; - LIMIT(t, autotemp_min, autotemp_max); - if (t < oldt) t = t * (1 - float(AUTOTEMP_OLDWEIGHT)) + oldt * float(AUTOTEMP_OLDWEIGHT); - oldt = t; - thermalManager.setTargetHotend(t, 0); - } - -#endif // AUTOTEMP - /** * Maintain fans, paste extruder pressure, */ @@ -1398,6 +1372,72 @@ void Planner::check_axes_activity() { #endif } +#if ENABLED(AUTOTEMP) + + #if ENABLED(AUTOTEMP_PROPORTIONAL) + void Planner::_autotemp_update_from_hotend() { + const int16_t target = thermalManager.degTargetHotend(active_extruder); + autotemp_min = target + AUTOTEMP_MIN_P; + autotemp_max = target + AUTOTEMP_MAX_P; + } + #endif + + /** + * Called after changing tools to: + * - Reset or re-apply the default proportional autotemp factor. + * - Enable autotemp if the factor is non-zero. + */ + void Planner::autotemp_update() { + _autotemp_update_from_hotend(); + autotemp_factor = TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); + autotemp_enabled = autotemp_factor != 0; + } + + /** + * Called by the M104/M109 commands after setting Hotend Temperature + * + */ + void Planner::autotemp_M104_M109() { + _autotemp_update_from_hotend(); + + if (parser.seenval('S')) autotemp_min = parser.value_celsius(); + if (parser.seenval('B')) autotemp_max = parser.value_celsius(); + + // When AUTOTEMP_PROPORTIONAL is enabled, F0 disables autotemp. + // Normally, leaving off F also disables autotemp. + autotemp_factor = parser.seen('F') ? parser.value_float() : TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); + autotemp_enabled = autotemp_factor != 0; + } + + /** + * Called every so often to adjust the hotend target temperature + * based on the extrusion speed, which is calculated from the blocks + * currently in the planner. + */ + void Planner::getHighESpeed() { + static float oldt = 0; + + if (!autotemp_enabled) return; + if (thermalManager.degTargetHotend(active_extruder) < autotemp_min - 2) return; // Below the min? + + float high = 0.0; + for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { + block_t* block = &block_buffer[b]; + if (block->steps.x || block->steps.y || block->steps.z) { + const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; + NOLESS(high, se); + } + } + + float t = autotemp_min + high * autotemp_factor; + LIMIT(t, autotemp_min, autotemp_max); + if (t < oldt) t *= (1.0f - (AUTOTEMP_OLDWEIGHT)) + oldt * (AUTOTEMP_OLDWEIGHT); + oldt = t; + thermalManager.setTargetHotend(t, active_extruder); + } + +#endif + #if DISABLED(NO_VOLUMETRICS) /** @@ -2959,13 +2999,17 @@ void Planner::reset_acceleration_rates() { TERN_(HAS_LINEAR_E_JERK, recalculate_max_e_jerk()); } -// Recalculate position, steps_to_mm if settings.axis_steps_per_mm changes! +/** + * Recalculate 'position' and 'steps_to_mm'. + * Must be called whenever settings.axis_steps_per_mm changes! + */ void Planner::refresh_positioning() { LOOP_XYZE_N(i) steps_to_mm[i] = 1.0f / settings.axis_steps_per_mm[i]; set_position_mm(current_position); reset_acceleration_rates(); } +// Apply limits to a variable and give a warning if the value was out of range inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_name, const xyze_float_t &max_limit) { const uint8_t lim_axis = axis > E_AXIS ? E_AXIS : axis; const float before = val; @@ -2978,7 +3022,14 @@ inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_n } } -void Planner::set_max_acceleration(const uint8_t axis, float targetValue) { +/** + * For the specified 'axis' set the Maximum Acceleration to the given value (mm/s^2) + * The value may be limited with warning feedback, if configured. + * Calls reset_acceleration_rates to precalculate planner terms in steps. + * + * This hard limit is applied as a block is being added to the planner queue. + */ +void Planner::set_max_acceleration(const uint8_t axis, const float &inMaxAccelMMS2) { #if ENABLED(LIMITED_MAX_ACCEL_EDITING) #ifdef MAX_ACCEL_EDIT_VALUES constexpr xyze_float_t max_accel_edit = MAX_ACCEL_EDIT_VALUES; @@ -2987,15 +3038,21 @@ void Planner::set_max_acceleration(const uint8_t axis, float targetValue) { constexpr xyze_float_t max_accel_edit = DEFAULT_MAX_ACCELERATION; const xyze_float_t max_acc_edit_scaled = max_accel_edit * 2; #endif - limit_and_warn(targetValue, axis, PSTR("Acceleration"), max_acc_edit_scaled); + limit_and_warn(inMaxAccelMMS2, axis, PSTR("Acceleration"), max_acc_edit_scaled); #endif - settings.max_acceleration_mm_per_s2[axis] = targetValue; + settings.max_acceleration_mm_per_s2[axis] = inMaxAccelMMS2; // Update steps per s2 to agree with the units per s2 (since they are used in the planner) reset_acceleration_rates(); } -void Planner::set_max_feedrate(const uint8_t axis, float targetValue) { +/** + * For the specified 'axis' set the Maximum Feedrate to the given value (mm/s) + * The value may be limited with warning feedback, if configured. + * + * This hard limit is applied as a block is being added to the planner queue. + */ +void Planner::set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS) { #if ENABLED(LIMITED_MAX_FR_EDITING) #ifdef MAX_FEEDRATE_EDIT_VALUES constexpr xyze_float_t max_fr_edit = MAX_FEEDRATE_EDIT_VALUES; @@ -3004,13 +3061,20 @@ void Planner::set_max_feedrate(const uint8_t axis, float targetValue) { constexpr xyze_float_t max_fr_edit = DEFAULT_MAX_FEEDRATE; const xyze_float_t max_fr_edit_scaled = max_fr_edit * 2; #endif - limit_and_warn(targetValue, axis, PSTR("Feedrate"), max_fr_edit_scaled); + limit_and_warn(inMaxFeedrateMMS, axis, PSTR("Feedrate"), max_fr_edit_scaled); #endif - settings.max_feedrate_mm_s[axis] = targetValue; + settings.max_feedrate_mm_s[axis] = inMaxFeedrateMMS; } -void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { - #if HAS_CLASSIC_JERK +#if HAS_CLASSIC_JERK + + /** + * For the specified 'axis' set the Maximum Jerk (instant change) to the given value (mm/s) + * The value may be limited with warning feedback, if configured. + * + * This hard limit is applied (to the block start speed) as the block is being added to the planner queue. + */ + void Planner::set_max_jerk(const AxisEnum axis, const float &targetValue) { #if ENABLED(LIMITED_JERK_EDITING) constexpr xyze_float_t max_jerk_edit = #ifdef MAX_JERK_EDIT_VALUES @@ -3023,10 +3087,9 @@ void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { limit_and_warn(targetValue, axis, PSTR("Jerk"), max_jerk_edit); #endif max_jerk[axis] = targetValue; - #else - UNUSED(axis); UNUSED(targetValue); - #endif -} + } + +#endif #if HAS_WIRED_LCD @@ -3069,33 +3132,3 @@ void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { } #endif - -#if ENABLED(AUTOTEMP) - -void Planner::autotemp_update() { - #if ENABLED(AUTOTEMP_PROPORTIONAL) - const int16_t target = thermalManager.degTargetHotend(active_extruder); - autotemp_min = target + AUTOTEMP_MIN_P; - autotemp_max = target + AUTOTEMP_MAX_P; - #endif - autotemp_factor = TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); - autotemp_enabled = autotemp_factor != 0; -} - - void Planner::autotemp_M104_M109() { - - #if ENABLED(AUTOTEMP_PROPORTIONAL) - const int16_t target = thermalManager.degTargetHotend(active_extruder); - autotemp_min = target + AUTOTEMP_MIN_P; - autotemp_max = target + AUTOTEMP_MAX_P; - #endif - - if (parser.seenval('S')) autotemp_min = parser.value_celsius(); - if (parser.seenval('B')) autotemp_max = parser.value_celsius(); - - // When AUTOTEMP_PROPORTIONAL is enabled, F0 disables autotemp. - // Normally, leaving off F also disables autotemp. - autotemp_factor = parser.seen('F') ? parser.value_float() : TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); - autotemp_enabled = autotemp_factor != 0; - } -#endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index b7ff0ee932..a7aabd9d65 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -460,12 +460,27 @@ class Planner { * Static (class) Methods */ + // Recalculate steps/s^2 accelerations based on mm/s^2 settings static void reset_acceleration_rates(); - static void refresh_positioning(); - static void set_max_acceleration(const uint8_t axis, float targetValue); - static void set_max_feedrate(const uint8_t axis, float targetValue); - static void set_max_jerk(const AxisEnum axis, float targetValue); + /** + * Recalculate 'position' and 'steps_to_mm'. + * Must be called whenever settings.axis_steps_per_mm changes! + */ + static void refresh_positioning(); + + // For an axis set the Maximum Acceleration in mm/s^2 + static void set_max_acceleration(const uint8_t axis, const float &inMaxAccelMMS2); + + // For an axis set the Maximum Feedrate in mm/s + static void set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS); + + // For an axis set the Maximum Jerk (instant change) in mm/s + #if HAS_CLASSIC_JERK + static void set_max_jerk(const AxisEnum axis, const float &inMaxJerkMMS); + #else + static inline void set_max_jerk(const AxisEnum, const float&) {} + #endif #if EXTRUDERS FORCE_INLINE static void refresh_e_factor(const uint8_t e) { @@ -883,9 +898,9 @@ class Planner { #if ENABLED(AUTOTEMP) static float autotemp_min, autotemp_max, autotemp_factor; static bool autotemp_enabled; - static void getHighESpeed(); - static void autotemp_M104_M109(); static void autotemp_update(); + static void autotemp_M104_M109(); + static void getHighESpeed(); #endif #if HAS_LINEAR_E_JERK @@ -898,6 +913,14 @@ class Planner { private: + #if ENABLED(AUTOTEMP) + #if ENABLED(AUTOTEMP_PROPORTIONAL) + static void _autotemp_update_from_hotend(); + #else + static inline void _autotemp_update_from_hotend() {} + #endif + #endif + /** * Get the index of the next / previous block in the ring buffer */ From dec9b9ad2feb8eb9c351eb73a52ffbc14e651953 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 02:48:21 -0500 Subject: [PATCH 1165/1370] Minor E3 V2 dwin cleanup --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index e046bb90f5..97a9fbd4da 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1469,19 +1469,21 @@ void HMI_PrintSpeed() { } } +#define LAST_AXIS TERN(HAS_HOTEND, E_AXIS, Z_AXIS) + void HMI_MaxFeedspeedXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Feedspeed)) { checkkey = MaxSpeed; EncoderRate.enabled = false; - if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, LAST_AXIS)) planner.set_max_feedrate(HMI_flag.feedspeed_axis, HMI_ValueStruct.Max_Feedspeed); DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); return; } // MaxFeedspeed limit - if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, LAST_AXIS)) NOMORE(HMI_ValueStruct.Max_Feedspeed, default_max_feedrate[HMI_flag.feedspeed_axis] * 2); if (HMI_ValueStruct.Max_Feedspeed < MIN_MAXFEEDSPEED) HMI_ValueStruct.Max_Feedspeed = MIN_MAXFEEDSPEED; // MaxFeedspeed value @@ -1495,17 +1497,13 @@ void HMI_MaxAccelerationXYZE() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Acceleration)) { checkkey = MaxAcceleration; EncoderRate.enabled = false; - if (HMI_flag.acc_axis == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_axis == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_axis == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration); - #if HAS_HOTEND - else if (HMI_flag.acc_axis == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); - #endif + if (WITHIN(HMI_flag.acc_axis, X_AXIS, LAST_AXIS)) + planner.set_max_acceleration(HMI_flag.acc_axis, HMI_ValueStruct.Max_Acceleration); DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); return; } // MaxAcceleration limit - if (WITHIN(HMI_flag.acc_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.acc_axis, X_AXIS, LAST_AXIS)) NOMORE(HMI_ValueStruct.Max_Acceleration, default_max_acceleration[HMI_flag.acc_axis] * 2); if (HMI_ValueStruct.Max_Acceleration < MIN_MAXACCELERATION) HMI_ValueStruct.Max_Acceleration = MIN_MAXACCELERATION; // MaxAcceleration value @@ -1521,13 +1519,13 @@ void HMI_MaxAccelerationXYZE() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk_scaled)) { checkkey = MaxJerk; EncoderRate.enabled = false; - if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.jerk_axis, X_AXIS, LAST_AXIS)) planner.set_max_jerk(HMI_flag.jerk_axis, HMI_ValueStruct.Max_Jerk_scaled / 10); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk_scaled); return; } // MaxJerk limit - if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.jerk_axis, X_AXIS, LAST_AXIS)) NOMORE(HMI_ValueStruct.Max_Jerk_scaled, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Jerk_scaled, (MIN_MAXJERK) * MINUNITMULT); // MaxJerk value @@ -1543,13 +1541,13 @@ void HMI_StepXYZE() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Step_scaled)) { checkkey = Step; EncoderRate.enabled = false; - if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.step_axis, X_AXIS, LAST_AXIS)) planner.settings.axis_steps_per_mm[HMI_flag.step_axis] = HMI_ValueStruct.Max_Step_scaled / 10; DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step_scaled); return; } // Step limit - if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.step_axis, X_AXIS, LAST_AXIS)) NOMORE(HMI_ValueStruct.Max_Step_scaled, 999.9 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Step_scaled, MIN_STEP); // Step value From 7cfaa50148270aa9d5cf2580944601ea2aee021b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 21:36:10 -0500 Subject: [PATCH 1166/1370] Revert "Fix small wired EEPROM (#21337)" Reverting commit cc3e878f90 pending further investigation. --- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index 299bc34c49..da70af2772 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -51,18 +51,6 @@ void eeprom_init() { static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRESS); -void _beginTransmission(const uint16_t memoryAddress) { - if (MARLIN_EEPROM_SIZE > 0x4000) { // Use two-byte addressing for EEPROMs >16kb - Wire.beginTransmission(eeprom_device_address); - Wire.write(memoryAddress >> 8); // Address High Byte - } - else { - const uint8_t addr = eeprom_device_address | byte((memoryAddress >> 8) & 0x07); - Wire.beginTransmission(addr); - } - Wire.write(memoryAddress & 0xFF); // Address Low Byte (or only byte for chips <= 16Kb like 24C02/04/08/16) -} - // ------------------------ // Public functions // ------------------------ @@ -70,7 +58,9 @@ void _beginTransmission(const uint16_t memoryAddress) { void eeprom_write_byte(uint8_t *pos, unsigned char value) { const unsigned eeprom_address = (unsigned)pos; - _beginTransmission(eeprom_address); + Wire.beginTransmission(eeprom_device_address); + Wire.write(int(eeprom_address >> 8)); // MSB + Wire.write(int(eeprom_address & 0xFF)); // LSB Wire.write(value); Wire.endTransmission(); @@ -82,12 +72,11 @@ void eeprom_write_byte(uint8_t *pos, unsigned char value) { uint8_t eeprom_read_byte(uint8_t *pos) { const unsigned eeprom_address = (unsigned)pos; - _beginTransmission(eeprom_address); + Wire.beginTransmission(eeprom_device_address); + Wire.write(int(eeprom_address >> 8)); // MSB + Wire.write(int(eeprom_address & 0xFF)); // LSB Wire.endTransmission(); - - // For EEPROMs <=16Kb the lower address bits are used for 2Kb page address - const int addr = eeprom_device_address | (MARLIN_EEPROM_SIZE <= 0x4000 ? byte((eeprom_address >> 8) & 0x07) : byte(0)); - Wire.requestFrom(addr, byte(1)); + Wire.requestFrom(eeprom_device_address, (byte)1); return Wire.available() ? Wire.read() : 0xFF; } From f49dc906555b127c7832273fbfe1526f36cde329 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 21:26:25 -0500 Subject: [PATCH 1167/1370] Move web-ui out of Marlin root folder --- .../web-ui/data}/www/bootstrap.min.css | 0 .../web-ui/data}/www/bootstrap.min.js | 0 .../web-ui/data}/www/bootstrap4-toggle.min.js | 0 .../web-ui/data}/www/chart.lineargauge.js | 0 {data => buildroot/web-ui/data}/www/chart.min.js | 0 .../web-ui/data}/www/filesaver.min.js | 0 {data => buildroot/web-ui/data}/www/index-ie.html | 0 {data => buildroot/web-ui/data}/www/index.html | 0 .../web-ui/data}/www/jquery-3.5.1.slim.min.js | 0 .../web-ui/data}/www/jquery.browser.min.js | 0 .../web-ui/data}/www/marlin-logo-dark.png | Bin {data => buildroot/web-ui/data}/www/marlinui.eot | Bin {data => buildroot/web-ui/data}/www/marlinui.svg | 0 {data => buildroot/web-ui/data}/www/marlinui.ttf | Bin {data => buildroot/web-ui/data}/www/marlinui.woff | Bin {data => buildroot/web-ui/data}/www/moment.min.js | 0 .../web-ui/data}/www/webmarlin-class.js | 0 .../web-ui/data}/www/webmarlin-font.css | 0 {data => buildroot/web-ui/data}/www/webmarlin.css | 0 {data => buildroot/web-ui/data}/www/webmarlin.js | 0 20 files changed, 0 insertions(+), 0 deletions(-) rename {data => buildroot/web-ui/data}/www/bootstrap.min.css (100%) rename {data => buildroot/web-ui/data}/www/bootstrap.min.js (100%) rename {data => buildroot/web-ui/data}/www/bootstrap4-toggle.min.js (100%) rename {data => buildroot/web-ui/data}/www/chart.lineargauge.js (100%) rename {data => buildroot/web-ui/data}/www/chart.min.js (100%) rename {data => buildroot/web-ui/data}/www/filesaver.min.js (100%) rename {data => buildroot/web-ui/data}/www/index-ie.html (100%) rename {data => buildroot/web-ui/data}/www/index.html (100%) rename {data => buildroot/web-ui/data}/www/jquery-3.5.1.slim.min.js (100%) rename {data => buildroot/web-ui/data}/www/jquery.browser.min.js (100%) rename {data => buildroot/web-ui/data}/www/marlin-logo-dark.png (100%) rename {data => buildroot/web-ui/data}/www/marlinui.eot (100%) rename {data => buildroot/web-ui/data}/www/marlinui.svg (100%) rename {data => buildroot/web-ui/data}/www/marlinui.ttf (100%) rename {data => buildroot/web-ui/data}/www/marlinui.woff (100%) rename {data => buildroot/web-ui/data}/www/moment.min.js (100%) rename {data => buildroot/web-ui/data}/www/webmarlin-class.js (100%) rename {data => buildroot/web-ui/data}/www/webmarlin-font.css (100%) rename {data => buildroot/web-ui/data}/www/webmarlin.css (100%) rename {data => buildroot/web-ui/data}/www/webmarlin.js (100%) diff --git a/data/www/bootstrap.min.css b/buildroot/web-ui/data/www/bootstrap.min.css similarity index 100% rename from data/www/bootstrap.min.css rename to buildroot/web-ui/data/www/bootstrap.min.css diff --git a/data/www/bootstrap.min.js b/buildroot/web-ui/data/www/bootstrap.min.js similarity index 100% rename from data/www/bootstrap.min.js rename to buildroot/web-ui/data/www/bootstrap.min.js diff --git a/data/www/bootstrap4-toggle.min.js b/buildroot/web-ui/data/www/bootstrap4-toggle.min.js similarity index 100% rename from data/www/bootstrap4-toggle.min.js rename to buildroot/web-ui/data/www/bootstrap4-toggle.min.js diff --git a/data/www/chart.lineargauge.js b/buildroot/web-ui/data/www/chart.lineargauge.js similarity index 100% rename from data/www/chart.lineargauge.js rename to buildroot/web-ui/data/www/chart.lineargauge.js diff --git a/data/www/chart.min.js b/buildroot/web-ui/data/www/chart.min.js similarity index 100% rename from data/www/chart.min.js rename to buildroot/web-ui/data/www/chart.min.js diff --git a/data/www/filesaver.min.js b/buildroot/web-ui/data/www/filesaver.min.js similarity index 100% rename from data/www/filesaver.min.js rename to buildroot/web-ui/data/www/filesaver.min.js diff --git a/data/www/index-ie.html b/buildroot/web-ui/data/www/index-ie.html similarity index 100% rename from data/www/index-ie.html rename to buildroot/web-ui/data/www/index-ie.html diff --git a/data/www/index.html b/buildroot/web-ui/data/www/index.html similarity index 100% rename from data/www/index.html rename to buildroot/web-ui/data/www/index.html diff --git a/data/www/jquery-3.5.1.slim.min.js b/buildroot/web-ui/data/www/jquery-3.5.1.slim.min.js similarity index 100% rename from data/www/jquery-3.5.1.slim.min.js rename to buildroot/web-ui/data/www/jquery-3.5.1.slim.min.js diff --git a/data/www/jquery.browser.min.js b/buildroot/web-ui/data/www/jquery.browser.min.js similarity index 100% rename from data/www/jquery.browser.min.js rename to buildroot/web-ui/data/www/jquery.browser.min.js diff --git a/data/www/marlin-logo-dark.png b/buildroot/web-ui/data/www/marlin-logo-dark.png similarity index 100% rename from data/www/marlin-logo-dark.png rename to buildroot/web-ui/data/www/marlin-logo-dark.png diff --git a/data/www/marlinui.eot b/buildroot/web-ui/data/www/marlinui.eot similarity index 100% rename from data/www/marlinui.eot rename to buildroot/web-ui/data/www/marlinui.eot diff --git a/data/www/marlinui.svg b/buildroot/web-ui/data/www/marlinui.svg similarity index 100% rename from data/www/marlinui.svg rename to buildroot/web-ui/data/www/marlinui.svg diff --git a/data/www/marlinui.ttf b/buildroot/web-ui/data/www/marlinui.ttf similarity index 100% rename from data/www/marlinui.ttf rename to buildroot/web-ui/data/www/marlinui.ttf diff --git a/data/www/marlinui.woff b/buildroot/web-ui/data/www/marlinui.woff similarity index 100% rename from data/www/marlinui.woff rename to buildroot/web-ui/data/www/marlinui.woff diff --git a/data/www/moment.min.js b/buildroot/web-ui/data/www/moment.min.js similarity index 100% rename from data/www/moment.min.js rename to buildroot/web-ui/data/www/moment.min.js diff --git a/data/www/webmarlin-class.js b/buildroot/web-ui/data/www/webmarlin-class.js similarity index 100% rename from data/www/webmarlin-class.js rename to buildroot/web-ui/data/www/webmarlin-class.js diff --git a/data/www/webmarlin-font.css b/buildroot/web-ui/data/www/webmarlin-font.css similarity index 100% rename from data/www/webmarlin-font.css rename to buildroot/web-ui/data/www/webmarlin-font.css diff --git a/data/www/webmarlin.css b/buildroot/web-ui/data/www/webmarlin.css similarity index 100% rename from data/www/webmarlin.css rename to buildroot/web-ui/data/www/webmarlin.css diff --git a/data/www/webmarlin.js b/buildroot/web-ui/data/www/webmarlin.js similarity index 100% rename from data/www/webmarlin.js rename to buildroot/web-ui/data/www/webmarlin.js From 107cc1f6a1cef0e32d9f7e739cb0b91027221b5b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 18 Mar 2021 00:11:06 -0500 Subject: [PATCH 1168/1370] Followup to planner cleanup --- Marlin/src/module/planner.cpp | 10 +++++----- Marlin/src/module/planner.h | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index c60e9f6cd3..594671f87a 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -3029,7 +3029,7 @@ inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_n * * This hard limit is applied as a block is being added to the planner queue. */ -void Planner::set_max_acceleration(const uint8_t axis, const float &inMaxAccelMMS2) { +void Planner::set_max_acceleration(const uint8_t axis, float inMaxAccelMMS2) { #if ENABLED(LIMITED_MAX_ACCEL_EDITING) #ifdef MAX_ACCEL_EDIT_VALUES constexpr xyze_float_t max_accel_edit = MAX_ACCEL_EDIT_VALUES; @@ -3052,7 +3052,7 @@ void Planner::set_max_acceleration(const uint8_t axis, const float &inMaxAccelMM * * This hard limit is applied as a block is being added to the planner queue. */ -void Planner::set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS) { +void Planner::set_max_feedrate(const uint8_t axis, float inMaxFeedrateMMS) { #if ENABLED(LIMITED_MAX_FR_EDITING) #ifdef MAX_FEEDRATE_EDIT_VALUES constexpr xyze_float_t max_fr_edit = MAX_FEEDRATE_EDIT_VALUES; @@ -3074,7 +3074,7 @@ void Planner::set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS * * This hard limit is applied (to the block start speed) as the block is being added to the planner queue. */ - void Planner::set_max_jerk(const AxisEnum axis, const float &targetValue) { + void Planner::set_max_jerk(const AxisEnum axis, float inMaxJerkMMS) { #if ENABLED(LIMITED_JERK_EDITING) constexpr xyze_float_t max_jerk_edit = #ifdef MAX_JERK_EDIT_VALUES @@ -3084,9 +3084,9 @@ void Planner::set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS (DEFAULT_ZJERK) * 2, (DEFAULT_EJERK) * 2 } #endif ; - limit_and_warn(targetValue, axis, PSTR("Jerk"), max_jerk_edit); + limit_and_warn(inMaxJerkMMS, axis, PSTR("Jerk"), max_jerk_edit); #endif - max_jerk[axis] = targetValue; + max_jerk[axis] = inMaxJerkMMS; } #endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index a7aabd9d65..7ebba1e342 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -470,14 +470,14 @@ class Planner { static void refresh_positioning(); // For an axis set the Maximum Acceleration in mm/s^2 - static void set_max_acceleration(const uint8_t axis, const float &inMaxAccelMMS2); + static void set_max_acceleration(const uint8_t axis, float inMaxAccelMMS2); // For an axis set the Maximum Feedrate in mm/s - static void set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS); + static void set_max_feedrate(const uint8_t axis, float inMaxFeedrateMMS); // For an axis set the Maximum Jerk (instant change) in mm/s #if HAS_CLASSIC_JERK - static void set_max_jerk(const AxisEnum axis, const float &inMaxJerkMMS); + static void set_max_jerk(const AxisEnum axis, float inMaxJerkMMS); #else static inline void set_max_jerk(const AxisEnum, const float&) {} #endif From ac4f3c0c7ee665d2e374edbc89f93de2aee82697 Mon Sep 17 00:00:00 2001 From: Skorpi08 Date: Fri, 19 Mar 2021 02:51:19 +0100 Subject: [PATCH 1169/1370] Nextion TFT touch screen (#21324) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 8 + Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 1 + .../lcd/extui/lib/nextion/FileNavigator.cpp | 174 +++++ .../src/lcd/extui/lib/nextion/FileNavigator.h | 53 ++ .../src/lcd/extui/lib/nextion/nextion_tft.cpp | 729 ++++++++++++++++++ .../src/lcd/extui/lib/nextion/nextion_tft.h | 62 ++ .../lcd/extui/lib/nextion/nextion_tft_defs.h | 63 ++ Marlin/src/lcd/extui/nextion_lcd.cpp | 117 +++ Marlin/src/lcd/extui/ui_api.cpp | 15 +- Marlin/src/lcd/extui/ui_api.h | 12 + platformio.ini | 2 + 12 files changed, 1235 insertions(+), 3 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/nextion/FileNavigator.cpp create mode 100644 Marlin/src/lcd/extui/lib/nextion/FileNavigator.h create mode 100644 Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp create mode 100644 Marlin/src/lcd/extui/lib/nextion/nextion_tft.h create mode 100644 Marlin/src/lcd/extui/lib/nextion/nextion_tft_defs.h create mode 100644 Marlin/src/lcd/extui/nextion_lcd.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 726ff1ec0b..ce847c0d65 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 // Default is 1 for Nextion +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index fc7eec84ee..fc83a1ff87 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -460,7 +460,7 @@ #endif // Extensible UI serial touch screens. (See src/lcd/extui) -#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) +#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT) #define IS_EXTUI 1 #define EXTENSIBLE_UI #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5302aac208..af30c6156d 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2353,6 +2353,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) \ + ENABLED(MAKRPANEL) \ + ENABLED(MALYAN_LCD) \ + + ENABLED(NEXTION_TFT) \ + ENABLED(MKS_LCD12864) \ + ENABLED(OLED_PANEL_TINYBOY2) \ + ENABLED(OVERLORD_OLED) \ diff --git a/Marlin/src/lcd/extui/lib/nextion/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/nextion/FileNavigator.cpp new file mode 100644 index 0000000000..f82ce1f091 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/FileNavigator.cpp @@ -0,0 +1,174 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* **************************************** + * lcd/extui/lib/nextion/FileNavigator.cpp + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(NEXTION_TFT) + +#include "FileNavigator.h" +#include "nextion_tft.h" + +using namespace ExtUI; + +#define DEBUG_OUT NEXDEBUGLEVEL +#include "../../../../core/debug_out.h" + +FileList FileNavigator::filelist; // Instance of the Marlin file API +char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path +uint16_t FileNavigator::lastindex; +uint8_t FileNavigator::folderdepth; +uint16_t FileNavigator::currentindex; // override the panel request + +FileNavigator filenavigator; + +FileNavigator::FileNavigator() { reset(); } + +void FileNavigator::reset() { + currentfoldername[0] = '\0'; + folderdepth = 0; + currentindex = 0; + lastindex = 0; + // Start at root folder + while (!filelist.isAtRootDir()) filelist.upDir(); + refresh(); +} + +void FileNavigator::refresh() { filelist.refresh(); } + +void FileNavigator::getFiles(uint16_t index) { + uint16_t files = 7, fseek = 0, fcnt = 0; + if (index == 0) + currentindex = 0; + else { + // Each time we change folder we reset the file index to 0 and keep track + // of the current position as the TFT panel isn't aware of folder trees. + --currentindex; // go back a file to take account of the .. added to the root. + if (index > lastindex) + currentindex += files + 1; + else if (currentindex >= files) + currentindex -= files - 1; + else + currentindex = 0; + } + lastindex = index; + + #if NEXDEBUG(AC_FILE) + DEBUG_ECHOLNPAIR("index=", index, " currentindex=", currentindex); + #endif + + if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder + nextion.SendtoTFT(PSTR("vis p0,1")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + SEND_VAL("tmpUP", "0"); + files--; + } + else { + nextion.SendtoTFT(PSTR("vis p0,0")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + } + + for (uint16_t seek = currentindex; seek < currentindex + files; seek++) { + if (filelist.seek(seek)) { + nextion.SendtoTFT(PSTR("s")); + LCD_SERIAL.print(fcnt); + nextion.SendtoTFT(PSTR(".txt=\"")); + if (filelist.isDir()) { + LCD_SERIAL.print(filelist.shortFilename()); + nextion.SendtoTFT(PSTR("/\"")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + + nextion.SendtoTFT(PSTR("l")); + LCD_SERIAL.print(fcnt); + nextion.SendtoTFT(PSTR(".txt=\"")); + LCD_SERIAL.print(filelist.filename()); + nextion.SendtoTFT(PSTR("\"")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + SEND_PCO2("l", fcnt, "1055"); + } + else { + LCD_SERIAL.print(currentfoldername); + LCD_SERIAL.print(filelist.shortFilename()); + nextion.SendtoTFT(PSTR("\"")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + + nextion.SendtoTFT(PSTR("l")); + LCD_SERIAL.print(fcnt); + nextion.SendtoTFT(PSTR(".txt=\"")); + LCD_SERIAL.print(filelist.longFilename()); + nextion.SendtoTFT(PSTR("\"")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + } + fcnt++; + fseek = seek; + #if NEXDEBUG(AC_FILE) + DEBUG_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); + #endif + } + } + SEND_VAL("n0", filelist.count()); + SEND_VAL("n1", fseek + 1); +} + +void FileNavigator::changeDIR(char *folder) { + #if NEXDEBUG(AC_FILE) + DEBUG_ECHOLNPAIR("currentfolder: ", currentfoldername, " New: ", folder); + #endif + if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth + strcat(currentfoldername, folder); + strcat(currentfoldername, "/"); + filelist.changeDir(folder); + refresh(); + folderdepth++; + currentindex = 0; +} + +void FileNavigator::upDIR() { + filelist.upDir(); + refresh(); + folderdepth--; + currentindex = 0; + // Remove the last child folder from the stored path + if (folderdepth == 0) { + currentfoldername[0] = '\0'; + reset(); + } + else { + char *pos = nullptr; + for (uint8_t f = 0; f < folderdepth; f++) + pos = strchr(currentfoldername, '/'); + pos[1] = '\0'; + } + #if NEXDEBUG(AC_FILE) + DEBUG_ECHOLNPAIR("depth: ", folderdepth, " currentfoldername: ", currentfoldername); + #endif +} + +char* FileNavigator::getCurrentFolderName() { return currentfoldername; } + +#endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/lib/nextion/FileNavigator.h b/Marlin/src/lcd/extui/lib/nextion/FileNavigator.h new file mode 100644 index 0000000000..1cd29ec671 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/FileNavigator.h @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/* **************************************** + * lcd/extui/lib/nextion/FileNavigator.cpp + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "nextion_tft_defs.h" // for MAX_PATH_LEN +#include "../../ui_api.h" + +using namespace ExtUI; + +class FileNavigator { + public: + FileNavigator(); + static void reset(); + static void getFiles(uint16_t); + static void upDIR(); + static void changeDIR(char *); + static void refresh(); + static char* getCurrentFolderName(); + private: + static FileList filelist; + static char currentfoldername[MAX_PATH_LEN]; + static uint16_t lastindex; + static uint8_t folderdepth; + static uint16_t currentindex; +}; + +extern FileNavigator filenavigator; diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp new file mode 100644 index 0000000000..12a7bc7cc7 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp @@ -0,0 +1,729 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* **************************************** + * lcd/extui/lib/nextion/nextion_tft.h + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(NEXTION_TFT) + +#include "../../../../MarlinCore.h" +#include "../../../../feature/pause.h" +#include "../../../../gcode/queue.h" +#include "../../../../libs/numtostr.h" +#include "../../../../sd/cardreader.h" +#include "FileNavigator.h" +#include "nextion_tft.h" + +#define DEBUG_OUT NEXDEBUGLEVEL +#include "../../../../core/debug_out.h" + +char NextionTFT::selectedfile[MAX_PATH_LEN]; +char NextionTFT::nextion_command[MAX_CMND_LEN]; +uint8_t NextionTFT::command_len; + +bool last_homed = 0, last_homedX = 0, last_homedY = 0, last_homedZ = 0; +float last_degBed = 999, last_degHotend0 = 999, last_degHotend1 = 999, last_degTargetBed = 999, last_degTargetHotend0 = 999, last_degTargetHotend1 = 999; +float last_get_axis_position_mmX = 999, last_get_axis_position_mmY = 999, last_get_axis_position_mmZ = 999; +float last_extruder_advance_K = 999; +uint8_t last_active_extruder = 99, last_fan_speed = 99, last_print_speed = 99, last_flow_speed = 99, last_progress = 99; +uint8_t last_printer_state = 99, last_IDEX_Mode = 99; +uint32_t layer = 0, last_layer = 99; + +NextionTFT nextion; + +NextionTFT::NextionTFT() {} + +void NextionTFT::Startup() { + selectedfile[0] = '\0'; + nextion_command[0] = '\0'; + command_len = 0; + LCD_SERIAL.begin(115200); + + SEND_VAL("tmppage.connected", 0); + delay_ms(100); + SEND_VAL("tmppage.connected", 1); + + SEND_VALasTXT("tmppage.marlin", SHORT_BUILD_VERSION); + SEND_VALasTXT("tmppage.compiled", __DATE__ " / " __TIME__); + SEND_VALasTXT("tmppage.extruder", EXTRUDERS); + SEND_VALasTXT("tmppage.printer", MACHINE_NAME); + SEND_VALasTXT("tmppage.author", STRING_CONFIG_H_AUTHOR); + SEND_VALasTXT("tmppage.released", STRING_DISTRIBUTION_DATE); + SEND_VALasTXT("tmppage.bedx", X_BED_SIZE); + SEND_VALasTXT("tmppage.bedy", Y_BED_SIZE); + SEND_VALasTXT("tmppage.bedz", Z_MAX_POS); + + DEBUG_ECHOLNPAIR("Nextion Debug Level ", NEXDEBUGLEVEL); +} + +void NextionTFT::IdleLoop() { + if (ReadTFTCommand()) { + ProcessPanelRequest(); + command_len = 0; + } + UpdateOnChange(); +} + +void NextionTFT::PrinterKilled(PGM_P error, PGM_P component) { + SEND_TXT_END("page error"); + SEND_TXT("t3", "Error"); + SEND_TXT_P("t4", component); + SEND_TXT_P("t5", error); + SEND_TXT("t6", "Need reset"); +} + +void NextionTFT::PrintFinished() { + SEND_TXT_END("page printfinished"); +} + +void NextionTFT::ConfirmationRequest(const char *const msg) { + SEND_VALasTXT("tmppage.M117", msg); + #if NEXDEBUG(N_MARLIN) + DEBUG_ECHOLNPAIR("ConfirmationRequest() ", msg, " printer_state:", printer_state); + #endif +} + +void NextionTFT::StatusChange(const char *const msg) { + #if NEXDEBUG(N_MARLIN) + DEBUG_ECHOLNPAIR("StatusChange() ", msg, "\nprinter_state:", printer_state); + #endif + SEND_VALasTXT("tmppage.M117", msg); +} + +void NextionTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEM string to the panel + #if NEXDEBUG(N_SOME) + DEBUG_ECHOPGM_P(str); + #endif + while (const char c = pgm_read_byte(str++)) + LCD_SERIAL.write(c); +} + +bool NextionTFT::ReadTFTCommand() { + bool command_ready = false; + while ((LCD_SERIAL.available() > 0) && (command_len < MAX_CMND_LEN)) { + nextion_command[command_len] = LCD_SERIAL.read(); + if (nextion_command[command_len] == 10) { + command_ready = true; + break; + } + command_len++; + } + + if (command_ready) { + nextion_command[command_len] = 0x00; + if (nextion_command[0] == 'G' || nextion_command[0] == 'M' || nextion_command[0] == 'T') + injectCommands(nextion_command); + #if NEXDEBUG(N_ALL) + DEBUG_ECHOLNPAIR("< ", nextion_command); + #endif + #if NEXDEBUG(N_SOME) + uint8_t req = atoi(&nextion_command[1]); + if (req > 7 && req != 20) + DEBUG_ECHOLNPAIR( "> ", nextion_command[0], + "\n> ", nextion_command[1], + "\n> ", nextion_command[2], + "\n> ", nextion_command[3], + "\nprinter_state:", printer_state); + #endif + } + return command_ready; +} + +void NextionTFT::SendFileList(int8_t startindex) { + // respond to panel request for 7 files starting at index + #if NEXDEBUG(N_INFO) + DEBUG_ECHOLNPAIR("## SendFileList ## ", startindex); + #endif + filenavigator.getFiles(startindex); +} + +void NextionTFT::SelectFile() { + strncpy(selectedfile, nextion_command + 4, command_len - 4); + selectedfile[command_len - 5] = '\0'; + #if NEXDEBUG(N_FILE) + DEBUG_ECHOLNPAIR_F(" Selected File: ", selectedfile); + #endif + switch (selectedfile[0]) { + case '/': // Valid file selected + //SEND_TXT("tmppage.M117", msg_sd_file_open_success); + break; + case '<': // .. (go up folder level) + filenavigator.upDIR(); + SendFileList(0); + break; + default: // enter sub folder + filenavigator.changeDIR(selectedfile); + SendFileList(0); + break; + } +} + +void NextionTFT::_format_time(char *outstr, uint32_t time) { + const uint8_t hrs = time / 3600, + min = (time / 60) % 60, + sec = time % 60; + if (hrs) + sprintf_P(outstr, PSTR("%02d:%02dm"), hrs, min); + else + sprintf_P(outstr, PSTR("%02d:%02ds"), min, sec); +} + +void NextionTFT::ProcessPanelRequest() { + // Break these up into logical blocks as its easier to navigate than one huge switch case! + if (nextion_command[0] == 'X') { + int8_t req = atoi(&nextion_command[1]); + + // Information requests + if (req <= 49) + PanelInfo(req); + + // Simple Actions + else if (req >= 50) + PanelAction(req); + } +} + +#define SEND_NA(A) SEND_TXT(A, "n/a") + +void NextionTFT::PanelInfo(uint8_t req) { + switch (req) { + case 0: break; + + case 1: // Get SD Card list + if (!isPrinting()) { + if (!isMediaInserted()) safe_delay(500); + if (!isMediaInserted()) { // Make sure the card is removed + //SEND_TXT("tmppage.M117", msg_no_sd_card); + } + else if (nextion_command[3] == 'S') + SendFileList(atoi(&nextion_command[4])); + } + break; + + case 2: // Printer Info + if (!isPrinting()) { + SEND_VAL("tmppage.connected", 1); + SEND_VALasTXT("tmppage.marlin", SHORT_BUILD_VERSION); + SEND_VALasTXT("tmppage.compiled", __DATE__ " / " __TIME__); + SEND_VALasTXT("tmppage.extruder", EXTRUDERS); + SEND_VALasTXT("tmppage.printer", MACHINE_NAME); + SEND_VALasTXT("tmppage.author", STRING_CONFIG_H_AUTHOR); + SEND_VALasTXT("tmppage.released", STRING_DISTRIBUTION_DATE); + SEND_VALasTXT("tmppage.bedx", X_BED_SIZE); + SEND_VALasTXT("tmppage.bedy", Y_BED_SIZE); + SEND_VALasTXT("tmppage.bedz", Z_MAX_POS); + SEND_TEMP("tmppage.t0", ui8tostr3rj(getActualTemp_celsius(E0)), " / ", ui8tostr3rj(getTargetTemp_celsius(E0))); + SEND_TEMP("tmppage.t1", ui8tostr3rj(getActualTemp_celsius(E1)), " / ", ui8tostr3rj(getTargetTemp_celsius(E1))); + SEND_TEMP("tmppage.t2", ui8tostr3rj(getActualTemp_celsius(BED)), " / ", ui8tostr3rj(getTargetTemp_celsius(BED))); + SEND_VALasTXT("tmppage.tool", getActiveTool()); + SEND_VALasTXT("tmppage.fan", ui8tostr3rj(getActualFan_percent(FAN0))); + SEND_VALasTXT("tmppage.speed", getFeedrate_percent()); + SEND_VALasTXT("tmppage.flow", getFlowPercentage(getActiveTool())); + SEND_VALasTXT("tmppage.progress", ui8tostr3rj(getProgress_percent())); + SEND_VALasTXT("tmppage.layer", layer); + SEND_VALasTXT("tmppage.x", getAxisPosition_mm(X)); + SEND_VALasTXT("tmppage.y", getAxisPosition_mm(Y)); + SEND_VALasTXT("tmppage.z", getAxisPosition_mm(Z)); + SEND_VAL("tmppage.homed", isPositionKnown()); + SEND_VAL("tmppage.homedx", isAxisPositionKnown(X)); + SEND_VAL("tmppage.homedy", isAxisPositionKnown(Y)); + SEND_VAL("tmppage.homedz", isAxisPositionKnown(Z)); + #if ENABLED(DUAL_X_CARRIAGE) + SEND_VAL("tmppage.idexmode", getIDEX_Mode()); + #endif + SEND_TXT("tmppage.M117", msg_welcome); + } + break; + + case 23: // Linear Advance + #if ENABLED(LIN_ADVANCE) + SEND_VALasTXT("linadvance", getLinearAdvance_mm_mm_s(getActiveTool())); + #else + SEND_NA("linadvance"); + #endif + break; + + case 24: // TMC Motor Current + #if HAS_TRINAMIC_CONFIG + #define SEND_TRINAMIC_CURR(A, B) SEND_VALasTXT(A, getAxisCurrent_mA(B)) + #else + #define SEND_TRINAMIC_CURR(A, B) SEND_NA(A) + #endif + SEND_TRINAMIC_CURR("x", X); + SEND_TRINAMIC_CURR("x2", X2); + SEND_TRINAMIC_CURR("y", Y); + SEND_TRINAMIC_CURR("y2", Y2); + SEND_TRINAMIC_CURR("z", Z); + SEND_TRINAMIC_CURR("z2", Z2); + SEND_TRINAMIC_CURR("e", E0); + SEND_TRINAMIC_CURR("e1", E1); + break; + + case 25: // TMC Bump Sensitivity + #if HAS_TRINAMIC_CONFIG + #define SEND_TRINAMIC_BUMP(A, B) SEND_VALasTXT(A, getTMCBumpSensitivity(B)) + #else + #define SEND_TRINAMIC_BUMP(A, B) SEND_NA(A) + #endif + SEND_TRINAMIC_BUMP("x", X); + SEND_TRINAMIC_BUMP("x2", X2); + SEND_TRINAMIC_BUMP("y", Y); + SEND_TRINAMIC_BUMP("y2", Y2); + SEND_TRINAMIC_BUMP("z", Z); + SEND_TRINAMIC_BUMP("z2", Z2); + break; + + case 26: // TMC Hybrid Threshold Speed + #if 0 && BOTH(HAS_TRINAMIC_CONFIG, HYBRID_THRESHOLD) + #define SEND_TRINAMIC_THRS(A, B) SEND_VALasTXT(A, getAxisPWMthrs(B)) + #else + #define SEND_TRINAMIC_THRS(A, B) SEND_NA(A) + #endif + SEND_TRINAMIC_THRS("x", X); + SEND_TRINAMIC_THRS("x2", X2); + SEND_TRINAMIC_THRS("y", Y); + SEND_TRINAMIC_THRS("y2", Y2); + SEND_TRINAMIC_THRS("z", Z); + SEND_TRINAMIC_THRS("z2", Z2); + SEND_TRINAMIC_THRS("e", E0); + SEND_TRINAMIC_THRS("e1", E1); + break; + + case 27: // Printcounter + #if ENABLED(PRINTCOUNTER) + char buffer[21]; + #define SEND_PRINT_INFO(A, B) SEND_VALasTXT(A, B(buffer)) + #else + #define SEND_PRINT_INFO(A, B) SEND_NA(A) + #endif + SEND_PRINT_INFO("t5", getTotalPrints_str); + SEND_PRINT_INFO("t3", getFinishedPrints_str); + SEND_PRINT_INFO("t4", getFailedPrints_str); + SEND_PRINT_INFO("t6", getTotalPrintTime_str); + SEND_PRINT_INFO("t7", getLongestPrint_str); + SEND_PRINT_INFO("t8", getFilamentUsed_str); + break; + + case 28: // Filament laod/unload + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #define SEND_PAUSE_INFO(A, B) SEND_VALasTXT(A, fc_settings[getActiveTool()].B) + #else + #define SEND_PAUSE_INFO(A, B) SEND_NA(A) + #endif + SEND_PAUSE_INFO("filamentin", load_length); + SEND_PAUSE_INFO("filamentout", unload_length); + break; + + case 29: // Preheat + #if PREHEAT_COUNT + if (!isPrinting()) { + // Preheat PLA + if (nextion_command[4] == 'P') { + SEND_VALasTXT("pe", getMaterial_preset_E(0)); + #if HAS_HEATED_BED + SEND_VALasTXT("pb", getMaterial_preset_B(0)); + #endif + } + + // Preheat ABS + if (nextion_command[4] == 'A') { + SEND_VALasTXT("ae", getMaterial_preset_E(1)); + #if HAS_HEATED_BED + SEND_VALasTXT("ab", getMaterial_preset_B(1)); + #endif + } + + // Preheat PETG + if (nextion_command[4] == 'G') { + #ifdef PREHEAT_3_TEMP_HOTEND + SEND_VALasTXT("ge", getMaterial_preset_E(2)); + #if HAS_HEATED_BED + SEND_VALasTXT("gb", getMaterial_preset_B(2)); + #endif + #endif + } + } + #endif + break; + + case 30: // Velocity + SEND_VALasTXT("x", getAxisMaxFeedrate_mm_s(X)); + SEND_VALasTXT("y", getAxisMaxFeedrate_mm_s(Y)); + SEND_VALasTXT("z", getAxisMaxFeedrate_mm_s(Z)); + SEND_VALasTXT("e", getAxisMaxFeedrate_mm_s(getActiveTool())); + SEND_VALasTXT("min", getMinFeedrate_mm_s()); + SEND_VALasTXT("tmin", getMinTravelFeedrate_mm_s()); + break; + + case 31: // Jerk + #if ENABLED(CLASSIC_JERK) + #define SEND_JERK_INFO(A, B) SEND_VALasTXT(A, getAxisMaxJerk_mm_s(B)) + #else + #define SEND_JERK_INFO(A, B) SEND_NA(A) + //SEND_VALasTXT("x", getJunctionDeviation_mm()); + SEND_TXT("tmppage.M117", "classic Jerk not enabled"); + #endif + SEND_JERK_INFO("x", X); + SEND_JERK_INFO("y", Y); + SEND_JERK_INFO("z", Z); + SEND_JERK_INFO("e", getActiveTool()); + break; + + case 32: // Steps-per-mm + SEND_VALasTXT("x", getAxisSteps_per_mm(X)); + SEND_VALasTXT("y", getAxisSteps_per_mm(Y)); + SEND_VALasTXT("z", getAxisSteps_per_mm(Z)); + SEND_VALasTXT("e0", getAxisSteps_per_mm(E0)); + SEND_VALasTXT("e1", getAxisSteps_per_mm(E1)); + break; + + case 33: // Acceleration + SEND_VALasTXT("x", ui16tostr5rj(getAxisMaxAcceleration_mm_s2(X))); + SEND_VALasTXT("y", ui16tostr5rj(getAxisMaxAcceleration_mm_s2(Y))); + SEND_VALasTXT("z", ui16tostr5rj(getAxisMaxAcceleration_mm_s2(Z))); + SEND_VALasTXT("e", ui16tostr5rj(getAxisMaxAcceleration_mm_s2(getActiveTool()))); + SEND_VALasTXT("print", ui16tostr5rj(getPrintingAcceleration_mm_s2())); + SEND_VALasTXT("retract", ui16tostr5rj(getRetractAcceleration_mm_s2())); + SEND_VALasTXT("travel", ui16tostr5rj(getTravelAcceleration_mm_s2())); + break; + + case 34: // Dual X carriage offset + #if ENABLED(DUAL_X_CARRIAGE) + #define SEND_IDEX_INFO(A, B) SEND_VALasTXT(A, getNozzleOffset_mm(B, getActiveTool())) + #else + #define SEND_IDEX_INFO(A, B) SEND_NA(A) + #endif + SEND_IDEX_INFO("x", X); + SEND_IDEX_INFO("y", Y); + SEND_IDEX_INFO("z", Z); + break; + + case 35: // Probe offset + #if HAS_PROBE_XY_OFFSET + #define SEND_PROBE_INFO(A, B) SEND_VALasTXT(A, getProbeOffset_mm(B)) + #else + #define SEND_PROBE_INFO(A, B) SEND_NA(A) + #endif + SEND_PROBE_INFO("x", X); + SEND_PROBE_INFO("y", Y); + SEND_VALasTXT("z", getZOffset_mm()); + break; + + case 36: // Endstop Info + #if HAS_X_MIN + SEND_VALasTXT("x1", READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_X_MAX + SEND_VALasTXT("x2", READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Y_MIN + SEND_VALasTXT("y1", READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Z_MIN + SEND_VALasTXT("z1", READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Z_MAX + SEND_VALasTXT("z2", READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Z2_MIN + SEND_VALasTXT("z2", READ(Z2_MIN_PIN) != Z2_MIN_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Z2_MAX + SEND_VALasTXT("z2", READ(Z2_MAX_PIN) != Z2_MAX_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_BED_PROBE + //SEND_VALasTXT("bltouch", READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING ? "triggered" : "open"); + #else + SEND_NA("bltouch"); + #endif + break; + + case 37: // PID + #if ENABLED(PIDTEMP) + #define SEND_PID_INFO_0(A, B) SEND_VALasTXT(A, getPIDValues_K##B(E0)) + #else + #define SEND_PID_INFO_0(A, B) SEND_NA(A) + #endif + #if BOTH(PIDTEMP, HAS_MULTI_EXTRUDER) + #define SEND_PID_INFO_1(A, B) SEND_VALasTXT(A, getPIDValues_K##B(E1)) + #else + #define SEND_PID_INFO_1(A, B) SEND_NA(A) + #endif + #if ENABLED(PIDTEMPBED) + #define SEND_PID_INFO_BED(A, B) SEND_VALasTXT(A, getBedPIDValues_K##B()) + #else + #define SEND_PID_INFO_BED(A, B) SEND_NA(A) + #endif + SEND_PID_INFO_0("p0", p); + SEND_PID_INFO_0("i0", i); + SEND_PID_INFO_0("d0", d); + + SEND_PID_INFO_1("p1", p); + SEND_PID_INFO_1("i1", i); + SEND_PID_INFO_1("d1", d); + + SEND_PID_INFO_BED("hbp", p); + SEND_PID_INFO_BED("hbi", i); + SEND_PID_INFO_BED("hbd", d); + break; + } +} + +void NextionTFT::PanelAction(uint8_t req) { + switch (req) { + + case 50: // Pause SD print + //if (isPrintingFromMedia()) { + //SEND_TXT("tmppage.M117", "Paused"); + pausePrint(); + SEND_TXT_END("qpause.picc=29"); + //} + break; + + case 51: // Resume SD Print + resumePrint(); + SEND_TXT_END("qpause.picc=28"); + break; + + case 52: // Stop SD print + //if (isPrintingFromMedia()) { + stopPrint(); + SEND_TXT_END("page prepare"); + //} + break; + + case 54: // A13 Select file + SelectFile(); + break; + + case 65: // Cool Down + if (!isPrinting()) coolDown(); + break; + + case 66: // Refresh SD + if (!isPrinting()) { + injectCommands_P(PSTR("M21")); + filenavigator.reset(); + } + break; + + case 56: // Set Fan, Flow, Print Speed + switch (nextion_command[4]) { + case 'S': setTargetFan_percent(atof(&nextion_command[5]), FAN0); break; + case 'P': setFeedrate_percent(atoi(&nextion_command[5])); break; + case 'F': setFlow_percent(atoi(&nextion_command[5]), getActiveTool()); break; + } + break; + + case 57: // Disable Motors + if (!isPrinting()) { + disable_all_steppers(); // from marlincore.h + SEND_TXT("tmppage.M117", "Motors disabled"); + } + break; + + case 58: // Load/Unload Filament + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + if (canMove(getActiveTool())) { + switch (nextion_command[4]) { + case 'L': injectCommands_P(PSTR("M701")); break; + case 'U': injectCommands_P(PSTR("M702")); break; + } + } + else { + SEND_TXT("tmppage.M117", "Preheat first"); + SEND_TXT_END("page preheat"); + } + #else + SEND_TXT("tmppage.M117", "Filament loading disabled"); + #endif + break; + + case 63: // Preheat // Temps defined in configuration.h + #if PREHEAT_COUNT + if (!isPrinting()) switch (nextion_command[4]) { + // Preheat PLA + case 'P': + #if HAS_HEATED_BED + setTargetTemp_celsius(getMaterial_preset_B(0), BED); + #endif + setTargetTemp_celsius(getMaterial_preset_E(0), getActiveTool()); + break; + + // Preheat ABS + case 'A': + #if HAS_HEATED_BED + setTargetTemp_celsius(getMaterial_preset_B(1), BED); + #endif + setTargetTemp_celsius(getMaterial_preset_E(1), getActiveTool()); + break; + + // Preheat PETG + case 'G': + #if HAS_HEATED_BED + setTargetTemp_celsius(getMaterial_preset_B(2), BED); + #endif + setTargetTemp_celsius(getMaterial_preset_E(2), getActiveTool()); + break; + } + #else + SEND_TXT("tmppage.M117", "Preheat disabled"); + #endif + break; + } +} + +void NextionTFT::UpdateOnChange() { + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + // tmppage Temperature + if (!WITHIN(last_degHotend0 - getActualTemp_celsius(E0), -0.2, 0.2) || !WITHIN(last_degTargetHotend0 - getTargetTemp_celsius(E0), -0.5, 0.5)) { + SEND_TEMP("tmppage.t0", ui8tostr3rj(getActualTemp_celsius(E0)), " / ", ui8tostr3rj(getTargetTemp_celsius(E0))); + last_degHotend0 = getActualTemp_celsius(E0); + last_degTargetHotend0 = getTargetTemp_celsius(E0); + } + + if (!WITHIN(last_degHotend1 - getActualTemp_celsius(E1), -0.2, 0.2) || !WITHIN(last_degTargetHotend1 - getTargetTemp_celsius(E1), -0.5, 0.5)) { + SEND_TEMP("tmppage.t1", ui8tostr3rj(getActualTemp_celsius(E1)), " / ", ui8tostr3rj(getTargetTemp_celsius(E1))); + last_degHotend1 = getActualTemp_celsius(E1); + last_degTargetHotend1 = getTargetTemp_celsius(E1); + } + + if (!WITHIN(last_degBed - getActualTemp_celsius(BED), -0.2, 0.2) || !WITHIN(last_degTargetBed - getTargetTemp_celsius(BED), -0.5, 0.5)) { + SEND_TEMP("tmppage.t2", ui8tostr3rj(getActualTemp_celsius(BED)), " / ", ui8tostr3rj(getTargetTemp_celsius(BED))); + last_degBed = getActualTemp_celsius(BED); + last_degTargetBed = getTargetTemp_celsius(BED); + } + + // tmppage Tool + if (last_active_extruder != getActiveTool()) { + SEND_VALasTXT("tmppage.tool", getActiveTool()); + last_active_extruder = getActiveTool(); + } + + // tmppage Fan Speed + if (last_fan_speed != getActualFan_percent(FAN0)) { + SEND_VALasTXT("tmppage.fan", ui8tostr3rj(getActualFan_percent(FAN0))); + last_fan_speed = getActualFan_percent(FAN0); + } + + // tmppage Print Speed + if (last_print_speed != getFeedrate_percent()) { + SEND_VALasTXT("tmppage.speed", ui8tostr3rj(getFeedrate_percent())); + last_print_speed = getFeedrate_percent(); + } + + // tmppage Flow + if (last_flow_speed != getFlowPercentage(getActiveTool())) { + SEND_VALasTXT("tmppage.flow", getFlowPercentage(getActiveTool())); + last_flow_speed = getFlowPercentage(getActiveTool()); + } + + // tmppage Progress + Layer + Time + if (isPrinting()) { + + if (ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + 1000; + #if ENABLED(SHOW_REMAINING_TIME) + const uint32_t remaining = getProgress_seconds_remaining(); + char remaining_str[10]; + _format_time(remaining_str, remaining); + SEND_VALasTXT("tmppage.remaining", remaining_str); + #endif + const uint32_t elapsed = getProgress_seconds_elapsed(); + char elapsed_str[10]; + _format_time(elapsed_str, elapsed); + SEND_VALasTXT("tmppage.elapsed", elapsed_str); + } + + if (last_progress != getProgress_percent()) { + SEND_VALasTXT("tmppage.progress", ui8tostr3rj(getProgress_percent())); + last_progress = getProgress_percent(); + } + + if (last_get_axis_position_mmZ < getAxisPosition_mm(Z)) { + layer++; + SEND_VALasTXT("tmppage.layer", layer); + } + + if (last_get_axis_position_mmZ > getAxisPosition_mm(Z)) { + layer--; + SEND_VALasTXT("tmppage.layer", layer); + } + } + + // tmppage Axis + if (!WITHIN(last_get_axis_position_mmX - getAxisPosition_mm(X), -0.1, 0.1)) { + if (ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + 30; + SEND_VALasTXT("tmppage.x", getAxisPosition_mm(X)); + last_get_axis_position_mmX = getAxisPosition_mm(X); + } + } + + if (!WITHIN(last_get_axis_position_mmY - getAxisPosition_mm(Y), -0.1, 0.1)) { + if (ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + 30; + SEND_VALasTXT("tmppage.y", getAxisPosition_mm(Y)); + last_get_axis_position_mmY = getAxisPosition_mm(Y); + } + } + + if (!WITHIN(last_get_axis_position_mmZ - getAxisPosition_mm(Z), -0.1, 0.1)) { + SEND_VALasTXT("tmppage.z", getAxisPosition_mm(Z)); + last_get_axis_position_mmZ = getAxisPosition_mm(Z); + } + + // tmppage homed + if (last_homed != isPositionKnown()) { + SEND_VAL("tmppage.homed", isPositionKnown()); + last_homed = isPositionKnown(); + } + if (last_homedX != isAxisPositionKnown(X)) { + SEND_VAL("tmppage.homedx", isAxisPositionKnown(X)); + last_homedX = isAxisPositionKnown(X); + } + if (last_homedY != isAxisPositionKnown(Y)) { + SEND_VAL("tmppage.homedy", isAxisPositionKnown(Y)); + last_homedY = isAxisPositionKnown(Y); + } + if (last_homedZ != isAxisPositionKnown(Z)) { + SEND_VAL("tmppage.homedz", isAxisPositionKnown(Z)); + last_homedZ = isAxisPositionKnown(Z); + } + + // tmppage IDEX Mode + #if ENABLED(DUAL_X_CARRIAGE) + if (last_IDEX_Mode != getIDEX_Mode()) { + SEND_VAL("tmppage.idexmode", getIDEX_Mode()); + last_IDEX_Mode = getIDEX_Mode(); + } + #endif +} + +#endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.h b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.h new file mode 100644 index 0000000000..9197fcc2c6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/* **************************************** + * lcd/extui/lib/nextion/nextion_tft.h + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "nextion_tft_defs.h" +#include "../../../../inc/MarlinConfigPre.h" +#include "../../ui_api.h" + +class NextionTFT { + private: + static uint8_t command_len; + static char nextion_command[MAX_CMND_LEN]; + static char selectedfile[MAX_PATH_LEN]; + + public: + NextionTFT(); + static void Startup(); + static void IdleLoop(); + static void PrinterKilled(PGM_P, PGM_P); + static void ConfirmationRequest(const char * const ); + static void StatusChange(const char * const ); + static void SendtoTFT(PGM_P); + static void UpdateOnChange(); + static void PrintFinished(); + static void PanelInfo(uint8_t); + + private: + static bool ReadTFTCommand(); + static void SendFileList(int8_t); + static void SelectFile(); + static void ProcessPanelRequest(); + static void PanelAction(uint8_t); + static void _format_time(char *, uint32_t); +}; + +extern NextionTFT nextion; diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft_defs.h b/Marlin/src/lcd/extui/lib/nextion/nextion_tft_defs.h new file mode 100644 index 0000000000..75f70fc985 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft_defs.h @@ -0,0 +1,63 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/* **************************************** + * lcd/extui/lib/nextion/nextion_tft_defs.h + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +//#define NEXDEBUGLEVEL 255 +#if NEXDEBUGLEVEL + // Bit-masks for selective debug: + enum NexDebugMask : uint8_t { + N_INFO = _BV(0), + N_ACTION = _BV(1), + N_FILE = _BV(2), + N_PANEL = _BV(3), + N_MARLIN = _BV(4), + N_SOME = _BV(5), + N_ALL = _BV(6) + }; + #define NEXDEBUG(M) (((M) & NEXDEBUGLEVEL) == M) // Debug flag macro +#else + #define NEXDEBUG(M) false +#endif + +#define MAX_FOLDER_DEPTH 4 // Limit folder depth TFT has a limit for the file path +#define MAX_CMND_LEN 16 * MAX_FOLDER_DEPTH // Maximum Length for a Panel command +#define MAX_PATH_LEN 16 * MAX_FOLDER_DEPTH // Maximum number of characters in a SD file path + + // TFT panel commands +#define msg_welcome MACHINE_NAME " Ready." + +#define SEND_TEMP(x,y,t,z) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".txt=\"")), LCD_SERIAL.print(y), nextion.SendtoTFT(PSTR(t)), LCD_SERIAL.print(z), nextion.SendtoTFT(PSTR("\"\xFF\xFF\xFF"))) +#define SEND_VAL(x,y) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".val=")), LCD_SERIAL.print(y), nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"))) +#define SEND_TXT(x,y) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".txt=\"")), nextion.SendtoTFT(PSTR(y)), nextion.SendtoTFT(PSTR("\"\xFF\xFF\xFF"))) +#define SEND_TXT_P(x,y) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".txt=\"")), nextion.SendtoTFT(y), nextion.SendtoTFT(PSTR("\"\xFF\xFF\xFF"))) +#define SEND_VALasTXT(x,y) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".txt=\"")), LCD_SERIAL.print(y), nextion.SendtoTFT(PSTR("\"\xFF\xFF\xFF"))) +#define SEND_TXT_END(x) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"))) +#define SEND_PCO2(x,y,z) (nextion.SendtoTFT(PSTR(x)), LCD_SERIAL.print(y), nextion.SendtoTFT(PSTR(".pco=")), nextion.SendtoTFT(PSTR(z)), nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"))) diff --git a/Marlin/src/lcd/extui/nextion_lcd.cpp b/Marlin/src/lcd/extui/nextion_lcd.cpp new file mode 100644 index 0000000000..fa45f4ef51 --- /dev/null +++ b/Marlin/src/lcd/extui/nextion_lcd.cpp @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * lcd/extui/nextion_lcd.cpp + * + * Nextion TFT support for Marlin + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(NEXTION_TFT) + +#include "ui_api.h" +#include "lib/nextion/nextion_tft.h" + +namespace ExtUI { + + void onStartup() { nextion.Startup(); } + void onIdle() { nextion.IdleLoop(); } + void onPrinterKilled(PGM_P const error, PGM_P const component) { nextion.PrinterKilled(error,component); } + void onMediaInserted() {} + void onMediaError() {} + void onMediaRemoved() {} + void onPlayTone(const uint16_t frequency, const uint16_t duration) {} + void onPrintTimerStarted() {} + void onPrintTimerPaused() {} + void onPrintTimerStopped() {} + void onFilamentRunout(const extruder_t) {} + void onUserConfirmRequired(const char * const msg) { nextion.ConfirmationRequest(msg); } + void onStatusChanged(const char * const msg) { nextion.StatusChange(msg); } + + void onHomingStart() {} + void onHomingComplete() {} + void onPrintFinished() { nextion.PrintFinished(); } + + void onFactoryReset() {} + + void onStoreSettings(char *buff) { + // Called when saving to EEPROM (i.e. M500). If the ExtUI needs + // permanent data to be stored, it can write up to eeprom_data_size bytes + // into buff. + + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); + } + + void onLoadSettings(const char *buff) { + // Called while loading settings from EEPROM. If the ExtUI + // needs to retrieve data, it should copy up to eeprom_data_size bytes + // from buff + + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); + } + + void onConfigurationStoreWritten(bool success) { + // Called after the entire EEPROM has been written, + // whether successful or not. + } + + void onConfigurationStoreRead(bool success) { + // Called after the entire EEPROM has been read, + // whether successful or not. + } + + #if HAS_MESH + void onMeshLevelingStart() {} + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + // Called to indicate a special condition + } + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume() { + // Called on resume from power-loss + } + #endif + + #if HAS_PID_HEATING + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + nextion.PanelInfo(37); + } + #endif + + void onSteppersDisabled() {} + void onSteppersEnabled() {} +} + +#endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 97d4ec2b08..73e5bc092d 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -651,6 +651,17 @@ namespace ExtUI { void setAxisMaxJerk_mm_s(const float &value, const extruder_t) { planner.set_max_jerk(E_AXIS, value); } #endif + #if ENABLED(DUAL_X_CARRIAGE) + uint8_t getIDEX_Mode() { return dual_x_carriage_mode; } + #endif + + #if PREHEAT_COUNT + uint16_t getMaterial_preset_E(const uint16_t index) { return ui.material_preset[index].hotend_temp; } + #if HAS_HEATED_BED + uint16_t getMaterial_preset_B(const uint16_t index) { return ui.material_preset[index].bed_temp; } + #endif + #endif + feedRate_t getFeedrate_mm_s() { return feedrate_mm_s; } int16_t getFlowPercentage(const extruder_t extr) { return planner.flow_percentage[extr]; } feedRate_t getMinFeedrate_mm_s() { return planner.settings.min_feedrate_mm_s; } @@ -663,8 +674,8 @@ namespace ExtUI { void setMinFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_feedrate_mm_s = fr; } void setMinTravelFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_travel_feedrate_mm_s = fr; } void setPrintingAcceleration_mm_s2(const float &acc) { planner.settings.acceleration = acc; } - void setRetractAcceleration_mm_s2(const float &acc) { planner.settings.retract_acceleration = acc; } - void setTravelAcceleration_mm_s2(const float &acc) { planner.settings.travel_acceleration = acc; } + void setRetractAcceleration_mm_s2(const float &acc) { planner.settings.retract_acceleration = acc; } + void setTravelAcceleration_mm_s2(const float &acc) { planner.settings.travel_acceleration = acc; } #if ENABLED(BABYSTEPPING) diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 701bf9eb54..380d311517 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -139,6 +139,17 @@ namespace ExtUI { uint32_t getProgress_seconds_elapsed(); + #if PREHEAT_COUNT + uint16_t getMaterial_preset_E(const uint16_t); + #if HAS_HEATED_BED + uint16_t getMaterial_preset_B(const uint16_t); + #endif + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + uint8_t getIDEX_Mode(); + #endif + #if ENABLED(SHOW_REMAINING_TIME) inline uint32_t getProgress_seconds_remaining() { return ui.get_remaining_time(); } #endif @@ -171,6 +182,7 @@ namespace ExtUI { #endif #if ENABLED(PRINTCOUNTER) + char* getFailedPrints_str(char buffer[21]); char* getTotalPrints_str(char buffer[21]); char* getFinishedPrints_str(char buffer[21]); char* getTotalPrintTime_str(char buffer[21]); diff --git a/platformio.ini b/platformio.ini index 11dcecfc99..941426d732 100644 --- a/platformio.ini +++ b/platformio.ini @@ -59,6 +59,7 @@ default_src_filter = + - - + - - - - - + - - - - - - @@ -289,6 +290,7 @@ HAS_MENU_TRAMMING = src_filter=+ HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_CHIRON = src_filter=+ + ANYCUBIC_LCD_I3MEGA = src_filter=+ + +NEXTION_TFT = src_filter=+ + HAS_DGUS_LCD = src_filter=+ + DGUS_LCD_UI_FYSETC = src_filter=+ DGUS_LCD_UI_HIPRECY = src_filter=+ From c4d757c6f7c502a04305448eef66dca15919f5f0 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 19 Mar 2021 18:05:30 +1300 Subject: [PATCH 1170/1370] Fix preflight motherboard target check (#21372) Co-authored-by: Scott Lahteine --- .../PlatformIO/scripts/preflight-checks.py | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 4499c2bfdc..2ad1562a31 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -5,8 +5,18 @@ import os,re,sys Import("env") -def get_envs_for_board(board, envregex): +def get_envs_for_board(board): with open(os.path.join("Marlin", "src", "pins", "pins.h"), "r") as file: + + if sys.platform == 'win32': + envregex = r"(?:env|win):" + elif sys.platform == 'darwin': + envregex = r"(?:env|mac|uni):" + elif sys.platform == 'linux': + envregex = r"(?:env|lin|uni):" + else: + envregex = r"(?:env):" + r = re.compile(r"if\s+MB\((.+)\)") if board.startswith("BOARD_"): board = board[6:] @@ -17,7 +27,8 @@ def get_envs_for_board(board, envregex): line = file.readline() found_envs = re.match(r"\s*#include .+" + envregex, line) if found_envs: - return re.findall(envregex + r"(\w+)", line) + envlist = re.findall(envregex + r"(\w+)", line) + return [ "env:"+s for s in envlist ] return [] def check_envs(build_env, board_envs, config): @@ -43,24 +54,15 @@ if 'MARLIN_FEATURES' not in env: if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") -if sys.platform == 'win32': - osregex = r"(?:env|win):" -elif sys.platform == 'darwin': - osregex = r"(?:env|mac|uni):" -elif sys.platform == 'linux': - osregex = r"(?:env|lin|uni):" -else: - osregex = r"(?:env):" - build_env = env['PIOENV'] motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] -board_envs = get_envs_for_board(motherboard, osregex) +board_envs = get_envs_for_board(motherboard) config = env.GetProjectConfig() -result = check_envs(build_env, board_envs, config) +result = check_envs("env:"+build_env, board_envs, config) if not result: err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ - (build_env, motherboard, ",".join([e[4:] for e in board_envs if re.match(r"^" + osregex, e)])) + ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) raise SystemExit(err) # From e50af65a1b82e804ca66faf6da7bd1e89d5b10f5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 18 Mar 2021 15:59:48 -0500 Subject: [PATCH 1171/1370] Fix bool++ warning --- Marlin/src/feature/encoder_i2c.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index cf5ebfd012..abaa93f767 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -47,7 +47,7 @@ void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { encoderAxis = axis; i2cAddress = address; - initialized++; + initialized = true; SERIAL_ECHOLNPAIR("Setting up encoder on ", AS_CHAR(axis_codes[encoderAxis]), " axis, addr = ", address); @@ -209,8 +209,7 @@ void I2CPositionEncoder::set_homed() { delay(10); zeroOffset = get_raw_count(); - homed++; - trusted++; + homed = trusted = true; #ifdef I2CPE_DEBUG SERIAL_CHAR(axis_codes[encoderAxis]); From 39c30d6fd619cb8b57e7f4a750b3da1862fc8f6d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 23:55:55 -0500 Subject: [PATCH 1172/1370] HAL eeprom cleanup --- Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp | 2 +- Marlin/src/HAL/shared/eeprom_if.h | 2 +- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 17 ++++--- Marlin/src/HAL/shared/eeprom_if_spi.cpp | 57 +++++++++++------------- 4 files changed, 37 insertions(+), 41 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp index ccc3fc537f..78b7af0b04 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp @@ -40,7 +40,7 @@ void eeprom_init() { BL24CXX::init(); } // Public functions // ------------------------ -void eeprom_write_byte(uint8_t *pos, unsigned char value) { +void eeprom_write_byte(uint8_t *pos, uint8_t value) { const unsigned eeprom_address = (unsigned)pos; return BL24CXX::writeOneByte(eeprom_address, value); } diff --git a/Marlin/src/HAL/shared/eeprom_if.h b/Marlin/src/HAL/shared/eeprom_if.h index e44da801df..e496de2a03 100644 --- a/Marlin/src/HAL/shared/eeprom_if.h +++ b/Marlin/src/HAL/shared/eeprom_if.h @@ -25,5 +25,5 @@ // EEPROM // void eeprom_init(); -void eeprom_write_byte(uint8_t *pos, unsigned char value); +void eeprom_write_byte(uint8_t *pos, uint8_t value); uint8_t eeprom_read_byte(uint8_t *pos); diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index da70af2772..f6dd33b7c4 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -55,12 +55,15 @@ static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRE // Public functions // ------------------------ -void eeprom_write_byte(uint8_t *pos, unsigned char value) { +static void _eeprom_begin(uint8_t * const pos) { const unsigned eeprom_address = (unsigned)pos; - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB + Wire.write(int(eeprom_address >> 8)); // Address High + Wire.write(int(eeprom_address & 0xFF)); // Address Low +} + +void eeprom_write_byte(uint8_t *pos, uint8_t value) { + _eeprom_begin(pos); Wire.write(value); Wire.endTransmission(); @@ -70,11 +73,7 @@ void eeprom_write_byte(uint8_t *pos, unsigned char value) { } uint8_t eeprom_read_byte(uint8_t *pos) { - const unsigned eeprom_address = (unsigned)pos; - - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB + _eeprom_begin(pos); Wire.endTransmission(); Wire.requestFrom(eeprom_device_address, (byte)1); return Wire.available() ? Wire.read() : 0xFF; diff --git a/Marlin/src/HAL/shared/eeprom_if_spi.cpp b/Marlin/src/HAL/shared/eeprom_if_spi.cpp index a341fef9de..e162f6fedc 100644 --- a/Marlin/src/HAL/shared/eeprom_if_spi.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_spi.cpp @@ -43,44 +43,41 @@ void eeprom_init() {} #define EEPROM_WRITE_DELAY 7 #endif -uint8_t eeprom_read_byte(uint8_t* pos) { - uint8_t v; - uint8_t eeprom_temp[3]; - - // set read location - // begin transmission from device - eeprom_temp[0] = CMD_READ; - eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; // addr High - eeprom_temp[2] = (unsigned)pos& 0xFF; // addr Low - WRITE(SPI_EEPROM1_CS, HIGH); - WRITE(SPI_EEPROM1_CS, LOW); +static void _eeprom_begin(uint8_t * const pos, const uint8_t cmd) { + const uint8_t eeprom_temp[3] = { + cmd, + (unsigned(pos) >> 8) & 0xFF, // Address High + unsigned(pos) & 0xFF // Address Low + }; + WRITE(SPI_EEPROM1_CS, HIGH); // Usually free already + WRITE(SPI_EEPROM1_CS, LOW); // Activate the Bus spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + // Leave the Bus in-use +} + +uint8_t eeprom_read_byte(uint8_t* pos) { + _eeprom_begin(pos, CMD_READ); // Set read location and begin transmission + + const uint8_t v = spiRec(SPI_CHAN_EEPROM1); // After READ a value sits on the Bus + + WRITE(SPI_EEPROM1_CS, HIGH); // Done with device - v = spiRec(SPI_CHAN_EEPROM1); - WRITE(SPI_EEPROM1_CS, HIGH); return v; } -void eeprom_write_byte(uint8_t* pos, uint8_t value) { - uint8_t eeprom_temp[3]; - - /*write enable*/ - eeprom_temp[0] = CMD_WREN; +void eeprom_write_byte(uint8_t *pos, uint8_t value) { + const uint8_t eeprom_temp = CMD_WREN; WRITE(SPI_EEPROM1_CS, LOW); - spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 1); - WRITE(SPI_EEPROM1_CS, HIGH); - delay(1); + spiSend(SPI_CHAN_EEPROM1, &eeprom_temp, 1); // Write Enable - /*write addr*/ - eeprom_temp[0] = CMD_WRITE; - eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; //addr High - eeprom_temp[2] = (unsigned)pos & 0xFF; //addr Low - WRITE(SPI_EEPROM1_CS, LOW); - spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + WRITE(SPI_EEPROM1_CS, HIGH); // Done with the Bus + delay(1); // For a small amount of time - spiSend(SPI_CHAN_EEPROM1, value); - WRITE(SPI_EEPROM1_CS, HIGH); - delay(EEPROM_WRITE_DELAY); // wait for page write to complete + _eeprom_begin(pos, CMD_WRITE); // Set write address and begin transmission + + spiSend(SPI_CHAN_EEPROM1, value); // Send the value to be written + WRITE(SPI_EEPROM1_CS, HIGH); // Done with the Bus + delay(EEPROM_WRITE_DELAY); // Give page write time to complete } #endif // USE_SHARED_EEPROM From 5b0dc4d325b99ff8e030bdde7af2ceeefa822f04 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Mon, 22 Mar 2021 23:51:03 -0600 Subject: [PATCH 1173/1370] Mesh Editor for FTDI Eve Touch UI (#21381) --- .../ftdi_eve_lib/extended/grid_layout.h | 13 +++ .../ftdi_eve_lib/extras/adjuster_widget.cpp | 54 +++++++++ .../ftdi_eve_lib/extras/adjuster_widget.h | 32 ++++++ .../ftdi_eve_touch_ui/language/language_en.h | 1 - .../screens/bed_mesh_screen.cpp | 103 ++++++++++++------ .../screens/bed_mesh_screen.h | 15 ++- .../screens/leveling_menu.cpp | 8 +- Marlin/src/lcd/extui/ui_api.cpp | 20 ++++ Marlin/src/lcd/extui/ui_api.h | 1 + 9 files changed, 205 insertions(+), 42 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h index 82bb8abf7f..47aec24d83 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h @@ -87,6 +87,19 @@ cmd.cmd(LINE_WIDTH(16)); \ } +// Routines for subdividing a grid within a box (x,y,w,h) + +#define SUB_GRID_W(W) ((W)*w/SUB_COLS) +#define SUB_GRID_H(H) ((H)*h/SUB_ROWS) +#define SUB_GRID_X(X) (SUB_GRID_W((X)-1) + x) +#define SUB_GRID_Y(Y) (SUB_GRID_H((Y)-1) + y) +#define SUB_X(X) (SUB_GRID_X(X) + MARGIN_L) +#define SUB_Y(Y) (SUB_GRID_Y(Y) + MARGIN_T) +#define SUB_W(W) (SUB_GRID_W(W) - MARGIN_L - MARGIN_R) +#define SUB_H(H) (SUB_GRID_H(H) - MARGIN_T - MARGIN_B) +#define SUB_POS(X,Y) SUB_X(X), SUB_Y(Y) +#define SUB_SIZE(W,H) SUB_W(W), SUB_H(H) + namespace FTDI { #if ENABLED(TOUCH_UI_PORTRAIT) constexpr uint16_t display_width = Vsize; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp new file mode 100644 index 0000000000..084c9c014f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp @@ -0,0 +1,54 @@ +/*********************** + * adjuster_widget.cpp * + ***********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../ftdi_eve_lib.h" +#include "../extended/grid_layout.h" + +#include "adjuster_widget.h" + +#define SUB_COLS 9 +#define SUB_ROWS 1 +#define VAL_POS SUB_POS(1,1), SUB_SIZE(5,1) +#define INC_POS SUB_POS(6,1), SUB_SIZE(2,1) +#define DEC_POS SUB_POS(8,1), SUB_SIZE(2,1) + +void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { + if (what & BACKGROUND) + cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); + + if (what & FOREGROUND) { + char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; + if (isnan(value)) + strcpy_P(str, PSTR("-")); + else + dtostrf(value, width, precision, str); + + if (units) { + strcat_P(str, PSTR(" ")); + strcat_P(str, (const char*) units); + } + + cmd.tag(0) + .text(VAL_POS, str) + .tag(tag ).button(INC_POS, F("-")) + .tag(tag+1).button(DEC_POS, F("+")); + } +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h new file mode 100644 index 0000000000..c48e37f620 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h @@ -0,0 +1,32 @@ +/********************* + * adjuster_widget.h * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once +#include "../extended/screen_types.h" + +void draw_adjuster( + CommandProcessor& cmd, + int16_t x, int16_t y, int16_t w, int16_t h, + uint8_t tag, + float value, progmem_str units = nullptr, + int8_t width = 5, uint8_t precision = 1, + draw_mode_t what = BOTH +); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index e57858aa3f..f6603e514a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -144,7 +144,6 @@ namespace Language_en { PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished"; PROGMEM Language_Str MSG_BED_MAPPING_INCOMPLETE = u8"Not all points probed"; PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; - PROGMEM Language_Str MSG_SHOW_MESH = u8"Show Bed Mesh"; #if ENABLED(TOUCH_UI_LULZBOT_BIO) PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 6de573da8c..c87329ebe2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -25,21 +25,24 @@ #ifdef FTDI_BED_MESH_SCREEN +#include "../ftdi_eve_lib/extras/adjuster_widget.h" + using namespace FTDI; using namespace Theme; using namespace ExtUI; constexpr static BedMeshScreenData &mydata = screen_data.BedMeshScreen; +constexpr static float gaugeThickness = 0.25; #if ENABLED(TOUCH_UI_PORTRAIT) - #define GRID_COLS 2 + #define GRID_COLS 3 #define GRID_ROWS 10 - #define MESH_POS BTN_POS(1, 2), BTN_SIZE(2,5) - #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(2,1) + #define MESH_POS BTN_POS(1, 2), BTN_SIZE(3,5) + #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(3,1) #define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1) - #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(1,1) - #define OKAY_POS BTN_POS(1,10), BTN_SIZE(2,1) + #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(2,1) + #define OKAY_POS BTN_POS(1,10), BTN_SIZE(3,1) #else #define GRID_COLS 5 #define GRID_ROWS 5 @@ -198,12 +201,12 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: if (opts & USE_HIGHLIGHT) { const uint8_t tag = mydata.highlightedTag; - uint8_t x, y; - if (tagToPoint(tag, x, y)) { + xy_uint8_t pt; + if (tagToPoint(tag, pt)) { cmd.cmd(COLOR_A(128)) .cmd(POINT_SIZE(basePointSize * 6)) .cmd(BEGIN(POINTS)) - .tag(tag).cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); + .tag(tag).cmd(VERTEX2F(TRANSFORM(pt.x, pt.y, HEIGHT(pt.x, pt.y)))); } } cmd.cmd(END()); @@ -214,43 +217,68 @@ uint8_t BedMeshScreen::pointToTag(uint8_t x, uint8_t y) { return y * (GRID_MAX_POINTS_X) + x + 10; } -bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) { +bool BedMeshScreen::tagToPoint(uint8_t tag, xy_uint8_t &pt) { if (tag < 10) return false; - x = (tag - 10) % (GRID_MAX_POINTS_X); - y = (tag - 10) / (GRID_MAX_POINTS_X); + pt.x = (tag - 10) % (GRID_MAX_POINTS_X); + pt.y = (tag - 10) / (GRID_MAX_POINTS_X); return true; } void BedMeshScreen::onEntry() { mydata.highlightedTag = 0; + mydata.zAdjustment = 0; mydata.count = GRID_MAX_POINTS; mydata.message = mydata.MSG_NONE; BaseScreen::onEntry(); } -float BedMeshScreen::getHightlightedValue() { - if (mydata.highlightedTag) { - xy_uint8_t pt; - tagToPoint(mydata.highlightedTag, pt.x, pt.y); - return ExtUI::getMeshPoint(pt); +float BedMeshScreen::getHighlightedValue(bool nanAsZero) { + xy_uint8_t pt; + if (tagToPoint(mydata.highlightedTag, pt)) { + const float val = ExtUI::getMeshPoint(pt); + return (isnan(val) && nanAsZero) ? 0 : val; } return NAN; } -void BedMeshScreen::drawHighlightedPointValue() { - char str[16]; - const float val = getHightlightedValue(); - const bool isGood = !isnan(val); - if (isGood) - dtostrf(val, 5, 3, str); - else - strcpy_P(str, PSTR("-")); +void BedMeshScreen::setHighlightedValue(float value) { + xy_uint8_t pt; + if (tagToPoint(mydata.highlightedTag, pt)) + ExtUI::setMeshPoint(pt, value); +} +void BedMeshScreen::moveToHighlightedValue() { + xy_uint8_t pt; + if (tagToPoint(mydata.highlightedTag, pt)) + ExtUI::moveToMeshPoint(pt, gaugeThickness + mydata.zAdjustment); +} + +void BedMeshScreen::adjustHighlightedValue(float increment) { + mydata.zAdjustment += increment; + moveToHighlightedValue(); +} + +void BedMeshScreen::saveAdjustedHighlightedValue() { + if(mydata.zAdjustment) { + BedMeshScreen::setHighlightedValue(BedMeshScreen::getHighlightedValue(true) + mydata.zAdjustment); + mydata.zAdjustment = 0; + } +} + +void BedMeshScreen::changeHighlightedValue(uint8_t tag) { + saveAdjustedHighlightedValue(); + mydata.highlightedTag = tag; + moveToHighlightedValue(); +} + +void BedMeshScreen::drawHighlightedPointValue() { CommandProcessor cmd; cmd.font(Theme::font_medium) + .colors(normal_btn) .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) - .text(Z_VALUE_POS, str) - .colors(action_btn) + .font(font_small); + draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); + cmd.colors(action_btn) .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); @@ -292,19 +320,23 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { } } -bool BedMeshScreen::onTouchStart(uint8_t tag) { - mydata.highlightedTag = tag; - return true; -} - bool BedMeshScreen::onTouchEnd(uint8_t tag) { + constexpr float increment = 0.01; switch (tag) { case 1: + saveAdjustedHighlightedValue(); + injectCommands_P(PSTR("G29 S1")); GOTO_PREVIOUS(); return true; + case 2: adjustHighlightedValue(-increment); break; + case 3: adjustHighlightedValue( increment); break; default: - return false; + if (tag >= 10) + changeHighlightedValue(tag); + else + return false; } + return true; } void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { @@ -341,4 +373,11 @@ void BedMeshScreen::startMeshProbe() { injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); } +void BedMeshScreen::showMeshEditor() { + SpinnerDialogBox::enqueueAndWait_P(ExtUI::isMachineHomed() ? F("M420 S1") : F("G28\nM420 S1")); + // After the spinner, go to this screen. + current_screen.forget(); + PUSH_SCREEN(BedMeshScreen); +} + #endif // FTDI_BED_MESH_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h index de72d863ae..804bb57ad0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h @@ -32,6 +32,7 @@ struct BedMeshScreenData { } message; uint8_t count; uint8_t highlightedTag; + float zAdjustment; }; class BedMeshScreen : public BaseScreen, public CachedScreen { @@ -45,18 +46,22 @@ class BedMeshScreen : public BaseScreen, public CachedScreen Date: Tue, 23 Mar 2021 06:57:50 +0100 Subject: [PATCH 1174/1370] Update Hungarian language (#21407) --- Marlin/src/lcd/language/language_hu.h | 221 ++++++++++++++------------ 1 file changed, 115 insertions(+), 106 deletions(-) diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index e29b75fb35..b2c1d30f33 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -22,12 +22,15 @@ #pragma once /** - * Magyar + * Hungarian / Magyar + * + * LCD Menu Messages. See also https://marlinfw.org/docs/development/lcd_language.html + * Hungarian translation by AntoszHUN. I am constantly improving and updating the translation. + * Translation last updated: 21/03/2021 - 21:00 * * LCD Menü Ãœzenetek. Lásd még https://marlinfw.org/docs/development/lcd_language.html - * Marlin 2.0.x bugfix Magyar fordítása. A fordítást folyamatosan javítom és frissítem. - * A Magyar fordítást készítette: AntoszHUN - * A Fordítás utolsó frissítése: 2021.03.06. - 08:00 + * A Magyar fordítást készítette: AntoszHUN. A fordítást folyamatosan javítom és frissítem. + * A Fordítás utolsó frissítése: 2021.03.21. - 21:00 */ namespace Language_hu { @@ -45,7 +48,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló behelyezve"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló eltávolítva"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra"); - PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD-Kártya hiba"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD-kártya hiba"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba"); @@ -59,15 +62,15 @@ namespace Language_hu { PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("X-Y-Z Auto kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Igazítás"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("X-Y-Z auto kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z kezdöpont"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-igazítás"); PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Ismétlés: %i"); PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Pontosság csökken!"); PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Pontosság elérve"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("X-Y-Z Kezdöpont"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("X-Y-Z kezdöpont"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez."); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö pont"); PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Szintezés kész!"); @@ -106,7 +109,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó telj."); PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Lézer váltás"); PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Impulzus teszt ms"); - PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Tűz impulzus"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Tüz impulzus"); PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Orsóváltás"); PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Orsó elÅ‘re"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó hátra"); @@ -120,7 +123,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ãgy szintezése"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Sarok szint"); PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Ãgy emelése a szonda váltásig"); - PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Minden sarok tolerancián belül. Szint jó"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Minden sarok tolerancián belül. Szint jó."); PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Jó pontok: "); PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Utolsó Z: "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Következö sarok"); @@ -130,24 +133,24 @@ namespace Language_hu { PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Próbapont"); PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Érték"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z érték"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni parancs"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe teszt"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Szonda teszt"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Pont"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Szonda határon kívül"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Eltérés"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mód"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX mód"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Eszköz eltolás"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkolás"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Automata parkolás"); PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Teljes felügyelet"); - PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("X-Hézag másolása"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. fúvóka X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. fúvóka Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fúvóka Z"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("X-hézag másolása"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. fej X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. fej Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fej Z"); PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Szintezz! G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Eszköz"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL eszköz"); PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Egységes ágy szint"); PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Döntési pont"); PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Kézi háló építés"); @@ -155,12 +158,12 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mérés"); PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Ãœres ágyat mérj"); PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Továbblépés"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL Aktívál"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL Deaktívál"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktívál"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL deaktívál"); PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ãgy höfok"); PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Ãgy höfok"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fúvóka höfok"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fúvóka höfok"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fej höfok"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fej höfok"); PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Háló szerkesztés"); PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni háló szerkesztés"); PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított háló"); @@ -174,8 +177,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló elfogadás"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló elfogadás ($)"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi háló elfogadása"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ãgy fűtés"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka fűtés"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ãgy fütés"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fej fütés"); PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Kézi alapozás..."); PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fix hosszúságú alap"); PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Alapozás kész"); @@ -192,7 +195,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host kimenet"); PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV kimenet"); PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató bizt.mentés"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Infó kimenet"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL infó kimenet"); PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési költség"); PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi kitöltés"); PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Okos kitöltés"); @@ -208,10 +211,10 @@ namespace Language_hu { PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Háló %i betöltve"); PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Háló %i mentve"); PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nincs tároló"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL Mentés"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL Visszaáll"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Eltolás: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Eltolás leállítva"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL mentés"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL visszaáll."); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-eltolás: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-eltolás leállítva"); PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl lépésre UBL"); PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg háló készítés"); PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens kitöltés"); @@ -221,7 +224,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden finomítása"); PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Ãgy háló mentése"); - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Vezérlés"); + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED vezérlés"); PROGMEM Language_Str MSG_LEDS = _UxGT("Világítás"); PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Beállított színek"); PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Piros"); @@ -235,7 +238,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték"); PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Csatorna ="); PROGMEM Language_Str MSG_LEDS2 = _UxGT("LED-ek #2"); - PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Fény #2 Megadott"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Fény #2 megadott"); PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("FényerÅ‘"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni szín"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros intenzitás"); @@ -245,13 +248,13 @@ namespace Language_hu { PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Fényerö"); PROGMEM Language_Str MSG_MOVING = _UxGT("Mozgás..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY Szabad"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("X Mozgás"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y Mozgás"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z Mozgás"); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY szabad"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("X mozgás"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y mozgás"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z mozgás"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fej túl hideg"); PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mozgás %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm"); @@ -261,18 +264,21 @@ namespace Language_hu { PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_SPEED = _UxGT("Sebesség"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Z ágy"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Fúvóka"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Fúvóka ~"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Fej"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Fej ~"); PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Fej parkolva"); PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Fej készenlétbe"); PROGMEM Language_Str MSG_BED = _UxGT("Ãgy"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Burkolat"); + PROGMEM Language_Str MSG_COOLER = _UxGT("Lézer hütövíz"); + PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Hütö kapcsoló"); + PROGMEM Language_Str MSG_LASER = _UxGT("Lézer"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Hütés sebesség"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Hütés sebesség ="); PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Tárolt hütés ="); PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra hütés sebesség"); PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra hütés sebesség ="); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Hűtésvezérlés"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Hütésvezérlés"); PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Alapjárat"); PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus mód"); PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív sebesség"); @@ -286,9 +292,9 @@ namespace Language_hu { PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Automata höfok"); PROGMEM Language_Str MSG_LCD_ON = _UxGT("Be"); PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Ki"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Hangolás"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Hangolás *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID Hangolás kész"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID hangolás"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID hangolás *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID hangolás kész"); PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz adagoló."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Hangolási hiba. Magas hömérséklet."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Hangolási hiba! Idötúllépés."); @@ -296,10 +302,10 @@ namespace Language_hu { PROGMEM Language_Str MSG_SELECT_E = _UxGT("Kiválaszt *"); PROGMEM Language_Str MSG_ACC = _UxGT("Gyorsítás"); PROGMEM Language_Str MSG_JERK = _UxGT("Rántás"); - PROGMEM Language_Str MSG_VA_JERK = LCD_STR_A _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VB_JERK = LCD_STR_B _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VC_JERK = LCD_STR_C _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("E Ránt. Seb."); + PROGMEM Language_Str MSG_VA_JERK = LCD_STR_A _UxGT(" Ránt. seb."); + PROGMEM Language_Str MSG_VB_JERK = LCD_STR_B _UxGT(" Ránt. seb."); + PROGMEM Language_Str MSG_VC_JERK = LCD_STR_C _UxGT(" Ránt. seb."); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("E ránt. seb."); PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Csomopont eltérés"); PROGMEM Language_Str MSG_VELOCITY = _UxGT("Sebesség"); PROGMEM Language_Str MSG_VMAX_A = _UxGT("Max sebesség ") LCD_STR_A; @@ -331,25 +337,25 @@ namespace Language_hu { PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm³-ben"); PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit mm³-ben"); PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. Ãtm."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. Ãtm. *"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. átm."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. átm. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Kiadás mm"); PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Betöltés mm"); PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Haladó K"); PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Haladó K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Kontraszt"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontraszt"); PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Mentés EEPROM"); PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Betöltés EEPROM"); PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Alapértelmezett"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM Inicializálás"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM inicializálás"); PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Hiba: EEPROM CRC"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM Index"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM Verzió"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM index"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM verzió"); PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Beállítások mentve"); PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Tároló frissítés"); PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Nyomtató újraindítása"); PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); PROGMEM Language_Str MSG_PREPARE = _UxGT("Vezérlés"); PROGMEM Language_Str MSG_TUNE = _UxGT("Hangolás"); PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Teljesítménymonitor"); @@ -390,24 +396,24 @@ namespace Language_hu { PROGMEM Language_Str MSG_KILLED = _UxGT("HALOTT! "); PROGMEM Language_Str MSG_STOPPED = _UxGT("MEGÃLLT! "); PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Visszahúzás mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Visszahúzás Cs. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Visszahúzás cs. mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Viszahúzás"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.visszah.helyre mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Visszahúzás V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S Vissza.h V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto Visszah."); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto visszah."); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás távolság"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra csere"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási távolság"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Szerszámcsere"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Emelés"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z emelés"); PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Fösebesség"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. Sebesség"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. sebesség"); PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej parkolás"); PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszav.visszah. sebesség"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN Sebesség"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN sebesség"); PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("FAN idö"); PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto BE"); PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto KI"); @@ -415,8 +421,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata csere"); PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Utolsó adagoló"); PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Csere *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Szál csere"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Szál csere *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Szálcsere"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Szálcsere *"); PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Szál betöltés"); PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Szál betöltés *"); PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Szál eltávolítás"); @@ -436,23 +442,23 @@ namespace Language_hu { PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mód"); PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mód"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Módok"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V Mód"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD Mód"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V mód"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD mód"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Jelentés"); PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Eltolás teszt"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z eltolás teszt"); PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés"); PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI használ"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe használ"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe elhelyezés"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Szonda telepítés"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Szonda elhelyezés"); PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s kell"); PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda eltolások"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X Szonda eltolás"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y Szonda eltolás"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Szonda eltolás"); - PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fúvóka az ágyhoz"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X szonda eltolás"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y szonda eltolás"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z szonda eltolás"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fej az ágyhoz"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikrolépés X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikrolépés Z"); @@ -463,9 +469,11 @@ namespace Language_hu { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÃœTÉS KIMARADÃS"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÃGY FÃœTÉS KIMARADÃS"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÃœTÉS KIMARADÃS"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX Höfok"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN Höfok"); - PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEFAGYOTT"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_COOLER = _UxGT("Hütés kimaradás"); + PROGMEM Language_Str MSG_COOLING_FAILED = _UxGT("Hütés sikertelen"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX höfok"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN höfok"); + PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEÃLLT"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Indítsd újra!"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // Csak egy karakter PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("ó"); // Csak egy karakter @@ -478,15 +486,16 @@ namespace Language_hu { PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Szonda hütése..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kamra fütés..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kamra hütés..."); + PROGMEM Language_Str MSG_LASER_COOLING = _UxGT("Lézer hütés..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibráció"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("X Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Y Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Z Kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("X kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Y kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Z kalibrálás"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ kalibrálás"); PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta beállítások"); PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibráció"); PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta magasság kalib."); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Eltolás"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z eltolás"); PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag rúd"); PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Magasság"); PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Sugár"); @@ -505,7 +514,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI"); PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend üresjárati idök."); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Fej üresjárati idök."); PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Munkalámpa"); PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Fényerösség"); @@ -529,10 +538,10 @@ namespace Language_hu { PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max höfok"); PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Meghajtási erö"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E meghajtó %"); PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CSATLAKOZÃSI HIBA"); PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM írása"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("NYOMTATÓSZÃL CSERE"); @@ -542,7 +551,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FOLYTATÃSI OPCIÓ:"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Tisztítsd meg"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Folytatás"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fúvóka: "); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fej: "); PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Túlfutás szenzor"); PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás táv. mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Tájolási hiba"); @@ -550,13 +559,13 @@ namespace Language_hu { PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SZÃLVÃLASZTÃS"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Szoftver feltöltése!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Figyelmeztetés."); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU szoftver feltöltése!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU figyelmeztetés."); PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Nyomtatás folytatása"); PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Folytatás..."); PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál betöltése"); PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Összes betöltése"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fúvóka betöltése"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fej betöltése"); PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál kiadása"); PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál kiadása ~"); PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Kiadja a szálat"); @@ -565,8 +574,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Szál kiadása...."); PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Mind"); PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Nyomtatószál ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU Újraindítás"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Újraindul..."); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU újraindítás"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU újraindul..."); PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Eltávolít, kattint"); PROGMEM Language_Str MSG_MIX = _UxGT("Kever"); @@ -615,10 +624,10 @@ namespace Language_hu { #if LCD_HEIGHT >= 4 PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nyomj gombot", "nyomtatás folytatáshoz")); PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Várj míg", "szál csere", "indítás")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Várj míg", "szálcsere", "indítás")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Szál behelyezés", "majd nyomj gombot", "a folytatáshoz")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nyomj gombot", "a fúvóka fűtéséhez")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Fúvóka fűtése", "Kérlek várj...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nyomj gombot", "a fej fütéséhez")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Fej fütése", "Kérlek várj...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Várj a", "szál kiadására")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Várj a", "szál betöltésére")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Várj a", "szál tisztításra")); @@ -629,15 +638,15 @@ namespace Language_hu { PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek várj...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Behelyez majd katt")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fűtéshez")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fűtés...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fütéshez")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fütés...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Kiadás...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Betöltés...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Tisztítás...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Katt ha kész")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Folytatás...")); #endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Meghajtók"); + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC meghajtók"); PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Meghajtó áram"); PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrid küszöbérték"); PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Motoros kezdöpont"); @@ -652,19 +661,19 @@ namespace Language_hu { PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korrekció"); PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Simítás"); - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Tengely szint"); + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X tengely szint"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Önkalibrálás"); #if ENABLED(TOUCH_UI_FTDI_EVE) - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Tétlenségi idökorlát, a hömérséklet csökkent. Nyomja meg az OK gombot az ismételt felfűtéshez, és újra a folytatáshoz."); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Tétlenségi idökorlát, a hömérséklet csökkent. Nyomd meg az OK gombot az ismételt felfütéshez, és újra a folytatáshoz."); #else - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fűtés idökorlátja"); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fütés idökorlátja"); #endif - PROGMEM Language_Str MSG_REHEAT = _UxGT("Újrafűt"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafűtés..."); + PROGMEM Language_Str MSG_REHEAT = _UxGT("Újrafüt"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafütés..."); - PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Szonda varázsló"); - PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Z Referencia mérés"); - PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Menjen a próba pontra"); + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z szonda varázsló"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Z referencia mérés"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Menj a próba pontra"); PROGMEM Language_Str MSG_SOUND = _UxGT("Hang"); From 9a1c4f91fe920afb05fef4c82ddb23476c05e3de Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Tue, 23 Mar 2021 13:58:52 +0800 Subject: [PATCH 1175/1370] Fix MKS H43 sensorless homing (#21388) --- Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 4 ++-- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index bfa518446d..78865bbfd6 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -36,7 +36,7 @@ #include "../../../../marlinui.h" #if ENABLED(HAS_STEALTHCHOP) - #include "../../../../module/stepper/trinamic.h" + #include "../../../../../module/stepper/trinamic.h" #endif #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) @@ -746,9 +746,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // SDCard File listing + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), #if ENABLED(SDSUPPORT) VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), - VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 577171a135..bf2b05dcbf 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -1246,6 +1246,9 @@ void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { uint16_t val_t = swap16(*(uint16_t*)val_ptr); + if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) + return; + switch (val_t) { case 0: #if HOTENDS >= 1 @@ -1497,7 +1500,7 @@ bool DGUSScreenHandler::loop() { static bool booted = false; if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) { booted = true; - #if ANY_AXIS_HAS(STEALTHCHOP) + #if USE_SENSORLESS #if AXIS_HAS_STEALTHCHOP(X) tmc_x_step = stepperX.homing_threshold(); #endif From 259d8f19b327c94921caa8584bf6c50cab696a74 Mon Sep 17 00:00:00 2001 From: mihtjel Date: Tue, 23 Mar 2021 07:00:22 +0100 Subject: [PATCH 1176/1370] Fix macros that call macros crashing (#21383) When macros call macros, the null termination should remain in place until the macro is completed, and only then put back. Otherwise, the macro handler interprets this as setting the macro called to a new value. --- Marlin/src/gcode/gcode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 4e324e7892..6290d7a1d5 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1048,8 +1048,8 @@ void GcodeSuite::process_subcommands_now(char * gcode) { char * const delim = strchr(gcode, '\n'); // Get address of next newline if (delim) *delim = '\0'; // Replace with nul parser.parse(gcode); // Parse the current command - if (delim) *delim = '\n'; // Put back the newline process_parsed_command(true); // Process it + if (delim) *delim = '\n'; // Put back the newline if (!delim) break; // Last command? gcode = delim + 1; // Get the next command } From c9674cd80947b7c424da28232d6172b600d98112 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 01:03:32 -0500 Subject: [PATCH 1177/1370] Minor process_subcommands_now followup --- Marlin/src/gcode/gcode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 6290d7a1d5..aa206bfeba 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1049,8 +1049,8 @@ void GcodeSuite::process_subcommands_now(char * gcode) { if (delim) *delim = '\0'; // Replace with nul parser.parse(gcode); // Parse the current command process_parsed_command(true); // Process it - if (delim) *delim = '\n'; // Put back the newline if (!delim) break; // Last command? + *delim = '\n'; // Put back the newline gcode = delim + 1; // Get the next command } parser.parse(saved_cmd); // Restore the parser state From e806c3376a2a2cbd863d6ae67fef45f32734762a Mon Sep 17 00:00:00 2001 From: Marcio T Date: Tue, 23 Mar 2021 00:45:51 -0600 Subject: [PATCH 1178/1370] UBL - Hilbert space-filling curve probing sequence (#21387) --- Marlin/Configuration.h | 2 + Marlin/src/feature/bedlevel/ubl/ubl.h | 5 ++ Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 58 +++++++++++++++++++-- buildroot/tests/mega2560 | 2 +- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ce847c0d65..339dae7702 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1478,6 +1478,8 @@ #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + //#define UBL_HILBERT_CURVE // Use Hilbert distribution for less travel when probing multiple points + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index d5da43a6a2..0c4667eed8 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -98,6 +98,11 @@ public: static void display_map(const int) _O0; static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; static mesh_index_pair find_furthest_invalid_mesh_point() _O0; + #if ENABLED(UBL_HILBERT_CURVE) + static void check_if_missing(mesh_index_pair &pt, int x, int y); + static void hilbert(mesh_index_pair &pt, int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n); + static mesh_index_pair find_next_mesh_point(); + #endif static void reset(); static void invalidate(); static void set_all_mesh_points_to_value(const float value); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 8c70feb661..3ea777fd9a 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -757,9 +757,11 @@ void unified_bed_leveling::shift_mesh_height() { } #endif - best = do_furthest - ? find_furthest_invalid_mesh_point() - : find_closest_mesh_point_of_type(INVALID, nearby, true); + best = do_furthest ? find_furthest_invalid_mesh_point() + : TERN(UBL_HILBERT_CURVE, + next_point_in_grid(), + find_closest_mesh_point_of_type(INVALID, nearby, true) + ); if (best.pos.x >= 0) { // mesh point found and is reachable by probe TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); @@ -1298,6 +1300,56 @@ mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const Mesh return closest; } +#if ENABLED(UBL_HILBERT_CURVE) + + constexpr int8_t to_fix(int8_t v) { return v << 1; } + constexpr int8_t to_int(int8_t v) { return v >> 1; } + constexpr uint8_t log2(uint8_t n) { return (n > 1) ? 1 + log2(n >> 1) : 0; } + constexpr uint8_t order(uint8_t n) { return uint8_t(log2(n - 1)) + 1; } + + void unified_bed_leveling::hilbert(mesh_index_pair &pt, int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n) { + /* Hilbert space filling curve implementation + * + * x and y are the coordinates of the bottom left corner + * xi & xj are the i & j components of the unit x vector of the frame + * similarly yi and yj + * + * From: http://www.fundza.com/algorithmic/space_filling/hilbert/basics/index.html + */ + if (n <= 0) + check_if_missing(pt, to_int(x+(xi+yi)/2),to_int(y+(xj+yj)/2)); + else { + hilbert(pt, x, y, yi/2, yj/2, xi/2, xj/2, n-1); + hilbert(pt, x+xi/2, y+xj/2, xi/2, xj/2, yi/2, yj/2, n-1); + hilbert(pt, x+xi/2+yi/2, y+xj/2+yj/2, xi/2, xj/2, yi/2, yj/2, n-1); + hilbert(pt, x+xi/2+yi, y+xj/2+yj, -yi/2, -yj/2, -xi/2, -xj/2, n-1); + } + } + + void unified_bed_leveling::check_if_missing(mesh_index_pair &pt, int x, int y) { + if ( pt.distance < 0 + && x < GRID_MAX_POINTS_X + && y < GRID_MAX_POINTS_Y + && isnan(z_values[x][y]) + && probe.can_reach(mesh_index_to_xpos(x), mesh_index_to_ypos(y)) + ) { + pt.pos.set(x, y); + pt.distance = 1; + } + } + + mesh_index_pair unified_bed_leveling::find_next_mesh_point() { + mesh_index_pair pt; + pt.invalidate(); + pt.distance = -99999.9f; + constexpr uint8_t ord = order(_MAX(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y)); + constexpr uint8_t dim = _BV(ord); + hilbert(pt, to_fix(0), to_fix(0), to_fix(dim), to_fix(0), to_fix(0), to_fix(dim), ord); + return pt; + } + +#endif // UBL_HILBERT_CURVE + /** * 'Smart Fill': Scan from the outward edges of the mesh towards the center. * If an invalid location is found, use the next two points (if valid) to diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index d961ab4eff..e3209899ce 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -36,7 +36,7 @@ opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE jp_kana \ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES \ SDSUPPORT SDCARD_SORT_ALPHA NO_SD_AUTOSTART USB_FLASH_DRIVE_SUPPORT CANCEL_OBJECTS \ - Z_PROBE_SLED AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ + Z_PROBE_SLED AUTO_BED_LEVELING_UBL UBL_HILBERT_CURVE RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ From dca4c2904e39bdd14f9c7c4745f50f8029a1bb07 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 23 Mar 2021 19:47:07 +1300 Subject: [PATCH 1179/1370] Check NOZZLE_CLEAN_FEATURE settings (#21332) Co-authored-by: Scott Lahteine --- .github/workflows/test-builds.yml | 1 + Marlin/src/inc/SanityCheck.h | 15 +++++++++++++++ buildroot/tests/LPC1768 | 4 +++- buildroot/tests/LPC1769 | 4 +++- buildroot/tests/STM32F103RE | 4 +++- buildroot/tests/teensy35 | 4 +++- buildroot/tests/teensy41 | 4 +++- 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 7549e3defc..7b7052e0e1 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -98,6 +98,7 @@ jobs: # Non-working environment tests #- at90usb1286_cdc #- STM32F103CB_malyan + #- STM32F103RE #- mks_robin_mini steps: diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index af30c6156d..d8111c18da 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3349,6 +3349,21 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "Either enable MEATPACK_ON_SERIAL_PORT_* or BINARY_FILE_TRANSFER, not both." #endif +/** + * Sanity check for unique start and stop values in NOZZLE_CLEAN_FEATURE + */ +#if ENABLED(NOZZLE_CLEAN_FEATURE) + constexpr xyz_pos_t start_xyz[8] = NOZZLE_CLEAN_START_POINT, + end_xyz[8] = NOZZLE_CLEAN_END_POINT; + #define _CLEAN_ASSERT(N) static_assert(N >= HOTENDS || end_xyz[N].x != start_xyz[N].x || TERN(NOZZLE_CLEAN_NO_Y, false, end_xyz[N].y != start_xyz[N].y), \ + "NOZZLE_CLEAN Start and End must be made different on HOTEND " STRINGIFY(N)) + _CLEAN_ASSERT(0); _CLEAN_ASSERT(1); + _CLEAN_ASSERT(2); _CLEAN_ASSERT(3); + _CLEAN_ASSERT(4); _CLEAN_ASSERT(5); + _CLEAN_ASSERT(6); _CLEAN_ASSERT(7); + #undef _CLEAN_ASSERT +#endif + /** * Sanity check for valid stepper driver types */ diff --git a/buildroot/tests/LPC1768 b/buildroot/tests/LPC1768 index a6829e85ea..eef0857dac 100755 --- a/buildroot/tests/LPC1768 +++ b/buildroot/tests/LPC1768 @@ -34,7 +34,9 @@ opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB \ EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ GRID_MAX_POINTS_X 16 \ NOZZLE_TO_PROBE_OFFSET '{ 0, 0, 0 }' \ - NOZZLE_CLEAN_MIN_TEMP 170 + NOZZLE_CLEAN_MIN_TEMP 170 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING SOUND_MENU_ITEM \ NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR PREHEAT_BEFORE_LEVELING G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ diff --git a/buildroot/tests/LPC1769 b/buildroot/tests/LPC1769 index 5ca7114543..f0dab630e5 100755 --- a/buildroot/tests/LPC1769 +++ b/buildroot/tests/LPC1769 @@ -15,7 +15,9 @@ exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD \ EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ - GRID_MAX_POINTS_X 16 + GRID_MAX_POINTS_X 16 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET LEVEL_CORNERS_USE_PROBE LEVEL_CORNERS_VERIFY_RAISED \ diff --git a/buildroot/tests/STM32F103RE b/buildroot/tests/STM32F103RE index 426f87d21b..641f1fa56c 100755 --- a/buildroot/tests/STM32F103RE +++ b/buildroot/tests/STM32F103RE @@ -10,7 +10,9 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_STM32F103RE SERIAL_PORT -1 EXTRUDERS 2 +opt_set MOTHERBOARD BOARD_STM32F103RE SERIAL_PORT -1 EXTRUDERS 2 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT \ PAREN_COMMENTS GCODE_MOTION_MODES SINGLENOZZLE TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_PARK \ BAUD_RATE_GCODE GCODE_MACROS NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE diff --git a/buildroot/tests/teensy35 b/buildroot/tests/teensy35 index c9731665c5..36a261a6ae 100755 --- a/buildroot/tests/teensy35 +++ b/buildroot/tests/teensy35 @@ -17,7 +17,9 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 \ EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ I2C_SLAVE_ADDRESS 63 \ - GRID_MAX_POINTS_X 16 + GRID_MAX_POINTS_X 16 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE SOUND_MENU_ITEM \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ diff --git a/buildroot/tests/teensy41 b/buildroot/tests/teensy41 index 6074b5dc5f..55e7e6eae2 100755 --- a/buildroot/tests/teensy41 +++ b/buildroot/tests/teensy41 @@ -17,7 +17,9 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 \ EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ I2C_SLAVE_ADDRESS 63 \ - GRID_MAX_POINTS_X 16 + GRID_MAX_POINTS_X 16 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ From d924adef75670ecd5a21d4553d212ffbb362a46d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 05:54:41 -0500 Subject: [PATCH 1180/1370] Followup to UBL Hilbert --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 3ea777fd9a..bcda183366 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -759,7 +759,7 @@ void unified_bed_leveling::shift_mesh_height() { best = do_furthest ? find_furthest_invalid_mesh_point() : TERN(UBL_HILBERT_CURVE, - next_point_in_grid(), + find_next_mesh_point(), find_closest_mesh_point_of_type(INVALID, nearby, true) ); From ff729744e5f56ff86d7e6c92dd2df16995a3be00 Mon Sep 17 00:00:00 2001 From: borland1 Date: Tue, 23 Mar 2021 06:21:11 -0700 Subject: [PATCH 1181/1370] Main / Config Custom Submenus (#18177) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 98 +++++++---- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 105 +----------- .../screens/custom_user_menus.cpp | 4 +- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 14 +- .../lib/ftdi_eve_touch_ui/screens/screens.h | 8 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_it.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 12 +- Marlin/src/lcd/language/language_cz.h | 2 +- Marlin/src/lcd/language/language_de.h | 2 +- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/language/language_es.h | 2 +- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_gl.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_jp_kana.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_pt_br.h | 2 +- Marlin/src/lcd/language/language_ro.h | 2 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/language/language_uk.h | 2 +- Marlin/src/lcd/language/language_vi.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 2 +- Marlin/src/lcd/language/language_zh_TW.h | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 152 +++++++++++++++++ Marlin/src/lcd/menu/menu_custom.cpp | 141 ---------------- Marlin/src/lcd/menu/menu_main.cpp | 156 +++++++++++++++++- .../PlatformIO/scripts/common-dependencies.h | 3 - buildroot/tests/mega2560 | 4 +- 36 files changed, 440 insertions(+), 367 deletions(-) delete mode 100644 Marlin/src/lcd/menu/menu_custom.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fb1f79b230..328056cb84 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3415,6 +3415,71 @@ #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro #endif +/** + * User-defined menu items to run custom G-code. + * Up to 25 may be defined, but the actual number is LCD-dependent. + */ + +// Custom Menu: Main Menu +//#define CUSTOM_MENU_MAIN +#if ENABLED(CUSTOM_MENU_MAIN) + //#define CUSTOM_MENU_MAIN_TITLE "Custom Commands" + #define CUSTOM_MENU_MAIN_SCRIPT_DONE "M117 User Script Done" + #define CUSTOM_MENU_MAIN_SCRIPT_AUDIBLE_FEEDBACK + //#define CUSTOM_MENU_MAIN_SCRIPT_RETURN // Return to status screen after a script + #define CUSTOM_MENU_MAIN_ONLY_IDLE // Only show custom menu when the machine is idle + + #define MAIN_MENU_ITEM_1_DESC "Home & UBL Info" + #define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W" + //#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action + + #define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL + #define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + //#define MAIN_MENU_ITEM_2_CONFIRM + + //#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL + //#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + //#define MAIN_MENU_ITEM_3_CONFIRM + + //#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level" + //#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + //#define MAIN_MENU_ITEM_4_CONFIRM + + //#define MAIN_MENU_ITEM_5_DESC "Home & Info" + //#define MAIN_MENU_ITEM_5_GCODE "G28\nM503" + //#define MAIN_MENU_ITEM_5_CONFIRM +#endif + +// Custom Menu: Configuration Menu +//#define CUSTOM_MENU_CONFIG +#if ENABLED(CUSTOM_MENU_CONFIG) + //#define CUSTOM_MENU_CONFIG_TITLE "Custom Commands" + #define CUSTOM_MENU_CONFIG_SCRIPT_DONE "M117 Wireless Script Done" + #define CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK + //#define CUSTOM_MENU_CONFIG_SCRIPT_RETURN // Return to status screen after a script + #define CUSTOM_MENU_CONFIG_ONLY_IDLE // Only show custom menu when the machine is idle + + #define CONFIG_MENU_ITEM_1_DESC "Wifi ON" + #define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678" + //#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action + + #define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON" + #define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678" + //#define CONFIG_MENU_ITEM_2_CONFIRM + + //#define CONFIG_MENU_ITEM_3_DESC "Radio OFF" + //#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678" + //#define CONFIG_MENU_ITEM_3_CONFIRM + + //#define CONFIG_MENU_ITEM_4_DESC "Wifi ????" + //#define CONFIG_MENU_ITEM_4_GCODE "M118 ????" + //#define CONFIG_MENU_ITEM_4_CONFIRM + + //#define CONFIG_MENU_ITEM_5_DESC "Wifi ????" + //#define CONFIG_MENU_ITEM_5_GCODE "M118 ????" + //#define CONFIG_MENU_ITEM_5_CONFIRM +#endif + /** * User-defined buttons to run custom G-code. * Up to 25 may be defined. @@ -3446,39 +3511,6 @@ #endif #endif -/** - * User-defined menu items to run custom G-code. - * Up to 25 may be defined, but the actual number is LCD-dependent. - */ -//#define CUSTOM_USER_MENUS -#if ENABLED(CUSTOM_USER_MENUS) - //#define CUSTOM_USER_MENU_TITLE "Custom Commands" - #define USER_SCRIPT_DONE "M117 User Script Done" - #define USER_SCRIPT_AUDIBLE_FEEDBACK - //#define USER_SCRIPT_RETURN // Return to status screen after a script - #define CUSTOM_MENU_ONLY_IDLE // Only show custom menu when the machine is idle - - #define USER_DESC_1 "Home & UBL Info" - #define USER_GCODE_1 "G28\nG29W" - //#define USER_CONFIRM_1 // Show a confirmation dialog before this action - - #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL - #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) - //#define USER_CONFIRM_2 - - #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL - #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) - //#define USER_CONFIRM_3 - - #define USER_DESC_4 "Heat Bed/Home/Level" - #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" - //#define USER_CONFIRM_4 - - #define USER_DESC_5 "Home & Info" - #define USER_GCODE_5 "G28\nM503" - //#define USER_CONFIRM_5 -#endif - /** * Host Action Commands * diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 490766bd7a..5ef0efa968 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -536,7 +536,7 @@ (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \ (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) -#if ENABLED(CUSTOM_USER_MENUS) +#if BOTH(HAS_TFT_LVGL_UI, CUSTOM_MENU_MAIN) #define _HAS_1(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) #define HAS_USER_ITEM(V...) DO(HAS,||,V) #else diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d8111c18da..a7f726c4b2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -553,6 +553,8 @@ #error "Z_AFTER_DEACTIVATE is replaced by Z_IDLE_HEIGHT." #elif defined(MEATPACK) #error "MEATPACK is now enabled with MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2, etc." +#elif defined(CUSTOM_USER_MENUS) + #error "CUSTOM_USER_MENUS has been replaced by CUSTOM_MENU_MAIN and CUSTOM_MENU_CONFIG." #endif /** @@ -2986,109 +2988,6 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "GCODE_MACROS_SLOTS must be a number from 1 to 10." #endif -#if ENABLED(CUSTOM_USER_MENUS) - #ifdef USER_GCODE_1 - constexpr char _chr1 = USER_GCODE_1[strlen(USER_GCODE_1) - 1]; - static_assert(_chr1 != '\n' && _chr1 != '\r', "USER_GCODE_1 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_2 - constexpr char _chr2 = USER_GCODE_2[strlen(USER_GCODE_2) - 1]; - static_assert(_chr2 != '\n' && _chr2 != '\r', "USER_GCODE_2 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_3 - constexpr char _chr3 = USER_GCODE_3[strlen(USER_GCODE_3) - 1]; - static_assert(_chr3 != '\n' && _chr3 != '\r', "USER_GCODE_3 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_4 - constexpr char _chr4 = USER_GCODE_4[strlen(USER_GCODE_4) - 1]; - static_assert(_chr4 != '\n' && _chr4 != '\r', "USER_GCODE_4 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_5 - constexpr char _chr5 = USER_GCODE_5[strlen(USER_GCODE_5) - 1]; - static_assert(_chr5 != '\n' && _chr5 != '\r', "USER_GCODE_5 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_6 - constexpr char _chr6 = USER_GCODE_6[strlen(USER_GCODE_6) - 1]; - static_assert(_chr6 != '\n' && _chr6 != '\r', "USER_GCODE_6 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_7 - constexpr char _chr7 = USER_GCODE_7[strlen(USER_GCODE_7) - 1]; - static_assert(_chr7 != '\n' && _chr7 != '\r', "USER_GCODE_7 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_8 - constexpr char _chr8 = USER_GCODE_8[strlen(USER_GCODE_8) - 1]; - static_assert(_chr8 != '\n' && _chr8 != '\r', "USER_GCODE_8 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_9 - constexpr char _chr9 = USER_GCODE_9[strlen(USER_GCODE_9) - 1]; - static_assert(_chr9 != '\n' && _chr9 != '\r', "USER_GCODE_9 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_10 - constexpr char _chr10 = USER_GCODE_10[strlen(USER_GCODE_10) - 1]; - static_assert(_chr10 != '\n' && _chr10 != '\r', "USER_GCODE_10 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_11 - constexpr char _chr11 = USER_GCODE_11[strlen(USER_GCODE_11) - 1]; - static_assert(_chr11 != '\n' && _chr11 != '\r', "USER_GCODE_11 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_12 - constexpr char _chr12 = USER_GCODE_12[strlen(USER_GCODE_12) - 1]; - static_assert(_chr12 != '\n' && _chr12 != '\r', "USER_GCODE_12 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_13 - constexpr char _chr13 = USER_GCODE_13[strlen(USER_GCODE_13) - 1]; - static_assert(_chr13 != '\n' && _chr13 != '\r', "USER_GCODE_13 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_14 - constexpr char _chr14 = USER_GCODE_14[strlen(USER_GCODE_14) - 1]; - static_assert(_chr14 != '\n' && _chr14 != '\r', "USER_GCODE_14 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_15 - constexpr char _chr15 = USER_GCODE_15[strlen(USER_GCODE_15) - 1]; - static_assert(_chr15 != '\n' && _chr15 != '\r', "USER_GCODE_15 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_16 - constexpr char _chr16 = USER_GCODE_16[strlen(USER_GCODE_16) - 1]; - static_assert(_chr16 != '\n' && _chr16 != '\r', "USER_GCODE_16 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_17 - constexpr char _chr17 = USER_GCODE_17[strlen(USER_GCODE_17) - 1]; - static_assert(_chr17 != '\n' && _chr17 != '\r', "USER_GCODE_17 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_18 - constexpr char _chr18 = USER_GCODE_18[strlen(USER_GCODE_18) - 1]; - static_assert(_chr18 != '\n' && _chr18 != '\r', "USER_GCODE_18 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_19 - constexpr char _chr19 = USER_GCODE_19[strlen(USER_GCODE_19) - 1]; - static_assert(_chr19 != '\n' && _chr19 != '\r', "USER_GCODE_19 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_20 - constexpr char _chr20 = USER_GCODE_20[strlen(USER_GCODE_20) - 1]; - static_assert(_chr20 != '\n' && _chr20 != '\r', "USER_GCODE_20 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_21 - constexpr char _chr21 = USER_GCODE_21[strlen(USER_GCODE_21) - 1]; - static_assert(_chr21 != '\n' && _chr21 != '\r', "USER_GCODE_21 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_22 - constexpr char _chr22 = USER_GCODE_22[strlen(USER_GCODE_22) - 1]; - static_assert(_chr22 != '\n' && _chr22 != '\r', "USER_GCODE_22 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_23 - constexpr char _chr23 = USER_GCODE_23[strlen(USER_GCODE_23) - 1]; - static_assert(_chr23 != '\n' && _chr23 != '\r', "USER_GCODE_23 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_24 - constexpr char _chr24 = USER_GCODE_24[strlen(USER_GCODE_24) - 1]; - static_assert(_chr24 != '\n' && _chr24 != '\r', "USER_GCODE_24 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_25 - constexpr char _chr25 = USER_GCODE_25[strlen(USER_GCODE_25) - 1]; - static_assert(_chr25 != '\n' && _chr25 != '\r', "USER_GCODE_25 cannot have a newline at the end. Please remove it."); - #endif -#endif - #if ENABLED(BACKLASH_COMPENSATION) #ifndef BACKLASH_DISTANCE_MM #error "BACKLASH_COMPENSATION requires BACKLASH_DISTANCE_MM." diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp index ea175706f7..d5d1abdf9d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp @@ -30,8 +30,8 @@ using namespace ExtUI; using namespace Theme; #define _ITEM_TAG(N) (10+N) -#define _USER_DESC(N) USER_DESC_##N -#define _USER_GCODE(N) USER_GCODE_##N +#define _USER_DESC(N) MAIN_MENU_ITEM_##N##_DESC +#define _USER_GCODE(N) MAIN_MENU_ITEM_##N##_GCODE #define _USER_ITEM(N) .tag(_ITEM_TAG(N)).button(USER_ITEM_POS(N), _USER_DESC(N)) #define _USER_ACTION(N) case _ITEM_TAG(N): injectCommands_P(PSTR(_USER_GCODE(N))); TERN_(USER_SCRIPT_RETURN, GOTO_SCREEN(StatusScreen)); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index b7914d629b..53d6306175 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -41,9 +41,9 @@ void MainMenu::onRedraw(draw_mode_t what) { #define GRID_COLS 2 #define ABOUT_PRINTER_POS BTN_POS(1,1), BTN_SIZE(2,1) #define ADVANCED_SETTINGS_POS BTN_POS(1,2), BTN_SIZE(2,1) - #if ENABLED(CUSTOM_USER_MENUS) + #if ENABLED(CUSTOM_MENU_MAIN) #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(1,1) - #define CUSTOM_USER_MENUS_POS BTN_POS(2,3), BTN_SIZE(1,1) + #define CUSTOM_MENU_POS BTN_POS(2,3), BTN_SIZE(1,1) #else #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(2,1) #endif @@ -63,10 +63,10 @@ void MainMenu::onRedraw(draw_mode_t what) { #define CLEAN_NOZZLE_POS BTN_POS(4,2), BTN_SIZE(3,1) #define MOVE_AXIS_POS BTN_POS(1,3), BTN_SIZE(3,1) #define DISABLE_STEPPERS_POS BTN_POS(4,3), BTN_SIZE(3,1) - #if ENABLED(CUSTOM_USER_MENUS) + #if ENABLED(CUSTOM_MENU_MAIN) #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(2,1) #define FILAMENTCHANGE_POS BTN_POS(3,4), BTN_SIZE(2,1) - #define CUSTOM_USER_MENUS_POS BTN_POS(5,4), BTN_SIZE(2,1) + #define CUSTOM_MENU_POS BTN_POS(5,4), BTN_SIZE(2,1) #else #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(3,1) #define FILAMENTCHANGE_POS BTN_POS(4,4), BTN_SIZE(3,1) @@ -91,8 +91,8 @@ void MainMenu::onRedraw(draw_mode_t what) { .enabled(TERN_(HAS_LEVELING, 1)) .tag( 9).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) .tag(10).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) - #if ENABLED(CUSTOM_USER_MENUS) - .tag(11).button(CUSTOM_USER_MENUS_POS, GET_TEXT_F(MSG_USER_MENU)) + #if ENABLED(CUSTOM_MENU_MAIN) + .tag(11).button(CUSTOM_MENU_POS, GET_TEXT_F(MSG_CUSTOM_COMMANDS)) #endif .colors(action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); @@ -117,7 +117,7 @@ bool MainMenu::onTouchEnd(uint8_t tag) { case 9: GOTO_SCREEN(LevelingMenu); break; #endif case 10: GOTO_SCREEN(AboutScreen); break; - #if ENABLED(CUSTOM_USER_MENUS) + #if ENABLED(CUSTOM_MENU_MAIN) case 11: GOTO_SCREEN(CustomUserMenus); break; #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 61d702ebaf..3e69a3ad2f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -22,8 +22,6 @@ #pragma once -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "../ftdi_eve_lib/ftdi_eve_lib.h" #include "../language/language.h" #include "../theme/theme.h" @@ -107,7 +105,7 @@ enum { #if ENABLED(SDSUPPORT) FILES_SCREEN_CACHE, #endif - #if ENABLED(CUSTOM_USER_MENUS) + #if ENABLED(CUSTOM_MENU_MAIN) CUSTOM_USER_MENUS_SCREEN_CACHE, #endif CHANGE_FILAMENT_SCREEN_CACHE, @@ -248,7 +246,7 @@ enum { #include "files_screen.h" #endif -#if ENABLED(CUSTOM_USER_MENUS) +#if ENABLED(CUSTOM_MENU_MAIN) #include "custom_user_menus.h" #endif @@ -262,5 +260,3 @@ enum { #if NUM_LANGUAGES > 1 #include "language_menu.h" #endif - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index fd5780e1d8..12a57bd548 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -728,9 +728,9 @@ #define EEPROM_READ_TIPS_EN "Read settings from EEPROM?" #define EEPROM_REVERT_TIPS_EN "Revert settings to factory defaults?" -#define MORE_CUSTOM1_TEXT_EN USER_DESC_1 -#define MORE_CUSTOM2_TEXT_EN USER_DESC_2 -#define MORE_CUSTOM3_TEXT_EN USER_DESC_3 -#define MORE_CUSTOM4_TEXT_EN USER_DESC_4 -#define MORE_CUSTOM5_TEXT_EN USER_DESC_5 -#define MORE_CUSTOM6_TEXT_EN USER_DESC_6 +#define MORE_CUSTOM1_TEXT_EN MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_EN MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_EN MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_EN MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_EN MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_EN MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index 9440b8b0eb..f0b19d4e02 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -260,9 +260,9 @@ #define EEPROM_READ_TIPS_FR "Lire les paramètres de l'EEPROM?" #define EEPROM_REVERT_TIPS_FR "Rétablir les paramètres par défaut d'usine?" -#define MORE_CUSTOM1_TEXT_FR USER_DESC_1 -#define MORE_CUSTOM2_TEXT_FR USER_DESC_2 -#define MORE_CUSTOM3_TEXT_FR USER_DESC_3 -#define MORE_CUSTOM4_TEXT_FR USER_DESC_4 -#define MORE_CUSTOM5_TEXT_FR USER_DESC_5 -#define MORE_CUSTOM6_TEXT_FR USER_DESC_6 +#define MORE_CUSTOM1_TEXT_FR MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_FR MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_FR MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_FR MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_FR MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_FR MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index 9b88de3df4..b74842afef 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -257,9 +257,9 @@ #define EEPROM_READ_TIPS_IT "Leggi le impostazioni dalla EEPROM?" #define EEPROM_REVERT_TIPS_IT "Ripristinare le impostazioni predefinite?" -#define MORE_CUSTOM1_TEXT_IT USER_DESC_1 -#define MORE_CUSTOM2_TEXT_IT USER_DESC_2 -#define MORE_CUSTOM3_TEXT_IT USER_DESC_3 -#define MORE_CUSTOM4_TEXT_IT USER_DESC_4 -#define MORE_CUSTOM5_TEXT_IT USER_DESC_5 -#define MORE_CUSTOM6_TEXT_IT USER_DESC_6 +#define MORE_CUSTOM1_TEXT_IT MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_IT MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_IT MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_IT MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_IT MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_IT MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index 1989eaef1b..50e32ac05c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -255,12 +255,12 @@ #define EEPROM_SETTINGS_READ_RU "Чтение наÑтроек из EEPROM" #define EEPROM_SETTINGS_REVERT_RU "BоÑÑтановить заводÑкие наÑтройки по умолчанию" -#define MORE_CUSTOM1_TEXT_RU USER_DESC_1 -#define MORE_CUSTOM2_TEXT_RU USER_DESC_2 -#define MORE_CUSTOM3_TEXT_RU USER_DESC_3 -#define MORE_CUSTOM4_TEXT_RU USER_DESC_4 -#define MORE_CUSTOM5_TEXT_RU USER_DESC_5 -#define MORE_CUSTOM6_TEXT_RU USER_DESC_6 +#define MORE_CUSTOM1_TEXT_RU MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_RU MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_RU MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_RU MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_RU MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_RU MAIN_MENU_ITEM_6_DESC #define EEPROM_STORE_TIPS_RU "Cохранить наÑтройки в EEPROM?" #define EEPROM_READ_TIPS_RU "читать наÑтройки из EEPROM?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index cc1a870339..f204933e25 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -495,9 +495,9 @@ #define EEPROM_READ_TIPS_CN "是å¦ä½¿ç”¨EEPROMå‚æ•°?" #define EEPROM_REVERT_TIPS_CN "是å¦æ¢å¤é»˜è®¤å‚æ•°?" -#define MORE_CUSTOM1_TEXT_CN USER_DESC_1 -#define MORE_CUSTOM2_TEXT_CN USER_DESC_2 -#define MORE_CUSTOM3_TEXT_CN USER_DESC_3 -#define MORE_CUSTOM4_TEXT_CN USER_DESC_4 -#define MORE_CUSTOM5_TEXT_CN USER_DESC_5 -#define MORE_CUSTOM6_TEXT_CN USER_DESC_6 +#define MORE_CUSTOM1_TEXT_CN MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_CN MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_CN MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_CN MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_CN MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_CN MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 4654abddee..a75bc69ab7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -266,9 +266,9 @@ #define EEPROM_READ_TIPS_SP "Leer la configuración de EEPROM?" #define EEPROM_REVERT_TIPS_SP "Revert settings to factory defaults?" -#define MORE_CUSTOM1_TEXT_SP USER_DESC_1 -#define MORE_CUSTOM2_TEXT_SP USER_DESC_2 -#define MORE_CUSTOM3_TEXT_SP USER_DESC_3 -#define MORE_CUSTOM4_TEXT_SP USER_DESC_4 -#define MORE_CUSTOM5_TEXT_SP USER_DESC_5 -#define MORE_CUSTOM6_TEXT_SP USER_DESC_6 +#define MORE_CUSTOM1_TEXT_SP MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_SP MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_SP MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_SP MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_SP MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_SP MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 8057a3110e..76da2de907 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -493,9 +493,9 @@ #define EEPROM_READ_TIPS_T_CN "是å¦ä½¿ç”¨EEPROMåƒæ•¸?" #define EEPROM_REVERT_TIPS_T_CN "是å¦æ¢å¾©é»˜èªåƒæ•¸?" -#define MORE_CUSTOM1_TEXT_T_CN USER_DESC_1 -#define MORE_CUSTOM2_TEXT_T_CN USER_DESC_2 -#define MORE_CUSTOM3_TEXT_T_CN USER_DESC_3 -#define MORE_CUSTOM4_TEXT_T_CN USER_DESC_4 -#define MORE_CUSTOM5_TEXT_T_CN USER_DESC_5 -#define MORE_CUSTOM6_TEXT_T_CN USER_DESC_6 +#define MORE_CUSTOM1_TEXT_T_CN MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_T_CN MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_T_CN MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_T_CN MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_T_CN MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_T_CN MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index adcbba7720..c434f5493b 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -119,7 +119,7 @@ namespace Language_cz { PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Hodnota Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastní příkazy"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Vlastní příkazy"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 test sondy"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 bod"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylka"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 68791d9eaa..ebc2445b11 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -112,7 +112,7 @@ namespace Language_de { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z-Wert"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Benutzer-Menü"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Benutzer-Menü"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Sondentest"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punkt"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Zu weit draußen"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 72f262c687..a37f5aa790 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -140,7 +140,7 @@ namespace Language_en { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Value"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Custom Commands"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Custom Commands"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Probe out of bounds"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 58559a4ff5..b2d83aa05b 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -115,7 +115,7 @@ namespace Language_es { PROGMEM Language_Str MSG_MESH_X = _UxGT("Ãndice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ãndice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Com. Personalizados"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Com. Personalizados"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 031db358bd..bdd91d3b29 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -113,7 +113,7 @@ namespace Language_fr { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valeur Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Commandes perso"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Commandes perso"); PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Mesure point"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("Ecart sonde Z M48"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index d0ec16b35f..5745ce1eb8 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -112,7 +112,7 @@ namespace Language_gl { PROGMEM Language_Str MSG_MESH_X = _UxGT("Ãndice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ãndice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandos Personaliz."); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Comandos Personaliz."); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 5bfb6aa9aa..be54d5035d 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -138,7 +138,7 @@ namespace Language_it { PROGMEM Language_Str MSG_MESH_X = _UxGT("Indice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valore di Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandi personaliz."); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Comandi personaliz."); PROGMEM Language_Str MSG_M48_TEST = _UxGT("Test sonda M48"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("Punto M48"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti"); diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index 8431d86d1c..e0028e22a2 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -246,7 +246,7 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_BACK = _UxGT("モドリ"); PROGMEM Language_Str MSG_VELOCITY = _UxGT("ソクド"); PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("ステップ/mm"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("ユーザーコマンド"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("ユーザーコマンド"); PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("プリントガイãƒã‚¸ãƒ†ã‚¤ã‚·ã‚µãƒ¬ãƒžã‚·ã‚¿"); PROGMEM Language_Str MSG_PRINTING = _UxGT("プリントãƒãƒ¥ã‚¦..."); } diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index bf7d32e222..9004722cfc 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -109,7 +109,7 @@ namespace Language_pl { PROGMEM Language_Str MSG_MESH_X = _UxGT("Indeks X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indeks Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Wartość Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("WÅ‚asne Polecenia"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("WÅ‚asne Polecenia"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punky"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylenie"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 4ddf424b3d..642a7d9203 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -103,7 +103,7 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_MESH_X = _UxGT("Ãndice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ãndice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comando customizado"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Comando customizado"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Teste de sonda"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Ponto"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index bd7e1b7a64..a34717acb5 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -111,7 +111,7 @@ namespace Language_ro { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valoare Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comenzi Personalizate"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Comenzi Personalizate"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviation"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index b3176c0a54..a10f47ef8e 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -139,7 +139,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_MESH_X = _UxGT("Ð˜Ð½Ð´ÐµÐºÑ X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ð˜Ð½Ð´ÐµÐºÑ Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Значение Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Свои команды"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Свои команды"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 теÑÑ‚ Z-зонда"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Отклонение"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index a9df28382e..2e851842e4 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -140,7 +140,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Hodnota Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastné príkazy"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Vlastné príkazy"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Bod"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda mimo hraníc"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index a7a4056c0b..9d711ff376 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -114,7 +114,7 @@ namespace Language_tr { PROGMEM Language_Str MSG_MESH_X = _UxGT("Ä°ndeks X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ä°ndeks Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z DeÄŸeri"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Özel Komutlar"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Özel Komutlar"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Prob Testi"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Nokta"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Sapma"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 069ad7066d..be0e420a42 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -151,7 +151,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_MESH_X = _UxGT("Ð†Ð½Ð´ÐµÐºÑ X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ð†Ð½Ð´ÐµÐºÑ Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("ВлаÑні команди"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("ВлаÑні команди"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 теÑÑ‚ зонду"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 точка"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index fad32507ce..f0b7f732ed 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -96,7 +96,7 @@ namespace Language_vi { PROGMEM Language_Str MSG_MESH_X = _UxGT("MuÌ£c luÌ£c X"); // Index X PROGMEM Language_Str MSG_MESH_Y = _UxGT("MuÌ£c luÌ£c Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Giá trị Z"); // Z Value - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Các lệnh tá»± chá»n"); // Custom Commands + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Các lệnh tá»± chá»n"); // Custom Commands PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Äang chạy G29"); // Doing G29 PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Công cụ UBL"); // UBL tools PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("San Lấp Bàn Thống Nhất (UBL)"); // Unified Bed Leveling diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 5e7c5e7cb5..98f7704efc 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -109,7 +109,7 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_MESH_X = _UxGT("索引X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("索引Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z 值"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("定制命令"); // "Custom Commands" + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("定制命令"); // "Custom Commands" PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48探测"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48点"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("M48åå·®"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index f86b15351f..0ada34a476 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -107,7 +107,7 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_MESH_X = _UxGT("索引 X"); //"Index X" PROGMEM Language_Str MSG_MESH_Y = _UxGT("索引 Y"); //"Index Y" PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z 值"); //"Z Value" - PROGMEM Language_Str MSG_USER_MENU = _UxGT("自定命令"); // "Custom Commands" + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("自定命令"); // "Custom Commands" PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 探測測試"); //"M48 Probe Test" PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 探測點"); //"M48 Point" PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("åå·®"); //"Deviation" diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 179a2c2d55..71f09a5aee 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -338,6 +338,148 @@ void menu_advanced_settings(); #endif +#if ENABLED(CUSTOM_MENU_CONFIG) + + void _lcd_custom_menus_configuration_gcode(PGM_P const cmd) { + queue.inject_P(cmd); + TERN_(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); + TERN_(CUSTOM_MENU_CONFIG_SCRIPT_RETURN, ui.return_to_status()); + } + + void custom_menus_configuration() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + #define HAS_CUSTOM_ITEM_CONF(N) (defined(CONFIG_MENU_ITEM_##N##_DESC) && defined(CONFIG_MENU_ITEM_##N##_GCODE)) + + #define CUSTOM_TEST_CONF(N) do{ \ + constexpr char c = CONFIG_MENU_ITEM_##N##_GCODE[strlen(CONFIG_MENU_ITEM_##N##_GCODE) - 1]; \ + static_assert(c != '\n' && c != '\r', "CONFIG_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \ + }while(0) + + #ifdef CUSTOM_MENU_CONFIG_SCRIPT_DONE + #define _DONE_SCRIPT "\n" CUSTOM_MENU_CONFIG_SCRIPT_DONE + #else + #define _DONE_SCRIPT "" + #endif + #define GCODE_LAMBDA_CONF(N) []{ _lcd_custom_menus_configuration_gcode(PSTR(CONFIG_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); } + #define _CUSTOM_ITEM_CONF(N) ACTION_ITEM_P(PSTR(CONFIG_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_CONF(N)); + #define _CUSTOM_ITEM_CONF_CONFIRM(N) \ + SUBMENU_P(PSTR(CONFIG_MENU_ITEM_##N##_DESC), []{ \ + MenuItem_confirm::confirm_screen( \ + GCODE_LAMBDA_CONF(N), \ + ui.goto_previous_screen, \ + PSTR(CONFIG_MENU_ITEM_##N##_DESC "?") \ + ); \ + }) + + #define CUSTOM_ITEM_CONF(N) do{ if (ENABLED(CONFIG_MENU_ITEM_##N##_CONFIRM)) _CUSTOM_ITEM_CONF_CONFIRM(N); else _CUSTOM_ITEM_CONF(N); }while(0) + + #if HAS_CUSTOM_ITEM_CONF(1) + CUSTOM_TEST_CONF(1); + CUSTOM_ITEM_CONF(1); + #endif + #if HAS_CUSTOM_ITEM_CONF(2) + CUSTOM_TEST_CONF(2); + CUSTOM_ITEM_CONF(2); + #endif + #if HAS_CUSTOM_ITEM_CONF(3) + CUSTOM_TEST_CONF(3); + CUSTOM_ITEM_CONF(3); + #endif + #if HAS_CUSTOM_ITEM_CONF(4) + CUSTOM_TEST_CONF(4); + CUSTOM_ITEM_CONF(4); + #endif + #if HAS_CUSTOM_ITEM_CONF(5) + CUSTOM_TEST_CONF(5); + CUSTOM_ITEM_CONF(5); + #endif + #if HAS_CUSTOM_ITEM_CONF(6) + CUSTOM_TEST_CONF(6); + CUSTOM_ITEM_CONF(6); + #endif + #if HAS_CUSTOM_ITEM_CONF(7) + CUSTOM_TEST_CONF(7); + CUSTOM_ITEM_CONF(7); + #endif + #if HAS_CUSTOM_ITEM_CONF(8) + CUSTOM_TEST_CONF(8); + CUSTOM_ITEM_CONF(8); + #endif + #if HAS_CUSTOM_ITEM_CONF(9) + CUSTOM_TEST_CONF(9); + CUSTOM_ITEM_CONF(9); + #endif + #if HAS_CUSTOM_ITEM_CONF(10) + CUSTOM_TEST_CONF(10); + CUSTOM_ITEM_CONF(10); + #endif + #if HAS_CUSTOM_ITEM_CONF(11) + CUSTOM_TEST_CONF(11); + CUSTOM_ITEM_CONF(11); + #endif + #if HAS_CUSTOM_ITEM_CONF(12) + CUSTOM_TEST_CONF(12); + CUSTOM_ITEM_CONF(12); + #endif + #if HAS_CUSTOM_ITEM_CONF(13) + CUSTOM_TEST_CONF(13); + CUSTOM_ITEM_CONF(13); + #endif + #if HAS_CUSTOM_ITEM_CONF(14) + CUSTOM_TEST_CONF(14); + CUSTOM_ITEM_CONF(14); + #endif + #if HAS_CUSTOM_ITEM_CONF(15) + CUSTOM_TEST_CONF(15); + CUSTOM_ITEM_CONF(15); + #endif + #if HAS_CUSTOM_ITEM_CONF(16) + CUSTOM_TEST_CONF(16); + CUSTOM_ITEM_CONF(16); + #endif + #if HAS_CUSTOM_ITEM_CONF(17) + CUSTOM_TEST_CONF(17); + CUSTOM_ITEM_CONF(17); + #endif + #if HAS_CUSTOM_ITEM_CONF(18) + CUSTOM_TEST_CONF(18); + CUSTOM_ITEM_CONF(18); + #endif + #if HAS_CUSTOM_ITEM_CONF(19) + CUSTOM_TEST_CONF(19); + CUSTOM_ITEM_CONF(19); + #endif + #if HAS_CUSTOM_ITEM_CONF(20) + CUSTOM_TEST_CONF(20); + CUSTOM_ITEM_CONF(20); + #endif + #if HAS_CUSTOM_ITEM_CONF(21) + CUSTOM_TEST_CONF(21); + CUSTOM_ITEM_CONF(21); + #endif + #if HAS_CUSTOM_ITEM_CONF(22) + CUSTOM_TEST_CONF(22); + CUSTOM_ITEM_CONF(22); + #endif + #if HAS_CUSTOM_ITEM_CONF(23) + CUSTOM_TEST_CONF(23); + CUSTOM_ITEM_CONF(23); + #endif + #if HAS_CUSTOM_ITEM_CONF(24) + CUSTOM_TEST_CONF(24); + CUSTOM_ITEM_CONF(24); + #endif + #if HAS_CUSTOM_ITEM_CONF(25) + CUSTOM_TEST_CONF(25); + CUSTOM_ITEM_CONF(25); + #endif + END_MENU(); + } + +#endif // CUSTOM_MENU_CONFIG + void menu_configuration() { const bool busy = printer_busy(); @@ -351,6 +493,16 @@ void menu_configuration() { SUBMENU(MSG_DEBUG_MENU, menu_debug); #endif + #if ENABLED(CUSTOM_MENU_CONFIG) + if (TERN1(CUSTOM_MENU_CONFIG_ONLY_IDLE, !busy)) { + #ifdef CUSTOM_MENU_CONFIG_TITLE + SUBMENU_P(PSTR(CUSTOM_MENU_CONFIG_TITLE), custom_menus_configuration); + #else + SUBMENU(MSG_CUSTOM_COMMANDS, custom_menus_configuration); + #endif + } + #endif + SUBMENU(MSG_ADVANCED_SETTINGS, menu_advanced_settings); #if ENABLED(BABYSTEP_ZPROBE_OFFSET) diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp deleted file mode 100644 index cc1a8a6e80..0000000000 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Custom User Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, CUSTOM_USER_MENUS) - -#include "menu_item.h" -#include "../../gcode/queue.h" - -#ifdef USER_SCRIPT_DONE - #define _DONE_SCRIPT "\n" USER_SCRIPT_DONE -#else - #define _DONE_SCRIPT "" -#endif - -void _lcd_user_gcode(PGM_P const cmd) { - queue.inject_P(cmd); - TERN_(USER_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); - TERN_(USER_SCRIPT_RETURN, ui.return_to_status()); -} - -void menu_user() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - - #define GCODE_LAMBDA(N) []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); } - #define _USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), GCODE_LAMBDA(N)); - #define _USER_ITEM_CONFIRM(N) \ - SUBMENU_P(PSTR(USER_DESC_##N), []{ \ - MenuItem_confirm::confirm_screen( \ - GCODE_LAMBDA(N), \ - ui.goto_previous_screen, \ - PSTR(USER_DESC_##N "?") \ - ); \ - }) - - #define USER_ITEM(N) do{ if (ENABLED(USER_CONFIRM_##N)) _USER_ITEM_CONFIRM(N); else _USER_ITEM(N); }while(0) - - #if HAS_USER_ITEM(1) - USER_ITEM(1); - #endif - #if HAS_USER_ITEM(2) - USER_ITEM(2); - #endif - #if HAS_USER_ITEM(3) - USER_ITEM(3); - #endif - #if HAS_USER_ITEM(4) - USER_ITEM(4); - #endif - #if HAS_USER_ITEM(5) - USER_ITEM(5); - #endif - #if HAS_USER_ITEM(6) - USER_ITEM(6); - #endif - #if HAS_USER_ITEM(7) - USER_ITEM(7); - #endif - #if HAS_USER_ITEM(8) - USER_ITEM(8); - #endif - #if HAS_USER_ITEM(9) - USER_ITEM(9); - #endif - #if HAS_USER_ITEM(10) - USER_ITEM(10); - #endif - #if HAS_USER_ITEM(11) - USER_ITEM(11); - #endif - #if HAS_USER_ITEM(12) - USER_ITEM(12); - #endif - #if HAS_USER_ITEM(13) - USER_ITEM(13); - #endif - #if HAS_USER_ITEM(14) - USER_ITEM(14); - #endif - #if HAS_USER_ITEM(15) - USER_ITEM(15); - #endif - #if HAS_USER_ITEM(16) - USER_ITEM(16); - #endif - #if HAS_USER_ITEM(17) - USER_ITEM(17); - #endif - #if HAS_USER_ITEM(18) - USER_ITEM(18); - #endif - #if HAS_USER_ITEM(19) - USER_ITEM(19); - #endif - #if HAS_USER_ITEM(20) - USER_ITEM(20); - #endif - #if HAS_USER_ITEM(21) - USER_ITEM(21); - #endif - #if HAS_USER_ITEM(22) - USER_ITEM(22); - #endif - #if HAS_USER_ITEM(23) - USER_ITEM(23); - #endif - #if HAS_USER_ITEM(24) - USER_ITEM(24); - #endif - #if HAS_USER_ITEM(25) - USER_ITEM(25); - #endif - END_MENU(); -} - -#endif // HAS_LCD_MENU && CUSTOM_USER_MENUS diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index d19e236a84..525b8c8a70 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -68,10 +68,6 @@ void menu_motion(); void menu_temperature(); void menu_configuration(); -#if ENABLED(CUSTOM_USER_MENUS) - void menu_user(); -#endif - #if HAS_POWER_MONITOR void menu_power_monitor(); #endif @@ -105,6 +101,148 @@ void menu_configuration(); void menu_language(); #endif +#if ENABLED(CUSTOM_MENU_MAIN) + + void _lcd_custom_menu_main_gcode(PGM_P const cmd) { + queue.inject_P(cmd); + TERN_(MAIN_MENU_ITEM_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); + TERN_(MAIN_MENU_ITEM_SCRIPT_RETURN, ui.return_to_status()); + } + + void custom_menus_main() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + #define HAS_CUSTOM_ITEM_MAIN(N) (defined(MAIN_MENU_ITEM_##N##_DESC) && defined(MAIN_MENU_ITEM_##N##_GCODE)) + + #define CUSTOM_TEST_MAIN(N) do{ \ + constexpr char c = MAIN_MENU_ITEM_##N##_GCODE[strlen(MAIN_MENU_ITEM_##N##_GCODE) - 1]; \ + static_assert(c != '\n' && c != '\r', "MAIN_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \ + }while(0) + + #ifdef MAIN_MENU_ITEM_SCRIPT_DONE + #define _DONE_SCRIPT "\n" MAIN_MENU_ITEM_SCRIPT_DONE + #else + #define _DONE_SCRIPT "" + #endif + #define GCODE_LAMBDA_MAIN(N) []{ _lcd_custom_menu_main_gcode(PSTR(MAIN_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); } + #define _CUSTOM_ITEM_MAIN(N) ACTION_ITEM_P(PSTR(MAIN_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_MAIN(N)); + #define _CUSTOM_ITEM_MAIN_CONFIRM(N) \ + SUBMENU_P(PSTR(MAIN_MENU_ITEM_##N##_DESC), []{ \ + MenuItem_confirm::confirm_screen( \ + GCODE_LAMBDA_MAIN(N), \ + ui.goto_previous_screen, \ + PSTR(MAIN_MENU_ITEM_##N##_DESC "?") \ + ); \ + }) + + #define CUSTOM_ITEM_MAIN(N) do{ if (ENABLED(MAIN_MENU_ITEM_##N##_CONFIRM)) _CUSTOM_ITEM_MAIN_CONFIRM(N); else _CUSTOM_ITEM_MAIN(N); }while(0) + + #if HAS_CUSTOM_ITEM_MAIN(1) + CUSTOM_TEST_MAIN(1); + CUSTOM_ITEM_MAIN(1); + #endif + #if HAS_CUSTOM_ITEM_MAIN(2) + CUSTOM_TEST_MAIN(2); + CUSTOM_ITEM_MAIN(2); + #endif + #if HAS_CUSTOM_ITEM_MAIN(3) + CUSTOM_TEST_MAIN(3); + CUSTOM_ITEM_MAIN(3); + #endif + #if HAS_CUSTOM_ITEM_MAIN(4) + CUSTOM_TEST_MAIN(4); + CUSTOM_ITEM_MAIN(4); + #endif + #if HAS_CUSTOM_ITEM_MAIN(5) + CUSTOM_TEST_MAIN(5); + CUSTOM_ITEM_MAIN(5); + #endif + #if HAS_CUSTOM_ITEM_MAIN(6) + CUSTOM_TEST_MAIN(6); + CUSTOM_ITEM_MAIN(6); + #endif + #if HAS_CUSTOM_ITEM_MAIN(7) + CUSTOM_TEST_MAIN(7); + CUSTOM_ITEM_MAIN(7); + #endif + #if HAS_CUSTOM_ITEM_MAIN(8) + CUSTOM_TEST_MAIN(8); + CUSTOM_ITEM_MAIN(8); + #endif + #if HAS_CUSTOM_ITEM_MAIN(9) + CUSTOM_TEST_MAIN(9); + CUSTOM_ITEM_MAIN(9); + #endif + #if HAS_CUSTOM_ITEM_MAIN(10) + CUSTOM_TEST_MAIN(10); + CUSTOM_ITEM_MAIN(10); + #endif + #if HAS_CUSTOM_ITEM_MAIN(11) + CUSTOM_TEST_MAIN(11); + CUSTOM_ITEM_MAIN(11); + #endif + #if HAS_CUSTOM_ITEM_MAIN(12) + CUSTOM_TEST_MAIN(12); + CUSTOM_ITEM_MAIN(12); + #endif + #if HAS_CUSTOM_ITEM_MAIN(13) + CUSTOM_TEST_MAIN(13); + CUSTOM_ITEM_MAIN(13); + #endif + #if HAS_CUSTOM_ITEM_MAIN(14) + CUSTOM_TEST_MAIN(14); + CUSTOM_ITEM_MAIN(14); + #endif + #if HAS_CUSTOM_ITEM_MAIN(15) + CUSTOM_TEST_MAIN(15); + CUSTOM_ITEM_MAIN(15); + #endif + #if HAS_CUSTOM_ITEM_MAIN(16) + CUSTOM_TEST_MAIN(16); + CUSTOM_ITEM_MAIN(16); + #endif + #if HAS_CUSTOM_ITEM_MAIN(17) + CUSTOM_TEST_MAIN(17); + CUSTOM_ITEM_MAIN(17); + #endif + #if HAS_CUSTOM_ITEM_MAIN(18) + CUSTOM_TEST_MAIN(18); + CUSTOM_ITEM_MAIN(18); + #endif + #if HAS_CUSTOM_ITEM_MAIN(19) + CUSTOM_TEST_MAIN(19); + CUSTOM_ITEM_MAIN(19); + #endif + #if HAS_CUSTOM_ITEM_MAIN(20) + CUSTOM_TEST_MAIN(20); + CUSTOM_ITEM_MAIN(20); + #endif + #if HAS_CUSTOM_ITEM_MAIN(21) + CUSTOM_TEST_MAIN(21); + CUSTOM_ITEM_MAIN(21); + #endif + #if HAS_CUSTOM_ITEM_MAIN(22) + CUSTOM_TEST_MAIN(22); + CUSTOM_ITEM_MAIN(22); + #endif + #if HAS_CUSTOM_ITEM_MAIN(23) + CUSTOM_TEST_MAIN(23); + CUSTOM_ITEM_MAIN(23); + #endif + #if HAS_CUSTOM_ITEM_MAIN(24) + CUSTOM_TEST_MAIN(24); + CUSTOM_ITEM_MAIN(24); + #endif + #if HAS_CUSTOM_ITEM_MAIN(25) + CUSTOM_TEST_MAIN(25); + CUSTOM_ITEM_MAIN(25); + #endif + END_MENU(); + } + +#endif // CUSTOM_MENU_MAIN + void menu_main() { const bool busy = printingIsActive() #if ENABLED(SDSUPPORT) @@ -210,12 +348,12 @@ void menu_main() { SUBMENU(MSG_CONFIGURATION, menu_configuration); - #if ENABLED(CUSTOM_USER_MENUS) - if (TERN1(CUSTOM_MENU_ONLY_IDLE, !busy)) { - #ifdef CUSTOM_USER_MENU_TITLE - SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); + #if ENABLED(CUSTOM_MENU_MAIN) + if (TERN1(CUSTOM_MENU_MAIN_ONLY_IDLE, !busy)) { + #ifdef CUSTOM_MENU_MAIN_TITLE + SUBMENU_P(PSTR(CUSTOM_MENU_MAIN_TITLE), custom_menus_main); #else - SUBMENU(MSG_USER_MENU, menu_user); + SUBMENU(MSG_CUSTOM_COMMANDS, custom_menus_main); #endif } #endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index 03fae56fdb..9ab437dd0b 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -67,9 +67,6 @@ #if ENABLED(CANCEL_OBJECTS) #define HAS_MENU_CANCELOBJECT #endif - #if ENABLED(CUSTOM_USER_MENUS) - #define HAS_MENU_CUSTOM - #endif #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) #define HAS_MENU_DELTA_CALIBRATE #endif diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index e3209899ce..4498492ba5 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -21,7 +21,7 @@ opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE fr \ opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT AUTO_REPORT_SD_STATUS SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \ - EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ + EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_MENU_MAIN \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL @@ -37,7 +37,7 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI SHOW_CUS LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES \ SDSUPPORT SDCARD_SORT_ALPHA NO_SD_AUTOSTART USB_FLASH_DRIVE_SUPPORT CANCEL_OBJECTS \ Z_PROBE_SLED AUTO_BED_LEVELING_UBL UBL_HILBERT_CURVE RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ - EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ + EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_MENU_MAIN \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ From 976403d10de60e95c5892ebe6a9292b2ed292134 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 19 Mar 2021 16:34:10 -0500 Subject: [PATCH 1182/1370] Improve max temp / target --- Marlin/Configuration.h | 1 + Marlin/src/gcode/host/M360.cpp | 2 +- Marlin/src/gcode/parser.h | 6 ++---- Marlin/src/inc/Conditionals_post.h | 12 +++++++++--- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 8 +------- Marlin/src/lcd/extui/ui_api.cpp | 6 +++--- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 16 ++++++++-------- Marlin/src/lcd/menu/menu_tune.cpp | 6 +++--- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 10 +++++----- Marlin/src/module/settings.cpp | 4 ++-- Marlin/src/module/temperature.cpp | 7 ++++--- Marlin/src/module/temperature.h | 15 +++++---------- 15 files changed, 47 insertions(+), 52 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 339dae7702..c9c83f9bb6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -484,6 +484,7 @@ */ #define HOTEND_OVERSHOOT 15 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT #define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT +#define COOLER_OVERSHOOT 2 // (°C) Forbid temperatures closer than OVERSHOOT //=========================================================================== //============================= PID Settings ================================ diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 50a4e45426..f3c242526d 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -177,7 +177,7 @@ void GcodeSuite::M360() { config_line_e(e, PSTR("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(e)]); config_line_e(e, PSTR("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(e)]); config_line_e(e, PSTR("Diameter"), TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[e])); - config_line_e(e, PSTR("MaxTemp"), thermalManager.heater_maxtemp[e]); + config_line_e(e, PSTR("MaxTemp"), thermalManager.hotend_maxtemp[e]); } #endif } diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 5a31a9943e..221500e076 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -390,15 +390,13 @@ public: } } - #define TEMP_UNIT(N) parser.to_temp_units(N) - #else // !TEMPERATURE_UNITS_SUPPORT + static inline float to_temp_units(int16_t c) { return (float)c; } + static inline float value_celsius() { return value_float(); } static inline float value_celsius_diff() { return value_float(); } - #define TEMP_UNIT(N) (N) - #endif // !TEMPERATURE_UNITS_SUPPORT static inline feedRate_t value_feedrate() { return MMM_TO_MMS(value_linear_units()); } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index fb06a7a3f3..1cd7e5f0e9 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2025,11 +2025,17 @@ #undef PIDTEMPBED #endif -#if HAS_HEATED_BED || HAS_TEMP_CHAMBER - #define BED_OR_CHAMBER 1 -#endif #if HAS_TEMP_COOLER && PIN_EXISTS(COOLER) #define HAS_COOLER 1 + #ifndef COOLER_OVERSHOOT + #define COOLER_OVERSHOOT 2 + #endif + #define COOLER_MIN_TARGET (COOLER_MINTEMP + (COOLER_OVERSHOOT)) + #define COOLER_MAX_TARGET (COOLER_MAXTEMP - (COOLER_OVERSHOOT)) +#endif + +#if HAS_HEATED_BED || HAS_TEMP_CHAMBER + #define BED_OR_CHAMBER 1 #endif #if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE || HAS_TEMP_COOLER #define HAS_TEMP_SENSOR 1 diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 97a9fbd4da..c77e1ebd10 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -112,12 +112,6 @@ #define MAX_PRINT_SPEED 999 #define MIN_PRINT_SPEED 10 -// Temp limits -#if HAS_HOTEND - #define MAX_E_TEMP (HEATER_0_MAXTEMP - (HOTEND_OVERSHOOT)) - #define MIN_E_TEMP HEATER_0_MINTEMP -#endif - #if HAS_HEATED_BED #define MIN_BED_TEMP BED_MINTEMP #endif @@ -1357,7 +1351,7 @@ void HMI_Move_Z() { return; } // E_Temp limit - LIMIT(HMI_ValueStruct.E_Temp, MIN_E_TEMP, MAX_E_TEMP); + LIMIT(HMI_ValueStruct.E_Temp, HEATER_0_MINTEMP, thermalManager.hotend_max_target(0)); // E_Temp value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 90f9e0b0bf..9e5e0b6a62 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -924,7 +924,7 @@ namespace ExtUI { enableHeater(heater); switch (heater) { #if HAS_HEATED_CHAMBER - case CHAMBER: thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAXTEMP - 10))); break; + case CHAMBER: thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAX_TARGET))); break; #endif #if HAS_COOLER case COOLER: thermalManager.setTargetCooler(LROUND(constrain(value, 0, COOLER_MAXTEMP))); break; @@ -935,7 +935,7 @@ namespace ExtUI { default: { #if HAS_HOTEND const int16_t e = heater - H0; - thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); + thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.hotend_max_target(e))), e); #endif } break; } @@ -949,7 +949,7 @@ namespace ExtUI { #if HAS_HOTEND const int16_t e = extruder - E0; enableHeater(extruder); - thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); + thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.hotend_max_target(e))), e); #endif } diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index aab93c3bdd..b6d55a5de6 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -315,7 +315,7 @@ void menu_backlash(); #if ENABLED(PID_AUTOTUNE_MENU) #define HOTEND_PID_EDIT_MENU_ITEMS(N) \ _HOTEND_PID_EDIT_MENU_ITEMS(N); \ - EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.heater_maxtemp[N] - HOTEND_OVERSHOOT, []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); }); + EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.hotend_max_target(N), []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); }); #else #define HOTEND_PID_EDIT_MENU_ITEMS(N) _HOTEND_PID_EDIT_MENU_ITEMS(N); #endif diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 19601d678e..8df2af1dd0 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -95,7 +95,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { ACTION_ITEM_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); #endif EDIT_ITEM_FAST_N(int3, extruder, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[extruder].target, - EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, + EXTRUDE_MINTEMP, thermalManager.hotend_max_target(extruder), _change_filament_with_custom ); END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 3a9906ddeb..8caf87d33b 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -47,11 +47,11 @@ // "Temperature" submenu items // -void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb) { +void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb) { UNUSED(e); UNUSED(indh); UNUSED(indb); #if HAS_HOTEND if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) - setTargetHotend(_MIN(thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, ui.material_preset[indh].hotend_temp), e); + setTargetHotend(_MIN(thermalManager.hotend_max_target(e), ui.material_preset[indh].hotend_temp), e); #endif #if HAS_HEATED_BED if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); @@ -70,7 +70,7 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i void do_preheat_end_m() { _preheat_end(editable.int8, 0); } #endif #if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } + inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(0, -1, m); } #endif #if HAS_COOLER inline void _precool_laser(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } @@ -163,15 +163,15 @@ void menu_temperature() { // Nozzle [1-5]: // #if HOTENDS == 1 - EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - (HOTEND_OVERSHOOT), []{ thermalManager.start_watching_hotend(0); }); + EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); }); #elif HAS_MULTI_HOTEND HOTEND_LOOP() - EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.heater_maxtemp[e] - (HOTEND_OVERSHOOT), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.hotend_max_target(e), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - (HOTEND_OVERSHOOT)); + EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.hotend_max_target(0)); #endif // @@ -185,7 +185,7 @@ void menu_temperature() { // Chamber: // #if HAS_HEATED_CHAMBER - EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); + EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAX_TARGET, thermalManager.start_watching_chamber); #endif // @@ -194,7 +194,7 @@ void menu_temperature() { #if HAS_COOLER editable.state = cooler.is_enabled(); EDIT_ITEM(bool, MSG_COOLER(TOGGLE), &cooler.state, []{ if (editable.state) cooler.disable(); else cooler.enable(); }); - EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MINTEMP + 2, COOLER_MAXTEMP - 2, thermalManager.start_watching_cooler); + EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MIN_TARGET, COOLER_MAX_TARGET, thermalManager.start_watching_cooler); #endif // diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 0fbb57f2ac..feabae437d 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -126,15 +126,15 @@ void menu_tune() { // Nozzle [1-4]: // #if HOTENDS == 1 - EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT, []{ thermalManager.start_watching_hotend(0); }); + EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); }); #elif HAS_MULTI_HOTEND HOTEND_LOOP() - EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.hotend_max_target(e), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - HOTEND_OVERSHOOT); + EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.hotend_max_target(0)); #endif // diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 79bedb9ea5..6c6076cf74 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -126,7 +126,7 @@ void _lcd_ubl_custom_mesh() { START_MENU(); BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); #if HAS_HOTEND - EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT); + EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, thermalManager.hotend_max_target(0)); #endif #if HAS_HEATED_BED EDIT_ITEM(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP, BED_MAX_TARGET); diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 29dd088c99..e8a01e889b 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -186,25 +186,25 @@ void Touch::touch(touch_control_t *control) { ui.clear_lcd(); if (heater >= 0) { // HotEnd #if HOTENDS == 1 - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.heater_maxtemp[0] - 15, []{ thermalManager.start_watching_hotend(0); }); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); }); #else MenuItemBase::itemIndex = heater; - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.heater_maxtemp[heater] - 15, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.hotend_max_target(heater), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); #endif } #if HAS_HEATED_BED else if (heater == H_BED) { - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed); } #endif #if HAS_HEATED_CHAMBER else if (heater == H_CHAMBER) { - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAX_TARGET, thermalManager.start_watching_chamber); } #endif #if HAS_COOLER else if (heater == H_COOLER) { - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_COOLER), &thermalManager.temp_cooler.target, 0, COOLER_MAXTEMP - 8, thermalManager.start_watching_cooler); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_COOLER), &thermalManager.temp_cooler.target, 0, COOLER_MAX_TARGET, thermalManager.start_watching_cooler); } #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d38ad51934..bf10902c60 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3386,10 +3386,10 @@ void MarlinSettings::reset() { SERIAL_ECHOLNPAIR_P( PSTR(" M145 S"), i #if HAS_HOTEND - , PSTR(" H"), TEMP_UNIT(ui.material_preset[i].hotend_temp) + , PSTR(" H"), parser.to_temp_units(ui.material_preset[i].hotend_temp) #endif #if HAS_HEATED_BED - , SP_B_STR, TEMP_UNIT(ui.material_preset[i].bed_temp) + , SP_B_STR, parser.to_temp_units(ui.material_preset[i].bed_temp) #endif #if HAS_FAN , PSTR(" F"), ui.material_preset[i].fan_speed diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a000a31de7..16553193ec 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -253,7 +253,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HOTEND hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 } - const uint16_t Temperature::heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); + const uint16_t Temperature::hotend_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); #endif #if ENABLED(AUTO_POWER_E_FANS) @@ -267,6 +267,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if ENABLED(AUTO_POWER_COOLER_FAN) uint8_t Temperature::coolerfan_speed; // = 0 #endif + #if HAS_FAN uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 } @@ -552,7 +553,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_AUTO_FAN, next_auto_fan_check_ms = next_temp_ms + 2500UL); - if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { + if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, temp_range[heater_id].maxtemp - (HOTEND_OVERSHOOT))) { SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); return; @@ -1512,7 +1513,7 @@ void Temperature::manage_heater() { if (cooler.is_enabled()) { flag_cooler_state = true; // used to allow M106 fan control when cooler is disabled - if (temp_cooler.target == 0) temp_cooler.target = COOLER_MINTEMP; + if (temp_cooler.target == 0) temp_cooler.target = COOLER_MIN_TARGET; if (ELAPSED(ms, next_cooler_check_ms)) { next_cooler_check_ms = ms + COOLER_CHECK_INTERVAL; if (temp_cooler.celsius > temp_cooler.target) { diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index e69183f6f5..abd2eabac2 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -323,7 +323,8 @@ class Temperature { #if HAS_HOTEND #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) static hotend_info_t temp_hotend[HOTEND_TEMPS]; - static const uint16_t heater_maxtemp[HOTENDS]; + static const uint16_t hotend_maxtemp[HOTENDS]; + FORCE_INLINE static uint16_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } #endif TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); @@ -639,7 +640,7 @@ class Temperature { start_preheat_time(ee); #endif TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); - temp_hotend[ee].target = _MIN(celsius, temp_range[ee].maxtemp - HOTEND_OVERSHOOT); + temp_hotend[ee].target = _MIN(celsius, hotend_max_target(ee)); start_watching_hotend(ee); } @@ -785,13 +786,7 @@ class Temperature { #if HAS_COOLER static void setTargetCooler(const int16_t celsius) { - temp_cooler.target = - #ifdef COOLER_MAXTEMP - _MIN(celsius, COOLER_MAXTEMP - 10) - #else - celsius - #endif - ; + temp_cooler.target = constrain(celsius, COOLER_MIN_TARGET, COOLER_MAX_TARGET); start_watching_cooler(); } #endif @@ -878,7 +873,7 @@ class Temperature { TERN_(HAS_DISPLAY, static void set_heating_message(const uint8_t e)); #if HAS_LCD_MENU && HAS_TEMPERATURE - static void lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb); + static void lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb); #endif private: From 3341e4f88ca8a461aa51fe1663a07bdd91127c91 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 19 Mar 2021 16:39:05 -0500 Subject: [PATCH 1183/1370] Add typedef extra_fan_t --- Marlin/src/lcd/menu/menu_item.h | 2 +- Marlin/src/module/temperature.cpp | 21 ++++++++++++++------- Marlin/src/module/temperature.h | 5 +++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 6873f209b4..945a892799 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -473,7 +473,7 @@ class MenuItem_bool : public MenuEditItemBase { #define _FAN_EDIT_ITEMS(F,L) do{ \ editable.uint8 = thermalManager.fan_speed[F]; \ EDIT_ITEM_FAST_N(percent, F, MSG_##L, &editable.uint8, 0, 255, on_fan_update); \ - EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_##L, &thermalManager.new_fan_speed[F], 3, 255); \ + EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_##L, &thermalManager.extra_fan_speed[F].speed, 3, 255); \ }while(0) #if FAN_COUNT > 1 diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 16553193ec..dd7a36a82a 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -273,19 +273,26 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 } #if ENABLED(EXTRA_FAN_SPEED) - uint8_t Temperature::old_fan_speed[FAN_COUNT], Temperature::new_fan_speed[FAN_COUNT]; - void Temperature::set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp) { - switch (tmp_temp) { + Temperature::extra_fan_t Temperature::extra_fan_speed[FAN_COUNT]; + + /** + * Handle the M106 P T command: + * T1 = Restore fan speed saved on the last T2 + * T2 = Save the fan speed, then set to the last T<3-255> value + * T<3-255> = Set the "extra fan speed" + */ + void Temperature::set_temp_fan_speed(const uint8_t fan, const uint16_t command_or_speed) { + switch (command_or_speed) { case 1: - set_fan_speed(fan, old_fan_speed[fan]); + set_fan_speed(fan, extra_fan_speed[fan].saved); break; case 2: - old_fan_speed[fan] = fan_speed[fan]; - set_fan_speed(fan, new_fan_speed[fan]); + extra_fan_speed[fan].saved = fan_speed[fan]; + set_fan_speed(fan, extra_fan_speed[fan].speed); break; default: - new_fan_speed[fan] = _MIN(tmp_temp, 255U); + extra_fan_speed[fan].speed = _MIN(command_or_speed, 255U); break; } } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index abd2eabac2..38270fc9c4 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -561,8 +561,9 @@ class Temperature { } #if ENABLED(EXTRA_FAN_SPEED) - static uint8_t old_fan_speed[FAN_COUNT], new_fan_speed[FAN_COUNT]; - static void set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp); + typedef struct { uint8_t saved, speed; } extra_fan_t; + static extra_fan_t extra_fan_speed[FAN_COUNT]; + static void set_temp_fan_speed(const uint8_t fan, const uint16_t command_or_speed); #endif #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) From faa1118ca7ff53e548e82c72e93600ed17ea3bca Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 19 Mar 2021 16:41:47 -0500 Subject: [PATCH 1184/1370] MKS / E3V2 LCD code cleanup --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 6 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 72 ++-- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 13 +- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 4 +- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 325 +++++++----------- .../extui/lib/dgus/mks/DGUSScreenHandler.h | 1 + .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 29 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 12 +- .../lib/mks_ui/draw_filament_settings.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 44 ++- 12 files changed, 210 insertions(+), 308 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 15b3d8bfb3..653a384120 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -571,9 +571,9 @@ FORCE_INLINE void _draw_bed_status(const bool blink) { #if ENABLED(LCD_PROGRESS_BAR) void MarlinUI::draw_progress_bar(const uint8_t percent) { - const int16_t tix = (int16_t)(percent * (LCD_WIDTH) * 3) / 100, - cel = tix / 3, - rem = tix % 3; + const int16_t tix = int16_t(percent * (LCD_WIDTH) * 3) / 100, + cel = tix / 3, + rem = tix % 3; uint8_t i = LCD_WIDTH; char msg[LCD_WIDTH + 1], b = ' '; msg[LCD_WIDTH] = '\0'; diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index c77e1ebd10..60a22f22f1 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -102,19 +102,11 @@ #define DWIN_FONT_HEAD font10x20 #define MENU_CHAR_LIMIT 24 -#define STATUS_Y 360 - -// Fan speed limit -#define FANON 255 -#define FANOFF 0 +#define STATUS_Y 360 // Print speed limit -#define MAX_PRINT_SPEED 999 -#define MIN_PRINT_SPEED 10 - -#if HAS_HEATED_BED - #define MIN_BED_TEMP BED_MINTEMP -#endif +#define MIN_PRINT_SPEED 10 +#define MAX_PRINT_SPEED 999 // Feedspeed limit (max feedspeed = DEFAULT_MAX_FEEDRATE * 2) #define MIN_MAXFEEDSPEED 1 @@ -883,11 +875,11 @@ void Draw_Tune_Menu() { #if HAS_HOTEND Draw_Menu_Line(TUNE_CASE_TEMP, ICON_HotendTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.degTargetHotend(0)); #endif #if HAS_HEATED_BED Draw_Menu_Line(TUNE_CASE_BED, ICON_BedTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.degTargetBed()); #endif #if HAS_FAN Draw_Menu_Line(TUNE_CASE_FAN, ICON_FanSpeed); @@ -1394,7 +1386,7 @@ void HMI_Move_Z() { return; } // Bed_Temp limit - LIMIT(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP, BED_MAX_TARGET); + LIMIT(HMI_ValueStruct.Bed_Temp, BED_MINTEMP, BED_MAX_TARGET); // Bed_Temp value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } @@ -1438,7 +1430,7 @@ void HMI_Move_Z() { return; } // Fan_speed limit - LIMIT(HMI_ValueStruct.Fan_speed, FANOFF, FANON); + LIMIT(HMI_ValueStruct.Fan_speed, 0, 255); // Fan_speed value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } @@ -1882,9 +1874,9 @@ void Draw_Status_Area(const bool with_update) { #if HAS_HOTEND DWIN_ICON_Show(ICON, ICON_HotendTemp, 10, 383); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 384, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 384, thermalManager.degHotend(0)); DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.degTargetHotend(0)); DWIN_ICON_Show(ICON, ICON_StepE, 112, 417); DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 417, planner.flow_percentage[0]); @@ -1893,9 +1885,9 @@ void Draw_Status_Area(const bool with_update) { #if HAS_HEATED_BED DWIN_ICON_Show(ICON, ICON_BedTemp, 10, 416); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 417, thermalManager.temp_bed.celsius); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 417, thermalManager.degBed()); DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.degTargetBed()); #endif DWIN_ICON_Show(ICON, ICON_Speed, 113, 383); @@ -2157,8 +2149,8 @@ void HMI_SelectFile() { #if FAN_COUNT > 0 // All fans on for Ender 3 v2 ? // The slicer should manage this for us. - // for (uint8_t i = 0; i < FAN_COUNT; i++) - // thermalManager.fan_speed[i] = FANON; + //for (uint8_t i = 0; i < FAN_COUNT; i++) + // thermalManager.fan_speed[i] = 255; #endif Goto_PrintProcess(); @@ -2539,11 +2531,11 @@ void Draw_Temperature_Menu() { #define _TMENU_ICON(N) Draw_Menu_Line(++i, ICON_SetEndTemp + (N) - 1) #if HAS_HOTEND _TMENU_ICON(TEMP_CASE_TEMP); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.degTargetHotend(0)); #endif #if HAS_HEATED_BED _TMENU_ICON(TEMP_CASE_BED); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.degTargetBed()); #endif #if HAS_FAN _TMENU_ICON(TEMP_CASE_FAN); @@ -2711,7 +2703,7 @@ void HMI_AxisMove() { case 4: // Extruder // window tips #ifdef PREVENT_COLD_EXTRUSION - if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) { + if (thermalManager.degHotend(0) < EXTRUDE_MINTEMP) { HMI_flag.ETempTooLow_flag = true; Popup_Window_ETempTooLow(); DWIN_UpdateLCD(); @@ -2752,16 +2744,16 @@ void HMI_Temperature() { #if HAS_HOTEND case TEMP_CASE_TEMP: // Nozzle temperature checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + HMI_ValueStruct.E_Temp = thermalManager.degTargetHotend(0); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); EncoderRate.enabled = true; break; #endif #if HAS_HEATED_BED case TEMP_CASE_BED: // Bed temperature checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); + HMI_ValueStruct.Bed_Temp = thermalManager.degTargetBed(); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); EncoderRate.enabled = true; break; #endif @@ -2769,7 +2761,7 @@ void HMI_Temperature() { case TEMP_CASE_FAN: // Fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); EncoderRate.enabled = true; break; #endif @@ -2801,7 +2793,7 @@ void HMI_Temperature() { #ifdef USE_STRING_HEADINGS Draw_Title("PLA Settings"); // TODO: GET_TEXT_F #else - DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" + DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" #endif #ifdef USE_STRING_TITLES DWIN_Draw_Label(MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); @@ -2817,7 +2809,7 @@ void HMI_Temperature() { #else DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp #if HAS_HEATED_BED DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_BED) + 3); DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(PREHEAT_CASE_BED) + 3); @@ -2828,7 +2820,7 @@ void HMI_Temperature() { DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(PREHEAT_CASE_FAN)); // PLA fan speed #endif #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration + DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration #endif #endif } @@ -3285,22 +3277,22 @@ void HMI_Tune() { case TUNE_CASE_SPEED: // Print speed checkkey = PrintSpeed; HMI_ValueStruct.print_speed = feedrate_percentage; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), feedrate_percentage); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), HMI_ValueStruct.print_speed); EncoderRate.enabled = true; break; #if HAS_HOTEND case TUNE_CASE_TEMP: // Nozzle temp checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + HMI_ValueStruct.E_Temp = thermalManager.degTargetHotend(0); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), HMI_ValueStruct.E_Temp); EncoderRate.enabled = true; break; #endif #if HAS_HEATED_BED case TUNE_CASE_BED: // Bed temp checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + HMI_ValueStruct.Bed_Temp = thermalManager.degTargetBed(); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), HMI_ValueStruct.Bed_Temp); EncoderRate.enabled = true; break; #endif @@ -3308,7 +3300,7 @@ void HMI_Tune() { case TUNE_CASE_FAN: // Fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), HMI_ValueStruct.Fan_speed); EncoderRate.enabled = true; break; #endif @@ -3626,8 +3618,8 @@ void EachMomentUpdate() { if (HMI_flag.pause_action && printingIsPaused() && !planner.has_blocks_queued()) { HMI_flag.pause_action = false; #if ENABLED(PAUSE_HEAT) - TERN_(HAS_HOTEND, resume_hotend_temp = thermalManager.temp_hotend[0].target); - TERN_(HAS_HEATED_BED, resume_bed_temp = thermalManager.temp_bed.target); + TERN_(HAS_HOTEND, resume_hotend_temp = thermalManager.degTargetHotend(0)); + TERN_(HAS_HEATED_BED, resume_bed_temp = thermalManager.degTargetBed()); thermalManager.disable_all_heaters(); #endif queue.inject_P(PSTR("G1 F1200 X0 Y0")); diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 95b07f5c68..aa08f683f7 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -560,32 +560,31 @@ void AnycubicTFTClass::GetCommandFromTFT() { switch (a_command) { case 0: { // A0 GET HOTEND TEMP - float hotendActualTemp = getActualTemp_celsius((extruder_t) (extruder_t) E0); + const float hotendActualTemp = getActualTemp_celsius(E0); SEND_PGM_VAL("A0V ", int(hotendActualTemp + 0.5)); } break; case 1: { // A1 GET HOTEND TARGET TEMP - float hotendTargetTemp = getTargetTemp_celsius((extruder_t) (extruder_t) E0); + const float hotendTargetTemp = getTargetTemp_celsius(E0); SEND_PGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); } break; case 2: { // A2 GET HOTBED TEMP - float heatedBedActualTemp = getActualTemp_celsius((heater_t) BED); + const float heatedBedActualTemp = getActualTemp_celsius(BED); SEND_PGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); } break; case 3: { // A3 GET HOTBED TARGET TEMP - float heatedBedTargetTemp = getTargetTemp_celsius((heater_t) BED); + const float heatedBedTargetTemp = getTargetTemp_celsius(BED); SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); } break; case 4: { // A4 GET FAN SPEED - float fanPercent = getActualFan_percent(FAN0); - fanPercent = constrain(fanPercent, 0, 100); - SEND_PGM_VAL("A4V ", int(fanPercent)); + const float fanPercent = getActualFan_percent(FAN0); + SEND_PGM_VAL("A4V ", int(LIMIT(fanPercent, 0, 100))); } break; case 5: { // A5 GET CURRENT COORDINATE diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 78865bbfd6..9f436a356c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -764,8 +764,8 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ,nullptr, ScreenHandler.HandleLiveAdjustZ, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), - VPHELPER(VP_ZOffset_DE_DIS,&z_offset_add,nullptr, &ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_ZOffset_DE_DIS, &z_offset_add, nullptr, &ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), #endif #if HAS_BED_PROBE VPHELPER(VP_OFFSET_X, &probe.offset.x, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index bf2b05dcbf..0efb70b686 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -111,7 +111,7 @@ void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay_MKS(DGUS_VP_Variable &var void DGUSScreenHandler::DGUSLCD_SetUint8(DGUS_VP_Variable &var, void *val_ptr) { if (var.memadr) { - uint16_t value = swap16(*(uint16_t*)val_ptr); + const uint16_t value = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("FAN value get:", value); *(uint8_t*)var.memadr = map(constrain(value, 0, 255), 0, 255, 0, 255); DEBUG_ECHOLNPAIR("FAN value change:", *(uint8_t*)var.memadr); @@ -314,7 +314,7 @@ void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::ScreenBackChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t target = swap16(*(uint16_t *)val_ptr); + const uint16_t target = swap16(*(uint16_t *)val_ptr); DEBUG_ECHOLNPAIR(" back = 0x%x", target); switch (target) { } @@ -330,7 +330,7 @@ void DGUSScreenHandler::ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("ctrl turn off\n"); - uint16_t value = swap16(*(uint16_t *)val_ptr); + const uint16_t value = swap16(*(uint16_t *)val_ptr); switch (value) { case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; default: break; @@ -339,7 +339,7 @@ void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenHandler::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("MinExtrudeTempChange DistanceChange"); - uint16_t value = swap16(*(uint16_t *)val_ptr); + const uint16_t value = swap16(*(uint16_t *)val_ptr); thermalManager.extrude_min_temp = value; min_ex_temp = value; settings.save(); @@ -347,7 +347,7 @@ void DGUSScreenHandler::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) void DGUSScreenHandler::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("Zoffset DistanceChange"); - uint16_t value = swap16(*(uint16_t *)val_ptr); + const uint16_t value = swap16(*(uint16_t *)val_ptr); float val_distance = 0; switch (value) { case 0: val_distance = 0.01; break; @@ -365,7 +365,7 @@ void DGUSScreenHandler::GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr) } void DGUSScreenHandler::EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t eep_flag = swap16(*(uint16_t *)val_ptr); + const uint16_t eep_flag = swap16(*(uint16_t *)val_ptr); switch (eep_flag) { case 0: settings.save(); @@ -383,7 +383,7 @@ void DGUSScreenHandler::EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::Z_offset_select(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t z_value = swap16(*(uint16_t *)val_ptr); + const uint16_t z_value = swap16(*(uint16_t *)val_ptr); switch (z_value) { case 0: Z_distance = 0.01; break; case 1: Z_distance = 0.1; break; @@ -410,7 +410,7 @@ void DGUSScreenHandler::GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t lag_flag = swap16(*(uint16_t *)val_ptr); + const uint16_t lag_flag = swap16(*(uint16_t *)val_ptr); switch (lag_flag) { case MKS_SimpleChinese: DGUS_LanguageDisplay(MKS_SimpleChinese); @@ -435,7 +435,7 @@ void DGUSScreenHandler::LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr) #endif void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t lev_but = swap16(*(uint16_t *)val_ptr); + const uint16_t lev_but = swap16(*(uint16_t *)val_ptr); #if ENABLED(MESH_BED_LEVELING) auto cs = getCurrentScreen(); #endif @@ -482,7 +482,7 @@ void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t mesh_dist = swap16(*(uint16_t *)val_ptr); + const uint16_t mesh_dist = swap16(*(uint16_t *)val_ptr); switch (mesh_dist) { case 0: mesh_adj_distance = 0.01; break; case 1: mesh_adj_distance = 0.1; break; @@ -493,7 +493,7 @@ void DGUSScreenHandler::MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { #if ENABLED(MESH_BED_LEVELING) - uint16_t mesh_value = swap16(*(uint16_t *)val_ptr); + const uint16_t mesh_value = swap16(*(uint16_t *)val_ptr); // static uint8_t a_first_level = 1; char cmd_buf[30]; float offset = mesh_adj_distance; @@ -586,20 +586,16 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { + const uint16_t lcd_value = swap16(*(uint16_t *)val_ptr); - uint16_t lcd_value = swap16(*(uint16_t *)val_ptr); + lcd_default_light = constrain(lcd_value, 10, 100); - if (lcd_value > 100) lcd_value = 100; - else if (lcd_value < 10) lcd_value = 10; - - lcd_default_light = lcd_value; - - const uint16_t lcd_data[2] = {lcd_default_light, lcd_default_light}; + const uint16_t lcd_data[2] = { lcd_default_light, lcd_default_light }; dgusdisplay.WriteVariable(0x0082, &lcd_data, 5, true); } void DGUSScreenHandler::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr) { - int16_t point_value = swap16(*(uint16_t *)val_ptr); + const int16_t point_value = swap16(*(uint16_t *)val_ptr); int16_t level_x_pos, level_y_pos; char buf_level[32] = {0}; @@ -686,7 +682,7 @@ void DGUSScreenHandler::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_pt #define mks_max(a, b) ((a) > (b)) ? (a) : (b) void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { #if EITHER(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) - uint16_t tmc_value = swap16(*(uint16_t*)val_ptr); + const uint16_t tmc_value = swap16(*(uint16_t*)val_ptr); #endif switch (var.VP) { @@ -930,7 +926,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr) { - int16_t value_pos = swap16(*(int16_t*)val_ptr); + const int16_t value_pos = swap16(*(int16_t*)val_ptr); switch (var.VP) { case VP_X_PARK_POS: x_park_pos = value_pos; break; @@ -939,75 +935,76 @@ void DGUSScreenHandler::GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr) { default: break; } skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); - int16_t value_raw = swap16(*(int16_t*)val_ptr); - - DEBUG_ECHOLNPAIR_F("value:", value_raw); + const int16_t value_raw = swap16(*(int16_t*)val_ptr); + DEBUG_ECHOLNPAIR_F("value_raw:", value_raw); *(int16_t*)var.memadr = value_raw; settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::axis_t axis; switch (var.VP) { + default: return; case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; - default: return; } - DEBUG_ECHOLNPAIR_F("value:", value); ExtUI::setAxisSteps_per_mm(value, axis); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleStepPerMMExtruderChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; + DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HOTENDS >= 1 - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; - #endif - #if HOTENDS >= 2 - #endif - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #if HAS_HOTEND + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HAS_MULTI_HOTEND + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #endif } - DEBUG_ECHOLNPAIR_F("value:", value); ExtUI::setAxisSteps_per_mm(value, extruder); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; + DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::axis_t axis; switch (var.VP) { case VP_X_MAX_SPEED: axis = ExtUI::axis_t::X; break; @@ -1015,59 +1012,57 @@ void DGUSScreenHandler::HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *va case VP_Z_MAX_SPEED: axis = ExtUI::axis_t::Z; break; default: return; } - DEBUG_ECHOLNPAIR_F("value:", value); - // ExtUI::setAxisSteps_per_mm(value,extruder); ExtUI::setAxisMaxFeedrate_mm_s(value, axis); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxFeedrate_mm_s(axis)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; + DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HOTENDS >= 1 + #if HAS_HOTEND case VP_E0_MAX_SPEED: extruder = ExtUI::extruder_t::E0; break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND #endif case VP_E1_MAX_SPEED: extruder = ExtUI::extruder_t::E1; break; } - DEBUG_ECHOLNPAIR_F("value:", value); - // ExtUI::setAxisSteps_per_mm(value,extruder); ExtUI::setAxisMaxFeedrate_mm_s(value, extruder); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxFeedrate_mm_s(extruder)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; + DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::axis_t axis; switch (var.VP) { + default: return; case VP_X_ACC_MAX_SPEED: axis = ExtUI::axis_t::X; break; case VP_Y_ACC_MAX_SPEED: axis = ExtUI::axis_t::Y; break; case VP_Z_ACC_MAX_SPEED: axis = ExtUI::axis_t::Z; break; - default: return; } - DEBUG_ECHOLNPAIR_F("value:", value); ExtUI::setAxisMaxAcceleration_mm_s2(value, axis); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxAcceleration_mm_s2(axis)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { @@ -1079,76 +1074,66 @@ void DGUSScreenHandler::HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HOTENDS >= 1 - case VP_E0_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E0; settings.load(); break; - #endif - #if HOTENDS >= 2 - #endif - case VP_E1_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E1; settings.load(); break; + #if HAS_HOTEND + case VP_E0_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E0; settings.load(); break; + #endif + #if HAS_MULTI_HOTEND + case VP_E1_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E1; settings.load(); break; + #endif } DEBUG_ECHOLNPAIR_F("value:", value); - // ExtUI::setAxisSteps_per_mm(value,extruder); ExtUI::setAxisMaxAcceleration_mm_s2(value, extruder); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxAcceleration_mm_s2(extruder)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleTravelAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value_travel = swap16(*(uint16_t*)val_ptr); - float value = (float)value_travel; - planner.settings.travel_acceleration = value; + planner.settings.travel_acceleration = (float)value_travel; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleFeedRateMinChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value_t = swap16(*(uint16_t*)val_ptr); - float value = (float)value_t; - planner.settings.min_feedrate_mm_s = value; + planner.settings.min_feedrate_mm_s = (float)value_t; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleMin_T_F_MKS(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value_t_f = swap16(*(uint16_t*)val_ptr); - float value = (float)value_t_f; - planner.settings.min_travel_feedrate_mm_s = value; + planner.settings.min_travel_feedrate_mm_s = (float)value_t_f; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value_acc = swap16(*(uint16_t*)val_ptr); - float value = (float)value_acc; - planner.settings.acceleration = value; + planner.settings.acceleration = (float)value_acc; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleGetExMinTemp_MKS(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t value_ex_min_temp = swap16(*(uint16_t*)val_ptr); + const uint16_t value_ex_min_temp = swap16(*(uint16_t*)val_ptr); thermalManager.extrude_min_temp = value_ex_min_temp; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } #if HAS_PID_HEATING void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + const uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("V1:", rawvalue); - float value = (float)rawvalue / 10; + const float value = 1.0f * rawvalue; DEBUG_ECHOLNPAIR("V2:", value); float newvalue = 0; switch (var.VP) { default: return; - #if HOTENDS >= 1 + #if HAS_HOTEND case VP_E0_PID_P: newvalue = value; break; case VP_E0_PID_I: newvalue = scalePID_i(value); break; case VP_E0_PID_D: newvalue = scalePID_d(value); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_E1_PID_P: newvalue = value; break; case VP_E1_PID_I: newvalue = scalePID_i(value); break; case VP_E1_PID_D: newvalue = scalePID_d(value); break; @@ -1224,7 +1209,6 @@ void DGUSScreenHandler::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) distanceFilament = value; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { @@ -1237,137 +1221,65 @@ void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ FilamentSpeed = value_len; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } -void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("Load Filament"); - char buf[40]; - - uint16_t val_t = swap16(*(uint16_t*)val_ptr); +void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { + #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + uint8_t swap_tool = 0; + #endif + #if HAS_HOTEND + uint8_t hotend_too_cold = 0; + #endif if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) return; + char buf[40]; + const uint16_t val_t = swap16(*(uint16_t*)val_ptr); switch (val_t) { + default: break; case 0: - #if HOTENDS >= 1 - if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T0")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } + #if HAS_HOTEND + if (thermalManager.tooColdToExtrude(0)) hotend_too_cold = 1; else swap_tool = 1; #endif break; - case 1: - #if HOTENDS >= 2 - if (thermalManager.degHotend(1) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(1) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T1")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } + #if HAS_MULTI_HOTEND + if (thermalManager.tooColdToExtrude(1)) hotend_too_cold = 2; else swap_tool = 2; + #elif ENABLED(SINGLENOZZLE) + if (thermalManager.tooColdToExtrude(0)) hotend_too_cold = 1; else swap_tool = 2; #endif - #if ENABLED(SINGLENOZZLE) - if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T1")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } - #endif - break; - - default: break; } + + #if HAS_HOTEND + if (hotend_too_cold) { + if (thermalManager.targetTooColdToExtrude(hotend_too_cold - 1)) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, hotend_too_cold - 1); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + #endif + + #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + if (swap_tool) { + queue.enqueue_now_P(swap_tool == 2 ? PSTR("T1") : PSTR("T0")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf, 40, PSTR("G1 E%d F%d"), (int)distanceFilament * filamentDir, FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif +} + +void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("Load Filament"); + MKS_FilamentLoadUnload(var, val_ptr, 1); } void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("UnLoad Filament"); - char buf[40]; - uint16_t val_t = swap16(*(uint16_t*)val_ptr); - switch (val_t) { - case 0: - #if HOTENDS >= 1 - if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T0")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } - #endif - break; - case 1: - #if HOTENDS >= 2 - if (thermalManager.degHotend(1) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(1) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T1")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } - #endif - - #if ENABLED(SINGLENOZZLE) - if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T1")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } - #endif - break; - } + MKS_FilamentLoadUnload(var, val_ptr, -1); } #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) @@ -1378,17 +1290,15 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) uint8_t e_temp = 0; filament_data.heated = false; uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); - if (preheat_option <= 8) { // Load filament type - filament_data.action = 1; - } - else if (preheat_option >= 10) { // Unload filament type + if (preheat_option >= 10) { // Unload filament type preheat_option -= 10; filament_data.action = 2; filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; } - else { // Cancel filament operation + else if (preheat_option <= 8) // Load filament type + filament_data.action = 1; + else // Cancel filament operation filament_data.action = 0; - } switch (preheat_option) { case 0: // Load PLA @@ -1416,10 +1326,10 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) } if (filament_data.action == 0) { // Go back to utility screen - #if HOTENDS >= 1 + #if HAS_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif GotoScreen(DGUSLCD_SCREEN_UTILITY); @@ -1427,13 +1337,13 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) else { // Go to the preheat screen to show the heating progress switch (var.VP) { default: return; - #if HOTENDS >= 1 + #if HAS_HOTEND case VP_E0_FILAMENT_LOAD_UNLOAD: filament_data.extruder = ExtUI::extruder_t::E0; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: filament_data.extruder = ExtUI::extruder_t::E1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); @@ -1475,6 +1385,7 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); } } + #endif // DGUS_FILAMENT_LOADUNLOAD bool DGUSScreenHandler::loop() { diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index 15e232e413..bfec3c4572 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -149,6 +149,7 @@ public: // Hook for filament load and unload static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + static void MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir); static void MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr); static void MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr); static void MKS_LOAD_UNLOAD_IDLE(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 5d02f79fd1..767d9c6738 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -514,13 +514,13 @@ void filament_dialog_handle() { queue.inject(public_buf_m); } - if ( ((abs((int)((int)thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.degHotend(uiCfg.extruderIndex) > gCfgItems.filament_limit_temper)) - && uiCfg.filament_load_heat_flg - ) { - uiCfg.filament_load_heat_flg = false; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); + if (uiCfg.filament_load_heat_flg) { + const int16_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + if (abs(diff) < 2 || diff > 0) { + uiCfg.filament_load_heat_flg = false; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); + } } if (uiCfg.filament_loading_completed) { @@ -529,13 +529,14 @@ void filament_dialog_handle() { lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED); } - if (((abs((int)((int)thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.degHotend(uiCfg.extruderIndex) > gCfgItems.filament_limit_temper)) - && uiCfg.filament_unload_heat_flg - ) { - uiCfg.filament_unload_heat_flg = false; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); + + if (uiCfg.filament_unload_heat_flg) { + const int16_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + if (abs(diff) < 2 || diff > 0) { + uiCfg.filament_unload_heat_flg = false; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); + } } if (uiCfg.filament_unloading_completed) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index e12a4b82cf..56a776c79e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -51,15 +51,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_FILAMNT_IN: uiCfg.filament_load_heat_flg = true; if ((abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1) - || (gCfgItems.filament_limit_temper <= thermalManager.degHotend(uiCfg.extruderIndex))) { + || (gCfgItems.filament_limit_temp <= thermalManager.degHotend(uiCfg.extruderIndex))) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } else { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); - if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temper) { - thermalManager.setTargetHotend(gCfgItems.filament_limit_temper, uiCfg.extruderIndex); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temp) { + thermalManager.setTargetHotend(gCfgItems.filament_limit_temp, uiCfg.extruderIndex); thermalManager.start_watching_hotend(uiCfg.extruderIndex); } } @@ -68,7 +68,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { uiCfg.filament_unload_heat_flg = true; if (thermalManager.degTargetHotend(uiCfg.extruderIndex) && ((abs((int)((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1) - || ((int)thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temper)) + || ((int)thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temp)) ) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); @@ -76,8 +76,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { else { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); - if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temper) { - thermalManager.setTargetHotend(gCfgItems.filament_limit_temper, uiCfg.extruderIndex); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temp) { + thermalManager.setTargetHotend(gCfgItems.filament_limit_temp, uiCfg.extruderIndex); thermalManager.start_watching_hotend(uiCfg.extruderIndex); } filament_sprayer_temp(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index 128989a27c..553cb29895 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -107,7 +107,7 @@ void lv_draw_filament_settings() { lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temper); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temp); lv_screen_menu_item_1_edit(scr, machine_menu.FilamentTemperature, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_TEMP, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index d001175915..91a1fce28d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -261,7 +261,7 @@ static void disp_key_value() { sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_speed); break; case filament_temp: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temper); + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temp); break; case x_sensitivity: #if X_SENSORLESS @@ -505,7 +505,7 @@ static void set_value_confirm() { update_spi_flash(); break; case filament_temp: - gCfgItems.filament_limit_temper = atoi(key_value); + gCfgItems.filament_limit_temp = atoi(key_value); update_spi_flash(); break; case x_sensitivity: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 9b7fea0a45..12e060aa01 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -143,7 +143,7 @@ void gCfgItems_init() { gCfgItems.filamentchange_load_speed = 1000; gCfgItems.filamentchange_unload_length = 200; gCfgItems.filamentchange_unload_speed = 1000; - gCfgItems.filament_limit_temper = 200; + gCfgItems.filament_limit_temp = 200; gCfgItems.encoder_enable = true; @@ -226,8 +226,8 @@ void ui_cfg_init() { uiCfg.cloud_port = 10086; #endif - uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length * 60.0 / gCfgItems.filamentchange_load_speed) + 0.5); - uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0 / gCfgItems.filamentchange_unload_speed) + 0.5); + uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length * 60.0f / gCfgItems.filamentchange_load_speed) + 0.5f); + uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0f / gCfgItems.filamentchange_unload_speed) + 0.5f); } void update_spi_flash() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 4b0ce2b4d8..a7f219965a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -184,29 +184,27 @@ extern char public_buf_m[100]; extern char public_buf_l[30]; typedef struct { - uint32_t spi_flash_flag; - uint8_t disp_rotation_180; - bool multiple_language; - uint8_t language; - uint8_t leveling_mode; - bool from_flash_pic; - bool finish_power_off; - bool pause_reprint; - uint8_t wifi_mode_sel; - uint8_t fileSysType; - uint8_t wifi_type; - bool cloud_enable, - encoder_enable; - int levelingPos[5][2]; - int filamentchange_load_length, - filamentchange_load_speed, - filamentchange_unload_length, - filamentchange_unload_speed, - filament_limit_temper; - float pausePosX, - pausePosY, - pausePosZ; - uint32_t curFilesize; + uint32_t spi_flash_flag; + uint8_t disp_rotation_180; + bool multiple_language; + uint8_t language; + uint8_t leveling_mode; + bool from_flash_pic; + bool finish_power_off; + bool pause_reprint; + uint8_t wifi_mode_sel; + uint8_t fileSysType; + uint8_t wifi_type; + bool cloud_enable, + encoder_enable; + int levelingPos[5][2]; + int filamentchange_load_length, + filamentchange_load_speed, + filamentchange_unload_length, + filamentchange_unload_speed; + int16_t filament_limit_temp; + float pausePosX, pausePosY, pausePosZ; + uint32_t curFilesize; } CFG_ITMES; typedef struct { From 2a011779e93f09974153b176cff394eed8cd554a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 10:55:30 -0500 Subject: [PATCH 1185/1370] Max temp/target followup --- Marlin/src/lcd/menu/menu_advanced.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b6d55a5de6..463433685e 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -261,8 +261,8 @@ void menu_backlash(); // #if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) EDIT_ITEM(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); - EDIT_ITEM(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - HOTEND_OVERSHOOT); - EDIT_ITEM(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - HOTEND_OVERSHOOT); + EDIT_ITEM(int3, MSG_MIN, &planner.autotemp_min, 0, thermalManager.hotend_max_target(0)); + EDIT_ITEM(int3, MSG_MAX, &planner.autotemp_max, 0, thermalManager.hotend_max_target(0)); EDIT_ITEM(float42_52, MSG_FACTOR, &planner.autotemp_factor, 0, 10); #endif From 3226e12037a21ad62d4220b83ee57aa04e5785d7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Mar 2021 04:11:43 -0500 Subject: [PATCH 1186/1370] Add typedef celsius_t (#21374) --- Marlin/src/core/types.h | 6 + Marlin/src/feature/mmu/mmu2.cpp | 2 +- Marlin/src/feature/pause.cpp | 5 +- Marlin/src/feature/pause.h | 2 +- Marlin/src/feature/powerloss.cpp | 8 +- Marlin/src/feature/powerloss.h | 4 +- Marlin/src/gcode/bedlevel/G26.cpp | 4 +- Marlin/src/gcode/lcd/M145.cpp | 6 +- Marlin/src/gcode/parser.h | 61 +++++---- Marlin/src/gcode/temp/M104_M109.cpp | 6 +- Marlin/src/gcode/temp/M140_M190.cpp | 6 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 10 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 19 ++- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 22 ++-- .../lcd/dogm/status_screen_lite_ST7920.cpp | 32 ++--- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 26 ++-- Marlin/src/lcd/dwin/e3v2/dwin.h | 4 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 10 +- .../extui/lib/dgus/fysetc/DGUSDisplayDef.cpp | 6 +- .../extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp | 10 +- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 6 +- .../extui/lib/dgus/origin/DGUSDisplayDef.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 4 +- Marlin/src/lcd/marlinui.h | 6 +- Marlin/src/lcd/menu/menu_configuration.cpp | 4 +- Marlin/src/lcd/tft/ui_320x240.cpp | 6 +- Marlin/src/lcd/tft/ui_480x320.cpp | 6 +- Marlin/src/module/motion.cpp | 6 +- Marlin/src/module/motion.h | 14 +-- Marlin/src/module/planner.cpp | 8 +- Marlin/src/module/planner.h | 3 +- Marlin/src/module/temperature.cpp | 110 +++++++--------- Marlin/src/module/temperature.h | 118 +++++++----------- Marlin/src/module/thermistor/thermistors.h | 2 +- 35 files changed, 252 insertions(+), 298 deletions(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 20519e1888..d77dba38d9 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -72,6 +72,12 @@ struct IF { typedef L type; }; // typedef float feedRate_t; +// +// celsius_t is the native unit of temperature. Signed to handle a disconnected thermistor value (-14). +// For more resolition (e.g., for a chocolate printer) this may later be changed to Celsius x 100 +// +typedef int16_t celsius_t; + // Conversion macros #define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) #define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index a1bec36e45..d4238400c7 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -775,7 +775,7 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { bool response = false; mmu_print_saved = false; xyz_pos_t resume_position; - int16_t resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); + celsius_t resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); KEEPALIVE_STATE(PAUSED_FOR_USER); diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index a6a28925ed..5f3338139a 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -555,7 +555,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep * - Send host action for resume, if configured * - Resume the current SD print job, if any */ -void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, int16_t targetTemp/*=0*/ DXC_ARGS) { +void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, const celsius_t targetTemp/*=0*/ DXC_ARGS) { DEBUG_SECTION(rp, "resume_print", true); DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", max_beep_count, " targetTemp:", targetTemp DXC_SAY); @@ -577,9 +577,8 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le thermalManager.reset_hotend_idle_timer(e); } - if (targetTemp > thermalManager.degTargetHotend(active_extruder)) { + if (targetTemp > thermalManager.degTargetHotend(active_extruder)) thermalManager.setTargetHotend(targetTemp, active_extruder); - } // Load the new filament load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out, PAUSE_MODE_SAME DXC_PASS); diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 7e58d4564e..4ab33ac519 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -90,7 +90,7 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float void wait_for_confirmation(const bool is_reload=false, const int8_t max_beep_count=0 DXC_PARAMS); void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, - const int8_t max_beep_count=0, int16_t targetTemp=0 DXC_PARAMS); + const int8_t max_beep_count=0, const celsius_t targetTemp=0 DXC_PARAMS); bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, const bool pause_for_user=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 1bb3a7e915..cc45d6ecf0 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -201,10 +201,10 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ #endif #if EXTRUDERS - HOTEND_LOOP() info.target_temperature[e] = thermalManager.temp_hotend[e].target; + HOTEND_LOOP() info.target_temperature[e] = thermalManager.degTargetHotend(e); #endif - TERN_(HAS_HEATED_BED, info.target_temperature_bed = thermalManager.temp_bed.target); + TERN_(HAS_HEATED_BED, info.target_temperature_bed = thermalManager.degTargetBed()); #if HAS_FAN COPY(info.fan_speed, thermalManager.fan_speed); @@ -343,7 +343,7 @@ void PrintJobRecovery::resume() { #endif #if HAS_HEATED_BED - const int16_t bt = info.target_temperature_bed; + const celsius_t bt = info.target_temperature_bed; if (bt) { // Restore the bed temperature sprintf_P(cmd, PSTR("M190 S%i"), bt); @@ -354,7 +354,7 @@ void PrintJobRecovery::resume() { // Restore all hotend temperatures #if HAS_HOTEND HOTEND_LOOP() { - const int16_t et = info.target_temperature[e]; + const celsius_t et = info.target_temperature[e]; if (et) { #if HAS_MULTI_HOTEND sprintf_P(cmd, PSTR("T%i S"), e); diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 25581e1723..12d11b141e 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -66,8 +66,8 @@ typedef struct { float filament_size[EXTRUDERS]; #endif - TERN_(HAS_HOTEND, int16_t target_temperature[HOTENDS]); - TERN_(HAS_HEATED_BED, int16_t target_temperature_bed); + TERN_(HAS_HOTEND, celsius_t target_temperature[HOTENDS]); + TERN_(HAS_HEATED_BED, celsius_t target_temperature_bed); TERN_(HAS_FAN, uint8_t fan_speed[FAN_COUNT]); TERN_(HAS_LEVELING, float fade); diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index ed29959055..0468b79363 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -533,7 +533,7 @@ void GcodeSuite::G26() { #if HAS_HEATED_BED // Get a temperature from 'I' or 'B' - int16_t bedtemp = 0; + celsius_t bedtemp = 0; // Use the 'I' index if temperature presets are defined #if PREHEAT_COUNT @@ -616,7 +616,7 @@ void GcodeSuite::G26() { g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size // Get a temperature from 'I' or 'H' - int16_t noztemp = 0; + celsius_t noztemp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 84a7e75aa4..d6a57d2215 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -27,6 +27,10 @@ #include "../gcode.h" #include "../../lcd/marlinui.h" +#if HAS_HOTEND + #include "../../module/temperature.h" +#endif + /** * M145: Set the heatup state for a material in the LCD menu * @@ -43,7 +47,7 @@ void GcodeSuite::M145() { preheat_t &mat = ui.material_preset[material]; #if HAS_HOTEND if (parser.seenval('H')) - mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT)); + mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, thermalManager.hotend_max_target(0)); #endif #if HAS_HEATED_BED if (parser.seenval('B')) diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 221500e076..b21c930cfa 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -352,50 +352,45 @@ public: static inline PGM_P temp_units_name() { return input_temp_units == TEMPUNIT_K ? PSTR("Kelvin") : input_temp_units == TEMPUNIT_F ? PSTR("Fahrenheit") : PSTR("Celsius"); } - static inline float to_temp_units(const float &f) { + static inline float to_temp_units(celsius_t c) { switch (input_temp_units) { - case TEMPUNIT_F: - return f * 0.5555555556f + 32; - case TEMPUNIT_K: - return f + 273.15f; - case TEMPUNIT_C: default: - return f; + case TEMPUNIT_C: return c; + case TEMPUNIT_K: return c + 273.15f; + case TEMPUNIT_F: return c * 0.5555555556f + 32; } } #endif // HAS_LCD_MENU && !DISABLE_M503 - static inline float value_celsius() { - const float f = value_float(); + static inline celsius_t value_celsius() { + float f = value_float(); switch (input_temp_units) { - case TEMPUNIT_F: - return (f - 32) * 0.5555555556f; - case TEMPUNIT_K: - return f - 273.15f; - case TEMPUNIT_C: default: - return f; + case TEMPUNIT_C: break; + case TEMPUNIT_K: f -= 273.15f; + case TEMPUNIT_F: f = (f - 32) * 0.5555555556f; } + return LROUND(f + 0.5f); } - static inline float value_celsius_diff() { + static inline celsius_t value_celsius_diff() { + float f = value_float(); switch (input_temp_units) { - case TEMPUNIT_F: - return value_float() * 0.5555555556f; - case TEMPUNIT_C: - case TEMPUNIT_K: default: - return value_float(); + case TEMPUNIT_C: + case TEMPUNIT_K: break; + case TEMPUNIT_F: f *= 0.5555555556f; } + return LROUND(f + 0.5f); } #else // !TEMPERATURE_UNITS_SUPPORT static inline float to_temp_units(int16_t c) { return (float)c; } - static inline float value_celsius() { return value_float(); } - static inline float value_celsius_diff() { return value_float(); } + static inline celsius_t value_celsius() { return value_int(); } + static inline celsius_t value_celsius_diff() { return value_int(); } #endif // !TEMPERATURE_UNITS_SUPPORT @@ -404,16 +399,16 @@ public: void unknown_command_warning(); // Provide simple value accessors with default option - static inline char* stringval(const char c, char * const dval=nullptr) { return seenval(c) ? value_string() : dval; } - static inline float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } - static inline bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } - static inline uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } - static inline int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } - static inline uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } - static inline int32_t longval(const char c, const int32_t dval=0) { return seenval(c) ? value_long() : dval; } - static inline uint32_t ulongval(const char c, const uint32_t dval=0) { return seenval(c) ? value_ulong() : dval; } - static inline float linearval(const char c, const float dval=0) { return seenval(c) ? value_linear_units() : dval; } - static inline float celsiusval(const char c, const float dval=0) { return seenval(c) ? value_celsius() : dval; } + static inline char* stringval(const char c, char * const dval=nullptr) { return seenval(c) ? value_string() : dval; } + static inline float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } + static inline bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } + static inline uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } + static inline int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } + static inline uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } + static inline int32_t longval(const char c, const int32_t dval=0) { return seenval(c) ? value_long() : dval; } + static inline uint32_t ulongval(const char c, const uint32_t dval=0) { return seenval(c) ? value_ulong() : dval; } + static inline float linearval(const char c, const float dval=0) { return seenval(c) ? value_linear_units() : dval; } + static inline celsius_t celsiusval(const char c, const float dval=0) { return seenval(c) ? value_celsius() : dval; } #if ENABLED(MARLIN_DEV_MODE) diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index 07e46e1775..fe1e834656 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -69,7 +69,7 @@ void GcodeSuite::M104() { #endif bool got_temp = false; - int16_t temp = 0; + celsius_t temp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -145,7 +145,7 @@ void GcodeSuite::M109() { #endif bool got_temp = false; - int16_t temp = 0; + celsius_t temp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -161,7 +161,7 @@ void GcodeSuite::M109() { if (!got_temp) { no_wait_for_cooling = parser.seenval('S'); got_temp = no_wait_for_cooling || parser.seenval('R'); - if (got_temp) temp = int16_t(parser.value_celsius()); + if (got_temp) temp = parser.value_celsius(); } if (got_temp) { diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index 9a1a0287d9..3aed878a03 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -44,7 +44,7 @@ void GcodeSuite::M140() { if (DEBUGGING(DRYRUN)) return; bool got_temp = false; - int16_t temp = 0; + celsius_t temp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -94,7 +94,7 @@ void GcodeSuite::M190() { if (DEBUGGING(DRYRUN)) return; bool got_temp = false; - int16_t temp = 0; + celsius_t temp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -110,7 +110,7 @@ void GcodeSuite::M190() { if (!got_temp) { no_wait_for_cooling = parser.seenval('S'); got_temp = no_wait_for_cooling || parser.seenval('R'); - if (got_temp) temp = int16_t(parser.value_celsius()); + if (got_temp) temp = parser.value_celsius(); } if (!got_temp) return; diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 653a384120..3f4cc23aba 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -520,15 +520,15 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { #if HAS_HEATED_BED const bool isBed = TERN(HAS_HEATED_CHAMBER, heater_id == H_BED, heater_id < 0); - const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), - t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); + const celsius_t t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), + t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); #else - const float t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); + const celsius_t t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); #endif if (prefix >= 0) lcd_put_wchar(prefix); - lcd_put_u8str(i16tostr3rj(t1 + 0.5)); + lcd_put_u8str(i16tostr3rj(t1)); lcd_put_wchar('/'); #if !HEATER_IDLE_HANDLER @@ -541,7 +541,7 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char pr } else #endif - lcd_put_u8str(i16tostr3left(t2 + 0.5)); + lcd_put_u8str(i16tostr3left(t2)); if (prefix >= 0) { lcd_put_wchar(LCD_STR_DEGREE[0]); diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 44128cc9f8..fd72f94862 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -434,33 +434,32 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *p uint8_t pic_hot_bits; #if HAS_HEATED_BED const bool isBed = heater_id < 0; - const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)); - const float t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); + const celsius_t t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), + t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); #else - const float t1 = thermalManager.degHotend(heater_id); - const float t2 = thermalManager.degTargetHotend(heater_id); + const celsius_t t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); #endif #if HOTENDS < 2 if (heater_id == H_E0) { lcd.setCursor(2, 5); lcd.print(prefix); //HE - lcd.setCursor(1, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(1, 6); lcd.print(i16tostr3rj(t1)); lcd.setCursor(1, 7); } else { lcd.setCursor(6, 5); lcd.print(prefix); //BED - lcd.setCursor(6, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(6, 6); lcd.print(i16tostr3rj(t1)); lcd.setCursor(6, 7); } #else if (heater_id > H_BED) { - lcd.setCursor(heater_id * 4, 5); lcd.print(prefix); //HE1 or HE2 or HE3 - lcd.setCursor(heater_id * 4, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(heater_id * 4, 5); lcd.print(prefix); // HE1 or HE2 or HE3 + lcd.setCursor(heater_id * 4, 6); lcd.print(i16tostr3rj(t1)); lcd.setCursor(heater_id * 4, 7); } else { lcd.setCursor(13, 5); lcd.print(prefix); //BED - lcd.setCursor(13, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(13, 6); lcd.print(i16tostr3rj(t1)); lcd.setCursor(13, 7); } #endif // HOTENDS <= 1 @@ -475,7 +474,7 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *p } else #endif // !HEATER_IDLE_HANDLER - lcd.print(i16tostr3rj(t2 + 0.5)); + lcd.print(i16tostr3rj(t2)); switch (heater_id) { case H_BED: pic_hot_bits = ICON_BED; break; diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 892ab5218b..7d97a1cdcf 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -187,7 +187,7 @@ #define PROGRESS_BAR_Y (EXTRAS_BASELINE + 1) #define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X) -FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, const uint8_t ty) { +FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, const uint8_t ty) { const char *str = i16tostr3rj(temp); const uint8_t len = str[0] != ' ' ? 3 : str[1] != ' ' ? 2 : 1; lcd_put_u8str(tx - len * (INFO_FONT_WIDTH) / 2 + 1, ty, &str[3-len]); @@ -206,8 +206,8 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons const uint8_t tx = STATUS_HOTEND_TEXT_X(heater_id); - const float temp = thermalManager.degHotend(heater_id), - target = thermalManager.degTargetHotend(heater_id); + const celsius_t temp = thermalManager.degHotend(heater_id), + target = thermalManager.degTargetHotend(heater_id); #if DISABLED(STATUS_HOTEND_ANIM) #define STATIC_HOTEND true @@ -277,11 +277,11 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons #else constexpr bool dodraw = true; #endif - if (dodraw) _draw_centered_temp(target + 0.5, tx, 7); + if (dodraw) _draw_centered_temp(target, tx, 7); } if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(temp + 0.5f, tx, 28); + _draw_centered_temp(temp, tx, 28); if (STATIC_HOTEND && HOTEND_DOT && PAGE_CONTAINS(17, 19)) { u8g.setColorIndex(0); // set to white on black @@ -303,8 +303,8 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons const uint8_t tx = STATUS_BED_TEXT_X; - const float temp = thermalManager.degBed(), - target = thermalManager.degTargetBed(); + const celsius_t temp = thermalManager.degBed(), + target = thermalManager.degTargetBed(); #if ENABLED(STATUS_HEAT_PERCENT) || DISABLED(STATUS_BED_ANIM) const bool isHeat = BED_ALT(); @@ -350,11 +350,11 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons #else constexpr bool dodraw = true; #endif - if (dodraw) _draw_centered_temp(target + 0.5, tx, 7); + if (dodraw) _draw_centered_temp(target, tx, 7); } if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(temp + 0.5f, tx, 28); + _draw_centered_temp(temp, tx, 28); if (STATIC_BED && BED_DOT && PAGE_CONTAINS(17, 19)) { u8g.setColorIndex(0); // set to white on black @@ -370,10 +370,10 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons FORCE_INLINE void _draw_chamber_status() { #if HAS_HEATED_CHAMBER if (PAGE_UNDER(7)) - _draw_centered_temp(thermalManager.degTargetChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 7); + _draw_centered_temp(thermalManager.degTargetChamber(), STATUS_CHAMBER_TEXT_X, 7); #endif if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(thermalManager.degChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 28); + _draw_centered_temp(thermalManager.degChamber(), STATUS_CHAMBER_TEXT_X, 28); } #endif diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index a538121d2c..dcb65f676d 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -691,15 +691,15 @@ bool ST7920_Lite_Status_Screen::indicators_changed() { // We only add the target temperatures to the checksum // because the actual temps fluctuate so by updating // them only during blinks we gain a bit of stability. - const bool blink = ui.get_blink(); - const uint16_t feedrate_perc = feedrate_percentage; - const uint16_t fs = thermalManager.scaledFanSpeed(0); - const int16_t extruder_1_target = thermalManager.degTargetHotend(0); + const bool blink = ui.get_blink(); + const uint16_t feedrate_perc = feedrate_percentage; + const uint16_t fs = thermalManager.scaledFanSpeed(0); + const celsius_t extruder_1_target = thermalManager.degTargetHotend(0); #if HAS_MULTI_HOTEND - const int16_t extruder_2_target = thermalManager.degTargetHotend(1); + const celsius_t extruder_2_target = thermalManager.degTargetHotend(1); #endif #if HAS_HEATED_BED - const int16_t bed_target = thermalManager.degTargetBed(); + const celsius_t bed_target = thermalManager.degTargetBed(); #endif static uint16_t last_checksum = 0; const uint16_t checksum = blink ^ feedrate_perc ^ fs ^ extruder_1_target @@ -712,19 +712,19 @@ bool ST7920_Lite_Status_Screen::indicators_changed() { void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { if (forceUpdate || indicators_changed()) { - const bool blink = ui.get_blink(); - const duration_t elapsed = print_job_timer.duration(); - duration_t remaining = TERN0(USE_M73_REMAINING_TIME, ui.get_remaining_time()); - const uint16_t feedrate_perc = feedrate_percentage; - const int16_t extruder_1_temp = thermalManager.degHotend(0), - extruder_1_target = thermalManager.degTargetHotend(0); + const bool blink = ui.get_blink(); + const duration_t elapsed = print_job_timer.duration(); + duration_t remaining = TERN0(USE_M73_REMAINING_TIME, ui.get_remaining_time()); + const uint16_t feedrate_perc = feedrate_percentage; + const celsius_t extruder_1_temp = thermalManager.degHotend(0), + extruder_1_target = thermalManager.degTargetHotend(0); #if HAS_MULTI_HOTEND - const int16_t extruder_2_temp = thermalManager.degHotend(1), - extruder_2_target = thermalManager.degTargetHotend(1); + const celsius_t extruder_2_temp = thermalManager.degHotend(1), + extruder_2_target = thermalManager.degTargetHotend(1); #endif #if HAS_HEATED_BED - const int16_t bed_temp = thermalManager.degBed(), - bed_target = thermalManager.degTargetBed(); + const celsius_t bed_temp = thermalManager.degBed(), + bed_target = thermalManager.degTargetBed(); #endif draw_extruder_1_temp(extruder_1_temp, extruder_1_target, forceUpdate); diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 60a22f22f1..0e9b93525d 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1578,20 +1578,22 @@ void _draw_xyz_position(const bool force) { void update_variable() { #if HAS_HOTEND - static float _hotendtemp = 0; - const bool _new_hotend_temp = _hotendtemp != thermalManager.temp_hotend[0].celsius; - if (_new_hotend_temp) _hotendtemp = thermalManager.temp_hotend[0].celsius; - static int16_t _hotendtarget = 0; - const bool _new_hotend_target = _hotendtarget != thermalManager.temp_hotend[0].target; - if (_new_hotend_target) _hotendtarget = thermalManager.temp_hotend[0].target; + static celsius_t _hotendtemp = 0, _hotendtarget = 0; + const celsius_t hc = thermalManager.degHotend(0), + ht = thermalManager.degTargetHotend(0); + const bool _new_hotend_temp = _hotendtemp != hc, + _new_hotend_target = _hotendtarget != ht; + if (_new_hotend_temp) _hotendtemp = hc; + if (_new_hotend_target) _hotendtarget = ht; #endif #if HAS_HEATED_BED - static float _bedtemp = 0; - const bool _new_bed_temp = _bedtemp != thermalManager.temp_bed.celsius; - if (_new_bed_temp) _bedtemp = thermalManager.temp_bed.celsius; - static int16_t _bedtarget = 0; - const bool _new_bed_target = _bedtarget != thermalManager.temp_bed.target; - if (_new_bed_target) _bedtarget = thermalManager.temp_bed.target; + static celsius_t _bedtemp = 0, _bedtarget = 0; + const celsius_t bc = thermalManager.degBed(), + bt = thermalManager.degTargetBed(); + const bool _new_bed_temp = _bedtemp != bc, + _new_bed_target = _bedtarget != bt; + if (_new_bed_temp) _bedtemp = bc; + if (_new_bed_target) _bedtarget = bt; #endif #if HAS_FAN static uint8_t _fanspeed = 0; diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 217127ed11..9e0cda86c2 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -234,8 +234,8 @@ extern char print_filename[16]; extern millis_t dwin_heat_time; typedef struct { - TERN_(HAS_HOTEND, int16_t E_Temp = 0); - TERN_(HAS_HEATED_BED, int16_t Bed_Temp = 0); + TERN_(HAS_HOTEND, celsius_t E_Temp = 0); + TERN_(HAS_HEATED_BED, celsius_t Bed_Temp = 0); TERN_(HAS_FAN, int16_t Fan_speed = 0); int16_t print_speed = 100; float Max_Feedspeed = 0; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 93a7de14a1..473fcb954c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -388,28 +388,28 @@ void DGUSScreenHandler::HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr } void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t newvalue = swap16(*(uint16_t*)val_ptr); - uint16_t acceptedvalue; + celsius_t newvalue = swap16(*(uint16_t*)val_ptr); + celsius_t acceptedvalue; switch (var.VP) { default: return; #if HOTENDS >= 1 case VP_T_E0_Set: - NOMORE(newvalue, (uint16_t)HEATER_0_MAXTEMP); + NOMORE(newvalue, HEATER_0_MAXTEMP); thermalManager.setTargetHotend(newvalue, 0); acceptedvalue = thermalManager.degTargetHotend(0); break; #endif #if HOTENDS >= 2 case VP_T_E1_Set: - NOMORE(newvalue, (uint16_t)HEATER_1_MAXTEMP); + NOMORE(newvalue, HEATER_1_MAXTEMP); thermalManager.setTargetHotend(newvalue, 1); acceptedvalue = thermalManager.degTargetHotend(1); break; #endif #if HAS_HEATED_BED case VP_T_Bed_Set: - NOMORE(newvalue, (uint16_t)BED_MAXTEMP); + NOMORE(newvalue, BED_MAXTEMP); thermalManager.setTargetBed(newvalue); acceptedvalue = thermalManager.degTargetBed(); break; diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp index 467444c214..ee0a1c749f 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp @@ -367,7 +367,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), @@ -388,7 +388,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), @@ -400,7 +400,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp index 536640ec95..d3c4510fb3 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp @@ -364,13 +364,13 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &ScreenHandler.HandleFirstLayerCal, nullptr), #endif - { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr - { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay }, + { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay }, // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), @@ -391,7 +391,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), @@ -399,7 +399,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 9f436a356c..25e1670740 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -548,7 +548,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), @@ -573,7 +573,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), @@ -593,7 +593,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index 8d89de3e33..e232bf9b96 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -216,7 +216,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), @@ -227,7 +227,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 767d9c6738..3fed4cc385 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -515,7 +515,7 @@ void filament_dialog_handle() { } if (uiCfg.filament_load_heat_flg) { - const int16_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + const celsius_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; if (abs(diff) < 2 || diff > 0) { uiCfg.filament_load_heat_flg = false; lv_clear_dialog(); @@ -531,7 +531,7 @@ void filament_dialog_handle() { } if (uiCfg.filament_unload_heat_flg) { - const int16_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + const celsius_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; if (abs(diff) < 2 || diff > 0) { uiCfg.filament_unload_heat_flg = false; lv_clear_dialog(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index a7f219965a..3098a6666c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -202,7 +202,7 @@ typedef struct { filamentchange_load_speed, filamentchange_unload_length, filamentchange_unload_speed; - int16_t filament_limit_temp; + celsius_t filament_limit_temp; float pausePosX, pausePosY, pausePosZ; uint32_t curFilesize; } CFG_ITMES; @@ -244,7 +244,7 @@ typedef struct { filament_loading_time_cnt, filament_unloading_time_cnt; float move_dist; - float hotendTargetTempBak; + celsius_t hotendTargetTempBak; float current_x_position_bak, current_y_position_bak, current_z_position_bak, diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 1c9e80c75e..6f5703e622 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -110,9 +110,9 @@ #if PREHEAT_COUNT typedef struct { - TERN_(HAS_HOTEND, uint16_t hotend_temp); - TERN_(HAS_HEATED_BED, uint16_t bed_temp ); - TERN_(HAS_FAN, uint16_t fan_speed ); + TERN_(HAS_HOTEND, celsius_t hotend_temp); + TERN_(HAS_HEATED_BED, celsius_t bed_temp ); + TERN_(HAS_FAN, uint16_t fan_speed ); } preheat_t; #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 71f09a5aee..7ef49f0cf8 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -325,10 +325,10 @@ void menu_advanced_settings(); EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; }); #endif #if HAS_TEMP_HOTEND - EDIT_ITEM(uint16_3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); + EDIT_ITEM(int3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - (HOTEND_OVERSHOOT)); #endif #if HAS_HEATED_BED - EDIT_ITEM(uint16_3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); + EDIT_ITEM(int3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); #endif #if ENABLED(EEPROM_SETTINGS) ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index fb82188645..37a44f51b4 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -114,7 +114,7 @@ void MarlinUI::draw_kill_screen() { void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { MarlinImage image = imgHotEnd; uint16_t Color; - float currentTemperature, targetTemperature; + celsius_t currentTemperature, targetTemperature; if (Heater >= 0) { // HotEnd currentTemperature = thermalManager.degHotend(Heater); @@ -175,13 +175,13 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { tft.add_image(0, 18, image, Color); - tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(64) + 2, 72, Color, tft_string); if (targetTemperature >= 0) { - tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(64) + 2, 8, Color, tft_string); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 164785a229..81e4603ea4 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -114,7 +114,7 @@ void MarlinUI::draw_kill_screen() { void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { MarlinImage image = imgHotEnd; uint16_t Color; - float currentTemperature, targetTemperature; + celsius_t currentTemperature, targetTemperature; if (Heater >= 0) { // HotEnd currentTemperature = thermalManager.degHotend(Heater); @@ -168,13 +168,13 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { tft.add_image(8, 28, image, Color); - tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(80) + 2, 82, Color, tft_string); if (targetTemperature >= 0) { - tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(80) + 2, 8, Color, tft_string); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 2f4f5e283a..b0a4890e07 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -940,11 +940,11 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { DualXMode dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; float inactive_extruder_x = X2_MAX_POS, // Used in mode 0 & 1 - duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // Used in mode 2 + duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // Used in mode 2 & 3 xyz_pos_t raised_parked_position; // Used in mode 1 - bool active_extruder_parked = false; // Used in mode 1 & 2 + bool active_extruder_parked = false; // Used in mode 1, 2 & 3 millis_t delayed_move_time = 0; // Used in mode 1 - int16_t duplicate_extruder_temp_offset = 0; // Used in mode 2 + celsius_t duplicate_extruder_temp_offset = 0; // Used in mode 2 & 3 bool idex_mirrored_mode = false; // Used in mode 3 float x_home_pos(const uint8_t extruder) { diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 0328d015a4..7b8d2f2018 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -463,13 +463,13 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == }; extern DualXMode dual_x_carriage_mode; - extern float inactive_extruder_x, // Used in mode 0 & 1 - duplicate_extruder_x_offset; // Used in mode 2 & 3 - extern xyz_pos_t raised_parked_position; // Used in mode 1 - extern bool active_extruder_parked; // Used in mode 1, 2 & 3 - extern millis_t delayed_move_time; // Used in mode 1 - extern int16_t duplicate_extruder_temp_offset; // Used in mode 2 & 3 - extern bool idex_mirrored_mode; // Used in mode 3 + extern float inactive_extruder_x, // Used in mode 0 & 1 + duplicate_extruder_x_offset; // Used in mode 2 & 3 + extern xyz_pos_t raised_parked_position; // Used in mode 1 + extern bool active_extruder_parked; // Used in mode 1, 2 & 3 + extern millis_t delayed_move_time; // Used in mode 1 + extern celsius_t duplicate_extruder_temp_offset; // Used in mode 2 & 3 + extern bool idex_mirrored_mode; // Used in mode 3 FORCE_INLINE bool idex_is_duplicating() { return dual_x_carriage_mode >= DXC_DUPLICATION_MODE; } diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 594671f87a..8c320925be 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -197,9 +197,9 @@ float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step skew_factor_t Planner::skew_factor; // Initialized by settings.load() #if ENABLED(AUTOTEMP) - float Planner::autotemp_max = 250, - Planner::autotemp_min = 210, - Planner::autotemp_factor = 0.1f; + celsius_t Planner::autotemp_max = 250, + Planner::autotemp_min = 210; + float Planner::autotemp_factor = 0.1f; bool Planner::autotemp_enabled = false; #endif @@ -1376,7 +1376,7 @@ void Planner::check_axes_activity() { #if ENABLED(AUTOTEMP_PROPORTIONAL) void Planner::_autotemp_update_from_hotend() { - const int16_t target = thermalManager.degTargetHotend(active_extruder); + const celsius_t target = thermalManager.degTargetHotend(active_extruder); autotemp_min = target + AUTOTEMP_MIN_P; autotemp_max = target + AUTOTEMP_MAX_P; } diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 7ebba1e342..769967d4a6 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -896,7 +896,8 @@ class Planner { #endif #if ENABLED(AUTOTEMP) - static float autotemp_min, autotemp_max, autotemp_factor; + static celsius_t autotemp_min, autotemp_max; + static float autotemp_factor; static bool autotemp_enabled; static void autotemp_update(); static void autotemp_M104_M109(); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index dd7a36a82a..6d1f3bd0a3 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -253,7 +253,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HOTEND hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 } - const uint16_t Temperature::hotend_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); + const celsius_t Temperature::hotend_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); #endif #if ENABLED(AUTO_POWER_E_FANS) @@ -368,12 +368,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HEATED_BED bed_info_t Temperature::temp_bed; // = { 0 } // Init min and max temp with extreme values to prevent false errors during startup - #ifdef BED_MINTEMP - int16_t Temperature::mintemp_raw_BED = TEMP_SENSOR_BED_RAW_LO_TEMP; - #endif - #ifdef BED_MAXTEMP - int16_t Temperature::maxtemp_raw_BED = TEMP_SENSOR_BED_RAW_HI_TEMP; - #endif + int16_t Temperature::mintemp_raw_BED = TEMP_SENSOR_BED_RAW_LO_TEMP, + Temperature::maxtemp_raw_BED = TEMP_SENSOR_BED_RAW_HI_TEMP; TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } IF_DISABLED(PIDTEMPBED, millis_t Temperature::next_bed_check_ms); #endif @@ -383,12 +379,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HEATED_CHAMBER millis_t next_cool_check_ms_2 = 0; float old_temp = 9999; - #ifdef CHAMBER_MINTEMP - int16_t Temperature::mintemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_LO_TEMP; - #endif - #ifdef CHAMBER_MAXTEMP - int16_t Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; - #endif + int16_t Temperature::mintemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_LO_TEMP, + Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; TERN_(WATCH_CHAMBER, chamber_watch_t Temperature::watch_chamber{0}); IF_DISABLED(PIDTEMPCHAMBER, millis_t Temperature::next_chamber_check_ms); #endif @@ -400,12 +392,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, bool flag_cooler_state; //bool flag_cooler_excess = false; float previous_temp = 9999; - #ifdef COOLER_MINTEMP - int16_t Temperature::mintemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_LO_TEMP; - #endif - #ifdef COOLER_MAXTEMP - int16_t Temperature::maxtemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_HI_TEMP; - #endif + int16_t Temperature::mintemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_LO_TEMP, + Temperature::maxtemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_HI_TEMP; #if WATCH_COOLER cooler_watch_t Temperature::watch_cooler{0}; #endif @@ -419,7 +407,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if ENABLED(PREVENT_COLD_EXTRUSION) bool Temperature::allow_cold_extrude = false; - int16_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP; + celsius_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP; #endif // private: @@ -429,7 +417,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - uint16_t Temperature::redundant_temperature_raw = 0; + celsius_t Temperature::redundant_temperature_raw = 0; float Temperature::redundant_temperature = 0.0; #endif @@ -474,7 +462,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - uint16_t Temperature::singlenozzle_temp[EXTRUDERS]; + celsius_t Temperature::singlenozzle_temp[EXTRUDERS]; #if HAS_FAN uint8_t Temperature::singlenozzle_fan_speed[EXTRUDERS]; #endif @@ -1566,22 +1554,22 @@ void Temperature::manage_heater() { * Bisect search for the range of the 'raw' value, then interpolate * proportionally between the under and over values. */ -#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ - uint8_t l = 0, r = LEN, m; \ - for (;;) { \ - m = (l + r) >> 1; \ - if (!m) return int16_t(pgm_read_word(&TBL[0].celsius)); \ - if (m == l || m == r) return int16_t(pgm_read_word(&TBL[LEN-1].celsius)); \ - int16_t v00 = pgm_read_word(&TBL[m-1].value), \ - v10 = pgm_read_word(&TBL[m-0].value); \ - if (raw < v00) r = m; \ - else if (raw > v10) l = m; \ - else { \ - const int16_t v01 = int16_t(pgm_read_word(&TBL[m-1].celsius)), \ - v11 = int16_t(pgm_read_word(&TBL[m-0].celsius)); \ - return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ - } \ - } \ +#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ + uint8_t l = 0, r = LEN, m; \ + for (;;) { \ + m = (l + r) >> 1; \ + if (!m) return celsius_t(pgm_read_word(&TBL[0].celsius)); \ + if (m == l || m == r) return celsius_t(pgm_read_word(&TBL[LEN-1].celsius)); \ + int16_t v00 = pgm_read_word(&TBL[m-1].value), \ + v10 = pgm_read_word(&TBL[m-0].value); \ + if (raw < v00) r = m; \ + else if (raw > v10) l = m; \ + else { \ + const celsius_t v01 = celsius_t(pgm_read_word(&TBL[m-1].celsius)), \ + v11 = celsius_t(pgm_read_word(&TBL[m-0].celsius)); \ + return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ + } \ + } \ }while(0) #if HAS_USER_THERMISTORS @@ -1663,7 +1651,7 @@ void Temperature::manage_heater() { SERIAL_EOL(); } - float Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { + celsius_t Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { //#if (MOTHERBOARD == BOARD_RAMPS_14_EFB) // static uint32_t clocks_total = 0; // static uint32_t calls = 0; @@ -1712,7 +1700,7 @@ void Temperature::manage_heater() { #if HAS_HOTEND // Derived from RepRap FiveD extruder::getTemperature() // For hot end temperature measurement. - float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { + celsius_t Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { if (e > HOTENDS - DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)) { SERIAL_ERROR_START(); SERIAL_ECHO(e); @@ -1821,7 +1809,7 @@ void Temperature::manage_heater() { #if HAS_HEATED_BED // For bed temperature measurement. - float Temperature::analog_to_celsius_bed(const int raw) { + celsius_t Temperature::analog_to_celsius_bed(const int raw) { #if TEMP_SENSOR_BED_IS_CUSTOM return user_thermistor_to_deg_c(CTI_BED, raw); #elif TEMP_SENSOR_BED_IS_THERMISTOR @@ -1839,7 +1827,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_CHAMBER // For chamber temperature measurement. - float Temperature::analog_to_celsius_chamber(const int raw) { + celsius_t Temperature::analog_to_celsius_chamber(const int raw) { #if TEMP_SENSOR_CHAMBER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_CHAMBER, raw); #elif TEMP_SENSOR_CHAMBER_IS_THERMISTOR @@ -1857,7 +1845,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_COOLER // For cooler temperature measurement. - float Temperature::analog_to_celsius_cooler(const int raw) { + celsius_t Temperature::analog_to_celsius_cooler(const int raw) { #if TEMP_SENSOR_COOLER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_COOLER, raw); #elif TEMP_SENSOR_COOLER_IS_THERMISTOR @@ -1875,7 +1863,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_PROBE // For probe temperature measurement. - float Temperature::analog_to_celsius_probe(const int raw) { + celsius_t Temperature::analog_to_celsius_probe(const int raw) { #if TEMP_SENSOR_PROBE_IS_CUSTOM return user_thermistor_to_deg_c(CTI_PROBE, raw); #elif TEMP_SENSOR_PROBE_IS_THERMISTOR @@ -2191,13 +2179,13 @@ void Temperature::init() { #if HAS_HOTEND #define _TEMP_MIN_E(NR) do{ \ - const int16_t tmin = _MAX(HEATER_##NR##_MINTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 0, (int16_t)pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MINTEMP_IND].celsius))); \ + const celsius_t tmin = _MAX(HEATER_##NR##_MINTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 0, pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MINTEMP_IND].celsius))); \ temp_range[NR].mintemp = tmin; \ while (analog_to_celsius_hotend(temp_range[NR].raw_min, NR) < tmin) \ temp_range[NR].raw_min += TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) #define _TEMP_MAX_E(NR) do{ \ - const int16_t tmax = _MIN(HEATER_##NR##_MAXTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 2000, (int16_t)pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MAXTEMP_IND].celsius) - 1)); \ + const celsius_t tmax = _MIN(HEATER_##NR##_MAXTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 2000, pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MAXTEMP_IND].celsius) - 1)); \ temp_range[NR].maxtemp = tmax; \ while (analog_to_celsius_hotend(temp_range[NR].raw_max, NR) > tmax) \ temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ @@ -2257,30 +2245,18 @@ void Temperature::init() { #endif // HAS_HOTEND #if HAS_HEATED_BED - #ifdef BED_MINTEMP - while (analog_to_celsius_bed(mintemp_raw_BED) < BED_MINTEMP) mintemp_raw_BED += TEMPDIR(BED) * (OVERSAMPLENR); - #endif - #ifdef BED_MAXTEMP - while (analog_to_celsius_bed(maxtemp_raw_BED) > BED_MAXTEMP) maxtemp_raw_BED -= TEMPDIR(BED) * (OVERSAMPLENR); - #endif - #endif // HAS_HEATED_BED + while (analog_to_celsius_bed(mintemp_raw_BED) < BED_MINTEMP) mintemp_raw_BED += TEMPDIR(BED) * (OVERSAMPLENR); + while (analog_to_celsius_bed(maxtemp_raw_BED) > BED_MAXTEMP) maxtemp_raw_BED -= TEMPDIR(BED) * (OVERSAMPLENR); + #endif #if HAS_HEATED_CHAMBER - #ifdef CHAMBER_MINTEMP - while (analog_to_celsius_chamber(mintemp_raw_CHAMBER) < CHAMBER_MINTEMP) mintemp_raw_CHAMBER += TEMPDIR(CHAMBER) * (OVERSAMPLENR); - #endif - #ifdef CHAMBER_MAXTEMP - while (analog_to_celsius_chamber(maxtemp_raw_CHAMBER) > CHAMBER_MAXTEMP) maxtemp_raw_CHAMBER -= TEMPDIR(CHAMBER) * (OVERSAMPLENR); - #endif + while (analog_to_celsius_chamber(mintemp_raw_CHAMBER) < CHAMBER_MINTEMP) mintemp_raw_CHAMBER += TEMPDIR(CHAMBER) * (OVERSAMPLENR); + while (analog_to_celsius_chamber(maxtemp_raw_CHAMBER) > CHAMBER_MAXTEMP) maxtemp_raw_CHAMBER -= TEMPDIR(CHAMBER) * (OVERSAMPLENR); #endif #if HAS_COOLER - #ifdef COOLER_MINTEMP - while (analog_to_celsius_cooler(mintemp_raw_COOLER) > COOLER_MINTEMP) mintemp_raw_COOLER += TEMPDIR(COOLER) * (OVERSAMPLENR); - #endif - #ifdef COOLER_MAXTEMP - while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR); - #endif + while (analog_to_celsius_cooler(mintemp_raw_COOLER) > COOLER_MINTEMP) mintemp_raw_COOLER += TEMPDIR(COOLER) * (OVERSAMPLENR); + while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR); #endif TERN_(PROBING_HEATERS_OFF, paused = false); @@ -2345,7 +2321,7 @@ void Temperature::init() { * * TODO: Embed the last 3 parameters during init, if not less optimal */ - void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { + void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc) { #if HEATER_IDLE_HANDLER // Convert the given heater_id_t to an idle array index @@ -2554,7 +2530,7 @@ void Temperature::disable_all_heaters() { #if HAS_MULTI_MAX_TC // Needed to return the correct temp when this is called between readings - static uint16_t max_tc_temp_previous[MAX_TC_COUNT] = { 0 }; + static celsius_t max_tc_temp_previous[MAX_TC_COUNT] = { 0 }; #define THERMO_TEMP(I) max_tc_temp_previous[I] #define THERMO_SEL(A,B) (hindex ? (B) : (A)) #define MAX6675_WRITE(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 38270fc9c4..c9e3575257 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -179,7 +179,7 @@ enum ADCSensorState : char { typedef struct TempInfo { uint16_t acc; int16_t raw; - float celsius; + celsius_t celsius; inline void reset() { acc = 0; } inline void sample(const uint16_t s) { acc += s; } inline void update() { raw = acc; } @@ -187,7 +187,7 @@ typedef struct TempInfo { // A PWM heater with temperature sensor typedef struct HeaterInfo : public TempInfo { - int16_t target; + celsius_t target; uint8_t soft_pwm_amount; } heater_info_t; @@ -228,14 +228,14 @@ struct PIDHeaterInfo : public HeaterInfo { // Heater watch handling template struct HeaterWatch { - uint16_t target; + celsius_t target; millis_t next_ms; inline bool elapsed(const millis_t &ms) { return next_ms && ELAPSED(ms, next_ms); } inline bool elapsed() { return elapsed(millis()); } - inline void restart(const int16_t curr, const int16_t tgt) { + inline void restart(const celsius_t curr, const celsius_t tgt) { if (tgt) { - const int16_t newtarget = curr + INCREASE; + const celsius_t newtarget = curr + INCREASE; if (newtarget < tgt - HYSTERESIS - 1) { target = newtarget; next_ms = millis() + SEC_TO_MS(PERIOD); @@ -261,8 +261,8 @@ struct HeaterWatch { // Temperature sensor read value ranges typedef struct { int16_t raw_min, raw_max; } raw_range_t; -typedef struct { int16_t mintemp, maxtemp; } celsius_range_t; -typedef struct { int16_t raw_min, raw_max, mintemp, maxtemp; } temp_range_t; +typedef struct { celsius_t mintemp, maxtemp; } celsius_range_t; +typedef struct { int16_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_range_t; #define THERMISTOR_ABS_ZERO_C -273.15f // bbbbrrrrr cold ! #define THERMISTOR_RESISTANCE_NOMINAL_C 25.0f // mmmmm comfortable @@ -323,8 +323,8 @@ class Temperature { #if HAS_HOTEND #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) static hotend_info_t temp_hotend[HOTEND_TEMPS]; - static const uint16_t hotend_maxtemp[HOTENDS]; - FORCE_INLINE static uint16_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } + static const celsius_t hotend_maxtemp[HOTENDS]; + FORCE_INLINE static celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } #endif TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); @@ -342,8 +342,8 @@ class Temperature { #if ENABLED(PREVENT_COLD_EXTRUSION) static bool allow_cold_extrude; - static int16_t extrude_min_temp; - FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } + static celsius_t extrude_min_temp; + FORCE_INLINE static bool tooCold(const celsius_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } FORCE_INLINE static bool tooColdToExtrude(const uint8_t E_NAME) { return tooCold(degHotend(HOTEND_INDEX)); } @@ -359,7 +359,7 @@ class Temperature { FORCE_INLINE static bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } #if ENABLED(SINGLENOZZLE_STANDBY_FAN) - static uint16_t singlenozzle_temp[EXTRUDERS]; + static celsius_t singlenozzle_temp[EXTRUDERS]; #if HAS_FAN static uint8_t singlenozzle_fan_speed[EXTRUDERS]; #endif @@ -411,7 +411,7 @@ class Temperature { #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) static uint16_t redundant_temperature_raw; - static float redundant_temperature; + static celsius_t redundant_temperature; #endif #if ENABLED(PID_EXTRUSION_SCALING) @@ -424,34 +424,19 @@ class Temperature { #if HAS_HEATED_BED TERN_(WATCH_BED, static bed_watch_t watch_bed); IF_DISABLED(PIDTEMPBED, static millis_t next_bed_check_ms); - #ifdef BED_MINTEMP - static int16_t mintemp_raw_BED; - #endif - #ifdef BED_MAXTEMP - static int16_t maxtemp_raw_BED; - #endif + static int16_t mintemp_raw_BED, maxtemp_raw_BED; #endif #if HAS_HEATED_CHAMBER TERN_(WATCH_CHAMBER, static chamber_watch_t watch_chamber); TERN(PIDTEMPCHAMBER,,static millis_t next_chamber_check_ms); - #ifdef CHAMBER_MINTEMP - static int16_t mintemp_raw_CHAMBER; - #endif - #ifdef CHAMBER_MAXTEMP - static int16_t maxtemp_raw_CHAMBER; - #endif + static int16_t mintemp_raw_CHAMBER, maxtemp_raw_CHAMBER; #endif #if HAS_COOLER TERN_(WATCH_COOLER, static cooler_watch_t watch_cooler); static millis_t next_cooler_check_ms, cooler_fan_flush_ms; - #ifdef COOLER_MINTEMP - static int16_t mintemp_raw_COOLER; - #endif - #ifdef COOLER_MAXTEMP - static int16_t maxtemp_raw_COOLER; - #endif + static int16_t mintemp_raw_COOLER, maxtemp_raw_COOLER; #endif #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED @@ -488,7 +473,7 @@ class Temperature { static user_thermistor_t user_thermistor[USER_THERMISTORS]; static void log_user_thermistor(const uint8_t t_index, const bool eprom=false); static void reset_user_thermistors(); - static float user_thermistor_to_deg_c(const uint8_t t_index, const int raw); + static celsius_t user_thermistor_to_deg_c(const uint8_t t_index, const int raw); static bool set_pull_up_res(int8_t t_index, float value) { //if (!WITHIN(t_index, 0, USER_THERMISTORS - 1)) return false; if (!WITHIN(value, 1, 1000000)) return false; @@ -516,19 +501,19 @@ class Temperature { #endif #if HAS_HOTEND - static float analog_to_celsius_hotend(const int raw, const uint8_t e); + static celsius_t analog_to_celsius_hotend(const int raw, const uint8_t e); #endif #if HAS_HEATED_BED - static float analog_to_celsius_bed(const int raw); + static celsius_t analog_to_celsius_bed(const int raw); #endif #if HAS_TEMP_PROBE - static float analog_to_celsius_probe(const int raw); + static celsius_t analog_to_celsius_probe(const int raw); #endif #if HAS_TEMP_CHAMBER - static float analog_to_celsius_chamber(const int raw); + static celsius_t analog_to_celsius_chamber(const int raw); #endif #if HAS_TEMP_COOLER - static float analog_to_celsius_cooler(const int raw); + static celsius_t analog_to_celsius_cooler(const int raw); #endif #if HAS_FAN @@ -620,7 +605,7 @@ class Temperature { } #endif - FORCE_INLINE static int16_t degTargetHotend(const uint8_t E_NAME) { + FORCE_INLINE static celsius_t degTargetHotend(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].target); } @@ -632,7 +617,7 @@ class Temperature { #if HAS_HOTEND - static void setTargetHotend(const int16_t celsius, const uint8_t E_NAME) { + static void setTargetHotend(const celsius_t celsius, const uint8_t E_NAME) { const uint8_t ee = HOTEND_INDEX; #ifdef MILLISECONDS_PREHEAT_TIME if (celsius == 0) @@ -678,12 +663,12 @@ class Temperature { #if HAS_HEATED_BED #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawBedTemp() { return temp_bed.raw; } + FORCE_INLINE static int16_t rawBedTemp() { return temp_bed.raw; } #endif - FORCE_INLINE static float degBed() { return temp_bed.celsius; } - FORCE_INLINE static int16_t degTargetBed() { return temp_bed.target; } - FORCE_INLINE static bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } - FORCE_INLINE static bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } + FORCE_INLINE static celsius_t degBed() { return temp_bed.celsius; } + FORCE_INLINE static celsius_t degTargetBed() { return temp_bed.target; } + FORCE_INLINE static bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } + FORCE_INLINE static bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } #if WATCH_BED static void start_watching_bed(); @@ -691,15 +676,9 @@ class Temperature { static inline void start_watching_bed() {} #endif - static void setTargetBed(const int16_t celsius) { + static void setTargetBed(const celsius_t celsius) { TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); - temp_bed.target = - #ifdef BED_MAX_TARGET - _MIN(celsius, BED_MAX_TARGET) - #else - celsius - #endif - ; + temp_bed.target = _MIN(celsius, BED_MAX_TARGET); start_watching_bed(); } @@ -735,14 +714,13 @@ class Temperature { #if HAS_TEMP_CHAMBER #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawChamberTemp() { return temp_chamber.raw; } + FORCE_INLINE static int16_t rawChamberTemp() { return temp_chamber.raw; } #endif - FORCE_INLINE static float degChamber() { return temp_chamber.celsius; } + FORCE_INLINE static float degChamber() { return temp_chamber.celsius; } #if HAS_HEATED_CHAMBER - FORCE_INLINE static int16_t degTargetChamber() { return temp_chamber.target; } - FORCE_INLINE static bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } - FORCE_INLINE static bool isCoolingChamber() { return temp_chamber.target < temp_chamber.celsius; } - + FORCE_INLINE static celsius_t degTargetChamber() { return temp_chamber.target; } + FORCE_INLINE static bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } + FORCE_INLINE static bool isCoolingChamber() { return temp_chamber.target < temp_chamber.celsius; } static bool wait_for_chamber(const bool no_wait_for_cooling=true); #endif #endif @@ -754,27 +732,21 @@ class Temperature { #endif #if HAS_HEATED_CHAMBER - static void setTargetChamber(const int16_t celsius) { - temp_chamber.target = - #ifdef CHAMBER_MAXTEMP - _MIN(celsius, CHAMBER_MAXTEMP - 10) - #else - celsius - #endif - ; + static void setTargetChamber(const celsius_t celsius) { + temp_chamber.target = _MIN(celsius, CHAMBER_MAX_TARGET); start_watching_chamber(); } #endif #if HAS_TEMP_COOLER #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawCoolerTemp() { return temp_cooler.raw; } + FORCE_INLINE static int16_t rawCoolerTemp() { return temp_cooler.raw; } #endif - FORCE_INLINE static float degCooler() { return temp_cooler.celsius; } + FORCE_INLINE static float degCooler() { return temp_cooler.celsius; } #if HAS_COOLER - FORCE_INLINE static int16_t degTargetCooler() { return temp_cooler.target; } - FORCE_INLINE static bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } - FORCE_INLINE static bool isLaserCooling() { return temp_cooler.target < temp_cooler.celsius; } + FORCE_INLINE static celsius_t degTargetCooler() { return temp_cooler.target; } + FORCE_INLINE static bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } + FORCE_INLINE static bool isLaserCooling() { return temp_cooler.target < temp_cooler.celsius; } static bool wait_for_cooler(const bool no_wait_for_cooling=true); #endif #endif @@ -786,7 +758,7 @@ class Temperature { #endif #if HAS_COOLER - static void setTargetCooler(const int16_t celsius) { + static void setTargetCooler(const celsius_t celsius) { temp_cooler.target = constrain(celsius, COOLER_MIN_TARGET, COOLER_MAX_TARGET); start_watching_cooler(); } @@ -945,7 +917,7 @@ class Temperature { millis_t timer = 0; TRState state = TRInactive; float running_temp; - void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); + void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc); } tr_state_machine_t; static tr_state_machine_t tr_state_machine[NR_HEATER_RUNAWAY]; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index f0ec289dfe..0871844e39 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -44,7 +44,7 @@ #define ANY_THERMISTOR_IS(n) (TEMP_SENSOR_0_THERMISTOR_ID == n || TEMP_SENSOR_1_THERMISTOR_ID == n || TEMP_SENSOR_2_THERMISTOR_ID == n || TEMP_SENSOR_3_THERMISTOR_ID == n || TEMP_SENSOR_4_THERMISTOR_ID == n || TEMP_SENSOR_5_THERMISTOR_ID == n || TEMP_SENSOR_6_THERMISTOR_ID == n || TEMP_SENSOR_7_THERMISTOR_ID == n || TEMP_SENSOR_BED_THERMISTOR_ID == n || TEMP_SENSOR_CHAMBER_THERMISTOR_ID == n || TEMP_SENSOR_COOLER_THERMISTOR_ID == n || TEMP_SENSOR_PROBE_THERMISTOR_ID == n) -typedef struct { int16_t value, celsius; } temp_entry_t; +typedef struct { int16_t value; celsius_t celsius; } temp_entry_t; // Pt1000 and Pt100 handling // From 9e8b158ee13434683f4b9d62d661daae36c0be1e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 23:58:53 -0500 Subject: [PATCH 1187/1370] Tweak mf helper scripts --- buildroot/bin/mftest | 14 ++++++++------ buildroot/share/git/mfqp | 5 +++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 4cecf4f3a5..906e2abf87 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -28,6 +28,7 @@ OPTIONS -a --autobuild PIO Build using the MOTHERBOARD environment. -u --autoupload PIO Upload using the MOTHERBOARD environment. -v --verbose Extra output for debugging. + -s --silent Silence build output from PlatformIO. env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41 " @@ -62,6 +63,7 @@ while getopts 'abhmruvyn:t:-:' OFLAG; do esac ;; r) REBUILD=1 ; bugout "Rebuilding previous..." ;; + s) SILENT_FLAG="-s" ;; t) TESTENV="$OPTARG" ; bugout "Got a target: $TESTENV" ;; u) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; v) DEBUG=1 ; bugout "Debug ON" ;; @@ -105,8 +107,8 @@ if ((REBUILD)); then # Build with the last-built env [[ -f "$STATE_FILE" ]] || { errout "No previous (-r) build state found." ; exit 1 ; } read TESTENV <"$STATE_FILE" - pio run -s -d . -e $TESTENV - exit + pio run $SILENT_FLAG -d . -e $TESTENV + exit 0 fi case $TESTENV in @@ -189,12 +191,12 @@ if ((AUTO_BUILD)); then if ((AUTO_BUILD == 2)); then echo "Uploading environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -t upload -e $TARGET + pio run $SILENT_FLAG -t upload -e $TARGET else echo "Building environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -s -e $TARGET + pio run $SILENT_FLAG -e $TARGET fi - exit + exit 0 fi # @@ -306,6 +308,6 @@ fi [[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && { ((USE_MAKE)) && make tests-single-local TEST_TARGET=$TESTENV ONLY_TEST=$CHOICE - ((USE_MAKE)) || pio run -s -d . -e $TESTENV + ((USE_MAKE)) || pio run $SILENT_FLAG -d . -e $TESTENV echo "$TESTENV" >"$STATE_FILE" } diff --git a/buildroot/share/git/mfqp b/buildroot/share/git/mfqp index 5650d08252..f0c4446a21 100755 --- a/buildroot/share/git/mfqp +++ b/buildroot/share/git/mfqp @@ -4,7 +4,7 @@ # # - git add . # - git commit --amend -# - ghpc +# - git push -f # MFINFO=$(mfinfo "$@") || exit 1 @@ -17,6 +17,7 @@ IND=6 while [ $IND -lt ${#INFO[@]} ]; do ARG=${INFO[$IND]} case "$ARG" in + -f|--force ) FORCE=1 ;; -h|--help ) USAGE=1 ;; * ) USAGE=1 ; echo "unknown option: $ARG" ;; esac @@ -25,6 +26,6 @@ done [[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } -[[ $CURR == $TARG && $REPO != "MarlinDocumentation" ]] && { echo "Don't alter the PR Target branch."; exit 1 ; } +[[ $FORCE != 1 && $CURR == $TARG && $REPO != "MarlinDocumentation" ]] && { echo "Don't alter the PR Target branch."; exit 1 ; } git add . && git commit --amend && git push -f From 6b7a92035cf1a044daae727bb701018ae7fd22b1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 23:54:23 -0500 Subject: [PATCH 1188/1370] Misc LCD cleanup --- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 35 +- .../extui/lib/mks_ui/draw_level_settings.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 392 ++++-------------- ...ngs.cpp => draw_tramming_pos_settings.cpp} | 36 +- ...ettings.h => draw_tramming_pos_settings.h} | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 24 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 4 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 2 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 8 +- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 7 +- 15 files changed, 151 insertions(+), 375 deletions(-) rename Marlin/src/lcd/extui/lib/mks_ui/{draw_manual_level_pos_settings.cpp => draw_tramming_pos_settings.cpp} (80%) rename Marlin/src/lcd/extui/lib/mks_ui/{draw_manual_level_pos_settings.h => draw_tramming_pos_settings.h} (91%) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 7334ba5f26..a3b14d8609 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -574,6 +574,12 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop #if EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + // + // Draw knob rotation => Z motion key for: + // - menu.cpp:lcd_babystep_zoffset + // - menu_ubl.cpp:_lcd_mesh_fine_tune + // + const unsigned char cw_bmp[] PROGMEM = { B00000000,B11111110,B00000000, B00000011,B11111111,B10000000, @@ -672,28 +678,23 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop old_zvalue = zvalue; } - #if ENABLED(OVERLAY_GFX_REVERSE) - const unsigned char *rot_up = ccw_bmp, *rot_down = cw_bmp; - #else - const unsigned char *rot_up = cw_bmp, *rot_down = ccw_bmp; - #endif + const unsigned char *rot_up = TERN(OVERLAY_GFX_REVERSE, ccw_bmp, cw_bmp), + *rot_down = TERN(OVERLAY_GFX_REVERSE, cw_bmp, ccw_bmp); - #if ENABLED(USE_BIG_EDIT_FONT) - const int left = 0, right = 45, nozzle = 95; - #else - const int left = 5, right = 90, nozzle = 60; - #endif + const int left = TERN(USE_BIG_EDIT_FONT, 0, 5), + right = TERN(USE_BIG_EDIT_FONT, 45, 90), + nozzle = TERN(USE_BIG_EDIT_FONT, 95, 60); - // Draw a representation of the nozzle - if (PAGE_CONTAINS(3, 16)) u8g.drawBitmapP(nozzle + 6, 4 - dir, 2, 12, nozzle_bmp); - if (PAGE_CONTAINS(20, 20)) u8g.drawBitmapP(nozzle + 0, 20, 3, 1, offset_bedline_bmp); + // Draw nozzle lowered or raised according to direction moved + if (PAGE_CONTAINS( 3, 16)) u8g.drawBitmapP(nozzle + 6, 4 - dir, 2, 12, nozzle_bmp); + if (PAGE_CONTAINS(20, 20)) u8g.drawBitmapP(nozzle + 0, 20 , 3, 1, offset_bedline_bmp); // Draw cw/ccw indicator and up/down arrows. if (PAGE_CONTAINS(47, 62)) { - u8g.drawBitmapP(right + 0, 48 - dir, 2, 13, up_arrow_bmp); - u8g.drawBitmapP(left + 0, 49 - dir, 2, 13, down_arrow_bmp); - u8g.drawBitmapP(left + 13, 47, 3, 16, rot_down); - u8g.drawBitmapP(right + 13, 47, 3, 16, rot_up); + u8g.drawBitmapP(right + 0, 48 - dir, 2, 13, up_arrow_bmp); + u8g.drawBitmapP(left + 0, 49 - dir, 2, 13, down_arrow_bmp); + u8g.drawBitmapP(left + 13, 47 , 3, 16, rot_down); + u8g.drawBitmapP(right + 13, 47 , 3, 16, rot_up); } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index b5c1890309..015c95a68f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -46,7 +46,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { draw_return_ui(); break; case ID_LEVEL_POSITION: - lv_draw_manual_level_pos_settings(); + lv_draw_tramming_pos_settings(); break; case ID_LEVEL_COMMAND: keyboard_value = autoLevelGcodeCommand; @@ -62,7 +62,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_level_settings() { scr = lv_screen_create(LEVELING_PARA_UI, machine_menu.LevelingParaConfTitle); - lv_screen_menu_item(scr, machine_menu.LevelingManuPosConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_LEVEL_POSITION, 0); + lv_screen_menu_item(scr, machine_menu.TrammingPosConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_LEVEL_POSITION, 0); lv_screen_menu_item(scr, machine_menu.LevelingAutoCommandConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_LEVEL_COMMAND, 1); #if HAS_BED_PROBE lv_screen_menu_item(scr, machine_menu.LevelingAutoZoffsetConf, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_LEVEL_ZOFFSET, 2); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 039591b03e..9734dd94ae 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { queue.inject_P(G28_STR); } const int ind = obj->mks_obj_id - ID_M_POINT1; - sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), (int)gCfgItems.levelingPos[ind][0], (int)gCfgItems.levelingPos[ind][1]); + sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), (int)gCfgItems.trammingPos[ind][X_AXIS], (int)gCfgItems.trammingPos[ind][Y_AXIS]); queue.inject(public_buf_l); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 91a1fce28d..092dcce083 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -204,44 +204,44 @@ static void disp_key_value() { sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1)); break; case level_pos_x1: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[0][X_AXIS]); break; case level_pos_y1: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[0][Y_AXIS]); break; case level_pos_x2: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[1][X_AXIS]); break; case level_pos_y2: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[1][Y_AXIS]); break; case level_pos_x3: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[2][X_AXIS]); break; case level_pos_y3: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[2][Y_AXIS]); break; case level_pos_x4: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[3][X_AXIS]); break; case level_pos_y4: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[3][Y_AXIS]); break; case level_pos_x5: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[4][X_AXIS]); break; case level_pos_y5: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[4][Y_AXIS]); break; #if HAS_BED_PROBE case x_offset: #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.x, 1, 3, str_1)); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.x, 1, 3, str_1)); #endif break; case y_offset: #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.y, 1, 3, str_1)); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.y, 1, 3, str_1)); #endif break; case z_offset: @@ -295,194 +295,87 @@ static void disp_key_value() { } static void set_value_confirm() { - #if HAS_TRINAMIC_CONFIG - uint16_t current_mA; - #endif switch (value) { - case PrintAcceleration: - planner.settings.acceleration = atof(key_value); - break; - case RetractAcceleration: - planner.settings.retract_acceleration = atof(key_value); - break; - case TravelAcceleration: - planner.settings.travel_acceleration = atof(key_value); - break; - case XAcceleration: - planner.settings.max_acceleration_mm_per_s2[X_AXIS] = atof(key_value); - break; - case YAcceleration: - planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = atof(key_value); - break; - case ZAcceleration: - planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = atof(key_value); - break; - case E0Acceleration: - planner.settings.max_acceleration_mm_per_s2[E_AXIS] = atof(key_value); - break; - case E1Acceleration: - planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)] = atof(key_value); - break; - case XMaxFeedRate: - planner.settings.max_feedrate_mm_s[X_AXIS] = atof(key_value); - break; - case YMaxFeedRate: - planner.settings.max_feedrate_mm_s[Y_AXIS] = atof(key_value); - break; - case ZMaxFeedRate: - planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value); - break; - case E0MaxFeedRate: - planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value); - break; - case E1MaxFeedRate: - planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); - break; - case XJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[X_AXIS] = atof(key_value); - #endif - break; - case YJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[Y_AXIS] = atof(key_value); - #endif - break; - case ZJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[Z_AXIS] = atof(key_value); - #endif - break; - case EJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[E_AXIS] = atof(key_value); - #endif - break; - case Xstep: - planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case Ystep: - planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case Zstep: - planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case E0step: - planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case E1step: - planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); - planner.refresh_positioning(); - break; + case PrintAcceleration: planner.settings.acceleration = atof(key_value); break; + case RetractAcceleration: planner.settings.retract_acceleration = atof(key_value); break; + case TravelAcceleration: planner.settings.travel_acceleration = atof(key_value); break; + case XAcceleration: planner.settings.max_acceleration_mm_per_s2[X_AXIS] = atof(key_value); break; + case YAcceleration: planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = atof(key_value); break; + case ZAcceleration: planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = atof(key_value); break; + case E0Acceleration: planner.settings.max_acceleration_mm_per_s2[E_AXIS] = atof(key_value); break; + case E1Acceleration: planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)] = atof(key_value); break; + case XMaxFeedRate: planner.settings.max_feedrate_mm_s[X_AXIS] = atof(key_value); break; + case YMaxFeedRate: planner.settings.max_feedrate_mm_s[Y_AXIS] = atof(key_value); break; + case ZMaxFeedRate: planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value); break; + case E0MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value); break; + case E1MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); break; + case XJerk: TERN_(HAS_CLASSIC_JERK, planner.max_jerk[X_AXIS] = atof(key_value)); break; + case YJerk: TERN_(HAS_CLASSIC_JERK, planner.max_jerk[Y_AXIS] = atof(key_value)); break; + case ZJerk: TERN_(HAS_CLASSIC_JERK, planner.max_jerk[Z_AXIS] = atof(key_value)); break; + case EJerk: TERN_(HAS_CLASSIC_JERK, planner.max_jerk[E_AXIS] = atof(key_value)); break; + case Xstep: planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value); planner.refresh_positioning(); break; + case Ystep: planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value); planner.refresh_positioning(); break; + case Zstep: planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value); planner.refresh_positioning(); break; + case E0step: planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value); planner.refresh_positioning(); break; + case E1step: planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); planner.refresh_positioning(); break; case Xcurrent: #if AXIS_IS_TMC(X) - current_mA = atoi(key_value); - stepperX.rms_current(current_mA); + stepperX.rms_current(atoi(key_value)); #endif break; case Ycurrent: #if AXIS_IS_TMC(Y) - current_mA = atoi(key_value); - stepperY.rms_current(current_mA); + stepperY.rms_current(atoi(key_value)); #endif break; case Zcurrent: #if AXIS_IS_TMC(Z) - current_mA = atoi(key_value); - stepperZ.rms_current(current_mA); + stepperZ.rms_current(atoi(key_value)); #endif break; case E0current: #if AXIS_IS_TMC(E0) - current_mA = atoi(key_value); - stepperE0.rms_current(current_mA); + stepperE0.rms_current(atoi(key_value)); #endif break; case E1current: #if AXIS_IS_TMC(E1) - current_mA = atoi(key_value); - stepperE1.rms_current(current_mA); + stepperE1.rms_current(atoi(key_value)); #endif break; - case pause_pos_x: - gCfgItems.pausePosX = atof(key_value); - update_spi_flash(); - break; - case pause_pos_y: - gCfgItems.pausePosY = atof(key_value); - update_spi_flash(); - break; - case pause_pos_z: - gCfgItems.pausePosZ = atof(key_value); - update_spi_flash(); - break; - case level_pos_x1: - gCfgItems.levelingPos[0][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y1: - gCfgItems.levelingPos[0][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x2: - gCfgItems.levelingPos[1][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y2: - gCfgItems.levelingPos[1][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x3: - gCfgItems.levelingPos[2][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y3: - gCfgItems.levelingPos[2][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x4: - gCfgItems.levelingPos[3][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y4: - gCfgItems.levelingPos[3][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x5: - gCfgItems.levelingPos[4][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y5: - gCfgItems.levelingPos[4][1] = atoi(key_value); - update_spi_flash(); - break; + case pause_pos_x: gCfgItems.pausePosX = atof(key_value); update_spi_flash(); break; + case pause_pos_y: gCfgItems.pausePosY = atof(key_value); update_spi_flash(); break; + case pause_pos_z: gCfgItems.pausePosZ = atof(key_value); update_spi_flash(); break; + case level_pos_x1: gCfgItems.trammingPos[0][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y1: gCfgItems.trammingPos[0][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x2: gCfgItems.trammingPos[1][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y2: gCfgItems.trammingPos[1][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x3: gCfgItems.trammingPos[2][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y3: gCfgItems.trammingPos[2][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x4: gCfgItems.trammingPos[3][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y4: gCfgItems.trammingPos[3][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x5: gCfgItems.trammingPos[4][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y5: gCfgItems.trammingPos[4][Y_AXIS] = atoi(key_value); update_spi_flash(); break; #if HAS_BED_PROBE - case x_offset: + case x_offset: { #if HAS_PROBE_XY_OFFSET - float x; - x = atof(key_value); + const float x = atof(key_value); if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) probe.offset.x = x; #endif - break; - case y_offset: + } break; + case y_offset: { #if HAS_PROBE_XY_OFFSET - float y; - y = atof(key_value); + const float y = atof(key_value); if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) probe.offset.y = y; #endif - break; - case z_offset: - float z; - z = atof(key_value); + } break; + case z_offset: { + const float z = atof(key_value); if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) probe.offset.z = z; - break; + } break; #endif case load_length: gCfgItems.filamentchange_load_length = atoi(key_value); @@ -508,26 +401,10 @@ static void set_value_confirm() { gCfgItems.filament_limit_temp = atoi(key_value); update_spi_flash(); break; - case x_sensitivity: - #if X_SENSORLESS - stepperX.homing_threshold(atoi(key_value)); - #endif - break; - case y_sensitivity: - #if Y_SENSORLESS - stepperY.homing_threshold(atoi(key_value)); - #endif - break; - case z_sensitivity: - #if Z_SENSORLESS - stepperZ.homing_threshold(atoi(key_value)); - #endif - break; - case z2_sensitivity: - #if Z2_SENSORLESS - stepperZ2.homing_threshold(atoi(key_value)); - #endif - break; + case x_sensitivity: TERN_(X_SENSORLESS, stepperX.homing_threshold(atoi(key_value))); break; + case y_sensitivity: TERN_(Y_SENSORLESS, stepperY.homing_threshold(atoi(key_value))); break; + case z_sensitivity: TERN_(Z_SENSORLESS, stepperZ.homing_threshold(atoi(key_value))); break; + case z2_sensitivity: TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(atoi(key_value))); break; } gcode.process_subcommands_now_P(PSTR("M500")); } @@ -535,81 +412,9 @@ static void set_value_confirm() { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { - case ID_NUM_KEY1: + case ID_NUM_KEY1 ... ID_NUM_KEY0: if (cnt <= 10) { - key_value[cnt] = (char)'1'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY2: - if (cnt <= 10) { - key_value[cnt] = (char)'2'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY3: - if (cnt <= 10) { - key_value[cnt] = (char)'3'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY4: - if (cnt <= 10) { - key_value[cnt] = (char)'4'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY5: - if (cnt <= 10) { - key_value[cnt] = (char)'5'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY6: - if (cnt <= 10) { - key_value[cnt] = (char)'6'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY7: - if (cnt <= 10) { - key_value[cnt] = (char)'7'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY8: - if (cnt <= 10) { - key_value[cnt] = (char)'8'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY9: - if (cnt <= 10) { - key_value[cnt] = (char)'9'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY0: - if (cnt <= 10) { - key_value[cnt] = (char)'0'; + key_value[cnt] = (obj->mks_obj_id == ID_NUM_KEY0) ? (char)'0' : char('1' + obj->mks_obj_id - ID_NUM_KEY1); lv_label_set_text(labelValue, key_value); lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); cnt++; @@ -662,55 +467,22 @@ void lv_draw_number_key() { buttonValue = lv_btn_create(scr, 92, 40, 296, 40, event_handler, ID_NUM_KEY1, &style_num_text); labelValue = lv_label_create_empty(buttonValue); - lv_obj_t *NumberKey_1 = lv_btn_create(scr, 92, 90, 68, 40, event_handler, ID_NUM_KEY1, &style_num_key_pre); - lv_obj_t *labelKey_1 = lv_label_create_empty(NumberKey_1); - lv_label_set_text(labelKey_1, machine_menu.key_1); - lv_obj_align(labelKey_1, NumberKey_1, LV_ALIGN_CENTER, 0, 0); + #define DRAW_NUMBER_KEY(N,X,Y) \ + lv_obj_t *NumberKey_##N = lv_btn_create(scr, X, Y, 68, 40, event_handler, ID_NUM_KEY##N, &style_num_key_pre); \ + lv_obj_t *labelKey_##N = lv_label_create_empty(NumberKey_##N); \ + lv_label_set_text(labelKey_##N, machine_menu.key_##N); \ + lv_obj_align(labelKey_##N, NumberKey_##N, LV_ALIGN_CENTER, 0, 0) - lv_obj_t *NumberKey_2 = lv_btn_create(scr, 168, 90, 68, 40, event_handler, ID_NUM_KEY2, &style_num_key_pre); - lv_obj_t *labelKey_2 = lv_label_create_empty(NumberKey_2); - lv_label_set_text(labelKey_2, machine_menu.key_2); - lv_obj_align(labelKey_2, NumberKey_2, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_3 = lv_btn_create(scr, 244, 90, 68, 40, event_handler, ID_NUM_KEY3, &style_num_key_pre); - lv_obj_t *labelKey_3 = lv_label_create_empty(NumberKey_3); - lv_label_set_text(labelKey_3, machine_menu.key_3); - lv_obj_align(labelKey_3, NumberKey_3, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_4 = lv_btn_create(scr, 92, 140, 68, 40, event_handler, ID_NUM_KEY4, &style_num_key_pre); - lv_obj_t *labelKey_4 = lv_label_create_empty(NumberKey_4); - lv_label_set_text(labelKey_4, machine_menu.key_4); - lv_obj_align(labelKey_4, NumberKey_4, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_5 = lv_btn_create(scr, 168, 140, 68, 40, event_handler, ID_NUM_KEY5, &style_num_key_pre); - lv_obj_t *labelKey_5 = lv_label_create_empty(NumberKey_5); - lv_label_set_text(labelKey_5, machine_menu.key_5); - lv_obj_align(labelKey_5, NumberKey_5, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_6 = lv_btn_create(scr, 244, 140, 68, 40, event_handler, ID_NUM_KEY6, &style_num_key_pre); - lv_obj_t *labelKey_6 = lv_label_create_empty(NumberKey_6); - lv_label_set_text(labelKey_6, machine_menu.key_6); - lv_obj_align(labelKey_6, NumberKey_6, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_7 = lv_btn_create(scr, 92, 190, 68, 40, event_handler, ID_NUM_KEY7, &style_num_key_pre); - lv_obj_t *labelKey_7 = lv_label_create_empty(NumberKey_7); - lv_label_set_text(labelKey_7, machine_menu.key_7); - lv_obj_align(labelKey_7, NumberKey_7, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_8 = lv_btn_create(scr, 168, 190, 68, 40, event_handler, ID_NUM_KEY8, &style_num_key_pre); - lv_obj_t *labelKey_8 = lv_label_create_empty(NumberKey_8); - lv_label_set_text(labelKey_8, machine_menu.key_8); - lv_obj_align(labelKey_8, NumberKey_8, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_9 = lv_btn_create(scr, 244, 190, 68, 40, event_handler, ID_NUM_KEY9, &style_num_key_pre); - lv_obj_t *labelKey_9 = lv_label_create_empty(NumberKey_9); - lv_label_set_text(labelKey_9, machine_menu.key_9); - lv_obj_align(labelKey_9, NumberKey_9, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_0 = lv_btn_create(scr, 92, 240, 68, 40, event_handler, ID_NUM_KEY0, &style_num_key_pre); - lv_obj_t *labelKey_0 = lv_label_create_empty(NumberKey_0); - lv_label_set_text(labelKey_0, machine_menu.key_0); - lv_obj_align(labelKey_0, NumberKey_0, LV_ALIGN_CENTER, 0, 0); + DRAW_NUMBER_KEY(1, 92, 90); + DRAW_NUMBER_KEY(2, 168, 90); + DRAW_NUMBER_KEY(3, 244, 90); + DRAW_NUMBER_KEY(4, 92, 140); + DRAW_NUMBER_KEY(5, 168, 140); + DRAW_NUMBER_KEY(6, 244, 140); + DRAW_NUMBER_KEY(7, 92, 190); + DRAW_NUMBER_KEY(8, 168, 190); + DRAW_NUMBER_KEY(9, 244, 190); + DRAW_NUMBER_KEY(0, 92, 240); lv_obj_t *KeyBack = lv_btn_create(scr, 320, 90, 68, 40, event_handler, ID_NUM_BACK, &style_num_key_pre); lv_obj_t *labelKeyBack = lv_label_create_empty(KeyBack); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp similarity index 80% rename from Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp rename to Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp index 6cbd703f9c..d5307232d6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp @@ -53,7 +53,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_MANUAL_POS_RETURN: uiCfg.para_ui_page = false; - lv_clear_manual_level_pos_settings(); + lv_clear_tramming_pos_settings(); draw_return_ui(); return; case ID_MANUAL_POS_X1: @@ -88,46 +88,46 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_MANUAL_POS_UP: uiCfg.para_ui_page = false; - lv_clear_manual_level_pos_settings(); - lv_draw_manual_level_pos_settings(); + lv_clear_tramming_pos_settings(); + lv_draw_tramming_pos_settings(); return; case ID_MANUAL_POS_DOWN: uiCfg.para_ui_page = true; - lv_clear_manual_level_pos_settings(); - lv_draw_manual_level_pos_settings(); + lv_clear_tramming_pos_settings(); + lv_draw_tramming_pos_settings(); return; } - lv_clear_manual_level_pos_settings(); + lv_clear_tramming_pos_settings(); lv_draw_number_key(); } -void lv_draw_manual_level_pos_settings() { +void lv_draw_tramming_pos_settings() { char buf2[50]; scr = lv_screen_create(MANUAL_LEVELING_POSIGION_UI, machine_menu.LevelingParaConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[0][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[0][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[0][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position1, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y1, 0, buf2, ID_MANUAL_POS_X1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[1][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[1][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[1][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position2, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MANUAL_POS_Y2, 1, buf2, ID_MANUAL_POS_X2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[2][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[2][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[2][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position3, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_MANUAL_POS_Y3, 2, buf2, ID_MANUAL_POS_X3, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[3][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[3][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[3][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_MANUAL_POS_Y4, 3, buf2, ID_MANUAL_POS_X4, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[4][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[4][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[4][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y5, 0, buf2, ID_MANUAL_POS_X5, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_UP, true); @@ -136,7 +136,7 @@ void lv_draw_manual_level_pos_settings() { lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_MANUAL_POS_RETURN, true); } -void lv_clear_manual_level_pos_settings() { +void lv_clear_tramming_pos_settings() { #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h similarity index 91% rename from Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h rename to Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h index 83fd225bd3..3ebb8ae731 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_manual_level_pos_settings(); -extern void lv_clear_manual_level_pos_settings(); +extern void lv_draw_tramming_pos_settings(); +extern void lv_clear_tramming_pos_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 12e060aa01..0c574b1e15 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -125,16 +125,16 @@ void gCfgItems_init() { gCfgItems.pausePosX = -1; gCfgItems.pausePosY = -1; gCfgItems.pausePosZ = 5; - gCfgItems.levelingPos[0][0] = X_MIN_POS + 30; - gCfgItems.levelingPos[0][1] = Y_MIN_POS + 30; - gCfgItems.levelingPos[1][0] = X_MAX_POS - 30; - gCfgItems.levelingPos[1][1] = Y_MIN_POS + 30; - gCfgItems.levelingPos[2][0] = X_MAX_POS - 30; - gCfgItems.levelingPos[2][1] = Y_MAX_POS - 30; - gCfgItems.levelingPos[3][0] = X_MIN_POS + 30; - gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30; - gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2; - gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2; + gCfgItems.trammingPos[0][X_AXIS] = X_MIN_POS + 30; + gCfgItems.trammingPos[0][Y_AXIS] = Y_MIN_POS + 30; + gCfgItems.trammingPos[1][X_AXIS] = X_MAX_POS - 30; + gCfgItems.trammingPos[1][Y_AXIS] = Y_MIN_POS + 30; + gCfgItems.trammingPos[2][X_AXIS] = X_MAX_POS - 30; + gCfgItems.trammingPos[2][Y_AXIS] = Y_MAX_POS - 30; + gCfgItems.trammingPos[3][X_AXIS] = X_MIN_POS + 30; + gCfgItems.trammingPos[3][Y_AXIS] = Y_MAX_POS - 30; + gCfgItems.trammingPos[4][X_AXIS] = X_BED_SIZE / 2; + gCfgItems.trammingPos[4][Y_AXIS] = Y_BED_SIZE / 2; gCfgItems.cloud_enable = false; gCfgItems.wifi_mode_sel = STA_MODEL; gCfgItems.fileSysType = FILE_SYS_SD; @@ -994,7 +994,7 @@ void clear_cur_ui() { case LEVELING_SETTIGNS_UI: break; case LEVELING_PARA_UI: lv_clear_level_settings(); break; case DELTA_LEVELING_PARA_UI: break; - case MANUAL_LEVELING_POSIGION_UI: lv_clear_manual_level_pos_settings(); break; + case MANUAL_LEVELING_POSIGION_UI: lv_clear_tramming_pos_settings(); break; case MAXFEEDRATE_UI: lv_clear_max_feedrate_settings(); break; case STEPS_UI: lv_clear_step_settings(); break; case ACCELERATION_UI: lv_clear_acceleration_settings(); break; @@ -1099,7 +1099,7 @@ void draw_return_ui() { case LEVELING_SETTIGNS_UI: break; case LEVELING_PARA_UI: lv_draw_level_settings(); break; case DELTA_LEVELING_PARA_UI: break; - case MANUAL_LEVELING_POSIGION_UI: lv_draw_manual_level_pos_settings(); break; + case MANUAL_LEVELING_POSIGION_UI: lv_draw_tramming_pos_settings(); break; case MAXFEEDRATE_UI: lv_draw_max_feedrate_settings(); break; case STEPS_UI: lv_draw_step_settings(); break; case ACCELERATION_UI: lv_draw_acceleration_settings(); break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 3098a6666c..0690e59570 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -69,7 +69,7 @@ #include "draw_max_feedrate_settings.h" #include "draw_tmc_step_mode_settings.h" #include "draw_level_settings.h" -#include "draw_manual_level_pos_settings.h" +#include "draw_tramming_pos_settings.h" #include "draw_auto_level_offset_settings.h" #include "draw_filament_change.h" #include "draw_filament_settings.h" @@ -197,7 +197,7 @@ typedef struct { uint8_t wifi_type; bool cloud_enable, encoder_enable; - int levelingPos[5][2]; + int trammingPos[5][2]; // XY int filamentchange_load_length, filamentchange_load_speed, filamentchange_unload_length, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 12a57bd548..104e1fdcaf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -99,7 +99,7 @@ #define LEVELING_CONF_TITLE_EN "Machine Settings>Leveling settings" #define LEVELING_PARA_CONF_EN "Leveling settings" -#define LEVELING_MANUAL_POS_EN "Manual leveling coordinate settings" +#define TRAMMING_POS_EN "Manual leveling coordinate settings" #define LEVELING_AUTO_COMMAND_EN "AutoLeveling command settings" #define LEVELING_AUTO_ZOFFSET_EN "Nozzle-to-probe offsets settings" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index 50e32ac05c..f6b3231737 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -283,7 +283,7 @@ #define LEVELING_CONF_TITLE_RU "HаÑтройки принтера>HаÑтройки уровнÑ" #define LEVELING_PARA_CONF_RU "наÑтройки уровнÑ" -#define LEVELING_MANUAL_POS_RU "наÑтройки координат Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ" +#define TRAMMING_POS_RU "наÑтройки координат Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ" #define LEVELING_AUTO_COMMAND_RU "наÑтройки комманд увтоуровнÑ" #define LEVELING_AUTO_ZOFFSET_RU "координаты ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñопла" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index f204933e25..b50761fde0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -84,7 +84,7 @@ #define LEVELING_CONF_TITLE_CN "机器å‚æ•°>调平设置" #define LEVELING_PARA_CONF_CN "调平设置" -#define LEVELING_MANUAL_POS_CN "手动调平å标设置" +#define TRAMMING_POS_CN "手动调平å标设置" #define LEVELING_AUTO_COMMAND_CN "自动调平指令设置" #define LEVELING_AUTO_ZOFFSET_CN "挤出头与调平开关å移设置" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 76da2de907..3f58a9afd2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -84,7 +84,7 @@ #define LEVELING_CONF_TITLE_T_CN "機器åƒæ•¸>調平設置" #define LEVELING_PARA_CONF_T_CN "調平設置" -#define LEVELING_MANUAL_POS_T_CN "手動調平å標設置" +#define TRAMMING_POS_T_CN "手動調平å標設置" #define LEVELING_AUTO_COMMAND_T_CN "自動調平指令設置" #define LEVELING_AUTO_ZOFFSET_T_CN "擠出頭與調平開關å移設置" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 5ee184571f..7caae5cd3a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -119,7 +119,7 @@ void machine_setting_disp() { machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_CN; machine_menu.LevelingParaConf = LEVELING_PARA_CONF_CN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_CN; + machine_menu.TrammingPosConf = TRAMMING_POS_CN; machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_CN; machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_CN; @@ -347,7 +347,7 @@ void machine_setting_disp() { machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_T_CN; machine_menu.LevelingParaConf = LEVELING_PARA_CONF_T_CN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_T_CN; + machine_menu.TrammingPosConf = TRAMMING_POS_T_CN; machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_T_CN; machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_T_CN; @@ -576,7 +576,7 @@ void machine_setting_disp() { machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_EN; machine_menu.LevelingParaConf = LEVELING_PARA_CONF_EN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_EN; + machine_menu.TrammingPosConf = TRAMMING_POS_EN; machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_EN; machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_EN; @@ -1708,7 +1708,7 @@ void disp_language_init() { machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_RU; machine_menu.LevelingParaConf = LEVELING_PARA_CONF_RU; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_RU; + machine_menu.TrammingPosConf = TRAMMING_POS_RU; machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_RU; machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_RU; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 731b2eaecd..82d3e18f74 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -103,7 +103,7 @@ typedef struct machine_common_disp{ const char *LevelingParaConfTitle; const char *LevelingParaConf; - const char *LevelingManuPosConf; + const char *TrammingPosConf; const char *LevelingAutoCommandConf; const char *LevelingAutoZoffsetConf; diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 0dae8dbf41..4cfb4e411b 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -296,8 +296,11 @@ static inline void _lcd_level_bed_corners_get_next_position() { } while (good_points < nr_edge_points); // loop until all points within tolerance - TERN_(BLTOUCH_HS_MODE, do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP)); // Do clearance in HIGH SPEED MODE at the very end - TERN_(BLTOUCH_HS_MODE, bltouch.stow()); // Stow in HIGH SPEED MODE at the very end + #if ENABLED(BLTOUCH_HS_MODE) + // In HIGH SPEED MODE do clearance and stow at the very end + do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); + bltouch.stow(); + #endif ui.goto_screen(_lcd_draw_level_prompt); // prompt for bed leveling ui.set_selection(true); From af13128430ccc9f19901d522152dbdff3f2d9c27 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Mar 2021 03:28:48 -0500 Subject: [PATCH 1189/1370] Group UBL parameters, add comments --- Marlin/src/feature/bedlevel/ubl/ubl.h | 35 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 335 ++++++++++---------- Marlin/src/gcode/bedlevel/M420.cpp | 6 +- Marlin/src/lcd/marlinui.h | 10 +- Marlin/src/lcd/menu/menu_ubl.cpp | 46 +-- 5 files changed, 223 insertions(+), 209 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 0c4667eed8..67a9b0a60e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -45,23 +45,26 @@ struct mesh_index_pair; typedef int16_t mesh_store_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; #endif +typedef struct { + bool C_seen; + int8_t V_verbosity, + P_phase, + R_repetition, + KLS_storage_slot, + T_map_type; + float B_shim_thickness, + C_constant; + xy_pos_t XY_pos; + xy_bool_t XY_seen; + #if HAS_BED_PROBE + int grid_size; + #endif +} G29_parameters_t; + class unified_bed_leveling { private: - static int g29_verbose_level, - g29_phase_value, - g29_repetition_cnt, - g29_storage_slot, - g29_map_type; - static bool g29_c_flag; - static float g29_card_thickness, - g29_constant; - static xy_pos_t g29_pos; - static xy_bool_t xy_seen; - - #if HAS_BED_PROBE - static int g29_grid_size; - #endif + static G29_parameters_t param; #if IS_NEWPANEL static void move_z_with_encoder(const float &multiplier); @@ -71,7 +74,7 @@ private: static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; #endif - static bool g29_parameter_parsing() _O0; + static bool G29_parse_parameters() _O0; static void shift_mesh_height(); static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); @@ -129,7 +132,7 @@ public: static inline void steppers_were_disabled() {} #endif - static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time + static volatile int16_t encoder_diff; // Volatile because buttons may change it at interrupt time unified_bed_leveling(); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index bcda183366..42a3018561 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -71,21 +71,6 @@ #define SIZE_OF_LITTLE_RAISE 1 #define BIG_RAISE_NOT_NEEDED 0 -int unified_bed_leveling::g29_verbose_level, - unified_bed_leveling::g29_phase_value, - unified_bed_leveling::g29_repetition_cnt, - unified_bed_leveling::g29_storage_slot = 0, - unified_bed_leveling::g29_map_type; -bool unified_bed_leveling::g29_c_flag; -float unified_bed_leveling::g29_card_thickness = 0, - unified_bed_leveling::g29_constant = 0; -xy_bool_t unified_bed_leveling::xy_seen; -xy_pos_t unified_bed_leveling::g29_pos; - -#if HAS_BED_PROBE - int unified_bed_leveling::g29_grid_size; -#endif - /** * G29: Unified Bed Leveling by Roxy * @@ -309,10 +294,12 @@ xy_pos_t unified_bed_leveling::g29_pos; * features of all three systems combined. */ +G29_parameters_t unified_bed_leveling::param; + void unified_bed_leveling::G29() { bool probe_deployed = false; - if (g29_parameter_parsing()) return; // Abort on parameter error + if (G29_parse_parameters()) return; // Abort on parameter error const int8_t p_val = parser.intval('P', -1); const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); @@ -326,33 +313,29 @@ void unified_bed_leveling::G29() { TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); } - // Invalidate Mesh Points. This command is a little bit asymmetrical because - // it directly specifies the repetition count and does not use the 'R' parameter. + // Invalidate one or more nearby mesh points, possibly all. if (parser.seen('I')) { - uint8_t cnt = 0; - g29_repetition_cnt = parser.has_value() ? parser.value_int() : 1; - if (g29_repetition_cnt >= GRID_MAX_POINTS) { - set_all_mesh_points_to_value(NAN); - } - else { - while (g29_repetition_cnt--) { - if (cnt > 20) { cnt = 0; idle(); } - const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); - const xy_int8_t &cpos = closest.pos; - if (cpos.x < 0) { - // No more REAL mesh points to invalidate, so we ASSUME the user - // meant to invalidate the ENTIRE mesh, which cannot be done with - // find_closest_mesh_point loop which only returns REAL points. - set_all_mesh_points_to_value(NAN); - SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); - break; // No more invalid Mesh Points to populate - } - z_values[cpos.x][cpos.y] = NAN; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, 0.0f)); - cnt++; + int16_t count = parser.has_value() ? parser.value_int() : 1; + bool invalidate_all = count >= GRID_MAX_POINTS; + if (!invalidate_all) { + while (count--) { + if ((count & 0x0F) == 0x0F) idle(); + const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, param.XY_pos); + // No more REAL mesh points to invalidate? Assume the user meant + // to invalidate the ENTIRE mesh, which can't be done with + // find_closest_mesh_point (which only returns REAL points). + if (closest.pos.x < 0) { invalidate_all = true; break; } + z_values[closest.pos.x][closest.pos.y] = NAN; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(closest.pos, 0.0f)); } } - SERIAL_ECHOLNPGM("Locations invalidated.\n"); + if (invalidate_all) { + invalidate(); + SERIAL_ECHOPGM("Entire Mesh"); + } + else + SERIAL_ECHOPGM("Locations"); + SERIAL_ECHOLNPGM(" invalidated.\n"); } if (parser.seen('Q')) { @@ -364,11 +347,7 @@ void unified_bed_leveling::G29() { SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); switch (test_pattern) { - #if ENABLED(UBL_DEVEL_DEBUGGING) - case -1: - g29_eeprom_dump(); - break; - #endif + case -1: TERN_(UBL_DEVEL_DEBUGGING, g29_eeprom_dump()); break; case 0: GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta @@ -395,7 +374,7 @@ void unified_bed_leveling::G29() { // Allow the user to specify the height because 10mm is a little extreme in some cases. for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) { // the center of the bed - z_values[x][y] += parser.seen('C') ? g29_constant : 9.99f; + z_values[x][y] += parser.seen('C') ? param.C_constant : 9.99f; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } break; @@ -406,7 +385,7 @@ void unified_bed_leveling::G29() { if (parser.seen('J')) { save_ubl_active_state_and_disable(); - tilt_mesh_based_on_probed_grid(g29_grid_size == 0); // Zero size does 3-Point + tilt_mesh_based_on_probed_grid(param.grid_size == 0); // Zero size does 3-Point restore_ubl_active_state_and_leave(); #if ENABLED(UBL_G29_J_RECENTER) do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); @@ -418,12 +397,12 @@ void unified_bed_leveling::G29() { #endif // HAS_BED_PROBE if (parser.seen('P')) { - if (WITHIN(g29_phase_value, 0, 1) && storage_slot == -1) { + if (WITHIN(param.P_phase, 0, 1) && storage_slot == -1) { storage_slot = 0; SERIAL_ECHOLNPGM("Default storage slot 0 selected."); } - switch (g29_phase_value) { + switch (param.P_phase) { case 0: // // Zero Mesh Data @@ -442,13 +421,13 @@ void unified_bed_leveling::G29() { invalidate(); SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); } - if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR("Probing around (", g29_pos.x); + if (param.V_verbosity > 1) { + SERIAL_ECHOPAIR("Probing around (", param.XY_pos.x); SERIAL_CHAR(','); - SERIAL_DECIMAL(g29_pos.y); + SERIAL_DECIMAL(param.XY_pos.y); SERIAL_ECHOLNPGM(").\n"); } - const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; + const xy_pos_t near_probe_xy = param.XY_pos + probe.offset_xy; probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); report_current_position(); @@ -465,7 +444,7 @@ void unified_bed_leveling::G29() { SERIAL_ECHOLNPGM("Manually probing unreachable points."); do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - if (parser.seen('C') && !xy_seen) { + if (parser.seen('C') && !param.XY_seen) { /** * Use a good default location for the path. @@ -474,7 +453,7 @@ void unified_bed_leveling::G29() { * It may make sense to have Delta printers default to the center of the bed. * Until that is decided, this can be forced with the X and Y parameters. */ - g29_pos.set( + param.XY_pos.set( #if IS_KINEMATIC X_HOME_POS, Y_HOME_POS #else @@ -485,21 +464,21 @@ void unified_bed_leveling::G29() { } if (parser.seen('B')) { - g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); - if (ABS(g29_card_thickness) > 1.5f) { + param.B_shim_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); + if (ABS(param.B_shim_thickness) > 1.5f) { SERIAL_ECHOLNPGM("?Error in Business Card measurement."); return; } probe_deployed = true; } - if (!position_is_reachable(g29_pos)) { + if (!position_is_reachable(param.XY_pos)) { SERIAL_ECHOLNPGM("XY outside printable radius."); return; } const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); - manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); + manually_probe_remaining_mesh(param.XY_pos, height, param.B_shim_thickness, parser.seen('T')); SERIAL_ECHOLNPGM("G29 P2 finished."); @@ -521,23 +500,23 @@ void unified_bed_leveling::G29() { * - Allow 'G29 P3' to choose a 'reasonable' constant. */ - if (g29_c_flag) { - if (g29_repetition_cnt >= GRID_MAX_POINTS) { - set_all_mesh_points_to_value(g29_constant); + if (param.C_seen) { + if (param.R_repetition >= GRID_MAX_POINTS) { + set_all_mesh_points_to_value(param.C_constant); } else { - while (g29_repetition_cnt--) { // this only populates reachable mesh points near - const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); + while (param.R_repetition--) { // this only populates reachable mesh points near + const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, param.XY_pos); const xy_int8_t &cpos = closest.pos; if (cpos.x < 0) { // No more REAL INVALID mesh points to populate, so we ASSUME // user meant to populate ALL INVALID mesh points to value - GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; + GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = param.C_constant; break; // No more invalid Mesh Points to populate } else { - z_values[cpos.x][cpos.y] = g29_constant; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, g29_constant)); + z_values[cpos.x][cpos.y] = param.C_constant; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, param.C_constant)); } } } @@ -571,14 +550,14 @@ void unified_bed_leveling::G29() { case 4: // Fine Tune (i.e., Edit) the Mesh #if HAS_LCD_MENU - fine_tune_mesh(g29_pos, parser.seen('T')); + fine_tune_mesh(param.XY_pos, parser.seen('T')); #else SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); return; #endif break; - case 5: adjust_mesh_to_mean(g29_c_flag, g29_constant); break; + case 5: adjust_mesh_to_mean(param.C_seen, param.C_constant); break; case 6: shift_mesh_height(); break; } @@ -608,7 +587,7 @@ void unified_bed_leveling::G29() { // if (parser.seen('L')) { // Load Current Mesh Data - g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + param.KLS_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; int16_t a = settings.calc_num_meshes(); @@ -617,13 +596,13 @@ void unified_bed_leveling::G29() { return; } - if (!WITHIN(g29_storage_slot, 0, a - 1)) { + if (!WITHIN(param.KLS_storage_slot, 0, a - 1)) { SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); return; } - settings.load_mesh(g29_storage_slot); - storage_slot = g29_storage_slot; + settings.load_mesh(param.KLS_storage_slot); + storage_slot = param.KLS_storage_slot; SERIAL_ECHOLNPGM("Done."); } @@ -633,9 +612,9 @@ void unified_bed_leveling::G29() { // if (parser.seen('S')) { // Store (or Save) Current Mesh Data - g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + param.KLS_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; - if (g29_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the + if (param.KLS_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the return report_current_mesh(); // host program to be saved on the user's computer int16_t a = settings.calc_num_meshes(); @@ -645,19 +624,19 @@ void unified_bed_leveling::G29() { goto LEAVE; } - if (!WITHIN(g29_storage_slot, 0, a - 1)) { + if (!WITHIN(param.KLS_storage_slot, 0, a - 1)) { SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); goto LEAVE; } - settings.store_mesh(g29_storage_slot); - storage_slot = g29_storage_slot; + settings.store_mesh(param.KLS_storage_slot); + storage_slot = param.KLS_storage_slot; SERIAL_ECHOLNPGM("Done."); } if (parser.seen('T')) - display_map(g29_map_type); + display_map(param.T_map_type); LEAVE: @@ -682,7 +661,12 @@ void unified_bed_leveling::G29() { return; } -void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { +/** + * M420 C + * G29 P5 C : Adjust Mesh To Mean (and subtract the given offset). + * Find the mean average and shift the mesh to center on that value. + */ +void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float offset) { float sum = 0; int n = 0; GRID_LOOP(x, y) @@ -710,23 +694,27 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float val if (cflag) GRID_LOOP(x, y) if (!isnan(z_values[x][y])) { - z_values[x][y] -= mean + value; + z_values[x][y] -= mean + offset; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } } +/** + * G29 P6 C : Shift Mesh Height by a uniform constant. + */ void unified_bed_leveling::shift_mesh_height() { GRID_LOOP(x, y) if (!isnan(z_values[x][y])) { - z_values[x][y] += g29_constant; + z_values[x][y] += param.C_constant; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } } #if HAS_BED_PROBE /** - * Probe all invalidated locations of the mesh that can be reached by the probe. - * This attempts to fill in locations closest to the nozzle's start location first. + * G29 P1 T V : Probe Entire Mesh + * Probe all invalidated locations of the mesh that can be reached by the probe. + * This attempts to fill in locations closest to the nozzle's start location first. */ void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &nearby, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW @@ -739,7 +727,7 @@ void unified_bed_leveling::shift_mesh_height() { mesh_index_pair best; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); do { - if (do_ubl_mesh_map) display_map(g29_map_type); + if (do_ubl_mesh_map) display_map(param.T_map_type); const int point_num = (GRID_MAX_POINTS) - count + 1; SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); @@ -767,7 +755,7 @@ void unified_bed_leveling::shift_mesh_height() { TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); const float measured_z = probe.probe_at_point( best.meshpos(), - stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level + stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity ); z_values[best.pos.x][best.pos.y] = measured_z; #if ENABLED(EXTENSIBLE_UI) @@ -798,11 +786,20 @@ void unified_bed_leveling::shift_mesh_height() { #endif // HAS_BED_PROBE +void set_message_with_feedback(PGM_P const msg_P) { + #if HAS_LCD_MENU + ui.set_status_P(msg_P); + ui.quick_feedback(); + #else + UNUSED(msg_P); + #endif +} + #if HAS_LCD_MENU typedef void (*clickFunc_t)(); - bool click_and_hold(const clickFunc_t func=nullptr) { + bool _click_and_hold(const clickFunc_t func=nullptr) { if (ui.button_pressed()) { ui.quick_feedback(false); // Preserve button state for click-and-hold const millis_t nxt = millis() + 1500UL; @@ -834,7 +831,8 @@ void unified_bed_leveling::shift_mesh_height() { float unified_bed_leveling::measure_point_with_encoder() { KEEPALIVE_STATE(PAUSED_FOR_USER); - move_z_with_encoder(0.01f); + const float z_step = 0.01f; + move_z_with_encoder(z_step); return current_position.z; } @@ -866,7 +864,7 @@ void unified_bed_leveling::shift_mesh_height() { const float thickness = ABS(z1 - z2); - if (g29_verbose_level > 1) { + if (param.V_verbosity > 1) { SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); SERIAL_ECHOLNPGM("mm thick."); } @@ -876,6 +874,11 @@ void unified_bed_leveling::shift_mesh_height() { return thickness; } + /** + * G29 P2 : Manually Probe Remaining Mesh Points. + * Move to INVALID points and + * NOTE: Blocks the G-code queue and captures Marlin UI during use. + */ void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { ui.capture(); @@ -907,7 +910,7 @@ void unified_bed_leveling::shift_mesh_height() { KEEPALIVE_STATE(PAUSED_FOR_USER); ui.capture(); - if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + if (do_ubl_mesh_map) display_map(param.T_map_type); // Show user where we're probing if (parser.seen('B')) { SERIAL_ECHOPGM_P(GET_TEXT(MSG_UBL_BC_INSERT)); @@ -918,45 +921,38 @@ void unified_bed_leveling::shift_mesh_height() { LCD_MESSAGEPGM(MSG_UBL_BC_INSERT2); } - const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step - //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click - + const float z_step = 0.01f; // 0.01mm per encoder tick, occasionally step move_z_with_encoder(z_step); - if (click_and_hold()) { + if (_click_and_hold([]{ SERIAL_ECHOLNPGM("\nMesh only partially populated."); do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); - return restore_ubl_active_state_and_leave(); - } + })) return restore_ubl_active_state_and_leave(); + // Store the Z position minus the shim height z_values[lpos.x][lpos.y] = current_position.z - thick; + + // Tell the external UI to update TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); - if (g29_verbose_level > 2) + if (param.V_verbosity > 2) SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } while (location.valid()); - if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + if (do_ubl_mesh_map) display_map(param.T_map_type); // show user where we're probing restore_ubl_active_state_and_leave(); do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); } - inline void set_message_with_feedback(PGM_P const msg_P) { - ui.set_status_P(msg_P); - ui.quick_feedback(); - } - - void abort_fine_tune() { - ui.return_to_status(); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); - } - + /** + * G29 P4 : Mesh Fine-Tuning. Go to point(s) and adjust values with the LCD. + * NOTE: Blocks the G-code queue and captures Marlin UI during use. + */ void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { - if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified - g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. + if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified + param.R_repetition = 1; // do exactly one mesh location. Otherwise use what the parser decided. #if ENABLED(UBL_MESH_EDIT_MOVES_Z) const float h_offset = parser.seenval('H') ? parser.value_linear_units() : MANUAL_PROBE_START_Z; @@ -984,7 +980,7 @@ void unified_bed_leveling::shift_mesh_height() { const xy_int8_t &lpos = location.pos; #if IS_TFTGLCD_PANEL - lcd_mesh_edit_setup(0); // Change current screen before calling ui.ubl_plot + ui.ubl_mesh_edit_start(0); // Change current screen before calling ui.ubl_plot safe_delay(50); #endif @@ -1009,7 +1005,7 @@ void unified_bed_leveling::shift_mesh_height() { KEEPALIVE_STATE(PAUSED_FOR_USER); - if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point + if (do_ubl_mesh_map) display_map(param.T_map_type); // Display the current point #if IS_TFTGLCD_PANEL ui.ubl_plot(lpos.x, lpos.y); // update plot screen @@ -1021,13 +1017,13 @@ void unified_bed_leveling::shift_mesh_height() { if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place - lcd_mesh_edit_setup(new_z); + ui.ubl_mesh_edit_start(new_z); SET_SOFT_ENDSTOP_LOOSE(true); do { idle(); - new_z = lcd_mesh_edit(); + new_z = ui.ubl_mesh_value(); TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } while (!ui.button_pressed()); @@ -1036,17 +1032,27 @@ void unified_bed_leveling::shift_mesh_height() { if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status - if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing + // Button held down? Abort editing + if (_click_and_hold([]{ + ui.return_to_status(); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); + })) break; + + // TODO: Disable leveling here so the Z value becomes the 'native' Z value. z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value + + // TODO: Re-enable leveling here so Z is correctly based on the updated mesh. + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, new_z)); serial_delay(20); // No switch noise ui.refresh(); - } while (lpos.x >= 0 && --g29_repetition_cnt > 0); + } while (lpos.x >= 0 && --param.R_repetition > 0); - if (do_ubl_mesh_map) display_map(g29_map_type); + if (do_ubl_mesh_map) display_map(param.T_map_type); restore_ubl_active_state_and_leave(); do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); @@ -1062,25 +1068,28 @@ void unified_bed_leveling::shift_mesh_height() { #endif // HAS_LCD_MENU -bool unified_bed_leveling::g29_parameter_parsing() { +/** + * Parse and validate most G29 parameters, store for use by G29 functions. + */ +bool unified_bed_leveling::G29_parse_parameters() { bool err_flag = false; - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29))); + set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29)); - g29_constant = 0; - g29_repetition_cnt = 0; + param.C_constant = 0; + param.R_repetition = 0; if (parser.seen('R')) { - g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; - NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); - if (g29_repetition_cnt < 1) { + param.R_repetition = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; + NOMORE(param.R_repetition, GRID_MAX_POINTS); + if (param.R_repetition < 1) { SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); return UBL_ERR; } } - g29_verbose_level = parser.seen('V') ? parser.value_int() : 0; - if (!WITHIN(g29_verbose_level, 0, 4)) { + param.V_verbosity = parser.seen('V') ? parser.value_int() : 0; + if (!WITHIN(param.V_verbosity, 0, 4)) { SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n"); err_flag = true; } @@ -1095,8 +1104,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { else #endif { - g29_phase_value = pv; - if (!WITHIN(g29_phase_value, 0, 6)) { + param.P_phase = pv; + if (!WITHIN(param.P_phase, 0, 6)) { SERIAL_ECHOLNPGM("?(P)hase value invalid (0-6).\n"); err_flag = true; } @@ -1105,8 +1114,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { if (parser.seen('J')) { #if HAS_BED_PROBE - g29_grid_size = parser.has_value() ? parser.value_int() : 0; - if (g29_grid_size && !WITHIN(g29_grid_size, 2, 9)) { + param.grid_size = parser.has_value() ? parser.value_int() : 0; + if (param.grid_size && !WITHIN(param.grid_size, 2, 9)) { SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); err_flag = true; } @@ -1116,12 +1125,12 @@ bool unified_bed_leveling::g29_parameter_parsing() { #endif } - xy_seen.x = parser.seenval('X'); - float sx = xy_seen.x ? parser.value_float() : current_position.x; - xy_seen.y = parser.seenval('Y'); - float sy = xy_seen.y ? parser.value_float() : current_position.y; + param.XY_seen.x = parser.seenval('X'); + float sx = param.XY_seen.x ? parser.value_float() : current_position.x; + param.XY_seen.y = parser.seenval('Y'); + float sy = param.XY_seen.y ? parser.value_float() : current_position.y; - if (xy_seen.x != xy_seen.y) { + if (param.XY_seen.x != param.XY_seen.y) { SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); err_flag = true; } @@ -1132,7 +1141,7 @@ bool unified_bed_leveling::g29_parameter_parsing() { if (err_flag) return UBL_ERR; - g29_pos.set(sx, sy); + param.XY_pos.set(sx, sy); /** * Activate or deactivate UBL @@ -1154,8 +1163,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { } // Set global 'C' flag and its value - if ((g29_c_flag = parser.seen('C'))) - g29_constant = parser.value_float(); + if ((param.C_seen = parser.seen('C'))) + param.C_constant = parser.value_float(); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) if (parser.seenval('F')) { @@ -1168,8 +1177,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { } #endif - g29_map_type = parser.intval('T'); - if (!WITHIN(g29_map_type, 0, 2)) { + param.T_map_type = parser.intval('T'); + if (!WITHIN(param.T_map_type, 0, 2)) { SERIAL_ECHOLNPGM("Invalid map type.\n"); return UBL_ERR; } @@ -1187,7 +1196,7 @@ void unified_bed_leveling::save_ubl_active_state_and_disable() { ubl_state_recursion_chk++; if (ubl_state_recursion_chk != 1) { SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR))); + set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR)); return; } #endif @@ -1200,7 +1209,7 @@ void unified_bed_leveling::restore_ubl_active_state_and_leave() { #if ENABLED(UBL_DEVEL_DEBUGGING) if (--ubl_state_recursion_chk) { SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR))); + set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR)); return; } #endif @@ -1411,8 +1420,8 @@ void unified_bed_leveling::smart_fill_mesh() { void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { const float x_min = probe.min_x(), x_max = probe.max_x(), y_min = probe.min_y(), y_max = probe.max_y(), - dx = (x_max - x_min) / (g29_grid_size - 1), - dy = (y_max - y_min) / (g29_grid_size - 1); + dx = (x_max - x_min) / (param.grid_size - 1), + dy = (y_max - y_min) / (param.grid_size - 1); xy_float_t points[3]; probe.get_three_points(points); @@ -1431,7 +1440,7 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); + measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, param.V_verbosity); if (isnan(measured_z)) abort_flag = true; else { @@ -1439,7 +1448,7 @@ void unified_bed_leveling::smart_fill_mesh() { #ifdef VALIDATE_MESH_TILT z1 = measured_z; #endif - if (g29_verbose_level > 3) { + if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } @@ -1450,7 +1459,7 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); + measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, param.V_verbosity); #ifdef VALIDATE_MESH_TILT z2 = measured_z; #endif @@ -1458,7 +1467,7 @@ void unified_bed_leveling::smart_fill_mesh() { abort_flag = true; else { measured_z -= get_z_correction(points[1]); - if (g29_verbose_level > 3) { + if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } @@ -1470,7 +1479,7 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); + measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, param.V_verbosity); #ifdef VALIDATE_MESH_TILT z3 = measured_z; #endif @@ -1478,7 +1487,7 @@ void unified_bed_leveling::smart_fill_mesh() { abort_flag = true; else { measured_z -= get_z_correction(points[2]); - if (g29_verbose_level > 3) { + if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } @@ -1498,20 +1507,20 @@ void unified_bed_leveling::smart_fill_mesh() { bool zig_zag = false; - const uint16_t total_points = sq(g29_grid_size); + const uint16_t total_points = sq(param.grid_size); uint16_t point_num = 1; xy_pos_t rpos; - LOOP_L_N(ix, g29_grid_size) { + LOOP_L_N(ix, param.grid_size) { rpos.x = x_min + ix * dx; - LOOP_L_N(iy, g29_grid_size) { - rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); + LOOP_L_N(iy, param.grid_size) { + rpos.y = y_min + dy * (zig_zag ? param.grid_size - 1 - iy : iy); if (!abort_flag) { SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); - measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling + measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling abort_flag = isnan(measured_z); @@ -1534,7 +1543,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); - if (g29_verbose_level > 3) { + if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } @@ -1557,7 +1566,7 @@ void unified_bed_leveling::smart_fill_mesh() { vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); - if (g29_verbose_level > 2) { + if (param.V_verbosity > 2) { SERIAL_ECHOPAIR_F("bed plane normal = [", normal.x, 7); SERIAL_CHAR(','); SERIAL_ECHO_F(normal.y, 7); @@ -1721,7 +1730,7 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); #endif - adjust_mesh_to_mean(g29_c_flag, g29_constant); + adjust_mesh_to_mean(param.C_seen, param.C_constant); #if HAS_BED_PROBE SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe.offset.z, 7); @@ -1819,17 +1828,17 @@ void unified_bed_leveling::smart_fill_mesh() { return; } - if (!parser.has_value() || !WITHIN(g29_storage_slot, 0, a - 1)) { + if (!parser.has_value() || !WITHIN(parser.value_int(), 0, a - 1)) { SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); return; } - g29_storage_slot = parser.value_int(); + param.KLS_storage_slot = parser.value_int(); float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - settings.load_mesh(g29_storage_slot, &tmp_z_values); + settings.load_mesh(param.KLS_storage_slot, &tmp_z_values); - SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); + SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", param.KLS_storage_slot, " from current mesh."); GRID_LOOP(x, y) { z_values[x][y] -= tmp_z_values[x][y]; diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index 96122c18f8..55b14c19dc 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -156,16 +156,16 @@ void GcodeSuite::M420() { GRID_LOOP(x, y) mesh_sum += Z_VALUES(x, y); const float zmean = mesh_sum / float(GRID_MAX_POINTS); - #else + #else // midrange - // Find the low and high mesh values + // Find the low and high mesh values. float lo_val = 100, hi_val = -100; GRID_LOOP(x, y) { const float z = Z_VALUES(x, y); NOMORE(lo_val, z); NOLESS(hi_val, z); } - // Take the mean of the lowest and highest + // Get the midrange plus C value. (The median may be better.) const float zmean = (lo_val + hi_val) / 2.0 + cval; #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 6f5703e622..a18a3384af 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -85,11 +85,6 @@ typedef void (*screenFunc_t)(); typedef void (*menuAction_t)(); - #if ENABLED(AUTO_BED_LEVELING_UBL) - void lcd_mesh_edit_setup(const float &initial); - float lcd_mesh_edit(); - #endif - #endif // HAS_LCD_MENU #endif // HAS_WIRED_LCD @@ -488,6 +483,11 @@ public: static void ubl_plot(const uint8_t x_plot, const uint8_t y_plot); #endif + #if ENABLED(AUTO_BED_LEVELING_UBL) + static void ubl_mesh_edit_start(const float &initial); + static float ubl_mesh_value(); + #endif + static void draw_select_screen_prompt(PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr); #elif HAS_WIRED_LCD diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 6c6076cf74..565e6725a7 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -56,12 +56,24 @@ inline float rounded_mesh_value() { return float(rounded - (rounded % 5L)) / 1000; } -static void _lcd_mesh_fine_tune(PGM_P const msg) { +/** + * This screen displays the temporary mesh value and updates it based on encoder + * movement. While this screen is active ubl.fine_tune_mesh sits in a loop getting + * the current value via ubl_mesh_value, moves the Z axis, and updates the mesh + * value until the encoder button is pressed. + * + * - Update the 'mesh_edit_accumulator' from encoder rotation + * - Draw the mesh value (with draw_edit_screen) + * - Draw the graphical overlay, if enabled. + * - Update the 'refresh' state according to the display type + */ +void _lcd_mesh_fine_tune(PGM_P const msg) { + constexpr float mesh_edit_step = 1.0f / 200.0f; ui.defer_status_screen(); if (ubl.encoder_diff) { mesh_edit_accumulator += TERN(IS_TFTGLCD_PANEL, - ubl.encoder_diff * 0.005f / ENCODER_PULSES_PER_STEP, - ubl.encoder_diff > 0 ? 0.005f : -0.005f + ubl.encoder_diff * mesh_edit_step / ENCODER_PULSES_PER_STEP, + ubl.encoder_diff > 0 ? mesh_edit_step : -mesh_edit_step ); ubl.encoder_diff = 0; IF_DISABLED(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); @@ -77,29 +89,19 @@ static void _lcd_mesh_fine_tune(PGM_P const msg) { } // -// Called external to the menu system to acquire the result of an edit. +// Init mesh editing and go to the fine tuning screen (ubl.fine_tune_mesh) +// To capture encoder events UBL will also call ui.capture and ui.release. // -float lcd_mesh_edit() { return rounded_mesh_value(); } - -void lcd_mesh_edit_setup(const float &initial) { - TERN_(HAS_GRAPHICAL_TFT, ui.clear_lcd()); +void MarlinUI::ubl_mesh_edit_start(const float &initial) { + TERN_(HAS_GRAPHICAL_TFT, clear_lcd()); mesh_edit_accumulator = initial; - ui.goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); + goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); } -void _lcd_z_offset_edit() { - _lcd_mesh_fine_tune(GET_TEXT(MSG_UBL_Z_OFFSET)); -} - -float lcd_z_offset_edit() { - ui.goto_screen(_lcd_z_offset_edit); - return rounded_mesh_value(); -} - -void lcd_z_offset_edit_setup(const float &initial) { - mesh_edit_accumulator = initial; - ui.goto_screen(_lcd_z_offset_edit); -} +// +// Get the mesh value within a Z adjustment loop (ubl.fine_tune_mesh) +// +float MarlinUI::ubl_mesh_value() { return rounded_mesh_value(); } /** * UBL Build Custom Mesh Command From c6774812fa15756c226c879dba4d77f1dff0429a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Mar 2021 05:40:28 -0500 Subject: [PATCH 1190/1370] More IntelliSense-friendly declarations --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 4 +- Marlin/src/feature/caselight.h | 10 +- Marlin/src/feature/joystick.h | 16 +- Marlin/src/feature/meatpack.cpp | 4 +- Marlin/src/feature/mixing.h | 9 +- Marlin/src/feature/powerloss.h | 40 ++- Marlin/src/feature/tmc_util.h | 16 +- Marlin/src/gcode/bedlevel/G35.cpp | 4 +- Marlin/src/gcode/calibrate/G33.cpp | 4 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 4 +- Marlin/src/gcode/gcode.h | 336 +++++++++++++----- Marlin/src/gcode/queue.h | 14 +- .../lcd/dogm/status_screen_lite_ST7920.cpp | 4 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 8 +- Marlin/src/lcd/dwin/e3v2/dwin.h | 24 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 4 +- Marlin/src/lcd/extui/ui_api.cpp | 76 ++-- Marlin/src/lcd/marlinui.cpp | 4 +- Marlin/src/lcd/marlinui.h | 20 +- Marlin/src/lcd/menu/game/game.h | 16 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 4 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 4 +- Marlin/src/libs/nozzle.cpp | 12 +- Marlin/src/module/endstops.h | 12 +- Marlin/src/module/planner.cpp | 4 +- Marlin/src/module/planner.h | 4 +- Marlin/src/module/servo.cpp | 4 +- Marlin/src/module/stepper.cpp | 4 +- Marlin/src/module/temperature.h | 84 +++-- Marlin/src/module/tool_change.h | 8 +- Marlin/src/sd/cardreader.cpp | 4 +- 32 files changed, 562 insertions(+), 203 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 42a3018561..06b91002b8 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -303,7 +303,9 @@ void unified_bed_leveling::G29() { const int8_t p_val = parser.intval('P', -1); const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); - TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); + #if ENABLED(HAS_MULTI_HOTEND) + const uint8_t old_tool_index = active_extruder; + #endif // Check for commands that require the printer to be homed if (may_move) { diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index 25bcb486fa..05385ad0cb 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -34,7 +34,9 @@ class CaseLight { public: static bool on; - TERN_(CASELIGHT_USES_BRIGHTNESS, static uint8_t brightness); + #if ENABLED(CASELIGHT_USES_BRIGHTNESS) + static uint8_t brightness; + #endif static bool pin_is_pwm() { return TERN0(NEED_CASE_LIGHT_PIN, PWM_PIN(CASE_LIGHT_PIN)); } static bool has_brightness() { return TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, pin_is_pwm())); } @@ -50,8 +52,10 @@ public: static inline void update_brightness() { update(false); } static inline void update_enabled() { update(true); } -private: - TERN_(CASE_LIGHT_IS_COLOR_LED, static LEDColor color); + #if ENABLED(CASE_LIGHT_IS_COLOR_LED) + private: + static LEDColor color; + #endif }; extern CaseLight caselight; diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h index e8e218b2f9..d1c4fbd314 100644 --- a/Marlin/src/feature/joystick.h +++ b/Marlin/src/feature/joystick.h @@ -32,11 +32,19 @@ class Joystick { friend class Temperature; private: - TERN_(HAS_JOY_ADC_X, static temp_info_t x); - TERN_(HAS_JOY_ADC_Y, static temp_info_t y); - TERN_(HAS_JOY_ADC_Z, static temp_info_t z); + #if ENABLED(HAS_JOY_ADC_X) + static temp_info_t x; + #endif + #if ENABLED(HAS_JOY_ADC_Y) + static temp_info_t y; + #endif + #if ENABLED(HAS_JOY_ADC_Z) + static temp_info_t z; + #endif public: - TERN_(JOYSTICK_DEBUG, static void report()); + #if ENABLED(JOYSTICK_DEBUG) + static void report(); + #endif static void calculate(xyz_float_t &norm_jog); static void inject_jog_moves(); }; diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 44567ac482..0742f82350 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -57,7 +57,9 @@ uint8_t meatPackLookupTable[16] = { '\0' // Unused. 0b1111 indicates a literal character }; -TERN_(MP_DEBUG, uint8_t chars_decoded = 0); // Log the first 64 bytes after each reset +#if ENABLED(MP_DEBUG) + uint8_t chars_decoded = 0; // Log the first 64 bytes after each reset +#endif void MeatPack::reset_state() { state = 0; diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 65d1f1bf95..5de039985d 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -61,9 +61,6 @@ enum MixTool { #define MAX_VTOOLS TERN(HAS_MIXER_SYNC_CHANNEL, 254, 255) static_assert(NR_MIXING_VIRTUAL_TOOLS <= MAX_VTOOLS, "MIXING_VIRTUAL_TOOLS must be <= " STRINGIFY(MAX_VTOOLS) "!"); -#define MIXER_BLOCK_FIELD mixer_comp_t b_color[MIXING_STEPPERS] -#define MIXER_POPULATE_BLOCK() mixer.populate_block(block->b_color) -#define MIXER_STEPPER_SETUP() mixer.stepper_setup(current_block->b_color) #define MIXER_STEPPER_LOOP(VAR) for (uint_fast8_t VAR = 0; VAR < MIXING_STEPPERS; VAR++) #if ENABLED(GRADIENT_MIX) @@ -73,9 +70,11 @@ static_assert(NR_MIXING_VIRTUAL_TOOLS <= MAX_VTOOLS, "MIXING_VIRTUAL_TOOLS must mixer_comp_t color[MIXING_STEPPERS]; // The current gradient color float start_z, end_z; // Region for gradient int8_t start_vtool, end_vtool; // Start and end virtual tools - mixer_perc_t start_mix[MIXING_STEPPERS], // Start and end mixes from those tools + mixer_perc_t start_mix[MIXING_STEPPERS], // Start and end mixes from those tools end_mix[MIXING_STEPPERS]; - TERN_(GRADIENT_VTOOL, int8_t vtool_index); // Use this virtual tool number as index + #if ENABLED(GRADIENT_VTOOL) + int8_t vtool_index; // Use this virtual tool number as index + #endif } gradient_t; #endif diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 12d11b141e..7c09c0f3cf 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -55,22 +55,38 @@ typedef struct { float zraise; // Repeat information - TERN_(GCODE_REPEAT_MARKERS, Repeat stored_repeat); + #if ENABLED(GCODE_REPEAT_MARKERS) + Repeat stored_repeat; + #endif - TERN_(HAS_HOME_OFFSET, xyz_pos_t home_offset); - TERN_(HAS_POSITION_SHIFT, xyz_pos_t position_shift); - TERN_(HAS_MULTI_EXTRUDER, uint8_t active_extruder); + #if ENABLED(HAS_HOME_OFFSET) + xyz_pos_t home_offset; + #endif + #if ENABLED(HAS_POSITION_SHIFT) + xyz_pos_t position_shift; + #endif + #if ENABLED(HAS_MULTI_EXTRUDER) + uint8_t active_extruder; + #endif #if DISABLED(NO_VOLUMETRICS) bool volumetric_enabled; float filament_size[EXTRUDERS]; #endif - TERN_(HAS_HOTEND, celsius_t target_temperature[HOTENDS]); - TERN_(HAS_HEATED_BED, celsius_t target_temperature_bed); - TERN_(HAS_FAN, uint8_t fan_speed[FAN_COUNT]); + #if ENABLED(HAS_HOTEND) + celsius_t target_temperature[HOTENDS]; + #endif + #if ENABLED(HAS_HEATED_BED) + celsius_t target_temperature_bed; + #endif + #if ENABLED(HAS_FAN) + uint8_t fan_speed[FAN_COUNT]; + #endif - TERN_(HAS_LEVELING, float fade); + #if ENABLED(HAS_LEVELING) + float fade; + #endif #if ENABLED(FWRETRACT) float retract[EXTRUDERS], retract_hop; @@ -80,7 +96,9 @@ typedef struct { #if ENABLED(MIXING_EXTRUDER) //uint_fast8_t selected_vtool; //mixer_comp_t color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; - TERN_(GRADIENT_MIX, gradient_t gradient); + #if ENABLED(GRADIENT_MIX) + gradient_t gradient; + #endif #endif // SD Filename and position @@ -97,7 +115,9 @@ typedef struct { struct { bool dryrun:1; // M111 S8 bool allow_cold_extrusion:1; // M302 P1 - TERN_(HAS_LEVELING, bool leveling:1); + #if ENABLED(HAS_LEVELING) + bool leveling:1; + #endif } flag; uint8_t valid_foot; diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index b21b89f68b..1767313ba2 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -70,9 +70,15 @@ class TMCStorage { } struct { - TERN_(HAS_STEALTHCHOP, bool stealthChop_enabled = false); - TERN_(HYBRID_THRESHOLD, uint8_t hybrid_thrs = 0); - TERN_(USE_SENSORLESS, int16_t homing_thrs = 0); + #if ENABLED(HAS_STEALTHCHOP) + bool stealthChop_enabled = false; + #endif + #if ENABLED(HYBRID_THRESHOLD) + uint8_t hybrid_thrs = 0; + #endif + #if ENABLED(USE_SENSORLESS) + int16_t homing_thrs = 0; + #endif } stored; }; @@ -363,7 +369,9 @@ void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z struct slow_homing_t { xy_ulong_t acceleration; - TERN_(HAS_CLASSIC_JERK, xy_float_t jerk_xy); + #if ENABLED(HAS_CLASSIC_JERK) + xy_float_t jerk_xy; + #endif }; #endif diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 88f02e6de2..0fab747618 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -72,7 +72,9 @@ void GcodeSuite::G35() { // Disable the leveling matrix before auto-aligning #if HAS_LEVELING - TERN_(RESTORE_LEVELING_AFTER_G35, const bool leveling_was_active = planner.leveling_active); + #if ENABLED(RESTORE_LEVELING_AFTER_G35) + const bool leveling_was_active = planner.leveling_active; + #endif set_bed_leveling_enabled(false); #endif diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 5530bc7089..902711397d 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -63,7 +63,9 @@ enum CalEnum : char { // the 7 main calibration points - #define LOOP_CAL_RAD(VAR) LOOP_CAL_PT(VAR, __A, _7P_STEP) #define LOOP_CAL_ACT(VAR, _4P, _OP) LOOP_CAL_PT(VAR, _OP ? _AB : __A, _4P ? _4P_STEP : _7P_STEP) -TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); +#if ENABLED(HAS_MULTI_HOTEND) + const uint8_t old_tool_index = active_extruder; +#endif float lcd_probe_pt(const xy_pos_t &xy); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index bee6aaedeb..d2075fedce 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -130,7 +130,9 @@ void GcodeSuite::G34() { // Disable the leveling matrix before auto-aligning #if HAS_LEVELING - TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active); + #if ENABLED(RESTORE_LEVELING_AFTER_G34) + const bool leveling_was_active = planner.leveling_active; + #endif set_bed_leveling_enabled(false); #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 52570ff83f..7ea2489584 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -418,24 +418,34 @@ public: private: - TERN_(MARLIN_DEV_MODE, static void D(const int16_t dcode)); + #if ENABLED(MARLIN_DEV_MODE) + static void D(const int16_t dcode); + #endif static void G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move=false)); - TERN_(ARC_SUPPORT, static void G2_G3(const bool clockwise)); + #if ENABLED(ARC_SUPPORT) + static void G2_G3(const bool clockwise); + #endif static void G4(); - TERN_(BEZIER_CURVE_SUPPORT, static void G5()); + #if ENABLED(BEZIER_CURVE_SUPPORT) + static void G5(); + #endif - TERN_(DIRECT_STEPPING, static void G6()); + #if ENABLED(DIRECT_STEPPING) + static void G6(); + #endif #if ENABLED(FWRETRACT) static void G10(); static void G11(); #endif - TERN_(NOZZLE_CLEAN_FEATURE, static void G12()); + #if ENABLED(NOZZLE_CLEAN_FEATURE) + static void G12(); + #endif #if ENABLED(CNC_WORKSPACE_PLANES) static void G17(); @@ -448,9 +458,13 @@ private: static void G21(); #endif - TERN_(G26_MESH_VALIDATION, static void G26()); + #if ENABLED(G26_MESH_VALIDATION) + static void G26(); + #endif - TERN_(NOZZLE_PARK_FEATURE, static void G27()); + #if ENABLED(NOZZLE_PARK_FEATURE) + static void G27(); + #endif static void G28(); @@ -474,19 +488,29 @@ private: #endif #endif - TERN_(DELTA_AUTO_CALIBRATION, static void G33()); + #if ENABLED(DELTA_AUTO_CALIBRATION) + static void G33(); + #endif #if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) static void G34(); #endif - TERN_(Z_STEPPER_AUTO_ALIGN, static void M422()); + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + static void M422(); + #endif - TERN_(ASSISTED_TRAMMING, static void G35()); + #if ENABLED(ASSISTED_TRAMMING) + static void G35(); + #endif - TERN_(G38_PROBE_TARGET, static void G38(const int8_t subcode)); + #if ENABLED(G38_PROBE_TARGET) + static void G38(const int8_t subcode); + #endif - TERN_(HAS_MESH, static void G42()); + #if ENABLED(HAS_MESH) + static void G42(); + #endif #if ENABLED(CNC_COORDINATE_SYSTEMS) static void G53(); @@ -498,20 +522,28 @@ private: static void G59(); #endif - TERN_(PROBE_TEMP_COMPENSATION, static void G76()); + #if ENABLED(PROBE_TEMP_COMPENSATION) + static void G76(); + #endif #if SAVED_POSITIONS static void G60(); static void G61(); #endif - TERN_(GCODE_MOTION_MODES, static void G80()); + #if ENABLED(GCODE_MOTION_MODES) + static void G80(); + #endif static void G92(); - TERN_(CALIBRATION_GCODE, static void G425()); + #if ENABLED(CALIBRATION_GCODE) + static void G425(); + #endif - TERN_(HAS_RESUME_CONTINUE, static void M0_M1()); + #if ENABLED(HAS_RESUME_CONTINUE) + static void M0_M1(); + #endif #if HAS_CUTTER static void M3_M4(const bool is_M4); @@ -519,14 +551,22 @@ private: #endif #if ENABLED(COOLANT_CONTROL) - TERN_(COOLANT_MIST, static void M7()); - TERN_(COOLANT_FLOOD, static void M8()); + #if ENABLED(COOLANT_MIST) + static void M7(); + #endif + #if ENABLED(COOLANT_FLOOD) + static void M8(); + #endif static void M9(); #endif - TERN_(EXTERNAL_CLOSED_LOOP_CONTROLLER, static void M12()); + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + static void M12(); + #endif - TERN_(EXPECTED_PRINTER_CHECK, static void M16()); + #if ENABLED(EXPECTED_PRINTER_CHECK) + static void M16(); + #endif static void M17(); @@ -549,27 +589,43 @@ private: static void M31(); #if ENABLED(SDSUPPORT) - TERN_(HAS_MEDIA_SUBCALLS, static void M32()); - TERN_(LONG_FILENAME_HOST_SUPPORT, static void M33()); + #if ENABLED(HAS_MEDIA_SUBCALLS) + static void M32(); + #endif + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + static void M33(); + #endif #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) static void M34(); #endif #endif - TERN_(DIRECT_PIN_CONTROL, static void M42()); - TERN_(PINS_DEBUGGING, static void M43()); + #if ENABLED(DIRECT_PIN_CONTROL) + static void M42(); + #endif + #if ENABLED(PINS_DEBUGGING) + static void M43(); + #endif - TERN_(Z_MIN_PROBE_REPEATABILITY_TEST, static void M48()); + #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + static void M48(); + #endif - TERN_(LCD_SET_PROGRESS_MANUALLY, static void M73()); + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + static void M73(); + #endif static void M75(); static void M76(); static void M77(); - TERN_(PRINTCOUNTER, static void M78()); + #if ENABLED(PRINTCOUNTER) + static void M78(); + #endif - TERN_(PSU_CONTROL, static void M80()); + #if ENABLED(PSU_CONTROL) + static void M80(); + #endif static void M81(); static void M82(); @@ -577,7 +633,9 @@ private: static void M85(); static void M92(); - TERN_(M100_FREE_MEMORY_WATCHER, static void M100()); + #if ENABLED(M100_FREE_MEMORY_WATCHER) + static void M100(); + #endif #if EXTRUDERS static void M104(); @@ -595,13 +653,17 @@ private: static void M108(); static void M112(); static void M410(); - TERN_(HOST_PROMPT_SUPPORT, static void M876()); + #if ENABLED(HOST_PROMPT_SUPPORT) + static void M876(); + #endif #endif static void M110(); static void M111(); - TERN_(HOST_KEEPALIVE_FEATURE, static void M113()); + #if ENABLED(HOST_KEEPALIVE_FEATURE) + static void M113(); + #endif static void M114(); static void M115(); @@ -611,7 +673,9 @@ private: static void M120(); static void M121(); - TERN_(PARK_HEAD_ON_PAUSE, static void M125()); + #if ENABLED(PARK_HEAD_ON_PAUSE) + static void M125(); + #endif #if ENABLED(BARICUDA) #if HAS_HEATER_1 @@ -643,9 +707,13 @@ private: static void M145(); #endif - TERN_(TEMPERATURE_UNITS_SUPPORT, static void M149()); + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + static void M149(); + #endif - TERN_(HAS_COLOR_LEDS, static void M150()); + #if ENABLED(HAS_COLOR_LEDS) + static void M150(); + #endif #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) static void M155(); @@ -654,8 +722,12 @@ private: #if ENABLED(MIXING_EXTRUDER) static void M163(); static void M164(); - TERN_(DIRECT_MIXING_IN_G1, static void M165()); - TERN_(GRADIENT_MIX, static void M166()); + #if ENABLED(DIRECT_MIXING_IN_G1) + static void M165(); + #endif + #if ENABLED(GRADIENT_MIX) + static void M166(); + #endif #endif static void M200(); @@ -669,19 +741,27 @@ private: static void M204(); static void M205(); - TERN_(HAS_M206_COMMAND, static void M206()); + #if ENABLED(HAS_M206_COMMAND) + static void M206(); + #endif #if ENABLED(FWRETRACT) static void M207(); static void M208(); - TERN_(FWRETRACT_AUTORETRACT, static void M209()); + #if ENABLED(FWRETRACT_AUTORETRACT) + static void M209(); + #endif #endif static void M211(); - TERN_(HAS_MULTI_EXTRUDER, static void M217()); + #if ENABLED(HAS_MULTI_EXTRUDER) + static void M217(); + #endif - TERN_(HAS_HOTEND_OFFSET, static void M218()); + #if ENABLED(HAS_HOTEND_OFFSET) + static void M218(); + #endif static void M220(); @@ -689,11 +769,17 @@ private: static void M221(); #endif - TERN_(DIRECT_PIN_CONTROL, static void M226()); + #if ENABLED(DIRECT_PIN_CONTROL) + static void M226(); + #endif - TERN_(PHOTO_GCODE, static void M240()); + #if ENABLED(PHOTO_GCODE) + static void M240(); + #endif - TERN_(HAS_LCD_CONTRAST, static void M250()); + #if ENABLED(HAS_LCD_CONTRAST) + static void M250(); + #endif #if ENABLED(EXPERIMENTAL_I2CBUS) static void M260(); @@ -702,33 +788,55 @@ private: #if HAS_SERVOS static void M280(); - TERN_(EDITABLE_SERVO_ANGLES, static void M281()); + #if ENABLED(EDITABLE_SERVO_ANGLES) + static void M281(); + #endif #endif - TERN_(BABYSTEPPING, static void M290()); + #if ENABLED(BABYSTEPPING) + static void M290(); + #endif - TERN_(HAS_BUZZER, static void M300()); + #if ENABLED(HAS_BUZZER) + static void M300(); + #endif - TERN_(PIDTEMP, static void M301()); + #if ENABLED(PIDTEMP) + static void M301(); + #endif - TERN_(PREVENT_COLD_EXTRUSION, static void M302()); + #if ENABLED(PREVENT_COLD_EXTRUSION) + static void M302(); + #endif - TERN_(HAS_PID_HEATING, static void M303()); + #if ENABLED(HAS_PID_HEATING) + static void M303(); + #endif - TERN_(PIDTEMPBED, static void M304()); + #if ENABLED(PIDTEMPBED) + static void M304(); + #endif - TERN_(HAS_USER_THERMISTORS, static void M305()); + #if ENABLED(HAS_USER_THERMISTORS) + static void M305(); + #endif - TERN_(PIDTEMPCHAMBER, static void M309()); + #if ENABLED(PIDTEMPCHAMBER) + static void M309(); + #endif #if HAS_MICROSTEPS static void M350(); static void M351(); #endif - TERN_(CASE_LIGHT_ENABLE, static void M355()); + #if ENABLED(CASE_LIGHT_ENABLE) + static void M355(); + #endif - TERN_(REPETIER_GCODE_M360, static void M360()); + #if ENABLED(REPETIER_GCODE_M360) + static void M360(); + #endif #if ENABLED(MORGAN_SCARA) static bool M360(); @@ -750,7 +858,9 @@ private: static void M402(); #endif - TERN_(HAS_PRUSA_MMU2, static void M403()); + #if ENABLED(HAS_PRUSA_MMU2) + static void M403(); + #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) static void M404(); @@ -759,22 +869,34 @@ private: static void M407(); #endif - TERN_(HAS_FILAMENT_SENSOR, static void M412()); + #if ENABLED(HAS_FILAMENT_SENSOR) + static void M412(); + #endif - TERN_(HAS_MULTI_LANGUAGE, static void M414()); + #if ENABLED(HAS_MULTI_LANGUAGE) + static void M414(); + #endif #if HAS_LEVELING static void M420(); static void M421(); #endif - TERN_(BACKLASH_GCODE, static void M425()); + #if ENABLED(BACKLASH_GCODE) + static void M425(); + #endif - TERN_(HAS_M206_COMMAND, static void M428()); + #if ENABLED(HAS_M206_COMMAND) + static void M428(); + #endif - TERN_(HAS_POWER_MONITOR, static void M430()); + #if ENABLED(HAS_POWER_MONITOR) + static void M430(); + #endif - TERN_(CANCEL_OBJECTS, static void M486()); + #if ENABLED(CANCEL_OBJECTS) + static void M486(); + #endif static void M500(); static void M501(); @@ -782,17 +904,27 @@ private: #if DISABLED(DISABLE_M503) static void M503(); #endif - TERN_(EEPROM_SETTINGS, static void M504()); + #if ENABLED(EEPROM_SETTINGS) + static void M504(); + #endif #if ENABLED(PASSWORD_FEATURE) static void M510(); - TERN_(PASSWORD_UNLOCK_GCODE, static void M511()); - TERN_(PASSWORD_CHANGE_GCODE, static void M512()); + #if ENABLED(PASSWORD_UNLOCK_GCODE) + static void M511(); + #endif + #if ENABLED(PASSWORD_CHANGE_GCODE) + static void M512(); + #endif #endif - TERN_(SDSUPPORT, static void M524()); + #if ENABLED(SDSUPPORT) + static void M524(); + #endif - TERN_(SD_ABORT_ON_ENDSTOP_HIT, static void M540()); + #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + static void M540(); + #endif #if HAS_ETHERNET static void M552(); @@ -800,16 +932,22 @@ private: static void M554(); #endif - TERN_(BAUD_RATE_GCODE, static void M575()); + #if ENABLED(BAUD_RATE_GCODE) + static void M575(); + #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) static void M600(); static void M603(); #endif - TERN_(HAS_DUPLICATION_MODE, static void M605()); + #if ENABLED(HAS_DUPLICATION_MODE) + static void M605(); + #endif - TERN_(IS_KINEMATIC, static void M665()); + #if ENABLED(IS_KINEMATIC) + static void M665(); + #endif #if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS static void M666(); @@ -824,13 +962,21 @@ private: static void M702(); #endif - TERN_(GCODE_REPEAT_MARKERS, static void M808()); + #if ENABLED(GCODE_REPEAT_MARKERS) + static void M808(); + #endif - TERN_(GCODE_MACROS, static void M810_819()); + #if ENABLED(GCODE_MACROS) + static void M810_819(); + #endif - TERN_(HAS_BED_PROBE, static void M851()); + #if ENABLED(HAS_BED_PROBE) + static void M851(); + #endif - TERN_(SKEW_CORRECTION_GCODE, static void M852()); + #if ENABLED(SKEW_CORRECTION_GCODE) + static void M852(); + #endif #if ENABLED(I2C_POSITION_ENCODERS) FORCE_INLINE static void M860() { I2CPEM.M860(); } @@ -850,18 +996,26 @@ private: static void M871(); #endif - TERN_(LIN_ADVANCE, static void M900()); + #if ENABLED(LIN_ADVANCE) + static void M900(); + #endif #if HAS_TRINAMIC_CONFIG static void M122(); static void M906(); - TERN_(HAS_STEALTHCHOP, static void M569()); + #if ENABLED(HAS_STEALTHCHOP) + static void M569(); + #endif #if ENABLED(MONITOR_DRIVER_STATUS) static void M911(); static void M912(); #endif - TERN_(HYBRID_THRESHOLD, static void M913()); - TERN_(USE_SENSORLESS, static void M914()); + #if ENABLED(HYBRID_THRESHOLD) + static void M913(); + #endif + #if ENABLED(USE_SENSORLESS) + static void M914(); + #endif #endif #if HAS_L64XX @@ -883,18 +1037,26 @@ private: #endif #endif - TERN_(SDSUPPORT, static void M928()); + #if ENABLED(SDSUPPORT) + static void M928(); + #endif - TERN_(MAGNETIC_PARKING_EXTRUDER, static void M951()); + #if ENABLED(MAGNETIC_PARKING_EXTRUDER) + static void M951(); + #endif - TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static void M995(); + #endif #if BOTH(HAS_SPI_FLASH, SDSUPPORT) static void M993(); static void M994(); #endif - TERN_(PLATFORM_M997_SUPPORT, static void M997()); + #if ENABLED(PLATFORM_M997_SUPPORT) + static void M997(); + #endif static void M999(); @@ -903,11 +1065,17 @@ private: static void M1000(); #endif - TERN_(SDSUPPORT, static void M1001()); + #if ENABLED(SDSUPPORT) + static void M1001(); + #endif - TERN_(MAX7219_GCODE, static void M7219()); + #if ENABLED(MAX7219_GCODE) + static void M7219(); + #endif - TERN_(CONTROLLER_FAN_EDITABLE, static void M710()); + #if ENABLED(CONTROLLER_FAN_EDITABLE) + static void M710(); + #endif static void T(const int8_t tool_index); diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 8e87d114eb..4d3ccb364e 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -40,9 +40,9 @@ public: * M110 N sets the current line number. */ long last_N; - int count; //!< Number of characters read in the current line of serial input - char line_buffer[MAX_CMD_SIZE]; //!< The current line accumulator - uint8_t input_state; //!< The input state + int count; //!< Number of characters read in the current line of serial input + char line_buffer[MAX_CMD_SIZE]; //!< The current line accumulator + uint8_t input_state; //!< The input state }; static SerialState serial_state[NUM_SERIAL]; //!< Serial states for each serial port @@ -57,9 +57,11 @@ public: * command and hands off execution to individual handler functions. */ struct CommandLine { - char buffer[MAX_CMD_SIZE]; //!< The command buffer - bool skip_ok; //!< Skip sending ok when command is processed? - TERN_(HAS_MULTI_SERIAL, serial_index_t port); //!< Serial port the command was received on + char buffer[MAX_CMD_SIZE]; //!< The command buffer + bool skip_ok; //!< Skip sending ok when command is processed? + #if ENABLED(HAS_MULTI_SERIAL) + serial_index_t port; //!< Serial port the command was received on + #endif }; /** diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index dcb65f676d..a2dfb74a57 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -536,7 +536,9 @@ void ST7920_Lite_Status_Screen::draw_heat_icon(const bool whichIcon, const bool static struct { bool E1_show_target : 1; bool E2_show_target : 1; - TERN_(HAS_HEATED_BED, bool bed_show_target : 1); + #if ENABLED(HAS_HEATED_BED) + bool bed_show_target : 1; + #endif } display_state = { true, true, TERN_(HAS_HEATED_BED, true) }; diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 0e9b93525d..d543ff0508 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -180,8 +180,12 @@ static uint8_t _card_percent = 0; static uint16_t _remain_time = 0; #if ENABLED(PAUSE_HEAT) - TERN_(HAS_HOTEND, uint16_t resume_hotend_temp = 0); - TERN_(HAS_HEATED_BED, uint16_t resume_bed_temp = 0); + #if ENABLED(HAS_HOTEND) + uint16_t resume_hotend_temp = 0; + #endif + #if ENABLED(HAS_HEATED_BED) + uint16_t resume_bed_temp = 0; + #endif #endif #if HAS_ZOFFSET_ITEM diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 9e0cda86c2..dd2d1cbc01 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -234,9 +234,15 @@ extern char print_filename[16]; extern millis_t dwin_heat_time; typedef struct { - TERN_(HAS_HOTEND, celsius_t E_Temp = 0); - TERN_(HAS_HEATED_BED, celsius_t Bed_Temp = 0); - TERN_(HAS_FAN, int16_t Fan_speed = 0); + #if ENABLED(HAS_HOTEND) + celsius_t E_Temp = 0; + #endif + #if ENABLED(HAS_HEATED_BED) + celsius_t Bed_Temp = 0; + #endif + #if ENABLED(HAS_FAN) + int16_t Fan_speed = 0; + #endif int16_t print_speed = 100; float Max_Feedspeed = 0; float Max_Acceleration = 0; @@ -312,9 +318,15 @@ void HMI_Move_E(); void HMI_Zoffset(); -TERN_(HAS_HOTEND, void HMI_ETemp()); -TERN_(HAS_HEATED_BED, void HMI_BedTemp()); -TERN_(HAS_FAN, void HMI_FanSpeed()); +#if ENABLED(HAS_HOTEND) + void HMI_ETemp(); +#endif +#if ENABLED(HAS_HEATED_BED) + void HMI_BedTemp(); +#endif +#if ENABLED(HAS_FAN) + void HMI_FanSpeed(); +#endif void HMI_PrintSpeed(); diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 473fcb954c..a585ef670a 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -624,7 +624,9 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr DEBUG_ECHOLNPGM("HandlePreheat"); uint8_t e_temp = 0; - TERN_(HAS_HEATED_BED, uint8_t bed_temp = 0); + #if ENABLED(HAS_HEATED_BED) + uint8_t bed_temp = 0; + #endif const uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); switch (preheat_option) { default: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 2cc6d19cc5..e9e501ae5f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -49,7 +49,9 @@ static lv_obj_t *labelPause, *labelStop, *labelOperat; static lv_obj_t *bar1, *bar1ValueText; static lv_obj_t *buttonPause, *buttonOperat, *buttonStop; -TERN_(HAS_MULTI_EXTRUDER, static lv_obj_t *labelExt2); +#if ENABLED(HAS_MULTI_EXTRUDER) + static lv_obj_t *labelExt2; +#endif #if HAS_HEATED_BED static lv_obj_t* labelBed; diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 9e5e0b6a62..cfd48e5dd9 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -103,8 +103,12 @@ namespace ExtUI { static struct { uint8_t printer_killed : 1; - TERN_(JOYSTICK, uint8_t jogging : 1); - TERN_(SDSUPPORT, uint8_t was_sd_printing : 1); + #if ENABLED(JOYSTICK) + uint8_t jogging : 1; + #endif + #if ENABLED(SDSUPPORT) + uint8_t was_sd_printing : 1; + #endif } flags; #ifdef __SAM3X8E__ @@ -175,8 +179,12 @@ namespace ExtUI { #if HAS_HEATED_BED case BED: thermalManager.reset_bed_idle_timer(); return; #endif - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return); // Chamber has no idle timer - TERN_(HAS_COOLER, case COOLER: return); // Cooler has no idle timer + #if ENABLED(HAS_HEATED_CHAMBER) + case CHAMBER: return; // Chamber has no idle timer + #endif + #if ENABLED(HAS_COOLER) + case COOLER: return; // Cooler has no idle timer + #endif default: TERN_(HAS_HOTEND, thermalManager.reset_hotend_idle_timer(heater - H0)); break; @@ -234,8 +242,12 @@ namespace ExtUI { bool isHeaterIdle(const heater_t heater) { #if HEATER_IDLE_HANDLER switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return false); // Chamber has no idle timer + #if ENABLED(HAS_HEATED_BED) + case BED: return thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out; + #endif + #if ENABLED(HAS_HEATED_CHAMBER) + case CHAMBER: return false; // Chamber has no idle timer + #endif default: return TERN0(HAS_HOTEND, thermalManager.heater_idle[heater - H0].timed_out); } @@ -253,8 +265,12 @@ namespace ExtUI { float getActualTemp_celsius(const heater_t heater) { switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degBed())); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degChamber())); + #if ENABLED(HAS_HEATED_BED) + case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degBed()); + #endif + #if ENABLED(HAS_HEATED_CHAMBER) + case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degChamber()); + #endif default: return GET_TEMP_ADJUSTMENT(thermalManager.degHotend(heater - H0)); } } @@ -265,8 +281,12 @@ namespace ExtUI { float getTargetTemp_celsius(const heater_t heater) { switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetBed())); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetChamber())); + #if ENABLED(HAS_HEATED_BED) + case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetBed()); + #endif + #if ENABLED(HAS_HEATED_CHAMBER) + case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetChamber()); + #endif default: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetHotend(heater - H0)); } } @@ -294,13 +314,13 @@ namespace ExtUI { } float getAxisPosition_mm(const axis_t axis) { - return TERN_(JOYSTICK, flags.jogging ? destination[axis] :) current_position[axis]; + return TERN0(JOYSTICK, flags.jogging) ? destination[axis] : current_position[axis]; } float getAxisPosition_mm(const extruder_t extruder) { const extruder_t old_tool = getActiveTool(); setActiveTool(extruder, true); - const float epos = TERN_(JOYSTICK, flags.jogging ? destination.e :) current_position.e; + const float epos = TERN0(JOYSTICK, flags.jogging) ? destination.e : current_position.e; setActiveTool(old_tool, true); return epos; } @@ -491,14 +511,30 @@ namespace ExtUI { int getTMCBumpSensitivity(const axis_t axis) { switch (axis) { - TERN_(X_SENSORLESS, case X: return stepperX.homing_threshold()); - TERN_(X2_SENSORLESS, case X2: return stepperX2.homing_threshold()); - TERN_(Y_SENSORLESS, case Y: return stepperY.homing_threshold()); - TERN_(Y2_SENSORLESS, case Y2: return stepperY2.homing_threshold()); - TERN_(Z_SENSORLESS, case Z: return stepperZ.homing_threshold()); - TERN_(Z2_SENSORLESS, case Z2: return stepperZ2.homing_threshold()); - TERN_(Z3_SENSORLESS, case Z3: return stepperZ3.homing_threshold()); - TERN_(Z4_SENSORLESS, case Z4: return stepperZ4.homing_threshold()); + #if ENABLED(X_SENSORLESS) + case X: return stepperX.homing_threshold(); + #endif + #if ENABLED(X2_SENSORLESS) + case X2: return stepperX2.homing_threshold(); + #endif + #if ENABLED(Y_SENSORLESS) + case Y: return stepperY.homing_threshold(); + #endif + #if ENABLED(Y2_SENSORLESS) + case Y2: return stepperY2.homing_threshold(); + #endif + #if ENABLED(Z_SENSORLESS) + case Z: return stepperZ.homing_threshold(); + #endif + #if ENABLED(Z2_SENSORLESS) + case Z2: return stepperZ2.homing_threshold(); + #endif + #if ENABLED(Z3_SENSORLESS) + case Z3: return stepperZ3.homing_threshold(); + #endif + #if ENABLED(Z4_SENSORLESS) + case Z4: return stepperZ4.homing_threshold(); + #endif default: return 0; } } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 88566713a4..0be30efad8 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -688,7 +688,9 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { xyze_pos_t ManualMove::all_axes_destination = { 0 }; bool ManualMove::processing = false; #endif - TERN_(MULTI_MANUAL, int8_t ManualMove::e_index = 0); + #if ENABLED(MULTI_MANUAL) + int8_t ManualMove::e_index = 0; + #endif AxisEnum ManualMove::axis = NO_AXIS; /** diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index a18a3384af..490d78401e 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -105,9 +105,15 @@ #if PREHEAT_COUNT typedef struct { - TERN_(HAS_HOTEND, celsius_t hotend_temp); - TERN_(HAS_HEATED_BED, celsius_t bed_temp ); - TERN_(HAS_FAN, uint16_t fan_speed ); + #if ENABLED(HAS_HOTEND) + celsius_t hotend_temp; + #endif + #if ENABLED(HAS_HEATED_BED) + celsius_t bed_temp; + #endif + #if ENABLED(HAS_FAN) + uint16_t fan_speed; + #endif } preheat_t; #endif @@ -123,10 +129,14 @@ static int8_t constexpr e_index = 0; #endif static millis_t start_time; - TERN_(IS_KINEMATIC, static xyze_pos_t all_axes_destination); + #if ENABLED(IS_KINEMATIC) + static xyze_pos_t all_axes_destination; + #endif public: static float menu_scale; - TERN_(IS_KINEMATIC, static float offset); + #if ENABLED(IS_KINEMATIC) + static float offset; + #endif template void set_destination(const T& dest) { #if IS_KINEMATIC diff --git a/Marlin/src/lcd/menu/game/game.h b/Marlin/src/lcd/menu/game/game.h index cba79e4f28..999aa78100 100644 --- a/Marlin/src/lcd/menu/game/game.h +++ b/Marlin/src/lcd/menu/game/game.h @@ -53,10 +53,18 @@ // Pool game data to save SRAM union MarlinGameData { - TERN_(MARLIN_BRICKOUT, brickout_data_t brickout); - TERN_(MARLIN_INVADERS, invaders_data_t invaders); - TERN_(MARLIN_SNAKE, snake_data_t snake); - TERN_(MARLIN_MAZE, maze_data_t maze); + #if ENABLED(MARLIN_BRICKOUT) + brickout_data_t brickout; + #endif + #if ENABLED(MARLIN_INVADERS) + invaders_data_t invaders; + #endif + #if ENABLED(MARLIN_SNAKE) + snake_data_t snake; + #endif + #if ENABLED(MARLIN_MAZE) + maze_data_t maze; + #endif }; extern MarlinGameData marlin_game_data; diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index a86ae74fce..ef9f2246c2 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -119,7 +119,9 @@ void lcd_delta_settings() { } void menu_delta_calibrate() { - TERN_(DELTA_CALIBRATION_MENU, const bool all_homed = all_axes_homed()); // Acquire ahead of loop + #if ENABLED(DELTA_CALIBRATION_MENU) + const bool all_homed = all_axes_homed(); // Acquire ahead of loop + #endif START_MENU(); BACK_ITEM(MSG_MAIN); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 3b3fa0fd2a..1d62ada327 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -42,7 +42,9 @@ // Global storage float z_offset_backup, calculated_z_offset, z_offset_ref; -TERN_(HAS_LEVELING, bool leveling_was_active); +#if ENABLED(HAS_LEVELING) + bool leveling_was_active; +#endif inline void z_clearance_move() { do_z_clearance( diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 4277e8d8d0..c56f45c70b 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -46,7 +46,9 @@ Nozzle nozzle; * @param strokes number of strokes to execute */ void Nozzle::stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) { - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t oldpos = current_position); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const xyz_pos_t oldpos = current_position; + #endif // Move to the starting point #if ENABLED(NOZZLE_CLEAN_NO_Z) @@ -86,7 +88,9 @@ Nozzle nozzle; const xy_pos_t diff = end - start; if (!diff.x || !diff.y) return; - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t back = current_position); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const xyz_pos_t back = current_position; + #endif #if ENABLED(NOZZLE_CLEAN_NO_Z) do_blocking_move_to_xy(start); @@ -129,7 +133,9 @@ Nozzle nozzle; void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) { if (strokes == 0) return; - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t back = current_position); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const xyz_pos_t back = current_position; + #endif TERN(NOZZLE_CLEAN_NO_Z, do_blocking_move_to_xy, do_blocking_move_to)(start); LOOP_L_N(s, strokes) diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index c0cc9cdb8e..13e814aa1f 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -46,9 +46,15 @@ class Endstops { public: #if HAS_EXTRA_ENDSTOPS typedef uint16_t esbits_t; - TERN_(X_DUAL_ENDSTOPS, static float x2_endstop_adj); - TERN_(Y_DUAL_ENDSTOPS, static float y2_endstop_adj); - TERN_(Z_MULTI_ENDSTOPS, static float z2_endstop_adj); + #if ENABLED(X_DUAL_ENDSTOPS) + static float x2_endstop_adj; + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + static float y2_endstop_adj; + #endif + #if ENABLED(Z_MULTI_ENDSTOPS) + static float z2_endstop_adj; + #endif #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 static float z3_endstop_adj; #endif diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 8c320925be..84c93e5296 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2019,9 +2019,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Bail if this is a zero-length block if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return false; - #if ENABLED(MIXING_EXTRUDER) - MIXER_POPULATE_BLOCK(); - #endif + TERN_(MIXING_EXTRUDER, mixer.populate_block(block->b_color)) TERN_(HAS_CUTTER, block->cutter_power = cutter.power); diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 769967d4a6..24c814e851 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -170,7 +170,9 @@ typedef struct block_t { static constexpr uint8_t extruder = 0; #endif - TERN_(MIXING_EXTRUDER, MIXER_BLOCK_FIELD); // Normalized color for the mixing steppers + #if ENABLED(MIXING_EXTRUDER) + mixer_comp_t b_color[MIXING_STEPPERS]; // Normalized color for the mixing steppers + #endif // Settings for the trapezoid generator uint32_t accelerate_until, // The index of the step event on which to stop acceleration diff --git a/Marlin/src/module/servo.cpp b/Marlin/src/module/servo.cpp index 27e5a2af2e..9b71dd390f 100644 --- a/Marlin/src/module/servo.cpp +++ b/Marlin/src/module/servo.cpp @@ -32,7 +32,9 @@ HAL_SERVO_LIB servo[NUM_SERVOS]; -TERN_(EDITABLE_SERVO_ANGLES, uint16_t servo_angles[NUM_SERVOS][2]); +#if ENABLED(EDITABLE_SERVO_ANGLES) + uint16_t servo_angles[NUM_SERVOS][2]; +#endif void servo_init() { #if NUM_SERVOS >= 1 && HAS_SERVO_0 diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 466f4f333a..77fa6539bc 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2130,9 +2130,7 @@ uint32_t Stepper::block_phase_isr() { accelerate_until = current_block->accelerate_until << oversampling; decelerate_after = current_block->decelerate_after << oversampling; - #if ENABLED(MIXING_EXTRUDER) - MIXER_STEPPER_SETUP(); - #endif + TERN_(MIXING_EXTRUDER, mixer.stepper_setup(current_block->b_color)) TERN_(HAS_MULTI_EXTRUDER, stepper_extruder = current_block->extruder); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index c9e3575257..8092f1f7e2 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -326,14 +326,28 @@ class Temperature { static const celsius_t hotend_maxtemp[HOTENDS]; FORCE_INLINE static celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } #endif - TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); - TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); - TERN_(HAS_TEMP_CHAMBER, static chamber_info_t temp_chamber); - TERN_(HAS_TEMP_COOLER, static cooler_info_t temp_cooler); + #if ENABLED(HAS_HEATED_BED) + static bed_info_t temp_bed; + #endif + #if ENABLED(HAS_TEMP_PROBE) + static probe_info_t temp_probe; + #endif + #if ENABLED(HAS_TEMP_CHAMBER) + static chamber_info_t temp_chamber; + #endif + #if ENABLED(HAS_TEMP_COOLER) + static cooler_info_t temp_cooler; + #endif - TERN_(AUTO_POWER_E_FANS, static uint8_t autofan_speed[HOTENDS]); - TERN_(AUTO_POWER_CHAMBER_FAN, static uint8_t chamberfan_speed); - TERN_(AUTO_POWER_COOLER_FAN, static uint8_t coolerfan_speed); + #if ENABLED(AUTO_POWER_E_FANS) + static uint8_t autofan_speed[HOTENDS]; + #endif + #if ENABLED(AUTO_POWER_CHAMBER_FAN) + static uint8_t chamberfan_speed; + #endif + #if ENABLED(AUTO_POWER_COOLER_FAN) + static uint8_t coolerfan_speed; + #endif #if ENABLED(FAN_SOFT_PWM) static uint8_t soft_pwm_amount_fan[FAN_COUNT], @@ -403,11 +417,15 @@ class Temperature { private: - TERN_(EARLY_WATCHDOG, static bool inited); // If temperature controller is running + #if ENABLED(EARLY_WATCHDOG) + static bool inited; // If temperature controller is running + #endif static volatile bool raw_temps_ready; - TERN_(WATCH_HOTENDS, static hotend_watch_t watch_hotend[HOTENDS]); + #if ENABLED(WATCH_HOTENDS) + static hotend_watch_t watch_hotend[HOTENDS]; + #endif #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) static uint16_t redundant_temperature_raw; @@ -419,22 +437,30 @@ class Temperature { static lpq_ptr_t lpq_ptr; #endif - TERN_(HAS_HOTEND, static temp_range_t temp_range[HOTENDS]); + #if ENABLED(HAS_HOTEND) + static temp_range_t temp_range[HOTENDS]; + #endif #if HAS_HEATED_BED - TERN_(WATCH_BED, static bed_watch_t watch_bed); + #if ENABLED(WATCH_BED) + static bed_watch_t watch_bed; + #endif IF_DISABLED(PIDTEMPBED, static millis_t next_bed_check_ms); static int16_t mintemp_raw_BED, maxtemp_raw_BED; #endif #if HAS_HEATED_CHAMBER - TERN_(WATCH_CHAMBER, static chamber_watch_t watch_chamber); + #if ENABLED(WATCH_CHAMBER) + static chamber_watch_t watch_chamber; + #endif TERN(PIDTEMPCHAMBER,,static millis_t next_chamber_check_ms); static int16_t mintemp_raw_CHAMBER, maxtemp_raw_CHAMBER; #endif #if HAS_COOLER - TERN_(WATCH_COOLER, static cooler_watch_t watch_cooler); + #if ENABLED(WATCH_COOLER) + static cooler_watch_t watch_cooler; + #endif static millis_t next_cooler_check_ms, cooler_fan_flush_ms; static int16_t mintemp_raw_COOLER, maxtemp_raw_COOLER; #endif @@ -447,9 +473,13 @@ class Temperature { static millis_t preheat_end_time[HOTENDS]; #endif - TERN_(HAS_AUTO_FAN, static millis_t next_auto_fan_check_ms); + #if ENABLED(HAS_AUTO_FAN) + static millis_t next_auto_fan_check_ms; + #endif - TERN_(PROBING_HEATERS_OFF, static bool paused); + #if ENABLED(PROBING_HEATERS_OFF) + static bool paused; + #endif public: #if HAS_ADC_BUTTONS @@ -457,7 +487,9 @@ class Temperature { static uint16_t ADCKey_count; #endif - TERN_(PID_EXTRUSION_SCALING, static int16_t lpq_len); + #if ENABLED(PID_EXTRUSION_SCALING) + static int16_t lpq_len; + #endif /** * Instance Methods @@ -534,7 +566,9 @@ class Temperature { static constexpr inline uint8_t fanPercent(const uint8_t speed) { return ui8_to_percent(speed); } - TERN_(ADAPTIVE_FAN_SLOWING, static uint8_t fan_speed_scaler[FAN_COUNT]); + #if ENABLED(ADAPTIVE_FAN_SLOWING) + static uint8_t fan_speed_scaler[FAN_COUNT]; + #endif static inline uint8_t scaledFanSpeed(const uint8_t target, const uint8_t fs) { UNUSED(target); // Potentially unused! @@ -843,7 +877,9 @@ class Temperature { #endif #endif - TERN_(HAS_DISPLAY, static void set_heating_message(const uint8_t e)); + #if ENABLED(HAS_DISPLAY) + static void set_heating_message(const uint8_t e); + #endif #if HAS_LCD_MENU && HAS_TEMPERATURE static void lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb); @@ -866,9 +902,15 @@ class Temperature { static void checkExtruderAutoFans(); - TERN_(HAS_HOTEND, static float get_pid_output_hotend(const uint8_t e)); - TERN_(PIDTEMPBED, static float get_pid_output_bed()); - TERN_(PIDTEMPCHAMBER, static float get_pid_output_chamber()); + #if ENABLED(HAS_HOTEND) + static float get_pid_output_hotend(const uint8_t e); + #endif + #if ENABLED(PIDTEMPBED) + static float get_pid_output_bed(); + #endif + #if ENABLED(PIDTEMPCHAMBER) + static float get_pid_output_chamber(); + #endif static void _temp_error(const heater_id_t e, PGM_P const serial_msg, PGM_P const lcd_msg); static void min_temp_error(const heater_id_t e); diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 5361451c82..a97b09fd89 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -109,9 +109,11 @@ #endif -TERN_(ELECTROMAGNETIC_SWITCHING_TOOLHEAD, void est_init()); - -TERN_(SWITCHING_TOOLHEAD, void swt_init()); +#if ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + void est_init(); +#elif ENABLED(SWITCHING_TOOLHEAD) + void swt_init(); +#endif /** * Perform a tool-change, which may result in moving the diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index a3e0577031..53053e88dc 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -1084,7 +1084,9 @@ void CardReader::cdroot() { #if DISABLED(SDSORT_USES_RAM) selectFileByIndex(o1); // Pre-fetch the first entry and save it strcpy(name1, longest_filename()); // so the loop only needs one fetch - TERN_(HAS_FOLDER_SORTING, bool dir1 = flag.filenameIsDir); + #if ENABLED(HAS_FOLDER_SORTING) + bool dir1 = flag.filenameIsDir; + #endif #endif for (uint16_t j = 0; j < i; ++j) { From 5c8f7c7ea319d02223d291ead8a03ed815eb02c5 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Wed, 24 Mar 2021 13:32:08 +0100 Subject: [PATCH 1191/1370] Optimize MarlinSettings with template methods (#21426) --- Marlin/src/module/settings.cpp | 23 ++++++------------ Marlin/src/module/settings.h | 44 +++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index bf10902c60..d98ee3c218 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -572,13 +572,6 @@ void MarlinSettings::postprocess() { #if ENABLED(EEPROM_SETTINGS) - #define EEPROM_START() if (!persistentStore.access_start()) { SERIAL_ECHO_MSG("No EEPROM."); return false; } \ - int eeprom_index = EEPROM_OFFSET - #define EEPROM_FINISH() persistentStore.access_finish() - #define EEPROM_SKIP(VAR) (eeprom_index += sizeof(VAR)) - #define EEPROM_WRITE(VAR) do{ persistentStore.write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) - #define EEPROM_READ(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, !validating); }while(0) - #define EEPROM_READ_ALWAYS(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) #define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_MSG(ERR); eeprom_error = true; } }while(0) #if ENABLED(DEBUG_EEPROM_READWRITE) @@ -594,6 +587,8 @@ void MarlinSettings::postprocess() { const char version[4] = EEPROM_VERSION; bool MarlinSettings::eeprom_error, MarlinSettings::validating; + int MarlinSettings::eeprom_index; + uint16_t MarlinSettings::working_crc; bool MarlinSettings::size_error(const uint16_t size) { if (size != datasize()) { @@ -610,9 +605,7 @@ void MarlinSettings::postprocess() { float dummyf = 0; char ver[4] = "ERR"; - uint16_t working_crc = 0; - - EEPROM_START(); + if (!EEPROM_START(EEPROM_OFFSET)) return false; eeprom_error = false; @@ -1456,9 +1449,7 @@ void MarlinSettings::postprocess() { * M501 - Retrieve Configuration */ bool MarlinSettings::_load() { - uint16_t working_crc = 0; - - EEPROM_START(); + if (!EEPROM_START(EEPROM_OFFSET)) return false; char stored_ver[4]; EEPROM_READ_ALWAYS(stored_ver); @@ -1496,10 +1487,10 @@ void MarlinSettings::postprocess() { uint32_t tmp1[XYZ + esteppers]; float tmp2[XYZ + esteppers]; feedRate_t tmp3[XYZ + esteppers]; - EEPROM_READ(tmp1); // max_acceleration_mm_per_s2 + EEPROM_READ((uint8_t *)tmp1, sizeof(tmp1)); // max_acceleration_mm_per_s2 EEPROM_READ(planner.settings.min_segment_time_us); - EEPROM_READ(tmp2); // axis_steps_per_mm - EEPROM_READ(tmp3); // max_feedrate_mm_s + EEPROM_READ((uint8_t *)tmp2, sizeof(tmp2)); // axis_steps_per_mm + EEPROM_READ((uint8_t *)tmp3, sizeof(tmp3)); // max_feedrate_mm_s if (!validating) LOOP_XYZE_N(i) { const bool in = (i < esteppers + XYZ); diff --git a/Marlin/src/module/settings.h b/Marlin/src/module/settings.h index b213de93a4..967d49c073 100644 --- a/Marlin/src/module/settings.h +++ b/Marlin/src/module/settings.h @@ -76,12 +76,15 @@ class MarlinSettings { //static void delete_mesh(); // necessary if we have a MAT //static void defrag_meshes(); // " #endif - #else + + #else // !EEPROM_SETTINGS + FORCE_INLINE static bool load() { reset(); report(); return true; } FORCE_INLINE static void first_load() { (void)load(); } - #endif + + #endif // !EEPROM_SETTINGS #if DISABLED(DISABLE_M503) static void report(const bool forReplay=false); @@ -105,7 +108,42 @@ class MarlinSettings { static bool _load(); static bool size_error(const uint16_t size); - #endif + + static int eeprom_index; + static uint16_t working_crc; + + static bool EEPROM_START(int eeprom_offset) { + if (!persistentStore.access_start()) { SERIAL_ECHO_MSG("No EEPROM."); return false; } + eeprom_index = eeprom_offset; + working_crc = 0; + return true; + } + + static void EEPROM_FINISH(void) { persistentStore.access_finish(); } + + template + static void EEPROM_SKIP(const T &VAR) { eeprom_index += sizeof(VAR); } + + template + static void EEPROM_WRITE(const T &VAR) { + persistentStore.write_data(eeprom_index, (const uint8_t *) &VAR, sizeof(VAR), &working_crc); + } + + template + static void EEPROM_READ(T &VAR) { + persistentStore.read_data(eeprom_index, (uint8_t *) &VAR, sizeof(VAR), &working_crc, !validating); + } + + static void EEPROM_READ(uint8_t *VAR, size_t sizeof_VAR) { + persistentStore.read_data(eeprom_index, VAR, sizeof_VAR, &working_crc, !validating); + } + + template + static void EEPROM_READ_ALWAYS(T &VAR) { + persistentStore.read_data(eeprom_index, (uint8_t *) &VAR, sizeof(VAR), &working_crc); + } + + #endif // EEPROM_SETTINGS }; extern MarlinSettings settings; From 375404290d5c78d1781e6158b868257d50512b3c Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Wed, 24 Mar 2021 13:45:43 +0100 Subject: [PATCH 1192/1370] Update Anet V1.0 display timing (#21425) --- Marlin/src/pins/sanguino/pins_ANET_10.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index fb1b6dbb3c..ac8fa80eb8 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -191,7 +191,7 @@ #define BTN_EN1 11 #define BTN_EN2 10 #define BTN_ENC 16 - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #define BOARD_ST7920_DELAY_2 DELAY_NS(63) #define BOARD_ST7920_DELAY_3 DELAY_NS(125) #endif From e087271d48a033edb9fdeb5094ae704e367aebf7 Mon Sep 17 00:00:00 2001 From: kpishere Date: Wed, 24 Mar 2021 10:14:11 -0400 Subject: [PATCH 1193/1370] Misc build fixes (#21413) Co-authored-by: Scott Lahteine --- Marlin/src/core/bug_on.h | 3 ++- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 2 +- Marlin/src/pins/ramps/pins_RAMPS.h | 7 ++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h index 8869be8d28..dc32f0385a 100644 --- a/Marlin/src/core/bug_on.h +++ b/Marlin/src/core/bug_on.h @@ -30,7 +30,8 @@ #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) #elif ENABLED(MARLIN_DEV_MODE) // Don't stop the CPU here, but at least dump the bug on the serial port - #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": BUG!\n"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) + //#define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": BUG!\n"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) + #define BUG_ON(V...) NOOP #else // Release mode, let's ignore the bug #define BUG_ON(V...) NOOP diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index c16338a692..c4c6eb1423 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -98,7 +98,7 @@ void GcodeSuite::G29() { // For each G29 S2... if (mbl_probe_index == 0) { // Move close to the bed before the first point - do_blocking_move_to_z(0); + do_blocking_move_to_z(MANUAL_PROBE_START_Z); } else { // Save Z for the previous mesh position diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 805c92d71a..f30a235626 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -45,6 +45,10 @@ * 7 | 11 */ +#if ENABLED(AZSMZ_12864) && DISABLED(ALLOW_SAM3X8E) + #error "No pins defined for RAMPS with AZSMZ_12864." +#endif + #include "env_validate.h" // Custom flags and defines for the build @@ -720,9 +724,6 @@ #elif ENABLED(AZSMZ_12864) // Pins only defined for RAMPS_SMART currently - #if DISABLED(IS_RAMPS_SMART) - #error "No pins defined for RAMPS with AZSMZ_12864." - #endif #elif IS_TFTGLCD_PANEL From 2a32d14dc4afd3c80aec45a3711706f255b5b8e2 Mon Sep 17 00:00:00 2001 From: ldursw <37294448+ldursw@users.noreply.github.com> Date: Wed, 24 Mar 2021 11:30:19 -0300 Subject: [PATCH 1194/1370] Fix SDIO buffer alignment (#21396) --- Marlin/src/feature/binary_stream.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index 80f26cc7ce..4bfa3998f1 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -39,7 +39,12 @@ inline int bs_read_serial(const serial_index_t index) { #if ENABLED(BINARY_STREAM_COMPRESSION) static heatshrink_decoder hsd; - static uint8_t decode_buffer[512] = {}; + #ifdef BOTH(ARDUINO_ARCH_STM32F1, SDIO_SUPPORT) + // STM32 requires a word-aligned buffer for SD card transfers via DMA + static __attribute__((aligned(sizeof(size_t)))) uint8_t decode_buffer[512] = {}; + #else + static uint8_t decode_buffer[512] = {}; + #endif #endif class SDFileTransferProtocol { From 3c9ffa77f984a9d41f9fc26ab66eac457b68abf0 Mon Sep 17 00:00:00 2001 From: Miguel Risco-Castillo Date: Wed, 24 Mar 2021 10:12:57 -0500 Subject: [PATCH 1195/1370] Ender 3 V2 Status Line (#21369) Co-authored-by: Scott Lahteine --- Marlin/src/MarlinCore.cpp | 3 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 10 ++--- Marlin/src/feature/cancel_object.cpp | 2 +- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 8 ++-- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 5 ++- Marlin/src/gcode/calibrate/G34_M422.cpp | 6 +-- Marlin/src/gcode/calibrate/M48.cpp | 4 +- Marlin/src/gcode/temp/M104_M109.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 9 ++++- Marlin/src/lcd/dwin/e3v2/dwin.h | 1 + Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/lcdprint.h | 1 - Marlin/src/lcd/marlinui.cpp | 41 ++++++++++++--------- Marlin/src/module/endstops.cpp | 4 +- Marlin/src/module/motion.cpp | 4 +- Marlin/src/module/temperature.cpp | 4 +- Marlin/src/module/temperature.h | 2 +- Marlin/src/module/tool_change.cpp | 2 +- 20 files changed, 66 insertions(+), 47 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 26ca8305f4..738f9a8d78 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -76,7 +76,6 @@ #if ENABLED(DWIN_CREALITY_LCD) #include "lcd/dwin/e3v2/dwin.h" - #include "lcd/dwin/dwin_lcd.h" #include "lcd/dwin/e3v2/rotary_encoder.h" #endif @@ -1476,7 +1475,9 @@ void setup() { #if ENABLED(DWIN_CREALITY_LCD) Encoder_Configuration(); HMI_Init(); + DWIN_JPG_CacheTo1(Language_English); HMI_StartFrame(true); + DWIN_StatusChanged(GET_TEXT(WELCOME_MSG)); #endif #if HAS_SERVICE_INTERVALS && DISABLED(DWIN_CREALITY_LCD) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 06b91002b8..c1f824714c 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -733,7 +733,7 @@ void unified_bed_leveling::shift_mesh_height() { const int point_num = (GRID_MAX_POINTS) - count + 1; SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); #if HAS_LCD_MENU if (ui.button_pressed()) { @@ -1440,7 +1440,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (do_3_pt_leveling) { SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, param.V_verbosity); if (isnan(measured_z)) @@ -1459,7 +1459,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (!abort_flag) { SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, param.V_verbosity); #ifdef VALIDATE_MESH_TILT @@ -1479,7 +1479,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (!abort_flag) { SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, param.V_verbosity); #ifdef VALIDATE_MESH_TILT @@ -1520,7 +1520,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (!abort_flag) { SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index e2e429ea10..1f92ac5843 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -43,7 +43,7 @@ void CancelObject::set_active_object(const int8_t obj) { else skipping = false; - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE if (active_object >= 0) ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object)); else diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 5f3338139a..a934b0ead0 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -652,7 +652,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Resume the print job timer if it was running if (print_job_timer.isPaused()) print_job_timer.start(); - TERN_(HAS_DISPLAY, ui.reset_status()); + TERN_(HAS_STATUS_MESSAGE, ui.reset_status()); TERN_(HAS_LCD_MENU, ui.return_to_status()); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index e642c1ccf2..a746b86108 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -41,7 +41,7 @@ #include "../../../module/temperature.h" #endif -#if HAS_DISPLAY +#if HAS_STATUS_MESSAGE #include "../../../lcd/marlinui.h" #endif @@ -638,7 +638,7 @@ G29_TYPE GcodeSuite::G29() { if (TERN0(IS_KINEMATIC, !probe.can_reach(probePos))) continue; if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", pt_index, "/", abl_points, "."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); @@ -683,7 +683,7 @@ G29_TYPE GcodeSuite::G29() { LOOP_L_N(i, 3) { if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", i + 1, "/3."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); // Retain the last probe position probePos = points[i]; @@ -706,7 +706,7 @@ G29_TYPE GcodeSuite::G29() { #endif // AUTO_BED_LEVELING_3POINT - TERN_(HAS_DISPLAY, ui.reset_status()); + TERN_(HAS_STATUS_MESSAGE, ui.reset_status()); // Stow the probe. No raise for FIX_MOUNTED_PROBE. if (probe.stow()) { diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index c4c6eb1423..278a39b4f8 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -122,6 +122,7 @@ void GcodeSuite::G29() { // After recording the last point, activate home and activate mbl_probe_index = -1; SERIAL_ECHOLNPGM("Mesh probing done."); + TERN_(HAS_STATUS_MESSAGE, ui.set_status(GET_TEXT(MSG_MESH_DONE))); BUZZ(100, 659); BUZZ(100, 698); @@ -180,8 +181,10 @@ void GcodeSuite::G29() { } // switch(state) - if (state == MeshNext) + if (state == MeshNext) { SERIAL_ECHOLNPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS), " of ", GRID_MAX_POINTS); + if (mbl_probe_index > 0) TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), _MIN(mbl_probe_index, GRID_MAX_POINTS), int(GRID_MAX_POINTS))); + } report_current_position(); } diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index d2075fedce..a97283b3e7 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -190,7 +190,7 @@ void GcodeSuite::G34() { bool adjustment_reverse = false; #endif - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION); const uint8_t iter_str_len = strlen_P(msg_iteration); #endif @@ -204,7 +204,7 @@ void GcodeSuite::G34() { const int iter = iteration + 1; SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter); - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE char str[iter_str_len + 2 + 1]; sprintf_P(str, msg_iteration, iter); ui.set_status(str); @@ -290,7 +290,7 @@ void GcodeSuite::G34() { , " Z3-Z1=", ABS(z_measured[2] - z_measured[0]) #endif ); - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE char fstr1[10]; #if NUM_Z_STEPPER_DRIVERS == 2 char msg[6 + (6 + 5) * 1 + 1]; diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 0c6176173c..0c3da13bf9 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -142,7 +142,7 @@ void GcodeSuite::M48() { float sample_sum = 0.0; LOOP_L_N(n, n_samples) { - #if HAS_WIRED_LCD + #if HAS_STATUS_MESSAGE // Display M48 progress in the status bar ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); #endif @@ -257,7 +257,7 @@ void GcodeSuite::M48() { SERIAL_ECHOLNPGM("Finished!"); dev_report(verbose_level > 0, mean, sigma, min, max, true); - #if HAS_WIRED_LCD + #if HAS_STATUS_MESSAGE // Display M48 results in the status bar char sigma_str[8]; ui.status_printf_P(0, PSTR(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str)); diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index fe1e834656..e54f784153 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -185,7 +185,7 @@ void GcodeSuite::M109() { thermalManager.auto_job_check_timer(true, true); #endif - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE if (thermalManager.isHeatingHotend(target_extruder) || !no_wait_for_cooling) thermalManager.set_heating_message(target_extruder); #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index fc83a1ff87..af902481f3 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -481,7 +481,7 @@ #endif #endif -#if EITHER(HAS_DISPLAY, GLOBAL_STATUS_MESSAGE) +#if ANY(HAS_DISPLAY, DWIN_CREALITY_LCD, GLOBAL_STATUS_MESSAGE) #define HAS_STATUS_MESSAGE 1 #endif diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index d543ff0508..87ad93cf1d 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -402,7 +402,7 @@ void Draw_Title(const __FlashStringHelper * title) { } void Clear_Menu_Area() { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y - 1); } void Clear_Main_Window() { @@ -3794,4 +3794,11 @@ void DWIN_CompletedLeveling() { if (checkkey == Leveling) Goto_MainMenu(); } +void DWIN_StatusChanged(const char *text) { + DWIN_Draw_Rectangle(1, Color_Bg_Blue, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20); + const int8_t x = _MAX(0U, DWIN_WIDTH - strlen_P(text) * MENU_CHR_W) / 2; + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Blue, x, STATUS_Y + 2, F(text)); + DWIN_UpdateLCD(); +} + #endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index dd2d1cbc01..7f7c007eed 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -377,6 +377,7 @@ void HMI_Init(); void DWIN_Update(); void EachMomentUpdate(); void DWIN_HandleScreen(); +void DWIN_StatusChanged(const char *text); inline void DWIN_StartHoming() { HMI_flag.home_flag = true; } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index a37f5aa790..78d446dd99 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -522,6 +522,7 @@ namespace Language_en { PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilinear Leveling"); PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mesh Leveling"); + PROGMEM Language_Str MSG_MESH_DONE = _UxGT("Mesh probing done"); PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Printer Stats"); PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board Info"); PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index b7732d3198..90ffa14ad1 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -105,7 +105,6 @@ #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_COL_X_RJ(len), LCD_ROW_Y(row)) #define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) #define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr) -#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) int lcd_glyph_height(); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 0be30efad8..4133e04832 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -44,9 +44,16 @@ MarlinUI ui; #include "../gcode/queue.h" #include "fontutils.h" #include "../sd/cardreader.h" - #if EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) - #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) - #endif +#endif + +#if ENABLED(DWIN_CREALITY_LCD) + #include "../module/printcounter.h" + #include "../MarlinCore.h" + #include "dwin/e3v2/dwin.h" +#endif + +#if HAS_STATUS_MESSAGE + #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) #endif #if LCD_HAS_WAIT_FOR_MOVE @@ -55,25 +62,24 @@ MarlinUI ui; constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; -#if HAS_WIRED_LCD - #if ENABLED(STATUS_MESSAGE_SCROLLING) - uint8_t MarlinUI::status_scroll_offset; // = 0 - constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)); +#if HAS_STATUS_MESSAGE + #if HAS_WIRED_LCD + #if ENABLED(STATUS_MESSAGE_SCROLLING) + uint8_t MarlinUI::status_scroll_offset; // = 0 + constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)); + #else + constexpr uint8_t MAX_MESSAGE_LENGTH = MAX_LANG_CHARSIZE * (LCD_WIDTH); + #endif #else - constexpr uint8_t MAX_MESSAGE_LENGTH = MAX_LANG_CHARSIZE * (LCD_WIDTH); + constexpr uint8_t MAX_MESSAGE_LENGTH = 63; #endif -#elif EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) - constexpr uint8_t MAX_MESSAGE_LENGTH = 63; -#endif - -#if EITHER(HAS_WIRED_LCD, EXTENSIBLE_UI) - uint8_t MarlinUI::alert_level; // = 0 char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1]; + uint8_t MarlinUI::alert_level; // = 0 #endif #if ENABLED(LCD_SET_PROGRESS_MANUALLY) MarlinUI::progress_t MarlinUI::progress_override; // = 0 - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + #if ENABLED(USE_M73_REMAINING_TIME) uint32_t MarlinUI::remaining_time; #endif #endif @@ -1461,6 +1467,7 @@ void MarlinUI::update() { #endif TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); + TERN_(DWIN_CREALITY_LCD, DWIN_StatusChanged(status_message)); } #if ENABLED(STATUS_MESSAGE_SCROLLING) @@ -1581,7 +1588,7 @@ void MarlinUI::update() { #endif -#else // !HAS_DISPLAY +#elif !HAS_STATUS_MESSAGE // && !HAS_DISPLAY // // Send the status line as a host notification @@ -1596,7 +1603,7 @@ void MarlinUI::update() { TERN(HOST_PROMPT_SUPPORT, host_action_notify_P(message), UNUSED(message)); } -#endif // !HAS_DISPLAY +#endif // !HAS_DISPLAY && !HAS_STATUS_MESSAGE #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 4192b444bb..e11c4605e4 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -360,7 +360,7 @@ void Endstops::event_handler() { if (hit_state == prev_hit_state) return; prev_hit_state = hit_state; if (hit_state) { - #if HAS_WIRED_LCD + #if HAS_STATUS_MESSAGE char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' '; #define _SET_STOP_CHAR(A,C) (chr## A = C) #else @@ -391,7 +391,7 @@ void Endstops::event_handler() { #endif SERIAL_EOL(); - TERN_(HAS_WIRED_LCD, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP)); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP)); #if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT) if (planner.abort_on_endstop_hit) { diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index b0a4890e07..28ad9cf761 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -51,7 +51,7 @@ #include "../feature/bltouch.h" #endif -#if HAS_DISPLAY +#if HAS_STATUS_MESSAGE #include "../lcd/marlinui.h" #endif @@ -1144,7 +1144,7 @@ void prepare_line_to_destination() { ); SERIAL_ECHO_START(); SERIAL_ECHOLN(msg); - TERN_(HAS_DISPLAY, ui.set_status(msg)); + TERN_(HAS_STATUS_MESSAGE, ui.set_status(msg)); return true; } return false; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 6d1f3bd0a3..da792db833 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2495,7 +2495,7 @@ void Temperature::disable_all_heaters() { if (singlenozzle_temp[new_tool] && singlenozzle_temp[new_tool] != singlenozzle_temp[old_tool]) { setTargetHotend(singlenozzle_temp[new_tool], 0); TERN_(AUTOTEMP, planner.autotemp_update()); - TERN_(HAS_DISPLAY, set_heating_message(0)); + TERN_(HAS_STATUS_MESSAGE, set_heating_message(0)); (void)wait_for_hotend(0, false); // Wait for heating or cooling } } @@ -3492,7 +3492,7 @@ void Temperature::tick() { } #endif - #if HAS_HOTEND && HAS_DISPLAY + #if HAS_HOTEND && HAS_STATUS_MESSAGE void Temperature::set_heating_message(const uint8_t e) { const bool heating = isHeatingHotend(e); ui.status_printf_P(0, diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 8092f1f7e2..ec603b5217 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -877,7 +877,7 @@ class Temperature { #endif #endif - #if ENABLED(HAS_DISPLAY) + #if HAS_STATUS_MESSAGE static void set_heating_message(const uint8_t e); #endif diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 0ed3d15b45..71dd6d40ec 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1262,7 +1262,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if HAS_MULTI_HOTEND thermalManager.setTargetHotend(thermalManager.temp_hotend[active_extruder].target, migration_extruder); TERN_(AUTOTEMP, planner.autotemp_update()); - TERN_(HAS_DISPLAY, thermalManager.set_heating_message(0)); + TERN_(HAS_STATUS_MESSAGE, thermalManager.set_heating_message(0)); thermalManager.wait_for_hotend(active_extruder); #endif From 05b281ad9e5ab2587c2aa62a33c5f260787be03f Mon Sep 17 00:00:00 2001 From: Bryan Hunwardsen Date: Wed, 24 Mar 2021 10:05:46 -0700 Subject: [PATCH 1196/1370] SKR E3 Mini V2.0 Fan Bug Fix (#21079) Co-authored-by: Scott Lahteine --- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h index af2821f809..c51e7f48d9 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h @@ -23,6 +23,8 @@ #define SKR_MINI_E3_V2 +#define BOARD_CUSTOM_BUILD_FLAGS -DTONE_CHANNEL=4 -DTONE_TIMER=4 + // Onboard I2C EEPROM #if NO_EEPROM_SELECTED #define I2C_EEPROM From 98a6015d3a535860fd2241e4dd84102c672e94b9 Mon Sep 17 00:00:00 2001 From: Martijn Bosgraaf Date: Wed, 24 Mar 2021 18:21:11 +0100 Subject: [PATCH 1197/1370] Extend M106/M107 for better laser module support (#16082) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 12 ++ Marlin/src/gcode/temp/M106_M107.cpp | 18 ++- Marlin/src/inc/SanityCheck.h | 11 ++ Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 4 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- Marlin/src/lcd/marlinui.cpp | 29 ++-- Marlin/src/lcd/marlinui.h | 2 + Marlin/src/module/planner.cpp | 143 +++++++++++------- Marlin/src/module/planner.h | 27 +++- Marlin/src/module/stepper.cpp | 15 +- Marlin/src/module/temperature.cpp | 2 +- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 6 +- .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 6 +- buildroot/tests/ARMED | 1 + 14 files changed, 189 insertions(+), 89 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 328056cb84..a7af076155 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3217,6 +3217,18 @@ #endif #endif +/** + * Synchronous Laser Control with M106/M107 + * + * Marlin normally applies M106/M107 fan speeds at a time "soon after" processing + * a planner block. This is too inaccurate for a PWM/TTL laser attached to the fan + * header (as with some add-on laser kits). Enable this option to set fan/laser + * speeds with much more exact timing for improved print fidelity. + * + * NOTE: This option sacrifices some cooling fan speed options. + */ +//#define LASER_SYNCHRONOUS_M106_M107 + /** * Coolant Control * diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index b7d64c99ea..3ce08aafb6 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -28,6 +28,10 @@ #include "../../module/motion.h" #include "../../module/temperature.h" +#if ENABLED(LASER_SYNCHRONOUS_M106_M107) + #include "../../module/planner.h" +#endif + #if PREHEAT_COUNT #include "../../lcd/marlinui.h" #endif @@ -82,6 +86,8 @@ void GcodeSuite::M106() { // Set speed, with constraint thermalManager.set_fan_speed(pfan, speed); + TERN_(LASER_SYNCHRONOUS_M106_M107, planner.buffer_sync_block(BLOCK_FLAG_SYNC_FANS)); + if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating thermalManager.set_fan_speed(1 - pfan, speed); } @@ -92,12 +98,14 @@ void GcodeSuite::M106() { */ void GcodeSuite::M107() { const uint8_t pfan = parser.byteval('P', _ALT_P); - if (pfan < _CNT_P) { - thermalManager.set_fan_speed(pfan, 0); + if (pfan >= _CNT_P) return; - if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating - thermalManager.set_fan_speed(1 - pfan, 0); - } + thermalManager.set_fan_speed(pfan, 0); + + if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating + thermalManager.set_fan_speed(1 - pfan, 0); + + TERN_(LASER_SYNCHRONOUS_M106_M107, planner.buffer_sync_block(BLOCK_FLAG_SYNC_FANS)); } #endif // HAS_FAN diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index a7f726c4b2..704163e2b2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1217,6 +1217,17 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED." #endif +/** + * Synchronous M106/M107 checks + */ +#if ENABLED(LASER_SYNCHRONOUS_M106_M107) + #if FAN_KICKSTART_TIME + #error "FAN_KICKSTART_TIME must be 0 with LASER_SYNCHRONOUS_M106_M107 (because the laser will always come on at FULL power)." + #elif FAN_MIN_PWM + #error "FAN_MIN_PWM must be 0 with LASER_SYNCHRONOUS_M106_M107 (otherwise the laser will never turn OFF)." + #endif +#endif + /** * Chamber Heating Options - PID vs Limit Switching */ diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index fd72f94862..e645a76611 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -760,7 +760,7 @@ void MarlinUI::draw_status_screen() { #endif #endif // HAS_HEATED_BED - #if FAN_COUNT > 0 + #if HAS_FAN uint16_t spd = thermalManager.fan_speed[0]; #if ENABLED(ADAPTIVE_FAN_SLOWING) @@ -783,7 +783,7 @@ void MarlinUI::draw_status_screen() { else picBits &= ~ICON_FAN; - #endif // FAN_COUNT > 0 + #endif // HAS_FAN // // Line 9, 10 - icons diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 87ad93cf1d..b86e7cbe60 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -2152,7 +2152,7 @@ void HMI_SelectFile() { card.openAndPrintFile(card.filename); - #if FAN_COUNT > 0 + #if HAS_FAN // All fans on for Ender 3 v2 ? // The slicer should manage this for us. //for (uint8_t i = 0; i < FAN_COUNT; i++) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 4133e04832..8fef36e25a 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -22,6 +22,8 @@ #include "../inc/MarlinConfig.h" +#include "../MarlinCore.h" // for printingIsPaused + #ifdef LED_BACKLIGHT_TIMEOUT #include "../feature/leds/leds.h" #endif @@ -39,21 +41,21 @@ MarlinUI ui; #if HAS_DISPLAY - #include "../module/printcounter.h" - #include "../MarlinCore.h" #include "../gcode/queue.h" #include "fontutils.h" #include "../sd/cardreader.h" #endif #if ENABLED(DWIN_CREALITY_LCD) - #include "../module/printcounter.h" - #include "../MarlinCore.h" #include "dwin/e3v2/dwin.h" #endif -#if HAS_STATUS_MESSAGE - #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) +#if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL + #define BASIC_PROGRESS_BAR 1 +#endif + +#if ANY(HAS_DISPLAY, HAS_STATUS_MESSAGE, BASIC_PROGRESS_BAR) + #include "../module/printcounter.h" #endif #if LCD_HAS_WAIT_FOR_MOVE @@ -535,7 +537,7 @@ bool MarlinUI::get_blink() { * This is very display-dependent, so the lcd implementation draws this. */ -#if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL +#if BASIC_PROGRESS_BAR millis_t MarlinUI::progress_bar_ms; // = 0 #if PROGRESS_MSG_EXPIRE > 0 millis_t MarlinUI::expire_status_ms; // = 0 @@ -546,7 +548,7 @@ void MarlinUI::status_screen() { TERN_(HAS_LCD_MENU, ENCODER_RATE_MULTIPLY(false)); - #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL + #if BASIC_PROGRESS_BAR // // HD44780 implements the following message blinking and @@ -586,7 +588,7 @@ void MarlinUI::status_screen() { #endif // PROGRESS_MSG_EXPIRE - #endif // LCD_PROGRESS_BAR + #endif // BASIC_PROGRESS_BAR #if HAS_LCD_MENU if (use_click()) { @@ -1353,6 +1355,7 @@ void MarlinUI::update() { /** * Reset the status message */ + void MarlinUI::reset_status(const bool no_welcome) { #if SERVICE_INTERVAL_1 > 0 static PGMSTR(service1, "> " SERVICE_NAME_1 "!"); @@ -1438,9 +1441,9 @@ void MarlinUI::update() { void MarlinUI::finish_status(const bool persist) { - #if HAS_SPI_LCD + #if HAS_WIRED_LCD - #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE) > 0) + #if !(BASIC_PROGRESS_BAR && (PROGRESS_MSG_EXPIRE) > 0) UNUSED(persist); #endif @@ -1448,7 +1451,7 @@ void MarlinUI::update() { const millis_t ms = millis(); #endif - #if ENABLED(LCD_PROGRESS_BAR) + #if BASIC_PROGRESS_BAR progress_bar_ms = ms; #if PROGRESS_MSG_EXPIRE > 0 expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; @@ -1462,7 +1465,7 @@ void MarlinUI::update() { #if ENABLED(STATUS_MESSAGE_SCROLLING) status_scroll_offset = 0; #endif - #else // HAS_SPI_LCD + #else // HAS_WIRED_LCD UNUSED(persist); #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 490d78401e..cc08284d17 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -56,6 +56,8 @@ #include "../module/motion.h" // for active_extruder #endif +#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) + #if HAS_WIRED_LCD enum LCDViewAction : uint8_t { diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 84c93e5296..b20d1e273b 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1015,8 +1015,8 @@ void Planner::reverse_pass() { // Perform the reverse pass block_t *current = &block_buffer[block_index]; - // Only consider non sync and page blocks - if (!TEST(current->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(current)) { + // Only consider non sync-and-page blocks + if (!(current->flag & BLOCK_MASK_SYNC) && !IS_PAGE(current)) { reverse_pass_kernel(current, next); next = current; } @@ -1111,7 +1111,7 @@ void Planner::forward_pass() { block = &block_buffer[block_index]; // Skip SYNC and page blocks - if (!TEST(block->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(block)) { + if (!(block->flag & BLOCK_MASK_SYNC) && !IS_PAGE(block)) { // If there's no previous block or the previous block is not // BUSY (thus, modifiable) run the forward_pass_kernel. Otherwise, // the previous block became BUSY, so assume the current block's @@ -1147,7 +1147,7 @@ void Planner::recalculate_trapezoids() { block_t *prev = &block_buffer[prev_index]; // If not dealing with a sync block, we are done. The last block is not a SYNC block - if (!TEST(prev->flag, BLOCK_BIT_SYNC_POSITION)) break; + if (!(prev->flag & BLOCK_MASK_SYNC)) break; // Examine the previous block. This and all following are SYNC blocks head_block_index = prev_index; @@ -1161,7 +1161,7 @@ void Planner::recalculate_trapezoids() { next = &block_buffer[block_index]; // Skip sync and page blocks - if (!TEST(next->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(next)) { + if (!(next->flag & BLOCK_MASK_SYNC) && !IS_PAGE(next)) { next_entry_speed = SQRT(next->entry_speed_sqr); if (block) { @@ -1248,6 +1248,63 @@ void Planner::recalculate() { recalculate_trapezoids(); } +#if HAS_FAN && DISABLED(LASER_SYNCHRONOUS_M106_M107) + #define HAS_TAIL_FAN_SPEED 1 +#endif + +/** + * Apply fan speeds + */ +#if HAS_FAN + + void Planner::sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]) { + + #if FAN_MIN_PWM != 0 || FAN_MAX_PWM != 255 + #define CALC_FAN_SPEED(f) (fan_speed[f] ? map(fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) + #else + #define CALC_FAN_SPEED(f) (fan_speed[f] ?: FAN_OFF_PWM) + #endif + + #if ENABLED(FAN_SOFT_PWM) + #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(F); + #elif ENABLED(FAST_PWM_FAN) + #define _FAN_SET(F) set_pwm_duty(FAN##F##_PIN, CALC_FAN_SPEED(F)); + #else + #define _FAN_SET(F) analogWrite(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F)); + #endif + #define FAN_SET(F) do{ kickstart_fan(fan_speed, ms, F); _FAN_SET(F); }while(0) + + const millis_t ms = millis(); + TERN_(HAS_FAN0, FAN_SET(0)); + TERN_(HAS_FAN1, FAN_SET(1)); + TERN_(HAS_FAN2, FAN_SET(2)); + TERN_(HAS_FAN3, FAN_SET(3)); + TERN_(HAS_FAN4, FAN_SET(4)); + TERN_(HAS_FAN5, FAN_SET(5)); + TERN_(HAS_FAN6, FAN_SET(6)); + TERN_(HAS_FAN7, FAN_SET(7)); + } + + #if FAN_KICKSTART_TIME + + void Planner::kickstart_fan(uint8_t (&fan_speed)[FAN_COUNT], const millis_t &ms, const uint8_t f) { + static millis_t fan_kick_end[FAN_COUNT] = { 0 }; + if (fan_speed[f]) { + if (fan_kick_end[f] == 0) { + fan_kick_end[f] = ms + FAN_KICKSTART_TIME; + fan_speed[f] = 255; + } + else if (PENDING(ms, fan_kick_end[f])) + fan_speed[f] = 255; + } + else + fan_kick_end[f] = 0; + } + + #endif + +#endif // HAS_FAN + /** * Maintain fans, paste extruder pressure, */ @@ -1257,7 +1314,7 @@ void Planner::check_axes_activity() { xyze_bool_t axis_active = { false }; #endif - #if HAS_FAN + #if HAS_TAIL_FAN_SPEED uint8_t tail_fan_speed[FAN_COUNT]; #endif @@ -1272,13 +1329,12 @@ void Planner::check_axes_activity() { if (has_blocks_queued()) { - #if HAS_FAN || ENABLED(BARICUDA) + #if EITHER(HAS_TAIL_FAN_SPEED, BARICUDA) block_t *block = &block_buffer[block_buffer_tail]; #endif - #if HAS_FAN - FANS_LOOP(i) - tail_fan_speed[i] = thermalManager.scaledFanSpeed(i, block->fan_speed[i]); + #if HAS_TAIL_FAN_SPEED + FANS_LOOP(i) tail_fan_speed[i] = thermalManager.scaledFanSpeed(i, block->fan_speed[i]); #endif #if ENABLED(BARICUDA) @@ -1300,9 +1356,8 @@ void Planner::check_axes_activity() { TERN_(HAS_CUTTER, cutter.refresh()); - #if HAS_FAN - FANS_LOOP(i) - tail_fan_speed[i] = thermalManager.scaledFanSpeed(i); + #if HAS_TAIL_FAN_SPEED + FANS_LOOP(i) tail_fan_speed[i] = thermalManager.scaledFanSpeed(i); #endif #if ENABLED(BARICUDA) @@ -1321,48 +1376,11 @@ void Planner::check_axes_activity() { // // Update Fan speeds + // Only if synchronous M106/M107 is disabled // - #if HAS_FAN - - #if FAN_KICKSTART_TIME > 0 - static millis_t fan_kick_end[FAN_COUNT] = { 0 }; - #define KICKSTART_FAN(f) \ - if (tail_fan_speed[f]) { \ - millis_t ms = millis(); \ - if (fan_kick_end[f] == 0) { \ - fan_kick_end[f] = ms + FAN_KICKSTART_TIME; \ - tail_fan_speed[f] = 255; \ - } else if (PENDING(ms, fan_kick_end[f])) \ - tail_fan_speed[f] = 255; \ - } else fan_kick_end[f] = 0 - #else - #define KICKSTART_FAN(f) NOOP - #endif - - #if FAN_MIN_PWM != 0 || FAN_MAX_PWM != 255 - #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? map(tail_fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) - #else - #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ?: FAN_OFF_PWM) - #endif - - #if ENABLED(FAN_SOFT_PWM) - #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(F); - #elif ENABLED(FAST_PWM_FAN) - #define _FAN_SET(F) set_pwm_duty(FAN##F##_PIN, CALC_FAN_SPEED(F)); - #else - #define _FAN_SET(F) analogWrite(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F)); - #endif - #define FAN_SET(F) do{ KICKSTART_FAN(F); _FAN_SET(F); }while(0) - - TERN_(HAS_FAN0, FAN_SET(0)); - TERN_(HAS_FAN1, FAN_SET(1)); - TERN_(HAS_FAN2, FAN_SET(2)); - TERN_(HAS_FAN3, FAN_SET(3)); - TERN_(HAS_FAN4, FAN_SET(4)); - TERN_(HAS_FAN5, FAN_SET(5)); - TERN_(HAS_FAN6, FAN_SET(6)); - TERN_(HAS_FAN7, FAN_SET(7)); - #endif // HAS_FAN + #if HAS_TAIL_FAN_SPEED + sync_fan_speeds(tail_fan_speed); + #endif TERN_(AUTOTEMP, getHighESpeed()); @@ -2675,9 +2693,14 @@ bool Planner::_populate_block(block_t * const block, bool split_move, /** * Planner::buffer_sync_block - * Add a block to the buffer that just updates the position + * Add a block to the buffer that just updates the position, + * or in case of LASER_SYNCHRONOUS_M106_M107 the fan PWM */ -void Planner::buffer_sync_block() { +void Planner::buffer_sync_block(TERN_(LASER_SYNCHRONOUS_M106_M107, uint8_t sync_flag)) { + #if DISABLED(LASER_SYNCHRONOUS_M106_M107) + constexpr uint8_t sync_flag = BLOCK_FLAG_SYNC_POSITION; + #endif + // Wait for the next available block uint8_t next_buffer_head; block_t * const block = get_next_free_block(next_buffer_head); @@ -2685,10 +2708,14 @@ void Planner::buffer_sync_block() { // Clear block memset(block, 0, sizeof(block_t)); - block->flag = BLOCK_FLAG_SYNC_POSITION; + block->flag = sync_flag; block->position = position; + #if BOTH(HAS_FAN, LASER_SYNCHRONOUS_M106_M107) + FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; + #endif + // If this is the first added movement, reload the delay, otherwise, cancel it. if (block_buffer_head == block_buffer_tail) { // If it was the first queued block, restart the 1st block delivery delay, to @@ -2876,7 +2903,7 @@ bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, con block->flag = BLOCK_FLAG_IS_PAGE; - #if FAN_COUNT > 0 + #if HAS_FAN FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; #endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 24c814e851..da9e202cdf 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -102,6 +102,11 @@ enum BlockFlagBit : char { #if ENABLED(DIRECT_STEPPING) , BLOCK_BIT_IS_PAGE #endif + + // Sync the fan speeds from the block + #if ENABLED(LASER_SYNCHRONOUS_M106_M107) + , BLOCK_BIT_SYNC_FANS + #endif }; enum BlockFlag : char { @@ -112,8 +117,13 @@ enum BlockFlag : char { #if ENABLED(DIRECT_STEPPING) , BLOCK_FLAG_IS_PAGE = _BV(BLOCK_BIT_IS_PAGE) #endif + #if ENABLED(LASER_SYNCHRONOUS_M106_M107) + , BLOCK_FLAG_SYNC_FANS = _BV(BLOCK_BIT_SYNC_FANS) + #endif }; +#define BLOCK_MASK_SYNC ( BLOCK_FLAG_SYNC_POSITION | TERN0(LASER_SYNCHRONOUS_M106_M107, BLOCK_FLAG_SYNC_FANS) ) + #if ENABLED(LASER_POWER_INLINE) typedef struct { @@ -499,6 +509,16 @@ class Planner { // Manage fans, paste pressure, etc. static void check_axes_activity(); + // Apply fan speeds + #if HAS_FAN + static void sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]); + #if FAN_KICKSTART_TIME + static void kickstart_fan(uint8_t (&fan_speed)[FAN_COUNT], const millis_t &ms, const uint8_t f); + #else + FORCE_INLINE static void kickstart_fan(uint8_t (&)[FAN_COUNT], const millis_t &, const uint8_t) {} + #endif + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) void apply_filament_width_sensor(const int8_t encoded_ratio); @@ -721,9 +741,12 @@ class Planner { /** * Planner::buffer_sync_block - * Add a block to the buffer that just updates the position + * Add a block to the buffer that just updates the position or in + * case of LASER_SYNCHRONOUS_M106_M107 the fan pwm */ - static void buffer_sync_block(); + static void buffer_sync_block( + TERN_(LASER_SYNCHRONOUS_M106_M107, uint8_t sync_flag=BLOCK_FLAG_SYNC_POSITION) + ); #if IS_KINEMATIC private: diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 77fa6539bc..49eca7047c 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1988,9 +1988,18 @@ uint32_t Stepper::block_phase_isr() { // Anything in the buffer? if ((current_block = planner.get_current_block())) { - // Sync block? Sync the stepper counts and return - while (TEST(current_block->flag, BLOCK_BIT_SYNC_POSITION)) { - _set_position(current_block->position); + // Sync block? Sync the stepper counts or fan speeds and return + while (current_block->flag & BLOCK_MASK_SYNC) { + + #if ENABLED(LASER_SYNCHRONOUS_M106_M107) + const bool is_sync_fans = TEST(current_block->flag, BLOCK_BIT_SYNC_FANS); + if (is_sync_fans) planner.sync_fan_speeds(current_block->fan_speed); + #else + constexpr bool is_sync_fans = false; + #endif + + if (!is_sync_fans) _set_position(current_block->position); + discard_current_block(); // Try to get a new block diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index da792db833..a9b7ab13eb 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -197,7 +197,7 @@ #endif #if HAS_SERVOS - #include "./servo.h" + #include "servo.h" #endif #if ANY(TEMP_SENSOR_0_IS_THERMISTOR, TEMP_SENSOR_1_IS_THERMISTOR, TEMP_SENSOR_2_IS_THERMISTOR, TEMP_SENSOR_3_IS_THERMISTOR, \ diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index f9e85c4919..726e9a6586 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -322,7 +322,8 @@ #define TFT_BUFFER_SIZE 14400 -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD + #define BEEPER_PIN PC5 #define BTN_ENC PE13 #define LCD_PINS_ENABLE PD13 @@ -358,4 +359,5 @@ #define BOARD_ST7920_DELAY_3 DELAY_NS(600) #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index f2ddfc2b52..1000326dad 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -327,7 +327,8 @@ //#define TFT_DRIVER ST7796 #define TFT_BUFFER_SIZE 14400 -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD + #define BEEPER_PIN PC5 #define BTN_ENC PE13 #define LCD_PINS_ENABLE PD13 @@ -369,4 +370,5 @@ #endif #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD + +#endif // HAS_WIRED_LCD diff --git a/buildroot/tests/ARMED b/buildroot/tests/ARMED index 8764d47e84..7b9fef1eeb 100755 --- a/buildroot/tests/ARMED +++ b/buildroot/tests/ARMED @@ -12,6 +12,7 @@ set -e restore_configs use_example_configs ArmEd opt_set X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 +opt_enable LASER_SYNCHRONOUS_M106_M107 exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" "$3" # clean up From 5ff4476ccb092eb85f79997933ea579d81a4704b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 22 Mar 2021 23:58:03 -0500 Subject: [PATCH 1198/1370] Comment, clean up some PlatformIO scripts --- buildroot/share/PlatformIO/ldscripts/lerdge.ld | 6 +++--- buildroot/share/PlatformIO/scripts/openblt.py | 7 ++++--- .../share/PlatformIO/scripts/stm32_bootloader.py | 14 +++++++++++++- .../PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld | 6 +++--- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/buildroot/share/PlatformIO/ldscripts/lerdge.ld b/buildroot/share/PlatformIO/ldscripts/lerdge.ld index aa0b1dd9cb..f36ebcdea1 100644 --- a/buildroot/share/PlatformIO/ldscripts/lerdge.ld +++ b/buildroot/share/PlatformIO/ldscripts/lerdge.ld @@ -40,9 +40,9 @@ _Min_Stack_Size = 0x400;; /* required amount of stack */ /* Specify the memory areas */ MEMORY { -FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +FLASH (rx) : ORIGIN = 0x08000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K } /* Define output sections */ diff --git a/buildroot/share/PlatformIO/scripts/openblt.py b/buildroot/share/PlatformIO/scripts/openblt.py index 2911a28e78..01cd9c9ef2 100644 --- a/buildroot/share/PlatformIO/scripts/openblt.py +++ b/buildroot/share/PlatformIO/scripts/openblt.py @@ -1,5 +1,6 @@ -# Generate the firmware as OpenBLT needs - +# +# Convert the ELF to an SREC file suitable for some bootloaders +# import os,sys from os.path import join @@ -10,5 +11,5 @@ env.AddPostAction( env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "srec", "\"$BUILD_DIR/${PROGNAME}.elf\"", "\"$BUILD_DIR/${PROGNAME}.srec\"" - ]), "Building " + join("$BUILD_DIR","${PROGNAME}.srec")) + ]), "Building " + join("$BUILD_DIR", "${PROGNAME}.srec")) ) diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py index bbec61750c..1ceff84b8f 100644 --- a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py +++ b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py @@ -7,18 +7,28 @@ Import("env") from SCons.Script import DefaultEnvironment board = DefaultEnvironment().BoardConfig() +# +# Copy the firmware.bin file to build.firmware, no encryption +# def noencrypt(source, target, env): firmware = os.path.join(target[0].dir.path, board.get("build.firmware")) shutil.copy(target[0].path, firmware) +# +# For build.offset define LD_FLASH_OFFSET, used by ldscript.ld +# if 'offset' in board.get("build").keys(): LD_FLASH_OFFSET = board.get("build.offset") + # Remove an existing VECT_TAB_OFFSET from CPPDEFINES for define in env['CPPDEFINES']: if define[0] == "VECT_TAB_OFFSET": env['CPPDEFINES'].remove(define) + + # Replace VECT_TAB_OFFSET with our LD_FLASH_OFFSET env['CPPDEFINES'].append(("VECT_TAB_OFFSET", LD_FLASH_OFFSET)) + # Get upload.maximum_ram_size (defined by /buildroot/share/PlatformIO/boards/VARIOUS.json) maximum_ram_size = board.get("upload.maximum_ram_size") for i, flag in enumerate(env["LINKFLAGS"]): @@ -27,7 +37,9 @@ if 'offset' in board.get("build").keys(): if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) +# +# Only copy the file if there's no encrypt +# board_keys = board.get("build").keys() -# Only copy file if there's no encryptation if 'firmware' in board_keys and not 'encrypt' in board_keys: env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt) diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld index 19eec62fba..aa685e8111 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld @@ -58,9 +58,9 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ /* Specify the memory areas */ MEMORY { -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K -FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +FLASH (rx) : ORIGIN = 0x08000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET } /* Define output sections */ From a9f022dacfddbd04610eca3ccf5aecc5b62c7536 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 20 Mar 2021 22:43:47 -0500 Subject: [PATCH 1199/1370] Update common-cxxflags.py comment --- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 36704af283..856a246fba 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -20,10 +20,10 @@ def add_cpu_freq(): # Useful for JTAG debugging # -# It will separe release and debug build folders. -# It useful when we need keep two live versions: one debug, for debugging, -# other release, for flashing (when upload is not done automatically by jlink/stlink). -# Without this, PIO will recompile everything twice for any small change. +# It will separate release and debug build folders. +# It useful to keep two live versions: a debug version for debugging and another for +# release, for flashing when upload is not done automatically by jlink/stlink. +# Without this, PIO needs to recompile everything twice for any small change. if env.GetBuildType() == "debug" and env.get('UPLOAD_PROTOCOL') not in ['jlink', 'stlink']: env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' From b4617e7904aa0b90ddcaf0edffb82ea27af2d5d4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 20 Mar 2021 22:39:13 -0500 Subject: [PATCH 1200/1370] Tweak disabled variant options --- .../variants/BIGTREE_GTR_V1/hal_conf_extra.h | 68 +++++++++--------- .../BIGTREE_SKR_PRO_1v1/hal_conf_extra.h | 68 +++++++++--------- .../FYSETC_CHEETAH_V20/hal_conf_custom.h | 64 ++++++++--------- .../variants/MARLIN_F4x7Vx/hal_conf_extra.h | 72 +++++++++---------- 4 files changed, 136 insertions(+), 136 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h index f7f9e23e99..cbce513d1b 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h @@ -16,37 +16,37 @@ //#define HAL_UART_MODULE_ENABLED // by default //#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#undef HAL_SD_MODULE_ENABLED -#undef HAL_DAC_MODULE_ENABLED -#undef HAL_FLASH_MODULE_ENABLED -#undef HAL_CAN_MODULE_ENABLED -#undef HAL_CAN_LEGACY_MODULE_ENABLED -#undef HAL_CEC_MODULE_ENABLED -#undef HAL_CRYP_MODULE_ENABLED -#undef HAL_DCMI_MODULE_ENABLED -#undef HAL_DMA2D_MODULE_ENABLED -#undef HAL_ETH_MODULE_ENABLED -#undef HAL_NAND_MODULE_ENABLED -#undef HAL_NOR_MODULE_ENABLED -#undef HAL_PCCARD_MODULE_ENABLED -#undef HAL_SRAM_MODULE_ENABLED -#undef HAL_SDRAM_MODULE_ENABLED -#undef HAL_HASH_MODULE_ENABLED -#undef HAL_EXTI_MODULE_ENABLED -#undef HAL_SMBUS_MODULE_ENABLED -#undef HAL_I2S_MODULE_ENABLED -#undef HAL_IWDG_MODULE_ENABLED -#undef HAL_LTDC_MODULE_ENABLED -#undef HAL_DSI_MODULE_ENABLED -#undef HAL_QSPI_MODULE_ENABLED -#undef HAL_RNG_MODULE_ENABLED -#undef HAL_SAI_MODULE_ENABLED -#undef HAL_IRDA_MODULE_ENABLED -#undef HAL_SMARTCARD_MODULE_ENABLED -#undef HAL_WWDG_MODULE_ENABLED -//#undef HAL_HCD_MODULE_ENABLED -#undef HAL_FMPI2C_MODULE_ENABLED -#undef HAL_SPDIFRX_MODULE_ENABLED -#undef HAL_DFSDM_MODULE_ENABLED -#undef HAL_LPTIM_MODULE_ENABLED -#undef HAL_MMC_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED +//#define HAL_DAC_MODULE_ENABLED +//#define HAL_FLASH_MODULE_ENABLED +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h index f7f9e23e99..cbce513d1b 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h @@ -16,37 +16,37 @@ //#define HAL_UART_MODULE_ENABLED // by default //#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#undef HAL_SD_MODULE_ENABLED -#undef HAL_DAC_MODULE_ENABLED -#undef HAL_FLASH_MODULE_ENABLED -#undef HAL_CAN_MODULE_ENABLED -#undef HAL_CAN_LEGACY_MODULE_ENABLED -#undef HAL_CEC_MODULE_ENABLED -#undef HAL_CRYP_MODULE_ENABLED -#undef HAL_DCMI_MODULE_ENABLED -#undef HAL_DMA2D_MODULE_ENABLED -#undef HAL_ETH_MODULE_ENABLED -#undef HAL_NAND_MODULE_ENABLED -#undef HAL_NOR_MODULE_ENABLED -#undef HAL_PCCARD_MODULE_ENABLED -#undef HAL_SRAM_MODULE_ENABLED -#undef HAL_SDRAM_MODULE_ENABLED -#undef HAL_HASH_MODULE_ENABLED -#undef HAL_EXTI_MODULE_ENABLED -#undef HAL_SMBUS_MODULE_ENABLED -#undef HAL_I2S_MODULE_ENABLED -#undef HAL_IWDG_MODULE_ENABLED -#undef HAL_LTDC_MODULE_ENABLED -#undef HAL_DSI_MODULE_ENABLED -#undef HAL_QSPI_MODULE_ENABLED -#undef HAL_RNG_MODULE_ENABLED -#undef HAL_SAI_MODULE_ENABLED -#undef HAL_IRDA_MODULE_ENABLED -#undef HAL_SMARTCARD_MODULE_ENABLED -#undef HAL_WWDG_MODULE_ENABLED -//#undef HAL_HCD_MODULE_ENABLED -#undef HAL_FMPI2C_MODULE_ENABLED -#undef HAL_SPDIFRX_MODULE_ENABLED -#undef HAL_DFSDM_MODULE_ENABLED -#undef HAL_LPTIM_MODULE_ENABLED -#undef HAL_MMC_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED +//#define HAL_DAC_MODULE_ENABLED +//#define HAL_FLASH_MODULE_ENABLED +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h index 1b9df2b47a..6c56b97a74 100644 --- a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h @@ -33,55 +33,55 @@ extern "C" { */ #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED #define HAL_CRC_MODULE_ENABLED -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED //#define HAL_DAC_MODULE_ENABLED -/* #define HAL_DCMI_MODULE_ENABLED */ +//#define HAL_DCMI_MODULE_ENABLED #define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED #define HAL_FLASH_MODULE_ENABLED -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED -/* #define HAL_EXTI_MODULE_ENABLED */ +//#define HAL_EXTI_MODULE_ENABLED #define HAL_I2C_MODULE_ENABLED -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED #define HAL_IWDG_MODULE_ENABLED -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED #define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ +//#define HAL_QSPI_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ +//#define HAL_RNG_MODULE_ENABLED #define HAL_RTC_MODULE_ENABLED -/* #define HAL_SAI_MODULE_ENABLED */ +//#define HAL_SAI_MODULE_ENABLED //#define HAL_SD_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ +//#define HAL_UART_MODULE_ENABLED +//#define HAL_USART_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED #ifndef HAL_PCD_MODULE_ENABLED #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) #endif -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h index d3c2f6bd02..abac2b08b3 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h @@ -36,53 +36,53 @@ */ #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED -// #define HAL_CAN_MODULE_ENABLED -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +//#define HAL_CAN_MODULE_ENABLED +#define HAL_CAN_LEGACY_MODULE_ENABLED #define HAL_CRC_MODULE_ENABLED -// #define HAL_CEC_MODULE_ENABLED -// #define HAL_CRYP_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED #define HAL_DAC_MODULE_ENABLED -// #define HAL_DCMI_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED #define HAL_DMA_MODULE_ENABLED -// #define HAL_DMA2D_MODULE_ENABLED -// #define HAL_ETH_MODULE_ENABLED -// #define HAL_FLASH_MODULE_ENABLED -// #define HAL_NAND_MODULE_ENABLED -// #define HAL_NOR_MODULE_ENABLED -// #define HAL_PCCARD_MODULE_ENABLED -// #define HAL_SRAM_MODULE_ENABLED -// #define HAL_SDRAM_MODULE_ENABLED -// #define HAL_HASH_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_FLASH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED -// #define HAL_EXTI_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED #define HAL_I2C_MODULE_ENABLED -// #define HAL_SMBUS_MODULE_ENABLED -// #define HAL_I2S_MODULE_ENABLED -// #define HAL_IWDG_MODULE_ENABLED -// #define HAL_LTDC_MODULE_ENABLED -// #define HAL_DSI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED #define HAL_PWR_MODULE_ENABLED -// #define HAL_QSPI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED -// #define HAL_RNG_MODULE_ENABLED -// #define HAL_RTC_MODULE_ENABLED -// #define HAL_SAI_MODULE_ENABLED -// #define HAL_SD_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED -// #define HAL_UART_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED #define HAL_USART_MODULE_ENABLED -// #define HAL_IRDA_MODULE_ENABLED -// #define HAL_SMARTCARD_MODULE_ENABLED -// #define HAL_WWDG_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED -// #define HAL_PCD_MODULE_ENABLED -// #define HAL_HCD_MODULE_ENABLED -// #define HAL_FMPI2C_MODULE_ENABLED -// #define HAL_SPDIFRX_MODULE_ENABLED -// #define HAL_DFSDM_MODULE_ENABLED -// #define HAL_LPTIM_MODULE_ENABLED -// #define HAL_MMC_MODULE_ENABLED +//#define HAL_PCD_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** From 710b1bcb6d5d9b887ade1640f5a16c60727bc3e1 Mon Sep 17 00:00:00 2001 From: espr14 Date: Thu, 25 Mar 2021 04:39:10 +0100 Subject: [PATCH 1201/1370] Endstops always on after delta homing (#21442) --- Marlin/src/module/delta.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index a1676b3ba3..2312e1a012 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -253,7 +253,7 @@ void home_delta() { planner.synchronize(); // Re-enable stealthChop if used. Disable diag1 pin on driver. - #if ENABLED(SENSORLESS_HOMING) + #if ENABLED(SENSORLESS_HOMING) && DISABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); From a97f6c4c749406cb0c27800f70000ce2a96a9051 Mon Sep 17 00:00:00 2001 From: espr14 Date: Thu, 25 Mar 2021 04:39:29 +0100 Subject: [PATCH 1202/1370] Endstops always on in G28 (#21441) --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 9470678872..73bfc3bdc6 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -102,7 +102,7 @@ current_position.set(0.0, 0.0); - #if ENABLED(SENSORLESS_HOMING) + #if ENABLED(SENSORLESS_HOMING) && DISABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) tmc_disable_stallguard(stepperX, stealth_states.x); tmc_disable_stallguard(stepperY, stealth_states.y); #if AXIS_HAS_STALLGUARD(X2) From c83b6217f9cc66cdc82dd12b3f69c1d6d6be7729 Mon Sep 17 00:00:00 2001 From: ldursw <37294448+ldursw@users.noreply.github.com> Date: Thu, 25 Mar 2021 00:40:48 -0300 Subject: [PATCH 1203/1370] Followup to SDIO patch (#21440) --- Marlin/src/feature/binary_stream.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index 4bfa3998f1..b5d68196ae 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -39,7 +39,7 @@ inline int bs_read_serial(const serial_index_t index) { #if ENABLED(BINARY_STREAM_COMPRESSION) static heatshrink_decoder hsd; - #ifdef BOTH(ARDUINO_ARCH_STM32F1, SDIO_SUPPORT) + #if BOTH(ARDUINO_ARCH_STM32F1, SDIO_SUPPORT) // STM32 requires a word-aligned buffer for SD card transfers via DMA static __attribute__((aligned(sizeof(size_t)))) uint8_t decode_buffer[512] = {}; #else From 3d70b645b613be63b697dd9c45089e396eac565d Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Thu, 25 Mar 2021 04:56:48 +0100 Subject: [PATCH 1204/1370] Optimize LSF for size, efficiency (#21443) --- Marlin/src/libs/least_squares_fit.cpp | 26 +++++++++++++------------- Marlin/src/libs/least_squares_fit.h | 4 +--- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp index c7593c049f..aac21c0192 100644 --- a/Marlin/src/libs/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -46,23 +46,23 @@ int finish_incremental_LSF(struct linear_fit_data *lsf) { if (N == 0.0) return 1; - lsf->xbar /= N; - lsf->ybar /= N; - lsf->zbar /= N; - lsf->x2bar = lsf->x2bar / N - sq(lsf->xbar); - lsf->y2bar = lsf->y2bar / N - sq(lsf->ybar); - lsf->z2bar = lsf->z2bar / N - sq(lsf->zbar); - lsf->xybar = lsf->xybar / N - lsf->xbar * lsf->ybar; - lsf->yzbar = lsf->yzbar / N - lsf->ybar * lsf->zbar; - lsf->xzbar = lsf->xzbar / N - lsf->xbar * lsf->zbar; - const float DD = lsf->x2bar * lsf->y2bar - sq(lsf->xybar); + const float RN = 1.0f / N, + xbar = lsf->xbar * RN, + ybar = lsf->ybar * RN, + zbar = lsf->zbar * RN, + x2bar = lsf->x2bar * RN - sq(xbar), + y2bar = lsf->y2bar * RN - sq(ybar), + xybar = lsf->xybar * RN - xbar * ybar, + yzbar = lsf->yzbar * RN - ybar * zbar, + xzbar = lsf->xzbar * RN - xbar * zbar, + DD = x2bar * y2bar - sq(xybar); if (ABS(DD) <= 1e-10 * (lsf->max_absx + lsf->max_absy)) return 1; - lsf->A = (lsf->yzbar * lsf->xybar - lsf->xzbar * lsf->y2bar) / DD; - lsf->B = (lsf->xzbar * lsf->xybar - lsf->yzbar * lsf->x2bar) / DD; - lsf->D = -(lsf->zbar + lsf->A * lsf->xbar + lsf->B * lsf->ybar); + lsf->A = (yzbar * xybar - xzbar * y2bar) / DD; + lsf->B = (xzbar * xybar - yzbar * x2bar) / DD; + lsf->D = -(zbar + lsf->A * xbar + lsf->B * ybar); return 0; } diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h index 44ca8afc76..dbbab0a55e 100644 --- a/Marlin/src/libs/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -37,7 +37,7 @@ struct linear_fit_data { float xbar, ybar, zbar, - x2bar, y2bar, z2bar, + x2bar, y2bar, xybar, xzbar, yzbar, max_absx, max_absy, A, B, D, N; @@ -56,7 +56,6 @@ inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const lsf->zbar += wz; lsf->x2bar += wx * x; lsf->y2bar += wy * y; - lsf->z2bar += wz * z; lsf->xybar += wx * y; lsf->xzbar += wx * z; lsf->yzbar += wy * z; @@ -74,7 +73,6 @@ inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const f lsf->zbar += z; lsf->x2bar += sq(x); lsf->y2bar += sq(y); - lsf->z2bar += sq(z); lsf->xybar += x * y; lsf->xzbar += x * z; lsf->yzbar += y * z; From 85eb179acff1b66d5ce52622a26f2a4d070048ca Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Mar 2021 16:19:03 -0500 Subject: [PATCH 1205/1370] Define HW serial ports needed for TMC UART (#21446) --- Marlin/src/HAL/DUE/HAL.cpp | 8 +- Marlin/src/HAL/DUE/MarlinSerial.h | 2 +- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 19 ++-- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 8 +- Marlin/src/HAL/SAMD51/HAL.cpp | 10 +- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp | 6 +- Marlin/src/HAL/STM32/MarlinSerial.cpp | 4 - Marlin/src/inc/Conditionals_adv.h | 6 -- Marlin/src/inc/Conditionals_post.h | 106 +++++++++++++++++++ buildroot/share/extras/header.h | 2 +- 10 files changed, 134 insertions(+), 37 deletions(-) diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index 0e4caa47ac..249535723f 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -106,16 +106,16 @@ uint16_t HAL_adc_get_result() { } // Forward the default serial ports -#if ANY_SERIAL_IS(0) +#if USING_HW_SERIAL0 DefaultSerial1 MSerial0(false, Serial); #endif -#if ANY_SERIAL_IS(1) +#if USING_HW_SERIAL1 DefaultSerial2 MSerial1(false, Serial1); #endif -#if ANY_SERIAL_IS(2) +#if USING_HW_SERIAL2 DefaultSerial3 MSerial2(false, Serial2); #endif -#if ANY_SERIAL_IS(3) +#if USING_HW_SERIAL3 DefaultSerial4 MSerial3(false, Serial3); #endif diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h index e74d234b4a..0fb15cf8ad 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.h +++ b/Marlin/src/HAL/DUE/MarlinSerial.h @@ -140,7 +140,7 @@ struct MarlinSerialCfg { static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); }; -#if SERIAL_PORT >= 0 +#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT; extern MSerialT customizedSerial1; #endif diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index be42c7f960..f35328d22f 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -21,25 +21,26 @@ */ #ifdef TARGET_LPC1768 -#include "../../inc/MarlinConfigPre.h" #include "MarlinSerial.h" -#if ANY_SERIAL_IS(0) +#include "../../inc/MarlinConfig.h" + +#if USING_HW_SERIAL0 MarlinSerial _MSerial(LPC_UART0); MSerialT MSerial0(true, _MSerial); extern "C" void UART0_IRQHandler() { _MSerial.IRQHandler(); } #endif -#if ANY_SERIAL_IS(1) +#if USING_HW_SERIAL1 MarlinSerial _MSerial1((LPC_UART_TypeDef *) LPC_UART1); MSerialT MSerial1(true, _MSerial1); extern "C" void UART1_IRQHandler() { _MSerial1.IRQHandler(); } #endif -#if ANY_SERIAL_IS(2) +#if USING_HW_SERIAL2 MarlinSerial _MSerial2(LPC_UART2); MSerialT MSerial2(true, _MSerial2); extern "C" void UART2_IRQHandler() { _MSerial2.IRQHandler(); } #endif -#if ANY_SERIAL_IS(3) +#if USING_HW_SERIAL3 MarlinSerial _MSerial3(LPC_UART3); MSerialT MSerial3(true, _MSerial3); extern "C" void UART3_IRQHandler() { _MSerial3.IRQHandler(); } @@ -50,16 +51,16 @@ bool MarlinSerial::recv_callback(const char c) { // Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro) if (false) {} - #if ANY_SERIAL_IS(0) + #if USING_HW_SERIAL0 else if (this == &_MSerial) emergency_parser.update(MSerial0.emergency_state, c); #endif - #if ANY_SERIAL_IS(1) + #if USING_HW_SERIAL1 else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c); #endif - #if ANY_SERIAL_IS(2) + #if USING_HW_SERIAL2 else if (this == &_MSerial2) emergency_parser.update(MSerial2.emergency_state, c); #endif - #if ANY_SERIAL_IS(3) + #if USING_HW_SERIAL3 else if (this == &_MSerial3) emergency_parser.update(MSerial3.emergency_state, c); #endif return true; diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index dda1c640fa..a6286ba6f4 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -92,7 +92,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #define ANY_TX(N,V...) DO(IS_TX##N,||,V) #define ANY_RX(N,V...) DO(IS_RX##N,||,V) -#if ANY_SERIAL_IS(0) +#if USING_HW_SERIAL0 #define IS_TX0(P) (P == P0_02) #define IS_RX0(P) (P == P0_03) #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) @@ -106,7 +106,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef IS_RX0 #endif -#if ANY_SERIAL_IS(1) +#if USING_HW_SERIAL1 #define IS_TX1(P) (P == P0_15) #define IS_RX1(P) (P == P0_16) #define _IS_TX1_1 IS_TX1 @@ -127,7 +127,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef _IS_RX1_1 #endif -#if ANY_SERIAL_IS(2) +#if USING_HW_SERIAL2 #define IS_TX2(P) (P == P0_10) #define IS_RX2(P) (P == P0_11) #define _IS_TX2_1 IS_TX2 @@ -161,7 +161,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef _IS_RX2_1 #endif -#if ANY_SERIAL_IS(3) +#if USING_HW_SERIAL3 #define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00) #define PIN_IS_RX3(P) (P##_PIN == P0_01) #if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX) diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 8dd2fefd0a..39167fc467 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -25,19 +25,19 @@ #include #ifdef ADAFRUIT_GRAND_CENTRAL_M4 - #if ANY_SERIAL_IS(-1) + #if USING_HW_SERIALUSB DefaultSerial1 MSerial0(false, Serial); #endif - #if ANY_SERIAL_IS(0) + #if USING_HW_SERIAL0 DefaultSerial2 MSerial1(false, Serial1); #endif - #if ANY_SERIAL_IS(1) + #if USING_HW_SERIAL1 DefaultSerial3 MSerial2(false, Serial2); #endif - #if ANY_SERIAL_IS(2) + #if USING_HW_SERIAL2 DefaultSerial4 MSerial3(false, Serial3); #endif - #if ANY_SERIAL_IS(3) + #if USING_HW_SERIAL3 DefaultSerial5 MSerial4(false, Serial4); #endif #endif diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp index 3f43585cf2..a16ea2f758 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp @@ -27,7 +27,7 @@ #include "../../inc/MarlinConfig.h" -#if ANY_SERIAL_IS(1) +#if USING_HW_SERIAL1 UartT Serial2(false, &sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX); void SERCOM4_0_Handler() { Serial2.IrqHandler(); } void SERCOM4_1_Handler() { Serial2.IrqHandler(); } @@ -35,7 +35,7 @@ void SERCOM4_3_Handler() { Serial2.IrqHandler(); } #endif -#if ANY_SERIAL_IS(2) +#if USING_HW_SERIAL2 UartT Serial3(false, &sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX); void SERCOM1_0_Handler() { Serial3.IrqHandler(); } void SERCOM1_1_Handler() { Serial3.IrqHandler(); } @@ -43,7 +43,7 @@ void SERCOM1_3_Handler() { Serial3.IrqHandler(); } #endif -#if ANY_SERIAL_IS(3) +#if USING_HW_SERIAL3 UartT Serial4(false, &sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX); void SERCOM5_0_Handler() { Serial4.IrqHandler(); } void SERCOM5_1_Handler() { Serial4.IrqHandler(); } diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index cfb13f5bb5..132c602a0c 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -28,7 +28,6 @@ #ifndef USART4 #define USART4 UART4 #endif - #ifndef USART5 #define USART5 UART5 #endif @@ -43,15 +42,12 @@ #if defined(SERIAL_PORT) && SERIAL_PORT >= 0 DECLARE_SERIAL_PORT_EXP(SERIAL_PORT) #endif - #if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) #endif - #if defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT >= 0 DECLARE_SERIAL_PORT_EXP(MMU2_SERIAL_PORT) #endif - #if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0 DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT) #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 5ef0efa968..2177dc4861 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -530,12 +530,6 @@ #define NEED_LSF 1 #endif -// Flag the indexed serial ports that are in use -#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || \ - (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || \ - (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \ - (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) - #if BOTH(HAS_TFT_LVGL_UI, CUSTOM_MENU_MAIN) #define _HAS_1(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) #define HAS_USER_ITEM(V...) DO(HAS,||,V) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 1cd7e5f0e9..84e9cf8955 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1838,6 +1838,112 @@ #define HAS_TMC_SW_SERIAL 1 #endif +// +// Set USING_HW_SERIALn flags for used Serial Ports +// + +// ... HW_SerialX +#define _SERIAL_ID(P) _CAT(HW_,P) + +// ... (HW_Serial1 == HW_SerialX || HW_Serial1 == HW_MSerialX) +#define _TMC_UART_IS(P,N) ( _SERIAL_ID(P##_HARDWARE_SERIAL) == _SERIAL_ID(Serial##N) || _SERIAL_ID(P) == _SERIAL_ID(MSerial##N) ) +#define TMC_UART_IS(A,N) (defined(A##_HARDWARE_SERIAL) && _TMC_UART_IS(A, N)) + +// Flag the indexed hardware serial ports in use +#define CONF_SERIAL_IS(N) ( (defined(SERIAL_PORT) && SERIAL_PORT == N) \ + || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == N) \ + || (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == N) \ + || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == N) ) + +// Flag the named hardware serial ports in use +#define ANY_SERIAL_IS(N) ( CONF_SERIAL_IS(N) \ + || TMC_UART_IS(X, N) || TMC_UART_IS(Y , N) || TMC_UART_IS(Z , N) \ + || TMC_UART_IS(X2, N) || TMC_UART_IS(Y2, N) || TMC_UART_IS(Z2, N) || TMC_UART_IS(Z3, N) || TMC_UART_IS(Z4, N) \ + || TMC_UART_IS(E0, N) || TMC_UART_IS(E1, N) || TMC_UART_IS(E2, N) || TMC_UART_IS(E3, N) || TMC_UART_IS(E4, N) ) + +#define HW_Serial 501 +#define HW_Serial0 502 +#define HW_Serial1 503 +#define HW_Serial2 504 +#define HW_Serial3 505 +#define HW_Serial4 506 +#define HW_Serial5 507 +#define HW_Serial6 508 +#define HW_MSerial0 509 +#define HW_MSerial1 510 +#define HW_MSerial2 511 +#define HW_MSerial3 512 +#define HW_MSerial4 513 +#define HW_MSerial5 514 +#define HW_MSerial6 515 +#define HW_MSerial7 516 +#define HW_MSerial8 517 +#define HW_MSerial9 518 +#define HW_MSerial10 519 + +#if CONF_SERIAL_IS(-1) + #define USING_HW_SERIALUSB 1 +#endif +#if ANY_SERIAL_IS(0) + #define USING_HW_SERIAL0 1 +#endif +#if ANY_SERIAL_IS(1) + #define USING_HW_SERIAL1 1 +#endif +#if ANY_SERIAL_IS(2) + #define USING_HW_SERIAL2 1 +#endif +#if ANY_SERIAL_IS(3) + #define USING_HW_SERIAL3 1 +#endif +#if ANY_SERIAL_IS(4) + #define USING_HW_SERIAL4 1 +#endif +#if ANY_SERIAL_IS(5) + #define USING_HW_SERIAL5 1 +#endif +#if ANY_SERIAL_IS(6) + #define USING_HW_SERIAL6 1 +#endif +#if ANY_SERIAL_IS(7) + #define USING_HW_SERIAL7 1 +#endif +#if ANY_SERIAL_IS(8) + #define USING_HW_SERIAL8 1 +#endif +#if ANY_SERIAL_IS(9) + #define USING_HW_SERIAL9 1 +#endif +#if ANY_SERIAL_IS(10) + #define USING_HW_SERIAL10 1 +#endif + +#undef HW_Serial +#undef HW_Serial0 +#undef HW_Serial1 +#undef HW_Serial2 +#undef HW_Serial3 +#undef HW_Serial4 +#undef HW_Serial5 +#undef HW_Serial6 +#undef HW_MSerial0 +#undef HW_MSerial1 +#undef HW_MSerial2 +#undef HW_MSerial3 +#undef HW_MSerial4 +#undef HW_MSerial5 +#undef HW_MSerial6 +#undef HW_MSerial7 +#undef HW_MSerial8 +#undef HW_MSerial9 +#undef HW_MSerial10 + +#undef _SERIAL_ID +#undef _TMC_UART_IS +#undef TMC_UART_IS +#undef CONF_SERIAL_IS +#undef ANY_SERIAL_IS + // // Endstops and bed probe // diff --git a/buildroot/share/extras/header.h b/buildroot/share/extras/header.h index 5d2c73dfbe..e40471dfac 100644 --- a/buildroot/share/extras/header.h +++ b/buildroot/share/extras/header.h @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm From e817db62a45da3e5353aa311541863108b0163b5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Mar 2021 16:49:04 -0500 Subject: [PATCH 1206/1370] Apply TMC UART to STM32, simplify --- Marlin/src/HAL/DUE/MarlinSerial.cpp | 2 +- Marlin/src/HAL/STM32/MarlinSerial.cpp | 39 ++++++++++++++++++++------- Marlin/src/inc/Conditionals_post.h | 8 +----- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/Marlin/src/HAL/DUE/MarlinSerial.cpp b/Marlin/src/HAL/DUE/MarlinSerial.cpp index 50b84c0b1d..5b333fbeb5 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerial.cpp @@ -476,7 +476,7 @@ void MarlinSerial::flushTX() { // If not using the USB port as serial port -#if SERIAL_PORT >= 0 +#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 template class MarlinSerial< MarlinSerialCfg >; MSerialT customizedSerial1(MarlinSerialCfg::EMERGENCYPARSER); #endif diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index 132c602a0c..265e8b5ab6 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -37,19 +37,38 @@ MSerialT MSerial ## ser_num (true, USART ## ser_num, &_rx_complete_irq_ ## ser_num); \ void _rx_complete_irq_ ## ser_num (serial_t * obj) { MSerial ## ser_num ._rx_complete_irq(obj); } -#define DECLARE_SERIAL_PORT_EXP(ser_num) DECLARE_SERIAL_PORT(ser_num) - -#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(SERIAL_PORT) +#if USING_HW_SERIAL1 + DECLARE_SERIAL_PORT(1) #endif -#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) +#if USING_HW_SERIAL2 + DECLARE_SERIAL_PORT(2) #endif -#if defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(MMU2_SERIAL_PORT) +#if USING_HW_SERIAL3 + DECLARE_SERIAL_PORT(3) #endif -#if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT) +#if USING_HW_SERIAL4 + DECLARE_SERIAL_PORT(4) +#endif +#if USING_HW_SERIAL5 + DECLARE_SERIAL_PORT(5) +#endif +#if USING_HW_SERIAL6 + DECLARE_SERIAL_PORT(6) +#endif +#if USING_HW_SERIAL7 + DECLARE_SERIAL_PORT(7) +#endif +#if USING_HW_SERIAL8 + DECLARE_SERIAL_PORT(8) +#endif +#if USING_HW_SERIAL9 + DECLARE_SERIAL_PORT(9) +#endif +#if USING_HW_SERIAL10 + DECLARE_SERIAL_PORT(10) +#endif +#if USING_HW_SERIALLP1 + DECLARE_SERIAL_PORT(LP1) #endif void MarlinSerial::begin(unsigned long baud, uint8_t config) { diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 84e9cf8955..2433050528 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1842,13 +1842,6 @@ // Set USING_HW_SERIALn flags for used Serial Ports // -// ... HW_SerialX -#define _SERIAL_ID(P) _CAT(HW_,P) - -// ... (HW_Serial1 == HW_SerialX || HW_Serial1 == HW_MSerialX) -#define _TMC_UART_IS(P,N) ( _SERIAL_ID(P##_HARDWARE_SERIAL) == _SERIAL_ID(Serial##N) || _SERIAL_ID(P) == _SERIAL_ID(MSerial##N) ) -#define TMC_UART_IS(A,N) (defined(A##_HARDWARE_SERIAL) && _TMC_UART_IS(A, N)) - // Flag the indexed hardware serial ports in use #define CONF_SERIAL_IS(N) ( (defined(SERIAL_PORT) && SERIAL_PORT == N) \ || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == N) \ @@ -1856,6 +1849,7 @@ || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == N) ) // Flag the named hardware serial ports in use +#define TMC_UART_IS(A,N) (defined(A##_HARDWARE_SERIAL) && (CAT(HW_,A##_HARDWARE_SERIAL) == HW_Serial##N || CAT(HW_,A##_HARDWARE_SERIAL) == HW_MSerial##N)) #define ANY_SERIAL_IS(N) ( CONF_SERIAL_IS(N) \ || TMC_UART_IS(X, N) || TMC_UART_IS(Y , N) || TMC_UART_IS(Z , N) \ || TMC_UART_IS(X2, N) || TMC_UART_IS(Y2, N) || TMC_UART_IS(Z2, N) || TMC_UART_IS(Z3, N) || TMC_UART_IS(Z4, N) \ From 8d73a6c4e2e99015a27d82c9344869a5e4ca7019 Mon Sep 17 00:00:00 2001 From: Tomas Rimkus Date: Fri, 26 Mar 2021 01:16:45 +0100 Subject: [PATCH 1207/1370] Avoid watchdog reset in all wired EEPROMs (#21436) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/AVR/eeprom.cpp | 6 +++--- Marlin/src/HAL/DUE/eeprom_flash.cpp | 7 +++---- Marlin/src/HAL/DUE/eeprom_wired.cpp | 7 +++---- Marlin/src/HAL/LPC1768/eeprom_wired.cpp | 12 ++++-------- Marlin/src/HAL/SAMD51/eeprom_wired.cpp | 5 +++-- Marlin/src/HAL/STM32/eeprom_wired.cpp | 11 ++++------- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 9 +++------ Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 6 +++--- Marlin/src/HAL/TEENSY31_32/eeprom.cpp | 14 +++++++------- Marlin/src/HAL/TEENSY35_36/eeprom.cpp | 6 +++--- Marlin/src/HAL/TEENSY40_41/eeprom.cpp | 14 +++++++------- 11 files changed, 43 insertions(+), 54 deletions(-) diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp index ee2a73e410..8d084dec7f 100644 --- a/Marlin/src/HAL/AVR/eeprom.cpp +++ b/Marlin/src/HAL/AVR/eeprom.cpp @@ -40,13 +40,13 @@ bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index 209a5161ae..738f44acc9 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -976,14 +976,13 @@ bool PersistentStore::access_start() { ee_Init(); return true; } bool PersistentStore::access_finish() { ee_Flush(); return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != ee_Read(uint32_t(p))) { + if (v != ee_Read(uint32_t(p))) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! ee_Write(uint32_t(p), v); - delay(2); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (ee_Read(uint32_t(p)) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/DUE/eeprom_wired.cpp b/Marlin/src/HAL/DUE/eeprom_wired.cpp index b488c36f16..557a2f2cff 100644 --- a/Marlin/src/HAL/DUE/eeprom_wired.cpp +++ b/Marlin/src/HAL/DUE/eeprom_wired.cpp @@ -42,14 +42,13 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); - delay(2); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp index d94aba6119..f9286a74ac 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp @@ -42,25 +42,22 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t v = *value; - - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; } } - crc16(crc, &v, 1); pos++; value++; - }; - + } return false; } @@ -68,7 +65,6 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t do { // Read from external EEPROM const uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp index d9a0225a7a..3481fe539c 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp @@ -41,12 +41,13 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { const uint8_t v = *value; uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); - delay(2); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/STM32/eeprom_wired.cpp b/Marlin/src/HAL/STM32/eeprom_wired.cpp index ad54c12c47..6aa2f1d360 100644 --- a/Marlin/src/HAL/STM32/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32/eeprom_wired.cpp @@ -43,25 +43,22 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t v = *value; - - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; } } - crc16(crc, &v, 1); pos++; value++; - }; - + } return false; } diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp index a6395698aa..4e25bc69da 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -19,14 +19,13 @@ * along with this program. If not, see . * */ +#ifdef __STM32F1__ /** * PersistentStore for Arduino-style EEPROM interface * with simple implementations supplied by Marlin. */ -#ifdef __STM32F1__ - #include "../../inc/MarlinConfig.h" #if ENABLED(IIC_BL24CXX_EEPROM) @@ -48,13 +47,11 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - size_t written = 0; + uint16_t written = 0; while (size--) { uint8_t v = *value; uint8_t * const p = (uint8_t * const)pos; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp index 16cfc24af6..0ad69065cf 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -52,13 +52,13 @@ bool PersistentStore::access_start() { } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp index f2ae5dd534..85febebebc 100644 --- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp @@ -18,14 +18,14 @@ */ #ifdef __MK20DX256__ -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - /** * HAL PersistentStore for Teensy 3.2 (MK20DX256) */ +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + #include "../shared/eeprom_api.h" #include @@ -38,13 +38,13 @@ bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp index 8cd6b4ff41..b80e93b536 100644 --- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp @@ -42,13 +42,13 @@ bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp index fe2de388a7..3cd376edce 100644 --- a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp @@ -22,14 +22,14 @@ */ #ifdef __IMXRT1062__ -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - /** * HAL PersistentStore for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + #include "../shared/eeprom_api.h" #include @@ -42,13 +42,13 @@ bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; From 943a8ebdc688d43455238f1e53da8db5ac7b65a8 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Thu, 25 Mar 2021 21:44:35 -0400 Subject: [PATCH 1208/1370] Fix for YHCB2004 (#21450) --- Marlin/src/pins/mega/pins_GT2560_V3.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 65642464d9..11824fae4a 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -158,12 +158,15 @@ #if ENABLED(YHCB2004) #ifndef YHCB2004_CLK #define YHCB2004_CLK 5 + #define DIO52 YHCB2004_CLK #endif #ifndef YHCB2004_MOSI - #define YHCB2004_MOSI 21 + #define YHCB2004_MOSI 36 + #define DIO51 YHCB2004_MOSI #endif #ifndef YHCB2004_MISO - #define YHCB2004_MISO 36 + #define YHCB2004_MISO 21 + #define DIO50 YHCB2004_MISO #endif #elif HAS_WIRED_LCD #ifndef LCD_PINS_RS @@ -206,4 +209,4 @@ #ifndef BTN_ENC #define BTN_ENC 19 #endif -#endif +#endif \ No newline at end of file From 4ffb95a73639c0d0e8c0797278fde6639596e3c5 Mon Sep 17 00:00:00 2001 From: Leoric Date: Fri, 26 Mar 2021 23:41:55 +0300 Subject: [PATCH 1209/1370] MKS UI: Monitor state when idle (#21452) Co-authored-by: Scott Lahteine --- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 7 + Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 5 - .../lcd/extui/lib/mks_ui/draw_printing.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 184 ++++++++++++------ .../extui/lib/mks_ui/tft_multi_language.cpp | 6 +- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 1 + 6 files changed, 141 insertions(+), 64 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 3fed4cc385..c4ae6e221d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -65,6 +65,13 @@ extern uint32_t upload_time; extern uint32_t upload_size; extern bool temps_update_flag; +//#define CANCEL_ON_RIGHT // Put 'Cancel' on the right (as it was before) + +#define BTN_OK_X TERN(CANCEL_ON_RIGHT, 100, 280) +#define BTN_CANCEL_X TERN(CANCEL_ON_RIGHT, 280, 100) +#define BTN_OK_Y 180 +#define BTN_CANCEL_Y 180 + static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; if (DIALOG_IS(TYPE_PRINT_FILE)) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index c43a79a141..38f5fa0635 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -74,11 +74,6 @@ enum { DIALOG_TRANSFER_NO_DEVICE }; -#define BTN_OK_X 100 -#define BTN_OK_Y 180 -#define BTN_CANCEL_X 280 -#define BTN_CANCEL_Y 180 - extern void lv_draw_dialog(uint8_t type); extern void lv_clear_dialog(); extern void filament_sprayer_temp(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index e9e501ae5f..70c57f4af8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -222,7 +222,7 @@ void disp_bed_temp() { } void disp_fan_speed() { - sprintf_P(public_buf_l, PSTR("%3d"), thermalManager.fan_speed[0]); + sprintf_P(public_buf_l, PSTR("%d%%"), thermalManager.fanPercent(thermalManager.fan_speed[0])); lv_label_set_text(labelFan, public_buf_l); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 7554f746ca..acdfa24f1b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -42,32 +42,36 @@ #include +#define ICON_POS_Y 38 +#define TARGET_LABEL_MOD_Y -36 +#define LABEL_MOD_Y 30 +#define SECOND_EXT_MOD_Y 100 + extern lv_group_t* g; static lv_obj_t *scr; +static lv_obj_t *labelExt1, *labelExt1Target, *labelFan; + +#if HAS_MULTI_EXTRUDER + static lv_obj_t *labelExt2, *labelExt2Target; +#endif + +#if HAS_HEATED_BED + static lv_obj_t *labelBed, *labelBedTarget; +#endif + #if ENABLED(MKS_TEST) uint8_t curent_disp_ui = 0; #endif -enum { - ID_TOOL = 1, - ID_SET, - ID_PRINT -}; +enum { ID_TOOL = 1, ID_SET, ID_PRINT }; static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; lv_clear_ready_print(); - switch (obj->mks_obj_id) { - case ID_TOOL: - lv_draw_tool(); - break; - case ID_SET: - lv_draw_set(); - break; - case ID_PRINT: - lv_draw_print_file(); - break; + case ID_TOOL: lv_draw_tool(); break; + case ID_SET: lv_draw_set(); break; + case ID_PRINT: lv_draw_print_file(); break; } } @@ -98,14 +102,14 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.degHotend(0)); + sprintf_P(buf, PSTR("e1:%d"), thermalManager.degHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND - sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.degHotend(1)); + sprintf_P(buf, PSTR("e2:%d"), thermalManager.degHotend(1)); lv_label_set_text(e2, buf); #endif #if HAS_HEATED_BED - sprintf_P(buf, PSTR("bed:%d"), (int)thermalManager.temp_bed.celsius); + sprintf_P(buf, PSTR("bed:%d"), thermalManager.degBed()); lv_label_set_text(bed, buf); #endif } @@ -130,53 +134,123 @@ void lv_draw_ready_print() { lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } - #if 1 - e1 = lv_label_create_empty(scr); - lv_obj_set_pos(e1, 20, 20); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(0)); - lv_label_set_text(e1, buf); - #if HAS_MULTI_HOTEND - e2 = lv_label_create_empty(scr); - lv_obj_set_pos(e2, 20, 45); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(1)); - lv_label_set_text(e2, buf); - #endif + e1 = lv_label_create_empty(scr); + lv_obj_set_pos(e1, 20, 20); + sprintf_P(buf, PSTR("e1: %d"), thermalManager.degHotend(0)); + lv_label_set_text(e1, buf); - #if HAS_HEATED_BED - bed = lv_label_create_empty(scr); - lv_obj_set_pos(bed, 20, 95); - sprintf_P(buf, PSTR("bed: %d"), (int)thermalManager.temp_bed.celsius); - lv_label_set_text(bed, buf); - #endif + #if HAS_MULTI_HOTEND + e2 = lv_label_create_empty(scr); + lv_obj_set_pos(e2, 20, 45); + sprintf_P(buf, PSTR("e1: %d"), thermalManager.degHotend(1)); + lv_label_set_text(e2, buf); + #endif - limit_info = lv_label_create_empty(scr); + #if HAS_HEATED_BED + bed = lv_label_create_empty(scr); + lv_obj_set_pos(bed, 20, 95); + sprintf_P(buf, PSTR("bed: %d"), thermalManager.degBed()); + lv_label_set_text(bed, buf); + #endif - lv_style_copy(&limit_style, &lv_style_scr); - limit_style.body.main_color.full = 0x0000; - limit_style.body.grad_color.full = 0x0000; - limit_style.text.color.full = 0xffff; - lv_obj_set_style(limit_info, &limit_style); + limit_info = lv_label_create_empty(scr); - lv_obj_set_pos(limit_info, 20, 120); - lv_label_set_text(limit_info, " "); + lv_style_copy(&limit_style, &lv_style_scr); + limit_style.body.main_color.full = 0x0000; + limit_style.body.grad_color.full = 0x0000; + limit_style.text.color.full = 0xFFFF; + lv_obj_set_style(limit_info, &limit_style); - det_info = lv_label_create_empty(scr); + lv_obj_set_pos(limit_info, 20, 120); + lv_label_set_text(limit_info, " "); - lv_style_copy(&det_style, &lv_style_scr); - det_style.body.main_color.full = 0x0000; - det_style.body.grad_color.full = 0x0000; - det_style.text.color.full = 0xffff; - lv_obj_set_style(det_info, &det_style); + det_info = lv_label_create_empty(scr); - lv_obj_set_pos(det_info, 20, 145); - lv_label_set_text(det_info, " "); - #endif // if 1 + lv_style_copy(&det_style, &lv_style_scr); + det_style.body.main_color.full = 0x0000; + det_style.body.grad_color.full = 0x0000; + det_style.text.color.full = 0xFFFF; + lv_obj_set_style(det_info, &det_style); + lv_obj_set_pos(det_info, 20, 145); + lv_label_set_text(det_info, " "); } else { - lv_big_button_create(scr, "F:/bmp_tool.bin", main_menu.tool, 20, 90, event_handler, ID_TOOL); - lv_big_button_create(scr, "F:/bmp_set.bin", main_menu.set, 180, 90, event_handler, ID_SET); - lv_big_button_create(scr, "F:/bmp_printing.bin", main_menu.print, 340, 90, event_handler, ID_PRINT); + lv_big_button_create(scr, "F:/bmp_tool.bin", main_menu.tool, 20, 180, event_handler, ID_TOOL); + lv_big_button_create(scr, "F:/bmp_set.bin", main_menu.set, 180, 180, event_handler, ID_SET); + lv_big_button_create(scr, "F:/bmp_printing.bin", main_menu.print, 340, 180, event_handler, ID_PRINT); + + // Monitoring + lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); + #if HAS_MULTI_EXTRUDER + lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); + #endif + #if HAS_HEATED_BED + lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); + #endif + lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); + + lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); + #if HAS_MULTI_EXTRUDER + lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); + #endif + #if HAS_HEATED_BED + lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); + #endif + lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); + + lv_obj_set_pos(buttonExt1, 55, ICON_POS_Y); + #if HAS_MULTI_EXTRUDER + lv_obj_set_pos(buttonExt2, 55, ICON_POS_Y + SECOND_EXT_MOD_Y); + #endif + #if HAS_HEATED_BED + lv_obj_set_pos(buttonBedstate, 210, ICON_POS_Y); + #endif + lv_obj_set_pos(buttonFanstate, 380, ICON_POS_Y); + + labelExt1 = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); + labelExt1Target = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); + + #if HAS_MULTI_EXTRUDER + labelExt2 = lv_label_create(scr, 55, LABEL_MOD_Y + SECOND_EXT_MOD_Y, nullptr); + labelExt2Target = lv_label_create(scr, 55, LABEL_MOD_Y + SECOND_EXT_MOD_Y, nullptr); + #endif + + #if HAS_HEATED_BED + labelBed = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr); + labelBedTarget = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr); + #endif + + labelFan = lv_label_create(scr, 380, 80, nullptr); + + sprintf_P(buf, PSTR("%d"), thermalManager.degHotend(0)); + lv_label_set_text(labelExt1, buf); + lv_obj_align(labelExt1, buttonExt1, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetHotend(0)); + lv_label_set_text(labelExt1Target, buf); + lv_obj_align(labelExt1Target, buttonExt1, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); + + #if HAS_MULTI_EXTRUDER + sprintf_P(buf, PSTR("%d"), thermalManager.degHotend(1)); + lv_label_set_text(labelExt2, buf); + lv_obj_align(labelExt2, buttonExt2, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetHotend(1)); + lv_label_set_text(labelExt2Target, buf); + lv_obj_align(labelExt2Target, buttonExt2, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); + #endif + + #if HAS_HEATED_BED + sprintf_P(buf, PSTR("%d"), thermalManager.degBed()); + lv_label_set_text(labelBed, buf); + lv_obj_align(labelBed, buttonBedstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetBed()); + lv_label_set_text(labelBedTarget, buf); + lv_obj_align(labelBedTarget, buttonBedstate, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); + #endif + + sprintf_P(buf, PSTR("%d%%"), thermalManager.fanPercent(thermalManager.fan_speed[0])); + lv_label_set_text(labelFan, buf); + lv_obj_align(labelFan, buttonFanstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); } #if ENABLED(TOUCH_SCREEN_CALIBRATION) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 7caae5cd3a..20b7d5f606 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -815,9 +815,9 @@ void disp_language_init() { wifi_menu.disconnected = WIFI_DISCONNECTED_TEXT; wifi_menu.exception = WIFI_EXCEPTION_TEXT; - printing_menu.temp1 = TEXT_VALUE; - printing_menu.temp2 = TEXT_VALUE; - printing_menu.bed_temp = TEXT_VALUE; + printing_menu.temp1 = TEXT_VALUE_TARGET; + printing_menu.temp2 = TEXT_VALUE_TARGET; + printing_menu.bed_temp = TEXT_VALUE_TARGET; filament_menu.stat_temp = TEXT_VALUE; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 82d3e18f74..61c46a648f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -748,6 +748,7 @@ extern eeprom_def eeprom_menu; /*****************************************/ // #define TEXT_VALUE "%d/%d" +#define TEXT_VALUE_TARGET "%d -> %d" #define TEXT_VALUE_T ": %d℃" #define TEXT_VALUE_mm ": %dmm" From 7c275285eaa6802614aae5533262065d6b406551 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sat, 27 Mar 2021 21:57:12 -0600 Subject: [PATCH 1210/1370] Refactor Hilbert curve. Enhance Touch UI Bed Level Screen. (#21453) --- Marlin/src/feature/bedlevel/hilbert_curve.cpp | 112 +++++++++++++ Marlin/src/feature/bedlevel/hilbert_curve.h | 32 ++++ Marlin/src/feature/bedlevel/ubl/ubl.h | 5 - Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 158 +++++++++--------- .../ftdi_eve_lib/extras/adjuster_widget.cpp | 41 ++--- .../ftdi_eve_lib/extras/adjuster_widget.h | 7 + .../ftdi_eve_touch_ui/language/language_en.h | 5 +- .../screens/bed_mesh_screen.cpp | 21 ++- .../screens/bed_mesh_screen.h | 2 + .../screens/leveling_menu.cpp | 67 +++++--- .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 31 ++-- platformio.ini | 2 + 13 files changed, 341 insertions(+), 144 deletions(-) create mode 100644 Marlin/src/feature/bedlevel/hilbert_curve.cpp create mode 100644 Marlin/src/feature/bedlevel/hilbert_curve.h diff --git a/Marlin/src/feature/bedlevel/hilbert_curve.cpp b/Marlin/src/feature/bedlevel/hilbert_curve.cpp new file mode 100644 index 0000000000..6150226e0b --- /dev/null +++ b/Marlin/src/feature/bedlevel/hilbert_curve.cpp @@ -0,0 +1,112 @@ +/********************* + * hilbert_curve.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - SynDaver Labs, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(UBL_HILBERT_CURVE) + +#include "bedlevel.h" +#include "hilbert_curve.h" + +constexpr int8_t to_fix(int8_t v) { return v * 2; } +constexpr int8_t to_int(int8_t v) { return v / 2; } +constexpr uint8_t log2(uint8_t n) { return (n > 1) ? 1 + log2(n >> 1) : 0; } +constexpr uint8_t order(uint8_t n) { return uint8_t(log2(n - 1)) + 1; } +constexpr uint8_t ord = order(_MAX(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y)); +constexpr uint8_t dim = _BV(ord); + +static inline bool eval_candidate(int8_t x, int8_t y, hilbert_curve::callback_ptr func, void *data) { + // The print bed likely has fewer points than the full Hilbert + // curve, so cull unecessary points + return x < GRID_MAX_POINTS_X && y < GRID_MAX_POINTS_Y ? func(x, y, data) : false; +} + +bool hilbert_curve::hilbert(int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n, hilbert_curve::callback_ptr func, void *data) { + /** + * Hilbert space-filling curve implementation + * + * x and y : coordinates of the bottom left corner + * xi and xj : i and j components of the unit x vector of the frame + * yi and yj : i and j components of the unit y vector of the frame + * + * From: http://www.fundza.com/algorithmic/space_filling/hilbert/basics/index.html + */ + if (n) + return hilbert(x, y, yi/2, yj/2, xi/2, xj/2, n-1, func, data) || + hilbert(x+xi/2, y+xj/2, xi/2, xj/2, yi/2, yj/2, n-1, func, data) || + hilbert(x+xi/2+yi/2, y+xj/2+yj/2, xi/2, xj/2, yi/2, yj/2, n-1, func, data) || + hilbert(x+xi/2+yi, y+xj/2+yj, -yi/2, -yj/2, -xi/2, -xj/2, n-1, func, data); + else + return eval_candidate(to_int(x+(xi+yi)/2), to_int(y+(xj+yj)/2), func, data); +} + +/** + * Calls func(x, y, data) for all points in the Hilbert curve. + * If that function returns true, the search is terminated. + */ +bool hilbert_curve::search(hilbert_curve::callback_ptr func, void *data) { + return hilbert(to_fix(0), to_fix(0),to_fix(dim), to_fix(0), to_fix(0), to_fix(dim), ord, func, data); +} + +/* Helper function for starting the search at a particular point */ + +typedef struct { + uint8_t x, y; + bool found_1st; + hilbert_curve::callback_ptr func; + void *data; +} search_from_t; + +static bool search_from_helper(uint8_t x, uint8_t y, void *data) { + search_from_t *d = (search_from_t *) data; + if (d->x == x && d->y == y) + d->found_1st = true; + return d->found_1st ? d->func(x, y, d->data) : false; +} + +/** + * Same as search, except start at a specific grid intersection point. + */ +bool hilbert_curve::search_from(uint8_t x, uint8_t y, hilbert_curve::callback_ptr func, void *data) { + search_from_t d; + d.x = x; + d.y = y; + d.found_1st = false; + d.func = func; + d.data = data; + // Call twice to allow search to wrap back to the beginning and picked up points prior to the start. + return search(search_from_helper, &d) || search(search_from_helper, &d); +} + +/** + * Like search_from, but takes a bed position and starts from the nearest + * point on the Hilbert curve. + */ +bool hilbert_curve::search_from_closest(const xy_pos_t &pos, hilbert_curve::callback_ptr func, void *data) { + // Find closest grid intersection + uint8_t grid_x = LROUND(float(pos.x - MESH_MIN_X) / MESH_X_DIST); + uint8_t grid_y = LROUND(float(pos.y - MESH_MIN_Y) / MESH_Y_DIST); + LIMIT(grid_x, 0, GRID_MAX_POINTS_X); + LIMIT(grid_y, 0, GRID_MAX_POINTS_Y); + return search_from(grid_x, grid_y, func, data); +} + +#endif // UBL_HILBERT_CURVE diff --git a/Marlin/src/feature/bedlevel/hilbert_curve.h b/Marlin/src/feature/bedlevel/hilbert_curve.h new file mode 100644 index 0000000000..a5dce8a22d --- /dev/null +++ b/Marlin/src/feature/bedlevel/hilbert_curve.h @@ -0,0 +1,32 @@ +/******************* + * hilbert_curve.h * + *******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - SynDaver Labs, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +class hilbert_curve { + public: + typedef bool (*callback_ptr)(uint8_t x, uint8_t y, void *data); + static bool search(callback_ptr func, void *data); + static bool search_from(uint8_t x, uint8_t y, callback_ptr func, void *data); + static bool search_from_closest(const xy_pos_t &pos, callback_ptr func, void *data); + private: + static bool hilbert(int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n, callback_ptr func, void *data); +}; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 67a9b0a60e..56de4e45ba 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -101,11 +101,6 @@ public: static void display_map(const int) _O0; static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; static mesh_index_pair find_furthest_invalid_mesh_point() _O0; - #if ENABLED(UBL_HILBERT_CURVE) - static void check_if_missing(mesh_index_pair &pt, int x, int y); - static void hilbert(mesh_index_pair &pt, int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n); - static mesh_index_pair find_next_mesh_point(); - #endif static void reset(); static void invalidate(); static void set_all_mesh_points_to_value(const float value); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index c1f824714c..2003e9b6f5 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -49,6 +49,10 @@ #include "../../../lcd/extui/ui_api.h" #endif +#if ENABLED(UBL_HILBERT_CURVE) + #include "../hilbert_curve.h" +#endif + #include #define UBL_G29_P31 @@ -747,11 +751,9 @@ void unified_bed_leveling::shift_mesh_height() { } #endif - best = do_furthest ? find_furthest_invalid_mesh_point() - : TERN(UBL_HILBERT_CURVE, - find_next_mesh_point(), - find_closest_mesh_point_of_type(INVALID, nearby, true) - ); + best = do_furthest + ? find_furthest_invalid_mesh_point() + : find_closest_mesh_point_of_type(INVALID, nearby, true); if (best.pos.x >= 0) { // mesh point found and is reachable by probe TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); @@ -1269,97 +1271,93 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { return farthest; } -mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { - mesh_index_pair closest; - closest.invalidate(); - closest.distance = -99999.9f; +#if ENABLED(UBL_HILBERT_CURVE) - // Get the reference position, either nozzle or probe - const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; + typedef struct { + MeshPointType type; + MeshFlags *done_flags; + bool probe_relative; + mesh_index_pair closest; + } find_closest_t; - float best_so_far = 99999.99f; - - GRID_LOOP(i, j) { - if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) - || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) + static bool test_func(uint8_t i, uint8_t j, void *data) { + find_closest_t *d = (find_closest_t*)data; + if ( (d->type == (isnan(ubl.z_values[i][j]) ? INVALID : REAL)) + || (d->type == SET_IN_BITMAP && !d->done_flags->marked(i, j)) ) { // Found a Mesh Point of the specified type! - const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + const xy_pos_t mpos = { ubl.mesh_index_to_xpos(i), ubl.mesh_index_to_ypos(j) }; // If using the probe as the reference there are some unreachable locations. // Also for round beds, there are grid points outside the bed the nozzle can't reach. // Prune them from the list and ignore them till the next Phase (manual nozzle probing). - if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) - continue; - - // Reachable. Check if it's the best_so_far location to the nozzle. - - const xy_pos_t diff = current_position - mpos; - const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; - - // factor in the distance from the current location for the normal case - // so the nozzle isn't running all over the bed. - if (distance < best_so_far) { - best_so_far = distance; // Found a closer location with the desired value type. - closest.pos.set(i, j); - closest.distance = best_so_far; - } - } - } // GRID_LOOP - - return closest; -} - -#if ENABLED(UBL_HILBERT_CURVE) - - constexpr int8_t to_fix(int8_t v) { return v << 1; } - constexpr int8_t to_int(int8_t v) { return v >> 1; } - constexpr uint8_t log2(uint8_t n) { return (n > 1) ? 1 + log2(n >> 1) : 0; } - constexpr uint8_t order(uint8_t n) { return uint8_t(log2(n - 1)) + 1; } - - void unified_bed_leveling::hilbert(mesh_index_pair &pt, int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n) { - /* Hilbert space filling curve implementation - * - * x and y are the coordinates of the bottom left corner - * xi & xj are the i & j components of the unit x vector of the frame - * similarly yi and yj - * - * From: http://www.fundza.com/algorithmic/space_filling/hilbert/basics/index.html - */ - if (n <= 0) - check_if_missing(pt, to_int(x+(xi+yi)/2),to_int(y+(xj+yj)/2)); - else { - hilbert(pt, x, y, yi/2, yj/2, xi/2, xj/2, n-1); - hilbert(pt, x+xi/2, y+xj/2, xi/2, xj/2, yi/2, yj/2, n-1); - hilbert(pt, x+xi/2+yi/2, y+xj/2+yj/2, xi/2, xj/2, yi/2, yj/2, n-1); - hilbert(pt, x+xi/2+yi, y+xj/2+yj, -yi/2, -yj/2, -xi/2, -xj/2, n-1); + if (!(d->probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) + return false; + d->closest.pos.set(i, j); + return true; } + return false; } - void unified_bed_leveling::check_if_missing(mesh_index_pair &pt, int x, int y) { - if ( pt.distance < 0 - && x < GRID_MAX_POINTS_X - && y < GRID_MAX_POINTS_Y - && isnan(z_values[x][y]) - && probe.can_reach(mesh_index_to_xpos(x), mesh_index_to_ypos(y)) +#endif + +mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { + + #if ENABLED(UBL_HILBERT_CURVE) + + find_closest_t d; + d.type = type; + d.done_flags = done_flags; + d.probe_relative = probe_relative; + d.closest.invalidate(); + hilbert_curve::search_from_closest(pos, test_func, &d); + return d.closest; + + #else + + mesh_index_pair closest; + closest.invalidate(); + closest.distance = -99999.9f; + + // Get the reference position, either nozzle or probe + const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; + + float best_so_far = 99999.99f; + + GRID_LOOP(i, j) { + if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) + || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) ) { - pt.pos.set(x, y); - pt.distance = 1; + // Found a Mesh Point of the specified type! + const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + + // If using the probe as the reference there are some unreachable locations. + // Also for round beds, there are grid points outside the bed the nozzle can't reach. + // Prune them from the list and ignore them till the next Phase (manual nozzle probing). + + if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) + continue; + + // Reachable. Check if it's the best_so_far location to the nozzle. + + const xy_pos_t diff = current_position - mpos; + const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; + + // factor in the distance from the current location for the normal case + // so the nozzle isn't running all over the bed. + if (distance < best_so_far) { + best_so_far = distance; // Found a closer location with the desired value type. + closest.pos.set(i, j); + closest.distance = best_so_far; + } } - } + } // GRID_LOOP - mesh_index_pair unified_bed_leveling::find_next_mesh_point() { - mesh_index_pair pt; - pt.invalidate(); - pt.distance = -99999.9f; - constexpr uint8_t ord = order(_MAX(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y)); - constexpr uint8_t dim = _BV(ord); - hilbert(pt, to_fix(0), to_fix(0), to_fix(dim), to_fix(0), to_fix(0), to_fix(dim), ord); - return pt; - } + return closest; -#endif // UBL_HILBERT_CURVE + #endif +} /** * 'Smart Fill': Scan from the outward edges of the mesh towards the center. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp index 084c9c014f..ef3cb565d2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp @@ -30,25 +30,28 @@ #define INC_POS SUB_POS(6,1), SUB_SIZE(2,1) #define DEC_POS SUB_POS(8,1), SUB_SIZE(2,1) -void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { - if (what & BACKGROUND) - cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); +void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) { + char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; + if (isnan(value)) + strcpy_P(str, PSTR("-")); + else + dtostrf(value, width, precision, str); - if (what & FOREGROUND) { - char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; - if (isnan(value)) - strcpy_P(str, PSTR("-")); - else - dtostrf(value, width, precision, str); + if (units) { + strcat_P(str, PSTR(" ")); + strcat_P(str, (const char*) units); + } - if (units) { - strcat_P(str, PSTR(" ")); - strcat_P(str, (const char*) units); - } - - cmd.tag(0) - .text(VAL_POS, str) - .tag(tag ).button(INC_POS, F("-")) - .tag(tag+1).button(DEC_POS, F("+")); - } + cmd.text(VAL_POS, str); +} + +void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { + if (what & BACKGROUND) + cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); + + if (what & FOREGROUND) { + draw_adjuster_value(cmd, x, y, w, h, value, units, width, precision); + cmd.tag(tag ).button(INC_POS, F("-")) + .tag(tag+1).button(DEC_POS, F("+")); + } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h index c48e37f620..9b5cab0dfb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h @@ -22,6 +22,13 @@ #pragma once #include "../extended/screen_types.h" +void draw_adjuster_value( + CommandProcessor& cmd, + int16_t x, int16_t y, int16_t w, int16_t h, + float value, progmem_str units = nullptr, + int8_t width = 5, uint8_t precision = 1 +); + void draw_adjuster( CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index f6603e514a..c34d5b7756 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -140,10 +140,13 @@ namespace Language_en { PROGMEM Language_Str MSG_TOUCH_CALIBRATION_START = u8"Release to begin screen calibration"; PROGMEM Language_Str MSG_TOUCH_CALIBRATION_PROMPT = u8"Touch the dots to calibrate"; - PROGMEM Language_Str MSG_AUTOLEVEL_X_AXIS = u8"Level X Axis"; PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished"; PROGMEM Language_Str MSG_BED_MAPPING_INCOMPLETE = u8"Not all points probed"; PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; + PROGMEM Language_Str MSG_AXIS_LEVELING = u8"Axis Leveling"; + PROGMEM Language_Str MSG_PROBE_BED = u8"Probe Mesh"; + PROGMEM Language_Str MSG_SHOW_MESH = u8"View Mesh"; + PROGMEM Language_Str MSG_PRINT_TEST = u8"Print Test"; #if ENABLED(TOUCH_UI_LULZBOT_BIO) PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index c87329ebe2..053f4ebd72 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -225,6 +225,7 @@ bool BedMeshScreen::tagToPoint(uint8_t tag, xy_uint8_t &pt) { } void BedMeshScreen::onEntry() { + mydata.allowEditing = true; mydata.highlightedTag = 0; mydata.zAdjustment = 0; mydata.count = GRID_MAX_POINTS; @@ -259,16 +260,16 @@ void BedMeshScreen::adjustHighlightedValue(float increment) { } void BedMeshScreen::saveAdjustedHighlightedValue() { - if(mydata.zAdjustment) { + if (mydata.zAdjustment) { BedMeshScreen::setHighlightedValue(BedMeshScreen::getHighlightedValue(true) + mydata.zAdjustment); mydata.zAdjustment = 0; } } void BedMeshScreen::changeHighlightedValue(uint8_t tag) { - saveAdjustedHighlightedValue(); + if (mydata.allowEditing) saveAdjustedHighlightedValue(); mydata.highlightedTag = tag; - moveToHighlightedValue(); + if (mydata.allowEditing) moveToHighlightedValue(); } void BedMeshScreen::drawHighlightedPointValue() { @@ -277,7 +278,12 @@ void BedMeshScreen::drawHighlightedPointValue() { .colors(normal_btn) .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) .font(font_small); - draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); + + if (mydata.allowEditing) + draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); + else + draw_adjuster_value(cmd, Z_VALUE_POS, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); + cmd.colors(action_btn) .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); @@ -347,6 +353,7 @@ void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { switch (state) { case ExtUI::MESH_START: + mydata.allowEditing = false; mydata.count = 0; mydata.message = mydata.MSG_NONE; break; @@ -369,10 +376,16 @@ void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::pr void BedMeshScreen::startMeshProbe() { GOTO_SCREEN(BedMeshScreen); + mydata.allowEditing = false; mydata.count = 0; injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); } +void BedMeshScreen::showMesh() { + GOTO_SCREEN(BedMeshScreen); + mydata.allowEditing = false; +} + void BedMeshScreen::showMeshEditor() { SpinnerDialogBox::enqueueAndWait_P(ExtUI::isMachineHomed() ? F("M420 S1") : F("G28\nM420 S1")); // After the spinner, go to this screen. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h index 804bb57ad0..21a7a73729 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h @@ -33,6 +33,7 @@ struct BedMeshScreenData { uint8_t count; uint8_t highlightedTag; float zAdjustment; + bool allowEditing; }; class BedMeshScreen : public BaseScreen, public CachedScreen { @@ -63,5 +64,6 @@ class BedMeshScreen : public BaseScreen, public CachedScreen - - + - - - - - - + - - - - - - @@ -306,6 +307,7 @@ AUTO_BED_LEVELING_BILINEAR = src_filter=+ AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ MESH_BED_LEVELING = src_filter=+ + AUTO_BED_LEVELING_UBL = src_filter=+ + +UBL_HILBERT_CURVE = src_filter=+ BACKLASH_COMPENSATION = src_filter=+ BARICUDA = src_filter=+ + BINARY_FILE_TRANSFER = src_filter=+ + From 9f48314cb469cfa27571224dc03310248e585ea3 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Sun, 28 Mar 2021 20:27:02 -0400 Subject: [PATCH 1211/1370] YHCB2004 pins followup (#21472) --- Marlin/src/pins/mega/pins_GT2560_V3.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 11824fae4a..dd2d1d0f65 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -157,16 +157,16 @@ #if ENABLED(YHCB2004) #ifndef YHCB2004_CLK - #define YHCB2004_CLK 5 - #define DIO52 YHCB2004_CLK + #define YHCB2004_CLK 5 + #define DIO52 YHCB2004_CLK #endif #ifndef YHCB2004_MOSI - #define YHCB2004_MOSI 36 - #define DIO51 YHCB2004_MOSI + #define YHCB2004_MOSI 21 + #define DIO50 YHCB2004_MOSI #endif #ifndef YHCB2004_MISO - #define YHCB2004_MISO 21 - #define DIO50 YHCB2004_MISO + #define YHCB2004_MISO 36 + #define DIO51 YHCB2004_MISO #endif #elif HAS_WIRED_LCD #ifndef LCD_PINS_RS @@ -209,4 +209,4 @@ #ifndef BTN_ENC #define BTN_ENC 19 #endif -#endif \ No newline at end of file +#endif From f1986545daab5ca661b400f27d2b3762c7276f38 Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Mon, 29 Mar 2021 01:41:56 -0500 Subject: [PATCH 1212/1370] Laser Coolant Flow Meter / Safety Shutdown (#21431) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 15 ++ Marlin/src/core/language.h | 1 + Marlin/src/feature/cooler.cpp | 22 ++- Marlin/src/feature/cooler.h | 95 ++++++++-- Marlin/src/feature/spindle_laser.h | 5 +- Marlin/src/gcode/gcode.cpp | 11 ++ Marlin/src/inc/SanityCheck.h | 4 + Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 93 +++++++--- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 182 +++++++++++++------- Marlin/src/lcd/dogm/status/cooler.h | 94 +++++++--- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 80 +++++---- Marlin/src/lcd/language/language_en.h | 3 +- Marlin/src/lcd/marlinui.cpp | 6 + Marlin/src/lcd/marlinui.h | 5 + Marlin/src/lcd/menu/menu_temperature.cpp | 14 +- Marlin/src/libs/numtostr.cpp | 9 + Marlin/src/libs/numtostr.h | 3 + Marlin/src/module/temperature.cpp | 19 +- buildroot/tests/mega2560 | 20 +++ platformio.ini | 4 +- 20 files changed, 512 insertions(+), 173 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a7af076155..d3ad971e6d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -204,6 +204,20 @@ #endif #endif +// +// Laser Coolant Flow Meter +// +//#define LASER_COOLANT_FLOW_METER +#if ENABLED(LASER_COOLANT_FLOW_METER) + #define FLOWMETER_PIN 20 // Requires an external interrupt-enabled pin (e.g., RAMPS 2,3,18,19,20,21) + #define FLOWMETER_PPL 5880 // (pulses/liter) Flow meter pulses-per-liter on the input pin + #define FLOWMETER_INTERVAL 1000 // (ms) Flow rate calculation interval in milliseconds + #define FLOWMETER_SAFETY // Prevent running the laser without the minimum flow rate set below + #if ENABLED(FLOWMETER_SAFETY) + #define FLOWMETER_MIN_LITERS_PER_MINUTE 1.5 // (liters/min) Minimum flow required when enabled + #endif +#endif + /** * Thermal Protection provides additional protection to your printer from damage * and fire. Marlin always includes safe min and max temperature ranges which @@ -1539,6 +1553,7 @@ #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating //#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active //#define STATUS_COOLER_ANIM // Use a second bitmap to indicate laser cooling + //#define STATUS_FLOWMETER_ANIM // Use multiple bitmaps to indicate coolant flow //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 71e8ea524c..de29535f87 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -130,6 +130,7 @@ #define STR_COUNT_A " Count A:" #define STR_WATCHDOG_FIRED "Watchdog timeout. Reset required." #define STR_ERR_KILLED "Printer halted. kill() called!" +#define STR_FLOWMETER_FAULT "Coolant flow fault. Flowmeter safety is active. Attention required." #define STR_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" #define STR_ERR_SERIAL_MISMATCH "Serial status mismatch" #define STR_BUSY_PROCESSING "busy: processing" diff --git a/Marlin/src/feature/cooler.cpp b/Marlin/src/feature/cooler.cpp index 03640df487..a1f25c5fad 100644 --- a/Marlin/src/feature/cooler.cpp +++ b/Marlin/src/feature/cooler.cpp @@ -27,11 +27,21 @@ #include "cooler.h" Cooler cooler; -uint16_t Cooler::flowrate; // Flow meter reading in liters, 0 will result in shutdown if equiped -uint8_t Cooler::mode = 0; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling -uint16_t Cooler::capacity; // Cooling capacity in watts -uint16_t Cooler::load; // Cooling load in watts -bool Cooler::flowmeter = false; -bool Cooler::state = false; // on = true, off = false +uint8_t Cooler::mode = 0; +uint16_t Cooler::capacity; +uint16_t Cooler::load; +bool Cooler::enabled = false; +#if ENABLED(LASER_COOLANT_FLOW_METER) + bool Cooler::flowmeter = false; + millis_t Cooler::flowmeter_next_ms; // = 0 + volatile uint16_t Cooler::flowpulses; + float Cooler::flowrate; #endif + +#if ENABLED(FLOWMETER_SAFETY) + bool Cooler::flowsafety_enabled = true; + bool Cooler::fault = false; +#endif + +#endif // HAS_COOLER diff --git a/Marlin/src/feature/cooler.h b/Marlin/src/feature/cooler.h index 42a95ccb63..1e24c729f3 100644 --- a/Marlin/src/feature/cooler.h +++ b/Marlin/src/feature/cooler.h @@ -21,30 +21,91 @@ */ #pragma once -#include +#include "../inc/MarlinConfigPre.h" -#define _MSG_COOLER(M) MSG_COOLER_##M -#define MSG_COOLER(M) _MSG_COOLER(M) +#ifndef FLOWMETER_PPL + #define FLOWMETER_PPL 5880 // Pulses per liter +#endif +#ifndef FLOWMETER_INTERVAL + #define FLOWMETER_INTERVAL 1000 // milliseconds +#endif // Cooling device class Cooler { public: - static uint16_t flowrate; // Flow meter reading in liters, 0 will result in shutdown if equiped - static uint8_t mode; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling - static uint16_t capacity; // Cooling capacity in watts - static uint16_t load; // Cooling load in watts - static bool flowmeter; - static bool state; // on = true, off = false + static uint16_t capacity; // Cooling capacity in watts + static uint16_t load; // Cooling load in watts - static bool is_enabled() { return state; } - static void enable() { state = true; } - static void disable() { state = false; } - static void set_mode(const uint8_t m) { mode = m; } - static void set_flowmeter(const bool sflag) { flowmeter = sflag; } - static uint16_t get_flowrate() { return flowrate; } - static void update_flowrate(uint16_t flow) { flowrate = flow; } - //static void init() { set_state(false); } + static bool enabled; + static void enable() { enabled = true; } + static void disable() { enabled = false; } + static void toggle() { enabled = !enabled; } + + static uint8_t mode; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling + static void set_mode(const uint8_t m) { mode = m; } + + #if ENABLED(LASER_COOLANT_FLOW_METER) + static float flowrate; // Flow meter reading in liters-per-minute. + static bool flowmeter; // Flag to monitor the flow + static volatile uint16_t flowpulses; // Flowmeter IRQ pulse count + static millis_t flowmeter_next_ms; // Next time at which to calculate flow + + static void set_flowmeter(const bool sflag) { + if (flowmeter != sflag) { + flowmeter = sflag; + if (sflag) { + flowpulses = 0; + flowmeter_next_ms = millis() + FLOWMETER_INTERVAL; + } + } + } + + // To calculate flow we only need to count pulses + static void flowmeter_ISR() { flowpulses++; } + + // Enable / Disable the flow meter interrupt + static void flowmeter_interrupt_enable() { + attachInterrupt(digitalPinToInterrupt(FLOWMETER_PIN), flowmeter_ISR, RISING); + } + static void flowmeter_interrupt_disable() { + detachInterrupt(digitalPinToInterrupt(FLOWMETER_PIN)); + } + + // Enable / Disable the flow meter interrupt + static void flowmeter_enable() { set_flowmeter(true); flowpulses = 0; flowmeter_interrupt_enable(); } + static void flowmeter_disable() { set_flowmeter(false); flowmeter_interrupt_disable(); flowpulses = 0; } + + // Get the total flow (in liters per minute) since the last reading + static void calc_flowrate() { + //flowmeter_interrupt_disable(); + // const uint16_t pulses = flowpulses; + //flowmeter_interrupt_enable(); + flowrate = flowpulses * 60.0f * (1000.0f / (FLOWMETER_INTERVAL)) * (1000.0f / (FLOWMETER_PPL)); + flowpulses = 0; + } + + // Userland task to update the flow meter + static void flowmeter_task(const millis_t ms=millis()) { + if (!flowmeter) // !! The flow meter must always be on !! + flowmeter_enable(); // Init and prime + if (ELAPSED(ms, flowmeter_next_ms)) { + calc_flowrate(); + flowmeter_next_ms = ms + FLOWMETER_INTERVAL; + } + } + + #if ENABLED(FLOWMETER_SAFETY) + static bool fault; // Flag that the cooler is in a fault state + static bool flowsafety_enabled; // Flag to disable the cutter if flow rate is too low + static void flowsafety_toggle() { flowsafety_enabled = !flowsafety_enabled; } + static bool check_flow_too_low() { + const bool too_low = flowsafety_enabled && flowrate < (FLOWMETER_MIN_LITERS_PER_MINUTE); + if (too_low) fault = true; + return too_low; + } + #endif + #endif }; extern Cooler cooler; diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index d50bc7eb42..b3d008851c 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -215,8 +215,7 @@ public: static inline void disable() { isReady = false; set_enabled(false); } #if HAS_LCD_MENU - - static inline void enable_with_dir(const bool reverse) { + static inline void enable_with_dir(const bool reverse) { isReady = true; const uint8_t ocr = TERN(SPINDLE_LASER_PWM, upower_to_ocr(menuPower), 255); if (menuPower) @@ -245,8 +244,8 @@ public: * If not set defaults to 80% power */ static inline void test_fire_pulse() { - enable_forward(); // Turn Laser on (Spindle speak but same funct) TERN_(USE_BEEPER, buzzer.tone(30, 3000)); + enable_forward(); // Turn Laser on (Spindle speak but same funct) delay(testPulse); // Delay for time set by user in pulse ms menu screen. disable(); // Turn laser off } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index aa206bfeba..cdf11e870b 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -57,6 +57,10 @@ GcodeSuite gcode; #include "../feature/spindle_laser.h" #endif +#if ENABLED(FLOWMETER_SAFETY) + #include "../feature/cooler.h" +#endif + #if ENABLED(PASSWORD_FEATURE) #include "../feature/password/password.h" #endif @@ -278,6 +282,13 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { } #endif + #if ENABLED(FLOWMETER_SAFETY) + if (cooler.fault) { + SERIAL_ECHO_MSG(STR_FLOWMETER_FAULT); + return; + } + #endif + // Handle a known G, M, or T switch (parser.command_letter) { case 'G': switch (parser.codenum) { diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 704163e2b2..6ed0f53245 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1895,6 +1895,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_COOLER requires LASER_FEATURE and TEMP_COOLER_PIN." #endif +#if ENABLED(LASER_COOLANT_FLOW_METER) && !(PIN_EXISTS(FLOWMETER) && ENABLED(LASER_FEATURE)) + #error "LASER_COOLANT_FLOW_METER requires FLOWMETER_PIN and LASER_FEATURE." +#endif + #if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2)) #error "CHAMBER_FAN_MODE must be between 0 and 2." #endif diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 3f4cc23aba..683c1c0884 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -46,6 +46,10 @@ #include "../../gcode/parser.h" #endif +#if HAS_COOLER || HAS_FLOWMETER + #include "../../feature/cooler.h" +#endif + #if ENABLED(AUTO_BED_LEVELING_UBL) #include "../../feature/bedlevel/bedlevel.h" #endif @@ -517,6 +521,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const lcd_put_u8str(value); } + FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { #if HAS_HEATED_BED const bool isBed = TERN(HAS_HEATED_CHAMBER, heater_id == H_BED, heater_id < 0); @@ -550,6 +555,43 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char pr } } +#if HAS_COOLER +FORCE_INLINE void _draw_cooler_status(const char prefix, const bool blink) { + const float t1 = thermalManager.degCooler(), t2 = thermalManager.degTargetCooler(); + + if (prefix >= 0) lcd_put_wchar(prefix); + + lcd_put_u8str(i16tostr3rj(t1 + 0.5)); + lcd_put_wchar('/'); + + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #else + if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) { + lcd_put_wchar(' '); + if (t2 >= 10) lcd_put_wchar(' '); + if (t2 >= 100) lcd_put_wchar(' '); + } + else + #endif + lcd_put_u8str(i16tostr3left(t2 + 0.5)); + + if (prefix >= 0) { + lcd_put_wchar(LCD_STR_DEGREE[0]); + lcd_put_wchar(' '); + if (t2 < 10) lcd_put_wchar(' '); + } +} +#endif + +#if HAS_FLOWMETER + FORCE_INLINE void _draw_flowmeter_status() { + lcd_put_u8str("~ "); + lcd_put_u8str(ftostr11ns(cooler.flowrate)); + lcd_put_wchar('L'); + } +#endif + FORCE_INLINE void _draw_bed_status(const bool blink) { _draw_heater_status(H_BED, TERN0(HAS_LEVELING, blink && planner.leveling_active) ? '_' : LCD_STR_BEDTEMP[0], blink); } @@ -747,17 +789,19 @@ void MarlinUI::draw_status_screen() { // // Hotend 0 Temperature // - _draw_heater_status(H_E0, -1, blink); + #if HAS_HOTEND + _draw_heater_status(H_E0, -1, blink); - // - // Hotend 1 or Bed Temperature - // - #if HAS_MULTI_HOTEND - lcd_moveto(8, 0); - _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); - #elif HAS_HEATED_BED - lcd_moveto(8, 0); - _draw_bed_status(blink); + // + // Hotend 1 or Bed Temperature + // + #if HAS_MULTI_HOTEND + lcd_moveto(8, 0); + _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); + #elif HAS_HEATED_BED + lcd_moveto(8, 0); + _draw_bed_status(blink); + #endif #endif #else // LCD_WIDTH >= 20 @@ -765,17 +809,26 @@ void MarlinUI::draw_status_screen() { // // Hotend 0 Temperature // - _draw_heater_status(H_E0, LCD_STR_THERMOMETER[0], blink); + #if HAS_HOTEND + _draw_heater_status(H_E0, LCD_STR_THERMOMETER[0], blink); - // - // Hotend 1 or Bed Temperature - // - #if HAS_MULTI_HOTEND - lcd_moveto(10, 0); - _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); - #elif HAS_HEATED_BED - lcd_moveto(10, 0); - _draw_bed_status(blink); + // + // Hotend 1 or Bed Temperature + // + #if HAS_MULTI_HOTEND + lcd_moveto(10, 0); + _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); + #elif HAS_HEATED_BED + lcd_moveto(10, 0); + _draw_bed_status(blink); + #endif + #endif + + #if HAS_COOLER + _draw_cooler_status('*', blink); + #endif + #if HAS_FLOWMETER + _draw_flowmeter_status(); #endif #endif // LCD_WIDTH >= 20 diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index d0dc288613..396b05b084 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -77,9 +77,12 @@ #ifndef STATUS_CUTTER_WIDTH #define STATUS_CUTTER_WIDTH 0 #endif + #ifndef STATUS_CUTTER_BYTEWIDTH + #define STATUS_CUTTER_BYTEWIDTH BW(STATUS_CUTTER_WIDTH) + #endif // -// Laser Cooler +// Laser cooler // #if !STATUS_COOLER_WIDTH && HAS_COOLER #include "status/cooler.h" @@ -87,6 +90,24 @@ #ifndef STATUS_COOLER_WIDTH #define STATUS_COOLER_WIDTH 0 #endif +#ifndef STATUS_COOLER_BYTEWIDTH + #define STATUS_COOLER_BYTEWIDTH BW(STATUS_COOLER_WIDTH) +#endif + +// +// Laser Flowmeter +// +#if !STATUS_FLOWMETER_WIDTH && HAS_FLOWMETER + #include "status/cooler.h" +#endif +#ifndef STATUS_FLOWMETER_WIDTH + #define STATUS_FLOWMETER_WIDTH 0 +#endif +#ifndef STATUS_FLOWMETER_BYTEWIDTH + #define STATUS_FLOWMETER_BYTEWIDTH BW(STATUS_FLOWMETER_WIDTH) +#endif + + // // Bed @@ -425,46 +446,45 @@ // // Cutter Bitmap Properties // -#ifndef STATUS_CUTTER_BYTEWIDTH - #define STATUS_CUTTER_BYTEWIDTH BW(STATUS_CUTTER_WIDTH) -#endif -#if STATUS_CUTTER_WIDTH +#if HAS_CUTTER + #if STATUS_CUTTER_WIDTH - #ifndef STATUS_CUTTER_X - #define STATUS_CUTTER_X (LCD_PIXEL_WIDTH - (STATUS_CUTTER_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) - #endif - - #ifndef STATUS_CUTTER_HEIGHT - #ifdef STATUS_CUTTER_ANIM - #define STATUS_CUTTER_HEIGHT(S) ((S) ? sizeof(status_cutter_on_bmp) / (STATUS_CUTTER_BYTEWIDTH) : sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) - #else - #define STATUS_CUTTER_HEIGHT(S) (sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) + #ifndef STATUS_CUTTER_X + #define STATUS_CUTTER_X (LCD_PIXEL_WIDTH - (STATUS_CUTTER_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) #endif - #endif - #ifndef STATUS_CUTTER_Y - #define STATUS_CUTTER_Y(S) 4 - #endif + #ifndef STATUS_CUTTER_HEIGHT + #ifdef STATUS_CUTTER_ANIM + #define STATUS_CUTTER_HEIGHT(S) ((S) ? sizeof(status_cutter_on_bmp) / (STATUS_CUTTER_BYTEWIDTH) : sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) + #else + #define STATUS_CUTTER_HEIGHT(S) (sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) + #endif + #endif - #ifndef STATUS_CUTTER_TEXT_X - #define STATUS_CUTTER_TEXT_X (STATUS_CUTTER_X -1) - #endif + #ifndef STATUS_CUTTER_Y + #define STATUS_CUTTER_Y(S) 4 + #endif - #ifndef STATUS_CUTTER_TEXT_Y - #define STATUS_CUTTER_TEXT_Y 28 - #endif + #ifndef STATUS_CUTTER_TEXT_X + #define STATUS_CUTTER_TEXT_X (STATUS_CUTTER_X -1) + #endif + + #ifndef STATUS_CUTTER_TEXT_Y + #define STATUS_CUTTER_TEXT_Y 28 + #endif - static_assert( - sizeof(status_cutter_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(0)), - "Status cutter bitmap (status_cutter_bmp) dimensions don't match data." - ); - #ifdef STATUS_CUTTER_ANIM static_assert( - sizeof(status_cutter_on_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(1)), - "Status cutter bitmap (status_cutter_on_bmp) dimensions don't match data." + sizeof(status_cutter_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(0)), + "Status cutter bitmap (status_cutter_bmp) dimensions don't match data." ); - #endif + #ifdef STATUS_CUTTER_ANIM + static_assert( + sizeof(status_cutter_on_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(1)), + "Status cutter bitmap (status_cutter_on_bmp) dimensions don't match data." + ); + #endif + #endif #endif // @@ -511,42 +531,72 @@ // // Cooler Bitmap Properties // -#ifndef STATUS_COOLER_BYTEWIDTH - #define STATUS_COOLER_BYTEWIDTH BW(STATUS_COOLER_WIDTH) -#endif -#if STATUS_COOLER_WIDTH +#if HAS_COOLER + #if STATUS_COOLER_WIDTH - #ifndef STATUS_COOLER_X - #define STATUS_COOLER_X (LCD_PIXEL_WIDTH - (STATUS_COOLER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) - #endif + #ifndef STATUS_COOLER_X + #define STATUS_COOLER_X (LCD_PIXEL_WIDTH - (STATUS_COOLER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) + #endif - #ifndef STATUS_COOLER_HEIGHT + #ifndef STATUS_COOLER_HEIGHT + #define STATUS_COOLER_HEIGHT(S) (sizeof(status_cooler_bmp1) / (STATUS_COOLER_BYTEWIDTH)) + #endif + + #ifndef STATUS_COOLER_Y + #define STATUS_COOLER_Y(S) (18 - STATUS_COOLER_HEIGHT(S)) + #endif + + #ifndef STATUS_COOLER_TEXT_X + #define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 8) + #endif + + static_assert( + sizeof(status_cooler_bmp1) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(0)), + "Status cooler bitmap (status_cooler_bmp1) dimensions don't match data." + ); #ifdef STATUS_COOLER_ANIM - #define STATUS_COOLER_HEIGHT(S) ((S) ? sizeof(status_cooler_on_bmp) / (STATUS_COOLER_BYTEWIDTH) : sizeof(status_cooler_bmp) / (STATUS_COOLER_BYTEWIDTH)) - #else - #define STATUS_COOLER_HEIGHT(S) (sizeof(status_cooler_bmp) / (STATUS_COOLER_BYTEWIDTH)) + static_assert( + sizeof(status_cooler_bmp2) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(1)), + "Status cooler bitmap (status_cooler_bmp2) dimensions don't match data." + ); + #endif + + #endif +#endif + +// +// Flowmeter Bitmap Properties +// +#if HAS_FLOWMETER + #if STATUS_FLOWMETER_WIDTH + + #ifndef STATUS_FLOWMETER_X + #define STATUS_FLOWMETER_X (LCD_PIXEL_WIDTH - (STATUS_FLOWMETER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH + STATUS_COOLER_BYTEWIDTH) * 8) + #endif + + #ifndef STATUS_FLOWMETER_HEIGHT + #define STATUS_FLOWMETER_HEIGHT(S) (sizeof(status_flowmeter_bmp1) / (STATUS_FLOWMETER_BYTEWIDTH)) + #endif + + #ifndef STATUS_FLOWMETER_Y + #define STATUS_FLOWMETER_Y(S) (20 - STATUS_FLOWMETER_HEIGHT(S)) + #endif + + #ifndef STATUS_FLOWMETER_TEXT_X + #define STATUS_FLOWMETER_TEXT_X (STATUS_FLOWMETER_X + 8) + #endif + + static_assert( + sizeof(status_flowmeter_bmp1) == (STATUS_FLOWMETER_BYTEWIDTH) * STATUS_FLOWMETER_HEIGHT(0), + "Status flowmeter bitmap (status_flowmeter_bmp1) dimensions don't match data." + ); + #ifdef STATUS_COOLER_ANIM + static_assert( + sizeof(status_flowmeter_bmp2) == (STATUS_FLOWMETER_BYTEWIDTH) * STATUS_FLOWMETER_HEIGHT(1), + "Status flowmeter bitmap (status_flowmeter_bmp2) dimensions don't match data." + ); #endif #endif - - #ifndef STATUS_COOLER_Y - #define STATUS_COOLER_Y(S) (18 - STATUS_COOLER_HEIGHT(S)) - #endif - - #ifndef STATUS_COOLER_TEXT_X - #define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 8) - #endif - - static_assert( - sizeof(status_cooler_bmp) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(0)), - "Status cooler bitmap (status_cooler_bmp) dimensions don't match data." - ); - #ifdef STATUS_COOLER_ANIM - static_assert( - sizeof(status_cooler_on_bmp) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(1)), - "Status cooler bitmap (status_cooler_on_bmp) dimensions don't match data." - ); - #endif - #endif // @@ -639,6 +689,9 @@ #if HAS_COOLER #define DO_DRAW_COOLER 1 #endif +#if HAS_FLOWMETER + #define DO_DRAW_FLOWMETER 1 +#endif #if HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4 #define DO_DRAW_CHAMBER 1 @@ -661,6 +714,9 @@ #if BOTH(DO_DRAW_COOLER, STATUS_COOLER_ANIM) #define ANIM_COOLER 1 #endif +#if BOTH(DO_DRAW_FLOWMETER, STATUS_FLOWMETER_ANIM) + #define ANIM_FLOWMETER 1 +#endif #if ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER #define ANIM_HBCC 1 #endif diff --git a/Marlin/src/lcd/dogm/status/cooler.h b/Marlin/src/lcd/dogm/status/cooler.h index 4e59e237a2..0d72efea72 100644 --- a/Marlin/src/lcd/dogm/status/cooler.h +++ b/Marlin/src/lcd/dogm/status/cooler.h @@ -24,12 +24,9 @@ // // lcd/dogm/status/cooler.h - Status Screen Laser Cooler bitmaps // - -#define STATUS_COOLER_WIDTH 16 - -#ifdef STATUS_COOLER_ANIM - - const unsigned char status_cooler_on_bmp[] PROGMEM = { +#if HAS_COOLER + #define STATUS_COOLER_WIDTH 16 + const unsigned char status_cooler_bmp2[] PROGMEM = { B00010000,B00001000, B00010010,B01001001, B01010100,B00101010, @@ -47,24 +44,71 @@ B00000010,B10100000, B00000100,B10010000 }; - + const unsigned char status_cooler_bmp1[] PROGMEM = { + B00010000,B00001000, + B00010010,B01001001, + B01010100,B00101010, + B00101000,B00010100, + B11000111,B01100011, + B00101000,B00010100, + B01010100,B00101010, + B10010000,B10001001, + B00010000,B10000000, + B00000100,B10010000, + B00000010,B10100000, + B00000001,B01000000, + B00011110,B00111100, + B00000001,B01000000, + B00000010,B10100000, + B00000100,B10010000 + }; +#endif + +#if HAS_FLOWMETER + #define STATUS_FLOWMETER_WIDTH 24 + const unsigned char status_flowmeter_bmp2[] PROGMEM = { + B00000001,B11111000,B00000000, + B00000110,B00000110,B00000000, + B00001000,B01100001,B00000000, + B00010000,B01100000,B10000000, + B00100000,B01100000,B01000000, + B00100000,B01100000,B01000000, + B01000000,B01100000,B00100000, + B01000000,B01100000,B00100000, + B01011111,B11111111,B10100000, + B01011111,B11111111,B10100000, + B01000000,B01100000,B00100000, + B01000000,B01100000,B00100000, + B00100000,B01100000,B01000000, + B00100000,B01100000,B01000000, + B00010000,B01100000,B10000000, + B00001000,B01100001,B00000000, + B00000110,B00000110,B00000000, + B00000001,B11111000,B00000000, + B00000000,B01100000,B00000000, + B00011111,B11111111,B10000000 + }; + const unsigned char status_flowmeter_bmp1[] PROGMEM = { + B00000001,B11111000,B00000000, + B00000110,B00000110,B00000000, + B00001000,B00000001,B00000000, + B00010100,B00000010,B10000000, + B00101110,B00000111,B01000000, + B00100111,B00001110,B01000000, + B01000011,B10011100,B00100000, + B01000001,B11111000,B00100000, + B01000000,B11110000,B00100000, + B01000000,B11110000,B00100000, + B01000001,B11111000,B00100000, + B01000011,B10011100,B00100000, + B00100111,B00001110,B01000000, + B00101110,B00000111,B01000000, + B00010100,B00000010,B10000000, + B00001000,B00000001,B00000000, + B00000110,B00000110,B00000000, + B00000001,B11111000,B00000000, + B00000000,B01100000,B00000000, + B00011111,B11111111,B10000000 + }; #endif -const unsigned char status_cooler_bmp[] PROGMEM = { - B00010000,B00001000, - B00010010,B01001001, - B01010100,B00101010, - B00101000,B00010100, - B11000111,B01100011, - B00101000,B00010100, - B01010100,B00101010, - B10010000,B10001001, - B00010000,B10000000, - B00000100,B10010000, - B00000010,B10100000, - B00000001,B01000000, - B00011110,B00111100, - B00000001,B01000000, - B00000010,B10100000, - B00000100,B10010000 -}; diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 7d97a1cdcf..2ec462c34a 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -53,6 +53,10 @@ #include "../../feature/spindle_laser.h" #endif +#if HAS_COOLER || HAS_FLOWMETER + #include "../../feature/cooler.h" +#endif + #if HAS_POWER_MONITOR #include "../../feature/power_monitor.h" #endif @@ -83,40 +87,34 @@ #if ANIM_HBCC enum HeatBits : uint8_t { - HEATBIT_HOTEND, - HEATBIT_BED = HOTENDS, - HEATBIT_CHAMBER, - HEATBIT_COOLER, - HEATBIT_CUTTER + DRAWBIT_HOTEND, + DRAWBIT_BED = HOTENDS, + DRAWBIT_CHAMBER, + DRAWBIT_CUTTER }; - IF<(HEATBIT_CUTTER > 7), uint16_t, uint8_t>::type heat_bits; + IF<(DRAWBIT_CUTTER > 7), uint16_t, uint8_t>::type draw_bits; #endif #if ANIM_HOTEND - #define HOTEND_ALT(N) TEST(heat_bits, HEATBIT_HOTEND + N) + #define HOTEND_ALT(N) TEST(draw_bits, DRAWBIT_HOTEND + N) #else #define HOTEND_ALT(N) false #endif #if ANIM_BED - #define BED_ALT() TEST(heat_bits, HEATBIT_BED) + #define BED_ALT() TEST(draw_bits, DRAWBIT_BED) #else #define BED_ALT() false #endif #if ANIM_CHAMBER - #define CHAMBER_ALT() TEST(heat_bits, HEATBIT_CHAMBER) + #define CHAMBER_ALT() TEST(draw_bits, DRAWBIT_CHAMBER) #else #define CHAMBER_ALT() false #endif #if ANIM_CUTTER - #define CUTTER_ALT(N) TEST(heat_bits, HEATBIT_CUTTER) + #define CUTTER_ALT(N) TEST(draw_bits, DRAWBIT_CUTTER) #else #define CUTTER_ALT() false #endif -#if ANIM_COOLER - #define COOLER_ALT(N) TEST(heat_bits, HEATBIT_COOLER) -#else - #define COOLER_ALT() false -#endif #if DO_DRAW_HOTENDS #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) @@ -194,6 +192,15 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co lcd_put_wchar(LCD_STR_DEGREE[0]); } +#if DO_DRAW_FLOWMETER + FORCE_INLINE void _draw_centered_flowrate(const float flow, const uint8_t tx, const uint8_t ty) { + const char *str = ftostr11ns(flow); + const uint8_t len = str[0] != ' ' ? 3 : str[1] != ' ' ? 2 : 1; + lcd_put_u8str(tx - len * (INFO_FONT_WIDTH) / 2 + 1, ty, &str[3-len]); + lcd_put_u8str("L"); + } +#endif + #if DO_DRAW_HOTENDS // Draw hotend bitmap with current and target temperatures @@ -384,6 +391,13 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co } #endif +#if DO_DRAW_FLOWMETER + FORCE_INLINE void _draw_flowmeter_status() { + if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) + _draw_centered_flowrate(cooler.flowrate, STATUS_FLOWMETER_TEXT_X, 28); + } +#endif + // // Before homing, blink '123' <-> '???'. // Homed but unknown... '123' <-> ' '. @@ -451,17 +465,14 @@ void MarlinUI::draw_status_screen() { #if ANIM_HBCC uint8_t new_bits = 0; #if ANIM_HOTEND - HOTEND_LOOP() if (thermalManager.isHeatingHotend(e)) SBI(new_bits, HEATBIT_HOTEND + e); + HOTEND_LOOP() if (thermalManager.isHeatingHotend(e)) SBI(new_bits, DRAWBIT_HOTEND + e); #endif - if (TERN0(ANIM_BED, thermalManager.isHeatingBed())) SBI(new_bits, HEATBIT_BED); + if (TERN0(ANIM_BED, thermalManager.isHeatingBed())) SBI(new_bits, DRAWBIT_BED); #if DO_DRAW_CHAMBER && HAS_HEATED_CHAMBER - if (thermalManager.isHeatingChamber()) SBI(new_bits, HEATBIT_CHAMBER); + if (thermalManager.isHeatingChamber()) SBI(new_bits, DRAWBIT_CHAMBER); #endif - #if DO_DRAW_COOLER && HAS_COOLER - if (thermalManager.isLaserCooling()) SBI(new_bits, HEATBIT_COOLER); - #endif - if (TERN0(ANIM_CUTTER, cutter.enabled())) SBI(new_bits, HEATBIT_CUTTER); - heat_bits = new_bits; + if (TERN0(ANIM_CUTTER, cutter.enabled())) SBI(new_bits, DRAWBIT_CUTTER); + draw_bits = new_bits; #endif const xyz_pos_t lpos = current_position.asLogical(); @@ -646,17 +657,21 @@ void MarlinUI::draw_status_screen() { // Laser Cooler #if DO_DRAW_COOLER - #if ANIM_COOLER - #define COOLER_BITMAP(S) ((S) ? status_cooler_bmp : status_cooler_on_bmp) - #else - #define COOLER_BITMAP(S) status_cooler_bmp - #endif - const uint8_t coolery = STATUS_COOLER_Y(COOLER_ALT()), - coolerh = STATUS_COOLER_HEIGHT(COOLER_ALT()); + const uint8_t coolery = STATUS_COOLER_Y(status_cooler_bmp1), + coolerh = STATUS_COOLER_HEIGHT(status_cooler_bmp1); if (PAGE_CONTAINS(coolery, coolery + coolerh - 1)) - u8g.drawBitmapP(STATUS_COOLER_X, coolery, STATUS_COOLER_BYTEWIDTH, coolerh, COOLER_BITMAP(COOLER_ALT())); + u8g.drawBitmapP(STATUS_COOLER_X, coolery, STATUS_COOLER_BYTEWIDTH, coolerh, blink && cooler.enabled ? status_cooler_bmp2 : status_cooler_bmp1); #endif + // Laser Cooler Flow Meter + #if DO_DRAW_FLOWMETER + const uint8_t flowmetery = STATUS_FLOWMETER_Y(status_flowmeter_bmp1), + flowmeterh = STATUS_FLOWMETER_HEIGHT(status_flowmeter_bmp1); + if (PAGE_CONTAINS(flowmetery, flowmetery + flowmeterh - 1)) + u8g.drawBitmapP(STATUS_FLOWMETER_X, flowmetery, STATUS_FLOWMETER_BYTEWIDTH, flowmeterh, blink && cooler.flowpulses ? status_flowmeter_bmp2 : status_flowmeter_bmp1); + #endif + + // Heated Bed TERN_(DO_DRAW_BED, _draw_bed_status(blink)); @@ -666,6 +681,9 @@ void MarlinUI::draw_status_screen() { // Cooler TERN_(DO_DRAW_COOLER, _draw_cooler_status()); + // Flowmeter + TERN_(DO_DRAW_FLOWMETER, _draw_flowmeter_status()); + // Fan, if a bitmap was provided #if DO_DRAW_FAN if (PAGE_CONTAINS(STATUS_FAN_TEXT_Y - INFO_FONT_ASCENT, STATUS_FAN_TEXT_Y - 1)) { diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 78d446dd99..81450d7385 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -116,10 +116,10 @@ namespace Language_en { PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Toggle Laser"); PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Test Pulse ms"); PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Fire Pulse"); + PROGMEM Language_Str MSG_FLOWMETER_FAULT = _UxGT("Coolant Flow Fault"); PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Toggle Spindle"); PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Spindle Forward"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Switch Power On"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Switch Power Off"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); @@ -278,6 +278,7 @@ namespace Language_en { PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); PROGMEM Language_Str MSG_COOLER = _UxGT("Laser Coolant"); PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Toggle Cooler"); + PROGMEM Language_Str MSG_FLOWMETER_SAFETY = _UxGT("Flow Safety"); PROGMEM Language_Str MSG_LASER = _UxGT("Laser"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Speed"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Speed ~"); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 8fef36e25a..4d457dc6aa 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1513,6 +1513,12 @@ void MarlinUI::update() { TERN_(HAS_LCD_MENU, return_to_status()); } + void MarlinUI::flow_fault() { + LCD_ALERTMESSAGEPGM(MSG_FLOWMETER_FAULT); + TERN_(HAS_BUZZER, buzz(1000, 440)); + TERN_(HAS_LCD_MENU, return_to_status()); + } + #if ANY(PARK_HEAD_ON_PAUSE, SDSUPPORT) #include "../gcode/queue.h" #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index cc08284d17..f85771f562 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -43,6 +43,10 @@ #define HAS_ENCODER_ACTION 1 #endif +#if HAS_STATUS_MESSAGE + #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) +#endif + #if E_MANUAL > 1 #define MULTI_MANUAL 1 #endif @@ -311,6 +315,7 @@ public: static void abort_print(); static void pause_print(); static void resume_print(); + static void flow_fault(); #if HAS_WIRED_LCD diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 8caf87d33b..fb47c22ce9 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -35,7 +35,7 @@ #include "../../module/motion.h" #endif -#if HAS_COOLER +#if HAS_COOLER || HAS_FLOWMETER #include "../../feature/cooler.h" #endif @@ -192,11 +192,19 @@ void menu_temperature() { // Cooler: // #if HAS_COOLER - editable.state = cooler.is_enabled(); - EDIT_ITEM(bool, MSG_COOLER(TOGGLE), &cooler.state, []{ if (editable.state) cooler.disable(); else cooler.enable(); }); + bool cstate = cooler.enabled; + EDIT_ITEM(bool, MSG_COOLER_TOGGLE, &cstate, cooler.toggle); EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MIN_TARGET, COOLER_MAX_TARGET, thermalManager.start_watching_cooler); #endif + // + // Flow Meter Safety Shutdown: + // + #if ENABLED(FLOWMETER_SAFETY) + bool fstate = cooler.flowsafety_enabled; + EDIT_ITEM(bool, MSG_FLOWMETER_SAFETY, &fstate, cooler.flowsafety_toggle); + #endif + // // Fan Speed: // diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index 90696e9ad3..283734faab 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -177,6 +177,15 @@ const char* i16tostr4signrj(const int16_t i) { return &conv[3]; } +// Convert unsigned float to string with 1.1 format +const char* ftostr11ns(const float &f) { + const long i = UINTFLOAT(f, 1); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return &conv[4]; +} + // Convert unsigned float to string with 1.23 format const char* ftostr12ns(const float &f) { const long i = UINTFLOAT(f, 2); diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index 40c298af42..54cebab252 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -61,6 +61,9 @@ const char* i16tostr3left(const int16_t xx); // Convert signed int to rj string with _123, -123, _-12, or __-1 format const char* i16tostr4signrj(const int16_t x); +// Convert unsigned float to string with 1.2 format +const char* ftostr11ns(const float &x); + // Convert unsigned float to string with 1.23 format const char* ftostr12ns(const float &x); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a9b7ab13eb..5a8704d3ba 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -35,7 +35,7 @@ #include "endstops.h" #include "planner.h" -#if HAS_COOLER +#if HAS_COOLER || HAS_FLOWMETER #include "../feature/cooler.h" #include "../feature/spindle_laser.h" #endif @@ -52,6 +52,10 @@ #include "../lcd/extui/ui_api.h" #endif +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "../feature/host_actions.h" +#endif + // LIB_MAX31855 can be added to the build_flags in platformio.ini to use a user-defined library #if LIB_USR_MAX31855 #include @@ -1506,7 +1510,7 @@ void Temperature::manage_heater() { static bool flag_cooler_state; // = false - if (cooler.is_enabled()) { + if (cooler.enabled) { flag_cooler_state = true; // used to allow M106 fan control when cooler is disabled if (temp_cooler.target == 0) temp_cooler.target = COOLER_MIN_TARGET; if (ELAPSED(ms, next_cooler_check_ms)) { @@ -1542,8 +1546,19 @@ void Temperature::manage_heater() { #if ENABLED(THERMAL_PROTECTION_COOLER) tr_state_machine[RUNAWAY_IND_COOLER].run(temp_cooler.celsius, temp_cooler.target, H_COOLER, THERMAL_PROTECTION_COOLER_PERIOD, THERMAL_PROTECTION_COOLER_HYSTERESIS); #endif + #endif // HAS_COOLER + #if HAS_FLOWMETER + cooler.flowmeter_task(ms); + #if ENABLED(FLOWMETER_SAFETY) + if (cutter.enabled() && cooler.check_flow_too_low()) { + cutter.disable(); + ui.flow_fault(); + } + #endif + #endif + UNUSED(ms); } diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index 4498492ba5..3c8f720238 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -167,6 +167,26 @@ exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" #opt_enable LCM1602 #exec_test $1 $2 "Stuff" "$3" +# +# Test Laser features with 12864 LCD +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS_14_EFB LCD_LANGUAGE en TEMP_SENSOR_COOLER 1 EXTRUDERS 0 TEMP_SENSOR_1 0 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ + LASER_FEATURE LASER_COOLANT_FLOW_METER + +exec_test $1 $2 "REPRAP MEGA2560 RAMPS | Laser Feature | Cooler | Flowmeter | 12864 LCD " "$3" + +# +# Test Laser features with 44780 LCD +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS_14_EFB LCD_LANGUAGE en TEMP_SENSOR_COOLER 1 EXTRUDERS 0 TEMP_SENSOR_1 0 +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ + LASER_FEATURE LASER_COOLANT_FLOW_METER + +exec_test $1 $2 "REPRAP MEGA2560 RAMPS | Laser Feature | Cooler | Flowmeter | 44780 LCD " "$3" + # # Language files test with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER # diff --git a/platformio.ini b/platformio.ini index 82c11c2b6d..26b27bbf99 100644 --- a/platformio.ini +++ b/platformio.ini @@ -82,6 +82,7 @@ default_src_filter = + - - + - - - - - + - - - - - - - @@ -198,7 +199,6 @@ default_src_filter = + - - + - - - - - - - - @@ -411,7 +411,7 @@ SDSUPPORT = src_filter=+ + GCODE_REPEAT_MARKERS = src_filter=+ + HAS_EXTRUDERS = src_filter=+ + -HAS_COOLER = src_filter=- +HAS_COOLER = src_filter=+ + AUTO_REPORT_TEMPERATURES = src_filter=+ INCH_MODE_SUPPORT = src_filter=+ TEMPERATURE_UNITS_SUPPORT = src_filter=+ From 3ed4503c302693e209eb85f96d9c8a6c43f9692d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 01:49:35 -0500 Subject: [PATCH 1213/1370] Adjust mfconfig script --- buildroot/share/git/mfconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/share/git/mfconfig b/buildroot/share/git/mfconfig index 3fd5e399cc..fe99d6b247 100755 --- a/buildroot/share/git/mfconfig +++ b/buildroot/share/git/mfconfig @@ -83,7 +83,7 @@ if [[ $ACTION == "init" ]]; then TEMP=$( mktemp -d ) ; cp -R config $TEMP # Make sure we're not on the 'BASE' branch... - git checkout master >/dev/null 2>&1 || exit + git checkout init-repo >/dev/null 2>&1 || exit # Create 'BASE' as a copy of 'init-repo' (README, LICENSE, etc.) git branch -D BASE 2>/dev/null From 627331aa684cae1ea15f0c38f67d4eeaf51fbb93 Mon Sep 17 00:00:00 2001 From: Malderin <52313714+Malderin@users.noreply.github.com> Date: Mon, 29 Mar 2021 11:19:38 +0300 Subject: [PATCH 1214/1370] Fix MKS LVGL UI Main screen / print buttons (#21468) --- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 2 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 10 ++-- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 8 +-- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 58 ++++++++++++------- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 46 +++++++-------- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 1 + Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 6 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 12 ++-- 9 files changed, 82 insertions(+), 63 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index c4ae6e221d..c4056f392a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -486,7 +486,7 @@ void lv_draw_dialog(uint8_t type) { void filament_sprayer_temp() { char buf[20] = {0}; - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, uiCfg.extruderIndex < 1 ? extrude_menu.ext1 : extrude_menu.ext2); strcat_P(public_buf_l, PSTR(": ")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 43ed214199..056e2e5d54 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -195,7 +195,7 @@ void disp_ext_speed() { void disp_hotend_temp() { char buf[20] = {0}; - sprintf(buf, extrude_menu.temp_value, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, extrude_menu.temp_value, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, extrude_menu.temper_text); strcat(public_buf_l, buf); lv_label_set_text(tempText, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 56a776c79e..296359bc53 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -50,8 +50,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_FILAMNT_IN: uiCfg.filament_load_heat_flg = true; - if ((abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1) - || (gCfgItems.filament_limit_temp <= thermalManager.degHotend(uiCfg.extruderIndex))) { + if (abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1 + || gCfgItems.filament_limit_temp <= thermalManager.degHotend(uiCfg.extruderIndex)) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } @@ -67,8 +67,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_FILAMNT_OUT: uiCfg.filament_unload_heat_flg = true; if (thermalManager.degTargetHotend(uiCfg.extruderIndex) - && ((abs((int)((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1) - || ((int)thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temp)) + && (abs((int)(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1 + || thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temp) ) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); @@ -154,7 +154,7 @@ void disp_filament_temp() { public_buf_l[0] = '\0'; strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 73a0808e9c..d23ed0b05f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -76,7 +76,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_P_DEC: if (uiCfg.curTempType == 0) { - if ((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) > uiCfg.stepHeat) + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) > uiCfg.stepHeat) thermalManager.temp_hotend[uiCfg.extruderIndex].target -= uiCfg.stepHeat; else thermalManager.setTargetHotend(0, uiCfg.extruderIndex); @@ -84,7 +84,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } #if HAS_HEATED_BED else { - if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) + if (thermalManager.degTargetBed() > uiCfg.stepHeat) thermalManager.temp_bed.target -= uiCfg.stepHeat; else thermalManager.setTargetBed(0); @@ -217,12 +217,12 @@ void disp_desire_temp() { if (uiCfg.curTempType == 0) { strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); } #if HAS_HEATED_BED else { strcat(public_buf_l, preheat_menu.hotbed); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); + sprintf(buf, preheat_menu.value_state, thermalManager.degBed(), thermalManager.degTargetBed()); } #endif strcat_P(public_buf_l, PSTR(": ")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 70c57f4af8..9bd120ce15 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -47,7 +47,7 @@ static lv_obj_t *scr; static lv_obj_t *labelExt1, *labelFan, *labelZpos, *labelTime; static lv_obj_t *labelPause, *labelStop, *labelOperat; static lv_obj_t *bar1, *bar1ValueText; -static lv_obj_t *buttonPause, *buttonOperat, *buttonStop; +static lv_obj_t *buttonPause, *buttonOperat, *buttonStop, *buttonExt1, *buttonExt2, *buttonBedstate, *buttonFanstate, *buttonZpos; #if ENABLED(HAS_MULTI_EXTRUDER) static lv_obj_t *labelExt2; @@ -60,7 +60,11 @@ static lv_obj_t *buttonPause, *buttonOperat, *buttonStop; enum { ID_PAUSE = 1, ID_STOP, - ID_OPTION + ID_OPTION, + ID_TEMP_EXT, + ID_TEMP_BED, + ID_BABYSTEP, + ID_FAN }; bool once_flag; // = false @@ -100,7 +104,6 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } #endif break; - case ID_STOP: lv_clear_printing(); lv_draw_dialog(DIALOG_TYPE_STOP); @@ -109,6 +112,24 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_clear_printing(); lv_draw_operation(); break; + case ID_TEMP_EXT: + uiCfg.curTempType = 0; + lv_clear_printing(); + lv_draw_preHeat(); + break; + case ID_TEMP_BED: + uiCfg.curTempType = 1; + lv_clear_printing(); + lv_draw_preHeat(); + break; + case ID_BABYSTEP: + lv_clear_printing(); + lv_draw_baby_stepping(); + break; + case ID_FAN: + lv_clear_printing(); + lv_draw_fan(); + break; } } @@ -118,33 +139,23 @@ void lv_draw_printing() { scr = lv_screen_create(PRINTING_UI); // Create image buttons - lv_obj_t *buttonExt1 = lv_img_create(scr, nullptr); - lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); - lv_obj_set_pos(buttonExt1, 205, 136); + buttonExt1 = lv_imgbtn_create(scr, "F:/bmp_ext1_state.bin", 206, 136, event_handler, ID_TEMP_EXT); #if HAS_MULTI_EXTRUDER - lv_obj_t *buttonExt2 = lv_img_create(scr, nullptr); - lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); - lv_obj_set_pos(buttonExt2, 350, 136); + buttonExt2 = lv_imgbtn_create(scr, "F:/bmp_ext2_state.bin", 350, 136, event_handler, ID_TEMP_EXT); #endif #if HAS_HEATED_BED - lv_obj_t *buttonBedstate = lv_img_create(scr, nullptr); - lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); - lv_obj_set_pos(buttonBedstate, 205, 186); + buttonBedstate = lv_imgbtn_create(scr, "F:/bmp_bed_state.bin", 206, 186, event_handler, ID_TEMP_BED); #endif - lv_obj_t *buttonFanstate = lv_img_create(scr, nullptr); - lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); - lv_obj_set_pos(buttonFanstate, 350, 186); + buttonFanstate = lv_imgbtn_create(scr, "F:/bmp_fan_state.bin", 350, 186, event_handler, ID_FAN); lv_obj_t *buttonTime = lv_img_create(scr, nullptr); lv_img_set_src(buttonTime, "F:/bmp_time_state.bin"); - lv_obj_set_pos(buttonTime, 205, 86); + lv_obj_set_pos(buttonTime, 206, 86); - lv_obj_t *buttonZpos = lv_img_create(scr, nullptr); - lv_img_set_src(buttonZpos, "F:/bmp_zpos_state.bin"); - lv_obj_set_pos(buttonZpos, 350, 86); + buttonZpos = lv_imgbtn_create(scr, "F:/bmp_zpos_state.bin", 350, 86, event_handler, ID_BABYSTEP); buttonPause = lv_imgbtn_create(scr, uiCfg.print_state == WORKING ? "F:/bmp_pause.bin" : "F:/bmp_resume.bin", 5, 240, event_handler, ID_PAUSE); buttonStop = lv_imgbtn_create(scr, "F:/bmp_stop.bin", 165, 240, event_handler, ID_STOP); @@ -155,6 +166,9 @@ void lv_draw_printing() { lv_group_add_obj(g, buttonPause); lv_group_add_obj(g, buttonStop); lv_group_add_obj(g, buttonOperat); + lv_group_add_obj(g, buttonPause); + lv_group_add_obj(g, buttonPause); + lv_group_add_obj(g, buttonPause); } #endif @@ -205,18 +219,18 @@ void lv_draw_printing() { } void disp_ext_temp() { - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); + sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(0), thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); + sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(1), thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2, public_buf_l); #endif } void disp_bed_temp() { #if HAS_HEATED_BED - sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); + sprintf(public_buf_l, printing_menu.bed_temp, thermalManager.degBed(), thermalManager.degTargetBed()); lv_label_set_text(labelBed, public_buf_l); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index acdfa24f1b..5787cfb009 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -63,7 +63,7 @@ static lv_obj_t *labelExt1, *labelExt1Target, *labelFan; uint8_t curent_disp_ui = 0; #endif -enum { ID_TOOL = 1, ID_SET, ID_PRINT }; +enum { ID_TOOL = 1, ID_SET, ID_PRINT, ID_INFO_EXT, ID_INFO_BED, ID_INFO_FAN }; static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; @@ -71,6 +71,9 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_TOOL: lv_draw_tool(); break; case ID_SET: lv_draw_set(); break; + case ID_INFO_EXT: uiCfg.curTempType = 0; lv_draw_preHeat(); break; + case ID_INFO_BED: uiCfg.curTempType = 1; lv_draw_preHeat(); break; + case ID_INFO_FAN: lv_draw_fan(); break; case ID_PRINT: lv_draw_print_file(); break; } } @@ -181,32 +184,14 @@ void lv_draw_ready_print() { lv_big_button_create(scr, "F:/bmp_printing.bin", main_menu.print, 340, 180, event_handler, ID_PRINT); // Monitoring - lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); + lv_obj_t *buttonExt1 = lv_big_button_create(scr, "F:/bmp_ext1_state.bin", " ", 55, ICON_POS_Y, event_handler, ID_INFO_EXT); #if HAS_MULTI_EXTRUDER - lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); + lv_obj_t *buttonExt2 = lv_big_button_create(scr, "F:/bmp_ext2_state.bin", " ", 55, ICON_POS_Y + SECOND_EXT_MOD_Y, event_handler, ID_INFO_EXT); #endif #if HAS_HEATED_BED - lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); + lv_obj_t *buttonBedstate = lv_big_button_create(scr, "F:/bmp_bed_state.bin", " ", 210, ICON_POS_Y, event_handler, ID_INFO_BED); #endif - lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); - - lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); - #if HAS_MULTI_EXTRUDER - lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); - #endif - #if HAS_HEATED_BED - lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); - #endif - lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); - - lv_obj_set_pos(buttonExt1, 55, ICON_POS_Y); - #if HAS_MULTI_EXTRUDER - lv_obj_set_pos(buttonExt2, 55, ICON_POS_Y + SECOND_EXT_MOD_Y); - #endif - #if HAS_HEATED_BED - lv_obj_set_pos(buttonBedstate, 210, ICON_POS_Y); - #endif - lv_obj_set_pos(buttonFanstate, 380, ICON_POS_Y); + lv_obj_t *buttonFanstate = lv_big_button_create(scr, "F:/bmp_fan_state.bin", " ", 380, ICON_POS_Y, event_handler, ID_INFO_FAN); labelExt1 = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); labelExt1Target = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); @@ -262,6 +247,21 @@ void lv_draw_ready_print() { #endif } +void lv_temp_refr() { + #if HAS_HEATED_BED + sprintf(public_buf_l, printing_menu.bed_temp, thermalManager.degBed(), thermalManager.degTargetBed()); + lv_label_set_text(labelBed, public_buf_l); + #endif + + sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(0), thermalManager.degTargetHotend(0)); + lv_label_set_text(labelExt1, public_buf_l); + + #if HAS_MULTI_EXTRUDER + sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(1), thermalManager.degTargetHotend(1)); + lv_label_set_text(labelExt2, public_buf_l); + #endif +} + void lv_clear_ready_print() { #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index a3cfd67665..56077e5dec 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -32,6 +32,7 @@ extern void disp_Limit_error(); extern void disp_det_error(); extern void disp_det_ok(); extern void lv_clear_ready_print(); +extern void lv_temp_refr(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 0c574b1e15..8d560a19a4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -805,6 +805,10 @@ void GUI_RefreshPage() { } break; case PRINT_READY_UI: + if (temps_update_flag) { + temps_update_flag = false; + lv_temp_refr(); + } break; case PRINT_FILE_UI: break; @@ -843,8 +847,8 @@ void GUI_RefreshPage() { #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: if (temps_update_flag) { - disp_wifi_state(); temps_update_flag = false; + disp_wifi_state(); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index ddf7173297..44aa2300e2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -897,9 +897,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcpy_P(outBuf, PSTR(" B:")); outBuf += 3; #if HAS_HEATED_BED - strcpy(outBuf, dtostrf(thermalManager.temp_bed.celsius, 1, 1, str_1)); + strcpy(outBuf, dtostrf(thermalManager.degBed(), 1, 1, str_1)); strcat_P(outBuf, PSTR(" /")); - strcat(outBuf, dtostrf(thermalManager.temp_bed.target, 1, 1, str_1)); + strcat(outBuf, dtostrf(thermalManager.degTargetBed(), 1, 1, str_1)); #else strcpy_P(outBuf, PSTR("0 /0")); #endif @@ -924,15 +924,15 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } else { sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), - (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0), + thermalManager.degHotend(0), thermalManager.degTargetHotend(0), #if HAS_HEATED_BED - (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target, + thermalManager.degBed(), thermalManager.degTargetBed(), #else 0, 0, #endif - (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0), + thermalManager.degHotend(0), thermalManager.degTargetHotend(0), #if HAS_MULTI_HOTEND - (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1) + thermalManager.degHotend(1), thermalManager.degTargetHotend(1) #else 0, 0 #endif From f734f79f5bfbfe27c389b9c278cc278182ef122d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 03:32:34 -0500 Subject: [PATCH 1215/1370] reduced verbiage --- Marlin/Makefile | 2 +- Marlin/src/core/boards.h | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/Makefile b/Marlin/Makefile index 19c2d0b329..a3ca81abdd 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -219,7 +219,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1111) else ifeq ($(HARDWARE_MOTHERBOARD),1112) # MKS GEN L else ifeq ($(HARDWARE_MOTHERBOARD),1113) -# zrib V2.0 control board (Chinese knock off RAMPS replica) +# zrib V2.0 control board (Chinese RAMPS replica) else ifeq ($(HARDWARE_MOTHERBOARD),1114) # BigTreeTech or BIQU KFB2.0 else ifeq ($(HARDWARE_MOTHERBOARD),1115) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index f0d967c763..46c198a0ed 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -68,8 +68,8 @@ #define BOARD_MKS_GEN_13 1112 // MKS GEN v1.3 or 1.4 #define BOARD_MKS_GEN_L 1113 // MKS GEN L #define BOARD_KFB_2 1114 // BigTreeTech or BIQU KFB2.0 -#define BOARD_ZRIB_V20 1115 // zrib V2.0 control board (Chinese knock off RAMPS replica) -#define BOARD_ZRIB_V52 1116 // zrib V5.2 control board (Chinese knock off RAMPS replica) +#define BOARD_ZRIB_V20 1115 // zrib V2.0 (Chinese RAMPS replica) +#define BOARD_ZRIB_V52 1116 // zrib V5.2 (Chinese RAMPS replica) #define BOARD_FELIX2 1117 // Felix 2.0+ Electronics Board (RAMPS like) #define BOARD_RIGIDBOARD 1118 // Invent-A-Part RigidBoard #define BOARD_RIGIDBOARD_V2 1119 // Invent-A-Part RigidBoard V2 @@ -87,7 +87,7 @@ #define BOARD_FORMBOT_RAPTOR 1131 // Formbot Raptor #define BOARD_FORMBOT_RAPTOR2 1132 // Formbot Raptor 2 #define BOARD_BQ_ZUM_MEGA_3D 1133 // bq ZUM Mega 3D -#define BOARD_MAKEBOARD_MINI 1134 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake +#define BOARD_MAKEBOARD_MINI 1134 // MakeBoard Mini v2.1.2 by MicroMake #define BOARD_TRIGORILLA_13 1135 // TriGorilla Anycubic version 1.3-based on RAMPS EFB #define BOARD_TRIGORILLA_14 1136 // ... Ver 1.4 #define BOARD_TRIGORILLA_14_11 1137 // ... Rev 1.1 (new servo pin order) @@ -174,8 +174,8 @@ #define BOARD_MELZI 1502 // Melzi #define BOARD_MELZI_V2 1503 // Melzi V2 #define BOARD_MELZI_MAKR3D 1504 // Melzi with ATmega1284 (MaKr3d version) -#define BOARD_MELZI_CREALITY 1505 // Melzi Creality3D board (for CR-10 etc) -#define BOARD_MELZI_MALYAN 1506 // Melzi Malyan M150 board +#define BOARD_MELZI_CREALITY 1505 // Melzi Creality3D (for CR-10 etc) +#define BOARD_MELZI_MALYAN 1506 // Melzi Malyan M150 #define BOARD_MELZI_TRONXY 1507 // Tronxy X5S #define BOARD_STB_11 1508 // STB V1.1 #define BOARD_AZTEEG_X1 1509 // Azteeg X1 @@ -194,8 +194,8 @@ #define BOARD_GEN7_12 1605 // Gen7 v1.1, v1.2 #define BOARD_GEN7_13 1606 // Gen7 v1.3 #define BOARD_GEN7_14 1607 // Gen7 v1.4 -#define BOARD_OMCA_A 1608 // Alpha OMCA board -#define BOARD_OMCA 1609 // Final OMCA board +#define BOARD_OMCA_A 1608 // Alpha OMCA +#define BOARD_OMCA 1609 // Final OMCA #define BOARD_SETHI 1610 // Sethi 3D_1 // @@ -226,7 +226,7 @@ #define BOARD_SELENA_COMPACT 2008 // Selena Compact (Power outputs: Hotend0, Hotend1, Bed0, Bed1, Fan0, Fan1) #define BOARD_BIQU_B300_V1_0 2009 // BIQU B300_V1.0 (Power outputs: Hotend0, Fan, Bed, SPI Driver) #define BOARD_MKS_SGEN_L 2010 // MKS-SGen-L (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_GMARSH_X6_REV1 2011 // GMARSH X6 board, revision 1 prototype +#define BOARD_GMARSH_X6_REV1 2011 // GMARSH X6, revision 1 prototype #define BOARD_BTT_SKR_V1_1 2012 // BigTreeTech SKR v1.1 (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_BTT_SKR_V1_3 2013 // BigTreeTech SKR v1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_BTT_SKR_V1_4 2014 // BigTreeTech SKR v1.4 (Power outputs: Hotend0, Hotend1, Fan, Bed) @@ -392,8 +392,8 @@ // #define BOARD_ESPRESSIF_ESP32 6000 // Generic ESP32 -#define BOARD_MRR_ESPA 6001 // MRR ESPA board based on ESP32 (native pins only) -#define BOARD_MRR_ESPE 6002 // MRR ESPE board based on ESP32 (with I2S stepper stream) +#define BOARD_MRR_ESPA 6001 // MRR ESPA based on ESP32 (native pins only) +#define BOARD_MRR_ESPE 6002 // MRR ESPE based on ESP32 (with I2S stepper stream) #define BOARD_E4D_BOX 6003 // E4d@BOX #define BOARD_FYSETC_E4 6004 // FYSETC E4 From 19078966d966bd471cb07b6d89726e5d15e21d05 Mon Sep 17 00:00:00 2001 From: George Fu Date: Mon, 29 Mar 2021 17:38:28 +0800 Subject: [PATCH 1216/1370] FYSETC Spider board (#21458) --- Marlin/src/core/boards.h | 19 ++-- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 18 ++- Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h | 110 +++++++++++++++++++ 4 files changed, 135 insertions(+), 14 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 46c198a0ed..a7ee18d6eb 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -368,15 +368,16 @@ #define BOARD_LERDGE_S 4212 // Lerdge S (STM32F407VE) #define BOARD_LERDGE_X 4213 // Lerdge X (STM32F407VE) #define BOARD_VAKE403D 4214 // VAkE 403D (STM32F446VET6) -#define BOARD_FYSETC_S6 4215 // FYSETC S6 board -#define BOARD_FYSETC_S6_V2_0 4216 // FYSETC S6 v2.0 board -#define BOARD_FLYF407ZG 4217 // FLYF407ZG board (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE) -#define BOARD_MKS_ROBIN_PRO_V2 4219 // MKS Robin Pro V2 (STM32F407VE) -#define BOARD_MKS_ROBIN_NANO_V3 4220 // MKS Robin Nano V3 (STM32F407VG) -#define BOARD_ANET_ET4 4221 // ANET ET4 V1.x (STM32F407VGT6) -#define BOARD_ANET_ET4P 4222 // ANET ET4P V1.x (STM32F407VGT6) -#define BOARD_FYSETC_CHEETAH_V20 4223 // FYSETC Cheetah V2.0 +#define BOARD_FYSETC_S6 4215 // FYSETC S6 (STM32F446VET6) +#define BOARD_FYSETC_S6_V2_0 4216 // FYSETC S6 v2.0 (STM32F446VET6) +#define BOARD_FYSETC_SPIDER 4217 // FYSETC Spider (STM32F446VET6) +#define BOARD_FLYF407ZG 4218 // FLYF407ZG (STM32F407ZG) +#define BOARD_MKS_ROBIN2 4219 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_MKS_ROBIN_PRO_V2 4220 // MKS Robin Pro V2 (STM32F407VE) +#define BOARD_MKS_ROBIN_NANO_V3 4221 // MKS Robin Nano V3 (STM32F407VG) +#define BOARD_ANET_ET4 4222 // ANET ET4 V1.x (STM32F407VGT6) +#define BOARD_ANET_ET4P 4223 // ANET ET4P V1.x (STM32F407VGT6) +#define BOARD_FYSETC_CHEETAH_V20 4224 // FYSETC Cheetah V2.0 // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 58a87f2313..8eecce2c17 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -600,6 +600,8 @@ #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 #elif MB(FYSETC_S6_V2_0) #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 +#elif MB(FYSETC_SPIDER) + #include "stm32f4/pins_FYSETC_SPIDER.h" // STM32F4 env:FYSETC_S6 #elif MB(FLYF407ZG) #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG #elif MB(MKS_ROBIN2) diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index d617087e9d..e6420dc238 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -24,7 +24,7 @@ #include "env_validate.h" #if HOTENDS > 3 || E_STEPPERS > 3 - #error "RUMBA32 supports up to 3 hotends / E-steppers." + #error "FYSETC S6 supports up to 3 hotends / E-steppers." #endif #ifndef BOARD_INFO_NAME @@ -168,10 +168,18 @@ // // Heaters / Fans // -#define HEATER_0_PIN PB3 -#define HEATER_1_PIN PB4 -#define HEATER_2_PIN PB15 -#define HEATER_BED_PIN PC8 +#ifndef HEATER_0_PIN + #define HEATER_0_PIN PB3 +#endif +#ifndef HEATER_0_PIN + #define HEATER_1_PIN PB4 +#endif +#ifndef HEATER_0_PIN + #define HEATER_2_PIN PB15 +#endif +#ifndef HEATER_0_PIN + #define HEATER_BED_PIN PC8 +#endif #define FAN_PIN PB0 #define FAN1_PIN PB1 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h b/Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h new file mode 100644 index 0000000000..a33f35bd55 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h @@ -0,0 +1,110 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "FYSETC SPIDER" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif + +// +// EEPROM Emulation +// +#if NO_EEPROM_SELECTED + #undef NO_EEPROM_SELECTED + //#define FLASH_EEPROM_EMULATION + //#define SRAM_EEPROM_EMULATION + #define I2C_EEPROM +#endif + +#if ENABLED(I2C_EEPROM) + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// +// Steppers +// +#define X2_STEP_PIN PD12 +#define X2_DIR_PIN PC4 +#define X2_ENABLE_PIN PE8 +#define X2_CS_PIN PA15 + +#define Z2_STEP_PIN PE1 +#define Z2_DIR_PIN PE0 +#define Z2_ENABLE_PIN PC5 +#define Z2_CS_PIN PD11 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB15 +#define HEATER_1_PIN PC8 +#define HEATER_2_PIN PB3 +#define HEATER_BED_PIN PB4 + +// +// Steppers +// +#define X_ENABLE_PIN PE9 + +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN PE7 + #define X_SERIAL_RX_PIN PE7 + #define Y_SERIAL_TX_PIN PE15 + #define Y_SERIAL_RX_PIN PE15 + #define Z_SERIAL_TX_PIN PD10 + #define Z_SERIAL_RX_PIN PD10 + #define E0_SERIAL_TX_PIN PD7 + #define E0_SERIAL_RX_PIN PD7 + #define E1_SERIAL_TX_PIN PC14 + #define E1_SERIAL_RX_PIN PC14 + #define E2_SERIAL_TX_PIN PC15 + #define E2_SERIAL_RX_PIN PC15 + #define X2_SERIAL_TX_PIN PA15 + #define X2_SERIAL_RX_PIN PA15 + #define Z2_SERIAL_TX_PIN PD11 + #define Z2_SERIAL_RX_PIN PD11 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#define TMC_USE_SW_SPI +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PE14 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PE13 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PE12 + #endif +#endif + +#if HOTENDS > 3 || E_STEPPERS > 3 + #error "FYSETC SPIDER supports up to 3 hotends / E-steppers." +#else + #include "pins_FYSETC_S6.h" +#endif From bf3fce3550009bafe0e7ea3cbe4511f2a23cf8f6 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 29 Mar 2021 22:43:07 +1300 Subject: [PATCH 1217/1370] GT2560 Rev.A Plus Z Max Pin with BLTouch (#21375) --- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index 2fb43a299f..1adf8d3079 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -47,10 +47,11 @@ #if ENABLED(BLTOUCH) #if MB(GT2560_REV_A_PLUS) #define SERVO0_PIN 11 + #define Z_MAX_PIN 32 #else #define SERVO0_PIN 32 + #define Z_MAX_PIN -1 #endif - #define Z_MAX_PIN -1 #else #define Z_MAX_PIN 32 #endif From 2059c6e4d06f12905256584682d95fe80dea075e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 20:36:37 -0500 Subject: [PATCH 1218/1370] Apply pointer formatting --- Marlin/src/HAL/AVR/HAL_SPI.cpp | 8 +- Marlin/src/HAL/DUE/HAL_SPI.cpp | 30 ++++---- Marlin/src/HAL/DUE/eeprom_flash.cpp | 14 ++-- Marlin/src/HAL/DUE/usb/udi_cdc.h | 4 +- Marlin/src/HAL/DUE/usb/usb_task.c | 2 +- Marlin/src/HAL/ESP32/HAL_SPI.cpp | 4 +- Marlin/src/HAL/ESP32/WebSocketSerial.cpp | 2 +- Marlin/src/HAL/ESP32/WebSocketSerial.h | 4 +- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 10 +-- .../u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp | 2 +- Marlin/src/HAL/SAMD51/HAL_SPI.cpp | 4 +- Marlin/src/HAL/STM32/HAL_SPI.cpp | 4 +- Marlin/src/HAL/STM32/MarlinSerial.h | 2 +- Marlin/src/HAL/STM32F1/HAL_SPI.cpp | 6 +- Marlin/src/HAL/STM32F1/eeprom_flash.cpp | 4 +- Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp | 4 +- Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp | 4 +- Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp | 4 +- Marlin/src/HAL/shared/HAL_MinSerial.h | 2 +- Marlin/src/HAL/shared/HAL_SPI.h | 6 +- Marlin/src/HAL/shared/backtrace/backtrace.cpp | 2 +- Marlin/src/HAL/shared/eeprom_api.h | 6 +- Marlin/src/HAL/shared/eeprom_if_spi.cpp | 2 +- Marlin/src/core/macros.h | 4 +- Marlin/src/core/serial_base.h | 6 +- Marlin/src/feature/binary_stream.h | 10 +-- Marlin/src/feature/meatpack.cpp | 2 +- Marlin/src/feature/meatpack.h | 2 +- Marlin/src/feature/mmu/mmu2.cpp | 14 ++-- Marlin/src/feature/mmu/mmu2.h | 10 +-- Marlin/src/feature/runout.h | 10 +-- Marlin/src/gcode/queue.cpp | 6 +- Marlin/src/gcode/queue.h | 6 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 4 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 4 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 4 +- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 6 +- .../dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 4 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 4 +- .../extui/lib/dgus/fysetc/DGUSScreenHandler.h | 6 +- .../lib/dgus/hiprecy/DGUSScreenHandler.h | 6 +- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 4 +- .../extui/lib/dgus/mks/DGUSScreenHandler.h | 10 +-- .../extui/lib/dgus/origin/DGUSScreenHandler.h | 6 +- .../archim2-flash/media_file_reader.cpp | 2 +- .../archim2-flash/media_file_reader.h | 2 +- .../ftdi_eve_lib/basic/spi.cpp | 4 +- .../ftdi_eve_lib/basic/spi.h | 4 +- .../ftdi_eve_lib/extended/sound_list.h | 2 +- .../ftdi_eve_lib/extended/sound_player.cpp | 2 +- .../ftdi_eve_lib/extended/sound_player.h | 2 +- .../ftdi_eve_lib/extended/text_ellipsis.cpp | 2 +- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- .../screens/bio_printing_dialog_box.cpp | 4 +- .../confirm_user_request_alert_box.cpp | 2 +- .../screens/files_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/files_screen.h | 2 +- .../screens/status_screen.cpp | 4 +- .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 12 +-- .../lcd/extui/lib/mks_ui/SPIFlashStorage.h | 12 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 20 ++--- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 4 +- .../src/lcd/extui/lib/nextion/nextion_tft.cpp | 4 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 14 ++-- Marlin/src/lcd/lcdprint.h | 2 +- Marlin/src/lcd/marlinui.h | 4 +- Marlin/src/lcd/menu/menu.h | 6 +- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 4 +- Marlin/src/lcd/tft/ui_common.cpp | 2 +- Marlin/src/libs/W25Qxx.cpp | 10 +-- Marlin/src/libs/W25Qxx.h | 10 +-- Marlin/src/libs/softspi.h | 4 +- Marlin/src/module/planner.cpp | 10 +-- Marlin/src/module/planner.h | 6 +- Marlin/src/module/stepper.cpp | 4 +- Marlin/src/module/stepper.h | 4 +- Marlin/src/module/stepper/trinamic.cpp | 6 +- Marlin/src/sd/Sd2Card.cpp | 22 +++--- Marlin/src/sd/Sd2Card.h | 16 ++-- Marlin/src/sd/SdBaseFile.cpp | 74 +++++++++---------- Marlin/src/sd/SdBaseFile.h | 38 +++++----- Marlin/src/sd/SdFatStructs.h | 8 +- Marlin/src/sd/SdFile.cpp | 4 +- Marlin/src/sd/SdFile.h | 4 +- Marlin/src/sd/SdVolume.cpp | 10 +-- Marlin/src/sd/SdVolume.h | 12 +-- Marlin/src/sd/cardreader.h | 2 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 4 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.h | 8 +- Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp | 14 ++-- .../src/sd/usb_flashdrive/lib-uhs2/UsbCore.h | 20 ++--- .../sd/usb_flashdrive/lib-uhs2/usbhost.cpp | 4 +- .../src/sd/usb_flashdrive/lib-uhs2/usbhost.h | 4 +- .../lib-uhs3/UHS_host/UHS_host_INLINE.h | 12 +-- .../lib-uhs3/UHS_host/UHS_usbhost.h | 14 ++-- .../USB_HOST_SHIELD/USB_HOST_SHIELD.h | 6 +- .../USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h | 6 +- .../variants/MARLIN_F4x7Vx/hal_conf_extra.h | 2 +- buildroot/share/fonts/genpages.c | 4 +- 102 files changed, 364 insertions(+), 364 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp index 3e5572e559..1a1b98b3dd 100644 --- a/Marlin/src/HAL/AVR/HAL_SPI.cpp +++ b/Marlin/src/HAL/AVR/HAL_SPI.cpp @@ -88,7 +88,7 @@ void spiBegin() { } /** SPI read data */ - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (nbyte-- == 0) return; SPDR = 0xFF; for (uint16_t i = 0; i < nbyte; i++) { @@ -107,7 +107,7 @@ void spiBegin() { } /** SPI send block */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } @@ -215,7 +215,7 @@ void spiBegin() { } // Soft SPI read data - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { for (uint16_t i = 0; i < nbyte; i++) buf[i] = spiRec(); } @@ -242,7 +242,7 @@ void spiBegin() { } // Soft SPI send block - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { spiSend(token); for (uint16_t i = 0; i < 512; i++) spiSend(buf[i]); diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 6cb2912c12..f42e8a9802 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -56,8 +56,8 @@ #pragma GCC optimize (3) typedef uint8_t (*pfnSpiTransfer)(uint8_t b); - typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte); - typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte); + typedef void (*pfnSpiRxBlock)(uint8_t *buf, uint32_t nbyte); + typedef void (*pfnSpiTxBlock)(const uint8_t *buf, uint32_t nbyte); /* ---------------- Macros to be able to access definitions from asm */ #define _PORT(IO) DIO ## IO ## _WPORT @@ -270,7 +270,7 @@ static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX; // Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded) - static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) { + static void spiTxBlock0(const uint8_t *ptr, uint32_t todo) { uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */ uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN); uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */ @@ -349,7 +349,7 @@ ); } - static void spiRxBlock0(uint8_t* ptr, uint32_t todo) { + static void spiRxBlock0(uint8_t *ptr, uint32_t todo) { uint32_t bin = 0; uint32_t work = 0; uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */ @@ -425,13 +425,13 @@ ); } - static void spiTxBlockX(const uint8_t* buf, uint32_t todo) { + static void spiTxBlockX(const uint8_t *buf, uint32_t todo) { do { (void)spiTransferTx(*buf++); } while (--todo); } - static void spiRxBlockX(uint8_t* buf, uint32_t todo) { + static void spiRxBlockX(uint8_t *buf, uint32_t todo) { do { *buf++ = spiTransferRx(0xFF); } while (--todo); @@ -463,7 +463,7 @@ return b; } - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (nbyte) { _SS_WRITE(LOW); WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1 @@ -478,7 +478,7 @@ _SS_WRITE(HIGH); } - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { _SS_WRITE(LOW); (void)spiTransferTx(token); spiTxBlock(buf, 512); @@ -645,7 +645,7 @@ } // Read from SPI into buffer - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (!nbyte) return; --nbyte; for (int i = 0; i < nbyte; i++) { @@ -668,7 +668,7 @@ //DELAY_US(1U); } - void spiSend(const uint8_t* buf, size_t nbyte) { + void spiSend(const uint8_t *buf, size_t nbyte) { if (!nbyte) return; --nbyte; for (size_t i = 0; i < nbyte; i++) { @@ -689,7 +689,7 @@ FLUSH_RX(); } - void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) { + void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) { if (!nbyte) return; --nbyte; for (size_t i = 0; i < nbyte; i++) { @@ -702,7 +702,7 @@ } // Write from buffer to SPI - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN); WHILE_TX(0); //WHILE_RX(0); @@ -801,19 +801,19 @@ uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); } - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { for (int i = 0; i < nbyte; i++) buf[i] = spiTransfer(0xFF); } void spiSend(uint8_t data) { spiTransfer(data); } - void spiSend(const uint8_t* buf, size_t nbyte) { + void spiSend(const uint8_t *buf, size_t nbyte) { for (uint16_t i = 0; i < nbyte; i++) spiTransfer(buf[i]); } - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { spiTransfer(token); for (uint16_t i = 0; i < 512; i++) spiTransfer(buf[i]); diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index 738f44acc9..14c843576c 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -139,7 +139,7 @@ static void ee_Dump(const int page, const void* data) { #ifdef EE_EMU_DEBUG - const uint8_t* c = (const uint8_t*) data; + const uint8_t *c = (const uint8_t*) data; char buffer[80]; sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page); @@ -293,8 +293,8 @@ static bool ee_PageWrite(uint16_t page, const void* data) { ee_Dump(-page, data); // Calculate count of changed bits - uint32_t* p1 = (uint32_t*)addrflash; - uint32_t* p2 = (uint32_t*)data; + uint32_t *p1 = (uint32_t*)addrflash; + uint32_t *p2 = (uint32_t*)data; int count = 0; for (i =0; i> 2; i++) { if (p1[i] != p2[i]) { @@ -470,7 +470,7 @@ static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer=false) { for (int page = curPage - 1; page >= 0; --page) { // Get a pointer to the flash page - uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); uint16_t i = 0; while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ @@ -550,7 +550,7 @@ static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) { for (int page = curPage - 1; page >= 0; --page) { // Get a pointer to the flash page - uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); uint16_t i = 0; while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ @@ -589,7 +589,7 @@ static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) { } static bool ee_IsPageClean(int page) { - uint32_t* pflash = (uint32_t*) getFlashStorage(page); + uint32_t *pflash = (uint32_t*) getFlashStorage(page); for (uint16_t i = 0; i < (PageSize >> 2); ++i) if (*pflash++ != 0xFFFFFFFF) return false; return true; @@ -599,7 +599,7 @@ static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData // Check if RAM buffer has something to be written bool isEmpty = true; - uint32_t* p = (uint32_t*) &buffer[0]; + uint32_t *p = (uint32_t*) &buffer[0]; for (uint16_t j = 0; j < (PageSize >> 2); j++) { if (*p++ != 0xFFFFFFFF) { isEmpty = false; diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.h b/Marlin/src/HAL/DUE/usb/udi_cdc.h index 0ecf7bb00e..b61845011a 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc.h +++ b/Marlin/src/HAL/DUE/usb/udi_cdc.h @@ -675,11 +675,11 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s * - \code // Waits and gets a value on CDC line int udi_cdc_getc(void); // Reads a RAM buffer on CDC line - iram_size_t udi_cdc_read_buf(int* buf, iram_size_t size); + iram_size_t udi_cdc_read_buf(int *buf, iram_size_t size); // Puts a byte on CDC line int udi_cdc_putc(int value); // Writes a RAM buffer on CDC line - iram_size_t udi_cdc_write_buf(const int* buf, iram_size_t size); \endcode + iram_size_t udi_cdc_write_buf(const int *buf, iram_size_t size); \endcode * * \section udi_cdc_use_cases Advanced use cases * For more advanced use of the UDI CDC module, see the following use cases: diff --git a/Marlin/src/HAL/DUE/usb/usb_task.c b/Marlin/src/HAL/DUE/usb/usb_task.c index 66bdb265d8..acb1d5b933 100644 --- a/Marlin/src/HAL/DUE/usb/usb_task.c +++ b/Marlin/src/HAL/DUE/usb/usb_task.c @@ -264,7 +264,7 @@ bool usb_task_extra_string(void) { ** Handle device requests that the ASF stack doesn't */ bool usb_task_other_requests(void) { - uint8_t* ptr = 0; + uint8_t *ptr = 0; uint16_t size = 0; if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) { diff --git a/Marlin/src/HAL/ESP32/HAL_SPI.cpp b/Marlin/src/HAL/ESP32/HAL_SPI.cpp index 8ee837ba15..8743ac5be2 100644 --- a/Marlin/src/HAL/ESP32/HAL_SPI.cpp +++ b/Marlin/src/HAL/ESP32/HAL_SPI.cpp @@ -85,7 +85,7 @@ uint8_t spiRec() { return returnByte; } -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.beginTransaction(spiConfig); SPI.transferBytes(0, buf, nbyte); SPI.endTransaction(); @@ -97,7 +97,7 @@ void spiSend(uint8_t b) { SPI.endTransaction(); } -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.beginTransaction(spiConfig); SPI.transfer(token); SPI.writeBytes(const_cast(buf), 512); diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp index 8825742d38..96769f261f 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp @@ -137,7 +137,7 @@ size_t WebSocketSerial::write(const uint8_t c) { return ret; } -size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) { +size_t WebSocketSerial::write(const uint8_t *buffer, size_t size) { size_t written = 0; for (size_t i = 0; i < size; i++) written += write(buffer[i]); diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.h b/Marlin/src/HAL/ESP32/WebSocketSerial.h index 924d36f15c..574f7b10f0 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.h +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.h @@ -54,7 +54,7 @@ public: ring_buffer_pos_t read(uint8_t *buffer); void flush(); ring_buffer_pos_t write(const uint8_t c); - ring_buffer_pos_t write(const uint8_t* buffer, ring_buffer_pos_t size); + ring_buffer_pos_t write(const uint8_t *buffer, ring_buffer_pos_t size); }; class WebSocketSerial: public Stream { @@ -70,7 +70,7 @@ public: int read(); void flush(); size_t write(const uint8_t c); - size_t write(const uint8_t* buffer, size_t size); + size_t write(const uint8_t *buffer, size_t size); #if ENABLED(SERIAL_STATS_DROPPED_RX) FORCE_INLINE uint32_t dropped() { return 0; } diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index dbc89a33f5..99db15f6e9 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -93,12 +93,12 @@ void spiSend(uint8_t b) { (void)spiTransfer(b); } - void spiSend(const uint8_t* buf, size_t nbyte) { + void spiSend(const uint8_t *buf, size_t nbyte) { for (uint16_t i = 0; i < nbyte; i++) (void)spiTransfer(buf[i]); } - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { (void)spiTransfer(token); for (uint16_t i = 0; i < 512; i++) (void)spiTransfer(buf[i]); @@ -135,13 +135,13 @@ void spiSend(uint8_t b) { doio(b); } - void spiSend(const uint8_t* buf, size_t nbyte) { + void spiSend(const uint8_t *buf, size_t nbyte) { for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]); } void spiSend(uint32_t chan, byte b) {} - void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {} + void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {} // Read single byte from SPI uint8_t spiRec() { return doio(0xFF); } @@ -156,7 +156,7 @@ uint8_t spiTransfer(uint8_t b) { return doio(b); } // Write from buffer to SPI - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { (void)spiTransfer(token); for (uint16_t i = 0; i < 512; i++) (void)spiTransfer(buf[i]); diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp index 592e27f6c0..0b0626de79 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp @@ -66,7 +66,7 @@ void spiBegin(); void spiInit(uint8_t spiRate); void spiSend(uint8_t b); -void spiSend(const uint8_t* buf, size_t n); +void spiSend(const uint8_t *buf, size_t n); static uint8_t rs_last_state = 255; diff --git a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp index c3acd38237..77f4d5ecd5 100644 --- a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp +++ b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp @@ -103,7 +103,7 @@ * @param nbyte Number of bytes to receive. * @return Nothing */ - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (nbyte == 0) return; memset(buf, 0xFF, nbyte); sdSPI.beginTransaction(spiConfig); @@ -132,7 +132,7 @@ * * @details Uses DMA */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { sdSPI.beginTransaction(spiConfig); sdSPI.transfer(token); sdSPI.transfer((uint8_t*)buf, nullptr, 512); diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp index c9f23e6fa3..80347e115d 100644 --- a/Marlin/src/HAL/STM32/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp @@ -193,7 +193,7 @@ static SPISettings spiConfig; * * @details Uses DMA */ - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (nbyte == 0) return; memset(buf, 0xFF, nbyte); SPI.transfer(buf, nbyte); @@ -218,7 +218,7 @@ static SPISettings spiConfig; * * @details Use DMA */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { uint8_t rxBuf[512]; SPI.transfer(token); SPI.transfer((uint8_t*)buf, &rxBuf, 512); diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h index 7b0529cfd2..d9e8457017 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -36,7 +36,7 @@ struct MarlinSerial : public HardwareSerial { void begin(unsigned long baud, uint8_t config); inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } - void _rx_complete_irq(serial_t* obj); + void _rx_complete_irq(serial_t *obj); protected: usart_rx_callback_t _rx_callback; diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp index 7e876f765f..abb348d743 100644 --- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp @@ -123,7 +123,7 @@ uint8_t spiRec() { * * @details Uses DMA */ -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); } @@ -146,7 +146,7 @@ void spiSend(uint8_t b) { * * @details Use DMA */ -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.send(token); SPI.dmaSend(const_cast(buf), 512); } @@ -160,7 +160,7 @@ uint8_t spiRec(uint32_t chan) { return SPI.transfer(0xFF); } void spiSend(uint32_t chan, byte b) { SPI.send(b); } // Write buffer to specified SPI channel -void spiSend(uint32_t chan, const uint8_t* buf, size_t n) { +void spiSend(uint32_t chan, const uint8_t *buf, size_t n) { for (size_t p = 0; p < n; p++) spiSend(chan, buf[p]); } diff --git a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp index dfcaaaf29f..e7d9dd29e2 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp @@ -48,8 +48,8 @@ static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; static bool eeprom_dirty = false; bool PersistentStore::access_start() { - const uint32_t* source = reinterpret_cast(EEPROM_PAGE0_BASE); - uint32_t* destination = reinterpret_cast(ram_eeprom); + const uint32_t *source = reinterpret_cast(EEPROM_PAGE0_BASE); + uint32_t *destination = reinterpret_cast(ram_eeprom); static_assert(0 == (MARLIN_EEPROM_SIZE) % 4, "MARLIN_EEPROM_SIZE is corrupted. (Must be a multiple of 4.)"); // Ensure copying as uint32_t is safe constexpr size_t eeprom_size_u32 = (MARLIN_EEPROM_SIZE) / 4; diff --git a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp index dce236ef6b..21330eaac1 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp @@ -82,7 +82,7 @@ uint8_t spiRec() { } // SPI read data -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.beginTransaction(spiConfig); SPI.transfer(buf, nbyte); SPI.endTransaction(); @@ -107,7 +107,7 @@ void spiSend(uint8_t b) { } // SPI send block -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.beginTransaction(spiConfig); SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp index 84852cd358..5b22668fce 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp @@ -80,7 +80,7 @@ uint8_t spiRec() { //return SPDR; } -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.beginTransaction(spiConfig); SPI.transfer(buf, nbyte); SPI.endTransaction(); @@ -103,7 +103,7 @@ void spiSend(uint8_t b) { //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } } -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.beginTransaction(spiConfig); SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp index 8c93049027..e4335ff74f 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp @@ -97,7 +97,7 @@ uint8_t spiRec() { //return SPDR; } -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.beginTransaction(spiConfig); SPI.transfer(buf, nbyte); SPI.endTransaction(); @@ -120,7 +120,7 @@ void spiSend(uint8_t b) { //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } } -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.beginTransaction(spiConfig); SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { diff --git a/Marlin/src/HAL/shared/HAL_MinSerial.h b/Marlin/src/HAL/shared/HAL_MinSerial.h index 04643c1ab3..3089b8aa06 100644 --- a/Marlin/src/HAL/shared/HAL_MinSerial.h +++ b/Marlin/src/HAL/shared/HAL_MinSerial.h @@ -42,7 +42,7 @@ struct MinSerial { HAL_min_serial_out(ch); } // Send String through UART - static void TX(const char* s) { while (*s) TX(*s++); } + static void TX(const char *s) { while (*s) TX(*s++); } // Send a digit through UART static void TXDigit(uint32_t d) { if (d < 10) TX((char)(d+'0')); diff --git a/Marlin/src/HAL/shared/HAL_SPI.h b/Marlin/src/HAL/shared/HAL_SPI.h index 59af554806..6611f9ec4e 100644 --- a/Marlin/src/HAL/shared/HAL_SPI.h +++ b/Marlin/src/HAL/shared/HAL_SPI.h @@ -71,10 +71,10 @@ void spiSend(uint8_t b); uint8_t spiRec(); // Read from SPI into buffer -void spiRead(uint8_t* buf, uint16_t nbyte); +void spiRead(uint8_t *buf, uint16_t nbyte); // Write token and then write from 512 byte buffer to SPI (for SD card) -void spiSendBlock(uint8_t token, const uint8_t* buf); +void spiSendBlock(uint8_t token, const uint8_t *buf); // Begin SPI transaction, set clock, bit order, data mode void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode); @@ -87,7 +87,7 @@ void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode); void spiSend(uint32_t chan, byte b); // Write buffer to specified SPI channel -void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +void spiSend(uint32_t chan, const uint8_t *buf, size_t n); // Read single byte from specified SPI channel uint8_t spiRec(uint32_t chan); diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index 8320f47509..e4ae502a88 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -44,7 +44,7 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { } #ifdef UNW_DEBUG - void UnwPrintf(const char* format, ...) { + void UnwPrintf(const char *format, ...) { char dest[256]; va_list argptr; va_start(argptr, format); diff --git a/Marlin/src/HAL/shared/eeprom_api.h b/Marlin/src/HAL/shared/eeprom_api.h index 6445f7a4aa..1f38639930 100644 --- a/Marlin/src/HAL/shared/eeprom_api.h +++ b/Marlin/src/HAL/shared/eeprom_api.h @@ -45,11 +45,11 @@ public: // Read one or more bytes of data and update the CRC // Return 'true' on read error - static bool read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing=true); + static bool read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing=true); // Write one or more bytes of data // Return 'true' on write error - static inline bool write_data(const int pos, const uint8_t* value, const size_t size=sizeof(uint8_t)) { + static inline bool write_data(const int pos, const uint8_t *value, const size_t size=sizeof(uint8_t)) { int data_pos = pos; uint16_t crc = 0; return write_data(data_pos, value, size, &crc); @@ -61,7 +61,7 @@ public: // Read one or more bytes of data // Return 'true' on read error - static inline bool read_data(const int pos, uint8_t* value, const size_t size=1) { + static inline bool read_data(const int pos, uint8_t *value, const size_t size=1) { int data_pos = pos; uint16_t crc = 0; return read_data(data_pos, value, size, &crc); diff --git a/Marlin/src/HAL/shared/eeprom_if_spi.cpp b/Marlin/src/HAL/shared/eeprom_if_spi.cpp index e162f6fedc..6aa6e09096 100644 --- a/Marlin/src/HAL/shared/eeprom_if_spi.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_spi.cpp @@ -55,7 +55,7 @@ static void _eeprom_begin(uint8_t * const pos, const uint8_t cmd) { // Leave the Bus in-use } -uint8_t eeprom_read_byte(uint8_t* pos) { +uint8_t eeprom_read_byte(uint8_t *pos) { _eeprom_begin(pos, CMD_READ); // Set read location and begin transmission const uint8_t v = spiRec(SPI_CHAN_EEPROM1); // After READ a value sits on the Bus diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index d7043ba523..f900993784 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -362,13 +362,13 @@ return *str == '/' ? true : (*str ? containsSlash(str + 1) : false); } // Find the last position of the slash - constexpr const char* findLastSlashPos(const char* str) { + constexpr const char* findLastSlashPos(const char *str) { return *str == '/' ? (str + 1) : findLastSlashPos(str - 1); } // Compile-time evaluation of the last part of a file path // Typically used to shorten the path to file in compiled strings // CompileTimeString::baseName(__FILE__) returns "macros.h" and not /path/to/Marlin/src/core/macros.h - constexpr const char* baseName(const char* str) { + constexpr const char* baseName(const char *str) { return containsSlash(str) ? findLastSlashPos(findStringEnd(str)) : str; } } diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index f8fe3a181d..78721c6f14 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -108,9 +108,9 @@ struct SerialBase { void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } // Glue code here - FORCE_INLINE void write(const char* str) { while (*str) write(*str++); } - FORCE_INLINE void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } - FORCE_INLINE void print(const char* str) { write(str); } + FORCE_INLINE void write(const char *str) { while (*str) write(*str++); } + FORCE_INLINE void write(const uint8_t *buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE void print(const char *str) { write(str); } // No default argument to avoid ambiguity NO_INLINE void print(char c, PrintBase base) { printNumber((signed long)c, (uint8_t)base); } NO_INLINE void print(unsigned char c, PrintBase base) { printNumber((unsigned long)c, (uint8_t)base); } diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index b5d68196ae..9eb151b27f 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -51,10 +51,10 @@ class SDFileTransferProtocol { private: struct Packet { struct [[gnu::packed]] Open { - static bool validate(char* buffer, size_t length) { + static bool validate(char *buffer, size_t length) { return (length > sizeof(Open) && buffer[length - 1] == '\0'); } - static Open& decode(char* buffer) { + static Open& decode(char *buffer) { data = &buffer[2]; return *reinterpret_cast(buffer); } @@ -67,7 +67,7 @@ private: }; }; - static bool file_open(char* filename) { + static bool file_open(char *filename) { if (!dummy_transfer) { card.mount(); card.openFileWrite(filename); @@ -79,7 +79,7 @@ private: return true; } - static bool file_write(char* buffer, const size_t length) { + static bool file_write(char *buffer, const size_t length) { #if ENABLED(BINARY_STREAM_COMPRESSION) if (compression) { size_t total_processed = 0, processed_count = 0; @@ -150,7 +150,7 @@ public: } } - static void process(uint8_t packet_type, char* buffer, const uint16_t length) { + static void process(uint8_t packet_type, char *buffer, const uint16_t length) { transfer_timeout = millis() + TIMEOUT; switch (static_cast(packet_type)) { case FileTransfer::QUERY: diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 0742f82350..6803a0de7d 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -205,7 +205,7 @@ void MeatPack::handle_rx_char(const uint8_t c, const serial_index_t serial_ind) handle_rx_char_inner(c); // Other characters are passed on for MeatPack decoding } -uint8_t MeatPack::get_result_char(char* const __restrict out) { +uint8_t MeatPack::get_result_char(char * const __restrict out) { uint8_t res = 0; if (char_out_count) { res = char_out_count; diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h index 80f4570e03..2c4c4686d8 100644 --- a/Marlin/src/feature/meatpack.h +++ b/Marlin/src/feature/meatpack.h @@ -109,7 +109,7 @@ public: * @param out [in] Output pointer for unpacked/processed data. * @return Number of characters returned. Range from 0 to 2. */ - uint8_t get_result_char(char* const __restrict out); + uint8_t get_result_char(char * const __restrict out); void reset_state(); void report_state(); diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index d4238400c7..c1c34f8eee 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -362,7 +362,7 @@ bool MMU2::rx_start() { /** * Check if the data received ends with the given string. */ -bool MMU2::rx_str_P(const char* str) { +bool MMU2::rx_str_P(const char *str) { uint8_t i = strlen(rx_buffer); while (MMU2_SERIAL.available()) { @@ -394,7 +394,7 @@ bool MMU2::rx_str_P(const char* str) { /** * Transfer data to MMU, no argument */ -void MMU2::tx_str_P(const char* str) { +void MMU2::tx_str_P(const char *str) { clear_rx_buffer(); uint8_t len = strlen_P(str); LOOP_L_N(i, len) MMU2_SERIAL.write(pgm_read_byte(str++)); @@ -404,7 +404,7 @@ void MMU2::tx_str_P(const char* str) { /** * Transfer data to MMU, single argument */ -void MMU2::tx_printf_P(const char* format, int argument = -1) { +void MMU2::tx_printf_P(const char *format, int argument = -1) { clear_rx_buffer(); uint8_t len = sprintf_P(tx_buffer, format, argument); LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); @@ -414,7 +414,7 @@ void MMU2::tx_printf_P(const char* format, int argument = -1) { /** * Transfer data to MMU, two arguments */ -void MMU2::tx_printf_P(const char* format, int argument1, int argument2) { +void MMU2::tx_printf_P(const char *format, int argument1, int argument2) { clear_rx_buffer(); uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2); LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); @@ -511,7 +511,7 @@ static void mmu2_not_responding() { * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. */ - void MMU2::tool_change(const char* special) { + void MMU2::tool_change(const char *special) { if (!enabled) return; set_runout_valid(false); @@ -598,7 +598,7 @@ static void mmu2_not_responding() { * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. */ - void MMU2::tool_change(const char* special) { + void MMU2::tool_change(const char *special) { if (!enabled) return; set_runout_valid(false); @@ -692,7 +692,7 @@ static void mmu2_not_responding() { * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. */ - void MMU2::tool_change(const char* special) { + void MMU2::tool_change(const char *special) { if (!enabled) return; set_runout_valid(false); diff --git a/Marlin/src/feature/mmu/mmu2.h b/Marlin/src/feature/mmu/mmu2.h index 4326989a74..079a6ef79a 100644 --- a/Marlin/src/feature/mmu/mmu2.h +++ b/Marlin/src/feature/mmu/mmu2.h @@ -45,7 +45,7 @@ public: static void reset(); static void mmu_loop(); static void tool_change(const uint8_t index); - static void tool_change(const char* special); + static void tool_change(const char *special); static uint8_t get_current_tool(); static void set_filament_type(const uint8_t index, const uint8_t type); @@ -56,10 +56,10 @@ public: static bool eject_filament(const uint8_t index, const bool recover); private: - static bool rx_str_P(const char* str); - static void tx_str_P(const char* str); - static void tx_printf_P(const char* format, const int argument); - static void tx_printf_P(const char* format, const int argument1, const int argument2); + static bool rx_str_P(const char *str); + static void tx_str_P(const char *str); + static void tx_printf_P(const char *format, const int argument); + static void tx_printf_P(const char *format, const int argument1, const int argument2); static void clear_rx_buffer(); static bool rx_ok(); diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 34ae67899b..0c35ef6659 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -106,7 +106,7 @@ class TFilamentMonitor : public FilamentMonitorBase { // Handle a block completion. RunoutResponseDelayed uses this to // add up the length of filament moved while the filament is out. - static inline void block_completed(const block_t* const b) { + static inline void block_completed(const block_t * const b) { if (enabled) { response.block_completed(b); sensor.block_completed(b); @@ -273,7 +273,7 @@ class FilamentSensorBase { } public: - static inline void block_completed(const block_t* const b) { + static inline void block_completed(const block_t * const b) { // If the sensor wheel has moved since the last call to // this method reset the runout counter for the extruder. if (TEST(motion_detected, b->extruder)) @@ -307,7 +307,7 @@ class FilamentSensorBase { } public: - static inline void block_completed(const block_t* const) {} + static inline void block_completed(const block_t * const) {} static inline void run() { LOOP_L_N(s, NUM_RUNOUT_SENSORS) { @@ -368,7 +368,7 @@ class FilamentSensorBase { runout_mm_countdown[extruder] = runout_distance_mm; } - static inline void block_completed(const block_t* const b) { + static inline void block_completed(const block_t * const b) { if (b->steps.x || b->steps.y || b->steps.z || did_pause_print) { // Allow pause purge move to re-trigger runout state // Only trigger on extrusion with XYZ movement to allow filament change and retract/recover. const uint8_t e = b->extruder; @@ -403,7 +403,7 @@ class FilamentSensorBase { return runout_flags; } - static inline void block_completed(const block_t* const) { } + static inline void block_completed(const block_t * const) { } static inline void filament_present(const uint8_t extruder) { runout_count[extruder] = runout_threshold; diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 7845b01ad6..a79909917e 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -99,7 +99,7 @@ void GCodeQueue::RingBuffer::commit_command(bool skip_ok * Return true if the command was successfully added. * Return false for a full buffer, or if the 'command' is a comment. */ -bool GCodeQueue::RingBuffer::enqueue(const char* cmd, bool skip_ok/*=true*/ +bool GCodeQueue::RingBuffer::enqueue(const char *cmd, bool skip_ok/*=true*/ #if HAS_MULTI_SERIAL , serial_index_t serial_ind/*=-1*/ #endif @@ -118,7 +118,7 @@ bool GCodeQueue::RingBuffer::enqueue(const char* cmd, bool skip_ok/*=true*/ * Enqueue with Serial Echo * Return true if the command was consumed */ -bool GCodeQueue::enqueue_one(const char* cmd) { +bool GCodeQueue::enqueue_one(const char *cmd) { //SERIAL_ECHOLNPAIR("enqueue_one(\"", cmd, "\")"); if (*cmd == 0 || ISEOL(*cmd)) return true; @@ -187,7 +187,7 @@ bool GCodeQueue::process_injected_command() { * Enqueue and return only when commands are actually enqueued. * Never call this from a G-code handler! */ -void GCodeQueue::enqueue_one_now(const char* cmd) { while (!enqueue_one(cmd)) idle(); } +void GCodeQueue::enqueue_one_now(const char *cmd) { while (!enqueue_one(cmd)) idle(); } /** * Attempt to enqueue a single G-code command diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 4d3ccb364e..5df4a0104c 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -85,7 +85,7 @@ public: #endif ); - bool enqueue(const char* cmd, bool skip_ok = true + bool enqueue(const char *cmd, bool skip_ok = true #if HAS_MULTI_SERIAL , serial_index_t serial_ind = serial_index_t() #endif @@ -143,7 +143,7 @@ public: /** * Enqueue and return only when commands are actually enqueued */ - static void enqueue_one_now(const char* cmd); + static void enqueue_one_now(const char *cmd); /** * Attempt to enqueue a single G-code command @@ -219,7 +219,7 @@ private: * Enqueue with Serial Echo * Return true on success */ - static bool enqueue_one(const char* cmd); + static bool enqueue_one(const char *cmd); static void gcode_line_error(PGM_P const err, const serial_index_t serial_ind); diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 683c1c0884..e18ed7273c 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1076,7 +1076,7 @@ void MarlinUI::draw_status_screen() { } // Draw a menu item with a (potentially) editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm) { + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const inStr, const bool pgm) { const uint8_t vlen = inStr ? (pgm ? utf8_strlen_P(inStr) : utf8_strlen(inStr)) : 0; lcd_put_wchar(0, row, sel ? LCD_STR_ARROW_RIGHT[0] : ' '); uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vlen); @@ -1088,7 +1088,7 @@ void MarlinUI::draw_status_screen() { } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { ui.encoder_direction_normal(); uint8_t n = lcd_put_u8str_ind_P(0, 1, pstr, itemIndex, itemString, LCD_WIDTH - 1); if (value) { diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index e645a76611..6976bfed22 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -835,7 +835,7 @@ void MarlinUI::draw_status_screen() { } // Draw a menu item with a (potentially) editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const data, const bool pgm) { if (!PanelDetected) return; const uint8_t vlen = data ? (pgm ? utf8_strlen_P(data) : utf8_strlen(data)) : 0; lcd.setCursor(0, row); @@ -851,7 +851,7 @@ void MarlinUI::draw_status_screen() { // Low-level draw_edit_screen can be used to draw an edit screen from anyplace // This line moves to the last line of the screen for UBL plot screen on the panel side - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { if (!PanelDetected) return; ui.encoder_direction_normal(); const uint8_t y = TERN0(AUTO_BED_LEVELING_UBL, ui.external_control) ? LCD_HEIGHT - 1 : MIDDLE_Y; diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index a3b14d8609..c2d2cf43af 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -385,7 +385,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } // Draw a menu item with an editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm) { + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const inStr, const bool pgm) { if (mark_as_selected(row, sel)) { const uint8_t vallen = (pgm ? utf8_strlen_P(inStr) : utf8_strlen((char*)inStr)), pixelwidth = (pgm ? uxg_GetUtf8StrPixelWidthP(u8g.getU8g(), inStr) : uxg_GetUtf8StrPixelWidth(u8g.getU8g(), (char*)inStr)); @@ -400,7 +400,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } } - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { ui.encoder_direction_normal(); const u8g_uint_t labellen = utf8_strlen_P(pstr), vallen = utf8_strlen(value); diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 7f88df7bc4..3842611fdf 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -311,7 +311,7 @@ static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, // Used to fill RGB565 (16bits) background inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { - uint16_t* wptr = (uint16_t*)ptr; + uint16_t *wptr = (uint16_t*)ptr; for (size_t i = 0; i < cnt; i += 2) { *wptr = fill; wptr++; } } @@ -346,7 +346,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u #if HAS_LCD_IO static uint16_t bufferA[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)], bufferB[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)]; - uint16_t* buffer = &bufferA[0]; + uint16_t *buffer = &bufferA[0]; #else uint16_t buffer[WIDTH * GRAPHICAL_TFT_UPSCALE]; // 16-bit RGB 565 pixel line buffer #endif @@ -404,7 +404,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u tftio.WriteSequence(buffer, COUNT(bufferA)); #else - uint8_t* bufptr = (uint8_t*) buffer; + uint8_t *bufptr = (uint8_t*) buffer; for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) { LOOP_S_L_N(n, 0, GRAPHICAL_TFT_UPSCALE * 2) { u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH * n]); diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index 8542424d7e..1e19bf85e5 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -148,8 +148,8 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo case U8G_DEV_MSG_STOP: break; case U8G_DEV_MSG_PAGE_NEXT: { - uint8_t* ptr; - u8g_pb_t* pb = (u8g_pb_t*)(dev->dev_mem); + uint8_t *ptr; + u8g_pb_t *pb = (u8g_pb_t*)(dev->dev_mem); y = pb->p.page_y0; ptr = (uint8_t*)pb->buf; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index a585ef670a..b4e876ce4c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -62,7 +62,7 @@ void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; filament_data_t filament_data; #endif -void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { +void DGUSScreenHandler::sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { DGUS_VP_Variable ramcopy; if (populate_VPVar(VP_MSGSTR1, &ramcopy)) { ramcopy.memadr = (void*) line1; @@ -82,7 +82,7 @@ void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, con } } -void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1, bool l2, bool l3, bool l4) { +void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1, bool l2, bool l3, bool l4) { if (current_screen == DGUSLCD_SCREEN_CONFIRM) // Already showing a pop up, so we need to cancel that first. PopToOldScreen(); diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h index 28ab952e53..24965597a5 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h @@ -37,12 +37,12 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); // "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); + static void setstatusmessage(const char *msg); // The same for messages from Flash static void setstatusmessagePGM(PGM_P const msg); // Callback for VP "Display wants to change screen on idle printer" diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h index 28ab952e53..24965597a5 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h @@ -37,12 +37,12 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); // "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); + static void setstatusmessage(const char *msg); // The same for messages from Flash static void setstatusmessagePGM(PGM_P const msg); // Callback for VP "Display wants to change screen on idle printer" diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 0efb70b686..d956ec4c52 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -61,14 +61,14 @@ uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } #if 0 -void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4) { +void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4) { dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR3, line3, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR4, line4, 32, true); } -void DGUSScreenHandler::sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) { +void DGUSScreenHandler::sendinfoscreen_en_mks(const char *line1, const char *line2, const char *line3, const char *line4) { dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR3, line3, 32, true); diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index bfec3c4572..dc656326ac 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -37,18 +37,18 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); #if 0 - static void sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4); - static void sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) ; + static void sendinfoscreen_ch_mks(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); + static void sendinfoscreen_en_mks(const char *line1, const char *line2, const char *line3, const char *line4) ; static void sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4,uint16_t language); #endif // "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); + static void setstatusmessage(const char *msg); // The same for messages from Flash static void setstatusmessagePGM(PGM_P const msg); // Callback for VP "Display wants to change screen on idle printer" diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h index 28ab952e53..24965597a5 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h @@ -37,12 +37,12 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); // "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); + static void setstatusmessage(const char *msg); // The same for messages from Flash static void setstatusmessagePGM(PGM_P const msg); // Callback for VP "Display wants to change screen on idle printer" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp index 9868492d81..ab60579700 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp @@ -26,7 +26,7 @@ #include "media_file_reader.h" #if ENABLED(SDSUPPORT) - bool MediaFileReader::open(const char* filename) { + bool MediaFileReader::open(const char *filename) { card.init(SD_SPI_SPEED, SDSS); volume.init(&card); root.openRoot(&volume); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h index be393a952c..d9edea8388 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h @@ -38,7 +38,7 @@ class MediaFileReader { #endif public: - bool open(const char* filename); + bool open(const char *filename); int16_t read(void *buff, size_t bytes); uint32_t size(); void rewind(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp index 006cbe872c..30f778e9f5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp @@ -103,12 +103,12 @@ namespace FTDI { #endif void SPI::spi_read_bulk(void *data, uint16_t len) { - uint8_t* p = (uint8_t *)data; + uint8_t *p = (uint8_t *)data; while (len--) *p++ = spi_recv(); } bool SPI::spi_verify_bulk(const void *data, uint16_t len) { - const uint8_t* p = (const uint8_t *)data; + const uint8_t *p = (const uint8_t *)data; while (len--) if (*p++ != spi_recv()) return false; return true; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h index e3a23d768f..7adf7e9c53 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h @@ -116,14 +116,14 @@ namespace FTDI { template void spi_write_bulk(const void *data, uint16_t len, uint8_t padding) { - const uint8_t* p = (const uint8_t *)data; + const uint8_t *p = (const uint8_t *)data; while (len--) spi_send(byte_op(p++)); while (padding--) spi_send(0); } template void spi_write_bulk(const void *data, uint16_t len) { - const uint8_t* p = (const uint8_t *)data; + const uint8_t *p = (const uint8_t *)data; while (len--) spi_send(byte_op(p++)); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h index 20df15a91e..2ddab1b818 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h @@ -24,7 +24,7 @@ class SoundList { private: static PROGMEM const struct list_t { - const char *const PROGMEM name; + const char * const PROGMEM name; const FTDI::SoundPlayer::sound_t* data; } list[]; public: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp index f48448eb84..47bf79e467 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp @@ -62,7 +62,7 @@ namespace FTDI { timer.start(); } - void SoundPlayer::play(const sound_t* seq, play_mode_t mode) { + void SoundPlayer::play(const sound_t *seq, play_mode_t mode) { sequence = seq; wait = 250; // Adding this delay causes the note to not be clipped, not sure why. timer.start(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h index fcfe70bd76..3ba39b8c57 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h @@ -55,7 +55,7 @@ namespace FTDI { static void play(effect_t effect, note_t note = NOTE_C4); static bool is_sound_playing(); - void play(const sound_t* seq, play_mode_t mode = PLAY_SYNCHRONOUS); + void play(const sound_t *seq, play_mode_t mode = PLAY_SYNCHRONOUS); void play_tone(const uint16_t frequency_hz, const uint16_t duration_ms); bool has_more_notes() {return sequence != 0;}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp index 5fc89f1fa9..6a58dd2e49 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -47,7 +47,7 @@ namespace FTDI { break; } #else - for (char* c = str; *c; c++) { + for (char *c = str; *c; c++) { lineWidth += fm.get_char_width(*c); if (lineWidth + ellipsisWidth < w) breakPoint = c; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index 902ede025c..d8abfcd29a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -71,7 +71,7 @@ namespace ExtUI { AlertDialogBox::showError(F("Unable to read media.")); } - void onStatusChanged(const char* lcd_msg) { + void onStatusChanged(const char *lcd_msg) { StatusScreen::setStatusMessage(lcd_msg); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index 7f81d49a27..a812f0f3d0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -34,7 +34,7 @@ using namespace Theme; #define GRID_COLS 2 #define GRID_ROWS 9 -void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char* message) { +void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char *message) { if (what & BACKGROUND) { CommandProcessor cmd; cmd.cmd(COLOR_RGB(bg_text_enabled)) @@ -113,7 +113,7 @@ void BioPrintingDialogBox::setStatusMessage(progmem_str message) { setStatusMessage(buff); } -void BioPrintingDialogBox::setStatusMessage(const char* message) { +void BioPrintingDialogBox::setStatusMessage(const char *message) { CommandProcessor cmd; cmd.cmd(CMD_DLSTART) .cmd(CLEAR_COLOR_RGB(bg_color)) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index e3892217a5..d514015058 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -56,7 +56,7 @@ void ConfirmUserRequestAlertBox::onIdle() { } } -void ConfirmUserRequestAlertBox::show(const char* msg) { +void ConfirmUserRequestAlertBox::show(const char *msg) { drawMessage(msg); storeBackground(); screen_data.AlertDialogBox.isError = false; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index c8febfd7d8..f9057ae88e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -76,7 +76,7 @@ uint16_t FilesScreen::getFileForTag(uint8_t tag) { #define GRID_ROWS (files_per_page + header_h + footer_h) #endif -void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted) { +void FilesScreen::drawFileButton(const char *filename, uint8_t tag, bool is_dir, bool is_highlighted) { const uint8_t line = getLineForTag(tag)+1; CommandProcessor cmd; cmd.tag(tag); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h index a4fb37cc14..06ae88a45a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h @@ -60,7 +60,7 @@ class FilesScreen : public BaseScreen, public CachedScreen -void j_move_axis(const char* command, const T axis) { +void j_move_axis(const char *command, const T axis) { const float dist = atof(command + 1) / 10.0; ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(axis) + dist, axis); }; -void process_lcd_j_command(const char* command) { +void process_lcd_j_command(const char *command) { switch (command[0]) { case 'E': break; case 'A': j_move_axis(command, ExtUI::extruder_t::E0); break; @@ -241,7 +241,7 @@ void process_lcd_j_command(const char* command) { * T:-2537.4 E:0 * Note only the curly brace stuff matters. */ -void process_lcd_p_command(const char* command) { +void process_lcd_p_command(const char *command) { switch (command[0]) { case 'P': @@ -301,7 +301,7 @@ void process_lcd_p_command(const char* command) { * {FILE:fcupdate.flg} * {SYS:OK} */ -void process_lcd_s_command(const char* command) { +void process_lcd_s_command(const char *command) { switch (command[0]) { case 'I': { // temperature information @@ -348,7 +348,7 @@ void process_lcd_s_command(const char* command) { * Currently {E:0} is not handled. Its function is unknown, * but it occurs during the temp window after a sys build. */ -void process_lcd_command(const char* command) { +void process_lcd_command(const char *command) { const char *current = command; byte command_code = *current++; diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 90ffa14ad1..fe856535b0 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -161,7 +161,7 @@ inline lcd_uint_t lcd_put_u8str_ind_P(const lcd_uint_t col, const lcd_uint_t row return lcd_put_u8str_ind_P(pstr, ind, inStr, maxlen); } -inline int lcd_put_u8str(const char* str) { return lcd_put_u8str_max(str, PIXEL_LEN_NOLIMIT); } +inline int lcd_put_u8str(const char *str) { return lcd_put_u8str_max(str, PIXEL_LEN_NOLIMIT); } inline int lcd_put_u8str(const lcd_uint_t col, const lcd_uint_t row, PGM_P const str) { lcd_moveto(col, row); return lcd_put_u8str(str); diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index f85771f562..57e6fc26e6 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -292,7 +292,7 @@ public: static bool has_status(); static void reset_status(const bool no_welcome=false); - static void set_status(const char* const message, const bool persist=false); + static void set_status(const char * const message, const bool persist=false); static void set_status_P(PGM_P const message, const int8_t level=0); static void status_printf_P(const uint8_t level, PGM_P const fmt, ...); static void set_alert_status_P(PGM_P const message); @@ -300,7 +300,7 @@ public: #else static constexpr bool has_status() { return false; } static inline void reset_status(const bool=false) {} - static void set_status(const char* message, const bool=false); + static void set_status(const char *message, const bool=false); static void set_status_P(PGM_P message, const int8_t=0); static void status_printf_P(const uint8_t, PGM_P message, ...); static inline void set_alert_status_P(PGM_P const) {} diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index de11ee3a5a..cbef9b50c9 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -172,14 +172,14 @@ class MenuEditItemBase : public MenuItemBase { public: // Implemented for HD44780 and DOGM // Draw the current item at specified row with edit data - static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm=false); + static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const inStr, const bool pgm=false); // Implemented for HD44780 and DOGM // This low-level method is good to draw from anywhere - static void draw_edit_screen(PGM_P const pstr, const char* const value); + static void draw_edit_screen(PGM_P const pstr, const char * const value); // This method is for the current menu item - static inline void draw_edit_screen(const char* const value) { draw_edit_screen(editLabel, value); } + static inline void draw_edit_screen(const char * const value) { draw_edit_screen(editLabel, value); } }; #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 37a44f51b4..793ee60847 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -326,7 +326,7 @@ void MarlinUI::draw_status_screen() { } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace -void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { ui.encoder_direction_normal(); TERN_(TOUCH_SCREEN, touch.clear()); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 81e4603ea4..a8979d0ca6 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -326,7 +326,7 @@ void MarlinUI::draw_status_screen() { } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace -void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { ui.encoder_direction_normal(); TERN_(TOUCH_SCREEN, touch.clear()); @@ -779,7 +779,7 @@ static void disable_steppers() { queue.inject_P(PSTR("M84")); } -static void drawBtn(int x, int y, const char* label, intptr_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { +static void drawBtn(int x, int y, const char *label, intptr_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { uint16_t width = Images[imgBtn52Rounded].width; uint16_t height = Images[imgBtn52Rounded].height; diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp index 842fc3909c..7c053e7be7 100644 --- a/Marlin/src/lcd/tft/ui_common.cpp +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -131,7 +131,7 @@ void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, co } // Draw a menu item with a (potentially) editable value -void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { +void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const data, const bool pgm) { menu_item(row, sel); tft_string.set(pstr, itemIndex, itemString); diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index 0eb40a1441..fd7804cb27 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -106,7 +106,7 @@ uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { * * @details Uses DMA */ -void W25QXXFlash::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { +void W25QXXFlash::spi_flash_Read(uint8_t *buf, uint16_t nbyte) { mySPI.dmaTransfer(0, const_cast(buf), nbyte); } @@ -127,7 +127,7 @@ void W25QXXFlash::spi_flash_Send(uint8_t b) { mySPI.transfer(b); } * * @details Use DMA */ -void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { +void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t *buf) { mySPI.transfer(token); mySPI.dmaSend(const_cast(buf), 512); } @@ -257,7 +257,7 @@ void W25QXXFlash::SPI_FLASH_BulkErase(void) { * Output : None * Return : None *******************************************************************************/ -void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { +void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { // Enable the write access to the FLASH SPI_FLASH_WriteEnable(); @@ -300,7 +300,7 @@ void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint * Output : None * Return : None *******************************************************************************/ -void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { +void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % SPI_FLASH_PageSize; @@ -364,7 +364,7 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui * Output : None * Return : None *******************************************************************************/ -void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { +void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { // Select the FLASH: Chip Select low W25QXX_CS_L; diff --git a/Marlin/src/libs/W25Qxx.h b/Marlin/src/libs/W25Qxx.h index eddae6b1f2..1133af2e74 100644 --- a/Marlin/src/libs/W25Qxx.h +++ b/Marlin/src/libs/W25Qxx.h @@ -57,18 +57,18 @@ public: void init(uint8_t spiRate); static uint8_t spi_flash_Rec(); static uint8_t spi_flash_read_write_byte(uint8_t data); - static void spi_flash_Read(uint8_t* buf, uint16_t nbyte); + static void spi_flash_Read(uint8_t *buf, uint16_t nbyte); static void spi_flash_Send(uint8_t b); - static void spi_flash_SendBlock(uint8_t token, const uint8_t* buf); + static void spi_flash_SendBlock(uint8_t token, const uint8_t *buf); static uint16_t W25QXX_ReadID(void); static void SPI_FLASH_WriteEnable(void); static void SPI_FLASH_WaitForWriteEnd(void); static void SPI_FLASH_SectorErase(uint32_t SectorAddr); static void SPI_FLASH_BlockErase(uint32_t BlockAddr); static void SPI_FLASH_BulkErase(void); - static void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); - static void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); - static void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); + static void SPI_FLASH_PageWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); + static void SPI_FLASH_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); + static void SPI_FLASH_BufferRead(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); }; extern W25QXXFlash W25QXX; diff --git a/Marlin/src/libs/softspi.h b/Marlin/src/libs/softspi.h index 5d48f9fd8c..fb02de8653 100644 --- a/Marlin/src/libs/softspi.h +++ b/Marlin/src/libs/softspi.h @@ -715,7 +715,7 @@ class SoftSPI { FORCE_INLINE bool MODE_CPHA(uint8_t mode) { return bool(mode & 1); } FORCE_INLINE bool MODE_CPOL(uint8_t mode) { return bool(mode & 2); } - FORCE_INLINE void receiveBit(uint8_t bit, uint8_t* data) { + FORCE_INLINE void receiveBit(uint8_t bit, uint8_t *data) { if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); nop; nop; @@ -734,7 +734,7 @@ class SoftSPI { if (!MODE_CPHA(Mode)) fastDigitalWrite(SckPin, MODE_CPOL(Mode)); } - FORCE_INLINE void transferBit(uint8_t bit, uint8_t* rxData, uint8_t txData) { + FORCE_INLINE void transferBit(uint8_t bit, uint8_t *rxData, uint8_t txData) { if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); fastDigitalWrite(MosiPin, txData & _BV(bit)); fastDigitalWrite(SckPin, diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index b20d1e273b..832d6e316a 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -381,7 +381,7 @@ void Planner::init() { r9 = (d >> 8) & 0xFF, r10 = (d >> 16) & 0xFF, r2,r3,r4,r5,r6,r7,r11,r12,r13,r14,r15,r16,r17,r18; - const uint8_t* ptab = inv_tab; + const uint8_t *ptab = inv_tab; __asm__ __volatile__( // %8:%7:%6 = interval @@ -775,7 +775,7 @@ block_t* Planner::get_current_block() { * is not and will not use the block while we modify it, so it is safe to * alter its values. */ -void Planner::calculate_trapezoid_for_block(block_t* const block, const float &entry_factor, const float &exit_factor) { +void Planner::calculate_trapezoid_for_block(block_t * const block, const float &entry_factor, const float &exit_factor) { uint32_t initial_rate = CEIL(block->nominal_rate * entry_factor), final_rate = CEIL(block->nominal_rate * exit_factor); // (steps per second) @@ -942,7 +942,7 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e */ // The kernel called by recalculate() when scanning the plan from last to first entry. -void Planner::reverse_pass_kernel(block_t* const current, const block_t * const next) { +void Planner::reverse_pass_kernel(block_t * const current, const block_t * const next) { if (current) { // If entry speed is already at the maximum entry speed, and there was no change of speed // in the next block, there is no need to recheck. Block is cruising and there is no need to @@ -1039,7 +1039,7 @@ void Planner::reverse_pass() { } // The kernel called by recalculate() when scanning the plan from first to last entry. -void Planner::forward_pass_kernel(const block_t* const previous, block_t* const current, const uint8_t block_index) { +void Planner::forward_pass_kernel(const block_t * const previous, block_t * const current, const uint8_t block_index) { if (previous) { // If the previous block is an acceleration block, too short to complete the full speed // change, adjust the entry speed accordingly. Entry speeds have already been reset, @@ -1440,7 +1440,7 @@ void Planner::check_axes_activity() { float high = 0.0; for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { - block_t* block = &block_buffer[b]; + block_t *block = &block_buffer[b]; if (block->steps.x || block->steps.y || block->steps.z) { const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; NOLESS(high, se); diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index da9e202cdf..768bf29e2f 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -993,10 +993,10 @@ class Planner { } #endif - static void calculate_trapezoid_for_block(block_t* const block, const float &entry_factor, const float &exit_factor); + static void calculate_trapezoid_for_block(block_t * const block, const float &entry_factor, const float &exit_factor); - static void reverse_pass_kernel(block_t* const current, const block_t * const next); - static void forward_pass_kernel(const block_t * const previous, block_t* const current, uint8_t block_index); + static void reverse_pass_kernel(block_t * const current, const block_t * const next); + static void forward_pass_kernel(const block_t * const previous, block_t * const current, uint8_t block_index); static void reverse_pass(); static void forward_pass(); diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 49eca7047c..8c377bf7bf 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2362,7 +2362,7 @@ uint32_t Stepper::block_phase_isr() { // Check if the given block is busy or not - Must not be called from ISR contexts // The current_block could change in the middle of the read by an Stepper ISR, so // we must explicitly prevent that! -bool Stepper::is_block_busy(const block_t* const block) { +bool Stepper::is_block_busy(const block_t * const block) { #ifdef __AVR__ // A SW memory barrier, to ensure GCC does not overoptimize loops #define sw_barrier() asm volatile("": : :"memory"); @@ -2372,7 +2372,7 @@ bool Stepper::is_block_busy(const block_t* const block) { // This works because stepper ISRs happen at a slower rate than // successive reads of a variable, so 2 consecutive reads with // the same value means no interrupt updated it. - block_t* vold, *vnew = current_block; + block_t *vold, *vnew = current_block; sw_barrier(); do { vold = vnew; diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 639a1b2650..ca1781fb9c 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -423,7 +423,7 @@ class Stepper { #endif // Check if the given block is busy or not - Must not be called from ISR contexts - static bool is_block_busy(const block_t* const block); + static bool is_block_busy(const block_t * const block); // Get the position of a stepper, in steps static int32_t position(const AxisEnum axis); @@ -529,7 +529,7 @@ class Stepper { static void _set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); FORCE_INLINE static void _set_position(const abce_long_t &spos) { _set_position(spos.a, spos.b, spos.c, spos.e); } - FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t* loops) { + FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t *loops) { uint32_t timer; // Scale the frequency, as requested by the caller diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index c33581d132..de3d45e4b6 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -830,11 +830,11 @@ void reset_trinamic_drivers() { } constexpr bool sc_hw_done(size_t start, size_t end) { return start == end; } - constexpr bool sc_hw_skip(const char* port_name) { return !(*port_name); } - constexpr bool sc_hw_match(const char* port_name, uint32_t address, size_t start, size_t end) { + constexpr bool sc_hw_skip(const char *port_name) { return !(*port_name); } + constexpr bool sc_hw_match(const char *port_name, uint32_t address, size_t start, size_t end) { return !sc_hw_done(start, end) && !sc_hw_skip(port_name) && (address == sanity_tmc_hw_details[start].address && str_eq_ce(port_name, sanity_tmc_hw_details[start].port)); } - constexpr int count_tmc_hw_serial_matches(const char* port_name, uint32_t address, size_t start, size_t end) { + constexpr int count_tmc_hw_serial_matches(const char *port_name, uint32_t address, size_t start, size_t end) { return sc_hw_done(start, end) ? 0 : ((sc_hw_skip(port_name) ? 0 : (sc_hw_match(port_name, address, start, end) ? 1 : 0)) + count_tmc_hw_serial_matches(port_name, address, start + 1, end)); } diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index 491c0692c7..b914b29635 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -63,7 +63,7 @@ 0x0E,0x07,0x1C,0x15,0x2A,0x23,0x38,0x31,0x46,0x4F,0x54,0x5D,0x62,0x6B,0x70,0x79 }; - static uint8_t CRC7(const uint8_t* data, uint8_t n) { + static uint8_t CRC7(const uint8_t *data, uint8_t n) { uint8_t crc = 0; while (n > 0) { crc = pgm_read_byte(&crctab7[ (crc << 1) ^ *data++ ]); @@ -72,7 +72,7 @@ return (crc << 1) | 1; } #else - static uint8_t CRC7(const uint8_t* data, uint8_t n) { + static uint8_t CRC7(const uint8_t *data, uint8_t n) { uint8_t crc = 0; LOOP_L_N(i, n) { uint8_t d = data[i]; @@ -338,7 +338,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { * \param[out] dst Pointer to the location that will receive the data. * \return true for success, false for failure. */ -bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { +bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t *dst) { #if IS_TEENSY_35_36 || IS_TEENSY_40_41 return 0 == SDHC_CardReadBlock(dst, blockNumber); #endif @@ -378,7 +378,7 @@ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { * * \return true for success, false for failure. */ -bool Sd2Card::readData(uint8_t* dst) { +bool Sd2Card::readData(uint8_t *dst) { chipSelect(); return readData(dst, 512); } @@ -421,7 +421,7 @@ bool Sd2Card::readData(uint8_t* dst) { }; // faster CRC-CCITT // uses the x^16,x^12,x^5,x^1 polynomial. - static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { + static uint16_t CRC_CCITT(const uint8_t *data, size_t n) { uint16_t crc = 0; for (size_t i = 0; i < n; i++) { crc = pgm_read_word(&crctab16[(crc >> 8 ^ data[i]) & 0xFF]) ^ (crc << 8); @@ -431,7 +431,7 @@ bool Sd2Card::readData(uint8_t* dst) { #else // slower CRC-CCITT // uses the x^16,x^12,x^5,x^1 polynomial. - static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { + static uint16_t CRC_CCITT(const uint8_t *data, size_t n) { uint16_t crc = 0; for (size_t i = 0; i < n; i++) { crc = (uint8_t)(crc >> 8) | (crc << 8); @@ -445,7 +445,7 @@ bool Sd2Card::readData(uint8_t* dst) { #endif #endif // SD_CHECK_AND_RETRY -bool Sd2Card::readData(uint8_t* dst, const uint16_t count) { +bool Sd2Card::readData(uint8_t *dst, const uint16_t count) { bool success = false; const millis_t read_timeout = millis() + SD_READ_TIMEOUT; @@ -478,7 +478,7 @@ bool Sd2Card::readData(uint8_t* dst, const uint16_t count) { /** read CID or CSR register */ bool Sd2Card::readRegister(const uint8_t cmd, void* buf) { - uint8_t* dst = reinterpret_cast(buf); + uint8_t *dst = reinterpret_cast(buf); if (cardCommand(cmd, 0)) { error(SD_CARD_ERROR_READ_REG); chipDeselect(); @@ -555,7 +555,7 @@ bool Sd2Card::waitNotBusy(const millis_t timeout_ms) { * \param[in] src Pointer to the location of the data to be written. * \return true for success, false for failure. */ -bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { +bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; #if IS_TEENSY_35_36 || IS_TEENSY_40_41 @@ -586,7 +586,7 @@ bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { * \param[in] src Pointer to the location of the data to be written. * \return true for success, false for failure. */ -bool Sd2Card::writeData(const uint8_t* src) { +bool Sd2Card::writeData(const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; bool success = true; @@ -601,7 +601,7 @@ bool Sd2Card::writeData(const uint8_t* src) { } // Send one block of data for write block or write multiple blocks -bool Sd2Card::writeData(const uint8_t token, const uint8_t* src) { +bool Sd2Card::writeData(const uint8_t token, const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; const uint16_t crc = TERN(SD_CHECK_AND_RETRY, CRC_CCITT(src, 512), 0xFFFF); diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index 6900502e03..d82cb10a1e 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -124,7 +124,7 @@ public: */ bool init(const uint8_t sckRateID, const pin_t chipSelectPin); - bool readBlock(uint32_t block, uint8_t* dst); + bool readBlock(uint32_t block, uint8_t *dst); /** * Read a card's CID register. The CID contains card identification @@ -135,7 +135,7 @@ public: * * \return true for success or false for failure. */ - bool readCID(cid_t* cid) { return readRegister(CMD10, cid); } + bool readCID(cid_t *cid) { return readRegister(CMD10, cid); } /** * Read a card's CSD register. The CSD contains Card-Specific Data that @@ -145,9 +145,9 @@ public: * * \return true for success or false for failure. */ - inline bool readCSD(csd_t* csd) { return readRegister(CMD9, csd); } + inline bool readCSD(csd_t *csd) { return readRegister(CMD9, csd); } - bool readData(uint8_t* dst); + bool readData(uint8_t *dst); bool readStart(uint32_t blockNumber); bool readStop(); bool setSckRate(const uint8_t sckRateID); @@ -157,8 +157,8 @@ public: * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. */ int type() const {return type_;} - bool writeBlock(uint32_t blockNumber, const uint8_t* src); - bool writeData(const uint8_t* src); + bool writeBlock(uint32_t blockNumber, const uint8_t *src); + bool writeData(const uint8_t *src); bool writeStart(uint32_t blockNumber, const uint32_t eraseCount); bool writeStop(); @@ -176,11 +176,11 @@ private: } uint8_t cardCommand(const uint8_t cmd, const uint32_t arg); - bool readData(uint8_t* dst, const uint16_t count); + bool readData(uint8_t *dst, const uint16_t count); bool readRegister(const uint8_t cmd, void* buf); void chipDeselect(); void chipSelect(); inline void type(const uint8_t value) { type_ = value; } bool waitNotBusy(const millis_t timeout_ms); - bool writeData(const uint8_t token, const uint8_t* src); + bool writeData(const uint8_t token, const uint8_t *src); }; diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 3cd88318ff..120668baa8 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -43,7 +43,7 @@ SdBaseFile* SdBaseFile::cwd_ = 0; // Pointer to Current Working Directory // callback function for date/time -void (*SdBaseFile::dateTime_)(uint16_t* date, uint16_t* time) = 0; +void (*SdBaseFile::dateTime_)(uint16_t *date, uint16_t *time) = 0; // add a cluster to a file bool SdBaseFile::addCluster() { @@ -118,7 +118,7 @@ bool SdBaseFile::close() { * Reasons for failure include file is not contiguous, file has zero length * or an I/O error occurred. */ -bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { +bool SdBaseFile::contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock) { // error if no blocks if (firstCluster_ == 0) return false; @@ -155,7 +155,7 @@ bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { * a file is already open, the file already exists, the root * directory is full or an I/O error. */ -bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char* path, uint32_t size) { +bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char *path, uint32_t size) { if (ENABLED(SDCARD_READONLY)) return false; uint32_t count; @@ -186,8 +186,8 @@ bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char* path, uint32_ * * \return true for success, false for failure. */ -bool SdBaseFile::dirEntry(dir_t* dir) { - dir_t* p; +bool SdBaseFile::dirEntry(dir_t *dir) { + dir_t *p; // make sure fields on SD are correct if (!sync()) return false; @@ -207,7 +207,7 @@ bool SdBaseFile::dirEntry(dir_t* dir) { * \param[in] dir The directory structure containing the name. * \param[out] name A 13 byte char array for the formatted name. */ -void SdBaseFile::dirName(const dir_t& dir, char* name) { +void SdBaseFile::dirName(const dir_t& dir, char *name) { uint8_t j = 0; LOOP_L_N(i, 11) { if (dir.name[i] == ' ')continue; @@ -229,7 +229,7 @@ void SdBaseFile::dirName(const dir_t& dir, char* name) { * * \return true if the file exists else false. */ -bool SdBaseFile::exists(const char* name) { +bool SdBaseFile::exists(const char *name) { SdBaseFile file; return file.open(this, name, O_READ); } @@ -254,7 +254,7 @@ bool SdBaseFile::exists(const char* name) { * \return For success fgets() returns the length of the string in \a str. * If no data is read, fgets() returns zero for EOF or -1 if an error occurred. **/ -int16_t SdBaseFile::fgets(char* str, int16_t num, char* delim) { +int16_t SdBaseFile::fgets(char *str, int16_t num, char *delim) { char ch; int16_t n = 0; int16_t r = -1; @@ -293,7 +293,7 @@ bool SdBaseFile::getDosName(char * const name) { return true; } // cache entry - dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + dir_t *p = cacheDirEntry(SdVolume::CACHE_FOR_READ); if (!p) return false; // format name @@ -301,7 +301,7 @@ bool SdBaseFile::getDosName(char * const name) { return true; } -void SdBaseFile::getpos(filepos_t* pos) { +void SdBaseFile::getpos(filepos_t *pos) { pos->position = curPosition_; pos->cluster = curCluster_; } @@ -386,7 +386,7 @@ int8_t SdBaseFile::lsPrintNext(uint8_t flags, uint8_t indent) { } // Format directory name field from a 8.3 name string -bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { +bool SdBaseFile::make83Name(const char *str, uint8_t *name, const char** ptr) { uint8_t n = 7, // Max index until a dot is found i = 11; while (i) name[--i] = ' '; // Set whole FILENAME.EXT to spaces @@ -423,7 +423,7 @@ bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { * Reasons for failure include this file is already open, \a parent is not a * directory, \a path is invalid or already exists in \a parent. */ -bool SdBaseFile::mkdir(SdBaseFile* parent, const char* path, bool pFlag) { +bool SdBaseFile::mkdir(SdBaseFile* parent, const char *path, bool pFlag) { if (ENABLED(SDCARD_READONLY)) return false; uint8_t dname[11]; @@ -460,7 +460,7 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { uint32_t block; dir_t d; - dir_t* p; + dir_t *p; if (!parent->isDir()) return false; @@ -523,7 +523,7 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { * * \return true for success, false for failure. */ -bool SdBaseFile::open(const char* path, uint8_t oflag) { +bool SdBaseFile::open(const char *path, uint8_t oflag) { return open(cwd_, path, oflag); } @@ -577,7 +577,7 @@ bool SdBaseFile::open(const char* path, uint8_t oflag) { * a directory, \a path is invalid, the file does not exist * or can't be opened in the access mode specified by oflag. */ -bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) { +bool SdBaseFile::open(SdBaseFile* dirFile, const char *path, uint8_t oflag) { uint8_t dname[11]; SdBaseFile dir1, dir2; SdBaseFile *parent = dirFile, *sub = &dir1; @@ -608,7 +608,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) { bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { bool emptyFound = false, fileFound = false; uint8_t index; - dir_t* p; + dir_t *p; vol_ = dirFile->vol_; @@ -697,7 +697,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t ofla * \return true for success or false for failure. */ bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { - dir_t* p; + dir_t *p; vol_ = dirFile->vol_; @@ -725,7 +725,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { // open a cached directory entry. Assumes vol_ is initialized bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { - dir_t* p; + dir_t *p; #if ENABLED(SDCARD_READONLY) if (oflag & (O_WRITE | O_CREAT | O_TRUNC)) goto FAIL; @@ -785,7 +785,7 @@ bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { * \return true for success or false for failure. */ bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { - dir_t* p; + dir_t *p; uint8_t index; if (!dirFile) return false; @@ -827,7 +827,7 @@ bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { */ bool SdBaseFile::openParent(SdBaseFile* dir) { dir_t entry; - dir_t* p; + dir_t *p; SdBaseFile file; uint32_t c; uint32_t cluster; @@ -1009,7 +1009,7 @@ int16_t SdBaseFile::read() { * or an I/O error occurred. */ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { - uint8_t* dst = reinterpret_cast(buf); + uint8_t *dst = reinterpret_cast(buf); uint16_t offset, toRead; uint32_t block; // raw device block number @@ -1049,7 +1049,7 @@ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { else { // read block to cache and copy data to caller if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) return -1; - uint8_t* src = vol_->cache()->data + offset; + uint8_t *src = vol_->cache()->data + offset; memcpy(dst, src, n); } dst += n; @@ -1070,7 +1070,7 @@ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { * readDir() called before a directory has been opened, this is not * a directory file or an I/O error occurred. */ -int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { +int8_t SdBaseFile::readDir(dir_t *dir, char *longFilename) { int16_t n; // if not a directory file or miss-positioned return an error if (!isDir() || (0x1F & curPosition_)) return -1; @@ -1096,7 +1096,7 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { // Fill the long filename if we have a long filename entry. // Long filename entries are stored before the short filename. if (longFilename && DIR_IS_LONG_NAME(dir)) { - vfat_t* VFAT = (vfat_t*)dir; + vfat_t *VFAT = (vfat_t*)dir; // Sanity-check the VFAT entry. The first cluster is always set to zero. And the sequence number should be higher than 0 if (VFAT->firstClusterLow == 0) { const uint8_t seq = VFAT->sequenceNumber & 0x1F; @@ -1199,7 +1199,7 @@ dir_t* SdBaseFile::readDirCache() { bool SdBaseFile::remove() { if (ENABLED(SDCARD_READONLY)) return false; - dir_t* d; + dir_t *d; // free any clusters - will fail if read-only or directory if (!truncate(0)) return false; @@ -1235,7 +1235,7 @@ bool SdBaseFile::remove() { * \a dirFile is not a directory, \a path is not found * or an I/O error occurred. */ -bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { +bool SdBaseFile::remove(SdBaseFile* dirFile, const char *path) { if (ENABLED(SDCARD_READONLY)) return false; SdBaseFile file; @@ -1252,13 +1252,13 @@ bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { * Reasons for failure include \a dirFile is not open or is not a directory * file, newPath is invalid or already exists, or an I/O error occurs. */ -bool SdBaseFile::rename(SdBaseFile* dirFile, const char* newPath) { +bool SdBaseFile::rename(SdBaseFile* dirFile, const char *newPath) { if (ENABLED(SDCARD_READONLY)) return false; dir_t entry; uint32_t dirCluster = 0; SdBaseFile file; - dir_t* d; + dir_t *d; // must be an open file or subdirectory if (!(isFile() || isSubDir())) return false; @@ -1356,7 +1356,7 @@ bool SdBaseFile::rmdir() { // make sure directory is empty while (curPosition_ < fileSize_) { - dir_t* p = readDirCache(); + dir_t *p = readDirCache(); if (!p) return false; // done if past last used entry if (p->name[0] == DIR_NAME_FREE) break; @@ -1396,7 +1396,7 @@ bool SdBaseFile::rmRfStar() { // remember position index = curPosition_ / 32; - dir_t* p = readDirCache(); + dir_t *p = readDirCache(); if (!p) return false; // done if past last entry @@ -1438,7 +1438,7 @@ bool SdBaseFile::rmRfStar() { * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). */ -SdBaseFile::SdBaseFile(const char* path, uint8_t oflag) { +SdBaseFile::SdBaseFile(const char *path, uint8_t oflag) { type_ = FAT_FILE_TYPE_CLOSED; writeError = false; open(path, oflag); @@ -1481,7 +1481,7 @@ bool SdBaseFile::seekSet(const uint32_t pos) { return true; } -void SdBaseFile::setpos(filepos_t* pos) { +void SdBaseFile::setpos(filepos_t *pos) { curPosition_ = pos->position; curCluster_ = pos->cluster; } @@ -1499,7 +1499,7 @@ bool SdBaseFile::sync() { if (ENABLED(SDCARD_READONLY) || !isOpen()) goto FAIL; if (flags_ & F_FILE_DIR_DIRTY) { - dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + dir_t *d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); // check for deleted by another open file object if (!d || d->name[0] == DIR_NAME_DELETED) goto FAIL; @@ -1537,7 +1537,7 @@ bool SdBaseFile::sync() { * \return true for success, false for failure. */ bool SdBaseFile::timestamp(SdBaseFile* file) { - dir_t* d; + dir_t *d; dir_t dir; // get timestamps @@ -1599,7 +1599,7 @@ bool SdBaseFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, if (ENABLED(SDCARD_READONLY)) return false; uint16_t dirDate, dirTime; - dir_t* d; + dir_t *d; if (!isOpen() || year < 1980 @@ -1716,7 +1716,7 @@ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { #endif // convert void* to uint8_t* - must be before goto statements - const uint8_t* src = reinterpret_cast(buf); + const uint8_t *src = reinterpret_cast(buf); // number of bytes left to write - must be before goto statements uint16_t nToWrite = nbyte; @@ -1782,7 +1782,7 @@ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { // rewrite part of block if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto FAIL; } - uint8_t* dst = vol_->cache()->data + blockOffset; + uint8_t *dst = vol_->cache()->data + blockOffset; memcpy(dst, src, n); } curPosition_ += n; diff --git a/Marlin/src/sd/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h index 2f7dfb9f3b..1e2bc5d09e 100644 --- a/Marlin/src/sd/SdBaseFile.h +++ b/Marlin/src/sd/SdBaseFile.h @@ -163,7 +163,7 @@ uint16_t const FAT_DEFAULT_TIME = (1 << 11); class SdBaseFile { public: SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} - SdBaseFile(const char* path, uint8_t oflag); + SdBaseFile(const char *path, uint8_t oflag); ~SdBaseFile() { if (isOpen()) close(); } /** @@ -179,18 +179,18 @@ class SdBaseFile { * get position for streams * \param[out] pos struct to receive position */ - void getpos(filepos_t* pos); + void getpos(filepos_t *pos); /** * set position for streams * \param[out] pos struct with value for new position */ - void setpos(filepos_t* pos); + void setpos(filepos_t *pos); bool close(); - bool contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + bool contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock); bool createContiguous(SdBaseFile* dirFile, - const char* path, uint32_t size); + const char *path, uint32_t size); /** * \return The current cluster number for a file or directory. */ @@ -213,7 +213,7 @@ class SdBaseFile { * function is of the form: * * \code - * void dateTime(uint16_t* date, uint16_t* time) { + * void dateTime(uint16_t *date, uint16_t *time) { * uint16_t year; * uint8_t month, day, hour, minute, second; * @@ -235,7 +235,7 @@ class SdBaseFile { * See the timestamp() function. */ static void dateTimeCallback( - void (*dateTime)(uint16_t* date, uint16_t* time)) { + void (*dateTime)(uint16_t *date, uint16_t *time)) { dateTime_ = dateTime; } @@ -243,10 +243,10 @@ class SdBaseFile { * Cancel the date/time callback function. */ static void dateTimeCallbackCancel() { dateTime_ = 0; } - bool dirEntry(dir_t* dir); - static void dirName(const dir_t& dir, char* name); - bool exists(const char* name); - int16_t fgets(char* str, int16_t num, char* delim = 0); + bool dirEntry(dir_t *dir); + static void dirName(const dir_t& dir, char *name); + bool exists(const char *name); + int16_t fgets(char *str, int16_t num, char *delim = 0); /** * \return The total number of bytes in a file or directory. @@ -286,10 +286,10 @@ class SdBaseFile { bool getDosName(char * const name); void ls(uint8_t flags = 0, uint8_t indent = 0); - bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true); + bool mkdir(SdBaseFile* dir, const char *path, bool pFlag = true); bool open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag); - bool open(SdBaseFile* dirFile, const char* path, uint8_t oflag); - bool open(const char* path, uint8_t oflag = O_READ); + bool open(SdBaseFile* dirFile, const char *path, uint8_t oflag); + bool open(const char *path, uint8_t oflag = O_READ); bool openNext(SdBaseFile* dirFile, uint8_t oflag); bool openRoot(SdVolume* vol); int peek(); @@ -298,15 +298,15 @@ class SdBaseFile { bool printName(); int16_t read(); int16_t read(void* buf, uint16_t nbyte); - int8_t readDir(dir_t* dir, char* longFilename); - static bool remove(SdBaseFile* dirFile, const char* path); + int8_t readDir(dir_t *dir, char *longFilename); + static bool remove(SdBaseFile* dirFile, const char *path); bool remove(); /** * Set the file's current position to zero. */ void rewind() { seekSet(0); } - bool rename(SdBaseFile* dirFile, const char* newPath); + bool rename(SdBaseFile* dirFile, const char *newPath); bool rmdir(); bool rmRfStar(); @@ -348,7 +348,7 @@ class SdBaseFile { static SdBaseFile* cwd_; // global pointer to cwd dir // data time callback function - static void (*dateTime_)(uint16_t* date, uint16_t* time); + static void (*dateTime_)(uint16_t *date, uint16_t *time); // bits defined in flags_ static uint8_t const F_OFLAG = (O_ACCMODE | O_APPEND | O_SYNC), // should be 0x0F @@ -376,7 +376,7 @@ class SdBaseFile { bool addDirCluster(); dir_t* cacheDirEntry(uint8_t action); int8_t lsPrintNext(uint8_t flags, uint8_t indent); - static bool make83Name(const char* str, uint8_t* name, const char** ptr); + static bool make83Name(const char *str, uint8_t *name, const char** ptr); bool mkdir(SdBaseFile* parent, const uint8_t dname[11]); bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag); bool openCachedEntry(uint8_t cacheIndex, uint8_t oflags); diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h index ac81f1d64e..03bbc1c194 100644 --- a/Marlin/src/sd/SdFatStructs.h +++ b/Marlin/src/sd/SdFatStructs.h @@ -571,7 +571,7 @@ uint8_t const DIR_NAME_0xE5 = 0x05, // escape for name[0] = 0xE5 * * \return true if the entry is for part of a long name else false. */ -static inline uint8_t DIR_IS_LONG_NAME(const dir_t* dir) { +static inline uint8_t DIR_IS_LONG_NAME(const dir_t *dir) { return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; } @@ -584,7 +584,7 @@ uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); * * \return true if the entry is for a normal file else false. */ -static inline uint8_t DIR_IS_FILE(const dir_t* dir) { +static inline uint8_t DIR_IS_FILE(const dir_t *dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; } @@ -594,7 +594,7 @@ static inline uint8_t DIR_IS_FILE(const dir_t* dir) { * * \return true if the entry is for a subdirectory else false. */ -static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { +static inline uint8_t DIR_IS_SUBDIR(const dir_t *dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; } @@ -604,6 +604,6 @@ static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { * * \return true if the entry is for a normal file or subdirectory else false. */ -static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { +static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t *dir) { return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; } diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp index cba67e2bba..cc86ce819f 100644 --- a/Marlin/src/sd/SdFile.cpp +++ b/Marlin/src/sd/SdFile.cpp @@ -43,7 +43,7 @@ * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). */ -SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) { } +SdFile::SdFile(const char *path, uint8_t oflag) : SdBaseFile(path, oflag) { } /** * Write data to an open file. @@ -78,7 +78,7 @@ int16_t SdFile::write(const void* buf, uint16_t nbyte) { return SdBaseFile::writ * \param[in] str Pointer to the string. * Use writeError to check for errors. */ -void SdFile::write(const char* str) { SdBaseFile::write(str, strlen(str)); } +void SdFile::write(const char *str) { SdBaseFile::write(str, strlen(str)); } /** * Write a PROGMEM string to a file. diff --git a/Marlin/src/sd/SdFile.h b/Marlin/src/sd/SdFile.h index 17256b47c8..69fe05b499 100644 --- a/Marlin/src/sd/SdFile.h +++ b/Marlin/src/sd/SdFile.h @@ -42,7 +42,7 @@ class SdFile : public SdBaseFile { public: SdFile() {} - SdFile(const char* name, uint8_t oflag); + SdFile(const char *name, uint8_t oflag); #if ARDUINO >= 100 size_t write(uint8_t b); #else @@ -50,7 +50,7 @@ class SdFile : public SdBaseFile { #endif int16_t write(const void* buf, uint16_t nbyte); - void write(const char* str); + void write(const char *str); void write_P(PGM_P str); void writeln_P(PGM_P str); }; diff --git a/Marlin/src/sd/SdVolume.cpp b/Marlin/src/sd/SdVolume.cpp index e262c8867a..7fcebd640d 100644 --- a/Marlin/src/sd/SdVolume.cpp +++ b/Marlin/src/sd/SdVolume.cpp @@ -47,7 +47,7 @@ #endif // USE_MULTIPLE_CARDS // find a contiguous group of clusters -bool SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { +bool SdVolume::allocContiguous(uint32_t count, uint32_t *curCluster) { if (ENABLED(SDCARD_READONLY)) return false; // start of group @@ -149,7 +149,7 @@ bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) { } // return the size in bytes of a cluster chain -bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { +bool SdVolume::chainSize(uint32_t cluster, uint32_t *size) { uint32_t s = 0; do { if (!fatGet(cluster, &cluster)) return false; @@ -160,7 +160,7 @@ bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { } // Fetch a FAT entry -bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) { +bool SdVolume::fatGet(uint32_t cluster, uint32_t *value) { uint32_t lba; if (cluster > (clusterCount_ + 1)) return false; if (FAT12_SUPPORT && fatType_ == 12) { @@ -328,7 +328,7 @@ int32_t SdVolume::freeClusterCount() { */ bool SdVolume::init(Sd2Card* dev, uint8_t part) { uint32_t totalBlocks, volumeStartBlock = 0; - fat32_boot_t* fbs; + fat32_boot_t *fbs; sdCard_ = dev; fatType_ = 0; @@ -342,7 +342,7 @@ bool SdVolume::init(Sd2Card* dev, uint8_t part) { if (part) { if (part > 4) return false; if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; - part_t* p = &cacheBuffer_.mbr.part[part - 1]; + part_t *p = &cacheBuffer_.mbr.part[part - 1]; if ((p->boot & 0x7F) != 0 || p->totalSectors < 100 || p->firstSector == 0) return false; // not a valid partition volumeStartBlock = p->firstSector; diff --git a/Marlin/src/sd/SdVolume.h b/Marlin/src/sd/SdVolume.h index 2d57c681c4..8122087451 100644 --- a/Marlin/src/sd/SdVolume.h +++ b/Marlin/src/sd/SdVolume.h @@ -124,7 +124,7 @@ class SdVolume { * \param[out] v value of entry * \return true for success or false for failure */ - bool dbgFat(uint32_t n, uint32_t* v) { return fatGet(n, v); } + bool dbgFat(uint32_t n, uint32_t *v) { return fatGet(n, v); } private: // Allow SdBaseFile access to SdVolume private data. @@ -161,7 +161,7 @@ class SdVolume { uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 - bool allocContiguous(uint32_t count, uint32_t* curCluster); + bool allocContiguous(uint32_t count, uint32_t *curCluster); uint8_t blockOfCluster(uint32_t position) const { return (position >> 9) & (blocksPerCluster_ - 1); } uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_); } uint32_t blockNumber(uint32_t cluster, uint32_t position) const { return clusterStartBlock(cluster) + blockOfCluster(position); } @@ -183,8 +183,8 @@ class SdVolume { cacheBlockNumber_ = blockNumber; } void cacheSetDirty() { cacheDirty_ |= CACHE_FOR_WRITE; } - bool chainSize(uint32_t beginCluster, uint32_t* size); - bool fatGet(uint32_t cluster, uint32_t* value); + bool chainSize(uint32_t beginCluster, uint32_t *size); + bool fatGet(uint32_t cluster, uint32_t *value); bool fatPut(uint32_t cluster, uint32_t value); bool fatPutEOC(uint32_t cluster) { return fatPut(cluster, 0x0FFFFFFF); } bool freeChain(uint32_t cluster); @@ -193,6 +193,6 @@ class SdVolume { if (fatType_ == 16) return cluster >= FAT16EOC_MIN; return cluster >= FAT32EOC_MIN; } - bool readBlock(uint32_t block, uint8_t* dst) { return sdCard_->readBlock(block, dst); } - bool writeBlock(uint32_t block, const uint8_t* dst) { return sdCard_->writeBlock(block, dst); } + bool readBlock(uint32_t block, uint8_t *dst) { return sdCard_->readBlock(block, dst); } + bool writeBlock(uint32_t block, const uint8_t *dst) { return sdCard_->writeBlock(block, dst); } }; diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 4399d9a4b6..1f917f8576 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -122,7 +122,7 @@ public: // Select a file static void selectFileByIndex(const uint16_t nr); - static void selectFileByName(const char* const match); + static void selectFileByName(const char * const match); // Print job static void openAndPrintFile(const char *name); // (working directory) diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index 6dc7063122..dc9efcb672 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -295,7 +295,7 @@ uint32_t Sd2Card::cardSize() { return lun0_capacity; } -bool Sd2Card::readBlock(uint32_t block, uint8_t* dst) { +bool Sd2Card::readBlock(uint32_t block, uint8_t *dst) { if (!isInserted()) return false; #if USB_DEBUG >= 3 if (block >= lun0_capacity) { @@ -309,7 +309,7 @@ bool Sd2Card::readBlock(uint32_t block, uint8_t* dst) { return bulk.Read(0, block, 512, 1, dst) == 0; } -bool Sd2Card::writeBlock(uint32_t block, const uint8_t* src) { +bool Sd2Card::writeBlock(uint32_t block, const uint8_t *src) { if (!isInserted()) return false; #if USB_DEBUG >= 3 if (block >= lun0_capacity) { diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index 5789121367..320678d091 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -60,15 +60,15 @@ class Sd2Card { static void idle(); inline bool readStart(const uint32_t block) { pos = block; return isReady(); } - inline bool readData(uint8_t* dst) { return readBlock(pos++, dst); } + inline bool readData(uint8_t *dst) { return readBlock(pos++, dst); } inline bool readStop() const { return true; } inline bool writeStart(const uint32_t block, const uint32_t) { pos = block; return isReady(); } - inline bool writeData(uint8_t* src) { return writeBlock(pos++, src); } + inline bool writeData(uint8_t *src) { return writeBlock(pos++, src); } inline bool writeStop() const { return true; } - bool readBlock(uint32_t block, uint8_t* dst); - bool writeBlock(uint32_t blockNumber, const uint8_t* src); + bool readBlock(uint32_t block, uint8_t *dst); + bool writeBlock(uint32_t blockNumber, const uint8_t *src); bool readCSD(csd_t*) { return true; } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp index f26e82b9c7..75421f4482 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp @@ -133,7 +133,7 @@ uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_l /* 00 = success */ /* 01-0f = non-zero HRSLT */ uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, - uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) { + uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p) { bool direction = false; // Request direction, IN or OUT uint8_t rcode; SETUP_PKT setup_pkt; @@ -201,7 +201,7 @@ uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bReque * Keep sending INs and writes data to memory area pointed by 'data' * rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error, fe = USB xfer timeout */ -uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { +uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval /*= 0*/) { EpInfo *pep = nullptr; uint16_t nak_limit = 0; @@ -215,7 +215,7 @@ uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* return InTransfer(pep, nak_limit, nbytesptr, data, bInterval); } -uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { +uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval /*= 0*/) { uint8_t rcode = 0; uint8_t pktsize; @@ -286,7 +286,7 @@ uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, ui * Handles NAK bug per Maxim Application Note 4000 for single buffer transfer * rcode 0 if no errors. rcode 01-0f is relayed from HRSL */ -uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { +uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data) { EpInfo *pep = nullptr; uint16_t nak_limit = 0; @@ -743,12 +743,12 @@ uint8_t USB::ReleaseDevice(uint8_t addr) { } // Get device descriptor -uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { +uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, nullptr); } // Get configuration descriptor -uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { +uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, nullptr); } @@ -774,7 +774,7 @@ uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser } // Get string descriptor -uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { +uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t *dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, nullptr); } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h index d94958dd54..5c76ffb758 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h @@ -250,19 +250,19 @@ public: uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr); /* Control requests */ - uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr); - uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr); + uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr); + uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr); uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p); - uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); + uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr); uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr); uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value); /**/ - uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, bool direction); + uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, bool direction); uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit); - uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval = 0); - uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); + uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0); + uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data); uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit); void Task(); @@ -272,7 +272,7 @@ public: uint8_t ReleaseDevice(uint8_t addr); uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, - uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p); + uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p); private: void init(); @@ -285,17 +285,17 @@ private: #if 0 //defined(USB_METHODS_INLINE) //get device descriptor -inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { +inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr) { return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr)); } //get configuration descriptor -inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { +inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr) { return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr)); } //get string descriptor -inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) { +inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t *dataptr) { return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr)); } //set address diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp index 190a0f1a9e..4ee206bc32 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp @@ -51,7 +51,7 @@ void MAX3421e::regWr(uint8_t reg, uint8_t data) { // multiple-byte write // return a pointer to memory position after last written -uint8_t* MAX3421e::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { +uint8_t* MAX3421e::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p) { cs(); spiSend(reg | 0x02); while (nbytes--) spiSend(*data_p++); @@ -79,7 +79,7 @@ uint8_t MAX3421e::regRd(uint8_t reg) { // multiple-byte register read // return a pointer to a memory position after last read -uint8_t* MAX3421e::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { +uint8_t* MAX3421e::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p) { cs(); spiSend(reg); while (nbytes--) *data_p++ = spiRec(); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h index 5c3b852d55..cbdd281858 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h @@ -37,10 +37,10 @@ class MAX3421e { bool start(); void regWr(uint8_t reg, uint8_t data); - uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p); void gpioWr(uint8_t data); uint8_t regRd(uint8_t reg); - uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p); uint8_t gpioRd(); bool reset(); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index 4ab1a6b8f9..3f758e7712 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -594,7 +594,7 @@ void UHS_USB_HOST_BASE::ReleaseDevice(uint8_t addr) { * @param dataptr pointer to the data to return * @return status of the request, zero is success. */ -uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr) { +uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t *dataptr) { return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes), nbytes, dataptr)); } @@ -607,7 +607,7 @@ uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* d * @param dataptr ointer to the data to return * @return status of the request, zero is success. */ -uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { +uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t *dataptr) { return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes), nbytes, dataptr)); } @@ -621,7 +621,7 @@ uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t c * @param dataptr pointer to the data to return * @return status of the request, zero is success. */ -uint8_t UHS_USB_HOST_BASE::getStrDescr(uint8_t addr, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { +uint8_t UHS_USB_HOST_BASE::getStrDescr(uint8_t addr, uint16_t ns, uint8_t index, uint16_t langid, uint8_t *dataptr) { return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns), ns, dataptr)); } @@ -668,7 +668,7 @@ uint8_t UHS_USB_HOST_BASE::setConf(uint8_t addr, uint8_t conf_value) { * @param data pointer to buffer to hold transfer * @return zero for success or error code */ -uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { +uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data) { UHS_EpInfo *pep = NULL; uint16_t nak_limit = 0; HOST_DEBUG("outTransfer: addr: 0x%2.2x ep: 0x%2.2x nbytes: 0x%4.4x data: 0x%p\r\n", addr, ep, nbytes, data); @@ -689,7 +689,7 @@ uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes * @param data pointer to buffer to hold transfer * @return zero for success or error code */ -uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data) { +uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data) { UHS_EpInfo *pep = NULL; uint16_t nak_limit = 0; @@ -980,7 +980,7 @@ uint8_t UHS_USB_HOST_BASE::eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, return rcode; } -uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr) { +uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t *dataptr) { //bool direction = bmReqType & 0x80; //request direction, IN or OUT uint8_t rcode = 0; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h index b289a896ef..b81dbf2a28 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h @@ -103,7 +103,7 @@ public: return (current_state == usb_task_state); }; - virtual UHS_EpInfo * UHS_NI ctrlReqOpen(NOTUSED(uint8_t addr), NOTUSED(uint64_t Request), NOTUSED(uint8_t* dataptr)) { + virtual UHS_EpInfo * UHS_NI ctrlReqOpen(NOTUSED(uint8_t addr), NOTUSED(uint64_t Request), NOTUSED(uint8_t *dataptr)) { return NULL; }; @@ -213,17 +213,17 @@ public: uint8_t UHS_NI EPClearHalt(uint8_t addr, uint8_t ep); - uint8_t UHS_NI ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr); + uint8_t UHS_NI ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t *dataptr); - uint8_t UHS_NI getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr); + uint8_t UHS_NI getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t *dataptr); - uint8_t UHS_NI getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr); + uint8_t UHS_NI getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t *dataptr); uint8_t UHS_NI setAddr(uint8_t oldaddr, uint8_t newaddr); uint8_t UHS_NI setConf(uint8_t addr, uint8_t conf_value); - uint8_t UHS_NI getStrDescr(uint8_t addr, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); + uint8_t UHS_NI getStrDescr(uint8_t addr, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr); void UHS_NI ReleaseDevice(uint8_t addr); @@ -262,8 +262,8 @@ public: uint8_t enumerateInterface(ENUMERATION_INFO *ei); uint8_t getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset); uint8_t initDescrStream(ENUMERATION_INFO *ei, USB_FD_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset); - uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); - uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data); + uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data); + uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data); uint8_t doSoftReset(uint8_t parent, uint8_t port, uint8_t address); uint8_t getone(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset); uint8_t eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset, uint16_t *yum); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h index 56d6400979..7d17d626c1 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h @@ -388,7 +388,7 @@ public: return (!condet); }; - virtual UHS_EpInfo *ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t* dataptr); + virtual UHS_EpInfo *ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t *dataptr); virtual void UHS_NI vbusPower(VBUS_t state) { regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE) | (uint8_t)(state)); @@ -483,8 +483,8 @@ public: void gpioWr(uint8_t data); uint8_t regRd(uint8_t reg); uint8_t gpioRd(); - uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p); - uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p); + uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p); // ARM/NVIC specific, used to emulate reentrant ISR. #ifdef SWI_IRQ_NUM diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h index 7fe48652fd..6cfc0152d0 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h @@ -76,7 +76,7 @@ void UHS_NI MAX3421E_HOST::regWr(uint8_t reg, uint8_t data) { /* multiple-byte write */ /* returns a pointer to memory position after last written */ -uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { +uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p) { SPIclass.beginTransaction(MAX3421E_SPI_Settings); MARLIN_UHS_WRITE_SS(LOW); SPIclass.transfer(reg | 0x02); @@ -117,7 +117,7 @@ uint8_t UHS_NI MAX3421E_HOST::regRd(uint8_t reg) { /* multiple-byte register read */ /* returns a pointer to a memory position after last read */ -uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { +uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p) { SPIclass.beginTransaction(MAX3421E_SPI_Settings); MARLIN_UHS_WRITE_SS(LOW); SPIclass.transfer(reg); @@ -472,7 +472,7 @@ uint8_t UHS_NI MAX3421E_HOST::SetAddress(uint8_t addr, uint8_t ep, UHS_EpInfo ** * @param data pointer to data buffer * @return 0 on success */ -uint8_t UHS_NI MAX3421E_HOST::InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data) { +uint8_t UHS_NI MAX3421E_HOST::InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data) { uint8_t rcode = 0; uint8_t pktsize; diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h index abac2b08b3..a8500c595f 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h @@ -479,7 +479,7 @@ */ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); + void assert_failed(uint8_t *file, uint32_t line); #else #define assert_param(expr) ((void)0U) #endif /* USE_FULL_ASSERT */ diff --git a/buildroot/share/fonts/genpages.c b/buildroot/share/fonts/genpages.c index c855ceac50..dea5b05c5c 100644 --- a/buildroot/share/fonts/genpages.c +++ b/buildroot/share/fonts/genpages.c @@ -142,12 +142,12 @@ uint8_t* get_utf8_value(uint8_t *pstart, wchar_t *pval) { return p; } -void usage(char* progname) { +void usage(char *progname) { fprintf(stderr, "usage: %s\n", progname); fprintf(stderr, " read data from stdin\n"); } -void utf8_parse(const char* msg, unsigned int len) { +void utf8_parse(const char *msg, unsigned int len) { uint8_t *pend = NULL; uint8_t *p; uint8_t *pre; From 84a2746d059ea83f5ca81bf671499d4037abb81c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 20:00:57 -0500 Subject: [PATCH 1219/1370] Improve uncrust script --- buildroot/bin/uncrust | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/buildroot/bin/uncrust b/buildroot/bin/uncrust index 9893b5c380..7898f73c8c 100755 --- a/buildroot/bin/uncrust +++ b/buildroot/bin/uncrust @@ -6,11 +6,12 @@ TMPDIR=`mktemp -d` # Reformat a single file to tmp/ -uncrustify -l CPP -c ./buildroot/share/extras/uncrustify.cfg -f "$1" >$TMPDIR/uncrustify.out - -# Replace the original file -cp "$TMPDIR/uncrustify.out" "$1" +if uncrustify -l CPP -c ./buildroot/share/extras/uncrustify.cfg -f "$1" >$TMPDIR/uncrustify.out ; then + cp "$TMPDIR/uncrustify.out" "$1" ; # Replace the original file +else + echo "Something went wrong with uncrustify." +fi # Clean up, deliberately -rm "$TMPDIR/uncrustify.out" +[[ -f "$TMPDIR/uncrustify.out" ]] && rm "$TMPDIR/uncrustify.out" rmdir "$TMPDIR" From b96c3a063fd5c9b334e7f38a52f3b55bf46beebb Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Tue, 30 Mar 2021 03:56:44 +0200 Subject: [PATCH 1220/1370] Optimize BLTouch code for size (#21477) --- Marlin/src/feature/bltouch.h | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h index 8bd41f03e4..9ecccb4256 100644 --- a/Marlin/src/feature/bltouch.h +++ b/Marlin/src/feature/bltouch.h @@ -74,33 +74,33 @@ public: static bool last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain // DEPLOY and STOW are wrapped for error handling - these are used by homing and by probing - FORCE_INLINE static bool deploy() { return deploy_proc(); } - FORCE_INLINE static bool stow() { return stow_proc(); } - FORCE_INLINE static bool status() { return status_proc(); } + static bool deploy() { return deploy_proc(); } + static bool stow() { return stow_proc(); } + static bool status() { return status_proc(); } // Native BLTouch commands ("Underscore"...), used in lcd menus and internally - FORCE_INLINE static void _reset() { command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); } + static void _reset() { command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); } - FORCE_INLINE static void _selftest() { command(BLTOUCH_SELFTEST, BLTOUCH_DELAY); } + static void _selftest() { command(BLTOUCH_SELFTEST, BLTOUCH_DELAY); } - FORCE_INLINE static void _set_SW_mode() { command(BLTOUCH_SW_MODE, BLTOUCH_DELAY); } - FORCE_INLINE static void _reset_SW_mode() { if (triggered()) _stow(); else _deploy(); } + static void _set_SW_mode() { command(BLTOUCH_SW_MODE, BLTOUCH_DELAY); } + static void _reset_SW_mode() { if (triggered()) _stow(); else _deploy(); } - FORCE_INLINE static void _set_5V_mode() { command(BLTOUCH_5V_MODE, BLTOUCH_SET5V_DELAY); } - FORCE_INLINE static void _set_OD_mode() { command(BLTOUCH_OD_MODE, BLTOUCH_SETOD_DELAY); } - FORCE_INLINE static void _mode_store() { command(BLTOUCH_MODE_STORE, BLTOUCH_MODE_STORE_DELAY); } + static void _set_5V_mode() { command(BLTOUCH_5V_MODE, BLTOUCH_SET5V_DELAY); } + static void _set_OD_mode() { command(BLTOUCH_OD_MODE, BLTOUCH_SETOD_DELAY); } + static void _mode_store() { command(BLTOUCH_MODE_STORE, BLTOUCH_MODE_STORE_DELAY); } - FORCE_INLINE static void _deploy() { command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } - FORCE_INLINE static void _stow() { command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY); } + static void _deploy() { command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } + static void _stow() { command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY); } - FORCE_INLINE static void mode_conv_5V() { mode_conv_proc(true); } - FORCE_INLINE static void mode_conv_OD() { mode_conv_proc(false); } + static void mode_conv_5V() { mode_conv_proc(true); } + static void mode_conv_OD() { mode_conv_proc(false); } static bool triggered(); private: - FORCE_INLINE static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } - FORCE_INLINE static bool _stow_query_alarm() { return command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY) == STOW_ALARM; } + static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } + static bool _stow_query_alarm() { return command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY) == STOW_ALARM; } static void clear(); static bool command(const BLTCommand cmd, const millis_t &ms); From badbb4a500f1a583e059b1085f533f6454ead023 Mon Sep 17 00:00:00 2001 From: Ste Date: Tue, 30 Mar 2021 04:07:21 +0200 Subject: [PATCH 1221/1370] Align temp settings (#21329) --- Marlin/Configuration.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c9c83f9bb6..f333c3369b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -437,17 +437,17 @@ //#define TEMP_SENSOR_1_AS_REDUNDANT #define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 -#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 -#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer -#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 +#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target -#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 -#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer -#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 +#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target #define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191 -#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer -#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target // Below this temperature the heater will be switched off // because it probably indicates a broken thermistor wire. From 368fcaee549b16425c6eb60679798ba100b0226d Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 30 Mar 2021 04:14:11 +0200 Subject: [PATCH 1222/1370] Generalize MMU (#21469) --- Marlin/Configuration.h | 10 +++++----- Marlin/src/gcode/control/T.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 20 ++++++++++---------- Marlin/src/inc/SanityCheck.h | 14 +++++++++----- Marlin/src/pins/pins.h | 4 ++-- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f333c3369b..93a60394c2 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -160,11 +160,11 @@ * Multi-Material Unit * Set to one of these predefined models: * - * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) - * PRUSA_MMU2 : Průša MMU2 - * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) - * SMUFF_EMU_MMU2 : Technik Gegg SMuFF (Průša MMU2 emulation mode) - * SMUFF_EMU_MMU2S : Technik Gegg SMuFF (Průša MMU2S emulation mode) + * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) + * PRUSA_MMU2 : Průša MMU2 + * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) + * EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware) + * EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware) * * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. * See additional options in Configuration_adv.h. diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 3ce284f82e..6a084d83ad 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -40,7 +40,7 @@ * F[units/min] Set the movement feedrate * S1 Don't move the tool in XY after change * - * For PRUSA_MMU2(S) and SMUFF_EMU_MMU2(S) + * For PRUSA_MMU2(S) and EXTENDABLE_EMU_MMU2(S) * T[n] Gcode to extrude at least 38.10 mm at feedrate 19.02 mm/s must follow immediately to load to extruder wheels. * T? Gcode to extrude shouldn't have to follow. Load to extruder wheels is done automatically. * Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load. diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index af902481f3..a0fced150f 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -501,11 +501,11 @@ /** * Multi-Material-Unit supported models */ -#define PRUSA_MMU1 1 -#define PRUSA_MMU2 2 -#define PRUSA_MMU2S 3 -#define SMUFF_EMU_MMU2 12 -#define SMUFF_EMU_MMU2S 13 +#define PRUSA_MMU1 1 +#define PRUSA_MMU2 2 +#define PRUSA_MMU2S 3 +#define EXTENDABLE_EMU_MMU2 12 +#define EXTENDABLE_EMU_MMU2S 13 #ifdef MMU_MODEL #define HAS_MMU 1 @@ -517,16 +517,16 @@ #define HAS_PRUSA_MMU2 1 #define HAS_PRUSA_MMU2S 1 #endif - #if MMU_MODEL == SMUFF_EMU_MMU2 || MMU_MODEL == SMUFF_EMU_MMU2S - #define HAS_SMUFF 1 + #if MMU_MODEL == EXTENDABLE_EMU_MMU2 || MMU_MODEL == EXTENDABLE_EMU_MMU2S + #define HAS_EXTENDABLE_MMU 1 #endif #endif #undef PRUSA_MMU1 #undef PRUSA_MMU2 #undef PRUSA_MMU2S -#undef SMUFF_EMU_MMU2 -#undef SMUFF_EMU_MMU2S +#undef EXTENDABLE_EMU_MMU2 +#undef EXTENDABLE_EMU_MMU2S /** * Extruders have some combination of stepper motors and hotends @@ -579,7 +579,7 @@ #undef DISABLE_INACTIVE_EXTRUDER #endif -// Průša MMU1, MMU 2.0, MMUS 2.0 and SMuFF force SINGLENOZZLE +// Průša MMU1, MMU(S) 2.0 and EXTENDABLE_EMU_MMU2(S) force SINGLENOZZLE #if HAS_MMU #define SINGLENOZZLE #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6ed0f53245..287f0c5600 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -920,10 +920,14 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "PRUSA_MMU2 is obsolete. Define MMU_MODEL as PRUSA_MMU2 instead." #elif ENABLED(PRUSA_MMU2_S_MODE) #error "PRUSA_MMU2_S_MODE is obsolete. Define MMU_MODEL as PRUSA_MMU2S instead." +#elif ENABLED(SMUFF_EMU_MMU2) + #error "SMUFF_EMU_MMU2 is obsolete. Define MMU_MODEL as EXTENDABLE_EMU_MMU2 instead." +#elif ENABLED(SMUFF_EMU_MMU2S) + #error "SMUFF_EMU_MMU2S is obsolete. Define MMU_MODEL as EXTENDABLE_EMU_MMU2S instead." #endif /** - * Multi-Material-Unit 2 / SMuFF requirements + * Multi-Material-Unit 2 / EXTENDABLE_EMU_MMU2 requirements */ #if HAS_PRUSA_MMU2 #if EXTRUDERS != 5 @@ -938,11 +942,11 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif ENABLED(MMU_EXTRUDER_SENSOR) && !HAS_LCD_MENU #error "MMU_EXTRUDER_SENSOR requires an LCD supporting MarlinUI to be enabled." #elif DISABLED(ADVANCED_PAUSE_FEATURE) - static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2(S) / SMUFF_EMU_MMU2(S)."); + static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2(S) / HAS_EXTENDABLE_MMU(S)."); #endif #endif -#if HAS_SMUFF && EXTRUDERS > 12 - #error "Too many extruders for SMUFF_EMU_MMU2(S). (12 maximum)." +#if HAS_EXTENDABLE_MMU && EXTRUDERS > 15 + #error "Too many extruders for MMU(S) emulation mode. (15 maximum)." #endif /** @@ -980,7 +984,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1." #endif -#elif HAS_PRUSA_MMU1 || HAS_SMUFF +#elif HAS_PRUSA_MMU1 || HAS_EXTENDABLE_MMU #error "Multi-Material-Unit requires 2 or more EXTRUDERS." diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 8eecce2c17..35bfb266eb 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -35,8 +35,8 @@ * These numbers are the same in any pin mapping. */ -#if HAS_SMUFF - #define MAX_EXTRUDERS 12 +#if HAS_EXTENDABLE_MMU + #define MAX_EXTRUDERS 15 #else #define MAX_EXTRUDERS 8 #endif From f18da95d38499f70f6f652165ac380b02185c752 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Tue, 30 Mar 2021 04:36:01 +0200 Subject: [PATCH 1223/1370] Flags for MarlinSerial instance features (#21318) --- Marlin/src/core/bug_on.h | 7 ++-- Marlin/src/core/macros.h | 44 ++++++++++++++++++---- Marlin/src/core/serial.h | 2 +- Marlin/src/core/serial_base.h | 68 ++++++++++++++++++++++++---------- Marlin/src/core/serial_hook.h | 27 ++++++++++++-- Marlin/src/feature/meatpack.h | 2 + Marlin/src/gcode/gcode_d.cpp | 5 +++ Marlin/src/gcode/host/M115.cpp | 9 ++++- 8 files changed, 127 insertions(+), 37 deletions(-) diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h index dc32f0385a..3c9dec0f96 100644 --- a/Marlin/src/core/bug_on.h +++ b/Marlin/src/core/bug_on.h @@ -27,11 +27,12 @@ // Useful macro for stopping the CPU on an unexpected condition // This is used like SERIAL_ECHOPAIR, that is: a key-value call of the local variables you want // to dump to the serial port before stopping the CPU. - #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) + // \/ Don't replace by SERIAL_ECHOPAIR since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building + #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLN(": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) #elif ENABLED(MARLIN_DEV_MODE) // Don't stop the CPU here, but at least dump the bug on the serial port - //#define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": BUG!\n"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) - #define BUG_ON(V...) NOOP + // \/ Don't replace by SERIAL_ECHOPAIR since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building + #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLN(": BUG!"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) #else // Release mode, let's ignore the bug #define BUG_ON(V...) NOOP diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index f900993784..fb129cd939 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -318,6 +318,16 @@ #endif + // Allow manipulating enumeration value like flags without ugly cast everywhere + #define ENUM_FLAGS(T) \ + FORCE_INLINE constexpr T operator&(T x, T y) { return static_cast(static_cast(x) & static_cast(y)); } \ + FORCE_INLINE constexpr T operator|(T x, T y) { return static_cast(static_cast(x) | static_cast(y)); } \ + FORCE_INLINE constexpr T operator^(T x, T y) { return static_cast(static_cast(x) ^ static_cast(y)); } \ + FORCE_INLINE constexpr T operator~(T x) { return static_cast(~static_cast(x)); } \ + FORCE_INLINE T & operator&=(T &x, T y) { return x &= y; } \ + FORCE_INLINE T & operator|=(T &x, T y) { return x |= y; } \ + FORCE_INLINE T & operator^=(T &x, T y) { return x ^= y; } + // C++11 solution that is standard compliant. is not available on all platform namespace Private { template struct enable_if { }; @@ -357,23 +367,43 @@ return *str ? findStringEnd(str + 1) : str; } - // Check whether a string contains a slash - constexpr bool containsSlash(const char *str) { - return *str == '/' ? true : (*str ? containsSlash(str + 1) : false); + // Check whether a string contains a specific character + constexpr bool contains(const char *str, const char ch) { + return *str == ch ? true : (*str ? contains(str + 1, ch) : false); } - // Find the last position of the slash - constexpr const char* findLastSlashPos(const char *str) { - return *str == '/' ? (str + 1) : findLastSlashPos(str - 1); + // Find the last position of the specific character (should be called with findStringEnd) + constexpr const char* findLastPos(const char *str, const char ch) { + return *str == ch ? (str + 1) : findLastPos(str - 1, ch); } // Compile-time evaluation of the last part of a file path // Typically used to shorten the path to file in compiled strings // CompileTimeString::baseName(__FILE__) returns "macros.h" and not /path/to/Marlin/src/core/macros.h constexpr const char* baseName(const char *str) { - return containsSlash(str) ? findLastSlashPos(findStringEnd(str)) : str; + return contains(str, '/') ? findLastPos(findStringEnd(str), '/') : str; + } + + // Find the first occurence of a character in a string (or return the last position in the string) + constexpr const char* findFirst(const char *str, const char ch) { + return *str == ch || *str == 0 ? (str + 1) : findFirst(str + 1, ch); + } + // Compute the string length at compile time + constexpr unsigned stringLen(const char *str) { + return *str == 0 ? 0 : 1 + stringLen(str + 1); } } #define ONLY_FILENAME CompileTimeString::baseName(__FILE__) + /** Get the templated type name. This does not depends on RTTI, but on the preprocessor, so it should be quite safe to use even on old compilers. + WARNING: DO NOT RENAME THIS FUNCTION (or change the text inside the function to match what the preprocessor will generate) + The name is chosen very short since the binary will store "const char* gtn(T*) [with T = YourTypeHere]" so avoid long function name here */ + template + inline const char* gtn(T*) { + // It works on GCC by instantiating __PRETTY_FUNCTION__ and parsing the result. So the syntax here is very limited to GCC output + constexpr unsigned verboseChatLen = sizeof("const char* gtn(T*) [with T = ") - 1; + static char templateType[sizeof(__PRETTY_FUNCTION__) - verboseChatLen] = {}; + __builtin_memcpy(templateType, __PRETTY_FUNCTION__ + verboseChatLen, sizeof(__PRETTY_FUNCTION__) - verboseChatLen - 2); + return templateType; + } #else diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 2f23e4e3c2..43137f71d7 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -146,7 +146,7 @@ inline void SERIAL_ECHO(serial_char_t x) { SERIAL_IMPL.write(x.c); } #define AS_CHAR(C) serial_char_t(C) // SERIAL_ECHO_F prints a floating point value with optional precision -inline void SERIAL_ECHO_F(EnsureDouble x, int digit = 2) { SERIAL_IMPL.print(x, digit); } +inline void SERIAL_ECHO_F(EnsureDouble x, int digit=2) { SERIAL_IMPL.print(x, digit); } template void SERIAL_ECHOLN(T x) { SERIAL_IMPL.println(x); } diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 78721c6f14..cdea70e2c5 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -45,10 +45,6 @@ struct serial_index_t { constexpr serial_index_t() : index(-1) {} }; -// flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. -CALL_IF_EXISTS_IMPL(void, flushTX); -CALL_IF_EXISTS_IMPL(bool, connected, true); - // In order to catch usage errors in code, we make the base to encode number explicit // If given a number (and not this enum), the compiler will reject the overload, falling back to the (double, digit) version // We don't want hidden conversion of the first parameter to double, so it has to be as hard to do for the compiler as creating this enum @@ -59,19 +55,34 @@ enum class PrintBase { Bin = 2 }; -// A simple forward struct that prevent the compiler to select print(double, int) as a default overload for any type different than -// double or float. For double or float, a conversion exists so the call will be transparent +// A simple feature list enumeration +enum class SerialFeature { + None = 0x00, + MeatPack = 0x01, //!< Enabled when Meatpack is present + BinaryFileTransfer = 0x02, //!< Enabled for BinaryFile transfer support (in the future) + Virtual = 0x04, //!< Enabled for virtual serial port (like Telnet / Websocket / ...) + Hookable = 0x08, //!< Enabled if the serial class supports a setHook method +}; +ENUM_FLAGS(SerialFeature); + +// flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. +CALL_IF_EXISTS_IMPL(void, flushTX); +CALL_IF_EXISTS_IMPL(bool, connected, true); +CALL_IF_EXISTS_IMPL(SerialFeature, features, SerialFeature::None); + +// A simple forward struct to prevent the compiler from selecting print(double, int) as a default overload +// for any type other than double/float. For double/float, a conversion exists so the call will be invisible. struct EnsureDouble { double a; FORCE_INLINE operator double() { return a; } - // If the compiler breaks on ambiguity here, it's likely because you're calling print(X, base) with X not a double or a float, and a - // base that's not one of PrintBase's value. This exact code is made to detect such error, you NEED to set a base explicitely like this: + // If the compiler breaks on ambiguity here, it's likely because print(X, base) is called with X not a double/float, and + // a base that's not a PrintBase value. This code is made to detect the error. You MUST set a base explicitly like this: // SERIAL_PRINT(v, PrintBase::Hex) FORCE_INLINE EnsureDouble(double a) : a(a) {} FORCE_INLINE EnsureDouble(float a) : a(a) {} }; -// Using Curiously Recurring Template Pattern here to avoid virtual table cost when compiling. +// Using Curiously-Recurring Template Pattern here to avoid virtual table cost when compiling. // Since the real serial class is known at compile time, this results in the compiler writing // a completely efficient code. template @@ -85,27 +96,44 @@ struct SerialBase { SerialBase(const bool) {} #endif + #define SerialChild static_cast(this) + // Static dispatch methods below: // The most important method here is where it all ends to: - size_t write(uint8_t c) { return static_cast(this)->write(c); } + size_t write(uint8_t c) { return SerialChild->write(c); } + // Called when the parser finished processing an instruction, usually build to nothing - void msgDone() { static_cast(this)->msgDone(); } - // Called upon initialization - void begin(const long baudRate) { static_cast(this)->begin(baudRate); } - // Called upon destruction - void end() { static_cast(this)->end(); } + void msgDone() const { SerialChild->msgDone(); } + + // Called on initialization + void begin(const long baudRate) { SerialChild->begin(baudRate); } + + // Called on destruction + void end() { SerialChild->end(); } + /** Check for available data from the port @param index The port index, usually 0 */ - int available(serial_index_t index = 0) { return static_cast(this)->available(index); } + int available(serial_index_t index=0) const { return SerialChild->available(index); } + /** Read a value from the port @param index The port index, usually 0 */ - int read(serial_index_t index = 0) { return static_cast(this)->read(index); } + int read(serial_index_t index=0) { return SerialChild->read(index); } + + /** Combine the features of this serial instance and return it + @param index The port index, usually 0 */ + SerialFeature features(serial_index_t index=0) const { return static_cast(this)->features(index); } + + // Check if the serial port has a feature + bool has_feature(serial_index_t index, SerialFeature flag) const { (features(index) & flag) != SerialFeature::None; } + // Check if the serial port is connected (usually bypassed) - bool connected() { return static_cast(this)->connected(); } + bool connected() const { return SerialChild->connected(); } + // Redirect flush - void flush() { static_cast(this)->flush(); } + void flush() { SerialChild->flush(); } + // Not all implementation have a flushTX, so let's call them only if the child has the implementation - void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + void flushTX() { CALL_IF_EXISTS(void, SerialChild, flushTX); } // Glue code here FORCE_INLINE void write(const char *str) { while (*str) write(*str++); } diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index c687891fb4..7bc04a5e88 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -65,6 +65,8 @@ struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + SerialFeature features(serial_index_t index) const { return CALL_IF_EXISTS(SerialFeature, static_cast(this), features, index); } + // We have 2 implementation of the same method in both base class, let's say which one we want using SerialT::available; using SerialT::read; @@ -98,10 +100,11 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial > { bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - int available(serial_index_t ) { return (int)out.available(); } - int read(serial_index_t ) { return (int)out.read(); } + int available(serial_index_t) { return (int)out.available(); } + int read(serial_index_t) { return (int)out.read(); } int available() { return (int)out.available(); } int read() { return (int)out.read(); } + SerialFeature features(serial_index_t index) const { return CALL_IF_EXISTS(SerialFeature, &out, features, index); } ConditionalSerial(bool & conditionVariable, SerialT & out, const bool e) : BaseClassT(e), condition(conditionVariable), out(out) {} }; @@ -126,6 +129,7 @@ struct ForwardSerial : public SerialBase< ForwardSerial > { int read(serial_index_t) { return (int)out.read(); } int available() { return (int)out.available(); } int read() { return (int)out.read(); } + SerialFeature features(serial_index_t index) const { return CALL_IF_EXISTS(SerialFeature, &out, features, index); } ForwardSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} }; @@ -163,9 +167,15 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria // Underlying implementation might use Arduino's bool operator bool connected() { - return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, static_cast(this), connected) : static_cast(this)->operator bool(); + return Private::HasMember_connected::value + ? CALL_IF_EXISTS(bool, static_cast(this), connected) + : static_cast(this)->operator bool(); } - void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + + // Append Hookable for this class + SerialFeature features(serial_index_t index) const { return SerialFeature::Hookable | CALL_IF_EXISTS(SerialFeature, static_cast(this), features, index); } void setHook(WriteHook writeHook = 0, EndOfMessageHook eofHook = 0, void * userPointer = 0) { // Order is important here as serial code can be called inside interrupts @@ -251,6 +261,15 @@ struct MultiSerial : public SerialBase< MultiSerial> { // Existing instances implement Arduino's operator bool, so use that if it's available bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + SerialFeature features(serial_index_t index) const { return SerialFeature::MeatPack | CALL_IF_EXISTS(SerialFeature, &out, features, index); } + int available(serial_index_t index) { if (charCount) return charCount; // The buffer still has data diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index a683a330f1..8941523a16 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -167,6 +167,11 @@ dump_delay_accuracy_check(); break; + case 7: // D7 dump the current serial port type (hence configuration) + SERIAL_ECHOLNPAIR("Current serial configuration RX_BS:", RX_BUFFER_SIZE, ", TX_BS:", TX_BUFFER_SIZE); + SERIAL_ECHOLN(gtn(&SERIAL_IMPL)); + break; + case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) SERIAL_ECHOLNPGM("Disabling heaters and attempting to trigger Watchdog"); SERIAL_ECHOLNPGM("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")"); diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index a518e68cf5..4f18e5504d 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -22,6 +22,8 @@ #include "../gcode.h" #include "../../inc/MarlinConfig.h" +#include "../queue.h" // for getting the command port + #if ENABLED(M115_GEOMETRY_REPORT) #include "../../module/motion.h" @@ -59,6 +61,9 @@ void GcodeSuite::M115() { #if ENABLED(EXTENDED_CAPABILITIES_REPORT) + // The port that sent M115 + serial_index_t port = queue.ring_buffer.command_port(); + // PAREN_COMMENTS TERN_(PAREN_COMMENTS, cap_line(PSTR("PAREN_COMMENTS"), true)); @@ -69,7 +74,7 @@ void GcodeSuite::M115() { cap_line(PSTR("SERIAL_XON_XOFF"), ENABLED(SERIAL_XON_XOFF)); // BINARY_FILE_TRANSFER (M28 B1) - cap_line(PSTR("BINARY_FILE_TRANSFER"), ENABLED(BINARY_FILE_TRANSFER)); + cap_line(PSTR("BINARY_FILE_TRANSFER"), ENABLED(BINARY_FILE_TRANSFER)); // TODO: Use SERIAL_IMPL.has_feature(port, SerialFeature::BinaryFileTransfer) once implemented // EEPROM (M500, M501) cap_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); @@ -148,7 +153,7 @@ void GcodeSuite::M115() { cap_line(PSTR("COOLER_TEMPERATURE"), ENABLED(HAS_COOLER)); // MEATPACK Compression - cap_line(PSTR("MEATPACK"), ENABLED(HAS_MEATPACK)); + cap_line(PSTR("MEATPACK"), SERIAL_IMPL.has_feature(port, SerialFeature::MeatPack)); // Machine Geometry #if ENABLED(M115_GEOMETRY_REPORT) From 9902e6fb9f1f50a4396fc7d1a2f834c600331a89 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 29 Mar 2021 23:52:30 -0300 Subject: [PATCH 1224/1370] Fix and add STM32 SDIO DMA (#21476) --- .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 219 ++++++++++-------- Marlin/src/gcode/gcode_d.cpp | 105 +++++++-- 2 files changed, 199 insertions(+), 125 deletions(-) diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index fc9b960c1c..824142b889 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -36,9 +36,10 @@ // use USB drivers - extern "C" { int8_t SD_MSC_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); - int8_t SD_MSC_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); - extern SD_HandleTypeDef hsd; + extern "C" { + int8_t SD_MSC_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); + int8_t SD_MSC_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); + extern SD_HandleTypeDef hsd; } bool SDIO_Init() { @@ -75,7 +76,18 @@ #error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported" #endif + // Fixed + #define SDIO_D0_PIN PC8 + #define SDIO_D1_PIN PC9 + #define SDIO_D2_PIN PC10 + #define SDIO_D3_PIN PC11 + #define SDIO_CK_PIN PC12 + #define SDIO_CMD_PIN PD2 + SD_HandleTypeDef hsd; // create SDIO structure + // F4 support one dma for RX and another for TX. + // But Marlin will never do read and write at same time, so we use always one dma for both. + DMA_HandleTypeDef hdma_sdio; /* SDIO_INIT_CLK_DIV is 118 @@ -96,12 +108,12 @@ // Target Clock, configurable. Default is 18MHz, from STM32F1 #ifndef SDIO_CLOCK - #define SDIO_CLOCK 18000000 /* 18 MHz */ + #define SDIO_CLOCK 18000000 // 18 MHz #endif // SDIO retries, configurable. Default is 3, from STM32F1 #ifndef SDIO_READ_RETRIES - #define SDIO_READ_RETRIES 3 + #define SDIO_READ_RETRIES 3 #endif // SDIO Max Clock (naming from STM Manual, don't change) @@ -120,24 +132,21 @@ } void go_to_transfer_speed() { - SD_InitTypeDef Init; - /* Default SDIO peripheral configuration for SD card initialization */ - Init.ClockEdge = hsd.Init.ClockEdge; - Init.ClockBypass = hsd.Init.ClockBypass; - Init.ClockPowerSave = hsd.Init.ClockPowerSave; - Init.BusWide = hsd.Init.BusWide; - Init.HardwareFlowControl = hsd.Init.HardwareFlowControl; - Init.ClockDiv = clock_to_divider(SDIO_CLOCK); + hsd.Init.ClockEdge = hsd.Init.ClockEdge; + hsd.Init.ClockBypass = hsd.Init.ClockBypass; + hsd.Init.ClockPowerSave = hsd.Init.ClockPowerSave; + hsd.Init.BusWide = hsd.Init.BusWide; + hsd.Init.HardwareFlowControl = hsd.Init.HardwareFlowControl; + hsd.Init.ClockDiv = clock_to_divider(SDIO_CLOCK); /* Initialize SDIO peripheral interface with default configuration */ - SDIO_Init(hsd.Instance, Init); + SDIO_Init(hsd.Instance, hsd.Init); } void SD_LowLevel_Init(void) { uint32_t tempreg; - __HAL_RCC_SDIO_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); //enable GPIO clocks __HAL_RCC_GPIOD_CLK_ENABLE(); //enable GPIO clocks @@ -163,11 +172,45 @@ GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - #if DISABLED(STM32F1xx) - // TODO: use __HAL_RCC_SDIO_RELEASE_RESET() and __HAL_RCC_SDIO_CLK_ENABLE(); - RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset - RCC->APB2ENR |= RCC_APB2RSTR_SDIORST_Msk; // enable SDIO clock - // Enable the DMA2 Clock + // Setup DMA + #if defined(STM32F1xx) + hdma_sdio.Init.Mode = DMA_NORMAL; + hdma_sdio.Instance = DMA2_Channel4; + HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn); + #elif defined(STM32F4xx) + hdma_sdio.Init.Mode = DMA_PFCTRL; + hdma_sdio.Instance = DMA2_Stream3; + hdma_sdio.Init.Channel = DMA_CHANNEL_4; + hdma_sdio.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + hdma_sdio.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + hdma_sdio.Init.MemBurst = DMA_MBURST_INC4; + hdma_sdio.Init.PeriphBurst = DMA_PBURST_INC4; + HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); + #endif + HAL_NVIC_EnableIRQ(SDIO_IRQn); + hdma_sdio.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_sdio.Init.MemInc = DMA_MINC_ENABLE; + hdma_sdio.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + hdma_sdio.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + hdma_sdio.Init.Priority = DMA_PRIORITY_LOW; + __HAL_LINKDMA(&hsd, hdmarx, hdma_sdio); + __HAL_LINKDMA(&hsd, hdmatx, hdma_sdio); + + #if defined(STM32F1xx) + __HAL_RCC_SDIO_CLK_ENABLE(); + __HAL_RCC_DMA2_CLK_ENABLE(); + #else + __HAL_RCC_SDIO_FORCE_RESET(); + delay(2); + __HAL_RCC_SDIO_RELEASE_RESET(); + delay(2); + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_DMA2_FORCE_RESET(); + delay(2); + __HAL_RCC_DMA2_RELEASE_RESET(); + delay(2); + __HAL_RCC_DMA2_CLK_ENABLE(); #endif //Initialize the SDIO (with initial <400Khz Clock) @@ -179,6 +222,7 @@ // Power up the SDIO SDIO_PowerState_ON(SDIO); + hsd.Instance = SDIO; } void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { // application specific init @@ -222,107 +266,82 @@ if (!status) break; if (!--retry_Cnt) return false; // return failing status if retries are exhausted } + go_to_transfer_speed(); } #endif return true; } - /* - void init_SDIO_pins(void) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - // SDIO GPIO Configuration - // PC8 ------> SDIO_D0 - // PC12 ------> SDIO_CK - // PD2 ------> SDIO_CMD + static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t *src, uint8_t *dst) { + if(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false; - GPIO_InitStruct.Pin = GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); - GPIO_InitStruct.Pin = GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - } - */ - //bool SDIO_init() { return (bool) (SD_SDIO_Init() ? 1 : 0);} - //bool SDIO_Init_C() { return (bool) (SD_SDIO_Init() ? 1 : 0);} - - bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { - hsd.Instance = SDIO; - uint8_t retryCnt = SDIO_READ_RETRIES; - - bool status; - for (;;) { - TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); - status = (bool) HAL_SD_ReadBlocks(&hsd, (uint8_t*)dst, block, 1, 1000); // read one 512 byte block with 500mS timeout - status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK - if (!status) break; // return passing status - if (!--retryCnt) break; // return failing status if retries are exhausted + HAL_StatusTypeDef ret; + if (src) { + hdma_sdio.Init.Direction = DMA_MEMORY_TO_PERIPH; + HAL_DMA_Init(&hdma_sdio); + ret = HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t *)src, block, 1); + } + else { + hdma_sdio.Init.Direction = DMA_PERIPH_TO_MEMORY; + HAL_DMA_Init(&hdma_sdio); + ret = HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t *)dst, block, 1); } - return status; - /* - return (bool) ((status_read | status_card) ? 1 : 0); - - if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; - if (blockAddress >= SdCard.LogBlockNbr) return false; - if ((0x03 & (uint32_t)data)) return false; // misaligned data - - if (SdCard.CardType != CARD_SDHC_SDXC) { blockAddress *= 512U; } - - if (!SDIO_CmdReadSingleBlock(blockAddress)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + if (ret != HAL_OK) { + HAL_DMA_Abort_IT(&hdma_sdio); + HAL_DMA_DeInit(&hdma_sdio); return false; } - while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) {} - - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - - if (SDIO->STA & SDIO_STA_RXDAVL) { - while (SDIO->STA & SDIO_STA_RXDAVL) (void)SDIO->FIFO; - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; + uint32_t timeout = millis() + 500; + // Wait the transfer + while (hsd.State != HAL_SD_STATE_READY) { + if (millis() > timeout) { + HAL_DMA_Abort_IT(&hdma_sdio); + HAL_DMA_DeInit(&hdma_sdio); + return false; + } } - if (SDIO_GET_FLAG(SDIO_STA_TRX_ERROR_FLAGS)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; - } - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - */ + while (__HAL_DMA_GET_FLAG(&hdma_sdio, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_sdio)) != 0 + || __HAL_DMA_GET_FLAG(&hdma_sdio, __HAL_DMA_GET_TE_FLAG_INDEX(&hdma_sdio)) != 0) { /* nada */ } + + HAL_DMA_Abort_IT(&hdma_sdio); + HAL_DMA_DeInit(&hdma_sdio); + + timeout = millis() + 500; + while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) + if (millis() > timeout) return false; return true; } - bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { - hsd.Instance = SDIO; - uint8_t retryCnt = SDIO_READ_RETRIES; - bool status; - for (;;) { - status = (bool) HAL_SD_WriteBlocks(&hsd, (uint8_t*)src, block, 1, 500); // write one 512 byte block with 500mS timeout - status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK - if (!status) break; // return passing status - if (!--retryCnt) break; // return failing status if retries are exhausted - } - return status; + bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) if (SDIO_ReadWriteBlock_DMA(block, NULL, dst)) return true; + return false; } + bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) if (SDIO_ReadWriteBlock_DMA(block, src, NULL)) return true; + return false; + } + + #if defined(STM32F1xx) + #define DMA_IRQ_HANDLER DMA2_Channel4_5_IRQHandler + #elif defined(STM32F4xx) + #define DMA_IRQ_HANDLER DMA2_Stream3_IRQHandler + #else + #error "Unknown STM32 architecture." + #endif + + extern "C" void SDIO_IRQHandler(void) { HAL_SD_IRQHandler(&hsd); } + extern "C" void DMA_IRQ_HANDLER(void) { HAL_DMA_IRQHandler(&hdma_sdio); } + #endif // !USBD_USE_CDC_COMPOSITE #endif // SDIO_SUPPORT #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 8941523a16..f87cebc886 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -29,6 +29,7 @@ #include "../libs/hex_print.h" #include "../HAL/shared/eeprom_if.h" #include "../HAL/shared/Delay.h" + #include "../sd/cardreader.h" extern void dump_delay_accuracy_check(); @@ -126,19 +127,19 @@ #endif case 4: { // D4 Read / Write PIN - // const uint8_t pin = parser.byteval('P'); - // const bool is_out = parser.boolval('F'), - // val = parser.byteval('V', LOW); + //const bool is_out = parser.boolval('F'); + //const uint8_t pin = parser.byteval('P'), + // val = parser.byteval('V', LOW); if (parser.seenval('X')) { // TODO: Write the hex bytes after the X //while (len--) { //} } else { - // while (len--) { - // TODO: Read bytes from EEPROM - // print_hex_byte(eeprom_read_byte(*(adr++)); - // } + //while (len--) { + //// TODO: Read bytes from EEPROM + // print_hex_byte(eeprom_read_byte(adr++)); + //} SERIAL_EOL(); } } break; @@ -155,10 +156,10 @@ //while (len--) {} } else { - // while (len--) { - // TODO: Read bytes from EEPROM - // print_hex_byte(eeprom_read_byte(adr++)); - // } + //while (len--) { + //// TODO: Read bytes from EEPROM + // print_hex_byte(eeprom_read_byte(adr++)); + //} SERIAL_EOL(); } } break; @@ -186,22 +187,76 @@ SERIAL_ECHOLNPGM("FAILURE: Watchdog did not trigger board reset."); } break; - #if ENABLED(POSTMORTEM_DEBUGGING) - case 451: { // Trigger all kind of faults to test exception catcher - SERIAL_ECHOLNPGM("Disabling heaters"); - thermalManager.disable_all_heaters(); - delay(1000); // Allow time to print - volatile uint8_t type[5] = { parser.byteval('T', 1) }; + #if ENABLED(SDSUPPORT) - // The code below is obviously wrong and it's full of quirks to fool the compiler from optimizing away the code - switch (type[0]) { - case 1: default: *(int*)0 = 451; break; // Write at bad address - case 2: { volatile int a = 0; volatile int b = 452 / a; *(int*)&a = b; } break; // Divide by zero (some CPUs accept this, like ARM) - case 3: { *(uint32_t*)&type[1] = 453; volatile int a = *(int*)&type[1]; type[0] = a / 255; } break; // Unaligned access (some CPUs accept this) - case 4: { volatile void (*func)() = (volatile void (*)()) 0xE0000000; func(); } break; // Invalid instruction + case 101: { // D101 Test SD Write + card.openFileWrite("test.gco"); + if (!card.isFileOpen()) { + SERIAL_ECHOLNPAIR("Failed to open test.gco to write."); + return; + } + __attribute__((aligned(sizeof(size_t)))) uint8_t buf[512]; + + uint16_t c; + for (c = 0; c < COUNT(buf); c++) + buf[c] = 'A' + (c % ('Z' - 'A')); + + c = 1024 * 4; + while (c--) { + TERN_(USE_WATCHDOG, watchdog_refresh()); + card.write(buf, COUNT(buf)); + } + SERIAL_ECHOLNPGM(" done"); + card.closefile(); + } break; + + case 102: { // D102 Test SD Read + card.openFileRead("test.gco"); + if (!card.isFileOpen()) { + SERIAL_ECHOLNPAIR("Failed to open test.gco to read."); + return; + } + __attribute__((aligned(sizeof(size_t)))) uint8_t buf[512]; + uint16_t c = 1024 * 4; + while (c--) { + TERN_(USE_WATCHDOG, watchdog_refresh()); + card.read(buf, COUNT(buf)); + bool error = false; + for (uint16_t i = 0; i < COUNT(buf); i++) { + if (buf[i] != ('A' + (i % ('Z' - 'A')))) { + error = true; + break; + } + } + if (error) { + SERIAL_ECHOLNPGM(" Read error!"); + break; + } + } + SERIAL_ECHOLNPGM(" done"); + card.closefile(); + } break; + + #endif // SDSUPPORT + + #if ENABLED(POSTMORTEM_DEBUGGING) + + case 451: { // Trigger all kind of faults to test exception catcher + SERIAL_ECHOLNPGM("Disabling heaters"); + thermalManager.disable_all_heaters(); + delay(1000); // Allow time to print + volatile uint8_t type[5] = { parser.byteval('T', 1) }; + + // The code below is obviously wrong and it's full of quirks to fool the compiler from optimizing away the code + switch (type[0]) { + case 1: default: *(int*)0 = 451; break; // Write at bad address + case 2: { volatile int a = 0; volatile int b = 452 / a; *(int*)&a = b; } break; // Divide by zero (some CPUs accept this, like ARM) + case 3: { *(uint32_t*)&type[1] = 453; volatile int a = *(int*)&type[1]; type[0] = a / 255; } break; // Unaligned access (some CPUs accept this) + case 4: { volatile void (*func)() = (volatile void (*)()) 0xE0000000; func(); } break; // Invalid instruction + } + break; } - break; - } + #endif } } From 4e77fe50a473a4491924b9815554405530a8fdf6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 21:10:55 -0500 Subject: [PATCH 1225/1370] Adjust microsteps alignment --- Marlin/Configuration_adv.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d3ad971e6d..a2f357501b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2507,7 +2507,7 @@ #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 - #define E1_MICROSTEPS E0_MICROSTEPS + #define E1_MICROSTEPS E0_MICROSTEPS #define E1_RSENSE 0.11 #define E1_CHAIN_POS -1 //#define E1_INTERPOLATE true @@ -2515,7 +2515,7 @@ #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 - #define E2_MICROSTEPS E0_MICROSTEPS + #define E2_MICROSTEPS E0_MICROSTEPS #define E2_RSENSE 0.11 #define E2_CHAIN_POS -1 //#define E2_INTERPOLATE true @@ -2523,7 +2523,7 @@ #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 - #define E3_MICROSTEPS E0_MICROSTEPS + #define E3_MICROSTEPS E0_MICROSTEPS #define E3_RSENSE 0.11 #define E3_CHAIN_POS -1 //#define E3_INTERPOLATE true @@ -2531,7 +2531,7 @@ #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 - #define E4_MICROSTEPS E0_MICROSTEPS + #define E4_MICROSTEPS E0_MICROSTEPS #define E4_RSENSE 0.11 #define E4_CHAIN_POS -1 //#define E4_INTERPOLATE true @@ -2539,7 +2539,7 @@ #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 - #define E5_MICROSTEPS E0_MICROSTEPS + #define E5_MICROSTEPS E0_MICROSTEPS #define E5_RSENSE 0.11 #define E5_CHAIN_POS -1 //#define E5_INTERPOLATE true @@ -2547,7 +2547,7 @@ #if AXIS_IS_TMC(E6) #define E6_CURRENT 800 - #define E6_MICROSTEPS E0_MICROSTEPS + #define E6_MICROSTEPS E0_MICROSTEPS #define E6_RSENSE 0.11 #define E6_CHAIN_POS -1 //#define E6_INTERPOLATE true @@ -2555,7 +2555,7 @@ #if AXIS_IS_TMC(E7) #define E7_CURRENT 800 - #define E7_MICROSTEPS E0_MICROSTEPS + #define E7_MICROSTEPS E0_MICROSTEPS #define E7_RSENSE 0.11 #define E7_CHAIN_POS -1 //#define E7_INTERPOLATE true From 2b0fcc79c55ff1dfa5dbe13a9eb52b9811498e80 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 22:38:33 -0500 Subject: [PATCH 1226/1370] Serial flags followup Followup to #21318 --- Marlin/src/core/serial_base.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index cdea70e2c5..8b23816b17 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -124,7 +124,7 @@ struct SerialBase { SerialFeature features(serial_index_t index=0) const { return static_cast(this)->features(index); } // Check if the serial port has a feature - bool has_feature(serial_index_t index, SerialFeature flag) const { (features(index) & flag) != SerialFeature::None; } + bool has_feature(serial_index_t index, SerialFeature flag) const { return (features(index) & flag) != SerialFeature::None; } // Check if the serial port is connected (usually bypassed) bool connected() const { return SerialChild->connected(); } From e787cdd1cb092c82b34a84181fbb6bae69ce5279 Mon Sep 17 00:00:00 2001 From: Marco van Wieringen Date: Wed, 31 Mar 2021 03:11:33 +0200 Subject: [PATCH 1227/1370] Fix FYSETC_S6 heaters pins (#21483) When adding support FYSETC Spider board the S6 pins file was broken. --- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index e6420dc238..7aeab0196a 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -171,13 +171,13 @@ #ifndef HEATER_0_PIN #define HEATER_0_PIN PB3 #endif -#ifndef HEATER_0_PIN +#ifndef HEATER_1_PIN #define HEATER_1_PIN PB4 #endif -#ifndef HEATER_0_PIN +#ifndef HEATER_2_PIN #define HEATER_2_PIN PB15 #endif -#ifndef HEATER_0_PIN +#ifndef HEATER_BED_PIN #define HEATER_BED_PIN PC8 #endif From 16af2148b9fbd89d7294042a2459789138555ecd Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Wed, 31 Mar 2021 04:20:33 +0200 Subject: [PATCH 1228/1370] Optimized string-to-number functions (#21484) --- Marlin/src/gcode/parser.cpp | 140 ++++++++++++++++++ Marlin/src/gcode/parser.h | 29 +--- Marlin/src/gcode/queue.cpp | 8 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 2 +- 4 files changed, 153 insertions(+), 26 deletions(-) diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index ebe9d3b2cd..6eb56126e1 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -28,6 +28,146 @@ #include "../MarlinCore.h" +#ifdef __AVR__ + + static FORCE_INLINE uint32_t mult10(uint32_t val) { + uint32_t tmp = val; + __asm__ __volatile__ ( + "add %A[tmp], %A[tmp]\n" + "adc %B[tmp], %B[tmp]\n" + "adc %C[tmp], %C[tmp]\n" + "adc %D[tmp], %D[tmp]\n" + "add %A[tmp], %A[tmp]\n" + "adc %B[tmp], %B[tmp]\n" + "adc %C[tmp], %C[tmp]\n" + "adc %D[tmp], %D[tmp]\n" + "add %A[val], %A[tmp]\n" + "adc %B[val], %B[tmp]\n" + "adc %C[val], %C[tmp]\n" + "adc %D[val], %D[tmp]\n" + "add %A[val], %A[val]\n" + "adc %B[val], %B[val]\n" + "adc %C[val], %C[val]\n" + "adc %D[val], %D[val]\n" + : [val] "+&r" (val), + [tmp] "+&r" (tmp) + ); + return val; + } + +#else + + static FORCE_INLINE uint32_t mult10(uint32_t val) { return val * 10; } + +#endif + +// cheap base-10 strto(u)l. +// does not check for errors. +int32_t parse_int32(const char *buf) { + char c; + + // Get a char, skipping leading spaces + do { c = *buf++; } while (c == ' '); + + // check for sign + bool is_negative = (c == '-'); + if (is_negative || c == '+') + c = *buf++; + + // optimization for first digit (no multiplication) + uint8_t uc = c - '0'; + if (uc > 9) return 0; + + // read unsigned value + uint32_t uval = uc; + while (true) { + c = *buf++; + uc = c - '0'; + if (uc > 9) break; + uval = mult10(uval) + uc; + } + + return is_negative ? -uval : uval; +} + +// cheap strtof. +// does not support nan/infinity or exponent notation. +// does not check for errors. +float parse_float(const char *buf) { + char c; + + // Get a char, skipping leading spaces + do { c = *buf++; } while (c == ' '); + + // check for sign + bool is_negative = (c == '-'); + if (is_negative || c == '+') + c = *buf++; + + // read unsigned value and decimal point + uint32_t uval; + uint8_t exp_dec; + uint8_t uc = c - '0'; + if (uc <= 9) { + uval = uc; + exp_dec = 0; + } + else { + if (c != '.') return 0; + uval = 0; + exp_dec = 1; + } + + int8_t exp = 0; + while (true) { + c = *buf++; + uc = c - '0'; + if (uc <= 9) { + exp -= exp_dec; + uval = mult10(uval) + uc; + if (uval >= (UINT32_MAX - 9) / 10) { + // overflow. keep reading digits until decimal point. + while (exp_dec == 0) { + c = *buf++; + uc = c - '0'; + if (uc > 9) break; + exp++; + } + goto overflow; + } + } + else { + if (c != '.' || exp_dec != 0) break; + exp_dec = 1; + } + } + + // early return for 0 + if (uval == 0) return 0; + + overflow: + + // convert to float and apply sign + float fval = uval; + if (is_negative) fval *= -1; + + // apply exponent (up to 1e-15 / 1e+15) + if (exp < 0) { + if (exp <= -8) { fval *= 1e-8; exp += 8; } + if (exp <= -4) { fval *= 1e-4; exp += 4; } + if (exp <= -2) { fval *= 1e-2; exp += 2; } + if (exp <= -1) { fval *= 1e-1; exp += 1; } + } + else if (exp > 0) { + if (exp >= 8) { fval *= 1e+8; exp -= 8; } + if (exp >= 4) { fval *= 1e+4; exp -= 4; } + if (exp >= 2) { fval *= 1e+2; exp -= 2; } + if (exp >= 1) { fval *= 1e+1; exp -= 1; } + } + + return fval; +} + // Must be declared for allocation and to satisfy the linker // Zero values need no initialization. diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index b21c930cfa..ed503f8a90 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -42,6 +42,10 @@ typedef enum : uint8_t { LINEARUNIT_MM, LINEARUNIT_INCH } LinearUnit; #endif + +int32_t parse_int32(const char *buf); +float parse_float(const char *buf); + /** * GCode parser * @@ -256,29 +260,12 @@ public: // The value as a string static inline char* value_string() { return value_ptr; } - // Float removes 'E' to prevent scientific notation interpretation - static inline float value_float() { - if (value_ptr) { - char *e = value_ptr; - for (;;) { - const char c = *e; - if (c == '\0' || c == ' ') break; - if (c == 'E' || c == 'e') { - *e = '\0'; - const float ret = strtof(value_ptr, nullptr); - *e = c; - return ret; - } - ++e; - } - return strtof(value_ptr, nullptr); - } - return 0; - } + // Code value as float + static inline float value_float() { return value_ptr ? parse_float(value_ptr) : 0.0; } // Code value as a long or ulong - static inline int32_t value_long() { return value_ptr ? strtol(value_ptr, nullptr, 10) : 0L; } - static inline uint32_t value_ulong() { return value_ptr ? strtoul(value_ptr, nullptr, 10) : 0UL; } + static inline int32_t value_long() { return value_ptr ? parse_int32(value_ptr) : 0L; } + static inline uint32_t value_ulong() { return value_ptr ? parse_int32(value_ptr) : 0UL; } // Code value for use as time static inline millis_t value_millis() { return value_ulong(); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index a79909917e..eb7ad79102 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -445,7 +445,7 @@ void GCodeQueue::get_serial_commands() { if (process_line_done(serial.input_state, serial.line_buffer, serial.count)) continue; - char* command = serial.line_buffer; + char *command = serial.line_buffer; while (*command == ' ') command++; // Skip leading spaces char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line @@ -459,7 +459,7 @@ void GCodeQueue::get_serial_commands() { if (n2pos) npos = n2pos; } - const long gcode_N = strtol(npos + 1, nullptr, 10); + const long gcode_N = parse_int32(npos + 1); if (gcode_N != serial.last_N + 1 && !M110) { // In case of error on a serial port, don't prevent other serial port from making progress @@ -471,7 +471,7 @@ void GCodeQueue::get_serial_commands() { if (apos) { uint8_t checksum = 0, count = uint8_t(apos - command); while (count) checksum ^= command[--count]; - if (strtol(apos + 1, nullptr, 10) != checksum) { + if (parse_int32(apos + 1) != checksum) { // In case of error on a serial port, don't prevent other serial port from making progress gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), p); break; @@ -500,7 +500,7 @@ void GCodeQueue::get_serial_commands() { if (IsStopped()) { char* gpos = strchr(command, 'G'); if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { + switch (parse_int32(gpos + 1)) { case 0: case 1: #if ENABLED(ARC_SUPPORT) case 2: case 3: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index a74ecd2f1e..ac07dc0102 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1799,7 +1799,7 @@ void get_wifi_commands() { if (IsStopped()) { char* gpos = strchr(command, 'G'); if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { + switch (parse_int32(gpos + 1)) { case 0 ... 1: #if ENABLED(ARC_SUPPORT) case 2 ... 3: From 5ad7118aeaa9c277df8efc5ad3a8a1d0c8e2b99c Mon Sep 17 00:00:00 2001 From: Marcio T Date: Tue, 30 Mar 2021 20:23:43 -0600 Subject: [PATCH 1229/1370] FTDI Touch UI fix and reorganize (#21487) --- .../{extras => extended}/adjuster_widget.cpp | 49 ++++---- .../{extras => extended}/adjuster_widget.h | 31 ++--- .../extended/circular_progress.cpp | 108 ++++++++++++++++++ .../ftdi_eve_lib/extended/circular_progress.h | 27 +++++ .../ftdi_eve_lib/extended/ftdi_extended.h | 3 + .../{extras => extended}/poly_ui.h | 0 .../ftdi_eve_lib/extras/circular_progress.h | 105 ----------------- .../{extras => scripts}/bitmap2cpp.py | 0 .../{extras => scripts}/svg2cpp.py | 0 .../screens/bed_mesh_screen.cpp | 2 - .../screens/bio_printing_dialog_box.cpp | 2 - .../screens/bio_status_screen.cpp | 2 - .../ftdi_eve_touch_ui/screens/boot_screen.cpp | 1 - .../screens/cocoa_press_load_chocolate.cpp | 2 - .../screens/cocoa_press_preheat_screen.cpp | 2 - .../screens/cocoa_press_status_screen.cpp | 2 - .../lib/ftdi_eve_touch_ui/screens/screens.h | 4 + 17 files changed, 184 insertions(+), 156 deletions(-) rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => extended}/adjuster_widget.cpp (59%) rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => extended}/adjuster_widget.h (74%) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.h rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => extended}/poly_ui.h (100%) delete mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => scripts}/bitmap2cpp.py (100%) rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => scripts}/svg2cpp.py (100%) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp similarity index 59% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp index ef3cb565d2..26be9f4e59 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp @@ -19,10 +19,9 @@ * location: . * ****************************************************************************/ -#include "../ftdi_eve_lib.h" -#include "../extended/grid_layout.h" +#include "ftdi_extended.h" -#include "adjuster_widget.h" +#if ENABLED(FTDI_EXTENDED) #define SUB_COLS 9 #define SUB_ROWS 1 @@ -30,28 +29,32 @@ #define INC_POS SUB_POS(6,1), SUB_SIZE(2,1) #define DEC_POS SUB_POS(8,1), SUB_SIZE(2,1) -void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) { - char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; - if (isnan(value)) - strcpy_P(str, PSTR("-")); - else - dtostrf(value, width, precision, str); +namespace FTDI { + void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) { + char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; + if (isnan(value)) + strcpy_P(str, PSTR("-")); + else + dtostrf(value, width, precision, str); - if (units) { - strcat_P(str, PSTR(" ")); - strcat_P(str, (const char*) units); + if (units) { + strcat_P(str, PSTR(" ")); + strcat_P(str, (const char*) units); + } + + cmd.text(VAL_POS, str); } - cmd.text(VAL_POS, str); -} + void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { + if (what & BACKGROUND) + cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); -void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { - if (what & BACKGROUND) - cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); - - if (what & FOREGROUND) { - draw_adjuster_value(cmd, x, y, w, h, value, units, width, precision); - cmd.tag(tag ).button(INC_POS, F("-")) - .tag(tag+1).button(DEC_POS, F("+")); + if (what & FOREGROUND) { + draw_adjuster_value(cmd, x, y, w, h, value, units, width, precision); + cmd.tag(tag ).button(INC_POS, F("-")) + .tag(tag+1).button(DEC_POS, F("+")); + } } -} +} // namespace FTDI + +#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.h similarity index 74% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.h index 9b5cab0dfb..71f7398694 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.h @@ -20,20 +20,21 @@ ****************************************************************************/ #pragma once -#include "../extended/screen_types.h" -void draw_adjuster_value( - CommandProcessor& cmd, - int16_t x, int16_t y, int16_t w, int16_t h, - float value, progmem_str units = nullptr, - int8_t width = 5, uint8_t precision = 1 -); +namespace FTDI { + void draw_adjuster_value( + CommandProcessor& cmd, + int16_t x, int16_t y, int16_t w, int16_t h, + float value, progmem_str units = nullptr, + int8_t width = 5, uint8_t precision = 1 + ); -void draw_adjuster( - CommandProcessor& cmd, - int16_t x, int16_t y, int16_t w, int16_t h, - uint8_t tag, - float value, progmem_str units = nullptr, - int8_t width = 5, uint8_t precision = 1, - draw_mode_t what = BOTH -); + void draw_adjuster( + CommandProcessor& cmd, + int16_t x, int16_t y, int16_t w, int16_t h, + uint8_t tag, + float value, progmem_str units = nullptr, + int8_t width = 5, uint8_t precision = 1, + draw_mode_t what = BOTH + ); +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp new file mode 100644 index 0000000000..32cc37d2e2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp @@ -0,0 +1,108 @@ +/************************* + * circular_progress.cpp * + *************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "ftdi_extended.h" + +#if ENABLED(FTDI_EXTENDED) + +/* This function draws a circular progress "ring" */ +namespace FTDI { + void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor) { + const float rim = 0.3; + const float a = percent/100.0*2.0*PI; + const float a1 = min(PI/2, a); + const float a2 = min(PI/2, a-a1); + const float a3 = min(PI/2, a-a1-a2); + const float a4 = min(PI/2, a-a1-a2-a3); + + const int ro = min(w,h) * 8; + const int rr = ro * rim; + const int cx = x * 16 + w * 8; + const int cy = y * 16 + h * 8; + + // Load a rim shape into stencil buffer + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(TAG_MASK(0)); + cmd.cmd(CLEAR(0,1,0)); + cmd.cmd(COLOR_MASK(0,0,0,0)); + cmd.cmd(STENCIL_OP(STENCIL_OP_KEEP, STENCIL_OP_INVERT)); + cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); + cmd.cmd(BEGIN(POINTS)); + cmd.cmd(POINT_SIZE(ro)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(POINT_SIZE(ro - rr)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(RESTORE_CONTEXT()); + + // Mask further drawing by stencil buffer + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_NOTEQUAL, 0, 255)); + + // Fill the background + cmd.cmd(COLOR_RGB(bgcolor)); + cmd.cmd(BEGIN(POINTS)); + cmd.cmd(POINT_SIZE(ro)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(COLOR_RGB(fgcolor)); + + // Paint upper-right quadrant + cmd.cmd(BEGIN(EDGE_STRIP_A)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx + ro*sin(a1) + 16,cy - ro*cos(a1) + 8)); + + // Paint lower-right quadrant + if (a > PI/2) { + cmd.cmd(BEGIN(EDGE_STRIP_R)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx + ro*cos(a2),cy + ro*sin(a2) + 16)); + } + + // Paint lower-left quadrant + if (a > PI) { + cmd.cmd(BEGIN(EDGE_STRIP_B)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx - ro*sin(a3) - 8,cy + ro*cos(a3))); + } + + // Paint upper-left quadrant + if (a > 1.5*PI) { + cmd.cmd(BEGIN(EDGE_STRIP_L)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx - ro*cos(a4),cy - ro*sin(a4))); + } + cmd.cmd(RESTORE_CONTEXT()); + + // Draw the text + + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(COLOR_RGB(fgcolor)); + cmd.text(x,y,w,h,text, OPT_CENTERX | OPT_CENTERY); + cmd.cmd(RESTORE_CONTEXT()); + } + + void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, uint32_t bgcolor, uint32_t fgcolor) { + char str[5]; + sprintf(str,"%d\%%",int(percent)); + draw_circular_progress(cmd, x, y, w, h, percent, str, bgcolor, fgcolor); + } +} // namespace FTDI + +#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.h new file mode 100644 index 0000000000..68fc06b4d9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.h @@ -0,0 +1,27 @@ +/*********************** + * circular_progress.h * + ***********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +namespace FTDI { + void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor); + void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, uint32_t bgcolor, uint32_t fgcolor); +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h index fd84c795f1..bf9858f6eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -47,6 +47,9 @@ #include "sound_player.h" #include "sound_list.h" #include "polygon.h" + #include "poly_ui.h" #include "text_box.h" #include "text_ellipsis.h" + #include "adjuster_widget.h" + #include "circular_progress.h" #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/poly_ui.h similarity index 100% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/poly_ui.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h deleted file mode 100644 index 6695134046..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h +++ /dev/null @@ -1,105 +0,0 @@ -/*********************** - * circular_progress.h * - ***********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/* This function draws a circular progress "ring" */ - -void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor) { - using namespace FTDI; - - const float rim = 0.3; - const float a = percent/100.0*2.0*PI; - const float a1 = min(PI/2, a); - const float a2 = min(PI/2, a-a1); - const float a3 = min(PI/2, a-a1-a2); - const float a4 = min(PI/2, a-a1-a2-a3); - - const int ro = min(w,h) * 8; - const int rr = ro * rim; - const int cx = x * 16 + w * 8; - const int cy = y * 16 + h * 8; - - // Load a rim shape into stencil buffer - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(TAG_MASK(0)); - cmd.cmd(CLEAR(0,1,0)); - cmd.cmd(COLOR_MASK(0,0,0,0)); - cmd.cmd(STENCIL_OP(STENCIL_OP_KEEP, STENCIL_OP_INVERT)); - cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); - cmd.cmd(BEGIN(POINTS)); - cmd.cmd(POINT_SIZE(ro)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(POINT_SIZE(ro - rr)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(RESTORE_CONTEXT()); - - // Mask further drawing by stencil buffer - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_NOTEQUAL, 0, 255)); - - // Fill the background - cmd.cmd(COLOR_RGB(bgcolor)); - cmd.cmd(BEGIN(POINTS)); - cmd.cmd(POINT_SIZE(ro)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(COLOR_RGB(fgcolor)); - - // Paint upper-right quadrant - cmd.cmd(BEGIN(EDGE_STRIP_A)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx + ro*sin(a1) + 16,cy - ro*cos(a1) + 8)); - - // Paint lower-right quadrant - if (a > PI/2) { - cmd.cmd(BEGIN(EDGE_STRIP_R)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx + ro*cos(a2),cy + ro*sin(a2) + 16)); - } - - // Paint lower-left quadrant - if (a > PI) { - cmd.cmd(BEGIN(EDGE_STRIP_B)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx - ro*sin(a3) - 8,cy + ro*cos(a3))); - } - - // Paint upper-left quadrant - if (a > 1.5*PI) { - cmd.cmd(BEGIN(EDGE_STRIP_L)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx - ro*cos(a4),cy - ro*sin(a4))); - } - cmd.cmd(RESTORE_CONTEXT()); - - // Draw the text - - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(COLOR_RGB(fgcolor)); - cmd.text(x,y,w,h,text, OPT_CENTERX | OPT_CENTERY); - cmd.cmd(RESTORE_CONTEXT()); -} - -void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, uint32_t bgcolor, uint32_t fgcolor) { - char str[5]; - sprintf(str,"%d\%%",int(percent)); - draw_circular_progress(cmd, x, y, w, h, percent, str, bgcolor, fgcolor); -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/bitmap2cpp.py similarity index 100% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/bitmap2cpp.py diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py similarity index 100% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 053f4ebd72..f8b4b5b5d1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -25,8 +25,6 @@ #ifdef FTDI_BED_MESH_SCREEN -#include "../ftdi_eve_lib/extras/adjuster_widget.h" - using namespace FTDI; using namespace Theme; using namespace ExtUI; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index a812f0f3d0..10ed6eb14a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -25,8 +25,6 @@ #ifdef FTDI_BIO_PRINTING_DIALOG_BOX -#include "../ftdi_eve_lib/extras/circular_progress.h" - using namespace FTDI; using namespace ExtUI; using namespace Theme; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index f2bb5f3d3c..c66e4d94d8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -26,8 +26,6 @@ #ifdef FTDI_BIO_STATUS_SCREEN -#include "../ftdi_eve_lib/extras/poly_ui.h" - #if ENABLED(TOUCH_UI_PORTRAIT) #include "bio_printer_ui_portrait.h" #else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp index 236830dbc4..c8c7cdb5a5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -26,7 +26,6 @@ #ifdef FTDI_BOOT_SCREEN -#include "../ftdi_eve_lib/extras/poly_ui.h" #include "../archim2-flash/flash_storage.h" #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp index d9c01366b9..ac49df0916 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp @@ -27,8 +27,6 @@ #ifdef FTDI_COCOA_LOAD_CHOCOLATE_SCREEN -#include "../ftdi_eve_lib/extras/poly_ui.h" - #include "cocoa_press_ui.h" #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp index 66256ab46f..a8a172b3da 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp @@ -25,8 +25,6 @@ #ifdef FTDI_COCOA_PREHEAT_SCREEN -#include "../ftdi_eve_lib/extras/circular_progress.h" - using namespace FTDI; using namespace ExtUI; using namespace Theme; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp index 5a0fe485f8..a0c8914589 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -26,8 +26,6 @@ #ifdef FTDI_COCOA_STATUS_SCREEN -#include "../ftdi_eve_lib/extras/poly_ui.h" - #include "cocoa_press_ui.h" #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 3e69a3ad2f..7aca5800e1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -22,6 +22,8 @@ #pragma once +#if ENABLED(TOUCH_UI_FTDI_EVE) + #include "../ftdi_eve_lib/ftdi_eve_lib.h" #include "../language/language.h" #include "../theme/theme.h" @@ -260,3 +262,5 @@ enum { #if NUM_LANGUAGES > 1 #include "language_menu.h" #endif + +#endif // TOUCH_UI_FTDI_EVE From a572e2ed123d3ee23c1964c9e933c11ea55a0a50 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 30 Mar 2021 21:54:34 -0500 Subject: [PATCH 1230/1370] Put ABL state into a class --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 424 +++++++++++++------------- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- buildroot/tests/rambo | 2 +- 4 files changed, 216 insertions(+), 214 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index a746b86108..f3cfe02e40 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -68,22 +68,77 @@ #include "../../../module/tool_change.h" #endif -#if ABL_GRID +#if ABL_USES_GRID #if ENABLED(PROBE_Y_FIRST) - #define PR_OUTER_VAR meshCount.x - #define PR_OUTER_END abl_grid_points.x - #define PR_INNER_VAR meshCount.y - #define PR_INNER_END abl_grid_points.y + #define PR_OUTER_VAR abl.meshCount.x + #define PR_OUTER_SIZE abl.grid_points.x + #define PR_INNER_VAR abl.meshCount.y + #define PR_INNER_SIZE abl.grid_points.y #else - #define PR_OUTER_VAR meshCount.y - #define PR_OUTER_END abl_grid_points.y - #define PR_INNER_VAR meshCount.x - #define PR_INNER_END abl_grid_points.x + #define PR_OUTER_VAR abl.meshCount.y + #define PR_OUTER_SIZE abl.grid_points.y + #define PR_INNER_VAR abl.meshCount.x + #define PR_INNER_SIZE abl.grid_points.x #endif #endif #define G29_RETURN(b) return TERN_(G29_RETRY_AND_RECOVER, b) +// For manual probing values persist over multiple G29 +class G29_State { +public: + int verbose_level; + xy_pos_t probePos; + float measured_z; + bool dryrun, + reenable; + + #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) + int abl_probe_index; + #endif + + #if ABL_USES_GRID + + xy_int8_t meshCount; + + xy_pos_t probe_position_lf, + probe_position_rb; + + xy_float_t gridSpacing; // = { 0.0f, 0.0f } + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + bool topography_map; + xy_uint8_t grid_points; + #else // Bilinear + static constexpr xy_uint8_t grid_points = { GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y }; + #endif + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + int abl_points; + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + static constexpr int abl_points = 3; + #else + static constexpr int abl_points = GRID_MAX_POINTS; + #endif + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + float Z_offset; + #endif + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + int indexIntoAB[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + float eqnAMatrix[(GRID_MAX_POINTS) * 3], // "A" matrix of the linear system of equations + eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points + mean; + #endif + #endif +}; + +#if ABL_USES_GRID && EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_BILINEAR) + constexpr xy_uint8_t G29_State::grid_points; + constexpr int G29_State::abl_points; +#endif + /** * G29: Detailed Z probe, probes the bed at 3 or more points. * Will fail if the printer has not been homed with G28. @@ -163,6 +218,8 @@ */ G29_TYPE GcodeSuite::G29() { + TERN_(PROBE_MANUALLY, static) G29_State abl; + reset_stepper_timeout(); const bool seenQ = EITHER(DEBUG_LEVELING_FEATURE, PROBE_MANUALLY) && parser.seen('Q'); @@ -193,63 +250,10 @@ G29_TYPE GcodeSuite::G29() { // Don't allow auto-leveling without homing first if (homing_needed_error()) G29_RETURN(false); - // Define local vars 'static' for manual probing, 'auto' otherwise - #define ABL_VAR TERN_(PROBE_MANUALLY, static) - - ABL_VAR int verbose_level; - ABL_VAR xy_pos_t probePos; - ABL_VAR float measured_z; - ABL_VAR bool dryrun, abl_should_enable; - - #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) - ABL_VAR int abl_probe_index; - #endif - - #if ABL_GRID - - #if ENABLED(PROBE_MANUALLY) - ABL_VAR xy_int8_t meshCount; - #endif - - ABL_VAR xy_pos_t probe_position_lf, probe_position_rb; - ABL_VAR xy_float_t gridSpacing = { 0, 0 }; - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR bool do_topography_map; - ABL_VAR xy_uint8_t abl_grid_points; - #else // Bilinear - constexpr xy_uint8_t abl_grid_points = { GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y }; - #endif - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR int abl_points; - #else - int constexpr abl_points = GRID_MAX_POINTS; - #endif - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - - ABL_VAR float zoffset; - - #elif ENABLED(AUTO_BED_LEVELING_LINEAR) - - ABL_VAR int indexIntoAB[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - - ABL_VAR float eqnAMatrix[(GRID_MAX_POINTS) * 3], // "A" matrix of the linear system of equations - eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points - mean; - #endif - - #elif ENABLED(AUTO_BED_LEVELING_3POINT) - - #if ENABLED(PROBE_MANUALLY) - int constexpr abl_points = 3; // used to show total points - #endif - + #if ENABLED(AUTO_BED_LEVELING_3POINT) vector_3 points[3]; probe.get_three_points(points); - - #endif // AUTO_BED_LEVELING_3POINT + #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) struct linear_fit_data lsf_results; @@ -263,10 +267,10 @@ G29_TYPE GcodeSuite::G29() { TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) - abl_probe_index = -1; + abl.abl_probe_index = -1; #endif - abl_should_enable = planner.leveling_active; + abl.reenable = planner.leveling_active; #if ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -289,8 +293,8 @@ G29_TYPE GcodeSuite::G29() { if (!isnan(rx) && !isnan(ry)) { // Get nearest i / j from rx / ry - i = (rx - bilinear_start.x + 0.5 * gridSpacing.x) / gridSpacing.x; - j = (ry - bilinear_start.y + 0.5 * gridSpacing.y) / gridSpacing.y; + i = (rx - bilinear_start.x + 0.5 * abl.gridSpacing.x) / abl.gridSpacing.x; + j = (ry - bilinear_start.y + 0.5 * abl.gridSpacing.y) / abl.gridSpacing.y; LIMIT(i, 0, GRID_MAX_POINTS_X - 1); LIMIT(j, 0, GRID_MAX_POINTS_Y - 1); } @@ -299,8 +303,8 @@ G29_TYPE GcodeSuite::G29() { z_values[i][j] = rz; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, rz)); - set_bed_leveling_enabled(abl_should_enable); - if (abl_should_enable) report_current_position(); + set_bed_leveling_enabled(abl.reenable); + if (abl.reenable) report_current_position(); } G29_RETURN(false); } // parser.seen('W') @@ -317,47 +321,47 @@ G29_TYPE GcodeSuite::G29() { G29_RETURN(false); } - verbose_level = parser.intval('V'); - if (!WITHIN(verbose_level, 0, 4)) { + abl.verbose_level = parser.intval('V'); + if (!WITHIN(abl.verbose_level, 0, 4)) { SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4)."); G29_RETURN(false); } - dryrun = parser.boolval('D') || TERN0(PROBE_MANUALLY, no_action); + abl.dryrun = parser.boolval('D') || TERN0(PROBE_MANUALLY, no_action); #if ENABLED(AUTO_BED_LEVELING_LINEAR) incremental_LSF_reset(&lsf_results); - do_topography_map = verbose_level > 2 || parser.boolval('T'); + abl.topography_map = abl.verbose_level > 2 || parser.boolval('T'); // X and Y specify points in each direction, overriding the default // These values may be saved with the completed mesh - abl_grid_points.set( + abl.grid_points.set( parser.byteval('X', GRID_MAX_POINTS_X), parser.byteval('Y', GRID_MAX_POINTS_Y) ); - if (parser.seenval('P')) abl_grid_points.x = abl_grid_points.y = parser.value_int(); + if (parser.seenval('P')) abl.grid_points.x = abl.grid_points.y = parser.value_int(); - if (!WITHIN(abl_grid_points.x, 2, GRID_MAX_POINTS_X)) { + if (!WITHIN(abl.grid_points.x, 2, GRID_MAX_POINTS_X)) { SERIAL_ECHOLNPGM("?Probe points (X) implausible (2-" STRINGIFY(GRID_MAX_POINTS_X) ")."); G29_RETURN(false); } - if (!WITHIN(abl_grid_points.y, 2, GRID_MAX_POINTS_Y)) { + if (!WITHIN(abl.grid_points.y, 2, GRID_MAX_POINTS_Y)) { SERIAL_ECHOLNPGM("?Probe points (Y) implausible (2-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); G29_RETURN(false); } - abl_points = abl_grid_points.x * abl_grid_points.y; - mean = 0; + abl.abl_points = abl.grid_points.x * abl.grid_points.y; + abl.mean = 0; #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - zoffset = parser.linearval('Z'); + abl.Z_offset = parser.linearval('Z'); #endif - #if ABL_GRID + #if ABL_USES_GRID xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_FEEDRATE)); @@ -366,32 +370,32 @@ G29_TYPE GcodeSuite::G29() { if (parser.seen('H')) { const int16_t size = (int16_t)parser.value_linear_units(); - probe_position_lf.set(_MAX((X_CENTER) - size / 2, x_min), _MAX((Y_CENTER) - size / 2, y_min)); - probe_position_rb.set(_MIN(probe_position_lf.x + size, x_max), _MIN(probe_position_lf.y + size, y_max)); + abl.probe_position_lf.set(_MAX((X_CENTER) - size / 2, x_min), _MAX((Y_CENTER) - size / 2, y_min)); + abl.probe_position_rb.set(_MIN(abl.probe_position_lf.x + size, x_max), _MIN(abl.probe_position_lf.y + size, y_max)); } else { - probe_position_lf.set(parser.linearval('L', x_min), parser.linearval('F', y_min)); - probe_position_rb.set(parser.linearval('R', x_max), parser.linearval('B', y_max)); + abl.probe_position_lf.set(parser.linearval('L', x_min), parser.linearval('F', y_min)); + abl.probe_position_rb.set(parser.linearval('R', x_max), parser.linearval('B', y_max)); } - if (!probe.good_bounds(probe_position_lf, probe_position_rb)) { + if (!probe.good_bounds(abl.probe_position_lf, abl.probe_position_rb)) { if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR("G29 L", probe_position_lf.x, " R", probe_position_rb.x, - " F", probe_position_lf.y, " B", probe_position_rb.y); + DEBUG_ECHOLNPAIR("G29 L", abl.probe_position_lf.x, " R", abl.probe_position_rb.x, + " F", abl.probe_position_lf.y, " B", abl.probe_position_rb.y); } SERIAL_ECHOLNPGM("? (L,R,F,B) out of bounds."); G29_RETURN(false); } // Probe at the points of a lattice grid - gridSpacing.set((probe_position_rb.x - probe_position_lf.x) / (abl_grid_points.x - 1), - (probe_position_rb.y - probe_position_lf.y) / (abl_grid_points.y - 1)); + abl.gridSpacing.set((abl.probe_position_rb.x - abl.probe_position_lf.x) / (abl.grid_points.x - 1), + (abl.probe_position_rb.y - abl.probe_position_lf.y) / (abl.grid_points.y - 1)); - #endif // ABL_GRID + #endif // ABL_USES_GRID - if (verbose_level > 0) { + if (abl.verbose_level > 0) { SERIAL_ECHOPGM("G29 Auto Bed Leveling"); - if (dryrun) SERIAL_ECHOPGM(" (DRYRUN)"); + if (abl.dryrun) SERIAL_ECHOPGM(" (DRYRUN)"); SERIAL_EOL(); } @@ -410,7 +414,7 @@ G29_TYPE GcodeSuite::G29() { remember_feedrate_scaling_off(); #if ENABLED(PREHEAT_BEFORE_LEVELING) - if (!dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, LEVELING_BED_TEMP); + if (!abl.dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, LEVELING_BED_TEMP); #endif } @@ -423,24 +427,24 @@ G29_TYPE GcodeSuite::G29() { if (ENABLED(BLTOUCH)) do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); else if (probe.deploy()) { - set_bed_leveling_enabled(abl_should_enable); + set_bed_leveling_enabled(abl.reenable); G29_RETURN(false); } #endif #if ENABLED(AUTO_BED_LEVELING_BILINEAR) if (TERN1(PROBE_MANUALLY, !no_action) - && (gridSpacing != bilinear_grid_spacing || probe_position_lf != bilinear_start) + && (abl.gridSpacing != bilinear_grid_spacing || abl.probe_position_lf != bilinear_start) ) { // Reset grid to 0.0 or "not probed". (Also disables ABL) reset_bed_level(); // Initialize a grid with the given dimensions - bilinear_grid_spacing = gridSpacing; - bilinear_start = probe_position_lf; + bilinear_grid_spacing = abl.gridSpacing; + bilinear_start = abl.probe_position_lf; // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; + abl.reenable = false; } #endif // AUTO_BED_LEVELING_BILINEAR @@ -451,7 +455,7 @@ G29_TYPE GcodeSuite::G29() { // For manual probing, get the next index to probe now. // On the first probe this will be incremented to 0. if (!no_action) { - ++abl_probe_index; + ++abl.abl_probe_index; g29_in_progress = true; } @@ -459,17 +463,17 @@ G29_TYPE GcodeSuite::G29() { if (seenA && g29_in_progress) { SERIAL_ECHOLNPGM("Manual G29 aborted"); SET_SOFT_ENDSTOP_LOOSE(false); - set_bed_leveling_enabled(abl_should_enable); + set_bed_leveling_enabled(abl.reenable); g29_in_progress = false; TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); } // Query G29 status - if (verbose_level || seenQ) { + if (abl.verbose_level || seenQ) { SERIAL_ECHOPGM("Manual G29 "); if (g29_in_progress) { - SERIAL_ECHOPAIR("point ", _MIN(abl_probe_index + 1, abl_points)); - SERIAL_ECHOLNPAIR(" of ", abl_points); + SERIAL_ECHOPAIR("point ", _MIN(abl.abl_probe_index + 1, abl.abl_points)); + SERIAL_ECHOLNPAIR(" of ", abl.abl_points); } else SERIAL_ECHOLNPGM("idle"); @@ -477,7 +481,7 @@ G29_TYPE GcodeSuite::G29() { if (no_action) G29_RETURN(false); - if (abl_probe_index == 0) { + if (abl.abl_probe_index == 0) { // For the initial G29 S2 save software endstop state SET_SOFT_ENDSTOP_LOOSE(true); // Move close to the bed before the first point @@ -486,34 +490,34 @@ G29_TYPE GcodeSuite::G29() { else { #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) - const uint16_t index = abl_probe_index - 1; + const uint16_t index = abl.abl_probe_index - 1; #endif // For G29 after adjusting Z. // Save the previous Z before going to the next point - measured_z = current_position.z; + abl.measured_z = current_position.z; #if ENABLED(AUTO_BED_LEVELING_LINEAR) - mean += measured_z; - eqnBVector[index] = measured_z; - eqnAMatrix[index + 0 * abl_points] = probePos.x; - eqnAMatrix[index + 1 * abl_points] = probePos.y; - eqnAMatrix[index + 2 * abl_points] = 1; + abl.mean += abl.measured_z; + abl.eqnBVector[index] = abl.measured_z; + abl.eqnAMatrix[index + 0 * abl.abl_points] = abl.probePos.x; + abl.eqnAMatrix[index + 1 * abl.abl_points] = abl.probePos.y; + abl.eqnAMatrix[index + 2 * abl.abl_points] = 1; - incremental_LSF(&lsf_results, probePos, measured_z); + incremental_LSF(&lsf_results, abl.probePos, abl.measured_z); #elif ENABLED(AUTO_BED_LEVELING_3POINT) - points[index].z = measured_z; + points[index].z = abl.measured_z; #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - const float newz = measured_z + zoffset; - z_values[meshCount.x][meshCount.y] = newz; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, newz)); + const float newz = abl.measured_z + abl.Z_offset; + z_values[abl.meshCount.x][abl.meshCount.y] = newz; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(abl.meshCount, newz)); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_P(PSTR("Save X"), meshCount.x, SP_Y_STR, meshCount.y, SP_Z_STR, measured_z + zoffset); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_P(PSTR("Save X"), abl.meshCount.x, SP_Y_STR, abl.meshCount.y, SP_Z_STR, abl.measured_z + abl.Z_offset); #endif } @@ -522,31 +526,31 @@ G29_TYPE GcodeSuite::G29() { // If there's another point to sample, move there with optional lift. // - #if ABL_GRID + #if ABL_USES_GRID // Skip any unreachable points - while (abl_probe_index < abl_points) { + while (abl.abl_probe_index < abl.abl_points) { - // Set meshCount.x, meshCount.y based on abl_probe_index, with zig-zag - PR_OUTER_VAR = abl_probe_index / PR_INNER_END; - PR_INNER_VAR = abl_probe_index - (PR_OUTER_VAR * PR_INNER_END); + // Set abl.meshCount.x, abl.meshCount.y based on abl.abl_probe_index, with zig-zag + PR_OUTER_VAR = abl.abl_probe_index / PR_INNER_SIZE; + PR_INNER_VAR = abl.abl_probe_index - (PR_OUTER_VAR * PR_INNER_SIZE); // Probe in reverse order for every other row/column - const bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_END) & 1); - if (zig) PR_INNER_VAR = (PR_INNER_END - 1) - PR_INNER_VAR; + const bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_SIZE) & 1); + if (zig) PR_INNER_VAR = (PR_INNER_SIZE - 1) - PR_INNER_VAR; - probePos = probe_position_lf + gridSpacing * meshCount.asFloat(); + abl.probePos = abl.probe_position_lf + abl.gridSpacing * abl.meshCount.asFloat(); - TERN_(AUTO_BED_LEVELING_LINEAR, indexIntoAB[meshCount.x][meshCount.y] = abl_probe_index); + TERN_(AUTO_BED_LEVELING_LINEAR, abl.indexIntoAB[abl.meshCount.x][abl.meshCount.y] = abl.abl_probe_index); // Keep looping till a reachable point is found - if (position_is_reachable(probePos)) break; - ++abl_probe_index; + if (position_is_reachable(abl.probePos)) break; + ++abl.abl_probe_index; } // Is there a next point to move to? - if (abl_probe_index < abl_points) { - _manual_goto_xy(probePos); // Can be used here too! + if (abl.abl_probe_index < abl.abl_points) { + _manual_goto_xy(abl.probePos); // Can be used here too! // Disable software endstops to allow manual adjustment // If G29 is not completed, they will not be re-enabled SET_SOFT_ENDSTOP_LOOSE(true); @@ -562,9 +566,9 @@ G29_TYPE GcodeSuite::G29() { #elif ENABLED(AUTO_BED_LEVELING_3POINT) // Probe at 3 arbitrary points - if (abl_probe_index < abl_points) { - probePos = points[abl_probe_index]; - _manual_goto_xy(probePos); + if (abl.abl_probe_index < abl.abl_points) { + abl.probePos = points[abl.abl_probe_index]; + _manual_goto_xy(abl.probePos); // Disable software endstops to allow manual adjustment // If G29 is not completed, they will not be re-enabled SET_SOFT_ENDSTOP_LOOSE(true); @@ -577,13 +581,13 @@ G29_TYPE GcodeSuite::G29() { // Re-enable software endstops, if needed SET_SOFT_ENDSTOP_LOOSE(false); - if (!dryrun) { + if (!abl.dryrun) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); if (planeNormal.z < 0) planeNormal *= -1; planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; + abl.reenable = false; } } @@ -594,84 +598,82 @@ G29_TYPE GcodeSuite::G29() { { const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - measured_z = 0; + abl.measured_z = 0; - #if ABL_GRID + #if ABL_USES_GRID - bool zig = PR_OUTER_END & 1; // Always end at RIGHT and BACK_PROBE_BED_POSITION + bool zig = PR_OUTER_SIZE & 1; // Always end at RIGHT and BACK_PROBE_BED_POSITION - measured_z = 0; - - xy_int8_t meshCount; + abl.measured_z = 0; // Outer loop is X with PROBE_Y_FIRST enabled // Outer loop is Y with PROBE_Y_FIRST disabled - for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { + for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_SIZE && !isnan(abl.measured_z); PR_OUTER_VAR++) { int8_t inStart, inStop, inInc; - if (zig) { // Zig away from origin - inStart = 0; // Left or front - inStop = PR_INNER_END; // Right or back - inInc = 1; // Zig right + if (zig) { // Zig away from origin + inStart = 0; // Left or front + inStop = PR_INNER_SIZE; // Right or back + inInc = 1; // Zig right } - else { // Zag towards origin - inStart = PR_INNER_END - 1; // Right or back - inStop = -1; // Left or front - inInc = -1; // Zag left + else { // Zag towards origin + inStart = PR_INNER_SIZE - 1; // Right or back + inStop = -1; // Left or front + inInc = -1; // Zag left } zig ^= true; // zag // An index to print current state - uint8_t pt_index = (PR_OUTER_VAR) * (PR_INNER_END) + 1; + uint8_t pt_index = (PR_OUTER_VAR) * (PR_INNER_SIZE) + 1; // Inner loop is Y with PROBE_Y_FIRST enabled // Inner loop is X with PROBE_Y_FIRST disabled for (PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; pt_index++, PR_INNER_VAR += inInc) { - probePos = probe_position_lf + gridSpacing * meshCount.asFloat(); + abl.probePos = abl.probe_position_lf + abl.gridSpacing * abl.meshCount.asFloat(); - TERN_(AUTO_BED_LEVELING_LINEAR, indexIntoAB[meshCount.x][meshCount.y] = ++abl_probe_index); // 0... + TERN_(AUTO_BED_LEVELING_LINEAR, abl.indexIntoAB[abl.meshCount.x][abl.meshCount.y] = ++abl.abl_probe_index); // 0... // Avoid probing outside the round or hexagonal area - if (TERN0(IS_KINEMATIC, !probe.can_reach(probePos))) continue; + if (TERN0(IS_KINEMATIC, !probe.can_reach(abl.probePos))) continue; - if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", pt_index, "/", abl_points, "."); - TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); + if (abl.verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", pt_index, "/", abl.abl_points, "."); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl.abl_points))); - measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); + abl.measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); - if (isnan(measured_z)) { - set_bed_leveling_enabled(abl_should_enable); + if (isnan(abl.measured_z)) { + set_bed_leveling_enabled(abl.reenable); break; // Breaks out of both loops } #if ENABLED(PROBE_TEMP_COMPENSATION) - temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), measured_z); - temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), measured_z); - TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(), measured_z)); + temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), abl.measured_z); + temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), abl.measured_z); + TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(), abl.measured_z)); #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) - mean += measured_z; - eqnBVector[abl_probe_index] = measured_z; - eqnAMatrix[abl_probe_index + 0 * abl_points] = probePos.x; - eqnAMatrix[abl_probe_index + 1 * abl_points] = probePos.y; - eqnAMatrix[abl_probe_index + 2 * abl_points] = 1; + abl.mean += abl.measured_z; + abl.eqnBVector[abl.abl_probe_index] = abl.measured_z; + abl.eqnAMatrix[abl.abl_probe_index + 0 * abl.abl_points] = abl.probePos.x; + abl.eqnAMatrix[abl.abl_probe_index + 1 * abl.abl_points] = abl.probePos.y; + abl.eqnAMatrix[abl.abl_probe_index + 2 * abl.abl_points] = 1; - incremental_LSF(&lsf_results, probePos, measured_z); + incremental_LSF(&lsf_results, abl.probePos, abl.measured_z); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - const float z = measured_z + zoffset; - z_values[meshCount.x][meshCount.y] = z; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, z)); + const float z = abl.measured_z + abl.Z_offset; + z_values[abl.meshCount.x][abl.meshCount.y] = z; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(abl.meshCount, z)); #endif - abl_should_enable = false; + abl.reenable = false; idle_no_sleep(); } // inner @@ -682,26 +684,26 @@ G29_TYPE GcodeSuite::G29() { // Probe at 3 arbitrary points LOOP_L_N(i, 3) { - if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", i + 1, "/3."); + if (abl.verbose_level) SERIAL_ECHOLNPAIR("Probing point ", i + 1, "/3."); TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); // Retain the last probe position - probePos = points[i]; - measured_z = faux ? 0.001 * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); - if (isnan(measured_z)) { - set_bed_leveling_enabled(abl_should_enable); + abl.probePos = points[i]; + abl.measured_z = faux ? 0.001 * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); + if (isnan(abl.measured_z)) { + set_bed_leveling_enabled(abl.reenable); break; } - points[i].z = measured_z; + points[i].z = abl.measured_z; } - if (!dryrun && !isnan(measured_z)) { + if (!abl.dryrun && !isnan(abl.measured_z)) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); if (planeNormal.z < 0) planeNormal *= -1; planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; + abl.reenable = false; } #endif // AUTO_BED_LEVELING_3POINT @@ -710,8 +712,8 @@ G29_TYPE GcodeSuite::G29() { // Stow the probe. No raise for FIX_MOUNTED_PROBE. if (probe.stow()) { - set_bed_leveling_enabled(abl_should_enable); - measured_z = NAN; + set_bed_leveling_enabled(abl.reenable); + abl.measured_z = NAN; } } #endif // !PROBE_MANUALLY @@ -734,10 +736,10 @@ G29_TYPE GcodeSuite::G29() { #endif // Calculate leveling, print reports, correct the position - if (!isnan(measured_z)) { + if (!isnan(abl.measured_z)) { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (!dryrun) extrapolate_unprobed_bed_level(); + if (!abl.dryrun) extrapolate_unprobed_bed_level(); print_bilinear_leveling_grid(); refresh_bed_level(); @@ -763,39 +765,39 @@ G29_TYPE GcodeSuite::G29() { plane_equation_coefficients.b = -lsf_results.B; // but that is not yet tested. plane_equation_coefficients.d = -lsf_results.D; - mean /= abl_points; + abl.mean /= abl.abl_points; - if (verbose_level) { + if (abl.verbose_level) { SERIAL_ECHOPAIR_F("Eqn coefficients: a: ", plane_equation_coefficients.a, 8); SERIAL_ECHOPAIR_F(" b: ", plane_equation_coefficients.b, 8); SERIAL_ECHOPAIR_F(" d: ", plane_equation_coefficients.d, 8); - if (verbose_level > 2) - SERIAL_ECHOPAIR_F("\nMean of sampled points: ", mean, 8); + if (abl.verbose_level > 2) + SERIAL_ECHOPAIR_F("\nMean of sampled points: ", abl.mean, 8); SERIAL_EOL(); } // Create the matrix but don't correct the position yet - if (!dryrun) + if (!abl.dryrun) planner.bed_level_matrix = matrix_3x3::create_look_at( vector_3(-plane_equation_coefficients.a, -plane_equation_coefficients.b, 1) // We can eliminate the '-' here and up above ); // Show the Topography map if enabled - if (do_topography_map) { + if (abl.topography_map) { float min_diff = 999; auto print_topo_map = [&](PGM_P const title, const bool get_min) { SERIAL_ECHOPGM_P(title); - for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) { - LOOP_L_N(xx, abl_grid_points.x) { - const int ind = indexIntoAB[xx][yy]; - xyz_float_t tmp = { eqnAMatrix[ind + 0 * abl_points], - eqnAMatrix[ind + 1 * abl_points], 0 }; + for (int8_t yy = abl.grid_points.y - 1; yy >= 0; yy--) { + LOOP_L_N(xx, abl.grid_points.x) { + const int ind = abl.indexIntoAB[xx][yy]; + xyz_float_t tmp = { abl.eqnAMatrix[ind + 0 * abl.abl_points], + abl.eqnAMatrix[ind + 1 * abl.abl_points], 0 }; apply_rotation_xyz(planner.bed_level_matrix, tmp); - if (get_min) NOMORE(min_diff, eqnBVector[ind] - tmp.z); - const float subval = get_min ? mean : tmp.z + min_diff, - diff = eqnBVector[ind] - subval; + if (get_min) NOMORE(min_diff, abl.eqnBVector[ind] - tmp.z); + const float subval = get_min ? abl.mean : tmp.z + min_diff, + diff = abl.eqnBVector[ind] - subval; SERIAL_CHAR(' '); if (diff >= 0.0) SERIAL_CHAR('+'); // Include + for column alignment SERIAL_ECHO_F(diff, 5); } // xx @@ -815,10 +817,10 @@ G29_TYPE GcodeSuite::G29() { " | |\n" " O-- FRONT --+\n" " (0,0)\n"), true); - if (verbose_level > 3) + if (abl.verbose_level > 3) print_topo_map(PSTR("\nCorrected Bed Height vs. Bed Topology:\n"), false); - } //do_topography_map + } // abl.topography_map #endif // AUTO_BED_LEVELING_LINEAR @@ -826,10 +828,10 @@ G29_TYPE GcodeSuite::G29() { // For LINEAR and 3POINT leveling correct the current position - if (verbose_level > 0) + if (abl.verbose_level > 0) planner.bed_level_matrix.debug(PSTR("\n\nBed Level Correction Matrix:")); - if (!dryrun) { + if (!abl.dryrun) { // // Correct the current XYZ position based on the tilted plane. // @@ -840,10 +842,10 @@ G29_TYPE GcodeSuite::G29() { planner.force_unapply_leveling(converted); // use conversion machinery // Use the last measured distance to the bed, if possible - if ( NEAR(current_position.x, probePos.x - probe.offset_xy.x) - && NEAR(current_position.y, probePos.y - probe.offset_xy.y) + if ( NEAR(current_position.x, abl.probePos.x - probe.offset_xy.x) + && NEAR(current_position.y, abl.probePos.y - probe.offset_xy.y) ) { - const float simple_z = current_position.z - measured_z; + const float simple_z = current_position.z - abl.measured_z; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probed Z", simple_z, " Matrix Z", converted.z, " Discrepancy ", simple_z - converted.z); converted.z = simple_z; } @@ -856,7 +858,7 @@ G29_TYPE GcodeSuite::G29() { #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (!dryrun) { + if (!abl.dryrun) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("G29 uncorrected Z:", current_position.z); // Unapply the offset because it is going to be immediately applied @@ -870,8 +872,8 @@ G29_TYPE GcodeSuite::G29() { #endif // ABL_PLANAR // Auto Bed Leveling is complete! Enable if possible. - planner.leveling_active = dryrun ? abl_should_enable : true; - } // !isnan(measured_z) + planner.leveling_active = !abl.dryrun || abl.reenable; + } // !isnan(abl.measured_z) // Restore state after probing if (!faux) restore_feedrate_and_scaling(); @@ -895,7 +897,7 @@ G29_TYPE GcodeSuite::G29() { report_current_position(); - G29_RETURN(isnan(measured_z)); + G29_RETURN(isnan(abl.measured_z)); } #endif // HAS_ABL_NOT_UBL diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index a0fced150f..88bd382020 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -842,7 +842,7 @@ #define ABL_PLANAR 1 #endif #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) - #define ABL_GRID 1 + #define ABL_USES_GRID 1 #endif #if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_3POINT) #define HAS_ABL_NOT_UBL 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 287f0c5600..647e0d55dd 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1262,7 +1262,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "DELTA_AUTO_CALIBRATION requires a probe or LCD Controller." #elif ENABLED(DELTA_CALIBRATION_MENU) && !HAS_LCD_MENU #error "DELTA_CALIBRATION_MENU requires an LCD Controller." - #elif ABL_GRID + #elif ABL_USES_GRID #if (GRID_MAX_POINTS_X & 1) == 0 || (GRID_MAX_POINTS_Y & 1) == 0 #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be odd numbers." #elif GRID_MAX_POINTS_X < 3 diff --git a/buildroot/tests/rambo b/buildroot/tests/rambo index 5da4eed9b4..95260e58b4 100755 --- a/buildroot/tests/rambo +++ b/buildroot/tests/rambo @@ -88,7 +88,7 @@ opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CO PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL opt_add M100_FREE_MEMORY_DUMPER opt_add M100_FREE_MEMORY_CORRUPTOR -exec_test $1 $2 "MINIRAMBO | RRDGFSC | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." "$3" +exec_test $1 $2 "MINIRAMBO | RRDGFSC | ABL Bilinear Manual | M100 | PWM_MOTOR_CURRENT | M600..." "$3" # # Test many less common options From 259115bb3f75fb6cf99e19fce230a327d8afd094 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 30 Mar 2021 23:16:29 -0500 Subject: [PATCH 1231/1370] Move apply_rotation_xyz into matrix_3x3 --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/libs/vector_3.cpp | 4 ++-- Marlin/src/libs/vector_3.h | 10 ++++------ Marlin/src/module/planner.cpp | 4 ++-- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 2003e9b6f5..c11962bf9d 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -1592,7 +1592,7 @@ void unified_bed_leveling::smart_fill_mesh() { DEBUG_DELAY(20); } - apply_rotation_xyz(rotation, mx, my, mz); + rotation.apply_rotation_xyz(mx, my, mz); if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index f3cfe02e40..42d3a75da1 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -794,7 +794,7 @@ G29_TYPE GcodeSuite::G29() { const int ind = abl.indexIntoAB[xx][yy]; xyz_float_t tmp = { abl.eqnAMatrix[ind + 0 * abl.abl_points], abl.eqnAMatrix[ind + 1 * abl.abl_points], 0 }; - apply_rotation_xyz(planner.bed_level_matrix, tmp); + planner.bed_level_matrix.apply_rotation_xyz(tmp); if (get_min) NOMORE(min_diff, abl.eqnBVector[ind] - tmp.z); const float subval = get_min ? abl.mean : tmp.z + min_diff, diff = abl.eqnBVector[ind] - subval; diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index 0ef29f33bd..f1bff7d4c6 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -87,8 +87,8 @@ void vector_3::debug(PGM_P const title) { * matrix_3x3 */ -void apply_rotation_xyz(const matrix_3x3 &matrix, float &_x, float &_y, float &_z) { - vector_3 vec = vector_3(_x, _y, _z); vec.apply_rotation(matrix); +void matrix_3x3::apply_rotation_xyz(float &_x, float &_y, float &_z) { + vector_3 vec = vector_3(_x, _y, _z); vec.apply_rotation(*this); _x = vec.x; _y = vec.y; _z = vec.z; } diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h index 58428314d9..764e10accb 100644 --- a/Marlin/src/libs/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -45,7 +45,6 @@ class matrix_3x3; struct vector_3 : xyz_float_t { - vector_3(const float &_x, const float &_y, const float &_z) { set(_x, _y, _z); } vector_3(const xy_float_t &in) { set(in.x, in.y); } vector_3(const xyz_float_t &in) { set(in.x, in.y, in.z); } @@ -82,9 +81,8 @@ struct matrix_3x3 { void set_to_identity(); void debug(PGM_P const title); -}; -void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, float &x, float &y, float &z); -FORCE_INLINE void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, xyz_pos_t &pos) { - apply_rotation_xyz(rotationMatrix, pos.x, pos.y, pos.z); -} + void apply_rotation_xyz(float &x, float &y, float &z); + + FORCE_INLINE void apply_rotation_xyz(xyz_pos_t &pos) { apply_rotation_xyz(pos.x, pos.y, pos.z); } +}; diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 832d6e316a..eee1a9f269 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1534,7 +1534,7 @@ void Planner::check_axes_activity() { #if ABL_PLANAR xy_pos_t d = raw - level_fulcrum; - apply_rotation_xyz(bed_level_matrix, d.x, d.y, raw.z); + bed_level_matrix.apply_rotation_xyz(d.x, d.y, raw.z); raw = d + level_fulcrum; #elif HAS_MESH @@ -1571,7 +1571,7 @@ void Planner::check_axes_activity() { matrix_3x3 inverse = matrix_3x3::transpose(bed_level_matrix); xy_pos_t d = raw - level_fulcrum; - apply_rotation_xyz(inverse, d.x, d.y, raw.z); + inverse.apply_rotation_xyz(d.x, d.y, raw.z); raw = d + level_fulcrum; #elif HAS_MESH From fe99bb4b9b97b385f6c75592afac0ccf47643724 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 30 Mar 2021 23:57:57 -0500 Subject: [PATCH 1232/1370] Update UBL param --- Marlin/src/feature/bedlevel/ubl/ubl.h | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 56de4e45ba..acc191908c 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -57,7 +57,7 @@ typedef struct { xy_pos_t XY_pos; xy_bool_t XY_seen; #if HAS_BED_PROBE - int grid_size; + uint8_t J_grid_size; #endif } G29_parameters_t; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index c11962bf9d..3282ebe620 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -391,7 +391,7 @@ void unified_bed_leveling::G29() { if (parser.seen('J')) { save_ubl_active_state_and_disable(); - tilt_mesh_based_on_probed_grid(param.grid_size == 0); // Zero size does 3-Point + tilt_mesh_based_on_probed_grid(param.J_grid_size == 0); // Zero size does 3-Point restore_ubl_active_state_and_leave(); #if ENABLED(UBL_G29_J_RECENTER) do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); @@ -1118,8 +1118,8 @@ bool unified_bed_leveling::G29_parse_parameters() { if (parser.seen('J')) { #if HAS_BED_PROBE - param.grid_size = parser.has_value() ? parser.value_int() : 0; - if (param.grid_size && !WITHIN(param.grid_size, 2, 9)) { + param.J_grid_size = parser.value_byte(); + if (param.J_grid_size && !WITHIN(param.J_grid_size, 2, 9)) { SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); err_flag = true; } @@ -1420,8 +1420,8 @@ void unified_bed_leveling::smart_fill_mesh() { void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { const float x_min = probe.min_x(), x_max = probe.max_x(), y_min = probe.min_y(), y_max = probe.max_y(), - dx = (x_max - x_min) / (param.grid_size - 1), - dy = (y_max - y_min) / (param.grid_size - 1); + dx = (x_max - x_min) / (param.J_grid_size - 1), + dy = (y_max - y_min) / (param.J_grid_size - 1); xy_float_t points[3]; probe.get_three_points(points); @@ -1507,14 +1507,14 @@ void unified_bed_leveling::smart_fill_mesh() { bool zig_zag = false; - const uint16_t total_points = sq(param.grid_size); + const uint16_t total_points = sq(param.J_grid_size); uint16_t point_num = 1; xy_pos_t rpos; - LOOP_L_N(ix, param.grid_size) { + LOOP_L_N(ix, param.J_grid_size) { rpos.x = x_min + ix * dx; - LOOP_L_N(iy, param.grid_size) { - rpos.y = y_min + dy * (zig_zag ? param.grid_size - 1 - iy : iy); + LOOP_L_N(iy, param.J_grid_size) { + rpos.y = y_min + dy * (zig_zag ? param.J_grid_size - 1 - iy : iy); if (!abort_flag) { SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); From a4f16230120a5210371230e3f685b8e7c2943915 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Wed, 31 Mar 2021 15:34:17 +0800 Subject: [PATCH 1233/1370] MKS H43 fix, cleanup (#21485) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 6 +- Marlin/src/HAL/LPC1768/HAL.h | 3 + Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 8 +- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 93 ++++---- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 31 +-- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 219 ++++++++---------- .../extui/lib/dgus/mks/DGUSScreenHandler.h | 6 +- Marlin/src/module/settings.cpp | 41 ++++ 8 files changed, 202 insertions(+), 205 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 93a60394c2..5f9b1782fc 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2373,7 +2373,11 @@ //#define DGUS_LCD_UI_ORIGIN //#define DGUS_LCD_UI_FYSETC //#define DGUS_LCD_UI_HIPRECY -//#define DGUS_LCD_UI_MKS + +// #define DGUS_LCD_UI_MKS +#if ENABLED(DGUS_LCD_UI_MKS) + #define USE_MKS_GREEN_UI +#endif // // Touch-screen LCD for Malyan M200/M300 printers diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 58f9cb71fb..828e126d70 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -102,6 +102,9 @@ extern DefaultSerial1 USBSerial; #else #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif + #if HAS_DGUS_LCD + #define SERIAL_GET_TX_BUFFER_FREE() MSerial0.available() + #endif #endif // diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index 702c5cc47e..2c283b1a92 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -62,9 +62,11 @@ void DGUSDisplay::InitDisplay() { #define LCD_BAUDRATE 115200 #endif LCD_SERIAL.begin(LCD_BAUDRATE); - #if BOTH(DGUS_LCD_UI_MKS, POWER_LOSS_RECOVERY) - if (!recovery.valid()) delay(LOGO_TIME_DELAY); - #endif + + if (TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) { // If no Power-Loss Recovery is needed... + TERN_(DGUS_LCD_UI_MKS, delay(LOGO_TIME_DELAY)); // Show the logo for a little while + } + RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 25e1670740..a2ccdada36 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -43,58 +43,45 @@ uint16_t distanceToMove = 10; #endif -uint16_t distanceMove = 1; +uint16_t manualMoveStep = 1; float distanceFilament = 10; uint16_t FilamentSpeed = 25; float ZOffset_distance = 0.1; -float mesh_adj_distance = 0.1; +float mesh_adj_distance = 0.01; float Z_distance = 0.1; -int16_t level_1_x_point = 20; -int16_t level_1_y_point = 20; +//struct { uint16_t h, m, s; } dgus_time; -int16_t level_2_x_point = 20; -int16_t level_2_y_point = 20; +// +// Persistent settings +// +xy_int_t mks_corner_offsets[5]; // Initialized by settings.load() +xyz_int_t mks_park_pos; // Initialized by settings.load() +celsius_t mks_min_extrusion_temp; // Initialized by settings.load() -int16_t level_3_x_point = 20; -int16_t level_3_y_point = 20; - -int16_t level_4_x_point = 20; -int16_t level_4_y_point = 20; -int16_t level_5_x_point = X_MAX_POS / 2; -int16_t level_5_y_point = Y_MAX_POS / 2; - -uint16_t tim_h; -uint16_t tim_m; -uint16_t tim_s; - -uint16_t x_park_pos = 20; -uint16_t y_park_pos = 20; -uint16_t z_park_pos = 10; +void MKS_reset_settings() { + constexpr xy_int_t init_dgus_level_offsets[5] = { + { 20, 20 }, { 20, 20 }, + { 20, 20 }, { 20, 20 }, + { X_CENTER, Y_CENTER } + }; + mks_language_index = 0; + COPY(mks_corner_offsets, init_dgus_level_offsets); + mks_park_pos.set(20, 20, 10); + mks_min_extrusion_temp = 0; +} xyz_pos_t position_before_pause; - void MKS_pause_print_move() { queue.exhaust(); position_before_pause = current_position; - do_blocking_move_to(X_MIN_POS + x_park_pos, Y_MIN_POS + y_park_pos, current_position.z + z_park_pos); + do_blocking_move_to(X_MIN_POS + mks_park_pos.x, Y_MIN_POS + mks_park_pos.y, current_position.z + mks_park_pos.z); } - void MKS_resume_print_move() { do_blocking_move_to(position_before_pause); } -uint16_t min_ex_temp = 0; - float z_offset_add = 0; -#if ENABLED(SENSORLESS_HOMING) - uint16_t tmc_x_step = 0; - uint16_t tmc_y_step = 0; - uint16_t tmc_z_step = 0; -#else - uint16_t tmc_x_step = 0; - uint16_t tmc_y_step = 0; - uint16_t tmc_z_step = 0; -#endif +xyz_int_t tmc_step; // = { 0, 0, 0 } uint16_t lcd_default_light = 50; @@ -525,7 +512,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Y_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), VPHELPER(VP_Z_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_DISTANCE, &distanceMove, &ScreenHandler.GetManualMovestep, nullptr), + VPHELPER(VP_MOVE_DISTANCE, &manualMoveStep, &ScreenHandler.GetManualMovestep, nullptr), VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleManualMove, nullptr), VPHELPER(VP_LEVEL_POINT, nullptr, &ScreenHandler.ManualAssistLeveling, nullptr), @@ -567,7 +554,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) VPHELPER(VP_LOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentLoad, nullptr), VPHELPER(VP_UNLOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentUnLoad, nullptr), - VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #endif #endif @@ -623,16 +610,16 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), // Level Point Set - VPHELPER(VP_Level_Point_One_X, &level_1_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_One_Y, &level_1_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Two_X, &level_2_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Two_Y, &level_2_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Three_X, &level_3_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Three_Y, &level_3_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Four_X, &level_4_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Four_Y, &level_4_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Five_X, &level_5_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Five_Y, &level_5_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_One_X, &mks_corner_offsets[0].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_One_Y, &mks_corner_offsets[0].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_X, &mks_corner_offsets[1].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_Y, &mks_corner_offsets[1].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_X, &mks_corner_offsets[2].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_Y, &mks_corner_offsets[2].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_X, &mks_corner_offsets[3].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_Y, &mks_corner_offsets[3].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_X, &mks_corner_offsets[4].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_Y, &mks_corner_offsets[4].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), // Print Progress VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay), @@ -679,20 +666,20 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_T_F_SPEED, (uint16_t *)&planner.settings.min_travel_feedrate_mm_s, ScreenHandler.HandleMin_T_F_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), VPHELPER(VP_ACC_SPEED, (uint16_t *)&planner.settings.acceleration, ScreenHandler.HandleAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_X_PARK_POS, &x_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Y_PARK_POS, &y_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Z_PARK_POS, &z_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_X_PARK_POS, &mks_park_pos.x, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Y_PARK_POS, &mks_park_pos.y, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Z_PARK_POS, &mks_park_pos.z, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MIN_EX_T, &thermalManager.extrude_min_temp, ScreenHandler.HandleGetExMinTemp_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #if ENABLED(SENSORLESS_HOMING) // TMC SENSORLESS Setting #if AXIS_HAS_STEALTHCHOP(X) - VPHELPER(VP_TMC_X_STEP, &tmc_x_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_X_STEP, &tmc_step.x, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), #endif #if AXIS_HAS_STEALTHCHOP(Y) - VPHELPER(VP_TMC_Y_STEP, &tmc_y_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_Y_STEP, &tmc_step.y, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), #endif #if AXIS_HAS_STEALTHCHOP(Z) - VPHELPER(VP_TMC_Z_STEP, &tmc_z_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_Z_STEP, &tmc_step.z, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), #endif #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h index c8915a3d25..9a3690f356 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -23,7 +23,6 @@ #include "../DGUSDisplayDef.h" -#define USE_MKS_GREEN_UI //#define DGUS_MKS_RUNOUT_SENSOR #define LOGO_TIME_DELAY TERN(USE_MKS_GREEN_UI, 8000, 1500) @@ -36,43 +35,27 @@ #define MKS_FINSH -extern uint16_t distanceMove; +extern uint16_t manualMoveStep; extern float distanceFilament; extern uint16_t FilamentSpeed; extern float ZOffset_distance; extern float mesh_adj_distance; extern float Z_distance; -extern int16_t level_1_x_point; -extern int16_t level_1_y_point; -extern int16_t level_2_x_point; -extern int16_t level_2_y_point; -extern int16_t level_3_x_point; -extern int16_t level_3_y_point; -extern int16_t level_4_x_point; -extern int16_t level_4_y_point; -extern int16_t level_5_x_point; -extern int16_t level_5_y_point; +//extern struct { uint16_t h, m, s; } dgus_time; -extern uint16_t tim_h; -extern uint16_t tim_m; -extern uint16_t tim_s; +extern xy_int_t mks_corner_offsets[5]; +extern xyz_int_t mks_park_pos; +extern celsius_t mks_min_extrusion_temp; -extern uint16_t x_park_pos; -extern uint16_t y_park_pos; -extern uint16_t z_park_pos; +void MKS_reset_settings(); // Restore persistent settings to defaults -extern xyz_pos_t position_before_pause; void MKS_pause_print_move(); void MKS_resume_print_move(); -extern uint16_t min_ex_temp; - extern float z_offset_add; -extern uint16_t tmc_x_step; -extern uint16_t tmc_y_step; -extern uint16_t tmc_z_step; +xyz_int_t tmc_step; extern uint16_t lcd_default_light; diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index d956ec4c52..b6633d3a1f 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -55,7 +55,7 @@ #endif bool DGUSAutoTurnOff = false; -uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS +uint8_t mks_language_index; // Initialized by settings.load() // endianness swap uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } @@ -125,11 +125,11 @@ void DGUSScreenHandler::DGUSLCD_SendGbkToDisplay(DGUS_VP_Variable &var) { } void DGUSScreenHandler::DGUSLCD_SendStringToDisplay_Language_MKS(DGUS_VP_Variable &var) { - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { char *tmp = (char*) var.memadr; dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { uint16_t *tmp = (uint16_t *)var.memadr; dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); } @@ -138,15 +138,15 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplay_Language_MKS(DGUS_VP_Variabl void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { #if ENABLED(SENSORLESS_HOMING) #if AXIS_HAS_STEALTHCHOP(X) - tmc_x_step = stepperX.homing_threshold(); + tmc_step.x = stepperX.homing_threshold(); dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); #endif #if AXIS_HAS_STEALTHCHOP(Y) - tmc_y_step = stepperY.homing_threshold(); + tmc_step.y = stepperY.homing_threshold(); dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); #endif #if AXIS_HAS_STEALTHCHOP(Z) - tmc_z_step = stepperZ.homing_threshold(); + tmc_step.z = stepperZ.homing_threshold(); dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); #endif #endif @@ -329,7 +329,7 @@ void DGUSScreenHandler::ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("ctrl turn off\n"); + DEBUG_ECHOLNPGM("GetTurnOffCtrl\n"); const uint16_t value = swap16(*(uint16_t *)val_ptr); switch (value) { case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; @@ -338,15 +338,15 @@ void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("MinExtrudeTempChange DistanceChange"); + DEBUG_ECHOLNPGM("GetMinExtrudeTemp"); const uint16_t value = swap16(*(uint16_t *)val_ptr); thermalManager.extrude_min_temp = value; - min_ex_temp = value; + mks_min_extrusion_temp = value; settings.save(); } void DGUSScreenHandler::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("Zoffset DistanceChange"); + DEBUG_ECHOLNPGM("GetZoffsetDistance"); const uint16_t value = swap16(*(uint16_t *)val_ptr); float val_distance = 0; switch (value) { @@ -360,7 +360,7 @@ void DGUSScreenHandler::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) } void DGUSScreenHandler::GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("\nMove DistanceChange"); + DEBUG_ECHOLNPGM("\nGetManualMovestep"); *(uint16_t *)var.memadr = swap16(*(uint16_t *)val_ptr); } @@ -414,14 +414,14 @@ void DGUSScreenHandler::LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr) switch (lag_flag) { case MKS_SimpleChinese: DGUS_LanguageDisplay(MKS_SimpleChinese); - DGUSLanguageSwitch = MKS_SimpleChinese; + mks_language_index = MKS_SimpleChinese; dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_Choose); dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_NoChoose); settings.save(); break; case MKS_English: DGUS_LanguageDisplay(MKS_English); - DGUSLanguageSwitch = MKS_English; + mks_language_index = MKS_English; dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_NoChoose); dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_Choose); settings.save(); @@ -454,11 +454,11 @@ void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { mesh_point_count = GRID_MAX_POINTS; - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { const char level_buf_en[] = "Start Level"; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en, 32, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { const uint16_t level_buf_ch[] = {0xAABF, 0xBCCA, 0xF7B5, 0xBDC6, 0x2000}; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch, 32, true); } @@ -532,15 +532,17 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { break; case 2: - if (mesh_point_count == GRID_MAX_POINTS) { // 第1个点 + if (mesh_point_count == GRID_MAX_POINTS) { // The first point + + queue.enqueue_now_P(PSTR("G28")); queue.enqueue_now_P(PSTR("G29S1")); mesh_point_count--; - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { const char level_buf_en1[] = "Next Point"; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en1, 32, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { const uint16_t level_buf_ch1[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch1, 32, true); } @@ -548,11 +550,11 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { else if (mesh_point_count > 1) { // 倒数第二个点 queue.enqueue_now_P(PSTR("G29S2")); mesh_point_count--; - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { const char level_buf_en2[] = "Next Point"; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { const uint16_t level_buf_ch2[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); } @@ -560,11 +562,11 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { else if (mesh_point_count == 1) { queue.enqueue_now_P(PSTR("G29S2")); mesh_point_count--; - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { const char level_buf_en2[] = "Level Finsh"; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { const uint16_t level_buf_ch2[] = {0xF7B5, 0xBDC6, 0xEACD, 0xC9B3, 0x2000}; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); } @@ -597,85 +599,52 @@ void DGUSScreenHandler::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenHandler::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr) { const int16_t point_value = swap16(*(uint16_t *)val_ptr); - int16_t level_x_pos, level_y_pos; - char buf_level[32] = {0}; - unsigned int level_speed = 1500; + // Insist on leveling first time at this screen static bool first_level_flag = false; - - if (!first_level_flag) + if (!first_level_flag || point_value == 0x0001) { queue.enqueue_now_P(G28_STR); + first_level_flag = true; + } + + constexpr uint16_t level_speed = 1500; + + auto enqueue_corner_move = [](int16_t lx, int16_t ly, uint16_t fr) { + char buf_level[32]; + sprintf_P(buf_level, "G0X%dY%dF%d", lx, ly, fr); + queue.enqueue_one_now(buf_level); + }; + + if (WITHIN(point_value, 0x0001, 0x0005)) + queue.enqueue_now_P(PSTR("G1Z10")); switch (point_value) { case 0x0001: - if (first_level_flag) - queue.enqueue_now_P(G28_STR); - queue.enqueue_now_P(PSTR("G1 Z10")); - //level_x_pos = X_MIN_POS + 20; - //level_y_pos = Y_MIN_POS + 20; - level_x_pos = X_MIN_POS + abs(level_1_x_point); - level_y_pos = Y_MIN_POS + abs(level_1_y_point); - - memset(buf_level, 0, sizeof(buf_level)); - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - queue.enqueue_now_P(PSTR("G28 Z")); + enqueue_corner_move(X_MIN_POS + abs(mks_corner_offsets[0].x), + Y_MIN_POS + abs(mks_corner_offsets[0].y), level_speed); + queue.enqueue_now_P(PSTR("G28Z")); break; case 0x0002: - queue.enqueue_now_P(PSTR("G1 Z10")); - - //level_x_pos = X_MAX_POS - 20; - //level_y_pos = Y_MIN_POS + 20; - - level_x_pos = X_MAX_POS - abs(level_2_x_point); - level_y_pos = Y_MIN_POS + abs(level_2_y_point); - - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - //queue.enqueue_now_P(PSTR("G28Z")); - queue.enqueue_now_P(PSTR("G1 Z-10")); + enqueue_corner_move(X_MAX_POS - abs(mks_corner_offsets[1].x), + Y_MIN_POS + abs(mks_corner_offsets[1].y), level_speed); break; case 0x0003: - queue.enqueue_now_P(PSTR("G1 Z10")); - - //level_x_pos = X_MAX_POS - 20; - //level_y_pos = Y_MAX_POS - 20; - - level_x_pos = X_MAX_POS - abs(level_3_x_point); - level_y_pos = Y_MAX_POS - abs(level_3_y_point); - - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - //sprintf_P(buf_level, PSTR("G28 Z")); - queue.enqueue_now_P(PSTR("G1 Z-10")); + enqueue_corner_move(X_MAX_POS - abs(mks_corner_offsets[2].x), + Y_MAX_POS - abs(mks_corner_offsets[2].y), level_speed); break; case 0x0004: - queue.enqueue_now_P(PSTR("G1 Z10")); - - //level_x_pos = X_MIN_POS + 20; - //level_y_pos = Y_MAX_POS - 20; - level_x_pos = X_MIN_POS + abs(level_4_x_point); - level_y_pos = Y_MAX_POS - abs(level_4_y_point); - - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - //sprintf_P(buf_level, PSTR("G28 Z")); - queue.enqueue_now_P(PSTR("G1 Z-10")); + enqueue_corner_move(X_MIN_POS + abs(mks_corner_offsets[3].x), + Y_MAX_POS - abs(mks_corner_offsets[3].y), level_speed); break; case 0x0005: - queue.enqueue_now_P(PSTR("G1 Z10")); - //level_x_pos = (uint16_t)(X_MAX_POS / 2); - //level_y_pos = (uint16_t)(Y_MAX_POS / 2); - level_x_pos = abs(level_5_x_point); - level_y_pos = abs(level_5_y_point); - - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - queue.enqueue_now_P(PSTR("G1 Z-10")); + enqueue_corner_move(abs(mks_corner_offsets[4].x), + abs(mks_corner_offsets[4].y), level_speed); break; } - // Only once - first_level_flag = true; + if (WITHIN(point_value, 0x0002, 0x0005)) { + //queue.enqueue_now_P(PSTR("G28Z")); + queue.enqueue_now_P(PSTR("G1Z-10")); + } } #define mks_min(a, b) ((a) < (b)) ? (a) : (b) @@ -691,7 +660,7 @@ void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { #if AXIS_HAS_STEALTHCHOP(X) stepperX.homing_threshold(mks_min(tmc_value, 255)); settings.save(); - //tmc_x_step = stepperX.homing_threshold(); + //tmc_step.x = stepperX.homing_threshold(); #endif #endif break; @@ -700,7 +669,7 @@ void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { #if AXIS_HAS_STEALTHCHOP(Y) stepperY.homing_threshold(mks_min(tmc_value, 255)); settings.save(); - //tmc_y_step = stepperY.homing_threshold(); + //tmc_step.y = stepperY.homing_threshold(); #endif #endif break; @@ -709,7 +678,7 @@ void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { #if AXIS_HAS_STEALTHCHOP(Z) stepperZ.homing_threshold(mks_min(tmc_value, 255)); settings.save(); - //tmc_z_step = stepperZ.homing_threshold(); + //tmc_step.z = stepperZ.homing_threshold(); #endif #endif break; @@ -767,13 +736,13 @@ void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { } #if USE_SENSORLESS #if AXIS_HAS_STEALTHCHOP(X) - tmc_x_step = stepperX.homing_threshold(); + tmc_step.x = stepperX.homing_threshold(); #endif #if AXIS_HAS_STEALTHCHOP(Y) - tmc_y_step = stepperY.homing_threshold(); + tmc_step.y = stepperY.homing_threshold(); #endif #if AXIS_HAS_STEALTHCHOP(Z) - tmc_z_step = stepperZ.homing_threshold(); + tmc_step.z = stepperZ.homing_threshold(); #endif #endif } @@ -784,9 +753,9 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { int16_t movevalue = swap16(*(uint16_t*)val_ptr); // Choose Move distance - if (distanceMove == 0x01) distanceMove = 10; - else if (distanceMove == 0x02) distanceMove = 100; - else if (distanceMove == 0x03) distanceMove = 1000; + if (manualMoveStep == 0x01) manualMoveStep = 10; + else if (manualMoveStep == 0x02) manualMoveStep = 100; + else if (manualMoveStep == 0x03) manualMoveStep = 1000; DEBUG_ECHOLNPAIR("QUEUE LEN:", queue.length); @@ -853,8 +822,8 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOPAIR("movevalue = ", movevalue); if (movevalue != 0 && movevalue != 5) { // get move distance switch (movevalue) { - case 0x0001: movevalue = distanceMove; break; - case 0x0002: movevalue = -distanceMove; break; + case 0x0001: movevalue = manualMoveStep; break; + case 0x0002: movevalue = -manualMoveStep; break; default: movevalue = 0; break; } } @@ -929,16 +898,16 @@ void DGUSScreenHandler::GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr) { const int16_t value_pos = swap16(*(int16_t*)val_ptr); switch (var.VP) { - case VP_X_PARK_POS: x_park_pos = value_pos; break; - case VP_Y_PARK_POS: y_park_pos = value_pos; break; - case VP_Z_PARK_POS: z_park_pos = value_pos; break; + case VP_X_PARK_POS: mks_park_pos.x = value_pos; break; + case VP_Y_PARK_POS: mks_park_pos.y = value_pos; break; + case VP_Z_PARK_POS: mks_park_pos.z = value_pos; break; default: break; } skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandler::HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + DEBUG_ECHOLNPGM("HandleChangeLevelPoint_MKS"); const int16_t value_raw = swap16(*(int16_t*)val_ptr); DEBUG_ECHOLNPAIR_F("value_raw:", value_raw); @@ -950,7 +919,7 @@ void DGUSScreenHandler::HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void * } void DGUSScreenHandler::HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + DEBUG_ECHOLNPGM("HandleStepPerMMChanged_MKS"); const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); const float value = (float)value_raw; @@ -972,7 +941,7 @@ void DGUSScreenHandler::HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void * } void DGUSScreenHandler::HandleStepPerMMExtruderChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); + DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged_MKS"); const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); const float value = (float)value_raw; @@ -1019,7 +988,7 @@ void DGUSScreenHandler::HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *va } void DGUSScreenHandler::HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + DEBUG_ECHOLNPGM("HandleExtruderMaxSpeedChange_MKS"); const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); const float value = (float)value_raw; @@ -1044,7 +1013,7 @@ void DGUSScreenHandler::HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, } void DGUSScreenHandler::HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + DEBUG_ECHOLNPGM("HandleMaxAccChange_MKS"); const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); const float value = (float)value_raw; @@ -1066,7 +1035,7 @@ void DGUSScreenHandler::HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ } void DGUSScreenHandler::HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + DEBUG_ECHOLNPGM("HandleExtruderAccChange_MKS"); uint16_t value_raw = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("value_raw:", value_raw); @@ -1199,7 +1168,7 @@ void DGUSScreenHandler::HandleGetExMinTemp_MKS(DGUS_VP_Variable &var, void *val_ #endif // BABYSTEPPING void DGUSScreenHandler::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleGetFilament"); + DEBUG_ECHOLNPGM("GetManualFilament"); uint16_t value_len = swap16(*(uint16_t*)val_ptr); @@ -1212,7 +1181,7 @@ void DGUSScreenHandler::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) } void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleGetFilamentSpeed"); + DEBUG_ECHOLNPGM("GetManualFilamentSpeed"); uint16_t value_len = swap16(*(uint16_t*)val_ptr); @@ -1225,8 +1194,10 @@ void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + char buf[40]; uint8_t swap_tool = 0; #endif + #if HAS_HOTEND uint8_t hotend_too_cold = 0; #endif @@ -1234,13 +1205,19 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) return; - char buf[40]; const uint16_t val_t = swap16(*(uint16_t*)val_ptr); switch (val_t) { default: break; case 0: #if HAS_HOTEND - if (thermalManager.tooColdToExtrude(0)) hotend_too_cold = 1; else swap_tool = 1; + if (thermalManager.tooColdToExtrude(0)) { + hotend_too_cold = 1; + } + else { + #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + swap_tool = 2; + #endif + } #endif break; case 1: @@ -1273,12 +1250,12 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ } void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("Load Filament"); + DEBUG_ECHOLNPGM("MKS_FilamentLoad"); MKS_FilamentLoadUnload(var, val_ptr, 1); } void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("UnLoad Filament"); + DEBUG_ECHOLNPGM("MKS_FilamentUnLoad"); MKS_FilamentLoadUnload(var, val_ptr, -1); } @@ -1403,7 +1380,7 @@ bool DGUSScreenHandler::loop() { if (language_times != 0) { LanguagePInit(); - DGUS_LanguageDisplay(DGUSLanguageSwitch); + DGUS_LanguageDisplay(mks_language_index); language_times--; } @@ -1413,18 +1390,18 @@ bool DGUSScreenHandler::loop() { booted = true; #if USE_SENSORLESS #if AXIS_HAS_STEALTHCHOP(X) - tmc_x_step = stepperX.homing_threshold(); + tmc_step.x = stepperX.homing_threshold(); #endif #if AXIS_HAS_STEALTHCHOP(Y) - tmc_y_step = stepperY.homing_threshold(); + tmc_step.y = stepperY.homing_threshold(); #endif #if AXIS_HAS_STEALTHCHOP(Z) - tmc_z_step = stepperZ.homing_threshold(); + tmc_step.z = stepperZ.homing_threshold(); #endif #endif - if (min_ex_temp != 0) - thermalManager.extrude_min_temp = min_ex_temp; + if (mks_min_extrusion_temp != 0) + thermalManager.extrude_min_temp = mks_min_extrusion_temp; DGUS_ExtrudeLoadInit(); @@ -1446,7 +1423,7 @@ bool DGUSScreenHandler::loop() { } void DGUSScreenHandler::LanguagePInit() { - switch (DGUSLanguageSwitch) { + switch (mks_language_index) { case MKS_SimpleChinese: dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_Choose); dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_NoChoose); @@ -1705,10 +1682,10 @@ void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { const char Printing_buf_en[] = "Printing"; dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_en, 32, true); - const char Info_EEPROM_1_buf_en[] = "Store setting?"; + const char Info_EEPROM_1_buf_en[] = "Store setting?"; dgusdisplay.WriteVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_en, 32, true); - const char Info_EEPROM_2_buf_en[] = "Revert setting?"; + const char Info_EEPROM_2_buf_en[] = "Revert setting?"; dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en, 32, true); const char Info_PrinfFinsh_1_buf_en[] = "Print Done"; @@ -1963,7 +1940,7 @@ void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { const uint16_t Info_EEPROM_1_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; dgusdisplay.WriteVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_ch, 32, true); - const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; + const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32, true); const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index dc656326ac..2d0678ca5b 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -158,13 +158,13 @@ public: static void GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr); #endif + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); #if ENABLED(SDSUPPORT) // Callback for VP "Display wants to change screen when there is a SD card" static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); // Scroll buttons on the file listing screen. static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); - // File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); // start print after confirmation received. static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); // User hit the pause, resume or abort button. @@ -301,7 +301,7 @@ private: #define MKS_SimpleChinese 0 #define MKS_English 1 -extern uint8_t DGUSLanguageSwitch; +extern uint8_t mks_language_index; extern bool DGUSAutoTurnOff; #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d98ee3c218..ced33a1986 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -153,6 +153,11 @@ #include "../libs/buzzer.h" #endif +#if ENABLED(DGUS_LCD_UI_MKS) + #include "../lcd/extui/lib/dgus/DGUSScreenHandler.h" + #include "../lcd/extui/lib/dgus/DGUSDisplayDef.h" +#endif + #pragma pack(push, 1) // No padding between variables #if HAS_ETHERNET @@ -461,6 +466,16 @@ typedef struct SettingsDataStruct { bool buzzer_enabled; #endif + // + // MKS UI controller + // + #if ENABLED(DGUS_LCD_UI_MKS) + uint8_t mks_language_index; // Display Language + xy_int_t mks_corner_offsets[5]; // Bed Tramming + xyz_int_t mks_park_pos; // Custom Parking (without NOZZLE_PARK) + celsius_t mks_min_extrusion_temp; // Min E Temp (shadow M302 value) + #endif + #if HAS_MULTI_LANGUAGE uint8_t ui_language; // M414 S #endif @@ -1402,6 +1417,16 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(ui.buzzer_enabled); #endif + // + // MKS UI controller + // + #if ENABLED(DGUS_LCD_UI_MKS) + EEPROM_WRITE(mks_language_index); + EEPROM_WRITE(mks_corner_offsets); + EEPROM_WRITE(mks_park_pos); + EEPROM_WRITE(mks_min_extrusion_temp); + #endif + // // Selected LCD language // @@ -2302,6 +2327,17 @@ void MarlinSettings::postprocess() { EEPROM_READ(ui.buzzer_enabled); #endif + // + // MKS UI controller + // + #if ENABLED(DGUS_LCD_UI_MKS) + _FIELD_TEST(mks_language_index); + EEPROM_READ(mks_language_index); + EEPROM_READ(mks_corner_offsets); + EEPROM_READ(mks_park_pos); + EEPROM_READ(mks_min_extrusion_temp); + #endif + // // Selected LCD language // @@ -2967,6 +3003,11 @@ void MarlinSettings::reset() { #endif #endif + // + // MKS UI controller + // + TERN_(DGUS_LCD_UI_MKS, MKS_reset_settings()); + postprocess(); DEBUG_ECHO_START(); From a4d5f96e9aececde7dc2749444f82e20f9db3551 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 1 Apr 2021 17:59:57 -0500 Subject: [PATCH 1234/1370] Replace 'const float &' with 'const_float_t' (#21505) --- Marlin/src/HAL/AVR/fastio.cpp | 2 +- Marlin/src/core/serial.cpp | 2 +- Marlin/src/core/serial.h | 2 +- Marlin/src/core/types.h | 10 +++ Marlin/src/feature/babystep.cpp | 2 +- Marlin/src/feature/babystep.h | 2 +- Marlin/src/feature/backlash.h | 2 +- Marlin/src/feature/bedlevel/abl/abl.cpp | 4 +- Marlin/src/feature/bedlevel/abl/abl.h | 2 +- Marlin/src/feature/bedlevel/bedlevel.cpp | 2 +- Marlin/src/feature/bedlevel/bedlevel.h | 2 +- .../bedlevel/mbl/mesh_bed_leveling.cpp | 2 +- .../feature/bedlevel/mbl/mesh_bed_leveling.h | 22 +++--- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 4 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 44 +++++------ Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 12 +-- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 4 +- Marlin/src/feature/encoder_i2c.h | 2 +- Marlin/src/feature/filwidth.h | 2 +- .../src/feature/leds/printer_event_leds.cpp | 8 +- Marlin/src/feature/leds/printer_event_leds.h | 6 +- Marlin/src/feature/max7219.cpp | 2 +- Marlin/src/feature/max7219.h | 7 ++ Marlin/src/feature/mixing.cpp | 2 +- Marlin/src/feature/mixing.h | 4 +- Marlin/src/feature/pause.cpp | 10 +-- Marlin/src/feature/pause.h | 10 +-- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/feature/powerloss.h | 2 +- Marlin/src/feature/probe_temp_comp.cpp | 8 +- Marlin/src/feature/probe_temp_comp.h | 8 +- Marlin/src/feature/runout.h | 2 +- Marlin/src/feature/spindle_laser.h | 2 +- Marlin/src/gcode/bedlevel/G26.cpp | 4 +- Marlin/src/gcode/calibrate/G33.cpp | 2 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/gcode/calibrate/M48.cpp | 2 +- Marlin/src/gcode/feature/camera/M240.cpp | 2 +- Marlin/src/gcode/feature/mixing/M166.cpp | 2 +- Marlin/src/gcode/motion/M290.cpp | 2 +- Marlin/src/gcode/parser.h | 12 +-- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 2 +- Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp | 2 +- Marlin/src/lcd/extui/dgus_lcd.cpp | 2 +- Marlin/src/lcd/extui/example.cpp | 2 +- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 70 +++++++++--------- Marlin/src/lcd/extui/ui_api.h | 74 +++++++++---------- Marlin/src/lcd/marlinui.h | 2 +- Marlin/src/lcd/menu/menu.cpp | 2 +- Marlin/src/lcd/menu/menu.h | 8 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 +- Marlin/src/lcd/menu/menu_item.h | 10 +-- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 4 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 4 +- Marlin/src/libs/least_squares_fit.h | 8 +- Marlin/src/libs/nozzle.cpp | 4 +- Marlin/src/libs/nozzle.h | 4 +- Marlin/src/libs/numtostr.cpp | 38 +++++----- Marlin/src/libs/numtostr.h | 49 ++++++------ Marlin/src/libs/vector_3.h | 2 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/delta.h | 2 +- Marlin/src/module/motion.cpp | 32 ++++---- Marlin/src/module/motion.h | 46 ++++++------ Marlin/src/module/planner.cpp | 22 +++--- Marlin/src/module/planner.h | 56 +++++++------- Marlin/src/module/planner_bezier.cpp | 8 +- Marlin/src/module/planner_bezier.h | 2 +- Marlin/src/module/probe.cpp | 6 +- Marlin/src/module/probe.h | 12 +-- Marlin/src/module/scara.cpp | 4 +- Marlin/src/module/scara.h | 4 +- Marlin/src/module/temperature.cpp | 8 +- Marlin/src/module/temperature.h | 14 ++-- 79 files changed, 376 insertions(+), 366 deletions(-) diff --git a/Marlin/src/HAL/AVR/fastio.cpp b/Marlin/src/HAL/AVR/fastio.cpp index b51d7f9768..70132e71ee 100644 --- a/Marlin/src/HAL/AVR/fastio.cpp +++ b/Marlin/src/HAL/AVR/fastio.cpp @@ -241,7 +241,7 @@ uint8_t extDigitalRead(const int8_t pin) { * * DC values -1.0 to 1.0. Negative duty cycle inverts the pulse. */ -uint16_t set_pwm_frequency_hz(const float &hz, const float dca, const float dcb, const float dcc) { +uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) { float count = 0; if (hz > 0 && (dca || dcb || dcc)) { count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq. diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index dcbfd608bf..8af367c801 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -91,7 +91,7 @@ void print_bin(uint16_t val) { } } -void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { +void print_xyz(const_float_t x, const_float_t y, const_float_t z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { if (prefix) serialprintPGM(prefix); SERIAL_ECHOPAIR_P(SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z); if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 43137f71d7..45a1ab012e 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -387,7 +387,7 @@ void serialprint_truefalse(const bool tf); void serial_spaces(uint8_t count); void print_bin(const uint16_t val); -void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr); +void print_xyz(const_float_t x, const_float_t y, const_float_t z, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr); inline void print_xyz(const xyz_pos_t &xyz, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr) { print_xyz(xyz.x, xyz.y, xyz.z, prefix, suffix); diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index d77dba38d9..687ec867d1 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -78,6 +78,16 @@ typedef float feedRate_t; // typedef int16_t celsius_t; +// +// On AVR pointers are only 2 bytes so use 'const float &' for 'const float' +// +#ifdef __AVR__ + typedef const float & const_float_t; +#else + typedef const float const_float_t; +#endif +typedef const_float_t const_feedRate_t; + // Conversion macros #define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) #define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp index b076881461..54ad9588f4 100644 --- a/Marlin/src/feature/babystep.cpp +++ b/Marlin/src/feature/babystep.cpp @@ -50,7 +50,7 @@ void Babystep::step_axis(const AxisEnum axis) { } } -void Babystep::add_mm(const AxisEnum axis, const float &mm) { +void Babystep::add_mm(const AxisEnum axis, const_float_t mm) { add_steps(axis, mm * planner.settings.axis_steps_per_mm[axis]); } diff --git a/Marlin/src/feature/babystep.h b/Marlin/src/feature/babystep.h index f85e5909ca..f8037678ca 100644 --- a/Marlin/src/feature/babystep.h +++ b/Marlin/src/feature/babystep.h @@ -61,7 +61,7 @@ public: #endif static void add_steps(const AxisEnum axis, const int16_t distance); - static void add_mm(const AxisEnum axis, const float &mm); + static void add_mm(const AxisEnum axis, const_float_t mm); static inline bool has_steps() { return steps[BS_AXIS_IND(X_AXIS)] || steps[BS_AXIS_IND(Y_AXIS)] || steps[BS_AXIS_IND(Z_AXIS)]; diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h index 49857f1f99..500168b380 100644 --- a/Marlin/src/feature/backlash.h +++ b/Marlin/src/feature/backlash.h @@ -35,7 +35,7 @@ public: static float smoothing_mm; #endif - static inline void set_correction(const float &v) { correction = _MAX(0, _MIN(1.0, v)) * all_on; } + static inline void set_correction(const_float_t v) { correction = _MAX(0, _MIN(1.0, v)) * all_on; } static inline float get_correction() { return float(ui8_to_percent(correction)) / 100.0f; } #else static constexpr uint8_t correction = (BACKLASH_CORRECTION) * 0xFF; diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index a663ee571d..bc3aedb2f4 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -213,7 +213,7 @@ void print_bilinear_leveling_grid() { ) * 0.5f; } - static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { + static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const_float_t tx, const_float_t ty) { float row[4], column[4]; LOOP_L_N(i, 4) { LOOP_L_N(j, 4) { @@ -356,7 +356,7 @@ float bilinear_z_offset(const xy_pos_t &raw) { * Prepare a bilinear-leveled linear move on Cartesian, * splitting the move where it crosses grid borders. */ - void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { + void bilinear_line_to_destination(const_feedRate_t scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { // Get current and destination cells for this line xy_int_t c1 { CELL_INDEX(x, current_position.x), CELL_INDEX(y, current_position.y) }, c2 { CELL_INDEX(x, destination.x), CELL_INDEX(y, destination.y) }; diff --git a/Marlin/src/feature/bedlevel/abl/abl.h b/Marlin/src/feature/bedlevel/abl/abl.h index bbe2411dc3..3d54c55695 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.h +++ b/Marlin/src/feature/bedlevel/abl/abl.h @@ -37,7 +37,7 @@ void refresh_bed_level(); #endif #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) - void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); + void bilinear_line_to_destination(const_feedRate_t scaled_fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); #endif #define _GET_MESH_X(I) float(bilinear_start.x + (I) * bilinear_grid_spacing.x) diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 3680fbac05..30fafbf57b 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -98,7 +98,7 @@ TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved( #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float &zfh, const bool do_report/*=true*/) { + void set_z_fade_height(const_float_t zfh, const bool do_report/*=true*/) { if (planner.z_fade_height == zfh) return; diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index 3e89a08802..9bab2fbd2f 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -38,7 +38,7 @@ void set_bed_leveling_enabled(const bool enable=true); void reset_bed_level(); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float &zfh, const bool do_report=true); + void set_z_fade_height(const_float_t zfh, const bool do_report=true); #endif #if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index ec5b95c108..f51d83f996 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -61,7 +61,7 @@ * Prepare a mesh-leveled linear move in a Cartesian setup, * splitting the move where it crosses mesh borders. */ - void mesh_bed_leveling::line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { + void mesh_bed_leveling::line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { // Get current and destination cells for this line xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); NOMORE(scel.x, GRID_MAX_POINTS_X - 2); diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index ade7a93140..9932ce9e5c 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -56,7 +56,7 @@ public: return false; } - static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + static void set_z(const int8_t px, const int8_t py, const_float_t z) { z_values[px][py] = z; } static inline void zigzag(const int8_t index, int8_t &px, int8_t &py) { px = index % (GRID_MAX_POINTS_X); @@ -64,39 +64,39 @@ public: if (py & 1) px = (GRID_MAX_POINTS_X - 1) - px; // Zig zag } - static void set_zigzag_z(const int8_t index, const float &z) { + static void set_zigzag_z(const int8_t index, const_float_t z) { int8_t px, py; zigzag(index, px, py); set_z(px, py, z); } - static int8_t cell_index_x(const float &x) { + static int8_t cell_index_x(const_float_t x) { int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); return constrain(cx, 0, (GRID_MAX_POINTS_X) - 2); } - static int8_t cell_index_y(const float &y) { + static int8_t cell_index_y(const_float_t y) { int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 2); } - static inline xy_int8_t cell_indexes(const float &x, const float &y) { + static inline xy_int8_t cell_indexes(const_float_t x, const_float_t y) { return { cell_index_x(x), cell_index_y(y) }; } static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } - static int8_t probe_index_x(const float &x) { + static int8_t probe_index_x(const_float_t x) { int8_t px = (x - (MESH_MIN_X) + 0.5f * (MESH_X_DIST)) * RECIPROCAL(MESH_X_DIST); return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; } - static int8_t probe_index_y(const float &y) { + static int8_t probe_index_y(const_float_t y) { int8_t py = (y - (MESH_MIN_Y) + 0.5f * (MESH_Y_DIST)) * RECIPROCAL(MESH_Y_DIST); return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; } - static inline xy_int8_t probe_indexes(const float &x, const float &y) { + static inline xy_int8_t probe_indexes(const_float_t x, const_float_t y) { return { probe_index_x(x), probe_index_y(y) }; } static inline xy_int8_t probe_indexes(const xy_pos_t &xy) { return probe_indexes(xy.x, xy.y); } - static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { + static float calc_z0(const_float_t a0, const_float_t a1, const_float_t z1, const_float_t a2, const_float_t z2) { const float delta_z = (z2 - z1) / (a2 - a1), delta_a = a0 - a1; return z1 + delta_a * delta_z; @@ -104,7 +104,7 @@ public: static float get_z(const xy_pos_t &pos #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - , const float &factor=1.0f + , const_float_t factor=1.0f #endif ) { #if DISABLED(ENABLE_LEVELING_FADE_HEIGHT) @@ -120,7 +120,7 @@ public: } #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) - static void line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF); + static void line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF); #endif }; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 05b96daefa..14491bdd81 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -102,7 +102,7 @@ void unified_bed_leveling::invalidate() { set_all_mesh_points_to_value(NAN); } -void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { +void unified_bed_leveling::set_all_mesh_points_to_value(const_float_t value) { GRID_LOOP(x, y) { z_values[x][y] = value; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, value)); @@ -115,7 +115,7 @@ void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { constexpr int16_t Z_STEPS_NAN = INT16_MAX; void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { - auto z_to_store = [](const float &z) { + auto z_to_store = [](const_float_t z) { if (isnan(z)) return Z_STEPS_NAN; const int32_t z_scaled = TRUNC(z * mesh_store_scaling); if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index acc191908c..222e7b0f20 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -67,17 +67,17 @@ private: static G29_parameters_t param; #if IS_NEWPANEL - static void move_z_with_encoder(const float &multiplier); + static void move_z_with_encoder(const_float_t multiplier); static float measure_point_with_encoder(); static float measure_business_card_thickness(); - static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; + static void manually_probe_remaining_mesh(const xy_pos_t&, const_float_t , const_float_t , const bool) _O0; static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; #endif static bool G29_parse_parameters() _O0; static void shift_mesh_height(); static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; - static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); + static void tilt_mesh_based_on_3pts(const_float_t z1, const_float_t z2, const_float_t z3); static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { @@ -103,12 +103,12 @@ public: static mesh_index_pair find_furthest_invalid_mesh_point() _O0; static void reset(); static void invalidate(); - static void set_all_mesh_points_to_value(const float value); - static void adjust_mesh_to_mean(const bool cflag, const float value); + static void set_all_mesh_points_to_value(const_float_t value); + static void adjust_mesh_to_mean(const bool cflag, const_float_t value); static bool sanity_check(); static void G29() _O0; // O0 for no optimization - static void smart_fill_wlsf(const float &) _O2; // O2 gives smaller code than Os on A2560 + static void smart_fill_wlsf(const_float_t ) _O2; // O2 gives smaller code than Os on A2560 static int8_t storage_slot; @@ -131,42 +131,42 @@ public: unified_bed_leveling(); - FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const_float_t z) { z_values[px][py] = z; } - static int8_t cell_index_x_raw(const float &x) { + static int8_t cell_index_x_raw(const_float_t x) { return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)); } - static int8_t cell_index_y_raw(const float &y) { + static int8_t cell_index_y_raw(const_float_t y) { return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)); } - static int8_t cell_index_x_valid(const float &x) { + static int8_t cell_index_x_valid(const_float_t x) { return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); } - static int8_t cell_index_y_valid(const float &y) { + static int8_t cell_index_y_valid(const_float_t y) { return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); } - static int8_t cell_index_x(const float &x) { + static int8_t cell_index_x(const_float_t x) { return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); } - static int8_t cell_index_y(const float &y) { + static int8_t cell_index_y(const_float_t y) { return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); } - static inline xy_int8_t cell_indexes(const float &x, const float &y) { + static inline xy_int8_t cell_indexes(const_float_t x, const_float_t y) { return { cell_index_x(x), cell_index_y(y) }; } static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } - static int8_t closest_x_index(const float &x) { + static int8_t closest_x_index(const_float_t x) { const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; } - static int8_t closest_y_index(const float &y) { + static int8_t closest_y_index(const_float_t y) { const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; } @@ -189,7 +189,7 @@ public: * It is fairly expensive with its 4 floating point additions and 2 floating point * multiplications. */ - FORCE_INLINE static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { + FORCE_INLINE static float calc_z0(const_float_t a0, const_float_t a1, const_float_t z1, const_float_t a2, const_float_t z2) { return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1); } @@ -203,7 +203,7 @@ public: * z_correction_for_x_on_horizontal_mesh_line is an optimization for * the case where the printer is making a vertical line that only crosses horizontal mesh lines. */ - static inline float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) { + static inline float z_correction_for_x_on_horizontal_mesh_line(const_float_t rx0, const int x1_i, const int yi) { if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { if (DEBUGGING(LEVELING)) { @@ -226,7 +226,7 @@ public: // // See comments above for z_correction_for_x_on_horizontal_mesh_line // - static inline float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) { + static inline float z_correction_for_y_on_vertical_mesh_line(const_float_t ry0, const int xi, const int y1_i) { if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { if (DEBUGGING(LEVELING)) { @@ -252,7 +252,7 @@ public: * Z-Height at both ends. Then it does a linear interpolation of these heights based * on the Y position within the cell. */ - static float get_z_correction(const float &rx0, const float &ry0) { + static float get_z_correction(const_float_t rx0, const_float_t ry0) { const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped /** @@ -309,9 +309,9 @@ public: } #if UBL_SEGMENTED - static bool line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s); + static bool line_to_destination_segmented(const_feedRate_t scaled_fr_mm_s); #else - static void line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t e); + static void line_to_destination_cartesian(const_feedRate_t scaled_fr_mm_s, const uint8_t e); #endif static inline bool mesh_is_valid() { diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 3282ebe620..545d95676e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -672,7 +672,7 @@ void unified_bed_leveling::G29() { * G29 P5 C : Adjust Mesh To Mean (and subtract the given offset). * Find the mean average and shift the mesh to center on that value. */ -void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float offset) { +void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t offset) { float sum = 0; int n = 0; GRID_LOOP(x, y) @@ -821,7 +821,7 @@ void set_message_with_feedback(PGM_P const msg_P) { return false; } - void unified_bed_leveling::move_z_with_encoder(const float &multiplier) { + void unified_bed_leveling::move_z_with_encoder(const_float_t multiplier) { ui.wait_for_release(); while (!ui.button_pressed()) { idle(); @@ -883,7 +883,7 @@ void set_message_with_feedback(PGM_P const msg_P) { * Move to INVALID points and * NOTE: Blocks the G-code queue and captures Marlin UI during use. */ - void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { + void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const_float_t z_clearance, const_float_t thick, const bool do_ubl_mesh_map) { ui.capture(); save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained @@ -1633,10 +1633,10 @@ void unified_bed_leveling::smart_fill_mesh() { */ #ifdef VALIDATE_MESH_TILT auto d_from = []{ DEBUG_ECHOPGM("D from "); }; - auto normed = [&](const xy_pos_t &pos, const float &zadd) { + auto normed = [&](const xy_pos_t &pos, const_float_t zadd) { return normal.x * pos.x + normal.y * pos.y + zadd; }; - auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { + auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const_float_t zadd) { d_from(); SERIAL_ECHOPGM_P(pre); DEBUG_ECHO_F(normed(pos, zadd), 6); DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); @@ -1658,7 +1658,7 @@ void unified_bed_leveling::smart_fill_mesh() { #endif // HAS_BED_PROBE #if ENABLED(UBL_G29_P31) - void unified_bed_leveling::smart_fill_wlsf(const float &weight_factor) { + void unified_bed_leveling::smart_fill_wlsf(const_float_t weight_factor) { // For each undefined mesh point, compute a distance-weighted least squares fit // from all the originally populated mesh points, weighted toward the point diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 33b4f03ac2..4e522210d0 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -37,7 +37,7 @@ #if !UBL_SEGMENTED - void unified_bed_leveling::line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t extruder) { + void unified_bed_leveling::line_to_destination_cartesian(const_feedRate_t scaled_fr_mm_s, const uint8_t extruder) { /** * Much of the nozzle movement will be within the same cell. So we will do as little computation * as possible to determine if this is the case. If this move is within the same cell, we will @@ -323,7 +323,7 @@ * Returns true if did NOT move, false if moved (requires current_position update). */ - bool _O2 unified_bed_leveling::line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s) { + bool _O2 unified_bed_leveling::line_to_destination_segmented(const_feedRate_t scaled_fr_mm_s) { if (!position_is_reachable(destination)) // fail if moving outside reachable boundary return true; // did not move, so current_position still accurate diff --git a/Marlin/src/feature/encoder_i2c.h b/Marlin/src/feature/encoder_i2c.h index e771130391..20871af98c 100644 --- a/Marlin/src/feature/encoder_i2c.h +++ b/Marlin/src/feature/encoder_i2c.h @@ -188,7 +188,7 @@ class I2CPositionEncoder { FORCE_INLINE void set_ec_method(const byte method) { ecMethod = method; } FORCE_INLINE float get_ec_threshold() { return ecThreshold; } - FORCE_INLINE void set_ec_threshold(const float newThreshold) { ecThreshold = newThreshold; } + FORCE_INLINE void set_ec_threshold(const_float_t newThreshold) { ecThreshold = newThreshold; } FORCE_INLINE int get_encoder_ticks_mm() { switch (type) { diff --git a/Marlin/src/feature/filwidth.h b/Marlin/src/feature/filwidth.h index ef3859df71..e63d3d719f 100644 --- a/Marlin/src/feature/filwidth.h +++ b/Marlin/src/feature/filwidth.h @@ -78,7 +78,7 @@ public: static inline void update_measured_mm() { measured_mm = raw_to_mm(); } // Update ring buffer used to delay filament measurements - static inline void advance_e(const float &e_move) { + static inline void advance_e(const_float_t e_move) { // Increment counters with the E distance e_count += e_move; diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index 32c6862704..fe7db9a8e4 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -40,7 +40,7 @@ PrinterEventLEDs printerEventLEDs; uint8_t PrinterEventLEDs::old_intensity = 0; - inline uint8_t pel_intensity(const float &start, const float ¤t, const float &target) { + inline uint8_t pel_intensity(const_float_t start, const_float_t current, const_float_t target) { if (uint16_t(start) == uint16_t(target)) return 255; return (uint8_t)map(constrain(current, start, target), start, target, 0.f, 255.f); } @@ -58,7 +58,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_TEMP_HOTEND - void PrinterEventLEDs::onHotendHeating(const float &start, const float ¤t, const float &target) { + void PrinterEventLEDs::onHotendHeating(const_float_t start, const_float_t current, const_float_t target) { const uint8_t blue = pel_intensity(start, current, target); if (blue != old_intensity) { old_intensity = blue; @@ -70,7 +70,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_HEATED_BED - void PrinterEventLEDs::onBedHeating(const float &start, const float ¤t, const float &target) { + void PrinterEventLEDs::onBedHeating(const_float_t start, const_float_t current, const_float_t target) { const uint8_t red = pel_intensity(start, current, target); if (red != old_intensity) { old_intensity = red; @@ -82,7 +82,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_HEATED_CHAMBER - void PrinterEventLEDs::onChamberHeating(const float &start, const float ¤t, const float &target) { + void PrinterEventLEDs::onChamberHeating(const_float_t start, const_float_t current, const_float_t target) { const uint8_t green = pel_intensity(start, current, target); if (green != old_intensity) { old_intensity = green; diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index 668c9c969b..a262ddf85e 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -47,17 +47,17 @@ private: public: #if HAS_TEMP_HOTEND static inline LEDColor onHotendHeatingStart() { old_intensity = 0; return leds.get_color(); } - static void onHotendHeating(const float &start, const float ¤t, const float &target); + static void onHotendHeating(const_float_t start, const_float_t current, const_float_t target); #endif #if HAS_HEATED_BED static inline LEDColor onBedHeatingStart() { old_intensity = 127; return leds.get_color(); } - static void onBedHeating(const float &start, const float ¤t, const float &target); + static void onBedHeating(const_float_t start, const_float_t current, const_float_t target); #endif #if HAS_HEATED_CHAMBER static inline LEDColor onChamberHeatingStart() { old_intensity = 127; return leds.get_color(); } - static void onChamberHeating(const float &start, const float ¤t, const float &target); + static void onChamberHeating(const_float_t start, const_float_t current, const_float_t target); #endif #if HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index d7433cb7d9..200e6b580d 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -256,7 +256,7 @@ void Max7219::set(const uint8_t line, const uint8_t bits) { } // Draw a float with a decimal point and optional digits - void Max7219::print(const uint8_t start, const float value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false) { + void Max7219::print(const uint8_t start, const_float_t value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false) { if (pre_size) print(start, value, pre_size, leadzero, !!post_size); if (post_size) { const int16_t after = ABS(value) * (10 ^ post_size); diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h index 8e98c9456c..3e5b62db2f 100644 --- a/Marlin/src/feature/max7219.h +++ b/Marlin/src/feature/max7219.h @@ -100,6 +100,13 @@ public: // Update a single native line on just one unit static void refresh_unit_line(const uint8_t line); + #if ENABLED(MAX7219_NUMERIC) + // Draw an integer with optional leading zeros and optional decimal point + void print(const uint8_t start, int16_t value, uint8_t size, const bool leadzero=false, bool dec=false); + // Draw a float with a decimal point and optional digits + void print(const uint8_t start, const_float_t value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false); + #endif + // Set a single LED by XY coordinate static void led_set(const uint8_t x, const uint8_t y, const bool on); static void led_on(const uint8_t x, const uint8_t y); diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index 722020ba8a..4823ac2c60 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -162,7 +162,7 @@ void Mixer::refresh_collector(const float proportion/*=1.0*/, const uint8_t t/*= float Mixer::prev_z; // = 0 - void Mixer::update_gradient_for_z(const float z) { + void Mixer::update_gradient_for_z(const_float_t z) { if (z == prev_z) return; prev_z = z; diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 5de039985d..573b61cb68 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -180,9 +180,9 @@ class Mixer { static float prev_z; // Update the current mix from the gradient for a given Z - static void update_gradient_for_z(const float z); + static void update_gradient_for_z(const_float_t z); static void update_gradient_for_planner_z(); - static inline void gradient_control(const float z) { + static inline void gradient_control(const_float_t z) { if (gradient.enabled) { if (z >= gradient.end_z) T(gradient.end_vtool); diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index a934b0ead0..5990c09a90 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -170,7 +170,7 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P * * Returns 'true' if load was completed, 'false' for abort */ -bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=0*/, const int8_t max_beep_count/*=0*/, +bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load_length/*=0*/, const_float_t purge_length/*=0*/, const int8_t max_beep_count/*=0*/, const bool show_lcd/*=false*/, const bool pause_for_user/*=false*/, const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ DXC_ARGS @@ -298,10 +298,10 @@ inline void disable_active_extruder() { * * Returns 'true' if unload was completed, 'false' for abort */ -bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, +bool unload_filament(const_float_t unload_length, const bool show_lcd/*=false*/, const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - , const float &mix_multiplier/*=1.0*/ + , const_float_t mix_multiplier/*=1.0*/ #endif ) { DEBUG_SECTION(uf, "unload_filament", true); @@ -367,7 +367,7 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, */ uint8_t did_pause_print = 0; -bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { +bool pause_print(const_float_t retract, const xyz_pos_t &park_point, const_float_t unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { DEBUG_SECTION(pp, "pause_print", true); DEBUG_ECHOLNPAIR("... park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", show_lcd DXC_SAY); @@ -555,7 +555,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep * - Send host action for resume, if configured * - Resume the current SD print job, if any */ -void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, const celsius_t targetTemp/*=0*/ DXC_ARGS) { +void resume_print(const_float_t slow_load_length/*=0*/, const_float_t fast_load_length/*=0*/, const_float_t purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, const celsius_t targetTemp/*=0*/ DXC_ARGS) { DEBUG_SECTION(rp, "resume_print", true); DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", max_beep_count, " targetTemp:", targetTemp DXC_SAY); diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 4ab33ac519..2a7ea40b83 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -85,19 +85,19 @@ extern uint8_t did_pause_print; #define DXC_SAY #endif -bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length=0, const bool show_lcd=false DXC_PARAMS); +bool pause_print(const_float_t retract, const xyz_pos_t &park_point, const_float_t unload_length=0, const bool show_lcd=false DXC_PARAMS); void wait_for_confirmation(const bool is_reload=false, const int8_t max_beep_count=0 DXC_PARAMS); -void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, +void resume_print(const_float_t slow_load_length=0, const_float_t fast_load_length=0, const_float_t extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0, const celsius_t targetTemp=0 DXC_PARAMS); -bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, +bool load_filament(const_float_t slow_load_length=0, const_float_t fast_load_length=0, const_float_t extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, const bool pause_for_user=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); -bool unload_filament(const float &unload_length, const bool show_lcd=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT +bool unload_filament(const_float_t unload_length, const bool show_lcd=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - , const float &mix_multiplier=1.0 + , const_float_t mix_multiplier=1.0 #endif ); diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index cc45d6ecf0..e45864b484 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -240,7 +240,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ #if ENABLED(BACKUP_POWER_SUPPLY) - void PrintJobRecovery::retract_and_lift(const float &zraise) { + void PrintJobRecovery::retract_and_lift(const_float_t zraise) { #if POWER_LOSS_RETRACT_LEN || POWER_LOSS_ZRAISE gcode.set_relative_mode(true); // Use relative coordinates diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 7c09c0f3cf..ad34de6e53 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -199,7 +199,7 @@ class PrintJobRecovery { static void write(); #if ENABLED(BACKUP_POWER_SUPPLY) - static void retract_and_lift(const float &zraise); + static void retract_and_lift(const_float_t zraise); #endif #if PIN_EXISTS(POWER_LOSS) diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index 8fdf160d0f..b0867817b6 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -88,12 +88,12 @@ void ProbeTempComp::print_offsets() { } } -void ProbeTempComp::prepare_new_calibration(const float &init_meas_z) { +void ProbeTempComp::prepare_new_calibration(const_float_t init_meas_z) { calib_idx = 0; init_measurement = init_meas_z; } -void ProbeTempComp::push_back_new_measurement(const TempSensorID tsi, const float &meas_z) { +void ProbeTempComp::push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z) { switch (tsi) { case TSI_PROBE: case TSI_BED: @@ -159,12 +159,12 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { return true; } -void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const float &temp, float &meas_z) { +void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const_float_t temp, float &meas_z) { if (WITHIN(temp, cali_info[tsi].start_temp, cali_info[tsi].end_temp)) meas_z -= get_offset_for_temperature(tsi, temp); } -float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const float &temp) { +float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const_float_t temp) { const uint8_t measurements = cali_info[tsi].measurements; const float start_temp = cali_info[tsi].start_temp, res_temp = cali_info[tsi].temp_res; diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h index 626dd87f94..e29da7ece1 100644 --- a/Marlin/src/feature/probe_temp_comp.h +++ b/Marlin/src/feature/probe_temp_comp.h @@ -121,10 +121,10 @@ class ProbeTempComp { } static bool set_offset(const TempSensorID tsi, const uint8_t idx, const int16_t offset); static void print_offsets(); - static void prepare_new_calibration(const float &init_meas_z); - static void push_back_new_measurement(const TempSensorID tsi, const float &meas_z); + static void prepare_new_calibration(const_float_t init_meas_z); + static void push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z); static bool finish_calibration(const TempSensorID tsi); - static void compensate_measurement(const TempSensorID tsi, const float &temp, float &meas_z); + static void compensate_measurement(const TempSensorID tsi, const_float_t temp, float &meas_z); private: static uint8_t calib_idx; @@ -135,7 +135,7 @@ class ProbeTempComp { */ static float init_measurement; - static float get_offset_for_temperature(const TempSensorID tsi, const float &temp); + static float get_offset_for_temperature(const TempSensorID tsi, const_float_t temp); /** * Fit a linear function in measured temperature offsets diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 0c35ef6659..15bf607550 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -101,7 +101,7 @@ class TFilamentMonitor : public FilamentMonitorBase { #if HAS_FILAMENT_RUNOUT_DISTANCE static inline float& runout_distance() { return response.runout_distance_mm; } - static inline void set_runout_distance(const float &mm) { response.runout_distance_mm = mm; } + static inline void set_runout_distance(const_float_t mm) { response.runout_distance_mm = mm; } #endif // Handle a block completion. RunoutResponseDelayed uses this to diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index b3d008851c..bf7106fab7 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -53,7 +53,7 @@ public: min_pct = TERN(CUTTER_POWER_RELATIVE, 0, TERN(SPINDLE_FEATURE, round(100.0f * (SPEED_POWER_MIN) / (SPEED_POWER_MAX)), SPEED_POWER_MIN)), max_pct = TERN(SPINDLE_FEATURE, 100, SPEED_POWER_MAX); - static const inline uint8_t pct_to_ocr(const float pct) { return uint8_t(PCT_TO_PWM(pct)); } + static const inline uint8_t pct_to_ocr(const_float_t pct) { return uint8_t(PCT_TO_PWM(pct)); } // cpower = configured values (e.g., SPEED_POWER_MAX) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 0468b79363..e05336d6c5 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -212,7 +212,7 @@ mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { return out_point; } -void move_to(const float &rx, const float &ry, const float &z, const float &e_delta) { +void move_to(const_float_t rx, const_float_t ry, const_float_t z, const_float_t e_delta) { static float last_z = -999.99; const xy_pos_t dest = { rx, ry }; @@ -239,7 +239,7 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de prepare_internal_move_to_destination(fr_mm_s); } -FORCE_INLINE void move_to(const xyz_pos_t &where, const float &de) { move_to(where.x, where.y, where.z, de); } +FORCE_INLINE void move_to(const xyz_pos_t &where, const_float_t de) { move_to(where.x, where.y, where.z, de); } void retract_filament(const xyz_pos_t &where) { if (!g26_retracted) { // Only retract if we are not already retracted! diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 902711397d..1b8eb889c6 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -93,7 +93,7 @@ void ac_cleanup(TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index)) { TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, true)); } -void print_signed_float(PGM_P const prefix, const float &f) { +void print_signed_float(PGM_P const prefix, const_float_t f) { SERIAL_ECHOPGM(" "); SERIAL_ECHOPGM_P(prefix); SERIAL_CHAR(':'); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index a97283b3e7..1614dd6fbd 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -312,7 +312,7 @@ void GcodeSuite::G34() { ui.set_status(msg); #endif - auto decreasing_accuracy = [](const float &v1, const float &v2){ + auto decreasing_accuracy = [](const_float_t v1, const_float_t v2){ if (v1 < v2 * 0.7f) { SERIAL_ECHOLNPGM("Decreasing Accuracy Detected."); LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY); diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 0c3da13bf9..19b11f602a 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -117,7 +117,7 @@ void GcodeSuite::M48() { max = -99999.9, // Largest value sampled so far sample_set[n_samples]; // Storage for sampled values - auto dev_report = [](const bool verbose, const float &mean, const float &sigma, const float &min, const float &max, const bool final=false) { + auto dev_report = [](const bool verbose, const_float_t mean, const_float_t sigma, const_float_t min, const_float_t max, const bool final=false) { if (verbose) { SERIAL_ECHOPAIR_F("Mean: ", mean, 6); if (!final) SERIAL_ECHOPAIR_F(" Sigma: ", sigma, 6); diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp index fc350d8a55..f5c910a9e9 100644 --- a/Marlin/src/gcode/feature/camera/M240.cpp +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -47,7 +47,7 @@ #endif #ifdef PHOTO_RETRACT_MM - inline void e_move_m240(const float length, const feedRate_t &fr_mm_s) { + inline void e_move_m240(const float length, const_feedRate_t fr_mm_s) { if (length && thermalManager.hotEnoughToExtrude(active_extruder)) unscaled_e_move(length, fr_mm_s); } diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp index 3f2b8b79e8..5f788344eb 100644 --- a/Marlin/src/gcode/feature/mixing/M166.cpp +++ b/Marlin/src/gcode/feature/mixing/M166.cpp @@ -33,7 +33,7 @@ inline void echo_mix() { SERIAL_ECHOPAIR(" (", mixer.mix[0], "%|", mixer.mix[1], "%)"); } -inline void echo_zt(const int t, const float &z) { +inline void echo_zt(const int t, const_float_t z) { mixer.update_mix_from_vtool(t); SERIAL_ECHOPAIR_P(SP_Z_STR, z, SP_T_STR, t); echo_mix(); diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index 1cae8d11a2..7dd89a6fac 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -39,7 +39,7 @@ #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - FORCE_INLINE void mod_probe_offset(const float &offs) { + FORCE_INLINE void mod_probe_offset(const_float_t offs) { if (TERN1(BABYSTEP_HOTEND_Z_OFFSET, active_extruder == 0)) { probe.offset.z += offs; SERIAL_ECHO_MSG(STR_PROBE_OFFSET " " STR_Z, probe.offset.z); diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index ed503f8a90..a0fc67b9e5 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -282,8 +282,8 @@ public: // Units modes: Inches, Fahrenheit, Kelvin #if ENABLED(INCH_MODE_SUPPORT) - static inline float mm_to_linear_unit(const float mm) { return mm / linear_unit_factor; } - static inline float mm_to_volumetric_unit(const float mm) { return mm / (volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } + static inline float mm_to_linear_unit(const_float_t mm) { return mm / linear_unit_factor; } + static inline float mm_to_volumetric_unit(const_float_t mm) { return mm / (volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } // Init linear units by constructor GCodeParser() { set_input_linear_units(LINEARUNIT_MM); } @@ -301,16 +301,16 @@ public: return (axis >= E_AXIS && volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } - static inline float linear_value_to_mm(const float v) { return v * linear_unit_factor; } + static inline float linear_value_to_mm(const_float_t v) { return v * linear_unit_factor; } static inline float axis_value_to_mm(const AxisEnum axis, const float v) { return v * axis_unit_factor(axis); } static inline float per_axis_value(const AxisEnum axis, const float v) { return v / axis_unit_factor(axis); } #else - static inline float mm_to_linear_unit(const float mm) { return mm; } - static inline float mm_to_volumetric_unit(const float mm) { return mm; } + static inline float mm_to_linear_unit(const_float_t mm) { return mm; } + static inline float mm_to_volumetric_unit(const_float_t mm) { return mm; } - static inline float linear_value_to_mm(const float v) { return v; } + static inline float linear_value_to_mm(const_float_t v) { return v; } static inline float axis_value_to_mm(const AxisEnum, const float v) { return v; } static inline float per_axis_value(const AxisEnum, const float v) { return v; } diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index c2d2cf43af..e41ed62573 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -669,7 +669,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop B00001100,B00000000 }; - void _lcd_zoffset_overlay_gfx(const float zvalue) { + void _lcd_zoffset_overlay_gfx(const_float_t zvalue) { // Determine whether the user is raising or lowering the nozzle. static int8_t dir; static float old_zvalue; diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index a424327b08..10c791cbc5 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -101,7 +101,7 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); } diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp index 939199db93..a98da07959 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp @@ -93,7 +93,7 @@ namespace ExtUI { void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated } #endif diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index 273a8d2d2a..73542090c5 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -111,7 +111,7 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated } diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp index 415d381dd6..38986fba73 100644 --- a/Marlin/src/lcd/extui/example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -97,7 +97,7 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index d8abfcd29a..10c873d19c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -140,7 +140,7 @@ namespace ExtUI { #if HAS_LEVELING && HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t x, const int8_t y, const float &val) { + void onMeshUpdate(const int8_t x, const int8_t y, const_float_t val) { BedMeshScreen::onMeshUpdate(x, y, val); } diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index d684ebd017..780401964b 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -528,7 +528,7 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) {} + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) {} void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) {} #endif diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 23930c04f3..2eecda9df0 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -325,7 +325,7 @@ namespace ExtUI { return epos; } - void setAxisPosition_mm(const float &position, const axis_t axis, const feedRate_t feedrate/*=0*/) { + void setAxisPosition_mm(const_float_t position, const axis_t axis, const feedRate_t feedrate/*=0*/) { // Get motion limit from software endstops, if any float min, max; soft_endstop.get_manual_axis_limits((AxisEnum)axis, min, max); @@ -343,7 +343,7 @@ namespace ExtUI { line_to_current_position(feedrate ?: manual_feedrate_mm_s[axis]); } - void setAxisPosition_mm(const float &position, const extruder_t extruder, const feedRate_t feedrate/*=0*/) { + void setAxisPosition_mm(const_float_t position, const extruder_t extruder, const feedRate_t feedrate/*=0*/) { setActiveTool(extruder, true); current_position.e = position; @@ -455,7 +455,7 @@ namespace ExtUI { }; } - void setAxisCurrent_mA(const float &mA, const axis_t axis) { + void setAxisCurrent_mA(const_float_t mA, const axis_t axis) { switch (axis) { #if AXIS_IS_TMC(X) case X: stepperX.rms_current(constrain(mA, 400, 1500)); break; @@ -479,7 +479,7 @@ namespace ExtUI { }; } - void setAxisCurrent_mA(const float &mA, const extruder_t extruder) { + void setAxisCurrent_mA(const_float_t mA, const extruder_t extruder) { switch (extruder) { #if AXIS_IS_TMC(E0) case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break; @@ -539,7 +539,7 @@ namespace ExtUI { } } - void setTMCBumpSensitivity(const float &value, const axis_t axis) { + void setTMCBumpSensitivity(const_float_t value, const axis_t axis) { switch (axis) { #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS #if X_SENSORLESS @@ -583,12 +583,12 @@ namespace ExtUI { return planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)]; } - void setAxisSteps_per_mm(const float &value, const axis_t axis) { + void setAxisSteps_per_mm(const_float_t value, const axis_t axis) { planner.settings.axis_steps_per_mm[axis] = value; planner.refresh_positioning(); } - void setAxisSteps_per_mm(const float &value, const extruder_t extruder) { + void setAxisSteps_per_mm(const_float_t value, const extruder_t extruder) { UNUSED_E(extruder); planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)] = value; planner.refresh_positioning(); @@ -621,11 +621,11 @@ namespace ExtUI { return planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(extruder - E0)]; } - void setAxisMaxAcceleration_mm_s2(const float &value, const axis_t axis) { + void setAxisMaxAcceleration_mm_s2(const_float_t value, const axis_t axis) { planner.set_max_acceleration(axis, value); } - void setAxisMaxAcceleration_mm_s2(const float &value, const extruder_t extruder) { + void setAxisMaxAcceleration_mm_s2(const_float_t value, const extruder_t extruder) { UNUSED_E(extruder); planner.set_max_acceleration(E_AXIS_N(extruder - E0), value); } @@ -638,7 +638,7 @@ namespace ExtUI { #if HAS_FILAMENT_RUNOUT_DISTANCE float getFilamentRunoutDistance_mm() { return runout.runout_distance(); } - void setFilamentRunoutDistance_mm(const float &value) { runout.set_runout_distance(constrain(value, 0, 999)); } + void setFilamentRunoutDistance_mm(const_float_t value) { runout.set_runout_distance(constrain(value, 0, 999)); } #endif #endif @@ -651,7 +651,7 @@ namespace ExtUI { #if CASELIGHT_USES_BRIGHTNESS float getCaseLightBrightness_percent() { return ui8_to_percent(caselight.brightness); } - void setCaseLightBrightness_percent(const float &value) { + void setCaseLightBrightness_percent(const_float_t value) { caselight.brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); caselight.update_brightness(); } @@ -663,7 +663,7 @@ namespace ExtUI { return (extruder < EXTRUDERS) ? planner.extruder_advance_K[extruder - E0] : 0; } - void setLinearAdvance_mm_mm_s(const float &value, const extruder_t extruder) { + void setLinearAdvance_mm_mm_s(const_float_t value, const extruder_t extruder) { if (extruder < EXTRUDERS) planner.extruder_advance_K[extruder - E0] = constrain(value, 0, 10); } @@ -675,7 +675,7 @@ namespace ExtUI { return planner.junction_deviation_mm; } - void setJunctionDeviation_mm(const float &value) { + void setJunctionDeviation_mm(const_float_t value) { planner.junction_deviation_mm = constrain(value, 0.001, 0.3); TERN_(LIN_ADVANCE, planner.recalculate_max_e_jerk()); } @@ -683,8 +683,8 @@ namespace ExtUI { #else float getAxisMaxJerk_mm_s(const axis_t axis) { return planner.max_jerk[axis]; } float getAxisMaxJerk_mm_s(const extruder_t) { return planner.max_jerk.e; } - void setAxisMaxJerk_mm_s(const float &value, const axis_t axis) { planner.set_max_jerk((AxisEnum)axis, value); } - void setAxisMaxJerk_mm_s(const float &value, const extruder_t) { planner.set_max_jerk(E_AXIS, value); } + void setAxisMaxJerk_mm_s(const_float_t value, const axis_t axis) { planner.set_max_jerk((AxisEnum)axis, value); } + void setAxisMaxJerk_mm_s(const_float_t value, const extruder_t) { planner.set_max_jerk(E_AXIS, value); } #endif #if ENABLED(DUAL_X_CARRIAGE) @@ -709,9 +709,9 @@ namespace ExtUI { void setFlow_percent(const int16_t flow, const extruder_t extr) { planner.set_flow(extr, flow); } void setMinFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_feedrate_mm_s = fr; } void setMinTravelFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_travel_feedrate_mm_s = fr; } - void setPrintingAcceleration_mm_s2(const float &acc) { planner.settings.acceleration = acc; } - void setRetractAcceleration_mm_s2(const float &acc) { planner.settings.retract_acceleration = acc; } - void setTravelAcceleration_mm_s2(const float &acc) { planner.settings.travel_acceleration = acc; } + void setPrintingAcceleration_mm_s2(const_float_t acc) { planner.settings.acceleration = acc; } + void setRetractAcceleration_mm_s2(const_float_t acc) { planner.settings.retract_acceleration = acc; } + void setTravelAcceleration_mm_s2(const_float_t acc) { planner.settings.travel_acceleration = acc; } #if ENABLED(BABYSTEPPING) @@ -772,7 +772,7 @@ namespace ExtUI { * Converts a mm displacement to a number of whole number of * steps that is at least mm long. */ - int16_t mmToWholeSteps(const float &mm, const axis_t axis) { + int16_t mmToWholeSteps(const_float_t mm, const axis_t axis) { const float steps = mm / planner.steps_to_mm[axis]; return steps > 0 ? CEIL(steps) : FLOOR(steps); } @@ -789,7 +789,7 @@ namespace ExtUI { ); } - void setZOffset_mm(const float &value) { + void setZOffset_mm(const_float_t value) { #if HAS_BED_PROBE if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) probe.offset.z = value; @@ -807,7 +807,7 @@ namespace ExtUI { return hotend_offset[extruder - E0][axis]; } - void setNozzleOffset_mm(const float &value, const axis_t axis, const extruder_t extruder) { + void setNozzleOffset_mm(const_float_t value, const axis_t axis, const extruder_t extruder) { if (extruder - E0 >= HOTENDS) return; hotend_offset[extruder - E0][axis] = value; } @@ -826,20 +826,20 @@ namespace ExtUI { #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t axis) { return probe.offset.pos[axis]; } - void setProbeOffset_mm(const float &val, const axis_t axis) { probe.offset.pos[axis] = val; } + void setProbeOffset_mm(const_float_t val, const axis_t axis) { probe.offset.pos[axis] = val; } #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t axis) { return backlash.distance_mm[axis]; } - void setAxisBacklash_mm(const float &value, const axis_t axis) + void setAxisBacklash_mm(const_float_t value, const axis_t axis) { backlash.distance_mm[axis] = constrain(value,0,5); } float getBacklashCorrection_percent() { return ui8_to_percent(backlash.correction); } - void setBacklashCorrection_percent(const float &value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } + void setBacklashCorrection_percent(const_float_t value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } #ifdef BACKLASH_SMOOTHING_MM float getBacklashSmoothing_mm() { return backlash.smoothing_mm; } - void setBacklashSmoothing_mm(const float &value) { backlash.smoothing_mm = constrain(value, 0, 999); } + void setBacklashSmoothing_mm(const_float_t value) { backlash.smoothing_mm = constrain(value, 0, 999); } #endif #endif @@ -858,14 +858,14 @@ namespace ExtUI { bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } - void setMeshPoint(const xy_uint8_t &pos, const float &zoff) { + void setMeshPoint(const xy_uint8_t &pos, const_float_t zoff) { if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { Z_VALUES(pos.x, pos.y) = zoff; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); } } - void moveToMeshPoint(const xy_uint8_t &pos, const float &z) { + void moveToMeshPoint(const xy_uint8_t &pos, const_float_t z) { #if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) const feedRate_t old_feedrate = feedrate_mm_s; const float x_target = MESH_MIN_X + pos.x * (MESH_X_DIST), @@ -919,14 +919,14 @@ namespace ExtUI { float getPIDValues_Ki(const extruder_t tool) { return unscalePID_i(PID_PARAM(Ki, tool)); } float getPIDValues_Kd(const extruder_t tool) { return unscalePID_d(PID_PARAM(Kd, tool)); } - void setPIDValues(const float &p, const float &i, const float &d, extruder_t tool) { + void setPIDValues(const_float_t p, const_float_t i, const_float_t d, extruder_t tool) { thermalManager.temp_hotend[tool].pid.Kp = p; thermalManager.temp_hotend[tool].pid.Ki = scalePID_i(i); thermalManager.temp_hotend[tool].pid.Kd = scalePID_d(d); thermalManager.updatePID(); } - void startPIDTune(const float &temp, extruder_t tool) { + void startPIDTune(const_float_t temp, extruder_t tool) { thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true); } #endif @@ -936,14 +936,14 @@ namespace ExtUI { float getBedPIDValues_Ki() { return unscalePID_i(thermalManager.temp_bed.pid.Ki); } float getBedPIDValues_Kd() { return unscalePID_d(thermalManager.temp_bed.pid.Kd); } - void setBedPIDValues(const float &p, const float &i, const float &d) { + void setBedPIDValues(const_float_t p, const_float_t i, const_float_t d) { thermalManager.temp_bed.pid.Kp = p; thermalManager.temp_bed.pid.Ki = scalePID_i(i); thermalManager.temp_bed.pid.Kd = scalePID_d(d); thermalManager.updatePID(); } - void startBedPIDTune(const float &temp) { + void startBedPIDTune(const_float_t temp) { thermalManager.PID_autotune(temp, H_BED, 4, true); } #endif @@ -963,7 +963,7 @@ namespace ExtUI { return firmware_name; } - void setTargetTemp_celsius(const float &inval, const heater_t heater) { + void setTargetTemp_celsius(const_float_t inval, const heater_t heater) { float value = inval; #ifdef TOUCH_UI_LCD_TEMP_SCALING value *= TOUCH_UI_LCD_TEMP_SCALING; @@ -988,7 +988,7 @@ namespace ExtUI { } } - void setTargetTemp_celsius(const float &inval, const extruder_t extruder) { + void setTargetTemp_celsius(const_float_t inval, const extruder_t extruder) { float value = inval; #ifdef TOUCH_UI_LCD_TEMP_SCALING value *= TOUCH_UI_LCD_TEMP_SCALING; @@ -1000,7 +1000,7 @@ namespace ExtUI { #endif } - void setTargetFan_percent(const float &value, const fan_t fan) { + void setTargetFan_percent(const_float_t value, const fan_t fan) { #if HAS_FAN if (fan < FAN_COUNT) thermalManager.set_fan_speed(fan - FAN0, map(constrain(value, 0, 100), 0, 100, 0, 255)); @@ -1010,7 +1010,7 @@ namespace ExtUI { #endif } - void setFeedrate_percent(const float &value) { feedrate_percentage = constrain(value, 10, 500); } + void setFeedrate_percent(const_float_t value) { feedrate_percentage = constrain(value, 10, 500); } void coolDown() { #if HAS_HOTEND diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index ea49a3b63d..24bf284648 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -102,11 +102,11 @@ namespace ExtUI { #if HAS_TRINAMIC_CONFIG float getAxisCurrent_mA(const axis_t); float getAxisCurrent_mA(const extruder_t); - void setAxisCurrent_mA(const float&, const axis_t); - void setAxisCurrent_mA(const float&, const extruder_t); + void setAxisCurrent_mA(const_float_t , const axis_t); + void setAxisCurrent_mA(const_float_t , const extruder_t); int getTMCBumpSensitivity(const axis_t); - void setTMCBumpSensitivity(const float&, const axis_t); + void setTMCBumpSensitivity(const_float_t , const axis_t); #endif float getActualTemp_celsius(const heater_t); @@ -161,11 +161,11 @@ namespace ExtUI { #if HAS_MESH bed_mesh_t& getMeshArray(); float getMeshPoint(const xy_uint8_t &pos); - void setMeshPoint(const xy_uint8_t &pos, const float &zval); - void moveToMeshPoint(const xy_uint8_t &pos, const float &z); + void setMeshPoint(const xy_uint8_t &pos, const_float_t zval); + void moveToMeshPoint(const xy_uint8_t &pos, const_float_t z); void onMeshLevelingStart(); - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval); - inline void onMeshUpdate(const xy_int8_t &pos, const float &zval) { onMeshUpdate(pos.x, pos.y, zval); } + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval); + inline void onMeshUpdate(const xy_int8_t &pos, const_float_t zval) { onMeshUpdate(pos.x, pos.y, zval); } typedef enum : uint8_t { MESH_START, // Prior to start of probe @@ -191,42 +191,42 @@ namespace ExtUI { char* getFilamentUsed_str(char buffer[21]); #endif - void setTargetTemp_celsius(const float&, const heater_t); - void setTargetTemp_celsius(const float&, const extruder_t); - void setTargetFan_percent(const float&, const fan_t); + void setTargetTemp_celsius(const_float_t , const heater_t); + void setTargetTemp_celsius(const_float_t , const extruder_t); + void setTargetFan_percent(const_float_t , const fan_t); void coolDown(); - void setAxisPosition_mm(const float&, const axis_t, const feedRate_t=0); - void setAxisPosition_mm(const float&, const extruder_t, const feedRate_t=0); - void setAxisSteps_per_mm(const float&, const axis_t); - void setAxisSteps_per_mm(const float&, const extruder_t); + void setAxisPosition_mm(const_float_t , const axis_t, const feedRate_t=0); + void setAxisPosition_mm(const_float_t , const extruder_t, const feedRate_t=0); + void setAxisSteps_per_mm(const_float_t , const axis_t); + void setAxisSteps_per_mm(const_float_t , const extruder_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const axis_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const extruder_t); - void setAxisMaxAcceleration_mm_s2(const float&, const axis_t); - void setAxisMaxAcceleration_mm_s2(const float&, const extruder_t); + void setAxisMaxAcceleration_mm_s2(const_float_t , const axis_t); + void setAxisMaxAcceleration_mm_s2(const_float_t , const extruder_t); void setFeedrate_mm_s(const feedRate_t); void setMinFeedrate_mm_s(const feedRate_t); void setMinTravelFeedrate_mm_s(const feedRate_t); - void setPrintingAcceleration_mm_s2(const float&); - void setRetractAcceleration_mm_s2(const float&); - void setTravelAcceleration_mm_s2(const float&); - void setFeedrate_percent(const float&); + void setPrintingAcceleration_mm_s2(const_float_t ); + void setRetractAcceleration_mm_s2(const_float_t ); + void setTravelAcceleration_mm_s2(const_float_t ); + void setFeedrate_percent(const_float_t ); void setFlow_percent(const int16_t, const extruder_t); bool awaitingUserConfirm(); void setUserConfirmed(); #if ENABLED(LIN_ADVANCE) float getLinearAdvance_mm_mm_s(const extruder_t); - void setLinearAdvance_mm_mm_s(const float&, const extruder_t); + void setLinearAdvance_mm_mm_s(const_float_t , const extruder_t); #endif #if HAS_JUNCTION_DEVIATION float getJunctionDeviation_mm(); - void setJunctionDeviation_mm(const float&); + void setJunctionDeviation_mm(const_float_t ); #else float getAxisMaxJerk_mm_s(const axis_t); float getAxisMaxJerk_mm_s(const extruder_t); - void setAxisMaxJerk_mm_s(const float&, const axis_t); - void setAxisMaxJerk_mm_s(const float&, const extruder_t); + void setAxisMaxJerk_mm_s(const_float_t , const axis_t); + void setAxisMaxJerk_mm_s(const_float_t , const extruder_t); #endif extruder_t getTool(const uint8_t extruder); @@ -234,7 +234,7 @@ namespace ExtUI { void setActiveTool(const extruder_t, bool no_move); #if ENABLED(BABYSTEPPING) - int16_t mmToWholeSteps(const float& mm, const axis_t axis); + int16_t mmToWholeSteps(const_float_t mm, const axis_t axis); bool babystepAxis_steps(const int16_t steps, const axis_t axis); void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles); @@ -242,28 +242,28 @@ namespace ExtUI { #if HAS_HOTEND_OFFSET float getNozzleOffset_mm(const axis_t, const extruder_t); - void setNozzleOffset_mm(const float&, const axis_t, const extruder_t); + void setNozzleOffset_mm(const_float_t , const axis_t, const extruder_t); void normalizeNozzleOffset(const axis_t axis); #endif float getZOffset_mm(); - void setZOffset_mm(const float&); + void setZOffset_mm(const_float_t ); #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t); - void setProbeOffset_mm(const float&, const axis_t); + void setProbeOffset_mm(const_float_t , const axis_t); #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t); - void setAxisBacklash_mm(const float&, const axis_t); + void setAxisBacklash_mm(const_float_t , const axis_t); float getBacklashCorrection_percent(); - void setBacklashCorrection_percent(const float&); + void setBacklashCorrection_percent(const_float_t ); #ifdef BACKLASH_SMOOTHING_MM float getBacklashSmoothing_mm(); - void setBacklashSmoothing_mm(const float&); + void setBacklashSmoothing_mm(const_float_t ); #endif #endif @@ -275,7 +275,7 @@ namespace ExtUI { #if HAS_FILAMENT_RUNOUT_DISTANCE float getFilamentRunoutDistance_mm(); - void setFilamentRunoutDistance_mm(const float&); + void setFilamentRunoutDistance_mm(const_float_t ); #endif #endif @@ -285,7 +285,7 @@ namespace ExtUI { #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) float getCaseLightBrightness_percent(); - void setCaseLightBrightness_percent(const float&); + void setCaseLightBrightness_percent(const_float_t ); #endif #endif @@ -293,16 +293,16 @@ namespace ExtUI { float getPIDValues_Kp(const extruder_t); float getPIDValues_Ki(const extruder_t); float getPIDValues_Kd(const extruder_t); - void setPIDValues(const float&, const float&, const float&, extruder_t); - void startPIDTune(const float&, extruder_t); + void setPIDValues(const_float_t , const_float_t , const_float_t , extruder_t); + void startPIDTune(const_float_t , extruder_t); #endif #if ENABLED(PIDTEMPBED) float getBedPIDValues_Kp(); float getBedPIDValues_Ki(); float getBedPIDValues_Kd(); - void setBedPIDValues(const float&, const float&, const float&); - void startBedPIDTune(const float&); + void setBedPIDValues(const_float_t , const_float_t , const_float_t ); + void startBedPIDTune(const_float_t ); #endif /** diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 57e6fc26e6..24fedb039e 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -501,7 +501,7 @@ public: #endif #if ENABLED(AUTO_BED_LEVELING_UBL) - static void ubl_mesh_edit_start(const float &initial); + static void ubl_mesh_edit_start(const_float_t initial); static float ubl_mesh_value(); #endif diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index add306b6e3..6143e8da1e 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -289,7 +289,7 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { #if HAS_LINE_TO_Z - void line_to_z(const float &z) { + void line_to_z(const_float_t z) { current_position.z = z; line_to_current_position(manual_feedrate_mm_s.z); } diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index cbef9b50c9..290832c49c 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -40,7 +40,7 @@ typedef void (*selectFunc_t)(); #define SS_DEFAULT SS_CENTER #if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) - void _lcd_zoffset_overlay_gfx(const float zvalue); + void _lcd_zoffset_overlay_gfx(const_float_t zvalue); #endif #if ENABLED(BABYSTEP_ZPROBE_OFFSET) && Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 @@ -212,11 +212,7 @@ void _lcd_draw_homing(); #define HAS_LINE_TO_Z ANY(DELTA, PROBE_MANUALLY, MESH_BED_LEVELING, LEVEL_BED_CORNERS) #if HAS_LINE_TO_Z - void line_to_z(const float &z); -#endif - -#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) - void _lcd_zoffset_overlay_gfx(const float zvalue); + void line_to_z(const_float_t z); #endif #if ENABLED(PROBE_OFFSET_WIZARD) diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index ef9f2246c2..b857b62de5 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -86,7 +86,7 @@ void _man_probe_pt(const xy_pos_t &xy) { ui.goto_screen(_lcd_calibrate_homing); } - void _goto_tower_a(const float &a) { + void _goto_tower_a(const_float_t a) { xy_pos_t tower_vec = { cos(RADIANS(a)), sin(RADIANS(a)) }; _man_probe_pt(tower_vec * delta_calibration_radius()); } diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 945a892799..d3ec359fb1 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -77,8 +77,8 @@ template class TMenuEditItem : MenuEditItemBase { private: typedef typename NAME::type_t type_t; - static inline float scale(const float value) { return NAME::scale(value); } - static inline float unscale(const float value) { return NAME::unscale(value); } + static inline float scale(const_float_t value) { return NAME::scale(value); } + static inline float unscale(const_float_t value) { return NAME::unscale(value); } static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); } public: @@ -114,9 +114,9 @@ class TMenuEditItem : MenuEditItemBase { #define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, V...) \ struct MenuEditItemInfo_##NAME { \ typedef TYPE type_t; \ - static inline float scale(const float value) { return value * (SCALE) + (V+0); } \ - static inline float unscale(const float value) { return value / (SCALE) + (V+0); } \ - static inline const char* strfunc(const float value) { return STRFUNC(_DOFIX(TYPE,value)); } \ + static inline float scale(const_float_t value) { return value * (SCALE) + (V+0); } \ + static inline float unscale(const_float_t value) { return value / (SCALE) + (V+0); } \ + static inline const char* strfunc(const_float_t value) { return STRFUNC(_DOFIX(TYPE,value)); } \ }; \ typedef TMenuEditItem MenuItem_##NAME diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 71fc4246c7..dfa7b92a99 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -149,7 +149,7 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } screenFunc_t _manual_move_func_ptr; -void _goto_manual_move(const float scale) { +void _goto_manual_move(const_float_t scale) { ui.defer_status_screen(); ui.manual_move.menu_scale = scale; ui.goto_screen(_manual_move_func_ptr); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 1d62ada327..008db6a8b8 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -58,14 +58,14 @@ inline void z_clearance_move() { ); } -void set_offset_and_go_back(const float &z) { +void set_offset_and_go_back(const_float_t z) { probe.offset.z = z; SET_SOFT_ENDSTOP_LOOSE(false); TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); ui.goto_previous_screen_no_defer(); } -void _goto_manual_move_z(const float scale) { +void _goto_manual_move_z(const_float_t scale) { ui.manual_move.menu_scale = scale; ui.goto_screen(lcd_move_z); } diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 565e6725a7..876c9ae621 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -92,7 +92,7 @@ void _lcd_mesh_fine_tune(PGM_P const msg) { // Init mesh editing and go to the fine tuning screen (ubl.fine_tune_mesh) // To capture encoder events UBL will also call ui.capture and ui.release. // -void MarlinUI::ubl_mesh_edit_start(const float &initial) { +void MarlinUI::ubl_mesh_edit_start(const_float_t initial) { TERN_(HAS_GRAPHICAL_TFT, clear_lcd()); mesh_edit_accumulator = initial; goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index d079e0b4b3..8f71d52ec8 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -368,12 +368,12 @@ void L64XX_Marlin::set_param(const L64XX_axis_t axis, const uint8_t param, const } } -inline void echo_min_max(const char a, const float &min, const float &max) { +inline void echo_min_max(const char a, const_float_t min, const_float_t max) { DEBUG_CHAR(' '); DEBUG_CHAR(a); DEBUG_ECHOPAIR(" min = ", min); DEBUG_ECHOLNPAIR(" max = ", max); } -inline void echo_oct_used(const float &oct, const uint8_t stall) { +inline void echo_oct_used(const_float_t oct, const uint8_t stall) { DEBUG_ECHOPAIR("over_current_threshold used : ", oct); DEBUG_ECHOPGM_P(stall ? PSTR(" (Stall") : PSTR(" (OCD")); DEBUG_ECHOLNPGM(" threshold)"); diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h index dbbab0a55e..374a1f5ada 100644 --- a/Marlin/src/libs/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -47,7 +47,7 @@ inline void incremental_LSF_reset(struct linear_fit_data *lsf) { memset(lsf, 0, sizeof(linear_fit_data)); } -inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z, const float &w) { +inline void incremental_WLSF(struct linear_fit_data *lsf, const_float_t x, const_float_t y, const_float_t z, const_float_t w) { // weight each accumulator by factor w, including the "number" of samples // (analogous to calling inc_LSF twice with same values to weight it by 2X) const float wx = w * x, wy = w * y, wz = w * z; @@ -63,11 +63,11 @@ inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const lsf->max_absx = _MAX(ABS(wx), lsf->max_absx); lsf->max_absy = _MAX(ABS(wy), lsf->max_absy); } -inline void incremental_WLSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z, const float &w) { +inline void incremental_WLSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const_float_t z, const_float_t w) { incremental_WLSF(lsf, pos.x, pos.y, z, w); } -inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z) { +inline void incremental_LSF(struct linear_fit_data *lsf, const_float_t x, const_float_t y, const_float_t z) { lsf->xbar += x; lsf->ybar += y; lsf->zbar += z; @@ -80,7 +80,7 @@ inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const f lsf->max_absy = _MAX(ABS(y), lsf->max_absy); lsf->N += 1.0; } -inline void incremental_LSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z) { +inline void incremental_LSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const_float_t z) { incremental_LSF(lsf, pos.x, pos.y, z); } diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index c56f45c70b..6918d2fd80 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -130,7 +130,7 @@ Nozzle nozzle; * @param strokes number of strokes to execute * @param radius radius of circle */ - void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) { + void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const_float_t radius) { if (strokes == 0) return; #if ENABLED(NOZZLE_CLEAN_GOBACK) @@ -158,7 +158,7 @@ Nozzle nozzle; * @param pattern one of the available patterns * @param argument depends on the cleaning pattern */ - void Nozzle::clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) { + void Nozzle::clean(const uint8_t &pattern, const uint8_t &strokes, const_float_t radius, const uint8_t &objects, const uint8_t cleans) { xyz_pos_t start[HOTENDS] = NOZZLE_CLEAN_START_POINT, end[HOTENDS] = NOZZLE_CLEAN_END_POINT, middle[HOTENDS] = NOZZLE_CLEAN_CIRCLE_MIDDLE; const uint8_t arrPos = ANY(SINGLENOZZLE, MIXING_EXTRUDER) ? 0 : active_extruder; diff --git a/Marlin/src/libs/nozzle.h b/Marlin/src/libs/nozzle.h index 81594b1381..d1706f0b31 100644 --- a/Marlin/src/libs/nozzle.h +++ b/Marlin/src/libs/nozzle.h @@ -62,7 +62,7 @@ class Nozzle { * @param strokes number of strokes to execute * @param radius radius of circle */ - static void circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) _Os; + static void circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const_float_t radius) _Os; #endif // NOZZLE_CLEAN_FEATURE @@ -77,7 +77,7 @@ class Nozzle { * @param pattern one of the available patterns * @param argument depends on the cleaning pattern */ - static void clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) _Os; + static void clean(const uint8_t &pattern, const uint8_t &strokes, const_float_t radius, const uint8_t &objects, const uint8_t cleans) _Os; #endif // NOZZLE_CLEAN_FEATURE diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index 283734faab..1e1ac05710 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -178,7 +178,7 @@ const char* i16tostr4signrj(const int16_t i) { } // Convert unsigned float to string with 1.1 format -const char* ftostr11ns(const float &f) { +const char* ftostr11ns(const_float_t f) { const long i = UINTFLOAT(f, 1); conv[4] = DIGIMOD(i, 10); conv[5] = '.'; @@ -187,7 +187,7 @@ const char* ftostr11ns(const float &f) { } // Convert unsigned float to string with 1.23 format -const char* ftostr12ns(const float &f) { +const char* ftostr12ns(const_float_t f) { const long i = UINTFLOAT(f, 2); conv[3] = DIGIMOD(i, 100); conv[4] = '.'; @@ -197,7 +197,7 @@ const char* ftostr12ns(const float &f) { } // Convert unsigned float to string with 12.3 format -const char* ftostr31ns(const float &f) { +const char* ftostr31ns(const_float_t f) { const long i = UINTFLOAT(f, 1); conv[3] = DIGIMOD(i, 100); conv[4] = DIGIMOD(i, 10); @@ -207,7 +207,7 @@ const char* ftostr31ns(const float &f) { } // Convert unsigned float to string with 123.4 format -const char* ftostr41ns(const float &f) { +const char* ftostr41ns(const_float_t f) { const long i = UINTFLOAT(f, 1); conv[2] = DIGIMOD(i, 1000); conv[3] = DIGIMOD(i, 100); @@ -218,7 +218,7 @@ const char* ftostr41ns(const float &f) { } // Convert signed float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format -const char* ftostr42_52(const float &f) { +const char* ftostr42_52(const_float_t f) { if (f <= -10 || f >= 100) return ftostr52(f); // -23.45 / 123.45 long i = INTFLOAT(f, 2); conv[2] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 1000)); @@ -230,7 +230,7 @@ const char* ftostr42_52(const float &f) { } // Convert signed float to fixed-length string with 023.45 / -23.45 format -const char* ftostr52(const float &f) { +const char* ftostr52(const_float_t f) { long i = INTFLOAT(f, 2); conv[1] = MINUSOR(i, DIGIMOD(i, 10000)); conv[2] = DIGIMOD(i, 1000); @@ -242,7 +242,7 @@ const char* ftostr52(const float &f) { } // Convert signed float to fixed-length string with 12.345 / _2.345 / -2.345 or -23.45 / 123.45 format -const char* ftostr53_63(const float &f) { +const char* ftostr53_63(const_float_t f) { if (f <= -10 || f >= 100) return ftostr63(f); // -23.456 / 123.456 long i = INTFLOAT(f, 3); conv[1] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 10000)); @@ -255,7 +255,7 @@ const char* ftostr53_63(const float &f) { } // Convert signed float to fixed-length string with 023.456 / -23.456 format -const char* ftostr63(const float &f) { +const char* ftostr63(const_float_t f) { long i = INTFLOAT(f, 3); conv[0] = MINUSOR(i, DIGIMOD(i, 100000)); conv[1] = DIGIMOD(i, 10000); @@ -270,7 +270,7 @@ const char* ftostr63(const float &f) { #if ENABLED(LCD_DECIMAL_SMALL_XY) // Convert float to rj string with 1234, _123, -123, _-12, 12.3, _1.2, or -1.2 format - const char* ftostr4sign(const float &f) { + const char* ftostr4sign(const_float_t f) { const int i = INTFLOAT(f, 1); if (!WITHIN(i, -99, 999)) return i16tostr4signrj((int)f); const bool neg = i < 0; @@ -285,7 +285,7 @@ const char* ftostr63(const float &f) { #endif // Convert float to fixed-length string with +12.3 / -12.3 format -const char* ftostr31sign(const float &f) { +const char* ftostr31sign(const_float_t f) { int i = INTFLOAT(f, 1); conv[2] = MINUSOR(i, '+'); conv[3] = DIGIMOD(i, 100); @@ -296,7 +296,7 @@ const char* ftostr31sign(const float &f) { } // Convert float to fixed-length string with +123.4 / -123.4 format -const char* ftostr41sign(const float &f) { +const char* ftostr41sign(const_float_t f) { int i = INTFLOAT(f, 1); conv[1] = MINUSOR(i, '+'); conv[2] = DIGIMOD(i, 1000); @@ -308,7 +308,7 @@ const char* ftostr41sign(const float &f) { } // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -const char* ftostr43sign(const float &f, char plus/*=' '*/) { +const char* ftostr43sign(const_float_t f, char plus/*=' '*/) { long i = INTFLOAT(f, 3); conv[1] = i ? MINUSOR(i, plus) : ' '; conv[2] = DIGIMOD(i, 1000); @@ -320,7 +320,7 @@ const char* ftostr43sign(const float &f, char plus/*=' '*/) { } // Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format -const char* ftostr54sign(const float &f, char plus/*=' '*/) { +const char* ftostr54sign(const_float_t f, char plus/*=' '*/) { long i = INTFLOAT(f, 4); conv[0] = i ? MINUSOR(i, plus) : ' '; conv[1] = DIGIMOD(i, 10000); @@ -333,13 +333,13 @@ const char* ftostr54sign(const float &f, char plus/*=' '*/) { } // Convert unsigned float to rj string with 12345 format -const char* ftostr5rj(const float &f) { +const char* ftostr5rj(const_float_t f) { const long i = UINTFLOAT(f, 0); return ui16tostr5rj(i); } // Convert signed float to string with +1234.5 format -const char* ftostr51sign(const float &f) { +const char* ftostr51sign(const_float_t f) { long i = INTFLOAT(f, 1); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); @@ -352,7 +352,7 @@ const char* ftostr51sign(const float &f) { } // Convert signed float to string with +123.45 format -const char* ftostr52sign(const float &f) { +const char* ftostr52sign(const_float_t f) { long i = INTFLOAT(f, 2); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); @@ -365,7 +365,7 @@ const char* ftostr52sign(const float &f) { } // Convert signed float to string with +12.345 format -const char* ftostr53sign(const float &f) { +const char* ftostr53sign(const_float_t f) { long i = INTFLOAT(f, 3); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); @@ -378,7 +378,7 @@ const char* ftostr53sign(const float &f) { } // Convert unsigned float to string with ____4.5, __34.5, _234.5, 1234.5 format -const char* ftostr51rj(const float &f) { +const char* ftostr51rj(const_float_t f) { const long i = UINTFLOAT(f, 1); conv[0] = ' '; conv[1] = RJDIGIT(i, 10000); @@ -391,7 +391,7 @@ const char* ftostr51rj(const float &f) { } // Convert signed float to space-padded string with -_23.4_ format -const char* ftostr52sp(const float &f) { +const char* ftostr52sp(const_float_t f) { long i = INTFLOAT(f, 2); uint8_t dig; conv[0] = MINUSOR(i, ' '); diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index 54cebab252..b058f3cdf6 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -21,7 +21,8 @@ */ #pragma once -#include +#include "../inc/MarlinConfigPre.h" +#include "../core/types.h" // Format uint8_t (0-100) as rj string with 123% / _12% / __1% format const char* pcttostrpctrj(const uint8_t i); @@ -62,70 +63,66 @@ const char* i16tostr3left(const int16_t xx); const char* i16tostr4signrj(const int16_t x); // Convert unsigned float to string with 1.2 format -const char* ftostr11ns(const float &x); +const char* ftostr11ns(const_float_t x); // Convert unsigned float to string with 1.23 format -const char* ftostr12ns(const float &x); +const char* ftostr12ns(const_float_t x); // Convert unsigned float to string with 12.3 format -const char* ftostr31ns(const float &x); +const char* ftostr31ns(const_float_t x); // Convert unsigned float to string with 123.4 format -const char* ftostr41ns(const float &x); +const char* ftostr41ns(const_float_t x); // Convert signed float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format -const char* ftostr42_52(const float &x); +const char* ftostr42_52(const_float_t x); // Convert signed float to fixed-length string with 023.45 / -23.45 format -const char* ftostr52(const float &x); +const char* ftostr52(const_float_t x); // Convert signed float to fixed-length string with 12.345 / -2.345 or 023.456 / -23.456 format -const char* ftostr53_63(const float &x); +const char* ftostr53_63(const_float_t x); // Convert signed float to fixed-length string with 023.456 / -23.456 format -const char* ftostr63(const float &x); +const char* ftostr63(const_float_t x); // Convert float to fixed-length string with +12.3 / -12.3 format -const char* ftostr31sign(const float &x); +const char* ftostr31sign(const_float_t x); // Convert float to fixed-length string with +123.4 / -123.4 format -const char* ftostr41sign(const float &x); +const char* ftostr41sign(const_float_t x); // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -const char* ftostr43sign(const float &x, char plus=' '); +const char* ftostr43sign(const_float_t x, char plus=' '); // Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format -const char* ftostr54sign(const float &x, char plus=' '); +const char* ftostr54sign(const_float_t x, char plus=' '); // Convert unsigned float to rj string with 12345 format -const char* ftostr5rj(const float &x); +const char* ftostr5rj(const_float_t x); // Convert signed float to string with +1234.5 format -const char* ftostr51sign(const float &x); +const char* ftostr51sign(const_float_t x); // Convert signed float to space-padded string with -_23.4_ format -const char* ftostr52sp(const float &x); +const char* ftostr52sp(const_float_t x); // Convert signed float to string with +123.45 format -const char* ftostr52sign(const float &x); +const char* ftostr52sign(const_float_t x); // Convert signed float to string with +12.345 format -const char* ftostr53sign(const float &f); +const char* ftostr53sign(const_float_t f); // Convert unsigned float to string with 1234.5 format omitting trailing zeros -const char* ftostr51rj(const float &x); - -#include "../core/macros.h" +const char* ftostr51rj(const_float_t x); // Convert float to rj string with 123 or -12 format -FORCE_INLINE const char* ftostr3(const float &x) { return i16tostr3rj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } - -#include "../inc/MarlinConfigPre.h" +FORCE_INLINE const char* ftostr3(const_float_t x) { return i16tostr3rj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } #if ENABLED(LCD_DECIMAL_SMALL_XY) // Convert float to rj string with 1234, _123, 12.3, _1.2, -123, _-12, or -1.2 format - const char* ftostr4sign(const float &fx); + const char* ftostr4sign(const_float_t fx); #else // Convert float to rj string with 1234, _123, -123, __12, _-12, ___1, or __-1 format - FORCE_INLINE const char* ftostr4sign(const float &x) { return i16tostr4signrj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } + FORCE_INLINE const char* ftostr4sign(const_float_t x) { return i16tostr4signrj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } #endif diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h index 764e10accb..5ce5914961 100644 --- a/Marlin/src/libs/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -45,7 +45,7 @@ class matrix_3x3; struct vector_3 : xyz_float_t { - vector_3(const float &_x, const float &_y, const float &_z) { set(_x, _y, _z); } + vector_3(const_float_t _x, const_float_t _y, const_float_t _z) { set(_x, _y, _z); } vector_3(const xy_float_t &in) { set(in.x, in.y); } vector_3(const xyz_float_t &in) { set(in.x, in.y, in.z); } vector_3(const xyze_float_t &in) { set(in.x, in.y, in.z); } diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 2312e1a012..6ba9f4e9f2 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -177,7 +177,7 @@ float delta_safe_distance_from_top() { * * The result is stored in the cartes[] array. */ -void forward_kinematics(const float &z1, const float &z2, const float &z3) { +void forward_kinematics(const_float_t z1, const_float_t z2, const_float_t z3) { // Create a vector in old coordinates along x axis of new coordinate const float p12[3] = { delta_tower[B_AXIS].x - delta_tower[A_AXIS].x, delta_tower[B_AXIS].y - delta_tower[A_AXIS].y, z2 - z1 }, diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index 9caec53028..308e206700 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -120,7 +120,7 @@ float delta_safe_distance_from_top(); * * The result is stored in the cartes[] array. */ -void forward_kinematics(const float &z1, const float &z2, const float &z3); +void forward_kinematics(const_float_t z1, const_float_t z2, const_float_t z3); FORCE_INLINE void forward_kinematics(const abc_float_t &point) { forward_kinematics(point.a, point.b, point.c); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 28ad9cf761..81c3a81fbe 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -311,12 +311,12 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) { * Move the planner to the current position from wherever it last moved * (or from wherever it has been told it is located). */ -void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { +void line_to_current_position(const_feedRate_t fr_mm_s/*=feedrate_mm_s*/) { planner.buffer_line(current_position, fr_mm_s, active_extruder); } #if EXTRUDERS - void unscaled_e_move(const float &length, const feedRate_t &fr_mm_s) { + void unscaled_e_move(const_float_t length, const_feedRate_t fr_mm_s) { TERN_(HAS_FILAMENT_SENSOR, runout.reset()); current_position.e += length / planner.e_factor[active_extruder]; line_to_current_position(fr_mm_s); @@ -329,7 +329,7 @@ void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { /** * Buffer a fast move without interpolation. Set current_position to destination */ - void prepare_fast_move_to_destination(const feedRate_t &scaled_fr_mm_s/*=MMS_SCALED(feedrate_mm_s)*/) { + void prepare_fast_move_to_destination(const_feedRate_t scaled_fr_mm_s/*=MMS_SCALED(feedrate_mm_s)*/) { if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_fast_move_to_destination", destination); #if UBL_SEGMENTED @@ -351,7 +351,7 @@ void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { * - Move at normal speed regardless of feedrate percentage. * - Extrude the specified length regardless of flow percentage. */ -void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ +void _internal_move_to_destination(const_feedRate_t fr_mm_s/*=0.0f*/ #if IS_KINEMATIC , const bool is_fast/*=false*/ #endif @@ -384,7 +384,7 @@ void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ /** * Plan a move to (X, Y, Z) and set the current_position */ -void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to(const float rx, const float ry, const float rz, const_feedRate_t fr_mm_s/*=0.0*/) { DEBUG_SECTION(log_move, "do_blocking_move_to", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) DEBUG_XYZ("> ", rx, ry, rz); @@ -473,38 +473,38 @@ void do_blocking_move_to(const float rx, const float ry, const float rz, const f planner.synchronize(); } -void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to(const xy_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to(raw.x, raw.y, current_position.z, fr_mm_s); } -void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to(const xyz_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); } -void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to(const xyze_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); } -void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { do_blocking_move_to(rx, current_position.y, current_position.z, fr_mm_s); } -void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to_y(const_float_t ry, const_feedRate_t fr_mm_s/*=0.0*/) { do_blocking_move_to(current_position.x, ry, current_position.z, fr_mm_s); } -void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to_z(const_float_t rz, const_feedRate_t fr_mm_s/*=0.0*/) { do_blocking_move_to_xy_z(current_position, rz, fr_mm_s); } -void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to_xy(const_float_t rx, const_float_t ry, const_feedRate_t fr_mm_s/*=0.0*/) { do_blocking_move_to(rx, ry, current_position.z, fr_mm_s); } -void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to_xy(const xy_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to_xy(raw.x, raw.y, fr_mm_s); } -void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to_xy_z(const xy_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to(raw.x, raw.y, z, fr_mm_s); } -void do_z_clearance(const float &zclear, const bool lower_allowed/*=false*/) { +void do_z_clearance(const_float_t zclear, const bool lower_allowed/*=false*/) { float zdest = zclear; if (!lower_allowed) NOLESS(zdest, current_position.z); do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), TERN(HAS_BED_PROBE, z_probe_fast_mm_s, homing_feedrate(Z_AXIS))); @@ -826,7 +826,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { * small incremental moves. This allows the planner to * apply more detailed bed leveling to the full move. */ - inline void segmented_line_to_destination(const feedRate_t &fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { + inline void segmented_line_to_destination(const_feedRate_t fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { const xyze_float_t diff = destination - current_position; diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 7b8d2f2018..2cfc8406a5 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -229,28 +229,28 @@ void sync_plan_position_e(); * Move the planner to the current position from wherever it last moved * (or from wherever it has been told it is located). */ -void line_to_current_position(const feedRate_t &fr_mm_s=feedrate_mm_s); +void line_to_current_position(const_feedRate_t fr_mm_s=feedrate_mm_s); #if EXTRUDERS - void unscaled_e_move(const float &length, const feedRate_t &fr_mm_s); + void unscaled_e_move(const_float_t length, const_feedRate_t fr_mm_s); #endif void prepare_line_to_destination(); -void _internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f +void _internal_move_to_destination(const_feedRate_t fr_mm_s=0.0f #if IS_KINEMATIC , const bool is_fast=false #endif ); -inline void prepare_internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f) { +inline void prepare_internal_move_to_destination(const_feedRate_t fr_mm_s=0.0f) { _internal_move_to_destination(fr_mm_s); } #if IS_KINEMATIC - void prepare_fast_move_to_destination(const feedRate_t &scaled_fr_mm_s=MMS_SCALED(feedrate_mm_s)); + void prepare_fast_move_to_destination(const_feedRate_t scaled_fr_mm_s=MMS_SCALED(feedrate_mm_s)); - inline void prepare_internal_fast_move_to_destination(const feedRate_t &fr_mm_s=0.0f) { + inline void prepare_internal_fast_move_to_destination(const_feedRate_t fr_mm_s=0.0f) { _internal_move_to_destination(fr_mm_s, true); } #endif @@ -258,29 +258,29 @@ inline void prepare_internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f) /** * Blocking movement and shorthand functions */ -void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const float rx, const float ry, const float rz, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to(const xy_pos_t &raw, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to(const xyz_pos_t &raw, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to(const xyze_pos_t &raw, const_feedRate_t fr_mm_s=0.0f); -void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to_y(const_float_t ry, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to_z(const_float_t rz, const_feedRate_t fr_mm_s=0.0f); -void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -FORCE_INLINE void do_blocking_move_to_xy(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } -FORCE_INLINE void do_blocking_move_to_xy(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } +void do_blocking_move_to_xy(const_float_t rx, const_float_t ry, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to_xy(const xy_pos_t &raw, const_feedRate_t fr_mm_s=0.0f); +FORCE_INLINE void do_blocking_move_to_xy(const xyz_pos_t &raw, const_feedRate_t fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } +FORCE_INLINE void do_blocking_move_to_xy(const xyze_pos_t &raw, const_feedRate_t fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } -void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f); -FORCE_INLINE void do_blocking_move_to_xy_z(const xyz_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } -FORCE_INLINE void do_blocking_move_to_xy_z(const xyze_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } +void do_blocking_move_to_xy_z(const xy_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s=0.0f); +FORCE_INLINE void do_blocking_move_to_xy_z(const xyz_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } +FORCE_INLINE void do_blocking_move_to_xy_z(const xyze_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } void remember_feedrate_and_scaling(); void remember_feedrate_scaling_off(); void restore_feedrate_and_scaling(); -void do_z_clearance(const float &zclear, const bool lower_allowed=false); +void do_z_clearance(const_float_t zclear, const bool lower_allowed=false); /** * Homing and Trusted Axes @@ -393,7 +393,7 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == #endif // Return true if the given point is within the printable area - inline bool position_is_reachable(const float &rx, const float &ry, const float inset=0) { + inline bool position_is_reachable(const_float_t rx, const_float_t ry, const float inset=0) { #if ENABLED(DELTA) return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset + fslop); @@ -428,7 +428,7 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == #else // CARTESIAN // Return true if the given position is within the machine bounds. - inline bool position_is_reachable(const float &rx, const float &ry) { + inline bool position_is_reachable(const_float_t rx, const_float_t ry) { if (!COORDINATE_OKAY(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop)) return false; #if ENABLED(DUAL_X_CARRIAGE) if (active_extruder) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index eee1a9f269..891f6a7ab0 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -775,7 +775,7 @@ block_t* Planner::get_current_block() { * is not and will not use the block while we modify it, so it is safe to * alter its values. */ -void Planner::calculate_trapezoid_for_block(block_t * const block, const float &entry_factor, const float &exit_factor) { +void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t entry_factor, const_float_t exit_factor) { uint32_t initial_rate = CEIL(block->nominal_rate * entry_factor), final_rate = CEIL(block->nominal_rate * exit_factor); // (steps per second) @@ -1463,7 +1463,7 @@ void Planner::check_axes_activity() { * This is the reciprocal of the circular cross-section area. * Return 1.0 with volumetric off or a diameter of 0.0. */ - inline float calculate_volumetric_multiplier(const float &diameter) { + inline float calculate_volumetric_multiplier(const_float_t diameter) { return (parser.volumetric_enabled && diameter) ? 1.0f / CIRCLE_AREA(diameter * 0.5f) : 1; } @@ -1745,7 +1745,7 @@ bool Planner::_buffer_steps(const xyze_long_t &target #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters + , feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters ) { // Wait for the next available block @@ -1811,7 +1811,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ + , feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters/*=0.0*/ ) { const int32_t da = target.a - position.a, @@ -2745,11 +2745,11 @@ void Planner::buffer_sync_block(TERN_(LASER_SYNCHRONOUS_M106_M107, uint8_t sync_ * * Return 'false' if no segment was queued due to cleaning, cold extrusion, full queue, etc. */ -bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e +bool Planner::buffer_segment(const_float_t a, const_float_t b, const_float_t c, const_float_t e #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ + , const_feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters/*=0.0*/ ) { // If we are cleaning, do not accept queuing of movements @@ -2839,9 +2839,9 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con * millimeters - the length of the movement, if known * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) */ -bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters +bool Planner::buffer_line(const_float_t rx, const_float_t ry, const_float_t rz, const_float_t e, const_feedRate_t fr_mm_s, const uint8_t extruder, const float millimeters #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration + , const_float_t inv_duration #endif ) { xyze_pos_t machine = { rx, ry, rz, e }; @@ -2960,7 +2960,7 @@ bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, con * The provided ABC position is in machine units. */ -void Planner::set_machine_position_mm(const float &a, const float &b, const float &c, const float &e) { +void Planner::set_machine_position_mm(const_float_t a, const_float_t b, const_float_t c, const_float_t e) { TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); TERN_(HAS_POSITION_FLOAT, position_float.set(a, b, c, e)); position.set(LROUND(a * settings.axis_steps_per_mm[A_AXIS]), @@ -2976,7 +2976,7 @@ void Planner::set_machine_position_mm(const float &a, const float &b, const floa stepper.set_position(position); } -void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, const float &e) { +void Planner::set_position_mm(const_float_t rx, const_float_t ry, const_float_t rz, const_float_t e) { xyze_pos_t machine = { rx, ry, rz, e }; #if HAS_POSITION_MODIFIERS apply_modifiers(machine, true); @@ -2993,7 +2993,7 @@ void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, /** * Setters for planner position (also setting stepper position). */ -void Planner::set_e_position_mm(const float &e) { +void Planner::set_e_position_mm(const_float_t e) { const uint8_t axis_index = E_AXIS_N(active_extruder); TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 768bf29e2f..6b99c8bcc1 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -491,7 +491,7 @@ class Planner { #if HAS_CLASSIC_JERK static void set_max_jerk(const AxisEnum axis, float inMaxJerkMMS); #else - static inline void set_max_jerk(const AxisEnum, const float&) {} + static inline void set_max_jerk(const AxisEnum, const_float_t ) {} #endif #if EXTRUDERS @@ -541,7 +541,7 @@ class Planner { static void calculate_volumetric_extruder_limits(); #endif - FORCE_INLINE static void set_filament_size(const uint8_t e, const float &v) { + FORCE_INLINE static void set_filament_size(const uint8_t e, const_float_t v) { filament_size[e] = v; if (v > 0) volumetric_area_nominal = CIRCLE_AREA(v * 0.5); //TODO: should it be per extruder // make sure all extruders have some sane value for the filament size @@ -552,7 +552,7 @@ class Planner { #endif #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - FORCE_INLINE static void set_volumetric_extruder_limit(const uint8_t e, const float &v) { + FORCE_INLINE static void set_volumetric_extruder_limit(const uint8_t e, const_float_t v) { volumetric_extruder_limit[e] = v; calculate_volumetric_extruder_limit(e); } @@ -567,7 +567,7 @@ class Planner { * Returns 1.0 if planner.z_fade_height is 0.0. * Returns 0.0 if Z is past the specified 'Fade Height'. */ - static inline float fade_scaling_factor_for_z(const float &rz) { + static inline float fade_scaling_factor_for_z(const_float_t rz) { static float z_fade_factor = 1; if (!z_fade_height) return 1; if (rz >= z_fade_height) return 0; @@ -580,27 +580,27 @@ class Planner { FORCE_INLINE static void force_fade_recalc() { last_fade_z = -999.999f; } - FORCE_INLINE static void set_z_fade_height(const float &zfh) { + FORCE_INLINE static void set_z_fade_height(const_float_t zfh) { z_fade_height = zfh > 0 ? zfh : 0; inverse_z_fade_height = RECIPROCAL(z_fade_height); force_fade_recalc(); } - FORCE_INLINE static bool leveling_active_at_z(const float &rz) { + FORCE_INLINE static bool leveling_active_at_z(const_float_t rz) { return !z_fade_height || rz < z_fade_height; } #else - FORCE_INLINE static float fade_scaling_factor_for_z(const float&) { return 1; } + FORCE_INLINE static float fade_scaling_factor_for_z(const_float_t ) { return 1; } - FORCE_INLINE static bool leveling_active_at_z(const float&) { return true; } + FORCE_INLINE static bool leveling_active_at_z(const_float_t ) { return true; } #endif #if ENABLED(SKEW_CORRECTION) - FORCE_INLINE static void skew(float &cx, float &cy, const float &cz) { + FORCE_INLINE static void skew(float &cx, float &cy, const_float_t cz) { if (COORDINATE_OKAY(cx, X_MIN_POS + 1, X_MAX_POS) && COORDINATE_OKAY(cy, Y_MIN_POS + 1, Y_MAX_POS)) { const float sx = cx - cy * skew_factor.xy - cz * (skew_factor.xz - (skew_factor.xy * skew_factor.yz)), sy = cy - cz * skew_factor.yz; @@ -611,7 +611,7 @@ class Planner { } FORCE_INLINE static void skew(xyz_pos_t &raw) { skew(raw.x, raw.y, raw.z); } - FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) { + FORCE_INLINE static void unskew(float &cx, float &cy, const_float_t cz) { if (COORDINATE_OKAY(cx, X_MIN_POS, X_MAX_POS) && COORDINATE_OKAY(cy, Y_MIN_POS, Y_MAX_POS)) { const float sx = cx + cy * skew_factor.xy + cz * skew_factor.xz, sy = cy + cz * skew_factor.yz; @@ -713,7 +713,7 @@ class Planner { #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters=0.0 ); /** @@ -736,7 +736,7 @@ class Planner { #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters=0.0 ); /** @@ -767,18 +767,18 @@ class Planner { * extruder - target extruder * millimeters - the length of the movement, if known */ - static bool buffer_segment(const float &a, const float &b, const float &c, const float &e + static bool buffer_segment(const_float_t a, const_float_t b, const_float_t c, const_float_t e #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , const_feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters=0.0 ); FORCE_INLINE static bool buffer_segment(abce_pos_t &abce #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , const_feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters=0.0 ) { return buffer_segment(abce.a, abce.b, abce.c, abce.e #if HAS_DIST_MM_ARG @@ -800,15 +800,15 @@ class Planner { * millimeters - the length of the movement, if known * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) */ - static bool buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + static bool buffer_line(const_float_t rx, const_float_t ry, const_float_t rz, const_float_t e, const_feedRate_t fr_mm_s, const uint8_t extruder, const float millimeters=0.0 #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration=0.0 + , const_float_t inv_duration=0.0 #endif ); - FORCE_INLINE static bool buffer_line(const xyze_pos_t &cart, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + FORCE_INLINE static bool buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s, const uint8_t extruder, const float millimeters=0.0 #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration=0.0 + , const_float_t inv_duration=0.0 #endif ) { return buffer_line(cart.x, cart.y, cart.z, cart.e, fr_mm_s, extruder, millimeters @@ -835,9 +835,9 @@ class Planner { * * Clears previous speed values. */ - static void set_position_mm(const float &rx, const float &ry, const float &rz, const float &e); + static void set_position_mm(const_float_t rx, const_float_t ry, const_float_t rz, const_float_t e); FORCE_INLINE static void set_position_mm(const xyze_pos_t &cart) { set_position_mm(cart.x, cart.y, cart.z, cart.e); } - static void set_e_position_mm(const float &e); + static void set_e_position_mm(const_float_t e); /** * Set the planner.position and individual stepper positions. @@ -845,7 +845,7 @@ class Planner { * The supplied position is in machine space, and no additional * conversions are applied. */ - static void set_machine_position_mm(const float &a, const float &b, const float &c, const float &e); + static void set_machine_position_mm(const_float_t a, const_float_t b, const_float_t c, const_float_t e); FORCE_INLINE static void set_machine_position_mm(const abce_pos_t &abce) { set_machine_position_mm(abce.a, abce.b, abce.c, abce.e); } /** @@ -957,7 +957,7 @@ class Planner { * Calculate the distance (not time) it takes to accelerate * from initial_rate to target_rate using the given acceleration: */ - static float estimate_acceleration_distance(const float &initial_rate, const float &target_rate, const float &accel) { + static float estimate_acceleration_distance(const_float_t initial_rate, const_float_t target_rate, const_float_t accel) { if (accel == 0) return 0; // accel was 0, set acceleration distance to 0 return (sq(target_rate) - sq(initial_rate)) / (accel * 2); } @@ -970,7 +970,7 @@ class Planner { * This is used to compute the intersection point between acceleration and deceleration * in cases where the "trapezoid" has no plateau (i.e., never reaches maximum speed) */ - static float intersection_distance(const float &initial_rate, const float &final_rate, const float &accel, const float &distance) { + static float intersection_distance(const_float_t initial_rate, const_float_t final_rate, const_float_t accel, const_float_t distance) { if (accel == 0) return 0; // accel was 0, set intersection distance to 0 return (accel * 2 * distance - sq(initial_rate) + sq(final_rate)) / (accel * 4); } @@ -980,7 +980,7 @@ class Planner { * to reach 'target_velocity_sqr' using 'acceleration' within a given * 'distance'. */ - static float max_allowable_speed_sqr(const float &accel, const float &target_velocity_sqr, const float &distance) { + static float max_allowable_speed_sqr(const_float_t accel, const_float_t target_velocity_sqr, const_float_t distance) { return target_velocity_sqr - 2 * accel * distance; } @@ -988,12 +988,12 @@ class Planner { /** * Calculate the speed reached given initial speed, acceleration and distance */ - static float final_speed(const float &initial_velocity, const float &accel, const float &distance) { + static float final_speed(const_float_t initial_velocity, const_float_t accel, const_float_t distance) { return SQRT(sq(initial_velocity) + 2 * accel * distance); } #endif - static void calculate_trapezoid_for_block(block_t * const block, const float &entry_factor, const float &exit_factor); + static void calculate_trapezoid_for_block(block_t * const block, const_float_t entry_factor, const_float_t exit_factor); static void reverse_pass_kernel(block_t * const current, const block_t * const next); static void forward_pass_kernel(const block_t * const previous, block_t * const current, uint8_t block_index); @@ -1013,7 +1013,7 @@ class Planner { vector *= RSQRT(magnitude_sq); } - FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, xyze_float_t &unit_vec) { + FORCE_INLINE static float limit_value_by_axis_maximum(const_float_t max_value, xyze_float_t &unit_vec) { float limit_value = max_value; LOOP_XYZE(idx) { if (unit_vec[idx]) { diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp index 02d878d5f5..be5ce4bbb4 100644 --- a/Marlin/src/module/planner_bezier.cpp +++ b/Marlin/src/module/planner_bezier.cpp @@ -43,7 +43,7 @@ #define SIGMA 0.1f // Compute the linear interpolation between two real numbers. -static inline float interp(const float &a, const float &b, const float &t) { return (1 - t) * a + t * b; } +static inline float interp(const_float_t a, const_float_t b, const_float_t t) { return (1 - t) * a + t * b; } /** * Compute a Bézier curve using the De Casteljau's algorithm (see @@ -51,7 +51,7 @@ static inline float interp(const float &a, const float &b, const float &t) { ret * easy to code and has good numerical stability (very important, * since Arudino works with limited precision real numbers). */ -static inline float eval_bezier(const float &a, const float &b, const float &c, const float &d, const float &t) { +static inline float eval_bezier(const_float_t a, const_float_t b, const_float_t c, const_float_t d, const_float_t t) { const float iab = interp(a, b, t), ibc = interp(b, c, t), icd = interp(c, d, t), @@ -64,7 +64,7 @@ static inline float eval_bezier(const float &a, const float &b, const float &c, * We approximate Euclidean distance with the sum of the coordinates * offset (so-called "norm 1"), which is quicker to compute. */ -static inline float dist1(const float &x1, const float &y1, const float &x2, const float &y2) { return ABS(x1 - x2) + ABS(y1 - y2); } +static inline float dist1(const_float_t x1, const_float_t y1, const_float_t x2, const_float_t y2) { return ABS(x1 - x2) + ABS(y1 - y2); } /** * The algorithm for computing the step is loosely based on the one in Kig @@ -109,7 +109,7 @@ void cubic_b_spline( const xyze_pos_t &position, // current position const xyze_pos_t &target, // target position const xy_pos_t (&offsets)[2], // a pair of offsets - const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % + const_feedRate_t scaled_fr_mm_s, // mm/s scaled by feedrate % const uint8_t extruder ) { // Absolute first and second control points are recovered. diff --git a/Marlin/src/module/planner_bezier.h b/Marlin/src/module/planner_bezier.h index 72048c4273..eb48cf5e1a 100644 --- a/Marlin/src/module/planner_bezier.h +++ b/Marlin/src/module/planner_bezier.h @@ -33,6 +33,6 @@ void cubic_b_spline( const xyze_pos_t &position, // current position const xyze_pos_t &target, // target position const xy_pos_t (&offsets)[2], // a pair of offsets - const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % + const_feedRate_t scaled_fr_mm_s, // mm/s scaled by feedrate % const uint8_t extruder ); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 28c89e7a00..d4b8409efa 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -475,7 +475,7 @@ bool Probe::set_deployed(const bool deploy) { * * @return TRUE if the probe failed to trigger. */ -bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { +bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { DEBUG_SECTION(log_probe, "Probe::probe_down_to_z", DEBUGGING(LEVELING)); #if BOTH(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) @@ -588,7 +588,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { float Probe::run_z_probe(const bool sanity_check/*=true*/) { DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); - auto try_to_probe = [&](PGM_P const plbl, const float &z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) -> bool { + auto try_to_probe = [&](PGM_P const plbl, const_float_t z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) -> bool { // Tare the probe, if supported if (TERN0(PROBE_TARE, tare())) return true; @@ -743,7 +743,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { * - Raise to the BETWEEN height * - Return the probed Z position */ -float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/, const bool sanity_check/*=true*/) { +float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/, const bool sanity_check/*=true*/) { DEBUG_SECTION(log_probe, "Probe::probe_at_point", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) { diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index b54bf00f00..d8272c31b6 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -71,12 +71,12 @@ public: #if HAS_PROBE_XY_OFFSET // Return true if the both nozzle and the probe can reach the given point. // Note: This won't work on SCARA since the probe offset rotates with the arm. - static bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const_float_t rx, const_float_t ry) { return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) // The nozzle can go where it needs to go? && position_is_reachable(rx, ry, ABS(PROBING_MARGIN)); // Can the nozzle also go near there? } #else - static bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const_float_t rx, const_float_t ry) { return position_is_reachable(rx, ry, PROBING_MARGIN); } #endif @@ -90,7 +90,7 @@ public: * Example: For a probe offset of -10,+10, then for the probe to reach 0,0 the * nozzle must be be able to reach +10,-10. */ - static bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const_float_t rx, const_float_t ry) { return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) && COORDINATE_OKAY(rx, min_x() - fslop, max_x() + fslop) && COORDINATE_OKAY(ry, min_y() - fslop, max_y() + fslop); @@ -103,7 +103,7 @@ public: do_z_clearance(Z_AFTER_PROBING, true); // Move down still permitted #endif } - static float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); + static float probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); static float probe_at_point(const xy_pos_t &pos, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true) { return probe_at_point(pos.x, pos.y, raise_after, verbose_level, probe_relative, sanity_check); } @@ -114,7 +114,7 @@ public: static bool set_deployed(const bool) { return false; } - static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } + static bool can_reach(const_float_t rx, const_float_t ry) { return position_is_reachable(rx, ry); } #endif @@ -257,7 +257,7 @@ public: #endif private: - static bool probe_down_to_z(const float z, const feedRate_t fr_mm_s); + static bool probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s); static void do_z_raise(const float z_raise); static float run_z_probe(const bool sanity_check=true); }; diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 1767e230c1..d02136039a 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -48,7 +48,7 @@ float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SE * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. */ - void forward_kinematics(const float &a, const float &b) { + void forward_kinematics(const_float_t a, const_float_t b) { const float a_sin = sin(RADIANS(a)) * L1, a_cos = cos(RADIANS(a)) * L1, b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, @@ -197,7 +197,7 @@ float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SE } // Convert ABC inputs in degrees to XYZ outputs in mm - void forward_kinematics(const float &a, const float &b, const float &c) { + void forward_kinematics(const_float_t a, const_float_t b, const_float_t c) { const float w = c - b, r = L1 * cos(RADIANS(b)) + L2 * sin(RADIANS(w - (90 - b))), x = r * cos(RADIANS(a)), diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index d24a4110fd..8ce50e55e1 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -35,7 +35,7 @@ extern float segments_per_second; L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, L2_2 = sq(float(L2)); - void forward_kinematics(const float &a, const float &b, const float &c); + void forward_kinematics(const_float_t a, const_float_t b, const_float_t c); void home_TPARA(); #else @@ -44,7 +44,7 @@ extern float segments_per_second; L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, L2_2 = sq(float(L2)); - void forward_kinematics(const float &a, const float &b); + void forward_kinematics(const_float_t a, const_float_t b); #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 5a8704d3ba..02fe7588d9 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -499,7 +499,7 @@ volatile bool Temperature::raw_temps_ready = false; * Needs sufficient heater power to make some overshoot at target * temperature to succeed. */ - void Temperature::PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { + void Temperature::PID_autotune(const_float_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { float current_temp = 0.0; int cycles = 0; bool heating = true; @@ -2336,7 +2336,7 @@ void Temperature::init() { * * TODO: Embed the last 3 parameters during init, if not less optimal */ - void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc) { + void Temperature::tr_state_machine_t::run(const_float_t current, const_float_t target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc) { #if HEATER_IDLE_HANDLER // Convert the given heater_id_t to an idle array index @@ -3371,7 +3371,7 @@ void Temperature::tick() { #include "../gcode/gcode.h" - static void print_heater_state(const float &c, const float &t + static void print_heater_state(const_float_t c, const_float_t t #if ENABLED(SHOW_TEMP_ADC_VALUES) , const float r #endif @@ -3804,7 +3804,7 @@ void Temperature::tick() { #define MIN_DELTA_SLOPE_TIME_PROBE 600 #endif - bool Temperature::wait_for_probe(const float target_temp, bool no_wait_for_cooling/*=true*/) { + bool Temperature::wait_for_probe(const_float_t target_temp, bool no_wait_for_cooling/*=true*/) { const bool wants_to_cool = isProbeAboveTemp(target_temp); const bool will_wait = !(wants_to_cool && no_wait_for_cooling); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index ec603b5217..92e436c73f 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -688,7 +688,7 @@ class Temperature { return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; } - FORCE_INLINE static bool degHotendNear(const uint8_t e, const float &temp) { + FORCE_INLINE static bool degHotendNear(const uint8_t e, const_float_t temp) { return ABS(degHotend(e) - temp) < (TEMP_HYSTERESIS); } @@ -724,7 +724,7 @@ class Temperature { static void wait_for_bed_heating(); - FORCE_INLINE static bool degBedNear(const float &temp) { + FORCE_INLINE static bool degBedNear(const_float_t temp) { return ABS(degBed() - temp) < (TEMP_BED_HYSTERESIS); } @@ -735,9 +735,9 @@ class Temperature { FORCE_INLINE static int16_t rawProbeTemp() { return temp_probe.raw; } #endif FORCE_INLINE static float degProbe() { return temp_probe.celsius; } - FORCE_INLINE static bool isProbeBelowTemp(const float target_temp) { return temp_probe.celsius < target_temp; } - FORCE_INLINE static bool isProbeAboveTemp(const float target_temp) { return temp_probe.celsius > target_temp; } - static bool wait_for_probe(const float target_temp, bool no_wait_for_cooling=true); + FORCE_INLINE static bool isProbeBelowTemp(const_float_t target_temp) { return temp_probe.celsius < target_temp; } + FORCE_INLINE static bool isProbeAboveTemp(const_float_t target_temp) { return temp_probe.celsius > target_temp; } + static bool wait_for_probe(const_float_t target_temp, bool no_wait_for_cooling=true); #endif #if WATCH_PROBE @@ -825,7 +825,7 @@ class Temperature { static bool pid_debug_flag; #endif - static void PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); + static void PID_autotune(const_float_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); #if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) static bool adaptive_fan_slowing; @@ -959,7 +959,7 @@ class Temperature { millis_t timer = 0; TRState state = TRInactive; float running_temp; - void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc); + void run(const_float_t current, const_float_t target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc); } tr_state_machine_t; static tr_state_machine_t tr_state_machine[NR_HEATER_RUNAWAY]; From b1be96e40e0cd070b7f9e1e349fcd1f2c7ca31f1 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Thu, 1 Apr 2021 19:05:02 -0400 Subject: [PATCH 1235/1370] Board IDs for G2560 Rev B, G2560 v4, GTM32 VD (#21499) --- Marlin/src/core/boards.h | 25 +++++++++-------- Marlin/src/pins/mega/pins_GT2560_REV_B.h | 30 +++++++++++++++++++++ Marlin/src/pins/mega/pins_GT2560_V3.h | 6 +++-- Marlin/src/pins/mega/pins_GT2560_V4.h | 30 +++++++++++++++++++++ Marlin/src/pins/pins.h | 6 +++++ Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 8 ++++-- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h | 30 +++++++++++++++++++++ 7 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 Marlin/src/pins/mega/pins_GT2560_REV_B.h create mode 100644 Marlin/src/pins/mega/pins_GT2560_V4.h create mode 100644 Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index a7ee18d6eb..d2e2236a14 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -146,17 +146,19 @@ #define BOARD_ELEFU_3 1311 // Elefu Ra Board (v3) #define BOARD_LEAPFROG 1312 // Leapfrog #define BOARD_MEGACONTROLLER 1313 // Mega controller -#define BOARD_GT2560_REV_A 1314 // Geeetech GT2560 Rev. A -#define BOARD_GT2560_REV_A_PLUS 1315 // Geeetech GT2560 Rev. A+ (with auto level probe) -#define BOARD_GT2560_V3 1316 // Geeetech GT2560 Rev B for A10(M/D) -#define BOARD_GT2560_V3_MC2 1317 // Geeetech GT2560 Rev B for Mecreator2 -#define BOARD_GT2560_V3_A20 1318 // Geeetech GT2560 Rev B for A20(M/D) -#define BOARD_EINSTART_S 1319 // Einstart retrofit -#define BOARD_WANHAO_ONEPLUS 1320 // Wanhao 0ne+ i3 Mini -#define BOARD_LEAPFROG_XEED2015 1321 // Leapfrog Xeed 2015 -#define BOARD_PICA_REVB 1322 // PICA Shield (original version) -#define BOARD_PICA 1323 // PICA Shield (rev C or later) -#define BOARD_INTAMSYS40 1324 // Intamsys 4.0 (Funmat HT) +#define BOARD_GT2560_REV_A 1314 // Geeetech GT2560 Rev A +#define BOARD_GT2560_REV_A_PLUS 1315 // Geeetech GT2560 Rev A+ (with auto level probe) +#define BOARD_GT2560_REV_B 1316 // Geeetech GT2560 Rev B +#define BOARD_GT2560_V3 1317 // Geeetech GT2560 Rev B for A10(M/D) +#define BOARD_GT2560_V4 1318 // Geeetech GT2560 Rev B for A10(M/D) +#define BOARD_GT2560_V3_MC2 1319 // Geeetech GT2560 Rev B for Mecreator2 +#define BOARD_GT2560_V3_A20 1320 // Geeetech GT2560 Rev B for A20(M/D) +#define BOARD_EINSTART_S 1321 // Einstart retrofit +#define BOARD_WANHAO_ONEPLUS 1322 // Wanhao 0ne+ i3 Mini +#define BOARD_LEAPFROG_XEED2015 1323 // Leapfrog Xeed 2015 +#define BOARD_PICA_REVB 1324 // PICA Shield (original version) +#define BOARD_PICA 1325 // PICA Shield (rev C or later) +#define BOARD_INTAMSYS40 1326 // Intamsys 4.0 (Funmat HT) // // ATmega1281, ATmega2561 @@ -341,6 +343,7 @@ #define BOARD_FLSUN_HISPEED 4046 // FLSUN HiSpeedV1 (STM32F103VET6) #define BOARD_BEAST 4047 // STM32F103RET6 Libmaple-based controller #define BOARD_MINGDA_MPX_ARM_MINI 4048 // STM32F103ZET6 Mingda MD-16 +#define BOARD_GTM32_PRO_VD 4049 // STM32F103VET6 controller // // ARM Cortex-M4F diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_B.h b/Marlin/src/pins/mega/pins_GT2560_REV_B.h new file mode 100644 index 0000000000..be71ec4902 --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_REV_B.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Geeetech GT2560 Rev B Pins + */ + +#define BOARD_INFO_NAME "GT2560 Rev B" + +#include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index dd2d1d0f65..8490d5571d 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -22,14 +22,16 @@ #pragma once /** - * Geeetech GT2560 RevB + GT2560 3.0/3.1 + GT2560 4.0/4.1 pin assignments + * Geeetech GT2560 3.0/3.1 pin assignments + * + * Also GT2560 RevB and GT2560 4.0/4.1 */ #define ALLOW_MEGA1280 #include "env_validate.h" #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "GT2560 RevB/3.x/4.x" + #define BOARD_INFO_NAME "GT2560 3.x" #endif // diff --git a/Marlin/src/pins/mega/pins_GT2560_V4.h b/Marlin/src/pins/mega/pins_GT2560_V4.h new file mode 100644 index 0000000000..6ac07b70bf --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_V4.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Geeetech GT2560 V4.X Pins + */ + +#define BOARD_INFO_NAME "GT2560 4.x" + +#include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 35bfb266eb..e4c692a3b9 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -244,6 +244,10 @@ #include "mega/pins_GT2560_REV_A_PLUS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(GT2560_V3) #include "mega/pins_GT2560_V3.h" // ATmega2560 env:mega2560 +#elif MB(GT2560_REV_B) + #include "mega/pins_GT2560_REV_B.h" // ATmega2560 env:mega2560 +#elif MB(GT2560_V4) + #include "mega/pins_GT2560_V4.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V3_MC2) #include "mega/pins_GT2560_V3_MC2.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V3_A20) @@ -470,6 +474,8 @@ #include "stm32f1/pins_STM3R_MINI.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_PRO_VB) #include "stm32f1/pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F103RE +#elif MB(GTM32_PRO_VD) + #include "stm32f1/pins_GTM32_PRO_VD.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_MINI) #include "stm32f1/pins_GTM32_MINI.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_MINI_A30) diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index 18156fc0ff..2545642bae 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -22,13 +22,17 @@ #pragma once /** - * Geeetech GTM32 Pro VB/VD board pin assignments + * Geeetech GTM32 Pro VB board pin assignments * http://www.geeetech.com/wiki/index.php/File:Hardware_GTM32_PRO_VB.pdf + * + * Also applies to GTM32 Pro VD */ #include "env_validate.h" -#define BOARD_INFO_NAME "GTM32 Pro VB/VD" +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "GTM32 Pro VB" +#endif #define DEFAULT_MACHINE_NAME "STM32F103VET6" #define BOARD_NO_NATIVE_USB diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h new file mode 100644 index 0000000000..fb8c73c45f --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Geeetech GTM32 Pro VD board pin assignments + */ + +#define BOARD_INFO_NAME "GTM32 Pro VD" + +#include "pins_GTM32_PRO_VB.h" From 82e6a2ed62d255b54f733f6568a9abde23ea36de Mon Sep 17 00:00:00 2001 From: Marcio T Date: Thu, 1 Apr 2021 18:12:00 -0600 Subject: [PATCH 1236/1370] G26 Hilbert Curve followup (#21480) --- Marlin/src/core/utility.h | 2 +- Marlin/src/feature/bedlevel/abl/abl.cpp | 38 +- Marlin/src/feature/bedlevel/hilbert_curve.cpp | 8 +- .../bedlevel/mbl/mesh_bed_leveling.cpp | 8 +- .../feature/bedlevel/mbl/mesh_bed_leveling.h | 14 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 4 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 46 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 8 +- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 4 +- Marlin/src/gcode/bedlevel/G26.cpp | 667 +++++++++--------- Marlin/src/gcode/bedlevel/M420.cpp | 4 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 6 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 10 +- Marlin/src/inc/Conditionals_post.h | 5 + Marlin/src/inc/SanityCheck.h | 6 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- .../screens/bed_mesh_screen.cpp | 10 +- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 4 +- Marlin/src/lcd/menu/menu_ubl.cpp | 4 +- Marlin/src/lcd/tft/ui_320x240.cpp | 14 +- Marlin/src/lcd/tft/ui_480x320.cpp | 14 +- Marlin/src/module/settings.cpp | 4 +- 24 files changed, 442 insertions(+), 444 deletions(-) diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index 645a4be807..aaa241d460 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -34,7 +34,7 @@ void safe_delay(millis_t ms); inline void serial_delay(const millis_t) {} #endif -#if GRID_MAX_POINTS_X && GRID_MAX_POINTS_Y +#if (GRID_MAX_POINTS_X) && (GRID_MAX_POINTS_Y) // 16x16 bit arrays template diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index bc3aedb2f4..7390656563 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -85,9 +85,9 @@ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t //#define EXTRAPOLATE_FROM_EDGE #if ENABLED(EXTRAPOLATE_FROM_EDGE) - #if GRID_MAX_POINTS_X < GRID_MAX_POINTS_Y + #if (GRID_MAX_POINTS_X) < (GRID_MAX_POINTS_Y) #define HALF_IN_X - #elif GRID_MAX_POINTS_Y < GRID_MAX_POINTS_X + #elif (GRID_MAX_POINTS_Y) < (GRID_MAX_POINTS_X) #define HALF_IN_Y #endif #endif @@ -98,23 +98,23 @@ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t */ void extrapolate_unprobed_bed_level() { #ifdef HALF_IN_X - constexpr uint8_t ctrx2 = 0, xlen = GRID_MAX_POINTS_X - 1; + constexpr uint8_t ctrx2 = 0, xend = GRID_MAX_POINTS_X - 1; #else - constexpr uint8_t ctrx1 = (GRID_MAX_POINTS_X - 1) / 2, // left-of-center - ctrx2 = (GRID_MAX_POINTS_X) / 2, // right-of-center - xlen = ctrx1; + constexpr uint8_t ctrx1 = (GRID_MAX_CELLS_X) / 2, // left-of-center + ctrx2 = (GRID_MAX_POINTS_X) / 2, // right-of-center + xend = ctrx1; #endif #ifdef HALF_IN_Y - constexpr uint8_t ctry2 = 0, ylen = GRID_MAX_POINTS_Y - 1; + constexpr uint8_t ctry2 = 0, yend = GRID_MAX_POINTS_Y - 1; #else - constexpr uint8_t ctry1 = (GRID_MAX_POINTS_Y - 1) / 2, // top-of-center - ctry2 = (GRID_MAX_POINTS_Y) / 2, // bottom-of-center - ylen = ctry1; + constexpr uint8_t ctry1 = (GRID_MAX_CELLS_Y) / 2, // top-of-center + ctry2 = (GRID_MAX_POINTS_Y) / 2, // bottom-of-center + yend = ctry1; #endif - LOOP_LE_N(xo, xlen) - LOOP_LE_N(yo, ylen) { + LOOP_LE_N(xo, xend) + LOOP_LE_N(yo, yend) { uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo; #ifndef HALF_IN_X const uint8_t x1 = ctrx1 - xo; @@ -143,8 +143,8 @@ void print_bilinear_leveling_grid() { #if ENABLED(ABL_BILINEAR_SUBDIVISION) - #define ABL_GRID_POINTS_VIRT_X (GRID_MAX_POINTS_X - 1) * (BILINEAR_SUBDIVISIONS) + 1 - #define ABL_GRID_POINTS_VIRT_Y (GRID_MAX_POINTS_Y - 1) * (BILINEAR_SUBDIVISIONS) + 1 + #define ABL_GRID_POINTS_VIRT_X GRID_MAX_CELLS_X * (BILINEAR_SUBDIVISIONS) + 1 + #define ABL_GRID_POINTS_VIRT_Y GRID_MAX_CELLS_Y * (BILINEAR_SUBDIVISIONS) + 1 #define ABL_TEMP_POINTS_X (GRID_MAX_POINTS_X + 2) #define ABL_TEMP_POINTS_Y (GRID_MAX_POINTS_Y + 2) float z_values_virt[ABL_GRID_POINTS_VIRT_X][ABL_GRID_POINTS_VIRT_Y]; @@ -161,7 +161,7 @@ void print_bilinear_leveling_grid() { #define LINEAR_EXTRAPOLATION(E, I) ((E) * 2 - (I)) float bed_level_virt_coord(const uint8_t x, const uint8_t y) { uint8_t ep = 0, ip = 1; - if (x > GRID_MAX_POINTS_X + 1 || y > GRID_MAX_POINTS_Y + 1) { + if (x > (GRID_MAX_POINTS_X) + 1 || y > (GRID_MAX_POINTS_Y) + 1) { // The requested point requires extrapolating two points beyond the mesh. // These values are only requested for the edges of the mesh, which are always an actual mesh point, // and do not require interpolation. When interpolation is not needed, this "Mesh + 2" point is @@ -171,8 +171,8 @@ void print_bilinear_leveling_grid() { } if (!x || x == ABL_TEMP_POINTS_X - 1) { if (x) { - ep = GRID_MAX_POINTS_X - 1; - ip = GRID_MAX_POINTS_X - 2; + ep = (GRID_MAX_POINTS_X) - 1; + ip = GRID_MAX_CELLS_X - 1; } if (WITHIN(y, 1, ABL_TEMP_POINTS_Y - 2)) return LINEAR_EXTRAPOLATION( @@ -187,8 +187,8 @@ void print_bilinear_leveling_grid() { } if (!y || y == ABL_TEMP_POINTS_Y - 1) { if (y) { - ep = GRID_MAX_POINTS_Y - 1; - ip = GRID_MAX_POINTS_Y - 2; + ep = (GRID_MAX_POINTS_Y) - 1; + ip = GRID_MAX_CELLS_Y - 1; } if (WITHIN(x, 1, ABL_TEMP_POINTS_X - 2)) return LINEAR_EXTRAPOLATION( diff --git a/Marlin/src/feature/bedlevel/hilbert_curve.cpp b/Marlin/src/feature/bedlevel/hilbert_curve.cpp index 6150226e0b..e4bc3aa618 100644 --- a/Marlin/src/feature/bedlevel/hilbert_curve.cpp +++ b/Marlin/src/feature/bedlevel/hilbert_curve.cpp @@ -36,7 +36,7 @@ constexpr uint8_t dim = _BV(ord); static inline bool eval_candidate(int8_t x, int8_t y, hilbert_curve::callback_ptr func, void *data) { // The print bed likely has fewer points than the full Hilbert // curve, so cull unecessary points - return x < GRID_MAX_POINTS_X && y < GRID_MAX_POINTS_Y ? func(x, y, data) : false; + return x < (GRID_MAX_POINTS_X) && y < (GRID_MAX_POINTS_Y) ? func(x, y, data) : false; } bool hilbert_curve::hilbert(int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n, hilbert_curve::callback_ptr func, void *data) { @@ -102,10 +102,8 @@ bool hilbert_curve::search_from(uint8_t x, uint8_t y, hilbert_curve::callback_pt */ bool hilbert_curve::search_from_closest(const xy_pos_t &pos, hilbert_curve::callback_ptr func, void *data) { // Find closest grid intersection - uint8_t grid_x = LROUND(float(pos.x - MESH_MIN_X) / MESH_X_DIST); - uint8_t grid_y = LROUND(float(pos.y - MESH_MIN_Y) / MESH_Y_DIST); - LIMIT(grid_x, 0, GRID_MAX_POINTS_X); - LIMIT(grid_y, 0, GRID_MAX_POINTS_Y); + const uint8_t grid_x = LROUND(constrain(float(pos.x - (MESH_MIN_X)) / (MESH_X_DIST), 0, (GRID_MAX_POINTS_X) - 1)); + const uint8_t grid_y = LROUND(constrain(float(pos.y - (MESH_MIN_Y)) / (MESH_Y_DIST), 0, (GRID_MAX_POINTS_Y) - 1)); return search_from(grid_x, grid_y, func, data); } diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index f51d83f996..51cf28f890 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -64,10 +64,10 @@ void mesh_bed_leveling::line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { // Get current and destination cells for this line xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); - NOMORE(scel.x, GRID_MAX_POINTS_X - 2); - NOMORE(scel.y, GRID_MAX_POINTS_Y - 2); - NOMORE(ecel.x, GRID_MAX_POINTS_X - 2); - NOMORE(ecel.y, GRID_MAX_POINTS_Y - 2); + NOMORE(scel.x, GRID_MAX_CELLS_X - 1); + NOMORE(scel.y, GRID_MAX_CELLS_Y - 1); + NOMORE(ecel.x, GRID_MAX_CELLS_X - 1); + NOMORE(ecel.y, GRID_MAX_CELLS_Y - 1); // Start and end in the same cell? No split needed. if (scel == ecel) { diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index 9932ce9e5c..eadcc28aa4 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -32,8 +32,8 @@ enum MeshLevelingState : char { MeshReset // G29 S5 }; -#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) -#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) +#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / (GRID_MAX_CELLS_X)) +#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / (GRID_MAX_CELLS_Y)) #define _GET_MESH_X(I) mbl.index_to_xpos[I] #define _GET_MESH_Y(J) mbl.index_to_ypos[J] #define Z_VALUES_ARR mbl.z_values @@ -61,7 +61,7 @@ public: static inline void zigzag(const int8_t index, int8_t &px, int8_t &py) { px = index % (GRID_MAX_POINTS_X); py = index / (GRID_MAX_POINTS_X); - if (py & 1) px = (GRID_MAX_POINTS_X - 1) - px; // Zig zag + if (py & 1) px = (GRID_MAX_POINTS_X) - 1 - px; // Zig zag } static void set_zigzag_z(const int8_t index, const_float_t z) { @@ -72,11 +72,11 @@ public: static int8_t cell_index_x(const_float_t x) { int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); - return constrain(cx, 0, (GRID_MAX_POINTS_X) - 2); + return constrain(cx, 0, GRID_MAX_CELLS_X - 1); } static int8_t cell_index_y(const_float_t y) { int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); - return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 2); + return constrain(cy, 0, GRID_MAX_CELLS_Y - 1); } static inline xy_int8_t cell_indexes(const_float_t x, const_float_t y) { return { cell_index_x(x), cell_index_y(y) }; @@ -85,11 +85,11 @@ public: static int8_t probe_index_x(const_float_t x) { int8_t px = (x - (MESH_MIN_X) + 0.5f * (MESH_X_DIST)) * RECIPROCAL(MESH_X_DIST); - return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; + return WITHIN(px, 0, (GRID_MAX_POINTS_X) - 1) ? px : -1; } static int8_t probe_index_y(const_float_t y) { int8_t py = (y - (MESH_MIN_Y) + 0.5f * (MESH_Y_DIST)) * RECIPROCAL(MESH_Y_DIST); - return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; + return WITHIN(py, 0, (GRID_MAX_POINTS_Y) - 1) ? py : -1; } static inline xy_int8_t probe_indexes(const_float_t x, const_float_t y) { return { probe_index_x(x), probe_index_y(y) }; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 14491bdd81..164d267ceb 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -190,7 +190,7 @@ void unified_bed_leveling::display_map(const int map_type) { const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + probe.offset_xy); if (!lcd) SERIAL_EOL(); - for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { + for (int8_t j = (GRID_MAX_POINTS_Y) - 1; j >= 0; j--) { // Row Label (J index) if (human) { @@ -217,7 +217,7 @@ void unified_bed_leveling::display_map(const int map_type) { if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits } - if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); + if (csv && i < (GRID_MAX_POINTS_X) - 1) SERIAL_CHAR('\t'); // Closing Brace or Space if (human) SERIAL_CHAR(is_current ? ']' : ' '); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 222e7b0f20..dd6c261341 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -38,8 +38,8 @@ enum MeshPointType : char { INVALID, REAL, SET_IN_BITMAP }; struct mesh_index_pair; -#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) -#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) +#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / (GRID_MAX_CELLS_X)) +#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / (GRID_MAX_CELLS_Y)) #if ENABLED(OPTIMIZED_MESH_STORAGE) typedef int16_t mesh_store_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; @@ -142,19 +142,19 @@ public: } static int8_t cell_index_x_valid(const_float_t x) { - return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); + return WITHIN(cell_index_x_raw(x), 0, GRID_MAX_CELLS_X - 1); } static int8_t cell_index_y_valid(const_float_t y) { - return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); + return WITHIN(cell_index_y_raw(y), 0, GRID_MAX_CELLS_Y - 1); } static int8_t cell_index_x(const_float_t x) { - return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); + return constrain(cell_index_x_raw(x), 0, GRID_MAX_CELLS_X - 1); } static int8_t cell_index_y(const_float_t y) { - return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); + return constrain(cell_index_y_raw(y), 0, GRID_MAX_CELLS_Y - 1); } static inline xy_int8_t cell_indexes(const_float_t x, const_float_t y) { @@ -164,11 +164,11 @@ public: static int8_t closest_x_index(const_float_t x) { const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); - return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; + return WITHIN(px, 0, (GRID_MAX_POINTS_X) - 1) ? px : -1; } static int8_t closest_y_index(const_float_t y) { const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); - return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; + return WITHIN(py, 0, (GRID_MAX_POINTS_Y) - 1) ? py : -1; } static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { return { closest_x_index(xy.x), closest_y_index(xy.y) }; @@ -204,10 +204,10 @@ public: * the case where the printer is making a vertical line that only crosses horizontal mesh lines. */ static inline float z_correction_for_x_on_horizontal_mesh_line(const_float_t rx0, const int x1_i, const int yi) { - if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { + if (!WITHIN(x1_i, 0, (GRID_MAX_POINTS_X) - 1) || !WITHIN(yi, 0, (GRID_MAX_POINTS_Y) - 1)) { if (DEBUGGING(LEVELING)) { - if (WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); + if (WITHIN(x1_i, 0, (GRID_MAX_POINTS_X) - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0, ",x1_i=", x1_i, ",yi=", yi, ")"); } @@ -218,19 +218,19 @@ public: const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), z1 = z_values[x1_i][yi]; - return z1 + xratio * (z_values[_MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array - // If it is, it is clamped to the last element of the - // z_values[][] array and no correction is applied. + return z1 + xratio * (z_values[_MIN(x1_i, (GRID_MAX_POINTS_X) - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. } // // See comments above for z_correction_for_x_on_horizontal_mesh_line // static inline float z_correction_for_y_on_vertical_mesh_line(const_float_t ry0, const int xi, const int y1_i) { - if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { + if (!WITHIN(xi, 0, (GRID_MAX_POINTS_X) - 1) || !WITHIN(y1_i, 0, (GRID_MAX_POINTS_Y) - 1)) { if (DEBUGGING(LEVELING)) { - if (WITHIN(xi, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); + if (WITHIN(xi, 0, (GRID_MAX_POINTS_X) - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0, ", xi=", xi, ", y1_i=", y1_i, ")"); } @@ -241,9 +241,9 @@ public: const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), z1 = z_values[xi][y1_i]; - return z1 + yratio * (z_values[xi][_MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array - // If it is, it is clamped to the last element of the - // z_values[][] array and no correction is applied. + return z1 + yratio * (z_values[xi][_MIN(y1_i, (GRID_MAX_POINTS_Y) - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. } /** @@ -266,11 +266,11 @@ public: const float z1 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][cy], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1][cy]); const float z2 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); + mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1], + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1][_MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1]); float z0 = calc_z0(ry0, mesh_index_to_ypos(cy), z1, @@ -302,10 +302,10 @@ public: static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } static inline float mesh_index_to_xpos(const uint8_t i) { - return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); + return i < (GRID_MAX_POINTS_X) ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); } static inline float mesh_index_to_ypos(const uint8_t i) { - return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); + return i < (GRID_MAX_POINTS_Y) ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); } #if UBL_SEGMENTED diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 545d95676e..9153f369bd 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -433,8 +433,7 @@ void unified_bed_leveling::G29() { SERIAL_DECIMAL(param.XY_pos.y); SERIAL_ECHOLNPGM(").\n"); } - const xy_pos_t near_probe_xy = param.XY_pos + probe.offset_xy; - probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); + probe_entire_mesh(param.XY_pos, parser.seen('T'), parser.seen('E'), parser.seen('U')); report_current_position(); probe_deployed = true; @@ -1140,8 +1139,9 @@ bool unified_bed_leveling::G29_parse_parameters() { } // If X or Y are not valid, use center of the bed values - if (!COORDINATE_OKAY(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; - if (!COORDINATE_OKAY(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; + // (for UBL_HILBERT_CURVE default to lower-left corner instead) + if (!COORDINATE_OKAY(sx, X_MIN_BED, X_MAX_BED)) sx = TERN(UBL_HILBERT_CURVE, 0, X_CENTER); + if (!COORDINATE_OKAY(sy, Y_MIN_BED, Y_MAX_BED)) sy = TERN(UBL_HILBERT_CURVE, 0, Y_CENTER); if (err_flag) return UBL_ERR; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 4e522210d0..3ebc5fc2bd 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -397,8 +397,8 @@ int8_t((raw.x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)), int8_t((raw.y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)) }; - LIMIT(icell.x, 0, (GRID_MAX_POINTS_X) - 1); - LIMIT(icell.y, 0, (GRID_MAX_POINTS_Y) - 1); + LIMIT(icell.x, 0, GRID_MAX_CELLS_X); + LIMIT(icell.y, 0, GRID_MAX_CELLS_Y); float z_x0y0 = z_values[icell.x ][icell.y ], // z at lower left corner z_x1y0 = z_values[icell.x+1][icell.y ], // z at upper left corner diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index e05336d6c5..f3e9a78178 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -113,6 +113,10 @@ #include "../../module/temperature.h" #include "../../lcd/marlinui.h" +#if ENABLED(UBL_HILBERT_CURVE) + #include "../../feature/bedlevel/hilbert_curve.h" +#endif + #define EXTRUSION_MULTIPLIER 1.0 #define PRIME_LENGTH 10.0 #define OOZE_AMOUNT 0.3 @@ -145,24 +149,9 @@ constexpr float g26_e_axis_feedrate = 0.025; -static MeshFlags circle_flags, horizontal_mesh_line_flags, vertical_mesh_line_flags; +static MeshFlags circle_flags; float g26_random_deviation = 0.0; -static bool g26_retracted = false; // Track the retracted state of the nozzle so mismatched - // retracts/recovers won't result in a bad state. - -float g26_extrusion_multiplier, - g26_retraction_multiplier, - g26_layer_height, - g26_prime_length; - -xy_pos_t g26_xy_pos; // = { 0, 0 } - -int16_t g26_bed_temp, - g26_hotend_temp; - -int8_t g26_prime_flag; - #if HAS_LCD_MENU /** @@ -178,52 +167,17 @@ int8_t g26_prime_flag; #endif -mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { - float closest = 99999.99; - mesh_index_pair out_point; - - out_point.pos = -1; - - GRID_LOOP(i, j) { - if (!circle_flags.marked(i, j)) { - // We found a circle that needs to be printed - const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) }; - - // Get the distance to this intersection - float f = (pos - m).magnitude(); - - // It is possible that we are being called with the values - // to let us find the closest circle to the start position. - // But if this is not the case, add a small weighting to the - // distance calculation to help it choose a better place to continue. - f += (g26_xy_pos - m).magnitude() / 15.0f; - - // Add the specified amount of Random Noise to our search - if (g26_random_deviation > 1.0) f += random(0.0, g26_random_deviation); - - if (f < closest) { - closest = f; // Found a closer un-printed location - out_point.pos.set(i, j); // Save its data - out_point.distance = closest; - } - } - } - circle_flags.mark(out_point); // Mark this location as done. - return out_point; -} - void move_to(const_float_t rx, const_float_t ry, const_float_t z, const_float_t e_delta) { static float last_z = -999.99; const xy_pos_t dest = { rx, ry }; - const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. - const bool has_e_component = e_delta != 0.0; - - destination = current_position; + const bool has_xy_component = dest != current_position, // Check if X or Y is involved in the movement. + has_e_component = e_delta != 0.0; if (z != last_z) { - last_z = destination.z = z; + last_z = z; + destination.set(current_position.x, current_position.y, z, current_position.e); const feedRate_t fr_mm_s = planner.settings.max_feedrate_mm_s[Z_AXIS] * 0.5f; // Use half of the Z_AXIS max feed rate prepare_internal_move_to_destination(fr_mm_s); } @@ -239,241 +193,293 @@ void move_to(const_float_t rx, const_float_t ry, const_float_t z, const_float_t prepare_internal_move_to_destination(fr_mm_s); } -FORCE_INLINE void move_to(const xyz_pos_t &where, const_float_t de) { move_to(where.x, where.y, where.z, de); } +void move_to(const xyz_pos_t &where, const_float_t de) { move_to(where.x, where.y, where.z, de); } -void retract_filament(const xyz_pos_t &where) { - if (!g26_retracted) { // Only retract if we are not already retracted! - g26_retracted = true; - move_to(where, -1.0f * g26_retraction_multiplier); - } -} +typedef struct { + float extrusion_multiplier = EXTRUSION_MULTIPLIER, + retraction_multiplier = G26_RETRACT_MULTIPLIER, + layer_height = MESH_TEST_LAYER_HEIGHT, + prime_length = PRIME_LENGTH; -// TODO: Parameterize the Z lift with a define -void retract_lift_move(const xyz_pos_t &s) { - retract_filament(destination); - move_to(current_position.x, current_position.y, current_position.z + 0.5f, 0.0); // Z lift to minimize scraping - move_to(s.x, s.y, s.z + 0.5f, 0.0); // Get to the starting point with no extrusion while lifted -} + int16_t bed_temp = MESH_TEST_BED_TEMP, + hotend_temp = MESH_TEST_HOTEND_TEMP; -void recover_filament(const xyz_pos_t &where) { - if (g26_retracted) { // Only un-retract if we are retracted. - move_to(where, 1.2f * g26_retraction_multiplier); - g26_retracted = false; - } -} + float nozzle = MESH_TEST_NOZZLE_SIZE, + filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA, + ooze_amount; // 'O' ... OOZE_AMOUNT -/** - * print_line_from_here_to_there() takes two cartesian coordinates and draws a line from one - * to the other. But there are really three sets of coordinates involved. The first coordinate - * is the present location of the nozzle. We don't necessarily want to print from this location. - * We first need to move the nozzle to the start of line segment where we want to print. Once - * there, we can use the two coordinates supplied to draw the line. - * - * Note: Although we assume the first set of coordinates is the start of the line and the second - * set of coordinates is the end of the line, it does not always work out that way. This function - * optimizes the movement to minimize the travel distance before it can start printing. This saves - * a lot of time and eliminates a lot of nonsensical movement of the nozzle. However, it does - * cause a lot of very little short retracement of th nozzle when it draws the very first line - * segment of a 'circle'. The time this requires is very short and is easily saved by the other - * cases where the optimization comes into play. - */ -void print_line_from_here_to_there(const xyz_pos_t &s, const xyz_pos_t &e) { + bool continue_with_closest, // 'C' + keep_heaters_on; // 'K' - // Distances to the start / end of the line - xy_float_t svec = current_position - s, evec = current_position - e; + xy_pos_t xy_pos; // = { 0, 0 } - const float dist_start = HYPOT2(svec.x, svec.y), - dist_end = HYPOT2(evec.x, evec.y), - line_length = HYPOT(e.x - s.x, e.y - s.y); + int8_t prime_flag = 0; - // If the end point of the line is closer to the nozzle, flip the direction, - // moving from the end to the start. On very small lines the optimization isn't worth it. - if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) - return print_line_from_here_to_there(e, s); + bool g26_retracted = false; // Track the retracted state during G26 so mismatched + // retracts/recovers don't result in a bad state. - // Decide whether to retract & lift - if (dist_start > 2.0) retract_lift_move(s); - - move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift - - const float e_pos_delta = line_length * g26_e_axis_feedrate * g26_extrusion_multiplier; - - recover_filament(destination); - move_to(e, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion -} - -inline bool look_for_lines_to_connect() { - xyz_pos_t s, e; - s.z = e.z = g26_layer_height; - - GRID_LOOP(i, j) { - - if (TERN0(HAS_LCD_MENU, user_canceled())) return true; - - if (i < (GRID_MAX_POINTS_X)) { // Can't connect to anything farther to the right than GRID_MAX_POINTS_X. - // Already a half circle at the edge of the bed. - - if (circle_flags.marked(i, j) && circle_flags.marked(i + 1, j)) { // Test whether a leftward line can be done - if (!horizontal_mesh_line_flags.marked(i, j)) { - // Two circles need a horizontal line to connect them - s.x = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge - e.x = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge - - #if HAS_ENDSTOPS - LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); - s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); - #else - s.y = e.y = _GET_MESH_Y(j); - #endif - - if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) - print_line_from_here_to_there(s, e); - - horizontal_mesh_line_flags.mark(i, j); // Mark done, even if skipped - } - } - - if (j < (GRID_MAX_POINTS_Y)) { // Can't connect to anything further back than GRID_MAX_POINTS_Y. - // Already a half circle at the edge of the bed. - - if (circle_flags.marked(i, j) && circle_flags.marked(i, j + 1)) { // Test whether a downward line can be done - if (!vertical_mesh_line_flags.marked(i, j)) { - // Two circles that need a vertical line to connect them - s.y = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge - e.y = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge - - #if HAS_ENDSTOPS - s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); - LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - #else - s.x = e.x = _GET_MESH_X(i); - #endif - - if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) - print_line_from_here_to_there(s, e); - - vertical_mesh_line_flags.mark(i, j); // Mark done, even if skipped - } - } - } + void retract_filament(const xyz_pos_t &where) { + if (!g26_retracted) { // Only retract if we are not already retracted! + g26_retracted = true; + move_to(where, -1.0f * retraction_multiplier); } } - return false; -} -/** - * Turn on the bed and nozzle heat and - * wait for them to get up to temperature. - */ -inline bool turn_on_heaters() { - - SERIAL_ECHOLNPGM("Waiting for heatup."); - - #if HAS_HEATED_BED - - if (g26_bed_temp > 25) { - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99); - ui.quick_feedback(); - TERN_(HAS_LCD_MENU, ui.capture()); - #endif - thermalManager.setTargetBed(g26_bed_temp); - - // Wait for the temperature to stabilize - if (!thermalManager.wait_for_bed(true - #if G26_CLICK_CAN_CANCEL - , true - #endif - ) - ) return G26_ERR; - } - - #endif // HAS_HEATED_BED - - // Start heating the active nozzle - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99); - ui.quick_feedback(); - #endif - thermalManager.setTargetHotend(g26_hotend_temp, active_extruder); - - // Wait for the temperature to stabilize - if (!thermalManager.wait_for_hotend(active_extruder, true - #if G26_CLICK_CAN_CANCEL - , true - #endif - )) return G26_ERR; - - #if HAS_WIRED_LCD - ui.reset_status(); - ui.quick_feedback(); - #endif - - return G26_OK; -} - -/** - * Prime the nozzle if needed. Return true on error. - */ -inline bool prime_nozzle() { - - const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; - #if HAS_LCD_MENU && !HAS_TOUCH_BUTTONS // ui.button_pressed issue with touchscreen - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - float Total_Prime = 0.0; - #endif - - if (g26_prime_flag == -1) { // The user wants to control how much filament gets purged - ui.capture(); - ui.set_status_P(GET_TEXT(MSG_G26_MANUAL_PRIME), 99); - ui.chirp(); - - destination = current_position; - - recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). - - while (!ui.button_pressed()) { - ui.chirp(); - destination.e += 0.25; - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - Total_Prime += 0.25; - if (Total_Prime >= EXTRUDE_MAXLENGTH) { - ui.release(); - return G26_ERR; - } - #endif - prepare_internal_move_to_destination(fr_slow_e); - destination = current_position; - planner.synchronize(); // Without this synchronize, the purge is more consistent, - // but because the planner has a buffer, we won't be able - // to stop as quickly. So we put up with the less smooth - // action to give the user a more responsive 'Stop'. - } - - ui.wait_for_release(); - - ui.set_status_P(GET_TEXT(MSG_G26_PRIME_DONE), 99); - ui.quick_feedback(); - ui.release(); - } - else - #endif - { - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99); - ui.quick_feedback(); - #endif - destination = current_position; - destination.e += g26_prime_length; - prepare_internal_move_to_destination(fr_slow_e); - destination.e -= g26_prime_length; + // TODO: Parameterize the Z lift with a define + void retract_lift_move(const xyz_pos_t &s) { retract_filament(destination); + move_to(current_position.x, current_position.y, current_position.z + 0.5f, 0.0f); // Z lift to minimize scraping + move_to(s.x, s.y, s.z + 0.5f, 0.0f); // Get to the starting point with no extrusion while lifted } - return G26_OK; -} + void recover_filament(const xyz_pos_t &where) { + if (g26_retracted) { // Only un-retract if we are retracted. + move_to(where, 1.2f * retraction_multiplier); + g26_retracted = false; + } + } + + /** + * print_line_from_here_to_there() takes two cartesian coordinates and draws a line from one + * to the other. But there are really three sets of coordinates involved. The first coordinate + * is the present location of the nozzle. We don't necessarily want to print from this location. + * We first need to move the nozzle to the start of line segment where we want to print. Once + * there, we can use the two coordinates supplied to draw the line. + * + * Note: Although we assume the first set of coordinates is the start of the line and the second + * set of coordinates is the end of the line, it does not always work out that way. This function + * optimizes the movement to minimize the travel distance before it can start printing. This saves + * a lot of time and eliminates a lot of nonsensical movement of the nozzle. However, it does + * cause a lot of very little short retracement of th nozzle when it draws the very first line + * segment of a 'circle'. The time this requires is very short and is easily saved by the other + * cases where the optimization comes into play. + */ + void print_line_from_here_to_there(const xyz_pos_t &s, const xyz_pos_t &e) { + + // Distances to the start / end of the line + xy_float_t svec = current_position - s, evec = current_position - e; + + const float dist_start = HYPOT2(svec.x, svec.y), + dist_end = HYPOT2(evec.x, evec.y), + line_length = HYPOT(e.x - s.x, e.y - s.y); + + // If the end point of the line is closer to the nozzle, flip the direction, + // moving from the end to the start. On very small lines the optimization isn't worth it. + if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) + return print_line_from_here_to_there(e, s); + + // Decide whether to retract & lift + if (dist_start > 2.0) retract_lift_move(s); + + move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift + + const float e_pos_delta = line_length * g26_e_axis_feedrate * extrusion_multiplier; + + recover_filament(destination); + move_to(e, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion + } + + void connect_neighbor_with_line(const xy_int8_t &p1, int8_t dx, int8_t dy) { + xy_int8_t p2; + p2.x = p1.x + dx; + p2.y = p1.y + dy; + + if (p2.x < 0 || p2.x >= (GRID_MAX_POINTS_X)) return; + if (p2.y < 0 || p2.y >= (GRID_MAX_POINTS_Y)) return; + + if(circle_flags.marked(p1.x, p1.y) && circle_flags.marked(p2.x, p2.y)) { + xyz_pos_t s, e; + s.x = _GET_MESH_X(p1.x) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dx; + e.x = _GET_MESH_X(p2.x) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dx; + s.y = _GET_MESH_Y(p1.y) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dy; + e.y = _GET_MESH_Y(p2.y) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dy; + s.z = e.z = layer_height; + + #if HAS_ENDSTOPS + LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); + #endif + + if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) + print_line_from_here_to_there(s, e); + } + } + + /** + * Turn on the bed and nozzle heat and + * wait for them to get up to temperature. + */ + bool turn_on_heaters() { + + SERIAL_ECHOLNPGM("Waiting for heatup."); + + #if HAS_HEATED_BED + + if (bed_temp > 25) { + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99); + ui.quick_feedback(); + TERN_(HAS_LCD_MENU, ui.capture()); + #endif + thermalManager.setTargetBed(bed_temp); + + // Wait for the temperature to stabilize + if (!thermalManager.wait_for_bed(true + #if G26_CLICK_CAN_CANCEL + , true + #endif + ) + ) return G26_ERR; + } + + #else + + UNUSED(bed_temp); + + #endif // HAS_HEATED_BED + + // Start heating the active nozzle + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99); + ui.quick_feedback(); + #endif + thermalManager.setTargetHotend(hotend_temp, active_extruder); + + // Wait for the temperature to stabilize + if (!thermalManager.wait_for_hotend(active_extruder, true + #if G26_CLICK_CAN_CANCEL + , true + #endif + )) return G26_ERR; + + #if HAS_WIRED_LCD + ui.reset_status(); + ui.quick_feedback(); + #endif + + return G26_OK; + } + + /** + * Prime the nozzle if needed. Return true on error. + */ + bool prime_nozzle() { + + const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; + #if HAS_LCD_MENU && !HAS_TOUCH_BUTTONS // ui.button_pressed issue with touchscreen + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + float Total_Prime = 0.0; + #endif + + if (prime_flag == -1) { // The user wants to control how much filament gets purged + ui.capture(); + ui.set_status_P(GET_TEXT(MSG_G26_MANUAL_PRIME), 99); + ui.chirp(); + + destination = current_position; + + recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). + + while (!ui.button_pressed()) { + ui.chirp(); + destination.e += 0.25; + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + Total_Prime += 0.25; + if (Total_Prime >= EXTRUDE_MAXLENGTH) { + ui.release(); + return G26_ERR; + } + #endif + prepare_internal_move_to_destination(fr_slow_e); + destination = current_position; + planner.synchronize(); // Without this synchronize, the purge is more consistent, + // but because the planner has a buffer, we won't be able + // to stop as quickly. So we put up with the less smooth + // action to give the user a more responsive 'Stop'. + } + + ui.wait_for_release(); + + ui.set_status_P(GET_TEXT(MSG_G26_PRIME_DONE), 99); + ui.quick_feedback(); + ui.release(); + } + else + #endif + { + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99); + ui.quick_feedback(); + #endif + destination = current_position; + destination.e += prime_length; + prepare_internal_move_to_destination(fr_slow_e); + destination.e -= prime_length; + retract_filament(destination); + } + + return G26_OK; + } + + /** + * Find the nearest point at which to print a circle + */ + mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { + + mesh_index_pair out_point; + out_point.pos = -1; + + #if ENABLED(UBL_HILBERT_CURVE) + + auto test_func = [](uint8_t i, uint8_t j, void *data) -> bool { + if (!circle_flags.marked(i, j)) { + mesh_index_pair *out_point = (mesh_index_pair*)data; + out_point->pos.set(i, j); // Save its data + return true; + } + return false; + }; + + hilbert_curve::search_from_closest(pos, test_func, &out_point); + + #else + + float closest = 99999.99; + + GRID_LOOP(i, j) { + if (!circle_flags.marked(i, j)) { + // We found a circle that needs to be printed + const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) }; + + // Get the distance to this intersection + float f = (pos - m).magnitude(); + + // It is possible that we are being called with the values + // to let us find the closest circle to the start position. + // But if this is not the case, add a small weighting to the + // distance calculation to help it choose a better place to continue. + f += (xy_pos - m).magnitude() / 15.0f; + + // Add the specified amount of Random Noise to our search + if (g26_random_deviation > 1.0) f += random(0.0, g26_random_deviation); + + if (f < closest) { + closest = f; // Found a closer un-printed location + out_point.pos.set(i, j); // Save its data + out_point.distance = closest; + } + } + } + + #endif + + circle_flags.mark(out_point); // Mark this location as done. + return out_point; + } + +} g26_helper_t; /** * G26: Mesh Validation Pattern generation. @@ -510,20 +516,11 @@ void GcodeSuite::G26() { // Change the tool first, if specified if (parser.seenval('T')) tool_change(parser.value_int()); - g26_extrusion_multiplier = EXTRUSION_MULTIPLIER; - g26_retraction_multiplier = G26_RETRACT_MULTIPLIER; - g26_layer_height = MESH_TEST_LAYER_HEIGHT; - g26_prime_length = PRIME_LENGTH; - g26_bed_temp = MESH_TEST_BED_TEMP; - g26_hotend_temp = MESH_TEST_HOTEND_TEMP; - g26_prime_flag = 0; + g26_helper_t g26; - float g26_nozzle = MESH_TEST_NOZZLE_SIZE, - g26_filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA, - g26_ooze_amount = parser.linearval('O', OOZE_AMOUNT); - - bool g26_continue_with_closest = parser.boolval('C'), - g26_keep_heaters_on = parser.boolval('K'); + g26.ooze_amount = parser.linearval('O', OOZE_AMOUNT); + g26.continue_with_closest = parser.boolval('C'); + g26.keep_heaters_on = parser.boolval('K'); // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -548,14 +545,14 @@ void GcodeSuite::G26() { SERIAL_ECHOLNPAIR("?Specified bed temperature not plausible (40-", BED_MAX_TARGET, "C)."); return; } - g26_bed_temp = bedtemp; + g26.bed_temp = bedtemp; } #endif // HAS_HEATED_BED if (parser.seenval('L')) { - g26_layer_height = parser.value_linear_units(); - if (!WITHIN(g26_layer_height, 0.0, 2.0)) { + g26.layer_height = parser.value_linear_units(); + if (!WITHIN(g26.layer_height, 0.0, 2.0)) { SERIAL_ECHOLNPGM("?Specified layer height not plausible."); return; } @@ -563,8 +560,8 @@ void GcodeSuite::G26() { if (parser.seen('Q')) { if (parser.has_value()) { - g26_retraction_multiplier = parser.value_float(); - if (!WITHIN(g26_retraction_multiplier, 0.05, 15.0)) { + g26.retraction_multiplier = parser.value_float(); + if (!WITHIN(g26.retraction_multiplier, 0.05, 15.0)) { SERIAL_ECHOLNPGM("?Specified Retraction Multiplier not plausible."); return; } @@ -576,8 +573,8 @@ void GcodeSuite::G26() { } if (parser.seenval('S')) { - g26_nozzle = parser.value_float(); - if (!WITHIN(g26_nozzle, 0.1, 2.0)) { + g26.nozzle = parser.value_float(); + if (!WITHIN(g26.nozzle, 0.1, 2.0)) { SERIAL_ECHOLNPGM("?Specified nozzle size not plausible."); return; } @@ -586,16 +583,16 @@ void GcodeSuite::G26() { if (parser.seen('P')) { if (!parser.has_value()) { #if HAS_LCD_MENU - g26_prime_flag = -1; + g26.prime_flag = -1; #else SERIAL_ECHOLNPGM("?Prime length must be specified when not using an LCD."); return; #endif } else { - g26_prime_flag++; - g26_prime_length = parser.value_linear_units(); - if (!WITHIN(g26_prime_length, 0.0, 25.0)) { + g26.prime_flag++; + g26.prime_length = parser.value_linear_units(); + if (!WITHIN(g26.prime_length, 0.0, 25.0)) { SERIAL_ECHOLNPGM("?Specified prime length not plausible."); return; } @@ -603,17 +600,17 @@ void GcodeSuite::G26() { } if (parser.seenval('F')) { - g26_filament_diameter = parser.value_linear_units(); - if (!WITHIN(g26_filament_diameter, 1.0, 4.0)) { + g26.filament_diameter = parser.value_linear_units(); + if (!WITHIN(g26.filament_diameter, 1.0, 4.0)) { SERIAL_ECHOLNPGM("?Specified filament size not plausible."); return; } } - g26_extrusion_multiplier *= sq(1.75) / sq(g26_filament_diameter); // If we aren't using 1.75mm filament, we need to + g26.extrusion_multiplier *= sq(1.75) / sq(g26.filament_diameter); // If we aren't using 1.75mm filament, we need to // scale up or down the length needed to get the // same volume of filament - g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size + g26.extrusion_multiplier *= g26.filament_diameter * sq(g26.nozzle) / sq(0.3); // Scale up by nozzle size // Get a temperature from 'I' or 'H' celsius_t noztemp = 0; @@ -632,7 +629,7 @@ void GcodeSuite::G26() { SERIAL_ECHOLNPGM("?Specified nozzle temperature not plausible."); return; } - g26_hotend_temp = noztemp; + g26.hotend_temp = noztemp; } // 'U' to Randomize and optionally set circle deviation @@ -660,9 +657,9 @@ void GcodeSuite::G26() { } // Set a position with 'X' and/or 'Y'. Default: current_position - g26_xy_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x, + g26.xy_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x, parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position.y); - if (!position_is_reachable(g26_xy_pos)) { + if (!position_is_reachable(g26.xy_pos)) { SERIAL_ECHOLNPGM("?Specified X,Y coordinate out of bounds."); return; } @@ -680,12 +677,12 @@ void GcodeSuite::G26() { planner.calculate_volumetric_multipliers(); #endif - if (turn_on_heaters() != G26_OK) goto LEAVE; + if (g26.turn_on_heaters() != G26_OK) goto LEAVE; current_position.e = 0.0; sync_plan_position_e(); - if (g26_prime_flag && prime_nozzle() != G26_OK) goto LEAVE; + if (g26.prime_flag && g26.prime_nozzle() != G26_OK) goto LEAVE; /** * Bed is preheated @@ -698,14 +695,12 @@ void GcodeSuite::G26() { */ circle_flags.reset(); - horizontal_mesh_line_flags.reset(); - vertical_mesh_line_flags.reset(); // Move nozzle to the specified height for the first layer destination = current_position; - destination.z = g26_layer_height; + destination.z = g26.layer_height; move_to(destination, 0.0); - move_to(destination, g26_ooze_amount); + move_to(destination, g26.ooze_amount); TERN_(HAS_LCD_MENU, ui.capture()); @@ -732,7 +727,7 @@ void GcodeSuite::G26() { mesh_index_pair location; do { // Find the nearest confluence - location = find_closest_circle_to_print(g26_continue_with_closest ? xy_pos_t(current_position) : g26_xy_pos); + location = g26.find_closest_circle_to_print(g26.continue_with_closest ? xy_pos_t(current_position) : g26.xy_pos); if (location.valid()) { const xy_pos_t circle = _GET_MESH_POS(location.pos); @@ -762,7 +757,7 @@ void GcodeSuite::G26() { if (!b) { e.x = circle.x; e.y += INTERSECTION_CIRCLE_RADIUS; } arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); } - else if (r) { // right edge + else if (r) { // right edge if (b) s.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); else s.set(circle.x, circle.y + INTERSECTION_CIRCLE_RADIUS); if (f) e.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); @@ -782,25 +777,24 @@ void GcodeSuite::G26() { const xy_float_t dist = current_position - s; // Distance from the start of the actual circle const float dist_start = HYPOT2(dist.x, dist.y); const xyze_pos_t endpoint = { - e.x, e.y, g26_layer_height, - current_position.e + (arc_length * g26_e_axis_feedrate * g26_extrusion_multiplier) + e.x, e.y, g26.layer_height, + current_position.e + (arc_length * g26_e_axis_feedrate * g26.extrusion_multiplier) }; if (dist_start > 2.0) { - s.z = g26_layer_height + 0.5f; - retract_lift_move(s); + s.z = g26.layer_height + 0.5f; + g26.retract_lift_move(s); } - s.z = g26_layer_height; + s.z = g26.layer_height; move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift - recover_filament(destination); + g26.recover_filament(destination); - const feedRate_t old_feedrate = feedrate_mm_s; - feedrate_mm_s = PLANNER_XY_FEEDRATE() * 0.1f; - plan_arc(endpoint, arc_offset, false, 0); // Draw a counter-clockwise arc - feedrate_mm_s = old_feedrate; - destination = current_position; + { REMEMBER(fr, feedrate_mm_s, PLANNER_XY_FEEDRATE() * 0.1f); + plan_arc(endpoint, arc_offset, false, 0); // Draw a counter-clockwise arc + destination = current_position; + } if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; // Check if the user wants to stop the Mesh Validation @@ -828,8 +822,8 @@ void GcodeSuite::G26() { if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; // Check if the user wants to stop the Mesh Validation - xyz_float_t p = { circle.x + _COS(ind ), circle.y + _SIN(ind ), g26_layer_height }, - q = { circle.x + _COS(ind + 1), circle.y + _SIN(ind + 1), g26_layer_height }; + xyz_float_t p = { circle.x + _COS(ind ), circle.y + _SIN(ind ), g26.layer_height }, + q = { circle.x + _COS(ind + 1), circle.y + _SIN(ind + 1), g26.layer_height }; #if IS_KINEMATIC // Check to make sure this segment is entirely on the bed, skip if not. @@ -841,13 +835,17 @@ void GcodeSuite::G26() { LIMIT(q.y, Y_MIN_POS + 1, Y_MAX_POS - 1); #endif - print_line_from_here_to_there(p, q); + g26.print_line_from_here_to_there(p, q); SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } #endif // !ARC_SUPPORT - if (look_for_lines_to_connect()) goto LEAVE; + g26.connect_neighbor_with_line(location.pos, -1, 0); + g26.connect_neighbor_with_line(location.pos, 1, 0); + g26.connect_neighbor_with_line(location.pos, 0, -1); + g26.connect_neighbor_with_line(location.pos, 0, 1); + if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; } SERIAL_FLUSH(); // Prevent host M105 buffer overrun. @@ -857,12 +855,9 @@ void GcodeSuite::G26() { LEAVE: ui.set_status_P(GET_TEXT(MSG_G26_LEAVING), -1); - retract_filament(destination); + g26.retract_filament(destination); destination.z = Z_CLEARANCE_BETWEEN_PROBES; - move_to(destination, 0); // Raise the nozzle - - destination = g26_xy_pos; // Move back to the starting XY position - move_to(destination, 0); // Move back to the starting position + move_to(destination, 0); // Raise the nozzle #if DISABLED(NO_VOLUMETRICS) parser.volumetric_enabled = volumetric_was_enabled; @@ -871,7 +866,7 @@ void GcodeSuite::G26() { TERN_(HAS_LCD_MENU, ui.release()); // Give back control of the LCD - if (!g26_keep_heaters_on) { + if (!g26.keep_heaters_on) { TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(0)); thermalManager.setTargetHotend(active_extruder, 0); } diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index 55b14c19dc..e42a590265 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -68,8 +68,8 @@ void GcodeSuite::M420() { y_min = probe.min_y(), y_max = probe.max_y(); #if ENABLED(AUTO_BED_LEVELING_BILINEAR) bilinear_start.set(x_min, y_min); - bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_POINTS_X - 1), - (y_max - y_min) / (GRID_MAX_POINTS_Y - 1)); + bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_CELLS_X), + (y_max - y_min) / (GRID_MAX_CELLS_Y)); #endif GRID_LOOP(x, y) { Z_VALUES(x, y) = 0.001 * random(-200, 200); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 42d3a75da1..654a381383 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -295,10 +295,10 @@ G29_TYPE GcodeSuite::G29() { // Get nearest i / j from rx / ry i = (rx - bilinear_start.x + 0.5 * abl.gridSpacing.x) / abl.gridSpacing.x; j = (ry - bilinear_start.y + 0.5 * abl.gridSpacing.y) / abl.gridSpacing.y; - LIMIT(i, 0, GRID_MAX_POINTS_X - 1); - LIMIT(j, 0, GRID_MAX_POINTS_Y - 1); + LIMIT(i, 0, (GRID_MAX_POINTS_X) - 1); + LIMIT(j, 0, (GRID_MAX_POINTS_Y) - 1); } - if (WITHIN(i, 0, GRID_MAX_POINTS_X - 1) && WITHIN(j, 0, GRID_MAX_POINTS_Y)) { + if (WITHIN(i, 0, (GRID_MAX_POINTS_X) - 1) && WITHIN(j, 0, (GRID_MAX_POINTS_Y) - 1)) { set_bed_leveling_enabled(false); z_values[i][j] = rz; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 278a39b4f8..1ec514c3ec 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -106,7 +106,7 @@ void GcodeSuite::G29() { SET_SOFT_ENDSTOP_LOOSE(false); } // If there's another point to sample, move there with optional lift. - if (mbl_probe_index < GRID_MAX_POINTS) { + if (mbl_probe_index < (GRID_MAX_POINTS)) { // Disable software endstops to allow manual adjustment // If G29 is left hanging without completion they won't be re-enabled! SET_SOFT_ENDSTOP_LOOSE(true); @@ -142,8 +142,8 @@ void GcodeSuite::G29() { case MeshSet: if (parser.seenval('I')) { ix = parser.value_int(); - if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) { - SERIAL_ECHOLNPAIR("I out of range (0-", GRID_MAX_POINTS_X - 1, ")"); + if (!WITHIN(ix, 0, (GRID_MAX_POINTS_X) - 1)) { + SERIAL_ECHOLNPAIR("I out of range (0-", (GRID_MAX_POINTS_X) - 1, ")"); return; } } @@ -152,8 +152,8 @@ void GcodeSuite::G29() { if (parser.seenval('J')) { iy = parser.value_int(); - if (!WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { - SERIAL_ECHOLNPAIR("J out of range (0-", GRID_MAX_POINTS_Y - 1, ")"); + if (!WITHIN(iy, 0, (GRID_MAX_POINTS_Y) - 1)) { + SERIAL_ECHOLNPAIR("J out of range (0-", (GRID_MAX_POINTS_Y) - 1, ")"); return; } } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 2433050528..337cf2a950 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -224,6 +224,11 @@ #endif #endif +#ifdef GRID_MAX_POINTS_X + #define GRID_MAX_CELLS_X (GRID_MAX_POINTS_X - 1) + #define GRID_MAX_CELLS_Y (GRID_MAX_POINTS_Y - 1) +#endif + /** * Host keep alive */ diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 647e0d55dd..48a536b531 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1263,9 +1263,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif ENABLED(DELTA_CALIBRATION_MENU) && !HAS_LCD_MENU #error "DELTA_CALIBRATION_MENU requires an LCD Controller." #elif ABL_USES_GRID - #if (GRID_MAX_POINTS_X & 1) == 0 || (GRID_MAX_POINTS_Y & 1) == 0 + #if ((GRID_MAX_POINTS_X) & 1) == 0 || ((GRID_MAX_POINTS_Y) & 1) == 0 #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be odd numbers." - #elif GRID_MAX_POINTS_X < 3 + #elif (GRID_MAX_POINTS_X) < 3 #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be 3 or higher." #endif #endif @@ -1518,7 +1518,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS // Mesh Bed Leveling #if ENABLED(DELTA) #error "MESH_BED_LEVELING is not compatible with DELTA printers." - #elif GRID_MAX_POINTS_X > 9 || GRID_MAX_POINTS_Y > 9 + #elif (GRID_MAX_POINTS_X) > 9 || (GRID_MAX_POINTS_Y) > 9 #error "GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y must be less than 10 for MBL." #endif diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index e18ed7273c..61c7ce18d6 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1279,7 +1279,7 @@ void MarlinUI::draw_status_screen() { pixels_per_x_mesh_pnt, pixels_per_y_mesh_pnt, suppress_x_offset = 0, suppress_y_offset = 0; - const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y - 1) - y_plot; + const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y) - 1 - y_plot; upper_left.column = 0; upper_left.row = 0; diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index e41ed62573..44ada03c7e 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -529,7 +529,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Fill in the Specified Mesh Point - const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y - 1) - y_plot; // The origin is typically in the lower right corner. We need to + const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y) - 1 - y_plot; // The origin is typically in the lower right corner. We need to // invert the Y to get it to plot in the right location. const u8g_uint_t by = y_offset + y_plot_inv * pixels_per_y_mesh_pnt; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index f8b4b5b5d1..cba27931f2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -53,12 +53,12 @@ constexpr static float gaugeThickness = 0.25; #endif void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max) { - constexpr uint8_t rows = GRID_MAX_POINTS_Y; - constexpr uint8_t cols = GRID_MAX_POINTS_X; + constexpr uint8_t rows = GRID_MAX_POINTS_Y; + constexpr uint8_t cols = GRID_MAX_POINTS_X; - #define VALUE(X,Y) (data ? data[X][Y] : 0) - #define ISVAL(X,Y) (data ? !isnan(VALUE(X,Y)) : true) - #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) + #define VALUE(X,Y) (data ? data[X][Y] : 0) + #define ISVAL(X,Y) (data ? !isnan(VALUE(X,Y)) : true) + #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) // Compute the mean, min and max for the points diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 2eecda9df0..2cac0f8e77 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -859,7 +859,7 @@ namespace ExtUI { bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } void setMeshPoint(const xy_uint8_t &pos, const_float_t zoff) { - if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { + if (WITHIN(pos.x, 0, (GRID_MAX_POINTS_X) - 1) && WITHIN(pos.y, 0, (GRID_MAX_POINTS_Y) - 1)) { Z_VALUES(pos.x, pos.y) = zoff; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); } diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 6a9f89f118..5fc9fbccbd 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -214,8 +214,8 @@ static uint8_t xind, yind; // =0 START_MENU(); BACK_ITEM(MSG_BED_LEVELING); - EDIT_ITEM(uint8, MSG_MESH_X, &xind, 0, GRID_MAX_POINTS_X - 1); - EDIT_ITEM(uint8, MSG_MESH_Y, &yind, 0, GRID_MAX_POINTS_Y - 1); + EDIT_ITEM(uint8, MSG_MESH_X, &xind, 0, (GRID_MAX_POINTS_X) - 1); + EDIT_ITEM(uint8, MSG_MESH_Y, &yind, 0, (GRID_MAX_POINTS_Y) - 1); EDIT_ITEM_FAST(float43, MSG_MESH_EDIT_Z, &Z_VALUES(xind, yind), -(LCD_PROBE_Z_RANGE) * 0.5, (LCD_PROBE_Z_RANGE) * 0.5, refresh_planner); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 876c9ae621..1ab44856dc 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -484,8 +484,8 @@ void ubl_map_screen() { #if IS_KINEMATIC n_edit_pts = 9; // TODO: Delta accessible edit points #else - const bool xc = WITHIN(x, 1, GRID_MAX_POINTS_X - 2), - yc = WITHIN(y, 1, GRID_MAX_POINTS_Y - 2); + const bool xc = WITHIN(x, 1, (GRID_MAX_POINTS_X) - 2), + yc = WITHIN(y, 1, (GRID_MAX_POINTS_Y) - 2); n_edit_pts = yc ? (xc ? 9 : 6) : (xc ? 6 : 4); // Corners #endif diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 793ee60847..5563d3069b 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -462,12 +462,12 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); - for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) - for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + for (uint16_t x = 0; x < (GRID_MAX_POINTS_X); x++) + for (uint16_t y = 0; y < (GRID_MAX_POINTS_Y); y++) if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) - tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / (GRID_MAX_POINTS_X) / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / (GRID_MAX_POINTS_Y) / 2), 2, 2, COLOR_UBL); - tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / (GRID_MAX_POINTS_X) / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / (GRID_MAX_POINTS_Y) / 2), 6, 6, COLOR_UBL); const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, lpos = pos.asLogical(); @@ -512,9 +512,9 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #if ENABLED(TOUCH_SCREEN) touch.clear(); draw_menu_navigation = false; - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); - add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, (ENCODER_STEPS_PER_MENU_ITEM) * (GRID_MAX_POINTS_X), imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, -(ENCODER_STEPS_PER_MENU_ITEM) * (GRID_MAX_POINTS_X), imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, -(ENCODER_STEPS_PER_MENU_ITEM), imgLeft); add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); add_control(224, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); add_control(144, 206, BACK, imgBack); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index a8979d0ca6..21b280ac75 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -462,12 +462,12 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); - for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) - for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + for (uint16_t x = 0; x < (GRID_MAX_POINTS_X); x++) + for (uint16_t y = 0; y < (GRID_MAX_POINTS_Y); y++) if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) - tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / (GRID_MAX_POINTS_X) / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / (GRID_MAX_POINTS_Y) / 2), 2, 2, COLOR_UBL); - tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / (GRID_MAX_POINTS_X) / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / (GRID_MAX_POINTS_Y) / 2), 6, 6, COLOR_UBL); const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, lpos = pos.asLogical(); @@ -512,9 +512,9 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #if ENABLED(TOUCH_SCREEN) touch.clear(); draw_menu_navigation = false; - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); - add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, (ENCODER_STEPS_PER_MENU_ITEM) * (GRID_MAX_POINTS_X), imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, -(ENCODER_STEPS_PER_MENU_ITEM) * (GRID_MAX_POINTS_X), imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, -(ENCODER_STEPS_PER_MENU_ITEM), imgLeft); add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); add_control(320, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); add_control(224, TFT_HEIGHT - 34, BACK, imgBack); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index ced33a1986..915886fe4a 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1605,7 +1605,7 @@ void MarlinSettings::postprocess() { #if ENABLED(MESH_BED_LEVELING) if (!validating) mbl.z_offset = dummyf; - if (mesh_num_x == GRID_MAX_POINTS_X && mesh_num_y == GRID_MAX_POINTS_Y) { + if (mesh_num_x == (GRID_MAX_POINTS_X) && mesh_num_y == (GRID_MAX_POINTS_Y)) { // EEPROM data fits the current mesh EEPROM_READ(mbl.z_values); } @@ -1652,7 +1652,7 @@ void MarlinSettings::postprocess() { EEPROM_READ_ALWAYS(grid_max_x); // 1 byte EEPROM_READ_ALWAYS(grid_max_y); // 1 byte #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (grid_max_x == GRID_MAX_POINTS_X && grid_max_y == GRID_MAX_POINTS_Y) { + if (grid_max_x == (GRID_MAX_POINTS_X) && grid_max_y == (GRID_MAX_POINTS_Y)) { if (!validating) set_bed_leveling_enabled(false); EEPROM_READ(bilinear_grid_spacing); // 2 ints EEPROM_READ(bilinear_start); // 2 ints From 47a13263f6358c4a2803573e671de296f97b2ca2 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Fri, 2 Apr 2021 08:19:22 +0800 Subject: [PATCH 1237/1370] MKS H43 fix, cleanup (#21500) Followup to #21485 --- Marlin/Configuration.h | 2 +- Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 9 ++++++--- Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 4 ++-- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 7 ++++++- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h | 7 +++++-- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 5f9b1782fc..0847892934 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2374,7 +2374,7 @@ //#define DGUS_LCD_UI_FYSETC //#define DGUS_LCD_UI_HIPRECY -// #define DGUS_LCD_UI_MKS +//#define DGUS_LCD_UI_MKS #if ENABLED(DGUS_LCD_UI_MKS) #define USE_MKS_GREEN_UI #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index b4e876ce4c..067ea482c7 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -176,6 +176,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { #if HAS_PID_HEATING void DGUSScreenHandler::DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var) { float value = *(float *)var.memadr; + value /= 10; float valuesend = 0; switch (var.VP) { default: return; @@ -343,7 +344,6 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) SetupConfirmAction(nullptr); GotoScreen(DGUSLCD_SCREEN_POPUP); } - #endif // SDSUPPORT void DGUSScreenHandler::ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) { diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index a2ccdada36..786d1821a6 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -44,7 +44,7 @@ #endif uint16_t manualMoveStep = 1; -float distanceFilament = 10; +uint16_t distanceFilament = 10; uint16_t FilamentSpeed = 25; float ZOffset_distance = 0.1; float mesh_adj_distance = 0.01; @@ -554,7 +554,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) VPHELPER(VP_LOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentLoad, nullptr), VPHELPER(VP_UNLOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentUnLoad, nullptr), - VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #endif #endif @@ -733,8 +733,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // SDCard File listing - VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), @@ -759,6 +760,8 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_OFFSET_Y, &probe.offset.y, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), VPHELPER(VP_OFFSET_Z, &probe.offset.z, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), #endif + #else + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.PrintReturn, nullptr), #endif #if ENABLED(DGUS_UI_WAITING) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h index 9a3690f356..ac0a482ede 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -36,7 +36,7 @@ #define MKS_FINSH extern uint16_t manualMoveStep; -extern float distanceFilament; +extern uint16_t distanceFilament; extern uint16_t FilamentSpeed; extern float ZOffset_distance; extern float mesh_adj_distance; @@ -55,7 +55,7 @@ void MKS_resume_print_move(); extern float z_offset_add; -xyz_int_t tmc_step; +extern xyz_int_t tmc_step; extern uint16_t lcd_default_light; diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index b6633d3a1f..54500011f8 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -270,6 +270,11 @@ void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { GotoScreen(MKSLCD_SCREEN_PrintDone); } +#else + void DGUSScreenHandler::PrintReturn(DGUS_VP_Variable& var, void *val_ptr) { + uint16_t value = swap16(*(uint16_t*)val_ptr); + if (value == 0x0F) GotoScreen(DGUSLCD_SCREEN_MAIN); + } #endif // SDSUPPORT void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { @@ -1215,7 +1220,7 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ } else { #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) - swap_tool = 2; + swap_tool = 1; #endif } #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index 2d0678ca5b..07c123d928 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -158,13 +158,14 @@ public: static void GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr); #endif - // File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(SDSUPPORT) // Callback for VP "Display wants to change screen when there is a SD card" static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); // Scroll buttons on the file listing screen. static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); // start print after confirmation received. static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); // User hit the pause, resume or abort button. @@ -183,6 +184,8 @@ public: static void SDCardError(); // Marlin informed us about SD print completion. static void SDPrintingFinished(); + #else + static void PrintReturn(DGUS_VP_Variable &var, void *val_ptr); #endif // OK Button the Confirm screen. From fea48359415f5590dd87e13238189d20e9b61ff3 Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Thu, 1 Apr 2021 19:29:49 -0500 Subject: [PATCH 1238/1370] Followup to Laser Flow Meter (#21498) --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 6 +++--- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 6 +++--- Marlin/src/lcd/dogm/status/cooler.h | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 2 +- Marlin/src/module/temperature.cpp | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 61c7ce18d6..98ca1c0930 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -46,7 +46,7 @@ #include "../../gcode/parser.h" #endif -#if HAS_COOLER || HAS_FLOWMETER +#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif @@ -584,7 +584,7 @@ FORCE_INLINE void _draw_cooler_status(const char prefix, const bool blink) { } #endif -#if HAS_FLOWMETER +#if ENABLED(LASER_COOLANT_FLOW_METER) FORCE_INLINE void _draw_flowmeter_status() { lcd_put_u8str("~ "); lcd_put_u8str(ftostr11ns(cooler.flowrate)); @@ -827,7 +827,7 @@ void MarlinUI::draw_status_screen() { #if HAS_COOLER _draw_cooler_status('*', blink); #endif - #if HAS_FLOWMETER + #if ENABLED(LASER_COOLANT_FLOW_METER) _draw_flowmeter_status(); #endif diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 396b05b084..f0e37aa249 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -97,7 +97,7 @@ // // Laser Flowmeter // -#if !STATUS_FLOWMETER_WIDTH && HAS_FLOWMETER +#if !STATUS_FLOWMETER_WIDTH && ENABLED(LASER_COOLANT_FLOW_METER) #include "status/cooler.h" #endif #ifndef STATUS_FLOWMETER_WIDTH @@ -567,7 +567,7 @@ // // Flowmeter Bitmap Properties // -#if HAS_FLOWMETER +#if ENABLED(LASER_COOLANT_FLOW_METER) #if STATUS_FLOWMETER_WIDTH #ifndef STATUS_FLOWMETER_X @@ -689,7 +689,7 @@ #if HAS_COOLER #define DO_DRAW_COOLER 1 #endif -#if HAS_FLOWMETER +#if ENABLED(LASER_COOLANT_FLOW_METER) #define DO_DRAW_FLOWMETER 1 #endif diff --git a/Marlin/src/lcd/dogm/status/cooler.h b/Marlin/src/lcd/dogm/status/cooler.h index 0d72efea72..df596b5c5a 100644 --- a/Marlin/src/lcd/dogm/status/cooler.h +++ b/Marlin/src/lcd/dogm/status/cooler.h @@ -64,7 +64,7 @@ }; #endif -#if HAS_FLOWMETER +#if ENABLED(LASER_COOLANT_FLOW_METER) #define STATUS_FLOWMETER_WIDTH 24 const unsigned char status_flowmeter_bmp2[] PROGMEM = { B00000001,B11111000,B00000000, diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 2ec462c34a..921dee0e34 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -53,7 +53,7 @@ #include "../../feature/spindle_laser.h" #endif -#if HAS_COOLER || HAS_FLOWMETER +#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index fb47c22ce9..85578ea351 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -35,7 +35,7 @@ #include "../../module/motion.h" #endif -#if HAS_COOLER || HAS_FLOWMETER +#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 02fe7588d9..992681632d 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -35,7 +35,7 @@ #include "endstops.h" #include "planner.h" -#if HAS_COOLER || HAS_FLOWMETER +#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../feature/cooler.h" #include "../feature/spindle_laser.h" #endif @@ -1549,7 +1549,7 @@ void Temperature::manage_heater() { #endif // HAS_COOLER - #if HAS_FLOWMETER + #if ENABLED(LASER_COOLANT_FLOW_METER) cooler.flowmeter_task(ms); #if ENABLED(FLOWMETER_SAFETY) if (cutter.enabled() && cooler.check_flow_too_low()) { From 9fbce867ee1b76732f306772fa6d3a727eab7b65 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 1 Apr 2021 21:53:19 -0500 Subject: [PATCH 1239/1370] Split up platformio.ini (#21507) --- .../PlatformIO/scripts/common-dependencies.py | 37 +- ini/avr.ini | 174 ++ ini/due.ini | 43 + ini/esp32.ini | 29 + ini/features.ini | 218 +++ ini/lpc176x.ini | 44 + ini/native.ini | 23 + ini/samd51.ini | 27 + ini/stm32f0.ini | 42 + ini/stm32f1.ini | 439 +++++ ini/stm32f4.ini | 371 +++++ ini/stm32f7.ini | 30 + ini/teensy.ini | 42 + platformio.ini | 1426 +---------------- 14 files changed, 1504 insertions(+), 1441 deletions(-) create mode 100644 ini/avr.ini create mode 100644 ini/due.ini create mode 100644 ini/esp32.ini create mode 100644 ini/features.ini create mode 100644 ini/lpc176x.ini create mode 100644 ini/native.ini create mode 100644 ini/samd51.ini create mode 100644 ini/stm32f0.ini create mode 100644 ini/stm32f1.ini create mode 100644 ini/stm32f4.ini create mode 100644 ini/stm32f7.ini create mode 100644 ini/teensy.ini diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 3844d8298a..fe6ae7dba5 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -3,16 +3,6 @@ # Convenience script to check dependencies and add libs and sources for Marlin Enabled Features # import subprocess,os,re -try: - import configparser -except ImportError: - import ConfigParser as configparser -try: - # PIO < 4.4 - from platformio.managers.package import PackageManager -except ImportError: - # PIO >= 4.4 - from platformio.package.meta import PackageSpec as PackageManager PIO_VERSION_MIN = (5, 0, 3) try: @@ -38,6 +28,9 @@ except SystemExit: except: print("Can't detect PlatformIO Version") +from platformio.package.meta import PackageSpec +from platformio.project.config import ProjectConfig + Import("env") #print(env.Dump()) @@ -51,13 +44,6 @@ def blab(str): if verbose: print(str) -def parse_pkg_uri(spec): - if PackageManager.__name__ == 'PackageSpec': - return PackageManager(spec).name - else: - name, _, _ = PackageManager.parse_pkg_uri(spec) - return name - FEATURE_CONFIG = {} def add_to_feat_cnf(feature, flines): @@ -86,9 +72,7 @@ def add_to_feat_cnf(feature, flines): feat['lib_deps'] = list(filter(lib_re.match, feat['lib_deps'])) + [dep] def load_config(): - config = configparser.ConfigParser() - config.read("platformio.ini") - items = config.items('features') + items = ProjectConfig().items('features') for key in items: feature = key[0].upper() if not feature in FEATURE_CONFIG: @@ -114,16 +98,14 @@ def get_all_known_libs(): if not 'lib_deps' in feat: continue for dep in feat['lib_deps']: - name = parse_pkg_uri(dep) - known_libs.append(name) + known_libs.append(PackageSpec(dep).name) return known_libs def get_all_env_libs(): env_libs = [] lib_deps = env.GetProjectOption('lib_deps') for dep in lib_deps: - name = parse_pkg_uri(dep) - env_libs.append(name) + env_libs.append(PackageSpec(dep).name) return env_libs def set_env_field(field, value): @@ -154,20 +136,19 @@ def apply_features_config(): # feat to add deps_to_add = {} for dep in feat['lib_deps']: - name = parse_pkg_uri(dep) - deps_to_add[name] = dep + deps_to_add[PackageSpec(dep).name] = dep # Does the env already have the dependency? deps = env.GetProjectOption('lib_deps') for dep in deps: - name = parse_pkg_uri(dep) + name = PackageSpec(dep).name if name in deps_to_add: del deps_to_add[name] # Are there any libraries that should be ignored? lib_ignore = env.GetProjectOption('lib_ignore') for dep in deps: - name = parse_pkg_uri(dep) + name = PackageSpec(dep).name if name in deps_to_add: del deps_to_add[name] diff --git a/ini/avr.ini b/ini/avr.ini new file mode 100644 index 0000000000..944646190a --- /dev/null +++ b/ini/avr.ini @@ -0,0 +1,174 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# AVR Architecture # +# # +################################# + +# +# AVR (8-bit) Common Environment values +# +[common_avr8] +board_build.f_cpu = 16000000L +src_filter = ${common.default_src_filter} + + +# +# ATmega2560 +# +[env:mega2560] +platform = atmelavr +extends = common_avr8 +board = megaatmega2560 + +# +# ATmega2560 with extended pins 70-85 defined +# BOARD_BQ_ZUM_MEGA_3D +# BOARD_ULTIMAIN_2 +# BOARD_MIGHTYBOARD_REVE +# BOARD_EINSTART_S +# +[env:mega2560ext] +platform = atmelavr +extends = env:mega2560 +board_build.variant = megaextendedpins +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + +# +# ATmega1280 +# +[env:mega1280] +platform = atmelavr +extends = common_avr8 +board = megaatmega1280 + +# +# MightyBoard AVR with extended pins +# +[mega_extended_optimized] +extends = common_avr8 +board_build.variant = megaextendedpins +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +upload_speed = 57600 +build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues + +# +# MightyBoard ATmega1280 +# +[env:MightyBoard1280] +platform = atmelavr +extends = mega_extended_optimized +board = megaatmega1280 + +# +# MightyBoard ATmega2560 +# +[env:MightyBoard2560] +platform = atmelavr +extends = mega_extended_optimized +board = megaatmega2560 + +# +# RAMBo +# +[env:rambo] +platform = atmelavr +extends = common_avr8 +board = reprap_rambo + +# +# FYSETC F6 V1.3 / V1.4 +# +[env:FYSETC_F6] +platform = atmelavr +extends = common_avr8 +board = fysetc_f6 + +# +# Sanguinololu (ATmega644p) +# +[env:sanguino644p] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega644p + +# +# Sanguinololu (ATmega1284p) +# +[env:sanguino1284p] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p +board_upload.maximum_size = 126976 + +# +# Melzi and clones (ATmega1284p) +# +[env:melzi] +platform = atmelavr +extends = env:sanguino1284p +upload_speed = 57600 + +# +# Sanguinololu (ATmega1284p stock bootloader with tuned flags) +# + +[tuned_1284p] +build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues + +[env:sanguino1284p_optimized] +platform = atmelavr +extends = env:melzi +build_flags = ${tuned_1284p.build_flags} + +# +# Melzi and clones (alias for sanguino1284p_optimized) +# +[env:melzi_optimized] +platform = atmelavr +extends = env:sanguino1284p_optimized + +# +# Melzi and clones (Optiboot bootloader) +# +[env:melzi_optiboot] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p +upload_speed = 115200 + +# +# Melzi and clones (Zonestar Melzi2 with tuned flags) +# +[env:melzi_optiboot_optimized] +platform = atmelavr +extends = env:melzi_optiboot +build_flags = ${tuned_1284p.build_flags} + +# +# AT90USB1286 boards using CDC bootloader +# - BRAINWAVE +# - BRAINWAVE_PRO +# - SAV_MKI +# - TEENSYLU +# +[env:at90usb1286_cdc] +platform = teensy +extends = common_avr8 +board = at90usb1286 +lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet + +# +# AT90USB1286 boards using DFU bootloader +# - Printrboard +# - Printrboard Rev.F +# - ? 5DPRINT ? +# +[env:at90usb1286_dfu] +platform = teensy +extends = env:at90usb1286_cdc diff --git a/ini/due.ini b/ini/due.ini new file mode 100644 index 0000000000..7abc262eb4 --- /dev/null +++ b/ini/due.ini @@ -0,0 +1,43 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# DUE Architecture # +# # +################################# + +# +# Due (Atmel SAM3X8E ARM Cortex-M3) +# +# - RAMPS4DUE +# - RADDS +# +[env:DUE] +platform = atmelsam +board = due +src_filter = ${common.default_src_filter} + + + +[env:DUE_USB] +platform = atmelsam +extends = env:DUE +board = dueUSB + +# +# Archim SAM +# +[common_DUE_archim] +platform = atmelsam +extends = env:DUE +board = archim +build_flags = ${common.build_flags} + -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON +board_build.variants_dir = buildroot/share/PlatformIO/variants/ +extra_scripts = ${common.extra_scripts} + Marlin/src/HAL/DUE/upload_extra_script.py + +[env:DUE_archim] +platform = ${common_DUE_archim.platform} +extends = common_DUE_archim diff --git a/ini/esp32.ini b/ini/esp32.ini new file mode 100644 index 0000000000..1aee88f692 --- /dev/null +++ b/ini/esp32.ini @@ -0,0 +1,29 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# ESP32 Architecture # +# # +################################# + +# +# Espressif ESP32 +# +[env:esp32] +platform = espressif32@2.1.0 +board = esp32dev +build_flags = ${common.build_flags} -DCORE_DEBUG_LEVEL=0 +src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet +upload_speed = 500000 +monitor_speed = 250000 +#upload_port = marlinesp.local +#board_build.flash_mode = qio + +[env:FYSETC_E4] +platform = espressif32@1.11.2 +extends = env:esp32 +board_build.partitions = default_16MB.csv diff --git a/ini/features.ini b/ini/features.ini new file mode 100644 index 0000000000..7399a22446 --- /dev/null +++ b/ini/features.ini @@ -0,0 +1,218 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# Features Dependencies # +# # +################################# + +[features] +YHCB2004 = red-scorp/LiquidCrystal_AIP31068@^1.0.4, red-scorp/SoftSPIB@^1.1.1 +HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip + src_filter=+ + extra_scripts=download_mks_assets.py +POSTMORTEM_DEBUGGING = src_filter=+ + + build_flags=-funwind-tables +MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/master.zip +HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 + src_filter=+ + + + + +HAS_STEALTHCHOP = src_filter=+ +SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip +HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster + src_filter=+ +HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip + src_filter=+ +HAS_L64XX = Arduino-L6470@0.8.0 + src_filter=+ + + + +NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 + src_filter=+ +TEMP_.+_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 +USES_LIQUIDCRYSTAL = bitbucket-fmalpartida/LiquidCrystal@1.5.0 +USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 +USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 +HAS_WIRED_LCD = src_filter=+ +HAS_MARLINUI_HD44780 = src_filter=+ +HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 + src_filter=+ +HAS_(FSMC|SPI)_TFT = src_filter=+ + + +HAS_FSMC_TFT = src_filter=+ + +HAS_SPI_TFT = src_filter=+ + +I2C_EEPROM = src_filter=+ +SPI_EEPROM = src_filter=+ +HAS_GRAPHICAL_TFT = src_filter=+ +DWIN_CREALITY_LCD = src_filter=+ +IS_TFTGLCD_PANEL = src_filter=+ +HAS_TOUCH_BUTTONS = src_filter=+ +HAS_LCD_MENU = src_filter=+ +HAS_GAMES = src_filter=+ +MARLIN_BRICKOUT = src_filter=+ +MARLIN_INVADERS = src_filter=+ +MARLIN_MAZE = src_filter=+ +MARLIN_SNAKE = src_filter=+ +HAS_MENU_BACKLASH = src_filter=+ +HAS_MENU_BED_CORNERS = src_filter=+ +LCD_BED_LEVELING = src_filter=+ +HAS_MENU_CANCELOBJECT = src_filter=+ +HAS_MENU_DELTA_CALIBRATE = src_filter=+ +HAS_MENU_FILAMENT = src_filter=+ +LCD_INFO_MENU = src_filter=+ +HAS_MENU_JOB_RECOVERY = src_filter=+ +HAS_MULTI_LANGUAGE = src_filter=+ +HAS_MENU_LED = src_filter=+ +HAS_MENU_MEDIA = src_filter=+ +HAS_MENU_MIXER = src_filter=+ +HAS_MENU_MMU2 = src_filter=+ +HAS_MENU_PASSWORD = src_filter=+ +HAS_MENU_POWER_MONITOR = src_filter=+ +HAS_MENU_CUTTER = src_filter=+ +HAS_MENU_TEMPERATURE = src_filter=+ +HAS_MENU_TMC = src_filter=+ +HAS_MENU_TOUCH_SCREEN = src_filter=+ +HAS_MENU_TRAMMING = src_filter=+ +HAS_MENU_UBL = src_filter=+ +ANYCUBIC_LCD_CHIRON = src_filter=+ + +ANYCUBIC_LCD_I3MEGA = src_filter=+ + +NEXTION_TFT = src_filter=+ + +HAS_DGUS_LCD = src_filter=+ + +DGUS_LCD_UI_FYSETC = src_filter=+ +DGUS_LCD_UI_HIPRECY = src_filter=+ +DGUS_LCD_UI_MKS = src_filter=+ +DGUS_LCD_UI_ORIGIN = src_filter=+ +TOUCH_UI_FTDI_EVE = src_filter=+ +EXTUI_EXAMPLE = src_filter=+ +MALYAN_LCD = src_filter=+ +USE_UHS2_USB = src_filter=+ +USE_UHS3_USB = src_filter=+ +USB_FLASH_DRIVE_SUPPORT = src_filter=+ +AUTO_BED_LEVELING_BILINEAR = src_filter=+ +AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ +MESH_BED_LEVELING = src_filter=+ + +AUTO_BED_LEVELING_UBL = src_filter=+ + +UBL_HILBERT_CURVE = src_filter=+ +BACKLASH_COMPENSATION = src_filter=+ +BARICUDA = src_filter=+ + +BINARY_FILE_TRANSFER = src_filter=+ + +BLTOUCH = src_filter=+ +CANCEL_OBJECTS = src_filter=+ + +CASE_LIGHT_ENABLE = src_filter=+ + +EXTERNAL_CLOSED_LOOP_CONTROLLER = src_filter=+ + +USE_CONTROLLER_FAN = src_filter=+ +HAS_MOTOR_CURRENT_DAC = src_filter=+ +DIRECT_STEPPING = src_filter=+ + +EMERGENCY_PARSER = src_filter=+ - +I2C_POSITION_ENCODERS = src_filter=+ +IIC_BL24CXX_EEPROM = src_filter=+ +HAS_SPI_FLASH = src_filter=+ +HAS_ETHERNET = src_filter=+ + +HAS_FANMUX = src_filter=+ +FILAMENT_WIDTH_SENSOR = src_filter=+ + +FWRETRACT = src_filter=+ + +HOST_ACTION_COMMANDS = src_filter=+ +HOTEND_IDLE_TIMEOUT = src_filter=+ +JOYSTICK = src_filter=+ +BLINKM = src_filter=+ +HAS_COLOR_LEDS = src_filter=+ + +PCA9533 = src_filter=+ +PCA9632 = src_filter=+ +PRINTER_EVENT_LEDS = src_filter=+ +TEMP_STAT_LEDS = src_filter=+ +MAX7219_DEBUG = src_filter=+ + +HAS_MEATPACK = src_filter=+ +MIXING_EXTRUDER = src_filter=+ + +HAS_PRUSA_MMU1 = src_filter=+ +HAS_PRUSA_MMU2 = src_filter=+ + +PASSWORD_FEATURE = src_filter=+ + +ADVANCED_PAUSE_FEATURE = src_filter=+ + + +AUTO_POWER_CONTROL = src_filter=+ +HAS_POWER_MONITOR = src_filter=+ + +POWER_LOSS_RECOVERY = src_filter=+ + +PROBE_TEMP_COMPENSATION = src_filter=+ + +HAS_FILAMENT_SENSOR = src_filter=+ + +(EXT|MANUAL)_SOLENOID.* = src_filter=+ + +MK2_MULTIPLEXER = src_filter=+ +HAS_CUTTER = src_filter=+ + +EXPERIMENTAL_I2CBUS = src_filter=+ + +MECHANICAL_GANTRY_CAL.+ = src_filter=+ +Z_MULTI_ENDSTOPS = src_filter=+ +Z_STEPPER_AUTO_ALIGN = src_filter=+ + +G26_MESH_VALIDATION = src_filter=+ +ASSISTED_TRAMMING = src_filter=+ + +HAS_MESH = src_filter=+ +HAS_LEVELING = src_filter=+ + +DELTA_AUTO_CALIBRATION = src_filter=+ +CALIBRATION_GCODE = src_filter=+ +Z_MIN_PROBE_REPEATABILITY_TEST = src_filter=+ +M100_FREE_MEMORY_WATCHER = src_filter=+ +BACKLASH_GCODE = src_filter=+ +IS_KINEMATIC = src_filter=+ +HAS_EXTRA_ENDSTOPS = src_filter=+ +SKEW_CORRECTION_GCODE = src_filter=+ +DIRECT_PIN_CONTROL = src_filter=+ + +PINS_DEBUGGING = src_filter=+ +NO_VOLUMETRICS = src_filter=- +HAS_MULTI_EXTRUDER = src_filter=+ +HAS_HOTEND_OFFSET = src_filter=+ +EDITABLE_SERVO_ANGLES = src_filter=+ +PIDTEMP = src_filter=+ +PREVENT_COLD_EXTRUSION = src_filter=+ +PIDTEMPBED = src_filter=+ +HAS_USER_THERMISTORS = src_filter=+ +SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ +BAUD_RATE_GCODE = src_filter=+ +HAS_SMART_EFF_MOD = src_filter=+ +COOLANT_CONTROL = src_filter=+ +HAS_SOFTWARE_ENDSTOPS = src_filter=+ +HAS_DUPLICATION_MODE = src_filter=+ +LIN_ADVANCE = src_filter=+ +PHOTO_GCODE = src_filter=+ +CONTROLLER_FAN_EDITABLE = src_filter=+ +GCODE_MACROS = src_filter=+ +GRADIENT_MIX = src_filter=+ +HAS_SAVED_POSITIONS = src_filter=+ + +PARK_HEAD_ON_PAUSE = src_filter=+ +FILAMENT_LOAD_UNLOAD_GCODES = src_filter=+ +CNC_WORKSPACE_PLANES = src_filter=+ +CNC_COORDINATE_SYSTEMS = src_filter=+ +HAS_M206_COMMAND = src_filter=+ +EXPECTED_PRINTER_CHECK = src_filter=+ +HOST_KEEPALIVE_FEATURE = src_filter=+ +REPETIER_GCODE_M360 = src_filter=+ +HAS_GCODE_M876 = src_filter=+ +HAS_RESUME_CONTINUE = src_filter=+ +HAS_LCD_CONTRAST = src_filter=+ +LCD_SET_PROGRESS_MANUALLY = src_filter=+ +TOUCH_SCREEN_CALIBRATION = src_filter=+ +ARC_SUPPORT = src_filter=+ +GCODE_MOTION_MODES = src_filter=+ +BABYSTEPPING = src_filter=+ + +Z_PROBE_SLED = src_filter=+ +G38_PROBE_TARGET = src_filter=+ +MAGNETIC_PARKING_EXTRUDER = src_filter=+ +SDSUPPORT = src_filter=+ + + + + + + +HAS_MEDIA_SUBCALLS = src_filter=+ +GCODE_REPEAT_MARKERS = src_filter=+ + +HAS_EXTRUDERS = src_filter=+ + +HAS_COOLER = src_filter=+ + +AUTO_REPORT_TEMPERATURES = src_filter=+ +INCH_MODE_SUPPORT = src_filter=+ +TEMPERATURE_UNITS_SUPPORT = src_filter=+ +NEED_HEX_PRINT = src_filter=+ +NEED_LSF = src_filter=+ +NOZZLE_PARK_FEATURE = src_filter=+ + +NOZZLE_CLEAN_FEATURE = src_filter=+ + +DELTA = src_filter=+ + +BEZIER_CURVE_SUPPORT = src_filter=+ + +PRINTCOUNTER = src_filter=+ +HAS_BED_PROBE = src_filter=+ + + + +IS_SCARA = src_filter=+ +HAS_SERVOS = src_filter=+ + +MORGAN_SCARA = src_filter=+ +HAS_MICROSTEPS = src_filter=+ +(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer + ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/master.zip + arduinoWebSockets=links2004/WebSockets@2.3.4 + luc-github/ESP32SSDP@^1.1.1 + lib_ignore=ESPAsyncTCP diff --git a/ini/lpc176x.ini b/ini/lpc176x.ini new file mode 100644 index 0000000000..2a59ba7f50 --- /dev/null +++ b/ini/lpc176x.ini @@ -0,0 +1,44 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# LPC176x Architecture # +# # +################################# + +# +# NXP LPC176x ARM Cortex-M3 +# +[common_LPC] +platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.3.zip +platform_packages = framework-arduino-lpc176x@^0.2.6 +board = nxp_lpc1768 +lib_ldf_mode = off +lib_compat_mode = strict +extra_scripts = ${common.extra_scripts} + Marlin/src/HAL/LPC1768/upload_extra_script.py +src_filter = ${common.default_src_filter} + + +lib_deps = ${common.lib_deps} + Servo +custom_marlin.USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@~1.0.7 +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip +build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g + # debug options for backtrace + #-funwind-tables + #-mpoke-function-name + +# +# NXP LPC176x ARM Cortex-M3 +# +[env:LPC1768] +platform = ${common_LPC.platform} +extends = common_LPC +board = nxp_lpc1768 + +[env:LPC1769] +platform = ${common_LPC.platform} +extends = common_LPC +board = nxp_lpc1769 diff --git a/ini/native.ini b/ini/native.ini new file mode 100644 index 0000000000..dbdfd26f8b --- /dev/null +++ b/ini/native.ini @@ -0,0 +1,23 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# Native / Simulation # +# # +################################# + +# +# No supported Arduino libraries, base Marlin only +# +[env:linux_native] +platform = native +framework = +build_flags = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined +src_build_flags = -Wall -IMarlin/src/HAL/LINUX/include +build_unflags = -Wall +lib_ldf_mode = off +lib_deps = +src_filter = ${common.default_src_filter} + diff --git a/ini/samd51.ini b/ini/samd51.ini new file mode 100644 index 0000000000..8e8682da94 --- /dev/null +++ b/ini/samd51.ini @@ -0,0 +1,27 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# SAMD51 Architecture # +# # +################################# + +# +# Adafruit Grand Central M4 (Atmel SAMD51P20A ARM Cortex-M4) +# +[env:SAMD51_grandcentral_m4] +platform = atmelsam +board = adafruit_grandcentral_m4 +build_flags = ${common.build_flags} -std=gnu++17 +build_unflags = -std=gnu++11 +src_filter = ${common.default_src_filter} + +lib_deps = ${common.lib_deps} + SoftwareSerialM + Adafruit SPIFlash +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py +custom_marlin.SDSUPPORT = SdFat - Adafruit Fork +debug_tool = jlink diff --git a/ini/stm32f0.ini b/ini/stm32f0.ini new file mode 100644 index 0000000000..fb6ce00dd0 --- /dev/null +++ b/ini/stm32f0.ini @@ -0,0 +1,42 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# STM32F0 Architecture # +# # +################################# + +# +# Malyan M200 v2 (STM32F070RB) +# +[env:STM32F070RB_malyan] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanM200v2 +build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED + -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing + -DCUSTOM_STARTUP_FILE + +# +# Malyan M200 v2 (STM32F070CB) +# +[env:STM32F070CB_malyan] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanm200_f070cb +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -DCUSTOM_STARTUP_FILE + +# +# Malyan M300 (STM32F070CB) +# +[env:malyan_M300] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanm300_f070cb +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED +src_filter = ${common.default_src_filter} + diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini new file mode 100644 index 0000000000..2ba3d84862 --- /dev/null +++ b/ini/stm32f1.ini @@ -0,0 +1,439 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# STM32F1 Architecture # +# # +################################# + +# +# HAL/STM32 Base Environment values +# +[common_stm32] +platform = ststm32@~12.0 +build_flags = ${common.build_flags} + -std=gnu++14 + -DUSBCON -DUSBD_USE_CDC + -DTIM_IRQ_PRIO=13 + -DADC_RESOLUTION=12 +build_unflags = -std=gnu++11 +src_filter = ${common.default_src_filter} + + + +# +# HAL/STM32F1 Common Environment values +# +[common_stm32f1] +platform = ststm32@~12.0 +board_build.core = maple +build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py + ${common.build_flags} + -DARDUINO_ARCH_STM32 +build_unflags = -std=gnu11 -std=gnu++11 +src_filter = ${common.default_src_filter} + +lib_ignore = SPI, FreeRTOS701, FreeRTOS821 +lib_deps = ${common.lib_deps} + SoftwareSerialM +platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/fix_framework_weakness.py + +# +# STM32F103RC +# +[env:STM32F103RC] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +monitor_speed = 115200 + +# +# MEEB_3DP (STM32F103RCT6 with 512K) +# +[env:STM32F103RC_meeb] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = MEEB_3DP +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 + -DSS_TIMER=4 + -DSTM32_FLASH_SIZE=512 + -DHSE_VALUE=12000000U + -DUSE_USB_COMPOSITE + -DVECT_TAB_OFFSET=0x2000 + -DGENERIC_BOOTLOADER +extra_scripts = ${common_stm32f1.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py + buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +lib_deps = ${common.lib_deps} + SoftwareSerialM + USBComposite for STM32F1@0.91 +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use +debug_tool = stlink +upload_protocol = dfu + +# +# STM32F103RC_fysetc +# +[env:STM32F103RC_fysetc] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 +lib_ldf_mode = chain +debug_tool = stlink +upload_protocol = serial + +# +# BigTree SKR Mini V1.1 / SKR mini E3 / SKR E3 DIP (STM32F103RCT6 ARM Cortex-M3) +# +# STM32F103RC_btt ............. RCT6 with 256K +# STM32F103RC_btt_USB ......... RCT6 with 256K (USB mass storage) +# STM32F103RC_btt_512K ........ RCT6 with 512K +# STM32F103RC_btt_512K_USB .... RCT6 with 512K (USB mass storage) +# +# WARNING! If you have an SKR Mini v1.1 or an SKR Mini E3 1.0 / 1.2 / 2.0 / DIP +# and experience a printer freeze, re-flash Marlin using the regular (non-512K) +# build option. 256K chips may be re-branded 512K chips, but this means the +# upper 256K is sketchy, and failure is very likely. +# + +[env:STM32F103RC_btt] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 -DSS_TIMER=4 +monitor_speed = 115200 + +[env:STM32F103RC_btt_USB] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC_btt +build_flags = ${env:STM32F103RC_btt.build_flags} -DUSE_USB_COMPOSITE +lib_deps = ${env:STM32F103RC_btt.lib_deps} + USBComposite for STM32F1@0.91 + +[env:STM32F103RC_btt_512K] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC_btt +board_upload.maximum_size=524288 +build_flags = ${env:STM32F103RC_btt.build_flags} -DSTM32_FLASH_SIZE=512 + +[env:STM32F103RC_btt_512K_USB] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC_btt_512K +build_flags = ${env:STM32F103RC_btt_512K.build_flags} -DUSE_USB_COMPOSITE +lib_deps = ${env:STM32F103RC_btt_512K.lib_deps} + USBComposite for STM32F1@0.91 + +# +# STM32F103RE +# +[env:STM32F103RE] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RE +monitor_speed = 115200 + +# +# STM32F103RE_btt ............. RET6 +# STM32F103RE_btt_USB ......... RET6 (USB mass storage) +# +[env:STM32F103RE_btt] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py +build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 +debug_tool = stlink +upload_protocol = stlink + +[env:STM32F103RE_btt_USB] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RE_btt +build_flags = ${env:STM32F103RE_btt.build_flags} -DUSE_USB_COMPOSITE +lib_deps = ${common_stm32f1.lib_deps} + USBComposite for STM32F1@0.91 + +# +# Geeetech GTM32 (STM32F103VET6) +# +[env:STM32F103VE_GTM32] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +build_flags = ${common_stm32f1.build_flags} + -ffunction-sections -fdata-sections -nostdlib -MMD + -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -DBOARD_generic_stm32f103v + -DDEBUG_LEVEL=DEBUG_NONE -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DVECT_TAB_ADDR=0x8000000 + -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 +upload_protocol = serial + +# +# Longer 3D board in Alfawise U20 (STM32F103VET6) +# +[env:STM32F103VE_longer] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 +build_unflags = ${common_stm32f1.build_unflags} + -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 + +# +# MKS Robin Mini (STM32F103VET6) +# +[env:mks_robin_mini] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_mini.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE + +# +# MKS Robin Nano (STM32F103VET6) +# +[env:mks_robin_nano35] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSS_TIMER=4 +debug_tool = jlink +upload_protocol = jlink + +# +# MKS Robin (STM32F103ZET6) +# +[env:mks_robin] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103ZE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin.py +build_flags = ${common_stm32f1.build_flags} + -DSS_TIMER=4 -DSTM32_XL_DENSITY + +# MKS Robin (STM32F103ZET6) +# Uses HAL STM32 to support Marlin UI for TFT screen with optional touch panel +# +[env:mks_robin_stm32] +platform = ${common_stm32.platform} +extends = common_stm32 +board = genericSTM32F103ZE +board_build.core = stm32 +board_build.variant = MARLIN_F103Zx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.encrypt = Yes +board_build.firmware = Robin.bin +build_flags = ${common_stm32.build_flags} + -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 +build_unflags = ${common_stm32.build_unflags} + -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py +lib_deps = + +# +# MKS Robin Pro (STM32F103ZET6) +# +[env:mks_robin_pro] +platform = ${common_stm32f1.platform} +extends = env:mks_robin +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_pro.py + +# +# TRIGORILLA PRO (STM32F103ZET6) +# +[env:trigorilla_pro] +platform = ${common_stm32f1.platform} +extends = env:mks_robin +extra_scripts = ${common_stm32f1.extra_scripts} + +# +# MKS Robin E3D (STM32F103RCT6) and +# MKS Robin E3 with TMC2209 +# +[env:mks_robin_e3] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +platform_packages = tool-stm32duino +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_e3.py +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 -DSS_TIMER=4 + +# +# MKS Robin E3p (STM32F103VET6) +# - LVGL UI +# +[env:mks_robin_e3p] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSS_TIMER=4 +debug_tool = jlink +upload_protocol = jlink + +# +# MKS Robin Lite/Lite2 (STM32F103RCT6) +# +[env:mks_robin_lite] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_lite.py + +# +# MKS ROBIN LITE3 (STM32F103RCT6) +# +[env:mks_robin_lite3] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_lite3.py + +# +# JGAurora A5S A1 (STM32F103ZET6) +# +[env:jgaurora_a5s_a1] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103ZE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py +build_flags = ${common_stm32f1.build_flags} + -DSTM32F1xx -DSTM32_XL_DENSITY + +# +# Malyan M200 (STM32F103CB) +# +[env:STM32F103CB_malyan] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = malyanM200 +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103CB -D__STM32F1__=1 -std=c++1y -DSERIAL_USB -ffunction-sections -fdata-sections + -Wl,--gc-sections -DDEBUG_LEVEL=0 -D__MARLIN_FIRMWARE__ +lib_ignore = ${common_stm32f1.lib_ignore} + SoftwareSerialM + +# +# Chitu boards like Tronxy X5s (STM32F103ZET6) +# +[env:chitu_f103] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = CHITU_F103 +extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py + pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py + buildroot/share/PlatformIO/scripts/chitu_crypt.py +build_flags = ${common_stm32f1.build_flags} + -DSTM32F1xx -DSTM32_XL_DENSITY +build_unflags = ${common_stm32f1.build_unflags} + -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG= -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 + +# +# Some Chitu V5 boards have a problem with GPIO init. +# Use this target if G28 or G29 are always failing. +# +[env:chitu_v5_gpio_init] +platform = ${common_stm32f1.platform} +extends = env:chitu_f103 +build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX + +# +# Creality (STM32F103RET6) +# +[env:STM32F103RET6_creality] +platform = ${env:STM32F103RE.platform} +extends = env:STM32F103RE +build_flags = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4 +extra_scripts = ${env:STM32F103RE.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/random-bin.py + buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py +debug_tool = jlink +upload_protocol = jlink + +# +# FLSUN QQS Pro (STM32F103VET6) using hal STM32 +# board Hispeedv1 +# +[env:flsun_hispeedv1] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 +board = genericSTM32F103VE +board_build.core = stm32 +board_build.variant = MARLIN_F103Vx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.firmware = Robin_mini.bin +board_build.encrypt = Yes +board_upload.offset_address = 0x08007000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py + +# +# MKS Robin Nano V1.2 and V2 using hal STM32 +# +[env:mks_robin_nano35_stm32] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 +board = genericSTM32F103VE +board_build.core = stm32 +board_build.variant = MARLIN_F103Vx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.encrypt = Yes +board_build.firmware = Robin_nano35.bin +board_upload.offset_address = 0x08007000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py + +# +# Mingda MPX_ARM_MINI +# +[env:mingda_mpx_arm_mini] +platform = ${common_stm32.platform} +extends = common_stm32 +board = genericSTM32F103ZE +board_build.core = stm32 +board_build.variant = MARLIN_F103Zx +board_build.ldscript = ldscript.ld +board_build.offset = 0x10000 +build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini new file mode 100644 index 0000000000..a15dc8b056 --- /dev/null +++ b/ini/stm32f4.ini @@ -0,0 +1,371 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# STM32F4 Architecture # +# # +################################# + +# +# ARMED (STM32) +# +[env:ARMED] +platform = ${common_stm32.platform} +extends = common_stm32 +board = armed_v1 +build_flags = ${common_stm32.build_flags} + -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing + +# +# STM32F401VE +# 'STEVAL-3DP001V1' STM32F401VE board - https://www.st.com/en/evaluation-tools/steval-3dp001v1.html +# +[env:STM32F401VE_STEVAL] +platform = ${common_stm32.platform} +extends = common_stm32 +board = STEVAL_STM32F401VE +build_flags = ${common_stm32.build_flags} + -DARDUINO_STEVAL -DSTM32F401xE + -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py + +# +# STM32F401RC +# +[env:FYSETC_CHEETAH_V20] +platform = ${common_stm32.platform} +extends = common_stm32 +board = FYSETC_CHEETAH_V20 +build_flags = ${common_stm32.build_flags} -DSTM32F401xC -DVECT_TAB_OFFSET=0xC000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/FYSETC_CHEETAH_V20.py + +# +# FLYF407ZG +# +[env:FLYF407ZG] +platform = ${common_stm32.platform} +extends = common_stm32 +board = FLYF407ZG +build_flags = ${common_stm32.build_flags} + -DVECT_TAB_OFFSET=0x8000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# FLY MINI(stm32f103rct6) +# +[env:FLY_MINI] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/fly_mini.py +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 -DSS_TIMER=4 + +# +# FYSETC S6 (STM32F446VET6 ARM Cortex-M4) +# +[env:FYSETC_S6] +platform = ${common_stm32.platform} +extends = common_stm32 +platform_packages = tool-stm32duino +board = marlin_fysetc_s6 +build_flags = ${common_stm32.build_flags} + -DVECT_TAB_OFFSET=0x10000 + -DHAL_PCD_MODULE_ENABLED +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +debug_tool = stlink +upload_protocol = dfu +upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" + +# +# STM32F407VET6 with RAMPS-like shield +# 'Black' STM32F407VET6 board - https://wiki.stm32duino.com/index.php?title=STM32F407 +# Shield - https://github.com/jmz52/Hardware +# +[env:STM32F407VE_black] +platform = ${common_stm32.platform} +extends = common_stm32 +board = blackSTM32F407VET6 +build_flags = ${common_stm32.build_flags} + -DARDUINO_BLACK_F407VE + -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# Anet ET4-MB_V1.x/ET4P-MB_V1.x (STM32F407VGT6 ARM Cortex-M4) +# For use with with davidtgbe's OpenBLT bootloader https://github.com/davidtgbe/openblt/releases +# Comment out board_build.offset = 0x10000 if you don't plan to use OpenBLT/flashing directly to 0x08000000. +# +[env:Anet_ET4_OpenBLT] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DHAL_SD_MODULE_ENABLED -DHAL_SRAM_MODULE_ENABLED +board = genericSTM32F407VGT6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.firmware = firmware.srec +# Just openblt.py (not stm32_bootloader.py) generates the file +board_build.encrypt = Yes +board_build.offset = 0x10000 +board_upload.offset_address = 0x08010000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/openblt.py + +# +# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) +# +[env:BIGTREE_SKR_PRO] +platform = ${common_stm32.platform} +extends = common_stm32 +board = BigTree_SKR_Pro +build_flags = ${common_stm32.build_flags} + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +#upload_protocol = stlink +#upload_command = "$PROJECT_PACKAGES_DIR/tool-stm32duino/stlink/ST-LINK_CLI.exe" -c SWD -P "$BUILD_DIR/firmware.bin" 0x8008000 -Rst -Run +debug_tool = stlink +debug_init_break = + +# +# USB Flash Drive mix-ins for STM32 +# +[stm_flash_drive] +platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc.zip +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DHAL_HCD_MODULE_ENABLED + -DUSBHOST -DUSBH_IRQ_PRIO=3 -DUSBH_IRQ_SUBPRIO=4 + +# +# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) with USB Flash Drive Support +# +[env:BIGTREE_SKR_PRO_usb_flash_drive] +extends = env:BIGTREE_SKR_PRO +platform_packages = ${stm_flash_drive.platform_packages} +build_unflags = -DUSBCON -DUSBD_USE_CDC +build_flags = ${stm_flash_drive.build_flags} + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 + +# +# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) +# +[env:BIGTREE_GTR_V1_0] +platform = ${common_stm32.platform} +extends = common_stm32 +board = BigTree_GTR_v1 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +build_flags = ${common_stm32.build_flags} + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 + +# +# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) with USB Flash Drive Support +# +[env:BIGTREE_GTR_V1_0_usb_flash_drive] +extends = env:BIGTREE_GTR_V1_0 +platform_packages = ${stm_flash_drive.platform_packages} +build_unflags = -DUSBCON -DUSBD_USE_CDC +build_flags = ${stm_flash_drive.build_flags} + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 + +# +# BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) +# +[env:BIGTREE_BTT002] +platform = ${common_stm32.platform} +extends = common_stm32 +board = BigTree_Btt002 +build_flags = ${common_stm32.build_flags} + -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 + -DHAVE_HWSERIAL2 + -DHAVE_HWSERIAL3 + -DPIN_SERIAL2_RX=PD_6 + -DPIN_SERIAL2_TX=PD_5 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# Lerdge base +# +[lerdge_common] +platform = ${common_stm32.platform} +extends = common_stm32 +board = LERDGE +board_build.offset = 0x10000 +board_build.encrypt = Yes +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/lerdge.py +build_flags = ${common_stm32.build_flags} + -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 + -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE + -DHAL_SRAM_MODULE_ENABLED +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 + +# +# Lerdge X +# +[env:LERDGEX] +platform = ${lerdge_common.platform} +extends = lerdge_common +board_build.firmware = Lerdge_X_firmware_force.bin + +# +# Lerdge X with USB Flash Drive Support +# +[env:LERDGEX_usb_flash_drive] +platform = ${env:LERDGEX.platform} +extends = env:LERDGEX +platform_packages = ${stm_flash_drive.platform_packages} +build_flags = ${stm_flash_drive.build_flags} + +# +# Lerdge S +# +[env:LERDGES] +platform = ${lerdge_common.platform} +extends = lerdge_common +board_build.firmware = Lerdge_firmware_force.bin + +# +# Lerdge S with USB Flash Drive Support +# +[env:LERDGES_usb_flash_drive] +platform = ${env:LERDGES.platform} +extends = env:LERDGES +platform_packages = ${stm_flash_drive.platform_packages} +build_flags = ${stm_flash_drive.build_flags} + +# +# Lerdge K +# +[env:LERDGEK] +platform = ${lerdge_common.platform} +extends = lerdge_common +board_build.firmware = Lerdge_K_firmware_force.bin +build_flags = ${lerdge_common.build_flags} + -DLERDGEK + +# +# Lerdge K with USB Flash Drive Support +# +[env:LERDGEK_usb_flash_drive] +platform = ${env:LERDGEK.platform} +extends = env:LERDGEK +platform_packages = ${stm_flash_drive.platform_packages} +build_flags = ${stm_flash_drive.build_flags} + +# +# RUMBA32 +# +[env:rumba32] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} + -Os + -DHAL_PCD_MODULE_ENABLED + -DDISABLE_GENERIC_SERIALUSB + -DHAL_UART_MODULE_ENABLED + -DTIMER_SERIAL=TIM9 +board = rumba32_f446ve +upload_protocol = dfu +monitor_speed = 500000 + +# +# MKS Robin Pro V2 +# +[env:mks_robin_pro2] +platform = ${common_stm32.platform} +platform_packages = ${stm_flash_drive.platform_packages} +extends = common_stm32 +build_flags = ${stm_flash_drive.build_flags} +board = genericSTM32F407VET6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.firmware = firmware.bin +board_build.offset = 0x0000 +board_upload.offset_address = 0x08000000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + +# +# This SPI is used by Robin Nano V3 +# +[stm32f4_I2C1] +build_flags = -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 + +# +# MKS Robin Nano V3 +# +[env:mks_robin_nano_v3] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} ${stm32f4_I2C1.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC +board = genericSTM32F407VGT6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.firmware = Robin_nano_v3.bin +board_build.offset = 0xC000 +board_upload.offset_address = 0x0800C000 +build_unflags = ${common_stm32.build_unflags} +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + +# +# MKS Robin Nano V3 with USB Flash Drive Support +# Currently, using a STM32duino fork, until USB Host get merged +# +[env:mks_robin_nano_v3_usb_flash_drive] +extends = env:mks_robin_nano_v3 +platform_packages = ${stm_flash_drive.platform_packages} +build_flags = ${stm_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} + -DUSBCON + -DUSE_USBHOST_HS + -DUSBD_IRQ_PRIO=5 + -DUSBD_IRQ_SUBPRIO=6 + -DUSE_USB_HS_IN_FS + -DUSBD_USE_CDC + +# +# MKS Robin Nano V3 with USB Flash Drive Support and Shared Media +# Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged +# +[env:mks_robin_nano_v3_usb_flash_drive_msc] +platform = ${common_stm32.platform} +extends = env:mks_robin_nano_v3 +platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip +build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC +build_flags = ${stm_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} + -DUSBCON + -DUSE_USBHOST_HS + -DUSBD_IRQ_PRIO=5 + -DUSBD_IRQ_SUBPRIO=6 + -DUSE_USB_HS_IN_FS + -DUSBD_USE_CDC_MSC diff --git a/ini/stm32f7.ini b/ini/stm32f7.ini new file mode 100644 index 0000000000..442ef5f9b0 --- /dev/null +++ b/ini/stm32f7.ini @@ -0,0 +1,30 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# STM32F7 Architecture # +# # +################################# + +# +# ST NUCLEO-F767ZI Development Board +# This environment is for testing purposes prior to control boards +# being readily available based on STM32F7 MCUs +# +[env:NUCLEO_F767ZI] +platform = ${common_stm32.platform} +extends = common_stm32 +board = nucleo_f767zi +build_flags = ${common_stm32.build_flags} -DTIMER_SERIAL=TIM9 + +# +# REMRAM_V1 +# +[env:REMRAM_V1] +platform = ${common_stm32.platform} +extends = common_stm32 +board = remram_v1 +build_flags = ${common_stm32.build_flags} diff --git a/ini/teensy.ini b/ini/teensy.ini new file mode 100644 index 0000000000..ae33cc7a02 --- /dev/null +++ b/ini/teensy.ini @@ -0,0 +1,42 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# Teensy Architectures # +# # +################################# + +# +# Teensy 3.1 / 3.2 (ARM Cortex-M4) +# +[env:teensy31] +platform = teensy +board = teensy31 +src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet + +# +# Teensy 3.5 / 3.6 (ARM Cortex-M4) +# +[env:teensy35] +platform = teensy +board = teensy35 +src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet + +[env:teensy36] +platform = teensy +board = teensy36 +src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet + +# +# Teensy 4.0 / 4.1 (ARM Cortex-M7) +# +[env:teensy41] +platform = teensy +board = teensy41 +src_filter = ${common.default_src_filter} + diff --git a/platformio.ini b/platformio.ini index 26b27bbf99..913bb44ae0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,6 +20,19 @@ src_dir = Marlin boards_dir = buildroot/share/PlatformIO/boards default_envs = mega2560 include_dir = Marlin +extra_configs = + ini/avr.ini + ini/due.ini + ini/esp32.ini + ini/features.ini + ini/lpc176x.ini + ini/native.ini + ini/samd51.ini + ini/stm32f0.ini + ini/stm32f1.ini + ini/stm32f4.ini + ini/stm32f7.ini + ini/teensy.ini # # The 'common' values are used for most Marlin builds @@ -222,217 +235,6 @@ extra_scripts = build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = -# -# Feature Dependencies -# -[features] -YHCB2004 = red-scorp/LiquidCrystal_AIP31068@^1.0.4, red-scorp/SoftSPIB@^1.1.1 -HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip - src_filter=+ - extra_scripts=download_mks_assets.py -POSTMORTEM_DEBUGGING = src_filter=+ + - build_flags=-funwind-tables -MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/master.zip -HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 - src_filter=+ + + + + -HAS_STEALTHCHOP = src_filter=+ -SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster - src_filter=+ -HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip - src_filter=+ -HAS_L64XX = Arduino-L6470@0.8.0 - src_filter=+ + + + -NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 - src_filter=+ -TEMP_.+_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 -USES_LIQUIDCRYSTAL = bitbucket-fmalpartida/LiquidCrystal@1.5.0 -USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 -USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 -HAS_WIRED_LCD = src_filter=+ -HAS_MARLINUI_HD44780 = src_filter=+ -HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 - src_filter=+ -HAS_(FSMC|SPI)_TFT = src_filter=+ + + -HAS_FSMC_TFT = src_filter=+ + -HAS_SPI_TFT = src_filter=+ + -I2C_EEPROM = src_filter=+ -SPI_EEPROM = src_filter=+ -HAS_GRAPHICAL_TFT = src_filter=+ -DWIN_CREALITY_LCD = src_filter=+ -IS_TFTGLCD_PANEL = src_filter=+ -HAS_TOUCH_BUTTONS = src_filter=+ -HAS_LCD_MENU = src_filter=+ -HAS_GAMES = src_filter=+ -MARLIN_BRICKOUT = src_filter=+ -MARLIN_INVADERS = src_filter=+ -MARLIN_MAZE = src_filter=+ -MARLIN_SNAKE = src_filter=+ -HAS_MENU_BACKLASH = src_filter=+ -HAS_MENU_BED_CORNERS = src_filter=+ -LCD_BED_LEVELING = src_filter=+ -HAS_MENU_CANCELOBJECT = src_filter=+ -HAS_MENU_DELTA_CALIBRATE = src_filter=+ -HAS_MENU_FILAMENT = src_filter=+ -LCD_INFO_MENU = src_filter=+ -HAS_MENU_JOB_RECOVERY = src_filter=+ -HAS_MULTI_LANGUAGE = src_filter=+ -HAS_MENU_LED = src_filter=+ -HAS_MENU_MEDIA = src_filter=+ -HAS_MENU_MIXER = src_filter=+ -HAS_MENU_MMU2 = src_filter=+ -HAS_MENU_PASSWORD = src_filter=+ -HAS_MENU_POWER_MONITOR = src_filter=+ -HAS_MENU_CUTTER = src_filter=+ -HAS_MENU_TEMPERATURE = src_filter=+ -HAS_MENU_TMC = src_filter=+ -HAS_MENU_TOUCH_SCREEN = src_filter=+ -HAS_MENU_TRAMMING = src_filter=+ -HAS_MENU_UBL = src_filter=+ -ANYCUBIC_LCD_CHIRON = src_filter=+ + -ANYCUBIC_LCD_I3MEGA = src_filter=+ + -NEXTION_TFT = src_filter=+ + -HAS_DGUS_LCD = src_filter=+ + -DGUS_LCD_UI_FYSETC = src_filter=+ -DGUS_LCD_UI_HIPRECY = src_filter=+ -DGUS_LCD_UI_MKS = src_filter=+ -DGUS_LCD_UI_ORIGIN = src_filter=+ -TOUCH_UI_FTDI_EVE = src_filter=+ -EXTUI_EXAMPLE = src_filter=+ -MALYAN_LCD = src_filter=+ -USE_UHS2_USB = src_filter=+ -USE_UHS3_USB = src_filter=+ -USB_FLASH_DRIVE_SUPPORT = src_filter=+ -AUTO_BED_LEVELING_BILINEAR = src_filter=+ -AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ -MESH_BED_LEVELING = src_filter=+ + -AUTO_BED_LEVELING_UBL = src_filter=+ + -UBL_HILBERT_CURVE = src_filter=+ -BACKLASH_COMPENSATION = src_filter=+ -BARICUDA = src_filter=+ + -BINARY_FILE_TRANSFER = src_filter=+ + -BLTOUCH = src_filter=+ -CANCEL_OBJECTS = src_filter=+ + -CASE_LIGHT_ENABLE = src_filter=+ + -EXTERNAL_CLOSED_LOOP_CONTROLLER = src_filter=+ + -USE_CONTROLLER_FAN = src_filter=+ -HAS_MOTOR_CURRENT_DAC = src_filter=+ -DIRECT_STEPPING = src_filter=+ + -EMERGENCY_PARSER = src_filter=+ - -I2C_POSITION_ENCODERS = src_filter=+ -IIC_BL24CXX_EEPROM = src_filter=+ -HAS_SPI_FLASH = src_filter=+ -HAS_ETHERNET = src_filter=+ + -HAS_FANMUX = src_filter=+ -FILAMENT_WIDTH_SENSOR = src_filter=+ + -FWRETRACT = src_filter=+ + -HOST_ACTION_COMMANDS = src_filter=+ -HOTEND_IDLE_TIMEOUT = src_filter=+ -JOYSTICK = src_filter=+ -BLINKM = src_filter=+ -HAS_COLOR_LEDS = src_filter=+ + -PCA9533 = src_filter=+ -PCA9632 = src_filter=+ -PRINTER_EVENT_LEDS = src_filter=+ -TEMP_STAT_LEDS = src_filter=+ -MAX7219_DEBUG = src_filter=+ + -HAS_MEATPACK = src_filter=+ -MIXING_EXTRUDER = src_filter=+ + -HAS_PRUSA_MMU1 = src_filter=+ -HAS_PRUSA_MMU2 = src_filter=+ + -PASSWORD_FEATURE = src_filter=+ + -ADVANCED_PAUSE_FEATURE = src_filter=+ + + -AUTO_POWER_CONTROL = src_filter=+ -HAS_POWER_MONITOR = src_filter=+ + -POWER_LOSS_RECOVERY = src_filter=+ + -PROBE_TEMP_COMPENSATION = src_filter=+ + -HAS_FILAMENT_SENSOR = src_filter=+ + -(EXT|MANUAL)_SOLENOID.* = src_filter=+ + -MK2_MULTIPLEXER = src_filter=+ -HAS_CUTTER = src_filter=+ + -EXPERIMENTAL_I2CBUS = src_filter=+ + -MECHANICAL_GANTRY_CAL.+ = src_filter=+ -Z_MULTI_ENDSTOPS = src_filter=+ -Z_STEPPER_AUTO_ALIGN = src_filter=+ + -G26_MESH_VALIDATION = src_filter=+ -ASSISTED_TRAMMING = src_filter=+ + -HAS_MESH = src_filter=+ -HAS_LEVELING = src_filter=+ + -DELTA_AUTO_CALIBRATION = src_filter=+ -CALIBRATION_GCODE = src_filter=+ -Z_MIN_PROBE_REPEATABILITY_TEST = src_filter=+ -M100_FREE_MEMORY_WATCHER = src_filter=+ -BACKLASH_GCODE = src_filter=+ -IS_KINEMATIC = src_filter=+ -HAS_EXTRA_ENDSTOPS = src_filter=+ -SKEW_CORRECTION_GCODE = src_filter=+ -DIRECT_PIN_CONTROL = src_filter=+ + -PINS_DEBUGGING = src_filter=+ -NO_VOLUMETRICS = src_filter=- -HAS_MULTI_EXTRUDER = src_filter=+ -HAS_HOTEND_OFFSET = src_filter=+ -EDITABLE_SERVO_ANGLES = src_filter=+ -PIDTEMP = src_filter=+ -PREVENT_COLD_EXTRUSION = src_filter=+ -PIDTEMPBED = src_filter=+ -HAS_USER_THERMISTORS = src_filter=+ -SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ -BAUD_RATE_GCODE = src_filter=+ -HAS_SMART_EFF_MOD = src_filter=+ -COOLANT_CONTROL = src_filter=+ -HAS_SOFTWARE_ENDSTOPS = src_filter=+ -HAS_DUPLICATION_MODE = src_filter=+ -LIN_ADVANCE = src_filter=+ -PHOTO_GCODE = src_filter=+ -CONTROLLER_FAN_EDITABLE = src_filter=+ -GCODE_MACROS = src_filter=+ -GRADIENT_MIX = src_filter=+ -HAS_SAVED_POSITIONS = src_filter=+ + -PARK_HEAD_ON_PAUSE = src_filter=+ -FILAMENT_LOAD_UNLOAD_GCODES = src_filter=+ -CNC_WORKSPACE_PLANES = src_filter=+ -CNC_COORDINATE_SYSTEMS = src_filter=+ -HAS_M206_COMMAND = src_filter=+ -EXPECTED_PRINTER_CHECK = src_filter=+ -HOST_KEEPALIVE_FEATURE = src_filter=+ -REPETIER_GCODE_M360 = src_filter=+ -HAS_GCODE_M876 = src_filter=+ -HAS_RESUME_CONTINUE = src_filter=+ -HAS_LCD_CONTRAST = src_filter=+ -LCD_SET_PROGRESS_MANUALLY = src_filter=+ -TOUCH_SCREEN_CALIBRATION = src_filter=+ -ARC_SUPPORT = src_filter=+ -GCODE_MOTION_MODES = src_filter=+ -BABYSTEPPING = src_filter=+ + -Z_PROBE_SLED = src_filter=+ -G38_PROBE_TARGET = src_filter=+ -MAGNETIC_PARKING_EXTRUDER = src_filter=+ -SDSUPPORT = src_filter=+ + + + + + + -HAS_MEDIA_SUBCALLS = src_filter=+ -GCODE_REPEAT_MARKERS = src_filter=+ + -HAS_EXTRUDERS = src_filter=+ + -HAS_COOLER = src_filter=+ + -AUTO_REPORT_TEMPERATURES = src_filter=+ -INCH_MODE_SUPPORT = src_filter=+ -TEMPERATURE_UNITS_SUPPORT = src_filter=+ -NEED_HEX_PRINT = src_filter=+ -NEED_LSF = src_filter=+ -NOZZLE_PARK_FEATURE = src_filter=+ + -NOZZLE_CLEAN_FEATURE = src_filter=+ + -DELTA = src_filter=+ + -BEZIER_CURVE_SUPPORT = src_filter=+ + -PRINTCOUNTER = src_filter=+ -HAS_BED_PROBE = src_filter=+ + + + -IS_SCARA = src_filter=+ -HAS_SERVOS = src_filter=+ + -MORGAN_SCARA = src_filter=+ -HAS_MICROSTEPS = src_filter=+ -(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer - ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/master.zip - arduinoWebSockets=links2004/WebSockets@2.3.4 - luc-github/ESP32SSDP@^1.1.1 - lib_ignore=ESPAsyncTCP - # # Default values apply to all 'env:' prefixed environments # @@ -452,1208 +254,6 @@ monitor_flags = --filter time -################################# -# # -# Unique Core Architectures # -# # -# Add a new "env" below if no # -# entry has values suitable to # -# build for a given board. # -# # -################################# - -################################# -# # -# AVR Architecture # -# # -################################# - -# -# AVR (8-bit) Common Environment values -# -[common_avr8] -board_build.f_cpu = 16000000L -src_filter = ${common.default_src_filter} + - -# -# ATmega2560 -# -[env:mega2560] -platform = atmelavr -extends = common_avr8 -board = megaatmega2560 - -# -# ATmega2560 with extended pins 70-85 defined -# BOARD_BQ_ZUM_MEGA_3D -# BOARD_ULTIMAIN_2 -# BOARD_MIGHTYBOARD_REVE -# BOARD_EINSTART_S -# -[env:mega2560ext] -platform = atmelavr -extends = env:mega2560 -board_build.variant = megaextendedpins -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py - -# -# ATmega1280 -# -[env:mega1280] -platform = atmelavr -extends = common_avr8 -board = megaatmega1280 - -# -# MightyBoard AVR with extended pins -# -[mega_extended_optimized] -extends = common_avr8 -board_build.variant = megaextendedpins -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py -upload_speed = 57600 -build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues - -# -# MightyBoard ATmega1280 -# -[env:MightyBoard1280] -platform = atmelavr -extends = mega_extended_optimized -board = megaatmega1280 - -# -# MightyBoard ATmega2560 -# -[env:MightyBoard2560] -platform = atmelavr -extends = mega_extended_optimized -board = megaatmega2560 - -# -# RAMBo -# -[env:rambo] -platform = atmelavr -extends = common_avr8 -board = reprap_rambo - -# -# FYSETC F6 V1.3 / V1.4 -# -[env:FYSETC_F6] -platform = atmelavr -extends = common_avr8 -board = fysetc_f6 - -# -# Sanguinololu (ATmega644p) -# -[env:sanguino644p] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega644p - -# -# Sanguinololu (ATmega1284p) -# -[env:sanguino1284p] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega1284p -board_upload.maximum_size = 126976 - -# -# Melzi and clones (ATmega1284p) -# -[env:melzi] -platform = atmelavr -extends = env:sanguino1284p -upload_speed = 57600 - -# -# Sanguinololu (ATmega1284p stock bootloader with tuned flags) -# - -[tuned_1284p] -build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues - -[env:sanguino1284p_optimized] -platform = atmelavr -extends = env:melzi -build_flags = ${tuned_1284p.build_flags} - -# -# Melzi and clones (alias for sanguino1284p_optimized) -# -[env:melzi_optimized] -platform = atmelavr -extends = env:sanguino1284p_optimized - -# -# Melzi and clones (Optiboot bootloader) -# -[env:melzi_optiboot] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega1284p -upload_speed = 115200 - -# -# Melzi and clones (Zonestar Melzi2 with tuned flags) -# -[env:melzi_optiboot_optimized] -platform = atmelavr -extends = env:melzi_optiboot -build_flags = ${tuned_1284p.build_flags} - -# -# AT90USB1286 boards using CDC bootloader -# - BRAINWAVE -# - BRAINWAVE_PRO -# - SAV_MKI -# - TEENSYLU -# -[env:at90usb1286_cdc] -platform = teensy -extends = common_avr8 -board = at90usb1286 -lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet - -# -# AT90USB1286 boards using DFU bootloader -# - Printrboard -# - Printrboard Rev.F -# - ? 5DPRINT ? -# -[env:at90usb1286_dfu] -platform = teensy -extends = env:at90usb1286_cdc - -################################# -# # -# DUE Architecture # -# # -################################# - -# -# Due (Atmel SAM3X8E ARM Cortex-M3) -# -# - RAMPS4DUE -# - RADDS -# -[env:DUE] -platform = atmelsam -board = due -src_filter = ${common.default_src_filter} + + - -[env:DUE_USB] -platform = atmelsam -extends = env:DUE -board = dueUSB - -# -# Archim SAM -# -[common_DUE_archim] -platform = atmelsam -extends = env:DUE -board = archim -build_flags = ${common.build_flags} - -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON -board_build.variants_dir = buildroot/share/PlatformIO/variants/ -extra_scripts = ${common.extra_scripts} - Marlin/src/HAL/DUE/upload_extra_script.py - -[env:DUE_archim] -platform = ${common_DUE_archim.platform} -extends = common_DUE_archim - -################################# -# # -# SAMD51 Architecture # -# # -################################# - -# -# Adafruit Grand Central M4 (Atmel SAMD51P20A ARM Cortex-M4) -# -[env:SAMD51_grandcentral_m4] -platform = atmelsam -board = adafruit_grandcentral_m4 -build_flags = ${common.build_flags} -std=gnu++17 -build_unflags = -std=gnu++11 -src_filter = ${common.default_src_filter} + -lib_deps = ${common.lib_deps} - SoftwareSerialM - Adafruit SPIFlash -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py -custom_marlin.SDSUPPORT = SdFat - Adafruit Fork -debug_tool = jlink - -################################# -# # -# LPC176x Architecture # -# # -################################# - -# -# NXP LPC176x ARM Cortex-M3 -# -[common_LPC] -platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.3.zip -platform_packages = framework-arduino-lpc176x@^0.2.6 -board = nxp_lpc1768 -lib_ldf_mode = off -lib_compat_mode = strict -extra_scripts = ${common.extra_scripts} - Marlin/src/HAL/LPC1768/upload_extra_script.py -src_filter = ${common.default_src_filter} + + -lib_deps = ${common.lib_deps} - Servo -custom_marlin.USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@~1.0.7 -custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip -build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g - # debug options for backtrace - #-funwind-tables - #-mpoke-function-name - -# -# NXP LPC176x ARM Cortex-M3 -# -[env:LPC1768] -platform = ${common_LPC.platform} -extends = common_LPC -board = nxp_lpc1768 - -[env:LPC1769] -platform = ${common_LPC.platform} -extends = common_LPC -board = nxp_lpc1769 - -################################# -# # -# STM32 Architecture # -# # -################################# - -# -# HAL/STM32 Base Environment values -# -[common_stm32] -platform = ststm32@~12.0 -build_flags = ${common.build_flags} - -std=gnu++14 - -DUSBCON -DUSBD_USE_CDC - -DTIM_IRQ_PRIO=13 - -DADC_RESOLUTION=12 -build_unflags = -std=gnu++11 -src_filter = ${common.default_src_filter} + + - -# -# HAL/STM32F1 Common Environment values -# -[common_stm32f1] -platform = ststm32@~12.0 -board_build.core = maple -build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py - ${common.build_flags} - -DARDUINO_ARCH_STM32 -build_unflags = -std=gnu11 -std=gnu++11 -src_filter = ${common.default_src_filter} + -lib_ignore = SPI, FreeRTOS701, FreeRTOS821 -lib_deps = ${common.lib_deps} - SoftwareSerialM -platform_packages = tool-stm32duino -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/fix_framework_weakness.py - -# -# STM32F103RC -# -[env:STM32F103RC] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -monitor_speed = 115200 - -# -# MEEB_3DP (STM32F103RCT6 with 512K) -# -[env:STM32F103RC_meeb] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = MEEB_3DP -build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 - -DSS_TIMER=4 - -DSTM32_FLASH_SIZE=512 - -DHSE_VALUE=12000000U - -DUSE_USB_COMPOSITE - -DVECT_TAB_OFFSET=0x2000 - -DGENERIC_BOOTLOADER -extra_scripts = ${common_stm32f1.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py - buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py -lib_deps = ${common.lib_deps} - SoftwareSerialM - USBComposite for STM32F1@0.91 -custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use -debug_tool = stlink -upload_protocol = dfu - -# -# STM32F103RC_fysetc -# -[env:STM32F103RC_fysetc] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py -build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -lib_ldf_mode = chain -debug_tool = stlink -upload_protocol = serial - -# -# BigTree SKR Mini V1.1 / SKR mini E3 / SKR E3 DIP (STM32F103RCT6 ARM Cortex-M3) -# -# STM32F103RC_btt ............. RCT6 with 256K -# STM32F103RC_btt_USB ......... RCT6 with 256K (USB mass storage) -# STM32F103RC_btt_512K ........ RCT6 with 512K -# STM32F103RC_btt_512K_USB .... RCT6 with 512K (USB mass storage) -# -# WARNING! If you have an SKR Mini v1.1 or an SKR Mini E3 1.0 / 1.2 / 2.0 / DIP -# and experience a printer freeze, re-flash Marlin using the regular (non-512K) -# build option. 256K chips may be re-branded 512K chips, but this means the -# upper 256K is sketchy, and failure is very likely. -# - -[env:STM32F103RC_btt] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py -build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 -DSS_TIMER=4 -monitor_speed = 115200 - -[env:STM32F103RC_btt_USB] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC_btt -build_flags = ${env:STM32F103RC_btt.build_flags} -DUSE_USB_COMPOSITE -lib_deps = ${env:STM32F103RC_btt.lib_deps} - USBComposite for STM32F1@0.91 - -[env:STM32F103RC_btt_512K] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC_btt -board_upload.maximum_size=524288 -build_flags = ${env:STM32F103RC_btt.build_flags} -DSTM32_FLASH_SIZE=512 - -[env:STM32F103RC_btt_512K_USB] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC_btt_512K -build_flags = ${env:STM32F103RC_btt_512K.build_flags} -DUSE_USB_COMPOSITE -lib_deps = ${env:STM32F103RC_btt_512K.lib_deps} - USBComposite for STM32F1@0.91 - -# -# STM32F103RE -# -[env:STM32F103RE] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RE -monitor_speed = 115200 - -# -# STM32F103RE_btt ............. RET6 -# STM32F103RE_btt_USB ......... RET6 (USB mass storage) -# -[env:STM32F103RE_btt] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py -build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 -debug_tool = stlink -upload_protocol = stlink - -[env:STM32F103RE_btt_USB] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RE_btt -build_flags = ${env:STM32F103RE_btt.build_flags} -DUSE_USB_COMPOSITE -lib_deps = ${common_stm32f1.lib_deps} - USBComposite for STM32F1@0.91 - -# -# REMRAM_V1 -# -[env:REMRAM_V1] -platform = ${common_stm32.platform} -extends = common_stm32 -board = remram_v1 -build_flags = ${common_stm32.build_flags} - -# -# ST NUCLEO-F767ZI Development Board -# This environment is for testing purposes prior to control boards -# being readily available based on STM32F7 MCUs -# -[env:NUCLEO_F767ZI] -platform = ${common_stm32.platform} -extends = common_stm32 -board = nucleo_f767zi -build_flags = ${common_stm32.build_flags} -DTIMER_SERIAL=TIM9 - -# -# ARMED (STM32) -# -[env:ARMED] -platform = ${common_stm32.platform} -extends = common_stm32 -board = armed_v1 -build_flags = ${common_stm32.build_flags} - -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing - -# -# Geeetech GTM32 (STM32F103VET6) -# -[env:STM32F103VE_GTM32] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -build_flags = ${common_stm32f1.build_flags} - -ffunction-sections -fdata-sections -nostdlib -MMD - -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -DBOARD_generic_stm32f103v - -DDEBUG_LEVEL=DEBUG_NONE -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DVECT_TAB_ADDR=0x8000000 - -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 -upload_protocol = serial - -# -# Longer 3D board in Alfawise U20 (STM32F103VET6) -# -[env:STM32F103VE_longer] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 -build_unflags = ${common_stm32f1.build_unflags} - -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 - -# -# MKS Robin Mini (STM32F103VET6) -# -[env:mks_robin_mini] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_mini.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE - -# -# MKS Robin Nano (STM32F103VET6) -# -[env:mks_robin_nano35] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_nano35.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE -DSS_TIMER=4 -debug_tool = jlink -upload_protocol = jlink - -# -# MKS Robin (STM32F103ZET6) -# -[env:mks_robin] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103ZE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin.py -build_flags = ${common_stm32f1.build_flags} - -DSS_TIMER=4 -DSTM32_XL_DENSITY - -# MKS Robin (STM32F103ZET6) -# Uses HAL STM32 to support Marlin UI for TFT screen with optional touch panel -# -[env:mks_robin_stm32] -platform = ${common_stm32.platform} -extends = common_stm32 -board = genericSTM32F103ZE -board_build.core = stm32 -board_build.variant = MARLIN_F103Zx -board_build.ldscript = ldscript.ld -board_build.offset = 0x7000 -board_build.encrypt = Yes -board_build.firmware = Robin.bin -build_flags = ${common_stm32.build_flags} - -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 -build_unflags = ${common_stm32.build_unflags} - -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/mks_encrypt.py -lib_deps = - -# -# MKS Robin Pro (STM32F103ZET6) -# -[env:mks_robin_pro] -platform = ${common_stm32f1.platform} -extends = env:mks_robin -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_pro.py - -# -# TRIGORILLA PRO (STM32F103ZET6) -# -[env:trigorilla_pro] -platform = ${common_stm32f1.platform} -extends = env:mks_robin -extra_scripts = ${common_stm32f1.extra_scripts} - -# -# MKS Robin E3D (STM32F103RCT6) and -# MKS Robin E3 with TMC2209 -# -[env:mks_robin_e3] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -platform_packages = tool-stm32duino -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_e3.py -build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 -DSS_TIMER=4 - -# -# MKS Robin E3p (STM32F103VET6) -# - LVGL UI -# -[env:mks_robin_e3p] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_e3p.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE -DSS_TIMER=4 -debug_tool = jlink -upload_protocol = jlink - -# -# MKS Robin Lite/Lite2 (STM32F103RCT6) -# -[env:mks_robin_lite] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_lite.py - -# -# MKS ROBIN LITE3 (STM32F103RCT6) -# -[env:mks_robin_lite3] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_lite3.py - -# -# JGAurora A5S A1 (STM32F103ZET6) -# -[env:jgaurora_a5s_a1] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103ZE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py -build_flags = ${common_stm32f1.build_flags} - -DSTM32F1xx -DSTM32_XL_DENSITY - -# -# Malyan M200 (STM32F103CB) -# -[env:STM32F103CB_malyan] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = malyanM200 -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103CB -D__STM32F1__=1 -std=c++1y -DSERIAL_USB -ffunction-sections -fdata-sections - -Wl,--gc-sections -DDEBUG_LEVEL=0 -D__MARLIN_FIRMWARE__ -lib_ignore = ${common_stm32f1.lib_ignore} - SoftwareSerialM - -# -# Malyan M200 v2 (STM32F070RB) -# -[env:STM32F070RB_malyan] -platform = ${common_stm32.platform} -extends = common_stm32 -board = malyanM200v2 -build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED - -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing - -DCUSTOM_STARTUP_FILE - -# -# Malyan M200 v2 (STM32F070CB) -# -[env:STM32F070CB_malyan] -platform = ${common_stm32.platform} -extends = common_stm32 -board = malyanm200_f070cb -build_flags = ${common_stm32.build_flags} - -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -DCUSTOM_STARTUP_FILE - -# -# Malyan M300 (STM32F070CB) -# -[env:malyan_M300] -platform = ${common_stm32.platform} -extends = common_stm32 -board = malyanm300_f070cb -build_flags = ${common_stm32.build_flags} - -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -src_filter = ${common.default_src_filter} + - -# -# Chitu boards like Tronxy X5s (STM32F103ZET6) -# -[env:chitu_f103] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = CHITU_F103 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py - pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py - buildroot/share/PlatformIO/scripts/chitu_crypt.py -build_flags = ${common_stm32f1.build_flags} - -DSTM32F1xx -DSTM32_XL_DENSITY -build_unflags = ${common_stm32f1.build_unflags} - -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG= -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 - -# -# Some Chitu V5 boards have a problem with GPIO init. -# Use this target if G28 or G29 are always failing. -# -[env:chitu_v5_gpio_init] -platform = ${common_stm32f1.platform} -extends = env:chitu_f103 -build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX - -# -# Creality (STM32F103RET6) -# -[env:STM32F103RET6_creality] -platform = ${env:STM32F103RE.platform} -extends = env:STM32F103RE -build_flags = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4 -extra_scripts = ${env:STM32F103RE.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/random-bin.py - buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py -debug_tool = jlink -upload_protocol = jlink - -# -# FLSUN QQS Pro (STM32F103VET6) using hal STM32 -# board Hispeedv1 -# -[env:flsun_hispeedv1] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 -board = genericSTM32F103VE -board_build.core = stm32 -board_build.variant = MARLIN_F103Vx -board_build.ldscript = ldscript.ld -board_build.offset = 0x7000 -board_build.firmware = Robin_mini.bin -board_build.encrypt = Yes -board_upload.offset_address = 0x08007000 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/mks_encrypt.py - -# -# STM32F401VE -# 'STEVAL-3DP001V1' STM32F401VE board - https://www.st.com/en/evaluation-tools/steval-3dp001v1.html -# -[env:STM32F401VE_STEVAL] -platform = ${common_stm32.platform} -extends = common_stm32 -board = STEVAL_STM32F401VE -build_flags = ${common_stm32.build_flags} - -DARDUINO_STEVAL -DSTM32F401xE - -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py - -# -# STM32F401RC -# -[env:FYSETC_CHEETAH_V20] -platform = ${common_stm32.platform} -extends = common_stm32 -board = FYSETC_CHEETAH_V20 -build_flags = ${common_stm32.build_flags} -DSTM32F401xC -DVECT_TAB_OFFSET=0xC000 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/FYSETC_CHEETAH_V20.py - -# -# FLYF407ZG -# -[env:FLYF407ZG] -platform = ${common_stm32.platform} -extends = common_stm32 -board = FLYF407ZG -build_flags = ${common_stm32.build_flags} - -DVECT_TAB_OFFSET=0x8000 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - -# -# FLY MINI(stm32f103rct6) -# -[env:FLY_MINI] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/fly_mini.py -build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 -DSS_TIMER=4 - -# -# FYSETC S6 (STM32F446VET6 ARM Cortex-M4) -# -[env:FYSETC_S6] -platform = ${common_stm32.platform} -extends = common_stm32 -platform_packages = tool-stm32duino -board = marlin_fysetc_s6 -build_flags = ${common_stm32.build_flags} - -DVECT_TAB_OFFSET=0x10000 - -DHAL_PCD_MODULE_ENABLED -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -debug_tool = stlink -upload_protocol = dfu -upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" - -# -# STM32F407VET6 with RAMPS-like shield -# 'Black' STM32F407VET6 board - https://wiki.stm32duino.com/index.php?title=STM32F407 -# Shield - https://github.com/jmz52/Hardware -# -[env:STM32F407VE_black] -platform = ${common_stm32.platform} -extends = common_stm32 -board = blackSTM32F407VET6 -build_flags = ${common_stm32.build_flags} - -DARDUINO_BLACK_F407VE - -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - -# -# Anet ET4-MB_V1.x/ET4P-MB_V1.x (STM32F407VGT6 ARM Cortex-M4) -# For use with with davidtgbe's OpenBLT bootloader https://github.com/davidtgbe/openblt/releases -# Comment out board_build.offset = 0x10000 if you don't plan to use OpenBLT/flashing directly to 0x08000000. -# -[env:Anet_ET4_OpenBLT] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_SD_MODULE_ENABLED -DHAL_SRAM_MODULE_ENABLED -board = genericSTM32F407VGT6 -board_build.core = stm32 -board_build.variant = MARLIN_F4x7Vx -board_build.ldscript = ldscript.ld -board_build.firmware = firmware.srec -# Just openblt.py (not stm32_bootloader.py) generates the file -board_build.encrypt = Yes -board_build.offset = 0x10000 -board_upload.offset_address = 0x08010000 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 -debug_tool = jlink -upload_protocol = jlink -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/openblt.py - -# -# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) -# -[env:BIGTREE_SKR_PRO] -platform = ${common_stm32.platform} -extends = common_stm32 -board = BigTree_SKR_Pro -build_flags = ${common_stm32.build_flags} - -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -#upload_protocol = stlink -#upload_command = "$PROJECT_PACKAGES_DIR/tool-stm32duino/stlink/ST-LINK_CLI.exe" -c SWD -P "$BUILD_DIR/firmware.bin" 0x8008000 -Rst -Run -debug_tool = stlink -debug_init_break = - -# -# USB Flash Drive mix-ins for STM32 -# -[stm32_flash_drive] -platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc.zip -build_flags = ${common_stm32.build_flags} - -DHAL_PCD_MODULE_ENABLED -DHAL_HCD_MODULE_ENABLED - -DUSBHOST -DUSBH_IRQ_PRIO=3 -DUSBH_IRQ_SUBPRIO=4 - -# -# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) with USB Flash Drive Support -# -[env:BIGTREE_SKR_PRO_usb_flash_drive] -extends = env:BIGTREE_SKR_PRO -platform_packages = ${stm32_flash_drive.platform_packages} -build_unflags = -DUSBCON -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} - -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 - -# -# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) -# -[env:BIGTREE_GTR_V1_0] -platform = ${common_stm32.platform} -extends = common_stm32 -board = BigTree_GTR_v1 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -build_flags = ${common_stm32.build_flags} - -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 - -# -# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) with USB Flash Drive Support -# -[env:BIGTREE_GTR_V1_0_usb_flash_drive] -extends = env:BIGTREE_GTR_V1_0 -platform_packages = ${stm32_flash_drive.platform_packages} -build_unflags = -DUSBCON -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} - -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 - -# -# BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) -# -[env:BIGTREE_BTT002] -platform = ${common_stm32.platform} -extends = common_stm32 -board = BigTree_Btt002 -build_flags = ${common_stm32.build_flags} - -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 - -DHAVE_HWSERIAL2 - -DHAVE_HWSERIAL3 - -DPIN_SERIAL2_RX=PD_6 - -DPIN_SERIAL2_TX=PD_5 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - -# -# Lerdge base -# -[lerdge_common] -platform = ${common_stm32.platform} -extends = common_stm32 -board = LERDGE -board_build.offset = 0x10000 -board_build.encrypt = Yes -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/lerdge.py -build_flags = ${common_stm32.build_flags} - -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 - -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE - -DHAL_SRAM_MODULE_ENABLED -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 - -# -# Lerdge X -# -[env:LERDGEX] -platform = ${lerdge_common.platform} -extends = lerdge_common -board_build.firmware = Lerdge_X_firmware_force.bin - -# -# Lerdge X with USB Flash Drive Support -# -[env:LERDGEX_usb_flash_drive] -platform = ${env:LERDGEX.platform} -extends = env:LERDGEX -platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} - -# -# Lerdge S -# -[env:LERDGES] -platform = ${lerdge_common.platform} -extends = lerdge_common -board_build.firmware = Lerdge_firmware_force.bin - -# -# Lerdge S with USB Flash Drive Support -# -[env:LERDGES_usb_flash_drive] -platform = ${env:LERDGES.platform} -extends = env:LERDGES -platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} - -# -# Lerdge K -# -[env:LERDGEK] -platform = ${lerdge_common.platform} -extends = lerdge_common -board_build.firmware = Lerdge_K_firmware_force.bin -build_flags = ${lerdge_common.build_flags} - -DLERDGEK - -# -# Lerdge K with USB Flash Drive Support -# -[env:LERDGEK_usb_flash_drive] -platform = ${env:LERDGEK.platform} -extends = env:LERDGEK -platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} - -# -# RUMBA32 -# -[env:rumba32] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} - -Os - -DHAL_PCD_MODULE_ENABLED - -DDISABLE_GENERIC_SERIALUSB - -DHAL_UART_MODULE_ENABLED - -DTIMER_SERIAL=TIM9 -board = rumba32_f446ve -upload_protocol = dfu -monitor_speed = 500000 - -# -# MKS Robin Nano V1.2 and V2 using hal STM32 -# -[env:mks_robin_nano35_stm32] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 -board = genericSTM32F103VE -board_build.core = stm32 -board_build.variant = MARLIN_F103Vx -board_build.ldscript = ldscript.ld -board_build.offset = 0x7000 -board_build.encrypt = Yes -board_build.firmware = Robin_nano35.bin -board_upload.offset_address = 0x08007000 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -debug_tool = jlink -upload_protocol = jlink -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/mks_encrypt.py - -# -# MKS Robin Pro V2 -# -[env:mks_robin_pro2] -platform = ${common_stm32.platform} -platform_packages = ${stm32_flash_drive.platform_packages} -extends = common_stm32 -build_flags = ${stm32_flash_drive.build_flags} -board = genericSTM32F407VET6 -board_build.core = stm32 -board_build.variant = MARLIN_F4x7Vx -board_build.ldscript = ldscript.ld -board_build.firmware = firmware.bin -board_build.offset = 0x0000 -board_upload.offset_address = 0x08000000 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -debug_tool = jlink -upload_protocol = jlink -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - -# -# This SPI is used by Robin Nano V3 -# -[stm32f4_I2C1] -build_flags = -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 - -# -# MKS Robin Nano V3 -# -[env:mks_robin_nano_v3] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} ${stm32f4_I2C1.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC -board = genericSTM32F407VGT6 -board_build.core = stm32 -board_build.variant = MARLIN_F4x7Vx -board_build.ldscript = ldscript.ld -board_build.firmware = Robin_nano_v3.bin -board_build.offset = 0xC000 -board_upload.offset_address = 0x0800C000 -build_unflags = ${common_stm32.build_unflags} -debug_tool = jlink -upload_protocol = jlink -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - -# -# MKS Robin Nano V3 with USB Flash Drive Support -# Currently, using a STM32duino fork, until USB Host get merged -# -[env:mks_robin_nano_v3_usb_flash_drive] -extends = env:mks_robin_nano_v3 -platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} - -DUSBCON - -DUSE_USBHOST_HS - -DUSBD_IRQ_PRIO=5 - -DUSBD_IRQ_SUBPRIO=6 - -DUSE_USB_HS_IN_FS - -DUSBD_USE_CDC - -# -# MKS Robin Nano V3 with USB Flash Drive Support and Shared Media -# Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged -# -[env:mks_robin_nano_v3_usb_flash_drive_msc] -platform = ${common_stm32.platform} -extends = env:mks_robin_nano_v3 -platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip -build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} - -DUSBCON - -DUSE_USBHOST_HS - -DUSBD_IRQ_PRIO=5 - -DUSBD_IRQ_SUBPRIO=6 - -DUSE_USB_HS_IN_FS - -DUSBD_USE_CDC_MSC - -# -# Mingda MPX_ARM_MINI -# - -[env:mingda_mpx_arm_mini] -platform = ${common_stm32.platform} -extends = common_stm32 -board = genericSTM32F103ZE -board_build.core = stm32 -board_build.variant = MARLIN_F103Zx -board_build.ldscript = ldscript.ld -board_build.offset = 0x10000 -build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - -################################# -# # -# Other Architectures # -# # -################################# - -# -# Espressif ESP32 -# -[env:esp32] -platform = espressif32@2.1.0 -board = esp32dev -build_flags = ${common.build_flags} -DCORE_DEBUG_LEVEL=0 -src_filter = ${common.default_src_filter} + -lib_ignore = NativeEthernet -upload_speed = 500000 -monitor_speed = 250000 -#upload_port = marlinesp.local -#board_build.flash_mode = qio - -[env:FYSETC_E4] -platform = espressif32@1.11.2 -extends = env:esp32 -board_build.partitions = default_16MB.csv - -# -# Teensy 3.1 / 3.2 (ARM Cortex-M4) -# -[env:teensy31] -platform = teensy -board = teensy31 -src_filter = ${common.default_src_filter} + -lib_ignore = NativeEthernet - -# -# Teensy 3.5 / 3.6 (ARM Cortex-M4) -# -[env:teensy35] -platform = teensy -board = teensy35 -src_filter = ${common.default_src_filter} + -lib_ignore = NativeEthernet - -[env:teensy36] -platform = teensy -board = teensy36 -src_filter = ${common.default_src_filter} + -lib_ignore = NativeEthernet - -# -# Teensy 4.0 / 4.1 (ARM Cortex-M7) -# -[env:teensy41] -platform = teensy -board = teensy41 -src_filter = ${common.default_src_filter} + - -# -# Native -# No supported Arduino libraries, base Marlin only -# -[env:linux_native] -platform = native -framework = -build_flags = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined -src_build_flags = -Wall -IMarlin/src/HAL/LINUX/include -build_unflags = -Wall -lib_ldf_mode = off -lib_deps = -src_filter = ${common.default_src_filter} + - # # Just print the dependency tree # From 96bdc4c8307bdbb5d9c8d696a14f7a4cee3cbbad Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 1 Apr 2021 21:54:34 -0500 Subject: [PATCH 1240/1370] Requiring PIO >= 5.0.3 --- .../PlatformIO/scripts/STM32F1_create_variant.py | 6 ++++-- .../scripts/copy_marlin_variant_to_framework.py | 16 ++-------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py index 0ba5d71f26..91522a9d06 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py @@ -20,12 +20,14 @@ board = env.BoardConfig() FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32-maple") assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") + +source_root = os.path.join("buildroot", "share", "PlatformIO", "variants") +assert os.path.isdir(source_root) variant = board.get("build.variant") variant_dir = os.path.join(FRAMEWORK_DIR, "STM32F1", "variants", variant) -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) +source_dir = os.path.join(source_root, variant) assert os.path.isdir(source_dir) if os.path.isdir(variant_dir): diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index 7ea7ac57f3..15c953156c 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -4,19 +4,7 @@ import os,shutil from SCons.Script import DefaultEnvironment from platformio import util -try: - # PIO < 4.4 - from platformio.managers.package import PackageManager -except ImportError: - # PIO >= 4.4 - from platformio.package.meta import PackageSpec as PackageManager - -def parse_pkg_uri(spec): - if PackageManager.__name__ == 'PackageSpec': - return PackageManager(spec).name - else: - name, _, _ = PackageManager.parse_pkg_uri(spec) - return name +from platformio.package.meta import PackageSpec def copytree(src, dst, symlinks=False, ignore=None): for item in os.listdir(src): @@ -41,7 +29,7 @@ framewords = { if len(platform_packages) == 0: platform_name = framewords[platform.__class__.__name__] else: - platform_name = parse_pkg_uri(platform_packages[0]) + platform_name = PackageSpec(platform_packages[0]).name FRAMEWORK_DIR = platform.get_package_dir(platform_name) assert os.path.isdir(FRAMEWORK_DIR) From 4f174afc1a302f959c3483605f0e2caa259488fa Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 2 Apr 2021 14:22:43 -0500 Subject: [PATCH 1241/1370] Remove extraneous 'extern' hints (#21516) --- Marlin/src/feature/fanmux.h | 4 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_about.h | 4 +- .../lib/mks_ui/draw_acceleration_settings.h | 4 +- .../extui/lib/mks_ui/draw_advance_settings.h | 4 +- .../mks_ui/draw_auto_level_offset_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_baby_stepping.h | 8 ++-- .../lcd/extui/lib/mks_ui/draw_change_speed.h | 10 ++--- .../lcd/extui/lib/mks_ui/draw_cloud_bind.h | 12 ++--- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 10 ++--- .../extui/lib/mks_ui/draw_eeprom_settings.h | 4 +- .../extui/lib/mks_ui/draw_encoder_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_error_message.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_extrusion.h | 14 +++--- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h | 6 +-- .../extui/lib/mks_ui/draw_filament_change.h | 8 ++-- .../extui/lib/mks_ui/draw_filament_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.h | 4 +- .../mks_ui/draw_homing_sensitivity_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_jerk_settings.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_keyboard.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_language.h | 4 +- .../extui/lib/mks_ui/draw_level_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_machine_para.h | 4 +- .../extui/lib/mks_ui/draw_machine_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.h | 4 +- .../lib/mks_ui/draw_max_feedrate_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_more.h | 4 +- .../extui/lib/mks_ui/draw_motor_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_move_motor.h | 6 +-- .../lcd/extui/lib/mks_ui/draw_number_key.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_operation.h | 4 +- .../lcd/extui/lib/mks_ui/draw_pause_message.h | 2 +- .../extui/lib/mks_ui/draw_pause_position.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.h | 10 ++--- .../lcd/extui/lib/mks_ui/draw_print_file.h | 18 ++++---- .../src/lcd/extui/lib/mks_ui/draw_printing.h | 22 +++++----- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 16 +++---- Marlin/src/lcd/extui/lib/mks_ui/draw_set.h | 4 +- .../lcd/extui/lib/mks_ui/draw_step_settings.h | 4 +- .../lib/mks_ui/draw_tmc_current_settings.h | 4 +- .../lib/mks_ui/draw_tmc_step_mode_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h | 4 +- .../extui/lib/mks_ui/draw_touch_calibration.h | 6 +-- .../lib/mks_ui/draw_tramming_pos_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 36 +++++++-------- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h | 6 +-- .../src/lcd/extui/lib/mks_ui/draw_wifi_list.h | 10 ++--- .../lcd/extui/lib/mks_ui/draw_wifi_settings.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_wifi_tips.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 16 +++---- .../lcd/extui/lib/mks_ui/printer_operation.h | 6 +-- .../lib/mks_ui/tft_lvgl_configuration.cpp | 8 ++-- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 44 +++++++++---------- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h | 10 ++--- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 4 +- Marlin/src/module/servo.h | 2 +- Marlin/src/module/tool_change.h | 2 +- 61 files changed, 215 insertions(+), 217 deletions(-) diff --git a/Marlin/src/feature/fanmux.h b/Marlin/src/feature/fanmux.h index b1b0c67a55..efb92cf198 100644 --- a/Marlin/src/feature/fanmux.h +++ b/Marlin/src/feature/fanmux.h @@ -25,5 +25,5 @@ * feature/fanmux.h - Cooling Fan Multiplexer support functions */ -extern void fanmux_switch(const uint8_t e); -extern void fanmux_init(); +void fanmux_switch(const uint8_t e); +void fanmux_init(); diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index 6e0ee3053f..c017d69dae 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -117,7 +117,7 @@ extern DGUSDisplay dgusdisplay; constexpr float cpow(const float x, const int y) { return y == 0 ? 1.0 : x * cpow(x, y - 1); } /// Find the flash address of a DGUS_VP_Variable for the VP. -extern const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp); +const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp); /// Helper to populate a DGUS_VP_Variable for a given VP. Return false if not found. -extern bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy); +bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h index 77d66aef11..4e7b318eda 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_about(); -extern void lv_clear_about(); +void lv_draw_about(); +void lv_clear_about(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h index dc72739106..e333e0ae51 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_acceleration_settings(); -extern void lv_clear_acceleration_settings(); +void lv_draw_acceleration_settings(); +void lv_clear_acceleration_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h index 8885fc6a4e..8848c34451 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_advance_settings(); -extern void lv_clear_advance_settings(); +void lv_draw_advance_settings(); +void lv_clear_advance_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h index ec61862a24..38314f6bc2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_auto_level_offset_settings(); -extern void lv_clear_auto_level_offset_settings(); +void lv_draw_auto_level_offset_settings(); +void lv_clear_auto_level_offset_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h index 8793ad772f..f8efeabc40 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h @@ -25,10 +25,10 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_baby_stepping(); -extern void lv_clear_baby_stepping(); -extern void disp_baby_step_dist(); -extern void disp_z_offset_value(); +void lv_draw_baby_stepping(); +void lv_clear_baby_stepping(); +void disp_baby_step_dist(); +void disp_z_offset_value(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h index 75e4fe3099..66662d8811 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h @@ -28,11 +28,11 @@ #define MIN_EXT_SPEED_PERCENT 10 #define MAX_EXT_SPEED_PERCENT 999 -extern void lv_draw_change_speed(); -extern void lv_clear_change_speed(); -extern void disp_speed_step(); -extern void disp_print_speed(); -extern void disp_speed_type(); +void lv_draw_change_speed(); +void lv_clear_change_speed(); +void disp_speed_step(); +void disp_print_speed(); +void disp_speed_type(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h index 1626680051..917b52ab0a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h @@ -25,12 +25,12 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_cloud_bind(); -extern void lv_clear_cloud_bind(); -extern void disp_bind_state(); -extern void refresh_bind_ui(); -extern void display_qrcode(uint8_t *qrcode_data); -extern void cloud_unbind(); +void lv_draw_cloud_bind(); +void lv_clear_cloud_bind(); +void disp_bind_state(); +void refresh_bind_ui(); +void display_qrcode(uint8_t *qrcode_data); +void cloud_unbind(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index 38f5fa0635..e53d48a2b8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -74,11 +74,11 @@ enum { DIALOG_TRANSFER_NO_DEVICE }; -extern void lv_draw_dialog(uint8_t type); -extern void lv_clear_dialog(); -extern void filament_sprayer_temp(); -extern void filament_dialog_handle(); -extern void lv_filament_setbar(); +void lv_draw_dialog(uint8_t type); +void lv_clear_dialog(); +void filament_sprayer_temp(); +void filament_dialog_handle(); +void lv_filament_setbar(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h index 3d9f7cae00..575ebbc6a2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_eeprom_settings(); -extern void lv_clear_eeprom_settings(); +void lv_draw_eeprom_settings(); +void lv_clear_eeprom_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h index 392dc67db7..bbf0c34858 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_encoder_settings(); -extern void lv_clear_encoder_settings(); +void lv_draw_encoder_settings(); +void lv_clear_encoder_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h index 35e3bd6cf5..6999ecf5e4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h @@ -29,8 +29,8 @@ #define PGM_P const char * #endif -extern void lv_draw_error_message(PGM_P const msg); -extern void lv_clear_error_message(); +void lv_draw_error_message(PGM_P const msg); +void lv_clear_error_message(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h index 75db2fbab5..0252767767 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h @@ -25,13 +25,13 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_extrusion(); -extern void lv_clear_extrusion(); -extern void disp_ext_type(); -extern void disp_ext_step(); -extern void disp_ext_speed(); -extern void disp_hotend_temp(); -extern void disp_extru_amount(); +void lv_draw_extrusion(); +void lv_clear_extrusion(); +void disp_ext_type(); +void disp_ext_step(); +void disp_ext_speed(); +void disp_hotend_temp(); +void disp_extru_amount(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h index d9b23fbbe4..0db87eb4f6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h @@ -25,9 +25,9 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_fan(); -extern void lv_clear_fan(); -extern void disp_fan_value(); +void lv_draw_fan(); +void lv_clear_fan(); +void disp_fan_value(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h index 9c1c9a8767..d3536a380a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h @@ -25,10 +25,10 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_filament_change(); -extern void lv_clear_filament_change(); -extern void disp_filament_type(); -extern void disp_filament_temp(); +void lv_draw_filament_change(); +void lv_clear_filament_change(); +void disp_filament_type(); +void disp_filament_temp(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h index f9967df31f..3d190e99c7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_filament_settings(); -extern void lv_clear_filament_settings(); +void lv_draw_filament_settings(); +void lv_clear_filament_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h index 30a378a15a..4e1610431e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_gcode(bool clear = false); -extern void lv_clear_gcode(); +void lv_draw_gcode(bool clear = false); +void lv_clear_gcode(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h index 779cbb0130..7375dc7aa8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_home(); -extern void lv_clear_home(); +void lv_draw_home(); +void lv_clear_home(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h index c6f0e11457..e086391373 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_homing_sensitivity_settings(); -extern void lv_clear_homing_sensitivity_settings(); +void lv_draw_homing_sensitivity_settings(); +void lv_clear_homing_sensitivity_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h index 69fd344609..7f5ffc3ac5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_jerk_settings(); -extern void lv_clear_jerk_settings(); +void lv_draw_jerk_settings(); +void lv_clear_jerk_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h index 0013dc4030..d89806c272 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_keyboard(); -extern void lv_clear_keyboard(); +void lv_draw_keyboard(); +void lv_clear_keyboard(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h index 9e769e3692..4f51856f4f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_language(); -extern void lv_clear_language(); +void lv_draw_language(); +void lv_clear_language(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h index 95a4e2e2e5..06283d2095 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_level_settings(); -extern void lv_clear_level_settings(); +void lv_draw_level_settings(); +void lv_clear_level_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h index 652a7e1eb7..f495e8b35e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_machine_para(); -extern void lv_clear_machine_para(); +void lv_draw_machine_para(); +void lv_clear_machine_para(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h index dd988ede72..f113f65fc1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_machine_settings(); -extern void lv_clear_machine_settings(); +void lv_draw_machine_settings(); +void lv_clear_machine_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h index 4e9b8275ba..29c8fa144e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_manualLevel(); -extern void lv_clear_manualLevel(); +void lv_draw_manualLevel(); +void lv_clear_manualLevel(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h index f82ffd0eaa..45c3fd29db 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_max_feedrate_settings(); -extern void lv_clear_max_feedrate_settings(); +void lv_draw_max_feedrate_settings(); +void lv_clear_max_feedrate_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h index 2a68d3da99..74ac7e994d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_more(); -extern void lv_clear_more(); +void lv_draw_more(); +void lv_clear_more(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h index 632f7bd24d..5d26a402d0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_motor_settings(); -extern void lv_clear_motor_settings(); +void lv_draw_motor_settings(); +void lv_clear_motor_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h index a9b75c1d13..133a0444c1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h @@ -25,9 +25,9 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_move_motor(); -extern void lv_clear_move_motor(); -extern void disp_move_dist(); +void lv_draw_move_motor(); +void lv_clear_move_motor(); +void disp_move_dist(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h index dbf9015452..fcff280d3b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_number_key(); -extern void lv_clear_number_key(); +void lv_draw_number_key(); +void lv_clear_number_key(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h index e034f7070b..d58b3307b8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_operation(); -extern void lv_clear_operation(); +void lv_draw_operation(); +void lv_clear_operation(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h index 88222f0e1a..c3df8118a4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_pause_message(const PauseMessage msg); +void lv_draw_pause_message(const PauseMessage msg); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h index e7c92a7396..fd5459c647 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_pause_position(); -extern void lv_clear_pause_position(); +void lv_draw_pause_position(); +void lv_clear_pause_position(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h index da3ce88384..2993a95f00 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h @@ -25,11 +25,11 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_preHeat(); -extern void lv_clear_preHeat(); -extern void disp_temp_type(); -extern void disp_step_heat(); -extern void disp_desire_temp(); +void lv_draw_preHeat(); +void lv_clear_preHeat(); +void disp_temp_type(); +void disp_step_heat(); +void disp_desire_temp(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h index 759ccdc1c0..85eadc0a6b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -49,15 +49,15 @@ typedef struct { } LIST_FILE; extern LIST_FILE list_file; -extern void disp_gcode_icon(uint8_t file_num); -extern void lv_draw_print_file(); -extern uint32_t lv_open_gcode_file(char *path); -extern void lv_gcode_file_read(uint8_t *data_buf); -extern void lv_close_gcode_file(); -extern void cutFileName(char *path, int len, int bytePerLine, char *outStr); -extern int ascii2dec_test(char *ascii); -extern void lv_clear_print_file(); -extern void lv_gcode_file_seek(uint32_t pos); +void disp_gcode_icon(uint8_t file_num); +void lv_draw_print_file(); +uint32_t lv_open_gcode_file(char *path); +void lv_gcode_file_read(uint8_t *data_buf); +void lv_close_gcode_file(); +void cutFileName(char *path, int len, int bytePerLine, char *outStr); +int ascii2dec_test(char *ascii); +void lv_clear_print_file(); +void lv_gcode_file_seek(uint32_t pos); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h index 7c98fd767b..b2a02a62da 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h @@ -36,17 +36,17 @@ enum { STOP }; -extern void lv_draw_printing(); -extern void lv_clear_printing(); -extern void disp_ext_temp(); -extern void disp_bed_temp(); -extern void disp_fan_speed(); -extern void disp_print_time(); -extern void disp_fan_Zpos(); -extern void reset_print_time(); -extern void start_print_time(); -extern void stop_print_time(); -extern void setProBarRate(); +void lv_draw_printing(); +void lv_clear_printing(); +void disp_ext_temp(); +void disp_bed_temp(); +void disp_fan_speed(); +void disp_print_time(); +void disp_fan_Zpos(); +void reset_print_time(); +void start_print_time(); +void stop_print_time(); +void setProBarRate(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index 56077e5dec..873be528ed 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -25,14 +25,14 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_ready_print(); -extern void mks_disp_test(); -extern void disp_Limit_ok(); -extern void disp_Limit_error(); -extern void disp_det_error(); -extern void disp_det_ok(); -extern void lv_clear_ready_print(); -extern void lv_temp_refr(); +void lv_draw_ready_print(); +void mks_disp_test(); +void disp_Limit_ok(); +void disp_Limit_error(); +void disp_det_error(); +void disp_det_ok(); +void lv_clear_ready_print(); +void lv_temp_refr(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h index 8ad8b9f2ea..a270308e07 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_set(); -extern void lv_clear_set(); +void lv_draw_set(); +void lv_clear_set(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h index 249e5a7942..4f32f0a6c2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_step_settings(); -extern void lv_clear_step_settings(); +void lv_draw_step_settings(); +void lv_clear_step_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h index 92a2fb12b5..99589a3a17 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tmc_current_settings(); -extern void lv_clear_tmc_current_settings(); +void lv_draw_tmc_current_settings(); +void lv_clear_tmc_current_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h index a15baf21e8..aa42d9b87d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tmc_step_mode_settings(); -extern void lv_clear_tmc_step_mode_settings(); +void lv_draw_tmc_step_mode_settings(); +void lv_clear_tmc_step_mode_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h index 1cfd297aba..0dc86b7030 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tool(); -extern void lv_clear_tool(); +void lv_draw_tool(); +void lv_clear_tool(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h index 63749a2b3c..567256a792 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h @@ -25,9 +25,9 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_touch_calibration_screen(); -extern void lv_clear_touch_calibration_screen(); -extern void lv_update_touch_calibration_screen(); +void lv_draw_touch_calibration_screen(); +void lv_clear_touch_calibration_screen(); +void lv_update_touch_calibration_screen(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h index 3ebb8ae731..863ff6fc7e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tramming_pos_settings(); -extern void lv_clear_tramming_pos_settings(); +void lv_draw_tramming_pos_settings(); +void lv_clear_tramming_pos_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index e65ba788f5..68baea30c7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -72,7 +72,7 @@ extern bool once_flag; extern uint8_t sel_id; extern lv_group_t *g; -extern void LCD_IO_WriteData(uint16_t RegValue); +void LCD_IO_WriteData(uint16_t RegValue); static const char custom_gcode_command[][100] = { "G29N\nM500", diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index f4a6d71ea0..2be4f7d70b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -442,28 +442,28 @@ extern lv_style_t style_btn_rel; extern lv_point_t line_points[4][2]; -extern void gCfgItems_init(); -extern void ui_cfg_init(); -extern void tft_style_init(); +void gCfgItems_init(); +void ui_cfg_init(); +void tft_style_init(); extern char *creat_title_text(); -extern void preview_gcode_prehandle(char *path); -extern void update_spi_flash(); -extern void update_gcode_command(int addr,uint8_t *s); -extern void get_gcode_command(int addr,uint8_t *d); -extern void lv_serial_capt_hook(void *, uint8_t); -extern void lv_eom_hook(void *); +void preview_gcode_prehandle(char *path); +void update_spi_flash(); +void update_gcode_command(int addr,uint8_t *s); +void get_gcode_command(int addr,uint8_t *d); +void lv_serial_capt_hook(void *, uint8_t); +void lv_eom_hook(void *); #if HAS_GCODE_PREVIEW - extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel); + void disp_pre_gcode(int xpos_pixel, int ypos_pixel); #endif -extern void GUI_RefreshPage(); -extern void clear_cur_ui(); -extern void draw_return_ui(); -extern void sd_detection(); -extern void gCfg_to_spiFlah(); -extern void print_time_count(); +void GUI_RefreshPage(); +void clear_cur_ui(); +void draw_return_ui(); +void sd_detection(); +void gCfg_to_spiFlah(); +void print_time_count(); -extern void LV_TASK_HANDLER(); -extern void lv_ex_line(lv_obj_t *line, lv_point_t *points); +void LV_TASK_HANDLER(); +void lv_ex_line(lv_obj_t *line, lv_point_t *points); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h index 77ba5925a3..4fa642b39c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h @@ -26,9 +26,9 @@ #endif -extern void lv_draw_wifi(); -extern void lv_clear_wifi(); -extern void disp_wifi_state(); +void lv_draw_wifi(); +void lv_clear_wifi(); +void disp_wifi_state(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h index e42b738f14..e2005d5cbc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h @@ -25,11 +25,11 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_wifi_list(); -extern void lv_clear_wifi_list(); -extern void disp_wifi_list(); -extern void cutWifiName(char *name, int len,char *outStr); -extern void wifi_scan_handle(); +void lv_draw_wifi_list(); +void lv_clear_wifi_list(); +void disp_wifi_list(); +void cutWifiName(char *name, int len,char *outStr); +void wifi_scan_handle(); #define NUMBER_OF_PAGE 5 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h index 605423b131..ff27397049 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h @@ -28,8 +28,8 @@ #define WIFI_AP_TEXT "AP" #define WIFI_STA_TEXT "STA" -extern void lv_draw_wifi_settings(); -extern void lv_clear_wifi_settings(); +void lv_draw_wifi_settings(); +void lv_clear_wifi_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h index 2f9c9f5745..4ffe6c1312 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h @@ -26,8 +26,8 @@ #endif -extern void lv_draw_wifi_tips(); -extern void lv_clear_wifi_tips(); +void lv_draw_wifi_tips(); +void lv_clear_wifi_tips(); typedef enum { TIPS_TYPE_JOINING, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 19c93468e4..e9960fc73a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -154,14 +154,14 @@ typedef struct pic_msg PIC_MSG; #define PIC_SIZE_xM 6 #define FONT_SIZE_xM 2 -extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff); -extern void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize); -extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); -extern uint32_t lv_get_pic_addr(uint8_t *Pname); -extern void get_spi_flash_data(const char *rec_buf, int offset, int size); -extern void spi_flash_read_test(); -extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); -extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); +void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff); +void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize); +void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); +uint32_t lv_get_pic_addr(uint8_t *Pname); +void get_spi_flash_data(const char *rec_buf, int offset, int size); +void spi_flash_read_test(); +void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); +void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h index f304158824..499799c6c7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h @@ -27,9 +27,9 @@ #define MIN_FILE_PRINTED 100 //5000 -extern void printer_state_polling(); -extern void filament_pin_setup(); -extern void filament_check(); +void printer_state_polling(); +void filament_pin_setup(); +void filament_check(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index b7441f71f4..f54b290c13 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -64,13 +64,13 @@ XPT2046 touch; #endif #if HAS_SPI_FLASH_FONT - extern void init_gb2312_font(); + void init_gb2312_font(); #endif static lv_disp_buf_t disp_buf; lv_group_t* g; #if ENABLED(SDSUPPORT) - extern void UpdateAssets(); + void UpdateAssets(); #endif uint16_t DeviceCode = 0x9488; extern uint8_t sel_id; @@ -190,9 +190,7 @@ void tft_lvgl_init() { #endif tft_style_init(); - filament_pin_setup(); - lv_encoder_pin_init(); TERN_(MKS_WIFI_MODULE, mks_wifi_firmware_update()); @@ -211,7 +209,7 @@ void tft_lvgl_init() { strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); card.printLongPath(public_buf_m); - strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id])); + strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[0])); lv_draw_printing(); } #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index d0ea4e376f..308162b799 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -37,32 +37,32 @@ extern uint8_t bmp_public_buf[14 * 1024]; extern uint8_t public_buf[513]; -extern void tft_lvgl_init(); -extern void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); -extern bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); -extern bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); +void tft_lvgl_init(); +void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); +bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); +bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); -extern void LCD_Clear(uint16_t Color); -extern void tft_set_point(uint16_t x, uint16_t y, uint16_t point); -extern void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); -extern void LCD_WriteRAM_Prepare(); -extern void lcd_draw_logo(); -extern void lv_encoder_pin_init(); -extern void lv_update_encoder(); +void LCD_Clear(uint16_t Color); +void tft_set_point(uint16_t x, uint16_t y, uint16_t point); +void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); +void LCD_WriteRAM_Prepare(); +void lcd_draw_logo(); +void lv_encoder_pin_init(); +void lv_update_encoder(); -extern lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); -extern lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p); -extern lv_fs_res_t spi_flash_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -extern lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); -extern lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +lv_fs_res_t spi_flash_open_cb(lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); +lv_fs_res_t spi_flash_close_cb(lv_fs_drv_t * drv, void * file_p); +lv_fs_res_t spi_flash_read_cb(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); +lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -extern lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); -extern lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p); -extern lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -extern lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); -extern lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +lv_fs_res_t sd_open_cb(lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); +lv_fs_res_t sd_close_cb(lv_fs_drv_t * drv, void * file_p); +lv_fs_res_t sd_read_cb(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); +lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -extern void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv_color_t bk_color); +void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv_color_t bk_color); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 61c46a648f..61e3524c58 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -29,7 +29,7 @@ #include "tft_Language_sp.h" #include "tft_Language_it.h" -extern void disp_language_init(); +void disp_language_init(); #define LANG_SIMPLE_CHINESE 1 #define LANG_COMPLEX_CHINESE 2 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h index 07ae6f72db..048996e919 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -181,16 +181,16 @@ extern WIFI_GCODE_BUFFER espGcodeFifo; extern uint32_t getWifiTick(); extern uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); -extern void mks_esp_wifi_init(); +void mks_esp_wifi_init(); extern int cfg_cloud_flag; extern int send_to_wifi(uint8_t *buf, int len); -extern void wifi_looping(); +void wifi_looping(); extern int raw_send_to_wifi(uint8_t *buf, int len); extern int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len); -extern void get_wifi_list_command_send(); -extern void get_wifi_commands(); +void get_wifi_list_command_send(); +void get_wifi_commands(); extern int readWifiBuf(int8_t *buf, int32_t len); -extern void mks_wifi_firmware_update(); +void mks_wifi_firmware_update(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 378de6d584..e41d473c11 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -39,9 +39,9 @@ extern SZ_USART_FIFO WifiRxFifo; extern int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len); extern int writeUsartFifo(SZ_USART_FIFO * fifo, int8_t * buf, int32_t len); -extern void esp_port_begin(uint8_t interrupt); +void esp_port_begin(uint8_t interrupt); extern int usartFifoAvailable(SZ_USART_FIFO *fifo); -extern void wifi_delay(int n); +void wifi_delay(int n); #define ARRAY_SIZE(a) sizeof(a) / sizeof((a)[0]) diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h index 29bd3b8798..3b5a5e7e2c 100644 --- a/Marlin/src/module/servo.h +++ b/Marlin/src/module/servo.h @@ -112,4 +112,4 @@ #define MOVE_SERVO(I, P) servo[I].move(P) extern HAL_SERVO_LIB servo[NUM_SERVOS]; -extern void servo_init(); +void servo_init(); diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index a97b09fd89..b79ec676a0 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -42,7 +42,7 @@ extern toolchange_settings_t toolchange_settings; #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - extern void tool_change_prime(); + void tool_change_prime(); #endif #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) From 7297cc13b0db1344ffc1fc6716c89da09d0238e3 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Fri, 2 Apr 2021 20:06:43 -0400 Subject: [PATCH 1242/1370] GT2560 V3 followup (#21512) --- Marlin/src/pins/mega/pins_GT2560_V3.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 8490d5571d..46b4ebf428 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -83,6 +83,9 @@ #ifndef FIL_RUNOUT2_PIN #define FIL_RUNOUT2_PIN 67 #endif +#ifndef FIL_RUNOUT3_PIN + #define FIL_RUNOUT3_PIN 54 +#endif // // Power Recovery From a8f8201c90db4bdb01175e2cbd41c27f9309ed86 Mon Sep 17 00:00:00 2001 From: XDA-Bam <1209896+XDA-Bam@users.noreply.github.com> Date: Sat, 3 Apr 2021 02:11:22 +0200 Subject: [PATCH 1243/1370] Update u8g / AVR display timing defaults (#21518) --- Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index 1e19bf85e5..24baae221e 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -34,9 +34,9 @@ #include "ultralcd_st7920_u8glib_rrd_AVR.h" #if F_CPU >= 20000000 - #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_1 DELAY_NS(150) #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(50) + #define CPU_ST7920_DELAY_3 DELAY_NS(150) #elif MB(3DRAG, K8200, K8400) #define CPU_ST7920_DELAY_1 DELAY_NS(0) #define CPU_ST7920_DELAY_2 DELAY_NS(188) @@ -58,9 +58,9 @@ #define CPU_ST7920_DELAY_2 DELAY_NS(40) #define CPU_ST7920_DELAY_3 DELAY_NS(340) #elif F_CPU == 16000000 - #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_1 DELAY_NS(125) #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(63) + #define CPU_ST7920_DELAY_3 DELAY_NS(125) #else #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd_AVR.h'" #endif From 05d7d3787260a3f019b93f512b09edd356fb5869 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 18 Mar 2021 22:49:04 -0500 Subject: [PATCH 1244/1370] Suppress redundant serial errors --- Marlin/src/HAL/STM32F1/HAL.h | 36 ++++++++++++------- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 4 +-- .../extui/lib/dgus/mks/DGUSScreenHandler.h | 3 +- buildroot/tests/BIGTREE_SKR_PRO | 2 +- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 4656583590..4f430ab4d9 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -84,10 +84,13 @@ #define MYSERIAL1 UsbSerial #elif WITHIN(SERIAL_PORT, 1, NUM_UARTS) #define MYSERIAL1 MSERIAL(SERIAL_PORT) -#elif NUM_UARTS == 5 - #error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." #else - #error "SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #define MYSERIAL1 MSERIAL(1) // dummy port + #if NUM_UARTS == 5 + #error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." + #else + #error "SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #endif #endif #ifdef SERIAL_PORT_2 @@ -95,10 +98,13 @@ #define MYSERIAL2 UsbSerial #elif WITHIN(SERIAL_PORT_2, 1, NUM_UARTS) #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) - #elif NUM_UARTS == 5 - #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration." #else - #error "SERIAL_PORT_2 must be -1 or from 1 to 3. Please update your configuration." + #define MYSERIAL2 MSERIAL(1) // dummy port + #if NUM_UARTS == 5 + #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration." + #else + #error "SERIAL_PORT_2 must be -1 or from 1 to 3. Please update your configuration." + #endif #endif #endif @@ -107,10 +113,13 @@ #define MMU2_SERIAL UsbSerial #elif WITHIN(MMU2_SERIAL_PORT, 1, NUM_UARTS) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) - #elif NUM_UARTS == 5 - #error "MMU2_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." #else - #error "MMU2_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #define MMU2_SERIAL MSERIAL(1) // dummy port + #if NUM_UARTS == 5 + #error "MMU2_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." + #else + #error "MMU2_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #endif #endif #endif @@ -119,10 +128,13 @@ #define LCD_SERIAL UsbSerial #elif WITHIN(LCD_SERIAL_PORT, 1, NUM_UARTS) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) - #elif NUM_UARTS == 5 - #error "LCD_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." #else - #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #define LCD_SERIAL MSERIAL(1) // dummy port + #if NUM_UARTS == 5 + #error "LCD_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." + #else + #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #endif #endif #if HAS_DGUS_LCD #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 786d1821a6..355565ae5a 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -733,7 +733,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // SDCard File listing - + #if ENABLED(SDSUPPORT) VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), @@ -760,7 +760,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_OFFSET_Y, &probe.offset.y, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), VPHELPER(VP_OFFSET_Z, &probe.offset.z, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), #endif - #else + #else VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.PrintReturn, nullptr), #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index 07c123d928..382197c7d6 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -158,7 +158,6 @@ public: static void GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr); #endif - #if ENABLED(SDSUPPORT) // Callback for VP "Display wants to change screen when there is a SD card" static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); @@ -184,7 +183,7 @@ public: static void SDCardError(); // Marlin informed us about SD print completion. static void SDPrintingFinished(); - #else + #else static void PrintReturn(DGUS_VP_Variable &var, void *val_ptr); #endif diff --git a/buildroot/tests/BIGTREE_SKR_PRO b/buildroot/tests/BIGTREE_SKR_PRO index 025d8cbce8..2503b28544 100755 --- a/buildroot/tests/BIGTREE_SKR_PRO +++ b/buildroot/tests/BIGTREE_SKR_PRO @@ -26,7 +26,7 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ CUTTER_POWER_UNIT PERCENT \ SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN \ TEMP_SENSOR_COOLER 1000 TEMP_COOLER_PIN PD13 -opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER +opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER exec_test $1 $2 "BigTreeTech SKR Pro | Laser (Percent) | Cooling | LCD" "$3" # clean up From 84445b82e4d9acd8055a75fbc7cbde1e32aed6ac Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sun, 4 Apr 2021 23:45:56 +0200 Subject: [PATCH 1245/1370] Update Italian language (#21537) --- Marlin/src/lcd/language/language_it.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index be54d5035d..d359354932 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -114,10 +114,10 @@ namespace Language_it { PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Alterna Laser"); PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("ms impulso di test"); PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Spara impulso"); + PROGMEM Language_Str MSG_FLOWMETER_FAULT = _UxGT("Err.flusso refrig."); PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Alterna mandrino"); PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Mandrino in avanti"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Accendi aliment."); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment."); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Estrudi"); @@ -276,6 +276,10 @@ namespace Language_it { PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Ugello in pausa"); PROGMEM Language_Str MSG_BED = _UxGT("Piatto"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Camera"); + PROGMEM Language_Str MSG_COOLER = _UxGT("Raffreddam. laser"); + PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Alterna raffreddam."); + PROGMEM Language_Str MSG_FLOWMETER_SAFETY = _UxGT("Sicurezza flusso"); + PROGMEM Language_Str MSG_LASER = _UxGT("Laser"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. ventola"); // Max 15 characters PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. ventola ~"); // Max 15 characters PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ventola mem. ~"); // Max 15 characters @@ -472,6 +476,8 @@ namespace Language_it { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEMP FUORI CONTROLLO"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEMP PIAT.FUORI CTRL"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("T.CAMERA FUORI CTRL"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_COOLER = _UxGT("RAFFREDAM.FUORI CTRL"); + PROGMEM Language_Str MSG_COOLING_FAILED = _UxGT("Raffreddam. fallito"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MASSIMA"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA"); PROGMEM Language_Str MSG_HALTED = _UxGT("STAMPANTE FERMATA"); @@ -487,6 +493,7 @@ namespace Language_it { PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Raffr. sonda..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Risc. camera..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Raffr. camera..."); + PROGMEM Language_Str MSG_LASER_COOLING = _UxGT("Raffr. laser..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibraz. Delta"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); @@ -506,6 +513,7 @@ namespace Language_it { PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Livel. Bilineare"); PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Livel.piatto unific."); PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Livel. Mesh"); + PROGMEM Language_Str MSG_MESH_DONE = _UxGT("Sond.mesh eseguito"); PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistiche"); PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. scheda"); PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori"); From cdd2450a9745f7fa065f0125b4c80b32b07ca66c Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sun, 4 Apr 2021 17:55:34 -0400 Subject: [PATCH 1246/1370] Fix Hotend-abort-on-idle Check (#21535) --- Marlin/src/feature/hotend_idle.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp index 7f8f20a047..911cd20e6c 100644 --- a/Marlin/src/feature/hotend_idle.cpp +++ b/Marlin/src/feature/hotend_idle.cpp @@ -34,6 +34,7 @@ #include "../module/temperature.h" #include "../module/motion.h" +#include "../module/planner.h" #include "../lcd/marlinui.h" extern HotendIdleProtection hotend_idle; @@ -43,7 +44,8 @@ millis_t HotendIdleProtection::next_protect_ms = 0; void HotendIdleProtection::check_hotends(const millis_t &ms) { bool do_prot = false; HOTEND_LOOP() { - if (thermalManager.degHotend(e) >= HOTEND_IDLE_MIN_TRIGGER) { + const bool busy = (TERN0(HAS_RESUME_CONTINUE, wait_for_user) || planner.has_blocks_queued()); + if (thermalManager.degHotend(e) >= HOTEND_IDLE_MIN_TRIGGER && !busy) { do_prot = true; break; } } From c4379db8fc6db46e79b3e5d518b5fb05383a7ae0 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sun, 4 Apr 2021 18:35:58 -0400 Subject: [PATCH 1247/1370] Revert "Optimized string-to-number functions" (#21532) This reverts #21484 --- Marlin/src/gcode/parser.cpp | 140 ------------------ Marlin/src/gcode/parser.h | 29 +++- Marlin/src/gcode/queue.cpp | 8 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 2 +- 4 files changed, 26 insertions(+), 153 deletions(-) diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 6eb56126e1..ebe9d3b2cd 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -28,146 +28,6 @@ #include "../MarlinCore.h" -#ifdef __AVR__ - - static FORCE_INLINE uint32_t mult10(uint32_t val) { - uint32_t tmp = val; - __asm__ __volatile__ ( - "add %A[tmp], %A[tmp]\n" - "adc %B[tmp], %B[tmp]\n" - "adc %C[tmp], %C[tmp]\n" - "adc %D[tmp], %D[tmp]\n" - "add %A[tmp], %A[tmp]\n" - "adc %B[tmp], %B[tmp]\n" - "adc %C[tmp], %C[tmp]\n" - "adc %D[tmp], %D[tmp]\n" - "add %A[val], %A[tmp]\n" - "adc %B[val], %B[tmp]\n" - "adc %C[val], %C[tmp]\n" - "adc %D[val], %D[tmp]\n" - "add %A[val], %A[val]\n" - "adc %B[val], %B[val]\n" - "adc %C[val], %C[val]\n" - "adc %D[val], %D[val]\n" - : [val] "+&r" (val), - [tmp] "+&r" (tmp) - ); - return val; - } - -#else - - static FORCE_INLINE uint32_t mult10(uint32_t val) { return val * 10; } - -#endif - -// cheap base-10 strto(u)l. -// does not check for errors. -int32_t parse_int32(const char *buf) { - char c; - - // Get a char, skipping leading spaces - do { c = *buf++; } while (c == ' '); - - // check for sign - bool is_negative = (c == '-'); - if (is_negative || c == '+') - c = *buf++; - - // optimization for first digit (no multiplication) - uint8_t uc = c - '0'; - if (uc > 9) return 0; - - // read unsigned value - uint32_t uval = uc; - while (true) { - c = *buf++; - uc = c - '0'; - if (uc > 9) break; - uval = mult10(uval) + uc; - } - - return is_negative ? -uval : uval; -} - -// cheap strtof. -// does not support nan/infinity or exponent notation. -// does not check for errors. -float parse_float(const char *buf) { - char c; - - // Get a char, skipping leading spaces - do { c = *buf++; } while (c == ' '); - - // check for sign - bool is_negative = (c == '-'); - if (is_negative || c == '+') - c = *buf++; - - // read unsigned value and decimal point - uint32_t uval; - uint8_t exp_dec; - uint8_t uc = c - '0'; - if (uc <= 9) { - uval = uc; - exp_dec = 0; - } - else { - if (c != '.') return 0; - uval = 0; - exp_dec = 1; - } - - int8_t exp = 0; - while (true) { - c = *buf++; - uc = c - '0'; - if (uc <= 9) { - exp -= exp_dec; - uval = mult10(uval) + uc; - if (uval >= (UINT32_MAX - 9) / 10) { - // overflow. keep reading digits until decimal point. - while (exp_dec == 0) { - c = *buf++; - uc = c - '0'; - if (uc > 9) break; - exp++; - } - goto overflow; - } - } - else { - if (c != '.' || exp_dec != 0) break; - exp_dec = 1; - } - } - - // early return for 0 - if (uval == 0) return 0; - - overflow: - - // convert to float and apply sign - float fval = uval; - if (is_negative) fval *= -1; - - // apply exponent (up to 1e-15 / 1e+15) - if (exp < 0) { - if (exp <= -8) { fval *= 1e-8; exp += 8; } - if (exp <= -4) { fval *= 1e-4; exp += 4; } - if (exp <= -2) { fval *= 1e-2; exp += 2; } - if (exp <= -1) { fval *= 1e-1; exp += 1; } - } - else if (exp > 0) { - if (exp >= 8) { fval *= 1e+8; exp -= 8; } - if (exp >= 4) { fval *= 1e+4; exp -= 4; } - if (exp >= 2) { fval *= 1e+2; exp -= 2; } - if (exp >= 1) { fval *= 1e+1; exp -= 1; } - } - - return fval; -} - // Must be declared for allocation and to satisfy the linker // Zero values need no initialization. diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index a0fc67b9e5..8523630098 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -42,10 +42,6 @@ typedef enum : uint8_t { LINEARUNIT_MM, LINEARUNIT_INCH } LinearUnit; #endif - -int32_t parse_int32(const char *buf); -float parse_float(const char *buf); - /** * GCode parser * @@ -260,12 +256,29 @@ public: // The value as a string static inline char* value_string() { return value_ptr; } - // Code value as float - static inline float value_float() { return value_ptr ? parse_float(value_ptr) : 0.0; } + // Float removes 'E' to prevent scientific notation interpretation + static inline float value_float() { + if (value_ptr) { + char *e = value_ptr; + for (;;) { + const char c = *e; + if (c == '\0' || c == ' ') break; + if (c == 'E' || c == 'e') { + *e = '\0'; + const float ret = strtof(value_ptr, nullptr); + *e = c; + return ret; + } + ++e; + } + return strtof(value_ptr, nullptr); + } + return 0; + } // Code value as a long or ulong - static inline int32_t value_long() { return value_ptr ? parse_int32(value_ptr) : 0L; } - static inline uint32_t value_ulong() { return value_ptr ? parse_int32(value_ptr) : 0UL; } + static inline int32_t value_long() { return value_ptr ? strtol(value_ptr, nullptr, 10) : 0L; } + static inline uint32_t value_ulong() { return value_ptr ? strtoul(value_ptr, nullptr, 10) : 0UL; } // Code value for use as time static inline millis_t value_millis() { return value_ulong(); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index eb7ad79102..a79909917e 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -445,7 +445,7 @@ void GCodeQueue::get_serial_commands() { if (process_line_done(serial.input_state, serial.line_buffer, serial.count)) continue; - char *command = serial.line_buffer; + char* command = serial.line_buffer; while (*command == ' ') command++; // Skip leading spaces char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line @@ -459,7 +459,7 @@ void GCodeQueue::get_serial_commands() { if (n2pos) npos = n2pos; } - const long gcode_N = parse_int32(npos + 1); + const long gcode_N = strtol(npos + 1, nullptr, 10); if (gcode_N != serial.last_N + 1 && !M110) { // In case of error on a serial port, don't prevent other serial port from making progress @@ -471,7 +471,7 @@ void GCodeQueue::get_serial_commands() { if (apos) { uint8_t checksum = 0, count = uint8_t(apos - command); while (count) checksum ^= command[--count]; - if (parse_int32(apos + 1) != checksum) { + if (strtol(apos + 1, nullptr, 10) != checksum) { // In case of error on a serial port, don't prevent other serial port from making progress gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), p); break; @@ -500,7 +500,7 @@ void GCodeQueue::get_serial_commands() { if (IsStopped()) { char* gpos = strchr(command, 'G'); if (gpos) { - switch (parse_int32(gpos + 1)) { + switch (strtol(gpos + 1, nullptr, 10)) { case 0: case 1: #if ENABLED(ARC_SUPPORT) case 2: case 3: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index ac07dc0102..a74ecd2f1e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1799,7 +1799,7 @@ void get_wifi_commands() { if (IsStopped()) { char* gpos = strchr(command, 'G'); if (gpos) { - switch (parse_int32(gpos + 1)) { + switch (strtol(gpos + 1, nullptr, 10)) { case 0 ... 1: #if ENABLED(ARC_SUPPORT) case 2 ... 3: From ba5644376c51be7f126c10b37c726ee22c867c6d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 4 Apr 2021 18:07:16 -0500 Subject: [PATCH 1248/1370] misc. pointer formatting --- Marlin/src/HAL/DUE/eeprom_flash.cpp | 4 +- Marlin/src/HAL/ESP32/i2s.cpp | 2 +- Marlin/src/HAL/STM32/MarlinSerial.h | 2 +- Marlin/src/HAL/STM32F1/onboard_sd.h | 2 +- Marlin/src/HAL/shared/backtrace/backtrace.cpp | 2 +- Marlin/src/HAL/shared/backtrace/unwinder.h | 2 +- Marlin/src/feature/spindle_laser.h | 2 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 4 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 4 +- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 2 +- .../extui/lib/dgus/mks/DGUSScreenHandler.h | 2 +- .../ftdi_eve_lib/basic/commands.cpp | 2 +- .../ftdi_eve_lib/basic/commands.h | 2 +- .../ftdi_eve_lib/extended/command_processor.h | 2 +- Marlin/src/sd/Sd2Card.cpp | 2 +- Marlin/src/sd/Sd2Card.h | 2 +- Marlin/src/sd/SdBaseFile.cpp | 82 ++++++++----------- Marlin/src/sd/SdBaseFile.h | 36 ++++---- Marlin/src/sd/SdFile.cpp | 2 +- Marlin/src/sd/SdFile.h | 4 +- Marlin/src/sd/SdVolume.h | 8 +- Marlin/src/sd/cardreader.cpp | 8 +- Marlin/src/sd/cardreader.h | 6 +- 23 files changed, 85 insertions(+), 99 deletions(-) diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index 14c843576c..b4cb9912b2 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -135,7 +135,7 @@ static uint8_t buffer[256] = {0}, // The RAM buffer to accumulate writes #define DEBUG_OUT ENABLED(EE_EMU_DEBUG) #include "../../core/debug_out.h" -static void ee_Dump(const int page, const void* data) { +static void ee_Dump(const int page, const void *data) { #ifdef EE_EMU_DEBUG @@ -181,7 +181,7 @@ static void ee_Dump(const int page, const void* data) { * @param data (pointer to the data buffer) */ __attribute__ ((long_call, section (".ramfunc"))) -static bool ee_PageWrite(uint16_t page, const void* data) { +static bool ee_PageWrite(uint16_t page, const void *data) { uint16_t i; uint32_t addrflash = uint32_t(getFlashStorage(page)); diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp index e8f3806543..c28c008793 100644 --- a/Marlin/src/HAL/ESP32/i2s.cpp +++ b/Marlin/src/HAL/ESP32/i2s.cpp @@ -139,7 +139,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) { I2S0.int_clr.val = I2S0.int_st.val; //clear pending interrupt } -void stepperTask(void* parameter) { +void stepperTask(void *parameter) { uint32_t remaining = 0; while (1) { diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h index d9e8457017..ab5c4260af 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -29,7 +29,7 @@ typedef void (*usart_rx_callback_t)(serial_t * obj); struct MarlinSerial : public HardwareSerial { - MarlinSerial(void* peripheral, usart_rx_callback_t rx_callback) : + MarlinSerial(void *peripheral, usart_rx_callback_t rx_callback) : HardwareSerial(peripheral), _rx_callback(rx_callback) { } diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.h b/Marlin/src/HAL/STM32F1/onboard_sd.h index 1dc7ec5b3b..1c0a1c5b84 100644 --- a/Marlin/src/HAL/STM32F1/onboard_sd.h +++ b/Marlin/src/HAL/STM32F1/onboard_sd.h @@ -48,7 +48,7 @@ DRESULT disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count); DRESULT disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); #endif #if _DISKIO_IOCTL - DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void* buff); + DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff); #endif /* Disk Status Bits (DSTATUS) */ diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index e4ae502a88..ad88de8385 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -29,7 +29,7 @@ #include // Dump a backtrace entry -static bool UnwReportOut(void* ctx, const UnwReport* bte) { +static bool UnwReportOut(void *ctx, const UnwReport *bte) { int *p = (int*)ctx; (*p)++; diff --git a/Marlin/src/HAL/shared/backtrace/unwinder.h b/Marlin/src/HAL/shared/backtrace/unwinder.h index 157808d540..8692c7a1aa 100644 --- a/Marlin/src/HAL/shared/backtrace/unwinder.h +++ b/Marlin/src/HAL/shared/backtrace/unwinder.h @@ -114,7 +114,7 @@ typedef struct { * report function maybe called again in future. If false is returned, * unwinding will stop with UnwindStart() returning UNWIND_TRUNCATED. */ -typedef bool (*UnwindReportFunc)(void* data, const UnwReport* bte); +typedef bool (*UnwindReportFunc)(void *data, const UnwReport *bte); /** Structure that holds memory callback function pointers. */ diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index bf7106fab7..88cf372a02 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -215,7 +215,7 @@ public: static inline void disable() { isReady = false; set_enabled(false); } #if HAS_LCD_MENU - static inline void enable_with_dir(const bool reverse) { + static inline void enable_with_dir(const bool reverse) { isReady = true; const uint8_t ocr = TERN(SPINDLE_LASER_PWM, upower_to_ocr(menuPower), 255); if (menuPower) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index 2c283b1a92..2f33768655 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -70,7 +70,7 @@ void DGUSDisplay::InitDisplay() { RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); } -void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { +void DGUSDisplay::WriteVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { const char* myvalues = static_cast(values); bool strend = !myvalues; WriteHeader(adr, DGUS_CMD_WRITEVAR, valueslen); @@ -120,7 +120,7 @@ void DGUSDisplay::WriteVariable(uint16_t adr, long value) { WriteVariable(adr, static_cast(&tmp), sizeof(long)); } -void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { +void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { const char* myvalues = static_cast(values); bool strend = !myvalues; WriteHeader(adr, DGUS_CMD_WRITEVAR, valueslen); diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index c017d69dae..f33935a269 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -56,8 +56,8 @@ public: static void InitDisplay(); // Variable access. - static void WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false); - static void WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false); + static void WriteVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); + static void WriteVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); static void WriteVariable(uint16_t adr, int16_t value); static void WriteVariable(uint16_t adr, uint16_t value); static void WriteVariable(uint16_t adr, uint8_t value); diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 54500011f8..109e9a8ac6 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -75,7 +75,7 @@ void DGUSScreenHandler::sendinfoscreen_en_mks(const char *line1, const char *lin dgusdisplay.WriteVariable(VP_MSGSTR4, line4, 32, true); } -void DGUSScreenHandler::sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4, uint16_t language) { +void DGUSScreenHandler::sendinfoscreen_mks(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language) { if (language == MKS_English) DGUSScreenHandler::sendinfoscreen_en_mks((char *)line1, (char *)line2, (char *)line3, (char *)line4); else if (language == MKS_SimpleChinese) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index 382197c7d6..ef67635f8d 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -44,7 +44,7 @@ public: #if 0 static void sendinfoscreen_ch_mks(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); static void sendinfoscreen_en_mks(const char *line1, const char *line2, const char *line3, const char *line4) ; - static void sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4,uint16_t language); + static void sendinfoscreen_mks(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language); #endif // "M117" Message -- msg is a RAM ptr. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index 736809323b..47ce1c700d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -229,7 +229,7 @@ void CLCD::CommandFifo::cmd(uint32_t cmd32) { write((void*)&cmd32, sizeof(uint32_t)); } -void CLCD::CommandFifo::cmd(void* data, uint16_t len) { +void CLCD::CommandFifo::cmd(void *data, uint16_t len) { write(data, len); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h index 376beaec44..eea24b06bd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h @@ -196,7 +196,7 @@ class CLCD::CommandFifo { void execute(); void cmd(uint32_t cmd32); - void cmd(void* data, uint16_t len); + void cmd(void *data, uint16_t len); void dlstart() {cmd(FTDI::CMD_DLSTART);} void swap() {cmd(FTDI::CMD_SWAP);} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h index da51ee6385..2258529221 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h @@ -149,7 +149,7 @@ class CommandProcessor : public CLCD::CommandFifo { // Wrap all the CommandFifo routines to allow method chaining inline CommandProcessor& cmd (uint32_t cmd32) {CLCD::CommandFifo::cmd(cmd32); return *this;} - inline CommandProcessor& cmd (void* data, uint16_t len) {CLCD::CommandFifo::cmd(data, len); return *this;} + inline CommandProcessor& cmd (void *data, uint16_t len) {CLCD::CommandFifo::cmd(data, len); return *this;} inline CommandProcessor& execute() {CLCD::CommandFifo::execute(); return *this;} inline CommandProcessor& fgcolor (uint32_t rgb) {CLCD::CommandFifo::fgcolor(rgb); return *this;} diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index b914b29635..28049c7e7e 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -477,7 +477,7 @@ bool Sd2Card::readData(uint8_t *dst, const uint16_t count) { } /** read CID or CSR register */ -bool Sd2Card::readRegister(const uint8_t cmd, void* buf) { +bool Sd2Card::readRegister(const uint8_t cmd, void *buf) { uint8_t *dst = reinterpret_cast(buf); if (cardCommand(cmd, 0)) { error(SD_CARD_ERROR_READ_REG); diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index d82cb10a1e..eb7f9bb2ca 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -177,7 +177,7 @@ private: uint8_t cardCommand(const uint8_t cmd, const uint32_t arg); bool readData(uint8_t *dst, const uint16_t count); - bool readRegister(const uint8_t cmd, void* buf); + bool readRegister(const uint8_t cmd, void *buf); void chipDeselect(); void chipSelect(); inline void type(const uint8_t value) { type_ = value; } diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 120668baa8..ac73a5a806 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -40,7 +40,7 @@ #include "SdBaseFile.h" #include "../MarlinCore.h" -SdBaseFile* SdBaseFile::cwd_ = 0; // Pointer to Current Working Directory +SdBaseFile *SdBaseFile::cwd_ = 0; // Pointer to Current Working Directory // callback function for date/time void (*SdBaseFile::dateTime_)(uint16_t *date, uint16_t *time) = 0; @@ -155,7 +155,7 @@ bool SdBaseFile::contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock) { * a file is already open, the file already exists, the root * directory is full or an I/O error. */ -bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char *path, uint32_t size) { +bool SdBaseFile::createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size) { if (ENABLED(SDCARD_READONLY)) return false; uint32_t count; @@ -187,12 +187,11 @@ bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char *path, uint32_ * \return true for success, false for failure. */ bool SdBaseFile::dirEntry(dir_t *dir) { - dir_t *p; // make sure fields on SD are correct if (!sync()) return false; // read entry - p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + dir_t *p = cacheDirEntry(SdVolume::CACHE_FOR_READ); if (!p) return false; // copy to caller's struct @@ -207,7 +206,7 @@ bool SdBaseFile::dirEntry(dir_t *dir) { * \param[in] dir The directory structure containing the name. * \param[out] name A 13 byte char array for the formatted name. */ -void SdBaseFile::dirName(const dir_t& dir, char *name) { +void SdBaseFile::dirName(const dir_t &dir, char *name) { uint8_t j = 0; LOOP_L_N(i, 11) { if (dir.name[i] == ' ')continue; @@ -386,7 +385,7 @@ int8_t SdBaseFile::lsPrintNext(uint8_t flags, uint8_t indent) { } // Format directory name field from a 8.3 name string -bool SdBaseFile::make83Name(const char *str, uint8_t *name, const char** ptr) { +bool SdBaseFile::make83Name(const char *str, uint8_t *name, const char **ptr) { uint8_t n = 7, // Max index until a dot is found i = 11; while (i) name[--i] = ' '; // Set whole FILENAME.EXT to spaces @@ -423,13 +422,13 @@ bool SdBaseFile::make83Name(const char *str, uint8_t *name, const char** ptr) { * Reasons for failure include this file is already open, \a parent is not a * directory, \a path is invalid or already exists in \a parent. */ -bool SdBaseFile::mkdir(SdBaseFile* parent, const char *path, bool pFlag) { +bool SdBaseFile::mkdir(SdBaseFile *parent, const char *path, bool pFlag) { if (ENABLED(SDCARD_READONLY)) return false; uint8_t dname[11]; SdBaseFile dir1, dir2; - SdBaseFile* sub = &dir1; - SdBaseFile* start = parent; + SdBaseFile *sub = &dir1; + SdBaseFile *start = parent; if (!parent || isOpen()) return false; @@ -455,13 +454,9 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const char *path, bool pFlag) { return mkdir(parent, dname); } -bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { +bool SdBaseFile::mkdir(SdBaseFile *parent, const uint8_t dname[11]) { if (ENABLED(SDCARD_READONLY)) return false; - uint32_t block; - dir_t d; - dir_t *p; - if (!parent->isDir()) return false; // create a normal file @@ -478,19 +473,20 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { if (!sync()) return false; // cache entry - should already be in cache due to sync() call - p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + dir_t *p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); if (!p) return false; // change directory entry attribute p->attributes = DIR_ATT_DIRECTORY; // make entry for '.' + dir_t d; memcpy(&d, p, sizeof(d)); d.name[0] = '.'; LOOP_S_L_N(i, 1, 11) d.name[i] = ' '; // cache block for '.' and '..' - block = vol_->clusterStartBlock(firstCluster_); + uint32_t block = vol_->clusterStartBlock(firstCluster_); if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) return false; // copy '.' to block @@ -577,7 +573,7 @@ bool SdBaseFile::open(const char *path, uint8_t oflag) { * a directory, \a path is invalid, the file does not exist * or can't be opened in the access mode specified by oflag. */ -bool SdBaseFile::open(SdBaseFile* dirFile, const char *path, uint8_t oflag) { +bool SdBaseFile::open(SdBaseFile *dirFile, const char *path, uint8_t oflag) { uint8_t dname[11]; SdBaseFile dir1, dir2; SdBaseFile *parent = dirFile, *sub = &dir1; @@ -605,7 +601,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, const char *path, uint8_t oflag) { } // open with filename in dname -bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { +bool SdBaseFile::open(SdBaseFile *dirFile, const uint8_t dname[11], uint8_t oflag) { bool emptyFound = false, fileFound = false; uint8_t index; dir_t *p; @@ -696,9 +692,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t ofla * See open() by path for definition of flags. * \return true for success or false for failure. */ -bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { - dir_t *p; - +bool SdBaseFile::open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag) { vol_ = dirFile->vol_; // error if already open @@ -711,7 +705,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { if (!dirFile->seekSet(32 * index)) return false; // read entry into cache - p = dirFile->readDirCache(); + dir_t *p = dirFile->readDirCache(); if (!p) return false; // error if empty slot or '.' or '..' @@ -784,10 +778,7 @@ bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { * See open() by path for definition of flags. * \return true for success or false for failure. */ -bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { - dir_t *p; - uint8_t index; - +bool SdBaseFile::openNext(SdBaseFile *dirFile, uint8_t oflag) { if (!dirFile) return false; // error if already open @@ -796,10 +787,10 @@ bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { vol_ = dirFile->vol_; while (1) { - index = 0xF & (dirFile->curPosition_ >> 5); + uint8_t index = 0xF & (dirFile->curPosition_ >> 5); // read entry into cache - p = dirFile->readDirCache(); + dir_t *p = dirFile->readDirCache(); if (!p) return false; // done if last entry @@ -825,9 +816,8 @@ bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { * * \return true for success, false for failure. */ -bool SdBaseFile::openParent(SdBaseFile* dir) { +bool SdBaseFile::openParent(SdBaseFile *dir) { dir_t entry; - dir_t *p; SdBaseFile file; uint32_t c; uint32_t cluster; @@ -850,7 +840,7 @@ bool SdBaseFile::openParent(SdBaseFile* dir) { // first block of parent dir if (!vol_->cacheRawBlock(lbn, SdVolume::CACHE_FOR_READ)) return false; - p = &vol_->cacheBuffer_.dir[1]; + dir_t *p = &vol_->cacheBuffer_.dir[1]; // verify name for '../..' if (p->name[0] != '.' || p->name[1] != '.') return false; // '..' is pointer to first cluster of parent. open '../..' to find parent @@ -881,7 +871,7 @@ bool SdBaseFile::openParent(SdBaseFile* dir) { * Reasons for failure include the file is already open, the FAT volume has * not been initialized or it a FAT12 volume. */ -bool SdBaseFile::openRoot(SdVolume* vol) { +bool SdBaseFile::openRoot(SdVolume *vol) { // error if file is already open if (isOpen()) return false; @@ -1008,7 +998,7 @@ int16_t SdBaseFile::read() { * read() called before a file has been opened, corrupt file system * or an I/O error occurred. */ -int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { +int16_t SdBaseFile::read(void *buf, uint16_t nbyte) { uint8_t *dst = reinterpret_cast(buf); uint16_t offset, toRead; uint32_t block; // raw device block number @@ -1136,7 +1126,7 @@ int8_t SdBaseFile::readDir(dir_t *dir, char *longFilename) { // Reset n to the start of the long name n = 0; for (uint16_t idx = 0; idx < (LONG_FILENAME_LENGTH) / 2; idx += 2) { // idx is fixed since FAT LFN always contains UTF-16LE encoding - uint16_t utf16_ch = longFilename[idx] | (longFilename[idx + 1] << 8); + const uint16_t utf16_ch = longFilename[idx] | (longFilename[idx + 1] << 8); if (0xD800 == (utf16_ch & 0xF800)) // Surrogate pair - encode as '_' longFilename[n++] = '_'; else if (0 == (utf16_ch & 0xFF80)) // Encode as 1-byte UTF-8 char @@ -1199,12 +1189,11 @@ dir_t* SdBaseFile::readDirCache() { bool SdBaseFile::remove() { if (ENABLED(SDCARD_READONLY)) return false; - dir_t *d; // free any clusters - will fail if read-only or directory if (!truncate(0)) return false; // cache directory entry - d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + dir_t *d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); if (!d) return false; // mark entry deleted @@ -1235,7 +1224,7 @@ bool SdBaseFile::remove() { * \a dirFile is not a directory, \a path is not found * or an I/O error occurred. */ -bool SdBaseFile::remove(SdBaseFile* dirFile, const char *path) { +bool SdBaseFile::remove(SdBaseFile *dirFile, const char *path) { if (ENABLED(SDCARD_READONLY)) return false; SdBaseFile file; @@ -1252,13 +1241,10 @@ bool SdBaseFile::remove(SdBaseFile* dirFile, const char *path) { * Reasons for failure include \a dirFile is not open or is not a directory * file, newPath is invalid or already exists, or an I/O error occurs. */ -bool SdBaseFile::rename(SdBaseFile* dirFile, const char *newPath) { +bool SdBaseFile::rename(SdBaseFile *dirFile, const char *newPath) { if (ENABLED(SDCARD_READONLY)) return false; - dir_t entry; uint32_t dirCluster = 0; - SdBaseFile file; - dir_t *d; // must be an open file or subdirectory if (!(isFile() || isSubDir())) return false; @@ -1268,16 +1254,18 @@ bool SdBaseFile::rename(SdBaseFile* dirFile, const char *newPath) { // sync() and cache directory entry sync(); - d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + dir_t *d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); if (!d) return false; // save directory entry + dir_t entry; memcpy(&entry, d, sizeof(entry)); // mark entry deleted d->name[0] = DIR_NAME_DELETED; // make directory entry for new path + SdBaseFile file; if (isFile()) { if (!file.open(dirFile, newPath, O_CREAT | O_EXCL | O_WRITE)) { goto restore; @@ -1536,8 +1524,7 @@ bool SdBaseFile::sync() { * * \return true for success, false for failure. */ -bool SdBaseFile::timestamp(SdBaseFile* file) { - dir_t *d; +bool SdBaseFile::timestamp(SdBaseFile *file) { dir_t dir; // get timestamps @@ -1546,7 +1533,7 @@ bool SdBaseFile::timestamp(SdBaseFile* file) { // update directory fields if (!sync()) return false; - d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + dir_t *d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); if (!d) return false; // copy timestamps @@ -1599,7 +1586,6 @@ bool SdBaseFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, if (ENABLED(SDCARD_READONLY)) return false; uint16_t dirDate, dirTime; - dir_t *d; if (!isOpen() || year < 1980 @@ -1616,7 +1602,7 @@ bool SdBaseFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, // update directory entry if (!sync()) return false; - d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + dir_t *d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); if (!d) return false; dirDate = FAT_DATE(year, month, day); @@ -1710,7 +1696,7 @@ bool SdBaseFile::truncate(uint32_t length) { * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. */ -int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { +int16_t SdBaseFile::write(const void *buf, uint16_t nbyte) { #if ENABLED(SDCARD_READONLY) writeError = true; return -1; #endif diff --git a/Marlin/src/sd/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h index 1e2bc5d09e..342edefb70 100644 --- a/Marlin/src/sd/SdBaseFile.h +++ b/Marlin/src/sd/SdBaseFile.h @@ -189,7 +189,7 @@ class SdBaseFile { bool close(); bool contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock); - bool createContiguous(SdBaseFile* dirFile, + bool createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size); /** * \return The current cluster number for a file or directory. @@ -204,7 +204,7 @@ class SdBaseFile { /** * \return Current working directory */ - static SdBaseFile* cwd() { return cwd_; } + static SdBaseFile *cwd() { return cwd_; } /** * Set the date/time callback function @@ -286,27 +286,27 @@ class SdBaseFile { bool getDosName(char * const name); void ls(uint8_t flags = 0, uint8_t indent = 0); - bool mkdir(SdBaseFile* dir, const char *path, bool pFlag = true); - bool open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag); - bool open(SdBaseFile* dirFile, const char *path, uint8_t oflag); + bool mkdir(SdBaseFile *dir, const char *path, bool pFlag = true); + bool open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag); + bool open(SdBaseFile *dirFile, const char *path, uint8_t oflag); bool open(const char *path, uint8_t oflag = O_READ); - bool openNext(SdBaseFile* dirFile, uint8_t oflag); - bool openRoot(SdVolume* vol); + bool openNext(SdBaseFile *dirFile, uint8_t oflag); + bool openRoot(SdVolume *vol); int peek(); static void printFatDate(uint16_t fatDate); static void printFatTime(uint16_t fatTime); bool printName(); int16_t read(); - int16_t read(void* buf, uint16_t nbyte); + int16_t read(void *buf, uint16_t nbyte); int8_t readDir(dir_t *dir, char *longFilename); - static bool remove(SdBaseFile* dirFile, const char *path); + static bool remove(SdBaseFile *dirFile, const char *path); bool remove(); /** * Set the file's current position to zero. */ void rewind() { seekSet(0); } - bool rename(SdBaseFile* dirFile, const char *newPath); + bool rename(SdBaseFile *dirFile, const char *newPath); bool rmdir(); bool rmRfStar(); @@ -325,7 +325,7 @@ class SdBaseFile { bool seekEnd(const int32_t offset = 0) { return seekSet(fileSize_ + offset); } bool seekSet(const uint32_t pos); bool sync(); - bool timestamp(SdBaseFile* file); + bool timestamp(SdBaseFile *file); bool timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second); @@ -341,11 +341,11 @@ class SdBaseFile { * \return SdVolume that contains this file. */ SdVolume* volume() const { return vol_; } - int16_t write(const void* buf, uint16_t nbyte); + int16_t write(const void *buf, uint16_t nbyte); private: friend class SdFat; // allow SdFat to set cwd_ - static SdBaseFile* cwd_; // global pointer to cwd dir + static SdBaseFile *cwd_; // global pointer to cwd dir // data time callback function static void (*dateTime_)(uint16_t *date, uint16_t *time); @@ -364,21 +364,21 @@ class SdBaseFile { uint8_t dirIndex_; // index of directory entry in dirBlock uint32_t fileSize_; // file size in bytes uint32_t firstCluster_; // first cluster of file - SdVolume* vol_; // volume where file is located + SdVolume *vol_; // volume where file is located /** * EXPERIMENTAL - Don't use! */ - //bool openParent(SdBaseFile* dir); + //bool openParent(SdBaseFile *dir); // private functions bool addCluster(); bool addDirCluster(); dir_t* cacheDirEntry(uint8_t action); int8_t lsPrintNext(uint8_t flags, uint8_t indent); - static bool make83Name(const char *str, uint8_t *name, const char** ptr); - bool mkdir(SdBaseFile* parent, const uint8_t dname[11]); - bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag); + static bool make83Name(const char *str, uint8_t *name, const char **ptr); + bool mkdir(SdBaseFile *parent, const uint8_t dname[11]); + bool open(SdBaseFile *dirFile, const uint8_t dname[11], uint8_t oflag); bool openCachedEntry(uint8_t cacheIndex, uint8_t oflags); dir_t* readDirCache(); }; diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp index cc86ce819f..bce96ef02d 100644 --- a/Marlin/src/sd/SdFile.cpp +++ b/Marlin/src/sd/SdFile.cpp @@ -60,7 +60,7 @@ SdFile::SdFile(const char *path, uint8_t oflag) : SdBaseFile(path, oflag) { } * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. */ -int16_t SdFile::write(const void* buf, uint16_t nbyte) { return SdBaseFile::write(buf, nbyte); } +int16_t SdFile::write(const void *buf, uint16_t nbyte) { return SdBaseFile::write(buf, nbyte); } /** * Write a byte to a file. Required by the Arduino Print class. diff --git a/Marlin/src/sd/SdFile.h b/Marlin/src/sd/SdFile.h index 69fe05b499..1691898899 100644 --- a/Marlin/src/sd/SdFile.h +++ b/Marlin/src/sd/SdFile.h @@ -46,10 +46,10 @@ class SdFile : public SdBaseFile { #if ARDUINO >= 100 size_t write(uint8_t b); #else - void write(uint8_t b); + void write(uint8_t b); #endif - int16_t write(const void* buf, uint16_t nbyte); + int16_t write(const void *buf, uint16_t nbyte); void write(const char *str); void write_P(PGM_P str); void writeln_P(PGM_P str); diff --git a/Marlin/src/sd/SdVolume.h b/Marlin/src/sd/SdVolume.h index 8122087451..c2eaf0bd13 100644 --- a/Marlin/src/sd/SdVolume.h +++ b/Marlin/src/sd/SdVolume.h @@ -90,8 +90,8 @@ class SdVolume { * Reasons for failure include not finding a valid partition, not finding * a valid FAT file system or an I/O error. */ - bool init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0); } - bool init(Sd2Card* dev, uint8_t part); + bool init(Sd2Card *dev) { return init(dev, 1) ? true : init(dev, 0); } + bool init(Sd2Card *dev, uint8_t part); // inline functions that return volume info uint8_t blocksPerCluster() const { return blocksPerCluster_; } //> \return The volume's cluster size in blocks. @@ -138,13 +138,13 @@ class SdVolume { #if USE_MULTIPLE_CARDS cache_t cacheBuffer_; // 512 byte cache for device blocks uint32_t cacheBlockNumber_; // Logical number of block in the cache - Sd2Card* sdCard_; // Sd2Card object for cache + Sd2Card *sdCard_; // Sd2Card object for cache bool cacheDirty_; // cacheFlush() will write block if true uint32_t cacheMirrorBlock_; // block number for mirror FAT #else static cache_t cacheBuffer_; // 512 byte cache for device blocks static uint32_t cacheBlockNumber_; // Logical number of block in the cache - static Sd2Card* sdCard_; // Sd2Card object for cache + static Sd2Card *sdCard_; // Sd2Card object for cache static bool cacheDirty_; // cacheFlush() will write block if true static uint32_t cacheMirrorBlock_; // block number for mirror FAT #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 53053e88dc..225f7d9a95 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -723,9 +723,9 @@ void CardReader::report_status() { } void CardReader::write_command(char * const buf) { - char* begin = buf; - char* npos = nullptr; - char* end = buf + strlen(buf) - 1; + char *begin = buf; + char *npos = nullptr; + char *end = buf + strlen(buf) - 1; file.writeError = false; if ((npos = strchr(buf, 'N'))) { @@ -845,7 +845,7 @@ uint16_t CardReader::countFilesInWorkDir() { * * A nullptr result indicates an unrecoverable error. */ -const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, const char * const path, const bool echo/*=false*/) { +const char* CardReader::diveToFile(const bool update_cwd, SdFile* &diveDir, const char * const path, const bool echo/*=false*/) { // Track both parent and subfolder static SdFile newDir1, newDir2; SdFile *sub = &newDir1, *startDir; diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 1f917f8576..9528c4ac28 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -141,7 +141,7 @@ public: static inline uint8_t percentDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 99) / 100) : 0; } // Helper for open and remove - static const char* diveToFile(const bool update_cwd, SdFile*& curDir, const char * const path, const bool echo=false); + static const char* diveToFile(const bool update_cwd, SdFile* &curDir, const char * const path, const bool echo=false); #if ENABLED(SDCARD_SORT_ALPHA) static void presort(); @@ -168,8 +168,8 @@ public: static inline void setIndex(const uint32_t index) { file.seekSet((sdpos = index)); } static inline char* getWorkDirName() { workDir.getDosName(filename); return filename; } static inline int16_t get() { int16_t out = (int16_t)file.read(); sdpos = file.curPosition(); return out; } - static inline int16_t read(void* buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } - static inline int16_t write(void* buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } + static inline int16_t read(void *buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } + static inline int16_t write(void *buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } static Sd2Card& getSd2Card() { return sd2card; } From 0b5c25aa7ca6159e3773117d07aa065e1bff61b1 Mon Sep 17 00:00:00 2001 From: vyacheslav-shubin Date: Mon, 5 Apr 2021 02:52:16 +0300 Subject: [PATCH 1249/1370] Fix FAT delete of items with long name (#21528) --- Marlin/src/sd/SdBaseFile.cpp | 87 ++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 28 deletions(-) diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index ac73a5a806..b357495a3e 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -1049,6 +1049,20 @@ int16_t SdBaseFile::read(void *buf, uint16_t nbyte) { return nbyte; } +/** + * Calculate a checksum for an 8.3 filename + * + * \param name The 8.3 file name to calculate + * + * \return The checksum byte + */ +uint8_t lfn_checksum(const uint8_t *name) { + uint8_t sum = 0; + for (uint8_t i = 11; i; i--) + sum = ((sum & 1) << 7) + (sum >> 1) + *name++; + return sum; +} + /** * Read the next entry in a directory. * @@ -1065,51 +1079,68 @@ int8_t SdBaseFile::readDir(dir_t *dir, char *longFilename) { // if not a directory file or miss-positioned return an error if (!isDir() || (0x1F & curPosition_)) return -1; + #define INVALIDATE_LONGNAME() (longFilename[0] = longFilename[1] = '\0') + // If we have a longFilename buffer, mark it as invalid. // If a long filename is found it will be filled automatically. - if (longFilename) { longFilename[0] = '\0'; longFilename[1] = '\0'; } + if (longFilename) INVALIDATE_LONGNAME(); + + uint8_t checksum_error = 0xFF, checksum = 0; while (1) { n = read(dir, sizeof(dir_t)); if (n != sizeof(dir_t)) return n ? -1 : 0; - // last entry if DIR_NAME_FREE + // Last entry if DIR_NAME_FREE if (dir->name[0] == DIR_NAME_FREE) return 0; - // skip deleted entry and entry for . and .. + // Skip deleted entry and entry for . and .. if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') { - if (longFilename) { longFilename[0] = '\0'; longFilename[1] = '\0'; } // Invalidate erased file long name, if any + if (longFilename) INVALIDATE_LONGNAME(); // Invalidate erased file long name, if any continue; } - // Fill the long filename if we have a long filename entry. - // Long filename entries are stored before the short filename. - if (longFilename && DIR_IS_LONG_NAME(dir)) { - vfat_t *VFAT = (vfat_t*)dir; - // Sanity-check the VFAT entry. The first cluster is always set to zero. And the sequence number should be higher than 0 - if (VFAT->firstClusterLow == 0) { - const uint8_t seq = VFAT->sequenceNumber & 0x1F; - if (WITHIN(seq, 1, MAX_VFAT_ENTRIES)) { - // TODO: Store the filename checksum to verify if a long-filename-unaware system modified the file table. - n = (seq - 1) * (FILENAME_LENGTH); - LOOP_L_N(i, FILENAME_LENGTH) { - uint16_t utf16_ch = (i < 5) ? VFAT->name1[i] : (i < 11) ? VFAT->name2[i - 5] : VFAT->name3[i - 11]; - #if ENABLED(UTF_FILENAME_SUPPORT) - // We can't reconvert to UTF-8 here as UTF-8 is variable-size encoding, but joining LFN blocks - // needs static bytes addressing. So here just store full UTF-16LE words to re-convert later. - uint16_t idx = (n + i) * 2; // This is fixed as FAT LFN always contain UTF-16LE encoding - longFilename[idx] = utf16_ch & 0xFF; - longFilename[idx + 1] = (utf16_ch >> 8) & 0xFF; - #else - // Replace all multibyte characters to '_' - longFilename[n + i] = (utf16_ch > 0xFF) ? '_' : (utf16_ch & 0xFF); - #endif + if (longFilename) { + // Fill the long filename if we have a long filename entry. + // Long filename entries are stored before the short filename. + if (DIR_IS_LONG_NAME(dir)) { + vfat_t *VFAT = (vfat_t*)dir; + // Sanity-check the VFAT entry. The first cluster is always set to zero. And the sequence number should be higher than 0 + if (VFAT->firstClusterLow == 0) { + const uint8_t seq = VFAT->sequenceNumber & 0x1F; + if (WITHIN(seq, 1, MAX_VFAT_ENTRIES)) { + n = (seq - 1) * (FILENAME_LENGTH); + if (n == 0) { + checksum = VFAT->checksum; + checksum_error = 0; + } + else if (checksum != VFAT->checksum) // orphan detected + checksum_error = 1; + + LOOP_L_N(i, FILENAME_LENGTH) { + const uint16_t utf16_ch = (i >= 11) ? VFAT->name3[i - 11] : (i >= 5) ? VFAT->name2[i - 5] : VFAT->name1[i]; + #if ENABLED(UTF_FILENAME_SUPPORT) + // We can't reconvert to UTF-8 here as UTF-8 is variable-size encoding, but joining LFN blocks + // needs static bytes addressing. So here just store full UTF-16LE words to re-convert later. + uint16_t idx = (n + i) * 2; // This is fixed as FAT LFN always contain UTF-16LE encoding + longFilename[idx] = utf16_ch & 0xFF; + longFilename[idx + 1] = (utf16_ch >> 8) & 0xFF; + #else + // Replace all multibyte characters to '_' + longFilename[n + i] = (utf16_ch > 0xFF) ? '_' : (utf16_ch & 0xFF); + #endif + } + // If this VFAT entry is the last one, add a NUL terminator at the end of the string + if (VFAT->sequenceNumber & 0x40) + longFilename[(n + FILENAME_LENGTH) * LONG_FILENAME_CHARSIZE] = '\0'; } - // If this VFAT entry is the last one, add a NUL terminator at the end of the string - if (VFAT->sequenceNumber & 0x40) longFilename[(n + FILENAME_LENGTH) * LONG_FILENAME_CHARSIZE] = '\0'; } } + else { + if (!checksum_error && lfn_checksum(dir->name) != checksum) checksum_error = 1; // orphan detected + if (checksum_error) INVALIDATE_LONGNAME(); + } } // Post-process normal file or subdirectory longname, if any From c46c2c4f3c0887b89ea3966d7e3cb32c10c94c6d Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sun, 4 Apr 2021 17:58:03 -0600 Subject: [PATCH 1250/1370] Touch UI Bed Mesh Screen refactor, enhancements (#21521) - Split mesh view and edit screen into two screens - The editor now live-updates the graphics - Added Touch UI mesh progress feedback to `G26` - Show positive / negative mesh values in different colors --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 8 +- Marlin/src/gcode/bedlevel/G26.cpp | 9 + .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 4 +- ...{bed_mesh_screen.cpp => bed_mesh_base.cpp} | 243 +++--------------- .../ftdi_eve_touch_ui/screens/bed_mesh_base.h | 46 ++++ .../screens/bed_mesh_edit_screen.cpp | 186 ++++++++++++++ ...d_mesh_screen.h => bed_mesh_edit_screen.h} | 47 +--- .../screens/bed_mesh_view_screen.cpp | 172 +++++++++++++ .../screens/bed_mesh_view_screen.h | 48 ++++ .../screens/leveling_menu.cpp | 11 +- .../ftdi_eve_touch_ui/screens/screen_data.h | 3 +- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 3 +- .../lib/ftdi_eve_touch_ui/screens/screens.h | 7 +- Marlin/src/lcd/extui/ui_api.h | 12 +- 14 files changed, 535 insertions(+), 264 deletions(-) rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/{bed_mesh_screen.cpp => bed_mesh_base.cpp} (50%) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.h create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/{bed_mesh_screen.h => bed_mesh_edit_screen.h} (58%) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.h diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 9153f369bd..361f3f1285 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -730,7 +730,7 @@ void unified_bed_leveling::shift_mesh_height() { uint8_t count = GRID_MAX_POINTS; mesh_index_pair best; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::G29_START)); do { if (do_ubl_mesh_map) display_map(param.T_map_type); @@ -755,14 +755,14 @@ void unified_bed_leveling::shift_mesh_height() { : find_closest_mesh_point_of_type(INVALID, nearby, true); if (best.pos.x >= 0) { // mesh point found and is reachable by probe - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::G29_POINT_START)); const float measured_z = probe.probe_at_point( best.meshpos(), stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity ); z_values[best.pos.x][best.pos.y] = measured_z; #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_FINISH); + ExtUI::onMeshUpdate(best.pos, ExtUI::G29_POINT_FINISH); ExtUI::onMeshUpdate(best.pos, measured_z); #endif } @@ -770,7 +770,7 @@ void unified_bed_leveling::shift_mesh_height() { } while (best.pos.x >= 0 && --count); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_FINISH)); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::G29_FINISH)); // Release UI during stow to allow for PAUSE_BEFORE_DEPLOY_STOW TERN_(HAS_LCD_MENU, ui.release()); diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index f3e9a78178..657f906c14 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -113,6 +113,10 @@ #include "../../module/temperature.h" #include "../../lcd/marlinui.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + #if ENABLED(UBL_HILBERT_CURVE) #include "../../feature/bedlevel/hilbert_curve.h" #endif @@ -725,11 +729,13 @@ void GcodeSuite::G26() { #endif // !ARC_SUPPORT mesh_index_pair location; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location.pos, ExtUI::G26_START)); do { // Find the nearest confluence location = g26.find_closest_circle_to_print(g26.continue_with_closest ? xy_pos_t(current_position) : g26.xy_pos); if (location.valid()) { + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location.pos, ExtUI::G26_POINT_START)); const xy_pos_t circle = _GET_MESH_POS(location.pos); // If this mesh location is outside the printable radius, skip it. @@ -845,6 +851,8 @@ void GcodeSuite::G26() { g26.connect_neighbor_with_line(location.pos, 1, 0); g26.connect_neighbor_with_line(location.pos, 0, -1); g26.connect_neighbor_with_line(location.pos, 0, 1); + planner.synchronize(); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location.pos, ExtUI::G26_POINT_FINISH)); if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; } @@ -854,6 +862,7 @@ void GcodeSuite::G26() { LEAVE: ui.set_status_P(GET_TEXT(MSG_G26_LEAVING), -1); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, ExtUI::G26_FINISH)); g26.retract_filament(destination); destination.z = Z_CLEARANCE_BETWEEN_PROBES; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index 10c873d19c..8193ec24d4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -141,11 +141,11 @@ namespace ExtUI { void onMeshLevelingStart() {} void onMeshUpdate(const int8_t x, const int8_t y, const_float_t val) { - BedMeshScreen::onMeshUpdate(x, y, val); + BedMeshViewScreen::onMeshUpdate(x, y, val); } void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { - BedMeshScreen::onMeshUpdate(x, y, state); + BedMeshViewScreen::onMeshUpdate(x, y, state); } #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp similarity index 50% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp index cba27931f2..e83f09f045 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp @@ -1,6 +1,6 @@ -/*********************** - * bed_mesh_screen.cpp * - ***********************/ +/********************* + * bed_mesh_base.cpp * + *********************/ /**************************************************************************** * Written By Marcio Teixeira 2020 * @@ -21,43 +21,17 @@ #include "../config.h" #include "screens.h" -#include "screen_data.h" -#ifdef FTDI_BED_MESH_SCREEN +#ifdef FTDI_BED_MESH_BASE using namespace FTDI; -using namespace Theme; -using namespace ExtUI; -constexpr static BedMeshScreenData &mydata = screen_data.BedMeshScreen; -constexpr static float gaugeThickness = 0.25; - -#if ENABLED(TOUCH_UI_PORTRAIT) - #define GRID_COLS 3 - #define GRID_ROWS 10 - - #define MESH_POS BTN_POS(1, 2), BTN_SIZE(3,5) - #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(3,1) - #define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1) - #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(2,1) - #define OKAY_POS BTN_POS(1,10), BTN_SIZE(3,1) -#else - #define GRID_COLS 5 - #define GRID_ROWS 5 - - #define MESH_POS BTN_POS(1,1), BTN_SIZE(3,5) - #define MESSAGE_POS BTN_POS(4,1), BTN_SIZE(2,1) - #define Z_LABEL_POS BTN_POS(4,2), BTN_SIZE(2,1) - #define Z_VALUE_POS BTN_POS(4,3), BTN_SIZE(2,1) - #define OKAY_POS BTN_POS(4,5), BTN_SIZE(2,1) -#endif - -void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max) { +void BedMeshBase::_drawMesh(CommandProcessor &cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t opts, float autoscale_max, uint8_t highlightedTag, mesh_getter_ptr func, void *data) { constexpr uint8_t rows = GRID_MAX_POINTS_Y; constexpr uint8_t cols = GRID_MAX_POINTS_X; - #define VALUE(X,Y) (data ? data[X][Y] : 0) - #define ISVAL(X,Y) (data ? !isnan(VALUE(X,Y)) : true) + #define VALUE(X,Y) (func ? func(X,Y,data) : 0) + #define ISVAL(X,Y) (func ? !isnan(VALUE(X,Y)) : true) #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) // Compute the mean, min and max for the points @@ -67,7 +41,7 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: float val_min = INFINITY; uint8_t val_cnt = 0; - if (data && (opts & USE_AUTOSCALE)) { + if (opts & USE_AUTOSCALE) { for (uint8_t y = 0; y < rows; y++) { for (uint8_t x = 0; x < cols; x++) { if (ISVAL(x,y)) { @@ -140,7 +114,6 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: const uint16_t basePointSize = min(w,h) / max(cols,rows); - CommandProcessor cmd; cmd.cmd(SAVE_CONTEXT()) .cmd(TAG_MASK(false)) .cmd(SAVE_CONTEXT()); @@ -167,10 +140,14 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: for (uint8_t x = 0; x < cols; x++) { if (ISVAL(x,y)) { if (opts & USE_COLORS) { - const float val_dev = VALUE(x, y) - val_mean; - const uint8_t neg_byte = sq(val_dev) / (val_dev < 0 ? sq_min : sq_max) * 0xFF; - const uint8_t pos_byte = 255 - neg_byte; - cmd.cmd(COLOR_RGB(pos_byte, pos_byte, 0xFF)); + const float val_dev = sq(VALUE(x, y) - val_mean); + uint8_t r = 0, b = 0; + //*(VALUE(x, y) < 0 ? &r : &b) = val_dev / sq_min * 0xFF; + if (VALUE(x, y) < 0) + r = val_dev / sq_min * 0xFF; + else + b = val_dev / sq_max * 0xFF; + cmd.cmd(COLOR_RGB(0xFF - b, 0xFF - b - r, 0xFF - r)); } cmd.cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); } @@ -198,7 +175,7 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: } if (opts & USE_HIGHLIGHT) { - const uint8_t tag = mydata.highlightedTag; + const uint8_t tag = highlightedTag; xy_uint8_t pt; if (tagToPoint(tag, pt)) { cmd.cmd(COLOR_A(128)) @@ -211,184 +188,32 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: cmd.cmd(RESTORE_CONTEXT()); } -uint8_t BedMeshScreen::pointToTag(uint8_t x, uint8_t y) { - return y * (GRID_MAX_POINTS_X) + x + 10; +uint8_t BedMeshBase::pointToTag(uint8_t x, uint8_t y) { + return x >= 0 && x < GRID_MAX_POINTS_X && y >= 0 && y < GRID_MAX_POINTS_Y ? y * (GRID_MAX_POINTS_X) + x + 10 : 0; } -bool BedMeshScreen::tagToPoint(uint8_t tag, xy_uint8_t &pt) { +bool BedMeshBase::tagToPoint(uint8_t tag, xy_uint8_t &pt) { if (tag < 10) return false; pt.x = (tag - 10) % (GRID_MAX_POINTS_X); pt.y = (tag - 10) / (GRID_MAX_POINTS_X); return true; } -void BedMeshScreen::onEntry() { - mydata.allowEditing = true; - mydata.highlightedTag = 0; - mydata.zAdjustment = 0; - mydata.count = GRID_MAX_POINTS; - mydata.message = mydata.MSG_NONE; - BaseScreen::onEntry(); +void BedMeshBase::drawMeshBackground(CommandProcessor &cmd, int16_t x, int16_t y, int16_t w, int16_t h) { + cmd.cmd(COLOR_RGB(Theme::bed_mesh_shadow_rgb)); + _drawMesh(cmd, x, y, w, h, USE_POINTS | USE_TAGS, 0.1, 0, nullptr, nullptr); } -float BedMeshScreen::getHighlightedValue(bool nanAsZero) { - xy_uint8_t pt; - if (tagToPoint(mydata.highlightedTag, pt)) { - const float val = ExtUI::getMeshPoint(pt); - return (isnan(val) && nanAsZero) ? 0 : val; - } - return NAN; +void BedMeshBase::drawMeshForeground(CommandProcessor &cmd, int16_t x, int16_t y, int16_t w, int16_t h, mesh_getter_ptr func, void *data, uint8_t highlightedTag, float progress) { + constexpr float autoscale_max_amplitude = 0.03; + + cmd.cmd(COLOR_RGB(Theme::bed_mesh_lines_rgb)); + _drawMesh(cmd, x, y, w, h, + USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (progress > 0.95 ? USE_COLORS : 0), + autoscale_max_amplitude * progress, + highlightedTag, + func, data + ); } -void BedMeshScreen::setHighlightedValue(float value) { - xy_uint8_t pt; - if (tagToPoint(mydata.highlightedTag, pt)) - ExtUI::setMeshPoint(pt, value); -} - -void BedMeshScreen::moveToHighlightedValue() { - xy_uint8_t pt; - if (tagToPoint(mydata.highlightedTag, pt)) - ExtUI::moveToMeshPoint(pt, gaugeThickness + mydata.zAdjustment); -} - -void BedMeshScreen::adjustHighlightedValue(float increment) { - mydata.zAdjustment += increment; - moveToHighlightedValue(); -} - -void BedMeshScreen::saveAdjustedHighlightedValue() { - if (mydata.zAdjustment) { - BedMeshScreen::setHighlightedValue(BedMeshScreen::getHighlightedValue(true) + mydata.zAdjustment); - mydata.zAdjustment = 0; - } -} - -void BedMeshScreen::changeHighlightedValue(uint8_t tag) { - if (mydata.allowEditing) saveAdjustedHighlightedValue(); - mydata.highlightedTag = tag; - if (mydata.allowEditing) moveToHighlightedValue(); -} - -void BedMeshScreen::drawHighlightedPointValue() { - CommandProcessor cmd; - cmd.font(Theme::font_medium) - .colors(normal_btn) - .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) - .font(font_small); - - if (mydata.allowEditing) - draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); - else - draw_adjuster_value(cmd, Z_VALUE_POS, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); - - cmd.colors(action_btn) - .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) - .tag(0); - - switch (mydata.message) { - case mydata.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; - case mydata.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; - default: break; - } -} - -void BedMeshScreen::onRedraw(draw_mode_t what) { - #define _INSET_POS(x,y,w,h) x + min(w,h)/10, y + min(w,h)/10, w - min(w,h)/5, h - min(w,h)/5 - #define INSET_POS(pos) _INSET_POS(pos) - - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)); - - // Draw the shadow and tags - cmd.cmd(COLOR_RGB(Theme::bed_mesh_shadow_rgb)); - BedMeshScreen::drawMesh(INSET_POS(MESH_POS), nullptr, USE_POINTS | USE_TAGS); - cmd.cmd(COLOR_RGB(bg_text_enabled)); - } - - if (what & FOREGROUND) { - constexpr float autoscale_max_amplitude = 0.03; - const bool gotAllPoints = mydata.count >= GRID_MAX_POINTS; - if (gotAllPoints) { - drawHighlightedPointValue(); - } - CommandProcessor cmd; - cmd.cmd(COLOR_RGB(Theme::bed_mesh_lines_rgb)); - const float levelingProgress = sq(float(mydata.count) / GRID_MAX_POINTS); - BedMeshScreen::drawMesh(INSET_POS(MESH_POS), ExtUI::getMeshArray(), - USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (gotAllPoints ? USE_COLORS : 0), - autoscale_max_amplitude * levelingProgress - ); - } -} - -bool BedMeshScreen::onTouchEnd(uint8_t tag) { - constexpr float increment = 0.01; - switch (tag) { - case 1: - saveAdjustedHighlightedValue(); - injectCommands_P(PSTR("G29 S1")); - GOTO_PREVIOUS(); - return true; - case 2: adjustHighlightedValue(-increment); break; - case 3: adjustHighlightedValue( increment); break; - default: - if (tag >= 10) - changeHighlightedValue(tag); - else - return false; - } - return true; -} - -void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { - if (AT_SCREEN(BedMeshScreen)) - onRefresh(); -} - -void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { - switch (state) { - case ExtUI::MESH_START: - mydata.allowEditing = false; - mydata.count = 0; - mydata.message = mydata.MSG_NONE; - break; - case ExtUI::MESH_FINISH: - if (mydata.count == GRID_MAX_POINTS && ExtUI::getMeshValid()) - mydata.message = mydata.MSG_MESH_COMPLETE; - else - mydata.message = mydata.MSG_MESH_INCOMPLETE; - mydata.count = GRID_MAX_POINTS; - break; - case ExtUI::PROBE_START: - mydata.highlightedTag = pointToTag(x, y); - break; - case ExtUI::PROBE_FINISH: - mydata.count++; - break; - } - BedMeshScreen::onMeshUpdate(x, y, 0); -} - -void BedMeshScreen::startMeshProbe() { - GOTO_SCREEN(BedMeshScreen); - mydata.allowEditing = false; - mydata.count = 0; - injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); -} - -void BedMeshScreen::showMesh() { - GOTO_SCREEN(BedMeshScreen); - mydata.allowEditing = false; -} - -void BedMeshScreen::showMeshEditor() { - SpinnerDialogBox::enqueueAndWait_P(ExtUI::isMachineHomed() ? F("M420 S1") : F("G28\nM420 S1")); - // After the spinner, go to this screen. - current_screen.forget(); - PUSH_SCREEN(BedMeshScreen); -} - -#endif // FTDI_BED_MESH_SCREEN +#endif // FTDI_BED_MESH_BASE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.h new file mode 100644 index 0000000000..7cc92793fe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.h @@ -0,0 +1,46 @@ +/******************* + * bed_mesh_base.h * + *******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BED_MESH_BASE + +class BedMeshBase : public BaseScreen { + protected: + typedef float (*mesh_getter_ptr)(uint8_t x, uint8_t y, void *data); + + private: + enum MeshOpts { + USE_POINTS = 0x01, + USE_COLORS = 0x02, + USE_TAGS = 0x04, + USE_HIGHLIGHT = 0x08, + USE_AUTOSCALE = 0x10 + }; + + static void _drawMesh(CommandProcessor &, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t opts, float autoscale_max, uint8_t highlightedTag, mesh_getter_ptr func, void *data); + + protected: + static void drawMeshForeground(CommandProcessor &cmd, int16_t x, int16_t y, int16_t w, int16_t h, mesh_getter_ptr func, void *data, uint8_t highlightedTag = 0, float progress = 1.0); + static void drawMeshBackground(CommandProcessor &cmd, int16_t x, int16_t y, int16_t w, int16_t h); + static uint8_t pointToTag(uint8_t x, uint8_t y); + static bool tagToPoint(uint8_t tag, xy_uint8_t &pt); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp new file mode 100644 index 0000000000..117ac0e452 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp @@ -0,0 +1,186 @@ +/**************************** + * bed_mesh_edit_screen.cpp * + ****************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" +#include "screens.h" +#include "screen_data.h" + +#ifdef FTDI_BED_MESH_EDIT_SCREEN + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +constexpr static BedMeshEditScreenData &mydata = screen_data.BedMeshEditScreen; +constexpr static float gaugeThickness = 0.25; + +#if ENABLED(TOUCH_UI_PORTRAIT) + #define GRID_COLS 3 + #define GRID_ROWS 10 + + #define MESH_POS BTN_POS(1, 2), BTN_SIZE(3,5) + #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(3,1) + #define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1) + #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,10), BTN_SIZE(2,1) + #define SAVE_POS BTN_POS(3,10), BTN_SIZE(1,1) +#else + #define GRID_COLS 5 + #define GRID_ROWS 5 + + #define MESH_POS BTN_POS(1,1), BTN_SIZE(3,5) + #define MESSAGE_POS BTN_POS(4,1), BTN_SIZE(2,1) + #define Z_LABEL_POS BTN_POS(4,2), BTN_SIZE(2,1) + #define Z_VALUE_POS BTN_POS(4,3), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(4,5), BTN_SIZE(1,1) + #define SAVE_POS BTN_POS(5,5), BTN_SIZE(1,1) +#endif + +static float meshGetter(uint8_t x, uint8_t y, void*) { + xy_uint8_t pos; + pos.x = x; + pos.y = y; + return ExtUI::getMeshPoint(pos) + (mydata.highlight.x != -1 && mydata.highlight == pos ? mydata.zAdjustment : 0); +} + +void BedMeshEditScreen::onEntry() { + mydata.needSave = false; + mydata.highlight.x = -1; + mydata.zAdjustment = 0; + BaseScreen::onEntry(); +} + +float BedMeshEditScreen::getHighlightedValue() { + const float val = ExtUI::getMeshPoint(mydata.highlight); + return (isnan(val) ? 0 : val) + mydata.zAdjustment; +} + +void BedMeshEditScreen::setHighlightedValue(float value) { + ExtUI::setMeshPoint(mydata.highlight, value); +} + +void BedMeshEditScreen::moveToHighlightedValue() { + if (ExtUI::getMeshValid()) { + ExtUI::setLevelingActive(true); + ExtUI::moveToMeshPoint(mydata.highlight, gaugeThickness + mydata.zAdjustment); + } +} + +void BedMeshEditScreen::adjustHighlightedValue(float increment) { + if(mydata.highlight.x != -1) { + mydata.zAdjustment += increment; + moveToHighlightedValue(); + mydata.needSave = true; + } +} + +void BedMeshEditScreen::saveAdjustedHighlightedValue() { + if (mydata.zAdjustment && mydata.highlight.x != -1) { + setHighlightedValue(getHighlightedValue()); + mydata.zAdjustment = 0; + } +} + +bool BedMeshEditScreen::changeHighlightedValue(uint8_t tag) { + saveAdjustedHighlightedValue(); + if (tagToPoint(tag, mydata.highlight)) { + moveToHighlightedValue(); + return true; + } + return false; +} + +void BedMeshEditScreen::drawHighlightedPointValue() { + CommandProcessor cmd; + cmd.font(Theme::font_medium) + .colors(normal_btn) + .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) + .font(font_small); + if(mydata.highlight.x != -1) + draw_adjuster(cmd, Z_VALUE_POS, 3, getHighlightedValue(), GET_TEXT_F(MSG_UNITS_MM), 4, 3); + cmd.colors(mydata.needSave ? normal_btn : action_btn) + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_BACK)) + .colors(mydata.needSave ? action_btn : normal_btn) + .enabled(mydata.needSave) + .tag(2).button(SAVE_POS, GET_TEXT_F(MSG_TOUCHMI_SAVE)); +} + +void BedMeshEditScreen::onRedraw(draw_mode_t what) { + #define _INSET_POS(x,y,w,h) x + min(w,h)/10, y + min(w,h)/10, w - min(w,h)/5, h - min(w,h)/5 + #define INSET_POS(pos) _INSET_POS(pos) + + CommandProcessor cmd; + + if (what & BACKGROUND) { + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)); + drawMeshBackground(cmd, INSET_POS(MESH_POS)); + } + + if (what & FOREGROUND) { + drawHighlightedPointValue(); + drawMeshForeground(cmd, INSET_POS(MESH_POS), meshGetter, nullptr, pointToTag(mydata.highlight.x,mydata.highlight.y)); + } +} + +bool BedMeshEditScreen::onTouchHeld(uint8_t tag) { + constexpr float increment = 0.01; + switch (tag) { + case 3: adjustHighlightedValue(-increment); return true; + case 4: adjustHighlightedValue( increment); return true; + } + return false; +} + +bool BedMeshEditScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + // On Cancel, reload saved mesh, discarding changes + GOTO_PREVIOUS(); + injectCommands_P(PSTR("G29 L1")); + return true; + case 2: + saveAdjustedHighlightedValue(); + injectCommands_P(PSTR("G29 S1")); + mydata.needSave = false; + return true; + case 3: + case 4: + return onTouchHeld(tag); + default: return changeHighlightedValue(tag); + } + return true; +} + +void BedMeshEditScreen::show() { + // On entry, home if needed and save current mesh + if (!ExtUI::isMachineHomed()) { + SpinnerDialogBox::enqueueAndWait_P(F("G28\nG29 S1")); + // After the spinner, go to this screen. + current_screen.forget(); + PUSH_SCREEN(BedMeshEditScreen); + } else { + injectCommands_P(PSTR("G29 S1")); + GOTO_SCREEN(BedMeshEditScreen); + } +} + +#endif // FTDI_BED_MESH_EDIT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.h similarity index 58% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.h index 21a7a73729..62121941b1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.h @@ -1,6 +1,6 @@ -/********************* - * bed_mesh_screen.h * - *********************/ +/************************** + * bed_mesh_edit_screen.h * + *************************/ /**************************************************************************** * Written By Marcio Teixeira 2020 * @@ -21,49 +21,28 @@ #pragma once -#define FTDI_BED_MESH_SCREEN -#define FTDI_BED_MESH_SCREEN_CLASS BedMeshScreen +#define FTDI_BED_MESH_EDIT_SCREEN +#define FTDI_BED_MESH_EDIT_SCREEN_CLASS BedMeshEditScreen -struct BedMeshScreenData { - enum : uint8_t { - MSG_NONE, - MSG_MESH_COMPLETE, - MSG_MESH_INCOMPLETE - } message; - uint8_t count; - uint8_t highlightedTag; +struct BedMeshEditScreenData { + bool needSave; + xy_uint8_t highlight; float zAdjustment; - bool allowEditing; }; -class BedMeshScreen : public BaseScreen, public CachedScreen { +class BedMeshEditScreen : public BedMeshBase, public CachedScreen { private: - enum MeshOpts { - USE_POINTS = 0x01, - USE_COLORS = 0x02, - USE_TAGS = 0x04, - USE_HIGHLIGHT = 0x08, - USE_AUTOSCALE = 0x10 - }; - - static uint8_t pointToTag(uint8_t x, uint8_t y); - static bool tagToPoint(uint8_t tag, xy_uint8_t &pt); - static float getHighlightedValue(bool nanAsZero); + static float getHighlightedValue(); static void setHighlightedValue(float value); static void moveToHighlightedValue(); static void adjustHighlightedValue(float increment); static void saveAdjustedHighlightedValue(); - static void changeHighlightedValue(uint8_t tag); + static bool changeHighlightedValue(uint8_t tag); static void drawHighlightedPointValue(); - static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); public: - static void onMeshUpdate(const int8_t x, const int8_t y, const float val); - static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); static void onEntry(); static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); static bool onTouchEnd(uint8_t tag); - - static void startMeshProbe(); - static void showMesh(); - static void showMeshEditor(); + static void show(); }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.cpp new file mode 100644 index 0000000000..8321bd8bb5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.cpp @@ -0,0 +1,172 @@ +/**************************** + * bed_mesh_view_screen.cpp * + ****************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" +#include "screens.h" +#include "screen_data.h" + +#ifdef FTDI_BED_MESH_VIEW_SCREEN + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +constexpr static BedMeshViewScreenData &mydata = screen_data.BedMeshViewScreen; +constexpr static float gaugeThickness = 0.25; + +#if ENABLED(TOUCH_UI_PORTRAIT) + #define GRID_COLS 3 + #define GRID_ROWS 10 + + #define MESH_POS BTN_POS(1, 2), BTN_SIZE(3,5) + #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(3,1) + #define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1) + #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(2,1) + #define OKAY_POS BTN_POS(1,10), BTN_SIZE(3,1) +#else + #define GRID_COLS 5 + #define GRID_ROWS 5 + + #define MESH_POS BTN_POS(1,1), BTN_SIZE(3,5) + #define MESSAGE_POS BTN_POS(4,1), BTN_SIZE(2,1) + #define Z_LABEL_POS BTN_POS(4,2), BTN_SIZE(2,1) + #define Z_VALUE_POS BTN_POS(4,3), BTN_SIZE(2,1) + #define OKAY_POS BTN_POS(4,5), BTN_SIZE(2,1) +#endif + +static float meshGetter(uint8_t x, uint8_t y, void*) { + xy_uint8_t pos; + pos.x = x; + pos.y = y; + return ExtUI::getMeshPoint(pos); +} + +void BedMeshViewScreen::onEntry() { + mydata.highlight.x = -1; + mydata.count = GRID_MAX_POINTS; + mydata.message = nullptr; + BaseScreen::onEntry(); +} + +void BedMeshViewScreen::drawHighlightedPointValue() { + CommandProcessor cmd; + cmd.font(Theme::font_medium) + .colors(normal_btn) + .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) + .font(font_small); + + if(mydata.highlight.x != -1) + draw_adjuster_value(cmd, Z_VALUE_POS, ExtUI::getMeshPoint(mydata.highlight), GET_TEXT_F(MSG_UNITS_MM), 4, 3); + + cmd.colors(action_btn) + .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) + .tag(0); + + if(mydata.message) cmd.text(MESSAGE_POS, mydata.message); +} + +void BedMeshViewScreen::onRedraw(draw_mode_t what) { + #define _INSET_POS(x,y,w,h) x + min(w,h)/10, y + min(w,h)/10, w - min(w,h)/5, h - min(w,h)/5 + #define INSET_POS(pos) _INSET_POS(pos) + + CommandProcessor cmd; + + if (what & BACKGROUND) { + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)); + drawMeshBackground(cmd, INSET_POS(MESH_POS)); + } + + if (what & FOREGROUND) { + const float progress = sq(float(mydata.count) / GRID_MAX_POINTS); + if (progress >= 1.0) + drawHighlightedPointValue(); + drawMeshForeground(cmd, INSET_POS(MESH_POS), meshGetter, nullptr, pointToTag(mydata.highlight.x, mydata.highlight.y), progress); + } +} + +bool BedMeshViewScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); return true; + default: return tagToPoint(tag, mydata.highlight); + } + return true; +} + +void BedMeshViewScreen::onMeshUpdate(const int8_t, const int8_t, const float) { + if (AT_SCREEN(BedMeshViewScreen)) { + onRefresh(); + ExtUI::yield(); + } +} + +void BedMeshViewScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { + switch (state) { + case ExtUI::G29_START: + mydata.message = nullptr; + mydata.count = 0; + break; + case ExtUI::G29_FINISH: + if (mydata.count == GRID_MAX_POINTS && ExtUI::getMeshValid()) + mydata.message = GET_TEXT_F(MSG_BED_MAPPING_DONE); + else + mydata.message = GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE); + mydata.count = GRID_MAX_POINTS; + break; + case ExtUI::G26_START: + GOTO_SCREEN(BedMeshViewScreen); + mydata.message = nullptr; + mydata.count = 0; + break; + case ExtUI::G26_FINISH: + GOTO_SCREEN(StatusScreen); + break; + case ExtUI::G29_POINT_START: + case ExtUI::G26_POINT_START: + mydata.highlight.x = x; + mydata.highlight.y = y; + break; + case ExtUI::G29_POINT_FINISH: + case ExtUI::G26_POINT_FINISH: + mydata.count++; + break; + } + BedMeshViewScreen::onMeshUpdate(x, y, 0); +} + +void BedMeshViewScreen::doProbe() { + GOTO_SCREEN(BedMeshViewScreen); + mydata.count = 0; + injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); +} + +void BedMeshViewScreen::doMeshValidation() { + mydata.count = 0; + GOTO_SCREEN(StatusScreen); + injectCommands_P(PSTR("G28 O\nM117 Heating...\nG26 R X0 Y0")); +} + +void BedMeshViewScreen::show() { + injectCommands_P(PSTR("G29 L1")); + GOTO_SCREEN(BedMeshViewScreen); +} + +#endif // FTDI_BED_MESH_VIEW_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.h new file mode 100644 index 0000000000..0bb88f7f96 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.h @@ -0,0 +1,48 @@ +/************************** + * bed_mesh_view_screen.h * + *************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_BED_MESH_VIEW_SCREEN +#define FTDI_BED_MESH_VIEW_SCREEN_CLASS BedMeshViewScreen + +struct BedMeshViewScreenData { + progmem_str message; + uint8_t count; + xy_uint8_t highlight; +}; + +class BedMeshViewScreen : public BedMeshBase, public CachedScreen { + private: + static float getHighlightedValue(); + static bool changeHighlightedValue(uint8_t tag); + static void drawHighlightedPointValue(); + public: + static void onMeshUpdate(const int8_t x, const int8_t y, const float val); + static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + + static void doProbe(); + static void doMeshValidation(); + static void show(); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index 7a540e1311..ffdd69b2dd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -111,20 +111,17 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { #define BED_LEVELING_COMMANDS "G29" #endif #if ENABLED(AUTO_BED_LEVELING_UBL) - BedMeshScreen::startMeshProbe(); + BedMeshViewScreen::doProbe(); #else SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); #endif break; #if ENABLED(AUTO_BED_LEVELING_UBL) - case 4: BedMeshScreen::showMesh(); break; - case 5: BedMeshScreen::showMeshEditor(); break; + case 4: BedMeshViewScreen::show(); break; + case 5: BedMeshEditScreen::show(); break; #endif #if ENABLED(G26_MESH_VALIDATION) - case 6: - GOTO_SCREEN(StatusScreen); - injectCommands_P(PSTR("M117 Printing Test Pattern\nG28 O\nG26 R")); - break; + case 6: BedMeshViewScreen::doMeshValidation(); break; #endif #if ENABLED(BLTOUCH) case 7: injectCommands_P(PSTR("M280 P0 S60")); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index 06368f0ce7..a5ef7155f9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -55,7 +55,8 @@ union screen_data_t { DECL_DATA_IF_INCLUDED(FTDI_CHANGE_FILAMENT_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_FILES_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_MOVE_AXIS_SCREEN) - DECL_DATA_IF_INCLUDED(FTDI_BED_MESH_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_BED_MESH_VIEW_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_BED_MESH_EDIT_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_STRESS_TEST_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_COCOA_LOAD_CHOCOLATE_SCREEN) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 889ed734cc..f115aecbc7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -75,7 +75,8 @@ SCREEN_TABLE { DECL_SCREEN_IF_INCLUDED(FTDI_STEPPER_BUMP_SENSITIVITY_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_LEVELING_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_Z_OFFSET_SCREEN) - DECL_SCREEN_IF_INCLUDED(FTDI_BED_MESH_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_BED_MESH_VIEW_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_BED_MESH_EDIT_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_NOZZLE_OFFSETS_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_BACKLASH_COMP_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_FEEDRATE_PERCENT_SCREEN) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 7aca5800e1..14b8197fbf 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -61,7 +61,8 @@ enum { ZOFFSET_SCREEN_CACHE, #endif #if HAS_MESH - BED_MESH_SCREEN_CACHE, + BED_MESH_VIEW_SCREEN_CACHE, + BED_MESH_EDIT_SCREEN_CACHE, #endif #endif #if ENABLED(BABYSTEPPING) @@ -206,7 +207,9 @@ enum { #include "z_offset_screen.h" #endif #if HAS_MESH - #include "bed_mesh_screen.h" + #include "bed_mesh_base.h" + #include "bed_mesh_view_screen.h" + #include "bed_mesh_edit_screen.h" #endif #endif diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 24bf284648..c59fe0bd17 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -168,10 +168,14 @@ namespace ExtUI { inline void onMeshUpdate(const xy_int8_t &pos, const_float_t zval) { onMeshUpdate(pos.x, pos.y, zval); } typedef enum : uint8_t { - MESH_START, // Prior to start of probe - MESH_FINISH, // Following probe of all points - PROBE_START, // Beginning probe of grid location - PROBE_FINISH // Finished probe of grid location + G29_START, // Prior to start of probe + G29_FINISH, // Following probe of all points + G29_POINT_START, // Beginning probe of grid location + G29_POINT_FINISH, // Finished probe of grid location + G26_START, + G26_FINISH, + G26_POINT_START, + G26_POINT_FINISH } probe_state_t; void onMeshUpdate(const int8_t xpos, const int8_t ypos, probe_state_t state); inline void onMeshUpdate(const xy_int8_t &pos, probe_state_t state) { onMeshUpdate(pos.x, pos.y, state); } From f3510db3679ce53ec08b5d9da3e951866b3017d5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 2 Apr 2021 14:30:13 -0500 Subject: [PATCH 1251/1370] Fix CardReader string args --- Marlin/src/sd/cardreader.cpp | 6 +++--- Marlin/src/sd/cardreader.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 225f7d9a95..c9668bf8a8 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -515,7 +515,7 @@ void CardReader::endFilePrint(TERN_(SD_RESORT, const bool re_sort/*=false*/)) { TERN_(SD_RESORT, if (re_sort) presort()); } -void CardReader::openLogFile(char * const path) { +void CardReader::openLogFile(const char * const path) { flag.logging = DISABLED(SDCARD_READONLY); IF_DISABLED(SDCARD_READONLY, openFileWrite(path)); } @@ -634,7 +634,7 @@ inline void echo_write_to_file(const char * const fname) { // // Open a file by DOS path for write // -void CardReader::openFileWrite(char * const path) { +void CardReader::openFileWrite(const char * const path) { if (!isMounted()) return; announceOpen(2, path); @@ -722,7 +722,7 @@ void CardReader::report_status() { SERIAL_ECHOLNPGM(STR_SD_NOT_PRINTING); } -void CardReader::write_command(char * const buf) { +void CardReader::write_command(const char * const buf) { char *begin = buf; char *npos = nullptr; char *end = buf + strlen(buf) - 1; diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 9528c4ac28..cf876ce9c7 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -91,8 +91,8 @@ public: static void manage_media(); // SD Card Logging - static void openLogFile(char * const path); - static void write_command(char * const buf); + static void openLogFile(const char * const path); + static void write_command(const char * const buf); #if DISABLED(NO_SD_AUTOSTART) // Auto-Start auto#.g file handling static uint8_t autofile_index; // Next auto#.g index to run, plus one. Ignored by autofile_check when zero. @@ -103,7 +103,7 @@ public: // Basic file ops static void openFileRead(char * const path, const uint8_t subcall=0); - static void openFileWrite(char * const path); + static void openFileWrite(const char * const path); static void closefile(const bool store_location=false); static bool fileExists(const char * const name); static void removeFile(const char * const name); From c5ab0a66b74e442a212953050ba1b55c8d2f39be Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 5 Apr 2021 15:34:51 -0500 Subject: [PATCH 1252/1370] write_command changes input --- Marlin/src/sd/cardreader.cpp | 8 ++++---- Marlin/src/sd/cardreader.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index c9668bf8a8..f0797d6538 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -722,10 +722,10 @@ void CardReader::report_status() { SERIAL_ECHOLNPGM(STR_SD_NOT_PRINTING); } -void CardReader::write_command(const char * const buf) { - char *begin = buf; - char *npos = nullptr; - char *end = buf + strlen(buf) - 1; +void CardReader::write_command(char * const buf) { + char *begin = buf, + *npos = nullptr, + *end = buf + strlen(buf) - 1; file.writeError = false; if ((npos = strchr(buf, 'N'))) { diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index cf876ce9c7..482fb1c5cc 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -92,7 +92,7 @@ public: // SD Card Logging static void openLogFile(const char * const path); - static void write_command(const char * const buf); + static void write_command(char * const buf); #if DISABLED(NO_SD_AUTOSTART) // Auto-Start auto#.g file handling static uint8_t autofile_index; // Next auto#.g index to run, plus one. Ignored by autofile_check when zero. From 1ba0ed8121f4ccbd9e89f45b84792366d884798a Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Mon, 5 Apr 2021 16:34:31 -0500 Subject: [PATCH 1253/1370] Make DELAY_NS round up on AVR (#21546) --- Marlin/src/HAL/shared/Delay.h | 35 +++++++++++++++++-- .../dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 2 +- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h index dc1f158b44..f7e01ad25c 100644 --- a/Marlin/src/HAL/shared/Delay.h +++ b/Marlin/src/HAL/shared/Delay.h @@ -150,8 +150,37 @@ void calibrate_delay_loop(); #endif -// Delay in nanoseconds -#define DELAY_NS(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL) / 1000UL) - +/************************************************************** + * Delay in nanoseconds. Requires the F_CPU macro. + * These macros follow avr-libc delay conventions. + * + * For AVR there are three possible operation modes, due to its + * slower clock speeds and thus coarser delay resolution. For + * example, when F_CPU = 16000000 the resolution is 62.5ns. + * + * Round up (default) + * Round up the delay according to the CPU clock resolution. + * e.g., 100 will give a delay of 2 cycles (125ns). + * + * Round down (DELAY_NS_ROUND_DOWN) + * Round down the delay according to the CPU clock resolution. + * e.g., 100 will be rounded down to 1 cycle (62.5ns). + * + * Nearest (DELAY_NS_ROUND_CLOSEST) + * Round the delay to the nearest number of clock cycles. + * e.g., 165 will be rounded up to 3 cycles (187.5ns) because + * it's closer to the requested delay than 2 cycle (125ns). + */ +#ifndef __AVR__ + #undef DELAY_NS_ROUND_DOWN + #undef DELAY_NS_ROUND_CLOSEST +#endif +#if ENABLED(DELAY_NS_ROUND_DOWN) + #define DELAY_NS(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL) / 1000UL) // floor +#elif ENABLED(DELAY_NS_ROUND_CLOSEST) + #define DELAY_NS(x) DELAY_CYCLES(((x) * ((F_CPU) / 1000000UL) + 500) / 1000UL) // round +#else + #define DELAY_NS(x) DELAY_CYCLES(((x) * ((F_CPU) / 1000000UL) + 999) / 1000UL) // "ceil" +#endif diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index 24baae221e..4abf91edbd 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -60,7 +60,7 @@ #elif F_CPU == 16000000 #define CPU_ST7920_DELAY_1 DELAY_NS(125) #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(125) + #define CPU_ST7920_DELAY_3 DELAY_NS(188) #else #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd_AVR.h'" #endif From c2c73215b2f2b46a1a06110c6bbcfcfedcf30b41 Mon Sep 17 00:00:00 2001 From: Malderin <52313714+Malderin@users.noreply.github.com> Date: Tue, 6 Apr 2021 04:39:57 +0300 Subject: [PATCH 1254/1370] MKS LVGL UI: Display/edit fan percentage (#21544) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 50 ++++++-------------- 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index af8b441f24..700471b4a3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -32,8 +32,7 @@ #include "../../../../inc/MarlinConfig.h" extern lv_group_t *g; -static lv_obj_t *scr; -static lv_obj_t *fanText; +static lv_obj_t *scr, *fanText; enum { ID_F_ADD = 1, @@ -44,43 +43,23 @@ enum { ID_F_RETURN }; -static uint8_t fanSpeed; - static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; - + uint8_t fanPercent = map(thermalManager.fan_speed[0], 0, 255, 0, 100); switch (obj->mks_obj_id) { - case ID_F_ADD: - if (fanSpeed < 254) fanSpeed++; - break; - case ID_F_DEC: - if (fanSpeed > 0) fanSpeed--; - break; - case ID_F_HIGH: - fanSpeed = 255; - break; - case ID_F_MID: - fanSpeed = 127; - break; - case ID_F_OFF: - gcode.process_subcommands_now_P(PSTR("M107")); - return; - case ID_F_RETURN: - clear_cur_ui(); - draw_return_ui(); - return; + case ID_F_ADD: if (fanPercent < 100) fanPercent++; break; + case ID_F_DEC: if (fanPercent != 0) fanPercent--; break; + case ID_F_HIGH: fanPercent = 100; break; + case ID_F_MID: fanPercent = 50; break; + case ID_F_OFF: fanPercent = 0; break; + case ID_F_RETURN: clear_cur_ui(); draw_return_ui(); return; } - sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); - gcode.process_subcommands_now(public_buf_l); + thermalManager.set_fan_speed(0, map(fanPercent, 0, 100, 0, 255)); } void lv_draw_fan() { lv_obj_t *buttonAdd; - #if HAS_FAN - fanSpeed = thermalManager.fan_speed[0]; - #endif - scr = lv_screen_create(FAN_UI); // Create an Image button buttonAdd = lv_big_button_create(scr, "F:/bmp_Add.bin", fan_menu.add, INTERVAL_V, titleHeight, event_handler, ID_F_ADD); @@ -97,12 +76,11 @@ void lv_draw_fan() { } void disp_fan_value() { - char buf1[10] = {0}; - public_buf_l[0] = '\0'; - strcat(public_buf_l, fan_menu.state); - strcat_P(public_buf_l, PSTR(": ")); - sprintf_P(buf1, PSTR("%3d"), thermalManager.fan_speed[0]); - strcat(public_buf_l, buf1); + #if HAS_FAN + sprintf_P(public_buf_l, PSTR("%s: %3d%%"), fan_menu.state, (int)map(thermalManager.fan_speed[0], 0, 255, 0, 100)); + #else + sprintf_P(public_buf_l, PSTR("%s: ---"), fan_menu.state); + #endif lv_label_set_text(fanText, public_buf_l); lv_obj_align(fanText, nullptr, LV_ALIGN_CENTER, 0, -65); } From c197ecc99b59d17b4db1d4b46361b036d12fc961 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 5 Apr 2021 22:46:21 -0300 Subject: [PATCH 1255/1370] Fix Rumba32 variant for Marlin (#21497) --- .../variants/MARLIN_F446VE/PeripheralPins.c | 454 ++++++++++++++++++ .../variants/MARLIN_F446VE/PinNamesVar.h | 30 ++ .../variants/MARLIN_F446VE/ldscript.ld | 184 +++++++ .../variants/MARLIN_F446VE/variant.cpp | 212 ++++++++ .../variants/MARLIN_F446VE/variant.h | 186 +++++++ ini/stm32f4.ini | 21 +- 6 files changed, 1081 insertions(+), 6 deletions(-) create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F446VE/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F446VE/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F446VE/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F446VE/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F446VE/variant.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PeripheralPins.c new file mode 100644 index 0000000000..d4746a39e3 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PeripheralPins.c @@ -0,0 +1,454 @@ +/* + ******************************************************************************* + * Copyright (c) 2020, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + * Automatically generated from STM32F446V(C-E)Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +WEAK const PinMap PinMap_DAC[] = { + // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - LD2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + // {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + // {PC_12, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + // {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + // {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + {PB_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + // {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + // {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + // {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + // {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + // {PB_8, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + // {PB_9, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + // {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + // {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + // {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + // {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + // {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + // {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + // {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + // {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + // {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + // {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + // {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + // {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + // {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PE_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + // {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PC_5, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + // {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PE_7, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + // {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + // {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + // {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + // {PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + // {PC_1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, + // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PD_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, + // {PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PD_0, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_7, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PD_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + // {PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_RD[] = { + // {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + // {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + // {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + // {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + // {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_TD[] = { + // {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + // {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + // {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + // {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + // {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {NC, NP, 0} +}; +#endif + +//*** No ETHERNET *** + +//*** QUADSPI *** + +#ifdef HAL_QSPI_MODULE_ENABLED +WEAK const PinMap PinMap_QUADSPI_DATA0[] = { + // {PC_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 + // {PD_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 + // {PE_7, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO0 + {NC, NP, 0} +}; +#endif + +#ifdef HAL_QSPI_MODULE_ENABLED +WEAK const PinMap PinMap_QUADSPI_DATA1[] = { + // {PC_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 + // {PD_12, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 + // {PE_8, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO1 + {NC, NP, 0} +}; +#endif + +#ifdef HAL_QSPI_MODULE_ENABLED +WEAK const PinMap PinMap_QUADSPI_DATA2[] = { + // {PE_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO2 + // {PE_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO2 + {NC, NP, 0} +}; +#endif + +#ifdef HAL_QSPI_MODULE_ENABLED +WEAK const PinMap PinMap_QUADSPI_DATA3[] = { + {PA_1, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 + // {PD_13, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 + // {PE_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO3 + {NC, NP, 0} +}; +#endif + +#ifdef HAL_QSPI_MODULE_ENABLED +WEAK const PinMap PinMap_QUADSPI_SCLK[] = { + // {PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK + // {PD_3, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK + {NC, NP, 0} +}; +#endif + +#ifdef HAL_QSPI_MODULE_ENABLED +WEAK const PinMap PinMap_QUADSPI_SSEL[] = { + // {PB_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK1_NCS + // {PC_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK2_NCS + {NC, NP, 0} +}; +#endif + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_FS[] = { + // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; +#endif + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_HS[] = { +#ifdef USE_USB_HS_IN_FS + // {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF + // {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + // {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + // {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + // {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP +#else + // {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + // {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK + // {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + // {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + // {PB_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 + // {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + // {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + // {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + // {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + // {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + // {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + // {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT +#endif /* USE_USB_HS_IN_FS */ + {NC, NP, 0} +}; +#endif + +//*** SD *** + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + // {PB_0, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + // {PB_1, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + // {PB_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + // {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + // {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + // {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + // {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + // {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + // {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PinNamesVar.h new file mode 100644 index 0000000000..bff3f21349 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PinNamesVar.h @@ -0,0 +1,30 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, /* SYS_WKUP0 */ +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F446VE/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/ldscript.ld new file mode 100644 index 0000000000..503472806e --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/ldscript.ld @@ -0,0 +1,184 @@ +/* +***************************************************************************** +** +** File : lscript.ld +** +** Abstract : Linker script for STM32F446VE Device with +** 512KByte FLASH, 128KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

      © COPYRIGHT(c) 2014 Ac6

      +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +FLASH (rx) : ORIGIN = 0x08000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text ALIGN(4): + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata ALIGN(4): + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + /*_siccmram = LOADADDR(.ccmram);*/ + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F446VE/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/variant.cpp new file mode 100644 index 0000000000..16e11f0a91 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/variant.cpp @@ -0,0 +1,212 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Pin number +const PinName digitalPin[] = { + PA_0, //D0 //A7 + PA_1, //D1 //A8 + PA_2, //D2 //A9 + PA_3, //D3 //A0 + PA_4, //D4 //A1 + PA_5, //D5 //A10 + PA_6, //D6 //A11 + PA_7, //D7 //A12 + PA_8, //D8 + PA_9, //D9 + PA_10, //D10 + PA_11, //D11 + PA_12, //D12 + PA_13, //D13 + PA_14, //D14 + PA_15, //D15 + PB_0, //D16 //A13 + PB_1, //D17 //A14 + PB_2, //D18 + PB_3, //D19 + PB_4, //D20 + PB_5, //D21 + PB_6, //D22 + PB_7, //D23 + PB_8, //D24 + PB_9, //D25 + PB_10, //D26 + PB_11, //D27 + PB_12, //D28 + PB_13, //D29 + PB_14, //D30 + PB_15, //D31 + PC_0, //D32 //A2 + PC_1, //D33 //A3 + PC_2, //D34 //A4 + PC_3, //D35 //A5 + PC_4, //D36 //A6 + PC_5, //D37 //A15 + PC_6, //D38 + PC_7, //D39 + PC_8, //D40 + PC_9, //D41 + PC_10, //D42 + PC_11, //D43 + PC_12, //D44 + PC_13, //D45 + PC_14, //D46 + PC_15, //D47 + PD_0, //D48 + PD_1, //D49 + PD_2, //D50 + PD_3, //D51 + PD_4, //D52 + PD_5, //D53 + PD_6, //D54 + PD_7, //D55 + PD_8, //D56 + PD_9, //D57 + PD_10, //D58 + PD_11, //D59 + PD_12, //D60 + PD_13, //D61 + PD_14, //D62 + PD_15, //D63 + PE_0, //D64 + PE_1, //D65 + PE_2, //D66 + PE_3, //D67 + PE_4, //D68 + PE_5, //D69 + PE_6, //D70 + PE_7, //D71 + PE_8, //D72 + PE_9, //D73 + PE_10, //D74 + PE_11, //D75 + PE_12, //D76 + PE_13, //D77 + PE_14, //D78 + PE_15 //D79 +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 3, //D3 //A0 + 4, //D4 //A1 + 32, //D32 //A2 + 33, //D33 //A3 + 34, //D34 //A4 + 35, //D35 //A5 + 36, //D36 //A6 + 0, //D0 //A7 + 1, //D1 //A8 + 2, //D2 //A9 + 5, //D5 //A10 + 6, //D6 //A11 + 7, //D7 //A12 + 16, //D16 //A13 + 17, //D17 //A14 + 37 //D37 //A15 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 168000000 + * HCLK(Hz) = 168000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 4 + * APB2 Prescaler = 2 + * HSE Frequency(Hz) = 8000000 + * PLL_M = 8 + * PLL_N = 336 + * PLL_P = 2 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale1 mode + * Flash Latency(WS) = 5 + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; + + + /* Enable Power Control clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + +#ifdef HAL_PWR_MODULE_ENABLED + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); +#endif + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 6; + RCC_OscInitStruct.PLL.PLLN = 180; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + RCC_OscInitStruct.PLL.PLLR = 2; + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + HAL_PWREx_EnableOverDrive(); + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | + RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLRCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); + + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48; + PeriphClkInitStruct.PLLSAI.PLLSAIM = 6; + PeriphClkInitStruct.PLLSAI.PLLSAIN = 96; + PeriphClkInitStruct.PLLSAI.PLLSAIQ = 2; + PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV4; + PeriphClkInitStruct.PLLSAIDivQ = 1; + PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP; + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F446VE/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/variant.h new file mode 100644 index 0000000000..f00cc5f612 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/variant.h @@ -0,0 +1,186 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +#define PA0 PIN_A7 //D0 +#define PA1 PIN_A8 //D1 +#define PA2 PIN_A9 //D2 +#define PA3 PIN_A0 //D3 +#define PA4 PIN_A1 //D4 +#define PA5 PIN_A10 //D5 +#define PA6 PIN_A11 //D6 +#define PA7 PIN_A12 //D7 +#define PA8 8 //D8 +#define PA9 9 //D9 +#define PA10 10 //D10 +#define PA11 11 //D11 +#define PA12 12 //D12 +#define PA13 13 //D13 +#define PA14 14 //D14 +#define PA15 15 //D15 +#define PB0 PIN_A13 //D16 +#define PB1 PIN_A14 //D17 +#define PB2 18 //D18 +#define PB3 19 //D19 +#define PB4 20 //D20 +#define PB5 21 //D21 +#define PB6 22 //D22 +#define PB7 23 //D23 +#define PB8 24 //D24 +#define PB9 25 //D25 +#define PB10 26 //D26 +#define PB11 27 //D27 +#define PB12 28 //D28 +#define PB13 29 //D29 +#define PB14 30 //D30 +#define PB15 31 //D31 +#define PC0 PIN_A2 //D32 +#define PC1 PIN_A3 //D33 +#define PC2 PIN_A4 //D34 +#define PC3 PIN_A5 //D35 +#define PC4 PIN_A6 //D36 +#define PC5 PIN_A15 //D37 +#define PC6 38 //D38 +#define PC7 39 //D39 +#define PC8 40 //D40 +#define PC9 41 //D41 +#define PC10 42 //D42 +#define PC11 43 //D43 +#define PC12 44 //D44 +#define PC13 45 //D45 +#define PC14 46 //D46 +#define PC15 47 //D47 +#define PD0 48 //D48 +#define PD1 49 //D49 +#define PD2 50 //D50 +#define PD3 51 //D51 +#define PD4 52 //D52 +#define PD5 53 //D53 +#define PD6 54 //D54 +#define PD7 55 //D55 +#define PD8 56 //D56 +#define PD9 57 //D57 +#define PD10 58 //D58 +#define PD11 59 //D59 +#define PD12 60 //D60 +#define PD13 61 //D61 +#define PD14 62 //D62 +#define PD15 63 //D63 +#define PE0 64 //D64 +#define PE1 65 //D65 +#define PE2 66 //D66 +#define PE3 67 //D67 +#define PE4 68 //D68 +#define PE5 69 //D69 +#define PE6 70 //D70 +#define PE7 71 //D71 +#define PE8 72 //D72 +#define PE9 73 //D73 +#define PE10 74 //D74 +#define PE11 75 //D75 +#define PE12 76 //D76 +#define PE13 77 //D77 +#define PE14 78 //D78 +#define PE15 79 //D79 + +// This must be a literal +#define NUM_DIGITAL_PINS 80 +// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 16 + +// PWM resolution +#define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans +#define PWM_MAX_DUTY_CYCLE 255 + +// On-board LED pin number +#define LED_BUILTIN PB14 +#define LED_HEARTBEAT LED_BUILTIN + +// SPI Definitions +#define PIN_SPI_SS PA4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + +// I2C Definitions +#define PIN_WIRE_SDA PB9 +#define PIN_WIRE_SCL PB8 + +// Timer Definitions +// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin +#ifndef TIMER_TONE +#define TIMER_TONE TIM6 +#endif + +#ifndef TIMER_SERVO +#define TIMER_SERVO TIM7 +#endif + +#ifndef TIMER_SERIAL +#define TIMER_SERIAL TIM9 +#endif + +// UART Definitions +#define SERIAL_UART_INSTANCE 1 // Connected to EXP3 header + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +/* HAL configuration */ +#define HSE_VALUE 12000000U + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE_OPEN Serial +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index a15dc8b056..5e700f0e9f 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -277,17 +277,26 @@ build_flags = ${stm_flash_drive.build_flags} # RUMBA32 # [env:rumba32] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -Os -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -DTIMER_SERIAL=TIM9 -board = rumba32_f446ve -upload_protocol = dfu -monitor_speed = 500000 +board = rumba32_f446ve +upload_protocol = dfu +monitor_speed = 500000 +board_build.core = stm32 +board_build.variant = MARLIN_F446VE +board_build.ldscript = ldscript.ld +board_build.offset = 0x0000 +board_build.encrypt = No +board_build.firmware = firmware.bin +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py # # MKS Robin Pro V2 From 93dfd411fc6b2929a0486846805e854caa5ded0a Mon Sep 17 00:00:00 2001 From: Malderin <52313714+Malderin@users.noreply.github.com> Date: Tue, 6 Apr 2021 04:55:00 +0300 Subject: [PATCH 1256/1370] Cast celsius to int for MKS LVGL UI (#21502) --- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 2 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 23 +++++++------- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 6 ++-- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 30 +++++++++---------- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 12 ++------ 6 files changed, 34 insertions(+), 41 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 056e2e5d54..43ed214199 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -195,7 +195,7 @@ void disp_ext_speed() { void disp_hotend_temp() { char buf[20] = {0}; - sprintf(buf, extrude_menu.temp_value, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, extrude_menu.temp_value, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, extrude_menu.temper_text); strcat(public_buf_l, buf); lv_label_set_text(tempText, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 296359bc53..a3313285df 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -154,7 +154,7 @@ void disp_filament_temp() { public_buf_l[0] = '\0'; strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index d23ed0b05f..0395ccde52 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -62,15 +62,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { thermalManager.setTargetHotend(max_target, uiCfg.extruderIndex); thermalManager.start_watching_hotend(uiCfg.extruderIndex); } - #if HAS_HEATED_BED - else { + else { + #if HAS_HEATED_BED constexpr int16_t max_target = BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); thermalManager.temp_bed.target += uiCfg.stepHeat; if (thermalManager.degTargetBed() > max_target) thermalManager.setTargetBed(max_target); thermalManager.start_watching_bed(); - } - #endif + #endif + } disp_desire_temp(); } break; @@ -211,20 +211,19 @@ void disp_temp_type() { } void disp_desire_temp() { - char buf[20] = {0}; - + char buf[20] = { 0 }; public_buf_l[0] = '\0'; if (uiCfg.curTempType == 0) { strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); } - #if HAS_HEATED_BED - else { + else { + #if HAS_HEATED_BED strcat(public_buf_l, preheat_menu.hotbed); - sprintf(buf, preheat_menu.value_state, thermalManager.degBed(), thermalManager.degTargetBed()); - } - #endif + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degBed(), (int)thermalManager.degTargetBed()); + #endif + } strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); lv_label_set_text(tempText1, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 9bd120ce15..6025968d3b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -219,18 +219,18 @@ void lv_draw_printing() { } void disp_ext_temp() { - sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(0), thermalManager.degTargetHotend(0)); + sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(1), thermalManager.degTargetHotend(1)); + sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2, public_buf_l); #endif } void disp_bed_temp() { #if HAS_HEATED_BED - sprintf(public_buf_l, printing_menu.bed_temp, thermalManager.degBed(), thermalManager.degTargetBed()); + sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.degBed(), (int)thermalManager.degTargetBed()); lv_label_set_text(labelBed, public_buf_l); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 5787cfb009..45a2167a05 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -105,14 +105,14 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - sprintf_P(buf, PSTR("e1:%d"), thermalManager.degHotend(0)); + sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.degHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND - sprintf_P(buf, PSTR("e2:%d"), thermalManager.degHotend(1)); + sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.degHotend(1)); lv_label_set_text(e2, buf); #endif #if HAS_HEATED_BED - sprintf_P(buf, PSTR("bed:%d"), thermalManager.degBed()); + sprintf_P(buf, PSTR("bed:%d"), (int)thermalManager.degBed()); lv_label_set_text(bed, buf); #endif } @@ -139,20 +139,20 @@ void lv_draw_ready_print() { e1 = lv_label_create_empty(scr); lv_obj_set_pos(e1, 20, 20); - sprintf_P(buf, PSTR("e1: %d"), thermalManager.degHotend(0)); + sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND e2 = lv_label_create_empty(scr); lv_obj_set_pos(e2, 20, 45); - sprintf_P(buf, PSTR("e1: %d"), thermalManager.degHotend(1)); + sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(1)); lv_label_set_text(e2, buf); #endif #if HAS_HEATED_BED bed = lv_label_create_empty(scr); lv_obj_set_pos(bed, 20, 95); - sprintf_P(buf, PSTR("bed: %d"), thermalManager.degBed()); + sprintf_P(buf, PSTR("bed: %d"), (int)thermalManager.degBed()); lv_label_set_text(bed, buf); #endif @@ -208,27 +208,27 @@ void lv_draw_ready_print() { labelFan = lv_label_create(scr, 380, 80, nullptr); - sprintf_P(buf, PSTR("%d"), thermalManager.degHotend(0)); + sprintf_P(buf, PSTR("%d"), (int)thermalManager.degHotend(0)); lv_label_set_text(labelExt1, buf); lv_obj_align(labelExt1, buttonExt1, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); - sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetHotend(0)); + sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1Target, buf); lv_obj_align(labelExt1Target, buttonExt1, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); #if HAS_MULTI_EXTRUDER - sprintf_P(buf, PSTR("%d"), thermalManager.degHotend(1)); + sprintf_P(buf, PSTR("%d"), (int)thermalManager.degHotend(1)); lv_label_set_text(labelExt2, buf); lv_obj_align(labelExt2, buttonExt2, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); - sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetHotend(1)); + sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2Target, buf); lv_obj_align(labelExt2Target, buttonExt2, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); #endif #if HAS_HEATED_BED - sprintf_P(buf, PSTR("%d"), thermalManager.degBed()); + sprintf_P(buf, PSTR("%d"), (int)thermalManager.degBed()); lv_label_set_text(labelBed, buf); lv_obj_align(labelBed, buttonBedstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); - sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetBed()); + sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetBed()); lv_label_set_text(labelBedTarget, buf); lv_obj_align(labelBedTarget, buttonBedstate, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); #endif @@ -249,15 +249,15 @@ void lv_draw_ready_print() { void lv_temp_refr() { #if HAS_HEATED_BED - sprintf(public_buf_l, printing_menu.bed_temp, thermalManager.degBed(), thermalManager.degTargetBed()); + sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.degBed(), (int)thermalManager.degTargetBed()); lv_label_set_text(labelBed, public_buf_l); #endif - sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(0), thermalManager.degTargetHotend(0)); + sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(1), thermalManager.degTargetHotend(1)); + sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2, public_buf_l); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index a74ecd2f1e..1057a0c689 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -885,9 +885,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { char *outBuf = (char *)tempBuf; char str_1[16], tbuf[34]; - dtostrf(thermalManager.degHotend(0), 1, 1, tbuf); - strcat_P(tbuf, PSTR(" /")); - strcat(tbuf, dtostrf(thermalManager.degTargetHotend(0), 1, 1, str_1)); + sprintf_P(tbuf, PSTR("%d /%d"), (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); const int tlen = strlen(tbuf); @@ -897,9 +895,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcpy_P(outBuf, PSTR(" B:")); outBuf += 3; #if HAS_HEATED_BED - strcpy(outBuf, dtostrf(thermalManager.degBed(), 1, 1, str_1)); - strcat_P(outBuf, PSTR(" /")); - strcat(outBuf, dtostrf(thermalManager.degTargetBed(), 1, 1, str_1)); + sprintf_P(outBuf, PSTR("%d /%d"), (int)thermalManager.degBed(), (int)thermalManager.degTargetBed()); #else strcpy_P(outBuf, PSTR("0 /0")); #endif @@ -912,9 +908,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcat_P(outBuf, PSTR(" T1:")); outBuf += 4; #if HAS_MULTI_HOTEND - strcat(outBuf, dtostrf(thermalManager.degHotend(1), 1, 1, str_1)); - strcat_P(outBuf, PSTR(" /")); - strcat(outBuf, dtostrf(thermalManager.degTargetHotend(1), 1, 1, str_1)); + sprintf_P(outBuf, PSTR("%d /%d"), (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); #else strcat_P(outBuf, PSTR("0 /0")); #endif From ee21e31a17fd6853c2a219c2259693f303d379c8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 5 Apr 2021 21:27:05 -0500 Subject: [PATCH 1257/1370] getHighESpeed => autotemp_task --- Marlin/src/module/planner.cpp | 4 ++-- Marlin/src/module/planner.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 891f6a7ab0..e111a808b2 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1382,7 +1382,7 @@ void Planner::check_axes_activity() { sync_fan_speeds(tail_fan_speed); #endif - TERN_(AUTOTEMP, getHighESpeed()); + TERN_(AUTOTEMP, autotemp_task()); #if ENABLED(BARICUDA) TERN_(HAS_HEATER_1, analogWrite(pin_t(HEATER_1_PIN), tail_valve_pressure)); @@ -1432,7 +1432,7 @@ void Planner::check_axes_activity() { * based on the extrusion speed, which is calculated from the blocks * currently in the planner. */ - void Planner::getHighESpeed() { + void Planner::autotemp_task() { static float oldt = 0; if (!autotemp_enabled) return; diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 6b99c8bcc1..570fcc08af 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -926,7 +926,7 @@ class Planner { static bool autotemp_enabled; static void autotemp_update(); static void autotemp_M104_M109(); - static void getHighESpeed(); + static void autotemp_task(); #endif #if HAS_LINEAR_E_JERK From 2c73964b2b78f5af60d166d1c8becf8569d647fb Mon Sep 17 00:00:00 2001 From: BigTreeTech <38851044+bigtreetech@users.noreply.github.com> Date: Tue, 6 Apr 2021 10:40:50 +0800 Subject: [PATCH 1258/1370] BTT SKR-SE-BX (STM32H743IIT6 ARM Cortex M7) and BIQU_BX_TFT70 (#21536) --- .github/workflows/test-builds.yml | 1 + Marlin/Configuration.h | 5 + Marlin/src/HAL/STM32/MarlinSPI.cpp | 2 +- Marlin/src/HAL/STM32/inc/SanityCheck.h | 4 +- Marlin/src/HAL/STM32/tft/tft_ltdc.cpp | 390 ++++++++ Marlin/src/HAL/STM32/tft/tft_ltdc.h | 155 +++ Marlin/src/HAL/STM32/timers.cpp | 2 +- Marlin/src/core/boards.h | 1 + Marlin/src/inc/Conditionals_LCD.h | 25 +- Marlin/src/inc/SanityCheck.h | 10 +- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 4 +- .../screens/bed_mesh_view_screen.cpp | 2 +- Marlin/src/lcd/tft/tft.h | 3 + Marlin/src/lcd/tft/ui_1024x600.cpp | 927 ++++++++++++++++++ Marlin/src/lcd/tft/ui_1024x600.h | 43 + Marlin/src/lcd/tft/ui_common.h | 4 + Marlin/src/lcd/tft_io/tft_io.cpp | 15 +- Marlin/src/lcd/tft_io/tft_io.h | 7 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h | 226 +++++ .../PlatformIO/boards/BTT_SKR_SE_BX.json | 56 ++ .../variants/BTT_SKR_SE_BX/PeripheralPins.c | 491 ++++++++++ .../variants/BTT_SKR_SE_BX/PinNamesVar.h | 50 + .../variants/BTT_SKR_SE_BX/hal_conf_extra.h | 479 +++++++++ .../variants/BTT_SKR_SE_BX/ldscript.ld | 208 ++++ .../variants/BTT_SKR_SE_BX/variant.cpp | 332 +++++++ .../variants/BTT_SKR_SE_BX/variant.h | 222 +++++ buildroot/tests/BTT_SKR_SE_BX | 18 + ini/features.ini | 2 +- ini/stm32f7.ini | 25 + 30 files changed, 3694 insertions(+), 17 deletions(-) create mode 100644 Marlin/src/HAL/STM32/tft/tft_ltdc.cpp create mode 100644 Marlin/src/HAL/STM32/tft/tft_ltdc.h create mode 100644 Marlin/src/lcd/tft/ui_1024x600.cpp create mode 100644 Marlin/src/lcd/tft/ui_1024x600.h create mode 100644 Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h create mode 100644 buildroot/share/PlatformIO/boards/BTT_SKR_SE_BX.json create mode 100644 buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/hal_conf_extra.h create mode 100644 buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.h create mode 100755 buildroot/tests/BTT_SKR_SE_BX diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 7b7052e0e1..5a598299f3 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -89,6 +89,7 @@ jobs: - mks_robin_nano35_stm32 - NUCLEO_F767ZI - REMRAM_V1 + - BTT_SKR_SE_BX # Put lengthy tests last diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0847892934..1022dd54dd 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2496,6 +2496,11 @@ // //#define ANET_ET5_TFT35 +// +// 1024x600, 7", RGB Stock Display from BIQU-BX +// +//#define BIQU_BX_TFT70 + // // Generic TFT with detailed options // diff --git a/Marlin/src/HAL/STM32/MarlinSPI.cpp b/Marlin/src/HAL/STM32/MarlinSPI.cpp index 5086b41784..896ec1433f 100644 --- a/Marlin/src/HAL/STM32/MarlinSPI.cpp +++ b/Marlin/src/HAL/STM32/MarlinSPI.cpp @@ -19,7 +19,7 @@ * along with this program. If not, see . * */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && !defined(STM32H7xx) #include "MarlinSPI.h" diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 7ee606af7f..12ff2abec7 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -52,6 +52,6 @@ #error "SERIAL_STATS_DROPPED_RX is not supported on STM32." #endif -#if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) && NOT_TARGET(STM32F4xx, STM32F1xx) - #error "TFT_COLOR_UI, TFT_LVGL_UI and TFT_CLASSIC_UI are currently only supported on STM32F4 and STM32F1 hardware." +#if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) && NOT_TARGET(STM32H7xx, STM32F4xx, STM32F1xx) + #error "TFT_COLOR_UI, TFT_LVGL_UI and TFT_CLASSIC_UI are currently only supported on STM32H7, STM32F4 and STM32F1 hardware." #endif diff --git a/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp b/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp new file mode 100644 index 0000000000..6039593f46 --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp @@ -0,0 +1,390 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../../inc/MarlinConfig.h" + +#if HAS_LTDC_TFT + +#include "tft_ltdc.h" +#include "pinconfig.h" + +#define FRAME_BUFFER_ADDRESS 0XC0000000 // SDRAM address + +#define SDRAM_TIMEOUT ((uint32_t)0xFFFF) +#define REFRESH_COUNT ((uint32_t)0x02A5) // SDRAM refresh counter + +#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) +#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) +#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004) +#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) +#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) +#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) +#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) + + +void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command) { + + __IO uint32_t tmpmrd =0; + /* Step 1: Configure a clock configuration enable command */ + Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; + Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; + Command->AutoRefreshNumber = 1; + Command->ModeRegisterDefinition = 0; + /* Send the command */ + HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT); + + /* Step 2: Insert 100 us minimum delay */ + /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */ + HAL_Delay(1); + + /* Step 3: Configure a PALL (precharge all) command */ + Command->CommandMode = FMC_SDRAM_CMD_PALL; + Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; + Command->AutoRefreshNumber = 1; + Command->ModeRegisterDefinition = 0; + /* Send the command */ + HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT); + + /* Step 4 : Configure a Auto-Refresh command */ + Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; + Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; + Command->AutoRefreshNumber = 8; + Command->ModeRegisterDefinition = 0; + /* Send the command */ + HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT); + + /* Step 5: Program the external memory mode register */ + tmpmrd = (uint32_t)(SDRAM_MODEREG_BURST_LENGTH_1 | + SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | + SDRAM_MODEREG_CAS_LATENCY_2 | + SDRAM_MODEREG_OPERATING_MODE_STANDARD | + SDRAM_MODEREG_WRITEBURST_MODE_SINGLE); + + Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE; + Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; + Command->AutoRefreshNumber = 1; + Command->ModeRegisterDefinition = tmpmrd; + /* Send the command */ + HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT); + + /* Step 6: Set the refresh rate counter */ + /* Set the device refresh rate */ + HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT); +} + +void SDRAM_Config() { + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_FMC_CLK_ENABLE(); + + SDRAM_HandleTypeDef hsdram; + FMC_SDRAM_TimingTypeDef SDRAM_Timing; + FMC_SDRAM_CommandTypeDef command; + + /* Configure the SDRAM device */ + hsdram.Instance = FMC_SDRAM_DEVICE; + hsdram.Init.SDBank = FMC_SDRAM_BANK1; + hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9; + hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; + hsdram.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; + hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; + hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2; + hsdram.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; + hsdram.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; + hsdram.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; + hsdram.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0; + + /* Timing configuration for 100Mhz as SDRAM clock frequency (System clock is up to 200Mhz) */ + SDRAM_Timing.LoadToActiveDelay = 2; + SDRAM_Timing.ExitSelfRefreshDelay = 8; + SDRAM_Timing.SelfRefreshTime = 6; + SDRAM_Timing.RowCycleDelay = 6; + SDRAM_Timing.WriteRecoveryTime = 2; + SDRAM_Timing.RPDelay = 2; + SDRAM_Timing.RCDDelay = 2; + + /* Initialize the SDRAM controller */ + if (HAL_SDRAM_Init(&hsdram, &SDRAM_Timing) != HAL_OK) + { + /* Initialization Error */ + } + + /* Program the SDRAM external device */ + SDRAM_Initialization_Sequence(&hsdram, &command); +} + +void LTDC_Config() { + + __HAL_RCC_LTDC_CLK_ENABLE(); + __HAL_RCC_DMA2D_CLK_ENABLE(); + + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; + + /* The PLL3R is configured to provide the LTDC PCLK clock */ + /* PLL3_VCO Input = HSE_VALUE / PLL3M = 25Mhz / 5 = 5 Mhz */ + /* PLL3_VCO Output = PLL3_VCO Input * PLL3N = 5Mhz * 160 = 800 Mhz */ + /* PLLLCDCLK = PLL3_VCO Output/PLL3R = 800Mhz / 16 = 50Mhz */ + /* LTDC clock frequency = PLLLCDCLK = 50 Mhz */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; + PeriphClkInitStruct.PLL3.PLL3M = 5; + PeriphClkInitStruct.PLL3.PLL3N = 160; + PeriphClkInitStruct.PLL3.PLL3FRACN = 0; + PeriphClkInitStruct.PLL3.PLL3P = 2; + PeriphClkInitStruct.PLL3.PLL3Q = 2; + PeriphClkInitStruct.PLL3.PLL3R = (800 / LTDC_LCD_CLK); + PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE; + PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_2; + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); + + LTDC_HandleTypeDef hltdc_F; + LTDC_LayerCfgTypeDef pLayerCfg; + + /* LTDC Initialization -------------------------------------------------------*/ + + /* Polarity configuration */ + /* Initialize the horizontal synchronization polarity as active low */ + hltdc_F.Init.HSPolarity = LTDC_HSPOLARITY_AL; + /* Initialize the vertical synchronization polarity as active low */ + hltdc_F.Init.VSPolarity = LTDC_VSPOLARITY_AL; + /* Initialize the data enable polarity as active low */ + hltdc_F.Init.DEPolarity = LTDC_DEPOLARITY_AL; + /* Initialize the pixel clock polarity as input pixel clock */ + hltdc_F.Init.PCPolarity = LTDC_PCPOLARITY_IPC; + + /* Timing configuration */ + hltdc_F.Init.HorizontalSync = (LTDC_LCD_HSYNC - 1); + hltdc_F.Init.VerticalSync = (LTDC_LCD_VSYNC - 1); + hltdc_F.Init.AccumulatedHBP = (LTDC_LCD_HSYNC + LTDC_LCD_HBP - 1); + hltdc_F.Init.AccumulatedVBP = (LTDC_LCD_VSYNC + LTDC_LCD_VBP - 1); + hltdc_F.Init.AccumulatedActiveH = (TFT_HEIGHT + LTDC_LCD_VSYNC + LTDC_LCD_VBP - 1); + hltdc_F.Init.AccumulatedActiveW = (TFT_WIDTH + LTDC_LCD_HSYNC + LTDC_LCD_HBP - 1); + hltdc_F.Init.TotalHeigh = (TFT_HEIGHT + LTDC_LCD_VSYNC + LTDC_LCD_VBP + LTDC_LCD_VFP - 1); + hltdc_F.Init.TotalWidth = (TFT_WIDTH + LTDC_LCD_HSYNC + LTDC_LCD_HBP + LTDC_LCD_HFP - 1); + + /* Configure R,G,B component values for LCD background color : all black background */ + hltdc_F.Init.Backcolor.Blue = 0; + hltdc_F.Init.Backcolor.Green = 0; + hltdc_F.Init.Backcolor.Red = 0; + + hltdc_F.Instance = LTDC; + +/* Layer0 Configuration ------------------------------------------------------*/ + + /* Windowing configuration */ + pLayerCfg.WindowX0 = 0; + pLayerCfg.WindowX1 = TFT_WIDTH; + pLayerCfg.WindowY0 = 0; + pLayerCfg.WindowY1 = TFT_HEIGHT; + + /* Pixel Format configuration*/ + pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; + + /* Start Address configuration : frame buffer is located at SDRAM memory */ + pLayerCfg.FBStartAdress = (uint32_t)(FRAME_BUFFER_ADDRESS); + + /* Alpha constant (255 == totally opaque) */ + pLayerCfg.Alpha = 255; + + /* Default Color configuration (configure A,R,G,B component values) : no background color */ + pLayerCfg.Alpha0 = 0; /* fully transparent */ + pLayerCfg.Backcolor.Blue = 0; + pLayerCfg.Backcolor.Green = 0; + pLayerCfg.Backcolor.Red = 0; + + /* Configure blending factors */ + pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; + pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; + + /* Configure the number of lines and number of pixels per line */ + pLayerCfg.ImageWidth = TFT_WIDTH; + pLayerCfg.ImageHeight = TFT_HEIGHT; + + /* Configure the LTDC */ + if (HAL_LTDC_Init(&hltdc_F) != HAL_OK) + { + /* Initialization Error */ + } + + /* Configure the Layer*/ + if (HAL_LTDC_ConfigLayer(&hltdc_F, &pLayerCfg, 0) != HAL_OK) + { + /* Initialization Error */ + } +} + +uint16_t TFT_LTDC::x_min = 0; +uint16_t TFT_LTDC::x_max = 0; +uint16_t TFT_LTDC::y_min = 0; +uint16_t TFT_LTDC::y_max = 0; +uint16_t TFT_LTDC::x_cur = 0; +uint16_t TFT_LTDC::y_cur = 0; +uint8_t TFT_LTDC::reg = 0; +volatile uint16_t* TFT_LTDC::framebuffer = (volatile uint16_t* )FRAME_BUFFER_ADDRESS; + +void TFT_LTDC::Init() { + + // SDRAM pins init + for (uint16_t i = 0; PinMap_SDRAM[i].pin != NC; i++) + pinmap_pinout(PinMap_SDRAM[i].pin, PinMap_SDRAM); + + // SDRAM peripheral config + SDRAM_Config(); + + // LTDC pins init + for (uint16_t i = 0; PinMap_LTDC[i].pin != NC; i++) + pinmap_pinout(PinMap_LTDC[i].pin, PinMap_LTDC); + + // LTDC peripheral config + LTDC_Config(); +} + +uint32_t TFT_LTDC::GetID() { + return 0xABAB; +} + +uint32_t TFT_LTDC::ReadID(tft_data_t Reg) { + return 0xABAB; +} + +bool TFT_LTDC::isBusy() { + return false; +} + +uint16_t TFT_LTDC::ReadPoint(uint16_t x, uint16_t y) { + return framebuffer[(TFT_WIDTH * y) + x]; +} + +void TFT_LTDC::DrawPoint(uint16_t x, uint16_t y, uint16_t color) { + framebuffer[(TFT_WIDTH * y) + x] = color; +} + +void TFT_LTDC::DrawRect(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t color) { + + if (sx == ex || sy == ey) return; + + uint16_t offline = TFT_WIDTH - (ex - sx); + uint32_t addr = (uint32_t)&framebuffer[(TFT_WIDTH * sy) + sx]; + + DMA2D->CR &= ~(1 << 0); + DMA2D->CR = 3 << 16; + DMA2D->OPFCCR = 0X02; + DMA2D->OOR = offline; + DMA2D->OMAR = addr; + DMA2D->NLR = (ey - sy) | ((ex - sx) << 16); + DMA2D->OCOLR = color; + DMA2D->CR |= 1<<0; + + uint32_t timeout = 0; + while((DMA2D->ISR & (1<<1)) == 0) + { + timeout++; + if(timeout>0X1FFFFF)break; + } + DMA2D->IFCR |= 1<<1; +} + +void TFT_LTDC::DrawImage(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *colors) { + + if (sx == ex || sy == ey) return; + + uint16_t offline = TFT_WIDTH - (ex - sx); + uint32_t addr = (uint32_t)&framebuffer[(TFT_WIDTH * sy) + sx]; + + DMA2D->CR &= ~(1 << 0); + DMA2D->CR = 0 << 16; + DMA2D->FGPFCCR = 0X02; + DMA2D->FGOR = 0; + DMA2D->OOR = offline; + DMA2D->FGMAR = (uint32_t)colors; + DMA2D->OMAR = addr; + DMA2D->NLR = (ey - sy) | ((ex - sx) << 16); + DMA2D->CR |= 1<<0; + + uint32_t timeout = 0; + while((DMA2D->ISR & (1<<1)) == 0) + { + timeout++; + if(timeout>0X1FFFFF)break; + } + DMA2D->IFCR |= 1<<1; +} + +void TFT_LTDC::WriteData(uint16_t data) { + switch (reg) { + case 0x01: x_cur = x_min = data; return; + case 0x02: x_max = data; return; + case 0x03: y_cur = y_min = data; return; + case 0x04: y_max = data; return; + } + Transmit(data); +} + +void TFT_LTDC::Transmit(tft_data_t Data) { + DrawPoint(x_cur, y_cur, Data); + x_cur++; + if (x_cur > x_max) { + x_cur = x_min; + y_cur++; + if (y_cur > y_max) y_cur = y_min; + } +} + +void TFT_LTDC::WriteReg(uint16_t Reg) { + reg = Reg; +} + +void TFT_LTDC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + + while (x_cur != x_min && Count) { + Transmit(*Data); + if (MemoryIncrease == DMA_PINC_ENABLE) Data++; + Count--; + } + + uint16_t width = x_max - x_min + 1; + uint16_t height = Count / width; + uint16_t x_end_cnt = Count - (width * height); + + if (height) { + if (MemoryIncrease == DMA_PINC_ENABLE) { + DrawImage(x_min, y_cur, x_min + width, y_cur + height, Data); + Data += width * height; + } else { + DrawRect(x_min, y_cur, x_min + width, y_cur + height, *Data); + } + y_cur += height; + } + + while (x_end_cnt) { + Transmit(*Data); + if (MemoryIncrease == DMA_PINC_ENABLE) Data++; + x_end_cnt--; + } +} + +#endif // HAS_LTDC_TFT +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/tft/tft_ltdc.h b/Marlin/src/HAL/STM32/tft/tft_ltdc.h new file mode 100644 index 0000000000..7b63d6929b --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_ltdc.h @@ -0,0 +1,155 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#ifdef STM32H7xx + #include "stm32h7xx_hal.h" +#else + #error "LTDC TFT is currently only supported on STM32H7 hardware." +#endif + +#define DATASIZE_8BIT SPI_DATASIZE_8BIT +#define DATASIZE_16BIT SPI_DATASIZE_16BIT +#define TFT_IO_DRIVER TFT_LTDC + +#define TFT_DATASIZE DATASIZE_16BIT +typedef uint16_t tft_data_t; + +class TFT_LTDC { + private: + static volatile uint16_t *framebuffer; + static uint16_t x_min, x_max, y_min, y_max, x_cur, y_cur; + static uint8_t reg; + + static uint32_t ReadID(tft_data_t Reg); + + static uint16_t ReadPoint(uint16_t x, uint16_t y); + static void DrawPoint(uint16_t x, uint16_t y, uint16_t color); + static void DrawRect(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t color); + static void DrawImage(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *colors); + static void Transmit(tft_data_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + + public: + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort() { /*__HAL_DMA_DISABLE(&DMAtx);*/ } + + static void DataTransferBegin(uint16_t DataWidth = TFT_DATASIZE) {} + static void DataTransferEnd() {}; + + static void WriteData(uint16_t Data); + static void WriteReg(uint16_t Reg); + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + while (Count > 0) { + TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count); + Count = Count > 0xFFFF ? Count - 0xFFFF : 0; + } + } +}; + +const PinMap PinMap_LTDC[] = { + {PF_10, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_DE + {PG_7, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_CLK + {PI_9, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_VSYNC + {PI_10, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_HSYNC + + {PG_6, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_R7 + {PH_12, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_R6 + {PH_11, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_R5 + {PH_10, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_R4 + {PH_9, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_R3 + + {PI_2, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_G7 + {PI_1, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_G6 + {PI_0, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_G5 + {PH_15, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_G4 + {PH_14, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_G3 + {PH_13, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_G2 + + {PI_7, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_B7 + {PI_6, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_B6 + {PI_5, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_B5 + {PI_4, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_B4 + {PG_11, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_B3 + {NC, NP, 0} +}; + +const PinMap PinMap_SDRAM[] = { + {PC_0, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDNWE + {PC_2, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDNE0 + {PC_3, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDCKE0 + {PE_0, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_NBL0 + {PE_1, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_NBL1 + {PF_11, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDNRAS + {PG_8, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDCLK + {PG_15, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDNCAS + {PG_4, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_BA0 + {PG_5, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_BA1 + {PD_14, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D0 + {PD_15, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D1 + {PD_0, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D2 + {PD_1, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D3 + {PE_7, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D4 + {PE_8, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D5 + {PE_9, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D6 + {PE_10, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D7 + {PE_11, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D8 + {PE_12, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D9 + {PE_13, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D10 + {PE_14, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D11 + {PE_15, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D12 + {PD_8, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D13 + {PD_9, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D14 + {PD_10, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_D15 + {PF_0, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A0 + {PF_1, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A1 + {PF_2, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A2 + {PF_3, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A3 + {PF_4, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A4 + {PF_5, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A5 + {PF_12, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A6 + {PF_13, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A7 + {PF_14, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A8 + {PF_15, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A9 + {PG_0, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A10 + {PG_1, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A11 + {PG_2, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_A12 + {NC, NP, 0} +}; + +const PinMap PinMap_QUADSPI[] = { + {PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)}, // QUADSPI_CLK + {PB_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)}, // QUADSPI_BK1_NCS + {PF_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)}, // QUADSPI_BK1_IO3 + {PF_7, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)}, // QUADSPI_BK1_IO2 + {PF_8, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 + {PF_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 + {NC, NP, 0} +}; diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index e8e18a47d4..03353c2ca3 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -74,7 +74,7 @@ #elif defined(STM32F401xC) || defined(STM32F401xE) #define MCU_STEP_TIMER 9 #define MCU_TEMP_TIMER 10 -#elif defined(STM32F4xx) || defined(STM32F7xx) +#elif defined(STM32F4xx) || defined(STM32F7xx) || defined(STM32H7xx) #define MCU_STEP_TIMER 6 // STM32F401 has no TIM6, TIM7, or TIM8 #define MCU_TEMP_TIMER 14 // TIM7 is consumed by Software Serial if used. #endif diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index d2e2236a14..beaea57354 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -390,6 +390,7 @@ #define BOARD_TEENSY41 5001 // Teensy 4.1 #define BOARD_T41U5XBB 5002 // T41U5XBB Teensy 4.1 breakout board #define BOARD_NUCLEO_F767ZI 5003 // ST NUCLEO-F767ZI Dev Board +#define BOARD_BTT_SKR_SE_BX 5004 // BigTreeTech SKR SE BX (STM32H743II) // // Espressif ESP32 WiFi diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 88bd382020..7ae1d8dccd 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1119,6 +1119,10 @@ #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) #define TFT_RES_480x320 #define TFT_INTERFACE_FSMC +#elif ENABLED(BIQU_BX_TFT70) // RGB + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) + #define TFT_RES_1024x600 + #define TFT_INTERFACE_LTDC #elif ENABLED(TFT_GENERIC) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #if NONE(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320) @@ -1141,9 +1145,13 @@ #define TFT_WIDTH 480 #define TFT_HEIGHT 320 #define GRAPHICAL_TFT_UPSCALE 3 +#elif ENABLED(TFT_RES_1024x600) + #define TFT_WIDTH 1024 + #define TFT_HEIGHT 600 + #define GRAPHICAL_TFT_UPSCALE 4 #endif -// FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h +// FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi|ltdc).h #if ENABLED(TFT_INTERFACE_FSMC) #define HAS_FSMC_TFT 1 #if TFT_SCALED_DOGLCD @@ -1158,6 +1166,13 @@ #elif HAS_TFT_LVGL_UI #define HAS_TFT_LVGL_UI_SPI 1 #endif +#elif ENABLED(TFT_INTERFACE_LTDC) + #define HAS_LTDC_TFT 1 + #if TFT_SCALED_DOGLCD + #define HAS_LTDC_GRAPHICAL_TFT 1 + #elif HAS_TFT_LVGL_UI + #define HAS_TFT_LVGL_UI_LTDC 1 + #endif #endif #if ENABLED(TFT_COLOR_UI) @@ -1179,6 +1194,10 @@ #elif ENABLED(TFT_INTERFACE_FSMC) #define TFT_480x272 #endif + #elif TFT_HEIGHT == 600 + #if ENABLED(TFT_INTERFACE_LTDC) + #define TFT_1024x600_LTDC + #endif #endif #endif @@ -1188,9 +1207,13 @@ #define HAS_UI_480x320 1 #elif EITHER(TFT_480x272, TFT_480x272_SPI) #define HAS_UI_480x272 1 +#elif defined(TFT_1024x600_LTDC) + #define HAS_UI_1024x600 1 #endif #if ANY(HAS_UI_320x240, HAS_UI_480x320, HAS_UI_480x272) #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) // Fewer lines with touch buttons onscreen +#elif HAS_UI_1024x600 + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 12, 13) // Fewer lines with touch buttons onscreen #endif // This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 48a536b531..f6c5cc202a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2404,7 +2404,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #undef IS_EXTUI #undef IS_LEGACY_TFT -#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28, ANET_ET4_TFT28, ANET_ET5_TFT35) +#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28, ANET_ET4_TFT28, ANET_ET5_TFT35, BIQU_BX_TFT70) #if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI) #error "TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI is required for your TFT. Please enable one." #elif 1 < ENABLED(TFT_COLOR_UI) + ENABLED(TFT_CLASSIC_UI) + ENABLED(TFT_LVGL_UI) @@ -2426,16 +2426,16 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "Please enable only one LCD_SCREEN_ROT_* option: 0, 90, 180, or 270." #endif -#if MANY(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320) - #error "Please select only one of TFT_RES_480x320, TFT_RES_480x320, or TFT_RES_480x272." +#if MANY(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320, TFT_RES_1024x600) + #error "Please select only one of TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320, or TFT_RES_1024x600." #endif #if HAS_TFT_LVGL_UI && DISABLED(TFT_RES_480x320) #error "(FMSC|SPI)TFT_LVGL_UI requires TFT_RES_480x320." #endif -#if defined(GRAPHICAL_TFT_UPSCALE) && !WITHIN(GRAPHICAL_TFT_UPSCALE, 2, 3) - #error "GRAPHICAL_TFT_UPSCALE must be set to 2 or 3." +#if defined(GRAPHICAL_TFT_UPSCALE) && !WITHIN(GRAPHICAL_TFT_UPSCALE, 2, 4) + #error "GRAPHICAL_TFT_UPSCALE must be 2, 3, or 4." #endif /** diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 3842611fdf..682178efe5 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -55,14 +55,14 @@ #include "../../inc/MarlinConfig.h" -#if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || HAS_SPI_GRAPHICAL_TFT) +#if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || HAS_SPI_GRAPHICAL_TFT || HAS_LTDC_GRAPHICAL_TFT) #include "HAL_LCD_com_defines.h" #include "marlinui_DOGM.h" #include -#if EITHER(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) +#if ANY(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI, HAS_LTDC_GRAPHICAL_TFT) #define HAS_LCD_IO 1 #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.cpp index 8321bd8bb5..dfc51d9505 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_view_screen.cpp @@ -55,7 +55,7 @@ constexpr static float gaugeThickness = 0.25; static float meshGetter(uint8_t x, uint8_t y, void*) { xy_uint8_t pos; pos.x = x; - pos.y = y; + pos.y = y; return ExtUI::getMeshPoint(pos); } diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h index 99d335d135..1576518b4b 100644 --- a/Marlin/src/lcd/tft/tft.h +++ b/Marlin/src/lcd/tft/tft.h @@ -46,6 +46,9 @@ #elif HAS_UI_480x272 #define TFT_WIDTH 480 #define TFT_HEIGHT 272 +#elif HAS_UI_1024x600 + #define TFT_WIDTH 1024 + #define TFT_HEIGHT 600 #else #error "Unsupported display resolution!" #endif diff --git a/Marlin/src/lcd/tft/ui_1024x600.cpp b/Marlin/src/lcd/tft/ui_1024x600.cpp new file mode 100644 index 0000000000..e04d589858 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_1024x600.cpp @@ -0,0 +1,927 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_UI_1024x600 + +#include "ui_common.h" + +#include "../marlinui.h" +#include "../menu/menu.h" +#include "../../libs/numtostr.h" + +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/printcounter.h" +#include "../../module/planner.h" +#include "../../module/motion.h" + +#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + #include "../../feature/filwidth.h" + #include "../../gcode/parser.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +void MarlinUI::tft_idle() { + #if ENABLED(TOUCH_SCREEN) + if (draw_menu_navigation) { + add_control(104, TFT_HEIGHT - 34, PAGE_UP, imgPageUp, encoderTopLine > 0); + add_control(344, TFT_HEIGHT - 34, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); + add_control(224, TFT_HEIGHT - 34, BACK, imgBack); + draw_menu_navigation = false; + } + #endif + + tft.queue.async(); + TERN_(TOUCH_SCREEN, touch.idle()); +} + +#if ENABLED(SHOW_BOOTSCREEN) + void MarlinUI::show_bootscreen() { + tft.queue.reset(); + + tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); + #if ENABLED(BOOT_MARLIN_LOGO_SMALL) + #define BOOT_LOGO_W 195 // MarlinLogo195x59x16 + #define BOOT_LOGO_H 59 + #define SITE_URL_Y (TFT_HEIGHT - 70) + tft.set_background(COLOR_BACKGROUND); + #else + #define BOOT_LOGO_W TFT_WIDTH // MarlinLogo480x320x16 + #define BOOT_LOGO_H TFT_HEIGHT + #define SITE_URL_Y (TFT_HEIGHT - 90) + #endif + tft.add_image((TFT_WIDTH - BOOT_LOGO_W) / 2, (TFT_HEIGHT - BOOT_LOGO_H) / 2, imgBootScreen); + #ifdef WEBSITE_URL + tft_string.set(WEBSITE_URL); + tft.add_text(tft_string.center(TFT_WIDTH), SITE_URL_Y, COLOR_WEBSITE_URL, tft_string); + #endif + + tft.queue.sync(); + safe_delay(BOOTSCREEN_TIMEOUT); + clear_lcd(); + } +#endif + +void MarlinUI::draw_kill_screen() { + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_KILL_SCREEN_BG); + + uint16_t line = 2; + + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + line++; + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_HALTED)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_PLEASE_RESET)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + tft.queue.sync(); +} + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { + MarlinImage image = imgHotEnd; + uint16_t Color; + celsius_t currentTemperature, targetTemperature; + + if (Heater >= 0) { // HotEnd + currentTemperature = thermalManager.degHotend(Heater); + targetTemperature = thermalManager.degTargetHotend(Heater); + } + #if HAS_HEATED_BED + else if (Heater == H_BED) { + currentTemperature = thermalManager.degBed(); + targetTemperature = thermalManager.degTargetBed(); + } + #endif + #if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + currentTemperature = thermalManager.degChamber(); + #if HAS_HEATED_CHAMBER + targetTemperature = thermalManager.degTargetChamber(); + #else + targetTemperature = ABSOLUTE_ZERO; + #endif + } + #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + currentTemperature = thermalManager.degCooler(); + targetTemperature = TERN(HAS_COOLER, thermalManager.degTargetCooler(), ABSOLUTE_ZERO); + } + #endif + else return; + + TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, Heater)); + tft.canvas(x, y, 80, 120); + tft.set_background(COLOR_BACKGROUND); + + Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; + + if (Heater >= 0) { // HotEnd + if (currentTemperature >= 50) Color = COLOR_HOTEND; + } + #if HAS_HEATED_BED + else if (Heater == H_BED) { + if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + image = targetTemperature > 0 ? imgBedHeated : imgBed; + } + #endif + #if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + if (currentTemperature >= 50) Color = COLOR_CHAMBER; + image = targetTemperature > 0 ? imgChamberHeated : imgChamber; + } + #endif + + tft.add_image(8, 28, image, Color); + + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 2, 82, Color, tft_string); + + if (targetTemperature >= 0) { + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 2, 8, Color, tft_string); + } +} + +void draw_fan_status(uint16_t x, uint16_t y, const bool blink) { + TERN_(TOUCH_SCREEN, touch.add_control(FAN, x, y, 80, 120)); + tft.canvas(x, y, 80, 120); + tft.set_background(COLOR_BACKGROUND); + + uint8_t fanSpeed = thermalManager.fan_speed[0]; + MarlinImage image; + + if (fanSpeed >= 127) + image = blink ? imgFanFast1 : imgFanFast0; + else if (fanSpeed > 0) + image = blink ? imgFanSlow1 : imgFanSlow0; + else + image = imgFanIdle; + + tft.add_image(8, 20, image, COLOR_FAN); + + tft_string.set((uint8_t *)ui8tostr4pctrj(thermalManager.fan_speed[0])); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 6, 82, COLOR_FAN, tft_string); +} + +void MarlinUI::draw_status_screen() { + const bool blink = get_blink(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + // heaters and fan + uint16_t i, x, y = TFT_STATUS_TOP_Y; + + for (i = 0 ; i < ITEMS_COUNT; i++) { + x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); + switch (i) { + #ifdef ITEM_E0 + case ITEM_E0: draw_heater_status(x, y, H_E0); break; + #endif + #ifdef ITEM_E1 + case ITEM_E1: draw_heater_status(x, y, H_E1); break; + #endif + #ifdef ITEM_E2 + case ITEM_E2: draw_heater_status(x, y, H_E2); break; + #endif + #ifdef ITEM_BED + case ITEM_BED: draw_heater_status(x, y, H_BED); break; + #endif + #ifdef ITEM_CHAMBER + case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; + #endif + #ifdef ITEM_FAN + case ITEM_FAN: draw_fan_status(x, y, blink); break; + #endif + } + } + + y += 200; + + // coordinates + tft.canvas(4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, TFT_WIDTH - 8, FONT_LINE_HEIGHT, COLOR_AXIS_HOMED); + + tft.add_text(200, 3, COLOR_AXIS_HOMED , "X"); + tft.add_text(500, 3, COLOR_AXIS_HOMED , "Y"); + tft.add_text(800, 3, COLOR_AXIS_HOMED , "Z"); + + bool not_homed = axis_should_home(X_AXIS); + tft_string.set(blink && not_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft.add_text(300 - tft_string.width(), 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + + not_homed = axis_should_home(Y_AXIS); + tft_string.set(blink && not_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text(600 - tft_string.width(), 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + + uint16_t offset = 32; + not_homed = axis_should_home(Z_AXIS); + if (blink && not_homed) + tft_string.set("?"); + else { + const float z = LOGICAL_Z_POSITION(current_position.z); + tft_string.set(ftostr52sp((int16_t)z)); + tft_string.rtrim(); + offset += tft_string.width(); + + tft_string.set(ftostr52sp(z)); + offset -= tft_string.width(); + } + tft.add_text(900 - tft_string.width() - offset, 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT)); + + y += 100; + // feed rate + tft.canvas(274, y, 100, 32); + tft.set_background(COLOR_BACKGROUND); + uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFeedRate, color); + tft_string.set(i16tostr3rj(feedrate_percentage)); + tft_string.add('%'); + tft.add_text(36, 1, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 96, 176, 100, 32)); + + // flow rate + tft.canvas(650, y, 100, 32); + tft.set_background(COLOR_BACKGROUND); + color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFlowRate, color); + tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); + tft_string.add('%'); + tft.add_text(36, 1, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 284, 176, 100, 32, active_extruder)); + + #if ENABLED(TOUCH_SCREEN) + add_control(404, y, menu_main, imgSettings); + TERN_(SDSUPPORT, add_control(12, y, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + #endif + + y += 100; + // print duration + char buffer[14]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toDigital(buffer); + + tft.canvas((TFT_WIDTH - 128) / 2, y, 128, 29); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(buffer); + tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); + + y += 50; + // progress bar + const uint8_t progress = ui.get_progress_percent(); + tft.canvas(4, y, TFT_WIDTH - 8, 9); + tft.set_background(COLOR_PROGRESS_BG); + tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME); + if (progress) + tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR); + + y += 50; + // status message + tft.canvas(0, y, TFT_WIDTH, FONT_LINE_HEIGHT - 5); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); +} + +// Low-level draw_edit_screen can be used to draw an edit screen from anyplace +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { + ui.encoder_direction_normal(); + TERN_(TOUCH_SCREEN, touch.clear()); + + uint16_t line = 1; + + menu_line(line++); + tft_string.set(pstr, itemIndex, itemString); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + + TERN_(AUTO_BED_LEVELING_UBL, if (ui.external_control) line++); // ftostr52() will overwrite *value so *value has to be displayed first + + menu_line(line); + tft_string.set(value); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + if (ui.external_control) { + menu_line(line - 1); + + tft_string.set(X_LBL); + tft.add_text((TFT_WIDTH / 2 - 120), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.x))); + tft_string.trim(); + tft.add_text((TFT_WIDTH / 2 - 16) - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft_string.set(Y_LBL); + tft.add_text((TFT_WIDTH / 2 + 16), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.y))); + tft_string.trim(); + tft.add_text((TFT_WIDTH / 2 + 120) - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } + #endif + + extern screenFunc_t _manual_move_func_ptr; + if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { + + #define SLIDER_LENGTH 336 + #define SLIDER_Y_POSITION 186 + + tft.canvas((TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION, SLIDER_LENGTH, 16); + tft.set_background(COLOR_BACKGROUND); + + int16_t position = (SLIDER_LENGTH - 2) * ui.encoderPosition / maxEditValue; + tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); + tft.add_bar(1, 6, position, 4, COLOR_SLIDER); + tft.add_bar(position + 1, 6, SLIDER_LENGTH - 2 - position, 4, COLOR_SLIDER_INACTIVE); + tft.add_bar(SLIDER_LENGTH - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); + + #if ENABLED(TOUCH_SCREEN) + tft.add_image((SLIDER_LENGTH - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); + touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGTH, 32, maxEditValue); + #endif + } + + tft.draw_edit_screen_buttons(); +} + +void TFT::draw_edit_screen_buttons() { + #if ENABLED(TOUCH_SCREEN) + add_control(64, TFT_HEIGHT - 64, DECREASE, imgDecrease); + add_control(352, TFT_HEIGHT - 64, INCREASE, imgIncrease); + add_control(208, TFT_HEIGHT - 64, CLICK, imgConfirm); + #endif +} + +// The Select Screen presents a prompt and two "buttons" +void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { + uint16_t line = 1; + + if (!string) line++; + + menu_line(line++); + tft_string.set(pref); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + if (string) { + menu_line(line++); + tft_string.set(string); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } + + if (suff) { + menu_line(line); + tft_string.set(suff); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } + #if ENABLED(TOUCH_SCREEN) + add_control(88, TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + add_control(328, TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + #else + menu_line(++line); + if (no) { + tft_string.set(no); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH / 2), 0, !yesno ? COLOR_RED : COLOR_MENU_TEXT, tft_string); + } + + if (yes) { + tft_string.set(yes); + tft_string.trim(); + tft.add_text(TFT_WIDTH / 2 + tft_string.center(TFT_WIDTH / 2), 0, yesno ? COLOR_RED : COLOR_MENU_TEXT, tft_string); + } + #endif +} + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + touch.add_control(RESUME_CONTINUE , 0, 0, TFT_WIDTH, TFT_HEIGHT); + #endif + + menu_line(row); + tft_string.set(GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE)); + tft_string.add('E'); + tft_string.add((char)('1' + extruder)); + tft_string.add(' '); + tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.add(" / "); + tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } + +#endif // ADVANCED_PAUSE_FEATURE + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #define GRID_OFFSET_X 8 + #define GRID_OFFSET_Y 8 + #define GRID_WIDTH 192 + #define GRID_HEIGHT 192 + #define CONTROL_OFFSET 16 + + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + + tft.canvas(GRID_OFFSET_X, GRID_OFFSET_Y, GRID_WIDTH, GRID_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); + + for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) + for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + + const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, + lpos = pos.asLogical(); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2 - MENU_ITEM_HEIGHT, 120, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(X_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.x)); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2, 120, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Y_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.y)); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2 + MENU_ITEM_HEIGHT, 120, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Z_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + constexpr uint8_t w = (TFT_WIDTH) / 10; + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - w) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 5, w, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(x_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(w), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET + 16 - 24, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2, w, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(y_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(w), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); + add_control(320, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); + add_control(224, TFT_HEIGHT - 34, BACK, imgBack); + #endif + } +#endif // AUTO_BED_LEVELING_UBL + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "../../feature/babystep.h" +#endif + +#if HAS_BED_PROBE + #include "../../module/probe.h" +#endif + +#define Z_SELECTION_Z 1 +#define Z_SELECTION_Z_PROBE -1 + +struct MotionAxisState { + xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos; + float currentStepSize = 10.0; + int z_selection = Z_SELECTION_Z; + uint8_t e_selection = 0; + bool homming = false; + bool blocked = false; + char message[32]; +}; + +MotionAxisState motionAxisState; + +#define E_BTN_COLOR COLOR_YELLOW +#define X_BTN_COLOR COLOR_CORAL_RED +#define Y_BTN_COLOR COLOR_VIVID_GREEN +#define Z_BTN_COLOR COLOR_LIGHT_BLUE + +#define BTN_WIDTH 64 +#define BTN_HEIGHT 52 +#define X_MARGIN 20 +#define Y_MARGIN 15 + +static void quick_feedback() { + #if HAS_CHIRP + ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle? + #if BOTH(HAS_LCD_MENU, USE_BEEPER) + for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } + #elif HAS_LCD_MENU + delay(10); + #endif + #endif +} + +#define CUR_STEP_VALUE_WIDTH 104 +static void drawCurStepValue() { + tft_string.set((uint8_t *)ftostr52sp(motionAxisState.currentStepSize)); + tft_string.add("mm"); + tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string); +} + +static void drawCurZSelection() { + tft_string.set("Z"); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + tft.queue.sync(); + tft_string.set("Offset"); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34); + tft.set_background(COLOR_BACKGROUND); + if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + } +} + +static void drawCurESelection() { + tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set("E"); + tft.add_text(0, 0, E_BTN_COLOR , tft_string); + tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); +} + +static void drawMessage(const char *msg) { + tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(0, 0, COLOR_YELLOW, msg); +} + +static void drawAxisValue(AxisEnum axis) { + const float value = + #if HAS_BED_PROBE + axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? + probe.offset.z : + #endif + NATIVE_TO_LOGICAL( + ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), + axis + ); + xy_int_t pos; + uint16_t color; + switch (axis) { + case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; + case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; + case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; + case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + default: return; + } + tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ftostr52sp(value)); + tft.add_text(0, 0, color, tft_string); +} + +static void moveAxis(AxisEnum axis, const int8_t direction) { + quick_feedback(); + + if (axis == E_AXIS && thermalManager.temp_hotend[motionAxisState.e_selection].celsius < EXTRUDE_MINTEMP) { + drawMessage("Too cold"); + return; + } + + const float diff = motionAxisState.currentStepSize * direction; + + if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; + const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; + const float bsDiff = planner.steps_to_mm[Z_AXIS] * babystep_increment, + new_probe_offset = probe.offset.z + bsDiff, + new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET + , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff + , new_probe_offset + ); + if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + babystep.add_steps(Z_AXIS, babystep_increment); + if (do_probe) + probe.offset.z = new_offs; + else + TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); + drawMessage(""); // clear the error + drawAxisValue(axis); + } + else { + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + #elif HAS_BED_PROBE + // only change probe.offset.z + probe.offset.z += diff; + if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) { + current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) { + current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else { + drawMessage(""); // clear the error + } + drawAxisValue(axis); + #endif + return; + } + + if (!ui.manual_move.processing) { + // Get motion limit from software endstops, if any + float min, max; + soft_endstop.get_manual_axis_limits(axis, min, max); + + // Delta limits XY based on the current offset from center + // This assumes the center is 0,0 + #if ENABLED(DELTA) + if (axis != Z_AXIS && axis != E_AXIS) { + max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis + min = -max; + } + #endif + + // Get the new position + #if IS_KINEMATIC + ui.manual_move.offset += diff; + if (direction < 0) + NOLESS(ui.manual_move.offset, min - current_position[axis]); + else + NOMORE(ui.manual_move.offset, max - current_position[axis]); + #else + current_position[axis] += diff; + const char *msg = NUL_STR; // clear the error + if (direction < 0 && current_position[axis] < min) { + current_position[axis] = min; + msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); + } + else if (direction > 0 && current_position[axis] > max) { + current_position[axis] = max; + msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); + } + drawMessage(msg); + #endif + + ui.manual_move.soon(axis + #if MULTI_MANUAL + , motionAxisState.e_selection + #endif + ); + } + + drawAxisValue(axis); +} + +static void e_plus() { moveAxis(E_AXIS, 1); } +static void e_minus() { moveAxis(E_AXIS, -1); } +static void x_minus() { moveAxis(X_AXIS, -1); } +static void x_plus() { moveAxis(X_AXIS, 1); } +static void y_plus() { moveAxis(Y_AXIS, 1); } +static void y_minus() { moveAxis(Y_AXIS, -1); } +static void z_plus() { moveAxis(Z_AXIS, 1); } +static void z_minus() { moveAxis(Z_AXIS, -1); } + +#if ENABLED(TOUCH_SCREEN) + static void e_select() { + motionAxisState.e_selection++; + if (motionAxisState.e_selection >= EXTRUDERS) { + motionAxisState.e_selection = 0; + } + + quick_feedback(); + drawCurESelection(); + drawAxisValue(E_AXIS); + } + + static void do_home() { + quick_feedback(); + drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING)); + queue.inject_P(G28_STR); + // Disable touch until home is done + TERN_(HAS_TFT_XPT2046, touch.disable()); + drawAxisValue(E_AXIS); + drawAxisValue(X_AXIS); + drawAxisValue(Y_AXIS); + drawAxisValue(Z_AXIS); + } + + static void step_size() { + motionAxisState.currentStepSize = motionAxisState.currentStepSize / 10.0; + if (motionAxisState.currentStepSize < 0.0015) motionAxisState.currentStepSize = 10.0; + quick_feedback(); + drawCurStepValue(); + } +#endif + +#if HAS_BED_PROBE + static void z_select() { + motionAxisState.z_selection *= -1; + quick_feedback(); + drawCurZSelection(); + drawAxisValue(Z_AXIS); + } +#endif + +static void disable_steppers() { + quick_feedback(); + queue.inject_P(PSTR("M84")); +} + +static void drawBtn(int x, int y, const char *label, intptr_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { + uint16_t width = Images[imgBtn52Rounded].width; + uint16_t height = Images[imgBtn52Rounded].height; + + if (!enabled) bgColor = COLOR_CONTROL_DISABLED; + + tft.canvas(x, y, width, height); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgBtn52Rounded, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + + // TODO: Make an add_text() taking a font arg + if (label) { + tft_string.set(label); + tft_string.trim(); + tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); + } + else { + tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + } + + TERN_(HAS_TFT_XPT2046, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); +} + +void MarlinUI::move_axis_screen() { + // Reset + defer_status_screen(true); + motionAxisState.blocked = false; + TERN_(HAS_TFT_XPT2046, touch.enable()); + + ui.clear_lcd(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + const bool busy = printingIsActive(); + + // Babysteps during printing? Select babystep for Z probe offset + if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) + motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + + // ROW 1 -> E- Y- CurY Z+ + int x = X_MARGIN, y = Y_MARGIN, spacing = 0; + + drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy); + + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy); + + // Cur Y + x += BTN_WIDTH; + motionAxisState.yValuePos.x = x + 2; + motionAxisState.yValuePos.y = y; + drawAxisValue(Y_AXIS); + + x += spacing; + drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + // ROW 2 -> "Ex" X- HOME X+ "Z" + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; + + motionAxisState.eNamePos.x = x; + motionAxisState.eNamePos.y = y; + drawCurESelection(); + TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; //imgHome is 64x64 + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); + + x += BTN_WIDTH + spacing; + uint16_t xplus_x = x; + drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; + motionAxisState.zTypePos.x = x; + motionAxisState.zTypePos.y = y; + drawCurZSelection(); + #if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) + if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); + #endif + + // ROW 3 -> E- CurX Y- Z- + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + + drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); + + // Cur E + motionAxisState.eValuePos.x = x; + motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; + drawAxisValue(E_AXIS); + + // Cur X + motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos + motionAxisState.xValuePos.y = y - 10; + drawAxisValue(X_AXIS); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + // Cur Z + motionAxisState.zValuePos.x = x; + motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; + drawAxisValue(Z_AXIS); + + // ROW 4 -> step_size disable steppers back + y = TFT_HEIGHT - Y_MARGIN - 32; // + x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2; + motionAxisState.stepValuePos.x = x; + motionAxisState.stepValuePos.y = y; + if (!busy) { + drawCurStepValue(); + TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); + } + + // aligned with x+ + drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); + + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); +} + +#undef BTN_WIDTH +#undef BTN_HEIGHT + +#endif // HAS_UI_480x320 diff --git a/Marlin/src/lcd/tft/ui_1024x600.h b/Marlin/src/lcd/tft/ui_1024x600.h new file mode 100644 index 0000000000..dd8c1cc6ec --- /dev/null +++ b/Marlin/src/lcd/tft/ui_1024x600.h @@ -0,0 +1,43 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define MARLIN_LOGO_FULL_SIZE MarlinLogo480x320x16 + +#include "ui_common.h" + +#define TFT_STATUS_TOP_Y 4 +#define TFT_TOP_LINE_Y 4 + +#define MENU_TEXT_X_OFFSET 16 +#define MENU_TEXT_Y_OFFSET 7 + +#define MENU_ITEM_ICON_X 5 +#define MENU_ITEM_ICON_Y 5 +#define MENU_ITEM_ICON_SPACE 42 + +#define MENU_FONT_NAME Helvetica18 +#define SYMBOLS_FONT_NAME Helvetica18_symbols +#define MENU_ITEM_HEIGHT 43 +#define FONT_LINE_HEIGHT 34 + +#define MENU_LINE_HEIGHT (MENU_ITEM_HEIGHT + 2) diff --git a/Marlin/src/lcd/tft/ui_common.h b/Marlin/src/lcd/tft/ui_common.h index d43de1d43b..617447a181 100644 --- a/Marlin/src/lcd/tft/ui_common.h +++ b/Marlin/src/lcd/tft/ui_common.h @@ -39,6 +39,10 @@ #include "ui_320x240.h" #elif HAS_UI_480x320 || HAS_UI_480x272 #include "ui_480x320.h" +#elif HAS_UI_1024x600 + #include "ui_1024x600.h" +#else + #error "Unsupported display resolution!" #endif void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); diff --git a/Marlin/src/lcd/tft_io/tft_io.cpp b/Marlin/src/lcd/tft_io/tft_io.cpp index cd535458a1..fa81d95a4d 100644 --- a/Marlin/src/lcd/tft_io/tft_io.cpp +++ b/Marlin/src/lcd/tft_io/tft_io.cpp @@ -22,7 +22,7 @@ #include "tft_io.h" -#if HAS_SPI_TFT || HAS_FSMC_TFT +#if HAS_SPI_TFT || HAS_FSMC_TFT || HAS_LTDC_TFT #include "st7735.h" #include "st7789v.h" @@ -90,6 +90,8 @@ if (lcd_id != 0xFFFFFFFF) return; lcd_id = io.GetID() & 0xFFFF; switch (lcd_id) { + case LTDC_RGB: + break; case ST7796: // ST7796S 480x320 DEBUG_ECHO_MSG(" ST7796S"); write_esc_sequence(st7796s_init); @@ -144,6 +146,17 @@ void TFT_IO::set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ym #endif switch (lcd_id) { + case LTDC_RGB: + io.WriteReg(0x01); + io.WriteData(Xmin); + io.WriteReg(0x02); + io.WriteData(Xmax); + io.WriteReg(0x03); + io.WriteData(Ymin); + io.WriteReg(0x04); + io.WriteData(Ymax); + io.WriteReg(0x00); + break; case ST7735: // ST7735 160x128 case ST7789: // ST7789V 320x240 case ST7796: // ST7796 480x320 diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h index 2456358571..846b45e8e0 100644 --- a/Marlin/src/lcd/tft_io/tft_io.h +++ b/Marlin/src/lcd/tft_io/tft_io.h @@ -23,14 +23,16 @@ #include "../../inc/MarlinConfig.h" -#if HAS_SPI_TFT || HAS_FSMC_TFT +#if HAS_SPI_TFT || HAS_FSMC_TFT || HAS_LTDC_TFT #if HAS_SPI_TFT #include HAL_PATH(../../HAL, tft/tft_spi.h) #elif HAS_FSMC_TFT #include HAL_PATH(../../HAL, tft/tft_fsmc.h) +#elif HAS_LTDC_TFT + #include HAL_PATH(../../HAL, tft/tft_ltdc.h) #else - #error "TFT IO only supports SPI or FSMC interface" + #error "TFT IO only supports SPI, FSMC or LTDC interface" #endif #define TFT_EXCHANGE_XY (1UL << 1) @@ -91,6 +93,7 @@ #define TOUCH_ORIENTATION TOUCH_LANDSCAPE #endif +#define LTDC_RGB 0xABAB #define SSD1963 0x5761 #define ST7735 0x89F0 #define ST7789 0x8552 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index e4c692a3b9..7634d49199 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -631,6 +631,8 @@ #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:REMRAM_V1 #elif MB(NUCLEO_F767ZI) #include "stm32f7/pins_NUCLEO_F767ZI.h" // STM32F7 env:NUCLEO_F767ZI +#elif MB(BTT_SKR_SE_BX) + #include "stm32h7/pins_BTT_SKR_SE_BX.h" // STM32H7 env:BTT_SKR_SE_BX #elif MB(TEENSY41) #include "teensy4/pins_TEENSY41.h" // Teensy-4.x env:teensy41 #elif MB(T41U5XBB) diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h new file mode 100644 index 0000000000..320d04e0b1 --- /dev/null +++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX.h @@ -0,0 +1,226 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(STM32H7) + #error "Oops! Select an STM32H7 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "BTT SKR SE BX" +#define DEFAULT_MACHINE_NAME "BIQU-BX" + +// Onboard I2C EEPROM +#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB (24C32 ... 32Kb = 4KB) + +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT + +// +// Limit Switches +// +#define X_MIN_PIN PB11 +#define X_MAX_PIN PD13 +#define Y_MIN_PIN PB12 +#define Y_MAX_PIN PB13 +#define Z_MIN_PIN PD12 +#define Z_MAX_PIN PD11 + +#define FIL_RUNOUT_PIN PD13 +#define FIL_RUNOUT2_PIN PB13 + +#define LED_PIN PA13 +#define BEEPER_PIN PA14 + +#define TFT_BACKLIGHT_PIN PB5 + +#define POWER_MONITOR_PIN PB0 +#define RPI_POWER_PIN PE5 + +#define SAFE_POWER_PIN PI11 +#define SERVO0_PIN PA2 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PH2 // Probe +#endif + +// +// Steppers +// +#define X_STEP_PIN PG13 +#define X_DIR_PIN PG12 +#define X_ENABLE_PIN PG14 +#define X_CS_PIN PG10 + +#define Y_STEP_PIN PB3 +#define Y_DIR_PIN PD3 +#define Y_ENABLE_PIN PB4 +#define Y_CS_PIN PD4 + +#define Z_STEP_PIN PD7 +#define Z_DIR_PIN PD6 +#define Z_ENABLE_PIN PG9 +#define Z_CS_PIN PD5 + +#define E0_STEP_PIN PC14 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PC15 +#define E0_CS_PIN PI8 + +#define E1_STEP_PIN PA8 +#define E1_DIR_PIN PC9 +#define E1_ENABLE_PIN PD2 +#define E1_CS_PIN PC8 + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PC6 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PG3 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PC7 + #endif +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + //#define E5_HARDWARE_SERIAL Serial1 + //#define E6_HARDWARE_SERIAL Serial1 + //#define E7_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + #define X_SERIAL_TX_PIN PG10 + #define X_SERIAL_RX_PIN PG10 + + #define Y_SERIAL_TX_PIN PD4 + #define Y_SERIAL_RX_PIN PD4 + + #define Z_SERIAL_TX_PIN PD5 + #define Z_SERIAL_RX_PIN PD5 + + #define E0_SERIAL_TX_PIN PI8 + #define E0_SERIAL_RX_PIN PI8 + + #define E1_SERIAL_TX_PIN PC8 + #define E1_SERIAL_RX_PIN PC8 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PH4 // TH0 +#define TEMP_1_PIN PA3 // TH1 +#define TEMP_BED_PIN PH5 // TB + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC4 +#define HEATER_1_PIN PC5 +#define HEATER_BED_PIN PA4 + +#define FAN_PIN PA5 // "FAN0" +#define FAN1_PIN PA6 // "FAN1" +#define FAN2_PIN PA7 // "FAN2" + +#define NEOPIXEL_PIN PH3 +#define NEOPIXEL2_PIN PB1 + +#if HAS_LTDC_TFT + + // LTDC_LCD Timing + #define LTDC_LCD_CLK 50 // LTDC clock frequency = 50Mhz + #define LTDC_LCD_HSYNC 30 // Horizontal synchronization + #define LTDC_LCD_HBP 114 // Horizontal back porch + #define LTDC_LCD_HFP 16 // Horizontal front porch + #define LTDC_LCD_VSYNC 3 // Vertical synchronization + #define LTDC_LCD_VBP 32 // Vertical back porch + #define LTDC_LCD_VFP 10 // Vertical front porch + + #define TFT_BACKLIGHT_PIN PB5 + #define LCD_DE_PIN PF10 + #define LCD_CLK_PIN PG7 + #define LCD_VSYNC_PIN PI9 + #define LCD_HSYNC_PIN PI10 + #define LCD_R7_PIN PG6 // R5 + #define LCD_R6_PIN PH12 + #define LCD_R5_PIN PH11 + #define LCD_R4_PIN PH10 + #define LCD_R3_PIN PH9 + #define LCD_G7_PIN PI2 // G6 + #define LCD_G6_PIN PI1 + #define LCD_G5_PIN PI0 + #define LCD_G4_PIN PH15 + #define LCD_G3_PIN PH14 + #define LCD_G2_PIN PH13 + #define LCD_B7_PIN PI7 // B5 + #define LCD_B6_PIN PI6 + #define LCD_B5_PIN PI5 + #define LCD_B4_PIN PI4 + #define LCD_B3_PIN PG11 + +#endif + +#define BTN_EN1 PH6 +#define BTN_EN2 PH7 +#define BTN_ENC PH8 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define SOFTWARE_SPI +#define SDSS PA15 +#define SS_PIN SDSS +#define SD_SCK_PIN PC10 +#define SD_MISO_PIN PC11 +#define SD_MOSI_PIN PC12 +#define SD_DETECT_PIN PI3 diff --git a/buildroot/share/PlatformIO/boards/BTT_SKR_SE_BX.json b/buildroot/share/PlatformIO/boards/BTT_SKR_SE_BX.json new file mode 100644 index 0000000000..920b2478a9 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/BTT_SKR_SE_BX.json @@ -0,0 +1,56 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m7", + "extra_flags": "-DSTM32H743xx", + "f_cpu": "400000000L", + "mcu": "stm32h743iit6", + "variant": "BTT_SKR_SE_BX" + }, + "debug": { + "jlink_device": "STM32H743II", + "openocd_target": "stm32h7x", + "svd_path": "STM32H7x3.svd", + "tools": { + "stlink": { + "server": { + "arguments": [ + "-f", + "scripts/interface/stlink.cfg", + "-c", + "transport select hla_swd", + "-f", + "scripts/target/stm32h7x.cfg", + "-c", + "reset_config none" + ], + "executable": "bin/openocd", + "package": "tool-openocd" + } + } + } + }, + "frameworks": [ + "arduino", + "stm32cube" + ], + "name": "STM32H743II (1024k RAM. 2048k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 1048576, + "maximum_size": 2097152, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink", + "cmsis-dap" + ], + "offset_address": "0x8020000", + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32h743ii.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c new file mode 100644 index 0000000000..3defef5fbf --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c @@ -0,0 +1,491 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + * Automatically generated from STM32H743ZITx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_INP15 + {PH_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_INP15 + {PH_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC3_INP16 + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC1_INP16 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // ADC1_INP17 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_INP14 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // ADC1_INP18 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 19, 0)}, // ADC1_INP19 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_INP3 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_INP7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_INP9 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_INP5 + {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_INP10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_INN10 + {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_INN0 + {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_INP1 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_INP4 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_INP8 + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_INP5 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_INP9 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_INP4 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_INP8 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_INP3 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_INP7 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_INP2 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_INP6 + {PF_11, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_INP2 + {PF_12, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_INP6 + {PF_13, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_INP2 + {PF_14, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_INP6 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + // {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // LD2 LED_BLUE (ZI) + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_7, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, // LD2 LED_BLUE (ZI) + // {PB_9, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PD_13, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)}, + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PF_15, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // USB SOF + // {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // QSPI_CS + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_6, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, // QSPI_CS + // {PB_8, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PD_12, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)}, + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PF_14, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - ETH RMII Ref Clk + // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - ETH RMII Ref Clk + // {PA_1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 1, 1)}, // TIM15_CH1N - ETH RMII Ref Clk + // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - ETH RMII MDIO + {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - ETH RMII MDIO + // {PA_2, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 1, 0)}, // TIM15_CH1 - ETH RMII MDIO + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + {PA_3, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 2, 0)}, // TIM15_CH2 + // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Used by ETH when JP6(ZI)/SB31(ZI2) ON + // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - Used by ETH when JP6(ZI)/SB31(ZI2) ON + // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - Used by ETH when JP6(ZI)/SB31(ZI2) ON + {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - Used by ETH when JP6(ZI)/SB31(ZI2) ON + // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - USB SOF + // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - USB VBUS + // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - USB ID + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - USB DM + // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - LD1 LED_GREEN + // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - LD1 LED_GREEN + // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - LD1 LED_GREEN + // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - SWO + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + // {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PB_6, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 1)}, // TIM16_CH1N + // {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - LD2 LED_BLUE (ZI) + {PB_7, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 1)}, // TIM17_CH1N - LD2 LED_BLUE (ZI) + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + // {PB_8, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 0)}, // TIM16_CH1 + // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_9, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 0)}, // TIM17_CH1 + // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Used by ETH when JP7(ZI)/JP6(ZI2) ON + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - LD3 LED_RED + // {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - LD3 LED_RED + // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM12, 1, 0)}, // TIM12_CH1 - LD3 LED_RED + // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM12, 2, 0)}, // TIM12_CH2 + // {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + // {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + // {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_4, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 1, 1)}, // TIM15_CH1N + {PE_5, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 1, 0)}, // TIM15_CH1 + {PE_6, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 2, 0)}, // TIM15_CH2 + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PF_6, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 0)}, // TIM16_CH1 + {PF_7, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 0)}, // TIM17_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + // {PF_8, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 1)}, // TIM16_CH1N + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + // {PF_9, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 1)}, // TIM17_CH1N + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ETH RMII MDIO + // {PA_9, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB VBUS + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB VBUS + // {PA_12, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // USB DP + //{PA_15, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, + //{PB_4, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, + // {PB_6, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART)}, + // {PB_6, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_9, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PB_13, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON + // {PB_14, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)}, // LD3 LED_RED + //{PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STLink TX + //{PE_1, UART8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, //LD2 LED_YELLOW (ZI2) + //{PE_8, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, + //{PF_7, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, + //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // ETH RMII Ref Clk + // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PA_8, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, // USB SOF + // {PA_10, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB ID + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB ID + // {PA_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // USB DM + //{PB_3, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, // SWO + //{PB_5, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, + // {PB_7, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART)}, // LD2 LED_BLUE (ZI) + // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // LD2 LED_BLUE (ZI) + //{PB_8, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, + //{PB_15, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)}, + //{PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STLink RX + //{PE_0, UART8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, + //{PE_7, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, + //{PF_6, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, + //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ETH RMII Ref Clk + // {PA_12, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB DP + // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB DP + {PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_14, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // LD3 LED_RED + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // LD3 LED_RED + {PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_15, UART8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, + {PE_9, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, + {PF_8, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, + {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + // {PA_11, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB DM + // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB DM + // {PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // LD1 LED_GREEN + // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON + {PB_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_14, UART8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, + {PE_10, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, + {PF_9, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, + // {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // Used by ETH when JP6(ZI)/SB31(ZI2) ON + // {PA_7, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, // Used by ETH when JP6(ZI)/SB31(ZI2) ON + // {PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + // // {PB_5, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // // {PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // ETH RMII MDC + // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, + // {PD_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PF_9, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + // {PF_11, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + // {PG_14, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // // {PA_6, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // // {PB_4, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // LD3 LED_RED + // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PF_8, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + // {PG_9, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PG_12, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // // {PA_5, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + // // {PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB VBUS + // // {PA_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB DP + // // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // SWO + // // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // SWO + // {PB_3, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, // SWO + // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // // {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON + // {PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PF_7, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + // {PG_11, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ETH RMII TX Enable + // {PG_13, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // ETH RXII TXD0 + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + // // {PA_4, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + // // {PA_11, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB DM + // // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // // {PA_15, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI6)}, + // {PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PF_6, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + // {PG_8, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, + // {PG_10, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_RD[] = { + // {PA_11, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, // USB DM + {PB_5, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, + {PB_8, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, + {PB_12, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, + {PD_0, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_TD[] = { + // {PA_12, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, // USB DP + {PB_6, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, // QSPI_CS + {PB_7, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, // LD2 LED_BLUE (ZI) + {PB_9, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, + // {PB_13, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON + {PD_1, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, + {NC, NP, 0} +}; +#endif + +//*** ETHERNET *** + +#ifdef HAL_ETH_MODULE_ENABLED +WEAK const PinMap PinMap_Ethernet[] = { + // {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS + {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK + {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO + // {PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL + {PA_7, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS_DV|ETH_RX_DV + // {PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 + // {PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 + // {PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + // {PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + // {PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER + // {PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + // {PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + {PB_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + {PC_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDC + // {PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 + // {PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK + {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 + {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 + // {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + // {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + // {PG_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + // {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + {NC, NP, 0} +}; +#endif + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_FS[] = { + // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_SOF + // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_ID + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; +#endif + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_HS[] = { +#ifdef USE_USB_HS_IN_FS + // {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_SOF + // {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_ID + // {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - Used by ETH when JP7(ZI)/JP6(ZI2) ON + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_DP +#else + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D0 + {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_CK + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D4 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D6 - Used by ETH when JP7(ZI)/JP6(ZI2) ON + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_NXT +#endif /* USE_USB_HS_IN_FS */ + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PinNamesVar.h b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PinNamesVar.h new file mode 100644 index 0000000000..118bc92f7e --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PinNamesVar.h @@ -0,0 +1,50 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 +SYS_WKUP1 = PA_0, /* SYS_WKUP0 */ +#endif +#ifdef PWR_WAKEUP_PIN2 +SYS_WKUP2 = PA_2, /* SYS_WKUP1 */ +#endif +#ifdef PWR_WAKEUP_PIN3 +SYS_WKUP3 = PC_13, /* SYS_WKUP2 */ +#endif +#ifdef PWR_WAKEUP_PIN4 +SYS_WKUP4 = PI_8, /* SYS_WKUP3 - Manually added */ +#endif +#ifdef PWR_WAKEUP_PIN5 +SYS_WKUP5 = PI_11, /* SYS_WKUP4 - Manually added */ +#endif +#ifdef PWR_WAKEUP_PIN6 +SYS_WKUP6 = PC_1, /* SYS_WKUP5 */ +#endif +#ifdef PWR_WAKEUP_PIN7 +SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 +SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON +USB_OTG_FS_SOF = PA_8, +USB_OTG_FS_VBUS = PA_9, +USB_OTG_FS_ID = PA_10, +USB_OTG_FS_DM = PA_11, +USB_OTG_FS_DP = PA_12, +USB_OTG_HS_ULPI_D0 = PA_3, +USB_OTG_HS_SOF = PA_4, +USB_OTG_HS_ULPI_CK = PA_5, +USB_OTG_HS_ULPI_D1 = PB_0, +USB_OTG_HS_ULPI_D2 = PB_1, +USB_OTG_HS_ULPI_D7 = PB_5, +USB_OTG_HS_ULPI_D3 = PB_10, +USB_OTG_HS_ULPI_D4 = PB_11, +USB_OTG_HS_ID = PB_12, +USB_OTG_HS_ULPI_D5 = PB_12, +USB_OTG_HS_ULPI_D6 = PB_13, +USB_OTG_HS_VBUS = PB_13, +USB_OTG_HS_DM = PB_14, +USB_OTG_HS_DP = PB_15, +USB_OTG_HS_ULPI_STP = PC_0, +USB_OTG_HS_ULPI_DIR = PC_2, +USB_OTG_HS_ULPI_NXT = PC_3, +#endif diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/hal_conf_extra.h new file mode 100644 index 0000000000..4050fe810f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/hal_conf_extra.h @@ -0,0 +1,479 @@ +/** + ****************************************************************************** + * @file stm32h7xx_hal_conf_default.h + * @brief HAL default configuration file. + ****************************************************************************** + * @attention + * + *

      © Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

      + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32H7xx_HAL_CONF_DEFAULT_H +#define __STM32H7xx_HAL_CONF_DEFAULT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief Include the default list of modules to be used in the HAL driver + * and manage module deactivation + */ +#include "stm32yyxx_hal_conf.h" +#if 0 +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CEC_MODULE_ENABLED +#define HAL_COMP_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_CRYP_MODULE_ENABLED +#define HAL_DAC_MODULE_ENABLED +#define HAL_DCMI_MODULE_ENABLED +#define HAL_DFSDM_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_DMA2D_MODULE_ENABLED +#define HAL_DSI_MODULE_ENABLED +#define HAL_ETH_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_FDCAN_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_HASH_MODULE_ENABLED +#define HAL_HCD_MODULE_ENABLED +#define HAL_HRTIM_MODULE_ENABLED +#define HAL_HSEM_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_I2S_MODULE_ENABLED +#define HAL_IRDA_MODULE_ENABLED +#define HAL_IWDG_MODULE_ENABLED +#define HAL_JPEG_MODULE_ENABLED +#define HAL_LPTIM_MODULE_ENABLED +#define HAL_LTDC_MODULE_ENABLED +#define HAL_MDIOS_MODULE_ENABLED +#define HAL_MDMA_MODULE_ENABLED +#define HAL_MMC_MODULE_ENABLED +#define HAL_NAND_MODULE_ENABLED +#define HAL_NOR_MODULE_ENABLED +#define HAL_OPAMP_MODULE_ENABLED +#define HAL_PCD_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_QSPI_MODULE_ENABLED +#define HAL_RAMECC_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_RNG_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED +#define HAL_SAI_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SDRAM_MODULE_ENABLED +#define HAL_SMARTCARD_MODULE_ENABLED +#define HAL_SMBUS_MODULE_ENABLED +#define HAL_SPDIFRX_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED +#define HAL_SWPMI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_WWDG_MODULE_ENABLED +#endif + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal oscillator (CSI) default value. + * This value is the default CSI value after Reset. + */ +#if !defined (CSI_VALUE) +#define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) +#define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) +#define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +#if !defined (LSI_VALUE) +#define LSI_VALUE ((uint32_t)32000) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations +in voltage and temperature.*/ +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External clock in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#if !defined (VDD_VALUE) +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#endif +#if !defined (TICK_INT_PRIORITY) +#define TICK_INT_PRIORITY ((uint32_t)0x00) /*!< tick interrupt priority */ +#endif +#if !defined (USE_RTOS) +#define USE_RTOS 0 +#endif +#if !defined (USE_SD_TRANSCEIVER) +#define USE_SD_TRANSCEIVER 1U /*!< use uSD Transceiver */ +#endif +#if !defined (USE_SPI_CRC) +#define USE_SPI_CRC 0U /*!< use CRC in SPI */ +#endif + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U /* FDCAN register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 1U /* HCD register callback disabled */ +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U /* HRTIM register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_JPEG_REGISTER_CALLBACKS 0U /* JPEG register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MDIOS_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */ +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U /* SWPMI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################### Ethernet Configuration ######################### */ +#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */ +#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */ + +#define ETH_MAC_ADDR0 ((uint8_t)0x02) +#define ETH_MAC_ADDR1 ((uint8_t)0x00) +#define ETH_MAC_ADDR2 ((uint8_t)0x00) +#define ETH_MAC_ADDR3 ((uint8_t)0x00) +#define ETH_MAC_ADDR4 ((uint8_t)0x00) +#define ETH_MAC_ADDR5 ((uint8_t)0x00) + + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1 */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32h7xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32h7xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32h7xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_MDMA_MODULE_ENABLED +#include "stm32h7xx_hal_mdma.h" +#endif /* HAL_MDMA_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32h7xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32h7xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED +#include "stm32h7xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED +#include "stm32h7xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED +#include "stm32h7xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32h7xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32h7xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32h7xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32h7xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED +#include "stm32h7xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32h7xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "stm32h7xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32h7xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32h7xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32h7xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32h7xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED +#include "stm32h7xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_HSEM_MODULE_ENABLED +#include "stm32h7xx_hal_hsem.h" +#endif /* HAL_HSEM_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32h7xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32h7xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32h7xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32h7xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32h7xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32h7xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_JPEG_MODULE_ENABLED +#include "stm32h7xx_hal_jpeg.h" +#endif /* HAL_JPEG_MODULE_ENABLED */ + +#ifdef HAL_MDIOS_MODULE_ENABLED +#include "stm32h7xx_hal_mdios.h" +#endif /* HAL_MDIOS_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32h7xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32h7xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32h7xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED +#include "stm32h7xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32h7xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32h7xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RAMECC_MODULE_ENABLED +#include "stm32h7xx_hal_ramecc.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32h7xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32h7xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32h7xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32h7xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED +#include "stm32h7xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32h7xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED +#include "stm32h7xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED +#include "stm32h7xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32h7xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32h7xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32h7xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32h7xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32h7xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32h7xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32h7xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32h7xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32h7xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32H7xx_HAL_CONF_DEFAULT_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/ldscript.ld b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/ldscript.ld new file mode 100644 index 0000000000..5e01911d82 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/ldscript.ld @@ -0,0 +1,208 @@ +/* +****************************************************************************** +** +** File : LinkerScript.ld +** +** Author : Auto-generated by STM32CubeIDE +** +** Abstract : Linker script for NUCLEO-H743II(2) Board embedding STM32H743IITx Device from STM32H7 series +** 2048Kbytes FLASH +** 128Kbytes DTCMRAM +** 64Kbytes ITCMRAM +** 512Kbytes RAM_D1 +** 288Kbytes RAM_D2 +** 64Kbytes RAM_D3 +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed as is without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

      © COPYRIGHT(c) 2019 STMicroelectronics

      +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x24080000; /* end of "RAM_D1" Ram type memory */ + +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K + ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K + RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K + RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K + RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K + FLASH (rx) : ORIGIN = 0x8020000, LENGTH = 2048K - 128K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "FLASH" Rom type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data into "FLASH" Rom type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM_D1" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + + } >RAM_D1 AT> FLASH + + /* Uninitialized data section into "RAM_D1" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM_D1 + + /* User_heap_stack section, used to check that there is enough "RAM_D1" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM_D1 + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.cpp b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.cpp new file mode 100644 index 0000000000..203e9fc9b8 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.cpp @@ -0,0 +1,332 @@ +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Pin number +const PinName digitalPin[] = { + PE_2, // D0 + PE_3, // D1 + PE_4, // D2 + PE_5, // D3 + PE_6, // D4 + PI_8, // D5 + PC_13, // D6 + PC_14, // D7 + PC_15, // D8 + PI_9, // D9 + PI_10, // D10 + PI_11, // D11 + PF_0, // D12 + PF_1, // D13 + PF_2, // D14 + PH_0, // D15 + PH_1, // D16 + PB_2, // D17 + PF_15, // D18 + PG_0, // D19 + PG_1, // D20 + PE_7, // D21 + PE_8, // D22 + PE_9, // D23 + PE_10, // D24 + PE_11, // D25 + PE_12, // D26 + PE_13, // D27 + PE_14, // D28 + PE_15, // D29 + PB_10, // D30 + PB_11, // D31 + PH_6, // D32 + PH_7, // D33 + PH_8, // D34 + PH_9, // D35 + PH_10, // D36 + PH_11, // D37 + PH_12, // D38 + PB_12, // D39 + PB_13, // D40 + PB_14, // D41 + PB_15, // D42 + PD_8, // D43 + PD_9, // D44 + PD_10, // D45 + PD_11, // D46 + PD_12, // D47 + PD_13, // D48 + PD_14, // D49 + PD_15, // D50 + PG_2, // D51 + PG_3, // D52 + PG_4, // D53 + PG_5, // D54 + PG_6, // D55 + PG_7, // D56 + PG_8, // D57 + PC_6, // D58 + PC_7, // D59 + PC_8, // D60 + PC_9, // D61 + PA_8, // D62 + PA_9, // D63 + PA_10, // D64 + PA_11, // D65 + PA_12, // D66 + PA_13, // D67 + PH_13, // D68 + PH_14, // D69 + PH_15, // D70 + PI_0, // D71 + PI_1, // D72 + PI_2, // D73 + PI_3, // D74 + PA_14, // D75 + PA_15, // D76 + PC_10, // D77 + PC_11, // D78 + PC_12, // D79 + PD_0, // D80 + PD_1, // D81 + PD_2, // D82 + PD_3, // D83 + PD_4, // D84 + PD_5, // D85 + PD_6, // D86 + PD_7, // D87 + PG_9, // D88 + PG_10, // D89 + PG_11, // D90 + PG_12, // D91 + PG_13, // D92 + PG_14, // D93 + PG_15, // D94 + PB_3, // D95 + PB_4, // D96 + PB_5, // D97 + PB_6, // D98 + PB_7, // D99 + PB_8, // D100 + PB_9, // D101 + PE_0, // D102 + PE_1, // D103 + PI_4, // D104 + PI_5, // D105 + PI_6, // D106 + PI_7, // D107 + PA_0, // D108 / A0 + PA_1, // D109 / A1 + PA_2, // D110 / A2 + PA_3, // D111 / A3 + PA_4, // D112 / A4 + PA_5, // D113 / A5 + PA_6, // D114 / A6 + PA_7, // D115 / A7 + PB_0, // D116 / A8 + PB_1, // D117 / A9 + PH_2, // D118 / A10 + PH_3, // D119 / A11 + PH_4, // D120 / A12 + PH_5, // D121 / A13 + PC_0, // D122 / A14 + PC_1, // D123 / A15 + PC_2, // D124 / A16 + PC_3, // D125 / A17 + PC_4, // D126 / A18 + PC_5, // D127 / A19 + PF_3, // D128 / A20 + PF_4, // D129 / A21 + PF_5, // D130 / A22 + PF_6, // D131 / A23 + PF_7, // D132 / A24 + PF_8, // D133 / A25 + PF_9, // D134 / A26 + PF_10, // D135 / A27 + PF_11, // D136 / A28 + PF_12, // D137 / A29 + PF_13, // D138 / A30 + PF_14, // D139 / A31 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +void SystemClockStartupInit() { + // Confirm is called only once time to avoid hang up caused by repeated calls in USB wakeup interrupt + static bool first_call = true; + if (!first_call) return; + first_call = false; + + // Clear all clock setting register + RCC->CR = 0x00000001; + RCC->CFGR = 0x00000000; + RCC->D1CFGR = 0x00000000; + RCC->D2CFGR = 0x00000000; + RCC->D3CFGR = 0x00000000; + RCC->PLLCKSELR = 0x00000000; + RCC->PLLCFGR = 0x00000000; + RCC->CIER = 0x00000000; + + // AXI_TARG7_FN_MOD for SRAM + *((volatile uint32_t*)0x51008108)=0x00000001; + + // Enable L1-Cache + SCB_EnableICache(); + SCB_EnableDCache(); + SCB->CACR |= 1<<2; + + PWR->CR3 &= ~(1 << 2); // SCUEN=0 + PWR->D3CR |= 3 << 14; // VOS=3,Scale1,1.15~1.26V core voltage + while((PWR->D3CR & (1 << 13)) == 0); // Wait for the voltage to stabilize + RCC->CR |= 1<<16; // Enable HSE + + uint16_t timeout = 0; + while(((RCC->CR & (1 << 17)) == 0) && (timeout < 0X7FFF)) { + timeout++; // Wait for HSE RDY + } + + if(timeout == 0X7FFF) { + Error_Handler(); + } else { + RCC->PLLCKSELR |= 2 << 0; // PLLSRC[1:0] = 2, HSE for PLL clock source + RCC->PLLCKSELR |= 5 << 4; // DIVM1[5:0] = pllm, Prescaler for PLL1 + RCC->PLL1DIVR |= (160 - 1) << 0; // DIVN1[8:0] = plln - 1, Multiplication factor for PLL1 VCO + RCC->PLL1DIVR |= (2 - 1) << 9; // DIVP1[6:0] = pllp - 1, PLL1 DIVP division factor + RCC->PLL1DIVR |= (4 - 1) << 16; // DIVQ1[6:0] = pllq - 1, PLL1 DIVQ division factor + RCC->PLL1DIVR |= 1 << 24; // DIVR1[6:0] = pllr - 1, PLL1 DIVR division factor + RCC->PLLCFGR |= 2 << 2; // PLL1 input (ref1_ck) clock range frequency is between 4 and 8 MHz + RCC->PLLCFGR |= 0 << 1; // PLL1 VCO selection, 0: 192 to 836 MHz, 1 : 150 to 420 MHz + RCC->PLLCFGR |= 3 << 16; // pll1_q_ck and pll1_p_ck output is enabled + RCC->CR |= 1 << 24; // PLL1 enable + while((RCC->CR & (1 << 25)) == 0); // PLL1 clock ready flag + + // PLL2 DIVR clock frequency = 220MHz, so that SDRAM clock can be set to 110MHz + RCC->PLLCKSELR |= 25 << 12; // DIVM2[5:0] = 25, Prescaler for PLL2 + RCC->PLL2DIVR |= (440 - 1) << 0; // DIVN2[8:0] = 440 - 1, Multiplication factor for PLL2 VCO + RCC->PLL2DIVR |= (2 - 1) << 9; // DIVP2[6:0] = 2-1, PLL2 DIVP division factor + RCC->PLL2DIVR |= (2 - 1) << 24; // DIVR2[6:0] = 2-1, PLL2 DIVR division factor + RCC->PLLCFGR |= 0 << 6; // PLL2RGE[1:0]=0, PLL2 input (ref2_ck) clock range frequency is between 1 and 2 MHz + RCC->PLLCFGR |= 0 << 5; // PLL2 VCO selection, 0: 192 to 836 MHz, 1: 150 to 420 MHz + RCC->PLLCFGR |= 1 << 19; // pll2_p_ck output is enabled + RCC->PLLCFGR |= 1 << 21; // pll2_r_ck output is enabled + RCC->D1CCIPR &= ~(3 << 0); // clear FMC kernel clock source selection + RCC->D1CCIPR |= 2 << 0; // pll2_r_ck clock selected as kernel peripheral clock + RCC->CR |= 1 << 26; // PLL2 enable + while((RCC->CR&(1<<27)) == 0); // PLL2 clock ready flag + + RCC->D1CFGR |= 8 << 0; // rcc_hclk3 = sys_d1cpre_ck / 2 = 400 / 2 = 200MHz. AHB1/2/3/4 + RCC->D1CFGR |= 0 << 8; // sys_ck not divided, sys_d1cpre_ck = sys_clk / 1 = 400 / 1 = 400MHz, System Clock = 400MHz + RCC->CFGR |= 3 << 0; // PLL1 selected as system clock (pll1_p_ck). 400MHz + while(1) { + timeout = (RCC->CFGR & (7 << 3)) >> 3; // System clock switch status + if(timeout == 3) break; // Wait for SW[2:0] = 3 (011: PLL1 selected as system clock (pll1_p_ck)) + } + + FLASH->ACR |= 2 << 0; // LATENCY[2:0] = 2 (@VOS1 Level,maxclock=210MHz) + FLASH->ACR |= 2 << 4; // WRHIGHFREQ[1:0] = 2, flash access frequency < 285MHz + + RCC->D1CFGR |= 4 << 4; // D1PPRE[2:0] = 4, rcc_pclk3 = rcc_hclk3 / 2 = 100MHz, APB3. + RCC->D2CFGR |= 4 << 4; // D2PPRE1[2:0] = 4, rcc_pclk1 = rcc_hclk1 / 2 = 100MHz, APB1. + RCC->D2CFGR |= 4 << 8; // D2PPRE2[2:0] = 4, rcc_pclk2 = rcc_hclk1 / 2 = 100MHz, APB2. + RCC->D3CFGR |= 4 << 4; // D3PPRE[2:0] = 4, rcc_pclk4 = rcc_hclk4 / 2 = 100MHz, APB4. + + RCC->CR |= 1 << 7; // CSI clock enable + RCC->APB4ENR |= 1 << 1; // SYSCFG peripheral clock enable + SYSCFG->CCCSR |= 1 << 0; + } + + // USB clock, (use HSI48 clock) + RCC->CR |= 1 << 12; // HSI48 clock enabl + while((RCC->CR & (1 << 13)) == 0);// 1: HSI48 clock is ready + RCC->APB1HENR |= 1 << 1; // CRS peripheral clock enabled + RCC->APB1HRSTR |= 1 << 1; // Resets CRS + RCC->APB1HRSTR &= ~(1 << 1); // Does not reset CRS + CRS->CFGR &= ~(3 << 28); // USB2 SOF selected as SYNC signal source + CRS->CR |= 3 << 5; // Automatic trimming and Frequency error counter enabled + RCC->D2CCIP2R &= ~(3 << 20); // Clear USBOTG 1 and 2 kernel clock source selection + RCC->D2CCIP2R |= 3 << 20; // HSI48_ck clock is selected as kernel clock +} + +uint8_t MPU_Convert_Bytes_To_POT(uint32_t nbytes) +{ + uint8_t count = 0; + while(nbytes != 1) + { + nbytes >>= 1; + count++; + } + return count; +} + +uint8_t MPU_Set_Protection(uint32_t baseaddr, uint32_t size, uint32_t rnum, uint8_t ap, uint8_t sen, uint8_t cen, uint8_t ben) +{ + uint32_t tempreg = 0; + uint8_t rnr = 0; + if ((size % 32) || size == 0) return 1; + rnr = MPU_Convert_Bytes_To_POT(size) - 1; + SCB->SHCSR &= ~(1 << 16); //disable MemManage + MPU->CTRL &= ~(1 << 0); //disable MPU + MPU->RNR = rnum; + MPU->RBAR = baseaddr; + tempreg |= 0 << 28; + tempreg |= ((uint32_t)ap) << 24; + tempreg |= 0 << 19; + tempreg |= ((uint32_t)sen) << 18; + tempreg |= ((uint32_t)cen) << 17; + tempreg |= ((uint32_t)ben) << 16; + tempreg |= 0 << 8; + tempreg |= rnr << 1; + tempreg |= 1 << 0; + MPU->RASR = tempreg; + MPU->CTRL = (1 << 2) | (1 << 0); //enable PRIVDEFENA + SCB->SHCSR |= 1 << 16; //enable MemManage + return 0; +} + +void MPU_Memory_Protection(void) +{ + MPU_Set_Protection(0x20000000, 128 * 1024, 1, MPU_REGION_FULL_ACCESS, 0, 1, 1); // protect DTCM 128k, Sharing is prohibited, cache is allowed, and buffering is allowed + + MPU_Set_Protection(0x24000000, 512 * 1024, 2, MPU_REGION_FULL_ACCESS, 0, 1, 1); // protect AXI SRAM, Sharing is prohibited, cache is allowed, and buffering is allowed + MPU_Set_Protection(0x30000000, 512 * 1024, 3, MPU_REGION_FULL_ACCESS, 0, 1, 1); // protect SRAM1~SRAM3, Sharing is prohibited, cache is allowed, and buffering is allowed + MPU_Set_Protection(0x38000000, 64 * 1024, 4, MPU_REGION_FULL_ACCESS, 0, 1, 1); // protect SRAM4, Sharing is prohibited, cache is allowed, and buffering is allowed + + MPU_Set_Protection(0x60000000, 64 * 1024 * 1024, 5, MPU_REGION_FULL_ACCESS, 0, 0, 0); // protect LCD FMC 64M, No sharing, no cache, no buffering + MPU_Set_Protection(0XC0000000, 32 * 1024 * 1024, 6, MPU_REGION_FULL_ACCESS, 0, 1, 1); // protect SDRAM 32M, Sharing is prohibited, cache is allowed, and buffering is allowed + MPU_Set_Protection(0X80000000, 256 * 1024 * 1024, 7, MPU_REGION_FULL_ACCESS, 0, 0, 0); // protect NAND FLASH 256M, No sharing, no cache, no buffering +} + +/** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + SystemClockStartupInit(); + + MPU_Memory_Protection(); + + /* Update current SystemCoreClock value */ + SystemCoreClockUpdate(); + + /* Configure the Systick interrupt time */ + HAL_SYSTICK_Config(SystemCoreClock/1000); + + /* Configure the Systick */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.h b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.h new file mode 100644 index 0000000000..5be18f9aa4 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.h @@ -0,0 +1,222 @@ +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ +#ifdef __cplusplus + +extern "C" { +#endif // __cplusplus +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +#define PE2 0 +#define PE3 1 +#define PE4 2 +#define PE5 3 +#define PE6 4 +#define PI8 5 +#define PC13 6 +#define PC14 7 +#define PC15 8 +#define PI9 9 +#define PI10 10 +#define PI11 11 +#define PF0 12 +#define PF1 13 +#define PF2 14 +#define PH0 15 +#define PH1 16 +#define PB2 17 +#define PF15 18 +#define PG0 19 +#define PG1 20 +#define PE7 21 +#define PE8 22 +#define PE9 23 +#define PE10 24 +#define PE11 25 +#define PE12 26 +#define PE13 27 +#define PE14 28 +#define PE15 29 +#define PB10 30 +#define PB11 31 +#define PH6 32 +#define PH7 33 +#define PH8 34 +#define PH9 35 +#define PH10 36 +#define PH11 37 +#define PH12 38 +#define PB12 39 +#define PB13 40 +#define PB14 41 +#define PB15 42 +#define PD8 43 +#define PD9 44 +#define PD10 45 +#define PD11 46 +#define PD12 47 +#define PD13 48 +#define PD14 49 +#define PD15 50 +#define PG2 51 +#define PG3 52 +#define PG4 53 +#define PG5 54 +#define PG6 55 +#define PG7 56 +#define PG8 57 +#define PC6 58 +#define PC7 59 +#define PC8 60 +#define PC9 61 +#define PA8 62 +#define PA9 63 +#define PA10 64 +#define PA11 65 +#define PA12 66 +#define PA13 67 +#define PH13 68 +#define PH14 69 +#define PH15 70 +#define PI0 71 +#define PI1 72 +#define PI2 73 +#define PI3 74 +#define PA14 75 +#define PA15 76 +#define PC10 77 +#define PC11 78 +#define PC12 79 +#define PD0 80 +#define PD1 81 +#define PD2 82 +#define PD3 83 +#define PD4 84 +#define PD5 85 +#define PD6 86 +#define PD7 87 +#define PG9 88 +#define PG10 89 +#define PG11 90 +#define PG12 91 +#define PG13 92 +#define PG14 93 +#define PG15 94 +#define PB3 95 +#define PB4 96 +#define PB5 97 +#define PB6 98 +#define PB7 99 +#define PB8 100 +#define PB9 101 +#define PE0 102 +#define PE1 103 +#define PI4 104 +#define PI5 105 +#define PI6 106 +#define PI7 107 +#define PA0 108 +#define PA1 109 +#define PA2 110 +#define PA3 111 +#define PA4 112 +#define PA5 113 +#define PA6 114 +#define PA7 115 +#define PB0 116 +#define PB1 117 +#define PH2 118 +#define PH3 119 +#define PH4 120 +#define PH5 121 +#define PC0 122 +#define PC1 123 +#define PC2 124 +#define PC3 125 +#define PC4 126 +#define PC5 127 +#define PF3 128 +#define PF4 129 +#define PF5 130 +#define PF6 131 +#define PF7 132 +#define PF8 133 +#define PF9 134 +#define PF10 135 +#define PF11 136 +#define PF12 137 +#define PF13 138 +#define PF14 139 + +// This must be a literal with the same value as PEND +#define NUM_DIGITAL_PINS 140 + +// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 24 +#define NUM_ANALOG_FIRST 108 + +// Timer Definitions +//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c +#define TIMER_TONE TIM2 +#define TIMER_SERVO TIM5 +#define TIMER_SERIAL TIM7 + +// UART1 for TFT port +#define ENABLE_HWSERIAL1 +#define PIN_SERIAL1_RX PA10 +#define PIN_SERIAL1_TX PA9 + +// UART4 for ESP-01 port +#define ENABLE_HWSERIAL4 +#define PIN_SERIAL4_RX PA1 +#define PIN_SERIAL4_TX PA0 + +// IIC1 for onboard 24C32 EEPROM +#define PIN_WIRE_SDA PB9 +#define PIN_WIRE_SCL PB8 + +// SPI3 for onboard SD card +// #define PIN_SPI_MOSI PC12 +// #define PIN_SPI_MISO PC11 +// #define PIN_SPI_SCK PC10 + +// HSE default value is 25MHz in HAL +// HSE_BYPASS is 25MHz +#ifndef HSE_BYPASS_NOT_USED + #define HSE_VALUE 25000000 +#endif + +// #define USE_USB_FS +/* Extra HAL modules */ +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_DAC_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE Serial +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/tests/BTT_SKR_SE_BX b/buildroot/tests/BTT_SKR_SE_BX new file mode 100755 index 0000000000..b5d6f6de83 --- /dev/null +++ b/buildroot/tests/BTT_SKR_SE_BX @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# +# Build tests for BTT_SKR_SE_BX +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_SE_BX +opt_set SERIAL_PORT 1 +exec_test $1 $2 "Default Configuration" "$3" + +# clean up +restore_configs diff --git a/ini/features.ini b/ini/features.ini index 7399a22446..10eafdc559 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -37,7 +37,7 @@ HAS_WIRED_LCD = src_filter=+ HAS_MARLINUI_HD44780 = src_filter=+ HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 src_filter=+ -HAS_(FSMC|SPI)_TFT = src_filter=+ + + +HAS_(FSMC|SPI|LTDC)_TFT = src_filter=+ + + HAS_FSMC_TFT = src_filter=+ + HAS_SPI_TFT = src_filter=+ + I2C_EEPROM = src_filter=+ diff --git a/ini/stm32f7.ini b/ini/stm32f7.ini index 442ef5f9b0..d3fec7aebc 100644 --- a/ini/stm32f7.ini +++ b/ini/stm32f7.ini @@ -28,3 +28,28 @@ platform = ${common_stm32.platform} extends = common_stm32 board = remram_v1 build_flags = ${common_stm32.build_flags} + +# +# BigTreeTech SKR SE BX (STM32H743IIT6 ARM Cortex-M7) +# +[env:BTT_SKR_SE_BX] +platform = ${common_stm32.platform} +platform_packages = ${stm_flash_drive.platform_packages} +extends = common_stm32 +board = BTT_SKR_SE_BX +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +build_flags = ${common_stm32.build_flags} + ${stm_flash_drive.build_flags} + -DUSE_USBHOST_HS + -DUSE_USB_HS_IN_FS + #-DUSBD_USE_CDC_MSC + -DVECT_TAB_OFFSET=0x20000 + -DHAL_DMA2D_MODULE_ENABLED + -DHAL_LTDC_MODULE_ENABLED + -DHAL_SDRAM_MODULE_ENABLED + -DHAL_QSPI_MODULE_ENABLED + -DHAL_MDMA_MODULE_ENABLED + -DHAL_SD_MODULE_ENABLED +upload_protocol = cmsis-dap +debug_tool = cmsis-dap From ab2441c0887211b82fa473c4a7e7425f7ddfb104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radim=20Karni=C5=A1?= <57687985+radimkarnis@users.noreply.github.com> Date: Wed, 7 Apr 2021 21:41:38 +0200 Subject: [PATCH 1259/1370] Park Magnetic Switching Toolhead at the very end (#21552) --- Marlin/src/module/tool_change.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 71dd6d40ec..ab0595c58b 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1112,7 +1112,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) // If the original position is within tool store area, go to X origin at once if (destination.y < SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR) { - current_position.x = 0; + current_position.x = X_MIN_POS; planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], new_tool); planner.synchronize(); } From c8c83e9f52fffcac09e8f29200596753aadd5c55 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 8 Apr 2021 08:02:09 +1200 Subject: [PATCH 1260/1370] Sanity Check newer Configs too (#21550) Co-authored-by: Scott Lahteine --- Marlin/src/inc/SanityCheck.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index f6c5cc202a..64fcc85aad 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -60,18 +60,23 @@ #undef TEST4 /** - * We try our best to include sanity checks for all changed configuration - * directives because users have a tendency to use outdated config files with - * the bleeding-edge source code, but sometimes this is not enough. This check - * forces a minimum config file revision. Otherwise Marlin will not build. + * This is to alert you about non-matching versions of config files. + * + * You can edit the version tag in your old config files and try the build again. + * The checks below will alert you about options that need to be changed, but they won't + * tell you about new options that you might find useful. So it's recommended to transfer + * your settings to new Configuration files matching your Marlin version as soon as possible. */ #define HEXIFY(H) _CAT(0x,H) #if !defined(CONFIGURATION_H_VERSION) || HEXIFY(CONFIGURATION_H_VERSION) < HEXIFY(REQUIRED_CONFIGURATION_H_VERSION) - #error "You are using an old Configuration.h file, update it before building Marlin." + #error "Your Configuration.h file is for an old version of Marlin. Downgrade Marlin or upgrade your Configuration.h." +#elif HEXIFY(CONFIGURATION_H_VERSION) > HEXIFY(REQUIRED_CONFIGURATION_H_VERSION) + #error "Your Configuration.h file is for a newer version of Marlin. Upgrade Marlin or downgrade your Configuration.h." #endif - #if !defined(CONFIGURATION_ADV_H_VERSION) || HEXIFY(CONFIGURATION_ADV_H_VERSION) < HEXIFY(REQUIRED_CONFIGURATION_ADV_H_VERSION) - #error "You are using an old Configuration_adv.h file, update it before building Marlin." + #error "Your Configuration_adv.h file is for an old version of Marlin. Downgrade Marlin or upgrade your Configuration_adv.h." +#elif HEXIFY(CONFIGURATION_ADV_H_VERSION) > HEXIFY(REQUIRED_CONFIGURATION_ADV_H_VERSION) + #error "Your Configuration_adv.h file is for a newer version of Marlin. Upgrade Marlin or downgrade your Configuration_adv.h." #endif #undef HEXIFY From 1bd35072cbf45b2b5574dc6a05f411b00238e120 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 7 Apr 2021 15:43:07 -0500 Subject: [PATCH 1261/1370] Fix axis char printing --- Marlin/src/core/serial.h | 1 + Marlin/src/feature/fwretract.cpp | 16 +++++++-------- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/gcode/calibrate/M666.cpp | 2 +- Marlin/src/gcode/control/M605.cpp | 2 +- Marlin/src/gcode/parser.cpp | 2 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- .../lib/dgus/fysetc/DGUSScreenHandler.cpp | 6 +++--- .../lib/dgus/hiprecy/DGUSScreenHandler.cpp | 6 +++--- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 8 ++++---- .../lib/dgus/origin/DGUSScreenHandler.cpp | 6 +++--- .../src/lcd/extui/lib/nextion/nextion_tft.cpp | 8 ++++---- Marlin/src/lcd/marlinui.cpp | 4 ++-- Marlin/src/module/motion.cpp | 20 +++++++++---------- 14 files changed, 43 insertions(+), 42 deletions(-) diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 45a1ab012e..b503c0f429 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -144,6 +144,7 @@ void SERIAL_ECHO(T x) { SERIAL_IMPL.print(x); } typedef struct SerialChar { char c; SerialChar(char n) : c(n) { } } serial_char_t; inline void SERIAL_ECHO(serial_char_t x) { SERIAL_IMPL.write(x.c); } #define AS_CHAR(C) serial_char_t(C) +#define AS_DIGIT(C) AS_CHAR('0' + (C)) // SERIAL_ECHO_F prints a floating point value with optional precision inline void SERIAL_ECHO_F(EnsureDouble x, int digit=2) { SERIAL_IMPL.print(x, digit); } diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index 4e57ba0150..bfcdb8c001 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -111,14 +111,14 @@ void FWRetract::retract(const bool retracting /* // debugging SERIAL_ECHOLNPAIR( - "retracting ", retracting, + "retracting ", AS_DIGIT(retracting), " swapping ", swapping, " active extruder ", active_extruder ); LOOP_L_N(i, EXTRUDERS) { - SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); + SERIAL_ECHOLNPAIR("retracted[", i, "] ", AS_DIGIT(retracted[i])); #if HAS_MULTI_EXTRUDER - SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); + SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", AS_DIGIT(retracted_swap[i])); #endif } SERIAL_ECHOLNPAIR("current_position.z ", current_position.z); @@ -185,13 +185,13 @@ void FWRetract::retract(const bool retracting #endif /* // debugging - SERIAL_ECHOLNPAIR("retracting ", retracting); - SERIAL_ECHOLNPAIR("swapping ", swapping); + SERIAL_ECHOLNPAIR("retracting ", AS_DIGIT(retracting)); + SERIAL_ECHOLNPAIR("swapping ", AS_DIGIT(swapping)); SERIAL_ECHOLNPAIR("active_extruder ", active_extruder); LOOP_L_N(i, EXTRUDERS) { - SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); + SERIAL_ECHOLNPAIR("retracted[", i, "] ", AS_DIGIT(retracted[i])); #if HAS_MULTI_EXTRUDER - SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); + SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", AS_DIGIT(retracted_swap[i])); #endif } SERIAL_ECHOLNPAIR("current_position.z ", current_position.z); @@ -268,7 +268,7 @@ void FWRetract::M208_report(const bool forReplay/*=false*/) { void FWRetract::M209_report(const bool forReplay/*=false*/) { if (!forReplay) { SERIAL_ECHO_MSG("; Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); SERIAL_ECHO_START(); } - SERIAL_ECHOLNPAIR(" M209 S", autoretract_enabled); + SERIAL_ECHOLNPAIR(" M209 S", AS_DIGIT(autoretract_enabled)); } #endif // FWRETRACT_AUTORETRACT diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index e45864b484..dd4c78726a 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -612,7 +612,7 @@ void PrintJobRecovery::resume() { DEBUG_ECHOLNPAIR("sd_filename: ", info.sd_filename); DEBUG_ECHOLNPAIR("sdpos: ", info.sdpos); DEBUG_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed); - DEBUG_ECHOLNPAIR("dryrun: ", info.flag.dryrun); + DEBUG_ECHOLNPAIR("dryrun: ", AS_DIGIT(info.flag.dryrun)); DEBUG_ECHOLNPAIR("allow_cold_extrusion: ", info.flag.allow_cold_extrusion); } else diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp index e915aa8ff7..75becf13f3 100644 --- a/Marlin/src/gcode/calibrate/M666.cpp +++ b/Marlin/src/gcode/calibrate/M666.cpp @@ -43,7 +43,7 @@ if (parser.seen(XYZ_CHAR(i))) { const float v = parser.value_linear_units(); if (v * Z_HOME_DIR <= 0) delta_endstop_adj[i] = v; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", XYZ_CHAR(i), "] = ", delta_endstop_adj[i]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", AS_CHAR(XYZ_CHAR(i)), "] = ", delta_endstop_adj[i]); } } } diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 3d13cb1c24..e0c79f0e54 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -141,7 +141,7 @@ HOTEND_LOOP() { DEBUG_ECHOPAIR_P(SP_T_STR, e); - LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", e, "].", XYZ_CHAR(a) | 0x20, "=", hotend_offset[e][a]); + LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", e, "].", AS_CHAR(XYZ_CHAR(a) | 0x20), "=", hotend_offset[e][a]); DEBUG_EOL(); } DEBUG_EOL(); diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index ebe9d3b2cd..f7812bf3f6 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -307,7 +307,7 @@ void GCodeParser::parse(char *p) { #if ENABLED(DEBUG_GCODE_PARSER) if (debug) { - SERIAL_ECHOPAIR("Got param ", param, " at index ", p - command_ptr - 1); + SERIAL_ECHOPAIR("Got param ", AS_CHAR(param), " at index ", p - command_ptr - 1); if (has_val) SERIAL_ECHOPGM(" (has_val)"); } #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index aa78fcb539..5eb8611b5e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -639,7 +639,7 @@ namespace Anycubic { float newposition = atof(&panel_command[6]); #if ACDEBUG(AC_ACTION) - SERIAL_ECHOLNPAIR("Nudge ", panel_command[4], " axis ", newposition); + SERIAL_ECHOLNPAIR("Nudge ", AS_CHAR(panel_command[4]), " axis ", newposition); #endif switch (panel_command[4]) { diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp index 5497dd53cc..26dafeaaab 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp @@ -188,7 +188,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!movevalue) { // homing - DEBUG_ECHOPAIR(" homing ", axiscode); + DEBUG_ECHOPAIR(" homing ", AS_CHAR(axiscode)); char buf[6] = "G28 X"; buf[4] = axiscode; //DEBUG_ECHOPAIR(" ", buf); @@ -199,7 +199,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } else { // movement - DEBUG_ECHOPAIR(" move ", axiscode); + DEBUG_ECHOPAIR(" move ", AS_CHAR(axiscode)); bool old_relative_mode = relative_mode; if (!relative_mode) { //DEBUG_ECHOPGM(" G91"); @@ -235,7 +235,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { return; cannotmove: - DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + DEBUG_ECHOLNPAIR(" cannot move ", AS_CHAR(axiscode)); return; } diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp index c170c288aa..f91c2737e0 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp @@ -188,7 +188,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!movevalue) { // homing - DEBUG_ECHOPAIR(" homing ", axiscode); + DEBUG_ECHOPAIR(" homing ", AS_CHAR(axiscode)); char buf[6] = "G28 X"; buf[4] = axiscode; //DEBUG_ECHOPAIR(" ", buf); @@ -199,7 +199,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } else { // movement - DEBUG_ECHOPAIR(" move ", axiscode); + DEBUG_ECHOPAIR(" move ", AS_CHAR(axiscode)); bool old_relative_mode = relative_mode; if (!relative_mode) { //DEBUG_ECHOPGM(" G91"); @@ -235,7 +235,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { return; cannotmove: - DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + DEBUG_ECHOLNPAIR(" cannot move ", AS_CHAR(axiscode)); return; } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 109e9a8ac6..b507c1ec3e 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -835,7 +835,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!movevalue) { // homing - DEBUG_ECHOPAIR(" homing ", axiscode); + DEBUG_ECHOPAIR(" homing ", AS_CHAR(axiscode)); // char buf[6] = "G28 X"; // buf[4] = axiscode; @@ -850,14 +850,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { else if (movevalue == 5) { DEBUG_ECHOPAIR("send M84"); char buf[6]; - snprintf_P(buf,6,PSTR("M84 %c"),axiscode); + snprintf_P(buf,6,PSTR("M84 %c"), axiscode); queue.enqueue_one_now(buf); ForceCompleteUpdate(); return; } else { // movement - DEBUG_ECHOPAIR(" move ", axiscode); + DEBUG_ECHOPAIR(" move ", AS_CHAR(axiscode)); bool old_relative_mode = relative_mode; if (!relative_mode) { @@ -895,7 +895,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { return; cannotmove: - DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + DEBUG_ECHOLNPAIR(" cannot move ", AS_CHAR(axiscode)); return; } diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp index ff924f4061..8806623b69 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp @@ -188,7 +188,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!movevalue) { // homing - DEBUG_ECHOPAIR(" homing ", axiscode); + DEBUG_ECHOPAIR(" homing ", AS_CHAR(axiscode)); char buf[6] = "G28 X"; buf[4] = axiscode; //DEBUG_ECHOPAIR(" ", buf); @@ -199,7 +199,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } else { // movement - DEBUG_ECHOPAIR(" move ", axiscode); + DEBUG_ECHOPAIR(" move ", AS_CHAR(axiscode)); bool old_relative_mode = relative_mode; if (!relative_mode) { //DEBUG_ECHOPGM(" G91"); @@ -235,7 +235,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { return; cannotmove: - DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + DEBUG_ECHOLNPAIR(" cannot move ", AS_CHAR(axiscode)); return; } diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp index e2fa6bc518..23857c65c3 100644 --- a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp @@ -144,10 +144,10 @@ bool NextionTFT::ReadTFTCommand() { #if NEXDEBUG(N_SOME) uint8_t req = atoi(&nextion_command[1]); if (req > 7 && req != 20) - DEBUG_ECHOLNPAIR( "> ", nextion_command[0], - "\n> ", nextion_command[1], - "\n> ", nextion_command[2], - "\n> ", nextion_command[3], + DEBUG_ECHOLNPAIR( "> ", AS_CHAR(nextion_command[0]), + "\n> ", AS_CHAR(nextion_command[1]), + "\n> ", AS_CHAR(nextion_command[2]), + "\n> ", AS_CHAR(nextion_command[3]), "\nprinter_state:", printer_state); #endif } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 4d457dc6aa..149da8b54e 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -761,7 +761,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { // For Cartesian / Core motion simply move to the current_position planner.buffer_line(current_position, fr_mm_s, axis == E_AXIS ? e_index : active_extruder); - //SERIAL_ECHOLNPAIR("Add planner.move with Axis ", axis, " at FR ", fr_mm_s); + //SERIAL_ECHOLNPAIR("Add planner.move with Axis ", AS_CHAR(axis_codes[axis]), " at FR ", fr_mm_s); axis = NO_AXIS; @@ -782,7 +782,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { #endif start_time = millis() + (menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves axis = move_axis; - //SERIAL_ECHOLNPAIR("Post Move with Axis ", axis, " soon."); + //SERIAL_ECHOLNPAIR("Post Move with Axis ", AS_CHAR(axis_codes[axis]), " soon."); } #if ENABLED(AUTO_BED_LEVELING_UBL) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 81c3a81fbe..48535b63d6 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -622,7 +622,7 @@ void restore_feedrate_and_scaling() { #endif if (DEBUGGING(LEVELING)) - SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]); + SERIAL_ECHOLNPAIR("Axis ", AS_CHAR(XYZ_CHAR(axis)), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]); } /** @@ -1392,12 +1392,12 @@ void prepare_line_to_destination() { * "trusted" position). */ void set_axis_never_homed(const AxisEnum axis) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", AS_CHAR(axis_codes[axis]), ")"); set_axis_untrusted(axis); set_axis_unhomed(axis); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", AS_CHAR(axis_codes[axis]), ")"); TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); } @@ -1458,7 +1458,7 @@ void prepare_line_to_destination() { if (ABS(phaseDelta) * planner.steps_to_mm[axis] / phasePerUStep < 0.05f) SERIAL_ECHOLNPAIR("Selected home phase ", home_phase[axis], " too close to endstop trigger phase ", phaseCurrent, - ". Pick a different phase for ", axis_codes[axis]); + ". Pick a different phase for ", AS_CHAR(axis_codes[axis])); // Skip to next if target position is behind current. So it only moves away from endstop. if (phaseDelta < 0) phaseDelta += 1024; @@ -1469,7 +1469,7 @@ void prepare_line_to_destination() { // Optional debug messages if (DEBUGGING(LEVELING)) { DEBUG_ECHOLNPAIR( - "Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent, + "Endstop ", AS_CHAR(axis_codes[axis]), " hit at Phase:", phaseCurrent, " Delta:", phaseDelta, " Distance:", mmDelta ); } @@ -1507,7 +1507,7 @@ void prepare_line_to_destination() { if (!_CAN_HOME(X) && !_CAN_HOME(Y) && !_CAN_HOME(Z)) return; #endif - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> homeaxis(", axis_codes[axis], ")"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> homeaxis(", AS_CHAR(axis_codes[axis]), ")"); const int axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) ? x_home_dir(active_extruder) : home_dir(axis); @@ -1585,7 +1585,7 @@ void prepare_line_to_destination() { case Z_AXIS: es = Z_ENDSTOP; break; } if (TEST(endstops.state(), es)) { - SERIAL_ECHO_MSG("Bad ", axis_codes[axis], " Endstop?"); + SERIAL_ECHO_MSG("Bad ", AS_CHAR(axis_codes[axis]), " Endstop?"); kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); } #endif @@ -1807,7 +1807,7 @@ void prepare_line_to_destination() { if (axis == Z_AXIS) fwretract.current_hop = 0.0; #endif - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< homeaxis(", axis_codes[axis], ")"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< homeaxis(", AS_CHAR(axis_codes[axis]), ")"); } // homeaxis() @@ -1885,14 +1885,14 @@ void set_axis_is_at_home(const AxisEnum axis) { DEBUG_ECHOLNPAIR("> home_offset[", AS_CHAR(axis_codes[axis]), "] = ", home_offset[axis]); #endif DEBUG_POS("", current_position); - DEBUG_ECHOLNPAIR("<<< set_axis_is_at_home(", axis_codes[axis], ")"); + DEBUG_ECHOLNPAIR("<<< set_axis_is_at_home(", AS_CHAR(axis_codes[axis]), ")"); } } #if HAS_WORKSPACE_OFFSET void update_workspace_offset(const AxisEnum axis) { workspace_offset[axis] = home_offset[axis] + position_shift[axis]; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " home_offset = ", home_offset[axis], " position_shift = ", position_shift[axis]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Axis ", AS_CHAR(XYZ_CHAR(axis)), " home_offset = ", home_offset[axis], " position_shift = ", position_shift[axis]); } #endif From c9a7fd1722764f2b790a38f2c7ee0c4d00d77c17 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 8 Apr 2021 22:35:21 -0300 Subject: [PATCH 1262/1370] Delay U8glib init using U8glib-HAL 0.4.4 (#21496) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dogm/HAL_LCD_class_defines.h | 86 ++++++++++++--------- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 9 ++- ini/features.ini | 2 +- 3 files changed, 59 insertions(+), 38 deletions(-) diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h index 30a5361ab9..28ca26134e 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h @@ -30,12 +30,15 @@ extern u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi; class U8GLIB_64128N_2X_HAL : public U8GLIB { public: - U8GLIB_64128N_2X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) - { } - U8GLIB_64128N_2X_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) - { } + U8GLIB_64128N_2X_HAL() : U8GLIB() { } + U8GLIB_64128N_2X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, a0, reset); } + U8GLIB_64128N_2X_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { init(cs, a0, reset); } + void init(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_st7565_64128n_HAL_2x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset); + } + void init(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_st7565_64128n_HAL_2x_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset); + } }; extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi; @@ -43,12 +46,15 @@ extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi; class U8GLIB_ST7920_128X64_4X_HAL : public U8GLIB { public: - U8GLIB_ST7920_128X64_4X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE - { } - U8GLIB_ST7920_128X64_4X_HAL(pin_t cs, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_hw_spi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE - { } + U8GLIB_ST7920_128X64_4X_HAL() : U8GLIB() { } + U8GLIB_ST7920_128X64_4X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, reset); } + U8GLIB_ST7920_128X64_4X_HAL(pin_t cs, pin_t reset = U8G_PIN_NONE) { init(cs, reset); } + void init(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_st7920_128x64_HAL_4x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset); // a0 = U8G_PIN_NONE + } + void init(pin_t cs, pin_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_st7920_128x64_HAL_4x_hw_spi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset); // a0 = U8G_PIN_NONE + } }; // @@ -59,27 +65,29 @@ extern u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi; class U8GLIB_ST7920_128X64_RRD : public U8GLIB { public: - U8GLIB_ST7920_128X64_RRD(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7920_128x64_rrd_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE - { } + U8GLIB_ST7920_128X64_RRD() : U8GLIB() { } + U8GLIB_ST7920_128X64_RRD(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, reset); } + void init(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_st7920_128x64_rrd_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset); // a0 = U8G_PIN_NONE + } }; extern u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire; class U8GLIB_SH1106_128X64_2X_I2C_2_WIRE : public U8GLIB { public: - U8GLIB_SH1106_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) - : U8GLIB(&u8g_dev_sh1106_128x64_2x_i2c_2_wire, options) - { } + U8GLIB_SH1106_128X64_2X_I2C_2_WIRE() : U8GLIB() { } + U8GLIB_SH1106_128X64_2X_I2C_2_WIRE(uint8_t options) { init(options); } + void init(uint8_t options = U8G_I2C_OPT_NONE) { U8GLIB::init(&u8g_dev_sh1106_128x64_2x_i2c_2_wire, options); } }; extern u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire; class U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE : public U8GLIB { public: - U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) - : U8GLIB(&u8g_dev_ssd1306_128x64_2x_i2c_2_wire, options) - { } + U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE() : U8GLIB() { } + U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE(uint8_t options) { init(options); } + void init(uint8_t options = U8G_I2C_OPT_NONE) { U8GLIB::init(&u8g_dev_ssd1306_128x64_2x_i2c_2_wire, options); } }; // @@ -90,9 +98,9 @@ extern u8g_dev_t u8g_dev_tft_320x240_upscale_from_128x64; class U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 : public U8GLIB { public: - U8GLIB_TFT_320X240_UPSCALE_FROM_128X64(uint8_t cs, uint8_t rs, uint8_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset) - { } + U8GLIB_TFT_320X240_UPSCALE_FROM_128X64() : U8GLIB() { } + U8GLIB_TFT_320X240_UPSCALE_FROM_128X64(uint8_t cs, uint8_t rs, uint8_t reset = U8G_PIN_NONE) { init(cs, rs, reset); } + void init(uint8_t cs, uint8_t rs, uint8_t reset = U8G_PIN_NONE) { U8GLIB::init(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset); } }; @@ -100,12 +108,15 @@ extern u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, u8g_dev_uc1701_mini1286 class U8GLIB_MINI12864_2X_HAL : public U8GLIB { public: - U8GLIB_MINI12864_2X_HAL(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, sck, mosi, cs, a0, reset) - { } - U8GLIB_MINI12864_2X_HAL(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset) - { } + U8GLIB_MINI12864_2X_HAL() : U8GLIB() { } + U8GLIB_MINI12864_2X_HAL(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, a0, reset); } + U8GLIB_MINI12864_2X_HAL(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) { init(cs, a0, reset); } + void init(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, sck, mosi, cs, a0, reset); + } + void init(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset); + } }; extern u8g_dev_t u8g_dev_ssd1309_sw_spi; @@ -113,10 +124,13 @@ extern u8g_dev_t u8g_dev_ssd1309_hw_spi; class U8GLIB_SSD1309_128X64_HAL : public U8GLIB { public: - U8GLIB_SSD1309_128X64_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_ssd1309_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) - { } - U8GLIB_SSD1309_128X64_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_ssd1309_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) - { } + U8GLIB_SSD1309_128X64_HAL() : U8GLIB() { } + U8GLIB_SSD1309_128X64_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { init(sck, mosi, cs, a0, reset); } + U8GLIB_SSD1309_128X64_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { init(cs, a0, reset); } + void init(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_ssd1309_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset); + } + void init(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) { + U8GLIB::init(&u8g_dev_ssd1309_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset); + } }; diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 44ada03c7e..dc60c1bff3 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -76,7 +76,7 @@ #define FONT_STATUSMENU_NAME MENU_FONT_NAME #endif -U8G_CLASS u8g(U8G_PARAM); +U8G_CLASS u8g; #include LANGUAGE_DATA_INCL(LCD_LANGUAGE) @@ -252,6 +252,13 @@ bool MarlinUI::detected() { return true; } // Initialize or re-initialize the LCD void MarlinUI::init_lcd() { + + static bool did_init_u8g = false; + if (!did_init_u8g) { + u8g.init(U8G_PARAM); + did_init_u8g = true; + } + #if PIN_EXISTS(LCD_BACKLIGHT) OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away #endif diff --git a/ini/features.ini b/ini/features.ini index 10eafdc559..864befa7a8 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -35,7 +35,7 @@ USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 HAS_WIRED_LCD = src_filter=+ HAS_MARLINUI_HD44780 = src_filter=+ -HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 +HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.4 src_filter=+ HAS_(FSMC|SPI|LTDC)_TFT = src_filter=+ + + HAS_FSMC_TFT = src_filter=+ + From a82b3955bb7e62ca745077ad589f46db1561ad1a Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 9 Apr 2021 13:36:48 +1200 Subject: [PATCH 1263/1370] Check for old Marlin files mixed in (#21574) --- .../share/PlatformIO/scripts/preflight-checks.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 2ad1562a31..6b499a8bcd 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -73,3 +73,15 @@ for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: if os.path.isfile(os.path.join(p, f)): err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p raise SystemExit(err) + +# +# Check for old files indicating an entangled Marlin (mixing old and new code) +# +mixedin = [] +for p in [ os.path.join(env['PROJECT_DIR'], "Marlin/src/lcd/dogm") ]: + for f in [ "ultralcd_DOGM.cpp", "ultralcd_DOGM.h" ]: + if os.path.isfile(os.path.join(p, f)): + mixedin += [ f ] +if mixedin: + err = "ERROR: Old files fell into your Marlin folder. Remove %s and try again" % ", ".join(mixedin) + raise SystemExit(err) From 6d9aaf8de5b2b7739de8b87565b9b8efc92434d2 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Fri, 9 Apr 2021 04:03:34 +0200 Subject: [PATCH 1264/1370] Macros to eliminate 'f + 0.0' (#21568) --- Marlin/src/core/macros.h | 15 +++++++++++---- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 6 +++--- Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/motion.cpp | 4 ++-- Marlin/src/module/planner.cpp | 2 +- Marlin/src/module/scara.cpp | 6 +++--- Marlin/src/module/tool_change.cpp | 2 +- 10 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index fb129cd939..6092dc4a59 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -187,14 +187,21 @@ #define DISABLED(V...) DO(DIS,&&,V) #define COUNT_ENABLED(V...) DO(ENA,+,V) -#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1' -#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0' -#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION converted to A or '1' -#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION converted to A or '' +#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION ? 'A' : 'B' +#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION ? 'A' : '0' +#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION ? 'A' : '1' +#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION ? 'A' : '' #define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. +// Macros to avoid 'f + 0.0' which is not always optimized away. Minus included for symmetry. +// Compiler flags -fno-signed-zeros -ffinite-math-only also cover 'f * 1.0', 'f - f', etc. +#define PLUS_TERN0(O,A) _TERN(_ENA_1(O),,+ (A)) // OPTION ? '+ (A)' : '' +#define MINUS_TERN0(O,A) _TERN(_ENA_1(O),,- (A)) // OPTION ? '- (A)' : '' +#define SUM_TERN(O,B,A) ((B) PLUS_TERN0(O,A)) // ((B) (OPTION ? '+ (A)' : '')) +#define DIFF_TERN(O,B,A) ((B) MINUS_TERN0(O,A)) // ((B) (OPTION ? '- (A)' : '')) + #define IF_ENABLED TERN_ #define IF_DISABLED(O,A) TERN(O,,A) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 0fab747618..ad2cc67db0 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -102,7 +102,7 @@ void GcodeSuite::G35() { // In BLTOUCH HS mode, the probe travels in a deployed state. // Users of G35 might have a badly misaligned bed, so raise Z by the // length of the deployed pin (BLTOUCH stroke < 7mm) - do_blocking_move_to_z((Z_CLEARANCE_BETWEEN_PROBES) + TERN0(BLTOUCH_HS_MODE, 7)); + do_blocking_move_to_z(SUM_TERN(BLTOUCH_HS_MODE, Z_CLEARANCE_BETWEEN_PROBES, 7)); const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true); if (isnan(z_probed_height)) { diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 4cfb4e411b..8635661d01 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -269,7 +269,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { do { ui.refresh(LCDVIEW_REDRAW_NOW); _lcd_draw_probing(); // update screen with # of good points - do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP + TERN0(BLTOUCH_HS_MODE, 7)); // clearance + do_blocking_move_to_z(SUM_TERN(BLTOUCH_HS_MODE, current_position.z + LEVEL_CORNERS_Z_HOP, 7)); // clearance _lcd_level_bed_corners_get_next_position(); // Select next corner coordinates current_position -= probe.offset_xy; // Account for probe offsets diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index dfa7b92a99..fea4fa25a9 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -93,7 +93,7 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { ui.encoderPosition = 0; if (ui.should_draw()) { const float pos = NATIVE_TO_LOGICAL( - ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), + ui.manual_move.processing ? destination[axis] : SUM_TERN(IS_KINEMATIC, current_position[axis], ui.manual_move.offset), axis ); if (parser.using_inch_units()) { @@ -130,8 +130,8 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } MenuEditItemBase::draw_edit_screen( GET_TEXT(TERN(MULTI_MANUAL, MSG_MOVE_EN, MSG_MOVE_E)), ftostr41sign(current_position.e - + TERN0(IS_KINEMATIC, ui.manual_move.offset) - - TERN0(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin) + PLUS_TERN0(IS_KINEMATIC, ui.manual_move.offset) + MINUS_TERN0(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin) ) ); } // should_draw diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 21b280ac75..4d5a0b4fda 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -610,7 +610,7 @@ static void drawAxisValue(AxisEnum axis) { probe.offset.z : #endif NATIVE_TO_LOGICAL( - ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), + ui.manual_move.processing ? destination[axis] : SUM_TERN(IS_KINEMATIC, current_position[axis], ui.manual_move.offset), axis ); xy_int_t pos; diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 6ba9f4e9f2..eb42bd1946 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -248,7 +248,7 @@ void home_delta() { #endif // Move all carriages together linearly until an endstop is hit. - current_position.z = (delta_height + 10 - TERN0(HAS_BED_PROBE, probe.offset.z)); + current_position.z = DIFF_TERN(HAS_BED_PROBE, delta_height + 10, probe.offset.z); line_to_current_position(homing_feedrate(Z_AXIS)); planner.synchronize(); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 48535b63d6..afd30a44e0 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -583,7 +583,7 @@ void restore_feedrate_and_scaling() { #elif ENABLED(DELTA) soft_endstop.min[axis] = base_min_pos(axis); - soft_endstop.max[axis] = (axis == Z_AXIS) ? delta_height - TERN0(HAS_BED_PROBE, probe.offset.z) : base_max_pos(axis); + soft_endstop.max[axis] = (axis == Z_AXIS) ? DIFF_TERN(HAS_BED_PROBE, delta_height, probe.offset.z) : base_max_pos(axis); switch (axis) { case X_AXIS: @@ -1847,7 +1847,7 @@ void set_axis_is_at_home(const AxisEnum axis) { #if EITHER(MORGAN_SCARA, AXEL_TPARA) scara_set_axis_is_at_home(axis); #elif ENABLED(DELTA) - current_position[axis] = (axis == Z_AXIS) ? delta_height - TERN0(HAS_BED_PROBE, probe.offset.z) : base_home_pos(axis); + current_position[axis] = (axis == Z_AXIS) ? DIFF_TERN(HAS_BED_PROBE, delta_height, probe.offset.z) : base_home_pos(axis); #else current_position[axis] = base_home_pos(axis); #endif diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index e111a808b2..d6356432e7 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2997,7 +2997,7 @@ void Planner::set_e_position_mm(const_float_t e) { const uint8_t axis_index = E_AXIS_N(active_extruder); TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); - const float e_new = e - TERN0(FWRETRACT, fwretract.current_retract[active_extruder]); + const float e_new = DIFF_TERN(FWRETRACT, e, fwretract.current_retract[active_extruder]); position.e = LROUND(settings.axis_steps_per_mm[axis_index] * e_new); TERN_(HAS_POSITION_FLOAT, position_float.e = e_new); TERN_(IS_KINEMATIC, position_cart.e = e); diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index d02136039a..cc177f76c2 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -51,8 +51,8 @@ float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SE void forward_kinematics(const_float_t a, const_float_t b) { const float a_sin = sin(RADIANS(a)) * L1, a_cos = cos(RADIANS(a)) * L1, - b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, - b_cos = cos(RADIANS(b + TERN0(MP_SCARA, a))) * L2; + b_sin = sin(RADIANS(SUM_TERN(MP_SCARA, b, a))) * L2, + b_cos = cos(RADIANS(SUM_TERN(MP_SCARA, b, a))) * L2; cartes.x = a_cos + b_cos + scara_offset.x; // theta cartes.y = a_sin + b_sin + scara_offset.y; // phi @@ -127,7 +127,7 @@ float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SE // Angle of Arm2 PSI = ATAN2(S2, C2); - delta.set(DEGREES(THETA), DEGREES(PSI + TERN0(MORGAN_SCARA, THETA)), raw.z); + delta.set(DEGREES(THETA), DEGREES(SUM_TERN(MORGAN_SCARA, PSI, THETA)), raw.z); /* DEBUG_POS("SCARA IK", raw); diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index ab0595c58b..1ed395dfe4 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -359,7 +359,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 6 - current_position.x = midpos - TERN0(HAS_HOTEND_OFFSET, hotend_offset[new_tool].x); + current_position.x = DIFF_TERN(HAS_HOTEND_OFFSET, midpos, hotend_offset[new_tool].x); DEBUG_SYNCHRONIZE(); DEBUG_POS("(6) Move midway between hotends", current_position); From 00ea75ce822506765c1fc1af0445a910e530bc47 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Fri, 9 Apr 2021 04:05:31 +0200 Subject: [PATCH 1265/1370] Drop return value from Serial::write() (#21567) --- Marlin/src/HAL/AVR/MarlinSerial.cpp | 5 ++--- Marlin/src/HAL/AVR/MarlinSerial.h | 2 +- Marlin/src/core/serial_base.h | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index 81503e1fe9..7cd4446987 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -454,7 +454,7 @@ void MarlinSerial::flush() { } template -size_t MarlinSerial::write(const uint8_t c) { +void MarlinSerial::write(const uint8_t c) { if (Cfg::TX_SIZE == 0) { _written = true; @@ -480,7 +480,7 @@ size_t MarlinSerial::write(const uint8_t c) { // location". This makes sure flush() won't return until the bytes // actually got written B_TXC = 1; - return 1; + return; } const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); @@ -510,7 +510,6 @@ size_t MarlinSerial::write(const uint8_t c) { // Enable TX ISR - Non atomic, but it will eventually enable TX ISR B_UDRIE = 1; } - return 1; } template diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 31bbaaa531..355ecd41fd 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -210,7 +210,7 @@ static int read(); static void flush(); static ring_buffer_pos_t available(); - static size_t write(const uint8_t c); + static void write(const uint8_t c); static void flushTX(); #if HAS_DGUS_LCD static ring_buffer_pos_t get_tx_buffer_free(); diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 8b23816b17..d8090eb83a 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -100,7 +100,7 @@ struct SerialBase { // Static dispatch methods below: // The most important method here is where it all ends to: - size_t write(uint8_t c) { return SerialChild->write(c); } + void write(uint8_t c) { SerialChild->write(c); } // Called when the parser finished processing an instruction, usually build to nothing void msgDone() const { SerialChild->msgDone(); } From 34f7142323080aac77444894b7bd3dfd64b0e752 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Sat, 10 Apr 2021 04:29:59 +0800 Subject: [PATCH 1266/1370] Fix manual move with MKS H43 (#21511) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/gcode.cpp | 4 ++ Marlin/src/gcode/gcode.h | 4 ++ .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 6 +-- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 2 +- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 54 ++++++++++++++----- 5 files changed, 52 insertions(+), 18 deletions(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index cdf11e870b..574e93aecc 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -977,6 +977,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 1001: M1001(); break; // M1001: [INTERNAL] Handle SD completion #endif + #if ENABLED(DGUS_LCD_UI_MKS) + case 1002: M1002(); break; // M1002: [INTERNAL] Tool-change and Relative E Move + #endif + #if ENABLED(MAX7219_GCODE) case 7219: M7219(); break; // M7219: Set LEDs, columns, and rows #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7ea2489584..977fc8bfd8 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -1069,6 +1069,10 @@ private: static void M1001(); #endif + #if ENABLED(DGUS_LCD_UI_MKS) + static void M1002(); + #endif + #if ENABLED(MAX7219_GCODE) static void M7219(); #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 355565ae5a..911965b9ae 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -45,7 +45,7 @@ uint16_t manualMoveStep = 1; uint16_t distanceFilament = 10; -uint16_t FilamentSpeed = 25; +uint16_t filamentSpeed_mm_s = 25; float ZOffset_distance = 0.1; float mesh_adj_distance = 0.01; float Z_distance = 0.1; @@ -555,7 +555,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_LOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentLoad, nullptr), VPHELPER(VP_UNLOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentUnLoad, nullptr), VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Filament_speed, &filamentSpeed_mm_s, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #endif #endif @@ -569,7 +569,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Filament_speed, &filamentSpeed_mm_s, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #endif #if ENABLED(PIDTEMP) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h index ac0a482ede..f174f38d96 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -37,7 +37,7 @@ extern uint16_t manualMoveStep; extern uint16_t distanceFilament; -extern uint16_t FilamentSpeed; +extern uint16_t filamentSpeed_mm_s; extern float ZOffset_distance; extern float mesh_adj_distance; extern float Z_distance; diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index b507c1ec3e..e6e2af42eb 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -840,7 +840,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { // buf[4] = axiscode; char buf[6]; - sprintf(buf,"G28 %c",axiscode); + sprintf(buf, "G28 %c", axiscode); //DEBUG_ECHOPAIR(" ", buf); queue.enqueue_one_now(buf); //DEBUG_ECHOLNPGM(" ✓"); @@ -1190,17 +1190,18 @@ void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ uint16_t value_len = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR_F("FilamentSpeed value:", value_len); + DEBUG_ECHOLNPAIR_F("filamentSpeed_mm_s value:", value_len); - FilamentSpeed = value_len; + filamentSpeed_mm_s = value_len; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) - char buf[40]; uint8_t swap_tool = 0; + #else + constexpr uint8_t swap_tool = 1; // T0 (or none at all) #endif #if HAS_HOTEND @@ -1215,9 +1216,8 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ default: break; case 0: #if HAS_HOTEND - if (thermalManager.tooColdToExtrude(0)) { + if (thermalManager.tooColdToExtrude(0)) hotend_too_cold = 1; - } else { #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) swap_tool = 1; @@ -1243,15 +1243,41 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ } #endif + if (swap_tool) { + char buf[30]; + snprintf_P(buf, 30 + #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + , PSTR("M1002T%cE%dF%d"), char('0' + swap_tool - 1) + #else + , PSTR("M1002E%dF%d") + #endif + , (int)distanceFilament * filamentDir, filamentSpeed_mm_s * 60 + ); + queue.inject(buf); + } +} + +/** + * M1002: Do a tool-change and relative move for MKS_FilamentLoadUnload + * within the G-code execution window for best concurrency. + */ +void GcodeSuite::M1002() { #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) - if (swap_tool) { - queue.enqueue_now_P(swap_tool == 2 ? PSTR("T1") : PSTR("T0")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf, 40, PSTR("G1 E%d F%d"), (int)distanceFilament * filamentDir, FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } + { + char buf[3]; + sprintf_P(buf, PSTR("T%c"), char('0' + parser.intval('T'))); + process_subcommands_now(buf); + } #endif + + const uint8_t old_axis_relative = axis_relative; + set_e_relative(true); // M83 + { + char buf[20]; + snprintf_P(buf, 20, PSTR("G1E%dF%d"), parser.intval('E'), parser.intval('F')); + process_subcommands_now(buf); + } + axis_relative = old_axis_relative; } void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { @@ -1445,7 +1471,7 @@ void DGUSScreenHandler::LanguagePInit() { void DGUSScreenHandler::DGUS_ExtrudeLoadInit(void) { ex_filament.ex_length = distanceFilament; ex_filament.ex_load_unload_flag = 0; - ex_filament.ex_need_time = FilamentSpeed; + ex_filament.ex_need_time = filamentSpeed_mm_s; ex_filament.ex_speed = 0; ex_filament.ex_status = EX_NONE; ex_filament.ex_tick_end = 0; From 9a31702a7513985c416f327c8c7089679952915b Mon Sep 17 00:00:00 2001 From: BigTreeTech <38851044+bigtreetech@users.noreply.github.com> Date: Sat, 10 Apr 2021 16:44:36 +0800 Subject: [PATCH 1267/1370] Fix M114 E / R broken by `LIN_ADVANCE` (#21579) --- Marlin/src/module/stepper.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 8c377bf7bf..5a5fa3afe6 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1697,12 +1697,12 @@ void Stepper::pulse_phase_isr() { #if EITHER(LIN_ADVANCE, MIXING_EXTRUDER) delta_error.e += advance_dividend.e; if (delta_error.e >= 0) { - count_position.e += count_direction.e; #if ENABLED(LIN_ADVANCE) delta_error.e -= advance_divisor; // Don't step E here - But remember the number of steps to perform motor_direction(E_AXIS) ? --LA_steps : ++LA_steps; #else + count_position.e += count_direction.e; step_needed.e = true; #endif } @@ -2283,15 +2283,23 @@ uint32_t Stepper::block_phase_isr() { #if ENABLED(MIXING_EXTRUDER) // We don't know which steppers will be stepped because LA loop follows, // with potentially multiple steps. Set all. - if (LA_steps > 0) + if (LA_steps > 0) { MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); - else if (LA_steps < 0) + count_direction.e = 1; + } + else if (LA_steps < 0) { MIXER_STEPPER_LOOP(j) REV_E_DIR(j); + count_direction.e = -1; + } #else - if (LA_steps > 0) + if (LA_steps > 0) { NORM_E_DIR(stepper_extruder); - else if (LA_steps < 0) + count_direction.e = 1; + } + else if (LA_steps < 0) { REV_E_DIR(stepper_extruder); + count_direction.e = -1; + } #endif DIR_WAIT_AFTER(); @@ -2312,6 +2320,8 @@ uint32_t Stepper::block_phase_isr() { AWAIT_LOW_PULSE(); #endif + count_position.e += count_direction.e; + // Set the STEP pulse ON #if ENABLED(MIXING_EXTRUDER) E_STEP_WRITE(mixer.get_next_stepper(), !INVERT_E_STEP_PIN); From 4e9eb9583031cddee2913af0dbf6b720051a9fae Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 11 Apr 2021 08:35:45 +1200 Subject: [PATCH 1268/1370] Followup to "no status for serial::write" (#21577) --- Marlin/src/core/serial_hook.h | 8 +++----- Marlin/src/feature/meatpack.h | 2 +- buildroot/tests/mega2560 | 6 +++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index 7bc04a5e88..512ebdec97 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -209,11 +209,9 @@ struct MultiSerial : public SerialBase< MultiSerial> { uint8_t charCount; uint8_t readIndex; - NO_INLINE size_t write(uint8_t c) { return out.write(c); } + NO_INLINE void write(uint8_t c) { out.write(c); } void flush() { out.flush(); } void begin(long br) { out.begin(br); readIndex = 0; } void end() { out.end(); } diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index 3c8f720238..4ed199df2f 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -171,11 +171,11 @@ exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" # Test Laser features with 12864 LCD # restore_configs -opt_set MOTHERBOARD BOARD_RAMPS_14_EFB LCD_LANGUAGE en TEMP_SENSOR_COOLER 1 EXTRUDERS 0 TEMP_SENSOR_1 0 +opt_set MOTHERBOARD BOARD_RAMPS_14_EFB LCD_LANGUAGE en TEMP_SENSOR_COOLER 1 EXTRUDERS 0 TEMP_SENSOR_1 0 SERIAL_PORT_2 2 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ - LASER_FEATURE LASER_COOLANT_FLOW_METER + LASER_FEATURE LASER_COOLANT_FLOW_METER MEATPACK_ON_SERIAL_PORT_1 -exec_test $1 $2 "REPRAP MEGA2560 RAMPS | Laser Feature | Cooler | Flowmeter | 12864 LCD " "$3" +exec_test $1 $2 "REPRAP MEGA2560 RAMPS | Laser Feature | Cooler | Flowmeter | 12864 LCD | meatpack | SERIAL_PORT_2 " "$3" # # Test Laser features with 44780 LCD From d34a143d8277c57d4df1b7a19985e05f23d86b21 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 10 Apr 2021 18:27:15 -0500 Subject: [PATCH 1269/1370] EXP2_01_PIN for BTT BTT002 1.0 --- Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 6029031a63..9fb13c84fe 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -194,6 +194,7 @@ #define EXP1_09_PIN PB1 #define EXP1_10_PIN PE7 +#define EXP2_01_PIN PA3 #define EXP2_03_PIN -1 #define EXP2_04_PIN PC4 #define EXP2_05_PIN PA7 From 42d63258e951a1eb0609637686869d9fc0faf7b7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 8 Apr 2021 15:43:16 -0500 Subject: [PATCH 1270/1370] tick() => isr() to spotlight interrupt-time --- Marlin/src/module/planner.h | 6 ++---- Marlin/src/module/temperature.cpp | 10 +++++----- Marlin/src/module/temperature.h | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 570fcc08af..d4ed00d2fa 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -885,11 +885,9 @@ class Planner { // Wait for moves to finish and disable all steppers static void finish_and_disable(); - // Periodic tick to handle cleaning timeouts + // Periodic handler to manage the cleaning buffer counter // Called from the Temperature ISR at ~1kHz - static void tick() { - if (cleaning_buffer_counter) --cleaning_buffer_counter; - } + static void isr() { if (cleaning_buffer_counter) --cleaning_buffer_counter; } /** * Does the buffer have any blocks queued? diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 992681632d..faa5bb5b10 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2835,12 +2835,12 @@ void Temperature::readings_ready() { * - Step the babysteps value for each axis towards 0 * - For PINS_DEBUGGING, monitor and report endstop pins * - For ENDSTOP_INTERRUPTS_FEATURE check endstops if flagged - * - Call planner.tick to count down its "ignore" time + * - Call planner.isr to count down its "ignore" time */ HAL_TEMP_TIMER_ISR() { HAL_timer_isr_prologue(TEMP_TIMER_NUM); - Temperature::tick(); + Temperature::isr(); HAL_timer_isr_epilogue(TEMP_TIMER_NUM); } @@ -2879,7 +2879,7 @@ public: * - Endstop polling * - Planner clean buffer */ -void Temperature::tick() { +void Temperature::isr() { static int8_t temp_count = -1; static ADCSensorState adc_sensor_state = StartupDelay; @@ -3363,8 +3363,8 @@ void Temperature::tick() { // Poll endstops state, if required endstops.poll(); - // Periodically call the planner timer - planner.tick(); + // Periodically call the planner timer service routine + planner.isr(); } #if HAS_TEMP_SENSOR diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 92e436c73f..13dcca2932 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -600,8 +600,8 @@ class Temperature { /** * Called from the Temperature ISR */ + static void isr(); static void readings_ready(); - static void tick(); /** * Call periodically to manage heaters From 2251038ab857ec2a6dc4f7d4605321ffebfabd5f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 10 Apr 2021 20:09:15 -0500 Subject: [PATCH 1271/1370] Clean up, update some variants --- .../variants/BIGTREE_BTT002/PeripheralPins.c | 52 +- .../variants/BIGTREE_BTT002/hal_conf_extra.h | 72 +-- .../variants/BIGTREE_GTR_V1/PeripheralPins.c | 81 ++-- .../variants/BIGTREE_GTR_V1/hal_conf_extra.h | 2 +- .../BIGTREE_SKR_PRO_1v1/PeripheralPins.c | 2 - .../BIGTREE_SKR_PRO_1v1/hal_conf_extra.h | 2 +- .../variants/BTT_SKR_SE_BX/PeripheralPins.c | 326 ++++++------- .../FYSETC_CHEETAH_V20/PeripheralPins.c | 46 +- .../FYSETC_CHEETAH_V20/hal_conf_custom.h | 29 +- .../variants/LERDGE/PeripheralPins.c | 18 - .../variants/MARLIN_F103Vx/PeripheralPins.c | 168 +++---- .../variants/MARLIN_F103Zx/PeripheralPins.c | 158 +++--- .../variants/MARLIN_F103Zx/hal_conf_custom.h | 71 ++- .../variants/MARLIN_F407VE/hal_conf_custom.h | 74 ++- .../variants/MARLIN_F446VE/PeripheralPins.c | 454 ++++++++---------- .../variants/MARLIN_F4x7Vx/PeripheralPins.c | 270 +++++------ .../variants/MARLIN_F4x7Vx/hal_conf_extra.h | 27 +- .../MARLIN_FYSETC_S6/PeripheralPins.c | 306 ++++++------ .../variants/STEVAL_F401VE/PeripheralPins.c | 222 ++++----- .../variants/STEVAL_F401VE/hal_conf_custom.h | 71 ++- 20 files changed, 1141 insertions(+), 1310 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c index bee09b15b1..933b62ae9b 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c @@ -41,32 +41,32 @@ #ifdef HAL_ADC_MODULE_ENABLED const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 E0_DIR - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 BLTOUCH_2 - {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 BLTOUCH_4 - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 E1_EN - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS - {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED - {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 - {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 EXP_14 - {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 Z_DIR - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 E0_EN - {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 EXP_8 - {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 EXP_7 + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 TEMP_1 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 TEMP_BED + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 TEMP_0 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 EXP2-1 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS SD_SS (CUSTOM_SPI_PINS) + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK SD_SCK + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO SD_MISO + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED SD_MOSI + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 BTN_EN2 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 BTN_ENC + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 --- + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 --- + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 --- + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 TEMP_PROBE + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 SD_DETECT + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 BTN_EN1 - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC - {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 + #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio, 24 ADC + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 - {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 - {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 #endif {NC, NP, 0} }; @@ -95,9 +95,7 @@ const PinMap PinMap_I2C_SDA[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SCL[] = { {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -114,8 +112,8 @@ const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED const PinMap PinMap_PWM[] = { - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 BED - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 HEATER0 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 BED + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 HEATER0 {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 FAN0 {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 FAN1 diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h index e0e8239aac..40b340c205 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h @@ -8,45 +8,45 @@ #define HAL_I2C_MODULE_ENABLED #define HAL_PWR_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED -//#define HAL_RTC_MODULE_ENABLED Real Time Clock...do we use it? +//#define HAL_RTC_MODULE_ENABLED // Real Time Clock...do we use it? #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED #define HAL_USART_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED //#define HAL_UART_MODULE_ENABLED // by default -//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +//#define HAL_PCD_MODULE_ENABLED // Automatically added if any type of USB is enabled, as in Arduino IDE. (STM32 v3.10700.191028) -#undef HAL_SD_MODULE_ENABLED -#undef HAL_DAC_MODULE_ENABLED -#undef HAL_FLASH_MODULE_ENABLED -#undef HAL_CAN_MODULE_ENABLED -#undef HAL_CAN_LEGACY_MODULE_ENABLED -#undef HAL_CEC_MODULE_ENABLED -#undef HAL_CRYP_MODULE_ENABLED -#undef HAL_DCMI_MODULE_ENABLED -#undef HAL_DMA2D_MODULE_ENABLED -#undef HAL_ETH_MODULE_ENABLED -#undef HAL_NAND_MODULE_ENABLED -#undef HAL_NOR_MODULE_ENABLED -#undef HAL_PCCARD_MODULE_ENABLED -#undef HAL_SRAM_MODULE_ENABLED -#undef HAL_SDRAM_MODULE_ENABLED -#undef HAL_HASH_MODULE_ENABLED -#undef HAL_EXTI_MODULE_ENABLED -#undef HAL_SMBUS_MODULE_ENABLED -#undef HAL_I2S_MODULE_ENABLED -#undef HAL_IWDG_MODULE_ENABLED -#undef HAL_LTDC_MODULE_ENABLED -#undef HAL_DSI_MODULE_ENABLED -#undef HAL_QSPI_MODULE_ENABLED -#undef HAL_RNG_MODULE_ENABLED -#undef HAL_SAI_MODULE_ENABLED -#undef HAL_IRDA_MODULE_ENABLED -#undef HAL_SMARTCARD_MODULE_ENABLED -#undef HAL_WWDG_MODULE_ENABLED -#undef HAL_HCD_MODULE_ENABLED -#undef HAL_FMPI2C_MODULE_ENABLED -#undef HAL_SPDIFRX_MODULE_ENABLED -#undef HAL_DFSDM_MODULE_ENABLED -#undef HAL_LPTIM_MODULE_ENABLED -#undef HAL_MMC_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED +//#define HAL_DAC_MODULE_ENABLED +//#define HAL_FLASH_MODULE_ENABLED +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c index db0a439562..48e05e45ad 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c @@ -48,7 +48,7 @@ const PinMap PinMap_ADC[] = { {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED (MOSI) {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN @@ -100,9 +100,7 @@ const PinMap PinMap_I2C_SDA[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SCL[] = { {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -154,7 +152,6 @@ const PinMap PinMap_PWM[] = { {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 FAN6 {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 FAN7 - // Alternate timer assignments for pins commonly using PWM //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N HEATER0 //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N HEATER0 @@ -179,55 +176,55 @@ const PinMap PinMap_PWM[] = { * WARNING: check timers' usage first to avoid conflicts. * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) */ - //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - //{PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + //{PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 //{PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h index cbce513d1b..e6d558b3e1 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h @@ -14,7 +14,7 @@ #define HAL_USART_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED //#define HAL_UART_MODULE_ENABLED // by default -//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +//#define HAL_PCD_MODULE_ENABLED // Automatically added if any type of USB is enabled, as in Arduino IDE. (STM32 v3.10700.191028) //#define HAL_SD_MODULE_ENABLED //#define HAL_DAC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c index 6dc8b05158..4ea275d4cf 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c @@ -100,9 +100,7 @@ const PinMap PinMap_I2C_SDA[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SCL[] = { {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h index cbce513d1b..e6d558b3e1 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h @@ -14,7 +14,7 @@ #define HAL_USART_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED //#define HAL_UART_MODULE_ENABLED // by default -//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +//#define HAL_PCD_MODULE_ENABLED // Automatically added if any type of USB is enabled, as in Arduino IDE. (STM32 v3.10700.191028) //#define HAL_SD_MODULE_ENABLED //#define HAL_DAC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c index 3defef5fbf..c9194cc293 100644 --- a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c @@ -89,26 +89,24 @@ WEAK const PinMap PinMap_DAC[] = { #ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SDA[] = { - // {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // LD2 LED_BLUE (ZI) + //{PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // LD2 LED_BLUE (ZI) {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_7, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, // LD2 LED_BLUE (ZI) - // {PB_9, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, + //{PB_9, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PD_13, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)}, {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {PF_15, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { - // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // USB SOF - // {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // QSPI_CS + //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // USB SOF + //{PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // QSPI_CS {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_6, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, // QSPI_CS - // {PB_8, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, + //{PB_8, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)}, {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {PD_12, I2C4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)}, {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, @@ -121,64 +119,64 @@ WEAK const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED WEAK const PinMap PinMap_PWM[] = { - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - ETH RMII Ref Clk - // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - ETH RMII Ref Clk - // {PA_1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 1, 1)}, // TIM15_CH1N - ETH RMII Ref Clk - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - ETH RMII MDIO + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - ETH RMII Ref Clk + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - ETH RMII Ref Clk + //{PA_1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 1, 1)}, // TIM15_CH1N - ETH RMII Ref Clk + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - ETH RMII MDIO {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - ETH RMII MDIO - // {PA_2, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 1, 0)}, // TIM15_CH1 - ETH RMII MDIO - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_2, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 1, 0)}, // TIM15_CH1 - ETH RMII MDIO + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 {PA_3, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM15, 2, 0)}, // TIM15_CH2 - // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Used by ETH when JP6(ZI)/SB31(ZI2) ON - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - Used by ETH when JP6(ZI)/SB31(ZI2) ON - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - Used by ETH when JP6(ZI)/SB31(ZI2) ON + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Used by ETH when JP6(ZI)/SB31(ZI2) ON + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - Used by ETH when JP6(ZI)/SB31(ZI2) ON + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - Used by ETH when JP6(ZI)/SB31(ZI2) ON {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - Used by ETH when JP6(ZI)/SB31(ZI2) ON - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - USB SOF - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - USB VBUS - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - USB ID - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - USB DM - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - USB SOF + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - USB VBUS + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - USB ID + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - USB DM + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - LD1 LED_GREEN - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - LD1 LED_GREEN - // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - LD1 LED_GREEN - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - LD1 LED_GREEN + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - LD1 LED_GREEN + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - SWO + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - SWO {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 {PB_6, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 1)}, // TIM16_CH1N - // {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - LD2 LED_BLUE (ZI) + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - LD2 LED_BLUE (ZI) {PB_7, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 1)}, // TIM17_CH1N - LD2 LED_BLUE (ZI) {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - // {PB_8, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 0)}, // TIM16_CH1 - // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_8, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 0)}, // TIM16_CH1 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 {PB_9, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 0)}, // TIM17_CH1 - // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Used by ETH when JP7(ZI)/JP6(ZI2) ON + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Used by ETH when JP7(ZI)/JP6(ZI2) ON {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - LD3 LED_RED - // {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - LD3 LED_RED - // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM12, 1, 0)}, // TIM12_CH1 - LD3 LED_RED - // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - LD3 LED_RED + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM12, 1, 0)}, // TIM12_CH1 - LD3 LED_RED + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM12, 2, 0)}, // TIM12_CH2 - // {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM12, 2, 0)}, // TIM12_CH2 + //{PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - // {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 @@ -196,9 +194,9 @@ WEAK const PinMap PinMap_PWM[] = { {PF_6, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 0)}, // TIM16_CH1 {PF_7, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 0)}, // TIM17_CH1 {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - // {PF_8, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 1)}, // TIM16_CH1N + //{PF_8, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16, 1, 1)}, // TIM16_CH1N {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - // {PF_9, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 1)}, // TIM17_CH1N + //{PF_9, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17, 1, 1)}, // TIM17_CH1N {NC, NP, 0} }; #endif @@ -208,22 +206,22 @@ WEAK const PinMap PinMap_PWM[] = { #ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_TX[] = { {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ETH RMII MDIO - // {PA_9, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB VBUS + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ETH RMII MDIO + //{PA_9, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB VBUS {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB VBUS - // {PA_12, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // USB DP + //{PA_12, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // USB DP //{PA_15, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, //{PB_4, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, - // {PB_6, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART)}, - // {PB_6, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, + //{PB_6, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART)}, + //{PB_6, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, //{PB_9, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PB_13, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON - // {PB_14, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)}, // LD3 LED_RED + //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_13, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON + //{PB_14, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)}, // LD3 LED_RED //{PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, //{PD_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, @@ -234,27 +232,25 @@ WEAK const PinMap PinMap_UART_TX[] = { //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // ETH RMII Ref Clk - // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_8, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, // USB SOF - // {PA_10, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB ID + //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_8, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, // USB SOF + //{PA_10, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB ID {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB ID - // {PA_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // USB DM + //{PA_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // USB DM //{PB_3, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, // SWO //{PB_5, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, - // {PB_7, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART)}, // LD2 LED_BLUE (ZI) - // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // LD2 LED_BLUE (ZI) + //{PB_7, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART)}, // LD2 LED_BLUE (ZI) + //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // LD2 LED_BLUE (ZI) //{PB_8, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, //{PB_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, //{PB_15, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)}, //{PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, //{PD_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, @@ -265,16 +261,14 @@ WEAK const PinMap PinMap_UART_RX[] = { //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { - // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ETH RMII Ref Clk - // {PA_12, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB DP - // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB DP + //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ETH RMII Ref Clk + //{PA_12, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB DP + //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB DP {PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_14, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // LD3 LED_RED - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // LD3 LED_RED + //{PB_14, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // LD3 LED_RED + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // LD3 LED_RED {PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, @@ -285,15 +279,13 @@ WEAK const PinMap PinMap_UART_RTS[] = { {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_11, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB DM - // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB DM - // {PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // LD1 LED_GREEN - // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON + //{PA_11, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // USB DM + //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB DM + //{PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // LD1 LED_GREEN + //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON {PB_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, {PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, @@ -301,7 +293,7 @@ WEAK const PinMap PinMap_UART_CTS[] = { {PD_14, UART8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, {PE_10, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, {PF_9, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)}, - // {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, + //{PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, {NC, NP, 0} }; @@ -313,83 +305,77 @@ WEAK const PinMap PinMap_UART_CTS[] = { WEAK const PinMap PinMap_SPI_MOSI[] = { {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, //{PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // Used by ETH when JP6(ZI)/SB31(ZI2) ON - // {PA_7, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, // Used by ETH when JP6(ZI)/SB31(ZI2) ON - // {PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, - // // {PB_5, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, - // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // // {PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // ETH RMII MDC - // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, - // {PD_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PF_9, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, - // {PF_11, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, - // {PG_14, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, + //{PA_7, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, // Used by ETH when JP6(ZI)/SB31(ZI2) ON + //{PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + //{PB_5, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + //{PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // ETH RMII MDC + //{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, + //{PD_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PF_9, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + //{PF_11, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + //{PG_14, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // // {PA_6, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // // {PB_4, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, - // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // LD3 LED_RED - // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PF_8, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, - // {PG_9, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PG_12, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, + //{PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_6, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_4, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + //{PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // LD3 LED_RED + //{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PF_8, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + //{PG_9, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PG_12, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // // {PA_5, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, - // // {PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB VBUS - // // {PA_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB DP - // // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // SWO - // // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // SWO - // {PB_3, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, // SWO - // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // // {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON - // {PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PF_7, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, - // {PG_11, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ETH RMII TX Enable - // {PG_13, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // ETH RXII TXD0 + //{PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_5, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + //{PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB VBUS + //{PA_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB DP + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // SWO + //{PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // SWO + //{PB_3, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, // SWO + //{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON + //{PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PF_7, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + //{PG_11, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ETH RMII TX Enable + //{PG_13, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // ETH RXII TXD0 {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // // {PA_4, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, - // // {PA_11, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB DM - // // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // // {PA_15, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI6)}, - // {PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, - // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PF_6, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, - // {PG_8, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, - // {PG_10, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_4, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_SPI6)}, + //{PA_11, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // USB DM + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_15, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI6)}, + //{PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + //{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PF_6, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, + //{PG_8, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, + //{PG_10, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {NC, NP, 0} }; #endif @@ -398,22 +384,20 @@ WEAK const PinMap PinMap_SPI_SSEL[] = { #ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_RD[] = { - // {PA_11, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, // USB DM + //{PA_11, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, // USB DM {PB_5, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, {PB_8, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, {PB_12, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, {PD_0, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_TD[] = { - // {PA_12, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, // USB DP + //{PA_12, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, // USB DP {PB_6, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, // QSPI_CS {PB_7, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, // LD2 LED_BLUE (ZI) {PB_9, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, - // {PB_13, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON + //{PB_13, CANFD2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, // Used by ETH when JP7(ZI)/JP6(ZI2) ON {PD_1, CANFD1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, {NC, NP, 0} }; @@ -423,30 +407,30 @@ WEAK const PinMap PinMap_CAN_TD[] = { #ifdef HAL_ETH_MODULE_ENABLED WEAK const PinMap PinMap_Ethernet[] = { - // {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS + //{PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO - // {PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL + //{PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL {PA_7, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS_DV|ETH_RX_DV - // {PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 - // {PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 - // {PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - // {PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 - // {PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER - // {PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - // {PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + //{PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 + //{PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 + //{PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + //{PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + //{PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER + //{PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + //{PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 {PB_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 {PC_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDC - // {PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 - // {PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK + //{PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 + //{PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 - // {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 - // {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + //{PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + //{PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - // {PG_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + //{PG_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - // {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + //{PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 {NC, NP, 0} }; #endif @@ -455,21 +439,19 @@ WEAK const PinMap PinMap_Ethernet[] = { #ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_ID + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_ID {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_DM {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_HS[] = { #ifdef USE_USB_HS_IN_FS - // {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_SOF - // {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_ID - // {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - Used by ETH when JP7(ZI)/JP6(ZI2) ON + //{PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_SOF + //{PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_ID + //{PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - Used by ETH when JP7(ZI)/JP6(ZI2) ON {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_DM {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_DP #else diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c index 3957069f28..418ef5aa7a 100644 --- a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c @@ -74,9 +74,7 @@ WEAK const PinMap PinMap_I2C_SDA[] = { {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -90,28 +88,28 @@ WEAK const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED WEAK const PinMap PinMap_PWM[] = { - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 @@ -119,9 +117,9 @@ WEAK const PinMap PinMap_PWM[] = { {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N @@ -145,9 +143,7 @@ WEAK const PinMap PinMap_UART_TX[] = { {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -156,17 +152,13 @@ WEAK const PinMap PinMap_UART_RX[] = { {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -179,44 +171,38 @@ WEAK const PinMap PinMap_UART_CTS[] = { #ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h index 6c56b97a74..395bfcd4b7 100644 --- a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h @@ -33,49 +33,48 @@ extern "C" { */ #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_IWDG_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_PCD_MODULE_ENABLED // Automatically added if any type of USB is enabled, as in Arduino IDE. (STM32 v3.10700.191028) + //#define HAL_CAN_MODULE_ENABLED //#define HAL_CAN_LEGACY_MODULE_ENABLED -#define HAL_CRC_MODULE_ENABLED //#define HAL_CEC_MODULE_ENABLED //#define HAL_CRYP_MODULE_ENABLED //#define HAL_DAC_MODULE_ENABLED //#define HAL_DCMI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED //#define HAL_DMA2D_MODULE_ENABLED //#define HAL_ETH_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED //#define HAL_NAND_MODULE_ENABLED //#define HAL_NOR_MODULE_ENABLED //#define HAL_PCCARD_MODULE_ENABLED //#define HAL_SRAM_MODULE_ENABLED //#define HAL_SDRAM_MODULE_ENABLED //#define HAL_HASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED //#define HAL_EXTI_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED //#define HAL_SMBUS_MODULE_ENABLED //#define HAL_I2S_MODULE_ENABLED -#define HAL_IWDG_MODULE_ENABLED //#define HAL_LTDC_MODULE_ENABLED //#define HAL_DSI_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED //#define HAL_QSPI_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED //#define HAL_RNG_MODULE_ENABLED -#define HAL_RTC_MODULE_ENABLED //#define HAL_SAI_MODULE_ENABLED //#define HAL_SD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED //#define HAL_UART_MODULE_ENABLED //#define HAL_USART_MODULE_ENABLED //#define HAL_IRDA_MODULE_ENABLED //#define HAL_SMARTCARD_MODULE_ENABLED //#define HAL_WWDG_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -#ifndef HAL_PCD_MODULE_ENABLED - #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#endif //#define HAL_HCD_MODULE_ENABLED //#define HAL_FMPI2C_MODULE_ENABLED //#define HAL_SPDIFRX_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c index 8cb0776ffa..044f555a41 100644 --- a/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c @@ -114,9 +114,7 @@ const PinMap PinMap_I2C_SDA[] = { {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SCL[] = { {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -225,9 +223,7 @@ const PinMap PinMap_UART_TX[] = { {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_RX[] = { {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, @@ -243,9 +239,7 @@ const PinMap PinMap_UART_RX[] = { {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_RTS[] = { {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -256,9 +250,7 @@ const PinMap PinMap_UART_RTS[] = { {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_CTS[] = { {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -283,9 +275,7 @@ const PinMap PinMap_SPI_MOSI[] = { {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, @@ -295,9 +285,7 @@ const PinMap PinMap_SPI_MISO[] = { {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, @@ -307,9 +295,7 @@ const PinMap PinMap_SPI_SCLK[] = { {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, @@ -332,9 +318,7 @@ const PinMap PinMap_CAN_RD[] = { {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED const PinMap PinMap_CAN_TD[] = { {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, @@ -389,9 +373,7 @@ const PinMap PinMap_USB_OTG_FS[] = { {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED const PinMap PinMap_USB_OTG_HS[] = { #ifdef USE_USB_HS_IN_FS {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c index c9d2bb88b8..339a55916c 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c @@ -25,61 +25,61 @@ #ifdef HAL_ADC_MODULE_ENABLED WEAK const PinMap PinMap_ADC[] = { {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 #endif {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 #endif {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 #endif {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 #endif {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + //{PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 #endif {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 #endif {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 #endif {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 #endif {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {NC, NP, 0} }; #endif @@ -105,9 +105,7 @@ WEAK const PinMap PinMap_I2C_SDA[] = { {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, @@ -121,105 +119,105 @@ WEAK const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED WEAK const PinMap PinMap_PWM[] = { {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 #endif {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 #endif {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM2_CH3 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 #endif #ifdef STM32F103xG - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 #endif - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM5_CH4 #else {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 #endif #if defined(STM32F103xG) - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 #endif {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM3_CH1 #if defined(STM32F103xG) - // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 #endif {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N #if defined(STM32F103xG) - // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 #endif {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM1_CH1 - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM1_CH2 - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM1_CH3 - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM1_CH4 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 1, 0)}, // TIM2_CH1 - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM3_CH3 - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N #endif {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N #endif {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 2, 0)}, // TIM2_CH2 - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 1, 0)}, // TIM3_CH1 {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 2, 0)}, // TIM3_CH2 {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM4_CH1 {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM4_CH2 {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM4_CH3 #if defined(STM32F103xG) - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 #endif {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM4_CH4 #if defined(STM32F103xG) - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 #endif {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 - // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 - // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 + //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM1_CH1N {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM1_CH2N #if defined(STM32F103xG) - // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 #endif {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM1_CH3N #if defined(STM32F103xG) - // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 #endif {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 #endif {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 #endif {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 4, 0)}, // TIM3_CH4 #if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 #endif {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 1, 0)}, // TIM4_CH1 {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 2, 0)}, // TIM4_CH2 @@ -248,29 +246,27 @@ WEAK const PinMap PinMap_UART_TX[] = { {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART1_ENABLE)}, {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#else - {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, -#endif -#if defined(STM32F103xE) || defined(STM32F103xG) - {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#endif + #if defined(STM32F103xE) || defined(STM32F103xG) + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + #else + {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + #endif + #if defined(STM32F103xE) || defined(STM32F103xG) + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + #endif {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { {PA_3, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, {PB_7, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART1_ENABLE)}, {PB_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, #if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + //{PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, {PC_11, UART4, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, #else {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, @@ -282,26 +278,22 @@ WEAK const PinMap PinMap_UART_RX[] = { {PD_9, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_ENABLE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, {NC, NP, 0} @@ -314,7 +306,7 @@ WEAK const PinMap PinMap_UART_CTS[] = { WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, #if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, #else {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, @@ -322,13 +314,11 @@ WEAK const PinMap PinMap_SPI_MOSI[] = { {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, #if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, #else {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, @@ -336,13 +326,11 @@ WEAK const PinMap PinMap_SPI_MISO[] = { {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, #if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, #else {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, @@ -350,13 +338,11 @@ WEAK const PinMap PinMap_SPI_SCLK[] = { {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, #if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, #else {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, @@ -375,9 +361,7 @@ WEAK const PinMap PinMap_CAN_RD[] = { {PD_0, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_TD[] = { {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_2)}, diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c index 5736e5206e..0d7365c9c5 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c @@ -25,45 +25,45 @@ #ifdef HAL_ADC_MODULE_ENABLED WEAK const PinMap PinMap_ADC[] = { {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + //{PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - // {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + //{PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + //{PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + //{PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - // {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + //{PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + //{PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 @@ -92,9 +92,7 @@ WEAK const PinMap PinMap_I2C_SDA[] = { {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, @@ -108,86 +106,86 @@ WEAK const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED WEAK const PinMap PinMap_PWM[] = { {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM2_CH3 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 #ifdef STM32F103xG - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 #endif - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM5_CH4 #ifdef STM32F103xG - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 #endif {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM3_CH1 #ifdef STM32F103xG - // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 #endif - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N #ifdef STM32F103xG - // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 #endif {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM1_CH1 - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM1_CH2 - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM1_CH3 - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM1_CH4 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 1, 0)}, // TIM2_CH1 - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM3_CH3 - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 2, 0)}, // TIM2_CH2 - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 1, 0)}, // TIM3_CH1 {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 2, 0)}, // TIM3_CH2 {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM4_CH1 {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM4_CH2 {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM4_CH3 #ifdef STM32F103xG - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 #endif {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM4_CH4 #ifdef STM32F103xG - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 #endif - // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 - // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 + //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM1_CH1N {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM1_CH2N #ifdef STM32F103xG - // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 #endif {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM1_CH3N #ifdef STM32F103xG - // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 #endif - // {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 + //{PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 - // {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 + //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 4, 0)}, // TIM3_CH4 - // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 1, 0)}, // TIM4_CH1 {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 2, 0)}, // TIM4_CH2 {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 3, 0)}, // TIM4_CH3 @@ -222,47 +220,41 @@ WEAK const PinMap PinMap_UART_TX[] = { {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART1_ENABLE)}, {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { {PA_3, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, {PB_7, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART1_ENABLE)}, {PB_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, {PC_11, UART4, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, - // {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + //{PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, {PD_2, UART5, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, {PD_6, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART2_ENABLE)}, {PD_9, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_ENABLE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, {NC, NP, 0} @@ -274,37 +266,31 @@ WEAK const PinMap PinMap_UART_CTS[] = { #ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, {NC, NP, 0} @@ -320,9 +306,7 @@ WEAK const PinMap PinMap_CAN_RD[] = { {PD_0, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_TD[] = { {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_2)}, @@ -353,10 +337,10 @@ WEAK const PinMap PinMap_USB[] = { #ifdef HAL_SD_MODULE_ENABLED WEAK const PinMap PinMap_SD[] = { - // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D4 - // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D5 - // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D6 - // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D7 + //{PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D4 + //{PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D5 + //{PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D6 + //{PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D7 {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D0 {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D1 {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D2 diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h index 014943f311..4e55fe1240 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h @@ -33,45 +33,44 @@ extern "C" { * and manage module deactivation */ #include "stm32yyxx_hal_conf.h" -#if 0 + /** * @brief This is the list of modules to be used in the HAL driver */ -#define HAL_MODULE_ENABLED -#define HAL_ADC_MODULE_ENABLED -#define HAL_CAN_MODULE_ENABLED -/*#define HAL_CAN_LEGACY_MODULE_ENABLED*/ -#define HAL_CEC_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -#define HAL_CRC_MODULE_ENABLED -#define HAL_DAC_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_ETH_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_HCD_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED -#define HAL_I2S_MODULE_ENABLED -#define HAL_IRDA_MODULE_ENABLED -#define HAL_IWDG_MODULE_ENABLED -#define HAL_NAND_MODULE_ENABLED -#define HAL_NOR_MODULE_ENABLED -#define HAL_PCCARD_MODULE_ENABLED -#define HAL_PCD_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_RTC_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED -#define HAL_SMARTCARD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -#define HAL_SRAM_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -#define HAL_UART_MODULE_ENABLED -#define HAL_USART_MODULE_ENABLED -#define HAL_WWDG_MODULE_ENABLED -#define HAL_MMC_MODULE_ENABLED -#endif +//#define HAL_MODULE_ENABLED +//#define HAL_ADC_MODULE_ENABLED +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_CRC_MODULE_ENABLED +//#define HAL_DAC_MODULE_ENABLED +//#define HAL_DMA_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED +//#define HAL_FLASH_MODULE_ENABLED +//#define HAL_GPIO_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_I2C_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_PCD_MODULE_ENABLED +//#define HAL_PWR_MODULE_ENABLED +//#define HAL_RCC_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_SPI_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_TIM_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED +//#define HAL_USART_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED /* ########################## Oscillator Values adaptation ####################*/ /** diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h index 92e9fecb4d..1252bc7059 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h @@ -33,55 +33,54 @@ extern "C" { */ #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ #define HAL_CRC_MODULE_ENABLED -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ #define HAL_DAC_MODULE_ENABLED -/* #define HAL_DCMI_MODULE_ENABLED */ #define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ #define HAL_FLASH_MODULE_ENABLED -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ #define HAL_GPIO_MODULE_ENABLED -/* #define HAL_EXTI_MODULE_ENABLED */ #define HAL_I2C_MODULE_ENABLED -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ #define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ #define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ #define HAL_RTC_MODULE_ENABLED -/* #define HAL_SAI_MODULE_ENABLED */ #define HAL_SD_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ #define HAL_CORTEX_MODULE_ENABLED -#ifndef HAL_PCD_MODULE_ENABLED - #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#endif -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ +//#define HAL_PCD_MODULE_ENABLED // Automatically added if any type of USB is enabled, as in Arduino IDE. (STM32 v3.10700.191028) + +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED +//#define HAL_USART_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** @@ -204,7 +203,7 @@ in voltage and temperature. */ * @brief Uncomment the line below to expanse the "assert_param" macro in the * HAL drivers code */ -/* #define USE_FULL_ASSERT 1U */ +//#define USE_FULL_ASSERT 1U /* ################## Ethernet peripheral configuration ##################### */ @@ -492,5 +491,4 @@ void assert_failed(uint8_t *file, uint32_t line); #endif /* __STM32F4xx_HAL_CONF_CUSTOM_H */ - /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PeripheralPins.c index d4746a39e3..54439083d4 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_F446VE/PeripheralPins.c @@ -25,45 +25,45 @@ #ifdef HAL_ADC_MODULE_ENABLED WEAK const PinMap PinMap_ADC[] = { {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + //{PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {NC, NP, 0} }; #endif @@ -72,8 +72,8 @@ WEAK const PinMap PinMap_ADC[] = { #ifdef HAL_DAC_MODULE_ENABLED WEAK const PinMap PinMap_DAC[] = { - // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - LD2 + //{PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + //{PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - LD2 {NC, NP, 0} }; #endif @@ -82,22 +82,20 @@ WEAK const PinMap PinMap_DAC[] = { #ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SDA[] = { - // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PC_12, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PC_12, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { - // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; #endif @@ -106,75 +104,75 @@ WEAK const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED WEAK const PinMap PinMap_PWM[] = { - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N {PB_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - // {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - // {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - // {PB_8, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - // {PB_9, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + //{PB_8, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_9, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - // {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - // {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - // {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - // {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - // {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 {NC, NP, 0} }; @@ -184,62 +182,56 @@ WEAK const PinMap PinMap_PWM[] = { #ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_TX[] = { - // {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - // {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PE_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { - // {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PC_5, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - // {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PC_5, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PE_7, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { - // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, - // {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + //{PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { - // {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, - // {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + //{PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {NC, NP, 0} }; #endif @@ -249,67 +241,61 @@ WEAK const PinMap PinMap_UART_CTS[] = { #ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, - // {PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, - // {PC_1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, - // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PD_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, - // {PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PB_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + //{PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + //{PC_1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, + //{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PD_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, + //{PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PD_0, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PD_0, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_7, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_7, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, - // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PD_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, - // {PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + //{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PD_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + //{PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, {NC, NP, 0} }; #endif @@ -318,22 +304,20 @@ WEAK const PinMap PinMap_SPI_SSEL[] = { #ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_RD[] = { - // {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - // {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - // {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_TD[] = { - // {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - // {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - // {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; #endif @@ -344,51 +328,41 @@ WEAK const PinMap PinMap_CAN_TD[] = { #ifdef HAL_QSPI_MODULE_ENABLED WEAK const PinMap PinMap_QUADSPI_DATA0[] = { - // {PC_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 - // {PD_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 - // {PE_7, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO0 + //{PC_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 + //{PD_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 + //{PE_7, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO0 {NC, NP, 0} }; -#endif -#ifdef HAL_QSPI_MODULE_ENABLED WEAK const PinMap PinMap_QUADSPI_DATA1[] = { - // {PC_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 - // {PD_12, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 - // {PE_8, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO1 + //{PC_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 + //{PD_12, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 + //{PE_8, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO1 {NC, NP, 0} }; -#endif -#ifdef HAL_QSPI_MODULE_ENABLED WEAK const PinMap PinMap_QUADSPI_DATA2[] = { - // {PE_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO2 - // {PE_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO2 + //{PE_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO2 + //{PE_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO2 {NC, NP, 0} }; -#endif -#ifdef HAL_QSPI_MODULE_ENABLED WEAK const PinMap PinMap_QUADSPI_DATA3[] = { {PA_1, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 - // {PD_13, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 - // {PE_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO3 + //{PD_13, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 + //{PE_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK2_IO3 {NC, NP, 0} }; -#endif -#ifdef HAL_QSPI_MODULE_ENABLED WEAK const PinMap PinMap_QUADSPI_SCLK[] = { - // {PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK - // {PD_3, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK + //{PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK + //{PD_3, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK {NC, NP, 0} }; -#endif -#ifdef HAL_QSPI_MODULE_ENABLED WEAK const PinMap PinMap_QUADSPI_SSEL[] = { - // {PB_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK1_NCS - // {PC_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK2_NCS + //{PB_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK1_NCS + //{PC_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK2_NCS {NC, NP, 0} }; #endif @@ -397,36 +371,34 @@ WEAK const PinMap PinMap_QUADSPI_SSEL[] = { #ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_HS[] = { #ifdef USE_USB_HS_IN_FS - // {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF - // {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - // {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - // {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - // {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP + //{PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF + //{PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + //{PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + //{PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + //{PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP #else - // {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - // {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK - // {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - // {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - // {PB_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 - // {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - // {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - // {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - // {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - // {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - // {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - // {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT + //{PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + //{PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK + //{PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + //{PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + //{PB_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 + //{PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + //{PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + //{PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + //{PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + //{PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + //{PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + //{PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT #endif /* USE_USB_HS_IN_FS */ {NC, NP, 0} }; @@ -436,19 +408,19 @@ WEAK const PinMap PinMap_USB_OTG_HS[] = { #ifdef HAL_SD_MODULE_ENABLED WEAK const PinMap PinMap_SD[] = { - // {PB_0, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 - // {PB_1, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 - // {PB_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK - // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 - // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 - // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 - // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 - // {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 - // {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 - // {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 - // {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 - // {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK - // {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + //{PB_0, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + //{PB_1, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + //{PB_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + //{PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + //{PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + //{PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + //{PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + //{PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + //{PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + //{PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + //{PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + //{PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + //{PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c index 51ebf60581..83e71035fa 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/PeripheralPins.c @@ -14,6 +14,10 @@ #include "Arduino.h" #include "PeripheralPins.h" +/** + * Variant for: mks_robin_pro2, mks_robin_nano_v3, Anet_ET4_OpenBLT + */ + /* ===== * Note: Commented lines are alternative possibilities which are not used per default. * If you change them, you will have to know what you do @@ -24,46 +28,46 @@ #ifdef HAL_ADC_MODULE_ENABLED WEAK const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + //{PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {NC, NP, 0} }; #endif @@ -88,9 +92,7 @@ WEAK const PinMap PinMap_I2C_SDA[] = { {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -116,75 +118,75 @@ WEAK const PinMap PinMap_I2C_SCL[] = { // No timer = [FAN1 ] WEAK const PinMap PinMap_PWM[] = { - {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - {PB_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - // {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + {PB_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 {NC, NP, 0} }; #endif @@ -206,9 +208,7 @@ WEAK const PinMap PinMap_UART_TX[] = { {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, @@ -216,30 +216,26 @@ WEAK const PinMap PinMap_UART_RX[] = { {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, @@ -252,44 +248,38 @@ WEAK const PinMap PinMap_UART_CTS[] = { #ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, @@ -308,9 +298,7 @@ WEAK const PinMap PinMap_CAN_RD[] = { {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_TD[] = { {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, @@ -354,21 +342,19 @@ WEAK const PinMap PinMap_Ethernet[] = { #ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_HS[] = { #ifdef USE_USB_HS_IN_FS - // {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF - // {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - // {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + //{PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF + //{PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + //{PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP #else diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h index a8500c595f..0c44f08742 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h @@ -36,14 +36,25 @@ */ #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED -//#define HAL_CAN_MODULE_ENABLED #define HAL_CAN_LEGACY_MODULE_ENABLED #define HAL_CRC_MODULE_ENABLED +#define HAL_DAC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED +//#define HAL_PCD_MODULE_ENABLED + +//#define HAL_CAN_MODULE_ENABLED //#define HAL_CEC_MODULE_ENABLED //#define HAL_CRYP_MODULE_ENABLED -#define HAL_DAC_MODULE_ENABLED //#define HAL_DCMI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED //#define HAL_DMA2D_MODULE_ENABLED //#define HAL_ETH_MODULE_ENABLED //#define HAL_FLASH_MODULE_ENABLED @@ -53,30 +64,20 @@ //#define HAL_SRAM_MODULE_ENABLED //#define HAL_SDRAM_MODULE_ENABLED //#define HAL_HASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED //#define HAL_EXTI_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED //#define HAL_SMBUS_MODULE_ENABLED //#define HAL_I2S_MODULE_ENABLED //#define HAL_IWDG_MODULE_ENABLED //#define HAL_LTDC_MODULE_ENABLED //#define HAL_DSI_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED //#define HAL_QSPI_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED //#define HAL_RNG_MODULE_ENABLED //#define HAL_RTC_MODULE_ENABLED //#define HAL_SAI_MODULE_ENABLED //#define HAL_SD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -//#define HAL_UART_MODULE_ENABLED -#define HAL_USART_MODULE_ENABLED //#define HAL_IRDA_MODULE_ENABLED //#define HAL_SMARTCARD_MODULE_ENABLED //#define HAL_WWDG_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -//#define HAL_PCD_MODULE_ENABLED //#define HAL_HCD_MODULE_ENABLED //#define HAL_FMPI2C_MODULE_ENABLED //#define HAL_SPDIFRX_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c index cc700201aa..ec28776ebe 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c @@ -40,46 +40,46 @@ #ifdef HAL_ADC_MODULE_ENABLED const PinMap PinMap_ADC[] = { - // {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - // {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + //{PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + //{PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + //{PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - // {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - // {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + //{PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + //{PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + //{PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + //{PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + //{PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {NC, NP, 0} }; #endif @@ -88,8 +88,8 @@ const PinMap PinMap_ADC[] = { #ifdef HAL_DAC_MODULE_ENABLED const PinMap PinMap_DAC[] = { - // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - LD2 + //{PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + //{PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - LD2 {NC, NP, 0} }; #endif @@ -98,24 +98,22 @@ const PinMap PinMap_DAC[] = { #ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SDA[] = { - // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PC_7, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, - // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PC_12, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PC_7, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, + //{PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PC_12, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SCL[] = { - // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - // {PC_6, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, + //{PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PC_6, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, {NC, NP, 0} }; #endif @@ -125,33 +123,33 @@ const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED const PinMap PinMap_PWM[] = { {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - STLink Tx - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - STLink Tx - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - STLink Tx - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - STLink Rx - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - STLink Rx - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - STLink Rx + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - STLink Tx + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - STLink Tx + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - STLink Tx + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - STLink Rx + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - STLink Rx + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - STLink Rx {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // Fan0, TIM8_CH2N - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // Fan1, TIM8_CH3N {PB_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // Fan2, TIM2_CH4 {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // E0 Heater, TIM2_CH2 @@ -159,27 +157,27 @@ const PinMap PinMap_PWM[] = { {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // LED G, TIM3_CH2 {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // LED R, TIM4_CH1 {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // LED B, TIM4_CH2 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - // {PB_8, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_8, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - // {PB_9, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_9, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - // {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 @@ -192,52 +190,46 @@ const PinMap PinMap_PWM[] = { #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_TX[] = { - // {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_RX[] = { - // {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PC_5, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PC_5, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_RTS[] = { - // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_CTS[] = { - // {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, {NC, NP, 0} }; #endif @@ -247,54 +239,48 @@ const PinMap PinMap_UART_CTS[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, - // {PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, - // {PC_1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, - // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + //{PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + //{PC_1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, + //{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_7, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_7, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, - // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + //{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {NC, NP, 0} }; #endif @@ -303,20 +289,18 @@ const PinMap PinMap_SPI_SSEL[] = { #ifdef HAL_CAN_MODULE_ENABLED const PinMap PinMap_CAN_RD[] = { - // {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - // {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED const PinMap PinMap_CAN_TD[] = { - // {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - // {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, {NC, NP, 0} }; #endif @@ -329,12 +313,12 @@ const PinMap PinMap_CAN_TD[] = { #ifdef HAL_QSPI_MODULE_ENABLED const PinMap PinMap_QUADSPI[] = { - // {PA_1, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 - // {PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK - // {PB_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK1_NCS - // {PC_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 - // {PC_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 - // {PC_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK2_NCS + //{PA_1, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 + //{PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK + //{PB_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK1_NCS + //{PC_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 + //{PC_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 + //{PC_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK2_NCS {NC, NP, 0} }; #endif @@ -343,19 +327,15 @@ const PinMap PinMap_QUADSPI[] = { #ifdef HAL_PCD_MODULE_ENABLED const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED const PinMap PinMap_USB_OTG_HS[] = { {NC, NP, 0} }; #endif - - diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c index 5335361a6a..d3d754b689 100644 --- a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c @@ -29,18 +29,18 @@ WEAK const PinMap PinMap_ADC[] = { {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - // {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + //{PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + //{PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + //{PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + //{PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + //{PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + //{PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + //{PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + //{PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 {NC, NP, 0} }; #endif @@ -51,21 +51,19 @@ WEAK const PinMap PinMap_ADC[] = { #ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SDA[] = { - // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, - // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, + //{PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, + //{PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { - // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; #endif @@ -74,58 +72,58 @@ WEAK const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED WEAK const PinMap PinMap_PWM[] = { - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - // {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - // {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - // {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - // {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - // {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - // {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - // {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 {NC, NP, 0} }; @@ -135,41 +133,35 @@ WEAK const PinMap PinMap_PWM[] = { #ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_TX[] = { - // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PA_11, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PA_11, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { - // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PA_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PA_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { - // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { - // {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {NC, NP, 0} }; @@ -180,57 +172,51 @@ WEAK const PinMap PinMap_UART_CTS[] = { #ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + //{PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, {NC, NP, 0} }; #endif @@ -245,9 +231,9 @@ WEAK const PinMap PinMap_SPI_SSEL[] = { #ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} @@ -259,10 +245,10 @@ WEAK const PinMap PinMap_USB_OTG_FS[] = { #ifdef HAL_SD_MODULE_ENABLED WEAK const PinMap PinMap_SD[] = { - // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 - // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 - // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 - // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + //{PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + //{PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + //{PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + //{PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h index 0c7781997f..aeaaf890f2 100644 --- a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h +++ b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h @@ -33,55 +33,54 @@ extern "C" { */ #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ #define HAL_CRC_MODULE_ENABLED -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -//#define HAL_DAC_MODULE_ENABLED -/* #define HAL_DCMI_MODULE_ENABLED */ #define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ #define HAL_FLASH_MODULE_ENABLED -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ #define HAL_GPIO_MODULE_ENABLED -/* #define HAL_EXTI_MODULE_ENABLED */ #define HAL_I2C_MODULE_ENABLED -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ #define HAL_IWDG_MODULE_ENABLED -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ #define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ #define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ #define HAL_RTC_MODULE_ENABLED -/* #define HAL_SAI_MODULE_ENABLED */ #define HAL_SD_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ #define HAL_CORTEX_MODULE_ENABLED -#ifndef HAL_PCD_MODULE_ENABLED - #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#endif -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ +//#define HAL_PCD_MODULE_ENABLED // Automatically added if any type of USB is enabled, as in Arduino IDE. (STM32 v3.10700.191028) + +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED +//#define HAL_DAC_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED // by default +//#define HAL_USART_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** From f69ce3e02bfd6bbac483085a74126068a9cf384e Mon Sep 17 00:00:00 2001 From: Malderin <52313714+Malderin@users.noreply.github.com> Date: Mon, 12 Apr 2021 00:32:28 +0300 Subject: [PATCH 1272/1370] MKS LVGL UI: Fix icon layout (#21595) --- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 45a2167a05..a4515734a0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -45,7 +45,6 @@ #define ICON_POS_Y 38 #define TARGET_LABEL_MOD_Y -36 #define LABEL_MOD_Y 30 -#define SECOND_EXT_MOD_Y 100 extern lv_group_t* g; static lv_obj_t *scr; @@ -186,24 +185,33 @@ void lv_draw_ready_print() { // Monitoring lv_obj_t *buttonExt1 = lv_big_button_create(scr, "F:/bmp_ext1_state.bin", " ", 55, ICON_POS_Y, event_handler, ID_INFO_EXT); #if HAS_MULTI_EXTRUDER - lv_obj_t *buttonExt2 = lv_big_button_create(scr, "F:/bmp_ext2_state.bin", " ", 55, ICON_POS_Y + SECOND_EXT_MOD_Y, event_handler, ID_INFO_EXT); - #endif - #if HAS_HEATED_BED + lv_obj_t *buttonExt2 = lv_big_button_create(scr, "F:/bmp_ext2_state.bin", " ", 163, ICON_POS_Y, event_handler, ID_INFO_EXT); + #if HAS_HEATED_BED + lv_obj_t *buttonBedstate = lv_big_button_create(scr, "F:/bmp_bed_state.bin", " ", 271, ICON_POS_Y, event_handler, ID_INFO_BED); + #endif + #else + #if HAS_HEATED_BED lv_obj_t *buttonBedstate = lv_big_button_create(scr, "F:/bmp_bed_state.bin", " ", 210, ICON_POS_Y, event_handler, ID_INFO_BED); + #endif #endif + lv_obj_t *buttonFanstate = lv_big_button_create(scr, "F:/bmp_fan_state.bin", " ", 380, ICON_POS_Y, event_handler, ID_INFO_FAN); labelExt1 = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); labelExt1Target = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); #if HAS_MULTI_EXTRUDER - labelExt2 = lv_label_create(scr, 55, LABEL_MOD_Y + SECOND_EXT_MOD_Y, nullptr); - labelExt2Target = lv_label_create(scr, 55, LABEL_MOD_Y + SECOND_EXT_MOD_Y, nullptr); - #endif - - #if HAS_HEATED_BED - labelBed = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr); - labelBedTarget = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr); + labelExt2 = lv_label_create(scr, 163, LABEL_MOD_Y, nullptr); + labelExt2Target = lv_label_create(scr, 163, LABEL_MOD_Y, nullptr); + #if HAS_HEATED_BED + labelBed = lv_label_create(scr, 271, LABEL_MOD_Y, nullptr); + labelBedTarget = lv_label_create(scr, 271, LABEL_MOD_Y, nullptr); + #endif + #else + #if HAS_HEATED_BED + labelBed = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr); + labelBedTarget = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr); + #endif #endif labelFan = lv_label_create(scr, 380, 80, nullptr); From c66cbf0d691ceea773366caca48bf9e955613c2f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 12 Apr 2021 16:49:53 -0500 Subject: [PATCH 1273/1370] Reduce math library code size by 3.4KB (#21575) --- Marlin/src/core/macros.h | 3 ++ Marlin/src/feature/bedlevel/abl/abl.cpp | 14 +++---- Marlin/src/feature/bedlevel/bedlevel.cpp | 4 +- .../feature/bedlevel/mbl/mesh_bed_leveling.h | 7 +++- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 10 ++--- Marlin/src/feature/bedlevel/ubl/ubl.h | 42 +++++++------------ Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 40 +++++++++--------- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 18 ++++---- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 22 +++++----- Marlin/src/gcode/bedlevel/ubl/M421.cpp | 2 +- Marlin/src/gcode/calibrate/G33.cpp | 6 +-- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 6 +-- Marlin/src/gcode/calibrate/M48.cpp | 4 +- Marlin/src/gcode/probe/G30.cpp | 2 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 4 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 10 +++-- .../ftdi_eve_lib/extended/adjuster_widget.cpp | 2 +- .../screens/bed_mesh_base.cpp | 2 +- .../screens/bed_mesh_edit_screen.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 4 +- Marlin/src/lcd/menu/menu_tramming.cpp | 2 +- Marlin/src/lcd/tft/ui_1024x600.cpp | 2 +- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- Marlin/src/module/probe.cpp | 20 ++++----- Marlin/src/module/probe.h | 8 ++-- Marlin/src/module/settings.cpp | 14 +++---- Marlin/src/module/temperature.h | 6 +-- Marlin/src/sd/cardreader.cpp | 2 +- Marlin/src/sd/cardreader.h | 2 +- platformio.ini | 14 +++---- 35 files changed, 141 insertions(+), 145 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 6092dc4a59..ce88458412 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -112,6 +112,9 @@ #define SIGN(a) ({__typeof__(a) _a = (a); (_a>0)-(_a<0);}) #define IS_POWER_OF_2(x) ((x) && !((x) & ((x) - 1))) +#define MFNAN 999999.0f +#define ISNAN(V) ((V) == MFNAN) + // Macros to constrain values #ifdef __cplusplus diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index 7390656563..3d5e6723eb 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -43,7 +43,7 @@ bed_mesh_t z_values; * Extrapolate a single point from its neighbors */ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { - if (!isnan(z_values[x][y])) return; + if (!ISNAN(z_values[x][y])) return; if (DEBUGGING(LEVELING)) { DEBUG_ECHOPGM("Extrapolate ["); if (x < 10) DEBUG_CHAR(' '); @@ -63,12 +63,12 @@ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t c1 = z_values[x1][y1], c2 = z_values[x2][y2]; // Treat far unprobed points as zero, near as equal to far - if (isnan(a2)) a2 = 0.0; - if (isnan(a1)) a1 = a2; - if (isnan(b2)) b2 = 0.0; - if (isnan(b1)) b1 = b2; - if (isnan(c2)) c2 = 0.0; - if (isnan(c1)) c1 = c2; + if (ISNAN(a2)) a2 = 0.0; + if (ISNAN(a1)) a1 = a2; + if (ISNAN(b2)) b2 = 0.0; + if (ISNAN(b1)) b1 = b2; + if (ISNAN(c2)) c2 = 0.0; + if (ISNAN(c1)) c1 = c2; const float a = 2 * a1 - a2, b = 2 * b1 - b2, c = 2 * c1 - c2; diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 30fafbf57b..0a7c0c5a0c 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -132,7 +132,7 @@ void reset_bed_level() { bilinear_start.reset(); bilinear_grid_spacing.reset(); GRID_LOOP(x, y) { - z_values[x][y] = NAN; + z_values[x][y] = MFNAN; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, 0)); } #elif ABL_PLANAR @@ -177,7 +177,7 @@ void reset_bed_level() { LOOP_L_N(x, sx) { SERIAL_CHAR(' '); const float offset = fn(x, y); - if (!isnan(offset)) { + if (!ISNAN(offset)) { if (offset >= 0) SERIAL_CHAR('+'); SERIAL_ECHO_F(offset, int(precision)); } diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index eadcc28aa4..eaab7775f5 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -97,6 +97,7 @@ public: static inline xy_int8_t probe_indexes(const xy_pos_t &xy) { return probe_indexes(xy.x, xy.y); } static float calc_z0(const_float_t a0, const_float_t a1, const_float_t z1, const_float_t a2, const_float_t z2) { + if (ISNAN(a0) || ISNAN(a1) || ISNAN(z1) || ISNAN(a2) || ISNAN(z2)) return MFNAN; const float delta_z = (z2 - z1) / (a2 - a1), delta_a = a0 - a1; return z1 + delta_a * delta_z; @@ -114,9 +115,11 @@ public: const float x1 = index_to_xpos[ind.x], x2 = index_to_xpos[ind.x+1], y1 = index_to_xpos[ind.y], y2 = index_to_xpos[ind.y+1], z1 = calc_z0(pos.x, x1, z_values[ind.x][ind.y ], x2, z_values[ind.x+1][ind.y ]), - z2 = calc_z0(pos.x, x1, z_values[ind.x][ind.y+1], x2, z_values[ind.x+1][ind.y+1]); + z2 = calc_z0(pos.x, x1, z_values[ind.x][ind.y+1], x2, z_values[ind.x+1][ind.y+1]), + zf = calc_z0(pos.y, y1, z1, y2, z2); - return z_offset + calc_z0(pos.y, y1, z1, y2, z2) * factor; + + return ISNAN(zf) ? zf : z_offset + zf * factor; } #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 164d267ceb..70b7863fab 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -48,7 +48,7 @@ void unified_bed_leveling::report_current_mesh() { if (!leveling_is_valid()) return; SERIAL_ECHO_MSG(" G29 I999"); GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { + if (!ISNAN(z_values[x][y])) { SERIAL_ECHO_START(); SERIAL_ECHOPAIR(" M421 I", x, " J", y); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); @@ -99,7 +99,7 @@ void unified_bed_leveling::reset() { void unified_bed_leveling::invalidate() { set_bed_leveling_enabled(false); - set_all_mesh_points_to_value(NAN); + set_all_mesh_points_to_value(MFNAN); } void unified_bed_leveling::set_all_mesh_points_to_value(const_float_t value) { @@ -116,7 +116,7 @@ void unified_bed_leveling::set_all_mesh_points_to_value(const_float_t value) { void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { auto z_to_store = [](const_float_t z) { - if (isnan(z)) return Z_STEPS_NAN; + if (ISNAN(z)) return Z_STEPS_NAN; const int32_t z_scaled = TRUNC(z * mesh_store_scaling); if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) return Z_STEPS_NAN; // If Z is out of range, return our custom 'NaN' @@ -127,7 +127,7 @@ void unified_bed_leveling::set_all_mesh_points_to_value(const_float_t value) { void unified_bed_leveling::set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values) { auto store_to_z = [](const int16_t z_scaled) { - return z_scaled == Z_STEPS_NAN ? NAN : z_scaled / mesh_store_scaling; + return z_scaled == Z_STEPS_NAN ? MFNAN : z_scaled / mesh_store_scaling; }; GRID_LOOP(x, y) out_values[x][y] = store_to_z(stored_values[x][y]); } @@ -211,7 +211,7 @@ void unified_bed_leveling::display_map(const int map_type) { if (lcd) { // TODO: Display on Graphical LCD } - else if (isnan(f)) + else if (ISNAN(f)) SERIAL_ECHOPGM_P(human ? PSTR(" . ") : PSTR("NAN")); else if (human || csv) { if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index dd6c261341..a086c20ba8 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -196,7 +196,7 @@ public: #ifdef UBL_Z_RAISE_WHEN_OFF_MESH #define _UBL_OUTER_Z_RAISE UBL_Z_RAISE_WHEN_OFF_MESH #else - #define _UBL_OUTER_Z_RAISE NAN + #define _UBL_OUTER_Z_RAISE MFNAN #endif /** @@ -264,39 +264,25 @@ public: return UBL_Z_RAISE_WHEN_OFF_MESH; #endif - const float z1 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][cy], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1][cy]); + const uint8_t mx = _MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1, my = _MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1; + const float z1 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][cy], mesh_index_to_xpos(cx + 1), z_values[mx][cy]); + const float z2 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][my], mesh_index_to_xpos(cx + 1), z_values[mx][my]); + float z0 = calc_z0(ry0, mesh_index_to_ypos(cy), z1, mesh_index_to_ypos(cy + 1), z2); - const float z2 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1][_MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1]); - - float z0 = calc_z0(ry0, - mesh_index_to_ypos(cy), z1, - mesh_index_to_ypos(cy + 1), z2); - - if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPAIR(" raw get_z_correction(", rx0); - DEBUG_CHAR(','); DEBUG_ECHO(ry0); - DEBUG_ECHOPAIR_F(") = ", z0, 6); - DEBUG_ECHOLNPAIR_F(" >>>---> ", z0, 6); - } - - if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN + if (ISNAN(z0)) { // if part of the Mesh is undefined, it will show up as MFNAN z0 = 0.0; // in ubl.z_values[][] and propagate through the // calculations. If our correction is NAN, we throw it out // because part of the Mesh is undefined and we don't have the // information we need to complete the height correction. - if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0); - DEBUG_CHAR(','); - DEBUG_ECHO(ry0); - DEBUG_CHAR(')'); - DEBUG_EOL(); - } + if (DEBUGGING(MESH_ADJUST)) DEBUG_ECHOLNPAIR("??? Yikes! NAN in "); } + + if (DEBUGGING(MESH_ADJUST)) { + DEBUG_ECHOPAIR("get_z_correction(", rx0, ", ", ry0); + DEBUG_ECHOLNPAIR_F(") => ", z0, 6); + } + return z0; } static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } @@ -315,7 +301,7 @@ public: #endif static inline bool mesh_is_valid() { - GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false; + GRID_LOOP(x, y) if (ISNAN(z_values[x][y])) return false; return true; } diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 361f3f1285..ed2d4c6a94 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -331,7 +331,7 @@ void unified_bed_leveling::G29() { // to invalidate the ENTIRE mesh, which can't be done with // find_closest_mesh_point (which only returns REAL points). if (closest.pos.x < 0) { invalidate_all = true; break; } - z_values[closest.pos.x][closest.pos.y] = NAN; + z_values[closest.pos.x][closest.pos.y] = MFNAN; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(closest.pos, 0.0f)); } } @@ -516,7 +516,7 @@ void unified_bed_leveling::G29() { if (cpos.x < 0) { // No more REAL INVALID mesh points to populate, so we ASSUME // user meant to populate ALL INVALID mesh points to value - GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = param.C_constant; + GRID_LOOP(x, y) if (ISNAN(z_values[x][y])) z_values[x][y] = param.C_constant; break; // No more invalid Mesh Points to populate } else { @@ -675,7 +675,7 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o float sum = 0; int n = 0; GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { + if (!ISNAN(z_values[x][y])) { sum += z_values[x][y]; n++; } @@ -687,7 +687,7 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o // float sum_of_diff_squared = 0; GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) + if (!ISNAN(z_values[x][y])) sum_of_diff_squared += sq(z_values[x][y] - mean); SERIAL_ECHOLNPAIR("# of samples: ", n); @@ -698,7 +698,7 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o if (cflag) GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { + if (!ISNAN(z_values[x][y])) { z_values[x][y] -= mean + offset; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } @@ -709,7 +709,7 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o */ void unified_bed_leveling::shift_mesh_height() { GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { + if (!ISNAN(z_values[x][y])) { z_values[x][y] += param.C_constant; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } @@ -1017,7 +1017,7 @@ void set_message_with_feedback(PGM_P const msg_P) { ui.refresh(); float new_z = z_values[lpos.x][lpos.y]; - if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 + if (ISNAN(new_z)) new_z = 0; // Invalid points begin at 0 new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place ui.ubl_mesh_edit_start(new_z); @@ -1227,7 +1227,7 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { mesh_index_pair farthest { -1, -1, -99999.99 }; GRID_LOOP(i, j) { - if (!isnan(z_values[i][j])) continue; // Skip valid mesh points + if (!ISNAN(z_values[i][j])) continue; // Skip valid mesh points // Skip unreachable points if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) @@ -1238,7 +1238,7 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { xy_int8_t nearby { -1, -1 }; float d1, d2 = 99999.9f; GRID_LOOP(k, l) { - if (isnan(z_values[k][l])) continue; + if (ISNAN(z_values[k][l])) continue; found_a_real = true; @@ -1282,7 +1282,7 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { static bool test_func(uint8_t i, uint8_t j, void *data) { find_closest_t *d = (find_closest_t*)data; - if ( (d->type == (isnan(ubl.z_values[i][j]) ? INVALID : REAL)) + if ( (d->type == (ISNAN(ubl.z_values[i][j]) ? INVALID : REAL)) || (d->type == SET_IN_BITMAP && !d->done_flags->marked(i, j)) ) { // Found a Mesh Point of the specified type! @@ -1326,7 +1326,7 @@ mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const Mesh float best_so_far = 99999.99f; GRID_LOOP(i, j) { - if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) + if ( (type == (ISNAN(z_values[i][j]) ? INVALID : REAL)) || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) ) { // Found a Mesh Point of the specified type! @@ -1367,12 +1367,12 @@ mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const Mesh bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { const float v = z_values[x][y]; - if (isnan(v)) { // A NAN... + if (ISNAN(v)) { // A NAN... const int8_t dx = x + xdir, dy = y + ydir; const float v1 = z_values[dx][dy]; - if (!isnan(v1)) { // ...next to a pair of real values? + if (!ISNAN(v1)) { // ...next to a pair of real values? const float v2 = z_values[dx + xdir][dy + ydir]; - if (!isnan(v2)) { + if (!ISNAN(v2)) { z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); return true; @@ -1441,7 +1441,7 @@ void unified_bed_leveling::smart_fill_mesh() { TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, param.V_verbosity); - if (isnan(measured_z)) + if (ISNAN(measured_z)) abort_flag = true; else { measured_z -= get_z_correction(points[0]); @@ -1463,7 +1463,7 @@ void unified_bed_leveling::smart_fill_mesh() { #ifdef VALIDATE_MESH_TILT z2 = measured_z; #endif - if (isnan(measured_z)) + if (ISNAN(measured_z)) abort_flag = true; else { measured_z -= get_z_correction(points[1]); @@ -1483,7 +1483,7 @@ void unified_bed_leveling::smart_fill_mesh() { #ifdef VALIDATE_MESH_TILT z3 = measured_z; #endif - if (isnan(measured_z)) + if (ISNAN(measured_z)) abort_flag = true; else { measured_z -= get_z_correction(points[2]); @@ -1522,7 +1522,7 @@ void unified_bed_leveling::smart_fill_mesh() { measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling - abort_flag = isnan(measured_z); + abort_flag = ISNAN(measured_z); #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { @@ -1673,14 +1673,14 @@ void unified_bed_leveling::smart_fill_mesh() { const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); - GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); + GRID_LOOP(jx, jy) if (!ISNAN(z_values[jx][jy])) SBI(bitmap[jx], jy); xy_pos_t ppos; LOOP_L_N(ix, GRID_MAX_POINTS_X) { ppos.x = mesh_index_to_xpos(ix); LOOP_L_N(iy, GRID_MAX_POINTS_Y) { ppos.y = mesh_index_to_ypos(iy); - if (isnan(z_values[ix][iy])) { + if (ISNAN(z_values[ix][iy])) { // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. incremental_LSF_reset(&lsf_results); xy_pos_t rpos; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 3ebc5fc2bd..cb3f7d3bbe 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -85,7 +85,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (!isnan(z0)) end.z += z0; + if (!ISNAN(z0)) end.z += z0; planner.buffer_segment(end, scaled_fr_mm_s, extruder); current_position = destination; return; @@ -150,7 +150,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (isnan(z0)) z0 = 0.0; + if (ISNAN(z0)) z0 = 0.0; const float ry = mesh_index_to_ypos(icell.y); @@ -198,7 +198,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (isnan(z0)) z0 = 0.0; + if (ISNAN(z0)) z0 = 0.0; /** * Without this check, it's possible to generate a zero length move, as in the case where @@ -253,7 +253,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (isnan(z0)) z0 = 0.0; + if (ISNAN(z0)) z0 = 0.0; if (!inf_normalized_flag) { on_axis_distance = use_x_dist ? rx - start.x : next_mesh_line_y - start.y; @@ -276,7 +276,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (isnan(z0)) z0 = 0.0; + if (ISNAN(z0)) z0 = 0.0; if (!inf_normalized_flag) { on_axis_distance = use_x_dist ? next_mesh_line_x - start.x : ry - start.y; @@ -405,10 +405,10 @@ z_x0y1 = z_values[icell.x ][icell.y+1], // z at lower right corner z_x1y1 = z_values[icell.x+1][icell.y+1]; // z at upper right corner - if (isnan(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) - if (isnan(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points - if (isnan(z_x0y1)) z_x0y1 = 0; // in order to avoid isnan tests per cell, - if (isnan(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points + if (ISNAN(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) + if (ISNAN(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points + if (ISNAN(z_x0y1)) z_x0y1 = 0; // in order to avoid ISNAN tests per cell, + if (ISNAN(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points const xy_pos_t pos = { mesh_index_to_xpos(icell.x), mesh_index_to_ypos(icell.y) }; xy_pos_t cell = raw - pos; diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index ad2cc67db0..f1c3ce028d 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -105,7 +105,7 @@ void GcodeSuite::G35() { do_blocking_move_to_z(SUM_TERN(BLTOUCH_HS_MODE, Z_CLEARANCE_BETWEEN_PROBES, 7)); const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true); - if (isnan(z_probed_height)) { + if (ISNAN(z_probed_height)) { SERIAL_ECHOPAIR("G35 failed at point ", i, " ("); SERIAL_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i])); SERIAL_CHAR(')'); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 654a381383..423857dbb0 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -287,11 +287,11 @@ G29_TYPE GcodeSuite::G29() { G29_RETURN(false); } - const float rx = RAW_X_POSITION(parser.linearval('X', NAN)), - ry = RAW_Y_POSITION(parser.linearval('Y', NAN)); + const float rx = RAW_X_POSITION(parser.linearval('X', MFNAN)), + ry = RAW_Y_POSITION(parser.linearval('Y', MFNAN)); int8_t i = parser.byteval('I', -1), j = parser.byteval('J', -1); - if (!isnan(rx) && !isnan(ry)) { + if (!ISNAN(rx) && !ISNAN(ry)) { // Get nearest i / j from rx / ry i = (rx - bilinear_start.x + 0.5 * abl.gridSpacing.x) / abl.gridSpacing.x; j = (ry - bilinear_start.y + 0.5 * abl.gridSpacing.y) / abl.gridSpacing.y; @@ -608,7 +608,7 @@ G29_TYPE GcodeSuite::G29() { // Outer loop is X with PROBE_Y_FIRST enabled // Outer loop is Y with PROBE_Y_FIRST disabled - for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_SIZE && !isnan(abl.measured_z); PR_OUTER_VAR++) { + for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_SIZE && !ISNAN(abl.measured_z); PR_OUTER_VAR++) { int8_t inStart, inStop, inInc; @@ -644,7 +644,7 @@ G29_TYPE GcodeSuite::G29() { abl.measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); - if (isnan(abl.measured_z)) { + if (ISNAN(abl.measured_z)) { set_bed_leveling_enabled(abl.reenable); break; // Breaks out of both loops } @@ -690,14 +690,14 @@ G29_TYPE GcodeSuite::G29() { // Retain the last probe position abl.probePos = points[i]; abl.measured_z = faux ? 0.001 * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); - if (isnan(abl.measured_z)) { + if (ISNAN(abl.measured_z)) { set_bed_leveling_enabled(abl.reenable); break; } points[i].z = abl.measured_z; } - if (!abl.dryrun && !isnan(abl.measured_z)) { + if (!abl.dryrun && !ISNAN(abl.measured_z)) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); if (planeNormal.z < 0) planeNormal *= -1; planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); @@ -713,7 +713,7 @@ G29_TYPE GcodeSuite::G29() { // Stow the probe. No raise for FIX_MOUNTED_PROBE. if (probe.stow()) { set_bed_leveling_enabled(abl.reenable); - abl.measured_z = NAN; + abl.measured_z = MFNAN; } } #endif // !PROBE_MANUALLY @@ -736,7 +736,7 @@ G29_TYPE GcodeSuite::G29() { #endif // Calculate leveling, print reports, correct the position - if (!isnan(abl.measured_z)) { + if (!ISNAN(abl.measured_z)) { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) if (!abl.dryrun) extrapolate_unprobed_bed_level(); @@ -873,7 +873,7 @@ G29_TYPE GcodeSuite::G29() { // Auto Bed Leveling is complete! Enable if possible. planner.leveling_active = !abl.dryrun || abl.reenable; - } // !isnan(abl.measured_z) + } // !ISNAN(abl.measured_z) // Restore state after probing if (!faux) restore_feedrate_and_scaling(); @@ -897,7 +897,7 @@ G29_TYPE GcodeSuite::G29() { report_current_position(); - G29_RETURN(isnan(abl.measured_z)); + G29_RETURN(ISNAN(abl.measured_z)); } #endif // HAS_ABL_NOT_UBL diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp index 600c1fc8ba..694ad7ab81 100644 --- a/Marlin/src/gcode/bedlevel/ubl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/M421.cpp @@ -62,7 +62,7 @@ void GcodeSuite::M421() { SERIAL_ERROR_MSG(STR_ERR_MESH_XY); else { float &zval = ubl.z_values[ij.x][ij.y]; - zval = hasN ? NAN : parser.value_linear_units() + (hasQ ? zval : 0); + zval = hasN ? MFNAN : parser.value_linear_units() + (hasQ ? zval : 0); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ij.x, ij.y, zval)); } } diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 1b8eb889c6..0bcab206af 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -212,7 +212,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center const xy_pos_t center{0}; z_pt[CEN] += calibration_probe(center, stow_after_each); - if (isnan(z_pt[CEN])) return false; + if (ISNAN(z_pt[CEN])) return false; } if (_7p_calibration) { // probe extra center points @@ -223,7 +223,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi r = dcr * 0.1; const xy_pos_t vec = { cos(a), sin(a) }; z_pt[CEN] += calibration_probe(vec * r, stow_after_each); - if (isnan(z_pt[CEN])) return false; + if (ISNAN(z_pt[CEN])) return false; } z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points); } @@ -248,7 +248,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi interpol = FMOD(rad, 1); const xy_pos_t vec = { cos(a), sin(a) }; const float z_temp = calibration_probe(vec * r, stow_after_each); - if (isnan(z_temp)) return false; + if (ISNAN(z_temp)) return false; // split probe point to neighbouring calibration points z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90))); z_pt[uint8_t(LROUND(rad - interpol)) % NPP + 1] += z_temp * sq(sin(RADIANS(interpol * 90))); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 1614dd6fbd..959d0f9c09 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -229,7 +229,7 @@ void GcodeSuite::G34() { // Probing sanity check is disabled, as it would trigger even in normal cases because // current_position.z has been manually altered in the "dirty trick" above. const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false); - if (isnan(z_probed_height)) { + if (ISNAN(z_probed_height)) { SERIAL_ECHOLNPGM("Probing failed"); LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); err_break = true; diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 8cfe6fee7b..db1a6db76d 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -113,7 +113,7 @@ void GcodeSuite::G76() { auto g76_probe = [](const TempSensorID sid, uint16_t &targ, const xy_pos_t &nozpos) { do_z_clearance(5.0); // Raise nozzle before probing const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false - if (isnan(measured_z)) + if (ISNAN(measured_z)) SERIAL_ECHOLNPGM("!Received NAN. Aborting."); else { SERIAL_ECHOLNPAIR_F("Measured: ", measured_z); @@ -208,7 +208,7 @@ void GcodeSuite::G76() { report_temps(next_temp_report); const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz); - if (isnan(measured_z) || target_bed > BED_MAX_TARGET) break; + if (ISNAN(measured_z) || target_bed > BED_MAX_TARGET) break; } SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); @@ -267,7 +267,7 @@ void GcodeSuite::G76() { if (timeout) break; const float measured_z = g76_probe(TSI_PROBE, target_probe, noz_pos_xyz); - if (isnan(measured_z) || target_probe > cali_info_init[TSI_PROBE].end_temp) break; + if (ISNAN(measured_z) || target_probe > cali_info_init[TSI_PROBE].end_temp) break; } SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 19b11f602a..07e248fc3d 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -134,7 +134,7 @@ void GcodeSuite::M48() { // Move to the first point, deploy, and probe const float t = probe.probe_at_point(test_position, raise_after, verbose_level); - bool probing_good = !isnan(t); + bool probing_good = !ISNAN(t); if (probing_good) { randomSeed(millis()); @@ -219,7 +219,7 @@ void GcodeSuite::M48() { const float pz = probe.probe_at_point(test_position, raise_after, 0); // Break the loop if the probe fails - probing_good = !isnan(pz); + probing_good = !ISNAN(pz); if (!probing_good) break; // Store the new sample diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index 4347f55aa8..ebdc19f582 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -52,7 +52,7 @@ void GcodeSuite::G30() { const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; const float measured_z = probe.probe_at_point(pos, raise_after, 1); - if (!isnan(measured_z)) + if (!ISNAN(measured_z)) SERIAL_ECHOLNPAIR("Bed X: ", pos.x, " Y: ", pos.y, " Z: ", measured_z); restore_feedrate_and_scaling(); diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 98ca1c0930..874fcc143d 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1457,7 +1457,7 @@ void MarlinUI::draw_status_screen() { * Print Z values */ _ZLABEL(_LCD_W_POS, 1); - if (!isnan(ubl.z_values[x_plot][y_plot])) + if (!ISNAN(ubl.z_values[x_plot][y_plot])) lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); else lcd_put_u8str_P(PSTR(" -----")); @@ -1476,7 +1476,7 @@ void MarlinUI::draw_status_screen() { * Show the location value */ _ZLABEL(_LCD_W_POS, 3); - if (!isnan(ubl.z_values[x_plot][y_plot])) + if (!ISNAN(ubl.z_values[x_plot][y_plot])) lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); else lcd_put_u8str_P(PSTR(" -----")); diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 6976bfed22..cc54354ed1 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -941,7 +941,7 @@ void MarlinUI::draw_status_screen() { // Show the location value lcd.setCursor(_LCD_W_POS, 3); lcd_put_u8str_P(PSTR("Z:")); - if (!isnan(ubl.z_values[x_plot][y_plot])) + if (!ISNAN(ubl.z_values[x_plot][y_plot])) lcd.print(ftostr43sign(ubl.z_values[x_plot][y_plot])); else lcd_put_u8str_P(PSTR(" -----")); diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index dc60c1bff3..89f7746438 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -569,7 +569,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Show the location value lcd_put_u8str_P(74, LCD_PIXEL_HEIGHT, Z_LBL); - if (!isnan(ubl.z_values[x_plot][y_plot])) + if (!ISNAN(ubl.z_values[x_plot][y_plot])) lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); else lcd_put_u8str_P(PSTR(" -----")); diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 921dee0e34..793bcd752f 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -835,13 +835,17 @@ void MarlinUI::draw_status_screen() { mix_label = PSTR("Mx"); } - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wformat-overflow" + #if GCC_VERSION <= 50000 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wformat-overflow" + #endif sprintf_P(mixer_messages, PSTR(S_FMT " %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); lcd_put_u8str(X_LABEL_POS, XYZ_BASELINE, mixer_messages); - #pragma GCC diagnostic pop + #if GCC_VERSION <= 50000 + #pragma GCC diagnostic pop + #endif #else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp index 26be9f4e59..531f759c49 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp @@ -32,7 +32,7 @@ namespace FTDI { void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) { char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; - if (isnan(value)) + if (ISNAN(value)) strcpy_P(str, PSTR("-")); else dtostrf(value, width, precision, str); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp index e83f09f045..d64238808c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp @@ -31,7 +31,7 @@ void BedMeshBase::_drawMesh(CommandProcessor &cmd, int16_t x, int16_t y, int16_t constexpr uint8_t cols = GRID_MAX_POINTS_X; #define VALUE(X,Y) (func ? func(X,Y,data) : 0) - #define ISVAL(X,Y) (func ? !isnan(VALUE(X,Y)) : true) + #define ISVAL(X,Y) (func ? !ISNAN(VALUE(X,Y)) : true) #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) // Compute the mean, min and max for the points diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp index 117ac0e452..01d4d1428b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp @@ -70,7 +70,7 @@ void BedMeshEditScreen::onEntry() { float BedMeshEditScreen::getHighlightedValue() { const float val = ExtUI::getMeshPoint(mydata.highlight); - return (isnan(val) ? 0 : val) + mydata.zAdjustment; + return (ISNAN(val) ? 0 : val) + mydata.zAdjustment; } void BedMeshEditScreen::setHighlightedValue(float value) { diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 2cac0f8e77..9d89447e3e 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -421,7 +421,7 @@ namespace ExtUI { #if AXIS_IS_TMC(Z2) case Z2: return stepperZ2.getMilliamps(); #endif - default: return NAN; + default: return MFNAN; }; } @@ -451,7 +451,7 @@ namespace ExtUI { #if AXIS_IS_TMC(E7) case E7: return stepperE7.getMilliamps(); #endif - default: return NAN; + default: return MFNAN; }; } diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index da7afd86ef..0dc468e805 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -54,7 +54,7 @@ static bool probe_single_point() { z_measured[tram_index] = z_probed_height; move_to_tramming_wait_pos(); - return !isnan(z_probed_height); + return !ISNAN(z_probed_height); } static void _menu_single_probe(const uint8_t point) { diff --git a/Marlin/src/lcd/tft/ui_1024x600.cpp b/Marlin/src/lcd/tft/ui_1024x600.cpp index e04d589858..819414b828 100644 --- a/Marlin/src/lcd/tft/ui_1024x600.cpp +++ b/Marlin/src/lcd/tft/ui_1024x600.cpp @@ -505,7 +505,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft_string.set(Z_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.set(ISNAN(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); tft_string.trim(); tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 5563d3069b..8429907f96 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -492,7 +492,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft_string.set(Z_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.set(ISNAN(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); tft_string.trim(); tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 4d5a0b4fda..4b02b21ea6 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -492,7 +492,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft_string.set(Z_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.set(ISNAN(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); tft_string.trim(); tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d4b8409efa..d408dd236d 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -583,7 +583,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { * @details Used by probe_at_point to get the bed Z height at the current XY. * Leaves current_position.z at the height where the probe triggered. * - * @return The Z position of the bed at the current XY or NAN on error. + * @return The Z position of the bed at the current XY or MFNAN on error. */ float Probe::run_z_probe(const bool sanity_check/*=true*/) { DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); @@ -617,11 +617,11 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { #if TOTAL_PROBING == 2 // Attempt to tare the probe - if (TERN0(PROBE_TARE, tare())) return NAN; + if (TERN0(PROBE_TARE, tare())) return MFNAN; // Do a first probe at the fast speed if (try_to_probe(PSTR("FAST"), z_probe_low_point, z_probe_fast_mm_s, - sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return NAN; + sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return MFNAN; const float first_probe_z = current_position.z; @@ -662,7 +662,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { // Probe downward slowly to find the bed if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW), - sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return NAN; + sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return MFNAN; TERN_(MEASURE_BACKLASH_WHEN_PROBING, backlash.measure_with_probe()); @@ -765,29 +765,29 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai if (probe_relative) { // The given position is in terms of the probe if (!can_reach(npos)) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Position Not Reachable"); - return NAN; + return MFNAN; } npos -= offset_xy; // Get the nozzle position } - else if (!position_is_reachable(npos)) return NAN; // The given position is in terms of the nozzle + else if (!position_is_reachable(npos)) return MFNAN; // The given position is in terms of the nozzle // Move the probe to the starting XYZ do_blocking_move_to(npos, feedRate_t(XY_PROBE_FEEDRATE_MM_S)); - float measured_z = NAN; + float measured_z = MFNAN; if (!deploy()) measured_z = run_z_probe(sanity_check) + offset.z; - if (!isnan(measured_z)) { + if (!ISNAN(measured_z)) { const bool big_raise = raise_after == PROBE_PT_BIG_RAISE; if (big_raise || raise_after == PROBE_PT_RAISE) do_blocking_move_to_z(current_position.z + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), z_probe_fast_mm_s); else if (raise_after == PROBE_PT_STOW) - if (stow()) measured_z = NAN; // Error on stow? + if (stow()) measured_z = MFNAN; // Error on stow? if (verbose_level > 2) SERIAL_ECHOLNPAIR("Bed X: ", LOGICAL_X_POSITION(rx), " Y: ", LOGICAL_Y_POSITION(ry), " Z: ", measured_z); } - if (isnan(measured_z)) { + if (ISNAN(measured_z)) { stow(); LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); #if DISABLED(G29_RETRY_AND_RECOVER) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index d8272c31b6..75aba76ef3 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -185,10 +185,10 @@ public: ); } - static float min_x() { return _min_x() - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.x)); } - static float max_x() { return _max_x() - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.x)); } - static float min_y() { return _min_y() - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.y)); } - static float max_y() { return _max_y() - TERN0(NOZZLE_AS_PROBE, TERN0(HAS_HOME_OFFSET, home_offset.y)); } + static float min_x() { return _min_x() TERN_(NOZZLE_AS_PROBE, TERN_(HAS_HOME_OFFSET, - home_offset.x)); } + static float max_x() { return _max_x() TERN_(NOZZLE_AS_PROBE, TERN_(HAS_HOME_OFFSET, - home_offset.x)); } + static float min_y() { return _min_y() TERN_(NOZZLE_AS_PROBE, TERN_(HAS_HOME_OFFSET, - home_offset.y)); } + static float max_y() { return _max_y() TERN_(NOZZLE_AS_PROBE, TERN_(HAS_HOME_OFFSET, - home_offset.y)); } // constexpr helpers used in build-time static_asserts, relying on default probe offsets. class build_time { diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 915886fe4a..d1fd719cfb 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -900,8 +900,8 @@ void MarlinSettings::postprocess() { HOTEND_LOOP() { PIDCF_t pidcf = { #if DISABLED(PIDTEMP) - NAN, NAN, NAN, - NAN, NAN + MFNAN, MFNAN, MFNAN, + MFNAN, MFNAN #else PID_PARAM(Kp, e), unscalePID_i(PID_PARAM(Ki, e)), @@ -928,7 +928,7 @@ void MarlinSettings::postprocess() { const PID_t bed_pid = { #if DISABLED(PIDTEMPBED) - NAN, NAN, NAN + MFNAN, MFNAN, MFNAN #else // Store the unscaled PID values thermalManager.temp_bed.pid.Kp, @@ -947,7 +947,7 @@ void MarlinSettings::postprocess() { const PID_t chamber_pid = { #if DISABLED(PIDTEMPCHAMBER) - NAN, NAN, NAN + MFNAN, MFNAN, MFNAN #else // Store the unscaled PID values thermalManager.temp_chamber.pid.Kp, @@ -1786,7 +1786,7 @@ void MarlinSettings::postprocess() { PIDCF_t pidcf; EEPROM_READ(pidcf); #if ENABLED(PIDTEMP) - if (!validating && !isnan(pidcf.Kp)) { + if (!validating && !ISNAN(pidcf.Kp)) { // Scale PID values since EEPROM values are unscaled PID_PARAM(Kp, e) = pidcf.Kp; PID_PARAM(Ki, e) = scalePID_i(pidcf.Ki); @@ -1818,7 +1818,7 @@ void MarlinSettings::postprocess() { PID_t pid; EEPROM_READ(pid); #if ENABLED(PIDTEMPBED) - if (!validating && !isnan(pid.Kp)) { + if (!validating && !ISNAN(pid.Kp)) { // Scale PID values since EEPROM values are unscaled thermalManager.temp_bed.pid.Kp = pid.Kp; thermalManager.temp_bed.pid.Ki = scalePID_i(pid.Ki); @@ -1834,7 +1834,7 @@ void MarlinSettings::postprocess() { PID_t pid; EEPROM_READ(pid); #if ENABLED(PIDTEMPCHAMBER) - if (!validating && !isnan(pid.Kp)) { + if (!validating && !ISNAN(pid.Kp)) { // Scale PID values since EEPROM values are unscaled thermalManager.temp_chamber.pid.Kp = pid.Kp; thermalManager.temp_chamber.pid.Ki = scalePID_i(pid.Ki); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 13dcca2932..9633c9733c 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -74,9 +74,9 @@ hotend_pid_t; #endif #define PID_PARAM(F,H) _PID_##F(TERN(PID_PARAMS_PER_HOTEND, H, 0 & H)) // Always use 'H' to suppress warning -#define _PID_Kp(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kp, NAN) -#define _PID_Ki(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Ki, NAN) -#define _PID_Kd(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kd, NAN) +#define _PID_Kp(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kp, MFNAN) +#define _PID_Ki(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Ki, MFNAN) +#define _PID_Kd(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kd, MFNAN) #if ENABLED(PIDTEMP) #define _PID_Kc(H) TERN(PID_EXTRUSION_SCALING, Temperature::temp_hotend[H].pid.Kc, 1) #define _PID_Kf(H) TERN(PID_FAN_SCALING, Temperature::temp_hotend[H].pid.Kf, 0) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index f0797d6538..07a57cc658 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -565,7 +565,7 @@ void announceOpen(const uint8_t doing, const char * const path) { // - 1 : (no file open) Opening a macro (M98). // - 2 : Resuming from a sub-procedure // -void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0*/) { +void CardReader::openFileRead(const char * const path, const uint8_t subcall_type/*=0*/) { if (!isMounted()) return; switch (subcall_type) { diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 482fb1c5cc..f1002e1dab 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -102,7 +102,7 @@ public: #endif // Basic file ops - static void openFileRead(char * const path, const uint8_t subcall=0); + static void openFileRead(const char * const path, const uint8_t subcall=0); static void openFileWrite(const char * const path); static void closefile(const bool store_location=false); static bool fileExists(const char * const name); diff --git a/platformio.ini b/platformio.ini index 913bb44ae0..53db8fc4b1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -38,6 +38,13 @@ extra_configs = # The 'common' values are used for most Marlin builds # [common] +build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants -fno-signed-zeros -ffinite-math-only +extra_scripts = + pre:buildroot/share/PlatformIO/scripts/common-dependencies.py + pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py + pre:buildroot/share/PlatformIO/scripts/preflight-checks.py + post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py +lib_deps = default_src_filter = + - - + - - - - - - - - @@ -227,13 +234,6 @@ default_src_filter = + - - + - - - - - -extra_scripts = - pre:buildroot/share/PlatformIO/scripts/common-dependencies.py - pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py - pre:buildroot/share/PlatformIO/scripts/preflight-checks.py - post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py -build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants -lib_deps = # # Default values apply to all 'env:' prefixed environments From ca84e5b1f2c5f7e0f0ffe3090456f23d85a45a8f Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Tue, 13 Apr 2021 00:39:22 +0200 Subject: [PATCH 1274/1370] Add 'jump relaxing' compile flag to AVR targets (#21566) --- ini/avr.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/ini/avr.ini b/ini/avr.ini index 944646190a..1b208400a3 100644 --- a/ini/avr.ini +++ b/ini/avr.ini @@ -13,6 +13,7 @@ # AVR (8-bit) Common Environment values # [common_avr8] +build_flags = ${common.build_flags} -Wl,--relax board_build.f_cpu = 16000000L src_filter = ${common.default_src_filter} + From f14d0e098382d4ac001d7b897cdee4739ffed239 Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Mon, 12 Apr 2021 17:52:18 -0500 Subject: [PATCH 1275/1370] Tweak cooler / flowmeter icons (#21573) --- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 4 +- Marlin/src/lcd/dogm/status/cooler.h | 153 ++++++++++++------------ 2 files changed, 81 insertions(+), 76 deletions(-) diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index f0e37aa249..6d2c5369dc 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -547,7 +547,7 @@ #endif #ifndef STATUS_COOLER_TEXT_X - #define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 8) + #define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 12) #endif static_assert( @@ -583,7 +583,7 @@ #endif #ifndef STATUS_FLOWMETER_TEXT_X - #define STATUS_FLOWMETER_TEXT_X (STATUS_FLOWMETER_X + 8) + #define STATUS_FLOWMETER_TEXT_X (STATUS_FLOWMETER_X + 12) #endif static_assert( diff --git a/Marlin/src/lcd/dogm/status/cooler.h b/Marlin/src/lcd/dogm/status/cooler.h index df596b5c5a..6cf67a4b62 100644 --- a/Marlin/src/lcd/dogm/status/cooler.h +++ b/Marlin/src/lcd/dogm/status/cooler.h @@ -25,90 +25,95 @@ // lcd/dogm/status/cooler.h - Status Screen Laser Cooler bitmaps // #if HAS_COOLER - #define STATUS_COOLER_WIDTH 16 + + #define STATUS_COOLER_WIDTH 22 + const unsigned char status_cooler_bmp2[] PROGMEM = { - B00010000,B00001000, - B00010010,B01001001, - B01010100,B00101010, - B00111000,B00011100, - B11111110,B11111111, - B00111000,B00011100, - B01010100,B00101010, - B10010000,B10001001, - B00010000,B10000000, - B00000100,B10010000, - B00000010,B10100000, - B00000001,B11000000, - B00011111,B11111100, - B00000001,B11000000, - B00000010,B10100000, - B00000100,B10010000 + B00000100,B00000010,B00000000, + B00000100,B10010010,B01000000, + B00010101,B00001010,B10000000, + B00001110,B00000111,B00000000, + B00111111,B10111111,B11000000, + B00001110,B00000111,B00000000, + B00010101,B00001010,B10000000, + B00100100,B00100010,B01000000, + B00000100,B00100000,B00000000, + B00000001,B00100100,B00000000, + B00000000,B10101000,B00000000, + B00000000,B01110000,B00000000, + B00000111,B11111111,B00000000, + B00000000,B01110000,B00000000, + B00000000,B10101000,B00000000, + B00000001,B00100100,B00000000 }; const unsigned char status_cooler_bmp1[] PROGMEM = { - B00010000,B00001000, - B00010010,B01001001, - B01010100,B00101010, - B00101000,B00010100, - B11000111,B01100011, - B00101000,B00010100, - B01010100,B00101010, - B10010000,B10001001, - B00010000,B10000000, - B00000100,B10010000, - B00000010,B10100000, - B00000001,B01000000, - B00011110,B00111100, - B00000001,B01000000, - B00000010,B10100000, - B00000100,B10010000 + B00000100,B00000010,B00000000, + B00000100,B10010010,B01000000, + B00010101,B00001010,B10000000, + B00001010,B00000101,B00000000, + B00110001,B11011000,B11000000, + B00001010,B00000101,B00000000, + B00010101,B00001010,B10000000, + B00100100,B00100010,B01000000, + B00000100,B00100000,B00000000, + B00000001,B00100100,B00000000, + B00000000,B10101000,B00000000, + B00000000,B01010000,B00000000, + B00000111,B10001111,B00000000, + B00000000,B01010000,B00000000, + B00000000,B10101000,B00000000, + B00000001,B00100100,B00000000 }; + #endif #if ENABLED(LASER_COOLANT_FLOW_METER) + #define STATUS_FLOWMETER_WIDTH 24 + const unsigned char status_flowmeter_bmp2[] PROGMEM = { - B00000001,B11111000,B00000000, - B00000110,B00000110,B00000000, - B00001000,B01100001,B00000000, - B00010000,B01100000,B10000000, - B00100000,B01100000,B01000000, - B00100000,B01100000,B01000000, - B01000000,B01100000,B00100000, - B01000000,B01100000,B00100000, - B01011111,B11111111,B10100000, - B01011111,B11111111,B10100000, - B01000000,B01100000,B00100000, - B01000000,B01100000,B00100000, - B00100000,B01100000,B01000000, - B00100000,B01100000,B01000000, - B00010000,B01100000,B10000000, - B00001000,B01100001,B00000000, - B00000110,B00000110,B00000000, - B00000001,B11111000,B00000000, - B00000000,B01100000,B00000000, - B00011111,B11111111,B10000000 + B00000000,B01111110,B00000000, + B00000001,B10000001,B10000000, + B00000010,B00011000,B01000000, + B00000100,B00011000,B00100000, + B00001000,B00011000,B00010000, + B00001000,B00011000,B00010000, + B00010000,B00011000,B00001000, + B00010000,B00011000,B00001000, + B00010111,B11111111,B11101000, + B00010111,B11111111,B11101000, + B00010000,B00011000,B00001000, + B00010000,B00011000,B00001000, + B00001000,B00011000,B00010000, + B00001000,B00011000,B00010000, + B00000100,B00011000,B00100000, + B00000010,B00011000,B01000000, + B00000001,B10000001,B10000000, + B00000000,B01111110,B00000000, + B00000000,B00011000,B00000000, + B00000111,B11111111,B11100000 }; const unsigned char status_flowmeter_bmp1[] PROGMEM = { - B00000001,B11111000,B00000000, - B00000110,B00000110,B00000000, - B00001000,B00000001,B00000000, - B00010100,B00000010,B10000000, - B00101110,B00000111,B01000000, - B00100111,B00001110,B01000000, - B01000011,B10011100,B00100000, - B01000001,B11111000,B00100000, - B01000000,B11110000,B00100000, - B01000000,B11110000,B00100000, - B01000001,B11111000,B00100000, - B01000011,B10011100,B00100000, - B00100111,B00001110,B01000000, - B00101110,B00000111,B01000000, - B00010100,B00000010,B10000000, - B00001000,B00000001,B00000000, - B00000110,B00000110,B00000000, - B00000001,B11111000,B00000000, - B00000000,B01100000,B00000000, - B00011111,B11111111,B10000000 + B00000000,B01111110,B00000000, + B00000001,B10000001,B10000000, + B00000010,B00000000,B01000000, + B00000101,B00000000,B10100000, + B00001011,B10000001,B11010000, + B00001001,B11000011,B10010000, + B00010000,B11100111,B00001000, + B00010000,B01111110,B00001000, + B00010000,B00111100,B00001000, + B00010000,B00111100,B00001000, + B00010000,B01111110,B00001000, + B00010000,B11100111,B00001000, + B00001001,B11000011,B10010000, + B00001011,B10000001,B11010000, + B00000101,B00000000,B10100000, + B00000010,B00000000,B01000000, + B00000001,B10000001,B10000000, + B00000000,B01111110,B00000000, + B00000000,B00011000,B00000000, + B00000111,B11111111,B11100000 }; -#endif +#endif From 5ab64708c5604e43f8079d7eda3bbb40d01d6c79 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 12 Apr 2021 19:34:31 -0500 Subject: [PATCH 1276/1370] Update old-style axis indexes --- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 6 +++--- Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 10 +++++----- Marlin/src/module/tool_change.cpp | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index cc54354ed1..faac398a4a 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -668,9 +668,9 @@ void MarlinUI::draw_status_screen() { // lcd.setCursor(0, 0); - _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' '); - _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' '); - _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); + _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position.x)), blink); lcd.write(' '); + _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position.y)), blink); lcd.write(' '); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); #if HAS_LEVELING && !HAS_HEATED_BED lcd.write(planner.leveling_active || blink ? '_' : ' '); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 6025968d3b..a1818e6ddd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -252,7 +252,7 @@ void disp_print_time() { void disp_fan_Zpos() { char str_1[16]; - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(current_position[Z_AXIS], 1, 3, str_1)); + sprintf_P(public_buf_l, PSTR("%s"), dtostrf(current_position.z, 1, 3, str_1)); lv_label_set_text(labelZpos, public_buf_l); } diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 9d89447e3e..17e869d44f 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -870,19 +870,19 @@ namespace ExtUI { const feedRate_t old_feedrate = feedrate_mm_s; const float x_target = MESH_MIN_X + pos.x * (MESH_X_DIST), y_target = MESH_MIN_Y + pos.y * (MESH_Y_DIST); - if (x_target != current_position[X_AXIS] || y_target != current_position[Y_AXIS]) { + if (x_target != current_position.x || y_target != current_position.y) { // If moving across bed, raise nozzle to safe height over bed feedrate_mm_s = Z_PROBE_FEEDRATE_FAST; destination = current_position; - destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; + destination.z = Z_CLEARANCE_BETWEEN_PROBES; prepare_line_to_destination(); feedrate_mm_s = XY_PROBE_FEEDRATE; - destination[X_AXIS] = x_target; - destination[Y_AXIS] = y_target; + destination.x = x_target; + destination.y = y_target; prepare_line_to_destination(); } feedrate_mm_s = Z_PROBE_FEEDRATE_FAST; - destination[Z_AXIS] = z; + destination.z = z; prepare_line_to_destination(); feedrate_mm_s = old_feedrate; #else diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 1ed395dfe4..0475af6ad2 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -846,9 +846,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // Cutting recover unscaled_e_move(toolchange_settings.extra_resume + TOOLCHANGE_FS_WIPE_RETRACT, MMM_TO_MMS(toolchange_settings.unretract_speed)); - planner.synchronize(); + // Resume at the old E position current_position.e = destination.e; - sync_plan_position_e(); // Resume at the old E position + sync_plan_position_e(); } } From fb7bdabb70d77d29c25427b5e4df4a1976d26e63 Mon Sep 17 00:00:00 2001 From: espr14 Date: Tue, 13 Apr 2021 03:10:21 +0200 Subject: [PATCH 1277/1370] Fix Resume Print with UBL (#21564) Co-authored-by: Scott Lahteine --- Marlin/src/feature/pause.cpp | 10 ++++++---- Marlin/src/gcode/feature/pause/M701_M702.cpp | 17 ++++++++++++----- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 13 +++++++++++-- Marlin/src/module/tool_change.cpp | 5 +++-- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 5990c09a90..8a1701d0b6 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -597,11 +597,13 @@ void resume_print(const_float_t slow_load_length/*=0*/, const_float_t fast_load_ unscaled_e_move(-(PAUSE_PARK_RETRACT_LENGTH), feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); if (!axes_should_home()) { - // Move XY to starting position, then Z - do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); + // Move XY back to saved position + destination.set(resume_position.x, resume_position.y, current_position.z); + prepare_internal_move_to_destination(NOZZLE_PARK_XY_FEEDRATE); - // Move Z_AXIS to saved position - do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + // Move Z back to saved position + destination.z = resume_position.z; + prepare_internal_move_to_destination(NOZZLE_PARK_Z_FEEDRATE); } // Unretract diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index 9a2b774936..6be63346dc 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -88,9 +88,17 @@ void GcodeSuite::M701() { tool_change(target_extruder, false); #endif - // Lift Z axis - if (park_point.z > 0) - do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + auto move_z_by = [](const_float_t zdist) { + if (zdist) { + destination = current_position; + destination.z += zdist; + prepare_internal_move_to_destination(NOZZLE_PARK_Z_FEEDRATE); + } + }; + + // Raise the Z axis (with max limit) + const float park_raise = _MIN(0, park_point.z, (Z_MAX_POS) - current_position.z); + move_z_by(park_raise); // Load filament #if HAS_PRUSA_MMU2 @@ -113,8 +121,7 @@ void GcodeSuite::M701() { #endif // Restore Z axis - if (park_point.z > 0) - do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + move_z_by(-park_raise); #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU) // Restore toolhead if it was changed diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 911965b9ae..01c3adbda7 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -75,9 +75,18 @@ xyz_pos_t position_before_pause; void MKS_pause_print_move() { queue.exhaust(); position_before_pause = current_position; - do_blocking_move_to(X_MIN_POS + mks_park_pos.x, Y_MIN_POS + mks_park_pos.y, current_position.z + mks_park_pos.z); + destination.z = _MIN(current_position.z + mks_park_pos.z, Z_MAX_POS); + prepare_internal_move_to_destination(NOZZLE_PARK_Z_FEEDRATE); + destination.set(X_MIN_POS + mks_park_pos.x, Y_MIN_POS + mks_park_pos.y); + prepare_internal_move_to_destination(NOZZLE_PARK_XY_FEEDRATE); +} + +void MKS_resume_print_move() { + destination.set(position_before_pause.x, position_before_pause.y); + prepare_internal_move_to_destination(NOZZLE_PARK_XY_FEEDRATE); + destination.z = position_before_pause.z; + prepare_internal_move_to_destination(NOZZLE_PARK_Z_FEEDRATE); } -void MKS_resume_print_move() { do_blocking_move_to(position_before_pause); } float z_offset_add = 0; diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 0475af6ad2..3dd63e814c 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -836,9 +836,10 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #if ENABLED(TOOLCHANGE_PARK) if (ok) { #if ENABLED(TOOLCHANGE_NO_RETURN) - do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); + destination.set(current_position.x, current_position.y); + prepare_internal_move_to_destination(planner.settings.max_feedrate_mm_s[Z_AXIS]); #else - do_blocking_move_to(destination, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); + prepare_internal_move_to_destination(MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); #endif } #endif From 49fba5a82a488ff1eb6731fd9a0157e9fc9a2497 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 12 Apr 2021 20:15:41 -0500 Subject: [PATCH 1278/1370] Add 'blocking move' comments --- Marlin/src/module/motion.cpp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index afd30a44e0..9c1f8cd4ad 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -367,12 +367,13 @@ void _internal_move_to_destination(const_feedRate_t fr_mm_s/*=0.0f*/ planner.e_factor[active_extruder] = 1.0f; #endif - #if IS_KINEMATIC - if (is_fast) - prepare_fast_move_to_destination(); - else + #if !IS_KINEMATIC + constexpr bool is_fast = false; #endif - prepare_line_to_destination(); + if (is_fast) + prepare_fast_move_to_destination(); + else + prepare_line_to_destination(); feedrate_mm_s = old_feedrate; feedrate_percentage = old_pct; @@ -382,7 +383,12 @@ void _internal_move_to_destination(const_feedRate_t fr_mm_s/*=0.0f*/ } /** - * Plan a move to (X, Y, Z) and set the current_position + * Plan a move to (X, Y, Z) with separation of the XY and Z components. + * + * - If Z is moving up, the Z move is done before XY. + * - If Z is moving down, the Z move is done after XY. + * - Delta may lower Z first to get into the free motion zone. + * - Before returning, wait for the planner buffer to empty. */ void do_blocking_move_to(const float rx, const float ry, const float rz, const_feedRate_t fr_mm_s/*=0.0*/) { DEBUG_SECTION(log_move, "do_blocking_move_to", DEBUGGING(LEVELING)); @@ -391,20 +397,21 @@ void do_blocking_move_to(const float rx, const float ry, const float rz, const_f const feedRate_t z_feedrate = fr_mm_s ?: homing_feedrate(Z_AXIS), xy_feedrate = fr_mm_s ?: feedRate_t(XY_PROBE_FEEDRATE_MM_S); + #if EITHER(DELTA, IS_SCARA) + if (!position_is_reachable(rx, ry)) return; + destination = current_position; // sync destination at the start + #endif + #if ENABLED(DELTA) - if (!position_is_reachable(rx, ry)) return; - REMEMBER(fr, feedrate_mm_s, xy_feedrate); - destination = current_position; // sync destination at the start - if (DEBUGGING(LEVELING)) DEBUG_POS("destination = current_position", destination); // when in the danger zone if (current_position.z > delta_clip_start_height) { - if (rz > delta_clip_start_height) { // staying in the danger zone - destination.set(rx, ry, rz); // move directly (uninterpolated) + if (rz > delta_clip_start_height) { // staying in the danger zone + destination.set(rx, ry, rz); // move directly (uninterpolated) prepare_internal_fast_move_to_destination(); // set current_position from destination if (DEBUGGING(LEVELING)) DEBUG_POS("danger zone move", current_position); return; @@ -432,10 +439,6 @@ void do_blocking_move_to(const float rx, const float ry, const float rz, const_f #elif IS_SCARA - if (!position_is_reachable(rx, ry)) return; - - destination = current_position; - // If Z needs to raise, do it before moving XY if (destination.z < rz) { destination.z = rz; From 0f7161785ee2324de7198d9abf142964ee8f190f Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 13 Apr 2021 03:28:13 +0200 Subject: [PATCH 1279/1370] Chamber Fan mode 3 (#21594) --- Marlin/Configuration_adv.h | 5 ++++- Marlin/src/module/temperature.cpp | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a2f357501b..fd598e59e4 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -163,7 +163,7 @@ //#define CHAMBER_FAN // Enable a fan on the chamber #if ENABLED(CHAMBER_FAN) - #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve. + #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve; 3=similar to 1 but fan is always on. #if CHAMBER_FAN_MODE == 0 #define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255) #elif CHAMBER_FAN_MODE == 1 @@ -172,6 +172,9 @@ #elif CHAMBER_FAN_MODE == 2 #define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255) #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target + #elif CHAMBER_FAN_MODE == 3 + #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255) + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target #endif #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index faa5bb5b10..f0bb81bce7 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1406,6 +1406,8 @@ void Temperature::manage_heater() { fan_chamber_pwm = (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * ABS(temp_chamber.celsius - temp_chamber.target); if (temp_chamber.soft_pwm_amount) fan_chamber_pwm += (CHAMBER_FAN_FACTOR) * 2; + #elif CHAMBER_FAN_MODE == 3 + fan_chamber_pwm = CHAMBER_FAN_BASE + _MAX((CHAMBER_FAN_FACTOR) * (temp_chamber.celsius - temp_chamber.target), 0); #endif NOMORE(fan_chamber_pwm, 225); set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan From ac5b39b3540f3751b37e0554c6cc584399bec5a7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 12 Apr 2021 20:58:34 -0500 Subject: [PATCH 1280/1370] Blocking move followup --- Marlin/src/module/motion.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 9c1f8cd4ad..6058db37b3 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -367,11 +367,8 @@ void _internal_move_to_destination(const_feedRate_t fr_mm_s/*=0.0f*/ planner.e_factor[active_extruder] = 1.0f; #endif - #if !IS_KINEMATIC - constexpr bool is_fast = false; - #endif - if (is_fast) - prepare_fast_move_to_destination(); + if (TERN0(IS_KINEMATIC, is_fast)) + TERN(IS_KINEMATIC, NOOP, prepare_line_to_destination()); else prepare_line_to_destination(); From 8384582116819dceaf596d47c179b15e9a557741 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 13 Apr 2021 14:02:21 +1200 Subject: [PATCH 1281/1370] Fix Max Temperature not enforced (#21592) --- Marlin/src/module/temperature.cpp | 6 ++-- Marlin/src/module/thermistor/thermistors.h | 36 ++++++++++++---------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index f0bb81bce7..306f5c5886 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2196,19 +2196,19 @@ void Temperature::init() { #if HAS_HOTEND #define _TEMP_MIN_E(NR) do{ \ - const celsius_t tmin = _MAX(HEATER_##NR##_MINTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 0, pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MINTEMP_IND].celsius))); \ + const celsius_t tmin = _MAX(HEATER_##NR##_MINTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 0, (int)pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MINTEMP_IND].celsius))); \ temp_range[NR].mintemp = tmin; \ while (analog_to_celsius_hotend(temp_range[NR].raw_min, NR) < tmin) \ temp_range[NR].raw_min += TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) #define _TEMP_MAX_E(NR) do{ \ - const celsius_t tmax = _MIN(HEATER_##NR##_MAXTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 2000, pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MAXTEMP_IND].celsius) - 1)); \ + const celsius_t tmax = _MIN(HEATER_##NR##_MAXTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 2000, (int)pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MAXTEMP_IND].celsius) - 1)); \ temp_range[NR].maxtemp = tmax; \ while (analog_to_celsius_hotend(temp_range[NR].raw_max, NR) > tmax) \ temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) - #define _MINMAX_TEST(N,M) (HOTENDS > N && TEMP_SENSOR_ ##N## THERMISTOR_ID && TEMP_SENSOR_ ##N## THERMISTOR_ID != 998 && TEMP_SENSOR_ ##N## THERMISTOR_ID != 999 && defined(HEATER_##N##_##M##TEMP)) + #define _MINMAX_TEST(N,M) (HOTENDS > N && TEMP_SENSOR_ ##N## _THERMISTOR_ID && TEMP_SENSOR_ ##N## _THERMISTOR_ID != 998 && TEMP_SENSOR_ ##N## _THERMISTOR_ID != 999 && defined(HEATER_##N##_##M##TEMP)) #if _MINMAX_TEST(0, MIN) _TEMP_MIN_E(0); diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 0871844e39..97d268c303 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -335,7 +335,8 @@ static_assert( // For thermistors the highest temperature results in the lowest ADC value // For thermocouples the highest temperature results in the highest ADC value -#define _TT_REV(N) REVERSE_TEMP_SENSOR_RANGE_##N +#define __TT_REV(N) REVERSE_TEMP_SENSOR_RANGE_##N +#define _TT_REV(N) __TT_REV(N) #define TT_REV(N) _TT_REV(TEMP_SENSOR_##N##_THERMISTOR_ID) #define _TT_REVRAW(N) !TEMP_SENSOR_##N##_IS_THERMISTOR #define TT_REVRAW(N) (TT_REV(N) || _TT_REVRAW(N)) @@ -343,72 +344,72 @@ static_assert( #ifdef TEMPTABLE_0 #if TT_REV(0) #define TEMP_SENSOR_0_MINTEMP_IND 0 - #define TEMPTABLE_0_MAXTEMP_IND HEATER_0_LEN - 1 + #define TEMP_SENSOR_0_MAXTEMP_IND TEMPTABLE_0_LEN - 1 #else - #define TEMPTABLE_0_MINTEMP_IND HEATER_0_LEN - 1 + #define TEMP_SENSOR_0_MINTEMP_IND TEMPTABLE_0_LEN - 1 #define TEMP_SENSOR_0_MAXTEMP_IND 0 #endif #endif #ifdef TEMPTABLE_1 #if TT_REV(1) #define TEMP_SENSOR_1_MINTEMP_IND 0 - #define TEMPTABLE_1_MAXTEMP_IND HEATER_1_LEN - 1 + #define TEMP_SENSOR_1_MAXTEMP_IND TEMPTABLE_1_LEN - 1 #else - #define TEMPTABLE_1_MINTEMP_IND HEATER_1_LEN - 1 + #define TEMP_SENSOR_1_MINTEMP_IND TEMPTABLE_1_LEN - 1 #define TEMP_SENSOR_1_MAXTEMP_IND 0 #endif #endif #ifdef TEMPTABLE_2 #if TT_REV(2) #define TEMP_SENSOR_2_MINTEMP_IND 0 - #define TEMPTABLE_2_MAXTEMP_IND HEATER_2_LEN - 1 + #define TEMP_SENSOR_2_MAXTEMP_IND TEMPTABLE_2_LEN - 1 #else - #define TEMPTABLE_2_MINTEMP_IND HEATER_2_LEN - 1 + #define TEMP_SENSOR_2_MINTEMP_IND TEMPTABLE_2_LEN - 1 #define TEMP_SENSOR_2_MAXTEMP_IND 0 #endif #endif #ifdef TEMPTABLE_3 #if TT_REV(3) #define TEMP_SENSOR_3_MINTEMP_IND 0 - #define TEMPTABLE_3_MAXTEMP_IND HEATER_3_LEN - 1 + #define TEMP_SENSOR_3_MAXTEMP_IND TEMPTABLE_3_LEN - 1 #else - #define TEMPTABLE_3_MINTEMP_IND HEATER_3_LEN - 1 + #define TEMP_SENSOR_3_MINTEMP_IND TEMPTABLE_3_LEN - 1 #define TEMP_SENSOR_3_MAXTEMP_IND 0 #endif #endif #ifdef TEMPTABLE_4 #if TT_REV(4) #define TEMP_SENSOR_4_MINTEMP_IND 0 - #define TEMPTABLE_4_MAXTEMP_IND HEATER_4_LEN - 1 + #define TEMP_SENSOR_4_MAXTEMP_IND TEMPTABLE_4_LEN - 1 #else - #define TEMPTABLE_4_MINTEMP_IND HEATER_4_LEN - 1 + #define TEMP_SENSOR_4_MINTEMP_IND TEMPTABLE_4_LEN - 1 #define TEMP_SENSOR_4_MAXTEMP_IND 0 #endif #endif #ifdef TEMPTABLE_5 #if TT_REV(5) #define TEMP_SENSOR_5_MINTEMP_IND 0 - #define TEMPTABLE_5_MAXTEMP_IND HEATER_5_LEN - 1 + #define TEMP_SENSOR_5_MAXTEMP_IND TEMPTABLE_5_LEN - 1 #else - #define TEMPTABLE_5_MINTEMP_IND HEATER_5_LEN - 1 + #define TEMP_SENSOR_5_MINTEMP_IND TEMPTABLE_5_LEN - 1 #define TEMP_SENSOR_5_MAXTEMP_IND 0 #endif #endif #ifdef TEMPTABLE_6 #if TT_REV(6) #define TEMP_SENSOR_6_MINTEMP_IND 0 - #define TEMPTABLE_6_MAXTEMP_IND HEATER_6_LEN - 1 + #define TEMP_SENSOR_6_MAXTEMP_IND TEMPTABLE_6_LEN - 1 #else - #define TEMPTABLE_6_MINTEMP_IND HEATER_6_LEN - 1 + #define TEMP_SENSOR_6_MINTEMP_IND TEMPTABLE_6_LEN - 1 #define TEMP_SENSOR_6_MAXTEMP_IND 0 #endif #endif #ifdef TEMPTABLE_7 #if TT_REV(7) #define TEMP_SENSOR_7_MINTEMP_IND 0 - #define TEMPTABLE_7_MAXTEMP_IND HEATER_7_LEN - 1 + #define TEMP_SENSOR_7_MAXTEMP_IND TEMPTABLE_7_LEN - 1 #else - #define TEMPTABLE_7_MINTEMP_IND HEATER_7_LEN - 1 + #define TEMP_SENSOR_7_MINTEMP_IND TEMPTABLE_7_LEN - 1 #define TEMP_SENSOR_7_MAXTEMP_IND 0 #endif #endif @@ -522,6 +523,7 @@ static_assert( #endif #endif +#undef __TT_REV #undef _TT_REV #undef TT_REV #undef _TT_REVRAW From c96340980a5439f4db1cc86b1290acf6f975bd5e Mon Sep 17 00:00:00 2001 From: pinchies Date: Tue, 13 Apr 2021 12:14:34 +1000 Subject: [PATCH 1282/1370] Fix Flash size (512KB) for STM32F103ZE (#21590) --- Marlin/src/HAL/STM32F1/HAL.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 4f430ab4d9..94b0ad7ead 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -53,7 +53,7 @@ // ------------------------ #ifndef STM32_FLASH_SIZE - #if EITHER(MCU_STM32F103RE, MCU_STM32F103VE) + #if ANY(MCU_STM32F103RE, MCU_STM32F103VE, MCU_STM32F103ZE) #define STM32_FLASH_SIZE 512 #else #define STM32_FLASH_SIZE 256 From 52f928700ac58902b99b234bfbea0ea61bfa54a3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 12 Apr 2021 23:40:32 -0500 Subject: [PATCH 1283/1370] Remove extraneous MKS UI sprintf --- .../lib/mks_ui/draw_acceleration_settings.cpp | 7 +- .../draw_auto_level_offset_settings.cpp | 7 +- .../extui/lib/mks_ui/draw_jerk_settings.cpp | 9 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 +- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 11 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 129 +++++++++--------- .../extui/lib/mks_ui/draw_pause_position.cpp | 7 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 3 +- .../extui/lib/mks_ui/draw_step_settings.cpp | 11 +- .../lib/mks_ui/draw_tmc_current_settings.cpp | 11 +- .../lib/mks_ui/draw_tramming_pos_settings.cpp | 20 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 20 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 4 +- 14 files changed, 116 insertions(+), 127 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index 4bc01c9e2d..7bc5a263b4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -109,15 +109,14 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_acceleration_settings() { scr = lv_screen_create(ACCELERATION_UI, machine_menu.AccelerationConfTitle); - char str_1[16]; if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.acceleration, 1, 1, str_1)); + dtostrf(planner.settings.acceleration, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.PrintAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ACCE_PRINT, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.retract_acceleration, 1, 1, str_1)); + dtostrf(planner.settings.retract_acceleration, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.RetractAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_ACCE_RETRA, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.travel_acceleration, 1, 1, str_1)); + dtostrf(planner.settings.travel_acceleration, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.TravelAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_ACCE_TRAVEL, 2, public_buf_l); sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp index f1cdbfe414..3de078f375 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -65,16 +65,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_auto_level_offset_settings() { - char str_1[16]; scr = lv_screen_create(NOZZLE_PROBE_OFFSET_UI, machine_menu.OffsetConfTitle); - sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.x, 1, 1, str_1) , 0)); + dtostrf(TERN0(HAS_PROBE_XY_OFFSET, probe.offset.x), 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Xoffset, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_OFFSET_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.y, 1, 1, str_1) , 0)); + dtostrf(TERN0(HAS_PROBE_XY_OFFSET, probe.offset.y), 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Yoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_OFFSET_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), TERN(HAS_PROBE_XY_OFFSET, dtostrf(probe.offset.z, 1, 1, str_1) , 0)); + dtostrf(TERN0(HAS_PROBE_XY_OFFSET, probe.offset.z), 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Zoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_OFFSET_Z, 2, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_OFFSET_RETURN, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp index c911b09128..4067262f20 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -71,19 +71,18 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_jerk_settings() { - char str_1[16]; scr = lv_screen_create(JERK_UI, machine_menu.JerkConfTitle); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[X_AXIS], 1, 1, str_1)); + dtostrf(planner.max_jerk[X_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.X_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_JERK_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[Y_AXIS], 1, 1, str_1)); + dtostrf(planner.max_jerk[Y_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_JERK_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[Z_AXIS], 1, 1, str_1)); + dtostrf(planner.max_jerk[Z_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_JERK_Z, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.max_jerk[E_AXIS], 1, 1, str_1)); + dtostrf(planner.max_jerk[E_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E_Jerk, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_JERK_E, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_JERK_RETURN, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 9734dd94ae..e296a73590 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { queue.inject_P(G28_STR); } const int ind = obj->mks_obj_id - ID_M_POINT1; - sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), (int)gCfgItems.trammingPos[ind][X_AXIS], (int)gCfgItems.trammingPos[ind][Y_AXIS]); + sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), gCfgItems.trammingPos[ind].x, gCfgItems.trammingPos[ind].y); queue.inject(public_buf_l); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp index cf74f42ee7..238a9af6ae 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -80,26 +80,25 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_max_feedrate_settings() { - char str_1[16]; scr = lv_screen_create(MAXFEEDRATE_UI, machine_menu.MaxFeedRateConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.XMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.YMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FEED_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.ZMaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_FEED_Z, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E0MaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_FEED_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FEED_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E1MaxFeedRate, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FEED_E1, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FEED_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 092dcce083..70e1bba990 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -73,214 +73,211 @@ enum { static void disp_key_value() { char *temp; - char str_1[16]; - #if HAS_TRINAMIC_CONFIG - float milliamps; - #endif + TERN_(HAS_TRINAMIC_CONFIG, float milliamps); switch (value) { case PrintAcceleration: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.acceleration, 1, 1, str_1)); + dtostrf(planner.settings.acceleration, 1, 1, public_buf_m); break; case RetractAcceleration: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.retract_acceleration, 1, 1, str_1)); + dtostrf(planner.settings.retract_acceleration, 1, 1, public_buf_m); break; case TravelAcceleration: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.travel_acceleration, 1, 1, str_1)); + dtostrf(planner.settings.travel_acceleration, 1, 1, public_buf_m); break; case XAcceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + itoa(planner.settings.max_acceleration_mm_per_s2[X_AXIS], public_buf_m, 10); break; case YAcceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + itoa(planner.settings.max_acceleration_mm_per_s2[Y_AXIS], public_buf_m, 10); break; case ZAcceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + itoa(planner.settings.max_acceleration_mm_per_s2[Z_AXIS], public_buf_m, 10); break; case E0Acceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + itoa(planner.settings.max_acceleration_mm_per_s2[E_AXIS], public_buf_m, 10); break; case E1Acceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); + itoa(planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], public_buf_m, 10); break; case XMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_m); break; case YMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_m); break; case ZMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_m); break; case E0MaxFeedRate: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, public_buf_m); break; case E1MaxFeedRate: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, str_1)); + dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, public_buf_m); break; case XJerk: #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[X_AXIS], 1, 1, str_1)); + dtostrf(planner.max_jerk[X_AXIS], 1, 1, public_buf_m); #endif break; case YJerk: #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[Y_AXIS], 1, 1, str_1)); + dtostrf(planner.max_jerk[Y_AXIS], 1, 1, public_buf_m); #endif break; case ZJerk: #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[Z_AXIS], 1, 1, str_1)); + dtostrf(planner.max_jerk[Z_AXIS], 1, 1, public_buf_m); #endif break; case EJerk: #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[E_AXIS], 1, 1, str_1)); + dtostrf(planner.max_jerk[E_AXIS], 1, 1, public_buf_m); #endif break; case Xstep: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_m); break; case Ystep: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_m); break; case Zstep: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_m); break; case E0step: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, public_buf_m); break; case E1step: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, public_buf_m); break; case Xcurrent: #if AXIS_IS_TMC(X) milliamps = stepperX.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_m); #endif break; case Ycurrent: #if AXIS_IS_TMC(Y) milliamps = stepperY.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_m); #endif break; case Zcurrent: #if AXIS_IS_TMC(Z) milliamps = stepperZ.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_m); #endif break; case E0current: #if AXIS_IS_TMC(E0) milliamps = stepperE0.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_m); #endif break; case E1current: #if AXIS_IS_TMC(E1) milliamps = stepperE1.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_m); #endif break; case pause_pos_x: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosX, 1, 1, str_1)); + dtostrf(gCfgItems.pausePosX, 1, 1, public_buf_m); break; case pause_pos_y: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosY, 1, 1, str_1)); + dtostrf(gCfgItems.pausePosY, 1, 1, public_buf_m); break; case pause_pos_z: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1)); + dtostrf(gCfgItems.pausePosZ, 1, 1, public_buf_m); break; case level_pos_x1: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[0][X_AXIS]); + itoa(gCfgItems.trammingPos[0].x, public_buf_m, 10); break; case level_pos_y1: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[0][Y_AXIS]); + itoa(gCfgItems.trammingPos[0].y, public_buf_m, 10); break; case level_pos_x2: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[1][X_AXIS]); + itoa(gCfgItems.trammingPos[1].x, public_buf_m, 10); break; case level_pos_y2: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[1][Y_AXIS]); + itoa(gCfgItems.trammingPos[1].y, public_buf_m, 10); break; case level_pos_x3: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[2][X_AXIS]); + itoa(gCfgItems.trammingPos[2].x, public_buf_m, 10); break; case level_pos_y3: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[2][Y_AXIS]); + itoa(gCfgItems.trammingPos[2].y, public_buf_m, 10); break; case level_pos_x4: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[3][X_AXIS]); + itoa(gCfgItems.trammingPos[3].x, public_buf_m, 10); break; case level_pos_y4: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[3][Y_AXIS]); + itoa(gCfgItems.trammingPos[3].y, public_buf_m, 10); break; case level_pos_x5: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[4][X_AXIS]); + itoa(gCfgItems.trammingPos[4].x, public_buf_m, 10); break; case level_pos_y5: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[4][Y_AXIS]); + itoa(gCfgItems.trammingPos[4].y, public_buf_m, 10); break; #if HAS_BED_PROBE case x_offset: #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.x, 1, 3, str_1)); + dtostrf(probe.offset.x, 1, 3, public_buf_m); #endif break; case y_offset: #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.y, 1, 3, str_1)); + dtostrf(probe.offset.y, 1, 3, public_buf_m); #endif break; case z_offset: - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.z, 1, 3, str_1)); + dtostrf(probe.offset.z, 1, 3, public_buf_m); break; #endif case load_length: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_length); + itoa(gCfgItems.filamentchange_load_length, public_buf_m, 10); break; case load_speed: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_speed); + itoa(gCfgItems.filamentchange_load_speed, public_buf_m, 10); break; case unload_length: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_length); + itoa(gCfgItems.filamentchange_unload_length, public_buf_m, 10); break; case unload_speed: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_speed); + itoa(gCfgItems.filamentchange_unload_speed, public_buf_m, 10); break; case filament_temp: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temp); + itoa(gCfgItems.filament_limit_temp, public_buf_m, 10); break; case x_sensitivity: #if X_SENSORLESS - sprintf_P(public_buf_m, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); + itoa(TERN(X_SENSORLESS, stepperX.homing_threshold(), 0), public_buf_m, 10); #endif break; case y_sensitivity: #if Y_SENSORLESS - sprintf_P(public_buf_m, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); + itoa(TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0), public_buf_m, 10); #endif break; case z_sensitivity: #if Z_SENSORLESS - sprintf_P(public_buf_m, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); + itoa(TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0), public_buf_m, 10); #endif break; case z2_sensitivity: #if Z2_SENSORLESS - sprintf_P(public_buf_m, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); + itoa(TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0), public_buf_m, 10); #endif break; } @@ -346,16 +343,16 @@ static void set_value_confirm() { case pause_pos_x: gCfgItems.pausePosX = atof(key_value); update_spi_flash(); break; case pause_pos_y: gCfgItems.pausePosY = atof(key_value); update_spi_flash(); break; case pause_pos_z: gCfgItems.pausePosZ = atof(key_value); update_spi_flash(); break; - case level_pos_x1: gCfgItems.trammingPos[0][X_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_y1: gCfgItems.trammingPos[0][Y_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_x2: gCfgItems.trammingPos[1][X_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_y2: gCfgItems.trammingPos[1][Y_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_x3: gCfgItems.trammingPos[2][X_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_y3: gCfgItems.trammingPos[2][Y_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_x4: gCfgItems.trammingPos[3][X_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_y4: gCfgItems.trammingPos[3][Y_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_x5: gCfgItems.trammingPos[4][X_AXIS] = atoi(key_value); update_spi_flash(); break; - case level_pos_y5: gCfgItems.trammingPos[4][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x1: gCfgItems.trammingPos[0].x = atoi(key_value); update_spi_flash(); break; + case level_pos_y1: gCfgItems.trammingPos[0].y = atoi(key_value); update_spi_flash(); break; + case level_pos_x2: gCfgItems.trammingPos[1].x = atoi(key_value); update_spi_flash(); break; + case level_pos_y2: gCfgItems.trammingPos[1].y = atoi(key_value); update_spi_flash(); break; + case level_pos_x3: gCfgItems.trammingPos[2].x = atoi(key_value); update_spi_flash(); break; + case level_pos_y3: gCfgItems.trammingPos[2].y = atoi(key_value); update_spi_flash(); break; + case level_pos_x4: gCfgItems.trammingPos[3].x = atoi(key_value); update_spi_flash(); break; + case level_pos_y4: gCfgItems.trammingPos[3].y = atoi(key_value); update_spi_flash(); break; + case level_pos_x5: gCfgItems.trammingPos[4].x = atoi(key_value); update_spi_flash(); break; + case level_pos_y5: gCfgItems.trammingPos[4].y = atoi(key_value); update_spi_flash(); break; #if HAS_BED_PROBE case x_offset: { #if HAS_PROBE_XY_OFFSET diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp index 385276af39..2f60bc6685 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -60,16 +60,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_pause_position() { - char str_1[16]; scr = lv_screen_create(PAUSE_POS_UI, machine_menu.PausePosText); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosX, 1, 1, str_1)); + dtostrf(gCfgItems.pausePosX, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.xPos, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosY, 1, 1, str_1)); + dtostrf(gCfgItems.pausePosY, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.yPos, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_PAUSE_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1)); + dtostrf(gCfgItems.pausePosZ, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.zPos, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_PAUSE_Z, 2, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y, event_handler, ID_PAUSE_RETURN, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index a1818e6ddd..606ef31917 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -251,8 +251,7 @@ void disp_print_time() { } void disp_fan_Zpos() { - char str_1[16]; - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(current_position.z, 1, 3, str_1)); + dtostrf(current_position.z, 1, 3, public_buf_l); lv_label_set_text(labelZpos, public_buf_l); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp index a88669f371..f48d533691 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -79,26 +79,25 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } void lv_draw_step_settings() { - char str_1[16]; scr = lv_screen_create(STEPS_UI, machine_menu.StepsConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.X_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_STEP_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_STEP_Z, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E0_Steps, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_STEP_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_STEP_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, str_1)); + dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E1_Steps, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_STEP_E1, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_STEP_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp index 7f889461ea..7c0fc97c93 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -95,14 +95,13 @@ void lv_draw_tmc_current_settings() { scr = lv_screen_create(TMC_CURRENT_UI, machine_menu.TmcCurrentConfTitle); float milliamps; - char str_1[16]; if (!uiCfg.para_ui_page) { #if AXIS_IS_TMC(X) milliamps = stepperX.getMilliamps(); #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.X_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_X, 0, public_buf_l); #if AXIS_IS_TMC(Y) @@ -110,7 +109,7 @@ void lv_draw_tmc_current_settings() { #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_CURRENT_Y, 1, public_buf_l); #if AXIS_IS_TMC(Z) @@ -118,7 +117,7 @@ void lv_draw_tmc_current_settings() { #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_CURRENT_Z, 2, public_buf_l); #if AXIS_IS_TMC(E0) @@ -126,7 +125,7 @@ void lv_draw_tmc_current_settings() { #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E0_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_TMC_CURRENT_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_DOWN, true); @@ -137,7 +136,7 @@ void lv_draw_tmc_current_settings() { #else milliamps = -1; #endif - sprintf_P(public_buf_l, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1)); + dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E1_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_E1, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp index d5307232d6..9b6c11d335 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp @@ -107,27 +107,27 @@ void lv_draw_tramming_pos_settings() { scr = lv_screen_create(MANUAL_LEVELING_POSIGION_UI, machine_menu.LevelingParaConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[0][X_AXIS]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[0][Y_AXIS]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[0].x); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[0].y); lv_screen_menu_item_2_edit(scr, leveling_menu.position1, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y1, 0, buf2, ID_MANUAL_POS_X1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[1][X_AXIS]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[1][Y_AXIS]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[1].x); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[1].y); lv_screen_menu_item_2_edit(scr, leveling_menu.position2, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MANUAL_POS_Y2, 1, buf2, ID_MANUAL_POS_X2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[2][X_AXIS]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[2][Y_AXIS]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[2].x); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[2].y); lv_screen_menu_item_2_edit(scr, leveling_menu.position3, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_MANUAL_POS_Y3, 2, buf2, ID_MANUAL_POS_X3, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[3][X_AXIS]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[3][Y_AXIS]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[3].x); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[3].y); lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_MANUAL_POS_Y4, 3, buf2, ID_MANUAL_POS_X4, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[4][X_AXIS]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[4][Y_AXIS]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[4].x); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[4].y); lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y5, 0, buf2, ID_MANUAL_POS_X5, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 68baea30c7..51e187435c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -125,16 +125,16 @@ void gCfgItems_init() { gCfgItems.pausePosX = -1; gCfgItems.pausePosY = -1; gCfgItems.pausePosZ = 5; - gCfgItems.trammingPos[0][X_AXIS] = X_MIN_POS + 30; - gCfgItems.trammingPos[0][Y_AXIS] = Y_MIN_POS + 30; - gCfgItems.trammingPos[1][X_AXIS] = X_MAX_POS - 30; - gCfgItems.trammingPos[1][Y_AXIS] = Y_MIN_POS + 30; - gCfgItems.trammingPos[2][X_AXIS] = X_MAX_POS - 30; - gCfgItems.trammingPos[2][Y_AXIS] = Y_MAX_POS - 30; - gCfgItems.trammingPos[3][X_AXIS] = X_MIN_POS + 30; - gCfgItems.trammingPos[3][Y_AXIS] = Y_MAX_POS - 30; - gCfgItems.trammingPos[4][X_AXIS] = X_BED_SIZE / 2; - gCfgItems.trammingPos[4][Y_AXIS] = Y_BED_SIZE / 2; + gCfgItems.trammingPos[0].x = X_MIN_POS + 30; + gCfgItems.trammingPos[0].y = Y_MIN_POS + 30; + gCfgItems.trammingPos[1].x = X_MAX_POS - 30; + gCfgItems.trammingPos[1].y = Y_MIN_POS + 30; + gCfgItems.trammingPos[2].x = X_MAX_POS - 30; + gCfgItems.trammingPos[2].y = Y_MAX_POS - 30; + gCfgItems.trammingPos[3].x = X_MIN_POS + 30; + gCfgItems.trammingPos[3].y = Y_MAX_POS - 30; + gCfgItems.trammingPos[4].x = X_BED_SIZE / 2; + gCfgItems.trammingPos[4].y = Y_BED_SIZE / 2; gCfgItems.cloud_enable = false; gCfgItems.wifi_mode_sel = STA_MODEL; gCfgItems.fileSysType = FILE_SYS_SD; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 2be4f7d70b..6577d80cdf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -197,7 +197,7 @@ typedef struct { uint8_t wifi_type; bool cloud_enable, encoder_enable; - int trammingPos[5][2]; // XY + xy_int_t trammingPos[5]; int filamentchange_load_length, filamentchange_load_speed, filamentchange_unload_length, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 1057a0c689..957e245882 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -883,7 +883,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { SEND_OK_TO_WIFI; char *outBuf = (char *)tempBuf; - char str_1[16], tbuf[34]; + char tbuf[34]; sprintf_P(tbuf, PSTR("%d /%d"), (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); @@ -1313,7 +1313,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); return; } - sprintf_P((char *)saveFilePath, PSTR("%s"), dosName); + strcpy(saveFilePath, dosName); card.cdroot(); upload_file.close(); From 21518fbd4e9c077da21059b795f6537f79d5b14e Mon Sep 17 00:00:00 2001 From: Veisen Date: Tue, 13 Apr 2021 10:09:21 +0200 Subject: [PATCH 1284/1370] Fix ANYCUBIC_LCD_I3MEGA compile (#21585) --- .../src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index aa08f683f7..ecc516108c 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -583,8 +583,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } break; case 4: { // A4 GET FAN SPEED - const float fanPercent = getActualFan_percent(FAN0); - SEND_PGM_VAL("A4V ", int(LIMIT(fanPercent, 0, 100))); + SEND_PGM_VAL("A4V ", int(getActualFan_percent(FAN0))); } break; case 5: { // A5 GET CURRENT COORDINATE From ed477abbd5fb8d2a6a3dcf5b3ec4e5b68b2f4555 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 13 Apr 2021 03:49:20 -0500 Subject: [PATCH 1285/1370] More MKS UI sprintf --- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 957e245882..51c492703e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -478,7 +478,7 @@ char wait_ip_back_flag = 0; typedef struct { int write_index; - uint8_t saveFileName[30]; + char saveFileName[30]; uint8_t fileTransfer; uint32_t fileLen; uint32_t tick_begin; @@ -593,7 +593,7 @@ uint8_t Explore_Disk(char *path , uint8_t recu_level) { } static void wifi_gcode_exec(uint8_t *cmd_line) { - int8_t tempBuf[100] = { 0 }; + char tempBuf[100] = { 0 }; uint8_t *tmpStr = 0; int cmd_value; volatile int print_rate; @@ -631,7 +631,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { while (tmpStr[index] == ' ') index++; if (gCfgItems.wifi_type == ESP_WIFI) { - char *path = (char *)tempBuf; + char *path = tempBuf; if (strlen((char *)&tmpStr[index]) < 80) { send_to_wifi((uint8_t *)"Begin file list\r\n", strlen("Begin file list\r\n")); @@ -828,8 +828,8 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)|| (uiCfg.print_state == REPRINTING)) { print_rate = uiCfg.totalSend; ZERO(tempBuf); - sprintf_P((char *)tempBuf, PSTR("M27 %d\r\n"), print_rate); - send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); + sprintf_P(tempBuf, PSTR("M27 %d\r\n"), print_rate); + send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); } break; @@ -841,15 +841,15 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { while (tmpStr[index] == ' ') index++; if (strstr_P((char *)&tmpStr[index], PSTR(".g")) || strstr_P((char *)&tmpStr[index], PSTR(".G"))) { - strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); + strcpy(file_writer.saveFileName, (char *)&tmpStr[index]); if (gCfgItems.fileSysType == FILE_SYS_SD) { ZERO(tempBuf); - sprintf_P((char *)tempBuf, PSTR("%s"), file_writer.saveFileName); + sprintf_P(tempBuf, PSTR("%s"), file_writer.saveFileName); } else if (gCfgItems.fileSysType == FILE_SYS_USB) { ZERO(tempBuf); - sprintf_P((char *)tempBuf, PSTR("%s"), (char *)file_writer.saveFileName); + sprintf_P(tempBuf, PSTR("%s"), file_writer.saveFileName); } mount_file_sys(gCfgItems.fileSysType); @@ -858,11 +858,11 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { card.openFileWrite(cur_name); if (card.isFileOpen()) { ZERO(file_writer.saveFileName); - strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); + strcpy(file_writer.saveFileName, (char *)&tmpStr[index]); ZERO(tempBuf); - sprintf_P((char *)tempBuf, PSTR("Writing to file: %s\r\n"), (char *)file_writer.saveFileName); + sprintf_P(tempBuf, PSTR("Writing to file: %s\r\n"), file_writer.saveFileName); wifi_ret_ack(); - send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); wifi_link_state = WIFI_WAIT_TRANS_START; } else { @@ -882,7 +882,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { SEND_OK_TO_WIFI; - char *outBuf = (char *)tempBuf; + char *outBuf = tempBuf; char tbuf[34]; sprintf_P(tbuf, PSTR("%d /%d"), (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); @@ -917,7 +917,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcat_P(outBuf, PSTR(" @:0 B@:0\r\n")); } else { - sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), + sprintf_P(tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), thermalManager.degHotend(0), thermalManager.degTargetHotend(0), #if HAS_HEATED_BED thermalManager.degBed(), thermalManager.degTargetBed(), @@ -933,16 +933,16 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ); } - send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); queue.enqueue_one_P(PSTR("M105")); break; case 992: if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { ZERO(tempBuf); - sprintf_P((char *)tempBuf, PSTR("M992 %d%d:%d%d:%d%d\r\n"), print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); + sprintf_P(tempBuf, PSTR("M992 %d%d:%d%d:%d%d\r\n"), print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); wifi_ret_ack(); - send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); } break; @@ -950,9 +950,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { ZERO(tempBuf); if (strlen((char *)list_file.file_name[sel_id]) > (100 - 1)) return; - sprintf_P((char *)tempBuf, PSTR("M994 %s;%d\n"), list_file.file_name[sel_id], (int)gCfgItems.curFilesize); + sprintf_P(tempBuf, PSTR("M994 %s;%d\n"), list_file.file_name[sel_id], (int)gCfgItems.curFilesize); wifi_ret_ack(); - send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); } break; @@ -1279,7 +1279,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { ZERO(public_buf); - if (strlen((const char *)file_writer.saveFileName) > sizeof(saveFilePath)) + if (strlen(file_writer.saveFileName) > sizeof(saveFilePath)) return; ZERO(saveFilePath); @@ -1303,9 +1303,9 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { #if ENABLED(SDSUPPORT) - uint8_t dosName[FILENAME_LENGTH]; + char dosName[FILENAME_LENGTH]; - if (!longName2DosName((const char *)file_writer.saveFileName,dosName)) { + if (!longName2DosName(file_writer.saveFileName, dosName)) { clear_cur_ui(); upload_result = 2; wifiTransError.flag = 1; From 562f3e43bc3522583b524baeeaaf6088f4aa3d71 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 13 Apr 2021 04:00:39 -0500 Subject: [PATCH 1286/1370] Add fan percent accessors --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 7 +++---- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 2 +- .../lcd/dogm/status_screen_lite_ST7920.cpp | 6 ++---- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 4 ++-- Marlin/src/module/temperature.cpp | 20 +++++++++---------- Marlin/src/module/temperature.h | 20 ++++++++++--------- 9 files changed, 32 insertions(+), 33 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 874fcc143d..57af2b782a 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -944,7 +944,7 @@ void MarlinUI::draw_status_screen() { #if ENABLED(ADAPTIVE_FAN_SLOWING) else { c = '*'; spd = thermalManager.scaledFanSpeed(0, spd); } #endif - per = thermalManager.fanPercent(spd); + per = thermalManager.pwmToPercent(spd); } else #endif diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index faac398a4a..5b48cb1ac8 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -750,7 +750,7 @@ void MarlinUI::draw_status_screen() { #if HOTENDS > 2 _draw_heater_status(H_E2, "HE3", blink); // Hotend 3 Temperature #endif - #endif // HOTENDS <= 1 + #endif #if HAS_HEATED_BED #if HAS_LEVELING @@ -758,16 +758,15 @@ void MarlinUI::draw_status_screen() { #else _draw_heater_status(H_BED, "BED", blink); #endif - #endif // HAS_HEATED_BED + #endif #if HAS_FAN uint16_t spd = thermalManager.fan_speed[0]; - #if ENABLED(ADAPTIVE_FAN_SLOWING) if (!blink) spd = thermalManager.scaledFanSpeed(0, spd); #endif + uint16_t per = thermalManager.pwmToPercent(spd); - uint16_t per = thermalManager.fanPercent(spd); #if HOTENDS < 2 #define FANX 11 #else diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 793bcd752f..7e638a645e 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -696,7 +696,7 @@ void MarlinUI::draw_status_screen() { c = '*'; } #endif - lcd_put_u8str(STATUS_FAN_TEXT_X, STATUS_FAN_TEXT_Y, i16tostr3rj(thermalManager.fanPercent(spd))); + lcd_put_u8str(STATUS_FAN_TEXT_X, STATUS_FAN_TEXT_Y, i16tostr3rj(thermalManager.pwmToPercent(spd))); lcd_put_wchar(c); } } diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index a2dfb74a57..b67688cb57 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -733,14 +733,12 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { TERN_(HAS_MULTI_HOTEND, draw_extruder_2_temp(extruder_2_temp, extruder_2_target, forceUpdate)); TERN_(HAS_HEATED_BED, draw_bed_temp(bed_temp, bed_target, forceUpdate)); - uint16_t spd = thermalManager.fan_speed[0]; - + uint8_t spd = thermalManager.fan_speed[0]; #if ENABLED(ADAPTIVE_FAN_SLOWING) if (!blink && thermalManager.fan_speed_scaler[0] < 128) spd = thermalManager.scaledFanSpeed(0, spd); #endif - - draw_fan_speed(thermalManager.fanPercent(spd)); + draw_fan_speed(thermalManager.pwmToPercent(spd)); // Draw elapsed/remaining time const bool show_remaining = ENABLED(SHOW_REMAINING_TIME) && (DISABLED(ROTATE_PROGRESS_DISPLAY) || blink); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 606ef31917..e9cfd8179a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -236,7 +236,7 @@ void disp_bed_temp() { } void disp_fan_speed() { - sprintf_P(public_buf_l, PSTR("%d%%"), thermalManager.fanPercent(thermalManager.fan_speed[0])); + sprintf_P(public_buf_l, PSTR("%d%%"), thermalManager.fanSpeedPercent(0)); lv_label_set_text(labelFan, public_buf_l); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index a4515734a0..d02e774b94 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -241,7 +241,7 @@ void lv_draw_ready_print() { lv_obj_align(labelBedTarget, buttonBedstate, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); #endif - sprintf_P(buf, PSTR("%d%%"), thermalManager.fanPercent(thermalManager.fan_speed[0])); + sprintf_P(buf, PSTR("%d%%"), (int)thermalManager.fanSpeedPercent(0)); lv_label_set_text(labelFan, buf); lv_obj_align(labelFan, buttonFanstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); } diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 17e869d44f..c03a10fcd3 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -297,7 +297,7 @@ namespace ExtUI { float getTargetFan_percent(const fan_t fan) { #if HAS_FAN - return thermalManager.fanPercent(thermalManager.fan_speed[fan - FAN0]); + return thermalManager.fanSpeedPercent(fan - FAN0); #else UNUSED(fan); return 0; @@ -306,7 +306,7 @@ namespace ExtUI { float getActualFan_percent(const fan_t fan) { #if HAS_FAN - return thermalManager.fanPercent(thermalManager.scaledFanSpeed(fan - FAN0)); + return thermalManager.scaledFanSpeedPercent(fan - FAN0); #else UNUSED(fan); return 0; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 306f5c5886..08583676da 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -315,34 +315,34 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, /** * Set the print fan speed for a target extruder */ - void Temperature::set_fan_speed(uint8_t target, uint16_t speed) { + void Temperature::set_fan_speed(uint8_t fan, uint16_t speed) { NOMORE(speed, 255U); #if ENABLED(SINGLENOZZLE_STANDBY_FAN) - if (target != active_extruder) { - if (target < EXTRUDERS) singlenozzle_fan_speed[target] = speed; + if (fan != active_extruder) { + if (fan < EXTRUDERS) singlenozzle_fan_speed[fan] = speed; return; } #endif - TERN_(SINGLENOZZLE, target = 0); // Always use fan index 0 with SINGLENOZZLE + TERN_(SINGLENOZZLE, fan = 0); // Always use fan index 0 with SINGLENOZZLE - if (target >= FAN_COUNT) return; + if (fan >= FAN_COUNT) return; - fan_speed[target] = speed; + fan_speed[fan] = speed; - TERN_(REPORT_FAN_CHANGE, report_fan_speed(target)); + TERN_(REPORT_FAN_CHANGE, report_fan_speed(fan)); } #if ENABLED(REPORT_FAN_CHANGE) /** * Report print fan speed for a target extruder */ - void Temperature::report_fan_speed(const uint8_t target) { - if (target >= FAN_COUNT) return; + void Temperature::report_fan_speed(const uint8_t fan) { + if (fan >= FAN_COUNT) return; PORT_REDIRECT(SerialMask::All); - SERIAL_ECHOLNPAIR("M106 P", target, " S", fan_speed[target]); + SERIAL_ECHOLNPAIR("M106 P", fan, " S", fan_speed[fan]); } #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 9633c9733c..bcb451064e 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -553,10 +553,10 @@ class Temperature { static uint8_t fan_speed[FAN_COUNT]; #define FANS_LOOP(I) LOOP_L_N(I, FAN_COUNT) - static void set_fan_speed(const uint8_t target, const uint16_t speed); + static void set_fan_speed(const uint8_t fan, const uint16_t speed); #if ENABLED(REPORT_FAN_CHANGE) - static void report_fan_speed(const uint8_t target); + static void report_fan_speed(const uint8_t fan); #endif #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) @@ -564,21 +564,23 @@ class Temperature { static uint8_t saved_fan_speed[FAN_COUNT]; #endif - static constexpr inline uint8_t fanPercent(const uint8_t speed) { return ui8_to_percent(speed); } - #if ENABLED(ADAPTIVE_FAN_SLOWING) static uint8_t fan_speed_scaler[FAN_COUNT]; #endif - static inline uint8_t scaledFanSpeed(const uint8_t target, const uint8_t fs) { - UNUSED(target); // Potentially unused! - return (fs * uint16_t(TERN(ADAPTIVE_FAN_SLOWING, fan_speed_scaler[target], 128))) >> 7; + static inline uint8_t scaledFanSpeed(const uint8_t fan, const uint8_t fs) { + UNUSED(fan); // Potentially unused! + return (fs * uint16_t(TERN(ADAPTIVE_FAN_SLOWING, fan_speed_scaler[fan], 128))) >> 7; } - static inline uint8_t scaledFanSpeed(const uint8_t target) { - return scaledFanSpeed(target, fan_speed[target]); + static inline uint8_t scaledFanSpeed(const uint8_t fan) { + return scaledFanSpeed(fan, fan_speed[fan]); } + static constexpr inline uint8_t pwmToPercent(const uint8_t speed) { return ui8_to_percent(speed); } + static inline uint8_t fanSpeedPercent(const uint8_t fan) { return ui8_to_percent(fan_speed[fan]); } + static inline uint8_t scaledFanSpeedPercent(const uint8_t fan) { return ui8_to_percent(scaledFanSpeed(fan)); } + #if ENABLED(EXTRA_FAN_SPEED) typedef struct { uint8_t saved, speed; } extra_fan_t; static extra_fan_t extra_fan_speed[FAN_COUNT]; From 896123513e44952109524d60f4cf806d600bef50 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 13 Apr 2021 15:07:25 -0500 Subject: [PATCH 1287/1370] Followup to sprintf cleanup --- .../lcd/extui/lib/mks_ui/draw_cloud_bind.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 54 +++++++++---------- Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h | 14 ++--- .../variants/megaextendedpins/pins_arduino.h | 4 +- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp index ae8fe3a321..c6752939dd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp @@ -190,7 +190,7 @@ void display_qrcode(uint8_t *qrcode_data) { } void cloud_unbind() { - package_to_wifi(WIFI_CLOUD_UNBIND, (uint8_t *)0, 0); + package_to_wifi(WIFI_CLOUD_UNBIND, nullptr, 0); unbinding_flag = 1; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 1f84ca6f59..a05c558beb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -137,7 +137,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { gCfgItems.wifi_mode_sel = STA_MODEL; - package_to_wifi(WIFI_PARA_SET, (uint8_t *)0, 0); + package_to_wifi(WIFI_PARA_SET, nullptr, 0); public_buf_l[0] = 0xA5; public_buf_l[1] = 0x09; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index e296a73590..f25c7c0c25 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { queue.inject_P(G28_STR); } const int ind = obj->mks_obj_id - ID_M_POINT1; - sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), gCfgItems.trammingPos[ind].x, gCfgItems.trammingPos[ind].y); + sprintf_P(public_buf_l, PSTR("G1Z10\nG1X%dY%d\nG1Z0"), gCfgItems.trammingPos[ind].x, gCfgItems.trammingPos[ind].y); queue.inject(public_buf_l); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 51c492703e..6c2afeafd3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -178,14 +178,14 @@ void changeFlashMode(const bool dmaMode) { } } -static bool longName2DosName(const char *longName, uint8_t *dosName) { +static bool longName2DosName(const char *longName, char *dosName) { uint8_t i; for (i = FILENAME_LENGTH; i--;) dosName[i] = '\0'; while (*longName) { uint8_t c = *longName++; if (c == '.') { // For a dot... if (i == 0) return false; - strcat_P((char *)dosName, PSTR(".GCO")); + strcat_P(dosName, PSTR(".GCO")); break; } else { @@ -196,7 +196,7 @@ static bool longName2DosName(const char *longName, uint8_t *dosName) { dosName[i++] = c + (WITHIN(c, 'a', 'z') ? 'A' - 'a' : 0); // Uppercase required for 8.3 name } if (i >= 5) { - strcat_P((char *)dosName, PSTR("~1.GCO")); + strcat_P(dosName, PSTR("~1.GCO")); break; } } @@ -478,7 +478,7 @@ char wait_ip_back_flag = 0; typedef struct { int write_index; - char saveFileName[30]; + uint8_t saveFileName[30]; uint8_t fileTransfer; uint32_t fileLen; uint32_t tick_begin; @@ -593,7 +593,7 @@ uint8_t Explore_Disk(char *path , uint8_t recu_level) { } static void wifi_gcode_exec(uint8_t *cmd_line) { - char tempBuf[100] = { 0 }; + int8_t tempBuf[100] = { 0 }; uint8_t *tmpStr = 0; int cmd_value; volatile int print_rate; @@ -631,7 +631,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { while (tmpStr[index] == ' ') index++; if (gCfgItems.wifi_type == ESP_WIFI) { - char *path = tempBuf; + char *path = (char *)tempBuf; if (strlen((char *)&tmpStr[index]) < 80) { send_to_wifi((uint8_t *)"Begin file list\r\n", strlen("Begin file list\r\n")); @@ -680,7 +680,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcat_P((char *)list_file.file_name[sel_id], PSTR("/")); if (file_writer.fileTransfer == 1) { - uint8_t dosName[FILENAME_LENGTH]; + char dosName[FILENAME_LENGTH]; uint8_t fileName[sizeof(list_file.file_name[sel_id])]; fileName[0] = '\0'; if (has_path_selected == 1) { @@ -690,8 +690,8 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { else strcat((char *)fileName, (char *)&tmpStr[index]); if (!longName2DosName((const char *)fileName, dosName)) strcpy_P(list_file.file_name[sel_id], PSTR("notValid")); - strcat((char *)list_file.file_name[sel_id], (char *)dosName); - strcat((char *)list_file.long_name[sel_id], (char *)dosName); + strcat((char *)list_file.file_name[sel_id], dosName); + strcat((char *)list_file.long_name[sel_id], dosName); } else { strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); @@ -828,8 +828,8 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)|| (uiCfg.print_state == REPRINTING)) { print_rate = uiCfg.totalSend; ZERO(tempBuf); - sprintf_P(tempBuf, PSTR("M27 %d\r\n"), print_rate); - send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); + sprintf_P((char *)tempBuf, PSTR("M27 %d\r\n"), print_rate); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } break; @@ -841,15 +841,15 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { while (tmpStr[index] == ' ') index++; if (strstr_P((char *)&tmpStr[index], PSTR(".g")) || strstr_P((char *)&tmpStr[index], PSTR(".G"))) { - strcpy(file_writer.saveFileName, (char *)&tmpStr[index]); + strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); if (gCfgItems.fileSysType == FILE_SYS_SD) { ZERO(tempBuf); - sprintf_P(tempBuf, PSTR("%s"), file_writer.saveFileName); + sprintf_P((char *)tempBuf, PSTR("%s"), file_writer.saveFileName); } else if (gCfgItems.fileSysType == FILE_SYS_USB) { ZERO(tempBuf); - sprintf_P(tempBuf, PSTR("%s"), file_writer.saveFileName); + sprintf_P((char *)tempBuf, PSTR("%s"), (char *)file_writer.saveFileName); } mount_file_sys(gCfgItems.fileSysType); @@ -858,11 +858,11 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { card.openFileWrite(cur_name); if (card.isFileOpen()) { ZERO(file_writer.saveFileName); - strcpy(file_writer.saveFileName, (char *)&tmpStr[index]); + strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); ZERO(tempBuf); - sprintf_P(tempBuf, PSTR("Writing to file: %s\r\n"), file_writer.saveFileName); + sprintf_P((char *)tempBuf, PSTR("Writing to file: %s\r\n"), (char *)file_writer.saveFileName); wifi_ret_ack(); - send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); wifi_link_state = WIFI_WAIT_TRANS_START; } else { @@ -882,7 +882,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { SEND_OK_TO_WIFI; - char *outBuf = tempBuf; + char *outBuf = (char *)tempBuf; char tbuf[34]; sprintf_P(tbuf, PSTR("%d /%d"), (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); @@ -917,7 +917,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcat_P(outBuf, PSTR(" @:0 B@:0\r\n")); } else { - sprintf_P(tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), + sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), thermalManager.degHotend(0), thermalManager.degTargetHotend(0), #if HAS_HEATED_BED thermalManager.degBed(), thermalManager.degTargetBed(), @@ -933,16 +933,16 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ); } - send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); queue.enqueue_one_P(PSTR("M105")); break; case 992: if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { ZERO(tempBuf); - sprintf_P(tempBuf, PSTR("M992 %d%d:%d%d:%d%d\r\n"), print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); + sprintf_P((char *)tempBuf, PSTR("M992 %d%d:%d%d:%d%d\r\n"), print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); wifi_ret_ack(); - send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } break; @@ -950,9 +950,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { ZERO(tempBuf); if (strlen((char *)list_file.file_name[sel_id]) > (100 - 1)) return; - sprintf_P(tempBuf, PSTR("M994 %s;%d\n"), list_file.file_name[sel_id], (int)gCfgItems.curFilesize); + sprintf_P((char *)tempBuf, PSTR("M994 %s;%d\n"), list_file.file_name[sel_id], (int)gCfgItems.curFilesize); wifi_ret_ack(); - send_to_wifi((uint8_t *)tempBuf, strlen(tempBuf)); + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); } break; @@ -1279,7 +1279,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { ZERO(public_buf); - if (strlen(file_writer.saveFileName) > sizeof(saveFilePath)) + if (strlen((const char *)file_writer.saveFileName) > sizeof(saveFilePath)) return; ZERO(saveFilePath); @@ -1305,7 +1305,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { char dosName[FILENAME_LENGTH]; - if (!longName2DosName(file_writer.saveFileName, dosName)) { + if (!longName2DosName((const char *)file_writer.saveFileName, dosName)) { clear_cur_ui(); upload_result = 2; wifiTransError.flag = 1; @@ -1313,7 +1313,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); return; } - strcpy(saveFilePath, dosName); + strcpy((char *)saveFilePath, dosName); card.cdroot(); upload_file.close(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h index 048996e919..0886641b2d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -178,18 +178,18 @@ extern CLOUD_PARA cloud_para; extern WIFI_GCODE_BUFFER espGcodeFifo; -extern uint32_t getWifiTick(); -extern uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); +uint32_t getWifiTick(); +uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); void mks_esp_wifi_init(); -extern int cfg_cloud_flag; -extern int send_to_wifi(uint8_t *buf, int len); +extern int cfg_cloud_flag; +int send_to_wifi(uint8_t *buf, int len); void wifi_looping(); -extern int raw_send_to_wifi(uint8_t *buf, int len); -extern int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len); +int raw_send_to_wifi(uint8_t *buf, int len); +int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len); void get_wifi_list_command_send(); void get_wifi_commands(); -extern int readWifiBuf(int8_t *buf, int32_t len); +int readWifiBuf(int8_t *buf, int32_t len); void mks_wifi_firmware_update(); #ifdef __cplusplus diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h index 81f2ae3e19..dbbb7b4832 100644 --- a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h +++ b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h @@ -89,7 +89,7 @@ static const uint8_t A15 = PIN_A15; #define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \ (((p) >= 50) && ((p) <= 53)) || \ - (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) ) + (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : nullptr ) #define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \ ( (((p) >= 62) && ((p) <= 69)) ? 2 : \ @@ -97,7 +97,7 @@ static const uint8_t A15 = PIN_A15; #define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \ ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \ - ((uint8_t *)0) ) ) + nullptr ) ) #define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \ ( ((p) == 50) ? 3 : \ From 02a99e3f0bad36f91cc4f7ee19b6e6dec3b13132 Mon Sep 17 00:00:00 2001 From: gmarsh Date: Tue, 13 Apr 2021 17:17:52 -0300 Subject: [PATCH 1288/1370] Fix and improve Power Monitor (#21551) --- Marlin/Configuration_adv.h | 13 +++++++---- Marlin/src/feature/power_monitor.cpp | 9 +++++--- Marlin/src/feature/power_monitor.h | 22 ++++++++----------- .../src/gcode/feature/power_monitor/M430.cpp | 6 ++--- Marlin/src/inc/Conditionals_adv.h | 9 +++----- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 8 +++---- Marlin/src/lcd/menu/menu_power_monitor.cpp | 2 +- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 4 ++-- 8 files changed, 37 insertions(+), 36 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fd598e59e4..95e93eb288 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3306,13 +3306,18 @@ */ //#define POWER_MONITOR_CURRENT // Monitor the system current //#define POWER_MONITOR_VOLTAGE // Monitor the system voltage -#if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) - #define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF! - #define POWER_MONITOR_CURRENT_OFFSET -1 // Offset value for current sensors with linear function output - #define POWER_MONITOR_VOLTS_PER_VOLT 0.11786 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF! + +#if ENABLED(POWER_MONITOR_CURRENT) + #define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF! + #define POWER_MONITOR_CURRENT_OFFSET 0 // Offset (in amps) applied to the calculated current #define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display) #endif +#if ENABLED(POWER_MONITOR_VOLTAGE) + #define POWER_MONITOR_VOLTS_PER_VOLT 0.077933 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF! + #define POWER_MONITOR_VOLTAGE_OFFSET 0 // Offset (in volts) applied to the calculated voltage +#endif + /** * CNC Coordinate Systems * diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp index 97c4a93363..1937a54102 100644 --- a/Marlin/src/feature/power_monitor.cpp +++ b/Marlin/src/feature/power_monitor.cpp @@ -26,8 +26,11 @@ #include "power_monitor.h" -#include "../lcd/marlinui.h" -#include "../lcd/lcdprint.h" +#if HAS_LCD_MENU + #include "../lcd/marlinui.h" + #include "../lcd/lcdprint.h" +#endif + #include "../libs/numtostr.h" uint8_t PowerMonitor::flags; // = 0 @@ -54,7 +57,7 @@ PowerMonitor power_monitor; // Single instance - this calls the constructor } #endif - #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) void PowerMonitor::draw_voltage() { const float volts = getVolts(); lcd_put_u8str(volts < 100 ? ftostr31ns(volts) : ui16tostr4rj((uint16_t)volts)); diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index f378ee2a10..f6e0b292e3 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -23,7 +23,7 @@ #include "../inc/MarlinConfig.h" -#define PM_SAMPLE_RANGE 1024 +#define PM_SAMPLE_RANGE HAL_ADC_RANGE #define PM_K_VALUE 6 #define PM_K_SCALE 6 @@ -35,7 +35,7 @@ struct pm_lpf_t { filter_buf = filter_buf - (filter_buf >> K_VALUE) + (uint32_t(sample) << K_SCALE); } void capture() { - value = filter_buf * (SCALE * (1.0f / (1UL << (PM_K_VALUE + PM_K_SCALE)))) + (POWER_MONITOR_CURRENT_OFFSET); + value = filter_buf * (SCALE * (1.0f / (1UL << (PM_K_VALUE + PM_K_SCALE)))); } void reset(uint16_t reset_value = 0) { filter_buf = uint32_t(reset_value) << (K_VALUE + K_SCALE); @@ -69,19 +69,15 @@ public: }; #if ENABLED(POWER_MONITOR_CURRENT) - FORCE_INLINE static float getAmps() { return amps.value; } + FORCE_INLINE static float getAmps() { return amps.value + (POWER_MONITOR_CURRENT_OFFSET); } void add_current_sample(const uint16_t value) { amps.add_sample(value); } #endif - #if HAS_POWER_MONITOR_VREF - #if ENABLED(POWER_MONITOR_VOLTAGE) - FORCE_INLINE static float getVolts() { return volts.value; } - #else - FORCE_INLINE static float getVolts() { return POWER_MONITOR_FIXED_VOLTAGE; } // using a specified fixed valtage as the voltage measurement - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - void add_voltage_sample(const uint16_t value) { volts.add_sample(value); } - #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + FORCE_INLINE static float getVolts() { return volts.value + (POWER_MONITOR_VOLTAGE_OFFSET); } + void add_voltage_sample(const uint16_t value) { volts.add_sample(value); } + #else + FORCE_INLINE static float getVolts() { return POWER_MONITOR_FIXED_VOLTAGE; } #endif #if HAS_POWER_MONITOR_WATTS @@ -98,7 +94,7 @@ public: FORCE_INLINE static void set_current_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_I, b); } FORCE_INLINE static void toggle_current_display() { TBI(flags, PM_DISP_BIT_I); } #endif - #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) static void draw_voltage(); FORCE_INLINE static bool voltage_display_enabled() { return TEST(flags, PM_DISP_BIT_V); } FORCE_INLINE static void set_voltage_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_V, b); } diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp index 9559404456..34430fbc38 100644 --- a/Marlin/src/gcode/feature/power_monitor/M430.cpp +++ b/Marlin/src/gcode/feature/power_monitor/M430.cpp @@ -42,7 +42,7 @@ void GcodeSuite::M430() { #if ENABLED(POWER_MONITOR_CURRENT) if (parser.seen('I')) { power_monitor.set_current_display(parser.value_bool()); do_report = false; } #endif - #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) if (parser.seen('V')) { power_monitor.set_voltage_display(parser.value_bool()); do_report = false; } #endif #if HAS_POWER_MONITOR_WATTS @@ -53,11 +53,11 @@ void GcodeSuite::M430() { SERIAL_ECHOLNPAIR( #if ENABLED(POWER_MONITOR_CURRENT) "Current: ", power_monitor.getAmps(), "A" - #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) " " #endif #endif - #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) "Voltage: ", power_monitor.getVolts(), "V" #endif #if HAS_POWER_MONITOR_WATTS diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 2177dc4861..3bd77d7545 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -498,12 +498,9 @@ // Power Monitor sensors #if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) #define HAS_POWER_MONITOR 1 -#endif -#if ENABLED(POWER_MONITOR_CURRENT) && defined(POWER_MONITOR_FIXED_VOLTAGE) - #define HAS_POWER_MONITOR_VREF 1 -#endif -#if BOTH(HAS_POWER_MONITOR_VREF, POWER_MONITOR_CURRENT) - #define HAS_POWER_MONITOR_WATTS 1 + #if ENABLED(POWER_MONITOR_CURRENT) && (ENABLED(POWER_MONITOR_VOLTAGE) || defined(POWER_MONITOR_FIXED_VOLTAGE)) + #define HAS_POWER_MONITOR_WATTS 1 + #endif #endif // Flag if an EEPROM type is pre-selected diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 7e638a645e..119de19d9d 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -136,7 +136,7 @@ #if ENABLED(POWER_MONITOR_CURRENT) const bool iflag = power_monitor.current_display_enabled(); #endif - #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) const bool vflag = power_monitor.voltage_display_enabled(); #endif @@ -148,7 +148,7 @@ } #elif ENABLED(POWER_MONITOR_CURRENT) power_monitor.display_item = 0; - #elif HAS_POWER_MONITOR_VREF + #elif ENABLED(POWER_MONITOR_VOLTAGE) power_monitor.display_item = 1; #endif @@ -157,7 +157,7 @@ #if ENABLED(POWER_MONITOR_CURRENT) if (power_monitor.display_item == 0 && !iflag) ++power_monitor.display_item; #endif - #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) if (power_monitor.display_item == 1 && !vflag) ++power_monitor.display_item; #endif #if HAS_POWER_MONITOR_WATTS @@ -170,7 +170,7 @@ #if ENABLED(POWER_MONITOR_CURRENT) // Current case 0: if (iflag) power_monitor.draw_current(); break; #endif - #if HAS_POWER_MONITOR_VREF // Voltage + #if ENABLED(POWER_MONITOR_VOLTAGE) // Voltage case 1: if (vflag) power_monitor.draw_voltage(); break; #endif #if HAS_POWER_MONITOR_WATTS // Power diff --git a/Marlin/src/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp index d31ebd36b2..b43327f63b 100644 --- a/Marlin/src/lcd/menu/menu_power_monitor.cpp +++ b/Marlin/src/lcd/menu/menu_power_monitor.cpp @@ -42,7 +42,7 @@ void menu_power_monitor() { } #endif - #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) { bool ena = power_monitor.voltage_display_enabled(); EDIT_ITEM(bool, MSG_VOLTAGE, &ena, power_monitor.toggle_voltage_display); diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 0df8b10292..cbf6ca2d3c 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -119,6 +119,7 @@ // Misc. Functions // #define LED_PIN P1_31 +#define POWER_MONITOR_VOLTAGE_PIN P0_25_A2 // // LCD @@ -156,9 +157,8 @@ #define SD_MISO_PIN P0_17 #define SD_MOSI_PIN P0_18 #define SD_SS_PIN P0_16 + #define SD_DETECT_PIN P1_22 #elif SD_CONNECTION_IS(ONBOARD) - #undef SD_DETECT_PIN - #define SD_DETECT_PIN P0_27 #define SD_SCK_PIN P0_07 #define SD_MISO_PIN P0_08 #define SD_MOSI_PIN P0_09 From 107dd313bdfed5f908ff755b122287667b67a51c Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 13 Apr 2021 19:34:19 -0300 Subject: [PATCH 1289/1370] Multi-Volume. Select Media for LVGL (#21344) --- Marlin/Configuration_adv.h | 9 + Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp | 18 +- Marlin/src/HAL/STM32/msc_sd.cpp | 38 ++-- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/inc/Conditionals_post.h | 9 + .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 4 +- .../extui/lib/mks_ui/draw_media_select.cpp | 73 +++++++ .../lcd/extui/lib/mks_ui/draw_media_select.h | 33 ++++ .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 3 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 178 +++++++----------- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 4 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 7 + .../lcd/extui/lib/mks_ui/tft_Language_en.h | 1 + .../extui/lib/mks_ui/tft_multi_language.cpp | 5 + .../lcd/extui/lib/mks_ui/tft_multi_language.h | 8 + .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 2 +- Marlin/src/sd/Sd2Card.cpp | 48 ++--- Marlin/src/sd/Sd2Card.h | 119 ++++++------ Marlin/src/sd/Sd2Card_sdio.h | 30 ++- Marlin/src/sd/SdFatConfig.h | 2 +- Marlin/src/sd/SdVolume.cpp | 6 +- Marlin/src/sd/SdVolume.h | 23 ++- Marlin/src/sd/cardreader.cpp | 27 ++- Marlin/src/sd/cardreader.h | 43 ++++- Marlin/src/sd/disk_io_driver.h | 67 +++++++ .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 18 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.h | 44 ++--- 29 files changed, 546 insertions(+), 279 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_media_select.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_media_select.h create mode 100644 Marlin/src/sd/disk_io_driver.h diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 95e93eb288..fa1b470ab2 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1478,6 +1478,15 @@ // Enable if SD detect is rendered useless (e.g., by using an SD extender) //#define NO_SD_DETECT + // Multiple volume support - EXPERIMENTAL. + //#define MULTI_VOLUME + #if ENABLED(MULTI_VOLUME) + #define VOLUME_SD_ONBOARD + #define VOLUME_USB_FLASH_DRIVE + #define DEFAULT_VOLUME SD_ONBOARD + #define DEFAULT_SHARED_VOLUME USB_FLASH_DRIVE + #endif + #endif // SDSUPPORT /** diff --git a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp index d92d332c1e..3dcbbaecd2 100644 --- a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp +++ b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp @@ -32,7 +32,7 @@ Ctrl_status sd_mmc_spi_test_unit_ready() { Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) { if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) return CTRL_NO_PRESENT; - *nb_sector = card.getSd2Card().cardSize() - 1; + *nb_sector = card.diskIODriver()->cardSize() - 1; return CTRL_GOOD; } @@ -74,24 +74,24 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) { #endif // Start reading - if (!card.getSd2Card().readStart(addr)) + if (!card.diskIODriver()->readStart(addr)) return CTRL_FAIL; // For each specified sector while (nb_sector--) { // Read a sector - card.getSd2Card().readData(sector_buf); + card.diskIODriver()->readData(sector_buf); // RAM -> USB if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) { - card.getSd2Card().readStop(); + card.diskIODriver()->readStop(); return CTRL_FAIL; } } // Stop reading - card.getSd2Card().readStop(); + card.diskIODriver()->readStop(); // Done return CTRL_GOOD; @@ -113,7 +113,7 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) { } #endif - if (!card.getSd2Card().writeStart(addr, nb_sector)) + if (!card.diskIODriver()->writeStart(addr, nb_sector)) return CTRL_FAIL; // For each specified sector @@ -121,16 +121,16 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) { // USB -> RAM if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) { - card.getSd2Card().writeStop(); + card.diskIODriver()->writeStop(); return CTRL_FAIL; } // Write a sector - card.getSd2Card().writeData(sector_buf); + card.diskIODriver()->writeData(sector_buf); } // Stop writing - card.getSd2Card().writeStop(); + card.diskIODriver()->writeStop(); // Done return CTRL_GOOD; diff --git a/Marlin/src/HAL/STM32/msc_sd.cpp b/Marlin/src/HAL/STM32/msc_sd.cpp index 63ce7808f1..20e1ab3cf9 100644 --- a/Marlin/src/HAL/STM32/msc_sd.cpp +++ b/Marlin/src/HAL/STM32/msc_sd.cpp @@ -30,54 +30,66 @@ class Sd2CardUSBMscHandler : public USBMscHandler { public: + DiskIODriver* diskIODriver() { + #if ENABLED(MULTI_VOLUME) + #if SHARED_VOLUME_IS(SD_ONBOARD) + return &card.media_sd_spi; + #elif SHARED_VOLUME_IS(USB_FLASH_DRIVE) + return &card.media_usbFlashDrive; + #endif + #else + return diskIODriver(); + #endif + } + bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) { - *pBlockNum = card.getSd2Card().cardSize(); + *pBlockNum = diskIODriver()->cardSize(); *pBlockSize = BLOCK_SIZE; return true; } bool Write(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) { - auto sd2card = card.getSd2Card(); + auto sd2card = diskIODriver(); // single block if (blkLen == 1) { watchdog_refresh(); - sd2card.writeBlock(blkAddr, pBuf); + sd2card->writeBlock(blkAddr, pBuf); return true; } // multi block optmization - sd2card.writeStart(blkAddr, blkLen); + sd2card->writeStart(blkAddr, blkLen); while (blkLen--) { watchdog_refresh(); - sd2card.writeData(pBuf); + sd2card->writeData(pBuf); pBuf += BLOCK_SIZE; } - sd2card.writeStop(); + sd2card->writeStop(); return true; } bool Read(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) { - auto sd2card = card.getSd2Card(); + auto sd2card = diskIODriver(); // single block if (blkLen == 1) { watchdog_refresh(); - sd2card.readBlock(blkAddr, pBuf); + sd2card->readBlock(blkAddr, pBuf); return true; } // multi block optmization - sd2card.readStart(blkAddr); + sd2card->readStart(blkAddr); while (blkLen--) { watchdog_refresh(); - sd2card.readData(pBuf); + sd2card->readData(pBuf); pBuf += BLOCK_SIZE; } - sd2card.readStop(); + sd2card->readStop(); return true; } bool IsReady() { - return card.isMounted(); + return diskIODriver()->isReady(); } }; @@ -105,8 +117,8 @@ USBMscHandler *pSingleMscHandler = &usbMscHandler; void MSC_SD_init() { USBDevice.end(); delay(200); - USBDevice.begin(); USBDevice.registerMscHandlers(1, &pSingleMscHandler, Marlin_STORAGE_Inquirydata); + USBDevice.begin(); } #endif // __STM32F1__ && HAS_SD_HOST_DRIVE diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 738f9a8d78..842429a407 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -757,7 +757,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { TERN_(SDSUPPORT, card.manage_media()); // Handle USB Flash Drive insert / remove - TERN_(USB_FLASH_DRIVE_SUPPORT, Sd2Card::idle()); + TERN_(USB_FLASH_DRIVE_SUPPORT, card.diskIODriver()->idle()); // Announce Host Keepalive state (if any) TERN_(HOST_KEEPALIVE_FEATURE, gcode.host_keepalive()); diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 3bd77d7545..735e6464d9 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -245,7 +245,7 @@ #define _CUTTER_POWER_PERCENT 2 #define _CUTTER_POWER_RPM 3 #define _CUTTER_POWER(V) _CAT(_CUTTER_POWER_, V) - #define CUTTER_UNIT_IS(V) (_CUTTER_POWER(CUTTER_POWER_UNIT) == _CUTTER_POWER(V)) + #define CUTTER_UNIT_IS(V) (_CUTTER_POWER(CUTTER_POWER_UNIT) == _CUTTER_POWER(V)) #endif // Add features that need hardware PWM here diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 337cf2a950..f00dd6ec97 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -356,6 +356,15 @@ #define SD_DETECT_STATE LOW #endif #endif + + #if DISABLED(USB_FLASH_DRIVE_SUPPORT) || BOTH(MULTI_VOLUME, VOLUME_SD_ONBOARD) + #if ENABLED(SDIO_SUPPORT) + #define NEED_SD2CARD_SDIO 1 + #else + #define NEED_SD2CARD_SPI 1 + #endif + #endif + #endif #if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index a05c558beb..3572991813 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -148,7 +148,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { public_buf_l[6] = 0x00; raw_send_to_wifi((uint8_t*)public_buf_l, 6); - last_disp_state = KEY_BOARD_UI; + last_disp_state = KEYBOARD_UI; lv_clear_keyboard(); wifi_tips_type = TIPS_TYPE_JOINING; lv_draw_wifi_tips(); @@ -216,7 +216,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { } void lv_draw_keyboard() { - scr = lv_screen_create(KEY_BOARD_UI, ""); + scr = lv_screen_create(KEYBOARD_UI, ""); // Create styles for the keyboard static lv_style_t rel_style, pr_style; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_media_select.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_media_select.cpp new file mode 100644 index 0000000000..6dc816cc23 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_media_select.cpp @@ -0,0 +1,73 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_TFT_LVGL_UI, MULTI_VOLUME) + +#include "draw_ui.h" +#include + +#include "../../../../inc/MarlinConfig.h" +#include "../../../../sd/cardreader.h" + +extern lv_group_t *g; +static lv_obj_t *scr; + +enum { + ID_T_USB_DISK = 1, + ID_T_SD_DISK, + ID_T_RETURN +}; + +#if ENABLED(MKS_TEST) + extern uint8_t curent_disp_ui; +#endif + +static void event_handler(lv_obj_t *obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + lv_clear_media_select(); + switch (obj->mks_obj_id) { + case ID_T_USB_DISK: card.changeMedia(&card.media_usbFlashDrive); break; + case ID_T_SD_DISK: card.changeMedia(&card.media_sd_spi); break; + case ID_T_RETURN: + TERN_(MKS_TEST, curent_disp_ui = 1); + lv_draw_ready_print(); + return; + } + lv_draw_print_file(); +} + +void lv_draw_media_select() { + scr = lv_screen_create(MEDIA_SELECT_UI); + lv_big_button_create(scr, "F:/bmp_sd.bin", media_select_menu.sd_disk, INTERVAL_V, titleHeight, event_handler, ID_T_SD_DISK); + lv_big_button_create(scr, "F:/bmp_usb_disk.bin", media_select_menu.usb_disk, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_USB_DISK); + lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN); +} + +void lv_clear_media_select() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_media_select.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_media_select.h new file mode 100644 index 0000000000..a698714a9d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_media_select.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_media_select(); +extern void lv_clear_media_select(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index d32851f761..17f5d95d2a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -177,7 +177,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } else { lv_clear_print_file(); - lv_draw_ready_print(); + TERN(MULTI_VOLUME, lv_draw_media_select(), lv_draw_ready_print()); } } else { @@ -248,6 +248,7 @@ static char test_public_buf_l[40]; void disp_gcode_icon(uint8_t file_num) { uint8_t i; + // TODO: set current media title?! scr = lv_screen_create(PRINT_FILE_UI, ""); // Create image buttons diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index d02e774b94..09784b5184 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -73,7 +73,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_INFO_EXT: uiCfg.curTempType = 0; lv_draw_preHeat(); break; case ID_INFO_BED: uiCfg.curTempType = 1; lv_draw_preHeat(); break; case ID_INFO_FAN: lv_draw_fan(); break; - case ID_PRINT: lv_draw_print_file(); break; + case ID_PRINT: TERN(MULTI_VOLUME, lv_draw_media_select(), lv_draw_print_file()); break; } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 51e187435c..0a99df08e5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -447,111 +447,63 @@ char *getDispText(int index) { ZERO(public_buf_l); switch (disp_state_stack._disp_state[index]) { - case PRINT_READY_UI: - strcpy(public_buf_l, main_menu.title); - break; - case PRINT_FILE_UI: - strcpy(public_buf_l, file_menu.title); - break; + case PRINT_READY_UI: strcpy(public_buf_l, main_menu.title); break; + case PRINT_FILE_UI: strcpy(public_buf_l, file_menu.title); break; case PRINTING_UI: - if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - #ifndef TFT35 - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - #endif - ) strcpy(public_buf_l, common_menu.print_special_title); - else strcpy(public_buf_l, printing_menu.title); - break; - case MOVE_MOTOR_UI: - strcpy(public_buf_l, move_menu.title); + switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { + IF_DISABLED(TFT35, case OPERATE_UI: case PAUSE_UI:) + case PRINTING_UI: strcpy(public_buf_l, common_menu.print_special_title); break; + default: strcpy(public_buf_l, printing_menu.title); break; + } break; + case MOVE_MOTOR_UI: strcpy(public_buf_l, move_menu.title); break; case OPERATE_UI: - if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - #ifndef TFT35 - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - #endif - ) strcpy(public_buf_l, common_menu.operate_special_title); - else strcpy(public_buf_l, operation_menu.title); + switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { + IF_DISABLED(TFT35, case OPERATE_UI: case PAUSE_UI:) + case PRINTING_UI: strcpy(public_buf_l, common_menu.operate_special_title); break; + default: strcpy(public_buf_l, operation_menu.title); break; + } break; case PAUSE_UI: - if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - ) strcpy(public_buf_l, common_menu.pause_special_title); - else strcpy(public_buf_l, pause_menu.title); - break; - - case EXTRUSION_UI: - strcpy(public_buf_l, extrude_menu.title); - break; - case CHANGE_SPEED_UI: - strcpy(public_buf_l, speed_menu.title); - break; - case FAN_UI: - strcpy(public_buf_l, fan_menu.title); + switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { + case OPERATE_UI: + case PAUSE_UI: + case PRINTING_UI: strcpy(public_buf_l, common_menu.pause_special_title); break; + default: strcpy(public_buf_l, pause_menu.title); break; + } break; + case EXTRUSION_UI: strcpy(public_buf_l, extrude_menu.title); break; + case CHANGE_SPEED_UI: strcpy(public_buf_l, speed_menu.title); break; + case FAN_UI: strcpy(public_buf_l, fan_menu.title); break; case PRE_HEAT_UI: - if ((disp_state_stack._disp_state[disp_state_stack._disp_index - 1] == OPERATE_UI)) - strcpy(public_buf_l, preheat_menu.adjust_title); - else strcpy(public_buf_l, preheat_menu.title); - break; - case SET_UI: - strcpy(public_buf_l, set_menu.title); - break; - case ZERO_UI: - strcpy(public_buf_l, home_menu.title); - break; - case SPRAYER_UI: break; - case MACHINE_UI: break; - case LANGUAGE_UI: - strcpy(public_buf_l, language_menu.title); - break; - case ABOUT_UI: - strcpy(public_buf_l, about_menu.title); - break; - case LOG_UI: break; - case DISK_UI: - strcpy(public_buf_l, filesys_menu.title); - break; - case DIALOG_UI: - strcpy(public_buf_l, common_menu.dialog_confirm_title); - break; - case WIFI_UI: - strcpy(public_buf_l, wifi_menu.title); + switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { + case OPERATE_UI: strcpy(public_buf_l, preheat_menu.adjust_title); + default: strcpy(public_buf_l, preheat_menu.title); break; + } break; + case SET_UI: strcpy(public_buf_l, set_menu.title); break; + case ZERO_UI: strcpy(public_buf_l, home_menu.title); break; + case SPRAYER_UI: break; + case MACHINE_UI: break; + case LANGUAGE_UI: strcpy(public_buf_l, language_menu.title); break; + case ABOUT_UI: strcpy(public_buf_l, about_menu.title); break; + case LOG_UI: break; + case DISK_UI: strcpy(public_buf_l, filesys_menu.title); break; + case DIALOG_UI: strcpy(public_buf_l, common_menu.dialog_confirm_title); break; + case WIFI_UI: strcpy(public_buf_l, wifi_menu.title); break; case MORE_UI: - case PRINT_MORE_UI: - strcpy(public_buf_l, more_menu.title); - break; - case FILAMENTCHANGE_UI: - strcpy(public_buf_l, filament_menu.title); - break; + case PRINT_MORE_UI: strcpy(public_buf_l, more_menu.title); break; + case FILAMENTCHANGE_UI: strcpy(public_buf_l, filament_menu.title); break; case LEVELING_UI: - case MESHLEVELING_UI: - strcpy(public_buf_l, leveling_menu.title); - break; - case BIND_UI: - strcpy(public_buf_l, cloud_menu.title); - break; - case TOOL_UI: - strcpy(public_buf_l, tool_menu.title); - break; - case WIFI_LIST_UI: - #if ENABLED(MKS_WIFI_MODULE) - strcpy(public_buf_l, list_menu.title); - break; - #endif - case MACHINE_PARA_UI: - strcpy(public_buf_l, MachinePara_menu.title); - break; - case BABY_STEP_UI: - strcpy(public_buf_l, operation_menu.babystep); - break; - case EEPROM_SETTINGS_UI: - strcpy(public_buf_l, eeprom_menu.title); - break; + case MESHLEVELING_UI: strcpy(public_buf_l, leveling_menu.title); break; + case BIND_UI: strcpy(public_buf_l, cloud_menu.title); break; + case TOOL_UI: strcpy(public_buf_l, tool_menu.title); break; + case WIFI_LIST_UI: TERN_(MKS_WIFI_MODULE, strcpy(public_buf_l, list_menu.title)); break; + case MACHINE_PARA_UI: strcpy(public_buf_l, MachinePara_menu.title); break; + case BABY_STEP_UI: strcpy(public_buf_l, operation_menu.babystep); break; + case EEPROM_SETTINGS_UI: strcpy(public_buf_l, eeprom_menu.title); break; + case MEDIA_SELECT_UI: strcpy(public_buf_l, media_select_menu.title); break; default: break; } @@ -828,11 +780,9 @@ void GUI_RefreshPage() { } break; - case OPERATE_UI: - break; + case OPERATE_UI: break; - case PAUSE_UI: - break; + case PAUSE_UI: break; case FAN_UI: if (temps_update_flag) { @@ -841,8 +791,7 @@ void GUI_RefreshPage() { } break; - case MOVE_MOTOR_UI: - break; + case MOVE_MOTOR_UI: break; #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: @@ -852,10 +801,9 @@ void GUI_RefreshPage() { } break; - case BIND_UI: - refresh_bind_ui(); - break; + case BIND_UI: refresh_bind_ui(); break; #endif + case FILAMENTCHANGE_UI: if (temps_update_flag) { temps_update_flag = false; @@ -866,10 +814,8 @@ void GUI_RefreshPage() { filament_dialog_handle(); TERN_(MKS_WIFI_MODULE, wifi_scan_handle()); break; - case MESHLEVELING_UI: - break; - case HARDWARE_TEST_UI: - break; + case MESHLEVELING_UI: break; + case HARDWARE_TEST_UI: break; case WIFI_LIST_UI: #if ENABLED(MKS_WIFI_MODULE) if (printing_rate_update_flag) { @@ -878,8 +824,8 @@ void GUI_RefreshPage() { } #endif break; - case KEY_BOARD_UI: - break; + case KEYBOARD_UI: break; + #if ENABLED(MKS_WIFI_MODULE) case WIFI_TIPS_UI: switch (wifi_tips_type) { @@ -932,6 +878,7 @@ void GUI_RefreshPage() { disp_z_offset_value(); } break; + default: break; } @@ -982,7 +929,7 @@ void clear_cur_ui() { #if ENABLED(MKS_WIFI_MODULE) case WIFI_LIST_UI: lv_clear_wifi_list(); break; #endif - case KEY_BOARD_UI: lv_clear_keyboard(); break; + case KEYBOARD_UI: lv_clear_keyboard(); break; #if ENABLED(MKS_WIFI_MODULE) case WIFI_TIPS_UI: lv_clear_wifi_tips(); break; #endif @@ -1013,9 +960,9 @@ void clear_cur_ui() { case NUMBER_KEY_UI: lv_clear_number_key(); break; case BABY_STEP_UI: lv_clear_baby_stepping(); break; case PAUSE_POS_UI: lv_clear_pause_position(); break; - #if HAS_TRINAMIC_CONFIG - case TMC_CURRENT_UI: lv_clear_tmc_current_settings(); break; - #endif + #if HAS_TRINAMIC_CONFIG + case TMC_CURRENT_UI: lv_clear_tmc_current_settings(); break; + #endif case EEPROM_SETTINGS_UI: lv_clear_eeprom_settings(); break; #if HAS_STEALTHCHOP case TMC_MODE_UI: lv_clear_tmc_step_mode_settings(); break; @@ -1032,6 +979,9 @@ void clear_cur_ui() { #if ENABLED(TOUCH_SCREEN_CALIBRATION) case TOUCH_CALIBRATION_UI: lv_clear_touch_calibration_screen(); break; #endif + #if ENABLED(MULTI_VOLUME) + case MEDIA_SELECT_UI: lv_clear_media_select(); break; + #endif default: break; } } @@ -1087,7 +1037,7 @@ void draw_return_ui() { #if ENABLED(MKS_WIFI_MODULE) case WIFI_LIST_UI: lv_draw_wifi_list(); break; #endif - case KEY_BOARD_UI: lv_draw_keyboard(); break; + case KEYBOARD_UI: lv_draw_keyboard(); break; #if ENABLED(MKS_WIFI_MODULE) case WIFI_TIPS_UI: lv_draw_wifi_tips(); break; #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 6577d80cdf..2809e4e937 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -76,6 +76,7 @@ #include "draw_homing_sensitivity_settings.h" #include "draw_baby_stepping.h" #include "draw_keyboard.h" +#include "draw_media_select.h" #include "draw_encoder_settings.h" #include "../../../../inc/MarlinConfigPre.h" @@ -289,7 +290,7 @@ typedef enum { TOOL_UI, HARDWARE_TEST_UI, WIFI_LIST_UI, - KEY_BOARD_UI, + KEYBOARD_UI, WIFI_TIPS_UI, MACHINE_PARA_UI, MACHINE_SETTINGS_UI, @@ -327,6 +328,7 @@ typedef enum { ENCODER_SETTINGS_UI, TOUCH_CALIBRATION_UI, GCODE_UI, + MEDIA_SELECT_UI, } DISP_STATE; typedef struct { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 36f276c21b..9318b50d2b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -197,6 +197,13 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_cloud.bin", #endif + #if ENABLED(MULTI_VOLUME) + "bmp_usb_disk.bin", + // "bmp_usb_disk_sel.bin", + "bmp_sd.bin", + // "bmp_sd_sel.bin", + #endif + // Babystep screen "bmp_baby_move0_01.bin", "bmp_baby_move0_05.bin", diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 104e1fdcaf..b6eef18368 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -540,6 +540,7 @@ #define USB_DRIVE_BACK_EN "< Back" #define FILE_PAGES_EN "%d/%d" #define FILE_NEXT_PAGE_EN "Next Page" +#define MEDIA_SELECT_TITLE_EN "Select Media" //BUILD PLATE #define PLATE_TITLE_EN "Build Plate" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 20b7d5f606..5e37acb2b4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -56,6 +56,7 @@ tool_menu_def tool_menu; MachinePara_menu_def MachinePara_menu; pause_msg_def pause_msg_menu; eeprom_def eeprom_menu; +media_select_menu_def media_select_menu; machine_common_def machine_menu; void machine_setting_disp() { @@ -821,6 +822,10 @@ void disp_language_init() { filament_menu.stat_temp = TEXT_VALUE; + media_select_menu.title = MEDIA_SELECT_TITLE_EN; + media_select_menu.sd_disk = SD_CARD_TITLE_EN; + media_select_menu.usb_disk = USB_DRIVE_TITLE_EN; + machine_menu.key_0 = KEYBOARD_KEY0_EN; machine_menu.key_1 = KEYBOARD_KEY1_EN; machine_menu.key_2 = KEYBOARD_KEY2_EN; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 61e3524c58..79faad74e2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -706,6 +706,14 @@ typedef struct tool_menu_disp { extern tool_menu_def tool_menu; +typedef struct media_select_menu_disp { + const char *title; + const char *sd_disk; + const char *usb_disk; +} media_select_menu_def; + +extern media_select_menu_def media_select_menu; + typedef struct MachinePara_menu_disp { const char *title; const char *MachineSetting; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 6c2afeafd3..1162f7a228 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1142,7 +1142,7 @@ static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { int8_t valid_name_num; if (msgLen <= 0) return; - if (disp_state == KEY_BOARD_UI) return; + if (disp_state == KEYBOARD_UI) return; wifi_list.getNameNum = msg[0]; diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index 28049c7e7e..3e714fe9fe 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -30,7 +30,7 @@ #include "../inc/MarlinConfig.h" -#if ENABLED(SDSUPPORT) && NONE(USB_FLASH_DRIVE_SUPPORT, SDIO_SUPPORT) +#if NEED_SD2CARD_SPI /* Enable FAST CRC computations - You can trade speed for FLASH space if * needed by disabling the following define */ @@ -88,7 +88,7 @@ #endif // Send command and return error code. Return zero for OK -uint8_t Sd2Card::cardCommand(const uint8_t cmd, const uint32_t arg) { +uint8_t DiskIODriver_SPI_SD::cardCommand(const uint8_t cmd, const uint32_t arg) { // Select card chipSelect(); @@ -133,7 +133,7 @@ uint8_t Sd2Card::cardCommand(const uint8_t cmd, const uint32_t arg) { * \return The number of 512 byte data blocks in the card * or zero if an error occurs. */ -uint32_t Sd2Card::cardSize() { +uint32_t DiskIODriver_SPI_SD::cardSize() { csd_t csd; if (!readCSD(&csd)) return 0; if (csd.v1.csd_ver == 0) { @@ -155,12 +155,12 @@ uint32_t Sd2Card::cardSize() { } } -void Sd2Card::chipDeselect() { +void DiskIODriver_SPI_SD::chipDeselect() { extDigitalWrite(chipSelectPin_, HIGH); spiSend(0xFF); // Ensure MISO goes high impedance } -void Sd2Card::chipSelect() { +void DiskIODriver_SPI_SD::chipSelect() { spiInit(spiRate_); extDigitalWrite(chipSelectPin_, LOW); } @@ -178,7 +178,7 @@ void Sd2Card::chipSelect() { * * \return true for success, false for failure. */ -bool Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { +bool DiskIODriver_SPI_SD::erase(uint32_t firstBlock, uint32_t lastBlock) { if (ENABLED(SDCARD_READONLY)) return false; csd_t csd; @@ -216,7 +216,7 @@ bool Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { * \return true if single block erase is supported. * false if single block erase is not supported. */ -bool Sd2Card::eraseSingleBlockEnable() { +bool DiskIODriver_SPI_SD::eraseSingleBlockEnable() { csd_t csd; return readCSD(&csd) ? csd.v1.erase_blk_en : false; } @@ -230,7 +230,7 @@ bool Sd2Card::eraseSingleBlockEnable() { * \return true for success, false for failure. * The reason for failure can be determined by calling errorCode() and errorData(). */ -bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { +bool DiskIODriver_SPI_SD::init(const uint8_t sckRateID, const pin_t chipSelectPin) { #if IS_TEENSY_35_36 || IS_TEENSY_40_41 chipSelectPin_ = BUILTIN_SDCARD; const uint8_t ret = SDHC_CardInit(); @@ -324,10 +324,12 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { } chipDeselect(); + ready = true; return setSckRate(sckRateID); FAIL: chipDeselect(); + ready = false; return false; } @@ -338,7 +340,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { * \param[out] dst Pointer to the location that will receive the data. * \return true for success, false for failure. */ -bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t *dst) { +bool DiskIODriver_SPI_SD::readBlock(uint32_t blockNumber, uint8_t *dst) { #if IS_TEENSY_35_36 || IS_TEENSY_40_41 return 0 == SDHC_CardReadBlock(dst, blockNumber); #endif @@ -378,7 +380,7 @@ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t *dst) { * * \return true for success, false for failure. */ -bool Sd2Card::readData(uint8_t *dst) { +bool DiskIODriver_SPI_SD::readData(uint8_t *dst) { chipSelect(); return readData(dst, 512); } @@ -445,7 +447,7 @@ bool Sd2Card::readData(uint8_t *dst) { #endif #endif // SD_CHECK_AND_RETRY -bool Sd2Card::readData(uint8_t *dst, const uint16_t count) { +bool DiskIODriver_SPI_SD::readData(uint8_t *dst, const uint16_t count) { bool success = false; const millis_t read_timeout = millis() + SD_READ_TIMEOUT; @@ -477,7 +479,7 @@ bool Sd2Card::readData(uint8_t *dst, const uint16_t count) { } /** read CID or CSR register */ -bool Sd2Card::readRegister(const uint8_t cmd, void *buf) { +bool DiskIODriver_SPI_SD::readRegister(const uint8_t cmd, void *buf) { uint8_t *dst = reinterpret_cast(buf); if (cardCommand(cmd, 0)) { error(SD_CARD_ERROR_READ_REG); @@ -497,7 +499,7 @@ bool Sd2Card::readRegister(const uint8_t cmd, void *buf) { * * \return true for success, false for failure. */ -bool Sd2Card::readStart(uint32_t blockNumber) { +bool DiskIODriver_SPI_SD::readStart(uint32_t blockNumber) { if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; const bool success = !cardCommand(CMD18, blockNumber); @@ -511,7 +513,7 @@ bool Sd2Card::readStart(uint32_t blockNumber) { * * \return true for success, false for failure. */ -bool Sd2Card::readStop() { +bool DiskIODriver_SPI_SD::readStop() { chipSelect(); const bool success = !cardCommand(CMD12, 0); if (!success) error(SD_CARD_ERROR_CMD12); @@ -531,7 +533,7 @@ bool Sd2Card::readStop() { * \return The value one, true, is returned for success and the value zero, * false, is returned for an invalid value of \a sckRateID. */ -bool Sd2Card::setSckRate(const uint8_t sckRateID) { +bool DiskIODriver_SPI_SD::setSckRate(const uint8_t sckRateID) { const bool success = (sckRateID <= 6); if (success) spiRate_ = sckRateID; else error(SD_CARD_ERROR_SCK_RATE); return success; @@ -542,12 +544,14 @@ bool Sd2Card::setSckRate(const uint8_t sckRateID) { * \param[in] timeout_ms Timeout to abort. * \return true for success, false for timeout. */ -bool Sd2Card::waitNotBusy(const millis_t timeout_ms) { +bool DiskIODriver_SPI_SD::waitNotBusy(const millis_t timeout_ms) { const millis_t wait_timeout = millis() + timeout_ms; while (spiRec() != 0xFF) if (ELAPSED(millis(), wait_timeout)) return false; return true; } +void DiskIODriver_SPI_SD::error(const uint8_t code) { errorCode_ = code; } + /** * Write a 512 byte block to an SD card. * @@ -555,7 +559,7 @@ bool Sd2Card::waitNotBusy(const millis_t timeout_ms) { * \param[in] src Pointer to the location of the data to be written. * \return true for success, false for failure. */ -bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t *src) { +bool DiskIODriver_SPI_SD::writeBlock(uint32_t blockNumber, const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; #if IS_TEENSY_35_36 || IS_TEENSY_40_41 @@ -586,7 +590,7 @@ bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t *src) { * \param[in] src Pointer to the location of the data to be written. * \return true for success, false for failure. */ -bool Sd2Card::writeData(const uint8_t *src) { +bool DiskIODriver_SPI_SD::writeData(const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; bool success = true; @@ -601,7 +605,7 @@ bool Sd2Card::writeData(const uint8_t *src) { } // Send one block of data for write block or write multiple blocks -bool Sd2Card::writeData(const uint8_t token, const uint8_t *src) { +bool DiskIODriver_SPI_SD::writeData(const uint8_t token, const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; const uint16_t crc = TERN(SD_CHECK_AND_RETRY, CRC_CCITT(src, 512), 0xFFFF); @@ -629,7 +633,7 @@ bool Sd2Card::writeData(const uint8_t token, const uint8_t *src) { * * \return true for success, false for failure. */ -bool Sd2Card::writeStart(uint32_t blockNumber, const uint32_t eraseCount) { +bool DiskIODriver_SPI_SD::writeStart(uint32_t blockNumber, const uint32_t eraseCount) { if (ENABLED(SDCARD_READONLY)) return false; bool success = false; @@ -650,7 +654,7 @@ bool Sd2Card::writeStart(uint32_t blockNumber, const uint32_t eraseCount) { * * \return true for success, false for failure. */ -bool Sd2Card::writeStop() { +bool DiskIODriver_SPI_SD::writeStop() { if (ENABLED(SDCARD_READONLY)) return false; bool success = false; @@ -666,4 +670,4 @@ bool Sd2Card::writeStop() { return success; } -#endif // SDSUPPORT +#endif // NEED_SD2CARD_SPI diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index eb7f9bb2ca..e0dce02a02 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -35,47 +35,50 @@ #include "SdFatConfig.h" #include "SdInfo.h" +#include "disk_io_driver.h" #include -uint16_t const SD_INIT_TIMEOUT = 2000, // init timeout ms - SD_ERASE_TIMEOUT = 10000, // erase timeout ms - SD_READ_TIMEOUT = 300, // read timeout ms - SD_WRITE_TIMEOUT = 600; // write time out ms +uint16_t const SD_INIT_TIMEOUT = 2000, // (ms) Init timeout + SD_ERASE_TIMEOUT = 10000, // (ms) Erase timeout + SD_READ_TIMEOUT = 300, // (ms) Read timeout + SD_WRITE_TIMEOUT = 600; // (ms) Write timeout // SD card errors -uint8_t const SD_CARD_ERROR_CMD0 = 0x01, // timeout error for command CMD0 (initialize card in SPI mode) - SD_CARD_ERROR_CMD8 = 0x02, // CMD8 was not accepted - not a valid SD card - SD_CARD_ERROR_CMD12 = 0x03, // card returned an error response for CMD12 (write stop) - SD_CARD_ERROR_CMD17 = 0x04, // card returned an error response for CMD17 (read block) - SD_CARD_ERROR_CMD18 = 0x05, // card returned an error response for CMD18 (read multiple block) - SD_CARD_ERROR_CMD24 = 0x06, // card returned an error response for CMD24 (write block) - SD_CARD_ERROR_CMD25 = 0x07, // WRITE_MULTIPLE_BLOCKS command failed - SD_CARD_ERROR_CMD58 = 0x08, // card returned an error response for CMD58 (read OCR) - SD_CARD_ERROR_ACMD23 = 0x09, // SET_WR_BLK_ERASE_COUNT failed - SD_CARD_ERROR_ACMD41 = 0x0A, // ACMD41 initialization process timeout - SD_CARD_ERROR_BAD_CSD = 0x0B, // card returned a bad CSR version field - SD_CARD_ERROR_ERASE = 0x0C, // erase block group command failed - SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0x0D, // card not capable of single block erase - SD_CARD_ERROR_ERASE_TIMEOUT = 0x0E, // Erase sequence timed out - SD_CARD_ERROR_READ = 0x0F, // card returned an error token instead of read data - SD_CARD_ERROR_READ_REG = 0x10, // read CID or CSD failed - SD_CARD_ERROR_READ_TIMEOUT = 0x11, // timeout while waiting for start of read data - SD_CARD_ERROR_STOP_TRAN = 0x12, // card did not accept STOP_TRAN_TOKEN - SD_CARD_ERROR_WRITE = 0x13, // card returned an error token as a response to a write operation - SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0x14, // REMOVE - not used ... attempt to write protected block zero - SD_CARD_ERROR_WRITE_MULTIPLE = 0x15, // card did not go ready for a multiple block write - SD_CARD_ERROR_WRITE_PROGRAMMING = 0x16, // card returned an error to a CMD13 status check after a write - SD_CARD_ERROR_WRITE_TIMEOUT = 0x17, // timeout occurred during write programming - SD_CARD_ERROR_SCK_RATE = 0x18, // incorrect rate selected - SD_CARD_ERROR_INIT_NOT_CALLED = 0x19, // init() not called - // 0x1A is unused now, it was: card returned an error for CMD59 (CRC_ON_OFF) - SD_CARD_ERROR_READ_CRC = 0x1B; // invalid read CRC +typedef enum : uint8_t { + SD_CARD_ERROR_CMD0 = 0x01, // Timeout error for command CMD0 (initialize card in SPI mode) + SD_CARD_ERROR_CMD8 = 0x02, // CMD8 was not accepted - not a valid SD card + SD_CARD_ERROR_CMD12 = 0x03, // Card returned an error response for CMD12 (write stop) + SD_CARD_ERROR_CMD17 = 0x04, // Card returned an error response for CMD17 (read block) + SD_CARD_ERROR_CMD18 = 0x05, // Card returned an error response for CMD18 (read multiple block) + SD_CARD_ERROR_CMD24 = 0x06, // Card returned an error response for CMD24 (write block) + SD_CARD_ERROR_CMD25 = 0x07, // WRITE_MULTIPLE_BLOCKS command failed + SD_CARD_ERROR_CMD58 = 0x08, // Card returned an error response for CMD58 (read OCR) + SD_CARD_ERROR_ACMD23 = 0x09, // SET_WR_BLK_ERASE_COUNT failed + SD_CARD_ERROR_ACMD41 = 0x0A, // ACMD41 initialization process timeout + SD_CARD_ERROR_BAD_CSD = 0x0B, // Card returned a bad CSR version field + SD_CARD_ERROR_ERASE = 0x0C, // Erase block group command failed + SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0x0D, // Card not capable of single block erase + SD_CARD_ERROR_ERASE_TIMEOUT = 0x0E, // Erase sequence timed out + SD_CARD_ERROR_READ = 0x0F, // Card returned an error token instead of read data + SD_CARD_ERROR_READ_REG = 0x10, // Read CID or CSD failed + SD_CARD_ERROR_READ_TIMEOUT = 0x11, // Timeout while waiting for start of read data + SD_CARD_ERROR_STOP_TRAN = 0x12, // Card did not accept STOP_TRAN_TOKEN + SD_CARD_ERROR_WRITE = 0x13, // Card returned an error token as a response to a write operation + SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0x14, // REMOVE - not used ... attempt to write protected block zero + SD_CARD_ERROR_WRITE_MULTIPLE = 0x15, // Card did not go ready for a multiple block write + SD_CARD_ERROR_WRITE_PROGRAMMING = 0x16, // Card returned an error to a CMD13 status check after a write + SD_CARD_ERROR_WRITE_TIMEOUT = 0x17, // Timeout occurred during write programming + SD_CARD_ERROR_SCK_RATE = 0x18, // Incorrect rate selected + SD_CARD_ERROR_INIT_NOT_CALLED = 0x19, // Init() not called + // 0x1A is unused now, it was: card returned an error for CMD59 (CRC_ON_OFF) + SD_CARD_ERROR_READ_CRC = 0x1B // Invalid read CRC +} sd_error_code_t; // card types -uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 SD card - SD_CARD_TYPE_SD2 = 2, // Standard capacity V2 SD card - SD_CARD_TYPE_SDHC = 3; // High Capacity SD card +uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 SD card + SD_CARD_TYPE_SD2 = 2, // Standard capacity V2 SD card + SD_CARD_TYPE_SDHC = 3; // High Capacity SD card /** * Define SOFTWARE_SPI to use bit-bang SPI @@ -93,12 +96,11 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 * \class Sd2Card * \brief Raw access to SD and SDHC flash memory cards. */ -class Sd2Card { +class DiskIODriver_SPI_SD : public DiskIODriver { public: - Sd2Card() : errorCode_(SD_CARD_ERROR_INIT_NOT_CALLED), type_(0) {} + DiskIODriver_SPI_SD() : errorCode_(SD_CARD_ERROR_INIT_NOT_CALLED), type_(0) {} - uint32_t cardSize(); bool erase(uint32_t firstBlock, uint32_t lastBlock); bool eraseSingleBlockEnable(); @@ -106,7 +108,7 @@ public: * Set SD error code. * \param[in] code value for error code. */ - inline void error(const uint8_t code) { errorCode_ = code; } + void error(const uint8_t code); /** * \return error code for last error. See Sd2Card.h for a list of error codes. @@ -122,9 +124,15 @@ public: * * \return true for success or false for failure. */ - bool init(const uint8_t sckRateID, const pin_t chipSelectPin); + bool init(const uint8_t sckRateID, const pin_t chipSelectPin) override; - bool readBlock(uint32_t block, uint8_t *dst); + bool setSckRate(const uint8_t sckRateID); + + /** + * Return the card type: SD V1, SD V2 or SDHC + * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. + */ + int type() const { return type_; } /** * Read a card's CID register. The CID contains card identification @@ -145,24 +153,27 @@ public: * * \return true for success or false for failure. */ - inline bool readCSD(csd_t *csd) { return readRegister(CMD9, csd); } + inline bool readCSD(csd_t *csd) override { return readRegister(CMD9, csd); } - bool readData(uint8_t *dst); - bool readStart(uint32_t blockNumber); - bool readStop(); - bool setSckRate(const uint8_t sckRateID); + bool readData(uint8_t *dst) override; + bool readStart(uint32_t blockNumber) override; + bool readStop() override; - /** - * Return the card type: SD V1, SD V2 or SDHC - * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. - */ - int type() const {return type_;} - bool writeBlock(uint32_t blockNumber, const uint8_t *src); - bool writeData(const uint8_t *src); - bool writeStart(uint32_t blockNumber, const uint32_t eraseCount); - bool writeStop(); + bool writeData(const uint8_t *src) override; + bool writeStart(const uint32_t blockNumber, const uint32_t eraseCount) override; + bool writeStop() override; + + bool readBlock(uint32_t block, uint8_t *dst) override; + bool writeBlock(uint32_t blockNumber, const uint8_t *src) override; + + uint32_t cardSize() override; + + bool isReady() override { return ready; }; + + void idle() override {} private: + bool ready = false; uint8_t chipSelectPin_, errorCode_, spiRate_, diff --git a/Marlin/src/sd/Sd2Card_sdio.h b/Marlin/src/sd/Sd2Card_sdio.h index 10fb757359..1580344805 100644 --- a/Marlin/src/sd/Sd2Card_sdio.h +++ b/Marlin/src/sd/Sd2Card_sdio.h @@ -23,17 +23,33 @@ #include "../inc/MarlinConfig.h" -#if ENABLED(SDIO_SUPPORT) +#include "SdInfo.h" +#include "disk_io_driver.h" bool SDIO_Init(); bool SDIO_ReadBlock(uint32_t block, uint8_t *dst); bool SDIO_WriteBlock(uint32_t block, const uint8_t *src); -class Sd2Card { +class DiskIODriver_SDIO : public DiskIODriver { public: - bool init(uint8_t sckRateID = 0, uint8_t chipSelectPin = 0) { return SDIO_Init(); } - bool readBlock(uint32_t block, uint8_t *dst) { return SDIO_ReadBlock(block, dst); } - bool writeBlock(uint32_t block, const uint8_t *src) { return SDIO_WriteBlock(block, src); } -}; + bool init(const uint8_t sckRateID=0, const pin_t chipSelectPin=0) override { return SDIO_Init(); } -#endif // SDIO_SUPPORT + bool readCSD(csd_t *csd) override { return false; } + + bool readStart(const uint32_t block) override { return false; } + bool readData(uint8_t *dst) override { return false; } + bool readStop() override { return false; } + + bool writeStart(const uint32_t block, const uint32_t) override { return false; } + bool writeData(const uint8_t *src) override { return false; } + bool writeStop() override { return false; } + + bool readBlock(uint32_t block, uint8_t *dst) override { return SDIO_ReadBlock(block, dst); } + bool writeBlock(uint32_t block, const uint8_t *src) override { return SDIO_WriteBlock(block, src); } + + uint32_t cardSize() override { return 0; } + + bool isReady() override { return true; } + + void idle() override {} +}; diff --git a/Marlin/src/sd/SdFatConfig.h b/Marlin/src/sd/SdFatConfig.h index 13ac3a7487..dfba641295 100644 --- a/Marlin/src/sd/SdFatConfig.h +++ b/Marlin/src/sd/SdFatConfig.h @@ -39,7 +39,7 @@ * * Each card requires about 550 bytes of SRAM so use of a Mega is recommended. */ -#define USE_MULTIPLE_CARDS 0 +#define USE_MULTIPLE_CARDS 0 //TODO? ENABLED(MULTI_VOLUME) /** * Call flush for endl if ENDL_CALLS_FLUSH is nonzero diff --git a/Marlin/src/sd/SdVolume.cpp b/Marlin/src/sd/SdVolume.cpp index 7fcebd640d..1b1fdc5a7c 100644 --- a/Marlin/src/sd/SdVolume.cpp +++ b/Marlin/src/sd/SdVolume.cpp @@ -41,10 +41,10 @@ // raw block cache uint32_t SdVolume::cacheBlockNumber_; // current block number cache_t SdVolume::cacheBuffer_; // 512 byte cache for Sd2Card - Sd2Card* SdVolume::sdCard_; // pointer to SD card object + DiskIODriver *SdVolume::sdCard_; // pointer to SD card object bool SdVolume::cacheDirty_; // cacheFlush() will write block if true uint32_t SdVolume::cacheMirrorBlock_; // mirror block for second FAT -#endif // USE_MULTIPLE_CARDS +#endif // find a contiguous group of clusters bool SdVolume::allocContiguous(uint32_t count, uint32_t *curCluster) { @@ -326,7 +326,7 @@ int32_t SdVolume::freeClusterCount() { * Reasons for failure include not finding a valid partition, not finding a valid * FAT file system in the specified partition or an I/O error. */ -bool SdVolume::init(Sd2Card* dev, uint8_t part) { +bool SdVolume::init(DiskIODriver* dev, uint8_t part) { uint32_t totalBlocks, volumeStartBlock = 0; fat32_boot_t *fbs; diff --git a/Marlin/src/sd/SdVolume.h b/Marlin/src/sd/SdVolume.h index c2eaf0bd13..b8e70ca9d7 100644 --- a/Marlin/src/sd/SdVolume.h +++ b/Marlin/src/sd/SdVolume.h @@ -36,9 +36,11 @@ #if ENABLED(USB_FLASH_DRIVE_SUPPORT) #include "usb_flashdrive/Sd2Card_FlashDrive.h" -#elif ENABLED(SDIO_SUPPORT) +#endif + +#if NEED_SD2CARD_SDIO #include "Sd2Card_sdio.h" -#else +#elif NEED_SD2CARD_SPI #include "Sd2Card.h" #endif @@ -47,6 +49,7 @@ //============================================================================== // SdVolume class + /** * \brief Cache for an SD data block */ @@ -84,14 +87,14 @@ class SdVolume { * Initialize a FAT volume. Try partition one first then try super * floppy format. * - * \param[in] dev The Sd2Card where the volume is located. + * \param[in] dev The DiskIODriver where the volume is located. * * \return true for success, false for failure. * Reasons for failure include not finding a valid partition, not finding * a valid FAT file system or an I/O error. */ - bool init(Sd2Card *dev) { return init(dev, 1) ? true : init(dev, 0); } - bool init(Sd2Card *dev, uint8_t part); + bool init(DiskIODriver *dev) { return init(dev, 1) || init(dev, 0); } + bool init(DiskIODriver *dev, uint8_t part); // inline functions that return volume info uint8_t blocksPerCluster() const { return blocksPerCluster_; } //> \return The volume's cluster size in blocks. @@ -112,10 +115,10 @@ class SdVolume { uint32_t rootDirStart() const { return rootDirStart_; } /** - * Sd2Card object for this volume - * \return pointer to Sd2Card object. + * DiskIODriver object for this volume + * \return pointer to DiskIODriver object. */ - Sd2Card* sdCard() { return sdCard_; } + DiskIODriver* sdCard() { return sdCard_; } /** * Debug access to FAT table @@ -138,13 +141,13 @@ class SdVolume { #if USE_MULTIPLE_CARDS cache_t cacheBuffer_; // 512 byte cache for device blocks uint32_t cacheBlockNumber_; // Logical number of block in the cache - Sd2Card *sdCard_; // Sd2Card object for cache + DiskIODriver *sdCard_; // DiskIODriver object for cache bool cacheDirty_; // cacheFlush() will write block if true uint32_t cacheMirrorBlock_; // block number for mirror FAT #else static cache_t cacheBuffer_; // 512 byte cache for device blocks static uint32_t cacheBlockNumber_; // Logical number of block in the cache - static Sd2Card *sdCard_; // Sd2Card object for cache + static DiskIODriver *sdCard_; // DiskIODriver object for cache static bool cacheDirty_; // cacheFlush() will write block if true static uint32_t cacheMirrorBlock_; // block number for mirror FAT #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 07a57cc658..a54884bec1 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -120,7 +120,16 @@ uint8_t CardReader::workDirDepth; #endif // SDCARD_SORT_ALPHA -Sd2Card CardReader::sd2card; +#if SHARED_VOLUME_IS(USB_FLASH_DRIVE) || ENABLED(USB_FLASH_DRIVE_SUPPORT) + DiskIODriver_USBFlash CardReader::media_usbFlashDrive; +#endif +#if NEED_SD2CARD_SDIO + DiskIODriver_SDIO CardReader::media_sdio; +#elif NEED_SD2CARD_SPI + DiskIODriver_SPI_SD CardReader::media_sd_spi; +#endif + +DiskIODriver* CardReader::driver = nullptr; SdVolume CardReader::volume; SdFile CardReader::file; @@ -133,6 +142,16 @@ SdFile CardReader::file; uint32_t CardReader::filesize, CardReader::sdpos; CardReader::CardReader() { + changeMedia(& + #if SHARED_VOLUME_IS(SD_ONBOARD) + media_sd_spi + #elif SHARED_VOLUME_IS(USB_FLASH_DRIVE) || ENABLED(USB_FLASH_DRIVE_SUPPORT) + media_usbFlashDrive + #else + TERN(SDIO_SUPPORT, media_sdio, media_sd_spi) + #endif + ); + #if ENABLED(SDCARD_SORT_ALPHA) sort_count = 0; #if ENABLED(SDSORT_GCODE) @@ -383,12 +402,12 @@ void CardReader::mount() { flag.mounted = false; if (root.isOpen()) root.close(); - if (!sd2card.init(SD_SPI_SPEED, SDSS) + if (!driver->init(SD_SPI_SPEED, SDSS) #if defined(LCD_SDSS) && (LCD_SDSS != SDSS) - && !sd2card.init(SD_SPI_SPEED, LCD_SDSS) + && !driver->init(SD_SPI_SPEED, LCD_SDSS) #endif ) SERIAL_ECHO_MSG(STR_SD_INIT_FAIL); - else if (!volume.init(&sd2card)) + else if (!volume.init(driver)) SERIAL_ERROR_MSG(STR_SD_VOL_INIT_FAIL); else if (!root.openRoot(&volume)) SERIAL_ERROR_MSG(STR_SD_OPENROOT_FAIL); diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index f1002e1dab..5fdd1222ae 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -42,6 +42,29 @@ extern const char M23_STR[], M24_STR[]; #define MAXPATHNAMELENGTH (1 + (MAXDIRNAMELENGTH + 1) * (MAX_DIR_DEPTH) + 1 + FILENAME_LENGTH) // "/" + N * ("ADIRNAME/") + "filename.ext" #include "SdFile.h" +#include "disk_io_driver.h" + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) + #include "usb_flashdrive/Sd2Card_FlashDrive.h" +#endif + +#if NEED_SD2CARD_SDIO + #include "Sd2Card_sdio.h" +#elif NEED_SD2CARD_SPI + #include "Sd2Card.h" +#endif + +#if ENABLED(MULTI_VOLUME) + #define SV_SD_ONBOARD 1 + #define SV_USB_FLASH_DRIVE 2 + #define _VOLUME_ID(N) _CAT(SV_, N) + #define SHARED_VOLUME_IS(N) (DEFAULT_SHARED_VOLUME == _VOLUME_ID(N)) + #if !SHARED_VOLUME_IS(SD_ONBOARD) && !SHARED_VOLUME_IS(USB_FLASH_DRIVE) + #error "DEFAULT_SHARED_VOLUME must be either SD_ONBOARD or USB_FLASH_DRIVE." + #endif +#else + #define SHARED_VOLUME_IS(...) 0 +#endif typedef struct { bool saving:1, @@ -80,6 +103,8 @@ public: CardReader(); + static void changeMedia(DiskIODriver *_driver) { driver = _driver; } + static SdFile getroot() { return root; } static void mount(); @@ -171,7 +196,8 @@ public: static inline int16_t read(void *buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } static inline int16_t write(void *buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } - static Sd2Card& getSd2Card() { return sd2card; } + // TODO: rename to diskIODriver() + static DiskIODriver* diskIODriver() { return driver; } #if ENABLED(AUTO_REPORT_SD_STATUS) // @@ -181,6 +207,15 @@ public: static AutoReporter auto_reporter; #endif + #if SHARED_VOLUME_IS(USB_FLASH_DRIVE) || ENABLED(USB_FLASH_DRIVE_SUPPORT) + static DiskIODriver_USBFlash media_usbFlashDrive; + #endif + #if NEED_SD2CARD_SDIO + static DiskIODriver_SDIO media_sdio; + #elif NEED_SD2CARD_SPI + static DiskIODriver_SPI_SD media_sd_spi; + #endif + private: // // Working directory and parents @@ -236,7 +271,7 @@ private: #if ENABLED(SDSORT_DYNAMIC_RAM) static uint8_t *isDir; #elif ENABLED(SDSORT_CACHE_NAMES) || DISABLED(SDSORT_USES_STACK) - static uint8_t isDir[(SDSORT_LIMIT+7)>>3]; + static uint8_t isDir[(SDSORT_LIMIT + 7) >> 3]; #endif #endif @@ -244,7 +279,7 @@ private: #endif // SDCARD_SORT_ALPHA - static Sd2Card sd2card; + static DiskIODriver *driver; static SdVolume volume; static SdFile file; @@ -275,7 +310,7 @@ private: }; #if ENABLED(USB_FLASH_DRIVE_SUPPORT) - #define IS_SD_INSERTED() Sd2Card::isInserted() + #define IS_SD_INSERTED() DiskIODriver_USBFlash::isInserted() #elif PIN_EXISTS(SD_DETECT) #define IS_SD_INSERTED() (READ(SD_DETECT_PIN) == SD_DETECT_STATE) #else diff --git a/Marlin/src/sd/disk_io_driver.h b/Marlin/src/sd/disk_io_driver.h new file mode 100644 index 0000000000..73c12efcfa --- /dev/null +++ b/Marlin/src/sd/disk_io_driver.h @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +/** + * DiskIO Interace + * + * Interface for low level disk io + */ +class DiskIODriver { +public: + /** + * Initialize an SD flash memory card with default clock rate and chip + * select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + * + * \return true for success or false for failure. + */ + virtual bool init(const uint8_t sckRateID, const pin_t chipSelectPin) = 0; //TODO: only for SPI + + /** + * Read a card's CSD register. The CSD contains Card-Specific Data that + * provides information regarding access to the card's contents. + * + * \param[out] csd pointer to area for returned data. + * + * \return true for success or false for failure. + */ + virtual bool readCSD(csd_t* csd) = 0; + + virtual bool readStart(const uint32_t block) = 0; + virtual bool readData(uint8_t* dst) = 0; + virtual bool readStop() = 0; + + virtual bool writeStart(const uint32_t block, const uint32_t) = 0; + virtual bool writeData(const uint8_t* src) = 0; + virtual bool writeStop() = 0; + + virtual bool readBlock(uint32_t block, uint8_t* dst) = 0; + virtual bool writeBlock(uint32_t blockNumber, const uint8_t* src) = 0; + + virtual uint32_t cardSize() = 0; + + virtual bool isReady() = 0; + + virtual void idle() = 0; +}; diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index dc9efcb672..1975418415 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -121,7 +121,7 @@ static enum { uint32_t lun0_capacity; #endif -bool Sd2Card::usbStartup() { +bool DiskIODriver_USBFlash::usbStartup() { if (state <= DO_STARTUP) { SERIAL_ECHOPGM("Starting USB host..."); if (!UHS_START) { @@ -147,7 +147,7 @@ bool Sd2Card::usbStartup() { // the USB library to monitor for such events. This function also takes care // of initializing the USB library for the first time. -void Sd2Card::idle() { +void DiskIODriver_USBFlash::idle() { usb.Task(); const uint8_t task_state = usb.getUsbTaskState(); @@ -258,16 +258,16 @@ void Sd2Card::idle() { // Marlin calls this function to check whether an USB drive is inserted. // This is equivalent to polling the SD_DETECT when using SD cards. -bool Sd2Card::isInserted() { +bool DiskIODriver_USBFlash::isInserted() { return state == MEDIA_READY; } -bool Sd2Card::isReady() { - return state > DO_STARTUP; +bool DiskIODriver_USBFlash::isReady() { + return state > DO_STARTUP && usb.getUsbTaskState() == UHS_STATE(RUNNING); } // Marlin calls this to initialize an SD card once it is inserted. -bool Sd2Card::init(const uint8_t, const pin_t) { +bool DiskIODriver_USBFlash::init(const uint8_t, const pin_t) { if (!isInserted()) return false; #if USB_DEBUG >= 1 @@ -286,7 +286,7 @@ bool Sd2Card::init(const uint8_t, const pin_t) { } // Returns the capacity of the card in blocks. -uint32_t Sd2Card::cardSize() { +uint32_t DiskIODriver_USBFlash::cardSize() { if (!isInserted()) return false; #if USB_DEBUG < 3 const uint32_t @@ -295,7 +295,7 @@ uint32_t Sd2Card::cardSize() { return lun0_capacity; } -bool Sd2Card::readBlock(uint32_t block, uint8_t *dst) { +bool DiskIODriver_USBFlash::readBlock(uint32_t block, uint8_t *dst) { if (!isInserted()) return false; #if USB_DEBUG >= 3 if (block >= lun0_capacity) { @@ -309,7 +309,7 @@ bool Sd2Card::readBlock(uint32_t block, uint8_t *dst) { return bulk.Read(0, block, 512, 1, dst) == 0; } -bool Sd2Card::writeBlock(uint32_t block, const uint8_t *src) { +bool DiskIODriver_USBFlash::writeBlock(uint32_t block, const uint8_t *src) { if (!isInserted()) return false; #if USB_DEBUG >= 3 if (block >= lun0_capacity) { diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index 320678d091..3390bc51be 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -27,6 +27,7 @@ */ #include "../SdFatConfig.h" #include "../SdInfo.h" +#include "../disk_io_driver.h" #if DISABLED(USE_OTG_USB_HOST) /** @@ -46,7 +47,7 @@ #endif #endif -class Sd2Card { +class DiskIODriver_USBFlash : public DiskIODriver { private: uint32_t pos; @@ -54,25 +55,26 @@ class Sd2Card { public: static bool usbStartup(); - - bool init(const uint8_t sckRateID=0, const pin_t chipSelectPin=TERN(USE_OTG_USB_HOST, 0, SD_CHIP_SELECT_PIN)); - - static void idle(); - - inline bool readStart(const uint32_t block) { pos = block; return isReady(); } - inline bool readData(uint8_t *dst) { return readBlock(pos++, dst); } - inline bool readStop() const { return true; } - - inline bool writeStart(const uint32_t block, const uint32_t) { pos = block; return isReady(); } - inline bool writeData(uint8_t *src) { return writeBlock(pos++, src); } - inline bool writeStop() const { return true; } - - bool readBlock(uint32_t block, uint8_t *dst); - bool writeBlock(uint32_t blockNumber, const uint8_t *src); - - bool readCSD(csd_t*) { return true; } - - uint32_t cardSize(); static bool isInserted(); - bool isReady(); + + bool init(const uint8_t sckRateID=0, const pin_t chipSelectPin=TERN(USE_OTG_USB_HOST, 0, SD_CHIP_SELECT_PIN)) override; + + inline bool readCSD(csd_t*) override { return true; } + + inline bool readStart(const uint32_t block) override { pos = block; return isReady(); } + inline bool readData(uint8_t *dst) override { return readBlock(pos++, dst); } + inline bool readStop() override { return true; } + + inline bool writeStart(const uint32_t block, const uint32_t) override { pos = block; return isReady(); } + inline bool writeData(const uint8_t *src) override { return writeBlock(pos++, src); } + inline bool writeStop() override { return true; } + + bool readBlock(uint32_t block, uint8_t *dst) override; + bool writeBlock(uint32_t blockNumber, const uint8_t *src) override; + + uint32_t cardSize() override; + + bool isReady() override; + + void idle() override; }; From e26eebfb2fc2ca1013c5d0e01d4d491b17c638ae Mon Sep 17 00:00:00 2001 From: Marcio T Date: Tue, 13 Apr 2021 17:31:12 -0600 Subject: [PATCH 1290/1370] Enhance and fix FTDI Eve Touch UI (#21607) --- .../ftdi_eve_touch_ui/language/language_en.h | 1 + .../screens/bed_mesh_edit_screen.cpp | 20 ++++++-- .../screens/bed_mesh_edit_screen.h | 3 +- .../screens/bed_mesh_view_screen.cpp | 4 +- .../screens/move_axis_screen.cpp | 11 ++++- .../screens/move_axis_screen.h | 1 + .../ftdi_eve_touch_ui/screens/screen_data.h | 1 + .../screens/status_screen.cpp | 4 +- .../screens/z_offset_screen.cpp | 46 ++++++++++++++++++- .../screens/z_offset_screen.h | 8 ++++ 10 files changed, 86 insertions(+), 13 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index c34d5b7756..9de9623e19 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -147,6 +147,7 @@ namespace Language_en { PROGMEM Language_Str MSG_PROBE_BED = u8"Probe Mesh"; PROGMEM Language_Str MSG_SHOW_MESH = u8"View Mesh"; PROGMEM Language_Str MSG_PRINT_TEST = u8"Print Test"; + PROGMEM Language_Str MSG_MOVE_Z_TO_TOP = u8"Raise Z to Top"; #if ENABLED(TOUCH_UI_LULZBOT_BIO) PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp index 01d4d1428b..94e43bdec1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp @@ -30,7 +30,7 @@ using namespace Theme; using namespace ExtUI; constexpr static BedMeshEditScreenData &mydata = screen_data.BedMeshEditScreen; -constexpr static float gaugeThickness = 0.25; +constexpr static float gaugeThickness = 0.1; #if ENABLED(TOUCH_UI_PORTRAIT) #define GRID_COLS 3 @@ -54,20 +54,29 @@ constexpr static float gaugeThickness = 0.25; #define SAVE_POS BTN_POS(5,5), BTN_SIZE(1,1) #endif +constexpr uint8_t NONE = 255; + static float meshGetter(uint8_t x, uint8_t y, void*) { xy_uint8_t pos; pos.x = x; pos.y = y; - return ExtUI::getMeshPoint(pos) + (mydata.highlight.x != -1 && mydata.highlight == pos ? mydata.zAdjustment : 0); + return ExtUI::getMeshPoint(pos) + (mydata.highlight.x != NONE && mydata.highlight == pos ? mydata.zAdjustment : 0); } void BedMeshEditScreen::onEntry() { mydata.needSave = false; - mydata.highlight.x = -1; + mydata.highlight.x = NONE; mydata.zAdjustment = 0; + mydata.savedMeshLevelingState = ExtUI::getLevelingActive(); + mydata.savedEndstopState = ExtUI::getSoftEndstopState(); BaseScreen::onEntry(); } +void BedMeshEditScreen::onExit() { + ExtUI::setLevelingActive(mydata.savedMeshLevelingState); + ExtUI::setSoftEndstopState(mydata.savedEndstopState); +} + float BedMeshEditScreen::getHighlightedValue() { const float val = ExtUI::getMeshPoint(mydata.highlight); return (ISNAN(val) ? 0 : val) + mydata.zAdjustment; @@ -80,12 +89,13 @@ void BedMeshEditScreen::setHighlightedValue(float value) { void BedMeshEditScreen::moveToHighlightedValue() { if (ExtUI::getMeshValid()) { ExtUI::setLevelingActive(true); + ExtUI::setSoftEndstopState(false); ExtUI::moveToMeshPoint(mydata.highlight, gaugeThickness + mydata.zAdjustment); } } void BedMeshEditScreen::adjustHighlightedValue(float increment) { - if(mydata.highlight.x != -1) { + if (mydata.highlight.x != NONE) { mydata.zAdjustment += increment; moveToHighlightedValue(); mydata.needSave = true; @@ -114,7 +124,7 @@ void BedMeshEditScreen::drawHighlightedPointValue() { .colors(normal_btn) .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) .font(font_small); - if(mydata.highlight.x != -1) + if (mydata.highlight.x != NONE) draw_adjuster(cmd, Z_VALUE_POS, 3, getHighlightedValue(), GET_TEXT_F(MSG_UNITS_MM), 4, 3); cmd.colors(mydata.needSave ? normal_btn : action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_BACK)) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.h index 62121941b1..b856b9b33b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.h @@ -25,7 +25,7 @@ #define FTDI_BED_MESH_EDIT_SCREEN_CLASS BedMeshEditScreen struct BedMeshEditScreenData { - bool needSave; + bool needSave, savedMeshLevelingState, savedEndstopState; xy_uint8_t highlight; float zAdjustment; }; @@ -41,6 +41,7 @@ class BedMeshEditScreen : public BedMeshBase, public CachedScreen { + private: + static void move(float inc); + static void runWizard(); public: + static void onEntry(); static void onRedraw(draw_mode_t); static bool onTouchHeld(uint8_t tag); }; From 326b1c122506d864b18f146e95cb47485bf1b364 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 13 Apr 2021 21:34:21 -0500 Subject: [PATCH 1291/1370] Misc. formatting, serial out --- .../shared/cpu_exception/exception_arm.cpp | 8 +- Marlin/src/core/bug_on.h | 4 +- Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp | 2 +- .../extui/lib/anycubic_chiron/FileNavigator.h | 41 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 1574 ++++++++--------- .../extui/lib/anycubic_chiron/chiron_tft.h | 76 +- .../lib/anycubic_chiron/chiron_tft_defs.h | 6 - 7 files changed, 855 insertions(+), 856 deletions(-) diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp index ae9600038a..124f0b7c43 100644 --- a/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp +++ b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp @@ -320,8 +320,8 @@ void hook_cpu_exceptions() { // So we'll simply mask the top 8 bits of the first handler as an hint of being in the flash or not -that's poor and will // probably break if the flash happens to be more than 128MB, but in this case, we are not magician, we need help from outside. - unsigned long * vecAddr = (unsigned long*)get_vtor(); - SERIAL_ECHO("Vector table addr: "); + unsigned long *vecAddr = (unsigned long*)get_vtor(); + SERIAL_ECHOPGM("Vector table addr: "); SERIAL_PRINTLN(get_vtor(), HEX); #ifdef VECTOR_TABLE_SIZE @@ -348,7 +348,7 @@ void hook_cpu_exceptions() { // 128 bytes alignement is required for writing the VTOR register alignas(128) static unsigned long vectable[VECTOR_TABLE_SENTINEL]; - SERIAL_ECHO("Detected vector table size: "); + SERIAL_ECHOPGM("Detected vector table size: "); SERIAL_PRINTLN(vec_size, HEX); #endif @@ -372,7 +372,7 @@ void hook_cpu_exceptions() { HW_REG(0xE000ED08) = (unsigned long)vectable | _BV32(29); // 29th bit is for telling the CPU the table is now in SRAM (should be present already) - SERIAL_ECHOLN("Installed fault handlers"); + SERIAL_ECHOLNPGM("Installed fault handlers"); #endif } diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h index 3c9dec0f96..cc745f259b 100644 --- a/Marlin/src/core/bug_on.h +++ b/Marlin/src/core/bug_on.h @@ -28,11 +28,11 @@ // This is used like SERIAL_ECHOPAIR, that is: a key-value call of the local variables you want // to dump to the serial port before stopping the CPU. // \/ Don't replace by SERIAL_ECHOPAIR since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building - #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLN(": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) + #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLNPGM(": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) #elif ENABLED(MARLIN_DEV_MODE) // Don't stop the CPU here, but at least dump the bug on the serial port // \/ Don't replace by SERIAL_ECHOPAIR since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building - #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLN(": BUG!"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) + #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLNPGM(": BUG!"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) #else // Release mode, let's ignore the bug #define BUG_ON(V...) NOOP diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp index 8ba19216b1..7b4c470afe 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp @@ -88,7 +88,7 @@ static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = { }; uint8_t u8g_dev_ssd1309_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - switch(msg) { + switch (msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1309_128x64_init_seq); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h index 8e03614a46..c709415879 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h @@ -35,22 +35,27 @@ using namespace ExtUI; namespace Anycubic { - class FileNavigator { - public: - FileNavigator(); - void reset(); - void getFiles(uint16_t); - void upDIR(); - void changeDIR(char *); - void sendFile(); - void refresh(); - char * getCurrentFolderName(); - private: - static FileList filelist; - static char currentfoldername[MAX_PATH_LEN]; - static uint16_t lastindex; - static uint8_t folderdepth; - static uint16_t currentindex; - }; - extern FileNavigator filenavigator; + +class FileNavigator { + public: + FileNavigator(); + void reset(); + void getFiles(uint16_t, panel_type_t, uint8_t filesneeded=4); + void upDIR(); + void changeDIR(const char *); + void sendFile(panel_type_t); + void refresh(); + void skiptofileindex(uint16_t); + + static FileList filelist; + private: + static uint16_t lastpanelindex; + static uint16_t currentindex; + static uint8_t currentfolderdepth; + static uint16_t currentfolderindex[MAX_FOLDER_DEPTH]; + static char currentfoldername[MAX_PATH_LEN]; +}; + +extern FileNavigator filenavigator; + } diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 5eb8611b5e..065e4e1789 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -43,843 +43,843 @@ namespace Anycubic { - printer_state_t ChironTFT::printer_state; - paused_state_t ChironTFT::pause_state; - heater_state_t ChironTFT::hotend_state; - heater_state_t ChironTFT::hotbed_state; - xy_uint8_t ChironTFT::selectedmeshpoint; - char ChironTFT::selectedfile[MAX_PATH_LEN]; - char ChironTFT::panel_command[MAX_CMND_LEN]; - uint8_t ChironTFT::command_len; - float ChironTFT::live_Zoffset; - file_menu_t ChironTFT::file_menu; +printer_state_t ChironTFT::printer_state; +paused_state_t ChironTFT::pause_state; +heater_state_t ChironTFT::hotend_state; +heater_state_t ChironTFT::hotbed_state; +xy_uint8_t ChironTFT::selectedmeshpoint; +char ChironTFT::selectedfile[MAX_PATH_LEN]; +char ChironTFT::panel_command[MAX_CMND_LEN]; +uint8_t ChironTFT::command_len; +float ChironTFT::live_Zoffset; +file_menu_t ChironTFT::file_menu; - ChironTFT Chiron; +ChironTFT Chiron; - ChironTFT::ChironTFT(){} +ChironTFT::ChironTFT(){} - void ChironTFT::Startup() { - selectedfile[0] = '\0'; - panel_command[0] = '\0'; - command_len = 0; - printer_state = AC_printer_idle; - pause_state = AC_paused_idle; - hotend_state = AC_heater_off; - hotbed_state = AC_heater_off; - live_Zoffset = 0.0; - file_menu = AC_menu_file; +void ChironTFT::Startup() { + selectedfile[0] = '\0'; + panel_command[0] = '\0'; + command_len = 0; + printer_state = AC_printer_idle; + pause_state = AC_paused_idle; + hotend_state = AC_heater_off; + hotbed_state = AC_heater_off; + live_Zoffset = 0.0; + file_menu = AC_menu_file; - // Setup pins for powerloss detection - // Two IO pins are connected on the Trigorilla Board - // On a power interruption the OUTAGECON_PIN goes low. + // Setup pins for powerloss detection + // Two IO pins are connected on the Trigorilla Board + // On a power interruption the OUTAGECON_PIN goes low. - #if ENABLED(POWER_LOSS_RECOVERY) - OUT_WRITE(OUTAGECON_PIN, HIGH); - #endif + #if ENABLED(POWER_LOSS_RECOVERY) + OUT_WRITE(OUTAGECON_PIN, HIGH); + #endif - // Filament runout is handled by Marlin settings in Configuration.h - // opt_set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. - // opt_enable FIL_RUNOUT_PULLUP + // Filament runout is handled by Marlin settings in Configuration.h + // opt_set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. + // opt_enable FIL_RUNOUT_PULLUP - TFTSer.begin(115200); + TFTSer.begin(115200); - // Signal Board has reset - SendtoTFTLN(AC_msg_main_board_has_reset); + // Signal Board has reset + SendtoTFTLN(AC_msg_main_board_has_reset); - safe_delay(200); + safe_delay(200); - // Enable leveling and Disable end stops during print - // as Z home places nozzle above the bed so we need to allow it past the end stops - injectCommands_P(AC_cmnd_enable_leveling); + // Enable leveling and Disable end stops during print + // as Z home places nozzle above the bed so we need to allow it past the end stops + injectCommands_P(AC_cmnd_enable_leveling); - // Startup tunes are defined in Tunes.h - //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1); - PlayTune(BEEPER_PIN, GB_PowerOn, 1); - #if ACDEBUGLEVEL - SERIAL_ECHOLNPAIR("AC Debug Level ", ACDEBUGLEVEL); - #endif - SendtoTFTLN(AC_msg_ready); + // Startup tunes are defined in Tunes.h + //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1); + PlayTune(BEEPER_PIN, GB_PowerOn, 1); + #if ACDEBUGLEVEL + SERIAL_ECHOLNPAIR("AC Debug Level ", ACDEBUGLEVEL); + #endif + SendtoTFTLN(AC_msg_ready); +} + +void ChironTFT::IdleLoop() { + if (ReadTFTCommand()) { + ProcessPanelRequest(); + command_len = 0; } + CheckHeaters(); +} - void ChironTFT::IdleLoop() { - if (ReadTFTCommand()) { - ProcessPanelRequest(); - command_len = 0; - } - CheckHeaters(); +void ChironTFT::PrinterKilled(PGM_P error,PGM_P component) { + SendtoTFTLN(AC_msg_kill_lcd); + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("PrinterKilled()\nerror: ", error , "\ncomponent: ", component); + #endif +} + +void ChironTFT::MediaEvent(media_event_t event) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("ProcessMediaStatus() ", event); + #endif + switch (event) { + case AC_media_inserted: + SendtoTFTLN(AC_msg_sd_card_inserted); + break; + + case AC_media_removed: + SendtoTFTLN(AC_msg_sd_card_removed); + break; + + case AC_media_error: + SendtoTFTLN(AC_msg_no_sd_card); + break; } +} - void ChironTFT::PrinterKilled(PGM_P error,PGM_P component) { - SendtoTFTLN(AC_msg_kill_lcd); - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("PrinterKilled()\nerror: ", error , "\ncomponent: ", component); - #endif +void ChironTFT::TimerEvent(timer_event_t event) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("TimerEvent() ", event); + SERIAL_ECHOLNPAIR("Printer State: ", printer_state); + #endif + + switch (event) { + case AC_timer_started: { + live_Zoffset = 0.0; // reset print offset + setSoftEndstopState(false); // disable endstops to print + printer_state = AC_printer_printing; + SendtoTFTLN(AC_msg_print_from_sd_card); + } break; + + case AC_timer_paused: { + printer_state = AC_printer_paused; + pause_state = AC_paused_idle; + SendtoTFTLN(AC_msg_paused); + } break; + + case AC_timer_stopped: { + if (printer_state != AC_printer_idle) { + printer_state = AC_printer_stopping; + SendtoTFTLN(AC_msg_print_complete); + } + setSoftEndstopState(true); // enable endstops + } break; } +} - void ChironTFT::MediaEvent(media_event_t event) { - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("ProcessMediaStatus() ", event); - #endif - switch (event) { - case AC_media_inserted: - SendtoTFTLN(AC_msg_sd_card_inserted); - break; +void ChironTFT::FilamentRunout() { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("FilamentRunout() printer_state ", printer_state); + #endif + // 1 Signal filament out + SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); + //printer_state = AC_printer_filament_out; + PlayTune(BEEPER_PIN, FilamentOut, 1); +} - case AC_media_removed: - SendtoTFTLN(AC_msg_sd_card_removed); - break; - - case AC_media_error: - SendtoTFTLN(AC_msg_no_sd_card); - break; - } - } - - void ChironTFT::TimerEvent(timer_event_t event) { - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("TimerEvent() ", event); - SERIAL_ECHOLNPAIR("Printer State: ", printer_state); - #endif - - switch (event) { - case AC_timer_started: { - live_Zoffset = 0.0; // reset print offset - setSoftEndstopState(false); // disable endstops to print - printer_state = AC_printer_printing; - SendtoTFTLN(AC_msg_print_from_sd_card); - } break; - - case AC_timer_paused: { +void ChironTFT::ConfirmationRequest(const char * const msg) { + // M108 continue + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("ConfirmationRequest() ", msg, " printer_state:", printer_state); + #endif + switch (printer_state) { + case AC_printer_pausing: { + if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 || strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0) { + SendtoTFTLN(AC_msg_paused); // enable continue button printer_state = AC_printer_paused; - pause_state = AC_paused_idle; + } + } break; + + case AC_printer_resuming_from_power_outage: + case AC_printer_printing: + case AC_printer_paused: { + // Heater timout, send acknowledgement + if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0) { + pause_state = AC_paused_heater_timed_out; + SendtoTFTLN(AC_msg_paused); // enable continue button + PlayTune(BEEPER_PIN,Heater_Timedout,1); + } + // Reheat finished, send acknowledgement + else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0) { + pause_state = AC_paused_idle; + SendtoTFTLN(AC_msg_paused); // enable continue button + } + // Filament Purging, send acknowledgement enter run mode + else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0) { + pause_state = AC_paused_purging_filament; + SendtoTFTLN(AC_msg_paused); // enable continue button + } + } break; + default: + break; + } +} + +void ChironTFT::StatusChange(const char * const msg) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("StatusChange() ", msg); + SERIAL_ECHOLNPAIR("printer_state:", printer_state); + #endif + bool msg_matched = false; + // The only way to get printer status is to parse messages + // Use the state to minimise the work we do here. + switch (printer_state) { + case AC_printer_probing: { + // If probing completes ok save the mesh and park + // Ignore the custom machine name + if (strcmp_P(msg + strlen(CUSTOM_MACHINE_NAME), MARLIN_msg_ready) == 0) { + injectCommands_P(PSTR("M500\nG27")); + SendtoTFTLN(AC_msg_probing_complete); + printer_state = AC_printer_idle; + msg_matched = true; + } + // If probing fails dont save the mesh raise the probe above the bad point + if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0) { + PlayTune(BEEPER_PIN, BeepBeepBeeep, 1); + injectCommands_P(PSTR("G1 Z50 F500")); + SendtoTFTLN(AC_msg_probing_complete); + printer_state = AC_printer_idle; + msg_matched = true; + } + } break; + + case AC_printer_printing: { + if (strcmp_P(msg, MARLIN_msg_reheating) == 0) { + SendtoTFTLN(AC_msg_paused); // enable continue button + msg_matched = true; + } + } break; + + case AC_printer_pausing: { + if (strcmp_P(msg, MARLIN_msg_print_paused) == 0) { SendtoTFTLN(AC_msg_paused); - } break; + printer_state = AC_printer_paused; + pause_state = AC_paused_idle; + msg_matched = true; + } + } break; - case AC_timer_stopped: { - if (printer_state != AC_printer_idle) { - printer_state = AC_printer_stopping; - SendtoTFTLN(AC_msg_print_complete); - } - setSoftEndstopState(true); // enable endstops - } break; + case AC_printer_stopping: { + if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0) { + SendtoTFTLN(AC_msg_stop); + printer_state = AC_printer_idle; + msg_matched = true; + } + } break; + default: + break; + } + + // If not matched earlier see if this was a heater message + if (!msg_matched) { + if (strcmp_P(msg, MARLIN_msg_extruder_heating) == 0) { + SendtoTFTLN(AC_msg_nozzle_heating); + hotend_state = AC_heater_temp_set; + } + else if (strcmp_P(msg, MARLIN_msg_bed_heating) == 0) { + SendtoTFTLN(AC_msg_bed_heating); + hotbed_state = AC_heater_temp_set; } } +} - void ChironTFT::FilamentRunout() { - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("FilamentRunout() printer_state ", printer_state); +void ChironTFT::PowerLossRecovery() { + printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover. + PlayTune(BEEPER_PIN, SOS, 1); + SERIAL_ECHOLNPGM("Resuming from power outage..."); + SERIAL_ECHOLNPGM("Select SD file then press resume"); +} + +void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEM string to the panel + #if ACDEBUG(AC_SOME) + SERIAL_ECHOPGM_P(str); + #endif + while (const char c = pgm_read_byte(str++)) TFTSer.write(c); +} + +void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { + if (str) { + #if ACDEBUG(AC_SOME) + SERIAL_ECHOPGM("> "); + #endif + SendtoTFT(str); + #if ACDEBUG(AC_SOME) + SERIAL_EOL(); #endif - // 1 Signal filament out - SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); - //printer_state = AC_printer_filament_out; - PlayTune(BEEPER_PIN, FilamentOut, 1); } + TFTSer.println(); +} - void ChironTFT::ConfirmationRequest(const char * const msg) { - // M108 continue - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("ConfirmationRequest() ", msg, " printer_state:", printer_state); - #endif - switch (printer_state) { - case AC_printer_pausing: { - if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 || strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0) { - SendtoTFTLN(AC_msg_paused); // enable continue button - printer_state = AC_printer_paused; - } - } break; - - case AC_printer_resuming_from_power_outage: - case AC_printer_printing: - case AC_printer_paused: { - // Heater timout, send acknowledgement - if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0) { - pause_state = AC_paused_heater_timed_out; - SendtoTFTLN(AC_msg_paused); // enable continue button - PlayTune(BEEPER_PIN,Heater_Timedout,1); - } - // Reheat finished, send acknowledgement - else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0) { - pause_state = AC_paused_idle; - SendtoTFTLN(AC_msg_paused); // enable continue button - } - // Filament Purging, send acknowledgement enter run mode - else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0) { - pause_state = AC_paused_purging_filament; - SendtoTFTLN(AC_msg_paused); // enable continue button - } - } break; - default: +bool ChironTFT::ReadTFTCommand() { + bool command_ready = false; + while (TFTSer.available() > 0 && command_len < MAX_CMND_LEN) { + panel_command[command_len] = TFTSer.read(); + if (panel_command[command_len] == '\n') { + command_ready = true; break; } + command_len++; } - void ChironTFT::StatusChange(const char * const msg) { - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("StatusChange() ", msg); - SERIAL_ECHOLNPAIR("printer_state:", printer_state); + if (command_ready) { + panel_command[command_len] = 0x00; + #if ACDEBUG(AC_ALL) + SERIAL_ECHOLNPAIR("< ", panel_command); #endif - bool msg_matched = false; - // The only way to get printer status is to parse messages - // Use the state to minimise the work we do here. - switch (printer_state) { - case AC_printer_probing: { - // If probing completes ok save the mesh and park - // Ignore the custom machine name - if (strcmp_P(msg + strlen(CUSTOM_MACHINE_NAME), MARLIN_msg_ready) == 0) { - injectCommands_P(PSTR("M500\nG27")); - SendtoTFTLN(AC_msg_probing_complete); - printer_state = AC_printer_idle; - msg_matched = true; - } - // If probing fails dont save the mesh raise the probe above the bad point - if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0) { - PlayTune(BEEPER_PIN, BeepBeepBeeep, 1); - injectCommands_P(PSTR("G1 Z50 F500")); - SendtoTFTLN(AC_msg_probing_complete); - printer_state = AC_printer_idle; - msg_matched = true; - } - } break; + #if ACDEBUG(AC_SOME) + // Ignore status request commands + uint8_t req = atoi(&panel_command[1]); + if (req > 7 && req != 20) { + SERIAL_ECHOLNPAIR("> ", panel_command); + SERIAL_ECHOLNPAIR("printer_state:", printer_state); + } + #endif + } + return command_ready; +} - case AC_printer_printing: { - if (strcmp_P(msg, MARLIN_msg_reheating) == 0) { - SendtoTFTLN(AC_msg_paused); // enable continue button - msg_matched = true; - } - } break; +int8_t ChironTFT::Findcmndpos(const char * buff, char q) { + int8_t pos = 0; + do { if (buff[pos] == q) return pos; } while (++pos < MAX_CMND_LEN); + return -1; +} - case AC_printer_pausing: { - if (strcmp_P(msg, MARLIN_msg_print_paused) == 0) { - SendtoTFTLN(AC_msg_paused); - printer_state = AC_printer_paused; - pause_state = AC_paused_idle; - msg_matched = true; - } - } break; +void ChironTFT::CheckHeaters() { + uint8_t faultDuration = 0; + float temp = 0; - case AC_printer_stopping: { - if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0) { - SendtoTFTLN(AC_msg_stop); - printer_state = AC_printer_idle; - msg_matched = true; - } - } break; - default: + // if the hotend temp is abnormal, confirm state before signalling panel + temp = getActualTemp_celsius(E0); + while (!WITHIN(temp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP)) { + faultDuration++; + if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { + SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp); break; } + delay_ms(500); + temp = getActualTemp_celsius(E0); + } - // If not matched earlier see if this was a heater message - if (!msg_matched) { - if (strcmp_P(msg, MARLIN_msg_extruder_heating) == 0) { - SendtoTFTLN(AC_msg_nozzle_heating); + // If the hotbed temp is abnormal, confirm state before signaling panel + faultDuration = 0; + temp = getActualTemp_celsius(BED); + while (!WITHIN(temp, BED_MINTEMP, BED_MAXTEMP)) { + faultDuration++; + if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { + SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + SERIAL_ECHOLNPAIR("Bed temp abnormal! : ", temp); + break; + } + delay_ms(500); + temp = getActualTemp_celsius(E0); + } + + // Update panel with hotend heater status + if (hotend_state != AC_heater_temp_reached) { + if (WITHIN(getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1)) { + SendtoTFTLN(AC_msg_nozzle_heating_done); + hotend_state = AC_heater_temp_reached; + } + } + + // Update panel with bed heater status + if (hotbed_state != AC_heater_temp_reached) { + if (WITHIN(getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5)) { + SendtoTFTLN(AC_msg_bed_heating_done); + hotbed_state = AC_heater_temp_reached; + } + } +} + +void ChironTFT::SendFileList(int8_t startindex) { + // Respond to panel request for 4 files starting at index + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("## SendFileList ## ", startindex); + #endif + SendtoTFTLN(PSTR("FN ")); + filenavigator.getFiles(startindex); + SendtoTFTLN(PSTR("END")); +} + +void ChironTFT::SelectFile() { + strncpy(selectedfile, panel_command + 4, command_len - 4); + selectedfile[command_len - 5] = '\0'; + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR_F(" Selected File: ",selectedfile); + #endif + switch (selectedfile[0]) { + case '/': // Valid file selected + SendtoTFTLN(AC_msg_sd_file_open_success); + break; + + case '<': // .. (go up folder level) + filenavigator.upDIR(); + SendtoTFTLN(AC_msg_sd_file_open_failed); + SendFileList( 0 ); + break; + default: // enter sub folder + filenavigator.changeDIR(selectedfile); + SendtoTFTLN(AC_msg_sd_file_open_failed); + SendFileList( 0 ); + break; + } +} + +void ChironTFT::InjectCommandandWait(PGM_P cmd) { + //injectCommands_P(cmnd); queue.enqueue_now_P(cmd); + //SERIAL_ECHOLN(PSTR("Inject>")); +} + +void ChironTFT::ProcessPanelRequest() { + // Break these up into logical blocks // as its easier to navigate than one huge switch case! + int8_t req = atoi(&panel_command[1]); + + // Information requests A0 - A8 and A33 + if (req <= 8 || req == 33) PanelInfo(req); + + // Simple Actions A9 - A28 + else if ( req <= 28) PanelAction(req); + + // Process Initiation + else if (req <= 34) PanelProcess(req); + + else SendtoTFTLN(); +} + +void ChironTFT::PanelInfo(uint8_t req) { + // information requests A0-A8 and A33 + switch (req) { + case 0: // A0 Get HOTEND Temp + SendtoTFT(PSTR("A0V ")); + TFTSer.println(getActualTemp_celsius(E0)); + break; + + case 1: // A1 Get HOTEND Target Temp + SendtoTFT(PSTR("A1V ")); + TFTSer.println(getTargetTemp_celsius(E0)); + break; + + case 2: // A2 Get BED Temp + SendtoTFT(PSTR("A2V ")); + TFTSer.println(getActualTemp_celsius(BED)); + break; + + case 3: // A3 Get BED Target Temp + SendtoTFT(PSTR("A3V ")); + TFTSer.println(getTargetTemp_celsius(BED)); + break; + + case 4: // A4 Get FAN Speed + SendtoTFT(PSTR("A4V ")); + TFTSer.println(getActualFan_percent(FAN0)); + break; + + case 5: // A5 Get Current Coordinates + SendtoTFT(PSTR("A5V X: ")); + TFTSer.print(getAxisPosition_mm(X)); + SendtoTFT(PSTR(" Y: ")); + TFTSer.print(getAxisPosition_mm(Y)); + SendtoTFT(PSTR(" Z: ")); + TFTSer.println(getAxisPosition_mm(Z)); + break; + + case 6: // A6 Get printing progress + if (isPrintingFromMedia()) { + SendtoTFT(PSTR("A6V ")); + TFTSer.println(ui8tostr2(getProgress_percent())); + } + else + SendtoTFTLN(PSTR("A6V ---")); + break; + + case 7: { // A7 Get Printing Time + uint32_t time = getProgress_seconds_elapsed() / 60; + SendtoTFT(PSTR("A7V ")); + TFTSer.print(ui8tostr2(time / 60)); + SendtoTFT(PSTR(" H ")); + TFTSer.print(ui8tostr2(time % 60)); + SendtoTFT(PSTR(" M")); + #if ACDEBUG(AC_ALL) + SERIAL_ECHOLNPAIR("Print time ", ui8tostr2(time / 60), ":", ui8tostr2(time % 60)); + #endif + } break; + + case 8: // A8 Get SD Card list A8 S0 + if (!isMediaInserted()) safe_delay(500); + if (!isMediaInserted()) // Make sure the card is removed + SendtoTFTLN(AC_msg_no_sd_card); + else if (panel_command[3] == 'S') + SendFileList( atoi( &panel_command[4] ) ); + break; + + case 33: // A33 Get firmware info + SendtoTFT(PSTR("J33 ")); + SendtoTFTLN(PSTR(SHORT_BUILD_VERSION)); + break; + } +} + +void ChironTFT::PanelAction(uint8_t req) { + switch (req) { + case 9: // A9 Pause SD print + if (isPrintingFromMedia()) { + SendtoTFTLN(AC_msg_pause); + pausePrint(); + printer_state = AC_printer_pausing; + } + else + SendtoTFTLN(AC_msg_stop); + break; + + case 10: // A10 Resume SD Print + if (pause_state == AC_paused_idle || printer_state == AC_printer_resuming_from_power_outage) + resumePrint(); + else + setUserConfirmed(); + break; + + case 11: // A11 Stop SD print + if (isPrintingFromMedia()) { + printer_state = AC_printer_stopping; + stopPrint(); + } + else { + if (printer_state == AC_printer_resuming_from_power_outage) + injectCommands_P(PSTR("M1000 C")); // Cancel recovery + SendtoTFTLN(AC_msg_stop); + printer_state = AC_printer_idle; + } + break; + + case 12: // A12 Kill printer + kill(); // from marlincore.h + break; + + case 13: // A13 Select file + SelectFile(); + break; + + case 14: { // A14 Start Printing + // Allows printer to restart the job if we dont want to recover + if (printer_state == AC_printer_resuming_from_power_outage) { + injectCommands_P(PSTR("M1000 C")); // Cancel recovery + printer_state = AC_printer_idle; + } + #if ACDebugLevel >= 1 + SERIAL_ECHOLNPAIR_F("Print: ", selectedfile); + #endif + // the card library needs a path starting // but the File api doesn't... + char file[MAX_PATH_LEN]; + file[0] = '/'; + strcpy(file + 1, selectedfile); + printFile(file); + SendtoTFTLN(AC_msg_print_from_sd_card); + } break; + + case 15: // A15 Resuming from outage + if (printer_state == AC_printer_resuming_from_power_outage) { + // Need to home here to restore the Z position + injectCommands_P(AC_cmnd_power_loss_recovery); + injectCommands_P(PSTR("M1000")); // home and start recovery + } + break; + + case 16: { // A16 Set HotEnd temp A17 S170 + const float set_Htemp = atof(&panel_command[5]); + hotend_state = set_Htemp ? AC_heater_temp_set : AC_heater_off; + switch ((char)panel_command[4]) { + // Set Temp + case 'S': case 'C': setTargetTemp_celsius(set_Htemp, E0); + } + } break; + + case 17: { // A17 Set bed temp + const float set_Btemp = atof(&panel_command[5]); + hotbed_state = set_Btemp ? AC_heater_temp_set : AC_heater_off; + if (panel_command[4] == 'S') + setTargetTemp_celsius(set_Btemp, BED); + } break; + + case 18: // A18 Set Fan Speed + if (panel_command[4] == 'S') + setTargetFan_percent(atof(&panel_command[5]), FAN0); + break; + + case 19: // A19 Motors off + if (!isPrinting()) { + disable_all_steppers(); // from marlincore.h + SendtoTFTLN(AC_msg_ready); + } + break; + + case 20: // A20 Read/write print speed + if (panel_command[4] == 'S') + setFeedrate_percent(atoi(&panel_command[5])); + else { + SendtoTFT(PSTR("A20V ")); + TFTSer.println(getFeedrate_percent()); + } + break; + + case 21: // A21 Home Axis A21 X + if (!isPrinting()) { + switch ((char)panel_command[4]) { + case 'X': injectCommands_P(PSTR("G28X")); break; + case 'Y': injectCommands_P(PSTR("G28Y")); break; + case 'Z': injectCommands_P(PSTR("G28Z")); break; + case 'C': injectCommands_P(G28_STR); break; + } + } + break; + + case 22: // A22 Move Axis A22 Y +10F3000 + // Ignore request if printing + if (!isPrinting()) { + // setAxisPosition_mm() uses pre defined manual feedrates so ignore the feedrate from the panel + setSoftEndstopState(true); // enable endstops + float newposition = atof(&panel_command[6]); + + #if ACDEBUG(AC_ACTION) + SERIAL_ECHOLNPAIR("Nudge ", AS_CHAR(panel_command[4]), " axis ", newposition); + #endif + + switch (panel_command[4]) { + case 'X': setAxisPosition_mm(getAxisPosition_mm(X) + newposition, X); break; + case 'Y': setAxisPosition_mm(getAxisPosition_mm(Y) + newposition, Y); break; + case 'Z': setAxisPosition_mm(getAxisPosition_mm(Z) + newposition, Z); break; + case 'E': // The only time we get this command is from the filament load/unload menu + // the standard movement is too slow so we will use the load unlod GCode to speed it up a bit + if (canMove(E0) && !commandsInQueue()) + injectCommands_P(newposition > 0 ? AC_cmnd_manual_load_filament : AC_cmnd_manual_unload_filament); + break; + } + } + break; + + case 23: // A23 Preheat PLA + // Ignore request if printing + if (!isPrinting()) { + // Temps defined in configuration.h + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); + SendtoTFTLN(); + hotbed_state = AC_heater_temp_set; hotend_state = AC_heater_temp_set; } - else if (strcmp_P(msg, MARLIN_msg_bed_heating) == 0) { - SendtoTFTLN(AC_msg_bed_heating); - hotbed_state = AC_heater_temp_set; - } - } - } + break; - void ChironTFT::PowerLossRecovery() { - printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover. - PlayTune(BEEPER_PIN, SOS, 1); - SERIAL_ECHOLNPGM("Resuming from power outage..."); - SERIAL_ECHOLNPGM("Select SD file then press resume"); - } - - void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEM string to the panel - #if ACDEBUG(AC_SOME) - SERIAL_ECHOPGM_P(str); - #endif - while (const char c = pgm_read_byte(str++)) TFTSer.write(c); - } - - void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { - if (str) { - #if ACDEBUG(AC_SOME) - SERIAL_ECHOPGM("> "); - #endif - SendtoTFT(str); - #if ACDEBUG(AC_SOME) - SERIAL_EOL(); - #endif - } - TFTSer.println(); - } - - bool ChironTFT::ReadTFTCommand() { - bool command_ready = false; - while (TFTSer.available() > 0 && command_len < MAX_CMND_LEN) { - panel_command[command_len] = TFTSer.read(); - if (panel_command[command_len] == '\n') { - command_ready = true; - break; - } - command_len++; - } - - if (command_ready) { - panel_command[command_len] = 0x00; - #if ACDEBUG(AC_ALL) - SERIAL_ECHOLNPAIR("< ", panel_command); - #endif - #if ACDEBUG(AC_SOME) - // Ignore status request commands - uint8_t req = atoi(&panel_command[1]); - if (req > 7 && req != 20) { - SERIAL_ECHOLNPAIR("> ", panel_command); - SERIAL_ECHOLNPAIR("printer_state:", printer_state); - } - #endif - } - return command_ready; - } - - int8_t ChironTFT::Findcmndpos(const char * buff, char q) { - int8_t pos = 0; - do { if (buff[pos] == q) return pos; } while (++pos < MAX_CMND_LEN); - return -1; - } - - void ChironTFT::CheckHeaters() { - uint8_t faultDuration = 0; - float temp = 0; - - // if the hotend temp is abnormal, confirm state before signalling panel - temp = getActualTemp_celsius(E0); - while (!WITHIN(temp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP)) { - faultDuration++; - if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); - SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp); - break; - } - delay_ms(500); - temp = getActualTemp_celsius(E0); - } - - // If the hotbed temp is abnormal, confirm state before signaling panel - faultDuration = 0; - temp = getActualTemp_celsius(BED); - while (!WITHIN(temp, BED_MINTEMP, BED_MAXTEMP)) { - faultDuration++; - if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); - SERIAL_ECHOLNPAIR("Bed temp abnormal! : ", temp); - break; - } - delay_ms(500); - temp = getActualTemp_celsius(E0); - } - - // Update panel with hotend heater status - if (hotend_state != AC_heater_temp_reached) { - if (WITHIN(getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1)) { - SendtoTFTLN(AC_msg_nozzle_heating_done); - hotend_state = AC_heater_temp_reached; - } - } - - // Update panel with bed heater status - if (hotbed_state != AC_heater_temp_reached) { - if (WITHIN(getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5)) { - SendtoTFTLN(AC_msg_bed_heating_done); - hotbed_state = AC_heater_temp_reached; - } - } - } - - void ChironTFT::SendFileList(int8_t startindex) { - // Respond to panel request for 4 files starting at index - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("## SendFileList ## ", startindex); - #endif - SendtoTFTLN(PSTR("FN ")); - filenavigator.getFiles(startindex); - SendtoTFTLN(PSTR("END")); - } - - void ChironTFT::SelectFile() { - strncpy(selectedfile, panel_command + 4, command_len - 4); - selectedfile[command_len - 5] = '\0'; - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR_F(" Selected File: ",selectedfile); - #endif - switch (selectedfile[0]) { - case '/': // Valid file selected - SendtoTFTLN(AC_msg_sd_file_open_success); - break; - - case '<': // .. (go up folder level) - filenavigator.upDIR(); - SendtoTFTLN(AC_msg_sd_file_open_failed); - SendFileList( 0 ); - break; - default: // enter sub folder - filenavigator.changeDIR(selectedfile); - SendtoTFTLN(AC_msg_sd_file_open_failed); - SendFileList( 0 ); - break; - } - } - - void ChironTFT::InjectCommandandWait(PGM_P cmd) { - //injectCommands_P(cmnd); queue.enqueue_now_P(cmd); - //SERIAL_ECHOLN(PSTR("Inject>")); - } - - void ChironTFT::ProcessPanelRequest() { - // Break these up into logical blocks // as its easier to navigate than one huge switch case! - int8_t req = atoi(&panel_command[1]); - - // Information requests A0 - A8 and A33 - if (req <= 8 || req == 33) PanelInfo(req); - - // Simple Actions A9 - A28 - else if ( req <= 28) PanelAction(req); - - // Process Initiation - else if (req <= 34) PanelProcess(req); - - else SendtoTFTLN(); - } - - void ChironTFT::PanelInfo(uint8_t req) { - // information requests A0-A8 and A33 - switch (req) { - case 0: // A0 Get HOTEND Temp - SendtoTFT(PSTR("A0V ")); - TFTSer.println(getActualTemp_celsius(E0)); - break; - - case 1: // A1 Get HOTEND Target Temp - SendtoTFT(PSTR("A1V ")); - TFTSer.println(getTargetTemp_celsius(E0)); - break; - - case 2: // A2 Get BED Temp - SendtoTFT(PSTR("A2V ")); - TFTSer.println(getActualTemp_celsius(BED)); - break; - - case 3: // A3 Get BED Target Temp - SendtoTFT(PSTR("A3V ")); - TFTSer.println(getTargetTemp_celsius(BED)); - break; - - case 4: // A4 Get FAN Speed - SendtoTFT(PSTR("A4V ")); - TFTSer.println(getActualFan_percent(FAN0)); - break; - - case 5: // A5 Get Current Coordinates - SendtoTFT(PSTR("A5V X: ")); - TFTSer.print(getAxisPosition_mm(X)); - SendtoTFT(PSTR(" Y: ")); - TFTSer.print(getAxisPosition_mm(Y)); - SendtoTFT(PSTR(" Z: ")); - TFTSer.println(getAxisPosition_mm(Z)); - break; - - case 6: // A6 Get printing progress - if (isPrintingFromMedia()) { - SendtoTFT(PSTR("A6V ")); - TFTSer.println(ui8tostr2(getProgress_percent())); - } - else - SendtoTFTLN(PSTR("A6V ---")); - break; - - case 7: { // A7 Get Printing Time - uint32_t time = getProgress_seconds_elapsed() / 60; - SendtoTFT(PSTR("A7V ")); - TFTSer.print(ui8tostr2(time / 60)); - SendtoTFT(PSTR(" H ")); - TFTSer.print(ui8tostr2(time % 60)); - SendtoTFT(PSTR(" M")); - #if ACDEBUG(AC_ALL) - SERIAL_ECHOLNPAIR("Print time ", ui8tostr2(time / 60), ":", ui8tostr2(time % 60)); - #endif - } break; - - case 8: // A8 Get SD Card list A8 S0 - if (!isMediaInserted()) safe_delay(500); - if (!isMediaInserted()) // Make sure the card is removed - SendtoTFTLN(AC_msg_no_sd_card); - else if (panel_command[3] == 'S') - SendFileList( atoi( &panel_command[4] ) ); - break; - - case 33: // A33 Get firmware info - SendtoTFT(PSTR("J33 ")); - SendtoTFTLN(PSTR(SHORT_BUILD_VERSION)); - break; - } - } - - void ChironTFT::PanelAction(uint8_t req) { - switch (req) { - case 9: // A9 Pause SD print - if (isPrintingFromMedia()) { - SendtoTFTLN(AC_msg_pause); - pausePrint(); - printer_state = AC_printer_pausing; - } - else - SendtoTFTLN(AC_msg_stop); - break; - - case 10: // A10 Resume SD Print - if (pause_state == AC_paused_idle || printer_state == AC_printer_resuming_from_power_outage) - resumePrint(); - else - setUserConfirmed(); - break; - - case 11: // A11 Stop SD print - if (isPrintingFromMedia()) { - printer_state = AC_printer_stopping; - stopPrint(); - } - else { - if (printer_state == AC_printer_resuming_from_power_outage) - injectCommands_P(PSTR("M1000 C")); // Cancel recovery - SendtoTFTLN(AC_msg_stop); - printer_state = AC_printer_idle; - } - break; - - case 12: // A12 Kill printer - kill(); // from marlincore.h - break; - - case 13: // A13 Select file - SelectFile(); - break; - - case 14: { // A14 Start Printing - // Allows printer to restart the job if we dont want to recover - if (printer_state == AC_printer_resuming_from_power_outage) { - injectCommands_P(PSTR("M1000 C")); // Cancel recovery - printer_state = AC_printer_idle; - } - #if ACDebugLevel >= 1 - SERIAL_ECHOLNPAIR_F("Print: ", selectedfile); - #endif - // the card library needs a path starting // but the File api doesn't... - char file[MAX_PATH_LEN]; - file[0] = '/'; - strcpy(file + 1, selectedfile); - printFile(file); - SendtoTFTLN(AC_msg_print_from_sd_card); - } break; - - case 15: // A15 Resuming from outage - if (printer_state == AC_printer_resuming_from_power_outage) { - // Need to home here to restore the Z position - injectCommands_P(AC_cmnd_power_loss_recovery); - injectCommands_P(PSTR("M1000")); // home and start recovery - } - break; - - case 16: { // A16 Set HotEnd temp A17 S170 - const float set_Htemp = atof(&panel_command[5]); - hotend_state = set_Htemp ? AC_heater_temp_set : AC_heater_off; - switch ((char)panel_command[4]) { - // Set Temp - case 'S': case 'C': setTargetTemp_celsius(set_Htemp, E0); - } - } break; - - case 17: { // A17 Set bed temp - const float set_Btemp = atof(&panel_command[5]); - hotbed_state = set_Btemp ? AC_heater_temp_set : AC_heater_off; - if (panel_command[4] == 'S') - setTargetTemp_celsius(set_Btemp, BED); - } break; - - case 18: // A18 Set Fan Speed - if (panel_command[4] == 'S') - setTargetFan_percent(atof(&panel_command[5]), FAN0); - break; - - case 19: // A19 Motors off - if (!isPrinting()) { - disable_all_steppers(); // from marlincore.h - SendtoTFTLN(AC_msg_ready); - } - break; - - case 20: // A20 Read/write print speed - if (panel_command[4] == 'S') - setFeedrate_percent(atoi(&panel_command[5])); - else { - SendtoTFT(PSTR("A20V ")); - TFTSer.println(getFeedrate_percent()); - } - break; - - case 21: // A21 Home Axis A21 X - if (!isPrinting()) { - switch ((char)panel_command[4]) { - case 'X': injectCommands_P(PSTR("G28X")); break; - case 'Y': injectCommands_P(PSTR("G28Y")); break; - case 'Z': injectCommands_P(PSTR("G28Z")); break; - case 'C': injectCommands_P(G28_STR); break; - } - } - break; - - case 22: // A22 Move Axis A22 Y +10F3000 - // Ignore request if printing - if (!isPrinting()) { - // setAxisPosition_mm() uses pre defined manual feedrates so ignore the feedrate from the panel - setSoftEndstopState(true); // enable endstops - float newposition = atof(&panel_command[6]); - - #if ACDEBUG(AC_ACTION) - SERIAL_ECHOLNPAIR("Nudge ", AS_CHAR(panel_command[4]), " axis ", newposition); - #endif - - switch (panel_command[4]) { - case 'X': setAxisPosition_mm(getAxisPosition_mm(X) + newposition, X); break; - case 'Y': setAxisPosition_mm(getAxisPosition_mm(Y) + newposition, Y); break; - case 'Z': setAxisPosition_mm(getAxisPosition_mm(Z) + newposition, Z); break; - case 'E': // The only time we get this command is from the filament load/unload menu - // the standard movement is too slow so we will use the load unlod GCode to speed it up a bit - if (canMove(E0) && !commandsInQueue()) - injectCommands_P(newposition > 0 ? AC_cmnd_manual_load_filament : AC_cmnd_manual_unload_filament); - break; - } - } - break; - - case 23: // A23 Preheat PLA - // Ignore request if printing - if (!isPrinting()) { - // Temps defined in configuration.h - setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); - setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); - SendtoTFTLN(); - hotbed_state = AC_heater_temp_set; - hotend_state = AC_heater_temp_set; - } - break; - - case 24: // A24 Preheat ABS - // Ignore request if printing - if (!isPrinting()) { - setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); - setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); - SendtoTFTLN(); - hotbed_state = AC_heater_temp_set; - hotend_state = AC_heater_temp_set; - } - break; - - case 25: // A25 Cool Down - // Ignore request if printing - if (!isPrinting()) { - setTargetTemp_celsius(0, E0); - setTargetTemp_celsius(0, BED); - SendtoTFTLN(AC_msg_ready); - hotbed_state = AC_heater_off; - hotend_state = AC_heater_off; - } - break; - - case 26: // A26 Refresh SD - // M22 M21 maybe needed here to reset sd card - filenavigator.reset(); - break; - - case 27: // A27 Servo Angles adjust - break; - - case 28: // A28 Filament set A28 O/C - // Ignore request if printing - if (isPrinting()) break; + case 24: // A24 Preheat ABS + // Ignore request if printing + if (!isPrinting()) { + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); SendtoTFTLN(); - break; - } - } + hotbed_state = AC_heater_temp_set; + hotend_state = AC_heater_temp_set; + } + break; - void ChironTFT::PanelProcess(uint8_t req) { - switch (req) { - case 29: { // A29 Read Mesh Point A29 X1 Y1 + case 25: // A25 Cool Down + // Ignore request if printing + if (!isPrinting()) { + setTargetTemp_celsius(0, E0); + setTargetTemp_celsius(0, BED); + SendtoTFTLN(AC_msg_ready); + hotbed_state = AC_heater_off; + hotend_state = AC_heater_off; + } + break; + + case 26: // A26 Refresh SD + // M22 M21 maybe needed here to reset sd card + filenavigator.reset(); + break; + + case 27: // A27 Servo Angles adjust + break; + + case 28: // A28 Filament set A28 O/C + // Ignore request if printing + if (isPrinting()) break; + SendtoTFTLN(); + break; + } +} + +void ChironTFT::PanelProcess(uint8_t req) { + switch (req) { + case 29: { // A29 Read Mesh Point A29 X1 Y1 + xy_uint8_t pos; + float pos_z; + pos.x = atoi(&panel_command[5]); + pos.y = atoi(&panel_command[8]); + pos_z = getMeshPoint(pos); + + SendtoTFT(PSTR("A29V ")); + TFTSer.println(pos_z * 100); + if (!isPrinting()) { + setSoftEndstopState(true); // disable endstops + // If the same meshpoint is selected twice in a row, move the head to that ready for adjustment + if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { + if (!isPositionKnown()) + injectCommands_P(G28_STR); // home + + if (isPositionKnown()) { + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Moving to mesh point at x: ", pos.x, " y: ", pos.y, " z: ", pos_z); + #endif + // Go up before moving + setAxisPosition_mm(3.0,Z); + + setAxisPosition_mm(17 + (93 * pos.x), X); + setAxisPosition_mm(20 + (93 * pos.y), Y); + setAxisPosition_mm(0.0, Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Current Z: ", getAxisPosition_mm(Z)); + #endif + } + } + selectedmeshpoint.x = pos.x; + selectedmeshpoint.y = pos.y; + } + } break; + + case 30: { // A30 Auto leveling + if (panel_command[3] == 'S') { // Start probing + // Ignore request if printing + if (isPrinting()) + SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling + else { + injectCommands_P(PSTR("G28O\nG29")); + printer_state = AC_printer_probing; + SendtoTFTLN(AC_msg_start_probing); + } + } + else SendtoTFTLN(AC_msg_start_probing); + } break; + + case 31: { // A31 Adjust all Probe Points + switch (panel_command[3]) { + case 'C': // Restore and apply original offsets + if (!isPrinting()) { + injectCommands_P(PSTR("M501\nM420 S1")); + selectedmeshpoint.x = selectedmeshpoint.y = 99; + } + break; + case 'D': // Save Z Offset tables and restore leveling state + if (!isPrinting()) { + setAxisPosition_mm(1.0,Z); + injectCommands_P(PSTR("M500")); + selectedmeshpoint.x = selectedmeshpoint.y = 99; + } + break; + case 'G': // Get current offset + SendtoTFT(PSTR("A31V ")); + // When printing use the live z Offset position + // we will use babystepping to move the print head + if (isPrinting()) + TFTSer.println(live_Zoffset); + else { + TFTSer.println(getZOffset_mm()); + selectedmeshpoint.x = selectedmeshpoint.y = 99; + } + break; + case 'S': { // Set offset (adjusts all points by value) + float Zshift = atof(&panel_command[4]); + setSoftEndstopState(false); // disable endstops + // Allow temporary Z position nudging during print + // From the leveling panel use the all points UI to adjust the print pos. + if (isPrinting()) { + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift); + #endif + if (isAxisPositionKnown(Z)) { + #if ACDEBUG(AC_INFO) + const float currZpos = getAxisPosition_mm(Z); + SERIAL_ECHOLNPAIR("Nudge Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); + #endif + // Use babystepping to adjust the head position + int16_t steps = mmToWholeSteps(constrain(Zshift,-0.05,0.05), Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Steps to move Z: ", steps); + #endif + babystepAxis_steps(steps, Z); + live_Zoffset += Zshift; + } + SendtoTFT(PSTR("A31V ")); + TFTSer.println(live_Zoffset); + } + else { + GRID_LOOP(x, y) { + const xy_uint8_t pos { x, y }; + const float currval = getMeshPoint(pos); + setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); + } + const float currZOffset = getZOffset_mm(); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change probe offset from ", currZOffset, " to ", currZOffset + Zshift); + #endif + + setZOffset_mm(currZOffset + Zshift); + SendtoTFT(PSTR("A31V ")); + TFTSer.println(getZOffset_mm()); + + if (isAxisPositionKnown(Z)) { + // Move Z axis + const float currZpos = getAxisPosition_mm(Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); + #endif + setAxisPosition_mm(currZpos+constrain(Zshift,-0.05,0.05),Z); + } + } + } + } + } break; + + case 32: { // A32 clean leveling beep flag + // Ignore request if printing + //if (isPrinting()) break; + //injectCommands_P(PSTR("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000")); + //TFTSer.println(); + } break; + + // A33 firmware info request see PanelInfo() + + case 34: { // A34 Adjust single mesh point A34 C/S X1 Y1 V123 + if (panel_command[3] == 'C') { // Restore original offsets + injectCommands_P(PSTR("M501\nM420 S1")); + selectedmeshpoint.x = selectedmeshpoint.y = 99; + //printer_state = AC_printer_idle; + } + else { xy_uint8_t pos; - float pos_z; pos.x = atoi(&panel_command[5]); pos.y = atoi(&panel_command[8]); - pos_z = getMeshPoint(pos); - SendtoTFT(PSTR("A29V ")); - TFTSer.println(pos_z * 100); - if (!isPrinting()) { - setSoftEndstopState(true); // disable endstops - // If the same meshpoint is selected twice in a row, move the head to that ready for adjustment - if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { - if (!isPositionKnown()) - injectCommands_P(G28_STR); // home - - if (isPositionKnown()) { - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Moving to mesh point at x: ", pos.x, " y: ", pos.y, " z: ", pos_z); - #endif - // Go up before moving - setAxisPosition_mm(3.0,Z); - - setAxisPosition_mm(17 + (93 * pos.x), X); - setAxisPosition_mm(20 + (93 * pos.y), Y); - setAxisPosition_mm(0.0, Z); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Current Z: ", getAxisPosition_mm(Z)); - #endif - } - } - selectedmeshpoint.x = pos.x; - selectedmeshpoint.y = pos.y; - } - } break; - - case 30: { // A30 Auto leveling - if (panel_command[3] == 'S') { // Start probing - // Ignore request if printing - if (isPrinting()) - SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling - else { - injectCommands_P(PSTR("G28O\nG29")); - printer_state = AC_printer_probing; - SendtoTFTLN(AC_msg_start_probing); + float currmesh = getMeshPoint(pos); + float newval = atof(&panel_command[11])/100; + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change mesh point x:", pos.x, " y:", pos.y); + SERIAL_ECHOLNPAIR("from ", currmesh, " to ", newval); + #endif + // Update Meshpoint + setMeshPoint(pos,newval); + if (printer_state == AC_printer_idle || printer_state == AC_printer_probing /*!isPrinting()*/) { + // if we are at the current mesh point indicated on the panel Move Z pos +/- 0.05mm + // (The panel changes the mesh value by +/- 0.05mm on each button press) + if (selectedmeshpoint.x == pos.x && selectedmeshpoint.y == pos.y) { + setSoftEndstopState(false); + float currZpos = getAxisPosition_mm(Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(newval - currmesh, -0.05, 0.05)); + #endif + setAxisPosition_mm(currZpos + constrain(newval - currmesh, -0.05, 0.05), Z); } } - else SendtoTFTLN(AC_msg_start_probing); - } break; - - case 31: { // A31 Adjust all Probe Points - switch (panel_command[3]) { - case 'C': // Restore and apply original offsets - if (!isPrinting()) { - injectCommands_P(PSTR("M501\nM420 S1")); - selectedmeshpoint.x = selectedmeshpoint.y = 99; - } - break; - case 'D': // Save Z Offset tables and restore leveling state - if (!isPrinting()) { - setAxisPosition_mm(1.0,Z); - injectCommands_P(PSTR("M500")); - selectedmeshpoint.x = selectedmeshpoint.y = 99; - } - break; - case 'G': // Get current offset - SendtoTFT(PSTR("A31V ")); - // When printing use the live z Offset position - // we will use babystepping to move the print head - if (isPrinting()) - TFTSer.println(live_Zoffset); - else { - TFTSer.println(getZOffset_mm()); - selectedmeshpoint.x = selectedmeshpoint.y = 99; - } - break; - case 'S': { // Set offset (adjusts all points by value) - float Zshift = atof(&panel_command[4]); - setSoftEndstopState(false); // disable endstops - // Allow temporary Z position nudging during print - // From the leveling panel use the all points UI to adjust the print pos. - if (isPrinting()) { - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift); - #endif - if (isAxisPositionKnown(Z)) { - #if ACDEBUG(AC_INFO) - const float currZpos = getAxisPosition_mm(Z); - SERIAL_ECHOLNPAIR("Nudge Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); - #endif - // Use babystepping to adjust the head position - int16_t steps = mmToWholeSteps(constrain(Zshift,-0.05,0.05), Z); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Steps to move Z: ", steps); - #endif - babystepAxis_steps(steps, Z); - live_Zoffset += Zshift; - } - SendtoTFT(PSTR("A31V ")); - TFTSer.println(live_Zoffset); - } - else { - GRID_LOOP(x, y) { - const xy_uint8_t pos { x, y }; - const float currval = getMeshPoint(pos); - setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); - } - const float currZOffset = getZOffset_mm(); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Change probe offset from ", currZOffset, " to ", currZOffset + Zshift); - #endif - - setZOffset_mm(currZOffset + Zshift); - SendtoTFT(PSTR("A31V ")); - TFTSer.println(getZOffset_mm()); - - if (isAxisPositionKnown(Z)) { - // Move Z axis - const float currZpos = getAxisPosition_mm(Z); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); - #endif - setAxisPosition_mm(currZpos+constrain(Zshift,-0.05,0.05),Z); - } - } - } break; - } // end switch - } break; - - case 32: { // A32 clean leveling beep flag - // Ignore request if printing - //if (isPrinting()) break; - //injectCommands_P(PSTR("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000")); - //TFTSer.println(); - } break; - - // A33 firmware info request seet PanelInfo() - - case 34: { // A34 Adjust single mesh point A34 C/S X1 Y1 V123 - if (panel_command[3] == 'C') { // Restore original offsets - injectCommands_P(PSTR("M501\nM420 S1")); - selectedmeshpoint.x = selectedmeshpoint.y = 99; - //printer_state = AC_printer_idle; - } - else { - xy_uint8_t pos; - pos.x = atoi(&panel_command[5]); - pos.y = atoi(&panel_command[8]); - - float currmesh = getMeshPoint(pos); - float newval = atof(&panel_command[11])/100; - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Change mesh point x:", pos.x, " y:", pos.y); - SERIAL_ECHOLNPAIR("from ", currmesh, " to ", newval); - #endif - // Update Meshpoint - setMeshPoint(pos,newval); - if (printer_state == AC_printer_idle || printer_state == AC_printer_probing /*!isPrinting()*/) { - // if we are at the current mesh point indicated on the panel Move Z pos +/- 0.05mm - // (The panel changes the mesh value by +/- 0.05mm on each button press) - if (selectedmeshpoint.x == pos.x && selectedmeshpoint.y == pos.y) { - setSoftEndstopState(false); - float currZpos = getAxisPosition_mm(Z); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(newval - currmesh, -0.05, 0.05)); - #endif - setAxisPosition_mm(currZpos + constrain(newval - currmesh, -0.05, 0.05), Z); - } - } - } - } break; - } + } + } break; } +} } // Anycubic diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h index e7bbd3cbbf..3c26cc0aec 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h @@ -35,46 +35,46 @@ namespace Anycubic { - class ChironTFT { - private: - static printer_state_t printer_state; - static paused_state_t pause_state; - static heater_state_t hotend_state; - static heater_state_t hotbed_state; - static xy_uint8_t selectedmeshpoint; - static char panel_command[MAX_CMND_LEN]; - static uint8_t command_len; - static char selectedfile[MAX_PATH_LEN]; - static float live_Zoffset; - static file_menu_t file_menu; +class ChironTFT { + private: + static printer_state_t printer_state; + static paused_state_t pause_state; + static heater_state_t hotend_state; + static heater_state_t hotbed_state; + static xy_uint8_t selectedmeshpoint; + static char panel_command[MAX_CMND_LEN]; + static uint8_t command_len; + static char selectedfile[MAX_PATH_LEN]; + static float live_Zoffset; + static file_menu_t file_menu; - public: - ChironTFT(); - static void Startup(); - static void IdleLoop(); - static void PrinterKilled(PGM_P,PGM_P); - static void MediaEvent(media_event_t); - static void TimerEvent(timer_event_t); - static void FilamentRunout(); - static void ConfirmationRequest(const char * const ); - static void StatusChange(const char * const ); - static void PowerLossRecovery(); + public: + ChironTFT(); + static void Startup(); + static void IdleLoop(); + static void PrinterKilled(PGM_P,PGM_P); + static void MediaEvent(media_event_t); + static void TimerEvent(timer_event_t); + static void FilamentRunout(); + static void ConfirmationRequest(const char * const ); + static void StatusChange(const char * const ); + static void PowerLossRecovery(); - private: - static void SendtoTFT(PGM_P); - static void SendtoTFTLN(PGM_P); - static bool ReadTFTCommand(); - static int8_t Findcmndpos(const char *, char); - static void CheckHeaters(); - static void SendFileList(int8_t); - static void SelectFile(); - static void InjectCommandandWait(PGM_P); - static void ProcessPanelRequest(); - static void PanelInfo(uint8_t); - static void PanelAction(uint8_t); - static void PanelProcess(uint8_t); - }; + private: + static void SendtoTFT(PGM_P); + static void SendtoTFTLN(PGM_P); + static bool ReadTFTCommand(); + static int8_t Findcmndpos(const char *, char); + static void CheckHeaters(); + static void SendFileList(int8_t); + static void SelectFile(); + static void InjectCommandandWait(PGM_P); + static void ProcessPanelRequest(); + static void PanelInfo(uint8_t); + static void PanelAction(uint8_t); + static void PanelProcess(uint8_t); +}; - extern ChironTFT Chiron; +extern ChironTFT Chiron; } // Anycubic diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h index 3087d83801..a8ebe9c776 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -109,19 +109,16 @@ #define AC_cmnd_power_loss_recovery PSTR("G28XYR5\nG28Z") // Lift, home X and Y then home Z when in 'safe' position namespace Anycubic { - enum heater_state_t : uint8_t { AC_heater_off, AC_heater_temp_set, AC_heater_temp_reached }; - enum paused_state_t : uint8_t { AC_paused_heater_timed_out, AC_paused_purging_filament, AC_paused_idle }; - enum printer_state_t : uint8_t { AC_printer_idle, AC_printer_probing, @@ -131,13 +128,11 @@ namespace Anycubic { AC_printer_stopping, AC_printer_resuming_from_power_outage }; - enum timer_event_t : uint8_t { AC_timer_started, AC_timer_paused, AC_timer_stopped }; - enum media_event_t : uint8_t { AC_media_inserted, AC_media_removed, @@ -149,5 +144,4 @@ namespace Anycubic { AC_menu_change_to_file, AC_menu_change_to_command }; - } // Anycubic From 47dbea9334c4e1f37c1fbe0f6f3727a15e23e70c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 13 Apr 2021 23:22:57 -0500 Subject: [PATCH 1292/1370] Fix long acceleration overflow --- Marlin/src/module/planner.cpp | 23 +++++++++++------------ Marlin/src/module/planner.h | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index d6356432e7..b528eb9d3b 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -207,7 +207,7 @@ skew_factor_t Planner::skew_factor; // Initialized by settings.load() xyze_long_t Planner::position{0}; -uint32_t Planner::cutoff_long; +uint32_t Planner::acceleration_long_cutoff; xyze_float_t Planner::previous_speed; float Planner::previous_nominal_speed_sqr; @@ -2271,23 +2271,22 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Compute and limit the acceleration rate for the trapezoid generator. const float steps_per_mm = block->step_event_count * inverse_millimeters; uint32_t accel; - if (!block->steps.a && !block->steps.b && !block->steps.c) { - // convert to: acceleration steps/sec^2 - accel = CEIL(settings.retract_acceleration * steps_per_mm); - TERN_(LIN_ADVANCE, block->use_advance_lead = false); + if (!block->steps.a && !block->steps.b && !block->steps.c) { // Is this a retract / recover move? + accel = CEIL(settings.retract_acceleration * steps_per_mm); // Convert to: acceleration steps/sec^2 + TERN_(LIN_ADVANCE, block->use_advance_lead = false); // No linear advance for simple retract/recover } else { #define LIMIT_ACCEL_LONG(AXIS,INDX) do{ \ if (block->steps[AXIS] && max_acceleration_steps_per_s2[AXIS+INDX] < accel) { \ - const uint32_t comp = max_acceleration_steps_per_s2[AXIS+INDX] * block->step_event_count; \ - if (accel * block->steps[AXIS] > comp) accel = comp / block->steps[AXIS]; \ + const uint32_t max_possible = max_acceleration_steps_per_s2[AXIS+INDX] * block->step_event_count / block->steps[AXIS]; \ + NOMORE(accel, max_possible); \ } \ }while(0) #define LIMIT_ACCEL_FLOAT(AXIS,INDX) do{ \ if (block->steps[AXIS] && max_acceleration_steps_per_s2[AXIS+INDX] < accel) { \ - const float comp = (float)max_acceleration_steps_per_s2[AXIS+INDX] * (float)block->step_event_count; \ - if ((float)accel * (float)block->steps[AXIS] > comp) accel = comp / (float)block->steps[AXIS]; \ + const float max_possible = float(max_acceleration_steps_per_s2[AXIS+INDX]) * float(block->step_event_count) / float(block->steps[AXIS]); \ + NOMORE(accel, max_possible); \ } \ }while(0) @@ -2336,7 +2335,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif // Limit acceleration per axis - if (block->step_event_count <= cutoff_long) { + if (block->step_event_count <= acceleration_long_cutoff) { LIMIT_ACCEL_LONG(A_AXIS, 0); LIMIT_ACCEL_LONG(B_AXIS, 0); LIMIT_ACCEL_LONG(C_AXIS, 0); @@ -2352,7 +2351,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->acceleration_steps_per_s2 = accel; block->acceleration = accel / steps_per_mm; #if DISABLED(S_CURVE_ACCELERATION) - block->acceleration_rate = (uint32_t)(accel * (4096.0f * 4096.0f / (STEPPER_TIMER_RATE))); + block->acceleration_rate = (uint32_t)(accel * (sq(4096.0f) / (STEPPER_TIMER_RATE))); #endif #if ENABLED(LIN_ADVANCE) if (block->use_advance_lead) { @@ -3020,7 +3019,7 @@ void Planner::reset_acceleration_rates() { max_acceleration_steps_per_s2[i] = settings.max_acceleration_mm_per_s2[i] * settings.axis_steps_per_mm[i]; if (AXIS_CONDITION) NOLESS(highest_rate, max_acceleration_steps_per_s2[i]); } - cutoff_long = 4294967295UL / highest_rate; // 0xFFFFFFFFUL + acceleration_long_cutoff = 4294967295UL / highest_rate; // 0xFFFFFFFFUL TERN_(HAS_LINEAR_E_JERK, recalculate_max_e_jerk()); } diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index d4ed00d2fa..398339f04e 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -443,7 +443,7 @@ class Planner { /** * Limit where 64bit math is necessary for acceleration calculation */ - static uint32_t cutoff_long; + static uint32_t acceleration_long_cutoff; #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) static float last_fade_z; From 4512bcd72ce5822048b22aa1a9ca1c54fc499ecb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 13 Apr 2021 23:23:06 -0500 Subject: [PATCH 1293/1370] Use sq --- Marlin/src/module/scara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index cc177f76c2..e058804c90 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -204,7 +204,7 @@ float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SE y = r * sin(RADIANS(a)), rho2 = L1_2 + L2_2 - 2.0f * L1 * L2 * cos(RADIANS(w)); - cartes = robot_offset + xyz_pos_t({ x, y, SQRT(rho2 - x * x - y * y) }); + cartes = robot_offset + xyz_pos_t({ x, y, SQRT(rho2 - sq(x) - sq(y)) }); } // Home YZ together, then X (or all at once). Based on quick_home_xy & home_delta From 761d283d6df8201b712e8ff679c628fc3686f25a Mon Sep 17 00:00:00 2001 From: XDA-Bam <1209896+XDA-Bam@users.noreply.github.com> Date: Wed, 14 Apr 2021 11:42:04 +0200 Subject: [PATCH 1294/1370] Space-separate scrolling Status Message (#21523) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 13 ++++++++----- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 13 ++++++++----- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 13 ++++++++----- Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp | 13 ++++++++----- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 57af2b782a..0444c9e185 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -684,12 +684,15 @@ void MarlinUI::draw_status_message(const bool blink) { // If the remaining string doesn't completely fill the screen if (rlen < LCD_WIDTH) { - lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters - if (--chars) { // Draw a second dot if there's space - lcd_put_wchar('.'); - if (--chars) - lcd_put_u8str_max(status_message, chars); // Print a second copy of the message + lcd_put_wchar(' '); // Always at 1+ spaces left, draw a space + if (--chars) { // Draw a second space if there's room + lcd_put_wchar(' '); + if (--chars) { // Draw a third space if there's room + lcd_put_wchar(' '); + if (--chars) + lcd_put_u8str_max(status_message, chars); // Print a second copy of the message + } } } if (last_blink != blink) { diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 5b48cb1ac8..6edde2c604 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -581,12 +581,15 @@ void MarlinUI::draw_status_message(const bool blink) { // If the remaining string doesn't completely fill the screen if (rlen < LCD_WIDTH) { - lcd.write('.'); // Always at 1+ spaces left, draw a dot uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters - if (--chars) { // Draw a second dot if there's space - lcd.write('.'); - if (--chars) - lcd_put_u8str_max(status_message, chars); // Print a second copy of the message + lcd.write(' '); // Always at 1+ spaces left, draw a space + if (--chars) { // Draw a second space if there's room + lcd.write(' '); + if (--chars) { // Draw a third space if there's room + lcd.write(' '); + if (--chars) + lcd_put_u8str_max(status_message, chars); // Print a second copy of the message + } } } if (last_blink != blink) { diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 119de19d9d..e2bffb7fe0 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -959,13 +959,16 @@ void MarlinUI::draw_status_message(const bool blink) { // If the remaining string doesn't completely fill the screen if (rlen < lcd_width) { - lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot uint8_t chars = lcd_width - rlen; // Amount of space left in characters - if (--chars) { // Draw a second dot if there's space - lcd_put_wchar('.'); - if (--chars) { // Print a second copy of the message - lcd_put_u8str_max(status_message, pixel_width - (rlen + 2) * (MENU_FONT_WIDTH)); + lcd_put_wchar(' '); // Always at 1+ spaces left, draw a space + if (--chars) { // Draw a second space if there's room + lcd_put_wchar(' '); + if (--chars) { // Draw a third space if there's room lcd_put_wchar(' '); + if (--chars) { // Print a second copy of the message + lcd_put_u8str_max(status_message, pixel_width - (rlen + 2) * (MENU_FONT_WIDTH)); + lcd_put_wchar(' '); + } } } } diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index b67688cb57..b8257d32ff 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -642,11 +642,14 @@ void ST7920_Lite_Status_Screen::draw_status_message() { // If the remaining string doesn't completely fill the screen if (rlen < TEXT_MODE_LCD_WIDTH) { - write_byte('.'); // Always at 1+ spaces left, draw a dot - uint8_t chars = TEXT_MODE_LCD_WIDTH - rlen; // Amount of space left in characters - if (--chars) { // Draw a second dot if there's space - write_byte('.'); - if (--chars) write_str(str, chars); // Print a second copy of the message + uint8_t chars = TEXT_MODE_LCD_WIDTH - rlen; // Amount of space left in characters + write_byte(' '); // Always at 1+ spaces left, draw a space + if (--chars) { // Draw a second space if there's room + write_byte(' '); + if (--chars) { // Draw a third space if there's room + write_byte(' '); + if (--chars) write_str(str, chars); // Print a second copy of the message + } } } ui.advance_status_scroll(); From ce18713f577a4cd2d7165062f93ffb4fcd4a13dd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 14 Apr 2021 05:54:12 -0500 Subject: [PATCH 1295/1370] Add E1 for RAMPS 1.4.4 / AGC --- Marlin/src/pins/samd/pins_RAMPS_144.h | 65 +++++++-------------------- 1 file changed, 17 insertions(+), 48 deletions(-) diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index 7a72ef651f..8311ac9012 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -89,13 +89,6 @@ #define Z_CS_PIN 32 #endif -#define Z2_STEP_PIN 36 -#define Z2_DIR_PIN 34 -#define Z2_ENABLE_PIN 30 -#ifndef Z2_CS_PIN - #define Z2_CS_PIN 22 -#endif - #define E0_STEP_PIN 26 #define E0_DIR_PIN 28 #define E0_ENABLE_PIN 24 @@ -103,18 +96,33 @@ #define E0_CS_PIN 43 #endif +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 22 +#endif + // // Temperature Sensors // #define TEMP_0_PIN 13 -#define TEMP_BED_PIN 14 +#if TEMP_SENSOR_BED + #define TEMP_BED_PIN 14 +#else + #define TEMP_1_PIN 14 +#endif #define TEMP_CHAMBER_PIN 15 // // Heaters / Fans // #define HEATER_0_PIN 10 -#define HEATER_BED_PIN 8 +#if TEMP_SENSOR_BED + #define HEATER_BED_PIN 8 +#else + #define HEATER_1_PIN 8 +#endif #define FAN_PIN 9 #define FAN1_PIN 7 #define FAN2_PIN 12 @@ -186,9 +194,6 @@ //#define Z2_HARDWARE_SERIAL Serial1 //#define E0_HARDWARE_SERIAL Serial1 //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 // // Software serial @@ -245,42 +250,6 @@ #ifndef E1_SERIAL_RX_PIN #define E1_SERIAL_RX_PIN -1 #endif - #ifndef E2_SERIAL_TX_PIN - #define E2_SERIAL_TX_PIN -1 - #endif - #ifndef E2_SERIAL_RX_PIN - #define E2_SERIAL_RX_PIN -1 - #endif - #ifndef E3_SERIAL_TX_PIN - #define E3_SERIAL_TX_PIN -1 - #endif - #ifndef E3_SERIAL_RX_PIN - #define E3_SERIAL_RX_PIN -1 - #endif - #ifndef E4_SERIAL_TX_PIN - #define E4_SERIAL_TX_PIN -1 - #endif - #ifndef E4_SERIAL_RX_PIN - #define E4_SERIAL_RX_PIN -1 - #endif - #ifndef E5_SERIAL_TX_PIN - #define E5_SERIAL_TX_PIN -1 - #endif - #ifndef E5_SERIAL_RX_PIN - #define E5_SERIAL_RX_PIN -1 - #endif - #ifndef E6_SERIAL_TX_PIN - #define E6_SERIAL_TX_PIN -1 - #endif - #ifndef E6_SERIAL_RX_PIN - #define E6_SERIAL_RX_PIN -1 - #endif - #ifndef E7_SERIAL_TX_PIN - #define E7_SERIAL_TX_PIN -1 - #endif - #ifndef E7_SERIAL_RX_PIN - #define E7_SERIAL_RX_PIN -1 - #endif #endif ////////////////////////// From 713e606b28b93631386678a94353ee433c45bce9 Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 15 Apr 2021 11:37:37 +0200 Subject: [PATCH 1296/1370] Fix Custom Menu audio and return (#21616) --- Marlin/src/lcd/menu/menu_main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 525b8c8a70..34d1d6c6f4 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -105,8 +105,8 @@ void menu_configuration(); void _lcd_custom_menu_main_gcode(PGM_P const cmd) { queue.inject_P(cmd); - TERN_(MAIN_MENU_ITEM_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); - TERN_(MAIN_MENU_ITEM_SCRIPT_RETURN, ui.return_to_status()); + TERN_(CUSTOM_MENU_MAIN_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); + TERN_(CUSTOM_MENU_MAIN_SCRIPT_RETURN, ui.return_to_status()); } void custom_menus_main() { From 643f04681c1de61d1718279b7af9d8e3f6386761 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Thu, 15 Apr 2021 17:45:30 +0800 Subject: [PATCH 1297/1370] Fix MKS H43 compile (#21619) --- Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 11 +++++++---- .../src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 01c3adbda7..667442b31c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -72,20 +72,23 @@ void MKS_reset_settings() { } xyz_pos_t position_before_pause; +constexpr feedRate_t park_speed_xy = TERN(NOZZLE_PARK_FEATURE, NOZZLE_PARK_XY_FEEDRATE, 100), + park_speed_z = TERN(NOZZLE_PARK_FEATURE, NOZZLE_PARK_Z_FEEDRATE, 5); + void MKS_pause_print_move() { queue.exhaust(); position_before_pause = current_position; destination.z = _MIN(current_position.z + mks_park_pos.z, Z_MAX_POS); - prepare_internal_move_to_destination(NOZZLE_PARK_Z_FEEDRATE); + prepare_internal_move_to_destination(park_speed_z); destination.set(X_MIN_POS + mks_park_pos.x, Y_MIN_POS + mks_park_pos.y); - prepare_internal_move_to_destination(NOZZLE_PARK_XY_FEEDRATE); + prepare_internal_move_to_destination(park_speed_xy); } void MKS_resume_print_move() { destination.set(position_before_pause.x, position_before_pause.y); - prepare_internal_move_to_destination(NOZZLE_PARK_XY_FEEDRATE); + prepare_internal_move_to_destination(park_speed_xy); destination.z = position_before_pause.z; - prepare_internal_move_to_destination(NOZZLE_PARK_Z_FEEDRATE); + prepare_internal_move_to_destination(park_speed_z); } float z_offset_add = 0; diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index e6e2af42eb..8833423b37 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -1271,7 +1271,7 @@ void GcodeSuite::M1002() { #endif const uint8_t old_axis_relative = axis_relative; - set_e_relative(true); // M83 + set_e_relative(); // M83 { char buf[20]; snprintf_P(buf, 20, PSTR("G1E%dF%d"), parser.intval('E'), parser.intval('F')); From 973f65f80c0909b8fb9d49fef57fc2004a45c907 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 15 Apr 2021 20:06:08 -0500 Subject: [PATCH 1298/1370] Use celsius_t for temperature accessors --- Marlin/src/gcode/bedlevel/G26.cpp | 4 ++-- Marlin/src/module/temperature.h | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 657f906c14..fe039def73 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -205,8 +205,8 @@ typedef struct { layer_height = MESH_TEST_LAYER_HEIGHT, prime_length = PRIME_LENGTH; - int16_t bed_temp = MESH_TEST_BED_TEMP, - hotend_temp = MESH_TEST_HOTEND_TEMP; + celsius_t bed_temp = MESH_TEST_BED_TEMP, + hotend_temp = MESH_TEST_HOTEND_TEMP; float nozzle = MESH_TEST_NOZZLE_SIZE, filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA, diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index bcb451064e..e1e7f56d17 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -631,7 +631,7 @@ class Temperature { //inline so that there is no performance decrease. //deg=degreeCelsius - FORCE_INLINE static float degHotend(const uint8_t E_NAME) { + FORCE_INLINE static celsius_t degHotend(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].celsius); } @@ -736,7 +736,7 @@ class Temperature { #if ENABLED(SHOW_TEMP_ADC_VALUES) FORCE_INLINE static int16_t rawProbeTemp() { return temp_probe.raw; } #endif - FORCE_INLINE static float degProbe() { return temp_probe.celsius; } + FORCE_INLINE static celsius_t degProbe() { return temp_probe.celsius; } FORCE_INLINE static bool isProbeBelowTemp(const_float_t target_temp) { return temp_probe.celsius < target_temp; } FORCE_INLINE static bool isProbeAboveTemp(const_float_t target_temp) { return temp_probe.celsius > target_temp; } static bool wait_for_probe(const_float_t target_temp, bool no_wait_for_cooling=true); @@ -752,7 +752,7 @@ class Temperature { #if ENABLED(SHOW_TEMP_ADC_VALUES) FORCE_INLINE static int16_t rawChamberTemp() { return temp_chamber.raw; } #endif - FORCE_INLINE static float degChamber() { return temp_chamber.celsius; } + FORCE_INLINE static celsius_t degChamber() { return temp_chamber.celsius; } #if HAS_HEATED_CHAMBER FORCE_INLINE static celsius_t degTargetChamber() { return temp_chamber.target; } FORCE_INLINE static bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } @@ -778,7 +778,7 @@ class Temperature { #if ENABLED(SHOW_TEMP_ADC_VALUES) FORCE_INLINE static int16_t rawCoolerTemp() { return temp_cooler.raw; } #endif - FORCE_INLINE static float degCooler() { return temp_cooler.celsius; } + FORCE_INLINE static celsius_t degCooler() { return temp_cooler.celsius; } #if HAS_COOLER FORCE_INLINE static celsius_t degTargetCooler() { return temp_cooler.target; } FORCE_INLINE static bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } From 027a5a872de56c462b260386b0e5cd2aa88c577e Mon Sep 17 00:00:00 2001 From: fedetony <45215920+fedetony@users.noreply.github.com> Date: Fri, 16 Apr 2021 08:59:28 +0200 Subject: [PATCH 1299/1370] Realtime Reporting, S000, P000, R000 (#19330) --- Marlin/Configuration_adv.h | 9 ++ Marlin/src/feature/e_parser.h | 134 +++++++++++++++----------- Marlin/src/gcode/bedlevel/abl/G29.cpp | 5 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 4 + Marlin/src/gcode/bedlevel/ubl/G29.cpp | 13 ++- Marlin/src/gcode/calibrate/G28.cpp | 4 + Marlin/src/gcode/calibrate/G33.cpp | 4 + Marlin/src/gcode/gcode.cpp | 11 ++- Marlin/src/gcode/host/M114.cpp | 4 + Marlin/src/gcode/motion/G0_G1.cpp | 4 + Marlin/src/gcode/motion/G2_G3.cpp | 4 + Marlin/src/gcode/parser.cpp | 23 ++++- Marlin/src/module/motion.cpp | 58 +++++++++++ Marlin/src/module/motion.h | 39 +++++++- Marlin/src/module/planner.cpp | 18 ++++ Marlin/src/module/planner.h | 7 ++ buildroot/tests/LPC1768 | 4 +- 17 files changed, 275 insertions(+), 70 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fa1b470ab2..578bf144fc 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2115,6 +2115,15 @@ */ //#define EMERGENCY_PARSER +/** + * Realtime Reporting + * Add support for commands S000 State, P000 Pause, and R000 Resume + */ +//#define REALTIME_REPORTING_COMMANDS +#if ENABLED(REALTIME_REPORTING_COMMANDS) + //#define FULL_REPORT_TO_HOST_FEATURE // Auto-report the machine status like Grbl CNC +#endif + // Bad Serial-connections can miss a received command by sending an 'ok' // Therefore some clients abort after 30 seconds in a timeout. // Some other clients start sending commands while receiving a 'wait'. diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index 659e516787..c12fd14ad1 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -34,29 +34,33 @@ // External references extern bool wait_for_user, wait_for_heatup; +#if ENABLED(REALTIME_REPORTING_COMMANDS) + // From motion.h, which cannot be included here + void report_current_position_moving(); + void quickpause_stepper(); + void quickresume_stepper(); +#endif + class EmergencyParser { public: - // Currently looking for: M108, M112, M410, M876 - enum State : char { + // Currently looking for: M108, M112, M410, M876 S[0-9], S000, P000, R000 + enum State : uint8_t { EP_RESET, EP_N, EP_M, EP_M1, - EP_M10, - EP_M108, - EP_M11, - EP_M112, - EP_M4, - EP_M41, - EP_M410, + EP_M10, EP_M108, + EP_M11, EP_M112, + EP_M4, EP_M41, EP_M410, #if ENABLED(HOST_PROMPT_SUPPORT) - EP_M8, - EP_M87, - EP_M876, - EP_M876S, - EP_M876SN, + EP_M8, EP_M87, EP_M876, EP_M876S, EP_M876SN, + #endif + #if ENABLED(REALTIME_REPORTING_COMMANDS) + EP_S, EP_S0, EP_S00, EP_GRBL_STATUS, + EP_R, EP_R0, EP_R00, EP_GRBL_RESUME, + EP_P, EP_P0, EP_P00, EP_GRBL_PAUSE, #endif EP_IGNORE // to '\n' }; @@ -71,7 +75,6 @@ public: EmergencyParser() { enable(); } FORCE_INLINE static void enable() { enabled = true; } - FORCE_INLINE static void disable() { enabled = false; } FORCE_INLINE static void update(State &state, const uint8_t c) { @@ -79,21 +82,45 @@ public: case EP_RESET: switch (c) { case ' ': case '\n': case '\r': break; - case 'N': state = EP_N; break; - case 'M': state = EP_M; break; - default: state = EP_IGNORE; + case 'N': state = EP_N; break; + case 'M': state = EP_M; break; + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case 'S': state = EP_S; break; + case 'P': state = EP_P; break; + case 'R': state = EP_R; break; + #endif + default: state = EP_IGNORE; } break; case EP_N: switch (c) { case '0' ... '9': - case '-': case ' ': break; - case 'M': state = EP_M; break; - default: state = EP_IGNORE; + case '-': case ' ': break; + case 'M': state = EP_M; break; + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case 'S': state = EP_S; break; + case 'P': state = EP_P; break; + case 'R': state = EP_R; break; + #endif + default: state = EP_IGNORE; } break; + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case EP_S: state = (c == '0') ? EP_S0 : EP_IGNORE; break; + case EP_S0: state = (c == '0') ? EP_S00 : EP_IGNORE; break; + case EP_S00: state = (c == '0') ? EP_GRBL_STATUS : EP_IGNORE; break; + + case EP_R: state = (c == '0') ? EP_R0 : EP_IGNORE; break; + case EP_R0: state = (c == '0') ? EP_R00 : EP_IGNORE; break; + case EP_R00: state = (c == '0') ? EP_GRBL_RESUME : EP_IGNORE; break; + + case EP_P: state = (c == '0') ? EP_P0 : EP_IGNORE; break; + case EP_P0: state = (c == '0') ? EP_P00 : EP_IGNORE; break; + case EP_P00: state = (c == '0') ? EP_GRBL_PAUSE : EP_IGNORE; break; + #endif + case EP_M: switch (c) { case ' ': break; @@ -114,48 +141,34 @@ public: } break; - case EP_M10: - state = (c == '8') ? EP_M108 : EP_IGNORE; - break; - - case EP_M11: - state = (c == '2') ? EP_M112 : EP_IGNORE; - break; - - case EP_M4: - state = (c == '1') ? EP_M41 : EP_IGNORE; - break; - - case EP_M41: - state = (c == '0') ? EP_M410 : EP_IGNORE; - break; + case EP_M10: state = (c == '8') ? EP_M108 : EP_IGNORE; break; + case EP_M11: state = (c == '2') ? EP_M112 : EP_IGNORE; break; + case EP_M4: state = (c == '1') ? EP_M41 : EP_IGNORE; break; + case EP_M41: state = (c == '0') ? EP_M410 : EP_IGNORE; break; #if ENABLED(HOST_PROMPT_SUPPORT) - case EP_M8: - state = (c == '7') ? EP_M87 : EP_IGNORE; - break; - case EP_M87: - state = (c == '6') ? EP_M876 : EP_IGNORE; - break; + case EP_M8: state = (c == '7') ? EP_M87 : EP_IGNORE; break; + case EP_M87: state = (c == '6') ? EP_M876 : EP_IGNORE; break; - case EP_M876: - switch (c) { - case ' ': break; - case 'S': state = EP_M876S; break; - default: state = EP_IGNORE; break; - } - break; + case EP_M876: + switch (c) { + case ' ': break; + case 'S': state = EP_M876S; break; + default: state = EP_IGNORE; break; + } + break; + + case EP_M876S: + switch (c) { + case ' ': break; + case '0' ... '9': + state = EP_M876SN; + M876_reason = uint8_t(c - '0'); + break; + } + break; - case EP_M876S: - switch (c) { - case ' ': break; - case '0' ... '9': - state = EP_M876SN; - M876_reason = (uint8_t)(c - '0'); - break; - } - break; #endif case EP_IGNORE: @@ -171,6 +184,11 @@ public: #if ENABLED(HOST_PROMPT_SUPPORT) case EP_M876SN: host_response_handler(M876_reason); break; #endif + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case EP_GRBL_STATUS: report_current_position_moving(); break; + case EP_GRBL_PAUSE: quickpause_stepper(); break; + case EP_GRBL_RESUME: quickresume_stepper(); break; + #endif default: break; } state = EP_RESET; diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 423857dbb0..a10b2b89b1 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -217,9 +217,10 @@ public: * There's no extra effect if you have a fixed Z probe. */ G29_TYPE GcodeSuite::G29() { - TERN_(PROBE_MANUALLY, static) G29_State abl; + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE)); + reset_stepper_timeout(); const bool seenQ = EITHER(DEBUG_LEVELING_FEATURE, PROBE_MANUALLY) && parser.seen('Q'); @@ -897,6 +898,8 @@ G29_TYPE GcodeSuite::G29() { report_current_position(); + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); + G29_RETURN(ISNAN(abl.measured_z)); } diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 1ec514c3ec..2da584fd49 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -60,6 +60,8 @@ inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM(" */ void GcodeSuite::G29() { + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE)); + static int mbl_probe_index = -1; MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport); @@ -187,6 +189,8 @@ void GcodeSuite::G29() { } report_current_position(); + + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); } #endif // MESH_BED_LEVELING diff --git a/Marlin/src/gcode/bedlevel/ubl/G29.cpp b/Marlin/src/gcode/bedlevel/ubl/G29.cpp index 2ef3ab4cec..932503d72b 100644 --- a/Marlin/src/gcode/bedlevel/ubl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/G29.cpp @@ -31,6 +31,17 @@ #include "../../gcode.h" #include "../../../feature/bedlevel/bedlevel.h" -void GcodeSuite::G29() { ubl.G29(); } +#if ENABLED(FULL_REPORT_TO_HOST_FEATURE) + #include "../../../module/motion.h" +#endif + +void GcodeSuite::G29() { + + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE)); + + ubl.G29(); + + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); +} #endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 73bfc3bdc6..10e094cba7 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -211,6 +211,8 @@ void GcodeSuite::G28() { TERN_(LASER_MOVE_G28_OFF, cutter.set_inline_enabled(false)); // turn off laser + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_HOMING)); + #if ENABLED(DUAL_X_CARRIAGE) bool IDEX_saved_duplication_state = extruder_duplication_enabled; DualXMode IDEX_saved_mode = dual_x_carriage_mode; @@ -479,6 +481,8 @@ void GcodeSuite::G28() { if (ENABLED(NANODLP_Z_SYNC) && (doZ || ENABLED(NANODLP_ALL_AXIS))) SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); + #if HAS_L64XX // Set L6470 absolute position registers to counts // constexpr *might* move this to PROGMEM. diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 0bcab206af..db1d456d70 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -387,6 +387,8 @@ static float auto_tune_a() { */ void GcodeSuite::G33() { + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE)); + const int8_t probe_points = parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS); if (!WITHIN(probe_points, 0, 10)) { SERIAL_ECHOLNPGM("?(P)oints implausible (0-10)."); @@ -645,6 +647,8 @@ void GcodeSuite::G33() { while (((zero_std_dev < test_precision && iterations < 31) || iterations <= force_iterations) && zero_std_dev > calibration_precision); ac_cleanup(TERN_(HAS_MULTI_HOTEND, old_tool_index)); + + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); } #endif // DELTA_AUTO_CALIBRATION diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 574e93aecc..efea087602 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -289,8 +289,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { } #endif - // Handle a known G, M, or T + // Handle a known command or reply "unknown command" + switch (parser.command_letter) { + case 'G': switch (parser.codenum) { case 0: case 1: // G0: Fast Move, G1: Linear Move @@ -995,6 +997,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 'D': D(parser.codenum); break; // Dn: Debug codes #endif + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case 'S': case 'P': case 'R': break; // Invalid S, P, R commands already filtered + #endif + default: #if ENABLED(WIFI_CUSTOM_COMMAND) if (wifi_custom_command(parser.command_ptr)) break; @@ -1087,12 +1093,15 @@ void GcodeSuite::process_subcommands_now(char * gcode) { case IN_HANDLER: case IN_PROCESS: SERIAL_ECHO_MSG(STR_BUSY_PROCESSING); + TERN_(FULL_REPORT_TO_HOST_FEATURE, report_current_position_moving()); break; case PAUSED_FOR_USER: SERIAL_ECHO_MSG(STR_BUSY_PAUSED_FOR_USER); + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_HOLD)); break; case PAUSED_FOR_INPUT: SERIAL_ECHO_MSG(STR_BUSY_PAUSED_FOR_INPUT); + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_HOLD)); break; default: break; diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp index 75356ff66f..dd62f0ad2e 100644 --- a/Marlin/src/gcode/host/M114.cpp +++ b/Marlin/src/gcode/host/M114.cpp @@ -176,6 +176,8 @@ const xyze_float_t diff = from_steppers - leveled; SERIAL_ECHOPGM("Diff: "); report_xyze(diff); + + TERN_(FULL_REPORT_TO_HOST_FEATURE, report_current_grblstate_moving()); } #endif // M114_DETAIL @@ -211,4 +213,6 @@ void GcodeSuite::M114() { TERN_(M114_LEGACY, planner.synchronize()); report_current_position_projected(); + + TERN_(FULL_REPORT_TO_HOST_FEATURE, report_current_grblstate_moving()); } diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp index 9ac49bd93c..64c07d1d89 100644 --- a/Marlin/src/gcode/motion/G0_G1.cpp +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -54,6 +54,7 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { | (parser.seen('Z') ? _BV(Z_AXIS) : 0) ) #endif ) { + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_RUNNING)); #ifdef G0_FEEDRATE feedRate_t old_feedrate; @@ -116,6 +117,9 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { planner.synchronize(); SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); } + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); + #else + TERN_(FULL_REPORT_TO_HOST_FEATURE, report_current_grblstate_moving()); #endif } } diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 61e50247f3..5a8324362a 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -306,6 +306,8 @@ void plan_arc( void GcodeSuite::G2_G3(const bool clockwise) { if (MOTION_CONDITIONS) { + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_RUNNING)); + #if ENABLED(SF_ARC_FIX) const bool relative_mode_backup = relative_mode; relative_mode = true; @@ -364,6 +366,8 @@ void GcodeSuite::G2_G3(const bool clockwise) { } else SERIAL_ERROR_MSG(STR_ERR_ARC_ARGS); + + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); } } diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index f7812bf3f6..9f0d09563e 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -106,8 +106,10 @@ void GCodeParser::reset() { #endif -// Populate all fields by parsing a single line of GCode -// 58 bytes of SRAM are used to speed up seen/value +/** + * Populate the command line state (command_letter, codenum, subcode, and string_arg) + * by parsing a single line of GCode. 58 bytes of SRAM are used to speed up seen/value. + */ void GCodeParser::parse(char *p) { reset(); // No codes to report @@ -147,10 +149,12 @@ void GCodeParser::parse(char *p) { #define SIGNED_CODENUM 1 #endif - // Bail if the letter is not G, M, or T - // (or a valid parameter for the current motion mode) + /** + * Screen for good command letters. G, M, and T are always accepted. + * With Motion Modes enabled any axis letter can come first. + * With Realtime Reporting, commands S000, P000, and R000 are allowed. + */ switch (letter) { - case 'G': case 'M': case 'T': TERN_(MARLIN_DEV_MODE, case 'D':) // Skip spaces to get the numeric part while (*p == ' ') p++; @@ -227,6 +231,15 @@ void GCodeParser::parse(char *p) { break; #endif // GCODE_MOTION_MODES + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case 'S': case 'P': case 'R': { + codenum = 0; // The only valid codenum is 0 + uint8_t digits = 0; + while (*p++ == '0') digits++; // Count up '0' characters + command_letter = (digits == 3) ? letter : '?'; // Three '0' digits is a good command + } return; // No parameters, so return + #endif + default: return; } diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 6058db37b3..584e894ae6 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -230,6 +230,50 @@ void report_current_position_projected() { stepper.report_a_position(planner.position); } +#if EITHER(FULL_REPORT_TO_HOST_FEATURE, REALTIME_REPORTING_COMMANDS) + + M_StateEnum M_State_grbl = M_INIT; + + /** + * Output the current grbl compatible state to serial while moving + */ + void report_current_grblstate_moving() { SERIAL_ECHOLNPAIR("S_XYZ:", int(M_State_grbl)); } + + /** + * Output the current position (processed) to serial while moving + */ + void report_current_position_moving() { + + get_cartesian_from_steppers(); + const xyz_pos_t lpos = cartes.asLogical(); + SERIAL_ECHOPAIR("X:", lpos.x, " Y:", lpos.y, " Z:", lpos.z, " E:", current_position.e); + + stepper.report_positions(); + #if IS_SCARA + scara_report_positions(); + #endif + + report_current_grblstate_moving(); + } + + /** + * Set a Grbl-compatible state from the current marlin_state + */ + M_StateEnum grbl_state_for_marlin_state() { + switch (marlin_state) { + case MF_INITIALIZING: return M_INIT; + case MF_SD_COMPLETE: return M_ALARM; + case MF_WAITING: return M_IDLE; + case MF_STOPPED: return M_END; + case MF_RUNNING: return M_RUNNING; + case MF_PAUSED: return M_HOLD; + case MF_KILLED: return M_ERROR; + default: return M_IDLE; + } + } + +#endif + /** * Run out the planner buffer and re-sync the current * position from the last-updated stepper positions. @@ -241,6 +285,20 @@ void quickstop_stepper() { sync_plan_position(); } +#if ENABLED(REALTIME_REPORTING_COMMANDS) + + void quickpause_stepper() { + planner.quick_pause(); + //planner.synchronize(); + } + + void quickresume_stepper() { + planner.quick_resume(); + //planner.synchronize(); + } + +#endif + /** * Set the planner/stepper positions directly from current_position with * no kinematic translation. Used for homing axes and cartesian/core syncing. diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 2cfc8406a5..647b3af52a 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -211,14 +211,49 @@ void report_real_position(); void report_current_position(); void report_current_position_projected(); +#if EITHER(FULL_REPORT_TO_HOST_FEATURE, REALTIME_REPORTING_COMMANDS) + #define HAS_GRBL_STATE 1 + /** + * Machine states for GRBL or TinyG + */ + enum M_StateEnum : uint8_t { + M_INIT = 0, // 0 machine is initializing + M_RESET, // 1 machine is ready for use + M_ALARM, // 2 machine is in alarm state (soft shut down) + M_IDLE, // 3 program stop or no more blocks (M0, M1, M60) + M_END, // 4 program end via M2, M30 + M_RUNNING, // 5 motion is running + M_HOLD, // 6 motion is holding + M_PROBE, // 7 probe cycle active + M_CYCLING, // 8 machine is running (cycling) + M_HOMING, // 9 machine is homing + M_JOGGING, // 10 machine is jogging + M_ERROR // 11 machine is in hard alarm state (shut down) + }; + extern M_StateEnum M_State_grbl; + M_StateEnum grbl_state_for_marlin_state(); + void report_current_grblstate_moving(); + void report_current_position_moving(); + + #if ENABLED(FULL_REPORT_TO_HOST_FEATURE) + inline void set_and_report_grblstate(const M_StateEnum state) { + M_State_grbl = state; + report_current_grblstate_moving(); + } + #endif + + #if ENABLED(REALTIME_REPORTING_COMMANDS) + void quickpause_stepper(); + void quickresume_stepper(); + #endif +#endif + void get_cartesian_from_steppers(); void set_current_from_steppers_for_axis(const AxisEnum axis); void quickstop_stepper(); /** - * sync_plan_position - * * Set the planner/stepper positions directly from current_position with * no kinematic translation. Used for homing axes and cartesian/core syncing. */ diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index b528eb9d3b..f11f273867 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1650,6 +1650,24 @@ void Planner::quick_stop() { stepper.quick_stop(); } +#if ENABLED(REALTIME_REPORTING_COMMANDS) + + void Planner::quick_pause() { + // Suspend until quick_resume is called + // Don't empty buffers or queues + const bool did_suspend = stepper.suspend(); + if (did_suspend) + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_HOLD)); + } + + // Resume if suspended + void Planner::quick_resume() { + TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(grbl_state_for_marlin_state())); + stepper.wake_up(); + } + +#endif + void Planner::endstop_triggered(const AxisEnum axis) { // Record stepper position and discard the current block stepper.endstop_triggered(axis); diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 398339f04e..30eeb758a4 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -873,6 +873,13 @@ class Planner { // a Full Shutdown is required, or when endstops are hit) static void quick_stop(); + #if ENABLED(REALTIME_REPORTING_COMMANDS) + // Force a quick pause of the machine (e.g., when a pause is required in the middle of move). + // NOTE: Hard-stops will lose steps so encoders are highly recommended if using these! + static void quick_pause(); + static void quick_resume(); + #endif + // Called when an endstop is triggered. Causes the machine to stop inmediately static void endstop_triggered(const AxisEnum axis); diff --git a/buildroot/tests/LPC1768 b/buildroot/tests/LPC1768 index eef0857dac..152a49852a 100755 --- a/buildroot/tests/LPC1768 +++ b/buildroot/tests/LPC1768 @@ -26,8 +26,8 @@ restore_configs opt_set MOTHERBOARD BOARD_MKS_SBASE \ EXTRUDERS 2 TEMP_SENSOR_1 1 \ NUM_SERVOS 2 SERVO_DELAY '{ 300, 300 }' -opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR ULTIMAKERCONTROLLER -exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE" "$3" +opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR ULTIMAKERCONTROLLER REALTIME_REPORTING_COMMANDS FULL_REPORT_TO_HOST_FEATURE +exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE, Grbl Realtime Report" "$3" restore_configs opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB \ From c67e115f61deaf896455bfb41961fbe7f1d4398f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Apr 2021 02:43:59 -0500 Subject: [PATCH 1300/1370] Revert experimental NAN patch Hold changes from #21575 (24a095c) for more testing. --- Marlin/src/core/macros.h | 3 -- Marlin/src/feature/bedlevel/abl/abl.cpp | 14 +++---- Marlin/src/feature/bedlevel/bedlevel.cpp | 4 +- .../feature/bedlevel/mbl/mesh_bed_leveling.h | 4 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 10 ++--- Marlin/src/feature/bedlevel/ubl/ubl.h | 6 +-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 40 +++++++++---------- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 18 ++++----- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 22 +++++----- Marlin/src/gcode/bedlevel/ubl/M421.cpp | 2 +- Marlin/src/gcode/calibrate/G33.cpp | 6 +-- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 6 +-- Marlin/src/gcode/calibrate/M48.cpp | 4 +- Marlin/src/gcode/probe/G30.cpp | 2 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 4 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- .../ftdi_eve_lib/extended/adjuster_widget.cpp | 2 +- .../screens/bed_mesh_base.cpp | 2 +- .../screens/bed_mesh_edit_screen.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 4 +- Marlin/src/lcd/menu/menu_tramming.cpp | 2 +- Marlin/src/lcd/tft/ui_1024x600.cpp | 2 +- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- Marlin/src/module/probe.cpp | 20 +++++----- Marlin/src/module/settings.cpp | 14 +++---- Marlin/src/module/temperature.h | 6 +-- platformio.ini | 2 +- 31 files changed, 104 insertions(+), 109 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index ce88458412..6092dc4a59 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -112,9 +112,6 @@ #define SIGN(a) ({__typeof__(a) _a = (a); (_a>0)-(_a<0);}) #define IS_POWER_OF_2(x) ((x) && !((x) & ((x) - 1))) -#define MFNAN 999999.0f -#define ISNAN(V) ((V) == MFNAN) - // Macros to constrain values #ifdef __cplusplus diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index 3d5e6723eb..7390656563 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -43,7 +43,7 @@ bed_mesh_t z_values; * Extrapolate a single point from its neighbors */ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { - if (!ISNAN(z_values[x][y])) return; + if (!isnan(z_values[x][y])) return; if (DEBUGGING(LEVELING)) { DEBUG_ECHOPGM("Extrapolate ["); if (x < 10) DEBUG_CHAR(' '); @@ -63,12 +63,12 @@ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t c1 = z_values[x1][y1], c2 = z_values[x2][y2]; // Treat far unprobed points as zero, near as equal to far - if (ISNAN(a2)) a2 = 0.0; - if (ISNAN(a1)) a1 = a2; - if (ISNAN(b2)) b2 = 0.0; - if (ISNAN(b1)) b1 = b2; - if (ISNAN(c2)) c2 = 0.0; - if (ISNAN(c1)) c1 = c2; + if (isnan(a2)) a2 = 0.0; + if (isnan(a1)) a1 = a2; + if (isnan(b2)) b2 = 0.0; + if (isnan(b1)) b1 = b2; + if (isnan(c2)) c2 = 0.0; + if (isnan(c1)) c1 = c2; const float a = 2 * a1 - a2, b = 2 * b1 - b2, c = 2 * c1 - c2; diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 0a7c0c5a0c..30fafbf57b 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -132,7 +132,7 @@ void reset_bed_level() { bilinear_start.reset(); bilinear_grid_spacing.reset(); GRID_LOOP(x, y) { - z_values[x][y] = MFNAN; + z_values[x][y] = NAN; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, 0)); } #elif ABL_PLANAR @@ -177,7 +177,7 @@ void reset_bed_level() { LOOP_L_N(x, sx) { SERIAL_CHAR(' '); const float offset = fn(x, y); - if (!ISNAN(offset)) { + if (!isnan(offset)) { if (offset >= 0) SERIAL_CHAR('+'); SERIAL_ECHO_F(offset, int(precision)); } diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index eaab7775f5..1ae8135458 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -97,7 +97,6 @@ public: static inline xy_int8_t probe_indexes(const xy_pos_t &xy) { return probe_indexes(xy.x, xy.y); } static float calc_z0(const_float_t a0, const_float_t a1, const_float_t z1, const_float_t a2, const_float_t z2) { - if (ISNAN(a0) || ISNAN(a1) || ISNAN(z1) || ISNAN(a2) || ISNAN(z2)) return MFNAN; const float delta_z = (z2 - z1) / (a2 - a1), delta_a = a0 - a1; return z1 + delta_a * delta_z; @@ -118,8 +117,7 @@ public: z2 = calc_z0(pos.x, x1, z_values[ind.x][ind.y+1], x2, z_values[ind.x+1][ind.y+1]), zf = calc_z0(pos.y, y1, z1, y2, z2); - - return ISNAN(zf) ? zf : z_offset + zf * factor; + return z_offset + zf * factor; } #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 70b7863fab..164d267ceb 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -48,7 +48,7 @@ void unified_bed_leveling::report_current_mesh() { if (!leveling_is_valid()) return; SERIAL_ECHO_MSG(" G29 I999"); GRID_LOOP(x, y) - if (!ISNAN(z_values[x][y])) { + if (!isnan(z_values[x][y])) { SERIAL_ECHO_START(); SERIAL_ECHOPAIR(" M421 I", x, " J", y); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); @@ -99,7 +99,7 @@ void unified_bed_leveling::reset() { void unified_bed_leveling::invalidate() { set_bed_leveling_enabled(false); - set_all_mesh_points_to_value(MFNAN); + set_all_mesh_points_to_value(NAN); } void unified_bed_leveling::set_all_mesh_points_to_value(const_float_t value) { @@ -116,7 +116,7 @@ void unified_bed_leveling::set_all_mesh_points_to_value(const_float_t value) { void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { auto z_to_store = [](const_float_t z) { - if (ISNAN(z)) return Z_STEPS_NAN; + if (isnan(z)) return Z_STEPS_NAN; const int32_t z_scaled = TRUNC(z * mesh_store_scaling); if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) return Z_STEPS_NAN; // If Z is out of range, return our custom 'NaN' @@ -127,7 +127,7 @@ void unified_bed_leveling::set_all_mesh_points_to_value(const_float_t value) { void unified_bed_leveling::set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values) { auto store_to_z = [](const int16_t z_scaled) { - return z_scaled == Z_STEPS_NAN ? MFNAN : z_scaled / mesh_store_scaling; + return z_scaled == Z_STEPS_NAN ? NAN : z_scaled / mesh_store_scaling; }; GRID_LOOP(x, y) out_values[x][y] = store_to_z(stored_values[x][y]); } @@ -211,7 +211,7 @@ void unified_bed_leveling::display_map(const int map_type) { if (lcd) { // TODO: Display on Graphical LCD } - else if (ISNAN(f)) + else if (isnan(f)) SERIAL_ECHOPGM_P(human ? PSTR(" . ") : PSTR("NAN")); else if (human || csv) { if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index a086c20ba8..0a758a57e9 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -196,7 +196,7 @@ public: #ifdef UBL_Z_RAISE_WHEN_OFF_MESH #define _UBL_OUTER_Z_RAISE UBL_Z_RAISE_WHEN_OFF_MESH #else - #define _UBL_OUTER_Z_RAISE MFNAN + #define _UBL_OUTER_Z_RAISE NAN #endif /** @@ -269,7 +269,7 @@ public: const float z2 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][my], mesh_index_to_xpos(cx + 1), z_values[mx][my]); float z0 = calc_z0(ry0, mesh_index_to_ypos(cy), z1, mesh_index_to_ypos(cy + 1), z2); - if (ISNAN(z0)) { // if part of the Mesh is undefined, it will show up as MFNAN + if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN z0 = 0.0; // in ubl.z_values[][] and propagate through the // calculations. If our correction is NAN, we throw it out // because part of the Mesh is undefined and we don't have the @@ -301,7 +301,7 @@ public: #endif static inline bool mesh_is_valid() { - GRID_LOOP(x, y) if (ISNAN(z_values[x][y])) return false; + GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false; return true; } diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index ed2d4c6a94..361f3f1285 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -331,7 +331,7 @@ void unified_bed_leveling::G29() { // to invalidate the ENTIRE mesh, which can't be done with // find_closest_mesh_point (which only returns REAL points). if (closest.pos.x < 0) { invalidate_all = true; break; } - z_values[closest.pos.x][closest.pos.y] = MFNAN; + z_values[closest.pos.x][closest.pos.y] = NAN; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(closest.pos, 0.0f)); } } @@ -516,7 +516,7 @@ void unified_bed_leveling::G29() { if (cpos.x < 0) { // No more REAL INVALID mesh points to populate, so we ASSUME // user meant to populate ALL INVALID mesh points to value - GRID_LOOP(x, y) if (ISNAN(z_values[x][y])) z_values[x][y] = param.C_constant; + GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = param.C_constant; break; // No more invalid Mesh Points to populate } else { @@ -675,7 +675,7 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o float sum = 0; int n = 0; GRID_LOOP(x, y) - if (!ISNAN(z_values[x][y])) { + if (!isnan(z_values[x][y])) { sum += z_values[x][y]; n++; } @@ -687,7 +687,7 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o // float sum_of_diff_squared = 0; GRID_LOOP(x, y) - if (!ISNAN(z_values[x][y])) + if (!isnan(z_values[x][y])) sum_of_diff_squared += sq(z_values[x][y] - mean); SERIAL_ECHOLNPAIR("# of samples: ", n); @@ -698,7 +698,7 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o if (cflag) GRID_LOOP(x, y) - if (!ISNAN(z_values[x][y])) { + if (!isnan(z_values[x][y])) { z_values[x][y] -= mean + offset; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } @@ -709,7 +709,7 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o */ void unified_bed_leveling::shift_mesh_height() { GRID_LOOP(x, y) - if (!ISNAN(z_values[x][y])) { + if (!isnan(z_values[x][y])) { z_values[x][y] += param.C_constant; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } @@ -1017,7 +1017,7 @@ void set_message_with_feedback(PGM_P const msg_P) { ui.refresh(); float new_z = z_values[lpos.x][lpos.y]; - if (ISNAN(new_z)) new_z = 0; // Invalid points begin at 0 + if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place ui.ubl_mesh_edit_start(new_z); @@ -1227,7 +1227,7 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { mesh_index_pair farthest { -1, -1, -99999.99 }; GRID_LOOP(i, j) { - if (!ISNAN(z_values[i][j])) continue; // Skip valid mesh points + if (!isnan(z_values[i][j])) continue; // Skip valid mesh points // Skip unreachable points if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) @@ -1238,7 +1238,7 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { xy_int8_t nearby { -1, -1 }; float d1, d2 = 99999.9f; GRID_LOOP(k, l) { - if (ISNAN(z_values[k][l])) continue; + if (isnan(z_values[k][l])) continue; found_a_real = true; @@ -1282,7 +1282,7 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { static bool test_func(uint8_t i, uint8_t j, void *data) { find_closest_t *d = (find_closest_t*)data; - if ( (d->type == (ISNAN(ubl.z_values[i][j]) ? INVALID : REAL)) + if ( (d->type == (isnan(ubl.z_values[i][j]) ? INVALID : REAL)) || (d->type == SET_IN_BITMAP && !d->done_flags->marked(i, j)) ) { // Found a Mesh Point of the specified type! @@ -1326,7 +1326,7 @@ mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const Mesh float best_so_far = 99999.99f; GRID_LOOP(i, j) { - if ( (type == (ISNAN(z_values[i][j]) ? INVALID : REAL)) + if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) ) { // Found a Mesh Point of the specified type! @@ -1367,12 +1367,12 @@ mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const Mesh bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { const float v = z_values[x][y]; - if (ISNAN(v)) { // A NAN... + if (isnan(v)) { // A NAN... const int8_t dx = x + xdir, dy = y + ydir; const float v1 = z_values[dx][dy]; - if (!ISNAN(v1)) { // ...next to a pair of real values? + if (!isnan(v1)) { // ...next to a pair of real values? const float v2 = z_values[dx + xdir][dy + ydir]; - if (!ISNAN(v2)) { + if (!isnan(v2)) { z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); return true; @@ -1441,7 +1441,7 @@ void unified_bed_leveling::smart_fill_mesh() { TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, param.V_verbosity); - if (ISNAN(measured_z)) + if (isnan(measured_z)) abort_flag = true; else { measured_z -= get_z_correction(points[0]); @@ -1463,7 +1463,7 @@ void unified_bed_leveling::smart_fill_mesh() { #ifdef VALIDATE_MESH_TILT z2 = measured_z; #endif - if (ISNAN(measured_z)) + if (isnan(measured_z)) abort_flag = true; else { measured_z -= get_z_correction(points[1]); @@ -1483,7 +1483,7 @@ void unified_bed_leveling::smart_fill_mesh() { #ifdef VALIDATE_MESH_TILT z3 = measured_z; #endif - if (ISNAN(measured_z)) + if (isnan(measured_z)) abort_flag = true; else { measured_z -= get_z_correction(points[2]); @@ -1522,7 +1522,7 @@ void unified_bed_leveling::smart_fill_mesh() { measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling - abort_flag = ISNAN(measured_z); + abort_flag = isnan(measured_z); #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { @@ -1673,14 +1673,14 @@ void unified_bed_leveling::smart_fill_mesh() { const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); - GRID_LOOP(jx, jy) if (!ISNAN(z_values[jx][jy])) SBI(bitmap[jx], jy); + GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); xy_pos_t ppos; LOOP_L_N(ix, GRID_MAX_POINTS_X) { ppos.x = mesh_index_to_xpos(ix); LOOP_L_N(iy, GRID_MAX_POINTS_Y) { ppos.y = mesh_index_to_ypos(iy); - if (ISNAN(z_values[ix][iy])) { + if (isnan(z_values[ix][iy])) { // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. incremental_LSF_reset(&lsf_results); xy_pos_t rpos; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index cb3f7d3bbe..3ebc5fc2bd 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -85,7 +85,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (!ISNAN(z0)) end.z += z0; + if (!isnan(z0)) end.z += z0; planner.buffer_segment(end, scaled_fr_mm_s, extruder); current_position = destination; return; @@ -150,7 +150,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (ISNAN(z0)) z0 = 0.0; + if (isnan(z0)) z0 = 0.0; const float ry = mesh_index_to_ypos(icell.y); @@ -198,7 +198,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (ISNAN(z0)) z0 = 0.0; + if (isnan(z0)) z0 = 0.0; /** * Without this check, it's possible to generate a zero length move, as in the case where @@ -253,7 +253,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (ISNAN(z0)) z0 = 0.0; + if (isnan(z0)) z0 = 0.0; if (!inf_normalized_flag) { on_axis_distance = use_x_dist ? rx - start.x : next_mesh_line_y - start.y; @@ -276,7 +276,7 @@ // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (ISNAN(z0)) z0 = 0.0; + if (isnan(z0)) z0 = 0.0; if (!inf_normalized_flag) { on_axis_distance = use_x_dist ? next_mesh_line_x - start.x : ry - start.y; @@ -405,10 +405,10 @@ z_x0y1 = z_values[icell.x ][icell.y+1], // z at lower right corner z_x1y1 = z_values[icell.x+1][icell.y+1]; // z at upper right corner - if (ISNAN(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) - if (ISNAN(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points - if (ISNAN(z_x0y1)) z_x0y1 = 0; // in order to avoid ISNAN tests per cell, - if (ISNAN(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points + if (isnan(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) + if (isnan(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points + if (isnan(z_x0y1)) z_x0y1 = 0; // in order to avoid isnan tests per cell, + if (isnan(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points const xy_pos_t pos = { mesh_index_to_xpos(icell.x), mesh_index_to_ypos(icell.y) }; xy_pos_t cell = raw - pos; diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index f1c3ce028d..ad2cc67db0 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -105,7 +105,7 @@ void GcodeSuite::G35() { do_blocking_move_to_z(SUM_TERN(BLTOUCH_HS_MODE, Z_CLEARANCE_BETWEEN_PROBES, 7)); const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true); - if (ISNAN(z_probed_height)) { + if (isnan(z_probed_height)) { SERIAL_ECHOPAIR("G35 failed at point ", i, " ("); SERIAL_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i])); SERIAL_CHAR(')'); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index a10b2b89b1..8cc0a66216 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -288,11 +288,11 @@ G29_TYPE GcodeSuite::G29() { G29_RETURN(false); } - const float rx = RAW_X_POSITION(parser.linearval('X', MFNAN)), - ry = RAW_Y_POSITION(parser.linearval('Y', MFNAN)); + const float rx = RAW_X_POSITION(parser.linearval('X', NAN)), + ry = RAW_Y_POSITION(parser.linearval('Y', NAN)); int8_t i = parser.byteval('I', -1), j = parser.byteval('J', -1); - if (!ISNAN(rx) && !ISNAN(ry)) { + if (!isnan(rx) && !isnan(ry)) { // Get nearest i / j from rx / ry i = (rx - bilinear_start.x + 0.5 * abl.gridSpacing.x) / abl.gridSpacing.x; j = (ry - bilinear_start.y + 0.5 * abl.gridSpacing.y) / abl.gridSpacing.y; @@ -609,7 +609,7 @@ G29_TYPE GcodeSuite::G29() { // Outer loop is X with PROBE_Y_FIRST enabled // Outer loop is Y with PROBE_Y_FIRST disabled - for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_SIZE && !ISNAN(abl.measured_z); PR_OUTER_VAR++) { + for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_SIZE && !isnan(abl.measured_z); PR_OUTER_VAR++) { int8_t inStart, inStop, inInc; @@ -645,7 +645,7 @@ G29_TYPE GcodeSuite::G29() { abl.measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); - if (ISNAN(abl.measured_z)) { + if (isnan(abl.measured_z)) { set_bed_leveling_enabled(abl.reenable); break; // Breaks out of both loops } @@ -691,14 +691,14 @@ G29_TYPE GcodeSuite::G29() { // Retain the last probe position abl.probePos = points[i]; abl.measured_z = faux ? 0.001 * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); - if (ISNAN(abl.measured_z)) { + if (isnan(abl.measured_z)) { set_bed_leveling_enabled(abl.reenable); break; } points[i].z = abl.measured_z; } - if (!abl.dryrun && !ISNAN(abl.measured_z)) { + if (!abl.dryrun && !isnan(abl.measured_z)) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); if (planeNormal.z < 0) planeNormal *= -1; planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); @@ -714,7 +714,7 @@ G29_TYPE GcodeSuite::G29() { // Stow the probe. No raise for FIX_MOUNTED_PROBE. if (probe.stow()) { set_bed_leveling_enabled(abl.reenable); - abl.measured_z = MFNAN; + abl.measured_z = NAN; } } #endif // !PROBE_MANUALLY @@ -737,7 +737,7 @@ G29_TYPE GcodeSuite::G29() { #endif // Calculate leveling, print reports, correct the position - if (!ISNAN(abl.measured_z)) { + if (!isnan(abl.measured_z)) { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) if (!abl.dryrun) extrapolate_unprobed_bed_level(); @@ -874,7 +874,7 @@ G29_TYPE GcodeSuite::G29() { // Auto Bed Leveling is complete! Enable if possible. planner.leveling_active = !abl.dryrun || abl.reenable; - } // !ISNAN(abl.measured_z) + } // !isnan(abl.measured_z) // Restore state after probing if (!faux) restore_feedrate_and_scaling(); @@ -900,7 +900,7 @@ G29_TYPE GcodeSuite::G29() { TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); - G29_RETURN(ISNAN(abl.measured_z)); + G29_RETURN(isnan(abl.measured_z)); } #endif // HAS_ABL_NOT_UBL diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp index 694ad7ab81..600c1fc8ba 100644 --- a/Marlin/src/gcode/bedlevel/ubl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/M421.cpp @@ -62,7 +62,7 @@ void GcodeSuite::M421() { SERIAL_ERROR_MSG(STR_ERR_MESH_XY); else { float &zval = ubl.z_values[ij.x][ij.y]; - zval = hasN ? MFNAN : parser.value_linear_units() + (hasQ ? zval : 0); + zval = hasN ? NAN : parser.value_linear_units() + (hasQ ? zval : 0); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ij.x, ij.y, zval)); } } diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index db1d456d70..d60099a330 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -212,7 +212,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center const xy_pos_t center{0}; z_pt[CEN] += calibration_probe(center, stow_after_each); - if (ISNAN(z_pt[CEN])) return false; + if (isnan(z_pt[CEN])) return false; } if (_7p_calibration) { // probe extra center points @@ -223,7 +223,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi r = dcr * 0.1; const xy_pos_t vec = { cos(a), sin(a) }; z_pt[CEN] += calibration_probe(vec * r, stow_after_each); - if (ISNAN(z_pt[CEN])) return false; + if (isnan(z_pt[CEN])) return false; } z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points); } @@ -248,7 +248,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi interpol = FMOD(rad, 1); const xy_pos_t vec = { cos(a), sin(a) }; const float z_temp = calibration_probe(vec * r, stow_after_each); - if (ISNAN(z_temp)) return false; + if (isnan(z_temp)) return false; // split probe point to neighbouring calibration points z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90))); z_pt[uint8_t(LROUND(rad - interpol)) % NPP + 1] += z_temp * sq(sin(RADIANS(interpol * 90))); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 959d0f9c09..1614dd6fbd 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -229,7 +229,7 @@ void GcodeSuite::G34() { // Probing sanity check is disabled, as it would trigger even in normal cases because // current_position.z has been manually altered in the "dirty trick" above. const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false); - if (ISNAN(z_probed_height)) { + if (isnan(z_probed_height)) { SERIAL_ECHOLNPGM("Probing failed"); LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); err_break = true; diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index db1a6db76d..8cfe6fee7b 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -113,7 +113,7 @@ void GcodeSuite::G76() { auto g76_probe = [](const TempSensorID sid, uint16_t &targ, const xy_pos_t &nozpos) { do_z_clearance(5.0); // Raise nozzle before probing const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false - if (ISNAN(measured_z)) + if (isnan(measured_z)) SERIAL_ECHOLNPGM("!Received NAN. Aborting."); else { SERIAL_ECHOLNPAIR_F("Measured: ", measured_z); @@ -208,7 +208,7 @@ void GcodeSuite::G76() { report_temps(next_temp_report); const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz); - if (ISNAN(measured_z) || target_bed > BED_MAX_TARGET) break; + if (isnan(measured_z) || target_bed > BED_MAX_TARGET) break; } SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); @@ -267,7 +267,7 @@ void GcodeSuite::G76() { if (timeout) break; const float measured_z = g76_probe(TSI_PROBE, target_probe, noz_pos_xyz); - if (ISNAN(measured_z) || target_probe > cali_info_init[TSI_PROBE].end_temp) break; + if (isnan(measured_z) || target_probe > cali_info_init[TSI_PROBE].end_temp) break; } SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 07e248fc3d..19b11f602a 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -134,7 +134,7 @@ void GcodeSuite::M48() { // Move to the first point, deploy, and probe const float t = probe.probe_at_point(test_position, raise_after, verbose_level); - bool probing_good = !ISNAN(t); + bool probing_good = !isnan(t); if (probing_good) { randomSeed(millis()); @@ -219,7 +219,7 @@ void GcodeSuite::M48() { const float pz = probe.probe_at_point(test_position, raise_after, 0); // Break the loop if the probe fails - probing_good = !ISNAN(pz); + probing_good = !isnan(pz); if (!probing_good) break; // Store the new sample diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index ebdc19f582..4347f55aa8 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -52,7 +52,7 @@ void GcodeSuite::G30() { const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; const float measured_z = probe.probe_at_point(pos, raise_after, 1); - if (!ISNAN(measured_z)) + if (!isnan(measured_z)) SERIAL_ECHOLNPAIR("Bed X: ", pos.x, " Y: ", pos.y, " Z: ", measured_z); restore_feedrate_and_scaling(); diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 0444c9e185..6ed4d33630 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1460,7 +1460,7 @@ void MarlinUI::draw_status_screen() { * Print Z values */ _ZLABEL(_LCD_W_POS, 1); - if (!ISNAN(ubl.z_values[x_plot][y_plot])) + if (!isnan(ubl.z_values[x_plot][y_plot])) lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); else lcd_put_u8str_P(PSTR(" -----")); @@ -1479,7 +1479,7 @@ void MarlinUI::draw_status_screen() { * Show the location value */ _ZLABEL(_LCD_W_POS, 3); - if (!ISNAN(ubl.z_values[x_plot][y_plot])) + if (!isnan(ubl.z_values[x_plot][y_plot])) lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); else lcd_put_u8str_P(PSTR(" -----")); diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 6edde2c604..ddc33c4923 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -943,7 +943,7 @@ void MarlinUI::draw_status_screen() { // Show the location value lcd.setCursor(_LCD_W_POS, 3); lcd_put_u8str_P(PSTR("Z:")); - if (!ISNAN(ubl.z_values[x_plot][y_plot])) + if (!isnan(ubl.z_values[x_plot][y_plot])) lcd.print(ftostr43sign(ubl.z_values[x_plot][y_plot])); else lcd_put_u8str_P(PSTR(" -----")); diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 89f7746438..dc60c1bff3 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -569,7 +569,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Show the location value lcd_put_u8str_P(74, LCD_PIXEL_HEIGHT, Z_LBL); - if (!ISNAN(ubl.z_values[x_plot][y_plot])) + if (!isnan(ubl.z_values[x_plot][y_plot])) lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); else lcd_put_u8str_P(PSTR(" -----")); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp index 531f759c49..26be9f4e59 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp @@ -32,7 +32,7 @@ namespace FTDI { void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) { char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; - if (ISNAN(value)) + if (isnan(value)) strcpy_P(str, PSTR("-")); else dtostrf(value, width, precision, str); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp index d64238808c..e83f09f045 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_base.cpp @@ -31,7 +31,7 @@ void BedMeshBase::_drawMesh(CommandProcessor &cmd, int16_t x, int16_t y, int16_t constexpr uint8_t cols = GRID_MAX_POINTS_X; #define VALUE(X,Y) (func ? func(X,Y,data) : 0) - #define ISVAL(X,Y) (func ? !ISNAN(VALUE(X,Y)) : true) + #define ISVAL(X,Y) (func ? !isnan(VALUE(X,Y)) : true) #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) // Compute the mean, min and max for the points diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp index 94e43bdec1..f2c775c993 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_edit_screen.cpp @@ -79,7 +79,7 @@ void BedMeshEditScreen::onExit() { float BedMeshEditScreen::getHighlightedValue() { const float val = ExtUI::getMeshPoint(mydata.highlight); - return (ISNAN(val) ? 0 : val) + mydata.zAdjustment; + return (isnan(val) ? 0 : val) + mydata.zAdjustment; } void BedMeshEditScreen::setHighlightedValue(float value) { diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index c03a10fcd3..66bc10c411 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -421,7 +421,7 @@ namespace ExtUI { #if AXIS_IS_TMC(Z2) case Z2: return stepperZ2.getMilliamps(); #endif - default: return MFNAN; + default: return NAN; }; } @@ -451,7 +451,7 @@ namespace ExtUI { #if AXIS_IS_TMC(E7) case E7: return stepperE7.getMilliamps(); #endif - default: return MFNAN; + default: return NAN; }; } diff --git a/Marlin/src/lcd/menu/menu_tramming.cpp b/Marlin/src/lcd/menu/menu_tramming.cpp index 0dc468e805..da7afd86ef 100644 --- a/Marlin/src/lcd/menu/menu_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_tramming.cpp @@ -54,7 +54,7 @@ static bool probe_single_point() { z_measured[tram_index] = z_probed_height; move_to_tramming_wait_pos(); - return !ISNAN(z_probed_height); + return !isnan(z_probed_height); } static void _menu_single_probe(const uint8_t point) { diff --git a/Marlin/src/lcd/tft/ui_1024x600.cpp b/Marlin/src/lcd/tft/ui_1024x600.cpp index 819414b828..e04d589858 100644 --- a/Marlin/src/lcd/tft/ui_1024x600.cpp +++ b/Marlin/src/lcd/tft/ui_1024x600.cpp @@ -505,7 +505,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft_string.set(Z_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ISNAN(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); tft_string.trim(); tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 8429907f96..5563d3069b 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -492,7 +492,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft_string.set(Z_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ISNAN(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); tft_string.trim(); tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 4b02b21ea6..4d5a0b4fda 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -492,7 +492,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft_string.set(Z_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ISNAN(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); tft_string.trim(); tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d408dd236d..d4b8409efa 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -583,7 +583,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { * @details Used by probe_at_point to get the bed Z height at the current XY. * Leaves current_position.z at the height where the probe triggered. * - * @return The Z position of the bed at the current XY or MFNAN on error. + * @return The Z position of the bed at the current XY or NAN on error. */ float Probe::run_z_probe(const bool sanity_check/*=true*/) { DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); @@ -617,11 +617,11 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { #if TOTAL_PROBING == 2 // Attempt to tare the probe - if (TERN0(PROBE_TARE, tare())) return MFNAN; + if (TERN0(PROBE_TARE, tare())) return NAN; // Do a first probe at the fast speed if (try_to_probe(PSTR("FAST"), z_probe_low_point, z_probe_fast_mm_s, - sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return MFNAN; + sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return NAN; const float first_probe_z = current_position.z; @@ -662,7 +662,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { // Probe downward slowly to find the bed if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW), - sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return MFNAN; + sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return NAN; TERN_(MEASURE_BACKLASH_WHEN_PROBING, backlash.measure_with_probe()); @@ -765,29 +765,29 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai if (probe_relative) { // The given position is in terms of the probe if (!can_reach(npos)) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Position Not Reachable"); - return MFNAN; + return NAN; } npos -= offset_xy; // Get the nozzle position } - else if (!position_is_reachable(npos)) return MFNAN; // The given position is in terms of the nozzle + else if (!position_is_reachable(npos)) return NAN; // The given position is in terms of the nozzle // Move the probe to the starting XYZ do_blocking_move_to(npos, feedRate_t(XY_PROBE_FEEDRATE_MM_S)); - float measured_z = MFNAN; + float measured_z = NAN; if (!deploy()) measured_z = run_z_probe(sanity_check) + offset.z; - if (!ISNAN(measured_z)) { + if (!isnan(measured_z)) { const bool big_raise = raise_after == PROBE_PT_BIG_RAISE; if (big_raise || raise_after == PROBE_PT_RAISE) do_blocking_move_to_z(current_position.z + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), z_probe_fast_mm_s); else if (raise_after == PROBE_PT_STOW) - if (stow()) measured_z = MFNAN; // Error on stow? + if (stow()) measured_z = NAN; // Error on stow? if (verbose_level > 2) SERIAL_ECHOLNPAIR("Bed X: ", LOGICAL_X_POSITION(rx), " Y: ", LOGICAL_Y_POSITION(ry), " Z: ", measured_z); } - if (ISNAN(measured_z)) { + if (isnan(measured_z)) { stow(); LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); #if DISABLED(G29_RETRY_AND_RECOVER) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d1fd719cfb..915886fe4a 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -900,8 +900,8 @@ void MarlinSettings::postprocess() { HOTEND_LOOP() { PIDCF_t pidcf = { #if DISABLED(PIDTEMP) - MFNAN, MFNAN, MFNAN, - MFNAN, MFNAN + NAN, NAN, NAN, + NAN, NAN #else PID_PARAM(Kp, e), unscalePID_i(PID_PARAM(Ki, e)), @@ -928,7 +928,7 @@ void MarlinSettings::postprocess() { const PID_t bed_pid = { #if DISABLED(PIDTEMPBED) - MFNAN, MFNAN, MFNAN + NAN, NAN, NAN #else // Store the unscaled PID values thermalManager.temp_bed.pid.Kp, @@ -947,7 +947,7 @@ void MarlinSettings::postprocess() { const PID_t chamber_pid = { #if DISABLED(PIDTEMPCHAMBER) - MFNAN, MFNAN, MFNAN + NAN, NAN, NAN #else // Store the unscaled PID values thermalManager.temp_chamber.pid.Kp, @@ -1786,7 +1786,7 @@ void MarlinSettings::postprocess() { PIDCF_t pidcf; EEPROM_READ(pidcf); #if ENABLED(PIDTEMP) - if (!validating && !ISNAN(pidcf.Kp)) { + if (!validating && !isnan(pidcf.Kp)) { // Scale PID values since EEPROM values are unscaled PID_PARAM(Kp, e) = pidcf.Kp; PID_PARAM(Ki, e) = scalePID_i(pidcf.Ki); @@ -1818,7 +1818,7 @@ void MarlinSettings::postprocess() { PID_t pid; EEPROM_READ(pid); #if ENABLED(PIDTEMPBED) - if (!validating && !ISNAN(pid.Kp)) { + if (!validating && !isnan(pid.Kp)) { // Scale PID values since EEPROM values are unscaled thermalManager.temp_bed.pid.Kp = pid.Kp; thermalManager.temp_bed.pid.Ki = scalePID_i(pid.Ki); @@ -1834,7 +1834,7 @@ void MarlinSettings::postprocess() { PID_t pid; EEPROM_READ(pid); #if ENABLED(PIDTEMPCHAMBER) - if (!validating && !ISNAN(pid.Kp)) { + if (!validating && !isnan(pid.Kp)) { // Scale PID values since EEPROM values are unscaled thermalManager.temp_chamber.pid.Kp = pid.Kp; thermalManager.temp_chamber.pid.Ki = scalePID_i(pid.Ki); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index e1e7f56d17..d2b3db8747 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -74,9 +74,9 @@ hotend_pid_t; #endif #define PID_PARAM(F,H) _PID_##F(TERN(PID_PARAMS_PER_HOTEND, H, 0 & H)) // Always use 'H' to suppress warning -#define _PID_Kp(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kp, MFNAN) -#define _PID_Ki(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Ki, MFNAN) -#define _PID_Kd(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kd, MFNAN) +#define _PID_Kp(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kp, NAN) +#define _PID_Ki(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Ki, NAN) +#define _PID_Kd(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kd, NAN) #if ENABLED(PIDTEMP) #define _PID_Kc(H) TERN(PID_EXTRUSION_SCALING, Temperature::temp_hotend[H].pid.Kc, 1) #define _PID_Kf(H) TERN(PID_FAN_SCALING, Temperature::temp_hotend[H].pid.Kf, 0) diff --git a/platformio.ini b/platformio.ini index 53db8fc4b1..87b6e8a90b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -38,7 +38,7 @@ extra_configs = # The 'common' values are used for most Marlin builds # [common] -build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants -fno-signed-zeros -ffinite-math-only +build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py From 99fa641a24b543a01fd16e56835ac6d0c8fc2f99 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Apr 2021 02:50:45 -0500 Subject: [PATCH 1301/1370] SDIO cleanup --- Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index 824142b889..3353f8c36b 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -85,8 +85,8 @@ #define SDIO_CMD_PIN PD2 SD_HandleTypeDef hsd; // create SDIO structure - // F4 support one dma for RX and another for TX. - // But Marlin will never do read and write at same time, so we use always one dma for both. + // F4 supports one DMA for RX and another for TX, but Marlin will never + // do read and write at same time, so we use the same DMA for both. DMA_HandleTypeDef hdma_sdio; /* @@ -274,7 +274,7 @@ } static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t *src, uint8_t *dst) { - if(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false; + if (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false; TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); @@ -296,10 +296,10 @@ return false; } - uint32_t timeout = millis() + 500; + millis_t timeout = millis() + 500; // Wait the transfer while (hsd.State != HAL_SD_STATE_READY) { - if (millis() > timeout) { + if (ELAPSED(millis(), timeout)) { HAL_DMA_Abort_IT(&hdma_sdio); HAL_DMA_DeInit(&hdma_sdio); return false; @@ -313,8 +313,7 @@ HAL_DMA_DeInit(&hdma_sdio); timeout = millis() + 500; - while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) - if (millis() > timeout) return false; + while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) if (ELAPSED(millis(), timeout)) return false; return true; } From b6ce7a9f740e4305cf4651b52fc962ea0430958a Mon Sep 17 00:00:00 2001 From: Luca Zimmermann Date: Fri, 16 Apr 2021 11:01:50 +0200 Subject: [PATCH 1302/1370] Always swap with PRIME_FIRST_USED disabled (#21622) --- Marlin/src/module/tool_change.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 3dd63e814c..080c1e629b 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -928,13 +928,15 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #endif // First tool priming. To prime again, reboot the machine. - #if BOTH(TOOLCHANGE_FILAMENT_SWAP, TOOLCHANGE_FS_PRIME_FIRST_USED) + #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) static bool first_tool_is_primed = false; if (new_tool == old_tool && !first_tool_is_primed && enable_first_prime) { tool_change_prime(); first_tool_is_primed = true; - toolchange_extruder_ready[old_tool] = true; // Primed and initialized + TERN_(TOOLCHANGE_FS_INIT_BEFORE_SWAP, toolchange_extruder_ready[old_tool] = true); // Primed and initialized } + #else + constexpr bool first_tool_is_primed = true; #endif if (new_tool != old_tool || TERN0(PARKING_EXTRUDER, extruder_parked)) { // PARKING_EXTRUDER may need to attach old_tool when homing @@ -970,12 +972,10 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (ENABLED(SINGLENOZZLE)) { active_extruder = new_tool; return; } } else { - #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) - // For first new tool, change without unloading the old. 'Just prime/init the new' - if (first_tool_is_primed) - unscaled_e_move(-toolchange_settings.swap_length, MMM_TO_MMS(toolchange_settings.retract_speed)); - first_tool_is_primed = true; // The first new tool will be primed by toolchanging - #endif + // For first new tool, change without unloading the old. 'Just prime/init the new' + if (first_tool_is_primed) + unscaled_e_move(-toolchange_settings.swap_length, MMM_TO_MMS(toolchange_settings.retract_speed)); + TERN_(TOOLCHANGE_FS_PRIME_FIRST_USED, first_tool_is_primed = true); // The first new tool will be primed by toolchanging } } #endif From 61ee5b1d7636a4b29ae19bd137c819a1a1019c14 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Apr 2021 04:04:07 -0500 Subject: [PATCH 1303/1370] Init pwm_thrs to 0 when HYBRID_THRESHOLD is off (#21623) --- Marlin/src/feature/tmc_util.h | 35 ++++++++++++++++---------- Marlin/src/module/stepper/trinamic.cpp | 17 ++++++------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 1767313ba2..0d6105358d 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -120,12 +120,15 @@ class TMCMarlin : public TMC, public TMCStorage { uint32_t get_pwm_thrs() { return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); } - void set_pwm_thrs(const uint32_t thrs) { - TMC::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); - } #endif + void set_pwm_thrs(const uint32_t thrs) { + TMC::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + #if BOTH(HYBRID_THRESHOLD, HAS_LCD_MENU) + this->stored.hybrid_thrs = thrs; + #endif + } + #if USE_SENSORLESS inline int16_t homing_threshold() { return TMC::sgt(); } void homing_threshold(int16_t sgt_val) { @@ -185,19 +188,21 @@ class TMCMarlin : public TMC220 inline bool toggle_stepping_mode() { set_stealthChop(!this->stored.stealthChop_enabled); return get_stealthChop(); } #endif + void set_pwm_thrs(const uint32_t thrs) { + TMC2208Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + #if BOTH(HYBRID_THRESHOLD, HAS_LCD_MENU) + this->stored.hybrid_thrs = thrs; + #endif + } + #if ENABLED(HYBRID_THRESHOLD) uint32_t get_pwm_thrs() { return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); } - void set_pwm_thrs(const uint32_t thrs) { - TMC2208Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); - } #endif #if HAS_LCD_MENU inline void refresh_stepper_current() { rms_current(this->val_mA); } - #if ENABLED(HYBRID_THRESHOLD) inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } #endif @@ -237,11 +242,15 @@ class TMCMarlin : public TMC220 uint32_t get_pwm_thrs() { return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); } - void set_pwm_thrs(const uint32_t thrs) { - TMC2209Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); - } #endif + + void set_pwm_thrs(const uint32_t thrs) { + TMC2209Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + #if BOTH(HYBRID_THRESHOLD, HAS_LCD_MENU) + this->stored.hybrid_thrs = thrs; + #endif + } + #if USE_SENSORLESS inline int16_t homing_threshold() { return TMC2209Stepper::SGTHRS(); } void homing_threshold(int16_t sgt_val) { diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index de3d45e4b6..561e947190 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -158,7 +158,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ampl = 180; st.PWMCONF(pwmconf.sr); - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); st.GSTAT(); // Clear GSTAT } @@ -196,7 +196,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ofs = 36; st.PWMCONF(pwmconf.sr); - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); st.GSTAT(); // Clear GSTAT } @@ -517,7 +517,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ofs = 36; st.PWMCONF(pwmconf.sr); - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); st.GSTAT(0b111); // Clear delay(200); @@ -559,7 +559,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ofs = 36; st.PWMCONF(pwmconf.sr); - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); st.GSTAT(0b111); // Clear delay(200); @@ -617,7 +617,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ampl = 180; st.PWMCONF(pwmconf.sr); - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); st.GSTAT(); // Clear GSTAT } @@ -655,11 +655,8 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ofs = 36; st.PWMCONF(pwmconf.sr); - #if ENABLED(HYBRID_THRESHOLD) - st.set_pwm_thrs(hyb_thrs); - #else - UNUSED(hyb_thrs); - #endif + st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); + st.GSTAT(); // Clear GSTAT } #endif // TMC5160 From e4760ea2b055492f836bcb1ad151f8e7ad357649 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Apr 2021 04:28:16 -0500 Subject: [PATCH 1304/1370] Drop extraneous inlines --- Marlin/src/lcd/menu/menu_bed_corners.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 8635661d01..d28ef1182e 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -102,7 +102,7 @@ static int8_t bed_corner; /** * Select next corner coordinates */ -static inline void _lcd_level_bed_corners_get_next_position() { +static void _lcd_level_bed_corners_get_next_position() { if (level_corners_3_points) { if (bed_corner >= available_points) bed_corner = 0; // Above max position -> move back to first corner @@ -268,7 +268,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { ui.goto_screen(_lcd_draw_probing); do { ui.refresh(LCDVIEW_REDRAW_NOW); - _lcd_draw_probing(); // update screen with # of good points + _lcd_draw_probing(); // update screen with # of good points do_blocking_move_to_z(SUM_TERN(BLTOUCH_HS_MODE, current_position.z + LEVEL_CORNERS_Z_HOP, 7)); // clearance _lcd_level_bed_corners_get_next_position(); // Select next corner coordinates @@ -308,7 +308,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { #else // !LEVEL_CORNERS_USE_PROBE - static inline void _lcd_goto_next_corner() { + static void _lcd_goto_next_corner() { line_to_z(LEVEL_CORNERS_Z_HOP); // Select next corner coordinates @@ -321,7 +321,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { #endif // !LEVEL_CORNERS_USE_PROBE -static inline void _lcd_level_bed_corners_homing() { +static void _lcd_level_bed_corners_homing() { _lcd_draw_homing(); if (!all_axes_homed()) return; #if ENABLED(LEVEL_CORNERS_USE_PROBE) From 791edd0cec6df6bdd69dfedd8acca4f60c394212 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 14 Apr 2021 00:26:57 -0500 Subject: [PATCH 1305/1370] Use itoa for sprintf int --- Marlin/src/HAL/DUE/usb/usb_task.c | 2 +- .../lib/mks_ui/draw_acceleration_settings.cpp | 10 +++++----- .../lib/mks_ui/draw_filament_settings.cpp | 10 +++++----- .../draw_homing_sensitivity_settings.cpp | 8 ++++---- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 6 +++--- .../lib/mks_ui/draw_tramming_pos_settings.cpp | 20 +++++++++---------- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Marlin/src/HAL/DUE/usb/usb_task.c b/Marlin/src/HAL/DUE/usb/usb_task.c index acb1d5b933..54a808d7f4 100644 --- a/Marlin/src/HAL/DUE/usb/usb_task.c +++ b/Marlin/src/HAL/DUE/usb/usb_task.c @@ -322,7 +322,7 @@ void usb_task_init(void) { char *sptr; // Patch in the filament diameter - sprintf_P(diam, PSTR("%d"), (int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000.0)); + itoa((int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000), diam, 10); // And copy it to the proper place, expanding it to unicode sptr = &diam[0]; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp index 7bc5a263b4..8137c3a909 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -119,22 +119,22 @@ void lv_draw_acceleration_settings() { dtostrf(planner.settings.travel_acceleration, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.TravelAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_ACCE_TRAVEL, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + itoa(planner.settings.max_acceleration_mm_per_s2[X_AXIS], public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.X_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_ACCE_X, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_ACCE_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + itoa(planner.settings.max_acceleration_mm_per_s2[Y_AXIS], public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_ACCE_Y, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + itoa(planner.settings.max_acceleration_mm_per_s2[Z_AXIS], public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_ACCE_Z, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + itoa(planner.settings.max_acceleration_mm_per_s2[E_AXIS], public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.E0_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_ACCE_E0, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); + itoa(planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.E1_Acceleration, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_ACCE_E1, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_ACCE_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index 553cb29895..d78c9ed0cb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -92,22 +92,22 @@ void lv_draw_filament_settings() { scr = lv_screen_create(FILAMENT_SETTINGS_UI, machine_menu.FilamentConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); + itoa(gCfgItems.filamentchange_load_length, public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.InLength, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_IN_LENGTH, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_speed); + itoa(gCfgItems.filamentchange_load_speed, public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.InSpeed, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FILAMENT_SET_IN_SPEED, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_length); + itoa(gCfgItems.filamentchange_unload_length, public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.OutLength, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_FILAMENT_SET_OUT_LENGTH, 2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_speed); + itoa(gCfgItems.filamentchange_unload_speed, public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.OutSpeed, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_FILAMENT_SET_OUT_SPEED, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temp); + itoa(gCfgItems.filament_limit_temp, public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.FilamentTemperature, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_TEMP, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp index 9a1c9dec2a..696463d3eb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp @@ -77,17 +77,17 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_homing_sensitivity_settings() { scr = lv_screen_create(HOMING_SENSITIVITY_UI, machine_menu.HomingSensitivityConfTitle); - sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); + itoa(TERN(X_SENSORLESS, stepperX.homing_threshold(), 0), public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.X_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_SENSITIVITY_X, 0, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); + itoa(TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0), public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_SENSITIVITY_Y, 1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); + itoa(TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0), public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_SENSITIVITY_Z, 2, public_buf_l); #if Z2_SENSORLESS - sprintf_P(public_buf_l, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); + itoa(TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0), public_buf_l, 10); lv_screen_menu_item_1_edit(scr, machine_menu.Z2_Sensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_SENSITIVITY_Z2, 3, public_buf_l); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 09784b5184..8340e2ae87 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -216,7 +216,7 @@ void lv_draw_ready_print() { labelFan = lv_label_create(scr, 380, 80, nullptr); - sprintf_P(buf, PSTR("%d"), (int)thermalManager.degHotend(0)); + itoa(thermalManager.degHotend(0), buf, 10); lv_label_set_text(labelExt1, buf); lv_obj_align(labelExt1, buttonExt1, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetHotend(0)); @@ -224,7 +224,7 @@ void lv_draw_ready_print() { lv_obj_align(labelExt1Target, buttonExt1, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); #if HAS_MULTI_EXTRUDER - sprintf_P(buf, PSTR("%d"), (int)thermalManager.degHotend(1)); + itoa(thermalManager.degHotend(1), buf, 10); lv_label_set_text(labelExt2, buf); lv_obj_align(labelExt2, buttonExt2, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetHotend(1)); @@ -233,7 +233,7 @@ void lv_draw_ready_print() { #endif #if HAS_HEATED_BED - sprintf_P(buf, PSTR("%d"), (int)thermalManager.degBed()); + itoa(thermalManager.degBed(), buf, 10); lv_label_set_text(labelBed, buf); lv_obj_align(labelBed, buttonBedstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetBed()); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp index 9b6c11d335..539c7639dc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp @@ -107,27 +107,27 @@ void lv_draw_tramming_pos_settings() { scr = lv_screen_create(MANUAL_LEVELING_POSIGION_UI, machine_menu.LevelingParaConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[0].x); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[0].y); + itoa(gCfgItems.trammingPos[0].x, public_buf_l, 10); + itoa(gCfgItems.trammingPos[0].y, buf2, 10); lv_screen_menu_item_2_edit(scr, leveling_menu.position1, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y1, 0, buf2, ID_MANUAL_POS_X1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[1].x); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[1].y); + itoa(gCfgItems.trammingPos[1].x, public_buf_l, 10); + itoa(gCfgItems.trammingPos[1].y, buf2, 10); lv_screen_menu_item_2_edit(scr, leveling_menu.position2, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MANUAL_POS_Y2, 1, buf2, ID_MANUAL_POS_X2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[2].x); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[2].y); + itoa(gCfgItems.trammingPos[2].x, public_buf_l, 10); + itoa(gCfgItems.trammingPos[2].y, buf2, 10); lv_screen_menu_item_2_edit(scr, leveling_menu.position3, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_MANUAL_POS_Y3, 2, buf2, ID_MANUAL_POS_X3, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[3].x); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[3].y); + itoa(gCfgItems.trammingPos[3].x, public_buf_l, 10); + itoa(gCfgItems.trammingPos[3].y, buf2, 10); lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_MANUAL_POS_Y4, 3, buf2, ID_MANUAL_POS_X4, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[4].x); - sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[4].y); + itoa(gCfgItems.trammingPos[4].x, public_buf_l, 10); + itoa(gCfgItems.trammingPos[4].y, buf2, 10); lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y5, 0, buf2, ID_MANUAL_POS_X5, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_UP, true); From 2e726c46c87ea1707203b9019d14cf82872be9e8 Mon Sep 17 00:00:00 2001 From: MangaValk Date: Fri, 16 Apr 2021 15:02:31 +0200 Subject: [PATCH 1306/1370] Tool sensors (#17239) --- Marlin/Configuration_adv.h | 6 + Marlin/src/MarlinCore.cpp | 7 +- Marlin/src/lcd/menu/menu_configuration.cpp | 1 + Marlin/src/module/tool_change.cpp | 156 +++++++++++++++++--- Marlin/src/module/tool_change.h | 9 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 16 +- buildroot/tests/BIGTREE_GTR_V1_0 | 7 + 7 files changed, 174 insertions(+), 28 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 578bf144fc..02a5ff0eeb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2198,6 +2198,12 @@ //#define EVENT_GCODE_AFTER_TOOLCHANGE "G12X" // Extra G-code to run after tool-change #endif + /** + * Tool Sensors detect when tools have been picked up or dropped. + * Requires the pins TOOL_SENSOR1_PIN, TOOL_SENSOR2_PIN, etc. + */ + //#define TOOL_SENSOR + /** * Retract and prime filament on tool-change to reduce * ooze and stringing and to get cleaner transitions. diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 842429a407..2e1eab86de 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -210,9 +210,7 @@ #include "feature/fanmux.h" #endif -#if DO_SWITCH_EXTRUDER || ANY(SWITCHING_NOZZLE, PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER, ELECTROMAGNETIC_SWITCHING_TOOLHEAD, SWITCHING_TOOLHEAD) - #include "module/tool_change.h" -#endif +#include "module/tool_change.h" #if ENABLED(USE_CONTROLLER_FAN) #include "feature/controllerfan.h" @@ -731,6 +729,9 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { // Return if setup() isn't completed if (marlin_state == MF_INITIALIZING) goto IDLE_DONE; + // TODO: Still causing errors + (void)check_tool_sensor_stats(active_extruder, true); + // Handle filament runout sensors TERN_(HAS_FILAMENT_SENSOR, runout.run()); diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 7ef49f0cf8..7ea355b795 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -130,6 +130,7 @@ void menu_advanced_settings(); #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) #include "../../module/motion.h" // for active_extruder + #include "../../gcode/queue.h" void menu_toolchange_migration() { PGM_P const msg_migrate = GET_TEXT(MSG_TOOL_MIGRATION_SWAP); diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 080c1e629b..2b8a434172 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -49,10 +49,14 @@ bool toolchange_extruder_ready[EXTRUDERS]; #endif -#if ENABLED(MAGNETIC_PARKING_EXTRUDER) || defined(EVENT_GCODE_AFTER_TOOLCHANGE) || (ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0) +#if EITHER(MAGNETIC_PARKING_EXTRUDER, TOOL_SENSOR) || defined(EVENT_GCODE_AFTER_TOOLCHANGE) || (ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0) #include "../gcode/gcode.h" #endif +#if ENABLED(TOOL_SENSOR) + #include "../lcd/marlinui.h" +#endif + #if ENABLED(DUAL_X_CARRIAGE) #include "stepper.h" #endif @@ -147,11 +151,11 @@ #endif // SWITCHING_NOZZLE -inline void _line_to_current(const AxisEnum fr_axis, const float fscale=1) { +void _line_to_current(const AxisEnum fr_axis, const float fscale=1) { line_to_current_position(planner.settings.max_feedrate_mm_s[fr_axis] * fscale); } -inline void slow_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.5f); } -inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis); } +void slow_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.2f); } +void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.5f); } #if ENABLED(MAGNETIC_PARKING_EXTRUDER) @@ -370,7 +374,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_POS("PE Tool-Change done.", current_position); parking_extruder_set_parked(false); } - else if (do_solenoid_activation) { // && nomove == true + else if (do_solenoid_activation) { // Deactivate current extruder solenoid pe_solenoid_set_pin_state(active_extruder, !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE); // Engage new extruder magnetic field @@ -384,12 +388,117 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #if ENABLED(SWITCHING_TOOLHEAD) - inline void swt_lock(const bool locked=true) { - const uint16_t swt_angles[2] = SWITCHING_TOOLHEAD_SERVO_ANGLES; - MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, swt_angles[locked ? 0 : 1]); + // Return a bitmask of tool sensor states + inline uint8_t poll_tool_sensor_pins() { + return (0 + #if ENABLED(TOOL_SENSOR) + #if PIN_EXISTS(TOOL_SENSOR1) + | (READ(TOOL_SENSOR1_PIN) << 0) + #endif + #if PIN_EXISTS(TOOL_SENSOR2) + | (READ(TOOL_SENSOR2_PIN) << 1) + #endif + #if PIN_EXISTS(TOOL_SENSOR3) + | (READ(TOOL_SENSOR3_PIN) << 2) + #endif + #if PIN_EXISTS(TOOL_SENSOR4) + | (READ(TOOL_SENSOR4_PIN) << 3) + #endif + #if PIN_EXISTS(TOOL_SENSOR5) + | (READ(TOOL_SENSOR5_PIN) << 4) + #endif + #if PIN_EXISTS(TOOL_SENSOR6) + | (READ(TOOL_SENSOR6_PIN) << 5) + #endif + #if PIN_EXISTS(TOOL_SENSOR7) + | (READ(TOOL_SENSOR7_PIN) << 6) + #endif + #if PIN_EXISTS(TOOL_SENSOR8) + | (READ(TOOL_SENSOR8_PIN) << 7) + #endif + #endif + ); } - void swt_init() { swt_lock(); } + #if ENABLED(TOOL_SENSOR) + + bool tool_sensor_disabled; // = false + + uint8_t check_tool_sensor_stats(const uint8_t tool_index, const bool kill_on_error/*=false*/, const bool disable/*=false*/) { + static uint8_t sensor_tries; // = 0 + for (;;) { + if (poll_tool_sensor_pins() == _BV(tool_index)) { + sensor_tries = 0; + return tool_index; + } + else if (kill_on_error && (!tool_sensor_disabled || disable)) { + sensor_tries++; + if (sensor_tries > 10) kill(PSTR("Tool Sensor error")); + safe_delay(5); + } + else { + sensor_tries++; + if (sensor_tries > 10) return -1; + safe_delay(5); + } + } + } + + #endif + + inline void switching_toolhead_lock(const bool locked) { + #ifdef SWITCHING_TOOLHEAD_SERVO_ANGLES + const uint16_t swt_angles[2] = SWITCHING_TOOLHEAD_SERVO_ANGLES; + MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, swt_angles[locked ? 0 : 1]); + #elif PIN_EXISTS(SWT_SOLENOID) + OUT_WRITE(SWT_SOLENOID_PIN, locked); + gcode.dwell(10); + #else + #error "No toolhead locking mechanism configured." + #endif + } + + #include + + void swt_init() { + switching_toolhead_lock(true); + + #if ENABLED(TOOL_SENSOR) + // Init tool sensors + #if PIN_EXISTS(TOOL_SENSOR1) + SET_INPUT_PULLUP(TOOL_SENSOR1_PIN); + #endif + #if PIN_EXISTS(TOOL_SENSOR2) + SET_INPUT_PULLUP(TOOL_SENSOR2_PIN); + #endif + #if PIN_EXISTS(TOOL_SENSOR3) + SET_INPUT_PULLUP(TOOL_SENSOR3_PIN); + #endif + #if PIN_EXISTS(TOOL_SENSOR4) + SET_INPUT_PULLUP(TOOL_SENSOR4_PIN); + #endif + #if PIN_EXISTS(TOOL_SENSOR5) + SET_INPUT_PULLUP(TOOL_SENSOR5_PIN); + #endif + #if PIN_EXISTS(TOOL_SENSOR6) + SET_INPUT_PULLUP(TOOL_SENSOR6_PIN); + #endif + #if PIN_EXISTS(TOOL_SENSOR7) + SET_INPUT_PULLUP(TOOL_SENSOR7_PIN); + #endif + #if PIN_EXISTS(TOOL_SENSOR8) + SET_INPUT_PULLUP(TOOL_SENSOR8_PIN); + #endif + + if (check_tool_sensor_stats(0)) { + ui.set_status_P("TC error"); + switching_toolhead_lock(false); + while (check_tool_sensor_stats(0)) { /* nada */ } + switching_toolhead_lock(true); + } + ui.set_status_P("TC Success"); + #endif + } inline void switching_toolhead_tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (no_move) return; @@ -398,6 +507,8 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a const float placexpos = toolheadposx[active_extruder], grabxpos = toolheadposx[new_tool]; + (void)check_tool_sensor_stats(active_extruder, true); + /** * 1. Move to switch position of current toolhead * 2. Unlock tool and drop it in the dock @@ -421,13 +532,14 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_SYNCHRONIZE(); DEBUG_POS("Move Y SwitchPos + Security", current_position); - fast_line_to_current(Y_AXIS); + slow_line_to_current(Y_AXIS); // 2. Unlock tool and drop it in the dock + TERN_(TOOL_SENSOR, tool_sensor_disabled = true); planner.synchronize(); DEBUG_ECHOLNPGM("(2) Unlock and Place Toolhead"); - swt_lock(false); + switching_toolhead_lock(false); safe_delay(500); current_position.y = SWITCHING_TOOLHEAD_Y_POS; @@ -440,7 +552,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; DEBUG_POS("Move back Y clear", current_position); - fast_line_to_current(Y_AXIS); // move away from docked toolhead + slow_line_to_current(Y_AXIS); // move away from docked toolhead + + (void)check_tool_sensor_stats(active_extruder); // 3. Move to the new toolhead @@ -457,7 +571,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_SYNCHRONIZE(); DEBUG_POS("Move Y SwitchPos + Security", current_position); - fast_line_to_current(Y_AXIS); + slow_line_to_current(Y_AXIS); // 4. Grab and lock the new toolhead @@ -472,14 +586,19 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // Wait for move to finish, pause 0.2s, move servo, pause 0.5s planner.synchronize(); safe_delay(200); - swt_lock(); + + (void)check_tool_sensor_stats(new_tool, true, true); + + switching_toolhead_lock(true); safe_delay(500); current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; DEBUG_POS("Move back Y clear", current_position); - fast_line_to_current(Y_AXIS); // Move away from docked toolhead + slow_line_to_current(Y_AXIS); // Move away from docked toolhead planner.synchronize(); // Always sync the final move + (void)check_tool_sensor_stats(new_tool, true, true); + DEBUG_POS("ST Tool-Change done.", current_position); } @@ -1053,8 +1172,11 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { move_nozzle_servo(new_tool); #endif - // Set the new active extruder - if (DISABLED(DUAL_X_CARRIAGE)) active_extruder = new_tool; + IF_DISABLED(DUAL_X_CARRIAGE, active_extruder = new_tool); // Set the new active extruder + + TERN_(TOOL_SENSOR, tool_sensor_disabled = false); + + (void)check_tool_sensor_stats(active_extruder, true); // The newly-selected extruder XYZ is actually at... DEBUG_ECHOLNPAIR("Offset Tool XYZ by { ", diff.x, ", ", diff.y, ", ", diff.z, " }"); diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index b79ec676a0..bbdc0b6862 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -79,10 +79,9 @@ #if ENABLED(PARKING_EXTRUDER) - #define PE_MAGNET_ON_STATE TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, !)PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE - void pe_solenoid_set_pin_state(const uint8_t extruder_num, const uint8_t state); + #define PE_MAGNET_ON_STATE TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, !)PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE inline void pe_solenoid_magnet_on(const uint8_t extruder_num) { pe_solenoid_set_pin_state(extruder_num, PE_MAGNET_ON_STATE); } inline void pe_solenoid_magnet_off(const uint8_t extruder_num) { pe_solenoid_set_pin_state(extruder_num, !PE_MAGNET_ON_STATE); } @@ -115,6 +114,12 @@ void swt_init(); #endif +#if ENABLED(TOOL_SENSOR) + uint8_t check_tool_sensor_stats(const uint8_t active_tool, const bool kill_on_error=false, const bool disable=false); +#else + inline uint8_t check_tool_sensor_stats(const uint8_t, const bool=false, const bool=false) { return 0; } +#endif + /** * Perform a tool-change, which may result in moving the * previous tool out of the way and the new tool into place. diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 6c59f27c5e..cae1261a81 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -38,17 +38,21 @@ // USB Flash Drive support #define HAS_OTG_USB_HOST_SUPPORT -#define TP // Enable to define servo and probe pins #define M5_EXTENDER // The M5 extender is attached // // Servos // -#if ENABLED(TP) - #define SERVO0_PIN PB11 -#endif +#define SERVO0_PIN PB11 // BLTOUCH +#define SOL0_PIN PC7 // Toolchanger -#define PS_ON_PIN PH6 +#if ENABLED(TOOL_SENSOR) + #define TOOL_SENSOR1_PIN PH6 + #define TOOL_SENSOR2_PIN PI4 + //#define TOOL_SENSOR3_PIN PF4 +#else + #define PS_ON_PIN PH6 +#endif // // Trinamic Stallguard pins @@ -110,7 +114,7 @@ #define Z4_STOP_PIN PF6 // M5 M3_STOP #endif -#if ENABLED(TP) && !defined(Z_MIN_PROBE_PIN) +#ifndef Z_MIN_PROBE_PIN #define Z_MIN_PROBE_PIN PH11 // Z Probe must be PH11 #endif diff --git a/buildroot/tests/BIGTREE_GTR_V1_0 b/buildroot/tests/BIGTREE_GTR_V1_0 index 95a1e0acac..24293a4932 100755 --- a/buildroot/tests/BIGTREE_GTR_V1_0 +++ b/buildroot/tests/BIGTREE_GTR_V1_0 @@ -26,5 +26,12 @@ opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ opt_enable TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_MIGRATION_FEATURE TOOLCHANGE_FS_INIT_BEFORE_SWAP TOOLCHANGE_FS_PRIME_FIRST_USED PID_PARAMS_PER_HOTEND exec_test $1 $2 "BigTreeTech GTR | 6 Extruders | Triple Z" "$3" +restore_configs +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ + EXTRUDERS 3 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 \ + SERVO_DELAY '{ 300, 300, 300 }' +opt_enable SWITCHING_TOOLHEAD TOOL_SENSOR +exec_test $1 $2 "BigTreeTech GTR | Switching Toolhead | Tool Sensors" "$3" + # clean up restore_configs From db054ba757ba8485698953bffad0bbfa7102e237 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 16 Apr 2021 09:30:39 -0500 Subject: [PATCH 1307/1370] Better chopper defaults --- Marlin/Configuration_adv.h | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 02a5ff0eeb..bd4793c55c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2680,22 +2680,22 @@ * { , , hysteresis_start[1..8] } */ #define CHOPPER_TIMING CHOPPER_DEFAULT_12V // All axes (override below) - //#define CHOPPER_TIMING_X CHOPPER_DEFAULT_12V // For X Axes (override below) - //#define CHOPPER_TIMING_X2 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_Y CHOPPER_DEFAULT_12V // For Y Axes (override below) - //#define CHOPPER_TIMING_Y2 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_Z CHOPPER_DEFAULT_12V // For Z Axes (override below) - //#define CHOPPER_TIMING_Z2 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_Z3 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_Z4 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_E CHOPPER_DEFAULT_12V // For Extruders (override below) - //#define CHOPPER_TIMING_E1 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_E2 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_E3 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_E4 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_E5 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_E6 CHOPPER_DEFAULT_12V - //#define CHOPPER_TIMING_E7 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_X CHOPPER_TIMING // For X Axes (override below) + //#define CHOPPER_TIMING_X2 CHOPPER_TIMING_X + //#define CHOPPER_TIMING_Y CHOPPER_TIMING // For Y Axes (override below) + //#define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y + //#define CHOPPER_TIMING_Z CHOPPER_TIMING // For Z Axes (override below) + //#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z + //#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z + //#define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z + //#define CHOPPER_TIMING_E CHOPPER_TIMING // For Extruders (override below) + //#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E3 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E4 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E5 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E6 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E7 CHOPPER_TIMING_E /** * Monitor Trinamic drivers From 9c86eef98b11a140d944e90bff7f36ae144e3b57 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 17 Apr 2021 02:03:16 -0500 Subject: [PATCH 1308/1370] Leave Hybrid Threshold as-is for now Reverting 253ee0c407 --- Marlin/src/feature/tmc_util.h | 35 ++++++++++---------------- Marlin/src/module/stepper/trinamic.cpp | 17 +++++++------ 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 0d6105358d..1767313ba2 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -120,15 +120,12 @@ class TMCMarlin : public TMC, public TMCStorage { uint32_t get_pwm_thrs() { return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); } + void set_pwm_thrs(const uint32_t thrs) { + TMC::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); + } #endif - void set_pwm_thrs(const uint32_t thrs) { - TMC::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - #if BOTH(HYBRID_THRESHOLD, HAS_LCD_MENU) - this->stored.hybrid_thrs = thrs; - #endif - } - #if USE_SENSORLESS inline int16_t homing_threshold() { return TMC::sgt(); } void homing_threshold(int16_t sgt_val) { @@ -188,21 +185,19 @@ class TMCMarlin : public TMC220 inline bool toggle_stepping_mode() { set_stealthChop(!this->stored.stealthChop_enabled); return get_stealthChop(); } #endif - void set_pwm_thrs(const uint32_t thrs) { - TMC2208Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - #if BOTH(HYBRID_THRESHOLD, HAS_LCD_MENU) - this->stored.hybrid_thrs = thrs; - #endif - } - #if ENABLED(HYBRID_THRESHOLD) uint32_t get_pwm_thrs() { return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); } + void set_pwm_thrs(const uint32_t thrs) { + TMC2208Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); + } #endif #if HAS_LCD_MENU inline void refresh_stepper_current() { rms_current(this->val_mA); } + #if ENABLED(HYBRID_THRESHOLD) inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } #endif @@ -242,15 +237,11 @@ class TMCMarlin : public TMC220 uint32_t get_pwm_thrs() { return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); } + void set_pwm_thrs(const uint32_t thrs) { + TMC2209Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); + } #endif - - void set_pwm_thrs(const uint32_t thrs) { - TMC2209Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - #if BOTH(HYBRID_THRESHOLD, HAS_LCD_MENU) - this->stored.hybrid_thrs = thrs; - #endif - } - #if USE_SENSORLESS inline int16_t homing_threshold() { return TMC2209Stepper::SGTHRS(); } void homing_threshold(int16_t sgt_val) { diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index 561e947190..de3d45e4b6 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -158,7 +158,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ampl = 180; st.PWMCONF(pwmconf.sr); - st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); st.GSTAT(); // Clear GSTAT } @@ -196,7 +196,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ofs = 36; st.PWMCONF(pwmconf.sr); - st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); st.GSTAT(); // Clear GSTAT } @@ -517,7 +517,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ofs = 36; st.PWMCONF(pwmconf.sr); - st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); st.GSTAT(0b111); // Clear delay(200); @@ -559,7 +559,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ofs = 36; st.PWMCONF(pwmconf.sr); - st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); st.GSTAT(0b111); // Clear delay(200); @@ -617,7 +617,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ampl = 180; st.PWMCONF(pwmconf.sr); - st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); st.GSTAT(); // Clear GSTAT } @@ -655,8 +655,11 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; pwmconf.pwm_ofs = 36; st.PWMCONF(pwmconf.sr); - st.set_pwm_thrs(TERN0(HYBRID_THRESHOLD, hyb_thrs)); UNUSED(hyb_thrs); - + #if ENABLED(HYBRID_THRESHOLD) + st.set_pwm_thrs(hyb_thrs); + #else + UNUSED(hyb_thrs); + #endif st.GSTAT(); // Clear GSTAT } #endif // TMC5160 From b586b6411967ffcfd3f3dedc0097aee6bc81ee8c Mon Sep 17 00:00:00 2001 From: fedetony <45215920+fedetony@users.noreply.github.com> Date: Sat, 17 Apr 2021 10:54:43 +0200 Subject: [PATCH 1309/1370] Fix Realtime Reporting with G-code Motion Modes (#21630) --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 1 + Marlin/src/gcode/parser.cpp | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 8cc0a66216..735fad015e 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -901,6 +901,7 @@ G29_TYPE GcodeSuite::G29() { TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE)); G29_RETURN(isnan(abl.measured_z)); + } #endif // HAS_ABL_NOT_UBL diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 9f0d09563e..8cbbe1d19d 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -217,10 +217,10 @@ void GCodeParser::parse(char *p) { #if ENABLED(GCODE_MOTION_MODES) #if ENABLED(ARC_SUPPORT) - case 'I' ... 'J': case 'R': + case 'I' ... 'J': if (motion_mode_codenum != 2 && motion_mode_codenum != 3) return; #endif - case 'P' ... 'Q': + case 'Q': if (motion_mode_codenum != 5) return; case 'X' ... 'Z': case 'E' ... 'F': if (motion_mode_codenum < 0) return; @@ -229,15 +229,23 @@ void GCodeParser::parse(char *p) { TERN_(USE_GCODE_SUBCODES, subcode = motion_mode_subcode); p--; // Back up one character to use the current parameter break; - #endif // GCODE_MOTION_MODES + #endif #if ENABLED(REALTIME_REPORTING_COMMANDS) - case 'S': case 'P': case 'R': { + case 'P': case 'R': { + if (letter == 'R') { + #if ENABLED(GCODE_MOTION_MODES) + if (ENABLED(ARC_SUPPORT) && !WITHIN(motion_mode_codenum, 2, 3)) return; + #endif + } + else if (TERN0(GCODE_MOTION_MODES, motion_mode_codenum != 5)) return; + } // fall-thru + case 'S': { codenum = 0; // The only valid codenum is 0 uint8_t digits = 0; while (*p++ == '0') digits++; // Count up '0' characters command_letter = (digits == 3) ? letter : '?'; // Three '0' digits is a good command - } return; // No parameters, so return + } return; // No parameters needed, so return now #endif default: return; From 27754a76dcecc11d428a8fb182c443e4d115433c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 17 Apr 2021 14:19:33 -0500 Subject: [PATCH 1310/1370] Skip scripts during 'platformio init' (#21643) --- .../share/PlatformIO/scripts/common-cxxflags.py | 6 ++++++ .../PlatformIO/scripts/common-dependencies-post.py | 7 ++++++- .../share/PlatformIO/scripts/common-dependencies.py | 13 +++++++++---- .../scripts/copy_marlin_variant_to_framework.py | 7 +++++++ .../share/PlatformIO/scripts/preflight-checks.py | 8 +++++++- 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 856a246fba..02cf124942 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -3,6 +3,12 @@ # Convenience script to apply customizations to CPP flags # Import("env") + +# Detect that 'vscode init' is running +from SCons.Script import COMMAND_LINE_TARGETS +if "idedata" in COMMAND_LINE_TARGETS: + env.Exit(0) + env.Append(CXXFLAGS=[ "-Wno-register" #"-Wno-incompatible-pointer-types", diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py index 2b1b948119..fa095f704c 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py @@ -2,8 +2,13 @@ # common-dependencies-post.py # Convenience script to add build flags for Marlin Enabled Features # - Import("env") + +# Detect that 'vscode init' is running +from SCons.Script import COMMAND_LINE_TARGETS +if "idedata" in COMMAND_LINE_TARGETS: + env.Exit(0) + Import("projenv") def apply_board_build_flags(): diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index fe6ae7dba5..5b17c3586f 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -2,6 +2,15 @@ # common-dependencies.py # Convenience script to check dependencies and add libs and sources for Marlin Enabled Features # +Import("env") + +#print(env.Dump()) + +# Detect that 'vscode init' is running +from SCons.Script import COMMAND_LINE_TARGETS +if "idedata" in COMMAND_LINE_TARGETS: + env.Exit(0) + import subprocess,os,re PIO_VERSION_MIN = (5, 0, 3) @@ -31,10 +40,6 @@ except: from platformio.package.meta import PackageSpec from platformio.project.config import ProjectConfig -Import("env") - -#print(env.Dump()) - try: verbose = int(env.GetProjectOption('custom_verbose')) except: diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index 15c953156c..955f002016 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -1,6 +1,13 @@ # # copy_marlin_variant_to_framework.py # +Import("env") + +# Detect that 'vscode init' is running +from SCons.Script import COMMAND_LINE_TARGETS +if "idedata" in COMMAND_LINE_TARGETS: + env.Exit(0) + import os,shutil from SCons.Script import DefaultEnvironment from platformio import util diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 6b499a8bcd..f89c891323 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -2,9 +2,15 @@ # preflight-checks.py # Check for common issues prior to compiling # -import os,re,sys Import("env") +# Detect that 'vscode init' is running +from SCons.Script import COMMAND_LINE_TARGETS +if "idedata" in COMMAND_LINE_TARGETS: + env.Exit(0) + +import os,re,sys + def get_envs_for_board(board): with open(os.path.join("Marlin", "src", "pins", "pins.h"), "r") as file: From 276fd6b0771cd400053519a6c78b7fa71b7f384b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 18 Apr 2021 14:07:30 -0500 Subject: [PATCH 1311/1370] Misc. pio cleanup --- ini/stm32f0.ini | 16 +++++++++++++--- ini/stm32f1.ini | 16 +++++++++++++--- ini/stm32f4.ini | 16 +++++++++++++--- ini/stm32f7.ini | 16 +++++++++++++--- platformio.ini | 13 ++++++------- 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/ini/stm32f0.ini b/ini/stm32f0.ini index fb6ce00dd0..10ac21fc89 100644 --- a/ini/stm32f0.ini +++ b/ini/stm32f0.ini @@ -4,9 +4,19 @@ # ################################# -# # -# STM32F0 Architecture # -# # +# +# STM32F0 Architecture +# +# Naming Example: STM32F070CBT6 +# +# F : Foundation +# 0 : Cortex M0 core +# 70 : Line/Features +# C : 48 pins (R:64 or 66, F:20) +# B : 128KB Flash-memory (C:256KB, D:384KB, E:512KB, G:1024KB) +# T : LQFP package +# 6 : -40...85°C (7: ...105°C) +# ################################# # diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini index 2ba3d84862..81e9f1dcb8 100644 --- a/ini/stm32f1.ini +++ b/ini/stm32f1.ini @@ -4,9 +4,19 @@ # ################################# -# # -# STM32F1 Architecture # -# # +# +# STM32F1 Architecture +# +# Naming Example: STM32F103RCT6 +# +# F : Foundation (sometimes High Performance F2/F4) +# 1 : Cortex M1 core +# 03 : Line/Features +# R : 64 or 66 pins (V:100, Z:144, I:176) +# C : 256KB Flash-memory (D:384KB, E:512KB, G:1024KB) +# T : LQFP package +# 6 : -40...85°C (7: ...105°C) +# ################################# # diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 5e700f0e9f..0e8a8c6b05 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -4,9 +4,19 @@ # ################################# -# # -# STM32F4 Architecture # -# # +# +# STM32F4 Architecture +# +# Naming Example: STM32F401RGT6 +# +# F : Foundation (sometimes High Performance F2/F4) +# 4 : Cortex M4 core +# 01 : Line/Features +# R : 64 or 66 pins (V:100, Z:144, I:176) +# G : 1024KB Flash-memory (C:256KB, D:384KB, E:512KB) +# T : LQFP package +# 6 : -40...85°C (7: ...105°C) +# ################################# # diff --git a/ini/stm32f7.ini b/ini/stm32f7.ini index d3fec7aebc..afcfc102d5 100644 --- a/ini/stm32f7.ini +++ b/ini/stm32f7.ini @@ -4,9 +4,19 @@ # ################################# -# # -# STM32F7 Architecture # -# # +# +# STM32F7 Architecture +# +# Naming Example: STM32F767ZIT6 +# +# F : Foundation (sometimes High Performance F2/F4) +# 7 : Cortex M7 core +# 67 : Line/Features +# Z : 144 pins +# I : 4096KB Flash-memory +# T : LQFP package +# 6 : -40...85°C (7: ...105°C) +# ################################# # diff --git a/platformio.ini b/platformio.ini index 87b6e8a90b..77abb364e7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,11 +10,6 @@ # Automatic targets - enable auto-uploading #targets = upload -# -# By default platformio build will abort after 5 errors. -# Remove '-fmax-errors=5' from build_flags below to see all. -# - [platformio] src_dir = Marlin boards_dir = buildroot/share/PlatformIO/boards @@ -35,10 +30,14 @@ extra_configs = ini/teensy.ini # -# The 'common' values are used for most Marlin builds +# The 'common' section applies to most Marlin builds. +# +# By default platformio build will abort after 5 errors. +# Remove '-fmax-errors=5' from build_flags below to see all. # [common] -build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants +build_flags = -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants + -fmax-errors=5 extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py From e5fc3f3a62998be5a07f3e86d4d3aea2d25b9a44 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 17 Apr 2021 19:52:23 -0500 Subject: [PATCH 1312/1370] Disable assert() by default --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 77abb364e7..8a747404e3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -36,7 +36,7 @@ extra_configs = # Remove '-fmax-errors=5' from build_flags below to see all. # [common] -build_flags = -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants +build_flags = -g3 -D__MARLIN_FIRMWARE__ -DNDEBUG -fmerge-constants -fmax-errors=5 extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py From a860f7f5f762d07af186a58c9c9e4bdceceb7650 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 18 Apr 2021 14:17:37 -0500 Subject: [PATCH 1313/1370] BTT E3 RRF Support --- Marlin/src/core/boards.h | 31 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h | 375 ++++++++++++++++++ .../variants/BIGTREE_E3_RRF/PeripheralPins.c | 363 +++++++++++++++++ .../variants/BIGTREE_E3_RRF/PinNamesVar.h | 50 +++ .../variants/BIGTREE_E3_RRF/hal_conf_extra.h | 52 +++ .../variants/BIGTREE_E3_RRF/ldscript.ld | 204 ++++++++++ .../variants/BIGTREE_E3_RRF/variant.cpp | 260 ++++++++++++ .../variants/BIGTREE_E3_RRF/variant.h | 292 ++++++++++++++ ini/stm32f4.ini | 14 + 10 files changed, 1628 insertions(+), 15 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h create mode 100644 buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/hal_conf_extra.h create mode 100644 buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index beaea57354..377147504f 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -366,21 +366,22 @@ #define BOARD_BTT_SKR_PRO_V1_1 4207 // BigTreeTech SKR Pro v1.1 (STM32F407ZG) #define BOARD_BTT_SKR_PRO_V1_2 4208 // BigTreeTech SKR Pro v1.2 (STM32F407ZG) #define BOARD_BTT_BTT002_V1_0 4209 // BigTreeTech BTT002 v1.0 (STM32F407VG) -#define BOARD_BTT_GTR_V1_0 4210 // BigTreeTech GTR v1.0 (STM32F407IGT) -#define BOARD_LERDGE_K 4211 // Lerdge K (STM32F407ZG) -#define BOARD_LERDGE_S 4212 // Lerdge S (STM32F407VE) -#define BOARD_LERDGE_X 4213 // Lerdge X (STM32F407VE) -#define BOARD_VAKE403D 4214 // VAkE 403D (STM32F446VET6) -#define BOARD_FYSETC_S6 4215 // FYSETC S6 (STM32F446VET6) -#define BOARD_FYSETC_S6_V2_0 4216 // FYSETC S6 v2.0 (STM32F446VET6) -#define BOARD_FYSETC_SPIDER 4217 // FYSETC Spider (STM32F446VET6) -#define BOARD_FLYF407ZG 4218 // FLYF407ZG (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4219 // MKS_ROBIN2 (STM32F407ZE) -#define BOARD_MKS_ROBIN_PRO_V2 4220 // MKS Robin Pro V2 (STM32F407VE) -#define BOARD_MKS_ROBIN_NANO_V3 4221 // MKS Robin Nano V3 (STM32F407VG) -#define BOARD_ANET_ET4 4222 // ANET ET4 V1.x (STM32F407VGT6) -#define BOARD_ANET_ET4P 4223 // ANET ET4P V1.x (STM32F407VGT6) -#define BOARD_FYSETC_CHEETAH_V20 4224 // FYSETC Cheetah V2.0 +#define BOARD_BTT_E3_RRF 4210 // BigTreeTech E3 RRF (STM32F407VGT6) +#define BOARD_BTT_GTR_V1_0 4211 // BigTreeTech GTR v1.0 (STM32F407IGT) +#define BOARD_LERDGE_K 4212 // Lerdge K (STM32F407ZG) +#define BOARD_LERDGE_S 4213 // Lerdge S (STM32F407VE) +#define BOARD_LERDGE_X 4214 // Lerdge X (STM32F407VE) +#define BOARD_VAKE403D 4215 // VAkE 403D (STM32F446VET6) +#define BOARD_FYSETC_S6 4216 // FYSETC S6 (STM32F446VET6) +#define BOARD_FYSETC_S6_V2_0 4217 // FYSETC S6 v2.0 (STM32F446VET6) +#define BOARD_FYSETC_SPIDER 4218 // FYSETC Spider (STM32F446VET6) +#define BOARD_FLYF407ZG 4219 // FLYF407ZG (STM32F407ZG) +#define BOARD_MKS_ROBIN2 4220 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_MKS_ROBIN_PRO_V2 4221 // MKS Robin Pro V2 (STM32F407VE) +#define BOARD_MKS_ROBIN_NANO_V3 4222 // MKS Robin Nano V3 (STM32F407VG) +#define BOARD_ANET_ET4 4223 // ANET ET4 V1.x (STM32F407VGT6) +#define BOARD_ANET_ET4P 4224 // ANET ET4P V1.x (STM32F407VGT6) +#define BOARD_FYSETC_CHEETAH_V20 4225 // FYSETC Cheetah V2.0 // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 7634d49199..c2d6b30703 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -594,6 +594,8 @@ #include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BIGTREE_GTR_V1_0 env:BIGTREE_GTR_V1_0_usb_flash_drive #elif MB(BTT_BTT002_V1_0) #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 +#elif MB(BTT_E3_RRF) + #include "stm32f4/pins_BTT_E3_RRF.h" // STM32F4 env:BIGTREE_E3_RRF #elif MB(LERDGE_K) #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:LERDGEK env:LERDGEK_usb_flash_drive #elif MB(LERDGE_S) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h b/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h new file mode 100644 index 0000000000..f808278510 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h @@ -0,0 +1,375 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "BTT E3 RRF" +#endif + +#define FPC2_PIN PB11 +#define FPC3_PIN PB10 +#define FPC4_PIN PE12 +#define FPC5_PIN PE13 +#define FPC6_PIN PE14 +#define FPC7_PIN PE15 +#define FPC8_PIN PA3 +#define FPC9_PIN PA2 +#define FPC10_PIN PA8 +#define FPC11_PIN PC15 +#define FPC12_PIN PC14 +#define FPC13_PIN PC13 +#define FPC14_PIN PE6 +#define FPC15_PIN PE5 +#define FPC16_PIN PE4 +#define FPC17_PIN PE3 + +//#define BTT_E3_RRF_IDEX_BOARD + +#ifdef BTT_E3_RRF_IDEX_BOARD + + #define X2_ENABLE_PIN FPC13_PIN // X2EN + #define X2_STEP_PIN FPC11_PIN // X2STP + #define X2_DIR_PIN FPC10_PIN // X2DIR + #define X2_SERIAL_TX_PIN FPC12_PIN // X2UART + #define X2_SERIAL_RX_PIN FPC12_PIN // X2UART + #if X_HOME_DIR < 0 + #define X_MAX_PIN FPC2_PIN // X2-STOP + #else + #define X_MIN_PIN FPC2_PIN // X2-STOP + #endif + + #define E1_ENABLE_PIN FPC7_PIN // E1EN + #define E1_STEP_PIN FPC5_PIN // E1STP + #define E1_DIR_PIN FPC4_PIN // E1DIR + #define E1_SERIAL_TX_PIN FPC6_PIN // E1UART + #define E1_SERIAL_RX_PIN FPC6_PIN // E1UART + + #ifndef FIL1_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN FPC3_PIN // E1-STOP + #endif + + #define HEATER_1_PIN FPC16_PIN // "HE1" + + #define PT100_PIN FPC8_PIN // Analog Input "PT100"(INA826) + #define TEMP_1_PIN FPC9_PIN // Analog Input "TH1" + + #define FAN1_PIN FPC15_PIN // "FAN0" in IDEX board + #define FAN2_PIN FPC14_PIN // "FAN1" in IDEX board + +#endif + +// Onboard I2C EEPROM +#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB + +// +// Servos +// +#define SERVO0_PIN PB0 // SERVOS + +// +// Limit Switches +// +#define X_STOP_PIN PC0 // X-STOP +#define Y_STOP_PIN PC1 // Y-STOP +#define Z_STOP_PIN PC2 // Z-STOP + +// +// Z Probe must be this pin +// +#define Z_MIN_PROBE_PIN PC5 // PROBE + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PC3 // E0-STOP +#endif + +// +// Power-loss Detection +// +#ifndef POWER_LOSS_PIN + #define POWER_LOSS_PIN PE0 // Power Loss Detection: PWR-DET +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PD7 +#define X_STEP_PIN PD5 +#define X_DIR_PIN PD4 + +#define Y_ENABLE_PIN PD3 +#define Y_STEP_PIN PD0 +#define Y_DIR_PIN PA15 + +#define Z_ENABLE_PIN PD14 +#define Z_STEP_PIN PC6 +#define Z_DIR_PIN PC7 + +#define E0_ENABLE_PIN PD10 +#define E0_STEP_PIN PD12 +#define E0_DIR_PIN PD13 + +/** + * TMC2208/TMC2209 stepper drivers + */ +#if HAS_TMC_UART + // + // Software serial + // + #define X_SERIAL_TX_PIN PD6 + #define X_SERIAL_RX_PIN PD6 + + #define Y_SERIAL_TX_PIN PD1 + #define Y_SERIAL_RX_PIN PD1 + + #define Z_SERIAL_TX_PIN PD15 + #define Z_SERIAL_RX_PIN PD15 + + #define E0_SERIAL_TX_PIN PD11 + #define E0_SERIAL_RX_PIN PD11 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA1 // Analog Input "TB" +#define TEMP_0_PIN PA0 // Analog Input "TH0" + +// +// Heaters / Fans +// +#define HEATER_BED_PIN PB4 // "HB" +#define HEATER_0_PIN PB3 // "HE0" + +#define FAN_PIN PB5 // "FAN0" +//#define FAN1_PIN PB6 // "FAN1" + +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN PB6 // "FAN1" +#endif + +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN PB7 // LED driving pin +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN PE1 // Power Supply Control +#endif + +/** + * BTT E3 RRF + * _____ + * 5V | 1 2 | GND + * (LCD_EN) PE11 | 3 4 | PB1 (LCD_RS) + * (LCD_D4) PE10 | 5 6 PB2 (BTN_EN2) + * RESET | 7 8 | PE7 (BTN_EN1) + * (BTN_ENC) PE9 | 9 10| PE8 (BEEPER) + * ----- + * EXP1 + */ + +#if HAS_WIRED_LCD + + #if ENABLED(CR10_STOCKDISPLAY) + + #define BEEPER_PIN PE8 + #define BTN_ENC PE9 + + #define BTN_EN1 PE7 + #define BTN_EN2 PB2 + + #define LCD_PINS_RS PB1 + #define LCD_PINS_ENABLE PE11 + #define LCD_PINS_D4 PE10 + + // CR10_STOCKDISPLAY default timing is too fast + #undef BOARD_ST7920_DELAY_1 + #undef BOARD_ST7920_DELAY_2 + #undef BOARD_ST7920_DELAY_3 + + #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_E3_RRF.h' for details. Comment out this line to continue." + + #define LCD_PINS_RS PE10 + #define LCD_PINS_ENABLE PE9 + #define LCD_PINS_D4 PB1 + #define LCD_PINS_D5 PB2 + #define LCD_PINS_D6 PE7 + #define LCD_PINS_D7 PE8 + #define ADC_KEYPAD_PIN PB0 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + + #define BTN_ENC PE9 + #define BTN_EN1 PE7 + #define BTN_EN2 PB2 + + #define DOGLCD_CS PB1 + #define DOGLCD_A0 PE10 + #define DOGLCD_SCK PE8 + #define DOGLCD_MOSI PE11 + + #define FORCE_SOFT_SPI + #define LCD_BACKLIGHT_PIN -1 + + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + + #error "CAUTION! TFTGLCD_PANEL_SPI requires wiring modifications. See 'pins_BTT_E3_RRF.h' for details. Comment out this line to continue." + + /** + * TFTGLCD_PANEL_SPI display pinout + * + * Board Display + * _____ _____ + * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) + * (FREE) PE11 | 3 4 | PB1 (LCD_CS) (PE7) LCD_CS | 3 4 | SD_CS (PB2) + * (FREE) PE10 | 5 6 | PB2 (SD_CS) (FREE) | 5 6 | MOSI (SPI1-MOSI) + * RESET | 7 8 | PE7 (MOD_RESET) (PE8) SD_DET | 7 8 | (FREE) + * (BEEPER) PE9 | 9 10| PE8 (SD_DET) GND | 9 10| 5V + * ----- ----- + * EXP1 EXP1 + * + * Needs custom cable: + * + * Board Adapter Display + * _________ + * EXP1-1 ----------- EXP1-10 + * EXP1-2 ----------- EXP1-9 + * SPI1-4 ----------- EXP1-6 + * EXP1-4 ----------- FREE + * SPI1-3 ----------- EXP1-2 + * EXP1-6 ----------- EXP1-4 + * EXP1-7 ----------- FREE + * EXP1-8 ----------- EXP1-3 + * SPI1-1 ----------- EXP1-1 + * EXP1-10 ----------- EXP1-7 + */ + + #define TFTGLCD_CS PE7 + + #endif + + #else + #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the BTT_E3_RRF." + #endif + + // Alter timing for graphical display + #if HAS_MARLINUI_U8GLIB + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #endif + #endif + +#endif // HAS_WIRED_LCD + +#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) + + #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_E3_RRF.h' for details. Comment out this line to continue." + + /** FYSETC TFT TFT81050 display pinout + * + * Board Display + * _____ _____ + * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) + * (FREE) PE11 | 3 4 | PB1 (LCD_CS) (PE7) MOD_RESET | 3 4 | SD_CS (PB2) + * (FREE) PE10 | 5 6 | PB2 (SD_CS) (PB1) LCD_CS | 5 6 | MOSI (SPI1-MOSI) + * RESET | 7 8 | PE7 (MOD_RESET) (PE8) SD_DET | 7 8 | RESET + * (BEEPER) PE9 | 9 10| PE8 (SD_DET) GND | 9 10| 5V + * ----- ----- + * EXP1 EXP1 + * + * Needs custom cable: + * + * Board Adapter Display + * _________ + * EXP1-1 ----------- EXP1-10 + * EXP1-2 ----------- EXP1-9 + * SPI1-4 ----------- EXP1-6 + * EXP1-4 ----------- EXP1-5 + * SPI1-3 ----------- EXP1-2 + * EXP1-6 ----------- EXP1-4 + * EXP1-7 ----------- EXP1-8 + * EXP1-8 ----------- EXP1-3 + * SPI1-1 ----------- EXP1-1 + * EXP1-10 ----------- EXP1-7 + */ + + #define CLCD_SPI_BUS 1 // SPI1 connector + + #define BEEPER_PIN PE9 + + #define CLCD_MOD_RESET PE7 + #define CLCD_SPI_CS PB1 + +#endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 + +// +// SD Support +// + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #define SDIO_SUPPORT // Use SDIO for onboard SD + #define SDIO_D0_PIN PC8 + #define SDIO_D1_PIN PC9 + #define SDIO_D2_PIN PC10 + #define SDIO_D3_PIN PC11 + #define SDIO_CK_PIN PC12 + #define SDIO_CMD_PIN PD2 + + //#define SDIO_CLOCK 48000000 + #define SD_DETECT_PIN PC4 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "SD CUSTOM_CABLE is not compatible with BTT E3 RRF." +#endif + +// +// WIFI +// + +#define ESP_WIFI_MODULE_COM 3 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this +#define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT & SERIAL_PORT_2 +#define ESP_WIFI_MODULE_RESET_PIN PA4 +#define ESP_WIFI_MODULE_ENABLE_PIN PA5 +#define ESP_WIFI_MODULE_GPIO0_PIN PA6 diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PeripheralPins.c new file mode 100644 index 0000000000..9e42baf210 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PeripheralPins.c @@ -0,0 +1,363 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + * Automatically generated from STM32F407Z(E-G)Tx.xml + */ +#include +#include + +/* ===== + * Note: Commented lines are alternative possibilities which are not used by default. + * If you change them, you should know what you're doing first. + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 TH0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 TB + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 IDEX TH1 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 IDEX INA826 PT100 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 + #endif + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SCL[] = { + {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +const PinMap PinMap_PWM[] = { + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 HE0 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 BED + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 FAN0 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 FAN1 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 IDEX FAN0 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 IDEX FAN1 + + /** + * Unused by specifications on BTT E3 RRF. (PLEASE CONFIRM) + * Uncomment the corresponding line if you want to have HardwarePWM on some pins. + * WARNING: check timers' usage first to avoid conflicts. + * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) + * If you alter this section DO NOT report bugs to Marlin team since they are most likely caused by you. Thank you. + */ + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)},// TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)},// TIM14_CH1 + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)},// TIM10_CH1 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)},// TIM11_CH1 + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)},// TIM12_CH1 + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)},// TIM12_CH2 + //{PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + //{PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + //{PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + #endif + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_TX[] = { + {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +const PinMap PinMap_UART_RX[] = { + {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +#error "CAN bus isn't available on this board. Driver should be disabled." +#endif + +//*** ETHERNET *** +#ifdef HAL_ETH_MODULE_ENABLED +#error "Ethernet port isn't available on this board. Driver should be disabled." +#endif + +//*** No QUADSPI *** + +//*** USB *** +#ifdef HAL_PCD_MODULE_ENABLED +const PinMap PinMap_USB_OTG_FS[] = { + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; + +const PinMap PinMap_USB_OTG_HS[] = { /* + #ifdef USE_USB_HS_IN_FS + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP + #else + #error "USB in HS mode isn't supported by the board" + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT + #endif // USE_USB_HS_IN_FS + */ + {NC, NP, 0} +}; + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif +#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PinNamesVar.h b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PinNamesVar.h new file mode 100644 index 0000000000..b4bb9d45f8 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PinNamesVar.h @@ -0,0 +1,50 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_SOF = PA_8, + USB_OTG_FS_VBUS = PA_9, + USB_OTG_FS_ID = PA_10, + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, + USB_OTG_HS_ULPI_D0 = PA_3, + USB_OTG_HS_SOF = PA_4, + USB_OTG_HS_ULPI_CK = PA_5, + USB_OTG_HS_ULPI_D1 = PB_0, + USB_OTG_HS_ULPI_D2 = PB_1, + USB_OTG_HS_ULPI_D7 = PB_5, + USB_OTG_HS_ULPI_D3 = PB_10, + USB_OTG_HS_ULPI_D4 = PB_11, + USB_OTG_HS_ID = PB_12, + USB_OTG_HS_ULPI_D5 = PB_12, + USB_OTG_HS_ULPI_D6 = PB_13, + USB_OTG_HS_VBUS = PB_13, + USB_OTG_HS_DM = PB_14, + USB_OTG_HS_DP = PB_15, + USB_OTG_HS_ULPI_STP = PC_0, + USB_OTG_HS_ULPI_DIR = PC_2, + USB_OTG_HS_ULPI_NXT = PC_3, +#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/hal_conf_extra.h new file mode 100644 index 0000000000..6c4a991f33 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/hal_conf_extra.h @@ -0,0 +1,52 @@ +#pragma once + +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED Real Time Clock...do we use it? +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED // by default +//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +#define HAL_SD_MODULE_ENABLED + +#undef HAL_DAC_MODULE_ENABLED +#undef HAL_FLASH_MODULE_ENABLED +#undef HAL_CAN_MODULE_ENABLED +#undef HAL_CAN_LEGACY_MODULE_ENABLED +#undef HAL_CEC_MODULE_ENABLED +#undef HAL_CRYP_MODULE_ENABLED +#undef HAL_DCMI_MODULE_ENABLED +#undef HAL_DMA2D_MODULE_ENABLED +#undef HAL_ETH_MODULE_ENABLED +#undef HAL_NAND_MODULE_ENABLED +#undef HAL_NOR_MODULE_ENABLED +#undef HAL_PCCARD_MODULE_ENABLED +#undef HAL_SRAM_MODULE_ENABLED +#undef HAL_SDRAM_MODULE_ENABLED +#undef HAL_HASH_MODULE_ENABLED +#undef HAL_EXTI_MODULE_ENABLED +#undef HAL_SMBUS_MODULE_ENABLED +#undef HAL_I2S_MODULE_ENABLED +#undef HAL_IWDG_MODULE_ENABLED +#undef HAL_LTDC_MODULE_ENABLED +#undef HAL_DSI_MODULE_ENABLED +#undef HAL_QSPI_MODULE_ENABLED +#undef HAL_RNG_MODULE_ENABLED +#undef HAL_SAI_MODULE_ENABLED +#undef HAL_IRDA_MODULE_ENABLED +#undef HAL_SMARTCARD_MODULE_ENABLED +#undef HAL_WWDG_MODULE_ENABLED +#undef HAL_HCD_MODULE_ENABLED +#undef HAL_FMPI2C_MODULE_ENABLED +#undef HAL_SPDIFRX_MODULE_ENABLED +#undef HAL_DFSDM_MODULE_ENABLED +#undef HAL_LPTIM_MODULE_ENABLED +#undef HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/ldscript.ld b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/ldscript.ld new file mode 100644 index 0000000000..0c060d1751 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/ldscript.ld @@ -0,0 +1,204 @@ +/* +***************************************************************************** +** + +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F407ZGTx Device with +** 1024KByte FLASH, 128KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

      © COPYRIGHT(c) 2014 Ac6

      +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20020000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200;; /* required amount of heap */ +_Min_Stack_Size = 0x400;; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 1024K +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text ALIGN(4): + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata ALIGN(4): + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.cpp b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.cpp new file mode 100644 index 0000000000..1486b21830 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.cpp @@ -0,0 +1,260 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Pin number +// This array allows to wrap Arduino pin number(Dx or x) +// to STM32 PinName (PX_n) +const PinName digitalPin[] = { +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + PC_13, //D0 + PC_14, //D1 - OSC32_IN + PC_15, //D2 - OSC32_OUT + PH_0, //D3 - OSC_IN + PH_1, //D4 - OSC_OUT + PB_2, //D5 - BOOT1 + PB_10, //D6 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + PB_11, //D7 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 + PB_12, //D8 - 1:SPI2_NSS / OTG_HS_ID + PB_13, //D9 - 1:SPI2_SCK 2:OTG_HS_VBUS + PB_14, //D10 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + PB_15, //D11 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + PC_6, //D12 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + PC_7, //D13 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + PC_8, //D14 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + PC_9, //D15 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + PA_8, //D16 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + PA_9, //D17 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + PA_10, //D18 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID + PA_11, //D19 - 1:TIM1_CH4 / OTG_FS_DM + PA_12, //D20 - 1:OTG_FS_DP + PA_13, //D21 - 0:JTMS-SWDIO + PA_14, //D22 - 0:JTCK-SWCLK + PA_15, //D23 - 0:JTDI 1:SPI3_NSS / SPI1_NSS + PC_10, //D24 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + PC_11, //D25 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + PC_12, //D26 - 1:UART5_TX / SPI3_MOSI / SDIO_CK + PD_2, //D27 - 1:UART5_RX / SDIO_CMD + PB_3, //D28 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + PB_4, //D29 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + PB_5, //D30 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + PB_6, //D31 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX + PB_7, //D32 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX + PB_8, //D33 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + PB_9, //D34 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + PA_0, //D35/A0 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + PA_1, //D36/A1 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + PA_2, //D37/A2 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + PA_3, //D38/A3 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + PA_4, //D39/A4 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + PA_5, //D40/A5 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + PA_6, //D41/A6 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + PA_7, //D42/A7 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + PB_0, //D43/A8 - 1:TIM3_CH3 2:ADC12_IN8 + PB_1, //D44/A9 - 1:TIM3_CH4 2:ADC12_IN9 + PC_0, //D45/A10 - 1: 2:ADC123_IN10 + PC_1, //D46/A11 - 1: 2:ADC123_IN11 + PC_2, //D47/A12 - 1:SPI2_MISO 2:ADC123_IN12 + PC_3, //D48/A13 - 1:SPI2_MOSI 2:ADC123_IN13 + PC_4, //D49/A14 - 1: 2:ADC12_IN14 + PC_5, //D50/A15 - 1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + PF_3, //D51/A16 - 1:FSMC_A3 2:ADC3_IN9 + PF_4, //D52/A17 - 1:FSMC_A4 2:ADC3_IN14 + PF_5, //D53/A18 - 1:FSMC_A5 2:ADC3_IN15 + PF_6, //D54/A19 - 1:TIM10_CH1 2:ADC3_IN4 + PF_7, //D55/A20 - 1:TIM11_CH1 2:ADC3_IN5 + PF_8, //D56/A21 - 1:TIM13_CH1 2:ADC3_IN6 + PF_9, //D57/A22 - 1;TIM14_CH1 2:ADC3_IN7 + PF_10, //D58/A23 - 2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + PE_2, //D59 - 1:FSMC_A23 + PE_3, //D60 - 1:FSMC_A19 + PE_4, //D61 - 1:FSMC_A20 + PE_5, //D62 - 1:FSMC_A21 + PE_6, //D63 - 1:FSMC_A22 + PE_7, //D64 - 1:FSMC_D4 + PE_8, //D65 - 1:FSMC_D5 + PE_9, //D66 - 1:FSMC_D6 / TIM1_CH1 + PE_10, //D67 - 1:FSMC_D7 + PE_11, //D68 - 1:FSMC_D8 / TIM1_CH2 + PE_12, //D69 - 1:FSMC_D9 + PE_13, //D70 - 1:FSMC_D10 / TIM1_CH3 + PE_14, //D71 - 1:FSMC_D11 / TIM1_CH4 + PE_15, //D72 - 1:FSMC_D12 + PD_8, //D73 - 1:FSMC_D13 / USART3_TX + PD_9, //D74 - 1:FSMC_D14 / USART3_RX + PD_10, //D75 - 1:FSMC_D15 + PD_11, //D76 - 1:FSMC_A16 + PD_12, //D77 - 1:FSMC_A17 / TIM4_CH1 + PD_13, //D78 - 1:FSMC_A18 / TIM4_CH2 + PD_14, //D79 - 1:FSMC_D0 / TIM4_CH3 + PD_15, //D80 - 1:FSMC_D1 / TIM4_CH4 + PD_0, //D81 - 1:FSMC_D2 + PD_1, //D82 - 1:FSMC_D3 + PD_3, //D83 - 1:FSMC_CLK + PD_4, //D84 - 1:FSMC_NOE + PD_5, //D85 - 1:USART2_TX + PD_6, //D86 - 1:USART2_RX + PD_7, //D87 + PE_0, //D88 + PE_1, //D89 +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + PF_0, //D90 - 1:FSMC_A0 / I2C2_SDA + PF_1, //D91 - 1:FSMC_A1 / I2C2_SCL + PF_2, //D92 - 1:FSMC_A2 + PF_11, //D93 + PF_12, //D94 - 1:FSMC_A6 + PF_13, //D95 - 1:FSMC_A7 + PF_14, //D96 - 1:FSMC_A8 + PF_15, //D97 - 1:FSMC_A9 + PG_0, //D98 - 1:FSMC_A10 + PG_1, //D99 - 1:FSMC_A11 + PG_2, //D100 - 1:FSMC_A12 + PG_3, //D101 - 1:FSMC_A13 + PG_4, //D102 - 1:FSMC_A14 + PG_5, //D103 - 1:FSMC_A15 + PG_6, //D104 + PG_7, //D105 + PG_8, //D106 + PG_9, //D107 - 1:USART6_RX + PG_10, //D108 - 1:FSMC_NE3 + PG_11, //D109 + PG_12, //D110 - 1:FSMC_NE4 + PG_13, //D111 - 1:FSMC_A24 + PG_14, //D112 - 1:FSMC_A25 / USART6_TX + PG_15, //D113 +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + PI_8, //D114 + PI_9, //D115 + PI_10, //D116 + PI_11, //D117 + PH_2, //D118 + PH_3, //D119 + PH_4, //D120 - 1:I2C2_SCL + PH_5, //D121 - 1:I2C2_SDA + PH_6, //D122 - 1:TIM12_CH1 + PH_7, //D123 - 1:I2C3_SCL + PH_8, //D124 - 1:I2C3_SDA + PH_9, //D125 - 1:TIM12_CH2 + PH_10, //D126 - 1:TIM5_CH1 + PH_11, //D127 - 1:TIM5_CH2 + PH_12, //D128 - 1:TIM5_CH3 + PH_13, //D129 + PH_14, //D130 + PH_15, //D131 + PI_0, //D132 - 1:TIM5_CH4 / SPI2_NSS + PI_1, //D133 - 1:SPI2_SCK + PI_2, //D134 - 1:TIM8_CH4 /SPI2_MISO + PI_3, //D135 - 1:SPI2_MOS + PI_4, //D136 + PI_5, //D137 - 1:TIM8_CH1 + PI_6, //D138 - 1:TIM8_CH2 + PI_7, //D139 - 1:TIM8_CH3 +#endif +}; + +#ifdef __cplusplus +} +#endif + +// ------------------------ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config() { + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.h new file mode 100644 index 0000000000..42f21ce5a6 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.h @@ -0,0 +1,292 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +#ifdef STM32F405RX + #define STM32F4X_PIN_NUM 64 //64 pins mcu, 51 gpio + #define STM32F4X_GPIO_NUM 51 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5VX) + #define STM32F4X_PIN_NUM 100 //100 pins mcu, 82 gpio + #define STM32F4X_GPIO_NUM 82 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5ZX) + #define STM32F4X_PIN_NUM 144 //144 pins mcu, 114 gpio + #define STM32F4X_GPIO_NUM 114 + #define STM32F4X_ADC_NUM 24 +#elif defined(STM32F407IX) + #define STM32F4X_PIN_NUM 176 //176 pins mcu, 140 gpio + #define STM32F4X_GPIO_NUM 140 + #define STM32F4X_ADC_NUM 24 +#else + #error "no match MCU defined" +#endif + +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + #define PC13 0 + #define PC14 1 //OSC32_IN + #define PC15 2 //OSC32_OUT + #define PH0 3 //OSC_IN + #define PH1 4 //OSC_OUT + #define PB2 5 //BOOT1 + #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 + #define PB12 8 //1:SPI2_NSS / OTG_HS_ID + #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS + #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID + #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM + #define PA12 20 //1:OTG_FS_DP + #define PA13 21 //0:JTMS-SWDIO + #define PA14 22 //0:JTCK-SWCLK + #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS + #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK + #define PD2 27 //1:UART5_RX / SDIO_CMD + #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX + #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX + #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + #define PA0 35 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + #define PA1 36 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + #define PA2 37 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + #define PA3 38 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + #define PA4 39 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + #define PA5 40 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + #define PA6 41 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + #define PA7 42 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + #define PB0 43 //1:TIM3_CH3 2:ADC12_IN8 + #define PB1 44 //1:TIM3_CH4 2:ADC12_IN9 + #define PC0 45 //1: 2:ADC123_IN10 + #define PC1 46 //1: 2:ADC123_IN11 + #define PC2 47 //1:SPI2_MISO 2:ADC123_IN12 + #define PC3 48 //1:SPI2_MOSI 2:ADC123_IN13 + #define PC4 49 //1: 2:ADC12_IN14 + #define PC5 50 //1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + #define PF3 51 //1:FSMC_A3 2:ADC3_IN9 + #define PF4 52 //1:FSMC_A4 2:ADC3_IN14 + #define PF5 53 //1:FSMC_A5 2:ADC3_IN15 + #define PF6 54 //1:TIM10_CH1 2:ADC3_IN4 + #define PF7 55 //1:TIM11_CH1 2:ADC3_IN5 + #define PF8 56 //1:TIM13_CH1 2:ADC3_IN6 + #define PF9 57 //1;TIM14_CH1 2:ADC3_IN7 + #define PF10 58 //2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + #define PE2 (35+STM32F4X_ADC_NUM) //1:FSMC_A23 + #define PE3 (36+STM32F4X_ADC_NUM) //1:FSMC_A19 + #define PE4 (37+STM32F4X_ADC_NUM) //1:FSMC_A20 + #define PE5 (38+STM32F4X_ADC_NUM) //1:FSMC_A21 + #define PE6 (39+STM32F4X_ADC_NUM) //1:FSMC_A22 + #define PE7 (40+STM32F4X_ADC_NUM) //1:FSMC_D4 + #define PE8 (41+STM32F4X_ADC_NUM) //1:FSMC_D5 + #define PE9 (42+STM32F4X_ADC_NUM) //1:FSMC_D6 / TIM1_CH1 + #define PE10 (43+STM32F4X_ADC_NUM) //1:FSMC_D7 + #define PE11 (44+STM32F4X_ADC_NUM) //1:FSMC_D8 / TIM1_CH2 + #define PE12 (45+STM32F4X_ADC_NUM) //1:FSMC_D9 + #define PE13 (46+STM32F4X_ADC_NUM) //1:FSMC_D10 / TIM1_CH3 + #define PE14 (47+STM32F4X_ADC_NUM) //1:FSMC_D11 / TIM1_CH4 + #define PE15 (48+STM32F4X_ADC_NUM) //1:FSMC_D12 + #define PD8 (49+STM32F4X_ADC_NUM) //1:FSMC_D13 / USART3_TX + #define PD9 (50+STM32F4X_ADC_NUM) //1:FSMC_D14 / USART3_RX + #define PD10 (51+STM32F4X_ADC_NUM) //1:FSMC_D15 + #define PD11 (52+STM32F4X_ADC_NUM) //1:FSMC_A16 + #define PD12 (53+STM32F4X_ADC_NUM) //1:FSMC_A17 / TIM4_CH1 + #define PD13 (54+STM32F4X_ADC_NUM) //1:FSMC_A18 / TIM4_CH2 + #define PD14 (55+STM32F4X_ADC_NUM) //1:FSMC_D0 / TIM4_CH3 + #define PD15 (56+STM32F4X_ADC_NUM) //1:FSMC_D1 / TIM4_CH4 + #define PD0 (57+STM32F4X_ADC_NUM) //1:FSMC_D2 + #define PD1 (58+STM32F4X_ADC_NUM) //1:FSMC_D3 + #define PD3 (59+STM32F4X_ADC_NUM) //1:FSMC_CLK + #define PD4 (60+STM32F4X_ADC_NUM) //1:FSMC_NOE + #define PD5 (61+STM32F4X_ADC_NUM) //1:USART2_TX + #define PD6 (62+STM32F4X_ADC_NUM) //1:USART2_RX + #define PD7 (63+STM32F4X_ADC_NUM) + #define PE0 (64+STM32F4X_ADC_NUM) + #define PE1 (65+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + #define PF0 (66+STM32F4X_ADC_NUM) //1:FSMC_A0 / I2C2_SDA + #define PF1 (67+STM32F4X_ADC_NUM) //1:FSMC_A1 / I2C2_SCL + #define PF2 (68+STM32F4X_ADC_NUM) //1:FSMC_A2 + #define PF11 (69+STM32F4X_ADC_NUM) + #define PF12 (70+STM32F4X_ADC_NUM) //1:FSMC_A6 + #define PF13 (71+STM32F4X_ADC_NUM) //1:FSMC_A7 + #define PF14 (72+STM32F4X_ADC_NUM) //1:FSMC_A8 + #define PF15 (73+STM32F4X_ADC_NUM) //1:FSMC_A9 + #define PG0 (74+STM32F4X_ADC_NUM) //1:FSMC_A10 + #define PG1 (75+STM32F4X_ADC_NUM) //1:FSMC_A11 + #define PG2 (76+STM32F4X_ADC_NUM) //1:FSMC_A12 + #define PG3 (77+STM32F4X_ADC_NUM) //1:FSMC_A13 + #define PG4 (78+STM32F4X_ADC_NUM) //1:FSMC_A14 + #define PG5 (79+STM32F4X_ADC_NUM) //1:FSMC_A15 + #define PG6 (80+STM32F4X_ADC_NUM) + #define PG7 (81+STM32F4X_ADC_NUM) + #define PG8 (82+STM32F4X_ADC_NUM) + #define PG9 (83+STM32F4X_ADC_NUM) //1:USART6_RX + #define PG10 (84+STM32F4X_ADC_NUM) //1:FSMC_NE3 + #define PG11 (85+STM32F4X_ADC_NUM) + #define PG12 (86+STM32F4X_ADC_NUM) //1:FSMC_NE4 + #define PG13 (87+STM32F4X_ADC_NUM) //1:FSMC_A24 + #define PG14 (88+STM32F4X_ADC_NUM) //1:FSMC_A25 / USART6_TX + #define PG15 (89+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + #define PI8 (90+STM32F4X_ADC_NUM) + #define PI9 (91+STM32F4X_ADC_NUM) + #define PI10 (92+STM32F4X_ADC_NUM) + #define PI11 (93+STM32F4X_ADC_NUM) + #define PH2 (94+STM32F4X_ADC_NUM) + #define PH3 (95+STM32F4X_ADC_NUM) + #define PH4 (96+STM32F4X_ADC_NUM) //1:I2C2_SCL + #define PH5 (97+STM32F4X_ADC_NUM) //1:I2C2_SDA + #define PH6 (98+STM32F4X_ADC_NUM) //1:TIM12_CH1 + #define PH7 (99+STM32F4X_ADC_NUM) //1:I2C3_SCL + #define PH8 (100+STM32F4X_ADC_NUM) //1:I2C3_SDA + #define PH9 (101+STM32F4X_ADC_NUM) //1:TIM12_CH2 + #define PH10 (102+STM32F4X_ADC_NUM) //1:TIM5_CH1 + #define PH11 (103+STM32F4X_ADC_NUM) //1:TIM5_CH2 + #define PH12 (104+STM32F4X_ADC_NUM) //1:TIM5_CH3 + #define PH13 (105+STM32F4X_ADC_NUM) + #define PH14 (106+STM32F4X_ADC_NUM) + #define PH15 (107+STM32F4X_ADC_NUM) + #define PI0 (108+STM32F4X_ADC_NUM) //1:TIM5_CH4 / SPI2_NSS + #define PI1 (109+STM32F4X_ADC_NUM) //1:SPI2_SCK + #define PI2 (110+STM32F4X_ADC_NUM) //1:TIM8_CH4 /SPI2_MISO + #define PI3 (111+STM32F4X_ADC_NUM) //1:SPI2_MOS + #define PI4 (112+STM32F4X_ADC_NUM) + #define PI5 (113+STM32F4X_ADC_NUM) //1:TIM8_CH1 + #define PI6 (114+STM32F4X_ADC_NUM) //1:TIM8_CH2 + #define PI7 (115+STM32F4X_ADC_NUM) //1:TIM8_CH3 +#endif + +// This must be a literal +#define NUM_DIGITAL_PINS (STM32F4X_GPIO_NUM) +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS (STM32F4X_ADC_NUM) +#define NUM_ANALOG_FIRST 35 + +// Below ADC, DAC and PWM definitions already done in the core +// Could be redefined here if needed +// ADC resolution is 12bits +//#define ADC_RESOLUTION 12 +//#define DACC_RESOLUTION 12 + +// PWM resolution +/* + * BEWARE: + * Changing this value from the default (1000) will affect the PWM output value of analogWrite (to a PWM pin) + * Since the pin is toggled on capture, if you change the frequency of the timer you have to adapt the compare value (analogWrite thinks you did) + */ +//#define PWM_FREQUENCY 20000 +//The bottom values are the default and don't need to be redefined +//#define PWM_RESOLUTION 8 +//#define PWM_MAX_DUTY_CYCLE 255 + +// Below SPI and I2C definitions already done in the core +// Could be redefined here if differs from the default one +// SPI Definitions +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 +#define PIN_SPI_SS PA4 + +// I2C Definitions +#define PIN_WIRE_SDA PB9 +#define PIN_WIRE_SCL PB8 + +// Timer Definitions +//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c +#define TIMER_TONE TIM7 +#define TIMER_SERVO TIM5 +#define TIMER_SERIAL TIM8 + +// UART Definitions +// Define here Serial instance number to map on Serial generic name +#define SERIAL_UART_INSTANCE 1 //ex: 2 for Serial2 (USART2) +// DEBUG_UART could be redefined to print on another instance than 'Serial' +//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 +// DEBUG_UART baudrate, default: 9600 if not defined +//#define DEBUG_UART_BAUDRATE x +// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART +//#define DEBUG_PINNAME_TX PX_n // PinName used for TX + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE Serial1 +#endif diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 0e8a8c6b05..881dd17b01 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -173,6 +173,20 @@ build_unflags = -DUSBCON -DUSBD_USE_CDC build_flags = ${stm_flash_drive.build_flags} -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 +# +# BigTreeTech E3 RRF (STM32F407VGT6 ARM Cortex-M4) +# +[env:BIGTREE_E3_RRF] +platform = ${common_stm32.platform} +extends = common_stm32 +board = genericSTM32F407VGT6 +board_build.variant = BIGTREE_E3_RRF +build_flags = ${common_stm32.build_flags} + -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 + -DSERIAL_RX_BUFFER_SIZE=255 -DSERIAL_TX_BUFFER_SIZE=255 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + # # Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) # From 1a442702841efb5937da350ccd71a6c33d4c1b8d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 18 Apr 2021 17:12:56 -0500 Subject: [PATCH 1314/1370] Fix CHDK warning --- Marlin/src/MarlinCore.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 2e1eab86de..1405f20334 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -453,7 +453,8 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { already_shutdown_steppers = false; } - #if PIN_EXISTS(CHDK) // Check if pin should be set to LOW (after M240 set it HIGH) + #if ENABLED(PHOTO_GCODE) && PIN_EXISTS(CHDK) + // Check if CHDK should be set to LOW (after M240 set it HIGH) extern millis_t chdk_timeout; if (chdk_timeout && ELAPSED(ms, chdk_timeout)) { chdk_timeout = 0; From fe24aa22544aac060ab5b3ec3043c343c1e7f4fb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 18 Apr 2021 18:24:08 -0500 Subject: [PATCH 1315/1370] More detailed serial config error --- Marlin/src/HAL/AVR/HAL.h | 8 ++++---- Marlin/src/HAL/DUE/HAL.h | 8 ++++---- Marlin/src/HAL/LPC1768/HAL.h | 8 ++++---- Marlin/src/HAL/SAMD51/HAL.h | 8 ++++---- Marlin/src/HAL/STM32/HAL.h | 8 ++++---- Marlin/src/HAL/STM32F1/HAL.h | 16 ++++++++-------- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 2 ++ Marlin/src/HAL/TEENSY35_36/HAL.h | 2 ++ Marlin/src/HAL/TEENSY40_41/HAL.h | 4 ++-- 9 files changed, 34 insertions(+), 30 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index f6adf1bd31..890798a719 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -93,13 +93,13 @@ typedef int8_t pin_t; #define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0) #else #if !WITHIN(SERIAL_PORT, -1, 3) - #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #define MYSERIAL1 customizedSerial1 #ifdef SERIAL_PORT_2 #if !WITHIN(SERIAL_PORT_2, -1, 3) - #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." + #error "SERIAL_PORT_2 must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #define MYSERIAL2 customizedSerial2 #endif @@ -107,14 +107,14 @@ typedef int8_t pin_t; #ifdef MMU2_SERIAL_PORT #if !WITHIN(MMU2_SERIAL_PORT, -1, 3) - #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "MMU2_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #define MMU2_SERIAL mmuSerial #endif #ifdef LCD_SERIAL_PORT #if !WITHIN(LCD_SERIAL_PORT, -1, 3) - #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #define LCD_SERIAL lcdSerial #if HAS_DGUS_LCD diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 095538f6a6..501e2f0b06 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -56,7 +56,7 @@ extern DefaultSerial4 MSerial3; #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else - #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "The required SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #ifdef SERIAL_PORT_2 @@ -65,7 +65,7 @@ extern DefaultSerial4 MSerial3; #elif WITHIN(SERIAL_PORT_2, 0, 3) #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else - #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." + #error "SERIAL_PORT_2 must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #endif @@ -73,7 +73,7 @@ extern DefaultSerial4 MSerial3; #if WITHIN(MMU2_SERIAL_PORT, 0, 3) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else - #error "MMU2_SERIAL_PORT must be from 0 to 3. Please update your configuration." + #error "MMU2_SERIAL_PORT must be from 0 to 3." #endif #endif @@ -83,7 +83,7 @@ extern DefaultSerial4 MSerial3; #elif WITHIN(LCD_SERIAL_PORT, 0, 3) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else - #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #endif diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 828e126d70..07385261da 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -71,7 +71,7 @@ extern DefaultSerial1 USBSerial; #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else - #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #ifdef SERIAL_PORT_2 @@ -80,7 +80,7 @@ extern DefaultSerial1 USBSerial; #elif WITHIN(SERIAL_PORT_2, 0, 3) #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else - #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." + #error "SERIAL_PORT_2 must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #endif @@ -90,7 +90,7 @@ extern DefaultSerial1 USBSerial; #elif WITHIN(MMU2_SERIAL_PORT, 0, 3) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else - #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "MMU2_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #endif @@ -100,7 +100,7 @@ extern DefaultSerial1 USBSerial; #elif WITHIN(LCD_SERIAL_PORT, 0, 3) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else - #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #if HAS_DGUS_LCD #define SERIAL_GET_TX_BUFFER_FREE() MSerial0.available() diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index de72c476e4..3add6c9b69 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -54,7 +54,7 @@ #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else - #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #ifdef SERIAL_PORT_2 @@ -63,7 +63,7 @@ #elif WITHIN(SERIAL_PORT_2, 0, 3) #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else - #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." + #error "SERIAL_PORT_2 must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #endif @@ -73,7 +73,7 @@ #elif WITHIN(MMU2_SERIAL_PORT, 0, 3) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else - #error "MMU2_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "MMU2_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #endif @@ -83,7 +83,7 @@ #elif WITHIN(LCD_SERIAL_PORT, 0, 3) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else - #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index ad3a9963d7..d8e45670e6 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -55,7 +55,7 @@ #elif WITHIN(SERIAL_PORT, 1, 6) #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else - #error "SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." + #error "SERIAL_PORT must be from 1 to 6. You can also use -1 if the board supports Native USB." #endif #ifdef SERIAL_PORT_2 @@ -64,7 +64,7 @@ #elif WITHIN(SERIAL_PORT_2, 1, 6) #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else - #error "SERIAL_PORT_2 must be -1 or from 1 to 6. Please update your configuration." + #error "SERIAL_PORT_2 must be from 1 to 6. You can also use -1 if the board supports Native USB." #endif #endif @@ -74,7 +74,7 @@ #elif WITHIN(MMU2_SERIAL_PORT, 1, 6) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else - #error "MMU2_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." + #error "MMU2_SERIAL_PORT must be from 1 to 6. You can also use -1 if the board supports Native USB." #endif #endif @@ -84,7 +84,7 @@ #elif WITHIN(LCD_SERIAL_PORT, 1, 6) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else - #error "LCD_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." + #error "LCD_SERIAL_PORT must be from 1 to 6. You can also use -1 if the board supports Native USB." #endif #if HAS_DGUS_LCD #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 94b0ad7ead..f37b0f2728 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -87,9 +87,9 @@ #else #define MYSERIAL1 MSERIAL(1) // dummy port #if NUM_UARTS == 5 - #error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." + #error "SERIAL_PORT must be from 1 to 5. You can also use -1 if the board supports Native USB." #else - #error "SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #error "SERIAL_PORT must be from 1 to 3. You can also use -1 if the board supports Native USB." #endif #endif @@ -101,9 +101,9 @@ #else #define MYSERIAL2 MSERIAL(1) // dummy port #if NUM_UARTS == 5 - #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration." + #error "SERIAL_PORT_2 must be from 1 to 5. You can also use -1 if the board supports Native USB." #else - #error "SERIAL_PORT_2 must be -1 or from 1 to 3. Please update your configuration." + #error "SERIAL_PORT_2 must be from 1 to 3. You can also use -1 if the board supports Native USB." #endif #endif #endif @@ -116,9 +116,9 @@ #else #define MMU2_SERIAL MSERIAL(1) // dummy port #if NUM_UARTS == 5 - #error "MMU2_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." + #error "MMU2_SERIAL_PORT must be from 1 to 5. You can also use -1 if the board supports Native USB." #else - #error "MMU2_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #error "MMU2_SERIAL_PORT must be from 1 to 3. You can also use -1 if the board supports Native USB." #endif #endif #endif @@ -131,9 +131,9 @@ #else #define LCD_SERIAL MSERIAL(1) // dummy port #if NUM_UARTS == 5 - #error "LCD_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." + #error "LCD_SERIAL_PORT must be from 1 to 5. You can also use -1 if the board supports Native USB." #else - #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #error "LCD_SERIAL_PORT must be from 1 to 3. You can also use -1 if the board supports Native USB." #endif #endif #if HAS_DGUS_LCD diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index 7b7202547a..67f716c5d3 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -35,6 +35,8 @@ #define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) #if WITHIN(SERIAL_PORT, 0, 3) IMPLEMENT_SERIAL(SERIAL_PORT); +#else + #error "SERIAL_PORT must be from 0 to 3." #endif USBSerialType USBSerial(false, SerialUSB); diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 5b120d852d..50008d72f6 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -72,6 +72,8 @@ extern USBSerialType USBSerial; #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL1 MSERIAL(SERIAL_PORT) DECLARE_SERIAL(SERIAL_PORT); +#else + #error "SERIAL_PORT must be from 0 to 3, or -1 for Native USB." #endif #define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index ce985dadb9..701d690382 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -74,7 +74,7 @@ extern USBSerialType USBSerial; DECLARE_SERIAL(SERIAL_PORT); #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else - #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." + #error "The required SERIAL_PORT must be from 0 to 8, or -1 for Native USB." #endif #ifdef SERIAL_PORT_2 @@ -85,7 +85,7 @@ extern USBSerialType USBSerial; #elif WITHIN(SERIAL_PORT_2, 0, 8) #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else - #error "SERIAL_PORT_2 must be from -2 to 8. Please update your configuration." + #error "SERIAL_PORT_2 must be from 0 to 8, or -1 for Native USB, or -2 for Ethernet." #endif #endif From df36d759fc18e3249eae445d6b2eaef5ddd64d2e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 18 Apr 2021 22:46:43 -0500 Subject: [PATCH 1316/1370] Skip preflight checks only (#21658) Followup to e8af38cc2d --- .../PlatformIO/scripts/common-cxxflags.py | 6 -- .../scripts/common-dependencies-post.py | 7 +- .../PlatformIO/scripts/common-dependencies.py | 13 +-- .../copy_marlin_variant_to_framework.py | 7 -- .../PlatformIO/scripts/preflight-checks.py | 84 +++++++++---------- 5 files changed, 47 insertions(+), 70 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 02cf124942..856a246fba 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -3,12 +3,6 @@ # Convenience script to apply customizations to CPP flags # Import("env") - -# Detect that 'vscode init' is running -from SCons.Script import COMMAND_LINE_TARGETS -if "idedata" in COMMAND_LINE_TARGETS: - env.Exit(0) - env.Append(CXXFLAGS=[ "-Wno-register" #"-Wno-incompatible-pointer-types", diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py index fa095f704c..2b1b948119 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py @@ -2,13 +2,8 @@ # common-dependencies-post.py # Convenience script to add build flags for Marlin Enabled Features # + Import("env") - -# Detect that 'vscode init' is running -from SCons.Script import COMMAND_LINE_TARGETS -if "idedata" in COMMAND_LINE_TARGETS: - env.Exit(0) - Import("projenv") def apply_board_build_flags(): diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 5b17c3586f..fe6ae7dba5 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -2,15 +2,6 @@ # common-dependencies.py # Convenience script to check dependencies and add libs and sources for Marlin Enabled Features # -Import("env") - -#print(env.Dump()) - -# Detect that 'vscode init' is running -from SCons.Script import COMMAND_LINE_TARGETS -if "idedata" in COMMAND_LINE_TARGETS: - env.Exit(0) - import subprocess,os,re PIO_VERSION_MIN = (5, 0, 3) @@ -40,6 +31,10 @@ except: from platformio.package.meta import PackageSpec from platformio.project.config import ProjectConfig +Import("env") + +#print(env.Dump()) + try: verbose = int(env.GetProjectOption('custom_verbose')) except: diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index 955f002016..15c953156c 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -1,13 +1,6 @@ # # copy_marlin_variant_to_framework.py # -Import("env") - -# Detect that 'vscode init' is running -from SCons.Script import COMMAND_LINE_TARGETS -if "idedata" in COMMAND_LINE_TARGETS: - env.Exit(0) - import os,shutil from SCons.Script import DefaultEnvironment from platformio import util diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index f89c891323..27e5c9d70a 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -2,14 +2,8 @@ # preflight-checks.py # Check for common issues prior to compiling # -Import("env") - -# Detect that 'vscode init' is running -from SCons.Script import COMMAND_LINE_TARGETS -if "idedata" in COMMAND_LINE_TARGETS: - env.Exit(0) - import os,re,sys +Import("env") def get_envs_for_board(board): with open(os.path.join("Marlin", "src", "pins", "pins.h"), "r") as file: @@ -50,44 +44,50 @@ def check_envs(build_env, board_envs, config): return True return False -# Sanity checks: -if 'PIOENV' not in env: - raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") +def sanity_check_target(): + # Sanity checks: + if 'PIOENV' not in env: + raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") -if 'MARLIN_FEATURES' not in env: - raise SystemExit("Error: this script should be used after common Marlin scripts") + if 'MARLIN_FEATURES' not in env: + raise SystemExit("Error: this script should be used after common Marlin scripts") -if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: - raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") + if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: + raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") -build_env = env['PIOENV'] -motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] -board_envs = get_envs_for_board(motherboard) -config = env.GetProjectConfig() -result = check_envs("env:"+build_env, board_envs, config) + build_env = env['PIOENV'] + motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] + board_envs = get_envs_for_board(motherboard) + config = env.GetProjectConfig() + result = check_envs("env:"+build_env, board_envs, config) -if not result: - err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ - ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) - raise SystemExit(err) + if not result: + err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ + ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) + raise SystemExit(err) -# -# Check for Config files in two common incorrect places -# -for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: - for f in [ "Configuration.h", "Configuration_adv.h" ]: - if os.path.isfile(os.path.join(p, f)): - err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p - raise SystemExit(err) + # + # Check for Config files in two common incorrect places + # + for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p + raise SystemExit(err) -# -# Check for old files indicating an entangled Marlin (mixing old and new code) -# -mixedin = [] -for p in [ os.path.join(env['PROJECT_DIR'], "Marlin/src/lcd/dogm") ]: - for f in [ "ultralcd_DOGM.cpp", "ultralcd_DOGM.h" ]: - if os.path.isfile(os.path.join(p, f)): - mixedin += [ f ] -if mixedin: - err = "ERROR: Old files fell into your Marlin folder. Remove %s and try again" % ", ".join(mixedin) - raise SystemExit(err) + # + # Check for old files indicating an entangled Marlin (mixing old and new code) + # + mixedin = [] + for p in [ os.path.join(env['PROJECT_DIR'], "Marlin/src/lcd/dogm") ]: + for f in [ "ultralcd_DOGM.cpp", "ultralcd_DOGM.h" ]: + if os.path.isfile(os.path.join(p, f)): + mixedin += [ f ] + if mixedin: + err = "ERROR: Old files fell into your Marlin folder. Remove %s and try again" % ", ".join(mixedin) + raise SystemExit(err) + +# Detect that 'vscode init' is running +from SCons.Script import COMMAND_LINE_TARGETS +if "idedata" not in COMMAND_LINE_TARGETS: + sanity_check_target() From 59e55ea6fb1614c83e67c237b5ea8eaec387c448 Mon Sep 17 00:00:00 2001 From: Nick Date: Mon, 19 Apr 2021 05:04:38 +0100 Subject: [PATCH 1317/1370] Support new style Anycubic Chiron TFT (#21597) --- Marlin/Configuration_adv.h | 25 ++ Marlin/src/inc/SanityCheck.h | 4 + .../lib/anycubic_chiron/FileNavigator.cpp | 280 ++++++++++------ .../extui/lib/anycubic_chiron/FileNavigator.h | 17 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 308 +++++++++++------- .../extui/lib/anycubic_chiron/chiron_tft.h | 43 ++- .../lib/anycubic_chiron/chiron_tft_defs.h | 39 ++- 7 files changed, 484 insertions(+), 232 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index bd4793c55c..e41d5132a8 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1617,6 +1617,31 @@ #endif #endif // HAS_DGUS_LCD +// +// Additional options for AnyCubic Chiron TFT displays +// +#if ENABLED(ANYCUBIC_LCD_CHIRON) + // By default the type of panel is automatically detected. + // Enable one of these options if you know the panel type. + //#define CHIRON_TFT_STANDARD + //#define CHIRON_TFT_NEW + + // Enable the longer Anycubic powerup startup tune + //#define AC_DEFAULT_STARTUP_TUNE + + /** + * Display Folders + * By default the file browser lists all G-code files (including those in subfolders) in a flat list. + * Enable this option to display a hierarchical file browser. + * + * NOTES: + * - Without this option it helps to enable SDCARD_SORT_ALPHA so files are sorted before/after folders. + * - When used with the "new" panel, folder names will also have '.gcode' appended to their names. + * This hack is currently required to force the panel to show folders. + */ + #define AC_SD_FOLDER_VIEW +#endif + // // Specify additional languages for the UI. Default specified by LCD_LANGUAGE. // diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 64fcc85aad..58d52733e8 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2443,6 +2443,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "GRAPHICAL_TFT_UPSCALE must be 2, 3, or 4." #endif +#if BOTH(CHIRON_TFT_STANDARD, CHIRON_TFT_NEW) + #error "Please select only one of CHIRON_TFT_STANDARD or CHIRON_TFT_NEW." +#endif + /** * Some boards forbid the use of -1 Native USB */ diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp index 25847ae96c..9975d0824f 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -26,139 +26,233 @@ * Extensible_UI implementation for Anycubic Chiron * Written By Nick Wells, 2020 [https://github.com/SwiftNick] * (not affiliated with Anycubic, Ltd.) + * + * The AC panel wants files in block of 4 and can only display a flat list + * This library allows full folder traversal or flat file display and supports both standerd and new style panels. + * + * ## Old Style TFT panel + * Supported chars {}[]-+=_"$%^&*()~<>| + * Max display length 22 chars + * Max path len 29 chars + * (DOS 8.3 filepath max 29chars) + * (long filepath Max 22) + * + * ## New TFT Panel Format file display format + * Supported chars {}[]-+=_!"$%^&*()~<>\| + * Max display length 26 chars + * Max path len 29 chars + * (DOS 8.3 filepath must end '.GCO') + * (long filepath must end '.gcode') + * */ -/*************************************************************************** - * The AC panel wants files in block of 4 and can only display a flat list * - * This library allows full folder traversal. * - ***************************************************************************/ - #include "../../../../inc/MarlinConfigPre.h" #if ENABLED(ANYCUBIC_LCD_CHIRON) - #include "FileNavigator.h" #include "chiron_tft.h" using namespace ExtUI; +#define DEBUG_OUT ACDEBUG(AC_FILE) +#include "../../../../core/debug_out.h" + namespace Anycubic { - FileNavigator filenavigator; +FileNavigator filenavigator; +FileList FileNavigator::filelist; // Instance of the Marlin file API +uint16_t FileNavigator::lastpanelindex; +uint16_t FileNavigator::currentindex; // override the panel request +uint8_t FileNavigator::currentfolderdepth; +uint16_t FileNavigator::currentfolderindex[MAX_FOLDER_DEPTH]; // track folder pos for iteration +char FileNavigator::currentfoldername[MAX_PATH_LEN + 1]; // Current folder path - FileList FileNavigator::filelist; // Instance of the Marlin file API - char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path - uint16_t FileNavigator::lastindex; - uint8_t FileNavigator::folderdepth; - uint16_t FileNavigator::currentindex; // override the panel request +FileNavigator::FileNavigator() { reset(); } - FileNavigator::FileNavigator() { reset(); } +void FileNavigator::reset() { + DEBUG_ECHOLNPGM("reset()"); + currentfoldername[0] = '\0'; + currentfolderdepth = 0; + currentindex = 0; + lastpanelindex = 0; + ZERO(currentfolderindex) - void FileNavigator::reset() { - currentfoldername[0] = '\0'; - folderdepth = 0; - currentindex = 0; - lastindex = 0; - // Start at root folder - while (!filelist.isAtRootDir()) filelist.upDir(); - refresh(); + // Start at root folder + while (!filelist.isAtRootDir()) filelist.upDir(); + refresh(); +} + +void FileNavigator::refresh() { filelist.refresh(); } + +void FileNavigator::changeDIR(const char *folder) { + if (currentfolderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth + DEBUG_ECHOLNPAIR("FD:" , folderdepth, " FP:",currentindex, " currentfolder:", currentfoldername, " enter:", folder); + currentfolderindex[currentfolderdepth] = currentindex; + strcat(currentfoldername, folder); + strcat(currentfoldername, "/"); + filelist.changeDir(folder); + currentfolderdepth++; + currentindex = 0; +} + +void FileNavigator::upDIR() { + DEBUG_ECHOLNPAIR("upDIR() from D:", currentfolderdepth, " N:", currentfoldername); + if (!filelist.isAtRootDir()) { + filelist.upDir(); + currentfolderdepth--; + currentindex = currentfolderindex[currentfolderdepth]; // restore last position in the folder + filelist.seek(currentindex); // restore file information } - void FileNavigator::refresh() { filelist.refresh(); } + // Remove the child folder from the stored path + if (currentfolderdepth == 0) + currentfoldername[0] = '\0'; + else { + const char *pos = strchr(currentfoldername, '/'); + *(pos + 1) = '\0'; + } +} - void FileNavigator::getFiles(uint16_t index) { - uint8_t files = 4; - if (index == 0) currentindex = 0; - - // Each time we change folder we reset the file index to 0 and keep track - // of the current position as the TFT panel isnt aware of folders trees. - if (index > 0) { - --currentindex; // go back a file to take account of the .. added to the root. - if (index > lastindex) - currentindex += files; +void FileNavigator::skiptofileindex(uint16_t skip) { + if (skip == 0) return; + while (skip > 0) { + if (filelist.seek(currentindex)) { + DEBUG_ECHOLNPAIR("CI:", currentindex, " FD:", currentfolderdepth, " N:", skip, " ", filelist.longFilename()); + if (!filelist.isDir()) { + skip--; + currentindex++; + } else - currentindex = currentindex < 4 ? 0 : currentindex - files; + changeDIR(filelist.shortFilename()); + } // valid file + if (currentindex == filelist.count()) { + if (currentfolderdepth > 0) { + upDIR(); + currentindex++; + } + else break; // end of root folder + } // end of folder + } // files needed + // No more files available. +} + +#if ENABLED(AC_SD_FOLDER_VIEW) // SD Folder navigation + + void FileNavigator::getFiles(uint16_t index, panel_type_t paneltype, uint8_t filesneeded) { + if (index == 0) currentindex = 0; + // Each time we change folder we reset the file index to 0 and keep track + // of the current position, since the TFT panel isn't aware of folder trees. + if (index > 0) { + --currentindex; // go back a file to take account of the .. we added to the root. + if (index > lastpanelindex) + currentindex += filesneeded; + else + currentindex = currentindex < 4 ? 0 : currentindex - filesneeded; } - lastindex = index; + lastpanelindex = index; - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR("index=", index, " currentindex=", currentindex); - #endif + DEBUG_ECHOLNPAIR("index=", index, " currentindex=", currentindex); - if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder - TFTSer.println("<<"); - TFTSer.println(".."); - files--; + if (currentindex == 0 && currentfolderdepth > 0) { // Add a link to go up a folder + // The new panel ignores entries that don't end in .GCO or .gcode so add and pad them. + if (paneltype == AC_panel_new) { + TFTSer.println("<<.GCO"); + Chiron.SendtoTFTLN(PSTR(".. .gcode")); + } + else { + TFTSer.println("<<"); + TFTSer.println(".."); + } + filesneeded--; } - for (uint16_t seek = currentindex; seek < currentindex + files; seek++) { + for (uint16_t seek = currentindex; seek < currentindex + filesneeded; seek++) { if (filelist.seek(seek)) { - sendFile(); - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); - #endif + sendFile(paneltype); + DEBUG_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'"); } } } - void FileNavigator::sendFile() { - // send the file and folder info to the panel - // this info will be returned when the file is selected - // Permitted special characters in file name -_*#~ - // Panel can display 22 characters per line + void FileNavigator::sendFile(panel_type_t paneltype) { if (filelist.isDir()) { - //TFTSer.print(currentfoldername); - TFTSer.println(filelist.shortFilename()); - TFTSer.print(filelist.shortFilename()); - TFTSer.println("/"); + // Add mandatory tags for new panel otherwise lines are ignored. + if (paneltype == AC_panel_new) { + TFTSer.print(filelist.shortFilename()); + TFTSer.println(".GCO"); + TFTSer.print(filelist.shortFilename()); + TFTSer.write('/'); + // Make sure we fill all 29 chars of the display line to clear the text buffer otherwise the last line is still visible + for (int8_t i = strlen(filelist.shortFilename()); i < 19; i++) + TFTSer.write(' '); + TFTSer.println(".gcode"); + } + else { + TFTSer.println(filelist.shortFilename()); + TFTSer.print(filelist.shortFilename()); + TFTSer.write('/'); + TFTSer.println(); + } } - else { - // Logical Name + else { // Not DIR TFTSer.write('/'); - if (folderdepth > 0) TFTSer.print(currentfoldername); - + if (currentfolderdepth > 0) TFTSer.print(currentfoldername); TFTSer.println(filelist.shortFilename()); + TFTSer.print(filelist.longFilename()); - // Display Name - TFTSer.println(filelist.longFilename()); + // Make sure we fill all 29 chars of the display line to clear the text buffer otherwise the last line is still visible + if (paneltype == AC_panel_new) + for (int8_t i = strlen(filelist.longFilename()); i < 26; i++) + TFTSer.write(' '); + + TFTSer.println(); } - } - void FileNavigator::changeDIR(char *folder) { - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR("currentfolder: ", currentfoldername, " New: ", folder); - #endif - if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth - strcat(currentfoldername, folder); - strcat(currentfoldername, "/"); - filelist.changeDir(folder); - refresh(); - folderdepth++; - currentindex = 0; - } + } // AC_SD_FOLDER_VIEW - void FileNavigator::upDIR() { - filelist.upDir(); - refresh(); - folderdepth--; - currentindex = 0; - // Remove the last child folder from the stored path - if (folderdepth == 0) { - currentfoldername[0] = '\0'; +#else // Flat file list + + void FileNavigator::getFiles(uint16_t index, panel_type_t paneltype, uint8_t filesneeded) { + DEBUG_ECHOLNPAIR("getFiles() I:", index," L:", lastpanelindex); + // if we're searching backwards, jump back to start and search forward + if (index < lastpanelindex) { reset(); + skiptofileindex(index); } - else { - char *pos = nullptr; - for (uint8_t f = 0; f < folderdepth; f++) - pos = strchr(currentfoldername, '/'); + lastpanelindex = index; - *(pos + 1) = '\0'; - } - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR("depth: ", folderdepth, " currentfoldername: ", currentfoldername); - #endif + while (filesneeded > 0) { + if (filelist.seek(currentindex)) { + if (!filelist.isDir()) { + sendFile(paneltype); + filesneeded--; + currentindex++; + } + else + changeDIR(filelist.shortFilename()); + } // valid file + + if (currentindex == filelist.count()) { + if (currentfolderdepth > 0) { + upDIR(); + currentindex++; + } + else break; // end of root folder + } // end of folder + } // files needed + // No more files available. } - char* FileNavigator::getCurrentFolderName() { return currentfoldername; } -} + void FileNavigator::sendFile(panel_type_t paneltype) { + TFTSer.write('/'); + if (currentfolderdepth > 0) TFTSer.print(currentfoldername); + TFTSer.println(filelist.shortFilename()); + if (currentfolderdepth > 0) TFTSer.print(currentfoldername); + TFTSer.println(filelist.longFilename()); + DEBUG_ECHOLNPAIR("/", currentfoldername, "", filelist.shortFilename(), " ", filelist.longFilename()); + } + +#endif // Flat file list + +} // Anycubic namespace #endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h index c709415879..253b8039e7 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h @@ -38,14 +38,13 @@ namespace Anycubic { class FileNavigator { public: - FileNavigator(); - void reset(); - void getFiles(uint16_t, panel_type_t, uint8_t filesneeded=4); - void upDIR(); - void changeDIR(const char *); - void sendFile(panel_type_t); - void refresh(); - void skiptofileindex(uint16_t); + static void reset(); + static void getFiles(uint16_t, panel_type_t, uint8_t filesneeded=4); + static void upDIR(); + static void changeDIR(const char *); + static void sendFile(panel_type_t); + static void refresh(); + static void skiptofileindex(uint16_t); static FileList filelist; private: @@ -53,7 +52,7 @@ class FileNavigator { static uint16_t currentindex; static uint8_t currentfolderdepth; static uint16_t currentfolderindex[MAX_FOLDER_DEPTH]; - static char currentfoldername[MAX_PATH_LEN]; + static char currentfoldername[MAX_PATH_LEN + 1]; }; extern FileNavigator filenavigator; diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 065e4e1789..b35d792736 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -43,25 +43,27 @@ namespace Anycubic { +ChironTFT Chiron; +#if AUTO_DETECT_CHIRON_TFT + panel_type_t ChironTFT::panel_type = AC_panel_unknown; +#endif +last_error_t ChironTFT::last_error; printer_state_t ChironTFT::printer_state; paused_state_t ChironTFT::pause_state; heater_state_t ChironTFT::hotend_state; heater_state_t ChironTFT::hotbed_state; xy_uint8_t ChironTFT::selectedmeshpoint; -char ChironTFT::selectedfile[MAX_PATH_LEN]; -char ChironTFT::panel_command[MAX_CMND_LEN]; +char ChironTFT::selectedfile[MAX_PATH_LEN + 1]; +char ChironTFT::panel_command[MAX_CMND_LEN + 1]; uint8_t ChironTFT::command_len; float ChironTFT::live_Zoffset; file_menu_t ChironTFT::file_menu; -ChironTFT Chiron; - -ChironTFT::ChironTFT(){} - void ChironTFT::Startup() { selectedfile[0] = '\0'; panel_command[0] = '\0'; command_len = 0; + last_error = AC_error_none; printer_state = AC_printer_idle; pause_state = AC_paused_idle; hotend_state = AC_heater_off; @@ -80,27 +82,41 @@ void ChironTFT::Startup() { // Filament runout is handled by Marlin settings in Configuration.h // opt_set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. // opt_enable FIL_RUNOUT_PULLUP - TFTSer.begin(115200); + // wait for the TFT panel to initialise and finish the animation + delay_ms(250); + + // There are different panels for the Chiron with slightly different commands + // So we need to know what we are working with. + + // Panel type can be defined otherwise detect it automatically + if (panel_type == AC_panel_unknown) DetectPanelType(); + // Signal Board has reset SendtoTFTLN(AC_msg_main_board_has_reset); - safe_delay(200); - // Enable leveling and Disable end stops during print // as Z home places nozzle above the bed so we need to allow it past the end stops injectCommands_P(AC_cmnd_enable_leveling); // Startup tunes are defined in Tunes.h - //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1); - PlayTune(BEEPER_PIN, GB_PowerOn, 1); + PlayTune(BEEPER_PIN, TERN(AC_DEFAULT_STARTUP_TUNE, Anycubic_PowerOn, GB_PowerOn), 1); + #if ACDEBUGLEVEL SERIAL_ECHOLNPAIR("AC Debug Level ", ACDEBUGLEVEL); #endif SendtoTFTLN(AC_msg_ready); } +void ChironTFT::DetectPanelType() { + #if AUTO_DETECT_CHIRON_TFT + // Send a query to the TFT + SendtoTFTLN(AC_Test_for_OldPanel); // The panel will respond with 'SXY 480 320' + SendtoTFTLN(AC_Test_for_NewPanel); // the panel will respond with '[0]=0 ' to '[19]=0 ' + #endif +} + void ChironTFT::IdleLoop() { if (ReadTFTCommand()) { ProcessPanelRequest(); @@ -123,15 +139,16 @@ void ChironTFT::MediaEvent(media_event_t event) { switch (event) { case AC_media_inserted: SendtoTFTLN(AC_msg_sd_card_inserted); - break; + break; case AC_media_removed: SendtoTFTLN(AC_msg_sd_card_removed); - break; + break; case AC_media_error: + last_error = AC_error_noSD; SendtoTFTLN(AC_msg_no_sd_card); - break; + break; } } @@ -170,8 +187,8 @@ void ChironTFT::FilamentRunout() { SERIAL_ECHOLNPAIR("FilamentRunout() printer_state ", printer_state); #endif // 1 Signal filament out + last_error = AC_error_filament_runout; SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); - //printer_state = AC_printer_filament_out; PlayTune(BEEPER_PIN, FilamentOut, 1); } @@ -278,14 +295,23 @@ void ChironTFT::StatusChange(const char * const msg) { SendtoTFTLN(AC_msg_bed_heating); hotbed_state = AC_heater_temp_set; } + else if (strcmp_P(msg, MARLIN_msg_EEPROM_version) == 0) { + last_error = AC_error_EEPROM; + } } } void ChironTFT::PowerLossRecovery() { printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover. + last_error = AC_error_powerloss; PlayTune(BEEPER_PIN, SOS, 1); - SERIAL_ECHOLNPGM("Resuming from power outage..."); - SERIAL_ECHOLNPGM("Select SD file then press resume"); + SERIAL_ECHOLNPGM_P(AC_msg_powerloss_recovery); +} + +void ChironTFT::PrintComplete() { + SendtoTFT(AC_msg_print_complete); + printer_state = AC_printer_idle; + setSoftEndstopState(true); // enable endstops } void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEM string to the panel @@ -319,26 +345,29 @@ bool ChironTFT::ReadTFTCommand() { command_len++; } - if (command_ready) { - panel_command[command_len] = 0x00; + if (command_ready || command_len == MAX_CMND_LEN) { + panel_command[command_len] = '\0'; #if ACDEBUG(AC_ALL) - SERIAL_ECHOLNPAIR("< ", panel_command); - #endif - #if ACDEBUG(AC_SOME) - // Ignore status request commands - uint8_t req = atoi(&panel_command[1]); - if (req > 7 && req != 20) { - SERIAL_ECHOLNPAIR("> ", panel_command); - SERIAL_ECHOLNPAIR("printer_state:", printer_state); - } + SERIAL_ECHOLNPAIR("len(",command_len,") < ", panel_command); #endif + command_ready = true; } return command_ready; } -int8_t ChironTFT::Findcmndpos(const char * buff, char q) { +int8_t ChironTFT::FindToken(char c) { int8_t pos = 0; - do { if (buff[pos] == q) return pos; } while (++pos < MAX_CMND_LEN); + do { + if (panel_command[pos] == c) { + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Tpos:", pos, " ", c); + #endif + return pos; + } + } while(++pos < command_len); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Not found: ", c); + #endif return -1; } @@ -352,6 +381,7 @@ void ChironTFT::CheckHeaters() { faultDuration++; if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + last_error = AC_error_abnormal_temp_t0; SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp); break; } @@ -366,6 +396,7 @@ void ChironTFT::CheckHeaters() { faultDuration++; if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + last_error = AC_error_abnormal_temp_bed; SERIAL_ECHOLNPAIR("Bed temp abnormal! : ", temp); break; } @@ -396,15 +427,21 @@ void ChironTFT::SendFileList(int8_t startindex) { SERIAL_ECHOLNPAIR("## SendFileList ## ", startindex); #endif SendtoTFTLN(PSTR("FN ")); - filenavigator.getFiles(startindex); + filenavigator.getFiles(startindex, panel_type, 4); SendtoTFTLN(PSTR("END")); } void ChironTFT::SelectFile() { - strncpy(selectedfile, panel_command + 4, command_len - 4); - selectedfile[command_len - 5] = '\0'; + if (panel_type == AC_panel_new) { + strncpy(selectedfile, panel_command + 4, command_len - 3); + selectedfile[command_len - 4] = '\0'; + } + else { + strncpy(selectedfile, panel_command + 4, command_len - 4); + selectedfile[command_len - 5] = '\0'; + } #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR_F(" Selected File: ",selectedfile); + SERIAL_ECHOLNPAIR(" Selected File: ",selectedfile); #endif switch (selectedfile[0]) { case '/': // Valid file selected @@ -417,6 +454,9 @@ void ChironTFT::SelectFile() { SendFileList( 0 ); break; default: // enter sub folder + // for new panel remove the '.GCO' tag that was added to the end of the path + if (panel_type == AC_panel_new) + selectedfile[strlen(selectedfile) - 4] = '\0'; filenavigator.changeDIR(selectedfile); SendtoTFTLN(AC_msg_sd_file_open_failed); SendFileList( 0 ); @@ -424,25 +464,48 @@ void ChironTFT::SelectFile() { } } -void ChironTFT::InjectCommandandWait(PGM_P cmd) { - //injectCommands_P(cmnd); queue.enqueue_now_P(cmd); - //SERIAL_ECHOLN(PSTR("Inject>")); -} - void ChironTFT::ProcessPanelRequest() { // Break these up into logical blocks // as its easier to navigate than one huge switch case! - int8_t req = atoi(&panel_command[1]); + const int8_t tpos = FindToken('A'); + // Panel request are 'A0' - 'A36' + if (tpos != -1) { + const int8_t req = atoi(&panel_command[tpos+1]); - // Information requests A0 - A8 and A33 - if (req <= 8 || req == 33) PanelInfo(req); + // Information requests A0 - A8 and A33 + if (req <= 8 || req == 33) PanelInfo(req); - // Simple Actions A9 - A28 - else if ( req <= 28) PanelAction(req); + // Simple Actions A9 - A28 + else if (req <= 28) PanelAction(req); - // Process Initiation - else if (req <= 34) PanelProcess(req); + // Process Initiation + else if (req <= 36) PanelProcess(req); + } + else { + #if AUTO_DETECT_CHIRON_TFT + // This may be a response to a panel type detection query + if (panel_type == AC_panel_unknown) { + tpos = FindToken('S'); // old panel will respond to 'SIZE' with 'SXY 480 320' + if (tpos != -1) { + if (panel_command[tpos+1]== 'X' && panel_command[tpos+2]=='Y') { + panel_type = AC_panel_standard; + SERIAL_ECHOLNPGM_P(AC_msg_old_panel_detected); + } + } + else { + tpos = FindToken('['); // new panel will respond to 'J200' with '[0]=0' + if (tpos != -1) { + if (panel_command[tpos+1]== '0' && panel_command[tpos+2]==']') { + panel_type = AC_panel_new; + SERIAL_ECHOLNPGM_P(AC_msg_new_panel_detected); + } + } + } + return; + } + #endif - else SendtoTFTLN(); + SendtoTFTLN(); // Ignore unknown requests + } } void ChironTFT::PanelInfo(uint8_t req) { @@ -513,7 +576,8 @@ void ChironTFT::PanelInfo(uint8_t req) { case 33: // A33 Get firmware info SendtoTFT(PSTR("J33 ")); - SendtoTFTLN(PSTR(SHORT_BUILD_VERSION)); + // If there is an error recorded, show that instead of the FW version + if (!GetLastError()) SendtoTFTLN(PSTR(SHORT_BUILD_VERSION)); break; } } @@ -567,11 +631,7 @@ void ChironTFT::PanelAction(uint8_t req) { #if ACDebugLevel >= 1 SERIAL_ECHOLNPAIR_F("Print: ", selectedfile); #endif - // the card library needs a path starting // but the File api doesn't... - char file[MAX_PATH_LEN]; - file[0] = '/'; - strcpy(file + 1, selectedfile); - printFile(file); + printFile(selectedfile); SendtoTFTLN(AC_msg_print_from_sd_card); } break; @@ -631,29 +691,24 @@ void ChironTFT::PanelAction(uint8_t req) { } break; - case 22: // A22 Move Axis A22 Y +10F3000 - // Ignore request if printing - if (!isPrinting()) { - // setAxisPosition_mm() uses pre defined manual feedrates so ignore the feedrate from the panel - setSoftEndstopState(true); // enable endstops - float newposition = atof(&panel_command[6]); + case 22: { // A22 Move Axis + // The commands have changed on the new panel + // Old TFT A22 X -1F1500 A22 X +1F1500 + // New TFT A22 X-1.0 F1500 A22 X1.0 F1500 + // lets just wrap this in a gcode relative nonprint move and let the controller deal with it + // G91 G0 G90 + + if (!isPrinting()) { // Ignore request if printing + char MoveCmnd[30]; + sprintf_P(MoveCmnd, PSTR("G91\nG0 %s \nG90"), panel_command+3); #if ACDEBUG(AC_ACTION) - SERIAL_ECHOLNPAIR("Nudge ", AS_CHAR(panel_command[4]), " axis ", newposition); + SERIAL_ECHOLNPAIR("Move: ", MoveCmnd); #endif - - switch (panel_command[4]) { - case 'X': setAxisPosition_mm(getAxisPosition_mm(X) + newposition, X); break; - case 'Y': setAxisPosition_mm(getAxisPosition_mm(Y) + newposition, Y); break; - case 'Z': setAxisPosition_mm(getAxisPosition_mm(Z) + newposition, Z); break; - case 'E': // The only time we get this command is from the filament load/unload menu - // the standard movement is too slow so we will use the load unlod GCode to speed it up a bit - if (canMove(E0) && !commandsInQueue()) - injectCommands_P(newposition > 0 ? AC_cmnd_manual_load_filament : AC_cmnd_manual_unload_filament); - break; - } + setSoftEndstopState(true); // enable endstops + injectCommands(MoveCmnd); } - break; + } break; case 23: // A23 Preheat PLA // Ignore request if printing @@ -690,7 +745,9 @@ void ChironTFT::PanelAction(uint8_t req) { break; case 26: // A26 Refresh SD - // M22 M21 maybe needed here to reset sd card + if (card.isMounted())card.release(); + card.mount(); + safe_delay(500); filenavigator.reset(); break; @@ -710,8 +767,8 @@ void ChironTFT::PanelProcess(uint8_t req) { case 29: { // A29 Read Mesh Point A29 X1 Y1 xy_uint8_t pos; float pos_z; - pos.x = atoi(&panel_command[5]); - pos.y = atoi(&panel_command[8]); + pos.x = atoi(&panel_command[FindToken('X')+1]); + pos.y = atoi(&panel_command[FindToken('Y')+1]); pos_z = getMeshPoint(pos); SendtoTFT(PSTR("A29V ")); @@ -743,48 +800,60 @@ void ChironTFT::PanelProcess(uint8_t req) { } } break; - case 30: { // A30 Auto leveling - if (panel_command[3] == 'S') { // Start probing + case 30: { // A30 Auto leveling + if (FindToken('S') != -1) { // Start probing New panel adds spaces.. // Ignore request if printing if (isPrinting()) SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling else { - injectCommands_P(PSTR("G28O\nG29")); - printer_state = AC_printer_probing; + + SendtoTFTLN(AC_msg_start_probing); + injectCommands_P(PSTR("G28\nG29")); + printer_state = AC_printer_probing; } } - else SendtoTFTLN(AC_msg_start_probing); - } break; + else { + SendtoTFTLN(AC_msg_start_probing); // Just enter levelling menu + } + } break; case 31: { // A31 Adjust all Probe Points - switch (panel_command[3]) { - case 'C': // Restore and apply original offsets - if (!isPrinting()) { - injectCommands_P(PSTR("M501\nM420 S1")); - selectedmeshpoint.x = selectedmeshpoint.y = 99; - } - break; - case 'D': // Save Z Offset tables and restore leveling state - if (!isPrinting()) { - setAxisPosition_mm(1.0,Z); - injectCommands_P(PSTR("M500")); - selectedmeshpoint.x = selectedmeshpoint.y = 99; - } - break; - case 'G': // Get current offset - SendtoTFT(PSTR("A31V ")); - // When printing use the live z Offset position - // we will use babystepping to move the print head - if (isPrinting()) - TFTSer.println(live_Zoffset); - else { - TFTSer.println(getZOffset_mm()); - selectedmeshpoint.x = selectedmeshpoint.y = 99; - } - break; - case 'S': { // Set offset (adjusts all points by value) - float Zshift = atof(&panel_command[4]); + // The tokens can occur in different places on the new panel so we need to find it. + + if (FindToken('C') != -1) { // Restore and apply original offsets + if (!isPrinting()) { + injectCommands_P(PSTR("M501\nM420 S1")); + selectedmeshpoint.x = selectedmeshpoint.y = 99; + SERIAL_ECHOLNPGM_P(AC_msg_mesh_changes_abandoned); + } + } + + else if (FindToken('D') != -1) { // Save Z Offset tables and restore leveling state + if (!isPrinting()) { + setAxisPosition_mm(1.0,Z); // Lift nozzle before any further movements are made + injectCommands_P(PSTR("M500")); + SERIAL_ECHOLNPGM_P(AC_msg_mesh_changes_saved); + selectedmeshpoint.x = selectedmeshpoint.y = 99; + } + } + + else if (FindToken('G') != -1) { // Get current offset + SendtoTFT(PSTR("A31V ")); + // When printing use the live z Offset position + // we will use babystepping to move the print head + if (isPrinting()) + TFTSer.println(live_Zoffset); + else { + TFTSer.println(getZOffset_mm()); + selectedmeshpoint.x = selectedmeshpoint.y = 99; + } + } + + else { + int8_t tokenpos = FindToken('S'); + if (tokenpos != -1) { // Set offset (adjusts all points by value) + float Zshift = atof(&panel_command[tokenpos+1]); setSoftEndstopState(false); // disable endstops // Allow temporary Z position nudging during print // From the leveling panel use the all points UI to adjust the print pos. @@ -813,6 +882,9 @@ void ChironTFT::PanelProcess(uint8_t req) { const xy_uint8_t pos { x, y }; const float currval = getMeshPoint(pos); setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change mesh point X", x," Y",y ," from ", currval, " to ", getMeshPoint(pos) ); + #endif } const float currZOffset = getZOffset_mm(); #if ACDEBUG(AC_INFO) @@ -878,9 +950,27 @@ void ChironTFT::PanelProcess(uint8_t req) { } } } break; + + case 36: // A36 Auto leveling for new TFT bet that was a typo in the panel code! + SendtoTFTLN(AC_msg_start_probing); + break; } } -} // Anycubic +bool ChironTFT::GetLastError() { + switch (last_error) { + case AC_error_abnormal_temp_bed: SendtoTFTLN(AC_msg_error_bed_temp); break; + case AC_error_abnormal_temp_t0: SendtoTFTLN(AC_msg_error_hotend_temp); break; + case AC_error_noSD: SendtoTFTLN(AC_msg_error_sd_card); break; + case AC_error_powerloss: SendtoTFTLN(AC_msg_power_loss); break; + case AC_error_EEPROM: SendtoTFTLN(AC_msg_eeprom_version); break; + case AC_error_filament_runout: SendtoTFTLN(AC_msg_filament_out); break; + default: return false; + } + last_error = AC_error_none; + return true; +} + +} // Anycubic namespace #endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h index 3c26cc0aec..aeef12afc6 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h @@ -33,23 +33,30 @@ #include "../../../../inc/MarlinConfigPre.h" #include "../../ui_api.h" +#if NONE(CHIRON_TFT_STANDARD, CHIRON_TFT_NEW) + #define AUTO_DETECT_CHIRON_TFT 1 +#endif + namespace Anycubic { class ChironTFT { - private: - static printer_state_t printer_state; - static paused_state_t pause_state; - static heater_state_t hotend_state; - static heater_state_t hotbed_state; - static xy_uint8_t selectedmeshpoint; - static char panel_command[MAX_CMND_LEN]; - static uint8_t command_len; - static char selectedfile[MAX_PATH_LEN]; - static float live_Zoffset; - static file_menu_t file_menu; - + #if AUTO_DETECT_CHIRON_TFT + static panel_type_t panel_type; + #else + static constexpr panel_type_t panel_type = TERN(CHIRON_TFT_NEW, AC_panel_new, AC_panel_standard); + #endif + static last_error_t last_error; + static printer_state_t printer_state; + static paused_state_t pause_state; + static heater_state_t hotend_state; + static heater_state_t hotbed_state; + static xy_uint8_t selectedmeshpoint; + static char panel_command[MAX_CMND_LEN + 1]; + static uint8_t command_len; + static char selectedfile[MAX_PATH_LEN + 1]; + static float live_Zoffset; + static file_menu_t file_menu; public: - ChironTFT(); static void Startup(); static void IdleLoop(); static void PrinterKilled(PGM_P,PGM_P); @@ -59,12 +66,13 @@ class ChironTFT { static void ConfirmationRequest(const char * const ); static void StatusChange(const char * const ); static void PowerLossRecovery(); - - private: + static void PrintComplete(); static void SendtoTFT(PGM_P); static void SendtoTFTLN(PGM_P); + private: + static void DetectPanelType(); static bool ReadTFTCommand(); - static int8_t Findcmndpos(const char *, char); + static int8_t FindToken(char); static void CheckHeaters(); static void SendFileList(int8_t); static void SelectFile(); @@ -73,8 +81,9 @@ class ChironTFT { static void PanelInfo(uint8_t); static void PanelAction(uint8_t); static void PanelProcess(uint8_t); + static bool GetLastError(); }; extern ChironTFT Chiron; -} // Anycubic +} // Anycubic namespace diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h index a8ebe9c776..83e64e7973 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -30,7 +30,7 @@ #pragma once #include "../../../../inc/MarlinConfigPre.h" -//#define ACDEBUGLEVEL 255 +//#define ACDEBUGLEVEL 4 #if ACDEBUGLEVEL // Bit-masks for selective debug: @@ -54,7 +54,7 @@ #define MAX_PATH_LEN 16 * MAX_FOLDER_DEPTH // Maximum number of characters in a SD file path #define AC_HEATER_FAULT_VALIDATION_TIME 5 // number of 1/2 second loops before signalling a heater fault -#define AC_LOWEST_MESHPOINT_VAL Z_PROBE_LOW_POINT // The lowest value you can set for a single mesh point offset +#define AC_LOWEST_MESHPOINT_VAL -10 // The lowest value you can set for a single mesh point offset // TFT panel commands #define AC_msg_sd_card_inserted PSTR("J00") @@ -85,6 +85,18 @@ #define AC_msg_probing_complete PSTR("J25") #define AC_msg_start_probing PSTR("J26") #define AC_msg_version PSTR("J27") +#define AC_msg_mesh_changes_abandoned PSTR("Mesh changes abandoned, previous mesh restored.") +#define AC_msg_mesh_changes_saved PSTR("Mesh changes saved.") +#define AC_msg_old_panel_detected PSTR("Standard TFT panel detected!") +#define AC_msg_new_panel_detected PSTR("New TFT panel detected!") +#define AC_msg_powerloss_recovery PSTR("Resuming from power outage! select the same SD file then press resume") +// Error messages must not contain spaces +#define AC_msg_error_bed_temp PSTR("Abnormal_bed_temp") +#define AC_msg_error_hotend_temp PSTR("Abnormal_hotend_temp") +#define AC_msg_error_sd_card PSTR("SD_card_error") +#define AC_msg_filament_out PSTR("Filament_runout") +#define AC_msg_power_loss PSTR("Power_failure") +#define AC_msg_eeprom_version PSTR("EEPROM_ver_wrong") #define MARLIN_msg_start_probing PSTR("Probing Point 1/25") #define MARLIN_msg_probing_failed PSTR("Probing Failed") @@ -93,13 +105,14 @@ #define MARLIN_msg_print_aborted PSTR("Print Aborted") #define MARLIN_msg_extruder_heating PSTR("E Heating...") #define MARLIN_msg_bed_heating PSTR("Bed Heating...") - +#define MARLIN_msg_EEPROM_version PSTR("EEPROM Version Error") #define MARLIN_msg_nozzle_parked PSTR("Nozzle Parked") #define MARLIN_msg_heater_timeout PSTR("Heater Timeout") #define MARLIN_msg_reheating PSTR("Reheating...") #define MARLIN_msg_reheat_done PSTR("Reheat finished.") #define MARLIN_msg_filament_purging PSTR("Filament Purging...") #define MARLIN_msg_special_pause PSTR("PB") + #define AC_cmnd_auto_unload_filament PSTR("M701") // Use Marlin unload routine #define AC_cmnd_auto_load_filament PSTR("M702 M0 PB") // Use Marlin load routing then pause for user to clean nozzle @@ -108,6 +121,9 @@ #define AC_cmnd_enable_leveling PSTR("M420SV") #define AC_cmnd_power_loss_recovery PSTR("G28XYR5\nG28Z") // Lift, home X and Y then home Z when in 'safe' position +#define AC_Test_for_OldPanel PSTR("SIZE") // An old panel will respond with 'SXY 480 320' a new panel wont respond. +#define AC_Test_for_NewPanel PSTR("J200") // A new panel will respond with '[0]=0 [1]=0' to '[19]=0 ' an old panel wont respond + namespace Anycubic { enum heater_state_t : uint8_t { AC_heater_off, @@ -120,6 +136,7 @@ namespace Anycubic { AC_paused_idle }; enum printer_state_t : uint8_t { + AC_printer_booting, AC_printer_idle, AC_printer_probing, AC_printer_printing, @@ -144,4 +161,18 @@ namespace Anycubic { AC_menu_change_to_file, AC_menu_change_to_command }; -} // Anycubic + enum panel_type_t : uint8_t { + AC_panel_unknown, + AC_panel_standard, + AC_panel_new + }; + enum last_error_t : uint8_t { + AC_error_none, + AC_error_abnormal_temp_t0, + AC_error_abnormal_temp_bed, + AC_error_noSD, + AC_error_powerloss, + AC_error_filament_runout, + AC_error_EEPROM + }; +} // Anycubic namespace From e0f60c3811114730418973da49cf4bf80d369382 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 19 Apr 2021 00:07:57 -0500 Subject: [PATCH 1318/1370] Update realtime, DLP comments --- Marlin/Configuration_adv.h | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e41d5132a8..e1124edf50 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2141,8 +2141,19 @@ //#define EMERGENCY_PARSER /** - * Realtime Reporting - * Add support for commands S000 State, P000 Pause, and R000 Resume + * Realtime Reporting (requires EMERGENCY_PARSER) + * + * - Report position and state of the machine (like Grbl). + * - Auto-report position during long moves. + * - Useful for CNC/LASER. + * + * Adds support for commands: + * S000 : Report State and Position while moving. + * P000 : Instant Pause / Hold while moving. + * R000 : Resume from Pause / Hold. + * + * - During Hold all Emergency Parser commands are available, as usual. + * - Enable NANODLP_Z_SYNC and NANODLP_ALL_AXIS for move command end-state reports. */ //#define REALTIME_REPORTING_COMMANDS #if ENABLED(REALTIME_REPORTING_COMMANDS) @@ -3778,14 +3789,13 @@ /** * NanoDLP Sync support * - * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" - * string to enable synchronization with DLP projector exposure. This change will allow to use - * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + * Support for Synchronized Z moves when used with NanoDLP. G0/G1 axis moves will + * output a "Z_move_comp" string to enable synchronization with DLP projector exposure. + * This feature allows you to use [[WaitForDoneMessage]] instead of M400 commands. */ //#define NANODLP_Z_SYNC #if ENABLED(NANODLP_Z_SYNC) - //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. - // Default behavior is limited to Z axis only. + //#define NANODLP_ALL_AXIS // Send a "Z_move_comp" report for any axis move (not just Z). #endif /** From 3d3c0591e8ce19dec31ee585dded20f1d144d1ed Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 19 Apr 2021 13:30:21 -0500 Subject: [PATCH 1319/1370] Trigorilla Pro: Allow for swapped Z-stops --- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index dc603cda54..5eefedb141 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -40,6 +40,8 @@ #define DISABLE_JTAG +//#define SWAPPED_Z_PLUGS + // // EEPROM // @@ -59,10 +61,18 @@ #define X_STOP_PIN PG10 #define Y_STOP_PIN PA12 #ifndef Z_MIN_PIN - #define Z_MIN_PIN PA14 + #ifdef SWAPPED_Z_PLUGS + #define Z_MIN_PIN PA14 + #else + #define Z_MIN_PIN PA13 + #endif #endif #ifndef Z_MAX_PIN - #define Z_MAX_PIN PA13 + #ifdef SWAPPED_Z_PLUGS + #define Z_MAX_PIN PA13 + #else + #define Z_MAX_PIN PA14 + #endif #endif // @@ -185,3 +195,5 @@ #define SDSS PD2 #define SD_DETECT_PIN -1 #endif + +#undef SWAPPED_Z_PLUGS From c50a9ef055c17a44c1c9d099e7b313a7e4e1050f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 18 Apr 2021 19:01:51 -0500 Subject: [PATCH 1320/1370] Update mftest help --- buildroot/bin/mftest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 906e2abf87..ea7472c5da 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -14,13 +14,13 @@ bugout() { ((DEBUG)) && echo -e "\033[0;32m$1\033[0m" ; } usage() { echo " -Usage: mftest [-t|--env=] [-n|--num=] [-m|--make] [-y|--build=] +Usage: mftest [-t|--env=] [-n|--num=] [-m|--make] [-y|--build=] mftest [-a|--autobuild] mftest [-r|--rebuild] mftest [-u|--autoupload] [-n|--num=] OPTIONS - -t --env The environment of the test to apply / run. (As named in platformio.ini.) + -t --env The environment to apply / run, or the menu index number. -n --num The index of the test to run. (In file order.) -m --make Use the make / Docker method for the build. -y --build Skip 'Do you want to build this test?' and assume YES. From 81ab75675917febaf5ae61b613833bb2f0060539 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 20 Apr 2021 00:44:19 -0500 Subject: [PATCH 1321/1370] Changes supporting "Prussia3D" MK3 (#21617) --- Marlin/src/inc/Conditionals_post.h | 4 +++- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 12 ++++++++---- Marlin/src/lcd/marlinui.cpp | 21 +++------------------ Marlin/src/module/settings.cpp | 19 +++++++------------ Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 19 ++++++++++++++++--- 5 files changed, 37 insertions(+), 38 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index f00dd6ec97..7fabef7e63 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2539,7 +2539,9 @@ #endif #if HAS_TEMPERATURE && EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD) - #ifdef PREHEAT_5_LABEL + #ifdef PREHEAT_6_LABEL + #define PREHEAT_COUNT 6 + #elif defined(PREHEAT_5_LABEL) #define PREHEAT_COUNT 5 #elif defined(PREHEAT_4_LABEL) #define PREHEAT_COUNT 4 diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 6d2c5369dc..61d22a28ec 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -281,7 +281,9 @@ #define STATUS_HOTEND8_WIDTH STATUS_HOTEND7_WIDTH #endif - constexpr uint8_t status_hotend_width[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_WIDTH, STATUS_HOTEND2_WIDTH, STATUS_HOTEND3_WIDTH, STATUS_HOTEND4_WIDTH, STATUS_HOTEND5_WIDTH, STATUS_HOTEND6_WIDTH, STATUS_HOTEND7_WIDTH, STATUS_HOTEND8_WIDTH); + #define _SHNAME(N,T) STATUS_HOTEND##N##_##T, + + constexpr uint8_t status_hotend_width[HOTENDS] = { REPEAT2_S(1, INCREMENT(HOTENDS), _SHNAME, WIDTH) }; #define STATUS_HOTEND_WIDTH(N) status_hotend_width[N] #ifndef STATUS_HOTEND1_BYTEWIDTH @@ -309,7 +311,7 @@ #define STATUS_HOTEND8_BYTEWIDTH BW(STATUS_HOTEND8_WIDTH) #endif - constexpr uint8_t status_hotend_bytewidth[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_BYTEWIDTH, STATUS_HOTEND2_BYTEWIDTH, STATUS_HOTEND3_BYTEWIDTH, STATUS_HOTEND4_BYTEWIDTH, STATUS_HOTEND5_BYTEWIDTH, STATUS_HOTEND6_BYTEWIDTH, STATUS_HOTEND7_BYTEWIDTH, STATUS_HOTEND8_BYTEWIDTH); + constexpr uint8_t status_hotend_bytewidth[HOTENDS] = { REPEAT2_S(1, INCREMENT(HOTENDS), _SHNAME, BYTEWIDTH) }; #define STATUS_HOTEND_BYTEWIDTH(N) status_hotend_bytewidth[N] #ifndef STATUS_HOTEND1_X @@ -339,7 +341,7 @@ #define STATUS_HOTEND8_X STATUS_HOTEND7_X + STATUS_HEATERS_XSPACE #endif - constexpr uint8_t status_hotend_x[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_X, STATUS_HOTEND2_X, STATUS_HOTEND3_X, STATUS_HOTEND4_X, STATUS_HOTEND5_X, STATUS_HOTEND6_X, STATUS_HOTEND7_X, STATUS_HOTEND8_X); + constexpr uint8_t status_hotend_x[HOTENDS] = { REPEAT2_S(1, INCREMENT(HOTENDS), _SHNAME, X) }; #define STATUS_HOTEND_X(N) status_hotend_x[N] #elif HAS_MULTI_HOTEND #define STATUS_HOTEND_X(N) ((N) ? STATUS_HOTEND2_X : STATUS_HOTEND1_X) @@ -370,13 +372,15 @@ #ifndef STATUS_HOTEND8_TEXT_X #define STATUS_HOTEND8_TEXT_X STATUS_HOTEND7_TEXT_X + STATUS_HEATERS_XSPACE #endif - constexpr uint8_t status_hotend_text_x[] = ARRAY_N(HOTENDS, STATUS_HOTEND1_TEXT_X, STATUS_HOTEND2_TEXT_X, STATUS_HOTEND3_TEXT_X, STATUS_HOTEND4_TEXT_X, STATUS_HOTEND5_TEXT_X, STATUS_HOTEND6_TEXT_X, STATUS_HOTEND7_TEXT_X, STATUS_HOTEND8_TEXT_X); + constexpr uint8_t status_hotend_text_x[HOTENDS] = { REPEAT2_S(1, INCREMENT(HOTENDS), _SHNAME, TEXT_X) }; #define STATUS_HOTEND_TEXT_X(N) status_hotend_text_x[N] #else #define STATUS_HOTEND_TEXT_X(N) (STATUS_HOTEND1_X + 6 + (N) * (STATUS_HEATERS_XSPACE)) #endif #endif + #undef _SHNAME + #if STATUS_HOTEND_BITMAPS > 1 && DISABLED(STATUS_HOTEND_NUMBERLESS) #define TEST_BITMAP_OFF status_hotend1_a_bmp #define TEST_BITMAP_ON status_hotend1_b_bmp diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 149da8b54e..812dac53b7 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -112,25 +112,10 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if PREHEAT_COUNT preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() PGM_P MarlinUI::get_preheat_label(const uint8_t m) { - #ifdef PREHEAT_1_LABEL - static PGMSTR(preheat_0_label, PREHEAT_1_LABEL); - #endif - #ifdef PREHEAT_2_LABEL - static PGMSTR(preheat_1_label, PREHEAT_2_LABEL); - #endif - #ifdef PREHEAT_3_LABEL - static PGMSTR(preheat_2_label, PREHEAT_3_LABEL); - #endif - #ifdef PREHEAT_4_LABEL - static PGMSTR(preheat_3_label, PREHEAT_4_LABEL); - #endif - #ifdef PREHEAT_5_LABEL - static PGMSTR(preheat_4_label, PREHEAT_5_LABEL); - #endif - + #define _PDEF(N) static PGMSTR(preheat_##N##_label, PREHEAT_##N##_LABEL); #define _PLBL(N) preheat_##N##_label, - static PGM_P const preheat_labels[PREHEAT_COUNT] PROGMEM = { REPEAT(PREHEAT_COUNT, _PLBL) }; - + REPEAT_S(1, INCREMENT(PREHEAT_COUNT), _PDEF); + static PGM_P const preheat_labels[PREHEAT_COUNT] PROGMEM = { REPEAT_S(1, INCREMENT(PREHEAT_COUNT), _PLBL) }; return (PGM_P)pgm_read_ptr(&preheat_labels[m]); } #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 915886fe4a..4273c4b062 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2780,25 +2780,20 @@ void MarlinSettings::reset() { // Preheat parameters // #if PREHEAT_COUNT + #define _PITEM(N,T) PREHEAT_##N##_##T, #if HAS_HOTEND - constexpr uint16_t hpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND, PREHEAT_3_TEMP_HOTEND, PREHEAT_4_TEMP_HOTEND, PREHEAT_5_TEMP_HOTEND); + constexpr uint16_t hpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_HOTEND) }; #endif #if HAS_HEATED_BED - constexpr uint16_t bpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED, PREHEAT_3_TEMP_BED, PREHEAT_4_TEMP_BED, PREHEAT_5_TEMP_BED); + constexpr uint16_t bpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_BED) }; #endif #if HAS_FAN - constexpr uint8_t fpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_FAN_SPEED, PREHEAT_2_FAN_SPEED, PREHEAT_3_FAN_SPEED, PREHEAT_4_FAN_SPEED, PREHEAT_5_FAN_SPEED); + constexpr uint8_t fpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, FAN_SPEED) }; #endif LOOP_L_N(i, PREHEAT_COUNT) { - #if HAS_HOTEND - ui.material_preset[i].hotend_temp = hpre[i]; - #endif - #if HAS_HEATED_BED - ui.material_preset[i].bed_temp = bpre[i]; - #endif - #if HAS_FAN - ui.material_preset[i].fan_speed = fpre[i]; - #endif + TERN_(HAS_HOTEND, ui.material_preset[i].hotend_temp = hpre[i]); + TERN_(HAS_HEATED_BED, ui.material_preset[i].bed_temp = bpre[i]); + TERN_(HAS_FAN, ui.material_preset[i].fan_speed = fpre[i]); } #endif diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 7b05d454af..fb7743605f 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -27,7 +27,10 @@ #include "env_validate.h" -#define BOARD_INFO_NAME "Einsy Rambo" +#define BOARD_INFO_NAME "Einsy Rambo" +#define DEFAULT_MACHINE_NAME "Prusa MK3" + +//#define MK3_FAN_PINS // // TMC2130 Configuration_adv defaults for EinsyRambo @@ -123,11 +126,19 @@ #define HEATER_BED_PIN 4 #ifndef FAN_PIN - #define FAN_PIN 8 + #ifdef MK3_FAN_PINS + #define FAN_PIN 6 + #else + #define FAN_PIN 8 + #endif #endif #ifndef FAN1_PIN - #define FAN1_PIN 6 + #ifdef MK3_FAN_PINS + #define FAN_PIN -1 + #else + #define FAN_PIN 6 + #endif #endif // @@ -192,3 +203,5 @@ #endif // IS_ULTIPANEL || TOUCH_UI_ULTIPANEL #endif // HAS_WIRED_LCD + +#undef MK3_FAN_PINS From 2316fb2d056d3dd71d2a3f2cf9da6746b4d655ef Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 20 Apr 2021 05:11:43 -0500 Subject: [PATCH 1322/1370] Extra dependency script logging --- .../PlatformIO/scripts/common-dependencies.py | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index fe6ae7dba5..01ee89e25e 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -40,9 +40,9 @@ try: except: verbose = 0 -def blab(str): - if verbose: - print(str) +def blab(str,level=1): + if verbose >= level: + print("[deps] %s" % str) FEATURE_CONFIG = {} @@ -65,13 +65,16 @@ def add_to_feat_cnf(feature, flines): name = parts.pop(0) if name in ['build_flags', 'extra_scripts', 'src_filter', 'lib_ignore']: feat[name] = '='.join(parts) + blab("[%s] %s=%s" % (feature, name, feat[name]), 3) else: - for dep in line.split(','): + for dep in re.split(r",\s*", line): lib_name = re.sub(r'@([~^]|[<>]=?)?[\d.]+', '', dep.strip()).split('=').pop(0) lib_re = re.compile('(?!^' + lib_name + '\\b)') feat['lib_deps'] = list(filter(lib_re.match, feat['lib_deps'])) + [dep] + blab("[%s] lib_deps = %s" % (feature, dep), 3) def load_config(): + blab("========== Gather [features] entries...") items = ProjectConfig().items('features') for key in items: feature = key[0].upper() @@ -80,16 +83,20 @@ def load_config(): add_to_feat_cnf(feature, key[1]) # Add options matching custom_marlin.MY_OPTION to the pile + blab("========== Gather custom_marlin entries...") all_opts = env.GetProjectOptions() for n in all_opts: - mat = re.match(r'custom_marlin\.(.+)', n[0]) + key = n[0] + mat = re.match(r'custom_marlin\.(.+)', key) if mat: try: - val = env.GetProjectOption(n[0]) + val = env.GetProjectOption(key) except: val = None if val: - add_to_feat_cnf(mat.group(1).upper(), val) + opt = mat.group(1).upper() + blab("%s.custom_marlin.%s = '%s'" % ( env['PIOENV'], opt, val )) + add_to_feat_cnf(opt, val) def get_all_known_libs(): known_libs = [] @@ -124,6 +131,7 @@ def force_ignore_unused_libs(): def apply_features_config(): load_config() + blab("========== Apply enabled features...") for feature in FEATURE_CONFIG: if not env.MarlinFeatureIsEnabled(feature): continue @@ -131,12 +139,13 @@ def apply_features_config(): feat = FEATURE_CONFIG[feature] if 'lib_deps' in feat and len(feat['lib_deps']): - blab("Adding lib_deps for %s... " % feature) + blab("========== Adding lib_deps for %s... " % feature, 2) # feat to add deps_to_add = {} for dep in feat['lib_deps']: deps_to_add[PackageSpec(dep).name] = dep + blab("==================== %s... " % dep, 2) # Does the env already have the dependency? deps = env.GetProjectOption('lib_deps') @@ -159,16 +168,16 @@ def apply_features_config(): if 'build_flags' in feat: f = feat['build_flags'] - blab("Adding build_flags for %s: %s" % (feature, f)) + blab("========== Adding build_flags for %s: %s" % (feature, f), 2) new_flags = env.GetProjectOption('build_flags') + [ f ] env.Replace(BUILD_FLAGS=new_flags) if 'extra_scripts' in feat: - blab("Running extra_scripts for %s... " % feature) + blab("Running extra_scripts for %s... " % feature, 2) env.SConscript(feat['extra_scripts'], exports="env") if 'src_filter' in feat: - blab("Adding src_filter for %s... " % feature) + blab("========== Adding src_filter for %s... " % feature, 2) src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder my_srcs = re.findall(r'[+-](<.*?>)', feat['src_filter']) @@ -182,7 +191,7 @@ def apply_features_config(): env.Replace(SRC_FILTER=src_filter) if 'lib_ignore' in feat: - blab("Adding lib_ignore for %s... " % feature) + blab("========== Adding lib_ignore for %s... " % feature, 2) lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] set_env_field('lib_ignore', lib_ignore) @@ -200,7 +209,6 @@ def search_compiler(): pass if os.path.exists(GCC_PATH_CACHE): - blab("Getting g++ path from cache") with open(GCC_PATH_CACHE, 'r') as f: return f.read() @@ -227,7 +235,6 @@ def search_compiler(): filepath = os.path.sep.join([pathdir, filepath]) # Cache the g++ path to no search always if os.path.exists(ENV_BUILD_PATH): - blab("Caching g++ for current env") with open(GCC_PATH_CACHE, 'w+') as f: f.write(filepath) @@ -262,7 +269,7 @@ def load_marlin_features(): cmd += ['-D__MARLIN_DEPS__ -w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] cmd = ' '.join(cmd) - blab(cmd) + blab(cmd, 4) define_list = subprocess.check_output(cmd, shell=True).splitlines() marlin_features = {} for define in define_list: From 181e1280afc9b2c0067f06329b558120abe84025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20Sep=C3=BAlveda?= Date: Tue, 20 Apr 2021 06:14:21 -0400 Subject: [PATCH 1323/1370] Fix Grand Central SD dependency (#21660) Co-authored-by: Scott Lahteine --- ini/samd51.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ini/samd51.ini b/ini/samd51.ini index 8e8682da94..34fcc84371 100644 --- a/ini/samd51.ini +++ b/ini/samd51.ini @@ -20,8 +20,7 @@ build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} SoftwareSerialM - Adafruit SPIFlash extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py -custom_marlin.SDSUPPORT = SdFat - Adafruit Fork +custom_marlin.SDSUPPORT = SdFat - Adafruit Fork, Adafruit SPIFlash debug_tool = jlink From 214324aaa2b65ef22be820de66d7e48c6208fbd9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 20 Apr 2021 16:36:19 -0500 Subject: [PATCH 1324/1370] Fix mfconfig 'copying' message --- buildroot/share/git/mfconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/share/git/mfconfig b/buildroot/share/git/mfconfig index fe99d6b247..592ecfa603 100755 --- a/buildroot/share/git/mfconfig +++ b/buildroot/share/git/mfconfig @@ -90,7 +90,7 @@ if [[ $ACTION == "init" ]]; then git checkout init-repo -b BASE || exit # Copy all config files into place - echo "- Copying configs from Marlin..." + echo "- Copying all configs from fresh $IMPORT..." cp -R "$TEMP/config" . # Delete anything that's not a Configuration file From a866a8f2fba8a18e34fe911c3acccfcc83432ef2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 20 Apr 2021 19:16:27 -0500 Subject: [PATCH 1325/1370] Fix Chiron typos, file nav --- Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp | 4 ++-- Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h | 1 + Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp index 9975d0824f..01a871a542 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -75,7 +75,7 @@ void FileNavigator::reset() { currentfolderdepth = 0; currentindex = 0; lastpanelindex = 0; - ZERO(currentfolderindex) + ZERO(currentfolderindex); // Start at root folder while (!filelist.isAtRootDir()) filelist.upDir(); @@ -108,7 +108,7 @@ void FileNavigator::upDIR() { if (currentfolderdepth == 0) currentfoldername[0] = '\0'; else { - const char *pos = strchr(currentfoldername, '/'); + char * const pos = strchr(currentfoldername, '/'); *(pos + 1) = '\0'; } } diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h index 253b8039e7..0d55eb47b7 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h @@ -38,6 +38,7 @@ namespace Anycubic { class FileNavigator { public: + FileNavigator(); static void reset(); static void getFiles(uint16_t, panel_type_t, uint8_t filesneeded=4); static void upDIR(); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index b35d792736..b6b0eb9eb5 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -466,7 +466,7 @@ void ChironTFT::SelectFile() { void ChironTFT::ProcessPanelRequest() { // Break these up into logical blocks // as its easier to navigate than one huge switch case! - const int8_t tpos = FindToken('A'); + int8_t tpos = FindToken('A'); // Panel request are 'A0' - 'A36' if (tpos != -1) { const int8_t req = atoi(&panel_command[tpos+1]); From b8aeaa3bf49b856aead82bd96e8b3272638e143a Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Thu, 22 Apr 2021 18:19:41 -0500 Subject: [PATCH 1326/1370] M10-M11 Air Evacuation for Spindle/Laser (#21668) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 6 +++ Marlin/src/feature/spindle_laser.cpp | 14 +++++++ Marlin/src/feature/spindle_laser.h | 9 +++++ Marlin/src/gcode/control/M10-M11.cpp | 47 ++++++++++++++++++++++ Marlin/src/gcode/gcode.cpp | 4 ++ Marlin/src/gcode/gcode.h | 6 +++ Marlin/src/lcd/language/language_en.h | 2 + Marlin/src/lcd/menu/menu_spindle_laser.cpp | 5 +++ ini/features.ini | 1 + platformio.ini | 1 + 10 files changed, 95 insertions(+) create mode 100644 Marlin/src/gcode/control/M10-M11.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e1124edf50..ac9b49fe4d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3160,6 +3160,12 @@ #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC) + //#define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11 + #if ENABLED(AIR_EVACUATION) + #define AIR_EVACUATION_ACTIVE LOW // Set to "HIGH" if the on/off function is active HIGH + #define AIR_EVACUATION_PIN 42 // Override the default Cutter Vacuum or Laser Blower pin + #endif + //#define SPINDLE_SERVO // A servo converting an angle to spindle power #ifdef SPINDLE_SERVO #define SPINDLE_SERVO_NR 0 // Index of servo used for spindle control diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 66c04a001c..78fa75cac6 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -68,6 +68,9 @@ void SpindleLaser::init() { set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY); TERN_(MARLIN_DEV_MODE, frequency = SPINDLE_LASER_FREQUENCY); #endif + #if ENABLED(AIR_EVACUATION) + OUT_WRITE(AIR_EVACUATION_PIN, !AIR_EVACUATION_ACTIVE); // Init Vacuum/Blower OFF + #endif } #if ENABLED(SPINDLE_LASER_PWM) @@ -135,4 +138,15 @@ void SpindleLaser::apply_power(const uint8_t opwr) { } #endif +#if ENABLED(AIR_EVACUATION) + + // Enable / disable Cutter Vacuum or Laser Blower motor + void SpindleLaser::air_evac_enable() { WRITE(AIR_EVACUATION_PIN, AIR_EVACUATION_ACTIVE); } // Turn ON + + void SpindleLaser::air_evac_disable() { WRITE(AIR_EVACUATION_PIN, !AIR_EVACUATION_ACTIVE); } // Turn OFF + + void SpindleLaser::air_evac_toggle() { TOGGLE(AIR_EVACUATION_PIN); } // Toggle state + +#endif + #endif // HAS_CUTTER diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 88cf372a02..c3454d0b3c 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -212,6 +212,15 @@ public: static bool is_reverse() { return false; } #endif + #if ENABLED(AIR_EVACUATION) + static void air_evac_enable(); // Turn On Cutter Vacuum or Laser Blower motor + static void air_evac_disable(); // Turn Off Cutter Vacuum or Laser Blower motor + static void air_evac_toggle(); // Toggle Cutter Vacuum or Laser Blower motor + static inline bool air_evac_state() { // Get current state + return (READ(AIR_EVACUATION_PIN) == AIR_EVACUATION_ACTIVE); + } + #endif + static inline void disable() { isReady = false; set_enabled(false); } #if HAS_LCD_MENU diff --git a/Marlin/src/gcode/control/M10-M11.cpp b/Marlin/src/gcode/control/M10-M11.cpp new file mode 100644 index 0000000000..26f67e6cb6 --- /dev/null +++ b/Marlin/src/gcode/control/M10-M11.cpp @@ -0,0 +1,47 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(AIR_EVACUATION) + +#include "../gcode.h" +#include "../../module/planner.h" +#include "../../feature/spindle_laser.h" + +/** + * M10: Vacuum or Blower On + */ +void GcodeSuite::M10() { + planner.synchronize(); // Wait for move to arrive (TODO: asynchronous) + cutter.air_evac_enable(); // Turn on Vacuum or Blower motor +} + +/** + * M11: Vacuum or Blower OFF + */ +void GcodeSuite::M11() { + planner.synchronize(); // Wait for move to arrive (TODO: asynchronous) + cutter.air_evac_disable(); // Turn off Vacuum or Blower motor +} + +#endif // AIR_EVACUATION diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index efea087602..bf26fe5d89 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -432,6 +432,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 3: M3_M4(false); break; // M3: Turn ON Laser | Spindle (clockwise), set Power | Speed case 4: M3_M4(true ); break; // M4: Turn ON Laser | Spindle (counter-clockwise), set Power | Speed case 5: M5(); break; // M5: Turn OFF Laser | Spindle + #if ENABLED(AIR_EVACUATION) + case 10: M10(); break; // M10: Vacuum or Blower motor ON + case 11: M11(); break; // M11: Vacuum or Blower motor OFF + #endif #endif #if ENABLED(COOLANT_CONTROL) diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 977fc8bfd8..2904d30366 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -86,6 +86,8 @@ * M7 - Turn mist coolant ON. (Requires COOLANT_CONTROL) * M8 - Turn flood coolant ON. (Requires COOLANT_CONTROL) * M9 - Turn coolant OFF. (Requires COOLANT_CONTROL) + * M10 - Turn Vacuum or Blower motor ON (Requires AIR_EVACUATION) + * M11 - Turn Vacuum or Blower motor OFF (Requires AIR_EVACUATION) * M12 - Set up closed loop control system. (Requires EXTERNAL_CLOSED_LOOP_CONTROLLER) * M16 - Expected printer check. (Requires EXPECTED_PRINTER_CHECK) * M17 - Enable/Power all stepper motors @@ -548,6 +550,10 @@ private: #if HAS_CUTTER static void M3_M4(const bool is_M4); static void M5(); + #if ENABLED(AIR_EVACUATION) + static void M10(); + static void M11(); + #endif #endif #if ENABLED(COOLANT_CONTROL) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 81450d7385..c911120766 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -114,10 +114,12 @@ namespace Language_en { PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laser Power"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Pwr"); PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Toggle Laser"); + PROGMEM Language_Str MSG_LASER_EVAC_TOGGLE = _UxGT("Toggle Blower"); PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Test Pulse ms"); PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Fire Pulse"); PROGMEM Language_Str MSG_FLOWMETER_FAULT = _UxGT("Coolant Flow Fault"); PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Toggle Spindle"); + PROGMEM Language_Str MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Toggle Vacuum"); PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Spindle Forward"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Switch Power On"); diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index 93ef224e6f..f0e702e2dd 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -51,6 +51,11 @@ editable.state = is_enabled; EDIT_ITEM(bool, MSG_CUTTER(TOGGLE), &is_enabled, []{ if (editable.state) cutter.disable(); else cutter.enable_same_dir(); }); + #if ENABLED(AIR_EVACUATION) + bool evac_state = cutter.air_evac_state(); + EDIT_ITEM(bool, MSG_CUTTER(EVAC_TOGGLE), &evac_state, cutter.air_evac_toggle); + #endif + #if ENABLED(SPINDLE_CHANGE_DIR) if (!is_enabled) { editable.state = is_rev; diff --git a/ini/features.ini b/ini/features.ini index 864befa7a8..3121ef7241 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -164,6 +164,7 @@ SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ BAUD_RATE_GCODE = src_filter=+ HAS_SMART_EFF_MOD = src_filter=+ COOLANT_CONTROL = src_filter=+ +AIR_EVACUATION = src_filter=+ HAS_SOFTWARE_ENDSTOPS = src_filter=+ HAS_DUPLICATION_MODE = src_filter=+ LIN_ADVANCE = src_filter=+ diff --git a/platformio.ini b/platformio.ini index 8a747404e3..75e7f6a58b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -155,6 +155,7 @@ default_src_filter = + - - + - - - + - - - - - From 5859860a0248e2a42f2a395af3a4aa5971b077ad Mon Sep 17 00:00:00 2001 From: BigTreeTech <38851044+bigtreetech@users.noreply.github.com> Date: Fri, 23 Apr 2021 07:43:28 +0800 Subject: [PATCH 1327/1370] Enable Purge More / Resume with EP + Host Prompt (#21671) Co-authored-by: Msq001 --- Marlin/src/feature/host_actions.cpp | 4 ++-- Marlin/src/feature/pause.cpp | 12 ++++++++---- Marlin/src/feature/pause.h | 2 +- Marlin/src/inc/Conditionals_post.h | 12 ++++++++++-- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index 203fdaf531..62e60320f7 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -149,13 +149,13 @@ void host_action(PGM_P const pstr, const bool eol) { switch (response) { case 0: // "Purge More" button - #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) + #if BOTH(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more) #endif break; case 1: // "Continue" / "Disable Runout" button - #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) + #if BOTH(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; // Simulate menu selection #endif #if HAS_FILAMENT_SENSOR diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 8a1701d0b6..192c7f6345 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -75,7 +75,7 @@ static xyze_pos_t resume_position; -#if HAS_LCD_MENU +#if M600_PURGE_MORE_RESUMABLE PauseMenuResponse pause_menu_response; PauseMode pause_mode = PAUSE_MODE_PAUSE_PRINT; #endif @@ -257,18 +257,22 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load TERN_(HOST_PROMPT_SUPPORT, filament_load_host_prompt()); // Initiate another host prompt. - #if HAS_LCD_MENU + #if M600_PURGE_MORE_RESUMABLE if (show_lcd) { // Show "Purge More" / "Resume" menu and wait for reply KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = false; - ui.pause_show_message(PAUSE_MESSAGE_OPTION); + #if HAS_LCD_MENU + ui.pause_show_message(PAUSE_MESSAGE_OPTION); // Also sets PAUSE_RESPONSE_WAIT_FOR + #else + pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; + #endif while (pause_menu_response == PAUSE_RESPONSE_WAIT_FOR) idle_no_sleep(); } #endif // Keep looping if "Purge More" was selected - } while (TERN0(HAS_LCD_MENU, show_lcd && pause_menu_response == PAUSE_RESPONSE_EXTRUDE_MORE)); + } while (TERN0(M600_PURGE_MORE_RESUMABLE, show_lcd && pause_menu_response == PAUSE_RESPONSE_EXTRUDE_MORE)); #endif TERN_(HOST_PROMPT_SUPPORT, host_action_prompt_end()); diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 2a7ea40b83..facd8d8dee 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -59,7 +59,7 @@ enum PauseMessage : char { PAUSE_MESSAGE_HEATING }; -#if HAS_LCD_MENU +#if M600_PURGE_MORE_RESUMABLE enum PauseMenuResponse : char { PAUSE_RESPONSE_WAIT_FOR, PAUSE_RESPONSE_EXTRUDE_MORE, diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 7fabef7e63..611c13e344 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2716,8 +2716,16 @@ #define HEATER_IDLE_HANDLER 1 #endif -#if ENABLED(ADVANCED_PAUSE_FEATURE) && !defined(FILAMENT_CHANGE_SLOW_LOAD_LENGTH) - #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 +/** + * Advanced Pause - Filament Change + */ +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #if HAS_LCD_MENU || BOTH(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) + #define M600_PURGE_MORE_RESUMABLE 1 + #endif + #ifndef FILAMENT_CHANGE_SLOW_LOAD_LENGTH + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 + #endif #endif #if HAS_MULTI_EXTRUDER && !defined(TOOLCHANGE_FS_EXTRA_PRIME) From d5e62a8255c9e7c373f52e0d9988c1a354fbf613 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Apr 2021 19:09:35 -0500 Subject: [PATCH 1328/1370] Use configured temp window for Chiron --- Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index b6b0eb9eb5..08160d52fb 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -406,7 +406,7 @@ void ChironTFT::CheckHeaters() { // Update panel with hotend heater status if (hotend_state != AC_heater_temp_reached) { - if (WITHIN(getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1)) { + if (WITHIN(getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -(TEMP_WINDOW), TEMP_WINDOW)) { SendtoTFTLN(AC_msg_nozzle_heating_done); hotend_state = AC_heater_temp_reached; } @@ -414,7 +414,7 @@ void ChironTFT::CheckHeaters() { // Update panel with bed heater status if (hotbed_state != AC_heater_temp_reached) { - if (WITHIN(getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5)) { + if (WITHIN(getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -(TEMP_BED_WINDOW), TEMP_BED_WINDOW)) { SendtoTFTLN(AC_msg_bed_heating_done); hotbed_state = AC_heater_temp_reached; } From ecc419fce0289be66f4163c7d4796eaab35a8759 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Apr 2021 19:14:58 -0500 Subject: [PATCH 1329/1370] Nextion cleanup --- .../src/lcd/extui/lib/nextion/nextion_tft.cpp | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp index 23857c65c3..3cd99b3163 100644 --- a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp @@ -46,13 +46,7 @@ char NextionTFT::selectedfile[MAX_PATH_LEN]; char NextionTFT::nextion_command[MAX_CMND_LEN]; uint8_t NextionTFT::command_len; -bool last_homed = 0, last_homedX = 0, last_homedY = 0, last_homedZ = 0; -float last_degBed = 999, last_degHotend0 = 999, last_degHotend1 = 999, last_degTargetBed = 999, last_degTargetHotend0 = 999, last_degTargetHotend1 = 999; -float last_get_axis_position_mmX = 999, last_get_axis_position_mmY = 999, last_get_axis_position_mmZ = 999; -float last_extruder_advance_K = 999; -uint8_t last_active_extruder = 99, last_fan_speed = 99, last_print_speed = 99, last_flow_speed = 99, last_progress = 99; -uint8_t last_printer_state = 99, last_IDEX_Mode = 99; -uint32_t layer = 0, last_layer = 99; +uint32_t layer = 0; NextionTFT nextion; @@ -601,6 +595,9 @@ void NextionTFT::PanelAction(uint8_t req) { void NextionTFT::UpdateOnChange() { const millis_t ms = millis(); static millis_t next_event_ms = 0; + static float last_degBed = 999, last_degHotend0 = 999, last_degHotend1 = 999, + last_degTargetBed = 999, last_degTargetHotend0 = 999, last_degTargetHotend1 = 999; + // tmppage Temperature if (!WITHIN(last_degHotend0 - getActualTemp_celsius(E0), -0.2, 0.2) || !WITHIN(last_degTargetHotend0 - getTargetTemp_celsius(E0), -0.5, 0.5)) { SEND_TEMP("tmppage.t0", ui8tostr3rj(getActualTemp_celsius(E0)), " / ", ui8tostr3rj(getTargetTemp_celsius(E0))); @@ -621,24 +618,28 @@ void NextionTFT::UpdateOnChange() { } // tmppage Tool + static uint8_t last_active_extruder = 99; if (last_active_extruder != getActiveTool()) { SEND_VALasTXT("tmppage.tool", getActiveTool()); last_active_extruder = getActiveTool(); } // tmppage Fan Speed + static uint8_t last_fan_speed = 99; if (last_fan_speed != getActualFan_percent(FAN0)) { SEND_VALasTXT("tmppage.fan", ui8tostr3rj(getActualFan_percent(FAN0))); last_fan_speed = getActualFan_percent(FAN0); } // tmppage Print Speed + static uint8_t last_print_speed = 99; if (last_print_speed != getFeedrate_percent()) { SEND_VALasTXT("tmppage.speed", ui8tostr3rj(getFeedrate_percent())); last_print_speed = getFeedrate_percent(); } // tmppage Flow + static uint8_t last_flow_speed = 99; if (last_flow_speed != getFlowPercentage(getActiveTool())) { SEND_VALasTXT("tmppage.flow", getFlowPercentage(getActiveTool())); last_flow_speed = getFlowPercentage(getActiveTool()); @@ -661,6 +662,7 @@ void NextionTFT::UpdateOnChange() { SEND_VALasTXT("tmppage.elapsed", elapsed_str); } + static uint8_t last_progress = 99; if (last_progress != getProgress_percent()) { SEND_VALasTXT("tmppage.progress", ui8tostr3rj(getProgress_percent())); last_progress = getProgress_percent(); @@ -678,6 +680,8 @@ void NextionTFT::UpdateOnChange() { } // tmppage Axis + static float last_get_axis_position_mmX = 999, last_get_axis_position_mmY = 999, last_get_axis_position_mmZ = 999; + if (!WITHIN(last_get_axis_position_mmX - getAxisPosition_mm(X), -0.1, 0.1)) { if (ELAPSED(ms, next_event_ms)) { next_event_ms = ms + 30; @@ -700,6 +704,8 @@ void NextionTFT::UpdateOnChange() { } // tmppage homed + static bool last_homed = false, last_homedX = false, last_homedY = false, last_homedZ = false; + if (last_homed != isPositionKnown()) { SEND_VAL("tmppage.homed", isPositionKnown()); last_homed = isPositionKnown(); @@ -718,6 +724,7 @@ void NextionTFT::UpdateOnChange() { } // tmppage IDEX Mode + static uint8_t last_IDEX_Mode = 99; #if ENABLED(DUAL_X_CARRIAGE) if (last_IDEX_Mode != getIDEX_Mode()) { SEND_VAL("tmppage.idexmode", getIDEX_Mode()); From 4ab19e788205b22f99ffc25d22f4aeacb9aeeb8b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Apr 2021 19:14:49 -0500 Subject: [PATCH 1330/1370] Update temperature types --- Marlin/src/core/types.h | 20 ++++---- Marlin/src/feature/probe_temp_comp.cpp | 6 +-- Marlin/src/feature/probe_temp_comp.h | 4 +- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 12 ++--- Marlin/src/gcode/temp/M303.cpp | 4 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 3 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 18 ++++--- .../screens/string_format.cpp | 8 +-- .../ftdi_eve_touch_ui/screens/string_format.h | 8 +-- .../src/lcd/extui/lib/nextion/nextion_tft.cpp | 4 +- Marlin/src/lcd/extui/ui_api.cpp | 8 +-- Marlin/src/lcd/extui/ui_api.h | 8 +-- Marlin/src/module/probe.cpp | 8 +-- Marlin/src/module/probe.h | 2 +- Marlin/src/module/temperature.cpp | 49 +++++++++++-------- Marlin/src/module/temperature.h | 2 +- 16 files changed, 88 insertions(+), 76 deletions(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 687ec867d1..79a79b739b 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -77,6 +77,7 @@ typedef float feedRate_t; // For more resolition (e.g., for a chocolate printer) this may later be changed to Celsius x 100 // typedef int16_t celsius_t; +typedef float celsius_float_t; // // On AVR pointers are only 2 bytes so use 'const float &' for 'const float' @@ -87,17 +88,18 @@ typedef int16_t celsius_t; typedef const float const_float_t; #endif typedef const_float_t const_feedRate_t; +typedef const_float_t const_celsius_float_t; // Conversion macros -#define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) -#define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) +#define MMM_TO_MMS(MM_M) feedRate_t(static_cast(MM_M) / 60.0f) +#define MMS_TO_MMM(MM_S) (static_cast(MM_S) * 60.0f) // // Coordinates structures for XY, XYZ, XYZE... // // Helpers -#define _RECIP(N) ((N) ? 1.0f / float(N) : 0.0f) +#define _RECIP(N) ((N) ? 1.0f / static_cast(N) : 0.0f) #define _ABS(N) ((N) < 0 ? -(N) : (N)) #define _LS(N) (N = (T)(uint32_t(N) << v)) #define _RS(N) (N = (T)(uint32_t(N) >> v)) @@ -214,8 +216,8 @@ struct XYval { FI XYval asLong() const { return { int32_t(x), int32_t(y) }; } FI XYval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } FI XYval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } - FI XYval asFloat() { return { float(x), float(y) }; } - FI XYval asFloat() const { return { float(x), float(y) }; } + FI XYval asFloat() { return { static_cast(x), static_cast(y) }; } + FI XYval asFloat() const { return { static_cast(x), static_cast(y) }; } FI XYval reciprocal() const { return { _RECIP(x), _RECIP(y) }; } FI XYval asLogical() const { XYval o = asFloat(); toLogical(o); return o; } FI XYval asNative() const { XYval o = asFloat(); toNative(o); return o; } @@ -325,8 +327,8 @@ struct XYZval { FI XYZval asLong() const { return { int32_t(x), int32_t(y), int32_t(z) }; } FI XYZval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)) }; } FI XYZval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)) }; } - FI XYZval asFloat() { return { float(x), float(y), float(z) }; } - FI XYZval asFloat() const { return { float(x), float(y), float(z) }; } + FI XYZval asFloat() { return { static_cast(x), static_cast(y), static_cast(z) }; } + FI XYZval asFloat() const { return { static_cast(x), static_cast(y), static_cast(z) }; } FI XYZval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z) }; } FI XYZval asLogical() const { XYZval o = asFloat(); toLogical(o); return o; } FI XYZval asNative() const { XYZval o = asFloat(); toNative(o); return o; } @@ -436,8 +438,8 @@ struct XYZEval { FI XYZEval asLong() const { return { int32_t(x), int32_t(y), int32_t(z), int32_t(e) }; } FI XYZEval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(e)) }; } FI XYZEval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(e)) }; } - FI XYZEval asFloat() { return { float(x), float(y), float(z), float(e) }; } - FI XYZEval asFloat() const { return { float(x), float(y), float(z), float(e) }; } + FI XYZEval asFloat() { return { static_cast(x), static_cast(y), static_cast(z), static_cast(e) }; } + FI XYZEval asFloat() const { return { static_cast(x), static_cast(y), static_cast(z), static_cast(e) }; } FI XYZEval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z), _RECIP(e) }; } FI XYZEval asLogical() const { XYZEval o = asFloat(); toLogical(o); return o; } FI XYZEval asNative() const { XYZEval o = asFloat(); toNative(o); return o; } diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index b0867817b6..68e669224c 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -52,7 +52,7 @@ const temp_calib_t ProbeTempComp::cali_info[TSI_COUNT] = { constexpr xyz_pos_t ProbeTempComp::park_point; constexpr xy_pos_t ProbeTempComp::measure_point; -constexpr int ProbeTempComp::probe_calib_bed_temp; +constexpr celsius_t ProbeTempComp::probe_calib_bed_temp; uint8_t ProbeTempComp::calib_idx; // = 0 float ProbeTempComp::init_measurement; // = 0.0 @@ -126,7 +126,7 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { SERIAL_ECHOPGM("Applying linear extrapolation"); calib_idx--; for (; calib_idx < measurements; ++calib_idx) { - const float temp = start_temp + float(calib_idx) * res_temp; + const celsius_float_t temp = start_temp + float(calib_idx) * res_temp; data[calib_idx] = static_cast(k * temp + d); } } @@ -174,7 +174,7 @@ float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const_fl return xy_float_t({start_temp + i*res_temp, static_cast(data[i])}); }; - auto linear_interp = [](float x, xy_float_t p1, xy_float_t p2) { + auto linear_interp = [](const_float_t x, xy_float_t p1, xy_float_t p2) { return (p2.y - p1.y) / (p2.x - p2.y) * (x - p1.x) + p1.y; }; diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h index e29da7ece1..5fb637a17e 100644 --- a/Marlin/src/feature/probe_temp_comp.h +++ b/Marlin/src/feature/probe_temp_comp.h @@ -100,8 +100,8 @@ class ProbeTempComp { static constexpr xy_pos_t measure_point = PTC_PROBE_POS; // Coordinates to probe //measure_point = { 12.0f, 7.3f }; // Coordinates for the MK52 magnetic heatbed - static constexpr int probe_calib_bed_temp = BED_MAX_TARGET, // Bed temperature while calibrating probe - bed_calib_probe_temp = BTC_PROBE_TEMP; // Probe temperature while calibrating bed + static constexpr celsius_t probe_calib_bed_temp = BED_MAX_TARGET, // Bed temperature while calibrating probe + bed_calib_probe_temp = BTC_PROBE_TEMP; // Probe temperature while calibrating bed static int16_t *sensor_z_offsets[TSI_COUNT], z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // (µm) diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 8cfe6fee7b..9fc30b794d 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -110,7 +110,7 @@ void GcodeSuite::G76() { return false; }; - auto g76_probe = [](const TempSensorID sid, uint16_t &targ, const xy_pos_t &nozpos) { + auto g76_probe = [](const TempSensorID sid, celsius_t &targ, const xy_pos_t &nozpos) { do_z_clearance(5.0); // Raise nozzle before probing const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false if (isnan(measured_z)) @@ -170,14 +170,14 @@ void GcodeSuite::G76() { // Report temperatures every second and handle heating timeouts millis_t next_temp_report = millis() + 1000; - auto report_targets = [&](const uint16_t tb, const uint16_t tp) { + auto report_targets = [&](const celsius_t tb, const celsius_t tp) { SERIAL_ECHOLNPAIR("Target Bed:", tb, " Probe:", tp); }; if (do_bed_cal) { - uint16_t target_bed = cali_info_init[TSI_BED].start_temp, - target_probe = temp_comp.bed_calib_probe_temp; + celsius_t target_bed = cali_info_init[TSI_BED].start_temp, + target_probe = temp_comp.bed_calib_probe_temp; say_waiting_for(); SERIAL_ECHOLNPGM(" cooling."); while (thermalManager.degBed() > target_bed || thermalManager.degProbe() > target_probe) @@ -236,10 +236,10 @@ void GcodeSuite::G76() { do_blocking_move_to(parkpos); // Initialize temperatures - const uint16_t target_bed = temp_comp.probe_calib_bed_temp; + const celsius_t target_bed = temp_comp.probe_calib_bed_temp; thermalManager.setTargetBed(target_bed); - uint16_t target_probe = cali_info_init[TSI_PROBE].start_temp; + celsius_t target_probe = cali_info_init[TSI_PROBE].start_temp; report_targets(target_bed, target_probe); diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 0934e04e75..e49381cdf6 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -57,7 +57,7 @@ void GcodeSuite::M303() { #endif const heater_id_t hid = (heater_id_t)parser.intval('E'); - int16_t default_temp; + celsius_t default_temp; switch (hid) { #if ENABLED(PIDTEMP) case 0 ... HOTENDS - 1: default_temp = PREHEAT_1_TEMP_HOTEND; break; @@ -74,7 +74,7 @@ void GcodeSuite::M303() { return; } - const int16_t temp = parser.celsiusval('S', default_temp); + const celsius_t temp = parser.celsiusval('S', default_temp); const int c = parser.intval('C', 5); const bool u = parser.boolval('U'); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 08160d52fb..ee8f18cd8e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -373,10 +373,9 @@ int8_t ChironTFT::FindToken(char c) { void ChironTFT::CheckHeaters() { uint8_t faultDuration = 0; - float temp = 0; // if the hotend temp is abnormal, confirm state before signalling panel - temp = getActualTemp_celsius(E0); + celsius_float_t temp = getActualTemp_celsius(E0); while (!WITHIN(temp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP)) { faultDuration++; if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index ecc516108c..acd4d202b6 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -534,6 +534,8 @@ void AnycubicTFTClass::OnPrintTimerStopped() { #endif } +#define ROUND(val) int((val)+0.5f) + void AnycubicTFTClass::GetCommandFromTFT() { char *starpos = nullptr; while (LCD_SERIAL.available() > 0 && TFTbuflen < TFTBUFSIZE) { @@ -560,26 +562,26 @@ void AnycubicTFTClass::GetCommandFromTFT() { switch (a_command) { case 0: { // A0 GET HOTEND TEMP - const float hotendActualTemp = getActualTemp_celsius(E0); - SEND_PGM_VAL("A0V ", int(hotendActualTemp + 0.5)); + const celsius_float_t hotendActualTemp = getActualTemp_celsius(E0); + SEND_PGM_VAL("A0V ", ROUND(hotendActualTemp)); } break; case 1: { // A1 GET HOTEND TARGET TEMP - const float hotendTargetTemp = getTargetTemp_celsius(E0); - SEND_PGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); + const celsius_float_t hotendTargetTemp = getTargetTemp_celsius(E0); + SEND_PGM_VAL("A1V ", ROUND(hotendTargetTemp)); } break; case 2: { // A2 GET HOTBED TEMP - const float heatedBedActualTemp = getActualTemp_celsius(BED); - SEND_PGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); + const celsius_float_t heatedBedActualTemp = getActualTemp_celsius(BED); + SEND_PGM_VAL("A2V ", ROUND(heatedBedActualTemp)); } break; case 3: { // A3 GET HOTBED TARGET TEMP - const float heatedBedTargetTemp = getTargetTemp_celsius(BED); - SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); + const celsius_float_t heatedBedTargetTemp = getTargetTemp_celsius(BED); + SEND_PGM_VAL("A3V ", ROUND(heatedBedTargetTemp)); } break; case 4: { // A4 GET FAN SPEED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp index c3114a3922..ac423c2d07 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp @@ -33,28 +33,28 @@ /** * Formats a temperature string (e.g. "100°C") */ -void format_temp(char *str, float t1) { +void format_temp(char *str, const_celsius_float_t t1) { sprintf_P(str, PSTR("%3d" S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C)); } /** * Formats a temperature string for an idle heater (e.g. "100 °C / idle") */ -void format_temp_and_idle(char *str, float t1) { +void format_temp_and_idle(char *str, const_celsius_float_t t1) { sprintf_P(str, PSTR("%3d" S_FMT " / " S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE)); } /** * Formats a temperature string for an active heater (e.g. "100 / 200°C") */ -void format_temp_and_temp(char *str, float t1, float t2) { +void format_temp_and_temp(char *str, const_celsius_float_t t1, const_celsius_float_t t2) { sprintf_P(str, PSTR("%3d / %3d" S_FMT), ROUND(t1), ROUND(t2), GET_TEXT(MSG_UNITS_C)); } /** * Formats a temperature string for a material (e.g. "100°C (PLA)") */ -void format_temp_and_material(char *str, float t1, const char *material) { +void format_temp_and_material(char *str, const_celsius_float_t t1, const char *material) { sprintf_P(str, PSTR("%3d" S_FMT " (" S_FMT ")"), ROUND(t1), GET_TEXT(MSG_UNITS_C), material); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h index 545c701700..44583f08ec 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h @@ -21,9 +21,9 @@ #pragma once -void format_temp(char *str, float t1); -void format_temp_and_idle(char *str, float t1); -void format_temp_and_temp(char *str, float t1, float t2); -void format_temp_and_material(char *str, float t1, const char *material); +void format_temp(char *str, const_celsius_float_t t1); +void format_temp_and_idle(char *str, const_celsius_float_t t1); +void format_temp_and_temp(char *str, const_celsius_float_t t1, const_celsius_float_t t2); +void format_temp_and_material(char *str, const_celsius_float_t t1, const char *material); void format_position(char *str, float p, uint8_t decimals = 1); void format_position(char *str, float x, float y, float z); diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp index 3cd99b3163..679f66d807 100644 --- a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp @@ -595,8 +595,8 @@ void NextionTFT::PanelAction(uint8_t req) { void NextionTFT::UpdateOnChange() { const millis_t ms = millis(); static millis_t next_event_ms = 0; - static float last_degBed = 999, last_degHotend0 = 999, last_degHotend1 = 999, - last_degTargetBed = 999, last_degTargetHotend0 = 999, last_degTargetHotend1 = 999; + static celsius_float_t last_degBed = 999, last_degHotend0 = 999, last_degHotend1 = 999, + last_degTargetBed = 999, last_degTargetHotend0 = 999, last_degTargetHotend1 = 999; // tmppage Temperature if (!WITHIN(last_degHotend0 - getActualTemp_celsius(E0), -0.2, 0.2) || !WITHIN(last_degTargetHotend0 - getTargetTemp_celsius(E0), -0.5, 0.5)) { diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 66bc10c411..c2f51b3265 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -263,7 +263,7 @@ namespace ExtUI { #define GET_TEMP_ADJUSTMENT(A) A #endif - float getActualTemp_celsius(const heater_t heater) { + celsius_float_t getActualTemp_celsius(const heater_t heater) { switch (heater) { #if ENABLED(HAS_HEATED_BED) case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degBed()); @@ -275,11 +275,11 @@ namespace ExtUI { } } - float getActualTemp_celsius(const extruder_t extruder) { + celsius_float_t getActualTemp_celsius(const extruder_t extruder) { return GET_TEMP_ADJUSTMENT(thermalManager.degHotend(extruder - E0)); } - float getTargetTemp_celsius(const heater_t heater) { + celsius_float_t getTargetTemp_celsius(const heater_t heater) { switch (heater) { #if ENABLED(HAS_HEATED_BED) case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetBed()); @@ -291,7 +291,7 @@ namespace ExtUI { } } - float getTargetTemp_celsius(const extruder_t extruder) { + celsius_float_t getTargetTemp_celsius(const extruder_t extruder) { return GET_TEMP_ADJUSTMENT(thermalManager.degTargetHotend(extruder - E0)); } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index c59fe0bd17..bd017c6bd3 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -109,10 +109,10 @@ namespace ExtUI { void setTMCBumpSensitivity(const_float_t , const axis_t); #endif - float getActualTemp_celsius(const heater_t); - float getActualTemp_celsius(const extruder_t); - float getTargetTemp_celsius(const heater_t); - float getTargetTemp_celsius(const extruder_t); + celsius_float_t getActualTemp_celsius(const heater_t); + celsius_float_t getActualTemp_celsius(const extruder_t); + celsius_float_t getTargetTemp_celsius(const heater_t); + celsius_float_t getTargetTemp_celsius(const extruder_t); float getTargetFan_percent(const fan_t); float getActualFan_percent(const fan_t); float getAxisPosition_mm(const axis_t); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d4b8409efa..910db87f55 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -352,7 +352,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { * - If a preheat input is higher than the current target, raise the target temperature. * - If a preheat input is higher than the current temperature, wait for stabilization. */ - void Probe::preheat_for_probing(const int16_t hotend_temp, const int16_t bed_temp) { + void Probe::preheat_for_probing(const celsius_t hotend_temp, const celsius_t bed_temp) { #if HAS_HOTEND && (PROBING_NOZZLE_TEMP || LEVELING_NOZZLE_TEMP) #define WAIT_FOR_NOZZLE_HEAT #endif @@ -363,17 +363,17 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { DEBUG_ECHOPGM("Preheating "); #if ENABLED(WAIT_FOR_NOZZLE_HEAT) - const int16_t hotendPreheat = hotend_temp > thermalManager.degTargetHotend(0) ? hotend_temp : 0; + const celsius_t hotendPreheat = hotend_temp > thermalManager.degTargetHotend(0) ? hotend_temp : 0; if (hotendPreheat) { DEBUG_ECHOPAIR("hotend (", hotendPreheat, ")"); thermalManager.setTargetHotend(hotendPreheat, 0); } #elif ENABLED(WAIT_FOR_BED_HEAT) - constexpr int16_t hotendPreheat = 0; + constexpr celsius_t hotendPreheat = 0; #endif #if ENABLED(WAIT_FOR_BED_HEAT) - const int16_t bedPreheat = bed_temp > thermalManager.degTargetBed() ? bed_temp : 0; + const celsius_t bedPreheat = bed_temp > thermalManager.degTargetBed() ? bed_temp : 0; if (bedPreheat) { if (hotendPreheat) DEBUG_ECHOPGM(" and "); DEBUG_ECHOPAIR("bed (", bedPreheat, ")"); diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 75aba76ef3..7438a56614 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -61,7 +61,7 @@ public: static xyz_pos_t offset; #if EITHER(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) - static void preheat_for_probing(const int16_t hotend_temp, const int16_t bed_temp); + static void preheat_for_probing(const celsius_t hotend_temp, const celsius_t bed_temp); #endif static bool set_deployed(const bool deploy); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 08583676da..cd93ec1fc8 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -382,7 +382,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, chamber_info_t Temperature::temp_chamber; // = { 0 } #if HAS_HEATED_CHAMBER millis_t next_cool_check_ms_2 = 0; - float old_temp = 9999; + celsius_float_t old_temp = 9999; int16_t Temperature::mintemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_LO_TEMP, Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; TERN_(WATCH_CHAMBER, chamber_watch_t Temperature::watch_chamber{0}); @@ -395,7 +395,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_COOLER bool flag_cooler_state; //bool flag_cooler_excess = false; - float previous_temp = 9999; + celsius_float_t previous_temp = 9999; int16_t Temperature::mintemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_LO_TEMP, Temperature::maxtemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_HI_TEMP; #if WATCH_COOLER @@ -421,8 +421,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - celsius_t Temperature::redundant_temperature_raw = 0; - float Temperature::redundant_temperature = 0.0; + int16_t Temperature::redundant_temperature_raw = 0; + celsius_float_t Temperature::redundant_temperature = 0.0; #endif volatile bool Temperature::raw_temps_ready = false; @@ -508,7 +508,7 @@ volatile bool Temperature::raw_temps_ready = false; long t_high = 0, t_low = 0; PID_t tune_pid = { 0, 0, 0 }; - float maxT = 0, minT = 10000; + celsius_float_t maxT = 0, minT = 10000; const bool isbed = (heater_id == H_BED); const bool ischamber = (heater_id == H_CHAMBER); @@ -544,9 +544,9 @@ volatile bool Temperature::raw_temps_ready = false; #define GTV(C,B,H) C_GTV(ischamber, C, B_GTV(isbed, B, H)) const uint16_t watch_temp_period = GTV(WATCH_CHAMBER_TEMP_PERIOD, WATCH_BED_TEMP_PERIOD, WATCH_TEMP_PERIOD); const uint8_t watch_temp_increase = GTV(WATCH_CHAMBER_TEMP_INCREASE, WATCH_BED_TEMP_INCREASE, WATCH_TEMP_INCREASE); - const float watch_temp_target = target - float(watch_temp_increase + GTV(TEMP_CHAMBER_HYSTERESIS, TEMP_BED_HYSTERESIS, TEMP_HYSTERESIS) + 1); + const celsius_float_t watch_temp_target = celsius_float_t(target - watch_temp_increase + GTV(TEMP_CHAMBER_HYSTERESIS, TEMP_BED_HYSTERESIS, TEMP_HYSTERESIS) + 1); millis_t temp_change_ms = next_temp_ms + SEC_TO_MS(watch_temp_period); - float next_watch_temp = 0.0; + celsius_float_t next_watch_temp = 0.0; bool heated = false; #endif @@ -567,7 +567,7 @@ volatile bool Temperature::raw_temps_ready = false; SHV(bias); #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = GHV(temp_chamber.celsius, temp_bed.celsius, temp_hotend[heater_id].celsius); + const celsius_float_t start_temp = GHV(temp_chamber.celsius, temp_bed.celsius, temp_hotend[heater_id].celsius); LEDColor color = ONHEATINGSTART(); #endif @@ -2338,7 +2338,7 @@ void Temperature::init() { * * TODO: Embed the last 3 parameters during init, if not less optimal */ - void Temperature::tr_state_machine_t::run(const_float_t current, const_float_t target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc) { + void Temperature::tr_state_machine_t::run(const_celsius_float_t current, const_celsius_float_t target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc) { #if HEATER_IDLE_HANDLER // Convert the given heater_id_t to an idle array index @@ -3373,7 +3373,16 @@ void Temperature::isr() { #include "../gcode/gcode.h" - static void print_heater_state(const_float_t c, const_float_t t + /** + * Print a single heater state in the form: + * Bed: " B:nnn.nn /nnn.nn" + * Chamber: " C:nnn.nn /nnn.nn" + * Probe: " P:nnn.nn /nnn.nn" + * Cooler: " L:nnn.nn /nnn.nn" + * Extruder: " T0:nnn.nn /nnn.nn" + * With ADC: " T0:nnn.nn /nnn.nn (nnn.nn)" + */ + static void print_heater_state(const_celsius_float_t c, const_celsius_float_t t #if ENABLED(SHOW_TEMP_ADC_VALUES) , const float r #endif @@ -3557,12 +3566,12 @@ void Temperature::isr() { #endif #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = degHotend(target_extruder); + const celsius_float_t start_temp = degHotend(target_extruder); printerEventLEDs.onHotendHeatingStart(); #endif bool wants_to_cool = false; - float target_temp = -1.0, old_temp = 9999.0; + celsius_float_t target_temp = -1.0, old_temp = 9999.0; millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; wait_for_heatup = true; do { @@ -3592,7 +3601,7 @@ void Temperature::isr() { idle(); gcode.reset_stepper_timeout(); // Keep steppers powered - const float temp = degHotend(target_extruder); + const celsius_float_t temp = degHotend(target_extruder); #if ENABLED(PRINTER_EVENT_LEDS) // Gradually change LED strip from violet to red as nozzle heats up @@ -3601,7 +3610,7 @@ void Temperature::isr() { #if TEMP_RESIDENCY_TIME > 0 - const float temp_diff = ABS(target_temp - temp); + const celsius_float_t temp_diff = ABS(target_temp - temp); if (!residency_start_ms) { // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time. @@ -3695,12 +3704,12 @@ void Temperature::isr() { #endif #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = degBed(); + const celsius_float_t start_temp = degBed(); printerEventLEDs.onBedHeatingStart(); #endif bool wants_to_cool = false; - float target_temp = -1, old_temp = 9999; + celsius_float_t target_temp = -1, old_temp = 9999; millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; wait_for_heatup = true; do { @@ -3730,7 +3739,7 @@ void Temperature::isr() { idle(); gcode.reset_stepper_timeout(); // Keep steppers powered - const float temp = degBed(); + const celsius_float_t temp = degBed(); #if ENABLED(PRINTER_EVENT_LEDS) // Gradually change LED strip from blue to violet as bed heats up @@ -3739,7 +3748,7 @@ void Temperature::isr() { #if TEMP_BED_RESIDENCY_TIME > 0 - const float temp_diff = ABS(target_temp - temp); + const celsius_float_t temp_diff = ABS(target_temp - temp); if (!residency_start_ms) { // Start the TEMP_BED_RESIDENCY_TIME timer when we reach target temp for the first time. @@ -4021,11 +4030,11 @@ void Temperature::isr() { idle(); gcode.reset_stepper_timeout(); // Keep steppers powered - const float current_temp = degCooler(); + const celsius_float_t current_temp = degCooler(); #if TEMP_COOLER_RESIDENCY_TIME > 0 - const float temp_diff = ABS(target_temp - temp); + const celsius_float_t temp_diff = ABS(target_temp - temp); if (!residency_start_ms) { // Start the TEMP_COOLER_RESIDENCY_TIME timer when we reach target temp for the first time. diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index d2b3db8747..0335733924 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -961,7 +961,7 @@ class Temperature { millis_t timer = 0; TRState state = TRInactive; float running_temp; - void run(const_float_t current, const_float_t target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc); + void run(const_celsius_float_t current, const_celsius_float_t target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc); } tr_state_machine_t; static tr_state_machine_t tr_state_machine[NR_HEATER_RUNAWAY]; From 9f22aaea2f896a290c28ccd2aa1cabdc1e9f97bf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Apr 2021 19:06:55 -0500 Subject: [PATCH 1331/1370] Clean up formatting, wrap macros --- Marlin/src/HAL/STM32/usb_host.cpp | 2 +- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/feature/hotend_idle.cpp | 2 +- Marlin/src/feature/leds/printer_event_leds.h | 8 +--- Marlin/src/feature/power.cpp | 6 +-- Marlin/src/feature/probe_temp_comp.cpp | 2 +- Marlin/src/feature/probe_temp_comp.h | 6 +-- Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 2 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 12 +++--- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 2 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 6 +-- Marlin/src/lcd/extui/ui_api.cpp | 16 ++----- Marlin/src/lcd/extui/ui_api.h | 42 +++++++++---------- Marlin/src/module/temperature.cpp | 4 +- Marlin/src/module/tool_change.cpp | 4 +- 16 files changed, 49 insertions(+), 69 deletions(-) diff --git a/Marlin/src/HAL/STM32/usb_host.cpp b/Marlin/src/HAL/STM32/usb_host.cpp index ed743361e6..8fa49ccbcc 100644 --- a/Marlin/src/HAL/STM32/usb_host.cpp +++ b/Marlin/src/HAL/STM32/usb_host.cpp @@ -110,7 +110,7 @@ uint8_t BulkStorage::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t bl } uint8_t BulkStorage::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf) { - return USBH_MSC_Write(&hUsbHost, lun, addr, const_cast (buf), blocks) != USBH_OK; + return USBH_MSC_Write(&hUsbHost, lun, addr, const_cast(buf), blocks) != USBH_OK; } #endif // USE_OTG_USB_HOST && USBHOST diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 1405f20334..668f977b03 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -600,7 +600,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check()); #if ENABLED(EXTRUDER_RUNOUT_PREVENT) - if (thermalManager.degHotend(active_extruder) > EXTRUDER_RUNOUT_MINTEMP + if (thermalManager.degHotend(active_extruder) > (EXTRUDER_RUNOUT_MINTEMP) && ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) && !planner.has_blocks_queued() ) { diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp index 911cd20e6c..b962743ed0 100644 --- a/Marlin/src/feature/hotend_idle.cpp +++ b/Marlin/src/feature/hotend_idle.cpp @@ -45,7 +45,7 @@ void HotendIdleProtection::check_hotends(const millis_t &ms) { bool do_prot = false; HOTEND_LOOP() { const bool busy = (TERN0(HAS_RESUME_CONTINUE, wait_for_user) || planner.has_blocks_queued()); - if (thermalManager.degHotend(e) >= HOTEND_IDLE_MIN_TRIGGER && !busy) { + if (thermalManager.degHotend(e) >= (HOTEND_IDLE_MIN_TRIGGER) && !busy) { do_prot = true; break; } } diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index a262ddf85e..2e1e589730 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -36,13 +36,7 @@ private: static bool leds_off_after_print; #endif - static inline void set_done() { - #if ENABLED(LED_COLOR_PRESETS) - leds.set_default(); - #else - leds.set_off(); - #endif - } + static inline void set_done() { TERN(LED_COLOR_PRESETS, leds.set_default(), leds.set_off()); } public: #if HAS_TEMP_HOTEND diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 8ab49de2bd..2f19dae7a6 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -85,15 +85,15 @@ bool Power::is_power_needed() { if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0 || thermalManager.temp_bed.soft_pwm_amount > 0)) return true; #if HAS_HOTEND && AUTO_POWER_E_TEMP - HOTEND_LOOP() if (thermalManager.degHotend(e) >= AUTO_POWER_E_TEMP) return true; + HOTEND_LOOP() if (thermalManager.degHotend(e) >= (AUTO_POWER_E_TEMP)) return true; #endif #if HAS_HEATED_CHAMBER && AUTO_POWER_CHAMBER_TEMP - if (thermalManager.degChamber() >= AUTO_POWER_CHAMBER_TEMP) return true; + if (thermalManager.degChamber() >= (AUTO_POWER_CHAMBER_TEMP)) return true; #endif #if HAS_COOLER && AUTO_POWER_COOLER_TEMP - if (thermalManager.degCooler() >= AUTO_POWER_COOLER_TEMP) return true; + if (thermalManager.degCooler() >= (AUTO_POWER_COOLER_TEMP)) return true; #endif return false; diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index 68e669224c..edb33da8ce 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -181,7 +181,7 @@ float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const_fl // Linear interpolation uint8_t idx = static_cast((temp - start_temp) / res_temp); - // offset in um + // offset in µm float offset = 0.0f; #if !defined(PTC_LINEAR_EXTRAPOLATION) || PTC_LINEAR_EXTRAPOLATION <= 0 diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h index 5fb637a17e..c31d287a1b 100644 --- a/Marlin/src/feature/probe_temp_comp.h +++ b/Marlin/src/feature/probe_temp_comp.h @@ -81,10 +81,10 @@ typedef struct { #endif static constexpr temp_calib_t cali_info_init[TSI_COUNT] = { - { PTC_SAMPLE_COUNT, PTC_SAMPLE_RES, PTC_SAMPLE_START, PTC_SAMPLE_END }, // Probe - { BTC_SAMPLE_COUNT, BTC_SAMPLE_RES, BTC_SAMPLE_START, BTC_SAMPLE_END }, // Bed + { PTC_SAMPLE_COUNT, PTC_SAMPLE_RES, PTC_SAMPLE_START, PTC_SAMPLE_END }, // Probe + { BTC_SAMPLE_COUNT, BTC_SAMPLE_RES, BTC_SAMPLE_START, BTC_SAMPLE_END }, // Bed #if ENABLED(USE_TEMP_EXT_COMPENSATION) - { 20, 5, 180, 180 + 5 * 20 } // Extruder + { 20, 5, 180, 180 + 5 * 20 } // Extruder #endif }; diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 9fc30b794d..f07d398226 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -208,7 +208,7 @@ void GcodeSuite::G76() { report_temps(next_temp_report); const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz); - if (isnan(measured_z) || target_bed > BED_MAX_TARGET) break; + if (isnan(measured_z) || target_bed > (BED_MAX_TARGET)) break; } SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index ee8f18cd8e..5ad3895da0 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -700,7 +700,7 @@ void ChironTFT::PanelAction(uint8_t req) { if (!isPrinting()) { // Ignore request if printing char MoveCmnd[30]; - sprintf_P(MoveCmnd, PSTR("G91\nG0 %s \nG90"), panel_command+3); + sprintf_P(MoveCmnd, PSTR("G91\nG0%s\nG90"), panel_command + 3); #if ACDEBUG(AC_ACTION) SERIAL_ECHOLNPAIR("Move: ", MoveCmnd); #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index acd4d202b6..f3a9472c20 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -700,13 +700,13 @@ void AnycubicTFTClass::GetCommandFromTFT() { unsigned int tempvalue; if (CodeSeen('S')) { tempvalue = constrain(CodeValue(), 0, 275); - setTargetTemp_celsius(tempvalue, (extruder_t) E0); + setTargetTemp_celsius(tempvalue, (extruder_t)E0); } else if (CodeSeen('C') && !isPrinting()) { if (getAxisPosition_mm(Z) < 10) injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS tempvalue = constrain(CodeValue(), 0, 275); - setTargetTemp_celsius(tempvalue, (extruder_t) E0); + setTargetTemp_celsius(tempvalue, (extruder_t)E0); } } break; @@ -832,8 +832,8 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (getAxisPosition_mm(Z) < 10) injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (heater_t) BED); - setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (extruder_t) E0); + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (heater_t)BED); + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (extruder_t)E0); SENDLINE_PGM("OK"); } break; @@ -843,8 +843,8 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (getAxisPosition_mm(Z) < 10) injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (heater_t) BED); - setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (extruder_t) E0); + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (heater_t)BED); + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (extruder_t)E0); SENDLINE_PGM("OK"); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index e9cfd8179a..e35027a654 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -236,7 +236,7 @@ void disp_bed_temp() { } void disp_fan_speed() { - sprintf_P(public_buf_l, PSTR("%d%%"), thermalManager.fanSpeedPercent(0)); + sprintf_P(public_buf_l, PSTR("%d%%"), (int)thermalManager.fanSpeedPercent(0)); lv_label_set_text(labelFan, public_buf_l); } diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index 780401964b..b6a8923a39 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -178,11 +178,7 @@ void process_lcd_eb_command(const char *command) { #else 0, 0, #endif - #if ENABLED(SDSUPPORT) - done_pct, - #else - 0, - #endif + TERN(SDSUPPORT, done_pct, 0), elapsed_buffer ); write_to_lcd(message_buffer); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index c2f51b3265..23cf26a8ca 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -296,21 +296,13 @@ namespace ExtUI { } float getTargetFan_percent(const fan_t fan) { - #if HAS_FAN - return thermalManager.fanSpeedPercent(fan - FAN0); - #else - UNUSED(fan); - return 0; - #endif + UNUSED(fan); + return TERN0(HAS_FAN, thermalManager.fanSpeedPercent(fan - FAN0)); } float getActualFan_percent(const fan_t fan) { - #if HAS_FAN - return thermalManager.scaledFanSpeedPercent(fan - FAN0); - #else - UNUSED(fan); - return 0; - #endif + UNUSED(fan); + return TERN0(HAS_FAN, thermalManager.scaledFanSpeedPercent(fan - FAN0)); } float getAxisPosition_mm(const axis_t axis) { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index bd017c6bd3..ba633741f7 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -102,11 +102,11 @@ namespace ExtUI { #if HAS_TRINAMIC_CONFIG float getAxisCurrent_mA(const axis_t); float getAxisCurrent_mA(const extruder_t); - void setAxisCurrent_mA(const_float_t , const axis_t); - void setAxisCurrent_mA(const_float_t , const extruder_t); + void setAxisCurrent_mA(const_float_t, const axis_t); + void setAxisCurrent_mA(const_float_t, const extruder_t); int getTMCBumpSensitivity(const axis_t); - void setTMCBumpSensitivity(const_float_t , const axis_t); + void setTMCBumpSensitivity(const_float_t, const axis_t); #endif celsius_float_t getActualTemp_celsius(const heater_t); @@ -195,18 +195,18 @@ namespace ExtUI { char* getFilamentUsed_str(char buffer[21]); #endif - void setTargetTemp_celsius(const_float_t , const heater_t); - void setTargetTemp_celsius(const_float_t , const extruder_t); - void setTargetFan_percent(const_float_t , const fan_t); + void setTargetTemp_celsius(const_float_t, const heater_t); + void setTargetTemp_celsius(const_float_t, const extruder_t); + void setTargetFan_percent(const_float_t, const fan_t); void coolDown(); - void setAxisPosition_mm(const_float_t , const axis_t, const feedRate_t=0); - void setAxisPosition_mm(const_float_t , const extruder_t, const feedRate_t=0); - void setAxisSteps_per_mm(const_float_t , const axis_t); - void setAxisSteps_per_mm(const_float_t , const extruder_t); + void setAxisPosition_mm(const_float_t, const axis_t, const feedRate_t=0); + void setAxisPosition_mm(const_float_t, const extruder_t, const feedRate_t=0); + void setAxisSteps_per_mm(const_float_t, const axis_t); + void setAxisSteps_per_mm(const_float_t, const extruder_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const axis_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const extruder_t); - void setAxisMaxAcceleration_mm_s2(const_float_t , const axis_t); - void setAxisMaxAcceleration_mm_s2(const_float_t , const extruder_t); + void setAxisMaxAcceleration_mm_s2(const_float_t, const axis_t); + void setAxisMaxAcceleration_mm_s2(const_float_t, const extruder_t); void setFeedrate_mm_s(const feedRate_t); void setMinFeedrate_mm_s(const feedRate_t); void setMinTravelFeedrate_mm_s(const feedRate_t); @@ -220,7 +220,7 @@ namespace ExtUI { #if ENABLED(LIN_ADVANCE) float getLinearAdvance_mm_mm_s(const extruder_t); - void setLinearAdvance_mm_mm_s(const_float_t , const extruder_t); + void setLinearAdvance_mm_mm_s(const_float_t, const extruder_t); #endif #if HAS_JUNCTION_DEVIATION @@ -229,8 +229,8 @@ namespace ExtUI { #else float getAxisMaxJerk_mm_s(const axis_t); float getAxisMaxJerk_mm_s(const extruder_t); - void setAxisMaxJerk_mm_s(const_float_t , const axis_t); - void setAxisMaxJerk_mm_s(const_float_t , const extruder_t); + void setAxisMaxJerk_mm_s(const_float_t, const axis_t); + void setAxisMaxJerk_mm_s(const_float_t, const extruder_t); #endif extruder_t getTool(const uint8_t extruder); @@ -246,7 +246,7 @@ namespace ExtUI { #if HAS_HOTEND_OFFSET float getNozzleOffset_mm(const axis_t, const extruder_t); - void setNozzleOffset_mm(const_float_t , const axis_t, const extruder_t); + void setNozzleOffset_mm(const_float_t, const axis_t, const extruder_t); void normalizeNozzleOffset(const axis_t axis); #endif @@ -255,12 +255,12 @@ namespace ExtUI { #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t); - void setProbeOffset_mm(const_float_t , const axis_t); + void setProbeOffset_mm(const_float_t, const axis_t); #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t); - void setAxisBacklash_mm(const_float_t , const axis_t); + void setAxisBacklash_mm(const_float_t, const axis_t); float getBacklashCorrection_percent(); void setBacklashCorrection_percent(const_float_t ); @@ -297,15 +297,15 @@ namespace ExtUI { float getPIDValues_Kp(const extruder_t); float getPIDValues_Ki(const extruder_t); float getPIDValues_Kd(const extruder_t); - void setPIDValues(const_float_t , const_float_t , const_float_t , extruder_t); - void startPIDTune(const_float_t , extruder_t); + void setPIDValues(const_float_t, const_float_t , const_float_t , extruder_t); + void startPIDTune(const_float_t, extruder_t); #endif #if ENABLED(PIDTEMPBED) float getBedPIDValues_Kp(); float getBedPIDValues_Ki(); float getBedPIDValues_Kd(); - void setBedPIDValues(const_float_t , const_float_t , const_float_t ); + void setBedPIDValues(const_float_t, const_float_t , const_float_t ); void startBedPIDTune(const_float_t ); #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index cd93ec1fc8..1ad0303abd 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -567,7 +567,7 @@ volatile bool Temperature::raw_temps_ready = false; SHV(bias); #if ENABLED(PRINTER_EVENT_LEDS) - const celsius_float_t start_temp = GHV(temp_chamber.celsius, temp_bed.celsius, temp_hotend[heater_id].celsius); + const celsius_float_t start_temp = GHV(degChamber(), degBed(), degHotend(heater_id)); LEDColor color = ONHEATINGSTART(); #endif @@ -583,7 +583,7 @@ volatile bool Temperature::raw_temps_ready = false; updateTemperaturesFromRawValues(); // Get the current temperature and constrain it - current_temp = GHV(temp_chamber.celsius, temp_bed.celsius, temp_hotend[heater_id].celsius); + current_temp = GHV(degChamber(), degBed(), degHotend(heater_id)); NOLESS(maxT, current_temp); NOMORE(minT, current_temp); diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 2b8a434172..8354b8b86a 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1054,8 +1054,6 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { first_tool_is_primed = true; TERN_(TOOLCHANGE_FS_INIT_BEFORE_SWAP, toolchange_extruder_ready[old_tool] = true); // Primed and initialized } - #else - constexpr bool first_tool_is_primed = true; #endif if (new_tool != old_tool || TERN0(PARKING_EXTRUDER, extruder_parked)) { // PARKING_EXTRUDER may need to attach old_tool when homing @@ -1092,7 +1090,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { } else { // For first new tool, change without unloading the old. 'Just prime/init the new' - if (first_tool_is_primed) + if (TERN1(TOOLCHANGE_FS_PRIME_FIRST_USED, first_tool_is_primed)) unscaled_e_move(-toolchange_settings.swap_length, MMM_TO_MMS(toolchange_settings.retract_speed)); TERN_(TOOLCHANGE_FS_PRIME_FIRST_USED, first_tool_is_primed = true); // The first new tool will be primed by toolchanging } From 7d5714fedd3a32a73218123ae17be08a98e3a3ef Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Apr 2021 19:36:43 -0500 Subject: [PATCH 1332/1370] Let compiler do Temperature inlining --- Marlin/src/module/temperature.h | 94 ++++++++++++++++----------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 0335733924..318cdaf075 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -324,7 +324,7 @@ class Temperature { #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) static hotend_info_t temp_hotend[HOTEND_TEMPS]; static const celsius_t hotend_maxtemp[HOTENDS]; - FORCE_INLINE static celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } + static inline celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } #endif #if ENABLED(HAS_HEATED_BED) static bed_info_t temp_bed; @@ -357,20 +357,20 @@ class Temperature { #if ENABLED(PREVENT_COLD_EXTRUSION) static bool allow_cold_extrude; static celsius_t extrude_min_temp; - FORCE_INLINE static bool tooCold(const celsius_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } - FORCE_INLINE static bool tooColdToExtrude(const uint8_t E_NAME) { + static inline bool tooCold(const celsius_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } + static inline bool tooColdToExtrude(const uint8_t E_NAME) { return tooCold(degHotend(HOTEND_INDEX)); } - FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t E_NAME) { + static inline bool targetTooColdToExtrude(const uint8_t E_NAME) { return tooCold(degTargetHotend(HOTEND_INDEX)); } #else - FORCE_INLINE static bool tooColdToExtrude(const uint8_t) { return false; } - FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t) { return false; } + static inline bool tooColdToExtrude(const uint8_t) { return false; } + static inline bool targetTooColdToExtrude(const uint8_t) { return false; } #endif - FORCE_INLINE static bool hotEnoughToExtrude(const uint8_t e) { return !tooColdToExtrude(e); } - FORCE_INLINE static bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } + static inline bool hotEnoughToExtrude(const uint8_t e) { return !tooColdToExtrude(e); } + static inline bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } #if ENABLED(SINGLENOZZLE_STANDBY_FAN) static celsius_t singlenozzle_temp[EXTRUDERS]; @@ -506,25 +506,25 @@ class Temperature { static void log_user_thermistor(const uint8_t t_index, const bool eprom=false); static void reset_user_thermistors(); static celsius_t user_thermistor_to_deg_c(const uint8_t t_index, const int raw); - static bool set_pull_up_res(int8_t t_index, float value) { + static inline bool set_pull_up_res(int8_t t_index, float value) { //if (!WITHIN(t_index, 0, USER_THERMISTORS - 1)) return false; if (!WITHIN(value, 1, 1000000)) return false; user_thermistor[t_index].series_res = value; return true; } - static bool set_res25(int8_t t_index, float value) { + static inline bool set_res25(int8_t t_index, float value) { if (!WITHIN(value, 1, 10000000)) return false; user_thermistor[t_index].res_25 = value; user_thermistor[t_index].pre_calc = true; return true; } - static bool set_beta(int8_t t_index, float value) { + static inline bool set_beta(int8_t t_index, float value) { if (!WITHIN(value, 1, 1000000)) return false; user_thermistor[t_index].beta = value; user_thermistor[t_index].pre_calc = true; return true; } - static bool set_sh_coeff(int8_t t_index, float value) { + static inline bool set_sh_coeff(int8_t t_index, float value) { if (!WITHIN(value, -0.01f, 0.01f)) return false; user_thermistor[t_index].sh_c_coeff = value; user_thermistor[t_index].pre_calc = true; @@ -614,13 +614,13 @@ class Temperature { * Preheating hotends */ #ifdef MILLISECONDS_PREHEAT_TIME - static bool is_preheating(const uint8_t E_NAME) { + static inline bool is_preheating(const uint8_t E_NAME) { return preheat_end_time[HOTEND_INDEX] && PENDING(millis(), preheat_end_time[HOTEND_INDEX]); } - static void start_preheat_time(const uint8_t E_NAME) { + static inline void start_preheat_time(const uint8_t E_NAME) { preheat_end_time[HOTEND_INDEX] = millis() + MILLISECONDS_PREHEAT_TIME; } - static void reset_preheat_time(const uint8_t E_NAME) { + static inline void reset_preheat_time(const uint8_t E_NAME) { preheat_end_time[HOTEND_INDEX] = 0; } #else @@ -631,17 +631,17 @@ class Temperature { //inline so that there is no performance decrease. //deg=degreeCelsius - FORCE_INLINE static celsius_t degHotend(const uint8_t E_NAME) { + static inline celsius_t degHotend(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].celsius); } #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawHotendTemp(const uint8_t E_NAME) { + static inline int16_t rawHotendTemp(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].raw); } #endif - FORCE_INLINE static celsius_t degTargetHotend(const uint8_t E_NAME) { + static inline celsius_t degTargetHotend(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].target); } @@ -666,11 +666,11 @@ class Temperature { start_watching_hotend(ee); } - FORCE_INLINE static bool isHeatingHotend(const uint8_t E_NAME) { + static inline bool isHeatingHotend(const uint8_t E_NAME) { return temp_hotend[HOTEND_INDEX].target > temp_hotend[HOTEND_INDEX].celsius; } - FORCE_INLINE static bool isCoolingHotend(const uint8_t E_NAME) { + static inline bool isCoolingHotend(const uint8_t E_NAME) { return temp_hotend[HOTEND_INDEX].target < temp_hotend[HOTEND_INDEX].celsius; } @@ -686,11 +686,11 @@ class Temperature { #endif #endif - FORCE_INLINE static bool still_heating(const uint8_t e) { + static inline bool still_heating(const uint8_t e) { return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; } - FORCE_INLINE static bool degHotendNear(const uint8_t e, const_float_t temp) { + static inline bool degHotendNear(const uint8_t e, const_float_t temp) { return ABS(degHotend(e) - temp) < (TEMP_HYSTERESIS); } @@ -699,12 +699,12 @@ class Temperature { #if HAS_HEATED_BED #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawBedTemp() { return temp_bed.raw; } + static inline int16_t rawBedTemp() { return temp_bed.raw; } #endif - FORCE_INLINE static celsius_t degBed() { return temp_bed.celsius; } - FORCE_INLINE static celsius_t degTargetBed() { return temp_bed.target; } - FORCE_INLINE static bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } - FORCE_INLINE static bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } + static inline celsius_t degBed() { return temp_bed.celsius; } + static inline celsius_t degTargetBed() { return temp_bed.target; } + static inline bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } + static inline bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } #if WATCH_BED static void start_watching_bed(); @@ -726,7 +726,7 @@ class Temperature { static void wait_for_bed_heating(); - FORCE_INLINE static bool degBedNear(const_float_t temp) { + static inline bool degBedNear(const_float_t temp) { return ABS(degBed() - temp) < (TEMP_BED_HYSTERESIS); } @@ -734,11 +734,11 @@ class Temperature { #if HAS_TEMP_PROBE #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawProbeTemp() { return temp_probe.raw; } + static inline int16_t rawProbeTemp() { return temp_probe.raw; } #endif - FORCE_INLINE static celsius_t degProbe() { return temp_probe.celsius; } - FORCE_INLINE static bool isProbeBelowTemp(const_float_t target_temp) { return temp_probe.celsius < target_temp; } - FORCE_INLINE static bool isProbeAboveTemp(const_float_t target_temp) { return temp_probe.celsius > target_temp; } + static inline celsius_t degProbe() { return temp_probe.celsius; } + static inline bool isProbeBelowTemp(const_float_t target_temp) { return temp_probe.celsius < target_temp; } + static inline bool isProbeAboveTemp(const_float_t target_temp) { return temp_probe.celsius > target_temp; } static bool wait_for_probe(const_float_t target_temp, bool no_wait_for_cooling=true); #endif @@ -750,13 +750,13 @@ class Temperature { #if HAS_TEMP_CHAMBER #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawChamberTemp() { return temp_chamber.raw; } + static inline int16_t rawChamberTemp() { return temp_chamber.raw; } #endif - FORCE_INLINE static celsius_t degChamber() { return temp_chamber.celsius; } + static inline celsius_t degChamber() { return temp_chamber.celsius; } #if HAS_HEATED_CHAMBER - FORCE_INLINE static celsius_t degTargetChamber() { return temp_chamber.target; } - FORCE_INLINE static bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } - FORCE_INLINE static bool isCoolingChamber() { return temp_chamber.target < temp_chamber.celsius; } + static inline celsius_t degTargetChamber() { return temp_chamber.target; } + static inline bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } + static inline bool isCoolingChamber() { return temp_chamber.target < temp_chamber.celsius; } static bool wait_for_chamber(const bool no_wait_for_cooling=true); #endif #endif @@ -776,13 +776,13 @@ class Temperature { #if HAS_TEMP_COOLER #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawCoolerTemp() { return temp_cooler.raw; } + static inline int16_t rawCoolerTemp() { return temp_cooler.raw; } #endif - FORCE_INLINE static celsius_t degCooler() { return temp_cooler.celsius; } + static inline celsius_t degCooler() { return temp_cooler.celsius; } #if HAS_COOLER - FORCE_INLINE static celsius_t degTargetCooler() { return temp_cooler.target; } - FORCE_INLINE static bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } - FORCE_INLINE static bool isLaserCooling() { return temp_cooler.target < temp_cooler.celsius; } + static inline celsius_t degTargetCooler() { return temp_cooler.target; } + static inline bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } + static inline bool isLaserCooling() { return temp_cooler.target < temp_cooler.celsius; } static bool wait_for_cooler(const bool no_wait_for_cooling=true); #endif #endif @@ -794,7 +794,7 @@ class Temperature { #endif #if HAS_COOLER - static void setTargetCooler(const celsius_t celsius) { + static inline void setTargetCooler(const celsius_t celsius) { temp_cooler.target = constrain(celsius, COOLER_MIN_TARGET, COOLER_MAX_TARGET); start_watching_cooler(); } @@ -839,7 +839,7 @@ class Temperature { * Update the temp manager when PID values change */ #if ENABLED(PIDTEMP) - FORCE_INLINE static void updatePID() { + static inline void updatePID() { TERN_(PID_EXTRUSION_SCALING, last_e_position = 0); } #endif @@ -848,18 +848,18 @@ class Temperature { #if ENABLED(PROBING_HEATERS_OFF) static void pause(const bool p); - FORCE_INLINE static bool is_paused() { return paused; } + static inline bool is_paused() { return paused; } #endif #if HEATER_IDLE_HANDLER - static void reset_hotend_idle_timer(const uint8_t E_NAME) { + static inline void reset_hotend_idle_timer(const uint8_t E_NAME) { heater_idle[HOTEND_INDEX].reset(); start_watching_hotend(HOTEND_INDEX); } #if HAS_HEATED_BED - static void reset_bed_idle_timer() { + static inline void reset_bed_idle_timer() { heater_idle[IDLE_INDEX_BED].reset(); start_watching_bed(); } From 899fcf51e6efe322153cf6afd75752b5b313700d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Apr 2021 20:19:23 -0500 Subject: [PATCH 1333/1370] Add whole-degree accessors, simplify some temperature-related features (#21685) --- .../src/feature/leds/printer_event_leds.cpp | 12 +++---- Marlin/src/feature/leds/printer_event_leds.h | 8 ++--- Marlin/src/feature/leds/tempstat.cpp | 6 ++-- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/feature/probe_temp_comp.cpp | 27 ++++++++------- Marlin/src/feature/probe_temp_comp.h | 22 ++++++------ Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 10 +++--- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 10 +++--- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 6 ++-- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 8 ++--- .../lcd/dogm/status_screen_lite_ST7920.cpp | 6 ++-- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 10 +++--- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 6 ++-- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 2 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 10 +++--- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 4 +-- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 6 ++-- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 24 ++++++------- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 14 ++++---- Marlin/src/lcd/extui/malyan_lcd.cpp | 8 ++--- Marlin/src/lcd/extui/ui_api.cpp | 4 +-- Marlin/src/lcd/tft/ui_1024x600.cpp | 10 +++--- Marlin/src/lcd/tft/ui_320x240.cpp | 10 +++--- Marlin/src/lcd/tft/ui_480x320.cpp | 10 +++--- Marlin/src/module/probe.cpp | 4 +-- Marlin/src/module/temperature.cpp | 8 ++--- Marlin/src/module/temperature.h | 34 +++++++++++-------- 28 files changed, 144 insertions(+), 139 deletions(-) diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index fe7db9a8e4..4765f82e56 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -40,9 +40,9 @@ PrinterEventLEDs printerEventLEDs; uint8_t PrinterEventLEDs::old_intensity = 0; - inline uint8_t pel_intensity(const_float_t start, const_float_t current, const_float_t target) { - if (uint16_t(start) == uint16_t(target)) return 255; - return (uint8_t)map(constrain(current, start, target), start, target, 0.f, 255.f); + inline uint8_t pel_intensity(const celsius_t start, const celsius_t current, const celsius_t target) { + if (start == target) return 255; + return (uint8_t)map(constrain(current, start, target), start, target, 0, 255); } inline void pel_set_rgb(const uint8_t r, const uint8_t g, const uint8_t b) { @@ -58,7 +58,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_TEMP_HOTEND - void PrinterEventLEDs::onHotendHeating(const_float_t start, const_float_t current, const_float_t target) { + void PrinterEventLEDs::onHotendHeating(const celsius_t start, const celsius_t current, const celsius_t target) { const uint8_t blue = pel_intensity(start, current, target); if (blue != old_intensity) { old_intensity = blue; @@ -70,7 +70,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_HEATED_BED - void PrinterEventLEDs::onBedHeating(const_float_t start, const_float_t current, const_float_t target) { + void PrinterEventLEDs::onBedHeating(const celsius_t start, const celsius_t current, const celsius_t target) { const uint8_t red = pel_intensity(start, current, target); if (red != old_intensity) { old_intensity = red; @@ -82,7 +82,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_HEATED_CHAMBER - void PrinterEventLEDs::onChamberHeating(const_float_t start, const_float_t current, const_float_t target) { + void PrinterEventLEDs::onChamberHeating(const celsius_t start, const celsius_t current, const celsius_t target) { const uint8_t green = pel_intensity(start, current, target); if (green != old_intensity) { old_intensity = green; diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index 2e1e589730..b2201433d8 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -41,21 +41,21 @@ private: public: #if HAS_TEMP_HOTEND static inline LEDColor onHotendHeatingStart() { old_intensity = 0; return leds.get_color(); } - static void onHotendHeating(const_float_t start, const_float_t current, const_float_t target); + static void onHotendHeating(const celsius_t start, const celsius_t current, const celsius_t target); #endif #if HAS_HEATED_BED static inline LEDColor onBedHeatingStart() { old_intensity = 127; return leds.get_color(); } - static void onBedHeating(const_float_t start, const_float_t current, const_float_t target); + static void onBedHeating(const celsius_t start, const celsius_t current, const celsius_t target); #endif #if HAS_HEATED_CHAMBER static inline LEDColor onChamberHeatingStart() { old_intensity = 127; return leds.get_color(); } - static void onChamberHeating(const_float_t start, const_float_t current, const_float_t target); + static void onChamberHeating(const celsius_t start, const celsius_t current, const celsius_t target); #endif #if HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER - static inline void onHeatingDone() { leds.set_white(); } + static inline void onHeatingDone() { leds.set_white(); } static inline void onPidTuningDone(LEDColor c) { leds.set_color(c); } #endif diff --git a/Marlin/src/feature/leds/tempstat.cpp b/Marlin/src/feature/leds/tempstat.cpp index 880258f852..967b9f4d81 100644 --- a/Marlin/src/feature/leds/tempstat.cpp +++ b/Marlin/src/feature/leds/tempstat.cpp @@ -36,10 +36,10 @@ void handle_status_leds() { static millis_t next_status_led_update_ms = 0; if (ELAPSED(millis(), next_status_led_update_ms)) { next_status_led_update_ms += 500; // Update every 0.5s - float max_temp = TERN0(HAS_HEATED_BED, _MAX(thermalManager.degTargetBed(), thermalManager.degBed())); + celsius_t max_temp = TERN0(HAS_HEATED_BED, _MAX(thermalManager.degTargetBed(), thermalManager.wholeDegBed())); HOTEND_LOOP() - max_temp = _MAX(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e)); - const int8_t new_red = (max_temp > 55.0) ? HIGH : (max_temp < 54.0 || old_red < 0) ? LOW : old_red; + max_temp = _MAX(max_temp, thermalManager.wholeDegHotend(e), thermalManager.degTargetHotend(e)); + const int8_t new_red = (max_temp > 55) ? HIGH : (max_temp < 54 || old_red < 0) ? LOW : old_red; if (new_red != old_red) { old_red = new_red; #if PIN_EXISTS(STAT_LED_RED) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 192c7f6345..6552eaa42c 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -143,7 +143,7 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P // Allow interruption by Emergency Parser M108 wait_for_heatup = TERN1(PREVENT_COLD_EXTRUSION, !thermalManager.allow_cold_extrude); - while (wait_for_heatup && ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW) + while (wait_for_heatup && ABS(thermalManager.wholeDegHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > (TEMP_WINDOW)) idle(); wait_for_heatup = false; diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index edb33da8ce..c9d6c6cb3f 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -71,7 +71,7 @@ bool ProbeTempComp::set_offset(const TempSensorID tsi, const uint8_t idx, const void ProbeTempComp::print_offsets() { LOOP_L_N(s, TSI_COUNT) { - float temp = cali_info[s].start_temp; + celsius_t temp = cali_info[s].start_temp; for (int16_t i = -1; i < cali_info[s].measurements; ++i) { SERIAL_ECHOPGM_P(s == TSI_BED ? PSTR("Bed") : #if ENABLED(USE_TEMP_EXT_COMPENSATION) @@ -114,8 +114,8 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { } const uint8_t measurements = cali_info[tsi].measurements; - const float start_temp = cali_info[tsi].start_temp, - res_temp = cali_info[tsi].temp_res; + const celsius_t start_temp = cali_info[tsi].start_temp, + res_temp = cali_info[tsi].temp_res; int16_t * const data = sensor_z_offsets[tsi]; // Extrapolate @@ -159,19 +159,19 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { return true; } -void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const_float_t temp, float &meas_z) { +void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const celsius_t temp, float &meas_z) { if (WITHIN(temp, cali_info[tsi].start_temp, cali_info[tsi].end_temp)) meas_z -= get_offset_for_temperature(tsi, temp); } -float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const_float_t temp) { +float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const celsius_t temp) { const uint8_t measurements = cali_info[tsi].measurements; - const float start_temp = cali_info[tsi].start_temp, - res_temp = cali_info[tsi].temp_res; + const celsius_t start_temp = cali_info[tsi].start_temp, + res_temp = cali_info[tsi].temp_res; const int16_t * const data = sensor_z_offsets[tsi]; - auto point = [&](uint8_t i) { - return xy_float_t({start_temp + i*res_temp, static_cast(data[i])}); + auto point = [&](uint8_t i) -> xy_float_t { + return xy_float_t({ static_cast(start_temp) + i * res_temp, static_cast(data[i]) }); }; auto linear_interp = [](const_float_t x, xy_float_t p1, xy_float_t p2) { @@ -207,17 +207,18 @@ bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d if (!WITHIN(calib_idx, 2, cali_info[tsi].measurements)) return false; - const float start_temp = cali_info[tsi].start_temp, - res_temp = cali_info[tsi].temp_res; + const celsius_t start_temp = cali_info[tsi].start_temp, + res_temp = cali_info[tsi].temp_res; const int16_t * const data = sensor_z_offsets[tsi]; float sum_x = start_temp, sum_x2 = sq(start_temp), sum_xy = 0, sum_y = 0; + float xi = static_cast(start_temp); LOOP_L_N(i, calib_idx) { - const float xi = start_temp + (i + 1) * res_temp, - yi = static_cast(data[i]); + const float yi = static_cast(data[i]); + xi += res_temp; sum_x += xi; sum_x2 += sq(xi); sum_xy += xi * yi; diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h index c31d287a1b..2eeb7f47ec 100644 --- a/Marlin/src/feature/probe_temp_comp.h +++ b/Marlin/src/feature/probe_temp_comp.h @@ -34,9 +34,9 @@ enum TempSensorID : uint8_t { typedef struct { uint8_t measurements; // Max. number of measurements to be stored (35 - 80°C) - float temp_res, // Resolution in °C between measurements - start_temp, // Base measurement; z-offset == 0 - end_temp; + celsius_t temp_res, // Resolution in °C between measurements + start_temp, // Base measurement; z-offset == 0 + end_temp; } temp_calib_t; /** @@ -50,25 +50,25 @@ typedef struct { #define PTC_SAMPLE_COUNT 10U #endif #ifndef PTC_SAMPLE_RES - #define PTC_SAMPLE_RES 5.0f + #define PTC_SAMPLE_RES 5 #endif #ifndef PTC_SAMPLE_START - #define PTC_SAMPLE_START 30.0f + #define PTC_SAMPLE_START 30 #endif #define PTC_SAMPLE_END ((PTC_SAMPLE_START) + (PTC_SAMPLE_COUNT) * (PTC_SAMPLE_RES)) // Bed temperature calibration constants #ifndef BTC_PROBE_TEMP - #define BTC_PROBE_TEMP 30.0f + #define BTC_PROBE_TEMP 30 #endif #ifndef BTC_SAMPLE_COUNT #define BTC_SAMPLE_COUNT 10U #endif #ifndef BTC_SAMPLE_STEP - #define BTC_SAMPLE_RES 5.0f + #define BTC_SAMPLE_RES 5 #endif #ifndef BTC_SAMPLE_START - #define BTC_SAMPLE_START 60.0f + #define BTC_SAMPLE_START 60 #endif #define BTC_SAMPLE_END ((BTC_SAMPLE_START) + (BTC_SAMPLE_COUNT) * (BTC_SAMPLE_RES)) @@ -77,7 +77,7 @@ typedef struct { #endif #ifndef PTC_PROBE_RAISE - #define PTC_PROBE_RAISE 10.0f + #define PTC_PROBE_RAISE 10 #endif static constexpr temp_calib_t cali_info_init[TSI_COUNT] = { @@ -124,7 +124,7 @@ class ProbeTempComp { static void prepare_new_calibration(const_float_t init_meas_z); static void push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z); static bool finish_calibration(const TempSensorID tsi); - static void compensate_measurement(const TempSensorID tsi, const_float_t temp, float &meas_z); + static void compensate_measurement(const TempSensorID tsi, const celsius_t temp, float &meas_z); private: static uint8_t calib_idx; @@ -135,7 +135,7 @@ class ProbeTempComp { */ static float init_measurement; - static float get_offset_for_temperature(const TempSensorID tsi, const_float_t temp); + static float get_offset_for_temperature(const TempSensorID tsi, const celsius_t temp); /** * Fit a linear function in measured temperature offsets diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index f07d398226..d5266179c7 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -103,9 +103,9 @@ void GcodeSuite::G76() { return (timeout && ELAPSED(ms, timeout)); }; - auto wait_for_temps = [&](const float tb, const float tp, millis_t &ntr, const millis_t timeout=0) { + auto wait_for_temps = [&](const celsius_t tb, const celsius_t tp, millis_t &ntr, const millis_t timeout=0) { say_waiting_for(); SERIAL_ECHOLNPGM("bed and probe temperature."); - while (fabs(thermalManager.degBed() - tb) > 0.1f || thermalManager.degProbe() > tp) + while (thermalManager.wholeDegBed() != tb || thermalManager.wholeDegProbe() > tp) if (report_temps(ntr, timeout)) return true; return false; }; @@ -180,7 +180,7 @@ void GcodeSuite::G76() { target_probe = temp_comp.bed_calib_probe_temp; say_waiting_for(); SERIAL_ECHOLNPGM(" cooling."); - while (thermalManager.degBed() > target_bed || thermalManager.degProbe() > target_probe) + while (thermalManager.wholeDegBed() > target_bed || thermalManager.wholeDegProbe() > target_probe) report_temps(next_temp_report); // Disable leveling so it won't mess with us @@ -204,7 +204,7 @@ void GcodeSuite::G76() { do_blocking_move_to(noz_pos_xyz); say_waiting_for_probe_heating(); SERIAL_EOL(); - while (thermalManager.degProbe() < target_probe) + while (thermalManager.wholeDegProbe() < target_probe) report_temps(next_temp_report); const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz); @@ -350,7 +350,7 @@ void GcodeSuite::M192() { return; } - const float target_temp = parser.value_celsius(); + const celsius_t target_temp = parser.value_celsius(); ui.set_status_P(thermalManager.isProbeBelowTemp(target_temp) ? GET_TEXT(MSG_PROBE_HEATING) : GET_TEXT(MSG_PROBE_COOLING)); thermalManager.wait_for_probe(target_temp, no_wait_for_cooling); } diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 6ed4d33630..e91213b5b7 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -525,10 +525,10 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { #if HAS_HEATED_BED const bool isBed = TERN(HAS_HEATED_CHAMBER, heater_id == H_BED, heater_id < 0); - const celsius_t t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), + const celsius_t t1 = (isBed ? thermalManager.wholeDegBed() : thermalManager.wholeDegHotend(heater_id)), t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); #else - const celsius_t t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); + const celsius_t t1 = thermalManager.wholeDegHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); #endif if (prefix >= 0) lcd_put_wchar(prefix); @@ -557,11 +557,11 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char pr #if HAS_COOLER FORCE_INLINE void _draw_cooler_status(const char prefix, const bool blink) { - const float t1 = thermalManager.degCooler(), t2 = thermalManager.degTargetCooler(); + const celsius_t t2 = thermalManager.degTargetCooler(); if (prefix >= 0) lcd_put_wchar(prefix); - lcd_put_u8str(i16tostr3rj(t1 + 0.5)); + lcd_put_u8str(i16tostr3rj(thermalManager.wholeDegCooler())); lcd_put_wchar('/'); #if !HEATER_IDLE_HANDLER @@ -574,7 +574,7 @@ FORCE_INLINE void _draw_cooler_status(const char prefix, const bool blink) { } else #endif - lcd_put_u8str(i16tostr3left(t2 + 0.5)); + lcd_put_u8str(i16tostr3left(t2)); if (prefix >= 0) { lcd_put_wchar(LCD_STR_DEGREE[0]); diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index ddc33c4923..31cdc4ac30 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -434,10 +434,10 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *p uint8_t pic_hot_bits; #if HAS_HEATED_BED const bool isBed = heater_id < 0; - const celsius_t t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), + const celsius_t t1 = (isBed ? thermalManager.wholeDegBed() : thermalManager.wholeDegHotend(heater_id)), t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); #else - const celsius_t t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); + const celsius_t t1 = thermalManager.wholeDegHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); #endif #if HOTENDS < 2 @@ -803,7 +803,7 @@ void MarlinUI::draw_status_screen() { if (!PanelDetected) return; lcd.setCursor((LCD_WIDTH - 14) / 2, row + 1); lcd.write(LCD_STR_THERMOMETER[0]); lcd_put_u8str_P(PSTR(" E")); lcd.write('1' + extruder); lcd.write(' '); - lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(LCD_STR_DEGREE[0]); lcd.write('/'); + lcd.print(i16tostr3rj(thermalManager.wholeDegHotend(extruder))); lcd.write(LCD_STR_DEGREE[0]); lcd.write('/'); lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(LCD_STR_DEGREE[0]); lcd.print_line(); } diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index dc60c1bff3..f298e7be8b 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -324,7 +324,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop lcd_put_wchar(LCD_PIXEL_WIDTH - 11 * (MENU_FONT_WIDTH), row_y2, 'E'); lcd_put_wchar((char)('1' + extruder)); lcd_put_wchar(' '); - lcd_put_u8str(i16tostr3rj(thermalManager.degHotend(extruder))); + lcd_put_u8str(i16tostr3rj(thermalManager.wholeDegHotend(extruder))); lcd_put_wchar('/'); if (get_blink() || !thermalManager.heater_idle[extruder].timed_out) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index e2bffb7fe0..81e89f7cf5 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -213,7 +213,7 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co const uint8_t tx = STATUS_HOTEND_TEXT_X(heater_id); - const celsius_t temp = thermalManager.degHotend(heater_id), + const celsius_t temp = thermalManager.wholeDegHotend(heater_id), target = thermalManager.degTargetHotend(heater_id); #if DISABLED(STATUS_HOTEND_ANIM) @@ -310,7 +310,7 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co const uint8_t tx = STATUS_BED_TEXT_X; - const celsius_t temp = thermalManager.degBed(), + const celsius_t temp = thermalManager.wholeDegBed(), target = thermalManager.degTargetBed(); #if ENABLED(STATUS_HEAT_PERCENT) || DISABLED(STATUS_BED_ANIM) @@ -380,14 +380,14 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co _draw_centered_temp(thermalManager.degTargetChamber(), STATUS_CHAMBER_TEXT_X, 7); #endif if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(thermalManager.degChamber(), STATUS_CHAMBER_TEXT_X, 28); + _draw_centered_temp(thermalManager.wholeDegChamber(), STATUS_CHAMBER_TEXT_X, 28); } #endif #if DO_DRAW_COOLER FORCE_INLINE void _draw_cooler_status() { if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(thermalManager.degCooler(), STATUS_COOLER_TEXT_X, 28); + _draw_centered_temp(thermalManager.wholeDegCooler(), STATUS_COOLER_TEXT_X, 28); } #endif diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index b8257d32ff..2f8b5f67e2 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -721,14 +721,14 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { const duration_t elapsed = print_job_timer.duration(); duration_t remaining = TERN0(USE_M73_REMAINING_TIME, ui.get_remaining_time()); const uint16_t feedrate_perc = feedrate_percentage; - const celsius_t extruder_1_temp = thermalManager.degHotend(0), + const celsius_t extruder_1_temp = thermalManager.wholeDegHotend(0), extruder_1_target = thermalManager.degTargetHotend(0); #if HAS_MULTI_HOTEND - const celsius_t extruder_2_temp = thermalManager.degHotend(1), + const celsius_t extruder_2_temp = thermalManager.wholeDegHotend(1), extruder_2_target = thermalManager.degTargetHotend(1); #endif #if HAS_HEATED_BED - const celsius_t bed_temp = thermalManager.degBed(), + const celsius_t bed_temp = thermalManager.wholeDegBed(), bed_target = thermalManager.degTargetBed(); #endif diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index b86e7cbe60..cb7fb2728e 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1583,7 +1583,7 @@ void _draw_xyz_position(const bool force) { void update_variable() { #if HAS_HOTEND static celsius_t _hotendtemp = 0, _hotendtarget = 0; - const celsius_t hc = thermalManager.degHotend(0), + const celsius_t hc = thermalManager.wholeDegHotend(0), ht = thermalManager.degTargetHotend(0); const bool _new_hotend_temp = _hotendtemp != hc, _new_hotend_target = _hotendtarget != ht; @@ -1592,7 +1592,7 @@ void update_variable() { #endif #if HAS_HEATED_BED static celsius_t _bedtemp = 0, _bedtarget = 0; - const celsius_t bc = thermalManager.degBed(), + const celsius_t bc = thermalManager.wholeDegBed(), bt = thermalManager.degTargetBed(); const bool _new_bed_temp = _bedtemp != bc, _new_bed_target = _bedtarget != bt; @@ -1880,7 +1880,7 @@ void Draw_Status_Area(const bool with_update) { #if HAS_HOTEND DWIN_ICON_Show(ICON, ICON_HotendTemp, 10, 383); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 384, thermalManager.degHotend(0)); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 384, thermalManager.wholeDegHotend(0)); DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.degTargetHotend(0)); @@ -1891,7 +1891,7 @@ void Draw_Status_Area(const bool with_update) { #if HAS_HEATED_BED DWIN_ICON_Show(ICON, ICON_BedTemp, 10, 416); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 417, thermalManager.degBed()); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 417, thermalManager.wholeDegBed()); DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.degTargetBed()); #endif @@ -2709,7 +2709,7 @@ void HMI_AxisMove() { case 4: // Extruder // window tips #ifdef PREVENT_COLD_EXTRUSION - if (thermalManager.degHotend(0) < EXTRUDE_MINTEMP) { + if (thermalManager.wholeDegHotend(0) < (EXTRUDE_MINTEMP)) { HMI_flag.ETempTooLow_flag = true; Popup_Window_ETempTooLow(); DWIN_UpdateLCD(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index c4056f392a..b4ebc97db3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -486,7 +486,7 @@ void lv_draw_dialog(uint8_t type) { void filament_sprayer_temp() { char buf[20] = {0}; - sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.wholeDegHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, uiCfg.extruderIndex < 1 ? extrude_menu.ext1 : extrude_menu.ext2); strcat_P(public_buf_l, PSTR(": ")); @@ -522,7 +522,7 @@ void filament_dialog_handle() { } if (uiCfg.filament_load_heat_flg) { - const celsius_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + const celsius_t diff = thermalManager.wholeDegHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; if (abs(diff) < 2 || diff > 0) { uiCfg.filament_load_heat_flg = false; lv_clear_dialog(); @@ -538,7 +538,7 @@ void filament_dialog_handle() { } if (uiCfg.filament_unload_heat_flg) { - const celsius_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + const celsius_t diff = thermalManager.wholeDegHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; if (abs(diff) < 2 || diff > 0) { uiCfg.filament_unload_heat_flg = false; lv_clear_dialog(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 43ed214199..77ec61c4b7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -195,7 +195,7 @@ void disp_ext_speed() { void disp_hotend_temp() { char buf[20] = {0}; - sprintf(buf, extrude_menu.temp_value, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, extrude_menu.temp_value, thermalManager.wholeDegHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, extrude_menu.temper_text); strcat(public_buf_l, buf); lv_label_set_text(tempText, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index a3313285df..e3cfde3011 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -50,8 +50,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_FILAMNT_IN: uiCfg.filament_load_heat_flg = true; - if (abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1 - || gCfgItems.filament_limit_temp <= thermalManager.degHotend(uiCfg.extruderIndex)) { + if (abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.wholeDegHotend(uiCfg.extruderIndex)) <= 1 + || gCfgItems.filament_limit_temp <= thermalManager.wholeDegHotend(uiCfg.extruderIndex)) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } @@ -67,8 +67,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_FILAMNT_OUT: uiCfg.filament_unload_heat_flg = true; if (thermalManager.degTargetHotend(uiCfg.extruderIndex) - && (abs((int)(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1 - || thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temp) + && (abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.wholeDegHotend(uiCfg.extruderIndex)) <= 1 + || thermalManager.wholeDegHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temp) ) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); @@ -154,7 +154,7 @@ void disp_filament_temp() { public_buf_l[0] = '\0'; strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.wholeDegHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 0395ccde52..5fcfec1534 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -216,12 +216,12 @@ void disp_desire_temp() { if (uiCfg.curTempType == 0) { strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.wholeDegHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); } else { #if HAS_HEATED_BED strcat(public_buf_l, preheat_menu.hotbed); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degBed(), (int)thermalManager.degTargetBed()); + sprintf(buf, preheat_menu.value_state, thermalManager.wholeDegBed(), thermalManager.degTargetBed()); #endif } strcat_P(public_buf_l, PSTR(": ")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index e35027a654..f752d605ed 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -219,18 +219,18 @@ void lv_draw_printing() { } void disp_ext_temp() { - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); + sprintf(public_buf_l, printing_menu.temp1, thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); + sprintf(public_buf_l, printing_menu.temp1, thermalManager.wholeDegHotend(1), thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2, public_buf_l); #endif } void disp_bed_temp() { #if HAS_HEATED_BED - sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.degBed(), (int)thermalManager.degTargetBed()); + sprintf(public_buf_l, printing_menu.bed_temp, thermalManager.wholeDegBed(), thermalManager.degTargetBed()); lv_label_set_text(labelBed, public_buf_l); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 8340e2ae87..26cd55d7f5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -104,14 +104,14 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.degHotend(0)); + sprintf_P(buf, PSTR("e1:%d"), thermalManager.wholeDegHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND - sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.degHotend(1)); + sprintf_P(buf, PSTR("e2:%d"), thermalManager.wholeDegHotend(1)); lv_label_set_text(e2, buf); #endif #if HAS_HEATED_BED - sprintf_P(buf, PSTR("bed:%d"), (int)thermalManager.degBed()); + sprintf_P(buf, PSTR("bed:%d"), thermalManager.wholeDegBed()); lv_label_set_text(bed, buf); #endif } @@ -138,20 +138,20 @@ void lv_draw_ready_print() { e1 = lv_label_create_empty(scr); lv_obj_set_pos(e1, 20, 20); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(0)); + sprintf_P(buf, PSTR("e1: %d"), thermalManager.wholeDegHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND e2 = lv_label_create_empty(scr); lv_obj_set_pos(e2, 20, 45); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(1)); + sprintf_P(buf, PSTR("e1: %d"), thermalManager.wholeDegHotend(1)); lv_label_set_text(e2, buf); #endif #if HAS_HEATED_BED bed = lv_label_create_empty(scr); lv_obj_set_pos(bed, 20, 95); - sprintf_P(buf, PSTR("bed: %d"), (int)thermalManager.degBed()); + sprintf_P(buf, PSTR("bed: %d"), thermalManager.wholeDegBed()); lv_label_set_text(bed, buf); #endif @@ -219,7 +219,7 @@ void lv_draw_ready_print() { itoa(thermalManager.degHotend(0), buf, 10); lv_label_set_text(labelExt1, buf); lv_obj_align(labelExt1, buttonExt1, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); - sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetHotend(0)); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1Target, buf); lv_obj_align(labelExt1Target, buttonExt1, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); @@ -227,7 +227,7 @@ void lv_draw_ready_print() { itoa(thermalManager.degHotend(1), buf, 10); lv_label_set_text(labelExt2, buf); lv_obj_align(labelExt2, buttonExt2, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); - sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetHotend(1)); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2Target, buf); lv_obj_align(labelExt2Target, buttonExt2, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); #endif @@ -236,7 +236,7 @@ void lv_draw_ready_print() { itoa(thermalManager.degBed(), buf, 10); lv_label_set_text(labelBed, buf); lv_obj_align(labelBed, buttonBedstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); - sprintf_P(buf, PSTR("-> %d"), (int)thermalManager.degTargetBed()); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetBed()); lv_label_set_text(labelBedTarget, buf); lv_obj_align(labelBedTarget, buttonBedstate, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); #endif @@ -257,15 +257,15 @@ void lv_draw_ready_print() { void lv_temp_refr() { #if HAS_HEATED_BED - sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.degBed(), (int)thermalManager.degTargetBed()); + sprintf(public_buf_l, printing_menu.bed_temp, thermalManager.wholeDegBed(), thermalManager.degTargetBed()); lv_label_set_text(labelBed, public_buf_l); #endif - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); + sprintf(public_buf_l, printing_menu.temp1, thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); + sprintf(public_buf_l, printing_menu.temp1, thermalManager.wholeDegHotend(1), thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2, public_buf_l); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 1162f7a228..4dd092e64b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -885,7 +885,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { char *outBuf = (char *)tempBuf; char tbuf[34]; - sprintf_P(tbuf, PSTR("%d /%d"), (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); + sprintf_P(tbuf, PSTR("%d /%d"), thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0)); const int tlen = strlen(tbuf); @@ -895,7 +895,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcpy_P(outBuf, PSTR(" B:")); outBuf += 3; #if HAS_HEATED_BED - sprintf_P(outBuf, PSTR("%d /%d"), (int)thermalManager.degBed(), (int)thermalManager.degTargetBed()); + sprintf_P(outBuf, PSTR("%d /%d"), thermalManager.wholeDegBed(), thermalManager.degTargetBed()); #else strcpy_P(outBuf, PSTR("0 /0")); #endif @@ -908,7 +908,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcat_P(outBuf, PSTR(" T1:")); outBuf += 4; #if HAS_MULTI_HOTEND - sprintf_P(outBuf, PSTR("%d /%d"), (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); + sprintf_P(outBuf, PSTR("%d /%d"), thermalManager.wholeDegHotend(1), thermalManager.degTargetHotend(1)); #else strcat_P(outBuf, PSTR("0 /0")); #endif @@ -918,15 +918,15 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } else { sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), - thermalManager.degHotend(0), thermalManager.degTargetHotend(0), + thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0), #if HAS_HEATED_BED - thermalManager.degBed(), thermalManager.degTargetBed(), + thermalManager.wholeDegBed(), thermalManager.degTargetBed(), #else 0, 0, #endif - thermalManager.degHotend(0), thermalManager.degTargetHotend(0), + thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0), #if HAS_MULTI_HOTEND - thermalManager.degHotend(1), thermalManager.degTargetHotend(1) + thermalManager.wholeDegHotend(1), thermalManager.degTargetHotend(1) #else 0, 0 #endif diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index b6a8923a39..c82ea76457 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -172,9 +172,9 @@ void process_lcd_eb_command(const char *command) { sprintf_P(message_buffer, PSTR("{T0:%03i/%03i}{T1:000/000}{TP:%03i/%03i}{TQ:%03i}{TT:%s}"), - int(thermalManager.degHotend(0)), thermalManager.degTargetHotend(0), + thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0), #if HAS_HEATED_BED - int(thermalManager.degBed()), thermalManager.degTargetBed(), + thermalManager.wholeDegBed(), thermalManager.degTargetBed(), #else 0, 0, #endif @@ -303,9 +303,9 @@ void process_lcd_s_command(const char *command) { // temperature information char message_buffer[MAX_CURLY_COMMAND]; sprintf_P(message_buffer, PSTR("{T0:%03i/%03i}{T1:000/000}{TP:%03i/%03i}"), - int(thermalManager.degHotend(0)), thermalManager.degTargetHotend(0), + thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0), #if HAS_HEATED_BED - int(thermalManager.degBed()), thermalManager.degTargetBed() + thermalManager.wholeDegBed(), thermalManager.degTargetBed() #else 0, 0 #endif diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 23cf26a8ca..accca50d1e 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -918,7 +918,7 @@ namespace ExtUI { thermalManager.updatePID(); } - void startPIDTune(const_float_t temp, extruder_t tool) { + void startPIDTune(const celsius_t temp, extruder_t tool) { thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true); } #endif @@ -935,7 +935,7 @@ namespace ExtUI { thermalManager.updatePID(); } - void startBedPIDTune(const_float_t temp) { + void startBedPIDTune(const celsius_t temp) { thermalManager.PID_autotune(temp, H_BED, 4, true); } #endif diff --git a/Marlin/src/lcd/tft/ui_1024x600.cpp b/Marlin/src/lcd/tft/ui_1024x600.cpp index e04d589858..7a093ea65d 100644 --- a/Marlin/src/lcd/tft/ui_1024x600.cpp +++ b/Marlin/src/lcd/tft/ui_1024x600.cpp @@ -117,18 +117,18 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { celsius_t currentTemperature, targetTemperature; if (Heater >= 0) { // HotEnd - currentTemperature = thermalManager.degHotend(Heater); + currentTemperature = thermalManager.wholeDegHotend(Heater); targetTemperature = thermalManager.degTargetHotend(Heater); } #if HAS_HEATED_BED else if (Heater == H_BED) { - currentTemperature = thermalManager.degBed(); + currentTemperature = thermalManager.wholeDegBed(); targetTemperature = thermalManager.degTargetBed(); } #endif #if HAS_TEMP_CHAMBER else if (Heater == H_CHAMBER) { - currentTemperature = thermalManager.degChamber(); + currentTemperature = thermalManager.wholeDegChamber(); #if HAS_HEATED_CHAMBER targetTemperature = thermalManager.degTargetChamber(); #else @@ -138,7 +138,7 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { #endif #if HAS_TEMP_COOLER else if (Heater == H_COOLER) { - currentTemperature = thermalManager.degCooler(); + currentTemperature = thermalManager.wholeDegCooler(); targetTemperature = TERN(HAS_COOLER, thermalManager.degTargetCooler(), ABSOLUTE_ZERO); } #endif @@ -451,7 +451,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.add('E'); tft_string.add((char)('1' + extruder)); tft_string.add(' '); - tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); + tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder))); tft_string.add(LCD_STR_DEGREE); tft_string.add(" / "); tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 5563d3069b..68457baa1c 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -117,18 +117,18 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { celsius_t currentTemperature, targetTemperature; if (Heater >= 0) { // HotEnd - currentTemperature = thermalManager.degHotend(Heater); + currentTemperature = thermalManager.wholeDegHotend(Heater); targetTemperature = thermalManager.degTargetHotend(Heater); } #if HAS_HEATED_BED else if (Heater == H_BED) { - currentTemperature = thermalManager.degBed(); + currentTemperature = thermalManager.wholeDegBed(); targetTemperature = thermalManager.degTargetBed(); } #endif #if HAS_TEMP_CHAMBER else if (Heater == H_CHAMBER) { - currentTemperature = thermalManager.degChamber(); + currentTemperature = thermalManager.wholeDegChamber(); #if HAS_HEATED_CHAMBER targetTemperature = thermalManager.degTargetChamber(); #else @@ -138,7 +138,7 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { #endif #if HAS_TEMP_COOLER else if (Heater == H_COOLER) { - currentTemperature = thermalManager.degCooler(); + currentTemperature = thermalManager.wholeDegCooler(); targetTemperature = TERN(HAS_COOLER, thermalManager.degTargetCooler(), ABSOLUTE_ZERO); } #endif @@ -438,7 +438,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.add('E'); tft_string.add((char)('1' + extruder)); tft_string.add(' '); - tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); + tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder))); tft_string.add(LCD_STR_DEGREE); tft_string.add(" / "); tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 4d5a0b4fda..3150aff058 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -117,18 +117,18 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { celsius_t currentTemperature, targetTemperature; if (Heater >= 0) { // HotEnd - currentTemperature = thermalManager.degHotend(Heater); + currentTemperature = thermalManager.wholeDegHotend(Heater); targetTemperature = thermalManager.degTargetHotend(Heater); } #if HAS_HEATED_BED else if (Heater == H_BED) { - currentTemperature = thermalManager.degBed(); + currentTemperature = thermalManager.wholeDegBed(); targetTemperature = thermalManager.degTargetBed(); } #endif #if HAS_TEMP_CHAMBER else if (Heater == H_CHAMBER) { - currentTemperature = thermalManager.degChamber(); + currentTemperature = thermalManager.wholeDegChamber(); #if HAS_HEATED_CHAMBER targetTemperature = thermalManager.degTargetChamber(); #else @@ -138,7 +138,7 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { #endif #if HAS_TEMP_COOLER else if (Heater == H_COOLER) { - currentTemperature = thermalManager.degCooler(); + currentTemperature = thermalManager.wholeDegCooler(); targetTemperature = TERN(HAS_COOLER, thermalManager.degTargetCooler(), ABSOLUTE_ZERO); } #endif @@ -438,7 +438,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.add('E'); tft_string.add((char)('1' + extruder)); tft_string.add(' '); - tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); + tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder))); tft_string.add(LCD_STR_DEGREE); tft_string.add(" / "); tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 910db87f55..be991c1d52 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -383,8 +383,8 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { DEBUG_EOL(); - TERN_(WAIT_FOR_NOZZLE_HEAT, if (hotend_temp > thermalManager.degHotend(0) + (TEMP_WINDOW)) thermalManager.wait_for_hotend(0)); - TERN_(WAIT_FOR_BED_HEAT, if (bed_temp > thermalManager.degBed() + (TEMP_BED_WINDOW)) thermalManager.wait_for_bed_heating()); + TERN_(WAIT_FOR_NOZZLE_HEAT, if (hotend_temp > thermalManager.wholeDegHotend(0) + (TEMP_WINDOW)) thermalManager.wait_for_hotend(0)); + TERN_(WAIT_FOR_BED_HEAT, if (bed_temp > thermalManager.wholeDegBed() + (TEMP_BED_WINDOW)) thermalManager.wait_for_bed_heating()); } #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1ad0303abd..3c8d55c630 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -499,7 +499,7 @@ volatile bool Temperature::raw_temps_ready = false; * Needs sufficient heater power to make some overshoot at target * temperature to succeed. */ - void Temperature::PID_autotune(const_float_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { + void Temperature::PID_autotune(const celsius_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { float current_temp = 0.0; int cycles = 0; bool heating = true; @@ -3815,10 +3815,10 @@ void Temperature::isr() { #define MIN_DELTA_SLOPE_TIME_PROBE 600 #endif - bool Temperature::wait_for_probe(const_float_t target_temp, bool no_wait_for_cooling/*=true*/) { + bool Temperature::wait_for_probe(const celsius_t target_temp, bool no_wait_for_cooling/*=true*/) { - const bool wants_to_cool = isProbeAboveTemp(target_temp); - const bool will_wait = !(wants_to_cool && no_wait_for_cooling); + const bool wants_to_cool = isProbeAboveTemp(target_temp), + will_wait = !(wants_to_cool && no_wait_for_cooling); if (will_wait) SERIAL_ECHOLNPAIR("Waiting for probe to ", (wants_to_cool ? PSTR("cool down") : PSTR("heat up")), " to ", target_temp, " degrees."); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 318cdaf075..a7d41b36f9 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -358,12 +358,8 @@ class Temperature { static bool allow_cold_extrude; static celsius_t extrude_min_temp; static inline bool tooCold(const celsius_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } - static inline bool tooColdToExtrude(const uint8_t E_NAME) { - return tooCold(degHotend(HOTEND_INDEX)); - } - static inline bool targetTooColdToExtrude(const uint8_t E_NAME) { - return tooCold(degTargetHotend(HOTEND_INDEX)); - } + static inline bool tooColdToExtrude(const uint8_t E_NAME) { return tooCold(wholeDegHotend(HOTEND_INDEX)); } + static inline bool targetTooColdToExtrude(const uint8_t E_NAME) { return tooCold(degTargetHotend(HOTEND_INDEX)); } #else static inline bool tooColdToExtrude(const uint8_t) { return false; } static inline bool targetTooColdToExtrude(const uint8_t) { return false; } @@ -635,6 +631,10 @@ class Temperature { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].celsius); } + static inline celsius_t wholeDegHotend(const uint8_t E_NAME) { + return TERN0(HAS_HOTEND, static_cast(temp_hotend[HOTEND_INDEX].celsius + 0.5f)); + } + #if ENABLED(SHOW_TEMP_ADC_VALUES) static inline int16_t rawHotendTemp(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].raw); @@ -687,11 +687,11 @@ class Temperature { #endif static inline bool still_heating(const uint8_t e) { - return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; + return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(wholeDegHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; } - static inline bool degHotendNear(const uint8_t e, const_float_t temp) { - return ABS(degHotend(e) - temp) < (TEMP_HYSTERESIS); + static inline bool degHotendNear(const uint8_t e, const celsius_t temp) { + return ABS(wholeDegHotend(e) - temp) < (TEMP_HYSTERESIS); } #endif // HAS_HOTEND @@ -702,6 +702,7 @@ class Temperature { static inline int16_t rawBedTemp() { return temp_bed.raw; } #endif static inline celsius_t degBed() { return temp_bed.celsius; } + static inline celsius_t wholeDegBed() { return static_cast(degBed() + 0.5f); } static inline celsius_t degTargetBed() { return temp_bed.target; } static inline bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } static inline bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } @@ -726,8 +727,8 @@ class Temperature { static void wait_for_bed_heating(); - static inline bool degBedNear(const_float_t temp) { - return ABS(degBed() - temp) < (TEMP_BED_HYSTERESIS); + static inline bool degBedNear(const celsius_t temp) { + return ABS(wholeDegBed() - temp) < (TEMP_BED_HYSTERESIS); } #endif // HAS_HEATED_BED @@ -737,9 +738,10 @@ class Temperature { static inline int16_t rawProbeTemp() { return temp_probe.raw; } #endif static inline celsius_t degProbe() { return temp_probe.celsius; } - static inline bool isProbeBelowTemp(const_float_t target_temp) { return temp_probe.celsius < target_temp; } - static inline bool isProbeAboveTemp(const_float_t target_temp) { return temp_probe.celsius > target_temp; } - static bool wait_for_probe(const_float_t target_temp, bool no_wait_for_cooling=true); + static inline celsius_t wholeDegProbe() { return static_cast(degProbe() + 0.5f); } + static inline bool isProbeBelowTemp(const celsius_t target_temp) { return wholeDegProbe() < target_temp; } + static inline bool isProbeAboveTemp(const celsius_t target_temp) { return wholeDegProbe() > target_temp; } + static bool wait_for_probe(const celsius_t target_temp, bool no_wait_for_cooling=true); #endif #if WATCH_PROBE @@ -753,6 +755,7 @@ class Temperature { static inline int16_t rawChamberTemp() { return temp_chamber.raw; } #endif static inline celsius_t degChamber() { return temp_chamber.celsius; } + static inline celsius_t wholeDegChamber() { return static_cast(degChamber() + 0.5f); } #if HAS_HEATED_CHAMBER static inline celsius_t degTargetChamber() { return temp_chamber.target; } static inline bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } @@ -779,6 +782,7 @@ class Temperature { static inline int16_t rawCoolerTemp() { return temp_cooler.raw; } #endif static inline celsius_t degCooler() { return temp_cooler.celsius; } + static inline celsius_t wholeDegCooler() { return static_cast(temp_cooler.celsius + 0.5f); } #if HAS_COOLER static inline celsius_t degTargetCooler() { return temp_cooler.target; } static inline bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } @@ -827,7 +831,7 @@ class Temperature { static bool pid_debug_flag; #endif - static void PID_autotune(const_float_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); + static void PID_autotune(const celsius_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); #if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) static bool adaptive_fan_slowing; From 1570005683663973ae2869c5526b8eef73df9203 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 23 Apr 2021 22:29:15 -0300 Subject: [PATCH 1334/1370] Fix Celsius precision, current temp accessors (#21678) --- Marlin/src/module/temperature.cpp | 14 +++++++------- Marlin/src/module/temperature.h | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 3c8d55c630..8e2b2d6b91 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -500,7 +500,7 @@ volatile bool Temperature::raw_temps_ready = false; * temperature to succeed. */ void Temperature::PID_autotune(const celsius_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { - float current_temp = 0.0; + celsius_float_t current_temp = 0.0; int cycles = 0; bool heating = true; @@ -1668,7 +1668,7 @@ void Temperature::manage_heater() { SERIAL_EOL(); } - celsius_t Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { + celsius_float_t Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { //#if (MOTHERBOARD == BOARD_RAMPS_14_EFB) // static uint32_t clocks_total = 0; // static uint32_t calls = 0; @@ -1717,7 +1717,7 @@ void Temperature::manage_heater() { #if HAS_HOTEND // Derived from RepRap FiveD extruder::getTemperature() // For hot end temperature measurement. - celsius_t Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { + celsius_float_t Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { if (e > HOTENDS - DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)) { SERIAL_ERROR_START(); SERIAL_ECHO(e); @@ -1826,7 +1826,7 @@ void Temperature::manage_heater() { #if HAS_HEATED_BED // For bed temperature measurement. - celsius_t Temperature::analog_to_celsius_bed(const int raw) { + celsius_float_t Temperature::analog_to_celsius_bed(const int raw) { #if TEMP_SENSOR_BED_IS_CUSTOM return user_thermistor_to_deg_c(CTI_BED, raw); #elif TEMP_SENSOR_BED_IS_THERMISTOR @@ -1844,7 +1844,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_CHAMBER // For chamber temperature measurement. - celsius_t Temperature::analog_to_celsius_chamber(const int raw) { + celsius_float_t Temperature::analog_to_celsius_chamber(const int raw) { #if TEMP_SENSOR_CHAMBER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_CHAMBER, raw); #elif TEMP_SENSOR_CHAMBER_IS_THERMISTOR @@ -1862,7 +1862,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_COOLER // For cooler temperature measurement. - celsius_t Temperature::analog_to_celsius_cooler(const int raw) { + celsius_float_t Temperature::analog_to_celsius_cooler(const int raw) { #if TEMP_SENSOR_COOLER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_COOLER, raw); #elif TEMP_SENSOR_COOLER_IS_THERMISTOR @@ -1880,7 +1880,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_PROBE // For probe temperature measurement. - celsius_t Temperature::analog_to_celsius_probe(const int raw) { + celsius_float_t Temperature::analog_to_celsius_probe(const int raw) { #if TEMP_SENSOR_PROBE_IS_CUSTOM return user_thermistor_to_deg_c(CTI_PROBE, raw); #elif TEMP_SENSOR_PROBE_IS_THERMISTOR diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index a7d41b36f9..b7d52e8a08 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -179,7 +179,7 @@ enum ADCSensorState : char { typedef struct TempInfo { uint16_t acc; int16_t raw; - celsius_t celsius; + celsius_float_t celsius; inline void reset() { acc = 0; } inline void sample(const uint16_t s) { acc += s; } inline void update() { raw = acc; } @@ -501,7 +501,7 @@ class Temperature { static user_thermistor_t user_thermistor[USER_THERMISTORS]; static void log_user_thermistor(const uint8_t t_index, const bool eprom=false); static void reset_user_thermistors(); - static celsius_t user_thermistor_to_deg_c(const uint8_t t_index, const int raw); + static celsius_float_t user_thermistor_to_deg_c(const uint8_t t_index, const int raw); static inline bool set_pull_up_res(int8_t t_index, float value) { //if (!WITHIN(t_index, 0, USER_THERMISTORS - 1)) return false; if (!WITHIN(value, 1, 1000000)) return false; @@ -529,19 +529,19 @@ class Temperature { #endif #if HAS_HOTEND - static celsius_t analog_to_celsius_hotend(const int raw, const uint8_t e); + static celsius_float_t analog_to_celsius_hotend(const int raw, const uint8_t e); #endif #if HAS_HEATED_BED - static celsius_t analog_to_celsius_bed(const int raw); + static celsius_float_t analog_to_celsius_bed(const int raw); #endif #if HAS_TEMP_PROBE - static celsius_t analog_to_celsius_probe(const int raw); + static celsius_float_t analog_to_celsius_probe(const int raw); #endif #if HAS_TEMP_CHAMBER - static celsius_t analog_to_celsius_chamber(const int raw); + static celsius_float_t analog_to_celsius_chamber(const int raw); #endif #if HAS_TEMP_COOLER - static celsius_t analog_to_celsius_cooler(const int raw); + static celsius_float_t analog_to_celsius_cooler(const int raw); #endif #if HAS_FAN @@ -627,7 +627,7 @@ class Temperature { //inline so that there is no performance decrease. //deg=degreeCelsius - static inline celsius_t degHotend(const uint8_t E_NAME) { + static inline celsius_float_t degHotend(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].celsius); } @@ -701,7 +701,7 @@ class Temperature { #if ENABLED(SHOW_TEMP_ADC_VALUES) static inline int16_t rawBedTemp() { return temp_bed.raw; } #endif - static inline celsius_t degBed() { return temp_bed.celsius; } + static inline celsius_float_t degBed() { return temp_bed.celsius; } static inline celsius_t wholeDegBed() { return static_cast(degBed() + 0.5f); } static inline celsius_t degTargetBed() { return temp_bed.target; } static inline bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } @@ -737,7 +737,7 @@ class Temperature { #if ENABLED(SHOW_TEMP_ADC_VALUES) static inline int16_t rawProbeTemp() { return temp_probe.raw; } #endif - static inline celsius_t degProbe() { return temp_probe.celsius; } + static inline celsius_float_t degProbe() { return temp_probe.celsius; } static inline celsius_t wholeDegProbe() { return static_cast(degProbe() + 0.5f); } static inline bool isProbeBelowTemp(const celsius_t target_temp) { return wholeDegProbe() < target_temp; } static inline bool isProbeAboveTemp(const celsius_t target_temp) { return wholeDegProbe() > target_temp; } @@ -754,7 +754,7 @@ class Temperature { #if ENABLED(SHOW_TEMP_ADC_VALUES) static inline int16_t rawChamberTemp() { return temp_chamber.raw; } #endif - static inline celsius_t degChamber() { return temp_chamber.celsius; } + static inline celsius_float_t degChamber() { return temp_chamber.celsius; } static inline celsius_t wholeDegChamber() { return static_cast(degChamber() + 0.5f); } #if HAS_HEATED_CHAMBER static inline celsius_t degTargetChamber() { return temp_chamber.target; } @@ -781,7 +781,7 @@ class Temperature { #if ENABLED(SHOW_TEMP_ADC_VALUES) static inline int16_t rawCoolerTemp() { return temp_cooler.raw; } #endif - static inline celsius_t degCooler() { return temp_cooler.celsius; } + static inline celsius_float_t degCooler() { return temp_cooler.celsius; } static inline celsius_t wholeDegCooler() { return static_cast(temp_cooler.celsius + 0.5f); } #if HAS_COOLER static inline celsius_t degTargetCooler() { return temp_cooler.target; } From 011a3445004b880de9eb185bb031878f3a45cf69 Mon Sep 17 00:00:00 2001 From: Jim Hyslop Date: Sat, 24 Apr 2021 01:08:46 -0400 Subject: [PATCH 1335/1370] Don't display service prompt unless needed (#21654) --- Marlin/src/module/printcounter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 2728b8d5a9..4c5f1fc782 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -319,6 +319,7 @@ void PrintCounter::reset() { } bool PrintCounter::needsService(const int index) { + if (!loaded) loadStats(); switch (index) { #if SERVICE_INTERVAL_1 > 0 case 1: return data.nextService1 == 0; From cf5ea1ccdc47d68455185d71e045f96d58decfdb Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 24 Apr 2021 17:11:11 +1200 Subject: [PATCH 1336/1370] Fix MP_SCARA compile (#21686) --- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 7ae1d8dccd..78a6f2c821 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -921,7 +921,7 @@ #define NORMAL_AXIS Z_AXIS #endif -#if EITHER(MORGAN_SCARA, AXEL_TPARA) +#if ANY(MORGAN_SCARA, MP_SCARA, AXEL_TPARA) #define IS_SCARA 1 #define IS_KINEMATIC 1 #elif ENABLED(DELTA) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 58d52733e8..a8e3b161eb 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1251,7 +1251,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Allow only one kinematic type to be defined */ -#if MANY(DELTA, MORGAN_SCARA, AXEL_TPARA, COREXY, COREXZ, COREYZ, COREYX, COREZX, COREZY, MARKFORGED_XY) +#if MANY(DELTA, MORGAN_SCARA, MP_SCARA, AXEL_TPARA, COREXY, COREXZ, COREYZ, COREYX, COREZX, COREZY, MARKFORGED_XY) #error "Please enable only one of DELTA, MORGAN_SCARA, AXEL_TPARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." #endif From 02b6c0e88112613225ef953720b8fcc7708145f8 Mon Sep 17 00:00:00 2001 From: unknownlamer <72777654+unknownlamer@users.noreply.github.com> Date: Sat, 24 Apr 2021 01:59:31 -0400 Subject: [PATCH 1337/1370] MCP4451 Digipot Support for Azteeg X5 GT (#21680) --- Marlin/src/feature/digipot/digipot_mcp4451.cpp | 3 +++ Marlin/src/inc/SanityCheck.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index 1b4cf43923..ba5ecdad05 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -40,6 +40,9 @@ #elif MB(AZTEEG_X5_MINI, AZTEEG_X5_MINI_WIFI) #define DIGIPOT_I2C_FACTOR 113.5f #define DIGIPOT_I2C_MAX_CURRENT 2.0f +#elif MB(AZTEEG_X5_GT) + #define DIGIPOT_I2C_FACTOR 51.0f + #define DIGIPOT_I2C_MAX_CURRENT 3.0f #else #define DIGIPOT_I2C_FACTOR 106.7f #define DIGIPOT_I2C_MAX_CURRENT 2.5f diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index a8e3b161eb..5a9d6e6040 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2846,7 +2846,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if HAS_MOTOR_CURRENT_I2C #if BOTH(DIGIPOT_MCP4018, DIGIPOT_MCP4451) #error "Enable only one of DIGIPOT_MCP4018 or DIGIPOT_MCP4451." - #elif !MB(MKS_SBASE) \ +#elif !MB(MKS_SBASE, AZTEEG_X5_GT, AZTEEG_X5_MINI, AZTEEG_X5_MINI_WIFI) \ && (!defined(DIGIPOTS_I2C_SDA_X) || !defined(DIGIPOTS_I2C_SDA_Y) || !defined(DIGIPOTS_I2C_SDA_Z) || !defined(DIGIPOTS_I2C_SDA_E0) || !defined(DIGIPOTS_I2C_SDA_E1)) #error "DIGIPOT_MCP4018/4451 requires DIGIPOTS_I2C_SDA_* pins to be defined." #endif From 3ae05572582272780f78a8e5083c2268a1cb88da Mon Sep 17 00:00:00 2001 From: Sebastiaan Dammann Date: Sat, 24 Apr 2021 08:01:17 +0200 Subject: [PATCH 1338/1370] Prevent extrusion on M600 un-park (#21670) Fixes #21669 --- Marlin/src/feature/pause.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 6552eaa42c..867502712c 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -602,7 +602,7 @@ void resume_print(const_float_t slow_load_length/*=0*/, const_float_t fast_load_ if (!axes_should_home()) { // Move XY back to saved position - destination.set(resume_position.x, resume_position.y, current_position.z); + destination.set(resume_position.x, resume_position.y, current_position.z, current_position.e); prepare_internal_move_to_destination(NOZZLE_PARK_XY_FEEDRATE); // Move Z back to saved position From b9715c5a03b657fdb16640dc26a0ef176a961925 Mon Sep 17 00:00:00 2001 From: vyacheslav-shubin Date: Sat, 24 Apr 2021 09:16:14 +0300 Subject: [PATCH 1339/1370] ExtUI::onPostprocessSettings (#21683) --- Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 4 ++++ Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp | 4 ++++ Marlin/src/lcd/extui/dgus_lcd.cpp | 4 ++++ Marlin/src/lcd/extui/example.cpp | 4 ++++ Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp | 4 ++++ Marlin/src/lcd/extui/malyan_lcd.cpp | 1 + Marlin/src/lcd/extui/nextion_lcd.cpp | 4 ++++ Marlin/src/lcd/extui/ui_api.h | 1 + Marlin/src/module/settings.cpp | 2 ++ 9 files changed, 28 insertions(+) diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index 10c791cbc5..2ec5104310 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -88,6 +88,10 @@ namespace ExtUI { // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } + void onPostprocessSettings() { + // Called after loading or resetting stored settings + } + void onConfigurationStoreWritten(bool success) { // Called after the entire EEPROM has been written, // whether successful or not. diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp index a98da07959..fb66d1f68e 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp @@ -79,6 +79,10 @@ namespace ExtUI { // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } + void onPostprocessSettings() { + // Called after loading or resetting stored settings + } + void onConfigurationStoreWritten(bool success) { // Called after the entire EEPROM has been written, // whether successful or not. diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index 73542090c5..4776ceb154 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -98,6 +98,10 @@ namespace ExtUI { // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } + void onPostprocessSettings() { + // Called after loading or resetting stored settings + } + void onConfigurationStoreWritten(bool success) { // Called after the entire EEPROM has been written, // whether successful or not. diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp index 38986fba73..8f00d26fd8 100644 --- a/Marlin/src/lcd/extui/example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -84,6 +84,10 @@ namespace ExtUI { // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } + void onPostprocessSettings() { + // Called after loading or resetting stored settings + } + void onConfigurationStoreWritten(bool success) { // Called after the entire EEPROM has been written, // whether successful or not. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index 8193ec24d4..b3a9e42766 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -113,6 +113,10 @@ namespace ExtUI { InterfaceSettingsScreen::loadSettings(buff); } + void onPostprocessSettings() { + // Called after loading or resetting stored settings + } + void onConfigurationStoreWritten(bool success) { #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE if (success && InterfaceSettingsScreen::backupEEPROM()) { diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index c82ea76457..b4e2e328e4 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -519,6 +519,7 @@ namespace ExtUI { void onFactoryReset() {} void onStoreSettings(char*) {} void onLoadSettings(const char*) {} + void onPostprocessSettings() {} void onConfigurationStoreWritten(bool) {} void onConfigurationStoreRead(bool) {} diff --git a/Marlin/src/lcd/extui/nextion_lcd.cpp b/Marlin/src/lcd/extui/nextion_lcd.cpp index fa45f4ef51..2ec8eeb30e 100644 --- a/Marlin/src/lcd/extui/nextion_lcd.cpp +++ b/Marlin/src/lcd/extui/nextion_lcd.cpp @@ -75,6 +75,10 @@ namespace ExtUI { // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } + void onPostprocessSettings() { + // Called after loading or resetting stored settings + } + void onConfigurationStoreWritten(bool success) { // Called after the entire EEPROM has been written, // whether successful or not. diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index ba633741f7..04395bec4e 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -389,6 +389,7 @@ namespace ExtUI { void onFactoryReset(); void onStoreSettings(char *); void onLoadSettings(const char *); + void onPostprocessSettings(); void onConfigurationStoreWritten(bool success); void onConfigurationStoreRead(bool success); #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 4273c4b062..13c01954a0 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -533,6 +533,8 @@ void MarlinSettings::postprocess() { TERN_(CASELIGHT_USES_BRIGHTNESS, caselight.update_brightness()); + TERN_(EXTENSIBLE_UI, ExtUI::onPostprocessSettings()); + // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm // and init stepper.count[], planner.position[] with current_position planner.refresh_positioning(); From 309d82b6aab028a3ff22c6cf55444be5cdc891d1 Mon Sep 17 00:00:00 2001 From: Ryan Finnie Date: Fri, 23 Apr 2021 23:26:17 -0700 Subject: [PATCH 1340/1370] Clean up / improve generate_version script (#21674) --- buildroot/bin/generate_version | 58 ++++++++++++++-------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/buildroot/bin/generate_version b/buildroot/bin/generate_version index b88e3de918..70a108b1fe 100755 --- a/buildroot/bin/generate_version +++ b/buildroot/bin/generate_version @@ -4,47 +4,35 @@ # # Make a Version.h file to accompany CUSTOM_VERSION_FILE # +# Authors: jbrazio, thinkyhead, InsanityAutomation, rfinnie +# -DIR=${1:-"Marlin"} +set -e -# MRCC3=$( git merge-base HEAD upstream/bugfix-2.0.x 2>/dev/null ) -# MRCC2=$( git merge-base HEAD upstream/bugfix-1.1.x 2>/dev/null ) -# MRCC1=$( git merge-base HEAD upstream/1.1.x 2>/dev/null ) +DIR="${1:-Marlin}" +READ_FILE="${READ_FILE:-${DIR}/Version.h}" +WRITE_FILE="${WRITE_FILE:-${READ_FILE}}" -# BASE='?' -# if [[ -n $MRCC3 && $MRCC3 != $MRCC2 ]]; then -# BASE=bugfix-2.0.x -# elif [[ -n $MRCC2 ]]; then -# BASE=bugfix-1.1.x -# elif [[ -n $MRCC1 ]]; then -# BASE=1.1.x -# fi +BRANCH="$(git -C "${DIR}" symbolic-ref -q --short HEAD 2>/dev/null || true)" +VERSION="$(git -C "${DIR}" describe --tags --first-parent 2>/dev/null || true)" -BUILDATE=$(date '+%s') -DISTDATE=$(date '+%Y-%m-%d %H:%M') - -BRANCH=$(git -C "${DIR}" symbolic-ref -q --short HEAD) -VERSION=$(git -C "${DIR}" describe --tags --first-parent 2>/dev/null) - -[ -z "${BRANCH}" ] && BRANCH=$(echo "${TRAVIS_BRANCH}") -[ -z "${VERSION}" ] && VERSION=$(git -C "${DIR}" describe --tags --first-parent --always 2>/dev/null) - -SHORT_BUILD_VERSION=$(echo "${BRANCH}") -DETAILED_BUILD_VERSION=$(echo "${BRANCH}-${VERSION}") +STRING_DISTRIBUTION_DATE="${STRING_DISTRIBUTION_DATE:-$(date '+%Y-%m-%d %H:%M')}" +SHORT_BUILD_VERSION="${SHORT_BUILD_VERSION:-${BRANCH}}" +DETAILED_BUILD_VERSION="${DETAILED_BUILD_VERSION:-${BRANCH}-${VERSION}}" # Gets some misc options from their defaults -DEFAULT_MACHINE_UUID=$(awk -F'"' \ - '/#define DEFAULT_MACHINE_UUID/{ print $2 }' < "${DIR}/Version.h") -MACHINE_NAME=$(awk -F'"' \ - '/#define MACHINE_NAME/{ print $2 }' < "${DIR}/Version.h") -PROTOCOL_VERSION=$(awk -F'"' \ - '/#define PROTOCOL_VERSION/{ print $2 }' < "${DIR}/Version.h") -SOURCE_CODE_URL=$(awk -F'"' \ - '/#define SOURCE_CODE_URL/{ print $2 }' < "${DIR}/Version.h") -WEBSITE_URL=$(awk -F'"' \ - '/#define WEBSITE_URL/{ print $2 }' < "${DIR}/Version.h") +DEFAULT_MACHINE_UUID="${DEFAULT_MACHINE_UUID:-$(awk -F'"' \ + '/#define DEFAULT_MACHINE_UUID/{ print $2 }' < "${READ_FILE}")}" +MACHINE_NAME="${MACHINE_NAME:-$(awk -F'"' \ + '/#define MACHINE_NAME/{ print $2 }' < "${READ_FILE}")}" +PROTOCOL_VERSION="${PROTOCOL_VERSION:-$(awk -F'"' \ + '/#define PROTOCOL_VERSION/{ print $2 }' < "${READ_FILE}")}" +SOURCE_CODE_URL="${SOURCE_CODE_URL:-$(awk -F'"' \ + '/#define SOURCE_CODE_URL/{ print $2 }' < "${READ_FILE}")}" +WEBSITE_URL="${WEBSITE_URL:-$(awk -F'"' \ + '/#define WEBSITE_URL/{ print $2 }' < "${READ_FILE}")}" -cat > "${DIR}/Version.h" < "${WRITE_FILE}" < "${DIR}/Version.h" < Date: Sat, 24 Apr 2021 01:29:30 -0500 Subject: [PATCH 1341/1370] Move last bootscreen delay to end of setup (#21665) --- Marlin/src/MarlinCore.cpp | 11 ++++++++++- Marlin/src/core/utility.cpp | 12 ++++++++++++ Marlin/src/core/utility.h | 8 ++++++-- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 ++ Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 5 ++++- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 16 ++++++++++------ Marlin/src/lcd/marlinui.h | 1 + Marlin/src/lcd/tft/ui_320x240.cpp | 7 ++++++- Marlin/src/lcd/tft/ui_480x320.cpp | 7 ++++++- 9 files changed, 57 insertions(+), 12 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 668f977b03..6cb51bc577 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1214,8 +1214,9 @@ void setup() { DWIN_UpdateLCD(); // Show bootscreen (first image) #else SETUP_RUN(ui.init()); - #if HAS_WIRED_LCD && ENABLED(SHOW_BOOTSCREEN) + #if BOTH(HAS_WIRED_LCD, SHOW_BOOTSCREEN) SETUP_RUN(ui.show_bootscreen()); + const millis_t bootscreen_ms = millis(); #endif SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.) #endif @@ -1501,6 +1502,14 @@ void setup() { SETUP_RUN(tft_lvgl_init()); #endif + #if BOTH(HAS_WIRED_LCD, SHOW_BOOTSCREEN) + const millis_t elapsed = millis() - bootscreen_ms; + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("elapsed=", elapsed); + #endif + SETUP_RUN(ui.bootscreen_completion(elapsed)); + #endif + #if ENABLED(PASSWORD_ON_STARTUP) SETUP_RUN(password.lock_machine()); // Will not proceed until correct password provided #endif diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index 3d7897f95a..385a572029 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -35,6 +35,18 @@ void safe_delay(millis_t ms) { thermalManager.manage_heater(); // This keeps us safe if too many small safe_delay() calls are made } +#if ENABLED(MARLIN_DEV_MODE) + void early_safe_delay(millis_t ms) { + while (ms > 50) { + ms -= 50; + delay(50); + watchdog_refresh(); + } + delay(ms); + watchdog_refresh(); + } +#endif + // A delay to provide brittle hosts time to receive bytes #if ENABLED(SERIAL_OVERRUN_PROTECTION) diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index aaa241d460..0e1c109be1 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -25,8 +25,12 @@ #include "../core/types.h" #include "../core/millis_t.h" -// Delay that ensures heaters and watchdog are kept alive -void safe_delay(millis_t ms); +void safe_delay(millis_t ms); // Delay ensuring that temperatures are updated and the watchdog is kept alive. +#if ENABLED(MARLIN_DEV_MODE) + void early_safe_delay(millis_t ms); // Delay ensuring that the watchdog is kept alive. Can be used before the Temperature ISR starts. +#else + inline void early_safe_delay(millis_t ms) { safe_delay(ms); } +#endif #if ENABLED(SERIAL_OVERRUN_PROTECTION) void serial_delay(const millis_t ms); diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index e91213b5b7..75ff1f52c2 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -486,7 +486,9 @@ void MarlinUI::clear_lcd() { lcd.clear(); } CENTER_OR_SCROLL(STRING_SPLASH_LINE3, 1500); #endif } + } + void MarlinUI::bootscreen_completion(const millis_t) { lcd.clear(); safe_delay(100); set_custom_characters(CHARSET_INFO); diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 31cdc4ac30..edb17b69c0 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -397,7 +397,10 @@ static void center_text_P(PGM_P pstart, uint8_t y) { center_text_P(PSTR(MARLIN_WEBSITE_URL), 4); picBits = ICON_LOGO; lcd.print_screen(); - safe_delay(1500); + } + + void MarlinUI::bootscreen_completion(const millis_t sofar) { + if ((BOOTSCREEN_TIMEOUT) > sofar) safe_delay((BOOTSCREEN_TIMEOUT) - sofar); } #endif // SHOW_BOOTSCREEN diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index f298e7be8b..1fdc291642 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -160,20 +160,21 @@ bool MarlinUI::detected() { return true; } #endif u8g.firstPage(); do { draw_custom_bootscreen(f); } while (u8g.nextPage()); - if (frame_time) safe_delay(frame_time); + if (frame_time) early_safe_delay(frame_time); } #ifndef CUSTOM_BOOTSCREEN_TIMEOUT #define CUSTOM_BOOTSCREEN_TIMEOUT 2500 #endif #if CUSTOM_BOOTSCREEN_TIMEOUT - safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); + early_safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); #endif } #endif // SHOW_CUSTOM_BOOTSCREEN // Two-part needed to display all info constexpr bool two_part = ((LCD_PIXEL_HEIGHT) - (START_BMPHEIGHT)) < ((MENU_FONT_ASCENT) * 2); + constexpr uint8_t bootscreen_pages = 1 + two_part; // Draw the static Marlin bootscreen from a u8g loop // or the animated boot screen within its own u8g loop @@ -225,17 +226,16 @@ bool MarlinUI::detected() { return true; } constexpr millis_t frame_time = MARLIN_BOOTSCREEN_FRAME_TIME; LOOP_L_N(f, COUNT(marlin_bootscreen_animation)) { draw_bootscreen_bmp((uint8_t*)pgm_read_ptr(&marlin_bootscreen_animation[f])); - if (frame_time) safe_delay(frame_time); + if (frame_time) early_safe_delay(frame_time); } #endif } // Show the Marlin bootscreen, with the u8g loop and delays void MarlinUI::show_marlin_bootscreen() { - constexpr uint8_t pages = two_part ? 2 : 1; - for (uint8_t q = pages; q--;) { + for (uint8_t q = bootscreen_pages; q--;) { draw_marlin_bootscreen(q == 0); - safe_delay((BOOTSCREEN_TIMEOUT) / pages); + if (q) early_safe_delay((BOOTSCREEN_TIMEOUT) / bootscreen_pages); } } @@ -244,6 +244,10 @@ bool MarlinUI::detected() { return true; } show_marlin_bootscreen(); } + void MarlinUI::bootscreen_completion(const millis_t sofar) { + if ((BOOTSCREEN_TIMEOUT) / bootscreen_pages > sofar) safe_delay((BOOTSCREEN_TIMEOUT) / bootscreen_pages - sofar); + } + #endif // SHOW_BOOTSCREEN #if ENABLED(LIGHTWEIGHT_UI) diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 24fedb039e..8cbb9ebd19 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -337,6 +337,7 @@ public: static void draw_marlin_bootscreen(const bool line2=false); static void show_marlin_bootscreen(); static void show_bootscreen(); + static void bootscreen_completion(const millis_t sofar); #endif #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 68457baa1c..8e7365932b 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -60,6 +60,7 @@ void MarlinUI::tft_idle() { } #if ENABLED(SHOW_BOOTSCREEN) + void MarlinUI::show_bootscreen() { tft.queue.reset(); @@ -81,9 +82,13 @@ void MarlinUI::tft_idle() { #endif tft.queue.sync(); - safe_delay(BOOTSCREEN_TIMEOUT); + } + + void MarlinUI::bootscreen_completion(const millis_t sofar) { + if ((BOOTSCREEN_TIMEOUT) > sofar) safe_delay((BOOTSCREEN_TIMEOUT) - sofar); clear_lcd(); } + #endif void MarlinUI::draw_kill_screen() { diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 3150aff058..0d7e01683f 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -60,6 +60,7 @@ void MarlinUI::tft_idle() { } #if ENABLED(SHOW_BOOTSCREEN) + void MarlinUI::show_bootscreen() { tft.queue.reset(); @@ -81,9 +82,13 @@ void MarlinUI::tft_idle() { #endif tft.queue.sync(); - safe_delay(BOOTSCREEN_TIMEOUT); + } + + void MarlinUI::bootscreen_completion(const millis_t sofar) { + if ((BOOTSCREEN_TIMEOUT) > sofar) safe_delay((BOOTSCREEN_TIMEOUT) - sofar); clear_lcd(); } + #endif void MarlinUI::draw_kill_screen() { From 48d5fae514b230e1692eefb791b32608f33ce935 Mon Sep 17 00:00:00 2001 From: Malderin <52313714+Malderin@users.noreply.github.com> Date: Sat, 24 Apr 2021 10:42:44 +0300 Subject: [PATCH 1342/1370] Fix Bed Tramming 5th point (#21646) --- .../src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp index 539c7639dc..c87de7caa0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp @@ -81,7 +81,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { value = level_pos_y4; break; case ID_MANUAL_POS_X5: - value = level_pos_y5; + value = level_pos_x5; break; case ID_MANUAL_POS_Y5: value = level_pos_y5; @@ -128,7 +128,7 @@ void lv_draw_tramming_pos_settings() { else { itoa(gCfgItems.trammingPos[4].x, public_buf_l, 10); itoa(gCfgItems.trammingPos[4].y, buf2, 10); - lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y5, 0, buf2, ID_MANUAL_POS_X5, public_buf_l); + lv_screen_menu_item_2_edit(scr, leveling_menu.position5, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y5, 0, buf2, ID_MANUAL_POS_X5, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_UP, true); } From 27a26fcfeb114df99dda83e6b9c2b49806c5f738 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Sat, 24 Apr 2021 09:52:34 +0200 Subject: [PATCH 1343/1370] Avoid + 0.0f in menu items (#21642) --- Marlin/src/lcd/menu/menu_item.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index d3ec359fb1..bcd93e11f8 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -111,17 +111,17 @@ class TMenuEditItem : MenuEditItemBase { // These items call the Edit Item draw method passing the prepared string. #define __DOFIXfloat PROBE() #define _DOFIX(TYPE,V) TYPE(TERN(IS_PROBE(__DOFIX##TYPE),FIXFLOAT(V),(V))) -#define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, V...) \ +#define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, ETC...) \ struct MenuEditItemInfo_##NAME { \ typedef TYPE type_t; \ - static inline float scale(const_float_t value) { return value * (SCALE) + (V+0); } \ - static inline float unscale(const_float_t value) { return value / (SCALE) + (V+0); } \ + static inline float scale(const_float_t value) { return value * (SCALE) ETC; } \ + static inline float unscale(const_float_t value) { return value / (SCALE) ETC; } \ static inline const char* strfunc(const_float_t value) { return STRFUNC(_DOFIX(TYPE,value)); } \ }; \ typedef TMenuEditItem MenuItem_##NAME -// NAME TYPE STRFUNC SCALE +ROUND -DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, 0.5f); // 100% right-justified +// NAME TYPE STRFUNC SCALE ROUND +DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, +0.5f); // 100% right-justified DEFINE_MENU_EDIT_ITEM_TYPE(percent_3 ,uint8_t ,pcttostrpctrj , 1 ); // 100% right-justified DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified From c39c17c1b5c041a1c90004b09b31571dd9f51f6b Mon Sep 17 00:00:00 2001 From: fedetony <45215920+fedetony@users.noreply.github.com> Date: Sat, 24 Apr 2021 09:53:52 +0200 Subject: [PATCH 1344/1370] Soft Reset via Serial or post-kill button click (#21652) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 6 ++++++ Marlin/src/HAL/AVR/HAL.cpp | 9 +++++++++ Marlin/src/HAL/AVR/HAL.h | 2 +- Marlin/src/HAL/DUE/HAL.cpp | 2 ++ Marlin/src/HAL/DUE/HAL.h | 2 +- Marlin/src/HAL/ESP32/HAL.cpp | 2 ++ Marlin/src/HAL/ESP32/HAL.h | 2 +- Marlin/src/HAL/LINUX/HAL.cpp | 2 ++ Marlin/src/HAL/LINUX/HAL.h | 2 +- Marlin/src/HAL/LPC1768/HAL.cpp | 4 +++- Marlin/src/HAL/LPC1768/HAL.h | 2 +- Marlin/src/HAL/SAMD51/HAL.cpp | 2 ++ Marlin/src/HAL/SAMD51/HAL.h | 2 +- Marlin/src/HAL/STM32/HAL.cpp | 6 ++++-- Marlin/src/HAL/STM32/HAL.h | 2 +- Marlin/src/HAL/STM32F1/HAL.cpp | 4 +++- Marlin/src/HAL/STM32F1/HAL.h | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 2 ++ Marlin/src/HAL/TEENSY31_32/HAL.h | 3 +-- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 2 ++ Marlin/src/HAL/TEENSY35_36/HAL.h | 2 +- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 2 ++ Marlin/src/HAL/TEENSY40_41/HAL.h | 2 ++ Marlin/src/MarlinCore.cpp | 18 ++++++++++-------- Marlin/src/feature/e_parser.h | 20 ++++++++++++++++++++ Marlin/src/gcode/gcode_d.cpp | 7 ++++++- Marlin/src/inc/SanityCheck.h | 9 ++++++++- Marlin/src/lcd/marlinui.h | 2 +- buildroot/tests/LPC1768 | 2 +- 29 files changed, 97 insertions(+), 27 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ac9b49fe4d..d72feab433 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3976,3 +3976,9 @@ * a crash from a remote location. Requires ~400 bytes of SRAM and 5Kb of flash. */ //#define POSTMORTEM_DEBUGGING + +/** + * Software Reset options + */ +//#define SOFT_RESET_VIA_SERIAL // 'KILL' and '^X' commands will soft-reset the controller +//#define SOFT_RESET_ON_KILL // Use a digital button to soft-reset the controller after KILL diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp index cfa9e47f18..708583b262 100644 --- a/Marlin/src/HAL/AVR/HAL.cpp +++ b/Marlin/src/HAL/AVR/HAL.cpp @@ -58,6 +58,15 @@ void HAL_init() { #endif } +void HAL_reboot() { + #if ENABLED(USE_WATCHDOG) + while (1) { /* run out the watchdog */ } + #else + void (*resetFunc)() = 0; // Declare resetFunc() at address 0 + resetFunc(); // Jump to address 0 + #endif +} + #if ENABLED(SDSUPPORT) #include "../../sd/SdFatUtil.h" diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 890798a719..7adf1aad49 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -135,7 +135,7 @@ void HAL_init(); inline void HAL_clear_reset_source() { MCUSR = 0; } inline uint8_t HAL_get_reset_source() { return MCUSR; } -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); #if GCC_VERSION <= 50000 #pragma GCC diagnostic push diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index 249535723f..a3985652e7 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -77,6 +77,8 @@ uint8_t HAL_get_reset_source() { } } +void HAL_reboot() { rstc_start_software_reset(RSTC); } + void _delay_ms(const int delay_ms) { // Todo: port for Due? delay(delay_ms); diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index 501e2f0b06..1bc3bf7410 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -113,7 +113,7 @@ void sei(); // Enable interrupts void HAL_clear_reset_source(); // clear reset reason uint8_t HAL_get_reset_source(); // get reset reason -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); // // ADC diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index 365706c3e2..7818dbdd87 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -141,6 +141,8 @@ void HAL_clear_reset_source() { } uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); } +void HAL_reboot() { ESP.restart(); } + void _delay_ms(int delay_ms) { delay(delay_ms); } // return free memory between end of heap (or end bss) and whatever is current diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 9258f97702..0f92052030 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -101,7 +101,7 @@ void HAL_clear_reset_source(); // reset reason uint8_t HAL_get_reset_source(); -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); void _delay_ms(int delay); diff --git a/Marlin/src/HAL/LINUX/HAL.cpp b/Marlin/src/HAL/LINUX/HAL.cpp index 771f1d2a08..0b679170ef 100644 --- a/Marlin/src/HAL/LINUX/HAL.cpp +++ b/Marlin/src/HAL/LINUX/HAL.cpp @@ -73,4 +73,6 @@ void HAL_pwm_init() { } +void HAL_reboot() { /* Reset the application state and GPIO */ } + #endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index f21e3e2c65..36906bffc8 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -107,7 +107,7 @@ uint16_t HAL_adc_get_result(); inline void HAL_clear_reset_source(void) {} inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); // Reset the application state and GPIO /* ---------------- Delay in cycles */ FORCE_INLINE static void DELAY_CYCLES(uint64_t x) { diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index 442c41afe7..cee9cfc5f7 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -67,7 +67,7 @@ void flashFirmware(const int16_t) { delay(500); // Give OS time to disconnect USB_Connect(false); // USB clear connection delay(1000); // Give OS time to notice - NVIC_SystemReset(); + HAL_reboot(); } void HAL_clear_reset_source(void) { @@ -81,4 +81,6 @@ uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } +void HAL_reboot() { NVIC_SystemReset(); } + #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 07385261da..bcfa6c412f 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -218,4 +218,4 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, void HAL_clear_reset_source(void); uint8_t HAL_get_reset_source(void); -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 39167fc467..5aa23cdaeb 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -436,6 +436,8 @@ uint8_t HAL_get_reset_source() { } #pragma pop_macro("WDT") +void HAL_reboot() { NVIC_SystemReset(); } + extern "C" { void * _sbrk(int incr); diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index 3add6c9b69..85ac5dd00c 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -109,7 +109,7 @@ typedef int8_t pin_t; void HAL_clear_reset_source(); // clear reset reason uint8_t HAL_get_reset_source(); // get reset reason -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); // // ADC diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index c66f061d91..3bb12fd9e0 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -133,6 +133,8 @@ uint8_t HAL_get_reset_source() { ; } +void HAL_reboot() { NVIC_SystemReset(); } + void _delay_ms(const int delay_ms) { delay(delay_ms); } extern "C" { @@ -147,8 +149,8 @@ extern "C" { void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } uint16_t HAL_adc_get_result() { return HAL_adc_result; } -// Reset the system (to initiate a firmware flash) -void flashFirmware(const int16_t) { NVIC_SystemReset(); } +// Reset the system to initiate a firmware flash +void flashFirmware(const int16_t) { HAL_reboot(); } // Maple Compatibility volatile uint32_t systick_uptime_millis = 0; diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index d8e45670e6..469d08e435 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -144,7 +144,7 @@ void HAL_clear_reset_source(); // Reset reason uint8_t HAL_get_reset_source(); -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); void _delay_ms(const int delay); diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 40452b5d70..2efea4f001 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -453,6 +453,8 @@ void analogWrite(pin_t pin, int pwm_val8) { analogWrite(uint8_t(pin), pwm_val8); } -void flashFirmware(const int16_t) { nvic_sys_reset(); } +void HAL_reboot() { nvic_sys_reset(); } + +void flashFirmware(const int16_t) { HAL_reboot(); } #endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index f37b0f2728..af4d27f43e 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -207,7 +207,7 @@ void HAL_clear_reset_source(); // Reset reason uint8_t HAL_get_reset_source(); -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); void _delay_ms(const int delay); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index 67f716c5d3..f08cf799e9 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -78,6 +78,8 @@ uint8_t HAL_get_reset_source() { return 0; } +void HAL_reboot() { _reboot_Teensyduino_(); } + extern "C" { extern char __bss_end; extern char __heap_start; diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index bbfc50a36f..52904465be 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -34,7 +34,6 @@ #include "fastio.h" #include "watchdog.h" - #include #define ST7920_DELAY_1 DELAY_NS(600) @@ -93,7 +92,7 @@ void HAL_clear_reset_source(); // Get the reason for the reset uint8_t HAL_get_reset_source(); -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index 5d808cd19b..046c00b56e 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -86,6 +86,8 @@ uint8_t HAL_get_reset_source() { return 0; } +void HAL_reboot() { _reboot_Teensyduino_(); } + extern "C" { extern char __bss_end; extern char __heap_start; diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 50008d72f6..26c35223bd 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -101,7 +101,7 @@ void HAL_clear_reset_source(); // Reset reason uint8_t HAL_get_reset_source(); -inline void HAL_reboot() {} // reboot the board or restart the bootloader +void HAL_reboot(); FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index 1eab3d837e..a986c293a9 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -120,6 +120,8 @@ uint8_t HAL_get_reset_source() { return 0; } +void HAL_reboot() { _reboot_Teensyduino_(); } + #define __bss_end _ebss extern "C" { diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 701d690382..1d00447fe8 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -121,6 +121,8 @@ void HAL_clear_reset_source(); // Reset reason uint8_t HAL_get_reset_source(); +void HAL_reboot(); + FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } #if GCC_VERSION <= 50000 diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 6cb51bc577..7139d54f25 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -863,20 +863,22 @@ void minkill(const bool steppers_off/*=false*/) { TERN_(HAS_SUICIDE, suicide()); - #if HAS_KILL + #if EITHER(HAS_KILL, SOFT_RESET_ON_KILL) - // Wait for kill to be released - while (kill_state()) watchdog_refresh(); + // Wait for both KILL and ENC to be released + while (TERN0(HAS_KILL, !kill_state()) || TERN0(SOFT_RESET_ON_KILL, !ui.button_pressed())) + watchdog_refresh(); - // Wait for kill to be pressed - while (!kill_state()) watchdog_refresh(); + // Wait for either KILL or ENC press + while (TERN1(HAS_KILL, kill_state()) && TERN1(SOFT_RESET_ON_KILL, ui.button_pressed())) + watchdog_refresh(); - void (*resetFunc)() = 0; // Declare resetFunc() at address 0 - resetFunc(); // Jump to address 0 + // Reboot the board + HAL_reboot(); #else - for (;;) watchdog_refresh(); // Wait for reset + for (;;) watchdog_refresh(); // Wait for RESET button or power-cycle #endif } diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index c12fd14ad1..3723caa35e 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -41,6 +41,8 @@ extern bool wait_for_user, wait_for_heatup; void quickresume_stepper(); #endif +void HAL_reboot(); + class EmergencyParser { public: @@ -62,6 +64,10 @@ public: EP_R, EP_R0, EP_R00, EP_GRBL_RESUME, EP_P, EP_P0, EP_P00, EP_GRBL_PAUSE, #endif + #if ENABLED(SOFT_RESET_VIA_SERIAL) + EP_ctrl, + EP_K, EP_KI, EP_KIL, EP_KILL, + #endif EP_IGNORE // to '\n' }; @@ -89,6 +95,10 @@ public: case 'P': state = EP_P; break; case 'R': state = EP_R; break; #endif + #if ENABLED(SOFT_RESET_VIA_SERIAL) + case '^': state = EP_ctrl; break; + case 'K': state = EP_K; break; + #endif default: state = EP_IGNORE; } break; @@ -121,6 +131,13 @@ public: case EP_P00: state = (c == '0') ? EP_GRBL_PAUSE : EP_IGNORE; break; #endif + #if ENABLED(SOFT_RESET_VIA_SERIAL) + case EP_ctrl: state = (c == 'X') ? EP_KILL : EP_IGNORE; break; + case EP_K: state = (c == 'I') ? EP_KI : EP_IGNORE; break; + case EP_KI: state = (c == 'L') ? EP_KIL : EP_IGNORE; break; + case EP_KIL: state = (c == 'L') ? EP_KILL : EP_IGNORE; break; + #endif + case EP_M: switch (c) { case ' ': break; @@ -189,6 +206,9 @@ public: case EP_GRBL_PAUSE: quickpause_stepper(); break; case EP_GRBL_RESUME: quickresume_stepper(); break; #endif + #if ENABLED(SOFT_RESET_VIA_SERIAL) + case EP_KILL: HAL_reboot(); break; + #endif default: break; } state = EP_RESET; diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index f87cebc886..74277291e5 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -30,6 +30,7 @@ #include "../HAL/shared/eeprom_if.h" #include "../HAL/shared/Delay.h" #include "../sd/cardreader.h" + #include "../MarlinCore.h" // for kill extern void dump_delay_accuracy_check(); @@ -44,12 +45,16 @@ switch (dcode) { case -1: - for (;;); // forever + for (;;) { /* loop forever (watchdog reset) */ } case 0: HAL_reboot(); break; + case 10: + kill(PSTR("D10"), PSTR("KILL TEST"), parser.seen('P')); + break; + case 1: { // Zero or pattern-fill the EEPROM data #if ENABLED(EEPROM_SETTINGS) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5a9d6e6040..2d6633b353 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2208,12 +2208,19 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif /** - * emergency-command parser + * Emergency Command Parser */ #if ENABLED(EMERGENCY_PARSER) && defined(__AVR__) && defined(USBCON) #error "EMERGENCY_PARSER does not work on boards with AT90USB processors (USBCON)." #endif +/** + * Software Reset on Kill option + */ +#if ENABLED(SOFT_RESET_ON_KILL) && !BUTTON_EXISTS(ENC) + #error "An encoder button is required or SOFT_RESET_ON_KILL will reset the printer without notice!" +#endif + /** * I2C bus */ diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 8cbb9ebd19..8befa1d980 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -39,7 +39,7 @@ #include "tft_io/touch_calibration.h" #endif -#if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY) +#if ANY(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY, SOFT_RESET_ON_KILL) #define HAS_ENCODER_ACTION 1 #endif diff --git a/buildroot/tests/LPC1768 b/buildroot/tests/LPC1768 index 152a49852a..6b9f6aaac3 100755 --- a/buildroot/tests/LPC1768 +++ b/buildroot/tests/LPC1768 @@ -45,7 +45,7 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ HOST_KEEPALIVE_FEATURE HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \ - SDSUPPORT SDCARD_SORT_ALPHA AUTO_REPORT_SD_STATUS EMERGENCY_PARSER + SDSUPPORT SDCARD_SORT_ALPHA AUTO_REPORT_SD_STATUS EMERGENCY_PARSER SOFT_RESET_ON_KILL SOFT_RESET_VIA_SERIAL exec_test $1 $2 "Re-ARM with NOZZLE_AS_PROBE and many features." "$3" # clean up From 12ca73947be14cada4bc2b37bd24fc39d36c2ae9 Mon Sep 17 00:00:00 2001 From: Nikolay March Date: Sat, 24 Apr 2021 12:38:00 +0300 Subject: [PATCH 1345/1370] Backlash Compensation for COREnn (#21612) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 3 ++ Marlin/src/feature/backlash.cpp | 47 ++++++++++++++++++++++----- Marlin/src/lcd/menu/menu_backlash.cpp | 11 +++++-- buildroot/tests/teensy35 | 4 +-- 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d72feab433..eb3c7b0df8 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -972,6 +972,9 @@ #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm) #define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction + // Add steps for motor direction changes on CORE kinematics + //#define CORE_BACKLASH + // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments // to reduce print artifacts. (Enabling this is costly in memory and computation!) //#define BACKLASH_SMOOTHING_MM 3 // (mm) diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp index b848214f0c..610cfcb565 100644 --- a/Marlin/src/feature/backlash.cpp +++ b/Marlin/src/feature/backlash.cpp @@ -63,10 +63,24 @@ Backlash backlash; void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block) { static uint8_t last_direction_bits; uint8_t changed_dir = last_direction_bits ^ dm; - // Ignore direction change if no steps are taken in that direction - if (da == 0) CBI(changed_dir, X_AXIS); - if (db == 0) CBI(changed_dir, Y_AXIS); - if (dc == 0) CBI(changed_dir, Z_AXIS); + // Ignore direction change unless steps are taken in that direction + #if DISABLED(CORE_BACKLASH) || ENABLED(MARKFORGED_XY) + if (!da) CBI(changed_dir, X_AXIS); + if (!db) CBI(changed_dir, Y_AXIS); + if (!dc) CBI(changed_dir, Z_AXIS); + #elif CORE_IS_XY + if (!(da + db)) CBI(changed_dir, X_AXIS); + if (!(da - db)) CBI(changed_dir, Y_AXIS); + if (!dc) CBI(changed_dir, Z_AXIS); + #elif CORE_IS_XZ + if (!(da + dc)) CBI(changed_dir, X_AXIS); + if (!(da - dc)) CBI(changed_dir, Z_AXIS); + if (!db) CBI(changed_dir, Y_AXIS); + #elif CORE_IS_YZ + if (!(db + dc)) CBI(changed_dir, Y_AXIS); + if (!(db - dc)) CBI(changed_dir, Z_AXIS); + if (!da) CBI(changed_dir, X_AXIS); + #endif last_direction_bits ^= changed_dir; if (correction == 0) return; @@ -105,18 +119,35 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const // Take up a portion of the residual_error in this segment, but only when // the current segment travels in the same direction as the correction if (reversing == (error_correction < 0)) { - if (segment_proportion == 0) - segment_proportion = _MIN(1.0f, block->millimeters / smoothing_mm); + if (segment_proportion == 0) segment_proportion = _MIN(1.0f, block->millimeters / smoothing_mm); error_correction = CEIL(segment_proportion * error_correction); } else error_correction = 0; // Don't take up any backlash in this segment, as it would subtract steps } #endif - // Making a correction reduces the residual error and adds block steps + + // This correction reduces the residual error and adds block steps if (error_correction) { block->steps[axis] += ABS(error_correction); - residual_error[axis] -= error_correction; + #if ENABLED(CORE_BACKLASH) + switch (axis) { + case CORE_AXIS_1: + //block->steps[CORE_AXIS_2] += influence_distance_mm[axis] * planner.settings.axis_steps_per_mm[CORE_AXIS_2]; + //SERIAL_ECHOLNPAIR("CORE_AXIS_1 dir change. distance=", distance_mm[axis], " r.err=", residual_error[axis], + // " da=", da, " db=", db, " block->steps[axis]=", block->steps[axis], " err_corr=", error_correction); + break; + case CORE_AXIS_2: + //block->steps[CORE_AXIS_1] += influence_distance_mm[axis] * planner.settings.axis_steps_per_mm[CORE_AXIS_1];; + //SERIAL_ECHOLNPAIR("CORE_AXIS_2 dir change. distance=", distance_mm[axis], " r.err=", residual_error[axis], + // " da=", da, " db=", db, " block->steps[axis]=", block->steps[axis], " err_corr=", error_correction); + break; + case NORMAL_AXIS: break; + } + residual_error[axis] = 0; // No residual_error needed for next CORE block, I think... + #else + residual_error[axis] -= error_correction; + #endif } } } diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp index 9d0b970ae1..c1dca025b1 100644 --- a/Marlin/src/lcd/menu/menu_backlash.cpp +++ b/Marlin/src/lcd/menu/menu_backlash.cpp @@ -38,10 +38,15 @@ void menu_backlash() { EDIT_ITEM_FAST(percent, MSG_BACKLASH_CORRECTION, &backlash.correction, all_off, all_on); + #if DISABLED(CORE_BACKLASH) || ENABLED(MARKFORGED_XY) + #define _CAN_CALI AXIS_CAN_CALIBRATE + #else + #define _CAN_CALI(A) true + #endif #define EDIT_BACKLASH_DISTANCE(N) EDIT_ITEM_FAST(float43, MSG_BACKLASH_##N, &backlash.distance_mm[_AXIS(N)], 0.0f, 9.9f); - if (AXIS_CAN_CALIBRATE(A)) EDIT_BACKLASH_DISTANCE(A); - if (AXIS_CAN_CALIBRATE(B)) EDIT_BACKLASH_DISTANCE(B); - if (AXIS_CAN_CALIBRATE(C)) EDIT_BACKLASH_DISTANCE(C); + if (_CAN_CALI(A)) EDIT_BACKLASH_DISTANCE(A); + if (_CAN_CALI(B)) EDIT_BACKLASH_DISTANCE(B); + if (_CAN_CALI(C)) EDIT_BACKLASH_DISTANCE(C); #ifdef BACKLASH_SMOOTHING_MM EDIT_ITEM_FAST(float43, MSG_BACKLASH_SMOOTHING, &backlash.smoothing_mm, 0.0f, 9.9f); diff --git a/buildroot/tests/teensy35 b/buildroot/tests/teensy35 index 36a261a6ae..3352c05525 100755 --- a/buildroot/tests/teensy35 +++ b/buildroot/tests/teensy35 @@ -93,8 +93,8 @@ exec_test $1 $2 "Teensy 3.5/3.6 COREXY" "$3" # restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable COREXZ -exec_test $1 $2 "Teensy 3.5/3.6 COREXZ" "$3" +opt_enable COREXZ BACKLASH_COMPENSATION BACKLASH_GCODE CORE_BACKLASH +exec_test $1 $2 "Teensy 3.5/3.6 COREXZ | BACKLASH" "$3" # # Enable Dual Z with Dual Z endstops From 183062947250fb3c50b47e7dcdaaa70708289850 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 Apr 2021 05:20:55 -0500 Subject: [PATCH 1346/1370] Use temperature accessors --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 4 ++-- Marlin/src/lcd/tft/ui_1024x600.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 2 +- Marlin/src/module/tool_change.cpp | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index cb7fb2728e..534975ffc1 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -2709,7 +2709,7 @@ void HMI_AxisMove() { case 4: // Extruder // window tips #ifdef PREVENT_COLD_EXTRUSION - if (thermalManager.wholeDegHotend(0) < (EXTRUDE_MINTEMP)) { + if (thermalManager.tooColdToExtrude(0)) { HMI_flag.ETempTooLow_flag = true; Popup_Window_ETempTooLow(); DWIN_UpdateLCD(); diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 8df2af1dd0..c6b8568085 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -67,7 +67,7 @@ static void _change_filament_with_preset() { } static void _change_filament_with_custom() { - _change_filament_with_temp(thermalManager.temp_hotend[MenuItemBase::itemIndex].target); + _change_filament_with_temp(thermalManager.degTargetHotend(MenuItemBase::itemIndex)); } // diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 85578ea351..47643cfb57 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -147,7 +147,7 @@ void menu_temperature() { #if HAS_TEMP_HOTEND || HAS_HEATED_BED bool has_heat = false; #if HAS_TEMP_HOTEND - HOTEND_LOOP() if (thermalManager.temp_hotend[HOTEND_INDEX].target) { has_heat = true; break; } + HOTEND_LOOP() if (thermalManager.degTargetHotend(HOTEND_INDEX)) { has_heat = true; break; } #endif #endif @@ -271,7 +271,7 @@ void menu_temperature() { // // Cooldown // - if (TERN0(HAS_HEATED_BED, thermalManager.temp_bed.target)) has_heat = true; + if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed())) has_heat = true; if (has_heat) ACTION_ITEM(MSG_COOLDOWN, lcd_cooldown); #endif diff --git a/Marlin/src/lcd/tft/ui_1024x600.cpp b/Marlin/src/lcd/tft/ui_1024x600.cpp index 7a093ea65d..e4cc116818 100644 --- a/Marlin/src/lcd/tft/ui_1024x600.cpp +++ b/Marlin/src/lcd/tft/ui_1024x600.cpp @@ -644,7 +644,7 @@ static void drawAxisValue(AxisEnum axis) { static void moveAxis(AxisEnum axis, const int8_t direction) { quick_feedback(); - if (axis == E_AXIS && thermalManager.temp_hotend[motionAxisState.e_selection].celsius < EXTRUDE_MINTEMP) { + if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { drawMessage("Too cold"); return; } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 0d7e01683f..e9ea4b0827 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -636,7 +636,7 @@ static void drawAxisValue(AxisEnum axis) { static void moveAxis(AxisEnum axis, const int8_t direction) { quick_feedback(); - if (axis == E_AXIS && thermalManager.temp_hotend[motionAxisState.e_selection].celsius < EXTRUDE_MINTEMP) { + if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { drawMessage("Too cold"); return; } diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 8354b8b86a..2e5e59c0af 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1381,7 +1381,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { // Migrate the temperature to the new hotend #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(thermalManager.temp_hotend[active_extruder].target, migration_extruder); + thermalManager.setTargetHotend(thermalManager.degTargetHotend(active_extruder), migration_extruder); TERN_(AUTOTEMP, planner.autotemp_update()); TERN_(HAS_STATUS_MESSAGE, thermalManager.set_heating_message(0)); thermalManager.wait_for_hotend(active_extruder); From c6b6437761e95fadebe243af88917a150684371a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 Apr 2021 05:28:50 -0500 Subject: [PATCH 1347/1370] Drop Deviot workaround --- .gitignore | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/.gitignore b/.gitignore index f7d49cc1ed..ac2c9b5591 100755 --- a/.gitignore +++ b/.gitignore @@ -122,29 +122,6 @@ tags .gcc-flags.json /lib/ -# Workaround for Deviot+platformio quirks -Marlin/lib -Marlin/platformio.ini -Marlin/*/platformio.ini -Marlin/*/*/platformio.ini -Marlin/*/*/*/platformio.ini -Marlin/*/*/*/*/platformio.ini -Marlin/.travis.yml -Marlin/*/.travis.yml -Marlin/*/*/.travis.yml -Marlin/*/*/*/.travis.yml -Marlin/*/*/*/*/.travis.yml -Marlin/.gitignore -Marlin/*/.gitignore -Marlin/*/*/.gitignore -Marlin/*/*/*/.gitignore -Marlin/*/*/*/*/.gitignore -Marlin/readme.txt -Marlin/*/readme.txt -Marlin/*/*/readme.txt -Marlin/*/*/*/readme.txt -Marlin/*/*/*/*/readme.txt - # Secure Credentials Configuration_Secure.h From 888cabff271b4ab39d7e6cc395aa4a820b4a8233 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Sat, 24 Apr 2021 06:35:02 -0400 Subject: [PATCH 1348/1370] Sanity check MIXING_EXTRUDER + DISTINCT_E_FACTORS (#21689) --- Marlin/src/inc/SanityCheck.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2d6633b353..97f9a6373a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3298,6 +3298,13 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #undef _CLEAN_ASSERT #endif +/** + * Sanity check for MIXING_EXTRUDER & DISTINCT_E_FACTORS these are not compatible + */ +#if ENABLED(MIXING_EXTRUDER) && ENABLED(DISTINCT_E_FACTORS) + #error "MIXING_EXTRUDER can't be used with DISTINCT_E_FACTORS. But you may use SINGLENOZZLE with DISTINCT_E_FACTORS." +#endif + /** * Sanity check for valid stepper driver types */ From e46f81af220ffa7f74380d2995f6c2cfe090b825 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 Apr 2021 15:22:50 -0500 Subject: [PATCH 1349/1370] Add INO to .editorconfig --- .editorconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index a0fa3eff17..b8f6ef7f8e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,10 +4,10 @@ root = true [{*.patch,syntax_test_*}] trim_trailing_whitespace = false -[{*.c,*.cpp,*.h}] +[{*.c,*.cpp,*.h,*.ino}] charset = utf-8 -[{*.c,*.cpp,*.h,Makefile}] +[{*.c,*.cpp,*.h,*.ino,Makefile}] trim_trailing_whitespace = true insert_final_newline = true end_of_line = lf From 6202b2d324b86d4ad789b5aa298ae86677233fa1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 Apr 2021 02:29:20 -0500 Subject: [PATCH 1350/1370] Remove extra platform_packages line --- ini/stm32f1.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini index 81e9f1dcb8..a2954e64cf 100644 --- a/ini/stm32f1.ini +++ b/ini/stm32f1.ini @@ -283,7 +283,6 @@ extra_scripts = ${common_stm32f1.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -platform_packages = tool-stm32duino extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_e3.py build_flags = ${common_stm32f1.build_flags} From 8373bd1b71de84a6d288ae467f7bdade600a45a4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 Apr 2021 15:22:38 -0500 Subject: [PATCH 1351/1370] Use Adafruit LiquidCrystal --- ini/features.ini | 2 +- ini/lpc176x.ini | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ini/features.ini b/ini/features.ini index 3121ef7241..1f4bf98531 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -30,7 +30,7 @@ HAS_L64XX = Arduino-L6470@0.8.0 NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ TEMP_.+_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 -USES_LIQUIDCRYSTAL = bitbucket-fmalpartida/LiquidCrystal@1.5.0 +USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@^1.0.7 USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 HAS_WIRED_LCD = src_filter=+ diff --git a/ini/lpc176x.ini b/ini/lpc176x.ini index 2a59ba7f50..494d7baac8 100644 --- a/ini/lpc176x.ini +++ b/ini/lpc176x.ini @@ -23,7 +23,6 @@ extra_scripts = ${common.extra_scripts} src_filter = ${common.default_src_filter} + + lib_deps = ${common.lib_deps} Servo -custom_marlin.USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@~1.0.7 custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace From 84e8d4c60373c722daed16fd18375b87cac26fa9 Mon Sep 17 00:00:00 2001 From: Miguel Risco-Castillo Date: Sat, 24 Apr 2021 18:50:44 -0500 Subject: [PATCH 1352/1370] E3V2 DWIN Advanced Settings (#21534) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 386 +++++++++++++++++++++++-- Marlin/src/lcd/dwin/e3v2/dwin.h | 27 ++ Marlin/src/lcd/language/language_en.h | 3 + buildroot/tests/STM32F103RET6_creality | 3 +- 4 files changed, 389 insertions(+), 30 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 534975ffc1..891732e641 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -154,18 +154,20 @@ typedef struct { select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0} , select_control{0}, select_axis{0}, select_temp{0}, select_motion{0}, select_tune{0} - , select_PLA{0}, select_ABS{0} + , select_advset{0}, select_PLA{0}, select_ABS{0} , select_speed{0} , select_acc{0} , select_jerk{0} , select_step{0} + , select_item{0} ; uint8_t index_file = MROWS, index_prepare = MROWS, index_control = MROWS, index_leveling = MROWS, - index_tune = MROWS; + index_tune = MROWS, + index_advset = MROWS; bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home @@ -462,12 +464,21 @@ void Erase_Menu_Text(const uint8_t line) { DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); } -void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr) { +void Draw_Menu_Item(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr, bool more=false) { if (label) DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, (char*)label); if (icon) Draw_Menu_Icon(line, icon); + if (more) Draw_More_Icon(line); +} + +void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr, bool more=false) { + Draw_Menu_Item(line, icon, label, more); DWIN_Draw_Line(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); } +void Draw_Chkb_Line(const uint8_t line, const bool mode) { + DWIN_Draw_Checkbox(Color_White, Color_Bg_Black, 225, MBASE(line) - 1, mode); +} + // The "Back" label is always on the first line void Draw_Back_Label() { if (HMI_IsChinese()) @@ -516,7 +527,8 @@ inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valr #define CONTROL_CASE_SAVE (CONTROL_CASE_MOVE + ENABLED(EEPROM_SETTINGS)) #define CONTROL_CASE_LOAD (CONTROL_CASE_SAVE + ENABLED(EEPROM_SETTINGS)) #define CONTROL_CASE_RESET (CONTROL_CASE_LOAD + ENABLED(EEPROM_SETTINGS)) -#define CONTROL_CASE_INFO (CONTROL_CASE_RESET + 1) +#define CONTROL_CASE_ADVSET (CONTROL_CASE_RESET + 1) +#define CONTROL_CASE_INFO (CONTROL_CASE_ADVSET + 1) #define CONTROL_CASE_TOTAL CONTROL_CASE_INFO #define TUNE_CASE_SPEED 1 @@ -539,6 +551,13 @@ inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valr #define PREHEAT_CASE_SAVE (PREHEAT_CASE_FAN + ENABLED(EEPROM_SETTINGS)) #define PREHEAT_CASE_TOTAL PREHEAT_CASE_SAVE +#define ADVSET_CASE_HOMEOFF 1 +#define ADVSET_CASE_PROBEOFF (ADVSET_CASE_HOMEOFF + ENABLED(HAS_ONESTEP_LEVELING)) +#define ADVSET_CASE_HEPID (ADVSET_CASE_PROBEOFF + ENABLED(HAS_HOTEND)) +#define ADVSET_CASE_BEDPID (ADVSET_CASE_HEPID + ENABLED(HAS_HEATED_BED)) +#define ADVSET_CASE_PWRLOSSR (ADVSET_CASE_BEDPID + ENABLED(POWER_LOSS_RECOVERY)) +#define ADVSET_CASE_TOTAL ADVSET_CASE_PWRLOSSR + // // Draw Menus // @@ -770,26 +789,36 @@ void Draw_Control_Menu() { DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(CLINE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_Label(CLINE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); + if (CVISI(CONTROL_CASE_TEMP)) DWIN_Draw_Label(CLINE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); + if (CVISI(CONTROL_CASE_MOVE)) DWIN_Draw_Label(CLINE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_Label(CLINE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_Label(CLINE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_Label(CLINE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + if (CVISI(CONTROL_CASE_SAVE)) DWIN_Draw_Label(CLINE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + if (CVISI(CONTROL_CASE_LOAD)) DWIN_Draw_Label(CLINE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); + if (CVISI(CONTROL_CASE_RESET)) DWIN_Draw_Label(CLINE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); #endif #else - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > - DWIN_Frame_AreaCopy(1, 84, 89, 128, 99, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > + if (CVISI(CONTROL_CASE_TEMP)) DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > + if (CVISI(CONTROL_CASE_MOVE)) DWIN_Frame_AreaCopy(1, 84, 89, 128, 99, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX , CLINE(CONTROL_CASE_SAVE)); // "Store Configuration" - DWIN_Frame_AreaCopy(1, 26, 104, 57, 114, LBLX , CLINE(CONTROL_CASE_LOAD)); // "Read" - DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 34, CLINE(CONTROL_CASE_LOAD)); // "Configuration" - DWIN_Frame_AreaCopy(1, 59, 104, 93, 114, LBLX , CLINE(CONTROL_CASE_RESET)); // "Reset" - DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 37, CLINE(CONTROL_CASE_RESET)); // "Configuration" + if (CVISI(CONTROL_CASE_SAVE)) DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX , CLINE(CONTROL_CASE_SAVE)); // "Store Configuration" + if (CVISI(CONTROL_CASE_LOAD)) { + DWIN_Frame_AreaCopy(1, 26, 104, 57, 114, LBLX , CLINE(CONTROL_CASE_LOAD)); // "Read" + DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 34, CLINE(CONTROL_CASE_LOAD)); // "Configuration" + } + if (CVISI(CONTROL_CASE_RESET)) { + DWIN_Frame_AreaCopy(1, 59, 104, 93, 114, LBLX , CLINE(CONTROL_CASE_RESET)); // "Reset" + DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 37, CLINE(CONTROL_CASE_RESET)); // "Configuration" + } #endif #endif } + if (CVISI(CONTROL_CASE_ADVSET)) { + DWIN_Draw_Label(CLINE(CONTROL_CASE_ADVSET), GET_TEXT_F(MSG_ADVANCED_SETTINGS)); // Advanced Settings + Draw_More_Icon(CSCROL(CONTROL_CASE_ADVSET)); + Draw_Menu_Line(CSCROL(CONTROL_CASE_ADVSET), ICON_AdvSet); + } + if (CVISI(CONTROL_CASE_INFO)) Item_Control_Info(CLINE(CONTROL_CASE_INFO)); if (select_control.now && CVISI(select_control.now)) @@ -1785,7 +1814,7 @@ void Draw_SDItem(const uint16_t item, int16_t row=-1) { #if ENABLED(SCROLL_LONG_FILENAMES) - void Draw_SDItem_Shifted(int8_t &shift) { + void Draw_SDItem_Shifted(uint8_t &shift) { // Limit to the number of chars past the cutoff const size_t len = strlen(shift_name); NOMORE(shift, _MAX(len - MENU_CHAR_LIMIT, 0U)); @@ -2060,7 +2089,7 @@ void HMI_SelectFile() { if (ELAPSED(ms, shift_ms)) { const bool was_reset = shift_amt < 0; shift_ms = ms + 375UL + was_reset * 250UL; // ms per character - int8_t shift_new = shift_amt + 1; // Try to shift by... + uint8_t shift_new = shift_amt + 1; // Try to shift by... Draw_SDItem_Shifted(shift_new); // Draw the item if (!was_reset && shift_new == 0) // Was it limited to 0? shift_ms = 0; // No scrolling needed @@ -2331,6 +2360,60 @@ void Draw_Move_Menu() { LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MoveX + i); } +void Draw_AdvSet_Menu() { + Clear_Main_Window(); + + #if ADVSET_CASE_TOTAL >= 6 + const int16_t scroll = MROWS - index_advset; // Scrolled-up lines + #define ASCROL(L) (scroll + (L)) + #else + #define ASCROL(L) (L) + #endif + + #define AVISI(L) WITHIN(ASCROL(L), 0, MROWS) + + Draw_Title(GET_TEXT_F(MSG_ADVANCED_SETTINGS)); + + if (AVISI(0)) Draw_Back_First(select_advset.now == 0); + if (AVISI(ADVSET_CASE_HOMEOFF)) Draw_Menu_Line(ASCROL(ADVSET_CASE_HOMEOFF), ICON_HomeOff, GET_TEXT(MSG_SET_HOME_OFFSETS),true); // Home Offset > + #if HAS_ONESTEP_LEVELING + if (AVISI(ADVSET_CASE_PROBEOFF)) Draw_Menu_Line(ASCROL(ADVSET_CASE_PROBEOFF), ICON_ProbeOff, GET_TEXT(MSG_ZPROBE_OFFSETS),true); // Probe Offset > + #endif + if (AVISI(ADVSET_CASE_HEPID)) Draw_Menu_Line(ASCROL(ADVSET_CASE_HEPID), ICON_PIDNozzle, "Hotend PID", false); // Nozzle PID + if (AVISI(ADVSET_CASE_BEDPID)) Draw_Menu_Line(ASCROL(ADVSET_CASE_BEDPID), ICON_PIDbed, "Bed PID", false); // Bed PID + if (AVISI(ADVSET_CASE_PWRLOSSR)) { + Draw_Menu_Line(ASCROL(ADVSET_CASE_PWRLOSSR), ICON_Motion, "Power-loss recovery", false); // Power-loss recovery + Draw_Chkb_Line(ASCROL(ADVSET_CASE_PWRLOSSR), recovery.enabled); + } + if (select_advset.now) Draw_Menu_Cursor(ASCROL(select_advset.now)); +} + +void Draw_HomeOff_Menu() { + Clear_Main_Window(); + Draw_Title(GET_TEXT_F(MSG_SET_HOME_OFFSETS)); // Home Offsets + Draw_Back_First(select_item.now == 0); + Draw_Menu_Line(1, ICON_HomeOffX, GET_TEXT(MSG_HOME_OFFSET_X)); // Home X Offset + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Home_OffX_scaled); + Draw_Menu_Line(2, ICON_HomeOffY, GET_TEXT(MSG_HOME_OFFSET_Y)); // Home Y Offset + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Home_OffY_scaled); + Draw_Menu_Line(3, ICON_HomeOffZ, GET_TEXT(MSG_HOME_OFFSET_Z)); // Home Y Offset + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Home_OffZ_scaled); + if (select_item.now) Draw_Menu_Cursor(select_item.now); +} + +#if HAS_ONESTEP_LEVELING + void Draw_ProbeOff_Menu() { + Clear_Main_Window(); + Draw_Title(GET_TEXT_F(MSG_ZPROBE_OFFSETS)); // Probe Offsets + Draw_Back_First(select_item.now == 0); + Draw_Menu_Line(1, ICON_ProbeOffX, GET_TEXT(MSG_ZPROBE_XOFFSET)); // Probe X Offset + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Probe_OffX_scaled); + Draw_Menu_Line(2, ICON_ProbeOffY, GET_TEXT(MSG_ZPROBE_YOFFSET)); // Probe Y Offset + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Probe_OffY_scaled); + if (select_item.now) Draw_Menu_Cursor(select_item.now); + } +#endif + #include "../../../libs/buzzer.h" void HMI_AudioFeedback(const bool success=true) { @@ -2566,14 +2649,20 @@ void HMI_Control() { if (select_control.inc(1 + CONTROL_CASE_TOTAL)) { if (select_control.now > MROWS && select_control.now > index_control) { index_control = select_control.now; + + // Scroll up and draw a blank bottom line Scroll_Menu(DWIN_SCROLL_UP); - Draw_Menu_Icon(MROWS, ICON_Temperature + index_control - 1); - Draw_More_Icon(CONTROL_CASE_TEMP + MROWS - index_control); // Temperature > - Draw_More_Icon(CONTROL_CASE_MOVE + MROWS - index_control); // Motion > - if (index_control > MROWS) { - Draw_More_Icon(CONTROL_CASE_INFO + MROWS - index_control); // Info > - Item_Control_Info(MBASE(CONTROL_CASE_INFO - 1)); + + switch (index_control) { // Last menu items + case CONTROL_CASE_ADVSET: // Advance Settings > + Draw_Menu_Item(MROWS, ICON_AdvSet, GET_TEXT(MSG_ADVANCED_SETTINGS), true); + break; + case CONTROL_CASE_INFO: // Info > + Draw_Menu_Item(MROWS, ICON_Info, GET_TEXT(MSG_INFO_SCREEN), true); + break; + default: break; } + } else { Move_Highlight(1, select_control.now + MROWS - index_control); @@ -2585,12 +2674,17 @@ void HMI_Control() { if (select_control.now < index_control - MROWS) { index_control--; Scroll_Menu(DWIN_SCROLL_DOWN); - if (index_control == MROWS) + switch (index_control) { // First menu items + case MROWS : Draw_Back_First(); - else - Draw_Menu_Line(0, ICON_Temperature + select_control.now - 1); - Draw_More_Icon(0 + MROWS - index_control + 1); // Temperature > - Draw_More_Icon(1 + MROWS - index_control + 1); // Motion > + break; + case MROWS + 1: // Temperature > + Draw_Menu_Line(0, ICON_Temperature, GET_TEXT(MSG_TEMPERATURE), true); + break; + case MROWS + 2: // Move > + Draw_Menu_Line(0, ICON_Motion, GET_TEXT(MSG_MOTION), true); + default: break; + } } else { Move_Highlight(-1, select_control.now + MROWS - index_control); @@ -2628,6 +2722,11 @@ void HMI_Control() { HMI_AudioFeedback(); break; #endif + case CONTROL_CASE_ADVSET: // Advance Settings + checkkey = AdvSet; + select_advset.reset(); + Draw_AdvSet_Menu(); + break; case CONTROL_CASE_INFO: // Info checkkey = Info; Draw_Info_Menu(); @@ -3227,6 +3326,217 @@ void HMI_Motion() { DWIN_UpdateLCD(); } +/* Advanced Settings */ +void HMI_AdvSet() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_advset.inc(1 + ADVSET_CASE_TOTAL)) { + if (select_advset.now > MROWS && select_advset.now > index_advset) { + index_advset = select_advset.now; + + // Scroll up and draw a blank bottom line + Scroll_Menu(DWIN_SCROLL_UP); + + //switch (index_advset) { // Redraw last menu items + // default: break; + //} + + } + else { + Move_Highlight(1, select_advset.now + MROWS - index_advset); + } + } + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_advset.dec()) { + if (select_advset.now < index_advset - MROWS) { + index_advset--; + Scroll_Menu(DWIN_SCROLL_DOWN); + + //switch (index_advset) { // Redraw first menu items + // default: break; + //} + } + else { + Move_Highlight(-1, select_advset.now + MROWS - index_advset); + } + } + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_advset.now) { + case 0: // Back + checkkey = Control; + select_control.set(CONTROL_CASE_ADVSET); + index_control = CONTROL_CASE_ADVSET; + Draw_Control_Menu(); + break; + + #if HAS_HOME_OFFSET + case ADVSET_CASE_HOMEOFF: // Home Offsets + checkkey = HomeOff; + select_item.reset(); + HMI_ValueStruct.Home_OffX_scaled = home_offset[X_AXIS] * 10; + HMI_ValueStruct.Home_OffY_scaled = home_offset[Y_AXIS] * 10; + HMI_ValueStruct.Home_OffZ_scaled = home_offset[Z_AXIS] * 10; + Draw_HomeOff_Menu(); + break; + #endif + + #if HAS_ONESTEP_LEVELING + case ADVSET_CASE_PROBEOFF: // Probe Offsets + checkkey = ProbeOff; + select_item.reset(); + HMI_ValueStruct.Probe_OffX_scaled = probe.offset.x * 10; + HMI_ValueStruct.Probe_OffY_scaled = probe.offset.y * 10; + Draw_ProbeOff_Menu(); + break; + #endif + + #if HAS_HOTEND + case ADVSET_CASE_HEPID: // Nozzle PID Autotune + thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0); + thermalManager.PID_autotune(ui.material_preset[0].hotend_temp, H_E0, 10, true); + break; + #endif + + #if HAS_HEATED_BED + case ADVSET_CASE_BEDPID: // Bed PID Autotune + thermalManager.setTargetBed(ui.material_preset[0].bed_temp); + thermalManager.PID_autotune(ui.material_preset[0].bed_temp, H_BED, 10, true); + break; + #endif + + case ADVSET_CASE_PWRLOSSR: // Power-loss recovery + recovery.enable(!recovery.enabled); + Draw_Chkb_Line(ADVSET_CASE_PWRLOSSR + MROWS - index_advset, recovery.enabled); + break; + default: break; + } + } + DWIN_UpdateLCD(); +} + +#if HAS_HOME_OFFSET + + /* Home Offset */ + void HMI_HomeOff() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_item.inc(1 + 3)) Move_Highlight(1, select_item.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_item.dec()) Move_Highlight(-1, select_item.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_item.now) { + case 0: // Back + checkkey = AdvSet; + select_advset.set(ADVSET_CASE_HOMEOFF); + Draw_AdvSet_Menu(); + break; + case 1: // Home Offset X + checkkey = HomeOffX; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Home_OffX_scaled); + EncoderRate.enabled = true; + break; + case 2: // Home Offset Y + checkkey = HomeOffY; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Home_OffY_scaled); + EncoderRate.enabled = true; + break; + case 3: // Home Offset Z + checkkey = HomeOffZ; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Home_OffZ_scaled); + EncoderRate.enabled = true; + break; + default: break; + } + } + DWIN_UpdateLCD(); + } + + void HMI_HomeOffN(float &posScaled, const_float_t lo, const_float_t hi) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, posScaled)) { + checkkey = HomeOff; + EncoderRate.enabled = false; + set_home_offset(X_AXIS, posScaled / 10); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(select_item.now), posScaled); + return; + } + LIMIT(posScaled, lo, hi); + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, UNITFDIGITS, 216, MBASE(select_item.now), posScaled); + } + } + + void HMI_HomeOffX() { HMI_HomeOffN(HMI_ValueStruct.Home_OffX_scaled, -500, 500); } + void HMI_HomeOffY() { HMI_HomeOffN(HMI_ValueStruct.Home_OffY_scaled, -500, 500); } + void HMI_HomeOffZ() { HMI_HomeOffN(HMI_ValueStruct.Home_OffZ_scaled, -20, 20); } + +#endif // HAS_HOME_OFFSET + +#if HAS_ONESTEP_LEVELING + /*Probe Offset */ + void HMI_ProbeOff() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_item.inc(1 + 2)) Move_Highlight(1, select_item.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_item.dec()) Move_Highlight(-1, select_item.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_item.now) { + case 0: // Back + checkkey = AdvSet; + select_advset.set(ADVSET_CASE_PROBEOFF); + Draw_AdvSet_Menu(); + break; + case 1: // Probe Offset X + checkkey = ProbeOffX; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Probe_OffX_scaled); + EncoderRate.enabled = true; + break; + case 2: // Probe Offset X + checkkey = ProbeOffY; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Probe_OffY_scaled); + EncoderRate.enabled = true; + break; + } + } + DWIN_UpdateLCD(); + } + + void HMI_ProbeOffN(float &posScaled, float &offset_ref) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, posScaled)) { + checkkey = ProbeOff; + EncoderRate.enabled = false; + offset_ref = posScaled / 10; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(select_item.now), posScaled); + return; + } + LIMIT(posScaled, -500, 500); + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, UNITFDIGITS, 216, MBASE(select_item.now), posScaled); + } + } + + void HMI_ProbeOffX() { HMI_ProbeOffN(HMI_ValueStruct.Probe_OffX_scaled, probe.offset.x); } + void HMI_ProbeOffY() { HMI_ProbeOffN(HMI_ValueStruct.Probe_OffY_scaled, probe.offset.y); } + +#endif // HAS_ONESTEP_LEVELING + /* Info */ void HMI_Info() { ENCODER_DiffState encoder_diffState = get_encoder_state(); @@ -3735,6 +4045,18 @@ void DWIN_HandleScreen() { case AxisMove: HMI_AxisMove(); break; case TemperatureID: HMI_Temperature(); break; case Motion: HMI_Motion(); break; + case AdvSet: HMI_AdvSet(); break; + #if HAS_HOME_OFFSET + case HomeOff: HMI_HomeOff(); break; + case HomeOffX: HMI_HomeOffX(); break; + case HomeOffY: HMI_HomeOffY(); break; + case HomeOffZ: HMI_HomeOffZ(); break; + #endif + #if HAS_ONESTEP_LEVELING + case ProbeOff: HMI_ProbeOff(); break; + case ProbeOffX: HMI_ProbeOffX(); break; + case ProbeOffY: HMI_ProbeOffY(); break; + #endif case Info: HMI_Info(); break; case Tune: HMI_Tune(); break; #if HAS_PREHEAT @@ -3801,4 +4123,10 @@ void DWIN_StatusChanged(const char *text) { DWIN_UpdateLCD(); } +// GUI extension +void DWIN_Draw_Checkbox(uint16_t color, uint16_t bcolor, uint16_t x, uint16_t y, bool mode=false) { + DWIN_Draw_String(false,true,font8x16,Select_Color,bcolor,x+4,y,F(mode ? "x" : " ")); + DWIN_Draw_Rectangle(0,color,x+2,y+2,x+17,y+17); +} + #endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 7f7c007eed..ad210db27d 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -63,10 +63,20 @@ enum processID : uint8_t { MaxJerk_value, Step, Step_value, + HomeOff, + HomeOffX, + HomeOffY, + HomeOffZ, // Last Process ID Last_Prepare, + // Advance Settings + AdvSet, + ProbeOff, + ProbeOffX, + ProbeOffY, + // Back Process ID Back_Main, Back_Print, @@ -197,6 +207,17 @@ enum processID : uint8_t { #define ICON_Info_0 90 #define ICON_Info_1 91 +#define ICON_AdvSet ICON_Language +#define ICON_HomeOff ICON_AdvSet +#define ICON_HomeOffX ICON_StepX +#define ICON_HomeOffY ICON_StepY +#define ICON_HomeOffZ ICON_StepZ +#define ICON_ProbeOff ICON_AdvSet +#define ICON_ProbeOffX ICON_StepX +#define ICON_ProbeOffY ICON_StepY +#define ICON_PIDNozzle ICON_SetEndTemp +#define ICON_PIDbed ICON_SetBedTemp + /** * 3-.0:The font size, 0x00-0x09, corresponds to the font size below: * 0x00=6*12 0x01=8*16 0x02=10*20 0x03=12*24 0x04=14*28 @@ -256,6 +277,11 @@ typedef struct { #endif float offset_value = 0; int8_t show_mode = 0; // -1: Temperature control 0: Printing temperature + float Home_OffX_scaled = 0; + float Home_OffY_scaled = 0; + float Home_OffZ_scaled = 0; + float Probe_OffX_scaled = 0; + float Probe_OffY_scaled = 0; } HMI_value_t; #define DWIN_CHINESE 123 @@ -378,6 +404,7 @@ void DWIN_Update(); void EachMomentUpdate(); void DWIN_HandleScreen(); void DWIN_StatusChanged(const char *text); +void DWIN_Draw_Checkbox(uint16_t color, uint16_t bcolor, uint16_t x, uint16_t y, bool mode /* = false*/); inline void DWIN_StartHoming() { HMI_flag.home_flag = true; } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index c911120766..12c5a6e42d 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -82,6 +82,9 @@ namespace Language_en { PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Leveling Done!"); PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Height"); PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Set Home Offsets"); + PROGMEM Language_Str MSG_HOME_OFFSET_X = _UxGT("Home Offset X"); + PROGMEM Language_Str MSG_HOME_OFFSET_Y = _UxGT("Home Offset Y"); + PROGMEM Language_Str MSG_HOME_OFFSET_Z = _UxGT("Home Offset Z"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets Applied"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Set Origin"); PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming"); diff --git a/buildroot/tests/STM32F103RET6_creality b/buildroot/tests/STM32F103RET6_creality index ef020a33f1..a3f885147e 100755 --- a/buildroot/tests/STM32F103RET6_creality +++ b/buildroot/tests/STM32F103RET6_creality @@ -16,7 +16,8 @@ exec_test $1 $2 "Ender 3 v2" "$3" use_example_configs "Creality/Ender-3 V2" opt_disable CLASSIC_JERK opt_add SDCARD_EEPROM_EMULATION -exec_test $1 $2 "Ender 3 v2, SD EEPROM, w/o CLASSIC_JERK" "$3" +opt_set TEMP_SENSOR_BED 0 +exec_test $1 $2 "Ender 3 v2, SD EEPROM, no CLASSIC_JERK, no Bed" "$3" restore_configs opt_set MOTHERBOARD BOARD_CREALITY_V452 SERIAL_PORT 1 From 7e3cf82a4066fe51126eab926119f47e26df9b1b Mon Sep 17 00:00:00 2001 From: pinchies Date: Sun, 25 Apr 2021 18:48:20 +1000 Subject: [PATCH 1353/1370] Fix usage, commentary of MANUAL_PROBE_START_Z, Z_AFTER_PROBING (#21692) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 6 ++++- Marlin/src/feature/bedlevel/bedlevel.cpp | 30 +++++++++++------------ Marlin/src/gcode/bedlevel/mbl/G29.cpp | 16 +++++++++--- Marlin/src/inc/Conditionals_LCD.h | 18 +++++--------- Marlin/src/inc/Conditionals_post.h | 14 ++++++++--- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 6 ++--- 6 files changed, 52 insertions(+), 38 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1022dd54dd..8e2ade8299 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -934,7 +934,6 @@ * or (with LCD_BED_LEVELING) the LCD controller. */ //#define PROBE_MANUALLY -//#define MANUAL_PROBE_START_Z 0.2 /** * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. @@ -1409,6 +1408,11 @@ */ //#define DEBUG_LEVELING_FEATURE +#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL, PROBE_MANUALLY) + // Set a height for the start of manual adjustment + #define MANUAL_PROBE_START_Z 0.2 // (mm) Comment out to use the last-measured height +#endif + #if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL) // Gradually reduce leveling correction until a set height is reached, // at which point movement will be level to the machine's XY plane. diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 30fafbf57b..8e03632de4 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -213,27 +213,27 @@ void reset_bed_level() { void _manual_goto_xy(const xy_pos_t &pos) { + // Get the resting Z position for after the XY move #ifdef MANUAL_PROBE_START_Z - constexpr float startz = _MAX(0, MANUAL_PROBE_START_Z); - #if MANUAL_PROBE_HEIGHT > 0 - do_blocking_move_to_xy_z(pos, MANUAL_PROBE_HEIGHT); - do_blocking_move_to_z(startz); - #else - do_blocking_move_to_xy_z(pos, startz); - #endif - #elif MANUAL_PROBE_HEIGHT > 0 - const float prev_z = current_position.z; - do_blocking_move_to_xy_z(pos, MANUAL_PROBE_HEIGHT); - do_blocking_move_to_z(prev_z); + constexpr float finalz = _MAX(0, MANUAL_PROBE_START_Z); // If a MANUAL_PROBE_START_Z value is set, always respect it #else - do_blocking_move_to_xy(pos); + #warning "It's recommended to set some MANUAL_PROBE_START_Z value for manual leveling." + #endif + #if Z_CLEARANCE_BETWEEN_MANUAL_PROBES > 0 // A probe/obstacle clearance exists so there is a raise: + #ifndef MANUAL_PROBE_START_Z + const float finalz = current_position.z; // - Use the current Z for starting-Z if no MANUAL_PROBE_START_Z was provided + #endif + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_MANUAL_PROBES); // - Raise Z, then move to the new XY + do_blocking_move_to_z(finalz); // - Lower down to the starting Z height, ready for adjustment! + #elif defined(MANUAL_PROBE_START_Z) // A starting-Z was provided, but there's no raise: + do_blocking_move_to_xy_z(pos, finalz); // - Move in XY then down to the starting Z height, ready for adjustment! + #else // Zero raise and no starting Z height either: + do_blocking_move_to_xy(pos); // - Move over with no raise, ready for adjustment! #endif - - current_position = pos; TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); } -#endif +#endif // MESH_BED_LEVELING || PROBE_MANUALLY #endif // HAS_LEVELING diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 2da584fd49..afc6aad32c 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -100,7 +100,11 @@ void GcodeSuite::G29() { // For each G29 S2... if (mbl_probe_index == 0) { // Move close to the bed before the first point - do_blocking_move_to_z(MANUAL_PROBE_START_Z); + do_blocking_move_to_z(0.4f + #ifdef MANUAL_PROBE_START_Z + + (MANUAL_PROBE_START_Z) - 0.4f + #endif + ); } else { // Save Z for the previous mesh position @@ -116,8 +120,14 @@ void GcodeSuite::G29() { _manual_goto_xy({ mbl.index_to_xpos[ix], mbl.index_to_ypos[iy] }); } else { - // One last "return to the bed" (as originally coded) at completion - current_position.z = MANUAL_PROBE_HEIGHT; + // Move to the after probing position + current_position.z = ( + #ifdef Z_AFTER_PROBING + Z_AFTER_PROBING + #else + Z_CLEARANCE_BETWEEN_MANUAL_PROBES + #endif + ); line_to_current_position(); planner.synchronize(); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 78a6f2c821..429877ce84 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -788,14 +788,6 @@ #endif #endif // FILAMENT_RUNOUT_SENSOR -#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) - #undef PROBE_MANUALLY -#endif - -#if ANY(HAS_BED_PROBE, PROBE_MANUALLY, MESH_BED_LEVELING) - #define PROBE_SELECTED 1 -#endif - #if HAS_BED_PROBE #if DISABLED(NOZZLE_AS_PROBE) #define HAS_PROBE_XY_OFFSET 1 @@ -865,14 +857,16 @@ #define PLANNER_LEVELING 1 #endif #endif -#if EITHER(HAS_ABL_OR_UBL, Z_MIN_PROBE_REPEATABILITY_TEST) - #define HAS_PROBING_PROCEDURE 1 -#endif #if !HAS_LEVELING - #undef PROBE_MANUALLY #undef RESTORE_LEVELING_AFTER_G28 #undef ENABLE_LEVELING_AFTER_G28 #endif +#if !HAS_LEVELING || EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + #undef PROBE_MANUALLY +#endif +#if ANY(HAS_BED_PROBE, PROBE_MANUALLY, MESH_BED_LEVELING) + #define PROBE_SELECTED 1 +#endif #ifdef GRID_MAX_POINTS_X #define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 611c13e344..772c8bc3c1 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2910,9 +2910,9 @@ #define Z_CLEARANCE_BETWEEN_PROBES Z_HOMING_HEIGHT #endif #if Z_CLEARANCE_BETWEEN_PROBES > Z_HOMING_HEIGHT - #define MANUAL_PROBE_HEIGHT Z_CLEARANCE_BETWEEN_PROBES + #define Z_CLEARANCE_BETWEEN_MANUAL_PROBES Z_CLEARANCE_BETWEEN_PROBES #else - #define MANUAL_PROBE_HEIGHT Z_HOMING_HEIGHT + #define Z_CLEARANCE_BETWEEN_MANUAL_PROBES Z_HOMING_HEIGHT #endif #ifndef Z_CLEARANCE_MULTI_PROBE #define Z_CLEARANCE_MULTI_PROBE Z_CLEARANCE_BETWEEN_PROBES @@ -2922,8 +2922,14 @@ #endif #endif -#if !defined(MANUAL_PROBE_START_Z) && defined(Z_CLEARANCE_BETWEEN_PROBES) - #define MANUAL_PROBE_START_Z Z_CLEARANCE_BETWEEN_PROBES +// Define a starting height for measuring manual probe points +#ifndef MANUAL_PROBE_START_Z + #if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) + // Leave MANUAL_PROBE_START_Z undefined so the prior Z height will be used. + // Note: If Z_CLEARANCE_BETWEEN_MANUAL_PROBES is 0 there will be no raise between points + #elif ENABLED(AUTO_BED_LEVELING_UBL) && defined(Z_CLEARANCE_BETWEEN_PROBES) + #define MANUAL_PROBE_START_Z Z_CLEARANCE_BETWEEN_PROBES + #endif #endif #ifndef __SAM3X8E__ //todo: hal: broken hal encapsulation diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 5fc9fbccbd..8e9707de5b 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -63,16 +63,16 @@ // and allow the command queue to be processed. // // When G29 finishes the last move: - // - Raise Z to the "manual probe height" + // - Raise Z to the "Z after probing" height // - Don't return until done. // // ** This blocks the command queue! ** // void _lcd_level_bed_done() { if (!ui.wait_for_move) { - #if MANUAL_PROBE_HEIGHT > 0 && DISABLED(MESH_BED_LEVELING) + #if Z_AFTER_PROBING > 0 && DISABLED(MESH_BED_LEVELING) // Display "Done" screen and wait for moves to complete - line_to_z(MANUAL_PROBE_HEIGHT); + line_to_z(Z_AFTER_PROBING); ui.synchronize(GET_TEXT(MSG_LEVEL_BED_DONE)); #endif ui.goto_previous_screen_no_defer(); From 0ec489d6f2ab63cef50240e072c972b77eb573e9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 25 Apr 2021 04:15:13 -0500 Subject: [PATCH 1354/1370] Fix HMI_HomeOffN axis Followup to #21534 --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 891732e641..51d192e26f 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -3461,13 +3461,13 @@ void HMI_AdvSet() { DWIN_UpdateLCD(); } - void HMI_HomeOffN(float &posScaled, const_float_t lo, const_float_t hi) { + void HMI_HomeOffN(const AxisEnum axis, float &posScaled, const_float_t lo, const_float_t hi) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (Apply_Encoder(encoder_diffState, posScaled)) { checkkey = HomeOff; EncoderRate.enabled = false; - set_home_offset(X_AXIS, posScaled / 10); + set_home_offset(axis, posScaled / 10); DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(select_item.now), posScaled); return; } @@ -3476,9 +3476,9 @@ void HMI_AdvSet() { } } - void HMI_HomeOffX() { HMI_HomeOffN(HMI_ValueStruct.Home_OffX_scaled, -500, 500); } - void HMI_HomeOffY() { HMI_HomeOffN(HMI_ValueStruct.Home_OffY_scaled, -500, 500); } - void HMI_HomeOffZ() { HMI_HomeOffN(HMI_ValueStruct.Home_OffZ_scaled, -20, 20); } + void HMI_HomeOffX() { HMI_HomeOffN(X_AXIS, HMI_ValueStruct.Home_OffX_scaled, -500, 500); } + void HMI_HomeOffY() { HMI_HomeOffN(Y_AXIS, HMI_ValueStruct.Home_OffY_scaled, -500, 500); } + void HMI_HomeOffZ() { HMI_HomeOffN(Z_AXIS, HMI_ValueStruct.Home_OffZ_scaled, -20, 20); } #endif // HAS_HOME_OFFSET From 0fb606fa0a8f8e2eddd5c11a51b8ce9f9437a5dd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 25 Apr 2021 17:17:02 -0500 Subject: [PATCH 1355/1370] whitespace --- Marlin/src/gcode/parser.cpp | 2 +- buildroot/share/PlatformIO/scripts/common-dependencies.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 8cbbe1d19d..7e75783b7a 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -217,7 +217,7 @@ void GCodeParser::parse(char *p) { #if ENABLED(GCODE_MOTION_MODES) #if ENABLED(ARC_SUPPORT) - case 'I' ... 'J': + case 'I' ... 'J': if (motion_mode_codenum != 2 && motion_mode_codenum != 3) return; #endif case 'Q': diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index 9ab437dd0b..18a7303be6 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -37,7 +37,7 @@ #define USES_LIQUIDTWI2 #elif ENABLED(LCD_I2C_TYPE_PCA8574) #define USES_LIQUIDCRYSTAL_I2C -#elif ANY(HAS_MARLINUI_HD44780, LCD_I2C_TYPE_PCF8575, SR_LCD_2W_NL , LCM1602) +#elif ANY(HAS_MARLINUI_HD44780, LCD_I2C_TYPE_PCF8575, SR_LCD_2W_NL, LCM1602) #define USES_LIQUIDCRYSTAL #endif From 1d4c2454bcb425c68bcc1578d47d9045dfce1df4 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Sun, 25 Apr 2021 21:55:15 -0400 Subject: [PATCH 1356/1370] Fix relocated LiquidCrystal library (#21699) Followup to 770e539859 --- ini/features.ini | 2 +- ini/lpc176x.ini | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ini/features.ini b/ini/features.ini index 1f4bf98531..118392d6d7 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -30,7 +30,7 @@ HAS_L64XX = Arduino-L6470@0.8.0 NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 src_filter=+ TEMP_.+_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 -USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@^1.0.7 +USES_LIQUIDCRYSTAL = fmalpartida/LiquidCrystal@1.5.0 USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 HAS_WIRED_LCD = src_filter=+ diff --git a/ini/lpc176x.ini b/ini/lpc176x.ini index 494d7baac8..450585b01a 100644 --- a/ini/lpc176x.ini +++ b/ini/lpc176x.ini @@ -23,6 +23,7 @@ extra_scripts = ${common.extra_scripts} src_filter = ${common.default_src_filter} + + lib_deps = ${common.lib_deps} Servo +custom_marlin.USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@~1.0.7 custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace From 0d0ec3ec89003974443be99aa13740598c7048d1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 25 Apr 2021 23:33:52 -0500 Subject: [PATCH 1357/1370] Prettier output from opt scripts (#21707) --- buildroot/bin/opt_disable | 10 ++++++---- buildroot/bin/opt_enable | 10 ++++++---- buildroot/bin/opt_set | 13 +++++++------ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/buildroot/bin/opt_disable b/buildroot/bin/opt_disable index 11526132ef..18ec03aa94 100755 --- a/buildroot/bin/opt_disable +++ b/buildroot/bin/opt_disable @@ -6,8 +6,10 @@ set -e SED=$(which gsed || which sed) for opt in "$@" ; do - # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define \b${opt}\b\)/{s//\1\3\/\/\4/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define \b${opt}\b\)/{s//\1\3\/\/\4/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || - (echo "ERROR: opt_disable Can't find ${opt}" >&2 && exit 9) + DID=0 ; FOUND=0 + for FN in Configuration Configuration_adv; do + "${SED}" -i "/^\(\s*\)\(#define\s\+${opt}\b\s\?\)\(\s\s\)\?/{s//\1\/\/\2/;h};\${x;/./{x;q0};x;q9}" Marlin/$FN.h && DID=1 + ((DID||FOUND)) || { grep -E "^\s*//\s*#define\s+${opt}\b" Marlin/$FN.h >/dev/null && FOUND=1 ; } + done + ((DID||FOUND)) || (echo "ERROR: $(basename $0) Can't find ${opt}" >&2 && exit 9) done diff --git a/buildroot/bin/opt_enable b/buildroot/bin/opt_enable index 9161299b6e..d341ee9bd3 100755 --- a/buildroot/bin/opt_enable +++ b/buildroot/bin/opt_enable @@ -6,8 +6,10 @@ set -e SED=$(which gsed || which sed) for opt in "$@" ; do - # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/^\([[:blank:]]*\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/^\([[:blank:]]*\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || - (echo "ERROR: opt_enable Can't find ${opt}" >&2 && exit 9) + DID=0 ; FOUND=0 + for FN in Configuration Configuration_adv; do + "${SED}" -i "/^\(\s*\)\/\/\(\s*\)\(#define\s\+${opt}\b\)\( \?\)/{s//\1\2\3\4\4\4/;h};\${x;/./{x;q0};x;q9}" Marlin/$FN.h && DID=1 + ((DID||FOUND)) || { grep -E "^\s*#define\s+${opt}\b" Marlin/$FN.h >/dev/null && FOUND=1 ; } + done + ((DID||FOUND)) || (echo "ERROR: $(basename $0) Can't find ${opt}" >&2 && exit 9) done diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set index 2e63790c69..d2d0cc241f 100755 --- a/buildroot/bin/opt_set +++ b/buildroot/bin/opt_set @@ -5,12 +5,13 @@ set -e SED=$(which gsed || which sed) -ARGC=$# while [[ $# > 1 ]]; do - # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/^\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\1\3\4 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/^\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\1\3\4 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || - eval "echo '#define ${1} ${2}' >>Marlin/Configuration.h" || - (echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) + DID=0 + for FN in Configuration Configuration_adv; do + "${SED}" -i "/^\(\s*\)\/*\s*\(#define\s\+${1}\b\)\(.*\)$/{s//\1\2 ${2} \/\/ \3/;h};\${x;/./{x;q0};x;q9}" Marlin/$FN.h && DID=1 + done + ((DID)) || + eval "echo '#define ${1} ${2}' >>Marlin/Configuration.h" || + (echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) shift 2 done From 62ec696caefc7fe7bed7143d7c8c34c10726cb20 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 25 Apr 2021 21:34:42 -0700 Subject: [PATCH 1358/1370] Fix "continuous" typo (#21701) --- Marlin/Configuration_adv.h | 2 +- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 2 +- Marlin/src/lcd/marlinui.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index eb3c7b0df8..1a10244e55 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2842,7 +2842,7 @@ /** * Enable M122 debugging command for TMC stepper drivers. - * M122 S0/1 will enable continous reporting. + * M122 S0/1 will enable continuous reporting. */ //#define TMC_DEBUG diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index a46e3ab3ab..fa8bb7eaa8 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -60,7 +60,7 @@ static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb } else if (srflags & USART_SR_ORE) { // overrun and empty data, just do a dummy read to clear ORE - // and prevent a raise condition where a continous interrupt stream (due to ORE set) occurs + // and prevent a raise condition where a continuous interrupt stream (due to ORE set) occurs // (see chapter "Overrun error" ) in STM32 reference manual regs->DR; } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 812dac53b7..476caf3225 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -855,7 +855,7 @@ void MarlinUI::update() { static bool wait_for_unclick; // = false auto do_click = [&]{ - wait_for_unclick = true; // - Set debounce flag to ignore continous clicks + wait_for_unclick = true; // - Set debounce flag to ignore continuous clicks lcd_clicked = !wait_for_user; // - Keep the click if not waiting for a user-click wait_for_user = false; // - Any click clears wait for user quick_feedback(); // - Always make a click sound From 3433bfc3bd40a056d6072dcd93c998227c0c16c2 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Mon, 26 Apr 2021 19:22:27 -0400 Subject: [PATCH 1359/1370] Help users confused by "bed size" (#21714) --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 8e2ade8299..442f502c3e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1224,7 +1224,7 @@ // @section machine -// The size of the print bed +// The size of the printable area #define X_BED_SIZE 200 #define Y_BED_SIZE 200 From 301cc85fec0e4704b97cb1396cc79250b9382b20 Mon Sep 17 00:00:00 2001 From: hartmannathan <59230071+hartmannathan@users.noreply.github.com> Date: Mon, 26 Apr 2021 19:30:26 -0400 Subject: [PATCH 1360/1370] typo (#21710) --- Marlin/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Makefile b/Marlin/Makefile index a3ca81abdd..5ff1830822 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -993,5 +993,5 @@ clean: .PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter -# Automaticaly include the dependency files created by gcc +# Automatically include the dependency files created by gcc -include ${patsubst %.o, %.d, ${OBJ}} From c2741affe9ce6edcfc0d35558ddf924c86d42e34 Mon Sep 17 00:00:00 2001 From: Sebastiaan Dammann Date: Tue, 27 Apr 2021 01:32:13 +0200 Subject: [PATCH 1361/1370] Make Cancel Objects reporting optional (#21698) --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/feature/cancel_object.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1a10244e55..8cfaa95787 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3641,6 +3641,9 @@ * Implement M486 to allow Marlin to skip objects */ //#define CANCEL_OBJECTS +#if ENABLED(CANCEL_OBJECTS) + #define CANCEL_OBJECTS_REPORTING // Emit the current object as a status message +#endif /** * I2C position encoders for closed loop control. diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index 1f92ac5843..ee5716888d 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -43,7 +43,7 @@ void CancelObject::set_active_object(const int8_t obj) { else skipping = false; - #if HAS_STATUS_MESSAGE + #if BOTH(HAS_STATUS_MESSAGE, CANCEL_OBJECTS_REPORTING) if (active_object >= 0) ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object)); else From 08537dc89114287c3b65a51498268ccf8876d52d Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 26 Apr 2021 21:30:34 -0300 Subject: [PATCH 1362/1370] Remove compiler flag merge-constants (#21711) --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 75e7f6a58b..d17c283b72 100644 --- a/platformio.ini +++ b/platformio.ini @@ -36,7 +36,7 @@ extra_configs = # Remove '-fmax-errors=5' from build_flags below to see all. # [common] -build_flags = -g3 -D__MARLIN_FIRMWARE__ -DNDEBUG -fmerge-constants +build_flags = -g3 -D__MARLIN_FIRMWARE__ -DNDEBUG -fmax-errors=5 extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py From 81d7a6b81d2171915bf5cfa4f14255e683743959 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 27 Apr 2021 16:36:39 +1200 Subject: [PATCH 1363/1370] Use temp_info_t for temp_redundant (#21715) Fixes #21712 Co-authored-by: Scott Lahteine --- Marlin/src/module/temperature.cpp | 49 +++++++++++++++---------------- Marlin/src/module/temperature.h | 30 +++++++++++-------- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 8e2b2d6b91..462af7f61a 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -256,7 +256,11 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif #if HAS_HOTEND - hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 } + hotend_info_t Temperature::temp_hotend[HOTENDS]; + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + temp_info_t Temperature::temp_redundant; + #endif + #define _HMT(N) HEATER_##N##_MAXTEMP, const celsius_t Temperature::hotend_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); #endif @@ -420,11 +424,6 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, bool Temperature::inited = false; #endif -#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - int16_t Temperature::redundant_temperature_raw = 0; - celsius_float_t Temperature::redundant_temperature = 0.0; -#endif - volatile bool Temperature::raw_temps_ready = false; #if ENABLED(PID_EXTRUSION_SCALING) @@ -1225,12 +1224,12 @@ void Temperature::manage_heater() { #if DISABLED(IGNORE_THERMOCOUPLE_ERRORS) #if TEMP_SENSOR_0_IS_MAX_TC - if (temp_hotend[0].celsius > _MIN(HEATER_0_MAXTEMP, TEMP_SENSOR_0_MAX_TC_TMAX - 1.0)) max_temp_error(H_E0); - if (temp_hotend[0].celsius < _MAX(HEATER_0_MINTEMP, TEMP_SENSOR_0_MAX_TC_TMIN + .01)) min_temp_error(H_E0); + if (degHotend(0) > _MIN(HEATER_0_MAXTEMP, TEMP_SENSOR_0_MAX_TC_TMAX - 1.0)) max_temp_error(H_E0); + if (degHotend(0) < _MAX(HEATER_0_MINTEMP, TEMP_SENSOR_0_MAX_TC_TMIN + .01)) min_temp_error(H_E0); #endif #if TEMP_SENSOR_1_IS_MAX_TC - if (temp_hotend[1].celsius > _MIN(HEATER_1_MAXTEMP, TEMP_SENSOR_1_MAX_TC_TMAX - 1.0)) max_temp_error(H_E1); - if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, TEMP_SENSOR_1_MAX_TC_TMIN + .01)) min_temp_error(H_E1); + if (TERN(TEMP_SENSOR_1_AS_REDUNDANT, degHotendRedundant(), degHotend(1)) > _MIN(HEATER_1_MAXTEMP, TEMP_SENSOR_1_MAX_TC_TMAX - 1.0)) max_temp_error(H_E1); + if (TERN(TEMP_SENSOR_1_AS_REDUNDANT, degHotendRedundant(), degHotend(1)) < _MAX(HEATER_1_MINTEMP, TEMP_SENSOR_1_MAX_TC_TMIN + .01)) min_temp_error(H_E1); #endif #endif @@ -1266,7 +1265,7 @@ void Temperature::manage_heater() { #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) // Make sure measured temperatures are close together - if (ABS(temp_hotend[0].celsius - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) + if (ABS(degHotend(0) - degHotendRedundant()) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) _temp_error(H_E0, PSTR(STR_REDUNDANCY), GET_TEXT(MSG_ERR_REDUNDANT_TEMP)); #endif @@ -1668,7 +1667,7 @@ void Temperature::manage_heater() { SERIAL_EOL(); } - celsius_float_t Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { + celsius_float_t Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int16_t raw) { //#if (MOTHERBOARD == BOARD_RAMPS_14_EFB) // static uint32_t clocks_total = 0; // static uint32_t calls = 0; @@ -1717,8 +1716,8 @@ void Temperature::manage_heater() { #if HAS_HOTEND // Derived from RepRap FiveD extruder::getTemperature() // For hot end temperature measurement. - celsius_float_t Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { - if (e > HOTENDS - DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)) { + celsius_float_t Temperature::analog_to_celsius_hotend(const int16_t raw, const uint8_t e) { + if (e >= HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) { SERIAL_ERROR_START(); SERIAL_ECHO(e); SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER_NUM); @@ -1826,7 +1825,7 @@ void Temperature::manage_heater() { #if HAS_HEATED_BED // For bed temperature measurement. - celsius_float_t Temperature::analog_to_celsius_bed(const int raw) { + celsius_float_t Temperature::analog_to_celsius_bed(const int16_t raw) { #if TEMP_SENSOR_BED_IS_CUSTOM return user_thermistor_to_deg_c(CTI_BED, raw); #elif TEMP_SENSOR_BED_IS_THERMISTOR @@ -1844,7 +1843,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_CHAMBER // For chamber temperature measurement. - celsius_float_t Temperature::analog_to_celsius_chamber(const int raw) { + celsius_float_t Temperature::analog_to_celsius_chamber(const int16_t raw) { #if TEMP_SENSOR_CHAMBER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_CHAMBER, raw); #elif TEMP_SENSOR_CHAMBER_IS_THERMISTOR @@ -1862,7 +1861,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_COOLER // For cooler temperature measurement. - celsius_float_t Temperature::analog_to_celsius_cooler(const int raw) { + celsius_float_t Temperature::analog_to_celsius_cooler(const int16_t raw) { #if TEMP_SENSOR_COOLER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_COOLER, raw); #elif TEMP_SENSOR_COOLER_IS_THERMISTOR @@ -1880,7 +1879,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_PROBE // For probe temperature measurement. - celsius_float_t Temperature::analog_to_celsius_probe(const int raw) { + celsius_float_t Temperature::analog_to_celsius_probe(const int16_t raw) { #if TEMP_SENSOR_PROBE_IS_CUSTOM return user_thermistor_to_deg_c(CTI_PROBE, raw); #elif TEMP_SENSOR_PROBE_IS_THERMISTOR @@ -1904,15 +1903,15 @@ void Temperature::manage_heater() { */ void Temperature::updateTemperaturesFromRawValues() { TERN_(TEMP_SENSOR_0_IS_MAX_TC, temp_hotend[0].raw = READ_MAX_TC(0)); - TERN_(TEMP_SENSOR_1_IS_MAX_TC, temp_hotend[1].raw = READ_MAX_TC(1)); + TERN_(TEMP_SENSOR_1_IS_MAX_TC, TERN(TEMP_SENSOR_1_AS_REDUNDANT, temp_redundant, temp_hotend[1]).raw = READ_MAX_TC(1)); #if HAS_HOTEND HOTEND_LOOP() temp_hotend[e].celsius = analog_to_celsius_hotend(temp_hotend[e].raw, e); #endif + TERN_(TEMP_SENSOR_1_AS_REDUNDANT, temp_redundant.celsius = analog_to_celsius_hotend(temp_redundant.raw, 1)); TERN_(HAS_HEATED_BED, temp_bed.celsius = analog_to_celsius_bed(temp_bed.raw)); TERN_(HAS_TEMP_CHAMBER, temp_chamber.celsius = analog_to_celsius_chamber(temp_chamber.raw)); TERN_(HAS_TEMP_COOLER, temp_cooler.celsius = analog_to_celsius_cooler(temp_cooler.raw)); TERN_(HAS_TEMP_PROBE, temp_probe.celsius = analog_to_celsius_probe(temp_probe.raw)); - TERN_(TEMP_SENSOR_1_AS_REDUNDANT, redundant_temperature = analog_to_celsius_hotend(redundant_temperature_raw, 1)); TERN_(FILAMENT_WIDTH_SENSOR, filwidth.update_measured_mm()); TERN_(HAS_POWER_MONITOR, power_monitor.capture_values()); @@ -2707,7 +2706,7 @@ void Temperature::update_raw_temperatures() { #if HAS_TEMP_ADC_1 #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - redundant_temperature_raw = temp_hotend[1].acc; + temp_redundant.update(); #elif !TEMP_SENSOR_1_IS_MAX_TC temp_hotend[1].update(); #endif @@ -2741,7 +2740,7 @@ void Temperature::readings_ready() { #if HAS_HOTEND HOTEND_LOOP() temp_hotend[e].reset(); - TERN_(TEMP_SENSOR_1_AS_REDUNDANT, temp_hotend[1].reset()); + TERN_(TEMP_SENSOR_1_AS_REDUNDANT, temp_redundant.reset()); #endif TERN_(HAS_HEATED_BED, temp_bed.reset()); @@ -3245,7 +3244,7 @@ void Temperature::isr() { #if HAS_TEMP_ADC_1 case PrepareTemp_1: HAL_START_ADC(TEMP_1_PIN); break; - case MeasureTemp_1: ACCUMULATE_ADC(temp_hotend[1]); break; + case MeasureTemp_1: ACCUMULATE_ADC(TERN(TEMP_SENSOR_1_AS_REDUNDANT, temp_redundant, temp_hotend[1])); break; #endif #if HAS_TEMP_ADC_2 @@ -3443,9 +3442,9 @@ void Temperature::isr() { #endif ); #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - if (include_r) print_heater_state(redundant_temperature, degTargetHotend(target_extruder) + if (include_r) print_heater_state(degHotendRedundant(), degTargetHotend(0) #if ENABLED(SHOW_TEMP_ADC_VALUES) - , redundant_temperature_raw + , rawHotendTempRedundant() #endif , H_REDUNDANT ); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index b7d52e8a08..2bb773f805 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -321,8 +321,10 @@ class Temperature { public: #if HAS_HOTEND - #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) - static hotend_info_t temp_hotend[HOTEND_TEMPS]; + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + static temp_info_t temp_redundant; + #endif + static hotend_info_t temp_hotend[HOTENDS]; static const celsius_t hotend_maxtemp[HOTENDS]; static inline celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } #endif @@ -423,11 +425,6 @@ class Temperature { static hotend_watch_t watch_hotend[HOTENDS]; #endif - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - static uint16_t redundant_temperature_raw; - static celsius_t redundant_temperature; - #endif - #if ENABLED(PID_EXTRUSION_SCALING) static int32_t last_e_position, lpq[LPQ_MAX_LEN]; static lpq_ptr_t lpq_ptr; @@ -501,7 +498,7 @@ class Temperature { static user_thermistor_t user_thermistor[USER_THERMISTORS]; static void log_user_thermistor(const uint8_t t_index, const bool eprom=false); static void reset_user_thermistors(); - static celsius_float_t user_thermistor_to_deg_c(const uint8_t t_index, const int raw); + static celsius_float_t user_thermistor_to_deg_c(const uint8_t t_index, const int16_t raw); static inline bool set_pull_up_res(int8_t t_index, float value) { //if (!WITHIN(t_index, 0, USER_THERMISTORS - 1)) return false; if (!WITHIN(value, 1, 1000000)) return false; @@ -529,19 +526,19 @@ class Temperature { #endif #if HAS_HOTEND - static celsius_float_t analog_to_celsius_hotend(const int raw, const uint8_t e); + static celsius_float_t analog_to_celsius_hotend(const int16_t raw, const uint8_t e); #endif #if HAS_HEATED_BED - static celsius_float_t analog_to_celsius_bed(const int raw); + static celsius_float_t analog_to_celsius_bed(const int16_t raw); #endif #if HAS_TEMP_PROBE - static celsius_float_t analog_to_celsius_probe(const int raw); + static celsius_float_t analog_to_celsius_probe(const int16_t raw); #endif #if HAS_TEMP_CHAMBER - static celsius_float_t analog_to_celsius_chamber(const int raw); + static celsius_float_t analog_to_celsius_chamber(const int16_t raw); #endif #if HAS_TEMP_COOLER - static celsius_float_t analog_to_celsius_cooler(const int raw); + static celsius_float_t analog_to_celsius_cooler(const int16_t raw); #endif #if HAS_FAN @@ -631,6 +628,10 @@ class Temperature { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].celsius); } + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + static inline celsius_float_t degHotendRedundant() { return temp_redundant.celsius; } + #endif + static inline celsius_t wholeDegHotend(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, static_cast(temp_hotend[HOTEND_INDEX].celsius + 0.5f)); } @@ -639,6 +640,9 @@ class Temperature { static inline int16_t rawHotendTemp(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].raw); } + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + static inline int16_t rawHotendTempRedundant() { return temp_redundant.raw; } + #endif #endif static inline celsius_t degTargetHotend(const uint8_t E_NAME) { From e640d9246d9c4ed26edd55d518f5a4074afdd7ee Mon Sep 17 00:00:00 2001 From: Marcio T Date: Mon, 26 Apr 2021 22:40:59 -0600 Subject: [PATCH 1364/1370] FTDI EVE Touch UI fixes (#21706) --- .../archim2-flash/media_file_reader.h | 2 +- .../cocoa_press_advanced_settings_menu.cpp | 12 ++--- .../screens/cocoa_press_main_menu.cpp | 31 ++++++------ .../screens/flow_percent_screen.cpp | 50 +++++++++++++++++++ .../screens/flow_percent_screen.h | 31 ++++++++++++ .../screens/leveling_menu.cpp | 3 +- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 1 + .../lib/ftdi_eve_touch_ui/screens/screens.h | 2 + .../src/lcd/extui/lib/nextion/nextion_tft.cpp | 8 +-- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/lcd/extui/ui_api.h | 2 +- 11 files changed, 112 insertions(+), 32 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/flow_percent_screen.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/flow_percent_screen.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h index d9edea8388..3528dd9e15 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h @@ -32,7 +32,7 @@ class MediaFileReader { private: #if ENABLED(SDSUPPORT) - Sd2Card card; + DiskIODriver_SPI_SD card; SdVolume volume; SdFile root, file; #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp index 8d5a3d793a..7bd149bd46 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_advanced_settings_menu.cpp @@ -40,8 +40,7 @@ using namespace Theme; #define DISPLAY_POS BTN_POS(1,3), BTN_SIZE(1,1) #define INTERFACE_POS BTN_POS(2,3), BTN_SIZE(1,1) #define ENDSTOPS_POS BTN_POS(3,3), BTN_SIZE(1,1) -#define CASE_LIGHT_POS BTN_POS(1,4), BTN_SIZE(1,1) -#define RESTORE_DEFAULTS_POS BTN_POS(2,4), BTN_SIZE(1,1) +#define RESTORE_DEFAULTS_POS BTN_POS(1,4), BTN_SIZE(2,1) #define BACK_POS BTN_POS(3,4), BTN_SIZE(1,1) void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { @@ -66,9 +65,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { .tag(8) .button(ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) .tag(9) .button(INTERFACE_POS, GET_TEXT_F(MSG_INTERFACE)) .tag(10).button(DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) - .enabled(ENABLED(CASE_LIGHT_ENABLE)) - .tag(11).button(CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) - .tag(12).button(RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) + .tag(11).button(RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) .colors(action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } @@ -90,10 +87,7 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { case 8: GOTO_SCREEN(EndstopStatesScreen); break; case 9: GOTO_SCREEN(InterfaceSettingsScreen); LockScreen::check_passcode(); break; case 10: GOTO_SCREEN(DisplayTuningScreen); break; - #if ENABLED(CASE_LIGHT_ENABLE) - case 11: GOTO_SCREEN(CaseLightScreen); break; - #endif - case 12: GOTO_SCREEN(RestoreFailsafeDialogBox); LockScreen::check_passcode(); break; + case 11: GOTO_SCREEN(RestoreFailsafeDialogBox); LockScreen::check_passcode(); break; default: return false; } return true; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp index f35b3296d8..7708b38eca 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp @@ -29,7 +29,7 @@ using namespace FTDI; using namespace Theme; -#define GRID_ROWS 5 +#define GRID_ROWS 6 #define GRID_COLS 2 #define ZPROBE_ZOFFSET_POS BTN_POS(1,1), BTN_SIZE(1,1) @@ -37,11 +37,12 @@ using namespace Theme; #define TEMPERATURE_POS BTN_POS(2,1), BTN_SIZE(1,1) #define MOVE_E_POS BTN_POS(2,2), BTN_SIZE(1,1) #define SPEED_POS BTN_POS(1,3), BTN_SIZE(1,1) -#define ADVANCED_SETTINGS_POS BTN_POS(2,3), BTN_SIZE(1,1) -#define DISABLE_STEPPERS_POS BTN_POS(1,4), BTN_SIZE(1,1) -#define LEVELING_POS BTN_POS(2,4), BTN_SIZE(1,1) -#define ABOUT_PRINTER_POS BTN_POS(1,5), BTN_SIZE(1,1) -#define BACK_POS BTN_POS(2,5), BTN_SIZE(1,1) +#define FLOW_POS BTN_POS(2,3), BTN_SIZE(1,1) +#define ADVANCED_SETTINGS_POS BTN_POS(1,4), BTN_SIZE(1,1) +#define DISABLE_STEPPERS_POS BTN_POS(2,4), BTN_SIZE(1,1) +#define LEVELING_POS BTN_POS(1,5), BTN_SIZE(1,1) +#define ABOUT_PRINTER_POS BTN_POS(2,5), BTN_SIZE(1,1) +#define BACK_POS BTN_POS(1,6), BTN_SIZE(2,1) void MainMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { @@ -60,11 +61,12 @@ void MainMenu::onRedraw(draw_mode_t what) { .tag( 4).button(ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) .tag( 5).button(MOVE_E_POS, GET_TEXT_F(MSG_E_MOVE)) .tag( 6).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) - .tag( 7).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .tag( 8).button(DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS)) + .tag( 7).button(FLOW_POS, GET_TEXT_F(MSG_FLOW)) + .tag( 8).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag( 9).button(DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS)) .enabled(HAS_LEVELING) - .tag( 9).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) - .tag(10).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .tag(10).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) + .tag(11).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } @@ -82,12 +84,13 @@ bool MainMenu::onTouchEnd(uint8_t tag) { #endif case 5: GOTO_SCREEN(MoveEScreen); break; case 6: GOTO_SCREEN(FeedratePercentScreen); break; - case 7: GOTO_SCREEN(AdvancedSettingsMenu); break; - case 8: injectCommands_P(PSTR("M84")); break; + case 7: GOTO_SCREEN(FlowPercentScreen); break; + case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; + case 9: injectCommands_P(PSTR("M84")); break; #if HAS_LEVELING - case 9: GOTO_SCREEN(LevelingMenu); break; + case 10: GOTO_SCREEN(LevelingMenu); break; #endif - case 10: GOTO_SCREEN(AboutScreen); break; + case 11: GOTO_SCREEN(AboutScreen); break; default: return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/flow_percent_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/flow_percent_screen.cpp new file mode 100644 index 0000000000..5280092ced --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/flow_percent_screen.cpp @@ -0,0 +1,50 @@ +/*************************** + * flow_percent_screen.cpp * + ***************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" +#include "screens.h" + +#ifdef FTDI_FLOW_PERCENT_SCREEN + +using namespace FTDI; +using namespace ExtUI; + +void FlowPercentScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(0).units(GET_TEXT_F(MSG_UNITS_PERCENT)); + + w.heading(GET_TEXT_F(MSG_FLOW)); + w.adjuster(4, GET_TEXT_F(MSG_FLOW), getFlow_percent(E0)); + w.increments(); +} + +bool FlowPercentScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 4: UI_DECREMENT(Flow_percent, E0); break; + case 5: UI_INCREMENT(Flow_percent, E0); break; + default: + return false; + } + return true; +} + +#endif // FTDI_FLOW_PERCENT_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/flow_percent_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/flow_percent_screen.h new file mode 100644 index 0000000000..3e37531d1d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/flow_percent_screen.h @@ -0,0 +1,31 @@ +/************************* + * flow_percent_screen.h * + *************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - Cocoa Press * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +#define FTDI_FLOW_PERCENT_SCREEN +#define FTDI_FLOW_PERCENT_SCREEN_CLASS FlowPercentScreen + +class FlowPercentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp index ffdd69b2dd..752b17ee00 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -81,9 +81,8 @@ void LevelingMenu::onRedraw(draw_mode_t what) { .text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) #endif .font(font_medium).colors(normal_btn) - #if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION) + .enabled(EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION)) .tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_LEVEL_X_AXIS)) - #endif .tag(3).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED)) .enabled(ENABLED(HAS_MESH)) .tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index f115aecbc7..c3e015d75c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -80,6 +80,7 @@ SCREEN_TABLE { DECL_SCREEN_IF_INCLUDED(FTDI_NOZZLE_OFFSETS_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_BACKLASH_COMP_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_FEEDRATE_PERCENT_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_FLOW_PERCENT_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_MAX_VELOCITY_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_MAX_ACCELERATION_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_DEFAULT_ACCELERATION_SCREEN) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 14b8197fbf..a0cb71a6a6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -55,6 +55,7 @@ enum { MAX_VELOCITY_SCREEN_CACHE, MAX_ACCELERATION_SCREEN_CACHE, DEFAULT_ACCELERATION_SCREEN_CACHE, + FLOW_PERCENT_SCREEN_CACHE, #if HAS_LEVELING LEVELING_SCREEN_CACHE, #if HAS_BED_PROBE @@ -150,6 +151,7 @@ enum { #include "cocoa_press_preheat_screen.h" #include "cocoa_press_load_chocolate.h" #include "move_axis_screen.h" + #include "flow_percent_screen.h" #include "cocoa_press_move_xyz_screen.h" #include "cocoa_press_move_e_screen.h" #include "tune_menu.h" diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp index 679f66d807..6272d58970 100644 --- a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp @@ -237,7 +237,7 @@ void NextionTFT::PanelInfo(uint8_t req) { SEND_VALasTXT("tmppage.tool", getActiveTool()); SEND_VALasTXT("tmppage.fan", ui8tostr3rj(getActualFan_percent(FAN0))); SEND_VALasTXT("tmppage.speed", getFeedrate_percent()); - SEND_VALasTXT("tmppage.flow", getFlowPercentage(getActiveTool())); + SEND_VALasTXT("tmppage.flow", getFlow_percent(getActiveTool())); SEND_VALasTXT("tmppage.progress", ui8tostr3rj(getProgress_percent())); SEND_VALasTXT("tmppage.layer", layer); SEND_VALasTXT("tmppage.x", getAxisPosition_mm(X)); @@ -640,9 +640,9 @@ void NextionTFT::UpdateOnChange() { // tmppage Flow static uint8_t last_flow_speed = 99; - if (last_flow_speed != getFlowPercentage(getActiveTool())) { - SEND_VALasTXT("tmppage.flow", getFlowPercentage(getActiveTool())); - last_flow_speed = getFlowPercentage(getActiveTool()); + if (last_flow_speed != getFlow_percent(getActiveTool())) { + SEND_VALasTXT("tmppage.flow", getFlow_percent(getActiveTool())); + last_flow_speed = getFlow_percent(getActiveTool()); } // tmppage Progress + Layer + Time diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index accca50d1e..9cc8b9962c 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -691,7 +691,7 @@ namespace ExtUI { #endif feedRate_t getFeedrate_mm_s() { return feedrate_mm_s; } - int16_t getFlowPercentage(const extruder_t extr) { return planner.flow_percentage[extr]; } + int16_t getFlow_percent(const extruder_t extr) { return planner.flow_percentage[extr]; } feedRate_t getMinFeedrate_mm_s() { return planner.settings.min_feedrate_mm_s; } feedRate_t getMinTravelFeedrate_mm_s() { return planner.settings.min_travel_feedrate_mm_s; } float getPrintingAcceleration_mm_s2() { return planner.settings.acceleration; } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 04395bec4e..e6452243fd 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -129,7 +129,7 @@ namespace ExtUI { float getRetractAcceleration_mm_s2(); float getTravelAcceleration_mm_s2(); float getFeedrate_percent(); - int16_t getFlowPercentage(const extruder_t); + int16_t getFlow_percent(const extruder_t); inline uint8_t getProgress_percent() { return ui.get_progress_percent(); } From 8a8aeba17c09080814e62377221fd75db8a4b513 Mon Sep 17 00:00:00 2001 From: Adrian DC Date: Tue, 27 Apr 2021 06:42:28 +0200 Subject: [PATCH 1365/1370] Fix E3V2 Advanced Settings with PLR off (#21700) Fixes #21534 --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 51d192e26f..9fdf401b57 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -2381,10 +2381,12 @@ void Draw_AdvSet_Menu() { #endif if (AVISI(ADVSET_CASE_HEPID)) Draw_Menu_Line(ASCROL(ADVSET_CASE_HEPID), ICON_PIDNozzle, "Hotend PID", false); // Nozzle PID if (AVISI(ADVSET_CASE_BEDPID)) Draw_Menu_Line(ASCROL(ADVSET_CASE_BEDPID), ICON_PIDbed, "Bed PID", false); // Bed PID - if (AVISI(ADVSET_CASE_PWRLOSSR)) { - Draw_Menu_Line(ASCROL(ADVSET_CASE_PWRLOSSR), ICON_Motion, "Power-loss recovery", false); // Power-loss recovery - Draw_Chkb_Line(ASCROL(ADVSET_CASE_PWRLOSSR), recovery.enabled); - } + #if ENABLED(POWER_LOSS_RECOVERY) + if (AVISI(ADVSET_CASE_PWRLOSSR)) { + Draw_Menu_Line(ASCROL(ADVSET_CASE_PWRLOSSR), ICON_Motion, "Power-loss recovery", false); // Power-loss recovery + Draw_Chkb_Line(ASCROL(ADVSET_CASE_PWRLOSSR), recovery.enabled); + } + #endif if (select_advset.now) Draw_Menu_Cursor(ASCROL(select_advset.now)); } @@ -3409,10 +3411,12 @@ void HMI_AdvSet() { break; #endif - case ADVSET_CASE_PWRLOSSR: // Power-loss recovery - recovery.enable(!recovery.enabled); - Draw_Chkb_Line(ADVSET_CASE_PWRLOSSR + MROWS - index_advset, recovery.enabled); - break; + #if ENABLED(POWER_LOSS_RECOVERY) + case ADVSET_CASE_PWRLOSSR: // Power-loss recovery + recovery.enable(!recovery.enabled); + Draw_Chkb_Line(ADVSET_CASE_PWRLOSSR + MROWS - index_advset, recovery.enabled); + break; + #endif default: break; } } From 4da3f45f416266edeedb309cadd2d6f1e3c12a83 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 27 Apr 2021 00:22:09 -0700 Subject: [PATCH 1366/1370] BTT SKR V2.0 / Stepper Driver Anti-Reverse Protection (#21503) --- Marlin/Configuration_adv.h | 9 + Marlin/src/MarlinCore.cpp | 17 + Marlin/src/core/boards.h | 37 +- Marlin/src/feature/stepper_driver_safety.cpp | 171 +++++++ Marlin/src/feature/stepper_driver_safety.h | 28 ++ Marlin/src/inc/Conditionals_post.h | 4 + Marlin/src/lcd/language/language_en.h | 2 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h | 495 +++++++++++++++++++ ini/features.ini | 1 + ini/stm32f4.ini | 20 + platformio.ini | 1 + 12 files changed, 769 insertions(+), 18 deletions(-) create mode 100644 Marlin/src/feature/stepper_driver_safety.cpp create mode 100644 Marlin/src/feature/stepper_driver_safety.h create mode 100644 Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8cfaa95787..149ac610f5 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3387,6 +3387,15 @@ #define POWER_MONITOR_VOLTAGE_OFFSET 0 // Offset (in volts) applied to the calculated voltage #endif +/** + * Stepper Driver Anti-SNAFU Protection + * + * If the SAFE_POWER_PIN is defined for your board, Marlin will check + * that stepper drivers are properly plugged in before applying power. + * Disable protection if your stepper drivers don't support the feature. + */ +//#define DISABLE_DRIVER_SAFE_POWER_PROTECT + /** * CNC Coordinate Systems * diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 7139d54f25..209c9b59d0 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -232,6 +232,10 @@ #include "lcd/extui/lib/dgus/DGUSScreenHandler.h" #endif +#if HAS_DRIVER_SAFE_POWER_PROTECT + #include "feature/stepper_driver_safety.h" +#endif + PGMSTR(M112_KILL_STR, "M112 Shutdown"); MarlinState marlin_state = MF_INITIALIZING; @@ -1223,6 +1227,15 @@ void setup() { SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.) #endif + #if PIN_EXISTS(SAFE_POWER) + #if HAS_DRIVER_SAFE_POWER_PROTECT + SETUP_RUN(stepper_driver_backward_check()); + #else + SETUP_LOG("SAFE_POWER"); + OUT_WRITE(SAFE_POWER_PIN, HIGH); + #endif + #endif + #if ENABLED(PROBE_TARE) SETUP_RUN(probe.tare_init()); #endif @@ -1467,6 +1480,10 @@ void setup() { SETUP_RUN(test_tmc_connection(true, true, true, true)); #endif + #if HAS_DRIVER_SAFE_POWER_PROTECT + SETUP_RUN(stepper_driver_backward_report()); + #endif + #if HAS_PRUSA_MMU2 SETUP_RUN(mmu2.init()); #endif diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 377147504f..614a3b6e9e 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -363,25 +363,26 @@ #define BOARD_BLACK_STM32F407VE 4204 // BLACK_STM32F407VE #define BOARD_BLACK_STM32F407ZE 4205 // BLACK_STM32F407ZE #define BOARD_STEVAL_3DP001V1 4206 // STEVAL-3DP001V1 3D PRINTER BOARD -#define BOARD_BTT_SKR_PRO_V1_1 4207 // BigTreeTech SKR Pro v1.1 (STM32F407ZG) -#define BOARD_BTT_SKR_PRO_V1_2 4208 // BigTreeTech SKR Pro v1.2 (STM32F407ZG) -#define BOARD_BTT_BTT002_V1_0 4209 // BigTreeTech BTT002 v1.0 (STM32F407VG) +#define BOARD_BTT_SKR_PRO_V1_1 4207 // BigTreeTech SKR Pro v1.1 (STM32F407ZGT6) +#define BOARD_BTT_SKR_PRO_V1_2 4208 // BigTreeTech SKR Pro v1.2 (STM32F407ZGT6) +#define BOARD_BTT_BTT002_V1_0 4209 // BigTreeTech BTT002 v1.0 (STM32F407VGT6) #define BOARD_BTT_E3_RRF 4210 // BigTreeTech E3 RRF (STM32F407VGT6) -#define BOARD_BTT_GTR_V1_0 4211 // BigTreeTech GTR v1.0 (STM32F407IGT) -#define BOARD_LERDGE_K 4212 // Lerdge K (STM32F407ZG) -#define BOARD_LERDGE_S 4213 // Lerdge S (STM32F407VE) -#define BOARD_LERDGE_X 4214 // Lerdge X (STM32F407VE) -#define BOARD_VAKE403D 4215 // VAkE 403D (STM32F446VET6) -#define BOARD_FYSETC_S6 4216 // FYSETC S6 (STM32F446VET6) -#define BOARD_FYSETC_S6_V2_0 4217 // FYSETC S6 v2.0 (STM32F446VET6) -#define BOARD_FYSETC_SPIDER 4218 // FYSETC Spider (STM32F446VET6) -#define BOARD_FLYF407ZG 4219 // FLYF407ZG (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4220 // MKS_ROBIN2 (STM32F407ZE) -#define BOARD_MKS_ROBIN_PRO_V2 4221 // MKS Robin Pro V2 (STM32F407VE) -#define BOARD_MKS_ROBIN_NANO_V3 4222 // MKS Robin Nano V3 (STM32F407VG) -#define BOARD_ANET_ET4 4223 // ANET ET4 V1.x (STM32F407VGT6) -#define BOARD_ANET_ET4P 4224 // ANET ET4P V1.x (STM32F407VGT6) -#define BOARD_FYSETC_CHEETAH_V20 4225 // FYSETC Cheetah V2.0 +#define BOARD_BTT_SKR_V2_0 4211 // BigTreeTech SKR v2.0 (STM32F407VGT6) +#define BOARD_BTT_GTR_V1_0 4212 // BigTreeTech GTR v1.0 (STM32F407IGT) +#define BOARD_LERDGE_K 4213 // Lerdge K (STM32F407ZG) +#define BOARD_LERDGE_S 4214 // Lerdge S (STM32F407VE) +#define BOARD_LERDGE_X 4215 // Lerdge X (STM32F407VE) +#define BOARD_VAKE403D 4216 // VAkE 403D (STM32F446VET6) +#define BOARD_FYSETC_S6 4217 // FYSETC S6 (STM32F446VET6) +#define BOARD_FYSETC_S6_V2_0 4218 // FYSETC S6 v2.0 (STM32F446VET6) +#define BOARD_FYSETC_SPIDER 4219 // FYSETC Spider (STM32F446VET6) +#define BOARD_FLYF407ZG 4220 // FLYF407ZG (STM32F407ZG) +#define BOARD_MKS_ROBIN2 4221 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_MKS_ROBIN_PRO_V2 4222 // MKS Robin Pro V2 (STM32F407VE) +#define BOARD_MKS_ROBIN_NANO_V3 4223 // MKS Robin Nano V3 (STM32F407VG) +#define BOARD_ANET_ET4 4224 // ANET ET4 V1.x (STM32F407VGT6) +#define BOARD_ANET_ET4P 4225 // ANET ET4P V1.x (STM32F407VGT6) +#define BOARD_FYSETC_CHEETAH_V20 4226 // FYSETC Cheetah V2.0 // // ARM Cortex M7 diff --git a/Marlin/src/feature/stepper_driver_safety.cpp b/Marlin/src/feature/stepper_driver_safety.cpp new file mode 100644 index 0000000000..991f5a5906 --- /dev/null +++ b/Marlin/src/feature/stepper_driver_safety.cpp @@ -0,0 +1,171 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../inc/MarlinConfig.h" +#include "../lcd/marlinui.h" + +#if HAS_DRIVER_SAFE_POWER_PROTECT + +#include "stepper_driver_safety.h" + +static uint32_t axis_plug_backward = 0; + +void stepper_driver_backward_error(PGM_P str) { + SERIAL_ERROR_START(); + SERIAL_ECHOPGM_P(str); + SERIAL_ECHOLNPGM(" driver is backward!"); + ui.status_printf_P(2, PSTR(S_FMT S_FMT), str, GET_TEXT(MSG_DRIVER_BACKWARD)); +} + +void stepper_driver_backward_check() { + + OUT_WRITE(SAFE_POWER_PIN, LOW); + + #define TEST_BACKWARD(AXIS, BIT) do { \ + SET_INPUT(AXIS##_ENABLE_PIN); \ + OUT_WRITE(AXIS##_STEP_PIN, false); \ + delay(20); \ + if (READ(AXIS##_ENABLE_PIN) == false) { \ + SBI(axis_plug_backward, BIT); \ + stepper_driver_backward_error(PSTR(STRINGIFY(AXIS))); \ + } \ + }while(0) + + #if HAS_X_ENABLE + TEST_BACKWARD(X, 0); + #endif + #if HAS_X2_ENABLE + TEST_BACKWARD(X2, 1); + #endif + + #if HAS_Y_ENABLE + TEST_BACKWARD(Y, 2); + #endif + #if HAS_Y2_ENABLE + TEST_BACKWARD(Y2, 3); + #endif + + #if HAS_Z_ENABLE + TEST_BACKWARD(Z, 4); + #endif + #if HAS_Z2_ENABLE + TEST_BACKWARD(Z2, 5); + #endif + #if HAS_Z3_ENABLE + TEST_BACKWARD(Z3, 6); + #endif + #if HAS_Z4_ENABLE + TEST_BACKWARD(Z4, 7); + #endif + + #if HAS_E0_ENABLE + TEST_BACKWARD(E0, 8); + #endif + #if HAS_E1_ENABLE + TEST_BACKWARD(E1, 9); + #endif + #if HAS_E2_ENABLE + TEST_BACKWARD(E2, 10); + #endif + #if HAS_E3_ENABLE + TEST_BACKWARD(E3, 11); + #endif + #if HAS_E4_ENABLE + TEST_BACKWARD(E4, 12); + #endif + #if HAS_E5_ENABLE + TEST_BACKWARD(E5, 13); + #endif + #if HAS_E6_ENABLE + TEST_BACKWARD(E6, 14); + #endif + #if HAS_E7_ENABLE + TEST_BACKWARD(E7, 15); + #endif + + if (!axis_plug_backward) + WRITE(SAFE_POWER_PIN, HIGH); +} + +void stepper_driver_backward_report() { + if (!axis_plug_backward) return; + + auto _report_if_backward = [](PGM_P axis, uint8_t bit) { + if (TEST(axis_plug_backward, bit)) + stepper_driver_backward_error(axis); + }; + + #define REPORT_BACKWARD(axis, bit) _report_if_backward(PSTR(STRINGIFY(axis)), bit) + + #if HAS_X_ENABLE + REPORT_BACKWARD(X, 0); + #endif + #if HAS_X2_ENABLE + REPORT_BACKWARD(X2, 1); + #endif + + #if HAS_Y_ENABLE + REPORT_BACKWARD(Y, 2); + #endif + #if HAS_Y2_ENABLE + REPORT_BACKWARD(Y2, 3); + #endif + + #if HAS_Z_ENABLE + REPORT_BACKWARD(Z, 4); + #endif + #if HAS_Z2_ENABLE + REPORT_BACKWARD(Z2, 5); + #endif + #if HAS_Z3_ENABLE + REPORT_BACKWARD(Z3, 6); + #endif + #if HAS_Z4_ENABLE + REPORT_BACKWARD(Z4, 7); + #endif + + #if HAS_E0_ENABLE + REPORT_BACKWARD(E0, 8); + #endif + #if HAS_E1_ENABLE + REPORT_BACKWARD(E1, 9); + #endif + #if HAS_E2_ENABLE + REPORT_BACKWARD(E2, 10); + #endif + #if HAS_E3_ENABLE + REPORT_BACKWARD(E3, 11); + #endif + #if HAS_E4_ENABLE + REPORT_BACKWARD(E4, 12); + #endif + #if HAS_E5_ENABLE + REPORT_BACKWARD(E5, 13); + #endif + #if HAS_E6_ENABLE + REPORT_BACKWARD(E6, 14); + #endif + #if HAS_E7_ENABLE + REPORT_BACKWARD(E7, 15); + #endif +} + +#endif // HAS_DRIVER_SAFE_POWER_PROTECT diff --git a/Marlin/src/feature/stepper_driver_safety.h b/Marlin/src/feature/stepper_driver_safety.h new file mode 100644 index 0000000000..46edf3390d --- /dev/null +++ b/Marlin/src/feature/stepper_driver_safety.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + + +#include "../inc/MarlinConfigPre.h" + +void stepper_driver_backward_check(); +void stepper_driver_backward_report(); diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 772c8bc3c1..208c875982 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -3042,3 +3042,7 @@ #if BUTTONS_EXIST(EN1, EN2, ENC) #define HAS_ROTARY_ENCODER 1 #endif + +#if PIN_EXISTS(SAFE_POWER) && DISABLED(DISABLE_DRIVER_SAFE_POWER_PROTECT) + #define HAS_DRIVER_SAFE_POWER_PROTECT 1 +#endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 12c5a6e42d..f217c96749 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -706,6 +706,8 @@ namespace Language_en { PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Bottom Right"); PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Calibration Completed"); PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Calibration Failed"); + + PROGMEM Language_Str MSG_DRIVER_BACKWARD = _UxGT(" driver backward"); } #if FAN_COUNT == 1 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index c2d6b30703..adcf29e5c6 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -596,6 +596,8 @@ #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 #elif MB(BTT_E3_RRF) #include "stm32f4/pins_BTT_E3_RRF.h" // STM32F4 env:BIGTREE_E3_RRF +#elif MB(BTT_SKR_V2_0) + #include "stm32f4/pins_BTT_SKR_V2_0.h" // STM32F4 env:BIGTREE_SKR_2 #elif MB(LERDGE_K) #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:LERDGEK env:LERDGEK_usb_flash_drive #elif MB(LERDGE_S) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h new file mode 100644 index 0000000000..fa08aedbb0 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h @@ -0,0 +1,495 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "env_validate.h" + +#define BOARD_INFO_NAME "BTT SKR V2.0" + +// Use one of these or SDCard-based Emulation will be used +#if NO_EEPROM_SELECTED + //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation + #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#endif + +// USB Flash Drive support +#define HAS_OTG_USB_HOST_SUPPORT + +// Avoid conflict with TIMER_TONE +#define STEP_TIMER 10 + +// +// Servos +// +#define SERVO0_PIN PE5 + +// +// Trinamic Stallguard pins +// +#define X_DIAG_PIN PC1 // X-STOP +#define Y_DIAG_PIN PC3 // Y-STOP +#define Z_DIAG_PIN PC0 // Z-STOP +#define E0_DIAG_PIN PC2 // E0DET +#define E1_DIAG_PIN PA0 // E1DET + +// +// Limit Switches +// +#ifdef X_STALL_SENSITIVITY + #define X_STOP_PIN X_DIAG_PIN + #if X_HOME_DIR < 0 + #define X_MAX_PIN PC2 // E0DET + #else + #define X_MIN_PIN PC2 // E0DET + #endif +#elif ENABLED(X_DUAL_ENDSTOPS) + #ifndef X_MIN_PIN + #define X_MIN_PIN PC1 // X-STOP + #endif + #ifndef X_MAX_PIN + #define X_MAX_PIN PC2 // E0DET + #endif +#else + #define X_STOP_PIN PC1 // X-STOP +#endif + +#ifdef Y_STALL_SENSITIVITY + #define Y_STOP_PIN Y_DIAG_PIN + #if Y_HOME_DIR < 0 + #define Y_MAX_PIN PA0 // E1DET + #else + #define Y_MIN_PIN PA0 // E1DET + #endif +#elif ENABLED(Y_DUAL_ENDSTOPS) + #ifndef Y_MIN_PIN + #define Y_MIN_PIN PC3 // Y-STOP + #endif + #ifndef Y_MAX_PIN + #define Y_MAX_PIN PA0 // E1DET + #endif +#else + #define Y_STOP_PIN PC3 // Y-STOP +#endif + +#ifdef Z_STALL_SENSITIVITY + #define Z_STOP_PIN Z_DIAG_PIN + #if Z_HOME_DIR < 0 + #define Z_MAX_PIN PC15 // PWRDET + #else + #define Z_MIN_PIN PC15 // PWRDET + #endif +#elif ENABLED(Z_MULTI_ENDSTOPS) + #ifndef Z_MIN_PIN + #define Z_MIN_PIN PC0 // Z-STOP + #endif + #ifndef Z_MAX_PIN + #define Z_MAX_PIN PC15 // PWRDET + #endif +#else + #ifndef Z_STOP_PIN + #define Z_STOP_PIN PC0 // Z-STOP + #endif +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PE4 +#endif + +// +// Filament Runout Sensor +// +#define FIL_RUNOUT_PIN PC2 // E0DET +#define FIL_RUNOUT2_PIN PA0 // E1DET + +// +// Power Supply Control +// +#ifndef PS_ON_PIN + #define PS_ON_PIN PE8 // PS-ON +#endif + +// +// Power Loss Detection +// +#ifndef POWER_LOSS_PIN + #define POWER_LOSS_PIN PC15 // PWRDET +#endif + +// +// NeoPixel LED +// +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN PE6 +#endif + +// +// Control pin of driver/heater/fan power supply +// +#define SAFE_POWER_PIN PC13 + +// +// Steppers +// +#define X_STEP_PIN PE2 +#define X_DIR_PIN PE1 +#define X_ENABLE_PIN PE3 +#ifndef X_CS_PIN + #define X_CS_PIN PE0 +#endif + +#define Y_STEP_PIN PD5 +#define Y_DIR_PIN PD4 +#define Y_ENABLE_PIN PD6 +#ifndef Y_CS_PIN + #define Y_CS_PIN PD3 +#endif + +#define Z_STEP_PIN PA15 +#define Z_DIR_PIN PA8 +#define Z_ENABLE_PIN PD1 +#ifndef Z_CS_PIN + #define Z_CS_PIN PD0 +#endif + +#define E0_STEP_PIN PD15 +#define E0_DIR_PIN PD14 +#define E0_ENABLE_PIN PC7 +#ifndef E0_CS_PIN + #define E0_CS_PIN PC6 +#endif + +#define E1_STEP_PIN PD11 +#define E1_DIR_PIN PD10 +#define E1_ENABLE_PIN PD13 +#ifndef E1_CS_PIN + #define E1_CS_PIN PD12 +#endif + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA1 // TB +#define TEMP_0_PIN PA2 // TH0 +#define TEMP_1_PIN PA3 // TH1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB3 // Heater0 +#define HEATER_1_PIN PB4 // Heater1 +#define HEATER_BED_PIN PD7 // Hotbed +#define FAN_PIN PB7 // Fan0 +#define FAN1_PIN PB6 // Fan1 +#define FAN2_PIN PB5 // Fan2 + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PE14 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PA14 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PE15 + #endif +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial1 + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + #define X_SERIAL_TX_PIN PE0 + #define X_SERIAL_RX_PIN PE0 + + #define Y_SERIAL_TX_PIN PD3 + #define Y_SERIAL_RX_PIN PD3 + + #define Z_SERIAL_TX_PIN PD0 + #define Z_SERIAL_RX_PIN PD0 + + #define E0_SERIAL_TX_PIN PC6 + #define E0_SERIAL_RX_PIN PC6 + + #define E1_SERIAL_TX_PIN PD12 + #define E1_SERIAL_RX_PIN PD12 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// SD Connection +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION LCD +#endif + +/** + * ----- ----- + * NC | 1 2 | GND 5V | 1 2 | GND + * RESET | 3 4 | PC4 (SD_DETECT) (LCD_D7) PE13 | 3 4 | PE12 (LCD_D6) + * (MOSI) PA7 | 5 6 PB2 (BTN_EN2) (LCD_D5) PE11 | 5 6 PE10 (LCD_D4) + * (SD_SS) PA4 | 7 8 | PE7 (BTN_EN1) (LCD_RS) PE9 | 7 8 | PB1 (LCD_EN) + * (SCK) PA5 | 9 10| PA6 (MISO) (BTN_ENC) PB0 | 9 10| PC5 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ + +#define EXP1_03_PIN PE13 +#define EXP1_04_PIN PE12 +#define EXP1_05_PIN PE11 +#define EXP1_06_PIN PE10 +#define EXP1_07_PIN PE9 +#define EXP1_08_PIN PB1 +#define EXP1_09_PIN PB0 +#define EXP1_10_PIN PC5 + +#define EXP2_03_PIN -1 +#define EXP2_04_PIN PC4 +#define EXP2_05_PIN PA7 +#define EXP2_06_PIN PB2 +#define EXP2_07_PIN PA4 +#define EXP2_08_PIN PE7 +#define EXP2_09_PIN PA5 +#define EXP2_10_PIN PA6 + +// +// Onboard SD card +// Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2 +// +#if SD_CONNECTION_IS(ONBOARD) + + #define SDIO_SUPPORT // Use SDIO for onboard SD + #define SDIO_D0_PIN PC8 + #define SDIO_D1_PIN PC9 + #define SDIO_D2_PIN PC10 + #define SDIO_D3_PIN PC11 + #define SDIO_CK_PIN PC12 + #define SDIO_CMD_PIN PD2 + +#elif SD_CONNECTION_IS(LCD) + + #define CUSTOM_SPI_PINS + #define SDSS PA4 + #define SD_SS_PIN SDSS + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PA7 + #define SD_DETECT_PIN PC4 + +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" +#endif + +#if ENABLED(BTT_MOTOR_EXPANSION) + /** + * _____ _____ + * NC | · · | GND NC | · · | GND + * NC | · · | PF12 (M1EN) (M2EN) PG7 | · · | PG6 (M3EN) + * (M1STP) PB15 | · · PF11 (M1DIR) (M1RX) PG3 | · · PG2 (M1DIAG) + * (M2DIR) PB12 | · · | PG10 (M2STP) (M2RX) PD10 | · · | PD11 (M2DIAG) + * (M3DIR) PB13 | · · | PB14 (M3STP) (M3RX) PA8 | · · | PG4 (M3DIAG) + * ----- ----- + * EXP2 EXP1 + */ + + // M1 on Driver Expansion Module + #define E3_STEP_PIN EXP2_05_PIN + #define E3_DIR_PIN EXP2_06_PIN + #define E3_ENABLE_PIN EXP2_04_PIN + #define E3_DIAG_PIN EXP1_06_PIN + #define E3_CS_PIN EXP1_05_PIN + #if HAS_TMC_UART + #define E3_SERIAL_TX_PIN EXP1_05_PIN + #define E3_SERIAL_RX_PIN EXP1_05_PIN + #endif + + // M2 on Driver Expansion Module + #define E4_STEP_PIN EXP2_08_PIN + #define E4_DIR_PIN EXP2_07_PIN + #define E4_ENABLE_PIN EXP1_03_PIN + #define E4_DIAG_PIN EXP1_08_PIN + #define E4_CS_PIN EXP1_07_PIN + #if HAS_TMC_UART + #define E4_SERIAL_TX_PIN EXP1_07_PIN + #define E4_SERIAL_RX_PIN EXP1_07_PIN + #endif + + // M3 on Driver Expansion Module + #define E5_STEP_PIN EXP2_10_PIN + #define E5_DIR_PIN EXP2_09_PIN + #define E5_ENABLE_PIN EXP1_04_PIN + #define E5_DIAG_PIN EXP1_10_PIN + #define E5_CS_PIN EXP1_09_PIN + #if HAS_TMC_UART + #define E5_SERIAL_TX_PIN EXP1_09_PIN + #define E5_SERIAL_RX_PIN EXP1_09_PIN + #endif + +#endif // BTT_MOTOR_EXPANSION + +// +// LCDs and Controllers +// +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS EXP2_08_PIN + #endif + +#elif HAS_WIRED_LCD + + #define BEEPER_PIN EXP1_10_PIN + #define BTN_ENC EXP1_09_PIN + + #if ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS EXP1_04_PIN + + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN + + #define LCD_PINS_ENABLE EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN + + // CR10_STOCKDISPLAY default timing is too fast + #undef BOARD_ST7920_DELAY_1 + #undef BOARD_ST7920_DELAY_2 + #undef BOARD_ST7920_DELAY_3 + + #elif ENABLED(MKS_MINI_12864) + + #define DOGLCD_A0 EXP1_04_PIN + #define DOGLCD_CS EXP1_05_PIN + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN + + #else + + #define LCD_PINS_RS EXP1_07_PIN + + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN + + #define LCD_PINS_ENABLE EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN + + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS EXP1_08_PIN + #define DOGLCD_A0 EXP1_07_PIN + //#define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN EXP1_06_PIN // Must be high or open for LCD to operate normally. + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN EXP1_05_PIN + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN EXP1_04_PIN + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN EXP1_03_PIN + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN EXP1_05_PIN + #endif + #endif // !FYSETC_MINI_12864 + + #if IS_ULTIPANEL + #define LCD_PINS_D5 EXP1_05_PIN + #define LCD_PINS_D6 EXP1_04_PIN + #define LCD_PINS_D7 EXP1_03_PIN + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + + #endif + + #endif + +#endif // HAS_WIRED_LCD + +// Alter timing for graphical display +#if HAS_MARLINUI_U8GLIB + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #endif +#endif + +// +// WIFI +// + +/** + * ------- + * GND | 9 | | 8 | 3.3V + * (ESP-CS) PB12 | 10 | | 7 | PB15 (ESP-MOSI) + * 3.3V | 11 | | 6 | PB14 (ESP-MISO) + * (ESP-IO0) PB10 | 12 | | 5 | PB13 (ESP-CLK) + * (ESP-IO4) PB11 | 13 | | 4 | NC + * NC | 14 | | 3 | 3.3V (ESP-EN) + * (ESP-RX) PD8 | 15 | | 2 | NC + * (ESP-TX) PD9 | 16 | | 1 | PC14 (ESP-RST) + * ------- + * WIFI + */ +#define ESP_WIFI_MODULE_COM 3 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this +#define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT & SERIAL_PORT_2 +#define ESP_WIFI_MODULE_RESET_PIN PC14 +#define ESP_WIFI_MODULE_GPIO0_PIN PB10 +#define ESP_WIFI_MODULE_GPIO4_PIN PB11 diff --git a/ini/features.ini b/ini/features.ini index 118392d6d7..9d8bac5713 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -134,6 +134,7 @@ HAS_FILAMENT_SENSOR = src_filter=+ + + MK2_MULTIPLEXER = src_filter=+ HAS_CUTTER = src_filter=+ + +HAS_DRIVER_SAFE_POWER_PROTECT = src_filter=+ EXPERIMENTAL_I2CBUS = src_filter=+ + MECHANICAL_GANTRY_CAL.+ = src_filter=+ Z_MULTI_ENDSTOPS = src_filter=+ diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 881dd17b01..1678b26d89 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -225,6 +225,26 @@ build_flags = ${common_stm32.build_flags} extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +# +# Bigtreetech SKR V2.0 (STM32F407VGT6 ARM Cortex-M4) with USB Flash Drive Support +# +[env:BIGTREE_SKR_2] +platform = ${common_stm32.platform} +platform_packages = ${stm_flash_drive.platform_packages} +extends = common_stm32 +board = genericSTM32F407VGT6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.offset = 0x8000 +board_upload.offset_address = 0x08008000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py +build_flags = ${stm_flash_drive.build_flags} + -DUSE_USBHOST_HS -DUSE_USB_HS_IN_FS -DUSBD_IRQ_PRIO=5 -DUSBD_IRQ_SUBPRIO=6 + -DHSE_VALUE=8000000U -DHAL_SD_MODULE_ENABLED + # # Lerdge base # diff --git a/platformio.ini b/platformio.ini index d17c283b72..bbc9ffd904 100644 --- a/platformio.ini +++ b/platformio.ini @@ -136,6 +136,7 @@ default_src_filter = + - - + - - - - - + - - - - - From 0db64af9b242e2eb1b9f876a5320f0d9c6b8afdb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 27 Apr 2021 04:49:21 -0500 Subject: [PATCH 1367/1370] Rename, clean up boards/variants (#21655) * Consolidate variant scripts * Rename Marlin-local boards * Simplify variants where possible * Rename variants * CHITU_F103 and MEEB_3DP: Maple platform `platformio-build-stm32f1.py` uses the 'board' name, not 'board_build.variant' so folder names match 'board' and not `board_build.variant`. --- .github/workflows/test-builds.yml | 1 + buildroot/share/PlatformIO/boards/LERDGE.json | 65 --------------- .../share/PlatformIO/boards/fysetc_f6.json | 34 -------- ...R_SE_BX.json => marlin_BTT_SKR_SE_BX.json} | 2 +- ...Btt002.json => marlin_BigTree_BTT002.json} | 2 +- ...GTR_v1.json => marlin_BigTree_GTR_v1.json} | 2 +- ...R_Pro.json => marlin_BigTree_SKR_Pro.json} | 2 +- ...CHITU_F103.json => marlin_CHITU_F103.json} | 3 +- ...20.json => marlin_FYSETC_CHEETAH_V20.json} | 2 +- .../{MEEB_3DP.json => marlin_MEEB_3DP.json} | 2 +- ...VE.json => marlin_STEVAL_STM32F401VE.json} | 3 +- ...GT6.json => marlin_STM32F407VGT6_CCM.json} | 0 ...YF407ZG.json => marlin_STM32F407ZGT6.json} | 5 +- .../{archim.json => marlin_archim.json} | 2 +- ...90usb1286.json => marlin_at90usb1286.json} | 0 ...T6.json => marlin_blackSTM32F407VET6.json} | 0 ...malyanM200.json => marlin_malyanM200.json} | 0 ...anM200v2.json => marlin_malyanM200v2.json} | 0 .../scripts/STM32F103RC_MEEB_3DP.py | 10 +-- .../scripts/STM32F103RC_SKR_MINI.py | 23 ------ .../PlatformIO/scripts/STM32F103RC_fysetc.py | 15 +--- .../scripts/STM32F103RET6_creality.py | 20 ----- .../scripts/STM32F103RE_SKR_E3_DIP.py | 19 ----- .../PlatformIO/scripts/STM32F103VE_longer.py | 26 ++---- .../scripts/STM32F1_create_variant.py | 13 +-- .../PlatformIO/scripts/STM32F401VE_STEVAL.py | 13 --- .../share/PlatformIO/scripts/chitu_crypt.py | 24 ++---- .../copy_marlin_variant_to_framework.py | 49 ------------ .../share/PlatformIO/scripts/custom_board.py | 13 +++ .../PlatformIO/scripts/download_mks_assets.py | 3 +- .../share/PlatformIO/scripts/fly_mini.py | 20 ----- .../PlatformIO/scripts/fysetc_cheetah_v20.py | 13 --- .../scripts/generic_create_variant.py | 56 +++++++++---- .../jgaurora_a5s_a1_with_bootloader.py | 51 +++++------- buildroot/share/PlatformIO/scripts/lerdge.py | 24 +++--- buildroot/share/PlatformIO/scripts/marlin.py | 75 ++++++++++++++++++ .../share/PlatformIO/scripts/mks_encrypt.py | 46 +++++------ .../share/PlatformIO/scripts/mks_robin.py | 44 ++-------- .../share/PlatformIO/scripts/mks_robin_e3.py | 45 ++--------- .../share/PlatformIO/scripts/mks_robin_e3p.py | 45 ++--------- .../PlatformIO/scripts/mks_robin_lite.py | 45 ++--------- .../PlatformIO/scripts/mks_robin_lite3.py | 45 ++--------- .../PlatformIO/scripts/mks_robin_mini.py | 45 ++--------- .../PlatformIO/scripts/mks_robin_nano.py | 45 ++--------- .../PlatformIO/scripts/mks_robin_nano35.py | 45 ++--------- .../share/PlatformIO/scripts/mks_robin_pro.py | 44 ++-------- .../PlatformIO/scripts/stm32_bootloader.py | 33 ++++---- .../{archim => MARLIN_ARCHIM}/.gitignore | 0 .../build_gcc/Makefile | 0 .../build_gcc/debug.mk | 0 .../build_gcc/gcc.mk | 0 .../build_gcc/libvariant_arduino_due_x.mk | 0 .../build_gcc/release.mk | 0 .../debug_scripts/gcc/arduino_due_x_flash.gdb | 0 .../debug_scripts/gcc/arduino_due_x_sram.gdb | 0 .../debug_scripts/iar/arduino_due_flash.mac | 0 .../debug_scripts/iar/arduino_due_sram.mac | 0 .../libsam_sam3x8e_gcc_rel.a | Bin .../libsam_sam3x8e_gcc_rel.a.txt | 0 .../linker_scripts/gcc/flash.ld | 0 .../linker_scripts/gcc/sram.ld | 0 .../linker_scripts/iar/flash.icf | 0 .../linker_scripts/iar/sram.icf | 0 .../{archim => MARLIN_ARCHIM}/pins_arduino.h | 0 .../{archim => MARLIN_ARCHIM}/variant.cpp | 0 .../{archim => MARLIN_ARCHIM}/variant.h | 0 .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../hal_conf_extra.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../hal_conf_extra.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../hal_conf_extra.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../hal_conf_extra.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../hal_conf_extra.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../hal_conf_custom.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../PeripheralPins.c | 0 .../{LERDGE => MARLIN_LERDGE}/PinNamesVar.h | 0 .../MARLIN_LERDGE/ldscript.ld} | 0 .../{LERDGE => MARLIN_LERDGE}/variant.cpp | 0 .../{LERDGE => MARLIN_LERDGE}/variant.h | 0 .../pins_arduino.h | 0 .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../hal_conf_custom.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../board.cpp | 0 .../board/board.h | 0 .../ld/common.inc | 0 .../ld/extra_libs.inc | 0 .../marlin_CHITU_F103/ld/flash.ld} | 0 .../ld/stm32f103z_dfu.ld | 0 .../ld/stm32f103zc.ld | 0 .../ld/stm32f103zd.ld | 0 .../ld/stm32f103ze.ld | 0 .../ld/vector_symbols.inc | 0 .../pins_arduino.h | 0 .../variant.h | 0 .../wirish/boards.cpp | 0 .../wirish/boards_setup.cpp | 0 .../wirish/start.S | 0 .../wirish/start_c.c | 0 .../wirish/syscalls.c | 0 .../{MEEB_3DP => marlin_MEEB_3DP}/board.cpp | 0 .../board/board.h | 0 .../ld/bootloader.ld | 0 .../ld/common.inc | 0 .../ld/extra_libs.inc | 0 .../{MEEB_3DP => marlin_MEEB_3DP}/ld/flash.ld | 0 .../{MEEB_3DP => marlin_MEEB_3DP}/ld/jtag.ld | 0 .../ld/mem-flash.inc | 0 .../ld/mem-jtag.inc | 0 .../ld/mem-ram.inc | 0 .../{MEEB_3DP => marlin_MEEB_3DP}/ld/ram.ld | 0 .../ld/stm32f103rb.ld | 0 .../ld/stm32f103rb_bootloader.ld | 0 .../ld/stm32f103rc.ld | 0 .../ld/stm32f103rc_bootloader.ld | 0 .../ld/stm32f103re.ld | 0 .../ld/vector_symbols.inc | 0 .../pins_arduino.h | 0 .../{MEEB_3DP => marlin_MEEB_3DP}/variant.h | 0 .../wirish/boards.cpp | 0 .../wirish/boards_setup.cpp | 0 .../wirish/start.S | 0 .../wirish/start_c.c | 0 .../wirish/syscalls.c | 0 buildroot/tests/chitu_f103 | 16 ++++ ini/avr.ini | 12 +-- ini/due.ini | 2 +- ini/stm32f0.ini | 2 +- ini/stm32f1.ini | 25 ++++-- ini/stm32f4.ini | 47 ++++++----- ini/stm32f7.ini | 2 +- 167 files changed, 340 insertions(+), 840 deletions(-) delete mode 100644 buildroot/share/PlatformIO/boards/LERDGE.json delete mode 100644 buildroot/share/PlatformIO/boards/fysetc_f6.json rename buildroot/share/PlatformIO/boards/{BTT_SKR_SE_BX.json => marlin_BTT_SKR_SE_BX.json} (97%) rename buildroot/share/PlatformIO/boards/{BigTree_Btt002.json => marlin_BigTree_BTT002.json} (96%) rename buildroot/share/PlatformIO/boards/{BigTree_GTR_v1.json => marlin_BigTree_GTR_v1.json} (96%) rename buildroot/share/PlatformIO/boards/{BigTree_SKR_Pro.json => marlin_BigTree_SKR_Pro.json} (95%) rename buildroot/share/PlatformIO/boards/{CHITU_F103.json => marlin_CHITU_F103.json} (93%) rename buildroot/share/PlatformIO/boards/{FYSETC_CHEETAH_V20.json => marlin_FYSETC_CHEETAH_V20.json} (96%) rename buildroot/share/PlatformIO/boards/{MEEB_3DP.json => marlin_MEEB_3DP.json} (97%) rename buildroot/share/PlatformIO/boards/{STEVAL_STM32F401VE.json => marlin_STEVAL_STM32F401VE.json} (95%) rename buildroot/share/PlatformIO/boards/{genericSTM32F407VGT6.json => marlin_STM32F407VGT6_CCM.json} (100%) rename buildroot/share/PlatformIO/boards/{FLYF407ZG.json => marlin_STM32F407ZGT6.json} (94%) rename buildroot/share/PlatformIO/boards/{archim.json => marlin_archim.json} (97%) rename buildroot/share/PlatformIO/boards/{at90usb1286.json => marlin_at90usb1286.json} (100%) rename buildroot/share/PlatformIO/boards/{blackSTM32F407VET6.json => marlin_blackSTM32F407VET6.json} (100%) rename buildroot/share/PlatformIO/boards/{malyanM200.json => marlin_malyanM200.json} (100%) rename buildroot/share/PlatformIO/boards/{malyanM200v2.json => marlin_malyanM200v2.json} (100%) delete mode 100644 buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py delete mode 100644 buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py delete mode 100644 buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py delete mode 100644 buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py delete mode 100644 buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py create mode 100644 buildroot/share/PlatformIO/scripts/custom_board.py delete mode 100644 buildroot/share/PlatformIO/scripts/fly_mini.py delete mode 100644 buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py create mode 100644 buildroot/share/PlatformIO/scripts/marlin.py rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/.gitignore (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/build_gcc/Makefile (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/build_gcc/debug.mk (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/build_gcc/gcc.mk (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/build_gcc/libvariant_arduino_due_x.mk (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/build_gcc/release.mk (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/debug_scripts/gcc/arduino_due_x_flash.gdb (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/debug_scripts/gcc/arduino_due_x_sram.gdb (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/debug_scripts/iar/arduino_due_flash.mac (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/debug_scripts/iar/arduino_due_sram.mac (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/libsam_sam3x8e_gcc_rel.a (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/libsam_sam3x8e_gcc_rel.a.txt (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/linker_scripts/gcc/flash.ld (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/linker_scripts/gcc/sram.ld (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/linker_scripts/iar/flash.icf (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/linker_scripts/iar/sram.icf (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/pins_arduino.h (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{archim => MARLIN_ARCHIM}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_BTT002 => MARLIN_BIGTREE_BTT002}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_BTT002 => MARLIN_BIGTREE_BTT002}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_BTT002 => MARLIN_BIGTREE_BTT002}/hal_conf_extra.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_BTT002 => MARLIN_BIGTREE_BTT002}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_BTT002 => MARLIN_BIGTREE_BTT002}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_BTT002 => MARLIN_BIGTREE_BTT002}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_E3_RRF => MARLIN_BIGTREE_E3_RRF}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_E3_RRF => MARLIN_BIGTREE_E3_RRF}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_E3_RRF => MARLIN_BIGTREE_E3_RRF}/hal_conf_extra.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_E3_RRF => MARLIN_BIGTREE_E3_RRF}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_E3_RRF => MARLIN_BIGTREE_E3_RRF}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_E3_RRF => MARLIN_BIGTREE_E3_RRF}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_GTR_V1 => MARLIN_BIGTREE_GTR_V1}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_GTR_V1 => MARLIN_BIGTREE_GTR_V1}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_GTR_V1 => MARLIN_BIGTREE_GTR_V1}/hal_conf_extra.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_GTR_V1 => MARLIN_BIGTREE_GTR_V1}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_GTR_V1 => MARLIN_BIGTREE_GTR_V1}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_GTR_V1 => MARLIN_BIGTREE_GTR_V1}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_SKR_PRO_1v1 => MARLIN_BIGTREE_SKR_PRO_11}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_SKR_PRO_1v1 => MARLIN_BIGTREE_SKR_PRO_11}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_SKR_PRO_1v1 => MARLIN_BIGTREE_SKR_PRO_11}/hal_conf_extra.h (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_SKR_PRO_1v1 => MARLIN_BIGTREE_SKR_PRO_11}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_SKR_PRO_1v1 => MARLIN_BIGTREE_SKR_PRO_11}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{BIGTREE_SKR_PRO_1v1 => MARLIN_BIGTREE_SKR_PRO_11}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{BTT_SKR_SE_BX => MARLIN_BTT_SKR_SE_BX}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{BTT_SKR_SE_BX => MARLIN_BTT_SKR_SE_BX}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{BTT_SKR_SE_BX => MARLIN_BTT_SKR_SE_BX}/hal_conf_extra.h (100%) rename buildroot/share/PlatformIO/variants/{BTT_SKR_SE_BX => MARLIN_BTT_SKR_SE_BX}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{BTT_SKR_SE_BX => MARLIN_BTT_SKR_SE_BX}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{BTT_SKR_SE_BX => MARLIN_BTT_SKR_SE_BX}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{FLY_F407ZG => MARLIN_FLY_F407ZG}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{FLY_F407ZG => MARLIN_FLY_F407ZG}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{FLY_F407ZG => MARLIN_FLY_F407ZG}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{FLY_F407ZG => MARLIN_FLY_F407ZG}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{FLY_F407ZG => MARLIN_FLY_F407ZG}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_CHEETAH_V20 => MARLIN_FYSETC_CHEETAH_V20}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_CHEETAH_V20 => MARLIN_FYSETC_CHEETAH_V20}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_CHEETAH_V20 => MARLIN_FYSETC_CHEETAH_V20}/hal_conf_custom.h (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_CHEETAH_V20 => MARLIN_FYSETC_CHEETAH_V20}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_CHEETAH_V20 => MARLIN_FYSETC_CHEETAH_V20}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_CHEETAH_V20 => MARLIN_FYSETC_CHEETAH_V20}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{LERDGE => MARLIN_LERDGE}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{LERDGE => MARLIN_LERDGE}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/{ldscripts/lerdge.ld => variants/MARLIN_LERDGE/ldscript.ld} (100%) rename buildroot/share/PlatformIO/variants/{LERDGE => MARLIN_LERDGE}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{LERDGE => MARLIN_LERDGE}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{megaextendedpins => MARLIN_MEGA_EXTENDED}/pins_arduino.h (100%) rename buildroot/share/PlatformIO/variants/{STEVAL_F401VE => MARLIN_STEVAL_F401VE}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{STEVAL_F401VE => MARLIN_STEVAL_F401VE}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{STEVAL_F401VE => MARLIN_STEVAL_F401VE}/hal_conf_custom.h (100%) rename buildroot/share/PlatformIO/variants/{STEVAL_F401VE => MARLIN_STEVAL_F401VE}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{STEVAL_F401VE => MARLIN_STEVAL_F401VE}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{STEVAL_F401VE => MARLIN_STEVAL_F401VE}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/board.cpp (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/board/board.h (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/ld/common.inc (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/ld/extra_libs.inc (100%) rename buildroot/share/PlatformIO/{ldscripts/chitu_f103.ld => variants/marlin_CHITU_F103/ld/flash.ld} (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/ld/stm32f103z_dfu.ld (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/ld/stm32f103zc.ld (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/ld/stm32f103zd.ld (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/ld/stm32f103ze.ld (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/ld/vector_symbols.inc (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/pins_arduino.h (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/wirish/boards.cpp (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/wirish/boards_setup.cpp (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/wirish/start.S (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/wirish/start_c.c (100%) rename buildroot/share/PlatformIO/variants/{CHITU_F103 => marlin_CHITU_F103}/wirish/syscalls.c (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/board.cpp (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/board/board.h (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/bootloader.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/common.inc (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/extra_libs.inc (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/flash.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/jtag.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/mem-flash.inc (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/mem-jtag.inc (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/mem-ram.inc (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/ram.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/stm32f103rb.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/stm32f103rb_bootloader.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/stm32f103rc.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/stm32f103rc_bootloader.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/stm32f103re.ld (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/ld/vector_symbols.inc (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/pins_arduino.h (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/variant.h (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/wirish/boards.cpp (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/wirish/boards_setup.cpp (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/wirish/start.S (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/wirish/start_c.c (100%) rename buildroot/share/PlatformIO/variants/{MEEB_3DP => marlin_MEEB_3DP}/wirish/syscalls.c (100%) create mode 100755 buildroot/tests/chitu_f103 diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 5a598299f3..93bda9726e 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -90,6 +90,7 @@ jobs: - NUCLEO_F767ZI - REMRAM_V1 - BTT_SKR_SE_BX + - chitu_f103 # Put lengthy tests last diff --git a/buildroot/share/PlatformIO/boards/LERDGE.json b/buildroot/share/PlatformIO/boards/LERDGE.json deleted file mode 100644 index 011814a133..0000000000 --- a/buildroot/share/PlatformIO/boards/LERDGE.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "build": { - "core": "stm32", - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F407xx", - "f_cpu": "168000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x0483", - "0x3748" - ] - ], - "mcu": "stm32f407zgt6", - "variant": "LERDGE", - "ldscript": "LERDGE.ld" - }, - "debug": { - "jlink_device": "STM32F407ZG", - "openocd_target": "stm32f4x", - "svd_path": "STM32F40x.svd", - "tools": { - "stlink": { - "server": { - "arguments": [ - "-f", - "scripts/interface/stlink.cfg", - "-c", - "transport select hla_swd", - "-f", - "scripts/target/stm32f4x.cfg", - "-c", - "reset_config none" - ], - "executable": "bin/openocd", - "package": "tool-openocd" - } - } - } - }, - "frameworks": [ - "arduino", - "stm32cube" - ], - "name": "STM32F407ZGT6(192k RAM. 1024k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 196608, - "maximum_size": 1048576, - "protocol": "stlink", - "protocols": [ - "stlink", - "dfu", - "jlink" - ], - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407ZG.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/fysetc_f6.json b/buildroot/share/PlatformIO/boards/fysetc_f6.json deleted file mode 100644 index 2772f73a65..0000000000 --- a/buildroot/share/PlatformIO/boards/fysetc_f6.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "build": { - "core": "arduino", - "extra_flags": "-DARDUINO_AVR_MEGA2560", - "f_cpu": "16000000L", - "hwids": [ - [ - "0x27b2", - "0x0002" - ] - ], - "mcu": "atmega2560", - "variant": "fysetcf6" - }, - "debug": { - "simavr_target": "atmega2560", - "avr-stub": { - "speed": 115200 - } - }, - "frameworks": [ - "arduino" - ], - "name": "FYSETC F6", - "upload": { - "maximum_ram_size": 8192, - "maximum_size": 258048, - "protocol": "wiring", - "require_upload_port": true, - "speed": 115200 - }, - "url": "https://www.fysetc.com/", - "vendor": "FYSETC" -} diff --git a/buildroot/share/PlatformIO/boards/BTT_SKR_SE_BX.json b/buildroot/share/PlatformIO/boards/marlin_BTT_SKR_SE_BX.json similarity index 97% rename from buildroot/share/PlatformIO/boards/BTT_SKR_SE_BX.json rename to buildroot/share/PlatformIO/boards/marlin_BTT_SKR_SE_BX.json index 920b2478a9..65735d433b 100644 --- a/buildroot/share/PlatformIO/boards/BTT_SKR_SE_BX.json +++ b/buildroot/share/PlatformIO/boards/marlin_BTT_SKR_SE_BX.json @@ -5,7 +5,7 @@ "extra_flags": "-DSTM32H743xx", "f_cpu": "400000000L", "mcu": "stm32h743iit6", - "variant": "BTT_SKR_SE_BX" + "variant": "MARLIN_BTT_SKR_SE_BX" }, "debug": { "jlink_device": "STM32H743II", diff --git a/buildroot/share/PlatformIO/boards/BigTree_Btt002.json b/buildroot/share/PlatformIO/boards/marlin_BigTree_BTT002.json similarity index 96% rename from buildroot/share/PlatformIO/boards/BigTree_Btt002.json rename to buildroot/share/PlatformIO/boards/marlin_BigTree_BTT002.json index d0d092f1ea..28a79271b8 100644 --- a/buildroot/share/PlatformIO/boards/BigTree_Btt002.json +++ b/buildroot/share/PlatformIO/boards/marlin_BigTree_BTT002.json @@ -15,7 +15,7 @@ ] ], "mcu": "stm32f407vgt6", - "variant": "BIGTREE_BTT002" + "variant": "MARLIN_BIGTREE_BTT002" }, "debug": { "jlink_device": "STM32F407VG", diff --git a/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json b/buildroot/share/PlatformIO/boards/marlin_BigTree_GTR_v1.json similarity index 96% rename from buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json rename to buildroot/share/PlatformIO/boards/marlin_BigTree_GTR_v1.json index 32236301c3..e311ce3b52 100644 --- a/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json +++ b/buildroot/share/PlatformIO/boards/marlin_BigTree_GTR_v1.json @@ -15,7 +15,7 @@ ] ], "mcu": "stm32f407zgt6", - "variant": "BIGTREE_GTR_V1" + "variant": "MARLIN_BIGTREE_GTR_V1" }, "debug": { "jlink_device": "STM32F407ZG", diff --git a/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json b/buildroot/share/PlatformIO/boards/marlin_BigTree_SKR_Pro.json similarity index 95% rename from buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json rename to buildroot/share/PlatformIO/boards/marlin_BigTree_SKR_Pro.json index 211ceacdca..5e76c2c9e2 100644 --- a/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json +++ b/buildroot/share/PlatformIO/boards/marlin_BigTree_SKR_Pro.json @@ -15,7 +15,7 @@ ] ], "mcu": "stm32f407zgt6", - "variant": "BIGTREE_SKR_PRO_1v1" + "variant": "MARLIN_BIGTREE_SKR_PRO_11" }, "debug": { "jlink_device": "STM32F407ZG", diff --git a/buildroot/share/PlatformIO/boards/CHITU_F103.json b/buildroot/share/PlatformIO/boards/marlin_CHITU_F103.json similarity index 93% rename from buildroot/share/PlatformIO/boards/CHITU_F103.json rename to buildroot/share/PlatformIO/boards/marlin_CHITU_F103.json index ecf7bff66c..dbfbc21cb2 100644 --- a/buildroot/share/PlatformIO/boards/CHITU_F103.json +++ b/buildroot/share/PlatformIO/boards/marlin_CHITU_F103.json @@ -15,8 +15,7 @@ ] ], "mcu": "stm32f103zet6", - "variant": "CHITU_F103", - "ldscript": "chitu_f103.ld" + "variant": "marlin_CHITU_F103" }, "debug": { "jlink_device": "STM32F103ZE", diff --git a/buildroot/share/PlatformIO/boards/FYSETC_CHEETAH_V20.json b/buildroot/share/PlatformIO/boards/marlin_FYSETC_CHEETAH_V20.json similarity index 96% rename from buildroot/share/PlatformIO/boards/FYSETC_CHEETAH_V20.json rename to buildroot/share/PlatformIO/boards/marlin_FYSETC_CHEETAH_V20.json index ff082fdc1f..e7b0d28afe 100644 --- a/buildroot/share/PlatformIO/boards/FYSETC_CHEETAH_V20.json +++ b/buildroot/share/PlatformIO/boards/marlin_FYSETC_CHEETAH_V20.json @@ -16,7 +16,7 @@ ], "ldscript": "stm32f401rc.ld", "mcu": "stm32f401rct6", - "variant": "FYSETC_CHEETAH_V20" + "variant": "MARLIN_FYSETC_CHEETAH_V20" }, "debug": { "jlink_device": "STM32F401RC", diff --git a/buildroot/share/PlatformIO/boards/MEEB_3DP.json b/buildroot/share/PlatformIO/boards/marlin_MEEB_3DP.json similarity index 97% rename from buildroot/share/PlatformIO/boards/MEEB_3DP.json rename to buildroot/share/PlatformIO/boards/marlin_MEEB_3DP.json index 870648b325..73ec9aaf48 100644 --- a/buildroot/share/PlatformIO/boards/MEEB_3DP.json +++ b/buildroot/share/PlatformIO/boards/marlin_MEEB_3DP.json @@ -18,7 +18,7 @@ "ldscript": "stm32f103xc.ld" }, "mcu": "stm32f103rct6", - "variant": "MEEB_3DP" + "variant": "marlin_MEEB_3DP" }, "debug": { "jlink_device": "STM32F103RC", diff --git a/buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json b/buildroot/share/PlatformIO/boards/marlin_STEVAL_STM32F401VE.json similarity index 95% rename from buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json rename to buildroot/share/PlatformIO/boards/marlin_STEVAL_STM32F401VE.json index bbfb3fdfa5..e89ca0af73 100644 --- a/buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json +++ b/buildroot/share/PlatformIO/boards/marlin_STEVAL_STM32F401VE.json @@ -14,9 +14,8 @@ "0x3748" ] ], - "ldscript": "stm32f401xe.ld", "mcu": "stm32f401vet6", - "variant": "STEVAL_F401VE" + "variant": "MARLIN_STEVAL_F401VE" }, "debug": { "jlink_device": "STM32F401VE", diff --git a/buildroot/share/PlatformIO/boards/genericSTM32F407VGT6.json b/buildroot/share/PlatformIO/boards/marlin_STM32F407VGT6_CCM.json similarity index 100% rename from buildroot/share/PlatformIO/boards/genericSTM32F407VGT6.json rename to buildroot/share/PlatformIO/boards/marlin_STM32F407VGT6_CCM.json diff --git a/buildroot/share/PlatformIO/boards/FLYF407ZG.json b/buildroot/share/PlatformIO/boards/marlin_STM32F407ZGT6.json similarity index 94% rename from buildroot/share/PlatformIO/boards/FLYF407ZG.json rename to buildroot/share/PlatformIO/boards/marlin_STM32F407ZGT6.json index 7e585c5057..f6c78f8ab3 100644 --- a/buildroot/share/PlatformIO/boards/FLYF407ZG.json +++ b/buildroot/share/PlatformIO/boards/marlin_STM32F407ZGT6.json @@ -14,8 +14,7 @@ "0x3748" ] ], - "mcu": "stm32f407zgt6", - "variant": "FLY_F407ZG" + "mcu": "stm32f407zgt6" }, "debug": { "jlink_device": "STM32F407ZG", @@ -49,7 +48,7 @@ "disable_flushing": false, "maximum_ram_size": 196608, "maximum_size": 1048576, - "protocol": "dfu", + "protocol": "stlink", "protocols": [ "stlink", "dfu", diff --git a/buildroot/share/PlatformIO/boards/archim.json b/buildroot/share/PlatformIO/boards/marlin_archim.json similarity index 97% rename from buildroot/share/PlatformIO/boards/archim.json rename to buildroot/share/PlatformIO/boards/marlin_archim.json index 60035197f2..6d78c1f195 100644 --- a/buildroot/share/PlatformIO/boards/archim.json +++ b/buildroot/share/PlatformIO/boards/marlin_archim.json @@ -21,7 +21,7 @@ "ldscript": "linker_scripts/gcc/flash.ld", "mcu": "at91sam3x8e", "usb_product": "Archim", - "variant": "archim" + "variant": "MARLIN_ARCHIM" }, "connectivity": [ "can" diff --git a/buildroot/share/PlatformIO/boards/at90usb1286.json b/buildroot/share/PlatformIO/boards/marlin_at90usb1286.json similarity index 100% rename from buildroot/share/PlatformIO/boards/at90usb1286.json rename to buildroot/share/PlatformIO/boards/marlin_at90usb1286.json diff --git a/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json b/buildroot/share/PlatformIO/boards/marlin_blackSTM32F407VET6.json similarity index 100% rename from buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json rename to buildroot/share/PlatformIO/boards/marlin_blackSTM32F407VET6.json diff --git a/buildroot/share/PlatformIO/boards/malyanM200.json b/buildroot/share/PlatformIO/boards/marlin_malyanM200.json similarity index 100% rename from buildroot/share/PlatformIO/boards/malyanM200.json rename to buildroot/share/PlatformIO/boards/marlin_malyanM200.json diff --git a/buildroot/share/PlatformIO/boards/malyanM200v2.json b/buildroot/share/PlatformIO/boards/marlin_malyanM200v2.json similarity index 100% rename from buildroot/share/PlatformIO/boards/malyanM200v2.json rename to buildroot/share/PlatformIO/boards/marlin_malyanM200v2.json diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py index 6d7f21942e..03e121c435 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py @@ -1,5 +1,5 @@ # -# STM32F103RC_MEEB_3DP.py +# buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py # try: import configparser @@ -54,9 +54,5 @@ for define in env['CPPDEFINES']: print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr)) print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size)) -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script +import marlin +marlin.custom_ld_script("STM32F103RC_MEEB_3DP.ld") diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py deleted file mode 100644 index 7e9dc676b6..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py +++ /dev/null @@ -1,23 +0,0 @@ -# -# STM32F103RC_SKR_MINI.py -# -import os -Import("env") - -STM32_FLASH_SIZE = 256 - -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) - if define[0] == "STM32_FLASH_SIZE": - STM32_FLASH_SIZE = define[1] - -# Relocate firmware from 0x08000000 to 0x08007000 -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_" + str(STM32_FLASH_SIZE) + "K.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py index 1a7cc34edb..f64f928787 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py @@ -1,24 +1,11 @@ # -# STM32F103RC_fysetc.py +# buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py # import os from os.path import join from os.path import expandvars Import("env") -# Relocate firmware from 0x08000000 to 0x08008000 -#for define in env['CPPDEFINES']: -# if define[0] == "VECT_TAB_ADDR": -# env['CPPDEFINES'].remove(define) -#env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08008000")) - -#custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.ld") -#for i, flag in enumerate(env["LINKFLAGS"]): -# if "-Wl,-T" in flag: -# env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script -# elif flag == "-T": -# env["LINKFLAGS"][i + 1] = custom_ld_script - # Custom HEX from ELF env.AddPostAction( join("$BUILD_DIR","${PROGNAME}.elf"), diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py b/buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py deleted file mode 100644 index e3ef98b03f..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py +++ /dev/null @@ -1,20 +0,0 @@ -# -# STM32F103RET6_creality.py -# -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) - -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/creality.ld") - -for i, flag in enumerate(env['LINKFLAGS']): - if "-Wl,-T" in flag: - env['LINKFLAGS'][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env['LINKFLAGS'][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py b/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py deleted file mode 100644 index 06e586f7f8..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# STM32F103RE_SKR_E3_DIP.py -# -import os -Import("env") - -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) - -# Relocate firmware from 0x08000000 to 0x08007000 -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RE_SKR_E3_DIP.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py index 321dd01b8d..c98059729f 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py @@ -1,36 +1,22 @@ # -# STM32F103VE_longer.py +# buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py # Customizations for env:STM32F103VE_longer # -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08010000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08010000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script +import os,marlin # Rename ${PROGNAME}.bin and save it as 'project.bin' (No encryption on the Longer3D) def encrypt(source, target, env): firmware = open(target[0].path, "rb") - marlin_alfa = open(target[0].dir.path +'/project.bin', "wb") + renamed = open(target[0].dir.path + '/project.bin', "wb") length = os.path.getsize(target[0].path) position = 0 try: while position < length: byte = firmware.read(1) - marlin_alfa.write(byte) + renamed.write(byte) position += 1 finally: firmware.close() - marlin_alfa.close() + renamed.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +marlin.add_post_action(encrypt); diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py index 91522a9d06..0a38e1ceee 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py @@ -1,19 +1,10 @@ # # STM32F1_create_variant.py # -import os,shutil +import os,shutil,marlin from SCons.Script import DefaultEnvironment from platformio import util -def copytree(src, dst, symlinks=False, ignore=None): - for item in os.listdir(src): - s = os.path.join(src, item) - d = os.path.join(dst, item) - if os.path.isdir(s): - shutil.copytree(s, d, symlinks, ignore) - else: - shutil.copy2(s, d) - env = DefaultEnvironment() platform = env.PioPlatform() board = env.BoardConfig() @@ -36,4 +27,4 @@ if os.path.isdir(variant_dir): if not os.path.isdir(variant_dir): os.mkdir(variant_dir) -copytree(source_dir, variant_dir) +marlin.copytree(source_dir, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py b/buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py deleted file mode 100644 index ffd5bcd42d..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py +++ /dev/null @@ -1,13 +0,0 @@ -# -# STM32F401VE_STEVAL.py -# Customizations for env:STM32F401VE_STEVAL -# -import os -Import("env") - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/chitu_crypt.py b/buildroot/share/PlatformIO/scripts/chitu_crypt.py index 3d4854b51f..23d81c1721 100644 --- a/buildroot/share/PlatformIO/scripts/chitu_crypt.py +++ b/buildroot/share/PlatformIO/scripts/chitu_crypt.py @@ -1,21 +1,11 @@ # -# chitu_crypt.py +# buildroot/share/PlatformIO/scripts/chitu_crypt.py # Customizations for Chitu boards # -Import("env") -import os,random,struct,uuid +import os,random,struct,uuid,marlin # Relocate firmware from 0x08000000 to 0x08008800 -env['CPPDEFINES'].remove(("VECT_TAB_ADDR", "0x8000000")) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08008800")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/chitu_f103.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - +marlin.relocate_firmware("0x08008800") def calculate_crc(contents, seed): accumulating_xor_value = seed; @@ -43,7 +33,7 @@ def xor_block(r0, r1, block_number, block_size, file_key): for loop_counter in range(0, block_size): # meant to make sure different bits of the key are used. - xor_seed = int(loop_counter/key_length) + xor_seed = int(loop_counter / key_length) # IP is a scratch register / R12 ip = loop_counter - (key_length * xor_seed) @@ -69,7 +59,6 @@ def xor_block(r0, r1, block_number, block_size, file_key): #increment the loop_counter loop_counter = loop_counter + 1 - def encrypt_file(input, output_file, file_length): input_file = bytearray(input.read()) block_size = 0x800 @@ -113,11 +102,10 @@ def encrypt_file(input, output_file, file_length): output_file.write(input_file) return - # Encrypt ${PROGNAME}.bin and save it as 'update.cbd' def encrypt(source, target, env): firmware = open(target[0].path, "rb") - update = open(target[0].dir.path +'/update.cbd', "wb") + update = open(target[0].dir.path + '/update.cbd', "wb") length = os.path.getsize(target[0].path) encrypt_file(firmware, update, length) @@ -125,4 +113,4 @@ def encrypt(source, target, env): firmware.close() update.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +marlin.add_post_action(encrypt); diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py deleted file mode 100644 index 15c953156c..0000000000 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# copy_marlin_variant_to_framework.py -# -import os,shutil -from SCons.Script import DefaultEnvironment -from platformio import util -from platformio.package.meta import PackageSpec - -def copytree(src, dst, symlinks=False, ignore=None): - for item in os.listdir(src): - s = os.path.join(src, item) - d = os.path.join(dst, item) - if os.path.isdir(s): - shutil.copytree(s, d, symlinks, ignore) - else: - shutil.copy2(s, d) - -env = DefaultEnvironment() -platform = env.PioPlatform() -board = env.BoardConfig() -variant = board.get("build.variant") - -platform_packages = env.GetProjectOption('platform_packages') -# if there's no framework defined, take it from the class name of platform -framewords = { - "Ststm32Platform": "framework-arduinoststm32", - "AtmelavrPlatform": "framework-arduino-avr" -} -if len(platform_packages) == 0: - platform_name = framewords[platform.__class__.__name__] -else: - platform_name = PackageSpec(platform_packages[0]).name - -FRAMEWORK_DIR = platform.get_package_dir(platform_name) -assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") - -variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) - -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) -assert os.path.isdir(source_dir) - -if os.path.isdir(variant_dir): - shutil.rmtree(variant_dir) - -if not os.path.isdir(variant_dir): - os.mkdir(variant_dir) - -copytree(source_dir, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/custom_board.py b/buildroot/share/PlatformIO/scripts/custom_board.py new file mode 100644 index 0000000000..5d3ca3c652 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/custom_board.py @@ -0,0 +1,13 @@ +# +# buildroot/share/PlatformIO/scripts/custom_board.py +# +import marlin +board = marlin.env.BoardConfig() + +address = board.get("build.address", "") +if address: + marlin.relocate_firmware(address) + +ldscript = board.get("build.ldscript", "") +if ldscript: + marlin.custom_ld_script(ldscript) diff --git a/buildroot/share/PlatformIO/scripts/download_mks_assets.py b/buildroot/share/PlatformIO/scripts/download_mks_assets.py index 33acab9e12..e922fed2be 100644 --- a/buildroot/share/PlatformIO/scripts/download_mks_assets.py +++ b/buildroot/share/PlatformIO/scripts/download_mks_assets.py @@ -1,5 +1,6 @@ # -# download_mks_assets.py +# buildroot/share/PlatformIO/scripts/download_mks_assets.py +# Added by HAS_TFT_LVGL_UI to download assets from Makerbase repo # Import("env") import os,requests,zipfile,tempfile,shutil diff --git a/buildroot/share/PlatformIO/scripts/fly_mini.py b/buildroot/share/PlatformIO/scripts/fly_mini.py deleted file mode 100644 index 9c5df359ad..0000000000 --- a/buildroot/share/PlatformIO/scripts/fly_mini.py +++ /dev/null @@ -1,20 +0,0 @@ -# -# fly_mini.py -# Customizations for env:FLY_MINI -# -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08005000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/fly_mini.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - diff --git a/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py b/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py deleted file mode 100644 index f36d51f972..0000000000 --- a/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py +++ /dev/null @@ -1,13 +0,0 @@ -# -# STM32F401VE_STEVAL.py -# Customizations for env:STM32F401VE_STEVAL -# -import os -Import("env") - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/ldscript.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/generic_create_variant.py b/buildroot/share/PlatformIO/scripts/generic_create_variant.py index aa79d39b51..3290dcea19 100644 --- a/buildroot/share/PlatformIO/scripts/generic_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/generic_create_variant.py @@ -1,30 +1,54 @@ # -# Generate a generic variant +# generic_create_variant.py # -import os,shutil +# Copy one of the variants from buildroot/platformio/variants into +# the appropriate framework variants folder, so that its contents +# will be picked up by PlatformIO just like any other variant. +# +import os,shutil,marlin from SCons.Script import DefaultEnvironment from platformio import util env = DefaultEnvironment() + +# +# Get the platform name from the 'platform_packages' option, +# or look it up by the platform.class.name. +# platform = env.PioPlatform() + +from platformio.package.meta import PackageSpec +platform_packages = env.GetProjectOption('platform_packages') +if len(platform_packages) == 0: + framewords = { + "Ststm32Platform": "framework-arduinoststm32", + "AtmelavrPlatform": "framework-arduino-avr" + } + platform_name = framewords[platform.__class__.__name__] +else: + platform_name = PackageSpec(platform_packages[0]).name + +if platform_name in [ "usb-host-msc", "usb-host-msc-cdc-msc", "tool-stm32duino" ]: + platform_name = "framework-arduinoststm32" + +FRAMEWORK_DIR = platform.get_package_dir(platform_name) +assert os.path.isdir(FRAMEWORK_DIR) + board = env.BoardConfig() -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32") -assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") - -mcu_type = board.get("build.mcu")[:-2] +#mcu_type = board.get("build.mcu")[:-2] variant = board.get("build.variant") -series = mcu_type[:7].upper() + "xx" +#series = mcu_type[:7].upper() + "xx" + +# Prepare a new empty folder at the destination variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) - -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) -assert os.path.isdir(source_dir) - +if os.path.isdir(variant_dir): + shutil.rmtree(variant_dir) if not os.path.isdir(variant_dir): os.mkdir(variant_dir) -for file_name in os.listdir(source_dir): - full_file_name = os.path.join(source_dir, file_name) - if os.path.isfile(full_file_name): - shutil.copy(full_file_name, variant_dir) +# Source dir is a local variant sub-folder +source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) +assert os.path.isdir(source_dir) + +marlin.copytree(source_dir, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py b/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py index 6c8a4f6034..a4001a240c 100644 --- a/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py +++ b/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py @@ -1,30 +1,21 @@ -import os -Import("env") +# +# buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py +# Customizations for env:jgaurora_a5s_a1 +# +import os,marlin -# Relocate firmware from 0x08000000 to 0x0800A000 -env['CPPDEFINES'].remove(("VECT_TAB_ADDR", "0x8000000")) -#alternatively, for STSTM <=5.1.0 use line below -#env['CPPDEFINES'].remove(("VECT_TAB_ADDR", 134217728)) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x0800A000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - -#append ${PROGNAME}.bin firmware after bootloader and save it as 'jgaurora_firmware.bin' -def addboot(source,target,env): +# Append ${PROGNAME}.bin firmware after bootloader and save it as 'jgaurora_firmware.bin' +def addboot(source, target, env): firmware = open(target[0].path, "rb") lengthfirmware = os.path.getsize(target[0].path) - bootloader_dir = "buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin" - bootloader = open(bootloader_dir, "rb") - lengthbootloader = os.path.getsize(bootloader_dir) - firmware_with_boothloader_dir = target[0].dir.path +'/firmware_with_bootloader.bin' - if os.path.exists(firmware_with_boothloader_dir): - os.remove(firmware_with_boothloader_dir) - firmwareimage = open(firmware_with_boothloader_dir, "wb") + bootloader_bin = "buildroot/share/PlatformIO/scripts/" + "jgaurora_bootloader.bin" + bootloader = open(bootloader_bin, "rb") + lengthbootloader = os.path.getsize(bootloader_bin) + + firmware_with_boothloader_bin = target[0].dir.path + '/firmware_with_bootloader.bin' + if os.path.exists(firmware_with_boothloader_bin): + os.remove(firmware_with_boothloader_bin) + firmwareimage = open(firmware_with_boothloader_bin, "wb") position = 0 while position < lengthbootloader: byte = bootloader.read(1) @@ -38,11 +29,11 @@ def addboot(source,target,env): bootloader.close() firmware.close() firmwareimage.close() - firmware_without_bootloader_dir = target[0].dir.path+'/firmware_for_sd_upload.bin' - if os.path.exists(firmware_without_bootloader_dir): - os.remove(firmware_without_bootloader_dir) - os.rename(target[0].path, firmware_without_bootloader_dir) + + firmware_without_bootloader_bin = target[0].dir.path + '/firmware_for_sd_upload.bin' + if os.path.exists(firmware_without_bootloader_bin): + os.remove(firmware_without_bootloader_bin) + os.rename(target[0].path, firmware_without_bootloader_bin) #os.rename(target[0].dir.path+'/firmware_with_bootloader.bin', target[0].dir.path+'/firmware.bin') -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", addboot); - +marlin.add_post_action(addboot); diff --git a/buildroot/share/PlatformIO/scripts/lerdge.py b/buildroot/share/PlatformIO/scripts/lerdge.py index ff4f5e446b..55f0a65ace 100644 --- a/buildroot/share/PlatformIO/scripts/lerdge.py +++ b/buildroot/share/PlatformIO/scripts/lerdge.py @@ -1,20 +1,16 @@ # -# lerdge.py -# Customizations for Lerdge build environments +# buildroot/share/PlatformIO/scripts/lerdge.py +# Customizations for Lerdge build environments: +# env:LERDGEX env:LERDGEX_usb_flash_drive +# env:LERDGES env:LERDGES_usb_flash_drive +# env:LERDGEK env:LERDGEK_usb_flash_drive # -import os,sys +import os,marlin Import("env") from SCons.Script import DefaultEnvironment board = DefaultEnvironment().BoardConfig() -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/lerdge.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - def encryptByte(byte): byte = 0xFF & ((byte << 6) | (byte >> 2)) i = 0x58 + byte @@ -35,16 +31,16 @@ def encrypt_file(input, output_file, file_length): def encrypt(source, target, env): print("Encrypting to:", board.get("build.firmware")) firmware = open(target[0].path, "rb") - result = open(target[0].dir.path + "/" + board.get("build.firmware"), "wb") + renamed = open(target[0].dir.path + "/" + board.get("build.firmware"), "wb") length = os.path.getsize(target[0].path) - encrypt_file(firmware, result, length) + encrypt_file(firmware, renamed, length) firmware.close() - result.close() + renamed.close() if 'firmware' in board.get("build").keys(): - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); + marlin.add_post_action(encrypt); else: print("You need to define output file via board_build.firmware = 'filename' parameter") exit(1); diff --git a/buildroot/share/PlatformIO/scripts/marlin.py b/buildroot/share/PlatformIO/scripts/marlin.py new file mode 100644 index 0000000000..d83ebceee2 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/marlin.py @@ -0,0 +1,75 @@ +# +# buildroot/share/PlatformIO/scripts/marlin.py +# Helper module with some commonly-used functions +# +import os,shutil + +from SCons.Script import DefaultEnvironment +env = DefaultEnvironment() + +def copytree(src, dst, symlinks=False, ignore=None): + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(dst, item) + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) + +def replace_define(field, value): + for define in env['CPPDEFINES']: + if define[0] == field: + env['CPPDEFINES'].remove(define) + env['CPPDEFINES'].append((field, value)) + +# Relocate the firmware to a new address, such as "0x08005000" +def relocate_firmware(address): + replace_define("VECT_TAB_ADDR", address) + +# Relocate the vector table with a new offset +def relocate_vtab(address): + replace_define("VECT_TAB_OFFSET", address) + +# Replace the existing -Wl,-T with the given ldscript path +def custom_ld_script(ldname): + apath = os.path.abspath("buildroot/share/PlatformIO/ldscripts/" + ldname) + for i, flag in enumerate(env["LINKFLAGS"]): + if "-Wl,-T" in flag: + env["LINKFLAGS"][i] = "-Wl,-T" + apath + elif flag == "-T": + env["LINKFLAGS"][i + 1] = apath + +# Encrypt ${PROGNAME}.bin and save it with a new name +# Called by specific encrypt() functions, mostly for MKS boards +def encrypt_mks(source, target, env, new_name): + import sys + + key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] + + firmware = open(target[0].path, "rb") + renamed = open(target[0].dir.path + "/" + new_name, "wb") + length = os.path.getsize(target[0].path) + position = 0 + try: + while position < length: + byte = firmware.read(1) + if position >= 320 and position < 31040: + byte = chr(ord(byte) ^ key[position & 31]) + if sys.version_info[0] > 2: + byte = bytes(byte, 'latin1') + renamed.write(byte) + position += 1 + finally: + firmware.close() + renamed.close() + +def add_post_action(action): + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", action); + +# Apply customizations for a MKS Robin +def prepare_robin(address, ldname, fwname): + def encrypt(source, target, env): + encrypt_mks(source, target, env, fwname) + relocate_firmware(address) + custom_ld_script(ldname) + add_post_action(encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_encrypt.py b/buildroot/share/PlatformIO/scripts/mks_encrypt.py index 0d53cdfbe9..78d7cf349d 100644 --- a/buildroot/share/PlatformIO/scripts/mks_encrypt.py +++ b/buildroot/share/PlatformIO/scripts/mks_encrypt.py @@ -1,32 +1,28 @@ -import os,sys +# +# buildroot/share/PlatformIO/scripts/mks_encrypt.py +# +# Apply encryption and save as 'build.firmware' for these environments: +# - env:mks_robin_stm32 +# - env:flsun_hispeedv1 +# - env:mks_robin_nano35_stm32 +# Import("env") from SCons.Script import DefaultEnvironment board = DefaultEnvironment().BoardConfig() -# Encrypt ${PROGNAME}.bin and save it as build.firmware ('Robin.bin') -def encrypt(source, target, env): - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/'+ board.get("build.firmware"), "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() - if 'firmware' in board.get("build").keys(): - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); + + import marlin + + # Encrypt ${PROGNAME}.bin and save it as build.firmware + def encrypt(source, target, env): + marlin.encrypt_mks(source, target, env, "build.firmware") + + marlin.add_post_action(encrypt); + else: - print("You need to define output file via board_build.firmware = 'filename' parameter", file=sys.stderr) - exit(1); + + import sys + print("You need to define output file via board_build.firmware = 'filename' parameter", file=sys.stderr) + env.Exit(1); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin.py b/buildroot/share/PlatformIO/scripts/mks_robin.py index dd2342bf0d..8c5e4ae276 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin.py @@ -1,39 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - -# Encrypt ${PROGNAME}.bin and save it as 'Robin.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin.py +# +import marlin +marlin.prepare_robin("0x08007000", "mks_robin.ld", "Robin.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3.py index 3af623cce0..7f6f538d6a 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_e3.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_e3.py @@ -1,40 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08005000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_e3.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_e3.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin_e3.py +# +import marlin +marlin.prepare_robin("0x08005000", "mks_robin_e3.ld", "Robin_e3.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py index 2aab14bab7..1f3cacf873 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py @@ -1,40 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'mks_robin_e3p.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_e3p.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +# +import marlin +marlin.prepare_robin("0x08007000", "mks_robin_e3p.ld", "Robin_e3p.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py index 2f3ae1fa9a..b8c039ada8 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py @@ -1,40 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08005000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/mksLite.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin_lite.py +# +import marlin +marlin.prepare_robin("0x08005000", "mks_robin_lite.ld", "mksLite.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py index 67ad442d82..bea8b80ace 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py @@ -1,40 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08005000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/mksLite3.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin_lite3.py +# +import marlin +marlin.prepare_robin("0x08005000", "mks_robin_lite.ld", "mksLite3.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py index d386698301..4c52035965 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py @@ -1,40 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_mini.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'Robin_mini.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_mini.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin_mini.py +# +import marlin +marlin.prepare_robin("0x08005000", "mks_robin_mini.ld", "Robin_mini.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py index a68fd308d4..319b4d4982 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py @@ -1,40 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'Robin_nano.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_nano.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin_nano.py +# +import marlin +marlin.prepare_robin("0x08007000", "mks_robin_nano.ld", "Robin_nano.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py index 0047289adf..310c3d6606 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py @@ -1,40 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'Robin_nano35.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_nano35.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +# +import marlin +marlin.prepare_robin("0x08007000", "mks_robin_nano.ld", "Robin_nano35.bin") diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_pro.py b/buildroot/share/PlatformIO/scripts/mks_robin_pro.py index 2ebf1ffb9d..c624663a33 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_pro.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_pro.py @@ -1,39 +1,5 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_pro.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - -# Encrypt ${PROGNAME}.bin and save it as 'Robin.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_pro.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +# +# buildroot/share/PlatformIO/scripts/mks_robin_pro.py +# +import marlin +marlin.prepare_robin("0x08007000", "mks_robin_pro.ld", "Robin_pro.bin") diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py index 1ceff84b8f..4e7d2d9c07 100644 --- a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py +++ b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py @@ -1,7 +1,7 @@ # # stm32_bootloader.py # -import os,sys,shutil +import os,sys,shutil,marlin Import("env") from SCons.Script import DefaultEnvironment @@ -11,35 +11,30 @@ board = DefaultEnvironment().BoardConfig() # Copy the firmware.bin file to build.firmware, no encryption # def noencrypt(source, target, env): - firmware = os.path.join(target[0].dir.path, board.get("build.firmware")) - shutil.copy(target[0].path, firmware) + firmware = os.path.join(target[0].dir.path, board.get("build.firmware")) + shutil.copy(target[0].path, firmware) # # For build.offset define LD_FLASH_OFFSET, used by ldscript.ld # if 'offset' in board.get("build").keys(): - LD_FLASH_OFFSET = board.get("build.offset") + LD_FLASH_OFFSET = board.get("build.offset") - # Remove an existing VECT_TAB_OFFSET from CPPDEFINES - for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_OFFSET": - env['CPPDEFINES'].remove(define) + marlin.relocate_vtab(LD_FLASH_OFFSET) - # Replace VECT_TAB_OFFSET with our LD_FLASH_OFFSET - env['CPPDEFINES'].append(("VECT_TAB_OFFSET", LD_FLASH_OFFSET)) + # Get upload.maximum_ram_size (defined by /buildroot/share/PlatformIO/boards/VARIOUS.json) + maximum_ram_size = board.get("upload.maximum_ram_size") - # Get upload.maximum_ram_size (defined by /buildroot/share/PlatformIO/boards/VARIOUS.json) - maximum_ram_size = board.get("upload.maximum_ram_size") - - for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,--defsym=LD_FLASH_OFFSET" in flag: - env["LINKFLAGS"][i] = "-Wl,--defsym=LD_FLASH_OFFSET=" + LD_FLASH_OFFSET - if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: - env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) + for i, flag in enumerate(env["LINKFLAGS"]): + if "-Wl,--defsym=LD_FLASH_OFFSET" in flag: + env["LINKFLAGS"][i] = "-Wl,--defsym=LD_FLASH_OFFSET=" + LD_FLASH_OFFSET + if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: + env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) # # Only copy the file if there's no encrypt # board_keys = board.get("build").keys() if 'firmware' in board_keys and not 'encrypt' in board_keys: - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt) + import marlin + marlin.add_post_action(noencrypt) diff --git a/buildroot/share/PlatformIO/variants/archim/.gitignore b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/.gitignore similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/.gitignore rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/.gitignore diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/Makefile similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/Makefile diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/debug.mk similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/debug.mk diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/gcc.mk similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/gcc.mk diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/libvariant_arduino_due_x.mk similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/libvariant_arduino_due_x.mk diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/release.mk similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/build_gcc/release.mk diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/debug_scripts/gcc/arduino_due_x_flash.gdb similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/debug_scripts/gcc/arduino_due_x_flash.gdb diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/debug_scripts/gcc/arduino_due_x_sram.gdb similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/debug_scripts/gcc/arduino_due_x_sram.gdb diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/debug_scripts/iar/arduino_due_flash.mac similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/debug_scripts/iar/arduino_due_flash.mac diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/debug_scripts/iar/arduino_due_sram.mac similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/debug_scripts/iar/arduino_due_sram.mac diff --git a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a diff --git a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/libsam_sam3x8e_gcc_rel.a.txt diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/linker_scripts/gcc/flash.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/linker_scripts/gcc/flash.ld diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/linker_scripts/gcc/sram.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/linker_scripts/gcc/sram.ld diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/linker_scripts/iar/flash.icf similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/linker_scripts/iar/flash.icf diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/linker_scripts/iar/sram.icf similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/linker_scripts/iar/sram.icf diff --git a/buildroot/share/PlatformIO/variants/archim/pins_arduino.h b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/pins_arduino.h similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/pins_arduino.h rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/pins_arduino.h diff --git a/buildroot/share/PlatformIO/variants/archim/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/archim/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/archim/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_ARCHIM/variant.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/hal_conf_extra.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/hal_conf_extra.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_BTT002/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_BTT002/variant.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/hal_conf_extra.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/hal_conf_extra.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/hal_conf_extra.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_E3_RRF/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_E3_RRF/variant.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/hal_conf_extra.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/hal_conf_extra.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_GTR_V1/variant.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/hal_conf_extra.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/hal_conf_extra.h diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_BIGTREE_SKR_PRO_11/variant.h diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/hal_conf_extra.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/hal_conf_extra.h rename to buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/hal_conf_extra.h diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/BTT_SKR_SE_BX/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_BTT_SKR_SE_BX/variant.h diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/FLY_F407ZG/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/FLY_F407ZG/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_FLY_F407ZG/variant.h diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/hal_conf_custom.h similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/hal_conf_custom.h diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_CHEETAH_V20/variant.h diff --git a/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_LERDGE/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_LERDGE/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_LERDGE/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_LERDGE/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/ldscripts/lerdge.ld b/buildroot/share/PlatformIO/variants/MARLIN_LERDGE/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/ldscripts/lerdge.ld rename to buildroot/share/PlatformIO/variants/MARLIN_LERDGE/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/LERDGE/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_LERDGE/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/LERDGE/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_LERDGE/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/LERDGE/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_LERDGE/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/LERDGE/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_LERDGE/variant.h diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h similarity index 100% rename from buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h rename to buildroot/share/PlatformIO/variants/MARLIN_MEGA_EXTENDED/pins_arduino.h diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/STEVAL_F401VE/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/hal_conf_custom.h similarity index 100% rename from buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h rename to buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/hal_conf_custom.h diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_STEVAL_F401VE/variant.h diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/board.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/board.cpp diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/board/board.h similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/board/board.h diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/common.inc b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/common.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/ld/common.inc rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/extra_libs.inc b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/extra_libs.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/ld/extra_libs.inc rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/extra_libs.inc diff --git a/buildroot/share/PlatformIO/ldscripts/chitu_f103.ld b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/flash.ld similarity index 100% rename from buildroot/share/PlatformIO/ldscripts/chitu_f103.ld rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/flash.ld diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103z_dfu.ld b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/stm32f103z_dfu.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103z_dfu.ld rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/stm32f103z_dfu.ld diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zc.ld b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/stm32f103zc.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zc.ld rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/stm32f103zc.ld diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zd.ld b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/stm32f103zd.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zd.ld rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/stm32f103zd.ld diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103ze.ld b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/stm32f103ze.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103ze.ld rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/stm32f103ze.ld diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/vector_symbols.inc b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/vector_symbols.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/ld/vector_symbols.inc rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/ld/vector_symbols.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/pins_arduino.h similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/pins_arduino.h diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/variant.h rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/variant.h diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/boards.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/boards.cpp diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/boards_setup.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/boards_setup.cpp diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start.S b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/start.S similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start.S rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/start.S diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/start_c.c similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/start_c.c diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c b/buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/syscalls.c similarity index 100% rename from buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c rename to buildroot/share/PlatformIO/variants/marlin_CHITU_F103/wirish/syscalls.c diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/board.cpp b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/board.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/board.cpp rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/board.cpp diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/board/board.h b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/board/board.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/board/board.h rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/board/board.h diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/bootloader.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/bootloader.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/bootloader.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/bootloader.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/common.inc b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/common.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/common.inc rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/extra_libs.inc b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/extra_libs.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/extra_libs.inc rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/extra_libs.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/flash.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/flash.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/flash.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/flash.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/jtag.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/jtag.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/jtag.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/jtag.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-flash.inc b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/mem-flash.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-flash.inc rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/mem-flash.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-jtag.inc b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/mem-jtag.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-jtag.inc rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/mem-jtag.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-ram.inc b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/mem-ram.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-ram.inc rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/mem-ram.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/ram.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/ram.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/ram.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/ram.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103rb.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103rb.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb_bootloader.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103rb_bootloader.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb_bootloader.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103rb_bootloader.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103rc.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103rc.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc_bootloader.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103rc_bootloader.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc_bootloader.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103rc_bootloader.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103re.ld b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103re.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103re.ld rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/stm32f103re.ld diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/vector_symbols.inc b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/vector_symbols.inc similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/ld/vector_symbols.inc rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/ld/vector_symbols.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/pins_arduino.h b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/pins_arduino.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/pins_arduino.h rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/pins_arduino.h diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/variant.h b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/variant.h rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/variant.h diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/boards.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards.cpp rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/boards.cpp diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards_setup.cpp b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/boards_setup.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards_setup.cpp rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/boards_setup.cpp diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start.S b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/start.S similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start.S rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/start.S diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start_c.c b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/start_c.c similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start_c.c rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/start_c.c diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/syscalls.c b/buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/syscalls.c similarity index 100% rename from buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/syscalls.c rename to buildroot/share/PlatformIO/variants/marlin_MEEB_3DP/wirish/syscalls.c diff --git a/buildroot/tests/chitu_f103 b/buildroot/tests/chitu_f103 new file mode 100755 index 0000000000..139c480e3e --- /dev/null +++ b/buildroot/tests/chitu_f103 @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for chitu_f103 (STM32F103ZE) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +use_example_configs Tronxy/X5SA +exec_test $1 $2 "Tronxy/X5SA" "$3" + +# clean up +restore_configs diff --git a/ini/avr.ini b/ini/avr.ini index 1b208400a3..cd10f13499 100644 --- a/ini/avr.ini +++ b/ini/avr.ini @@ -35,9 +35,9 @@ board = megaatmega2560 [env:mega2560ext] platform = atmelavr extends = env:mega2560 -board_build.variant = megaextendedpins +board_build.variant = MARLIN_MEGA_EXTENDED extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py # # ATmega1280 @@ -52,9 +52,9 @@ board = megaatmega1280 # [mega_extended_optimized] extends = common_avr8 -board_build.variant = megaextendedpins +board_build.variant = MARLIN_MEGA_EXTENDED extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py upload_speed = 57600 build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues @@ -88,7 +88,7 @@ board = reprap_rambo [env:FYSETC_F6] platform = atmelavr extends = common_avr8 -board = fysetc_f6 +board = fysetc_f6_13 # # Sanguinololu (ATmega644p) @@ -161,7 +161,7 @@ build_flags = ${tuned_1284p.build_flags} [env:at90usb1286_cdc] platform = teensy extends = common_avr8 -board = at90usb1286 +board = marlin_at90usb1286 lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet # diff --git a/ini/due.ini b/ini/due.ini index 7abc262eb4..9123af8cdc 100644 --- a/ini/due.ini +++ b/ini/due.ini @@ -31,7 +31,7 @@ board = dueUSB [common_DUE_archim] platform = atmelsam extends = env:DUE -board = archim +board = marlin_archim build_flags = ${common.build_flags} -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON board_build.variants_dir = buildroot/share/PlatformIO/variants/ diff --git a/ini/stm32f0.ini b/ini/stm32f0.ini index 10ac21fc89..64568e4b4c 100644 --- a/ini/stm32f0.ini +++ b/ini/stm32f0.ini @@ -25,7 +25,7 @@ [env:STM32F070RB_malyan] platform = ${common_stm32.platform} extends = common_stm32 -board = malyanM200v2 +board = marlin_malyanM200v2 build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing -DCUSTOM_STARTUP_FILE diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini index a2954e64cf..94693d65a4 100644 --- a/ini/stm32f1.ini +++ b/ini/stm32f1.ini @@ -65,7 +65,7 @@ monitor_speed = 115200 [env:STM32F103RC_meeb] platform = ${common_stm32f1.platform} extends = common_stm32f1 -board = MEEB_3DP +board = marlin_MEEB_3DP build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 @@ -114,8 +114,10 @@ upload_protocol = serial [env:STM32F103RC_btt] platform = ${common_stm32f1.platform} extends = env:STM32F103RC +board_build.address = 0x08007000 +board_build.ldscript = STM32F103RC_SKR_MINI_256K.ld extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py + buildroot/share/PlatformIO/scripts/custom_board.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 monitor_speed = 115200 @@ -130,6 +132,7 @@ lib_deps = ${env:STM32F103RC_btt.lib_deps} [env:STM32F103RC_btt_512K] platform = ${common_stm32f1.platform} extends = env:STM32F103RC_btt +board_build.ldscript = STM32F103RC_SKR_MINI_512K.ld board_upload.maximum_size=524288 build_flags = ${env:STM32F103RC_btt.build_flags} -DSTM32_FLASH_SIZE=512 @@ -156,8 +159,10 @@ monitor_speed = 115200 [env:STM32F103RE_btt] platform = ${common_stm32f1.platform} extends = env:STM32F103RE +board_build.address = 0x08007000 +board_build.ldscript = STM32F103RE_SKR_E3_DIP.ld extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py + buildroot/share/PlatformIO/scripts/custom_board.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 debug_tool = stlink upload_protocol = stlink @@ -190,7 +195,10 @@ upload_protocol = serial platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE +board_build.address = 0x08010000 +board_build.ldscript = STM32F103VE_longer.ld extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/custom_board.py buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 @@ -330,7 +338,10 @@ extra_scripts = ${common_stm32f1.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103ZE +board_build.address = 0x0800A000 +board_build.ldscript = jgaurora_a5s_a1.ld extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/custom_board.py buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py build_flags = ${common_stm32f1.build_flags} -DSTM32F1xx -DSTM32_XL_DENSITY @@ -341,7 +352,7 @@ build_flags = ${common_stm32f1.build_flags} [env:STM32F103CB_malyan] platform = ${common_stm32f1.platform} extends = common_stm32f1 -board = malyanM200 +board = marlin_malyanM200 build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103CB -D__STM32F1__=1 -std=c++1y -DSERIAL_USB -ffunction-sections -fdata-sections -Wl,--gc-sections -DDEBUG_LEVEL=0 -D__MARLIN_FIRMWARE__ @@ -354,7 +365,7 @@ lib_ignore = ${common_stm32f1.lib_ignore} [env:chitu_f103] platform = ${common_stm32f1.platform} extends = common_stm32f1 -board = CHITU_F103 +board = marlin_CHITU_F103 extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/chitu_crypt.py @@ -379,9 +390,11 @@ build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX platform = ${env:STM32F103RE.platform} extends = env:STM32F103RE build_flags = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4 +board_build.address = 0x08007000 +board_build.ldscript = creality.ld extra_scripts = ${env:STM32F103RE.extra_scripts} pre:buildroot/share/PlatformIO/scripts/random-bin.py - buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py + buildroot/share/PlatformIO/scripts/custom_board.py debug_tool = jlink upload_protocol = jlink diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 1678b26d89..d6418f439e 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -36,13 +36,12 @@ build_flags = ${common_stm32.build_flags} [env:STM32F401VE_STEVAL] platform = ${common_stm32.platform} extends = common_stm32 -board = STEVAL_STM32F401VE +board = marlin_STEVAL_STM32F401VE build_flags = ${common_stm32.build_flags} -DARDUINO_STEVAL -DSTM32F401xE -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py # # STM32F401RC @@ -50,38 +49,41 @@ extra_scripts = ${common.extra_scripts} [env:FYSETC_CHEETAH_V20] platform = ${common_stm32.platform} extends = common_stm32 -board = FYSETC_CHEETAH_V20 +board = marlin_FYSETC_CHEETAH_V20 build_flags = ${common_stm32.build_flags} -DSTM32F401xC -DVECT_TAB_OFFSET=0xC000 extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/FYSETC_CHEETAH_V20.py # # FLYF407ZG # [env:FLYF407ZG] -platform = ${common_stm32.platform} -extends = common_stm32 -board = FLYF407ZG -build_flags = ${common_stm32.build_flags} +platform = ${common_stm32.platform} +extends = common_stm32 +board = marlin_STM32F407ZGT6 +board_build.variant = MARLIN_FLY_F407ZG +upload_protocol = dfu +build_flags = ${common_stm32.build_flags} -DVECT_TAB_OFFSET=0x8000 -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py # -# FLY MINI(stm32f103rct6) +# FLY MINI (STM32F103RCT6) # [env:FLY_MINI] platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC +board_build.address = 0x08005000 +board_build.ldscript = fly_mini.ld extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/fly_mini.py + buildroot/share/PlatformIO/scripts/custom_board.py build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 -DSS_TIMER=4 + -DDEBUG_LEVEL=0 -DSS_TIMER=4 # -# FYSETC S6 (STM32F446VET6 ARM Cortex-M4) +# FYSETC S6 (STM32F446RET6 ARM Cortex-M4) # [env:FYSETC_S6] platform = ${common_stm32.platform} @@ -105,7 +107,7 @@ upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" [env:STM32F407VE_black] platform = ${common_stm32.platform} extends = common_stm32 -board = blackSTM32F407VET6 +board = marlin_blackSTM32F407VET6 build_flags = ${common_stm32.build_flags} -DARDUINO_BLACK_F407VE -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS @@ -121,7 +123,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common_stm32.platform} extends = common_stm32 build_flags = ${common_stm32.build_flags} -DHAL_SD_MODULE_ENABLED -DHAL_SRAM_MODULE_ENABLED -board = genericSTM32F407VGT6 +board = marlin_STM32F407VGT6_CCM board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx board_build.ldscript = ldscript.ld @@ -144,7 +146,7 @@ extra_scripts = ${common.extra_scripts} [env:BIGTREE_SKR_PRO] platform = ${common_stm32.platform} extends = common_stm32 -board = BigTree_SKR_Pro +board = marlin_BigTree_SKR_Pro build_flags = ${common_stm32.build_flags} -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 extra_scripts = ${common.extra_scripts} @@ -180,7 +182,7 @@ build_flags = ${stm_flash_drive.build_flags} platform = ${common_stm32.platform} extends = common_stm32 board = genericSTM32F407VGT6 -board_build.variant = BIGTREE_E3_RRF +board_build.variant = MARLIN_BIGTREE_E3_RRF build_flags = ${common_stm32.build_flags} -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 -DSERIAL_RX_BUFFER_SIZE=255 -DSERIAL_TX_BUFFER_SIZE=255 @@ -193,7 +195,7 @@ extra_scripts = ${common.extra_scripts} [env:BIGTREE_GTR_V1_0] platform = ${common_stm32.platform} extends = common_stm32 -board = BigTree_GTR_v1 +board = marlin_BigTree_GTR_v1 extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py build_flags = ${common_stm32.build_flags} @@ -215,7 +217,7 @@ build_flags = ${stm_flash_drive.build_flags} [env:BIGTREE_BTT002] platform = ${common_stm32.platform} extends = common_stm32 -board = BigTree_Btt002 +board = marlin_BigTree_BTT002 build_flags = ${common_stm32.build_flags} -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 -DHAVE_HWSERIAL2 @@ -251,11 +253,12 @@ build_flags = ${stm_flash_drive.build_flags} [lerdge_common] platform = ${common_stm32.platform} extends = common_stm32 -board = LERDGE +board = marlin_STM32F407ZGT6 +board_build.variant = MARLIN_LERDGE board_build.offset = 0x10000 board_build.encrypt = Yes extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py buildroot/share/PlatformIO/scripts/lerdge.py build_flags = ${common_stm32.build_flags} @@ -377,7 +380,7 @@ build_flags = -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 platform = ${common_stm32.platform} extends = common_stm32 build_flags = ${common_stm32.build_flags} ${stm32f4_I2C1.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC -board = genericSTM32F407VGT6 +board = marlin_STM32F407VGT6_CCM board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx board_build.ldscript = ldscript.ld diff --git a/ini/stm32f7.ini b/ini/stm32f7.ini index afcfc102d5..76d039533c 100644 --- a/ini/stm32f7.ini +++ b/ini/stm32f7.ini @@ -46,7 +46,7 @@ build_flags = ${common_stm32.build_flags} platform = ${common_stm32.platform} platform_packages = ${stm_flash_drive.platform_packages} extends = common_stm32 -board = BTT_SKR_SE_BX +board = marlin_BTT_SKR_SE_BX extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py build_flags = ${common_stm32.build_flags} From 93afb029946cedc06c1a3250c1e6108cf67a253a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 27 Apr 2021 05:16:19 -0700 Subject: [PATCH 1368/1370] BTT SKR V2 probe and chamber pins (#21717) --- Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h | 32 +++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h index fa08aedbb0..11f954c400 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0.h @@ -200,15 +200,35 @@ #define TEMP_0_PIN PA2 // TH0 #define TEMP_1_PIN PA3 // TH1 +#if HOTENDS == 1 + #if TEMP_SENSOR_PROBE + #define TEMP_PROBE_PIN TEMP_1_PIN + #elif TEMP_SENSOR_CHAMBER + #define TEMP_CHAMBER_PIN TEMP_1_PIN + #endif +#endif + // // Heaters / Fans // -#define HEATER_0_PIN PB3 // Heater0 -#define HEATER_1_PIN PB4 // Heater1 -#define HEATER_BED_PIN PD7 // Hotbed -#define FAN_PIN PB7 // Fan0 -#define FAN1_PIN PB6 // Fan1 -#define FAN2_PIN PB5 // Fan2 +#ifndef HEATER_0_PIN + #define HEATER_0_PIN PB3 // Heater0 +#endif +#ifndef HEATER_1_PIN + #define HEATER_1_PIN PB4 // Heater1 +#endif +#ifndef HEATER_BED_PIN + #define HEATER_BED_PIN PD7 // Hotbed +#endif +#ifndef FAN_PIN + #define FAN_PIN PB7 // Fan0 +#endif +#ifndef FAN1_PIN + #define FAN1_PIN PB6 // Fan1 +#endif +#ifndef FAN2_PIN + #define FAN2_PIN PB5 // Fan2 +#endif // // Software SPI pins for TMC2130 stepper drivers From bc28aed5b1bbc431b8e52be71c7464618995ae75 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 27 Apr 2021 17:21:13 -0700 Subject: [PATCH 1369/1370] Clean up TFT comments (#21723) --- .../src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp | 5 +++-- Marlin/src/lcd/tft/tft_color.h | 11 ++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 682178efe5..b0cb59a12c 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -83,7 +83,8 @@ TFT_IO tftio; #define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) #define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) -// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html +// 16 bit color generator: https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html +// RGB565 color picker: https://trolsoft.ru/en/articles/rgb565-color-picker #define COLOR_BLACK 0x0000 // #000000 #define COLOR_WHITE 0xFFFF // #FFFFFF @@ -91,7 +92,7 @@ TFT_IO tftio; #define COLOR_GREY 0x7BEF // #808080 #define COLOR_DARKGREY 0x4208 // #404040 #define COLOR_DARKGREY2 0x39E7 // #303030 -#define COLOR_DARK 0x0003 // Some dark color +#define COLOR_DARK 0x0003 // #000019 #define COLOR_RED 0xF800 // #FF0000 #define COLOR_LIME 0x7E00 // #00FF00 diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h index d060d3209d..a8668179e5 100644 --- a/Marlin/src/lcd/tft/tft_color.h +++ b/Marlin/src/lcd/tft/tft_color.h @@ -30,7 +30,8 @@ #define COLOR(color) RGB(((color >> 16) & 0xFF), ((color >> 8) & 0xFF), (color & 0xFF)) #define HALF(color) RGB(RED(color) >> 1, GREEN(color) >> 1, BLUE(color) >> 1) -// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html +// 16 bit color generator: https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html +// RGB565 color picker: https://trolsoft.ru/en/articles/rgb565-color-picker #define COLOR_BLACK 0x0000 // #000000 #define COLOR_WHITE 0xFFFF // #FFFFFF @@ -38,7 +39,7 @@ #define COLOR_GREY 0x7BEF // #808080 #define COLOR_DARKGREY 0x4208 // #404040 #define COLOR_DARKGREY2 0x39E7 // #303030 -#define COLOR_DARK 0x0003 // Some dark color +#define COLOR_DARK 0x0003 // #000019 #define COLOR_RED 0xF800 // #FF0000 #define COLOR_SCARLET 0xF904 // #FF2020 @@ -51,7 +52,7 @@ #define COLOR_CYAN 0x07FF // #00FFFF #define COLOR_AQUA 0x07FF // #00FFFF #define COLOR_DODGER_BLUE 0x041F // #0080FF -#define COLOR_VIVID_VIOLET 0x7933 // #772399 +#define COLOR_VIVID_VIOLET 0x7933 // #772399 #define COLOR_DARK_PURPLE 0x9930 // #992380 @@ -73,10 +74,10 @@ #define COLOR_BACKGROUND 0x20AC // #1E156E #endif #ifndef COLOR_SELECTION_BG - #define COLOR_SELECTION_BG 0x9930 // #992380 + #define COLOR_SELECTION_BG 0x9930 // #992380 #endif #ifndef COLOR_WEBSITE_URL - #define COLOR_WEBSITE_URL 0x03B7 + #define COLOR_WEBSITE_URL 0x03B7 // #0075BD #endif #ifndef COLOR_INACTIVE From e306abaf8af20e630685d766aad990f324f4cee6 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 28 Apr 2021 11:08:21 +0200 Subject: [PATCH 1370/1370] Color UI Move Screen for 320x240 TFT (#21708) --- Marlin/src/feature/dac/stepper_dac.h | 2 +- Marlin/src/lcd/marlinui.cpp | 2 +- Marlin/src/lcd/marlinui.h | 23 +- Marlin/src/lcd/menu/menu_motion.cpp | 20 +- .../src/lcd/tft/bitmaps/btn_42x39_rounded.bmp | Bin 0 -> 5046 bytes .../lcd/tft/images/btn_rounded_42x39x4.cpp | 69 +++ Marlin/src/lcd/tft/tft_image.cpp | 2 + Marlin/src/lcd/tft/tft_image.h | 3 + Marlin/src/lcd/tft/ui_1024x600.cpp | 49 +-- Marlin/src/lcd/tft/ui_320x240.cpp | 403 +++++++++++++++++- Marlin/src/lcd/tft/ui_480x320.cpp | 49 +-- 11 files changed, 526 insertions(+), 96 deletions(-) create mode 100644 Marlin/src/lcd/tft/bitmaps/btn_42x39_rounded.bmp create mode 100644 Marlin/src/lcd/tft/images/btn_rounded_42x39x4.cpp diff --git a/Marlin/src/feature/dac/stepper_dac.h b/Marlin/src/feature/dac/stepper_dac.h index 6836335e98..26a0f2f95c 100644 --- a/Marlin/src/feature/dac/stepper_dac.h +++ b/Marlin/src/feature/dac/stepper_dac.h @@ -34,7 +34,7 @@ public: static void set_current_value(const uint8_t channel, uint16_t val); static void print_values(); static void commit_eeprom(); - static uint8_t get_current_percent(AxisEnum axis); + static uint8_t get_current_percent(const AxisEnum axis); static void set_current_percents(xyze_uint8_t &pct); }; diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 476caf3225..1b517f7d21 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -757,7 +757,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { // // Tell ui.update() to start a move to current_position after a short delay. // - void ManualMove::soon(AxisEnum move_axis + void ManualMove::soon(const AxisEnum move_axis #if MULTI_MANUAL , const int8_t eindex/*=-1*/ #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 8befa1d980..085e2e0b7e 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -155,13 +155,34 @@ current_position.set(dest); #endif } + float axis_value(const AxisEnum axis) { + return NATIVE_TO_LOGICAL(processing ? destination[axis] : SUM_TERN(IS_KINEMATIC, current_position[axis], offset), axis); + } + bool apply_diff(const AxisEnum axis, const_float_t diff, const_float_t min, const_float_t max) { + #if IS_KINEMATIC + float &valref = offset; + const float rmin = min - current_position[axis], rmax = max - current_position[axis]; + #else + float &valref = current_position[axis]; + const float rmin = min, rmax = max; + #endif + valref += diff; + const float pre = valref; + if (min != max) { + if (diff < 0) + NOLESS(valref, rmin); + else + NOMORE(valref, rmax); + } + return pre != valref; + } #if IS_KINEMATIC static bool processing; #else static bool constexpr processing = false; #endif static void task(); - static void soon(AxisEnum axis + static void soon(const AxisEnum axis #if MULTI_MANUAL , const int8_t eindex=-1 #endif diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index fea4fa25a9..6bf6df1897 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -73,29 +73,13 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { // Get the new position const float diff = float(int32_t(ui.encoderPosition)) * ui.manual_move.menu_scale; - #if IS_KINEMATIC - ui.manual_move.offset += diff; - if (int32_t(ui.encoderPosition) < 0) - NOLESS(ui.manual_move.offset, min - current_position[axis]); - else - NOMORE(ui.manual_move.offset, max - current_position[axis]); - #else - current_position[axis] += diff; - if (int32_t(ui.encoderPosition) < 0) - NOLESS(current_position[axis], min); - else - NOMORE(current_position[axis], max); - #endif - + (void)ui.manual_move.apply_diff(axis, diff, min, max); ui.manual_move.soon(axis); ui.refresh(LCDVIEW_REDRAW_NOW); } ui.encoderPosition = 0; if (ui.should_draw()) { - const float pos = NATIVE_TO_LOGICAL( - ui.manual_move.processing ? destination[axis] : SUM_TERN(IS_KINEMATIC, current_position[axis], ui.manual_move.offset), - axis - ); + const float pos = ui.manual_move.axis_value(axis); if (parser.using_inch_units()) { const float imp_pos = LINEAR_UNIT(pos); MenuEditItemBase::draw_edit_screen(name, ftostr63(imp_pos)); diff --git a/Marlin/src/lcd/tft/bitmaps/btn_42x39_rounded.bmp b/Marlin/src/lcd/tft/bitmaps/btn_42x39_rounded.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a89c7964e9fc9c6b17cc36055cd899c834b3ddf8 GIT binary patch literal 5046 zcmeI0-AZCn6vy{G!@w{vFw8KJMyR1_fs_}e6?I`BXkf`$2pZ;;AF0vTOVnM^10+)F zl~%V#q+SGyANdA#>CBHK%}mVgId*dv?1gM${r6gD?Zy88t&Yq`A(;XHjrE=NmGwb< z#tV_+|1Y0$y6$}ySux+y}h})xv{a~^Z9-#W9#ede!o8y3Pqz)pe6i7 zA`y$lK=yb%PN#ErcGhmUPfbnXPxyLZ8Di8{ARP+fBc7shqw5{!^8c|U&UAJ|EB-d{!{N? zALp++f7JP-&YyqYAL{&7=kNQ^UmoXucz;(amH*~H@BiiH<*ltPMIZkJhiLckVLU=a zA`$q<&CQKoub-cvhy1exGlq`hhSS%1SjguZ7?ZU<(B;(`blarH5h!02^L?+AC)m8ZC$;pYt zzYh)$C^8!_FE0>bm^mte68giyz`)qp81;XCeg>5FFtHqXj_3U-hS+{)OiV@Nc<=hrjU% O&gG)xxP`z;_`d;x*W7Uc literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/images/btn_rounded_42x39x4.cpp b/Marlin/src/lcd/tft/images/btn_rounded_42x39x4.cpp new file mode 100644 index 0000000000..cd07258dbf --- /dev/null +++ b/Marlin/src/lcd/tft/images/btn_rounded_42x39x4.cpp @@ -0,0 +1,69 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t btn_rounded_42x39x4[819] = { + 0x87, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x78, + 0x87, 0x77, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x77, 0x78, + 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x68, + 0x87, 0xff, 0x84, 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x37, 0xff, 0x57, + 0x7b, 0xf6, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x6f, 0x95, + 0x7d, 0xc3, 0x45, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x4d, 0xc4, + 0x7e, 0xc3, 0x56, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x6d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7e, 0xc3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xd3, + 0x7d, 0xd3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x7e, 0xc3, + 0x88, 0xfa, 0x56, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xcf, 0x64, + 0x86, 0xbf, 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xce, 0xfb, 0x34, + 0x87, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x74, 0x45, + 0x87, 0x75, 0x33, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x34, 0x56, + 0x87, 0x77, 0x65, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x67, + 0x87, 0x87, 0x77, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x78 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index f3480705e1..3651899dd7 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -53,6 +53,7 @@ const tImage Fan_Fast1_64x64x4 = { (void *)fan_fast1_64x64x4, 64, 64, GREYS const tImage SD_64x64x4 = { (void *)sd_64x64x4, 64, 64, GREYSCALE4 }; const tImage Home_64x64x4 = { (void *)home_64x64x4, 64, 64, GREYSCALE4 }; const tImage BtnRounded_64x52x4 = { (void *)btn_rounded_64x52x4, 64, 52, GREYSCALE4 }; +const tImage BtnRounded_42x39x4 = { (void *)btn_rounded_42x39x4, 42, 39, GREYSCALE4 }; const tImage Menu_64x64x4 = { (void *)menu_64x64x4, 64, 64, GREYSCALE4 }; const tImage Settings_64x64x4 = { (void *)settings_64x64x4, 64, 64, GREYSCALE4 }; const tImage Confirm_64x64x4 = { (void *)confirm_64x64x4, 64, 64, GREYSCALE4 }; @@ -106,6 +107,7 @@ const tImage Images[imgCount] = { Slider8x16x4, Home_64x64x4, BtnRounded_64x52x4, + BtnRounded_42x39x4, }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h index 960a4e4356..de046fb0c4 100644 --- a/Marlin/src/lcd/tft/tft_image.h +++ b/Marlin/src/lcd/tft/tft_image.h @@ -42,6 +42,7 @@ extern const uint8_t fan_fast0_64x64x4[], fan_fast1_64x64x4[]; extern const uint8_t sd_64x64x4[]; extern const uint8_t home_64x64x4[]; extern const uint8_t btn_rounded_64x52x4[]; +extern const uint8_t btn_rounded_42x39x4[]; extern const uint8_t menu_64x64x4[]; extern const uint8_t settings_64x64x4[]; extern const uint8_t confirm_64x64x4[]; @@ -95,6 +96,7 @@ enum MarlinImage : uint8_t { imgSlider, imgHome, imgBtn52Rounded, + imgBtn39Rounded, imgCount, noImage = imgCount, imgPageUp = imgLeft, @@ -145,6 +147,7 @@ extern const tImage Fan_Fast1_64x64x4; extern const tImage SD_64x64x4; extern const tImage Home_64x64x4; extern const tImage BtnRounded_64x52x4; +extern const tImage BtnRounded_42x39x4; extern const tImage Menu_64x64x4; extern const tImage Settings_64x64x4; extern const tImage Confirm_64x64x4; diff --git a/Marlin/src/lcd/tft/ui_1024x600.cpp b/Marlin/src/lcd/tft/ui_1024x600.cpp index e4cc116818..c9c0aae05a 100644 --- a/Marlin/src/lcd/tft/ui_1024x600.cpp +++ b/Marlin/src/lcd/tft/ui_1024x600.cpp @@ -165,6 +165,13 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { image = targetTemperature > 0 ? imgChamberHeated : imgChamber; } #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + if (currentTemperature <= 26) Color = COLOR_COLD; + if (currentTemperature > 26) Color = COLOR_RED; + image = targetTemperature > 26 ? imgCoolerHot : imgCooler; + } + #endif tft.add_image(8, 28, image, Color); @@ -229,6 +236,9 @@ void MarlinUI::draw_status_screen() { #ifdef ITEM_CHAMBER case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; #endif + #ifdef ITEM_COOLER + case ITEM_COOLER: draw_heater_status(x, y, H_COOLER); break; + #endif #ifdef ITEM_FAN case ITEM_FAN: draw_fan_status(x, y, blink); break; #endif @@ -551,7 +561,6 @@ struct MotionAxisState { float currentStepSize = 10.0; int z_selection = Z_SELECTION_Z; uint8_t e_selection = 0; - bool homming = false; bool blocked = false; char message[32]; }; @@ -616,16 +625,11 @@ static void drawMessage(const char *msg) { tft.add_text(0, 0, COLOR_YELLOW, msg); } -static void drawAxisValue(AxisEnum axis) { - const float value = - #if HAS_BED_PROBE - axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? - probe.offset.z : - #endif - NATIVE_TO_LOGICAL( - ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), - axis - ); +static void drawAxisValue(const AxisEnum axis) { + const float value = ( + TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :) + ui.manual_move.axis_value(axis) + ); xy_int_t pos; uint16_t color; switch (axis) { @@ -641,7 +645,7 @@ static void drawAxisValue(AxisEnum axis) { tft.add_text(0, 0, color, tft_string); } -static void moveAxis(AxisEnum axis, const int8_t direction) { +static void moveAxis(const AxisEnum axis, const int8_t direction) { quick_feedback(); if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { @@ -707,23 +711,11 @@ static void moveAxis(AxisEnum axis, const int8_t direction) { #endif // Get the new position + const bool limited = ui.manual_move.apply_diff(axis, diff, min, max); #if IS_KINEMATIC - ui.manual_move.offset += diff; - if (direction < 0) - NOLESS(ui.manual_move.offset, min - current_position[axis]); - else - NOMORE(ui.manual_move.offset, max - current_position[axis]); + UNUSED(limited); #else - current_position[axis] += diff; - const char *msg = NUL_STR; // clear the error - if (direction < 0 && current_position[axis] < min) { - current_position[axis] = min; - msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); - } - else if (direction > 0 && current_position[axis] > max) { - current_position[axis] = max; - msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); - } + PGM_P const msg = limited ? GET_TEXT(MSG_LCD_SOFT_ENDSTOPS) : NUL_STR; drawMessage(msg); #endif @@ -921,7 +913,4 @@ void MarlinUI::move_axis_screen() { TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); } -#undef BTN_WIDTH -#undef BTN_HEIGHT - #endif // HAS_UI_480x320 diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 8e7365932b..31665fdc33 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -241,6 +241,9 @@ void MarlinUI::draw_status_screen() { #ifdef ITEM_CHAMBER case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; #endif + #ifdef ITEM_COOLER + case ITEM_COOLER: draw_heater_status(x, y, H_COOLER); break; + #endif #ifdef ITEM_FAN case ITEM_FAN: draw_fan_status(x, y, blink); break; #endif @@ -278,6 +281,7 @@ void MarlinUI::draw_status_screen() { offset -= tft_string.width(); } tft.add_text(301 - tft_string.width() - offset, 3, not_homed ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 0, 103, 312, 24)); // feed rate tft.canvas(70, 136, 80, 32); @@ -354,16 +358,16 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const val menu_line(line - 1); tft_string.set(X_LBL); - tft.add_text(52, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft.add_text(TFT_WIDTH / 2 - 120, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.x))); tft_string.trim(); - tft.add_text(144 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + tft.add_text(TFT_WIDTH / 2 - 16 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); tft_string.set(Y_LBL); - tft.add_text(176, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft.add_text(TFT_WIDTH / 2 + 16, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.y))); tft_string.trim(); - tft.add_text(268 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + tft.add_text(TFT_WIDTH / 2 + 120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); } #endif @@ -393,9 +397,9 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const val void TFT::draw_edit_screen_buttons() { #if ENABLED(TOUCH_SCREEN) - add_control(32, 176, DECREASE, imgDecrease); - add_control(224, 176, INCREASE, imgIncrease); - add_control(128, 176, CLICK, imgConfirm); + add_control(32, TFT_HEIGHT - 64, DECREASE, imgDecrease); + add_control(224, TFT_HEIGHT - 64, INCREASE, imgIncrease); + add_control(128, TFT_HEIGHT - 64, CLICK, imgConfirm); #endif } @@ -424,8 +428,8 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); } #if ENABLED(TOUCH_SCREEN) - add_control(48, 176, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); - add_control(208, 176, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + add_control(48, TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + add_control(208, TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); #endif } @@ -435,7 +439,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #if ENABLED(TOUCH_SCREEN) touch.clear(); draw_menu_navigation = false; - touch.add_control(RESUME_CONTINUE , 0, 0, 320, 240); + touch.add_control(RESUME_CONTINUE , 0, 0, TFT_WIDTH, TFT_HEIGHT); #endif menu_line(row); @@ -477,7 +481,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, lpos = pos.asLogical(); - tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2 - 32, 96, 32); + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2 - MENU_ITEM_HEIGHT, 96, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(X_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); @@ -485,7 +489,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.trim(); tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2, 96, 32); + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2, 96, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(Y_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); @@ -493,7 +497,7 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft_string.trim(); tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2 + 32, 96, 32); + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - MENU_ITEM_HEIGHT) / 2 + MENU_ITEM_HEIGHT, 96, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(Z_LBL); tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); @@ -502,13 +506,13 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); constexpr uint8_t w = (TFT_WIDTH) / 10; - tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - w) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 1, w, 32); + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - w) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 1, w, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(ui8tostr3rj(x_plot)); tft_string.trim(); tft.add_text(tft_string.center(w), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + (GRID_HEIGHT - 27) / 2, w, 32); + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + (GRID_HEIGHT - 27) / 2, w, MENU_ITEM_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft_string.set(ui8tostr3rj(y_plot)); tft_string.trim(); @@ -527,7 +531,376 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const } #endif // AUTO_BED_LEVELING_UBL +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "../../feature/babystep.h" +#endif + +#if HAS_BED_PROBE + #include "../../module/probe.h" +#endif + +#define Z_SELECTION_Z 1 +#define Z_SELECTION_Z_PROBE -1 + +struct MotionAxisState { + xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos; + float currentStepSize = 10.0; + int z_selection = Z_SELECTION_Z; + uint8_t e_selection = 0; + bool blocked = false; + char message[32]; +}; + +MotionAxisState motionAxisState; + +#define E_BTN_COLOR COLOR_YELLOW +#define X_BTN_COLOR COLOR_CORAL_RED +#define Y_BTN_COLOR COLOR_VIVID_GREEN +#define Z_BTN_COLOR COLOR_LIGHT_BLUE + +#define BTN_WIDTH 48 +#define BTN_HEIGHT 39 +#define X_MARGIN 15 +#define Y_MARGIN 11 + +static void quick_feedback() { + #if HAS_CHIRP + ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle? + #if BOTH(HAS_LCD_MENU, USE_BEEPER) + for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } + #elif HAS_LCD_MENU + delay(10); + #endif + #endif +} + +#define CUR_STEP_VALUE_WIDTH 38 +static void drawCurStepValue() { + tft_string.set((uint8_t *)ftostr52sp(motionAxisState.currentStepSize)); + tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, 20); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(CUR_STEP_VALUE_WIDTH - tft_string.width(), 0, COLOR_AXIS_HOMED, tft_string); + tft.queue.sync(); + tft_string.set("mm"); + tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y + 20, CUR_STEP_VALUE_WIDTH, 20); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(CUR_STEP_VALUE_WIDTH - tft_string.width(), 0, COLOR_AXIS_HOMED, tft_string); +} + +static void drawCurZSelection() { + tft_string.set("Z"); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 20); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + tft.queue.sync(); + tft_string.set("Offset"); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 20); + tft.set_background(COLOR_BACKGROUND); + if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + } +} + +static void drawCurESelection() { + tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set("E"); + tft.add_text(0, 0, E_BTN_COLOR , tft_string); + tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); +} + +static void drawMessage(const char *msg) { + tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 29, (TFT_WIDTH / 2) - (BTN_WIDTH / 2) - X_MARGIN, 20); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(0, 0, COLOR_YELLOW, msg); +} + +static void drawAxisValue(const AxisEnum axis) { + const float value = ( + TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :) + ui.manual_move.axis_value(axis) + ); + xy_int_t pos; + uint16_t color; + switch (axis) { + case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; + case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; + case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; + case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + default: return; + } + tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, 20); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ftostr52sp(value)); + tft.add_text(0, 0, color, tft_string); +} + +static void moveAxis(const AxisEnum axis, const int8_t direction) { + quick_feedback(); + + if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { + drawMessage("Too cold"); + return; + } + + const float diff = motionAxisState.currentStepSize * direction; + + if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; + const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; + const float bsDiff = planner.steps_to_mm[Z_AXIS] * babystep_increment, + new_probe_offset = probe.offset.z + bsDiff, + new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET + , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff + , new_probe_offset + ); + if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + babystep.add_steps(Z_AXIS, babystep_increment); + if (do_probe) + probe.offset.z = new_offs; + else + TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); + drawMessage(""); // clear the error + drawAxisValue(axis); + } + else { + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + #elif HAS_BED_PROBE + // only change probe.offset.z + probe.offset.z += diff; + if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) { + current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) { + current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else { + drawMessage(""); // clear the error + } + drawAxisValue(axis); + #endif + return; + } + + if (!ui.manual_move.processing) { + // Get motion limit from software endstops, if any + float min, max; + soft_endstop.get_manual_axis_limits(axis, min, max); + + // Delta limits XY based on the current offset from center + // This assumes the center is 0,0 + #if ENABLED(DELTA) + if (axis != Z_AXIS && axis != E_AXIS) { + max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis + min = -max; + } + #endif + + // Get the new position + const bool limited = ui.manual_move.apply_diff(axis, diff, min, max); + #if IS_KINEMATIC + UNUSED(limited); + #else + PGM_P const msg = limited ? GET_TEXT(MSG_LCD_SOFT_ENDSTOPS) : NUL_STR; + drawMessage(msg); + #endif + + ui.manual_move.soon(axis + #if MULTI_MANUAL + , motionAxisState.e_selection + #endif + ); + } + + drawAxisValue(axis); +} + +static void e_plus() { moveAxis(E_AXIS, 1); } +static void e_minus() { moveAxis(E_AXIS, -1); } +static void x_minus() { moveAxis(X_AXIS, -1); } +static void x_plus() { moveAxis(X_AXIS, 1); } +static void y_plus() { moveAxis(Y_AXIS, 1); } +static void y_minus() { moveAxis(Y_AXIS, -1); } +static void z_plus() { moveAxis(Z_AXIS, 1); } +static void z_minus() { moveAxis(Z_AXIS, -1); } + +#if ENABLED(TOUCH_SCREEN) + static void e_select() { + motionAxisState.e_selection++; + if (motionAxisState.e_selection >= EXTRUDERS) { + motionAxisState.e_selection = 0; + } + + quick_feedback(); + drawCurESelection(); + drawAxisValue(E_AXIS); + } + + static void do_home() { + quick_feedback(); + drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING)); + queue.inject_P(G28_STR); + // Disable touch until home is done + TERN_(HAS_TFT_XPT2046, touch.disable()); + drawAxisValue(E_AXIS); + drawAxisValue(X_AXIS); + drawAxisValue(Y_AXIS); + drawAxisValue(Z_AXIS); + } + + static void step_size() { + motionAxisState.currentStepSize = motionAxisState.currentStepSize / 10.0; + if (motionAxisState.currentStepSize < 0.0015) motionAxisState.currentStepSize = 10.0; + quick_feedback(); + drawCurStepValue(); + } +#endif + +#if HAS_BED_PROBE + static void z_select() { + motionAxisState.z_selection *= -1; + quick_feedback(); + drawCurZSelection(); + drawAxisValue(Z_AXIS); + } +#endif + +static void disable_steppers() { + quick_feedback(); + queue.inject_P(PSTR("M84")); +} + +static void drawBtn(int x, int y, const char *label, intptr_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { + uint16_t width = Images[imgBtn39Rounded].width; + uint16_t height = Images[imgBtn39Rounded].height; + + if (!enabled) bgColor = COLOR_CONTROL_DISABLED; + + tft.canvas(x, y, width, height); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgBtn39Rounded, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + + // TODO: Make an add_text() taking a font arg + if (label) { + tft_string.set(label); + tft_string.trim(); + tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); + } + else { + tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + } + + TERN_(HAS_TFT_XPT2046, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); +} void MarlinUI::move_axis_screen() { + // Reset + defer_status_screen(true); + motionAxisState.blocked = false; + TERN_(HAS_TFT_XPT2046, touch.enable()); + + ui.clear_lcd(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + const bool busy = printingIsActive(); + + // Babysteps during printing? Select babystep for Z probe offset + if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) + motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + + // ROW 1 -> E- Y- CurY Z+ + int x = X_MARGIN, y = Y_MARGIN, spacing = 0; + + drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy); + + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + x += BTN_WIDTH + spacing; + uint16_t yplus_x = x; + drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy); + + // Cur Y + x += BTN_WIDTH; + motionAxisState.yValuePos.x = x + 2; + motionAxisState.yValuePos.y = y; + drawAxisValue(Y_AXIS); + + x += spacing; + drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + // ROW 2 -> "Ex" X- HOME X+ "Z" + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; + + motionAxisState.eNamePos.x = x; + motionAxisState.eNamePos.y = y; + drawCurESelection(); + TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; //imgHome is 64x64 + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); + + x += BTN_WIDTH + spacing; + uint16_t xplus_x = x; + drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; + motionAxisState.zTypePos.x = x; + motionAxisState.zTypePos.y = y; + drawCurZSelection(); + #if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) + if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); + #endif + + // ROW 3 -> E- CurX Y- Z- + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + + drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); + + // Cur E + motionAxisState.eValuePos.x = x; + motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; + drawAxisValue(E_AXIS); + + // Cur X + motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos + motionAxisState.xValuePos.y = y - 10; + drawAxisValue(X_AXIS); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + // Cur Z + motionAxisState.zValuePos.x = x; + motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; + drawAxisValue(Z_AXIS); + + // ROW 4 -> step_size disable steppers back + y = TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT; // + x = xplus_x - CUR_STEP_VALUE_WIDTH - 10; + motionAxisState.stepValuePos.x = yplus_x + BTN_WIDTH - CUR_STEP_VALUE_WIDTH; + motionAxisState.stepValuePos.y = TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT; + if (!busy) { + drawCurStepValue(); + TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); + } + + // aligned with x+ + drawBtn(xplus_x, y, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); + + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); } #endif // HAS_UI_320x240 diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index e9ea4b0827..a5539990d5 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -170,6 +170,13 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { image = targetTemperature > 0 ? imgChamberHeated : imgChamber; } #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + if (currentTemperature <= 26) Color = COLOR_COLD; + if (currentTemperature > 26) Color = COLOR_RED; + image = targetTemperature > 26 ? imgCoolerHot : imgCooler; + } + #endif tft.add_image(8, 28, image, Color); @@ -234,6 +241,9 @@ void MarlinUI::draw_status_screen() { #ifdef ITEM_CHAMBER case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; #endif + #ifdef ITEM_COOLER + case ITEM_COOLER: draw_heater_status(x, y, H_COOLER); break; + #endif #ifdef ITEM_FAN case ITEM_FAN: draw_fan_status(x, y, blink); break; #endif @@ -543,7 +553,6 @@ struct MotionAxisState { float currentStepSize = 10.0; int z_selection = Z_SELECTION_Z; uint8_t e_selection = 0; - bool homming = false; bool blocked = false; char message[32]; }; @@ -608,16 +617,11 @@ static void drawMessage(const char *msg) { tft.add_text(0, 0, COLOR_YELLOW, msg); } -static void drawAxisValue(AxisEnum axis) { - const float value = - #if HAS_BED_PROBE - axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? - probe.offset.z : - #endif - NATIVE_TO_LOGICAL( - ui.manual_move.processing ? destination[axis] : SUM_TERN(IS_KINEMATIC, current_position[axis], ui.manual_move.offset), - axis - ); +static void drawAxisValue(const AxisEnum axis) { + const float value = ( + TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :) + ui.manual_move.axis_value(axis) + ); xy_int_t pos; uint16_t color; switch (axis) { @@ -633,7 +637,7 @@ static void drawAxisValue(AxisEnum axis) { tft.add_text(0, 0, color, tft_string); } -static void moveAxis(AxisEnum axis, const int8_t direction) { +static void moveAxis(const AxisEnum axis, const int8_t direction) { quick_feedback(); if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { @@ -699,23 +703,11 @@ static void moveAxis(AxisEnum axis, const int8_t direction) { #endif // Get the new position + const bool limited = ui.manual_move.apply_diff(axis, diff, min, max); #if IS_KINEMATIC - ui.manual_move.offset += diff; - if (direction < 0) - NOLESS(ui.manual_move.offset, min - current_position[axis]); - else - NOMORE(ui.manual_move.offset, max - current_position[axis]); + UNUSED(limited); #else - current_position[axis] += diff; - const char *msg = NUL_STR; // clear the error - if (direction < 0 && current_position[axis] < min) { - current_position[axis] = min; - msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); - } - else if (direction > 0 && current_position[axis] > max) { - current_position[axis] = max; - msg = GET_TEXT(MSG_LCD_SOFT_ENDSTOPS); - } + PGM_P const msg = limited ? GET_TEXT(MSG_LCD_SOFT_ENDSTOPS) : NUL_STR; drawMessage(msg); #endif @@ -913,7 +905,4 @@ void MarlinUI::move_axis_screen() { TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); } -#undef BTN_WIDTH -#undef BTN_HEIGHT - #endif // HAS_UI_480x320

      1$Lj^$&#{V{0_Y=Y;_0=hd7@9cFb2+XAhUtm_MqWig;{! z3All+y2;)`)z(mk91FAxaZ0D@3t3HSLaYX)Zm`#@SEnAbboKVXx?}e^XgS-syvA%F z#hNOF)qjX-(n0Oa7Du)!z@P*+?wdY~exs6r%bqRU&Ow5>h ztN~_N*Oo|pn7%yr(=X+A;1V6Z&qs`2i-CrN8Om%JQbNDNo${wBMhNMzVq?-LuyXL; z5LG!%G&mxAWWl~@Hgmuz| zWsa|AMG`z9vA&f|=?>Q!t=|v_~@BW8A%XMAmfUuS21jcYB zw{dTW$yKO!xgf_S)2H2m&*LH(xj6$iCxb=1P2!tq{H@0<=}zW0hYJja5@>jZ%0>P3 zxUMnZKB5-aOW@4kc(*2{QcN~`=c9K)Lh+(tt4r7=;v%73<5k`;z+QwL*PtK7qD=JP zD+_eSI6{jIvWIT5o@J}zG)^$gxVwZkkRj!l+t5yIXjox}>bkv`a_Uc|`vIQ#Fh zxm&mm8XtRKVkGa*kT~-m?_-6*j(Z?MfhP=eUolUZyG@$@-<=`X&fKGMz+;mi^RYu5 zee9JOICF7u^5LFy%VY90Coj4!wz?Mj_K-M3jqw>8@tJLg9;fkZr+@^foC*Or_{I3! zOWpjk$EDQkOKihmSQ;$+qno`kkk^FJ-5gAA zRkT&I4i8uQ%)P+F&P&t6E9PIM;V+F%6Yq1b?d*;2#ACL2a23(D?v+adhA$M8A~lF% z*(A|+Pb-9nH%WrjfSFy<_U1pt$H-q~SHSPQe}0S2w(oEq?clXPu{g+(x@o?-%!tNe zgs4jEjSkEiCh&VEb1ZlY6MRWQ%*-d_2d|GE=Ix8jNO$}JcWdnZ0|q&V>Cksj zGUWLOY;wW&V2dQW4`VY zw!`&ct&%#cIB#SU1p*nNm@>ClQ28Oo>mj22bRS#uEcFESZerwpypY!`<6A zx}$dnXTHgrL#@%|OpkT+Ew`jgTl^Sclx)%1fe#WFVn5Je94Pl*;e5;48Ve7>M#Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(LM`uYyK~#8N?Y#-K zW!G7l`QQ28H`Sz?OHygJtjUrsJGO-f2Dcqz8$wnV0XJzN9h!uOhGy!lMcO0=L$X2^ zAp}A&1`}fk(jft(2Eq_*84t2$%abHqLrFEy(;M&D-}mo(Up+}xuN2Gla=g4>?Ke56e`VZx#Z26? zV^c67hTN+TJ+1Ix#Aq}MrbLbLgAwpXdHKt@iTrbG^5&UM`fV4x_gtF%`m1bD=YMs4 zENz6mzf>*hAEG;zK5N!liiL+Yt``KIr<-ALRd$I<3ABMGTy)LvXItxC6Yaw|*aBsxd;TYbbF)YB@n* zH*eb%-+AlaxOL|&hEid1hy>Q4(&LCh)VS6M`6}~;{WPS$yju~{rJD@3U5XxgVY~GG z_4)9;`80MymuzF@Sxe{TXu4!uXRRtaGpwN2L)EPoeRQEVTtS}-e=fy_R8+JLMu88` zmnEvgsA;(9(`Zlz(p36q!kN(UOgUa~P8h|gpW_n0gn$1Qu~Z@l1Y$Rkoz8U-j*AvcLm0Kl3Y(^Eo-#-WkazI4v#ucSfg z`0Tm03rsFe#!lMBmFwx=_)FiO4}<@Eaa(__0pM!<1j;-jGeDJ#K8)M54MOLM9^p_5 z@2b&2k$RPZL1wHw&&KhYGO%4x?s9MP*|8eK0KC-K81?e{5F;?JS&e2I0TIo485u-s z$OogtY@-@)|N6V)x=k&BU<6EXVwFk5TX#guJX6)mNgjXWRE< z7g!~Iwi)rRH@!Tj8x00Sk_2_yQG3m`F}&y6h$(9dS;iGK8(fsmj z7gP5Co;ERz=L_dj?Q({<{@wN4TCZ(;K5LP2ud3(}<*HspiJ!TiEtQn9!}okV2KVn< zRqmp|u6RN5ZC+p7G?ul-a3KXO>6Omgy9q0!2JlwvjtP#FHJFV-RIc9k1EV3~WUk$b zpZ>Z#V(;cw-mWulv}bcvzUyT%+%$##n1cnOY?OtMORD%HG4TjCY&@6xAK!~!ysh$o z9Q!Xt=U}Vyzy3=axNj!^RmDocwLr zisAJ;Bfj@lQQ0`1*Bov*lrb_>l!c)oD0pqmqlWU8(4^&JKk{>}946Pl)J;CG_cK}d z(m&6=t%ZBBpS4gg_M^icU`WFmrbc9aib>%+Bi?OX@Nwu9F4y?b|mI6<#z3fW_?G7*z~m)M=)& zH&`h1EnEOKc3w-RFf8(8>+{(>P%`xnH5bo2rHu$H72t@V+iK2tYt}InxL#XrBItPF zr@^t7FfG<{p2wU_&y?=MYT~4T+*V6m_?#sj3sku=gsBDVuiU0mREIE11yTvPR=oEx z<`2!s(vh=Kd*pN+Iek9IKeO%FG#i7PHpSMvc8{;viZZ5L060_zDj%}3DXkpCeU(dr zDi&8yW#im!cXuDNdC~jj5J7Ypz4v~`x431k%2kaZQ;)Jnp7CGt^3S7bAZW+XO`}mW z*Q@N^`h%mlf5UBY+qSt}VAyKL;QxGWj5c?2js)0}INIcMMMP`vDsdbRGI|swIr6y( zp^TIG9>mBv6<7p}AvMMgY6Yeave|L+^VKA#^Ecu75>3zP82(whCvjIkp1vGJ{Vv4l@G^;TT?|tVt#kRk;cMQ>HY9Yrb{KYxB4&w)SD0ys}TnbX|6%}8VVd@v-i{mQJ zEw3pr2O;FjCl5sBJs)OFabez9_O78mIM3b6>R=4?i)^DRZjuO7HKbK>^;XVzU;D$O zcf9FkMUfo!4Y$P7>#pYnwef<;NFWSNkHF{2F&UggiZ@W*lR@W~W8n)&@B+0M9y%Kf zc%e<#?1}nZ6I)z~&YmsN+BwaxWv8$cZ(cnkqU^tp+92{v(@(DIesGwR1s z*Xp~cqPb@SGDRN9&8Dj=N?i17B2(R&FpC2P2bCQ|v{a~le1Fv6`vB=X<52pHK;Tqk z-o%AHU->0WvkiXwM$j4t@e{B57o%^vbx#sm!6Fvk_Sa)H)ue9Flft0!zxfR+Ye6JnqLYGnsFX21UWnETqR zV(K;5Mw5DHAfe3A)44{5UTP#g%~yJpUL8U|J->q2gGW5^j*rB?U;R)_tyE&JYfi0L z804bNQ7sK#vtsu*Y1rS zZ~LF3HPcetiVh*~bU~>rxKMYTz)d63F)6p)_*5h~MfI!p(I;b?l&Rzav~ym|M|;8H+KguW9)xp08=RV9w)O(yeFUXX~?b zA|87Cy-_cOv;A{ny*5Pk26eb3 zh)?|8--*%rrPwlGi#lmW1#56evP!BUr>Eb1YixbnYjQpJ_k9|z;@LEuOs(>6qBCBT zHN5U;el*P5{KfSVbm~4b!U>5)c)^R{LgO{qY55;@#}7g z{;rM5$3)Z)qby!E7B3i5hMW(<`Yh?nXa0}hjkEvlso1eli&?yk-lv8I$bOfo>4Ev6 zXVS(sXcyKr%+n0LgC|bM((gVLqboX5y>WYd{%8Iq_WkmGvEf`LHZ4}8iPx{Qo(wR8 ziLVUHu!#^_tW+cNh*NF>^Hb?A#nPYdi=~H7M*W^$QEm7D5zmMrNS8*afWA_@ZHP?e zwnb~oajbzS9y}E19ymz!uf~j9Kq$VoggHEuu^lAGxal|E6xH1`%xA7Y062E1pR^D~hV%Wz~H4^v;!|6SIBBs9mcIr>y5NZ0(w=;IgXHCmz68QRZ9o-OR?be5P z;_LIP(QGTaH|>b_$DWGnB8H06_E}5gO?sY3mrfC?n~k8ab#SPC@2zist2}e(Vg75b zkN%bp3R4Iea@3n^$uguTAiWHXnE%4@c=(5ZFXGTj>{^tWgM6ee!&F?ok-WEgUBh5@ zF$9#@@NKB`s==~~ms-NT=Me0RrCoK$1ete~NYcZ8eS*G(s!B*5by!$+caPHHG zVrB&|ZqdqR<)S=fVFd?cP-(pR=7=3rTtEp2dhSY``pCXG|EYr*LOq&26%;u*S$V*7 zQy8~P>#y7um92BpBNS+FL+`PEAE(u04(Js9;#?ff&NN-nPP|iTfzzL9#?lM7N9X>h zVzAPSCVG<_G^QL*_#(SIYrd>8BIC%q3i_xpLA;O3a}?Pgmf_A%PYb5^oW%V;-Z_I6 zl%09(P(1WQzZcaLi?JI+X!gnMR6+fXD;Wg2m5G)=<5xiGX>nOf6VW zJ$XL%oNdGg!gsCLXFP@QfR$mId1